ZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9MSUNFTlNFLnR4dCBiL3YxLjUuMVJDMy9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmIwYjEyNy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyMDMgKzAsMCBAQAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgotCi0gICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQotICAgQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLgotCi0gICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwotICAgICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIgotICAgICAgcmVwbGFjZWQgd2l0aCB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gKERvbid0IGluY2x1ZGUKLSAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCi0gICAgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGEKLSAgICAgIGZpbGUgb3IgY2xhc3MgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgcHVycG9zZSBiZSBpbmNsdWRlZCBvbiB0aGUKLSAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgotICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLgotCi0gICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KLQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL05PVElDRS50eHQgYi92MS41LjFSQzMvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQzOTY5My4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLT09ICBOT1RJQ0UgZmlsZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBzZWN0aW9uIDQgZCBvZiAgICAgICAgICAgICAgICAgICAgPT0KLT09ICB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0KLT09ICBpbiB0aGlzIGNhc2UgZm9yIHRoZSBBcGFjaGUgQXhpczIgZGlzdHJpYnV0aW9uLiAgICAgICAgICAgICAgICAgICAgPT0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4KLVBvcnRpb25zIENvcHlyaWdodCAyMDA2IEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4KLVBvcnRpb25zIENvcHlyaWdodCAyMDA1LTIwMDcgV1NPMiwgSW5jLgotCi1UaGlzIHByb2R1Y3QgYWxzbyBpbmNsdWRlcyBzY2hlbWFzIGFuZCBzcGVjaWZpY2F0aW9uIGRldmVsb3BlZCBieToNCi0tIHRoZSBXM0MgY29uc29ydGl1bSAoaHR0cDovL3d3dy53M2Mub3JnKQ0KLQ0KLVRoaXMgcHJvZHVjdCBhbHNvIGluY2x1ZGVzIFdTLSogc2NoZW1hcyBkZXZlbG9wZWQgYnkgSW50ZXJuYXRpb25hbA0KLUJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uLCBNaWNyb3NvZnQgQ29ycG9yYXRpb24sIEJFQSBTeXN0ZW1zLCANCi1USUJDTyBTb2Z0d2FyZSwgU0FQIEFHLCBTb25pYyBTb2Z0d2FyZSwgYW5kIFZlcmlTaWduDQotCi1UaGlzIHByb2R1Y3QgYWxzbyBpbmNsdWRlcyBhIFdTREwgZGV2ZWxvcGVkIGJ5IHNhbGVzZm9yY2UuY29tCi0tIENvcHlyaWdodCAxOTk5LTIwMDYgc2FsZXNmb3JjZS5jb20sIGluYy4NCi0NCi1Qb3J0aW9ucyBvZiB0aGUgaW5jbHVkZWQgeG1sYmVhbnMgbGlicmFyeSB3ZXJlIG9yaWdpbmFsbHkgYmFzZWQgb24gdGhlIGZvbGxvd2luZzoNCi0tIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzLCBCRUEgU3lzdGVtcywgPGh0dHA6Ly93d3cuYmVhLmNvbS8+Lg0KLQotUGxlYXNlIHJlYWQgdGhlIGRpZmZlcmVudCBMSUNFTlNFIGZpbGVzIHByZXNlbnQgaW4gdGhlIGxpYiBkaXJlY3Rvcnkgb2YKLXRoaXMgZGlzdHJpYnV0aW9uLgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL1JFQURNRS50eHQgYi92MS41LjFSQzMvUkVBRE1FLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWRkMjFjOS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvUkVBRE1FLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotQXBhY2hlIEF4aXMyIEBheGlzVmVyc2lvbkAgYnVpbGQgIChAVE9EQVlAKQotCi1odHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVdlbGNvbWUgdG8gQXhpczIhCi0KLUZvciBpbmZvcm1hdGlvbiBzcGVjaWZpYyB0byB0aGlzIHJlbGVhc2UsIHBsZWFzZSBjaGVjayBvdXQgdGhlCi1yZWxlYXNlLW5vdGVzLmh0bWwgZmlsZSBpbiB0aGlzIGRpcmVjdG9yeS4KLQotRnVsbCBkb2N1bWVudGF0aW9uIGNhbiBiZSBmb3VuZCBpbiB0aGUgZG9jcyBkaXN0cmlidXRpb24gb2YgdGhpcyByZWxlYXNlCi0oc2VwYXJhdGUgZG93bmxvYWQpLCBvciBvbiB0aGUgbWFpbiB3ZWJzaXRlIGF0IGh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyLgotCi1fX19fX19fX19fX19fX19fX19fXwotQnVpbGRpbmcgZnJvbSBTb3VyY2UKLT09PT09PT09PT09PT09PT09PT09Ci0KLVdlIHVzZSBNYXZlbiAyIChodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZykgdG8gYnVpbGQsIGFuZCB5b3UnbGwgZmluZCBhCi1wb20ueG1sIGluIGVhY2ggbW9kdWxlLCBhcyB3ZWxsIGFzIGF0IHRoZSB0b3AgbGV2ZWwuICBVc2UgIm12biBpbnN0YWxsIgotKG9yICJtdm4gY2xlYW4gaW5zdGFsbCIgdG8gY2xlYW4gdXAgZmlyc3QpIHRvIGJ1aWxkLgotCi1JTVBPUlRBTlQ6IHRoZSAqZmlyc3QqIHRpbWUgeW91IGJ1aWxkIGEgZ2l2ZW4gdmVyc2lvbiBvZiBBeGlzMiwgeW91IHdpbGwgbm90Ci1iZSBhYmxlIHRvIGRvIGEgcmVndWxhciAibXZuIGluc3RhbGwiIGZyb20gdGhlIHRvcCBsZXZlbCAtIHRoaXMgaXMgYmVjYXVzZQotd2UgaGF2ZSBhIGNvdXBsZSBvZiBjdXN0b20gTWF2ZW4gcGx1Z2lucyB0aGF0IChkdWUgdG8gc29tZSBkZXBlbmRlbmN5LQotcmVzb2x1dGlvbiBpc3N1ZXMgaW4gTWF2ZW4pIG11c3QgYmUgYnVpbHQgYW5kIGluc3RhbGxlZCBpbiB5b3VyIGxvY2FsCi1yZXBvc2l0b3J5IGJlZm9yZSBhIGJ1aWxkIHdpbGwgc3VjY2VlZC4gIFRoaXMgbWVhbnMgeW91IG5lZWQgdG8gZG8gb25lCi1vZiB0aGUgZm9sbG93aW5nOgotCi0gIDEpIFVzZSBhbnQgKGh0dHA6Ly9hbnQuYXBhY2hlLm9yZykgdG8gYnVpbGQgdGhlIGZpcnN0IHRpbWUuICBUaGVyZSBpcwotICAgICBhIGJ1aWxkLnhtbCBhdCB0aGUgdG9wIGxldmVsIHdoaWNoIGF1dG9tYXRpY2FsbHkgYnVpbGRzIHRoZSBwbHVnaW5zCi0gICAgIGZpcnN0IGFuZCB0aGVuIHJ1bnMgYSByZWd1bGFyICJtdm4gaW5zdGFsbCIuCi0gICAgIAotICAyKSBNYW51YWxseSAibXZuIGluc3RhbGwiIGJvdGggb2YgdGhlIHBsdWdpbnMgaW4gdGhlIGZvbGxvd2luZyBwbGFjZXM6Ci0gICAgIAotICAgICBtb2R1bGVzL3Rvb2wvYXhpczItbWFyLW1hdmVuLXBsdWdpbgotICAgICBtb2R1bGVzL3Rvb2wvYXhpczItYWFyLW1hdmVuLXBsdWdpbgotCi1fX19fX19fX19fX19fX19fX19fCi1EZXBsb3lpbmcKLT09PT09PT09PT09PT09PT09PT0KLQotVG8gZGVwbG95IGEgbmV3IFdlYiBzZXJ2aWNlIGluIEF4aXMyIHRoZSBmb2xsb3dpbmcgdGhyZWUgc3RlcHMgbXVzdCAKLWJlIHBlcmZvcm1lZDoKLSAgMSkgQ3JlYXRlIHRoZSBXZWIgc2VydmljZSBpbXBsZW1lbnRhdGlvbiBjbGFzcywgc3VwcG9ydGluZyBjbGFzc2VzIAotICAgICBhbmQgdGhlIHNlcnZpY2VzLnhtbCBmaWxlLCAKLSAgMikgQXJjaGl2ZSB0aGUgY2xhc3MgZmlsZXMgaW50byBhIGphciB3aXRoIHRoZSBzZXJ2aWNlcy54bWwgZmlsZSBpbiAKLSAgICAgdGhlIE1FVEEtSU5GIGRpcmVjdG9yeQotICAzKSBEcm9wIHRoZSBqYXIgZmlsZSB0byB0aGUgJEFYSVMyX0hPTUUvV0VCLUlORi9zZXJ2aWNlcyBkaXJlY3RvcnkKLSAgICAgd2hlcmUgJEFYSVMyX0hPTUUgcmVwcmVzZW50cyB0aGUgaW5zdGFsbCBkaXJlY3Rvcnkgb2YgeW91ciBBeGlzMiAKLSAgICAgcnVudGltZS4gKEluIHRoZSBjYXNlIG9mIGEgc2VydmVsZXQgY29udGFpbmVyIHRoaXMgd291bGQgYmUgdGhlCi0gICAgICJheGlzMiIgZGlyZWN0b3J5IGluc2lkZSAid2ViYXBwcyIuKQotCi1UbyB2ZXJpZnkgdGhlIGRlcGxveW1lbnQgcGxlYXNlIGdvIHRvIGh0dHA6Ly88eW91cmlwPjo8cG9ydD4vYXhpczIvIGFuZAotZm9sbG93IHRoZSAiU2VydmljZXMiIExpbmsuCi0KLUZvciBtb3JlIGluZm9ybWF0aW9uIHBsZWFzZSByZWZlciB0byB0aGUgVXNlcidzIEd1aWRlLgotCi1fX19fX19fX19fX19fX19fX19fCi1TdXBwb3J0Ci09PT09PT09PT09PT09PT09PT09Ci0gCi1BbnkgcHJvYmxlbSB3aXRoIHRoaXMgcmVsZWFzZSBjYW4gYmUgcmVwb3J0ZWQgdG8gQXhpcyBtYWlsaW5nIGxpc3QKLW9yIGluIHRoZSBKSVJBIGlzc3VlIHRyYWNrZXIuIElmIHlvdSBhcmUgc2VuZGluZyBhbiBlbWFpbCB0byB0aGUgbWFpbGluZwotbGlzdCBtYWtlIHN1cmUgdG8gYWRkIHRoZSBbQXhpczJdIHByZWZpeCB0byB0aGUgc3ViamVjdC4KLQotTWFpbGluZyBsaXN0IHN1YnNjcmlwdGlvbjoKLSAgICBheGlzLWRldi1zdWJzY3JpYmVAd3MuYXBhY2hlLm9yZwotCi1KaXJhOgotICAgIGh0dHA6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL3NlY3VyZS9Ccm93c2VQcm9qZWN0LmpzcGE/aWQ9MTA2MTEKLQotCi1UaGFuayB5b3UgZm9yIHVzaW5nIEF4aXMyIQotCi1UaGUgQXhpczIgVGVhbS4gCmRpZmYgLS1naXQgYS92MS41LjFSQzMvYnVpbGQueG1sIGIvdjEuNS4xUkMzL2J1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFiODFlMy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvYnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pg0KLQ0KLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLTxwcm9qZWN0IG5hbWU9ImF4aXMyX2J1aWxkIiBkZWZhdWx0PSJpbnN0YWxsIj4NCi0NCi0gICAgPCEtLSBzZXQgdGhlIHByb3BlcnR5IHRvIGluZGljYXRlIHRoYXQgSkFWQV9IT01FIGlzIHNldCAtLT4NCi0gICAgPHRhcmdldCBuYW1lPSJjb25kX2NoZWNrIj4NCi0gICAgICAgIDxwcm9wZXJ0eSBlbnZpcm9ubWVudD0iZW52Ii8+DQotICAgICAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJKQVZBX0hPTUVfU0VUIj4NCi0gICAgICAgICAgICA8aXNzZXQgcHJvcGVydHk9ImVudi5KQVZBX0hPTUUiLz4NCi0gICAgICAgIDwvY29uZGl0aW9uPg0KLSAgICA8L3RhcmdldD4NCi0NCi0gICAgPCEtLSBmYWlsIGlmIEpBVkFfSE9NRSBpc24ndCBzZXQsIG90aGVyd2lzZSB3ZSBkb24ndCBleGVjdXRlIHRoZSBib2R5IC0tPg0KLSAgICA8dGFyZ2V0IG5hbWU9ImNoZWNrX2Vudmlyb25tZW50IiB1bmxlc3M9IkpBVkFfSE9NRV9TRVQiIGRlcGVuZHM9ImNvbmRfY2hlY2siPg0KLSAgICAgICAgPGZhaWwgbWVzc2FnZT0iVGhlIGVudmlyb25tZW50IHZhcmlhYmxlIEpBVkFfSE9NRSBpcyBub3Qgc2V0LiBTZXQgdGhpcyB2YXJpYWJsZSB0byB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBKREsgaXMgaW5zdGFsbGVkLiIvPg0KLSAgICA8L3RhcmdldD4NCi0NCi0gICAgPCEtLSBzZXQgdGhlIHByb3BlcnR5IHRvIGluZGljYXRlIHRoYXQgTUFWRU5fSE9NRSBpcyBzZXQgLS0+DQotICAgIDx0YXJnZXQgbmFtZT0iY29uZF9jaGVjazIiPg0KLSAgICAgICAgPHByb3BlcnR5IGVudmlyb25tZW50PSJlbnYiLz4NCi0gICAgICAgIDxjb25kaXRpb24gcHJvcGVydHk9Ik1BVkVOX0hPTUVfU0VUIj4NCi0gICAgICAgICAgICA8aXNzZXQgcHJvcGVydHk9ImVudi5NQVZFTl9IT01FIi8+DQotICAgICAgICA8L2NvbmRpdGlvbj4NCi0gICAgPC90YXJnZXQ+DQotDQotICAgIDwhLS0gZmFpbCBpZiBNQVZFTl9IT01FIGlzbid0IHNldCwgb3RoZXJ3aXNlIHdlIGRvbid0IGV4ZWN1dGUgdGhlIGJvZHkgLS0+DQotICAgIDx0YXJnZXQgbmFtZT0iY2hlY2tfZW52aXJvbm1lbnQyIiB1bmxlc3M9Ik1BVkVOX0hPTUVfU0VUIiBkZXBlbmRzPSJjb25kX2NoZWNrMiI+DQotICAgICAgICA8ZmFpbCBtZXNzYWdlPSJUaGUgZW52aXJvbm1lbnQgdmFyaWFibGUgTUFWRU5fSE9NRSBpcyBub3Qgc2V0LiBTZXQgdGhpcyB2YXJpYWJsZSB0byB0aGUgZGlyZWN0b3J5IHdoZXJlIE1hdmVuIGlzIGluc3RhbGxlZC4iLz4NCi0gICAgPC90YXJnZXQ+DQotDQotICAgIDwhLS0gaW5pdGlhbGl6ZSBwcm9wZXJ0aWVzIC0tPg0KLSAgICA8dGFyZ2V0IG5hbWU9ImluaXQiIGRlcGVuZHM9ImNoZWNrX2Vudmlyb25tZW50LCBjaGVja19lbnZpcm9ubWVudDIiPg0KLSAgICAgICAgPCEtLW1hY3JvIGZvciBtYXZlbiAtLT4NCi0gICAgICAgIDxjb25kaXRpb24gcHJvcGVydHk9Im1hdmVuLmV4ZWN1dGFibGUiIHZhbHVlPSJjbWQuZXhlIj4NCi0gICAgICAgICAgICA8b3MgZmFtaWx5PSJ3aW5kb3dzIi8+DQotICAgICAgICA8L2NvbmRpdGlvbj4NCi0NCi0gICAgICAgIDxjb25kaXRpb24gcHJvcGVydHk9Im1hdmVuLmxpbmUxIiB2YWx1ZT0iL2MgJHtlbnYuTUFWRU5fSE9NRX0vYmluL212bi5iYXQiPg0KLSAgICAgICAgICAgIDxvcyBmYW1pbHk9IndpbmRvd3MiLz4NCi0gICAgICAgIDwvY29uZGl0aW9uPg0KLQ0KLSAgICAgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0ibWF2ZW4ubGluZTIiDQotICAgICAgICAgICAgICAgICAgIHZhbHVlPSItLW9mZmxpbmUiPg0KLSAgICAgICAgICAgIDxpc3RydWUgdmFsdWU9IiR7b2ZmbGluZX0iLz4NCi0gICAgICAgIDwvY29uZGl0aW9uPg0KLQ0KLSAgICAgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0ibWF2ZW4ubGluZTMiDQotICAgICAgICAgICAgICAgICAgIHZhbHVlPSItRHRlc3Q9ZmFsc2UiPg0KLSAgICAgICAgICAgIDxpc3RydWUgdmFsdWU9IiR7c2tpcH0iLz4NCi0gICAgICAgIDwvY29uZGl0aW9uPg0KLQ0KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9Im1hdmVuLmV4ZWN1dGFibGUiIHZhbHVlPSJtdm4iLz4NCi0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJtYXZlbi5saW5lMSIgdmFsdWU9IiIvPg0KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9Im1hdmVuLmxpbmUyIiB2YWx1ZT0iIi8+DQotICAgICAgICA8cHJvcGVydHkgbmFtZT0ibWF2ZW4ubGluZTMiIHZhbHVlPSIiLz4NCi0NCi0gICAgICAgIDxwcmVzZXRkZWYgbmFtZT0ibXZuIj4NCi0gICAgICAgICAgICA8ZXhlYyBmYWlsb25lcnJvcj0idHJ1ZSIgZXhlY3V0YWJsZT0iJHttYXZlbi5leGVjdXRhYmxlfSI+DQotICAgICAgICAgICAgICAgIDxlbnYga2V5PSJNQVZFTl9URVJNSU5BVEVfQ01EIiB2YWx1ZT0ib24iLz4NCi0gICAgICAgICAgICAgICAgPGFyZyBsaW5lPSIke21hdmVuLmxpbmUxfSIvPg0KLSAgICAgICAgICAgICAgICA8YXJnIGxpbmU9IiR7bWF2ZW4ubGluZTJ9Ii8+DQotICAgICAgICAgICAgICAgIDxhcmcgbGluZT0iJHttYXZlbi5saW5lM30iLz4NCi0gICAgICAgICAgICA8L2V4ZWM+DQotICAgICAgICA8L3ByZXNldGRlZj4NCi0gICAgPC90YXJnZXQ+DQotDQotICAgIDx0YXJnZXQgbmFtZT0iY2xlYW4iIGRlcGVuZHM9ImluaXQiPg0KLSAgICAgICAgPG12bj4NCi0gICAgICAgICAgICA8YXJnIHZhbHVlPSJjbGVhbiIvPg0KLSAgICAgICAgPC9tdm4+DQotICAgIDwvdGFyZ2V0Pg0KLQ0KLSAgICA8dGFyZ2V0IG5hbWU9Imluc3RhbGwiIGRlcGVuZHM9ImluaXQiPg0KLSAgICAgICAgPG12biBzZWFyY2hwYXRoPSJ0cnVlIiBkaXI9IiR7YmFzZWRpcn0vbW9kdWxlcy90b29sL2F4aXMyLWFhci1tYXZlbi1wbHVnaW4iIGZhaWxvbmVycm9yPSJ0cnVlIj4NCi0gICAgICAgICAgICA8YXJnIGxpbmU9Imluc3RhbGwiLz4NCi0gICAgICAgIDwvbXZuPg0KLSAgICAgICAgPG12biBzZWFyY2hwYXRoPSJ0cnVlIiBkaXI9IiR7YmFzZWRpcn0vbW9kdWxlcy90b29sL2F4aXMyLW1hci1tYXZlbi1wbHVnaW4iIGZhaWxvbmVycm9yPSJ0cnVlIj4NCi0gICAgICAgICAgICA8YXJnIGxpbmU9Imluc3RhbGwiLz4NCi0gICAgICAgIDwvbXZuPg0KLSAgICAgICAgPG12biBzZWFyY2hwYXRoPSJ0cnVlIiBkaXI9IiR7YmFzZWRpcn0iIGZhaWxvbmVycm9yPSJ0cnVlIj4NCi0gICAgICAgICAgICA8YXJnIGxpbmU9Ii1EcmVsZWFzZSBpbnN0YWxsIi8+DQotICAgICAgICA8L212bj4NCi0gICAgPC90YXJnZXQ+DQotDQotICAgIDx0YXJnZXQgbmFtZT0iZGVwbG95IiBkZXBlbmRzPSJpbml0Ij4NCi0gICAgICAgIDxtdm4gc2VhcmNocGF0aD0idHJ1ZSIgZGlyPSIke2Jhc2VkaXJ9L21vZHVsZXMvdG9vbC9heGlzMi1hYXItbWF2ZW4tcGx1Z2luIiBmYWlsb25lcnJvcj0idHJ1ZSI+DQotICAgICAgICAgICAgPGFyZyBsaW5lPSJkZXBsb3kiLz4NCi0gICAgICAgIDwvbXZuPg0KLSAgICAgICAgPG12biBzZWFyY2hwYXRoPSJ0cnVlIiBkaXI9IiR7YmFzZWRpcn0vbW9kdWxlcy90b29sL2F4aXMyLW1hci1tYXZlbi1wbHVnaW4iIGZhaWxvbmVycm9yPSJ0cnVlIj4NCi0gICAgICAgICAgICA8YXJnIGxpbmU9ImRlcGxveSIvPg0KLSAgICAgICAgPC9tdm4+DQotICAgICAgICA8bXZuIHNlYXJjaHBhdGg9InRydWUiIGRpcj0iJHtiYXNlZGlyfSIgZmFpbG9uZXJyb3I9InRydWUiPg0KLSAgICAgICAgICAgIDxhcmcgbGluZT0iLURyZWxlYXNlIGRlcGxveSIvPg0KLSAgICAgICAgPC9tdm4+DQotICAgIDwvdGFyZ2V0Pg0KLTwvcHJvamVjdD4NCi0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvZXRjL0lERUEvQXhpczIueG1sIGIvdjEuNS4xUkMzL2V0Yy9JREVBL0F4aXMyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI4N2M5Mi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvZXRjL0lERUEvQXhpczIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08Y29kZV9zY2hlbWUgbmFtZT0iQXhpczIiPgotICA8b3B0aW9uIG5hbWU9IkFMSUdOX01VTFRJTElORV9QQVJBTUVURVJTX0lOX0NBTExTIiB2YWx1ZT0idHJ1ZSIgLz4KLSAgPG9wdGlvbiBuYW1lPSJTUEFDRV9XSVRISU5fQVJSQVlfSU5JVElBTElaRVJfQlJBQ0VTIiB2YWx1ZT0idHJ1ZSIgLz4KLSAgPG9wdGlvbiBuYW1lPSJTUEFDRV9CRUZPUkVfQVJSQVlfSU5JVElBTElaRVJfTEJSQUNFIiB2YWx1ZT0idHJ1ZSIgLz4KLSAgPG9wdGlvbiBuYW1lPSJDTEFTU19DT1VOVF9UT19VU0VfSU1QT1JUX09OX0RFTUFORCIgdmFsdWU9IjMwIiAvPgotICA8b3B0aW9uIG5hbWU9IlJJR0hUX01BUkdJTiIgdmFsdWU9IjEwMCIgLz4KLSAgPG9wdGlvbiBuYW1lPSJDQUxMX1BBUkFNRVRFUlNfV1JBUCIgdmFsdWU9IjEiIC8+Ci0gIDxvcHRpb24gbmFtZT0iTUVUSE9EX1BBUkFNRVRFUlNfV1JBUCIgdmFsdWU9IjEiIC8+Ci0gIDxvcHRpb24gbmFtZT0iRVhURU5EU19MSVNUX1dSQVAiIHZhbHVlPSIxIiAvPgotICA8b3B0aW9uIG5hbWU9IlRIUk9XU19MSVNUX1dSQVAiIHZhbHVlPSIxIiAvPgotICA8b3B0aW9uIG5hbWU9IkVYVEVORFNfS0VZV09SRF9XUkFQIiB2YWx1ZT0iMSIgLz4KLSAgPG9wdGlvbiBuYW1lPSJUSFJPV1NfS0VZV09SRF9XUkFQIiB2YWx1ZT0iMSIgLz4KLSAgPG9wdGlvbiBuYW1lPSJNRVRIT0RfQ0FMTF9DSEFJTl9XUkFQIiB2YWx1ZT0iMSIgLz4KLSAgPG9wdGlvbiBuYW1lPSJCSU5BUllfT1BFUkFUSU9OX1dSQVAiIHZhbHVlPSIxIiAvPgotICA8b3B0aW9uIG5hbWU9IlRFUk5BUllfT1BFUkFUSU9OX1dSQVAiIHZhbHVlPSIxIiAvPgotICA8b3B0aW9uIG5hbWU9IkZPUl9TVEFURU1FTlRfV1JBUCIgdmFsdWU9IjEiIC8+Ci0gIDxvcHRpb24gbmFtZT0iQVJSQVlfSU5JVElBTElaRVJfV1JBUCIgdmFsdWU9IjEiIC8+Ci0gIDxvcHRpb24gbmFtZT0iQVNTSUdOTUVOVF9XUkFQIiB2YWx1ZT0iMSIgLz4KLSAgPG9wdGlvbiBuYW1lPSJBU1NFUlRfU1RBVEVNRU5UX1dSQVAiIHZhbHVlPSIxIiAvPgotICA8b3B0aW9uIG5hbWU9IlhNTF9BVFRSSUJVVEVfV1JBUCIgdmFsdWU9IjAiIC8+Ci0gIDxvcHRpb24gbmFtZT0iWE1MX1RFWFRfV1JBUCIgdmFsdWU9IjAiIC8+Ci0gIDxvcHRpb24gbmFtZT0iWE1MX0FMSUdOX0FUVFJJQlVURVMiIHZhbHVlPSJmYWxzZSIgLz4KLSAgPG9wdGlvbiBuYW1lPSJQQVJBTUVURVJfQU5OT1RBVElPTl9XUkFQIiB2YWx1ZT0iMSIgLz4KLSAgPG9wdGlvbiBuYW1lPSJWQVJJQUJMRV9BTk5PVEFUSU9OX1dSQVAiIHZhbHVlPSIxIiAvPgotICA8b3B0aW9uIG5hbWU9IkVOVU1fQ09OU1RBTlRTX1dSQVAiIHZhbHVlPSI1IiAvPgotPC9jb2RlX3NjaGVtZT4KLQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL2xlZ2FsL1htbFNjaGVtYS1MSUNFTlNFLnR4dCBiL3YxLjUuMVJDMy9sZWdhbC9YbWxTY2hlbWEtTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlZjhjMjkuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL2xlZ2FsL1htbFNjaGVtYS1MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQNCi0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvDQotDQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9ODQotDQotICAgMS4gRGVmaW5pdGlvbnMuDQotDQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwNCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4NCi0NCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQ0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsDQotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbg0KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sDQotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlDQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3INCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUNCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5Lg0KLQ0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLA0KLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24NCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLg0KLQ0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsDQotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dA0KLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwNCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuDQotDQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3INCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhDQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrDQotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4NCi0NCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0DQotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQ0KLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMNCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3Nlcw0KLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbg0KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwNCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLg0KLQ0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nDQotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucw0KLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQ0KLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXINCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCINCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50DQotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8NCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLA0KLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlDQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0DQotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UNCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiINCi0NCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZA0KLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLg0KLQ0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLA0KLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQ0KLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uDQotDQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsDQotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssDQotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUNCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcg0KLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykNCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQ0KLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhDQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaw0KLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0DQotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcw0KLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQ0KLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4NCi0NCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQ0KLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dA0KLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91DQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQotDQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3INCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQNCi0NCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzDQotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZA0KLQ0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3Jrcw0KLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kDQotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssDQotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YNCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZA0KLQ0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cw0KLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0DQotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZA0KLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QNCi0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lDQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkDQotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3INCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsDQotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQNCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzDQotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQNCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24NCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUNCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkDQotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZA0KLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kDQotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3INCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwNCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgNCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwNCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsNCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLg0KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkNCi0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZA0KLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4NCi0NCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlDQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLA0KLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQ0KLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLg0KLQ0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcg0KLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gNCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3INCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucw0KLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEENCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUNCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkNCi0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuDQotDQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksDQotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsDQotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkNCi0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQ0KLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwNCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGENCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlDQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLA0KLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsDQotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcg0KLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4NCi0NCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nDQotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwNCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LA0KLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzDQotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkNCi0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZg0KLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwNCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkNCi0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uDQotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuDQotDQotICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TDQotDQotICAgQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLg0KLQ0KLSAgICAgIFRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmssIGF0dGFjaCB0aGUgZm9sbG93aW5nDQotICAgICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIg0KLSAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlDQotICAgICAgdGhlIGJyYWNrZXRzISkgIFRoZSB0ZXh0IHNob3VsZCBiZSBlbmNsb3NlZCBpbiB0aGUgYXBwcm9wcmlhdGUNCi0gICAgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGENCi0gICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlDQotICAgICAgc2FtZSAicHJpbnRlZCBwYWdlIiBhcyB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgZWFzaWVyDQotICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLg0KLQ0KLSAgIENvcHlyaWdodCBbeXl5eV0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXQ0KLQ0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9sZWdhbC9hY3RpdmF0aW9uLUxJQ0VOU0UudHh0IGIvdjEuNS4xUkMzL2xlZ2FsL2FjdGl2YXRpb24tTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1Y2UyMGEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL2xlZ2FsL2FjdGl2YXRpb24tTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotQ09NTU9OIERFVkVMT1BNRU5UIEFORCBESVNUUklCVVRJT04gTElDRU5TRSAoQ0RETCkgVmVyc2lvbiAxLjAKLQotMS4gRGVmaW5pdGlvbnMuCi0KLTEuMS4gQ29udHJpYnV0b3IgbWVhbnMgZWFjaCBpbmRpdmlkdWFsIG9yIGVudGl0eSB0aGF0IGNyZWF0ZXMgb3IgY29udHJpYnV0ZXMgdG8gdGhlIGNyZWF0aW9uIG9mIE1vZGlmaWNhdGlvbnMuCi0KLTEuMi4gQ29udHJpYnV0b3IgVmVyc2lvbiBtZWFucyB0aGUgY29tYmluYXRpb24gb2YgdGhlIE9yaWdpbmFsIFNvZnR3YXJlLCBwcmlvciBNb2RpZmljYXRpb25zIHVzZWQgYnkgYSBDb250cmlidXRvciAoaWYgYW55KSwgYW5kIHRoZSBNb2RpZmljYXRpb25zIG1hZGUgYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLgotCi0xLjMuIENvdmVyZWQgU29mdHdhcmUgbWVhbnMgKGEpIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSwgb3IgKGIpIE1vZGlmaWNhdGlvbnMsIG9yIChjKSB0aGUgY29tYmluYXRpb24gb2YgZmlsZXMgY29udGFpbmluZyBPcmlnaW5hbCBTb2Z0d2FyZSB3aXRoIGZpbGVzIGNvbnRhaW5pbmcgTW9kaWZpY2F0aW9ucywgaW4gZWFjaCBjYXNlIGluY2x1ZGluZyBwb3J0aW9ucyB0aGVyZW9mLgotCi0xLjQuIEV4ZWN1dGFibGUgbWVhbnMgdGhlIENvdmVyZWQgU29mdHdhcmUgaW4gYW55IGZvcm0gb3RoZXIgdGhhbiBTb3VyY2UgQ29kZS4KLQotMS41LiBJbml0aWFsIERldmVsb3BlciBtZWFucyB0aGUgaW5kaXZpZHVhbCBvciBlbnRpdHkgdGhhdCBmaXJzdCBtYWtlcyBPcmlnaW5hbCBTb2Z0d2FyZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBMaWNlbnNlLgotCi0xLjYuIExhcmdlciBXb3JrIG1lYW5zIGEgd29yayB3aGljaCBjb21iaW5lcyBDb3ZlcmVkIFNvZnR3YXJlIG9yIHBvcnRpb25zIHRoZXJlb2Ygd2l0aCBjb2RlIG5vdCBnb3Zlcm5lZCBieSB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgotCi0xLjcuIExpY2Vuc2UgbWVhbnMgdGhpcyBkb2N1bWVudC4KLQotMS44LiBMaWNlbnNhYmxlIG1lYW5zIGhhdmluZyB0aGUgcmlnaHQgdG8gZ3JhbnQsIHRvIHRoZSBtYXhpbXVtIGV4dGVudCBwb3NzaWJsZSwgd2hldGhlciBhdCB0aGUgdGltZSBvZiB0aGUgaW5pdGlhbCBncmFudCBvciBzdWJzZXF1ZW50bHkgYWNxdWlyZWQsIGFueSBhbmQgYWxsIG9mIHRoZSByaWdodHMgY29udmV5ZWQgaGVyZWluLgotCi0xLjkuIE1vZGlmaWNhdGlvbnMgbWVhbnMgdGhlIFNvdXJjZSBDb2RlIGFuZCBFeGVjdXRhYmxlIGZvcm0gb2YgYW55IG9mIHRoZSBmb2xsb3dpbmc6Ci0KLUEuIEFueSBmaWxlIHRoYXQgcmVzdWx0cyBmcm9tIGFuIGFkZGl0aW9uIHRvLCBkZWxldGlvbiBmcm9tIG9yIG1vZGlmaWNhdGlvbiBvZiB0aGUgY29udGVudHMgb2YgYSBmaWxlIGNvbnRhaW5pbmcgT3JpZ2luYWwgU29mdHdhcmUgb3IgcHJldmlvdXMgTW9kaWZpY2F0aW9uczsKLQotQi4gQW55IG5ldyBmaWxlIHRoYXQgY29udGFpbnMgYW55IHBhcnQgb2YgdGhlIE9yaWdpbmFsIFNvZnR3YXJlIG9yIHByZXZpb3VzIE1vZGlmaWNhdGlvbjsgb3IKLQotQy4gQW55IG5ldyBmaWxlIHRoYXQgaXMgY29udHJpYnV0ZWQgb3Igb3RoZXJ3aXNlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCi0KLTEuMTAuIE9yaWdpbmFsIFNvZnR3YXJlIG1lYW5zIHRoZSBTb3VyY2UgQ29kZSBhbmQgRXhlY3V0YWJsZSBmb3JtIG9mIGNvbXB1dGVyIHNvZnR3YXJlIGNvZGUgdGhhdCBpcyBvcmlnaW5hbGx5IHJlbGVhc2VkIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotMS4xMS4gUGF0ZW50IENsYWltcyBtZWFucyBhbnkgcGF0ZW50IGNsYWltKHMpLCBub3cgb3duZWQgb3IgaGVyZWFmdGVyIGFjcXVpcmVkLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uLCBtZXRob2QsIHByb2Nlc3MsIGFuZCBhcHBhcmF0dXMgY2xhaW1zLCBpbiBhbnkgcGF0ZW50IExpY2Vuc2FibGUgYnkgZ3JhbnRvci4KLQotMS4xMi4gU291cmNlIENvZGUgbWVhbnMgKGEpIHRoZSBjb21tb24gZm9ybSBvZiBjb21wdXRlciBzb2Z0d2FyZSBjb2RlIGluIHdoaWNoIG1vZGlmaWNhdGlvbnMgYXJlIG1hZGUgYW5kIChiKSBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgaW4gb3Igd2l0aCBzdWNoIGNvZGUuCi0KLTEuMTMuIFlvdSAob3IgWW91cikgbWVhbnMgYW4gaW5kaXZpZHVhbCBvciBhIGxlZ2FsIGVudGl0eSBleGVyY2lzaW5nIHJpZ2h0cyB1bmRlciwgYW5kIGNvbXBseWluZyB3aXRoIGFsbCBvZiB0aGUgdGVybXMgb2YsIHRoaXMgTGljZW5zZS4gRm9yIGxlZ2FsIGVudGl0aWVzLCBZb3UgaW5jbHVkZXMgYW55IGVudGl0eSB3aGljaCBjb250cm9scywgaXMgY29udHJvbGxlZCBieSwgb3IgaXMgdW5kZXIgY29tbW9uIGNvbnRyb2wgd2l0aCBZb3UuIEZvciBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sIGNvbnRyb2wgbWVhbnMgKGEp77+9dGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZSBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvciBvdGhlcndpc2UsIG9yIChiKe+/vW93bmVyc2hpcCBvZiBtb3JlIHRoYW4gZmlmdHkgcGVyY2VudCAoNTAlKSBvZiB0aGUgb3V0c3RhbmRpbmcgc2hhcmVzIG9yIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgotCi0yLiBMaWNlbnNlIEdyYW50cy4KLQotMi4xLiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgR3JhbnQuCi1Db25kaXRpb25lZCB1cG9uIFlvdXIgY29tcGxpYW5jZSB3aXRoIFNlY3Rpb24gMy4xIGJlbG93IGFuZCBzdWJqZWN0IHRvIHRoaXJkIHBhcnR5IGludGVsbGVjdHVhbCBwcm9wZXJ0eSBjbGFpbXMsIHRoZSBJbml0aWFsIERldmVsb3BlciBoZXJlYnkgZ3JhbnRzIFlvdSBhIHdvcmxkLXdpZGUsIHJveWFsdHktZnJlZSwgbm9uLWV4Y2x1c2l2ZSBsaWNlbnNlOgotKGEpIHVuZGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgKG90aGVyIHRoYW4gcGF0ZW50IG9yIHRyYWRlbWFyaykgTGljZW5zYWJsZSBieSBJbml0aWFsIERldmVsb3BlciwgdG8gdXNlLCByZXByb2R1Y2UsIG1vZGlmeSwgZGlzcGxheSwgcGVyZm9ybSwgc3VibGljZW5zZSBhbmQgZGlzdHJpYnV0ZSB0aGUgT3JpZ2luYWwgU29mdHdhcmUgKG9yIHBvcnRpb25zIHRoZXJlb2YpLCB3aXRoIG9yIHdpdGhvdXQgTW9kaWZpY2F0aW9ucywgYW5kL29yIGFzIHBhcnQgb2YgYSBMYXJnZXIgV29yazsgYW5kCi0oYikgdW5kZXIgUGF0ZW50IENsYWltcyBpbmZyaW5nZWQgYnkgdGhlIG1ha2luZywgdXNpbmcgb3Igc2VsbGluZyBvZiBPcmlnaW5hbCBTb2Z0d2FyZSwgdG8gbWFrZSwgaGF2ZSBtYWRlLCB1c2UsIHByYWN0aWNlLCBzZWxsLCBhbmQgb2ZmZXIgZm9yIHNhbGUsIGFuZC9vciBvdGhlcndpc2UgZGlzcG9zZSBvZiB0aGUgT3JpZ2luYWwgU29mdHdhcmUgKG9yIHBvcnRpb25zIHRoZXJlb2YpLgotKGMpIFRoZSBsaWNlbnNlcyBncmFudGVkIGluIFNlY3Rpb25z77+9Mi4xKGEpIGFuZCAoYikgYXJlIGVmZmVjdGl2ZSBvbiB0aGUgZGF0ZSBJbml0aWFsIERldmVsb3BlciBmaXJzdCBkaXN0cmlidXRlcyBvciBvdGhlcndpc2UgbWFrZXMgdGhlIE9yaWdpbmFsIFNvZnR3YXJlIGF2YWlsYWJsZSB0byBhIHRoaXJkIHBhcnR5IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCi0oZCkgTm90d2l0aHN0YW5kaW5nIFNlY3Rpb27vv70yLjEoYikgYWJvdmUsIG5vIHBhdGVudCBsaWNlbnNlIGlzIGdyYW50ZWQ6ICgxKe+/vWZvciBjb2RlIHRoYXQgWW91IGRlbGV0ZSBmcm9tIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSwgb3IgKDIp77+9Zm9yIGluZnJpbmdlbWVudHMgY2F1c2VkIGJ5OiAoaSnvv710aGUgbW9kaWZpY2F0aW9uIG9mIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSwgb3IgKGlpKe+/vXRoZSBjb21iaW5hdGlvbiBvZiB0aGUgT3JpZ2luYWwgU29mdHdhcmUgd2l0aCBvdGhlciBzb2Z0d2FyZSBvciBkZXZpY2VzLgotCi0yLjIuIENvbnRyaWJ1dG9yIEdyYW50LgotQ29uZGl0aW9uZWQgdXBvbiBZb3VyIGNvbXBsaWFuY2Ugd2l0aCBTZWN0aW9uIDMuMSBiZWxvdyBhbmQgc3ViamVjdCB0byB0aGlyZCBwYXJ0eSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgY2xhaW1zLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgWW91IGEgd29ybGQtd2lkZSwgcm95YWx0eS1mcmVlLCBub24tZXhjbHVzaXZlIGxpY2Vuc2U6Ci0oYSkgdW5kZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyAob3RoZXIgdGhhbiBwYXRlbnQgb3IgdHJhZGVtYXJrKSBMaWNlbnNhYmxlIGJ5IENvbnRyaWJ1dG9yIHRvIHVzZSwgcmVwcm9kdWNlLCBtb2RpZnksIGRpc3BsYXksIHBlcmZvcm0sIHN1YmxpY2Vuc2UgYW5kIGRpc3RyaWJ1dGUgdGhlIE1vZGlmaWNhdGlvbnMgY3JlYXRlZCBieSBzdWNoIENvbnRyaWJ1dG9yIChvciBwb3J0aW9ucyB0aGVyZW9mKSwgZWl0aGVyIG9uIGFuIHVubW9kaWZpZWQgYmFzaXMsIHdpdGggb3RoZXIgTW9kaWZpY2F0aW9ucywgYXMgQ292ZXJlZCBTb2Z0d2FyZSBhbmQvb3IgYXMgcGFydCBvZiBhIExhcmdlciBXb3JrOyBhbmQKLShiKSB1bmRlciBQYXRlbnQgQ2xhaW1zIGluZnJpbmdlZCBieSB0aGUgbWFraW5nLCB1c2luZywgb3Igc2VsbGluZyBvZiBNb2RpZmljYXRpb25zIG1hZGUgYnkgdGhhdCBDb250cmlidXRvciBlaXRoZXIgYWxvbmUgYW5kL29yIGluIGNvbWJpbmF0aW9uIHdpdGggaXRzIENvbnRyaWJ1dG9yIFZlcnNpb24gKG9yIHBvcnRpb25zIG9mIHN1Y2ggY29tYmluYXRpb24pLCB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIGZvciBzYWxlLCBoYXZlIG1hZGUsIGFuZC9vciBvdGhlcndpc2UgZGlzcG9zZSBvZjogKDEp77+9TW9kaWZpY2F0aW9ucyBtYWRlIGJ5IHRoYXQgQ29udHJpYnV0b3IgKG9yIHBvcnRpb25zIHRoZXJlb2YpOyBhbmQgKDIp77+9dGhlIGNvbWJpbmF0aW9uIG9mIE1vZGlmaWNhdGlvbnMgbWFkZSBieSB0aGF0IENvbnRyaWJ1dG9yIHdpdGggaXRzIENvbnRyaWJ1dG9yIFZlcnNpb24gKG9yIHBvcnRpb25zIG9mIHN1Y2ggY29tYmluYXRpb24pLgotKGMpIFRoZSBsaWNlbnNlcyBncmFudGVkIGluIFNlY3Rpb25z77+9Mi4yKGEpIGFuZCAyLjIoYikgYXJlIGVmZmVjdGl2ZSBvbiB0aGUgZGF0ZSBDb250cmlidXRvciBmaXJzdCBkaXN0cmlidXRlcyBvciBvdGhlcndpc2UgbWFrZXMgdGhlIE1vZGlmaWNhdGlvbnMgYXZhaWxhYmxlIHRvIGEgdGhpcmQgcGFydHkuCi0oZCkgTm90d2l0aHN0YW5kaW5nIFNlY3Rpb27vv70yLjIoYikgYWJvdmUsIG5vIHBhdGVudCBsaWNlbnNlIGlzIGdyYW50ZWQ6ICgxKe+/vWZvciBhbnkgY29kZSB0aGF0IENvbnRyaWJ1dG9yIGhhcyBkZWxldGVkIGZyb20gdGhlIENvbnRyaWJ1dG9yIFZlcnNpb247ICgyKe+/vWZvciBpbmZyaW5nZW1lbnRzIGNhdXNlZCBieTogKGkp77+9dGhpcmQgcGFydHkgbW9kaWZpY2F0aW9ucyBvZiBDb250cmlidXRvciBWZXJzaW9uLCBvciAoaWkp77+9dGhlIGNvbWJpbmF0aW9uIG9mIE1vZGlmaWNhdGlvbnMgbWFkZSBieSB0aGF0IENvbnRyaWJ1dG9yIHdpdGggb3RoZXIgc29mdHdhcmUgKGV4Y2VwdCBhcyBwYXJ0IG9mIHRoZSBDb250cmlidXRvciBWZXJzaW9uKSBvciBvdGhlciBkZXZpY2VzOyBvciAoMynvv711bmRlciBQYXRlbnQgQ2xhaW1zIGluZnJpbmdlZCBieSBDb3ZlcmVkIFNvZnR3YXJlIGluIHRoZSBhYnNlbmNlIG9mIE1vZGlmaWNhdGlvbnMgbWFkZSBieSB0aGF0IENvbnRyaWJ1dG9yLgotCi0zLiBEaXN0cmlidXRpb24gT2JsaWdhdGlvbnMuCi0KLTMuMS4gQXZhaWxhYmlsaXR5IG9mIFNvdXJjZSBDb2RlLgotCi1BbnkgQ292ZXJlZCBTb2Z0d2FyZSB0aGF0IFlvdSBkaXN0cmlidXRlIG9yIG90aGVyd2lzZSBtYWtlIGF2YWlsYWJsZSBpbiBFeGVjdXRhYmxlIGZvcm0gbXVzdCBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIGluIFNvdXJjZSBDb2RlIGZvcm0gYW5kIHRoYXQgU291cmNlIENvZGUgZm9ybSBtdXN0IGJlIGRpc3RyaWJ1dGVkIG9ubHkgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4gWW91IG11c3QgaW5jbHVkZSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlIHdpdGggZXZlcnkgY29weSBvZiB0aGUgU291cmNlIENvZGUgZm9ybSBvZiB0aGUgQ292ZXJlZCBTb2Z0d2FyZSBZb3UgZGlzdHJpYnV0ZSBvciBvdGhlcndpc2UgbWFrZSBhdmFpbGFibGUuIFlvdSBtdXN0IGluZm9ybSByZWNpcGllbnRzIG9mIGFueSBzdWNoIENvdmVyZWQgU29mdHdhcmUgaW4gRXhlY3V0YWJsZSBmb3JtIGFzIHRvIGhvdyB0aGV5IGNhbiBvYnRhaW4gc3VjaCBDb3ZlcmVkIFNvZnR3YXJlIGluIFNvdXJjZSBDb2RlIGZvcm0gaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLgotCi0zLjIuIE1vZGlmaWNhdGlvbnMuCi0KLVRoZSBNb2RpZmljYXRpb25zIHRoYXQgWW91IGNyZWF0ZSBvciB0byB3aGljaCBZb3UgY29udHJpYnV0ZSBhcmUgZ292ZXJuZWQgYnkgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4gWW91IHJlcHJlc2VudCB0aGF0IFlvdSBiZWxpZXZlIFlvdXIgTW9kaWZpY2F0aW9ucyBhcmUgWW91ciBvcmlnaW5hbCBjcmVhdGlvbihzKSBhbmQvb3IgWW91IGhhdmUgc3VmZmljaWVudCByaWdodHMgdG8gZ3JhbnQgdGhlIHJpZ2h0cyBjb252ZXllZCBieSB0aGlzIExpY2Vuc2UuCi0KLTMuMy4gUmVxdWlyZWQgTm90aWNlcy4KLVlvdSBtdXN0IGluY2x1ZGUgYSBub3RpY2UgaW4gZWFjaCBvZiBZb3VyIE1vZGlmaWNhdGlvbnMgdGhhdCBpZGVudGlmaWVzIFlvdSBhcyB0aGUgQ29udHJpYnV0b3Igb2YgdGhlIE1vZGlmaWNhdGlvbi4gWW91IG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueSBjb3B5cmlnaHQsIHBhdGVudCBvciB0cmFkZW1hcmsgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBDb3ZlcmVkIFNvZnR3YXJlLCBvciBhbnkgbm90aWNlcyBvZiBsaWNlbnNpbmcgb3IgYW55IGRlc2NyaXB0aXZlIHRleHQgZ2l2aW5nIGF0dHJpYnV0aW9uIHRvIGFueSBDb250cmlidXRvciBvciB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuCi0KLTMuNC4gQXBwbGljYXRpb24gb2YgQWRkaXRpb25hbCBUZXJtcy4KLVlvdSBtYXkgbm90IG9mZmVyIG9yIGltcG9zZSBhbnkgdGVybXMgb24gYW55IENvdmVyZWQgU29mdHdhcmUgaW4gU291cmNlIENvZGUgZm9ybSB0aGF0IGFsdGVycyBvciByZXN0cmljdHMgdGhlIGFwcGxpY2FibGUgdmVyc2lvbiBvZiB0aGlzIExpY2Vuc2Ugb3IgdGhlIHJlY2lwaWVudHMgcmlnaHRzIGhlcmV1bmRlci4gWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsIGFuZCB0byBjaGFyZ2UgYSBmZWUgZm9yLCB3YXJyYW50eSwgc3VwcG9ydCwgaW5kZW1uaXR5IG9yIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyB0byBvbmUgb3IgbW9yZSByZWNpcGllbnRzIG9mIENvdmVyZWQgU29mdHdhcmUuIEhvd2V2ZXIsIHlvdSBtYXkgZG8gc28gb25seSBvbiBZb3VyIG93biBiZWhhbGYsIGFuZCBub3Qgb24gYmVoYWxmIG9mIHRoZSBJbml0aWFsIERldmVsb3BlciBvciBhbnkgQ29udHJpYnV0b3IuIFlvdSBtdXN0IG1ha2UgaXQgYWJzb2x1dGVseSBjbGVhciB0aGF0IGFueSBzdWNoIHdhcnJhbnR5LCBzdXBwb3J0LCBpbmRlbW5pdHkgb3IgbGlhYmlsaXR5IG9ibGlnYXRpb24gaXMgb2ZmZXJlZCBieSBZb3UgYWxvbmUsIGFuZCBZb3UgaGVyZWJ5IGFncmVlIHRvIGluZGVtbmlmeSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYW5kIGV2ZXJ5IENvbnRyaWJ1dG9yIGZvciBhbnkgbGlhYmlsaXR5IGluY3VycmVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBvciBzdWNoIENvbnRyaWJ1dG9yIGFzIGEgcmVzdWx0IG9mIHdhcnJhbnR5LCBzdXBwb3J0LCBpbmRlbW5pdHkgb3IgbGlhYmlsaXR5IHRlcm1zIFlvdSBvZmZlci4KLQotMy41LiBEaXN0cmlidXRpb24gb2YgRXhlY3V0YWJsZSBWZXJzaW9ucy4KLVlvdSBtYXkgZGlzdHJpYnV0ZSB0aGUgRXhlY3V0YWJsZSBmb3JtIG9mIHRoZSBDb3ZlcmVkIFNvZnR3YXJlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2Ugb3IgdW5kZXIgdGhlIHRlcm1zIG9mIGEgbGljZW5zZSBvZiBZb3VyIGNob2ljZSwgd2hpY2ggbWF5IGNvbnRhaW4gdGVybXMgZGlmZmVyZW50IGZyb20gdGhpcyBMaWNlbnNlLCBwcm92aWRlZCB0aGF0IFlvdSBhcmUgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UgYW5kIHRoYXQgdGhlIGxpY2Vuc2UgZm9yIHRoZSBFeGVjdXRhYmxlIGZvcm0gZG9lcyBub3QgYXR0ZW1wdCB0byBsaW1pdCBvciBhbHRlciB0aGUgcmVjaXBpZW50cyByaWdodHMgaW4gdGhlIFNvdXJjZSBDb2RlIGZvcm0gZnJvbSB0aGUgcmlnaHRzIHNldCBmb3J0aCBpbiB0aGlzIExpY2Vuc2UuIElmIFlvdSBkaXN0cmlidXRlIHRoZSBDb3ZlcmVkIFNvZnR3YXJlIGluIEV4ZWN1dGFibGUgZm9ybSB1bmRlciBhIGRpZmZlcmVudCBsaWNlbnNlLCBZb3UgbXVzdCBtYWtlIGl0IGFic29sdXRlbHkgY2xlYXIgdGhhdCBhbnkgdGVybXMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBMaWNlbnNlIGFyZSBvZmZlcmVkIGJ5IFlvdSBhbG9uZSwgbm90IGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBvciBDb250cmlidXRvci4gWW91IGhlcmVieSBhZ3JlZSB0byBpbmRlbW5pZnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFuZCBldmVyeSBDb250cmlidXRvciBmb3IgYW55IGxpYWJpbGl0eSBpbmN1cnJlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgb3Igc3VjaCBDb250cmlidXRvciBhcyBhIHJlc3VsdCBvZiBhbnkgc3VjaCB0ZXJtcyBZb3Ugb2ZmZXIuCi0KLTMuNi4gTGFyZ2VyIFdvcmtzLgotWW91IG1heSBjcmVhdGUgYSBMYXJnZXIgV29yayBieSBjb21iaW5pbmcgQ292ZXJlZCBTb2Z0d2FyZSB3aXRoIG90aGVyIGNvZGUgbm90IGdvdmVybmVkIGJ5IHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UgYW5kIGRpc3RyaWJ1dGUgdGhlIExhcmdlciBXb3JrIGFzIGEgc2luZ2xlIHByb2R1Y3QuIEluIHN1Y2ggYSBjYXNlLCBZb3UgbXVzdCBtYWtlIHN1cmUgdGhlIHJlcXVpcmVtZW50cyBvZiB0aGlzIExpY2Vuc2UgYXJlIGZ1bGZpbGxlZCBmb3IgdGhlIENvdmVyZWQgU29mdHdhcmUuCi0KLTQuIFZlcnNpb25zIG9mIHRoZSBMaWNlbnNlLgotCi00LjEuIE5ldyBWZXJzaW9ucy4KLVN1biBNaWNyb3N5c3RlbXMsIEluYy4gaXMgdGhlIGluaXRpYWwgbGljZW5zZSBzdGV3YXJkIGFuZCBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcgdmVyc2lvbnMgb2YgdGhpcyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLiBFYWNoIHZlcnNpb24gd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBFeGNlcHQgYXMgcHJvdmlkZWQgaW4gU2VjdGlvbiA0LjMsIG5vIG9uZSBvdGhlciB0aGFuIHRoZSBsaWNlbnNlIHN0ZXdhcmQgaGFzIHRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBMaWNlbnNlLgotCi00LjIuIEVmZmVjdCBvZiBOZXcgVmVyc2lvbnMuCi0KLVlvdSBtYXkgYWx3YXlzIGNvbnRpbnVlIHRvIHVzZSwgZGlzdHJpYnV0ZSBvciBvdGhlcndpc2UgbWFrZSB0aGUgQ292ZXJlZCBTb2Z0d2FyZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSB2ZXJzaW9uIG9mIHRoZSBMaWNlbnNlIHVuZGVyIHdoaWNoIFlvdSBvcmlnaW5hbGx5IHJlY2VpdmVkIHRoZSBDb3ZlcmVkIFNvZnR3YXJlLiBJZiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgaW5jbHVkZXMgYSBub3RpY2UgaW4gdGhlIE9yaWdpbmFsIFNvZnR3YXJlIHByb2hpYml0aW5nIGl0IGZyb20gYmVpbmcgZGlzdHJpYnV0ZWQgb3Igb3RoZXJ3aXNlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIGFueSBzdWJzZXF1ZW50IHZlcnNpb24gb2YgdGhlIExpY2Vuc2UsIFlvdSBtdXN0IGRpc3RyaWJ1dGUgYW5kIG1ha2UgdGhlIENvdmVyZWQgU29mdHdhcmUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgdmVyc2lvbiBvZiB0aGUgTGljZW5zZSB1bmRlciB3aGljaCBZb3Ugb3JpZ2luYWxseSByZWNlaXZlZCB0aGUgQ292ZXJlZCBTb2Z0d2FyZS4gT3RoZXJ3aXNlLCBZb3UgbWF5IGFsc28gY2hvb3NlIHRvIHVzZSwgZGlzdHJpYnV0ZSBvciBvdGhlcndpc2UgbWFrZSB0aGUgQ292ZXJlZCBTb2Z0d2FyZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIGFueSBzdWJzZXF1ZW50IHZlcnNpb24gb2YgdGhlIExpY2Vuc2UgcHVibGlzaGVkIGJ5IHRoZSBsaWNlbnNlIHN0ZXdhcmQuCi00LjMuIE1vZGlmaWVkIFZlcnNpb25zLgotCi1XaGVuIFlvdSBhcmUgYW4gSW5pdGlhbCBEZXZlbG9wZXIgYW5kIFlvdSB3YW50IHRvIGNyZWF0ZSBhIG5ldyBsaWNlbnNlIGZvciBZb3VyIE9yaWdpbmFsIFNvZnR3YXJlLCBZb3UgbWF5IGNyZWF0ZSBhbmQgdXNlIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGlzIExpY2Vuc2UgaWYgWW91OiAoYSnvv71yZW5hbWUgdGhlIGxpY2Vuc2UgYW5kIHJlbW92ZSBhbnkgcmVmZXJlbmNlcyB0byB0aGUgbmFtZSBvZiB0aGUgbGljZW5zZSBzdGV3YXJkIChleGNlcHQgdG8gbm90ZSB0aGF0IHRoZSBsaWNlbnNlIGRpZmZlcnMgZnJvbSB0aGlzIExpY2Vuc2UpOyBhbmQgKGIp77+9b3RoZXJ3aXNlIG1ha2UgaXQgY2xlYXIgdGhhdCB0aGUgbGljZW5zZSBjb250YWlucyB0ZXJtcyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIExpY2Vuc2UuCi0KLTUuIERJU0NMQUlNRVIgT0YgV0FSUkFOVFkuCi0KLUNPVkVSRUQgU09GVFdBUkUgSVMgUFJPVklERUQgVU5ERVIgVEhJUyBMSUNFTlNFIE9OIEFOIEFTIElTIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBXQVJSQU5USUVTIFRIQVQgVEhFIENPVkVSRUQgU09GVFdBUkUgSVMgRlJFRSBPRiBERUZFQ1RTLCBNRVJDSEFOVEFCTEUsIEZJVCBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgT1IgTk9OLUlORlJJTkdJTkcuIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIENPVkVSRUQgU09GVFdBUkUgSVMgV0lUSCBZT1UuIFNIT1VMRCBBTlkgQ09WRVJFRCBTT0ZUV0FSRSBQUk9WRSBERUZFQ1RJVkUgSU4gQU5ZIFJFU1BFQ1QsIFlPVSAoTk9UIFRIRSBJTklUSUFMIERFVkVMT1BFUiBPUiBBTlkgT1RIRVIgQ09OVFJJQlVUT1IpIEFTU1VNRSBUSEUgQ09TVCBPRiBBTlkgTkVDRVNTQVJZIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uIFRISVMgRElTQ0xBSU1FUiBPRiBXQVJSQU5UWSBDT05TVElUVVRFUyBBTiBFU1NFTlRJQUwgUEFSVCBPRiBUSElTIExJQ0VOU0UuIE5PIFVTRSBPRiBBTlkgQ09WRVJFRCBTT0ZUV0FSRSBJUyBBVVRIT1JJWkVEIEhFUkVVTkRFUiBFWENFUFQgVU5ERVIgVEhJUyBESVNDTEFJTUVSLgotCi02LiBURVJNSU5BVElPTi4KLQotNi4xLiBUaGlzIExpY2Vuc2UgYW5kIHRoZSByaWdodHMgZ3JhbnRlZCBoZXJldW5kZXIgd2lsbCB0ZXJtaW5hdGUgYXV0b21hdGljYWxseSBpZiBZb3UgZmFpbCB0byBjb21wbHkgd2l0aCB0ZXJtcyBoZXJlaW4gYW5kIGZhaWwgdG8gY3VyZSBzdWNoIGJyZWFjaCB3aXRoaW4gMzAgZGF5cyBvZiBiZWNvbWluZyBhd2FyZSBvZiB0aGUgYnJlYWNoLiBQcm92aXNpb25zIHdoaWNoLCBieSB0aGVpciBuYXR1cmUsIG11c3QgcmVtYWluIGluIGVmZmVjdCBiZXlvbmQgdGhlIHRlcm1pbmF0aW9uIG9mIHRoaXMgTGljZW5zZSBzaGFsbCBzdXJ2aXZlLgotCi02LjIuIElmIFlvdSBhc3NlcnQgYSBwYXRlbnQgaW5mcmluZ2VtZW50IGNsYWltIChleGNsdWRpbmcgZGVjbGFyYXRvcnkganVkZ21lbnQgYWN0aW9ucykgYWdhaW5zdCBJbml0aWFsIERldmVsb3BlciBvciBhIENvbnRyaWJ1dG9yICh0aGUgSW5pdGlhbCBEZXZlbG9wZXIgb3IgQ29udHJpYnV0b3IgYWdhaW5zdCB3aG9tIFlvdSBhc3NlcnQgc3VjaCBjbGFpbSBpcyByZWZlcnJlZCB0byBhcyBQYXJ0aWNpcGFudCkgYWxsZWdpbmcgdGhhdCB0aGUgUGFydGljaXBhbnQgU29mdHdhcmUgKG1lYW5pbmcgdGhlIENvbnRyaWJ1dG9yIFZlcnNpb24gd2hlcmUgdGhlIFBhcnRpY2lwYW50IGlzIGEgQ29udHJpYnV0b3Igb3IgdGhlIE9yaWdpbmFsIFNvZnR3YXJlIHdoZXJlIHRoZSBQYXJ0aWNpcGFudCBpcyB0aGUgSW5pdGlhbCBEZXZlbG9wZXIpIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgaW5mcmluZ2VzIGFueSBwYXRlbnQsIHRoZW4gYW55IGFuZCBhbGwgcmlnaHRzIGdyYW50ZWQgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSB0byBZb3UgYnkgc3VjaCBQYXJ0aWNpcGFudCwgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIChpZiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgaXMgbm90IHRoZSBQYXJ0aWNpcGFudCkgYW5kIGFsbCBDb250cmlidXRvcnMgdW5kZXIgU2VjdGlvbnPvv70yLjEgYW5kL29yIDIuMiBvZiB0aGlzIExpY2Vuc2Ugc2hhbGwsIHVwb24gNjAgZGF5cyBub3RpY2UgZnJvbSBQYXJ0aWNpcGFudCB0ZXJtaW5hdGUgcHJvc3BlY3RpdmVseSBhbmQgYXV0b21hdGljYWxseSBhdCB0aGUgZXhwaXJhdGlvbiBvZiBzdWNoIDYwIGRheSBub3RpY2UgcGVyaW9kLCB1bmxlc3MgaWYgd2l0aGluIHN1Y2ggNjAgZGF5IHBlcmlvZCBZb3Ugd2l0aGRyYXcgWW91ciBjbGFpbSB3aXRoIHJlc3BlY3QgdG8gdGhlIFBhcnRpY2lwYW50IFNvZnR3YXJlIGFnYWluc3Qgc3VjaCBQYXJ0aWNpcGFudCBlaXRoZXIgdW5pbGF0ZXJhbGx5IG9yIHB1cnN1YW50IHRvIGEgd3JpdHRlbiBhZ3JlZW1lbnQgd2l0aCBQYXJ0aWNpcGFudC4KLQotNi4zLiBJbiB0aGUgZXZlbnQgb2YgdGVybWluYXRpb24gdW5kZXIgU2VjdGlvbnPvv702LjEgb3IgNi4yIGFib3ZlLCBhbGwgZW5kIHVzZXIgbGljZW5zZXMgdGhhdCBoYXZlIGJlZW4gdmFsaWRseSBncmFudGVkIGJ5IFlvdSBvciBhbnkgZGlzdHJpYnV0b3IgaGVyZXVuZGVyIHByaW9yIHRvIHRlcm1pbmF0aW9uIChleGNsdWRpbmcgbGljZW5zZXMgZ3JhbnRlZCB0byBZb3UgYnkgYW55IGRpc3RyaWJ1dG9yKSBzaGFsbCBzdXJ2aXZlIHRlcm1pbmF0aW9uLgotCi03LiBMSU1JVEFUSU9OIE9GIExJQUJJTElUWS4KLQotVU5ERVIgTk8gQ0lSQ1VNU1RBTkNFUyBBTkQgVU5ERVIgTk8gTEVHQUwgVEhFT1JZLCBXSEVUSEVSIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFKSwgQ09OVFJBQ1QsIE9SIE9USEVSV0lTRSwgU0hBTEwgWU9VLCBUSEUgSU5JVElBTCBERVZFTE9QRVIsIEFOWSBPVEhFUiBDT05UUklCVVRPUiwgT1IgQU5ZIERJU1RSSUJVVE9SIE9GIENPVkVSRUQgU09GVFdBUkUsIE9SIEFOWSBTVVBQTElFUiBPRiBBTlkgT0YgU1VDSCBQQVJUSUVTLCBCRSBMSUFCTEUgVE8gQU5ZIFBFUlNPTiBGT1IgQU5ZIElORElSRUNULCBTUEVDSUFMLCBJTkNJREVOVEFMLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT0YgQU5ZIENIQVJBQ1RFUiBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgREFNQUdFUyBGT1IgTE9TVCBQUk9GSVRTLCBMT1NTIE9GIEdPT0RXSUxMLCBXT1JLIFNUT1BQQUdFLCBDT01QVVRFUiBGQUlMVVJFIE9SIE1BTEZVTkNUSU9OLCBPUiBBTlkgQU5EIEFMTCBPVEhFUiBDT01NRVJDSUFMIERBTUFHRVMgT1IgTE9TU0VTLCBFVkVOIElGIFNVQ0ggUEFSVFkgU0hBTEwgSEFWRSBCRUVOIElORk9STUVEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuIFRISVMgTElNSVRBVElPTiBPRiBMSUFCSUxJVFkgU0hBTEwgTk9UIEFQUExZIFRPIExJQUJJTElUWSBGT1IgREVBVEggT1IgUEVSU09OQUwgSU5KVVJZIFJFU1VMVElORyBGUk9NIFNVQ0ggUEFSVFlTIE5FR0xJR0VOQ0UgVE8gVEhFIEVYVEVOVCBBUFBMSUNBQkxFIExBVyBQUk9ISUJJVFMgU1VDSCBMSU1JVEFUSU9OLiBTT01FIEpVUklTRElDVElPTlMgRE8gTk9UIEFMTE9XIFRIRSBFWENMVVNJT04gT1IgTElNSVRBVElPTiBPRiBJTkNJREVOVEFMIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUywgU08gVEhJUyBFWENMVVNJT04gQU5EIExJTUlUQVRJT04gTUFZIE5PVCBBUFBMWSBUTyBZT1UuCi0KLTguIFUuUy4gR09WRVJOTUVOVCBFTkQgVVNFUlMuCi0KLVRoZSBDb3ZlcmVkIFNvZnR3YXJlIGlzIGEgY29tbWVyY2lhbCBpdGVtLCBhcyB0aGF0IHRlcm0gaXMgZGVmaW5lZCBpbiA0OO+/vUMuRi5SLu+/vTIuMTAxIChPY3QuIDE5OTUpLCBjb25zaXN0aW5nIG9mIGNvbW1lcmNpYWwgY29tcHV0ZXIgc29mdHdhcmUgKGFzIHRoYXQgdGVybSBpcyBkZWZpbmVkIGF0IDQ4IEMuRi5SLiDvv70yNTIuMjI3LTcwMTQoYSkoMSkpIGFuZCBjb21tZXJjaWFsIGNvbXB1dGVyIHNvZnR3YXJlIGRvY3VtZW50YXRpb24gYXMgc3VjaCB0ZXJtcyBhcmUgdXNlZCBpbiA0OO+/vUMuRi5SLu+/vTEyLjIxMiAoU2VwdC4gMTk5NSkuIENvbnNpc3RlbnQgd2l0aCA0OCBDLkYuUi4gMTIuMjEyIGFuZCA0OCBDLkYuUi4gMjI3LjcyMDItMSB0aHJvdWdoIDIyNy43MjAyLTQgKEp1bmUgMTk5NSksIGFsbCBVLlMuIEdvdmVybm1lbnQgRW5kIFVzZXJzIGFjcXVpcmUgQ292ZXJlZCBTb2Z0d2FyZSB3aXRoIG9ubHkgdGhvc2UgcmlnaHRzIHNldCBmb3J0aCBoZXJlaW4uIFRoaXMgVS5TLiBHb3Zlcm5tZW50IFJpZ2h0cyBjbGF1c2UgaXMgaW4gbGlldSBvZiwgYW5kIHN1cGVyc2VkZXMsIGFueSBvdGhlciBGQVIsIERGQVIsIG9yIG90aGVyIGNsYXVzZSBvciBwcm92aXNpb24gdGhhdCBhZGRyZXNzZXMgR292ZXJubWVudCByaWdodHMgaW4gY29tcHV0ZXIgc29mdHdhcmUgdW5kZXIgdGhpcyBMaWNlbnNlLgotCi05LiBNSVNDRUxMQU5FT1VTLgotCi1UaGlzIExpY2Vuc2UgcmVwcmVzZW50cyB0aGUgY29tcGxldGUgYWdyZWVtZW50IGNvbmNlcm5pbmcgc3ViamVjdCBtYXR0ZXIgaGVyZW9mLiBJZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBoZWxkIHRvIGJlIHVuZW5mb3JjZWFibGUsIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIG9ubHkgdG8gdGhlIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBpdCBlbmZvcmNlYWJsZS4gVGhpcyBMaWNlbnNlIHNoYWxsIGJlIGdvdmVybmVkIGJ5IHRoZSBsYXcgb2YgdGhlIGp1cmlzZGljdGlvbiBzcGVjaWZpZWQgaW4gYSBub3RpY2UgY29udGFpbmVkIHdpdGhpbiB0aGUgT3JpZ2luYWwgU29mdHdhcmUgKGV4Y2VwdCB0byB0aGUgZXh0ZW50IGFwcGxpY2FibGUgbGF3LCBpZiBhbnksIHByb3ZpZGVzIG90aGVyd2lzZSksIGV4Y2x1ZGluZyBzdWNoIGp1cmlzZGljdGlvbnMgY29uZmxpY3Qtb2YtbGF3IHByb3Zpc2lvbnMuIEFueSBsaXRpZ2F0aW9uIHJlbGF0aW5nIHRvIHRoaXMgTGljZW5zZSBzaGFsbCBiZSBzdWJqZWN0IHRvIHRoZSBqdXJpc2RpY3Rpb24gb2YgdGhlIGNvdXJ0cyBsb2NhdGVkIGluIHRoZSBqdXJpc2RpY3Rpb24gYW5kIHZlbnVlIHNwZWNpZmllZCBpbiBhIG5vdGljZSBjb250YWluZWQgd2l0aGluIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSwgd2l0aCB0aGUgbG9zaW5nIHBhcnR5IHJlc3BvbnNpYmxlIGZvciBjb3N0cywgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGNvdXJ0IGNvc3RzIGFuZCByZWFzb25hYmxlIGF0dG9ybmV5cyBmZWVzIGFuZCBleHBlbnNlcy4gVGhlIGFwcGxpY2F0aW9uIG9mIHRoZSBVbml0ZWQgTmF0aW9ucyBDb252ZW50aW9uIG9uIENvbnRyYWN0cyBmb3IgdGhlIEludGVybmF0aW9uYWwgU2FsZSBvZiBHb29kcyBpcyBleHByZXNzbHkgZXhjbHVkZWQuIEFueSBsYXcgb3IgcmVndWxhdGlvbiB3aGljaCBwcm92aWRlcyB0aGF0IHRoZSBsYW5ndWFnZSBvZiBhIGNvbnRyYWN0IHNoYWxsIGJlIGNvbnN0cnVlZCBhZ2FpbnN0IHRoZSBkcmFmdGVyIHNoYWxsIG5vdCBhcHBseSB0byB0aGlzIExpY2Vuc2UuIFlvdSBhZ3JlZSB0aGF0IFlvdSBhbG9uZSBhcmUgcmVzcG9uc2libGUgZm9yIGNvbXBsaWFuY2Ugd2l0aCB0aGUgVW5pdGVkIFN0YXRlcyBleHBvcnQgYWRtaW5pc3RyYXRpb24gcmVndWxhdGlvbnMgKGFuZCB0aGUgZXhwb3J0IGNvbnRyb2wgbGF3cyBhbmQgcmVndWxhdGlvbiBvZiBhbnkgb3RoZXIgY291bnRyaWVzKSB3aGVuIFlvdSB1c2UsIGRpc3RyaWJ1dGUgb3Igb3RoZXJ3aXNlIG1ha2UgYXZhaWxhYmxlIGFueSBDb3ZlcmVkIFNvZnR3YXJlLgotCi0xMC4gUkVTUE9OU0lCSUxJVFkgRk9SIENMQUlNUy4KLQotQXMgYmV0d2VlbiBJbml0aWFsIERldmVsb3BlciBhbmQgdGhlIENvbnRyaWJ1dG9ycywgZWFjaCBwYXJ0eSBpcyByZXNwb25zaWJsZSBmb3IgY2xhaW1zIGFuZCBkYW1hZ2VzIGFyaXNpbmcsIGRpcmVjdGx5IG9yIGluZGlyZWN0bHksIG91dCBvZiBpdHMgdXRpbGl6YXRpb24gb2YgcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZSBhbmQgWW91IGFncmVlIHRvIHdvcmsgd2l0aCBJbml0aWFsIERldmVsb3BlciBhbmQgQ29udHJpYnV0b3JzIHRvIGRpc3RyaWJ1dGUgc3VjaCByZXNwb25zaWJpbGl0eSBvbiBhbiBlcXVpdGFibGUgYmFzaXMuIE5vdGhpbmcgaGVyZWluIGlzIGludGVuZGVkIG9yIHNoYWxsIGJlIGRlZW1lZCB0byBjb25zdGl0dXRlIGFueSBhZG1pc3Npb24gb2YgbGlhYmlsaXR5LgotCi1OT1RJQ0UgUFVSU1VBTlQgVE8gU0VDVElPTiA5IE9GIFRIRSBDT01NT04gREVWRUxPUE1FTlQgQU5EIERJU1RSSUJVVElPTiBMSUNFTlNFIChDRERMKQotVGhlIEdsYXNzRmlzaCBjb2RlIHJlbGVhc2VkIHVuZGVyIHRoZSBDRERMIHNoYWxsIGJlIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZSBTdGF0ZSBvZiBDYWxpZm9ybmlhIChleGNsdWRpbmcgY29uZmxpY3Qtb2YtbGF3IHByb3Zpc2lvbnMpLiBBbnkgbGl0aWdhdGlvbiByZWxhdGluZyB0byB0aGlzIExpY2Vuc2Ugc2hhbGwgYmUgc3ViamVjdCB0byB0aGUganVyaXNkaWN0aW9uIG9mIHRoZSBGZWRlcmFsIENvdXJ0cyBvZiB0aGUgTm9ydGhlcm4gRGlzdHJpY3Qgb2YgQ2FsaWZvcm5pYSBhbmQgdGhlIHN0YXRlIGNvdXJ0cyBvZiB0aGUgU3RhdGUgb2YgQ2FsaWZvcm5pYSwgd2l0aCB2ZW51ZSBseWluZyBpbiBTYW50YSBDbGFyYSBDb3VudHksIENhbGlmb3JuaWEuIAotCi0KLQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL2xlZ2FsL2Fubm9nZW4tTElDRU5TRS50eHQgYi92MS41LjFSQzMvbGVnYWwvYW5ub2dlbi1MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmVmOGMyOS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbGVnYWwvYW5ub2dlbi1MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQNCi0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvDQotDQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9ODQotDQotICAgMS4gRGVmaW5pdGlvbnMuDQotDQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwNCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4NCi0NCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQ0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsDQotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbg0KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sDQotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlDQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3INCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUNCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5Lg0KLQ0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLA0KLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24NCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLg0KLQ0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsDQotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dA0KLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwNCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuDQotDQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3INCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhDQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrDQotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4NCi0NCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0DQotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQ0KLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMNCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3Nlcw0KLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbg0KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwNCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLg0KLQ0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nDQotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucw0KLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQ0KLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXINCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCINCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50DQotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8NCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLA0KLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlDQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0DQotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UNCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiINCi0NCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZA0KLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLg0KLQ0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLA0KLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQ0KLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uDQotDQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsDQotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssDQotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUNCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcg0KLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykNCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQ0KLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhDQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaw0KLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0DQotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcw0KLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQ0KLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4NCi0NCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQ0KLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dA0KLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91DQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQotDQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3INCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQNCi0NCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzDQotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZA0KLQ0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3Jrcw0KLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kDQotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssDQotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YNCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZA0KLQ0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cw0KLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0DQotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZA0KLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QNCi0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lDQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkDQotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3INCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsDQotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQNCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzDQotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQNCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24NCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUNCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkDQotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZA0KLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kDQotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3INCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwNCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgNCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwNCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsNCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLg0KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkNCi0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZA0KLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4NCi0NCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlDQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLA0KLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQ0KLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLg0KLQ0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcg0KLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gNCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3INCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucw0KLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEENCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUNCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkNCi0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuDQotDQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksDQotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsDQotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkNCi0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQ0KLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwNCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGENCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlDQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLA0KLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsDQotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcg0KLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4NCi0NCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nDQotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwNCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LA0KLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzDQotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkNCi0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZg0KLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwNCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkNCi0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uDQotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuDQotDQotICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TDQotDQotICAgQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLg0KLQ0KLSAgICAgIFRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmssIGF0dGFjaCB0aGUgZm9sbG93aW5nDQotICAgICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIg0KLSAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlDQotICAgICAgdGhlIGJyYWNrZXRzISkgIFRoZSB0ZXh0IHNob3VsZCBiZSBlbmNsb3NlZCBpbiB0aGUgYXBwcm9wcmlhdGUNCi0gICAgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGENCi0gICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlDQotICAgICAgc2FtZSAicHJpbnRlZCBwYWdlIiBhcyB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgZWFzaWVyDQotICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLg0KLQ0KLSAgIENvcHlyaWdodCBbeXl5eV0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXQ0KLQ0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9sZWdhbC9heGlvbS1hcGktTElDRU5TRS50eHQgYi92MS41LjFSQzMvbGVnYWwvYXhpb20tYXBpLUxJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2JjODhhLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9sZWdhbC9heGlvbS1hcGktTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KLQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCi0KLSAgIDEuIERlZmluaXRpb25zLgotCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5Ci0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCi0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCi0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KLQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KLQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yawotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KLQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucwotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KLQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgotCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KLQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCi0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91Ci0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgotCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0Ci0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKLQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAotCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAotCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0Ci0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90Ci0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cwotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgotCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCi0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCi0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgotCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5Ci0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5Ci0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KLQotICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0KLSAgIEFQUEVORElYOiBIb3cgdG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yay4KLQotICAgICAgVG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yaywgYXR0YWNoIHRoZSBmb2xsb3dpbmcKLSAgICAgIGJvaWxlcnBsYXRlIG5vdGljZSwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzICJbXSIKLSAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCi0gICAgICB0aGUgYnJhY2tldHMhKSAgVGhlIHRleHQgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBhcHByb3ByaWF0ZQotICAgICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhCi0gICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCi0gICAgICBzYW1lICJwcmludGVkIHBhZ2UiIGFzIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciBlYXNpZXIKLSAgICAgIGlkZW50aWZpY2F0aW9uIHdpdGhpbiB0aGlyZC1wYXJ0eSBhcmNoaXZlcy4KLQotICAgQ29weXJpZ2h0IFt5eXl5XSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdCi0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9sZWdhbC9heGlvbS1kb20tTElDRU5TRS50eHQgYi92MS41LjFSQzMvbGVnYWwvYXhpb20tZG9tLUxJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2JjODhhLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9sZWdhbC9heGlvbS1kb20tTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KLQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCi0KLSAgIDEuIERlZmluaXRpb25zLgotCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5Ci0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCi0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCi0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KLQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KLQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yawotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KLQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucwotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KLQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgotCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KLQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCi0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91Ci0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgotCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0Ci0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKLQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAotCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAotCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0Ci0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90Ci0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cwotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgotCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCi0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCi0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgotCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5Ci0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5Ci0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KLQotICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0KLSAgIEFQUEVORElYOiBIb3cgdG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yay4KLQotICAgICAgVG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yaywgYXR0YWNoIHRoZSBmb2xsb3dpbmcKLSAgICAgIGJvaWxlcnBsYXRlIG5vdGljZSwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzICJbXSIKLSAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCi0gICAgICB0aGUgYnJhY2tldHMhKSAgVGhlIHRleHQgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBhcHByb3ByaWF0ZQotICAgICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhCi0gICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCi0gICAgICBzYW1lICJwcmludGVkIHBhZ2UiIGFzIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciBlYXNpZXIKLSAgICAgIGlkZW50aWZpY2F0aW9uIHdpdGhpbiB0aGlyZC1wYXJ0eSBhcmNoaXZlcy4KLQotICAgQ29weXJpZ2h0IFt5eXl5XSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdCi0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9sZWdhbC9heGlvbS1pbXBsLUxJQ0VOU0UudHh0IGIvdjEuNS4xUkMzL2xlZ2FsL2F4aW9tLWltcGwtTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlZjhjMjkuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL2xlZ2FsL2F4aW9tLWltcGwtTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0DQotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLw0KLQ0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTg0KLQ0KLSAgIDEuIERlZmluaXRpb25zLg0KLQ0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sDQotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuDQotDQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24NCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLA0KLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQ0KLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yDQotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlDQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4NCi0NCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywNCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uDQotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4NCi0NCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbA0KLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQNCi0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sDQotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLg0KLQ0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yDQotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQ0KLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaw0KLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuDQotDQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdA0KLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUNCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zDQotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMNCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4NCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsDQotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4NCi0NCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZw0KLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMNCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkNCi0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyDQotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mDQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiDQotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudA0KLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvDQotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywNCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQ0KLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dA0KLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlDQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iDQotDQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQNCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4NCi0NCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwNCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUNCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLg0KLQ0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLA0KLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLA0KLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlDQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXINCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpDQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UNCi0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQ0KLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsNCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdA0KLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMNCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUNCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuDQotDQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUNCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQNCi0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQ0KLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLQ0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yDQotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kDQotDQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcw0KLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQNCi0NCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MNCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZA0KLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLA0KLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mDQotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQNCi0NCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMNCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdA0KLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQNCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90DQotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQ0KLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZA0KLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yDQotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLA0KLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kDQotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cw0KLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kDQotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uDQotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlDQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZA0KLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQNCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZA0KLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMNCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yDQotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsDQotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoDQotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4NCi0NCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsDQotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrDQotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4NCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5DQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQNCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuDQotDQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQ0KLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwNCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUNCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4NCi0NCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3INCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoDQotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yDQotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMNCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBDQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlDQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55DQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LA0KLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLA0KLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5DQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUNCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsDQotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhDQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQ0KLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwNCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3INCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuDQotDQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZw0KLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsDQotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwNCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcw0KLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5DQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYNCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksDQotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5DQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbg0KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5Lg0KLQ0KLSAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUw0KLQ0KLSAgIEFQUEVORElYOiBIb3cgdG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yay4NCi0NCi0gICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZw0KLSAgICAgIGJvaWxlcnBsYXRlIG5vdGljZSwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzICJbXSINCi0gICAgICByZXBsYWNlZCB3aXRoIHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAoRG9uJ3QgaW5jbHVkZQ0KLSAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlDQotICAgICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhDQotICAgICAgZmlsZSBvciBjbGFzcyBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiBwdXJwb3NlIGJlIGluY2x1ZGVkIG9uIHRoZQ0KLSAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcg0KLSAgICAgIGlkZW50aWZpY2F0aW9uIHdpdGhpbiB0aGlyZC1wYXJ0eSBhcmNoaXZlcy4NCi0NCi0gICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0NCi0NCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCi0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQotICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbGVnYWwvYXhpczItTElDRU5TRS50eHQgYi92MS41LjFSQzMvbGVnYWwvYXhpczItTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3YmM4OGEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL2xlZ2FsL2F4aXMyLUxJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0Ci0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCi0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgotCi0gICAxLiBEZWZpbml0aW9ucy4KLQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgotCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgotCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgotCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0Ci0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCi0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCi0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCi0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50Ci0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKLQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCi0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgotCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0Ci0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KLQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCi0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKLQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKLQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KLQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KLQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5Ci0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgotCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgotCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucwotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5Ci0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCi0KLSAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotCi0gICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCi0KLSAgICAgIFRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmssIGF0dGFjaCB0aGUgZm9sbG93aW5nCi0gICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCi0gICAgICByZXBsYWNlZCB3aXRoIHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAoRG9uJ3QgaW5jbHVkZQotICAgICAgdGhlIGJyYWNrZXRzISkgIFRoZSB0ZXh0IHNob3VsZCBiZSBlbmNsb3NlZCBpbiB0aGUgYXBwcm9wcmlhdGUKLSAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQotICAgICAgZmlsZSBvciBjbGFzcyBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiBwdXJwb3NlIGJlIGluY2x1ZGVkIG9uIHRoZQotICAgICAgc2FtZSAicHJpbnRlZCBwYWdlIiBhcyB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgZWFzaWVyCi0gICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCi0KLSAgIENvcHlyaWdodCBbeXl5eV0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXQotCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbGVnYWwvY29tbW9ucy1jb2RlYy1MSUNFTlNFLnR4dCBiL3YxLjUuMVJDMy9sZWdhbC9jb21tb25zLWNvZGVjLUxJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWY4YzI5Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9sZWdhbC9jb21tb25zLWNvZGVjLUxJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8NCi0NCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04NCi0NCi0gICAxLiBEZWZpbml0aW9ucy4NCi0NCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLA0KLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50Lg0KLQ0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5DQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwNCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uDQotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwNCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUNCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcg0KLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQ0KLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuDQotDQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuDQotDQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsDQotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbg0KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuDQotDQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwNCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0DQotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLA0KLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4NCi0NCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcg0KLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGENCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsNCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLg0KLQ0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QNCi0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlDQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucw0KLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzDQotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluDQotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLA0KLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuDQotDQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcNCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zDQotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5DQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcg0KLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZg0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIg0KLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQNCi0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bw0KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsDQotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUNCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQNCi0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQ0KLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIg0KLQ0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kDQotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuDQotDQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsDQotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlDQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4NCi0NCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwNCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywNCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQ0KLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyDQotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQ0KLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91DQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGENCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrDQotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QNCi0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzDQotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlDQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLg0KLQ0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlDQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0DQotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UNCi0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCi0NCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcg0KLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZA0KLQ0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMNCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kDQotDQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzDQotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQNCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywNCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZg0KLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kDQotDQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzDQotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QNCi0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkDQotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdA0KLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUNCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQNCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcg0KLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwNCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZA0KLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMNCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZA0KLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbg0KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQ0KLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQNCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkDQotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQNCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zDQotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcg0KLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLA0KLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aA0KLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuDQotDQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLA0KLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaw0KLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuDQotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQ0KLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkDQotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLg0KLQ0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUNCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsDQotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlDQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuDQotDQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yDQotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaA0KLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcg0KLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zDQotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQ0KLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQ0KLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQ0KLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4NCi0NCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwNCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwNCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQ0KLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlDQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLA0KLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQ0KLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUNCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsDQotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwNCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yDQotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLg0KLQ0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcNCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLA0KLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksDQotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMNCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQ0KLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmDQotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LA0KLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQ0KLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24NCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4NCi0NCi0gICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMNCi0NCi0gICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuDQotDQotICAgICAgVG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yaywgYXR0YWNoIHRoZSBmb2xsb3dpbmcNCi0gICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iDQotICAgICAgcmVwbGFjZWQgd2l0aCB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gKERvbid0IGluY2x1ZGUNCi0gICAgICB0aGUgYnJhY2tldHMhKSAgVGhlIHRleHQgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBhcHByb3ByaWF0ZQ0KLSAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQ0KLSAgICAgIGZpbGUgb3IgY2xhc3MgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgcHVycG9zZSBiZSBpbmNsdWRlZCBvbiB0aGUNCi0gICAgICBzYW1lICJwcmludGVkIHBhZ2UiIGFzIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciBlYXNpZXINCi0gICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuDQotDQotICAgQ29weXJpZ2h0IFt5eXl5XSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdDQotDQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL2xlZ2FsL2NvbW1vbnMtZmlsZXVwbG9hZC1MSUNFTlNFLnR4dCBiL3YxLjUuMVJDMy9sZWdhbC9jb21tb25zLWZpbGV1cGxvYWQtTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlZjhjMjkuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL2xlZ2FsL2NvbW1vbnMtZmlsZXVwbG9hZC1MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQNCi0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvDQotDQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9ODQotDQotICAgMS4gRGVmaW5pdGlvbnMuDQotDQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwNCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4NCi0NCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQ0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsDQotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbg0KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sDQotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlDQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3INCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUNCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5Lg0KLQ0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLA0KLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24NCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLg0KLQ0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsDQotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dA0KLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwNCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuDQotDQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3INCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhDQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrDQotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4NCi0NCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0DQotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQ0KLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMNCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3Nlcw0KLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbg0KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwNCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLg0KLQ0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nDQotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucw0KLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQ0KLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXINCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCINCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50DQotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8NCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLA0KLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlDQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0DQotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UNCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiINCi0NCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZA0KLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLg0KLQ0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLA0KLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQ0KLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uDQotDQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsDQotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssDQotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUNCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcg0KLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykNCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQ0KLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhDQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaw0KLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0DQotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcw0KLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQ0KLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4NCi0NCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQ0KLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dA0KLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91DQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQotDQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3INCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQNCi0NCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzDQotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZA0KLQ0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3Jrcw0KLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kDQotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssDQotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YNCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZA0KLQ0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cw0KLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0DQotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZA0KLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QNCi0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lDQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkDQotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3INCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsDQotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQNCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzDQotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQNCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24NCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUNCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkDQotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZA0KLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kDQotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3INCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwNCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgNCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwNCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsNCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLg0KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkNCi0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZA0KLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4NCi0NCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlDQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLA0KLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQ0KLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLg0KLQ0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcg0KLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gNCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3INCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucw0KLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEENCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUNCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkNCi0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuDQotDQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksDQotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsDQotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkNCi0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQ0KLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwNCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGENCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlDQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLA0KLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsDQotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcg0KLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4NCi0NCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nDQotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwNCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LA0KLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzDQotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkNCi0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZg0KLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwNCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkNCi0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uDQotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuDQotDQotICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TDQotDQotICAgQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLg0KLQ0KLSAgICAgIFRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmssIGF0dGFjaCB0aGUgZm9sbG93aW5nDQotICAgICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIg0KLSAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlDQotICAgICAgdGhlIGJyYWNrZXRzISkgIFRoZSB0ZXh0IHNob3VsZCBiZSBlbmNsb3NlZCBpbiB0aGUgYXBwcm9wcmlhdGUNCi0gICAgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGENCi0gICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlDQotICAgICAgc2FtZSAicHJpbnRlZCBwYWdlIiBhcyB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgZWFzaWVyDQotICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLg0KLQ0KLSAgIENvcHlyaWdodCBbeXl5eV0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXQ0KLQ0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9sZWdhbC9jb21tb25zLWh0dHBjbGllbnQtTElDRU5TRS50eHQgYi92MS41LjFSQzMvbGVnYWwvY29tbW9ucy1odHRwY2xpZW50LUxJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWY4YzI5Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9sZWdhbC9jb21tb25zLWh0dHBjbGllbnQtTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0DQotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLw0KLQ0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTg0KLQ0KLSAgIDEuIERlZmluaXRpb25zLg0KLQ0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sDQotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuDQotDQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24NCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLA0KLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQ0KLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yDQotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlDQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4NCi0NCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywNCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uDQotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4NCi0NCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbA0KLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQNCi0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sDQotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLg0KLQ0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yDQotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQ0KLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaw0KLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuDQotDQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdA0KLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUNCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zDQotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMNCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4NCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsDQotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4NCi0NCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZw0KLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMNCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkNCi0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyDQotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mDQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiDQotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudA0KLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvDQotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywNCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQ0KLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dA0KLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlDQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iDQotDQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQNCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4NCi0NCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwNCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUNCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLg0KLQ0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLA0KLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLA0KLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlDQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXINCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpDQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UNCi0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQ0KLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsNCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdA0KLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMNCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUNCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuDQotDQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUNCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQNCi0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQ0KLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLQ0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yDQotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kDQotDQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcw0KLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQNCi0NCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MNCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZA0KLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLA0KLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mDQotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQNCi0NCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMNCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdA0KLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQNCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90DQotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQ0KLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZA0KLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yDQotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLA0KLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kDQotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cw0KLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kDQotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uDQotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlDQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZA0KLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQNCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZA0KLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMNCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yDQotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsDQotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoDQotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4NCi0NCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsDQotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrDQotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4NCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5DQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQNCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuDQotDQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQ0KLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwNCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUNCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4NCi0NCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3INCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoDQotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yDQotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMNCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBDQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlDQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55DQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LA0KLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLA0KLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5DQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUNCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsDQotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhDQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQ0KLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwNCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3INCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuDQotDQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZw0KLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsDQotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwNCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcw0KLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5DQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYNCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksDQotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5DQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbg0KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5Lg0KLQ0KLSAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUw0KLQ0KLSAgIEFQUEVORElYOiBIb3cgdG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yay4NCi0NCi0gICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZw0KLSAgICAgIGJvaWxlcnBsYXRlIG5vdGljZSwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzICJbXSINCi0gICAgICByZXBsYWNlZCB3aXRoIHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAoRG9uJ3QgaW5jbHVkZQ0KLSAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlDQotICAgICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhDQotICAgICAgZmlsZSBvciBjbGFzcyBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiBwdXJwb3NlIGJlIGluY2x1ZGVkIG9uIHRoZQ0KLSAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcg0KLSAgICAgIGlkZW50aWZpY2F0aW9uIHdpdGhpbiB0aGlyZC1wYXJ0eSBhcmNoaXZlcy4NCi0NCi0gICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0NCi0NCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCi0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQotICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbGVnYWwvY29tbW9ucy1pby1MSUNFTlNFLnR4dCBiL3YxLjUuMVJDMy9sZWdhbC9jb21tb25zLWlvLUxJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjBiMTI3Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9sZWdhbC9jb21tb25zLWlvLUxJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMjAzICswLDAgQEAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KLQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCi0KLSAgIDEuIERlZmluaXRpb25zLgotCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5Ci0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCi0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCi0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KLQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KLQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yawotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KLQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucwotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KLQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgotCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KLQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCi0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91Ci0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgotCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0Ci0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKLQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAotCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAotCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0Ci0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90Ci0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cwotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgotCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCi0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCi0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgotCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5Ci0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5Ci0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KLQotICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0KLSAgIEFQUEVORElYOiBIb3cgdG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yay4KLQotICAgICAgVG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yaywgYXR0YWNoIHRoZSBmb2xsb3dpbmcKLSAgICAgIGJvaWxlcnBsYXRlIG5vdGljZSwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzICJbXSIKLSAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCi0gICAgICB0aGUgYnJhY2tldHMhKSAgVGhlIHRleHQgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBhcHByb3ByaWF0ZQotICAgICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhCi0gICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCi0gICAgICBzYW1lICJwcmludGVkIHBhZ2UiIGFzIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciBlYXNpZXIKLSAgICAgIGlkZW50aWZpY2F0aW9uIHdpdGhpbiB0aGlyZC1wYXJ0eSBhcmNoaXZlcy4KLQotICAgQ29weXJpZ2h0IFt5eXl5XSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdCi0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9sZWdhbC9jb21tb25zLWxvZ2dpbmctTElDRU5TRS50eHQgYi92MS41LjFSQzMvbGVnYWwvY29tbW9ucy1sb2dnaW5nLUxJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjBiMTI3Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9sZWdhbC9jb21tb25zLWxvZ2dpbmctTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyMDMgKzAsMCBAQAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgotCi0gICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQotICAgQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLgotCi0gICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwotICAgICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIgotICAgICAgcmVwbGFjZWQgd2l0aCB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gKERvbid0IGluY2x1ZGUKLSAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCi0gICAgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGEKLSAgICAgIGZpbGUgb3IgY2xhc3MgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgcHVycG9zZSBiZSBpbmNsdWRlZCBvbiB0aGUKLSAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgotICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLgotCi0gICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KLQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL2xlZ2FsL2dlcm9uaW1vLWFubm90YXRpb24tTElDRU5TRS50eHQgYi92MS41LjFSQzMvbGVnYWwvZ2Vyb25pbW8tYW5ub3RhdGlvbi1MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdiYzg4YS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbGVnYWwvZ2Vyb25pbW8tYW5ub3RhdGlvbi1MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgotCi0gICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQotICAgQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLgotCi0gICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwotICAgICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIgotICAgICAgcmVwbGFjZWQgd2l0aCB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gKERvbid0IGluY2x1ZGUKLSAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCi0gICAgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGEKLSAgICAgIGZpbGUgb3IgY2xhc3MgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgcHVycG9zZSBiZSBpbmNsdWRlZCBvbiB0aGUKLSAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgotICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLgotCi0gICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KLQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL2xlZ2FsL2dlcm9uaW1vLWpheHdzLUxJQ0VOU0UudHh0IGIvdjEuNS4xUkMzL2xlZ2FsL2dlcm9uaW1vLWpheHdzLUxJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjQ1Njk1Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9sZWdhbC9nZXJvbmltby1qYXh3cy1MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0Ci0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCi0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgotCi0gICAxLiBEZWZpbml0aW9ucy4KLQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgotCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgotCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgotCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0Ci0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCi0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCi0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCi0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50Ci0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKLQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCi0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgotCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0Ci0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KLQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCi0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKLQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKLQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KLQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KLQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5Ci0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgotCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgotCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucwotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5Ci0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCi0KLSAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotCi0gICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCi0KLSAgICAgIFRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmssIGF0dGFjaCB0aGUgZm9sbG93aW5nCi0gICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCi0gICAgICByZXBsYWNlZCB3aXRoIHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAoRG9uJ3QgaW5jbHVkZQotICAgICAgdGhlIGJyYWNrZXRzISkgIFRoZSB0ZXh0IHNob3VsZCBiZSBlbmNsb3NlZCBpbiB0aGUgYXBwcm9wcmlhdGUKLSAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQotICAgICAgZmlsZSBvciBjbGFzcyBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiBwdXJwb3NlIGJlIGluY2x1ZGVkIG9uIHRoZQotICAgICAgc2FtZSAicHJpbnRlZCBwYWdlIiBhcyB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgZWFzaWVyCi0gICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCi0KLSAgIENvcHlyaWdodCBbeXl5eV0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXQotCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL2xlZ2FsL2dlcm9uaW1vLXNhYWotTElDRU5TRS50eHQgYi92MS41LjFSQzMvbGVnYWwvZ2Vyb25pbW8tc2Fhai1MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmIwYjEyNy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbGVnYWwvZ2Vyb25pbW8tc2Fhai1MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDIwMyArMCwwIEBACi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0Ci0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCi0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgotCi0gICAxLiBEZWZpbml0aW9ucy4KLQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgotCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgotCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgotCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0Ci0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCi0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCi0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCi0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50Ci0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKLQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCi0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgotCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0Ci0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KLQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCi0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKLQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKLQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KLQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KLQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5Ci0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgotCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgotCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucwotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5Ci0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCi0KLSAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotCi0gICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCi0KLSAgICAgIFRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmssIGF0dGFjaCB0aGUgZm9sbG93aW5nCi0gICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCi0gICAgICByZXBsYWNlZCB3aXRoIHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAoRG9uJ3QgaW5jbHVkZQotICAgICAgdGhlIGJyYWNrZXRzISkgIFRoZSB0ZXh0IHNob3VsZCBiZSBlbmNsb3NlZCBpbiB0aGUgYXBwcm9wcmlhdGUKLSAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQotICAgICAgZmlsZSBvciBjbGFzcyBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiBwdXJwb3NlIGJlIGluY2x1ZGVkIG9uIHRoZQotICAgICAgc2FtZSAicHJpbnRlZCBwYWdlIiBhcyB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgZWFzaWVyCi0gICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCi0KLSAgIENvcHlyaWdodCBbeXl5eV0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXQotCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbGVnYWwvZ2Vyb25pbW8tc3RheC1hcGktTElDRU5TRS50eHQgYi92MS41LjFSQzMvbGVnYWwvZ2Vyb25pbW8tc3RheC1hcGktTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiMGIxMjcuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL2xlZ2FsL2dlcm9uaW1vLXN0YXgtYXBpLUxJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMjAzICswLDAgQEAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KLQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCi0KLSAgIDEuIERlZmluaXRpb25zLgotCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5Ci0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCi0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCi0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KLQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KLQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yawotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KLQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucwotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KLQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgotCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KLQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCi0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91Ci0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgotCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0Ci0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKLQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAotCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAotCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0Ci0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90Ci0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cwotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgotCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCi0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCi0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgotCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5Ci0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5Ci0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KLQotICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0KLSAgIEFQUEVORElYOiBIb3cgdG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yay4KLQotICAgICAgVG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yaywgYXR0YWNoIHRoZSBmb2xsb3dpbmcKLSAgICAgIGJvaWxlcnBsYXRlIG5vdGljZSwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzICJbXSIKLSAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCi0gICAgICB0aGUgYnJhY2tldHMhKSAgVGhlIHRleHQgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBhcHByb3ByaWF0ZQotICAgICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhCi0gICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCi0gICAgICBzYW1lICJwcmludGVkIHBhZ2UiIGFzIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciBlYXNpZXIKLSAgICAgIGlkZW50aWZpY2F0aW9uIHdpdGhpbiB0aGlyZC1wYXJ0eSBhcmNoaXZlcy4KLQotICAgQ29weXJpZ2h0IFt5eXl5XSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdCi0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9sZWdhbC9nZXJvbmltby13cy1tZXRhZGF0YS1MSUNFTlNFLnR4dCBiL3YxLjUuMVJDMy9sZWdhbC9nZXJvbmltby13cy1tZXRhZGF0YS1MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmIwYjEyNy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbGVnYWwvZ2Vyb25pbW8td3MtbWV0YWRhdGEtTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyMDMgKzAsMCBAQAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgotCi0gICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQotICAgQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLgotCi0gICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwotICAgICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIgotICAgICAgcmVwbGFjZWQgd2l0aCB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gKERvbid0IGluY2x1ZGUKLSAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCi0gICAgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGEKLSAgICAgIGZpbGUgb3IgY2xhc3MgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgcHVycG9zZSBiZSBpbmNsdWRlZCBvbiB0aGUKLSAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgotICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLgotCi0gICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KLQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL2xlZ2FsL2h0dHBjb3JlLUxJQ0VOU0UudHh0IGIvdjEuNS4xUkMzL2xlZ2FsL2h0dHBjb3JlLUxJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWY4YzI5Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9sZWdhbC9odHRwY29yZS1MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQNCi0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvDQotDQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9ODQotDQotICAgMS4gRGVmaW5pdGlvbnMuDQotDQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwNCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4NCi0NCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQ0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsDQotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbg0KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sDQotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlDQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3INCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUNCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5Lg0KLQ0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLA0KLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24NCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLg0KLQ0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsDQotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dA0KLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwNCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuDQotDQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3INCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhDQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrDQotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4NCi0NCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0DQotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQ0KLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMNCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3Nlcw0KLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbg0KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwNCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLg0KLQ0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nDQotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucw0KLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQ0KLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXINCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCINCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50DQotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8NCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLA0KLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlDQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0DQotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UNCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiINCi0NCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZA0KLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLg0KLQ0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLA0KLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQ0KLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uDQotDQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsDQotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssDQotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUNCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcg0KLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykNCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQ0KLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhDQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaw0KLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0DQotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcw0KLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQ0KLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4NCi0NCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQ0KLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dA0KLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91DQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQotDQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3INCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQNCi0NCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzDQotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZA0KLQ0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3Jrcw0KLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kDQotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssDQotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YNCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZA0KLQ0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cw0KLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0DQotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZA0KLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QNCi0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lDQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkDQotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3INCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsDQotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQNCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzDQotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQNCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24NCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUNCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkDQotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZA0KLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kDQotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3INCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwNCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgNCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwNCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsNCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLg0KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkNCi0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZA0KLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4NCi0NCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlDQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLA0KLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQ0KLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLg0KLQ0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcg0KLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gNCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3INCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucw0KLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEENCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUNCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkNCi0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuDQotDQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksDQotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsDQotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkNCi0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQ0KLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwNCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGENCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlDQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLA0KLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsDQotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcg0KLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4NCi0NCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nDQotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwNCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LA0KLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzDQotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkNCi0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZg0KLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwNCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkNCi0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uDQotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuDQotDQotICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TDQotDQotICAgQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLg0KLQ0KLSAgICAgIFRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmssIGF0dGFjaCB0aGUgZm9sbG93aW5nDQotICAgICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIg0KLSAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlDQotICAgICAgdGhlIGJyYWNrZXRzISkgIFRoZSB0ZXh0IHNob3VsZCBiZSBlbmNsb3NlZCBpbiB0aGUgYXBwcm9wcmlhdGUNCi0gICAgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGENCi0gICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlDQotICAgICAgc2FtZSAicHJpbnRlZCBwYWdlIiBhcyB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgZWFzaWVyDQotICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLg0KLQ0KLSAgIENvcHlyaWdodCBbeXl5eV0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXQ0KLQ0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9sZWdhbC9qYWxvcHktTElDRU5TRS50eHQgYi92MS41LjFSQzMvbGVnYWwvamFsb3B5LUxJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWM3ODg4Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9sZWdhbC9qYWxvcHktTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiCi0gICAgICBlbmNvZGluZz0iaXNvLTg4NTktMSIgPz4KLQotPCEtLSAkSWQkIC0tPgotCi08dGl0bGU+VGhlIEphbG9weSBCU0QgTGljZW5zZTwvdGl0bGU+Ci0KLTxpbmRleHRlcm0+PHByaW1hcnk+U29mdHdhcmUgTGljZW5zZTwvcHJpbWFyeT48L2luZGV4dGVybT4KLTxpbmRleHRlcm0+PHByaW1hcnk+TGljZW5zZXM8L3ByaW1hcnk+PHNlY29uZGFyeT5CU0Q8L3NlY29uZGFyeT48L2luZGV4dGVybT4KLQotPHBhcmE+Ci1Db3B5cmlnaHQgKGMpIDIwMDEtMjAwNCwgTWFyY28gSHVuc2lja2VyLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotPC9wYXJhPgotCi08cGFyYT4KLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi1hcmUgbWV0OgotPC9wYXJhPgotCi08aXRlbWl6ZWRsaXN0PgotPGxpc3RpdGVtPgotPHBhcmE+Ci1SZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi08L3BhcmE+Ci08L2xpc3RpdGVtPgotCi08bGlzdGl0ZW0+Ci08cGFyYT4KLVJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLTwvcGFyYT4KLTwvbGlzdGl0ZW0+Ci0KLTxsaXN0aXRlbT4KLTxwYXJhPgotTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgSmFsb3B5IEdyb3VwIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi08L3BhcmE+Ci08L2xpc3RpdGVtPgotPC9pdGVtaXplZGxpc3Q+Ci0KLTxwYXJhPgotVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi08L3BhcmE+IApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9sZWdhbC9qYXhiLWFwaS1MSUNFTlNFLnR4dCBiL3YxLjUuMVJDMy9sZWdhbC9qYXhiLWFwaS1MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdkZWJmOC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbGVnYWwvamF4Yi1hcGktTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwzODQgKzAsMCBAQAotQ09NTU9OIERFVkVMT1BNRU5UIEFORCBESVNUUklCVVRJT04gTElDRU5TRSAoQ0RETCkgVmVyc2lvbiAxLjANCi0NCi0NCi0gICAgICAxLiBEZWZpbml0aW9ucy4NCi0NCi0gICAgICAgICAgICAxLjEuICJDb250cmlidXRvciIgbWVhbnMgZWFjaCBpbmRpdmlkdWFsIG9yIGVudGl0eSB0aGF0DQotICAgICAgICAgICAgY3JlYXRlcyBvciBjb250cmlidXRlcyB0byB0aGUgY3JlYXRpb24gb2YgTW9kaWZpY2F0aW9ucy4NCi0NCi0gICAgICAgICAgICAxLjIuICJDb250cmlidXRvciBWZXJzaW9uIiBtZWFucyB0aGUgY29tYmluYXRpb24gb2YgdGhlDQotICAgICAgICAgICAgT3JpZ2luYWwgU29mdHdhcmUsIHByaW9yIE1vZGlmaWNhdGlvbnMgdXNlZCBieSBhDQotICAgICAgICAgICAgQ29udHJpYnV0b3IgKGlmIGFueSksIGFuZCB0aGUgTW9kaWZpY2F0aW9ucyBtYWRlIGJ5IHRoYXQNCi0gICAgICAgICAgICBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLg0KLQ0KLSAgICAgICAgICAgIDEuMy4gIkNvdmVyZWQgU29mdHdhcmUiIG1lYW5zIChhKSB0aGUgT3JpZ2luYWwgU29mdHdhcmUsIG9yDQotICAgICAgICAgICAgKGIpIE1vZGlmaWNhdGlvbnMsIG9yIChjKSB0aGUgY29tYmluYXRpb24gb2YgZmlsZXMNCi0gICAgICAgICAgICBjb250YWluaW5nIE9yaWdpbmFsIFNvZnR3YXJlIHdpdGggZmlsZXMgY29udGFpbmluZw0KLSAgICAgICAgICAgIE1vZGlmaWNhdGlvbnMsIGluIGVhY2ggY2FzZSBpbmNsdWRpbmcgcG9ydGlvbnMgdGhlcmVvZi4NCi0NCi0gICAgICAgICAgICAxLjQuICJFeGVjdXRhYmxlIiBtZWFucyB0aGUgQ292ZXJlZCBTb2Z0d2FyZSBpbiBhbnkgZm9ybQ0KLSAgICAgICAgICAgIG90aGVyIHRoYW4gU291cmNlIENvZGUuIA0KLQ0KLSAgICAgICAgICAgIDEuNS4gIkluaXRpYWwgRGV2ZWxvcGVyIiBtZWFucyB0aGUgaW5kaXZpZHVhbCBvciBlbnRpdHkNCi0gICAgICAgICAgICB0aGF0IGZpcnN0IG1ha2VzIE9yaWdpbmFsIFNvZnR3YXJlIGF2YWlsYWJsZSB1bmRlciB0aGlzDQotICAgICAgICAgICAgTGljZW5zZS4gDQotICAgICAgICAgICAgDQotICAgICAgICAgICAgMS42LiAiTGFyZ2VyIFdvcmsiIG1lYW5zIGEgd29yayB3aGljaCBjb21iaW5lcyBDb3ZlcmVkDQotICAgICAgICAgICAgU29mdHdhcmUgb3IgcG9ydGlvbnMgdGhlcmVvZiB3aXRoIGNvZGUgbm90IGdvdmVybmVkIGJ5IHRoZQ0KLSAgICAgICAgICAgIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAgICAgICAxLjcuICJMaWNlbnNlIiBtZWFucyB0aGlzIGRvY3VtZW50Lg0KLQ0KLSAgICAgICAgICAgIDEuOC4gIkxpY2Vuc2FibGUiIG1lYW5zIGhhdmluZyB0aGUgcmlnaHQgdG8gZ3JhbnQsIHRvIHRoZQ0KLSAgICAgICAgICAgIG1heGltdW0gZXh0ZW50IHBvc3NpYmxlLCB3aGV0aGVyIGF0IHRoZSB0aW1lIG9mIHRoZSBpbml0aWFsDQotICAgICAgICAgICAgZ3JhbnQgb3Igc3Vic2VxdWVudGx5IGFjcXVpcmVkLCBhbnkgYW5kIGFsbCBvZiB0aGUgcmlnaHRzDQotICAgICAgICAgICAgY29udmV5ZWQgaGVyZWluLg0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIDEuOS4gIk1vZGlmaWNhdGlvbnMiIG1lYW5zIHRoZSBTb3VyY2UgQ29kZSBhbmQgRXhlY3V0YWJsZQ0KLSAgICAgICAgICAgIGZvcm0gb2YgYW55IG9mIHRoZSBmb2xsb3dpbmc6IA0KLQ0KLSAgICAgICAgICAgICAgICAgIEEuIEFueSBmaWxlIHRoYXQgcmVzdWx0cyBmcm9tIGFuIGFkZGl0aW9uIHRvLA0KLSAgICAgICAgICAgICAgICAgIGRlbGV0aW9uIGZyb20gb3IgbW9kaWZpY2F0aW9uIG9mIHRoZSBjb250ZW50cyBvZiBhDQotICAgICAgICAgICAgICAgICAgZmlsZSBjb250YWluaW5nIE9yaWdpbmFsIFNvZnR3YXJlIG9yIHByZXZpb3VzDQotICAgICAgICAgICAgICAgICAgTW9kaWZpY2F0aW9uczsgDQotDQotICAgICAgICAgICAgICAgICAgQi4gQW55IG5ldyBmaWxlIHRoYXQgY29udGFpbnMgYW55IHBhcnQgb2YgdGhlDQotICAgICAgICAgICAgICAgICAgT3JpZ2luYWwgU29mdHdhcmUgb3IgcHJldmlvdXMgTW9kaWZpY2F0aW9uOyBvciANCi0NCi0gICAgICAgICAgICAgICAgICBDLiBBbnkgbmV3IGZpbGUgdGhhdCBpcyBjb250cmlidXRlZCBvciBvdGhlcndpc2UgbWFkZQ0KLSAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgICAgICAgICAgIDEuMTAuICJPcmlnaW5hbCBTb2Z0d2FyZSIgbWVhbnMgdGhlIFNvdXJjZSBDb2RlIGFuZA0KLSAgICAgICAgICAgIEV4ZWN1dGFibGUgZm9ybSBvZiBjb21wdXRlciBzb2Z0d2FyZSBjb2RlIHRoYXQgaXMNCi0gICAgICAgICAgICBvcmlnaW5hbGx5IHJlbGVhc2VkIHVuZGVyIHRoaXMgTGljZW5zZS4gDQotDQotICAgICAgICAgICAgMS4xMS4gIlBhdGVudCBDbGFpbXMiIG1lYW5zIGFueSBwYXRlbnQgY2xhaW0ocyksIG5vdyBvd25lZA0KLSAgICAgICAgICAgIG9yIGhlcmVhZnRlciBhY3F1aXJlZCwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiwNCi0gICAgICAgICAgICBtZXRob2QsIHByb2Nlc3MsIGFuZCBhcHBhcmF0dXMgY2xhaW1zLCBpbiBhbnkgcGF0ZW50DQotICAgICAgICAgICAgTGljZW5zYWJsZSBieSBncmFudG9yLiANCi0NCi0gICAgICAgICAgICAxLjEyLiAiU291cmNlIENvZGUiIG1lYW5zIChhKSB0aGUgY29tbW9uIGZvcm0gb2YgY29tcHV0ZXINCi0gICAgICAgICAgICBzb2Z0d2FyZSBjb2RlIGluIHdoaWNoIG1vZGlmaWNhdGlvbnMgYXJlIG1hZGUgYW5kIChiKQ0KLSAgICAgICAgICAgIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCBpbiBvciB3aXRoIHN1Y2ggY29kZS4NCi0NCi0gICAgICAgICAgICAxLjEzLiAiWW91IiAob3IgIllvdXIiKSBtZWFucyBhbiBpbmRpdmlkdWFsIG9yIGEgbGVnYWwNCi0gICAgICAgICAgICBlbnRpdHkgZXhlcmNpc2luZyByaWdodHMgdW5kZXIsIGFuZCBjb21wbHlpbmcgd2l0aCBhbGwgb2YNCi0gICAgICAgICAgICB0aGUgdGVybXMgb2YsIHRoaXMgTGljZW5zZS4gRm9yIGxlZ2FsIGVudGl0aWVzLCAiWW91Ig0KLSAgICAgICAgICAgIGluY2x1ZGVzIGFueSBlbnRpdHkgd2hpY2ggY29udHJvbHMsIGlzIGNvbnRyb2xsZWQgYnksIG9yIGlzDQotICAgICAgICAgICAgdW5kZXIgY29tbW9uIGNvbnRyb2wgd2l0aCBZb3UuIEZvciBwdXJwb3NlcyBvZiB0aGlzDQotICAgICAgICAgICAgZGVmaW5pdGlvbiwgImNvbnRyb2wiIG1lYW5zIChhKSB0aGUgcG93ZXIsIGRpcmVjdCBvcg0KLSAgICAgICAgICAgIGluZGlyZWN0LCB0byBjYXVzZSB0aGUgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaA0KLSAgICAgICAgICAgIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvciBvdGhlcndpc2UsIG9yIChiKSBvd25lcnNoaXANCi0gICAgICAgICAgICBvZiBtb3JlIHRoYW4gZmlmdHkgcGVyY2VudCAoNTAlKSBvZiB0aGUgb3V0c3RhbmRpbmcgc2hhcmVzDQotICAgICAgICAgICAgb3IgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuDQotDQotICAgICAgMi4gTGljZW5zZSBHcmFudHMuIA0KLQ0KLSAgICAgICAgICAgIDIuMS4gVGhlIEluaXRpYWwgRGV2ZWxvcGVyIEdyYW50Lg0KLQ0KLSAgICAgICAgICAgIENvbmRpdGlvbmVkIHVwb24gWW91ciBjb21wbGlhbmNlIHdpdGggU2VjdGlvbiAzLjEgYmVsb3cgYW5kDQotICAgICAgICAgICAgc3ViamVjdCB0byB0aGlyZCBwYXJ0eSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgY2xhaW1zLCB0aGUNCi0gICAgICAgICAgICBJbml0aWFsIERldmVsb3BlciBoZXJlYnkgZ3JhbnRzIFlvdSBhIHdvcmxkLXdpZGUsDQotICAgICAgICAgICAgcm95YWx0eS1mcmVlLCBub24tZXhjbHVzaXZlIGxpY2Vuc2U6IA0KLQ0KLSAgICAgICAgICAgICAgICAgIChhKSB1bmRlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIChvdGhlciB0aGFuDQotICAgICAgICAgICAgICAgICAgcGF0ZW50IG9yIHRyYWRlbWFyaykgTGljZW5zYWJsZSBieSBJbml0aWFsIERldmVsb3BlciwNCi0gICAgICAgICAgICAgICAgICB0byB1c2UsIHJlcHJvZHVjZSwgbW9kaWZ5LCBkaXNwbGF5LCBwZXJmb3JtLA0KLSAgICAgICAgICAgICAgICAgIHN1YmxpY2Vuc2UgYW5kIGRpc3RyaWJ1dGUgdGhlIE9yaWdpbmFsIFNvZnR3YXJlIChvcg0KLSAgICAgICAgICAgICAgICAgIHBvcnRpb25zIHRoZXJlb2YpLCB3aXRoIG9yIHdpdGhvdXQgTW9kaWZpY2F0aW9ucywNCi0gICAgICAgICAgICAgICAgICBhbmQvb3IgYXMgcGFydCBvZiBhIExhcmdlciBXb3JrOyBhbmQgDQotDQotICAgICAgICAgICAgICAgICAgKGIpIHVuZGVyIFBhdGVudCBDbGFpbXMgaW5mcmluZ2VkIGJ5IHRoZSBtYWtpbmcsDQotICAgICAgICAgICAgICAgICAgdXNpbmcgb3Igc2VsbGluZyBvZiBPcmlnaW5hbCBTb2Z0d2FyZSwgdG8gbWFrZSwgaGF2ZQ0KLSAgICAgICAgICAgICAgICAgIG1hZGUsIHVzZSwgcHJhY3RpY2UsIHNlbGwsIGFuZCBvZmZlciBmb3Igc2FsZSwgYW5kL29yDQotICAgICAgICAgICAgICAgICAgb3RoZXJ3aXNlIGRpc3Bvc2Ugb2YgdGhlIE9yaWdpbmFsIFNvZnR3YXJlIChvcg0KLSAgICAgICAgICAgICAgICAgIHBvcnRpb25zIHRoZXJlb2YpLiANCi0NCi0gICAgICAgICAgICAgICAgICAoYykgVGhlIGxpY2Vuc2VzIGdyYW50ZWQgaW4gU2VjdGlvbnMgMi4xKGEpIGFuZCAoYikNCi0gICAgICAgICAgICAgICAgICBhcmUgZWZmZWN0aXZlIG9uIHRoZSBkYXRlIEluaXRpYWwgRGV2ZWxvcGVyIGZpcnN0DQotICAgICAgICAgICAgICAgICAgZGlzdHJpYnV0ZXMgb3Igb3RoZXJ3aXNlIG1ha2VzIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZQ0KLSAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZSB0byBhIHRoaXJkIHBhcnR5IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzDQotICAgICAgICAgICAgICAgICAgTGljZW5zZS4gDQotDQotICAgICAgICAgICAgICAgICAgKGQpIE5vdHdpdGhzdGFuZGluZyBTZWN0aW9uIDIuMShiKSBhYm92ZSwgbm8gcGF0ZW50DQotICAgICAgICAgICAgICAgICAgbGljZW5zZSBpcyBncmFudGVkOiAoMSkgZm9yIGNvZGUgdGhhdCBZb3UgZGVsZXRlIGZyb20NCi0gICAgICAgICAgICAgICAgICB0aGUgT3JpZ2luYWwgU29mdHdhcmUsIG9yICgyKSBmb3IgaW5mcmluZ2VtZW50cw0KLSAgICAgICAgICAgICAgICAgIGNhdXNlZCBieTogKGkpIHRoZSBtb2RpZmljYXRpb24gb2YgdGhlIE9yaWdpbmFsDQotICAgICAgICAgICAgICAgICAgU29mdHdhcmUsIG9yIChpaSkgdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSBPcmlnaW5hbA0KLSAgICAgICAgICAgICAgICAgIFNvZnR3YXJlIHdpdGggb3RoZXIgc29mdHdhcmUgb3IgZGV2aWNlcy4gDQotDQotICAgICAgICAgICAgMi4yLiBDb250cmlidXRvciBHcmFudC4NCi0NCi0gICAgICAgICAgICBDb25kaXRpb25lZCB1cG9uIFlvdXIgY29tcGxpYW5jZSB3aXRoIFNlY3Rpb24gMy4xIGJlbG93IGFuZA0KLSAgICAgICAgICAgIHN1YmplY3QgdG8gdGhpcmQgcGFydHkgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGNsYWltcywgZWFjaA0KLSAgICAgICAgICAgIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgWW91IGEgd29ybGQtd2lkZSwgcm95YWx0eS1mcmVlLA0KLSAgICAgICAgICAgIG5vbi1leGNsdXNpdmUgbGljZW5zZToNCi0NCi0gICAgICAgICAgICAgICAgICAoYSkgdW5kZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyAob3RoZXIgdGhhbg0KLSAgICAgICAgICAgICAgICAgIHBhdGVudCBvciB0cmFkZW1hcmspIExpY2Vuc2FibGUgYnkgQ29udHJpYnV0b3IgdG8NCi0gICAgICAgICAgICAgICAgICB1c2UsIHJlcHJvZHVjZSwgbW9kaWZ5LCBkaXNwbGF5LCBwZXJmb3JtLCBzdWJsaWNlbnNlDQotICAgICAgICAgICAgICAgICAgYW5kIGRpc3RyaWJ1dGUgdGhlIE1vZGlmaWNhdGlvbnMgY3JlYXRlZCBieSBzdWNoDQotICAgICAgICAgICAgICAgICAgQ29udHJpYnV0b3IgKG9yIHBvcnRpb25zIHRoZXJlb2YpLCBlaXRoZXIgb24gYW4NCi0gICAgICAgICAgICAgICAgICB1bm1vZGlmaWVkIGJhc2lzLCB3aXRoIG90aGVyIE1vZGlmaWNhdGlvbnMsIGFzDQotICAgICAgICAgICAgICAgICAgQ292ZXJlZCBTb2Z0d2FyZSBhbmQvb3IgYXMgcGFydCBvZiBhIExhcmdlciBXb3JrOyBhbmQNCi0gICAgICAgICAgICAgICAgICANCi0NCi0gICAgICAgICAgICAgICAgICAoYikgdW5kZXIgUGF0ZW50IENsYWltcyBpbmZyaW5nZWQgYnkgdGhlIG1ha2luZywNCi0gICAgICAgICAgICAgICAgICB1c2luZywgb3Igc2VsbGluZyBvZiBNb2RpZmljYXRpb25zIG1hZGUgYnkgdGhhdA0KLSAgICAgICAgICAgICAgICAgIENvbnRyaWJ1dG9yIGVpdGhlciBhbG9uZSBhbmQvb3IgaW4gY29tYmluYXRpb24gd2l0aA0KLSAgICAgICAgICAgICAgICAgIGl0cyBDb250cmlidXRvciBWZXJzaW9uIChvciBwb3J0aW9ucyBvZiBzdWNoDQotICAgICAgICAgICAgICAgICAgY29tYmluYXRpb24pLCB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIGZvciBzYWxlLA0KLSAgICAgICAgICAgICAgICAgIGhhdmUgbWFkZSwgYW5kL29yIG90aGVyd2lzZSBkaXNwb3NlIG9mOiAoMSkNCi0gICAgICAgICAgICAgICAgICBNb2RpZmljYXRpb25zIG1hZGUgYnkgdGhhdCBDb250cmlidXRvciAob3IgcG9ydGlvbnMNCi0gICAgICAgICAgICAgICAgICB0aGVyZW9mKTsgYW5kICgyKSB0aGUgY29tYmluYXRpb24gb2YgTW9kaWZpY2F0aW9ucw0KLSAgICAgICAgICAgICAgICAgIG1hZGUgYnkgdGhhdCBDb250cmlidXRvciB3aXRoIGl0cyBDb250cmlidXRvciBWZXJzaW9uDQotICAgICAgICAgICAgICAgICAgKG9yIHBvcnRpb25zIG9mIHN1Y2ggY29tYmluYXRpb24pLiANCi0NCi0gICAgICAgICAgICAgICAgICAoYykgVGhlIGxpY2Vuc2VzIGdyYW50ZWQgaW4gU2VjdGlvbnMgMi4yKGEpIGFuZA0KLSAgICAgICAgICAgICAgICAgIDIuMihiKSBhcmUgZWZmZWN0aXZlIG9uIHRoZSBkYXRlIENvbnRyaWJ1dG9yIGZpcnN0DQotICAgICAgICAgICAgICAgICAgZGlzdHJpYnV0ZXMgb3Igb3RoZXJ3aXNlIG1ha2VzIHRoZSBNb2RpZmljYXRpb25zDQotICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlIHRvIGEgdGhpcmQgcGFydHkuIA0KLQ0KLSAgICAgICAgICAgICAgICAgIChkKSBOb3R3aXRoc3RhbmRpbmcgU2VjdGlvbiAyLjIoYikgYWJvdmUsIG5vIHBhdGVudA0KLSAgICAgICAgICAgICAgICAgIGxpY2Vuc2UgaXMgZ3JhbnRlZDogKDEpIGZvciBhbnkgY29kZSB0aGF0IENvbnRyaWJ1dG9yDQotICAgICAgICAgICAgICAgICAgaGFzIGRlbGV0ZWQgZnJvbSB0aGUgQ29udHJpYnV0b3IgVmVyc2lvbjsgKDIpIGZvcg0KLSAgICAgICAgICAgICAgICAgIGluZnJpbmdlbWVudHMgY2F1c2VkIGJ5OiAoaSkgdGhpcmQgcGFydHkNCi0gICAgICAgICAgICAgICAgICBtb2RpZmljYXRpb25zIG9mIENvbnRyaWJ1dG9yIFZlcnNpb24sIG9yIChpaSkgdGhlDQotICAgICAgICAgICAgICAgICAgY29tYmluYXRpb24gb2YgTW9kaWZpY2F0aW9ucyBtYWRlIGJ5IHRoYXQgQ29udHJpYnV0b3INCi0gICAgICAgICAgICAgICAgICB3aXRoIG90aGVyIHNvZnR3YXJlIChleGNlcHQgYXMgcGFydCBvZiB0aGUNCi0gICAgICAgICAgICAgICAgICBDb250cmlidXRvciBWZXJzaW9uKSBvciBvdGhlciBkZXZpY2VzOyBvciAoMykgdW5kZXINCi0gICAgICAgICAgICAgICAgICBQYXRlbnQgQ2xhaW1zIGluZnJpbmdlZCBieSBDb3ZlcmVkIFNvZnR3YXJlIGluIHRoZQ0KLSAgICAgICAgICAgICAgICAgIGFic2VuY2Ugb2YgTW9kaWZpY2F0aW9ucyBtYWRlIGJ5IHRoYXQgQ29udHJpYnV0b3IuIA0KLQ0KLSAgICAgIDMuIERpc3RyaWJ1dGlvbiBPYmxpZ2F0aW9ucy4NCi0NCi0gICAgICAgICAgICAzLjEuIEF2YWlsYWJpbGl0eSBvZiBTb3VyY2UgQ29kZS4NCi0NCi0gICAgICAgICAgICBBbnkgQ292ZXJlZCBTb2Z0d2FyZSB0aGF0IFlvdSBkaXN0cmlidXRlIG9yIG90aGVyd2lzZSBtYWtlDQotICAgICAgICAgICAgYXZhaWxhYmxlIGluIEV4ZWN1dGFibGUgZm9ybSBtdXN0IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgaW4NCi0gICAgICAgICAgICBTb3VyY2UgQ29kZSBmb3JtIGFuZCB0aGF0IFNvdXJjZSBDb2RlIGZvcm0gbXVzdCBiZQ0KLSAgICAgICAgICAgIGRpc3RyaWJ1dGVkIG9ubHkgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4gWW91IG11c3QNCi0gICAgICAgICAgICBpbmNsdWRlIGEgY29weSBvZiB0aGlzIExpY2Vuc2Ugd2l0aCBldmVyeSBjb3B5IG9mIHRoZQ0KLSAgICAgICAgICAgIFNvdXJjZSBDb2RlIGZvcm0gb2YgdGhlIENvdmVyZWQgU29mdHdhcmUgWW91IGRpc3RyaWJ1dGUgb3INCi0gICAgICAgICAgICBvdGhlcndpc2UgbWFrZSBhdmFpbGFibGUuIFlvdSBtdXN0IGluZm9ybSByZWNpcGllbnRzIG9mIGFueQ0KLSAgICAgICAgICAgIHN1Y2ggQ292ZXJlZCBTb2Z0d2FyZSBpbiBFeGVjdXRhYmxlIGZvcm0gYXMgdG8gaG93IHRoZXkgY2FuDQotICAgICAgICAgICAgb2J0YWluIHN1Y2ggQ292ZXJlZCBTb2Z0d2FyZSBpbiBTb3VyY2UgQ29kZSBmb3JtIGluIGENCi0gICAgICAgICAgICByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQNCi0gICAgICAgICAgICBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuDQotDQotICAgICAgICAgICAgMy4yLiBNb2RpZmljYXRpb25zLg0KLQ0KLSAgICAgICAgICAgIFRoZSBNb2RpZmljYXRpb25zIHRoYXQgWW91IGNyZWF0ZSBvciB0byB3aGljaCBZb3UNCi0gICAgICAgICAgICBjb250cmlidXRlIGFyZSBnb3Zlcm5lZCBieSB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLiBZb3UNCi0gICAgICAgICAgICByZXByZXNlbnQgdGhhdCBZb3UgYmVsaWV2ZSBZb3VyIE1vZGlmaWNhdGlvbnMgYXJlIFlvdXINCi0gICAgICAgICAgICBvcmlnaW5hbCBjcmVhdGlvbihzKSBhbmQvb3IgWW91IGhhdmUgc3VmZmljaWVudCByaWdodHMgdG8NCi0gICAgICAgICAgICBncmFudCB0aGUgcmlnaHRzIGNvbnZleWVkIGJ5IHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAgICAgICAzLjMuIFJlcXVpcmVkIE5vdGljZXMuDQotDQotICAgICAgICAgICAgWW91IG11c3QgaW5jbHVkZSBhIG5vdGljZSBpbiBlYWNoIG9mIFlvdXIgTW9kaWZpY2F0aW9ucw0KLSAgICAgICAgICAgIHRoYXQgaWRlbnRpZmllcyBZb3UgYXMgdGhlIENvbnRyaWJ1dG9yIG9mIHRoZSBNb2RpZmljYXRpb24uDQotICAgICAgICAgICAgWW91IG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueSBjb3B5cmlnaHQsIHBhdGVudCBvcg0KLSAgICAgICAgICAgIHRyYWRlbWFyayBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIENvdmVyZWQgU29mdHdhcmUsIG9yDQotICAgICAgICAgICAgYW55IG5vdGljZXMgb2YgbGljZW5zaW5nIG9yIGFueSBkZXNjcmlwdGl2ZSB0ZXh0IGdpdmluZw0KLSAgICAgICAgICAgIGF0dHJpYnV0aW9uIHRvIGFueSBDb250cmlidXRvciBvciB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuDQotDQotICAgICAgICAgICAgMy40LiBBcHBsaWNhdGlvbiBvZiBBZGRpdGlvbmFsIFRlcm1zLg0KLQ0KLSAgICAgICAgICAgIFlvdSBtYXkgbm90IG9mZmVyIG9yIGltcG9zZSBhbnkgdGVybXMgb24gYW55IENvdmVyZWQNCi0gICAgICAgICAgICBTb2Z0d2FyZSBpbiBTb3VyY2UgQ29kZSBmb3JtIHRoYXQgYWx0ZXJzIG9yIHJlc3RyaWN0cyB0aGUNCi0gICAgICAgICAgICBhcHBsaWNhYmxlIHZlcnNpb24gb2YgdGhpcyBMaWNlbnNlIG9yIHRoZSByZWNpcGllbnRz1Q0KLSAgICAgICAgICAgIHJpZ2h0cyBoZXJldW5kZXIuIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLCBhbmQgdG8gY2hhcmdlIGENCi0gICAgICAgICAgICBmZWUgZm9yLCB3YXJyYW50eSwgc3VwcG9ydCwgaW5kZW1uaXR5IG9yIGxpYWJpbGl0eQ0KLSAgICAgICAgICAgIG9ibGlnYXRpb25zIHRvIG9uZSBvciBtb3JlIHJlY2lwaWVudHMgb2YgQ292ZXJlZCBTb2Z0d2FyZS4NCi0gICAgICAgICAgICBIb3dldmVyLCB5b3UgbWF5IGRvIHNvIG9ubHkgb24gWW91ciBvd24gYmVoYWxmLCBhbmQgbm90IG9uDQotICAgICAgICAgICAgYmVoYWxmIG9mIHRoZSBJbml0aWFsIERldmVsb3BlciBvciBhbnkgQ29udHJpYnV0b3IuIFlvdQ0KLSAgICAgICAgICAgIG11c3QgbWFrZSBpdCBhYnNvbHV0ZWx5IGNsZWFyIHRoYXQgYW55IHN1Y2ggd2FycmFudHksDQotICAgICAgICAgICAgc3VwcG9ydCwgaW5kZW1uaXR5IG9yIGxpYWJpbGl0eSBvYmxpZ2F0aW9uIGlzIG9mZmVyZWQgYnkNCi0gICAgICAgICAgICBZb3UgYWxvbmUsIGFuZCBZb3UgaGVyZWJ5IGFncmVlIHRvIGluZGVtbmlmeSB0aGUgSW5pdGlhbA0KLSAgICAgICAgICAgIERldmVsb3BlciBhbmQgZXZlcnkgQ29udHJpYnV0b3IgZm9yIGFueSBsaWFiaWxpdHkgaW5jdXJyZWQNCi0gICAgICAgICAgICBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgb3Igc3VjaCBDb250cmlidXRvciBhcyBhIHJlc3VsdCBvZg0KLSAgICAgICAgICAgIHdhcnJhbnR5LCBzdXBwb3J0LCBpbmRlbW5pdHkgb3IgbGlhYmlsaXR5IHRlcm1zIFlvdSBvZmZlci4NCi0gICAgICAgICAgDQotDQotICAgICAgICAgICAgMy41LiBEaXN0cmlidXRpb24gb2YgRXhlY3V0YWJsZSBWZXJzaW9ucy4NCi0NCi0gICAgICAgICAgICBZb3UgbWF5IGRpc3RyaWJ1dGUgdGhlIEV4ZWN1dGFibGUgZm9ybSBvZiB0aGUgQ292ZXJlZA0KLSAgICAgICAgICAgIFNvZnR3YXJlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2Ugb3IgdW5kZXIgdGhlIHRlcm1zDQotICAgICAgICAgICAgb2YgYSBsaWNlbnNlIG9mIFlvdXIgY2hvaWNlLCB3aGljaCBtYXkgY29udGFpbiB0ZXJtcw0KLSAgICAgICAgICAgIGRpZmZlcmVudCBmcm9tIHRoaXMgTGljZW5zZSwgcHJvdmlkZWQgdGhhdCBZb3UgYXJlIGluDQotICAgICAgICAgICAgY29tcGxpYW5jZSB3aXRoIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UgYW5kIHRoYXQgdGhlDQotICAgICAgICAgICAgbGljZW5zZSBmb3IgdGhlIEV4ZWN1dGFibGUgZm9ybSBkb2VzIG5vdCBhdHRlbXB0IHRvIGxpbWl0DQotICAgICAgICAgICAgb3IgYWx0ZXIgdGhlIHJlY2lwaWVudNVzIHJpZ2h0cyBpbiB0aGUgU291cmNlIENvZGUgZm9ybQ0KLSAgICAgICAgICAgIGZyb20gdGhlIHJpZ2h0cyBzZXQgZm9ydGggaW4gdGhpcyBMaWNlbnNlLiBJZiBZb3UNCi0gICAgICAgICAgICBkaXN0cmlidXRlIHRoZSBDb3ZlcmVkIFNvZnR3YXJlIGluIEV4ZWN1dGFibGUgZm9ybSB1bmRlciBhDQotICAgICAgICAgICAgZGlmZmVyZW50IGxpY2Vuc2UsIFlvdSBtdXN0IG1ha2UgaXQgYWJzb2x1dGVseSBjbGVhciB0aGF0DQotICAgICAgICAgICAgYW55IHRlcm1zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgTGljZW5zZSBhcmUgb2ZmZXJlZCBieSBZb3UNCi0gICAgICAgICAgICBhbG9uZSwgbm90IGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBvciBDb250cmlidXRvci4gWW91DQotICAgICAgICAgICAgaGVyZWJ5IGFncmVlIHRvIGluZGVtbmlmeSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYW5kIGV2ZXJ5DQotICAgICAgICAgICAgQ29udHJpYnV0b3IgZm9yIGFueSBsaWFiaWxpdHkgaW5jdXJyZWQgYnkgdGhlIEluaXRpYWwNCi0gICAgICAgICAgICBEZXZlbG9wZXIgb3Igc3VjaCBDb250cmlidXRvciBhcyBhIHJlc3VsdCBvZiBhbnkgc3VjaCB0ZXJtcw0KLSAgICAgICAgICAgIFlvdSBvZmZlci4NCi0NCi0gICAgICAgICAgICAzLjYuIExhcmdlciBXb3Jrcy4NCi0NCi0gICAgICAgICAgICBZb3UgbWF5IGNyZWF0ZSBhIExhcmdlciBXb3JrIGJ5IGNvbWJpbmluZyBDb3ZlcmVkIFNvZnR3YXJlDQotICAgICAgICAgICAgd2l0aCBvdGhlciBjb2RlIG5vdCBnb3Zlcm5lZCBieSB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlDQotICAgICAgICAgICAgYW5kIGRpc3RyaWJ1dGUgdGhlIExhcmdlciBXb3JrIGFzIGEgc2luZ2xlIHByb2R1Y3QuIEluIHN1Y2gNCi0gICAgICAgICAgICBhIGNhc2UsIFlvdSBtdXN0IG1ha2Ugc3VyZSB0aGUgcmVxdWlyZW1lbnRzIG9mIHRoaXMgTGljZW5zZQ0KLSAgICAgICAgICAgIGFyZSBmdWxmaWxsZWQgZm9yIHRoZSBDb3ZlcmVkIFNvZnR3YXJlLiANCi0gICAgICAgICAgICANCi0gICAgICA0LiBWZXJzaW9ucyBvZiB0aGUgTGljZW5zZS4gDQotDQotICAgICAgICAgICAgNC4xLiBOZXcgVmVyc2lvbnMuDQotDQotICAgICAgICAgICAgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpcyB0aGUgaW5pdGlhbCBsaWNlbnNlIHN0ZXdhcmQgYW5kDQotICAgICAgICAgICAgbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3IHZlcnNpb25zIG9mIHRoaXMgTGljZW5zZQ0KLSAgICAgICAgICAgIGZyb20gdGltZSB0byB0aW1lLiBFYWNoIHZlcnNpb24gd2lsbCBiZSBnaXZlbiBhDQotICAgICAgICAgICAgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIEV4Y2VwdCBhcyBwcm92aWRlZCBpbg0KLSAgICAgICAgICAgIFNlY3Rpb24gNC4zLCBubyBvbmUgb3RoZXIgdGhhbiB0aGUgbGljZW5zZSBzdGV3YXJkIGhhcyB0aGUNCi0gICAgICAgICAgICByaWdodCB0byBtb2RpZnkgdGhpcyBMaWNlbnNlLiANCi0NCi0gICAgICAgICAgICA0LjIuIEVmZmVjdCBvZiBOZXcgVmVyc2lvbnMuDQotDQotICAgICAgICAgICAgWW91IG1heSBhbHdheXMgY29udGludWUgdG8gdXNlLCBkaXN0cmlidXRlIG9yIG90aGVyd2lzZQ0KLSAgICAgICAgICAgIG1ha2UgdGhlIENvdmVyZWQgU29mdHdhcmUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUNCi0gICAgICAgICAgICB2ZXJzaW9uIG9mIHRoZSBMaWNlbnNlIHVuZGVyIHdoaWNoIFlvdSBvcmlnaW5hbGx5IHJlY2VpdmVkDQotICAgICAgICAgICAgdGhlIENvdmVyZWQgU29mdHdhcmUuIElmIHRoZSBJbml0aWFsIERldmVsb3BlciBpbmNsdWRlcyBhDQotICAgICAgICAgICAgbm90aWNlIGluIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSBwcm9oaWJpdGluZyBpdCBmcm9tIGJlaW5nDQotICAgICAgICAgICAgZGlzdHJpYnV0ZWQgb3Igb3RoZXJ3aXNlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIGFueQ0KLSAgICAgICAgICAgIHN1YnNlcXVlbnQgdmVyc2lvbiBvZiB0aGUgTGljZW5zZSwgWW91IG11c3QgZGlzdHJpYnV0ZSBhbmQNCi0gICAgICAgICAgICBtYWtlIHRoZSBDb3ZlcmVkIFNvZnR3YXJlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlDQotICAgICAgICAgICAgdmVyc2lvbiBvZiB0aGUgTGljZW5zZSB1bmRlciB3aGljaCBZb3Ugb3JpZ2luYWxseSByZWNlaXZlZA0KLSAgICAgICAgICAgIHRoZSBDb3ZlcmVkIFNvZnR3YXJlLiBPdGhlcndpc2UsIFlvdSBtYXkgYWxzbyBjaG9vc2UgdG8NCi0gICAgICAgICAgICB1c2UsIGRpc3RyaWJ1dGUgb3Igb3RoZXJ3aXNlIG1ha2UgdGhlIENvdmVyZWQgU29mdHdhcmUNCi0gICAgICAgICAgICBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIGFueSBzdWJzZXF1ZW50IHZlcnNpb24gb2YgdGhlDQotICAgICAgICAgICAgTGljZW5zZSBwdWJsaXNoZWQgYnkgdGhlIGxpY2Vuc2Ugc3Rld2FyZC4gDQotDQotICAgICAgICAgICAgNC4zLiBNb2RpZmllZCBWZXJzaW9ucy4NCi0NCi0gICAgICAgICAgICBXaGVuIFlvdSBhcmUgYW4gSW5pdGlhbCBEZXZlbG9wZXIgYW5kIFlvdSB3YW50IHRvIGNyZWF0ZSBhDQotICAgICAgICAgICAgbmV3IGxpY2Vuc2UgZm9yIFlvdXIgT3JpZ2luYWwgU29mdHdhcmUsIFlvdSBtYXkgY3JlYXRlIGFuZA0KLSAgICAgICAgICAgIHVzZSBhIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhpcyBMaWNlbnNlIGlmIFlvdTogKGEpIHJlbmFtZQ0KLSAgICAgICAgICAgIHRoZSBsaWNlbnNlIGFuZCByZW1vdmUgYW55IHJlZmVyZW5jZXMgdG8gdGhlIG5hbWUgb2YgdGhlDQotICAgICAgICAgICAgbGljZW5zZSBzdGV3YXJkIChleGNlcHQgdG8gbm90ZSB0aGF0IHRoZSBsaWNlbnNlIGRpZmZlcnMNCi0gICAgICAgICAgICBmcm9tIHRoaXMgTGljZW5zZSk7IGFuZCAoYikgb3RoZXJ3aXNlIG1ha2UgaXQgY2xlYXIgdGhhdA0KLSAgICAgICAgICAgIHRoZSBsaWNlbnNlIGNvbnRhaW5zIHRlcm1zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgTGljZW5zZS4NCi0gICAgICAgICAgICANCi0NCi0gICAgICA1LiBESVNDTEFJTUVSIE9GIFdBUlJBTlRZLg0KLQ0KLSAgICAgIENPVkVSRUQgU09GVFdBUkUgSVMgUFJPVklERUQgVU5ERVIgVEhJUyBMSUNFTlNFIE9OIEFOICJBUyBJUyINCi0gICAgICBCQVNJUywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELA0KLSAgICAgIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBXQVJSQU5USUVTIFRIQVQgVEhFIENPVkVSRUQNCi0gICAgICBTT0ZUV0FSRSBJUyBGUkVFIE9GIERFRkVDVFMsIE1FUkNIQU5UQUJMRSwgRklUIEZPUiBBIFBBUlRJQ1VMQVINCi0gICAgICBQVVJQT1NFIE9SIE5PTi1JTkZSSU5HSU5HLiBUSEUgRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgQU5EDQotICAgICAgUEVSRk9STUFOQ0UgT0YgVEhFIENPVkVSRUQgU09GVFdBUkUgSVMgV0lUSCBZT1UuIFNIT1VMRCBBTlkNCi0gICAgICBDT1ZFUkVEIFNPRlRXQVJFIFBST1ZFIERFRkVDVElWRSBJTiBBTlkgUkVTUEVDVCwgWU9VIChOT1QgVEhFDQotICAgICAgSU5JVElBTCBERVZFTE9QRVIgT1IgQU5ZIE9USEVSIENPTlRSSUJVVE9SKSBBU1NVTUUgVEhFIENPU1QgT0YNCi0gICAgICBBTlkgTkVDRVNTQVJZIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uIFRISVMgRElTQ0xBSU1FUiBPRg0KLSAgICAgIFdBUlJBTlRZIENPTlNUSVRVVEVTIEFOIEVTU0VOVElBTCBQQVJUIE9GIFRISVMgTElDRU5TRS4gTk8gVVNFIE9GDQotICAgICAgQU5ZIENPVkVSRUQgU09GVFdBUkUgSVMgQVVUSE9SSVpFRCBIRVJFVU5ERVIgRVhDRVBUIFVOREVSIFRISVMNCi0gICAgICBESVNDTEFJTUVSLiANCi0NCi0gICAgICA2LiBURVJNSU5BVElPTi4gDQotDQotICAgICAgICAgICAgNi4xLiBUaGlzIExpY2Vuc2UgYW5kIHRoZSByaWdodHMgZ3JhbnRlZCBoZXJldW5kZXIgd2lsbA0KLSAgICAgICAgICAgIHRlcm1pbmF0ZSBhdXRvbWF0aWNhbGx5IGlmIFlvdSBmYWlsIHRvIGNvbXBseSB3aXRoIHRlcm1zDQotICAgICAgICAgICAgaGVyZWluIGFuZCBmYWlsIHRvIGN1cmUgc3VjaCBicmVhY2ggd2l0aGluIDMwIGRheXMgb2YNCi0gICAgICAgICAgICBiZWNvbWluZyBhd2FyZSBvZiB0aGUgYnJlYWNoLiBQcm92aXNpb25zIHdoaWNoLCBieSB0aGVpcg0KLSAgICAgICAgICAgIG5hdHVyZSwgbXVzdCByZW1haW4gaW4gZWZmZWN0IGJleW9uZCB0aGUgdGVybWluYXRpb24gb2YNCi0gICAgICAgICAgICB0aGlzIExpY2Vuc2Ugc2hhbGwgc3Vydml2ZS4NCi0NCi0gICAgICAgICAgICA2LjIuIElmIFlvdSBhc3NlcnQgYSBwYXRlbnQgaW5mcmluZ2VtZW50IGNsYWltIChleGNsdWRpbmcNCi0gICAgICAgICAgICBkZWNsYXJhdG9yeSBqdWRnbWVudCBhY3Rpb25zKSBhZ2FpbnN0IEluaXRpYWwgRGV2ZWxvcGVyIG9yDQotICAgICAgICAgICAgYSBDb250cmlidXRvciAodGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9yIENvbnRyaWJ1dG9yIGFnYWluc3QNCi0gICAgICAgICAgICB3aG9tIFlvdSBhc3NlcnQgc3VjaCBjbGFpbSBpcyByZWZlcnJlZCB0byBhcyAiUGFydGljaXBhbnQiKQ0KLSAgICAgICAgICAgIGFsbGVnaW5nIHRoYXQgdGhlIFBhcnRpY2lwYW50IFNvZnR3YXJlIChtZWFuaW5nIHRoZQ0KLSAgICAgICAgICAgIENvbnRyaWJ1dG9yIFZlcnNpb24gd2hlcmUgdGhlIFBhcnRpY2lwYW50IGlzIGEgQ29udHJpYnV0b3INCi0gICAgICAgICAgICBvciB0aGUgT3JpZ2luYWwgU29mdHdhcmUgd2hlcmUgdGhlIFBhcnRpY2lwYW50IGlzIHRoZQ0KLSAgICAgICAgICAgIEluaXRpYWwgRGV2ZWxvcGVyKSBkaXJlY3RseSBvciBpbmRpcmVjdGx5IGluZnJpbmdlcyBhbnkNCi0gICAgICAgICAgICBwYXRlbnQsIHRoZW4gYW55IGFuZCBhbGwgcmlnaHRzIGdyYW50ZWQgZGlyZWN0bHkgb3INCi0gICAgICAgICAgICBpbmRpcmVjdGx5IHRvIFlvdSBieSBzdWNoIFBhcnRpY2lwYW50LCB0aGUgSW5pdGlhbA0KLSAgICAgICAgICAgIERldmVsb3BlciAoaWYgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGlzIG5vdCB0aGUgUGFydGljaXBhbnQpDQotICAgICAgICAgICAgYW5kIGFsbCBDb250cmlidXRvcnMgdW5kZXIgU2VjdGlvbnMgMi4xIGFuZC9vciAyLjIgb2YgdGhpcw0KLSAgICAgICAgICAgIExpY2Vuc2Ugc2hhbGwsIHVwb24gNjAgZGF5cyBub3RpY2UgZnJvbSBQYXJ0aWNpcGFudA0KLSAgICAgICAgICAgIHRlcm1pbmF0ZSBwcm9zcGVjdGl2ZWx5IGFuZCBhdXRvbWF0aWNhbGx5IGF0IHRoZSBleHBpcmF0aW9uDQotICAgICAgICAgICAgb2Ygc3VjaCA2MCBkYXkgbm90aWNlIHBlcmlvZCwgdW5sZXNzIGlmIHdpdGhpbiBzdWNoIDYwIGRheQ0KLSAgICAgICAgICAgIHBlcmlvZCBZb3Ugd2l0aGRyYXcgWW91ciBjbGFpbSB3aXRoIHJlc3BlY3QgdG8gdGhlDQotICAgICAgICAgICAgUGFydGljaXBhbnQgU29mdHdhcmUgYWdhaW5zdCBzdWNoIFBhcnRpY2lwYW50IGVpdGhlcg0KLSAgICAgICAgICAgIHVuaWxhdGVyYWxseSBvciBwdXJzdWFudCB0byBhIHdyaXR0ZW4gYWdyZWVtZW50IHdpdGgNCi0gICAgICAgICAgICBQYXJ0aWNpcGFudC4NCi0NCi0gICAgICAgICAgICA2LjMuIEluIHRoZSBldmVudCBvZiB0ZXJtaW5hdGlvbiB1bmRlciBTZWN0aW9ucyA2LjEgb3IgNi4yDQotICAgICAgICAgICAgYWJvdmUsIGFsbCBlbmQgdXNlciBsaWNlbnNlcyB0aGF0IGhhdmUgYmVlbiB2YWxpZGx5IGdyYW50ZWQNCi0gICAgICAgICAgICBieSBZb3Ugb3IgYW55IGRpc3RyaWJ1dG9yIGhlcmV1bmRlciBwcmlvciB0byB0ZXJtaW5hdGlvbg0KLSAgICAgICAgICAgIChleGNsdWRpbmcgbGljZW5zZXMgZ3JhbnRlZCB0byBZb3UgYnkgYW55IGRpc3RyaWJ1dG9yKQ0KLSAgICAgICAgICAgIHNoYWxsIHN1cnZpdmUgdGVybWluYXRpb24uDQotDQotICAgICAgNy4gTElNSVRBVElPTiBPRiBMSUFCSUxJVFkuDQotDQotICAgICAgVU5ERVIgTk8gQ0lSQ1VNU1RBTkNFUyBBTkQgVU5ERVIgTk8gTEVHQUwgVEhFT1JZLCBXSEVUSEVSIFRPUlQNCi0gICAgICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UpLCBDT05UUkFDVCwgT1IgT1RIRVJXSVNFLCBTSEFMTCBZT1UsIFRIRQ0KLSAgICAgIElOSVRJQUwgREVWRUxPUEVSLCBBTlkgT1RIRVIgQ09OVFJJQlVUT1IsIE9SIEFOWSBESVNUUklCVVRPUiBPRg0KLSAgICAgIENPVkVSRUQgU09GVFdBUkUsIE9SIEFOWSBTVVBQTElFUiBPRiBBTlkgT0YgU1VDSCBQQVJUSUVTLCBCRQ0KLSAgICAgIExJQUJMRSBUTyBBTlkgUEVSU09OIEZPUiBBTlkgSU5ESVJFQ1QsIFNQRUNJQUwsIElOQ0lERU5UQUwsIE9SDQotICAgICAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9GIEFOWSBDSEFSQUNURVIgSU5DTFVESU5HLCBXSVRIT1VUDQotICAgICAgTElNSVRBVElPTiwgREFNQUdFUyBGT1IgTE9TVCBQUk9GSVRTLCBMT1NTIE9GIEdPT0RXSUxMLCBXT1JLDQotICAgICAgU1RPUFBBR0UsIENPTVBVVEVSIEZBSUxVUkUgT1IgTUFMRlVOQ1RJT04sIE9SIEFOWSBBTkQgQUxMIE9USEVSDQotICAgICAgQ09NTUVSQ0lBTCBEQU1BR0VTIE9SIExPU1NFUywgRVZFTiBJRiBTVUNIIFBBUlRZIFNIQUxMIEhBVkUgQkVFTg0KLSAgICAgIElORk9STUVEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuIFRISVMgTElNSVRBVElPTiBPRg0KLSAgICAgIExJQUJJTElUWSBTSEFMTCBOT1QgQVBQTFkgVE8gTElBQklMSVRZIEZPUiBERUFUSCBPUiBQRVJTT05BTA0KLSAgICAgIElOSlVSWSBSRVNVTFRJTkcgRlJPTSBTVUNIIFBBUlRZ1VMgTkVHTElHRU5DRSBUTyBUSEUgRVhURU5UDQotICAgICAgQVBQTElDQUJMRSBMQVcgUFJPSElCSVRTIFNVQ0ggTElNSVRBVElPTi4gU09NRSBKVVJJU0RJQ1RJT05TIERPDQotICAgICAgTk9UIEFMTE9XIFRIRSBFWENMVVNJT04gT1IgTElNSVRBVElPTiBPRiBJTkNJREVOVEFMIE9SDQotICAgICAgQ09OU0VRVUVOVElBTCBEQU1BR0VTLCBTTyBUSElTIEVYQ0xVU0lPTiBBTkQgTElNSVRBVElPTiBNQVkgTk9UDQotICAgICAgQVBQTFkgVE8gWU9VLg0KLQ0KLSAgICAgIDguIFUuUy4gR09WRVJOTUVOVCBFTkQgVVNFUlMuDQotDQotICAgICAgVGhlIENvdmVyZWQgU29mdHdhcmUgaXMgYSAiY29tbWVyY2lhbCBpdGVtLCIgYXMgdGhhdCB0ZXJtIGlzDQotICAgICAgZGVmaW5lZCBpbiA0OCBDLkYuUi4gMi4xMDEgKE9jdC4gMTk5NSksIGNvbnNpc3Rpbmcgb2YgImNvbW1lcmNpYWwNCi0gICAgICBjb21wdXRlciBzb2Z0d2FyZSIgKGFzIHRoYXQgdGVybSBpcyBkZWZpbmVkIGF0IDQ4IEMuRi5SLiCkDQotICAgICAgMjUyLjIyNy03MDE0KGEpKDEpKSBhbmQgImNvbW1lcmNpYWwgY29tcHV0ZXIgc29mdHdhcmUNCi0gICAgICBkb2N1bWVudGF0aW9uIiBhcyBzdWNoIHRlcm1zIGFyZSB1c2VkIGluIDQ4IEMuRi5SLiAxMi4yMTIgKFNlcHQuDQotICAgICAgMTk5NSkuIENvbnNpc3RlbnQgd2l0aCA0OCBDLkYuUi4gMTIuMjEyIGFuZCA0OCBDLkYuUi4gMjI3LjcyMDItMQ0KLSAgICAgIHRocm91Z2ggMjI3LjcyMDItNCAoSnVuZSAxOTk1KSwgYWxsIFUuUy4gR292ZXJubWVudCBFbmQgVXNlcnMNCi0gICAgICBhY3F1aXJlIENvdmVyZWQgU29mdHdhcmUgd2l0aCBvbmx5IHRob3NlIHJpZ2h0cyBzZXQgZm9ydGggaGVyZWluLg0KLSAgICAgIFRoaXMgVS5TLiBHb3Zlcm5tZW50IFJpZ2h0cyBjbGF1c2UgaXMgaW4gbGlldSBvZiwgYW5kIHN1cGVyc2VkZXMsDQotICAgICAgYW55IG90aGVyIEZBUiwgREZBUiwgb3Igb3RoZXIgY2xhdXNlIG9yIHByb3Zpc2lvbiB0aGF0IGFkZHJlc3Nlcw0KLSAgICAgIEdvdmVybm1lbnQgcmlnaHRzIGluIGNvbXB1dGVyIHNvZnR3YXJlIHVuZGVyIHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICA5LiBNSVNDRUxMQU5FT1VTLg0KLQ0KLSAgICAgIFRoaXMgTGljZW5zZSByZXByZXNlbnRzIHRoZSBjb21wbGV0ZSBhZ3JlZW1lbnQgY29uY2VybmluZyBzdWJqZWN0DQotICAgICAgbWF0dGVyIGhlcmVvZi4gSWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgaGVsZCB0byBiZQ0KLSAgICAgIHVuZW5mb3JjZWFibGUsIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIG9ubHkgdG8gdGhlDQotICAgICAgZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIGl0IGVuZm9yY2VhYmxlLiBUaGlzIExpY2Vuc2Ugc2hhbGwgYmUNCi0gICAgICBnb3Zlcm5lZCBieSB0aGUgbGF3IG9mIHRoZSBqdXJpc2RpY3Rpb24gc3BlY2lmaWVkIGluIGEgbm90aWNlDQotICAgICAgY29udGFpbmVkIHdpdGhpbiB0aGUgT3JpZ2luYWwgU29mdHdhcmUgKGV4Y2VwdCB0byB0aGUgZXh0ZW50DQotICAgICAgYXBwbGljYWJsZSBsYXcsIGlmIGFueSwgcHJvdmlkZXMgb3RoZXJ3aXNlKSwgZXhjbHVkaW5nIHN1Y2gNCi0gICAgICBqdXJpc2RpY3Rpb27VcyBjb25mbGljdC1vZi1sYXcgcHJvdmlzaW9ucy4gQW55IGxpdGlnYXRpb24NCi0gICAgICByZWxhdGluZyB0byB0aGlzIExpY2Vuc2Ugc2hhbGwgYmUgc3ViamVjdCB0byB0aGUganVyaXNkaWN0aW9uIG9mDQotICAgICAgdGhlIGNvdXJ0cyBsb2NhdGVkIGluIHRoZSBqdXJpc2RpY3Rpb24gYW5kIHZlbnVlIHNwZWNpZmllZCBpbiBhDQotICAgICAgbm90aWNlIGNvbnRhaW5lZCB3aXRoaW4gdGhlIE9yaWdpbmFsIFNvZnR3YXJlLCB3aXRoIHRoZSBsb3NpbmcNCi0gICAgICBwYXJ0eSByZXNwb25zaWJsZSBmb3IgY29zdHMsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBjb3VydA0KLSAgICAgIGNvc3RzIGFuZCByZWFzb25hYmxlIGF0dG9ybmV5c9UgZmVlcyBhbmQgZXhwZW5zZXMuIFRoZQ0KLSAgICAgIGFwcGxpY2F0aW9uIG9mIHRoZSBVbml0ZWQgTmF0aW9ucyBDb252ZW50aW9uIG9uIENvbnRyYWN0cyBmb3IgdGhlDQotICAgICAgSW50ZXJuYXRpb25hbCBTYWxlIG9mIEdvb2RzIGlzIGV4cHJlc3NseSBleGNsdWRlZC4gQW55IGxhdyBvcg0KLSAgICAgIHJlZ3VsYXRpb24gd2hpY2ggcHJvdmlkZXMgdGhhdCB0aGUgbGFuZ3VhZ2Ugb2YgYSBjb250cmFjdCBzaGFsbA0KLSAgICAgIGJlIGNvbnN0cnVlZCBhZ2FpbnN0IHRoZSBkcmFmdGVyIHNoYWxsIG5vdCBhcHBseSB0byB0aGlzIExpY2Vuc2UuDQotICAgICAgWW91IGFncmVlIHRoYXQgWW91IGFsb25lIGFyZSByZXNwb25zaWJsZSBmb3IgY29tcGxpYW5jZSB3aXRoIHRoZQ0KLSAgICAgIFVuaXRlZCBTdGF0ZXMgZXhwb3J0IGFkbWluaXN0cmF0aW9uIHJlZ3VsYXRpb25zIChhbmQgdGhlIGV4cG9ydA0KLSAgICAgIGNvbnRyb2wgbGF3cyBhbmQgcmVndWxhdGlvbiBvZiBhbnkgb3RoZXIgY291bnRyaWVzKSB3aGVuIFlvdSB1c2UsDQotICAgICAgZGlzdHJpYnV0ZSBvciBvdGhlcndpc2UgbWFrZSBhdmFpbGFibGUgYW55IENvdmVyZWQgU29mdHdhcmUuDQotDQotICAgICAgMTAuIFJFU1BPTlNJQklMSVRZIEZPUiBDTEFJTVMuDQotDQotICAgICAgQXMgYmV0d2VlbiBJbml0aWFsIERldmVsb3BlciBhbmQgdGhlIENvbnRyaWJ1dG9ycywgZWFjaCBwYXJ0eSBpcw0KLSAgICAgIHJlc3BvbnNpYmxlIGZvciBjbGFpbXMgYW5kIGRhbWFnZXMgYXJpc2luZywgZGlyZWN0bHkgb3INCi0gICAgICBpbmRpcmVjdGx5LCBvdXQgb2YgaXRzIHV0aWxpemF0aW9uIG9mIHJpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2UNCi0gICAgICBhbmQgWW91IGFncmVlIHRvIHdvcmsgd2l0aCBJbml0aWFsIERldmVsb3BlciBhbmQgQ29udHJpYnV0b3JzIHRvDQotICAgICAgZGlzdHJpYnV0ZSBzdWNoIHJlc3BvbnNpYmlsaXR5IG9uIGFuIGVxdWl0YWJsZSBiYXNpcy4gTm90aGluZw0KLSAgICAgIGhlcmVpbiBpcyBpbnRlbmRlZCBvciBzaGFsbCBiZSBkZWVtZWQgdG8gY29uc3RpdHV0ZSBhbnkgYWRtaXNzaW9uDQotICAgICAgb2YgbGlhYmlsaXR5Lg0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9sZWdhbC9qYXhiLWltcGwtTElDRU5TRS50eHQgYi92MS41LjFSQzMvbGVnYWwvamF4Yi1pbXBsLUxJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2RlYmY4Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9sZWdhbC9qYXhiLWltcGwtTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwzODQgKzAsMCBAQAotQ09NTU9OIERFVkVMT1BNRU5UIEFORCBESVNUUklCVVRJT04gTElDRU5TRSAoQ0RETCkgVmVyc2lvbiAxLjANCi0NCi0NCi0gICAgICAxLiBEZWZpbml0aW9ucy4NCi0NCi0gICAgICAgICAgICAxLjEuICJDb250cmlidXRvciIgbWVhbnMgZWFjaCBpbmRpdmlkdWFsIG9yIGVudGl0eSB0aGF0DQotICAgICAgICAgICAgY3JlYXRlcyBvciBjb250cmlidXRlcyB0byB0aGUgY3JlYXRpb24gb2YgTW9kaWZpY2F0aW9ucy4NCi0NCi0gICAgICAgICAgICAxLjIuICJDb250cmlidXRvciBWZXJzaW9uIiBtZWFucyB0aGUgY29tYmluYXRpb24gb2YgdGhlDQotICAgICAgICAgICAgT3JpZ2luYWwgU29mdHdhcmUsIHByaW9yIE1vZGlmaWNhdGlvbnMgdXNlZCBieSBhDQotICAgICAgICAgICAgQ29udHJpYnV0b3IgKGlmIGFueSksIGFuZCB0aGUgTW9kaWZpY2F0aW9ucyBtYWRlIGJ5IHRoYXQNCi0gICAgICAgICAgICBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLg0KLQ0KLSAgICAgICAgICAgIDEuMy4gIkNvdmVyZWQgU29mdHdhcmUiIG1lYW5zIChhKSB0aGUgT3JpZ2luYWwgU29mdHdhcmUsIG9yDQotICAgICAgICAgICAgKGIpIE1vZGlmaWNhdGlvbnMsIG9yIChjKSB0aGUgY29tYmluYXRpb24gb2YgZmlsZXMNCi0gICAgICAgICAgICBjb250YWluaW5nIE9yaWdpbmFsIFNvZnR3YXJlIHdpdGggZmlsZXMgY29udGFpbmluZw0KLSAgICAgICAgICAgIE1vZGlmaWNhdGlvbnMsIGluIGVhY2ggY2FzZSBpbmNsdWRpbmcgcG9ydGlvbnMgdGhlcmVvZi4NCi0NCi0gICAgICAgICAgICAxLjQuICJFeGVjdXRhYmxlIiBtZWFucyB0aGUgQ292ZXJlZCBTb2Z0d2FyZSBpbiBhbnkgZm9ybQ0KLSAgICAgICAgICAgIG90aGVyIHRoYW4gU291cmNlIENvZGUuIA0KLQ0KLSAgICAgICAgICAgIDEuNS4gIkluaXRpYWwgRGV2ZWxvcGVyIiBtZWFucyB0aGUgaW5kaXZpZHVhbCBvciBlbnRpdHkNCi0gICAgICAgICAgICB0aGF0IGZpcnN0IG1ha2VzIE9yaWdpbmFsIFNvZnR3YXJlIGF2YWlsYWJsZSB1bmRlciB0aGlzDQotICAgICAgICAgICAgTGljZW5zZS4gDQotICAgICAgICAgICAgDQotICAgICAgICAgICAgMS42LiAiTGFyZ2VyIFdvcmsiIG1lYW5zIGEgd29yayB3aGljaCBjb21iaW5lcyBDb3ZlcmVkDQotICAgICAgICAgICAgU29mdHdhcmUgb3IgcG9ydGlvbnMgdGhlcmVvZiB3aXRoIGNvZGUgbm90IGdvdmVybmVkIGJ5IHRoZQ0KLSAgICAgICAgICAgIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAgICAgICAxLjcuICJMaWNlbnNlIiBtZWFucyB0aGlzIGRvY3VtZW50Lg0KLQ0KLSAgICAgICAgICAgIDEuOC4gIkxpY2Vuc2FibGUiIG1lYW5zIGhhdmluZyB0aGUgcmlnaHQgdG8gZ3JhbnQsIHRvIHRoZQ0KLSAgICAgICAgICAgIG1heGltdW0gZXh0ZW50IHBvc3NpYmxlLCB3aGV0aGVyIGF0IHRoZSB0aW1lIG9mIHRoZSBpbml0aWFsDQotICAgICAgICAgICAgZ3JhbnQgb3Igc3Vic2VxdWVudGx5IGFjcXVpcmVkLCBhbnkgYW5kIGFsbCBvZiB0aGUgcmlnaHRzDQotICAgICAgICAgICAgY29udmV5ZWQgaGVyZWluLg0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIDEuOS4gIk1vZGlmaWNhdGlvbnMiIG1lYW5zIHRoZSBTb3VyY2UgQ29kZSBhbmQgRXhlY3V0YWJsZQ0KLSAgICAgICAgICAgIGZvcm0gb2YgYW55IG9mIHRoZSBmb2xsb3dpbmc6IA0KLQ0KLSAgICAgICAgICAgICAgICAgIEEuIEFueSBmaWxlIHRoYXQgcmVzdWx0cyBmcm9tIGFuIGFkZGl0aW9uIHRvLA0KLSAgICAgICAgICAgICAgICAgIGRlbGV0aW9uIGZyb20gb3IgbW9kaWZpY2F0aW9uIG9mIHRoZSBjb250ZW50cyBvZiBhDQotICAgICAgICAgICAgICAgICAgZmlsZSBjb250YWluaW5nIE9yaWdpbmFsIFNvZnR3YXJlIG9yIHByZXZpb3VzDQotICAgICAgICAgICAgICAgICAgTW9kaWZpY2F0aW9uczsgDQotDQotICAgICAgICAgICAgICAgICAgQi4gQW55IG5ldyBmaWxlIHRoYXQgY29udGFpbnMgYW55IHBhcnQgb2YgdGhlDQotICAgICAgICAgICAgICAgICAgT3JpZ2luYWwgU29mdHdhcmUgb3IgcHJldmlvdXMgTW9kaWZpY2F0aW9uOyBvciANCi0NCi0gICAgICAgICAgICAgICAgICBDLiBBbnkgbmV3IGZpbGUgdGhhdCBpcyBjb250cmlidXRlZCBvciBvdGhlcndpc2UgbWFkZQ0KLSAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgICAgICAgICAgIDEuMTAuICJPcmlnaW5hbCBTb2Z0d2FyZSIgbWVhbnMgdGhlIFNvdXJjZSBDb2RlIGFuZA0KLSAgICAgICAgICAgIEV4ZWN1dGFibGUgZm9ybSBvZiBjb21wdXRlciBzb2Z0d2FyZSBjb2RlIHRoYXQgaXMNCi0gICAgICAgICAgICBvcmlnaW5hbGx5IHJlbGVhc2VkIHVuZGVyIHRoaXMgTGljZW5zZS4gDQotDQotICAgICAgICAgICAgMS4xMS4gIlBhdGVudCBDbGFpbXMiIG1lYW5zIGFueSBwYXRlbnQgY2xhaW0ocyksIG5vdyBvd25lZA0KLSAgICAgICAgICAgIG9yIGhlcmVhZnRlciBhY3F1aXJlZCwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiwNCi0gICAgICAgICAgICBtZXRob2QsIHByb2Nlc3MsIGFuZCBhcHBhcmF0dXMgY2xhaW1zLCBpbiBhbnkgcGF0ZW50DQotICAgICAgICAgICAgTGljZW5zYWJsZSBieSBncmFudG9yLiANCi0NCi0gICAgICAgICAgICAxLjEyLiAiU291cmNlIENvZGUiIG1lYW5zIChhKSB0aGUgY29tbW9uIGZvcm0gb2YgY29tcHV0ZXINCi0gICAgICAgICAgICBzb2Z0d2FyZSBjb2RlIGluIHdoaWNoIG1vZGlmaWNhdGlvbnMgYXJlIG1hZGUgYW5kIChiKQ0KLSAgICAgICAgICAgIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCBpbiBvciB3aXRoIHN1Y2ggY29kZS4NCi0NCi0gICAgICAgICAgICAxLjEzLiAiWW91IiAob3IgIllvdXIiKSBtZWFucyBhbiBpbmRpdmlkdWFsIG9yIGEgbGVnYWwNCi0gICAgICAgICAgICBlbnRpdHkgZXhlcmNpc2luZyByaWdodHMgdW5kZXIsIGFuZCBjb21wbHlpbmcgd2l0aCBhbGwgb2YNCi0gICAgICAgICAgICB0aGUgdGVybXMgb2YsIHRoaXMgTGljZW5zZS4gRm9yIGxlZ2FsIGVudGl0aWVzLCAiWW91Ig0KLSAgICAgICAgICAgIGluY2x1ZGVzIGFueSBlbnRpdHkgd2hpY2ggY29udHJvbHMsIGlzIGNvbnRyb2xsZWQgYnksIG9yIGlzDQotICAgICAgICAgICAgdW5kZXIgY29tbW9uIGNvbnRyb2wgd2l0aCBZb3UuIEZvciBwdXJwb3NlcyBvZiB0aGlzDQotICAgICAgICAgICAgZGVmaW5pdGlvbiwgImNvbnRyb2wiIG1lYW5zIChhKSB0aGUgcG93ZXIsIGRpcmVjdCBvcg0KLSAgICAgICAgICAgIGluZGlyZWN0LCB0byBjYXVzZSB0aGUgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaA0KLSAgICAgICAgICAgIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvciBvdGhlcndpc2UsIG9yIChiKSBvd25lcnNoaXANCi0gICAgICAgICAgICBvZiBtb3JlIHRoYW4gZmlmdHkgcGVyY2VudCAoNTAlKSBvZiB0aGUgb3V0c3RhbmRpbmcgc2hhcmVzDQotICAgICAgICAgICAgb3IgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuDQotDQotICAgICAgMi4gTGljZW5zZSBHcmFudHMuIA0KLQ0KLSAgICAgICAgICAgIDIuMS4gVGhlIEluaXRpYWwgRGV2ZWxvcGVyIEdyYW50Lg0KLQ0KLSAgICAgICAgICAgIENvbmRpdGlvbmVkIHVwb24gWW91ciBjb21wbGlhbmNlIHdpdGggU2VjdGlvbiAzLjEgYmVsb3cgYW5kDQotICAgICAgICAgICAgc3ViamVjdCB0byB0aGlyZCBwYXJ0eSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgY2xhaW1zLCB0aGUNCi0gICAgICAgICAgICBJbml0aWFsIERldmVsb3BlciBoZXJlYnkgZ3JhbnRzIFlvdSBhIHdvcmxkLXdpZGUsDQotICAgICAgICAgICAgcm95YWx0eS1mcmVlLCBub24tZXhjbHVzaXZlIGxpY2Vuc2U6IA0KLQ0KLSAgICAgICAgICAgICAgICAgIChhKSB1bmRlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIChvdGhlciB0aGFuDQotICAgICAgICAgICAgICAgICAgcGF0ZW50IG9yIHRyYWRlbWFyaykgTGljZW5zYWJsZSBieSBJbml0aWFsIERldmVsb3BlciwNCi0gICAgICAgICAgICAgICAgICB0byB1c2UsIHJlcHJvZHVjZSwgbW9kaWZ5LCBkaXNwbGF5LCBwZXJmb3JtLA0KLSAgICAgICAgICAgICAgICAgIHN1YmxpY2Vuc2UgYW5kIGRpc3RyaWJ1dGUgdGhlIE9yaWdpbmFsIFNvZnR3YXJlIChvcg0KLSAgICAgICAgICAgICAgICAgIHBvcnRpb25zIHRoZXJlb2YpLCB3aXRoIG9yIHdpdGhvdXQgTW9kaWZpY2F0aW9ucywNCi0gICAgICAgICAgICAgICAgICBhbmQvb3IgYXMgcGFydCBvZiBhIExhcmdlciBXb3JrOyBhbmQgDQotDQotICAgICAgICAgICAgICAgICAgKGIpIHVuZGVyIFBhdGVudCBDbGFpbXMgaW5mcmluZ2VkIGJ5IHRoZSBtYWtpbmcsDQotICAgICAgICAgICAgICAgICAgdXNpbmcgb3Igc2VsbGluZyBvZiBPcmlnaW5hbCBTb2Z0d2FyZSwgdG8gbWFrZSwgaGF2ZQ0KLSAgICAgICAgICAgICAgICAgIG1hZGUsIHVzZSwgcHJhY3RpY2UsIHNlbGwsIGFuZCBvZmZlciBmb3Igc2FsZSwgYW5kL29yDQotICAgICAgICAgICAgICAgICAgb3RoZXJ3aXNlIGRpc3Bvc2Ugb2YgdGhlIE9yaWdpbmFsIFNvZnR3YXJlIChvcg0KLSAgICAgICAgICAgICAgICAgIHBvcnRpb25zIHRoZXJlb2YpLiANCi0NCi0gICAgICAgICAgICAgICAgICAoYykgVGhlIGxpY2Vuc2VzIGdyYW50ZWQgaW4gU2VjdGlvbnMgMi4xKGEpIGFuZCAoYikNCi0gICAgICAgICAgICAgICAgICBhcmUgZWZmZWN0aXZlIG9uIHRoZSBkYXRlIEluaXRpYWwgRGV2ZWxvcGVyIGZpcnN0DQotICAgICAgICAgICAgICAgICAgZGlzdHJpYnV0ZXMgb3Igb3RoZXJ3aXNlIG1ha2VzIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZQ0KLSAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZSB0byBhIHRoaXJkIHBhcnR5IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzDQotICAgICAgICAgICAgICAgICAgTGljZW5zZS4gDQotDQotICAgICAgICAgICAgICAgICAgKGQpIE5vdHdpdGhzdGFuZGluZyBTZWN0aW9uIDIuMShiKSBhYm92ZSwgbm8gcGF0ZW50DQotICAgICAgICAgICAgICAgICAgbGljZW5zZSBpcyBncmFudGVkOiAoMSkgZm9yIGNvZGUgdGhhdCBZb3UgZGVsZXRlIGZyb20NCi0gICAgICAgICAgICAgICAgICB0aGUgT3JpZ2luYWwgU29mdHdhcmUsIG9yICgyKSBmb3IgaW5mcmluZ2VtZW50cw0KLSAgICAgICAgICAgICAgICAgIGNhdXNlZCBieTogKGkpIHRoZSBtb2RpZmljYXRpb24gb2YgdGhlIE9yaWdpbmFsDQotICAgICAgICAgICAgICAgICAgU29mdHdhcmUsIG9yIChpaSkgdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSBPcmlnaW5hbA0KLSAgICAgICAgICAgICAgICAgIFNvZnR3YXJlIHdpdGggb3RoZXIgc29mdHdhcmUgb3IgZGV2aWNlcy4gDQotDQotICAgICAgICAgICAgMi4yLiBDb250cmlidXRvciBHcmFudC4NCi0NCi0gICAgICAgICAgICBDb25kaXRpb25lZCB1cG9uIFlvdXIgY29tcGxpYW5jZSB3aXRoIFNlY3Rpb24gMy4xIGJlbG93IGFuZA0KLSAgICAgICAgICAgIHN1YmplY3QgdG8gdGhpcmQgcGFydHkgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGNsYWltcywgZWFjaA0KLSAgICAgICAgICAgIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgWW91IGEgd29ybGQtd2lkZSwgcm95YWx0eS1mcmVlLA0KLSAgICAgICAgICAgIG5vbi1leGNsdXNpdmUgbGljZW5zZToNCi0NCi0gICAgICAgICAgICAgICAgICAoYSkgdW5kZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyAob3RoZXIgdGhhbg0KLSAgICAgICAgICAgICAgICAgIHBhdGVudCBvciB0cmFkZW1hcmspIExpY2Vuc2FibGUgYnkgQ29udHJpYnV0b3IgdG8NCi0gICAgICAgICAgICAgICAgICB1c2UsIHJlcHJvZHVjZSwgbW9kaWZ5LCBkaXNwbGF5LCBwZXJmb3JtLCBzdWJsaWNlbnNlDQotICAgICAgICAgICAgICAgICAgYW5kIGRpc3RyaWJ1dGUgdGhlIE1vZGlmaWNhdGlvbnMgY3JlYXRlZCBieSBzdWNoDQotICAgICAgICAgICAgICAgICAgQ29udHJpYnV0b3IgKG9yIHBvcnRpb25zIHRoZXJlb2YpLCBlaXRoZXIgb24gYW4NCi0gICAgICAgICAgICAgICAgICB1bm1vZGlmaWVkIGJhc2lzLCB3aXRoIG90aGVyIE1vZGlmaWNhdGlvbnMsIGFzDQotICAgICAgICAgICAgICAgICAgQ292ZXJlZCBTb2Z0d2FyZSBhbmQvb3IgYXMgcGFydCBvZiBhIExhcmdlciBXb3JrOyBhbmQNCi0gICAgICAgICAgICAgICAgICANCi0NCi0gICAgICAgICAgICAgICAgICAoYikgdW5kZXIgUGF0ZW50IENsYWltcyBpbmZyaW5nZWQgYnkgdGhlIG1ha2luZywNCi0gICAgICAgICAgICAgICAgICB1c2luZywgb3Igc2VsbGluZyBvZiBNb2RpZmljYXRpb25zIG1hZGUgYnkgdGhhdA0KLSAgICAgICAgICAgICAgICAgIENvbnRyaWJ1dG9yIGVpdGhlciBhbG9uZSBhbmQvb3IgaW4gY29tYmluYXRpb24gd2l0aA0KLSAgICAgICAgICAgICAgICAgIGl0cyBDb250cmlidXRvciBWZXJzaW9uIChvciBwb3J0aW9ucyBvZiBzdWNoDQotICAgICAgICAgICAgICAgICAgY29tYmluYXRpb24pLCB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIGZvciBzYWxlLA0KLSAgICAgICAgICAgICAgICAgIGhhdmUgbWFkZSwgYW5kL29yIG90aGVyd2lzZSBkaXNwb3NlIG9mOiAoMSkNCi0gICAgICAgICAgICAgICAgICBNb2RpZmljYXRpb25zIG1hZGUgYnkgdGhhdCBDb250cmlidXRvciAob3IgcG9ydGlvbnMNCi0gICAgICAgICAgICAgICAgICB0aGVyZW9mKTsgYW5kICgyKSB0aGUgY29tYmluYXRpb24gb2YgTW9kaWZpY2F0aW9ucw0KLSAgICAgICAgICAgICAgICAgIG1hZGUgYnkgdGhhdCBDb250cmlidXRvciB3aXRoIGl0cyBDb250cmlidXRvciBWZXJzaW9uDQotICAgICAgICAgICAgICAgICAgKG9yIHBvcnRpb25zIG9mIHN1Y2ggY29tYmluYXRpb24pLiANCi0NCi0gICAgICAgICAgICAgICAgICAoYykgVGhlIGxpY2Vuc2VzIGdyYW50ZWQgaW4gU2VjdGlvbnMgMi4yKGEpIGFuZA0KLSAgICAgICAgICAgICAgICAgIDIuMihiKSBhcmUgZWZmZWN0aXZlIG9uIHRoZSBkYXRlIENvbnRyaWJ1dG9yIGZpcnN0DQotICAgICAgICAgICAgICAgICAgZGlzdHJpYnV0ZXMgb3Igb3RoZXJ3aXNlIG1ha2VzIHRoZSBNb2RpZmljYXRpb25zDQotICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlIHRvIGEgdGhpcmQgcGFydHkuIA0KLQ0KLSAgICAgICAgICAgICAgICAgIChkKSBOb3R3aXRoc3RhbmRpbmcgU2VjdGlvbiAyLjIoYikgYWJvdmUsIG5vIHBhdGVudA0KLSAgICAgICAgICAgICAgICAgIGxpY2Vuc2UgaXMgZ3JhbnRlZDogKDEpIGZvciBhbnkgY29kZSB0aGF0IENvbnRyaWJ1dG9yDQotICAgICAgICAgICAgICAgICAgaGFzIGRlbGV0ZWQgZnJvbSB0aGUgQ29udHJpYnV0b3IgVmVyc2lvbjsgKDIpIGZvcg0KLSAgICAgICAgICAgICAgICAgIGluZnJpbmdlbWVudHMgY2F1c2VkIGJ5OiAoaSkgdGhpcmQgcGFydHkNCi0gICAgICAgICAgICAgICAgICBtb2RpZmljYXRpb25zIG9mIENvbnRyaWJ1dG9yIFZlcnNpb24sIG9yIChpaSkgdGhlDQotICAgICAgICAgICAgICAgICAgY29tYmluYXRpb24gb2YgTW9kaWZpY2F0aW9ucyBtYWRlIGJ5IHRoYXQgQ29udHJpYnV0b3INCi0gICAgICAgICAgICAgICAgICB3aXRoIG90aGVyIHNvZnR3YXJlIChleGNlcHQgYXMgcGFydCBvZiB0aGUNCi0gICAgICAgICAgICAgICAgICBDb250cmlidXRvciBWZXJzaW9uKSBvciBvdGhlciBkZXZpY2VzOyBvciAoMykgdW5kZXINCi0gICAgICAgICAgICAgICAgICBQYXRlbnQgQ2xhaW1zIGluZnJpbmdlZCBieSBDb3ZlcmVkIFNvZnR3YXJlIGluIHRoZQ0KLSAgICAgICAgICAgICAgICAgIGFic2VuY2Ugb2YgTW9kaWZpY2F0aW9ucyBtYWRlIGJ5IHRoYXQgQ29udHJpYnV0b3IuIA0KLQ0KLSAgICAgIDMuIERpc3RyaWJ1dGlvbiBPYmxpZ2F0aW9ucy4NCi0NCi0gICAgICAgICAgICAzLjEuIEF2YWlsYWJpbGl0eSBvZiBTb3VyY2UgQ29kZS4NCi0NCi0gICAgICAgICAgICBBbnkgQ292ZXJlZCBTb2Z0d2FyZSB0aGF0IFlvdSBkaXN0cmlidXRlIG9yIG90aGVyd2lzZSBtYWtlDQotICAgICAgICAgICAgYXZhaWxhYmxlIGluIEV4ZWN1dGFibGUgZm9ybSBtdXN0IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgaW4NCi0gICAgICAgICAgICBTb3VyY2UgQ29kZSBmb3JtIGFuZCB0aGF0IFNvdXJjZSBDb2RlIGZvcm0gbXVzdCBiZQ0KLSAgICAgICAgICAgIGRpc3RyaWJ1dGVkIG9ubHkgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4gWW91IG11c3QNCi0gICAgICAgICAgICBpbmNsdWRlIGEgY29weSBvZiB0aGlzIExpY2Vuc2Ugd2l0aCBldmVyeSBjb3B5IG9mIHRoZQ0KLSAgICAgICAgICAgIFNvdXJjZSBDb2RlIGZvcm0gb2YgdGhlIENvdmVyZWQgU29mdHdhcmUgWW91IGRpc3RyaWJ1dGUgb3INCi0gICAgICAgICAgICBvdGhlcndpc2UgbWFrZSBhdmFpbGFibGUuIFlvdSBtdXN0IGluZm9ybSByZWNpcGllbnRzIG9mIGFueQ0KLSAgICAgICAgICAgIHN1Y2ggQ292ZXJlZCBTb2Z0d2FyZSBpbiBFeGVjdXRhYmxlIGZvcm0gYXMgdG8gaG93IHRoZXkgY2FuDQotICAgICAgICAgICAgb2J0YWluIHN1Y2ggQ292ZXJlZCBTb2Z0d2FyZSBpbiBTb3VyY2UgQ29kZSBmb3JtIGluIGENCi0gICAgICAgICAgICByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQNCi0gICAgICAgICAgICBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuDQotDQotICAgICAgICAgICAgMy4yLiBNb2RpZmljYXRpb25zLg0KLQ0KLSAgICAgICAgICAgIFRoZSBNb2RpZmljYXRpb25zIHRoYXQgWW91IGNyZWF0ZSBvciB0byB3aGljaCBZb3UNCi0gICAgICAgICAgICBjb250cmlidXRlIGFyZSBnb3Zlcm5lZCBieSB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLiBZb3UNCi0gICAgICAgICAgICByZXByZXNlbnQgdGhhdCBZb3UgYmVsaWV2ZSBZb3VyIE1vZGlmaWNhdGlvbnMgYXJlIFlvdXINCi0gICAgICAgICAgICBvcmlnaW5hbCBjcmVhdGlvbihzKSBhbmQvb3IgWW91IGhhdmUgc3VmZmljaWVudCByaWdodHMgdG8NCi0gICAgICAgICAgICBncmFudCB0aGUgcmlnaHRzIGNvbnZleWVkIGJ5IHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAgICAgICAzLjMuIFJlcXVpcmVkIE5vdGljZXMuDQotDQotICAgICAgICAgICAgWW91IG11c3QgaW5jbHVkZSBhIG5vdGljZSBpbiBlYWNoIG9mIFlvdXIgTW9kaWZpY2F0aW9ucw0KLSAgICAgICAgICAgIHRoYXQgaWRlbnRpZmllcyBZb3UgYXMgdGhlIENvbnRyaWJ1dG9yIG9mIHRoZSBNb2RpZmljYXRpb24uDQotICAgICAgICAgICAgWW91IG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueSBjb3B5cmlnaHQsIHBhdGVudCBvcg0KLSAgICAgICAgICAgIHRyYWRlbWFyayBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIENvdmVyZWQgU29mdHdhcmUsIG9yDQotICAgICAgICAgICAgYW55IG5vdGljZXMgb2YgbGljZW5zaW5nIG9yIGFueSBkZXNjcmlwdGl2ZSB0ZXh0IGdpdmluZw0KLSAgICAgICAgICAgIGF0dHJpYnV0aW9uIHRvIGFueSBDb250cmlidXRvciBvciB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuDQotDQotICAgICAgICAgICAgMy40LiBBcHBsaWNhdGlvbiBvZiBBZGRpdGlvbmFsIFRlcm1zLg0KLQ0KLSAgICAgICAgICAgIFlvdSBtYXkgbm90IG9mZmVyIG9yIGltcG9zZSBhbnkgdGVybXMgb24gYW55IENvdmVyZWQNCi0gICAgICAgICAgICBTb2Z0d2FyZSBpbiBTb3VyY2UgQ29kZSBmb3JtIHRoYXQgYWx0ZXJzIG9yIHJlc3RyaWN0cyB0aGUNCi0gICAgICAgICAgICBhcHBsaWNhYmxlIHZlcnNpb24gb2YgdGhpcyBMaWNlbnNlIG9yIHRoZSByZWNpcGllbnRz1Q0KLSAgICAgICAgICAgIHJpZ2h0cyBoZXJldW5kZXIuIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLCBhbmQgdG8gY2hhcmdlIGENCi0gICAgICAgICAgICBmZWUgZm9yLCB3YXJyYW50eSwgc3VwcG9ydCwgaW5kZW1uaXR5IG9yIGxpYWJpbGl0eQ0KLSAgICAgICAgICAgIG9ibGlnYXRpb25zIHRvIG9uZSBvciBtb3JlIHJlY2lwaWVudHMgb2YgQ292ZXJlZCBTb2Z0d2FyZS4NCi0gICAgICAgICAgICBIb3dldmVyLCB5b3UgbWF5IGRvIHNvIG9ubHkgb24gWW91ciBvd24gYmVoYWxmLCBhbmQgbm90IG9uDQotICAgICAgICAgICAgYmVoYWxmIG9mIHRoZSBJbml0aWFsIERldmVsb3BlciBvciBhbnkgQ29udHJpYnV0b3IuIFlvdQ0KLSAgICAgICAgICAgIG11c3QgbWFrZSBpdCBhYnNvbHV0ZWx5IGNsZWFyIHRoYXQgYW55IHN1Y2ggd2FycmFudHksDQotICAgICAgICAgICAgc3VwcG9ydCwgaW5kZW1uaXR5IG9yIGxpYWJpbGl0eSBvYmxpZ2F0aW9uIGlzIG9mZmVyZWQgYnkNCi0gICAgICAgICAgICBZb3UgYWxvbmUsIGFuZCBZb3UgaGVyZWJ5IGFncmVlIHRvIGluZGVtbmlmeSB0aGUgSW5pdGlhbA0KLSAgICAgICAgICAgIERldmVsb3BlciBhbmQgZXZlcnkgQ29udHJpYnV0b3IgZm9yIGFueSBsaWFiaWxpdHkgaW5jdXJyZWQNCi0gICAgICAgICAgICBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgb3Igc3VjaCBDb250cmlidXRvciBhcyBhIHJlc3VsdCBvZg0KLSAgICAgICAgICAgIHdhcnJhbnR5LCBzdXBwb3J0LCBpbmRlbW5pdHkgb3IgbGlhYmlsaXR5IHRlcm1zIFlvdSBvZmZlci4NCi0gICAgICAgICAgDQotDQotICAgICAgICAgICAgMy41LiBEaXN0cmlidXRpb24gb2YgRXhlY3V0YWJsZSBWZXJzaW9ucy4NCi0NCi0gICAgICAgICAgICBZb3UgbWF5IGRpc3RyaWJ1dGUgdGhlIEV4ZWN1dGFibGUgZm9ybSBvZiB0aGUgQ292ZXJlZA0KLSAgICAgICAgICAgIFNvZnR3YXJlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2Ugb3IgdW5kZXIgdGhlIHRlcm1zDQotICAgICAgICAgICAgb2YgYSBsaWNlbnNlIG9mIFlvdXIgY2hvaWNlLCB3aGljaCBtYXkgY29udGFpbiB0ZXJtcw0KLSAgICAgICAgICAgIGRpZmZlcmVudCBmcm9tIHRoaXMgTGljZW5zZSwgcHJvdmlkZWQgdGhhdCBZb3UgYXJlIGluDQotICAgICAgICAgICAgY29tcGxpYW5jZSB3aXRoIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UgYW5kIHRoYXQgdGhlDQotICAgICAgICAgICAgbGljZW5zZSBmb3IgdGhlIEV4ZWN1dGFibGUgZm9ybSBkb2VzIG5vdCBhdHRlbXB0IHRvIGxpbWl0DQotICAgICAgICAgICAgb3IgYWx0ZXIgdGhlIHJlY2lwaWVudNVzIHJpZ2h0cyBpbiB0aGUgU291cmNlIENvZGUgZm9ybQ0KLSAgICAgICAgICAgIGZyb20gdGhlIHJpZ2h0cyBzZXQgZm9ydGggaW4gdGhpcyBMaWNlbnNlLiBJZiBZb3UNCi0gICAgICAgICAgICBkaXN0cmlidXRlIHRoZSBDb3ZlcmVkIFNvZnR3YXJlIGluIEV4ZWN1dGFibGUgZm9ybSB1bmRlciBhDQotICAgICAgICAgICAgZGlmZmVyZW50IGxpY2Vuc2UsIFlvdSBtdXN0IG1ha2UgaXQgYWJzb2x1dGVseSBjbGVhciB0aGF0DQotICAgICAgICAgICAgYW55IHRlcm1zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgTGljZW5zZSBhcmUgb2ZmZXJlZCBieSBZb3UNCi0gICAgICAgICAgICBhbG9uZSwgbm90IGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBvciBDb250cmlidXRvci4gWW91DQotICAgICAgICAgICAgaGVyZWJ5IGFncmVlIHRvIGluZGVtbmlmeSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYW5kIGV2ZXJ5DQotICAgICAgICAgICAgQ29udHJpYnV0b3IgZm9yIGFueSBsaWFiaWxpdHkgaW5jdXJyZWQgYnkgdGhlIEluaXRpYWwNCi0gICAgICAgICAgICBEZXZlbG9wZXIgb3Igc3VjaCBDb250cmlidXRvciBhcyBhIHJlc3VsdCBvZiBhbnkgc3VjaCB0ZXJtcw0KLSAgICAgICAgICAgIFlvdSBvZmZlci4NCi0NCi0gICAgICAgICAgICAzLjYuIExhcmdlciBXb3Jrcy4NCi0NCi0gICAgICAgICAgICBZb3UgbWF5IGNyZWF0ZSBhIExhcmdlciBXb3JrIGJ5IGNvbWJpbmluZyBDb3ZlcmVkIFNvZnR3YXJlDQotICAgICAgICAgICAgd2l0aCBvdGhlciBjb2RlIG5vdCBnb3Zlcm5lZCBieSB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlDQotICAgICAgICAgICAgYW5kIGRpc3RyaWJ1dGUgdGhlIExhcmdlciBXb3JrIGFzIGEgc2luZ2xlIHByb2R1Y3QuIEluIHN1Y2gNCi0gICAgICAgICAgICBhIGNhc2UsIFlvdSBtdXN0IG1ha2Ugc3VyZSB0aGUgcmVxdWlyZW1lbnRzIG9mIHRoaXMgTGljZW5zZQ0KLSAgICAgICAgICAgIGFyZSBmdWxmaWxsZWQgZm9yIHRoZSBDb3ZlcmVkIFNvZnR3YXJlLiANCi0gICAgICAgICAgICANCi0gICAgICA0LiBWZXJzaW9ucyBvZiB0aGUgTGljZW5zZS4gDQotDQotICAgICAgICAgICAgNC4xLiBOZXcgVmVyc2lvbnMuDQotDQotICAgICAgICAgICAgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpcyB0aGUgaW5pdGlhbCBsaWNlbnNlIHN0ZXdhcmQgYW5kDQotICAgICAgICAgICAgbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3IHZlcnNpb25zIG9mIHRoaXMgTGljZW5zZQ0KLSAgICAgICAgICAgIGZyb20gdGltZSB0byB0aW1lLiBFYWNoIHZlcnNpb24gd2lsbCBiZSBnaXZlbiBhDQotICAgICAgICAgICAgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIEV4Y2VwdCBhcyBwcm92aWRlZCBpbg0KLSAgICAgICAgICAgIFNlY3Rpb24gNC4zLCBubyBvbmUgb3RoZXIgdGhhbiB0aGUgbGljZW5zZSBzdGV3YXJkIGhhcyB0aGUNCi0gICAgICAgICAgICByaWdodCB0byBtb2RpZnkgdGhpcyBMaWNlbnNlLiANCi0NCi0gICAgICAgICAgICA0LjIuIEVmZmVjdCBvZiBOZXcgVmVyc2lvbnMuDQotDQotICAgICAgICAgICAgWW91IG1heSBhbHdheXMgY29udGludWUgdG8gdXNlLCBkaXN0cmlidXRlIG9yIG90aGVyd2lzZQ0KLSAgICAgICAgICAgIG1ha2UgdGhlIENvdmVyZWQgU29mdHdhcmUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUNCi0gICAgICAgICAgICB2ZXJzaW9uIG9mIHRoZSBMaWNlbnNlIHVuZGVyIHdoaWNoIFlvdSBvcmlnaW5hbGx5IHJlY2VpdmVkDQotICAgICAgICAgICAgdGhlIENvdmVyZWQgU29mdHdhcmUuIElmIHRoZSBJbml0aWFsIERldmVsb3BlciBpbmNsdWRlcyBhDQotICAgICAgICAgICAgbm90aWNlIGluIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSBwcm9oaWJpdGluZyBpdCBmcm9tIGJlaW5nDQotICAgICAgICAgICAgZGlzdHJpYnV0ZWQgb3Igb3RoZXJ3aXNlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIGFueQ0KLSAgICAgICAgICAgIHN1YnNlcXVlbnQgdmVyc2lvbiBvZiB0aGUgTGljZW5zZSwgWW91IG11c3QgZGlzdHJpYnV0ZSBhbmQNCi0gICAgICAgICAgICBtYWtlIHRoZSBDb3ZlcmVkIFNvZnR3YXJlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlDQotICAgICAgICAgICAgdmVyc2lvbiBvZiB0aGUgTGljZW5zZSB1bmRlciB3aGljaCBZb3Ugb3JpZ2luYWxseSByZWNlaXZlZA0KLSAgICAgICAgICAgIHRoZSBDb3ZlcmVkIFNvZnR3YXJlLiBPdGhlcndpc2UsIFlvdSBtYXkgYWxzbyBjaG9vc2UgdG8NCi0gICAgICAgICAgICB1c2UsIGRpc3RyaWJ1dGUgb3Igb3RoZXJ3aXNlIG1ha2UgdGhlIENvdmVyZWQgU29mdHdhcmUNCi0gICAgICAgICAgICBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIGFueSBzdWJzZXF1ZW50IHZlcnNpb24gb2YgdGhlDQotICAgICAgICAgICAgTGljZW5zZSBwdWJsaXNoZWQgYnkgdGhlIGxpY2Vuc2Ugc3Rld2FyZC4gDQotDQotICAgICAgICAgICAgNC4zLiBNb2RpZmllZCBWZXJzaW9ucy4NCi0NCi0gICAgICAgICAgICBXaGVuIFlvdSBhcmUgYW4gSW5pdGlhbCBEZXZlbG9wZXIgYW5kIFlvdSB3YW50IHRvIGNyZWF0ZSBhDQotICAgICAgICAgICAgbmV3IGxpY2Vuc2UgZm9yIFlvdXIgT3JpZ2luYWwgU29mdHdhcmUsIFlvdSBtYXkgY3JlYXRlIGFuZA0KLSAgICAgICAgICAgIHVzZSBhIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhpcyBMaWNlbnNlIGlmIFlvdTogKGEpIHJlbmFtZQ0KLSAgICAgICAgICAgIHRoZSBsaWNlbnNlIGFuZCByZW1vdmUgYW55IHJlZmVyZW5jZXMgdG8gdGhlIG5hbWUgb2YgdGhlDQotICAgICAgICAgICAgbGljZW5zZSBzdGV3YXJkIChleGNlcHQgdG8gbm90ZSB0aGF0IHRoZSBsaWNlbnNlIGRpZmZlcnMNCi0gICAgICAgICAgICBmcm9tIHRoaXMgTGljZW5zZSk7IGFuZCAoYikgb3RoZXJ3aXNlIG1ha2UgaXQgY2xlYXIgdGhhdA0KLSAgICAgICAgICAgIHRoZSBsaWNlbnNlIGNvbnRhaW5zIHRlcm1zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgTGljZW5zZS4NCi0gICAgICAgICAgICANCi0NCi0gICAgICA1LiBESVNDTEFJTUVSIE9GIFdBUlJBTlRZLg0KLQ0KLSAgICAgIENPVkVSRUQgU09GVFdBUkUgSVMgUFJPVklERUQgVU5ERVIgVEhJUyBMSUNFTlNFIE9OIEFOICJBUyBJUyINCi0gICAgICBCQVNJUywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELA0KLSAgICAgIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBXQVJSQU5USUVTIFRIQVQgVEhFIENPVkVSRUQNCi0gICAgICBTT0ZUV0FSRSBJUyBGUkVFIE9GIERFRkVDVFMsIE1FUkNIQU5UQUJMRSwgRklUIEZPUiBBIFBBUlRJQ1VMQVINCi0gICAgICBQVVJQT1NFIE9SIE5PTi1JTkZSSU5HSU5HLiBUSEUgRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgQU5EDQotICAgICAgUEVSRk9STUFOQ0UgT0YgVEhFIENPVkVSRUQgU09GVFdBUkUgSVMgV0lUSCBZT1UuIFNIT1VMRCBBTlkNCi0gICAgICBDT1ZFUkVEIFNPRlRXQVJFIFBST1ZFIERFRkVDVElWRSBJTiBBTlkgUkVTUEVDVCwgWU9VIChOT1QgVEhFDQotICAgICAgSU5JVElBTCBERVZFTE9QRVIgT1IgQU5ZIE9USEVSIENPTlRSSUJVVE9SKSBBU1NVTUUgVEhFIENPU1QgT0YNCi0gICAgICBBTlkgTkVDRVNTQVJZIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uIFRISVMgRElTQ0xBSU1FUiBPRg0KLSAgICAgIFdBUlJBTlRZIENPTlNUSVRVVEVTIEFOIEVTU0VOVElBTCBQQVJUIE9GIFRISVMgTElDRU5TRS4gTk8gVVNFIE9GDQotICAgICAgQU5ZIENPVkVSRUQgU09GVFdBUkUgSVMgQVVUSE9SSVpFRCBIRVJFVU5ERVIgRVhDRVBUIFVOREVSIFRISVMNCi0gICAgICBESVNDTEFJTUVSLiANCi0NCi0gICAgICA2LiBURVJNSU5BVElPTi4gDQotDQotICAgICAgICAgICAgNi4xLiBUaGlzIExpY2Vuc2UgYW5kIHRoZSByaWdodHMgZ3JhbnRlZCBoZXJldW5kZXIgd2lsbA0KLSAgICAgICAgICAgIHRlcm1pbmF0ZSBhdXRvbWF0aWNhbGx5IGlmIFlvdSBmYWlsIHRvIGNvbXBseSB3aXRoIHRlcm1zDQotICAgICAgICAgICAgaGVyZWluIGFuZCBmYWlsIHRvIGN1cmUgc3VjaCBicmVhY2ggd2l0aGluIDMwIGRheXMgb2YNCi0gICAgICAgICAgICBiZWNvbWluZyBhd2FyZSBvZiB0aGUgYnJlYWNoLiBQcm92aXNpb25zIHdoaWNoLCBieSB0aGVpcg0KLSAgICAgICAgICAgIG5hdHVyZSwgbXVzdCByZW1haW4gaW4gZWZmZWN0IGJleW9uZCB0aGUgdGVybWluYXRpb24gb2YNCi0gICAgICAgICAgICB0aGlzIExpY2Vuc2Ugc2hhbGwgc3Vydml2ZS4NCi0NCi0gICAgICAgICAgICA2LjIuIElmIFlvdSBhc3NlcnQgYSBwYXRlbnQgaW5mcmluZ2VtZW50IGNsYWltIChleGNsdWRpbmcNCi0gICAgICAgICAgICBkZWNsYXJhdG9yeSBqdWRnbWVudCBhY3Rpb25zKSBhZ2FpbnN0IEluaXRpYWwgRGV2ZWxvcGVyIG9yDQotICAgICAgICAgICAgYSBDb250cmlidXRvciAodGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9yIENvbnRyaWJ1dG9yIGFnYWluc3QNCi0gICAgICAgICAgICB3aG9tIFlvdSBhc3NlcnQgc3VjaCBjbGFpbSBpcyByZWZlcnJlZCB0byBhcyAiUGFydGljaXBhbnQiKQ0KLSAgICAgICAgICAgIGFsbGVnaW5nIHRoYXQgdGhlIFBhcnRpY2lwYW50IFNvZnR3YXJlIChtZWFuaW5nIHRoZQ0KLSAgICAgICAgICAgIENvbnRyaWJ1dG9yIFZlcnNpb24gd2hlcmUgdGhlIFBhcnRpY2lwYW50IGlzIGEgQ29udHJpYnV0b3INCi0gICAgICAgICAgICBvciB0aGUgT3JpZ2luYWwgU29mdHdhcmUgd2hlcmUgdGhlIFBhcnRpY2lwYW50IGlzIHRoZQ0KLSAgICAgICAgICAgIEluaXRpYWwgRGV2ZWxvcGVyKSBkaXJlY3RseSBvciBpbmRpcmVjdGx5IGluZnJpbmdlcyBhbnkNCi0gICAgICAgICAgICBwYXRlbnQsIHRoZW4gYW55IGFuZCBhbGwgcmlnaHRzIGdyYW50ZWQgZGlyZWN0bHkgb3INCi0gICAgICAgICAgICBpbmRpcmVjdGx5IHRvIFlvdSBieSBzdWNoIFBhcnRpY2lwYW50LCB0aGUgSW5pdGlhbA0KLSAgICAgICAgICAgIERldmVsb3BlciAoaWYgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGlzIG5vdCB0aGUgUGFydGljaXBhbnQpDQotICAgICAgICAgICAgYW5kIGFsbCBDb250cmlidXRvcnMgdW5kZXIgU2VjdGlvbnMgMi4xIGFuZC9vciAyLjIgb2YgdGhpcw0KLSAgICAgICAgICAgIExpY2Vuc2Ugc2hhbGwsIHVwb24gNjAgZGF5cyBub3RpY2UgZnJvbSBQYXJ0aWNpcGFudA0KLSAgICAgICAgICAgIHRlcm1pbmF0ZSBwcm9zcGVjdGl2ZWx5IGFuZCBhdXRvbWF0aWNhbGx5IGF0IHRoZSBleHBpcmF0aW9uDQotICAgICAgICAgICAgb2Ygc3VjaCA2MCBkYXkgbm90aWNlIHBlcmlvZCwgdW5sZXNzIGlmIHdpdGhpbiBzdWNoIDYwIGRheQ0KLSAgICAgICAgICAgIHBlcmlvZCBZb3Ugd2l0aGRyYXcgWW91ciBjbGFpbSB3aXRoIHJlc3BlY3QgdG8gdGhlDQotICAgICAgICAgICAgUGFydGljaXBhbnQgU29mdHdhcmUgYWdhaW5zdCBzdWNoIFBhcnRpY2lwYW50IGVpdGhlcg0KLSAgICAgICAgICAgIHVuaWxhdGVyYWxseSBvciBwdXJzdWFudCB0byBhIHdyaXR0ZW4gYWdyZWVtZW50IHdpdGgNCi0gICAgICAgICAgICBQYXJ0aWNpcGFudC4NCi0NCi0gICAgICAgICAgICA2LjMuIEluIHRoZSBldmVudCBvZiB0ZXJtaW5hdGlvbiB1bmRlciBTZWN0aW9ucyA2LjEgb3IgNi4yDQotICAgICAgICAgICAgYWJvdmUsIGFsbCBlbmQgdXNlciBsaWNlbnNlcyB0aGF0IGhhdmUgYmVlbiB2YWxpZGx5IGdyYW50ZWQNCi0gICAgICAgICAgICBieSBZb3Ugb3IgYW55IGRpc3RyaWJ1dG9yIGhlcmV1bmRlciBwcmlvciB0byB0ZXJtaW5hdGlvbg0KLSAgICAgICAgICAgIChleGNsdWRpbmcgbGljZW5zZXMgZ3JhbnRlZCB0byBZb3UgYnkgYW55IGRpc3RyaWJ1dG9yKQ0KLSAgICAgICAgICAgIHNoYWxsIHN1cnZpdmUgdGVybWluYXRpb24uDQotDQotICAgICAgNy4gTElNSVRBVElPTiBPRiBMSUFCSUxJVFkuDQotDQotICAgICAgVU5ERVIgTk8gQ0lSQ1VNU1RBTkNFUyBBTkQgVU5ERVIgTk8gTEVHQUwgVEhFT1JZLCBXSEVUSEVSIFRPUlQNCi0gICAgICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UpLCBDT05UUkFDVCwgT1IgT1RIRVJXSVNFLCBTSEFMTCBZT1UsIFRIRQ0KLSAgICAgIElOSVRJQUwgREVWRUxPUEVSLCBBTlkgT1RIRVIgQ09OVFJJQlVUT1IsIE9SIEFOWSBESVNUUklCVVRPUiBPRg0KLSAgICAgIENPVkVSRUQgU09GVFdBUkUsIE9SIEFOWSBTVVBQTElFUiBPRiBBTlkgT0YgU1VDSCBQQVJUSUVTLCBCRQ0KLSAgICAgIExJQUJMRSBUTyBBTlkgUEVSU09OIEZPUiBBTlkgSU5ESVJFQ1QsIFNQRUNJQUwsIElOQ0lERU5UQUwsIE9SDQotICAgICAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9GIEFOWSBDSEFSQUNURVIgSU5DTFVESU5HLCBXSVRIT1VUDQotICAgICAgTElNSVRBVElPTiwgREFNQUdFUyBGT1IgTE9TVCBQUk9GSVRTLCBMT1NTIE9GIEdPT0RXSUxMLCBXT1JLDQotICAgICAgU1RPUFBBR0UsIENPTVBVVEVSIEZBSUxVUkUgT1IgTUFMRlVOQ1RJT04sIE9SIEFOWSBBTkQgQUxMIE9USEVSDQotICAgICAgQ09NTUVSQ0lBTCBEQU1BR0VTIE9SIExPU1NFUywgRVZFTiBJRiBTVUNIIFBBUlRZIFNIQUxMIEhBVkUgQkVFTg0KLSAgICAgIElORk9STUVEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuIFRISVMgTElNSVRBVElPTiBPRg0KLSAgICAgIExJQUJJTElUWSBTSEFMTCBOT1QgQVBQTFkgVE8gTElBQklMSVRZIEZPUiBERUFUSCBPUiBQRVJTT05BTA0KLSAgICAgIElOSlVSWSBSRVNVTFRJTkcgRlJPTSBTVUNIIFBBUlRZ1VMgTkVHTElHRU5DRSBUTyBUSEUgRVhURU5UDQotICAgICAgQVBQTElDQUJMRSBMQVcgUFJPSElCSVRTIFNVQ0ggTElNSVRBVElPTi4gU09NRSBKVVJJU0RJQ1RJT05TIERPDQotICAgICAgTk9UIEFMTE9XIFRIRSBFWENMVVNJT04gT1IgTElNSVRBVElPTiBPRiBJTkNJREVOVEFMIE9SDQotICAgICAgQ09OU0VRVUVOVElBTCBEQU1BR0VTLCBTTyBUSElTIEVYQ0xVU0lPTiBBTkQgTElNSVRBVElPTiBNQVkgTk9UDQotICAgICAgQVBQTFkgVE8gWU9VLg0KLQ0KLSAgICAgIDguIFUuUy4gR09WRVJOTUVOVCBFTkQgVVNFUlMuDQotDQotICAgICAgVGhlIENvdmVyZWQgU29mdHdhcmUgaXMgYSAiY29tbWVyY2lhbCBpdGVtLCIgYXMgdGhhdCB0ZXJtIGlzDQotICAgICAgZGVmaW5lZCBpbiA0OCBDLkYuUi4gMi4xMDEgKE9jdC4gMTk5NSksIGNvbnNpc3Rpbmcgb2YgImNvbW1lcmNpYWwNCi0gICAgICBjb21wdXRlciBzb2Z0d2FyZSIgKGFzIHRoYXQgdGVybSBpcyBkZWZpbmVkIGF0IDQ4IEMuRi5SLiCkDQotICAgICAgMjUyLjIyNy03MDE0KGEpKDEpKSBhbmQgImNvbW1lcmNpYWwgY29tcHV0ZXIgc29mdHdhcmUNCi0gICAgICBkb2N1bWVudGF0aW9uIiBhcyBzdWNoIHRlcm1zIGFyZSB1c2VkIGluIDQ4IEMuRi5SLiAxMi4yMTIgKFNlcHQuDQotICAgICAgMTk5NSkuIENvbnNpc3RlbnQgd2l0aCA0OCBDLkYuUi4gMTIuMjEyIGFuZCA0OCBDLkYuUi4gMjI3LjcyMDItMQ0KLSAgICAgIHRocm91Z2ggMjI3LjcyMDItNCAoSnVuZSAxOTk1KSwgYWxsIFUuUy4gR292ZXJubWVudCBFbmQgVXNlcnMNCi0gICAgICBhY3F1aXJlIENvdmVyZWQgU29mdHdhcmUgd2l0aCBvbmx5IHRob3NlIHJpZ2h0cyBzZXQgZm9ydGggaGVyZWluLg0KLSAgICAgIFRoaXMgVS5TLiBHb3Zlcm5tZW50IFJpZ2h0cyBjbGF1c2UgaXMgaW4gbGlldSBvZiwgYW5kIHN1cGVyc2VkZXMsDQotICAgICAgYW55IG90aGVyIEZBUiwgREZBUiwgb3Igb3RoZXIgY2xhdXNlIG9yIHByb3Zpc2lvbiB0aGF0IGFkZHJlc3Nlcw0KLSAgICAgIEdvdmVybm1lbnQgcmlnaHRzIGluIGNvbXB1dGVyIHNvZnR3YXJlIHVuZGVyIHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICA5LiBNSVNDRUxMQU5FT1VTLg0KLQ0KLSAgICAgIFRoaXMgTGljZW5zZSByZXByZXNlbnRzIHRoZSBjb21wbGV0ZSBhZ3JlZW1lbnQgY29uY2VybmluZyBzdWJqZWN0DQotICAgICAgbWF0dGVyIGhlcmVvZi4gSWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgaGVsZCB0byBiZQ0KLSAgICAgIHVuZW5mb3JjZWFibGUsIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIG9ubHkgdG8gdGhlDQotICAgICAgZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIGl0IGVuZm9yY2VhYmxlLiBUaGlzIExpY2Vuc2Ugc2hhbGwgYmUNCi0gICAgICBnb3Zlcm5lZCBieSB0aGUgbGF3IG9mIHRoZSBqdXJpc2RpY3Rpb24gc3BlY2lmaWVkIGluIGEgbm90aWNlDQotICAgICAgY29udGFpbmVkIHdpdGhpbiB0aGUgT3JpZ2luYWwgU29mdHdhcmUgKGV4Y2VwdCB0byB0aGUgZXh0ZW50DQotICAgICAgYXBwbGljYWJsZSBsYXcsIGlmIGFueSwgcHJvdmlkZXMgb3RoZXJ3aXNlKSwgZXhjbHVkaW5nIHN1Y2gNCi0gICAgICBqdXJpc2RpY3Rpb27VcyBjb25mbGljdC1vZi1sYXcgcHJvdmlzaW9ucy4gQW55IGxpdGlnYXRpb24NCi0gICAgICByZWxhdGluZyB0byB0aGlzIExpY2Vuc2Ugc2hhbGwgYmUgc3ViamVjdCB0byB0aGUganVyaXNkaWN0aW9uIG9mDQotICAgICAgdGhlIGNvdXJ0cyBsb2NhdGVkIGluIHRoZSBqdXJpc2RpY3Rpb24gYW5kIHZlbnVlIHNwZWNpZmllZCBpbiBhDQotICAgICAgbm90aWNlIGNvbnRhaW5lZCB3aXRoaW4gdGhlIE9yaWdpbmFsIFNvZnR3YXJlLCB3aXRoIHRoZSBsb3NpbmcNCi0gICAgICBwYXJ0eSByZXNwb25zaWJsZSBmb3IgY29zdHMsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBjb3VydA0KLSAgICAgIGNvc3RzIGFuZCByZWFzb25hYmxlIGF0dG9ybmV5c9UgZmVlcyBhbmQgZXhwZW5zZXMuIFRoZQ0KLSAgICAgIGFwcGxpY2F0aW9uIG9mIHRoZSBVbml0ZWQgTmF0aW9ucyBDb252ZW50aW9uIG9uIENvbnRyYWN0cyBmb3IgdGhlDQotICAgICAgSW50ZXJuYXRpb25hbCBTYWxlIG9mIEdvb2RzIGlzIGV4cHJlc3NseSBleGNsdWRlZC4gQW55IGxhdyBvcg0KLSAgICAgIHJlZ3VsYXRpb24gd2hpY2ggcHJvdmlkZXMgdGhhdCB0aGUgbGFuZ3VhZ2Ugb2YgYSBjb250cmFjdCBzaGFsbA0KLSAgICAgIGJlIGNvbnN0cnVlZCBhZ2FpbnN0IHRoZSBkcmFmdGVyIHNoYWxsIG5vdCBhcHBseSB0byB0aGlzIExpY2Vuc2UuDQotICAgICAgWW91IGFncmVlIHRoYXQgWW91IGFsb25lIGFyZSByZXNwb25zaWJsZSBmb3IgY29tcGxpYW5jZSB3aXRoIHRoZQ0KLSAgICAgIFVuaXRlZCBTdGF0ZXMgZXhwb3J0IGFkbWluaXN0cmF0aW9uIHJlZ3VsYXRpb25zIChhbmQgdGhlIGV4cG9ydA0KLSAgICAgIGNvbnRyb2wgbGF3cyBhbmQgcmVndWxhdGlvbiBvZiBhbnkgb3RoZXIgY291bnRyaWVzKSB3aGVuIFlvdSB1c2UsDQotICAgICAgZGlzdHJpYnV0ZSBvciBvdGhlcndpc2UgbWFrZSBhdmFpbGFibGUgYW55IENvdmVyZWQgU29mdHdhcmUuDQotDQotICAgICAgMTAuIFJFU1BPTlNJQklMSVRZIEZPUiBDTEFJTVMuDQotDQotICAgICAgQXMgYmV0d2VlbiBJbml0aWFsIERldmVsb3BlciBhbmQgdGhlIENvbnRyaWJ1dG9ycywgZWFjaCBwYXJ0eSBpcw0KLSAgICAgIHJlc3BvbnNpYmxlIGZvciBjbGFpbXMgYW5kIGRhbWFnZXMgYXJpc2luZywgZGlyZWN0bHkgb3INCi0gICAgICBpbmRpcmVjdGx5LCBvdXQgb2YgaXRzIHV0aWxpemF0aW9uIG9mIHJpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2UNCi0gICAgICBhbmQgWW91IGFncmVlIHRvIHdvcmsgd2l0aCBJbml0aWFsIERldmVsb3BlciBhbmQgQ29udHJpYnV0b3JzIHRvDQotICAgICAgZGlzdHJpYnV0ZSBzdWNoIHJlc3BvbnNpYmlsaXR5IG9uIGFuIGVxdWl0YWJsZSBiYXNpcy4gTm90aGluZw0KLSAgICAgIGhlcmVpbiBpcyBpbnRlbmRlZCBvciBzaGFsbCBiZSBkZWVtZWQgdG8gY29uc3RpdHV0ZSBhbnkgYWRtaXNzaW9uDQotICAgICAgb2YgbGlhYmlsaXR5Lg0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9sZWdhbC9qYXhiLXhqYy1MSUNFTlNFLnR4dCBiL3YxLjUuMVJDMy9sZWdhbC9qYXhiLXhqYy1MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdkZWJmOC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbGVnYWwvamF4Yi14amMtTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwzODQgKzAsMCBAQAotQ09NTU9OIERFVkVMT1BNRU5UIEFORCBESVNUUklCVVRJT04gTElDRU5TRSAoQ0RETCkgVmVyc2lvbiAxLjANCi0NCi0NCi0gICAgICAxLiBEZWZpbml0aW9ucy4NCi0NCi0gICAgICAgICAgICAxLjEuICJDb250cmlidXRvciIgbWVhbnMgZWFjaCBpbmRpdmlkdWFsIG9yIGVudGl0eSB0aGF0DQotICAgICAgICAgICAgY3JlYXRlcyBvciBjb250cmlidXRlcyB0byB0aGUgY3JlYXRpb24gb2YgTW9kaWZpY2F0aW9ucy4NCi0NCi0gICAgICAgICAgICAxLjIuICJDb250cmlidXRvciBWZXJzaW9uIiBtZWFucyB0aGUgY29tYmluYXRpb24gb2YgdGhlDQotICAgICAgICAgICAgT3JpZ2luYWwgU29mdHdhcmUsIHByaW9yIE1vZGlmaWNhdGlvbnMgdXNlZCBieSBhDQotICAgICAgICAgICAgQ29udHJpYnV0b3IgKGlmIGFueSksIGFuZCB0aGUgTW9kaWZpY2F0aW9ucyBtYWRlIGJ5IHRoYXQNCi0gICAgICAgICAgICBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLg0KLQ0KLSAgICAgICAgICAgIDEuMy4gIkNvdmVyZWQgU29mdHdhcmUiIG1lYW5zIChhKSB0aGUgT3JpZ2luYWwgU29mdHdhcmUsIG9yDQotICAgICAgICAgICAgKGIpIE1vZGlmaWNhdGlvbnMsIG9yIChjKSB0aGUgY29tYmluYXRpb24gb2YgZmlsZXMNCi0gICAgICAgICAgICBjb250YWluaW5nIE9yaWdpbmFsIFNvZnR3YXJlIHdpdGggZmlsZXMgY29udGFpbmluZw0KLSAgICAgICAgICAgIE1vZGlmaWNhdGlvbnMsIGluIGVhY2ggY2FzZSBpbmNsdWRpbmcgcG9ydGlvbnMgdGhlcmVvZi4NCi0NCi0gICAgICAgICAgICAxLjQuICJFeGVjdXRhYmxlIiBtZWFucyB0aGUgQ292ZXJlZCBTb2Z0d2FyZSBpbiBhbnkgZm9ybQ0KLSAgICAgICAgICAgIG90aGVyIHRoYW4gU291cmNlIENvZGUuIA0KLQ0KLSAgICAgICAgICAgIDEuNS4gIkluaXRpYWwgRGV2ZWxvcGVyIiBtZWFucyB0aGUgaW5kaXZpZHVhbCBvciBlbnRpdHkNCi0gICAgICAgICAgICB0aGF0IGZpcnN0IG1ha2VzIE9yaWdpbmFsIFNvZnR3YXJlIGF2YWlsYWJsZSB1bmRlciB0aGlzDQotICAgICAgICAgICAgTGljZW5zZS4gDQotICAgICAgICAgICAgDQotICAgICAgICAgICAgMS42LiAiTGFyZ2VyIFdvcmsiIG1lYW5zIGEgd29yayB3aGljaCBjb21iaW5lcyBDb3ZlcmVkDQotICAgICAgICAgICAgU29mdHdhcmUgb3IgcG9ydGlvbnMgdGhlcmVvZiB3aXRoIGNvZGUgbm90IGdvdmVybmVkIGJ5IHRoZQ0KLSAgICAgICAgICAgIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAgICAgICAxLjcuICJMaWNlbnNlIiBtZWFucyB0aGlzIGRvY3VtZW50Lg0KLQ0KLSAgICAgICAgICAgIDEuOC4gIkxpY2Vuc2FibGUiIG1lYW5zIGhhdmluZyB0aGUgcmlnaHQgdG8gZ3JhbnQsIHRvIHRoZQ0KLSAgICAgICAgICAgIG1heGltdW0gZXh0ZW50IHBvc3NpYmxlLCB3aGV0aGVyIGF0IHRoZSB0aW1lIG9mIHRoZSBpbml0aWFsDQotICAgICAgICAgICAgZ3JhbnQgb3Igc3Vic2VxdWVudGx5IGFjcXVpcmVkLCBhbnkgYW5kIGFsbCBvZiB0aGUgcmlnaHRzDQotICAgICAgICAgICAgY29udmV5ZWQgaGVyZWluLg0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIDEuOS4gIk1vZGlmaWNhdGlvbnMiIG1lYW5zIHRoZSBTb3VyY2UgQ29kZSBhbmQgRXhlY3V0YWJsZQ0KLSAgICAgICAgICAgIGZvcm0gb2YgYW55IG9mIHRoZSBmb2xsb3dpbmc6IA0KLQ0KLSAgICAgICAgICAgICAgICAgIEEuIEFueSBmaWxlIHRoYXQgcmVzdWx0cyBmcm9tIGFuIGFkZGl0aW9uIHRvLA0KLSAgICAgICAgICAgICAgICAgIGRlbGV0aW9uIGZyb20gb3IgbW9kaWZpY2F0aW9uIG9mIHRoZSBjb250ZW50cyBvZiBhDQotICAgICAgICAgICAgICAgICAgZmlsZSBjb250YWluaW5nIE9yaWdpbmFsIFNvZnR3YXJlIG9yIHByZXZpb3VzDQotICAgICAgICAgICAgICAgICAgTW9kaWZpY2F0aW9uczsgDQotDQotICAgICAgICAgICAgICAgICAgQi4gQW55IG5ldyBmaWxlIHRoYXQgY29udGFpbnMgYW55IHBhcnQgb2YgdGhlDQotICAgICAgICAgICAgICAgICAgT3JpZ2luYWwgU29mdHdhcmUgb3IgcHJldmlvdXMgTW9kaWZpY2F0aW9uOyBvciANCi0NCi0gICAgICAgICAgICAgICAgICBDLiBBbnkgbmV3IGZpbGUgdGhhdCBpcyBjb250cmlidXRlZCBvciBvdGhlcndpc2UgbWFkZQ0KLSAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgICAgICAgICAgIDEuMTAuICJPcmlnaW5hbCBTb2Z0d2FyZSIgbWVhbnMgdGhlIFNvdXJjZSBDb2RlIGFuZA0KLSAgICAgICAgICAgIEV4ZWN1dGFibGUgZm9ybSBvZiBjb21wdXRlciBzb2Z0d2FyZSBjb2RlIHRoYXQgaXMNCi0gICAgICAgICAgICBvcmlnaW5hbGx5IHJlbGVhc2VkIHVuZGVyIHRoaXMgTGljZW5zZS4gDQotDQotICAgICAgICAgICAgMS4xMS4gIlBhdGVudCBDbGFpbXMiIG1lYW5zIGFueSBwYXRlbnQgY2xhaW0ocyksIG5vdyBvd25lZA0KLSAgICAgICAgICAgIG9yIGhlcmVhZnRlciBhY3F1aXJlZCwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiwNCi0gICAgICAgICAgICBtZXRob2QsIHByb2Nlc3MsIGFuZCBhcHBhcmF0dXMgY2xhaW1zLCBpbiBhbnkgcGF0ZW50DQotICAgICAgICAgICAgTGljZW5zYWJsZSBieSBncmFudG9yLiANCi0NCi0gICAgICAgICAgICAxLjEyLiAiU291cmNlIENvZGUiIG1lYW5zIChhKSB0aGUgY29tbW9uIGZvcm0gb2YgY29tcHV0ZXINCi0gICAgICAgICAgICBzb2Z0d2FyZSBjb2RlIGluIHdoaWNoIG1vZGlmaWNhdGlvbnMgYXJlIG1hZGUgYW5kIChiKQ0KLSAgICAgICAgICAgIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCBpbiBvciB3aXRoIHN1Y2ggY29kZS4NCi0NCi0gICAgICAgICAgICAxLjEzLiAiWW91IiAob3IgIllvdXIiKSBtZWFucyBhbiBpbmRpdmlkdWFsIG9yIGEgbGVnYWwNCi0gICAgICAgICAgICBlbnRpdHkgZXhlcmNpc2luZyByaWdodHMgdW5kZXIsIGFuZCBjb21wbHlpbmcgd2l0aCBhbGwgb2YNCi0gICAgICAgICAgICB0aGUgdGVybXMgb2YsIHRoaXMgTGljZW5zZS4gRm9yIGxlZ2FsIGVudGl0aWVzLCAiWW91Ig0KLSAgICAgICAgICAgIGluY2x1ZGVzIGFueSBlbnRpdHkgd2hpY2ggY29udHJvbHMsIGlzIGNvbnRyb2xsZWQgYnksIG9yIGlzDQotICAgICAgICAgICAgdW5kZXIgY29tbW9uIGNvbnRyb2wgd2l0aCBZb3UuIEZvciBwdXJwb3NlcyBvZiB0aGlzDQotICAgICAgICAgICAgZGVmaW5pdGlvbiwgImNvbnRyb2wiIG1lYW5zIChhKSB0aGUgcG93ZXIsIGRpcmVjdCBvcg0KLSAgICAgICAgICAgIGluZGlyZWN0LCB0byBjYXVzZSB0aGUgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaA0KLSAgICAgICAgICAgIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvciBvdGhlcndpc2UsIG9yIChiKSBvd25lcnNoaXANCi0gICAgICAgICAgICBvZiBtb3JlIHRoYW4gZmlmdHkgcGVyY2VudCAoNTAlKSBvZiB0aGUgb3V0c3RhbmRpbmcgc2hhcmVzDQotICAgICAgICAgICAgb3IgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuDQotDQotICAgICAgMi4gTGljZW5zZSBHcmFudHMuIA0KLQ0KLSAgICAgICAgICAgIDIuMS4gVGhlIEluaXRpYWwgRGV2ZWxvcGVyIEdyYW50Lg0KLQ0KLSAgICAgICAgICAgIENvbmRpdGlvbmVkIHVwb24gWW91ciBjb21wbGlhbmNlIHdpdGggU2VjdGlvbiAzLjEgYmVsb3cgYW5kDQotICAgICAgICAgICAgc3ViamVjdCB0byB0aGlyZCBwYXJ0eSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgY2xhaW1zLCB0aGUNCi0gICAgICAgICAgICBJbml0aWFsIERldmVsb3BlciBoZXJlYnkgZ3JhbnRzIFlvdSBhIHdvcmxkLXdpZGUsDQotICAgICAgICAgICAgcm95YWx0eS1mcmVlLCBub24tZXhjbHVzaXZlIGxpY2Vuc2U6IA0KLQ0KLSAgICAgICAgICAgICAgICAgIChhKSB1bmRlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIChvdGhlciB0aGFuDQotICAgICAgICAgICAgICAgICAgcGF0ZW50IG9yIHRyYWRlbWFyaykgTGljZW5zYWJsZSBieSBJbml0aWFsIERldmVsb3BlciwNCi0gICAgICAgICAgICAgICAgICB0byB1c2UsIHJlcHJvZHVjZSwgbW9kaWZ5LCBkaXNwbGF5LCBwZXJmb3JtLA0KLSAgICAgICAgICAgICAgICAgIHN1YmxpY2Vuc2UgYW5kIGRpc3RyaWJ1dGUgdGhlIE9yaWdpbmFsIFNvZnR3YXJlIChvcg0KLSAgICAgICAgICAgICAgICAgIHBvcnRpb25zIHRoZXJlb2YpLCB3aXRoIG9yIHdpdGhvdXQgTW9kaWZpY2F0aW9ucywNCi0gICAgICAgICAgICAgICAgICBhbmQvb3IgYXMgcGFydCBvZiBhIExhcmdlciBXb3JrOyBhbmQgDQotDQotICAgICAgICAgICAgICAgICAgKGIpIHVuZGVyIFBhdGVudCBDbGFpbXMgaW5mcmluZ2VkIGJ5IHRoZSBtYWtpbmcsDQotICAgICAgICAgICAgICAgICAgdXNpbmcgb3Igc2VsbGluZyBvZiBPcmlnaW5hbCBTb2Z0d2FyZSwgdG8gbWFrZSwgaGF2ZQ0KLSAgICAgICAgICAgICAgICAgIG1hZGUsIHVzZSwgcHJhY3RpY2UsIHNlbGwsIGFuZCBvZmZlciBmb3Igc2FsZSwgYW5kL29yDQotICAgICAgICAgICAgICAgICAgb3RoZXJ3aXNlIGRpc3Bvc2Ugb2YgdGhlIE9yaWdpbmFsIFNvZnR3YXJlIChvcg0KLSAgICAgICAgICAgICAgICAgIHBvcnRpb25zIHRoZXJlb2YpLiANCi0NCi0gICAgICAgICAgICAgICAgICAoYykgVGhlIGxpY2Vuc2VzIGdyYW50ZWQgaW4gU2VjdGlvbnMgMi4xKGEpIGFuZCAoYikNCi0gICAgICAgICAgICAgICAgICBhcmUgZWZmZWN0aXZlIG9uIHRoZSBkYXRlIEluaXRpYWwgRGV2ZWxvcGVyIGZpcnN0DQotICAgICAgICAgICAgICAgICAgZGlzdHJpYnV0ZXMgb3Igb3RoZXJ3aXNlIG1ha2VzIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZQ0KLSAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZSB0byBhIHRoaXJkIHBhcnR5IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzDQotICAgICAgICAgICAgICAgICAgTGljZW5zZS4gDQotDQotICAgICAgICAgICAgICAgICAgKGQpIE5vdHdpdGhzdGFuZGluZyBTZWN0aW9uIDIuMShiKSBhYm92ZSwgbm8gcGF0ZW50DQotICAgICAgICAgICAgICAgICAgbGljZW5zZSBpcyBncmFudGVkOiAoMSkgZm9yIGNvZGUgdGhhdCBZb3UgZGVsZXRlIGZyb20NCi0gICAgICAgICAgICAgICAgICB0aGUgT3JpZ2luYWwgU29mdHdhcmUsIG9yICgyKSBmb3IgaW5mcmluZ2VtZW50cw0KLSAgICAgICAgICAgICAgICAgIGNhdXNlZCBieTogKGkpIHRoZSBtb2RpZmljYXRpb24gb2YgdGhlIE9yaWdpbmFsDQotICAgICAgICAgICAgICAgICAgU29mdHdhcmUsIG9yIChpaSkgdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSBPcmlnaW5hbA0KLSAgICAgICAgICAgICAgICAgIFNvZnR3YXJlIHdpdGggb3RoZXIgc29mdHdhcmUgb3IgZGV2aWNlcy4gDQotDQotICAgICAgICAgICAgMi4yLiBDb250cmlidXRvciBHcmFudC4NCi0NCi0gICAgICAgICAgICBDb25kaXRpb25lZCB1cG9uIFlvdXIgY29tcGxpYW5jZSB3aXRoIFNlY3Rpb24gMy4xIGJlbG93IGFuZA0KLSAgICAgICAgICAgIHN1YmplY3QgdG8gdGhpcmQgcGFydHkgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGNsYWltcywgZWFjaA0KLSAgICAgICAgICAgIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgWW91IGEgd29ybGQtd2lkZSwgcm95YWx0eS1mcmVlLA0KLSAgICAgICAgICAgIG5vbi1leGNsdXNpdmUgbGljZW5zZToNCi0NCi0gICAgICAgICAgICAgICAgICAoYSkgdW5kZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyAob3RoZXIgdGhhbg0KLSAgICAgICAgICAgICAgICAgIHBhdGVudCBvciB0cmFkZW1hcmspIExpY2Vuc2FibGUgYnkgQ29udHJpYnV0b3IgdG8NCi0gICAgICAgICAgICAgICAgICB1c2UsIHJlcHJvZHVjZSwgbW9kaWZ5LCBkaXNwbGF5LCBwZXJmb3JtLCBzdWJsaWNlbnNlDQotICAgICAgICAgICAgICAgICAgYW5kIGRpc3RyaWJ1dGUgdGhlIE1vZGlmaWNhdGlvbnMgY3JlYXRlZCBieSBzdWNoDQotICAgICAgICAgICAgICAgICAgQ29udHJpYnV0b3IgKG9yIHBvcnRpb25zIHRoZXJlb2YpLCBlaXRoZXIgb24gYW4NCi0gICAgICAgICAgICAgICAgICB1bm1vZGlmaWVkIGJhc2lzLCB3aXRoIG90aGVyIE1vZGlmaWNhdGlvbnMsIGFzDQotICAgICAgICAgICAgICAgICAgQ292ZXJlZCBTb2Z0d2FyZSBhbmQvb3IgYXMgcGFydCBvZiBhIExhcmdlciBXb3JrOyBhbmQNCi0gICAgICAgICAgICAgICAgICANCi0NCi0gICAgICAgICAgICAgICAgICAoYikgdW5kZXIgUGF0ZW50IENsYWltcyBpbmZyaW5nZWQgYnkgdGhlIG1ha2luZywNCi0gICAgICAgICAgICAgICAgICB1c2luZywgb3Igc2VsbGluZyBvZiBNb2RpZmljYXRpb25zIG1hZGUgYnkgdGhhdA0KLSAgICAgICAgICAgICAgICAgIENvbnRyaWJ1dG9yIGVpdGhlciBhbG9uZSBhbmQvb3IgaW4gY29tYmluYXRpb24gd2l0aA0KLSAgICAgICAgICAgICAgICAgIGl0cyBDb250cmlidXRvciBWZXJzaW9uIChvciBwb3J0aW9ucyBvZiBzdWNoDQotICAgICAgICAgICAgICAgICAgY29tYmluYXRpb24pLCB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIGZvciBzYWxlLA0KLSAgICAgICAgICAgICAgICAgIGhhdmUgbWFkZSwgYW5kL29yIG90aGVyd2lzZSBkaXNwb3NlIG9mOiAoMSkNCi0gICAgICAgICAgICAgICAgICBNb2RpZmljYXRpb25zIG1hZGUgYnkgdGhhdCBDb250cmlidXRvciAob3IgcG9ydGlvbnMNCi0gICAgICAgICAgICAgICAgICB0aGVyZW9mKTsgYW5kICgyKSB0aGUgY29tYmluYXRpb24gb2YgTW9kaWZpY2F0aW9ucw0KLSAgICAgICAgICAgICAgICAgIG1hZGUgYnkgdGhhdCBDb250cmlidXRvciB3aXRoIGl0cyBDb250cmlidXRvciBWZXJzaW9uDQotICAgICAgICAgICAgICAgICAgKG9yIHBvcnRpb25zIG9mIHN1Y2ggY29tYmluYXRpb24pLiANCi0NCi0gICAgICAgICAgICAgICAgICAoYykgVGhlIGxpY2Vuc2VzIGdyYW50ZWQgaW4gU2VjdGlvbnMgMi4yKGEpIGFuZA0KLSAgICAgICAgICAgICAgICAgIDIuMihiKSBhcmUgZWZmZWN0aXZlIG9uIHRoZSBkYXRlIENvbnRyaWJ1dG9yIGZpcnN0DQotICAgICAgICAgICAgICAgICAgZGlzdHJpYnV0ZXMgb3Igb3RoZXJ3aXNlIG1ha2VzIHRoZSBNb2RpZmljYXRpb25zDQotICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlIHRvIGEgdGhpcmQgcGFydHkuIA0KLQ0KLSAgICAgICAgICAgICAgICAgIChkKSBOb3R3aXRoc3RhbmRpbmcgU2VjdGlvbiAyLjIoYikgYWJvdmUsIG5vIHBhdGVudA0KLSAgICAgICAgICAgICAgICAgIGxpY2Vuc2UgaXMgZ3JhbnRlZDogKDEpIGZvciBhbnkgY29kZSB0aGF0IENvbnRyaWJ1dG9yDQotICAgICAgICAgICAgICAgICAgaGFzIGRlbGV0ZWQgZnJvbSB0aGUgQ29udHJpYnV0b3IgVmVyc2lvbjsgKDIpIGZvcg0KLSAgICAgICAgICAgICAgICAgIGluZnJpbmdlbWVudHMgY2F1c2VkIGJ5OiAoaSkgdGhpcmQgcGFydHkNCi0gICAgICAgICAgICAgICAgICBtb2RpZmljYXRpb25zIG9mIENvbnRyaWJ1dG9yIFZlcnNpb24sIG9yIChpaSkgdGhlDQotICAgICAgICAgICAgICAgICAgY29tYmluYXRpb24gb2YgTW9kaWZpY2F0aW9ucyBtYWRlIGJ5IHRoYXQgQ29udHJpYnV0b3INCi0gICAgICAgICAgICAgICAgICB3aXRoIG90aGVyIHNvZnR3YXJlIChleGNlcHQgYXMgcGFydCBvZiB0aGUNCi0gICAgICAgICAgICAgICAgICBDb250cmlidXRvciBWZXJzaW9uKSBvciBvdGhlciBkZXZpY2VzOyBvciAoMykgdW5kZXINCi0gICAgICAgICAgICAgICAgICBQYXRlbnQgQ2xhaW1zIGluZnJpbmdlZCBieSBDb3ZlcmVkIFNvZnR3YXJlIGluIHRoZQ0KLSAgICAgICAgICAgICAgICAgIGFic2VuY2Ugb2YgTW9kaWZpY2F0aW9ucyBtYWRlIGJ5IHRoYXQgQ29udHJpYnV0b3IuIA0KLQ0KLSAgICAgIDMuIERpc3RyaWJ1dGlvbiBPYmxpZ2F0aW9ucy4NCi0NCi0gICAgICAgICAgICAzLjEuIEF2YWlsYWJpbGl0eSBvZiBTb3VyY2UgQ29kZS4NCi0NCi0gICAgICAgICAgICBBbnkgQ292ZXJlZCBTb2Z0d2FyZSB0aGF0IFlvdSBkaXN0cmlidXRlIG9yIG90aGVyd2lzZSBtYWtlDQotICAgICAgICAgICAgYXZhaWxhYmxlIGluIEV4ZWN1dGFibGUgZm9ybSBtdXN0IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgaW4NCi0gICAgICAgICAgICBTb3VyY2UgQ29kZSBmb3JtIGFuZCB0aGF0IFNvdXJjZSBDb2RlIGZvcm0gbXVzdCBiZQ0KLSAgICAgICAgICAgIGRpc3RyaWJ1dGVkIG9ubHkgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4gWW91IG11c3QNCi0gICAgICAgICAgICBpbmNsdWRlIGEgY29weSBvZiB0aGlzIExpY2Vuc2Ugd2l0aCBldmVyeSBjb3B5IG9mIHRoZQ0KLSAgICAgICAgICAgIFNvdXJjZSBDb2RlIGZvcm0gb2YgdGhlIENvdmVyZWQgU29mdHdhcmUgWW91IGRpc3RyaWJ1dGUgb3INCi0gICAgICAgICAgICBvdGhlcndpc2UgbWFrZSBhdmFpbGFibGUuIFlvdSBtdXN0IGluZm9ybSByZWNpcGllbnRzIG9mIGFueQ0KLSAgICAgICAgICAgIHN1Y2ggQ292ZXJlZCBTb2Z0d2FyZSBpbiBFeGVjdXRhYmxlIGZvcm0gYXMgdG8gaG93IHRoZXkgY2FuDQotICAgICAgICAgICAgb2J0YWluIHN1Y2ggQ292ZXJlZCBTb2Z0d2FyZSBpbiBTb3VyY2UgQ29kZSBmb3JtIGluIGENCi0gICAgICAgICAgICByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQNCi0gICAgICAgICAgICBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuDQotDQotICAgICAgICAgICAgMy4yLiBNb2RpZmljYXRpb25zLg0KLQ0KLSAgICAgICAgICAgIFRoZSBNb2RpZmljYXRpb25zIHRoYXQgWW91IGNyZWF0ZSBvciB0byB3aGljaCBZb3UNCi0gICAgICAgICAgICBjb250cmlidXRlIGFyZSBnb3Zlcm5lZCBieSB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLiBZb3UNCi0gICAgICAgICAgICByZXByZXNlbnQgdGhhdCBZb3UgYmVsaWV2ZSBZb3VyIE1vZGlmaWNhdGlvbnMgYXJlIFlvdXINCi0gICAgICAgICAgICBvcmlnaW5hbCBjcmVhdGlvbihzKSBhbmQvb3IgWW91IGhhdmUgc3VmZmljaWVudCByaWdodHMgdG8NCi0gICAgICAgICAgICBncmFudCB0aGUgcmlnaHRzIGNvbnZleWVkIGJ5IHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAgICAgICAzLjMuIFJlcXVpcmVkIE5vdGljZXMuDQotDQotICAgICAgICAgICAgWW91IG11c3QgaW5jbHVkZSBhIG5vdGljZSBpbiBlYWNoIG9mIFlvdXIgTW9kaWZpY2F0aW9ucw0KLSAgICAgICAgICAgIHRoYXQgaWRlbnRpZmllcyBZb3UgYXMgdGhlIENvbnRyaWJ1dG9yIG9mIHRoZSBNb2RpZmljYXRpb24uDQotICAgICAgICAgICAgWW91IG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueSBjb3B5cmlnaHQsIHBhdGVudCBvcg0KLSAgICAgICAgICAgIHRyYWRlbWFyayBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIENvdmVyZWQgU29mdHdhcmUsIG9yDQotICAgICAgICAgICAgYW55IG5vdGljZXMgb2YgbGljZW5zaW5nIG9yIGFueSBkZXNjcmlwdGl2ZSB0ZXh0IGdpdmluZw0KLSAgICAgICAgICAgIGF0dHJpYnV0aW9uIHRvIGFueSBDb250cmlidXRvciBvciB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuDQotDQotICAgICAgICAgICAgMy40LiBBcHBsaWNhdGlvbiBvZiBBZGRpdGlvbmFsIFRlcm1zLg0KLQ0KLSAgICAgICAgICAgIFlvdSBtYXkgbm90IG9mZmVyIG9yIGltcG9zZSBhbnkgdGVybXMgb24gYW55IENvdmVyZWQNCi0gICAgICAgICAgICBTb2Z0d2FyZSBpbiBTb3VyY2UgQ29kZSBmb3JtIHRoYXQgYWx0ZXJzIG9yIHJlc3RyaWN0cyB0aGUNCi0gICAgICAgICAgICBhcHBsaWNhYmxlIHZlcnNpb24gb2YgdGhpcyBMaWNlbnNlIG9yIHRoZSByZWNpcGllbnRz1Q0KLSAgICAgICAgICAgIHJpZ2h0cyBoZXJldW5kZXIuIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLCBhbmQgdG8gY2hhcmdlIGENCi0gICAgICAgICAgICBmZWUgZm9yLCB3YXJyYW50eSwgc3VwcG9ydCwgaW5kZW1uaXR5IG9yIGxpYWJpbGl0eQ0KLSAgICAgICAgICAgIG9ibGlnYXRpb25zIHRvIG9uZSBvciBtb3JlIHJlY2lwaWVudHMgb2YgQ292ZXJlZCBTb2Z0d2FyZS4NCi0gICAgICAgICAgICBIb3dldmVyLCB5b3UgbWF5IGRvIHNvIG9ubHkgb24gWW91ciBvd24gYmVoYWxmLCBhbmQgbm90IG9uDQotICAgICAgICAgICAgYmVoYWxmIG9mIHRoZSBJbml0aWFsIERldmVsb3BlciBvciBhbnkgQ29udHJpYnV0b3IuIFlvdQ0KLSAgICAgICAgICAgIG11c3QgbWFrZSBpdCBhYnNvbHV0ZWx5IGNsZWFyIHRoYXQgYW55IHN1Y2ggd2FycmFudHksDQotICAgICAgICAgICAgc3VwcG9ydCwgaW5kZW1uaXR5IG9yIGxpYWJpbGl0eSBvYmxpZ2F0aW9uIGlzIG9mZmVyZWQgYnkNCi0gICAgICAgICAgICBZb3UgYWxvbmUsIGFuZCBZb3UgaGVyZWJ5IGFncmVlIHRvIGluZGVtbmlmeSB0aGUgSW5pdGlhbA0KLSAgICAgICAgICAgIERldmVsb3BlciBhbmQgZXZlcnkgQ29udHJpYnV0b3IgZm9yIGFueSBsaWFiaWxpdHkgaW5jdXJyZWQNCi0gICAgICAgICAgICBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgb3Igc3VjaCBDb250cmlidXRvciBhcyBhIHJlc3VsdCBvZg0KLSAgICAgICAgICAgIHdhcnJhbnR5LCBzdXBwb3J0LCBpbmRlbW5pdHkgb3IgbGlhYmlsaXR5IHRlcm1zIFlvdSBvZmZlci4NCi0gICAgICAgICAgDQotDQotICAgICAgICAgICAgMy41LiBEaXN0cmlidXRpb24gb2YgRXhlY3V0YWJsZSBWZXJzaW9ucy4NCi0NCi0gICAgICAgICAgICBZb3UgbWF5IGRpc3RyaWJ1dGUgdGhlIEV4ZWN1dGFibGUgZm9ybSBvZiB0aGUgQ292ZXJlZA0KLSAgICAgICAgICAgIFNvZnR3YXJlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2Ugb3IgdW5kZXIgdGhlIHRlcm1zDQotICAgICAgICAgICAgb2YgYSBsaWNlbnNlIG9mIFlvdXIgY2hvaWNlLCB3aGljaCBtYXkgY29udGFpbiB0ZXJtcw0KLSAgICAgICAgICAgIGRpZmZlcmVudCBmcm9tIHRoaXMgTGljZW5zZSwgcHJvdmlkZWQgdGhhdCBZb3UgYXJlIGluDQotICAgICAgICAgICAgY29tcGxpYW5jZSB3aXRoIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UgYW5kIHRoYXQgdGhlDQotICAgICAgICAgICAgbGljZW5zZSBmb3IgdGhlIEV4ZWN1dGFibGUgZm9ybSBkb2VzIG5vdCBhdHRlbXB0IHRvIGxpbWl0DQotICAgICAgICAgICAgb3IgYWx0ZXIgdGhlIHJlY2lwaWVudNVzIHJpZ2h0cyBpbiB0aGUgU291cmNlIENvZGUgZm9ybQ0KLSAgICAgICAgICAgIGZyb20gdGhlIHJpZ2h0cyBzZXQgZm9ydGggaW4gdGhpcyBMaWNlbnNlLiBJZiBZb3UNCi0gICAgICAgICAgICBkaXN0cmlidXRlIHRoZSBDb3ZlcmVkIFNvZnR3YXJlIGluIEV4ZWN1dGFibGUgZm9ybSB1bmRlciBhDQotICAgICAgICAgICAgZGlmZmVyZW50IGxpY2Vuc2UsIFlvdSBtdXN0IG1ha2UgaXQgYWJzb2x1dGVseSBjbGVhciB0aGF0DQotICAgICAgICAgICAgYW55IHRlcm1zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgTGljZW5zZSBhcmUgb2ZmZXJlZCBieSBZb3UNCi0gICAgICAgICAgICBhbG9uZSwgbm90IGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBvciBDb250cmlidXRvci4gWW91DQotICAgICAgICAgICAgaGVyZWJ5IGFncmVlIHRvIGluZGVtbmlmeSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYW5kIGV2ZXJ5DQotICAgICAgICAgICAgQ29udHJpYnV0b3IgZm9yIGFueSBsaWFiaWxpdHkgaW5jdXJyZWQgYnkgdGhlIEluaXRpYWwNCi0gICAgICAgICAgICBEZXZlbG9wZXIgb3Igc3VjaCBDb250cmlidXRvciBhcyBhIHJlc3VsdCBvZiBhbnkgc3VjaCB0ZXJtcw0KLSAgICAgICAgICAgIFlvdSBvZmZlci4NCi0NCi0gICAgICAgICAgICAzLjYuIExhcmdlciBXb3Jrcy4NCi0NCi0gICAgICAgICAgICBZb3UgbWF5IGNyZWF0ZSBhIExhcmdlciBXb3JrIGJ5IGNvbWJpbmluZyBDb3ZlcmVkIFNvZnR3YXJlDQotICAgICAgICAgICAgd2l0aCBvdGhlciBjb2RlIG5vdCBnb3Zlcm5lZCBieSB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlDQotICAgICAgICAgICAgYW5kIGRpc3RyaWJ1dGUgdGhlIExhcmdlciBXb3JrIGFzIGEgc2luZ2xlIHByb2R1Y3QuIEluIHN1Y2gNCi0gICAgICAgICAgICBhIGNhc2UsIFlvdSBtdXN0IG1ha2Ugc3VyZSB0aGUgcmVxdWlyZW1lbnRzIG9mIHRoaXMgTGljZW5zZQ0KLSAgICAgICAgICAgIGFyZSBmdWxmaWxsZWQgZm9yIHRoZSBDb3ZlcmVkIFNvZnR3YXJlLiANCi0gICAgICAgICAgICANCi0gICAgICA0LiBWZXJzaW9ucyBvZiB0aGUgTGljZW5zZS4gDQotDQotICAgICAgICAgICAgNC4xLiBOZXcgVmVyc2lvbnMuDQotDQotICAgICAgICAgICAgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpcyB0aGUgaW5pdGlhbCBsaWNlbnNlIHN0ZXdhcmQgYW5kDQotICAgICAgICAgICAgbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3IHZlcnNpb25zIG9mIHRoaXMgTGljZW5zZQ0KLSAgICAgICAgICAgIGZyb20gdGltZSB0byB0aW1lLiBFYWNoIHZlcnNpb24gd2lsbCBiZSBnaXZlbiBhDQotICAgICAgICAgICAgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIEV4Y2VwdCBhcyBwcm92aWRlZCBpbg0KLSAgICAgICAgICAgIFNlY3Rpb24gNC4zLCBubyBvbmUgb3RoZXIgdGhhbiB0aGUgbGljZW5zZSBzdGV3YXJkIGhhcyB0aGUNCi0gICAgICAgICAgICByaWdodCB0byBtb2RpZnkgdGhpcyBMaWNlbnNlLiANCi0NCi0gICAgICAgICAgICA0LjIuIEVmZmVjdCBvZiBOZXcgVmVyc2lvbnMuDQotDQotICAgICAgICAgICAgWW91IG1heSBhbHdheXMgY29udGludWUgdG8gdXNlLCBkaXN0cmlidXRlIG9yIG90aGVyd2lzZQ0KLSAgICAgICAgICAgIG1ha2UgdGhlIENvdmVyZWQgU29mdHdhcmUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUNCi0gICAgICAgICAgICB2ZXJzaW9uIG9mIHRoZSBMaWNlbnNlIHVuZGVyIHdoaWNoIFlvdSBvcmlnaW5hbGx5IHJlY2VpdmVkDQotICAgICAgICAgICAgdGhlIENvdmVyZWQgU29mdHdhcmUuIElmIHRoZSBJbml0aWFsIERldmVsb3BlciBpbmNsdWRlcyBhDQotICAgICAgICAgICAgbm90aWNlIGluIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSBwcm9oaWJpdGluZyBpdCBmcm9tIGJlaW5nDQotICAgICAgICAgICAgZGlzdHJpYnV0ZWQgb3Igb3RoZXJ3aXNlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIGFueQ0KLSAgICAgICAgICAgIHN1YnNlcXVlbnQgdmVyc2lvbiBvZiB0aGUgTGljZW5zZSwgWW91IG11c3QgZGlzdHJpYnV0ZSBhbmQNCi0gICAgICAgICAgICBtYWtlIHRoZSBDb3ZlcmVkIFNvZnR3YXJlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlDQotICAgICAgICAgICAgdmVyc2lvbiBvZiB0aGUgTGljZW5zZSB1bmRlciB3aGljaCBZb3Ugb3JpZ2luYWxseSByZWNlaXZlZA0KLSAgICAgICAgICAgIHRoZSBDb3ZlcmVkIFNvZnR3YXJlLiBPdGhlcndpc2UsIFlvdSBtYXkgYWxzbyBjaG9vc2UgdG8NCi0gICAgICAgICAgICB1c2UsIGRpc3RyaWJ1dGUgb3Igb3RoZXJ3aXNlIG1ha2UgdGhlIENvdmVyZWQgU29mdHdhcmUNCi0gICAgICAgICAgICBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIGFueSBzdWJzZXF1ZW50IHZlcnNpb24gb2YgdGhlDQotICAgICAgICAgICAgTGljZW5zZSBwdWJsaXNoZWQgYnkgdGhlIGxpY2Vuc2Ugc3Rld2FyZC4gDQotDQotICAgICAgICAgICAgNC4zLiBNb2RpZmllZCBWZXJzaW9ucy4NCi0NCi0gICAgICAgICAgICBXaGVuIFlvdSBhcmUgYW4gSW5pdGlhbCBEZXZlbG9wZXIgYW5kIFlvdSB3YW50IHRvIGNyZWF0ZSBhDQotICAgICAgICAgICAgbmV3IGxpY2Vuc2UgZm9yIFlvdXIgT3JpZ2luYWwgU29mdHdhcmUsIFlvdSBtYXkgY3JlYXRlIGFuZA0KLSAgICAgICAgICAgIHVzZSBhIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhpcyBMaWNlbnNlIGlmIFlvdTogKGEpIHJlbmFtZQ0KLSAgICAgICAgICAgIHRoZSBsaWNlbnNlIGFuZCByZW1vdmUgYW55IHJlZmVyZW5jZXMgdG8gdGhlIG5hbWUgb2YgdGhlDQotICAgICAgICAgICAgbGljZW5zZSBzdGV3YXJkIChleGNlcHQgdG8gbm90ZSB0aGF0IHRoZSBsaWNlbnNlIGRpZmZlcnMNCi0gICAgICAgICAgICBmcm9tIHRoaXMgTGljZW5zZSk7IGFuZCAoYikgb3RoZXJ3aXNlIG1ha2UgaXQgY2xlYXIgdGhhdA0KLSAgICAgICAgICAgIHRoZSBsaWNlbnNlIGNvbnRhaW5zIHRlcm1zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgTGljZW5zZS4NCi0gICAgICAgICAgICANCi0NCi0gICAgICA1LiBESVNDTEFJTUVSIE9GIFdBUlJBTlRZLg0KLQ0KLSAgICAgIENPVkVSRUQgU09GVFdBUkUgSVMgUFJPVklERUQgVU5ERVIgVEhJUyBMSUNFTlNFIE9OIEFOICJBUyBJUyINCi0gICAgICBCQVNJUywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELA0KLSAgICAgIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBXQVJSQU5USUVTIFRIQVQgVEhFIENPVkVSRUQNCi0gICAgICBTT0ZUV0FSRSBJUyBGUkVFIE9GIERFRkVDVFMsIE1FUkNIQU5UQUJMRSwgRklUIEZPUiBBIFBBUlRJQ1VMQVINCi0gICAgICBQVVJQT1NFIE9SIE5PTi1JTkZSSU5HSU5HLiBUSEUgRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgQU5EDQotICAgICAgUEVSRk9STUFOQ0UgT0YgVEhFIENPVkVSRUQgU09GVFdBUkUgSVMgV0lUSCBZT1UuIFNIT1VMRCBBTlkNCi0gICAgICBDT1ZFUkVEIFNPRlRXQVJFIFBST1ZFIERFRkVDVElWRSBJTiBBTlkgUkVTUEVDVCwgWU9VIChOT1QgVEhFDQotICAgICAgSU5JVElBTCBERVZFTE9QRVIgT1IgQU5ZIE9USEVSIENPTlRSSUJVVE9SKSBBU1NVTUUgVEhFIENPU1QgT0YNCi0gICAgICBBTlkgTkVDRVNTQVJZIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uIFRISVMgRElTQ0xBSU1FUiBPRg0KLSAgICAgIFdBUlJBTlRZIENPTlNUSVRVVEVTIEFOIEVTU0VOVElBTCBQQVJUIE9GIFRISVMgTElDRU5TRS4gTk8gVVNFIE9GDQotICAgICAgQU5ZIENPVkVSRUQgU09GVFdBUkUgSVMgQVVUSE9SSVpFRCBIRVJFVU5ERVIgRVhDRVBUIFVOREVSIFRISVMNCi0gICAgICBESVNDTEFJTUVSLiANCi0NCi0gICAgICA2LiBURVJNSU5BVElPTi4gDQotDQotICAgICAgICAgICAgNi4xLiBUaGlzIExpY2Vuc2UgYW5kIHRoZSByaWdodHMgZ3JhbnRlZCBoZXJldW5kZXIgd2lsbA0KLSAgICAgICAgICAgIHRlcm1pbmF0ZSBhdXRvbWF0aWNhbGx5IGlmIFlvdSBmYWlsIHRvIGNvbXBseSB3aXRoIHRlcm1zDQotICAgICAgICAgICAgaGVyZWluIGFuZCBmYWlsIHRvIGN1cmUgc3VjaCBicmVhY2ggd2l0aGluIDMwIGRheXMgb2YNCi0gICAgICAgICAgICBiZWNvbWluZyBhd2FyZSBvZiB0aGUgYnJlYWNoLiBQcm92aXNpb25zIHdoaWNoLCBieSB0aGVpcg0KLSAgICAgICAgICAgIG5hdHVyZSwgbXVzdCByZW1haW4gaW4gZWZmZWN0IGJleW9uZCB0aGUgdGVybWluYXRpb24gb2YNCi0gICAgICAgICAgICB0aGlzIExpY2Vuc2Ugc2hhbGwgc3Vydml2ZS4NCi0NCi0gICAgICAgICAgICA2LjIuIElmIFlvdSBhc3NlcnQgYSBwYXRlbnQgaW5mcmluZ2VtZW50IGNsYWltIChleGNsdWRpbmcNCi0gICAgICAgICAgICBkZWNsYXJhdG9yeSBqdWRnbWVudCBhY3Rpb25zKSBhZ2FpbnN0IEluaXRpYWwgRGV2ZWxvcGVyIG9yDQotICAgICAgICAgICAgYSBDb250cmlidXRvciAodGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9yIENvbnRyaWJ1dG9yIGFnYWluc3QNCi0gICAgICAgICAgICB3aG9tIFlvdSBhc3NlcnQgc3VjaCBjbGFpbSBpcyByZWZlcnJlZCB0byBhcyAiUGFydGljaXBhbnQiKQ0KLSAgICAgICAgICAgIGFsbGVnaW5nIHRoYXQgdGhlIFBhcnRpY2lwYW50IFNvZnR3YXJlIChtZWFuaW5nIHRoZQ0KLSAgICAgICAgICAgIENvbnRyaWJ1dG9yIFZlcnNpb24gd2hlcmUgdGhlIFBhcnRpY2lwYW50IGlzIGEgQ29udHJpYnV0b3INCi0gICAgICAgICAgICBvciB0aGUgT3JpZ2luYWwgU29mdHdhcmUgd2hlcmUgdGhlIFBhcnRpY2lwYW50IGlzIHRoZQ0KLSAgICAgICAgICAgIEluaXRpYWwgRGV2ZWxvcGVyKSBkaXJlY3RseSBvciBpbmRpcmVjdGx5IGluZnJpbmdlcyBhbnkNCi0gICAgICAgICAgICBwYXRlbnQsIHRoZW4gYW55IGFuZCBhbGwgcmlnaHRzIGdyYW50ZWQgZGlyZWN0bHkgb3INCi0gICAgICAgICAgICBpbmRpcmVjdGx5IHRvIFlvdSBieSBzdWNoIFBhcnRpY2lwYW50LCB0aGUgSW5pdGlhbA0KLSAgICAgICAgICAgIERldmVsb3BlciAoaWYgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGlzIG5vdCB0aGUgUGFydGljaXBhbnQpDQotICAgICAgICAgICAgYW5kIGFsbCBDb250cmlidXRvcnMgdW5kZXIgU2VjdGlvbnMgMi4xIGFuZC9vciAyLjIgb2YgdGhpcw0KLSAgICAgICAgICAgIExpY2Vuc2Ugc2hhbGwsIHVwb24gNjAgZGF5cyBub3RpY2UgZnJvbSBQYXJ0aWNpcGFudA0KLSAgICAgICAgICAgIHRlcm1pbmF0ZSBwcm9zcGVjdGl2ZWx5IGFuZCBhdXRvbWF0aWNhbGx5IGF0IHRoZSBleHBpcmF0aW9uDQotICAgICAgICAgICAgb2Ygc3VjaCA2MCBkYXkgbm90aWNlIHBlcmlvZCwgdW5sZXNzIGlmIHdpdGhpbiBzdWNoIDYwIGRheQ0KLSAgICAgICAgICAgIHBlcmlvZCBZb3Ugd2l0aGRyYXcgWW91ciBjbGFpbSB3aXRoIHJlc3BlY3QgdG8gdGhlDQotICAgICAgICAgICAgUGFydGljaXBhbnQgU29mdHdhcmUgYWdhaW5zdCBzdWNoIFBhcnRpY2lwYW50IGVpdGhlcg0KLSAgICAgICAgICAgIHVuaWxhdGVyYWxseSBvciBwdXJzdWFudCB0byBhIHdyaXR0ZW4gYWdyZWVtZW50IHdpdGgNCi0gICAgICAgICAgICBQYXJ0aWNpcGFudC4NCi0NCi0gICAgICAgICAgICA2LjMuIEluIHRoZSBldmVudCBvZiB0ZXJtaW5hdGlvbiB1bmRlciBTZWN0aW9ucyA2LjEgb3IgNi4yDQotICAgICAgICAgICAgYWJvdmUsIGFsbCBlbmQgdXNlciBsaWNlbnNlcyB0aGF0IGhhdmUgYmVlbiB2YWxpZGx5IGdyYW50ZWQNCi0gICAgICAgICAgICBieSBZb3Ugb3IgYW55IGRpc3RyaWJ1dG9yIGhlcmV1bmRlciBwcmlvciB0byB0ZXJtaW5hdGlvbg0KLSAgICAgICAgICAgIChleGNsdWRpbmcgbGljZW5zZXMgZ3JhbnRlZCB0byBZb3UgYnkgYW55IGRpc3RyaWJ1dG9yKQ0KLSAgICAgICAgICAgIHNoYWxsIHN1cnZpdmUgdGVybWluYXRpb24uDQotDQotICAgICAgNy4gTElNSVRBVElPTiBPRiBMSUFCSUxJVFkuDQotDQotICAgICAgVU5ERVIgTk8gQ0lSQ1VNU1RBTkNFUyBBTkQgVU5ERVIgTk8gTEVHQUwgVEhFT1JZLCBXSEVUSEVSIFRPUlQNCi0gICAgICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UpLCBDT05UUkFDVCwgT1IgT1RIRVJXSVNFLCBTSEFMTCBZT1UsIFRIRQ0KLSAgICAgIElOSVRJQUwgREVWRUxPUEVSLCBBTlkgT1RIRVIgQ09OVFJJQlVUT1IsIE9SIEFOWSBESVNUUklCVVRPUiBPRg0KLSAgICAgIENPVkVSRUQgU09GVFdBUkUsIE9SIEFOWSBTVVBQTElFUiBPRiBBTlkgT0YgU1VDSCBQQVJUSUVTLCBCRQ0KLSAgICAgIExJQUJMRSBUTyBBTlkgUEVSU09OIEZPUiBBTlkgSU5ESVJFQ1QsIFNQRUNJQUwsIElOQ0lERU5UQUwsIE9SDQotICAgICAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9GIEFOWSBDSEFSQUNURVIgSU5DTFVESU5HLCBXSVRIT1VUDQotICAgICAgTElNSVRBVElPTiwgREFNQUdFUyBGT1IgTE9TVCBQUk9GSVRTLCBMT1NTIE9GIEdPT0RXSUxMLCBXT1JLDQotICAgICAgU1RPUFBBR0UsIENPTVBVVEVSIEZBSUxVUkUgT1IgTUFMRlVOQ1RJT04sIE9SIEFOWSBBTkQgQUxMIE9USEVSDQotICAgICAgQ09NTUVSQ0lBTCBEQU1BR0VTIE9SIExPU1NFUywgRVZFTiBJRiBTVUNIIFBBUlRZIFNIQUxMIEhBVkUgQkVFTg0KLSAgICAgIElORk9STUVEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuIFRISVMgTElNSVRBVElPTiBPRg0KLSAgICAgIExJQUJJTElUWSBTSEFMTCBOT1QgQVBQTFkgVE8gTElBQklMSVRZIEZPUiBERUFUSCBPUiBQRVJTT05BTA0KLSAgICAgIElOSlVSWSBSRVNVTFRJTkcgRlJPTSBTVUNIIFBBUlRZ1VMgTkVHTElHRU5DRSBUTyBUSEUgRVhURU5UDQotICAgICAgQVBQTElDQUJMRSBMQVcgUFJPSElCSVRTIFNVQ0ggTElNSVRBVElPTi4gU09NRSBKVVJJU0RJQ1RJT05TIERPDQotICAgICAgTk9UIEFMTE9XIFRIRSBFWENMVVNJT04gT1IgTElNSVRBVElPTiBPRiBJTkNJREVOVEFMIE9SDQotICAgICAgQ09OU0VRVUVOVElBTCBEQU1BR0VTLCBTTyBUSElTIEVYQ0xVU0lPTiBBTkQgTElNSVRBVElPTiBNQVkgTk9UDQotICAgICAgQVBQTFkgVE8gWU9VLg0KLQ0KLSAgICAgIDguIFUuUy4gR09WRVJOTUVOVCBFTkQgVVNFUlMuDQotDQotICAgICAgVGhlIENvdmVyZWQgU29mdHdhcmUgaXMgYSAiY29tbWVyY2lhbCBpdGVtLCIgYXMgdGhhdCB0ZXJtIGlzDQotICAgICAgZGVmaW5lZCBpbiA0OCBDLkYuUi4gMi4xMDEgKE9jdC4gMTk5NSksIGNvbnNpc3Rpbmcgb2YgImNvbW1lcmNpYWwNCi0gICAgICBjb21wdXRlciBzb2Z0d2FyZSIgKGFzIHRoYXQgdGVybSBpcyBkZWZpbmVkIGF0IDQ4IEMuRi5SLiCkDQotICAgICAgMjUyLjIyNy03MDE0KGEpKDEpKSBhbmQgImNvbW1lcmNpYWwgY29tcHV0ZXIgc29mdHdhcmUNCi0gICAgICBkb2N1bWVudGF0aW9uIiBhcyBzdWNoIHRlcm1zIGFyZSB1c2VkIGluIDQ4IEMuRi5SLiAxMi4yMTIgKFNlcHQuDQotICAgICAgMTk5NSkuIENvbnNpc3RlbnQgd2l0aCA0OCBDLkYuUi4gMTIuMjEyIGFuZCA0OCBDLkYuUi4gMjI3LjcyMDItMQ0KLSAgICAgIHRocm91Z2ggMjI3LjcyMDItNCAoSnVuZSAxOTk1KSwgYWxsIFUuUy4gR292ZXJubWVudCBFbmQgVXNlcnMNCi0gICAgICBhY3F1aXJlIENvdmVyZWQgU29mdHdhcmUgd2l0aCBvbmx5IHRob3NlIHJpZ2h0cyBzZXQgZm9ydGggaGVyZWluLg0KLSAgICAgIFRoaXMgVS5TLiBHb3Zlcm5tZW50IFJpZ2h0cyBjbGF1c2UgaXMgaW4gbGlldSBvZiwgYW5kIHN1cGVyc2VkZXMsDQotICAgICAgYW55IG90aGVyIEZBUiwgREZBUiwgb3Igb3RoZXIgY2xhdXNlIG9yIHByb3Zpc2lvbiB0aGF0IGFkZHJlc3Nlcw0KLSAgICAgIEdvdmVybm1lbnQgcmlnaHRzIGluIGNvbXB1dGVyIHNvZnR3YXJlIHVuZGVyIHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICA5LiBNSVNDRUxMQU5FT1VTLg0KLQ0KLSAgICAgIFRoaXMgTGljZW5zZSByZXByZXNlbnRzIHRoZSBjb21wbGV0ZSBhZ3JlZW1lbnQgY29uY2VybmluZyBzdWJqZWN0DQotICAgICAgbWF0dGVyIGhlcmVvZi4gSWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgaGVsZCB0byBiZQ0KLSAgICAgIHVuZW5mb3JjZWFibGUsIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIG9ubHkgdG8gdGhlDQotICAgICAgZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIGl0IGVuZm9yY2VhYmxlLiBUaGlzIExpY2Vuc2Ugc2hhbGwgYmUNCi0gICAgICBnb3Zlcm5lZCBieSB0aGUgbGF3IG9mIHRoZSBqdXJpc2RpY3Rpb24gc3BlY2lmaWVkIGluIGEgbm90aWNlDQotICAgICAgY29udGFpbmVkIHdpdGhpbiB0aGUgT3JpZ2luYWwgU29mdHdhcmUgKGV4Y2VwdCB0byB0aGUgZXh0ZW50DQotICAgICAgYXBwbGljYWJsZSBsYXcsIGlmIGFueSwgcHJvdmlkZXMgb3RoZXJ3aXNlKSwgZXhjbHVkaW5nIHN1Y2gNCi0gICAgICBqdXJpc2RpY3Rpb27VcyBjb25mbGljdC1vZi1sYXcgcHJvdmlzaW9ucy4gQW55IGxpdGlnYXRpb24NCi0gICAgICByZWxhdGluZyB0byB0aGlzIExpY2Vuc2Ugc2hhbGwgYmUgc3ViamVjdCB0byB0aGUganVyaXNkaWN0aW9uIG9mDQotICAgICAgdGhlIGNvdXJ0cyBsb2NhdGVkIGluIHRoZSBqdXJpc2RpY3Rpb24gYW5kIHZlbnVlIHNwZWNpZmllZCBpbiBhDQotICAgICAgbm90aWNlIGNvbnRhaW5lZCB3aXRoaW4gdGhlIE9yaWdpbmFsIFNvZnR3YXJlLCB3aXRoIHRoZSBsb3NpbmcNCi0gICAgICBwYXJ0eSByZXNwb25zaWJsZSBmb3IgY29zdHMsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBjb3VydA0KLSAgICAgIGNvc3RzIGFuZCByZWFzb25hYmxlIGF0dG9ybmV5c9UgZmVlcyBhbmQgZXhwZW5zZXMuIFRoZQ0KLSAgICAgIGFwcGxpY2F0aW9uIG9mIHRoZSBVbml0ZWQgTmF0aW9ucyBDb252ZW50aW9uIG9uIENvbnRyYWN0cyBmb3IgdGhlDQotICAgICAgSW50ZXJuYXRpb25hbCBTYWxlIG9mIEdvb2RzIGlzIGV4cHJlc3NseSBleGNsdWRlZC4gQW55IGxhdyBvcg0KLSAgICAgIHJlZ3VsYXRpb24gd2hpY2ggcHJvdmlkZXMgdGhhdCB0aGUgbGFuZ3VhZ2Ugb2YgYSBjb250cmFjdCBzaGFsbA0KLSAgICAgIGJlIGNvbnN0cnVlZCBhZ2FpbnN0IHRoZSBkcmFmdGVyIHNoYWxsIG5vdCBhcHBseSB0byB0aGlzIExpY2Vuc2UuDQotICAgICAgWW91IGFncmVlIHRoYXQgWW91IGFsb25lIGFyZSByZXNwb25zaWJsZSBmb3IgY29tcGxpYW5jZSB3aXRoIHRoZQ0KLSAgICAgIFVuaXRlZCBTdGF0ZXMgZXhwb3J0IGFkbWluaXN0cmF0aW9uIHJlZ3VsYXRpb25zIChhbmQgdGhlIGV4cG9ydA0KLSAgICAgIGNvbnRyb2wgbGF3cyBhbmQgcmVndWxhdGlvbiBvZiBhbnkgb3RoZXIgY291bnRyaWVzKSB3aGVuIFlvdSB1c2UsDQotICAgICAgZGlzdHJpYnV0ZSBvciBvdGhlcndpc2UgbWFrZSBhdmFpbGFibGUgYW55IENvdmVyZWQgU29mdHdhcmUuDQotDQotICAgICAgMTAuIFJFU1BPTlNJQklMSVRZIEZPUiBDTEFJTVMuDQotDQotICAgICAgQXMgYmV0d2VlbiBJbml0aWFsIERldmVsb3BlciBhbmQgdGhlIENvbnRyaWJ1dG9ycywgZWFjaCBwYXJ0eSBpcw0KLSAgICAgIHJlc3BvbnNpYmxlIGZvciBjbGFpbXMgYW5kIGRhbWFnZXMgYXJpc2luZywgZGlyZWN0bHkgb3INCi0gICAgICBpbmRpcmVjdGx5LCBvdXQgb2YgaXRzIHV0aWxpemF0aW9uIG9mIHJpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2UNCi0gICAgICBhbmQgWW91IGFncmVlIHRvIHdvcmsgd2l0aCBJbml0aWFsIERldmVsb3BlciBhbmQgQ29udHJpYnV0b3JzIHRvDQotICAgICAgZGlzdHJpYnV0ZSBzdWNoIHJlc3BvbnNpYmlsaXR5IG9uIGFuIGVxdWl0YWJsZSBiYXNpcy4gTm90aGluZw0KLSAgICAgIGhlcmVpbiBpcyBpbnRlbmRlZCBvciBzaGFsbCBiZSBkZWVtZWQgdG8gY29uc3RpdHV0ZSBhbnkgYWRtaXNzaW9uDQotICAgICAgb2YgbGlhYmlsaXR5Lg0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9sZWdhbC9qYXhlbi1MSUNFTlNFLnR4dCBiL3YxLjUuMVJDMy9sZWdhbC9qYXhlbi1MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmMyZTVhMy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbGVnYWwvamF4ZW4tTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKg0KLSAkSWQ6IExJQ0VOU0UudHh0LHYgMS41IDIwMDYvMDIvMDUgMjE6NDk6MDQgZWxoYXJvIEV4cCAkDQotDQotIENvcHlyaWdodCAyMDAzLTIwMDYgVGhlIFdlcmtlbiBDb21wYW55LiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KLSANCi0gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQotIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUNCi0gbWV0Og0KLQ0KLSAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodA0KLSAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQotDQotICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0DQotICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUNCi0gICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4NCi0NCi0gICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgSmF4ZW4gUHJvamVjdCBub3IgdGhlIG5hbWVzIG9mIGl0cw0KLSAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgDQotICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4NCi0NCi1USElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUw0KLUlTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRA0KLVRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQQ0KLVBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUg0KLU9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLA0KLUVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywNCi1QUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1INCi1QUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GDQotTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcNCi1ORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMNCi1TT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCi0NCi0gKi8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbGVnYWwvamV0dGlzb24tTElDRU5TRS50eHQgYi92MS41LjFSQzMvbGVnYWwvamV0dGlzb24tTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0ZTQyMzMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL2xlZ2FsL2pldHRpc29uLUxJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTkxICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8NCi0NCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04NCi0NCi0gICAxLiBEZWZpbml0aW9ucy4NCi0NCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLA0KLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50Lg0KLQ0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5DQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwNCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uDQotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwNCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUNCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcg0KLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQ0KLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuDQotDQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuDQotDQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsDQotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbg0KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuDQotDQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwNCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0DQotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLA0KLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4NCi0NCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcg0KLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGENCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsNCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLg0KLQ0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QNCi0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlDQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucw0KLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzDQotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluDQotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLA0KLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuDQotDQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcNCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zDQotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5DQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcg0KLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZg0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIg0KLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQNCi0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bw0KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsDQotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUNCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQNCi0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQ0KLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIg0KLQ0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kDQotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuDQotDQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsDQotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlDQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4NCi0NCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwNCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywNCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQ0KLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyDQotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQ0KLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91DQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGENCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrDQotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QNCi0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzDQotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlDQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLg0KLQ0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlDQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0DQotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UNCi0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCi0NCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcg0KLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZA0KLQ0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMNCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kDQotDQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzDQotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQNCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywNCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZg0KLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kDQotDQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzDQotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QNCi0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkDQotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdA0KLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUNCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQNCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcg0KLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwNCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZA0KLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMNCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZA0KLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbg0KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQ0KLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQNCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkDQotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQNCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zDQotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcg0KLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLA0KLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aA0KLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuDQotDQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLA0KLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaw0KLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuDQotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQ0KLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkDQotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLg0KLQ0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUNCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsDQotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlDQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuDQotDQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yDQotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaA0KLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcg0KLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zDQotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQ0KLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQ0KLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQ0KLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4NCi0NCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwNCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwNCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQ0KLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlDQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLA0KLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQ0KLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUNCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsDQotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwNCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yDQotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLg0KLQ0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcNCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLA0KLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksDQotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMNCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQ0KLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmDQotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LA0KLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQ0KLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24NCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4NCi0NCi0gICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMNCi0NCi0gICBDb3B5cmlnaHQgMjAwNiBFbnZvaSBTb2x1dGlvbnMgTExDDQotDQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL2xlZ2FsL2ppYngtYmluZC1MSUNFTlNFLnR4dCBiL3YxLjUuMVJDMy9sZWdhbC9qaWJ4LWJpbmQtTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhM2VjYmUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL2xlZ2FsL2ppYngtYmluZC1MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLUNvcHlyaWdodCAoYykgMjAwMy0yMDA3LCBEZW5uaXMgTS4gU29zbm9za2kKLUFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCi1hcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0KLSAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcwotICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCi0gICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCi0gICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqIE5laXRoZXIgdGhlIG5hbWUgb2YgSmlCWCBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQKLSAgIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljCi0gICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0KLVRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQKLUFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECi1XQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi1ESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SCi1BTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLShJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLUxPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTgotQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLShJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCi1TT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbGVnYWwvamlieC1ydW4tTElDRU5TRS50eHQgYi92MS41LjFSQzMvbGVnYWwvamlieC1ydW4tTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhM2VjYmUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL2xlZ2FsL2ppYngtcnVuLUxJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotQ29weXJpZ2h0IChjKSAyMDAzLTIwMDcsIERlbm5pcyBNLiBTb3Nub3NraQotQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKLWFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLQotICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCi0gICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKLSAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KLSAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogTmVpdGhlciB0aGUgbmFtZSBvZiBKaUJYIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZAotICAgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMKLSAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLQotVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAotQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKLVdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLURJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IKLUFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCi1BTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKLVNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9sZWdhbC9sb2c0ai1MSUNFTlNFLnR4dCBiL3YxLjUuMVJDMy9sZWdhbC9sb2c0ai1MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdiYzg4YS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbGVnYWwvbG9nNGotTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KLQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCi0KLSAgIDEuIERlZmluaXRpb25zLgotCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5Ci0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCi0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCi0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KLQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KLQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yawotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KLQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucwotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KLQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgotCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KLQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCi0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91Ci0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgotCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0Ci0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKLQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAotCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAotCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0Ci0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90Ci0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cwotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgotCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCi0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCi0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgotCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5Ci0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5Ci0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KLQotICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0KLSAgIEFQUEVORElYOiBIb3cgdG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yay4KLQotICAgICAgVG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yaywgYXR0YWNoIHRoZSBmb2xsb3dpbmcKLSAgICAgIGJvaWxlcnBsYXRlIG5vdGljZSwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzICJbXSIKLSAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCi0gICAgICB0aGUgYnJhY2tldHMhKSAgVGhlIHRleHQgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBhcHByb3ByaWF0ZQotICAgICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhCi0gICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCi0gICAgICBzYW1lICJwcmludGVkIHBhZ2UiIGFzIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciBlYXNpZXIKLSAgICAgIGlkZW50aWZpY2F0aW9uIHdpdGhpbiB0aGlyZC1wYXJ0eSBhcmNoaXZlcy4KLQotICAgQ29weXJpZ2h0IFt5eXl5XSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdCi0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9sZWdhbC9tYWlsLUxJQ0VOU0UudHh0IGIvdjEuNS4xUkMzL2xlZ2FsL21haWwtTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1Y2UyMGEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL2xlZ2FsL21haWwtTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotQ09NTU9OIERFVkVMT1BNRU5UIEFORCBESVNUUklCVVRJT04gTElDRU5TRSAoQ0RETCkgVmVyc2lvbiAxLjAKLQotMS4gRGVmaW5pdGlvbnMuCi0KLTEuMS4gQ29udHJpYnV0b3IgbWVhbnMgZWFjaCBpbmRpdmlkdWFsIG9yIGVudGl0eSB0aGF0IGNyZWF0ZXMgb3IgY29udHJpYnV0ZXMgdG8gdGhlIGNyZWF0aW9uIG9mIE1vZGlmaWNhdGlvbnMuCi0KLTEuMi4gQ29udHJpYnV0b3IgVmVyc2lvbiBtZWFucyB0aGUgY29tYmluYXRpb24gb2YgdGhlIE9yaWdpbmFsIFNvZnR3YXJlLCBwcmlvciBNb2RpZmljYXRpb25zIHVzZWQgYnkgYSBDb250cmlidXRvciAoaWYgYW55KSwgYW5kIHRoZSBNb2RpZmljYXRpb25zIG1hZGUgYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLgotCi0xLjMuIENvdmVyZWQgU29mdHdhcmUgbWVhbnMgKGEpIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSwgb3IgKGIpIE1vZGlmaWNhdGlvbnMsIG9yIChjKSB0aGUgY29tYmluYXRpb24gb2YgZmlsZXMgY29udGFpbmluZyBPcmlnaW5hbCBTb2Z0d2FyZSB3aXRoIGZpbGVzIGNvbnRhaW5pbmcgTW9kaWZpY2F0aW9ucywgaW4gZWFjaCBjYXNlIGluY2x1ZGluZyBwb3J0aW9ucyB0aGVyZW9mLgotCi0xLjQuIEV4ZWN1dGFibGUgbWVhbnMgdGhlIENvdmVyZWQgU29mdHdhcmUgaW4gYW55IGZvcm0gb3RoZXIgdGhhbiBTb3VyY2UgQ29kZS4KLQotMS41LiBJbml0aWFsIERldmVsb3BlciBtZWFucyB0aGUgaW5kaXZpZHVhbCBvciBlbnRpdHkgdGhhdCBmaXJzdCBtYWtlcyBPcmlnaW5hbCBTb2Z0d2FyZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBMaWNlbnNlLgotCi0xLjYuIExhcmdlciBXb3JrIG1lYW5zIGEgd29yayB3aGljaCBjb21iaW5lcyBDb3ZlcmVkIFNvZnR3YXJlIG9yIHBvcnRpb25zIHRoZXJlb2Ygd2l0aCBjb2RlIG5vdCBnb3Zlcm5lZCBieSB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgotCi0xLjcuIExpY2Vuc2UgbWVhbnMgdGhpcyBkb2N1bWVudC4KLQotMS44LiBMaWNlbnNhYmxlIG1lYW5zIGhhdmluZyB0aGUgcmlnaHQgdG8gZ3JhbnQsIHRvIHRoZSBtYXhpbXVtIGV4dGVudCBwb3NzaWJsZSwgd2hldGhlciBhdCB0aGUgdGltZSBvZiB0aGUgaW5pdGlhbCBncmFudCBvciBzdWJzZXF1ZW50bHkgYWNxdWlyZWQsIGFueSBhbmQgYWxsIG9mIHRoZSByaWdodHMgY29udmV5ZWQgaGVyZWluLgotCi0xLjkuIE1vZGlmaWNhdGlvbnMgbWVhbnMgdGhlIFNvdXJjZSBDb2RlIGFuZCBFeGVjdXRhYmxlIGZvcm0gb2YgYW55IG9mIHRoZSBmb2xsb3dpbmc6Ci0KLUEuIEFueSBmaWxlIHRoYXQgcmVzdWx0cyBmcm9tIGFuIGFkZGl0aW9uIHRvLCBkZWxldGlvbiBmcm9tIG9yIG1vZGlmaWNhdGlvbiBvZiB0aGUgY29udGVudHMgb2YgYSBmaWxlIGNvbnRhaW5pbmcgT3JpZ2luYWwgU29mdHdhcmUgb3IgcHJldmlvdXMgTW9kaWZpY2F0aW9uczsKLQotQi4gQW55IG5ldyBmaWxlIHRoYXQgY29udGFpbnMgYW55IHBhcnQgb2YgdGhlIE9yaWdpbmFsIFNvZnR3YXJlIG9yIHByZXZpb3VzIE1vZGlmaWNhdGlvbjsgb3IKLQotQy4gQW55IG5ldyBmaWxlIHRoYXQgaXMgY29udHJpYnV0ZWQgb3Igb3RoZXJ3aXNlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCi0KLTEuMTAuIE9yaWdpbmFsIFNvZnR3YXJlIG1lYW5zIHRoZSBTb3VyY2UgQ29kZSBhbmQgRXhlY3V0YWJsZSBmb3JtIG9mIGNvbXB1dGVyIHNvZnR3YXJlIGNvZGUgdGhhdCBpcyBvcmlnaW5hbGx5IHJlbGVhc2VkIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotMS4xMS4gUGF0ZW50IENsYWltcyBtZWFucyBhbnkgcGF0ZW50IGNsYWltKHMpLCBub3cgb3duZWQgb3IgaGVyZWFmdGVyIGFjcXVpcmVkLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uLCBtZXRob2QsIHByb2Nlc3MsIGFuZCBhcHBhcmF0dXMgY2xhaW1zLCBpbiBhbnkgcGF0ZW50IExpY2Vuc2FibGUgYnkgZ3JhbnRvci4KLQotMS4xMi4gU291cmNlIENvZGUgbWVhbnMgKGEpIHRoZSBjb21tb24gZm9ybSBvZiBjb21wdXRlciBzb2Z0d2FyZSBjb2RlIGluIHdoaWNoIG1vZGlmaWNhdGlvbnMgYXJlIG1hZGUgYW5kIChiKSBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgaW4gb3Igd2l0aCBzdWNoIGNvZGUuCi0KLTEuMTMuIFlvdSAob3IgWW91cikgbWVhbnMgYW4gaW5kaXZpZHVhbCBvciBhIGxlZ2FsIGVudGl0eSBleGVyY2lzaW5nIHJpZ2h0cyB1bmRlciwgYW5kIGNvbXBseWluZyB3aXRoIGFsbCBvZiB0aGUgdGVybXMgb2YsIHRoaXMgTGljZW5zZS4gRm9yIGxlZ2FsIGVudGl0aWVzLCBZb3UgaW5jbHVkZXMgYW55IGVudGl0eSB3aGljaCBjb250cm9scywgaXMgY29udHJvbGxlZCBieSwgb3IgaXMgdW5kZXIgY29tbW9uIGNvbnRyb2wgd2l0aCBZb3UuIEZvciBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sIGNvbnRyb2wgbWVhbnMgKGEp77+9dGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZSBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvciBvdGhlcndpc2UsIG9yIChiKe+/vW93bmVyc2hpcCBvZiBtb3JlIHRoYW4gZmlmdHkgcGVyY2VudCAoNTAlKSBvZiB0aGUgb3V0c3RhbmRpbmcgc2hhcmVzIG9yIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgotCi0yLiBMaWNlbnNlIEdyYW50cy4KLQotMi4xLiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgR3JhbnQuCi1Db25kaXRpb25lZCB1cG9uIFlvdXIgY29tcGxpYW5jZSB3aXRoIFNlY3Rpb24gMy4xIGJlbG93IGFuZCBzdWJqZWN0IHRvIHRoaXJkIHBhcnR5IGludGVsbGVjdHVhbCBwcm9wZXJ0eSBjbGFpbXMsIHRoZSBJbml0aWFsIERldmVsb3BlciBoZXJlYnkgZ3JhbnRzIFlvdSBhIHdvcmxkLXdpZGUsIHJveWFsdHktZnJlZSwgbm9uLWV4Y2x1c2l2ZSBsaWNlbnNlOgotKGEpIHVuZGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgKG90aGVyIHRoYW4gcGF0ZW50IG9yIHRyYWRlbWFyaykgTGljZW5zYWJsZSBieSBJbml0aWFsIERldmVsb3BlciwgdG8gdXNlLCByZXByb2R1Y2UsIG1vZGlmeSwgZGlzcGxheSwgcGVyZm9ybSwgc3VibGljZW5zZSBhbmQgZGlzdHJpYnV0ZSB0aGUgT3JpZ2luYWwgU29mdHdhcmUgKG9yIHBvcnRpb25zIHRoZXJlb2YpLCB3aXRoIG9yIHdpdGhvdXQgTW9kaWZpY2F0aW9ucywgYW5kL29yIGFzIHBhcnQgb2YgYSBMYXJnZXIgV29yazsgYW5kCi0oYikgdW5kZXIgUGF0ZW50IENsYWltcyBpbmZyaW5nZWQgYnkgdGhlIG1ha2luZywgdXNpbmcgb3Igc2VsbGluZyBvZiBPcmlnaW5hbCBTb2Z0d2FyZSwgdG8gbWFrZSwgaGF2ZSBtYWRlLCB1c2UsIHByYWN0aWNlLCBzZWxsLCBhbmQgb2ZmZXIgZm9yIHNhbGUsIGFuZC9vciBvdGhlcndpc2UgZGlzcG9zZSBvZiB0aGUgT3JpZ2luYWwgU29mdHdhcmUgKG9yIHBvcnRpb25zIHRoZXJlb2YpLgotKGMpIFRoZSBsaWNlbnNlcyBncmFudGVkIGluIFNlY3Rpb25z77+9Mi4xKGEpIGFuZCAoYikgYXJlIGVmZmVjdGl2ZSBvbiB0aGUgZGF0ZSBJbml0aWFsIERldmVsb3BlciBmaXJzdCBkaXN0cmlidXRlcyBvciBvdGhlcndpc2UgbWFrZXMgdGhlIE9yaWdpbmFsIFNvZnR3YXJlIGF2YWlsYWJsZSB0byBhIHRoaXJkIHBhcnR5IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCi0oZCkgTm90d2l0aHN0YW5kaW5nIFNlY3Rpb27vv70yLjEoYikgYWJvdmUsIG5vIHBhdGVudCBsaWNlbnNlIGlzIGdyYW50ZWQ6ICgxKe+/vWZvciBjb2RlIHRoYXQgWW91IGRlbGV0ZSBmcm9tIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSwgb3IgKDIp77+9Zm9yIGluZnJpbmdlbWVudHMgY2F1c2VkIGJ5OiAoaSnvv710aGUgbW9kaWZpY2F0aW9uIG9mIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSwgb3IgKGlpKe+/vXRoZSBjb21iaW5hdGlvbiBvZiB0aGUgT3JpZ2luYWwgU29mdHdhcmUgd2l0aCBvdGhlciBzb2Z0d2FyZSBvciBkZXZpY2VzLgotCi0yLjIuIENvbnRyaWJ1dG9yIEdyYW50LgotQ29uZGl0aW9uZWQgdXBvbiBZb3VyIGNvbXBsaWFuY2Ugd2l0aCBTZWN0aW9uIDMuMSBiZWxvdyBhbmQgc3ViamVjdCB0byB0aGlyZCBwYXJ0eSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgY2xhaW1zLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgWW91IGEgd29ybGQtd2lkZSwgcm95YWx0eS1mcmVlLCBub24tZXhjbHVzaXZlIGxpY2Vuc2U6Ci0oYSkgdW5kZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyAob3RoZXIgdGhhbiBwYXRlbnQgb3IgdHJhZGVtYXJrKSBMaWNlbnNhYmxlIGJ5IENvbnRyaWJ1dG9yIHRvIHVzZSwgcmVwcm9kdWNlLCBtb2RpZnksIGRpc3BsYXksIHBlcmZvcm0sIHN1YmxpY2Vuc2UgYW5kIGRpc3RyaWJ1dGUgdGhlIE1vZGlmaWNhdGlvbnMgY3JlYXRlZCBieSBzdWNoIENvbnRyaWJ1dG9yIChvciBwb3J0aW9ucyB0aGVyZW9mKSwgZWl0aGVyIG9uIGFuIHVubW9kaWZpZWQgYmFzaXMsIHdpdGggb3RoZXIgTW9kaWZpY2F0aW9ucywgYXMgQ292ZXJlZCBTb2Z0d2FyZSBhbmQvb3IgYXMgcGFydCBvZiBhIExhcmdlciBXb3JrOyBhbmQKLShiKSB1bmRlciBQYXRlbnQgQ2xhaW1zIGluZnJpbmdlZCBieSB0aGUgbWFraW5nLCB1c2luZywgb3Igc2VsbGluZyBvZiBNb2RpZmljYXRpb25zIG1hZGUgYnkgdGhhdCBDb250cmlidXRvciBlaXRoZXIgYWxvbmUgYW5kL29yIGluIGNvbWJpbmF0aW9uIHdpdGggaXRzIENvbnRyaWJ1dG9yIFZlcnNpb24gKG9yIHBvcnRpb25zIG9mIHN1Y2ggY29tYmluYXRpb24pLCB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIGZvciBzYWxlLCBoYXZlIG1hZGUsIGFuZC9vciBvdGhlcndpc2UgZGlzcG9zZSBvZjogKDEp77+9TW9kaWZpY2F0aW9ucyBtYWRlIGJ5IHRoYXQgQ29udHJpYnV0b3IgKG9yIHBvcnRpb25zIHRoZXJlb2YpOyBhbmQgKDIp77+9dGhlIGNvbWJpbmF0aW9uIG9mIE1vZGlmaWNhdGlvbnMgbWFkZSBieSB0aGF0IENvbnRyaWJ1dG9yIHdpdGggaXRzIENvbnRyaWJ1dG9yIFZlcnNpb24gKG9yIHBvcnRpb25zIG9mIHN1Y2ggY29tYmluYXRpb24pLgotKGMpIFRoZSBsaWNlbnNlcyBncmFudGVkIGluIFNlY3Rpb25z77+9Mi4yKGEpIGFuZCAyLjIoYikgYXJlIGVmZmVjdGl2ZSBvbiB0aGUgZGF0ZSBDb250cmlidXRvciBmaXJzdCBkaXN0cmlidXRlcyBvciBvdGhlcndpc2UgbWFrZXMgdGhlIE1vZGlmaWNhdGlvbnMgYXZhaWxhYmxlIHRvIGEgdGhpcmQgcGFydHkuCi0oZCkgTm90d2l0aHN0YW5kaW5nIFNlY3Rpb27vv70yLjIoYikgYWJvdmUsIG5vIHBhdGVudCBsaWNlbnNlIGlzIGdyYW50ZWQ6ICgxKe+/vWZvciBhbnkgY29kZSB0aGF0IENvbnRyaWJ1dG9yIGhhcyBkZWxldGVkIGZyb20gdGhlIENvbnRyaWJ1dG9yIFZlcnNpb247ICgyKe+/vWZvciBpbmZyaW5nZW1lbnRzIGNhdXNlZCBieTogKGkp77+9dGhpcmQgcGFydHkgbW9kaWZpY2F0aW9ucyBvZiBDb250cmlidXRvciBWZXJzaW9uLCBvciAoaWkp77+9dGhlIGNvbWJpbmF0aW9uIG9mIE1vZGlmaWNhdGlvbnMgbWFkZSBieSB0aGF0IENvbnRyaWJ1dG9yIHdpdGggb3RoZXIgc29mdHdhcmUgKGV4Y2VwdCBhcyBwYXJ0IG9mIHRoZSBDb250cmlidXRvciBWZXJzaW9uKSBvciBvdGhlciBkZXZpY2VzOyBvciAoMynvv711bmRlciBQYXRlbnQgQ2xhaW1zIGluZnJpbmdlZCBieSBDb3ZlcmVkIFNvZnR3YXJlIGluIHRoZSBhYnNlbmNlIG9mIE1vZGlmaWNhdGlvbnMgbWFkZSBieSB0aGF0IENvbnRyaWJ1dG9yLgotCi0zLiBEaXN0cmlidXRpb24gT2JsaWdhdGlvbnMuCi0KLTMuMS4gQXZhaWxhYmlsaXR5IG9mIFNvdXJjZSBDb2RlLgotCi1BbnkgQ292ZXJlZCBTb2Z0d2FyZSB0aGF0IFlvdSBkaXN0cmlidXRlIG9yIG90aGVyd2lzZSBtYWtlIGF2YWlsYWJsZSBpbiBFeGVjdXRhYmxlIGZvcm0gbXVzdCBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIGluIFNvdXJjZSBDb2RlIGZvcm0gYW5kIHRoYXQgU291cmNlIENvZGUgZm9ybSBtdXN0IGJlIGRpc3RyaWJ1dGVkIG9ubHkgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4gWW91IG11c3QgaW5jbHVkZSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlIHdpdGggZXZlcnkgY29weSBvZiB0aGUgU291cmNlIENvZGUgZm9ybSBvZiB0aGUgQ292ZXJlZCBTb2Z0d2FyZSBZb3UgZGlzdHJpYnV0ZSBvciBvdGhlcndpc2UgbWFrZSBhdmFpbGFibGUuIFlvdSBtdXN0IGluZm9ybSByZWNpcGllbnRzIG9mIGFueSBzdWNoIENvdmVyZWQgU29mdHdhcmUgaW4gRXhlY3V0YWJsZSBmb3JtIGFzIHRvIGhvdyB0aGV5IGNhbiBvYnRhaW4gc3VjaCBDb3ZlcmVkIFNvZnR3YXJlIGluIFNvdXJjZSBDb2RlIGZvcm0gaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLgotCi0zLjIuIE1vZGlmaWNhdGlvbnMuCi0KLVRoZSBNb2RpZmljYXRpb25zIHRoYXQgWW91IGNyZWF0ZSBvciB0byB3aGljaCBZb3UgY29udHJpYnV0ZSBhcmUgZ292ZXJuZWQgYnkgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4gWW91IHJlcHJlc2VudCB0aGF0IFlvdSBiZWxpZXZlIFlvdXIgTW9kaWZpY2F0aW9ucyBhcmUgWW91ciBvcmlnaW5hbCBjcmVhdGlvbihzKSBhbmQvb3IgWW91IGhhdmUgc3VmZmljaWVudCByaWdodHMgdG8gZ3JhbnQgdGhlIHJpZ2h0cyBjb252ZXllZCBieSB0aGlzIExpY2Vuc2UuCi0KLTMuMy4gUmVxdWlyZWQgTm90aWNlcy4KLVlvdSBtdXN0IGluY2x1ZGUgYSBub3RpY2UgaW4gZWFjaCBvZiBZb3VyIE1vZGlmaWNhdGlvbnMgdGhhdCBpZGVudGlmaWVzIFlvdSBhcyB0aGUgQ29udHJpYnV0b3Igb2YgdGhlIE1vZGlmaWNhdGlvbi4gWW91IG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueSBjb3B5cmlnaHQsIHBhdGVudCBvciB0cmFkZW1hcmsgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBDb3ZlcmVkIFNvZnR3YXJlLCBvciBhbnkgbm90aWNlcyBvZiBsaWNlbnNpbmcgb3IgYW55IGRlc2NyaXB0aXZlIHRleHQgZ2l2aW5nIGF0dHJpYnV0aW9uIHRvIGFueSBDb250cmlidXRvciBvciB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuCi0KLTMuNC4gQXBwbGljYXRpb24gb2YgQWRkaXRpb25hbCBUZXJtcy4KLVlvdSBtYXkgbm90IG9mZmVyIG9yIGltcG9zZSBhbnkgdGVybXMgb24gYW55IENvdmVyZWQgU29mdHdhcmUgaW4gU291cmNlIENvZGUgZm9ybSB0aGF0IGFsdGVycyBvciByZXN0cmljdHMgdGhlIGFwcGxpY2FibGUgdmVyc2lvbiBvZiB0aGlzIExpY2Vuc2Ugb3IgdGhlIHJlY2lwaWVudHMgcmlnaHRzIGhlcmV1bmRlci4gWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsIGFuZCB0byBjaGFyZ2UgYSBmZWUgZm9yLCB3YXJyYW50eSwgc3VwcG9ydCwgaW5kZW1uaXR5IG9yIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyB0byBvbmUgb3IgbW9yZSByZWNpcGllbnRzIG9mIENvdmVyZWQgU29mdHdhcmUuIEhvd2V2ZXIsIHlvdSBtYXkgZG8gc28gb25seSBvbiBZb3VyIG93biBiZWhhbGYsIGFuZCBub3Qgb24gYmVoYWxmIG9mIHRoZSBJbml0aWFsIERldmVsb3BlciBvciBhbnkgQ29udHJpYnV0b3IuIFlvdSBtdXN0IG1ha2UgaXQgYWJzb2x1dGVseSBjbGVhciB0aGF0IGFueSBzdWNoIHdhcnJhbnR5LCBzdXBwb3J0LCBpbmRlbW5pdHkgb3IgbGlhYmlsaXR5IG9ibGlnYXRpb24gaXMgb2ZmZXJlZCBieSBZb3UgYWxvbmUsIGFuZCBZb3UgaGVyZWJ5IGFncmVlIHRvIGluZGVtbmlmeSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYW5kIGV2ZXJ5IENvbnRyaWJ1dG9yIGZvciBhbnkgbGlhYmlsaXR5IGluY3VycmVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBvciBzdWNoIENvbnRyaWJ1dG9yIGFzIGEgcmVzdWx0IG9mIHdhcnJhbnR5LCBzdXBwb3J0LCBpbmRlbW5pdHkgb3IgbGlhYmlsaXR5IHRlcm1zIFlvdSBvZmZlci4KLQotMy41LiBEaXN0cmlidXRpb24gb2YgRXhlY3V0YWJsZSBWZXJzaW9ucy4KLVlvdSBtYXkgZGlzdHJpYnV0ZSB0aGUgRXhlY3V0YWJsZSBmb3JtIG9mIHRoZSBDb3ZlcmVkIFNvZnR3YXJlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2Ugb3IgdW5kZXIgdGhlIHRlcm1zIG9mIGEgbGljZW5zZSBvZiBZb3VyIGNob2ljZSwgd2hpY2ggbWF5IGNvbnRhaW4gdGVybXMgZGlmZmVyZW50IGZyb20gdGhpcyBMaWNlbnNlLCBwcm92aWRlZCB0aGF0IFlvdSBhcmUgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UgYW5kIHRoYXQgdGhlIGxpY2Vuc2UgZm9yIHRoZSBFeGVjdXRhYmxlIGZvcm0gZG9lcyBub3QgYXR0ZW1wdCB0byBsaW1pdCBvciBhbHRlciB0aGUgcmVjaXBpZW50cyByaWdodHMgaW4gdGhlIFNvdXJjZSBDb2RlIGZvcm0gZnJvbSB0aGUgcmlnaHRzIHNldCBmb3J0aCBpbiB0aGlzIExpY2Vuc2UuIElmIFlvdSBkaXN0cmlidXRlIHRoZSBDb3ZlcmVkIFNvZnR3YXJlIGluIEV4ZWN1dGFibGUgZm9ybSB1bmRlciBhIGRpZmZlcmVudCBsaWNlbnNlLCBZb3UgbXVzdCBtYWtlIGl0IGFic29sdXRlbHkgY2xlYXIgdGhhdCBhbnkgdGVybXMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBMaWNlbnNlIGFyZSBvZmZlcmVkIGJ5IFlvdSBhbG9uZSwgbm90IGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBvciBDb250cmlidXRvci4gWW91IGhlcmVieSBhZ3JlZSB0byBpbmRlbW5pZnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFuZCBldmVyeSBDb250cmlidXRvciBmb3IgYW55IGxpYWJpbGl0eSBpbmN1cnJlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgb3Igc3VjaCBDb250cmlidXRvciBhcyBhIHJlc3VsdCBvZiBhbnkgc3VjaCB0ZXJtcyBZb3Ugb2ZmZXIuCi0KLTMuNi4gTGFyZ2VyIFdvcmtzLgotWW91IG1heSBjcmVhdGUgYSBMYXJnZXIgV29yayBieSBjb21iaW5pbmcgQ292ZXJlZCBTb2Z0d2FyZSB3aXRoIG90aGVyIGNvZGUgbm90IGdvdmVybmVkIGJ5IHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UgYW5kIGRpc3RyaWJ1dGUgdGhlIExhcmdlciBXb3JrIGFzIGEgc2luZ2xlIHByb2R1Y3QuIEluIHN1Y2ggYSBjYXNlLCBZb3UgbXVzdCBtYWtlIHN1cmUgdGhlIHJlcXVpcmVtZW50cyBvZiB0aGlzIExpY2Vuc2UgYXJlIGZ1bGZpbGxlZCBmb3IgdGhlIENvdmVyZWQgU29mdHdhcmUuCi0KLTQuIFZlcnNpb25zIG9mIHRoZSBMaWNlbnNlLgotCi00LjEuIE5ldyBWZXJzaW9ucy4KLVN1biBNaWNyb3N5c3RlbXMsIEluYy4gaXMgdGhlIGluaXRpYWwgbGljZW5zZSBzdGV3YXJkIGFuZCBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcgdmVyc2lvbnMgb2YgdGhpcyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLiBFYWNoIHZlcnNpb24gd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBFeGNlcHQgYXMgcHJvdmlkZWQgaW4gU2VjdGlvbiA0LjMsIG5vIG9uZSBvdGhlciB0aGFuIHRoZSBsaWNlbnNlIHN0ZXdhcmQgaGFzIHRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBMaWNlbnNlLgotCi00LjIuIEVmZmVjdCBvZiBOZXcgVmVyc2lvbnMuCi0KLVlvdSBtYXkgYWx3YXlzIGNvbnRpbnVlIHRvIHVzZSwgZGlzdHJpYnV0ZSBvciBvdGhlcndpc2UgbWFrZSB0aGUgQ292ZXJlZCBTb2Z0d2FyZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSB2ZXJzaW9uIG9mIHRoZSBMaWNlbnNlIHVuZGVyIHdoaWNoIFlvdSBvcmlnaW5hbGx5IHJlY2VpdmVkIHRoZSBDb3ZlcmVkIFNvZnR3YXJlLiBJZiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgaW5jbHVkZXMgYSBub3RpY2UgaW4gdGhlIE9yaWdpbmFsIFNvZnR3YXJlIHByb2hpYml0aW5nIGl0IGZyb20gYmVpbmcgZGlzdHJpYnV0ZWQgb3Igb3RoZXJ3aXNlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIGFueSBzdWJzZXF1ZW50IHZlcnNpb24gb2YgdGhlIExpY2Vuc2UsIFlvdSBtdXN0IGRpc3RyaWJ1dGUgYW5kIG1ha2UgdGhlIENvdmVyZWQgU29mdHdhcmUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgdmVyc2lvbiBvZiB0aGUgTGljZW5zZSB1bmRlciB3aGljaCBZb3Ugb3JpZ2luYWxseSByZWNlaXZlZCB0aGUgQ292ZXJlZCBTb2Z0d2FyZS4gT3RoZXJ3aXNlLCBZb3UgbWF5IGFsc28gY2hvb3NlIHRvIHVzZSwgZGlzdHJpYnV0ZSBvciBvdGhlcndpc2UgbWFrZSB0aGUgQ292ZXJlZCBTb2Z0d2FyZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIGFueSBzdWJzZXF1ZW50IHZlcnNpb24gb2YgdGhlIExpY2Vuc2UgcHVibGlzaGVkIGJ5IHRoZSBsaWNlbnNlIHN0ZXdhcmQuCi00LjMuIE1vZGlmaWVkIFZlcnNpb25zLgotCi1XaGVuIFlvdSBhcmUgYW4gSW5pdGlhbCBEZXZlbG9wZXIgYW5kIFlvdSB3YW50IHRvIGNyZWF0ZSBhIG5ldyBsaWNlbnNlIGZvciBZb3VyIE9yaWdpbmFsIFNvZnR3YXJlLCBZb3UgbWF5IGNyZWF0ZSBhbmQgdXNlIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGlzIExpY2Vuc2UgaWYgWW91OiAoYSnvv71yZW5hbWUgdGhlIGxpY2Vuc2UgYW5kIHJlbW92ZSBhbnkgcmVmZXJlbmNlcyB0byB0aGUgbmFtZSBvZiB0aGUgbGljZW5zZSBzdGV3YXJkIChleGNlcHQgdG8gbm90ZSB0aGF0IHRoZSBsaWNlbnNlIGRpZmZlcnMgZnJvbSB0aGlzIExpY2Vuc2UpOyBhbmQgKGIp77+9b3RoZXJ3aXNlIG1ha2UgaXQgY2xlYXIgdGhhdCB0aGUgbGljZW5zZSBjb250YWlucyB0ZXJtcyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIExpY2Vuc2UuCi0KLTUuIERJU0NMQUlNRVIgT0YgV0FSUkFOVFkuCi0KLUNPVkVSRUQgU09GVFdBUkUgSVMgUFJPVklERUQgVU5ERVIgVEhJUyBMSUNFTlNFIE9OIEFOIEFTIElTIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBXQVJSQU5USUVTIFRIQVQgVEhFIENPVkVSRUQgU09GVFdBUkUgSVMgRlJFRSBPRiBERUZFQ1RTLCBNRVJDSEFOVEFCTEUsIEZJVCBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgT1IgTk9OLUlORlJJTkdJTkcuIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIENPVkVSRUQgU09GVFdBUkUgSVMgV0lUSCBZT1UuIFNIT1VMRCBBTlkgQ09WRVJFRCBTT0ZUV0FSRSBQUk9WRSBERUZFQ1RJVkUgSU4gQU5ZIFJFU1BFQ1QsIFlPVSAoTk9UIFRIRSBJTklUSUFMIERFVkVMT1BFUiBPUiBBTlkgT1RIRVIgQ09OVFJJQlVUT1IpIEFTU1VNRSBUSEUgQ09TVCBPRiBBTlkgTkVDRVNTQVJZIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uIFRISVMgRElTQ0xBSU1FUiBPRiBXQVJSQU5UWSBDT05TVElUVVRFUyBBTiBFU1NFTlRJQUwgUEFSVCBPRiBUSElTIExJQ0VOU0UuIE5PIFVTRSBPRiBBTlkgQ09WRVJFRCBTT0ZUV0FSRSBJUyBBVVRIT1JJWkVEIEhFUkVVTkRFUiBFWENFUFQgVU5ERVIgVEhJUyBESVNDTEFJTUVSLgotCi02LiBURVJNSU5BVElPTi4KLQotNi4xLiBUaGlzIExpY2Vuc2UgYW5kIHRoZSByaWdodHMgZ3JhbnRlZCBoZXJldW5kZXIgd2lsbCB0ZXJtaW5hdGUgYXV0b21hdGljYWxseSBpZiBZb3UgZmFpbCB0byBjb21wbHkgd2l0aCB0ZXJtcyBoZXJlaW4gYW5kIGZhaWwgdG8gY3VyZSBzdWNoIGJyZWFjaCB3aXRoaW4gMzAgZGF5cyBvZiBiZWNvbWluZyBhd2FyZSBvZiB0aGUgYnJlYWNoLiBQcm92aXNpb25zIHdoaWNoLCBieSB0aGVpciBuYXR1cmUsIG11c3QgcmVtYWluIGluIGVmZmVjdCBiZXlvbmQgdGhlIHRlcm1pbmF0aW9uIG9mIHRoaXMgTGljZW5zZSBzaGFsbCBzdXJ2aXZlLgotCi02LjIuIElmIFlvdSBhc3NlcnQgYSBwYXRlbnQgaW5mcmluZ2VtZW50IGNsYWltIChleGNsdWRpbmcgZGVjbGFyYXRvcnkganVkZ21lbnQgYWN0aW9ucykgYWdhaW5zdCBJbml0aWFsIERldmVsb3BlciBvciBhIENvbnRyaWJ1dG9yICh0aGUgSW5pdGlhbCBEZXZlbG9wZXIgb3IgQ29udHJpYnV0b3IgYWdhaW5zdCB3aG9tIFlvdSBhc3NlcnQgc3VjaCBjbGFpbSBpcyByZWZlcnJlZCB0byBhcyBQYXJ0aWNpcGFudCkgYWxsZWdpbmcgdGhhdCB0aGUgUGFydGljaXBhbnQgU29mdHdhcmUgKG1lYW5pbmcgdGhlIENvbnRyaWJ1dG9yIFZlcnNpb24gd2hlcmUgdGhlIFBhcnRpY2lwYW50IGlzIGEgQ29udHJpYnV0b3Igb3IgdGhlIE9yaWdpbmFsIFNvZnR3YXJlIHdoZXJlIHRoZSBQYXJ0aWNpcGFudCBpcyB0aGUgSW5pdGlhbCBEZXZlbG9wZXIpIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgaW5mcmluZ2VzIGFueSBwYXRlbnQsIHRoZW4gYW55IGFuZCBhbGwgcmlnaHRzIGdyYW50ZWQgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSB0byBZb3UgYnkgc3VjaCBQYXJ0aWNpcGFudCwgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIChpZiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgaXMgbm90IHRoZSBQYXJ0aWNpcGFudCkgYW5kIGFsbCBDb250cmlidXRvcnMgdW5kZXIgU2VjdGlvbnPvv70yLjEgYW5kL29yIDIuMiBvZiB0aGlzIExpY2Vuc2Ugc2hhbGwsIHVwb24gNjAgZGF5cyBub3RpY2UgZnJvbSBQYXJ0aWNpcGFudCB0ZXJtaW5hdGUgcHJvc3BlY3RpdmVseSBhbmQgYXV0b21hdGljYWxseSBhdCB0aGUgZXhwaXJhdGlvbiBvZiBzdWNoIDYwIGRheSBub3RpY2UgcGVyaW9kLCB1bmxlc3MgaWYgd2l0aGluIHN1Y2ggNjAgZGF5IHBlcmlvZCBZb3Ugd2l0aGRyYXcgWW91ciBjbGFpbSB3aXRoIHJlc3BlY3QgdG8gdGhlIFBhcnRpY2lwYW50IFNvZnR3YXJlIGFnYWluc3Qgc3VjaCBQYXJ0aWNpcGFudCBlaXRoZXIgdW5pbGF0ZXJhbGx5IG9yIHB1cnN1YW50IHRvIGEgd3JpdHRlbiBhZ3JlZW1lbnQgd2l0aCBQYXJ0aWNpcGFudC4KLQotNi4zLiBJbiB0aGUgZXZlbnQgb2YgdGVybWluYXRpb24gdW5kZXIgU2VjdGlvbnPvv702LjEgb3IgNi4yIGFib3ZlLCBhbGwgZW5kIHVzZXIgbGljZW5zZXMgdGhhdCBoYXZlIGJlZW4gdmFsaWRseSBncmFudGVkIGJ5IFlvdSBvciBhbnkgZGlzdHJpYnV0b3IgaGVyZXVuZGVyIHByaW9yIHRvIHRlcm1pbmF0aW9uIChleGNsdWRpbmcgbGljZW5zZXMgZ3JhbnRlZCB0byBZb3UgYnkgYW55IGRpc3RyaWJ1dG9yKSBzaGFsbCBzdXJ2aXZlIHRlcm1pbmF0aW9uLgotCi03LiBMSU1JVEFUSU9OIE9GIExJQUJJTElUWS4KLQotVU5ERVIgTk8gQ0lSQ1VNU1RBTkNFUyBBTkQgVU5ERVIgTk8gTEVHQUwgVEhFT1JZLCBXSEVUSEVSIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFKSwgQ09OVFJBQ1QsIE9SIE9USEVSV0lTRSwgU0hBTEwgWU9VLCBUSEUgSU5JVElBTCBERVZFTE9QRVIsIEFOWSBPVEhFUiBDT05UUklCVVRPUiwgT1IgQU5ZIERJU1RSSUJVVE9SIE9GIENPVkVSRUQgU09GVFdBUkUsIE9SIEFOWSBTVVBQTElFUiBPRiBBTlkgT0YgU1VDSCBQQVJUSUVTLCBCRSBMSUFCTEUgVE8gQU5ZIFBFUlNPTiBGT1IgQU5ZIElORElSRUNULCBTUEVDSUFMLCBJTkNJREVOVEFMLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT0YgQU5ZIENIQVJBQ1RFUiBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgREFNQUdFUyBGT1IgTE9TVCBQUk9GSVRTLCBMT1NTIE9GIEdPT0RXSUxMLCBXT1JLIFNUT1BQQUdFLCBDT01QVVRFUiBGQUlMVVJFIE9SIE1BTEZVTkNUSU9OLCBPUiBBTlkgQU5EIEFMTCBPVEhFUiBDT01NRVJDSUFMIERBTUFHRVMgT1IgTE9TU0VTLCBFVkVOIElGIFNVQ0ggUEFSVFkgU0hBTEwgSEFWRSBCRUVOIElORk9STUVEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuIFRISVMgTElNSVRBVElPTiBPRiBMSUFCSUxJVFkgU0hBTEwgTk9UIEFQUExZIFRPIExJQUJJTElUWSBGT1IgREVBVEggT1IgUEVSU09OQUwgSU5KVVJZIFJFU1VMVElORyBGUk9NIFNVQ0ggUEFSVFlTIE5FR0xJR0VOQ0UgVE8gVEhFIEVYVEVOVCBBUFBMSUNBQkxFIExBVyBQUk9ISUJJVFMgU1VDSCBMSU1JVEFUSU9OLiBTT01FIEpVUklTRElDVElPTlMgRE8gTk9UIEFMTE9XIFRIRSBFWENMVVNJT04gT1IgTElNSVRBVElPTiBPRiBJTkNJREVOVEFMIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUywgU08gVEhJUyBFWENMVVNJT04gQU5EIExJTUlUQVRJT04gTUFZIE5PVCBBUFBMWSBUTyBZT1UuCi0KLTguIFUuUy4gR09WRVJOTUVOVCBFTkQgVVNFUlMuCi0KLVRoZSBDb3ZlcmVkIFNvZnR3YXJlIGlzIGEgY29tbWVyY2lhbCBpdGVtLCBhcyB0aGF0IHRlcm0gaXMgZGVmaW5lZCBpbiA0OO+/vUMuRi5SLu+/vTIuMTAxIChPY3QuIDE5OTUpLCBjb25zaXN0aW5nIG9mIGNvbW1lcmNpYWwgY29tcHV0ZXIgc29mdHdhcmUgKGFzIHRoYXQgdGVybSBpcyBkZWZpbmVkIGF0IDQ4IEMuRi5SLiDvv70yNTIuMjI3LTcwMTQoYSkoMSkpIGFuZCBjb21tZXJjaWFsIGNvbXB1dGVyIHNvZnR3YXJlIGRvY3VtZW50YXRpb24gYXMgc3VjaCB0ZXJtcyBhcmUgdXNlZCBpbiA0OO+/vUMuRi5SLu+/vTEyLjIxMiAoU2VwdC4gMTk5NSkuIENvbnNpc3RlbnQgd2l0aCA0OCBDLkYuUi4gMTIuMjEyIGFuZCA0OCBDLkYuUi4gMjI3LjcyMDItMSB0aHJvdWdoIDIyNy43MjAyLTQgKEp1bmUgMTk5NSksIGFsbCBVLlMuIEdvdmVybm1lbnQgRW5kIFVzZXJzIGFjcXVpcmUgQ292ZXJlZCBTb2Z0d2FyZSB3aXRoIG9ubHkgdGhvc2UgcmlnaHRzIHNldCBmb3J0aCBoZXJlaW4uIFRoaXMgVS5TLiBHb3Zlcm5tZW50IFJpZ2h0cyBjbGF1c2UgaXMgaW4gbGlldSBvZiwgYW5kIHN1cGVyc2VkZXMsIGFueSBvdGhlciBGQVIsIERGQVIsIG9yIG90aGVyIGNsYXVzZSBvciBwcm92aXNpb24gdGhhdCBhZGRyZXNzZXMgR292ZXJubWVudCByaWdodHMgaW4gY29tcHV0ZXIgc29mdHdhcmUgdW5kZXIgdGhpcyBMaWNlbnNlLgotCi05LiBNSVNDRUxMQU5FT1VTLgotCi1UaGlzIExpY2Vuc2UgcmVwcmVzZW50cyB0aGUgY29tcGxldGUgYWdyZWVtZW50IGNvbmNlcm5pbmcgc3ViamVjdCBtYXR0ZXIgaGVyZW9mLiBJZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBoZWxkIHRvIGJlIHVuZW5mb3JjZWFibGUsIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIG9ubHkgdG8gdGhlIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBpdCBlbmZvcmNlYWJsZS4gVGhpcyBMaWNlbnNlIHNoYWxsIGJlIGdvdmVybmVkIGJ5IHRoZSBsYXcgb2YgdGhlIGp1cmlzZGljdGlvbiBzcGVjaWZpZWQgaW4gYSBub3RpY2UgY29udGFpbmVkIHdpdGhpbiB0aGUgT3JpZ2luYWwgU29mdHdhcmUgKGV4Y2VwdCB0byB0aGUgZXh0ZW50IGFwcGxpY2FibGUgbGF3LCBpZiBhbnksIHByb3ZpZGVzIG90aGVyd2lzZSksIGV4Y2x1ZGluZyBzdWNoIGp1cmlzZGljdGlvbnMgY29uZmxpY3Qtb2YtbGF3IHByb3Zpc2lvbnMuIEFueSBsaXRpZ2F0aW9uIHJlbGF0aW5nIHRvIHRoaXMgTGljZW5zZSBzaGFsbCBiZSBzdWJqZWN0IHRvIHRoZSBqdXJpc2RpY3Rpb24gb2YgdGhlIGNvdXJ0cyBsb2NhdGVkIGluIHRoZSBqdXJpc2RpY3Rpb24gYW5kIHZlbnVlIHNwZWNpZmllZCBpbiBhIG5vdGljZSBjb250YWluZWQgd2l0aGluIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSwgd2l0aCB0aGUgbG9zaW5nIHBhcnR5IHJlc3BvbnNpYmxlIGZvciBjb3N0cywgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGNvdXJ0IGNvc3RzIGFuZCByZWFzb25hYmxlIGF0dG9ybmV5cyBmZWVzIGFuZCBleHBlbnNlcy4gVGhlIGFwcGxpY2F0aW9uIG9mIHRoZSBVbml0ZWQgTmF0aW9ucyBDb252ZW50aW9uIG9uIENvbnRyYWN0cyBmb3IgdGhlIEludGVybmF0aW9uYWwgU2FsZSBvZiBHb29kcyBpcyBleHByZXNzbHkgZXhjbHVkZWQuIEFueSBsYXcgb3IgcmVndWxhdGlvbiB3aGljaCBwcm92aWRlcyB0aGF0IHRoZSBsYW5ndWFnZSBvZiBhIGNvbnRyYWN0IHNoYWxsIGJlIGNvbnN0cnVlZCBhZ2FpbnN0IHRoZSBkcmFmdGVyIHNoYWxsIG5vdCBhcHBseSB0byB0aGlzIExpY2Vuc2UuIFlvdSBhZ3JlZSB0aGF0IFlvdSBhbG9uZSBhcmUgcmVzcG9uc2libGUgZm9yIGNvbXBsaWFuY2Ugd2l0aCB0aGUgVW5pdGVkIFN0YXRlcyBleHBvcnQgYWRtaW5pc3RyYXRpb24gcmVndWxhdGlvbnMgKGFuZCB0aGUgZXhwb3J0IGNvbnRyb2wgbGF3cyBhbmQgcmVndWxhdGlvbiBvZiBhbnkgb3RoZXIgY291bnRyaWVzKSB3aGVuIFlvdSB1c2UsIGRpc3RyaWJ1dGUgb3Igb3RoZXJ3aXNlIG1ha2UgYXZhaWxhYmxlIGFueSBDb3ZlcmVkIFNvZnR3YXJlLgotCi0xMC4gUkVTUE9OU0lCSUxJVFkgRk9SIENMQUlNUy4KLQotQXMgYmV0d2VlbiBJbml0aWFsIERldmVsb3BlciBhbmQgdGhlIENvbnRyaWJ1dG9ycywgZWFjaCBwYXJ0eSBpcyByZXNwb25zaWJsZSBmb3IgY2xhaW1zIGFuZCBkYW1hZ2VzIGFyaXNpbmcsIGRpcmVjdGx5IG9yIGluZGlyZWN0bHksIG91dCBvZiBpdHMgdXRpbGl6YXRpb24gb2YgcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZSBhbmQgWW91IGFncmVlIHRvIHdvcmsgd2l0aCBJbml0aWFsIERldmVsb3BlciBhbmQgQ29udHJpYnV0b3JzIHRvIGRpc3RyaWJ1dGUgc3VjaCByZXNwb25zaWJpbGl0eSBvbiBhbiBlcXVpdGFibGUgYmFzaXMuIE5vdGhpbmcgaGVyZWluIGlzIGludGVuZGVkIG9yIHNoYWxsIGJlIGRlZW1lZCB0byBjb25zdGl0dXRlIGFueSBhZG1pc3Npb24gb2YgbGlhYmlsaXR5LgotCi1OT1RJQ0UgUFVSU1VBTlQgVE8gU0VDVElPTiA5IE9GIFRIRSBDT01NT04gREVWRUxPUE1FTlQgQU5EIERJU1RSSUJVVElPTiBMSUNFTlNFIChDRERMKQotVGhlIEdsYXNzRmlzaCBjb2RlIHJlbGVhc2VkIHVuZGVyIHRoZSBDRERMIHNoYWxsIGJlIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZSBTdGF0ZSBvZiBDYWxpZm9ybmlhIChleGNsdWRpbmcgY29uZmxpY3Qtb2YtbGF3IHByb3Zpc2lvbnMpLiBBbnkgbGl0aWdhdGlvbiByZWxhdGluZyB0byB0aGlzIExpY2Vuc2Ugc2hhbGwgYmUgc3ViamVjdCB0byB0aGUganVyaXNkaWN0aW9uIG9mIHRoZSBGZWRlcmFsIENvdXJ0cyBvZiB0aGUgTm9ydGhlcm4gRGlzdHJpY3Qgb2YgQ2FsaWZvcm5pYSBhbmQgdGhlIHN0YXRlIGNvdXJ0cyBvZiB0aGUgU3RhdGUgb2YgQ2FsaWZvcm5pYSwgd2l0aCB2ZW51ZSBseWluZyBpbiBTYW50YSBDbGFyYSBDb3VudHksIENhbGlmb3JuaWEuIAotCi0KLQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL2xlZ2FsL25lZXRoaS1MSUNFTlNFLnR4dCBiL3YxLjUuMVJDMy9sZWdhbC9uZWV0aGktTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3YmM4OGEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL2xlZ2FsL25lZXRoaS1MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgotCi0gICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQotICAgQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLgotCi0gICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwotICAgICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIgotICAgICAgcmVwbGFjZWQgd2l0aCB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gKERvbid0IGluY2x1ZGUKLSAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCi0gICAgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGEKLSAgICAgIGZpbGUgb3IgY2xhc3MgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgcHVycG9zZSBiZSBpbmNsdWRlZCBvbiB0aGUKLSAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgotICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLgotCi0gICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KLQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL2xlZ2FsL3dvZGVuLWFwaS1MSUNFTlNFLnR4dCBiL3YxLjUuMVJDMy9sZWdhbC93b2Rlbi1hcGktTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3YmM4OGEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL2xlZ2FsL3dvZGVuLWFwaS1MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgotCi0gICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQotICAgQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLgotCi0gICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwotICAgICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIgotICAgICAgcmVwbGFjZWQgd2l0aCB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gKERvbid0IGluY2x1ZGUKLSAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCi0gICAgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGEKLSAgICAgIGZpbGUgb3IgY2xhc3MgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgcHVycG9zZSBiZSBpbmNsdWRlZCBvbiB0aGUKLSAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgotICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLgotCi0gICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KLQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL2xlZ2FsL3dvZGVuLWltcGwtZG9tLUxJQ0VOU0UudHh0IGIvdjEuNS4xUkMzL2xlZ2FsL3dvZGVuLWltcGwtZG9tLUxJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2JjODhhLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9sZWdhbC93b2Rlbi1pbXBsLWRvbS1MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgotCi0gICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQotICAgQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLgotCi0gICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwotICAgICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIgotICAgICAgcmVwbGFjZWQgd2l0aCB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gKERvbid0IGluY2x1ZGUKLSAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCi0gICAgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGEKLSAgICAgIGZpbGUgb3IgY2xhc3MgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgcHVycG9zZSBiZSBpbmNsdWRlZCBvbiB0aGUKLSAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgotICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLgotCi0gICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KLQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL2xlZ2FsL3dzZGw0ai1MSUNFTlNFLnR4dCBiL3YxLjUuMVJDMy9sZWdhbC93c2RsNGotTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmYzRkMWYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL2xlZ2FsL3dzZGw0ai1MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLUNvbW1vbiBQdWJsaWMgTGljZW5zZSAtIHYgMS4wIA0KLQ0KLQ0KLVRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUiBUSEUgVEVSTVMgT0YgVEhJUyBDT01NT04gUFVCTElDIExJQ0VOU0UgKCJBR1JFRU1FTlQiKS4gQU5ZIFVTRSwgUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFIE9GIFRISVMgQUdSRUVNRU5ULiANCi0NCi0NCi0xLiBERUZJTklUSU9OUyANCi0NCi0iQ29udHJpYnV0aW9uIiBtZWFuczogDQotDQotYSkgaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24gZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZA0KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjoNCi1pKSBjaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQNCi1paSkgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOw0KLXdoZXJlIHN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQgYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yIGlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uIHN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgUHJvZ3JhbS4gDQotDQotIkNvbnRyaWJ1dG9yIiBtZWFucyBhbnkgcGVyc29uIG9yIGVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLiANCi0NCi0NCi0iTGljZW5zZWQgUGF0ZW50cyAiIG1lYW4gcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlIG9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uIA0KLQ0KLQ0KLSJQcm9ncmFtIiBtZWFucyB0aGUgQ29udHJpYnV0aW9ucyBkaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuIA0KLQ0KLQ0KLSJSZWNpcGllbnQiIG1lYW5zIGFueW9uZSB3aG8gcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLiANCi0NCi0NCi0yLiBHUkFOVCBPRiBSSUdIVFMgDQotDQotYSkgU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uDQotYikgU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBwYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0IGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZCBieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbiB0byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvIGFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMgbGljZW5zZWQgaGVyZXVuZGVyLiANCi1jKSBSZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzIENvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yIHRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50IGZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZCBsaWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eSB0byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLCBpZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLg0KLWQpIEVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0IHJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4gdGhpcyBBZ3JlZW1lbnQuIA0KLTMuIFJFUVVJUkVNRU5UUyANCi0NCi1BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6IA0KLQ0KLWEpIGl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQNCi1iKSBpdHMgbGljZW5zZSBhZ3JlZW1lbnQ6DQotaSkgZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZCBjb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlIGFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgDQotaWkpIGVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2ggYXMgbG9zdCBwcm9maXRzOyANCi1paWkpIHN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQgQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZA0KLWl2KSBzdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kIGluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLiANCi1XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZSBjb2RlIGZvcm06IA0KLQ0KLWEpIGl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCANCi1iKSBhIGNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gDQotDQotQ29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueSBjb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiANCi0NCi0NCi1FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZSBvcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cyBzdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gDQotDQotDQotNC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT04gDQotDQotQ29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5IGFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMgYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2Ugb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwgbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoIkNvbW1lcmNpYWwgQ29udHJpYnV0b3IiKSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyIENvbnRyaWJ1dG9yICgiSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IiKSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kIGNvc3RzIChjb2xsZWN0aXZlbHkgIkxvc3NlcyIpIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlciBsZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0byB0aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluIGNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcyByZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIgdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kIGFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlIGluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS4gDQotDQotDQotRm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZSBjbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzIHNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZSBvdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhIGNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuIA0KLQ0KLQ0KLTUuIE5PIFdBUlJBTlRZIA0KLQ0KLUVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywgY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IgZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuIA0KLQ0KLQ0KLTYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZIA0KLQ0KLUVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuIA0KLQ0KLQ0KLTcuIEdFTkVSQUwgDQotDQotSWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dCBmdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZSBtaW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuIA0KLQ0KLQ0KLUlmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYSBDb250cmlidXRvciB3aXRoIHJlc3BlY3QgdG8gYSBwYXRlbnQgYXBwbGljYWJsZSB0byBzb2Z0d2FyZSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCksIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcyBncmFudGVkIGJ5IHRoYXQgQ29udHJpYnV0b3IgdG8gc3VjaCBSZWNpcGllbnQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gSW4gYWRkaXRpb24sIGlmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aCBvdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2ggUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIA0KLQ0KLQ0KLUFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlIHBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLCBSZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkgUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiANCi0NCi0NCi1FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMgY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50IFN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZiB0aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcyB0aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBJQk0gaXMgdGhlIGluaXRpYWwgQWdyZWVtZW50IFN0ZXdhcmQuIElCTSBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0byBzZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtIChpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mIHRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZCBpbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyIGV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QgZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLiANCi0NCi0NCi1UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUgU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMgQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcyBpdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uIA0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9sZWdhbC93c3R4LUxJQ0VOU0UudHh0IGIvdjEuNS4xUkMzL2xlZ2FsL3dzdHgtTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiMGIxMjcuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL2xlZ2FsL3dzdHgtTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyMDMgKzAsMCBAQAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgotCi0gICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQotICAgQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLgotCi0gICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwotICAgICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIgotICAgICAgcmVwbGFjZWQgd2l0aCB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gKERvbid0IGluY2x1ZGUKLSAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCi0gICAgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGEKLSAgICAgIGZpbGUgb3IgY2xhc3MgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgcHVycG9zZSBiZSBpbmNsdWRlZCBvbiB0aGUKLSAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgotICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLgotCi0gICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KLQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL2xlZ2FsL3hhbGFuLUxJQ0VOU0UudHh0IGIvdjEuNS4xUkMzL2xlZ2FsL3hhbGFuLUxJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWY4YzI5Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9sZWdhbC94YWxhbi1MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQNCi0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvDQotDQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9ODQotDQotICAgMS4gRGVmaW5pdGlvbnMuDQotDQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwNCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4NCi0NCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQ0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsDQotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbg0KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sDQotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlDQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3INCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUNCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5Lg0KLQ0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLA0KLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24NCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLg0KLQ0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsDQotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dA0KLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwNCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuDQotDQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3INCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhDQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrDQotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4NCi0NCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0DQotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQ0KLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMNCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3Nlcw0KLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbg0KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwNCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLg0KLQ0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nDQotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucw0KLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQ0KLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXINCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCINCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50DQotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8NCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLA0KLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlDQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0DQotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UNCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiINCi0NCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZA0KLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLg0KLQ0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLA0KLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQ0KLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uDQotDQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsDQotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssDQotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUNCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcg0KLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykNCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQ0KLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhDQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaw0KLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0DQotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcw0KLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQ0KLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4NCi0NCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQ0KLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dA0KLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91DQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQotDQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3INCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQNCi0NCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzDQotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZA0KLQ0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3Jrcw0KLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kDQotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssDQotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YNCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZA0KLQ0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cw0KLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0DQotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZA0KLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QNCi0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lDQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkDQotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3INCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsDQotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQNCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzDQotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQNCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24NCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUNCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkDQotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZA0KLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kDQotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3INCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwNCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgNCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwNCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsNCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLg0KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkNCi0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZA0KLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4NCi0NCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlDQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLA0KLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQ0KLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLg0KLQ0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcg0KLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gNCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3INCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucw0KLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEENCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUNCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkNCi0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuDQotDQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksDQotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsDQotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkNCi0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQ0KLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwNCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGENCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlDQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLA0KLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsDQotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcg0KLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4NCi0NCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nDQotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwNCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LA0KLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzDQotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkNCi0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZg0KLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwNCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkNCi0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uDQotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuDQotDQotICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TDQotDQotICAgQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLg0KLQ0KLSAgICAgIFRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmssIGF0dGFjaCB0aGUgZm9sbG93aW5nDQotICAgICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIg0KLSAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlDQotICAgICAgdGhlIGJyYWNrZXRzISkgIFRoZSB0ZXh0IHNob3VsZCBiZSBlbmNsb3NlZCBpbiB0aGUgYXBwcm9wcmlhdGUNCi0gICAgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGENCi0gICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlDQotICAgICAgc2FtZSAicHJpbnRlZCBwYWdlIiBhcyB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgZWFzaWVyDQotICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLg0KLQ0KLSAgIENvcHlyaWdodCBbeXl5eV0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXQ0KLQ0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9sZWdhbC94ZXJjZXNJbXBsLUxJQ0VOU0UudHh0IGIvdjEuNS4xUkMzL2xlZ2FsL3hlcmNlc0ltcGwtTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlZjhjMjkuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL2xlZ2FsL3hlcmNlc0ltcGwtTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0DQotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLw0KLQ0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTg0KLQ0KLSAgIDEuIERlZmluaXRpb25zLg0KLQ0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sDQotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuDQotDQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24NCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLA0KLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQ0KLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yDQotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlDQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4NCi0NCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywNCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uDQotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4NCi0NCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbA0KLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQNCi0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sDQotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLg0KLQ0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yDQotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQ0KLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaw0KLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuDQotDQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdA0KLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUNCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zDQotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMNCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4NCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsDQotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4NCi0NCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZw0KLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMNCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkNCi0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyDQotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mDQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiDQotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudA0KLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvDQotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywNCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQ0KLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dA0KLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlDQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iDQotDQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQNCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4NCi0NCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwNCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUNCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLg0KLQ0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLA0KLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLA0KLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlDQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXINCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpDQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UNCi0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQ0KLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsNCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdA0KLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMNCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUNCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuDQotDQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUNCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQNCi0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQ0KLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLQ0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yDQotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kDQotDQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcw0KLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQNCi0NCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MNCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZA0KLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLA0KLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mDQotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQNCi0NCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMNCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdA0KLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQNCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90DQotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQ0KLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZA0KLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yDQotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLA0KLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kDQotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cw0KLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kDQotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uDQotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlDQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZA0KLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQNCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZA0KLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMNCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yDQotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsDQotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoDQotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4NCi0NCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsDQotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrDQotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4NCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5DQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQNCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuDQotDQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQ0KLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwNCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUNCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4NCi0NCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3INCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoDQotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yDQotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMNCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBDQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlDQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55DQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LA0KLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLA0KLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5DQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUNCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsDQotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhDQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQ0KLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwNCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3INCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuDQotDQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZw0KLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsDQotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwNCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcw0KLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5DQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYNCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksDQotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5DQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbg0KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5Lg0KLQ0KLSAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUw0KLQ0KLSAgIEFQUEVORElYOiBIb3cgdG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yay4NCi0NCi0gICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZw0KLSAgICAgIGJvaWxlcnBsYXRlIG5vdGljZSwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzICJbXSINCi0gICAgICByZXBsYWNlZCB3aXRoIHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAoRG9uJ3QgaW5jbHVkZQ0KLSAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlDQotICAgICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhDQotICAgICAgZmlsZSBvciBjbGFzcyBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiBwdXJwb3NlIGJlIGluY2x1ZGVkIG9uIHRoZQ0KLSAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcg0KLSAgICAgIGlkZW50aWZpY2F0aW9uIHdpdGhpbiB0aGlyZC1wYXJ0eSBhcmNoaXZlcy4NCi0NCi0gICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0NCi0NCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCi0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQotICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbGVnYWwveG1sLWFwaXMtTElDRU5TRS50eHQgYi92MS41LjFSQzMvbGVnYWwveG1sLWFwaXMtTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3YmM4OGEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL2xlZ2FsL3htbC1hcGlzLUxJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0Ci0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCi0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgotCi0gICAxLiBEZWZpbml0aW9ucy4KLQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgotCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgotCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgotCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0Ci0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCi0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCi0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCi0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50Ci0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKLQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCi0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgotCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0Ci0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KLQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCi0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKLQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKLQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KLQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KLQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5Ci0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgotCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgotCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucwotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5Ci0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCi0KLSAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotCi0gICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCi0KLSAgICAgIFRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmssIGF0dGFjaCB0aGUgZm9sbG93aW5nCi0gICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCi0gICAgICByZXBsYWNlZCB3aXRoIHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAoRG9uJ3QgaW5jbHVkZQotICAgICAgdGhlIGJyYWNrZXRzISkgIFRoZSB0ZXh0IHNob3VsZCBiZSBlbmNsb3NlZCBpbiB0aGUgYXBwcm9wcmlhdGUKLSAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQotICAgICAgZmlsZSBvciBjbGFzcyBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiBwdXJwb3NlIGJlIGluY2x1ZGVkIG9uIHRoZQotICAgICAgc2FtZSAicHJpbnRlZCBwYWdlIiBhcyB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgZWFzaWVyCi0gICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCi0KLSAgIENvcHlyaWdodCBbeXl5eV0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXQotCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbGVnYWwveG1sLXJlc29sdmVyLUxJQ0VOU0UudHh0IGIvdjEuNS4xUkMzL2xlZ2FsL3htbC1yZXNvbHZlci1MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdiYzg4YS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbGVnYWwveG1sLXJlc29sdmVyLUxJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0Ci0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCi0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgotCi0gICAxLiBEZWZpbml0aW9ucy4KLQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgotCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgotCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgotCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0Ci0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCi0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCi0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCi0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50Ci0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKLQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCi0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgotCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0Ci0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KLQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCi0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKLQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKLQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KLQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KLQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5Ci0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgotCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgotCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucwotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5Ci0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCi0KLSAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotCi0gICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCi0KLSAgICAgIFRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmssIGF0dGFjaCB0aGUgZm9sbG93aW5nCi0gICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCi0gICAgICByZXBsYWNlZCB3aXRoIHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAoRG9uJ3QgaW5jbHVkZQotICAgICAgdGhlIGJyYWNrZXRzISkgIFRoZSB0ZXh0IHNob3VsZCBiZSBlbmNsb3NlZCBpbiB0aGUgYXBwcm9wcmlhdGUKLSAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQotICAgICAgZmlsZSBvciBjbGFzcyBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiBwdXJwb3NlIGJlIGluY2x1ZGVkIG9uIHRoZQotICAgICAgc2FtZSAicHJpbnRlZCBwYWdlIiBhcyB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgZWFzaWVyCi0gICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCi0KLSAgIENvcHlyaWdodCBbeXl5eV0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXQotCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbGVnYWwveG1sYmVhbnMtTElDRU5TRS50eHQgYi92MS41LjFSQzMvbGVnYWwveG1sYmVhbnMtTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlZjhjMjkuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL2xlZ2FsL3htbGJlYW5zLUxJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8NCi0NCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04NCi0NCi0gICAxLiBEZWZpbml0aW9ucy4NCi0NCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLA0KLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50Lg0KLQ0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5DQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwNCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uDQotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwNCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUNCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcg0KLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQ0KLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuDQotDQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuDQotDQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsDQotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbg0KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuDQotDQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwNCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0DQotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLA0KLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4NCi0NCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcg0KLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGENCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsNCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLg0KLQ0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QNCi0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlDQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucw0KLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzDQotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluDQotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLA0KLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuDQotDQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcNCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zDQotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5DQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcg0KLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZg0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIg0KLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQNCi0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bw0KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsDQotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUNCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQNCi0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQ0KLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIg0KLQ0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kDQotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuDQotDQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsDQotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlDQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4NCi0NCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwNCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywNCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQ0KLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyDQotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQ0KLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91DQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGENCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrDQotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QNCi0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzDQotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlDQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLg0KLQ0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlDQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0DQotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UNCi0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCi0NCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcg0KLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZA0KLQ0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMNCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kDQotDQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzDQotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQNCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywNCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZg0KLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kDQotDQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzDQotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QNCi0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkDQotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdA0KLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUNCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQNCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcg0KLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwNCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZA0KLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMNCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZA0KLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbg0KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQ0KLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQNCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkDQotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQNCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zDQotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcg0KLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLA0KLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aA0KLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuDQotDQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLA0KLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaw0KLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuDQotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQ0KLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkDQotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLg0KLQ0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUNCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsDQotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlDQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuDQotDQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yDQotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaA0KLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcg0KLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zDQotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQ0KLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQ0KLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQ0KLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4NCi0NCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwNCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwNCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQ0KLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlDQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLA0KLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQ0KLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUNCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsDQotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwNCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yDQotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLg0KLQ0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcNCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLA0KLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksDQotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMNCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQ0KLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmDQotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LA0KLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQ0KLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24NCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4NCi0NCi0gICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMNCi0NCi0gICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuDQotDQotICAgICAgVG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yaywgYXR0YWNoIHRoZSBmb2xsb3dpbmcNCi0gICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iDQotICAgICAgcmVwbGFjZWQgd2l0aCB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gKERvbid0IGluY2x1ZGUNCi0gICAgICB0aGUgYnJhY2tldHMhKSAgVGhlIHRleHQgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBhcHByb3ByaWF0ZQ0KLSAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQ0KLSAgICAgIGZpbGUgb3IgY2xhc3MgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgcHVycG9zZSBiZSBpbmNsdWRlZCBvbiB0aGUNCi0gICAgICBzYW1lICJwcmludGVkIHBhZ2UiIGFzIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciBlYXNpZXINCi0gICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuDQotDQotICAgQ29weXJpZ2h0IFt5eXl5XSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdDQotDQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vcG9tLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0ZDQyZDcuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItcGFyZW50PC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4xLjUuMTwvdmVyc2lvbj4KLSAgICAgICAgPHJlbGF0aXZlUGF0aD4uLi9wYXJlbnQvcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgotICAgIDwvcGFyZW50PgotICAgIDxhcnRpZmFjdElkPmF4aXMyLWFkYi1jb2RlZ2VuPC9hcnRpZmFjdElkPgotICAgIDxuYW1lPkFwYWNoZSBBeGlzMiAtIEFEQiBDb2RlZ2VuPC9uYW1lPgotICAgIDxkZXNjcmlwdGlvbj5BREIgY29kZSBnZW5lcmF0aW9uIHN1cHBvcnQgZm9yIEF4aXMyPC9kZXNjcmlwdGlvbj4KLSAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1hZGI8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3ZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLWNvZGVnZW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3ZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLWtlcm5lbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7dmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+WG1sU2NoZW1hPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPC9kZXBlbmRlbmNpZXM+Ci0gICAgPGJ1aWxkPgotICAgICAgICA8c291cmNlRGlyZWN0b3J5PnNyYzwvc291cmNlRGlyZWN0b3J5PgotICAgICAgICA8dGVzdFNvdXJjZURpcmVjdG9yeT50ZXN0PC90ZXN0U291cmNlRGlyZWN0b3J5PgotICAgICAgICA8cmVzb3VyY2VzPgotICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+Y29uZjwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxleGNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovKi5wcm9wZXJ0aWVzPC9leGNsdWRlPgotICAgICAgICAgICAgICAgIDwvZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgPGZpbHRlcmluZz5mYWxzZTwvZmlsdGVyaW5nPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYzwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxleGNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovKi5qYXZhPC9leGNsdWRlPgotICAgICAgICAgICAgICAgIDwvZXhjbHVkZXM+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+Li4vLi48L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPk5PVElDRS50eHQ8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPkxJQ0VOU0UudHh0PC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgPGZpbHRlcmluZz5mYWxzZTwvZmlsdGVyaW5nPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgPC9yZXNvdXJjZXM+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxza2lwPmZhbHNlPC9za2lwPgotICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi8qQWJzdHJhY3QqLmphdmE8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi8qVXRpbCouamF2YTwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqLypQaGFzZVJlc29sdmluZ1Rlc3QuamF2YTwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqLypVbmlvblFOYW1lVGVzdC5qYXZhPC9leGNsdWRlPgotICAgICAgICAgICAgICAgICAgICA8L2V4Y2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qVGVzdC5qYXZhPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYW50cnVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5wcm9jZXNzLXJlc291cmNlczwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cHJvY2Vzcy1yZXNvdXJjZXM8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhc2tzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHN0YW1wPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZvcm1hdCBwcm9wZXJ0eT0iYnVpbGQudGltZSIgcGF0dGVybj0iTU1NIGRkLCB5eXl5IChoaDptbTpzcyB6KSIgbG9jYWxlPSJlbiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RzdGFtcD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvcHkgdG9EaXI9IiR7YmFzZWRpcn0vdGFyZ2V0L2NsYXNzZXMvIiBvdmVyd3JpdGU9InRydWUiIGZpbHRlcmluZz0ib24iPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke2Jhc2VkaXJ9L3NyYy8iIGluY2x1ZGVzPSIqKi8qLnhzbCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbHRlcnNldCBiZWdpbnRva2VuPSIjIiBlbmR0b2tlbj0iIyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbHRlciB0b2tlbj0iYXhpc1ZlcnNpb24iIHZhbHVlPSIke3ZlcnNpb259Ii8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbHRlciB0b2tlbj0idG9kYXkiIHZhbHVlPSIgQnVpbHQgb24gOiAke2J1aWxkLnRpbWV9Ii8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbHRlcnNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb3B5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFza3M+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+cnVuPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+Z2VuZXJhdGUtdGVzdC1zb3VyY2VzPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5nZW5lcmF0ZS10ZXN0LXNvdXJjZXM8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhc2tzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ibWF2ZW4uanVuaXQuanZtYXJncyIgdmFsdWU9IiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBpZD0ibWF2ZW4uZGVwZW5kZW5jeS5jbGFzc3BhdGgiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggcmVmaWQ9Im1hdmVuLmNvbXBpbGUuY2xhc3NwYXRoIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImNvbXBpbGVkLmNsYXNzZXMuZGlyIiB2YWx1ZT0idGFyZ2V0L2NsYXNzZXMiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBUaGVyZXMgZ290IHRvIGJlIGEgYmV0dGVyIHdheSB0byBkbyB0aGlzIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ic2NoZW1hLnNvdXJjZS5kaXIiIHZhbHVlPSJ0ZXN0LXJlc291cmNlcy94c2QiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InRlc3RzdWl0ZS5zb3VyY2UuZGlyIiB2YWx1ZT0idGVzdC1yZXNvdXJjZXMvdGVzdHN1aXRlIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzY2hlbWEub3V0cHV0LmJhc2UuZGlyIiB2YWx1ZT0idGFyZ2V0L3NjaGVtYSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ic2NoZW1hLmdlbmVyYXRlZC5zcmMuZGlyIiB2YWx1ZT0iJHtzY2hlbWEub3V0cHV0LmJhc2UuZGlyfS9zcmMiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InNjaGVtYS5nZW5lcmF0ZWQuY2xhc3Nlcy5kaXIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0iJHtzY2hlbWEub3V0cHV0LmJhc2UuZGlyfS9jbGFzc2VzIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhbnQgYW50ZmlsZT0ic3ViLWJ1aWxkLnhtbCIgaW5oZXJpdGFsbD0idHJ1ZSIgaW5oZXJpdHJlZnM9InRydWUiIGRpcj0iLiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ9Im1haW4iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rhc2tzPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnJ1bjwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5idWlsZC1oZWxwZXItbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmFkZC10ZXN0LXNvdXJjZTwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cHJvY2Vzcy10ZXN0LXJlc291cmNlczwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+YWRkLXRlc3Qtc291cmNlPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzb3VyY2VzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c291cmNlPiR7YmFzZWRpcn0vdGFyZ2V0L3NjaGVtYS9zcmM8L3NvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NvdXJjZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgPC9idWlsZD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9CZWFuV3JpdGVyTWV0YUluZm9Ib2xkZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9CZWFuV3JpdGVyTWV0YUluZm9Ib2xkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E4Y2I3Yy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvQmVhbldyaXRlck1ldGFJbmZvSG9sZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MTkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYTsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpcyB1c2VkIGFzIGEgaG9sZGVyIHRvIHBhc3Mgb24gdGhlIG1ldGEgaW5mb3JtYXRpb24gdG8gdGhlIGJlYW4gd3JpdGVyLgotICogVGhpcyBtZXRhIGluZm9ybWF0aW9uIGlzIHVzZWQgYnkgdGhlIHdyaXRlciB0byB3cml0ZSB0aGUgZGF0YWJpbmRpbmcgY29udmVyc2lvbiBjb2RlLgotICogTm90ZSAtIE1ldGFpbmZob2xkZXJzIGFyZSBub3QgbWVhbnQgdG8gYmUgcmV1c2VkISEhLiBUaGV5IGFyZSBwZXItY2xhc3MgYmFzaXMgYW5kIGFyZSBzdHJpY3RseQotICogbm90IHRocmVhZCBzYWZlISEhIQotICovCi1wdWJsaWMgY2xhc3MgQmVhbldyaXRlck1ldGFJbmZvSG9sZGVyIHsKLQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gb3JkZXJlZCA9IGZhbHNlOwotICAgIHByb3RlY3RlZCBib29sZWFuIGFub255bW91cyA9IGZhbHNlOwotICAgIHByb3RlY3RlZCBib29sZWFuIGNob2ljZSA9IGZhbHNlOwotICAgIHByb3RlY3RlZCBib29sZWFuIHNpbXBsZSA9IGZhbHNlOwotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZXh0ZW5zaW9uID0gZmFsc2U7Ci0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcmVzdHJpY3Rpb24gPSBmYWxzZTsKLSAgICBwcml2YXRlIFN0cmluZyBleHRlbnNpb25DbGFzc05hbWUgPSAiIjsKLSAgICBwcml2YXRlIFN0cmluZyByZXN0cmljdGlvbkNsYXNzTmFtZSA9ICIiOwotICAgIHByaXZhdGUgUU5hbWUgZXh0ZW5zaW9uQmFzZVR5cGUgPSBudWxsOwotICAgIHByaXZhdGUgUU5hbWUgcmVzdHJpY3Rpb25CYXNlVHlwZSA9IG51bGw7Ci0gICAgcHJvdGVjdGVkIE1hcCBlbGVtZW50VG9TY2hlbWFRTmFtZU1hcCA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7Ci0gICAgcHJvdGVjdGVkIE1hcCBlbGVtZW50VG9KYXZhQ2xhc3NNYXAgPSBuZXcgTGlua2VkSGFzaE1hcCgpOwotICAgIHByb3RlY3RlZCBNYXAgc3BlY2lhbFR5cGVGbGFnTWFwID0gbmV3IExpbmtlZEhhc2hNYXAoKTsKLSAgICBwcm90ZWN0ZWQgTWFwIHFOYW1lTWF4T2NjdXJzQ291bnRNYXAgPSBuZXcgTGlua2VkSGFzaE1hcCgpOwotICAgIHByb3RlY3RlZCBNYXAgcU5hbWVNaW5PY2N1cnNDb3VudE1hcCA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7Ci0gICAgcHJvdGVjdGVkIE1hcCBxTmFtZU9yZGVyTWFwID0gbmV3IExpbmtlZEhhc2hNYXAoKTsKLSAgICBwcm90ZWN0ZWQgUU5hbWUgb3duUW5hbWUgPSBudWxsOwotICAgIHByb3RlY3RlZCBTdHJpbmcgb3duQ2xhc3NOYW1lID0gbnVsbDsKLQotICAgIHByb3RlY3RlZCBsb25nIGxlbmd0aEZhY2V0ID0gLTE7Ci0gICAgcHJvdGVjdGVkIGxvbmcgbWF4TGVuZ3RoRmFjZXQgPSAtMTsKLSAgICBwcm90ZWN0ZWQgbG9uZyBtaW5MZW5ndGhGYWNldCA9IC0xOwotICAgIHByb3RlY3RlZCBBcnJheUxpc3QgZW51bUZhY2V0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIHByb3RlY3RlZCBTdHJpbmcgcGF0dGVybkZhY2V0ID0gbnVsbDsKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIG1heEV4Y2x1c2l2ZUZhY2V0ID0gbnVsbDsKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIG1pbkV4Y2x1c2l2ZUZhY2V0ID0gbnVsbDsKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIG1heEluY2x1c2l2ZUZhY2V0ID0gbnVsbDsKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIG1pbkluY2x1c2l2ZUZhY2V0ID0gbnVsbDsKLQotICAgIHByb3RlY3RlZCBNYXAgbWVtYmVyVHlwZXMgPSBuZXcgSGFzaE1hcCgpOwotICAgIHByb3RlY3RlZCBNYXAgeG1sTmFtZUphdmFOYW1lTWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICBwcm90ZWN0ZWQgTGlzdCBtZW1iZXJUeXBlc0tleXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICBwcm90ZWN0ZWQgTWFwIGVsZW1lbnRRTmFtZVRvRGVmdWxhdFZhbHVlTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotICAgIHByb3RlY3RlZCBRTmFtZSBpdGVtVHlwZVFOYW1lOwotICAgIHByb3RlY3RlZCBTdHJpbmcgaXRlbVR5cGVDbGFzc05hbWU7Ci0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNVbmlvbjsKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0xpc3Q7Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1BhcnRpY2xlQ2xhc3M7Ci0gICAgLy8ga2VlcCB3aGV0aGVyIHRoaXMgY2xhc3MgaGFzIGEgcGFydGljYWwgY2xhc3MgdHlwZSB2YXJpYWJsZQotICAgIHByb3RlY3RlZCBib29sZWFuIGhhc1BhcnRpY2xlVHlwZTsKLQotICAgIHByb3RlY3RlZCBMaXN0IG5pbGxhYmxlUU5hbWVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgLy90aGUgcGFyZW50IG1ldGFpbmZvIGhvbGRlciwgdXNlZnVsIGluIGhhbmRsaW5nIGV4dGVuc2lvbnMgYW5kCi0gICAgLy9yZXN0cmljdGlvbnMKLSAgICBwcm90ZWN0ZWQgQmVhbldyaXRlck1ldGFJbmZvSG9sZGVyIHBhcmVudCA9IG51bGw7Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0Nob2ljZSgpIHsKLSAgICAgICAgcmV0dXJuIGNob2ljZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDaG9pY2UoYm9vbGVhbiBjaG9pY2UpIHsKLSAgICAgICAgdGhpcy5jaG9pY2UgPSBjaG9pY2U7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNTaW1wbGUoKSB7Ci0gICAgICAgIHJldHVybiBzaW1wbGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2ltcGxlKGJvb2xlYW4gc2ltcGxlKSB7Ci0gICAgICAgIHRoaXMuc2ltcGxlID0gc2ltcGxlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0T3duQ2xhc3NOYW1lKCkgewotICAgICAgICByZXR1cm4gb3duQ2xhc3NOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE93bkNsYXNzTmFtZShTdHJpbmcgb3duQ2xhc3NOYW1lKSB7Ci0gICAgICAgIHRoaXMub3duQ2xhc3NOYW1lID0gb3duQ2xhc3NOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBRTmFtZSBnZXRPd25RbmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG93blFuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE93blFuYW1lKFFOYW1lIG93blFuYW1lKSB7Ci0gICAgICAgIHRoaXMub3duUW5hbWUgPSBvd25RbmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBwYXJlbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgQmVhbldyaXRlck1ldGFJbmZvSG9sZGVyIGdldFBhcmVudCgpIHsKLSAgICAgICAgcmV0dXJuIHBhcmVudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBhbm9ueW1vdXMgc3RhdHVzLgotICAgICAqCi0gICAgICogQHJldHVybiBSZXR1cm5zIGJvb2xlYW4uCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNBbm9ueW1vdXMoKSB7Ci0gICAgICAgIHJldHVybiBhbm9ueW1vdXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgYW5vbnltb3VzIGZsYWcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYW5vbnltb3VzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0QW5vbnltb3VzKGJvb2xlYW4gYW5vbnltb3VzKSB7Ci0gICAgICAgIHRoaXMuYW5vbnltb3VzID0gYW5vbnltb3VzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGV4dGVuc2lvbnMgYmFzZSBjbGFzcyBuYW1lLiBWYWxpZCBvbmx5IHdoZW4gdGhlIGlzRXh0ZW5zaW9uCi0gICAgICogcmV0dXJucyB0cnVlLgotICAgICAqCi0gICAgICogQHJldHVybiBSZXR1cm5zIFN0cmluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEV4dGVuc2lvbkNsYXNzTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGV4dGVuc2lvbkNsYXNzTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBleHRlbnNpb25zIGJhc2UgY2xhc3MgbmFtZS4gVmFsaWQgb25seSB3aGVuIHRoZSBpc0V4dGVuc2lvbgotICAgICAqIHJldHVybnMgdHJ1ZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBleHRlbnNpb25DbGFzc05hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRFeHRlbnNpb25DbGFzc05hbWUoU3RyaW5nIGV4dGVuc2lvbkNsYXNzTmFtZSkgewotICAgICAgICB0aGlzLmV4dGVuc2lvbkNsYXNzTmFtZSA9IGV4dGVuc2lvbkNsYXNzTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBleHRlbnNpb24gc3RhdHVzLgotICAgICAqCi0gICAgICogQHJldHVybiBSZXR1cm5zIGJvb2xlYW4uCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNFeHRlbnNpb24oKSB7Ci0gICAgICAgIHJldHVybiBleHRlbnNpb247Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBleHRlbnNpb24gc3RhdHVzLgotICAgICAqCi0gICAgICogQHBhcmFtIGV4dGVuc2lvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEV4dGVuc2lvbihib29sZWFuIGV4dGVuc2lvbikgewotICAgICAgICB0aGlzLmV4dGVuc2lvbiA9IGV4dGVuc2lvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFJlc3RyaWN0aW9uQ2xhc3NOYW1lKCkgewotICAgICAgICByZXR1cm4gcmVzdHJpY3Rpb25DbGFzc05hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgcmVzdHJpY3Rpb24gYmFzZSBjbGFzcyBuYW1lLiBWYWxpZCBvbmx5IHdoZW4gdGhlIGlzUmVzdHJpY3Rpb24KLSAgICAgKiByZXR1cm5zIHRydWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVzdHJpY3Rpb25DbGFzc05hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRSZXN0cmljdGlvbkNsYXNzTmFtZShTdHJpbmcgcmVzdHJpY3Rpb25DbGFzc05hbWUpIHsKLSAgICAgICAgdGhpcy5yZXN0cmljdGlvbkNsYXNzTmFtZSA9IHJlc3RyaWN0aW9uQ2xhc3NOYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHJlc3RyaWN0aW9uIHN0YXR1cy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gUmV0dXJucyBib29sZWFuLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzUmVzdHJpY3Rpb24oKSB7Ci0gICAgICAgIHJldHVybiByZXN0cmljdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSByZXN0cmljdGlvbiBzdGF0dXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVzdHJpY3Rpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRSZXN0cmljdGlvbihib29sZWFuIHJlc3RyaWN0aW9uKSB7Ci0gICAgICAgIHRoaXMucmVzdHJpY3Rpb24gPSByZXN0cmljdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBleHRlbnNpb24gYmFzZXR5cGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZXh0ZW5zaW9uQmFzZVR5cGUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRFeHRlbnNpb25CYXNlVHlwZShRTmFtZSBleHRlbnNpb25CYXNlVHlwZSkgewotICAgICAgICB0aGlzLmV4dGVuc2lvbkJhc2VUeXBlID0gZXh0ZW5zaW9uQmFzZVR5cGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIGlmIGl0IGlzIGEgZXh0ZW5zaW9uIGJhc2UgdHlwZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBleHRlbnNpb25CYXNlVHlwZQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRXh0ZW5zaW9uQmFzZVR5cGUoUU5hbWUgZXh0ZW5zaW9uQmFzZVR5cGUpIHsKLSAgICAgICAgcmV0dXJuICh0aGlzLmV4dGVuc2lvbkJhc2VUeXBlID09IGV4dGVuc2lvbkJhc2VUeXBlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSByZXN0cmljdGlvbiBiYXNldHlwZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSByZXN0cmljdGlvbkJhc2VUeXBlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UmVzdHJpY3Rpb25CYXNlVHlwZShRTmFtZSByZXN0cmljdGlvbkJhc2VUeXBlKSB7Ci0gICAgICAgIHRoaXMucmVzdHJpY3Rpb25CYXNlVHlwZSA9IHJlc3RyaWN0aW9uQmFzZVR5cGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIGlmIGl0IGlzIGEgcmVzdHJpY3Rpb24gYmFzZSB0eXBlLgotICAgICAqCi0gICAgICogQHBhcmFtIHJlc3RyaWN0aW9uQmFzZVR5cGUKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Jlc3RyaWN0aW9uQmFzZVR5cGUoUU5hbWUgcmVzdHJpY3Rpb25CYXNlVHlwZSkgewotICAgICAgICBRTmFtZSBiYXNlVHlwZVFOYW1lID0gKFFOYW1lKSB0aGlzLmVsZW1lbnRUb1NjaGVtYVFOYW1lTWFwLmdldChyZXN0cmljdGlvbkJhc2VUeXBlKTsKLSAgICAgICAgcmV0dXJuICh0aGlzLnJlc3RyaWN0aW9uQmFzZVR5cGUgIT0gbnVsbCkgJiYgKGJhc2VUeXBlUU5hbWUgIT0gbnVsbCkgJiYKLSAgICAgICAgICAgICAgICB0aGlzLnJlc3RyaWN0aW9uQmFzZVR5cGUuZXF1YWxzKGJhc2VUeXBlUU5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIG9yZGVyZWQgc3RhdHVzLgotICAgICAqCi0gICAgICogQHJldHVybiBSZXR1cm5zIGJvb2xlYW4uCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNPcmRlcmVkKCkgewotICAgICAgICByZXR1cm4gb3JkZXJlZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBvcmRlcmVkIGZsYWcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb3JkZXJlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE9yZGVyZWQoYm9vbGVhbiBvcmRlcmVkKSB7Ci0gICAgICAgIHRoaXMub3JkZXJlZCA9IG9yZGVyZWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVnaXN0ZXJzIGEgbWFwcGluZy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBxTmFtZQotICAgICAqIEBwYXJhbSBzY2hlbWFOYW1lCi0gICAgICogQHBhcmFtIGphdmFDbGFzc05hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZWdpc3Rlck1hcHBpbmcoUU5hbWUgcU5hbWUsIFFOYW1lIHNjaGVtYU5hbWUsIFN0cmluZyBqYXZhQ2xhc3NOYW1lKSB7Ci0gICAgICAgIHJlZ2lzdGVyTWFwcGluZyhxTmFtZSwgc2NoZW1hTmFtZSwgamF2YUNsYXNzTmFtZSwgU2NoZW1hQ29uc3RhbnRzLkVMRU1FTlRfVFlQRSk7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBSZWdpc3RlcnMgYSBRbmFtZSBhcyBuaWxsYWJsZQotICAgICAqIFRoZSBxTmFtZSBiZXR0ZXIgYmUgb2YgYW4gZWxlbWVudAotICAgICAqCi0gICAgICogQHBhcmFtIHFOYW1lCi0gICAgICogQHBhcmFtIHNjaGVtYU5hbWUKLSAgICAgKiBAcGFyYW0gamF2YUNsYXNzTmFtZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyTmlsbGFibGVRTmFtZShRTmFtZSBlbHRRTmFtZSkgewotICAgICAgICBuaWxsYWJsZVFOYW1lTGlzdC5hZGQoZWx0UU5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciBhIFFOYW1lIGlzIG5pbGxhYmxlIG9yIG5vdAotICAgICAqCi0gICAgICogQHBhcmFtIGVsdFFOYW1lCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNOaWxsYWJsZShRTmFtZSBlbHRRTmFtZSkgewotICAgICAgICByZXR1cm4gbmlsbGFibGVRTmFtZUxpc3QuY29udGFpbnMoZWx0UU5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlZ2lzdGVycyBhIG1hcHBpbmcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcU5hbWUKLSAgICAgKiBAcGFyYW0gc2NoZW1hTmFtZQotICAgICAqIEBwYXJhbSBqYXZhQ2xhc3NOYW1lCi0gICAgICogQHBhcmFtIHR5cGUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZWdpc3Rlck1hcHBpbmcoUU5hbWUgcU5hbWUsIFFOYW1lIHNjaGVtYU5hbWUsIFN0cmluZyBqYXZhQ2xhc3NOYW1lLCBpbnQgdHlwZSkgewotICAgICAgICB0aGlzLmVsZW1lbnRUb0phdmFDbGFzc01hcC5wdXQocU5hbWUsIGphdmFDbGFzc05hbWUpOwotICAgICAgICB0aGlzLmVsZW1lbnRUb1NjaGVtYVFOYW1lTWFwLnB1dChxTmFtZSwgc2NoZW1hTmFtZSk7Ci0gICAgICAgIGFkZHRTdGF0dXMocU5hbWUsIHR5cGUpOwotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogdGhpcyBtZXRob2QgcmVnaXN0ZXJzIHRoZSBkZWZ1bHQgdmFsdWUgYWdhaXN0IHRoZSBlbGVtZW50IHFuYW1lLgotICAgICAqIEBwYXJhbSBxbmFtZQotICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRGVmYXVsdFZhbHVlKFFOYW1lIHFuYW1lLFN0cmluZyB2YWx1ZSl7Ci0gICAgICAgIHRoaXMuZWxlbWVudFFOYW1lVG9EZWZ1bGF0VmFsdWVNYXAucHV0KHFuYW1lLHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKgotICAgICAqIEBwYXJhbSBxbmFtZQotICAgICAqIEByZXR1cm4gaXMgYSBkZWZhdWx0IHZhbHVlIGF2YWlsYWJsZSBmb3IgdGhpcyBxbmFtZQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRGVmYXVsdFZhbHVlQXZhaWxhYmxlKFFOYW1lIHFuYW1lKXsKLSAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudFFOYW1lVG9EZWZ1bGF0VmFsdWVNYXAuY29udGFpbnNLZXkocW5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGdldHMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHFuYW1lCi0gICAgICogQHBhcmFtIHFuYW1lCi0gICAgICogQHJldHVybiBkZWZhdWx0IHZhbHVlIGZvciB0aGlzIHFuYW1lCi0gICAgICovCi0KLSAgICBwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRWYWx1ZUZvclFOYW1lKFFOYW1lIHFuYW1lKXsKLSAgICAgICAgcmV0dXJuIChTdHJpbmcpIHRoaXMuZWxlbWVudFFOYW1lVG9EZWZ1bGF0VmFsdWVNYXAuZ2V0KHFuYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBzY2hlbWEgbmFtZSBmb3IgdGhlIGdpdmVuIFFOYW1lLgotICAgICAqCi0gICAgICogQHBhcmFtIGVsdFFOYW1lCi0gICAgICogQHJldHVybiBSZXR1cm5zIFFOYW1lLgotICAgICAqLwotICAgIHB1YmxpYyBRTmFtZSBnZXRTY2hlbWFRTmFtZUZvclFOYW1lKFFOYW1lIGVsdFFOYW1lKSB7Ci0gICAgICAgIHJldHVybiAoUU5hbWUpIHRoaXMuZWxlbWVudFRvU2NoZW1hUU5hbWVNYXAuZ2V0KGVsdFFOYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBjbGFzcyBuYW1lIGZvciB0aGUgUU5hbWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZWx0UU5hbWUKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgU3RyaW5nLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lRm9yUU5hbWUoUU5hbWUgZWx0UU5hbWUpIHsKLSAgICAgICAgcmV0dXJuIChTdHJpbmcpIHRoaXMuZWxlbWVudFRvSmF2YUNsYXNzTWFwLmdldChlbHRRTmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB3aGV0aGVyIGEgZ2l2ZW4gUU5hbWUgaXMgYW4gYXR0cmlidXRlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcU5hbWUKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgYm9vbGVhbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRBdHRyaWJ1dGVTdGF0dXNGb3JRTmFtZShRTmFtZSBxTmFtZSkgewotCi0gICAgICAgIEludGVnZXIgc3RhdGUgPSAoSW50ZWdlcikgc3BlY2lhbFR5cGVGbGFnTWFwLmdldChxTmFtZSk7Ci0gICAgICAgIHJldHVybiBzdGF0ZSAhPSBudWxsICYmIGdldFN0YXR1cyhzdGF0ZS5pbnRWYWx1ZSgpLCBTY2hlbWFDb25zdGFudHMuQVRUUklCVVRFX1RZUEUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGNoZWNrcyB0aGUgZWxlbWVudCBjb3JyZXNwb25kcyB0byB0aGUgcU5hbWUgdHlwZSBpcyB4c2Q6YW55VHlwZQotICAgICAqCi0gICAgICogQHBhcmFtIHFOYW1lCi0gICAgICogQHJldHVybiBpcyBlbGVtZW50IGNvcnJlc3BvbmRzIHRvIHFOYW1lIGhhcyB4c2Q6YW55VHlwZQotICAgICAqLwotCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0RGVmYXVsdFN0YXR1c0ZvclFOYW1lKFFOYW1lIHFOYW1lKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNEZWZhdWx0ID0gZmFsc2U7Ci0gICAgICAgIFFOYW1lIHNjaGVtYVR5cGVRTmFtZSA9IChRTmFtZSkgdGhpcy5lbGVtZW50VG9TY2hlbWFRTmFtZU1hcC5nZXQocU5hbWUpOwotICAgICAgICBpZiAoc2NoZW1hVHlwZVFOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlzRGVmYXVsdCA9IHNjaGVtYVR5cGVRTmFtZS5lcXVhbHMoU2NoZW1hQ29uc3RhbnRzLlhTRF9BTllUWVBFKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXNEZWZhdWx0OwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogR2V0cyB3aGV0aGVyIGEgZ2l2ZW4gUU5hbWUgcmVwcmVzZW50cyBhIGFueVR5cGUKLSAgICAgKgotICAgICAqIEBwYXJhbSBxTmFtZQotICAgICAqIEByZXR1cm4gUmV0dXJucyBib29sZWFuLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGdldEFueVN0YXR1c0ZvclFOYW1lKFFOYW1lIHFOYW1lKSB7Ci0gICAgICAgIEludGVnZXIgc3RhdGUgPSAoSW50ZWdlcikgc3BlY2lhbFR5cGVGbGFnTWFwLmdldChxTmFtZSk7Ci0gICAgICAgIHJldHVybiBzdGF0ZSAhPSBudWxsICYmIGdldFN0YXR1cyhzdGF0ZS5pbnRWYWx1ZSgpLCBTY2hlbWFDb25zdGFudHMuQU5ZX1RZUEUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgd2hldGhlciBhIGdpdmVuIFFOYW1lIHJlZmVycyB0byBhbiBhcnJheS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBxTmFtZQotICAgICAqIEByZXR1cm4gUmV0dXJucyBib29sZWFuLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGdldEFycmF5U3RhdHVzRm9yUU5hbWUoUU5hbWUgcU5hbWUpIHsKLSAgICAgICAgSW50ZWdlciBzdGF0ZSA9IChJbnRlZ2VyKSBzcGVjaWFsVHlwZUZsYWdNYXAuZ2V0KHFOYW1lKTsKLSAgICAgICAgcmV0dXJuIHN0YXRlICE9IG51bGwgJiYgZ2V0U3RhdHVzKHN0YXRlLmludFZhbHVlKCksCi0gICAgICAgICAgICAgICAgU2NoZW1hQ29uc3RhbnRzLkFSUkFZX1RZUEUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgd2hldGhlciBhIGdpdmVuIFFOYW1lIHJlZmVycyB0byBiaW5hcnkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcU5hbWUKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgYm9vbGVhbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRCaW5hcnlTdGF0dXNGb3JRTmFtZShRTmFtZSBxTmFtZSkgewotICAgICAgICBJbnRlZ2VyIHN0YXRlID0gKEludGVnZXIpIHNwZWNpYWxUeXBlRmxhZ01hcC5nZXQocU5hbWUpOwotICAgICAgICByZXR1cm4gc3RhdGUgIT0gbnVsbCAmJiBnZXRTdGF0dXMoc3RhdGUuaW50VmFsdWUoKSwKLSAgICAgICAgICAgICAgICBTY2hlbWFDb25zdGFudHMuQklOQVJZX1RZUEUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqCi0gICAgICogQHBhcmFtIHFOYW1lCi0gICAgICogQHJldHVybiBpcyB0aGlzIGEgaW5uZXIgY2hvaWNlCi0gICAgICovCi0KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRJbm5lckNob2ljZVN0YXR1c0ZvclFOYW1lKFFOYW1lIHFOYW1lKXsKLSAgICAgICAgSW50ZWdlciBzdGF0ZSA9IChJbnRlZ2VyKSBzcGVjaWFsVHlwZUZsYWdNYXAuZ2V0KHFOYW1lKTsKLSAgICAgICAgcmV0dXJuIHN0YXRlICE9IG51bGwgJiYgZ2V0U3RhdHVzKHN0YXRlLmludFZhbHVlKCksCi0gICAgICAgICAgICAgICAgU2NoZW1hQ29uc3RhbnRzLklOTkVSX0NIT0lDRV9FTEVNRU5UKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHdoZXRoZXIgYSBnaXZlbiBRTmFtZSByZWZlcnMgdG8gU2ltcGxlIFR5cGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcU5hbWUKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgYm9vbGVhbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRTaW1wbGVTdGF0dXNGb3JRTmFtZShRTmFtZSBxTmFtZSkgewotICAgICAgICBJbnRlZ2VyIHN0YXRlID0gKEludGVnZXIpIHNwZWNpYWxUeXBlRmxhZ01hcC5nZXQocU5hbWUpOwotICAgICAgICByZXR1cm4gc3RhdGUgIT0gbnVsbCAmJiBnZXRTdGF0dXMoc3RhdGUuaW50VmFsdWUoKSwKLSAgICAgICAgICAgICAgICBTY2hlbWFDb25zdGFudHMuU0lNUExFX1RZUEVfT1JfQ09OVEVOVCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcU5hbWUKLSAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIGF0dHJpYnV0ZSBpcyBhIHBhcnRpY2FsIGNsYXNzIG9yIG5vdAotICAgICAqLwotCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0UGFydGljbGVUeXBlU3RhdHVzRm9yUU5hbWUoUU5hbWUgcU5hbWUpewotICAgICAgICBJbnRlZ2VyIHN0YXRlID0gKEludGVnZXIpIHNwZWNpYWxUeXBlRmxhZ01hcC5nZXQocU5hbWUpOwotICAgICAgICByZXR1cm4gc3RhdGUgIT0gbnVsbCAmJiBnZXRTdGF0dXMoc3RhdGUuaW50VmFsdWUoKSwKLSAgICAgICAgICAgICAgICBTY2hlbWFDb25zdGFudHMuUEFSVElDTEVfVFlQRV9FTEVNRU5UKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHdoZXRoZXIgYSBnaXZlbiBRTmFtZSBoYXMgdGhlIGFueSBhdHRyaWJ1dGUgc3RhdHVzLgotICAgICAqCi0gICAgICogQHBhcmFtIHFOYW1lCi0gICAgICogQHJldHVybiBSZXR1cm5zIGJvb2xlYW4uCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0QW55QXR0cmlidXRlU3RhdHVzRm9yUU5hbWUoUU5hbWUgcU5hbWUpIHsKLSAgICAgICAgcmV0dXJuIGdldEFycmF5U3RhdHVzRm9yUU5hbWUocU5hbWUpICYmCi0gICAgICAgICAgICAgICAgZ2V0QW55U3RhdHVzRm9yUU5hbWUocU5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgd2hldGhlciBhIGdpdmVuIFFOYW1lIGhhcyB0aGUgb3B0aW9uYWwgYXR0cmlidXRlIHN0YXR1cy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBxTmFtZSBRTmFtZSBvZiBhdHRyaWJ1dGUKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYXR0cmlidXRlIGhhcyBvcHRpb25hbCBzdGF0dXMKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRPcHRpb25hbEF0dHJpYnV0ZVN0YXR1c0ZvclFOYW1lKFFOYW1lIHFOYW1lKSB7Ci0gICAgICAgIEludGVnZXIgc3RhdGUgPSAoSW50ZWdlcikgc3BlY2lhbFR5cGVGbGFnTWFwLmdldChxTmFtZSk7Ci0gICAgICAgIHJldHVybiBzdGF0ZSAhPSBudWxsICYmIGdldFN0YXR1cyhzdGF0ZS5pbnRWYWx1ZSgpLAotICAgICAgICAgICAgICAgIFNjaGVtYUNvbnN0YW50cy5PUFRJT05BTF9UWVBFKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDbGVhcnMgdGhlIHdob2xlIHNldCBvZiB0YWJsZXMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY2xlYXJUYWJsZXMoKSB7Ci0gICAgICAgIHRoaXMuZWxlbWVudFRvSmF2YUNsYXNzTWFwLmNsZWFyKCk7Ci0gICAgICAgIHRoaXMuZWxlbWVudFRvU2NoZW1hUU5hbWVNYXAuY2xlYXIoKTsKLSAgICAgICAgdGhpcy5lbGVtZW50VG9TY2hlbWFRTmFtZU1hcC5jbGVhcigpOwotICAgICAgICB0aGlzLmVsZW1lbnRUb0phdmFDbGFzc01hcC5jbGVhcigpOwotICAgICAgICB0aGlzLnNwZWNpYWxUeXBlRmxhZ01hcC5jbGVhcigpOwotICAgICAgICB0aGlzLnFOYW1lTWF4T2NjdXJzQ291bnRNYXAuY2xlYXIoKTsKLSAgICAgICAgdGhpcy5xTmFtZU1pbk9jY3Vyc0NvdW50TWFwLmNsZWFyKCk7Ci0gICAgICAgIHRoaXMucU5hbWVPcmRlck1hcC5jbGVhcigpOwotICAgICAgICB0aGlzLmVsZW1lbnRRTmFtZVRvRGVmdWxhdFZhbHVlTWFwLmNsZWFyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyB0aGUgbWluT2NjdXJzIGFzc29jaWF0ZWQgd2l0aCBhIFFOYW1lLgotICAgICAqCi0gICAgICogQHBhcmFtIHFOYW1lCi0gICAgICogQHBhcmFtIG1pbk9jY3VycwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZE1pbk9jY3VycyhRTmFtZSBxTmFtZSwgbG9uZyBtaW5PY2N1cnMpIHsKLSAgICAgICAgdGhpcy5xTmFtZU1pbk9jY3Vyc0NvdW50TWFwLnB1dChxTmFtZSwgbmV3IExvbmcobWluT2NjdXJzKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVnaXN0ZXJzIGEgUU5hbWUgZm9yIHRoZSBvcmRlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBxTmFtZQotICAgICAqIEBwYXJhbSBpbmRleAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyUU5hbWVJbmRleChRTmFtZSBxTmFtZSwgaW50IGluZGV4KSB7Ci0gICAgICAgIHRoaXMucU5hbWVPcmRlck1hcC5wdXQobmV3IEludGVnZXIoaW5kZXgpLCBxTmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyB0aGUgbWluT2NjdXJzIGFzc29jaWF0ZWQgd2l0aCBhIFFOYW1lLgotICAgICAqCi0gICAgICogQHBhcmFtIHFOYW1lCi0gICAgICogQHJldHVybiBSZXR1cm5zIGxvbmcuCi0gICAgICovCi0gICAgcHVibGljIGxvbmcgZ2V0TWluT2NjdXJzKFFOYW1lIHFOYW1lKSB7Ci0gICAgICAgIExvbmcgbCA9IChMb25nKSB0aGlzLnFOYW1lTWluT2NjdXJzQ291bnRNYXAuZ2V0KHFOYW1lKTsKLSAgICAgICAgcmV0dXJuIGwgIT0gbnVsbCA/IGwubG9uZ1ZhbHVlKCkgOiAxOyAvL2RlZmF1bHQgZm9yIG1pbiBpcyAxCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbWF4T2NjdXJzIGFzc29jaWF0ZWQgd2l0aCBhIFFOYW1lLgotICAgICAqCi0gICAgICogQHBhcmFtIHFOYW1lCi0gICAgICogQHJldHVybiBSZXR1cm5zIGxvbmcuCi0gICAgICovCi0gICAgcHVibGljIGxvbmcgZ2V0TWF4T2NjdXJzKFFOYW1lIHFOYW1lKSB7Ci0gICAgICAgIExvbmcgbCA9IChMb25nKSB0aGlzLnFOYW1lTWF4T2NjdXJzQ291bnRNYXAuZ2V0KHFOYW1lKTsKLSAgICAgICAgcmV0dXJuIGwgIT0gbnVsbCA/IGwubG9uZ1ZhbHVlKCkgOiAxOyAvL2RlZmF1bHQgZm9yIG1heCBpcyAxCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyB0aGUgbWF4T2NjdXJzIGFzc29jaWF0ZWQgd2l0aCBhIFFOYW1lLgotICAgICAqCi0gICAgICogQHBhcmFtIHFOYW1lCi0gICAgICogQHBhcmFtIG1heE9jY3VycwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZE1heE9jY3VycyhRTmFtZSBxTmFtZSwgbG9uZyBtYXhPY2N1cnMpIHsKLSAgICAgICAgdGhpcy5xTmFtZU1heE9jY3Vyc0NvdW50TWFwLnB1dChxTmFtZSwgbmV3IExvbmcobWF4T2NjdXJzKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBSZXR1cm5zIEl0ZXJhdG9yLgotICAgICAqIEBkZXByZWNhdGVkIFVzZSAjZ2V0UU5hbWVBcnJheQotICAgICAqLwotICAgIHB1YmxpYyBJdGVyYXRvciBnZXRFbGVtZW50UU5hbWVJdGVyYXRvcigpIHsKLSAgICAgICAgcmV0dXJuIGVsZW1lbnRUb0phdmFDbGFzc01hcC5rZXlTZXQoKS5pdGVyYXRvcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIFFOYW1lIGFycmF5IC0gbWF5IG5vdCBiZSBvcmRlcmVkLgotICAgICAqCi0gICAgICogQHJldHVybiBSZXR1cm5zIFFOYW1lW10uCi0gICAgICovCi0gICAgcHVibGljIFFOYW1lW10gZ2V0UU5hbWVBcnJheSgpIHsKLSAgICAgICAgU2V0IGtleVNldCA9IGVsZW1lbnRUb0phdmFDbGFzc01hcC5rZXlTZXQoKTsKLSAgICAgICAgcmV0dXJuIChRTmFtZVtdKSBrZXlTZXQudG9BcnJheShuZXcgUU5hbWVba2V5U2V0LnNpemUoKV0pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIG9yZGVyZWQgUU5hbWUgYXJyYXkgLSB1c2VmdWwgaW4gc2VxdWVuY2VzIHdoZXJlIHRoZSBvcmRlciBuZWVkcyB0byBiZSBwcmVzZXJ2ZWQKLSAgICAgKiBOb3RlIC0gI3JlZ2lzdGVyUU5hbWVJbmRleCBuZWVkcyB0byBiZSBjYWxsZWQgaWYgdGhpcyBpcyB0byB3b3JrIHByb3Blcmx5IQotICAgICAqCi0gICAgICogQHJldHVybiBSZXR1cm5zIFFOYW1lW10uCi0gICAgICovCi0gICAgcHVibGljIFFOYW1lW10gZ2V0T3JkZXJlZFFOYW1lQXJyYXkoKSB7Ci0gICAgICAgIC8vZ2V0IHRoZSBrZXlzIG9mIHRoZSBvcmRlciBtYXAKLSAgICAgICAgU2V0IHNldCA9IHFOYW1lT3JkZXJNYXAua2V5U2V0KCk7Ci0gICAgICAgIGludCBjb3VudCA9IHNldC5zaXplKCk7Ci0gICAgICAgIEludGVnZXJbXSBrZXlzID0gKEludGVnZXJbXSkgc2V0LnRvQXJyYXkobmV3IEludGVnZXJbY291bnRdKTsKLSAgICAgICAgQXJyYXlzLnNvcnQoa2V5cyk7Ci0KLSAgICAgICAgLy9Ob3cgcmVmaWxsIHRoZSBPcmRlcmVkIFFOYW1lIEFycmF5Ci0gICAgICAgIExpc3QgcmV0dXJuUU5hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIHJldHVyblFOYW1lcy5hZGQocU5hbWVPcmRlck1hcC5nZXQoa2V5c1tpXSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy93ZSd2ZSBtaXNzZWQgdGhlIGF0dHJpYnV0ZXMsIHNvIGlmIHRoZXJlIGFyZSBhdHRyaWJ1dGVzCi0gICAgICAgIC8vYWRkIHRoZW0gZXhwbGljaXRseSB0byB0aGUgZW5kIG9mIHRoaXMgbGlzdAotICAgICAgICBRTmFtZVtdIGFsbE5hbWVzID0gZ2V0UU5hbWVBcnJheSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFsbE5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoZ2V0QXR0cmlidXRlU3RhdHVzRm9yUU5hbWUoYWxsTmFtZXNbaV0pKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuUU5hbWVzLmFkZChhbGxOYW1lc1tpXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gKFFOYW1lW10pIHJldHVyblFOYW1lcy50b0FycmF5KG5ldyBRTmFtZVtyZXR1cm5RTmFtZXMuc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmluZHMgdGhlIHN0YXJ0aW5nIGNvdW50IGZvciB0aGUgYWRkaXRpb24gb2YgbmV3IGl0ZW1zIHRvIHRoZSBvcmRlcgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgc3RhcnRpbmcgbnVtYmVyIGZvciB0aGUgc2VxdWVuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldE9yZGVyU3RhcnRQb2ludCgpIHsKLSAgICAgICAgcmV0dXJuIHFOYW1lT3JkZXJNYXAuc2l6ZSgpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBsaW5rIHRvIHRoCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWV0YUluZm8KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRBc1BhcmVudChCZWFuV3JpdGVyTWV0YUluZm9Ib2xkZXIgbWV0YUluZm8pIHsKLSAgICAgICAgcGFyZW50ID0gbWV0YUluZm87Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIGFub3RoZXIgc3RhdHVzIHRvIGEgcGFydGljdWxhciBRbmFtZS4KLSAgICAgKiBBIFFuYW1lIGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggbXVsdGlwbGUgc3RhdHVzIGZsYWdzCi0gICAgICogYW5kIHRoZXkgYWxsIHdpbGwgYmUgcHJlc2VydmVkCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdHlwZQotICAgICAqIEBwYXJhbSBtYXNrCi0gICAgICovCi0KLSAgICBwdWJsaWMgdm9pZCBhZGR0U3RhdHVzKFFOYW1lIHR5cGUsIGludCBtYXNrKSB7Ci0gICAgICAgIE9iamVjdCBvYmogPSB0aGlzLnNwZWNpYWxUeXBlRmxhZ01hcC5nZXQodHlwZSk7Ci0gICAgICAgIGlmIChvYmogIT0gbnVsbCkgewotICAgICAgICAgICAgaW50IHByZVZhbHVlID0gKChJbnRlZ2VyKSBvYmopLmludFZhbHVlKCk7Ci0gICAgICAgICAgICB0aGlzLnNwZWNpYWxUeXBlRmxhZ01hcC5wdXQodHlwZSwgbmV3IEludGVnZXIoKHByZVZhbHVlIHwgbWFzaykpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRoaXMuc3BlY2lhbFR5cGVGbGFnTWFwLnB1dCh0eXBlLCBuZXcgSW50ZWdlcihtYXNrKSk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGdldFN0YXR1cyhpbnQgc3RvcmVkU3RhdHVzLCBpbnQgbWFzaykgewotICAgICAgICAvL3doZW4gdGhlIG1hc2sgaXMgYW5kZWQgd2l0aCB0aGUgc3RhdHVzIHRoZW4gd2Ugc2hvdWxkIGdldAotICAgICAgICAvL3RoZSBtYXNrIGl0IHNlbGYhCi0gICAgICAgIHJldHVybiAobWFzayA9PSAobWFzayAmIHN0b3JlZFN0YXR1cykpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGxlbmd0aCBmYWNldC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBsZW5ndGhGYWNldAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldExlbmd0aEZhY2V0KGxvbmcgbGVuZ3RoRmFjZXQpIHsKLSAgICAgICAgdGhpcy5sZW5ndGhGYWNldCA9IGxlbmd0aEZhY2V0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGxlbmd0aCBmYWNldC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gUmV0dXJucyBsZW5ndGggZmFjZXQuCi0gICAgICovCi0gICAgcHVibGljIGxvbmcgZ2V0TGVuZ3RoRmFjZXQoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmxlbmd0aEZhY2V0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG1heEV4Y2x1c2l2ZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtYXhFeGNsdXNpdmVGYWNldAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE1heEV4Y2x1c2l2ZUZhY2V0KFN0cmluZyBtYXhFeGNsdXNpdmVGYWNldCkgewotICAgICAgICB0aGlzLm1heEV4Y2x1c2l2ZUZhY2V0ID0gbWF4RXhjbHVzaXZlRmFjZXQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbWF4RXhjbHVzaXZlLgotICAgICAqCi0gICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBtYXhFeGNsdXNpdmUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRNYXhFeGNsdXNpdmVGYWNldCgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMubWF4RXhjbHVzaXZlRmFjZXQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbWluRXhjbHVzaXZlLgotICAgICAqCi0gICAgICogQHBhcmFtIG1pbkV4Y2x1c2l2ZUZhY2V0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TWluRXhjbHVzaXZlRmFjZXQoU3RyaW5nIG1pbkV4Y2x1c2l2ZUZhY2V0KSB7Ci0gICAgICAgIHRoaXMubWluRXhjbHVzaXZlRmFjZXQgPSBtaW5FeGNsdXNpdmVGYWNldDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBtaW5FeGNsdXNpdmUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIG1pbkV4Y2x1c2l2ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE1pbkV4Y2x1c2l2ZUZhY2V0KCkgewotICAgICAgICByZXR1cm4gdGhpcy5taW5FeGNsdXNpdmVGYWNldDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBtYXhJbmNsdXNpdmUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWF4SW5jbHVzaXZlRmFjZXQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRNYXhJbmNsdXNpdmVGYWNldChTdHJpbmcgbWF4SW5jbHVzaXZlRmFjZXQpIHsKLSAgICAgICAgdGhpcy5tYXhJbmNsdXNpdmVGYWNldCA9IG1heEluY2x1c2l2ZUZhY2V0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIG1heEluY2x1c2l2ZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgbWF4SW5jbHVzaXZlLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWF4SW5jbHVzaXZlRmFjZXQoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLm1heEluY2x1c2l2ZUZhY2V0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG1pbkluY2x1c2l2ZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtaW5JbmNsdXNpdmVGYWNldAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE1pbkluY2x1c2l2ZUZhY2V0KFN0cmluZyBtaW5JbmNsdXNpdmVGYWNldCkgewotICAgICAgICB0aGlzLm1pbkluY2x1c2l2ZUZhY2V0ID0gbWluSW5jbHVzaXZlRmFjZXQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbWluSW5jbHVzaXZlLgotICAgICAqCi0gICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBtaW5JbmNsdXNpdmUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRNaW5JbmNsdXNpdmVGYWNldCgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMubWluSW5jbHVzaXZlRmFjZXQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbWF4TGVuZ3RoLgotICAgICAqCi0gICAgICogQHBhcmFtIG1heExlbmd0aEZhY2V0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TWF4TGVuZ3RoRmFjZXQobG9uZyBtYXhMZW5ndGhGYWNldCkgewotICAgICAgICB0aGlzLm1heExlbmd0aEZhY2V0ID0gbWF4TGVuZ3RoRmFjZXQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbWF4TGVuZ3RoLgotICAgICAqCi0gICAgICogQHJldHVybiBSZXR1cm5zIG1heExlbmd0aC4KLSAgICAgKi8KLSAgICBwdWJsaWMgbG9uZyBnZXRNYXhMZW5ndGhGYWNldCgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMubWF4TGVuZ3RoRmFjZXQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbWluTGVuZ3RoLgotICAgICAqCi0gICAgICogQHBhcmFtIG1pbkxlbmd0aEZhY2V0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TWluTGVuZ3RoRmFjZXQobG9uZyBtaW5MZW5ndGhGYWNldCkgewotICAgICAgICB0aGlzLm1pbkxlbmd0aEZhY2V0ID0gbWluTGVuZ3RoRmFjZXQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbWluTGVuZ3RoLgotICAgICAqCi0gICAgICogQHJldHVybiBSZXR1cm5zIG1pbkxlbmd0aC4KLSAgICAgKi8KLSAgICBwdWJsaWMgbG9uZyBnZXRNaW5MZW5ndGhGYWNldCgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMubWluTGVuZ3RoRmFjZXQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZW51bWVyYXRpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZW51bUZhY2V0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RW51bUZhY2V0KEFycmF5TGlzdCBlbnVtRmFjZXQpIHsKLSAgICAgICAgdGhpcy5lbnVtRmFjZXQgPSBlbnVtRmFjZXQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyB0aGUgZW51bWVyYXRpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZW51bUZhY2V0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkRW51bUZhY2V0KFN0cmluZyBlbnVtRmFjZXQpIHsKLSAgICAgICAgdGhpcy5lbnVtRmFjZXQuYWRkKGVudW1GYWNldCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgZW51bWVyYXRpb24uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgZW51bWVyYXRpb24uCi0gICAgICovCi0gICAgcHVibGljIExpc3QgZ2V0RW51bUZhY2V0KCkgewotICAgICAgICByZXR1cm4gdGhpcy5lbnVtRmFjZXQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgcGF0dGVybi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXR0ZXJuRmFjZXQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXR0ZXJuRmFjZXQoU3RyaW5nIHBhdHRlcm5GYWNldCkgewotICAgICAgICB0aGlzLnBhdHRlcm5GYWNldCA9IHBhdHRlcm5GYWNldDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBwYXR0ZXJuLgotICAgICAqCi0gICAgICogQHJldHVybiBSZXR1cm5zIHBhdHRlcm4uCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRQYXR0ZXJuRmFjZXQoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnBhdHRlcm5GYWNldDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKgotICAgICAqIEByZXR1cm4gUmV0dXJucyBpcyB1bmlvbgotICAgICAqLwotCi0gICAgcHVibGljIGJvb2xlYW4gaXNVbmlvbigpIHsKLSAgICAgICAgcmV0dXJuIGlzVW5pb247Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VW5pb24oYm9vbGVhbiB1bmlvbikgewotICAgICAgICBpc1VuaW9uID0gdW5pb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgbWVtZWJlciB0eXBlIGluIGEgdW5pb24KLSAgICAgKi8KLQotICAgIHB1YmxpYyBNYXAgZ2V0TWVtYmVyVHlwZXMoKSB7Ci0gICAgICAgIHJldHVybiBtZW1iZXJUeXBlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRNZW1iZXJUeXBlcyhNYXAgbWVtYmVyVHlwZXMpIHsKLSAgICAgICAgdGhpcy5tZW1iZXJUeXBlcyA9IG1lbWJlclR5cGVzOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0IGdldE1lbWJlclR5cGVzS2V5cygpIHsKLSAgICAgICAgcmV0dXJuIG1lbWJlclR5cGVzS2V5czsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRNZW1iZXJUeXBlc0tleXMoTGlzdCBtZW1iZXJUeXBlc0tleXMpIHsKLSAgICAgICAgdGhpcy5tZW1iZXJUeXBlc0tleXMgPSBtZW1iZXJUeXBlc0tleXM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkTWVtYmVyVHlwZShRTmFtZSBxbmFtZSxTdHJpbmcgY2xhc3NOYW1lKXsKLSAgICAgICAgdGhpcy5tZW1iZXJUeXBlcy5wdXQocW5hbWUsY2xhc3NOYW1lKTsKLSAgICAgICAgdGhpcy5tZW1iZXJUeXBlc0tleXMuYWRkKHFuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0xpc3QoKSB7Ci0gICAgICAgIHJldHVybiBpc0xpc3Q7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TGlzdChib29sZWFuIGxpc3QpIHsKLSAgICAgICAgaXNMaXN0ID0gbGlzdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUU5hbWUgZ2V0SXRlbVR5cGVRTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGl0ZW1UeXBlUU5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SXRlbVR5cGVRTmFtZShRTmFtZSBpdGVtVHlwZVFOYW1lKSB7Ci0gICAgICAgIHRoaXMuaXRlbVR5cGVRTmFtZSA9IGl0ZW1UeXBlUU5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRJdGVtVHlwZUNsYXNzTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGl0ZW1UeXBlQ2xhc3NOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEl0ZW1UeXBlQ2xhc3NOYW1lKFN0cmluZyBpdGVtVHlwZUNsYXNzTmFtZSkgewotICAgICAgICB0aGlzLml0ZW1UeXBlQ2xhc3NOYW1lID0gaXRlbVR5cGVDbGFzc05hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNQYXJ0aWNsZUNsYXNzKCkgewotICAgICAgICByZXR1cm4gaXNQYXJ0aWNsZUNsYXNzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBhcnRpY2xlQ2xhc3MoYm9vbGVhbiBwYXJ0aWNsZUNsYXNzKSB7Ci0gICAgICAgIGlzUGFydGljbGVDbGFzcyA9IHBhcnRpY2xlQ2xhc3M7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNIYXNQYXJ0aWNsZVR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBoYXNQYXJ0aWNsZVR5cGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SGFzUGFydGljbGVUeXBlKGJvb2xlYW4gaGFzUGFydGljbGVUeXBlKSB7Ci0gICAgICAgIHRoaXMuaGFzUGFydGljbGVUeXBlID0gaGFzUGFydGljbGVUeXBlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFhtbE5hbWVKYXZhTmFtZU1hcHBpbmcoU3RyaW5nIHhtbE5hbWUsU3RyaW5nIGphdmFOYW1lKXsKLSAgICAgICAgdGhpcy54bWxOYW1lSmF2YU5hbWVNYXAucHV0KHhtbE5hbWUsamF2YU5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzSmF2YU5hbWVNYXBwaW5nQXZhaWxhYmxlKFN0cmluZyB4bWxOYW1lKXsKLSAgICAgICAgcmV0dXJuIHRoaXMueG1sTmFtZUphdmFOYW1lTWFwLmNvbnRhaW5zS2V5KHhtbE5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SmF2YU5hbWUoU3RyaW5nIHhtbE5hbWUpewotICAgICAgICByZXR1cm4gKFN0cmluZykgdGhpcy54bWxOYW1lSmF2YU5hbWVNYXAuZ2V0KHhtbE5hbWUpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL0NvbXBpbGVyT3B0aW9ucy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL0NvbXBpbGVyT3B0aW9ucy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTM3Y2Q4Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9Db21waWxlck9wdGlvbnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEuaTE4bi5TY2hlbWFDb21waWxlck1lc3NhZ2VzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KLS8qKgotICogVGhpcyBpcyBhIGJlYW4gY2xhc3MgdGhhdCBjYXB0dXJlcyBhbGwgdGhlIGNvbXBpbGVyIG9wdGlvbnMuCi0gKiBSaWdodCBub3cgdGhlIGNvbXBpbGVyIG9wdGlvbnMgY29uc2lzdCBvZiB0aGUgZm9sbG93aW5nCi0gKiAxLiBvdXRwdXQgZmlsZSBsb2NhdGlvbiAtIEEgZm9sZGVyIHdpdGggbmVjZXNzYXJ5IHJpZ2h0cyBmb3IgdGhlCi0gKiBzY2hlbWEgY29tcGlsZXIgdG8gd3JpdGUgdGhlIGZpbGVzCi0gKiAyLnBhY2thZ2UgbmFtZQotICogMy5uYW1lc3BhY2UgdG8gcGFja2FnZSBtYXAKLSAqIDQuYm9vbGVhbiBmbGFnIG1hcmtpbmcgd2hldGhlciB0byB3cmFwIG9yIHVud3JhcAotICogNC5ib29sZWFuIGZsYWcgbWFya2luZyB3aGV0aGVyIHRvIHdyaXRlIGNsYXNzZXMgb3Igbm90Ci0gKi8KLXB1YmxpYyBjbGFzcyBDb21waWxlck9wdGlvbnMgewotCi0gICAgLyoqCi0gICAgICogR2VuZXJhdGVkIG91dHB1dCBmaWxlCi0gICAgICovCi0gICAgcHJpdmF0ZSBGaWxlIG91dHB1dExvY2F0aW9uOwotICAgIHByaXZhdGUgU3RyaW5nIHBhY2thZ2VOYW1lID0gbnVsbDsKLSAgICBwcml2YXRlIGJvb2xlYW4gZ2VuZXJhdGVBbGwgPSBmYWxzZTsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBvZmZTdHJpY3RWYWxpZGF0aW9uID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGlzVXNlV3JhcHBlckNsYXNzZXMgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIFBhY2thZ2UgZm9yIHRoZSBtYXBwZXIKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBtYXBwZXJDbGFzc1BhY2thZ2UgPSBudWxsOwotCi0gICAgcHVibGljIFN0cmluZyBnZXRNYXBwZXJDbGFzc1BhY2thZ2UoKSB7Ci0gICAgICAgIHJldHVybiBtYXBwZXJDbGFzc1BhY2thZ2U7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TWFwcGVyQ2xhc3NQYWNrYWdlKFN0cmluZyBtYXBwZXJDbGFzc1BhY2thZ2UpIHsKLSAgICAgICAgdGhpcy5tYXBwZXJDbGFzc1BhY2thZ2UgPSBtYXBwZXJDbGFzc1BhY2thZ2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogZ2V0IHdoZXRoZXIgdGhlIG1hcHBlciBjbGFzcyBwYWNrYWdlCi0gICAgICogbmFtZSBpcyBwcmVzZW50Ci0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNNYXBwZXJDbGFzc1BhY2thZ2VQcmVzZW50KCl7Ci0gICAgICAgIHJldHVybiAgIChtYXBwZXJDbGFzc1BhY2thZ2UhPW51bGwgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgISIiLmVxdWFscyhtYXBwZXJDbGFzc1BhY2thZ2UpKTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogVGhlIGZsYWcga2VlcGluZyB3aGV0aGVyIHNlcGVyYXRlIGhlbHBlcnMKLSAgICAgKiBuZWVkIHRvIGJlIGdlbmVyYXRlZCBvciBub3QKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaGVscGVyTW9kZSA9IGZhbHNlOwotICAgIAotICAgIHB1YmxpYyBib29sZWFuIGlzSGVscGVyTW9kZSgpIHsKLSAgICAgICAgcmV0dXJuIGhlbHBlck1vZGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SGVscGVyTW9kZShib29sZWFuIGhlbHBlck1vZGUpIHsKLSAgICAgICAgdGhpcy5oZWxwZXJNb2RlID0gaGVscGVyTW9kZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogS2VlcCB0cmFjayBvZiB0aGUgbmFtZXNwYWNlIGFuZCBwYWNrYWdlcyBtYXBwaW5nCi0gICAgICovCi0gICAgcHJpdmF0ZSBNYXAgbnMyUGFja2FnZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICBwdWJsaWMgTWFwIGdldE5zMlBhY2thZ2VNYXAoKSB7Ci0gICAgICAgIHJldHVybiBuczJQYWNrYWdlTWFwOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE5zMlBhY2thZ2VNYXAoTWFwIG5zMlBhY2thZ2VNYXApIHsKLSAgICAgICAgdGhpcy5uczJQYWNrYWdlTWFwID0gbnMyUGFja2FnZU1hcDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIGZsYWcgdGVsbHMgdGhlIGRhdGFiaW5kZXIgdG8gZWl0aGVyIHdyaXRlIHRoZSBvdXRwdXQgb3IKLSAgICAgKiBub3QuIGlmIHRoaXMgaXMgc2V0IHRvIHRydWUgaXQgd2lsbCB3cml0ZSB0aGUgb3V0cHV0IGF0IG9uY2UuCi0gICAgICogaWYgbm90IHRoZSBvdXRwdXR0ZXIgd2lsbCBwb3B1bGF0ZSB0aGUgCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIHdyaXRlT3V0cHV0ID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIGZsYWcgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBnZW5lcmF0ZWQgY2xhc3NlcyBhcmUgd3JhcHBlZCBvciBub3QKLSAgICAgKiBpZiB0aGUgd3JhcHBlciBmbGFnIGlzIHRydWUsIHRoZW4gb25seSBhIHNpbmdsZSBmaWxlIHdpbGwgYmUgZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIHdyYXBDbGFzc2VzID0gZmFsc2U7Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1dyaXRlT3V0cHV0KCkgewotICAgICAgICByZXR1cm4gd3JpdGVPdXRwdXQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0V3JpdGVPdXRwdXQoYm9vbGVhbiB3cml0ZU91dHB1dCkgewotICAgICAgICB0aGlzLndyaXRlT3V0cHV0ID0gd3JpdGVPdXRwdXQ7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNXcmFwQ2xhc3NlcygpIHsKLSAgICAgICAgcmV0dXJuIHdyYXBDbGFzc2VzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFdyYXBDbGFzc2VzKGJvb2xlYW4gd3JhcENsYXNzZXMpIHsKLSAgICAgICAgdGhpcy53cmFwQ2xhc3NlcyA9IHdyYXBDbGFzc2VzOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBwYWNrYWdlTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29tcGlsZXJPcHRpb25zIHNldFBhY2thZ2VOYW1lKFN0cmluZyBwYWNrYWdlTmFtZSkgewotICAgICAgICAvLyBWYWxpZGF0ZSB0aGUgcGFja2FnZSBuYW1lLgotICAgICAgICBpZiAocGFja2FnZU5hbWUgIT0gbnVsbCAmJiB0ZXN0VmFsdWUocGFja2FnZU5hbWUpKSB7Ci0gICAgICAgICAgICB0aGlzLnBhY2thZ2VOYW1lID0gcGFja2FnZU5hbWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihTY2hlbWFDb21waWxlck1lc3NhZ2VzLmdldE1lc3NhZ2UoInNjaGVtYS51bnN1cHBvcnRlZHZhbHVlIikpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIHB1YmxpYyBGaWxlIGdldE91dHB1dExvY2F0aW9uKCkgewotICAgICAgICByZXR1cm4gb3V0cHV0TG9jYXRpb247Ci0gICAgfQotCi0gICAgcHVibGljIENvbXBpbGVyT3B0aW9ucyBzZXRPdXRwdXRMb2NhdGlvbihGaWxlIG91dHB1dExvY2F0aW9uKSB7Ci0gICAgICAgIHRoaXMub3V0cHV0TG9jYXRpb24gPSBvdXRwdXRMb2NhdGlvbjsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIHRlc3RWYWx1ZShTdHJpbmcgd29yZFRvTWF0Y2gpIHsKLSAgICAgICAgUGF0dGVybiBwYXQgPSBQYXR0ZXJuLmNvbXBpbGUoIl4oXFx3K1xcLikrJCIpOwotICAgICAgICBNYXRjaGVyIG0gPSBwYXQubWF0Y2hlcih3b3JkVG9NYXRjaCk7Ci0gICAgICAgIHJldHVybiBtLm1hdGNoZXMoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gaXNHZW5lcmF0ZUFsbCgpIHsKLSAgICAgICAgcmV0dXJuIGdlbmVyYXRlQWxsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEdlbmVyYXRlQWxsKGJvb2xlYW4gZ2VuZXJhdGVBbGwpIHsKLSAgICAgICAgdGhpcy5nZW5lcmF0ZUFsbCA9IGdlbmVyYXRlQWxsOwotICAgIH0KLQkvKioKLQkgKiBUaGlzIGZsYWcgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBnZW5lcmF0ZWQgY2xhc3NlcyBhcmUgZXhwZWN0ZWQgdG8gYmUKLQkgKiBiYWNrd29yZCBjb21wYXRpYmxlIHdpdGggQXhpcyAxLngKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gYmFja3dvcmRDb21wYXRpYmlsaXR5TW9kZSA9IGZhbHNlOwotCi0JcHVibGljIGJvb2xlYW4gaXNCYWNrd29yZENvbXBhdGliaWxpdHlNb2RlKCkgewotCQlyZXR1cm4gYmFja3dvcmRDb21wYXRpYmlsaXR5TW9kZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRCYWNrd29yZENvbXBhdGliaWxpdHlNb2RlKGJvb2xlYW4gYmFja3dvcmRDb21wYXRpYmlsaXR5TW9kZSkgewotCQl0aGlzLmJhY2t3b3JkQ29tcGF0aWJpbGl0eU1vZGUgPSBiYWNrd29yZENvbXBhdGliaWxpdHlNb2RlOwotCX0KLQotICAgIC8qKgotICAgICAqIFNob3VsZCB3ZSBzdXBwcmVzcyBuYW1lc3BhY2UgcHJlZml4ZXMKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gc3VwcHJlc3NQcmVmaXhlc01vZGUgPSBmYWxzZTsKLQotICAgIHB1YmxpYyBib29sZWFuIGlzU3VwcHJlc3NQcmVmaXhlc01vZGUoKSB7Ci0gICAgICAgIHJldHVybiBzdXBwcmVzc1ByZWZpeGVzTW9kZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTdXBwcmVzc1ByZWZpeGVzTW9kZShib29sZWFuIHN1cHByZXNzUHJlZml4ZXNNb2RlKSB7Ci0gICAgICAgIHRoaXMuc3VwcHJlc3NQcmVmaXhlc01vZGUgPSBzdXBwcmVzc1ByZWZpeGVzTW9kZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc09mZlN0cmljdFZhbGlkYXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBvZmZTdHJpY3RWYWxpZGF0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE9mZlN0cmljdFZhbGlkYXRpb24oYm9vbGVhbiBvZmZTdHJpY3RWYWxpZGF0aW9uKSB7Ci0gICAgICAgIHRoaXMub2ZmU3RyaWN0VmFsaWRhdGlvbiA9IG9mZlN0cmljdFZhbGlkYXRpb247Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNVc2VXcmFwcGVyQ2xhc3NlcygpIHsKLSAgICAgICAgcmV0dXJuIGlzVXNlV3JhcHBlckNsYXNzZXM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VXNlV3JhcHBlckNsYXNzZXMoYm9vbGVhbiB1c2VXcmFwcGVyQ2xhc3NlcykgewotICAgICAgICB0aGlzLmlzVXNlV3JhcHBlckNsYXNzZXMgPSB1c2VXcmFwcGVyQ2xhc3NlczsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvRXh0ZW5zaW9uVXRpbGl0eS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL0V4dGVuc2lvblV0aWxpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RhNmIyYi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvRXh0ZW5zaW9uVXRpbGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjc0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zY2hlbWE7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNNZXNzYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLnR5cGVtYXAuSmF2YVR5cGVNYXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEudHlwZW1hcC5UeXBlTWFwOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5Db2RlR2VuQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuZGF0YWJpbmRpbmcuQ1R5cGVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLmRhdGFiaW5kaW5nLkRlZmF1bHRUeXBlTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5kYXRhYmluZGluZy5KYXZhVHlwZU1hcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuZGF0YWJpbmRpbmcuVHlwZU1hcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwudXRpbC5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWE7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFBbnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFDb21wbGV4Q29udGVudDsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYUNvbXBsZXhDb250ZW50RXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hQ29tcGxleFR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFDb250ZW50OwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hQ29udGVudE1vZGVsOwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYUltcG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYUluY2x1ZGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFPYmplY3RDb2xsZWN0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hUGFydGljbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFTZXF1ZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYVNpbXBsZVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFUeXBlOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSB1dGlsaXR5IGZvciB0aGUgZXh0ZW5zaW9uIHRvIGNhbGwgYnkgcmVmbGVjdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIEV4dGVuc2lvblV0aWxpdHkgewotCi0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgaW52b2tlKENvZGVHZW5Db25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBMaXN0IHNjaGVtYUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIC8vIGFkZCBhbGwgdGhlIHNjaGVtYXMgdG8gdGhlIGxpc3QKLSAgICAgICAgTGlzdCBzZXJ2aWNlcyA9IGNvbmZpZ3VyYXRpb24uZ2V0QXhpc1NlcnZpY2VzKCk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHNlcnZpY2VzLml0ZXJhdG9yKCk7aXRlci5oYXNOZXh0KCk7KXsKLSAgICAgICAgICAgIHNjaGVtYUxpc3QuYWRkQWxsKCgoQXhpc1NlcnZpY2UpaXRlci5uZXh0KCkpLmdldFNjaGVtYSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vaGFzaG1hcCB0aGF0IGtlZXBzIHRoZSB0YXJnZXRuYW1lc3BhY2UgYW5kIHRoZSB4bWxTY2hlbWEgb2JqZWN0Ci0gICAgICAgIC8vdGhpcyBpcyBhIGNvbnZlbmllbmNlIHRvIGxvY2F0ZSB0aGUgcmVsZXZhbnQgc2NoZW1hIHF1aWNrbHkKLSAgICAgICAgLy9ieSBsb29raW5nIGF0IHRoZSB0YXJnZXQgbmFtZXNwYWNlCi0gICAgICAgIE1hcCBzY2hlbWFNYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICBwb3B1bGF0ZVNjaGVtYU1hcChzY2hlbWFNYXAsIHNjaGVtYUxpc3QpOwotCi0gICAgICAgIGlmIChzY2hlbWFMaXN0ID09IG51bGwgfHwgc2NoZW1hTGlzdC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIC8vdGhlcmUgYXJlIG5vIHR5cGVzIHRvIGJlIGNvZGUgZ2VuZXJhdGVkCi0gICAgICAgICAgICAvL0hvd2V2ZXIgaWYgdGhlIHR5cGUgbWFwcGVyIGlzIGxlZnQgZW1wdHkgaXQgd2lsbCBiZSBhIHByb2JsZW0gZm9yIHRoZSBvdGhlcgotICAgICAgICAgICAgLy9wcm9jZXNzZXMuIEhlbmNlIHRoZSBkZWZhdWx0IHR5cGUgbWFwcGVyIGlzIHNldCB0byB0aGUgY29uZmlndXJhdGlvbgotICAgICAgICAgICAgY29uZmlndXJhdGlvbi5zZXRUeXBlTWFwcGVyKG5ldyBEZWZhdWx0VHlwZU1hcHBlcigpKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAvL2NhbGwgdGhlIHNjaGVtYSBjb21waWxlcgotICAgICAgICBDb21waWxlck9wdGlvbnMgb3B0aW9ucyA9IG5ldyBDb21waWxlck9wdGlvbnMoKTsKLQotICAgICAgICAvL3NldCB0aGUgZGVmYXVsdCBvcHRpb25zCi0gICAgICAgIHBvcHVsYXRlRGVmYXVsdE9wdGlvbnMob3B0aW9ucywgY29uZmlndXJhdGlvbik7Ci0KLSAgICAgICAgLy9zZXQgdGhlIHVzZXIgcGFyYW1ldGVycy4gdGhlIHVzZXIgcGFyYW1ldGVycyBnZXQgdGhlIHByZWZlcmVuY2Ugb3ZlcgotICAgICAgICAvL3RoZSBkZWZhdWx0IG9uZXMuIEJ1dCB0aGUgdXNlciBiZXR0ZXIga25vdyB3aGF0IGhlJ3MgZG9pbmcgaWYgaGUKLSAgICAgICAgLy91c2VkIG1vZHVsZSBzcGVjaWZpYyBwYXJhbWV0ZXJzCi0gICAgICAgIHBvcHVsYXRlVXNlcnBhcmFtZXRlcnMob3B0aW9ucywgY29uZmlndXJhdGlvbik7Ci0KLSAgICAgICAgU2NoZW1hQ29tcGlsZXIgc2NoZW1hQ29tcGlsZXIgPSBuZXcgU2NoZW1hQ29tcGlsZXIob3B0aW9ucyk7Ci0gICAgICAgIC8vIHJ1biB0aGUgc2NoZW1hIGNvbXBpbGVyCi0gICAgICAgIHNjaGVtYUNvbXBpbGVyLmNvbXBpbGUoc2NoZW1hTGlzdCk7Ci0KLSAgICAgICAgLy9jcmVhdGUgdGhlIHR5cGUgbWFwcGVyCi0gICAgICAgIC8vRmlyc3QgdHJ5IHRvIHRha2UgdGhlIG9uZSB0aGF0IGlzIGFscmVhZHkgdGhlcmUKLSAgICAgICAgVHlwZU1hcHBlciBtYXBwZXIgPSBjb25maWd1cmF0aW9uLmdldFR5cGVNYXBwZXIoKTsKLSAgICAgICAgaWYgKG1hcHBlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbi5nZXRPdXRwdXRMYW5ndWFnZSgpICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAgICAgIWNvbmZpZ3VyYXRpb24uZ2V0T3V0cHV0TGFuZ3VhZ2UoKS50cmltKCkuZXF1YWxzKCIiKSAmJgotICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uLmdldE91dHB1dExhbmd1YWdlKCkudG9Mb3dlckNhc2UoKS5lcXVhbHMoImMiKSkgewotICAgICAgICAgICAgICAgIG1hcHBlciA9IG5ldyBDVHlwZU1hcHBlcigpOwotCi0gICAgICAgICAgICB9ICBlbHNlIHsKLSAgICAgICAgICAgICAgICBtYXBwZXIgPSBuZXcgSmF2YVR5cGVNYXBwZXIoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG9wdGlvbnMuaXNXcml0ZU91dHB1dCgpKSB7Ci0gICAgICAgICAgICAvL2dldCB0aGUgcHJvY2Vzc2VkIGVsZW1lbnQgbWFwIGFuZCB0cmFuc2ZlciBpdCB0byB0aGUgdHlwZSBtYXBwZXIKLSAgICAgICAgICAgIE1hcCBwcm9jZXNzZWRNYXAgPSBzY2hlbWFDb21waWxlci5nZXRQcm9jZXNzZWRFbGVtZW50TWFwKCk7Ci0gICAgICAgICAgICBJdGVyYXRvciBwcm9jZXNzZWRrZXlzID0gcHJvY2Vzc2VkTWFwLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICBRTmFtZSBxTmFtZUtleTsKLSAgICAgICAgICAgIHdoaWxlIChwcm9jZXNzZWRrZXlzLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIHFOYW1lS2V5ID0gKFFOYW1lKSBwcm9jZXNzZWRrZXlzLm5leHQoKTsKLSAgICAgICAgICAgICAgICBtYXBwZXIuYWRkVHlwZU1hcHBpbmdOYW1lKHFOYW1lS2V5LCBwcm9jZXNzZWRNYXAuZ2V0KHFOYW1lS2V5KS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy9nZXQgdGhlIHByb2Nlc3NlZCBtb2RlbCBtYXAgYW5kIHRyYW5zZmVyIGl0IHRvIHRoZSB0eXBlIG1hcHBlcgotICAgICAgICAgICAgLy9zaW5jZSB0aGUgb3B0aW9ucyBtZW50aW9uZCB0aGF0IGl0cyBub3Qgd3JpdGFibGUsIGl0IHNob3VsZCBoYXZlCi0gICAgICAgICAgICAvL3BvcHVsYXRlZCB0aGUgbW9kZWwgbWFwCi0gICAgICAgICAgICBNYXAgcHJvY2Vzc2VkTW9kZWxNYXAgPSBzY2hlbWFDb21waWxlci5nZXRQcm9jZXNzZWRNb2RlbE1hcCgpOwotICAgICAgICAgICAgSXRlcmF0b3IgcHJvY2Vzc2Vka2V5cyA9IHByb2Nlc3NlZE1vZGVsTWFwLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICBRTmFtZSBxTmFtZUtleTsKLSAgICAgICAgICAgIHdoaWxlIChwcm9jZXNzZWRrZXlzLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIHFOYW1lS2V5ID0gKFFOYW1lKSBwcm9jZXNzZWRrZXlzLm5leHQoKTsKLSAgICAgICAgICAgICAgICBtYXBwZXIuYWRkVHlwZU1hcHBpbmdPYmplY3QocU5hbWVLZXksIHByb2Nlc3NlZE1vZGVsTWFwLmdldChxTmFtZUtleSkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBNYXAgcHJvY2Vzc2VkTWFwID0gc2NoZW1hQ29tcGlsZXIuZ2V0UHJvY2Vzc2VkRWxlbWVudE1hcCgpOwotICAgICAgICAgICAgcHJvY2Vzc2Vka2V5cyA9IHByb2Nlc3NlZE1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgd2hpbGUgKHByb2Nlc3NlZGtleXMuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgcU5hbWVLZXkgPSAoUU5hbWUpIHByb2Nlc3NlZGtleXMubmV4dCgpOwotICAgICAgICAgICAgICAgIG1hcHBlci5hZGRUeXBlTWFwcGluZ05hbWUocU5hbWVLZXksIHByb2Nlc3NlZE1hcC5nZXQocU5hbWVLZXkpLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvL2dldCB0aGUgQURCIHRlbXBsYXRlIGZyb20gdGhlIHNjaGVtYSBjb21waWxlcnMgcHJvcGVydHkgYmFnIGFuZCBzZXQgdGhlCi0gICAgICAgICAgICAvL3RlbXBsYXRlCi0gICAgICAgICAgICBjb25maWd1cmF0aW9uLnB1dFByb3BlcnR5KENvbnN0YW50cy5FWFRFUk5BTF9URU1QTEFURV9QUk9QRVJUWV9LRVksCi0gICAgICAgICAgICAgICAgICAgIHNjaGVtYUNvbXBpbGVyLmdldENvbXBpbGVyUHJvcGVydGllcygpLmdldFByb3BlcnR5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYUNvbnN0YW50cy5TY2hlbWFQcm9wZXJ0eU5hbWVzLkJFQU5fV1JJVEVSX1RFTVBMQVRFX0tFWSkpOwotCi0gICAgICAgIH0KLQotICAgICAgICAvL3Byb2Nlc3MgdGhlIHVud3JhcHBlZCBwYXJhbWV0ZXJzCi0gICAgICAgIGlmICghY29uZmlndXJhdGlvbi5pc1BhcmFtZXRlcnNXcmFwcGVkKCkpIHsKLSAgICAgICAgICAgIC8vZmlndXJlIG91dCB0aGUgdW53cmFwcGVkIG9wZXJhdGlvbnMKLSAgICAgICAgICAgIExpc3QgYXhpc1NlcnZpY2VzID0gY29uZmlndXJhdGlvbi5nZXRBeGlzU2VydmljZXMoKTsKLSAgICAgICAgICAgIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlOwotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBzZXJ2aWNlc0l0ZXIgPSBheGlzU2VydmljZXMuaXRlcmF0b3IoKTsgc2VydmljZXNJdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICBheGlzU2VydmljZSA9IChBeGlzU2VydmljZSkgc2VydmljZXNJdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIG9wZXJhdGlvbnMgPSBheGlzU2VydmljZS5nZXRPcGVyYXRpb25zKCk7Ci0gICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25zLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICAgICAgQXhpc09wZXJhdGlvbiBvcCA9IChBeGlzT3BlcmF0aW9uKSBvcGVyYXRpb25zLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKFdTRExVdGlsLmlzSW5wdXRQcmVzZW50Rm9yTUVQKG9wLmdldE1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4oKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdhbGtTY2hlbWEob3AuZ2V0TWVzc2FnZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NETENvbnN0YW50cy5NRVNTQUdFX0xBQkVMX0lOX1ZBTFVFKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWFNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NETENvbnN0YW50cy5JTlBVVF9QQVJUX1FOQU1FX1NVRkZJWCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBzdXBwb3J0IGZvciB4bWwgYmVhbnMKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24uZ2V0RGF0YWJpbmRpbmdUeXBlKCkuZXF1YWxzKCJhZGIiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFdTRExVdGlsLmlzT3V0cHV0UHJlc2VudEZvck1FUChvcC5nZXRNZXNzYWdlRXhjaGFuZ2VQYXR0ZXJuKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2Fsa1NjaGVtYShvcC5nZXRNZXNzYWdlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NETENvbnN0YW50cy5NRVNTQUdFX0xBQkVMX09VVF9WQUxVRSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBwZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWFNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcC5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU0RMQ29uc3RhbnRzLk9VVFBVVF9QQVJUX1FOQU1FX1NVRkZJWCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLSAgICAgICAgLy9wdXQgdGhlIGNvbXBsZXh0IHR5cGVzIGZvciB0aGUgdG9wIGxldmVsIGVsZW1lbnRzIGhhdmluZyB0aGVtCi0gICAgICAgIC8vIHRoaXMgaXMgbmVlZGVkIGluIHVud3JhcHBpbmcgYW5kIHRvIHByb3ZpZGUgYmFja3dvcmRDb21wYXRpYmlsaXR5Ci0gICAgICAgIGlmICghY29uZmlndXJhdGlvbi5pc1BhcmFtZXRlcnNXcmFwcGVkKCkgfHwgY29uZmlndXJhdGlvbi5pc0JhY2t3b3JkQ29tcGF0aWJpbGl0eU1vZGUoKSkgewotICAgICAgICAgICAgTGlzdCBheGlzU2VydmljZXMgPSBjb25maWd1cmF0aW9uLmdldEF4aXNTZXJ2aWNlcygpOwotICAgICAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2U7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIHNlcnZpY2VzSXRlciA9IGF4aXNTZXJ2aWNlcy5pdGVyYXRvcigpOyBzZXJ2aWNlc0l0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlID0gKEF4aXNTZXJ2aWNlKSBzZXJ2aWNlc0l0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgIEF4aXNPcGVyYXRpb24gYXhpc09wZXJhdGlvbjsKLSAgICAgICAgICAgICAgICBBeGlzTWVzc2FnZSBheGlzTWVzc2FnZTsKLSAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIG9wZXJhdG9ycyA9IGF4aXNTZXJ2aWNlLmdldE9wZXJhdGlvbnMoKTsgb3BlcmF0b3JzLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICAgICAgYXhpc09wZXJhdGlvbiA9IChBeGlzT3BlcmF0aW9uKSBvcGVyYXRvcnMubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoV1NETFV0aWwuaXNJbnB1dFByZXNlbnRGb3JNRVAoYXhpc09wZXJhdGlvbi5nZXRNZXNzYWdlRXhjaGFuZ2VQYXR0ZXJuKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBheGlzTWVzc2FnZSA9IGF4aXNPcGVyYXRpb24uZ2V0TWVzc2FnZShXU0RMQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfSU5fVkFMVUUpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q29tcGxleFR5cGVOYW1lKGF4aXNNZXNzYWdlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoV1NETFV0aWwuaXNPdXRwdXRQcmVzZW50Rm9yTUVQKGF4aXNPcGVyYXRpb24uZ2V0TWVzc2FnZUV4Y2hhbmdlUGF0dGVybigpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYXhpc01lc3NhZ2UgPSBheGlzT3BlcmF0aW9uLmdldE1lc3NhZ2UoV1NETENvbnN0YW50cy5NRVNTQUdFX0xBQkVMX09VVF9WQUxVRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXRDb21wbGV4VHlwZU5hbWUoYXhpc01lc3NhZ2UpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotICAgICAgICAvL3NldCB0aGUgdHlwZSBtYXBwZXIgdG8gdGhlIGNvbmZpZwotICAgICAgICBjb25maWd1cmF0aW9uLnNldFR5cGVNYXBwZXIobWFwcGVyKTsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIHNldCB0aGUgY29tcGxleHQgdHlwZSBjbGFzcyBuYW1lIGFzIGFuIG1lc3NhZ2UgcGFyYW1ldGVyIGlmIGl0IGV4aXRzCi0gICAgICogQHBhcmFtIGF4aXNNZXNzYWdlCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXRDb21wbGV4VHlwZU5hbWUoQXhpc01lc3NhZ2UgYXhpc01lc3NhZ2UpIHRocm93cyBBeGlzRmF1bHQgewotCi0gICAgICAgIGlmIChheGlzTWVzc2FnZS5nZXRTY2hlbWFFbGVtZW50KCkgIT0gbnVsbCl7Ci0KLSAgICAgICAgICAgIFhtbFNjaGVtYUVsZW1lbnQgc2NoZW1hRWxlbWVudCA9IGF4aXNNZXNzYWdlLmdldFNjaGVtYUVsZW1lbnQoKTsKLSAgICAgICAgICAgIFhtbFNjaGVtYVR5cGUgc2NoZW1hVHlwZSA9IHNjaGVtYUVsZW1lbnQuZ2V0U2NoZW1hVHlwZSgpOwotICAgICAgICAgICAgUU5hbWUgc2NoZW1hVHlwZVFuYW1lID0gc2NoZW1hRWxlbWVudC5nZXRTY2hlbWFUeXBlTmFtZSgpOwotCi0gICAgICAgICAgICBpZiAoc2NoZW1hVHlwZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNjaGVtYVR5cGVRbmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGZpbmQgdGhlIHNjaGVtYSB0eXBlIGZyb20gYWxsIHRoZSBzY2hlbWFzCi0gICAgICAgICAgICAgICAgICAgIC8vIG5vdyB3ZSBuZWVkIHRvIGdldCB0aGUgc2NoZW1hIG9mIHRoZSBleHRlbnNpb24gdHlwZSBmcm9tIHRoZSBwYXJlbnQgc2NoZW1hLiBGb3IgdGhhdCBsZXQncyBmaXJzdCByZXRyaWV2ZQotICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcGFyZW50IHNjaGVtYQotICAgICAgICAgICAgICAgICAgICBBeGlzU2VydmljZSBheGlzU2VydmljZSA9IGF4aXNNZXNzYWdlLmdldEF4aXNPcGVyYXRpb24oKS5nZXRBeGlzU2VydmljZSgpOwotICAgICAgICAgICAgICAgICAgICBBcnJheUxpc3Qgc2NoZW1hc0xpc3QgPSBheGlzU2VydmljZS5nZXRTY2hlbWEoKTsKLSAgICAgICAgICAgICAgICAgICAgWG1sU2NoZW1hIHNjaGVtYSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHNjaGVtYXNMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hID0gKFhtbFNjaGVtYSkgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWFUeXBlID0gZ2V0U2NoZW1hVHlwZShzY2hlbWEsIHNjaGVtYVR5cGVRbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2NoZW1hVHlwZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChzY2hlbWFUeXBlIGluc3RhbmNlb2YgWG1sU2NoZW1hQ29tcGxleFR5cGUpewotICAgICAgICAgICAgICAgIFhtbFNjaGVtYUNvbXBsZXhUeXBlIGNvbXBsZXhUeXBlID0gKFhtbFNjaGVtYUNvbXBsZXhUeXBlKSBzY2hlbWFUeXBlOwotICAgICAgICAgICAgICAgIGlmICgoY29tcGxleFR5cGUuZ2V0TmFtZSgpICE9IG51bGwpICYmIChjb21wbGV4VHlwZS5nZXRRTmFtZSgpICE9IG51bGwpKSB7Ci0gICAgICAgICAgICAgICAgICAgIE1hcCBtZXRhSW5mbyA9IGNvbXBsZXhUeXBlLmdldE1ldGFJbmZvTWFwKCk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBjb21wbGV4VHlwZU5hbWUgPSAoU3RyaW5nKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFJbmZvLmdldChTY2hlbWFDb25zdGFudHMuU2NoZW1hQ29tcGlsZXJJbmZvSG9sZGVyLkNMQVNTTkFNRV9LRVkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoY29tcGxleFR5cGVOYW1lLmVuZHNXaXRoKCJbXSIpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXhUeXBlTmFtZSA9IGNvbXBsZXhUeXBlTmFtZS5zdWJzdHJpbmcoMCxjb21wbGV4VHlwZU5hbWUubGVuZ3RoKCkgLTIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIHN0b3JlIHRoZSBjb21wbGV4dCB0eXBlIG5hbWUgdG8gcHJvY2VzcyBsYXRlcgotICAgICAgICAgICAgICAgICAgIGF4aXNNZXNzYWdlLmFkZFBhcmFtZXRlcihuZXcgUGFyYW1ldGVyKENvbnN0YW50cy5DT01QTEVYX1RZUEUsIGNvbXBsZXhUeXBlTmFtZSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQb3B1bGF0ZSB0aGUgc2NoZW1hIG9iamVjdHMgaW50byB0aGUKLSAgICAgKgotICAgICAqIEBwYXJhbSBzY2hlbWFNYXAKLSAgICAgKiBAcGFyYW0gc2NoZW1hTGlzdAotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcG9wdWxhdGVTY2hlbWFNYXAoTWFwIHNjaGVtYU1hcCwgTGlzdCBzY2hlbWFMaXN0KSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2NoZW1hTGlzdC5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgWG1sU2NoZW1hIHhtbFNjaGVtYSA9IChYbWxTY2hlbWEpIHNjaGVtYUxpc3QuZ2V0KGkpOwotICAgICAgICAgICAgc2NoZW1hTWFwLnB1dCh4bWxTY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCksIHhtbFNjaGVtYSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gbWVzc2FnZQotICAgICAqIEBwYXJhbSBtYXBwZXIKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHdhbGtTY2hlbWEoQXhpc01lc3NhZ2UgbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZU1hcHBlciBtYXBwZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcCBzY2hlbWFNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBvcE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBxbmFtZVN1ZmZpeCkgewotCi0gICAgICAgIGlmIChtZXNzYWdlLmdldFBhcmFtZXRlcihDb25zdGFudHMuVU5XUkFQUEVEX0tFWSkgIT0gbnVsbCkgewotCi0gICAgICAgICAgICBYbWxTY2hlbWFFbGVtZW50IHNjaGVtYUVsZW1lbnQgPSBtZXNzYWdlLmdldFNjaGVtYUVsZW1lbnQoKTsKLSAgICAgICAgICAgIFhtbFNjaGVtYVR5cGUgc2NoZW1hVHlwZSA9IHNjaGVtYUVsZW1lbnQuZ2V0U2NoZW1hVHlwZSgpOwotICAgICAgICAgICAgUU5hbWUgc2NoZW1hVHlwZVFuYW1lID0gc2NoZW1hRWxlbWVudC5nZXRTY2hlbWFUeXBlTmFtZSgpOwotCi0gICAgICAgICAgICBpZiAoc2NoZW1hVHlwZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNjaGVtYVR5cGVRbmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGZpbmQgdGhlIHNjaGVtYSB0eXBlIGZyb20gYWxsIHRoZSBzY2hlbWFzCi0gICAgICAgICAgICAgICAgICAgIC8vIG5vdyB3ZSBuZWVkIHRvIGdldCB0aGUgc2NoZW1hIG9mIHRoZSBleHRlbnNpb24gdHlwZSBmcm9tIHRoZSBwYXJlbnQgc2NoZW1hLiBGb3IgdGhhdCBsZXQncyBmaXJzdCByZXRyaWV2ZQotICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcGFyZW50IHNjaGVtYQotICAgICAgICAgICAgICAgICAgICBBeGlzU2VydmljZSBheGlzU2VydmljZSA9IG1lc3NhZ2UuZ2V0QXhpc09wZXJhdGlvbigpLmdldEF4aXNTZXJ2aWNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIEFycmF5TGlzdCBzY2hlbWFzTGlzdCA9IGF4aXNTZXJ2aWNlLmdldFNjaGVtYSgpOwotCi0gICAgICAgICAgICAgICAgICAgIFhtbFNjaGVtYSBzY2hlbWEgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzY2hlbWFzTGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYSA9IChYbWxTY2hlbWEpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hVHlwZSA9IGdldFNjaGVtYVR5cGUoc2NoZW1hLCBzY2hlbWFUeXBlUW5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNjaGVtYVR5cGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvL2NyZWF0ZSBhIHR5cGUgbWFwcGVyCi0gICAgICAgICAgICBUeXBlTWFwIGJhc2ljVHlwZU1hcCA9IG5ldyBKYXZhVHlwZU1hcCgpOwotICAgICAgICAgICAgaWYgKHNjaGVtYVR5cGUgaW5zdGFuY2VvZiBYbWxTY2hlbWFDb21wbGV4VHlwZSkgewotICAgICAgICAgICAgICAgIHByb2Nlc3NYTUxTY2hlbWFDb21wbGV4VHlwZShzY2hlbWFUeXBlLCBtYXBwZXIsIG9wTmFtZSwgc2NoZW1hTWFwLCBxbmFtZVN1ZmZpeCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKChzY2hlbWFUeXBlUW5hbWUgIT0gbnVsbCkgJiYgYmFzaWNUeXBlTWFwLmdldFR5cGVNYXAoKS5jb250YWluc0tleShzY2hlbWFUeXBlUW5hbWUpKXsKLSAgICAgICAgICAgICAgICBRTmFtZSBwYXJ0UU5hbWUgPSBXU0RMVXRpbC5nZXRQYXJ0UU5hbWUob3BOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgcW5hbWVTdWZmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmdldEVsZW1lbnRRTmFtZSgpLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICBtYXBwZXIuYWRkVHlwZU1hcHBpbmdOYW1lKHBhcnRRTmFtZSwgKFN0cmluZyliYXNpY1R5cGVNYXAuZ2V0VHlwZU1hcCgpLmdldChzY2hlbWFUeXBlUW5hbWUpKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoc2NoZW1hVHlwZSBpbnN0YW5jZW9mIFhtbFNjaGVtYVNpbXBsZVR5cGUpIHsKLSAgICAgICAgICAgICAgICBYbWxTY2hlbWFTaW1wbGVUeXBlIHhtbFNjaGVtYVNpbXBsZVR5cGUgPSAoWG1sU2NoZW1hU2ltcGxlVHlwZSkgc2NoZW1hVHlwZTsKLSAgICAgICAgICAgICAgICBwb3B1bGF0ZUNsYXNzTmFtZSh4bWxTY2hlbWFTaW1wbGVUeXBlLmdldE1ldGFJbmZvTWFwKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBtYXBwZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBvcE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZ2V0RWxlbWVudFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICBxbmFtZVN1ZmZpeCk7Ci0gICAgICAgICAgICAgICAgLy8gaGFuZGxlIHhzZDphbnlUeXBlCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcHJvY2Vzc1hNTFNjaGVtYUNvbXBsZXhUeXBlKFhtbFNjaGVtYVR5cGUgc2NoZW1hVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlTWFwcGVyIG1hcHBlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgb3BOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcCBzY2hlbWFNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHFuYW1lU3VmZml4KSB7Ci0gICAgICAgIGlmIChzY2hlbWFUeXBlIGluc3RhbmNlb2YgWG1sU2NoZW1hQ29tcGxleFR5cGUpIHsKLSAgICAgICAgICAgIFhtbFNjaGVtYUNvbXBsZXhUeXBlIGNtcGx4VHlwZSA9IChYbWxTY2hlbWFDb21wbGV4VHlwZSkgc2NoZW1hVHlwZTsKLSAgICAgICAgICAgIGlmIChjbXBseFR5cGUuZ2V0Q29udGVudE1vZGVsKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHByb2Nlc3NTY2hlbWFTZXF1ZW5jZShjbXBseFR5cGUuZ2V0UGFydGljbGUoKSwgbWFwcGVyLCBvcE5hbWUsIHNjaGVtYU1hcCwgcW5hbWVTdWZmaXgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwcm9jZXNzQ29tcGxleENvbnRlbnRNb2RlbChjbXBseFR5cGUsIG1hcHBlciwgb3BOYW1lLCBzY2hlbWFNYXAsIHFuYW1lU3VmZml4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHByb2Nlc3NBdHRyaWJ1dGVzKGNtcGx4VHlwZSwgb3BOYW1lLCBxbmFtZVN1ZmZpeCwgbWFwcGVyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcHJvY2Vzc0F0dHJpYnV0ZXMoWG1sU2NoZW1hQ29tcGxleFR5cGUgY29tcGxleFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBvcE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBxbmFtZVN1ZmZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZU1hcHBlciB0eXBlTWFwKSB7Ci0gICAgICAgIFhtbFNjaGVtYU9iamVjdENvbGxlY3Rpb24geG1sT2JqZWN0Q29sbGVjdGlvbiA9IGNvbXBsZXhUeXBlLmdldEF0dHJpYnV0ZXMoKTsKLSAgICAgICAgWG1sU2NoZW1hT2JqZWN0IGl0ZW07Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHhtbE9iamVjdENvbGxlY3Rpb24uZ2V0SXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBpdGVtID0gKFhtbFNjaGVtYU9iamVjdCkgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBYbWxTY2hlbWFBdHRyaWJ1dGUgeG1sU2NoZW1hQXR0cmlidXRlOwotICAgICAgICAgICAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBYbWxTY2hlbWFBdHRyaWJ1dGUpIHsKLSAgICAgICAgICAgICAgICB4bWxTY2hlbWFBdHRyaWJ1dGUgPSAoWG1sU2NoZW1hQXR0cmlidXRlKSBpdGVtOwotICAgICAgICAgICAgICAgIHBvcHVsYXRlQ2xhc3NOYW1lKHhtbFNjaGVtYUF0dHJpYnV0ZS5nZXRNZXRhSW5mb01hcCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZU1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgeG1sU2NoZW1hQXR0cmlidXRlLmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHFuYW1lU3VmZml4KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBYbWxTY2hlbWFUeXBlIGdldFNjaGVtYVR5cGUoWG1sU2NoZW1hIHNjaGVtYSwgUU5hbWUgdHlwZU5hbWUpIHsKLSAgICAgICAgWG1sU2NoZW1hVHlwZSB4bWxTY2hlbWFUeXBlID0gbnVsbDsKLSAgICAgICAgaWYgKHNjaGVtYSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB4bWxTY2hlbWFUeXBlID0gc2NoZW1hLmdldFR5cGVCeU5hbWUodHlwZU5hbWUpOwotICAgICAgICAgICAgaWYgKHhtbFNjaGVtYVR5cGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIHRyeSB0byBmaW5kIGluIGFuIGltcG9ydCBvciBhbiBpbmNsdWRlCi0gICAgICAgICAgICAgICAgWG1sU2NoZW1hT2JqZWN0Q29sbGVjdGlvbiBpbmNsdWRlcyA9IHNjaGVtYS5nZXRJbmNsdWRlcygpOwotICAgICAgICAgICAgICAgIGlmIChpbmNsdWRlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGluY2x1ZGVzSXRlciA9IGluY2x1ZGVzLmdldEl0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgIE9iamVjdCBvYmplY3QgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaW5jbHVkZXNJdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0ID0gaW5jbHVkZXNJdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBYbWxTY2hlbWFJbXBvcnQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBYbWxTY2hlbWEgc2NoZW1hMSA9ICgoWG1sU2NoZW1hSW1wb3J0KSBvYmplY3QpLmdldFNjaGVtYSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFNjaGVtYVR5cGUgPSBnZXRTY2hlbWFUeXBlKHNjaGVtYTEsdHlwZU5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFhtbFNjaGVtYUluY2x1ZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBYbWxTY2hlbWEgc2NoZW1hMSA9ICgoWG1sU2NoZW1hSW5jbHVkZSkgb2JqZWN0KS5nZXRTY2hlbWEoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxTY2hlbWFUeXBlID0gZ2V0U2NoZW1hVHlwZShzY2hlbWExLHR5cGVOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh4bWxTY2hlbWFUeXBlICE9IG51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB4bWxTY2hlbWFUeXBlOwotICAgIH0KLQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcm9jZXNzQ29tcGxleENvbnRlbnRNb2RlbChYbWxTY2hlbWFDb21wbGV4VHlwZSBjbXBseFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlTWFwcGVyIG1hcHBlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBvcE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXAgc2NoZW1hTWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHFuYW1lU3VmZml4KSB7Ci0gICAgICAgIFhtbFNjaGVtYUNvbnRlbnRNb2RlbCBjb250ZW50TW9kZWwgPSBjbXBseFR5cGUuZ2V0Q29udGVudE1vZGVsKCk7Ci0gICAgICAgIGlmIChjb250ZW50TW9kZWwgaW5zdGFuY2VvZiBYbWxTY2hlbWFDb21wbGV4Q29udGVudCkgewotICAgICAgICAgICAgWG1sU2NoZW1hQ29tcGxleENvbnRlbnQgeG1sU2NoZW1hQ29tcGxleENvbnRlbnQgPSAoWG1sU2NoZW1hQ29tcGxleENvbnRlbnQpIGNvbnRlbnRNb2RlbDsKLSAgICAgICAgICAgIFhtbFNjaGVtYUNvbnRlbnQgY29udGVudCA9IHhtbFNjaGVtYUNvbXBsZXhDb250ZW50LmdldENvbnRlbnQoKTsKLSAgICAgICAgICAgIGlmIChjb250ZW50IGluc3RhbmNlb2YgWG1sU2NoZW1hQ29tcGxleENvbnRlbnRFeHRlbnNpb24pIHsKLSAgICAgICAgICAgICAgICBYbWxTY2hlbWFDb21wbGV4Q29udGVudEV4dGVuc2lvbiBzY2hlbWFFeHRlbnNpb24gPSAoWG1sU2NoZW1hQ29tcGxleENvbnRlbnRFeHRlbnNpb24pIGNvbnRlbnQ7Ci0KLSAgICAgICAgICAgICAgICAvLyBwcm9jZXNzIHBhcnRpY2xlcyBpbnNpZGUgdGhpcyBleHRlbnNpb24sIGlmIGFueQotICAgICAgICAgICAgICAgIHByb2Nlc3NTY2hlbWFTZXF1ZW5jZShzY2hlbWFFeHRlbnNpb24uZ2V0UGFydGljbGUoKSwgbWFwcGVyLCBvcE5hbWUsIHNjaGVtYU1hcCwgcW5hbWVTdWZmaXgpOwotCi0gICAgICAgICAgICAgICAgWG1sU2NoZW1hIHhtbFNjaGVtYSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgIFhtbFNjaGVtYVR5cGUgZXh0ZW5zaW9uU2NoZW1hVHlwZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gc2NoZW1hTWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7aXRlci5oYXNOZXh0KCk7KXsKLSAgICAgICAgICAgICAgICAgICAgeG1sU2NoZW1hID0gKFhtbFNjaGVtYSkgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvblNjaGVtYVR5cGUgPSBnZXRTY2hlbWFUeXBlKHhtbFNjaGVtYSxzY2hlbWFFeHRlbnNpb24uZ2V0QmFzZVR5cGVOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZXh0ZW5zaW9uU2NoZW1hVHlwZSAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHJvY2Vzc1hNTFNjaGVtYUNvbXBsZXhUeXBlKGV4dGVuc2lvblNjaGVtYVR5cGUsIG1hcHBlciwgb3BOYW1lLCBzY2hlbWFNYXAsIHFuYW1lU3VmZml4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcHJvY2Vzc1NjaGVtYVNlcXVlbmNlKFhtbFNjaGVtYVBhcnRpY2xlIHBhcnRpY2xlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVNYXBwZXIgbWFwcGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBvcE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwIHNjaGVtYU1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcW5hbWVTdWZmaXgpIHsKLSAgICAgICAgaWYgKHBhcnRpY2xlIGluc3RhbmNlb2YgWG1sU2NoZW1hU2VxdWVuY2UpIHsKLSAgICAgICAgICAgIFhtbFNjaGVtYU9iamVjdENvbGxlY3Rpb24gaXRlbXMgPSAoKFhtbFNjaGVtYVNlcXVlbmNlKSBwYXJ0aWNsZSkuZ2V0SXRlbXMoKTsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGl0ZW1zLmdldEl0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIE9iamVjdCBpdGVtID0gaS5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgLy8gZ2V0IGVhY2ggYW5kIGV2ZXJ5IGVsZW1lbnQgaW4gdGhlIHNlcXVlbmNlIGFuZAotICAgICAgICAgICAgICAgIC8vIHRyYXZlcnNlIHRocm91Z2ggdGhlbQotICAgICAgICAgICAgICAgIGlmIChpdGVtIGluc3RhbmNlb2YgWG1sU2NoZW1hRWxlbWVudCkgewotICAgICAgICAgICAgICAgICAgICAvL3BvcHVsYXRlIHRoZSBtYXAgd2l0aCB0aGUgcGFydG5hbWUgLSBjbGFzcyBuYW1lCi0gICAgICAgICAgICAgICAgICAgIC8vYXR0YWNoZWQgdG8gdGhlIHNjaGVtYSBlbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgIFhtbFNjaGVtYUVsZW1lbnQgeG1sU2NoZW1hRWxlbWVudCA9IChYbWxTY2hlbWFFbGVtZW50KSBpdGVtOwotICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzQXJyYXkgPSB4bWxTY2hlbWFFbGVtZW50LmdldE1heE9jY3VycygpID4gMTsKLQotICAgICAgICAgICAgICAgICAgICBYbWxTY2hlbWFUeXBlIHNjaGVtYVR5cGUgPSB4bWxTY2hlbWFFbGVtZW50LmdldFNjaGVtYVR5cGUoKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhcnROYW1lID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHhtbFNjaGVtYUVsZW1lbnQuZ2V0UmVmTmFtZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcnROYW1lID0geG1sU2NoZW1hRWxlbWVudC5nZXRSZWZOYW1lKCkuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYXJ0TmFtZSA9IHhtbFNjaGVtYUVsZW1lbnQuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIGVsZW1lbnQgY2xhc3MgbmFtZSBmcm9tIHRoZSBlbGVtZW50IGFuZCBwb3B1bGF0ZSB0aGUgbWFwcGVyCi0gICAgICAgICAgICAgICAgICAgIHBvcHVsYXRlQ2xhc3NOYW1lKHhtbFNjaGVtYUVsZW1lbnQuZ2V0TWV0YUluZm9NYXAoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQXJyYXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFuYW1lU3VmZml4KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBYbWxTY2hlbWFBbnkpIHsKLQotICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGlzIGlzIGFuIGluc3RhbmNlIG9mIHhzOmFueSwgdGhlbiB0aGVyZSBpcyBubyBwYXJ0IG5hbWUgZm9yIGl0LiBVc2luZyBBTllfRUxFTUVOVF9GSUVMRF9OQU1FCi0gICAgICAgICAgICAgICAgICAgIC8vIGZvciBpdCBmb3Igbm93Ci0KLSAgICAgICAgICAgICAgICAgICAgWG1sU2NoZW1hQW55IHhtbFNjaGVtYUFueSA9IChYbWxTY2hlbWFBbnkpIGl0ZW07Ci0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNBcnJheSA9IHhtbFNjaGVtYUFueS5nZXRNYXhPY2N1cnMoKSA+IDE7Ci0KLSAgICAgICAgICAgICAgICAgICAgUU5hbWUgcGFydFFOYW1lID0gV1NETFV0aWwuZ2V0UGFydFFOYW1lKG9wTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBxbmFtZVN1ZmZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuQU5ZX0VMRU1FTlRfRklFTERfTkFNRSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzQXJyYXkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBlci5hZGRUeXBlTWFwcGluZ05hbWUocGFydFFOYW1lLCAib3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnRbXSIpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGVyLmFkZFR5cGVNYXBwaW5nTmFtZShwYXJ0UU5hbWUsICJvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gcHJpdmF0ZSBzdGF0aWMgdm9pZAotCi0gICAgLyoqCi0gICAgICogVXRpbCBtZXRob2QgdG8gcG9wdWxhdGUgdGhlIGNsYXNzIG5hbWUgaW50byB0aGUgdHlwZU1hcAotICAgICAqCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCAgcG9wdWxhdGVDbGFzc05hbWUoTWFwIG1ldGFJbmZvTWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZU1hcHBlciB0eXBlTWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG9wTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNBcnJheSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXJ0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBxbmFtZVN1ZmZpeCkgewotCi0KLQotICAgICAgICBpZiAobWV0YUluZm9NYXAgIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IChTdHJpbmcpIG1ldGFJbmZvTWFwLgotICAgICAgICAgICAgICAgICAgICBnZXQoU2NoZW1hQ29uc3RhbnRzLlNjaGVtYUNvbXBpbGVySW5mb0hvbGRlci5DTEFTU05BTUVfS0VZKTsKLQotICAgICAgICAgICAgLy8gdGhpcyBpcyBhIHRlbXBvcmFyeSBwYXRjaAotICAgICAgICAgICAgLy8gdGhlIGFjdWFsIHByb2JsZW0gaXMga2VlcGluZyB0aGUgY2xhc3MgbmFtZSBkZXRhaWxzIG9uIHRoZSBzY2hlbWFUeXBlIGluCi0gICAgICAgICAgICAvLyBYbWxTY2hlbWEgY29tcGlsZXIuCi0gICAgICAgICAgICAvLyB3ZSBoYXZlIHRvIHN0b3JlIHRoZW0gaW4gWG1sRWxlbWVudAotICAgICAgICAgICAgaWYgKGlzQXJyYXkgJiYgIWNsYXNzTmFtZS5lbmRzV2l0aCgiW10iKSkgewotICAgICAgICAgICAgICAgIGNsYXNzTmFtZSArPSAiW10iOwotICAgICAgICAgICAgfSBlbHNlIGlmICghaXNBcnJheSAmJiBjbGFzc05hbWUuZW5kc1dpdGgoIltdIikpIHsKLSAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSBjbGFzc05hbWUuc3Vic3RyaW5nKDAsIGNsYXNzTmFtZS5sZW5ndGgoKSAtIDIpOwotICAgICAgICAgICAgfQotCi0KLSAgICAgICAgICAgIFFOYW1lIHBhcnRRTmFtZSA9IFdTRExVdGlsLmdldFBhcnRRTmFtZShvcE5hbWUsCi0gICAgICAgICAgICAgICAgICAgIHFuYW1lU3VmZml4LAotICAgICAgICAgICAgICAgICAgICBwYXJ0TmFtZSk7Ci0gICAgICAgICAgICB0eXBlTWFwLmFkZFR5cGVNYXBwaW5nTmFtZShwYXJ0UU5hbWUsIGNsYXNzTmFtZSk7Ci0gICAgICAgICAgICBpZiAoQm9vbGVhbi5UUlVFLmVxdWFscygKLSAgICAgICAgICAgICAgICAgICAgbWV0YUluZm9NYXAuZ2V0KFNjaGVtYUNvbnN0YW50cy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFDb21waWxlckluZm9Ib2xkZXIuQ0xBU1NOQU1FX1BSSU1JVFZFX0tFWSkpKSB7Ci0KLSAgICAgICAgICAgICAgICAvL3RoaXMgdHlwZSBpcyBwcmltaXRpdmUgLSBhZGQgdGhhdCB0byB0aGUgdHlwZSBtYXBwZXIgc3RhdHVzCi0gICAgICAgICAgICAgICAgLy9mb3Igbm93IGxldHMgYWRkIGEgYm9vbGVhbgotICAgICAgICAgICAgICAgIHR5cGVNYXAuYWRkVHlwZU1hcHBpbmdTdGF0dXMocGFydFFOYW1lLCBCb29sZWFuLlRSVUUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBMb29rIGZvciBhIGdpdmVuIHNjaGVtYSB0eXBlIGdpdmVuIHRoZSBzY2hlbWEgdHlwZSBRbmFtZQotICAgICAqCi0gICAgICogQHBhcmFtIHNjaGVtYU1hcAotICAgICAqIEByZXR1cm4gbnVsbCBpZiB0aGUgc2NoZW1hIGlzIG5vdCBmb3VuZAotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIFhtbFNjaGVtYVR5cGUgZmluZFNjaGVtYVR5cGUoTWFwIHNjaGVtYU1hcCwgUU5hbWUgc2NoZW1hVHlwZU5hbWUpIHsKLSAgICAgICAgLy9maW5kIHRoZSBzY2hlbWEKLSAgICAgICAgWG1sU2NoZW1hIHNjaGVtYSA9IChYbWxTY2hlbWEpIHNjaGVtYU1hcC5nZXQoc2NoZW1hVHlwZU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgICAgICBpZiAoc2NoZW1hICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBzY2hlbWEuZ2V0VHlwZUJ5TmFtZShzY2hlbWFUeXBlTmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogcG9wdWxhdGUgcGFyYW1ldGVycyBmcm9tIHRoZSB1c2VyCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb3B0aW9ucwotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcG9wdWxhdGVVc2VycGFyYW1ldGVycyhDb21waWxlck9wdGlvbnMgb3B0aW9ucywgQ29kZUdlbkNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgewotICAgICAgICBNYXAgcHJvcGVydHlNYXAgPSBjb25maWd1cmF0aW9uLmdldFByb3BlcnRpZXMoKTsKLSAgICAgICAgaWYgKHByb3BlcnR5TWFwLmNvbnRhaW5zS2V5KFNjaGVtYUNvbnN0YW50cy5TY2hlbWFDb21waWxlckFyZ3VtZW50cy5XUkFQX1NDSEVNQV9DTEFTU0VTKSkgewotICAgICAgICAgICAgaWYgKEJvb2xlYW4udmFsdWVPZigKLSAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlNYXAuZ2V0KFNjaGVtYUNvbnN0YW50cy5TY2hlbWFDb21waWxlckFyZ3VtZW50cy5XUkFQX1NDSEVNQV9DTEFTU0VTKS50b1N0cmluZygpKS4KLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhblZhbHVlKCkpIHsKLSAgICAgICAgICAgICAgICBvcHRpb25zLnNldFdyYXBDbGFzc2VzKHRydWUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBvcHRpb25zLnNldFdyYXBDbGFzc2VzKGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwcm9wZXJ0eU1hcC5jb250YWluc0tleShTY2hlbWFDb25zdGFudHMuU2NoZW1hQ29tcGlsZXJBcmd1bWVudHMuV1JJVEVfU0NIRU1BX0NMQVNTRVMpKSB7Ci0gICAgICAgICAgICBpZiAoQm9vbGVhbi52YWx1ZU9mKAotICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eU1hcC5nZXQoU2NoZW1hQ29uc3RhbnRzLlNjaGVtYUNvbXBpbGVyQXJndW1lbnRzLldSSVRFX1NDSEVNQV9DTEFTU0VTKS50b1N0cmluZygpKS4KLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhblZhbHVlKCkpIHsKLSAgICAgICAgICAgICAgICBvcHRpb25zLnNldFdyaXRlT3V0cHV0KHRydWUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBvcHRpb25zLnNldFdyaXRlT3V0cHV0KGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0KLSAgICAgICAgLy8gYWRkIHRoZSBjdXN0b20gcGFja2FnZSBuYW1lCi0gICAgICAgIGlmIChwcm9wZXJ0eU1hcC5jb250YWluc0tleShTY2hlbWFDb25zdGFudHMuU2NoZW1hQ29tcGlsZXJBcmd1bWVudHMuUEFDS0FHRSkpIHsKLSAgICAgICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9IChTdHJpbmcpIHByb3BlcnR5TWFwLmdldChTY2hlbWFDb25zdGFudHMuU2NoZW1hQ29tcGlsZXJBcmd1bWVudHMuUEFDS0FHRSk7Ci0gICAgICAgICAgICBpZiAocGFja2FnZU5hbWUgIT0gbnVsbCB8fCAhIiIuZXF1YWxzKHBhY2thZ2VOYW1lKSkgewotICAgICAgICAgICAgICAgIG9wdGlvbnMuc2V0UGFja2FnZU5hbWUocGFja2FnZU5hbWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotICAgICAgICAvLyBzZXQgdGhlIHBhY2thZ2UgbmFtZXNwYWNlIHRvIHVyaSBkZXRhaWxzCi0gICAgICAgIG9wdGlvbnMuc2V0TnMyUGFja2FnZU1hcChjb25maWd1cmF0aW9uLmdldFVyaTJQYWNrYWdlTmFtZU1hcCgpKTsKLQotICAgICAgICAvL2FkZCBjdXN0b20gbWFwcGVyIHBhY2thZ2UgbmFtZQotICAgICAgICBpZiAocHJvcGVydHlNYXAuY29udGFpbnNLZXkoU2NoZW1hQ29uc3RhbnRzLlNjaGVtYUNvbXBpbGVyQXJndW1lbnRzLk1BUFBFUl9QQUNLQUdFKSkgewotICAgICAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gKFN0cmluZykgcHJvcGVydHlNYXAuZ2V0KFNjaGVtYUNvbnN0YW50cy5TY2hlbWFDb21waWxlckFyZ3VtZW50cy5NQVBQRVJfUEFDS0FHRSk7Ci0gICAgICAgICAgICBpZiAocGFja2FnZU5hbWUgIT0gbnVsbCB8fCAhIiIuZXF1YWxzKHBhY2thZ2VOYW1lKSkgewotICAgICAgICAgICAgICAgIG9wdGlvbnMuc2V0TWFwcGVyQ2xhc3NQYWNrYWdlKHBhY2thZ2VOYW1lKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHByb3BlcnR5TWFwLmNvbnRhaW5zS2V5KFNjaGVtYUNvbnN0YW50cy5TY2hlbWFDb21waWxlckFyZ3VtZW50cy5PRkZfU1RSSUNUX1ZBTElEQVRJT04pKXsKLSAgICAgICAgICAgIG9wdGlvbnMuc2V0T2ZmU3RyaWN0VmFsaWRhdGlvbih0cnVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwcm9wZXJ0eU1hcC5jb250YWluc0tleShTY2hlbWFDb25zdGFudHMuU2NoZW1hQ29tcGlsZXJBcmd1bWVudHMuVVNFX1dSQVBQRVJfQ0xBU1NFUykpewotICAgICAgICAgICAgb3B0aW9ucy5zZXRVc2VXcmFwcGVyQ2xhc3Nlcyh0cnVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vc2V0IGhlbHBlciBtb2RlCi0gICAgICAgIC8vdGhpcyBiZWNvbWVzIGVmZmVjdGl2ZSBvbmx5IGlmIHRoZSBjbGFzc2VzIGFyZSB1bnBhY2tlZAotICAgICAgICBpZiAoIW9wdGlvbnMuaXNXcmFwQ2xhc3NlcygpKSB7Ci0gICAgICAgICAgICBpZiAocHJvcGVydHlNYXAuY29udGFpbnNLZXkoU2NoZW1hQ29uc3RhbnRzLlNjaGVtYUNvbXBpbGVyQXJndW1lbnRzLkhFTFBFUl9NT0RFKSkgewotICAgICAgICAgICAgICAgIG9wdGlvbnMuc2V0SGVscGVyTW9kZSh0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogcG9wdWxhdGUgdGhlIGRlZmF1bHQgb3B0aW9ucyAtIGNhbGxlZCBiZWZvcmUgdGhlIGFwcGx5aW5nIG9mIHVzZXIgcGFyYW1ldGVycwotICAgICAqCi0gICAgICogQHBhcmFtIG9wdGlvbnMKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHBvcHVsYXRlRGVmYXVsdE9wdGlvbnMoQ29tcGlsZXJPcHRpb25zIG9wdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVHZW5Db25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHsKLSAgICAgICAgLy9jcmVhdGUgdGhlIG91dHB1dCBkaXJlY3RvcnkKLSAgICAgICAgRmlsZSBvdXRwdXREaXIgPSBjb25maWd1cmF0aW9uLmlzRmxhdHRlbkZpbGVzKCkgPwotICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24uZ2V0T3V0cHV0TG9jYXRpb24oKSA6Ci0gICAgICAgICAgICAgICAgbmV3IEZpbGUoY29uZmlndXJhdGlvbi5nZXRPdXRwdXRMb2NhdGlvbigpLCBjb25maWd1cmF0aW9uLmdldFNvdXJjZUxvY2F0aW9uKCkpOwotCi0gICAgICAgIGlmICghb3V0cHV0RGlyLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICBvdXRwdXREaXIubWtkaXJzKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gdGhlc2Ugb3B0aW9ucyBuZWVkIHRvIGJlIHRha2VuIGZyb20gdGhlIGNvbW1hbmQgbGluZQotICAgICAgICBvcHRpb25zLnNldE91dHB1dExvY2F0aW9uKG91dHB1dERpcik7Ci0gICAgICAgIG9wdGlvbnMuc2V0TnMyUGFja2FnZU1hcChjb25maWd1cmF0aW9uLmdldFVyaTJQYWNrYWdlTmFtZU1hcCgpID09IG51bGwgPwotICAgICAgICAgICAgICAgIG5ldyBIYXNoTWFwKCkgOgotICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24uZ2V0VXJpMlBhY2thZ2VOYW1lTWFwKCkpOwotCi0gICAgICAgIC8vZGVmYXVsdCBzZXR0aW5nIGlzIHRvIHNldCB0aGUgd3JhcCBzdGF0dXMgZGVwZW5kaW5nIG9uIHdoZXRoZXIgaXQncwotICAgICAgICAvL3RoZSBzZXJ2ZXIgc2lkZSBvciB0aGUgY2xpZW50IHNpZGUKLSAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24uaXNTZXJ2ZXJTaWRlKCkpIHsKLSAgICAgICAgICAgIC8vZm9yIHRoZSBzZXJ2ZXJzaWRlIHdlIGdlbmVyYXRlIHVud3JhcHBlZCAgYnkgZGVmYXVsdAotICAgICAgICAgICAgb3B0aW9ucy5zZXRXcmFwQ2xhc3NlcyhmYWxzZSk7Ci0gICAgICAgICAgICAvL2ZvciB0aGUgc2VydmVyc2lkZSB3ZSB3cml0ZSB0aGUgb3V0cHV0IGJ5IGRlZmF1bHQKLSAgICAgICAgICAgIG9wdGlvbnMuc2V0V3JpdGVPdXRwdXQodHJ1ZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBmb3IgdGhlIGNsaWVudCBsZXQgdGhlIHVzZXJzIHByZWZlcmVuY2UgYmUgdGhlIHdvcmQgaGVyZQotICAgICAgICAgICAgb3B0aW9ucy5zZXRXcmFwQ2xhc3Nlcyhjb25maWd1cmF0aW9uLmlzUGFja0NsYXNzZXMoKSk7Ci0gICAgICAgICAgICAvL2ZvciB0aGUgY2xpZW50IHNpZGUgdGhlIGRlZmF1bHQgc2V0dGluZyBpcyBub3QgdG8gd3JpdGUgdGhlCi0gICAgICAgICAgICAvL291dHB1dAotICAgICAgICAgICAgb3B0aW9ucy5zZXRXcml0ZU91dHB1dCghY29uZmlndXJhdGlvbi5pc1BhY2tDbGFzc2VzKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24uaXNHZW5lcmF0ZUFsbCgpKSB7Ci0gICAgICAgICAgICBvcHRpb25zLnNldEdlbmVyYXRlQWxsKHRydWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24uaXNCYWNrd29yZENvbXBhdGliaWxpdHlNb2RlKCkpIHsKLSAgICAgICAgICAgIG9wdGlvbnMuc2V0QmFja3dvcmRDb21wYXRpYmlsaXR5TW9kZSh0cnVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjb25maWd1cmF0aW9uLmlzU3VwcHJlc3NQcmVmaXhlc01vZGUoKSkgewotICAgICAgICAgICAgb3B0aW9ucy5zZXRTdXBwcmVzc1ByZWZpeGVzTW9kZSh0cnVlKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL1NjaGVtYUNvbXBpbGF0aW9uRXhjZXB0aW9uLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTllMWMxMy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zY2hlbWE7Ci0KLS8qKgotICogQSBzaW1lcGxlIGV4dGVuc2lvbiBmcm9tIHRoZSBqYXZhLmxhbmcuZXhjZXB0aW9uIHRvIHNlcnZlIGFzIHRoZSBzY2hlbWEgY29tcGlsZXJzCi0gKiBFeGNlcHRpb24KLSAqLwotcHVibGljIGNsYXNzIFNjaGVtYUNvbXBpbGF0aW9uRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDI1MjA5Mzk1NjAwNjA2MDgxNTdMOwotCi0JcHVibGljIFNjaGVtYUNvbXBpbGF0aW9uRXhjZXB0aW9uKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24oVGhyb3dhYmxlIGNhdXNlKSB7Ci0gICAgICAgIHN1cGVyKGNhdXNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlLCBjYXVzZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL1NjaGVtYUNvbXBpbGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvU2NoZW1hQ29tcGlsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFhNzMwYy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvU2NoZW1hQ29tcGlsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NTAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIubmFtZXNwYWNlLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5pMThuLlNjaGVtYUNvbXBpbGVyTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEudXRpbC5QcmltaXRpdmVUeXBlRmluZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLnV0aWwuUHJpbWl0aXZlVHlwZVdyYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEudXRpbC5TY2hlbWFQcm9wZXJ0eUxvYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS53cml0ZXIuQmVhbldyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuU2NoZW1hVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuVVJMUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hOwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hQWxsOwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hQW55OwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hQW55QXR0cmlidXRlOwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hQXR0cmlidXRlOwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hQXR0cmlidXRlR3JvdXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFBdHRyaWJ1dGVHcm91cFJlZjsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYUNob2ljZTsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYUNvbXBsZXhDb250ZW50OwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hQ29tcGxleENvbnRlbnRFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFDb21wbGV4Q29udGVudFJlc3RyaWN0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hQ29tcGxleFR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFDb250ZW50OwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hQ29udGVudE1vZGVsOwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYUVudW1lcmF0aW9uRmFjZXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFFeHRlcm5hbDsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYUdyb3VwOwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hR3JvdXBCYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hR3JvdXBSZWY7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFJbXBvcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFJbmNsdWRlOwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hTGVuZ3RoRmFjZXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFNYXhFeGNsdXNpdmVGYWNldDsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYU1heEluY2x1c2l2ZUZhY2V0OwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hTWF4TGVuZ3RoRmFjZXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFNaW5FeGNsdXNpdmVGYWNldDsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYU1pbkluY2x1c2l2ZUZhY2V0OwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hTWluTGVuZ3RoRmFjZXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFPYmplY3RDb2xsZWN0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hT2JqZWN0VGFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFQYXJ0aWNsZTsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYVBhdHRlcm5GYWNldDsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYVNlcXVlbmNlOwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hU2ltcGxlQ29udGVudDsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYVNpbXBsZUNvbnRlbnRFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFTaW1wbGVDb250ZW50UmVzdHJpY3Rpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFTaW1wbGVUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hU2ltcGxlVHlwZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFTaW1wbGVUeXBlTGlzdDsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYVNpbXBsZVR5cGVSZXN0cmljdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYVNpbXBsZVR5cGVVbmlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYVR5cGU7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci0KLS8qKgotICogU2NoZW1hIGNvbXBpbGVyIGZvciBBREIuIEJhc2VkIG9uIFdTLUNvbW1vbnMgc2NoZW1hIG9iamVjdCBtb2RlbC4KLSAqLwotcHVibGljIGNsYXNzIFNjaGVtYUNvbXBpbGVyIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTVBPTkVOVF9UWVBFID0gMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT01QT05FTlRfRUxFTUVOVCA9IDI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09NUE9ORU5UX0FUVFJJQlVURSA9IDM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09NUE9ORU5UX0FUVFJJQlVURV9HUk9VUCA9IDQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09NUE9ORU5UX0dST1VQID0gNTsKLQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFNjaGVtYUNvbXBpbGVyLmNsYXNzKTsKLQotICAgIHByaXZhdGUgQ29tcGlsZXJPcHRpb25zIG9wdGlvbnM7Ci0gICAgcHJpdmF0ZSBIYXNoTWFwIHByb2Nlc3NlZFR5cGVtYXA7Ci0gICAgLy8gaGF2ZSB0byBrZWVwIGEgc2VwZXJhdGUgZ3JvdXAgdHlwZSBtYXAgc2luY2Ugc2FtZQotICAgIC8vIG5hbWUgY2FuIGJlIHVzZWQgdG8gZ3JvdXAgYW5kIGNvbXBsZXh0eXBlCi0gICAgcHJpdmF0ZSBIYXNoTWFwIHByb2Nlc3NlZEdyb3VwVHlwZU1hcDsKLQotICAgIC8vdGhlIGxpc3Qgb2YgcHJvY2Vzc2VkRWxlbWVudHMgZm9yIHRoZSBvdXRlciBlbGVtZW50cwotICAgIHByaXZhdGUgSGFzaE1hcCBwcm9jZXNzZWRFbGVtZW50TWFwOwotCi0gICAgcHJpdmF0ZSBIYXNoTWFwIHByb2Nlc3NlZEFub255bW91c0NvbXBsZXhUeXBlc01hcDsKLQotICAgIC8vd2UgbmVlZCB0aGlzIG1hcCB0byBrZWVwIHRoZSByZWZlcmVuY2VkIGVsZW1lbnRzLiB0aGVzZSBlbGVtZW50cyBuZWVkIHRvIGJlIGtlcHQgc2VwZXJhdGUKLSAgICAvL3RvIGF2b2lkIGNvbmZsaWN0cwotICAgIHByaXZhdGUgSGFzaE1hcCBwcm9jZXNzZWRFbGVtZW50UmVmTWFwOwotICAgIHByaXZhdGUgSGFzaE1hcCBzaW1wbGVUeXBlc01hcDsKLSAgICBwcml2YXRlIEhhc2hNYXAgY2hhbmdlZFR5cGVNYXA7Ci0KLSAgICBwcml2YXRlIEhhc2hTZXQgY2hhbmdlZFNpbXBsZVR5cGVTZXQ7Ci0gICAgcHJpdmF0ZSBIYXNoU2V0IGNoYW5nZWRDb21wbGV4VHlwZVNldDsKLSAgICBwcml2YXRlIEhhc2hTZXQgY2hhbmdlZEVsZW1lbnRTZXQ7Ci0KLSAgICAvLyB0aGlzIG1hcCBpcyBuZWNlc3NhcnkgdG8gcmV0YWluIHRoZSBtZXRhaW5mb3JtYXRpb24gb2YgdHlwZXMuIFRoZSByZWFzb24gd2h5IHRoZXNlCi0gICAgLy8gbWV0YSBpbmZvICdiYWdzJyB3b3VsZCBiZSB1c2VmdWwgbGF0ZXIgaXMgdG8gY2F0ZXIgZm9yIHRoZSBleHRlbnNpb25zIGFuZCByZXN0cmljdGlvbnMKLSAgICAvLyBvZiB0eXBlcwotICAgIHByaXZhdGUgSGFzaE1hcCBwcm9jZXNzZWRUeXBlTWV0YUluZm9NYXA7Ci0KLSAgICAvLwotICAgIHByaXZhdGUgQXJyYXlMaXN0IHByb2Nlc3NlZEVsZW1lbnRMaXN0OwotCi0gICAgLy9hIGxpc3Qgb2YgbmlsbGFibGUgZWxlbWVudHMgLSB1c2VkIHRvIGdlbmVyYXRlIGNvZGUKLSAgICAvL2ZvciBuaWxsYWJsZSBlbGVtZW50cwotICAgIHByaXZhdGUgTGlzdCBuaWxsYWJsZUVsZW1lbnRMaXN0OwotICAgIC8vIHdyaXRlZSByZWZlcmVuY2UKLSAgICBwcml2YXRlIEJlYW5Xcml0ZXIgd3JpdGVyID0gbnVsbDsKLSAgICBwcml2YXRlIE1hcCBiYXNlU2NoZW1hVHlwZU1hcCA9IG51bGw7Ci0KLSAgICAvL2EgbWFwIGZvciBrZWVwaW5nIHRoZSBhbHJlYWR5IGxvYWRlZCBzY2hlbWFzCi0gICAgLy90aGUga2V5IGlzIHRoZSB0YXJnZXRuYW1lc3BhY2UgYW5kIHRoZSB2YWx1ZSBpcyB0aGUgc2NoZW1hIG9iamVjdAotICAgIHByaXZhdGUgTWFwIGxvYWRlZFNjaGVtYU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICAvLyBBIG1hcCBrZWVwaW5nIHRoZSBhdmFpbGFibGUgc2NoZW1hcwotICAgIC8vdGhlIGtleSBpcyB0aGUgdGFyZ2V0bmFtZXNwYWNlIGFuZCB0aGUgdmFsdWUgaXMgdGhlIHNjaGVtYSBvYmplY3QKLSAgICAvL3RoaXMgbWFwIHdpbGwgYmUgcG9wdWxhdGVkIHdoZW4gbXVsdGlwbGUgc2NoZW1hcwotICAgIC8vYXJlIGZlZCB0byB0aGUgc2NoZW1hIGNvbXBpbGVyIQotICAgIHByaXZhdGUgTWFwIGF2YWlsYWJsZVNjaGVtYU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICBwcml2YXRlIE1hcCBsb2FkZWRTb3VyY2VVUkkgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgLy8gYSBsaXN0IG9mIGV4dGVybmFsbHkgaWRlbnRpZmllZCBRTmFtZXMgdG8gYmUgcHJvY2Vzc2VkLiBUaGlzIGJlY29tZXMKLSAgICAvLyB1c2VmdWwgd2hlbiAgb25seSBhIGxpc3Qgb2YgZXh0ZXJuYWwgZWxlbWVudHMgbmVlZCB0byBiZSBwcm9jZXNzZWQKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFOWV9FTEVNRU5UX0ZJRUxEX05BTUUgPSAiZXh0cmFFbGVtZW50IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9BVFRSSUJVVEVfRklFTERfTkFNRSA9ICJleHRyYUF0dHJpYnV0ZXMiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFX09QVElPTkFMID0gIm9wdGlvbmFsIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VfUkVRVUlSRUQgPSAicmVxdWlyZWQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRV9OT05FID0gIm5vbmUiOwotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgcHJvY2Vzc2VzIGVsZW1lbnQgbWFwCi0gICAgICogICAgICAgICBpbmNsdWRlcyB0aGUgUW5hbWUgb2YgdGhlIGVsZW1lbnQgYXMgdGhlIGtleSBhbmQgYQotICAgICAqICAgICAgICAgU3RyaW5nIHJlcHJlc2VudGluZyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgSGFzaE1hcCBnZXRQcm9jZXNzZWRFbGVtZW50TWFwKCkgewotICAgICAgICByZXR1cm4gcHJvY2Vzc2VkRWxlbWVudE1hcDsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gYSBtYXAgb2YgUW5hbWUgdnMgbW9kZWxzLiBBIG1vZGVsIGNhbiBiZSBhbnl0aGluZywKLSAgICAgKiAgICAgICAgIHJhbmdpbmcgZnJvbSBhIERPTSBkb2N1bWVudCB0byBhIHN0cmVhbS4gVGhpcyBpcyB0YWtlbiBmcm9tIHRoZQotICAgICAqICAgICAgICAgd3JpdGVyIGFuZCB0aGUgc2NoZW1hIGNvbXBpbGVyIGhhcyBubyBjb250cm9sIG92ZXIgaXQKLSAgICAgKi8KLSAgICBwdWJsaWMgTWFwIGdldFByb2Nlc3NlZE1vZGVsTWFwKCkgewotICAgICAgICByZXR1cm4gd3JpdGVyLmdldE1vZGVsTWFwKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgLSBBY2NlcHRzIGEgb3B0aW9ucyBiZWFuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb3B0aW9ucwotICAgICAqLwotICAgIHB1YmxpYyBTY2hlbWFDb21waWxlcihDb21waWxlck9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIFNjaGVtYUNvbXBpbGF0aW9uRXhjZXB0aW9uIHsKLQotICAgICAgICBpZiAob3B0aW9ucyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvL2NyZWF0ZSBhbiBlbXB0eSBvcHRpb25zIG9iamVjdAotICAgICAgICAgICAgdGhpcy5vcHRpb25zID0gbmV3IENvbXBpbGVyT3B0aW9ucygpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9uczsKLSAgICAgICAgfQotCi0gICAgICAgIC8vaW5zdGFudGlhdGUgdGhlIG1hcHMKLSAgICAgICAgcHJvY2Vzc2VkVHlwZW1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIHByb2Nlc3NlZEdyb3VwVHlwZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICAgICAgcHJvY2Vzc2VkRWxlbWVudE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIHNpbXBsZVR5cGVzTWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgcHJvY2Vzc2VkRWxlbWVudExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIHByb2Nlc3NlZEFub255bW91c0NvbXBsZXhUeXBlc01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIGNoYW5nZWRUeXBlTWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgcHJvY2Vzc2VkVHlwZU1ldGFJbmZvTWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgcHJvY2Vzc2VkRWxlbWVudFJlZk1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIG5pbGxhYmxlRWxlbWVudExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgY2hhbmdlZENvbXBsZXhUeXBlU2V0ID0gbmV3IEhhc2hTZXQoKTsKLSAgICAgICAgY2hhbmdlZFNpbXBsZVR5cGVTZXQgPSBuZXcgSGFzaFNldCgpOwotICAgICAgICBjaGFuZ2VkRWxlbWVudFNldCA9IG5ldyBIYXNoU2V0KCk7Ci0KLSAgICAgICAgLy9sb2FkIHRoZSB3cml0ZXIgYW5kIGluaXRpbGlhemUgdGhlIGJhc2UgdHlwZXMKLSAgICAgICAgd3JpdGVyID0gU2NoZW1hUHJvcGVydHlMb2FkZXIuZ2V0QmVhbldyaXRlckluc3RhbmNlKCk7Ci0gICAgICAgIHdyaXRlci5pbml0KHRoaXMub3B0aW9ucyk7Ci0KLSAgICAgICAgLy9sb2FkIHRoZSBiYXNlIHR5cGVzCi0gICAgICAgIGJhc2VTY2hlbWFUeXBlTWFwID0gU2NoZW1hUHJvcGVydHlMb2FkZXIuZ2V0VHlwZU1hcHBlckluc3RhbmNlKCkuZ2V0VHlwZU1hcCgpOwotICAgICAgICAvLyBhZGRpbmcgYWxsIHRoZSBzb2FwIGVuY29kaW5nIHNjaGVtYSBjbGFzc2VzCi0gICAgICAgIHByb2Nlc3NlZFR5cGVtYXAucHV0QWxsKFNjaGVtYVByb3BlcnR5TG9hZGVyLmdldFR5cGVNYXBwZXJJbnN0YW5jZSgpLmdldFNvYXBFbmNvZGluZ1R5cGVzTWFwKCkpOwotCi0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb21waWxlIGEgbGlzdCBvZiBzY2hlbWFzCi0gICAgICogVGhpcyBhY3R1YWxseSBjYWxscyB0aGUgY29tcGlsZSAoWG1sU2NoZW1hIHMpIG1ldGhvZCByZXBlYXRlZGx5Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gc2NoZW1hbGlzdAotICAgICAqIEB0aHJvd3MgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24KLSAgICAgKiBAc2VlICNjb21waWxlKG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNvbXBpbGUoTGlzdCBzY2hlbWFsaXN0KSB0aHJvd3MgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24gewotICAgICAgICB0cnkgewotCi0gICAgICAgICAgICBpZiAoc2NoZW1hbGlzdC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vY2xlYXIgdGhlIGxvYWRlZCBhbmQgYXZhaWxhYmxlIG1hcHMKLSAgICAgICAgICAgIGxvYWRlZFNjaGVtYU1hcC5jbGVhcigpOwotICAgICAgICAgICAgYXZhaWxhYmxlU2NoZW1hTWFwLmNsZWFyKCk7Ci0KLSAgICAgICAgICAgIFhtbFNjaGVtYSBzY2hlbWE7Ci0gICAgICAgICAgICAvLyBmaXJzdCByb3VuZCAtIHBvcHVsYXRlIHRoZSBhdmFpYWxibGUgbWFwCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNjaGVtYWxpc3Quc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBzY2hlbWEgPSAoWG1sU2NoZW1hKSBzY2hlbWFsaXN0LmdldChpKTsKLSAgICAgICAgICAgICAgICBhdmFpbGFibGVTY2hlbWFNYXAucHV0KAotICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy9zZXQgYSBtYXBwZXIgcGFja2FnZSBpZiBub3QgYXZhaWFsYWJsZQotICAgICAgICAgICAgaWYgKHdyaXRlci5nZXRFeHRlbnNpb25NYXBwZXJQYWNrYWdlTmFtZSgpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbnNwID0gbnVsbDsKLSAgICAgICAgICAgICAgICAvL2dldCB0aGUgZmlyc3Qgc2NoZW1hIGZyb20gdGhlIGxpc3QgYW5kIHRha2UgdGhhdCBuYW1lc3BhY2UgYXMgdGhlCi0gICAgICAgICAgICAgICAgLy9tYXBwZXIgbmFtZXNwYWNlCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IG5zcCA9PSBudWxsICYmIGkgPCBzY2hlbWFsaXN0LnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5zcCA9ICgoWG1sU2NoZW1hKSBzY2hlbWFsaXN0LmdldChpKSkuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgobnNwICE9IG51bGwpICYmICFuc3AuZXF1YWxzKCIiKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBYbWxTY2hlbWFbXSBzY2hlbWFzID0gU2NoZW1hVXRpbC5nZXRBbGxTY2hlbWFzKChYbWxTY2hlbWEpIHNjaGVtYWxpc3QuZ2V0KGkpKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IHNjaGVtYXMgIT0gbnVsbCAmJiBqIDwgc2NoZW1hcy5sZW5ndGg7IGorKykgewotICAgICAgICAgICAgICAgICAgICAgICAgbnNwID0gc2NoZW1hc1tqXS5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuc3AgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobnNwID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbnNwID0gVVJMUHJvY2Vzc29yLkRFRkFVTFRfUEFDS0FHRTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBpZiB0aGlzIG5hbWUgc3BhY2UgZXhpc3RzIGluIHRoZSBuczJwIGxpc3QgdGhlbiB3ZSB1c2UgaXQuCi0gICAgICAgICAgICAgICAgaWYgKChvcHRpb25zLmdldE5zMlBhY2thZ2VNYXAoKSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKG9wdGlvbnMuZ2V0TnMyUGFja2FnZU1hcCgpLmNvbnRhaW5zS2V5KG5zcCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHdyaXRlci5yZWdpc3RlckV4dGVuc2lvbk1hcHBlclBhY2thZ2VOYW1lKChTdHJpbmcpIG9wdGlvbnMuZ2V0TnMyUGFja2FnZU1hcCgpLmdldChuc3ApKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB3cml0ZXIucmVnaXN0ZXJFeHRlbnNpb25NYXBwZXJQYWNrYWdlTmFtZShVUkxQcm9jZXNzb3IubWFrZVBhY2thZ2VOYW1lKG5zcCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIHNlY29uZCByb3VuZCAtIGNhbGwgdGhlIHNjaGVtYSBjb21waWxlciBvbmUgYnkgb25lCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNjaGVtYWxpc3Quc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBjb21waWxlKChYbWxTY2hlbWEpIHNjaGVtYWxpc3QuZ2V0KGkpLCB0cnVlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy9maW5pc2ggdXAKLSAgICAgICAgICAgIGZpbmFsaXplU2NoZW1hQ29tcGlsYXRpb24oKTsKLQotICAgICAgICB9IGNhdGNoIChTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVtYUNvbXBpbGF0aW9uRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29tcGlsZSAocmF0aGVyIGNvZGVnZW4pIGEgc2luZ2xlIHNjaGVtYSBlbGVtZW50Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gc2NoZW1hCi0gICAgICogQHRocm93cyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNvbXBpbGUoWG1sU2NoZW1hIHNjaGVtYSkgdGhyb3dzIFNjaGVtYUNvbXBpbGF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgY29tcGlsZShzY2hlbWEsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb21waWxlIChyYXRoZXIgY29kZWdlbikgYSBzaW5nbGUgc2NoZW1hIGVsZW1lbnQKLSAgICAgKgotICAgICAqIEBwYXJhbSBzY2hlbWEKLSAgICAgKiBAcGFyYW0gaXNQYXJ0b2ZHcm91cAotICAgICAqIEB0aHJvd3MgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY29tcGlsZShYbWxTY2hlbWEgc2NoZW1hLCBib29sZWFuIGlzUGFydG9mR3JvdXApIHRocm93cyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgLy8gc29tZSBkb2N1bWVudHMgZXhwbGljaXRseSBpbXBvcnRzIHRoZSBzY2hlbWEgb2YgYnVpbHQgaW4gdHlwZXMuIFdlIGRvbid0IGFjdHVhbGx5IG5lZWQgdG8gY29tcGlsZQotICAgICAgICAvLyB0aGUgYnVpbHQtaW4gdHlwZXMuIFNvIGNoZWNrIHRoZSB0YXJnZXQgbmFtZXNwYWNlIGhlcmUgYW5kIGlnbm9yZSBpdC4KLSAgICAgICAgaWYgKENvbnN0YW50cy5VUklfMjAwMV9TQ0hFTUFfWFNELmVxdWFscyhzY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvL3JlZ2lzdGVyIHRoZSBwYWNrYWdlIGZyb20gdGhpcyBuYW1lc3BhY2UgYXMgdGhlIG1hcHBlciBjbGFzc2VzIHBhY2thZ2UKLSAgICAgICAgaWYgKCFpc1BhcnRvZkdyb3VwKSB7Ci0gICAgICAgICAgICAvL3NldCBhIG1hcHBlciBwYWNrYWdlIGlmIG5vdCBhdmFpYWxhYmxlCi0gICAgICAgICAgICBpZiAod3JpdGVyLmdldEV4dGVuc2lvbk1hcHBlclBhY2thZ2VOYW1lKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHdyaXRlci5yZWdpc3RlckV4dGVuc2lvbk1hcHBlclBhY2thZ2VOYW1lKAotICAgICAgICAgICAgICAgICAgICAgICAgVVJMUHJvY2Vzc29yLm1ha2VQYWNrYWdlTmFtZShzY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vRmlyc3QgbG9vayBmb3IgdGhlIHNjaGVtYXMgdGhhdCBhcmUgaW1wb3J0ZWQgYW5kIHByb2Nlc3MgdGhlbQotICAgICAgICAvL05vdGUgdGhhdCB0aGVzZSBhcmUgcHJvY2Vzc2VkIHJlY3Vyc2l2ZWx5IQotCi0gICAgICAgIC8vYWRkIHRoZSBzY2hlbWEgdG8gdGhlIGxvYWRlZCBzY2hlbWEgbGlzdAotICAgICAgICBpZiAoIWxvYWRlZFNjaGVtYU1hcC5jb250YWluc0tleShzY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpKSB7Ci0gICAgICAgICAgICBsb2FkZWRTY2hlbWFNYXAucHV0KHNjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2UoKSwgc2NoZW1hKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIElmIHdlIGhhdmUvYXJlIGxvYWRpbmcgYSBzY2hlbWEgd2l0aCBhIHNwZWNpZmljIHRhcmdldG5hbWVzcGFjZSBmcm9tIGEgY2VydGFpbiBVUkksCi0gICAgICAgIC8vIHRoZW4ganVzdCByZXR1cm4gYmFjayB0byB0aGUgY2FsbGVyIHRvIGF2b2lkIHJlY3Vyc2lvbi4KLSAgICAgICAgaWYgKHNjaGVtYS5nZXRTb3VyY2VVUkkoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcga2V5ID0gc2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpICsgIjoiICsgc2NoZW1hLmdldFNvdXJjZVVSSSgpOwotICAgICAgICAgICAgaWYgKGxvYWRlZFNvdXJjZVVSSS5jb250YWluc0tleShrZXkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbG9hZGVkU291cmNlVVJJLnB1dChrZXksIGtleSk7Ci0gICAgICAgIH0KLQotICAgICAgICBYbWxTY2hlbWFPYmplY3RDb2xsZWN0aW9uIGluY2x1ZGVzID0gc2NoZW1hLmdldEluY2x1ZGVzKCk7Ci0gICAgICAgIGlmIChpbmNsdWRlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBJdGVyYXRvciB0ZW1wSXRlcmF0b3IgPSBpbmNsdWRlcy5nZXRJdGVyYXRvcigpOwotICAgICAgICAgICAgd2hpbGUgKHRlbXBJdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBPYmplY3QgbyA9IHRlbXBJdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBYbWxTY2hlbWFJbXBvcnQpIHsKLSAgICAgICAgICAgICAgICAgICAgWG1sU2NoZW1hIHNjaGVtYTEgPSAoKFhtbFNjaGVtYUltcG9ydCkgbykuZ2V0U2NoZW1hKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzY2hlbWExICE9IG51bGwpIGNvbXBpbGUoc2NoZW1hMSwgaXNQYXJ0b2ZHcm91cCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChvIGluc3RhbmNlb2YgWG1sU2NoZW1hSW5jbHVkZSkgewotICAgICAgICAgICAgICAgICAgICBYbWxTY2hlbWEgc2NoZW1hMSA9ICgoWG1sU2NoZW1hSW5jbHVkZSkgbykuZ2V0U2NoZW1hKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzY2hlbWExICE9IG51bGwpIGNvbXBpbGUoc2NoZW1hMSwgaXNQYXJ0b2ZHcm91cCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy9zZWxlY3QgYWxsIHRoZSBlbGVtZW50cy4gV2UgZ2VuZXJhdGUgdGhlIGNvZGUgZm9yIHR5cGVzCi0gICAgICAgIC8vb25seSBpZiB0aGUgZWxlbWVudHMgcmVmZXIgdGhlbSEhISByZWdhcmRsZXNzIG9mIHRoZSBmYWN0IHRoYXQKLSAgICAgICAgLy93ZSBoYXZlIGEgbGlzdCBvZiBlbGVtZW50bmFtZXMsIHdlJ2xsIG5lZWQgdG8gcHJvY2VzcyBhbGwgdGhlIGVsZW1lbnRzCi0gICAgICAgIFhtbFNjaGVtYU9iamVjdFRhYmxlIGVsZW1lbnRzID0gc2NoZW1hLmdldEVsZW1lbnRzKCk7Ci0gICAgICAgIEl0ZXJhdG9yIHhtbFNjaGVtYUVsZW1lbnQxSXRlcmF0b3IgPSBlbGVtZW50cy5nZXRWYWx1ZXMoKTsKLSAgICAgICAgd2hpbGUgKHhtbFNjaGVtYUVsZW1lbnQxSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAvL3RoaXMgaXMgdGhlIHNldCBvZiBvdXRlciBlbGVtZW50cyBzbyB3ZSBuZWVkIHRvIGdlbmVyYXRlIGNsYXNzZXMKLSAgICAgICAgICAgIC8vVGhlIG91dGVybW9zdCBlbGVtZW50cyBkbyBub3QgY29udGFpbiBvY2N1cmVuY2UgY291bnRzICghKSBzbyB3ZSBkbyBub3QgbmVlZAotICAgICAgICAgICAgLy90byBjaGVjayBmb3IgYXJyYXl0eXBlcwotICAgICAgICAgICAgcHJvY2Vzc0VsZW1lbnQoKFhtbFNjaGVtYUVsZW1lbnQpIHhtbFNjaGVtYUVsZW1lbnQxSXRlcmF0b3IubmV4dCgpLCBzY2hlbWEpOwotICAgICAgICB9Ci0KLSAgICAgICAgSXRlcmF0b3IgeG1sU2NoZW1hRWxlbWVudDJJdGVyYXRvciA9IGVsZW1lbnRzLmdldFZhbHVlcygpOwotCi0gICAgICAgIC8vIHJlLWl0ZXJhdGUgdGhyb3VnaCB0aGUgZWxlbWVudHMgYW5kIHdyaXRlIHRoZW0gb25lIGJ5IG9uZQotICAgICAgICAvLyBpZiB0aGUgbW9kZSBpcyB1bnBhY2sgdGhpcyBwcm9jZXNzIHdpbGwgbm90IHJlYWxseSB3cml0ZSB0aGUKLSAgICAgICAgLy8gY2xhc3NlcyBidXQgd2lsbCBhY2N1bWlsYXRlIHRoZSBtb2RlbHMgZm9yIGEgZmluYWwgc2luZ2xlIHNob3QKLSAgICAgICAgLy8gd3JpdGUKLSAgICAgICAgd2hpbGUgKHhtbFNjaGVtYUVsZW1lbnQySXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAvL3RoaXMgaXMgdGhlIHNldCBvZiBvdXRlciBlbGVtZW50cyBzbyB3ZSBuZWVkIHRvIGdlbmVyYXRlIGNsYXNzZXMKLSAgICAgICAgICAgIHdyaXRlRWxlbWVudCgoWG1sU2NoZW1hRWxlbWVudCkgeG1sU2NoZW1hRWxlbWVudDJJdGVyYXRvci5uZXh0KCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG9wdGlvbnMuaXNHZW5lcmF0ZUFsbCgpKSB7Ci0gICAgICAgICAgICBJdGVyYXRvciB4bWxTY2hlbWFUeXBlczJJdGVyYXRvciA9IHNjaGVtYS5nZXRTY2hlbWFUeXBlcygpLmdldFZhbHVlcygpOwotICAgICAgICAgICAgd2hpbGUgKHhtbFNjaGVtYVR5cGVzMkl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIFhtbFNjaGVtYVR5cGUgc2NoZW1hVHlwZSA9IChYbWxTY2hlbWFUeXBlKSB4bWxTY2hlbWFUeXBlczJJdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNBbHJlYWR5UHJvY2Vzc2VkKHNjaGVtYVR5cGUuZ2V0UU5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChzY2hlbWFUeXBlIGluc3RhbmNlb2YgWG1sU2NoZW1hQ29tcGxleFR5cGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy93cml0ZSBjbGFzc2VzIGZvciBjb21wbGV4IHR5cGVzCi0gICAgICAgICAgICAgICAgICAgIFhtbFNjaGVtYUNvbXBsZXhUeXBlIGNvbXBsZXhUeXBlID0gKFhtbFNjaGVtYUNvbXBsZXhUeXBlKSBzY2hlbWFUeXBlOwotICAgICAgICAgICAgICAgICAgICBpZiAoY29tcGxleFR5cGUuZ2V0TmFtZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NOYW1lZENvbXBsZXhTY2hlbWFUeXBlKGNvbXBsZXhUeXBlLCBzY2hlbWEpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzY2hlbWFUeXBlIGluc3RhbmNlb2YgWG1sU2NoZW1hU2ltcGxlVHlwZSkgewotICAgICAgICAgICAgICAgICAgICAvL3Byb2Nlc3Mgc2ltcGxlIHR5cGUKLSAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc1NpbXBsZVNjaGVtYVR5cGUoKFhtbFNjaGVtYVNpbXBsZVR5cGUpIHNjaGVtYVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWEsIG51bGwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICghaXNQYXJ0b2ZHcm91cCkgewotICAgICAgICAgICAgLy9jb21wbGV0ZSB0aGUgY29tcGlsYXRpb24KLSAgICAgICAgICAgIGZpbmFsaXplU2NoZW1hQ29tcGlsYXRpb24oKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbXBsZXRlcyB0aGUgc2NoZW1hIGNvbXBpbGF0aW9uIHByb2Nlc3MgYnkgd3JpdGluZyB0aGUKLSAgICAgKiBtYXBwZXJzIGFuZCB0aGUgY2xhc3NlcyBpbiBhIGJhdGNoIGlmIG5lZWRlZAotICAgICAqCi0gICAgICogQHRocm93cyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBmaW5hbGl6ZVNjaGVtYUNvbXBpbGF0aW9uKCkgdGhyb3dzIFNjaGVtYUNvbXBpbGF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgLy93cml0ZSB0aGUgZXh0ZW5zaW9uIG1hcHBpbmcgY2xhc3MKLSAgICAgICAgd3JpdGVyLndyaXRlRXh0ZW5zaW9uTWFwcGVyKAotICAgICAgICAgICAgICAgIChCZWFuV3JpdGVyTWV0YUluZm9Ib2xkZXJbXSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZFR5cGVNZXRhSW5mb01hcC52YWx1ZXMoKS50b0FycmF5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQmVhbldyaXRlck1ldGFJbmZvSG9sZGVyW3Byb2Nlc3NlZFR5cGVNZXRhSW5mb01hcC5zaXplKCldKSk7Ci0KLQotICAgICAgICBpZiAob3B0aW9ucy5pc1dyYXBDbGFzc2VzKCkpIHsKLSAgICAgICAgICAgIHdyaXRlci53cml0ZUJhdGNoKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyByZXNldHMgdGhlIGNoYW5nZWQgdHlwZXMKLSAgICAgICAgWG1sU2NoZW1hQ29tcGxleFR5cGUgeG1sU2NoZW1hQ29tcGxleFR5cGUgPSBudWxsOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGFuZ2VkQ29tcGxleFR5cGVTZXQuaXRlcmF0b3IoKTtpdGVyLmhhc05leHQoKTspewotICAgICAgICAgICAgeG1sU2NoZW1hQ29tcGxleFR5cGUgPSAoWG1sU2NoZW1hQ29tcGxleFR5cGUpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgeG1sU2NoZW1hQ29tcGxleFR5cGUuc2V0TmFtZShudWxsKTsKLSAgICAgICAgfQotCi0gICAgICAgIFhtbFNjaGVtYVNpbXBsZVR5cGUgeG1sU2NoZW1hU2ltcGxlVHlwZSA9IG51bGw7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGNoYW5nZWRTaW1wbGVUeXBlU2V0Lml0ZXJhdG9yKCk7aXRlci5oYXNOZXh0KCk7KXsKLSAgICAgICAgICAgIHhtbFNjaGVtYVNpbXBsZVR5cGUgPSAoWG1sU2NoZW1hU2ltcGxlVHlwZSkgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICB4bWxTY2hlbWFTaW1wbGVUeXBlLnNldE5hbWUobnVsbCk7Ci0gICAgICAgIH0KLQotICAgICAgICBYbWxTY2hlbWFFbGVtZW50IHhtbFNjaGVtYUVsZW1lbnQgPSBudWxsOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGFuZ2VkRWxlbWVudFNldC5pdGVyYXRvcigpO2l0ZXIuaGFzTmV4dCgpOyl7Ci0gICAgICAgICAgICB4bWxTY2hlbWFFbGVtZW50ID0gKFhtbFNjaGVtYUVsZW1lbnQpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgeG1sU2NoZW1hRWxlbWVudC5zZXRTY2hlbWFUeXBlTmFtZShudWxsKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgcHJvcGVydHkgbWFwIG9mIHRoZSBzY2hlbWFjb21waWxlci4KLSAgICAgKiAgICAgICAgIEluIHRoaXMgY2FzZSBpdCB3b3VsZCBiZSB0aGUgcHJvcGVydHkgbWFwIGxvYWRlZCBmcm9tCi0gICAgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBmaWxlCi0gICAgICovCi0gICAgcHVibGljIFByb3BlcnRpZXMgZ2V0Q29tcGlsZXJQcm9wZXJ0aWVzKCkgewotICAgICAgICByZXR1cm4gU2NoZW1hUHJvcGVydHlMb2FkZXIuZ2V0UHJvcGVydHlNYXAoKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFdyaXRlcyB0aGUgZWxlbWVudAotICAgICAqCi0gICAgICogQHBhcmFtIHhzRWx0Ci0gICAgICogQHRocm93cyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB3cml0ZUVsZW1lbnQoWG1sU2NoZW1hRWxlbWVudCB4c0VsdCkgdGhyb3dzIFNjaGVtYUNvbXBpbGF0aW9uRXhjZXB0aW9uIHsKLQotICAgICAgICBpZiAodGhpcy5wcm9jZXNzZWRFbGVtZW50TWFwLmNvbnRhaW5zS2V5KHhzRWx0LmdldFFOYW1lKCkpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBYbWxTY2hlbWFUeXBlIHNjaGVtYVR5cGUgPSB4c0VsdC5nZXRTY2hlbWFUeXBlKCk7Ci0KLSAgICAgICAgQmVhbldyaXRlck1ldGFJbmZvSG9sZGVyIG1ldGFpbmYgPSBuZXcgQmVhbldyaXRlck1ldGFJbmZvSG9sZGVyKCk7Ci0gICAgICAgIGlmIChzY2hlbWFUeXBlICE9IG51bGwgJiYgc2NoZW1hVHlwZS5nZXROYW1lKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgLy90aGlzIGlzIGEgbmFtZWQgdHlwZQotICAgICAgICAgICAgUU5hbWUgcU5hbWUgPSBzY2hlbWFUeXBlLmdldFFOYW1lKCk7Ci0gICAgICAgICAgICAvL2ZpbmQgdGhlIGNsYXNzIG5hbWUKLSAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBmaW5kQ2xhc3NOYW1lKHFOYW1lLCBpc0FycmF5KHhzRWx0KSk7Ci0KLSAgICAgICAgICAgIC8vdGhpcyBtZWFucyB0aGUgc2NoZW1hIHR5cGUgYWN0dWFsbHkgcmV0dXJucyBhIGRpZmZlcmVudCBRTmFtZQotICAgICAgICAgICAgaWYgKGNoYW5nZWRUeXBlTWFwLmNvbnRhaW5zS2V5KHFOYW1lKSkgewotICAgICAgICAgICAgICAgIG1ldGFpbmYucmVnaXN0ZXJNYXBwaW5nKHhzRWx0LmdldFFOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAoUU5hbWUpIGNoYW5nZWRUeXBlTWFwLmdldChxTmFtZSksCi0gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtZXRhaW5mLnJlZ2lzdGVyTWFwcGluZyh4c0VsdC5nZXRRTmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgcU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyByZWdpc3RlciB0aGUgZGVmYXVsdCB2YWx1ZSBpZiBwcmVzZW50Ci0gICAgICAgICAgICBpZiAoeHNFbHQuZ2V0RGVmYXVsdFZhbHVlKCkgIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgbWV0YWluZi5yZWdpc3RlckRlZmF1bHRWYWx1ZSh4c0VsdC5nZXRRTmFtZSgpLHhzRWx0LmdldERlZmF1bHRWYWx1ZSgpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGlzQmluYXJ5KHhzRWx0KSkgewotICAgICAgICAgICAgICAgIG1ldGFpbmYuYWRkdFN0YXR1cyh4c0VsdC5nZXRRTmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYUNvbnN0YW50cy5CSU5BUllfVFlQRSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBlbHNlIGlmICh4c0VsdC5nZXRSZWZOYW1lKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gU2luY2UgdG9wIGxldmVsIGVsZW1lbnRzIHdvdWxkIG5vdCBoYXZlIHJlZmVyZW5jZXMKLSAgICAgICAgICAgIC8vIGFuZCB3ZSBvbmx5IHdyaXRlIHRvcGxldmVsIGVsZW1lbnRzLCB0aGlzIHNob3VsZAotICAgICAgICAgICAgLy8gbm90IGJlIGEgcHJvYmxlbSAsIGF0bGVhc3Qgc2hvdWxkIG5vdCBvY2N1ciBpbiBhIGxlZ2FsIHNjaGVtYQotICAgICAgICB9IGVsc2UgaWYgKHhzRWx0LmdldFNjaGVtYVR5cGVOYW1lKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgUU5hbWUgcU5hbWUgPSB4c0VsdC5nZXRTY2hlbWFUeXBlTmFtZSgpOwotICAgICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IGZpbmRDbGFzc05hbWUocU5hbWUsIGlzQXJyYXkoeHNFbHQpKTsKLSAgICAgICAgICAgIG1ldGFpbmYucmVnaXN0ZXJNYXBwaW5nKHhzRWx0LmdldFFOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgIHFOYW1lLAotICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUpOwotCi0KLSAgICAgICAgfSBlbHNlIGlmIChzY2hlbWFUeXBlICE9IG51bGwpIHsgIC8vdGhlIG5hbWVkIHR5cGUgc2hvdWxkIGhhdmUgYmVlbiBoYW5kbGVkIGFscmVhZHkKLQotICAgICAgICAgICAgLy93ZSBhcmUgZ29pbmcgdG8gc3BlY2lhbCBjYXNlIHRoZSBhbm9ueW1vdXMgY29tcGxleCB0eXBlLiBPdXIgYWxnb3JpdGhtIGZvciBkZWFsaW5nCi0gICAgICAgICAgICAvL3dpdGggaXQgaXMgdG8gZ2VuZXJhdGUgYSBzaW5nbGUgb2JqZWN0IHRoYXQgaGFzIHRoZSBjb21wbGV4IGNvbnRlbnQgaW5zaWRlLiBSZWFsbHkgdGhlCi0gICAgICAgICAgICAvL2ludGVudCBvZiB0aGUgdXNlciB3aGVuIGhlIGRlY2xhcmVzIHRoZSBjb21wbGV4VHlwZSBhbm9ueW1vdXNseSBpcyB0byB1c2UgaXQgcHJpdmF0ZWx5Ci0gICAgICAgICAgICAvL0ZpcnN0IGNvcHkgdGhlIHNjaGVtYSB0eXBlcyBjb250ZW50IGludG8gdGhlIG1ldGFpbmYgaG9sZGVyCi0gICAgICAgICAgICBtZXRhaW5mID0gKEJlYW5Xcml0ZXJNZXRhSW5mb0hvbGRlcikgdGhpcy5wcm9jZXNzZWRBbm9ueW1vdXNDb21wbGV4VHlwZXNNYXAuZ2V0KHhzRWx0KTsKLSAgICAgICAgICAgIG1ldGFpbmYuc2V0QW5vbnltb3VzKHRydWUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy90aGlzIG1lYW5zIHdlIGRpZCBub3QgZmluZCBhbnkgc2NoZW1hIHR5cGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBwYXJ0aWN1bGFyIGVsZW1lbnQuCi0gICAgICAgICAgICBsb2cud2FybihTY2hlbWFDb21waWxlck1lc3NhZ2VzLmdldE1lc3NhZ2UoInNjaGVtYS5lbGVtZW50V2l0aE5vVHlwZSIsIHhzRWx0LmdldFFOYW1lKCkudG9TdHJpbmcoKSkpOwotICAgICAgICAgICAgbWV0YWluZi5yZWdpc3Rlck1hcHBpbmcoeHNFbHQuZ2V0UU5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVyLmdldERlZmF1bHRDbGFzc05hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgU2NoZW1hQ29uc3RhbnRzLkFOWV9UWVBFKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChuaWxsYWJsZUVsZW1lbnRMaXN0LmNvbnRhaW5zKHhzRWx0LmdldFFOYW1lKCkpKSB7Ci0gICAgICAgICAgICBtZXRhaW5mLnJlZ2lzdGVyTmlsbGFibGVRTmFtZSh4c0VsdC5nZXRRTmFtZSgpKTsKLSAgICAgICAgfQotCi0KLSAgICAgICAgU3RyaW5nIHdyaXR0ZW5DbGFzc05hbWUgPSB3cml0ZXIud3JpdGUoeHNFbHQsIHByb2Nlc3NlZFR5cGVtYXAsIHByb2Nlc3NlZEdyb3VwVHlwZU1hcCwgbWV0YWluZik7Ci0gICAgICAgIC8vcmVnaXN0ZXIgdGhlIGNsYXNzIG5hbWUKLSAgICAgICAgeHNFbHQuYWRkTWV0YUluZm8oU2NoZW1hQ29uc3RhbnRzLlNjaGVtYUNvbXBpbGVySW5mb0hvbGRlci5DTEFTU05BTUVfS0VZLCB3cml0dGVuQ2xhc3NOYW1lKTsKLSAgICAgICAgcHJvY2Vzc2VkRWxlbWVudE1hcC5wdXQoeHNFbHQuZ2V0UU5hbWUoKSwgd3JpdHRlbkNsYXNzTmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRm9yIGlubmVyIGVsZW1lbnRzCi0gICAgICoKLSAgICAgKiBAcGFyYW0geHNFbHQKLSAgICAgKiBAcGFyYW0gaW5uZXJFbGVtZW50TWFwCi0gICAgICogQHBhcmFtIHBhcmVudFNjaGVtYQotICAgICAqIEB0aHJvd3MgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0VsZW1lbnQoWG1sU2NoZW1hRWxlbWVudCB4c0VsdCwgTWFwIGlubmVyRWxlbWVudE1hcCwgTGlzdCBsb2NhbE5pbGxhYmxlTGlzdCwgWG1sU2NoZW1hIHBhcmVudFNjaGVtYSkgdGhyb3dzIFNjaGVtYUNvbXBpbGF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgcHJvY2Vzc0VsZW1lbnQoeHNFbHQsIGZhbHNlLCBpbm5lckVsZW1lbnRNYXAsIGxvY2FsTmlsbGFibGVMaXN0LCBwYXJlbnRTY2hlbWEpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZvciBvdXRlciBlbGVtZW50cwotICAgICAqCi0gICAgICogQHBhcmFtIHhzRWx0Ci0gICAgICogQHBhcmFtIHBhcmVudFNjaGVtYQotICAgICAqIEB0aHJvd3MgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0VsZW1lbnQoWG1sU2NoZW1hRWxlbWVudCB4c0VsdCwgWG1sU2NoZW1hIHBhcmVudFNjaGVtYSkgdGhyb3dzIFNjaGVtYUNvbXBpbGF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgcHJvY2Vzc0VsZW1lbnQoeHNFbHQsIHRydWUsIG51bGwsIG51bGwsIHBhcmVudFNjaGVtYSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJvY2VzcyBhbmQgRWxlbWVudAotICAgICAqCi0gICAgICogQHBhcmFtIHhzRWx0Ci0gICAgICogQHBhcmFtIGlzT3V0ZXIgV2UgbmVlZCB0byBrbm93IHRoaXMgc2luY2UgdGhlIHRyZWF0bWVudCBvZiBvdXRlciBlbGVtZW50cyBpcyBkaWZmZXJlbnQgdGhhdAotICAgICAqICAgICAgICAgICAgICAgIGlubmVyIGVsZW1lbnRzCi0gICAgICogQHRocm93cyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzRWxlbWVudChYbWxTY2hlbWFFbGVtZW50IHhzRWx0LCBib29sZWFuIGlzT3V0ZXIsIE1hcCBpbm5lckVsZW1lbnRNYXAsIExpc3QgbG9jYWxOaWxsYWJsZUxpc3QsIFhtbFNjaGVtYSBwYXJlbnRTY2hlbWEpIHRocm93cyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgLy9pZiB0aGUgZWxlbWVudCBpcyBudWxsLCB3aGljaCB1c3VhbGx5IGhhcHBlbnMgd2hlbiB0aGUgcW5hbWUgaXMgbm90Ci0gICAgICAgIC8vcHJvcGVyLCB0aHJvdyBhbiBleGNlcHRpb25zCi0gICAgICAgIGlmICh4c0VsdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIFNjaGVtYUNvbXBpbGVyTWVzc2FnZXMuZ2V0TWVzc2FnZSgic2NoZW1hLmVsZW1lbnROdWxsIikpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy9UaGUgcHJvY2Vzc2luZyBlbGVtZW50IGxvZ2ljIHNlZW1zIHRvIGJlIHF1aXRlIHNpbXBsZS4gTG9vayBhdCB0aGUgcmVsZXZhbnQgc2NoZW1hIHR5cGUKLSAgICAgICAgLy9mb3IgZWFjaCBhbmQgZXZlcnkgZWxlbWVudCBhbmQgcHJvY2VzcyB0aGF0IGFjY29yZGluZ2x5LgotICAgICAgICAvL3RoaXMgbWVhbnMgdGhhdCBhbnkgdW51c2VkIHR5cGUgZGVmaW5pdGlvbnMgd291bGQgbm90IGJlIGdlbmVyYXRlZCEKLSAgICAgICAgaWYgKGlzT3V0ZXIgJiYgcHJvY2Vzc2VkRWxlbWVudExpc3QuY29udGFpbnMoeHNFbHQuZ2V0UU5hbWUoKSkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIFhtbFNjaGVtYVR5cGUgc2NoZW1hVHlwZSA9IHhzRWx0LmdldFNjaGVtYVR5cGUoKTsKLSAgICAgICAgaWYgKHNjaGVtYVR5cGUgIT0gbnVsbCkgewotICAgICAgICAgICAgcHJvY2Vzc1NjaGVtYSh4c0VsdCwgc2NoZW1hVHlwZSwgcGFyZW50U2NoZW1hLCBmYWxzZSk7Ci0gICAgICAgICAgICAvL2F0IHRoaXMgdGltZSBpdCBpcyBub3Qgd2lzZSB0byBkaXJlY3RseSB3cml0ZSB0aGUgY2xhc3MgZm9yIHRoZSBlbGVtZW50Ci0gICAgICAgICAgICAvL3NvIHdlIHB1c2ggdGhlIGNvbXBsZXRlIGVsZW1lbnQgdG8gYW4gYXJyYXlsaXN0IGFuZCBsZXQgdGhlIHByb2Nlc3MKLSAgICAgICAgICAgIC8vcGFzcyB0aHJvdWdoLiBXZSdsbCBiZSBpdGVyYXRpbmcgdGhyb3VnaCB0aGUgZWxlbWVudHMgd3JpdGluZyB0aGVtCi0gICAgICAgICAgICAvL2xhdGVyCi0KLSAgICAgICAgICAgIGlmICghaXNPdXRlcikgewotICAgICAgICAgICAgICAgIGlmIChzY2hlbWFUeXBlLmdldE5hbWUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgZWxlbWVudCBhbHJlYWR5IGhhcyBhIG5hbWUuIFdoaWNoIG1lYW5zIHdlIGNhbiBkaXJlY3RseQotICAgICAgICAgICAgICAgICAgICAvLyByZWdpc3RlciBpdAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gZmluZENsYXNzTmFtZShzY2hlbWFUeXBlLmdldFFOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNBcnJheSh4c0VsdCkpOwotCi0gICAgICAgICAgICAgICAgICAgIGlubmVyRWxlbWVudE1hcC5wdXQoeHNFbHQuZ2V0UU5hbWUoKSwgY2xhc3NOYW1lKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBhbHdheXMgc3RvcmUgdGhlIGNsYXNzIG5hbWUgaW4gdGhlIGVsZW1lbnQgbWV0YSBJbmZvIGl0c2VsZgotICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGRldGFpbHMgb25seSBuZWVkZWQgYnkgdGhlIHVud3JhcHBpZyB0byBzZXQgdGhlIGNvbXBsZXggdHlwZQotICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5pc1VzZVdyYXBwZXJDbGFzc2VzKCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmltaXRpdmVUeXBlRmluZGVyLmlzUHJpbWl0aXZlKGNsYXNzTmFtZSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHhzRWx0LmdldE1pbk9jY3VycygpID09IDApIHx8ICh4c0VsdC5pc05pbGxhYmxlKCkpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSBQcmltaXRpdmVUeXBlV3JhcHBlci5nZXRXcmFwcGVyKGNsYXNzTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc2NoZW1hVHlwZS5hZGRNZXRhSW5mbyhTY2hlbWFDb25zdGFudHMuU2NoZW1hQ29tcGlsZXJJbmZvSG9sZGVyLkNMQVNTTkFNRV9LRVksIGNsYXNzTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhzRWx0LmFkZE1ldGFJbmZvKFNjaGVtYUNvbnN0YW50cy5TY2hlbWFDb21waWxlckluZm9Ib2xkZXIuQ0xBU1NOQU1FX0tFWSwgY2xhc3NOYW1lKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoYmFzZVNjaGVtYVR5cGVNYXAuY29udGFpbnNWYWx1ZShjbGFzc05hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWFUeXBlLmFkZE1ldGFJbmZvKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFDb25zdGFudHMuU2NoZW1hQ29tcGlsZXJJbmZvSG9sZGVyLkNMQVNTTkFNRV9QUklNSVRWRV9LRVksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy9zaW5jZSB0aGlzIGlzIGEgaW5uZXIgZWxlbWVudCB3ZSBzaG91bGQgYWRkIGl0IHRvIHRoZSBpbm5lciBlbGVtZW50IG1hcAotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vdGhpcyBpcyBhbiBhbm9uIHR5cGUuIFRoaXMgc2hvdWxkIGhhdmUgYmVlbiBhbHJlYWR5IHByb2Nlc3NlZCBhbmQgcmVnaXN0ZXJlZCBhdAotICAgICAgICAgICAgICAgICAgICAvL3RoZSBhbm9uIG1hcC4gd2UndmUgdG8gd3JpdGUgaXQganVzdCBsaWtlIHdlIHRyZWF0IGEgcmVmZXJlbmNlZCB0eXBlKGdpdmluZyBkdWUKLSAgICAgICAgICAgICAgICAgICAgLy9jYXJlIHRoYXQgdGhpcyBpcyBtZWFudCB0byBiZSBhbiBhdHRyaWJ1dGUgaW4gc29tZSBjbGFzcykKLQotICAgICAgICAgICAgICAgICAgICBRTmFtZSBnZW5lcmF0ZWRUeXBlTmFtZSA9IGdlbmVyYXRlVHlwZVFOYW1lKHhzRWx0LmdldFFOYW1lKCksIHBhcmVudFNjaGVtYSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHNjaGVtYVR5cGUgaW5zdGFuY2VvZiBYbWxTY2hlbWFDb21wbGV4VHlwZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy9zZXQgYSBuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWFUeXBlLnNldE5hbWUoZ2VuZXJhdGVkVHlwZU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlZENvbXBsZXhUeXBlU2V0LmFkZChzY2hlbWFUeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIE11c3QgZG8gdGhpcyB1cCBmcm9udCB0byBzdXBwb3J0IHJlY3Vyc2l2ZSB0eXBlcwotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lID0gd3JpdGVyLm1ha2VGdWxseVF1YWxpZmllZENsYXNzTmFtZShzY2hlbWFUeXBlLmdldFFOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2VkVHlwZW1hcC5wdXQoc2NoZW1hVHlwZS5nZXRRTmFtZSgpLCBmdWxseVF1YWxpZmllZENsYXNzTmFtZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIEJlYW5Xcml0ZXJNZXRhSW5mb0hvbGRlciBtZXRhSW5mSG9sZGVyID0gKEJlYW5Xcml0ZXJNZXRhSW5mb0hvbGRlcikgcHJvY2Vzc2VkQW5vbnltb3VzQ29tcGxleFR5cGVzTWFwLmdldCh4c0VsdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZXRhSW5mSG9sZGVyLnNldE93blFuYW1lKHNjaGVtYVR5cGUuZ2V0UU5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZXRhSW5mSG9sZGVyLnNldE93bkNsYXNzTmFtZShmdWxseVF1YWxpZmllZENsYXNzTmFtZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQ29tcGxleFR5cGUoKFhtbFNjaGVtYUNvbXBsZXhUeXBlKSBzY2hlbWFUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhSW5mSG9sZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vcmVtb3ZlIHRoZSByZWZlcmVuY2UgZnJvbSB0aGUgYW5vbiBsaXN0IHNpbmNlIHdlIG5hbWVkIHRoZSB0eXBlCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzZWRBbm9ueW1vdXNDb21wbGV4VHlwZXNNYXAucmVtb3ZlKHhzRWx0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBmaW5kQ2xhc3NOYW1lKHNjaGVtYVR5cGUuZ2V0UU5hbWUoKSwgaXNBcnJheSh4c0VsdCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaW5uZXJFbGVtZW50TWFwLnB1dCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeHNFbHQuZ2V0UU5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy9zdG9yZSBpbiB0aGUgc2NoZW1hIG1hcCB0byByZXRyaXZlIGluIHRoZSB1bndyYXBwaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICB4c0VsdC5hZGRNZXRhSW5mbygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hQ29uc3RhbnRzLlNjaGVtYUNvbXBpbGVySW5mb0hvbGRlci5DTEFTU05BTUVfS0VZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNjaGVtYVR5cGUgaW5zdGFuY2VvZiBYbWxTY2hlbWFTaW1wbGVUeXBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL3NldCBhIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYVR5cGUuc2V0TmFtZShnZW5lcmF0ZWRUeXBlTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkU2ltcGxlVHlwZVNldC5hZGQoc2NoZW1hVHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBNdXN0IGRvIHRoaXMgdXAgZnJvbnQgdG8gc3VwcG9ydCByZWN1cnNpdmUgdHlwZXMKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBmdWxseVF1YWxpZmllZENsYXNzTmFtZSA9IHdyaXRlci5tYWtlRnVsbHlRdWFsaWZpZWRDbGFzc05hbWUoc2NoZW1hVHlwZS5nZXRRTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZFR5cGVtYXAucHV0KHNjaGVtYVR5cGUuZ2V0UU5hbWUoKSwgZnVsbHlRdWFsaWZpZWRDbGFzc05hbWUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBCZWFuV3JpdGVyTWV0YUluZm9Ib2xkZXIgbWV0YUluZkhvbGRlciA9IChCZWFuV3JpdGVyTWV0YUluZm9Ib2xkZXIpIHByb2Nlc3NlZEFub255bW91c0NvbXBsZXhUeXBlc01hcC5nZXQoeHNFbHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgbWV0YUluZkhvbGRlci5zZXRPd25RbmFtZShzY2hlbWFUeXBlLmdldFFOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgbWV0YUluZkhvbGRlci5zZXRPd25DbGFzc05hbWUoZnVsbHlRdWFsaWZpZWRDbGFzc05hbWUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICB3cml0ZVNpbXBsZVR5cGUoKFhtbFNjaGVtYVNpbXBsZVR5cGUpIHNjaGVtYVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFJbmZIb2xkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgLy9yZW1vdmUgdGhlIHJlZmVyZW5jZSBmcm9tIHRoZSBhbm9uIGxpc3Qgc2luY2Ugd2UgbmFtZWQgdGhlIHR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZEFub255bW91c0NvbXBsZXhUeXBlc01hcC5yZW1vdmUoeHNFbHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IGZpbmRDbGFzc05hbWUoc2NoZW1hVHlwZS5nZXRRTmFtZSgpLCBpc0FycmF5KHhzRWx0KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbm5lckVsZW1lbnRNYXAucHV0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4c0VsdC5nZXRRTmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvL3N0b3JlIGluIHRoZSBzY2hlbWEgbWFwCi0gICAgICAgICAgICAgICAgICAgICAgICB4c0VsdC5hZGRNZXRhSW5mbygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hQ29uc3RhbnRzLlNjaGVtYUNvbXBpbGVySW5mb0hvbGRlci5DTEFTU05BTUVfS0VZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBzZXQgdGhlIGJpbmFyeSBzdGF0dXMgb2YgdGhpcyBlbGVtZW50Ci0gICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzZWRFbGVtZW50TGlzdC5hZGQoeHNFbHQuZ2V0UU5hbWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvL3JlZmVyZW5jZWQgbmFtZQotICAgICAgICB9IGVsc2UgaWYgKHhzRWx0LmdldFJlZk5hbWUoKSAhPSBudWxsKSB7Ci0KLSAgICAgICAgICAgIGlmICh4c0VsdC5nZXRSZWZOYW1lKCkuZXF1YWxzKFNjaGVtYUNvbnN0YW50cy5YU0RfU0NIRU1BKSkgewotICAgICAgICAgICAgICAgIGlubmVyRWxlbWVudE1hcC5wdXQoeHNFbHQuZ2V0UU5hbWUoKSwgd3JpdGVyLmdldERlZmF1bHRDbGFzc05hbWUoKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy9wcm9jZXNzIHRoZSByZWZlcmVuY2VkIHR5cGUuIEl0IGNvdWxkIGJlIHRob3VnaHQgdGhhdCB0aGUgcmVmZXJlbmNlZCBlbGVtZW50IHJlcGxhY2VzIHRoaXMKLSAgICAgICAgICAgIC8vZWxlbWVudAotICAgICAgICAgICAgWG1sU2NoZW1hIHJlc29sdmVkU2NoZW1hID0gZ2V0UGFyZW50U2NoZW1hKHBhcmVudFNjaGVtYSx4c0VsdC5nZXRSZWZOYW1lKCksQ09NUE9ORU5UX0VMRU1FTlQpOwotICAgICAgICAgICAgaWYgKHJlc29sdmVkU2NoZW1hID09IG51bGwpewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbigiY2FuIG5vdCBmaW5kIHRoZSBlbGVtZW50ICIgKyB4c0VsdC5nZXRSZWZOYW1lKCkKLSAgICAgICAgICAgICAgICAgKyAiIGZyb20gdGhlIHBhcmVudCBzY2hlbWEgIiArIHBhcmVudFNjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBYbWxTY2hlbWFFbGVtZW50IHJlZmVyZW5jZWRFbGVtZW50ID0gcmVzb2x2ZWRTY2hlbWEuZ2V0RWxlbWVudEJ5TmFtZSh4c0VsdC5nZXRSZWZOYW1lKCkpOwotICAgICAgICAgICAgaWYgKHJlZmVyZW5jZWRFbGVtZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFDb21waWxlck1lc3NhZ2VzLmdldE1lc3NhZ2UoInNjaGVtYS5yZWZlcmVuY2VkRWxlbWVudE5vdEZvdW5kIiwgeHNFbHQuZ2V0UmVmTmFtZSgpLnRvU3RyaW5nKCkpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gaGVyZSB3aGF0IHdlIHdhbnQgaXMgdG8gc2V0IHRoZSBzY2hlbWEgdHlwZSBuYW1lIGZvciB0aGUgZWxlbWVudAotICAgICAgICAgICAgaWYgKChyZWZlcmVuY2VkRWxlbWVudC5nZXRTY2hlbWFUeXBlKCkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgJiYgKHJlZmVyZW5jZWRFbGVtZW50LmdldFNjaGVtYVR5cGUoKS5nZXRRTmFtZSgpICE9IG51bGwpKXsKLSAgICAgICAgICAgICAgICAvLyBpLmUgdGhpcyBlbGVtZW50IHJlZmVycyB0byBhbiBjb21wbGV4IHR5cGUgbmFtZQotICAgICAgICAgICAgICAgIGlmICghdGhpcy5wcm9jZXNzZWRFbGVtZW50UmVmTWFwLmNvbnRhaW5zS2V5KHJlZmVyZW5jZWRFbGVtZW50LmdldFFOYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmJhc2VTY2hlbWFUeXBlTWFwLmNvbnRhaW5zS2V5KHJlZmVyZW5jZWRFbGVtZW50LmdldFNjaGVtYVR5cGVOYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NlZEVsZW1lbnRSZWZNYXAucHV0KHJlZmVyZW5jZWRFbGVtZW50LmdldFFOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYmFzZVNjaGVtYVR5cGVNYXAuZ2V0KHJlZmVyZW5jZWRFbGVtZW50LmdldFNjaGVtYVR5cGVOYW1lKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFhtbFNjaGVtYSByZXNvbHZlZFR5cGVTY2hlbWEgPSBnZXRQYXJlbnRTY2hlbWEocmVzb2x2ZWRTY2hlbWEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZWRFbGVtZW50LmdldFNjaGVtYVR5cGVOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTVBPTkVOVF9UWVBFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFhtbFNjaGVtYVR5cGUgeG1sU2NoZW1hVHlwZSA9IHJlc29sdmVkVHlwZVNjaGVtYS5nZXRUeXBlQnlOYW1lKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2VkRWxlbWVudC5nZXRTY2hlbWFUeXBlTmFtZSgpLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NTY2hlbWEocmVmZXJlbmNlZEVsZW1lbnQsIHhtbFNjaGVtYVR5cGUsIHJlc29sdmVkVHlwZVNjaGVtYSwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NlZEVsZW1lbnRSZWZNYXAucHV0KHJlZmVyZW5jZWRFbGVtZW50LmdldFFOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc2VkVHlwZW1hcC5nZXQocmVmZXJlbmNlZEVsZW1lbnQuZ2V0U2NoZW1hVHlwZU5hbWUoKSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFN0cmluZyBqYXZhQ2xhc3NOYW1lOwotICAgICAgICAgICAgICAgIGlmICh0aGlzLmJhc2VTY2hlbWFUeXBlTWFwLmNvbnRhaW5zS2V5KHJlZmVyZW5jZWRFbGVtZW50LmdldFNjaGVtYVR5cGVOYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGhlcmUgd2UgaGF2ZSB0byBkbyBub3RoaW5nIHNpbmNlIHdlIGRvIG5vdCBnZW5lcmF0ZSBhIG5hbWUKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBqYXZhQ2xhc3NOYW1lID0gKFN0cmluZykgdGhpcy5wcm9jZXNzZWRUeXBlbWFwLmdldChyZWZlcmVuY2VkRWxlbWVudC5nZXRTY2hlbWFUeXBlTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlZEVsZW1lbnQuYWRkTWV0YUluZm8oU2NoZW1hQ29uc3RhbnRzLlNjaGVtYUNvbXBpbGVySW5mb0hvbGRlci5DTEFTU05BTUVfS0VZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmFDbGFzc05hbWUpOwotICAgICAgICAgICAgICAgICAgICB4c0VsdC5hZGRNZXRhSW5mbyhTY2hlbWFDb25zdGFudHMuU2NoZW1hQ29tcGlsZXJJbmZvSG9sZGVyLkNMQVNTTkFNRV9LRVksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YUNsYXNzTmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChyZWZlcmVuY2VkRWxlbWVudC5nZXRTY2hlbWFUeXBlKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmICghdGhpcy5wcm9jZXNzZWRFbGVtZW50UmVmTWFwLmNvbnRhaW5zS2V5KHJlZmVyZW5jZWRFbGVtZW50LmdldFFOYW1lKCkpKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc1NjaGVtYShyZWZlcmVuY2VkRWxlbWVudCwgcmVmZXJlbmNlZEVsZW1lbnQuZ2V0U2NoZW1hVHlwZSgpLCByZXNvbHZlZFNjaGVtYSwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoaXMgaXMgYW4gYW5vbm9tb3VzIGNvbXBsZXggdHlwZSB3ZSBoYXZlIHRvIHNldCB0aGlzCi0gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc2VkRWxlbWVudFJlZk1hcC5wdXQocmVmZXJlbmNlZEVsZW1lbnQuZ2V0UU5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NlZFR5cGVtYXAuZ2V0KHJlZmVyZW5jZWRFbGVtZW50LmdldFNjaGVtYVR5cGVOYW1lKCkpKTsKLQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBTdHJpbmcgamF2YUNsYXNzTmFtZSA9IChTdHJpbmcpIHRoaXMucHJvY2Vzc2VkVHlwZW1hcC5nZXQocmVmZXJlbmNlZEVsZW1lbnQuZ2V0U2NoZW1hVHlwZU5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgcmVmZXJlbmNlZEVsZW1lbnQuYWRkTWV0YUluZm8oU2NoZW1hQ29uc3RhbnRzLlNjaGVtYUNvbXBpbGVySW5mb0hvbGRlci5DTEFTU05BTUVfS0VZLAotICAgICAgICAgICAgICAgICAgICAgICAgamF2YUNsYXNzTmFtZSk7Ci0gICAgICAgICAgICAgICAgeHNFbHQuYWRkTWV0YUluZm8oU2NoZW1hQ29uc3RhbnRzLlNjaGVtYUNvbXBpbGVySW5mb0hvbGRlci5DTEFTU05BTUVfS0VZLAotICAgICAgICAgICAgICAgICAgICAgICAgamF2YUNsYXNzTmFtZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHNjaGVtYSB0eXBlIG5hbWUgaXMgcHJlc2VudCBidXQgbm90IHRoZSBzY2hlbWEgdHlwZSBvYmplY3QKLSAgICAgICAgfSBlbHNlIGlmICh4c0VsdC5nZXRTY2hlbWFUeXBlTmFtZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vVGhlcmUgY2FuIGJlIGluc3RhbmNlcyB3aGVyZSB0aGUgU2NoZW1hVHlwZSBpcyBudWxsIGJ1dCB0aGUgc2NoZW1hVHlwZU5hbWUgaXMgbm90IQotICAgICAgICAgICAgLy90aGlzIHNwZWNpZmljYWxseSBoYXBwZW5zIHdpdGggeHNkOmFueVR5cGUuCi0gICAgICAgICAgICBRTmFtZSBzY2hlbWFUeXBlTmFtZSA9IHhzRWx0LmdldFNjaGVtYVR5cGVOYW1lKCk7Ci0KLSAgICAgICAgICAgIFhtbFNjaGVtYSByZXNvbHZlZFNjaGVtYSA9IGdldFBhcmVudFNjaGVtYShwYXJlbnRTY2hlbWEsc2NoZW1hVHlwZU5hbWUsQ09NUE9ORU5UX1RZUEUpOwotICAgICAgICAgICAgWG1sU2NoZW1hVHlwZSB0eXBlQnlOYW1lID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChyZXNvbHZlZFNjaGVtYSAhPSBudWxsKXsKLSAgICAgICAgICAgICAgIHR5cGVCeU5hbWUgPSByZXNvbHZlZFNjaGVtYS5nZXRUeXBlQnlOYW1lKHNjaGVtYVR5cGVOYW1lKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHR5cGVCeU5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vdGhpcyB0eXBlIGlzIGZvdW5kIGluIHRoZSBzY2hlbWEgc28gd2UgY2FuIHByb2Nlc3MgaXQKLSAgICAgICAgICAgICAgICBwcm9jZXNzU2NoZW1hKHhzRWx0LCB0eXBlQnlOYW1lLCByZXNvbHZlZFNjaGVtYSwgZmFsc2UpOwotICAgICAgICAgICAgICAgIGlmICghaXNPdXRlcikgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gZmluZENsYXNzTmFtZShzY2hlbWFUeXBlTmFtZSwgaXNBcnJheSh4c0VsdCkpOwotICAgICAgICAgICAgICAgICAgICAvL3NpbmNlIHRoaXMgaXMgYSBpbm5lciBlbGVtZW50IHdlIHNob3VsZCBhZGQgaXQgdG8gdGhlIGlubmVyIGVsZW1lbnQgbWFwCi0gICAgICAgICAgICAgICAgICAgIGlubmVyRWxlbWVudE1hcC5wdXQoeHNFbHQuZ2V0UU5hbWUoKSwgY2xhc3NOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gc2V0IHRoZSBjbGFzcyBuYW1lIHRvIGJlIHVzZWQgaW4gdW53cmFwcGluZwotICAgICAgICAgICAgICAgICAgICB4c0VsdC5hZGRNZXRhSW5mbyhTY2hlbWFDb25zdGFudHMuU2NoZW1hQ29tcGlsZXJJbmZvSG9sZGVyLkNMQVNTTkFNRV9LRVksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzZWRFbGVtZW50TGlzdC5hZGQoeHNFbHQuZ2V0UU5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvL3RoaXMgdHlwZSBpcyBub3QgZm91bmQgYXQgYWxsLiB3ZSdsbCBqdXN0IHJlZ2lzdGVyIGl0IHdpdGggd2hhdGV2ZXIgdGhlIGNsYXNzIG5hbWUgd2UgY2FuIGNvbWV1cCB3aXRoCi0gICAgICAgICAgICAgICAgaWYgKCFpc091dGVyKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBmaW5kQ2xhc3NOYW1lKHNjaGVtYVR5cGVOYW1lLCBpc0FycmF5KHhzRWx0KSk7Ci0gICAgICAgICAgICAgICAgICAgIGlubmVyRWxlbWVudE1hcC5wdXQoeHNFbHQuZ2V0UU5hbWUoKSwgY2xhc3NOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gc2V0IHRoZSBjbGFzcyBuYW1lIHRvIGJlIHVzZWQgaW4gdW53cmFwcGluZwotICAgICAgICAgICAgICAgICAgICB4c0VsdC5hZGRNZXRhSW5mbyhTY2hlbWFDb25zdGFudHMuU2NoZW1hQ29tcGlsZXJJbmZvSG9sZGVyLkNMQVNTTkFNRV9LRVksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzZWRFbGVtZW50TGlzdC5hZGQoeHNFbHQuZ2V0UU5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy9hZGQgdGhpcyBlbGVtZW50cyBRTmFtZSB0byB0aGUgbmlsbGFibGUgZ3JvdXAgaWYgaXQgaGFzIHRoZSAgbmlsbGFibGUgYXR0cmlidXRlCi0gICAgICAgIGlmICh4c0VsdC5pc05pbGxhYmxlKCkpIHsKLSAgICAgICAgICAgIGlmIChpc091dGVyKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5uaWxsYWJsZUVsZW1lbnRMaXN0LmFkZCh4c0VsdC5nZXRRTmFtZSgpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbG9jYWxOaWxsYWJsZUxpc3QuYWRkKHhzRWx0LmdldFFOYW1lKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZW5lcmF0ZSBhIHVuaXF1ZSB0eXBlIFFuYW1lIHVzaW5nIGFuIGVsZW1lbnQgbmFtZQotICAgICAqCi0gICAgICogQHBhcmFtIHJlZmVyZW5jZUVsdFFOYW1lCi0gICAgICogQHBhcmFtIHBhcmVudFNjaGVtYQotICAgICAqLwotICAgIHByaXZhdGUgUU5hbWUgZ2VuZXJhdGVUeXBlUU5hbWUoUU5hbWUgcmVmZXJlbmNlRWx0UU5hbWUsIFhtbFNjaGVtYSBwYXJlbnRTY2hlbWEpIHsKLSAgICAgICAgUU5hbWUgZ2VuZXJhdGVkVHlwZU5hbWUgPSBuZXcgUU5hbWUocmVmZXJlbmNlRWx0UU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCksCi0gICAgICAgICAgICAgICAgcmVmZXJlbmNlRWx0UU5hbWUuZ2V0TG9jYWxQYXJ0KCkgKyBnZXROZXh0VHlwZVN1ZmZpeChyZWZlcmVuY2VFbHRRTmFtZS5nZXRMb2NhbFBhcnQoKSkpOwotICAgICAgICB3aGlsZSAocGFyZW50U2NoZW1hLmdldFR5cGVCeU5hbWUoZ2VuZXJhdGVkVHlwZU5hbWUpICE9IG51bGwpIHsKLSAgICAgICAgICAgIGdlbmVyYXRlZFR5cGVOYW1lID0gbmV3IFFOYW1lKHJlZmVyZW5jZUVsdFFOYW1lLmdldE5hbWVzcGFjZVVSSSgpLAotICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2VFbHRRTmFtZS5nZXRMb2NhbFBhcnQoKSArIGdldE5leHRUeXBlU3VmZml4KHJlZmVyZW5jZUVsdFFOYW1lLmdldExvY2FsUGFydCgpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGdlbmVyYXRlZFR5cGVOYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZpbmRzIHdoZXRoZXIgYSBnaXZlbiBjbGFzcyBpcyBhbHJlYWR5IG1hZGUKLSAgICAgKgotICAgICAqIEBwYXJhbSBxTmFtZQotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBpc0FscmVhZHlQcm9jZXNzZWQoUU5hbWUgcU5hbWUpIHsKLSAgICAgICAgcmV0dXJuIHByb2Nlc3NlZFR5cGVtYXAuY29udGFpbnNLZXkocU5hbWUpIHx8Ci0gICAgICAgICAgICAgICAgc2ltcGxlVHlwZXNNYXAuY29udGFpbnNLZXkocU5hbWUpIHx8Ci0gICAgICAgICAgICAgICAgYmFzZVNjaGVtYVR5cGVNYXAuY29udGFpbnNLZXkocU5hbWUpIHx8Ci0gICAgICAgICAgICAgICAgcHJvY2Vzc2VkR3JvdXBUeXBlTWFwLmNvbnRhaW5zS2V5KHFOYW1lKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIEEgbWV0aG9kIHRvIHBpY2sgdGhlIHJlZiBjbGFzcyBuYW1lCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZQotICAgICAqIEBwYXJhbSBpc0FycmF5Ci0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZmluZFJlZkNsYXNzTmFtZShRTmFtZSBuYW1lLCBib29sZWFuIGlzQXJyYXkpIHsKLSAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IG51bGw7Ci0gICAgICAgIGlmIChwcm9jZXNzZWRFbGVtZW50UmVmTWFwLmdldChuYW1lKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjbGFzc05hbWUgPSAoU3RyaW5nKSBwcm9jZXNzZWRFbGVtZW50UmVmTWFwLmdldChuYW1lKTsKLQotICAgICAgICAgICAgaWYgKGlzQXJyYXkpIHsKLSAgICAgICAgICAgICAgICAvL2FwcGVuZCB0aGUgc3F1YXJlIGJyYWNlcyB0aGF0IHNheSB0aGlzIGlzIGFuIGFycmF5Ci0gICAgICAgICAgICAgICAgLy9ob3BlIHRoaXMgd29ya3MgZm9yIGFsbCBjYXNlcyEhISEhISEKLSAgICAgICAgICAgICAgICAvL3RvZG8gdGhpcyBob3dldmVyIGlzIGEgdGhpbmcgdGhhdCBuZWVkcyB0byBiZQotICAgICAgICAgICAgICAgIC8vdG9kbyBmaXhlZCB0byBnZXQgY29tcGxldGUgbGFuZ3VhZ2Ugc3VwcG9ydAotICAgICAgICAgICAgICAgIGNsYXNzTmFtZSA9IGNsYXNzTmFtZSArICJbXSI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNsYXNzTmFtZTsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZpbmRzIGEgY2xhc3MgbmFtZSBmcm9tIHRoZSBnaXZlbiBRbmFtZQotICAgICAqCi0gICAgICogQHBhcmFtIHFOYW1lCi0gICAgICogQHBhcmFtIGlzQXJyYXkKLSAgICAgKiBAcmV0dXJuIEZRQ04KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBmaW5kQ2xhc3NOYW1lKFFOYW1lIHFOYW1lLCBib29sZWFuIGlzQXJyYXkpIHRocm93cyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgLy9maW5kIHRoZSBjbGFzcyBuYW1lCi0gICAgICAgIFN0cmluZyBjbGFzc05hbWU7Ci0gICAgICAgIGlmIChwcm9jZXNzZWRUeXBlbWFwLmNvbnRhaW5zS2V5KHFOYW1lKSkgewotICAgICAgICAgICAgY2xhc3NOYW1lID0gKFN0cmluZykgcHJvY2Vzc2VkVHlwZW1hcC5nZXQocU5hbWUpOwotICAgICAgICB9IGVsc2UgaWYgKHNpbXBsZVR5cGVzTWFwLmNvbnRhaW5zS2V5KHFOYW1lKSkgewotICAgICAgICAgICAgY2xhc3NOYW1lID0gKFN0cmluZykgc2ltcGxlVHlwZXNNYXAuZ2V0KHFOYW1lKTsKLSAgICAgICAgfSBlbHNlIGlmIChiYXNlU2NoZW1hVHlwZU1hcC5jb250YWluc0tleShxTmFtZSkpIHsKLSAgICAgICAgICAgIGNsYXNzTmFtZSA9IChTdHJpbmcpIGJhc2VTY2hlbWFUeXBlTWFwLmdldChxTmFtZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoaXNTT0FQX0VOQyhxTmFtZS5nZXROYW1lc3BhY2VVUkkoKSkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24oU2NoZW1hQ29tcGlsZXJNZXNzYWdlcy5nZXRNZXNzYWdlKCJzY2hlbWEuc29hcGVuY29kaW5nLmVycm9yIiwgcU5hbWUudG9TdHJpbmcoKSkpOwotCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBXZSBzZWVtIHRvIGhhdmUgZmFpbGVkIGluIGZpbmRpbmcgYSBjbGFzcyBuYW1lIGZvciB0aGUKLSAgICAgICAgICAgIC8vY29udGFpbmVkIHNjaGVtYSB0eXBlLiBXZSBiZXR0ZXIgc2V0IHRoZSBkZWZhdWx0IHRoZW4KLSAgICAgICAgICAgIC8vaG93ZXZlciBpdCdzIGJldHRlciBpZiB0aGUgZGVmYXVsdCBjYW4gYmUgc2V0IHRocm91Z2ggdGhlCi0gICAgICAgICAgICAvL3Byb3BlcnR5IGZpbGUKLSAgICAgICAgICAgIGNsYXNzTmFtZSA9IHdyaXRlci5nZXREZWZhdWx0Q2xhc3NOYW1lKCk7Ci0gICAgICAgICAgICBsb2cud2FybihTY2hlbWFDb21waWxlck1lc3NhZ2VzCi0gICAgICAgICAgICAgICAgICAgIC5nZXRNZXNzYWdlKCJzY2hlbWEudHlwZU1pc3NpbmciLCBxTmFtZS50b1N0cmluZygpKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaXNBcnJheSkgewotICAgICAgICAgICAgLy9hcHBlbmQgdGhlIHNxdWFyZSBicmFjZXMgdGhhdCBzYXkgdGhpcyBpcyBhbiBhcnJheQotICAgICAgICAgICAgLy9ob3BlIHRoaXMgd29ya3MgZm9yIGFsbCBjYXNlcyEhISEhISEKLSAgICAgICAgICAgIC8vdG9kbyB0aGlzIGhvd2V2ZXIgaXMgYSB0aGluZyB0aGF0IG5lZWRzIHRvIGJlCi0gICAgICAgICAgICAvL3RvZG8gZml4ZWQgdG8gZ2V0IGNvbXBsZXRlIGxhbmd1YWdlIHN1cHBvcnQKLSAgICAgICAgICAgIGNsYXNzTmFtZSA9IGNsYXNzTmFtZSArICJbXSI7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNsYXNzTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgU09BUF9FTkMgTmFtZXNwYWNlLgotICAgICAqCi0gICAgICogQHBhcmFtIHMgYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBVUkkgdG8gY2hlY2sKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgPGNvZGU+czwvY29kZT4gbWF0Y2hlcyBhIFNPQVAgRU5DT0RJTkcgbmFtZXNwYWNlIFVSSSwKLSAgICAgKiAgICAgICAgIGZhbHNlIG90aGVyd2lzZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1NPQVBfRU5DKFN0cmluZyBzKSB7Ci0gICAgICAgIGlmIChzLmVxdWFscyhDb25zdGFudHMuVVJJX1NPQVAxMV9FTkMpKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIHJldHVybiBzLmVxdWFscyhDb25zdGFudHMuVVJJX1NPQVAxMl9FTkMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByb2Nlc3MgYSBzY2hlbWEgZWxlbWVudCB3aGljaCBoYXMgYmVlbiByZWZlcmVkIHRvIGJ5IGFuIGVsZW1lbnQKLSAgICAgKgotICAgICAqIEBwYXJhbSBzY2hlbWFUeXBlCi0gICAgICogQHRocm93cyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzU2NoZW1hKFhtbFNjaGVtYUVsZW1lbnQgeHNFbHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWG1sU2NoZW1hVHlwZSBzY2hlbWFUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhtbFNjaGVtYSBwYXJlbnRTY2hlbWEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc1dyaXRlQW5vbkNvbXBsZXhUeXBlKSB0aHJvd3MgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24gewotICAgICAgICBpZiAoc2NoZW1hVHlwZSBpbnN0YW5jZW9mIFhtbFNjaGVtYUNvbXBsZXhUeXBlKSB7Ci0gICAgICAgICAgICAvL3dyaXRlIGNsYXNzZXMgZm9yIGNvbXBsZXggdHlwZXMKLSAgICAgICAgICAgIFhtbFNjaGVtYUNvbXBsZXhUeXBlIGNvbXBsZXhUeXBlID0gKFhtbFNjaGVtYUNvbXBsZXhUeXBlKSBzY2hlbWFUeXBlOwotICAgICAgICAgICAgLy8gY29tcGxleCB0eXBlIG5hbWUgbWF5IG5vdCBiZSBudWxsIGlmIHdlIGhhdmUgc2V0IGl0Ci0gICAgICAgICAgICBpZiAoY29tcGxleFR5cGUuZ2V0TmFtZSgpICE9IG51bGwgJiYgIXRoaXMuY2hhbmdlZENvbXBsZXhUeXBlU2V0LmNvbnRhaW5zKHNjaGVtYVR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgLy8gaGVyZSBjb21wbGV4IHR5cGUgbWF5IGJlIGluIGFub3RoZXIgc2hjZW1hIHNvIHdlIGhhdmUgdG8gZmluZCB0aGUKLSAgICAgICAgICAgICAgICAvLyBjb3JyZWN0IHBhcmVudCBzY2hlbWEuCi0gICAgICAgICAgICAgICAgWG1sU2NoZW1hIHJlc29sdmVkU2NoZW1hID0gZ2V0UGFyZW50U2NoZW1hKHBhcmVudFNjaGVtYSxjb21wbGV4VHlwZS5nZXRRTmFtZSgpLENPTVBPTkVOVF9UWVBFKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWRTY2hlbWEgPT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbigiY2FuIG5vdCBmaW5kIHRoZSBwYXJlbnQgc2NoZW1hIGZvciB0aGUgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbXBsZXggdHlwZSAiICsgY29tcGxleFR5cGUuZ2V0UU5hbWUoKSArICIgZnJvbSB0aGUgcGFyZW50IHNjaGVtYSAiICsKLSAgICAgICAgICAgICAgICAgICAgcGFyZW50U2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgIHByb2Nlc3NOYW1lZENvbXBsZXhTY2hlbWFUeXBlKGNvbXBsZXhUeXBlLCByZXNvbHZlZFNjaGVtYSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwcm9jZXNzQW5vbnltb3VzQ29tcGxleFNjaGVtYVR5cGUoeHNFbHQsIGNvbXBsZXhUeXBlLCBwYXJlbnRTY2hlbWEsIGlzV3JpdGVBbm9uQ29tcGxleFR5cGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHNjaGVtYVR5cGUgaW5zdGFuY2VvZiBYbWxTY2hlbWFTaW1wbGVUeXBlKSB7Ci0gICAgICAgICAgICAvL3Byb2Nlc3Mgc2ltcGxlIHR5cGUKLSAgICAgICAgICAgIHByb2Nlc3NTaW1wbGVTY2hlbWFUeXBlKChYbWxTY2hlbWFTaW1wbGVUeXBlKSBzY2hlbWFUeXBlLAotICAgICAgICAgICAgICAgICAgICB4c0VsdCwKLSAgICAgICAgICAgICAgICAgICAgcGFyZW50U2NoZW1hLCBudWxsKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGNvbXBsZXhUeXBlCi0gICAgICogQHRocm93cyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzQW5vbnltb3VzQ29tcGxleFNjaGVtYVR5cGUoWG1sU2NoZW1hRWxlbWVudCBlbHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYbWxTY2hlbWFDb21wbGV4VHlwZSBjb21wbGV4VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhtbFNjaGVtYSBwYXJlbnRTY2hlbWEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzV3JpdGVBbm9uQ29tcGxleFR5cGUpCi0gICAgICAgICAgICB0aHJvd3MgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24gewotCi0gICAgICAgIC8vaGVyZSB3ZSBoYXZlIGEgcHJvYmxlbSB3aGVuIHByb2Nlc3NpbmcgdGhlIGNpcmN1bGFyZSBlbGVtZW50Ci0gICAgICAgIC8vIHJlZmVyZW5jZXMgaWYgd2UgZGlmZmVyIHRoaXMgcHJvY2Vzc2luZwotICAgICAgICAvLyBnZW5lcmF0ZSBhIG5hbWUgdG8gdGhlIGNvbXBsZXggdHlwZSBhbmQgcmVnaXN0ZXIgaXQgaGVyZQotICAgICAgICBRTmFtZSBnZW5lcmF0ZWRUeXBlTmFtZSA9IG51bGw7Ci0gICAgICAgIFN0cmluZyBqYXZhQ2xhc3NOYW1lID0gbnVsbDsKLSAgICAgICAgaWYgKGlzV3JpdGVBbm9uQ29tcGxleFR5cGUpIHsKLQotICAgICAgICAgICAgZ2VuZXJhdGVkVHlwZU5hbWUgPSBnZW5lcmF0ZVR5cGVRTmFtZShlbHQuZ2V0UU5hbWUoKSwgcGFyZW50U2NoZW1hKTsKLQotICAgICAgICAgICAgaWYgKGVsdC5nZXRTY2hlbWFUeXBlTmFtZSgpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBlbHQuc2V0U2NoZW1hVHlwZU5hbWUoZ2VuZXJhdGVkVHlwZU5hbWUpOwotICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlZEVsZW1lbnRTZXQuYWRkKGVsdCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vc2V0IGEgbmFtZQotICAgICAgICAgICAgY29tcGxleFR5cGUuc2V0TmFtZShnZW5lcmF0ZWRUeXBlTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICB0aGlzLmNoYW5nZWRDb21wbGV4VHlwZVNldC5hZGQoY29tcGxleFR5cGUpOwotCi0gICAgICAgICAgICBqYXZhQ2xhc3NOYW1lID0gd3JpdGVyLm1ha2VGdWxseVF1YWxpZmllZENsYXNzTmFtZShnZW5lcmF0ZWRUeXBlTmFtZSk7Ci0gICAgICAgICAgICBwcm9jZXNzZWRUeXBlbWFwLnB1dChnZW5lcmF0ZWRUeXBlTmFtZSwgamF2YUNsYXNzTmFtZSk7Ci0gICAgICAgICAgICB0aGlzLnByb2Nlc3NlZEVsZW1lbnRSZWZNYXAucHV0KGVsdC5nZXRRTmFtZSgpLCBqYXZhQ2xhc3NOYW1lKTsKLSAgICAgICAgICAgIGNvbXBsZXhUeXBlLmFkZE1ldGFJbmZvKFNjaGVtYUNvbnN0YW50cy5TY2hlbWFDb21waWxlckluZm9Ib2xkZXIuQ0xBU1NOQU1FX0tFWSwgamF2YUNsYXNzTmFtZSk7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIEJlYW5Xcml0ZXJNZXRhSW5mb0hvbGRlciBtZXRhSW5mSG9sZGVyID0gcHJvY2Vzc0NvbXBsZXhUeXBlKGVsdC5nZXRRTmFtZSgpLGNvbXBsZXhUeXBlLCBwYXJlbnRTY2hlbWEpOwotCi0gICAgICAgIC8vIGhlcmUgdGhlIG9ubHkgZGlmZmVyZW5jZSBpcyB0aGF0IHdlIGdlbmVyYXRlIHRoZSBjbGFzcwotICAgICAgICAvLyBpcnJlc3BlY3RpdmUgb2Ygd2hlcmUgd2UgbmVlZCBpdCBvciBub3QKLSAgICAgICAgaWYgKGlzV3JpdGVBbm9uQ29tcGxleFR5cGUpIHsKLSAgICAgICAgICAgIG1ldGFJbmZIb2xkZXIuc2V0T3duQ2xhc3NOYW1lKGphdmFDbGFzc05hbWUpOwotICAgICAgICAgICAgbWV0YUluZkhvbGRlci5zZXRPd25RbmFtZShnZW5lcmF0ZWRUeXBlTmFtZSk7Ci0gICAgICAgICAgICB3cml0ZUNvbXBsZXhUeXBlKGNvbXBsZXhUeXBlLCBtZXRhSW5mSG9sZGVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vc2luY2UgdGhpcyBpcyBhIHNwZWNpYWwgY2FzZSAoYW4gdW5uYW1lZCBjb21wbGV4IHR5cGUpIHdlJ2xsIHB1dCB0aGUgYWxyZWFkeSBwcm9jZXNzZWQKLSAgICAgICAgLy9tZXRhaW5mIGhvbGRlciBpbiBhIHNwZWNpYWwgbWFwIHRvIGJlIHVzZWQgbGF0ZXIKLSAgICAgICAgdGhpcy5wcm9jZXNzZWRBbm9ueW1vdXNDb21wbGV4VHlwZXNNYXAucHV0KGVsdCwgbWV0YUluZkhvbGRlcik7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBoYW5kbGUgdGhlIGNvbXBsZXggdHlwZXMgd2hpY2ggYXJlIG5hbWVkCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29tcGxleFR5cGUKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc05hbWVkQ29tcGxleFNjaGVtYVR5cGUoWG1sU2NoZW1hQ29tcGxleFR5cGUgY29tcGxleFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhtbFNjaGVtYSBwYXJlbnRTY2hlbWEpIHRocm93cyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgaWYgKHByb2Nlc3NlZFR5cGVtYXAuY29udGFpbnNLZXkoY29tcGxleFR5cGUuZ2V0UU5hbWUoKSkKLSAgICAgICAgICAgICAgICB8fCBiYXNlU2NoZW1hVHlwZU1hcC5jb250YWluc0tleShjb21wbGV4VHlwZS5nZXRRTmFtZSgpKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTXVzdCBkbyB0aGlzIHVwIGZyb250IHRvIHN1cHBvcnQgcmVjdXJzaXZlIHR5cGVzCi0gICAgICAgIFN0cmluZyBmdWxseVF1YWxpZmllZENsYXNzTmFtZSA9IHdyaXRlci5tYWtlRnVsbHlRdWFsaWZpZWRDbGFzc05hbWUoY29tcGxleFR5cGUuZ2V0UU5hbWUoKSk7Ci0gICAgICAgIHByb2Nlc3NlZFR5cGVtYXAucHV0KGNvbXBsZXhUeXBlLmdldFFOYW1lKCksIGZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lKTsKLQotICAgICAgICAvL3JlZ2lzdGVyIHRoYXQgaW4gdGhlIHNjaGVtYSBtZXRhaW5mbyBiYWcKLSAgICAgICAgY29tcGxleFR5cGUuYWRkTWV0YUluZm8oU2NoZW1hQ29uc3RhbnRzLlNjaGVtYUNvbXBpbGVySW5mb0hvbGRlci5DTEFTU05BTUVfS0VZLAotICAgICAgICAgICAgICAgIGZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lKTsKLQotICAgICAgICBCZWFuV3JpdGVyTWV0YUluZm9Ib2xkZXIgbWV0YUluZkhvbGRlciA9IHByb2Nlc3NDb21wbGV4VHlwZShjb21wbGV4VHlwZS5nZXRRTmFtZSgpLGNvbXBsZXhUeXBlLCBwYXJlbnRTY2hlbWEpOwotICAgICAgICAvL2FkZCB0aGlzIGluZm9ybWF0aW9uIHRvIHRoZSBtZXRhaW5mbyBob2xkZXIKLSAgICAgICAgbWV0YUluZkhvbGRlci5zZXRPd25RbmFtZShjb21wbGV4VHlwZS5nZXRRTmFtZSgpKTsKLSAgICAgICAgbWV0YUluZkhvbGRlci5zZXRPd25DbGFzc05hbWUoZnVsbHlRdWFsaWZpZWRDbGFzc05hbWUpOwotICAgICAgICAvL3dyaXRlIHRoZSBjbGFzcy4gVGhpcyB0eXBlIG1hcHBpbmcgd291bGQgaGF2ZSBiZWVuIHBvcHVsYXRlZCByaWdodCBub3cKLSAgICAgICAgLy9Ob3RlIC0gV2UgYWx3YXlzIHdyaXRlIGNsYXNzZXMgZm9yIG5hbWVkIGNvbXBsZXggdHlwZXMKLSAgICAgICAgd3JpdGVDb21wbGV4VHlwZShjb21wbGV4VHlwZSwgbWV0YUluZkhvbGRlcik7Ci0KLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdyaXRlcyBhIGNvbXBsZXggdHlwZQotICAgICAqCi0gICAgICogQHBhcmFtIGNvbXBsZXhUeXBlCi0gICAgICogQHBhcmFtIG1ldGFJbmZIb2xkZXIKLSAgICAgKiBAdGhyb3dzIFNjaGVtYUNvbXBpbGF0aW9uRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgd3JpdGVDb21wbGV4VHlwZShYbWxTY2hlbWFDb21wbGV4VHlwZSBjb21wbGV4VHlwZSwgQmVhbldyaXRlck1ldGFJbmZvSG9sZGVyIG1ldGFJbmZIb2xkZXIpCi0gICAgICAgICAgICB0aHJvd3MgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgamF2YUNsYXNzTmFtZSA9IHdyaXRlci53cml0ZShjb21wbGV4VHlwZS5nZXRRTmFtZSgpLAotICAgICAgICAgICAgICAgIHByb2Nlc3NlZFR5cGVtYXAsIHByb2Nlc3NlZEdyb3VwVHlwZU1hcCwgbWV0YUluZkhvbGRlciwgY29tcGxleFR5cGUuaXNBYnN0cmFjdCgpKTsKLSAgICAgICAgcHJvY2Vzc2VkVHlwZU1ldGFJbmZvTWFwLnB1dChjb21wbGV4VHlwZS5nZXRRTmFtZSgpLCBtZXRhSW5mSG9sZGVyKTsKLSAgICAgICAgcmV0dXJuIGphdmFDbGFzc05hbWU7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBXcml0ZXMgY29tcGxleCBTZXF1ZW5jZSxDaG9pY2UsIGFsbCBlbGVtZW50cwotICAgICAqIEBwYXJhbSBxbmFtZSBjb21wbGV4IHR5cGUgcW5hbWUKLSAgICAgKiBAcGFyYW0gbWV0YUluZkhvbGRlcgotICAgICAqIEByZXR1cm4gIHdyaXR0ZW4gamF2YSBjbGFzcyBuYW1lCi0gICAgICogQHRocm93cyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbgotICAgICAqLwotCi0KLSAgICBwcml2YXRlIFN0cmluZyB3cml0ZUNvbXBsZXhQYXJ0aWNsZShRTmFtZSBxbmFtZSxCZWFuV3JpdGVyTWV0YUluZm9Ib2xkZXIgbWV0YUluZkhvbGRlcikKLSAgICAgICAgICAgIHRocm93cyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgU3RyaW5nIGphdmFDbGFzc05hbWUgPSB3cml0ZXIud3JpdGUocW5hbWUsIHByb2Nlc3NlZFR5cGVtYXAsIHByb2Nlc3NlZEdyb3VwVHlwZU1hcCwgbWV0YUluZkhvbGRlcixmYWxzZSk7Ci0gICAgICAgIHByb2Nlc3NlZFR5cGVNZXRhSW5mb01hcC5wdXQocW5hbWUsIG1ldGFJbmZIb2xkZXIpOwotICAgICAgICByZXR1cm4gamF2YUNsYXNzTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZXMgYSBjb21wbGV4IHR5cGUKLSAgICAgKgotICAgICAqIEBwYXJhbSBzaW1wbGVUeXBlCi0gICAgICogQHBhcmFtIG1ldGFJbmZIb2xkZXIKLSAgICAgKiBAdGhyb3dzIFNjaGVtYUNvbXBpbGF0aW9uRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHdyaXRlU2ltcGxlVHlwZShYbWxTY2hlbWFTaW1wbGVUeXBlIHNpbXBsZVR5cGUsIEJlYW5Xcml0ZXJNZXRhSW5mb0hvbGRlciBtZXRhSW5mSG9sZGVyKQotICAgICAgICAgICAgdGhyb3dzIFNjaGVtYUNvbXBpbGF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgd3JpdGVyLndyaXRlKHNpbXBsZVR5cGUsIHByb2Nlc3NlZFR5cGVtYXAsIHByb2Nlc3NlZEdyb3VwVHlwZU1hcCwgbWV0YUluZkhvbGRlcik7Ci0gICAgICAgIHByb2Nlc3NlZFR5cGVNZXRhSW5mb01hcC5wdXQoc2ltcGxlVHlwZS5nZXRRTmFtZSgpLCBtZXRhSW5mSG9sZGVyKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEJlYW5Xcml0ZXJNZXRhSW5mb0hvbGRlciBwcm9jZXNzQ29tcGxleFR5cGUoCi0gICAgICAgICAgICBRTmFtZSBwYXJlbnRFbGVtZW50UU5hbWUsCi0gICAgICAgICAgICBYbWxTY2hlbWFDb21wbGV4VHlwZSBjb21wbGV4VHlwZSwKLSAgICAgICAgICAgIFhtbFNjaGVtYSBwYXJlbnRTY2hlbWEpIHRocm93cyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIFhtbFNjaGVtYVBhcnRpY2xlIHBhcnRpY2xlID0gY29tcGxleFR5cGUuZ2V0UGFydGljbGUoKTsKLSAgICAgICAgQmVhbldyaXRlck1ldGFJbmZvSG9sZGVyIG1ldGFJbmZIb2xkZXIgPSBuZXcgQmVhbldyaXRlck1ldGFJbmZvSG9sZGVyKCk7Ci0gICAgICAgIGlmIChwYXJ0aWNsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvL1Byb2Nlc3MgdGhlIHBhcnRpY2xlCi0gICAgICAgICAgICBwcm9jZXNzUGFydGljbGUocGFyZW50RWxlbWVudFFOYW1lLCBwYXJ0aWNsZSwgbWV0YUluZkhvbGRlciwgcGFyZW50U2NoZW1hKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vcHJvY2VzcyBhdHRyaWJ1dGVzIC0gZmlyc3QgbG9vayBmb3IgdGhlIGV4cGxpY2l0IGF0dHJpYnV0ZXMKLSAgICAgICAgcHJvY2Vzc0F0dHJpYnV0ZXMoY29tcGxleFR5cGUuZ2V0QXR0cmlidXRlcygpLG1ldGFJbmZIb2xkZXIscGFyZW50U2NoZW1hKTsKLQotICAgICAgICAvL3Byb2Nlc3MgYW55IGF0dHJpYnV0ZQotICAgICAgICAvL3NvbWVob3cgdGhlIHhtbCBzY2hlbWEgcGFyc2VyIGRvZXMgbm90IHNlZW0gdG8gcGlja3VwIHRoZSBhbnkgYXR0cmlidXRlISEKLSAgICAgICAgWG1sU2NoZW1hQW55QXR0cmlidXRlIGFueUF0dCA9IGNvbXBsZXhUeXBlLmdldEFueUF0dHJpYnV0ZSgpOwotICAgICAgICBpZiAoYW55QXR0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHByb2Nlc3NBbnlBdHRyaWJ1dGUobWV0YUluZkhvbGRlciwgYW55QXR0KTsKLSAgICAgICAgfQotCi0KLSAgICAgICAgLy9wcm9jZXNzIGNvbnRlbnQgLGVpdGhlciAgY29tcGxleCBvciBzaW1wbGUKLSAgICAgICAgaWYgKGNvbXBsZXhUeXBlLmdldENvbnRlbnRNb2RlbCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIHByb2Nlc3NDb250ZW50TW9kZWwoY29tcGxleFR5cGUuZ2V0Q29udGVudE1vZGVsKCksCi0gICAgICAgICAgICAgICAgICAgIG1ldGFJbmZIb2xkZXIsCi0gICAgICAgICAgICAgICAgICAgIHBhcmVudFNjaGVtYSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1ldGFJbmZIb2xkZXI7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NBdHRyaWJ1dGVzKFhtbFNjaGVtYU9iamVjdENvbGxlY3Rpb24gYXR0cmlidXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmVhbldyaXRlck1ldGFJbmZvSG9sZGVyIG1ldGFJbmZIb2xkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhtbFNjaGVtYSBwYXJlbnRTY2hlbWEpIHRocm93cyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIEl0ZXJhdG9yIGF0dHJpYkl0ZXJhdG9yID0gYXR0cmlidXRlcy5nZXRJdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoYXR0cmliSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBPYmplY3QgbyA9IGF0dHJpYkl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgIGlmIChvIGluc3RhbmNlb2YgWG1sU2NoZW1hQXR0cmlidXRlKSB7Ci0gICAgICAgICAgICAgICAgcHJvY2Vzc0F0dHJpYnV0ZSgoWG1sU2NoZW1hQXR0cmlidXRlKSBvLCBtZXRhSW5mSG9sZGVyLCBwYXJlbnRTY2hlbWEpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChvIGluc3RhbmNlb2YgWG1sU2NoZW1hQXR0cmlidXRlR3JvdXBSZWYpewotICAgICAgICAgICAgICAgIHByb2Nlc3NBdHRyaWJ1dGVHcm91cFJlZmVyZW5jZSgoWG1sU2NoZW1hQXR0cmlidXRlR3JvdXBSZWYpbyxtZXRhSW5mSG9sZGVyLHBhcmVudFNjaGVtYSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0F0dHJpYnV0ZUdyb3VwUmVmZXJlbmNlKFhtbFNjaGVtYUF0dHJpYnV0ZUdyb3VwUmVmIGF0dHJpYnV0ZUdyb3VwUmVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmVhbldyaXRlck1ldGFJbmZvSG9sZGVyIG1ldGFJbmZIb2xkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYbWxTY2hlbWEgcGFyZW50U2NoZW1hKSB0aHJvd3MgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24gewotCi0gICAgICAgIFFOYW1lIGF0dHJpYnV0ZUdyb3VwUmVmTmFtZSA9IGF0dHJpYnV0ZUdyb3VwUmVmLmdldFJlZk5hbWUoKTsKLSAgICAgICAgaWYgKGF0dHJpYnV0ZUdyb3VwUmVmTmFtZSAhPSBudWxsKXsKLSAgICAgICAgICAgWG1sU2NoZW1hIHJlc29sdmVkU2NoZW1hID0gZ2V0UGFyZW50U2NoZW1hKHBhcmVudFNjaGVtYSxhdHRyaWJ1dGVHcm91cFJlZk5hbWUsQ09NUE9ORU5UX0FUVFJJQlVURV9HUk9VUCk7Ci0gICAgICAgICAgICBpZiAocmVzb2x2ZWRTY2hlbWEgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbigiY2FuIG5vdCBmaW5kIHRoZSBhdHRyaWJ1dGUgZ3JvdXAgcmVmZXJlbmNlIG5hbWUgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVHcm91cFJlZk5hbWUgKyAiIGZyb20gdGhlIHBhcmVudCBzY2hlbWEgIiArIHBhcmVudFNjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFhtbFNjaGVtYUF0dHJpYnV0ZUdyb3VwIHhtbFNjaGVtYUF0dHJpYnV0ZUdyb3VwID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChYbWxTY2hlbWFBdHRyaWJ1dGVHcm91cCkgcmVzb2x2ZWRTY2hlbWEuZ2V0QXR0cmlidXRlR3JvdXBzKCkuZ2V0SXRlbShhdHRyaWJ1dGVHcm91cFJlZk5hbWUpOwotICAgICAgICAgICAgICAgIGlmICh4bWxTY2hlbWFBdHRyaWJ1dGVHcm91cCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NBdHRyaWJ1dGVzKHhtbFNjaGVtYUF0dHJpYnV0ZUdyb3VwLmdldEF0dHJpYnV0ZXMoKSwgbWV0YUluZkhvbGRlciwgcmVzb2x2ZWRTY2hlbWEpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbigiQ2FuIG5vdCBmaW5kIGFuIGF0dHJpYnV0ZSBncm91cCBmb3IgZ3JvdXAgcmVmZXJlbmNlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGF0dHJpYnV0ZUdyb3VwUmVmTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24oIk5vIGdyb3VwIHJlZmVybmNlIGhhcyBnaXZlbiIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJvY2VzcyB0aGUgY29udGVudCBtb2RlbHMuIEEgY29udGVudCBtb2RlbCBpcyBlaXRoZXIgc2ltcGxlIHR5cGUgb3IgYSBjb21wbGV4IHR5cGUKLSAgICAgKiBhbmQgaW5jbHVkZWQgaW5zaWRlIGEgY29tcGxleCBjb250ZW50Ci0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NDb250ZW50TW9kZWwoWG1sU2NoZW1hQ29udGVudE1vZGVsIGNvbnRlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmVhbldyaXRlck1ldGFJbmZvSG9sZGVyIG1ldGFJbmZIb2xkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWG1sU2NoZW1hIHBhcmVudFNjaGVtYSkKLSAgICAgICAgICAgIHRocm93cyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChjb250ZW50IGluc3RhbmNlb2YgWG1sU2NoZW1hQ29tcGxleENvbnRlbnQpIHsKLSAgICAgICAgICAgIHByb2Nlc3NDb21wbGV4Q29udGVudCgoWG1sU2NoZW1hQ29tcGxleENvbnRlbnQpIGNvbnRlbnQsIG1ldGFJbmZIb2xkZXIsIHBhcmVudFNjaGVtYSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoY29udGVudCBpbnN0YW5jZW9mIFhtbFNjaGVtYVNpbXBsZUNvbnRlbnQpIHsKLSAgICAgICAgICAgIHByb2Nlc3NTaW1wbGVDb250ZW50KChYbWxTY2hlbWFTaW1wbGVDb250ZW50KSBjb250ZW50LCBtZXRhSW5mSG9sZGVyLCBwYXJlbnRTY2hlbWEpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJjZXNzIHRoZSBjb21wbGV4IGNvbnRlbnQKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0NvbXBsZXhDb250ZW50KFhtbFNjaGVtYUNvbXBsZXhDb250ZW50IGNvbXBsZXhDb250ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmVhbldyaXRlck1ldGFJbmZvSG9sZGVyIG1ldGFJbmZIb2xkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYbWxTY2hlbWEgcGFyZW50U2NoZW1hKQotICAgICAgICAgICAgdGhyb3dzIFNjaGVtYUNvbXBpbGF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgWG1sU2NoZW1hQ29udGVudCBjb250ZW50ID0gY29tcGxleENvbnRlbnQuZ2V0Q29udGVudCgpOwotCi0gICAgICAgIGlmIChjb250ZW50IGluc3RhbmNlb2YgWG1sU2NoZW1hQ29tcGxleENvbnRlbnRFeHRlbnNpb24pIHsKLQotICAgICAgICAgICAgLy8gdG8gaGFuZGxlIGV4dGVuc2lvbiB3ZSBuZWVkIHRvIGF0dGFjaCB0aGUgZXh0ZW5kZWQgaXRlbXMgdG8gdGhlIGJhc2UgdHlwZQotICAgICAgICAgICAgLy8gYW5kIGNyZWF0ZSBhIG5ldyB0eXBlCi0gICAgICAgICAgICBYbWxTY2hlbWFDb21wbGV4Q29udGVudEV4dGVuc2lvbiBleHRlbnNpb24gPSAoWG1sU2NoZW1hQ29tcGxleENvbnRlbnRFeHRlbnNpb24pY29udGVudDsKLQotICAgICAgICAgICAgLy9wcm9jZXNzIHRoZSBiYXNlIHR5cGUgaWYgaXQgaGFzIG5vdCBiZWVuIHByb2Nlc3NlZCB5ZXQKLSAgICAgICAgICAgIGlmICghaXNBbHJlYWR5UHJvY2Vzc2VkKGV4dGVuc2lvbi5nZXRCYXNlVHlwZU5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAvL3BpY2sgdGhlIHJlbGV2YW50IGJhc2V0eXBlIGZyb20gdGhlIHNjaGVtYSBhbmQgcHJvY2VzcyBpdAotICAgICAgICAgICAgICAgIFhtbFNjaGVtYSByZXNvbHZlZFNjaGVtYSA9IGdldFBhcmVudFNjaGVtYShwYXJlbnRTY2hlbWEsIGV4dGVuc2lvbi5nZXRCYXNlVHlwZU5hbWUoKSwgQ09NUE9ORU5UX1RZUEUpOwotICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlZFNjaGVtYSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbigiY2FuIG5vdCBmaW5kIHRoZSBjb21wbGV5IHR5cGUgIiArIGV4dGVuc2lvbi5nZXRCYXNlVHlwZU5hbWUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBmcm9tIHRoZSBwYXJlbnQgdHlwZSAiICsgcGFyZW50U2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBYbWxTY2hlbWFUeXBlIHR5cGUgPSByZXNvbHZlZFNjaGVtYS5nZXRUeXBlQnlOYW1lKGV4dGVuc2lvbi5nZXRCYXNlVHlwZU5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlIGluc3RhbmNlb2YgWG1sU2NoZW1hQ29tcGxleFR5cGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFhtbFNjaGVtYUNvbXBsZXhUeXBlIGNvbXBsZXhUeXBlID0gKFhtbFNjaGVtYUNvbXBsZXhUeXBlKSB0eXBlOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBsZXhUeXBlLmdldE5hbWUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc05hbWVkQ29tcGxleFNjaGVtYVR5cGUoY29tcGxleFR5cGUsIHJlc29sdmVkU2NoZW1hKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy90aGlzIGlzIG5vdCBwb3NzaWJsZS4gVGhlIGV4dGVuc2lvbiBzaG91bGQgYWx3YXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9oYXZlIGEgbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbigiVW5uYW1lZCBjb21wbGV4IHR5cGUgdXNlZCBpbiBleHRlbnNpb24iKTsvL0ludGVybmF0aW9ubGl6ZSB0aGlzCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSBpbnN0YW5jZW9mIFhtbFNjaGVtYVNpbXBsZVR5cGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vcHJvY2VzcyBzaW1wbGUgdHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc1NpbXBsZVNjaGVtYVR5cGUoKFhtbFNjaGVtYVNpbXBsZVR5cGUpIHR5cGUsIG51bGwsIHJlc29sdmVkU2NoZW1hLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBiZWZvcmUgYWN0dWFsbHkgcHJvY2Vzc2luZyB0aGlzIG5vZGUsIHdlIG5lZWQgdG8gcmVjdXJzZSB0aHJvdWdoIHRoZSBiYXNlIHR5cGVzIGFuZCBhZGQgdGhlaXIKLSAgICAgICAgICAgIC8vIGNoaWxkcmVuIChzb21ldGltZXMgZXZlbiBwcmVzZXJ2aW5nIHRoZSBvcmRlcikgdG8gdGhlIG1ldGFpbmZvIGhvbGRlciBvZiB0aGlzIHR5cGUKLSAgICAgICAgICAgIC8vIHRoZSByZWFzb24gaXMgdGhhdCBmb3IgZXh0ZW5zaW9ucywgdGhlIHByZWZlcmVkIHdheSBpcyB0byBoYXZlIHRoZSBzZXF1ZW5jZXMgb2YgdGhlIGJhc2UgY2xhc3MKLSAgICAgICAgICAgIC8vKiBiZWZvcmUgKiB0aGUgc2VxdWVuY2Ugb2YgdGhlIGNoaWxkIGVsZW1lbnQuCi0gICAgICAgICAgICBjb3B5TWV0YUluZm9IaWVyYXJjaHkobWV0YUluZkhvbGRlciwgZXh0ZW5zaW9uLmdldEJhc2VUeXBlTmFtZSgpLCBwYXJlbnRTY2hlbWEpOwotCi0gICAgICAgICAgICAvL3Byb2Nlc3MgdGhlIHBhcnRpY2xlIG9mIHRoaXMgbm9kZQotICAgICAgICAgICAgaWYgKGV4dGVuc2lvbi5nZXRQYXJ0aWNsZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBwcm9jZXNzUGFydGljbGUoZXh0ZW5zaW9uLmdldEJhc2VUeXBlTmFtZSgpLGV4dGVuc2lvbi5nZXRQYXJ0aWNsZSgpLCBtZXRhSW5mSG9sZGVyLCBwYXJlbnRTY2hlbWEpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBwcm9jZXNzIGF0dHJpYnV0ZXMKLSAgICAgICAgICAgIC8vcHJvY2VzcyBhdHRyaWJ1dGVzIC0gZmlyc3QgbG9vayBmb3IgdGhlIGV4cGxpY2l0IGF0dHJpYnV0ZXMKLSAgICAgICAgICAgIHByb2Nlc3NBdHRyaWJ1dGVzKGV4dGVuc2lvbi5nZXRBdHRyaWJ1dGVzKCksbWV0YUluZkhvbGRlcixwYXJlbnRTY2hlbWEpOwotCi0gICAgICAgICAgICAvL3Byb2Nlc3MgYW55IGF0dHJpYnV0ZQotICAgICAgICAgICAgLy9zb21laG93IHRoZSB4bWwgc2NoZW1hIHBhcnNlciBkb2VzIG5vdCBzZWVtIHRvIHBpY2t1cCB0aGUgYW55IGF0dHJpYnV0ZSEhCi0gICAgICAgICAgICBYbWxTY2hlbWFBbnlBdHRyaWJ1dGUgYW55QXR0ID0gZXh0ZW5zaW9uLmdldEFueUF0dHJpYnV0ZSgpOwotICAgICAgICAgICAgaWYgKGFueUF0dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcHJvY2Vzc0FueUF0dHJpYnV0ZShtZXRhSW5mSG9sZGVyLCBhbnlBdHQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IGZpbmRDbGFzc05hbWUoZXh0ZW5zaW9uLmdldEJhc2VUeXBlTmFtZSgpLCBmYWxzZSk7Ci0KLSAgICAgICAgICAgIGlmICghd3JpdGVyLmdldERlZmF1bHRDbGFzc05hbWUoKS5lcXVhbHMoY2xhc3NOYW1lKSkgewotICAgICAgICAgICAgICAgIC8vdGhlIHBhcnRpY2xlIGhhcyBiZWVuIHByb2Nlc3NlZCwgSG93ZXZlciBzaW5jZSB0aGlzIGlzIGFuIGV4dGVuc2lvbiB3ZSBuZWVkIHRvCi0gICAgICAgICAgICAgICAgLy9hZGQgdGhlIGJhc2V0eXBlIGFzIGFuIGV4dGVuc2lvbiB0byB0aGUgY29tcGxleCB0eXBlIGNsYXNzLgotICAgICAgICAgICAgICAgIC8vIFRoZSBiYXNldHlwZSBoYXMgYmVlbiBwcm9jZXNzZWQgYWxyZWFkeQotICAgICAgICAgICAgICAgIG1ldGFJbmZIb2xkZXIuc2V0RXh0ZW5zaW9uKHRydWUpOwotICAgICAgICAgICAgICAgIG1ldGFJbmZIb2xkZXIuc2V0RXh0ZW5zaW9uQ2xhc3NOYW1lKGNsYXNzTmFtZSk7Ci0gICAgICAgICAgICAgICAgLy9Ob3RlICAtIHRoaXMgaXMgbm8gYXJyYXkhIHNvIHRoZSBhcnJheSBib29sZWFuIGlzIGZhbHNlCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoY29udGVudCBpbnN0YW5jZW9mIFhtbFNjaGVtYUNvbXBsZXhDb250ZW50UmVzdHJpY3Rpb24pIHsKLSAgICAgICAgICAgIFhtbFNjaGVtYUNvbXBsZXhDb250ZW50UmVzdHJpY3Rpb24gcmVzdHJpY3Rpb24gPSAoWG1sU2NoZW1hQ29tcGxleENvbnRlbnRSZXN0cmljdGlvbikgY29udGVudDsKLQotICAgICAgICAgICAgLy9wcm9jZXNzIHRoZSBiYXNlIHR5cGUgaWYgaXQgaGFzIG5vdCBiZWVuIHByb2Nlc3NlZCB5ZXQKLSAgICAgICAgICAgIGlmICghaXNBbHJlYWR5UHJvY2Vzc2VkKHJlc3RyaWN0aW9uLmdldEJhc2VUeXBlTmFtZSgpKSkgewotICAgICAgICAgICAgICAgIC8vcGljayB0aGUgcmVsZXZhbnQgYmFzZXR5cGUgZnJvbSB0aGUgc2NoZW1hIGFuZCBwcm9jZXNzIGl0Ci0gICAgICAgICAgICAgICAgWG1sU2NoZW1hIHJlc29sdmVkU2NoZW1hID0gZ2V0UGFyZW50U2NoZW1hKHBhcmVudFNjaGVtYSwgcmVzdHJpY3Rpb24uZ2V0QmFzZVR5cGVOYW1lKCksIENPTVBPTkVOVF9UWVBFKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWRTY2hlbWEgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24oImNhbiBub3QgZmluZCB0aGUgY29tcGxleCB0eXBlICIgKyByZXN0cmljdGlvbi5nZXRCYXNlVHlwZU5hbWUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBmcm9tIHRoZSBwYXJlbnQgdHlwZSAiICsgcGFyZW50U2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBYbWxTY2hlbWFUeXBlIHR5cGUgPSByZXNvbHZlZFNjaGVtYS5nZXRUeXBlQnlOYW1lKHJlc3RyaWN0aW9uLmdldEJhc2VUeXBlTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgaW5zdGFuY2VvZiBYbWxTY2hlbWFDb21wbGV4VHlwZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgWG1sU2NoZW1hQ29tcGxleFR5cGUgY29tcGxleFR5cGUgPSAoWG1sU2NoZW1hQ29tcGxleFR5cGUpIHR5cGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29tcGxleFR5cGUuZ2V0TmFtZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzTmFtZWRDb21wbGV4U2NoZW1hVHlwZShjb21wbGV4VHlwZSwgcmVzb2x2ZWRTY2hlbWEpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3RoaXMgaXMgbm90IHBvc3NpYmxlLiBUaGUgcmVzdHJpY3Rpb24gc2hvdWxkIGFsd2F5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaGF2ZSBhIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24oIlVubmFtZWQgY29tcGxleCB0eXBlIHVzZWQgaW4gcmVzdHJpY3Rpb24iKTsvL0ludGVybmF0aW9ubGl6ZSB0aGlzCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSBpbnN0YW5jZW9mIFhtbFNjaGVtYVNpbXBsZVR5cGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbigiTm90IGEgdmFsaWQgcmVzdHJpY3Rpb24sIGNvbXBsZXggY29udGVudCByZXN0cmljdGlvbiBiYXNlIHR5cGUgY2Fubm90IGJlIGEgc2ltcGxlIHR5cGUuIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNvcHlNZXRhSW5mb0hpZXJhcmNoeShtZXRhSW5mSG9sZGVyLCByZXN0cmljdGlvbi5nZXRCYXNlVHlwZU5hbWUoKSwgcGFyZW50U2NoZW1hKTsKLQotICAgICAgICAgICAgLy9wcm9jZXNzIHRoZSBwYXJ0aWNsZSBvZiB0aGlzIG5vZGUKLSAgICAgICAgICAgIHByb2Nlc3NQYXJ0aWNsZShyZXN0cmljdGlvbi5nZXRCYXNlVHlwZU5hbWUoKSxyZXN0cmljdGlvbi5nZXRQYXJ0aWNsZSgpLCBtZXRhSW5mSG9sZGVyLCBwYXJlbnRTY2hlbWEpOwotCi0gICAgICAgICAgICAvL3Byb2Nlc3MgYXR0cmlidXRlcyAtIGZpcnN0IGxvb2sgZm9yIHRoZSBleHBsaWNpdCBhdHRyaWJ1dGVzCi0gICAgICAgICAgICBwcm9jZXNzQXR0cmlidXRlcyhyZXN0cmljdGlvbi5nZXRBdHRyaWJ1dGVzKCksbWV0YUluZkhvbGRlcixwYXJlbnRTY2hlbWEpOwotCi0gICAgICAgICAgICAvL3Byb2Nlc3MgYW55IGF0dHJpYnV0ZQotICAgICAgICAgICAgLy9zb21laG93IHRoZSB4bWwgc2NoZW1hIHBhcnNlciBkb2VzIG5vdCBzZWVtIHRvIHBpY2t1cCB0aGUgYW55IGF0dHJpYnV0ZSEhCi0gICAgICAgICAgICBYbWxTY2hlbWFBbnlBdHRyaWJ1dGUgYW55QXR0ID0gcmVzdHJpY3Rpb24uZ2V0QW55QXR0cmlidXRlKCk7Ci0gICAgICAgICAgICBpZiAoYW55QXR0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBwcm9jZXNzQW55QXR0cmlidXRlKG1ldGFJbmZIb2xkZXIsIGFueUF0dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gZmluZENsYXNzTmFtZShyZXN0cmljdGlvbi5nZXRCYXNlVHlwZU5hbWUoKSwgZmFsc2UpOwotCi0gICAgICAgICAgICBpZiAoIXdyaXRlci5nZXREZWZhdWx0Q2xhc3NOYW1lKCkuZXF1YWxzKGNsYXNzTmFtZSkpIHsKLSAgICAgICAgICAgICAgICBtZXRhSW5mSG9sZGVyLnNldFJlc3RyaWN0aW9uKHRydWUpOwotICAgICAgICAgICAgICAgIG1ldGFJbmZIb2xkZXIuc2V0UmVzdHJpY3Rpb25DbGFzc05hbWUoZmluZENsYXNzTmFtZShyZXN0cmljdGlvbi5nZXRCYXNlVHlwZU5hbWUoKSwgZmFsc2UpKTsKLSAgICAgICAgICAgICAgICAvL05vdGUgIC0gdGhpcyBpcyBubyBhcnJheSEgc28gdGhlIGFycmF5IGJvb2xlYW4gaXMgZmFsc2UKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlY3Vyc2l2ZSBtZXRob2QgdG8gcG9wdWxhdGUgdGhlIG1ldGFpbmZvIGhvbGRlcnMgd2l0aCBpbmZvIGZyb20gdGhlIGJhc2UgdHlwZXMKLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXRhSW5mSG9sZGVyCi0gICAgICogQHBhcmFtIGJhc2VUeXBlTmFtZQotICAgICAqIEBwYXJhbSBwYXJlbnRTY2hlbWEKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY29weU1ldGFJbmZvSGllcmFyY2h5KEJlYW5Xcml0ZXJNZXRhSW5mb0hvbGRlciBtZXRhSW5mSG9sZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUU5hbWUgYmFzZVR5cGVOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWG1sU2NoZW1hIHBhcmVudFNjaGVtYSkKLSAgICAgICAgICAgIHRocm93cyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgWG1sU2NoZW1hIHJlc29sdmVkU2NoZW1hID0gZ2V0UGFyZW50U2NoZW1hKHBhcmVudFNjaGVtYSxiYXNlVHlwZU5hbWUsQ09NUE9ORU5UX1RZUEUpOwotICAgICAgICBpZiAocmVzb2x2ZWRTY2hlbWEgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVtYUNvbXBpbGF0aW9uRXhjZXB0aW9uKCJjYW4gbm90IGZpbmQgdHlwZSAiICsgYmFzZVR5cGVOYW1lCi0gICAgICAgICAgICAgICAgICAgICsgIiBmcm9tIHRoZSBwYXJlbnQgc2NoZW1hICIgKyBwYXJlbnRTY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgWG1sU2NoZW1hVHlwZSB0eXBlID0gcmVzb2x2ZWRTY2hlbWEuZ2V0VHlwZUJ5TmFtZShiYXNlVHlwZU5hbWUpOwotICAgICAgICAgICAgQmVhbldyaXRlck1ldGFJbmZvSG9sZGVyIGJhc2VNZXRhSW5mb0hvbGRlciA9IChCZWFuV3JpdGVyTWV0YUluZm9Ib2xkZXIpCi0gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZFR5cGVNZXRhSW5mb01hcC5nZXQoYmFzZVR5cGVOYW1lKTsKLQotCi0gICAgICAgICAgICBpZiAoYmFzZU1ldGFJbmZvSG9sZGVyICE9IG51bGwpIHsKLQotICAgICAgICAgICAgICAgIC8vIHNlZSB3aGV0aGVyIHRoaXMgdHlwZSBpcyBhbHNvIGV4dGVuZGVkIGZyb20gc29tZSBvdGhlciB0eXBlIGZpcnN0Ci0gICAgICAgICAgICAgICAgLy8gaWYgc28gcHJvY2VlZCB0byBzZXQgdGhlaXIgcGFyZW50cyBhcyB3ZWxsLgotICAgICAgICAgICAgICAgIGlmICh0eXBlIGluc3RhbmNlb2YgWG1sU2NoZW1hQ29tcGxleFR5cGUpIHsKLSAgICAgICAgICAgICAgICAgICAgWG1sU2NoZW1hQ29tcGxleFR5cGUgY29tcGxleFR5cGUgPSAoWG1sU2NoZW1hQ29tcGxleFR5cGUpIHR5cGU7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb21wbGV4VHlwZS5nZXRDb250ZW50TW9kZWwoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBYbWxTY2hlbWFDb250ZW50TW9kZWwgY29udGVudCA9IGNvbXBsZXhUeXBlLmdldENvbnRlbnRNb2RlbCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBYbWxTY2hlbWFDb21wbGV4Q29udGVudCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhtbFNjaGVtYUNvbXBsZXhDb250ZW50IGNvbXBsZXhDb250ZW50ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChYbWxTY2hlbWFDb21wbGV4Q29udGVudCkgY29udGVudDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29tcGxleENvbnRlbnQuZ2V0Q29udGVudCgpIGluc3RhbmNlb2YgWG1sU2NoZW1hQ29tcGxleENvbnRlbnRFeHRlbnNpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWG1sU2NoZW1hQ29tcGxleENvbnRlbnRFeHRlbnNpb24gZXh0ZW5zaW9uID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoWG1sU2NoZW1hQ29tcGxleENvbnRlbnRFeHRlbnNpb24pIGNvbXBsZXhDb250ZW50LmdldENvbnRlbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9yZWN1cnNpdmVseSBjYWxsIHRoZSBjb3B5TWV0YUluZm9IaWVyYXJjaHkgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcHlNZXRhSW5mb0hpZXJhcmNoeShiYXNlTWV0YUluZm9Ib2xkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uLmdldEJhc2VUeXBlTmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVkU2NoZW1hKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29tcGxleENvbnRlbnQuZ2V0Q29udGVudCgpIGluc3RhbmNlb2YgWG1sU2NoZW1hQ29tcGxleENvbnRlbnRSZXN0cmljdGlvbikgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhtbFNjaGVtYUNvbXBsZXhDb250ZW50UmVzdHJpY3Rpb24gcmVzdHJpY3Rpb24gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChYbWxTY2hlbWFDb21wbGV4Q29udGVudFJlc3RyaWN0aW9uKSBjb21wbGV4Q29udGVudC5nZXRDb250ZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vcmVjdXJzaXZlbHkgY2FsbCB0aGUgY29weU1ldGFJbmZvSGllcmFyY2h5IG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3B5TWV0YUluZm9IaWVyYXJjaHkoYmFzZU1ldGFJbmZvSG9sZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0aW9uLmdldEJhc2VUeXBlTmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVkU2NoZW1hKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFDb21waWxlck1lc3NhZ2VzLmdldE1lc3NhZ2UoInNjaGVtYS51bmtub3duY29udGVudGVycm9yIikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb250ZW50IGluc3RhbmNlb2YgWG1sU2NoZW1hU2ltcGxlQ29udGVudCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYUNvbXBpbGVyTWVzc2FnZXMuZ2V0TWVzc2FnZSgic2NoZW1hLnVuc3VwcG9ydGVkY29udGVudGVycm9yIiwgIlNpbXBsZSBDb250ZW50IikpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFDb21waWxlck1lc3NhZ2VzLmdldE1lc3NhZ2UoInNjaGVtYS51bmtub3duY29udGVudGVycm9yIikpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vRG8gdGhlIGFjdHVhbCBwYXJlbnQgc2V0dGluZwotICAgICAgICAgICAgICAgICAgICBtZXRhSW5mSG9sZGVyLnNldEFzUGFyZW50KGJhc2VNZXRhSW5mb0hvbGRlcik7Ci0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBYbWxTY2hlbWFTaW1wbGVUeXBlKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBjb3B5IHRoZSB1aW9uIGRhdGEgaWYgdGhlIHBhcmVudCBzaW1wbGUgdHlwZSByZXN0cmljdGlvbgotICAgICAgICAgICAgICAgICAgICAvLyBpcyBhbiB1bmlvbgotICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIHVuaW9uIGF0dHJpYnV0ZSBpcyBjb3BpZWQgZnJvbSB0aGUgY2hpbGQgdG8gcGFyZW50IHRvIGdlbnJhdGUgdGhlIHBhcmVudAotICAgICAgICAgICAgICAgICAgICAvLyBjb2RlIGFzIHVuaW9uCi0gICAgICAgICAgICAgICAgICAgIGlmIChiYXNlTWV0YUluZm9Ib2xkZXIuaXNVbmlvbigpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZXRhSW5mSG9sZGVyLnNldFVuaW9uKHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgTWFwIG1lbWJlclR5cGVzID0gYmFzZU1ldGFJbmZvSG9sZGVyLmdldE1lbWJlclR5cGVzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgcW5hbWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBtZW1iZXJUeXBlcy5rZXlTZXQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBxbmFtZSA9IGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFJbmZIb2xkZXIuYWRkTWVtYmVyVHlwZSgoUU5hbWUpIHFuYW1lLCAoU3RyaW5nKSBtZW1iZXJUeXBlcy5nZXQocW5hbWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gY29weSB0aGUgbGlzdCB0eXBlIGRhdGEgdG8gcGFyZW50IGlmIGl0IGlzIGEgbGlzdAotICAgICAgICAgICAgICAgICAgICBpZiAoYmFzZU1ldGFJbmZvSG9sZGVyLmlzTGlzdCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZXRhSW5mSG9sZGVyLnNldExpc3QodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZXRhSW5mSG9sZGVyLnNldEl0ZW1UeXBlUU5hbWUoYmFzZU1ldGFJbmZvSG9sZGVyLmdldEl0ZW1UeXBlUU5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZXRhSW5mSG9sZGVyLnNldEl0ZW1UeXBlQ2xhc3NOYW1lKGJhc2VNZXRhSW5mb0hvbGRlci5nZXRJdGVtVHlwZUNsYXNzTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtZXRhSW5mSG9sZGVyLnNldEFzUGFyZW50KGJhc2VNZXRhSW5mb0hvbGRlcik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gc2ltcGxlQ29udGVudAotICAgICAqIEBwYXJhbSBtZXRhSW5mSG9sZGVyCi0gICAgICogQHRocm93cyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzU2ltcGxlQ29udGVudChYbWxTY2hlbWFTaW1wbGVDb250ZW50IHNpbXBsZUNvbnRlbnQsIEJlYW5Xcml0ZXJNZXRhSW5mb0hvbGRlciBtZXRhSW5mSG9sZGVyLCBYbWxTY2hlbWEgcGFyZW50U2NoZW1hKQotICAgICAgICAgICAgdGhyb3dzIFNjaGVtYUNvbXBpbGF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgWG1sU2NoZW1hQ29udGVudCBjb250ZW50OwotICAgICAgICBjb250ZW50ID0gc2ltcGxlQ29udGVudC5nZXRDb250ZW50KCk7Ci0gICAgICAgIGlmIChjb250ZW50IGluc3RhbmNlb2YgWG1sU2NoZW1hU2ltcGxlQ29udGVudEV4dGVuc2lvbikgewotICAgICAgICAgICAgWG1sU2NoZW1hU2ltcGxlQ29udGVudEV4dGVuc2lvbiBleHRlbnNpb24gPSAoWG1sU2NoZW1hU2ltcGxlQ29udGVudEV4dGVuc2lvbikgY29udGVudDsKLQotICAgICAgICAgICAgLy9wcm9jZXNzIHRoZSBiYXNlIHR5cGUgaWYgaXQgaGFzIG5vdCBiZWVuIHByb2Nlc3NlZCB5ZXQKLSAgICAgICAgICAgIGlmICghaXNBbHJlYWR5UHJvY2Vzc2VkKGV4dGVuc2lvbi5nZXRCYXNlVHlwZU5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAvL3BpY2sgdGhlIHJlbGV2YW50IGJhc2V0eXBlIGZyb20gdGhlIHNjaGVtYSBhbmQgcHJvY2VzcyBpdAotICAgICAgICAgICAgICAgIFhtbFNjaGVtYSByZXNvbHZlZFNjaGVtYSA9IGdldFBhcmVudFNjaGVtYShwYXJlbnRTY2hlbWEsIGV4dGVuc2lvbi5nZXRCYXNlVHlwZU5hbWUoKSwgQ09NUE9ORU5UX1RZUEUpOwotICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlZFNjaGVtYSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbigiY2FuIG5vdCBmaW5kIHR5cGUgIiArIGV4dGVuc2lvbi5nZXRCYXNlVHlwZU5hbWUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBmcm9tIHRoZSBwYXJlbnQgc2NoZW1hICIgKyBwYXJlbnRTY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIFhtbFNjaGVtYVR5cGUgdHlwZSA9IHJlc29sdmVkU2NoZW1hLmdldFR5cGVCeU5hbWUoZXh0ZW5zaW9uLmdldEJhc2VUeXBlTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgaW5zdGFuY2VvZiBYbWxTY2hlbWFDb21wbGV4VHlwZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgWG1sU2NoZW1hQ29tcGxleFR5cGUgY29tcGxleFR5cGUgPSAoWG1sU2NoZW1hQ29tcGxleFR5cGUpIHR5cGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29tcGxleFR5cGUuZ2V0TmFtZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzTmFtZWRDb21wbGV4U2NoZW1hVHlwZShjb21wbGV4VHlwZSwgcmVzb2x2ZWRTY2hlbWEpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3RoaXMgaXMgbm90IHBvc3NpYmxlLiBUaGUgZXh0ZW5zaW9uIHNob3VsZCBhbHdheXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2hhdmUgYSBuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVtYUNvbXBpbGF0aW9uRXhjZXB0aW9uKCJVbm5hbWVkIGNvbXBsZXggdHlwZSB1c2VkIGluIGV4dGVuc2lvbiIpOy8vSW50ZXJuYXRpb25saXplIHRoaXMKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlIGluc3RhbmNlb2YgWG1sU2NoZW1hU2ltcGxlVHlwZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy9wcm9jZXNzIHNpbXBsZSB0eXBlCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzU2ltcGxlU2NoZW1hVHlwZSgoWG1sU2NoZW1hU2ltcGxlVHlwZSkgdHlwZSwgbnVsbCwgcmVzb2x2ZWRTY2hlbWEsIG51bGwpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vcHJvY2VzcyBleHRlbnNpb24gYmFzZSB0eXBlCi0gICAgICAgICAgICBwcm9jZXNzU2ltcGxlRXh0ZW5zaW9uQmFzZVR5cGUoZXh0ZW5zaW9uLmdldEJhc2VUeXBlTmFtZSgpLCBtZXRhSW5mSG9sZGVyLCBwYXJlbnRTY2hlbWEpOwotCi0gICAgICAgICAgICAvL3Byb2Nlc3MgYXR0cmlidXRlcwotICAgICAgICAgICAgWG1sU2NoZW1hT2JqZWN0Q29sbGVjdGlvbiBhdHRyaWJzID0gZXh0ZW5zaW9uLmdldEF0dHJpYnV0ZXMoKTsKLSAgICAgICAgICAgIEl0ZXJhdG9yIGF0dHJpYkl0ZXJhdG9yID0gYXR0cmlicy5nZXRJdGVyYXRvcigpOwotICAgICAgICAgICAgd2hpbGUgKGF0dHJpYkl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIE9iamVjdCBhdHRyID0gYXR0cmliSXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgIGlmIChhdHRyIGluc3RhbmNlb2YgWG1sU2NoZW1hQXR0cmlidXRlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NBdHRyaWJ1dGUoKFhtbFNjaGVtYUF0dHJpYnV0ZSkgYXR0ciwgbWV0YUluZkhvbGRlciwgcGFyZW50U2NoZW1hKTsKLQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy9wcm9jZXNzIGFueSBhdHRyaWJ1dGUKLSAgICAgICAgICAgIFhtbFNjaGVtYUFueUF0dHJpYnV0ZSBhbnlBdHQgPSBleHRlbnNpb24uZ2V0QW55QXR0cmlidXRlKCk7Ci0gICAgICAgICAgICBpZiAoYW55QXR0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBwcm9jZXNzQW55QXR0cmlidXRlKG1ldGFJbmZIb2xkZXIsIGFueUF0dCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBlbHNlIGlmIChjb250ZW50IGluc3RhbmNlb2YgWG1sU2NoZW1hU2ltcGxlQ29udGVudFJlc3RyaWN0aW9uKSB7Ci0gICAgICAgICAgICBYbWxTY2hlbWFTaW1wbGVDb250ZW50UmVzdHJpY3Rpb24gcmVzdHJpY3Rpb24gPSAoWG1sU2NoZW1hU2ltcGxlQ29udGVudFJlc3RyaWN0aW9uKSBjb250ZW50OwotCi0gICAgICAgICAgICAvL3Byb2Nlc3MgdGhlIGJhc2UgdHlwZSBpZiBpdCBoYXMgbm90IGJlZW4gcHJvY2Vzc2VkIHlldAotICAgICAgICAgICAgaWYgKCFpc0FscmVhZHlQcm9jZXNzZWQocmVzdHJpY3Rpb24uZ2V0QmFzZVR5cGVOYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgLy9waWNrIHRoZSByZWxldmFudCBiYXNldHlwZSBmcm9tIHRoZSBzY2hlbWEgYW5kIHByb2Nlc3MgaXQKLSAgICAgICAgICAgICAgICBYbWxTY2hlbWEgcmVzb2x2ZWRTY2hlbWEgPSBnZXRQYXJlbnRTY2hlbWEocGFyZW50U2NoZW1hLCByZXN0cmljdGlvbi5nZXRCYXNlVHlwZU5hbWUoKSwgQ09NUE9ORU5UX1RZUEUpOwotICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlZFNjaGVtYSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbigiY2FuIG5vdCBmaW5kIHR5cGUgIiArIHJlc3RyaWN0aW9uLmdldEJhc2VUeXBlTmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGZyb20gdGhlIHBhcmVudCBzY2hlbWEgIiArIHBhcmVudFNjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgWG1sU2NoZW1hVHlwZSB0eXBlID0gcmVzb2x2ZWRTY2hlbWEuZ2V0VHlwZUJ5TmFtZShyZXN0cmljdGlvbi5nZXRCYXNlVHlwZU5hbWUoKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgaW5zdGFuY2VvZiBYbWxTY2hlbWFDb21wbGV4VHlwZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgWG1sU2NoZW1hQ29tcGxleFR5cGUgY29tcGxleFR5cGUgPSAoWG1sU2NoZW1hQ29tcGxleFR5cGUpIHR5cGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29tcGxleFR5cGUuZ2V0TmFtZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzTmFtZWRDb21wbGV4U2NoZW1hVHlwZShjb21wbGV4VHlwZSwgcmVzb2x2ZWRTY2hlbWEpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3RoaXMgaXMgbm90IHBvc3NpYmxlLiBUaGUgZXh0ZW5zaW9uIHNob3VsZCBhbHdheXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2hhdmUgYSBuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVtYUNvbXBpbGF0aW9uRXhjZXB0aW9uKCJVbm5hbWVkIGNvbXBsZXggdHlwZSB1c2VkIGluIHJlc3RyaWN0aW9uIik7Ly9JbnRlcm5hdGlvbmxpemUgdGhpcwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBYbWxTY2hlbWFTaW1wbGVUeXBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL3Byb2Nlc3Mgc2ltcGxlIHR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NTaW1wbGVTY2hlbWFUeXBlKChYbWxTY2hlbWFTaW1wbGVUeXBlKSB0eXBlLCBudWxsLCByZXNvbHZlZFNjaGVtYSwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vcHJvY2VzcyByZXN0cmljdGlvbiBiYXNlIHR5cGUKLSAgICAgICAgICAgIHByb2Nlc3NTaW1wbGVSZXN0cmljdGlvbkJhc2VUeXBlKHJlc3RyaWN0aW9uLmdldEJhc2VUeXBlTmFtZSgpLAotICAgICAgICAgICAgICAgICAgICByZXN0cmljdGlvbi5nZXRCYXNlVHlwZU5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgbWV0YUluZkhvbGRlciwKLSAgICAgICAgICAgICAgICAgICAgcGFyZW50U2NoZW1hKTsKLSAgICAgICAgICAgIG1ldGFJbmZIb2xkZXIuc2V0U2ltcGxlKHRydWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJvY2VzcyBTaW1wbGUgRXh0ZW5zaW9uIEJhc2UgVHlwZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBleHRCYXNlVHlwZQotICAgICAqIEBwYXJhbSBtZXRhSW5mSG9sZGVyCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcHJvY2Vzc1NpbXBsZUV4dGVuc2lvbkJhc2VUeXBlKFFOYW1lIGV4dEJhc2VUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCZWFuV3JpdGVyTWV0YUluZm9Ib2xkZXIgbWV0YUluZkhvbGRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWG1sU2NoZW1hIHBhcmVudFNjaGVtYSkgdGhyb3dzIFNjaGVtYUNvbXBpbGF0aW9uRXhjZXB0aW9uIHsKLQotICAgICAgICAvL2ZpbmQgdGhlIGNsYXNzIG5hbWUKLSAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IGZpbmRDbGFzc05hbWUoZXh0QmFzZVR5cGUsIGZhbHNlKTsKLQotICAgICAgICAvLyBpZiB0aGUgYmFzZSB0eXBlIGlzIGFuIHByaW1pdGl2ZSB0aGVuIHdlIGRvIG5vdCBoYXZlIHRvIGV4dGVuZCB0aGVtCi0gICAgICAgIC8vIGFuZCBpdCBpcyBjb25zaWRlcmVkIGFzIGEgcHJvcGVydHkKLSAgICAgICAgLy8gb24gdGhlIG90aGVyaGFuZCBpZiB0aGUgYmFzZSB0eXBlIGlzIGFuIGdlbmVyYXRlZCBjbGFzcyB0aGVuIHdlIGhhdmUgdG8KLSAgICAgICAgLy8gZXh0ZW5kIGZyb20gaXQKLQotICAgICAgICBpZiAoYmFzZVNjaGVtYVR5cGVNYXAuY29udGFpbnNLZXkoZXh0QmFzZVR5cGUpKSB7Ci0gICAgICAgICAgICAvL3RoaXMgbWVhbnMgdGhlIHNjaGVtYSB0eXBlIGFjdHVhbGx5IHJldHVybnMgYSBkaWZmZXJlbnQgUU5hbWUKLSAgICAgICAgICAgIGlmIChjaGFuZ2VkVHlwZU1hcC5jb250YWluc0tleShleHRCYXNlVHlwZSkpIHsKLSAgICAgICAgICAgICAgICBtZXRhSW5mSG9sZGVyLnJlZ2lzdGVyTWFwcGluZyhleHRCYXNlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChRTmFtZSkgY2hhbmdlZFR5cGVNYXAuZ2V0KGV4dEJhc2VUeXBlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZSwgU2NoZW1hQ29uc3RhbnRzLkVMRU1FTlRfVFlQRSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1ldGFJbmZIb2xkZXIucmVnaXN0ZXJNYXBwaW5nKGV4dEJhc2VUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgZXh0QmFzZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUsIFNjaGVtYUNvbnN0YW50cy5FTEVNRU5UX1RZUEUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbWV0YUluZkhvbGRlci5zZXRTaW1wbGUodHJ1ZSk7Ci0gICAgICAgICAgICAvLyB3ZSBoYXZlIGFscmVhZHkgcHJvY2VzcyB3aGVuIGl0IGNvbWVzIHRvIHRoaXMgcGxhY2UKLSAgICAgICAgfSBlbHNlIGlmIChwcm9jZXNzZWRUeXBlbWFwLmNvbnRhaW5zS2V5KGV4dEJhc2VUeXBlKSkgewotICAgICAgICAgICAgLy9zZXQgdGhlIGV4dGVuc2lvbiBiYXNlIGNsYXNzIG5hbWUKLSAgICAgICAgICAgIFhtbFNjaGVtYSByZXNvbHZlZFNjaGVtYSA9IGdldFBhcmVudFNjaGVtYShwYXJlbnRTY2hlbWEsZXh0QmFzZVR5cGUsQ09NUE9ORU5UX1RZUEUpOwotICAgICAgICAgICAgaWYgKHJlc29sdmVkU2NoZW1hID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24oImNhbiBub3QgZmluZCB0aGUgdHlwZSAiICsgZXh0QmFzZVR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiBmcm9tIHRoZSBwYXJlbnQgc2NoZW1hICIgKyBwYXJlbnRTY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBYbWxTY2hlbWFUeXBlIHR5cGUgPSByZXNvbHZlZFNjaGVtYS5nZXRUeXBlQnlOYW1lKGV4dEJhc2VUeXBlKTsKLSAgICAgICAgICAgICAgICBpZiAodHlwZSBpbnN0YW5jZW9mIFhtbFNjaGVtYVNpbXBsZVR5cGUpIHsKLSAgICAgICAgICAgICAgICAgICAgbWV0YUluZkhvbGRlci5zZXRTaW1wbGUodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1ldGFJbmZIb2xkZXIuc2V0RXh0ZW5zaW9uKHRydWUpOwotICAgICAgICAgICAgICAgICAgICBtZXRhSW5mSG9sZGVyLnNldEV4dGVuc2lvbkNsYXNzTmFtZShjbGFzc05hbWUpOwotCi0gICAgICAgICAgICAgICAgICAgIGNvcHlNZXRhSW5mb0hpZXJhcmNoeShtZXRhSW5mSG9sZGVyLCBleHRCYXNlVHlwZSwgcmVzb2x2ZWRTY2hlbWEpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSBpbnN0YW5jZW9mIFhtbFNjaGVtYUNvbXBsZXhUeXBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIFhtbFNjaGVtYUNvbXBsZXhUeXBlIGNvbXBsZXhUeXBlID0gKFhtbFNjaGVtYUNvbXBsZXhUeXBlKSB0eXBlOwotICAgICAgICAgICAgICAgICAgICBpZiAoY29tcGxleFR5cGUuZ2V0Q29udGVudE1vZGVsKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG8gbm90IHNldCBhcyBhIHNpbXBsZSB0eXBlIHNpbmNlIHdlIHdhbnQgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByaW50IHRoZSBlbGVtZW50IG5hbWVzCi0gICAgICAgICAgICAgICAgICAgICAgICBtZXRhSW5mSG9sZGVyLnNldEV4dGVuc2lvbih0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFJbmZIb2xkZXIuc2V0RXh0ZW5zaW9uQ2xhc3NOYW1lKGNsYXNzTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb3B5TWV0YUluZm9IaWVyYXJjaHkobWV0YUluZkhvbGRlciwgZXh0QmFzZVR5cGUsIHJlc29sdmVkU2NoZW1hKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbWV0YUluZkhvbGRlci5zZXRTaW1wbGUodHJ1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvL2dldCB0aGUgYmluYXJ5IHN0YXRlIGFuZCBhZGQgdGhhdCB0byB0aGUgc3RhdHVzIG1hcAotICAgICAgICBpZiAoaXNCaW5hcnkoZXh0QmFzZVR5cGUpKSB7Ci0gICAgICAgICAgICBtZXRhSW5mSG9sZGVyLmFkZHRTdGF0dXMoZXh0QmFzZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgIFNjaGVtYUNvbnN0YW50cy5CSU5BUllfVFlQRSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcm9jZXNzIFNpbXBsZSBSZXN0cmljdGlvbiBCYXNlIFR5cGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVzQmFzZVR5cGUKLSAgICAgKiBAcGFyYW0gbWV0YUluZkhvbGRlcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NTaW1wbGVSZXN0cmljdGlvbkJhc2VUeXBlKFFOYW1lIHFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFOYW1lIHJlc0Jhc2VUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJlYW5Xcml0ZXJNZXRhSW5mb0hvbGRlciBtZXRhSW5mSG9sZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhtbFNjaGVtYSBwYXJlbnRTY2hlbWEpIHRocm93cyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgLy9maW5kIHRoZSBjbGFzcyBuYW1lCi0gICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBmaW5kQ2xhc3NOYW1lKHJlc0Jhc2VUeXBlLCBmYWxzZSk7Ci0KLSAgICAgICAgLy90aGlzIG1lYW5zIHRoZSBzY2hlbWEgdHlwZSBhY3R1YWxseSByZXR1cm5zIGEgZGlmZmVyZW50IFFOYW1lCi0gICAgICAgIGlmIChiYXNlU2NoZW1hVHlwZU1hcC5jb250YWluc0tleShyZXNCYXNlVHlwZSkpIHsKLSAgICAgICAgICAgIGlmIChjaGFuZ2VkVHlwZU1hcC5jb250YWluc0tleShyZXNCYXNlVHlwZSkpIHsKLSAgICAgICAgICAgICAgICBtZXRhSW5mSG9sZGVyLnJlZ2lzdGVyTWFwcGluZyhxTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChRTmFtZSkgY2hhbmdlZFR5cGVNYXAuZ2V0KHJlc0Jhc2VUeXBlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZSwgU2NoZW1hQ29uc3RhbnRzLkVMRU1FTlRfVFlQRSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1ldGFJbmZIb2xkZXIucmVnaXN0ZXJNYXBwaW5nKHFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgcmVzQmFzZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUsIFNjaGVtYUNvbnN0YW50cy5FTEVNRU5UX1RZUEUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHByb2Nlc3NlZFR5cGVtYXAuY29udGFpbnNLZXkocmVzQmFzZVR5cGUpKSB7Ci0gICAgICAgICAgICAvL3RoaXMgaXMgbm90IGEgc3RhbmRhcmVkIHR5cGUKLSAgICAgICAgICAgIC8vIHNvIHRoZSBwYXJlbnQgY2xhc3MgbXVzdCBleHRlbmQgaXQKLSAgICAgICAgICAgIG1ldGFJbmZIb2xkZXIuc2V0U2ltcGxlKHRydWUpOwotICAgICAgICAgICAgbWV0YUluZkhvbGRlci5zZXRSZXN0cmljdGlvbih0cnVlKTsKLSAgICAgICAgICAgIG1ldGFJbmZIb2xkZXIuc2V0UmVzdHJpY3Rpb25DbGFzc05hbWUoY2xhc3NOYW1lKTsKLSAgICAgICAgICAgIGNvcHlNZXRhSW5mb0hpZXJhcmNoeShtZXRhSW5mSG9sZGVyLCByZXNCYXNlVHlwZSwgcGFyZW50U2NoZW1hKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1ldGFJbmZIb2xkZXIuc2V0UmVzdHJpY3Rpb25CYXNlVHlwZShyZXNCYXNlVHlwZSk7Ci0KLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByb2Nlc3MgRmFjZXRzLgotICAgICAqCi0gICAgICogQHBhcmFtIG1ldGFJbmZIb2xkZXIKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0ZhY2V0cyhYbWxTY2hlbWFTaW1wbGVUeXBlUmVzdHJpY3Rpb24gcmVzdHJpY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmVhbldyaXRlck1ldGFJbmZvSG9sZGVyIG1ldGFJbmZIb2xkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWG1sU2NoZW1hIHBhcmVudFNjaGVtYSkgewotCi0gICAgICAgIFhtbFNjaGVtYU9iamVjdENvbGxlY3Rpb24gZmFjZXRzID0gcmVzdHJpY3Rpb24uZ2V0RmFjZXRzKCk7Ci0gICAgICAgIEl0ZXJhdG9yIGZhY2V0SXRlcmF0b3IgPSBmYWNldHMuZ2V0SXRlcmF0b3IoKTsKLQotICAgICAgICB3aGlsZSAoZmFjZXRJdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIE9iamVjdCBvYmogPSBmYWNldEl0ZXJhdG9yLm5leHQoKTsKLQotICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFhtbFNjaGVtYVBhdHRlcm5GYWNldCkgewotICAgICAgICAgICAgICAgIFhtbFNjaGVtYVBhdHRlcm5GYWNldCBwYXR0ZXJuID0gKFhtbFNjaGVtYVBhdHRlcm5GYWNldCkgb2JqOwotICAgICAgICAgICAgICAgIC8vIHNvbWUgcGF0dGVybnMgY29udGFpbiBcIHNvIHdlIGhhdmUgdG8gcmVwbGFjZSB0aGVtCi0gICAgICAgICAgICAgICAgU3RyaW5nIHBhdHRlcm5TdHJpbmcgPSBwYXR0ZXJuLmdldFZhbHVlKCkudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAvLyByZXBsYWNlIGJhY2t3b3JkIHNsYXNoZXMKLSAgICAgICAgICAgICAgICBwYXR0ZXJuU3RyaW5nID0gcGF0dGVyblN0cmluZy5yZXBsYWNlQWxsKCJcXFxcIiwgIlxcXFxcXFxcIik7Ci0gICAgICAgICAgICAgICAgaWYgKChtZXRhSW5mSG9sZGVyLmdldFBhdHRlcm5GYWNldCgpICE9IG51bGwpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAobWV0YUluZkhvbGRlci5nZXRQYXR0ZXJuRmFjZXQoKS50cmltKCkubGVuZ3RoKCkgPiAwKSl7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGkuZSB0aGVyZSBpcyBhIHBhdHRlcm4gZmFjZXNldAotICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuU3RyaW5nID0gbWV0YUluZkhvbGRlci5nZXRQYXR0ZXJuRmFjZXQoKS50cmltKCkgKyAifCIgKyBwYXR0ZXJuU3RyaW5nOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtZXRhSW5mSG9sZGVyLnNldFBhdHRlcm5GYWNldChwYXR0ZXJuU3RyaW5nKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgWG1sU2NoZW1hRW51bWVyYXRpb25GYWNldCkgewotICAgICAgICAgICAgICAgIFhtbFNjaGVtYUVudW1lcmF0aW9uRmFjZXQgZW51bWVyYXRpb24gPSAoWG1sU2NoZW1hRW51bWVyYXRpb25GYWNldCkgb2JqOwotICAgICAgICAgICAgICAgIGlmIChyZXN0cmljdGlvbi5nZXRCYXNlVHlwZU5hbWUoKS5lcXVhbHMoU2NoZW1hQ29uc3RhbnRzLlhTRF9RTkFNRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBwcm9jZXNzIHRoZSBxbmFtZSBoZXJlIGFuZCBzaG91ZCBmaW5kIHRoZSBsb2NhbCBwYXJ0IGFuZCBuYW1lc3BhY2UgdXJpCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IGVudW1lcmF0aW9uLmdldFZhbHVlKCkudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHByZWZpeCA9IHZhbHVlLnN1YnN0cmluZygwLCB2YWx1ZS5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbG9jYWxQYXJ0ID0gdmFsdWUuc3Vic3RyaW5nKHZhbHVlLmluZGV4T2YoIjoiKSArIDEpOwotCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lc3BhY2VVcmkgPSBwYXJlbnRTY2hlbWEuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAvLyBzZXQgdGhlIHN0cmluZyB0byBzdWl0ZSBmb3IgdGhlIGNvbnZlcnRRbmFtZSBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHFOYW1lU3RyaW5nID0gdmFsdWUgKyAiXCIsIFwiIiArIG5hbWVzcGFjZVVyaTsKLSAgICAgICAgICAgICAgICAgICAgbWV0YUluZkhvbGRlci5hZGRFbnVtRmFjZXQocU5hbWVTdHJpbmcpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1ldGFJbmZIb2xkZXIuYWRkRW51bUZhY2V0KGVudW1lcmF0aW9uLmdldFZhbHVlKCkudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFhtbFNjaGVtYUxlbmd0aEZhY2V0KSB7Ci0gICAgICAgICAgICAgICAgWG1sU2NoZW1hTGVuZ3RoRmFjZXQgbGVuZ3RoID0gKFhtbFNjaGVtYUxlbmd0aEZhY2V0KSBvYmo7Ci0gICAgICAgICAgICAgICAgbWV0YUluZkhvbGRlci5zZXRMZW5ndGhGYWNldChJbnRlZ2VyLnBhcnNlSW50KGxlbmd0aC5nZXRWYWx1ZSgpLnRvU3RyaW5nKCkpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgWG1sU2NoZW1hTWF4RXhjbHVzaXZlRmFjZXQpIHsKLSAgICAgICAgICAgICAgICBYbWxTY2hlbWFNYXhFeGNsdXNpdmVGYWNldCBtYXhFeCA9IChYbWxTY2hlbWFNYXhFeGNsdXNpdmVGYWNldCkgb2JqOwotICAgICAgICAgICAgICAgIG1ldGFJbmZIb2xkZXIuc2V0TWF4RXhjbHVzaXZlRmFjZXQobWF4RXguZ2V0VmFsdWUoKS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgWG1sU2NoZW1hTWluRXhjbHVzaXZlRmFjZXQpIHsKLSAgICAgICAgICAgICAgICBYbWxTY2hlbWFNaW5FeGNsdXNpdmVGYWNldCBtaW5FeCA9IChYbWxTY2hlbWFNaW5FeGNsdXNpdmVGYWNldCkgb2JqOwotICAgICAgICAgICAgICAgIG1ldGFJbmZIb2xkZXIuc2V0TWluRXhjbHVzaXZlRmFjZXQobWluRXguZ2V0VmFsdWUoKS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgWG1sU2NoZW1hTWF4SW5jbHVzaXZlRmFjZXQpIHsKLSAgICAgICAgICAgICAgICBYbWxTY2hlbWFNYXhJbmNsdXNpdmVGYWNldCBtYXhJbiA9IChYbWxTY2hlbWFNYXhJbmNsdXNpdmVGYWNldCkgb2JqOwotICAgICAgICAgICAgICAgIG1ldGFJbmZIb2xkZXIuc2V0TWF4SW5jbHVzaXZlRmFjZXQobWF4SW4uZ2V0VmFsdWUoKS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgWG1sU2NoZW1hTWluSW5jbHVzaXZlRmFjZXQpIHsKLSAgICAgICAgICAgICAgICBYbWxTY2hlbWFNaW5JbmNsdXNpdmVGYWNldCBtaW5JbiA9IChYbWxTY2hlbWFNaW5JbmNsdXNpdmVGYWNldCkgb2JqOwotICAgICAgICAgICAgICAgIG1ldGFJbmZIb2xkZXIuc2V0TWluSW5jbHVzaXZlRmFjZXQobWluSW4uZ2V0VmFsdWUoKS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgWG1sU2NoZW1hTWF4TGVuZ3RoRmFjZXQpIHsKLSAgICAgICAgICAgICAgICBYbWxTY2hlbWFNYXhMZW5ndGhGYWNldCBtYXhMZW4gPSAoWG1sU2NoZW1hTWF4TGVuZ3RoRmFjZXQpIG9iajsKLSAgICAgICAgICAgICAgICBtZXRhSW5mSG9sZGVyLnNldE1heExlbmd0aEZhY2V0KEludGVnZXIucGFyc2VJbnQobWF4TGVuLmdldFZhbHVlKCkudG9TdHJpbmcoKSkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBYbWxTY2hlbWFNaW5MZW5ndGhGYWNldCkgewotICAgICAgICAgICAgICAgIFhtbFNjaGVtYU1pbkxlbmd0aEZhY2V0IG1pbkxlbiA9IChYbWxTY2hlbWFNaW5MZW5ndGhGYWNldCkgb2JqOwotICAgICAgICAgICAgICAgIG1ldGFJbmZIb2xkZXIuc2V0TWluTGVuZ3RoRmFjZXQoSW50ZWdlci5wYXJzZUludChtaW5MZW4uZ2V0VmFsdWUoKS50b1N0cmluZygpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBIYW5kbGUgYW55IGF0dHJpYnV0ZQotICAgICAqCi0gICAgICogQHBhcmFtIG1ldGFpbmYKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0FueUF0dHJpYnV0ZShCZWFuV3JpdGVyTWV0YUluZm9Ib2xkZXIgbWV0YWluZiwgWG1sU2NoZW1hQW55QXR0cmlidXRlIGFueUF0dCkgewotCi0gICAgICAgIC8vVGhlIGJlc3QgdGhpbmcgd2UgY2FuIGRvIGhlcmUgaXMgdG8gYWRkIGEgc2V0IG9mIE9NQXR0cmlidXRlcwotICAgICAgICAvL3NpbmNlIGF0dHJpYnV0ZXMgZG8gbm90IGhhdmUgdGhlIG5vdGlvbiBvZiBtaW5vY2N1cnMvbWF4b2NjdXJzIHRoZQotICAgICAgICAvL3NhZmVzdCBvcHRpb24gaGVyZSBpcyB0byBoYXZlIGFuIE9NQXR0cmlidXRlIGFycmF5Ci0gICAgICAgIFFOYW1lIHFOYW1lID0gbmV3IFFOYW1lKEVYVFJBX0FUVFJJQlVURV9GSUVMRF9OQU1FKTsKLSAgICAgICAgbWV0YWluZi5yZWdpc3Rlck1hcHBpbmcocU5hbWUsCi0gICAgICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgICAgICB3cml0ZXIuZ2V0RGVmYXVsdEF0dHJpYkFycmF5Q2xhc3NOYW1lKCksLy9hbHdheXMgZ2VuZXJhdGUgYW4gYXJyYXkgb2YKLSAgICAgICAgICAgICAgICAvL09NQXR0cmlidXRlcwotICAgICAgICAgICAgICAgIFNjaGVtYUNvbnN0YW50cy5BTllfVFlQRSk7Ci0gICAgICAgIG1ldGFpbmYuYWRkdFN0YXR1cyhxTmFtZSwgU2NoZW1hQ29uc3RhbnRzLkFUVFJJQlVURV9UWVBFKTsKLSAgICAgICAgbWV0YWluZi5hZGR0U3RhdHVzKHFOYW1lLCBTY2hlbWFDb25zdGFudHMuQVJSQVlfVFlQRSk7Ci0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFByb2Nlc3MgdGhlIGF0dHJpYnV0ZQotICAgICAqCi0gICAgICogQHBhcmFtIGF0dAotICAgICAqIEBwYXJhbSBtZXRhaW5mCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcHJvY2Vzc0F0dHJpYnV0ZShYbWxTY2hlbWFBdHRyaWJ1dGUgYXR0LCBCZWFuV3JpdGVyTWV0YUluZm9Ib2xkZXIgbWV0YWluZiwgWG1sU2NoZW1hIHBhcmVudFNjaGVtYSkKLSAgICAgICAgICAgIHRocm93cyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgUU5hbWUgc2NoZW1hVHlwZU5hbWUgPSBhdHQuZ2V0U2NoZW1hVHlwZU5hbWUoKTsKLSAgICAgICAgaWYgKHNjaGVtYVR5cGVOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChhdHQuZ2V0UU5hbWUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGJhc2VTY2hlbWFUeXBlTWFwLmNvbnRhaW5zS2V5KHNjaGVtYVR5cGVOYW1lKSkgewotCi0gICAgICAgICAgICAgICAgICAgIG1ldGFpbmYucmVnaXN0ZXJNYXBwaW5nKGF0dC5nZXRRTmFtZSgpLCBzY2hlbWFUeXBlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlU2NoZW1hVHlwZU1hcC5nZXQoc2NoZW1hVHlwZU5hbWUpLnRvU3RyaW5nKCksIFNjaGVtYUNvbnN0YW50cy5BVFRSSUJVVEVfVFlQRSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gYWRkIG9wdGlvbmFsIGF0dHJpYnV0ZSBzdGF0dXMgaWYgc2V0Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyB1c2UgPSBhdHQuZ2V0VXNlKCkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKFVTRV9OT05FLmVxdWFscyh1c2UpIHx8IFVTRV9PUFRJT05BTC5lcXVhbHModXNlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWluZi5hZGR0U3RhdHVzKGF0dC5nZXRRTmFtZSgpLCBTY2hlbWFDb25zdGFudHMuT1BUSU9OQUxfVFlQRSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gZmluZENsYXNzTmFtZShzY2hlbWFUeXBlTmFtZSwgZmFsc2UpOwotCi0gICAgICAgICAgICAgICAgICAgIGF0dC5hZGRNZXRhSW5mbygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFDb25zdGFudHMuU2NoZW1hQ29tcGlsZXJJbmZvSG9sZGVyLkNMQVNTTkFNRV9LRVksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gc2V0IHRoZSBkZWZhdWx0IHZhbHVlCi0gICAgICAgICAgICAgICAgICAgIGlmIChhdHQuZ2V0RGVmYXVsdFZhbHVlKCkgIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZXRhaW5mLnJlZ2lzdGVyRGVmYXVsdFZhbHVlKGF0dC5nZXRRTmFtZSgpLGF0dC5nZXREZWZhdWx0VmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gYWZ0ZXIKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBYbWxTY2hlbWEgcmVzb2x2ZWRTY2hlbWEgPSBnZXRQYXJlbnRTY2hlbWEocGFyZW50U2NoZW1hLHNjaGVtYVR5cGVOYW1lLENPTVBPTkVOVF9UWVBFKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlc29sdmVkU2NoZW1hID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbigiY2FuIG5vdCBmaW5kIHRoZSB0eXBlICIgKyBzY2hlbWFUeXBlTmFtZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZnJvbSB0aGUgcGFyZW50IHNjaGVtYSAiICsgcGFyZW50U2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFhtbFNjaGVtYVR5cGUgdHlwZSA9IHJlc29sdmVkU2NoZW1hLmdldFR5cGVCeU5hbWUoc2NoZW1hVHlwZU5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgaW5zdGFuY2VvZiBYbWxTY2hlbWFTaW1wbGVUeXBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgWG1sU2NoZW1hU2ltcGxlVHlwZSBzaW1wbGVUeXBlID0gKFhtbFNjaGVtYVNpbXBsZVR5cGUpIHR5cGU7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2ltcGxlVHlwZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNBbHJlYWR5UHJvY2Vzc2VkKHNjaGVtYVR5cGVOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9wcm9jZXNzIHNpbXBsZSB0eXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzU2ltcGxlU2NoZW1hVHlwZShzaW1wbGVUeXBlLCBudWxsLCByZXNvbHZlZFNjaGVtYSwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWluZi5yZWdpc3Rlck1hcHBpbmcoYXR0LmdldFFOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hVHlwZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2VkVHlwZW1hcC5nZXQoc2NoZW1hVHlwZU5hbWUpLnRvU3RyaW5nKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hQ29uc3RhbnRzLkFUVFJJQlVURV9UWVBFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRkIG9wdGlvbmFsIGF0dHJpYnV0ZSBzdGF0dXMgaWYgc2V0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB1c2UgPSBhdHQuZ2V0VXNlKCkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFVTRV9OT05FLmVxdWFscyh1c2UpIHx8IFVTRV9PUFRJT05BTC5lcXVhbHModXNlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWluZi5hZGR0U3RhdHVzKGF0dC5nZXRRTmFtZSgpLCBTY2hlbWFDb25zdGFudHMuT1BUSU9OQUxfVFlQRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gdGhpcyBhdHRyaWJ1dGUgaGFzIGEgdHlwZSBidXQgZG9lcyBub3QgaGF2ZSBhIG5hbWUsIHNlZW1zIHRvIGJlIGludmFsaWQKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IGVsc2UgaWYgKGF0dC5nZXRSZWZOYW1lKCkgIT0gbnVsbCkgewotCi0gICAgICAgICAgICBYbWxTY2hlbWEgcmVzb2x2ZWRTY2hlbWEgPSBnZXRQYXJlbnRTY2hlbWEocGFyZW50U2NoZW1hLGF0dC5nZXRSZWZOYW1lKCksQ09NUE9ORU5UX0FUVFJJQlVURSk7Ci0gICAgICAgICAgICBpZiAocmVzb2x2ZWRTY2hlbWEgPT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVtYUNvbXBpbGF0aW9uRXhjZXB0aW9uKCJjYW4gbm90IGZpbmQgdGhlIGF0dHJpYnV0ZSAiICsgYXR0LmdldFJlZk5hbWUoKSArCi0gICAgICAgICAgICAgICAgIiBmcm9tIHRoZSBwYXJlbnQgc2NoZW1hICIgKyBwYXJlbnRTY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBYbWxTY2hlbWFBdHRyaWJ1dGUgeG1sU2NoZW1hQXR0cmlidXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChYbWxTY2hlbWFBdHRyaWJ1dGUpIHJlc29sdmVkU2NoZW1hLmdldEF0dHJpYnV0ZXMoKS5nZXRJdGVtKGF0dC5nZXRSZWZOYW1lKCkpOwotICAgICAgICAgICAgICAgIGlmICh4bWxTY2hlbWFBdHRyaWJ1dGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAvLyBjYWxsIHJlY3Vyc2l2ZWx5IHRvIHByb2Nlc3MgdGhlIHNjaGVtYQotICAgICAgICAgICAgICAgICAgICBwcm9jZXNzQXR0cmlidXRlKHhtbFNjaGVtYUF0dHJpYnV0ZSwgbWV0YWluZiwgcmVzb2x2ZWRTY2hlbWEpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbigiQXR0cmlidXRlIFFOYW1lIHJlZmVyZW5jZSByZWZlciB0byBhbiBpbnZhbGlkIGF0dHJpYnV0ZSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHQuZ2V0UmVmTmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIHRoaXMgYXR0cmlidXRlIHJlZmVycyB0byBhIGN1c3RvbSB0eXBlLCBwcm9iYWJseSBvbmUgb2YgdGhlIGV4dGVuZGVkIHNpbXBsZSB0eXBlcy4KLSAgICAgICAgICAgIC8vIHdpdGggdGhlIGlubGluZSBzY2hlbWEgZGVmaW5pdGlvbgotICAgICAgICAgICAgUU5hbWUgYXR0cmlidXRlUU5hbWUgPSBhdHQuZ2V0UU5hbWUoKTsKLSAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVRTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgWG1sU2NoZW1hU2ltcGxlVHlwZSBhdHRyaWJ1dGVTaW1wbGVUeXBlID0gYXR0LmdldFNjaGVtYVR5cGUoKTsKLSAgICAgICAgICAgICAgICBYbWxTY2hlbWEgcmVzb2x2ZWRTY2hlbWEgPSBwYXJlbnRTY2hlbWE7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVNpbXBsZVR5cGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAvLyB0cnkgdG8gZ2V0IHRoZSBzY2hlbWEgZm9yIHVzaW5nIHFuYW1lCi0gICAgICAgICAgICAgICAgICAgIFFOYW1lIGF0dHJpYnV0ZVNjaGVtYVFuYW1lID0gYXR0LmdldFNjaGVtYVR5cGVOYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVTY2hlbWFRbmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlZFNjaGVtYSA9IGdldFBhcmVudFNjaGVtYShwYXJlbnRTY2hlbWEsYXR0cmlidXRlU2NoZW1hUW5hbWUsQ09NUE9ORU5UX1RZUEUpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc29sdmVkU2NoZW1hID09IG51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbigiY2FuIG5vdCBmaW5kIHRoZSB0eXBlICIgKyBhdHRyaWJ1dGVTY2hlbWFRbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGZyb20gdGhlIHBhcmVudCBzY2hlbWEgIiArIHBhcmVudFNjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVNpbXBsZVR5cGUgPSAoWG1sU2NoZW1hU2ltcGxlVHlwZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVkU2NoZW1hLmdldFR5cGVCeU5hbWUoYXR0cmlidXRlU2NoZW1hUW5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVNpbXBsZVR5cGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBRTmFtZSBzY2hlbWFUeXBlUU5hbWUgPSBhdHQuZ2V0U2NoZW1hVHlwZU5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNjaGVtYVR5cGVRTmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXQgdGhlIHBhcmVudCBzY2hlbWEgdGFyZ2V0IG5hbWUgc3BhY2Ugc2luY2UgYXR0cmlidXRlIFFuYW1lIHVyaSBpcyAiIgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVNpbXBsZVR5cGUuZ2V0UU5hbWUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hVHlwZVFOYW1lID0gYXR0cmlidXRlU2ltcGxlVHlwZS5nZXRRTmFtZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWFUeXBlUU5hbWUgPSBuZXcgUU5hbWUocGFyZW50U2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlUU5hbWUuZ2V0TG9jYWxQYXJ0KCkgKyBnZXROZXh0VHlwZVN1ZmZpeChhdHRyaWJ1dGVRTmFtZS5nZXRMb2NhbFBhcnQoKSkpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0FscmVhZHlQcm9jZXNzZWQoc2NoZW1hVHlwZVFOYW1lKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHRvIHByb2Nlc3Mgb25seSBpZiBpdCBoYXMgbm90IHByb2Nlc3NlZAotICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc1NpbXBsZVNjaGVtYVR5cGUoYXR0cmlidXRlU2ltcGxlVHlwZSwgbnVsbCwgcmVzb2x2ZWRTY2hlbWEsIHNjaGVtYVR5cGVRTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbWV0YWluZi5yZWdpc3Rlck1hcHBpbmcoYXR0LmdldFFOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hVHlwZVFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZFR5cGVtYXAuZ2V0KHNjaGVtYVR5cGVRTmFtZSkudG9TdHJpbmcoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFDb25zdGFudHMuQVRUUklCVVRFX1RZUEUpOwotICAgICAgICAgICAgICAgICAgICAvLyBhZGQgb3B0aW9uYWwgYXR0cmlidXRlIHN0YXR1cyBpZiBzZXQKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHVzZSA9IGF0dC5nZXRVc2UoKS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoVVNFX05PTkUuZXF1YWxzKHVzZSkgfHwgVVNFX09QVElPTkFMLmVxdWFscyh1c2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZXRhaW5mLmFkZHRTdGF0dXMoYXR0LmdldFFOYW1lKCksIFNjaGVtYUNvbnN0YW50cy5PUFRJT05BTF9UWVBFKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGhhbmRsZSB0aGUgY2FzZSB3aGVuIG5vIGF0dHJpYnV0ZSB0eXBlIHNwZWNpZmVkCi0gICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKCJObyBhdHRyaWJ1dGUgdHlwZSBoYXMgZGVmaW5lZCB0byB0aGUgQXR0cmlidXRlICIgKyBhdHRyaWJ1dGVRTmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbigiQXR0cmlidXRlIFFOYW1lIHJlZmVyZW5jZSByZWZlciB0byBhbiBpbnZhbGlkIGF0dHJpYnV0ZSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVFOYW1lKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJvY2VzcyBhIHBhcnRpY2xlLSBBIHBhcnRpY2xlIG1heSBiZSBhIHNlcXVlbmNlLGFsbCBvciBhIGNob2ljZQotICAgICAqIEBwYXJhbSBwYXJlbnRFbGVtZW50UU5hbWUgLSB0aGlzIGNhbiBlaXRoZXIgYmUgcGFyZW50IGVsZW1lbnQgUU5hbWUgb3IgcGFyZW50IENvbXBsZXggdHlwZSBxbmFtZQotICAgICAqIEBwYXJhbSBwYXJ0aWNsZSAtIHBhcnRpY2xlIGJlaW5nIHByb2Nlc3NlZAotICAgICAqIEBwYXJhbSBtZXRhaW5mSG9sZGVyIC0KLSAgICAgKiBAcGFyYW0gcGFyZW50U2NoZW1hCi0gICAgICogQHRocm93cyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzUGFydGljbGUoUU5hbWUgcGFyZW50RWxlbWVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWG1sU2NoZW1hUGFydGljbGUgcGFydGljbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCZWFuV3JpdGVyTWV0YUluZm9Ib2xkZXIgbWV0YWluZkhvbGRlcgotICAgICAgICAgICAgLCBYbWxTY2hlbWEgcGFyZW50U2NoZW1hKSB0aHJvd3MgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24gewotCi0gICAgICAgIGlmIChwYXJ0aWNsZSBpbnN0YW5jZW9mIFhtbFNjaGVtYVNlcXVlbmNlKSB7Ci0gICAgICAgICAgICBYbWxTY2hlbWFTZXF1ZW5jZSB4bWxTY2hlbWFTZXF1ZW5jZSA9IChYbWxTY2hlbWFTZXF1ZW5jZSkgcGFydGljbGU7Ci0KLSAgICAgICAgICAgIFhtbFNjaGVtYU9iamVjdENvbGxlY3Rpb24gaXRlbXMgPSB4bWxTY2hlbWFTZXF1ZW5jZS5nZXRJdGVtcygpOwotICAgICAgICAgICAgaWYgKCh4bWxTY2hlbWFTZXF1ZW5jZS5nZXRNYXhPY2N1cnMoKSA+IDEpICYmIChwYXJlbnRFbGVtZW50UU5hbWUgIT0gbnVsbCkpIHsKLSAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHRvIHByb2Nlc3MgbWFueSBzZXF1ZW5jZSB0eXBlcwotICAgICAgICAgICAgICAgIEJlYW5Xcml0ZXJNZXRhSW5mb0hvbGRlciBiZWFuV3JpdGVyTWV0YUluZm9Ib2xkZXIgPSBuZXcgQmVhbldyaXRlck1ldGFJbmZvSG9sZGVyKCk7Ci0gICAgICAgICAgICAgICAgcHJvY2VzcyhwYXJlbnRFbGVtZW50UU5hbWUsIGl0ZW1zLCBiZWFuV3JpdGVyTWV0YUluZm9Ib2xkZXIsIHRydWUsIHBhcmVudFNjaGVtYSk7Ci0gICAgICAgICAgICAgICAgYmVhbldyaXRlck1ldGFJbmZvSG9sZGVyLnNldFBhcnRpY2xlQ2xhc3ModHJ1ZSk7Ci0gICAgICAgICAgICAgICAgUU5hbWUgc2VxdWVuY2VRTmFtZSA9IG5ldyBRTmFtZShwYXJlbnRFbGVtZW50UU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50RWxlbWVudFFOYW1lLmdldExvY2FsUGFydCgpICsgIlNlcXVlbmNlIik7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGphdmFDbGFzc05hbWUgPSB3cml0ZUNvbXBsZXhQYXJ0aWNsZShzZXF1ZW5jZVFOYW1lLGJlYW5Xcml0ZXJNZXRhSW5mb0hvbGRlcik7Ci0gICAgICAgICAgICAgICAgcHJvY2Vzc2VkVHlwZW1hcC5wdXQoc2VxdWVuY2VRTmFtZSwgamF2YUNsYXNzTmFtZSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBhZGQgdGhpcyBhcyBhbiBhcnJheSB0byB0aGUgb3JpZ2luYWwgY2xhc3MKLSAgICAgICAgICAgICAgICBtZXRhaW5mSG9sZGVyLnJlZ2lzdGVyTWFwcGluZyhzZXF1ZW5jZVFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmRDbGFzc05hbWUoc2VxdWVuY2VRTmFtZSx0cnVlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYUNvbnN0YW50cy5BUlJBWV9UWVBFKTsKLSAgICAgICAgICAgICAgICBtZXRhaW5mSG9sZGVyLnNldE9yZGVyZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgbWV0YWluZkhvbGRlci5yZWdpc3RlclFOYW1lSW5kZXgoc2VxdWVuY2VRTmFtZSxtZXRhaW5mSG9sZGVyLmdldE9yZGVyU3RhcnRQb2ludCgpICsgMSk7Ci0gICAgICAgICAgICAgICAgbWV0YWluZkhvbGRlci5zZXRIYXNQYXJ0aWNsZVR5cGUodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgbWV0YWluZkhvbGRlci5hZGR0U3RhdHVzKHNlcXVlbmNlUU5hbWUsU2NoZW1hQ29uc3RhbnRzLlBBUlRJQ0xFX1RZUEVfRUxFTUVOVCk7Ci0gICAgICAgICAgICAgICAgbWV0YWluZkhvbGRlci5hZGRNYXhPY2N1cnMoc2VxdWVuY2VRTmFtZSx4bWxTY2hlbWFTZXF1ZW5jZS5nZXRNYXhPY2N1cnMoKSk7Ci0gICAgICAgICAgICAgICAgbWV0YWluZkhvbGRlci5hZGRNaW5PY2N1cnMoc2VxdWVuY2VRTmFtZSx4bWxTY2hlbWFTZXF1ZW5jZS5nZXRNaW5PY2N1cnMoKSk7Ci0KLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5pc0JhY2t3b3JkQ29tcGF0aWJpbGl0eU1vZGUoKSkgewotICAgICAgICAgICAgICAgICAgICBwcm9jZXNzKHBhcmVudEVsZW1lbnRRTmFtZSxpdGVtcywgbWV0YWluZkhvbGRlciwgZmFsc2UsIHBhcmVudFNjaGVtYSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcHJvY2VzcyhwYXJlbnRFbGVtZW50UU5hbWUsaXRlbXMsIG1ldGFpbmZIb2xkZXIsIHRydWUsIHBhcmVudFNjaGVtYSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gZWxzZSBpZiAocGFydGljbGUgaW5zdGFuY2VvZiBYbWxTY2hlbWFBbGwpIHsKLSAgICAgICAgICAgIFhtbFNjaGVtYU9iamVjdENvbGxlY3Rpb24gaXRlbXMgPSAoKFhtbFNjaGVtYUFsbCkgcGFydGljbGUpLmdldEl0ZW1zKCk7Ci0gICAgICAgICAgICBwcm9jZXNzKHBhcmVudEVsZW1lbnRRTmFtZSxpdGVtcywgbWV0YWluZkhvbGRlciwgZmFsc2UsIHBhcmVudFNjaGVtYSk7Ci0gICAgICAgIH0gZWxzZSBpZiAocGFydGljbGUgaW5zdGFuY2VvZiBYbWxTY2hlbWFDaG9pY2UpIHsKLSAgICAgICAgICAgIFhtbFNjaGVtYUNob2ljZSB4bWxTY2hlbWFDaG9pY2UgPSAoWG1sU2NoZW1hQ2hvaWNlKSBwYXJ0aWNsZTsKLSAgICAgICAgICAgIFhtbFNjaGVtYU9iamVjdENvbGxlY3Rpb24gaXRlbXMgPSAoKFhtbFNjaGVtYUNob2ljZSkgcGFydGljbGUpLmdldEl0ZW1zKCk7Ci0KLSAgICAgICAgICAgIGlmICgoeG1sU2NoZW1hQ2hvaWNlLmdldE1heE9jY3VycygpID4gMSkpIHsKLSAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHRvIHByb2Nlc3MgbWFueSBzZXF1ZW5jZSB0eXBlcwotICAgICAgICAgICAgICAgIEJlYW5Xcml0ZXJNZXRhSW5mb0hvbGRlciBiZWFuV3JpdGVyTWV0YUluZm9Ib2xkZXIgPSBuZXcgQmVhbldyaXRlck1ldGFJbmZvSG9sZGVyKCk7Ci0gICAgICAgICAgICAgICAgYmVhbldyaXRlck1ldGFJbmZvSG9sZGVyLnNldENob2ljZSh0cnVlKTsKLSAgICAgICAgICAgICAgICBwcm9jZXNzKHBhcmVudEVsZW1lbnRRTmFtZSxpdGVtcywgYmVhbldyaXRlck1ldGFJbmZvSG9sZGVyLCBmYWxzZSwgcGFyZW50U2NoZW1hKTsKLSAgICAgICAgICAgICAgICBiZWFuV3JpdGVyTWV0YUluZm9Ib2xkZXIuc2V0UGFydGljbGVDbGFzcyh0cnVlKTsKLSAgICAgICAgICAgICAgICBRTmFtZSBjaG9pY2VRTmFtZSA9IG5ldyBRTmFtZShwYXJlbnRFbGVtZW50UU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50RWxlbWVudFFOYW1lLmdldExvY2FsUGFydCgpICsgIkNob2ljZSIpOwotICAgICAgICAgICAgICAgIFN0cmluZyBqYXZhQ2xhc3NOYW1lID0gd3JpdGVDb21wbGV4UGFydGljbGUoY2hvaWNlUU5hbWUsYmVhbldyaXRlck1ldGFJbmZvSG9sZGVyKTsKLSAgICAgICAgICAgICAgICBwcm9jZXNzZWRUeXBlbWFwLnB1dChjaG9pY2VRTmFtZSwgamF2YUNsYXNzTmFtZSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBhZGQgdGhpcyBhcyBhbiBhcnJheSB0byB0aGUgb3JpZ2luYWwgY2xhc3MKLSAgICAgICAgICAgICAgICBtZXRhaW5mSG9sZGVyLnJlZ2lzdGVyTWFwcGluZyhjaG9pY2VRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNob2ljZVFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgZmluZENsYXNzTmFtZShjaG9pY2VRTmFtZSx0cnVlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYUNvbnN0YW50cy5BUlJBWV9UWVBFKTsKLSAgICAgICAgICAgICAgICBtZXRhaW5mSG9sZGVyLnNldE9yZGVyZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgbWV0YWluZkhvbGRlci5zZXRIYXNQYXJ0aWNsZVR5cGUodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgbWV0YWluZkhvbGRlci5yZWdpc3RlclFOYW1lSW5kZXgoY2hvaWNlUU5hbWUsbWV0YWluZkhvbGRlci5nZXRPcmRlclN0YXJ0UG9pbnQoKSArIDEpOwotICAgICAgICAgICAgICAgIG1ldGFpbmZIb2xkZXIuYWRkdFN0YXR1cyhjaG9pY2VRTmFtZSxTY2hlbWFDb25zdGFudHMuUEFSVElDTEVfVFlQRV9FTEVNRU5UKTsKLSAgICAgICAgICAgICAgICBtZXRhaW5mSG9sZGVyLmFkZE1heE9jY3VycyhjaG9pY2VRTmFtZSx4bWxTY2hlbWFDaG9pY2UuZ2V0TWF4T2NjdXJzKCkpOwotICAgICAgICAgICAgICAgIG1ldGFpbmZIb2xkZXIuYWRkTWluT2NjdXJzKGNob2ljZVFOYW1lLHhtbFNjaGVtYUNob2ljZS5nZXRNaW5PY2N1cnMoKSk7Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbWV0YWluZkhvbGRlci5zZXRDaG9pY2UodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgcHJvY2VzcyhwYXJlbnRFbGVtZW50UU5hbWUsaXRlbXMsIG1ldGFpbmZIb2xkZXIsIGZhbHNlLCBwYXJlbnRTY2hlbWEpOwotICAgICAgICAgICAgfQotCi0KLSAgICAgICAgfSBlbHNlIGlmIChwYXJ0aWNsZSBpbnN0YW5jZW9mIFhtbFNjaGVtYUdyb3VwUmVmKXsKLQotICAgICAgICAgICAgWG1sU2NoZW1hR3JvdXBSZWYgeG1sU2NoZW1hR3JvdXBSZWYgPSAoWG1sU2NoZW1hR3JvdXBSZWYpIHBhcnRpY2xlOwotICAgICAgICAgICAgUU5hbWUgZ3JvdXBRTmFtZSA9IHhtbFNjaGVtYUdyb3VwUmVmLmdldFJlZk5hbWUoKTsKLSAgICAgICAgICAgIGlmIChncm91cFFOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoIXByb2Nlc3NlZEdyb3VwVHlwZU1hcC5jb250YWluc0tleShncm91cFFOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBwcm9jZXNzZSB0aGUgc2NoZW1hIGhlcmUKLSAgICAgICAgICAgICAgICAgICAgWG1sU2NoZW1hIHJlc29sdmVkUGFyZW50U2NoZW1hID0gZ2V0UGFyZW50U2NoZW1hKHBhcmVudFNjaGVtYSxncm91cFFOYW1lLENPTVBPTkVOVF9HUk9VUCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlZFBhcmVudFNjaGVtYSA9PSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbigiY2FuIG5vdCBmaW5kIHRoZSBncm91cCAiICsgZ3JvdXBRTmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBmcm9tIHRoZSBwYXJlbnQgc2NoZW1hICIgKyBwYXJlbnRTY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgWG1sU2NoZW1hR3JvdXAgeG1sU2NoZW1hR3JvdXAgPSAoWG1sU2NoZW1hR3JvdXApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVkUGFyZW50U2NoZW1hLmdldEdyb3VwcygpLmdldEl0ZW0oZ3JvdXBRTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzR3JvdXAoeG1sU2NoZW1hR3JvdXAsIGdyb3VwUU5hbWUsIHJlc29sdmVkUGFyZW50U2NoZW1hKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVtYUNvbXBpbGF0aW9uRXhjZXB0aW9uKCJSZWZlcmVuY2VkIG5hbWUgaXMgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYm9vbGVhbiBpc0FycmF5ID0geG1sU2NoZW1hR3JvdXBSZWYuZ2V0TWF4T2NjdXJzKCkgPiAxOwotCi0gICAgICAgICAgICAvLyBhZGQgdGhpcyBhcyBhbiBhcnJheSB0byB0aGUgb3JpZ2luYWwgY2xhc3MKLSAgICAgICAgICAgIFN0cmluZyBncm91cENsYXNzTmFtZSA9IChTdHJpbmcpIHByb2Nlc3NlZEdyb3VwVHlwZU1hcC5nZXQoZ3JvdXBRTmFtZSk7Ci0gICAgICAgICAgICBpZiAoaXNBcnJheSl7Ci0gICAgICAgICAgICAgICAgZ3JvdXBDbGFzc05hbWUgPSBncm91cENsYXNzTmFtZSArICJbXSI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtZXRhaW5mSG9sZGVyLnJlZ2lzdGVyTWFwcGluZyhncm91cFFOYW1lLCBncm91cFFOYW1lLCBncm91cENsYXNzTmFtZSk7Ci0gICAgICAgICAgICBpZiAoaXNBcnJheSkgewotICAgICAgICAgICAgICAgIG1ldGFpbmZIb2xkZXIuYWRkdFN0YXR1cyhncm91cFFOYW1lLCBTY2hlbWFDb25zdGFudHMuQVJSQVlfVFlQRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtZXRhaW5mSG9sZGVyLmFkZHRTdGF0dXMoZ3JvdXBRTmFtZSwgU2NoZW1hQ29uc3RhbnRzLlBBUlRJQ0xFX1RZUEVfRUxFTUVOVCk7Ci0gICAgICAgICAgICBtZXRhaW5mSG9sZGVyLmFkZE1heE9jY3Vycyhncm91cFFOYW1lLCB4bWxTY2hlbWFHcm91cFJlZi5nZXRNYXhPY2N1cnMoKSk7Ci0gICAgICAgICAgICBtZXRhaW5mSG9sZGVyLmFkZE1pbk9jY3Vycyhncm91cFFOYW1lLCB4bWxTY2hlbWFHcm91cFJlZi5nZXRNaW5PY2N1cnMoKSk7Ci0gICAgICAgICAgICBtZXRhaW5mSG9sZGVyLnNldEhhc1BhcnRpY2xlVHlwZSh0cnVlKTsKLSAgICAgICAgICAgIG1ldGFpbmZIb2xkZXIuc2V0T3JkZXJlZCh0cnVlKTsKLSAgICAgICAgICAgIG1ldGFpbmZIb2xkZXIucmVnaXN0ZXJRTmFtZUluZGV4KGdyb3VwUU5hbWUsbWV0YWluZkhvbGRlci5nZXRPcmRlclN0YXJ0UG9pbnQoKSArIDEpOwotCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJlbnRFbGVtZW50UU5hbWUgLSB0aGlzIGNvdWxkIGVpdGhlciBiZSB0aGUgY29tcGxleCB0eXBlIHBhcmVudEVsZW1lbnRRTmFtZSBvciBlbGVtZW50IHBhcmVudEVsZW1lbnRRTmFtZQotICAgICAqIEBwYXJhbSBpdGVtcwotICAgICAqIEBwYXJhbSBtZXRhaW5mSG9sZGVyCi0gICAgICogQHBhcmFtIG9yZGVyCi0gICAgICogQHBhcmFtIHBhcmVudFNjaGVtYQotICAgICAqIEB0aHJvd3MgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcHJvY2VzcyhRTmFtZSBwYXJlbnRFbGVtZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgWG1sU2NoZW1hT2JqZWN0Q29sbGVjdGlvbiBpdGVtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICBCZWFuV3JpdGVyTWV0YUluZm9Ib2xkZXIgbWV0YWluZkhvbGRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIG9yZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgIFhtbFNjaGVtYSBwYXJlbnRTY2hlbWEpIHRocm93cyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIGludCBjb3VudCA9IGl0ZW1zLmdldENvdW50KCk7Ci0gICAgICAgIE1hcCBwcm9jZXNzZWRFbGVtZW50QXJyYXlTdGF0dXNNYXAgPSBuZXcgTGlua2VkSGFzaE1hcCgpOwotICAgICAgICBNYXAgcHJvY2Vzc2VkRWxlbWVudFR5cGVNYXAgPSBuZXcgTGlua2VkSGFzaE1hcCgpOwotICAgICAgICBMaXN0IGxvY2FsTmlsbGFibGVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgICAgIE1hcCBwYXJ0aWNsZVFOYW1lTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotICAgICAgICAvLyB0aGlzIGxpc3QgaXMgdXNlZCB0byBrZWVwIHRoZSBkZXRhaWxzIG9mIHRoZQotICAgICAgICAvLyBlbGVtZW50cyB3aXRoaW4gYSBjaG9pY2Ugd2l0aGluZyBzZXF1ZW5jZQotICAgICAgICBMaXN0IGlubmVyQ2hvaWNlRWxlbWVudExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgTWFwIGVsZW1lbnRPcmRlck1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICAgICAgaW50IHNlcXVlbmNlQ291bnRlciA9IDA7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgWG1sU2NoZW1hT2JqZWN0IGl0ZW0gPSBpdGVtcy5nZXRJdGVtKGkpOwotCi0gICAgICAgICAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIFhtbFNjaGVtYUVsZW1lbnQpIHsKLSAgICAgICAgICAgICAgICAvL3JlY3Vyc2l2ZWx5IHByb2Nlc3MgdGhlIGVsZW1lbnQKLSAgICAgICAgICAgICAgICBYbWxTY2hlbWFFbGVtZW50IHhzRWx0ID0gKFhtbFNjaGVtYUVsZW1lbnQpIGl0ZW07Ci0KLSAgICAgICAgICAgICAgICBib29sZWFuIGlzQXJyYXkgPSBpc0FycmF5KHhzRWx0KTsKLSAgICAgICAgICAgICAgICBwcm9jZXNzRWxlbWVudCh4c0VsdCwgcHJvY2Vzc2VkRWxlbWVudFR5cGVNYXAsIGxvY2FsTmlsbGFibGVMaXN0LCBwYXJlbnRTY2hlbWEpOyAvL3dlIGtub3cgZm9yIHN1cmUgdGhpcyBpcyBub3QgYW4gb3V0ZXIgdHlwZQotICAgICAgICAgICAgICAgIHByb2Nlc3NlZEVsZW1lbnRBcnJheVN0YXR1c01hcC5wdXQoeHNFbHQsIChpc0FycmF5KSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0UpOwotICAgICAgICAgICAgICAgIGlmIChvcmRlcikgewotICAgICAgICAgICAgICAgICAgICAvL3dlIG5lZWQgdG8ga2VlcCB0aGUgb3JkZXIgb2YgdGhlIGVsZW1lbnRzLiBTbyBwdXNoIHRoZSBlbGVtZW50cyB0byBhbm90aGVyCi0gICAgICAgICAgICAgICAgICAgIC8vaGFzaG1hcCB3aXRoIHRoZSBvcmRlciBudW1iZXIKLSAgICAgICAgICAgICAgICAgICAgZWxlbWVudE9yZGVyTWFwLnB1dCh4c0VsdCwgbmV3IEludGVnZXIoc2VxdWVuY2VDb3VudGVyKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy9oYW5kbGUgeHNkOmFueSAhIFdlIHBsYWNlIGFuIE9NRWxlbWVudCAob3IgYW4gYXJyYXkgb2YgT01FbGVtZW50cykgaW4gdGhlIGdlbmVyYXRlZCBjbGFzcwotICAgICAgICAgICAgfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgWG1sU2NoZW1hQW55KSB7Ci0gICAgICAgICAgICAgICAgWG1sU2NoZW1hQW55IGFueSA9IChYbWxTY2hlbWFBbnkpIGl0ZW07Ci0gICAgICAgICAgICAgICAgcHJvY2Vzc2VkRWxlbWVudFR5cGVNYXAucHV0KG5ldyBRTmFtZShBTllfRUxFTUVOVF9GSUVMRF9OQU1FKSwgYW55KTsKLSAgICAgICAgICAgICAgICAvL2FueSBjYW4gYWxzbyBiZSBpbnNpZGUgYSBzZXF1ZW5jZQotICAgICAgICAgICAgICAgIGlmIChvcmRlcikgewotICAgICAgICAgICAgICAgICAgICBlbGVtZW50T3JkZXJNYXAucHV0KGFueSwgbmV3IEludGVnZXIoc2VxdWVuY2VDb3VudGVyKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vd2UgZG8gbm90IHJlZ2lzdGVyIHRoZSBhcnJheSBzdGF0dXMgZm9yIHRoZSBhbnkgdHlwZQotICAgICAgICAgICAgICAgIHByb2Nlc3NlZEVsZW1lbnRBcnJheVN0YXR1c01hcC5wdXQoYW55LCBpc0FycmF5KGFueSkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFhtbFNjaGVtYVNlcXVlbmNlKSB7Ci0gICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBwcm9jZXNzIG1hbnkgc2VxdWVuY2UgdHlwZXMKLQotICAgICAgICAgICAgICAgIFhtbFNjaGVtYVNlcXVlbmNlIHhtbFNjaGVtYVNlcXVlbmNlID0gKFhtbFNjaGVtYVNlcXVlbmNlKSBpdGVtOwotICAgICAgICAgICAgICAgIGlmICh4bWxTY2hlbWFTZXF1ZW5jZS5nZXRJdGVtcygpLmdldENvdW50KCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIEJlYW5Xcml0ZXJNZXRhSW5mb0hvbGRlciBiZWFuV3JpdGVyTWV0YUluZm9Ib2xkZXIgPSBuZXcgQmVhbldyaXRlck1ldGFJbmZvSG9sZGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgIHByb2Nlc3MocGFyZW50RWxlbWVudFFOYW1lLCB4bWxTY2hlbWFTZXF1ZW5jZS5nZXRJdGVtcygpLCBiZWFuV3JpdGVyTWV0YUluZm9Ib2xkZXIsIHRydWUsIHBhcmVudFNjaGVtYSk7Ci0gICAgICAgICAgICAgICAgICAgIGJlYW5Xcml0ZXJNZXRhSW5mb0hvbGRlci5zZXRQYXJ0aWNsZUNsYXNzKHRydWUpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbG9jYWxOYW1lID0gcGFyZW50RWxlbWVudFFOYW1lLmdldExvY2FsUGFydCgpICsgIlNlcXVlbmNlIjsKLSAgICAgICAgICAgICAgICAgICAgUU5hbWUgc2VxdWVuY2VRTmFtZSA9IG5ldyBRTmFtZShwYXJlbnRFbGVtZW50UU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxOYW1lICsgZ2V0TmV4dFR5cGVTdWZmaXgobG9jYWxOYW1lKSk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBqYXZhQ2xhc3NOYW1lID0gd3JpdGVDb21wbGV4UGFydGljbGUoc2VxdWVuY2VRTmFtZSwgYmVhbldyaXRlck1ldGFJbmZvSG9sZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2VkVHlwZW1hcC5wdXQoc2VxdWVuY2VRTmFtZSwgamF2YUNsYXNzTmFtZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy9wdXQgdGhlIHBhcnRpY2FsIHRvIGFycmF5Ci0gICAgICAgICAgICAgICAgICAgIEJvb2xlYW4gaXNBcnJheSA9IHhtbFNjaGVtYVNlcXVlbmNlLmdldE1heE9jY3VycygpID4gMSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZEVsZW1lbnRBcnJheVN0YXR1c01hcC5wdXQoaXRlbSwgaXNBcnJheSk7Ci0gICAgICAgICAgICAgICAgICAgIHBhcnRpY2xlUU5hbWVNYXAucHV0KGl0ZW0sIHNlcXVlbmNlUU5hbWUpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChvcmRlcikgewotICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudE9yZGVyTWFwLnB1dChpdGVtLCBuZXcgSW50ZWdlcihzZXF1ZW5jZUNvdW50ZXIpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgWG1sU2NoZW1hQ2hvaWNlKSB7Ci0gICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBwcm9jZXNzIG1hbnkgc2VxdWVuY2UgdHlwZXMKLQotICAgICAgICAgICAgICAgIFhtbFNjaGVtYUNob2ljZSB4bWxTY2hlbWFDaG9pY2UgPSAoWG1sU2NoZW1hQ2hvaWNlKSBpdGVtOwotICAgICAgICAgICAgICAgIGlmICh4bWxTY2hlbWFDaG9pY2UuZ2V0SXRlbXMoKS5nZXRDb3VudCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBCZWFuV3JpdGVyTWV0YUluZm9Ib2xkZXIgYmVhbldyaXRlck1ldGFJbmZvSG9sZGVyID0gbmV3IEJlYW5Xcml0ZXJNZXRhSW5mb0hvbGRlcigpOwotICAgICAgICAgICAgICAgICAgICBiZWFuV3JpdGVyTWV0YUluZm9Ib2xkZXIuc2V0Q2hvaWNlKHRydWUpOwotICAgICAgICAgICAgICAgICAgICBwcm9jZXNzKHBhcmVudEVsZW1lbnRRTmFtZSwgeG1sU2NoZW1hQ2hvaWNlLmdldEl0ZW1zKCksIGJlYW5Xcml0ZXJNZXRhSW5mb0hvbGRlciwgZmFsc2UsIHBhcmVudFNjaGVtYSk7Ci0gICAgICAgICAgICAgICAgICAgIGJlYW5Xcml0ZXJNZXRhSW5mb0hvbGRlci5zZXRQYXJ0aWNsZUNsYXNzKHRydWUpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbG9jYWxOYW1lID0gcGFyZW50RWxlbWVudFFOYW1lLmdldExvY2FsUGFydCgpICsgIkNob2ljZSI7Ci0gICAgICAgICAgICAgICAgICAgIFFOYW1lIGNob2ljZVFOYW1lID0gbmV3IFFOYW1lKHBhcmVudEVsZW1lbnRRTmFtZS5nZXROYW1lc3BhY2VVUkkoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbE5hbWUgKyBnZXROZXh0VHlwZVN1ZmZpeChsb2NhbE5hbWUpKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGphdmFDbGFzc05hbWUgPSB3cml0ZUNvbXBsZXhQYXJ0aWNsZShjaG9pY2VRTmFtZSwgYmVhbldyaXRlck1ldGFJbmZvSG9sZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2VkVHlwZW1hcC5wdXQoY2hvaWNlUU5hbWUsIGphdmFDbGFzc05hbWUpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vcHV0IHRoZSBwYXJ0aWNhbCB0byBhcnJheQotICAgICAgICAgICAgICAgICAgICBCb29sZWFuIGlzQXJyYXkgPSB4bWxTY2hlbWFDaG9pY2UuZ2V0TWF4T2NjdXJzKCkgPiAxID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2VkRWxlbWVudEFycmF5U3RhdHVzTWFwLnB1dChpdGVtLCBpc0FycmF5KTsKLSAgICAgICAgICAgICAgICAgICAgcGFydGljbGVRTmFtZU1hcC5wdXQoaXRlbSwgY2hvaWNlUU5hbWUpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChvcmRlcikgewotICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudE9yZGVyTWFwLnB1dChpdGVtLCBuZXcgSW50ZWdlcihzZXF1ZW5jZUNvdW50ZXIpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgWG1sU2NoZW1hR3JvdXBSZWYpIHsKLQotICAgICAgICAgICAgICAgIFhtbFNjaGVtYUdyb3VwUmVmIHhtbFNjaGVtYUdyb3VwUmVmID0gKFhtbFNjaGVtYUdyb3VwUmVmKSBpdGVtOwotICAgICAgICAgICAgICAgIFFOYW1lIGdyb3VwUU5hbWUgPSB4bWxTY2hlbWFHcm91cFJlZi5nZXRSZWZOYW1lKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGdyb3VwUU5hbWUgIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghcHJvY2Vzc2VkR3JvdXBUeXBlTWFwLmNvbnRhaW5zS2V5KGdyb3VwUU5hbWUpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByb2Nlc3NlIHRoZSBzY2hlbWEgaGVyZQotICAgICAgICAgICAgICAgICAgICAgICAgWG1sU2NoZW1hIHJlc29sdmVkUGFyZW50U2NoZW1hID0gZ2V0UGFyZW50U2NoZW1hKHBhcmVudFNjaGVtYSxncm91cFFOYW1lLENPTVBPTkVOVF9HUk9VUCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWRQYXJlbnRTY2hlbWEgPT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVtYUNvbXBpbGF0aW9uRXhjZXB0aW9uKCJDYW4gbm90IGZpbmQgdGhlIGdyb3VwIHdpdGggdGhlIHFuYW1lIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cFFOYW1lICsgIiBmcm9tIHRoZSBwYXJlbnQgc2NoZW1hICIgKyBwYXJlbnRTY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBYbWxTY2hlbWFHcm91cCB4bWxTY2hlbWFHcm91cCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoWG1sU2NoZW1hR3JvdXApIHJlc29sdmVkUGFyZW50U2NoZW1hLmdldEdyb3VwcygpLmdldEl0ZW0oZ3JvdXBRTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHhtbFNjaGVtYUdyb3VwICE9IG51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzR3JvdXAoeG1sU2NoZW1hR3JvdXAsIGdyb3VwUU5hbWUsIHJlc29sdmVkUGFyZW50U2NoZW1hKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBCb29sZWFuIGlzQXJyYXkgPSB4bWxTY2hlbWFHcm91cFJlZi5nZXRNYXhPY2N1cnMoKSA+IDEgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotICAgICAgICAgICAgICAgICAgICBwcm9jZXNzZWRFbGVtZW50QXJyYXlTdGF0dXNNYXAucHV0KGl0ZW0saXNBcnJheSk7Ci0gICAgICAgICAgICAgICAgICAgIHBhcnRpY2xlUU5hbWVNYXAucHV0KGl0ZW0sZ3JvdXBRTmFtZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG9yZGVyKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRPcmRlck1hcC5wdXQoaXRlbSwgbmV3IEludGVnZXIoc2VxdWVuY2VDb3VudGVyKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbigiUmVmZXJlbmNlZCBuYW1lIGlzIG51bGwiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vdGhlcmUgbWF5IGJlIG90aGVyIHR5cGVzIHRvIGJlIGhhbmRsZWQgaGVyZS4gQWRkIHRoZW0KLSAgICAgICAgICAgICAgICAvL3doZW4gd2UgYXJlIHJlYWR5Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgc2VxdWVuY2VDb3VudGVyKys7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBsb29wIHRocm91Z2ggdGhlIHByb2Nlc3NlZCBpdGVtcyBhbmQgYWRkIHRoZW0gdG8gdGhlIG1hdGFpbmYgb2JqZWN0Ci0gICAgICAgIEl0ZXJhdG9yIHByb2Nlc3NlZEVsZW1lbnRzSXRlcmF0b3IgPSBwcm9jZXNzZWRFbGVtZW50QXJyYXlTdGF0dXNNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsKLSAgICAgICAgaW50IHN0YXJ0aW5nSXRlbU51bWJlck9yZGVyID0gbWV0YWluZkhvbGRlci5nZXRPcmRlclN0YXJ0UG9pbnQoKTsKLSAgICAgICAgd2hpbGUgKHByb2Nlc3NlZEVsZW1lbnRzSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBPYmplY3QgY2hpbGQgPSBwcm9jZXNzZWRFbGVtZW50c0l0ZXJhdG9yLm5leHQoKTsKLQotICAgICAgICAgICAgLy8gcHJvY2VzcyB0aGUgWG1sU2NoZW1hRWxlbWVudAotICAgICAgICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgWG1sU2NoZW1hRWxlbWVudCkgewotICAgICAgICAgICAgICAgIFhtbFNjaGVtYUVsZW1lbnQgZWx0ID0gKFhtbFNjaGVtYUVsZW1lbnQpIGNoaWxkOwotICAgICAgICAgICAgICAgIFFOYW1lIHJlZmVyZW5jZWRRTmFtZSA9IG51bGw7Ci0KLQotICAgICAgICAgICAgICAgIGlmIChlbHQuZ2V0UU5hbWUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZWRRTmFtZSA9IGVsdC5nZXRRTmFtZSgpOwotICAgICAgICAgICAgICAgICAgICBRTmFtZSBzY2hlbWFUeXBlUU5hbWUgPSBlbHQuZ2V0U2NoZW1hVHlwZSgpICE9IG51bGwgPyBlbHQuZ2V0U2NoZW1hVHlwZSgpLmdldFFOYW1lKCkgOiBlbHQuZ2V0U2NoZW1hVHlwZU5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNjaGVtYVR5cGVRTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY2xhenpOYW1lID0gKFN0cmluZykgcHJvY2Vzc2VkRWxlbWVudFR5cGVNYXAuZ2V0KGVsdC5nZXRRTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFpbmZIb2xkZXIucmVnaXN0ZXJNYXBwaW5nKHJlZmVyZW5jZWRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hVHlwZVFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGF6ek5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQm9vbGVhbikgcHJvY2Vzc2VkRWxlbWVudEFycmF5U3RhdHVzTWFwLmdldChlbHQpKS5ib29sZWFuVmFsdWUoKSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hQ29uc3RhbnRzLkFSUkFZX1RZUEUgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYUNvbnN0YW50cy5FTEVNRU5UX1RZUEUpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlubmVyQ2hvaWNlRWxlbWVudExpc3QuY29udGFpbnMocmVmZXJlbmNlZFFOYW1lKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWluZkhvbGRlci5hZGR0U3RhdHVzKHJlZmVyZW5jZWRRTmFtZSxTY2hlbWFDb25zdGFudHMuSU5ORVJfQ0hPSUNFX0VMRU1FTlQpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVnaXN0ZXIgdGhlIGRlZmF1bHQgdmFsdWUgYXMgd2VsbAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsdC5nZXREZWZhdWx0VmFsdWUoKSAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFpbmZIb2xkZXIucmVnaXN0ZXJEZWZhdWx0VmFsdWUocmVmZXJlbmNlZFFOYW1lLGVsdC5nZXREZWZhdWx0VmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChlbHQuZ2V0UmVmTmFtZSgpICE9IG51bGwpIHsgLy9wcm9iYWJseSB0aGlzIGlzIHJlZmVyZW5jZWQKLSAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlZFFOYW1lID0gZWx0LmdldFJlZk5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBhcnJheVN0YXR1cyA9ICgoQm9vbGVhbikgcHJvY2Vzc2VkRWxlbWVudEFycmF5U3RhdHVzTWFwLmdldChlbHQpKS5ib29sZWFuVmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNsYXp6TmFtZSA9IGZpbmRSZWZDbGFzc05hbWUocmVmZXJlbmNlZFFOYW1lLCBhcnJheVN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjbGF6ek5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2xhenpOYW1lID0gZmluZENsYXNzTmFtZShyZWZlcmVuY2VkUU5hbWUsIGFycmF5U3RhdHVzKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBYbWxTY2hlbWEgcmVzb2x2ZWRQYXJlbnRTY2hlbWEgPSBnZXRQYXJlbnRTY2hlbWEocGFyZW50U2NoZW1hLHJlZmVyZW5jZWRRTmFtZSxDT01QT05FTlRfRUxFTUVOVCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlZFBhcmVudFNjaGVtYSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24oIkNhbiBub3QgZmluZCB0aGUgZWxlbWVudCAiICsgcmVmZXJlbmNlZFFOYW1lICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBmcm9tIHRoZSBwYXJlbnQgc2NoZW1hICIgKyBwYXJlbnRTY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgWG1sU2NoZW1hRWxlbWVudCByZWZFbGVtZW50ID0gcmVzb2x2ZWRQYXJlbnRTY2hlbWEuZ2V0RWxlbWVudEJ5TmFtZShyZWZlcmVuY2VkUU5hbWUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyByZWdpc3RlciB0aGUgbWFwcGluZyBpZiB3ZSBmb3VuZCB0aGUgcmVmZXJlbmNlZCBlbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBlbHNlIHRocm93IGFuIGV4Y2VwdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlZkVsZW1lbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFpbmZIb2xkZXIucmVnaXN0ZXJNYXBwaW5nKHJlZmVyZW5jZWRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZkVsZW1lbnQuZ2V0U2NoZW1hVHlwZU5hbWUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBjbGF6ek5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheVN0YXR1cyA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYUNvbnN0YW50cy5BUlJBWV9UWVBFIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hQ29uc3RhbnRzLkVMRU1FTlRfVFlQRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWZlcmVuY2VkUU5hbWUuZXF1YWxzKFNjaGVtYUNvbnN0YW50cy5YU0RfU0NIRU1BKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhaW5mSG9sZGVyLnJlZ2lzdGVyTWFwcGluZyhyZWZlcmVuY2VkUU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIuZ2V0RGVmYXVsdENsYXNzTmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYUNvbnN0YW50cy5BTllfVFlQRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVtYUNvbXBpbGF0aW9uRXhjZXB0aW9uKFNjaGVtYUNvbXBpbGVyTWVzc2FnZXMuZ2V0TWVzc2FnZSgic2NoZW1hLnJlZmVyZW5jZWRFbGVtZW50Tm90Rm91bmQiLCByZWZlcmVuY2VkUU5hbWUudG9TdHJpbmcoKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChyZWZlcmVuY2VkUU5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24oU2NoZW1hQ29tcGlsZXJNZXNzYWdlcy5nZXRNZXNzYWdlKCJzY2hlbWEuZW1wdHlOYW1lIikpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vcmVnaXN0ZXIgdGhlIG9jY3VyZW5jZSBjb3VudHMKLSAgICAgICAgICAgICAgICBtZXRhaW5mSG9sZGVyLmFkZE1heE9jY3VycyhyZWZlcmVuY2VkUU5hbWUsIGVsdC5nZXRNYXhPY2N1cnMoKSk7Ci0gICAgICAgICAgICAgICAgLy8gaWYgdGhlIHN0cmljdCB2YWxpZGF0aW9uIG9mZiB0aGVuIHdlIGNvbnNpZGVyIGFsbCBlbGVtZW50cyBoYXZlIG1pbk9jY3VycyB6ZXJvIG9uIGl0Ci0gICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5pc09mZlN0cmljdFZhbGlkYXRpb24oKSl7Ci0gICAgICAgICAgICAgICAgICAgIG1ldGFpbmZIb2xkZXIuYWRkTWluT2NjdXJzKHJlZmVyZW5jZWRRTmFtZSwgMCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbWV0YWluZkhvbGRlci5hZGRNaW5PY2N1cnMocmVmZXJlbmNlZFFOYW1lLCBlbHQuZ2V0TWluT2NjdXJzKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvL3dlIG5lZWQgdGhlIG9yZGVyIHRvIGJlIHByZXNlcnZlZC4gU28gcmVjb3JkIHRoZSBvcmRlciBhbHNvCi0gICAgICAgICAgICAgICAgaWYgKG9yZGVyKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vcmVjb3JkIHRoZSBvcmRlciBpbiB0aGUgbWV0YWluZiBob2xkZXIKLSAgICAgICAgICAgICAgICAgICAgSW50ZWdlciBpbnRlZ2VyID0gKEludGVnZXIpIGVsZW1lbnRPcmRlck1hcC5nZXQoZWx0KTsKLSAgICAgICAgICAgICAgICAgICAgbWV0YWluZkhvbGRlci5yZWdpc3RlclFOYW1lSW5kZXgocmVmZXJlbmNlZFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0aW5nSXRlbU51bWJlck9yZGVyICsgaW50ZWdlci5pbnRWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvL2dldCB0aGUgbmlsbGFibGUgc3RhdGUgYW5kIHJlZ2lzdGVyIHRoYXQgb24gdGhlIG1ldGFpbmYgaG9sZGVyCi0gICAgICAgICAgICAgICAgaWYgKGxvY2FsTmlsbGFibGVMaXN0LmNvbnRhaW5zKGVsdC5nZXRRTmFtZSgpKSkgewotICAgICAgICAgICAgICAgICAgICBtZXRhaW5mSG9sZGVyLnJlZ2lzdGVyTmlsbGFibGVRTmFtZShlbHQuZ2V0UU5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy9nZXQgdGhlIGJpbmFyeSBzdGF0ZSBhbmQgYWRkIHRoYXQgdG8gdGhlIHN0YXR1cyBtYXAKLSAgICAgICAgICAgICAgICBpZiAoaXNCaW5hcnkoZWx0KSkgewotICAgICAgICAgICAgICAgICAgICBtZXRhaW5mSG9sZGVyLmFkZHRTdGF0dXMoZWx0LmdldFFOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hQ29uc3RhbnRzLkJJTkFSWV9UWVBFKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gcHJvY2VzcyB0aGUgWE1MU2NoZW1hQW55Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGNoaWxkIGluc3RhbmNlb2YgWG1sU2NoZW1hQW55KSB7Ci0gICAgICAgICAgICAgICAgWG1sU2NoZW1hQW55IGFueSA9IChYbWxTY2hlbWFBbnkpIGNoaWxkOwotCi0gICAgICAgICAgICAgICAgLy9zaW5jZSB0aGVyZSBpcyBvbmx5IG9uZSBlbGVtZW50IGhlcmUgaXQgZG9lcyBub3QgbWF0dGVyCi0gICAgICAgICAgICAgICAgLy9mb3IgdGhlIGNvbnN0YW50LiBIb3dldmVyIHRoZSBwcm9ibGVtIG9jY3VycyBpZiB0aGUgdXNlcnMKLSAgICAgICAgICAgICAgICAvL3VzZXMgdGhlIHNhbWUgbmFtZSBmb3IgYW4gZWxlbWVudCBkZWNhbHJhdGlvbgotICAgICAgICAgICAgICAgIFFOYW1lIGFueUVsZW1lbnRGaWVsZE5hbWUgPSBuZXcgUU5hbWUoQU5ZX0VMRU1FTlRfRklFTERfTkFNRSk7Ci0KLSAgICAgICAgICAgICAgICAvL3RoaXMgY2FuIGJlIGFuIGFycmF5IG9yIGEgc2luZ2xlIGVsZW1lbnQKLSAgICAgICAgICAgICAgICBib29sZWFuIGlzQXJyYXkgPSAoKEJvb2xlYW4pIHByb2Nlc3NlZEVsZW1lbnRBcnJheVN0YXR1c01hcC5nZXQoYW55KSkuYm9vbGVhblZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgbWV0YWluZkhvbGRlci5yZWdpc3Rlck1hcHBpbmcoYW55RWxlbWVudEZpZWxkTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICBpc0FycmF5ID8gd3JpdGVyLmdldERlZmF1bHRDbGFzc0FycmF5TmFtZSgpIDogd3JpdGVyLmdldERlZmF1bHRDbGFzc05hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYUNvbnN0YW50cy5BTllfVFlQRSk7Ci0gICAgICAgICAgICAgICAgLy9pZiBpdCdzIGFuIGFycmF5IHJlZ2lzdGVyIGFuIGV4dHJhIHN0YXR1cyBmbGFnIHdpdGggdGhlIHN5c3RlbQotICAgICAgICAgICAgICAgIGlmIChpc0FycmF5KSB7Ci0gICAgICAgICAgICAgICAgICAgIG1ldGFpbmZIb2xkZXIuYWRkdFN0YXR1cyhhbnlFbGVtZW50RmllbGROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYUNvbnN0YW50cy5BUlJBWV9UWVBFKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbWV0YWluZkhvbGRlci5hZGRNYXhPY2N1cnMoYW55RWxlbWVudEZpZWxkTmFtZSwgYW55LmdldE1heE9jY3VycygpKTsKLSAgICAgICAgICAgICAgICBtZXRhaW5mSG9sZGVyLmFkZE1pbk9jY3VycyhhbnlFbGVtZW50RmllbGROYW1lLCBhbnkuZ2V0TWluT2NjdXJzKCkpOwotCi0gICAgICAgICAgICAgICAgaWYgKG9yZGVyKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vcmVjb3JkIHRoZSBvcmRlciBpbiB0aGUgbWV0YWluZiBob2xkZXIgZm9yIHRoZSBhbnkKLSAgICAgICAgICAgICAgICAgICAgSW50ZWdlciBpbnRlZ2VyID0gKEludGVnZXIpIGVsZW1lbnRPcmRlck1hcC5nZXQoYW55KTsKLSAgICAgICAgICAgICAgICAgICAgbWV0YWluZkhvbGRlci5yZWdpc3RlclFOYW1lSW5kZXgoYW55RWxlbWVudEZpZWxkTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydGluZ0l0ZW1OdW1iZXJPcmRlciArIGludGVnZXIuaW50VmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChjaGlsZCBpbnN0YW5jZW9mIFhtbFNjaGVtYVNlcXVlbmNlKSB7Ci0gICAgICAgICAgICAgICAgWG1sU2NoZW1hU2VxdWVuY2UgeG1sU2NoZW1hU2VxdWVuY2UgPSAoWG1sU2NoZW1hU2VxdWVuY2UpIGNoaWxkOwotICAgICAgICAgICAgICAgIFFOYW1lIHNlcXVlbmNlUU5hbWUgPSAoUU5hbWUpIHBhcnRpY2xlUU5hbWVNYXAuZ2V0KGNoaWxkKTsKLSAgICAgICAgICAgICAgICBib29sZWFuIGlzQXJyYXkgPSB4bWxTY2hlbWFTZXF1ZW5jZS5nZXRNYXhPY2N1cnMoKSA+IDE7Ci0KLSAgICAgICAgICAgICAgICAvLyBhZGQgdGhpcyBhcyBhbiBhcnJheSB0byB0aGUgb3JpZ2luYWwgY2xhc3MKLSAgICAgICAgICAgICAgICBtZXRhaW5mSG9sZGVyLnJlZ2lzdGVyTWFwcGluZyhzZXF1ZW5jZVFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmRDbGFzc05hbWUoc2VxdWVuY2VRTmFtZSwgaXNBcnJheSkpOwotICAgICAgICAgICAgICAgIGlmIChpc0FycmF5KSB7Ci0gICAgICAgICAgICAgICAgICAgIG1ldGFpbmZIb2xkZXIuYWRkdFN0YXR1cyhzZXF1ZW5jZVFOYW1lLCBTY2hlbWFDb25zdGFudHMuQVJSQVlfVFlQRSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1ldGFpbmZIb2xkZXIuYWRkdFN0YXR1cyhzZXF1ZW5jZVFOYW1lLCBTY2hlbWFDb25zdGFudHMuUEFSVElDTEVfVFlQRV9FTEVNRU5UKTsKLSAgICAgICAgICAgICAgICBtZXRhaW5mSG9sZGVyLmFkZE1heE9jY3VycyhzZXF1ZW5jZVFOYW1lLCB4bWxTY2hlbWFTZXF1ZW5jZS5nZXRNYXhPY2N1cnMoKSk7Ci0gICAgICAgICAgICAgICAgbWV0YWluZkhvbGRlci5hZGRNaW5PY2N1cnMoc2VxdWVuY2VRTmFtZSwgeG1sU2NoZW1hU2VxdWVuY2UuZ2V0TWluT2NjdXJzKCkpOwotICAgICAgICAgICAgICAgIG1ldGFpbmZIb2xkZXIuc2V0SGFzUGFydGljbGVUeXBlKHRydWUpOwotCi0gICAgICAgICAgICAgICAgaWYgKG9yZGVyKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vcmVjb3JkIHRoZSBvcmRlciBpbiB0aGUgbWV0YWluZiBob2xkZXIgZm9yIHRoZSBhbnkKLSAgICAgICAgICAgICAgICAgICAgSW50ZWdlciBpbnRlZ2VyID0gKEludGVnZXIpIGVsZW1lbnRPcmRlck1hcC5nZXQoY2hpbGQpOwotICAgICAgICAgICAgICAgICAgICBtZXRhaW5mSG9sZGVyLnJlZ2lzdGVyUU5hbWVJbmRleChzZXF1ZW5jZVFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0aW5nSXRlbU51bWJlck9yZGVyICsgaW50ZWdlci5pbnRWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGNoaWxkIGluc3RhbmNlb2YgWG1sU2NoZW1hQ2hvaWNlKSB7Ci0gICAgICAgICAgICAgICAgWG1sU2NoZW1hQ2hvaWNlIHhtbFNjaGVtYUNob2ljZSA9IChYbWxTY2hlbWFDaG9pY2UpIGNoaWxkOwotICAgICAgICAgICAgICAgIFFOYW1lIGNob2ljZVFOYW1lID0gKFFOYW1lKSBwYXJ0aWNsZVFOYW1lTWFwLmdldChjaGlsZCk7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBpc0FycmF5ID0geG1sU2NoZW1hQ2hvaWNlLmdldE1heE9jY3VycygpID4gMTsKLQotICAgICAgICAgICAgICAgIC8vIGFkZCB0aGlzIGFzIGFuIGFycmF5IHRvIHRoZSBvcmlnaW5hbCBjbGFzcwotICAgICAgICAgICAgICAgIG1ldGFpbmZIb2xkZXIucmVnaXN0ZXJNYXBwaW5nKGNob2ljZVFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgY2hvaWNlUU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBmaW5kQ2xhc3NOYW1lKGNob2ljZVFOYW1lLCBpc0FycmF5KSk7Ci0gICAgICAgICAgICAgICAgaWYgKGlzQXJyYXkpIHsKLSAgICAgICAgICAgICAgICAgICAgbWV0YWluZkhvbGRlci5hZGR0U3RhdHVzKGNob2ljZVFOYW1lLCBTY2hlbWFDb25zdGFudHMuQVJSQVlfVFlQRSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1ldGFpbmZIb2xkZXIuYWRkdFN0YXR1cyhjaG9pY2VRTmFtZSwgU2NoZW1hQ29uc3RhbnRzLlBBUlRJQ0xFX1RZUEVfRUxFTUVOVCk7Ci0gICAgICAgICAgICAgICAgbWV0YWluZkhvbGRlci5hZGRNYXhPY2N1cnMoY2hvaWNlUU5hbWUsIHhtbFNjaGVtYUNob2ljZS5nZXRNYXhPY2N1cnMoKSk7Ci0gICAgICAgICAgICAgICAgbWV0YWluZkhvbGRlci5hZGRNaW5PY2N1cnMoY2hvaWNlUU5hbWUsIHhtbFNjaGVtYUNob2ljZS5nZXRNaW5PY2N1cnMoKSk7Ci0gICAgICAgICAgICAgICAgbWV0YWluZkhvbGRlci5zZXRIYXNQYXJ0aWNsZVR5cGUodHJ1ZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAob3JkZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgLy9yZWNvcmQgdGhlIG9yZGVyIGluIHRoZSBtZXRhaW5mIGhvbGRlciBmb3IgdGhlIGFueQotICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyIGludGVnZXIgPSAoSW50ZWdlcikgZWxlbWVudE9yZGVyTWFwLmdldChjaGlsZCk7Ci0gICAgICAgICAgICAgICAgICAgIG1ldGFpbmZIb2xkZXIucmVnaXN0ZXJRTmFtZUluZGV4KGNob2ljZVFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0aW5nSXRlbU51bWJlck9yZGVyICsgaW50ZWdlci5pbnRWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGNoaWxkIGluc3RhbmNlb2YgWG1sU2NoZW1hR3JvdXBSZWYpIHsKLSAgICAgICAgICAgICAgICBYbWxTY2hlbWFHcm91cFJlZiB4bWxTY2hlbWFHcm91cFJlZiA9IChYbWxTY2hlbWFHcm91cFJlZikgY2hpbGQ7Ci0gICAgICAgICAgICAgICAgUU5hbWUgZ3JvdXBRTmFtZSA9IChRTmFtZSkgcGFydGljbGVRTmFtZU1hcC5nZXQoY2hpbGQpOwotICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNBcnJheSA9IHhtbFNjaGVtYUdyb3VwUmVmLmdldE1heE9jY3VycygpID4gMTsKLQotICAgICAgICAgICAgICAgIC8vIGFkZCB0aGlzIGFzIGFuIGFycmF5IHRvIHRoZSBvcmlnaW5hbCBjbGFzcwotICAgICAgICAgICAgICAgIFN0cmluZyBncm91cENsYXNzTmFtZSA9IChTdHJpbmcpIHByb2Nlc3NlZEdyb3VwVHlwZU1hcC5nZXQoZ3JvdXBRTmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGlzQXJyYXkpewotICAgICAgICAgICAgICAgICAgICBncm91cENsYXNzTmFtZSA9IGdyb3VwQ2xhc3NOYW1lICsgIltdIjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbWV0YWluZkhvbGRlci5yZWdpc3Rlck1hcHBpbmcoZ3JvdXBRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwUU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBncm91cENsYXNzTmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGlzQXJyYXkpIHsKLSAgICAgICAgICAgICAgICAgICAgbWV0YWluZkhvbGRlci5hZGR0U3RhdHVzKGdyb3VwUU5hbWUsIFNjaGVtYUNvbnN0YW50cy5BUlJBWV9UWVBFKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbWV0YWluZkhvbGRlci5hZGR0U3RhdHVzKGdyb3VwUU5hbWUsIFNjaGVtYUNvbnN0YW50cy5QQVJUSUNMRV9UWVBFX0VMRU1FTlQpOwotICAgICAgICAgICAgICAgIG1ldGFpbmZIb2xkZXIuYWRkTWF4T2NjdXJzKGdyb3VwUU5hbWUsIHhtbFNjaGVtYUdyb3VwUmVmLmdldE1heE9jY3VycygpKTsKLSAgICAgICAgICAgICAgICBtZXRhaW5mSG9sZGVyLmFkZE1pbk9jY3Vycyhncm91cFFOYW1lLCB4bWxTY2hlbWFHcm91cFJlZi5nZXRNaW5PY2N1cnMoKSk7Ci0gICAgICAgICAgICAgICAgbWV0YWluZkhvbGRlci5zZXRIYXNQYXJ0aWNsZVR5cGUodHJ1ZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAob3JkZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgLy9yZWNvcmQgdGhlIG9yZGVyIGluIHRoZSBtZXRhaW5mIGhvbGRlciBmb3IgdGhlIGFueQotICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyIGludGVnZXIgPSAoSW50ZWdlcikgZWxlbWVudE9yZGVyTWFwLmdldChjaGlsZCk7Ci0gICAgICAgICAgICAgICAgICAgIG1ldGFpbmZIb2xkZXIucmVnaXN0ZXJRTmFtZUluZGV4KGdyb3VwUU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRpbmdJdGVtTnVtYmVyT3JkZXIgKyBpbnRlZ2VyLmludFZhbHVlKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vc2V0IHRoZSBvcmRlcmVkIGZsYWcgaW4gdGhlIG1ldGFpbmYgaG9sZGVyCi0gICAgICAgIG1ldGFpbmZIb2xkZXIuc2V0T3JkZXJlZChvcmRlcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoKLSAgICAgKiBAcGFyYW0geG1sU2NoZW1hR3JvdXAKLSAgICAgKiBAcGFyYW0gc2NoZW1hR3JvdXBRTmFtZS0gd2UgaGF2ZSB0byBwYXNzIHRoaXMgc2luY2UgeG1sIHNjaGVtYSBkb2VzIG5vdCBwcm92aWRlCi0gICAgICogdGhpcyBwcm9wZXJseQotICAgICAqIEBwYXJhbSBwYXJlbnRTY2hlbWEKLSAgICAgKiBAdGhyb3dzIFNjaGVtYUNvbXBpbGF0aW9uRXhjZXB0aW9uCi0gICAgICovCi0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0dyb3VwKFhtbFNjaGVtYUdyb3VwIHhtbFNjaGVtYUdyb3VwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUU5hbWUgc2NoZW1hR3JvdXBRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhtbFNjaGVtYSBwYXJlbnRTY2hlbWEpIHRocm93cyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgLy8gZmluZCB0aGUgZ3JvdXAgYmFzZSBpdGVtCi0gICAgICAgIFhtbFNjaGVtYUdyb3VwQmFzZSB4bWxTY2hlbWFHcm91cEJhc2UgPSB4bWxTY2hlbWFHcm91cC5nZXRQYXJ0aWNsZSgpOwotICAgICAgICBpZiAoeG1sU2NoZW1hR3JvdXBCYXNlICE9IG51bGwpewotICAgICAgICAgICAgaWYgKHhtbFNjaGVtYUdyb3VwQmFzZSBpbnN0YW5jZW9mIFhtbFNjaGVtYVNlcXVlbmNlKXsKLSAgICAgICAgICAgICAgICBYbWxTY2hlbWFTZXF1ZW5jZSB4bWxTY2hlbWFTZXF1ZW5jZSA9IChYbWxTY2hlbWFTZXF1ZW5jZSkgeG1sU2NoZW1hR3JvdXBCYXNlOwotICAgICAgICAgICAgICAgIGlmICh4bWxTY2hlbWFTZXF1ZW5jZS5nZXRJdGVtcygpLmdldENvdW50KCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIEJlYW5Xcml0ZXJNZXRhSW5mb0hvbGRlciBiZWFuV3JpdGVyTWV0YUluZm9Ib2xkZXIgPSBuZXcgQmVhbldyaXRlck1ldGFJbmZvSG9sZGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgIHByb2Nlc3Moc2NoZW1hR3JvdXBRTmFtZSwgeG1sU2NoZW1hU2VxdWVuY2UuZ2V0SXRlbXMoKSwgYmVhbldyaXRlck1ldGFJbmZvSG9sZGVyLCB0cnVlLCBwYXJlbnRTY2hlbWEpOwotICAgICAgICAgICAgICAgICAgICBiZWFuV3JpdGVyTWV0YUluZm9Ib2xkZXIuc2V0UGFydGljbGVDbGFzcyh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGphdmFDbGFzc05hbWUgPSB3cml0ZUNvbXBsZXhQYXJ0aWNsZShzY2hlbWFHcm91cFFOYW1lLCBiZWFuV3JpdGVyTWV0YUluZm9Ib2xkZXIpOwotICAgICAgICAgICAgICAgICAgICBwcm9jZXNzZWRHcm91cFR5cGVNYXAucHV0KHNjaGVtYUdyb3VwUU5hbWUsIGphdmFDbGFzc05hbWUpOwotLy8gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZFR5cGVtYXAucHV0KHNjaGVtYUdyb3VwUU5hbWUsIGphdmFDbGFzc05hbWUpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBlbHNlIGlmICh4bWxTY2hlbWFHcm91cEJhc2UgaW5zdGFuY2VvZiBYbWxTY2hlbWFDaG9pY2UpewotICAgICAgICAgICAgICAgIFhtbFNjaGVtYUNob2ljZSB4bWxTY2hlbWFDaG9pY2UgPSAoWG1sU2NoZW1hQ2hvaWNlKSB4bWxTY2hlbWFHcm91cEJhc2U7Ci0gICAgICAgICAgICAgICAgaWYgKHhtbFNjaGVtYUNob2ljZS5nZXRJdGVtcygpLmdldENvdW50KCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIEJlYW5Xcml0ZXJNZXRhSW5mb0hvbGRlciBiZWFuV3JpdGVyTWV0YUluZm9Ib2xkZXIgPSBuZXcgQmVhbldyaXRlck1ldGFJbmZvSG9sZGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJlYW5Xcml0ZXJNZXRhSW5mb0hvbGRlci5zZXRDaG9pY2UodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIHByb2Nlc3Moc2NoZW1hR3JvdXBRTmFtZSwgeG1sU2NoZW1hQ2hvaWNlLmdldEl0ZW1zKCksIGJlYW5Xcml0ZXJNZXRhSW5mb0hvbGRlciwgZmFsc2UsIHBhcmVudFNjaGVtYSk7Ci0gICAgICAgICAgICAgICAgICAgIGJlYW5Xcml0ZXJNZXRhSW5mb0hvbGRlci5zZXRQYXJ0aWNsZUNsYXNzKHRydWUpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgamF2YUNsYXNzTmFtZSA9IHdyaXRlQ29tcGxleFBhcnRpY2xlKHNjaGVtYUdyb3VwUU5hbWUsIGJlYW5Xcml0ZXJNZXRhSW5mb0hvbGRlcik7Ci0gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZEdyb3VwVHlwZU1hcC5wdXQoc2NoZW1hR3JvdXBRTmFtZSwgamF2YUNsYXNzTmFtZSk7Ci0vLyAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2VkVHlwZW1hcC5wdXQoc2NoZW1hR3JvdXBRTmFtZSwgamF2YUNsYXNzTmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIHdoZXRoZXIgYSBnaXZlbiBlbGVtZW50IGlzIGEgYmluYXJ5IGVsZW1lbnQKLSAgICAgKgotICAgICAqIEBwYXJhbSBlbHQKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNCaW5hcnkoWG1sU2NoZW1hRWxlbWVudCBlbHQpIHsKLSAgICAgICAgcmV0dXJuIGVsdC5nZXRTY2hlbWFUeXBlKCkgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgIFNjaGVtYUNvbnN0YW50cy5YU0RfQkFTRTY0LmVxdWFscyhlbHQuZ2V0U2NoZW1hVHlwZSgpLmdldFFOYW1lKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrcyB3aGV0aGVyIGEgZ2l2ZW4gcW5hbWUgaXMgYSBiaW5hcnkKLSAgICAgKgotICAgICAqIEBwYXJhbSBxTmFtZQotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBpc0JpbmFyeShRTmFtZSBxTmFtZSkgewotICAgICAgICByZXR1cm4gcU5hbWUgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgIFNjaGVtYUNvbnN0YW50cy5YU0RfQkFTRTY0LmVxdWFscyhxTmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHNpbXBsZVR5cGUKLSAgICAgKiBAcGFyYW0geHNFbHQKLSAgICAgKiBAcGFyYW0gcGFyZW50U2NoZW1hCi0gICAgICogQHBhcmFtIHFuYW1lICAgICAgICAtIGZha2UgUW5hbWUgdG8gdXNlIGlmIHRoZSB4c0VsdCBpcyBudWxsLgotICAgICAqIEB0aHJvd3MgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc1NpbXBsZVNjaGVtYVR5cGUoWG1sU2NoZW1hU2ltcGxlVHlwZSBzaW1wbGVUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYbWxTY2hlbWFFbGVtZW50IHhzRWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYbWxTY2hlbWEgcGFyZW50U2NoZW1hLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRTmFtZSBxbmFtZSkgdGhyb3dzIFNjaGVtYUNvbXBpbGF0aW9uRXhjZXB0aW9uIHsKLQotICAgICAgICBTdHJpbmcgZnVsbHlRdWFsaWZpZWRDbGFzc05hbWUgPSBudWxsOwotICAgICAgICBpZiAoc2ltcGxlVHlwZS5nZXRRTmFtZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChwcm9jZXNzZWRUeXBlbWFwLmNvbnRhaW5zS2V5KHNpbXBsZVR5cGUuZ2V0UU5hbWUoKSkKLSAgICAgICAgICAgICAgICAgICAgfHwgYmFzZVNjaGVtYVR5cGVNYXAuY29udGFpbnNLZXkoc2ltcGxlVHlwZS5nZXRRTmFtZSgpKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gTXVzdCBkbyB0aGlzIHVwIGZyb250IHRvIHN1cHBvcnQgcmVjdXJzaXZlIHR5cGVzCi0gICAgICAgICAgICBmdWxseVF1YWxpZmllZENsYXNzTmFtZSA9IHdyaXRlci5tYWtlRnVsbHlRdWFsaWZpZWRDbGFzc05hbWUoc2ltcGxlVHlwZS5nZXRRTmFtZSgpKTsKLSAgICAgICAgICAgIC8vIHdlIHB1dCB0aGUgcW5hbWUgdG8gcHJvY2Vzc2VkIHR5cGUgbWFwIGl0IGlzIG9ubHkgbmFtZWQgdHlwZQotICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIHdlIGhhdmUgdG8gYW55IHdheSBwcm9jZXNzIHRoYXQgZWxlbWVudC4KLSAgICAgICAgICAgIHByb2Nlc3NlZFR5cGVtYXAucHV0KHNpbXBsZVR5cGUuZ2V0UU5hbWUoKSwgZnVsbHlRdWFsaWZpZWRDbGFzc05hbWUpOwotICAgICAgICB9IGVsc2UgewotCi0gICAgICAgICAgICBRTmFtZSBmYWtlUW5hbWU7Ci0gICAgICAgICAgICBpZiAoeHNFbHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZha2VRbmFtZSA9IG5ldyBRTmFtZSh4c0VsdC5nZXRRTmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpLCB4c0VsdC5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpICsgZ2V0TmV4dFR5cGVTdWZmaXgoeHNFbHQuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKSkpOwotICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gc2V0IHRoaXMgb3RoZXJ3aXNlIHRoZSBvdXJzIGF0dHJpYnV0ZSB3b3VsZCBub3Qgc2V0IHByb3Blcmx5IGlmIHJlZmVyZWQgdG8gdGhpcyBzaW1wbGUKLSAgICAgICAgICAgICAgICAvLyB0eXBlIGZyb20gYW55IG90aGVyIGVsZW1lbnQKLSAgICAgICAgICAgICAgICB4c0VsdC5zZXRTY2hlbWFUeXBlTmFtZShmYWtlUW5hbWUpOwotICAgICAgICAgICAgICAgIGNoYW5nZWRFbGVtZW50U2V0LmFkZCh4c0VsdCk7Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZmFrZVFuYW1lID0gcW5hbWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocHJvY2Vzc2VkVHlwZW1hcC5jb250YWluc0tleShmYWtlUW5hbWUpCi0gICAgICAgICAgICAgICAgICAgIHx8IGJhc2VTY2hlbWFUeXBlTWFwLmNvbnRhaW5zS2V5KGZha2VRbmFtZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmdWxseVF1YWxpZmllZENsYXNzTmFtZSA9IHdyaXRlci5tYWtlRnVsbHlRdWFsaWZpZWRDbGFzc05hbWUoZmFrZVFuYW1lKTsKLSAgICAgICAgICAgIHNpbXBsZVR5cGUuYWRkTWV0YUluZm8oU2NoZW1hQ29uc3RhbnRzLlNjaGVtYUNvbXBpbGVySW5mb0hvbGRlci5GQUtFX1FOQU1FLCBmYWtlUW5hbWUpOwotCi0gICAgICAgICAgICAvLyBzaG91bGQgcHV0IHRoaXMgdG8gdGhlIHByb2Nlc3NlZFR5cGVtYXAgdG8gZ2VuZXJhdGUgdGhlIGNvZGUgY29ycmVjdGx5Ci0gICAgICAgICAgICBwcm9jZXNzZWRUeXBlbWFwLnB1dChmYWtlUW5hbWUsIGZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vcmVnaXN0ZXIgdGhhdCBpbiB0aGUgc2NoZW1hIG1ldGFpbmZvIGJhZwotICAgICAgICBzaW1wbGVUeXBlLmFkZE1ldGFJbmZvKFNjaGVtYUNvbnN0YW50cy5TY2hlbWFDb21waWxlckluZm9Ib2xkZXIuQ0xBU1NOQU1FX0tFWSwKLSAgICAgICAgICAgICAgICBmdWxseVF1YWxpZmllZENsYXNzTmFtZSk7Ci0KLSAgICAgICAgQmVhbldyaXRlck1ldGFJbmZvSG9sZGVyIG1ldGFJbmZIb2xkZXIgPSBwcm9jZXNzU2ltcGxlVHlwZShzaW1wbGVUeXBlLCBwYXJlbnRTY2hlbWEpOwotICAgICAgICBtZXRhSW5mSG9sZGVyLnNldFNpbXBsZSh0cnVlKTsKLQotICAgICAgICBpZiAoc2ltcGxlVHlwZS5nZXRRTmFtZSgpID09IG51bGwpIHsKLSAgICAgICAgICAgIHRoaXMucHJvY2Vzc2VkQW5vbnltb3VzQ29tcGxleFR5cGVzTWFwLnB1dCh4c0VsdCwgbWV0YUluZkhvbGRlcik7Ci0gICAgICAgICAgICBRTmFtZSBmYWtlUW5hbWU7Ci0gICAgICAgICAgICBpZiAoeHNFbHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZha2VRbmFtZSA9IG5ldyBRTmFtZSh4c0VsdC5nZXRRTmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpLCB4c0VsdC5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZmFrZVFuYW1lID0gcW5hbWU7Ci0gICAgICAgICAgICAgICAgc2ltcGxlVHlwZS5zZXROYW1lKGZha2VRbmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgY2hhbmdlZFNpbXBsZVR5cGVTZXQuYWRkKHNpbXBsZVR5cGUpOwotICAgICAgICAgICAgICAgIHNpbXBsZVR5cGUuc2V0U291cmNlVVJJKGZha2VRbmFtZS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzaW1wbGVUeXBlc01hcC5wdXQoZmFrZVFuYW1lLCBmdWxseVF1YWxpZmllZENsYXNzTmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgLy9hZGQgdGhpcyBpbmZvcm1hdGlvbiB0byB0aGUgbWV0YWluZm8gaG9sZGVyCi0gICAgICAgIG1ldGFJbmZIb2xkZXIuc2V0T3duUW5hbWUoc2ltcGxlVHlwZS5nZXRRTmFtZSgpKTsKLSAgICAgICAgaWYgKGZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1ldGFJbmZIb2xkZXIuc2V0T3duQ2xhc3NOYW1lKGZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lKTsKLSAgICAgICAgfQotICAgICAgICAvL3dyaXRlIHRoZSBjbGFzcy4gVGhpcyB0eXBlIG1hcHBpbmcgd291bGQgaGF2ZSBiZWVuIHBvcHVsYXRlZCByaWdodCBub3cKLSAgICAgICAgLy9Ob3RlIC0gV2UgYWx3YXlzIHdyaXRlIGNsYXNzZXMgZm9yIG5hbWVkIGNvbXBsZXggdHlwZXMKLSAgICAgICAgd3JpdGVTaW1wbGVUeXBlKHNpbXBsZVR5cGUsIG1ldGFJbmZIb2xkZXIpOwotICAgIH0KLQotICAgIHByaXZhdGUgQmVhbldyaXRlck1ldGFJbmZvSG9sZGVyIHByb2Nlc3NTaW1wbGVUeXBlKFhtbFNjaGVtYVNpbXBsZVR5cGUgc2ltcGxlVHlwZSwgWG1sU2NoZW1hIHBhcmVudFNjaGVtYSkgdGhyb3dzIFNjaGVtYUNvbXBpbGF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgQmVhbldyaXRlck1ldGFJbmZvSG9sZGVyIG1ldGFJbmZIb2xkZXIgPSBuZXcgQmVhbldyaXRlck1ldGFJbmZvSG9sZGVyKCk7Ci0KLSAgICAgICAgLy8gaGFuZGxlIHRoZSByZXN0cmljdGlvbgotICAgICAgICBYbWxTY2hlbWFTaW1wbGVUeXBlQ29udGVudCBjb250ZW50ID0gc2ltcGxlVHlwZS5nZXRDb250ZW50KCk7Ci0gICAgICAgIFFOYW1lIHBhcmVudFNpbXBsZVR5cGVRbmFtZSA9IHNpbXBsZVR5cGUuZ2V0UU5hbWUoKTsKLSAgICAgICAgaWYgKHBhcmVudFNpbXBsZVR5cGVRbmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBwYXJlbnRTaW1wbGVUeXBlUW5hbWUgPSAoUU5hbWUpIHNpbXBsZVR5cGUuZ2V0TWV0YUluZm9NYXAoKS5nZXQoU2NoZW1hQ29uc3RhbnRzLlNjaGVtYUNvbXBpbGVySW5mb0hvbGRlci5GQUtFX1FOQU1FKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY29udGVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoY29udGVudCBpbnN0YW5jZW9mIFhtbFNjaGVtYVNpbXBsZVR5cGVSZXN0cmljdGlvbikgewotICAgICAgICAgICAgICAgIFhtbFNjaGVtYVNpbXBsZVR5cGVSZXN0cmljdGlvbiByZXN0cmljdGlvbiA9IChYbWxTY2hlbWFTaW1wbGVUeXBlUmVzdHJpY3Rpb24pIGNvbnRlbnQ7Ci0KLSAgICAgICAgICAgICAgICBRTmFtZSBiYXNlVHlwZU5hbWUgPSByZXN0cmljdGlvbi5nZXRCYXNlVHlwZU5hbWUoKTsKLSAgICAgICAgICAgICAgICAvL2NoZWNrIHdoZXRoZXIgdGhlIGJhc2UgdHlwZSBpcyBvbmUgb2YgdGhlIGJhc2Ugc2NoZW1hIHR5cGVzCi0KLSAgICAgICAgICAgICAgICBpZiAoYmFzZVNjaGVtYVR5cGVNYXAuY29udGFpbnNLZXkoYmFzZVR5cGVOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICAvL3Byb2Nlc3MgcmVzdHJpY3Rpb24gYmFzZSB0eXBlCi0KLSAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc1NpbXBsZVJlc3RyaWN0aW9uQmFzZVR5cGUocGFyZW50U2ltcGxlVHlwZVFuYW1lLCByZXN0cmljdGlvbi5nZXRCYXNlVHlwZU5hbWUoKSwgbWV0YUluZkhvbGRlciwgcGFyZW50U2NoZW1hKTsKLSAgICAgICAgICAgICAgICAgICAgLy9wcm9jZXNzIGZhY2V0cwotICAgICAgICAgICAgICAgICAgICBpZiAoIVNjaGVtYUNvbnN0YW50cy5YU0RfQk9PTEVBTi5lcXVhbHMoYmFzZVR5cGVOYW1lKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzRmFjZXRzKHJlc3RyaWN0aW9uLCBtZXRhSW5mSG9sZGVyLCBwYXJlbnRTY2hlbWEpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy9yZWN1cnNlCi0gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgbXVzdCBiZSBhIHhtbHNjaGVtYSBidWcKLSAgICAgICAgICAgICAgICAgICAgLy8gaXQgc2hvdWxkIHJldHVybiB0aGUgc2NoZW1hdHlwZSBmb3IgcmVzdHJpY3Rpb24uZ2V0QmFzZVR5cGUoKToKLSAgICAgICAgICAgICAgICAgICAgWG1sU2NoZW1hIHJlc29sdmVkU2NoZW1hID0gZ2V0UGFyZW50U2NoZW1hKHBhcmVudFNjaGVtYSwgYmFzZVR5cGVOYW1lLCBDT01QT05FTlRfVFlQRSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlZFNjaGVtYSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24oImNhbiBub3QgZmluZCB0aGUgdHlwZSAiICsgYmFzZVR5cGVOYW1lICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBmcm9tIHRoZSBwYXJlbnQgc2NoZW1hICIgKyBwYXJlbnRTY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgWG1sU2NoZW1hVHlwZSByZXN0cmljdGlvbkJhc2VUeXBlID0gcmVzb2x2ZWRTY2hlbWEuZ2V0VHlwZUJ5TmFtZShiYXNlVHlwZU5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3RyaWN0aW9uQmFzZVR5cGUgaW5zdGFuY2VvZiBYbWxTY2hlbWFTaW1wbGVUeXBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChyZXN0cmljdGlvbkJhc2VUeXBlICE9IG51bGwpICYmICghaXNBbHJlYWR5UHJvY2Vzc2VkKGJhc2VUeXBlTmFtZSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NTaW1wbGVTY2hlbWFUeXBlKChYbWxTY2hlbWFTaW1wbGVUeXBlKSByZXN0cmljdGlvbkJhc2VUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIHJlc29sdmVkU2NoZW1hLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJvY2VzcyByZXN0cmljdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NTaW1wbGVSZXN0cmljdGlvbkJhc2VUeXBlKHBhcmVudFNpbXBsZVR5cGVRbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0aW9uLmdldEJhc2VUeXBlTmFtZSgpLCBtZXRhSW5mSG9sZGVyLCByZXNvbHZlZFNjaGVtYSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoY29udGVudCBpbnN0YW5jZW9mIFhtbFNjaGVtYVNpbXBsZVR5cGVVbmlvbikgewotICAgICAgICAgICAgICAgIFhtbFNjaGVtYVNpbXBsZVR5cGVVbmlvbiBzaW1wbGVUeXBlVW5pb24gPSAoWG1sU2NoZW1hU2ltcGxlVHlwZVVuaW9uKSBjb250ZW50OwotICAgICAgICAgICAgICAgIFFOYW1lW10gcW5hbWVzID0gc2ltcGxlVHlwZVVuaW9uLmdldE1lbWJlclR5cGVzUU5hbWVzKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHFuYW1lcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIFFOYW1lIHFuYW1lOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHFuYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgcW5hbWUgPSBxbmFtZXNbaV07Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmFzZVNjaGVtYVR5cGVNYXAuY29udGFpbnNLZXkocW5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YUluZkhvbGRlci5hZGRNZW1iZXJUeXBlKHFuYW1lLCAoU3RyaW5nKSBiYXNlU2NoZW1hVHlwZU1hcC5nZXQocW5hbWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgWG1sU2NoZW1hIHJlc29sdmVkU2NoZW1hID0gZ2V0UGFyZW50U2NoZW1hKHBhcmVudFNjaGVtYSwgcW5hbWUsIENPTVBPTkVOVF9UWVBFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWRTY2hlbWEgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24oImNhbiBub3QgZmluZCB0aGUgdHlwZSAiICsgcW5hbWUgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZnJvbSB0aGUgcGFyZW50IHNjaGVtYSAiICsgcGFyZW50U2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYbWxTY2hlbWFUeXBlIHR5cGUgPSByZXNvbHZlZFNjaGVtYS5nZXRUeXBlQnlOYW1lKHFuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgaW5zdGFuY2VvZiBYbWxTY2hlbWFTaW1wbGVUeXBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYbWxTY2hlbWFTaW1wbGVUeXBlIG1lbWJlclNpbXBsZVR5cGUgPSAoWG1sU2NoZW1hU2ltcGxlVHlwZSkgdHlwZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNBbHJlYWR5UHJvY2Vzc2VkKHFuYW1lKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NTaW1wbGVTY2hlbWFUeXBlKG1lbWJlclNpbXBsZVR5cGUsIG51bGwsIHJlc29sdmVkU2NoZW1hLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFJbmZIb2xkZXIuYWRkTWVtYmVyVHlwZShxbmFtZSwgKFN0cmluZykgcHJvY2Vzc2VkVHlwZW1hcC5nZXQocW5hbWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbigiVW5pb25zIGNhbiBub3QgaGF2ZSBjb21wbGV4IHR5cGVzIGFzIGEgbWVtYmVyIHR5cGUiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIFhtbFNjaGVtYU9iamVjdENvbGxlY3Rpb24geG1sU2NoZW1hT2JqZWN0Q29sbGVjdGlvbiA9IHNpbXBsZVR5cGVVbmlvbi5nZXRCYXNlVHlwZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgWG1sU2NoZW1hT2JqZWN0IHhtbFNjaGVtYU9iamVjdDsKLSAgICAgICAgICAgICAgICAgICAgUU5hbWUgY2hpbGRRbmFtZTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGkgPSAxOwotICAgICAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB4bWxTY2hlbWFPYmplY3RDb2xsZWN0aW9uLmdldEl0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgICAgICAgICAgeG1sU2NoZW1hT2JqZWN0ID0gKFhtbFNjaGVtYU9iamVjdCkgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoeG1sU2NoZW1hT2JqZWN0IGluc3RhbmNlb2YgWG1sU2NoZW1hU2ltcGxlVHlwZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhtbFNjaGVtYVNpbXBsZVR5cGUgdW5pb25TaW1wbGVUeXBlID0gKFhtbFNjaGVtYVNpbXBsZVR5cGUpIHhtbFNjaGVtYU9iamVjdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZFFuYW1lID0gdW5pb25TaW1wbGVUeXBlLmdldFFOYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkUW5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBjcmVhdGUgYSBmYWtlIFFuYW1lIGZvciBhbGwgdGhlc2Ugc2ltcGxlIHR5cGVzIHNpbmNlIG1vc3QgcHJvcGFibHkgdGhleSBkb24ndCBoYXZlIG9uZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZFFuYW1lID0gbmV3IFFOYW1lKHBhcmVudFNpbXBsZVR5cGVRbmFtZS5nZXROYW1lc3BhY2VVUkkoKSwgcGFyZW50U2ltcGxlVHlwZVFuYW1lLmdldExvY2FsUGFydCgpICsgZ2V0TmV4dFR5cGVTdWZmaXgocGFyZW50U2ltcGxlVHlwZVFuYW1lLmdldExvY2FsUGFydCgpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgYW4gaW5uZXIgc2ltcGxlIHR5cGUgb2YgdGhlIHVuaW9uIHNvIGl0IHNob2xkIG5vdCBoYXZlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJvY2Vzc2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc1NpbXBsZVNjaGVtYVR5cGUodW5pb25TaW1wbGVUeXBlLCBudWxsLCBwYXJlbnRTY2hlbWEsIGNoaWxkUW5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFJbmZIb2xkZXIuYWRkTWVtYmVyVHlwZShjaGlsZFFuYW1lLCAoU3RyaW5nKSBwcm9jZXNzZWRUeXBlbWFwLmdldChjaGlsZFFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG1ldGFJbmZIb2xkZXIuc2V0VW5pb24odHJ1ZSk7Ci0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoY29udGVudCBpbnN0YW5jZW9mIFhtbFNjaGVtYVNpbXBsZVR5cGVMaXN0KSB7Ci0gICAgICAgICAgICAgICAgWG1sU2NoZW1hU2ltcGxlVHlwZUxpc3Qgc2ltcGxlVHlwZUxpc3QgPSAoWG1sU2NoZW1hU2ltcGxlVHlwZUxpc3QpIGNvbnRlbnQ7Ci0gICAgICAgICAgICAgICAgUU5hbWUgaXRlbVR5cGVRTmFtZSA9IHNpbXBsZVR5cGVMaXN0LmdldEl0ZW1UeXBlTmFtZSgpOwotCi0gICAgICAgICAgICAgICAgaWYgKGl0ZW1UeXBlUU5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoIWlzQWxyZWFkeVByb2Nlc3NlZChpdGVtVHlwZVFOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgWG1sU2NoZW1hIHJlc29sdmVkU2NoZW1hID0gZ2V0UGFyZW50U2NoZW1hKHBhcmVudFNjaGVtYSwgaXRlbVR5cGVRTmFtZSwgQ09NUE9ORU5UX1RZUEUpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc29sdmVkU2NoZW1hID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24oImNhbiBub3QgZmluZCB0aGUgdHlwZSAiICsgaXRlbVR5cGVRTmFtZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGZyb20gdGhlIHBhcmVudCB0eXBlICIgKyBwYXJlbnRTY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBYbWxTY2hlbWFUeXBlIHNpbXBsZVNjaGVtYVR5cGUgPSByZXNvbHZlZFNjaGVtYS5nZXRUeXBlQnlOYW1lKGl0ZW1UeXBlUU5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaW1wbGVTY2hlbWFUeXBlIGluc3RhbmNlb2YgWG1sU2NoZW1hU2ltcGxlVHlwZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzU2ltcGxlU2NoZW1hVHlwZSgoWG1sU2NoZW1hU2ltcGxlVHlwZSkgc2ltcGxlU2NoZW1hVHlwZSwgbnVsbCwgcmVzb2x2ZWRTY2hlbWEsIG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIFhtbFNjaGVtYVNpbXBsZVR5cGUgbGlzdFNpbXBsZVR5cGUgPSBzaW1wbGVUeXBlTGlzdC5nZXRJdGVtVHlwZSgpOwotICAgICAgICAgICAgICAgICAgICBpdGVtVHlwZVFOYW1lID0gbGlzdFNpbXBsZVR5cGUuZ2V0UU5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW1UeXBlUU5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgY3JlYXRlIGEgZmFrZSBRbmFtZSBmb3IgYWxsIHRoZXNlIHNpbXBsZSB0eXBlcyBzaW5jZSBtb3N0IHByb3BhYmx5IHRoZXkgZG9uJ3QgaGF2ZSBvbmUKLSAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1UeXBlUU5hbWUgPSBuZXcgUU5hbWUocGFyZW50U2ltcGxlVHlwZVFuYW1lLmdldE5hbWVzcGFjZVVSSSgpLCBwYXJlbnRTaW1wbGVUeXBlUW5hbWUuZ2V0TG9jYWxQYXJ0KCkgKyAiX3R5cGUwIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc1NpbXBsZVNjaGVtYVR5cGUobGlzdFNpbXBsZVR5cGUsIG51bGwsIHBhcmVudFNjaGVtYSwgaXRlbVR5cGVRTmFtZSk7Ci0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gZmluZENsYXNzTmFtZShpdGVtVHlwZVFOYW1lLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgbWV0YUluZkhvbGRlci5zZXRMaXN0KHRydWUpOwotICAgICAgICAgICAgICAgIG1ldGFJbmZIb2xkZXIuc2V0SXRlbVR5cGVRTmFtZShpdGVtVHlwZVFOYW1lKTsKLSAgICAgICAgICAgICAgICBtZXRhSW5mSG9sZGVyLnNldEl0ZW1UeXBlQ2xhc3NOYW1lKGNsYXNzTmFtZSk7Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbWV0YUluZkhvbGRlcjsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIEZpbmQgd2hldGhlciBhIGdpdmVuIHBhcnRpY2xlIGlzIGFuIGFycmF5LiBUaGUgbG9naWMgZm9yIGRlY2lkaW5nCi0gICAgICogd2hldGhlciBhIGdpdmVuIHBhcnRpY2xlIGlzIGFuIGFycmF5IGlzIGRlcGVuZGluZyBvbiB0aGVpciBtaW5PY2N1cnMKLSAgICAgKiBhbmQgbWF4T2NjdXJzIGNvdW50cy4gSWYgTWF4b2NjdXJzIGlzIGdyZWF0ZXIgdGhhbiBvbmUgKDEpIHRoZW4gdGhlCi0gICAgICogY29udGVudCBpcyBhbiBhcnJheS4KLSAgICAgKiBBbHNvIG5vIGhpZ2hlciBsZXZlbCBlbGVtZW50IHdpbGwgaGF2ZSB0aGUgbWF4T2NjdXJzIGdyZWF0ZXIgdGhhbiBvbmUKLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJ0aWNsZQotICAgICAqIEB0aHJvd3MgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNBcnJheShYbWxTY2hlbWFQYXJ0aWNsZSBwYXJ0aWNsZSkgdGhyb3dzIFNjaGVtYUNvbXBpbGF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgbG9uZyBtaW5PY2N1cnMgPSBwYXJ0aWNsZS5nZXRNaW5PY2N1cnMoKTsKLSAgICAgICAgbG9uZyBtYXhPY2N1cnMgPSBwYXJ0aWNsZS5nZXRNYXhPY2N1cnMoKTsKLQotICAgICAgICBpZiAobWF4T2NjdXJzIDwgbWluT2NjdXJzKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24oKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiAobWF4T2NjdXJzID4gMSk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIEhhc2hNYXAgbWFwVHlwZUNvdW50ID0gbmV3IEhhc2hNYXAoKTsKLSAgICBwcml2YXRlIFN0cmluZyBnZXROZXh0VHlwZVN1ZmZpeChTdHJpbmcgbG9jYWxOYW1lKSB7Ci0gICAgICAgIEludGVnZXIgdHlwZUNvdW50ZXIgPSAoSW50ZWdlcikgbWFwVHlwZUNvdW50LmdldChsb2NhbE5hbWUpOwotICAgICAgICBpbnQgY291bnQgPSAwOwotICAgICAgICBpZiAodHlwZUNvdW50ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYodHlwZUNvdW50ZXIuaW50VmFsdWUoKSA9PSBJbnRlZ2VyLk1BWF9WQUxVRSkgewotICAgICAgICAgICAgICAgIGNvdW50ID0gMDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgY291bnQgPSB0eXBlQ291bnRlci5pbnRWYWx1ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG1hcFR5cGVDb3VudC5wdXQobG9jYWxOYW1lLCBuZXcgSW50ZWdlcihjb3VudCsxKSk7Ci0gICAgICAgIHJldHVybiAoIl90eXBlIiArIGNvdW50KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiByZXR1cm5zIHRoZSBwYXJlbnQgc2NoZW1hIG9mIHRoZSBjb21wb25ldCBoYXZpbmcgUU5hbWUgY29tcG9lbnRUeXBlUU5hbWUuCi0gICAgICogd2l0aGUgdGhlIGNvbXBvbmV0IHR5cGUuCi0gICAgICogQHBhcmFtIHBhcmVudFNjaGVtYSAtIHBhcmVudCBzY2hlbWEgb2YgdGhlIGdpdmVuIGNvbXBvbmV0Ci0gICAgICogQHBhcmFtIGNvbXBvbmVudFFOYW1lIC0gcW5hbWUgb2YgdGhlIGNvbXBvbmV0LCBvZiB3aGljaCB3ZSB3YW50IHRvIGdldCB0aGUgcGFyZW50IHNjaGVtYQotICAgICAqIEBwYXJhbSBjb21wb25ldFR5cGUgLSB0eXBlIG9mIHRoZSBjb21wb25ldC4gdGhpcyBjYW4gZWl0aGVyIGJlIHR5cGUsZWxlbWVudCxhdHRyaWJ1dGUgb3IgYXR0cmlidXRlIGdyb3VwCi0gICAgICogQHJldHVybiBwYXJlbnQgc2NoZW1hLgotICAgICAqLwotCi0gICAgcHJpdmF0ZSBYbWxTY2hlbWEgZ2V0UGFyZW50U2NoZW1hKFhtbFNjaGVtYSBwYXJlbnRTY2hlbWEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFOYW1lIGNvbXBvbmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29tcG9uZXRUeXBlKSB0aHJvd3MgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24gewotICAgICAgICAvLyBpZiB0aGUgY29tcG9uZXQgZG8gbm90IGhhdmUgYSBwcm9wZXJuYW1lc2FwY2Ugb3IKLSAgICAgICAgLy8gaXQgaXMgZXF1YWxzIHRvIHRoZSB4c2Qgc2NoZW1hIG5hbWVzYXBjZQotICAgICAgICAvLyB3ZSBkbyBub3QgaGF2ZSB0byBkbyBhbnkgdGhpbmcuCi0gICAgICAgIGlmICgoY29tcG9uZW50UU5hbWUgPT0gbnVsbCkgfHwKLSAgICAgICAgICAgICAgKGNvbXBvbmVudFFOYW1lLmdldE5hbWVzcGFjZVVSSSgpID09IG51bGwpIHx8Ci0gICAgICAgICAgICAgICAgQ29uc3RhbnRzLlVSSV8yMDAxX1NDSEVNQV9YU0QuZXF1YWxzKGNvbXBvbmVudFFOYW1lLmdldE5hbWVzcGFjZVVSSSgpKSl7Ci0gICAgICAgICAgICByZXR1cm4gcGFyZW50U2NoZW1hOwotICAgICAgICB9Ci0KLSAgICAgICAgTGlzdCB2aXNpdGVkU2NoZW1hcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgdmlzaXRlZFNjaGVtYXMuYWRkKHBhcmVudFNjaGVtYSk7Ci0gICAgICAgIFhtbFNjaGVtYSBuZXdQYXJlbnRTY2hlbWEgPSBnZXRQYXJlbnRTY2hlbWFGcm9tSW5jbHVkZXMocGFyZW50U2NoZW1hLAotICAgICAgICAgICAgICAgIGNvbXBvbmVudFFOYW1lLGNvbXBvbmV0VHlwZSx2aXNpdGVkU2NoZW1hcyk7Ci0gICAgICAgIGlmIChuZXdQYXJlbnRTY2hlbWEgPT0gbnVsbCl7Ci0gICAgICAgICAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0gY29tcG9uZW50UU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICBpZiAobG9hZGVkU2NoZW1hTWFwLmNvbnRhaW5zS2V5KHRhcmdldE5hbWVzcGFjZSkpewotICAgICAgICAgICAgICAgIFhtbFNjaGVtYSB0ZW1wU2NoZW1hID0gKFhtbFNjaGVtYSkgbG9hZGVkU2NoZW1hTWFwLmdldCh0YXJnZXROYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIGlmIChpc0NvbXBvbmV0RXhpc3RzKHRlbXBTY2hlbWEsY29tcG9uZW50UU5hbWUsY29tcG9uZXRUeXBlKSl7Ci0gICAgICAgICAgICAgICAgICAgIG5ld1BhcmVudFNjaGVtYSA9IHRlbXBTY2hlbWE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChhdmFpbGFibGVTY2hlbWFNYXAuY29udGFpbnNLZXkodGFyZ2V0TmFtZXNwYWNlKSl7Ci0gICAgICAgICAgICAgICAgWG1sU2NoZW1hIHRlbXBTY2hlbWEgPSAoWG1sU2NoZW1hKSBhdmFpbGFibGVTY2hlbWFNYXAuZ2V0KHRhcmdldE5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGlzQ29tcG9uZXRFeGlzdHModGVtcFNjaGVtYSxjb21wb25lbnRRTmFtZSxjb21wb25ldFR5cGUpKXsKLSAgICAgICAgICAgICAgICAgICAgY29tcGlsZSh0ZW1wU2NoZW1hKTsKLSAgICAgICAgICAgICAgICAgICAgbmV3UGFyZW50U2NoZW1hID0gdGVtcFNjaGVtYTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ld1BhcmVudFNjaGVtYTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFhtbFNjaGVtYSBnZXRQYXJlbnRTY2hlbWFGcm9tSW5jbHVkZXMoWG1sU2NoZW1hIHBhcmVudFNjaGVtYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUU5hbWUgY29tcG9uZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb21wb25ldFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3QgdmlzaXRlZFNjaGVtYXMpIHRocm93cyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgWG1sU2NoZW1hIG5ld1BhcmVudFNjaGVtYSA9IG51bGw7Ci0gICAgICAgIGlmIChpc0NvbXBvbmV0RXhpc3RzKHBhcmVudFNjaGVtYSwgY29tcG9uZW50UU5hbWUsIGNvbXBvbmV0VHlwZSkpIHsKLSAgICAgICAgICAgIG5ld1BhcmVudFNjaGVtYSA9IHBhcmVudFNjaGVtYTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIHRoaXMgY29tcG9uZXQgbXVzdCBlaXRoZXIgYmUgaW4gYSBpbXBvcnQgb3IgYW5kIGluY2x1ZGUKLSAgICAgICAgICAgIFhtbFNjaGVtYU9iamVjdENvbGxlY3Rpb24gaW5jbHVkZXMgPSBwYXJlbnRTY2hlbWEuZ2V0SW5jbHVkZXMoKTsKLSAgICAgICAgICAgIGlmIChpbmNsdWRlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IGV4dGVybmFsQ29tcG9uZXQgPSBudWxsOwotICAgICAgICAgICAgICAgIFhtbFNjaGVtYSBleHRlcm5hbFNjaGVtYSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gaW5jbHVkZXMuZ2V0SXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgICAgIGV4dGVybmFsQ29tcG9uZXQgPSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGV4dGVybmFsQ29tcG9uZXQgaW5zdGFuY2VvZiBYbWxTY2hlbWFFeHRlcm5hbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZXJuYWxTY2hlbWEgPSAoKFhtbFNjaGVtYUV4dGVybmFsKSBleHRlcm5hbENvbXBvbmV0KS5nZXRTY2hlbWEoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhpcyBpcyBhbiBpbmxpbmUgaW1wb3J0IHdpdGhvdXQgYSBzY2hlbWEgbG9jYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHhtbHNjaGVtYSBkb2VzIG5vdCBsb2FkIHRoZSBzY2hlbWEuCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBzbyB3ZSB0cnkgdG8gZmlndXJlIG91dCBpdCBlaXRoZXIgZnJvbSB0aGUgYXZhaWxhYmxlIHNjaGVtYXMKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9yIGZyb20gdGhlIGxhZGVkIHNjaGVtYXMuCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGV4dGVybmFsU2NoZW1hID09IG51bGwpICYmIGV4dGVybmFsQ29tcG9uZXQgaW5zdGFuY2VvZiBYbWxTY2hlbWFJbXBvcnQpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhtbFNjaGVtYUltcG9ydCB4bWxTY2hlbWFJbXBvcnQgPSAoWG1sU2NoZW1hSW1wb3J0KSBleHRlcm5hbENvbXBvbmV0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBpbXBvcnROYW1lc3BjZSA9IHhtbFNjaGVtYUltcG9ydC5nZXROYW1lc3BhY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGltcG9ydE5hbWVzcGNlICE9IG51bGwpICYmICFpbXBvcnROYW1lc3BjZS5lcXVhbHMoQ29uc3RhbnRzLlVSSV8yMDAxX1NDSEVNQV9YU0QpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2FkZWRTY2hlbWFNYXAuY29udGFpbnNLZXkoaW1wb3J0TmFtZXNwY2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlcm5hbFNjaGVtYSA9IChYbWxTY2hlbWEpIGxvYWRlZFNjaGVtYU1hcC5nZXQoaW1wb3J0TmFtZXNwY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGF2YWlsYWJsZVNjaGVtYU1hcC5jb250YWluc0tleShpbXBvcnROYW1lc3BjZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhtbFNjaGVtYSB0ZW1wU2NoZW1hID0gKFhtbFNjaGVtYSkgYXZhaWxhYmxlU2NoZW1hTWFwLmdldChpbXBvcnROYW1lc3BjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21waWxlKHRlbXBTY2hlbWEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZXJuYWxTY2hlbWEgPSB0ZW1wU2NoZW1hOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4dGVybmFsU2NoZW1hICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaW5kIHRoZSBjb21wb25ldCBpbiB0aGUgbmV3IGV4dGVybmFsIHNjaGVtYS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXZpc2l0ZWRTY2hlbWFzLmNvbnRhaW5zKGV4dGVybmFsU2NoZW1hKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpc2l0ZWRTY2hlbWFzLmFkZChleHRlcm5hbFNjaGVtYSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1BhcmVudFNjaGVtYSA9IGdldFBhcmVudFNjaGVtYUZyb21JbmNsdWRlcyhleHRlcm5hbFNjaGVtYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRRTmFtZSwgY29tcG9uZXRUeXBlLCB2aXNpdGVkU2NoZW1hcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1BhcmVudFNjaGVtYSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaS5lIHdlIGhhdmUgZm91bmQgdGhlIHNjaGVtYQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXdQYXJlbnRTY2hlbWE7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzQ29tcG9uZXRFeGlzdHMoWG1sU2NoZW1hIHNjaGVtYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRTmFtZSBjb21wb25lbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29tcG9uZXRUeXBlKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNFeGlzdHMgPSBmYWxzZTsKLSAgICAgICAgaWYgKCFzY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkuZXF1YWxzKGNvbXBvbmVudFFOYW1lLmdldE5hbWVzcGFjZVVSSSgpKSl7Ci0gICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHN3aXRjaCAoY29tcG9uZXRUeXBlKSB7Ci0gICAgICAgICAgICBjYXNlIENPTVBPTkVOVF9UWVBFIDogewotICAgICAgICAgICAgICAgIGlzRXhpc3RzID0gKHNjaGVtYS5nZXRUeXBlQnlOYW1lKGNvbXBvbmVudFFOYW1lLmdldExvY2FsUGFydCgpKSAhPSBudWxsKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgQ09NUE9ORU5UX0VMRU1FTlQgOiB7Ci0gICAgICAgICAgICAgICAgaXNFeGlzdHMgPSAoc2NoZW1hLmdldEVsZW1lbnRCeU5hbWUoY29tcG9uZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpICE9IG51bGwpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBDT01QT05FTlRfQVRUUklCVVRFIDogewotICAgICAgICAgICAgICAgIGlzRXhpc3RzID0gKHNjaGVtYS5nZXRBdHRyaWJ1dGVzKCkuZ2V0SXRlbShjb21wb25lbnRRTmFtZSkgIT0gbnVsbCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIENPTVBPTkVOVF9BVFRSSUJVVEVfR1JPVVAgOiB7Ci0gICAgICAgICAgICAgICAgaXNFeGlzdHMgPSAoc2NoZW1hLmdldEF0dHJpYnV0ZUdyb3VwcygpLmdldEl0ZW0oY29tcG9uZW50UU5hbWUpICE9IG51bGwpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBDT01QT05FTlRfR1JPVVAgOiB7Ci0gICAgICAgICAgICAgICAgaXNFeGlzdHMgPSAoc2NoZW1hLmdldEdyb3VwcygpLmdldEl0ZW0oY29tcG9uZW50UU5hbWUpICE9IG51bGwpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgcmV0dXJuIGlzRXhpc3RzOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9TY2hlbWFDb25zdGFudHMuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9TY2hlbWFDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk3ZTViYi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvU2NoZW1hQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIubmFtZXNwYWNlLkNvbnN0YW50czsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLS8qKgotICogQ29uc3RhbnRzIGZvciB0aGUgUU5hbWVzIG9mIHN0YW5kYXJkIHNjaGVtYSB0eXBlcwotICovCi1wdWJsaWMgY2xhc3MgU2NoZW1hQ29uc3RhbnRzIHsKLQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJJX0RFRkFVTFRfU0NIRU1BX1hTRCA9IENvbnN0YW50cy5VUklfMjAwMV9TQ0hFTUFfWFNEOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgWFNEX1NUUklORyA9IG5ldyBRTmFtZShVUklfREVGQVVMVF9TQ0hFTUFfWFNELCAic3RyaW5nIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBYU0RfQk9PTEVBTiA9IG5ldyBRTmFtZShVUklfREVGQVVMVF9TQ0hFTUFfWFNELCAiYm9vbGVhbiIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgWFNEX0RPVUJMRSA9IG5ldyBRTmFtZShVUklfREVGQVVMVF9TQ0hFTUFfWFNELCAiZG91YmxlIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBYU0RfRkxPQVQgPSBuZXcgUU5hbWUoVVJJX0RFRkFVTFRfU0NIRU1BX1hTRCwgImZsb2F0Iik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBYU0RfSU5UID0gbmV3IFFOYW1lKFVSSV9ERUZBVUxUX1NDSEVNQV9YU0QsICJpbnQiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9JTlRFR0VSID0gbmV3IFFOYW1lKFVSSV9ERUZBVUxUX1NDSEVNQV9YU0QsICJpbnRlZ2VyIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBYU0RfTE9ORyA9IG5ldyBRTmFtZShVUklfREVGQVVMVF9TQ0hFTUFfWFNELCAibG9uZyIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgWFNEX1NIT1JUID0gbmV3IFFOYW1lKFVSSV9ERUZBVUxUX1NDSEVNQV9YU0QsICJzaG9ydCIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgWFNEX0JZVEUgPSBuZXcgUU5hbWUoVVJJX0RFRkFVTFRfU0NIRU1BX1hTRCwgImJ5dGUiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9ERUNJTUFMID0gbmV3IFFOYW1lKFVSSV9ERUZBVUxUX1NDSEVNQV9YU0QsICJkZWNpbWFsIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBYU0RfQkFTRTY0ID0gbmV3IFFOYW1lKFVSSV9ERUZBVUxUX1NDSEVNQV9YU0QsICJiYXNlNjRCaW5hcnkiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9IRVhCSU4gPSBuZXcgUU5hbWUoVVJJX0RFRkFVTFRfU0NIRU1BX1hTRCwgImhleEJpbmFyeSIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgWFNEX0FOWVNJTVBMRVRZUEUgPSBuZXcgUU5hbWUoVVJJX0RFRkFVTFRfU0NIRU1BX1hTRCwgImFueVNpbXBsZVR5cGUiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9BTllUWVBFID0gbmV3IFFOYW1lKFVSSV9ERUZBVUxUX1NDSEVNQV9YU0QsICJhbnlUeXBlIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBYU0RfQU5ZID0gbmV3IFFOYW1lKFVSSV9ERUZBVUxUX1NDSEVNQV9YU0QsICJhbnkiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9RTkFNRSA9IG5ldyBRTmFtZShVUklfREVGQVVMVF9TQ0hFTUFfWFNELCAiUU5hbWUiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9EQVRFVElNRSA9IG5ldyBRTmFtZShVUklfREVGQVVMVF9TQ0hFTUFfWFNELCAiZGF0ZVRpbWUiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9EQVRFID0gbmV3IFFOYW1lKFVSSV9ERUZBVUxUX1NDSEVNQV9YU0QsICJkYXRlIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBYU0RfVElNRSA9IG5ldyBRTmFtZShVUklfREVGQVVMVF9TQ0hFTUFfWFNELCAidGltZSIpOwotCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9VTlNJR05FRExPTkcgPSBuZXcgUU5hbWUoVVJJX0RFRkFVTFRfU0NIRU1BX1hTRCwgInVuc2lnbmVkTG9uZyIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgWFNEX1VOU0lHTkVESU5UID0gbmV3IFFOYW1lKFVSSV9ERUZBVUxUX1NDSEVNQV9YU0QsICJ1bnNpZ25lZEludCIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgWFNEX1VOU0lHTkVEU0hPUlQgPSBuZXcgUU5hbWUoVVJJX0RFRkFVTFRfU0NIRU1BX1hTRCwgInVuc2lnbmVkU2hvcnQiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9VTlNJR05FREJZVEUgPSBuZXcgUU5hbWUoVVJJX0RFRkFVTFRfU0NIRU1BX1hTRCwgInVuc2lnbmVkQnl0ZSIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgWFNEX1BPU0lUSVZFSU5URUdFUiA9IG5ldyBRTmFtZShVUklfREVGQVVMVF9TQ0hFTUFfWFNELCAicG9zaXRpdmVJbnRlZ2VyIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBYU0RfTkVHQVRJVkVJTlRFR0VSID0gbmV3IFFOYW1lKFVSSV9ERUZBVUxUX1NDSEVNQV9YU0QsICJuZWdhdGl2ZUludGVnZXIiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9OT05ORUdBVElWRUlOVEVHRVIgPSBuZXcgUU5hbWUoVVJJX0RFRkFVTFRfU0NIRU1BX1hTRCwgIm5vbk5lZ2F0aXZlSW50ZWdlciIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgWFNEX05PTlBPU0lUSVZFSU5URUdFUiA9IG5ldyBRTmFtZShVUklfREVGQVVMVF9TQ0hFTUFfWFNELCAibm9uUG9zaXRpdmVJbnRlZ2VyIik7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9ZRUFSTU9OVEggPSBuZXcgUU5hbWUoVVJJX0RFRkFVTFRfU0NIRU1BX1hTRCwgImdZZWFyTW9udGgiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9NT05USERBWSA9IG5ldyBRTmFtZShVUklfREVGQVVMVF9TQ0hFTUFfWFNELCAiZ01vbnRoRGF5Iik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBYU0RfWUVBUiA9IG5ldyBRTmFtZShVUklfREVGQVVMVF9TQ0hFTUFfWFNELCAiZ1llYXIiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9NT05USCA9IG5ldyBRTmFtZShVUklfREVGQVVMVF9TQ0hFTUFfWFNELCAiZ01vbnRoIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBYU0RfREFZID0gbmV3IFFOYW1lKFVSSV9ERUZBVUxUX1NDSEVNQV9YU0QsICJnRGF5Iik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBYU0RfRFVSQVRJT04gPSBuZXcgUU5hbWUoVVJJX0RFRkFVTFRfU0NIRU1BX1hTRCwgImR1cmF0aW9uIik7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9OQU1FID0gbmV3IFFOYW1lKFVSSV9ERUZBVUxUX1NDSEVNQV9YU0QsICJOYW1lIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBYU0RfTkNOQU1FID0gbmV3IFFOYW1lKFVSSV9ERUZBVUxUX1NDSEVNQV9YU0QsICJOQ05hbWUiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9OTVRPS0VOID0gbmV3IFFOYW1lKFVSSV9ERUZBVUxUX1NDSEVNQV9YU0QsICJOTVRPS0VOIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBYU0RfTk1UT0tFTlMgPSBuZXcgUU5hbWUoVVJJX0RFRkFVTFRfU0NIRU1BX1hTRCwgIk5NVE9LRU5TIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBYU0RfTk9UQVRJT04gPSBuZXcgUU5hbWUoVVJJX0RFRkFVTFRfU0NIRU1BX1hTRCwgIk5PVEFUSU9OIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBYU0RfRU5USVRZID0gbmV3IFFOYW1lKFVSSV9ERUZBVUxUX1NDSEVNQV9YU0QsICJFTlRJVFkiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9FTlRJVElFUyA9IG5ldyBRTmFtZShVUklfREVGQVVMVF9TQ0hFTUFfWFNELCAiRU5USVRJRVMiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9JRFJFRiA9IG5ldyBRTmFtZShVUklfREVGQVVMVF9TQ0hFTUFfWFNELCAiSURSRUYiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9JRFJFRlMgPSBuZXcgUU5hbWUoVVJJX0RFRkFVTFRfU0NIRU1BX1hTRCwgIklEUkVGUyIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgWFNEX0FOWVVSSSA9IG5ldyBRTmFtZShVUklfREVGQVVMVF9TQ0hFTUFfWFNELCAiYW55VVJJIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBYU0RfTEFOR1VBR0UgPSBuZXcgUU5hbWUoVVJJX0RFRkFVTFRfU0NIRU1BX1hTRCwgImxhbmd1YWdlIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBYU0RfSUQgPSBuZXcgUU5hbWUoVVJJX0RFRkFVTFRfU0NIRU1BX1hTRCwgIklEIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBYU0RfU0NIRU1BID0gbmV3IFFOYW1lKFVSSV9ERUZBVUxUX1NDSEVNQV9YU0QsICJzY2hlbWEiKTsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgWFNEX05PUk1BTElaRURTVFJJTkcgPSBuZXcgUU5hbWUoVVJJX0RFRkFVTFRfU0NIRU1BX1hTRCwgIm5vcm1hbGl6ZWRTdHJpbmciKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9UT0tFTiA9IG5ldyBRTmFtZShVUklfREVGQVVMVF9TQ0hFTUFfWFNELCAidG9rZW4iKTsKLQotICAgIC8vc29hcCBlbmNvZGluZyBjb25zdGFudHMKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUklfREVGQVVMVF9TQ0hFTUFfU09BUF9FTkNPRElORyA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBTT0FQX0VOQ09ESU5HX0FSUkFZID0gbmV3IFFOYW1lKFVSSV9ERUZBVUxUX1NDSEVNQV9TT0FQX0VOQ09ESU5HLCAiQXJyYXkiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFNPQVBfRU5DT0RJTkdfU1RSVUNUID0gbmV3IFFOYW1lKFVSSV9ERUZBVUxUX1NDSEVNQV9TT0FQX0VOQ09ESU5HLCAiU3RydWN0Iik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBTT0FQX0VOQ09ESU5HX0JBU0U2NCA9IG5ldyBRTmFtZShVUklfREVGQVVMVF9TQ0hFTUFfU09BUF9FTkNPRElORywgImJhc2U2NCIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgU09BUF9FTkNPRElOR19EVVJBVElPTiA9IG5ldyBRTmFtZShVUklfREVGQVVMVF9TQ0hFTUFfU09BUF9FTkNPRElORywgImR1cmF0aW9uIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBTT0FQX0VOQ09ESU5HX0RBVEVUSU1FID0gbmV3IFFOYW1lKFVSSV9ERUZBVUxUX1NDSEVNQV9TT0FQX0VOQ09ESU5HLCAiZGF0ZVRpbWUiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFNPQVBfRU5DT0RJTkdfTk9UQVRJT04gPSBuZXcgUU5hbWUoVVJJX0RFRkFVTFRfU0NIRU1BX1NPQVBfRU5DT0RJTkcsICJOT1RBVElPTiIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgU09BUF9FTkNPRElOR19USU1FID0gbmV3IFFOYW1lKFVSSV9ERUZBVUxUX1NDSEVNQV9TT0FQX0VOQ09ESU5HLCAidGltZSIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgU09BUF9FTkNPRElOR19EQVRFID0gbmV3IFFOYW1lKFVSSV9ERUZBVUxUX1NDSEVNQV9TT0FQX0VOQ09ESU5HLCAiZGF0ZSIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgU09BUF9FTkNPRElOR19HWUVBUk1PTlRIID0gbmV3IFFOYW1lKFVSSV9ERUZBVUxUX1NDSEVNQV9TT0FQX0VOQ09ESU5HLCAiZ1llYXJNb250aCIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgU09BUF9FTkNPRElOR19HWUVBUiA9IG5ldyBRTmFtZShVUklfREVGQVVMVF9TQ0hFTUFfU09BUF9FTkNPRElORywgImdZZWFyIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBTT0FQX0VOQ09ESU5HX0dNT05USERBWSA9IG5ldyBRTmFtZShVUklfREVGQVVMVF9TQ0hFTUFfU09BUF9FTkNPRElORywgImdNb250aERheSIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgU09BUF9FTkNPRElOR19HREFZID0gbmV3IFFOYW1lKFVSSV9ERUZBVUxUX1NDSEVNQV9TT0FQX0VOQ09ESU5HLCAiZ0RheSIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgU09BUF9FTkNPRElOR19HTU9OVEggPSBuZXcgUU5hbWUoVVJJX0RFRkFVTFRfU0NIRU1BX1NPQVBfRU5DT0RJTkcsICJnTW9udGgiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFNPQVBfRU5DT0RJTkdfQk9PTEVBTiA9IG5ldyBRTmFtZShVUklfREVGQVVMVF9TQ0hFTUFfU09BUF9FTkNPRElORywgImJvb2xlYW4iKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFNPQVBfRU5DT0RJTkdfQkFTRTY0QklOQVJZID0gbmV3IFFOYW1lKFVSSV9ERUZBVUxUX1NDSEVNQV9TT0FQX0VOQ09ESU5HLCAiYmFzZTY0QmluYXJ5Iik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBTT0FQX0VOQ09ESU5HX0hFWEJJTkFSWSA9IG5ldyBRTmFtZShVUklfREVGQVVMVF9TQ0hFTUFfU09BUF9FTkNPRElORywgImhleEJpbmFyeSIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgU09BUF9FTkNPRElOR19GTE9BVCA9IG5ldyBRTmFtZShVUklfREVGQVVMVF9TQ0hFTUFfU09BUF9FTkNPRElORywgImZsb2F0Iik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBTT0FQX0VOQ09ESU5HX0RPVUJMRSA9IG5ldyBRTmFtZShVUklfREVGQVVMVF9TQ0hFTUFfU09BUF9FTkNPRElORywgImRvdWJsZSIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgU09BUF9FTkNPRElOR19BTllVUkkgPSBuZXcgUU5hbWUoVVJJX0RFRkFVTFRfU0NIRU1BX1NPQVBfRU5DT0RJTkcsICJhbnlVUkkiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFNPQVBfRU5DT0RJTkdfUU5BTUUgPSBuZXcgUU5hbWUoVVJJX0RFRkFVTFRfU0NIRU1BX1NPQVBfRU5DT0RJTkcsICJRTmFtZSIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgU09BUF9FTkNPRElOR19TVFJJTkcgPSBuZXcgUU5hbWUoVVJJX0RFRkFVTFRfU0NIRU1BX1NPQVBfRU5DT0RJTkcsICJzdHJpbmciKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFNPQVBfRU5DT0RJTkdfTk9STUFMSVpFRFNUUklORyA9IG5ldyBRTmFtZShVUklfREVGQVVMVF9TQ0hFTUFfU09BUF9FTkNPRElORywgIm5vcm1hbGl6ZWRTdHJpbmciKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFNPQVBfRU5DT0RJTkdfVE9LRU4gPSBuZXcgUU5hbWUoVVJJX0RFRkFVTFRfU0NIRU1BX1NPQVBfRU5DT0RJTkcsICJ0b2tlbiIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgU09BUF9FTkNPRElOR19MQU5HVUFHRSA9IG5ldyBRTmFtZShVUklfREVGQVVMVF9TQ0hFTUFfU09BUF9FTkNPRElORywgImxhbmd1YWdlIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBTT0FQX0VOQ09ESU5HX05BTUUgPSBuZXcgUU5hbWUoVVJJX0RFRkFVTFRfU0NIRU1BX1NPQVBfRU5DT0RJTkcsICJOYW1lIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBTT0FQX0VOQ09ESU5HX05NVE9LRU4gPSBuZXcgUU5hbWUoVVJJX0RFRkFVTFRfU0NIRU1BX1NPQVBfRU5DT0RJTkcsICJOTVRPS0VOIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBTT0FQX0VOQ09ESU5HX05DTkFNRSA9IG5ldyBRTmFtZShVUklfREVGQVVMVF9TQ0hFTUFfU09BUF9FTkNPRElORywgIk5DTmFtZSIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgU09BUF9FTkNPRElOR19OTVRPS0VOUyA9IG5ldyBRTmFtZShVUklfREVGQVVMVF9TQ0hFTUFfU09BUF9FTkNPRElORywgIk5NVE9LRU5TIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBTT0FQX0VOQ09ESU5HX0lEID0gbmV3IFFOYW1lKFVSSV9ERUZBVUxUX1NDSEVNQV9TT0FQX0VOQ09ESU5HLCAiSUQiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFNPQVBfRU5DT0RJTkdfSURSRUYgPSBuZXcgUU5hbWUoVVJJX0RFRkFVTFRfU0NIRU1BX1NPQVBfRU5DT0RJTkcsICJJRFJFRiIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgU09BUF9FTkNPRElOR19FTlRJVFkgPSBuZXcgUU5hbWUoVVJJX0RFRkFVTFRfU0NIRU1BX1NPQVBfRU5DT0RJTkcsICJFTlRJVFkiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFNPQVBfRU5DT0RJTkdfSURSRUZTID0gbmV3IFFOYW1lKFVSSV9ERUZBVUxUX1NDSEVNQV9TT0FQX0VOQ09ESU5HLCAiSURSRUZTIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBTT0FQX0VOQ09ESU5HX0VOVElUSUVTID0gbmV3IFFOYW1lKFVSSV9ERUZBVUxUX1NDSEVNQV9TT0FQX0VOQ09ESU5HLCAiRU5USVRJRVMiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFNPQVBfRU5DT0RJTkdfREVDSU1BTCA9IG5ldyBRTmFtZShVUklfREVGQVVMVF9TQ0hFTUFfU09BUF9FTkNPRElORywgImRlY2ltYWwiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFNPQVBfRU5DT0RJTkdfSU5URUdFUiA9IG5ldyBRTmFtZShVUklfREVGQVVMVF9TQ0hFTUFfU09BUF9FTkNPRElORywgImludGVnZXIiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFNPQVBfRU5DT0RJTkdfTk9OUE9TSVRJVkVJTlRFR0VSID0gbmV3IFFOYW1lKFVSSV9ERUZBVUxUX1NDSEVNQV9TT0FQX0VOQ09ESU5HLCAibm9uUG9zaXRpdmVJbnRlZ2VyIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBTT0FQX0VOQ09ESU5HX05FR0FUSVZFSU5URUdFUiA9IG5ldyBRTmFtZShVUklfREVGQVVMVF9TQ0hFTUFfU09BUF9FTkNPRElORywgIm5lZ2F0aXZlSW50ZWdlciIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgU09BUF9FTkNPRElOR19MT05HID0gbmV3IFFOYW1lKFVSSV9ERUZBVUxUX1NDSEVNQV9TT0FQX0VOQ09ESU5HLCAibG9uZyIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgU09BUF9FTkNPRElOR19JTlQgPSBuZXcgUU5hbWUoVVJJX0RFRkFVTFRfU0NIRU1BX1NPQVBfRU5DT0RJTkcsICJpbnQiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFNPQVBfRU5DT0RJTkdfU0hPUlQgPSBuZXcgUU5hbWUoVVJJX0RFRkFVTFRfU0NIRU1BX1NPQVBfRU5DT0RJTkcsICJzaG9ydCIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgU09BUF9FTkNPRElOR19CWVRFID0gbmV3IFFOYW1lKFVSSV9ERUZBVUxUX1NDSEVNQV9TT0FQX0VOQ09ESU5HLCAiYnl0ZSIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgU09BUF9FTkNPRElOR19OT05ORUdBVElWRUlOVEVHRVIgPSBuZXcgUU5hbWUoVVJJX0RFRkFVTFRfU0NIRU1BX1NPQVBfRU5DT0RJTkcsICJub25OZWdhdGl2ZUludGVnZXIiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFNPQVBfRU5DT0RJTkdfVU5TSUdORURMT05HID0gbmV3IFFOYW1lKFVSSV9ERUZBVUxUX1NDSEVNQV9TT0FQX0VOQ09ESU5HLCAidW5zaWduZWRMb25nIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBTT0FQX0VOQ09ESU5HX1VOU0lHTkVESU5UID0gbmV3IFFOYW1lKFVSSV9ERUZBVUxUX1NDSEVNQV9TT0FQX0VOQ09ESU5HLCAidW5zaWduZWRJbnQiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFNPQVBfRU5DT0RJTkdfVU5TSUdORURTSE9SVCA9IG5ldyBRTmFtZShVUklfREVGQVVMVF9TQ0hFTUFfU09BUF9FTkNPRElORywgInVuc2lnbmVkU2hvcnQiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFNPQVBfRU5DT0RJTkdfVU5TSUdORURCWVRFID0gbmV3IFFOYW1lKFVSSV9ERUZBVUxUX1NDSEVNQV9TT0FQX0VOQ09ESU5HLCAidW5zaWduZWRCeXRlIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBTT0FQX0VOQ09ESU5HX1BPU0lUSVZFSU5URUdFUiA9IG5ldyBRTmFtZShVUklfREVGQVVMVF9TQ0hFTUFfU09BUF9FTkNPRElORywgInBvc2l0aXZlSW50ZWdlciIpOwotCi0KLSAgICAvL2JpdCBwYXR0ZXJucyBmb3IgdGhlIHR5cGVzCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVRUUklCVVRFX1RZUEUgPSAweDAwMDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRUxFTUVOVF9UWVBFID0gMHgwMDAyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFSUkFZX1RZUEUgPSAweDAwMDQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQU5ZX1RZUEUgPSAweDAwMDg7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQklOQVJZX1RZUEUgPSAweDAwMTA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BUSU9OQUxfVFlQRSA9IDB4MDAyMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSU1QTEVfVFlQRV9PUl9DT05URU5UID0gMHgwMDQwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOTkVSX0NIT0lDRV9FTEVNRU5UID0gMHgwMDgwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBUlRJQ0xFX1RZUEVfRUxFTUVOVCA9IDB4MDEwMDsKLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU2NoZW1hUHJvcGVydHlOYW1lc3sKLQotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQ0hFTUFfQ09NUElMRVJfUFJPUEVSVElFUyA9ICIvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvc2NoZW1hLWNvbXBpbGUucHJvcGVydGllcyI7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJFQU5fV1JJVEVSX0tFWSA9ICJzY2hlbWEuYmVhbi53cml0ZXIuY2xhc3MiOwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCRUFOX1dSSVRFUl9URU1QTEFURV9LRVkgPSAic2NoZW1hLmJlYW4ud3JpdGVyLnRlbXBsYXRlIjsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkVBTl9XUklURVJfVFlQRU1BUF9LRVkgPSAic2NoZW1hLmJlYW4udHlwZW1hcCI7Ci0gICAgfQotCi0gICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU2NoZW1hQ29tcGlsZXJBcmd1bWVudHN7Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1JBUF9TQ0hFTUFfQ0xBU1NFUyA9ICJ3IjsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1JJVEVfU0NIRU1BX0NMQVNTRVMgPSAiciI7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUWUxFID0gInMiOwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUNLQUdFID0gInAiOwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQRVJfUEFDS0FHRSA9ICJtcCI7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFTFBFUl9NT0RFID0gImgiOwotICAgICAgICAvLyB0aGlzIG9wdGlvbiBpcyB1c2VkIHRvIHNldCBtaW5PY2N1cnMgPTAgZm9yIGFsbCB0aGUgZWxlbWVudHMKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT0ZGX1NUUklDVF9WQUxJREFUSU9OID0gIm9zdiI7Ci0gICAgICAgIC8vIHRoaXMgb3B0aW9uIGlzIHVzZWQgdG8gdXNlIFdyYXBwZXIgY2xhc3NlcyBmb3IgcHJpbWl0aXZlcwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VfV1JBUFBFUl9DTEFTU0VTID0gInV3YyI7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFNjaGVtYUNvbXBpbGVySW5mb0hvbGRlcnsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NOQU1FX0tFWSA9ICJDTEFTU19OQU1FIjsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NOQU1FX1BSSU1JVFZFX0tFWSA9ICJDTEFTU19OQU1FX1BSSU1JVElWRSI7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBS0VfUU5BTUUgPSAiUV9OQU1FIjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvWFNEMkphdmEuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9YU0QySmF2YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjRmNjRlLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9YU0QySmF2YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLmkxOG4uU2NoZW1hQ29tcGlsZXJNZXNzYWdlczsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYTsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYUNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIFhTRDJKYXZhIHsKLQotICAgIC8qKgotICAgICAqIGZvciBub3cgdGhlIGFyZ3VtZW50cyB0aGlzIG1haW4gbWV0aG9kIGFjY2VwdHMgaXMgdGhlIHNvdXJjZSBzY2hlbWEgYW5kIHRoZSBvdXRwdXQKLSAgICAgKiBsb2NhdGlvbgotICAgICAqCi0gICAgICogQHBhcmFtIGFyZ3MKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGFyZ3MubGVuZ3RoICE9IDIpIHsKLSAgICAgICAgICAgIC8vIHByaW50b3V0IHRoZSBvcHRpb25zCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oU2NoZW1hQ29tcGlsZXJNZXNzYWdlcy5nZXRNZXNzYWdlKCJzY2hlbWEueHNkYXJnMSIpKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihTY2hlbWFDb21waWxlck1lc3NhZ2VzLmdldE1lc3NhZ2UoInNjaGVtYS54c2RhcmcyIikpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY29tcGlsZShhcmdzWzBdLCBhcmdzWzFdKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHhzZE5hbWUKLSAgICAgKiBAcGFyYW0gb3V0cHV0TG9jYXRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGNvbXBpbGUoU3RyaW5nIHhzZE5hbWUsIFN0cmluZyBvdXRwdXRMb2NhdGlvbikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAvL2xvYWQgdGhlIGN1cnJlbnQgU2NoZW1hIHRocm91Z2ggYSBmaWxlCi0gICAgICAgICAgICAvL2ZpcnN0IHJlYWQgdGhlIGZpbGUgaW50byBhIERPTQotICAgICAgICAgICAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBkb2N1bWVudEJ1aWxkZXJGYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgZG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKLQotICAgICAgICAgICAgRG9jdW1lbnRCdWlsZGVyIGJ1aWxkZXIgPSBkb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpOwotICAgICAgICAgICAgRG9jdW1lbnQgZG9jID0gYnVpbGRlci5wYXJzZShuZXcgRmlsZSh4c2ROYW1lKSk7Ci0KLSAgICAgICAgICAgIC8vbm93IHJlYWQgaXQgdG8gYSBzY2hlbWEKLSAgICAgICAgICAgIFhtbFNjaGVtYUNvbGxlY3Rpb24gc2NoZW1hQ29sID0gbmV3IFhtbFNjaGVtYUNvbGxlY3Rpb24oKTsKLSAgICAgICAgICAgIFhtbFNjaGVtYSBjdXJyZW50U2NoZW1hID0gc2NoZW1hQ29sLnJlYWQoZG9jLCBudWxsKTsKLQotICAgICAgICAgICAgRmlsZSBvdXRwdXRGb2xkZXIgPSBuZXcgRmlsZShvdXRwdXRMb2NhdGlvbik7Ci0gICAgICAgICAgICBpZiAob3V0cHV0Rm9sZGVyLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG91dHB1dEZvbGRlci5pc0ZpbGUoKSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oU2NoZW1hQ29tcGlsZXJNZXNzYWdlcy5nZXRNZXNzYWdlKCJzY2hlbWEubG9jYXRpb25Ob3RGb2xkZXIiKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBvdXRwdXRGb2xkZXIubWtkaXJzKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIENvbXBpbGVyT3B0aW9ucyBjb21waWxlck9wdGlvbnMgPSBuZXcgQ29tcGlsZXJPcHRpb25zKCk7Ci0gICAgICAgICAgICBjb21waWxlck9wdGlvbnMuc2V0T3V0cHV0TG9jYXRpb24ob3V0cHV0Rm9sZGVyKTsKLSAgICAgICAgICAgIGNvbXBpbGVyT3B0aW9ucy5zZXRHZW5lcmF0ZUFsbCh0cnVlKTsKLQotLy8gICAgICAgICAgICBNYXAgbmFtZXNwYWNlMlBhY2thZ2VNYXAgPSBuZXcgSGFzaE1hcCgpOwotLy8gICAgICAgICAgICBuYW1lc3BhY2UyUGFja2FnZU1hcC5wdXQoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hL3NjaGVtYSIsCi0vLyAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkIik7Ci0vLyAgICAgICAgICAgIGNvbXBpbGVyT3B0aW9ucy5zZXROczJQYWNrYWdlTWFwKG5hbWVzcGFjZTJQYWNrYWdlTWFwKTsKLS8vICAgICAgICAgICAgY29tcGlsZXJPcHRpb25zLnNldE1hcHBlckNsYXNzUGFja2FnZSgib3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy54c2QiKTsKLQotICAgICAgICAgICAgLy90b2RvIC0gdGhpcyBzaG91bGQgY29tZSBmcm9tIHRoZSB1c2VycyBwcmVmZXJlbmNlcwotICAgICAgICAgICAgIGNvbXBpbGVyT3B0aW9ucy5zZXRXcmFwQ2xhc3NlcyhmYWxzZSk7Ci0KLSAgICAgICAgICAgIC8vdGhlcmUncyBubyBwb2ludCBpbiBub3Qgd3JpdGluZyB0aGUgY2xhc3NlcyBoZXJlLgotICAgICAgICAgICAgIGNvbXBpbGVyT3B0aW9ucy5zZXRXcml0ZU91dHB1dCh0cnVlKTsKLQotLy8gICAgICAgICAgICAgY29tcGlsZXJPcHRpb25zLnNldFVzZVdyYXBwZXJDbGFzc2VzKHRydWUpOwotCi0gICAgICAgICAgICBTY2hlbWFDb21waWxlciBjb21waWxlciA9IG5ldyBTY2hlbWFDb21waWxlcihjb21waWxlck9wdGlvbnMpOwotICAgICAgICAgICAgY29tcGlsZXIuY29tcGlsZShjdXJyZW50U2NoZW1hKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvYy1zY2hlbWEtY29tcGlsZS5wcm9wZXJ0aWVzIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL2Mtc2NoZW1hLWNvbXBpbGUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM2Y2MzNi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvYy1zY2hlbWEtY29tcGlsZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotIwotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIyMjIyMjIyMjIyMjIyMjIyMjIFNjaGVtYSBDb21waWxlciBwcm9wZXJ0aWVzIGZvciBBeGlzMi9DICAjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jIFRoZSBiZWFuIHdyaXRlciBjbGFzcwotIyBUaGUgYmVhbiB3cml0ZXIgaXMgdGhlIGNsYXNzIHVzZWQgYnkgdGhlIHNjaGVtYSBjb21waWxlciB0byB3cml0ZSB0aGUgYmVhbnMKLSMgYW5kIHNob3VsZCBpbXBsZW1lbnQgdGhlIG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLndyaXRlci5CZWFuV3JpdGVyCi0jIGludGVmYWNlCi0jCi1zY2hlbWEuYmVhbi53cml0ZXIuY2xhc3M9b3JnLmFwYWNoZS5heGlzMi5zY2hlbWEud3JpdGVyLkNTdHJ1Y3RXcml0ZXIKLSMKLSMgYmVhbiB3cml0ZXIgdGVtcGxhdGUKLSMgVGhlIGJlYW4gd3JpdGVycyB0ZW1wbGF0ZSBpcyBpdCdzIG93biByZXNwb25zaWJpbHR5LiAoQSBiZWFuIHdyaXRlciBwcm92aWRlcgotIyBtYXkgY2hvb3NlIG5vdCB0byB1c2UgYSB0ZW1wbGF0ZSBhdCBhbGwhKSBIb3dldmVyIHRoZSBwcm9wZXJ0eSBsb2FkZXIgd2lsbAotIyBsb2FkIHRoZSBmb2xsb3dpbmcgdGVtcGxhdGVzIChyZWZlcmVuY2UpIGFuZCBwcm92aWRlIGl0IGFuZCBpbiB0aGUgY2FzZSB3aGVuIHRoZQotIyBiZWFuIHdyaXRlciBpcyBub3Qgc3RhdGljYWxseSBib3VuZCB0byBhIHRlbXBsYXRlLCB0aGlzJ2xsIGJlIHVzZWZ1bC4KLSMKLXNjaGVtYS5iZWFuLndyaXRlci50ZW1wbGF0ZT0vb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvdGVtcGxhdGUvQ0FEQkJlYW5UZW1wbGF0ZQotIwotIyBUaGUgdHlwZSBtYXAgdG8gYmUgdXNlZCBieSB0aGUgc2NoZW1hIGNvbXBpbGVyCi0jCi1zY2hlbWEuYmVhbi50eXBlbWFwPW9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLnR5cGVtYXAuQ1R5cGVNYXAKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9pMThuL1NjaGVtYUNvbXBpbGVyTWVzc2FnZXMuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9pMThuL1NjaGVtYUNvbXBpbGVyTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGEyYTM5OS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvaTE4bi9TY2hlbWFDb21waWxlck1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5pMThuOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pMThuLk1lc3NhZ2VCdW5kbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pMThuLk1lc3NhZ2VzQ29uc3RhbnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotLyoqCi0gKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuaTE4bi5NZXNzYWdlcwotICogVGhlIGltcGxlbWVudGF0aW9uIGlzIHRoZSBzYW1lIGJ1dCBqdXN0IHRoaXNDbGFzcyBzdGF0aWMgcmVmZXJlbmNlCi0gKiBoYXMgU2NoZW1hQ29tcGlsZXJNZXNzYWdlcy5jbGFzcwotICovCi1wdWJsaWMgY2xhc3MgU2NoZW1hQ29tcGlsZXJNZXNzYWdlcyB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBDbGFzcyB0aGlzQ2xhc3MgPSBTY2hlbWFDb21waWxlck1lc3NhZ2VzLmNsYXNzOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHByb2plY3ROYW1lID0gTWVzc2FnZXNDb25zdGFudHMucHJvamVjdE5hbWU7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgcmVzb3VyY2VOYW1lID0gTWVzc2FnZXNDb25zdGFudHMucmVzb3VyY2VOYW1lOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvY2FsZSBsb2NhbGUgPSBNZXNzYWdlc0NvbnN0YW50cy5sb2NhbGU7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgcGFja2FnZU5hbWUgPSBnZXRQYWNrYWdlKHRoaXNDbGFzcy5nZXROYW1lKCkpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyID0gdGhpc0NsYXNzLmdldENsYXNzTG9hZGVyKCk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZUJ1bmRsZSBwYXJlbnQgPQotICAgICAgICAgICAgKE1lc3NhZ2VzQ29uc3RhbnRzLnJvb3RQYWNrYWdlTmFtZS5lcXVhbHMocGFja2FnZU5hbWUpKQotICAgICAgICAgICAgPyBudWxsCi0gICAgICAgICAgICA6IE1lc3NhZ2VzQ29uc3RhbnRzLnJvb3RCdW5kbGU7Ci0KLQotICAgIC8qKgotICAgICAqICoqIE5PIE5FRUQgVE8gQ0hBTkdFIEFOWVRISU5HIEJFTE9XICoqKioKLSAgICAgKi8KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1lc3NhZ2VCdW5kbGUgbWVzc2FnZUJ1bmRsZSA9Ci0gICAgICAgICAgICBuZXcgTWVzc2FnZUJ1bmRsZShwcm9qZWN0TmFtZSwgcGFja2FnZU5hbWUsIHJlc291cmNlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgbG9jYWxlLCBjbGFzc0xvYWRlciwgcGFyZW50KTsKLQotICAgIC8qKgotICAgICAqIEdldHMgYSBtZXNzYWdlIGZyb20gcmVzb3VyY2UucHJvcGVydGllcyBmcm9tIHRoZSBwYWNrYWdlIG9mIHRoZSBnaXZlbiBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5IFRoZSByZXNvdXJjZSBrZXkKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGZvcm1hdHRlZCBtZXNzYWdlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIGtleSkKLSAgICAgICAgICAgIHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbWVzc2FnZUJ1bmRsZS5nZXRNZXNzYWdlKGtleSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGEgbWVzc2FnZSBmcm9tIHJlc291cmNlLnByb3BlcnRpZXMgZnJvbSB0aGUgcGFja2FnZSBvZiB0aGUgZ2l2ZW4gb2JqZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIGtleSAgVGhlIHJlc291cmNlIGtleQotICAgICAqIEBwYXJhbSBhcmcwIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7MH0KLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGZvcm1hdHRlZCBtZXNzYWdlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIGtleSwgU3RyaW5nIGFyZzApCi0gICAgICAgICAgICB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG1lc3NhZ2VCdW5kbGUuZ2V0TWVzc2FnZShrZXksIGFyZzApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgYSBtZXNzYWdlIGZyb20gcmVzb3VyY2UucHJvcGVydGllcyBmcm9tIHRoZSBwYWNrYWdlIG9mIHRoZSBnaXZlbiBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5ICBUaGUgcmVzb3VyY2Uga2V5Ci0gICAgICogQHBhcmFtIGFyZzAgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHswfQotICAgICAqIEBwYXJhbSBhcmcxIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7MX0KLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGZvcm1hdHRlZCBtZXNzYWdlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIGtleSwgU3RyaW5nIGFyZzAsIFN0cmluZyBhcmcxKQotICAgICAgICAgICAgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBtZXNzYWdlQnVuZGxlLmdldE1lc3NhZ2Uoa2V5LCBhcmcwLCBhcmcxKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGEgbWVzc2FnZSBmcm9tIHJlc291cmNlLnByb3BlcnRpZXMgZnJvbSB0aGUgcGFja2FnZSBvZiB0aGUgZ2l2ZW4gb2JqZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIGtleSAgVGhlIHJlc291cmNlIGtleQotICAgICAqIEBwYXJhbSBhcmcwIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7MH0KLSAgICAgKiBAcGFyYW0gYXJnMSBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezF9Ci0gICAgICogQHBhcmFtIGFyZzIgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHsyfQotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgZm9ybWF0dGVkIG1lc3NhZ2UuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZShTdHJpbmcga2V5LCBTdHJpbmcgYXJnMCwgU3RyaW5nIGFyZzEsIFN0cmluZyBhcmcyKQotICAgICAgICAgICAgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBtZXNzYWdlQnVuZGxlLmdldE1lc3NhZ2Uoa2V5LCBhcmcwLCBhcmcxLCBhcmcyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYSBtZXNzYWdlIGZyb20gcmVzb3VyY2UucHJvcGVydGllcyBmcm9tIHRoZSBwYWNrYWdlIG9mIHRoZSBnaXZlbiBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5ICBUaGUgcmVzb3VyY2Uga2V5Ci0gICAgICogQHBhcmFtIGFyZzAgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHswfQotICAgICAqIEBwYXJhbSBhcmcxIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7MX0KLSAgICAgKiBAcGFyYW0gYXJnMiBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezJ9Ci0gICAgICogQHBhcmFtIGFyZzMgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHszfQotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgZm9ybWF0dGVkIG1lc3NhZ2UuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZShTdHJpbmcga2V5LCBTdHJpbmcgYXJnMCwgU3RyaW5nIGFyZzEsIFN0cmluZyBhcmcyLCBTdHJpbmcgYXJnMykKLSAgICAgICAgICAgIHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbWVzc2FnZUJ1bmRsZS5nZXRNZXNzYWdlKGtleSwgYXJnMCwgYXJnMSwgYXJnMiwgYXJnMyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhIG1lc3NhZ2UgZnJvbSByZXNvdXJjZS5wcm9wZXJ0aWVzIGZyb20gdGhlIHBhY2thZ2Ugb2YgdGhlIGdpdmVuIG9iamVjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXkgIFRoZSByZXNvdXJjZSBrZXkKLSAgICAgKiBAcGFyYW0gYXJnMCBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezB9Ci0gICAgICogQHBhcmFtIGFyZzEgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHsxfQotICAgICAqIEBwYXJhbSBhcmcyIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7Mn0KLSAgICAgKiBAcGFyYW0gYXJnMyBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezN9Ci0gICAgICogQHBhcmFtIGFyZzQgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHs0fQotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgZm9ybWF0dGVkIG1lc3NhZ2UuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZShTdHJpbmcga2V5LCBTdHJpbmcgYXJnMCwgU3RyaW5nIGFyZzEsIFN0cmluZyBhcmcyLCBTdHJpbmcgYXJnMywgU3RyaW5nIGFyZzQpCi0gICAgICAgICAgICB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG1lc3NhZ2VCdW5kbGUuZ2V0TWVzc2FnZShrZXksIGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgYSBtZXNzYWdlIGZyb20gcmVzb3VyY2UucHJvcGVydGllcyBmcm9tIHRoZSBwYWNrYWdlIG9mIHRoZSBnaXZlbiBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5ICBUaGUgcmVzb3VyY2Uga2V5Ci0gICAgICogQHBhcmFtIGFyZ3MgQW4gYXJyYXkgb2Ygb2JqZWN0cyB0byBwbGFjZSBpbiBjb3JyZXNwb25kaW5nIHZhcmlhYmxlcwotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgZm9ybWF0dGVkIG1lc3NhZ2UuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZShTdHJpbmcga2V5LCBTdHJpbmdbXSBhcmdzKQotICAgICAgICAgICAgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBtZXNzYWdlQnVuZGxlLmdldE1lc3NhZ2Uoa2V5LCBhcmdzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKCkgewotICAgICAgICByZXR1cm4gbWVzc2FnZUJ1bmRsZS5nZXRSZXNvdXJjZUJ1bmRsZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTWVzc2FnZUJ1bmRsZSBnZXRNZXNzYWdlQnVuZGxlKCkgewotICAgICAgICByZXR1cm4gbWVzc2FnZUJ1bmRsZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0UGFja2FnZShTdHJpbmcgbmFtZSkgewotICAgICAgICByZXR1cm4gbmFtZS5zdWJzdHJpbmcoMCwgbmFtZS5sYXN0SW5kZXhPZignLicpKS5pbnRlcm4oKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9pMThuL3Jlc291cmNlLnByb3BlcnRpZXMgYi92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvaTE4bi9yZXNvdXJjZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjQ3ZWY0Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9pMThuL3Jlc291cmNlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0jCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLSMgVHJhbnNsYXRpb24gaW5zdHJ1Y3Rpb25zLgotIyAxLiAgRWFjaCBtZXNzYWdlIGxpbmUgaXMgb2YgdGhlIGZvcm0ga2V5PXZhbHVlLgotIyAgICAgVHJhbnNsYXRlIHRoZSB2YWx1ZSwgRE8gTk9UIHRyYW5zbGF0ZSB0aGUga2V5LgotIyAyLiAgVGhlIG1lc3NhZ2VzIG1heSBjb250YWluIGFyZ3VtZW50cyB0aGF0IHdpbGwgYmUgZmlsbGVkIGluCi0jICAgICBieSB0aGUgcnVudGltZS4gIFRoZXNlIGFyZSBvZiB0aGUgZm9ybTogezB9LCB7MX0sIGV0Yy4KLSMgICAgIFRoZXNlIG11c3QgYXBwZWFyIGFzIGlzIGluIHRoZSBtZXNzYWdlLCB0aG91Z2ggdGhlIG9yZGVyCi0jICAgICBtYXkgYmUgY2hhbmdlZCB0byBzdXBwb3J0IHByb3BlciBsYW5ndWFnZSBzeW50YXguCi0jIDMuICBJZiBhIHNpbmdsZSBxdW90ZSBjaGFyYWN0ZXIgaXMgdG8gYXBwZWFyIGluIHRoZSByZXN1bHRpbmcKLSMgICAgIG1lc3NhZ2UsIGl0IG11c3QgYXBwZWFyIGluIHRoaXMgZmlsZSBhcyB0d28gY29uc2VjdXRpdmUKLSMgICAgIHNpbmdsZSBxdW90ZSBjaGFyYWN0ZXJzLgotIyA0LiAgTGluZXMgYmVnaW5uaW5nIHdpdGggIiMiIChsaWtlIHRoaXMgb25lKSBhcmUgY29tbWVudCBsaW5lcwotIyAgICAgYW5kIG1heSBjb250YWluIHRyYW5zbGF0aW9uIGluc3RydWN0aW9ucy4gIFRoZXkgbmVlZCBub3QgYmUKLSMgICAgIHRyYW5zbGF0ZWQgdW5sZXNzIHlvdXIgdHJhbnNsYXRlZCBmaWxlLCByYXRoZXIgdGhhbiB0aGlzIGZpbGUsCi0jICAgICB3aWxsIHNlcnZlIGFzIGEgYmFzZSBmb3Igb3RoZXIgdHJhbnNsYXRvcnMuCi0jIyMjIyMjIyMjIyMjIyMjIyMgWFNEMmphdmEgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc2NoZW1hLnhzZGFyZzE9QXJndW1lbnQxIC0gU291cmNlIHNjaGVtYSBmaWxlIG5hbWUKLXNjaGVtYS54c2RhcmcyPUFyZ3VtZW50MiAtIE91dHB1dCBmb2xkZXIgbmFtZQotc2NoZW1hLmxvY2F0aW9uTm90Rm9sZGVyPXNwZWNpZmllZCBsb2NhdGlvbiBpcyBub3QgYSBmb2xkZXIhCi1zY2hlbWEuY29tcGlsZXJleGNlcHRpb249Q29tcGlsZXIgY2F1c2VkIGFuIGV4Y2VwdGlvbgotCi0jIyMjIyMjIyMjIyMjIyMjIyMjU2NoZW1hIGNvbXBpbGVyICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNjaGVtYS51bnN1cHBvcnRlZGNvbnRlbnRlcnJvcj1VbnN1cHBvcnRlZCBjb250ZW50IHswfSAhCi1zY2hlbWEudW5rbm93bmNvbnRlbnRlcnJvcj1Vbmtub3duIGNvbnRlbnQhCi1zY2hlbWEuZWxlbWVudE51bGw9TnVsbCBlbGVtZW50IGVuY291bnRlcmVkISBQbGVhc2UgY2hlY2sgeW91ciBzY2hlbWEhCi1zY2hlbWEucmVmZXJlbmNlZEVsZW1lbnROb3RGb3VuZD1UaGUgcmVmZXJlbmNlZCBlbGVtZW50ICcnezB9Jycgd2FzIG5vdCBmb3VuZCEKLXNjaGVtYS5lbGVtZW50V2l0aE5vVHlwZT1Db3VsZCBub3QgZmluZCBhbnkgc2NoZW1hIHR5cGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBFbGVtZW50ICcnezB9JycKLXNjaGVtYS5lbXB0eU5hbWU9TWlzc2luZyBuYW1lIGF0dHJpYnV0ZSEgUGxlYXNlIGNoZWNrIHlvdXIgc2NoZW1hIQotIyMjIyMjIyMjIyMjIyMjIyMjIE9wdGlvbnMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zY2hlbWEudW5zdXBwb3J0ZWR2YWx1ZT1VbnN1cHBvcnRlZCB2YWx1ZSEKLQotIyMjIyMjIyMjIyMjIyMjIyMjIEphdmEgYmVhbiB3cml0ZXIgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc2NoZW1hLnJvb3Rub3Rmb2xkZXJleGNlcHRpb249Um9vdCBsb2NhdGlvbiBuZWVkcyB0byBiZSBhIGRpcmVjdG9yeSEKLXNjaGVtYS5ub3RpbXBsZW1lbnRlZHhjZXB0aW9uPU5vdCBpbXBsZW1lbnRlZCB5ZXQKLXNjaGVtYS50ZW1wbGF0ZUxvYWRFeGNlcHRpb249RXJyb3IgbG9hZGluZyB0aGUgdGVtcGxhdGUKLXNjaGVtYS50ZW1wbGF0ZU5vdEZvdW5kRXhjZXB0aW9uPXRlbXBsYXRlIGZvciB0aGlzIHdyaXRlciBpcyBub3QgZm91bmQKLXNjaGVtYS50eXBlTWlzc2luZz1UeXBlIHswfSBtaXNzaW5nIQotc2NoZW1hLmRvY3VlbWVudC5lcnJvcj1FcnJvciBpbiBjcmVhdGluZyB0aGUgZG9jdW1lbnQKLXNjaGVtYS5zb2FwZW5jb2RpbmcuZXJyb3I9ezB9IGlzIG5vdCBzdXBwb3J0ZWQuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3NjaGVtYS1jb21waWxlLnByb3BlcnRpZXMgYi92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvc2NoZW1hLWNvbXBpbGUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRlOTI1MS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvc2NoZW1hLWNvbXBpbGUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLSMKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNTY2hlbWEgQ29tcGlsZXIgcHJvcGVydGllcyAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIyBUaGUgYmVhbiB3cml0ZXIgY2xhc3MKLSMgVGhlIGJlYW4gd3JpdGVyIGlzIHRoZSBjbGFzcyB1c2VkIGJ5IHRoZSBzY2hlbWEgY29tcGlsZXIgdG8gd3JpdGUgdGhlIGJlYW5zCi0jIGFuZCBzaG91bGQgaW1wbGVtZW50IHRoZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS53cml0ZXIuQmVhbldyaXRlcgotIyBpbnRlZmFjZQotIwotc2NoZW1hLmJlYW4ud3JpdGVyLmNsYXNzPW9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLndyaXRlci5KYXZhQmVhbldyaXRlcgotIwotIyBiZWFuIHdyaXRlciB0ZW1wbGF0ZQotIyBUaGUgYmVhbiB3cml0ZXJzIHRlbXBsYXRlIGlzIGl0J3Mgb3duIHJlc3BvbnNpYmlsdHkuIChBIGJlYW4gd3JpdGVyIHByb3ZpZGVyCi0jIG1heSBjaG9vc2Ugbm90IHRvIHVzZSBhIHRlbXBsYXRlIGF0IGFsbCEpIEhvd2V2ZXIgdGhlIHByb3BlcnR5IGxvYWRlciB3aWxsCi0jIGxvYWQgdGhlIGZvbGxvd2luZyB0ZW1wbGF0ZXMgKHJlZmVyZW5jZSkgYW5kIHByb3ZpZGUgaXQgYW5kIGluIHRoZSBjYXNlIHdoZW4gdGhlCi0jIGJlYW4gd3JpdGVyIGlzIG5vdCBzdGF0aWNhbGx5IGJvdW5kIHRvIGEgdGVtcGxhdGUsIHRoaXMnbGwgYmUgdXNlZnVsLgotIwotc2NoZW1hLmJlYW4ud3JpdGVyLnRlbXBsYXRlPS9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS90ZW1wbGF0ZS9BREJCZWFuVGVtcGxhdGUueHNsCi0jIHNjaGVtYS5iZWFuLndyaXRlci50ZW1wbGF0ZT0vb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvdGVtcGxhdGUvUGxhaW5CZWFuVGVtcGxhdGUueHNsCi0KLSMKLSMgVGhlIHR5cGUgbWFwIHRvIGJlIHVzZWQgYnkgdGhlIHNjaGVtYSBjb21waWxlcgotIwotc2NoZW1hLmJlYW4udHlwZW1hcD1vcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS50eXBlbWFwLkphdmFUeXBlTWFwCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvdGVtcGxhdGUvQURCQmVhblRlbXBsYXRlLnhzbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS90ZW1wbGF0ZS9BREJCZWFuVGVtcGxhdGUueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODQxMTVjLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS90ZW1wbGF0ZS9BREJCZWFuVGVtcGxhdGUueHNsCisrKyAvZGV2L251bGwKQEAgLTEsNjA3MSArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+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+Ci0KLSAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIlVuc3VwcG9ydGVkIHR5cGUgIiArIG5hbWVzcGFjZVVSSSArICIgIiArIHR5cGVOYW1lKTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgIDwveHNsOnRlbXBsYXRlPgotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS90ZW1wbGF0ZS9BREJEYXRhYmluZGluZ1RlbXBsYXRlLnhzbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS90ZW1wbGF0ZS9BREJEYXRhYmluZGluZ1RlbXBsYXRlLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDNhNTY4Ni4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvdGVtcGxhdGUvQURCRGF0YWJpbmRpbmdUZW1wbGF0ZS54c2wKKysrIC9kZXYvbnVsbApAQCAtMSw0MzAgKzAsMCBAQAotDQotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+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+DQotDQotPC94c2w6c3R5bGVzaGVldD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvdGVtcGxhdGUvQ0FEQkJlYW5UZW1wbGF0ZUhlYWRlci54c2wgYi92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvdGVtcGxhdGUvQ0FEQkJlYW5UZW1wbGF0ZUhlYWRlci54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxMTU1M2MuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3RlbXBsYXRlL0NBREJCZWFuVGVtcGxhdGVIZWFkZXIueHNsCisrKyAvZGV2L251bGwKQEAgLTEsOTU1ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+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+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvdGVtcGxhdGUvQ0FEQkJlYW5UZW1wbGF0ZVNvdXJjZS54c2wgYi92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvdGVtcGxhdGUvQ0FEQkJlYW5UZW1wbGF0ZVNvdXJjZS54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiNGRlODguLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3RlbXBsYXRlL0NBREJCZWFuVGVtcGxhdGVTb3VyY2UueHNsCisrKyAvZGV2L251bGwKQEAgLTEsNTg5NiArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+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+Ci0gICAgICAgICAgICAgICAgPCEtLSBjbG9zZSB0YWdzIGFycmF5cyAtLT4KLSAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgYXh1dGlsX2FycmF5X2xpc3RfZnJlZSg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4tPnByb3BlcnR5Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz4sIGVudik7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4tPmlzX3ZhbGlkXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz4gPSBBWElTMl9GQUxTRTsgCi0gICAgICAgICAgICAgICByZXR1cm4gQVhJUzJfU1VDQ0VTUzsKLQotICAgICAgICB9Ci0KLQotICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICA8L3hzbDp0ZW1wbGF0ZT4KLQotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS90ZW1wbGF0ZS9QbGFpbkJlYW5UZW1wbGF0ZS54c2wgYi92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvdGVtcGxhdGUvUGxhaW5CZWFuVGVtcGxhdGUueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmE3NTBkLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS90ZW1wbGF0ZS9QbGFpbkJlYW5UZW1wbGF0ZS54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+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+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3R5cGVtYXAvQ1R5cGVNYXAuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS90eXBlbWFwL0NUeXBlTWFwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlZDVmOTkuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3R5cGVtYXAvQ1R5cGVNYXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLnR5cGVtYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5TY2hlbWFDb25zdGFudHM7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogVGhlIEMgdHlwZSBtYXAuIHVzZXMgYSBzdGF0aWMgbWFwIGZvciBjYWNoaW5nCi0gKi8KLXB1YmxpYyBjbGFzcyBDVHlwZU1hcCBpbXBsZW1lbnRzIFR5cGVNYXB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBNYXAgdHlwZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICAvLyBUeXBlIG1hcCBmb3IgdGhlIHN0YW5kYXJkIHNjaGVtYSB0eXBlcwotICAgIHB1YmxpYyBNYXAgZ2V0VHlwZU1hcCgpewotICAgICAgICAgcmV0dXJuIHR5cGVNYXA7Ci0gICAgfQotCi0gICAgc3RhdGljIHsKLSAgICAgICAgLy8gSWYgU09BUCAxLjEgb3ZlciB0aGUgd2lyZSwgbWFwIHdyYXBwZXIgY2xhc3NlcyB0byBYU0QgcHJpbWl0aXZlcy4KLSAgICAgICAgQ1R5cGVNYXAuYWRkVHlwZW1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlhTRF9TVFJJTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXhpczJfY2hhcl90KiIpOwotCi0gICAgICAgIC8vIFRoZSBYU0QgUHJpbWl0aXZlcyBhcmUgbWFwcGVkIHRvIGF4aXMyL2MgcHJpbWl0aXZlcy4KLSAgICAgICAgQ1R5cGVNYXAuYWRkVHlwZW1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlhTRF9CT09MRUFOLCAiYXhpczJfYm9vbF90Iik7Ci0gICAgICAgIENUeXBlTWFwLmFkZFR5cGVtYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5YU0RfRE9VQkxFLCAiZG91YmxlIik7Ci0gICAgICAgIENUeXBlTWFwLmFkZFR5cGVtYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5YU0RfRkxPQVQsICJmbG9hdCIpOwotICAgICAgICBDVHlwZU1hcC5hZGRUeXBlbWFwcGluZyhTY2hlbWFDb25zdGFudHMuWFNEX0lOVCwgImludCIpOwotICAgICAgICBDVHlwZU1hcC5hZGRUeXBlbWFwcGluZyhTY2hlbWFDb25zdGFudHMuWFNEX0lOVEVHRVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW50Iik7Ci0gICAgICAgIENUeXBlTWFwLmFkZFR5cGVtYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5YU0RfTE9ORywgImludDY0X3QiKTsKLSAgICAgICAgQ1R5cGVNYXAuYWRkVHlwZW1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlhTRF9TSE9SVCwgInNob3J0Iik7Ci0gICAgICAgIENUeXBlTWFwLmFkZFR5cGVtYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5YU0RfQllURSwgImF4aXMyX2J5dGVfdCIpOwotICAgICAgICBDVHlwZU1hcC5hZGRUeXBlbWFwcGluZyhTY2hlbWFDb25zdGFudHMuWFNEX0FOWSwgImF4aW9tX25vZGVfdCoiKTsKLSAgICAgICAgQ1R5cGVNYXAuYWRkVHlwZW1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlhTRF9ERUNJTUFMLCAiZG91YmxlIik7Ci0KLSAgICAgICAgQ1R5cGVNYXAuYWRkVHlwZW1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlhTRF9BTllUWVBFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImF4aW9tX25vZGVfdCoiKTsKLQotICAgICAgICBDVHlwZU1hcC5hZGRUeXBlbWFwcGluZyhTY2hlbWFDb25zdGFudHMuWFNEX1FOQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImF4dXRpbF9xbmFtZV90KiIpOwotCi0gICAgICAgIENUeXBlTWFwLmFkZFR5cGVtYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5YU0RfREFURSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJheHV0aWxfZGF0ZV90aW1lX3QqIik7Ci0KLSAgICAgICAgQ1R5cGVNYXAuYWRkVHlwZW1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlhTRF9USU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImF4dXRpbF9kYXRlX3RpbWVfdCoiKTsKLSAgICAgICAgQ1R5cGVNYXAuYWRkVHlwZW1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlhTRF9EQVRFVElNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJheHV0aWxfZGF0ZV90aW1lX3QqIik7Ci0KLSAgICAgICAgQ1R5cGVNYXAuYWRkVHlwZW1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlhTRF9CQVNFNjQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXh1dGlsX2Jhc2U2NF9iaW5hcnlfdCoiKTsKLQotICAgICAgICBDVHlwZU1hcC5hZGRUeXBlbWFwcGluZyhTY2hlbWFDb25zdGFudHMuWFNEX0hFWEJJTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJheGlvbV9ub2RlX3QqIik7Ci0KLSAgICAgICAgLy8gVGhlc2UgYXJlIHRoZSBnKiB0eXBlcyAoZ1llYXJNb250aCwgZXRjKSB3aGljaCBtYXAgdG8gQXhpcyB0eXBlcwotICAgICAgICAvLyBUaGVzZSB0eXBlcyBhcmUgbWFwcGVkIHRvIGFuIGludGVnZXIKLSAgICAgICAgQ1R5cGVNYXAuYWRkVHlwZW1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlhTRF9ZRUFSTU9OVEgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXh1dGlsX2RhdGVfdGltZV90KiIpOwotICAgICAgICBDVHlwZU1hcC5hZGRUeXBlbWFwcGluZyhTY2hlbWFDb25zdGFudHMuWFNEX1lFQVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW50Iik7Ci0gICAgICAgIENUeXBlTWFwLmFkZFR5cGVtYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5YU0RfTU9OVEgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW50Iik7Ci0gICAgICAgIENUeXBlTWFwLmFkZFR5cGVtYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5YU0RfREFZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludCIpOwotICAgICAgICBDVHlwZU1hcC5hZGRUeXBlbWFwcGluZyhTY2hlbWFDb25zdGFudHMuWFNEX01PTlRIREFZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImF4dXRpbF9kYXRlX3RpbWVfdCoiKTsKLQotICAgICAgICAvLyB4c2Q6dG9rZW4KLSAgICAgICAgQ1R5cGVNYXAuYWRkVHlwZW1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlhTRF9UT0tFTiwgImF4aXMyX2NoYXJfdCoiKTsKLQotICAgICAgICAvLyBhIHhzZDpub3JtYWxpemVkU3RyaW5nCi0gICAgICAgIENUeXBlTWFwLmFkZFR5cGVtYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5YU0RfTk9STUFMSVpFRFNUUklORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJheGlzMl9jaGFyX3QqIik7Ci0KLSAgICAgICAgLy8gYSB4c2Q6dW5zaWduZWRMb25nCi0gICAgICAgIENUeXBlTWFwLmFkZFR5cGVtYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5YU0RfVU5TSUdORURMT05HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVpbnQ2NF90Iik7Ci0KLSAgICAgICAgLy8gYSB4c2Q6dW5zaWduZWRJbnQKLSAgICAgICAgQ1R5cGVNYXAuYWRkVHlwZW1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlhTRF9VTlNJR05FRElOVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bnNpZ25lZCBpbnQiKTsKLQotICAgICAgICAvLyBhIHhzZDp1bnNpZ25lZFNob3J0Ci0gICAgICAgIENUeXBlTWFwLmFkZFR5cGVtYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5YU0RfVU5TSUdORURTSE9SVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bnNpZ25lZCBzaG9ydCIpOwotCi0gICAgICAgIC8vIGEgeHNkOnVuc2lnbmVkQnl0ZQotICAgICAgICBDVHlwZU1hcC5hZGRUeXBlbWFwcGluZyhTY2hlbWFDb25zdGFudHMuWFNEX1VOU0lHTkVEQllURSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJheGlzMl91bnNpZ25lZF9ieXRlX3QiKTsKLQotICAgICAgICAvLyBhIHhzZDpub25OZWdhdGl2ZUludGVnZXIKLSAgICAgICAgQ1R5cGVNYXAuYWRkVHlwZW1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlhTRF9OT05ORUdBVElWRUlOVEVHRVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5zaWduZWQgaW50Iik7Ci0KLSAgICAgICAgLy8gYSB4c2Q6bmVnYXRpdmVJbnRlZ2VyCi0gICAgICAgIENUeXBlTWFwLmFkZFR5cGVtYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5YU0RfTkVHQVRJVkVJTlRFR0VSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludCIpOwotCi0gICAgICAgIC8vIGEgeHNkOnBvc2l0aXZlSW50ZWdlcgotICAgICAgICBDVHlwZU1hcC5hZGRUeXBlbWFwcGluZyhTY2hlbWFDb25zdGFudHMuWFNEX1BPU0lUSVZFSU5URUdFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bnNpZ25lZCBpbnQiKTsKLQotICAgICAgICAvLyBhIHhzZDpub25Qb3NpdGl2ZUludGVnZXIKLSAgICAgICAgQ1R5cGVNYXAuYWRkVHlwZW1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlhTRF9OT05QT1NJVElWRUlOVEVHRVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5zaWduZWQgaW50Iik7Ci0KLSAgICAgICAgLy8gYSB4c2Q6TmFtZQotICAgICAgICBDVHlwZU1hcC5hZGRUeXBlbWFwcGluZyhTY2hlbWFDb25zdGFudHMuWFNEX05BTUUsICJheGlzMl9jaGFyX3QqIik7Ci0KLSAgICAgICAgLy8gYSB4c2Q6TkNOYW1lCi0gICAgICAgIENUeXBlTWFwLmFkZFR5cGVtYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5YU0RfTkNOQU1FLCAiYXhpczJfY2hhcl90KiIpOwotCi0gICAgICAgIC8vIGEgeHNkOklECi0gICAgICAgIENUeXBlTWFwLmFkZFR5cGVtYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5YU0RfSUQsICJheGlzMl9jaGFyX3QqIik7Ci0KLSAgICAgICAgLy8gYSB4c2Q6bGFuZ3VhZ2UKLSAgICAgICAgQ1R5cGVNYXAuYWRkVHlwZW1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlhTRF9MQU5HVUFHRSwgImF4aXMyX2NoYXJfdCoiKTsKLQotICAgICAgICAvLyBhIHhzZDpObVRva2VuCi0gICAgICAgIENUeXBlTWFwLmFkZFR5cGVtYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5YU0RfTk1UT0tFTiwgImF4aXMyX2NoYXJfdCoiKTsKLQotICAgICAgICAvLyBhIHhzZDpObVRva2VucwotICAgICAgICBDVHlwZU1hcC5hZGRUeXBlbWFwcGluZyhTY2hlbWFDb25zdGFudHMuWFNEX05NVE9LRU5TLCAiYXhpczJfY2hhcl90KiIpOwotCi0gICAgICAgIC8vIGEgeHNkOk5PVEFUSU9OCi0gICAgICAgIENUeXBlTWFwLmFkZFR5cGVtYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5YU0RfTk9UQVRJT04sICJheGlvbV9ub2RlX3QqIik7Ci0KLSAgICAgICAgLy8gYSB4c2Q6WFNEX0VOVElUWQotICAgICAgICBDVHlwZU1hcC5hZGRUeXBlbWFwcGluZyhTY2hlbWFDb25zdGFudHMuWFNEX0VOVElUWSwgImF4aXMyX2NoYXJfdCoiKTsKLQotICAgICAgICAvLyBhIHhzZDpYU0RfRU5USVRJRVMKLSAgICAgICAgQ1R5cGVNYXAuYWRkVHlwZW1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlhTRF9FTlRJVElFUywgImF4aXMyX2NoYXJfdCoiKTsKLQotICAgICAgICAvLyBhIHhzZDpYU0RfSURSRUYKLSAgICAgICAgQ1R5cGVNYXAuYWRkVHlwZW1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlhTRF9JRFJFRiwgImF4aXMyX2NoYXJfdCoiKTsKLQotICAgICAgICAvLyBhIHhzZDpYU0RfWFNEX0lEUkVGUwotICAgICAgICBDVHlwZU1hcC5hZGRUeXBlbWFwcGluZyhTY2hlbWFDb25zdGFudHMuWFNEX0lEUkVGUywgImF4aXMyX2NoYXJfdCoiKTsKLQotICAgICAgICAvLyBhIHhzZDpEdXJhdGlvbgotICAgICAgICBDVHlwZU1hcC5hZGRUeXBlbWFwcGluZyhTY2hlbWFDb25zdGFudHMuWFNEX0RVUkFUSU9OLCAiYXh1dGlsX2R1cmF0aW9uX3QqIik7Ci0KLSAgICAgICAgLy8gYSB4c2Q6YW55VVJJCi0gICAgICAgIENUeXBlTWFwLmFkZFR5cGVtYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5YU0RfQU5ZVVJJLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImF4dXRpbF91cmlfdCoiKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFkZFR5cGVtYXBwaW5nKFFOYW1lIG5hbWUsIFN0cmluZyBzdHIpIHsKLSAgICAgICAgQ1R5cGVNYXAudHlwZU1hcC5wdXQobmFtZSwgc3RyKTsKLSAgICB9Ci0KLSAgICAvLyBUeXBlIG1hcCBmb3IgdGhlIHNvYXAgZW5jb2RpbmcgdHlwZXMKLSAgICBwdWJsaWMgTWFwIGdldFNvYXBFbmNvZGluZ1R5cGVzTWFwKCkgewotICAgICAgICByZXR1cm4gc29hcEVuY29kaW5nVHlwZU1hcDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBNYXAgc29hcEVuY29kaW5nVHlwZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICBzdGF0aWMgewotICAgICAgICAvLyBwb3B1bGF0ZSB0aGUgc29hcEVuY29kaW5nVHlwZU1hcAotICAgICAgICBhZGRTb2FwRW5jb2RpbmdUeXBlTWFwcGluZyhTY2hlbWFDb25zdGFudHMuU09BUF9FTkNPRElOR19BUlJBWSwKLSAgICAgICAgICAgICAgICAiYXh1dGlsX2FycmF5X2xpc3RfdCoiKTsKLSAgICAgICAgYWRkU29hcEVuY29kaW5nVHlwZU1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlNPQVBfRU5DT0RJTkdfU1RSVUNULAotICAgICAgICAgICAgICAgICJheGlvbV9ub2RlX3QqIik7Ci0gICAgICAgIGFkZFNvYXBFbmNvZGluZ1R5cGVNYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5TT0FQX0VOQ09ESU5HX0JBU0U2NCwKLSAgICAgICAgICAgICAgICAiYXh1dGlsX2Jhc2U2NF9iaW5hcnlfdCoiKTsKLSAgICAgICAgYWRkU29hcEVuY29kaW5nVHlwZU1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlNPQVBfRU5DT0RJTkdfRFVSQVRJT04sCi0gICAgICAgICAgICAgICAgImF4dXRpbF9kdXJhdGlvbl90KiIpOwotICAgICAgICBhZGRTb2FwRW5jb2RpbmdUeXBlTWFwcGluZyhTY2hlbWFDb25zdGFudHMuU09BUF9FTkNPRElOR19EQVRFVElNRSwKLSAgICAgICAgICAgICAgICAiYXh1dGlsX2RhdGVfdGltZV90KiIpOwotICAgICAgICBhZGRTb2FwRW5jb2RpbmdUeXBlTWFwcGluZyhTY2hlbWFDb25zdGFudHMuU09BUF9FTkNPRElOR19OT1RBVElPTiwKLSAgICAgICAgICAgICAgICAiYXhpb21fbm9kZV90KiIpOwotICAgICAgICBhZGRTb2FwRW5jb2RpbmdUeXBlTWFwcGluZyhTY2hlbWFDb25zdGFudHMuU09BUF9FTkNPRElOR19USU1FLAotICAgICAgICAgICAgICAgICJheHV0aWxfZGF0ZV90aW1lX3QqIik7Ci0gICAgICAgIGFkZFNvYXBFbmNvZGluZ1R5cGVNYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5TT0FQX0VOQ09ESU5HX0RBVEUsCi0gICAgICAgICAgICAgICAgImF4dXRpbF9kYXRlX3RpbWVfdCoiKTsKLSAgICAgICAgYWRkU29hcEVuY29kaW5nVHlwZU1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlNPQVBfRU5DT0RJTkdfR1lFQVJNT05USCwKLSAgICAgICAgICAgICAgICAiYXh1dGlsX2RhdGVfdGltZV90KiIpOwotICAgICAgICBhZGRTb2FwRW5jb2RpbmdUeXBlTWFwcGluZyhTY2hlbWFDb25zdGFudHMuU09BUF9FTkNPRElOR19HWUVBUiwKLSAgICAgICAgICAgICAgICAiaW50Iik7Ci0gICAgICAgIGFkZFNvYXBFbmNvZGluZ1R5cGVNYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5TT0FQX0VOQ09ESU5HX0dNT05USERBWSwKLSAgICAgICAgICAgICAgICAiYXh1dGlsX2RhdGVfdGltZV90KiIpOwotICAgICAgICBhZGRTb2FwRW5jb2RpbmdUeXBlTWFwcGluZyhTY2hlbWFDb25zdGFudHMuU09BUF9FTkNPRElOR19HREFZLAotICAgICAgICAgICAgICAgICJpbnQiKTsKLSAgICAgICAgYWRkU29hcEVuY29kaW5nVHlwZU1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlNPQVBfRU5DT0RJTkdfR01PTlRILAotICAgICAgICAgICAgICAgICJpbnQiKTsKLSAgICAgICAgYWRkU29hcEVuY29kaW5nVHlwZU1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlNPQVBfRU5DT0RJTkdfQk9PTEVBTiwKLSAgICAgICAgICAgICAgICAiYXhpczJfYm9vbF90Iik7Ci0gICAgICAgIGFkZFNvYXBFbmNvZGluZ1R5cGVNYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5TT0FQX0VOQ09ESU5HX0JBU0U2NEJJTkFSWSwKLSAgICAgICAgICAgICAgICAiYXh1dGlsX2Jhc2U2NF9iaW5hcnlfdCoiKTsKLSAgICAgICAgYWRkU29hcEVuY29kaW5nVHlwZU1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlNPQVBfRU5DT0RJTkdfSEVYQklOQVJZLAotICAgICAgICAgICAgICAgICJheGlvbV9ub2RlX3QqIik7Ci0gICAgICAgIGFkZFNvYXBFbmNvZGluZ1R5cGVNYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5TT0FQX0VOQ09ESU5HX0ZMT0FULAotICAgICAgICAgICAgICAgICJmbG9hdCIpOwotICAgICAgICBhZGRTb2FwRW5jb2RpbmdUeXBlTWFwcGluZyhTY2hlbWFDb25zdGFudHMuU09BUF9FTkNPRElOR19ET1VCTEUsCi0gICAgICAgICAgICAgICAgImRvdWJsZSIpOwotICAgICAgICBhZGRTb2FwRW5jb2RpbmdUeXBlTWFwcGluZyhTY2hlbWFDb25zdGFudHMuU09BUF9FTkNPRElOR19BTllVUkksCi0gICAgICAgICAgICAgICAgImF4dXRpbF91cmlfdCoiKTsKLSAgICAgICAgYWRkU29hcEVuY29kaW5nVHlwZU1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlNPQVBfRU5DT0RJTkdfUU5BTUUsCi0gICAgICAgICAgICAgICAgImF4dXRpbF9xbmFtZV90KiIpOwotICAgICAgICBhZGRTb2FwRW5jb2RpbmdUeXBlTWFwcGluZyhTY2hlbWFDb25zdGFudHMuU09BUF9FTkNPRElOR19TVFJJTkcsCi0gICAgICAgICAgICAgICAgImF4aXMyX2NoYXJfdCoiKTsKLSAgICAgICAgYWRkU29hcEVuY29kaW5nVHlwZU1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlNPQVBfRU5DT0RJTkdfTk9STUFMSVpFRFNUUklORywKLSAgICAgICAgICAgICAgICAiYXhpczJfY2hhcl90KiIpOwotICAgICAgICBhZGRTb2FwRW5jb2RpbmdUeXBlTWFwcGluZyhTY2hlbWFDb25zdGFudHMuU09BUF9FTkNPRElOR19UT0tFTiwKLSAgICAgICAgICAgICAgICAiYXhpczJfY2hhcl90KiIpOwotICAgICAgICBhZGRTb2FwRW5jb2RpbmdUeXBlTWFwcGluZyhTY2hlbWFDb25zdGFudHMuU09BUF9FTkNPRElOR19MQU5HVUFHRSwKLSAgICAgICAgICAgICAgICAiYXhpczJfY2hhcl90KiIpOwotICAgICAgICBhZGRTb2FwRW5jb2RpbmdUeXBlTWFwcGluZyhTY2hlbWFDb25zdGFudHMuU09BUF9FTkNPRElOR19OQU1FLAotICAgICAgICAgICAgICAgICJheGlzMl9jaGFyX3QqIik7Ci0gICAgICAgIGFkZFNvYXBFbmNvZGluZ1R5cGVNYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5TT0FQX0VOQ09ESU5HX05NVE9LRU4sCi0gICAgICAgICAgICAgICAgImF4aXMyX2NoYXJfdCoiKTsKLSAgICAgICAgYWRkU29hcEVuY29kaW5nVHlwZU1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlNPQVBfRU5DT0RJTkdfTkNOQU1FLAotICAgICAgICAgICAgICAgICJheGlzMl9jaGFyX3QqIik7Ci0gICAgICAgIGFkZFNvYXBFbmNvZGluZ1R5cGVNYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5TT0FQX0VOQ09ESU5HX0lELAotICAgICAgICAgICAgICAgICJheGlzMl9jaGFyX3QqIik7Ci0gICAgICAgIGFkZFNvYXBFbmNvZGluZ1R5cGVNYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5TT0FQX0VOQ09ESU5HX0lEUkVGLAotICAgICAgICAgICAgICAgICJheGlzMl9jaGFyX3QqIik7Ci0gICAgICAgIGFkZFNvYXBFbmNvZGluZ1R5cGVNYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5TT0FQX0VOQ09ESU5HX0VOVElUWSwKLSAgICAgICAgICAgICAgICAiYXhpczJfY2hhcl90KiIpOwotICAgICAgICBhZGRTb2FwRW5jb2RpbmdUeXBlTWFwcGluZyhTY2hlbWFDb25zdGFudHMuU09BUF9FTkNPRElOR19JRFJFRlMsCi0gICAgICAgICAgICAgICAgImF4aXMyX2NoYXJfdCoiKTsKLSAgICAgICAgYWRkU29hcEVuY29kaW5nVHlwZU1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlNPQVBfRU5DT0RJTkdfRU5USVRJRVMsCi0gICAgICAgICAgICAgICAgImF4aXMyX2NoYXJfdCoiKTsKLSAgICAgICAgYWRkU29hcEVuY29kaW5nVHlwZU1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlNPQVBfRU5DT0RJTkdfREVDSU1BTCwKLSAgICAgICAgICAgICAgICAiZG91YmxlIik7Ci0gICAgICAgIGFkZFNvYXBFbmNvZGluZ1R5cGVNYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5TT0FQX0VOQ09ESU5HX0lOVEVHRVIsCi0gICAgICAgICAgICAgICAgImludCIpOwotICAgICAgICBhZGRTb2FwRW5jb2RpbmdUeXBlTWFwcGluZyhTY2hlbWFDb25zdGFudHMuU09BUF9FTkNPRElOR19OT05QT1NJVElWRUlOVEVHRVIsCi0gICAgICAgICAgICAgICAgImludCIpOwotICAgICAgICBhZGRTb2FwRW5jb2RpbmdUeXBlTWFwcGluZyhTY2hlbWFDb25zdGFudHMuU09BUF9FTkNPRElOR19ORUdBVElWRUlOVEVHRVIsCi0gICAgICAgICAgICAgICAgImludCIpOwotICAgICAgICBhZGRTb2FwRW5jb2RpbmdUeXBlTWFwcGluZyhTY2hlbWFDb25zdGFudHMuU09BUF9FTkNPRElOR19MT05HLAotICAgICAgICAgICAgICAgICJpbnQ2NF90Iik7Ci0gICAgICAgIGFkZFNvYXBFbmNvZGluZ1R5cGVNYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5TT0FQX0VOQ09ESU5HX0lOVCwKLSAgICAgICAgICAgICAgICAiaW50Iik7Ci0gICAgICAgIGFkZFNvYXBFbmNvZGluZ1R5cGVNYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5TT0FQX0VOQ09ESU5HX1NIT1JULAotICAgICAgICAgICAgICAgICJzaG9ydCIpOwotICAgICAgICBhZGRTb2FwRW5jb2RpbmdUeXBlTWFwcGluZyhTY2hlbWFDb25zdGFudHMuU09BUF9FTkNPRElOR19CWVRFLAotICAgICAgICAgICAgICAgICJheGlzMl9ieXRlX3QiKTsKLSAgICAgICAgYWRkU29hcEVuY29kaW5nVHlwZU1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlNPQVBfRU5DT0RJTkdfTk9OTkVHQVRJVkVJTlRFR0VSLAotICAgICAgICAgICAgICAgICJ1bnNpZ25lZCBpbnQiKTsKLSAgICAgICAgYWRkU29hcEVuY29kaW5nVHlwZU1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlNPQVBfRU5DT0RJTkdfVU5TSUdORURMT05HLAotICAgICAgICAgICAgICAgICJ1aW50NjRfdCIpOwotICAgICAgICBhZGRTb2FwRW5jb2RpbmdUeXBlTWFwcGluZyhTY2hlbWFDb25zdGFudHMuU09BUF9FTkNPRElOR19VTlNJR05FRElOVCwKLSAgICAgICAgICAgICAgICAidW5zaWduZWQgaW50Iik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRTb2FwRW5jb2RpbmdUeXBlTWFwcGluZyhRTmFtZSBuYW1lLCBTdHJpbmcgY2xhc3NOYW1lKSB7Ci0gICAgICAgIHNvYXBFbmNvZGluZ1R5cGVNYXAucHV0KG5hbWUsIGNsYXNzTmFtZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3R5cGVtYXAvSmF2YVR5cGVNYXAuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS90eXBlbWFwL0phdmFUeXBlTWFwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlMGEzMzcuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3R5cGVtYXAvSmF2YVR5cGVNYXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLnR5cGVtYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLkRheTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLkR1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuRW50aXRpZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5FbnRpdHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5IZXhCaW5hcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5JRFJlZjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLklEUmVmczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLklkOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuTGFuZ3VhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5Nb250aDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLk1vbnRoRGF5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuTkNOYW1lOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuTk1Ub2tlbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLk5NVG9rZW5zOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuTmFtZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLk5lZ2F0aXZlSW50ZWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLk5vbk5lZ2F0aXZlSW50ZWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLk5vblBvc2l0aXZlSW50ZWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLk5vcm1hbGl6ZWRTdHJpbmc7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5Ob3RhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLlBvc2l0aXZlSW50ZWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLlRpbWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5Ub2tlbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLlVSSTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLlVuc2lnbmVkQnl0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLlVuc2lnbmVkSW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuVW5zaWduZWRMb25nOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuVW5zaWduZWRTaG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLlllYXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5ZZWFyTW9udGg7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEuU2NoZW1hQ29uc3RhbnRzOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIFRoZSBqYXZhIHR5cGUgbWFwLiB1c2VzIGEgc3RhdGljIG1hcCBmb3IgY2FjaGluZwotICogTW9zdCBjb2RlIGZyb20gQXhpcyAxIENvZGViYXNlCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhVHlwZU1hcCBpbXBsZW1lbnRzIFR5cGVNYXAgewotCi0gICAgcHVibGljIE1hcCBnZXRUeXBlTWFwKCkgewotICAgICAgICByZXR1cm4gdHlwZU1hcDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBNYXAgdHlwZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICBzdGF0aWMgewotICAgICAgICAvLyBJZiBTT0FQIDEuMSBvdmVyIHRoZSB3aXJlLCBtYXAgd3JhcHBlciBjbGFzc2VzIHRvIFhTRCBwcmltaXRpdmVzLgotICAgICAgICBhZGRUeXBlbWFwcGluZyhTY2hlbWFDb25zdGFudHMuWFNEX1NUUklORywKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgLy8gVGhlIFhTRCBQcmltaXRpdmVzIGFyZSBtYXBwZWQgdG8gamF2YSBwcmltaXRpdmVzLgotICAgICAgICBhZGRUeXBlbWFwcGluZyhTY2hlbWFDb25zdGFudHMuWFNEX0JPT0xFQU4sIGJvb2xlYW4uY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgYWRkVHlwZW1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlhTRF9ET1VCTEUsIGRvdWJsZS5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICBhZGRUeXBlbWFwcGluZyhTY2hlbWFDb25zdGFudHMuWFNEX0ZMT0FULCBmbG9hdC5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICBhZGRUeXBlbWFwcGluZyhTY2hlbWFDb25zdGFudHMuWFNEX0lOVCwgaW50LmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIGFkZFR5cGVtYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5YU0RfSU5URUdFUiwKLSAgICAgICAgICAgICAgICBqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICBhZGRUeXBlbWFwcGluZyhTY2hlbWFDb25zdGFudHMuWFNEX0xPTkcsIGxvbmcuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgYWRkVHlwZW1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlhTRF9TSE9SVCwgc2hvcnQuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgYWRkVHlwZW1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlhTRF9CWVRFLCBieXRlLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIGFkZFR5cGVtYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5YU0RfQU5ZLCBPTUVsZW1lbnQuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgYWRkVHlwZW1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlhTRF9ERUNJTUFMLCBCaWdEZWNpbWFsLmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgLy9hbnl0eXBlIGlzIG1hcHBlZCB0byB0aGUgT01FbGVtZW50IGluc3RlYWQgb2YgdGhlIGphdmEubGFuZy5PYmplY3QKLSAgICAgICAgYWRkVHlwZW1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlhTRF9BTllUWVBFLAotICAgICAgICAgICAgICAgIE9iamVjdC5jbGFzcy5nZXROYW1lKCkpOwotCi0gICAgICAgIC8vUW5hbWUgbWFwcyB0byAgamF4IHJwYyBRTmFtZSBjbGFzcwotICAgICAgICBhZGRUeXBlbWFwcGluZyhTY2hlbWFDb25zdGFudHMuWFNEX1FOQU1FLAotICAgICAgICAgICAgICAgIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUuY2xhc3MuZ2V0TmFtZSgpKTsKLQotICAgICAgICAvL3hzZCBEYXRlIGlzIG1hcHBlZCB0byB0aGUgamF2YS51dGlsLmRhdGUhCi0gICAgICAgIGFkZFR5cGVtYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5YU0RfREFURSwKLSAgICAgICAgICAgICAgICBqYXZhLnV0aWwuRGF0ZS5jbGFzcy5nZXROYW1lKCkpOwotCi0gICAgICAgIC8vIE1hcHBpbmcgZm9yIHhzZDp0aW1lLiAgTWFwIHRvIEF4aXMgdHlwZSBUaW1lCi0gICAgICAgIGFkZFR5cGVtYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5YU0RfVElNRSwKLSAgICAgICAgICAgICAgICBUaW1lLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIGFkZFR5cGVtYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5YU0RfREFURVRJTUUsCi0gICAgICAgICAgICAgICAgamF2YS51dGlsLkNhbGVuZGFyLmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgLy9hcyBmb3IgdGhlIGJhc2UgNjQgZW5jb2RlZCBiaW5hcnkgc3R1ZmYgd2UgbWFwIGl0IHRvIGEgamF2YXguCi0gICAgICAgIC8vIGFjdGl2YXRpb24uRGF0YWhhbmRsZXIgb2JqZWN0Ci0gICAgICAgIGFkZFR5cGVtYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5YU0RfQkFTRTY0LAotICAgICAgICAgICAgICAgIGphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXIuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgCi0gICAgICAgIGFkZFR5cGVtYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5YU0RfSEVYQklOLAotICAgICAgICAgICAgICAgIEhleEJpbmFyeS5jbGFzcy5nZXROYW1lKCkpOwotCi0gICAgICAgIC8vIFRoZXNlIGFyZSB0aGUgZyogdHlwZXMgKGdZZWFyTW9udGgsIGV0Yykgd2hpY2ggbWFwIHRvIEF4aXMgdHlwZXMKLSAgICAgICAgYWRkVHlwZW1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlhTRF9ZRUFSTU9OVEgsCi0gICAgICAgICAgICAgICAgWWVhck1vbnRoLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIGFkZFR5cGVtYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5YU0RfWUVBUiwKLSAgICAgICAgICAgICAgICBZZWFyLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIGFkZFR5cGVtYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5YU0RfTU9OVEgsCi0gICAgICAgICAgICAgICAgTW9udGguY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgYWRkVHlwZW1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlhTRF9EQVksCi0gICAgICAgICAgICAgICAgRGF5LmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIGFkZFR5cGVtYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5YU0RfTU9OVEhEQVksCi0gICAgICAgICAgICAgICAgTW9udGhEYXkuY2xhc3MuZ2V0TmFtZSgpKTsKLQotICAgICAgICAvLyB4c2Q6dG9rZW4KLSAgICAgICAgYWRkVHlwZW1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlhTRF9UT0tFTiwgVG9rZW4uY2xhc3MuZ2V0TmFtZSgpKTsKLQotICAgICAgICAvLyBhIHhzZDpub3JtYWxpemVkU3RyaW5nCi0gICAgICAgIGFkZFR5cGVtYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5YU0RfTk9STUFMSVpFRFNUUklORywKLSAgICAgICAgICAgICAgICBOb3JtYWxpemVkU3RyaW5nLmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgLy8gYSB4c2Q6dW5zaWduZWRMb25nCi0gICAgICAgIGFkZFR5cGVtYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5YU0RfVU5TSUdORURMT05HLAotICAgICAgICAgICAgICAgIFVuc2lnbmVkTG9uZy5jbGFzcy5nZXROYW1lKCkpOwotCi0gICAgICAgIC8vIGEgeHNkOnVuc2lnbmVkSW50Ci0gICAgICAgIGFkZFR5cGVtYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5YU0RfVU5TSUdORURJTlQsCi0gICAgICAgICAgICAgICAgVW5zaWduZWRJbnQuY2xhc3MuZ2V0TmFtZSgpKTsKLQotICAgICAgICAvLyBhIHhzZDp1bnNpZ25lZFNob3J0Ci0gICAgICAgIGFkZFR5cGVtYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5YU0RfVU5TSUdORURTSE9SVCwKLSAgICAgICAgICAgICAgICBVbnNpZ25lZFNob3J0LmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgLy8gYSB4c2Q6dW5zaWduZWRCeXRlCi0gICAgICAgIGFkZFR5cGVtYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5YU0RfVU5TSUdORURCWVRFLAotICAgICAgICAgICAgICAgIFVuc2lnbmVkQnl0ZS5jbGFzcy5nZXROYW1lKCkpOwotCi0gICAgICAgIC8vIGEgeHNkOm5vbk5lZ2F0aXZlSW50ZWdlcgotICAgICAgICBhZGRUeXBlbWFwcGluZyhTY2hlbWFDb25zdGFudHMuWFNEX05PTk5FR0FUSVZFSU5URUdFUiwKLSAgICAgICAgICAgICAgICBOb25OZWdhdGl2ZUludGVnZXIuY2xhc3MuZ2V0TmFtZSgpKTsKLQotICAgICAgICAvLyBhIHhzZDpuZWdhdGl2ZUludGVnZXIKLSAgICAgICAgYWRkVHlwZW1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlhTRF9ORUdBVElWRUlOVEVHRVIsCi0gICAgICAgICAgICAgICAgTmVnYXRpdmVJbnRlZ2VyLmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgLy8gYSB4c2Q6cG9zaXRpdmVJbnRlZ2VyCi0gICAgICAgIGFkZFR5cGVtYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5YU0RfUE9TSVRJVkVJTlRFR0VSLAotICAgICAgICAgICAgICAgIFBvc2l0aXZlSW50ZWdlci5jbGFzcy5nZXROYW1lKCkpOwotCi0gICAgICAgIC8vIGEgeHNkOm5vblBvc2l0aXZlSW50ZWdlcgotICAgICAgICBhZGRUeXBlbWFwcGluZyhTY2hlbWFDb25zdGFudHMuWFNEX05PTlBPU0lUSVZFSU5URUdFUiwKLSAgICAgICAgICAgICAgICBOb25Qb3NpdGl2ZUludGVnZXIuY2xhc3MuZ2V0TmFtZSgpKTsKLQotICAgICAgICAvLyBhIHhzZDpOYW1lCi0gICAgICAgIGFkZFR5cGVtYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5YU0RfTkFNRSwgTmFtZS5jbGFzcy5nZXROYW1lKCkpOwotCi0gICAgICAgIC8vIGEgeHNkOk5DTmFtZQotICAgICAgICBhZGRUeXBlbWFwcGluZyhTY2hlbWFDb25zdGFudHMuWFNEX05DTkFNRSwgTkNOYW1lLmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgLy8gYSB4c2Q6SUQKLSAgICAgICAgYWRkVHlwZW1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlhTRF9JRCwgSWQuY2xhc3MuZ2V0TmFtZSgpKTsKLQotICAgICAgICAvLyBhIHhtbDpsYW5nCi0gICAgICAgIC8vIGFkZFR5cGVtYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5YTUxfTEFORyxMYW5ndWFnZS5jbGFzcy5nZXROYW1lKCkpOwotCi0gICAgICAgIC8vIGEgeHNkOmxhbmd1YWdlCi0gICAgICAgIGFkZFR5cGVtYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5YU0RfTEFOR1VBR0UsIExhbmd1YWdlLmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgLy8gYSB4c2Q6Tm1Ub2tlbgotICAgICAgICBhZGRUeXBlbWFwcGluZyhTY2hlbWFDb25zdGFudHMuWFNEX05NVE9LRU4sIE5NVG9rZW4uY2xhc3MuZ2V0TmFtZSgpKTsKLQotICAgICAgICAvLyBhIHhzZDpObVRva2VucwotICAgICAgICBhZGRUeXBlbWFwcGluZyhTY2hlbWFDb25zdGFudHMuWFNEX05NVE9LRU5TLCBOTVRva2Vucy5jbGFzcy5nZXROYW1lKCkpOwotCi0gICAgICAgIC8vIGEgeHNkOk5PVEFUSU9OCi0gICAgICAgIGFkZFR5cGVtYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5YU0RfTk9UQVRJT04sIE5vdGF0aW9uLmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgLy8gYSB4c2Q6WFNEX0VOVElUWQotICAgICAgICBhZGRUeXBlbWFwcGluZyhTY2hlbWFDb25zdGFudHMuWFNEX0VOVElUWSwgRW50aXR5LmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgLy8gYSB4c2Q6WFNEX0VOVElUSUVTCi0gICAgICAgIGFkZFR5cGVtYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5YU0RfRU5USVRJRVMsIEVudGl0aWVzLmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgLy8gYSB4c2Q6WFNEX0lEUkVGCi0gICAgICAgIGFkZFR5cGVtYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5YU0RfSURSRUYsIElEUmVmLmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgLy8gYSB4c2Q6WFNEX1hTRF9JRFJFRlMKLSAgICAgICAgYWRkVHlwZW1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlhTRF9JRFJFRlMsIElEUmVmcy5jbGFzcy5nZXROYW1lKCkpOwotCi0gICAgICAgIC8vIGEgeHNkOkR1cmF0aW9uCi0gICAgICAgIGFkZFR5cGVtYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5YU0RfRFVSQVRJT04sIER1cmF0aW9uLmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgLy8gYSB4c2Q6YW55VVJJCi0gICAgICAgIGFkZFR5cGVtYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5YU0RfQU5ZVVJJLCBVUkkuY2xhc3MuZ2V0TmFtZSgpKTsKLQotCi0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRUeXBlbWFwcGluZyhRTmFtZSBuYW1lLCBTdHJpbmcgc3RyKSB7Ci0gICAgICAgIHR5cGVNYXAucHV0KG5hbWUsIHN0cik7Ci0gICAgfQotCi0gICAgcHVibGljIE1hcCBnZXRTb2FwRW5jb2RpbmdUeXBlc01hcCgpIHsKLSAgICAgICAgcmV0dXJuIHNvYXBFbmNvZGluZ1R5cGVNYXA7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTWFwIHNvYXBFbmNvZGluZ1R5cGVNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgc3RhdGljIHsKLSAgICAgICAgLy8gcG9wdWxhdGUgdGhlIHNvYXBFbmNvZGluZ1R5cGVNYXAKLSAgICAgICAgYWRkU29hcEVuY29kaW5nVHlwZU1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlNPQVBfRU5DT0RJTkdfQVJSQVksCi0gICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2RpbmcuQXJyYXkuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgYWRkU29hcEVuY29kaW5nVHlwZU1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlNPQVBfRU5DT0RJTkdfU1RSVUNULAotICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLlN0cnVjdC5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICBhZGRTb2FwRW5jb2RpbmdUeXBlTWFwcGluZyhTY2hlbWFDb25zdGFudHMuU09BUF9FTkNPRElOR19CQVNFNjQsCi0gICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2RpbmcuQmFzZTY0LmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIGFkZFNvYXBFbmNvZGluZ1R5cGVNYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5TT0FQX0VOQ09ESU5HX0RVUkFUSU9OLAotICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLkR1cmF0aW9uLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIGFkZFNvYXBFbmNvZGluZ1R5cGVNYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5TT0FQX0VOQ09ESU5HX0RBVEVUSU1FLAotICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLkRhdGVUaW1lLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIGFkZFNvYXBFbmNvZGluZ1R5cGVNYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5TT0FQX0VOQ09ESU5HX05PVEFUSU9OLAotICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLk5PVEFUSU9OLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIGFkZFNvYXBFbmNvZGluZ1R5cGVNYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5TT0FQX0VOQ09ESU5HX1RJTUUsCi0gICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2RpbmcuVGltZS5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICBhZGRTb2FwRW5jb2RpbmdUeXBlTWFwcGluZyhTY2hlbWFDb25zdGFudHMuU09BUF9FTkNPRElOR19EQVRFLAotICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLkRhdGUuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgYWRkU29hcEVuY29kaW5nVHlwZU1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlNPQVBfRU5DT0RJTkdfR1lFQVJNT05USCwKLSAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZy5HWWVhck1vbnRoLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIGFkZFNvYXBFbmNvZGluZ1R5cGVNYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5TT0FQX0VOQ09ESU5HX0dZRUFSLAotICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLkdZZWFyLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIGFkZFNvYXBFbmNvZGluZ1R5cGVNYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5TT0FQX0VOQ09ESU5HX0dNT05USERBWSwKLSAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZy5HTW9udGhEYXkuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgYWRkU29hcEVuY29kaW5nVHlwZU1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlNPQVBfRU5DT0RJTkdfR0RBWSwKLSAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZy5HRGF5LmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIGFkZFNvYXBFbmNvZGluZ1R5cGVNYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5TT0FQX0VOQ09ESU5HX0dNT05USCwKLSAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZy5HTW9udGguY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgYWRkU29hcEVuY29kaW5nVHlwZU1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlNPQVBfRU5DT0RJTkdfQk9PTEVBTiwKLSAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZy5fYm9vbGVhbi5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICBhZGRTb2FwRW5jb2RpbmdUeXBlTWFwcGluZyhTY2hlbWFDb25zdGFudHMuU09BUF9FTkNPRElOR19CQVNFNjRCSU5BUlksCi0gICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2RpbmcuQmFzZTY0QmluYXJ5LmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIGFkZFNvYXBFbmNvZGluZ1R5cGVNYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5TT0FQX0VOQ09ESU5HX0hFWEJJTkFSWSwKLSAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZy5IZXhCaW5hcnkuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgYWRkU29hcEVuY29kaW5nVHlwZU1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlNPQVBfRU5DT0RJTkdfRkxPQVQsCi0gICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2RpbmcuX2Zsb2F0LmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIGFkZFNvYXBFbmNvZGluZ1R5cGVNYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5TT0FQX0VOQ09ESU5HX0RPVUJMRSwKLSAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZy5fZG91YmxlLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIGFkZFNvYXBFbmNvZGluZ1R5cGVNYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5TT0FQX0VOQ09ESU5HX0FOWVVSSSwKLSAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZy5BbnlVUkkuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgYWRkU29hcEVuY29kaW5nVHlwZU1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlNPQVBfRU5DT0RJTkdfUU5BTUUsCi0gICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2RpbmcuUU5hbWUuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgYWRkU29hcEVuY29kaW5nVHlwZU1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlNPQVBfRU5DT0RJTkdfU1RSSU5HLAotICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLlN0cmluZy5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICBhZGRTb2FwRW5jb2RpbmdUeXBlTWFwcGluZyhTY2hlbWFDb25zdGFudHMuU09BUF9FTkNPRElOR19OT1JNQUxJWkVEU1RSSU5HLAotICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLk5vcm1hbGl6ZWRTdHJpbmcuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgYWRkU29hcEVuY29kaW5nVHlwZU1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlNPQVBfRU5DT0RJTkdfVE9LRU4sCi0gICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2RpbmcuVG9rZW4uY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgYWRkU29hcEVuY29kaW5nVHlwZU1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlNPQVBfRU5DT0RJTkdfTEFOR1VBR0UsCi0gICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2RpbmcuTGFuZ3VhZ2UuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgYWRkU29hcEVuY29kaW5nVHlwZU1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlNPQVBfRU5DT0RJTkdfTkFNRSwKLSAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZy5OYW1lLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIGFkZFNvYXBFbmNvZGluZ1R5cGVNYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5TT0FQX0VOQ09ESU5HX05NVE9LRU4sCi0gICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2RpbmcuTk1UT0tFTi5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICBhZGRTb2FwRW5jb2RpbmdUeXBlTWFwcGluZyhTY2hlbWFDb25zdGFudHMuU09BUF9FTkNPRElOR19OQ05BTUUsCi0gICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2RpbmcuTkNOYW1lLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIGFkZFNvYXBFbmNvZGluZ1R5cGVNYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5TT0FQX0VOQ09ESU5HX05NVE9LRU5TLAotICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLk5NVE9LRU5TLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIGFkZFNvYXBFbmNvZGluZ1R5cGVNYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5TT0FQX0VOQ09ESU5HX0lELAotICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLklELmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIGFkZFNvYXBFbmNvZGluZ1R5cGVNYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5TT0FQX0VOQ09ESU5HX0lEUkVGLAotICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLklEUkVGLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIGFkZFNvYXBFbmNvZGluZ1R5cGVNYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5TT0FQX0VOQ09ESU5HX0VOVElUWSwKLSAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZy5FTlRJVFkuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgYWRkU29hcEVuY29kaW5nVHlwZU1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlNPQVBfRU5DT0RJTkdfSURSRUZTLAotICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLklEUkVGUy5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICBhZGRTb2FwRW5jb2RpbmdUeXBlTWFwcGluZyhTY2hlbWFDb25zdGFudHMuU09BUF9FTkNPRElOR19FTlRJVElFUywKLSAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZy5FTlRJVElFUy5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICBhZGRTb2FwRW5jb2RpbmdUeXBlTWFwcGluZyhTY2hlbWFDb25zdGFudHMuU09BUF9FTkNPRElOR19ERUNJTUFMLAotICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLkRlY2ltYWwuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgYWRkU29hcEVuY29kaW5nVHlwZU1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlNPQVBfRU5DT0RJTkdfSU5URUdFUiwKLSAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZy5JbnRlZ2VyLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIGFkZFNvYXBFbmNvZGluZ1R5cGVNYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5TT0FQX0VOQ09ESU5HX05PTlBPU0lUSVZFSU5URUdFUiwKLSAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZy5Ob25Qb3NpdGl2ZUludGVnZXIuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgYWRkU29hcEVuY29kaW5nVHlwZU1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlNPQVBfRU5DT0RJTkdfTkVHQVRJVkVJTlRFR0VSLAotICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLk5lZ2F0aXZlSW50ZWdlci5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICBhZGRTb2FwRW5jb2RpbmdUeXBlTWFwcGluZyhTY2hlbWFDb25zdGFudHMuU09BUF9FTkNPRElOR19MT05HLAotICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLl9sb25nLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIGFkZFNvYXBFbmNvZGluZ1R5cGVNYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5TT0FQX0VOQ09ESU5HX0lOVCwKLSAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZy5faW50LmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIGFkZFNvYXBFbmNvZGluZ1R5cGVNYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5TT0FQX0VOQ09ESU5HX1NIT1JULAotICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLl9zaG9ydC5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICBhZGRTb2FwRW5jb2RpbmdUeXBlTWFwcGluZyhTY2hlbWFDb25zdGFudHMuU09BUF9FTkNPRElOR19CWVRFLAotICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLl9ieXRlLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIGFkZFNvYXBFbmNvZGluZ1R5cGVNYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5TT0FQX0VOQ09ESU5HX05PTk5FR0FUSVZFSU5URUdFUiwKLSAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZy5Ob25OZWdhdGl2ZUludGVnZXIuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgYWRkU29hcEVuY29kaW5nVHlwZU1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlNPQVBfRU5DT0RJTkdfVU5TSUdORURMT05HLAotICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLlVuc2lnbmVkTG9uZy5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICBhZGRTb2FwRW5jb2RpbmdUeXBlTWFwcGluZyhTY2hlbWFDb25zdGFudHMuU09BUF9FTkNPRElOR19VTlNJR05FRElOVCwKLSAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZy5VbnNpZ25lZEludC5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICBhZGRTb2FwRW5jb2RpbmdUeXBlTWFwcGluZyhTY2hlbWFDb25zdGFudHMuU09BUF9FTkNPRElOR19VTlNJR05FRFNIT1JULAotICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLlVuc2lnbmVkU2hvcnQuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgYWRkU29hcEVuY29kaW5nVHlwZU1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlNPQVBfRU5DT0RJTkdfVU5TSUdORURCWVRFLAotICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLlVuc2lnbmVkQnl0ZS5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICBhZGRTb2FwRW5jb2RpbmdUeXBlTWFwcGluZyhTY2hlbWFDb25zdGFudHMuU09BUF9FTkNPRElOR19QT1NJVElWRUlOVEVHRVIsCi0gICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2RpbmcuUG9zaXRpdmVJbnRlZ2VyLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRTb2FwRW5jb2RpbmdUeXBlTWFwcGluZyhRTmFtZSBuYW1lLCBTdHJpbmcgY2xhc3NOYW1lKSB7Ci0gICAgICAgIHNvYXBFbmNvZGluZ1R5cGVNYXAucHV0KG5hbWUsIGNsYXNzTmFtZSk7Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS90eXBlbWFwL1R5cGVNYXAuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS90eXBlbWFwL1R5cGVNYXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjJjYzdmZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvdHlwZW1hcC9UeXBlTWFwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLnR5cGVtYXA7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIFRoaXMgaXMgYSAgdHlwZW1hcHBlciBmb3IgdGhlIGJlYW4gd3JpdGVyCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVHlwZU1hcCB7Ci0KLSAgICBwdWJsaWMgTWFwIGdldFR5cGVNYXAoKTsKLQotICAgIHB1YmxpYyBNYXAgZ2V0U29hcEVuY29kaW5nVHlwZXNNYXAoKTsKLSAgICAKLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS91dGlsL1ByaW1pdGl2ZVR5cGVGaW5kZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS91dGlsL1ByaW1pdGl2ZVR5cGVGaW5kZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM1MDllYS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvdXRpbC9QcmltaXRpdmVUeXBlRmluZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEEgc2ltcGxlIHV0aWxpeSB0byBmaW5kIHdoZXRoZXIgYSBnaXZlbiBjbGFzcyBuYW1lIGlzCi0gKiBwcmltaXRpdmUgb3Igbm90Ci0gKi8KLXB1YmxpYyBjbGFzcyBQcmltaXRpdmVUeXBlRmluZGVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIExpc3QgcHJpbWl0aXZlQ2xhc3NOYW1lTGlzdDsKLQotICAgIHN0YXRpY3sKLSAgICAgICAgcHJpbWl0aXZlQ2xhc3NOYW1lTGlzdCA9ICBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIC8vYWRkIHRoZSBqYXZhIHByaW1pdGl2ZSBjbGFzcyBuYW1lcwotICAgICAgICBwcmltaXRpdmVDbGFzc05hbWVMaXN0LmFkZChpbnQuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgcHJpbWl0aXZlQ2xhc3NOYW1lTGlzdC5hZGQobG9uZy5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICBwcmltaXRpdmVDbGFzc05hbWVMaXN0LmFkZChieXRlLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIHByaW1pdGl2ZUNsYXNzTmFtZUxpc3QuYWRkKGRvdWJsZS5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICBwcmltaXRpdmVDbGFzc05hbWVMaXN0LmFkZChib29sZWFuLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIHByaW1pdGl2ZUNsYXNzTmFtZUxpc3QuYWRkKGZsb2F0LmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIHByaW1pdGl2ZUNsYXNzTmFtZUxpc3QuYWRkKHNob3J0LmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIHByaW1pdGl2ZUNsYXNzTmFtZUxpc3QuYWRkKGNoYXIuY2xhc3MuZ2V0TmFtZSgpKTsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqCi0gICAgICogQHBhcmFtIGNsYXNzTmFtZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ByaW1pdGl2ZShTdHJpbmcgY2xhc3NOYW1lKXsKLSAgICAgICAgLy9pZiBhbiBhcnJheSB0eXBlIGlzIHBhc3NlZCwgc3RyaXAgb3V0IHRoZSBbXSBwYXJ0Ci0gICAgICAgIGlmIChjbGFzc05hbWUuaW5kZXhPZigiW10iKSE9LTEpewotICAgICAgICAgICBjbGFzc05hbWUgPSBjbGFzc05hbWUuc3Vic3RyaW5nKDAsY2xhc3NOYW1lLmluZGV4T2YoIltdIikpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwcmltaXRpdmVDbGFzc05hbWVMaXN0LmNvbnRhaW5zKGNsYXNzTmFtZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3V0aWwvUHJpbWl0aXZlVHlwZVdyYXBwZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS91dGlsL1ByaW1pdGl2ZVR5cGVXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3ZGE3MjguLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3V0aWwvUHJpbWl0aXZlVHlwZVdyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLQotcHVibGljIGNsYXNzIFByaW1pdGl2ZVR5cGVXcmFwcGVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIE1hcCBwcmltaXRpdmVUeXBlV3JhcHBlcnNNYXA7Ci0KLSAgICBzdGF0aWN7Ci0gICAgICAgIHByaW1pdGl2ZVR5cGVXcmFwcGVyc01hcCA9ICBuZXcgSGFzaE1hcCgpOwotICAgICAgICAvL2FkZCB0aGUgamF2YSBwcmltaXRpdmUgY2xhc3MgbmFtZXMKLSAgICAgICAgcHJpbWl0aXZlVHlwZVdyYXBwZXJzTWFwLnB1dChpbnQuY2xhc3MuZ2V0TmFtZSgpLEludGVnZXIuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgcHJpbWl0aXZlVHlwZVdyYXBwZXJzTWFwLnB1dChsb25nLmNsYXNzLmdldE5hbWUoKSxMb25nLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIHByaW1pdGl2ZVR5cGVXcmFwcGVyc01hcC5wdXQoYnl0ZS5jbGFzcy5nZXROYW1lKCksQnl0ZS5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICBwcmltaXRpdmVUeXBlV3JhcHBlcnNNYXAucHV0KGRvdWJsZS5jbGFzcy5nZXROYW1lKCksRG91YmxlLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIHByaW1pdGl2ZVR5cGVXcmFwcGVyc01hcC5wdXQoYm9vbGVhbi5jbGFzcy5nZXROYW1lKCksQm9vbGVhbi5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICBwcmltaXRpdmVUeXBlV3JhcHBlcnNNYXAucHV0KGZsb2F0LmNsYXNzLmdldE5hbWUoKSxGbG9hdC5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICBwcmltaXRpdmVUeXBlV3JhcHBlcnNNYXAucHV0KHNob3J0LmNsYXNzLmdldE5hbWUoKSxTaG9ydC5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICBwcmltaXRpdmVUeXBlV3JhcHBlcnNNYXAucHV0KGNoYXIuY2xhc3MuZ2V0TmFtZSgpLENoYXJhY3Rlci5jbGFzcy5nZXROYW1lKCkpOwotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcHJpbWl0aXZlY2xhc3NOYW1lCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0V3JhcHBlcihTdHJpbmcgcHJpbWl0aXZlY2xhc3NOYW1lKXsKLSAgICAgICAgU3RyaW5nIHJldHVybkNsYXNzTmFtZSA9IG51bGw7Ci0gICAgICAgIGlmIChwcmltaXRpdmVjbGFzc05hbWUudHJpbSgpLmVuZHNXaXRoKCJbXSIpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gcHJpbWl0aXZlY2xhc3NOYW1lLnN1YnN0cmluZygwLCBwcmltaXRpdmVjbGFzc05hbWUubGVuZ3RoKCkgLSAyKTsKLSAgICAgICAgICAgIHJldHVybkNsYXNzTmFtZSA9IHByaW1pdGl2ZVR5cGVXcmFwcGVyc01hcC5nZXQoY2xhc3NOYW1lKSArICJbXSI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm5DbGFzc05hbWUgPSAoU3RyaW5nKSBwcmltaXRpdmVUeXBlV3JhcHBlcnNNYXAuZ2V0KHByaW1pdGl2ZWNsYXNzTmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldHVybkNsYXNzTmFtZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvdXRpbC9TY2hlbWFQcm9wZXJ0eUxvYWRlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3V0aWwvU2NoZW1hUHJvcGVydHlMb2FkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGM2NGJlZi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvdXRpbC9TY2hlbWFQcm9wZXJ0eUxvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS51dGlsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEuU2NoZW1hQ29tcGlsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEuU2NoZW1hQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLnR5cGVtYXAuVHlwZU1hcDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS53cml0ZXIuQmVhbldyaXRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotCi0vKiogTG9hZHMgdGhlIHByb3BlcnRpZXMgIGZvciB0aGUgc2NoZW1hIGNvbXBpbGVyLiAqLwotcHVibGljIGNsYXNzIFNjaGVtYVByb3BlcnR5TG9hZGVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgYmVhblRlbXBsYXRlID0gbnVsbDsKLSAgICBwcml2YXRlIHN0YXRpYyBCZWFuV3JpdGVyIGJlYW5Xcml0ZXJJbnN0YW5jZSA9IG51bGw7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgVHlwZU1hcCB0eXBlTWFwcGVySW5zdGFuY2UgPSBudWxsOwotICAgIHByaXZhdGUgc3RhdGljIFByb3BlcnRpZXMgcHJvcGVydHlNYXA7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQURCX1BST1BFUlRZX0ZJTEVfS0VZID0gIm9yZy5hcGFjaGUuYWRiLnByb3BlcnRpZXMiOwotCi0gICAgc3RhdGljIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vbG9hZCB0aGUgcHJvcGVydGllcwotICAgICAgICAgICAgUHJvcGVydGllcyBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0gICAgICAgICAgICBTdHJpbmcgc2NoZW1hUHJvcEZpbGVuYW1lID0gU3lzdGVtLmdldFByb3BlcnR5KEFEQl9QUk9QRVJUWV9GSUxFX0tFWSk7Ci0gICAgICAgICAgICBpZiAoc2NoZW1hUHJvcEZpbGVuYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyB0aGVyZSB3YXMgbm8gc3lzdGVtIHByb3BlcnR5IC5sb2FkIHRoZSBkZWZhdWx0Ci0gICAgICAgICAgICAgICAgcHJvcHMubG9hZChTY2hlbWFDb21waWxlci5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtKAotICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hQ29uc3RhbnRzLlNjaGVtYVByb3BlcnR5TmFtZXMuU0NIRU1BX0NPTVBJTEVSX1BST1BFUlRJRVMpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcHJvcHMubG9hZChTY2hlbWFDb21waWxlci5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtKHNjaGVtYVByb3BGaWxlbmFtZSkpOwotICAgICAgICAgICAgfQotCi0KLSAgICAgICAgICAgIFN0cmluZyBiZWFuV3JpdGVyQ2xhc3NOYW1lID0KLSAgICAgICAgICAgICAgICAgICAgcHJvcHMuZ2V0UHJvcGVydHkoU2NoZW1hQ29uc3RhbnRzLlNjaGVtYVByb3BlcnR5TmFtZXMuQkVBTl9XUklURVJfS0VZKTsKLSAgICAgICAgICAgIGlmIChiZWFuV3JpdGVyQ2xhc3NOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBiZWFuV3JpdGVySW5zdGFuY2UgPSAoQmVhbldyaXRlcilDbGFzcy5mb3JOYW1lKGJlYW5Xcml0ZXJDbGFzc05hbWUpLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0cmluZyB0eXBlTWFwcGVyQ2xhc3NOYW1lID0KLSAgICAgICAgICAgICAgICAgICAgcHJvcHMuZ2V0UHJvcGVydHkoU2NoZW1hQ29uc3RhbnRzLlNjaGVtYVByb3BlcnR5TmFtZXMuQkVBTl9XUklURVJfVFlQRU1BUF9LRVkpOwotICAgICAgICAgICAgaWYgKHR5cGVNYXBwZXJDbGFzc05hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHR5cGVNYXBwZXJJbnN0YW5jZSA9IChUeXBlTWFwKUNsYXNzLmZvck5hbWUodHlwZU1hcHBlckNsYXNzTmFtZSkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYmVhblRlbXBsYXRlID0KLSAgICAgICAgICAgICAgICAgICAgcHJvcHMuZ2V0UHJvcGVydHkoU2NoZW1hQ29uc3RhbnRzLlNjaGVtYVByb3BlcnR5TmFtZXMuQkVBTl9XUklURVJfVEVNUExBVEVfS0VZKTsKLQotICAgICAgICAgICAgLy9zZXQgdGhlIHByb3BzIGFzIHRoZSBwcm9wZXJ0eSBtYXAKLSAgICAgICAgICAgIHByb3BlcnR5TWFwID0gcHJvcHM7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotCi0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFeHBvc2VzIHRoZSB3aG9sZSBwcm9wZXJ0eSBzZXQKLSAgICAgKgotICAgICAqIEByZXR1cm4gUmV0dXJucyBQcm9wZXJ0aWVzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgUHJvcGVydGllcyBnZXRQcm9wZXJ0eU1hcCgpIHsKLSAgICAgICAgcmV0dXJuIHByb3BlcnR5TWFwOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEJlYW5UZW1wbGF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIGJlYW5UZW1wbGF0ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEJlYW5Xcml0ZXIgZ2V0QmVhbldyaXRlckluc3RhbmNlKCkgewotICAgICAgICByZXR1cm4gYmVhbldyaXRlckluc3RhbmNlOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVHlwZU1hcCBnZXRUeXBlTWFwcGVySW5zdGFuY2UoKSB7Ci0gICAgICAgIHJldHVybiB0eXBlTWFwcGVySW5zdGFuY2U7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3dyaXRlci9CZWFuV3JpdGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvd3JpdGVyL0JlYW5Xcml0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTAwY2I0Yi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvd3JpdGVyL0JlYW5Xcml0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLndyaXRlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLkJlYW5Xcml0ZXJNZXRhSW5mb0hvbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5Db21waWxlck9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEuU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFFbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hU2ltcGxlVHlwZTsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIFRoZSBiZWFuIHdyaXRlciBpbnRlcmZhY2UuIFRoZSBzY2hlbWEgY29tcGlsZXIgZXhwZWN0cyBvbmUgb2YgdGhlc2UgdG8gYmUKLSAqIHByZXNlbnRlZCB0byBpdCBhbmQgY2FsbHMgdGhlIGFwcHJvcHJpYXRlIG1ldGhvZHMKLSAqLwotcHVibGljIGludGVyZmFjZSBCZWFuV3JpdGVyIHsKLQotCi0gICAgLyoqCi0gICAgICogSW5pdGlhbGl6ZXMgdGhlIHdyaXRlciB3aXRoIGNvbXBpbGVyIG9wdGlvbnMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb3B0aW9ucwotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbml0KENvbXBpbGVyT3B0aW9ucyBvcHRpb25zKSB0aHJvd3MgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZXMgYSB3cmFwcGVkIGNsYXNzLiBUaGlzIHdpbGwgaGF2ZSBlZmZlY3Qgb25seSBpZiB0aGUgQ29tcGlsZXJPcHRpb25zIHdyYXBjbGFzc3NlcwotICAgICAqIHJldHVybnMgdHJ1ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUJhdGNoKCkgdGhyb3dzIFNjaGVtYUNvbXBpbGF0aW9uRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogR2V0cyBhIG1hcCBvZiBtb2RlbHMuIFRoaXMgaXMgdXNlZnVsIGZvciB0aWdodCBpbnRlZ3JhdGlvbnMgd2hlcmUgdGhlIGludGVybmFsIHdvcmtpbmdzCi0gICAgICogb2YgdGhlIHNjaGVtYSBjb21waWxlciBtYXkgYmUgZXhwb3NlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWFwIGdldE1vZGVsTWFwKCk7Ci0KLSAgICAvKiogTWFrZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgZm9yIGFuIGVsZW1lbnQgb3IgbmFtZWQgdHlwZQotICAgICAqIEBwYXJhbSBxTmFtZSB0aGUgcXVhbGlmaWVkIE5hbWUgZm9yIHRoaXMgZWxlbWVudCBvciB0eXBlIGluIHRoZSBzY2hlbWEKLSAgICAgKiBAcmV0dXJuIHRoZSBhcHByb3ByaWF0ZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSB0byB1c2UgaW4gZ2VuZXJhdGVkIGNvZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIG1ha2VGdWxseVF1YWxpZmllZENsYXNzTmFtZShRTmFtZSBxTmFtZSk7Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZSBhIGNvbXBsZXggdHlwZQotICAgICAqCi0gICAgICogQHBhcmFtIGNvbXBsZXhUeXBlCi0gICAgICogQHBhcmFtIHR5cGVNYXAKLSAgICAgKiBAcGFyYW0gbWV0YWluZgotICAgICAqIEBwYXJhbSBmdWxseVF1YWxpZmllZENsYXNzTmFtZSB0aGUgbmFtZSByZXR1cm5lZCBieSBtYWtlRnVsbHlRdWFsaWZpZWRDbGFzc05hbWUoKSBvciBudWxsIGlmIGl0IHdhc24ndCBjYWxsZWQKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgU3RyaW5nLgotICAgICAqIEB0aHJvd3MgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHdyaXRlKFFOYW1lIHFuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgTWFwIHR5cGVNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICBNYXAgZ3JvdXBUeXBlTWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgQmVhbldyaXRlck1ldGFJbmZvSG9sZGVyIG1ldGFpbmYsCi0gICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzQWJzdHJhY3QpCi0gICAgICAgICAgICB0aHJvd3MgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZSBhIGVsZW1lbnQKLSAgICAgKgotICAgICAqIEBwYXJhbSBlbGVtZW50Ci0gICAgICogQHBhcmFtIHR5cGVNYXAKLSAgICAgKiBAcGFyYW0gbWV0YWluZgotICAgICAqIEByZXR1cm4gUmV0dXJucyBTdHJpbmcuCi0gICAgICogQHRocm93cyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgd3JpdGUoWG1sU2NoZW1hRWxlbWVudCBlbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgTWFwIHR5cGVNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICBNYXAgZ3JvdXBUeXBlTWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgQmVhbldyaXRlck1ldGFJbmZvSG9sZGVyIG1ldGFpbmYpIHRocm93cyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbjsKLQotCi0gICAgLyoqCi0gICAgICogV3JpdGUgYSBzaW1wbGUgdHlwZQotICAgICAqCi0gICAgICogQHBhcmFtIHNpbXBsZVR5cGUKLSAgICAgKiBAcGFyYW0gdHlwZU1hcAotICAgICAqIEBwYXJhbSBtZXRhaW5mCi0gICAgICogQHJldHVybiBSZXR1cm5zIFN0cmluZy4KLSAgICAgKiBAdGhyb3dzIFNjaGVtYUNvbXBpbGF0aW9uRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyB3cml0ZShYbWxTY2hlbWFTaW1wbGVUeXBlIHNpbXBsZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBNYXAgdHlwZU1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgIE1hcCBncm91cFR5cGVNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICBCZWFuV3JpdGVyTWV0YUluZm9Ib2xkZXIgbWV0YWluZikgdGhyb3dzIFNjaGVtYUNvbXBpbGF0aW9uRXhjZXB0aW9uOwotCi0KLSAgICAgLyoqCi0gICAgICogRmluZCB3aGV0aGVyIHRoZSBtYXBwZXIgY2xhc3MgbmFtZSBpcyBwcmVzZW50Ci0gICAgICogQHBhcmFtIG1hcHBlclBhY2thZ2VOYW1lCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRFeHRlbnNpb25NYXBwZXJQYWNrYWdlTmFtZSgpOwotCi0gICAgLyoqCi0gICAgICogUmVnaXN0ZXJzIHRoZSBtYXBwZXIgcGFja2FnZSBuYW1lIC0gdGhpcyBpcyByZWxldmFudCB0byBsYW5ndWFnZXMKLSAgICAgKiB0aGF0IGVuZm9yY2UgcGFja2FnaW5nIHN1Y2ggYXMgSmF2YSBvciBDIy4gTWF5IGJlIGlnbm9yZWQgaW4gb3RoZXIKLSAgICAgKiBsYW5ndWFnZXMKLSAgICAgKiBAcGFyYW0gbWFwcGVyUGFja2FnZU5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZWdpc3RlckV4dGVuc2lvbk1hcHBlclBhY2thZ2VOYW1lKFN0cmluZyBtYXBwZXJQYWNrYWdlTmFtZSk7Ci0KLQotICAgIC8qKgotICAgICAqIFdyaXRlIHRoZSBleHRlbnNpb25zIG1hcHBlciBjb21wb25lbnQgLSB0aGlzIGlzIHJlbGV2YW50IHRvIG9ubHkgdGhlIE9PUCBsYW5ndWFnZXMKLSAgICAgKiBhbmQgYSBwYXJ0aWN1bGFyIGltcGxlbWVudGF0aW9uIG1heSBpZ25vcmUgdGhpcwotICAgICAqIEBwYXJhbSBtZXRhaW5mQXJyYXkKLSAgICAgKiBAcGFyYW0gbmFtZXNwYWNlVG9Vc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUV4dGVuc2lvbk1hcHBlcihCZWFuV3JpdGVyTWV0YUluZm9Ib2xkZXJbXSBtZXRhaW5mQXJyYXkpIHRocm93cyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbjsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdENsYXNzTmFtZSgpOwotCi0gICAgcHVibGljIFN0cmluZyBnZXREZWZhdWx0Q2xhc3NBcnJheU5hbWUoKTsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdEF0dHJpYkNsYXNzTmFtZSgpOwotCi0gICAgcHVibGljIFN0cmluZyBnZXREZWZhdWx0QXR0cmliQXJyYXlDbGFzc05hbWUoKTsKLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3dyaXRlci9DU3RydWN0V3JpdGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvd3JpdGVyL0NTdHJ1Y3RXcml0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjNlNzVmMS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvd3JpdGVyL0NTdHJ1Y3RXcml0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOTAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS53cml0ZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5CZWFuV3JpdGVyTWV0YUluZm9Ib2xkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEuQ29tcGlsZXJPcHRpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLlNjaGVtYUNvbXBpbGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLlNjaGVtYUNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5pMThuLlNjaGVtYUNvbXBpbGVyTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEudHlwZW1hcC5KYXZhVHlwZU1hcDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS51dGlsLlByaW1pdGl2ZVR5cGVGaW5kZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEudXRpbC5QcmltaXRpdmVUeXBlV3JhcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS51dGlsLlNjaGVtYVByb3BlcnR5TG9hZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5KYXZhVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLlhTTFRUZW1wbGF0ZVByb2Nlc3NvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuWFNMVFV0aWxzOwotLy9pbXBvcnQgY29tLmlibS53c2RsLnV0aWwueG1sLkRPTTJXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLmRhdGFiaW5kaW5nLkNVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFTaW1wbGVUeXBlOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UZW1wbGF0ZXM7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtU291cmNlOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBjb20uaWJtLndzZGwudXRpbC54bWwuRE9NMldyaXRlcjsKLQotLyoqCi0gKiBKYXZhIEJlYW4gd3JpdGVyIGZvciB0aGUgc2NoZW1hIGNvbXBpbGVyLgotICovCi1wdWJsaWMgY2xhc3MgQ1N0cnVjdFdyaXRlciBpbXBsZW1lbnRzIEJlYW5Xcml0ZXIgewotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1JBUFBFRF9EQVRBQklORElOR19DTEFTU19OQU1FID0gIldyYXBwZWREYXRhYmluZGVyIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBWElTMl9QUkVGSVggPSAiYWRiXyI7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgamF2YUJlYW5UZW1wbGF0ZU5hbWUgPSBudWxsOwotICAgIHByaXZhdGUgYm9vbGVhbiB0ZW1wbGF0ZUxvYWRlZCA9IGZhbHNlOwotICAgIHByaXZhdGUgVGVtcGxhdGVzIHNvdXJjZVRlbXBsYXRlQ2FjaGU7Ci0gICAgcHJpdmF0ZSBUZW1wbGF0ZXMgaGVhZGVyVGVtcGxhdGVDYWNoZTsKLQotICAgIHByaXZhdGUgTGlzdCBuYW1lc0xpc3Q7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IGNvdW50ID0gMDsKLSAgICBwcml2YXRlIGJvb2xlYW4gd3JhcENsYXNzZXMgPSBmYWxzZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gd3JpdGVDbGFzc2VzID0gZmFsc2U7Ci0KLSAgICBwcm90ZWN0ZWQgRmlsZSByb290RGlyOwotCi0gICAgcHJpdmF0ZSBEb2N1bWVudCBnbG9iYWxXcmFwcGVkU291cmNlRG9jdW1lbnQ7Ci0gICAgcHJpdmF0ZSBEb2N1bWVudCBnbG9iYWxXcmFwcGVkSGVhZGVyRG9jdW1lbnQ7Ci0KLSAgICBwcml2YXRlIE1hcCBtb2RlbE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFEQl9DTEFTU19QUkVGSVggPSAiYWRiXyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFEQl9DTEFTU19QT1NURklYID0gIl90KiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfQ19DTEFTU19OQU1FID0gImF4aW9tX25vZGVfdCoiOwotCi0gICAgcHJpdmF0ZSBNYXAgYmFzZVR5cGVNYXAgPSBuZXcgSmF2YVR5cGVNYXAoKS5nZXRUeXBlTWFwKCk7Ci0KLSAgICAvLyBhIGxpc3Qgb2YgZXh0ZXJuYWxseSBpZGVudGlmaWVkIFFOYW1lcyB0byBiZSBwcm9jZXNzZWQuIFRoaXMgYmVjb21lcwotICAgIC8vIHVzZWZ1bCB3aGVuICBvbmx5IGEgbGlzdCBvZiBleHRlcm5hbCBlbGVtZW50cyBuZWVkIHRvIGJlIHByb2Nlc3NlZAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9DTEFTU19OQU1FID0gImF4aW9tX25vZGVfdCoiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfQ0xBU1NfQVJSQVlfTkFNRSA9ICJheGlvbV9ub2RlX3QqIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfQVRUUklCX0NMQVNTX05BTUUgPSAiYXhpb21fYXR0cmlidXRlX3QqIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0FUVFJJQl9BUlJBWV9DTEFTU19OQU1FID0gImF4aW9tX2F0dHJpYnV0ZV90KiI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1RZUEVfTlMgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiOwotCi0KLSAgICAvKioKLSAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yCi0gICAgICovCi0gICAgcHVibGljIENTdHJ1Y3RXcml0ZXIoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyByZXR1cm5zIGEgbWFwIG9mIFFuYW1lcyB2cyBET01Eb2N1bWVudCBtb2RlbHMuIE9uZSBjYW4gdXNlIHRoaXMgbWV0aG9kIHRvCi0gICAgICogb2J0YWluIHRoZSByYXcgRE9NbW9kZWxzIHVzZWQgdG8gd3JpdGUgdGhlIGNsYXNzZXMuCi0gICAgICogVGhpcyBoYXMgbm8gbWVhbmluZyB3aGVuIHRoZSBjbGFzc2VzIGFyZSBzdXBwb3NlZCB0byBiZSB3cmFwcGVkICBzbyB0aGUKLSAgICAgKgotICAgICAqIEByZXR1cm4gUmV0dXJucyBNYXAuCi0gICAgICogQHNlZSBCZWFuV3JpdGVyI2dldE1vZGVsTWFwKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgTWFwIGdldE1vZGVsTWFwKCkgewotICAgICAgICByZXR1cm4gbW9kZWxNYXA7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXREZWZhdWx0Q2xhc3NOYW1lKCkgewotICAgICAgICByZXR1cm4gREVGQVVMVF9DTEFTU19OQU1FOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdENsYXNzQXJyYXlOYW1lKCkgewotICAgICAgICByZXR1cm4gREVGQVVMVF9DTEFTU19BUlJBWV9OQU1FOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdEF0dHJpYkNsYXNzTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIERFRkFVTFRfQVRUUklCX0NMQVNTX05BTUU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXREZWZhdWx0QXR0cmliQXJyYXlDbGFzc05hbWUoKSB7Ci0gICAgICAgIHJldHVybiBERUZBVUxUX0FUVFJJQl9BUlJBWV9DTEFTU19OQU1FOwotICAgIH0KLSAgICBwdWJsaWMgdm9pZCBpbml0KENvbXBpbGVyT3B0aW9ucyBvcHRpb25zKSB0aHJvd3MgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgaW5pdFdpdGhGaWxlKG9wdGlvbnMuZ2V0T3V0cHV0TG9jYXRpb24oKSk7Ci0KLSAgICAgICAgICAgIHdyaXRlQ2xhc3NlcyA9IG9wdGlvbnMuaXNXcml0ZU91dHB1dCgpOwotICAgICAgICAgICAgaWYgKCF3cml0ZUNsYXNzZXMpIHsKLSAgICAgICAgICAgICAgICB3cmFwQ2xhc3NlcyA9IGZhbHNlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB3cmFwQ2xhc3NlcyA9IG9wdGlvbnMuaXNXcmFwQ2xhc3NlcygpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvL2lmIHRoZSB3cmFwIG1vZGUgaXMgc2V0IHRoZW4gY3JlYXRlIGEgZ2xvYmFsIGRvY3VtZW50IHRvIGtlZXAgdGhlIHdyYXBwZWQKLSAgICAgICAgICAgIC8vZWxlbWVudCBtb2RlbHMKLSAgICAgICAgICAgIGlmIChvcHRpb25zLmlzV3JhcENsYXNzZXMoKSkgewotICAgICAgICAgICAgICAgIGdsb2JhbFdyYXBwZWRTb3VyY2VEb2N1bWVudCA9IFhTTFRVdGlscy5nZXREb2N1bWVudCgpOwotICAgICAgICAgICAgICAgIEVsZW1lbnQgcm9vdEVsZW1lbnQgPSBYU0xUVXRpbHMuZ2V0RWxlbWVudChnbG9iYWxXcmFwcGVkU291cmNlRG9jdW1lbnQsICJiZWFucyIpOwotICAgICAgICAgICAgICAgIGdsb2JhbFdyYXBwZWRTb3VyY2VEb2N1bWVudC5hcHBlbmRDaGlsZChyb290RWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShnbG9iYWxXcmFwcGVkU291cmNlRG9jdW1lbnQsICJuYW1lIiwgQ1N0cnVjdFdyaXRlci5XUkFQUEVEX0RBVEFCSU5ESU5HX0NMQVNTX05BTUUsIHJvb3RFbGVtZW50KTsKLQotICAgICAgICAgICAgICAgIGdsb2JhbFdyYXBwZWRIZWFkZXJEb2N1bWVudCA9IFhTTFRVdGlscy5nZXREb2N1bWVudCgpOwotICAgICAgICAgICAgICAgIHJvb3RFbGVtZW50ID0gWFNMVFV0aWxzLmdldEVsZW1lbnQoZ2xvYmFsV3JhcHBlZEhlYWRlckRvY3VtZW50LCAiYmVhbnMiKTsKLSAgICAgICAgICAgICAgICBnbG9iYWxXcmFwcGVkSGVhZGVyRG9jdW1lbnQuYXBwZW5kQ2hpbGQocm9vdEVsZW1lbnQpOwotICAgICAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUoZ2xvYmFsV3JhcHBlZEhlYWRlckRvY3VtZW50LCAibmFtZSIsIENTdHJ1Y3RXcml0ZXIuV1JBUFBFRF9EQVRBQklORElOR19DTEFTU19OQU1FLCByb290RWxlbWVudCk7Ci0KLSAgICAgICAgICAgIH0KLQotCi0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24oZSk7IC8vdG9kbyBuZWVkIHRvIHB1dCBjb3JyZWN0IGVycm9yIG1lc3NhZ2VzCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gZWxlbWVudAotICAgICAqIEBwYXJhbSB0eXBlTWFwCi0gICAgICogQHBhcmFtIG1ldGFpbmYKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgU3RyaW5nLgotICAgICAqIEB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEuU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24KLSAgICAgKgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgd3JpdGUoWG1sU2NoZW1hRWxlbWVudCBlbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgTWFwIHR5cGVNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICBNYXAgZ3JvdXBUeXBlTWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgQmVhbldyaXRlck1ldGFJbmZvSG9sZGVyIG1ldGFpbmYpIHRocm93cyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFFOYW1lIHFOYW1lID0gZWxlbWVudC5nZXRRTmFtZSgpOwotCi0gICAgICAgICAgICByZXR1cm4gcHJvY2VzcyhxTmFtZSwgbWV0YWluZiwgdHlwZU1hcCwgZ3JvdXBUeXBlTWFwLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLQotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHFOYW1lCi0gICAgICogQHBhcmFtIHR5cGVNYXAKLSAgICAgKiBAcGFyYW0gbWV0YWluZgotICAgICAqIEBwYXJhbSBpc0Fic3RyYWN0Ci0gICAgICogQHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5TY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbgotICAgICAqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS53cml0ZXIuQmVhbldyaXRlcgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgd3JpdGUoUU5hbWUgcU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBNYXAgdHlwZU1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgIE1hcCBncm91cFR5cGVNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICBCZWFuV3JpdGVyTWV0YUluZm9Ib2xkZXIgbWV0YWluZiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNBYnN0cmFjdCkKLSAgICAgICAgICAgIHRocm93cyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vZGV0ZXJtaW5lIHRoZSBwYWNrYWdlIGZvciB0aGlzIHR5cGUuCi0gICAgICAgICAgICByZXR1cm4gcHJvY2VzcyhxTmFtZSwgbWV0YWluZiwgdHlwZU1hcCwgZ3JvdXBUeXBlTWFwLCBmYWxzZSwgaXNBYnN0cmFjdCk7Ci0KLSAgICAgICAgfSBjYXRjaCAoU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotCi0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAdGhyb3dzIFNjaGVtYUNvbXBpbGF0aW9uRXhjZXB0aW9uCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS53cml0ZXIuQmVhbldyaXRlciN3cml0ZUJhdGNoKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUJhdGNoKCkgdGhyb3dzIFNjaGVtYUNvbXBpbGF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmICh3cmFwQ2xhc3NlcykgewotCi0gICAgICAgICAgICAgICAgRmlsZSBvdXRTb3VyY2UgPSBjcmVhdGVPdXRGaWxlKENTdHJ1Y3RXcml0ZXIuV1JBUFBFRF9EQVRBQklORElOR19DTEFTU19OQU1FLCAiLmMiKTsKLSAgICAgICAgICAgICAgICBGaWxlIG91dEhlYWRlciA9IGNyZWF0ZU91dEZpbGUoQ1N0cnVjdFdyaXRlci5XUkFQUEVEX0RBVEFCSU5ESU5HX0NMQVNTX05BTUUsICIuaCIpOwotICAgICAgICAgICAgICAgIC8vcGFyc2Ugd2l0aCB0aGUgdGVtcGxhdGUgYW5kIGNyZWF0ZSB0aGUgZmlsZXMKLSAgICAgICAgICAgICAgICBwYXJzZVNvdXJjZShnbG9iYWxXcmFwcGVkU291cmNlRG9jdW1lbnQsIG91dFNvdXJjZSk7Ci0gICAgICAgICAgICAgICAgcGFyc2VIZWFkZXIoZ2xvYmFsV3JhcHBlZEhlYWRlckRvY3VtZW50LCBvdXRIZWFkZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVtYUNvbXBpbGF0aW9uRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHNpbXBsZVR5cGUKLSAgICAgKiBAcGFyYW0gdHlwZU1hcAotICAgICAqIEBwYXJhbSBtZXRhaW5mCi0gICAgICogQHJldHVybiBSZXR1cm5zIFN0cmluZy4KLSAgICAgKiBAdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLlNjaGVtYUNvbXBpbGF0aW9uRXhjZXB0aW9uCi0gICAgICoKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHdyaXRlKFhtbFNjaGVtYVNpbXBsZVR5cGUgc2ltcGxlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE1hcCB0eXBlTWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgTWFwIGdyb3VwVHlwZU1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEJlYW5Xcml0ZXJNZXRhSW5mb0hvbGRlciBtZXRhaW5mKSB0aHJvd3MgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy9kZXRlcm1pbmUgdGhlIHBhY2thZ2UgZm9yIHRoaXMgdHlwZS4KLSAgICAgICAgICAgIFFOYW1lIHFOYW1lID0gc2ltcGxlVHlwZS5nZXRRTmFtZSgpOwotICAgICAgICAgICAgaWYgKHFOYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBxTmFtZSA9IChRTmFtZSkgc2ltcGxlVHlwZS5nZXRNZXRhSW5mb01hcCgpLmdldChTY2hlbWFDb25zdGFudHMuU2NoZW1hQ29tcGlsZXJJbmZvSG9sZGVyLkZBS0VfUU5BTUUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbWV0YWluZi5hZGR0U3RhdHVzKHFOYW1lLCBTY2hlbWFDb25zdGFudHMuU0lNUExFX1RZUEVfT1JfQ09OVEVOVCk7Ci0gICAgICAgICAgICByZXR1cm4gcHJvY2VzcyhxTmFtZSwgbWV0YWluZiwgdHlwZU1hcCwgZ3JvdXBUeXBlTWFwLCB0cnVlLCBmYWxzZSk7Ci0KLSAgICAgICAgfSBjYXRjaCAoU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSByb290RGlyCi0gICAgICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS53cml0ZXIuQmVhbldyaXRlcgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBpbml0V2l0aEZpbGUoRmlsZSByb290RGlyKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBpZiAocm9vdERpciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aGlzLnJvb3REaXIgPSBuZXcgRmlsZSgiLiIpOwotICAgICAgICB9IGVsc2UgaWYgKCFyb290RGlyLmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbihTY2hlbWFDb21waWxlck1lc3NhZ2VzLmdldE1lc3NhZ2UoInNjaGVtYS5yb290bm90Zm9sZGVyZXhjZXB0aW9uIikpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhpcy5yb290RGlyID0gcm9vdERpcjsKLSAgICAgICAgfQotCi0gICAgICAgIG5hbWVzTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgamF2YUJlYW5UZW1wbGF0ZU5hbWUgPSBTY2hlbWFQcm9wZXJ0eUxvYWRlci5nZXRCZWFuVGVtcGxhdGUoKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIE1ha2UgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIGZvciBhbiBlbGVtZW50IG9yIG5hbWVkIHR5cGUKLSAgICAgKgotICAgICAqIEBwYXJhbSBxTmFtZSB0aGUgcXVhbGlmaWVkIE5hbWUgZm9yIHRoaXMgZWxlbWVudCBvciB0eXBlIGluIHRoZSBzY2hlbWEKLSAgICAgKiBAcmV0dXJuIHRoZSBhcHByb3ByaWF0ZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSB0byB1c2UgaW4gZ2VuZXJhdGVkIGNvZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIG1ha2VGdWxseVF1YWxpZmllZENsYXNzTmFtZShRTmFtZSBxTmFtZSkgewotCi0gICAgICAgIFN0cmluZyBvcmlnaW5hbE5hbWUgPSBxTmFtZS5nZXRMb2NhbFBhcnQoKTsKLQotICAgICAgICByZXR1cm4gbWFrZVVuaXF1ZUNTdHJ1Y3ROYW1lKHRoaXMubmFtZXNMaXN0LCBvcmlnaW5hbE5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEEgdXRpbCBtZXRob2QgdGhhdCBob2xkcyBjb21tb24gY29kZQotICAgICAqIGZvciB0aGUgY29tcGxldGUgc2NoZW1hIHRoYXQgdGhlIGdlbmVyYXRlZCBYTUwgY29tcGxpZXMgdG8KLSAgICAgKiBsb29rIHVuZGVyIG90aGVyL2JlYW5HZW5lcmF0aW9uU2NoZW1hLnhzZAotICAgICAqCi0gICAgICogQHBhcmFtIHFOYW1lCi0gICAgICogQHBhcmFtIG1ldGFpbmYKLSAgICAgKiBAcGFyYW0gdHlwZU1hcAotICAgICAqIEBwYXJhbSBpc0VsZW1lbnQKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgU3RyaW5nLgotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgcHJvY2VzcyhRTmFtZSBxTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEJlYW5Xcml0ZXJNZXRhSW5mb0hvbGRlciBtZXRhaW5mLAotICAgICAgICAgICAgICAgICAgICAgICAgTWFwIHR5cGVNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICBNYXAgZ3JvdXBUeXBlTWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0VsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzQWJzdHJhY3QpCi0gICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIGZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lID0gbWV0YWluZi5nZXRPd25DbGFzc05hbWUoKTsKLSAgICAgICAgaWYgKGZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lID09IG51bGwpCi0gICAgICAgICAgICBmdWxseVF1YWxpZmllZENsYXNzTmFtZSA9IG1ha2VGdWxseVF1YWxpZmllZENsYXNzTmFtZShxTmFtZSk7Ci0gICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBmdWxseVF1YWxpZmllZENsYXNzTmFtZTsKLQotCi0gICAgICAgIFN0cmluZyBvcmlnaW5hbE5hbWUgPSBxTmFtZSA9PSBudWxsPyAiIiA6IHFOYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICBBcnJheUxpc3QgcHJvcGVydHlOYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgICAgICBpZiAoIXRlbXBsYXRlTG9hZGVkKSB7Ci0gICAgICAgICAgICBsb2FkVGVtcGxhdGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vaWYgd3JhcHBlZCB0aGVuIGRvIG5vdCB3cml0ZSB0aGUgY2xhc3NlcyBub3cgYnV0IGFkZCB0aGUgbW9kZWxzIHRvIGEgZ2xvYmFsIGRvY3VtZW50LiBIb3dldmVyIGluIG9yZGVyIHRvIHdyaXRlIHRoZQotICAgICAgICAvL2dsb2JhbCBjbGFzcyB0aGF0IGlzIGdlbmVyYXRlZCwgb25lIG5lZWRzIHRvIGNhbGwgdGhlIHdyaXRlQmF0Y2goKSBtZXRob2QKLSAgICAgICAgaWYgKHdyYXBDbGFzc2VzKSB7Ci0gICAgICAgICAgICBnbG9iYWxXcmFwcGVkU291cmNlRG9jdW1lbnQuZ2V0RG9jdW1lbnRFbGVtZW50KCkuYXBwZW5kQ2hpbGQoCi0gICAgICAgICAgICAgICAgICAgIGdldEJlYW5FbGVtZW50KGdsb2JhbFdyYXBwZWRTb3VyY2VEb2N1bWVudCwgY2xhc3NOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxOYW1lLCBxTmFtZSwgaXNFbGVtZW50LCBpc0Fic3RyYWN0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFpbmYsIHByb3BlcnR5TmFtZXMsIHR5cGVNYXAsIGdyb3VwVHlwZU1hcCkpOwotCi0gICAgICAgICAgICBnbG9iYWxXcmFwcGVkSGVhZGVyRG9jdW1lbnQuZ2V0RG9jdW1lbnRFbGVtZW50KCkuYXBwZW5kQ2hpbGQoCi0gICAgICAgICAgICAgICAgICAgIGdldEJlYW5FbGVtZW50KGdsb2JhbFdyYXBwZWRIZWFkZXJEb2N1bWVudCwgY2xhc3NOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxOYW1lLCBxTmFtZSwgaXNFbGVtZW50LCBpc0Fic3RyYWN0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFpbmYsIHByb3BlcnR5TmFtZXMsIHR5cGVNYXAsIGdyb3VwVHlwZU1hcCkpOwotCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvL2NyZWF0ZSB0aGUgbW9kZWwKLSAgICAgICAgICAgIERvY3VtZW50IG1vZGVsU291cmNlID0gWFNMVFV0aWxzLmdldERvY3VtZW50KCk7Ci0gICAgICAgICAgICBEb2N1bWVudCBtb2RlbEhlYWRlciA9IFhTTFRVdGlscy5nZXREb2N1bWVudCgpOwotICAgICAgICAgICAgLy9tYWtlIHRoZSBYTUwKLSAgICAgICAgICAgIG1vZGVsU291cmNlLmFwcGVuZENoaWxkKGdldEJlYW5FbGVtZW50KG1vZGVsU291cmNlLCBjbGFzc05hbWUsIG9yaWdpbmFsTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgcU5hbWUsIGlzRWxlbWVudCwgaXNBYnN0cmFjdCwgbWV0YWluZiwgcHJvcGVydHlOYW1lcywKLSAgICAgICAgICAgICAgICAgICAgdHlwZU1hcCwgZ3JvdXBUeXBlTWFwKSk7Ci0gICAgICAgICAgICBtb2RlbEhlYWRlci5hcHBlbmRDaGlsZChnZXRCZWFuRWxlbWVudChtb2RlbEhlYWRlciwgY2xhc3NOYW1lLCBvcmlnaW5hbE5hbWUsCi0gICAgICAgICAgICAgICAgICAgIHFOYW1lLCBpc0VsZW1lbnQsIGlzQWJzdHJhY3QsIG1ldGFpbmYsIHByb3BlcnR5TmFtZXMsCi0gICAgICAgICAgICAgICAgICAgIHR5cGVNYXAsIGdyb3VwVHlwZU1hcCkpOwotCi0gICAgICAgICAgICBpZiAod3JpdGVDbGFzc2VzKSB7Ci0gICAgICAgICAgICAgICAgLy9jcmVhdGUgdGhlIGZpbGUKLSAgICAgICAgICAgICAgICBTdHJpbmcgZmlsZU5hbWUgPSBjbGFzc05hbWUuc3Vic3RyaW5nKDQsIGNsYXNzTmFtZS5sZW5ndGgoKSAtMyk7Ci0gICAgICAgICAgICAgICAgRmlsZSBvdXRTb3VyY2UgPSBjcmVhdGVPdXRGaWxlKGZpbGVOYW1lLCAiLmMiKTsKLSAgICAgICAgICAgICAgICBGaWxlIG91dEhlYWRlciA9IGNyZWF0ZU91dEZpbGUoZmlsZU5hbWUsICIuaCIpOwotICAgICAgICAgICAgICAgIC8vcGFyc2Ugd2l0aCB0aGUgdGVtcGxhdGUgYW5kIGNyZWF0ZSB0aGUgZmlsZXMKLSAgICAgICAgICAgICAgICBwYXJzZVNvdXJjZShtb2RlbFNvdXJjZSwgb3V0U291cmNlKTsKLSAgICAgICAgICAgICAgICBwYXJzZUhlYWRlcihtb2RlbEhlYWRlciwgb3V0SGVhZGVyKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy9hZGQgdGhlIG1vZGVsIHRvIHRoZSBtb2RlbCBtYXAKLSAgICAgICAgICAgIG1vZGVsTWFwLnB1dCgKLSAgICAgICAgICAgICAgICAgICAgbmV3IFFOYW1lKHFOYW1lLmdldE5hbWVzcGFjZVVSSSgpLCBjbGFzc05hbWUpCi0gICAgICAgICAgICAgICAgICAgICwgbW9kZWxTb3VyY2UpOwotICAgICAgICAgICAgbW9kZWxNYXAucHV0KAotICAgICAgICAgICAgICAgICAgICBuZXcgUU5hbWUocU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCksIGNsYXNzTmFtZSkKLSAgICAgICAgICAgICAgICAgICAgLCBtb2RlbEhlYWRlcik7Ci0KLSAgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oRE9NMldyaXRlci5ub2RlVG9TdHJpbmcobW9kZWxTb3VyY2UuZ2V0Rmlyc3RDaGlsZCgpKSk7Ci0gICAgICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0gICAgICAgIH0KLQotICAgICAgICAvL3JldHVybiB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUKLSAgICAgICAgcmV0dXJuIGZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lOwotCi0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gbW9kZWwKLSAgICAgKiBAcGFyYW0gY2xhc3NOYW1lCi0gICAgICogQHBhcmFtIG9yaWdpbmFsTmFtZQotICAgICAqIEBwYXJhbSBxTmFtZQotICAgICAqIEBwYXJhbSBpc0VsZW1lbnQKLSAgICAgKiBAcGFyYW0gbWV0YWluZgotICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWVzCi0gICAgICogQHBhcmFtIHR5cGVNYXAKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgRWxlbWVudC4KLSAgICAgKiBAdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLlNjaGVtYUNvbXBpbGF0aW9uRXhjZXB0aW9uCi0gICAgICoKLSAgICAgKi8KLSAgICBwcml2YXRlIEVsZW1lbnQgZ2V0QmVhbkVsZW1lbnQoCi0gICAgICAgICAgICBEb2N1bWVudCBtb2RlbCwKLSAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUsCi0gICAgICAgICAgICBTdHJpbmcgb3JpZ2luYWxOYW1lLAotICAgICAgICAgICAgUU5hbWUgcU5hbWUsCi0gICAgICAgICAgICBib29sZWFuIGlzRWxlbWVudCwKLSAgICAgICAgICAgIGJvb2xlYW4gaXNBYnN0cmFjdCwKLSAgICAgICAgICAgIEJlYW5Xcml0ZXJNZXRhSW5mb0hvbGRlciBtZXRhaW5mLAotICAgICAgICAgICAgQXJyYXlMaXN0IHByb3BlcnR5TmFtZXMsCi0gICAgICAgICAgICBNYXAgdHlwZU1hcCwKLSAgICAgICAgICAgIE1hcCBncm91cFR5cGVNYXApCi0gICAgIHRocm93cyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgRWxlbWVudCByb290RWx0ID0gWFNMVFV0aWxzLmdldEVsZW1lbnQobW9kZWwsICJjbGFzcyIpOwotICAgICAgICBTdHJpbmcgc3RyaXBwZWRDbGFzc05hbWUgPSBjbGFzc05hbWUuc3Vic3RyaW5nKDQsIGNsYXNzTmFtZS5sZW5ndGgoKSAtMyk7Ci0gICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJuYW1lIiwgc3RyaXBwZWRDbGFzc05hbWUsIHJvb3RFbHQpOwotICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAib3JpZ2luYWxOYW1lIiwgb3JpZ2luYWxOYW1lLCByb290RWx0KTsKLSAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgIm5zdXJpIiwgcU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCksIHJvb3RFbHQpOwotICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAibnNwcmVmaXgiLCBnZXRQcmVmaXhGb3JVUkkocU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCksIHFOYW1lLmdldFByZWZpeCgpKSwgcm9vdEVsdCk7Ci0KLSAgICAgICAgLyogdXNlIGNhcHMgZm9yIG1hY3JvcyAqLwotICAgICAgICBTdHJpbmcgY2Fwc05hbWUgPSBzdHJpcHBlZENsYXNzTmFtZS50b1VwcGVyQ2FzZSgpOwotICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAiY2Fwcy1uYW1lIiwgY2Fwc05hbWUsIHJvb3RFbHQpOwotCi0KLSAgICAgICAgaWYgKCF3cmFwQ2xhc3NlcykgewotICAgICAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgInVud3JhcHBlZCIsICJ5ZXMiLCByb290RWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpc0Fic3RyYWN0KSB7Ci0gICAgICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAiaXNBYnN0cmFjdCIsICJ5ZXMiLCByb290RWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghd3JpdGVDbGFzc2VzKSB7Ci0gICAgICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAic2tpcC13cml0ZSIsICJ5ZXMiLCByb290RWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghaXNFbGVtZW50KSB7Ci0gICAgICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAidHlwZSIsICJ5ZXMiLCByb290RWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtZXRhaW5mLmlzQW5vbnltb3VzKCkpIHsKLSAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJhbm9uIiwgInllcyIsIHJvb3RFbHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1ldGFpbmYuaXNFeHRlbnNpb24oKSkgewotICAgICAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgImV4dGVuc2lvbiIsIG1ldGFpbmYuZ2V0RXh0ZW5zaW9uQ2xhc3NOYW1lKCksIHJvb3RFbHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1ldGFpbmYuaXNSZXN0cmljdGlvbigpKSB7Ci0gICAgICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAicmVzdHJpY3Rpb24iLCBtZXRhaW5mCi0gICAgICAgICAgICAgICAgICAgIC5nZXRSZXN0cmljdGlvbkNsYXNzTmFtZSgpLCByb290RWx0KTsKLSAgICAgICAgfQotCi0KLSAgICAgICAgaWYgKG1ldGFpbmYuaXNDaG9pY2UoKSkgewotICAgICAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgImNob2ljZSIsICJ5ZXMiLCByb290RWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgICBpZiAobWV0YWluZi5pc1NpbXBsZSgpKSB7Ci0gICAgICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAic2ltcGxlIiwgInllcyIsIHJvb3RFbHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1ldGFpbmYuaXNVbmlvbigpKSB7Ci0gICAgICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAidW5pb24iLCAieWVzIiwgcm9vdEVsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobWV0YWluZi5pc0xpc3QoKSkgewotICAgICAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgImxpc3QiLCAieWVzIiwgcm9vdEVsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobWV0YWluZi5pc09yZGVyZWQoKSkgewotICAgICAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgIm9yZGVyZWQiLCAieWVzIiwgcm9vdEVsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaXNFbGVtZW50ICYmIG1ldGFpbmYuaXNOaWxsYWJsZShxTmFtZSkpIHsKLSAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJuaWxsYWJsZSIsICJ5ZXMiLCByb290RWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtZXRhaW5mLmlzUGFydGljbGVDbGFzcygpKSB7Ci0gICAgICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAicGFydGljbGVDbGFzcyIsICJ5ZXMiLCByb290RWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtZXRhaW5mLmlzSGFzUGFydGljbGVUeXBlKCkpewotICAgICAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgImhhc1BhcnRpY2xlVHlwZSIsICJ5ZXMiLCByb290RWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vcG9wdWxhdGUgYWxsIHRoZSBpbmZvcm1hdGlvbgotICAgICAgICBwb3B1bGF0ZUluZm8obWV0YWluZiwgbW9kZWwsIHJvb3RFbHQsIHByb3BlcnR5TmFtZXMsIHR5cGVNYXAsIGdyb3VwVHlwZU1hcCwgZmFsc2UpOwotCi0gICAgICAgIGlmIChtZXRhaW5mLmlzU2ltcGxlKCkgJiYgbWV0YWluZi5pc1VuaW9uKCkpIHsKLSAgICAgICAgICAgIHBvcHVsYXRlTWVtYmVySW5mbyhtZXRhaW5mLCBtb2RlbCwgcm9vdEVsdCwgdHlwZU1hcCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobWV0YWluZi5pc1NpbXBsZSgpICYmIG1ldGFpbmYuaXNMaXN0KCkpIHsKLSAgICAgICAgICAgIHBvcHVsYXRlTGlzdEluZm8obWV0YWluZiwgbW9kZWwsIHJvb3RFbHQsIHR5cGVNYXAsIGdyb3VwVHlwZU1hcCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcm9vdEVsdDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZUxpc3RJbmZvKEJlYW5Xcml0ZXJNZXRhSW5mb0hvbGRlciBtZXRhaW5mLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRG9jdW1lbnQgbW9kZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50IHJvb3RFbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwIHR5cGVNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXAgZ3JvdXBUeXBlTWFwKSB7Ci0KLSAgICAgICAgU3RyaW5nIGNOYW1lID0gbWFrZVVuaXF1ZUNTdHJ1Y3ROYW1lKG5ldyBBcnJheUxpc3QoKSwgbWV0YWluZi5nZXRJdGVtVHlwZVFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICBFbGVtZW50IGl0ZW1UeXBlID0gWFNMVFV0aWxzLmFkZENoaWxkRWxlbWVudChtb2RlbCwgIml0ZW10eXBlIiwgcm9vdEVsZW1lbnQpOwotICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAidHlwZSIsIG1ldGFpbmYuZ2V0SXRlbVR5cGVDbGFzc05hbWUoKSwgaXRlbVR5cGUpOwotICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAibnN1cmkiLCBtZXRhaW5mLmdldEl0ZW1UeXBlUU5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKSwgaXRlbVR5cGUpOwotICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAib3JpZ2luYWxOYW1lIiwgbWV0YWluZi5nZXRJdGVtVHlwZVFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCksIGl0ZW1UeXBlKTsKLSAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgImNuYW1lIiwgY05hbWUuc3Vic3RyaW5nKDQsIGNOYW1lLmxlbmd0aCgpLTMpLCBpdGVtVHlwZSk7Ci0KLSAgICAgICAgaWYgKHR5cGVNYXAuY29udGFpbnNLZXkobWV0YWluZi5nZXRJdGVtVHlwZVFOYW1lKCkpIHx8Ci0gICAgICAgICAgICAgICAgZ3JvdXBUeXBlTWFwLmNvbnRhaW5zS2V5KG1ldGFpbmYuZ2V0SXRlbVR5cGVDbGFzc05hbWUoKSkpIHsKLSAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJvdXJzIiwgInRydWUiLCBpdGVtVHlwZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKFByaW1pdGl2ZVR5cGVGaW5kZXIuaXNQcmltaXRpdmUobWV0YWluZi5nZXRJdGVtVHlwZUNsYXNzTmFtZSgpKSkgewotICAgICAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgInByaW1pdGl2ZSIsICJ5ZXMiLCBpdGVtVHlwZSk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHBvcHVsYXRlTWVtYmVySW5mbyhCZWFuV3JpdGVyTWV0YUluZm9Ib2xkZXIgbWV0YWluZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRG9jdW1lbnQgbW9kZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgcm9vdEVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcCB0eXBlTWFwKSB7Ci0gICAgICAgIE1hcCBtZW1iZXJUeXBlcyA9IG1ldGFpbmYuZ2V0TWVtYmVyVHlwZXMoKTsKLSAgICAgICAgUU5hbWUgbWVtYmVyUU5hbWU7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IG1lbWJlclR5cGVzLmtleVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgbWVtYmVyUU5hbWUgPSAoUU5hbWUpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgU3RyaW5nIG1lbWJlckNsYXNzID0gKFN0cmluZykgbWVtYmVyVHlwZXMuZ2V0KG1lbWJlclFOYW1lKTsKLSAgICAgICAgICAgIGlmIChQcmltaXRpdmVUeXBlRmluZGVyLmlzUHJpbWl0aXZlKG1lbWJlckNsYXNzKSkgewotICAgICAgICAgICAgICAgICBtZW1iZXJDbGFzcyA9IFByaW1pdGl2ZVR5cGVXcmFwcGVyLmdldFdyYXBwZXIobWVtYmVyQ2xhc3MpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIC8vIGFkZCBtZW1iZXIgdHlwZSBlbGVtZW50Ci0gICAgICAgICAgICBFbGVtZW50IG1lbWJlclR5cGUgPSBYU0xUVXRpbHMuYWRkQ2hpbGRFbGVtZW50KG1vZGVsLCAibWVtYmVyVHlwZSIsIHJvb3RFbGVtZW50KTsKLSAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJ0eXBlIiwgbWVtYmVyQ2xhc3MsIG1lbWJlclR5cGUpOwotICAgICAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgIm5zdXJpIiwgbWVtYmVyUU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCksIG1lbWJlclR5cGUpOwotICAgICAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgIm9yaWdpbmFsTmFtZSIsIG1lbWJlclFOYW1lLmdldExvY2FsUGFydCgpLCBtZW1iZXJUeXBlKTsKLSAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJjYXBzLW9yaWdpbmFsTmFtZSIsIG1lbWJlclFOYW1lLmdldExvY2FsUGFydCgpLnRvVXBwZXJDYXNlKCksIG1lbWJlclR5cGUpOwotICAgICAgICAgICAgaWYgKHR5cGVNYXAuY29udGFpbnNLZXkobWVtYmVyUU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgIm91cnMiLCAidHJ1ZSIsIG1lbWJlclR5cGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gbWV0YWluZgotICAgICAqIEBwYXJhbSBtb2RlbAotICAgICAqIEBwYXJhbSByb290RWx0Ci0gICAgICogQHBhcmFtIHByb3BlcnR5TmFtZXMKLSAgICAgKiBAcGFyYW0gdHlwZU1hcAotICAgICAqIEB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEuU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24KLSAgICAgKgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBwb3B1bGF0ZUluZm8oQmVhbldyaXRlck1ldGFJbmZvSG9sZGVyIG1ldGFpbmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEb2N1bWVudCBtb2RlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgcm9vdEVsdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5TGlzdCBwcm9wZXJ0eU5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwIHR5cGVNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXAgZ3JvdXBUeXBlTWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0luaGVyaXRlZCkgdGhyb3dzIFNjaGVtYUNvbXBpbGF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKG1ldGFpbmYuZ2V0UGFyZW50KCkgIT0gbnVsbCAmJiAoIW1ldGFpbmYuaXNSZXN0cmljdGlvbigpIHx8IChtZXRhaW5mLmlzUmVzdHJpY3Rpb24oKSAmJiBtZXRhaW5mLmlzU2ltcGxlKCkpKSkKLSAgICAgICAgewotICAgICAgICAgICAgcG9wdWxhdGVJbmZvKG1ldGFpbmYuZ2V0UGFyZW50KCksIG1vZGVsLCByb290RWx0LCBwcm9wZXJ0eU5hbWVzLAotICAgICAgICAgICAgICAgICAgICB0eXBlTWFwLCBncm91cFR5cGVNYXAsIHRydWUpOwotICAgICAgICB9Ci0gICAgICAgIGFkZFByb3BlcnR5RW50cmllcyhtZXRhaW5mLCBtb2RlbCwgcm9vdEVsdCwgcHJvcGVydHlOYW1lcywgdHlwZU1hcCwgZ3JvdXBUeXBlTWFwLCBpc0luaGVyaXRlZCk7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gbWV0YWluZgotICAgICAqIEBwYXJhbSBtb2RlbAotICAgICAqIEBwYXJhbSByb290RWx0Ci0gICAgICogQHBhcmFtIHByb3BlcnR5TmFtZXMKLSAgICAgKiBAcGFyYW0gdHlwZU1hcAotICAgICAqIEB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEuU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24KLS0gICAgICoKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYWRkUHJvcGVydHlFbnRyaWVzKEJlYW5Xcml0ZXJNZXRhSW5mb0hvbGRlciBtZXRhaW5mLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRG9jdW1lbnQgbW9kZWwsIEVsZW1lbnQgcm9vdEVsdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5TGlzdCBwcm9wZXJ0eU5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwIHR5cGVNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXAgZ3JvdXBUeXBlTWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0luaGVyaXRlZCkgdGhyb3dzIFNjaGVtYUNvbXBpbGF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gZ28gaW4gdGhlIGxvb3AgYW5kIGFkZCB0aGUgcGFydCBlbGVtZW50cwotICAgICAgICBRTmFtZVtdIHFOYW1lOwotICAgICAgICBBcnJheUxpc3QgbWlzc2luZ1FOYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgQXJyYXlMaXN0IHFOYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgQmVhbldyaXRlck1ldGFJbmZvSG9sZGVyIHBhcmVudE1ldGFJbmYgPSBtZXRhaW5mLmdldFBhcmVudCgpOwotCi0gICAgICAgIGlmIChtZXRhaW5mLmlzT3JkZXJlZCgpKSB7Ci0gICAgICAgICAgICBxTmFtZSA9IG1ldGFpbmYuZ2V0T3JkZXJlZFFOYW1lQXJyYXkoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHFOYW1lID0gbWV0YWluZi5nZXRRTmFtZUFycmF5KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHFOYW1lLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBxTmFtZXMuYWRkKHFOYW1lW2ldKTsKLSAgICAgICAgfQotICAgICAgICAvL2FkZGluZyBtaXNzaW5nIFFOYW1lcyB0byB0aGUgZW5kLCBpbmNsdWRpbmcgZWxlbWVudHMgJiBhdHRyaWJ1dGVzLgotICAgICAgICAvLyBmb3IgdGhlIHNpbXBsZSB0eXBlcyB3ZSBoYXZlIGFscmVhZHkgYWRkIHRoZSBwYXJlbnQgZWxlbWVudHMKLSAgICAgICAgLy8gaXQgaXMgYWxtb3N0IGNvbnNpZGVyIGFzIGFuIGV4dGVuc2lvbgotICAgICAgICBpZiAobWV0YWluZi5pc1Jlc3RyaWN0aW9uKCkgJiYgIW1ldGFpbmYuaXNTaW1wbGUoKSkgewotICAgICAgICAgICAgYWRkTWlzc2luZ1FOYW1lcyhtZXRhaW5mLCBxTmFtZXMsIG1pc3NpbmdRTmFtZXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgUU5hbWUgbmFtZTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBxTmFtZS5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgRWxlbWVudCBwcm9wZXJ0eSA9IFhTTFRVdGlscy5hZGRDaGlsZEVsZW1lbnQobW9kZWwsICJwcm9wZXJ0eSIsIHJvb3RFbHQpOwotICAgICAgICAgICAgbmFtZSA9IHFOYW1lW2ldOwotICAgICAgICAgICAgU3RyaW5nIHhtbE5hbWUgPSBtYWtlVW5pcXVlQ1N0cnVjdE5hbWUobmV3IEFycmF5TGlzdCgpLCBuYW1lLmdldExvY2FsUGFydCgpKTsKLQotICAgICAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgIm5hbWUiLCBuYW1lLmdldExvY2FsUGFydCgpLCBwcm9wZXJ0eSk7Ci0gICAgICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAib3JpZ2luYWxOYW1lIiwgbmFtZS5nZXRMb2NhbFBhcnQoKSwgcHJvcGVydHkpOwotCi0KLSAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJuc3VyaSIsIG5hbWUuZ2V0TmFtZXNwYWNlVVJJKCksIHByb3BlcnR5KTsKLSAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJwcmVmaXgiLCBuYW1lLmdldFByZWZpeCgpLCBwcm9wZXJ0eSk7Ci0KLSAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJjbmFtZSIsIHhtbE5hbWUuc3Vic3RyaW5nKDQsIHhtbE5hbWUubGVuZ3RoKCkgLTMpLCBwcm9wZXJ0eSk7Ci0KLQotICAgICAgICAgICAgU3RyaW5nIENDbGFzc05hbWVGb3JFbGVtZW50ID0gbWV0YWluZi5nZXRDbGFzc05hbWVGb3JRTmFtZShuYW1lKTsKLQotICAgICAgICAgICAgaWYgKENDbGFzc05hbWVGb3JFbGVtZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBDQ2xhc3NOYW1lRm9yRWxlbWVudCA9IENTdHJ1Y3RXcml0ZXIuREVGQVVMVF9DX0NMQVNTX05BTUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBDQ2xhc3NOYW1lRm9yRWxlbWVudCA9IGdldFNob3J0VHlwZU5hbWUoQ0NsYXNzTmFtZUZvckVsZW1lbnQpOwotCi0KLSAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJ0eXBlIiwgQ0NsYXNzTmFtZUZvckVsZW1lbnQsIHByb3BlcnR5KTsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBDYXBzIGZvciB1c2UgaW4gQyBtYWNyb3MKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgImNhcHMtY25hbWUiLCB4bWxOYW1lLnN1YnN0cmluZyg0LCB4bWxOYW1lLmxlbmd0aCgpIC0zICkudG9VcHBlckNhc2UoKSwgcHJvcGVydHkpOwotICAgICAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgImNhcHMtdHlwZSIsIENDbGFzc05hbWVGb3JFbGVtZW50LnRvVXBwZXJDYXNlKCksIHByb3BlcnR5KTsKLQotICAgICAgICAgICAgaWYgKFByaW1pdGl2ZVR5cGVGaW5kZXIuaXNQcmltaXRpdmUoQ0NsYXNzTmFtZUZvckVsZW1lbnQpKSB7Ci0gICAgICAgICAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgInByaW1pdGl2ZSIsICJ5ZXMiLCBwcm9wZXJ0eSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvL2FkZCBhbiBhdHRyaWJ1dGUgdGhhdCBzYXlzIHRoZSB0eXBlIGlzIGRlZmF1bHQKLSAgICAgICAgICAgIGlmIChpc0RlZmF1bHQoQ0NsYXNzTmFtZUZvckVsZW1lbnQpKSB7Ci0gICAgICAgICAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgImRlZmF1bHQiLCAieWVzIiwgcHJvcGVydHkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgLy8gYWRkIHRoZSBkZWZhdWx0IHZhbHVlCi0gICAgICAgICAgICBpZiAobWV0YWluZi5pc0RlZmF1bHRWYWx1ZUF2YWlsYWJsZShuYW1lKSl7Ci0gICAgICAgICAgICAgICAgUU5hbWUgc2NoZW1hUU5hbWUgPSBtZXRhaW5mLmdldFNjaGVtYVFOYW1lRm9yUU5hbWUobmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGJhc2VUeXBlTWFwLmNvbnRhaW5zS2V5KHNjaGVtYVFOYW1lKSl7Ci0gICAgICAgICAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJkZWZhdWx0VmFsdWUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFpbmYuZ2V0RGVmYXVsdFZhbHVlRm9yUU5hbWUobmFtZSksIHByb3BlcnR5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICh0eXBlTWFwLmNvbnRhaW5zS2V5KG1ldGFpbmYuZ2V0U2NoZW1hUU5hbWVGb3JRTmFtZShuYW1lKSkgfHwKLSAgICAgICAgICAgICAgICAgICAgKG1ldGFpbmYuZ2V0U2NoZW1hUU5hbWVGb3JRTmFtZShuYW1lKSA9PSBudWxsIHx8Ci0gICAgICAgICAgICAgICAgICAgICFtZXRhaW5mLmdldFNjaGVtYVFOYW1lRm9yUU5hbWUobmFtZSkuZ2V0TmFtZXNwYWNlVVJJKCkuZXF1YWxzKERFRkFVTFRfVFlQRV9OUykpCi0gICAgICAgICAgICAgICAgICAgICAmJiAhQ0NsYXNzTmFtZUZvckVsZW1lbnQuZXF1YWxzKERFRkFVTFRfQ19DTEFTU19OQU1FKQotICAgICAgICAgICAgICAgICAgICAgJiYgIUNDbGFzc05hbWVGb3JFbGVtZW50LmVxdWFscyhERUZBVUxUX0FUVFJJQl9DTEFTU19OQU1FKSkgewotICAgICAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJvdXJzIiwgInllcyIsIHByb3BlcnR5KTsKLQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobWV0YWluZi5nZXRBdHRyaWJ1dGVTdGF0dXNGb3JRTmFtZShuYW1lKSkgewotICAgICAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJhdHRyaWJ1dGUiLCAieWVzIiwgcHJvcGVydHkpOwotICAgICAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgIm5vdGF0dHJpYnV0ZSIsICJ5ZXMiLCBwcm9wZXJ0eSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtZXRhaW5mLmlzTmlsbGFibGUobmFtZSkpIHsKLSAgICAgICAgICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAibmlsbGFibGUiLCAieWVzIiwgcHJvcGVydHkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTdHJpbmcgc2hvcnRUeXBlTmFtZTsKLSAgICAgICAgICAgIGlmIChtZXRhaW5mLmdldFNjaGVtYVFOYW1lRm9yUU5hbWUobmFtZSkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vc2VlIHdoZXRoZXIgdGhlIFFOYW1lIGlzIGEgYmFzZXR5cGUKLSAgICAgICAgICAgICAgICBpZiAoYmFzZVR5cGVNYXAuY29udGFpbnNLZXkobWV0YWluZi5nZXRTY2hlbWFRTmFtZUZvclFOYW1lKG5hbWUpKSkgewotICAgICAgICAgICAgICAgICAgICBzaG9ydFR5cGVOYW1lID0gbWV0YWluZi5nZXRTY2hlbWFRTmFtZUZvclFOYW1lKG5hbWUpLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHNob3J0VHlwZU5hbWUgPSBnZXRTaG9ydFR5cGVOYW1lKENDbGFzc05hbWVGb3JFbGVtZW50KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNob3J0VHlwZU5hbWUgPSBnZXRTaG9ydFR5cGVOYW1lKENDbGFzc05hbWVGb3JFbGVtZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJzaG9ydHR5cGVuYW1lIiwgc2hvcnRUeXBlTmFtZSwgcHJvcGVydHkpOwotCi0gICAgICAgICAgICBpZiAoaXNJbmhlcml0ZWQpIHsKLSAgICAgICAgICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAiaW5oZXJpdGVkIiwgInllcyIsIHByb3BlcnR5KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1ldGFpbmYuZ2V0QW55U3RhdHVzRm9yUU5hbWUobmFtZSkpIHsKLSAgICAgICAgICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAiYW55IiwgInllcyIsIHByb3BlcnR5KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1ldGFpbmYuZ2V0QmluYXJ5U3RhdHVzRm9yUU5hbWUobmFtZSkpIHsKLSAgICAgICAgICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAiYmluYXJ5IiwgInllcyIsIHByb3BlcnR5KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1ldGFpbmYuZ2V0U2ltcGxlU3RhdHVzRm9yUU5hbWUobmFtZSkpIHsKLSAgICAgICAgICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAic2ltcGxlIiwgInllcyIsIHByb3BlcnR5KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy9wdXQgdGhlIG1pbiBvY2N1cnMgY291bnQgaXJyZXNwZWN0aXZlIG9mIHdoZXRoZXIgaXQncyBhbiBhcnJheSBvciBub3QKLSAgICAgICAgICAgIGxvbmcgbWluT2NjdXJzID0gbWV0YWluZi5nZXRNaW5PY2N1cnMobmFtZSk7Ci0gICAgICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAibWluT2NjdXJzIiwgbWluT2NjdXJzICsgIiIsIHByb3BlcnR5KTsKLQotCi0gICAgICAgICAgICBpZiAobWV0YWluZi5nZXRBcnJheVN0YXR1c0ZvclFOYW1lKG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGF0dHJOYW1lID0gbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICBpbnQgYXJyYXlUb2tlblN0YXJ0ID0gYXR0ck5hbWUuaW5kZXhPZigiQXJyYXkiKTsKLSAgICAgICAgICAgICAgICBpZiAoYXJyYXlUb2tlblN0YXJ0ID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGFycmF5RWxlID0gYXR0ck5hbWUuc3Vic3RyaW5nKDAsIGFycmF5VG9rZW5TdGFydCk7Ci0gICAgICAgICAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJhcnJheWVsZSIsIGFycmF5RWxlLCBwcm9wZXJ0eSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJpc2FycmF5IiwgInllcyIsIHByb3BlcnR5KTsKLSAgICAgICAgICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAiYXJyYXlCYXNlVHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBDQ2xhc3NOYW1lRm9yRWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5KTsKLQotICAgICAgICAgICAgICAgIGxvbmcgbWF4T2NjdXJzID0gbWV0YWluZi5nZXRNYXhPY2N1cnMobmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKG1heE9jY3VycyA9PSBMb25nLk1BWF9WQUxVRSkgewotICAgICAgICAgICAgICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAidW5ib3VuZCIsICJ5ZXMiLCBwcm9wZXJ0eSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJtYXhPY2N1cnMiLCBtYXhPY2N1cnMgKyAiIiwgcHJvcGVydHkpOwotCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICgocGFyZW50TWV0YUluZiAhPSBudWxsKSAmJiBtZXRhaW5mLmlzUmVzdHJpY3Rpb24oKSAmJiBtaXNzaW5nUU5hbWVzLmNvbnRhaW5zKG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgLy8gdGhpcyBlbGVtZW50IGRldGFpbHMgc2hvdWxkIGJlIHRoZXJlIHdpdGggdGhlIHBhcmVudCBtZXRhIEluZgotICAgICAgICAgICAgICAgIGFkZEF0dHJpYnV0ZXNUb1Byb3BlcnR5KAotICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50TWV0YUluZiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBtb2RlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5LAotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZU1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwVHlwZU1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgIENDbGFzc05hbWVGb3JFbGVtZW50KTsKLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBhZGRBdHRyaWJ1dGVzVG9Qcm9wZXJ0eSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFpbmYsCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICBncm91cFR5cGVNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICBDQ2xhc3NOYW1lRm9yRWxlbWVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkQXR0cmlidXRlc1RvUHJvcGVydHkoQmVhbldyaXRlck1ldGFJbmZvSG9sZGVyIG1ldGFpbmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRTmFtZSBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRG9jdW1lbnQgbW9kZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50IHByb3BlcnR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwIHR5cGVNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXAgZ3JvdXBUeXBlTWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIENDbGFzc05hbWVGb3JFbGVtZW50KSB7Ci0gICAgICAgICAgICAvLyBhZGQgYW4gYXR0cmlidXRlIHRoYXQgc2F5cyB0aGUgdHlwZSBpcyBkZWZhdWx0Ci0gICAgICAgICAgICBpZiAobWV0YWluZi5nZXREZWZhdWx0U3RhdHVzRm9yUU5hbWUobmFtZSkpIHsKLSAgICAgICAgICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAiZGVmYXVsdCIsICJ5ZXMiLCBwcm9wZXJ0eSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICh0eXBlTWFwLmNvbnRhaW5zS2V5KG1ldGFpbmYuZ2V0U2NoZW1hUU5hbWVGb3JRTmFtZShuYW1lKSkgfHwKLSAgICAgICAgICAgICAgICAgICAgZ3JvdXBUeXBlTWFwLmNvbnRhaW5zS2V5KG1ldGFpbmYuZ2V0U2NoZW1hUU5hbWVGb3JRTmFtZShuYW1lKSkgfHwKLSAgICAgICAgICAgICAgICAgICAgKG1ldGFpbmYuZ2V0U2NoZW1hUU5hbWVGb3JRTmFtZShuYW1lKSA9PSBudWxsIHx8Ci0gICAgICAgICAgICAgICAgICAgICFtZXRhaW5mLmdldFNjaGVtYVFOYW1lRm9yUU5hbWUobmFtZSkuZ2V0TmFtZXNwYWNlVVJJKCkuZXF1YWxzKERFRkFVTFRfVFlQRV9OUykpCi0gICAgICAgICAgICAgICAgICAgICAmJiAhQ0NsYXNzTmFtZUZvckVsZW1lbnQuZXF1YWxzKERFRkFVTFRfQ19DTEFTU19OQU1FKQotICAgICAgICAgICAgICAgICAgICAgJiYgIUNDbGFzc05hbWVGb3JFbGVtZW50LmVxdWFscyhERUZBVUxUX0FUVFJJQl9DTEFTU19OQU1FKSkgewotICAgICAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJvdXJzIiwgInllcyIsIHByb3BlcnR5KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1ldGFpbmYuZ2V0QXR0cmlidXRlU3RhdHVzRm9yUU5hbWUobmFtZSkpIHsKLSAgICAgICAgICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAiYXR0cmlidXRlIiwgInllcyIsIHByb3BlcnR5KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1ldGFpbmYuaXNOaWxsYWJsZShuYW1lKSkgewotICAgICAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJuaWxsYWJsZSIsICJ5ZXMiLCBwcm9wZXJ0eSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtZXRhaW5mLmdldE9wdGlvbmFsQXR0cmlidXRlU3RhdHVzRm9yUU5hbWUobmFtZSkpIHsKLSAgICAgICAgICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAib3B0aW9uYWwiLCAieWVzIiwgcHJvcGVydHkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTdHJpbmcgc2hvcnRUeXBlTmFtZTsKLSAgICAgICAgICAgIGlmIChtZXRhaW5mLmdldFNjaGVtYVFOYW1lRm9yUU5hbWUobmFtZSkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIHNlZSB3aGV0aGVyIHRoZSBRTmFtZSBpcyBhIGJhc2V0eXBlCi0gICAgICAgICAgICAgICAgaWYgKGJhc2VUeXBlTWFwLmNvbnRhaW5zS2V5KG1ldGFpbmYuZ2V0U2NoZW1hUU5hbWVGb3JRTmFtZShuYW1lKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgc2hvcnRUeXBlTmFtZSA9IG1ldGFpbmYuZ2V0U2NoZW1hUU5hbWVGb3JRTmFtZShuYW1lKS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBzaG9ydFR5cGVOYW1lID0gZ2V0U2hvcnRUeXBlTmFtZShDQ2xhc3NOYW1lRm9yRWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzaG9ydFR5cGVOYW1lID0gZ2V0U2hvcnRUeXBlTmFtZShDQ2xhc3NOYW1lRm9yRWxlbWVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAic2hvcnR0eXBlbmFtZSIsIHNob3J0VHlwZU5hbWUsIHByb3BlcnR5KTsKLQotCi0gICAgICAgICAgICBpZiAobWV0YWluZi5nZXRBbnlTdGF0dXNGb3JRTmFtZShuYW1lKSkgewotICAgICAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJhbnkiLCAieWVzIiwgcHJvcGVydHkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobWV0YWluZi5nZXRCaW5hcnlTdGF0dXNGb3JRTmFtZShuYW1lKSkgewotICAgICAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJiaW5hcnkiLCAieWVzIiwgcHJvcGVydHkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobWV0YWluZi5pc1NpbXBsZSgpIHx8IG1ldGFpbmYuZ2V0U2ltcGxlU3RhdHVzRm9yUU5hbWUobmFtZSkpIHsKLSAgICAgICAgICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAic2ltcGxlIiwgInllcyIsIHByb3BlcnR5KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gcHV0IHRoZSBtaW4gb2NjdXJzIGNvdW50IGlycmVzcGVjdGl2ZSBvZiB3aGV0aGVyIGl0J3MgYW4gYXJyYXkgb3IKLSAgICAgICAgICAgIC8vIG5vdAotICAgICAgICAgICAgbG9uZyBtaW5PY2N1cnMgPSBtZXRhaW5mLmdldE1pbk9jY3VycyhuYW1lKTsKLSAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJtaW5PY2N1cnMiLCBtaW5PY2N1cnMgKyAiIiwgcHJvcGVydHkpOwotCi0KLSAgICAgICAgICAgIGlmIChtZXRhaW5mLmdldEFycmF5U3RhdHVzRm9yUU5hbWUobmFtZSkpIHsKLQotICAgICAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJhcnJheSIsICJ5ZXMiLCBwcm9wZXJ0eSk7Ci0KLSAgICAgICAgICAgICAgICBpbnQgZW5kSW5kZXggPSBDQ2xhc3NOYW1lRm9yRWxlbWVudC5pbmRleE9mKCJbIik7Ci0gICAgICAgICAgICAgICAgaWYgKGVuZEluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgImFycmF5QmFzZVR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENDbGFzc05hbWVGb3JFbGVtZW50LnN1YnN0cmluZygwLCBlbmRJbmRleCksIHByb3BlcnR5KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAiYXJyYXlCYXNlVHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0NsYXNzTmFtZUZvckVsZW1lbnQsIHByb3BlcnR5KTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBsb25nIG1heE9jY3VycyA9IG1ldGFpbmYuZ2V0TWF4T2NjdXJzKG5hbWUpOwotICAgICAgICAgICAgICAgIGlmIChtYXhPY2N1cnMgPT0gTG9uZy5NQVhfVkFMVUUpIHsKLSAgICAgICAgICAgICAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgInVuYm91bmQiLCAieWVzIiwgcHJvcGVydHkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJtYXhPY2N1cnMiLCBtYXhPY2N1cnMgKyAiIiwgcHJvcGVydHkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtZXRhaW5mLmlzUmVzdHJpY3Rpb25CYXNlVHlwZShuYW1lKSkgewotICAgICAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJyZXN0cmljdGlvbkJhc2VUeXBlIiwgInllcyIsIHByb3BlcnR5KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1ldGFpbmYuaXNFeHRlbnNpb25CYXNlVHlwZShuYW1lKSkgewotICAgICAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJleHRlbnNpb25CYXNlVHlwZSIsICJ5ZXMiLCBwcm9wZXJ0eSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtZXRhaW5mLmlzUmVzdHJpY3Rpb25CYXNlVHlwZShuYW1lKSAmJiBtZXRhaW5mLmdldExlbmd0aEZhY2V0KCkgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAibGVuRmFjZXQiLCBtZXRhaW5mLmdldExlbmd0aEZhY2V0KCkgKyAiIiwgcHJvcGVydHkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobWV0YWluZi5pc1Jlc3RyaWN0aW9uQmFzZVR5cGUobmFtZSkgJiYgbWV0YWluZi5nZXRNYXhMZW5ndGhGYWNldCgpICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgIm1heExlbkZhY2V0IiwgbWV0YWluZi5nZXRNYXhMZW5ndGhGYWNldCgpICsgIiIsIHByb3BlcnR5KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1ldGFpbmYuaXNSZXN0cmljdGlvbkJhc2VUeXBlKG5hbWUpICYmIG1ldGFpbmYuZ2V0TWluTGVuZ3RoRmFjZXQoKSAhPSAtMSkgewotICAgICAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJtaW5MZW5GYWNldCIsIG1ldGFpbmYuZ2V0TWluTGVuZ3RoRmFjZXQoKSArICIiLCBwcm9wZXJ0eSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtZXRhaW5mLmlzUmVzdHJpY3Rpb25CYXNlVHlwZShuYW1lKSAmJiBtZXRhaW5mLmdldE1heEV4Y2x1c2l2ZUZhY2V0KCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJtYXhFeEZhY2V0IiwgbWV0YWluZi5nZXRNYXhFeGNsdXNpdmVGYWNldCgpICsgIiIsIHByb3BlcnR5KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1ldGFpbmYuaXNSZXN0cmljdGlvbkJhc2VUeXBlKG5hbWUpICYmIG1ldGFpbmYuZ2V0TWluRXhjbHVzaXZlRmFjZXQoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgIm1pbkV4RmFjZXQiLCBtZXRhaW5mLmdldE1pbkV4Y2x1c2l2ZUZhY2V0KCkgKyAiIiwgcHJvcGVydHkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobWV0YWluZi5pc1Jlc3RyaWN0aW9uQmFzZVR5cGUobmFtZSkgJiYgbWV0YWluZi5nZXRNYXhJbmNsdXNpdmVGYWNldCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAibWF4SW5GYWNldCIsIG1ldGFpbmYuZ2V0TWF4SW5jbHVzaXZlRmFjZXQoKSArICIiLCBwcm9wZXJ0eSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtZXRhaW5mLmlzUmVzdHJpY3Rpb25CYXNlVHlwZShuYW1lKSAmJiBtZXRhaW5mLmdldE1pbkluY2x1c2l2ZUZhY2V0KCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJtaW5JbkZhY2V0IiwgbWV0YWluZi5nZXRNaW5JbmNsdXNpdmVGYWNldCgpICsgIiIsIHByb3BlcnR5KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFtZXRhaW5mLmdldEVudW1GYWNldCgpLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIGJvb2xlYW4gdmFsaWRKYXZhID0gdHJ1ZTsgICAgLy8gQXNzdW1lIGFsbCBlbnVtIHZhbHVlcyBhcmUgdmFsaWQgaWRzCi0KLSAgICAgICAgICAgICAgICBJdGVyYXRvciBpdGVyYXRvciA9IG1ldGFpbmYuZ2V0RW51bUZhY2V0KCkuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICAvLyBXYWxrIHRoZSB2YWx1ZXMgbG9va2luZyBmb3IgaW52YWxpZCBpZHMKLSAgICAgICAgICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IChTdHJpbmcpIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFKYXZhVXRpbHMuaXNKYXZhSWQodmFsdWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZEphdmEgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGludCBpZCA9IDA7Ci0gICAgICAgICAgICAgICAgaXRlcmF0b3IgPSBtZXRhaW5mLmdldEVudW1GYWNldCgpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICBFbGVtZW50IGVudW1GYWNldCA9IFhTTFRVdGlscy5hZGRDaGlsZEVsZW1lbnQobW9kZWwsICJlbnVtRmFjZXQiLCBwcm9wZXJ0eSk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBhdHRyaWJWYWx1ZSA9IChTdHJpbmcpIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgInZhbHVlIiwgYXR0cmliVmFsdWUsIGVudW1GYWNldCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2YWxpZEphdmEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJpZCIsIGF0dHJpYlZhbHVlLnRvVXBwZXJDYXNlKCksIGVudW1GYWNldCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZCsrOwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVwbGFjZSBhbGwgaW52YWxpZCBjaGFyYWN0ZXJzIGFuZCBhcHBlbmQgYW4gaWQgdG8gYXZvaWQgY29sbGlzaW9ucwotICAgICAgICAgICAgICAgICAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgImlkIiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYlZhbHVlLnRvVXBwZXJDYXNlKCkucmVwbGFjZUFsbCgiW15BLVowLTldIiwgIl8iKSArICJfIiArIGlkLCBlbnVtRmFjZXQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobWV0YWluZi5pc1Jlc3RyaWN0aW9uQmFzZVR5cGUobmFtZSkgJiYgbWV0YWluZi5nZXRQYXR0ZXJuRmFjZXQoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgInBhdHRlcm5GYWNldCIsIG1ldGFpbmYuZ2V0UGF0dGVybkZhY2V0KCksIHByb3BlcnR5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0KLQotICAgIHByaXZhdGUgdm9pZCBhZGRNaXNzaW5nUU5hbWVzKEJlYW5Xcml0ZXJNZXRhSW5mb0hvbGRlciBtZXRhaW5mLCBBcnJheUxpc3QgcU5hbWUsIEFycmF5TGlzdCBtaXNzaW5nUU5hbWVzKSB7Ci0KLSAgICAgICAgUU5hbWVbXSBxTmFtZXMgPSBudWxsOwotICAgICAgICBRTmFtZVtdIHBRTmFtZXMgPSBudWxsOwotCi0gICAgICAgIEJlYW5Xcml0ZXJNZXRhSW5mb0hvbGRlciBwYXJlbnRNZXRhSW5mID0gbWV0YWluZi5nZXRQYXJlbnQoKTsKLQotICAgICAgICBpZiAobWV0YWluZi5pc09yZGVyZWQoKSkgewotICAgICAgICAgICAgcU5hbWVzID0gbWV0YWluZi5nZXRPcmRlcmVkUU5hbWVBcnJheSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcU5hbWVzID0gbWV0YWluZi5nZXRRTmFtZUFycmF5KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocGFyZW50TWV0YUluZiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAocGFyZW50TWV0YUluZi5pc09yZGVyZWQoKSkgewotICAgICAgICAgICAgICAgIHBRTmFtZXMgPSBwYXJlbnRNZXRhSW5mLmdldE9yZGVyZWRRTmFtZUFycmF5KCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHBRTmFtZXMgPSBwYXJlbnRNZXRhSW5mLmdldFFOYW1lQXJyYXkoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IHBRTmFtZXMgIT0gbnVsbCAmJiBpIDwgcFFOYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKHFOYW1lTm90Rm91bmQocFFOYW1lc1tpXSwgbWV0YWluZikpIHsKLSAgICAgICAgICAgICAgICBtaXNzaW5nUU5hbWVzLmFkZChwUU5hbWVzW2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvL2FkZGluZyBtaXNzaW5nIFFOYW1lcyB0byB0aGUgZW5kIG9mIGxpc3QuCi0gICAgICAgIGlmICghbWlzc2luZ1FOYW1lcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWlzc2luZ1FOYW1lcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIHFOYW1lLmFkZChtaXNzaW5nUU5hbWVzLmdldChpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBxTmFtZU5vdEZvdW5kKFFOYW1lIHFuYW1lLCBCZWFuV3JpdGVyTWV0YUluZm9Ib2xkZXIgbWV0YWluZikgewotCi0gICAgICAgIGJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLSAgICAgICAgUU5hbWVbXSBxTmFtZXM7Ci0KLSAgICAgICAgaWYgKG1ldGFpbmYuaXNPcmRlcmVkKCkpIHsKLSAgICAgICAgICAgIHFOYW1lcyA9IG1ldGFpbmYuZ2V0T3JkZXJlZFFOYW1lQXJyYXkoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHFOYW1lcyA9IG1ldGFpbmYuZ2V0UU5hbWVBcnJheSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBxTmFtZXMubGVuZ3RoOyBqKyspIHsKLSAgICAgICAgICAgIGlmIChxbmFtZS5nZXRMb2NhbFBhcnQoKS5lcXVhbHMocU5hbWVzW2pdLmdldExvY2FsUGFydCgpKSkgewotICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gIWZvdW5kOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3Qgd2hldGhlciB0aGUgZ2l2ZW4gY2xhc3MgbmFtZSBtYXRjaGVzIHRoZSBkZWZhdWx0Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gQ0NsYXNzTmFtZUZvckVsZW1lbnQKLSAgICAgKiBAcmV0dXJuIGJvb2wKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNEZWZhdWx0KFN0cmluZyBDQ2xhc3NOYW1lRm9yRWxlbWVudCkgewotICAgICAgICByZXR1cm4gZ2V0RGVmYXVsdENsYXNzTmFtZSgpLmVxdWFscyhDQ2xhc3NOYW1lRm9yRWxlbWVudCkgfHwKLSAgICAgICAgICAgICAgICBnZXREZWZhdWx0Q2xhc3NBcnJheU5hbWUoKS5lcXVhbHMoQ0NsYXNzTmFtZUZvckVsZW1lbnQpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogR2l2ZW4gdGhlIHhtbCBuYW1lLCBtYWtlIGEgdW5pcXVlIGNsYXNzIG5hbWUgdGFraW5nIGludG8gYWNjb3VudCB0aGF0IHNvbWUKLSAgICAgKiBmaWxlIHN5c3RlbXMgYXJlIGNhc2Ugc2Vuc2l0aXZlIGFuZCBzb21lIGFyZSBub3QuCi0gICAgICogLUNvbnNpZGVyIHRoZSBKYXgtV1Mgc3BlYyBmb3IgdGhpcwotICAgICAqCi0gICAgICogQHBhcmFtIGxpc3RPZk5hbWVzCi0gICAgICogQHBhcmFtIHhtbE5hbWUKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgU3RyaW5nLgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIG1ha2VVbmlxdWVDU3RydWN0TmFtZShMaXN0IGxpc3RPZk5hbWVzLCBTdHJpbmcgeG1sTmFtZSkgewotICAgICAgICBTdHJpbmcgY05hbWU7Ci0gICAgICAgIGlmIChDVXRpbHMuaXNDS2V5d29yZCh4bWxOYW1lKSkgewotICAgICAgICAgICAgY05hbWUgPSBDVXRpbHMubWFrZU5vbkNLZXl3b3JkKHhtbE5hbWUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy9qYXZhTmFtZSA9IEphdmFVdGlscy5jYXBpdGFsaXplRmlyc3RDaGFyKEphdmFVdGlscy54bWxOYW1lVG9KYXZhKHhtbE5hbWUpKTsKLSAgICAgICAgICAgIGNOYW1lID0geG1sTmFtZTsKLSAgICAgICAgfQotCi0gICAgICAgIGNOYW1lID0gY05hbWUucmVwbGFjZSgnLicsJ18nKTsKLSAgICAgICAgY05hbWUgPSBjTmFtZS5yZXBsYWNlKCctJywnXycpOwotCi0gICAgICAgIHdoaWxlIChsaXN0T2ZOYW1lcy5jb250YWlucyhjTmFtZS50b0xvd2VyQ2FzZSgpKSkgewotICAgICAgICAgICAgaWYgKCFsaXN0T2ZOYW1lcy5jb250YWlucygoY05hbWUgKyAiRSIpLnRvTG93ZXJDYXNlKCkpKXsKLSAgICAgICAgICAgICAgICBjTmFtZSA9IGNOYW1lICsgIkUiOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBjTmFtZSA9IGNOYW1lICsgY291bnQrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNOYW1lID0gY05hbWUgKyBDU3RydWN0V3JpdGVyLmNvdW50Kys7Ci0gICAgICAgIH0KLQotICAgICAgICBsaXN0T2ZOYW1lcy5hZGQoY05hbWUudG9Mb3dlckNhc2UoKSk7Ci0KLSAgICAgICAgU3RyaW5nIG1vZGlmaWVkQ05hbWUgPSBBREJfQ0xBU1NfUFJFRklYICArIGNOYW1lICsgQURCX0NMQVNTX1BPU1RGSVg7Ci0gICAgICAgIHJldHVybiBtb2RpZmllZENOYW1lOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQSBiaXQgb2YgY29kZSBmcm9tIHRoZSBvbGQgY29kZSBnZW5lcmF0b3IuIFdlIGFyZSBiZXR0ZXIgb2ZmIHVzaW5nIHRoZSB0ZW1wbGF0ZQotICAgICAqIGVuZ2luZXMgYW5kIHN1Y2ggc3R1ZmYgdGhhdCdzIGFscmVhZHkgdGhlcmUuIEJ1dCB0aGUgY2xhc3Mgd3JpdGVycyBhcmUgaGFyZCB0byBiZQotICAgICAqIHJldXNlZCBzbyBzb21lIGNvZGUgbmVlZHMgdG8gYmUgcmVwZWF0ZWQgKGF0bGVhc3QgYSBiaXQpCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGxvYWRUZW1wbGF0ZSgpIHRocm93cyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgLy9maXJzdCBnZXQgdGhlIGxhbmd1YWdlIHNwZWNpZmljIHByb3BlcnR5IG1hcAotICAgICAgICBDbGFzcyBjbGF6eiA9IHRoaXMuZ2V0Q2xhc3MoKTsKLSAgICAgICAgSW5wdXRTdHJlYW0geHNsU3RyZWFtOwotICAgICAgICBTdHJpbmcgdGVtcGxhdGVOYW1lID0gamF2YUJlYW5UZW1wbGF0ZU5hbWU7Ci0gICAgICAgIGlmICh0ZW1wbGF0ZU5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgc291cmNlVGVtcGxhdGVOYW1lID0gdGVtcGxhdGVOYW1lICsgIlNvdXJjZS54c2wiOwotICAgICAgICAgICAgICAgIHhzbFN0cmVhbSA9IGNsYXp6LmdldFJlc291cmNlQXNTdHJlYW0oc291cmNlVGVtcGxhdGVOYW1lKTsKLSAgICAgICAgICAgICAgICBzb3VyY2VUZW1wbGF0ZUNhY2hlID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3VGVtcGxhdGVzKG5ldyBTdHJlYW1Tb3VyY2UoeHNsU3RyZWFtKSk7Ci0KLSAgICAgICAgICAgICAgICBTdHJpbmcgaGVhZGVyVGVtcGxhdGVOYW1lID0gdGVtcGxhdGVOYW1lICsgIkhlYWRlci54c2wiOwotICAgICAgICAgICAgICAgIHhzbFN0cmVhbSA9IGNsYXp6LmdldFJlc291cmNlQXNTdHJlYW0oaGVhZGVyVGVtcGxhdGVOYW1lKTsKLSAgICAgICAgICAgICAgICBoZWFkZXJUZW1wbGF0ZUNhY2hlID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3VGVtcGxhdGVzKG5ldyBTdHJlYW1Tb3VyY2UoeHNsU3RyZWFtKSk7Ci0KLSAgICAgICAgICAgICAgICB0ZW1wbGF0ZUxvYWRlZCA9IHRydWU7Ci0gICAgICAgICAgICB9IGNhdGNoIChUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbihTY2hlbWFDb21waWxlck1lc3NhZ2VzLmdldE1lc3NhZ2UoInNjaGVtYS50ZW1wbGF0ZUxvYWRFeGNlcHRpb24iKSwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24oU2NoZW1hQ29tcGlsZXJNZXNzYWdlcy5nZXRNZXNzYWdlKCJzY2hlbWEudGVtcGxhdGVOb3RGb3VuZEV4Y2VwdGlvbiIpKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgb3V0cHV0IGZpbGUKLSAgICAgKgotICAgICAqIEBwYXJhbSBmaWxlTmFtZQotICAgICAqIEBwYXJhbSBleHRlbnNpb24KLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCBGaWxlIGNyZWF0ZU91dEZpbGUoU3RyaW5nIGZpbGVOYW1lLCBTdHJpbmcgZXh0ZW5zaW9uKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIudXRpbC5GaWxlV3JpdGVyLmNyZWF0ZUNsYXNzRmlsZSh0aGlzLnJvb3REaXIsCi0gICAgICAgICAgICAgICAgIiIsCi0gICAgICAgICAgICAgICAgQVhJUzJfUFJFRklYICsgZmlsZU5hbWUsCi0gICAgICAgICAgICAgICAgZXh0ZW5zaW9uKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZXMgdGhlIG91dHB1dCBmaWxlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZG9jCi0gICAgICogQHBhcmFtIG91dHB1dEZpbGUKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBwYXJzZVNvdXJjZShEb2N1bWVudCBkb2MsIEZpbGUgb3V0cHV0RmlsZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE91dHB1dFN0cmVhbSBvdXRTdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbShvdXRwdXRGaWxlKTsKLSAgICAgICAgWFNMVFRlbXBsYXRlUHJvY2Vzc29yLnBhcnNlKG91dFN0cmVhbSwKLSAgICAgICAgICAgICAgICBkb2MsCi0gICAgICAgICAgICAgICAgdGhpcy5zb3VyY2VUZW1wbGF0ZUNhY2hlLm5ld1RyYW5zZm9ybWVyKCkpOwotICAgICAgICBvdXRTdHJlYW0ud3JpdGUoJ1xuJyk7Ci0gICAgICAgIG91dFN0cmVhbS53cml0ZSgnXG4nKTsKLSAgICAgICAgb3V0U3RyZWFtLmZsdXNoKCk7Ci0gICAgICAgIG91dFN0cmVhbS5jbG9zZSgpOwotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogV3JpdGVzIHRoZSBvdXRwdXQgZmlsZQotICAgICAqCi0gICAgICogQHBhcmFtIGRvYwotICAgICAqIEBwYXJhbSBvdXRwdXRGaWxlCi0gICAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcGFyc2VIZWFkZXIoRG9jdW1lbnQgZG9jLCBGaWxlIG91dHB1dEZpbGUpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBPdXRwdXRTdHJlYW0gb3V0U3RyZWFtID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0ob3V0cHV0RmlsZSk7Ci0gICAgICAgIFhTTFRUZW1wbGF0ZVByb2Nlc3Nvci5wYXJzZShvdXRTdHJlYW0sCi0gICAgICAgICAgICAgICAgZG9jLAotICAgICAgICAgICAgICAgIHRoaXMuaGVhZGVyVGVtcGxhdGVDYWNoZS5uZXdUcmFuc2Zvcm1lcigpKTsKLSAgICAgICAgb3V0U3RyZWFtLndyaXRlKCdcbicpOwotICAgICAgICBvdXRTdHJlYW0ud3JpdGUoJ1xuJyk7Ci0gICAgICAgIG91dFN0cmVhbS5mbHVzaCgpOwotICAgICAgICBvdXRTdHJlYW0uY2xvc2UoKTsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBhIHByZWZpeCBmb3IgYSBuYW1lc3BhY2UgVVJJLiAgVGhpcyBtZXRob2Qgd2lsbCBBTFdBWVMKLSAgICAgKiByZXR1cm4gYSB2YWxpZCBwcmVmaXggLSBpZiB0aGUgZ2l2ZW4gVVJJIGlzIGFscmVhZHkgbWFwcGVkIGluIHRoaXMKLSAgICAgKiBzZXJpYWxpemF0aW9uLCB3ZSByZXR1cm4gdGhlIHByZXZpb3VzIHByZWZpeC4gIElmIGl0IGlzIG5vdCBtYXBwZWQsCi0gICAgICogd2Ugd2lsbCBhZGQgYSBuZXcgbWFwcGluZyBhbmQgcmV0dXJuIGEgZ2VuZXJhdGVkIHByZWZpeCBvZiB0aGUgZm9ybQotICAgICAqICJuczxudW0+Ii4KLSAgICAgKgotICAgICAqIEBwYXJhbSB1cmkgaXMgdGhlIG5hbWVzcGFjZSB1cmkKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgcHJlZml4LgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4Rm9yVVJJKFN0cmluZyB1cmkpIHsKLSAgICAgICAgcmV0dXJuIGdldFByZWZpeEZvclVSSSh1cmksIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIExhc3QgdXNlZCBpbmRleCBzdWZmaXggZm9yICJucyIKLSAgICAgKi8KLSAgICBwcml2YXRlIGludCBsYXN0UHJlZml4SW5kZXggPSAxOwotCi0gICAgLyoqCi0gICAgICogTWFwIG9mIG5hbWVzcGFjZXMgVVJJIHRvIHByZWZpeChlcykKLSAgICAgKi8KLSAgICBIYXNoTWFwIG1hcFVSSXRvUHJlZml4ID0gbmV3IEhhc2hNYXAoKTsKLSAgICBIYXNoTWFwIG1hcFByZWZpeHRvVVJJID0gbmV3IEhhc2hNYXAoKTsKLQotICAgIC8qKgotICAgICAqIEdldCBhIHByZWZpeCBmb3IgdGhlIGdpdmVuIG5hbWVzcGFjZSBVUkkuICBJZiBvbmUgaGFzIGFscmVhZHkgYmVlbgotICAgICAqIGRlZmluZWQgaW4gdGhpcyBzZXJpYWxpemF0aW9uLCB1c2UgdGhhdC4gIE90aGVyd2lzZSwgbWFwIHRoZSBwYXNzZWQKLSAgICAgKiBkZWZhdWx0IHByZWZpeCB0byB0aGUgVVJJLCBhbmQgcmV0dXJuIHRoYXQuICBJZiBhIG51bGwgZGVmYXVsdCBwcmVmaXgKLSAgICAgKiBpcyBwYXNzZWQsIHVzZSBvbmUgb2YgdGhlIGZvcm0gIm5zPG51bT4iCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRQcmVmaXhGb3JVUkkoU3RyaW5nIHVyaSwgU3RyaW5nIGRlZmF1bHRQcmVmaXgpIHsKLSAgICAgICAgaWYgKCh1cmkgPT0gbnVsbCkgfHwgKHVyaS5sZW5ndGgoKSA9PSAwKSkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICBTdHJpbmcgcHJlZml4ID0gKFN0cmluZykgbWFwVVJJdG9QcmVmaXguZ2V0KHVyaSk7Ci0gICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGRlZmF1bHRQcmVmaXggPT0gbnVsbCB8fCBkZWZhdWx0UHJlZml4Lmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICBwcmVmaXggPSAibnMiICsgbGFzdFByZWZpeEluZGV4Kys7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKG1hcFByZWZpeHRvVVJJLmdldChwcmVmaXgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gIm5zIiArIGxhc3RQcmVmaXhJbmRleCsrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcHJlZml4ID0gZGVmYXVsdFByZWZpeDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hcFByZWZpeHRvVVJJLnB1dChwcmVmaXgsIHVyaSk7Ci0gICAgICAgICAgICBtYXBVUkl0b1ByZWZpeC5wdXQodXJpLCBwcmVmaXgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwcmVmaXg7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0U2hvcnRUeXBlTmFtZShTdHJpbmcgdHlwZUNsYXNzTmFtZSkgewotICAgICAgICBpZiAodHlwZUNsYXNzTmFtZS5lbmRzV2l0aCgiW10iKSkgewotICAgICAgICAgICAgdHlwZUNsYXNzTmFtZSA9IHR5cGVDbGFzc05hbWUuc3Vic3RyaW5nKDAsIHR5cGVDbGFzc05hbWUubGFzdEluZGV4T2YoIlsiKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHR5cGVDbGFzc05hbWU7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBLZWVwIHVuaW1wbGVtZW50ZWQKLSAgICAgKgotICAgICAqIEBwYXJhbSBtYXBwZXJQYWNrYWdlTmFtZQotICAgICAqIEBzZWUgQmVhbldyaXRlciNyZWdpc3RlckV4dGVuc2lvbk1hcHBlclBhY2thZ2VOYW1lKFN0cmluZykKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZWdpc3RlckV4dGVuc2lvbk1hcHBlclBhY2thZ2VOYW1lKFN0cmluZyBtYXBwZXJQYWNrYWdlTmFtZSkgewotICAgICAgICAvL3VuaW1wbGVtZW50ZWQKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBLZWVwIHVuaW1wbGVtZW50ZWQKLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXRhaW5mQXJyYXkKLSAgICAgKiBAc2VlIEJlYW5Xcml0ZXIjd3JpdGVFeHRlbnNpb25NYXBwZXIob3JnLmFwYWNoZS5heGlzMi5zY2hlbWEuQmVhbldyaXRlck1ldGFJbmZvSG9sZGVyW10pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgd3JpdGVFeHRlbnNpb25NYXBwZXIoQmVhbldyaXRlck1ldGFJbmZvSG9sZGVyW10gbWV0YWluZkFycmF5KSB0aHJvd3MgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24gewotICAgICAgICAvL3VuaW1wbGVtZW50ZWQKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBLZWVwIHVuaW1wbGVtZW50ZWQKLSAgICAgKgotICAgICAqIEBzZWUgQmVhbldyaXRlciNnZXRFeHRlbnNpb25NYXBwZXJQYWNrYWdlTmFtZSgpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRFeHRlbnNpb25NYXBwZXJQYWNrYWdlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3dyaXRlci9KYXZhQmVhbldyaXRlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3dyaXRlci9KYXZhQmVhbldyaXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzA2NjA4Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS93cml0ZXIvSmF2YUJlYW5Xcml0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NjUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS53cml0ZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQXR0cmlidXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLkJlYW5Xcml0ZXJNZXRhSW5mb0hvbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5Db21waWxlck9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEuU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEuU2NoZW1hQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLmkxOG4uU2NoZW1hQ29tcGlsZXJNZXNzYWdlczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS50eXBlbWFwLkphdmFUeXBlTWFwOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLnV0aWwuUHJpbWl0aXZlVHlwZUZpbmRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS51dGlsLlByaW1pdGl2ZVR5cGVXcmFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLnV0aWwuU2NoZW1hUHJvcGVydHlMb2FkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLkphdmFVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuUHJldHR5UHJpbnRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuVVJMUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5YU0xUVGVtcGxhdGVQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLlhTTFRVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFTaW1wbGVUeXBlOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UZW1wbGF0ZXM7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1Tb3VyY2U7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotCi0KLS8qKgotICogSmF2YSBCZWFuIHdyaXRlciBmb3IgdGhlIHNjaGVtYSBjb21waWxlci4KLSAqLwotcHVibGljIGNsYXNzIEphdmFCZWFuV3JpdGVyIGltcGxlbWVudHMgQmVhbldyaXRlciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coSmF2YUJlYW5Xcml0ZXIuY2xhc3MpOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1JBUFBFRF9EQVRBQklORElOR19DTEFTU19OQU1FID0gIldyYXBwZWREYXRhYmluZGVyIjsKLQotICAgIHByaXZhdGUgU3RyaW5nIGphdmFCZWFuVGVtcGxhdGVOYW1lID0gbnVsbDsKLQotICAgIHByaXZhdGUgYm9vbGVhbiB0ZW1wbGF0ZUxvYWRlZCA9IGZhbHNlOwotCi0gICAgcHJpdmF0ZSBUZW1wbGF0ZXMgdGVtcGxhdGVDYWNoZTsKLQotICAgIHByaXZhdGUgTGlzdCBuYW1lTGlzdDsKLQotICAgIHByaXZhdGUgTWFwIHBhY2thZ2VOYW1lVG9DbGFzc05hbWVzTWFwOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IGNvdW50ID0gMDsKLQotICAgIHByaXZhdGUgYm9vbGVhbiB3cmFwQ2xhc3NlcyA9IGZhbHNlOwotCi0gICAgcHJpdmF0ZSBib29sZWFuIHdyaXRlQ2xhc3NlcyA9IGZhbHNlOwotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzVXNlV3JhcHBlckNsYXNzZXMgPSBmYWxzZTsKLQotICAgIHByaXZhdGUgU3RyaW5nIHBhY2thZ2VOYW1lID0gbnVsbDsKLQotICAgIHByaXZhdGUgRmlsZSByb290RGlyOwotCi0gICAgcHJpdmF0ZSBEb2N1bWVudCBnbG9iYWxXcmFwcGVkRG9jdW1lbnQ7Ci0KLSAgICBwcml2YXRlIE1hcCBtb2RlbE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9QQUNLQUdFID0gImFkYiI7Ci0KLSAgICBwcml2YXRlIE1hcCBiYXNlVHlwZU1hcCA9IG5ldyBKYXZhVHlwZU1hcCgpLmdldFR5cGVNYXAoKTsKLQotICAgIHByaXZhdGUgTWFwIG5zMnBhY2thZ2VOYW1lTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0hlbHBlck1vZGUgPSBmYWxzZTsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1N1cHByZXNzUHJlZml4ZXNNb2RlID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiBwYWNrYWdlIGZvciB0aGUgbWFwcGluZyBjbGFzcwotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIG1hcHBpbmdDbGFzc1BhY2thZ2UgPSBudWxsOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX01BUFBFUl9DTEFTU05BTUUgPSAiRXh0ZW5zaW9uTWFwcGVyIjsKLS8vIGEgbGlzdCBvZiBleHRlcm5hbGx5IGlkZW50aWZpZWQgUU5hbWVzIHRvIGJlIHByb2Nlc3NlZC4gVGhpcyBiZWNvbWVzCi0gICAgLy8gdXNlZnVsIHdoZW4gIG9ubHkgYSBsaXN0IG9mIGV4dGVybmFsIGVsZW1lbnRzIG5lZWQgdG8gYmUgcHJvY2Vzc2VkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0NMQVNTX05BTUUgPSBPTUVsZW1lbnQuY2xhc3MuZ2V0TmFtZSgpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfQ0xBU1NfQVJSQVlfTkFNRSA9ICJvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudFtdIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfQVRUUklCX0NMQVNTX05BTUUgPSBPTUF0dHJpYnV0ZS5jbGFzcy5nZXROYW1lKCk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9BVFRSSUJfQVJSQVlfQ0xBU1NfTkFNRSA9ICJvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQXR0cmlidXRlW10iOwotCi0KLSAgICAvKioKLSAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yCi0gICAgICovCi0gICAgcHVibGljIEphdmFCZWFuV3JpdGVyKCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgcmV0dXJucyBhIG1hcCBvZiBRbmFtZXMgdnMgRE9NRG9jdW1lbnQgbW9kZWxzLiBPbmUgY2FuIHVzZSB0aGlzCi0gICAgICogbWV0aG9kIHRvIG9idGFpbiB0aGUgcmF3IERPTW1vZGVscyB1c2VkIHRvIHdyaXRlIHRoZSBjbGFzc2VzLiBUaGlzIGhhcyBubwotICAgICAqIG1lYW5pbmcgd2hlbiB0aGUgY2xhc3NlcyBhcmUgc3VwcG9zZWQgdG8gYmUgd3JhcHBlZCBzbyB0aGUKLSAgICAgKgotICAgICAqIEByZXR1cm4gUmV0dXJucyBNYXAuCi0gICAgICogQHNlZSBCZWFuV3JpdGVyI2dldE1vZGVsTWFwKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgTWFwIGdldE1vZGVsTWFwKCkgewotICAgICAgICByZXR1cm4gbW9kZWxNYXA7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXREZWZhdWx0Q2xhc3NOYW1lKCkgewotICAgICAgICByZXR1cm4gREVGQVVMVF9DTEFTU19OQU1FOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdENsYXNzQXJyYXlOYW1lKCkgewotICAgICAgICByZXR1cm4gREVGQVVMVF9DTEFTU19BUlJBWV9OQU1FOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdEF0dHJpYkNsYXNzTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIERFRkFVTFRfQVRUUklCX0NMQVNTX05BTUU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXREZWZhdWx0QXR0cmliQXJyYXlDbGFzc05hbWUoKSB7Ci0gICAgICAgIHJldHVybiBERUZBVUxUX0FUVFJJQl9BUlJBWV9DTEFTU19OQU1FOwotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgaW5pdChDb21waWxlck9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIFNjaGVtYUNvbXBpbGF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLQotICAgICAgICAgICAgLy8gc2V0IGFsbCBzdGF0ZSB2YXJpYWJsZXMgdG8gZGVmYXVsdCB2YWx1ZXMKLSAgICAgICAgICAgIG1vZGVsTWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgICAgIG5zMnBhY2thZ2VOYW1lTWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgICAgIG1hcHBpbmdDbGFzc1BhY2thZ2UgPSBudWxsOwotCi0gICAgICAgICAgICBpbml0V2l0aEZpbGUob3B0aW9ucy5nZXRPdXRwdXRMb2NhdGlvbigpKTsKLSAgICAgICAgICAgIHBhY2thZ2VOYW1lID0gb3B0aW9ucy5nZXRQYWNrYWdlTmFtZSgpOwotICAgICAgICAgICAgd3JpdGVDbGFzc2VzID0gb3B0aW9ucy5pc1dyaXRlT3V0cHV0KCk7Ci0gICAgICAgICAgICBpc1VzZVdyYXBwZXJDbGFzc2VzID0gb3B0aW9ucy5pc1VzZVdyYXBwZXJDbGFzc2VzKCk7Ci0KLSAgICAgICAgICAgIGlmICghd3JpdGVDbGFzc2VzKSB7Ci0gICAgICAgICAgICAgICAgd3JhcENsYXNzZXMgPSBmYWxzZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgd3JhcENsYXNzZXMgPSBvcHRpb25zLmlzV3JhcENsYXNzZXMoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gaWYgdGhlIHdyYXAgbW9kZSBpcyBzZXQgdGhlbiBjcmVhdGUgYSBnbG9iYWwgZG9jdW1lbnQgdG8ga2VlcCB0aGUKLSAgICAgICAgICAgIC8vIHdyYXBwZWQKLSAgICAgICAgICAgIC8vIGVsZW1lbnQgbW9kZWxzCi0gICAgICAgICAgICBpZiAob3B0aW9ucy5pc1dyYXBDbGFzc2VzKCkpIHsKLSAgICAgICAgICAgICAgICBnbG9iYWxXcmFwcGVkRG9jdW1lbnQgPSBYU0xUVXRpbHMuZ2V0RG9jdW1lbnQoKTsKLSAgICAgICAgICAgICAgICBFbGVtZW50IHJvb3RFbGVtZW50ID0gWFNMVFV0aWxzLmdldEVsZW1lbnQoCi0gICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxXcmFwcGVkRG9jdW1lbnQsICJiZWFucyIpOwotICAgICAgICAgICAgICAgIGdsb2JhbFdyYXBwZWREb2N1bWVudC5hcHBlbmRDaGlsZChyb290RWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShnbG9iYWxXcmFwcGVkRG9jdW1lbnQsICJuYW1lIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIFdSQVBQRURfREFUQUJJTkRJTkdfQ0xBU1NfTkFNRSwgcm9vdEVsZW1lbnQpOwotICAgICAgICAgICAgICAgIFN0cmluZyB0ZW1wUGFja2FnZU5hbWU7Ci0KLSAgICAgICAgICAgICAgICBpZiAocGFja2FnZU5hbWUgIT0gbnVsbCAmJiBwYWNrYWdlTmFtZS5lbmRzV2l0aCgiLiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRlbXBQYWNrYWdlTmFtZSA9IHRoaXMucGFja2FnZU5hbWUuc3Vic3RyaW5nKDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYWNrYWdlTmFtZS5sYXN0SW5kZXhPZigiLiIpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0ZW1wUGFja2FnZU5hbWUgPSBERUZBVUxUX1BBQ0tBR0U7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShnbG9iYWxXcmFwcGVkRG9jdW1lbnQsICJwYWNrYWdlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBQYWNrYWdlTmFtZSwgcm9vdEVsZW1lbnQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBhZGQgdGhlIG5zIG1hcHBpbmdzCi0gICAgICAgICAgICB0aGlzLm5zMnBhY2thZ2VOYW1lTWFwID0gb3B0aW9ucy5nZXROczJQYWNrYWdlTWFwKCk7Ci0gICAgICAgICAgICAvL3NldCBoZWxwZXIgbW9kZQotICAgICAgICAgICAgdGhpcy5pc0hlbHBlck1vZGUgPSBvcHRpb25zLmlzSGVscGVyTW9kZSgpOwotICAgICAgICAgICAgLy8gc2V0IHN1cHByZXNzIHByZWZpeGVzIG1vZGUKLSAgICAgICAgICAgIHRoaXMuaXNTdXBwcmVzc1ByZWZpeGVzTW9kZSA9IG9wdGlvbnMuaXNTdXBwcmVzc1ByZWZpeGVzTW9kZSgpOwotCi0gICAgICAgICAgICAvL3NldCBtYXBwZXIgY2xhc3MgcGFja2FnZSBpZiBwcmVzZW50Ci0gICAgICAgICAgICBpZiAob3B0aW9ucy5pc01hcHBlckNsYXNzUGFja2FnZVByZXNlbnQoKSkgewotICAgICAgICAgICAgICAgIHRoaXMubWFwcGluZ0NsYXNzUGFja2FnZSA9IG9wdGlvbnMuZ2V0TWFwcGVyQ2xhc3NQYWNrYWdlKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVtYUNvbXBpbGF0aW9uRXhjZXB0aW9uKGUpOwotICAgICAgICB9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbihlKTsgLy8gdG9kbyBuZWVkIHRvIHB1dAotICAgICAgICAgICAgLy8gY29ycmVjdCBlcnJvcgotICAgICAgICAgICAgLy8gbWVzc2FnZXMKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBlbGVtZW50Ci0gICAgICogQHBhcmFtIHR5cGVNYXAKLSAgICAgKiBAcGFyYW0gbWV0YWluZgotICAgICAqIEByZXR1cm4gUmV0dXJucyBTdHJpbmcuCi0gICAgICogQHRocm93cyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgd3JpdGUoWG1sU2NoZW1hRWxlbWVudCBlbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgTWFwIHR5cGVNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICBNYXAgZ3JvdXBUeXBlTWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgQmVhbldyaXRlck1ldGFJbmZvSG9sZGVyIG1ldGFpbmYpIHRocm93cyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFFOYW1lIHFOYW1lID0gZWxlbWVudC5nZXRRTmFtZSgpOwotCi0gICAgICAgICAgICByZXR1cm4gcHJvY2VzcyhxTmFtZSwgbWV0YWluZiwgdHlwZU1hcCwgZ3JvdXBUeXBlTWFwLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVtYUNvbXBpbGF0aW9uRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBgCi0gICAgICogQHBhcmFtIHFOYW1lCi0gICAgICogQHBhcmFtIHR5cGVNYXAKLSAgICAgKiBAcGFyYW0gbWV0YWluZgotICAgICAqIEBwYXJhbSBpc0Fic3RyYWN0Ci0gICAgICogQHJldHVybgotICAgICAqIEB0aHJvd3MgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHdyaXRlKFFOYW1lIHFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgTWFwIHR5cGVNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICBNYXAgZ3JvdXBUeXBlTWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgQmVhbldyaXRlck1ldGFJbmZvSG9sZGVyIG1ldGFpbmYsCi0gICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzQWJzdHJhY3QpCi0gICAgICAgICAgICB0aHJvd3MgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24gewotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBkZXRlcm1pbmUgdGhlIHBhY2thZ2UgZm9yIHRoaXMgdHlwZS4KLSAgICAgICAgICAgIHJldHVybiBwcm9jZXNzKHFOYW1lLCBtZXRhaW5mLCB0eXBlTWFwLCBncm91cFR5cGVNYXAsIGZhbHNlLGlzQWJzdHJhY3QpOwotCi0gICAgICAgIH0gY2F0Y2ggKFNjaGVtYUNvbXBpbGF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotCi0KLSAgICAvKioKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqIEBzZWUgQmVhbldyaXRlciN3cml0ZUJhdGNoKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUJhdGNoKCkgdGhyb3dzIFNjaGVtYUNvbXBpbGF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmICh3cmFwQ2xhc3NlcykgewotICAgICAgICAgICAgICAgIFN0cmluZyB0ZW1wUGFja2FnZTsKLSAgICAgICAgICAgICAgICBpZiAocGFja2FnZU5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0ZW1wUGFja2FnZSA9IERFRkFVTFRfUEFDS0FHRTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0ZW1wUGFja2FnZSA9IHBhY2thZ2VOYW1lOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBGaWxlIG91dCA9IGNyZWF0ZU91dEZpbGUodGVtcFBhY2thZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBXUkFQUEVEX0RBVEFCSU5ESU5HX0NMQVNTX05BTUUpOwotICAgICAgICAgICAgICAgIC8vIHBhcnNlIHdpdGggdGhlIHRlbXBsYXRlIGFuZCBjcmVhdGUgdGhlIGZpbGVzCi0KLSAgICAgICAgICAgICAgICBwYXJzZShnbG9iYWxXcmFwcGVkRG9jdW1lbnQsIG91dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gc2ltcGxlVHlwZQotICAgICAqIEBwYXJhbSB0eXBlTWFwCi0gICAgICogQHBhcmFtIG1ldGFpbmYKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgU3RyaW5nLgotICAgICAqIEB0aHJvd3MgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHdyaXRlKFhtbFNjaGVtYVNpbXBsZVR5cGUgc2ltcGxlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE1hcCB0eXBlTWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgTWFwIGdyb3VwVHlwZU1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEJlYW5Xcml0ZXJNZXRhSW5mb0hvbGRlciBtZXRhaW5mKSB0aHJvd3MgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgUU5hbWUgcU5hbWUgPSBzaW1wbGVUeXBlLmdldFFOYW1lKCk7Ci0gICAgICAgICAgICBpZiAocU5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHFOYW1lID0gKFFOYW1lKSBzaW1wbGVUeXBlLmdldE1ldGFJbmZvTWFwKCkuZ2V0KFNjaGVtYUNvbnN0YW50cy5TY2hlbWFDb21waWxlckluZm9Ib2xkZXIuRkFLRV9RTkFNRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtZXRhaW5mLmFkZHRTdGF0dXMocU5hbWUsIFNjaGVtYUNvbnN0YW50cy5TSU1QTEVfVFlQRV9PUl9DT05URU5UKTsKLSAgICAgICAgICAgIHJldHVybiBwcm9jZXNzKHFOYW1lLCBtZXRhaW5mLCB0eXBlTWFwLCBncm91cFR5cGVNYXAsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSByb290RGlyCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqIEBzZWUgQmVhbldyaXRlciNpbml0KGphdmEuaW8uRmlsZSkKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgaW5pdFdpdGhGaWxlKEZpbGUgcm9vdERpcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHJvb3REaXIgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhpcy5yb290RGlyID0gbmV3IEZpbGUoIi4iKTsKLSAgICAgICAgfSBlbHNlIGlmICghcm9vdERpci5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oU2NoZW1hQ29tcGlsZXJNZXNzYWdlcwotICAgICAgICAgICAgICAgICAgICAuZ2V0TWVzc2FnZSgic2NoZW1hLnJvb3Rub3Rmb2xkZXJleGNlcHRpb24iKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aGlzLnJvb3REaXIgPSByb290RGlyOwotICAgICAgICB9Ci0gICAgICAgIHRoaXMubmFtZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIHRoaXMucGFja2FnZU5hbWVUb0NsYXNzTmFtZXNNYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICBqYXZhQmVhblRlbXBsYXRlTmFtZSA9IFNjaGVtYVByb3BlcnR5TG9hZGVyLmdldEJlYW5UZW1wbGF0ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ha2UgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIGZvciBhbiBlbGVtZW50IG9yIG5hbWVkIHR5cGUKLSAgICAgKgotICAgICAqIEBwYXJhbSBxTmFtZSB0aGUgcXVhbGlmaWVkIE5hbWUgZm9yIHRoaXMgZWxlbWVudCBvciB0eXBlIGluIHRoZSBzY2hlbWEKLSAgICAgKiBAcmV0dXJuIHRoZSBhcHByb3ByaWF0ZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSB0byB1c2UgaW4gZ2VuZXJhdGVkCi0gICAgICogICAgICAgICBjb2RlCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBtYWtlRnVsbHlRdWFsaWZpZWRDbGFzc05hbWUoUU5hbWUgcU5hbWUpIHsKLQotICAgICAgICBTdHJpbmcgbmFtZXNwYWNlVVJJID0gcU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgIFN0cmluZyBiYXNlUGFja2FnZU5hbWU7Ci0KLSAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gZ2V0UGFja2FnZShuYW1lc3BhY2VVUkkpOwotCi0gICAgICAgIFN0cmluZyBvcmlnaW5hbE5hbWUgPSBxTmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IG51bGw7Ci0KLSAgICAgICAgLy8gd2hlbiB3cmFwcGluZyBjbGFzc2VzIGFsbCB0aGUgZGF0YSBiaW5kaW5nIGFuZCBleGNlcHRpb24gY2xhc3Mgc2hvdWxkIGhhdmUKLSAgICAgICAgLy8gYSB1bmlxdWUgbmFtZSBzaW5jZSBwYWNrYWdlIG5hbWUgaXMgbm90IGJlaW5nIGFwcGxpZWQuCi0gICAgICAgIC8vIG90aGVyZXdpc2Ugd2UgY2FuIG1ha2UgdW5pcXVlIHdpdGggdGhlIHBhY2thZ2UgbmFtZQotICAgICAgICBpZiAoIXdyYXBDbGFzc2VzKXsKLSAgICAgICAgICAgIGNsYXNzTmFtZSA9IG1ha2VVbmlxdWVKYXZhQ2xhc3NOYW1lKHRoaXMubmFtZUxpc3QsIG9yaWdpbmFsTmFtZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoIXRoaXMucGFja2FnZU5hbWVUb0NsYXNzTmFtZXNNYXAuY29udGFpbnNLZXkocGFja2FnZU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5wYWNrYWdlTmFtZVRvQ2xhc3NOYW1lc01hcC5wdXQocGFja2FnZU5hbWUsIG5ldyBBcnJheUxpc3QoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjbGFzc05hbWUgPSBtYWtlVW5pcXVlSmF2YUNsYXNzTmFtZSgoTGlzdCkgdGhpcy5wYWNrYWdlTmFtZVRvQ2xhc3NOYW1lc01hcC5nZXQocGFja2FnZU5hbWUpLCBvcmlnaW5hbE5hbWUpOwotICAgICAgICB9Ci0KLQotICAgICAgICBTdHJpbmcgcGFja2FnZVByZWZpeCA9IG51bGw7Ci0KLSAgICAgICAgU3RyaW5nIGZ1bGx5cXVhbGlmaWVkQ2xhc3NOYW1lOwotCi0gICAgICAgIGlmICh3cmFwQ2xhc3NlcykKLSAgICAgICAgICAgIHBhY2thZ2VQcmVmaXggPSAodGhpcy5wYWNrYWdlTmFtZSA9PSBudWxsID8gREVGQVVMVF9QQUNLQUdFICsgIi4iCi0gICAgICAgICAgICAgICAgICAgIDogdGhpcy5wYWNrYWdlTmFtZSkKLSAgICAgICAgICAgICAgICAgICAgKyBXUkFQUEVEX0RBVEFCSU5ESU5HX0NMQVNTX05BTUU7Ci0gICAgICAgIGVsc2UgaWYgKHdyaXRlQ2xhc3NlcykKLSAgICAgICAgICAgIHBhY2thZ2VQcmVmaXggPSBwYWNrYWdlTmFtZTsKLSAgICAgICAgaWYgKHBhY2thZ2VQcmVmaXggIT0gbnVsbCkKLSAgICAgICAgICAgIGZ1bGx5cXVhbGlmaWVkQ2xhc3NOYW1lID0gcGFja2FnZVByZWZpeAotICAgICAgICAgICAgICAgICAgICArIChwYWNrYWdlUHJlZml4LmVuZHNXaXRoKCIuIikgPyAiIiA6ICIuIikgKyBjbGFzc05hbWU7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGZ1bGx5cXVhbGlmaWVkQ2xhc3NOYW1lID0gY2xhc3NOYW1lOwotICAgICAgICAvLyByZXR1cm4gdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lCi0gICAgICAgIHJldHVybiBmdWxseXF1YWxpZmllZENsYXNzTmFtZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRQYWNrYWdlKFN0cmluZyBuYW1lc3BhY2VVUkkpIHsKLSAgICAgICAgU3RyaW5nIGJhc2VQYWNrYWdlTmFtZTsKLSAgICAgICAgaWYgKChuczJwYWNrYWdlTmFtZU1hcCAhPSBudWxsKSAmJiBuczJwYWNrYWdlTmFtZU1hcC5jb250YWluc0tleShuYW1lc3BhY2VVUkkpKSB7Ci0gICAgICAgICAgICBiYXNlUGFja2FnZU5hbWUgPSAoU3RyaW5nKSBuczJwYWNrYWdlTmFtZU1hcC5nZXQobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGJhc2VQYWNrYWdlTmFtZSA9IFVSTFByb2Nlc3Nvci5tYWtlUGFja2FnZU5hbWUobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0aGlzLnBhY2thZ2VOYW1lID09IG51bGwgPyBiYXNlUGFja2FnZU5hbWUKLSAgICAgICAgICAgICAgICA6IHRoaXMucGFja2FnZU5hbWUgKyBiYXNlUGFja2FnZU5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQSB1dGlsIG1ldGhvZCB0aGF0IGhvbGRzIGNvbW1vbiBjb2RlIGZvciB0aGUgY29tcGxldGUgc2NoZW1hIHRoYXQgdGhlCi0gICAgICogZ2VuZXJhdGVkIFhNTCBjb21wbGllcyB0byBsb29rIHVuZGVyIG90aGVyL2JlYW5HZW5lcmF0aW9uU2NoZW1hLnhzZAotICAgICAqCi0gICAgICogQHBhcmFtIHFOYW1lCi0gICAgICogQHBhcmFtIG1ldGFpbmYKLSAgICAgKiBAcGFyYW0gdHlwZU1hcAotICAgICAqIEBwYXJhbSBpc0VsZW1lbnQKLSAgICAgKiBAcGFyYW0gZnVsbHlRdWFsaWZpZWRDbGFzc05hbWUgdGhlIG5hbWUgcmV0dXJuZWQgYnkgbWFrZUZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lKCkgb3IgbnVsbCBpZgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdCB3YXNuJ3QgY2FsbGVkCi0gICAgICogQHJldHVybiBSZXR1cm5zIFN0cmluZy4KLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIHByb2Nlc3MoUU5hbWUgcU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBCZWFuV3JpdGVyTWV0YUluZm9Ib2xkZXIgbWV0YWluZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcCB0eXBlTWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwIGdyb3VwVHlwZU1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNFbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0Fic3RyYWN0KQotICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBmdWxseVF1YWxpZmllZENsYXNzTmFtZSA9IG1ldGFpbmYuZ2V0T3duQ2xhc3NOYW1lKCk7Ci0gICAgICAgIGlmIChmdWxseVF1YWxpZmllZENsYXNzTmFtZSA9PSBudWxsKQotICAgICAgICAgICAgZnVsbHlRdWFsaWZpZWRDbGFzc05hbWUgPSBtYWtlRnVsbHlRdWFsaWZpZWRDbGFzc05hbWUocU5hbWUpOwotICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gZnVsbHlRdWFsaWZpZWRDbGFzc05hbWUKLSAgICAgICAgICAgICAgICAuc3Vic3RyaW5nKDEgKyBmdWxseVF1YWxpZmllZENsYXNzTmFtZS5sYXN0SW5kZXhPZignLicpKTsKLSAgICAgICAgU3RyaW5nIGJhc2VQYWNrYWdlTmFtZTsKLSAgICAgICAgaWYgKGZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lLmxhc3RJbmRleE9mKCcuJykgPT0gLTEpIHsvLyBubyAnZG90cycgc28KLSAgICAgICAgICAgIC8vIHRoZSBwYWNrYWdlCi0gICAgICAgICAgICAvLyBpcyBub3QgdGhlcmUKLSAgICAgICAgICAgIGJhc2VQYWNrYWdlTmFtZSA9ICIiOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYmFzZVBhY2thZ2VOYW1lID0gZnVsbHlRdWFsaWZpZWRDbGFzc05hbWUuc3Vic3RyaW5nKDAsCi0gICAgICAgICAgICAgICAgICAgIGZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lLmxhc3RJbmRleE9mKCcuJykpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIG9yaWdpbmFsTmFtZSA9IHFOYW1lID09IG51bGwgPyAiIiA6IHFOYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICBBcnJheUxpc3QgcHJvcGVydHlOYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgICAgICBpZiAoIXRlbXBsYXRlTG9hZGVkKSB7Ci0gICAgICAgICAgICBsb2FkVGVtcGxhdGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGlmIHdyYXBwZWQgdGhlbiBkbyBub3Qgd3JpdGUgdGhlIGNsYXNzZXMgbm93IGJ1dCBhZGQgdGhlIG1vZGVscyB0byBhCi0gICAgICAgIC8vIGdsb2JhbCBkb2N1bWVudC4gSG93ZXZlciBpbiBvcmRlciB0byB3cml0ZSB0aGUKLSAgICAgICAgLy8gZ2xvYmFsIGNsYXNzIHRoYXQgaXMgZ2VuZXJhdGVkLCBvbmUgbmVlZHMgdG8gY2FsbCB0aGUgd3JpdGVCYXRjaCgpCi0gICAgICAgIC8vIG1ldGhvZAotICAgICAgICBpZiAod3JhcENsYXNzZXMpIHsKLSAgICAgICAgICAgIGdsb2JhbFdyYXBwZWREb2N1bWVudC5nZXREb2N1bWVudEVsZW1lbnQoKS5hcHBlbmRDaGlsZCgKLSAgICAgICAgICAgICAgICAgICAgZ2V0QmVhbkVsZW1lbnQoZ2xvYmFsV3JhcHBlZERvY3VtZW50LCBjbGFzc05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxOYW1lLCBiYXNlUGFja2FnZU5hbWUsIHFOYW1lLCBpc0VsZW1lbnQsaXNBYnN0cmFjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhaW5mLCBwcm9wZXJ0eU5hbWVzLCB0eXBlTWFwLCBncm91cFR5cGVNYXApKTsKLQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gY3JlYXRlIHRoZSBtb2RlbAotICAgICAgICAgICAgRG9jdW1lbnQgbW9kZWwgPSBYU0xUVXRpbHMuZ2V0RG9jdW1lbnQoKTsKLSAgICAgICAgICAgIC8vIG1ha2UgdGhlIFhNTAotICAgICAgICAgICAgbW9kZWwuYXBwZW5kQ2hpbGQoZ2V0QmVhbkVsZW1lbnQobW9kZWwsIGNsYXNzTmFtZSwgb3JpZ2luYWxOYW1lLAotICAgICAgICAgICAgICAgICAgICBiYXNlUGFja2FnZU5hbWUsIHFOYW1lLCBpc0VsZW1lbnQsaXNBYnN0cmFjdCwgbWV0YWluZiwgcHJvcGVydHlOYW1lcywKLSAgICAgICAgICAgICAgICAgICAgdHlwZU1hcCwgZ3JvdXBUeXBlTWFwKSk7Ci0KLSAgICAgICAgICAgIGlmICh3cml0ZUNsYXNzZXMpIHsKLSAgICAgICAgICAgICAgICAvLyBjcmVhdGUgdGhlIGZpbGUKLSAgICAgICAgICAgICAgICBGaWxlIG91dCA9IGNyZWF0ZU91dEZpbGUoYmFzZVBhY2thZ2VOYW1lLCBjbGFzc05hbWUpOwotICAgICAgICAgICAgICAgIC8vIHBhcnNlIHdpdGggdGhlIHRlbXBsYXRlIGFuZCBjcmVhdGUgdGhlIGZpbGVzCi0KLSAgICAgICAgICAgICAgICBpZiAoaXNIZWxwZXJNb2RlKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgImhlbHBlck1vZGUiLCAieWVzIiwgbW9kZWwuZ2V0RG9jdW1lbnRFbGVtZW50KCkpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIEdlbmVyYXRlIGJlYW4gY2xhc3NlcwotICAgICAgICAgICAgICAgICAgICBwYXJzZShtb2RlbCwgb3V0KTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBHZW5lcmF0aW5nIHRoZSBoZWxwZXIgY2xhc3NlcwotICAgICAgICAgICAgICAgICAgICBvdXQgPSBjcmVhdGVPdXRGaWxlKGJhc2VQYWNrYWdlTmFtZSwgY2xhc3NOYW1lICsgIkhlbHBlciIpOwotICAgICAgICAgICAgICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAiaGVscGVyIiwgInllcyIsIG1vZGVsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldERvY3VtZW50RWxlbWVudCgpKTsKLSAgICAgICAgICAgICAgICAgICAgcGFyc2UobW9kZWwsIG91dCk7Ci0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvL05vIGhlbHBlciBtb2RlIC0ganVzdCBnZW5lcmF0ZSB0aGUgY2xhc3NlcwotICAgICAgICAgICAgICAgICAgICBwYXJzZShtb2RlbCwgb3V0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGFkZCB0aGUgbW9kZWwgdG8gdGhlIG1vZGVsIG1hcAotICAgICAgICAgICAgbW9kZWxNYXAucHV0KG5ldyBRTmFtZShxTmFtZS5nZXROYW1lc3BhY2VVUkkoKSwgY2xhc3NOYW1lKSwgbW9kZWwpOwotCi0gICAgICAgIH0KLQotICAgICAgICAvLyByZXR1cm4gdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lCi0gICAgICAgIHJldHVybiBmdWxseVF1YWxpZmllZENsYXNzTmFtZTsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBtb2RlbAotICAgICAqIEBwYXJhbSBjbGFzc05hbWUKLSAgICAgKiBAcGFyYW0gb3JpZ2luYWxOYW1lCi0gICAgICogQHBhcmFtIHBhY2thZ2VOYW1lCi0gICAgICogQHBhcmFtIHFOYW1lCi0gICAgICogQHBhcmFtIGlzRWxlbWVudAotICAgICAqIEBwYXJhbSBtZXRhaW5mCi0gICAgICogQHBhcmFtIHByb3BlcnR5TmFtZXMKLSAgICAgKiBAcGFyYW0gdHlwZU1hcAotICAgICAqIEByZXR1cm4gUmV0dXJucyBFbGVtZW50LgotICAgICAqIEB0aHJvd3MgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIEVsZW1lbnQgZ2V0QmVhbkVsZW1lbnQoRG9jdW1lbnQgbW9kZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBvcmlnaW5hbE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUU5hbWUgcU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNFbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzQWJzdHJhY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJlYW5Xcml0ZXJNZXRhSW5mb0hvbGRlciBtZXRhaW5mLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheUxpc3QgcHJvcGVydHlOYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwIHR5cGVNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcCBncm91cFR5cGVNYXApCi0gICAgICAgICAgICB0aHJvd3MgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24gewotCi0gICAgICAgIEVsZW1lbnQgcm9vdEVsdCA9IFhTTFRVdGlscy5nZXRFbGVtZW50KG1vZGVsLCAiYmVhbiIpOwotICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAibmFtZSIsIGNsYXNzTmFtZSwgcm9vdEVsdCk7Ci0gICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJvcmlnaW5hbE5hbWUiLCBvcmlnaW5hbE5hbWUsIHJvb3RFbHQpOwotICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAicGFja2FnZSIsIHBhY2thZ2VOYW1lLCByb290RWx0KTsKLSAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgIm5zdXJpIiwgcU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCksIHJvb3RFbHQpOwotICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJuc3ByZWZpeCIsIGlzU3VwcHJlc3NQcmVmaXhlc01vZGUgPyAiIiA6IGdldFByZWZpeEZvclVSSShxTmFtZQotICAgICAgICAgICAgICAgIC5nZXROYW1lc3BhY2VVUkkoKSwgcU5hbWUuZ2V0UHJlZml4KCkpLCByb290RWx0KTsKLQotICAgICAgICBpZiAoIXdyYXBDbGFzc2VzKSB7Ci0gICAgICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAidW53cmFwcGVkIiwgInllcyIsIHJvb3RFbHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGlzQWJzdHJhY3QpewotICAgICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAiaXNBYnN0cmFjdCIsICJ5ZXMiLCByb290RWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghd3JpdGVDbGFzc2VzKSB7Ci0gICAgICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAic2tpcC13cml0ZSIsICJ5ZXMiLCByb290RWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghaXNFbGVtZW50KSB7Ci0gICAgICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAidHlwZSIsICJ5ZXMiLCByb290RWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtZXRhaW5mLmlzQW5vbnltb3VzKCkpIHsKLSAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJhbm9uIiwgInllcyIsIHJvb3RFbHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGlzVXNlV3JhcHBlckNsYXNzZXMpewotICAgICAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgInVzZXdyYXBwZXJjbGFzc2VzIiwgInllcyIsIHJvb3RFbHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1ldGFpbmYuaXNFeHRlbnNpb24oKSkgewotICAgICAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgImV4dGVuc2lvbiIsIG1ldGFpbmYKLSAgICAgICAgICAgICAgICAgICAgLmdldEV4dGVuc2lvbkNsYXNzTmFtZSgpLCByb290RWx0KTsKLQotICAgICAgICB9Ci0gICAgICAgIGlmIChtZXRhaW5mLmlzUmVzdHJpY3Rpb24oKSkgewotICAgICAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgInJlc3RyaWN0aW9uIiwgbWV0YWluZgotICAgICAgICAgICAgICAgICAgICAuZ2V0UmVzdHJpY3Rpb25DbGFzc05hbWUoKSwgcm9vdEVsdCk7Ci0KLSAgICAgICAgfQotICAgICAgICAvL2FkZCB0aGUgbWFwcGVyIGNsYXNzIG5hbWUKLSAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgIm1hcHBlckNsYXNzIiwgZ2V0RnVsbHlRdWFsaWZpZWRNYXBwZXJDbGFzc05hbWUoKSwgcm9vdEVsdCk7Ci0KLSAgICAgICAgaWYgKG1ldGFpbmYuaXNDaG9pY2UoKSkgewotICAgICAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgImNob2ljZSIsICJ5ZXMiLCByb290RWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtZXRhaW5mLmlzU2ltcGxlKCkpIHsKLSAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJzaW1wbGUiLCAieWVzIiwgcm9vdEVsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobWV0YWluZi5pc1VuaW9uKCkpIHsKLSAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJ1bmlvbiIsICJ5ZXMiLCByb290RWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtZXRhaW5mLmlzTGlzdCgpKSB7Ci0gICAgICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAibGlzdCIsICJ5ZXMiLCByb290RWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtZXRhaW5mLmlzT3JkZXJlZCgpKSB7Ci0gICAgICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAib3JkZXJlZCIsICJ5ZXMiLCByb290RWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpc0VsZW1lbnQgJiYgbWV0YWluZi5pc05pbGxhYmxlKHFOYW1lKSkgewotICAgICAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgIm5pbGxhYmxlIiwgInllcyIsIHJvb3RFbHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1ldGFpbmYuaXNQYXJ0aWNsZUNsYXNzKCkpIHsKLSAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJwYXJ0aWNsZUNsYXNzIiwgInllcyIsIHJvb3RFbHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1ldGFpbmYuaXNIYXNQYXJ0aWNsZVR5cGUoKSl7Ci0gICAgICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAiaGFzUGFydGljbGVUeXBlIiwgInllcyIsIHJvb3RFbHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gcG9wdWxhdGUgYWxsIHRoZSBpbmZvcm1hdGlvbgotICAgICAgICBwb3B1bGF0ZUluZm8obWV0YWluZiwgbW9kZWwsIHJvb3RFbHQsIHByb3BlcnR5TmFtZXMsIHR5cGVNYXAsIGdyb3VwVHlwZU1hcCwgZmFsc2UpOwotCi0gICAgICAgIGlmIChtZXRhaW5mLmlzU2ltcGxlKCkgJiYgbWV0YWluZi5pc1VuaW9uKCkpIHsKLSAgICAgICAgICAgIHBvcHVsYXRlTWVtYmVySW5mbyhtZXRhaW5mLCBtb2RlbCwgcm9vdEVsdCwgdHlwZU1hcCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobWV0YWluZi5pc1NpbXBsZSgpICYmIG1ldGFpbmYuaXNMaXN0KCkpIHsKLSAgICAgICAgICAgIHBvcHVsYXRlTGlzdEluZm8obWV0YWluZiwgbW9kZWwsIHJvb3RFbHQsIHR5cGVNYXAsIGdyb3VwVHlwZU1hcCk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihET00yV3JpdGVyLm5vZGVUb1N0cmluZyhyb290RWx0KSk7Ci0gICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0gICAgICAgIHJldHVybiByb290RWx0OwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHBvcHVsYXRlTGlzdEluZm8oQmVhbldyaXRlck1ldGFJbmZvSG9sZGVyIG1ldGFpbmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEb2N1bWVudCBtb2RlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgcm9vdEVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXAgdHlwZU1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcCBncm91cFR5cGVNYXApIHsKLQotICAgICAgICBTdHJpbmcgamF2YU5hbWUgPSBtYWtlVW5pcXVlSmF2YUNsYXNzTmFtZShuZXcgQXJyYXlMaXN0KCksIG1ldGFpbmYuZ2V0SXRlbVR5cGVRTmFtZSgpLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgRWxlbWVudCBpdGVtVHlwZSA9IFhTTFRVdGlscy5hZGRDaGlsZEVsZW1lbnQobW9kZWwsICJpdGVtdHlwZSIsIHJvb3RFbGVtZW50KTsKLSAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgInR5cGUiLCBtZXRhaW5mLmdldEl0ZW1UeXBlQ2xhc3NOYW1lKCksIGl0ZW1UeXBlKTsKLSAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgIm5zdXJpIiwgbWV0YWluZi5nZXRJdGVtVHlwZVFOYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCksIGl0ZW1UeXBlKTsKLSAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgIm9yaWdpbmFsTmFtZSIsIG1ldGFpbmYuZ2V0SXRlbVR5cGVRTmFtZSgpLmdldExvY2FsUGFydCgpLCBpdGVtVHlwZSk7Ci0gICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJqYXZhbmFtZSIsIGphdmFOYW1lLCBpdGVtVHlwZSk7Ci0KLQotICAgICAgICBpZiAodHlwZU1hcC5jb250YWluc0tleShtZXRhaW5mLmdldEl0ZW1UeXBlUU5hbWUoKSkgfHwKLSAgICAgICAgICAgICAgICBncm91cFR5cGVNYXAuY29udGFpbnNLZXkobWV0YWluZi5nZXRJdGVtVHlwZUNsYXNzTmFtZSgpKSkgewotICAgICAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgIm91cnMiLCAidHJ1ZSIsIGl0ZW1UeXBlKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoUHJpbWl0aXZlVHlwZUZpbmRlci5pc1ByaW1pdGl2ZShtZXRhaW5mLmdldEl0ZW1UeXBlQ2xhc3NOYW1lKCkpKSB7Ci0gICAgICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAicHJpbWl0aXZlIiwgInllcyIsIGl0ZW1UeXBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBzaG9ydFR5cGVOYW1lID0gZ2V0U2hvcnRUeXBlTmFtZShtZXRhaW5mLmdldEl0ZW1UeXBlQ2xhc3NOYW1lKCkpOwotICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAic2hvcnR0eXBlbmFtZSIsIHNob3J0VHlwZU5hbWUsIGl0ZW1UeXBlKTsKLQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHBvcHVsYXRlTWVtYmVySW5mbyhCZWFuV3JpdGVyTWV0YUluZm9Ib2xkZXIgbWV0YWluZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRG9jdW1lbnQgbW9kZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgcm9vdEVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcCB0eXBlTWFwKSB7Ci0gICAgICAgIE1hcCBtZW1iZXJUeXBlcyA9IG1ldGFpbmYuZ2V0TWVtYmVyVHlwZXMoKTsKLSAgICAgICAgUU5hbWUgbWVtYmVyUU5hbWU7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IG1ldGFpbmYuZ2V0TWVtYmVyVHlwZXNLZXlzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBtZW1iZXJRTmFtZSA9IChRTmFtZSkgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBTdHJpbmcgbWVtYmVyQ2xhc3MgPSAoU3RyaW5nKSBtZW1iZXJUeXBlcy5nZXQobWVtYmVyUU5hbWUpOwotICAgICAgICAgICAgaWYgKFByaW1pdGl2ZVR5cGVGaW5kZXIuaXNQcmltaXRpdmUobWVtYmVyQ2xhc3MpKSB7Ci0gICAgICAgICAgICAgICAgbWVtYmVyQ2xhc3MgPSBQcmltaXRpdmVUeXBlV3JhcHBlci5nZXRXcmFwcGVyKG1lbWJlckNsYXNzKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gYWRkIG1lbWJlciB0eXBlIGVsZW1lbnQKLSAgICAgICAgICAgIEVsZW1lbnQgbWVtYmVyVHlwZSA9IFhTTFRVdGlscy5hZGRDaGlsZEVsZW1lbnQobW9kZWwsICJtZW1iZXJUeXBlIiwgcm9vdEVsZW1lbnQpOwotICAgICAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgInR5cGUiLCBtZW1iZXJDbGFzcywgbWVtYmVyVHlwZSk7Ci0gICAgICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAibnN1cmkiLCBtZW1iZXJRTmFtZS5nZXROYW1lc3BhY2VVUkkoKSwgbWVtYmVyVHlwZSk7Ci0gICAgICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAib3JpZ2luYWxOYW1lIiwgbWVtYmVyUU5hbWUuZ2V0TG9jYWxQYXJ0KCksIG1lbWJlclR5cGUpOwotICAgICAgICAgICAgaWYgKHR5cGVNYXAuY29udGFpbnNLZXkobWVtYmVyUU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgIm91cnMiLCAidHJ1ZSIsIG1lbWJlclR5cGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgU3RyaW5nIHNob3J0VHlwZU5hbWUgPSBnZXRTaG9ydFR5cGVOYW1lKG1lbWJlckNsYXNzKTsKLSAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJzaG9ydHR5cGVuYW1lIiwgc2hvcnRUeXBlTmFtZSwgbWVtYmVyVHlwZSk7Ci0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBtZXRhaW5mCi0gICAgICogQHBhcmFtIG1vZGVsCi0gICAgICogQHBhcmFtIHJvb3RFbHQKLSAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lcwotICAgICAqIEBwYXJhbSB0eXBlTWFwCi0gICAgICogQHRocm93cyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBwb3B1bGF0ZUluZm8oQmVhbldyaXRlck1ldGFJbmZvSG9sZGVyIG1ldGFpbmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEb2N1bWVudCBtb2RlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgcm9vdEVsdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5TGlzdCBwcm9wZXJ0eU5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwIHR5cGVNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXAgZ3JvdXBUeXBlTWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0luaGVyaXRlZCkgdGhyb3dzIFNjaGVtYUNvbXBpbGF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gd2Ugc2hvdWxkIGFkZCBwYXJlbnQgY2xhc3MgZGV0YWlscyBvbmx5IGlmIGl0IGlzCi0gICAgICAgIC8vIGFuIGV4dGVuc2lvbiBvciBzaW1wbGUgcmVzdHJpY3Rpb24KLSAgICAgICAgLy8gc2hvdWxkIG5vdCBpbiBjb21wbGV4IHJlc3RyaWN0aW9ucwotICAgICAgICBpZiAobWV0YWluZi5nZXRQYXJlbnQoKSAhPSBudWxsICYmICghbWV0YWluZi5pc1Jlc3RyaWN0aW9uKCkgfHwgKG1ldGFpbmYuaXNSZXN0cmljdGlvbigpICYmIG1ldGFpbmYuaXNTaW1wbGUoKSkpKQotICAgICAgICB7Ci0gICAgICAgICAgICBwb3B1bGF0ZUluZm8obWV0YWluZi5nZXRQYXJlbnQoKSwgbW9kZWwsIHJvb3RFbHQsIHByb3BlcnR5TmFtZXMsCi0gICAgICAgICAgICAgICAgICAgIHR5cGVNYXAsIGdyb3VwVHlwZU1hcCwgdHJ1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgYWRkUHJvcGVydHlFbnRyaWVzKG1ldGFpbmYsIG1vZGVsLCByb290RWx0LCBwcm9wZXJ0eU5hbWVzLCB0eXBlTWFwLCBncm91cFR5cGVNYXAsCi0gICAgICAgICAgICAgICAgaXNJbmhlcml0ZWQpOwotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIG1ldGFpbmYKLSAgICAgKiBAcGFyYW0gbW9kZWwKLSAgICAgKiBAcGFyYW0gcm9vdEVsdAotICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWVzCi0gICAgICogQHBhcmFtIHR5cGVNYXAKLSAgICAgKiBAdGhyb3dzIFNjaGVtYUNvbXBpbGF0aW9uRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGFkZFByb3BlcnR5RW50cmllcyhCZWFuV3JpdGVyTWV0YUluZm9Ib2xkZXIgbWV0YWluZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERvY3VtZW50IG1vZGVsLCBFbGVtZW50IHJvb3RFbHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheUxpc3QgcHJvcGVydHlOYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcCB0eXBlTWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwIGdyb3VwVHlwZU1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNJbmhlcml0ZWQpIHRocm93cyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIGdvIGluIHRoZSBsb29wIGFuZCBhZGQgdGhlIHBhcnQgZWxlbWVudHMKLSAgICAgICAgUU5hbWVbXSBxTmFtZTsKLSAgICAgICAgU3RyaW5nIGphdmFDbGFzc05hbWVGb3JFbGVtZW50OwotICAgICAgICBBcnJheUxpc3QgbWlzc2luZ1FOYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgQXJyYXlMaXN0IHFOYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgICAgICBCZWFuV3JpdGVyTWV0YUluZm9Ib2xkZXIgcGFyZW50TWV0YUluZiA9IG1ldGFpbmYuZ2V0UGFyZW50KCk7Ci0KLSAgICAgICAgaWYgKG1ldGFpbmYuaXNPcmRlcmVkKCkpIHsKLSAgICAgICAgICAgIHFOYW1lID0gbWV0YWluZi5nZXRPcmRlcmVkUU5hbWVBcnJheSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcU5hbWUgPSBtZXRhaW5mLmdldFFOYW1lQXJyYXkoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcU5hbWUubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIHFOYW1lcy5hZGQocU5hbWVbaV0pOwotICAgICAgICB9Ci0gICAgICAgIC8vYWRkaW5nIG1pc3NpbmcgUU5hbWVzIHRvIHRoZSBlbmQsIGluY2x1ZGluZyBlbGVtZW50cyAmIGF0dHJpYnV0ZXMuCi0gICAgICAgIC8vIGZvciB0aGUgc2ltcGxlIHR5cGVzIHdlIGhhdmUgYWxyZWFkeSBhZGQgdGhlIHBhcmVudCBlbGVtZW50cwotICAgICAgICAvLyBpdCBpcyBhbG1vc3QgY29uc2lkZXIgYXMgYW4gZXh0ZW5zaW9uCi0gICAgICAgIGlmIChtZXRhaW5mLmlzUmVzdHJpY3Rpb24oKSAmJiAhbWV0YWluZi5pc1NpbXBsZSgpKSB7Ci0gICAgICAgICAgICBhZGRNaXNzaW5nUU5hbWVzKG1ldGFpbmYsIHFOYW1lcywgbWlzc2luZ1FOYW1lcyk7Ci0gICAgICAgIH0KLSAgICAgICAgUU5hbWUgbmFtZTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHFOYW1lcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgbmFtZSA9IChRTmFtZSkgcU5hbWVzLmdldChpKTsKLSAgICAgICAgICAgIEVsZW1lbnQgcHJvcGVydHkgPSBYU0xUVXRpbHMuYWRkQ2hpbGRFbGVtZW50KG1vZGVsLCAicHJvcGVydHkiLCByb290RWx0KTsKLQotICAgICAgICAgICAgU3RyaW5nIHhtbE5hbWUgPSBuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgIm5hbWUiLCB4bWxOYW1lLCBwcm9wZXJ0eSk7Ci0gICAgICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAibnN1cmkiLCBuYW1lLmdldE5hbWVzcGFjZVVSSSgpLCBwcm9wZXJ0eSk7Ci0KLSAgICAgICAgICAgIFN0cmluZyBqYXZhTmFtZTsKLSAgICAgICAgICAgIGlmIChtZXRhaW5mLmlzSmF2YU5hbWVNYXBwaW5nQXZhaWxhYmxlKHhtbE5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgamF2YU5hbWUgPSBtZXRhaW5mLmdldEphdmFOYW1lKHhtbE5hbWUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBqYXZhTmFtZSA9IG1ha2VVbmlxdWVKYXZhQ2xhc3NOYW1lKHByb3BlcnR5TmFtZXMsIHhtbE5hbWUpOwotICAgICAgICAgICAgICAgIC8vIGluIGEgcmVzdHJpY3Rpb24gaWYgdGhpcyBlbGVtZW50IGFscmVhZHkgdGhlcmUgYW5kIGFycmF5IHN0YXR1cyBoYXZlIGNoYW5nZWQKLSAgICAgICAgICAgICAgICAvLyB0aGVuIHdlIGhhdmUgdG8gZ2VuZXJhdGUgYSBuZXcgIG5hbWUgZm9yIHRoaXMKLSAgICAgICAgICAgICAgICBpZiAocGFyZW50TWV0YUluZiAhPSBudWxsICYmIG1ldGFpbmYuaXNSZXN0cmljdGlvbigpICYmICFtaXNzaW5nUU5hbWVzLmNvbnRhaW5zKG5hbWUpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAocGFyZW50TWV0YUluZi5nZXRBcnJheVN0YXR1c0ZvclFOYW1lKG5hbWUpICYmICFtZXRhaW5mLmdldEFycmF5U3RhdHVzRm9yUU5hbWUobmFtZSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGphdmFOYW1lID0gbWFrZVVuaXF1ZUphdmFDbGFzc05hbWUocHJvcGVydHlOYW1lcywgeG1sTmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1ldGFpbmYuYWRkWG1sTmFtZUphdmFOYW1lTWFwcGluZyh4bWxOYW1lLGphdmFOYW1lKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgImphdmFuYW1lIiwgamF2YU5hbWUsIHByb3BlcnR5KTsKLQotICAgICAgICAgICAgaWYgKHBhcmVudE1ldGFJbmYgIT0gbnVsbCAmJiBtZXRhaW5mLmlzUmVzdHJpY3Rpb24oKSAmJiBtaXNzaW5nUU5hbWVzLmNvbnRhaW5zKG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgamF2YUNsYXNzTmFtZUZvckVsZW1lbnQgPSBwYXJlbnRNZXRhSW5mLmdldENsYXNzTmFtZUZvclFOYW1lKG5hbWUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBqYXZhQ2xhc3NOYW1lRm9yRWxlbWVudCA9IG1ldGFpbmYuZ2V0Q2xhc3NOYW1lRm9yUU5hbWUobmFtZSk7Ci0gICAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAgaWYgKGphdmFDbGFzc05hbWVGb3JFbGVtZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBqYXZhQ2xhc3NOYW1lRm9yRWxlbWVudCA9IGdldERlZmF1bHRDbGFzc05hbWUoKTsKLSAgICAgICAgICAgICAgICBsb2cud2FybihTY2hlbWFDb21waWxlck1lc3NhZ2VzCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0TWVzc2FnZSgic2NoZW1hLnR5cGVNaXNzaW5nIiwgbmFtZS50b1N0cmluZygpKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtZXRhaW5mLmlzUmVzdHJpY3Rpb24oKSAmJiB0eXBlQ2hhbmdlZChuYW1lLCBtaXNzaW5nUU5hbWVzLCBtZXRhaW5mKSkgewotICAgICAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJ0eXBlQ2hhbmdlZCIsICJ5ZXMiLCBwcm9wZXJ0eSk7Ci0gICAgICAgICAgICAgICAgLy9YU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAicmVzdHJpY3RlZCIsICJ5ZXMiLCBwcm9wZXJ0eSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGxvbmcgbWluT2NjdXJzID0gbWV0YWluZi5nZXRNaW5PY2N1cnMobmFtZSk7Ci0gICAgICAgICAgICBpZiAoUHJpbWl0aXZlVHlwZUZpbmRlci5pc1ByaW1pdGl2ZShqYXZhQ2xhc3NOYW1lRm9yRWxlbWVudCkKLSAgICAgICAgICAgICAgICAgICAgJiYgaXNVc2VXcmFwcGVyQ2xhc3NlcyAmJiAoKG1pbk9jY3VycyA9PSAwKSB8fCBtZXRhaW5mLmlzTmlsbGFibGUobmFtZSkpKSB7Ci0gICAgICAgICAgICAgICAgIC8vIGlmIHRoaXMgaXMgYW4gcHJpbWl0aXZlIGNsYXNzIGFuZCB1c2VyIHdhbnRzIHRvIHVzZSB0aGUKLSAgICAgICAgICAgICAgICAgLy8gd3JhcHBlciB0eXBlIHdlIGNoYW5nZSB0aGUgdHlwZSB0byB3cmFwcGVyIHR5cGUuCi0gICAgICAgICAgICAgICAgIGphdmFDbGFzc05hbWVGb3JFbGVtZW50ID0gUHJpbWl0aXZlVHlwZVdyYXBwZXIuZ2V0V3JhcHBlcihqYXZhQ2xhc3NOYW1lRm9yRWxlbWVudCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJ0eXBlIiwgamF2YUNsYXNzTmFtZUZvckVsZW1lbnQsIHByb3BlcnR5KTsKLQotCi0gICAgICAgICAgICBpZiAoUHJpbWl0aXZlVHlwZUZpbmRlci5pc1ByaW1pdGl2ZShqYXZhQ2xhc3NOYW1lRm9yRWxlbWVudCkpIHsKLQotICAgICAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJwcmltaXRpdmUiLCAieWVzIiwgcHJvcGVydHkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgLy8gYWRkIHRoZSBkZWZhdWx0IHZhbHVlCi0gICAgICAgICAgICBpZiAobWV0YWluZi5pc0RlZmF1bHRWYWx1ZUF2YWlsYWJsZShuYW1lKSl7Ci0gICAgICAgICAgICAgICAgUU5hbWUgc2NoZW1hUU5hbWUgPSBtZXRhaW5mLmdldFNjaGVtYVFOYW1lRm9yUU5hbWUobmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGJhc2VUeXBlTWFwLmNvbnRhaW5zS2V5KHNjaGVtYVFOYW1lKSl7Ci0gICAgICAgICAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJkZWZhdWx0VmFsdWUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFpbmYuZ2V0RGVmYXVsdFZhbHVlRm9yUU5hbWUobmFtZSksIHByb3BlcnR5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vaW4gdGhlIGNhc2UgdGhlIG9yaWdpbmFsIGVsZW1lbnQgaXMgYW4gYXJyYXkgYnV0IHRoZSBkZXJpdmVkIG9uZSBpcyBub3QuCi0gICAgICAgICAgICBpZiAocGFyZW50TWV0YUluZiAhPSBudWxsICYmIG1ldGFpbmYuaXNSZXN0cmljdGlvbigpICYmICFtaXNzaW5nUU5hbWVzLmNvbnRhaW5zKG5hbWUpICYmCi0gICAgICAgICAgICAgICAgICAgIChwYXJlbnRNZXRhSW5mLmdldEFycmF5U3RhdHVzRm9yUU5hbWUobmFtZSkgJiYgIW1ldGFpbmYuZ2V0QXJyYXlTdGF0dXNGb3JRTmFtZShuYW1lKSkpIHsKLQotICAgICAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJyZXdyaXRlIiwgInllcyIsIHByb3BlcnR5KTsKLSAgICAgICAgICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAib2NjdXJhbmNlQ2hhbmdlZCIsICJ5ZXMiLCBwcm9wZXJ0eSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1ldGFpbmYuaXNSZXN0cmljdGlvbigpICYmICFtaXNzaW5nUU5hbWVzLmNvbnRhaW5zKG5hbWUpICYmCi0gICAgICAgICAgICAgICAgICAgIChtaW5PY2N1cnNDaGFuZ2VkKG5hbWUsIG1pc3NpbmdRTmFtZXMsIG1ldGFpbmYpIHx8IG1heE9jY3Vyc0NoYW5nZWQobmFtZSwgbWlzc2luZ1FOYW1lcywgbWV0YWluZikpKQotICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgInJlc3RyaWN0ZWQiLCAieWVzIiwgcHJvcGVydHkpOwotICAgICAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJvY2N1cmFuY2VDaGFuZ2VkIiwgInllcyIsIHByb3BlcnR5KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gc2V0IHRoZSBpcyBwYXJ0aWNsZSBjbGFzcwotICAgICAgICAgICAgaWYgKG1ldGFpbmYuZ2V0UGFydGljbGVUeXBlU3RhdHVzRm9yUU5hbWUobmFtZSkpewotICAgICAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJwYXJ0aWNsZUNsYXNzVHlwZSIsICJ5ZXMiLCBwcm9wZXJ0eSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGlmIHdlIGhhdmUgYW4gcGFydGljbGUgY2xhc3MgaW4gYSBleHRlbnNpb24gY2xhc3MgdGhlbiB3ZSBoYXZlCi0gICAgICAgICAgICAvLyB0byBjb25zaWRlciB0aGUgd2hvbGUgY2xhc3MgaGFzIGEgcGFydGljbGUgdHlwZS4KLQotICAgICAgICAgICAgaWYgKG1ldGFpbmYuaXNIYXNQYXJ0aWNsZVR5cGUoKSkgewotICAgICAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJoYXNQYXJ0aWNsZVR5cGUiLCAieWVzIiwgcm9vdEVsdCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHdoYXQgaGFwcGVkIGlmIHRoaXMgY29udGFpbiBhdHRyaWJ1dGVzCi0gICAgICAgICAgICAvLyBUT0RPOiBjaGVjayB0aGUgbWVhbmluZyBvZiB0aGlzIHJlbW92ZWQgcHJvcGVydHkKLQotICAgICAgICAgICAgaWYgKG1ldGFpbmYuaXNSZXN0cmljdGlvbigpICYmIG1pc3NpbmdRTmFtZXMuY29udGFpbnMobmFtZSkgJiYgIW1ldGFpbmYuaXNTaW1wbGUoKSkgewotICAgICAgICAgICAgICAgIC8vWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgInJlc3RyaWN0ZWQiLCAieWVzIiwgcHJvcGVydHkpOwotICAgICAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJyZW1vdmVkIiwgInllcyIsIHByb3BlcnR5KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGlzSW5oZXJpdGVkKSB7Ci0gICAgICAgICAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgImluaGVyaXRlZCIsICJ5ZXMiLCBwcm9wZXJ0eSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtZXRhaW5mLmdldElubmVyQ2hvaWNlU3RhdHVzRm9yUU5hbWUobmFtZSkpewotICAgICAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJpbm5lcmNob2ljZSIsICJ5ZXMiLCBwcm9wZXJ0eSk7Ci0gICAgICAgICAgICB9Ci0KLQotCi0gICAgICAgICAgICBpZiAoKHBhcmVudE1ldGFJbmYgIT0gbnVsbCkgJiYgbWV0YWluZi5pc1Jlc3RyaWN0aW9uKCkgJiYgbWlzc2luZ1FOYW1lcy5jb250YWlucyhuYW1lKSkgewotICAgICAgICAgICAgICAgIC8vIHRoaXMgZWxlbWVudCBkZXRhaWxzIHNob3VsZCBiZSB0aGVyZSB3aXRoIHRoZSBwYXJlbnQgbWV0YSBJbmYKLSAgICAgICAgICAgICAgICBhZGRBdHRyaWJ1dGVzVG9Qcm9wZXJ0eSgKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudE1ldGFJbmYsCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICBncm91cFR5cGVNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhQ2xhc3NOYW1lRm9yRWxlbWVudCk7Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYWRkQXR0cmlidXRlc1RvUHJvcGVydHkoCi0gICAgICAgICAgICAgICAgICAgICAgICBtZXRhaW5mLAotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLAotICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHksCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlTWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBUeXBlTWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgamF2YUNsYXNzTmFtZUZvckVsZW1lbnQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gIC8vIGVuZCBvZiBmb28KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkQXR0cmlidXRlc1RvUHJvcGVydHkoQmVhbldyaXRlck1ldGFJbmZvSG9sZGVyIG1ldGFpbmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFOYW1lIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERvY3VtZW50IG1vZGVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50IHByb3BlcnR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXAgdHlwZU1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwIGdyb3VwVHlwZU1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGphdmFDbGFzc05hbWVGb3JFbGVtZW50KSB7Ci0gICAgICAgIC8vIGFkZCBhbiBhdHRyaWJ1dGUgdGhhdCBzYXlzIHRoZSB0eXBlIGlzIGRlZmF1bHQKLSAgICAgICAgaWYgKG1ldGFpbmYuZ2V0RGVmYXVsdFN0YXR1c0ZvclFOYW1lKG5hbWUpKSB7Ci0gICAgICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAiZGVmYXVsdCIsICJ5ZXMiLCBwcm9wZXJ0eSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodHlwZU1hcC5jb250YWluc0tleShtZXRhaW5mLmdldFNjaGVtYVFOYW1lRm9yUU5hbWUobmFtZSkpIHx8Ci0gICAgICAgICAgICAgICAgZ3JvdXBUeXBlTWFwLmNvbnRhaW5zS2V5KG1ldGFpbmYuZ2V0U2NoZW1hUU5hbWVGb3JRTmFtZShuYW1lKSkpIHsKLSAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJvdXJzIiwgInllcyIsIHByb3BlcnR5KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtZXRhaW5mLmdldEF0dHJpYnV0ZVN0YXR1c0ZvclFOYW1lKG5hbWUpKSB7Ci0gICAgICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAiYXR0cmlidXRlIiwgInllcyIsIHByb3BlcnR5KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtZXRhaW5mLmlzTmlsbGFibGUobmFtZSkpIHsKLSAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJuaWxsYWJsZSIsICJ5ZXMiLCBwcm9wZXJ0eSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobWV0YWluZi5nZXRPcHRpb25hbEF0dHJpYnV0ZVN0YXR1c0ZvclFOYW1lKG5hbWUpKSB7Ci0gICAgICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAib3B0aW9uYWwiLCAieWVzIiwgcHJvcGVydHkpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIHNob3J0VHlwZU5hbWU7Ci0gICAgICAgIGlmIChtZXRhaW5mLmdldFNjaGVtYVFOYW1lRm9yUU5hbWUobmFtZSkgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gc2VlIHdoZXRoZXIgdGhlIFFOYW1lIGlzIGEgYmFzZXR5cGUKLSAgICAgICAgICAgIGlmIChiYXNlVHlwZU1hcC5jb250YWluc0tleShtZXRhaW5mLmdldFNjaGVtYVFOYW1lRm9yUU5hbWUobmFtZSkpKSB7Ci0gICAgICAgICAgICAgICAgc2hvcnRUeXBlTmFtZSA9IG1ldGFpbmYuZ2V0U2NoZW1hUU5hbWVGb3JRTmFtZShuYW1lKS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2hvcnRUeXBlTmFtZSA9IGdldFNob3J0VHlwZU5hbWUoamF2YUNsYXNzTmFtZUZvckVsZW1lbnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc2hvcnRUeXBlTmFtZSA9IGdldFNob3J0VHlwZU5hbWUoamF2YUNsYXNzTmFtZUZvckVsZW1lbnQpOwotICAgICAgICB9Ci0gICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJzaG9ydHR5cGVuYW1lIiwgc2hvcnRUeXBlTmFtZSwgcHJvcGVydHkpOwotCi0KLSAgICAgICAgaWYgKG1ldGFpbmYuZ2V0QW55U3RhdHVzRm9yUU5hbWUobmFtZSkpIHsKLSAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJhbnkiLCAieWVzIiwgcHJvcGVydHkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1ldGFpbmYuZ2V0QmluYXJ5U3RhdHVzRm9yUU5hbWUobmFtZSkpIHsKLSAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJiaW5hcnkiLCAieWVzIiwgcHJvcGVydHkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1ldGFpbmYuaXNTaW1wbGUoKSB8fCBtZXRhaW5mLmdldFNpbXBsZVN0YXR1c0ZvclFOYW1lKG5hbWUpKSB7Ci0gICAgICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAic2ltcGxlIiwgInllcyIsIHByb3BlcnR5KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHB1dCB0aGUgbWluIG9jY3VycyBjb3VudCBpcnJlc3BlY3RpdmUgb2Ygd2hldGhlciBpdCdzIGFuIGFycmF5IG9yCi0gICAgICAgIC8vIG5vdAotICAgICAgICBsb25nIG1pbk9jY3VycyA9IG1ldGFpbmYuZ2V0TWluT2NjdXJzKG5hbWUpOwotICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAibWluT2NjdXJzIiwgbWluT2NjdXJzICsgIiIsIHByb3BlcnR5KTsKLQotCi0gICAgICAgIGlmIChtZXRhaW5mLmdldEFycmF5U3RhdHVzRm9yUU5hbWUobmFtZSkpIHsKLQotICAgICAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgImFycmF5IiwgInllcyIsIHByb3BlcnR5KTsKLQotICAgICAgICAgICAgaW50IGVuZEluZGV4ID0gamF2YUNsYXNzTmFtZUZvckVsZW1lbnQuaW5kZXhPZigiWyIpOwotICAgICAgICAgICAgaWYgKGVuZEluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAiYXJyYXlCYXNlVHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhQ2xhc3NOYW1lRm9yRWxlbWVudC5zdWJzdHJpbmcoMCwgZW5kSW5kZXgpLCBwcm9wZXJ0eSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJhcnJheUJhc2VUeXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmFDbGFzc05hbWVGb3JFbGVtZW50LCBwcm9wZXJ0eSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGxvbmcgbWF4T2NjdXJzID0gbWV0YWluZi5nZXRNYXhPY2N1cnMobmFtZSk7Ci0gICAgICAgICAgICBpZiAobWF4T2NjdXJzID09IExvbmcuTUFYX1ZBTFVFKSB7Ci0gICAgICAgICAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgInVuYm91bmQiLCAieWVzIiwgcHJvcGVydHkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAibWF4T2NjdXJzIiwgbWF4T2NjdXJzICsgIiIsIHByb3BlcnR5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAobWV0YWluZi5pc1Jlc3RyaWN0aW9uQmFzZVR5cGUobmFtZSkpIHsKLSAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJyZXN0cmljdGlvbkJhc2VUeXBlIiwgInllcyIsIHByb3BlcnR5KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtZXRhaW5mLmlzRXh0ZW5zaW9uQmFzZVR5cGUobmFtZSkpIHsKLSAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJleHRlbnNpb25CYXNlVHlwZSIsICJ5ZXMiLCBwcm9wZXJ0eSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobWV0YWluZi5pc1Jlc3RyaWN0aW9uQmFzZVR5cGUobmFtZSkgJiYgbWV0YWluZi5nZXRMZW5ndGhGYWNldCgpICE9IC0xKSB7Ci0gICAgICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAibGVuRmFjZXQiLCBtZXRhaW5mLmdldExlbmd0aEZhY2V0KCkgKyAiIiwgcHJvcGVydHkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1ldGFpbmYuaXNSZXN0cmljdGlvbkJhc2VUeXBlKG5hbWUpICYmIG1ldGFpbmYuZ2V0TWF4TGVuZ3RoRmFjZXQoKSAhPSAtMSkgewotICAgICAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgIm1heExlbkZhY2V0IiwgbWV0YWluZi5nZXRNYXhMZW5ndGhGYWNldCgpICsgIiIsIHByb3BlcnR5KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtZXRhaW5mLmlzUmVzdHJpY3Rpb25CYXNlVHlwZShuYW1lKSAmJiBtZXRhaW5mLmdldE1pbkxlbmd0aEZhY2V0KCkgIT0gLTEpIHsKLSAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJtaW5MZW5GYWNldCIsIG1ldGFpbmYuZ2V0TWluTGVuZ3RoRmFjZXQoKSArICIiLCBwcm9wZXJ0eSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobWV0YWluZi5pc1Jlc3RyaWN0aW9uQmFzZVR5cGUobmFtZSkgJiYgbWV0YWluZi5nZXRNYXhFeGNsdXNpdmVGYWNldCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJtYXhFeEZhY2V0IiwgbWV0YWluZi5nZXRNYXhFeGNsdXNpdmVGYWNldCgpICsgIiIsIHByb3BlcnR5KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtZXRhaW5mLmlzUmVzdHJpY3Rpb25CYXNlVHlwZShuYW1lKSAmJiBtZXRhaW5mLmdldE1pbkV4Y2x1c2l2ZUZhY2V0KCkgIT0gbnVsbCkgewotICAgICAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgIm1pbkV4RmFjZXQiLCBtZXRhaW5mLmdldE1pbkV4Y2x1c2l2ZUZhY2V0KCkgKyAiIiwgcHJvcGVydHkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1ldGFpbmYuaXNSZXN0cmljdGlvbkJhc2VUeXBlKG5hbWUpICYmIG1ldGFpbmYuZ2V0TWF4SW5jbHVzaXZlRmFjZXQoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAibWF4SW5GYWNldCIsIG1ldGFpbmYuZ2V0TWF4SW5jbHVzaXZlRmFjZXQoKSArICIiLCBwcm9wZXJ0eSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobWV0YWluZi5pc1Jlc3RyaWN0aW9uQmFzZVR5cGUobmFtZSkgJiYgbWV0YWluZi5nZXRNaW5JbmNsdXNpdmVGYWNldCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJtaW5JbkZhY2V0IiwgbWV0YWluZi5nZXRNaW5JbmNsdXNpdmVGYWNldCgpICsgIiIsIHByb3BlcnR5KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghbWV0YWluZi5nZXRFbnVtRmFjZXQoKS5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGJvb2xlYW4gdmFsaWRKYXZhID0gdHJ1ZTsgICAgLy8gQXNzdW1lIGFsbCBlbnVtIHZhbHVlcyBhcmUgdmFsaWQgaWRzCi0KLSAgICAgICAgICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gbWV0YWluZi5nZXRFbnVtRmFjZXQoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgLy8gV2FsayB0aGUgdmFsdWVzIGxvb2tpbmcgZm9yIGludmFsaWQgaWRzCi0gICAgICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gKFN0cmluZykgaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgIGlmICghSmF2YVV0aWxzLmlzSmF2YUlkKHZhbHVlKSkgewotICAgICAgICAgICAgICAgICAgICB2YWxpZEphdmEgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGludCBpZCA9IDA7Ci0gICAgICAgICAgICBpdGVyYXRvciA9IG1ldGFpbmYuZ2V0RW51bUZhY2V0KCkuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBFbGVtZW50IGVudW1GYWNldCA9IFhTTFRVdGlscy5hZGRDaGlsZEVsZW1lbnQobW9kZWwsICJlbnVtRmFjZXQiLCBwcm9wZXJ0eSk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGF0dHJpYlZhbHVlID0gKFN0cmluZykgaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJ2YWx1ZSIsIGF0dHJpYlZhbHVlLCBlbnVtRmFjZXQpOwotICAgICAgICAgICAgICAgIGlmICh2YWxpZEphdmEpIHsKLSAgICAgICAgICAgICAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgImlkIiwgYXR0cmliVmFsdWUsIGVudW1GYWNldCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWQrKzsKLSAgICAgICAgICAgICAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgImlkIiwgInZhbHVlIiArIGlkLCBlbnVtRmFjZXQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtZXRhaW5mLmlzUmVzdHJpY3Rpb25CYXNlVHlwZShuYW1lKSAmJiBtZXRhaW5mLmdldFBhdHRlcm5GYWNldCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJwYXR0ZXJuRmFjZXQiLCBtZXRhaW5mLmdldFBhdHRlcm5GYWNldCgpLCBwcm9wZXJ0eSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkTWlzc2luZ1FOYW1lcyhCZWFuV3JpdGVyTWV0YUluZm9Ib2xkZXIgbWV0YWluZiwgQXJyYXlMaXN0IHFOYW1lLCBBcnJheUxpc3QgbWlzc2luZ1FOYW1lcykgewotCi0gICAgICAgIFFOYW1lW10gcU5hbWVzID0gbnVsbDsKLSAgICAgICAgUU5hbWVbXSBwUU5hbWVzID0gbnVsbDsKLQotICAgICAgICBCZWFuV3JpdGVyTWV0YUluZm9Ib2xkZXIgcGFyZW50TWV0YUluZiA9IG1ldGFpbmYuZ2V0UGFyZW50KCk7Ci0KLSAgICAgICAgaWYgKG1ldGFpbmYuaXNPcmRlcmVkKCkpIHsKLSAgICAgICAgICAgIHFOYW1lcyA9IG1ldGFpbmYuZ2V0T3JkZXJlZFFOYW1lQXJyYXkoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHFOYW1lcyA9IG1ldGFpbmYuZ2V0UU5hbWVBcnJheSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHBhcmVudE1ldGFJbmYgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKHBhcmVudE1ldGFJbmYuaXNPcmRlcmVkKCkpIHsKLSAgICAgICAgICAgICAgICBwUU5hbWVzID0gcGFyZW50TWV0YUluZi5nZXRPcmRlcmVkUU5hbWVBcnJheSgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwUU5hbWVzID0gcGFyZW50TWV0YUluZi5nZXRRTmFtZUFycmF5KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBwUU5hbWVzICE9IG51bGwgJiYgaSA8IHBRTmFtZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChxTmFtZU5vdEZvdW5kKHBRTmFtZXNbaV0sIG1ldGFpbmYpKSB7Ci0gICAgICAgICAgICAgICAgbWlzc2luZ1FOYW1lcy5hZGQocFFOYW1lc1tpXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy9hZGRpbmcgbWlzc2luZyBRTmFtZXMgdG8gdGhlIGVuZCBvZiBsaXN0LgotICAgICAgICBpZiAoIW1pc3NpbmdRTmFtZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1pc3NpbmdRTmFtZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBxTmFtZS5hZGQobWlzc2luZ1FOYW1lcy5nZXQoaSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gcU5hbWVOb3RGb3VuZChRTmFtZSBxbmFtZSwgQmVhbldyaXRlck1ldGFJbmZvSG9sZGVyIG1ldGFpbmYpIHsKLQotICAgICAgICBib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0gICAgICAgIFFOYW1lW10gcU5hbWVzOwotCi0gICAgICAgIGlmIChtZXRhaW5mLmlzT3JkZXJlZCgpKSB7Ci0gICAgICAgICAgICBxTmFtZXMgPSBtZXRhaW5mLmdldE9yZGVyZWRRTmFtZUFycmF5KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBxTmFtZXMgPSBtZXRhaW5mLmdldFFOYW1lQXJyYXkoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgcU5hbWVzLmxlbmd0aDsgaisrKSB7Ci0gICAgICAgICAgICBpZiAocW5hbWUuZ2V0TG9jYWxQYXJ0KCkuZXF1YWxzKHFOYW1lc1tqXS5nZXRMb2NhbFBhcnQoKSkpIHsKLSAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuICFmb3VuZDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gdHlwZUNoYW5nZWQoUU5hbWUgcW5hbWUsIEFycmF5TGlzdCBtaXNzaW5nUU5hbWVzLCBCZWFuV3JpdGVyTWV0YUluZm9Ib2xkZXIgbWV0YWluZikgewotCi0gICAgICAgIGJvb2xlYW4gdHlwZUNoYW5nZWQgPSBmYWxzZTsKLSAgICAgICAgUU5hbWVbXSBwUU5hbWVzOwotCi0gICAgICAgIEJlYW5Xcml0ZXJNZXRhSW5mb0hvbGRlciBwYXJlbnRNZXRhaW5mID0gbWV0YWluZi5nZXRQYXJlbnQoKTsKLQotICAgICAgICBpZiAocGFyZW50TWV0YWluZiAhPSBudWxsICYmICFtaXNzaW5nUU5hbWVzLmNvbnRhaW5zKHFuYW1lKSkgewotCi0gICAgICAgICAgICBpZiAocGFyZW50TWV0YWluZi5pc09yZGVyZWQoKSkgewotICAgICAgICAgICAgICAgIHBRTmFtZXMgPSBwYXJlbnRNZXRhaW5mLmdldE9yZGVyZWRRTmFtZUFycmF5KCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHBRTmFtZXMgPSBwYXJlbnRNZXRhaW5mLmdldFFOYW1lQXJyYXkoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBwUU5hbWVzLmxlbmd0aDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHFuYW1lLmdldExvY2FsUGFydCgpLmVxdWFscyhwUU5hbWVzW2pdLmdldExvY2FsUGFydCgpKSkgewotCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBqYXZhQ2xhc3NGb3JQYXJlbnRFbGVtZW50ID0gcGFyZW50TWV0YWluZi5nZXRDbGFzc05hbWVGb3JRTmFtZShwUU5hbWVzW2pdKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGphdmFDbGFzc0ZvckVsZW1lbnQgPSBtZXRhaW5mLmdldENsYXNzTmFtZUZvclFOYW1lKHFuYW1lKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoIWphdmFDbGFzc0ZvclBhcmVudEVsZW1lbnQuZXF1YWxzKGphdmFDbGFzc0ZvckVsZW1lbnQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoamF2YUNsYXNzRm9yUGFyZW50RWxlbWVudC5lbmRzV2l0aCgiW10iKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoamF2YUNsYXNzRm9yUGFyZW50RWxlbWVudC5zdWJzdHJpbmcoMCwgamF2YUNsYXNzRm9yUGFyZW50RWxlbWVudC5pbmRleE9mKCdbJykpKS5lcXVhbHMoamF2YUNsYXNzRm9yRWxlbWVudCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGphdmFDbGFzc0ZvckVsZW1lbnQuZW5kc1dpdGgoIltdIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGphdmFDbGFzc0ZvckVsZW1lbnQuc3Vic3RyaW5nKDAsIGphdmFDbGFzc0ZvckVsZW1lbnQuaW5kZXhPZignWycpKSkuZXF1YWxzKGphdmFDbGFzc0ZvclBhcmVudEVsZW1lbnQpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlQ2hhbmdlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHR5cGVDaGFuZ2VkOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBtaW5PY2N1cnNDaGFuZ2VkKFFOYW1lIHFuYW1lLCBBcnJheUxpc3QgbWlzc2luZ1FOYW1lcywgQmVhbldyaXRlck1ldGFJbmZvSG9sZGVyIG1ldGFpbmYpIHRocm93cyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgYm9vbGVhbiBtaW5DaGFuZ2VkID0gZmFsc2U7Ci0gICAgICAgIFFOYW1lW10gcFFOYW1lczsKLQotICAgICAgICBCZWFuV3JpdGVyTWV0YUluZm9Ib2xkZXIgcGFyZW50TWV0YWluZiA9IG1ldGFpbmYuZ2V0UGFyZW50KCk7Ci0KLSAgICAgICAgaWYgKHBhcmVudE1ldGFpbmYgIT0gbnVsbCAmJiAhbWlzc2luZ1FOYW1lcy5jb250YWlucyhxbmFtZSkpIHsKLQotICAgICAgICAgICAgaWYgKHBhcmVudE1ldGFpbmYuaXNPcmRlcmVkKCkpIHsKLSAgICAgICAgICAgICAgICBwUU5hbWVzID0gcGFyZW50TWV0YWluZi5nZXRPcmRlcmVkUU5hbWVBcnJheSgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwUU5hbWVzID0gcGFyZW50TWV0YWluZi5nZXRRTmFtZUFycmF5KCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgcFFOYW1lcy5sZW5ndGg7IGorKykgewotICAgICAgICAgICAgICAgIGlmIChxbmFtZS5nZXRMb2NhbFBhcnQoKS5lcXVhbHMocFFOYW1lc1tqXS5nZXRMb2NhbFBhcnQoKSkpIHsKLQotICAgICAgICAgICAgICAgICAgICBpZiAobWV0YWluZi5nZXRNaW5PY2N1cnMocW5hbWUpID4gcGFyZW50TWV0YWluZi5nZXRNaW5PY2N1cnMocFFOYW1lc1tqXSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbkNoYW5nZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1ldGFpbmYuZ2V0TWluT2NjdXJzKHFuYW1lKSA8IHBhcmVudE1ldGFpbmYuZ2V0TWluT2NjdXJzKHBRTmFtZXNbal0pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24oU2NoZW1hQ29tcGlsZXJNZXNzYWdlcy5nZXRNZXNzYWdlKCJtaW5PY2N1cnMgV3JvbmchIikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1pbkNoYW5nZWQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIG1heE9jY3Vyc0NoYW5nZWQoUU5hbWUgcW5hbWUsIEFycmF5TGlzdCBtaXNzaW5nUU5hbWVzLCBCZWFuV3JpdGVyTWV0YUluZm9Ib2xkZXIgbWV0YWluZikgdGhyb3dzIFNjaGVtYUNvbXBpbGF0aW9uRXhjZXB0aW9uIHsKLQotICAgICAgICBib29sZWFuIG1heENoYW5nZWQgPSBmYWxzZTsKLSAgICAgICAgUU5hbWVbXSBwUU5hbWVzOwotCi0gICAgICAgIEJlYW5Xcml0ZXJNZXRhSW5mb0hvbGRlciBwYXJlbnRNZXRhaW5mID0gbWV0YWluZi5nZXRQYXJlbnQoKTsKLQotICAgICAgICBpZiAocGFyZW50TWV0YWluZiAhPSBudWxsICYmICFtaXNzaW5nUU5hbWVzLmNvbnRhaW5zKHFuYW1lKSkgewotICAgICAgICAgICAgaWYgKHBhcmVudE1ldGFpbmYuaXNPcmRlcmVkKCkpIHsKLSAgICAgICAgICAgICAgICBwUU5hbWVzID0gcGFyZW50TWV0YWluZi5nZXRPcmRlcmVkUU5hbWVBcnJheSgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwUU5hbWVzID0gcGFyZW50TWV0YWluZi5nZXRRTmFtZUFycmF5KCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgcFFOYW1lcy5sZW5ndGg7IGorKykgewotICAgICAgICAgICAgICAgIGlmIChxbmFtZS5nZXRMb2NhbFBhcnQoKS5lcXVhbHMocFFOYW1lc1tqXS5nZXRMb2NhbFBhcnQoKSkpIHsKLQotICAgICAgICAgICAgICAgICAgICBpZiAobWV0YWluZi5nZXRNYXhPY2N1cnMocW5hbWUpIDwgcGFyZW50TWV0YWluZi5nZXRNYXhPY2N1cnMocFFOYW1lc1tqXSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1heENoYW5nZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1ldGFpbmYuZ2V0TWF4T2NjdXJzKHFuYW1lKSA+IHBhcmVudE1ldGFpbmYuZ2V0TWF4T2NjdXJzKHBRTmFtZXNbal0pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24oU2NoZW1hQ29tcGlsZXJNZXNzYWdlcy5nZXRNZXNzYWdlKCJtYXhPY2N1cnMgV3JvbmchIikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtYXhDaGFuZ2VkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3Qgd2hldGhlciB0aGUgZ2l2ZW4gY2xhc3MgbmFtZSBtYXRjaGVzIHRoZSBkZWZhdWx0Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gamF2YUNsYXNzTmFtZUZvckVsZW1lbnQKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNEZWZhdWx0KFN0cmluZyBqYXZhQ2xhc3NOYW1lRm9yRWxlbWVudCkgewotICAgICAgICByZXR1cm4gZ2V0RGVmYXVsdENsYXNzTmFtZSgpCi0gICAgICAgICAgICAgICAgLmVxdWFscyhqYXZhQ2xhc3NOYW1lRm9yRWxlbWVudCkKLSAgICAgICAgICAgICAgICB8fCBnZXREZWZhdWx0Q2xhc3NBcnJheU5hbWUoKQotICAgICAgICAgICAgICAgIC5lcXVhbHMoamF2YUNsYXNzTmFtZUZvckVsZW1lbnQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdpdmVuIHRoZSB4bWwgbmFtZSwgbWFrZSBhIHVuaXF1ZSBjbGFzcyBuYW1lIHRha2luZyBpbnRvIGFjY291bnQgdGhhdAotICAgICAqIHNvbWUgZmlsZSBzeXN0ZW1zIGFyZSBjYXNlIHNlbnNpdGl2ZSBhbmQgc29tZSBhcmUgbm90LiAtQ29uc2lkZXIgdGhlCi0gICAgICogSmF4LVdTIHNwZWMgZm9yIHRoaXMKLSAgICAgKgotICAgICAqIEBwYXJhbSBsaXN0T2ZOYW1lcwotICAgICAqIEBwYXJhbSB4bWxOYW1lCi0gICAgICogQHJldHVybiBSZXR1cm5zIFN0cmluZy4KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBtYWtlVW5pcXVlSmF2YUNsYXNzTmFtZShMaXN0IGxpc3RPZk5hbWVzLCBTdHJpbmcgeG1sTmFtZSkgewotICAgICAgICBTdHJpbmcgamF2YU5hbWU7Ci0gICAgICAgIGlmIChKYXZhVXRpbHMuaXNKYXZhS2V5d29yZCh4bWxOYW1lKSkgewotICAgICAgICAgICAgamF2YU5hbWUgPSBKYXZhVXRpbHMubWFrZU5vbkphdmFLZXl3b3JkKHhtbE5hbWUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamF2YU5hbWUgPSBKYXZhVXRpbHMuY2FwaXRhbGl6ZUZpcnN0Q2hhcihKYXZhVXRpbHMKLSAgICAgICAgICAgICAgICAgICAgLnhtbE5hbWVUb0phdmEoeG1sTmFtZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgd2hpbGUgKGxpc3RPZk5hbWVzLmNvbnRhaW5zKGphdmFOYW1lLnRvTG93ZXJDYXNlKCkpKSB7Ci0gICAgICAgICAgICBpZiAoIWxpc3RPZk5hbWVzLmNvbnRhaW5zKChqYXZhTmFtZSArICJFIikudG9Mb3dlckNhc2UoKSkpewotICAgICAgICAgICAgICAgIGphdmFOYW1lID0gamF2YU5hbWUgKyAiRSI7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGphdmFOYW1lID0gamF2YU5hbWUgKyBjb3VudCsrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgbGlzdE9mTmFtZXMuYWRkKGphdmFOYW1lLnRvTG93ZXJDYXNlKCkpOwotICAgICAgICByZXR1cm4gamF2YU5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQSBiaXQgb2YgY29kZSBmcm9tIHRoZSBvbGQgY29kZSBnZW5lcmF0b3IuIFdlIGFyZSBiZXR0ZXIgb2ZmIHVzaW5nIHRoZQotICAgICAqIHRlbXBsYXRlIGVuZ2luZXMgYW5kIHN1Y2ggc3R1ZmYgdGhhdCdzIGFscmVhZHkgdGhlcmUuIEJ1dCB0aGUgY2xhc3MKLSAgICAgKiB3cml0ZXJzIGFyZSBoYXJkIHRvIGJlIHJldXNlZCBzbyBzb21lIGNvZGUgbmVlZHMgdG8gYmUgcmVwZWF0ZWQgKGF0bGVhc3QKLSAgICAgKiBhIGJpdCkKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgbG9hZFRlbXBsYXRlKCkgdGhyb3dzIFNjaGVtYUNvbXBpbGF0aW9uRXhjZXB0aW9uIHsKLQotICAgICAgICAvLyBmaXJzdCBnZXQgdGhlIGxhbmd1YWdlIHNwZWNpZmljIHByb3BlcnR5IG1hcAotICAgICAgICBDbGFzcyBjbGF6eiA9IHRoaXMuZ2V0Q2xhc3MoKTsKLSAgICAgICAgSW5wdXRTdHJlYW0geHNsU3RyZWFtOwotICAgICAgICBTdHJpbmcgdGVtcGxhdGVOYW1lID0gamF2YUJlYW5UZW1wbGF0ZU5hbWU7Ci0gICAgICAgIGlmICh0ZW1wbGF0ZU5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICB4c2xTdHJlYW0gPSBjbGF6ei5nZXRSZXNvdXJjZUFzU3RyZWFtKHRlbXBsYXRlTmFtZSk7Ci0gICAgICAgICAgICAgICAgdGVtcGxhdGVDYWNoZSA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1RlbXBsYXRlcygKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJlYW1Tb3VyY2UoeHNsU3RyZWFtKSk7Ci0gICAgICAgICAgICAgICAgdGVtcGxhdGVMb2FkZWQgPSB0cnVlOwotICAgICAgICAgICAgfSBjYXRjaCAoVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24oU2NoZW1hQ29tcGlsZXJNZXNzYWdlcwotICAgICAgICAgICAgICAgICAgICAgICAgLmdldE1lc3NhZ2UoInNjaGVtYS50ZW1wbGF0ZUxvYWRFeGNlcHRpb24iKSwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24oU2NoZW1hQ29tcGlsZXJNZXNzYWdlcwotICAgICAgICAgICAgICAgICAgICAuZ2V0TWVzc2FnZSgic2NoZW1hLnRlbXBsYXRlTm90Rm91bmRFeGNlcHRpb24iKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBvdXRwdXQgZmlsZQotICAgICAqCi0gICAgICogQHBhcmFtIHBhY2thZ2VOYW1lCi0gICAgICogQHBhcmFtIGZpbGVOYW1lCi0gICAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIEZpbGUgY3JlYXRlT3V0RmlsZShTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyBmaWxlTmFtZSkKLSAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi51dGlsLkZpbGVXcml0ZXIuY3JlYXRlQ2xhc3NGaWxlKHRoaXMucm9vdERpciwKLSAgICAgICAgICAgICAgICBwYWNrYWdlTmFtZSwgZmlsZU5hbWUsICIuamF2YSIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdyaXRlcyB0aGUgb3V0cHV0IGZpbGUKLSAgICAgKgotICAgICAqIEBwYXJhbSBkb2MKLSAgICAgKiBAcGFyYW0gb3V0cHV0RmlsZQotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHBhcnNlKERvY3VtZW50IGRvYywgRmlsZSBvdXRwdXRGaWxlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgT3V0cHV0U3RyZWFtIG91dFN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKG91dHB1dEZpbGUpOwotICAgICAgICBYU0xUVGVtcGxhdGVQcm9jZXNzb3IucGFyc2Uob3V0U3RyZWFtLCBkb2MsIGdldFRyYW5zZm9ybWVyKCkpOwotICAgICAgICBvdXRTdHJlYW0uZmx1c2goKTsKLSAgICAgICAgb3V0U3RyZWFtLmNsb3NlKCk7Ci0KLSAgICAgICAgUHJldHR5UHJpbnRlci5wcmV0dGlmeShvdXRwdXRGaWxlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFRyYW5zZm9ybWVyIGdldFRyYW5zZm9ybWVyKCkgdGhyb3dzIFRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMudGVtcGxhdGVDYWNoZQotICAgICAgICAgICAgICAgICAgICAubmV3VHJhbnNmb3JtZXIoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpewotICAgICAgICAgICAgLy8gVW5kZXIgc29tZSBwZWN1bGlhciBjb25kaXRpb25zIChjbGFzc2xvYWRlciBpc3N1ZXMpLCBqdXN0IHNjcmFwIHRoZSBvbGQgdGVtcGxhdGVDYWNoZSwKLSAgICAgICAgICAgIC8vIGNyZWF0ZSBhIG5ldyBvbmUgYW5kIHRyeSBhZ2Fpbi4KLSAgICAgICAgICAgIGxvYWRUZW1wbGF0ZSgpOwotICAgICAgICAgICAgcmV0dXJuIHRoaXMudGVtcGxhdGVDYWNoZQotICAgICAgICAgICAgICAgICAgICAubmV3VHJhbnNmb3JtZXIoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBhIHByZWZpeCBmb3IgYSBuYW1lc3BhY2UgVVJJLiBUaGlzIG1ldGhvZCB3aWxsIEFMV0FZUyByZXR1cm4gYSB2YWxpZAotICAgICAqIHByZWZpeCAtIGlmIHRoZSBnaXZlbiBVUkkgaXMgYWxyZWFkeSBtYXBwZWQgaW4gdGhpcyBzZXJpYWxpemF0aW9uLCB3ZQotICAgICAqIHJldHVybiB0aGUgcHJldmlvdXMgcHJlZml4LiBJZiBpdCBpcyBub3QgbWFwcGVkLCB3ZSB3aWxsIGFkZCBhIG5ldwotICAgICAqIG1hcHBpbmcgYW5kIHJldHVybiBhIGdlbmVyYXRlZCBwcmVmaXggb2YgdGhlIGZvcm0gIm5zPG51bT4iLgotICAgICAqCi0gICAgICogQHBhcmFtIHVyaSBpcyB0aGUgbmFtZXNwYWNlIHVyaQotICAgICAqIEByZXR1cm4gUmV0dXJucyBwcmVmaXguCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRQcmVmaXhGb3JVUkkoU3RyaW5nIHVyaSkgewotICAgICAgICByZXR1cm4gZ2V0UHJlZml4Rm9yVVJJKHVyaSwgbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTGFzdCB1c2VkIGluZGV4IHN1ZmZpeCBmb3IgIm5zIgotICAgICAqLwotICAgIHByaXZhdGUgaW50IGxhc3RQcmVmaXhJbmRleCA9IDE7Ci0KLSAgICAvKioKLSAgICAgKiBNYXAgb2YgbmFtZXNwYWNlcyBVUkkgdG8gcHJlZml4KGVzKQotICAgICAqLwotICAgIEhhc2hNYXAgbWFwVVJJdG9QcmVmaXggPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgSGFzaE1hcCBtYXBQcmVmaXh0b1VSSSA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYSBwcmVmaXggZm9yIHRoZSBnaXZlbiBuYW1lc3BhY2UgVVJJLiBJZiBvbmUgaGFzIGFscmVhZHkgYmVlbiBkZWZpbmVkCi0gICAgICogaW4gdGhpcyBzZXJpYWxpemF0aW9uLCB1c2UgdGhhdC4gT3RoZXJ3aXNlLCBtYXAgdGhlIHBhc3NlZCBkZWZhdWx0IHByZWZpeAotICAgICAqIHRvIHRoZSBVUkksIGFuZCByZXR1cm4gdGhhdC4gSWYgYSBudWxsIGRlZmF1bHQgcHJlZml4IGlzIHBhc3NlZCwgdXNlIG9uZQotICAgICAqIG9mIHRoZSBmb3JtICJuczxudW0+IgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4Rm9yVVJJKFN0cmluZyB1cmksIFN0cmluZyBkZWZhdWx0UHJlZml4KSB7Ci0gICAgICAgIGlmICgodXJpID09IG51bGwpIHx8ICh1cmkubGVuZ3RoKCkgPT0gMCkpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgU3RyaW5nIHByZWZpeCA9IChTdHJpbmcpIG1hcFVSSXRvUHJlZml4LmdldCh1cmkpOwotICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChkZWZhdWx0UHJlZml4ID09IG51bGwgfHwgZGVmYXVsdFByZWZpeC5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgcHJlZml4ID0gIm5zIiArIGxhc3RQcmVmaXhJbmRleCsrOwotICAgICAgICAgICAgICAgIHdoaWxlIChtYXBQcmVmaXh0b1VSSS5nZXQocHJlZml4KSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9ICJucyIgKyBsYXN0UHJlZml4SW5kZXgrKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHByZWZpeCA9IGRlZmF1bHRQcmVmaXg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXBQcmVmaXh0b1VSSS5wdXQocHJlZml4LCB1cmkpOwotICAgICAgICAgICAgbWFwVVJJdG9QcmVmaXgucHV0KHVyaSwgcHJlZml4KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcHJlZml4OwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldFNob3J0VHlwZU5hbWUoU3RyaW5nIHR5cGVDbGFzc05hbWUpIHsKLSAgICAgICAgaWYgKHR5cGVDbGFzc05hbWUuZW5kc1dpdGgoIltdIikpIHsKLSAgICAgICAgICAgIHR5cGVDbGFzc05hbWUgPSB0eXBlQ2xhc3NOYW1lLnN1YnN0cmluZygwLCB0eXBlQ2xhc3NOYW1lCi0gICAgICAgICAgICAgICAgICAgIC5sYXN0SW5kZXhPZigiWyIpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0eXBlQ2xhc3NOYW1lLnN1YnN0cmluZyh0eXBlQ2xhc3NOYW1lLmxhc3RJbmRleE9mKCIuIikgKyAxLAotICAgICAgICAgICAgICAgIHR5cGVDbGFzc05hbWUubGVuZ3RoKCkpOwotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBtYXBwZXIgY2xhc3MgbmFtZSAtIHRoZXJlIGlzIGdvaW5nIHRvIGJlIG9ubHkgb25lCi0gICAgICogbWFwcGVyIGNsYXNzIGZvciB0aGUgd2hvbGUKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBnZXRGdWxseVF1YWxpZmllZE1hcHBlckNsYXNzTmFtZSgpIHsKLSAgICAgICAgaWYgKHdyYXBDbGFzc2VzIHx8ICF3cml0ZUNsYXNzZXMpIHsKLSAgICAgICAgICAgIHJldHVybiBFWFRFTlNJT05fTUFQUEVSX0NMQVNTTkFNRTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBtYXBwaW5nQ2xhc3NQYWNrYWdlICsgIi4iICsgRVhURU5TSU9OX01BUFBFUl9DTEFTU05BTUU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBnZXQgdGhlIG1hcHBlciBjbGFzcyBwYWNrYWdlIG5hbWUKLSAgICAgKiBNYXkgYmUgaWdub3JlZCBieSB0aGUgaW1wbGVtZW50ZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEV4dGVuc2lvbk1hcHBlclBhY2thZ2VOYW1lKCkgewotICAgICAgICByZXR1cm4gbWFwcGluZ0NsYXNzUGFja2FnZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBtYXBwaW5nIGNsYXNzIG5hbWUgb2YgdGhpcyB3cml0ZXIuIEEgbWFwcGluZyBjbGFzcwotICAgICAqIHBhY2thZ2Ugc2V0IGJ5IHRoZSBvcHRpb25zIG1heSBiZSBvdmVycmlkZGVuIGF0IHRoZSB0aGlzIHBvaW50Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbWFwcGVyUGFja2FnZU5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZWdpc3RlckV4dGVuc2lvbk1hcHBlclBhY2thZ2VOYW1lKFN0cmluZyBtYXBwZXJQYWNrYWdlTmFtZSkgewotICAgICAgICB0aGlzLm1hcHBpbmdDbGFzc1BhY2thZ2UgPSBtYXBwZXJQYWNrYWdlTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZSB0aGUgZXh0ZW5zaW9uIGNsYXNzZXMgLSB0aGlzIGlzIG5lZWRlZCB0byBwcm9jZXNzCi0gICAgICogdGhlIGhpZXJhcmNoeSBvZiBjbGFzc2VzCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWV0YWluZkFycmF5Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgd3JpdGVFeHRlbnNpb25NYXBwZXIoQmVhbldyaXRlck1ldGFJbmZvSG9sZGVyW10gbWV0YWluZkFycmF5KSB0aHJvd3MgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24gewotICAgICAgICAvL2dlbmVyYXRlIHRoZSBlbGVtZW50Ci0gICAgICAgIHRyeSB7Ci0KLQotICAgICAgICAgICAgU3RyaW5nIG1hcHBlckNsYXNzTmFtZSA9IGdldEZ1bGx5UXVhbGlmaWVkTWFwcGVyQ2xhc3NOYW1lKCk7Ci0KLSAgICAgICAgICAgIERvY3VtZW50IG1vZGVsID0gWFNMVFV0aWxzLmdldERvY3VtZW50KCk7Ci0gICAgICAgICAgICBFbGVtZW50IHJvb3RFbHQgPSBYU0xUVXRpbHMuZ2V0RWxlbWVudChtb2RlbCwgIm1hcHBlciIpOwotICAgICAgICAgICAgU3RyaW5nIG1hcHBlck5hbWUgPSBtYXBwZXJDbGFzc05hbWUuc3Vic3RyaW5nKG1hcHBlckNsYXNzTmFtZS5sYXN0SW5kZXhPZigiLiIpICsgMSk7Ci0gICAgICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAibmFtZSIsIG1hcHBlck5hbWUsIHJvb3RFbHQpOwotICAgICAgICAgICAgU3RyaW5nIGJhc2VQYWNrYWdlTmFtZSA9ICIiOwotICAgICAgICAgICAgaWYgKG1hcHBlckNsYXNzTmFtZS5pbmRleE9mKCIuIikgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICBiYXNlUGFja2FnZU5hbWUgPSBtYXBwZXJDbGFzc05hbWUuc3Vic3RyaW5nKDAsIG1hcHBlckNsYXNzTmFtZS5sYXN0SW5kZXhPZigiLiIpKTsKLSAgICAgICAgICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAicGFja2FnZSIsIGJhc2VQYWNrYWdlTmFtZSwgcm9vdEVsdCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJwYWNrYWdlIiwgIiIsIHJvb3RFbHQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIXdyYXBDbGFzc2VzKSB7Ci0gICAgICAgICAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgInVud3JhcHBlZCIsICJ5ZXMiLCByb290RWx0KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCF3cml0ZUNsYXNzZXMpIHsKLSAgICAgICAgICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAic2tpcC13cml0ZSIsICJ5ZXMiLCByb290RWx0KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGlzSGVscGVyTW9kZSkgewotICAgICAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJoZWxwZXJtb2RlIiwgInllcyIsIHJvb3RFbHQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1ldGFpbmZBcnJheS5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIFFOYW1lIG93blFuYW1lID0gbWV0YWluZkFycmF5W2ldLmdldE93blFuYW1lKCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IG1ldGFpbmZBcnJheVtpXS5nZXRPd25DbGFzc05hbWUoKTsKLSAgICAgICAgICAgICAgICAvL2RvICBub3QgYWRkIHdoZW4gdGhlIHFuYW1lIGlzIG5vdCBhdmFpbGJsZQotICAgICAgICAgICAgICAgIGlmIChvd25RbmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgdHlwZUNoaWxkID0gWFNMVFV0aWxzLmFkZENoaWxkRWxlbWVudChtb2RlbCwgInR5cGUiLCByb290RWx0KTsKLSAgICAgICAgICAgICAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgIm5zdXJpIiwgb3duUW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCksIHR5cGVDaGlsZCk7Ci0gICAgICAgICAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJjbGFzc25hbWUiLCBjbGFzc05hbWUgPT0gbnVsbCA/ICIiIDogY2xhc3NOYW1lLCB0eXBlQ2hpbGQpOwotICAgICAgICAgICAgICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAic2hvcnRuYW1lIiwgb3duUW5hbWUgPT0gbnVsbCA/ICIiIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvd25RbmFtZS5nZXRMb2NhbFBhcnQoKSwgdHlwZUNoaWxkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1vZGVsLmFwcGVuZENoaWxkKHJvb3RFbHQpOwotCi0gICAgICAgICAgICBpZiAoIXRlbXBsYXRlTG9hZGVkKSB7Ci0gICAgICAgICAgICAgICAgbG9hZFRlbXBsYXRlKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICh3cmFwQ2xhc3NlcykgewotICAgICAgICAgICAgICAgIHJvb3RFbHQgPSAoRWxlbWVudCkgZ2xvYmFsV3JhcHBlZERvY3VtZW50LmltcG9ydE5vZGUocm9vdEVsdCwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgLy9hZGQgdG8gdGhlIGdsb2JhbCB3cmFwcGVkIGRvY3VtZW50Ci0gICAgICAgICAgICAgICAgZ2xvYmFsV3JhcHBlZERvY3VtZW50LmdldERvY3VtZW50RWxlbWVudCgpLmFwcGVuZENoaWxkKHJvb3RFbHQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAod3JpdGVDbGFzc2VzKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSB0aGUgZmlsZQotICAgICAgICAgICAgICAgICAgICBGaWxlIG91dCA9IGNyZWF0ZU91dEZpbGUoYmFzZVBhY2thZ2VOYW1lLCBtYXBwZXJOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gcGFyc2Ugd2l0aCB0aGUgdGVtcGxhdGUgYW5kIGNyZWF0ZSB0aGUgZmlsZXMKLSAgICAgICAgICAgICAgICAgICAgcGFyc2UobW9kZWwsIG91dCk7Ci0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBhZGQgdGhlIG1vZGVsIHRvIHRoZSBtb2RlbCBtYXAKLSAgICAgICAgICAgICAgICBtb2RlbE1hcC5wdXQobmV3IFFOYW1lKG1hcHBlck5hbWUpLCBtb2RlbCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24oU2NoZW1hQ29tcGlsZXJNZXNzYWdlcy5nZXRNZXNzYWdlKCJzY2hlbWEuZG9jdWVtZW50LmVycm9yIiksIGUpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotCi0KLSAgICB9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi9zdWItYnVpbGQueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vc3ViLWJ1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI4ZGFkZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi9zdWItYnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDEwICswLDAgQEAKLTw/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+Ci0KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3NvYXBlbmNvZGluZy9lbmNvZGluZy54c2QgYi92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0LXJlc291cmNlcy9zb2FwZW5jb2RpbmcvZW5jb2RpbmcueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmQxMTQzLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3NvYXBlbmNvZGluZy9lbmNvZGluZy54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw1MTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotICB+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+Ci08L3hzOnNjaGVtYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0LXJlc291cmNlcy9zb2FwZW5jb2RpbmcveG1sc2NoZW1hLnhzZCBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3NvYXBlbmNvZGluZy94bWxzY2hlbWEueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjhlZDNjLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3NvYXBlbmNvZGluZy94bWxzY2hlbWEueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMzQwICswLDAgQEAKLTw/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+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMvdGVzdHN1aXRlL2Fic3RyYWN0LnhzZCBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3Rlc3RzdWl0ZS9hYnN0cmFjdC54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyNTFhZjIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMvdGVzdHN1aXRlL2Fic3RyYWN0LnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHhzOnNjaGVtYSBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKLSAgICAgICAgICAgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICAgICB4bWxuczp0bnM9Imh0dHA6Ly90ZW1wdXJpLm9yZy9hYnN0cmFjdCIKLSAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvYWJzdHJhY3QiPgotCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0iVGVzdEFic3RyYWN0MSIgdHlwZT0idG5zOlRlc3RBYnN0cmFjdDIiLz4KLSAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iVGVzdEFic3RyYWN0MiIgYWJzdHJhY3Q9InRydWUiPgotICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJwYXJhbTEiIHR5cGU9InhzOnN0cmluZyIvPgotICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgIDwveHM6Y29tcGxleFR5cGU+Ci08L3hzOnNjaGVtYT4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3Rlc3RzdWl0ZS9hbGwueHNkIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMvdGVzdHN1aXRlL2FsbC54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjYTE5NmYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMvdGVzdHN1aXRlL2FsbC54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTx4czpzY2hlbWEgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0gICAgICAgICAgIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgICAgeG1sbnM6dG5zPSJodHRwOi8vdGVtcHVyaS5vcmcvIgotICAgICAgICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iPgotICAgIDx4czplbGVtZW50IG5hbWU9IlVwZGF0ZSI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czphbGw+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgdHlwZT0ieHM6aW50IiBuYW1lPSJpZCIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCB0eXBlPSJ4czpzdHJpbmciIG5hbWU9ImFyZzAiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgdHlwZT0ieHM6Ym9vbGVhbiIgbmFtZT0iYXJnMSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgICAgICAgIDwveHM6YWxsPgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLTwveHM6c2NoZW1hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3Rlc3RzdWl0ZS9hbnl0eXBlLnhzZCBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3Rlc3RzdWl0ZS9hbnl0eXBlLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJjZTgwYy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0LXJlc291cmNlcy90ZXN0c3VpdGUvYW55dHlwZS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotPCEtLQotICB+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+Ci0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3Rlc3RzdWl0ZS9iYXNlNjRiaW5hcnkueHNkIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMvdGVzdHN1aXRlL2Jhc2U2NGJpbmFyeS54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyZWEzM2YuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMvdGVzdHN1aXRlL2Jhc2U2NGJpbmFyeS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTx4czpzY2hlbWEgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICB4bWxuczp4bWltZT0iaHR0cDovL3d3dy53My5vcmcvMjAwNS8wNS94bWxtaW1lIgotICAgICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDUveG1sbWltZSI+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iY29udGVudFR5cGUiPgotICAgICAgICAgICAgICAgIDx4czpzaW1wbGVUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4czptaW5MZW5ndGggdmFsdWU9IjMiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgICAgICAgICAgICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgICAgICAgPC94czphdHRyaWJ1dGU+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZXhwZWN0ZWRDb250ZW50VHlwZXMiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImJhc2U2NEJpbmFyeSI+Ci0gICAgICAgICAgICAgICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmJhc2U2NEJpbmFyeSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgcmVmPSJ4bWltZTpjb250ZW50VHlwZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImhleEJpbmFyeSI+Ci0gICAgICAgICAgICAgICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmhleEJpbmFyeSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgcmVmPSJ4bWltZTpjb250ZW50VHlwZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iVGVzdEJhc2U2NEJpbmFyeSIgdHlwZT0ieG1pbWU6YmFzZTY0QmluYXJ5Ij48L3hzOmVsZW1lbnQ+Ci0gICAgICAgIDx4czplbGVtZW50IG5hbWU9IlRlc3RIZXhCaW5hcnkiIHR5cGU9InhtaW1lOmhleEJpbmFyeSI+PC94czplbGVtZW50PgotICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJCeXRlQXJyYXkiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4czpiYXNlNjRCaW5hcnkiLz4KLQotICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJUZXN0QmFzZTY0TXVsdGlFbGVtZW50Ij4KLSAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InBhcmFtMSIgdHlwZT0ieHM6YmFzZTY0QmluYXJ5Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InBhcmFtMiIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InBhcmFtMyIgdHlwZT0ieHM6aW50Ii8+Ci0gICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgIDwveHM6ZWxlbWVudD4KLQotPC94czpzY2hlbWE+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0LXJlc291cmNlcy90ZXN0c3VpdGUvYm9vbGVhbi54c2QgYi92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0LXJlc291cmNlcy90ZXN0c3VpdGUvYm9vbGVhbi54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1N2I2OTYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMvdGVzdHN1aXRlL2Jvb2xlYW4ueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08eHM6c2NoZW1hIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotICAgICAgICAgICB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgICAgIHhtbG5zOnRucz0iaHR0cDovL3RlbXB1cmkub3JnL2Jvb2xlYW4xIgotICAgICAgICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy9ib29sZWFuMSI+Ci0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJUZXN0Qm9vbGVhbjEiIHR5cGU9InhzOmJvb2xlYW4iLz4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJUZXN0Qm9vbGVhbjIiID4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InBhcmFtMSIgdHlwZT0ieHM6Ym9vbGVhbiIvPgotICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iYXR0cmlidXRlMSIgdHlwZT0ieHM6Ym9vbGVhbiIvPgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLTwveHM6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMvdGVzdHN1aXRlL2Nob2ljZS54c2QgYi92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0LXJlc291cmNlcy90ZXN0c3VpdGUvY2hvaWNlLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVkMDhkYi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0LXJlc291cmNlcy90ZXN0c3VpdGUvY2hvaWNlLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHNjaGVtYSBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKLSAgICAgICAgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgIHhtbG5zOnRucz0ib3JnLmFwYWNoZS5heGlzMi50ZXN0IgotICAgICAgICB4bWxuczp0ZXN0MT0ib3JnLmFwYWNoZS5heGlzMi50ZXN0IgotICAgICAgICB0YXJnZXROYW1lc3BhY2U9Im9yZy5hcGFjaGUuYXhpczIudGVzdCI+Ci0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJUZXN0Q2hvaXNlIiA+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpjaG9pY2U+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iY2hvaWNlMSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iY2hvaWNlMiIgdHlwZT0ieHM6aW50Ii8+Ci0gICAgICAgICAgICA8L3hzOmNob2ljZT4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibXlSb290RWxlbSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJDaGlsZDEiIHR5cGU9InhzZDppbnQiID48L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU29tZUNob2ljZTEiIHR5cGU9InRlc3QxOlNvbWVDaG9pY2UxX1R5cGUiIG5pbGxhYmxlPSJ0cnVlIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU29tZUNob2ljZTIiIHR5cGU9InRlc3QxOlNvbWVDaG9pY2UyX1R5cGUiIG5pbGxhYmxlPSJ0cnVlIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJTb21lQ2hvaWNlMV9UeXBlIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJTb21lQ2hvaWNlMUNoaWxkMSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ0ZXN0MTpTb21lQ2hvaWNlMUNoaWxkMV9UeXBlIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJTb21lQ2hvaWNlMUF0dHIxIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IlZlcnNpb24iIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlNvbWVDaG9pY2UyX1R5cGUiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlNvbWVDaG9pY2UyQ2hpbGQxIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU29tZUNob2ljZTJDaGlsZDIiIHR5cGU9InhzZDppbnQiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iU29tZUNob2ljZTJBdHRyMSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJvcHRpb25hbCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iU29tZUNob2ljZTFDaGlsZDFfVHlwZSI+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwvc2NoZW1hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3Rlc3RzdWl0ZS9jb21wbGV0ZS54c2QgYi92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0LXJlc291cmNlcy90ZXN0c3VpdGUvY29tcGxldGUueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYWEwY2NhLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3Rlc3RzdWl0ZS9jb21wbGV0ZS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwzMzMgKzAsMCBAQAotPCEtLQotICB+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+Ci08L3NjaGVtYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0LXJlc291cmNlcy90ZXN0c3VpdGUvY29tcGxleEV4dGVuc2lvbi54c2QgYi92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0LXJlc291cmNlcy90ZXN0c3VpdGUvY29tcGxleEV4dGVuc2lvbi54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxMTEyMjUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMvdGVzdHN1aXRlL2NvbXBsZXhFeHRlbnNpb24ueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08eHM6c2NoZW1hIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotICAgICAgICAgICB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgICAgIHhtbG5zOnRucz0iaHR0cDovL3RlbXB1cmkub3JnL2NvbXBsZXhleHRlbnNpb24iCi0gICAgICAgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnL2NvbXBsZXhleHRlbnNpb24iPgotCi0gICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IlBhcmVudFR5cGUiPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InBhcmFtMSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iQ2hpbGRUeXBlIj4KLSAgICAgICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ0bnM6UGFyZW50VHlwZSI+Ci0gICAgICAgICAgICAgICAgPHhzOmNob2ljZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0icGFyYW0yIiB0eXBlPSJ4czpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0icGFyYW0zIiB0eXBlPSJ4czppbnQiLz4KLSAgICAgICAgICAgICAgICA8L3hzOmNob2ljZT4KLSAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0iVGVzdENoaWxkRWxlbWVudCIgdHlwZT0idG5zOkNoaWxkVHlwZSIvPgotPC94czpzY2hlbWE+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0LXJlc291cmNlcy90ZXN0c3VpdGUvZGVjaW1hbC54c2QgYi92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0LXJlc291cmNlcy90ZXN0c3VpdGUvZGVjaW1hbC54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3NzlhOTUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMvdGVzdHN1aXRlL2RlY2ltYWwueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08eHNkOnNjaGVtYSBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKLSAgICAgICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgICAgeG1sbnM6dG5zPSJodHRwOi8vdGVtcHVyaS5vcmcvYm9vbGVhbjEiCi0gICAgICAgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnL2Jvb2xlYW4xIj4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQXJyYXlPZkRlY2ltYWwiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiIG5hbWU9ImRlY2ltYWwiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4c2Q6ZGVjaW1hbCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJnZXRIaXN0b3JpY05hdlJlc3BvbnNlIj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0iMSIgbWluT2NjdXJzPSIxIiBuYW1lPSJvdXQiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ0bnM6QXJyYXlPZkRlY2ltYWwiLz4KLSAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8L3hzZDplbGVtZW50PgotPC94c2Q6c2NoZW1hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3Rlc3RzdWl0ZS9kZWZhdWx0X25hbWVzcGFjZXMueHNkIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMvdGVzdHN1aXRlL2RlZmF1bHRfbmFtZXNwYWNlcy54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1MTQzMGUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMvdGVzdHN1aXRlL2RlZmF1bHRfbmFtZXNwYWNlcy54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTx4c2Q6c2NoZW1hIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgICAgICB4bWxuczp0bnM9Imh0dHA6Ly90ZW1wdXJpLm9yZy9kZWZhdWx0bmFtZXBhY2VzIgotICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvZGVmYXVsdG5hbWVwYWNlcyIKLSAgICAgICAgICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIj4KLQotICAgIDwhLS0gZXh0ZW5zaW9uIGNsYXNzIC0tPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJUZXN0U2ltcGxlVW5pb24iPgotICAgICAgICA8eHNkOnVuaW9uIG1lbWJlclR5cGVzPSJ4c2Q6Ym9vbGVhbiB4c2Q6UU5hbWUiLz4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJUZXN0RWxlbWVudDEiIHR5cGU9InRuczpUZXN0UGFyZW50VHlwZSIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVGVzdFBhcmVudFR5cGUiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhcmFtMSIgdHlwZT0ieHNkOlFOYW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFyYW0yIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVGVzdENoaWxkVHlwZSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ0bnM6VGVzdFBhcmVudFR5cGUiPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJhbTMiIHR5cGU9InhzZDpRTmFtZSIvPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFyYW00IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJhbTUiIHR5cGU9InRuczpUZXN0U2ltcGxlVW5pb24iLz4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhdHRyaWJ1dGUxIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYXR0cmlidXRlMiIgdHlwZT0ieHNkOlFOYW1lIi8+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotPC94c2Q6c2NoZW1hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3Rlc3RzdWl0ZS9kZWZhdWx0X3ZhbHVlLnhzZCBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3Rlc3RzdWl0ZS9kZWZhdWx0X3ZhbHVlLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU5YTU0Yi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0LXJlc291cmNlcy90ZXN0c3VpdGUvZGVmYXVsdF92YWx1ZS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTx4czpzY2hlbWEgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0gICAgICAgICAgIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgICAgeG1sbnM6dG5zPSJodHRwOi8vdGVtcHVyaS5vcmcvYm9vbGVhbjEiCi0gICAgICAgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnL2Jvb2xlYW4xIj4KLQotICAgIDx4czplbGVtZW50IG5hbWU9IlRlc3RFbGVtZW50MSIgdHlwZT0ieHM6aW50IiBkZWZhdWx0PSI1NiIvPgotICAgIDx4czplbGVtZW50IG5hbWU9IlRlc3RFbGVtZW50MiIgPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0icGFyYW0xIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9InRlc3QiLz4KLSAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImF0dHJpYnV0ZTEiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9InRydWUiLz4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci08L3hzOnNjaGVtYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0LXJlc291cmNlcy90ZXN0c3VpdGUvZWxlbWVudF9yZWZlcmVuY2VzLnhzZCBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3Rlc3RzdWl0ZS9lbGVtZW50X3JlZmVyZW5jZXMueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjlkZjAwLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3Rlc3RzdWl0ZS9lbGVtZW50X3JlZmVyZW5jZXMueHNkCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotPCEtLQotICB+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+Ci0JPC9jb21wbGV4VHlwZT4KLQotICAgIDxlbGVtZW50IG5hbWU9IlRlc3RTaW1wbGVSZWZlcmVuY2UiIHR5cGU9InRuczpkaXNjYXJkX3RyYW5zZmVyVG9rZW4iLz4KLTwvc2NoZW1hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3Rlc3RzdWl0ZS9lbnVtZXJhdGlvbi54c2QgYi92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0LXJlc291cmNlcy90ZXN0c3VpdGUvZW51bWVyYXRpb24ueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDE2NTY1Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3Rlc3RzdWl0ZS9lbnVtZXJhdGlvbi54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzOnNjaGVtYSBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKLSAgICAgICAgICB4bWxuczpzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgICB4bWxuczp0bnM9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iCi0gICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvIj4KLSAgICA8czplbGVtZW50IG5hbWU9IkNvdW50UGxhY2VzSW5SZWN0Ij4KLSAgICAgICAgPHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8czplbGVtZW50IG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiBuYW1lPSJ1cHBlcmxlZnQiIHR5cGU9InM6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgPHM6ZWxlbWVudCBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgbmFtZT0ibG93ZXJyaWdodCIgdHlwZT0iczpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICA8czplbGVtZW50IG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiBuYW1lPSJwdHlwZSIgdHlwZT0idG5zOlBsYWNlVHlwZSIvPgotICAgICAgICAgICAgPC9zOnNlcXVlbmNlPgotICAgICAgICA8L3M6Y29tcGxleFR5cGU+Ci0gICAgPC9zOmVsZW1lbnQ+Ci0gICAgPHM6c2ltcGxlVHlwZSBuYW1lPSJQbGFjZVR5cGUiPgotICAgICAgICA8czpyZXN0cmljdGlvbiBiYXNlPSJzOnN0cmluZyI+Ci0gICAgICAgICAgICA8czplbnVtZXJhdGlvbiB2YWx1ZT0iVW5rbm93blBsYWNlVHlwZSIvPgotICAgICAgICAgICAgPHM6ZW51bWVyYXRpb24gdmFsdWU9IkFpclJhaWxTdGF0aW9uIi8+Ci0gICAgICAgICAgICA8czplbnVtZXJhdGlvbiB2YWx1ZT0iQmF5R3VsZiIvPgotICAgICAgICAgICAgPHM6ZW51bWVyYXRpb24gdmFsdWU9IkNhcGVQZW5pbnN1bGEiLz4KLSAgICAgICAgICAgIDxzOmVudW1lcmF0aW9uIHZhbHVlPSJDaXR5VG93biIvPgotICAgICAgICAgICAgPHM6ZW51bWVyYXRpb24gdmFsdWU9IkhpbGxNb3VudGFpbiIvPgotICAgICAgICAgICAgPHM6ZW51bWVyYXRpb24gdmFsdWU9IklzbGFuZCIvPgotICAgICAgICAgICAgPHM6ZW51bWVyYXRpb24gdmFsdWU9Ikxha2UiLz4KLSAgICAgICAgICAgIDxzOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlckxhbmRGZWF0dXJlIi8+Ci0gICAgICAgICAgICA8czplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJXYXRlckZlYXR1cmUiLz4KLSAgICAgICAgICAgIDxzOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJrQmVhY2giLz4KLSAgICAgICAgICAgIDxzOmVudW1lcmF0aW9uIHZhbHVlPSJQb2ludE9mSW50ZXJlc3QiLz4KLSAgICAgICAgICAgIDxzOmVudW1lcmF0aW9uIHZhbHVlPSJSaXZlciIvPgotICAgICAgICA8L3M6cmVzdHJpY3Rpb24+Ci0gICAgPC9zOnNpbXBsZVR5cGU+Ci08L3M6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMvdGVzdHN1aXRlL2V4dGVuc2lvbnMueHNkIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMvdGVzdHN1aXRlL2V4dGVuc2lvbnMueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjljZmEzLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3Rlc3RzdWl0ZS9leHRlbnNpb25zLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+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+Ci0gICAgCi0KLTwvc2NoZW1hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3Rlc3RzdWl0ZS9ncm91cHMueHNkIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMvdGVzdHN1aXRlL2dyb3Vwcy54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzMWZhNmQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMvdGVzdHN1aXRlL2dyb3Vwcy54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotPCEtLQotICB+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+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6VGVzdE5lc3RlZEF0dHJpYnV0ZUdyb3VwIiAvPgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLSAgICA8eHM6YXR0cmlidXRlR3JvdXAgbmFtZT0iVGVzdE5lc3RlZEF0dHJpYnV0ZUdyb3VwIj4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJhdHRyaWJ1dGUyIiB0eXBlPSJ4czpzdHJpbmciLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOlRlc3RBdHRyaWJ1dGVHcm91cCIgLz4KLSAgICA8L3hzOmF0dHJpYnV0ZUdyb3VwPgotCi08L3NjaGVtYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0LXJlc291cmNlcy90ZXN0c3VpdGUvaW5uZXJQYXJ0aWNsZUV4dGVuc2lvbi54c2QgYi92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0LXJlc291cmNlcy90ZXN0c3VpdGUvaW5uZXJQYXJ0aWNsZUV4dGVuc2lvbi54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhZTEyYWUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMvdGVzdHN1aXRlL2lubmVyUGFydGljbGVFeHRlbnNpb24ueHNkCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08czpzY2hlbWEgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0gICAgICAgICAgeG1sbnM6cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgICB4bWxuczp0bnM9Imh0dHA6Ly90ZW1wdXJpLm9yZy9pbm5lcnBhcnRpY2FsZXh0ZW5zaW9uIgotICAgICAgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnL2lubmVycGFydGljYWxleHRlbnNpb24iPgotCi0gICAgPHM6Y29tcGxleFR5cGUgbmFtZT0iUGFyZW50VHlwZSI+Ci0gICAgICAgIDxzOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgIDxzOmVsZW1lbnQgbmFtZT0icGFyYW0xIiB0eXBlPSJzOnN0cmluZyIvPgotICAgICAgICAgICAgPHM6ZWxlbWVudCBuYW1lPSJwYXJhbTIiIHR5cGU9InM6c3RyaW5nIi8+Ci0gICAgICAgIDwvczpjaG9pY2U+Ci0gICAgPC9zOmNvbXBsZXhUeXBlPgotICAgIDxzOmVsZW1lbnQgbmFtZT0iVGVzdEVsZW1lbnQiPgotICAgICAgICA8czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDxzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDxzOmVsZW1lbnQgbmFtZT0iQ2hpbGRFbGVtZW50IiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHM6ZXh0ZW5zaW9uIGJhc2U9InRuczpQYXJlbnRUeXBlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHM6YXR0cmlidXRlIG5hbWU9InRlc3RBdHRyaWJ1dGUiIHR5cGU9InM6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zOmV4dGVuc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvczpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgPC9zOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgIDwvczplbGVtZW50PgotICAgICAgICAgICAgPC9zOnNlcXVlbmNlPgotICAgICAgICA8L3M6Y29tcGxleFR5cGU+Ci0gICAgPC9zOmVsZW1lbnQ+Ci08L3M6c2NoZW1hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3Rlc3RzdWl0ZS9pbm5lclBhcnRpY2xlcy54c2QgYi92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0LXJlc291cmNlcy90ZXN0c3VpdGUvaW5uZXJQYXJ0aWNsZXMueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWE2MmI0Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3Rlc3RzdWl0ZS9pbm5lclBhcnRpY2xlcy54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotICB+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+Ci0gICAgPC94c2Q6ZWxlbWVudD4KLQotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJUZXN0Q29tcGxleFR5cGVFbGVtZW50IiB0eXBlPSJ0ZXN0MTpUZXN0Q29tcGxleFR5cGUiLz4KLQotPC94c2Q6c2NoZW1hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3Rlc3RzdWl0ZS9pbm5lcnNlcXVlbmNlX2Nob2ljZS54c2QgYi92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0LXJlc291cmNlcy90ZXN0c3VpdGUvaW5uZXJzZXF1ZW5jZV9jaG9pY2UueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNGQzYzUwLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3Rlc3RzdWl0ZS9pbm5lcnNlcXVlbmNlX2Nob2ljZS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzY2hlbWEgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0gICAgICAgIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICB4bWxuczp0bnM9Im9yZy5hcGFjaGUuYXhpczIudGVzdCIKLSAgICAgICAgeG1sbnM6dGVzdDE9Im9yZy5hcGFjaGUuYXhpczIudGVzdCIKLSAgICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuYXBhY2hlLmF4aXMyLnRlc3QiPgotCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0iVGVzdElubmVyU2VxdWVuY2UxIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InNlcXVlbmNlMSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ic2VxdWVuY2UyIiB0eXBlPSJ4czppbnQiLz4KLSAgICAgICAgICAgICAgICA8eHM6Y2hvaWNlPgotICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJjaG9pY2UxIiB0eXBlPSJ4czpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iY2hvaWNlMiIgdHlwZT0ieHM6aW50Ii8+Ci0gICAgICAgICAgICAgICAgPC94czpjaG9pY2U+Ci0gICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLQotICAgIDx4czplbGVtZW50IG5hbWU9IlRlc3RJbm5lclNlcXVlbmNlMiI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJzZXF1ZW5jZTEiIHR5cGU9InhzOnN0cmluZyIvPgotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InNlcXVlbmNlMiIgdHlwZT0ieHM6aW50Ii8+Ci0gICAgICAgICAgICAgICAgPHhzOmNob2ljZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iY2hvaWNlMSIgdHlwZT0ieHM6c3RyaW5nIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJjaG9pY2UyIiB0eXBlPSJ4czppbnQiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICAgICAgPC94czpjaG9pY2U+Ci0gICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLQotICAgIDx4czplbGVtZW50IG5hbWU9IlRlc3RJbm5lclNlcXVlbmNlMyI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJzZXF1ZW5jZTEiIHR5cGU9InhzOnN0cmluZyIvPgotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InNlcXVlbmNlMiIgdHlwZT0ieHM6aW50Ii8+Ci0gICAgICAgICAgICAgICAgPHhzOmNob2ljZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iY2hvaWNlMSIgdHlwZT0ieHM6c3RyaW5nIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmlsbGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iY2hvaWNlMiIgdHlwZT0ieHM6aW50IiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmlsbGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgICA8L3hzOmNob2ljZT4KLSAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotCi08L3NjaGVtYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0LXJlc291cmNlcy90ZXN0c3VpdGUvbGlzdC54c2QgYi92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0LXJlc291cmNlcy90ZXN0c3VpdGUvbGlzdC54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkZjM4NWYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMvdGVzdHN1aXRlL2xpc3QueHNkCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08c2NoZW1hIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotICAgICAgICB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgeG1sbnM6dG5zPSJvcmcuYXBhY2hlLmF4aXMyLnRlc3QiCi0gICAgICAgIHRhcmdldE5hbWVzcGFjZT0ib3JnLmFwYWNoZS5heGlzMi50ZXN0Ij4KLQotICAgIDx4czpzaW1wbGVUeXBlIG5hbWU9IlRlc3RMaXN0UU5hbWUiPgotICAgICAgICA8eHM6bGlzdCBpdGVtVHlwZT0ieHM6UU5hbWUiPjwveHM6bGlzdD4KLSAgICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJUZXN0TGlzdFFOYW1lRWxlbWVudCIgdHlwZT0idG5zOlRlc3RMaXN0UU5hbWUiLz4KLQotICAgIDx4czpzaW1wbGVUeXBlIG5hbWU9IlRlc3RMaXN0U3RyaW5nIj4KLSAgICAgICAgPHhzOmxpc3QgaXRlbVR5cGU9InhzOnN0cmluZyI+PC94czpsaXN0PgotICAgIDwveHM6c2ltcGxlVHlwZT4KLQotICAgIDx4czplbGVtZW50IG5hbWU9IlRlc3RMaXN0U3RyaW5nRWxlbWVudCIgdHlwZT0idG5zOlRlc3RMaXN0U3RyaW5nIi8+Ci0KLSAgICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJUZXN0U3RyaW5nIj4KLSAgICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHM6cGF0dGVybiB2YWx1ZT0iW0Etel0qIj48L3hzOnBhdHRlcm4+Ci0gICAgICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICAgPC94czpzaW1wbGVUeXBlPgotCi0gICAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iVGVzdExpc3RPdXJzIj4KLSAgICAgICAgPHhzOmxpc3QgaXRlbVR5cGU9InRuczpUZXN0U3RyaW5nIi8+Ci0gICAgPC94czpzaW1wbGVUeXBlPgotCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0iVGVzdExpc3RPdXJzRWxlbWVudCIgdHlwZT0idG5zOlRlc3RMaXN0T3VycyIvPgotCi0gICAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iU3VwZXJUZXN0TGlzdFN0cmluZyI+Ci0gICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ0bnM6VGVzdExpc3RTdHJpbmciLz4KLSAgICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJUZXN0TGlzdEludCI+Ci0gICAgICAgIDx4czpsaXN0IGl0ZW1UeXBlPSJ4czppbnQiPjwveHM6bGlzdD4KLSAgICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJTdXBlclRlc3RMaXN0U3RyaW5nRWxlbWVudCIgdHlwZT0idG5zOlN1cGVyVGVzdExpc3RTdHJpbmciLz4KLQotICAgIDx4czpzaW1wbGVUeXBlIG5hbWU9IklubmVyTGlzdFNpbXBsZVR5cGUiPgotICAgICAgICA8eHM6bGlzdD4KLSAgICAgICAgICAgIDx4czpzaW1wbGVUeXBlPgotICAgICAgICAgICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkV4aXN0Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjZXNzIi8+Ci0gICAgICAgICAgICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICAgICAgICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgICAgICAgPC94czpsaXN0PgotICAgIDwveHM6c2ltcGxlVHlwZT4KLQotICAgIDx4czplbGVtZW50IG5hbWU9IlRlc3RJbm5lckxpc3RTaW1wbGVUeXBlIiB0eXBlPSJ0bnM6SW5uZXJMaXN0U2ltcGxlVHlwZSIvPgotCi08L3NjaGVtYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0LXJlc291cmNlcy90ZXN0c3VpdGUvcGFydGljYWxNYXhPY2N1cmVzLnhzZCBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3Rlc3RzdWl0ZS9wYXJ0aWNhbE1heE9jY3VyZXMueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjIwNTU3Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3Rlc3RzdWl0ZS9wYXJ0aWNhbE1heE9jY3VyZXMueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLTw/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+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMvdGVzdHN1aXRlL3JhbXBhcnQueHNkIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMvdGVzdHN1aXRlL3JhbXBhcnQueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDFhZjIzLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3Rlc3RzdWl0ZS9yYW1wYXJ0LnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHhzOnNjaGVtYSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgICAgIHhtbG5zOnhtaW1lPSJodHRwOi8vd3d3LnczLm9yZy8yMDA1LzA1L3htbG1pbWUiCi0gICAgICAgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy53My5vcmcvMjAwNS8wNS94bWxtaW1lIj4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImNvbnRlbnRUeXBlIj4KLSAgICAgICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICA8eHM6bWluTGVuZ3RoIHZhbHVlPSIzIi8+Ci0gICAgICAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgICAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gICAgPC94czphdHRyaWJ1dGU+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJleHBlY3RlZENvbnRlbnRUeXBlcyIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0gICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImJhc2U2NEJpbmFyeSI+Ci0gICAgICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpiYXNlNjRCaW5hcnkiPgotICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgcmVmPSJ4bWltZTpjb250ZW50VHlwZSIvPgotICAgICAgICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJoZXhCaW5hcnkiPgotICAgICAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6aGV4QmluYXJ5Ij4KLSAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIHJlZj0ieG1pbWU6Y29udGVudFR5cGUiLz4KLSAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJUZXN0RXh0ZW5zaW9uIiB0eXBlPSJ4bWltZTpiYXNlNjRCaW5hcnkiLz4KLTwveHM6c2NoZW1hPgotCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0LXJlc291cmNlcy90ZXN0c3VpdGUvcmVzdHJpY3Rpb25zLnhzZCBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3Rlc3RzdWl0ZS9yZXN0cmljdGlvbnMueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDdlNjJmLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3Rlc3RzdWl0ZS9yZXN0cmljdGlvbnMueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMjEwICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+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+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMvdGVzdHN1aXRlL3NvYXBlbmNvZGluZy54c2QgYi92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0LXJlc291cmNlcy90ZXN0c3VpdGUvc29hcGVuY29kaW5nLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I1NGQ1Mi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0LXJlc291cmNlcy90ZXN0c3VpdGUvc29hcGVuY29kaW5nLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHM6c2NoZW1hIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotICAgICAgICAgIHhtbG5zOnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgICAgeG1sbnM6c29hcGVuYz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iCi0gICAgICAgICAgeG1sbnM6czA9Imh0dHA6Ly90ZW1wdXJpLm9yZy9zb2FwZW5jb2RpbmciCi0gICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvc29hcGVuY29kaW5nIj4KLQotICAgIDxzOmVsZW1lbnQgbmFtZT0iVGVzdFNvYXBFbGVtZW50MSIgdHlwZT0ic29hcGVuYzpBcnJheSIvPgotICAgIDxzOmVsZW1lbnQgbmFtZT0iVGVzdFNvYXBFbGVtZW50MiI+Ci0gICAgICAgIDxzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHM6ZWxlbWVudCBuYW1lPSJwYXJhbTEiIHR5cGU9InM6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgPHM6ZWxlbWVudCBuYW1lPSJwYXJhbTIiIHR5cGU9InNvYXBlbmM6QXJyYXkiLz4KLSAgICAgICAgICAgIDwvczpzZXF1ZW5jZT4KLSAgICAgICAgPC9zOmNvbXBsZXhUeXBlPgotICAgIDwvczplbGVtZW50PgotICAgIDxzOmNvbXBsZXhUeXBlIG5hbWU9IlRlc3RDb21wbGV4VHlwZSI+Ci0gICAgICAgIDxzOnNlcXVlbmNlPgotICAgICAgICAgICAgPHM6ZWxlbWVudCBuYW1lPSJwYXJhbTEiIHR5cGU9InM6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8czplbGVtZW50IG5hbWU9InBhcmFtMiIgdHlwZT0iczppbnQiLz4KLSAgICAgICAgPC9zOnNlcXVlbmNlPgotICAgIDwvczpjb21wbGV4VHlwZT4KLQotPC9zOnNjaGVtYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0LXJlc291cmNlcy90ZXN0c3VpdGUvdGVzdGF0dHJpYnV0ZS54c2QgYi92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0LXJlc291cmNlcy90ZXN0c3VpdGUvdGVzdGF0dHJpYnV0ZS54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2MDg2MjAuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMvdGVzdHN1aXRlL3Rlc3RhdHRyaWJ1dGUueHNkCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08eHM6c2NoZW1hIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotICAgICAgICAgICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotICAgICAgICAgICB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgICAgIHhtbG5zOnRucz0iaHR0cDovL3RlbXB1cmkub3JnL2F0dHJpYnV0ZSIKLSAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvYXR0cmlidXRlIj4KLQotICAgIDx4czplbGVtZW50IG5hbWU9IlRlc3RFbGVtZW50MSI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iYXR0cmlidXRlMSIgdHlwZT0ieHM6aW50Ii8+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIDx4czplbGVtZW50IG5hbWU9IlRlc3RFbGVtZW50MiI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iYXR0cmlidXRlMSIgdHlwZT0ieHM6aW50IiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIDx4czplbGVtZW50IG5hbWU9IlRlc3RFbGVtZW50MyI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iYXR0cmlidXRlMSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIDx4czplbGVtZW50IG5hbWU9IlRlc3RFbGVtZW50NCI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iYXR0cmlidXRlMSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIDx4czplbGVtZW50IG5hbWU9IlRlc3RBdHRyaWJ1dGVTaW1wbGVUeXBlIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJhdHRyaWJ1dGUxIj4KLSAgICAgICAgICAgICAgICA8eHM6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyIvPgotICAgICAgICAgICAgICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLQotICAgIDx4czplbGVtZW50IG5hbWU9IlRlc3RBdHRyaWJ1dGVSZWZlcmVuY2VFbGVtZW50IiB0eXBlPSJ0bnM6VGVzdEF0dHJpYnV0ZVJlZmVyZW5jZVR5cGUiLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9IlRlc3RBdHRyaWJ1dGUxIiB0eXBlPSJ4czpzdHJpbmciLz4KLSAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iVGVzdEF0dHJpYnV0ZVJlZmVyZW5jZVR5cGUiPgotICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJwYXJhbTEiIHR5cGU9InhzOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0icGFyYW0yIiB0eXBlPSJ4czpzdHJpbmciLz4KLSAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSB1c2U9Im9wdGlvbmFsIiByZWY9InRuczpUZXN0QXR0cmlidXRlMSIvPgotICAgIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9IlR5cGUiPgotICAgICAgICA8eHM6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotICAgICAgICAgICAgICAgIDx4czpwYXR0ZXJuIHZhbHVlPSJTdHJpbmd8QmFzZTY0Ii8+Ci0gICAgICAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgICAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gICAgPC94czphdHRyaWJ1dGU+Ci0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJUZXN0VHlwZUVsZW1lbnQiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIHJlZj0idG5zOlR5cGUiLz4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0KLTwveHM6c2NoZW1hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3Rlc3RzdWl0ZS91bmlvbi54c2QgYi92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0LXJlc291cmNlcy90ZXN0c3VpdGUvdW5pb24ueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjM4NWEwLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3Rlc3RzdWl0ZS91bmlvbi54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzOnNjaGVtYSBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKLSAgICAgICAgICB4bWxuczpzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICAgIHhtbG5zOnMwPSJodHRwOi8vdGVtcHVyaS5vcmcvdW5pb24iCi0gICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvdW5pb24iPgotICAgIDxzOmltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIi8+Ci0KLSAgICA8czpzaW1wbGVUeXBlIG5hbWU9IkZvb0VudW0iPgotICAgICAgICA8czpyZXN0cmljdGlvbiBiYXNlPSJzOmFueVVSSSI+Ci0gICAgICAgICAgICA8czplbnVtZXJhdGlvbiB2YWx1ZT0iaHR0cDovL0EiLz4KLSAgICAgICAgICAgIDxzOmVudW1lcmF0aW9uIHZhbHVlPSJodHRwOi8vQiIvPgotICAgICAgICAgICAgPHM6ZW51bWVyYXRpb24gdmFsdWU9Imh0dHA6Ly9DIi8+Ci0gICAgICAgIDwvczpyZXN0cmljdGlvbj4KLSAgICA8L3M6c2ltcGxlVHlwZT4KLSAgICA8czpzaW1wbGVUeXBlIG5hbWU9IkZvb09wZW5FbnVtIj4KLSAgICAgICAgPHM6dW5pb24gbWVtYmVyVHlwZXM9InMwOkZvb0VudW0gczphbnlVUkkiLz4KLSAgICA8L3M6c2ltcGxlVHlwZT4KLSAgICA8czpzaW1wbGVUeXBlIG5hbWU9IkRhdGVPckRhdGVUaW1lVHlwZSI+Ci0gICAgICAgIDxzOnVuaW9uIG1lbWJlclR5cGVzPSJzOmJvb2xlYW4gczppbnQgczpkYXRlIHM6ZGF0ZVRpbWUiLz4KLSAgICA8L3M6c2ltcGxlVHlwZT4KLSAgICA8czplbGVtZW50IG5hbWU9IlJlY29yZDEiPgotICAgICAgICA8czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDxzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDxzOmVsZW1lbnQgbmFtZT0iZWxlbTEiIHR5cGU9InMwOkZvb09wZW5FbnVtIi8+Ci0gICAgICAgICAgICA8L3M6c2VxdWVuY2U+Ci0gICAgICAgIDwvczpjb21wbGV4VHlwZT4KLSAgICA8L3M6ZWxlbWVudD4KLSAgICA8czplbGVtZW50IG5hbWU9IlJlY29yZDIiPgotICAgICAgICA8czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDxzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDxzOmVsZW1lbnQgbmFtZT0iZWxlbTEiIHR5cGU9InMwOkRhdGVPckRhdGVUaW1lVHlwZSIvPgotICAgICAgICAgICAgPC9zOnNlcXVlbmNlPgotICAgICAgICA8L3M6Y29tcGxleFR5cGU+Ci0gICAgPC9zOmVsZW1lbnQ+Ci0gICAgPHM6c2ltcGxlVHlwZSBuYW1lPSJVbmlvblFOYW1lVGVzdCI+Ci0gICAgICAgIDxzOnVuaW9uIG1lbWJlclR5cGVzPSJzOlFOYW1lIHM6c3RyaW5nIi8+Ci0gICAgPC9zOnNpbXBsZVR5cGU+Ci0gICAgPHM6ZWxlbWVudCBuYW1lPSJVbmlvblFOYW1lVGVzdEVsZW1lbnQiIHR5cGU9InMwOlVuaW9uUU5hbWVUZXN0Ii8+Ci0KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iUGFja2luZ1R5cGVfVCI+Ci0gICAgICAgIDx4c2Q6dW5pb24+Ci0gICAgICAgICAgICA8eHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpwYXR0ZXJuIHZhbHVlPSJNSU5PUl8oW2Etel18W0EtWl18WzAtOV18KF98LSkpKiIvPgotICAgICAgICAgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgICAgICAgICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgIDx4c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnBhdHRlcm4gdmFsdWU9IlBST1BfKFthLXpdfFtBLVpdfFswLTldfChffC0pKSoiLz4KLSAgICAgICAgICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICAgICAgICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICA8eHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTk9fUEFDS0lORyIvPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJaSVAiLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVEFSIi8+Ci0gICAgICAgICAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgICAgICAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgICAgICA8L3hzZDp1bmlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gICAgPHM6ZWxlbWVudCBuYW1lPSJUZXN0SW5uZXJVbmlvblR5cGUiIHR5cGU9InMwOlBhY2tpbmdUeXBlX1QiLz4KLQotCi08L3M6c2NoZW1hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3Rlc3RzdWl0ZS91bmlvbjIueHNkIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMvdGVzdHN1aXRlL3VuaW9uMi54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3MjdiMzkuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMvdGVzdHN1aXRlL3VuaW9uMi54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzOnNjaGVtYSBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKLSAgICAgICAgICB4bWxuczpzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICAgIHhtbG5zOnRucz0iaHR0cDovL3RlbXB1cmkub3JnL3VuaW9uMiIKLSAgICAgICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy91bmlvbjIiPgotCi0gICAgPHM6c2ltcGxlVHlwZSBuYW1lPSJUZXN0VW5pb24xIj4KLSAgICAgICAgPHM6dW5pb24gbWVtYmVyVHlwZXM9InM6c3RyaW5nIHM6Ym9vbGVhbiB0bnM6VGVzdFJlc3RyaWN0aW9uIi8+Ci0gICAgPC9zOnNpbXBsZVR5cGU+Ci0gICAgPHM6c2ltcGxlVHlwZSBuYW1lPSJUZXN0UmVzdHJpY3Rpb24iPgotICAgICAgICA8czpyZXN0cmljdGlvbiBiYXNlPSJzOnN0cmluZyI+Ci0gICAgICAgIDwvczpyZXN0cmljdGlvbj4KLSAgICA8L3M6c2ltcGxlVHlwZT4KLSAgICA8czplbGVtZW50IG5hbWU9IlRlc3RVbmlvbkVsZW1lbnQxIiB0eXBlPSJ0bnM6VGVzdFVuaW9uMSIvPgotICAgIDxzOmVsZW1lbnQgbmFtZT0iVGVzdFVuaW9uRWxlbWVudDIiPgotICAgICAgICA8czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDxzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDxzOmVsZW1lbnQgbmFtZT0icGFyYW0xIiB0eXBlPSJ0bnM6VGVzdFVuaW9uMSIvPgotICAgICAgICAgICAgPC9zOnNlcXVlbmNlPgotICAgICAgICAgICAgPHM6YXR0cmlidXRlIG5hbWU9ImF0dHJpYnV0ZTEiIHR5cGU9InRuczpUZXN0VW5pb24xIi8+Ci0gICAgICAgIDwvczpjb21wbGV4VHlwZT4KLSAgICA8L3M6ZWxlbWVudD4KLSAgICA8czpzaW1wbGVUeXBlIG5hbWU9IlRlc3RMaXN0MSI+Ci0gICAgICAgIDxzOmxpc3QgaXRlbVR5cGU9InM6c3RyaW5nIi8+Ci0gICAgPC9zOnNpbXBsZVR5cGU+Ci0gICAgPHM6ZWxlbWVudCBuYW1lPSJUZXN0TGlzdEVsZW1lbnQxIj4KLSAgICAgICAgPHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8czplbGVtZW50IG5hbWU9InBhcmFtMSIgdHlwZT0idG5zOlRlc3RMaXN0MSIvPgotICAgICAgICAgICAgPC9zOnNlcXVlbmNlPgotICAgICAgICAgICAgPHM6YXR0cmlidXRlIG5hbWU9ImF0dHJpYnV0ZTEiIHR5cGU9InRuczpUZXN0TGlzdDEiLz4KLSAgICAgICAgPC9zOmNvbXBsZXhUeXBlPgotICAgIDwvczplbGVtZW50PgotICAgIDxzOmVsZW1lbnQgbmFtZT0iVGVzdEZ1enp5RGF0ZVR5cGUiIHR5cGU9InRuczpmdXp6eURhdGVUeXBlIi8+Ci0gICAgPHM6c2ltcGxlVHlwZSBuYW1lPSJmdXp6eURhdGVUeXBlIj4KLSAgICAgICAgPHM6dW5pb24gbWVtYmVyVHlwZXM9InM6ZGF0ZSBzOmRhdGVUaW1lIHM6Z1llYXIgczpnWWVhck1vbnRoIj4KLSAgICAgICAgPC9zOnVuaW9uPgotICAgIDwvczpzaW1wbGVUeXBlPgotCi0gICAgPHM6ZWxlbWVudCBuYW1lPSJUZXN0RWxlbWVudCI+Ci0gICAgICAgIDxzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICA8czplbGVtZW50IG5hbWU9ImNyZWF0aW9uRGF0ZSIgdHlwZT0iczpzdHJpbmciLz4KLSAgICAgICAgICAgICAgIDxzOmVsZW1lbnQgbmFtZT0iQ3JlYXRpb25EYXRlIiB0eXBlPSJzOnN0cmluZyIvPiAKLSAgICAgICAgICAgIDwvczpzZXF1ZW5jZT4KLSAgICAgICAgPC9zOmNvbXBsZXhUeXBlPgotICAgIDwvczplbGVtZW50PgotCi08L3M6c2NoZW1hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3hzZC9hbm9ueW1vdXNfY29tcGxleFR5cGUueHNkIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMveHNkL2Fub255bW91c19jb21wbGV4VHlwZS54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwMjQ3ZTcuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMveHNkL2Fub255bW91c19jb21wbGV4VHlwZS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzY2hlbWEgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICB4bWxuczp0bnM9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcxL3R5cGVzIgotICAgICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcxL3R5cGVzIgotICAgICAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+Ci0gICAgPGVsZW1lbnQgbmFtZT0idGVtcEVsdCI+Ci0gICAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ2YXJTdHJpbmciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ2YXJJbnQiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ2YXJGbG9hdCIgdHlwZT0ieHNkOmZsb2F0Ii8+Ci0gICAgICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICA8L2NvbXBsZXhUeXBlPgotICAgIDwvZWxlbWVudD4KLTwvc2NoZW1hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3hzZC9jb21wbGV4LW1pbm9jY3VyczAueHNkIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMveHNkL2NvbXBsZXgtbWlub2NjdXJzMC54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiNGMwMGMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMveHNkL2NvbXBsZXgtbWlub2NjdXJzMC54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTx4czpzY2hlbWEgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKLSAgICAgICAgICAgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIgotICAgICAgICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZXN0MS5vcmciCi0gICAgICAgICAgIHhtbG5zOnRucz0iaHR0cDovL3Rlc3QxLm9yZyI+Ci0JPHhzOmVsZW1lbnQgbmFtZT0icm9vdCI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJjaXR5IiB0eXBlPSJ4czpzdHJpbmciLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJwZXJzb24iIHR5cGU9InRuczpwZXJzb25UeXBlIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJhZGRyZXNzIiB0eXBlPSJ0bnM6YWRkcmVzc1R5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJwZXJzb25UeXBlIj4KLSAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJhZ2UiIHR5cGU9InhzOmludCIvPgotICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImFkZHJlc3NUeXBlIj4KLSAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ic3RyZWV0TmFtZSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJzdHJlZXRObyIgdHlwZT0ieHM6aW50Ii8+Ci0gICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLTwveHM6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMveHNkL2NvbXBsZXhfYWxsLnhzZCBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3hzZC9jb21wbGV4X2FsbC54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwNjM3ZDkuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMveHNkL2NvbXBsZXhfYWxsLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHM6c2NoZW1hIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cuc3RyaWtlaXJvbi5jb20iIHhtbG5zOnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczpzMD0iaHR0cDovL3d3dy5zdHJpa2Vpcm9uLmNvbSI+Ci0gICAgICA8czplbGVtZW50IG5hbWU9IkdldFF1b3RlcyI+Ci0gICAgICAgIDxzOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDxzOnNlcXVlbmNlPgotICAgICAgICAgICAgPHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0iVGlja2VyU3ltYm9sTGlzdCIgdHlwZT0iczpzdHJpbmciIC8+Ci0gICAgICAgICAgPC9zOnNlcXVlbmNlPgotICAgICAgICA8L3M6Y29tcGxleFR5cGU+Ci0KLSAgICAgIDwvczplbGVtZW50PgotICAgICAgPHM6ZWxlbWVudCBuYW1lPSJHZXRRdW90ZXNSZXNwb25zZSI+Ci0gICAgICAgIDxzOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDxzOnNlcXVlbmNlPgotICAgICAgICAgICAgPHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0iR2V0UXVvdGVzUmVzdWx0IiB0eXBlPSJzMDpBcnJheU9mUmVhbFF1b3RlIiAvPgotICAgICAgICAgIDwvczpzZXF1ZW5jZT4KLSAgICAgICAgPC9zOmNvbXBsZXhUeXBlPgotICAgICAgPC9zOmVsZW1lbnQ+Ci0gICAgICA8czpjb21wbGV4VHlwZSBuYW1lPSJBcnJheU9mUmVhbFF1b3RlIj4KLQotICAgICAgICA8czpzZXF1ZW5jZT4KLSAgICAgICAgICA8czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9IlJlYWxRdW90ZSIgbmlsbGFibGU9InRydWUiIHR5cGU9InMwOlJlYWxRdW90ZSIgLz4KLSAgICAgICAgPC9zOnNlcXVlbmNlPgotICAgICAgPC9zOmNvbXBsZXhUeXBlPgotICAgICAgPHM6Y29tcGxleFR5cGUgbmFtZT0iUmVhbFF1b3RlIj4KLSAgICAgICAgPHM6c2VxdWVuY2U+Ci0gICAgICAgICAgPHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0iU3ltYm9sIiB0eXBlPSJzOnN0cmluZyIgLz4KLSAgICAgICAgICA8czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJDVVNJUCIgdHlwZT0iczpzdHJpbmciIC8+Ci0gICAgICAgICAgPHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0iQ0lLIiB0eXBlPSJzOnN0cmluZyIgLz4KLSAgICAgICAgICA8czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJOYW1lIiB0eXBlPSJzOnN0cmluZyIgLz4KLSAgICAgICAgICA8czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJEYXRlIiB0eXBlPSJzOnN0cmluZyIgLz4KLSAgICAgICAgICA8czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJUaW1lIiB0eXBlPSJzOnN0cmluZyIgLz4KLSAgICAgICAgICA8czplbGVtZW50IG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiBuYW1lPSJMYXN0IiB0eXBlPSJzOmRvdWJsZSIgLz4KLSAgICAgICAgICA8czplbGVtZW50IG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiBuYW1lPSJRdWFudGl0eSIgdHlwZT0iczppbnQiIC8+Ci0gICAgICAgICAgPHM6ZWxlbWVudCBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgbmFtZT0iQ2hhbmdlRnJvbVByZXZpb3VzIiB0eXBlPSJzOmRvdWJsZSIgLz4KLSAgICAgICAgICA8czplbGVtZW50IG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiBuYW1lPSJQZXJjZW50Q2hhbmdlRnJvbVByZXZpb3VzIiB0eXBlPSJzOmRvdWJsZSIgLz4KLSAgICAgICAgICA8czplbGVtZW50IG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiBuYW1lPSJPcGVuIiB0eXBlPSJzOmRvdWJsZSIgLz4KLSAgICAgICAgICA8czplbGVtZW50IG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiBuYW1lPSJDaGFuZ2VGcm9tT3BlbiIgdHlwZT0iczpkb3VibGUiIC8+Ci0KLSAgICAgICAgICA8czplbGVtZW50IG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiBuYW1lPSJQZXJjZW50Q2hhbmdlRnJvbU9wZW4iIHR5cGU9InM6ZG91YmxlIiAvPgotICAgICAgICAgIDxzOmVsZW1lbnQgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIG5hbWU9IkJpZCIgdHlwZT0iczpkb3VibGUiIC8+Ci0gICAgICAgICAgPHM6ZWxlbWVudCBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgbmFtZT0iQXNrIiB0eXBlPSJzOmRvdWJsZSIgLz4KLSAgICAgICAgICA8czplbGVtZW50IG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiBuYW1lPSJTcHJlYWQiIHR5cGU9InM6ZG91YmxlIiAvPgotICAgICAgICAgIDxzOmVsZW1lbnQgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIG5hbWU9IkJpZFF1YW50aXR5IiB0eXBlPSJzOmludCIgLz4KLSAgICAgICAgICA8czplbGVtZW50IG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiBuYW1lPSJBc2tRdWFudGl0eSIgdHlwZT0iczppbnQiIC8+Ci0gICAgICAgICAgPHM6ZWxlbWVudCBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgbmFtZT0iVm9sdW1lIiB0eXBlPSJzOmludCIgLz4KLSAgICAgICAgICA8czplbGVtZW50IG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiBuYW1lPSJFQ05Wb2x1bWUiIHR5cGU9InM6aW50IiAvPgotICAgICAgICAgIDxzOmVsZW1lbnQgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIG5hbWU9IkhpZ2hlc3QiIHR5cGU9InM6ZG91YmxlIiAvPgotCi0gICAgICAgICAgPHM6ZWxlbWVudCBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgbmFtZT0iTG93ZXN0IiB0eXBlPSJzOmRvdWJsZSIgLz4KLSAgICAgICAgICA8czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJSYW5rIiB0eXBlPSJzOnN0cmluZyIgLz4KLSAgICAgICAgPC9zOnNlcXVlbmNlPgotICAgICAgPC9zOmNvbXBsZXhUeXBlPgotICAgICAgPHM6ZWxlbWVudCBuYW1lPSJSZXNwb25zZUluZm8iIHR5cGU9InMwOlJlc3BvbnNlSW5mbyIgLz4KLSAgICAgIDxzOmNvbXBsZXhUeXBlIG5hbWU9IlJlc3BvbnNlSW5mbyI+Ci0gICAgICAgIDxzOnNlcXVlbmNlPgotICAgICAgICAgIDxzOmVsZW1lbnQgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIG5hbWU9IlJlc3BvbnNlQ29kZSIgdHlwZT0iczppbnQiIC8+Ci0gICAgICAgICAgPHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0iUmVzcG9uc2UiIHR5cGU9InM6c3RyaW5nIiAvPgotCi0gICAgICAgIDwvczpzZXF1ZW5jZT4KLSAgICAgIDwvczpjb21wbGV4VHlwZT4KLSAgICAgIDxzOmVsZW1lbnQgbmFtZT0iR2V0T25lUXVvdGUiPgotICAgICAgICA8czpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8czpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9IlRpY2tlclN5bWJvbCIgdHlwZT0iczpzdHJpbmciIC8+Ci0gICAgICAgICAgPC9zOnNlcXVlbmNlPgotICAgICAgICA8L3M6Y29tcGxleFR5cGU+Ci0gICAgICA8L3M6ZWxlbWVudD4KLQotICAgICAgPHM6ZWxlbWVudCBuYW1lPSJHZXRPbmVRdW90ZVJlc3BvbnNlIj4KLSAgICAgICAgPHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJHZXRPbmVRdW90ZVJlc3VsdCIgdHlwZT0iczA6UmVhbFF1b3RlIiAvPgotICAgICAgICAgIDwvczpzZXF1ZW5jZT4KLSAgICAgICAgPC9zOmNvbXBsZXhUeXBlPgotICAgICAgPC9zOmVsZW1lbnQ+Ci0gICAgPC9zOnNjaGVtYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0LXJlc291cmNlcy94c2QvY29tcGxleF9jb250ZW50X2V4dGVuc2lvbi54c2QgYi92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0LXJlc291cmNlcy94c2QvY29tcGxleF9jb250ZW50X2V4dGVuc2lvbi54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5ZTYyZWEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMveHNkL2NvbXBsZXhfY29udGVudF9leHRlbnNpb24ueHNkCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08c2NoZW1hIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotICAgICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgIHhtbG5zOnRucz0idXJuOnNvYmplY3QuZW50ZXJwcmlzZS5zb2FwLnNmb3JjZS5jb20iCi0gICAgICAgIHRhcmdldE5hbWVzcGFjZT0idXJuOnNvYmplY3QuZW50ZXJwcmlzZS5zb2FwLnNmb3JjZS5jb20iPgotICAgIDxjb21wbGV4VHlwZSBuYW1lPSJzT2JqZWN0Ij4KLSAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iZmllbGRzVG9OdWxsIiAgdHlwZT0ieHNkOnN0cmluZyIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IklkIiB0eXBlPSJ4c2Q6c3RyaW5nIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0gICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgPC9jb21wbGV4VHlwZT4KLSAgICA8Y29tcGxleFR5cGUgbmFtZT0iQWNjb3VudCI+Ci0gICAgICAgIDxjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDxleHRlbnNpb24gYmFzZT0idG5zOnNPYmplY3QiPgotICAgICAgICAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQWNjb3VudE51bWJlciIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJBY3RpdmVfX2MiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQW5udWFsUmV2ZW51ZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRvdWJsZSIvPgotICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJCaWxsaW5nQ2l0eSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJCaWxsaW5nQ291bnRyeSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJCaWxsaW5nUG9zdGFsQ29kZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJCaWxsaW5nU3RhdGUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgICAgPC9leHRlbnNpb24+Ci0gICAgICAgIDwvY29tcGxleENvbnRlbnQ+Ci0gICAgPC9jb21wbGV4VHlwZT4KLSAgICA8ZWxlbWVudCBuYW1lPSJBY2NvdW50IiB0eXBlPSJ0bnM6QWNjb3VudCIvPgotPC9zY2hlbWE+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMveHNkL2Rlcml2ZWQvZGVyaXZlZFR5cGUtQWxsLnhzZCBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3hzZC9kZXJpdmVkL2Rlcml2ZWRUeXBlLUFsbC54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwNDk4MjAuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMveHNkL2Rlcml2ZWQvZGVyaXZlZFR5cGUtQWxsLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkIgotICAgICAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgeG1sbnM6eHNkMT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2QiCi0gICAgICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIj4KLQotICAgIDx4czplbGVtZW50IG5hbWU9IkRlcml2ZWRQb3NpdGl2ZUludGVnZXIiIHR5cGU9InhzOnBvc2l0aXZlSW50ZWdlciIvPgotCTx4czplbGVtZW50IG5hbWU9IkRlcml2ZWROZWdhdGl2ZUludGVnZXIiIHR5cGU9InhzOm5lZ2F0aXZlSW50ZWdlciIvPgotCTx4czplbGVtZW50IG5hbWU9IkRlcml2ZWROb25OZWdhdGl2ZUludGVnZXIiIHR5cGU9InhzOm5vbk5lZ2F0aXZlSW50ZWdlciIvPgotCTx4czplbGVtZW50IG5hbWU9IkRlcml2ZWROb25Qb3NpdGl2ZUludGVnZXIiIHR5cGU9InhzOm5vblBvc2l0aXZlSW50ZWdlciIvPgotCTx4czplbGVtZW50IG5hbWU9IkRlcml2ZWRVbnNpZ25lZFNob3J0IiB0eXBlPSJ4czp1bnNpZ25lZFNob3J0Ii8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iRGVyaXZlZFVuc2lnbmVkTG9uZyIgdHlwZT0ieHM6dW5zaWduZWRMb25nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iRGVyaXZlZFVuc2lnbmVkSW50IiB0eXBlPSJ4czp1bnNpZ25lZEludCIvPgotCTx4czplbGVtZW50IG5hbWU9IkRlcml2ZWRVbnNpZ25lZEJ5dGUiIHR5cGU9InhzOnVuc2lnbmVkQnl0ZSIvPgotCTx4czplbGVtZW50IG5hbWU9IkRlcml2ZWRMb25nIiB0eXBlPSJ4czpsb25nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iRGVyaXZlZFNob3J0IiB0eXBlPSJ4czpzaG9ydCIvPgotCTx4czplbGVtZW50IG5hbWU9IkRlcml2ZWRJbnQiIHR5cGU9InhzOmludCIvPgotCTx4czplbGVtZW50IG5hbWU9IkRlcml2ZWRCeXRlIiB0eXBlPSJ4czpieXRlIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iRGVyaXZlZFRva2VuIiB0eXBlPSJ4czp0b2tlbiIvPgotCTx4czplbGVtZW50IG5hbWU9IkRlcml2ZWRMYW5ndWFnZSIgdHlwZT0ieHM6bGFuZ3VhZ2UiLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJEZXJpdmVkTk1UT0tFTiIgdHlwZT0ieHM6Tk1UT0tFTiIvPgotCTx4czplbGVtZW50IG5hbWU9IkRlcml2ZWROTVRPS0VOUyIgdHlwZT0ieHM6Tk1UT0tFTlMiLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJEZXJpdmVkSUQiIHR5cGU9InhzOklEIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iRGVyaXZlZElEUmVmIiB0eXBlPSJ4czpJRFJFRiIvPgotCTx4czplbGVtZW50IG5hbWU9IkRlcml2ZWRFbnRpdHkiIHR5cGU9InhzOkVOVElUWSIvPgotCTx4czplbGVtZW50IG5hbWU9IkRlcml2ZWRFbnRpdGllcyIgdHlwZT0ieHM6RU5USVRJRVMiLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJEZXJpdmVkTmFtZSIgdHlwZT0ieHM6TmFtZSIvPgotCTx4czplbGVtZW50IG5hbWU9IkRlcml2ZWROYW1lVG9rZW4iIHR5cGU9InhzOk5NVE9LRU4iLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJEZXJpdmVkTkNOYW1lIiB0eXBlPSJ4czpOQ05hbWUiLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJEZXJpdmVkTm9ybWFsaXplZFN0cmluZyIgdHlwZT0ieHM6bm9ybWFsaXplZFN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkRlcml2ZWRJbnRlZ2VyIiB0eXBlPSJ4czppbnRlZ2VyIi8+Ci0KLTwvc2NoZW1hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3hzZC9pbXBvcnQueHNkIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMveHNkL2ltcG9ydC54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0MDI2YjMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMveHNkL2ltcG9ydC54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZCIKLSAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIKLSAgICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgeG1sbnM6eHNkMT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2QiCi0gICAgICAgIHhtbG5zOnhzZDI9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkMiIKLSAgICAgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPgotICAgIDxpbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZDIiIHNjaGVtYUxvY2F0aW9uPSJpbXBvcnQyLnhzZCI+PC9pbXBvcnQ+Ci0gICAgPGVsZW1lbnQgbmFtZT0iZWNob1N0cnVjdFBhcmFtIiB0eXBlPSJ4c2QyOlNPQVBTdHJ1Y3QiLz4KLTwvc2NoZW1hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3hzZC9pbXBvcnQyLnhzZCBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3hzZC9pbXBvcnQyLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY4YTA4YS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0LXJlc291cmNlcy94c2QvaW1wb3J0Mi54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZDIiCi0gICAgICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iCi0gICAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgIHhtbG5zOnhzZDE9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkMiIKLSAgICAgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPgotICAgIDxjb21wbGV4VHlwZSBuYW1lPSJTT0FQU3RydWN0Ij4KLSAgICAgICAgPGFsbD4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InZhckZsb2F0IiB0eXBlPSJ4c2Q6ZmxvYXQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InZhckludCIgdHlwZT0ieHNkOmludCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0idmFyU3RyaW5nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwvYWxsPgotICAgIDwvY29tcGxleFR5cGU+Ci08L3NjaGVtYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0LXJlc291cmNlcy94c2QvbWl4ZWRfbWlub2NjdXMwLnhzZCBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3hzZC9taXhlZF9taW5vY2N1czAueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDM4YTUzLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3hzZC9taXhlZF9taW5vY2N1czAueHNkCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08c2NoZW1hIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgeG1sbnM6dG5zPSJodHRwOi8vcmVjdXJzaW9uMS5vcmciCi0gICAgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3JlY3Vyc2lvbjEub3JnIgotICAgICAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9InN0cmluZ0xpc3RSZXNwb25zZUVsZW1lbnQiIHR5cGU9InRuczpTdHJpbmdMaXN0UmVzcG9uc2VUeXBlIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJTdHJpbmdMaXN0UmVzcG9uc2VUeXBlIj4KLSAgICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RyaW5nTGlzdCIgdHlwZT0idG5zOlN0cmluZ0xpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGNlcHRpb24iIHR5cGU9InRuczpFeGNlcHRpb25UeXBlIi8+Ci0gICAgICAgIDwveHNkOmNob2ljZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlN0cmluZ0xpc3QiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InMiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRXhjZXB0aW9uVHlwZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLTwvc2NoZW1hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3hzZC9zaW1wbGUtbWlub2NjdXJzMC54c2QgYi92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0LXJlc291cmNlcy94c2Qvc2ltcGxlLW1pbm9jY3VyczAueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDMwNWRkLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3hzZC9zaW1wbGUtbWlub2NjdXJzMC54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTx4czpzY2hlbWEgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZXN0Lm9yZyI+Ci0JPHhzOmVsZW1lbnQgbmFtZT0icm9vdCI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJBIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJCIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJDIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJEIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLTwveHM6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMveHNkL3NpbXBsZS1yZWN1cnNpdmUtZGF0YXR5cGVzLnhzZCBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3hzZC9zaW1wbGUtcmVjdXJzaXZlLWRhdGF0eXBlcy54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1ODY4ZTMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMveHNkL3NpbXBsZS1yZWN1cnNpdmUtZGF0YXR5cGVzLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHNjaGVtYSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgIHhtbG5zOnRucz0iaHR0cDovL3JlY3Vyc2lvbi5vcmciCi0gICAgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3JlY3Vyc2lvbi5vcmciCi0gICAgICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIj4KLSAgICA8Y29tcGxleFR5cGUgbmFtZT0iVHlwZUUiPgotICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJFIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgPC9jb21wbGV4VHlwZT4KLSAgICA8ZWxlbWVudCBuYW1lPSJFIiB0eXBlPSJ0bnM6VHlwZUUiLz4KLTwvc2NoZW1hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3hzZC9zaW1wbGUvc2ltcGxlVHlwZS1BbGwueHNkIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMveHNkL3NpbXBsZS9zaW1wbGVUeXBlLUFsbC54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiZGRiYTguLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMveHNkL3NpbXBsZS9zaW1wbGVUeXBlLUFsbC54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZCIKLSAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICB4bWxuczp4c2QxPSJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZCIKLSAgICAgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPgotICAgIDxlbGVtZW50IG5hbWU9ImRhdGVQYXJhbSIgdHlwZT0ieHNkOmRhdGUiLz4KLSAgICA8ZWxlbWVudCBuYW1lPSJkYXRlVGltZVBhcmFtIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiLz4KLSAgICA8ZWxlbWVudCBuYW1lPSJkYXlQYXJhbSIgdHlwZT0ieHNkOmdEYXkiLz4KLSAgICA8ZWxlbWVudCBuYW1lPSJkdXJhdGlvblBhcmFtIiB0eXBlPSJ4c2Q6ZHVyYXRpb24iLz4KLSAgICA8ZWxlbWVudCBuYW1lPSJtb250aFBhcmFtIiB0eXBlPSJ4c2Q6Z01vbnRoIi8+Ci0gICAgPGVsZW1lbnQgbmFtZT0ibW9udGhEYXlQYXJhbSIgdHlwZT0ieHNkOmdNb250aERheSIvPgotICAgIDxlbGVtZW50IG5hbWU9InRpbWVQYXJhbSIgdHlwZT0ieHNkOnRpbWUiLz4KLSAgICA8ZWxlbWVudCBuYW1lPSJ5ZWFyUGFyYW0iIHR5cGU9InhzZDpnWWVhciIvPgotICAgIDxlbGVtZW50IG5hbWU9InllYXJNb250aFBhcmFtIiB0eXBlPSJ4c2Q6Z1llYXJNb250aCIvPgotICAgIDxlbGVtZW50IG5hbWU9ImRvdWJsZVBhcmFtIiB0eXBlPSJ4c2Q6ZG91YmxlIi8+Ci0gICAgPGVsZW1lbnQgbmFtZT0ic3RyaW5nUGFyYW0iIHR5cGU9InhzZDpzdHJpbmciLz4KLQk8ZWxlbWVudCBuYW1lPSJib29sZWFuUGFyYW0iIHR5cGU9InhzZDpib29sZWFuIi8+Ci0JPGVsZW1lbnQgbmFtZT0iZGVjaW1hbFBhcmFtIiB0eXBlPSJ4c2Q6ZGVjaW1hbCIvPgotCTxlbGVtZW50IG5hbWU9ImZsb2F0UGFyYW0iIHR5cGU9InhzZDpmbG9hdCIvPgotCTxlbGVtZW50IG5hbWU9ImhleEJpblBhcmFtIiB0eXBlPSJ4c2Q6aGV4QmluYXJ5Ii8+Ci0JPGVsZW1lbnQgbmFtZT0iYmFzZTY0QmluUGFyYW0iIHR5cGU9InhzZDpiYXNlNjRCaW5hcnkiLz4KLQk8ZWxlbWVudCBuYW1lPSJhbnlVUklQYXJhbSIgdHlwZT0ieHNkOmFueVVSSSIvPgotCTxlbGVtZW50IG5hbWU9InFOYW1lUGFyYW0iIHR5cGU9InhzZDpRTmFtZSIvPgotPC9zY2hlbWE+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMveHNkL3NpbXBsZV9hbnkueHNkIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMveHNkL3NpbXBsZV9hbnkueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZThiNDMyLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3hzZC9zaW1wbGVfYW55LnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkIgotICAgICAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIgotICAgICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICB4bWxuczp4c2QxPSJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZCIKLSAgICAgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPgotICAgIDxjb21wbGV4VHlwZSBuYW1lPSJTT0FQU3RydWN0Ij4KLSAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0idmFyRmxvYXQiIHR5cGU9InhzZDpmbG9hdCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0idmFySW50IiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ2YXJTdHJpbmciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDxhbnkvPiAgPCEtLSBub3RlIHRoZSBpbmNsdXNpb24gb2YgYW55IGhlcmUgLS0+Ci0gICAgICAgIDwvc2VxdWVuY2U+Ci0KLSAgICA8L2NvbXBsZXhUeXBlPgotICAgIDxlbGVtZW50IG5hbWU9Im15b2JqZWN0IiB0eXBlPSJ4c2QxOlNPQVBTdHJ1Y3QiLz4KLTwvc2NoZW1hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3hzZC9zaW1wbGVfYW55X2F0dHJpYnV0ZS54c2QgYi92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0LXJlc291cmNlcy94c2Qvc2ltcGxlX2FueV9hdHRyaWJ1dGUueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjUzNjQxLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3hzZC9zaW1wbGVfYW55X2F0dHJpYnV0ZS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZCIKLSAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIKLSAgICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgeG1sbnM6eHNkMT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2QiCi0gICAgICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIj4KLSAgICA8Y29tcGxleFR5cGUgbmFtZT0iU09BUFN0cnVjdCI+Ci0gICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InZhckZsb2F0IiB0eXBlPSJ4c2Q6ZmxvYXQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InZhckludCIgdHlwZT0ieHNkOmludCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0idmFyU3RyaW5nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgIDxhbnlBdHRyaWJ1dGUgLz4KLSAgICA8L2NvbXBsZXhUeXBlPgotICAgIDxlbGVtZW50IG5hbWU9Im15b2JqZWN0IiB0eXBlPSJ4c2QxOlNPQVBTdHJ1Y3QiLz4KLTwvc2NoZW1hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3hzZC9zaW1wbGVfYW55dHlwZS54c2QgYi92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0LXJlc291cmNlcy94c2Qvc2ltcGxlX2FueXR5cGUueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODE4NzA4Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3hzZC9zaW1wbGVfYW55dHlwZS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZDIiCi0gICAgICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iCi0gICAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgIHhtbG5zOnhzZDE9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkIgotICAgICAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+Ci0KLSAgICA8ZWxlbWVudCBuYW1lPSJteU9iamVjdCIgdHlwZT0ieHNkOmFueVR5cGUiLz4KLTwvc2NoZW1hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3hzZC9zaW1wbGVfYXR0cmliLnhzZCBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3hzZC9zaW1wbGVfYXR0cmliLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZlMWQyMS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0LXJlc291cmNlcy94c2Qvc2ltcGxlX2F0dHJpYi54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZCIKLSAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIKLSAgICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgeG1sbnM6eHNkMT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2QiCi0gICAgICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIj4KLSAgICA8Y29tcGxleFR5cGUgbmFtZT0iU09BUFN0cnVjdCI+Ci0gICAgICAgIDxhbGw+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ2YXJGbG9hdCIgdHlwZT0ieHNkOmZsb2F0Ii8+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ2YXJJbnQiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InZhclN0cmluZyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L2FsbD4KLSAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0eXBlMSIgdHlwZT0ieHNkOnN0cmluZyI+PC9hdHRyaWJ1dGU+Ci0gICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idHlwZTIiIHR5cGU9InhzZDpzdHJpbmciPjwvYXR0cmlidXRlPgotICAgICAgICA8YXR0cmlidXRlIG5hbWU9InR5cGUzIiB0eXBlPSJ4c2Q6aW50Ij48L2F0dHJpYnV0ZT4KLSAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0eXBlNCIgdHlwZT0ieHNkOmZsb2F0Ij48L2F0dHJpYnV0ZT4KLSAgICA8L2NvbXBsZXhUeXBlPgotICAgIDxlbGVtZW50IG5hbWU9ImVjaG9TdHJpbmdQYXJhbSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDxlbGVtZW50IG5hbWU9ImVjaG9TdHJpbmdSZXR1cm4iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8ZWxlbWVudCBuYW1lPSJlY2hvU3RydWN0UGFyYW0iIHR5cGU9InhzZDE6U09BUFN0cnVjdCIvPgotICAgIDxlbGVtZW50IG5hbWU9ImVjaG9TdHJ1Y3RSZXR1cm4iIHR5cGU9InhzZDE6U09BUFN0cnVjdCIvPgotPC9zY2hlbWE+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMveHNkL3NpbXBsZV9jaG9pY2UueHNkIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMveHNkL3NpbXBsZV9jaG9pY2UueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmJkYzhlLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3hzZC9zaW1wbGVfY2hvaWNlLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHNjaGVtYSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgIHhtbG5zOnRucz0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy90eXBlcyIKLSAgICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnL3R5cGVzIgotICAgICAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+Ci0gICAgICA8Y29tcGxleFR5cGUgbmFtZT0iU09BUFN0cnVjdCI+Ci0gICAgICAgIDxjaG9pY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ2YXJTdHJpbmciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InZhckludCIgdHlwZT0ieHNkOmludCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0idmFyRmxvYXQiIHR5cGU9InhzZDpmbG9hdCIvPgotICAgICAgICA8L2Nob2ljZT4KLSAgICA8L2NvbXBsZXhUeXBlPgotICAgIDxlbGVtZW50IG5hbWU9Im15RWxlbWVudCIgdHlwZT0idG5zOlNPQVBTdHJ1Y3QiLz4KLTwvc2NoZW1hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3hzZC9zaW1wbGVfY29udGVudF9leHRlbnNpb24ueHNkIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMveHNkL3NpbXBsZV9jb250ZW50X2V4dGVuc2lvbi54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmYmJkOTQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMveHNkL3NpbXBsZV9jb250ZW50X2V4dGVuc2lvbi54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzY2hlbWEgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0gICAgICAgIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICB4bWxuczp0bnM9Im9yZy5hcGFjaGUuYXhpczIudGVzdDUiCi0gICAgICAgIHRhcmdldE5hbWVzcGFjZT0ib3JnLmFwYWNoZS5heGlzMi50ZXN0NSI+Ci0KLTx4czpjb21wbGV4VHlwZSBuYW1lPSJ0eXBlIj4KLQk8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iZmlyc3QiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJtaWRkbGUiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJsYXN0IiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0gICAgICAgIDwveHM6c2VxdWVuY2U+Ci08L3hzOmNvbXBsZXhUeXBlPgotCi08eHM6ZWxlbWVudCBuYW1lPSJmdWxsTmFtZSI+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0idG5zOnR5cGUiPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Imxhbmd1YWdlIiB0eXBlPSJ4czpsYW5ndWFnZSIvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotIDwveHM6ZWxlbWVudD4KLQotCi08L3NjaGVtYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0LXJlc291cmNlcy94c2Qvc2ltcGxlX2VsZW1lbnQueHNkIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMveHNkL3NpbXBsZV9lbGVtZW50LnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTYxYWNiZi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0LXJlc291cmNlcy94c2Qvc2ltcGxlX2VsZW1lbnQueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2QiCi0gICAgICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iCi0gICAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgIHhtbG5zOnhzZDE9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkIgotICAgICAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+Ci0gICAgPGNvbXBsZXhUeXBlIG5hbWU9IlNPQVBTdHJ1Y3QiPgotICAgICAgICA8YWxsPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0idmFyRmxvYXQiIHR5cGU9InhzZDpmbG9hdCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0idmFySW50IiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ2YXJTdHJpbmciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC9hbGw+Ci0gICAgPC9jb21wbGV4VHlwZT4KLSAgICA8ZWxlbWVudCBuYW1lPSJlY2hvU3RyaW5nUGFyYW0iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8ZWxlbWVudCBuYW1lPSJlY2hvU3RyaW5nUmV0dXJuIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPGVsZW1lbnQgbmFtZT0iZWNob1N0cnVjdFBhcmFtIiB0eXBlPSJ4c2QxOlNPQVBTdHJ1Y3QiLz4KLSAgICA8ZWxlbWVudCBuYW1lPSJlY2hvU3RydWN0UmV0dXJuIiB0eXBlPSJ4c2QxOlNPQVBTdHJ1Y3QiLz4KLTwvc2NoZW1hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3hzZC9zaW1wbGVfZWxlbWVudF9yZWZlcmVuY2UueHNkIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMveHNkL3NpbXBsZV9lbGVtZW50X3JlZmVyZW5jZS54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4NjdiZGEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMveHNkL3NpbXBsZV9lbGVtZW50X3JlZmVyZW5jZS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzY2hlbWEgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0gICAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgeG1sbnM6dG5zPSJ1cm46c29iamVjdC5lbnRlcnByaXNlLnNvYXAuc2ZvcmNlLmNvbSIKLSAgICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJ1cm46c29iamVjdC5lbnRlcnByaXNlLnNvYXAuc2ZvcmNlLmNvbSI+Ci0gICAgPGNvbXBsZXhUeXBlIG5hbWU9InNPYmplY3QiPgotICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InRuczpmaWVsZHNUb051bGwiIC8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InRuczpJZCIgLz4KLSAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICA8L2NvbXBsZXhUeXBlPgotICAgIDxlbGVtZW50IG5hbWU9ImZpZWxkc1RvTnVsbCIgIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgPGVsZW1lbnQgbmFtZT0iSWQiICB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgIDxlbGVtZW50IG5hbWU9IkFjY291bnQiIHR5cGU9InRuczpzT2JqZWN0Ii8+Ci0gICAgCi08L3NjaGVtYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0LXJlc291cmNlcy94c2Qvc2ltcGxlX21heE9jY3Vycy54c2QgYi92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0LXJlc291cmNlcy94c2Qvc2ltcGxlX21heE9jY3Vycy54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkOGY0OWEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMveHNkL3NpbXBsZV9tYXhPY2N1cnMueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZzIveHNkIgotICAgICAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgIHhtbG5zOnhzZDE9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcyL3hzZCIKLSAgICAgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPgotICAgIDxjb21wbGV4VHlwZSBuYW1lPSJTT0FQU3RydWN0Ij4KLSAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0idmFyRmxvYXQiIHR5cGU9InhzZDpmbG9hdCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0idmFySW50IiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ2YXJTdHJpbmciIHR5cGU9InhzZDpzdHJpbmciIG1heE9jY3Vycz0iMTAiLz4KLSAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICA8L2NvbXBsZXhUeXBlPgotICAgIDxlbGVtZW50IG5hbWU9Im15b2JqZWN0IiB0eXBlPSJ4c2QxOlNPQVBTdHJ1Y3QiIC8+Ci08L3NjaGVtYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0LXJlc291cmNlcy94c2Qvc2ltcGxlX21heE9jY3VyczIueHNkIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMveHNkL3NpbXBsZV9tYXhPY2N1cnMyLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NiN2E4NC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0LXJlc291cmNlcy94c2Qvc2ltcGxlX21heE9jY3VyczIueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2QiCi0gICAgICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iCi0gICAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgIHhtbG5zOnhzZDE9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkIgotICAgICAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+Ci0gICAgPGNvbXBsZXhUeXBlIG5hbWU9IlNPQVBTdHJ1Y3QiPgotICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ2YXJGbG9hdCIgdHlwZT0ieHNkOmZsb2F0Ii8+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ2YXJJbnQiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InZhclN0cmluZyIgdHlwZT0ieHNkOnN0cmluZyIgbWF4T2NjdXJzPSIxMCIvPgotICAgICAgICA8L3NlcXVlbmNlPgotICAgIDwvY29tcGxleFR5cGU+Ci0gICAgPGNvbXBsZXhUeXBlIG5hbWU9IlNPQVBTdHJ1Y3RBcnJheSI+Ci0gICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InNvYXBTdHJ1Y3R1cmVzIiB0eXBlPSJ4c2QxOlNPQVBTdHJ1Y3QiIG1heE9jY3Vycz0iMTAiPjwvZWxlbWVudD4KLSAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICA8L2NvbXBsZXhUeXBlPgotICAgIDxlbGVtZW50IG5hbWU9Im15b2JqZWN0IiB0eXBlPSJ4c2QxOlNPQVBTdHJ1Y3RBcnJheSIgLz4KLTwvc2NoZW1hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3hzZC9zaW1wbGVfbmlsbGFibGUueHNkIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMveHNkL3NpbXBsZV9uaWxsYWJsZS54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5Zjg4MTYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMveHNkL3NpbXBsZV9uaWxsYWJsZS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzY2hlbWEgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICB4bWxuczp0bnM9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvdHlwZXMiCi0gICAgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy90eXBlcyI+Ci0gICAgPGNvbXBsZXhUeXBlIG5hbWU9IlNPQVBTdHJ1Y3QxIj4KLSAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0idmFyU3RyaW5nIiB0eXBlPSJ4c2Q6c3RyaW5nIiBuaWxsYWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0idmFySW50IiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ2YXJGbG9hdCIgdHlwZT0ieHNkOmZsb2F0Ii8+Ci0gICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgPC9jb21wbGV4VHlwZT4KLSAgICA8ZWxlbWVudCBuYW1lPSJteUVsZW1lbnROaWxsYWJsZSIgdHlwZT0idG5zOlNPQVBTdHJ1Y3QxIiBuaWxsYWJsZT0idHJ1ZSIvPgotPC9zY2hlbWE+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMveHNkL3NpbXBsZV9wYXJ0aWNsZV9hbGwueHNkIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMveHNkL3NpbXBsZV9wYXJ0aWNsZV9hbGwueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTlkMzZiLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3hzZC9zaW1wbGVfcGFydGljbGVfYWxsLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHNjaGVtYSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgIHhtbG5zOnRucz0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy90eXBlcyIKLSAgICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnL3R5cGVzIgotICAgICAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+Ci0gICAgICA8Y29tcGxleFR5cGUgbmFtZT0iU2ltcGxlUGFydGljbGVBbGxTdHJ1Y3QiPgotICAgICAgICA8YWxsPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0idmFyU3RyaW5nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ2YXJJbnQiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InZhckZsb2F0IiB0eXBlPSJ4c2Q6ZmxvYXQiLz4KLSAgICAgICAgPC9hbGw+Ci0gICAgPC9jb21wbGV4VHlwZT4KLSAgICA8ZWxlbWVudCBuYW1lPSJteVBhcnRpY2xlQWxsRWxlbWVudCIgdHlwZT0idG5zOlNpbXBsZVBhcnRpY2xlQWxsU3RydWN0Ii8+Ci08L3NjaGVtYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0LXJlc291cmNlcy94c2Qvc2ltcGxlX3JlY3Vyc2l2ZS54c2QgYi92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0LXJlc291cmNlcy94c2Qvc2ltcGxlX3JlY3Vyc2l2ZS54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzYTZjODkuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMveHNkL3NpbXBsZV9yZWN1cnNpdmUueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08c2NoZW1hIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgeG1sbnM6dG5zPSJodHRwOi8vc29hcGludGVyb3Aub3JnL3R5cGVzIgotICAgICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvdHlwZXMiPgotICAgIDxjb21wbGV4VHlwZSBuYW1lPSJTT0FQU3RydWN0MSI+Ci0gICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InZhclN0cmluZyIgdHlwZT0ieHNkOnN0cmluZyIgbmlsbGFibGU9InRydWUiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InZhckludCIgdHlwZT0ieHNkOmludCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0idmFyRmxvYXQiIHR5cGU9InhzZDpmbG9hdCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iY2hpbGQiIHR5cGU9InRuczpTT0FQU3RydWN0MSIvPgotICAgICAgICA8L3NlcXVlbmNlPgotICAgIDwvY29tcGxleFR5cGU+Ci0gICAgPGVsZW1lbnQgbmFtZT0ibXlFbGVtZW50TmlsbGFibGUiIHR5cGU9InRuczpTT0FQU3RydWN0MSIgbmlsbGFibGU9InRydWUiLz4KLTwvc2NoZW1hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3hzZC9zaW1wbGVfcmVzdHJpY3Rpb24ueHNkIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMveHNkL3NpbXBsZV9yZXN0cmljdGlvbi54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4OWU5YTcuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMveHNkL3NpbXBsZV9yZXN0cmljdGlvbi54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTx4czpzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZCIKLSAgICAgICAgICAgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICAgICB4bWxuczp0bnM9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkIgotICAgICAgICAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0iY2hhciIgbmlsbGFibGU9InRydWUiIHR5cGU9InRuczpjaGFyIi8+Ci0gICAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iY2hhciI+Ci0gICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czppbnQiLz4KLSAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0iZ3VpZCIgbmlsbGFibGU9InRydWUiIHR5cGU9InRuczpndWlkIi8+Ci0gICAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iZ3VpZCI+Ci0gICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotICAgICAgICAgICAgPHhzOnBhdHRlcm4gdmFsdWU9IltcZGEtZkEtRl17OH0tW1xkYS1mQS1GXXs0fS1bXGRhLWZBLUZdezR9LVtcZGEtZkEtRl17NH0tW1xkYS1mQS1GXXsxMn0iLz4KLSAgICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICA8L3hzOnNpbXBsZVR5cGU+Ci08L3hzOnNjaGVtYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0LXJlc291cmNlcy94c2Qvc2ltcGxlX3NlcXVlbmNlLnhzZCBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3hzZC9zaW1wbGVfc2VxdWVuY2UueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGE3MmQxLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3hzZC9zaW1wbGVfc2VxdWVuY2UueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08c2NoZW1hIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgeG1sbnM6dG5zPSJodHRwOi8vc29hcGludGVyb3Aub3JnL3R5cGVzIgotICAgICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvdHlwZXMiPgotICAgIDxpbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgIDxjb21wbGV4VHlwZSBuYW1lPSJTT0FQU3RydWN0Ij4KLSAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0idmFyU3RyaW5nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ2YXJJbnQiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InZhckZsb2F0IiB0eXBlPSJ4c2Q6ZmxvYXQiLz4KLSAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICA8L2NvbXBsZXhUeXBlPgotICAgIDxlbGVtZW50IG5hbWU9Im15RWxlbWVudCIgdHlwZT0idG5zOlNPQVBTdHJ1Y3QiLz4KLTwvc2NoZW1hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3hzZC9zaW1wbGVfc2VxdWVuY2VfMi54c2QgYi92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0LXJlc291cmNlcy94c2Qvc2ltcGxlX3NlcXVlbmNlXzIueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZWViZGVkLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3hzZC9zaW1wbGVfc2VxdWVuY2VfMi54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzY2hlbWEgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICB4bWxuczp0bnM9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvdHlwZXMiCi0gICAgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy90eXBlcyI+Ci0gICAgPGltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi8+Ci0gICAgPGNvbXBsZXhUeXBlIG5hbWU9IlNPQVBTdHJ1Y3QiPgotICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ2YXJTdHJpbmciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InZhckludCIgdHlwZT0ieHNkOmludCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0idmFyRmxvYXQiIHR5cGU9InhzZDpmbG9hdCIvPgotICAgICAgICA8L3NlcXVlbmNlPgotICAgIDwvY29tcGxleFR5cGU+Ci0gICAgPCEtLSBIYXMgb25lIG1vcmUgY29tcGxleCB0eXBlIHRoYXQgdXNlcyB0aGUgYWxyZWFkeSBkZWZpbmVkIGNvbXBsZXggdHlwZSAtLT4KLSAgICA8Y29tcGxleFR5cGUgbmFtZT0iU09BUFN0cnVjdEZhdWx0Ij4KLSAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0ic29hcFN0cnVjdCIgdHlwZT0idG5zOlNPQVBTdHJ1Y3QiLz4KLSAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICA8L2NvbXBsZXhUeXBlPgotICAgIDxlbGVtZW50IG5hbWU9InRlbXBFbHQiIHR5cGU9InRuczpTT0FQU3RydWN0RmF1bHQiLz4KLTwvc2NoZW1hPgotCi0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvYWxsL0FsbFRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvYWxsL0FsbFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZjMmI4YS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL2FsbC9BbGxUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLmFsbDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5TdEFYVXRpbHM7Ci1pbXBvcnQgb3JnLnRlbXB1cmkuVXBkYXRlOwotCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLQotCi1wdWJsaWMgY2xhc3MgQWxsVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBbGwoKXsKLSAgICAgICAgVXBkYXRlIHVwZGF0ZSA9IG5ldyBVcGRhdGUoKTsKLSAgICAgICAgdXBkYXRlLnNldEFyZzAoInRlc3QiKTsKLSAgICAgICAgdXBkYXRlLnNldEFyZzEodHJ1ZSk7Ci0gICAgICAgIHVwZGF0ZS5zZXRJZCgyKTsKLQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gdXBkYXRlLmdldE9NRWxlbWVudChVcGRhdGUuTVlfUU5BTUUsIE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgICAgIFN0cmluZyBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJvbSBzdHJpbmcgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgb21FbGVtZW50U3RyaW5nID0gIjxuczE6VXBkYXRlIHhtbG5zOm5zMT1cImh0dHA6Ly90ZW1wdXJpLm9yZy9cIj48bnMxOmFyZzE+dHJ1ZTwvbnMxOmFyZzE+PG5zMTppZD4yPC9uczE6aWQ+PG5zMTphcmcwPnRlc3Q8L25zMTphcmcwPjwvbnMxOlVwZGF0ZT4iOwotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICBVcGRhdGUgbmV3VXBkYXRlID0gVXBkYXRlLkZhY3RvcnkucGFyc2UoeG1sUmVhZGVyKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyh1cGRhdGUuZ2V0QXJnMCgpLG5ld1VwZGF0ZS5nZXRBcmcwKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHVwZGF0ZS5nZXRBcmcxKCksbmV3VXBkYXRlLmdldEFyZzEoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHModXBkYXRlLmdldElkKCksbmV3VXBkYXRlLmdldElkKCkpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYXNzZXJ0RmFsc2UodHJ1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL2FueXR5cGUvQW55VHlwZVRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvYW55dHlwZS9BbnlUeXBlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWFhMjgyLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvYW55dHlwZS9BbnlUeXBlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjc3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEuYW55dHlwZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5TdEFYVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb247Ci1pbXBvcnQgdGVzdC5hZGIuYW55dHlwZS4qOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotCi0KLQotcHVibGljIGNsYXNzIEFueVR5cGVUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHVibGljIHZvaWQgdGVzdEFueVR5cGVFbGVtZW50MSgpIHsKLSAgICAgICAgVGVzdEFueVR5cGVFbGVtZW50MSB0ZXN0QW55VHlwZUVsZW1lbnQ7Ci0KLSAgICAgICAgdGVzdEFueVR5cGVFbGVtZW50ID0gbmV3IFRlc3RBbnlUeXBlRWxlbWVudDEoKTsKLSAgICAgICAgdGVzdEFueVR5cGVFbGVtZW50LnNldFRlc3RBbnlUeXBlRWxlbWVudDEoInRlc3QiKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSB0ZXN0QW55VHlwZUVsZW1lbnQuZ2V0T01FbGVtZW50KFRlc3RBbnlUeXBlRWxlbWVudDEuTVlfUU5BTUUsCi0gICAgICAgICAgICAgICAgICAgIE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgICAgIFN0cmluZyBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTSBFbGVtZW50IFN0cmluZyA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIFRlc3RBbnlUeXBlRWxlbWVudDEgcmVzdWx0ID0gVGVzdEFueVR5cGVFbGVtZW50MS5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFRlc3RBbnlUeXBlRWxlbWVudDEoKSwidGVzdCIpOwotICAgICAgICB9IGNhdGNoIChBREJFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgdGVzdEFueVR5cGVFbGVtZW50ID0gbmV3IFRlc3RBbnlUeXBlRWxlbWVudDEoKTsKLSAgICAgICAgdGVzdEFueVR5cGVFbGVtZW50LnNldFRlc3RBbnlUeXBlRWxlbWVudDEobnVsbCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gdGVzdEFueVR5cGVFbGVtZW50LmdldE9NRWxlbWVudChUZXN0QW55VHlwZUVsZW1lbnQxLk1ZX1FOQU1FLAotICAgICAgICAgICAgICAgICAgICBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT00gRWxlbWVudCBTdHJpbmcgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChBREJFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh0cnVlKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEFueVR5cGVFbGVtZW50MigpIHsKLSAgICAgICAgVGVzdEFueVR5cGVFbGVtZW50MiB0ZXN0QW55VHlwZUVsZW1lbnQ7Ci0KLSAgICAgICAgdGVzdEFueVR5cGVFbGVtZW50ID0gbmV3IFRlc3RBbnlUeXBlRWxlbWVudDIoKTsKLSAgICAgICAgdGVzdEFueVR5cGVFbGVtZW50LnNldFRlc3RBbnlUeXBlRWxlbWVudDIoInRlc3QiKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSB0ZXN0QW55VHlwZUVsZW1lbnQuZ2V0T01FbGVtZW50KFRlc3RBbnlUeXBlRWxlbWVudDIuTVlfUU5BTUUsCi0gICAgICAgICAgICAgICAgICAgIE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgICAgIFN0cmluZyBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTSBFbGVtZW50IFN0cmluZyA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIFRlc3RBbnlUeXBlRWxlbWVudDIgcmVzdWx0ID0gVGVzdEFueVR5cGVFbGVtZW50Mi5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFRlc3RBbnlUeXBlRWxlbWVudDIoKSwidGVzdCIpOwotICAgICAgICB9IGNhdGNoIChBREJFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgdGVzdEFueVR5cGVFbGVtZW50ID0gbmV3IFRlc3RBbnlUeXBlRWxlbWVudDIoKTsKLSAgICAgICAgdGVzdEFueVR5cGVFbGVtZW50LnNldFRlc3RBbnlUeXBlRWxlbWVudDIobnVsbCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gdGVzdEFueVR5cGVFbGVtZW50LmdldE9NRWxlbWVudChUZXN0QW55VHlwZUVsZW1lbnQxLk1ZX1FOQU1FLAotICAgICAgICAgICAgICAgICAgICBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT00gRWxlbWVudCBTdHJpbmcgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICBUZXN0QW55VHlwZUVsZW1lbnQyIHJlc3VsdCA9IFRlc3RBbnlUeXBlRWxlbWVudDIuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRUZXN0QW55VHlwZUVsZW1lbnQyKCksbnVsbCk7Ci0gICAgICAgIH0gY2F0Y2ggKEFEQkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QW55VHlwZUVsZW1lbnQzKCkgewotICAgICAgICBUZXN0QW55VHlwZUVsZW1lbnQzIHRlc3RBbnlUeXBlRWxlbWVudDsKLSAgICAgICAgdGVzdEFueVR5cGVFbGVtZW50ID0gbmV3IFRlc3RBbnlUeXBlRWxlbWVudDMoKTsKLSAgICAgICAgdGVzdEFueVR5cGVFbGVtZW50LnNldFBhcmFtMShuZXcgT2JqZWN0W117InRlc3QxIiwidGVzdDIifSk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSB0ZXN0QW55VHlwZUVsZW1lbnQuZ2V0T01FbGVtZW50KFRlc3RBbnlUeXBlRWxlbWVudDMuTVlfUU5BTUUsCi0gICAgICAgICAgICAgICAgICAgIE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgICAgIFN0cmluZyBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTSBFbGVtZW50IFN0cmluZyA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIFRlc3RBbnlUeXBlRWxlbWVudDMgcmVzdWx0ID0gVGVzdEFueVR5cGVFbGVtZW50My5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtMSgpWzBdLCJ0ZXN0MSIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTEoKVsxXSwidGVzdDIiKTsKLSAgICAgICAgfSBjYXRjaCAoQURCRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRlc3RBbnlUeXBlRWxlbWVudCA9IG5ldyBUZXN0QW55VHlwZUVsZW1lbnQzKCk7Ci0gICAgICAgIHRlc3RBbnlUeXBlRWxlbWVudC5zZXRQYXJhbTEobnVsbCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSB0ZXN0QW55VHlwZUVsZW1lbnQuZ2V0T01FbGVtZW50KFRlc3RBbnlUeXBlRWxlbWVudDMuTVlfUU5BTUUsCi0gICAgICAgICAgICAgICAgICAgIE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgICAgIFN0cmluZyBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTSBFbGVtZW50IFN0cmluZyA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIFRlc3RBbnlUeXBlRWxlbWVudDMgcmVzdWx0ID0gVGVzdEFueVR5cGVFbGVtZW50My5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtMSgpWzBdLG51bGwpOwotICAgICAgICB9IGNhdGNoIChBREJFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgdGVzdEFueVR5cGVFbGVtZW50ID0gbmV3IFRlc3RBbnlUeXBlRWxlbWVudDMoKTsKLSAgICAgICAgdGVzdEFueVR5cGVFbGVtZW50LnNldFBhcmFtMShuZXcgT2JqZWN0W117InRlc3QiLG51bGx9KTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IHRlc3RBbnlUeXBlRWxlbWVudC5nZXRPTUVsZW1lbnQoVGVzdEFueVR5cGVFbGVtZW50My5NWV9RTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCkpOwotICAgICAgICAgICAgU3RyaW5nIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NIEVsZW1lbnQgU3RyaW5nID09PiAiICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvbUVsZW1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgVGVzdEFueVR5cGVFbGVtZW50MyByZXN1bHQgPSBUZXN0QW55VHlwZUVsZW1lbnQzLkZhY3RvcnkucGFyc2UoeG1sUmVhZGVyKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UGFyYW0xKClbMF0sInRlc3QiKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UGFyYW0xKClbMV0sbnVsbCk7Ci0gICAgICAgIH0gY2F0Y2ggKEFEQkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgICBwdWJsaWMgdm9pZCB0ZXN0QW55VHlwZUVsZW1lbnQ0KCkgewotICAgICAgICBUZXN0QW55VHlwZUVsZW1lbnQ0IHRlc3RBbnlUeXBlRWxlbWVudDsKLSAgICAgICAgdGVzdEFueVR5cGVFbGVtZW50ID0gbmV3IFRlc3RBbnlUeXBlRWxlbWVudDQoKTsKLSAgICAgICAgdGVzdEFueVR5cGVFbGVtZW50LnNldFBhcmFtMShuZXcgT2JqZWN0W117InRlc3QxIiwidGVzdDIifSk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSB0ZXN0QW55VHlwZUVsZW1lbnQuZ2V0T01FbGVtZW50KFRlc3RBbnlUeXBlRWxlbWVudDQuTVlfUU5BTUUsCi0gICAgICAgICAgICAgICAgICAgIE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgICAgIFN0cmluZyBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTSBFbGVtZW50IFN0cmluZyA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIFRlc3RBbnlUeXBlRWxlbWVudDQgcmVzdWx0ID0gVGVzdEFueVR5cGVFbGVtZW50NC5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtMSgpWzBdLCJ0ZXN0MSIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTEoKVsxXSwidGVzdDIiKTsKLSAgICAgICAgfSBjYXRjaCAoQURCRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRlc3RBbnlUeXBlRWxlbWVudCA9IG5ldyBUZXN0QW55VHlwZUVsZW1lbnQ0KCk7Ci0gICAgICAgIHRlc3RBbnlUeXBlRWxlbWVudC5zZXRQYXJhbTEobnVsbCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSB0ZXN0QW55VHlwZUVsZW1lbnQuZ2V0T01FbGVtZW50KFRlc3RBbnlUeXBlRWxlbWVudDQuTVlfUU5BTUUsCi0gICAgICAgICAgICAgICAgICAgIE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgICAgIFN0cmluZyBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTSBFbGVtZW50IFN0cmluZyA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIFRlc3RBbnlUeXBlRWxlbWVudDQgcmVzdWx0ID0gVGVzdEFueVR5cGVFbGVtZW50NC5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtMSgpLG51bGwpOwotICAgICAgICB9IGNhdGNoIChBREJFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgdGVzdEFueVR5cGVFbGVtZW50ID0gbmV3IFRlc3RBbnlUeXBlRWxlbWVudDQoKTsKLSAgICAgICAgdGVzdEFueVR5cGVFbGVtZW50LnNldFBhcmFtMShuZXcgT2JqZWN0W117InRlc3QiLG51bGx9KTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IHRlc3RBbnlUeXBlRWxlbWVudC5nZXRPTUVsZW1lbnQoVGVzdEFueVR5cGVFbGVtZW50NC5NWV9RTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCkpOwotICAgICAgICAgICAgU3RyaW5nIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NIEVsZW1lbnQgU3RyaW5nID09PiAiICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvbUVsZW1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgVGVzdEFueVR5cGVFbGVtZW50NCByZXN1bHQgPSBUZXN0QW55VHlwZUVsZW1lbnQ0LkZhY3RvcnkucGFyc2UoeG1sUmVhZGVyKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UGFyYW0xKClbMF0sInRlc3QiKTsKLSAgICAgICAgfSBjYXRjaCAoQURCRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgdGVzdEFueVR5cGVFbGVtZW50NSgpIHsKLSAgICAgICAgVGVzdEFueVR5cGVFbGVtZW50NSB0ZXN0QW55VHlwZUVsZW1lbnQ7Ci0gICAgICAgIHRlc3RBbnlUeXBlRWxlbWVudCA9IG5ldyBUZXN0QW55VHlwZUVsZW1lbnQ1KCk7Ci0gICAgICAgIHRlc3RBbnlUeXBlRWxlbWVudC5zZXRQYXJhbTEobmV3IE9iamVjdFtdeyJ0ZXN0MSIsInRlc3QyIn0pOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gdGVzdEFueVR5cGVFbGVtZW50LmdldE9NRWxlbWVudChUZXN0QW55VHlwZUVsZW1lbnQ1Lk1ZX1FOQU1FLAotICAgICAgICAgICAgICAgICAgICBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT00gRWxlbWVudCBTdHJpbmcgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICBUZXN0QW55VHlwZUVsZW1lbnQ1IHJlc3VsdCA9IFRlc3RBbnlUeXBlRWxlbWVudDUuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTEoKVswXSwidGVzdDEiKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UGFyYW0xKClbMV0sInRlc3QyIik7Ci0gICAgICAgIH0gY2F0Y2ggKEFEQkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLQotICAgICAgICB0ZXN0QW55VHlwZUVsZW1lbnQgPSBuZXcgVGVzdEFueVR5cGVFbGVtZW50NSgpOwotICAgICAgICB0ZXN0QW55VHlwZUVsZW1lbnQuc2V0UGFyYW0xKG51bGwpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gdGVzdEFueVR5cGVFbGVtZW50LmdldE9NRWxlbWVudChUZXN0QW55VHlwZUVsZW1lbnQ1Lk1ZX1FOQU1FLAotICAgICAgICAgICAgICAgICAgICBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT00gRWxlbWVudCBTdHJpbmcgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICBUZXN0QW55VHlwZUVsZW1lbnQ1IHJlc3VsdCA9IFRlc3RBbnlUeXBlRWxlbWVudDUuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTEoKVswXSxudWxsKTsKLSAgICAgICAgfSBjYXRjaCAoQURCRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRlc3RBbnlUeXBlRWxlbWVudCA9IG5ldyBUZXN0QW55VHlwZUVsZW1lbnQ1KCk7Ci0gICAgICAgIHRlc3RBbnlUeXBlRWxlbWVudC5zZXRQYXJhbTEobmV3IE9iamVjdFtdeyJ0ZXN0IixudWxsfSk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSB0ZXN0QW55VHlwZUVsZW1lbnQuZ2V0T01FbGVtZW50KFRlc3RBbnlUeXBlRWxlbWVudDUuTVlfUU5BTUUsCi0gICAgICAgICAgICAgICAgICAgIE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgICAgIFN0cmluZyBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTSBFbGVtZW50IFN0cmluZyA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIFRlc3RBbnlUeXBlRWxlbWVudDUgcmVzdWx0ID0gVGVzdEFueVR5cGVFbGVtZW50NS5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtMSgpWzBdLCJ0ZXN0Iik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtMSgpWzFdLG51bGwpOwotICAgICAgICB9IGNhdGNoIChBREJFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QW55VHlwZUVsZW1lbnQ2KCkgewotICAgICAgICBUZXN0QW55VHlwZUVsZW1lbnQ2IHRlc3RBbnlUeXBlRWxlbWVudDsKLSAgICAgICAgdGVzdEFueVR5cGVFbGVtZW50ID0gbmV3IFRlc3RBbnlUeXBlRWxlbWVudDYoKTsKLSAgICAgICAgdGVzdEFueVR5cGVFbGVtZW50LnNldFBhcmFtMShuZXcgT2JqZWN0W117InRlc3QxIiwidGVzdDIifSk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSB0ZXN0QW55VHlwZUVsZW1lbnQuZ2V0T01FbGVtZW50KFRlc3RBbnlUeXBlRWxlbWVudDYuTVlfUU5BTUUsCi0gICAgICAgICAgICAgICAgICAgIE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgICAgIFN0cmluZyBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTSBFbGVtZW50IFN0cmluZyA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIFRlc3RBbnlUeXBlRWxlbWVudDYgcmVzdWx0ID0gVGVzdEFueVR5cGVFbGVtZW50Ni5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtMSgpWzBdLCJ0ZXN0MSIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTEoKVsxXSwidGVzdDIiKTsKLSAgICAgICAgfSBjYXRjaCAoQURCRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRlc3RBbnlUeXBlRWxlbWVudCA9IG5ldyBUZXN0QW55VHlwZUVsZW1lbnQ2KCk7Ci0gICAgICAgIHRlc3RBbnlUeXBlRWxlbWVudC5zZXRQYXJhbTEobnVsbCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSB0ZXN0QW55VHlwZUVsZW1lbnQuZ2V0T01FbGVtZW50KFRlc3RBbnlUeXBlRWxlbWVudDYuTVlfUU5BTUUsCi0gICAgICAgICAgICAgICAgICAgIE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgICAgIFN0cmluZyBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTSBFbGVtZW50IFN0cmluZyA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEFEQkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHRydWUpOwotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgdGVzdEFueVR5cGVFbGVtZW50ID0gbmV3IFRlc3RBbnlUeXBlRWxlbWVudDYoKTsKLSAgICAgICAgdGVzdEFueVR5cGVFbGVtZW50LnNldFBhcmFtMShuZXcgT2JqZWN0W117InRlc3QiLG51bGx9KTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IHRlc3RBbnlUeXBlRWxlbWVudC5nZXRPTUVsZW1lbnQoVGVzdEFueVR5cGVFbGVtZW50Ni5NWV9RTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCkpOwotICAgICAgICAgICAgU3RyaW5nIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NIEVsZW1lbnQgU3RyaW5nID09PiAiICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoQURCRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUodHJ1ZSk7Ci0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QW55VHlwZUVsZW1lbnQ2MSgpewotICAgICAgICBUZXN0QW55VHlwZUVsZW1lbnQ2IHRlc3RBbnlUeXBlRWxlbWVudDYgPSBuZXcgVGVzdEFueVR5cGVFbGVtZW50NigpOwotCi0gICAgICAgIFRlc3RDb21wbGV4UGFyZW50W10gdGVzdENvbXBsZXhQYXJlbnRzID0gbmV3IFRlc3RDb21wbGV4UGFyZW50WzJdOwotICAgICAgICB0ZXN0Q29tcGxleFBhcmVudHNbMF0gPSBuZXcgVGVzdENvbXBsZXhQYXJlbnQoKTsKLSAgICAgICAgdGVzdENvbXBsZXhQYXJlbnRzWzBdLnNldFBhcmFtMSgidGVzdCBwYXJhbTEiKTsKLQotICAgICAgICBUZXN0Q29tcGxleENoaWxkIHRlc3RDb21wbGV4Q2hpbGQgPSBuZXcgVGVzdENvbXBsZXhDaGlsZCgpOwotICAgICAgICB0ZXN0Q29tcGxleENoaWxkLnNldFBhcmFtMSgidGVzdCBwYXJhbTEiKTsKLSAgICAgICAgdGVzdENvbXBsZXhDaGlsZC5zZXRQYXJhbTIoMyk7Ci0gICAgICAgIHRlc3RDb21wbGV4UGFyZW50c1sxXSA9IHRlc3RDb21wbGV4Q2hpbGQ7Ci0KLSAgICAgICAgdGVzdEFueVR5cGVFbGVtZW50Ni5zZXRQYXJhbTEodGVzdENvbXBsZXhQYXJlbnRzKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IHRlc3RBbnlUeXBlRWxlbWVudDYuZ2V0T01FbGVtZW50KAotICAgICAgICAgICAgICAgICAgICBUZXN0QW55VHlwZUVsZW1lbnQ2Lk1ZX1FOQU1FLE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgICAgIFN0cmluZyBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTSBFbGVtZW50IFN0cmluZyA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcigKLSAgICAgICAgICAgICAgICAgICAgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICBUZXN0QW55VHlwZUVsZW1lbnQ2IHJlc3VsdCA9IFRlc3RBbnlUeXBlRWxlbWVudDYuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpOwotICAgICAgICAgICAgVGVzdENvbXBsZXhQYXJlbnQgcmVzdWx0UGFyZW50ID0gKFRlc3RDb21wbGV4UGFyZW50KSByZXN1bHQuZ2V0UGFyYW0xKClbMF07Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0UGFyZW50LmdldFBhcmFtMSgpLCJ0ZXN0IHBhcmFtMSIpOwotICAgICAgICAgICAgVGVzdENvbXBsZXhDaGlsZCByZXN1bHRDaGlsZCA9IChUZXN0Q29tcGxleENoaWxkKSByZXN1bHQuZ2V0UGFyYW0xKClbMV07Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0Q2hpbGQuZ2V0UGFyYW0xKCksICJ0ZXN0IHBhcmFtMSIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdENoaWxkLmdldFBhcmFtMigpLCAzKTsKLSAgICAgICAgfSBjYXRjaCAoQURCRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QW55VHlwZUVsZW1lbnQ3KCkgewotICAgICAgICBUZXN0QW55VHlwZUVsZW1lbnQ3IHRlc3RBbnlUeXBlRWxlbWVudDsKLQotICAgICAgICB0ZXN0QW55VHlwZUVsZW1lbnQgPSBuZXcgVGVzdEFueVR5cGVFbGVtZW50NygpOwotICAgICAgICB0ZXN0QW55VHlwZUVsZW1lbnQuc2V0UGFyYW0xKCJ0ZXN0Iik7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gdGVzdEFueVR5cGVFbGVtZW50LmdldE9NRWxlbWVudChUZXN0QW55VHlwZUVsZW1lbnQ3Lk1ZX1FOQU1FLAotICAgICAgICAgICAgICAgICAgICBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT00gRWxlbWVudCBTdHJpbmcgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICBUZXN0QW55VHlwZUVsZW1lbnQ3IHJlc3VsdCA9IFRlc3RBbnlUeXBlRWxlbWVudDcuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTEoKSwidGVzdCIpOwotICAgICAgICB9IGNhdGNoIChBREJFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgdGVzdEFueVR5cGVFbGVtZW50ID0gbmV3IFRlc3RBbnlUeXBlRWxlbWVudDcoKTsKLSAgICAgICAgdGVzdEFueVR5cGVFbGVtZW50LnNldFBhcmFtMShudWxsKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSB0ZXN0QW55VHlwZUVsZW1lbnQuZ2V0T01FbGVtZW50KFRlc3RBbnlUeXBlRWxlbWVudDcuTVlfUU5BTUUsCi0gICAgICAgICAgICAgICAgICAgIE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgICAgIFN0cmluZyBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTSBFbGVtZW50IFN0cmluZyA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIFRlc3RBbnlUeXBlRWxlbWVudDcgcmVzdWx0ID0gVGVzdEFueVR5cGVFbGVtZW50Ny5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtMSgpLG51bGwpOwotICAgICAgICB9IGNhdGNoIChBREJFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEFueVR5cGVFbGVtZW50NzEoKXsKLSAgICAgICAgVGVzdEFueVR5cGVFbGVtZW50NyB0ZXN0QW55VHlwZUVsZW1lbnQ3ID0gbmV3IFRlc3RBbnlUeXBlRWxlbWVudDcoKTsKLSAgICAgICAgVGVzdENvbXBsZXhQYXJlbnQgdGVzdENvbXBsZXhQYXJlbnQgPSBuZXcgVGVzdENvbXBsZXhQYXJlbnQoKTsKLSAgICAgICAgdGVzdENvbXBsZXhQYXJlbnQuc2V0UGFyYW0xKCJ0ZXN0IHBhcmFtMSIpOwotICAgICAgICB0ZXN0QW55VHlwZUVsZW1lbnQ3LnNldFBhcmFtMSh0ZXN0Q29tcGxleFBhcmVudCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSB0ZXN0QW55VHlwZUVsZW1lbnQ3LmdldE9NRWxlbWVudCgKLSAgICAgICAgICAgICAgICAgICAgVGVzdEFueVR5cGVFbGVtZW50Ny5NWV9RTkFNRSxPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT00gRWxlbWVudCA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcigKLSAgICAgICAgICAgICAgICAgICAgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICBUZXN0QW55VHlwZUVsZW1lbnQ3IHJlc3VsdCA9IFRlc3RBbnlUeXBlRWxlbWVudDcuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpOwotICAgICAgICAgICAgVGVzdENvbXBsZXhQYXJlbnQgcmVzdWx0UGFyZW50ID0gKFRlc3RDb21wbGV4UGFyZW50KSByZXN1bHQuZ2V0UGFyYW0xKCk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0UGFyZW50LmdldFBhcmFtMSgpLCJ0ZXN0IHBhcmFtMSIpOwotCi0gICAgICAgIH0gY2F0Y2ggKEFEQkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QW55VHlwZUVsZW1lbnQ4KCkgewotICAgICAgICBUZXN0QW55VHlwZUVsZW1lbnQ4IHRlc3RBbnlUeXBlRWxlbWVudDsKLQotICAgICAgICB0ZXN0QW55VHlwZUVsZW1lbnQgPSBuZXcgVGVzdEFueVR5cGVFbGVtZW50OCgpOwotICAgICAgICB0ZXN0QW55VHlwZUVsZW1lbnQuc2V0UGFyYW0xKCJ0ZXN0Iik7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gdGVzdEFueVR5cGVFbGVtZW50LmdldE9NRWxlbWVudChUZXN0QW55VHlwZUVsZW1lbnQ4Lk1ZX1FOQU1FLAotICAgICAgICAgICAgICAgICAgICBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT00gRWxlbWVudCBTdHJpbmcgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICBUZXN0QW55VHlwZUVsZW1lbnQ4IHJlc3VsdCA9IFRlc3RBbnlUeXBlRWxlbWVudDguRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTEoKSwidGVzdCIpOwotICAgICAgICB9IGNhdGNoIChBREJFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgdGVzdEFueVR5cGVFbGVtZW50ID0gbmV3IFRlc3RBbnlUeXBlRWxlbWVudDgoKTsKLSAgICAgICAgdGVzdEFueVR5cGVFbGVtZW50LnNldFBhcmFtMShudWxsKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSB0ZXN0QW55VHlwZUVsZW1lbnQuZ2V0T01FbGVtZW50KFRlc3RBbnlUeXBlRWxlbWVudDguTVlfUU5BTUUsCi0gICAgICAgICAgICAgICAgICAgIE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgICAgIFN0cmluZyBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTSBFbGVtZW50IFN0cmluZyA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIFRlc3RBbnlUeXBlRWxlbWVudDggcmVzdWx0ID0gVGVzdEFueVR5cGVFbGVtZW50OC5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtMSgpLG51bGwpOwotICAgICAgICB9IGNhdGNoIChBREJFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEFueVR5cGVFbGVtZW50OSgpIHsKLSAgICAgICAgVGVzdEFueVR5cGVFbGVtZW50OSB0ZXN0QW55VHlwZUVsZW1lbnQ7Ci0KLSAgICAgICAgdGVzdEFueVR5cGVFbGVtZW50ID0gbmV3IFRlc3RBbnlUeXBlRWxlbWVudDkoKTsKLSAgICAgICAgdGVzdEFueVR5cGVFbGVtZW50LnNldFBhcmFtMSgidGVzdCIpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IHRlc3RBbnlUeXBlRWxlbWVudC5nZXRPTUVsZW1lbnQoVGVzdEFueVR5cGVFbGVtZW50OS5NWV9RTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCkpOwotICAgICAgICAgICAgU3RyaW5nIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NIEVsZW1lbnQgU3RyaW5nID09PiAiICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvbUVsZW1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgVGVzdEFueVR5cGVFbGVtZW50OSByZXN1bHQgPSBUZXN0QW55VHlwZUVsZW1lbnQ5LkZhY3RvcnkucGFyc2UoeG1sUmVhZGVyKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UGFyYW0xKCksInRlc3QiKTsKLSAgICAgICAgfSBjYXRjaCAoQURCRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRlc3RBbnlUeXBlRWxlbWVudCA9IG5ldyBUZXN0QW55VHlwZUVsZW1lbnQ5KCk7Ci0gICAgICAgIHRlc3RBbnlUeXBlRWxlbWVudC5zZXRQYXJhbTEobnVsbCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gdGVzdEFueVR5cGVFbGVtZW50LmdldE9NRWxlbWVudChUZXN0QW55VHlwZUVsZW1lbnQ5Lk1ZX1FOQU1FLAotICAgICAgICAgICAgICAgICAgICBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT00gRWxlbWVudCBTdHJpbmcgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICBUZXN0QW55VHlwZUVsZW1lbnQ5IHJlc3VsdCA9IFRlc3RBbnlUeXBlRWxlbWVudDkuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTEoKSxudWxsKTsKLSAgICAgICAgfSBjYXRjaCAoQURCRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBbnlUeXBlRWxlbWVudDEwKCkgewotICAgICAgICBUZXN0QW55VHlwZUVsZW1lbnQxMCB0ZXN0QW55VHlwZUVsZW1lbnQ7Ci0KLSAgICAgICAgdGVzdEFueVR5cGVFbGVtZW50ID0gbmV3IFRlc3RBbnlUeXBlRWxlbWVudDEwKCk7Ci0gICAgICAgIHRlc3RBbnlUeXBlRWxlbWVudC5zZXRQYXJhbTEoInRlc3QiKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSB0ZXN0QW55VHlwZUVsZW1lbnQuZ2V0T01FbGVtZW50KFRlc3RBbnlUeXBlRWxlbWVudDEwLk1ZX1FOQU1FLAotICAgICAgICAgICAgICAgICAgICBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT00gRWxlbWVudCBTdHJpbmcgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICBUZXN0QW55VHlwZUVsZW1lbnQxMCByZXN1bHQgPSBUZXN0QW55VHlwZUVsZW1lbnQxMC5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtMSgpLCJ0ZXN0Iik7Ci0gICAgICAgIH0gY2F0Y2ggKEFEQkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLQotICAgICAgICB0ZXN0QW55VHlwZUVsZW1lbnQgPSBuZXcgVGVzdEFueVR5cGVFbGVtZW50MTAoKTsKLSAgICAgICAgdGVzdEFueVR5cGVFbGVtZW50LnNldFBhcmFtMShudWxsKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSB0ZXN0QW55VHlwZUVsZW1lbnQuZ2V0T01FbGVtZW50KFRlc3RBbnlUeXBlRWxlbWVudDEwLk1ZX1FOQU1FLAotICAgICAgICAgICAgICAgICAgICBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT00gRWxlbWVudCBTdHJpbmcgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChBREJFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh0cnVlKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBbnlFbGVtZW50SW50ZWdlcigpewotICAgICAgICAvLyBkYXRhdHlwZSB0ZXN0cwotICAgICAgICBUZXN0QW55VHlwZUVsZW1lbnQxIHRlc3RBbnlUeXBlRWxlbWVudDsKLSAgICAgICAgdGVzdEFueVR5cGVFbGVtZW50ID0gbmV3IFRlc3RBbnlUeXBlRWxlbWVudDEoKTsKLSAgICAgICAgdGVzdEFueVR5cGVFbGVtZW50LnNldFRlc3RBbnlUeXBlRWxlbWVudDEobmV3IEludGVnZXIoNSkpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IHRlc3RBbnlUeXBlRWxlbWVudC5nZXRPTUVsZW1lbnQoVGVzdEFueVR5cGVFbGVtZW50MS5NWV9RTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCkpOwotICAgICAgICAgICAgU3RyaW5nIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NIEVsZW1lbnQgU3RyaW5nID09PiAiICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvbUVsZW1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgVGVzdEFueVR5cGVFbGVtZW50MSByZXN1bHQgPSBUZXN0QW55VHlwZUVsZW1lbnQxLkZhY3RvcnkucGFyc2UoeG1sUmVhZGVyKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0VGVzdEFueVR5cGVFbGVtZW50MSgpLG5ldyBJbnRlZ2VyKDUpKTsKLSAgICAgICAgfSBjYXRjaCAoQURCRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBbnlFbGVtZW50UU5hbWUoKXsKLSAgICAgICAgLy8gZGF0YXR5cGUgdGVzdHMKLSAgICAgICAgVGVzdEFueVR5cGVFbGVtZW50MSB0ZXN0QW55VHlwZUVsZW1lbnQ7Ci0gICAgICAgIHRlc3RBbnlUeXBlRWxlbWVudCA9IG5ldyBUZXN0QW55VHlwZUVsZW1lbnQxKCk7Ci0gICAgICAgIHRlc3RBbnlUeXBlRWxlbWVudC5zZXRUZXN0QW55VHlwZUVsZW1lbnQxKG5ldyBRTmFtZSgiaHR0cDovL3dzbzIub3JnIiwidGVzdEVsZW1lbnQiKSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gdGVzdEFueVR5cGVFbGVtZW50LmdldE9NRWxlbWVudChUZXN0QW55VHlwZUVsZW1lbnQxLk1ZX1FOQU1FLAotICAgICAgICAgICAgICAgICAgICBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT00gRWxlbWVudCBTdHJpbmcgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICBUZXN0QW55VHlwZUVsZW1lbnQxIHJlc3VsdCA9IFRlc3RBbnlUeXBlRWxlbWVudDEuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRUZXN0QW55VHlwZUVsZW1lbnQxKCksbmV3IFFOYW1lKCJodHRwOi8vd3NvMi5vcmciLCJ0ZXN0RWxlbWVudCIpKTsKLSAgICAgICAgfSBjYXRjaCAoQURCRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RUZXN0RWxlbWVudCgpewotICAgICAgICBUZXN0RWxlbWVudCB0ZXN0RWxlbWVudCA9IG5ldyBUZXN0RWxlbWVudCgpOwotCi0gICAgICAgIER5bmFtaWNQcm9wZXJ0eVtdIGR5bmFtaWNQcm9wZXJ0aWVzID0gbmV3IER5bmFtaWNQcm9wZXJ0eVszXTsKLSAgICAgICAgVGVzdENvbXBsZXhQYXJlbnQgdGVzdENvbXBsZXhQYXJlbnQgPSBudWxsOwotCi0gICAgICAgIGR5bmFtaWNQcm9wZXJ0aWVzWzBdID0gbmV3IER5bmFtaWNQcm9wZXJ0eSgpOwotICAgICAgICBkeW5hbWljUHJvcGVydGllc1swXS5zZXROYW1lKCJ0ZXN0IG5hbWUiKTsKLSAgICAgICAgZHluYW1pY1Byb3BlcnRpZXNbMF0uc2V0VmFsKG5ldyBJbnRlZ2VyKDUpKTsKLQotICAgICAgICBkeW5hbWljUHJvcGVydGllc1sxXSA9IG5ldyBEeW5hbWljUHJvcGVydHkoKTsKLSAgICAgICAgZHluYW1pY1Byb3BlcnRpZXNbMV0uc2V0TmFtZSgidGVzdCBuYW1lIik7Ci0gICAgICAgIHRlc3RDb21wbGV4UGFyZW50ID0gbmV3IFRlc3RDb21wbGV4UGFyZW50KCk7Ci0gICAgICAgIHRlc3RDb21wbGV4UGFyZW50LnNldFBhcmFtMSgidGVzdCBjb21wbGV4dCB0eXBlIik7Ci0gICAgICAgIGR5bmFtaWNQcm9wZXJ0aWVzWzFdLnNldFZhbCh0ZXN0Q29tcGxleFBhcmVudCk7Ci0KLSAgICAgICAgVGVzdFNpbXBsZVR5cGUgdGVzdFNpbXBsZVR5cGUgPSBuZXcgVGVzdFNpbXBsZVR5cGUoKTsKLSAgICAgICAgdGVzdFNpbXBsZVR5cGUuc2V0VGVzdFNpbXBsZVR5cGUoInRlc3Qgc2ltcGxlIHN0cmluZyIpOwotICAgICAgICBkeW5hbWljUHJvcGVydGllc1syXSA9IG5ldyBEeW5hbWljUHJvcGVydHkoKTsKLSAgICAgICAgZHluYW1pY1Byb3BlcnRpZXNbMl0uc2V0TmFtZSgidGVzdCBuYW1lIik7Ci0gICAgICAgIGR5bmFtaWNQcm9wZXJ0aWVzWzJdLnNldFZhbCh0ZXN0U2ltcGxlVHlwZSk7Ci0KLQotICAgICAgICB0ZXN0RWxlbWVudC5zZXRQYXJhbTEoZHluYW1pY1Byb3BlcnRpZXMpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gdGVzdEVsZW1lbnQuZ2V0T01FbGVtZW50KAotICAgICAgICAgICAgICAgICAgICBUZXN0RWxlbWVudC5NWV9RTkFNRSxPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT00gU3RyaW5nID09PiAiICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKAotICAgICAgICAgICAgICAgICAgICBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIFRlc3RFbGVtZW50IHJlc3VsdCA9IFRlc3RFbGVtZW50LkZhY3RvcnkucGFyc2UoeG1sUmVhZGVyKTsKLSAgICAgICAgICAgIER5bmFtaWNQcm9wZXJ0eVtdIHJlc3VsdFByb3BlcnRpZXMgPSByZXN1bHQuZ2V0UGFyYW0xKCk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0UHJvcGVydGllc1swXS5nZXROYW1lKCksICJ0ZXN0IG5hbWUiKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHRQcm9wZXJ0aWVzWzBdLmdldFZhbCgpLCBuZXcgSW50ZWdlcig1KSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0UHJvcGVydGllc1sxXS5nZXROYW1lKCksICJ0ZXN0IG5hbWUiKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygoKFRlc3RDb21wbGV4UGFyZW50KXJlc3VsdFByb3BlcnRpZXNbMV0uZ2V0VmFsKCkpLmdldFBhcmFtMSgpLCAidGVzdCBjb21wbGV4dCB0eXBlIik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0UHJvcGVydGllc1syXS5nZXROYW1lKCksICJ0ZXN0IG5hbWUiKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygoKFRlc3RTaW1wbGVUeXBlKXJlc3VsdFByb3BlcnRpZXNbMl0uZ2V0VmFsKCkpLmdldFRlc3RTaW1wbGVUeXBlKCksInRlc3Qgc2ltcGxlIHN0cmluZyIpOwotCi0gICAgICAgIH0gY2F0Y2ggKEFEQkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvYXR0cmlidXRlL0F0dHJpYnV0ZVRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvYXR0cmlidXRlL0F0dHJpYnV0ZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg3YjA2NC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL2F0dHJpYnV0ZS9BdHRyaWJ1dGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5hdHRyaWJ1dGU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLnV0aWwuU3RBWFV0aWxzOwotaW1wb3J0IG9yZy50ZW1wdXJpLmF0dHJpYnV0ZS4qOwotCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLQotcHVibGljIGNsYXNzIEF0dHJpYnV0ZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RWxlbWVudDEoKXsKLQotICAgICAgICBUZXN0RWxlbWVudDEgdGVzdEVsZW1lbnQgPSBuZXcgVGVzdEVsZW1lbnQxKCk7Ci0gICAgICAgIHRlc3RFbGVtZW50LnNldEF0dHJpYnV0ZTEoMSk7Ci0gICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQ7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBvbUVsZW1lbnQgPSB0ZXN0RWxlbWVudC5nZXRPTUVsZW1lbnQoVGVzdEVsZW1lbnQxLk1ZX1FOQU1FLCBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT01FbGVtZW50ID09PiAiICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvbUVsZW1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgVGVzdEVsZW1lbnQxIHJlc3VsdCA9IFRlc3RFbGVtZW50MS5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldEF0dHJpYnV0ZTEoKSwxKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRlc3RFbGVtZW50ID0gbmV3IFRlc3RFbGVtZW50MSgpOwotICAgICAgICB0ZXN0RWxlbWVudC5zZXRBdHRyaWJ1dGUxKEludGVnZXIuTUlOX1ZBTFVFKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgb21FbGVtZW50ID0gdGVzdEVsZW1lbnQuZ2V0T01FbGVtZW50KFRlc3RFbGVtZW50MS5NWV9RTkFNRSwgT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCkpOwotICAgICAgICAgICAgU3RyaW5nIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NRWxlbWVudCA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIFRlc3RFbGVtZW50MSByZXN1bHQgPSBUZXN0RWxlbWVudDEuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRBdHRyaWJ1dGUxKCksSW50ZWdlci5NSU5fVkFMVUUpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEVsZW1lbnQyKCl7Ci0gICAgICAgIFRlc3RFbGVtZW50MiB0ZXN0RWxlbWVudCA9IG5ldyBUZXN0RWxlbWVudDIoKTsKLSAgICAgICAgdGVzdEVsZW1lbnQuc2V0QXR0cmlidXRlMSgxKTsKLSAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQ7Ci0gICAgICAgICB0cnkgewotICAgICAgICAgICAgIG9tRWxlbWVudCA9IHRlc3RFbGVtZW50LmdldE9NRWxlbWVudChUZXN0RWxlbWVudDIuTVlfUU5BTUUsIE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgICAgICBTdHJpbmcgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT01FbGVtZW50ID09PiAiICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvbUVsZW1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgVGVzdEVsZW1lbnQyIHJlc3VsdCA9IFRlc3RFbGVtZW50Mi5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldEF0dHJpYnV0ZTEoKSwxKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRlc3RFbGVtZW50ID0gbmV3IFRlc3RFbGVtZW50MigpOwotICAgICAgICB0ZXN0RWxlbWVudC5zZXRBdHRyaWJ1dGUxKEludGVnZXIuTUlOX1ZBTFVFKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgb21FbGVtZW50ID0gdGVzdEVsZW1lbnQuZ2V0T01FbGVtZW50KFRlc3RFbGVtZW50Mi5NWV9RTkFNRSwgT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCkpOwotICAgICAgICAgICAgU3RyaW5nIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NRWxlbWVudCA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHRydWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEVsZW1lbnQzKCl7Ci0gICAgICAgIFRlc3RFbGVtZW50MyB0ZXN0RWxlbWVudCA9IG5ldyBUZXN0RWxlbWVudDMoKTsKLSAgICAgICAgdGVzdEVsZW1lbnQuc2V0QXR0cmlidXRlMSgidGVzdCIpOwotICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudDsKLSAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgb21FbGVtZW50ID0gdGVzdEVsZW1lbnQuZ2V0T01FbGVtZW50KFRlc3RFbGVtZW50My5NWV9RTkFNRSwgT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCkpOwotICAgICAgICAgICAgIFN0cmluZyBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTUVsZW1lbnQgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICBUZXN0RWxlbWVudDMgcmVzdWx0ID0gVGVzdEVsZW1lbnQzLkZhY3RvcnkucGFyc2UoeG1sUmVhZGVyKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0QXR0cmlidXRlMSgpLCJ0ZXN0Iik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLQotICAgICAgICB0ZXN0RWxlbWVudCA9IG5ldyBUZXN0RWxlbWVudDMoKTsKLQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBvbUVsZW1lbnQgPSB0ZXN0RWxlbWVudC5nZXRPTUVsZW1lbnQoVGVzdEVsZW1lbnQzLk1ZX1FOQU1FLCBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT01FbGVtZW50ID09PiAiICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvbUVsZW1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgVGVzdEVsZW1lbnQzIHJlc3VsdCA9IFRlc3RFbGVtZW50My5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldEF0dHJpYnV0ZTEoKSxudWxsKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgICBwdWJsaWMgdm9pZCB0ZXN0RWxlbWVudDQoKXsKLSAgICAgICAgVGVzdEVsZW1lbnQ0IHRlc3RFbGVtZW50ID0gbmV3IFRlc3RFbGVtZW50NCgpOwotICAgICAgICB0ZXN0RWxlbWVudC5zZXRBdHRyaWJ1dGUxKCJ0ZXN0Iik7Ci0gICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQ7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBvbUVsZW1lbnQgPSB0ZXN0RWxlbWVudC5nZXRPTUVsZW1lbnQoVGVzdEVsZW1lbnQ0Lk1ZX1FOQU1FLCBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT01FbGVtZW50ID09PiAiICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvbUVsZW1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgVGVzdEVsZW1lbnQ0IHJlc3VsdCA9IFRlc3RFbGVtZW50NC5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldEF0dHJpYnV0ZTEoKSwidGVzdCIpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgdGVzdEVsZW1lbnQgPSBuZXcgVGVzdEVsZW1lbnQ0KCk7Ci0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgb21FbGVtZW50ID0gdGVzdEVsZW1lbnQuZ2V0T01FbGVtZW50KFRlc3RFbGVtZW50NC5NWV9RTkFNRSwgT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCkpOwotICAgICAgICAgICAgU3RyaW5nIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NRWxlbWVudCA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHRydWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZVNpbXBsZVR5cGUoKXsKLSAgICAgICAgVGVzdEF0dHJpYnV0ZVNpbXBsZVR5cGUgdGVzdEF0dHJpYnV0ZVNpbXBsZVR5cGUgPSBuZXcgVGVzdEF0dHJpYnV0ZVNpbXBsZVR5cGUoKTsKLSAgICAgICAgQXR0cmlidXRlMV90eXBlMCBhdHRyaWJ1dGUxX3R5cGUwID0gbmV3IEF0dHJpYnV0ZTFfdHlwZTAoKTsKLSAgICAgICAgYXR0cmlidXRlMV90eXBlMC5zZXRBdHRyaWJ1dGUxX3R5cGUwKCJ0ZXN0IGF0dHJpYnV0ZSIpOwotICAgICAgICB0ZXN0QXR0cmlidXRlU2ltcGxlVHlwZS5zZXRBdHRyaWJ1dGUxKGF0dHJpYnV0ZTFfdHlwZTApOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gdGVzdEF0dHJpYnV0ZVNpbXBsZVR5cGUuZ2V0T01FbGVtZW50KFRlc3RBdHRyaWJ1dGVTaW1wbGVUeXBlLk1ZX1FOQU1FLAotICAgICAgICAgICAgICAgICAgICAgIE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgICAgIFN0cmluZyBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTVN0cmluZyA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIFRlc3RBdHRyaWJ1dGVTaW1wbGVUeXBlIHJlc3VsdCA9IFRlc3RBdHRyaWJ1dGVTaW1wbGVUeXBlLkZhY3RvcnkucGFyc2UoeG1sUmVhZGVyKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0QXR0cmlidXRlMSgpLmdldEF0dHJpYnV0ZTFfdHlwZTAoKSwidGVzdCBhdHRyaWJ1dGUiKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVSZWZlcmVuY2VFbGVtZW50KCl7Ci0gICAgICAgIFRlc3RBdHRyaWJ1dGVSZWZlcmVuY2VFbGVtZW50IHRlc3RBdHRyaWJ1dGVSZWZlcmVuY2VFbGVtZW50ID0gbmV3IFRlc3RBdHRyaWJ1dGVSZWZlcmVuY2VFbGVtZW50KCk7Ci0gICAgICAgIFRlc3RBdHRyaWJ1dGVSZWZlcmVuY2VUeXBlIHRlc3RBdHRyaWJ1dGVSZWZlcmVuY2VUeXBlID0gbmV3IFRlc3RBdHRyaWJ1dGVSZWZlcmVuY2VUeXBlKCk7Ci0gICAgICAgIHRlc3RBdHRyaWJ1dGVSZWZlcmVuY2VUeXBlLnNldFBhcmFtMSgicGFyYW0xIik7Ci0gICAgICAgIHRlc3RBdHRyaWJ1dGVSZWZlcmVuY2VUeXBlLnNldFBhcmFtMigicGFyYW0yIik7Ci0gICAgICAgIHRlc3RBdHRyaWJ1dGVSZWZlcmVuY2VUeXBlLnNldFRlc3RBdHRyaWJ1dGUxKCJhdHRyaWJ1dGUxIik7Ci0KLSAgICAgICAgdGVzdEF0dHJpYnV0ZVJlZmVyZW5jZUVsZW1lbnQuc2V0VGVzdEF0dHJpYnV0ZVJlZmVyZW5jZUVsZW1lbnQodGVzdEF0dHJpYnV0ZVJlZmVyZW5jZVR5cGUpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gdGVzdEF0dHJpYnV0ZVJlZmVyZW5jZUVsZW1lbnQuZ2V0T01FbGVtZW50KFRlc3RBdHRyaWJ1dGVSZWZlcmVuY2VFbGVtZW50Lk1ZX1FOQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgIE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgICAgIFN0cmluZyBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTSBFbGVtZW50ID09PiAiICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPQotICAgICAgICAgICAgICAgICAgICBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvbUVsZW1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgVGVzdEF0dHJpYnV0ZVJlZmVyZW5jZUVsZW1lbnQgcmVzdWx0ID0gVGVzdEF0dHJpYnV0ZVJlZmVyZW5jZUVsZW1lbnQuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFRlc3RBdHRyaWJ1dGVSZWZlcmVuY2VFbGVtZW50KCkuZ2V0UGFyYW0xKCksInBhcmFtMSIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRUZXN0QXR0cmlidXRlUmVmZXJlbmNlRWxlbWVudCgpLmdldFBhcmFtMigpLCJwYXJhbTIiKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0VGVzdEF0dHJpYnV0ZVJlZmVyZW5jZUVsZW1lbnQoKS5nZXRUZXN0QXR0cmlidXRlMSgpLCJhdHRyaWJ1dGUxIik7Ci0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL2Jhc2U2NGJpbmFyeS9CYXNlNjRCaW5hcnlUZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL2Jhc2U2NGJpbmFyeS9CYXNlNjRCaW5hcnlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0ZGUzMTEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9iYXNlNjRiaW5hcnkvQmFzZTY0QmluYXJ5VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEuYmFzZTY0YmluYXJ5OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uYXR0YWNobWVudHMuQnl0ZUFycmF5RGF0YVNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5TdEFYVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5IZXhCaW5hcnk7Ci1pbXBvcnQgb3JnLnczLnd3dy5fMjAwNS5fMDUueG1sbWltZS4qOwotCi1pbXBvcnQgamF2YXguYWN0aXZhdGlvbi5EYXRhSGFuZGxlcjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotCi0KLXB1YmxpYyBjbGFzcyBCYXNlNjRCaW5hcnlUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHVibGljIHZvaWQgdGVzdEJhc2U2NEJpbmFyeSgpewotICAgICAgICBUZXN0QmFzZTY0QmluYXJ5IHRlc3RCYXNlNjRCaW5hcnkgPSBuZXcgVGVzdEJhc2U2NEJpbmFyeSgpOwotICAgICAgICBCYXNlNjRCaW5hcnkgYmFzZTY0QmluYXJ5ID0gbmV3IEJhc2U2NEJpbmFyeSgpOwotICAgICAgICB0ZXN0QmFzZTY0QmluYXJ5LnNldFRlc3RCYXNlNjRCaW5hcnkoYmFzZTY0QmluYXJ5KTsKLQotICAgICAgICBTdHJpbmcgdGVzdFN0cmluZyA9ICJuZXcgdGVzdCBzdHJpbmciOwotCi0gICAgICAgIERhdGFIYW5kbGVyIGRhdGFIYW5kbGVyID0gbmV3IERhdGFIYW5kbGVyKG5ldyBCeXRlQXJyYXlEYXRhU291cmNlKHRlc3RTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICBiYXNlNjRCaW5hcnkuc2V0QmFzZTY0QmluYXJ5KGRhdGFIYW5kbGVyKTsKLSAgICAgICAgQ29udGVudFR5cGVfdHlwZTAgY29udGVudFR5cGVfdHlwZTAgPSBuZXcgQ29udGVudFR5cGVfdHlwZTAoKTsKLSAgICAgICAgY29udGVudFR5cGVfdHlwZTAuc2V0Q29udGVudFR5cGVfdHlwZTAoInRlc3QgY29udGVudCB0eXBlIik7Ci0gICAgICAgIGJhc2U2NEJpbmFyeS5zZXRDb250ZW50VHlwZShjb250ZW50VHlwZV90eXBlMCk7Ci0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IHRlc3RCYXNlNjRCaW5hcnkuZ2V0T01FbGVtZW50KFRlc3RCYXNlNjRCaW5hcnkuTVlfUU5BTUUsIE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgICAgIFN0cmluZyBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTSBTdHJpbmcgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICBUZXN0QmFzZTY0QmluYXJ5IHJlc3VsdCA9IFRlc3RCYXNlNjRCaW5hcnkuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpOwotICAgICAgICAgICAgRGF0YUhhbmRsZXIgcmVzdWx0RGF0YUhhbmRsZXIgPSByZXN1bHQuZ2V0VGVzdEJhc2U2NEJpbmFyeSgpLmdldEJhc2U2NEJpbmFyeSgpOwotICAgICAgICAgICAgYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbMTI4XTsKLSAgICAgICAgICAgIGludCBsZW5ndGggPSByZXN1bHREYXRhSGFuZGxlci5nZXRJbnB1dFN0cmVhbSgpLnJlYWQoYnl0ZXMpOwotICAgICAgICAgICAgU3RyaW5nIHJlc3VsdFN0cmluZyA9IG5ldyBTdHJpbmcoYnl0ZXMsMCxsZW5ndGgpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdFN0cmluZyx0ZXN0U3RyaW5nKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0VGVzdEJhc2U2NEJpbmFyeSgpLmdldENvbnRlbnRUeXBlKCkuZ2V0Q29udGVudFR5cGVfdHlwZTAoKSwidGVzdCBjb250ZW50IHR5cGUiKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RIZXhCaW5hcnkoKXsKLSAgICAgICAgVGVzdEhleEJpbmFyeSB0ZXN0SGV4QmluYXJ5ID0gbmV3IFRlc3RIZXhCaW5hcnkoKTsKLSAgICAgICAgb3JnLnczLnd3dy5fMjAwNS5fMDUueG1sbWltZS5IZXhCaW5hcnkgaGV4QmluYXJ5ID0gbmV3IG9yZy53My53d3cuXzIwMDUuXzA1LnhtbG1pbWUuSGV4QmluYXJ5KCk7Ci0gICAgICAgIHRlc3RIZXhCaW5hcnkuc2V0VGVzdEhleEJpbmFyeShoZXhCaW5hcnkpOwotCi0gICAgICAgIFN0cmluZyB0ZXN0U3RyaW5nID0gImFiIjsKLQotICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLkhleEJpbmFyeSBhZGJIZXhCaW5hcnkgPQotICAgICAgICAgICAgICAgIG5ldyAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5IZXhCaW5hcnkodGVzdFN0cmluZyk7Ci0KLSAgICAgICAgaGV4QmluYXJ5LnNldEhleEJpbmFyeShhZGJIZXhCaW5hcnkpOwotICAgICAgICBDb250ZW50VHlwZV90eXBlMCBjb250ZW50VHlwZV90eXBlMCA9IG5ldyBDb250ZW50VHlwZV90eXBlMCgpOwotICAgICAgICBjb250ZW50VHlwZV90eXBlMC5zZXRDb250ZW50VHlwZV90eXBlMCgidGVzdCBjb250ZW50IHR5cGUiKTsKLSAgICAgICAgaGV4QmluYXJ5LnNldENvbnRlbnRUeXBlKGNvbnRlbnRUeXBlX3R5cGUwKTsKLQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gdGVzdEhleEJpbmFyeS5nZXRPTUVsZW1lbnQoVGVzdEJhc2U2NEJpbmFyeS5NWV9RTkFNRSwgT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCkpOwotICAgICAgICAgICAgU3RyaW5nIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NIFN0cmluZyA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIFRlc3RIZXhCaW5hcnkgcmVzdWx0ID0gVGVzdEhleEJpbmFyeS5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFRlc3RIZXhCaW5hcnkoKS5nZXRIZXhCaW5hcnkoKS50b1N0cmluZygpLHRlc3RTdHJpbmcpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRUZXN0SGV4QmluYXJ5KCkuZ2V0Q29udGVudFR5cGUoKS5nZXRDb250ZW50VHlwZV90eXBlMCgpLCJ0ZXN0IGNvbnRlbnQgdHlwZSIpOwotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEJhc2U2NE11bHRpRWxlbWVudCgpewotCi0gICAgICAgIFRlc3RCYXNlNjRNdWx0aUVsZW1lbnQgdGVzdEJhc2U2NE11bHRpRWxlbWVudCA9IG5ldyBUZXN0QmFzZTY0TXVsdGlFbGVtZW50KCk7Ci0gICAgICAgIFN0cmluZyB0ZXN0U3RyaW5nID0gInRlc3RpbmcgYmFzZSA2NCBlbGVtZW50cyI7Ci0gICAgICAgIERhdGFIYW5kbGVyIGRhdGFIYW5kbGVyID0gbmV3IERhdGFIYW5kbGVyKG5ldyBCeXRlQXJyYXlEYXRhU291cmNlKHRlc3RTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICB0ZXN0QmFzZTY0TXVsdGlFbGVtZW50LnNldFBhcmFtMShkYXRhSGFuZGxlcik7Ci0gICAgICAgIHRlc3RCYXNlNjRNdWx0aUVsZW1lbnQuc2V0UGFyYW0yKCJ0ZXN0IHN0cmluZyIpOwotICAgICAgICB0ZXN0QmFzZTY0TXVsdGlFbGVtZW50LnNldFBhcmFtMyg1KTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IHRlc3RCYXNlNjRNdWx0aUVsZW1lbnQuZ2V0T01FbGVtZW50KFRlc3RCYXNlNjRNdWx0aUVsZW1lbnQuTVlfUU5BTUUsCi0gICAgICAgICAgICAgICAgICAgIE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgICAgIFN0cmluZyBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTSBFbGVtZW50ID09PiAiICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvbUVsZW1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgVGVzdEJhc2U2NE11bHRpRWxlbWVudCByZXN1bHQgPSBUZXN0QmFzZTY0TXVsdGlFbGVtZW50LkZhY3RvcnkucGFyc2UoeG1sUmVhZGVyKTsKLSAgICAgICAgICAgIERhdGFIYW5kbGVyIHJlc3VsdERhdGFIYW5kbGVyID0gcmVzdWx0LmdldFBhcmFtMSgpOwotICAgICAgICAgICAgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlWzEyOF07Ci0gICAgICAgICAgICBpbnQgbGVuZ3RoID0gcmVzdWx0RGF0YUhhbmRsZXIuZ2V0SW5wdXRTdHJlYW0oKS5yZWFkKGJ1ZmZlcik7Ci0gICAgICAgICAgICBTdHJpbmcgcmVzdWx0U3RyaW5nID0gbmV3IFN0cmluZyhidWZmZXIsMCxsZW5ndGgpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHRlc3RTdHJpbmcscmVzdWx0U3RyaW5nKTsKLSAgICAgICAgfSBjYXRjaCAoQURCRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL2Jvb2xlYW50ZXN0L0Jvb2xlYW5UZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL2Jvb2xlYW50ZXN0L0Jvb2xlYW5UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxMDAyMjguLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9ib29sZWFudGVzdC9Cb29sZWFuVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5ib29sZWFudGVzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5TdEFYVXRpbHM7Ci1pbXBvcnQgb3JnLnRlbXB1cmkuYm9vbGVhbjEuVGVzdEJvb2xlYW4xOwotaW1wb3J0IG9yZy50ZW1wdXJpLmJvb2xlYW4xLlRlc3RCb29sZWFuMjsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci0KLQotcHVibGljIGNsYXNzIEJvb2xlYW5UZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHVibGljIHZvaWQgdGVzdEJvb2xlYW5UZXN0MSgpewotICAgICAgICBUZXN0Qm9vbGVhbjEgdGVzdEJvb2xlYW4gPSBuZXcgVGVzdEJvb2xlYW4xKCk7Ci0gICAgICAgIHRlc3RCb29sZWFuLnNldFRlc3RCb29sZWFuMSh0cnVlKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IHRlc3RCb29sZWFuLmdldE9NRWxlbWVudChUZXN0Qm9vbGVhbjEuTVlfUU5BTUUsIE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgICAgIFN0cmluZyBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTdHJpbmcgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICBUZXN0Qm9vbGVhbjEgcmVzdWx0ID0gVGVzdEJvb2xlYW4xLkZhY3RvcnkucGFyc2UoeG1sUmVhZGVyKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0VGVzdEJvb2xlYW4xKCksdHJ1ZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Qm9vbGVhblRlc3QyKCl7Ci0gICAgICAgIFRlc3RCb29sZWFuMiB0ZXN0Qm9vbGVhbiA9IG5ldyBUZXN0Qm9vbGVhbjIoKTsKLSAgICAgICAgdGVzdEJvb2xlYW4uc2V0UGFyYW0xKGZhbHNlKTsKLSAgICAgICAgdGVzdEJvb2xlYW4uc2V0QXR0cmlidXRlMSh0cnVlKTsKLQotICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSB0ZXN0Qm9vbGVhbi5nZXRPTUVsZW1lbnQoVGVzdEJvb2xlYW4yLk1ZX1FOQU1FLCBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU3RyaW5nID09PiAiICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvbUVsZW1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgVGVzdEJvb2xlYW4yIHJlc3VsdCA9IFRlc3RCb29sZWFuMi5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtMSgpLGZhbHNlKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0QXR0cmlidXRlMSgpLHRydWUpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL2Nob2ljZS9DaGljZVRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvY2hvaWNlL0NoaWNlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDJjNzNkLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvY2hvaWNlL0NoaWNlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5jaG9pY2U7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLnV0aWwuU3RBWFV0aWxzOwotaW1wb3J0IHRlc3QuYXhpczIuYXBhY2hlLm9yZy5UZXN0Q2hvaXNlOwotCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLQotCi1wdWJsaWMgY2xhc3MgQ2hpY2VUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHVibGljIHZvaWQgdGVzdENob2ljZSgpewotICAgICAgICBUZXN0Q2hvaXNlIHRlc3RDaG9pc2UgPSBuZXcgVGVzdENob2lzZSgpOwotICAgICAgICB0ZXN0Q2hvaXNlLnNldENob2ljZTEoInRlc3QgMiIpOwotICAgICAgICB0ZXN0Q2hvaXNlLnNldENob2ljZTIoNSk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSB0ZXN0Q2hvaXNlLmdldE9NRWxlbWVudChUZXN0Q2hvaXNlLk1ZX1FOQU1FLCBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT00gRWxlbWVudCA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIFRlc3RDaG9pc2UgbmV3VGVzdENob2ljZSA9IFRlc3RDaG9pc2UuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDUsbmV3VGVzdENob2ljZS5nZXRDaG9pY2UyKCkpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYXNzZXJ0RmFsc2UodHJ1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL2NvbXBpbGUvQWJzdHJhY3RTY2hlbWFDb21waWxlclRlc3Rlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9jb21waWxlL0Fic3RyYWN0U2NoZW1hQ29tcGlsZXJUZXN0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc2NGM1ZC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL2NvbXBpbGUvQWJzdHJhY3RTY2hlbWFDb21waWxlclRlc3Rlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEuY29tcGlsZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5Db21waWxlck9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEuU2NoZW1hQ29tcGlsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWE7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFDb2xsZWN0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotCi0vKiBNYXZlbiBpcyBhIGxpdHRsZSBkdW1iIHdoZW4gaXQgY29tZXMgdG8gZXhlY3V0aW5nIHRlc3QgY2FzZXMuIEl0IHRyaWVzIHRvIHJ1biBldmVyeXRoaW5nCi0gIHRoYXQgZW5kcyB3aXRoICd0ZXN0JyBldmVuIGlmIHRoZSBjbGFzcyBpcyBhYnN0cmFjdCBvciBub24ganVuaXQhISEhIQotICBSYXRoZXIgdGhhbiBwdXR0aW5nIGFuIGV4cGxpY2l0IGV4Y2x1ZGUsIHRoaXMgaXMgYSBjaGVhcGVyIHdheSBvdXQKLSovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RTY2hlbWFDb21waWxlclRlc3RlciBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIC8vdGhpcyBzaG91bGQgYmUgYW4geHNkIG5hbWUgaW4gdGhlIHRlc3QtcmVzb3VyY2UgZGlyZWN0b3J5Ci0gICAgcHJvdGVjdGVkIFN0cmluZyBmaWxlTmFtZSA9ICIiOwotICAgIHByb3RlY3RlZCAgWG1sU2NoZW1hIGN1cnJlbnRTY2hlbWE7Ci0gICAgcHJvdGVjdGVkIEZpbGUgb3V0cHV0Rm9sZGVyID0gbnVsbDsKLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBURU1QX09VVF9GT0xERVI9InRlbXBfY29tcGlsZSI7Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvL2xvYWQgdGhlIGN1cnJlbnQgU2NoZW1hIHRocm91Z2ggYSBmaWxlCi0gICAgICAgIC8vZmlyc3QgcmVhZCB0aGUgZmlsZSBpbnRvIGEgRE9NCi0gICAgICAgIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZG9jdW1lbnRCdWlsZGVyRmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgZG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKLQotICAgICAgICBEb2N1bWVudEJ1aWxkZXIgYnVpbGRlciA9ICBkb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpOwotICAgICAgICBEb2N1bWVudCBkb2MgPSBidWlsZGVyLnBhcnNlKG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiYmFzZWRpciIsIi4iKSsiLyIrZmlsZU5hbWUpKTsKLQotICAgICAgICAvL25vdyByZWFkIGl0IHRvIGEgc2NoZW1hCi0gICAgICAgIFhtbFNjaGVtYUNvbGxlY3Rpb24gc2NoZW1hQ29sID0gIGdldFNjaGVtYVJlYWRlcigpOwotICAgICAgICBjdXJyZW50U2NoZW1hID0gc2NoZW1hQ29sLnJlYWQoZG9jLG51bGwpOwotCi0gICAgICAgIG91dHB1dEZvbGRlciA9IG5ldyBGaWxlKFRFTVBfT1VUX0ZPTERFUik7Ci0gICAgICAgIGlmIChvdXRwdXRGb2xkZXIuZXhpc3RzKCkpewotICAgICAgICAgICAgaWYgKG91dHB1dEZvbGRlci5pc0ZpbGUoKSl7Ci0gICAgICAgICAgICAgICAgb3V0cHV0Rm9sZGVyLmRlbGV0ZSgpOwotICAgICAgICAgICAgICAgIG91dHB1dEZvbGRlci5ta2RpcnMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICBvdXRwdXRGb2xkZXIubWtkaXJzKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgIFhtbFNjaGVtYUNvbGxlY3Rpb24gZ2V0U2NoZW1hUmVhZGVyKCl7Ci0gICAgICAgIHJldHVybiBuZXcgWG1sU2NoZW1hQ29sbGVjdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uewotICAgICAgICBDb21waWxlck9wdGlvbnMgY29tcGlsZXJPcHRpb25zID0gbmV3IENvbXBpbGVyT3B0aW9ucygpOwotICAgICAgICBjb21waWxlck9wdGlvbnMuc2V0T3V0cHV0TG9jYXRpb24ob3V0cHV0Rm9sZGVyKTsKLSAgICAgICAgY29tcGlsZXJPcHRpb25zLnNldFdyYXBDbGFzc2VzKGZhbHNlKTsKLSAgICAgICAgY29tcGlsZXJPcHRpb25zLnNldFdyaXRlT3V0cHV0KHRydWUpOwotICAgICAgICBTY2hlbWFDb21waWxlciBjb21waWxlciA9IG5ldyBTY2hlbWFDb21waWxlcihjb21waWxlck9wdGlvbnMpOwotICAgICAgICBjb21waWxlci5jb21waWxlKGN1cnJlbnRTY2hlbWEpOwotICAgICAgIAotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgICBkZWxldGVEaXIob3V0cHV0Rm9sZGVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZWxldGVzIGFsbCBmaWxlcyBhbmQgc3ViZGlyZWN0b3JpZXMgdW5kZXIgZGlyLgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiBhbGwgZGVsZXRpb25zIHdlcmUgc3VjY2Vzc2Z1bC4KLSAgICAgKiBJZiBhIGRlbGV0aW9uIGZhaWxzLCB0aGUgbWV0aG9kIHN0b3BzIGF0dGVtcHRpbmcgdG8gZGVsZXRlIGFuZCByZXR1cm5zIGZhbHNlLgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBkZWxldGVEaXIoRmlsZSBkaXIpIHsKLSAgICAgICAgaWYgKGRpci5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICBTdHJpbmdbXSBjaGlsZHJlbiA9IGRpci5saXN0KCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8Y2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSBkZWxldGVEaXIobmV3IEZpbGUoZGlyLCBjaGlsZHJlbltpXSkpOwotICAgICAgICAgICAgICAgIGlmICghc3VjY2VzcykgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVGhlIGRpcmVjdG9yeSBpcyBub3cgZW1wdHkgc28gZGVsZXRlIGl0Ci0gICAgICAgIHJldHVybiBkaXIuZGVsZXRlKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9jb21waWxlL0Fub255bW91c0NvbXBsZXhUeXBlVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9jb21waWxlL0Fub255bW91c0NvbXBsZXhUeXBlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjk5MDUzLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvY29tcGlsZS9Bbm9ueW1vdXNDb21wbGV4VHlwZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEuY29tcGlsZTsKLQotcHVibGljIGNsYXNzIEFub255bW91c0NvbXBsZXhUeXBlVGVzdCBleHRlbmRzIEFic3RyYWN0U2NoZW1hQ29tcGlsZXJUZXN0ZXIgewotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMuZmlsZU5hbWUgPSAidGVzdC1yZXNvdXJjZXMveHNkL2Fub255bW91c19jb21wbGV4VHlwZS54c2QiOwotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvY29tcGlsZS9Db21wbGV4QWxsVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9jb21waWxlL0NvbXBsZXhBbGxUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmZGI3NzUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9jb21waWxlL0NvbXBsZXhBbGxUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLmNvbXBpbGU7Ci0KLXB1YmxpYyBjbGFzcyBDb21wbGV4QWxsVGVzdCBleHRlbmRzIEFic3RyYWN0U2NoZW1hQ29tcGlsZXJUZXN0ZXIgewotICAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAgdGhpcy5maWxlTmFtZSA9ICJ0ZXN0LXJlc291cmNlcy94c2QvY29tcGxleF9hbGwueHNkIjsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9jb21waWxlL0NvbXBsZXhFeHRlbnNpb25UZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL2NvbXBpbGUvQ29tcGxleEV4dGVuc2lvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM1NDMzOC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL2NvbXBpbGUvQ29tcGxleEV4dGVuc2lvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEuY29tcGlsZTsKLQotcHVibGljIGNsYXNzIENvbXBsZXhFeHRlbnNpb25UZXN0IGV4dGVuZHMgQWJzdHJhY3RTY2hlbWFDb21waWxlclRlc3RlcnsKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0aGlzLmZpbGVOYW1lID0gInRlc3QtcmVzb3VyY2VzL3hzZC9jb21wbGV4X2NvbnRlbnRfZXh0ZW5zaW9uLnhzZCI7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgfQotCi0gICAKLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvY29tcGlsZS9JbXBvcnRUZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL2NvbXBpbGUvSW1wb3J0VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODJmOTU3Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvY29tcGlsZS9JbXBvcnRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLmNvbXBpbGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYUNvbGxlY3Rpb247Ci0KLXB1YmxpYyBjbGFzcyBJbXBvcnRUZXN0IGV4dGVuZHMgQWJzdHJhY3RTY2hlbWFDb21waWxlclRlc3RlcnsKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0aGlzLmZpbGVOYW1lID0gInRlc3QtcmVzb3VyY2VzL3hzZC9pbXBvcnQueHNkIjsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgWG1sU2NoZW1hQ29sbGVjdGlvbiBnZXRTY2hlbWFSZWFkZXIoKSB7Ci0gICAgICAgIFhtbFNjaGVtYUNvbGxlY3Rpb24gcmVhZGVyID0gbmV3IFhtbFNjaGVtYUNvbGxlY3Rpb24oKTsKLSAgICAgICAgcmVhZGVyLnNldEJhc2VVcmkoU3lzdGVtLmdldFByb3BlcnR5KCJiYXNlZGlyIiwiLiIpKyIvIisidGVzdC1yZXNvdXJjZXMveHNkIik7Ci0gICAgICAgIHJldHVybiByZWFkZXI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9jb21waWxlL1JlY3Vyc2l2ZUNvbXBpbGVUZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL2NvbXBpbGUvUmVjdXJzaXZlQ29tcGlsZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBmZTQ2Ni4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL2NvbXBpbGUvUmVjdXJzaXZlQ29tcGlsZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEuY29tcGlsZTsKLQotcHVibGljIGNsYXNzIFJlY3Vyc2l2ZUNvbXBpbGVUZXN0IGV4dGVuZHMgQWJzdHJhY3RTY2hlbWFDb21waWxlclRlc3RlciB7Ci0gICAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAgdGhpcy5maWxlTmFtZSA9ICJ0ZXN0LXJlc291cmNlcy94c2Qvc2ltcGxlX3JlY3Vyc2l2ZS54c2QiOwotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL2NvbXBpbGUvU2ltcGxlQW55QXR0cmliVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9jb21waWxlL1NpbXBsZUFueUF0dHJpYlRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM2OTJjMy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL2NvbXBpbGUvU2ltcGxlQW55QXR0cmliVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5jb21waWxlOwotCi1wdWJsaWMgY2xhc3MgU2ltcGxlQW55QXR0cmliVGVzdCBleHRlbmRzIEFic3RyYWN0U2NoZW1hQ29tcGlsZXJUZXN0ZXIgewotICAgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgIHRoaXMuZmlsZU5hbWUgPSAidGVzdC1yZXNvdXJjZXMveHNkL3NpbXBsZV9hbnlfYXR0cmlidXRlLnhzZCI7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9jb21waWxlL1NpbXBsZUFueVRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvY29tcGlsZS9TaW1wbGVBbnlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkY2ZlMWIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9jb21waWxlL1NpbXBsZUFueVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEuY29tcGlsZTsKLQotcHVibGljIGNsYXNzIFNpbXBsZUFueVRlc3QgZXh0ZW5kcyBBYnN0cmFjdFNjaGVtYUNvbXBpbGVyVGVzdGVyIHsKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAgdGhpcy5maWxlTmFtZSA9ICJ0ZXN0LXJlc291cmNlcy94c2Qvc2ltcGxlX2FueS54c2QiOwotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvY29tcGlsZS9TaW1wbGVBbnlUeXBlVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9jb21waWxlL1NpbXBsZUFueVR5cGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNzgzMzQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9jb21waWxlL1NpbXBsZUFueVR5cGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLmNvbXBpbGU7Ci0KLXB1YmxpYyBjbGFzcyBTaW1wbGVBbnlUeXBlVGVzdCBleHRlbmRzIEFic3RyYWN0U2NoZW1hQ29tcGlsZXJUZXN0ZXIgewotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5maWxlTmFtZSA9ICJ0ZXN0LXJlc291cmNlcy94c2Qvc2ltcGxlX2FueXR5cGUueHNkIjsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICB9Ci0KLSAgCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL2NvbXBpbGUvU2ltcGxlQXR0cmlidXRlVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9jb21waWxlL1NpbXBsZUF0dHJpYnV0ZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYzMjc5ZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL2NvbXBpbGUvU2ltcGxlQXR0cmlidXRlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5jb21waWxlOwotCi1wdWJsaWMgY2xhc3MgU2ltcGxlQXR0cmlidXRlVGVzdCBleHRlbmRzIEFic3RyYWN0U2NoZW1hQ29tcGlsZXJUZXN0ZXIgewotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5maWxlTmFtZSA9ICJ0ZXN0LXJlc291cmNlcy94c2Qvc2ltcGxlX2F0dHJpYi54c2QiOwotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9jb21waWxlL1NpbXBsZUNob2ljZVRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvY29tcGlsZS9TaW1wbGVDaG9pY2VUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzZDllNDEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9jb21waWxlL1NpbXBsZUNob2ljZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEuY29tcGlsZTsKLQotcHVibGljIGNsYXNzIFNpbXBsZUNob2ljZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdFNjaGVtYUNvbXBpbGVyVGVzdGVyIHsKLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMuZmlsZU5hbWUgPSAidGVzdC1yZXNvdXJjZXMveHNkL3NpbXBsZV9jaG9pY2UueHNkIjsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICB9Ci0KLSAgIAotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9jb21waWxlL1NpbXBsZUNvbnRlbnRFeHRlbnNpb25UZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL2NvbXBpbGUvU2ltcGxlQ29udGVudEV4dGVuc2lvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzUxOTYwNi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL2NvbXBpbGUvU2ltcGxlQ29udGVudEV4dGVuc2lvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEuY29tcGlsZTsKLQotcHVibGljIGNsYXNzIFNpbXBsZUNvbnRlbnRFeHRlbnNpb25UZXN0IGV4dGVuZHMgQWJzdHJhY3RTY2hlbWFDb21waWxlclRlc3RlcnsKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0aGlzLmZpbGVOYW1lID0gInRlc3QtcmVzb3VyY2VzL3hzZC9zaW1wbGVfY29udGVudF9leHRlbnNpb24ueHNkIjsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL2NvbXBpbGUvU2ltcGxlRWxlbWVudFJlZmVyZW5jZVRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvY29tcGlsZS9TaW1wbGVFbGVtZW50UmVmZXJlbmNlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzdmYTNlLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvY29tcGlsZS9TaW1wbGVFbGVtZW50UmVmZXJlbmNlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5jb21waWxlOwotCi1wdWJsaWMgY2xhc3MgU2ltcGxlRWxlbWVudFJlZmVyZW5jZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdFNjaGVtYUNvbXBpbGVyVGVzdGVyIHsKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0aGlzLmZpbGVOYW1lID0gInRlc3QtcmVzb3VyY2VzL3hzZC9zaW1wbGVfZWxlbWVudF9yZWZlcmVuY2UueHNkIjsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL2NvbXBpbGUvU2ltcGxlRWxlbWVudFRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvY29tcGlsZS9TaW1wbGVFbGVtZW50VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmVlNTU0Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvY29tcGlsZS9TaW1wbGVFbGVtZW50VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5jb21waWxlOwotCi1wdWJsaWMgY2xhc3MgU2ltcGxlRWxlbWVudFRlc3QgZXh0ZW5kcyBBYnN0cmFjdFNjaGVtYUNvbXBpbGVyVGVzdGVyIHsKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0aGlzLmZpbGVOYW1lID0gInRlc3QtcmVzb3VyY2VzL3hzZC9zaW1wbGVfZWxlbWVudC54c2QiOwotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvY29tcGlsZS9TaW1wbGVQYXJ0aWNsZUFsbFRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvY29tcGlsZS9TaW1wbGVQYXJ0aWNsZUFsbFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjgzNzk0My4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL2NvbXBpbGUvU2ltcGxlUGFydGljbGVBbGxUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLmNvbXBpbGU7Ci0KLXB1YmxpYyBjbGFzcyBTaW1wbGVQYXJ0aWNsZUFsbFRlc3QgZXh0ZW5kcyBBYnN0cmFjdFNjaGVtYUNvbXBpbGVyVGVzdGVyIHsKLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMuZmlsZU5hbWUgPSAidGVzdC1yZXNvdXJjZXMveHNkL3NpbXBsZV9wYXJ0aWNsZV9hbGwueHNkIjsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICB9Ci0KLSAgIAotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9jb21waWxlL1NpbXBsZVJlc3RyaWN0aW9uVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9jb21waWxlL1NpbXBsZVJlc3RyaWN0aW9uVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjY1MTc3Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvY29tcGlsZS9TaW1wbGVSZXN0cmljdGlvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEuY29tcGlsZTsKLQotcHVibGljIGNsYXNzIFNpbXBsZVJlc3RyaWN0aW9uVGVzdCBleHRlbmRzIEFic3RyYWN0U2NoZW1hQ29tcGlsZXJUZXN0ZXJ7Ci0gICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMuZmlsZU5hbWUgPSAidGVzdC1yZXNvdXJjZXMveHNkL3NpbXBsZV9yZXN0cmljdGlvbi54c2QiOwotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9jb21waWxlL1NpbXBsZVNlcXVlbmNlMlRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvY29tcGlsZS9TaW1wbGVTZXF1ZW5jZTJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMWY2NjcuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9jb21waWxlL1NpbXBsZVNlcXVlbmNlMlRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEuY29tcGlsZTsKLQotcHVibGljIGNsYXNzIFNpbXBsZVNlcXVlbmNlMlRlc3QgZXh0ZW5kcyBBYnN0cmFjdFNjaGVtYUNvbXBpbGVyVGVzdGVyIHsKLSAgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5maWxlTmFtZSA9ICJ0ZXN0LXJlc291cmNlcy94c2Qvc2ltcGxlX3NlcXVlbmNlXzIueHNkIjsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvY29tcGlsZS9TaW1wbGVTZXF1ZW5jZVRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvY29tcGlsZS9TaW1wbGVTZXF1ZW5jZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjJhYjRjYS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL2NvbXBpbGUvU2ltcGxlU2VxdWVuY2VUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLmNvbXBpbGU7Ci0KLXB1YmxpYyBjbGFzcyBTaW1wbGVTZXF1ZW5jZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdFNjaGVtYUNvbXBpbGVyVGVzdGVyIHsKLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMuZmlsZU5hbWUgPSAidGVzdC1yZXNvdXJjZXMveHNkL3NpbXBsZV9zZXF1ZW5jZS54c2QiOwotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL2NvbXBpbGUvWG1sTWF4T2NjdXJzMlRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvY29tcGlsZS9YbWxNYXhPY2N1cnMyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDhjNDhhLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvY29tcGlsZS9YbWxNYXhPY2N1cnMyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5jb21waWxlOwotCi1wdWJsaWMgY2xhc3MgWG1sTWF4T2NjdXJzMlRlc3QgZXh0ZW5kcyBBYnN0cmFjdFNjaGVtYUNvbXBpbGVyVGVzdGVyIHsKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0aGlzLmZpbGVOYW1lID0gInRlc3QtcmVzb3VyY2VzL3hzZC9zaW1wbGVfbWF4T2NjdXJzMi54c2QiOwotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9jb21waWxlL1htbG1heE9jY3Vyc1Rlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvY29tcGlsZS9YbWxtYXhPY2N1cnNUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiYjM3YzcuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9jb21waWxlL1htbG1heE9jY3Vyc1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEuY29tcGlsZTsKLQotcHVibGljIGNsYXNzIFhtbG1heE9jY3Vyc1Rlc3QgZXh0ZW5kcyBBYnN0cmFjdFNjaGVtYUNvbXBpbGVyVGVzdGVyIHsKLSAgICAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0aGlzLmZpbGVOYW1lID0gInRlc3QtcmVzb3VyY2VzL3hzZC9zaW1wbGVfbWF4T2NjdXJzLnhzZCI7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9jb21waWxlL3NpbXBsZS9TaW1wbGVUeXBlQWxsQ29tcGlsZVRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvY29tcGlsZS9zaW1wbGUvU2ltcGxlVHlwZUFsbENvbXBpbGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjYzFkNTIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9jb21waWxlL3NpbXBsZS9TaW1wbGVUeXBlQWxsQ29tcGlsZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEuY29tcGlsZS5zaW1wbGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5jb21waWxlLkFic3RyYWN0U2NoZW1hQ29tcGlsZXJUZXN0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBTaW1wbGVUeXBlQWxsQ29tcGlsZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdFNjaGVtYUNvbXBpbGVyVGVzdGVyIHsKLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMuZmlsZU5hbWUgPSAidGVzdC1yZXNvdXJjZXMveHNkL3NpbXBsZS9zaW1wbGVUeXBlLUFsbC54c2QiOwotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvZGVjaW1hbC9EZWNpbWFsVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9kZWNpbWFsL0RlY2ltYWxUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3N2E2Y2YuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9kZWNpbWFsL0RlY2ltYWxUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLmRlY2ltYWw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLnV0aWwuU3RBWFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuRHVyYXRpb247Ci1pbXBvcnQgb3JnLnRlbXB1cmkuYm9vbGVhbjEuQXJyYXlPZkRlY2ltYWw7Ci1pbXBvcnQgb3JnLnRlbXB1cmkuYm9vbGVhbjEuR2V0SGlzdG9yaWNOYXZSZXNwb25zZTsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7Ci1pbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOwotCi0KLXB1YmxpYyBjbGFzcyBEZWNpbWFsVGVzdCAgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGVjaW1hbCgpewotICAgICAgICBHZXRIaXN0b3JpY05hdlJlc3BvbnNlIGdldEhpc3RvcmljTmF2UmVzcG9uc2UgPSBuZXcgR2V0SGlzdG9yaWNOYXZSZXNwb25zZSgpOwotICAgICAgICBBcnJheU9mRGVjaW1hbCBhcnJheU9mRGVjaW1hbCA9IG5ldyBBcnJheU9mRGVjaW1hbCgpOwotICAgICAgICBnZXRIaXN0b3JpY05hdlJlc3BvbnNlLnNldE91dChhcnJheU9mRGVjaW1hbCk7Ci0gICAgICAgIGFycmF5T2ZEZWNpbWFsLmFkZERlY2ltYWwobnVsbCk7Ci0gICAgICAgIGFycmF5T2ZEZWNpbWFsLmFkZERlY2ltYWwobnVsbCk7Ci0gICAgICAgIGFycmF5T2ZEZWNpbWFsLmFkZERlY2ltYWwobmV3IEJpZ0RlY2ltYWwoIjExMS4zOCIpKTsKLSAgICAgICAgYXJyYXlPZkRlY2ltYWwuYWRkRGVjaW1hbChuZXcgQmlnRGVjaW1hbCgiMTExLjM4IikpOwotICAgICAgICBhcnJheU9mRGVjaW1hbC5hZGREZWNpbWFsKG5ldyBCaWdEZWNpbWFsKCIxMTEuMzgiKSk7Ci0gICAgICAgIGFycmF5T2ZEZWNpbWFsLmFkZERlY2ltYWwobmV3IEJpZ0RlY2ltYWwoIjExMS41NCIpKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IGdldEhpc3RvcmljTmF2UmVzcG9uc2UuZ2V0T01FbGVtZW50KEdldEhpc3RvcmljTmF2UmVzcG9uc2UuTVlfUU5BTUUsCi0gICAgICAgICAgICAgICAgICAgIE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgICAgIFN0cmluZyBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTSBTdHJpbmcgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9Ci0gICAgICAgICAgICAgICAgICAgIFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICBHZXRIaXN0b3JpY05hdlJlc3BvbnNlIHJlc3VsdCA9IEdldEhpc3RvcmljTmF2UmVzcG9uc2UuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRPdXQoKS5nZXREZWNpbWFsKClbMF0sIG51bGwpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRPdXQoKS5nZXREZWNpbWFsKClbMV0sIG51bGwpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRPdXQoKS5nZXREZWNpbWFsKClbMl0udG9TdHJpbmcoKSwgIjExMS4zOCIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRPdXQoKS5nZXREZWNpbWFsKClbM10udG9TdHJpbmcoKSwgIjExMS4zOCIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRPdXQoKS5nZXREZWNpbWFsKClbNF0udG9TdHJpbmcoKSwgIjExMS4zOCIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRPdXQoKS5nZXREZWNpbWFsKClbNV0udG9TdHJpbmcoKSwgIjExMS41NCIpOwotICAgICAgICB9IGNhdGNoIChBREJFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdER1cmF0aW9uKCl7Ci0gICAgICAgIENhbGVuZGFyIGNhbGVuZGFyID0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgRHVyYXRpb24gZHVyYXRpb24gPSBuZXcgRHVyYXRpb24oZmFsc2UsMCwwLDIzLDEyLDI0LDIzLjQ1KTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJEdXJhdGlvbiA9PT4gIiArIGR1cmF0aW9uLnRvU3RyaW5nKCkpOwotICAgICAgICAvLyBQMjAwN1k1TTMwRFQ4SDQwTTU1Ljg3UwotICAgICAgICAvLyAiXFwtP1AoXFxkKkQpPyhUKFxcZCpIKT8oXFxkKk0pPyhcXGQqKFxcLlxcZCopP1MpPyk/IgotICAgICAgICBpZiAoZHVyYXRpb24udG9TdHJpbmcoKS5tYXRjaGVzKCJcXC0/UChcXGQqRCk/KFQoXFxkKkgpPyhcXGQqTSk/KFxcZCooXFwuXFxkKik/Uyk/KT8iKSl7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk1hdGNoZXMiKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvZGVmYXVsdG5hbWVzcGFjZXMvRGVmYXVsdE5hbWVzcGFjZXNUZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL2RlZmF1bHRuYW1lc3BhY2VzL0RlZmF1bHROYW1lc3BhY2VzVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzE0MzVkLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvZGVmYXVsdG5hbWVzcGFjZXMvRGVmYXVsdE5hbWVzcGFjZXNUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLmRlZmF1bHRuYW1lc3BhY2VzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS51dGlsLlN0QVhVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTZXJpYWxpemVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlcjsKLWltcG9ydCBvcmcudGVtcHVyaS5kZWZhdWx0bmFtZXBhY2VzLlRlc3RDaGlsZFR5cGU7Ci1pbXBvcnQgb3JnLnRlbXB1cmkuZGVmYXVsdG5hbWVwYWNlcy5UZXN0RWxlbWVudDE7Ci1pbXBvcnQgb3JnLnRlbXB1cmkuZGVmYXVsdG5hbWVwYWNlcy5UZXN0U2ltcGxlVW5pb247Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0TmFtZXNwYWNlc1Rlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VGVzdEVsZW1lbnQxKCkgewotCi0gICAgICAgIFRlc3RFbGVtZW50MSB0ZXN0RWxlbWVudDEgPSBuZXcgVGVzdEVsZW1lbnQxKCk7Ci0KLSAgICAgICAgVGVzdENoaWxkVHlwZSB0ZXN0Q2hpbGRUeXBlID0gbmV3IFRlc3RDaGlsZFR5cGUoKTsKLSAgICAgICAgdGVzdENoaWxkVHlwZS5zZXRQYXJhbTEobmV3IFFOYW1lKCJodHRwOi8vdGVtcHVyaS5vcmcvZGVmYXVsdG5hbWVwYWNlcyIsICJwYXJhbTEiKSk7Ci0gICAgICAgIHRlc3RDaGlsZFR5cGUuc2V0UGFyYW0yKCJQYXJhbTIiKTsKLSAgICAgICAgdGVzdENoaWxkVHlwZS5zZXRQYXJhbTMobmV3IFFOYW1lKCJodHRwOi8vdGVtcHVyaS5vcmcvZGVmYXVsdG5hbWVwYWNlcyIsICJwYXJhbTMiKSk7Ci0gICAgICAgIHRlc3RDaGlsZFR5cGUuc2V0UGFyYW00KCJQYXJhbTQiKTsKLQotICAgICAgICBUZXN0U2ltcGxlVW5pb24gdGVzdFNpbXBsZVVuaW9uMSA9IG5ldyBUZXN0U2ltcGxlVW5pb24oKTsKLSAgICAgICAgdGVzdFNpbXBsZVVuaW9uMS5zZXRPYmplY3QobmV3IFFOYW1lKCJodHRwOi8vdGVtcHVyaS5vcmcvZGVmYXVsdG5hbWVwYWNlcyIsICJwYXJhbTUiKSk7Ci0KLSAgICAgICAgdGVzdENoaWxkVHlwZS5zZXRQYXJhbTUodGVzdFNpbXBsZVVuaW9uMSk7Ci0KLSAgICAgICAgdGVzdENoaWxkVHlwZS5zZXRBdHRyaWJ1dGUxKCJhdHRyaWJ1dGUxIik7Ci0gICAgICAgIHRlc3RDaGlsZFR5cGUuc2V0QXR0cmlidXRlMihuZXcgUU5hbWUoImh0dHA6Ly90ZW1wdXJpLm9yZy9kZWZhdWx0bmFtZXBhY2VzIiwgImF0dHJpYnV0ZTIiKSk7Ci0KLSAgICAgICAgVGVzdFNpbXBsZVVuaW9uIHRlc3RTaW1wbGVVbmlvbjIgPSBuZXcgVGVzdFNpbXBsZVVuaW9uKCk7Ci0gICAgICAgIHRlc3RTaW1wbGVVbmlvbjIuc2V0T2JqZWN0KG5ldyBRTmFtZSgiaHR0cDovL3RlbXB1cmkub3JnL2RlZmF1bHRuYW1lcGFjZXMiLCAiYXR0cmlidXRlMyIpKTsKLQotCi0gICAgICAgIHRlc3RFbGVtZW50MS5zZXRUZXN0RWxlbWVudDEodGVzdENoaWxkVHlwZSk7Ci0gICAgICAgIFN0cmluZ1dyaXRlciBzdHJpbmdXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0KLSAgICAgICAgdHJ5IHsKLQotICAgICAgICAgICAgWE1MU3RyZWFtV3JpdGVyIHhtbFN0cmVhbVdyaXRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1Xcml0ZXIoc3RyaW5nV3JpdGVyKTsKLSAgICAgICAgICAgIE1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciBtdG9tQXdhcmVYTUxTdHJlYW1Xcml0ZXIgPSBuZXcgTVRPTUF3YXJlWE1MU2VyaWFsaXplcih4bWxTdHJlYW1Xcml0ZXIpOwotICAgICAgICAgICAgdGVzdEVsZW1lbnQxLmdldFRlc3RFbGVtZW50MSgpLnNlcmlhbGl6ZShuZXcgUU5hbWUoImh0dHA6Ly90ZW1wdXJpLm9yZy9kZWZhdWx0bmFtZXBhY2VzIiwgIlRlc3RFbGVtZW50MSIsICJuczEiKSwKLSAgICAgICAgICAgICAgICAgICAgT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDExRmFjdG9yeSgpLCBtdG9tQXdhcmVYTUxTdHJlYW1Xcml0ZXIpOwotICAgICAgICAgICAgeG1sU3RyZWFtV3JpdGVyLmZsdXNoKCk7Ci0gICAgICAgICAgICB4bWxTdHJlYW1Xcml0ZXIuY2xvc2UoKTsKLSAgICAgICAgICAgIFN0cmluZyBvbUVsZW1lbnRTdHJpbmcgPSBzdHJpbmdXcml0ZXIudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT00gU3RyaW5nID09PiAiICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvbUVsZW1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgVGVzdEVsZW1lbnQxIHJlc3VsdCA9IFRlc3RFbGVtZW50MS5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcik7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdC5nZXRUZXN0RWxlbWVudDEoKSBpbnN0YW5jZW9mIFRlc3RDaGlsZFR5cGUpOwotICAgICAgICAgICAgVGVzdENoaWxkVHlwZSByZXN1bHRUeXBlID0gKFRlc3RDaGlsZFR5cGUpIHJlc3VsdC5nZXRUZXN0RWxlbWVudDEoKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHRUeXBlLmdldFBhcmFtMSgpLCBuZXcgUU5hbWUoImh0dHA6Ly90ZW1wdXJpLm9yZy9kZWZhdWx0bmFtZXBhY2VzIiwgInBhcmFtMSIpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHRUeXBlLmdldFBhcmFtMigpLCAiUGFyYW0yIik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0VHlwZS5nZXRQYXJhbTMoKSwgbmV3IFFOYW1lKCJodHRwOi8vdGVtcHVyaS5vcmcvZGVmYXVsdG5hbWVwYWNlcyIsICJwYXJhbTMiKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0VHlwZS5nZXRQYXJhbTQoKSwgIlBhcmFtNCIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdFR5cGUuZ2V0QXR0cmlidXRlMSgpLCAiYXR0cmlidXRlMSIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdFR5cGUuZ2V0QXR0cmlidXRlMigpLCBuZXcgUU5hbWUoImh0dHA6Ly90ZW1wdXJpLm9yZy9kZWZhdWx0bmFtZXBhY2VzIiwgImF0dHJpYnV0ZTIiKSk7Ci0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL2RlZmF1bHR2YWx1ZS9EZWZhdWx0VmFsdWVUZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL2RlZmF1bHR2YWx1ZS9EZWZhdWx0VmFsdWVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyODA2ODUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9kZWZhdWx0dmFsdWUvRGVmYXVsdFZhbHVlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5kZWZhdWx0dmFsdWU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLnRlbXB1cmkuYm9vbGVhbjEuVGVzdEVsZW1lbnQxOwotaW1wb3J0IG9yZy50ZW1wdXJpLmJvb2xlYW4xLlRlc3RFbGVtZW50MjsKLQotcHVibGljIGNsYXNzIERlZmF1bHRWYWx1ZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdFZhbHVlcygpewotICAgICAgICBUZXN0RWxlbWVudDEgdGVzdEVsZW1lbnQxID0gbmV3IFRlc3RFbGVtZW50MSgpOwotICAgICAgICBhc3NlcnRFcXVhbHModGVzdEVsZW1lbnQxLmdldFRlc3RFbGVtZW50MSgpLDU2KTsKLSAgICAgICAgVGVzdEVsZW1lbnQyIHRlc3RFbGVtZW50MiA9IG5ldyBUZXN0RWxlbWVudDIoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHRlc3RFbGVtZW50Mi5nZXRQYXJhbTEoKSwgInRlc3QiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHRlc3RFbGVtZW50Mi5nZXRBdHRyaWJ1dGUxKCksdHJ1ZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9lbnVtZXJhdGlvbi9FbnVtZXJhdGlvblRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvZW51bWVyYXRpb24vRW51bWVyYXRpb25UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1ZDBhMGIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9lbnVtZXJhdGlvbi9FbnVtZXJhdGlvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEuZW51bWVyYXRpb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLnV0aWwuU3RBWFV0aWxzOwotaW1wb3J0IG9yZy50ZW1wdXJpLkNvdW50UGxhY2VzSW5SZWN0OwotaW1wb3J0IG9yZy50ZW1wdXJpLlBsYWNlVHlwZTsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci0KLQotcHVibGljIGNsYXNzIEVudW1lcmF0aW9uVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFbnVtZXJhdGlvbigpewotCi0gICAgICAgIENvdW50UGxhY2VzSW5SZWN0IGNvdW50UGxhY2VzSW5SZWN0ID0gbmV3IENvdW50UGxhY2VzSW5SZWN0KCk7Ci0gICAgICAgIGNvdW50UGxhY2VzSW5SZWN0LnNldExvd2VycmlnaHQoImxvd2VycmlnaHQiKTsKLSAgICAgICAgY291bnRQbGFjZXNJblJlY3Quc2V0VXBwZXJsZWZ0KCJ1cHBlcmxlZnQiKTsKLSAgICAgICAgY291bnRQbGFjZXNJblJlY3Quc2V0UHR5cGUoUGxhY2VUeXBlLlJpdmVyKTsKLQotICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gY291bnRQbGFjZXNJblJlY3QuZ2V0T01FbGVtZW50KENvdW50UGxhY2VzSW5SZWN0Lk1ZX1FOQU1FLE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgICAgIFN0cmluZyBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTSBTdHJpbmcgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICBDb3VudFBsYWNlc0luUmVjdCBuZXdPYmplY3QgPSBDb3VudFBsYWNlc0luUmVjdC5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoY291bnRQbGFjZXNJblJlY3QuZ2V0UHR5cGUoKSxQbGFjZVR5cGUuUml2ZXIpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYXNzZXJ0RmFsc2UodHJ1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL2V4dGVuc2lvbi9Db21wbGV4RXh0ZW5zdGlvblRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvZXh0ZW5zaW9uL0NvbXBsZXhFeHRlbnN0aW9uVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTk2ODdmLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvZXh0ZW5zaW9uL0NvbXBsZXhFeHRlbnN0aW9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5leHRlbnNpb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLnV0aWwuU3RBWFV0aWxzOwotaW1wb3J0IHRlc3QuYXhpczIuYXBhY2hlLm9yZy5CYXNlVHlwZTsKLWltcG9ydCB0ZXN0LmF4aXMyLmFwYWNoZS5vcmcuRXh0ZW5kZWRDb21wbGV4VHlwZTsKLWltcG9ydCB0ZXN0LmF4aXMyLmFwYWNoZS5vcmcuRnVsbE5hbWU7Ci1pbXBvcnQgdGVzdC5heGlzMi5hcGFjaGUub3JnLlRlc3RDb21wbGV4RWxlbWVudDsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci0KLXB1YmxpYyBjbGFzcyBDb21wbGV4RXh0ZW5zdGlvblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcGxleEV4dGVuc2lvbigpIHsKLQotICAgICAgICBUZXN0Q29tcGxleEVsZW1lbnQgdGVzdENvbXBsZXhFbGVtZW50ID0gbmV3IFRlc3RDb21wbGV4RWxlbWVudCgpOwotICAgICAgICBFeHRlbmRlZENvbXBsZXhUeXBlIGV4dGVuZGVkQ29tcGxleFR5cGUgPSBuZXcgRXh0ZW5kZWRDb21wbGV4VHlwZSgpOwotICAgICAgICB0ZXN0Q29tcGxleEVsZW1lbnQuc2V0VGVzdENvbXBsZXhFbGVtZW50KGV4dGVuZGVkQ29tcGxleFR5cGUpOwotICAgICAgICBleHRlbmRlZENvbXBsZXhUeXBlLnNldEZpcnN0KCJBbWlsYSIpOwotICAgICAgICBleHRlbmRlZENvbXBsZXhUeXBlLnNldE1pZGRsZSgiQ2hpbnRoYWthIik7Ci0gICAgICAgIGV4dGVuZGVkQ29tcGxleFR5cGUuc2V0TGFzdCgiU3VyaWFyYWNoY2hpIik7Ci0gICAgICAgIGV4dGVuZGVkQ29tcGxleFR5cGUuc2V0UGFyZW50RWxlbWVudDEoInRlc3QxIik7Ci0gICAgICAgIGV4dGVuZGVkQ29tcGxleFR5cGUuc2V0UGFyZW50RWxlbWVudDIoInRlc3QyIik7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSB0ZXN0Q29tcGxleEVsZW1lbnQuZ2V0T01FbGVtZW50KFRlc3RDb21wbGV4RWxlbWVudC5NWV9RTkFNRSwgT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDExRmFjdG9yeSgpKTsKLSAgICAgICAgICAgIFN0cmluZyBvbUVsZW1lbnRTdHJpbmc7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyOwotICAgICAgICAgICAgVGVzdENvbXBsZXhFbGVtZW50IHJlc3VsdDsKLQotICAgICAgICAgICAgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT00gU3RyaW5nID09PiAiICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgIHhtbFJlYWRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICByZXN1bHQgPSBUZXN0Q29tcGxleEVsZW1lbnQuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRUZXN0Q29tcGxleEVsZW1lbnQoKS5nZXRGaXJzdCgpLCJBbWlsYSIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRUZXN0Q29tcGxleEVsZW1lbnQoKS5nZXRNaWRkbGUoKSwiQ2hpbnRoYWthIik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFRlc3RDb21wbGV4RWxlbWVudCgpLmdldExhc3QoKSwiU3VyaWFyYWNoY2hpIik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFRlc3RDb21wbGV4RWxlbWVudCgpLmdldFBhcmVudEVsZW1lbnQxKCksInRlc3QxIik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFRlc3RDb21wbGV4RWxlbWVudCgpLmdldFBhcmVudEVsZW1lbnQyKCksInRlc3QyIik7Ci0KLSAgICAgICAgICAgIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZygpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTSBTdHJpbmcgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIHJlc3VsdCA9IFRlc3RDb21wbGV4RWxlbWVudC5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFRlc3RDb21wbGV4RWxlbWVudCgpLmdldEZpcnN0KCksIkFtaWxhIik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFRlc3RDb21wbGV4RWxlbWVudCgpLmdldE1pZGRsZSgpLCJDaGludGhha2EiKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0VGVzdENvbXBsZXhFbGVtZW50KCkuZ2V0TGFzdCgpLCJTdXJpYXJhY2hjaGkiKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0VGVzdENvbXBsZXhFbGVtZW50KCkuZ2V0UGFyZW50RWxlbWVudDEoKSwidGVzdDEiKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0VGVzdENvbXBsZXhFbGVtZW50KCkuZ2V0UGFyZW50RWxlbWVudDIoKSwidGVzdDIiKTsKLQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYXNzZXJ0RmFsc2UodHJ1ZSk7Ci0gICAgICAgIH0KLQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvZXh0ZW5zaW9uL1NpbXBsZUV4dGVuc2lvblRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvZXh0ZW5zaW9uL1NpbXBsZUV4dGVuc2lvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTkzZDEzOC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL2V4dGVuc2lvbi9TaW1wbGVFeHRlbnNpb25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLmV4dGVuc2lvbjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5TdEFYVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5MYW5ndWFnZTsKLWltcG9ydCB0ZXN0LmF4aXMyLmFwYWNoZS5vcmcuQmFzZVR5cGU7Ci1pbXBvcnQgdGVzdC5heGlzMi5hcGFjaGUub3JnLkZ1bGxOYW1lOwotaW1wb3J0IHRlc3QuYXhpczIuYXBhY2hlLm9yZy5TaW1wbGVUeXBlOwotCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLQotcHVibGljIGNsYXNzIFNpbXBsZUV4dGVuc2lvblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlVHlwZUNvbXBsZXhFeHRlbnNpb24oKSB7Ci0gICAgICAgIEZ1bGxOYW1lIGZ1bGxOYW1lID0gbmV3IEZ1bGxOYW1lKCk7Ci0gICAgICAgIGZ1bGxOYW1lLnNldEZpcnN0KCJhbWlsYSIpOwotICAgICAgICBmdWxsTmFtZS5zZXRNaWRkbGUoImNoaW50aGFrYSIpOwotICAgICAgICBmdWxsTmFtZS5zZXRMYXN0KCJzdXJpYXJhY2hjaGkiKTsKLSAgICAgICAgZnVsbE5hbWUuc2V0TGFuZ3VhZ2UobmV3IExhbmd1YWdlKCJzaW5naGFsYSIpKTsKLSAgICAgICAgZnVsbE5hbWUuc2V0QXR0cmlidXRlMShCYXNlVHlwZS5GYWN0b3J5LmZyb21TdHJpbmcoQmFzZVR5cGUuX3MxLCAiIikpOwotCi0gICAgICAgIGZ1bGxOYW1lLnNldEF0dHJpYnV0ZTIoU2ltcGxlVHlwZS5GYWN0b3J5LmZyb21TdHJpbmcoIkFUVFJJQlVURSIsICIiKSk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSBmdWxsTmFtZS5nZXRPTUVsZW1lbnQoRnVsbE5hbWUuTVlfUU5BTUUsIE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgb21FbGVtZW50U3RyaW5nOwotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlcjsKLSAgICAgICAgICAgIEZ1bGxOYW1lIG5ld0Z1bGxOYW1lOwotCi0gICAgICAgICAgICBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTSBTdHJpbmcgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIG5ld0Z1bGxOYW1lID0gRnVsbE5hbWUuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG5ld0Z1bGxOYW1lLmdldEZpcnN0KCksICJhbWlsYSIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG5ld0Z1bGxOYW1lLmdldE1pZGRsZSgpLCAiY2hpbnRoYWthIik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMobmV3RnVsbE5hbWUuZ2V0TGFzdCgpLCAic3VyaWFyYWNoY2hpIik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMobmV3RnVsbE5hbWUuZ2V0TGFuZ3VhZ2UoKS50b1N0cmluZygpLCAic2luZ2hhbGEiKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhuZXdGdWxsTmFtZS5nZXRBdHRyaWJ1dGUxKCkudG9TdHJpbmcoKSwgQmFzZVR5cGUuX3MxKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhuZXdGdWxsTmFtZS5nZXRBdHRyaWJ1dGUyKCkudG9TdHJpbmcoKSwgIkFUVFJJQlVURSIpOwotCi0gICAgICAgICAgICBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT00gU3RyaW5nID09PiAiICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgIHhtbFJlYWRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICBuZXdGdWxsTmFtZSA9IEZ1bGxOYW1lLkZhY3RvcnkucGFyc2UoeG1sUmVhZGVyKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhuZXdGdWxsTmFtZS5nZXRGaXJzdCgpLCAiYW1pbGEiKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhuZXdGdWxsTmFtZS5nZXRNaWRkbGUoKSwgImNoaW50aGFrYSIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG5ld0Z1bGxOYW1lLmdldExhc3QoKSwgInN1cmlhcmFjaGNoaSIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG5ld0Z1bGxOYW1lLmdldExhbmd1YWdlKCkudG9TdHJpbmcoKSwgInNpbmdoYWxhIik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMobmV3RnVsbE5hbWUuZ2V0QXR0cmlidXRlMSgpLnRvU3RyaW5nKCksIEJhc2VUeXBlLl9zMSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMobmV3RnVsbE5hbWUuZ2V0QXR0cmlidXRlMigpLnRvU3RyaW5nKCksICJBVFRSSUJVVEUiKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGFzc2VydEZhbHNlKHRydWUpOwotICAgICAgICB9Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvZ3JvdXAvR3JvdXBUZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL2dyb3VwL0dyb3VwVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTZmM2I5Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvZ3JvdXAvR3JvdXBUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5ncm91cDsKLQotaW1wb3J0IGdyb3VwLnRlc3QuYXhpczIuYXBhY2hlLm9yZy4qOwotaW1wb3J0IGdyb3VwLnRlc3QuYXhpczIuYXBhY2hlLm9yZy5UZXN0QXR0cmlidXRlR3JvdXBFbGVtZW50OwotaW1wb3J0IGdyb3VwLnRlc3QuYXhpczIuYXBhY2hlLm9yZy5UZXN0TmVzdGVkQXR0cmlidXRlR3JvdXBFbGVtZW50OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5TdEFYVXRpbHM7Ci0KLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotCi0KLXB1YmxpYyBjbGFzcyBHcm91cFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2VxdWVuY2VHcm91cEVsZW1lbnQoKXsKLQotICAgICAgICBUZXN0U2VxdWVuY2VHcm91cEVsZW1lbnQgdGVzdEdyb3VwU2VxdWVuY2VFbGVtZW50ID0gbmV3IFRlc3RTZXF1ZW5jZUdyb3VwRWxlbWVudCgpOwotICAgICAgICB0ZXN0R3JvdXBTZXF1ZW5jZUVsZW1lbnQuc2V0UGFyYW0xKCJwYXJhbTEiKTsKLSAgICAgICAgVGVzdFNlcXVlbmNlR3JvdXAgdGVzdFNlcXVlbmNlR3JvdXAgPSBuZXcgVGVzdFNlcXVlbmNlR3JvdXAoKTsKLSAgICAgICAgdGVzdFNlcXVlbmNlR3JvdXAuc2V0U2VxdWVuY2VQYXJhbTEoInNlcXVlbmNlUGFyYW0xIik7Ci0gICAgICAgIHRlc3RTZXF1ZW5jZUdyb3VwLnNldFNlcXVlbmNlUGFyYW0yKCJzZXF1ZW5jZVBhcmFtMiIpOwotICAgICAgICB0ZXN0R3JvdXBTZXF1ZW5jZUVsZW1lbnQuc2V0VGVzdFNlcXVlbmNlR3JvdXAodGVzdFNlcXVlbmNlR3JvdXApOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0KLSAgICAgICAgICAgICAgICAgICAgdGVzdEdyb3VwU2VxdWVuY2VFbGVtZW50LmdldE9NRWxlbWVudChUZXN0U2VxdWVuY2VHcm91cEVsZW1lbnQuTVlfUU5BTUUsIE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgICAgIFN0cmluZyBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTSBTdHJpbmcgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9Ci0gICAgICAgICAgICAgICAgICAgIFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICBUZXN0U2VxdWVuY2VHcm91cEVsZW1lbnQgcmVzdWx0ID0gVGVzdFNlcXVlbmNlR3JvdXBFbGVtZW50LkZhY3RvcnkucGFyc2UoeG1sUmVhZGVyKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UGFyYW0xKCksInBhcmFtMSIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRUZXN0U2VxdWVuY2VHcm91cCgpLmdldFNlcXVlbmNlUGFyYW0xKCksInNlcXVlbmNlUGFyYW0xIik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFRlc3RTZXF1ZW5jZUdyb3VwKCkuZ2V0U2VxdWVuY2VQYXJhbTIoKSwic2VxdWVuY2VQYXJhbTIiKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3ROZXN0ZWRTZXF1ZW5jZUdyb3VwRWxlbWVudCgpewotCi0gICAgICAgIFRlc3RTZXF1ZW5jZU5lc3RlZEdyb3VwRWxlbWVudCB0ZXN0U2VxdWVuY2VOZXN0ZWRHcm91cEVsZW1lbnQgPSBuZXcgVGVzdFNlcXVlbmNlTmVzdGVkR3JvdXBFbGVtZW50KCk7Ci0gICAgICAgIHRlc3RTZXF1ZW5jZU5lc3RlZEdyb3VwRWxlbWVudC5zZXRQYXJhbTEoInBhcmFtMSIpOwotCi0gICAgICAgIFRlc3RTZXF1ZW5jZU5lc3RlZEdyb3VwIHRlc3RTZXF1ZW5jZU5lc3RlZEdyb3VwID0gbmV3IFRlc3RTZXF1ZW5jZU5lc3RlZEdyb3VwKCk7Ci0gICAgICAgIHRlc3RTZXF1ZW5jZU5lc3RlZEdyb3VwLnNldE5lc3RlZFNlcXVlbmNlUGFyYW0xKCJuZXN0ZWRTZXF1ZW5jZVBhcmFtMSIpOwotCi0gICAgICAgIFRlc3RTZXF1ZW5jZUdyb3VwIHRlc3RTZXF1ZW5jZUdyb3VwID0gbmV3IFRlc3RTZXF1ZW5jZUdyb3VwKCk7Ci0gICAgICAgIHRlc3RTZXF1ZW5jZUdyb3VwLnNldFNlcXVlbmNlUGFyYW0xKCJzZXF1ZW5jZVBhcmFtMSIpOwotICAgICAgICB0ZXN0U2VxdWVuY2VHcm91cC5zZXRTZXF1ZW5jZVBhcmFtMigic2VxdWVuY2VQYXJhbTIiKTsKLQotICAgICAgICB0ZXN0U2VxdWVuY2VOZXN0ZWRHcm91cC5zZXRUZXN0U2VxdWVuY2VHcm91cCh0ZXN0U2VxdWVuY2VHcm91cCk7Ci0KLSAgICAgICAgdGVzdFNlcXVlbmNlTmVzdGVkR3JvdXBFbGVtZW50LnNldFRlc3RTZXF1ZW5jZU5lc3RlZEdyb3VwKHRlc3RTZXF1ZW5jZU5lc3RlZEdyb3VwKTsKLQotICAgICAgIHRyeSB7Ci0gICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPQotICAgICAgICAgICAgICAgICAgICB0ZXN0U2VxdWVuY2VOZXN0ZWRHcm91cEVsZW1lbnQuZ2V0T01FbGVtZW50KFRlc3RTZXF1ZW5jZU5lc3RlZEdyb3VwRWxlbWVudC5NWV9RTkFNRSwgT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCkpOwotCi0gICAgICAgICAgICBTdHJpbmcgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT00gU3RyaW5nID09PiAiICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPQotICAgICAgICAgICAgICAgICAgICBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvbUVsZW1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgVGVzdFNlcXVlbmNlTmVzdGVkR3JvdXBFbGVtZW50IHJlc3VsdCA9IFRlc3RTZXF1ZW5jZU5lc3RlZEdyb3VwRWxlbWVudC5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtMSgpLCJwYXJhbTEiKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0VGVzdFNlcXVlbmNlTmVzdGVkR3JvdXAoKS5nZXROZXN0ZWRTZXF1ZW5jZVBhcmFtMSgpLCJuZXN0ZWRTZXF1ZW5jZVBhcmFtMSIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRUZXN0U2VxdWVuY2VOZXN0ZWRHcm91cCgpLmdldFRlc3RTZXF1ZW5jZUdyb3VwKCkuZ2V0U2VxdWVuY2VQYXJhbTEoKSwic2VxdWVuY2VQYXJhbTEiKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0VGVzdFNlcXVlbmNlTmVzdGVkR3JvdXAoKS5nZXRUZXN0U2VxdWVuY2VHcm91cCgpLmdldFNlcXVlbmNlUGFyYW0yKCksInNlcXVlbmNlUGFyYW0yIik7Ci0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2hvaWNlR3JvdXBFbGVtZW50KCl7Ci0KLSAgICAgICAgVGVzdENob2ljZUdyb3VwRWxlbWVudCB0ZXN0R3JvdXBDaG9pY2VFbGVtZW50ID0gbmV3IFRlc3RDaG9pY2VHcm91cEVsZW1lbnQoKTsKLSAgICAgICAgdGVzdEdyb3VwQ2hvaWNlRWxlbWVudC5zZXRQYXJhbTEoInBhcmFtMSIpOwotICAgICAgICBUZXN0Q2hvaWNlR3JvdXAgdGVzdENob2ljZUdyb3VwID0gbmV3IFRlc3RDaG9pY2VHcm91cCgpOwotICAgICAgICB0ZXN0Q2hvaWNlR3JvdXAuc2V0Q2hvaWNlUGFyYW0xKCJjaG9pY2VQYXJhbTEiKTsKLSAgICAgICAgdGVzdEdyb3VwQ2hvaWNlRWxlbWVudC5zZXRUZXN0Q2hvaWNlR3JvdXAodGVzdENob2ljZUdyb3VwKTsKLQotICAgICAgIHRyeSB7Ci0gICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPQotICAgICAgICAgICAgICAgICAgIHRlc3RHcm91cENob2ljZUVsZW1lbnQuZ2V0T01FbGVtZW50KFRlc3RDaG9pY2VHcm91cEVsZW1lbnQuTVlfUU5BTUUsIE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgICAgIFN0cmluZyBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTSBTdHJpbmcgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9Ci0gICAgICAgICAgICAgICAgICAgIFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICBUZXN0Q2hvaWNlR3JvdXBFbGVtZW50IHJlc3VsdCA9IFRlc3RDaG9pY2VHcm91cEVsZW1lbnQuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRUZXN0Q2hvaWNlR3JvdXAoKS5nZXRDaG9pY2VQYXJhbTEoKSwiY2hvaWNlUGFyYW0xIik7Ci0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TmVzdGVkQ2hvaWNlR3JvdXBFbGVtZW50KCl7Ci0KLSAgICAgICAgVGVzdENob2ljZU5lc3RlZEdyb3VwRWxlbWVudCB0ZXN0Q2hvaWNlTmVzdGVkR3JvdXBFbGVtZW50ID0gbmV3IFRlc3RDaG9pY2VOZXN0ZWRHcm91cEVsZW1lbnQoKTsKLSAgICAgICAgdGVzdENob2ljZU5lc3RlZEdyb3VwRWxlbWVudC5zZXRQYXJhbTEoInBhcmFtMSIpOwotCi0gICAgICAgIFRlc3RDaG9pY2VOZXN0ZWRHcm91cCB0ZXN0Q2hvaWNlTmVzdGVkR3JvdXAgPSBuZXcgVGVzdENob2ljZU5lc3RlZEdyb3VwKCk7Ci0gICAgICAgIHRlc3RDaG9pY2VOZXN0ZWRHcm91cC5zZXROZXN0ZWRDaG9pY2VQYXJhbTEoIm5lc3RlZENob2ljZVBhcmFtMSIpOwotCi0gICAgICAgIFRlc3RDaG9pY2VHcm91cCB0ZXN0Q2hvaWNlR3JvdXAgPSBuZXcgVGVzdENob2ljZUdyb3VwKCk7Ci0gICAgICAgIHRlc3RDaG9pY2VHcm91cC5zZXRDaG9pY2VQYXJhbTEoImNob2ljZVBhcmFtMSIpOwotCi0gICAgICAgIHRlc3RDaG9pY2VOZXN0ZWRHcm91cC5zZXRUZXN0Q2hvaWNlR3JvdXAodGVzdENob2ljZUdyb3VwKTsKLQotICAgICAgICB0ZXN0Q2hvaWNlTmVzdGVkR3JvdXBFbGVtZW50LnNldFRlc3RDaG9pY2VOZXN0ZWRHcm91cCh0ZXN0Q2hvaWNlTmVzdGVkR3JvdXApOwotCi0gICAgICAgdHJ5IHsKLSAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9Ci0gICAgICAgICAgICAgICAgICAgdGVzdENob2ljZU5lc3RlZEdyb3VwRWxlbWVudC5nZXRPTUVsZW1lbnQodGVzdENob2ljZU5lc3RlZEdyb3VwRWxlbWVudC5NWV9RTkFNRSwgT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCkpOwotICAgICAgICAgICAgU3RyaW5nIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NIFN0cmluZyA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0KLSAgICAgICAgICAgICAgICAgICAgU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIFRlc3RDaG9pY2VOZXN0ZWRHcm91cEVsZW1lbnQgcmVzdWx0ID0gVGVzdENob2ljZU5lc3RlZEdyb3VwRWxlbWVudC5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFRlc3RDaG9pY2VOZXN0ZWRHcm91cCgpLmdldFRlc3RDaG9pY2VHcm91cCgpLmdldENob2ljZVBhcmFtMSgpLCJjaG9pY2VQYXJhbTEiKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgICBwdWJsaWMgdm9pZCB0ZXN0QXR0cmlidXRlR3JvdXAoKXsKLSAgICAgICAgIFRlc3RBdHRyaWJ1dGVHcm91cEVsZW1lbnQgdGVzdEF0dHJpYnV0ZUdyb3VwID0gbmV3IFRlc3RBdHRyaWJ1dGVHcm91cEVsZW1lbnQoKTsKLSAgICAgICAgIHRlc3RBdHRyaWJ1dGVHcm91cC5zZXRBdHRyaWJ1dGUxKCJBdHRyaWJ1dGUxIik7Ci0gICAgICAgICB0ZXN0QXR0cmlidXRlR3JvdXAuc2V0UGFyYW0xKCJQYXJhbTEiKTsKLQotICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0KLSAgICAgICAgICAgICAgICAgICAgICAgdGVzdEF0dHJpYnV0ZUdyb3VwLmdldE9NRWxlbWVudChUZXN0QXR0cmlidXRlR3JvdXBFbGVtZW50Lk1ZX1FOQU1FLE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgICAgICBTdHJpbmcgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NIEVsZW1lbnQgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvbUVsZW1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgIFRlc3RBdHRyaWJ1dGVHcm91cEVsZW1lbnQgcmVzdWx0ID0gVGVzdEF0dHJpYnV0ZUdyb3VwRWxlbWVudC5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcik7Ci0gICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTEoKSwiUGFyYW0xIik7Ci0gICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRBdHRyaWJ1dGUxKCksIkF0dHJpYnV0ZTEiKTsKLSAgICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgICB9Ci0KLSAgICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE5lc3RlZEF0dHJpYnV0ZUdyb3VwKCl7Ci0gICAgICAgICBUZXN0TmVzdGVkQXR0cmlidXRlR3JvdXBFbGVtZW50IHRlc3ROZXN0ZWRBdHRyaWJ1dGVHcm91cEVsZW1lbnQgPSBuZXcgVGVzdE5lc3RlZEF0dHJpYnV0ZUdyb3VwRWxlbWVudCgpOwotICAgICAgICAgdGVzdE5lc3RlZEF0dHJpYnV0ZUdyb3VwRWxlbWVudC5zZXRBdHRyaWJ1dGUxKCJBdHRyaWJ1dGUxIik7Ci0gICAgICAgICB0ZXN0TmVzdGVkQXR0cmlidXRlR3JvdXBFbGVtZW50LnNldEF0dHJpYnV0ZTIoIkF0dHJpYnV0ZTIiKTsKLSAgICAgICAgIHRlc3ROZXN0ZWRBdHRyaWJ1dGVHcm91cEVsZW1lbnQuc2V0UGFyYW0xKCJQYXJhbTEiKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9Ci0gICAgICAgICAgICAgICAgICAgIHRlc3ROZXN0ZWRBdHRyaWJ1dGVHcm91cEVsZW1lbnQuZ2V0T01FbGVtZW50KFRlc3ROZXN0ZWRBdHRyaWJ1dGVHcm91cEVsZW1lbnQuTVlfUU5BTUUsT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCkpOwotICAgICAgICAgICAgIFN0cmluZyBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT00gRWxlbWVudCA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICAgVGVzdE5lc3RlZEF0dHJpYnV0ZUdyb3VwRWxlbWVudCByZXN1bHQgPSBUZXN0TmVzdGVkQXR0cmlidXRlR3JvdXBFbGVtZW50LkZhY3RvcnkucGFyc2UoeG1sUmVhZGVyKTsKLSAgICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtMSgpLCJQYXJhbTEiKTsKLSAgICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldEF0dHJpYnV0ZTEoKSwiQXR0cmlidXRlMSIpOwotICAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0QXR0cmlidXRlMigpLCJBdHRyaWJ1dGUyIik7Ci0gICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICAgfQotCi0gICAgIH0KLQotCi0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvaW5uZXJDaG9pY2UvSW5uZXJDaG9pY2VUZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL2lubmVyQ2hvaWNlL0lubmVyQ2hvaWNlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzRkNWY1Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvaW5uZXJDaG9pY2UvSW5uZXJDaG9pY2VUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5pbm5lckNob2ljZTsKLQotaW1wb3J0IGNvbS5teW5hbWVzcGFjZS50ZXN0aW5uZXJwYXJ0aWNsZS5UZXN0SW5uZXJQYXJ0aWNsZTFTZXF1ZW5jZV90eXBlMDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLnV0aWwuU3RBWFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFNlcmlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyOwotaW1wb3J0IHRlc3QuYXhpczIuYXBhY2hlLm9yZy4qOwotCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLQotcHVibGljIGNsYXNzIElubmVyQ2hvaWNlVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJbm5lckNob2ljZTEoKSB7Ci0gICAgICAgIFRlc3RJbm5lclNlcXVlbmNlMSB0ZXN0U2VxdWVuY2UgPSBuZXcgVGVzdElubmVyU2VxdWVuY2UxKCk7Ci0gICAgICAgIHRlc3RTZXF1ZW5jZS5zZXRTZXF1ZW5jZTEoInRlc3Qgc2VxdWVuY2UiKTsKLSAgICAgICAgdGVzdFNlcXVlbmNlLnNldFNlcXVlbmNlMigzKTsKLQotICAgICAgICBUZXN0SW5uZXJTZXF1ZW5jZTFDaG9pY2VfdHlwZTAgVGVzdElubmVyU2VxdWVuY2UxQ2hvaWNlX3R5cGUwID0gbmV3IFRlc3RJbm5lclNlcXVlbmNlMUNob2ljZV90eXBlMCgpOwotICAgICAgICBUZXN0SW5uZXJTZXF1ZW5jZTFDaG9pY2VfdHlwZTAuc2V0Q2hvaWNlMSgidGVzdCBjaG9pY2UiKTsKLSAgICAgICAgVGVzdElubmVyU2VxdWVuY2UxQ2hvaWNlX3R5cGUwLnNldENob2ljZTIoNSk7Ci0gICAgICAgIHRlc3RTZXF1ZW5jZS5zZXRUZXN0SW5uZXJTZXF1ZW5jZTFDaG9pY2VfdHlwZTAoVGVzdElubmVyU2VxdWVuY2UxQ2hvaWNlX3R5cGUwKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IHRlc3RTZXF1ZW5jZS5nZXRPTUVsZW1lbnQoVGVzdElubmVyU2VxdWVuY2UxLk1ZX1FOQU1FLAotICAgICAgICAgICAgICAgICAgICAgT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDEyRmFjdG9yeSgpKTsKLSAgICAgICAgICAgIFN0cmluZyBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTWVsZW1lbnQgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICBUZXN0SW5uZXJTZXF1ZW5jZTEgcmVzdWx0ID0gVGVzdElubmVyU2VxdWVuY2UxLkZhY3RvcnkucGFyc2UoeG1sUmVhZGVyKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0U2VxdWVuY2UxKCksICJ0ZXN0IHNlcXVlbmNlIik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFNlcXVlbmNlMigpLCAzKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0VGVzdElubmVyU2VxdWVuY2UxQ2hvaWNlX3R5cGUwKCkuZ2V0Q2hvaWNlMigpLCA1KTsKLQotICAgICAgICAgICAgLy8gd3JpdHRpZyByZXN1bHQgYmFjawotICAgICAgICAgICAgWE1MU3RyZWFtV3JpdGVyIHhtbFN0cmVhbVdyaXRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1Xcml0ZXIoU3lzdGVtLm91dCk7Ci0gICAgICAgICAgICBNVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgbXRvbUF3YXJlWE1MU3RyZWFtV3JpdGVyID0gbmV3IE1UT01Bd2FyZVhNTFNlcmlhbGl6ZXIoeG1sU3RyZWFtV3JpdGVyKTsKLSAgICAgICAgICAgIHJlc3VsdC5zZXJpYWxpemUobmV3IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUoIm9yZy5hcGFjaGUuYXhpczIudGVzdCIsICJUZXN0SW5uZXJTZXF1ZW5jZTEiLCAiZm9vIikKLSAgICAgICAgICAgICAgICAgICAgLCBPTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTFGYWN0b3J5KCksIG10b21Bd2FyZVhNTFN0cmVhbVdyaXRlcik7Ci0gICAgICAgICAgICB4bWxTdHJlYW1Xcml0ZXIuZmx1c2goKTsKLQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdElubmVyQ2hvaWNlMjEoKSB7Ci0gICAgICAgIFRlc3RJbm5lclNlcXVlbmNlMiB0ZXN0U2VxdWVuY2UgPSBuZXcgVGVzdElubmVyU2VxdWVuY2UyKCk7Ci0gICAgICAgIHRlc3RTZXF1ZW5jZS5zZXRTZXF1ZW5jZTEoInNlcXVlbmNlIik7Ci0gICAgICAgIHRlc3RTZXF1ZW5jZS5zZXRTZXF1ZW5jZTIoMyk7Ci0gICAgICAgIFRlc3RJbm5lclNlcXVlbmNlMkNob2ljZV90eXBlMCB0ZXN0SW5uZXJTZXF1ZW5jZTJDaG9pY2VfdHlwZTEgPSBuZXcgVGVzdElubmVyU2VxdWVuY2UyQ2hvaWNlX3R5cGUwKCk7Ci0gICAgICAgIHRlc3RJbm5lclNlcXVlbmNlMkNob2ljZV90eXBlMS5zZXRDaG9pY2UxKG5ldyBTdHJpbmdbXXsiY2hvaWNlMSIsICJjaG9pY2UyIn0pOwotICAgICAgICB0ZXN0U2VxdWVuY2Uuc2V0VGVzdElubmVyU2VxdWVuY2UyQ2hvaWNlX3R5cGUwKHRlc3RJbm5lclNlcXVlbmNlMkNob2ljZV90eXBlMSk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSB0ZXN0U2VxdWVuY2UuZ2V0T01FbGVtZW50KFRlc3RJbm5lclNlcXVlbmNlMi5NWV9RTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDEyRmFjdG9yeSgpKTsKLSAgICAgICAgICAgIFN0cmluZyBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTWVsZW1lbnQgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICBUZXN0SW5uZXJTZXF1ZW5jZTIgcmVzdWx0ID0gVGVzdElubmVyU2VxdWVuY2UyLkZhY3RvcnkucGFyc2UoeG1sUmVhZGVyKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0U2VxdWVuY2UxKCksICJzZXF1ZW5jZSIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRTZXF1ZW5jZTIoKSwgMyk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGlzRXF1YWwocmVzdWx0LmdldFRlc3RJbm5lclNlcXVlbmNlMkNob2ljZV90eXBlMCgpLmdldENob2ljZTEoKSwgbmV3IFN0cmluZ1tdeyJjaG9pY2UxIiwgImNob2ljZTIifSkpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdElubmVyQ2hvaWNlMjIoKSB7Ci0gICAgICAgIFRlc3RJbm5lclNlcXVlbmNlMiB0ZXN0U2VxdWVuY2UgPSBuZXcgVGVzdElubmVyU2VxdWVuY2UyKCk7Ci0gICAgICAgIHRlc3RTZXF1ZW5jZS5zZXRTZXF1ZW5jZTEoInNlcXVlbmNlIik7Ci0gICAgICAgIHRlc3RTZXF1ZW5jZS5zZXRTZXF1ZW5jZTIoMyk7Ci0gICAgICAgIFRlc3RJbm5lclNlcXVlbmNlMkNob2ljZV90eXBlMCB0ZXN0SW5uZXJTZXF1ZW5jZTJDaG9pY2VfdHlwZTEgPSBuZXcgVGVzdElubmVyU2VxdWVuY2UyQ2hvaWNlX3R5cGUwKCk7Ci0gICAgICAgIHRlc3RJbm5lclNlcXVlbmNlMkNob2ljZV90eXBlMS5zZXRDaG9pY2UyKG5ldyBpbnRbXXsyLCA0fSk7Ci0gICAgICAgIHRlc3RTZXF1ZW5jZS5zZXRUZXN0SW5uZXJTZXF1ZW5jZTJDaG9pY2VfdHlwZTAodGVzdElubmVyU2VxdWVuY2UyQ2hvaWNlX3R5cGUxKTsKLQotICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gdGVzdFNlcXVlbmNlLmdldE9NRWxlbWVudChUZXN0SW5uZXJTZXF1ZW5jZTIuTVlfUU5BTUUsCi0gICAgICAgICAgICAgICAgICAgICAgT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDEyRmFjdG9yeSgpKTsKLSAgICAgICAgICAgIFN0cmluZyBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTWVsZW1lbnQgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICBUZXN0SW5uZXJTZXF1ZW5jZTIgcmVzdWx0ID0gVGVzdElubmVyU2VxdWVuY2UyLkZhY3RvcnkucGFyc2UoeG1sUmVhZGVyKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0U2VxdWVuY2UxKCksICJzZXF1ZW5jZSIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRTZXF1ZW5jZTIoKSwgMyk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGlzRXF1YWwocmVzdWx0LmdldFRlc3RJbm5lclNlcXVlbmNlMkNob2ljZV90eXBlMCgpLmdldENob2ljZTIoKSwgbmV3IGludFtdezIsIDR9KSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW5uZXJDaG9pY2UzMSgpIHsKLSAgICAgICAgVGVzdElubmVyU2VxdWVuY2UzIHRlc3RTZXF1ZW5jZSA9IG5ldyBUZXN0SW5uZXJTZXF1ZW5jZTMoKTsKLSAgICAgICAgdGVzdFNlcXVlbmNlLnNldFNlcXVlbmNlMSgic2VxdWVuY2UiKTsKLSAgICAgICAgdGVzdFNlcXVlbmNlLnNldFNlcXVlbmNlMigzKTsKLSAgICAgICAgVGVzdElubmVyU2VxdWVuY2UzQ2hvaWNlX3R5cGUwIHRlc3RJbm5lclNlcXVlbmNlM0Nob2ljZV90eXBlMCA9IG5ldyBUZXN0SW5uZXJTZXF1ZW5jZTNDaG9pY2VfdHlwZTAoKTsKLSAgICAgICAgdGVzdElubmVyU2VxdWVuY2UzQ2hvaWNlX3R5cGUwLnNldENob2ljZTEobmV3IFN0cmluZ1tdeyJjaG9pY2UxIiwgbnVsbCwgImNob2ljZTIifSk7Ci0gICAgICAgIHRlc3RTZXF1ZW5jZS5zZXRUZXN0SW5uZXJTZXF1ZW5jZTNDaG9pY2VfdHlwZTAodGVzdElubmVyU2VxdWVuY2UzQ2hvaWNlX3R5cGUwKTsKLQotICAgICAgIHRyeSB7Ci0gICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSB0ZXN0U2VxdWVuY2UuZ2V0T01FbGVtZW50KFRlc3RJbm5lclNlcXVlbmNlMy5NWV9RTkFNRSwKLSAgICAgICAgICAgICAgICAgICBPTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTJGYWN0b3J5KCkpOwotICAgICAgICAgICAgU3RyaW5nIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NZWxlbWVudCA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIFRlc3RJbm5lclNlcXVlbmNlMyByZXN1bHQgPSBUZXN0SW5uZXJTZXF1ZW5jZTMuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRTZXF1ZW5jZTEoKSwgInNlcXVlbmNlIik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFNlcXVlbmNlMigpLCAzKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoaXNFcXVhbChyZXN1bHQuZ2V0VGVzdElubmVyU2VxdWVuY2UzQ2hvaWNlX3R5cGUwKCkuZ2V0Q2hvaWNlMSgpLCBuZXcgU3RyaW5nW117ImNob2ljZTEiLCBudWxsLCAiY2hvaWNlMiJ9KSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW5uZXJDaG9pY2UzMigpIHsKLSAgICAgICAgVGVzdElubmVyU2VxdWVuY2UzIHRlc3RTZXF1ZW5jZSA9IG5ldyBUZXN0SW5uZXJTZXF1ZW5jZTMoKTsKLSAgICAgICAgdGVzdFNlcXVlbmNlLnNldFNlcXVlbmNlMSgic2VxdWVuY2UiKTsKLSAgICAgICAgdGVzdFNlcXVlbmNlLnNldFNlcXVlbmNlMigzKTsKLSAgICAgICAgVGVzdElubmVyU2VxdWVuY2UzQ2hvaWNlX3R5cGUwIHRlc3RJbm5lclNlcXVlbmNlM0Nob2ljZV90eXBlMCA9IG5ldyBUZXN0SW5uZXJTZXF1ZW5jZTNDaG9pY2VfdHlwZTAoKTsKLSAgICAgICAgdGVzdElubmVyU2VxdWVuY2UzQ2hvaWNlX3R5cGUwLnNldENob2ljZTIobmV3IGludFtdezIsIEludGVnZXIuTUlOX1ZBTFVFLCA2fSk7Ci0gICAgICAgIHRlc3RTZXF1ZW5jZS5zZXRUZXN0SW5uZXJTZXF1ZW5jZTNDaG9pY2VfdHlwZTAodGVzdElubmVyU2VxdWVuY2UzQ2hvaWNlX3R5cGUwKTsKLQotCi0gICAgICAgICB0cnkgewotICAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSB0ZXN0U2VxdWVuY2UuZ2V0T01FbGVtZW50KFRlc3RJbm5lclNlcXVlbmNlMy5NWV9RTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICBPTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTJGYWN0b3J5KCkpOwotICAgICAgICAgICAgU3RyaW5nIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NZWxlbWVudCA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIFRlc3RJbm5lclNlcXVlbmNlMyByZXN1bHQgPSBUZXN0SW5uZXJTZXF1ZW5jZTMuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRTZXF1ZW5jZTEoKSwgInNlcXVlbmNlIik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFNlcXVlbmNlMigpLCAzKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoaXNFcXVhbChyZXN1bHQuZ2V0VGVzdElubmVyU2VxdWVuY2UzQ2hvaWNlX3R5cGUwKCkuZ2V0Q2hvaWNlMigpLCBuZXcgaW50W117MiwgSW50ZWdlci5NSU5fVkFMVUUsIDZ9KSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0VxdWFsKFN0cmluZ1tdIHRlc3QxLCBTdHJpbmdbXSB0ZXN0MikgewotICAgICAgICBib29sZWFuIGlzRXF1YWwgPSB0cnVlOwotICAgICAgICBpZiAodGVzdDEubGVuZ3RoICE9IHRlc3QyLmxlbmd0aCkgewotICAgICAgICAgICAgaXNFcXVhbCA9IGZhbHNlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXN0MS5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGlmICh0ZXN0MVtpXSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghdGVzdDFbaV0uZXF1YWxzKHRlc3QyW2ldKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaXNFcXVhbCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAodGVzdDJbaV0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaXNFcXVhbCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBpc0VxdWFsOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0VxdWFsKGludFtdIHRlc3QxLCBpbnRbXSB0ZXN0MikgewotICAgICAgICBib29sZWFuIGlzRXF1YWwgPSB0cnVlOwotICAgICAgICBpZiAodGVzdDEubGVuZ3RoICE9IHRlc3QyLmxlbmd0aCkgewotICAgICAgICAgICAgaXNFcXVhbCA9IGZhbHNlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXN0MS5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGlmICh0ZXN0MVtpXSAhPSB0ZXN0MltpXSkgewotICAgICAgICAgICAgICAgICAgICBpc0VxdWFsID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBpc0VxdWFsOwotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL2lubmVycGFydGljbGVleHRlbnNpb24vVGVzdElubmVyUGFydGljbGVFeHRlbnNpb24uamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvaW5uZXJwYXJ0aWNsZWV4dGVuc2lvbi9UZXN0SW5uZXJQYXJ0aWNsZUV4dGVuc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NWNkNjc2Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvaW5uZXJwYXJ0aWNsZWV4dGVuc2lvbi9UZXN0SW5uZXJQYXJ0aWNsZUV4dGVuc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5pbm5lcnBhcnRpY2xlZXh0ZW5zaW9uOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS51dGlsLlN0QVhVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudGVtcHVyaS5pbm5lcnBhcnRpY2FsZXh0ZW5zaW9uLkNoaWxkRWxlbWVudF90eXBlMDsKLWltcG9ydCBvcmcudGVtcHVyaS5pbm5lcnBhcnRpY2FsZXh0ZW5zaW9uLlBhcmVudFR5cGVDaG9pY2U7Ci1pbXBvcnQgb3JnLnRlbXB1cmkuaW5uZXJwYXJ0aWNhbGV4dGVuc2lvbi5UZXN0RWxlbWVudDsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci0KLXB1YmxpYyBjbGFzcyBUZXN0SW5uZXJQYXJ0aWNsZUV4dGVuc2lvbiBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RUZXN0RWxlbWVudCgpewotICAgICAgICBUZXN0RWxlbWVudCB0ZXN0RWxlbWVudCA9IG5ldyBUZXN0RWxlbWVudCgpOwotCi0gICAgICAgIENoaWxkRWxlbWVudF90eXBlMCBjaGlsZEVsZW1lbnRfdHlwZTBbXSA9IG5ldyBDaGlsZEVsZW1lbnRfdHlwZTBbMl07Ci0gICAgICAgIGNoaWxkRWxlbWVudF90eXBlMFswXSA9IG5ldyBDaGlsZEVsZW1lbnRfdHlwZTAoKTsKLSAgICAgICAgY2hpbGRFbGVtZW50X3R5cGUwWzBdLnNldFRlc3RBdHRyaWJ1dGUoIlRlc3QgQXR0cmlidXRlIik7Ci0KLSAgICAgICAgUGFyZW50VHlwZUNob2ljZVtdIHBhcmVudFR5cGVDaG9pY2VzID0gbmV3IFBhcmVudFR5cGVDaG9pY2VbMl07Ci0gICAgICAgIHBhcmVudFR5cGVDaG9pY2VzWzBdID0gbmV3IFBhcmVudFR5cGVDaG9pY2UoKTsKLSAgICAgICAgcGFyZW50VHlwZUNob2ljZXNbMF0uc2V0UGFyYW0xKCJwYXJhbTEiKTsKLSAgICAgICAgcGFyZW50VHlwZUNob2ljZXNbMV0gPSBuZXcgUGFyZW50VHlwZUNob2ljZSgpOwotICAgICAgICBwYXJlbnRUeXBlQ2hvaWNlc1sxXS5zZXRQYXJhbTIoInBhcmFtMiIpOwotCi0gICAgICAgIGNoaWxkRWxlbWVudF90eXBlMFswXS5zZXRQYXJlbnRUeXBlQ2hvaWNlKHBhcmVudFR5cGVDaG9pY2VzKTsKLQotICAgICAgICBjaGlsZEVsZW1lbnRfdHlwZTBbMV0gPSBuZXcgQ2hpbGRFbGVtZW50X3R5cGUwKCk7Ci0gICAgICAgIGNoaWxkRWxlbWVudF90eXBlMFsxXS5zZXRUZXN0QXR0cmlidXRlKCJUZXN0IEF0dHJpYnV0ZSIpOwotCi0gICAgICAgIHBhcmVudFR5cGVDaG9pY2VzID0gbmV3IFBhcmVudFR5cGVDaG9pY2VbMl07Ci0gICAgICAgIHBhcmVudFR5cGVDaG9pY2VzWzBdID0gbmV3IFBhcmVudFR5cGVDaG9pY2UoKTsKLSAgICAgICAgcGFyZW50VHlwZUNob2ljZXNbMF0uc2V0UGFyYW0xKCJwYXJhbTEiKTsKLSAgICAgICAgcGFyZW50VHlwZUNob2ljZXNbMV0gPSBuZXcgUGFyZW50VHlwZUNob2ljZSgpOwotICAgICAgICBwYXJlbnRUeXBlQ2hvaWNlc1sxXS5zZXRQYXJhbTIoInBhcmFtMiIpOwotCi0gICAgICAgIGNoaWxkRWxlbWVudF90eXBlMFsxXS5zZXRQYXJlbnRUeXBlQ2hvaWNlKHBhcmVudFR5cGVDaG9pY2VzKTsKLQotICAgICAgICB0ZXN0RWxlbWVudC5zZXRDaGlsZEVsZW1lbnQoY2hpbGRFbGVtZW50X3R5cGUwKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IHRlc3RFbGVtZW50LmdldE9NRWxlbWVudChUZXN0RWxlbWVudC5NWV9RTkFNRSwgT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCkpOwotICAgICAgICAgICAgU3RyaW5nIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NIEVsZW1lbnQgc3RyaW5nID09PiAiICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPQotICAgICAgICAgICAgICAgICAgICBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvbUVsZW1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgVGVzdEVsZW1lbnQgcmVzdWx0ID0gVGVzdEVsZW1lbnQuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRDaGlsZEVsZW1lbnQoKVswXS5nZXRUZXN0QXR0cmlidXRlKCksIlRlc3QgQXR0cmlidXRlIik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldENoaWxkRWxlbWVudCgpWzFdLmdldFRlc3RBdHRyaWJ1dGUoKSwiVGVzdCBBdHRyaWJ1dGUiKTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRDaGlsZEVsZW1lbnQoKVswXS5nZXRQYXJlbnRUeXBlQ2hvaWNlKClbMF0uZ2V0UGFyYW0xKCksInBhcmFtMSIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRDaGlsZEVsZW1lbnQoKVswXS5nZXRQYXJlbnRUeXBlQ2hvaWNlKClbMV0uZ2V0UGFyYW0yKCksInBhcmFtMiIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRDaGlsZEVsZW1lbnQoKVsxXS5nZXRQYXJlbnRUeXBlQ2hvaWNlKClbMF0uZ2V0UGFyYW0xKCksInBhcmFtMSIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRDaGlsZEVsZW1lbnQoKVsxXS5nZXRQYXJlbnRUeXBlQ2hvaWNlKClbMV0uZ2V0UGFyYW0yKCksInBhcmFtMiIpOwotCi0gICAgICAgIH0gY2F0Y2ggKEFEQkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLQotCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9pbm5lcnBhcnRpY2xlcy9Jbm5lclBhcnRpY2xlc1Rlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvaW5uZXJwYXJ0aWNsZXMvSW5uZXJQYXJ0aWNsZXNUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkOTdlNDIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9pbm5lcnBhcnRpY2xlcy9Jbm5lclBhcnRpY2xlc1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLmlubmVycGFydGljbGVzOwotCi1pbXBvcnQgY29tLm15bmFtZXNwYWNlLnRlc3Rpbm5lcnBhcnRpY2xlLio7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS51dGlsLlN0QVhVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci0KLQotCi1wdWJsaWMgY2xhc3MgSW5uZXJQYXJ0aWNsZXNUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHVibGljIHZvaWQgdGVzdElubmVyUGFydGljbGUxKCkgewotCi0gICAgICAgIFRlc3RJbm5lclBhcnRpY2xlMSB0ZXN0SW5uZXJQYXJ0aWNsZTEgPSBuZXcgVGVzdElubmVyUGFydGljbGUxKCk7Ci0gICAgICAgIHRlc3RJbm5lclBhcnRpY2xlMS5zZXRQYXJhbTEoIlBhcmFtMSIpOwotICAgICAgICBUZXN0SW5uZXJQYXJ0aWNsZTFTZXF1ZW5jZV90eXBlMCB0ZXN0SW5uZXJQYXJ0aWNsZTFTZXF1ZW5jZV90eXBlMCA9IG5ldyBUZXN0SW5uZXJQYXJ0aWNsZTFTZXF1ZW5jZV90eXBlMCgpOwotICAgICAgICB0ZXN0SW5uZXJQYXJ0aWNsZTFTZXF1ZW5jZV90eXBlMC5zZXRQYXJhbTIoIlBhcmFtMiIpOwotICAgICAgICB0ZXN0SW5uZXJQYXJ0aWNsZTFTZXF1ZW5jZV90eXBlMC5zZXRQYXJhbTMoIlBhcmFtMyIpOwotICAgICAgICB0ZXN0SW5uZXJQYXJ0aWNsZTEuc2V0VGVzdElubmVyUGFydGljbGUxU2VxdWVuY2VfdHlwZTAodGVzdElubmVyUGFydGljbGUxU2VxdWVuY2VfdHlwZTApOwotICAgICAgICB0ZXN0SW5uZXJQYXJ0aWNsZTEuc2V0UGFyYW00KCJQYXJhbTQiKTsKLQotICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSB0ZXN0SW5uZXJQYXJ0aWNsZTEuZ2V0T01FbGVtZW50KFRlc3RJbm5lclBhcnRpY2xlMS5NWV9RTkFNRSwgT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCkpOwotICAgICAgICAgICAgU3RyaW5nIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NIFN0cmluZyA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIFRlc3RJbm5lclBhcnRpY2xlMSByZXN1bHQgPSBUZXN0SW5uZXJQYXJ0aWNsZTEuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTEoKSwgIlBhcmFtMSIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRUZXN0SW5uZXJQYXJ0aWNsZTFTZXF1ZW5jZV90eXBlMCgpLmdldFBhcmFtMigpLCAiUGFyYW0yIik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFRlc3RJbm5lclBhcnRpY2xlMVNlcXVlbmNlX3R5cGUwKCkuZ2V0UGFyYW0zKCksICJQYXJhbTMiKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UGFyYW00KCksICJQYXJhbTQiKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdElubmVyUGFydGljbGUyKCkgewotCi0gICAgICAgIFRlc3RJbm5lclBhcnRpY2xlMiB0ZXN0SW5uZXJQYXJ0aWNsZTIgPSBuZXcgVGVzdElubmVyUGFydGljbGUyKCk7Ci0gICAgICAgIHRlc3RJbm5lclBhcnRpY2xlMi5zZXRQYXJhbTEoIlBhcmFtMSIpOwotICAgICAgICBUZXN0SW5uZXJQYXJ0aWNsZTJDaG9pY2VfdHlwZTAgdGVzdElubmVyUGFydGljbGUyQ2hvaWNlX3R5cGUxID0gbmV3IFRlc3RJbm5lclBhcnRpY2xlMkNob2ljZV90eXBlMCgpOwotICAgICAgICB0ZXN0SW5uZXJQYXJ0aWNsZTJDaG9pY2VfdHlwZTEuc2V0UGFyYW0yKCJQYXJhbTIiKTsKLSAgICAgICAgdGVzdElubmVyUGFydGljbGUyQ2hvaWNlX3R5cGUxLnNldFBhcmFtMygiUGFyYW0zIik7Ci0gICAgICAgIHRlc3RJbm5lclBhcnRpY2xlMi5zZXRUZXN0SW5uZXJQYXJ0aWNsZTJDaG9pY2VfdHlwZTAodGVzdElubmVyUGFydGljbGUyQ2hvaWNlX3R5cGUxKTsKLSAgICAgICAgdGVzdElubmVyUGFydGljbGUyLnNldFBhcmFtNCgiUGFyYW00Iik7Ci0KLSAgICAgICB0cnkgewotICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9Ci0gICAgICAgICAgICAgICAgICAgdGVzdElubmVyUGFydGljbGUyLmdldE9NRWxlbWVudChUZXN0SW5uZXJQYXJ0aWNsZTIuTVlfUU5BTUUsIE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgICAgIFN0cmluZyBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTSBTdHJpbmcgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICBUZXN0SW5uZXJQYXJ0aWNsZTIgcmVzdWx0ID0gVGVzdElubmVyUGFydGljbGUyLkZhY3RvcnkucGFyc2UoeG1sUmVhZGVyKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UGFyYW0xKCksICJQYXJhbTEiKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0VGVzdElubmVyUGFydGljbGUyQ2hvaWNlX3R5cGUwKCkuZ2V0UGFyYW0zKCksICJQYXJhbTMiKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UGFyYW00KCksICJQYXJhbTQiKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdElubmVyUGFydGljbGUzMSgpIHsKLQotICAgICAgICBUZXN0SW5uZXJQYXJ0aWNsZTMgdGVzdElubmVyUGFydGljbGUzID0gbmV3IFRlc3RJbm5lclBhcnRpY2xlMygpOwotICAgICAgICB0ZXN0SW5uZXJQYXJ0aWNsZTMuc2V0UGFyYW0xKCJQYXJhbTEiKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9Ci0gICAgICAgICAgICAgICAgICAgICB0ZXN0SW5uZXJQYXJ0aWNsZTMuZ2V0T01FbGVtZW50KFRlc3RJbm5lclBhcnRpY2xlMy5NWV9RTkFNRSwgT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCkpOwotICAgICAgICAgICAgU3RyaW5nIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NIFN0cmluZyA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIFRlc3RJbm5lclBhcnRpY2xlMyByZXN1bHQgPSBUZXN0SW5uZXJQYXJ0aWNsZTMuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTEoKSwgIlBhcmFtMSIpOwotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW5uZXJQYXJ0aWNsZTMyKCkgewotCi0gICAgICAgIFRlc3RJbm5lclBhcnRpY2xlMyB0ZXN0SW5uZXJQYXJ0aWNsZTMgPSBuZXcgVGVzdElubmVyUGFydGljbGUzKCk7Ci0gICAgICAgIFRlc3RJbm5lclBhcnRpY2xlM0Nob2ljZV90eXBlMCB0ZXN0SW5uZXJQYXJ0aWNsZTNDaG9pY2VfdHlwZTEgPSBuZXcgVGVzdElubmVyUGFydGljbGUzQ2hvaWNlX3R5cGUwKCk7Ci0gICAgICAgIHRlc3RJbm5lclBhcnRpY2xlM0Nob2ljZV90eXBlMS5zZXRQYXJhbTIoIlBhcmFtMiIpOwotICAgICAgICB0ZXN0SW5uZXJQYXJ0aWNsZTNDaG9pY2VfdHlwZTEuc2V0UGFyYW0zKCJQYXJhbTMiKTsKLSAgICAgICAgdGVzdElubmVyUGFydGljbGUzLnNldFRlc3RJbm5lclBhcnRpY2xlM0Nob2ljZV90eXBlMCh0ZXN0SW5uZXJQYXJ0aWNsZTNDaG9pY2VfdHlwZTEpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0KLSAgICAgICAgICAgICAgICAgICAgdGVzdElubmVyUGFydGljbGUzLmdldE9NRWxlbWVudChUZXN0SW5uZXJQYXJ0aWNsZTMuTVlfUU5BTUUsIE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgICAgIFN0cmluZyBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTSBTdHJpbmcgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICBUZXN0SW5uZXJQYXJ0aWNsZTMgcmVzdWx0ID0gVGVzdElubmVyUGFydGljbGUzLkZhY3RvcnkucGFyc2UoeG1sUmVhZGVyKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0VGVzdElubmVyUGFydGljbGUzQ2hvaWNlX3R5cGUwKCkuZ2V0UGFyYW0zKCksICJQYXJhbTMiKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW5uZXJQYXJ0aWNsZTMzKCkgewotCi0gICAgICAgIFRlc3RJbm5lclBhcnRpY2xlMyB0ZXN0SW5uZXJQYXJ0aWNsZTMgPSBuZXcgVGVzdElubmVyUGFydGljbGUzKCk7Ci0gICAgICAgIHRlc3RJbm5lclBhcnRpY2xlMy5zZXRQYXJhbTEoIlBhcmFtMSIpOwotICAgICAgICBUZXN0SW5uZXJQYXJ0aWNsZTNDaG9pY2VfdHlwZTAgdGVzdElubmVyUGFydGljbGUzQ2hvaWNlX3R5cGUxID0gbmV3IFRlc3RJbm5lclBhcnRpY2xlM0Nob2ljZV90eXBlMCgpOwotICAgICAgICB0ZXN0SW5uZXJQYXJ0aWNsZTNDaG9pY2VfdHlwZTEuc2V0UGFyYW0yKCJQYXJhbTIiKTsKLSAgICAgICAgdGVzdElubmVyUGFydGljbGUzQ2hvaWNlX3R5cGUxLnNldFBhcmFtMygiUGFyYW0zIik7Ci0gICAgICAgIHRlc3RJbm5lclBhcnRpY2xlMy5zZXRUZXN0SW5uZXJQYXJ0aWNsZTNDaG9pY2VfdHlwZTAodGVzdElubmVyUGFydGljbGUzQ2hvaWNlX3R5cGUxKTsKLSAgICAgICAgdGVzdElubmVyUGFydGljbGUzLnNldFBhcmFtNCgiUGFyYW00Iik7Ci0KLSAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9Ci0gICAgICAgICAgICAgICAgICAgICAgdGVzdElubmVyUGFydGljbGUzLmdldE9NRWxlbWVudChUZXN0SW5uZXJQYXJ0aWNsZTMuTVlfUU5BTUUsIE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgICAgIFN0cmluZyBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTSBTdHJpbmcgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICBUZXN0SW5uZXJQYXJ0aWNsZTMgcmVzdWx0ID0gVGVzdElubmVyUGFydGljbGUzLkZhY3RvcnkucGFyc2UoeG1sUmVhZGVyKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UGFyYW00KCksICJQYXJhbTQiKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdElubmVyUGFydGljbGU0MSgpIHsKLQotICAgICAgICBUZXN0SW5uZXJQYXJ0aWNsZTQgdGVzdElubmVyUGFydGljbGU0ID0gbmV3IFRlc3RJbm5lclBhcnRpY2xlNCgpOwotICAgICAgICB0ZXN0SW5uZXJQYXJ0aWNsZTQuc2V0UGFyYW0xKCJQYXJhbTEiKTsKLQotICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0KLSAgICAgICAgICAgICAgICAgICAgICB0ZXN0SW5uZXJQYXJ0aWNsZTQuZ2V0T01FbGVtZW50KFRlc3RJbm5lclBhcnRpY2xlNC5NWV9RTkFNRSwgT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCkpOwotICAgICAgICAgICAgU3RyaW5nIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NIFN0cmluZyA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIFRlc3RJbm5lclBhcnRpY2xlNCByZXN1bHQgPSBUZXN0SW5uZXJQYXJ0aWNsZTQuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTEoKSwgIlBhcmFtMSIpOwotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJbm5lclBhcnRpY2xlNDIoKSB7Ci0KLSAgICAgICAgVGVzdElubmVyUGFydGljbGU0IHRlc3RJbm5lclBhcnRpY2xlNCA9IG5ldyBUZXN0SW5uZXJQYXJ0aWNsZTQoKTsKLSAgICAgICAgVGVzdElubmVyUGFydGljbGU0U2VxdWVuY2VfdHlwZTAgVGVzdElubmVyUGFydGljbGU0U2VxdWVuY2VfdHlwZTAgPSBuZXcgVGVzdElubmVyUGFydGljbGU0U2VxdWVuY2VfdHlwZTAoKTsKLSAgICAgICAgVGVzdElubmVyUGFydGljbGU0U2VxdWVuY2VfdHlwZTAuc2V0UGFyYW0yKCJQYXJhbTIiKTsKLSAgICAgICAgVGVzdElubmVyUGFydGljbGU0U2VxdWVuY2VfdHlwZTAuc2V0UGFyYW0zKCJQYXJhbTMiKTsKLSAgICAgICAgdGVzdElubmVyUGFydGljbGU0LnNldFRlc3RJbm5lclBhcnRpY2xlNFNlcXVlbmNlX3R5cGUwKFRlc3RJbm5lclBhcnRpY2xlNFNlcXVlbmNlX3R5cGUwKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9Ci0gICAgICAgICAgICAgICAgICAgICB0ZXN0SW5uZXJQYXJ0aWNsZTQuZ2V0T01FbGVtZW50KFRlc3RJbm5lclBhcnRpY2xlNC5NWV9RTkFNRSwgT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCkpOwotICAgICAgICAgICAgU3RyaW5nIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NIFN0cmluZyA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIFRlc3RJbm5lclBhcnRpY2xlNCByZXN1bHQgPSBUZXN0SW5uZXJQYXJ0aWNsZTQuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRUZXN0SW5uZXJQYXJ0aWNsZTRTZXF1ZW5jZV90eXBlMCgpLmdldFBhcmFtMigpLCAiUGFyYW0yIik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFRlc3RJbm5lclBhcnRpY2xlNFNlcXVlbmNlX3R5cGUwKCkuZ2V0UGFyYW0zKCksICJQYXJhbTMiKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW5uZXJQYXJ0aWNsZTQzKCkgewotCi0gICAgICAgIFRlc3RJbm5lclBhcnRpY2xlNCB0ZXN0SW5uZXJQYXJ0aWNsZTQgPSBuZXcgVGVzdElubmVyUGFydGljbGU0KCk7Ci0gICAgICAgIHRlc3RJbm5lclBhcnRpY2xlNC5zZXRQYXJhbTQoIlBhcmFtNCIpOwotCi0gICAgICAgICB0cnkgewotICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9Ci0gICAgICAgICAgICAgICAgICAgICAgdGVzdElubmVyUGFydGljbGU0LmdldE9NRWxlbWVudChUZXN0SW5uZXJQYXJ0aWNsZTQuTVlfUU5BTUUsIE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgICAgIFN0cmluZyBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTSBTdHJpbmcgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICBUZXN0SW5uZXJQYXJ0aWNsZTQgcmVzdWx0ID0gVGVzdElubmVyUGFydGljbGU0LkZhY3RvcnkucGFyc2UoeG1sUmVhZGVyKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UGFyYW00KCksICJQYXJhbTQiKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW5uZXJQYXJ0aWNsZTUoKSB7Ci0KLSAgICAgICAgVGVzdElubmVyUGFydGljbGU1IHRlc3RJbm5lclBhcnRpY2xlNSA9IG5ldyBUZXN0SW5uZXJQYXJ0aWNsZTUoKTsKLSAgICAgICAgdGVzdElubmVyUGFydGljbGU1LnNldFBhcmFtMSgiUGFyYW0xIik7Ci0gICAgICAgIFRlc3RJbm5lclBhcnRpY2xlNVNlcXVlbmNlX3R5cGUxIHRlc3RJbm5lclBhcnRpY2xlMkNob2ljZV90eXBlMSA9IG5ldyBUZXN0SW5uZXJQYXJ0aWNsZTVTZXF1ZW5jZV90eXBlMSgpOwotICAgICAgICB0ZXN0SW5uZXJQYXJ0aWNsZTJDaG9pY2VfdHlwZTEuc2V0UGFyYW0yKCJQYXJhbTIiKTsKLSAgICAgICAgdGVzdElubmVyUGFydGljbGUyQ2hvaWNlX3R5cGUxLnNldFBhcmFtMygiUGFyYW0zIik7Ci0KLSAgICAgICAgVGVzdElubmVyUGFydGljbGU1U2VxdWVuY2VfdHlwZTAgaW5uZXJQYXJ0aWNsZTVTZXF1ZW5jZV90eXBlMCA9IG5ldyBUZXN0SW5uZXJQYXJ0aWNsZTVTZXF1ZW5jZV90eXBlMCgpOwotICAgICAgICBpbm5lclBhcnRpY2xlNVNlcXVlbmNlX3R5cGUwLnNldFBhcmFtNCgiUGFyYW00Iik7Ci0gICAgICAgIGlubmVyUGFydGljbGU1U2VxdWVuY2VfdHlwZTAuc2V0UGFyYW01KCJQYXJhbTUiKTsKLQotICAgICAgICB0ZXN0SW5uZXJQYXJ0aWNsZTJDaG9pY2VfdHlwZTEuc2V0VGVzdElubmVyUGFydGljbGU1U2VxdWVuY2VfdHlwZTAoaW5uZXJQYXJ0aWNsZTVTZXF1ZW5jZV90eXBlMCk7Ci0gICAgICAgIHRlc3RJbm5lclBhcnRpY2xlNS5zZXRUZXN0SW5uZXJQYXJ0aWNsZTVTZXF1ZW5jZV90eXBlMSh0ZXN0SW5uZXJQYXJ0aWNsZTJDaG9pY2VfdHlwZTEpOwotICAgICAgICB0ZXN0SW5uZXJQYXJ0aWNsZTUuc2V0UGFyYW02KCJQYXJhbTYiKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9Ci0gICAgICAgICAgICAgICAgICAgIHRlc3RJbm5lclBhcnRpY2xlNS5nZXRPTUVsZW1lbnQoVGVzdElubmVyUGFydGljbGU1Lk1ZX1FOQU1FLCBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT00gU3RyaW5nID09PiAiICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvbUVsZW1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgVGVzdElubmVyUGFydGljbGU1IHJlc3VsdCA9IFRlc3RJbm5lclBhcnRpY2xlNS5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtMSgpLCAiUGFyYW0xIik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFRlc3RJbm5lclBhcnRpY2xlNVNlcXVlbmNlX3R5cGUxKCkuZ2V0UGFyYW0yKCksICJQYXJhbTIiKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0VGVzdElubmVyUGFydGljbGU1U2VxdWVuY2VfdHlwZTEoKS5nZXRQYXJhbTMoKSwgIlBhcmFtMyIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRUZXN0SW5uZXJQYXJ0aWNsZTVTZXF1ZW5jZV90eXBlMSgpLmdldFRlc3RJbm5lclBhcnRpY2xlNVNlcXVlbmNlX3R5cGUwKCkuZ2V0UGFyYW00KCksICJQYXJhbTQiKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0VGVzdElubmVyUGFydGljbGU1U2VxdWVuY2VfdHlwZTEoKS5nZXRUZXN0SW5uZXJQYXJ0aWNsZTVTZXF1ZW5jZV90eXBlMCgpLmdldFBhcmFtNSgpLCAiUGFyYW01Iik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtNigpLCAiUGFyYW02Iik7Ci0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJbnR0ZXJQYXJ0aWNhbEV4dGVuc2lvbigpewotICAgICAgICAgVGVzdElubnRlclBhcnRpY2xlRXh0ZW5zaW9uIHRlc3RJbm50ZXJQYXJ0aWNsZUV4dGVuc2lvbiA9IG5ldyBUZXN0SW5udGVyUGFydGljbGVFeHRlbnNpb24oKTsKLQotICAgICAgICBUZXN0SW5udGVyUGFydGljbGVFeHRlbnNpb25DaGlsZENvbXBsZXhUeXBlIHRlc3RJbm50ZXJQYXJ0aWNsZUV4dGVuc2lvbkNoaWxkQ29tcGxleFR5cGUgPQotICAgICAgICAgICAgICAgIG5ldyBUZXN0SW5udGVyUGFydGljbGVFeHRlbnNpb25DaGlsZENvbXBsZXhUeXBlKCk7Ci0gICAgICAgIHRlc3RJbm50ZXJQYXJ0aWNsZUV4dGVuc2lvbi5zZXRUZXN0SW5udGVyUGFydGljbGVFeHRlbnNpb24odGVzdElubnRlclBhcnRpY2xlRXh0ZW5zaW9uQ2hpbGRDb21wbGV4VHlwZSk7Ci0KLSAgICAgICAgVGVzdElubnRlclBhcnRpY2xlRXh0ZW5zaW9uUGFyZW50Q29tcGxleFR5cGVDaG9pY2VfdHlwZTAgdGVzdElubnRlclBhcnRpY2xlRXh0ZW5zaW9uUGFyZW50Q29tcGxleFR5cGVDaG9pY2VfdHlwZTAgPQotICAgICAgICAgICAgICAgIG5ldyBUZXN0SW5udGVyUGFydGljbGVFeHRlbnNpb25QYXJlbnRDb21wbGV4VHlwZUNob2ljZV90eXBlMCgpOwotICAgICAgICB0ZXN0SW5udGVyUGFydGljbGVFeHRlbnNpb25DaGlsZENvbXBsZXhUeXBlLnNldFRlc3RJbm50ZXJQYXJ0aWNsZUV4dGVuc2lvblBhcmVudENvbXBsZXhUeXBlQ2hvaWNlX3R5cGUwKHRlc3RJbm50ZXJQYXJ0aWNsZUV4dGVuc2lvblBhcmVudENvbXBsZXhUeXBlQ2hvaWNlX3R5cGUwKTsKLQotICAgICAgICB0ZXN0SW5udGVyUGFydGljbGVFeHRlbnNpb25QYXJlbnRDb21wbGV4VHlwZUNob2ljZV90eXBlMC5zZXRQYXJhbTEoInBhcmFtMSIpOwotICAgICAgICB0ZXN0SW5udGVyUGFydGljbGVFeHRlbnNpb25QYXJlbnRDb21wbGV4VHlwZUNob2ljZV90eXBlMC5zZXRQYXJhbTIoInBhcmFtMiIpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gdGVzdElubnRlclBhcnRpY2xlRXh0ZW5zaW9uLmdldE9NRWxlbWVudChUZXN0SW5udGVyUGFydGljbGVFeHRlbnNpb24uTVlfUU5BTUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT00gU3RyaW5nID09PiAiICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvbUVsZW1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgVGVzdElubnRlclBhcnRpY2xlRXh0ZW5zaW9uIHJlc3VsdCA9IFRlc3RJbm50ZXJQYXJ0aWNsZUV4dGVuc2lvbi5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcik7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdC5nZXRUZXN0SW5udGVyUGFydGljbGVFeHRlbnNpb24oKSBpbnN0YW5jZW9mIFRlc3RJbm50ZXJQYXJ0aWNsZUV4dGVuc2lvbkNoaWxkQ29tcGxleFR5cGUpOwotICAgICAgICAgICAgVGVzdElubnRlclBhcnRpY2xlRXh0ZW5zaW9uQ2hpbGRDb21wbGV4VHlwZSByZXN1bHRDb21wbGV4VHlwZSA9Ci0gICAgICAgICAgICAgICAgICAgIChUZXN0SW5udGVyUGFydGljbGVFeHRlbnNpb25DaGlsZENvbXBsZXhUeXBlKSByZXN1bHQuZ2V0VGVzdElubnRlclBhcnRpY2xlRXh0ZW5zaW9uKCk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0Q29tcGxleFR5cGUuZ2V0VGVzdElubnRlclBhcnRpY2xlRXh0ZW5zaW9uUGFyZW50Q29tcGxleFR5cGVDaG9pY2VfdHlwZTAoKS5nZXRQYXJhbTIoKSwicGFyYW0yIik7Ci0gICAgICAgIH0gY2F0Y2ggKEFEQkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VGVzdENvbXBsZXhUeXBlRWxlbWVudCgpewotICAgICAgICBUZXN0Q29tcGxleFR5cGVFbGVtZW50IHRlc3RDb21wbGV4VHlwZUVsZW1lbnQgPSBuZXcgVGVzdENvbXBsZXhUeXBlRWxlbWVudCgpOwotCi0gICAgICAgIFRlc3RDb21wbGV4VHlwZSB0ZXN0Q29tcGxleFR5cGUgPSBuZXcgVGVzdENvbXBsZXhUeXBlKCk7Ci0gICAgICAgIHRlc3RDb21wbGV4VHlwZUVsZW1lbnQuc2V0VGVzdENvbXBsZXhUeXBlRWxlbWVudCh0ZXN0Q29tcGxleFR5cGUpOwotCi0gICAgICAgIFRlc3RFbGVtZW50X3R5cGUwIHRlc3RFbGVtZW50X3R5cGUwID0gbmV3IFRlc3RFbGVtZW50X3R5cGUwKCk7Ci0gICAgICAgIHRlc3RFbGVtZW50X3R5cGUwLnNldFBhcmFtKCJwYXJhbSIpOwotICAgICAgICB0ZXN0Q29tcGxleFR5cGUuc2V0VGVzdEVsZW1lbnQodGVzdEVsZW1lbnRfdHlwZTApOwotCi0gICAgICAgIFRlc3RDb21wbGV4VHlwZVNlcXVlbmNlX3R5cGUwIHRlc3RDb21wbGV4VHlwZVNlcXVlbmNlX3R5cGUwID0gbmV3IFRlc3RDb21wbGV4VHlwZVNlcXVlbmNlX3R5cGUwKCk7Ci0gICAgICAgIHRlc3RDb21wbGV4VHlwZS5zZXRUZXN0Q29tcGxleFR5cGVTZXF1ZW5jZV90eXBlMCh0ZXN0Q29tcGxleFR5cGVTZXF1ZW5jZV90eXBlMCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSB0ZXN0Q29tcGxleFR5cGVFbGVtZW50LmdldE9NRWxlbWVudCgKLSAgICAgICAgICAgICAgICAgICAgVGVzdENvbXBsZXhUeXBlRWxlbWVudC5NWV9RTkFNRSxPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT00gU3RyaW5nID09PiAiICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKAotICAgICAgICAgICAgICAgICAgICBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIFRlc3RDb21wbGV4VHlwZUVsZW1lbnQgcmVzdWx0ID0gVGVzdENvbXBsZXhUeXBlRWxlbWVudC5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFRlc3RDb21wbGV4VHlwZUVsZW1lbnQoKS5nZXRUZXN0RWxlbWVudCgpLmdldFBhcmFtKCksInBhcmFtIik7Ci0gICAgICAgIH0gY2F0Y2ggKEFEQkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvbGlzdC9MaXN0VGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9saXN0L0xpc3RUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3M2QwM2UuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9saXN0L0xpc3RUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5saXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS51dGlsLlN0QVhVdGlsczsKLWltcG9ydCB0ZXN0LmF4aXMyLmFwYWNoZS5vcmcuKjsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLQotCi1wdWJsaWMgY2xhc3MgTGlzdFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RMaXN0U3RyaW5nKCl7Ci0KLSAgICAgICAgVGVzdExpc3RTdHJpbmdFbGVtZW50IHRlc3RMaXN0U3RyaW5nRWxlbWVudCA9IG5ldyBUZXN0TGlzdFN0cmluZ0VsZW1lbnQoKTsKLSAgICAgICAgVGVzdExpc3RTdHJpbmcgdGVzdExpc3RTdHJpbmcgPSBuZXcgVGVzdExpc3RTdHJpbmcoKTsKLSAgICAgICAgdGVzdExpc3RTdHJpbmdFbGVtZW50LnNldFRlc3RMaXN0U3RyaW5nRWxlbWVudCh0ZXN0TGlzdFN0cmluZyk7Ci0gICAgICAgIHRlc3RMaXN0U3RyaW5nLnNldFN0cmluZyhuZXcgU3RyaW5nW117InN0cmluZzEiLCJzdHJpbmcyIn0pOwotCi0gICAgICAgdHJ5IHsKLSAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IHRlc3RMaXN0U3RyaW5nRWxlbWVudC5nZXRPTUVsZW1lbnQoVGVzdExpc3RTdHJpbmdFbGVtZW50Lk1ZX1FOQU1FLAotICAgICAgICAgICAgICAgICAgICAgICBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT00gRWxlbWVudCA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIFRlc3RMaXN0U3RyaW5nRWxlbWVudCByZXN1bHQgPSBUZXN0TGlzdFN0cmluZ0VsZW1lbnQuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHRlc3RMaXN0U3RyaW5nLnRvU3RyaW5nKCkscmVzdWx0LmdldFRlc3RMaXN0U3RyaW5nRWxlbWVudCgpLnRvU3RyaW5nKCkpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYXNzZXJ0RmFsc2UodHJ1ZSk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RMaXN0UU5hbWUoKXsKLQotICAgICAgICBUZXN0TGlzdFFOYW1lRWxlbWVudCB0ZXN0TGlzdFFOYW1lRWxlbWVudCA9IG5ldyBUZXN0TGlzdFFOYW1lRWxlbWVudCgpOwotICAgICAgICBUZXN0TGlzdFFOYW1lIHRlc3RMaXN0UU5hbWUgPSBuZXcgVGVzdExpc3RRTmFtZSgpOwotICAgICAgICB0ZXN0TGlzdFFOYW1lLnNldFFOYW1lKG5ldyBRTmFtZVtde25ldyBRTmFtZSgiaHR0cDovL3d3dy5nb29nbGUuY29tIiwidGVzdDEiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBRTmFtZSgiaHR0cDovL3d3dy5nb29nbGUuY29tIiwidGVzdDIiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBRTmFtZSgiaHR0cDovL3d3dy5nb29nbGUiLCJ0ZXN0MyIpfSk7Ci0gICAgICAgIHRlc3RMaXN0UU5hbWVFbGVtZW50LnNldFRlc3RMaXN0UU5hbWVFbGVtZW50KHRlc3RMaXN0UU5hbWUpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gdGVzdExpc3RRTmFtZUVsZW1lbnQuZ2V0T01FbGVtZW50KFRlc3RMaXN0UU5hbWVFbGVtZW50Lk1ZX1FOQU1FLE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgICAgIFN0cmluZyBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTSBFbGVtZW50ID09PiAiICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvbUVsZW1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgVGVzdExpc3RRTmFtZUVsZW1lbnQgcmVzdWx0ID0gVGVzdExpc3RRTmFtZUVsZW1lbnQuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRUZXN0TGlzdFFOYW1lRWxlbWVudCgpLmdldFFOYW1lKClbMF0sdGVzdExpc3RRTmFtZS5nZXRRTmFtZSgpWzBdKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0VGVzdExpc3RRTmFtZUVsZW1lbnQoKS5nZXRRTmFtZSgpWzFdLHRlc3RMaXN0UU5hbWUuZ2V0UU5hbWUoKVsxXSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFRlc3RMaXN0UU5hbWVFbGVtZW50KCkuZ2V0UU5hbWUoKVsyXSx0ZXN0TGlzdFFOYW1lLmdldFFOYW1lKClbMl0pOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYXNzZXJ0RmFsc2UodHJ1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TGlzdE91cnMoKXsKLQotICAgICAgICBUZXN0TGlzdE91cnNFbGVtZW50IHRlc3RMaXN0T3Vyc0VsZW1lbnQgPSBuZXcgVGVzdExpc3RPdXJzRWxlbWVudCgpOwotICAgICAgICBUZXN0TGlzdE91cnMgdGVzdExpc3RPdXJzID0gbmV3IFRlc3RMaXN0T3VycygpOwotICAgICAgICB0ZXN0TGlzdE91cnNFbGVtZW50LnNldFRlc3RMaXN0T3Vyc0VsZW1lbnQodGVzdExpc3RPdXJzKTsKLSAgICAgICAgVGVzdFN0cmluZyB0ZXN0U3RyaW5nMSA9IG5ldyBUZXN0U3RyaW5nKCk7Ci0gICAgICAgIHRlc3RTdHJpbmcxLnNldFRlc3RTdHJpbmcoInRlc3QiKTsKLSAgICAgICAgVGVzdFN0cmluZyB0ZXN0U3RyaW5nMiA9IG5ldyBUZXN0U3RyaW5nKCk7Ci0gICAgICAgIHRlc3RTdHJpbmcyLnNldFRlc3RTdHJpbmcoInRlc3QiKTsKLSAgICAgICAgVGVzdFN0cmluZyB0ZXN0U3RyaW5nMyA9IG5ldyBUZXN0U3RyaW5nKCk7Ci0gICAgICAgIHRlc3RTdHJpbmczLnNldFRlc3RTdHJpbmcoInRlc3QiKTsKLSAgICAgICAgdGVzdExpc3RPdXJzLnNldFRlc3RTdHJpbmcobmV3IFRlc3RTdHJpbmdbXXt0ZXN0U3RyaW5nMSx0ZXN0U3RyaW5nMix0ZXN0U3RyaW5nM30pOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gdGVzdExpc3RPdXJzRWxlbWVudC5nZXRPTUVsZW1lbnQoVGVzdExpc3RPdXJzRWxlbWVudC5NWV9RTkFNRSxPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT00gRWxlbWVudCA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIFRlc3RMaXN0T3Vyc0VsZW1lbnQgcmVzdWx0ID0gVGVzdExpc3RPdXJzRWxlbWVudC5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFRlc3RMaXN0T3Vyc0VsZW1lbnQoKS5nZXRUZXN0U3RyaW5nKClbMF0uZ2V0VGVzdFN0cmluZygpLHRlc3RTdHJpbmcxLmdldFRlc3RTdHJpbmcoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFRlc3RMaXN0T3Vyc0VsZW1lbnQoKS5nZXRUZXN0U3RyaW5nKClbMV0uZ2V0VGVzdFN0cmluZygpLHRlc3RTdHJpbmcyLmdldFRlc3RTdHJpbmcoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFRlc3RMaXN0T3Vyc0VsZW1lbnQoKS5nZXRUZXN0U3RyaW5nKClbMl0uZ2V0VGVzdFN0cmluZygpLHRlc3RTdHJpbmczLmdldFRlc3RTdHJpbmcoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBhc3NlcnRGYWxzZSh0cnVlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RMaXN0U3VwZXIoKXsKLQotICAgICAgICBTdXBlclRlc3RMaXN0U3RyaW5nRWxlbWVudCBzdXBlclRlc3RMaXN0U3RyaW5nRWxlbWVudCA9IG5ldyBTdXBlclRlc3RMaXN0U3RyaW5nRWxlbWVudCgpOwotICAgICAgICBTdXBlclRlc3RMaXN0U3RyaW5nIHN1cGVyVGVzdExpc3RTdHJpbmcgPSBuZXcgU3VwZXJUZXN0TGlzdFN0cmluZygpOwotICAgICAgICBzdXBlclRlc3RMaXN0U3RyaW5nRWxlbWVudC5zZXRTdXBlclRlc3RMaXN0U3RyaW5nRWxlbWVudChzdXBlclRlc3RMaXN0U3RyaW5nKTsKLSAgICAgICAgc3VwZXJUZXN0TGlzdFN0cmluZy5zZXRTdHJpbmcobmV3IFN0cmluZ1tdeyJ0ZXN0MSIsInRlc3QyIiwidGVzdDMifSk7Ci0KLSAgICAgICB0cnkgewotICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gc3VwZXJUZXN0TGlzdFN0cmluZ0VsZW1lbnQuZ2V0T01FbGVtZW50KFN1cGVyVGVzdExpc3RTdHJpbmdFbGVtZW50Lk1ZX1FOQU1FLAotICAgICAgICAgICAgICAgICAgIE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgICAgIFN0cmluZyBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTSBFbGVtZW50ID09PiAiICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvbUVsZW1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgU3VwZXJUZXN0TGlzdFN0cmluZ0VsZW1lbnQgcmVzdWx0ID0gU3VwZXJUZXN0TGlzdFN0cmluZ0VsZW1lbnQuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHN1cGVyVGVzdExpc3RTdHJpbmcuZ2V0U3RyaW5nKClbMF0scmVzdWx0LmdldFN1cGVyVGVzdExpc3RTdHJpbmdFbGVtZW50KCkuZ2V0U3RyaW5nKClbMF0pOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShmYWxzZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW5uZXJTaW1wbGVUeXBlcygpewotICAgICAgICBUZXN0SW5uZXJMaXN0U2ltcGxlVHlwZSB0ZXN0SW5uZXJMaXN0U2ltcGxlVHlwZSA9IG5ldyBUZXN0SW5uZXJMaXN0U2ltcGxlVHlwZSgpOwotICAgICAgICBJbm5lckxpc3RTaW1wbGVUeXBlIGlubmVyTGlzdFNpbXBsZVR5cGUgPSBuZXcgSW5uZXJMaXN0U2ltcGxlVHlwZSgpOwotICAgICAgICB0ZXN0SW5uZXJMaXN0U2ltcGxlVHlwZS5zZXRUZXN0SW5uZXJMaXN0U2ltcGxlVHlwZShpbm5lckxpc3RTaW1wbGVUeXBlKTsKLSAgICAgICAgSW5uZXJMaXN0U2ltcGxlVHlwZV90eXBlMFtdIGxpc3QgPSBuZXcgSW5uZXJMaXN0U2ltcGxlVHlwZV90eXBlMFsyXTsKLSAgICAgICAgbGlzdFswXSA9IElubmVyTGlzdFNpbXBsZVR5cGVfdHlwZTAuQWNjZXNzOwotICAgICAgICBsaXN0WzFdID0gSW5uZXJMaXN0U2ltcGxlVHlwZV90eXBlMC5FeGlzdDsKLQotICAgICAgICBpbm5lckxpc3RTaW1wbGVUeXBlLnNldElubmVyTGlzdFNpbXBsZVR5cGVfdHlwZTAobGlzdCk7Ci0KLSAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IHRlc3RJbm5lckxpc3RTaW1wbGVUeXBlLmdldE9NRWxlbWVudChUZXN0SW5uZXJMaXN0U2ltcGxlVHlwZS5NWV9RTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT00gRWxlbWVudCA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIFRlc3RJbm5lckxpc3RTaW1wbGVUeXBlIHJlc3VsdCA9IFRlc3RJbm5lckxpc3RTaW1wbGVUeXBlLkZhY3RvcnkucGFyc2UoeG1sUmVhZGVyKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0VGVzdElubmVyTGlzdFNpbXBsZVR5cGUoKS5nZXRJbm5lckxpc3RTaW1wbGVUeXBlX3R5cGUwKClbMF0sSW5uZXJMaXN0U2ltcGxlVHlwZV90eXBlMC5BY2Nlc3MpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRUZXN0SW5uZXJMaXN0U2ltcGxlVHlwZSgpLmdldElubmVyTGlzdFNpbXBsZVR5cGVfdHlwZTAoKVsxXSxJbm5lckxpc3RTaW1wbGVUeXBlX3R5cGUwLkV4aXN0KTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUoZmFsc2UpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9wYXJ0aWNhbG1heG9jY3Vycy9QYXJ0aWNhbE1heE9jY3Vyc1Rlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcGFydGljYWxtYXhvY2N1cnMvUGFydGljYWxNYXhPY2N1cnNUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwMGVmMDYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9wYXJ0aWNhbG1heG9jY3Vycy9QYXJ0aWNhbE1heE9jY3Vyc1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLnBhcnRpY2FsbWF4b2NjdXJzOwotCi1pbXBvcnQgY29tLm15bmFtZXNwYWNlLnRlc3RwYXJ0aWNsZW1heG9jY3Vycy4qOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5TdEFYVXRpbHM7Ci0KLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotCi0KLXB1YmxpYyBjbGFzcyBQYXJ0aWNhbE1heE9jY3Vyc1Rlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwcml2YXRlIGludCBpID0gMDsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzVGVzdDEoKSB7Ci0gICAgICAgIFRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzMSB0ZXN0UGFydGljYWxNYXhPY2N1cmVzMSA9IG5ldyBUZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3VyczEoKTsKLSAgICAgICAgVGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnNUeXBlMSB0ZXN0UGFydGljYWxNYXhPY2N1cnNUeXBlMSA9IG5ldyBUZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3Vyc1R5cGUxKCk7Ci0gICAgICAgIHRlc3RQYXJ0aWNhbE1heE9jY3VyZXMxLnNldFRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzMSh0ZXN0UGFydGljYWxNYXhPY2N1cnNUeXBlMSk7Ci0KLSAgICAgICAgVGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnNUeXBlMVNlcXVlbmNlW10gdGVzdFNlcXVlbmNlcyA9IG5ldyBUZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3Vyc1R5cGUxU2VxdWVuY2VbMl07Ci0KLSAgICAgICAgdGVzdFNlcXVlbmNlc1swXSA9IG5ldyBUZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3Vyc1R5cGUxU2VxdWVuY2UoKTsKLSAgICAgICAgdGVzdFNlcXVlbmNlc1swXS5zZXRQYXJtMSgiUGFyYW0xMSIpOwotICAgICAgICB0ZXN0U2VxdWVuY2VzWzBdLnNldFBhcm0yKCJQYXJhbTEyIik7Ci0KLSAgICAgICAgdGVzdFNlcXVlbmNlc1sxXSA9IG5ldyBUZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3Vyc1R5cGUxU2VxdWVuY2UoKTsKLSAgICAgICAgdGVzdFNlcXVlbmNlc1sxXS5zZXRQYXJtMSgiUGFyYW0yMSIpOwotICAgICAgICB0ZXN0U2VxdWVuY2VzWzFdLnNldFBhcm0yKCJQYXJhbTIyIik7Ci0KLSAgICAgICAgdGVzdFBhcnRpY2FsTWF4T2NjdXJzVHlwZTEuc2V0VGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnNUeXBlMVNlcXVlbmNlKHRlc3RTZXF1ZW5jZXMpOwotCi0gICAgICAgICB0cnkgewotICAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSB0ZXN0UGFydGljYWxNYXhPY2N1cmVzMS5nZXRPTUVsZW1lbnQoVGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnMxLk1ZX1FOQU1FLAotICAgICAgICAgICAgICAgICAgICAgICBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT00gU3RyaW5nID09PiAiICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvbUVsZW1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgVGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnMxIHJlc3VsdCA9IFRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzMS5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcik7Ci0gICAgICAgICAgICBUZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3Vyc1R5cGUxU2VxdWVuY2VbXSByZXN1bHRTZXF1ZW5jZXMgPQotICAgICAgICAgICAgICAgICAgICByZXN1bHQuZ2V0VGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnMxKCkuZ2V0VGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnNUeXBlMVNlcXVlbmNlKCk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0U2VxdWVuY2VzWzBdLmdldFBhcm0xKCksICJQYXJhbTExIik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0U2VxdWVuY2VzWzBdLmdldFBhcm0yKCksICJQYXJhbTEyIik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0U2VxdWVuY2VzWzFdLmdldFBhcm0xKCksICJQYXJhbTIxIik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0U2VxdWVuY2VzWzFdLmdldFBhcm0yKCksICJQYXJhbTIyIik7Ci0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGFydGljbGVTZXF1ZW5jZU1heE9jY3VyczIoKSB7Ci0gICAgICAgIFRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzMiB0ZXN0UGFydGljYWxNYXhPY2N1cmVzMiA9IG5ldyBUZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3VyczIoKTsKLSAgICAgICAgVGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnNUeXBlMiB0ZXN0UGFydGljYWxNYXhPY2N1cnNUeXBlMiA9IG5ldyBUZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3Vyc1R5cGUyKCk7Ci0gICAgICAgIHRlc3RQYXJ0aWNhbE1heE9jY3VyZXMyLnNldFRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzMih0ZXN0UGFydGljYWxNYXhPY2N1cnNUeXBlMik7Ci0KLSAgICAgICAgVGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnNUeXBlMlNlcXVlbmNlW10gdGVzdFNlcXVlbmNlcyA9IG5ldyBUZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3Vyc1R5cGUyU2VxdWVuY2VbMl07Ci0KLSAgICAgICAgdGVzdFNlcXVlbmNlc1swXSA9IG5ldyBUZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3Vyc1R5cGUyU2VxdWVuY2UoKTsKLSAgICAgICAgdGVzdFNlcXVlbmNlc1swXS5zZXRQYXJtMShuZXcgU3RyaW5nW117IlBhcmFtMTExIiwgIlBhcmFtMTEyIiwgIlBhcmFtMTEzIn0pOwotICAgICAgICB0ZXN0U2VxdWVuY2VzWzBdLnNldFBhcm0yKG5ldyBTdHJpbmdbXXsiUGFyYW0xMTEiLCAiUGFyYW0xMTIiLCAiUGFyYW0xMTMifSk7Ci0KLSAgICAgICAgdGVzdFNlcXVlbmNlc1sxXSA9IG5ldyBUZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3Vyc1R5cGUyU2VxdWVuY2UoKTsKLSAgICAgICAgdGVzdFNlcXVlbmNlc1sxXS5zZXRQYXJtMShuZXcgU3RyaW5nW117IlBhcmFtMTIxIiwgIlBhcmFtMTIyIiwgIlBhcmFtMTIzIn0pOwotICAgICAgICB0ZXN0U2VxdWVuY2VzWzFdLnNldFBhcm0yKG5ldyBTdHJpbmdbXXsiUGFyYW0xMjEiLCAiUGFyYW0xMjIiLCAiUGFyYW0xMjMifSk7Ci0KLSAgICAgICAgdGVzdFBhcnRpY2FsTWF4T2NjdXJzVHlwZTIuc2V0VGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnNUeXBlMlNlcXVlbmNlKHRlc3RTZXF1ZW5jZXMpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gdGVzdFBhcnRpY2FsTWF4T2NjdXJlczIuZ2V0T01FbGVtZW50KFRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzMi5NWV9RTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgIE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgICAgIFN0cmluZyBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTSBTdHJpbmcgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICBUZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3VyczIgcmVzdWx0ID0gVGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnMyLkZhY3RvcnkucGFyc2UoeG1sUmVhZGVyKTsKLSAgICAgICAgICAgIFRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzVHlwZTJTZXF1ZW5jZVtdIHJlc3VsdFNlcXVlbmNlcyA9Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5nZXRUZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3VyczIoKS5nZXRUZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3Vyc1R5cGUyU2VxdWVuY2UoKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHRTZXF1ZW5jZXNbMF0uZ2V0UGFybTEoKVswXSwgIlBhcmFtMTExIik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0U2VxdWVuY2VzWzBdLmdldFBhcm0xKClbMV0sICJQYXJhbTExMiIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdFNlcXVlbmNlc1swXS5nZXRQYXJtMSgpWzJdLCAiUGFyYW0xMTMiKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHRTZXF1ZW5jZXNbMV0uZ2V0UGFybTIoKVswXSwgIlBhcmFtMTIxIik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0U2VxdWVuY2VzWzFdLmdldFBhcm0yKClbMV0sICJQYXJhbTEyMiIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdFNlcXVlbmNlc1sxXS5nZXRQYXJtMigpWzJdLCAiUGFyYW0xMjMiKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBhcnRpY2xlU2VxdWVuY2VNYXhPY2N1cnMzKCkgewotICAgICAgICBUZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3VyczMgdGVzdFBhcnRpY2FsTWF4T2NjdXJlczMgPSBuZXcgVGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnMzKCk7Ci0gICAgICAgIFRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzVHlwZTMgdGVzdFBhcnRpY2FsTWF4T2NjdXJzVHlwZTMgPSBuZXcgVGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnNUeXBlMygpOwotICAgICAgICB0ZXN0UGFydGljYWxNYXhPY2N1cmVzMy5zZXRUZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3VyczModGVzdFBhcnRpY2FsTWF4T2NjdXJzVHlwZTMpOwotCi0gICAgICAgIFRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzVHlwZTNTZXF1ZW5jZVtdIHRlc3RTZXF1ZW5jZXMgPSBuZXcgVGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnNUeXBlM1NlcXVlbmNlWzJdOwotCi0gICAgICAgIHRlc3RTZXF1ZW5jZXNbMF0gPSBuZXcgVGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnNUeXBlM1NlcXVlbmNlKCk7Ci0gICAgICAgIHRlc3RTZXF1ZW5jZXNbMF0uc2V0UGFybTIobmV3IFN0cmluZ1tdeyJQYXJhbTExMSIsIG51bGwsICJQYXJhbTExMyJ9KTsKLQotICAgICAgICB0ZXN0U2VxdWVuY2VzWzFdID0gbmV3IFRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzVHlwZTNTZXF1ZW5jZSgpOwotICAgICAgICB0ZXN0U2VxdWVuY2VzWzFdLnNldFBhcm0xKG5ldyBTdHJpbmdbXXsiUGFyYW0xMjEiLCAiUGFyYW0xMjIiLCBudWxsfSk7Ci0KLSAgICAgICAgdGVzdFBhcnRpY2FsTWF4T2NjdXJzVHlwZTMuc2V0VGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnNUeXBlM1NlcXVlbmNlKHRlc3RTZXF1ZW5jZXMpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gdGVzdFBhcnRpY2FsTWF4T2NjdXJlczMuZ2V0T01FbGVtZW50KFRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzMy5NWV9RTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT00gU3RyaW5nID09PiAiICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvbUVsZW1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgVGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnMzIHJlc3VsdCA9IFRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzMy5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcik7Ci0gICAgICAgICAgICBUZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3Vyc1R5cGUzU2VxdWVuY2VbXSByZXN1bHRTZXF1ZW5jZXMgPQotICAgICAgICAgICAgICAgICAgICByZXN1bHQuZ2V0VGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnMzKCkuZ2V0VGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnNUeXBlM1NlcXVlbmNlKCk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0U2VxdWVuY2VzWzBdLmdldFBhcm0yKClbMF0sICJQYXJhbTExMSIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdFNlcXVlbmNlc1swXS5nZXRQYXJtMigpWzFdLCBudWxsKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHRTZXF1ZW5jZXNbMF0uZ2V0UGFybTIoKVsyXSwgIlBhcmFtMTEzIik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0U2VxdWVuY2VzWzFdLmdldFBhcm0xKClbMF0sICJQYXJhbTEyMSIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdFNlcXVlbmNlc1sxXS5nZXRQYXJtMSgpWzFdLCAiUGFyYW0xMjIiKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHRTZXF1ZW5jZXNbMV0uZ2V0UGFybTEoKVsyXSwgbnVsbCk7Ci0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGFydGljbGVTZXF1ZW5jZU1heE9jY3VyczQoKSB7Ci0KLSAgICAgICAgVGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnM0IHRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzNCA9IG5ldyBUZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3VyczQoKTsKLSAgICAgICAgVGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnNUeXBlNCB0ZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3Vyc1R5cGU0ID0gbmV3IFRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzVHlwZTQoKTsKLSAgICAgICAgdGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnM0LnNldFRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzNCh0ZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3Vyc1R5cGU0KTsKLQotICAgICAgICBUZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3Vyc1R5cGU0U2VxdWVuY2VbXSB0ZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3Vyc1R5cGU0U2VxdWVuY2UgPQotICAgICAgICAgICAgICAgIG5ldyBUZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3Vyc1R5cGU0U2VxdWVuY2VbM107Ci0KLSAgICAgICAgdGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnNUeXBlNC5zZXRUZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3Vyc1R5cGU0U2VxdWVuY2UodGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnNUeXBlNFNlcXVlbmNlKTsKLSAgICAgICAgdGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnNUeXBlNFNlcXVlbmNlWzBdID0gbmV3IFRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzVHlwZTRTZXF1ZW5jZSgpOwotICAgICAgICB0ZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3Vyc1R5cGU0U2VxdWVuY2VbMF0uc2V0UGFybTEoZ2V0TmV3Q3VzdG9tVHlwZSgpKTsKLQotICAgICAgICB0ZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3Vyc1R5cGU0U2VxdWVuY2VbMV0gPSBuZXcgVGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnNUeXBlNFNlcXVlbmNlKCk7Ci0gICAgICAgIHRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzVHlwZTRTZXF1ZW5jZVsxXS5zZXRQYXJtMigiUGFyYW0yIik7Ci0KLSAgICAgICAgdGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnNUeXBlNFNlcXVlbmNlWzJdID0gbmV3IFRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzVHlwZTRTZXF1ZW5jZSgpOwotICAgICAgICB0ZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3Vyc1R5cGU0U2VxdWVuY2VbMl0uc2V0UGFybTMoZ2V0TmV3Q3VzdG9tVHlwZSgpKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IHRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzNC5nZXRPTUVsZW1lbnQoVGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnM0Lk1ZX1FOQU1FLAotICAgICAgICAgICAgICAgICAgICAgT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCkpOwotICAgICAgICAgICAgU3RyaW5nIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NIFN0cmluZyA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIFRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzNCByZXN1bHQgPSBUZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3VyczQuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpOwotICAgICAgICAgICAgVGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnNUeXBlNFNlcXVlbmNlW10gcmVzdWx0U2VxdWVuY2VzID0KLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmdldFRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzNCgpLmdldFRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzVHlwZTRTZXF1ZW5jZSgpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShpc0VxdWFsKHJlc3VsdFNlcXVlbmNlc1swXS5nZXRQYXJtMSgpLCB0ZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3Vyc1R5cGU0U2VxdWVuY2VbMF0uZ2V0UGFybTEoKSkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShpc0VxdWFsKHJlc3VsdFNlcXVlbmNlc1swXS5nZXRQYXJtMigpLCB0ZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3Vyc1R5cGU0U2VxdWVuY2VbMF0uZ2V0UGFybTIoKSkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShpc0VxdWFsKHJlc3VsdFNlcXVlbmNlc1swXS5nZXRQYXJtMygpLCB0ZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3Vyc1R5cGU0U2VxdWVuY2VbMF0uZ2V0UGFybTMoKSkpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGlzRXF1YWwocmVzdWx0U2VxdWVuY2VzWzFdLmdldFBhcm0xKCksIHRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzVHlwZTRTZXF1ZW5jZVsxXS5nZXRQYXJtMSgpKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGlzRXF1YWwocmVzdWx0U2VxdWVuY2VzWzFdLmdldFBhcm0yKCksIHRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzVHlwZTRTZXF1ZW5jZVsxXS5nZXRQYXJtMigpKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGlzRXF1YWwocmVzdWx0U2VxdWVuY2VzWzFdLmdldFBhcm0zKCksIHRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzVHlwZTRTZXF1ZW5jZVsxXS5nZXRQYXJtMygpKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoaXNFcXVhbChyZXN1bHRTZXF1ZW5jZXNbMl0uZ2V0UGFybTEoKSwgdGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnNUeXBlNFNlcXVlbmNlWzJdLmdldFBhcm0xKCkpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoaXNFcXVhbChyZXN1bHRTZXF1ZW5jZXNbMl0uZ2V0UGFybTIoKSwgdGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnNUeXBlNFNlcXVlbmNlWzJdLmdldFBhcm0yKCkpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoaXNFcXVhbChyZXN1bHRTZXF1ZW5jZXNbMl0uZ2V0UGFybTMoKSwgdGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnNUeXBlNFNlcXVlbmNlWzJdLmdldFBhcm0zKCkpKTsKLQotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0KLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJ0aWNsZVNlcXVlbmNlTWF4T2NjdXJzNSgpIHsKLQotICAgICAgICBUZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3VyczUgdGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnM1ID0gbmV3IFRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzNSgpOwotICAgICAgICBUZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3Vyc1R5cGU1IHRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzVHlwZTUgPSBuZXcgVGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnNUeXBlNSgpOwotICAgICAgICB0ZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3VyczUuc2V0VGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnM1KHRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzVHlwZTUpOwotCi0gICAgICAgIFRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzVHlwZTVTZXF1ZW5jZVtdIHRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzVHlwZTVTZXF1ZW5jZSA9Ci0gICAgICAgICAgICAgICAgbmV3IFRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzVHlwZTVTZXF1ZW5jZVszXTsKLQotICAgICAgICB0ZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3Vyc1R5cGU1LnNldFRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzVHlwZTVTZXF1ZW5jZSh0ZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3Vyc1R5cGU1U2VxdWVuY2UpOwotCi0gICAgICAgIHRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzVHlwZTVTZXF1ZW5jZVswXSA9IG5ldyBUZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3Vyc1R5cGU1U2VxdWVuY2UoKTsKLSAgICAgICAgdGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnNUeXBlNVNlcXVlbmNlWzBdLnNldFBhcm0xKG5ldyBUZXN0Q3VzdG9tVHlwZVtde2dldE5ld0N1c3RvbVR5cGUoKX0pOwotICAgICAgICB0ZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3Vyc1R5cGU1U2VxdWVuY2VbMF0uc2V0UGFybTMobmV3IFRlc3RDdXN0b21UeXBlW117Z2V0TmV3Q3VzdG9tVHlwZSgpfSk7Ci0KLSAgICAgICAgdGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnNUeXBlNVNlcXVlbmNlWzFdID0gbmV3IFRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzVHlwZTVTZXF1ZW5jZSgpOwotICAgICAgICB0ZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3Vyc1R5cGU1U2VxdWVuY2VbMV0uc2V0UGFybTEobmV3IFRlc3RDdXN0b21UeXBlW117Z2V0TmV3Q3VzdG9tVHlwZSgpfSk7Ci0gICAgICAgIHRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzVHlwZTVTZXF1ZW5jZVsxXS5zZXRQYXJtMigiUGFyYW0yIik7Ci0gICAgICAgIHRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzVHlwZTVTZXF1ZW5jZVsxXS5zZXRQYXJtMyhuZXcgVGVzdEN1c3RvbVR5cGVbXXtnZXROZXdDdXN0b21UeXBlKCl9KTsKLQotICAgICAgICB0ZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3Vyc1R5cGU1U2VxdWVuY2VbMl0gPSBuZXcgVGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnNUeXBlNVNlcXVlbmNlKCk7Ci0gICAgICAgIHRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzVHlwZTVTZXF1ZW5jZVsyXS5zZXRQYXJtMShuZXcgVGVzdEN1c3RvbVR5cGVbXXtnZXROZXdDdXN0b21UeXBlKCl9KTsKLSAgICAgICAgdGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnNUeXBlNVNlcXVlbmNlWzJdLnNldFBhcm0zKG5ldyBUZXN0Q3VzdG9tVHlwZVtde2dldE5ld0N1c3RvbVR5cGUoKX0pOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gdGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnM1LmdldE9NRWxlbWVudChUZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3VyczUuTVlfUU5BTUUsCi0gICAgICAgICAgICAgICAgICAgIE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgICAgIFN0cmluZyBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTSBTdHJpbmcgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICBUZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3VyczUgcmVzdWx0ID0gVGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnM1LkZhY3RvcnkucGFyc2UoeG1sUmVhZGVyKTsKLSAgICAgICAgICAgIFRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzVHlwZTVTZXF1ZW5jZVtdIHJlc3VsdFNlcXVlbmNlcyA9Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5nZXRUZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3VyczUoKS5nZXRUZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3Vyc1R5cGU1U2VxdWVuY2UoKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoaXNFcXVhbChyZXN1bHRTZXF1ZW5jZXNbMF0uZ2V0UGFybTEoKSwgdGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnNUeXBlNVNlcXVlbmNlWzBdLmdldFBhcm0xKCkpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoaXNFcXVhbChyZXN1bHRTZXF1ZW5jZXNbMF0uZ2V0UGFybTIoKSwgdGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnNUeXBlNVNlcXVlbmNlWzBdLmdldFBhcm0yKCkpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoaXNFcXVhbChyZXN1bHRTZXF1ZW5jZXNbMF0uZ2V0UGFybTMoKSwgdGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnNUeXBlNVNlcXVlbmNlWzBdLmdldFBhcm0zKCkpKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShpc0VxdWFsKHJlc3VsdFNlcXVlbmNlc1sxXS5nZXRQYXJtMSgpLCB0ZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3Vyc1R5cGU1U2VxdWVuY2VbMV0uZ2V0UGFybTEoKSkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShpc0VxdWFsKHJlc3VsdFNlcXVlbmNlc1sxXS5nZXRQYXJtMigpLCB0ZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3Vyc1R5cGU1U2VxdWVuY2VbMV0uZ2V0UGFybTIoKSkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShpc0VxdWFsKHJlc3VsdFNlcXVlbmNlc1sxXS5nZXRQYXJtMygpLCB0ZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3Vyc1R5cGU1U2VxdWVuY2VbMV0uZ2V0UGFybTMoKSkpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGlzRXF1YWwocmVzdWx0U2VxdWVuY2VzWzJdLmdldFBhcm0xKCksIHRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzVHlwZTVTZXF1ZW5jZVsyXS5nZXRQYXJtMSgpKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGlzRXF1YWwocmVzdWx0U2VxdWVuY2VzWzJdLmdldFBhcm0yKCksIHRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzVHlwZTVTZXF1ZW5jZVsyXS5nZXRQYXJtMigpKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGlzRXF1YWwocmVzdWx0U2VxdWVuY2VzWzJdLmdldFBhcm0zKCksIHRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzVHlwZTVTZXF1ZW5jZVsyXS5nZXRQYXJtMygpKSk7Ci0KLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0KLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzVGVzdDYoKSB7Ci0gICAgICAgIFRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzNiB0ZXN0UGFydGljYWxNYXhPY2N1cmVzNiA9IG5ldyBUZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3VyczYoKTsKLSAgICAgICAgVGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnNUeXBlNiB0ZXN0UGFydGljYWxNYXhPY2N1cnNUeXBlNiA9IG5ldyBUZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3Vyc1R5cGU2KCk7Ci0gICAgICAgIHRlc3RQYXJ0aWNhbE1heE9jY3VyZXM2LnNldFRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzNih0ZXN0UGFydGljYWxNYXhPY2N1cnNUeXBlNik7Ci0KLSAgICAgICAgVGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnNUeXBlNlNlcXVlbmNlW10gdGVzdFNlcXVlbmNlcyA9IG5ldyBUZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3Vyc1R5cGU2U2VxdWVuY2VbMl07Ci0KLSAgICAgICAgdGVzdFNlcXVlbmNlc1swXSA9IG5ldyBUZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3Vyc1R5cGU2U2VxdWVuY2UoKTsKLSAgICAgICAgdGVzdFNlcXVlbmNlc1swXS5zZXRQYXJtMSgiUGFyYW0xMSIpOwotICAgICAgICB0ZXN0U2VxdWVuY2VzWzBdLnNldFBhcm0yKCJQYXJhbTEyIik7Ci0KLSAgICAgICAgdGVzdFNlcXVlbmNlc1sxXSA9IG5ldyBUZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3Vyc1R5cGU2U2VxdWVuY2UoKTsKLSAgICAgICAgdGVzdFNlcXVlbmNlc1sxXS5zZXRQYXJtMSgiUGFyYW0yMSIpOwotICAgICAgICB0ZXN0U2VxdWVuY2VzWzFdLnNldFBhcm0yKCJQYXJhbTIyIik7Ci0KLSAgICAgICAgdGVzdFBhcnRpY2FsTWF4T2NjdXJzVHlwZTYuc2V0VGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnNUeXBlNlNlcXVlbmNlKHRlc3RTZXF1ZW5jZXMpOwotICAgICAgICB0ZXN0UGFydGljYWxNYXhPY2N1cnNUeXBlNi5zZXRBdHRyaWJ1dGUxKCJBdHRyaWJ1dGUxIik7Ci0gICAgICAgIHRlc3RQYXJ0aWNhbE1heE9jY3Vyc1R5cGU2LnNldEF0dHJpYnV0ZTIoIkF0dHJpYnV0ZTIiKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IHRlc3RQYXJ0aWNhbE1heE9jY3VyZXM2LmdldE9NRWxlbWVudChUZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3VyczYuTVlfUU5BTUUsCi0gICAgICAgICAgICAgICAgICAgICBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT00gU3RyaW5nID09PiAiICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvbUVsZW1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgVGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnM2IHJlc3VsdCA9IFRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzNi5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcik7Ci0gICAgICAgICAgICBUZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3Vyc1R5cGU2U2VxdWVuY2VbXSByZXN1bHRTZXF1ZW5jZXMgPQotICAgICAgICAgICAgICAgICAgICByZXN1bHQuZ2V0VGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnM2KCkuZ2V0VGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnNUeXBlNlNlcXVlbmNlKCk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0U2VxdWVuY2VzWzBdLmdldFBhcm0xKCksICJQYXJhbTExIik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0U2VxdWVuY2VzWzBdLmdldFBhcm0yKCksICJQYXJhbTEyIik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0U2VxdWVuY2VzWzFdLmdldFBhcm0xKCksICJQYXJhbTIxIik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0U2VxdWVuY2VzWzFdLmdldFBhcm0yKCksICJQYXJhbTIyIik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzNigpLmdldEF0dHJpYnV0ZTEoKSwgIkF0dHJpYnV0ZTEiKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0VGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnM2KCkuZ2V0QXR0cmlidXRlMigpLCAiQXR0cmlidXRlMiIpOwotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBhcnRpY2FsTWF4T2NjdXJzVGVzdCgpIHsKLSAgICAgICAgVGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzIHRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3VycyA9IG5ldyBUZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnMoKTsKLSAgICAgICAgVGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzVHlwZSB0ZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnNUeXBlID0gbmV3IFRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3Vyc1R5cGUoKTsKLSAgICAgICAgdGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzLnNldFRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3Vycyh0ZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnNUeXBlKTsKLQotICAgICAgICB0ZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnNUeXBlLnNldFBhcm0xKCJQYXJhbTEiKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9Ci0gICAgICAgICAgICAgICAgICAgICB0ZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnMuZ2V0T01FbGVtZW50KFRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3Vycy5NWV9RTkFNRSwgT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCkpOwotICAgICAgICAgICAgU3RyaW5nIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NIHN0cmluZyA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIFRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3VycyByZXN1bHQgPSBUZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnMuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRUZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnMoKS5nZXRQYXJtMSgpLCAiUGFyYW0xIik7Ci0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnNUZXN0MSgpIHsKLSAgICAgICAgVGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzMSB0ZXN0UGFydGljYWxNYXhPY2N1cmVzMSA9IG5ldyBUZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnMxKCk7Ci0gICAgICAgIFRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3Vyc1R5cGUxIHRlc3RQYXJ0aWNhbE1heE9jY3Vyc1R5cGUxID0gbmV3IFRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3Vyc1R5cGUxKCk7Ci0gICAgICAgIHRlc3RQYXJ0aWNhbE1heE9jY3VyZXMxLnNldFRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3VyczEodGVzdFBhcnRpY2FsTWF4T2NjdXJzVHlwZTEpOwotCi0gICAgICAgIFRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3Vyc1R5cGUxQ2hvaWNlW10gdGVzdENob2ljZXMgPSBuZXcgVGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzVHlwZTFDaG9pY2VbMl07Ci0KLSAgICAgICAgdGVzdENob2ljZXNbMF0gPSBuZXcgVGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzVHlwZTFDaG9pY2UoKTsKLSAgICAgICAgdGVzdENob2ljZXNbMF0uc2V0UGFybTEoIlBhcmFtMTEiKTsKLQotICAgICAgICB0ZXN0Q2hvaWNlc1sxXSA9IG5ldyBUZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnNUeXBlMUNob2ljZSgpOwotICAgICAgICB0ZXN0Q2hvaWNlc1sxXS5zZXRQYXJtMigiUGFyYW0xMiIpOwotCi0gICAgICAgIHRlc3RQYXJ0aWNhbE1heE9jY3Vyc1R5cGUxLnNldFRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3Vyc1R5cGUxQ2hvaWNlKHRlc3RDaG9pY2VzKTsKLQotICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gdGVzdFBhcnRpY2FsTWF4T2NjdXJlczEuZ2V0T01FbGVtZW50KFRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3VyczEuTVlfUU5BTUUsCi0gICAgICAgICAgICAgICAgICAgT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCkpOwotICAgICAgICAgICAgU3RyaW5nIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NIFN0cmluZyA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIFRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3VyczEgcmVzdWx0ID0gVGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzMS5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcik7Ci0gICAgICAgICAgICBUZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnNUeXBlMUNob2ljZVtdIHJlc3VsdENob2ljZXMgPQotICAgICAgICAgICAgICAgICAgICByZXN1bHQuZ2V0VGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzMSgpLmdldFRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3Vyc1R5cGUxQ2hvaWNlKCk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0Q2hvaWNlc1swXS5nZXRQYXJtMSgpLCAiUGFyYW0xMSIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdENob2ljZXNbMV0uZ2V0UGFybTIoKSwgIlBhcmFtMTIiKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJ0aWNsZUNob2ljZU1heE9jY3VyczIoKSB7Ci0gICAgICAgIFRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3VyczIgdGVzdFBhcnRpY2FsTWF4T2NjdXJlczIgPSBuZXcgVGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzMigpOwotICAgICAgICBUZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnNUeXBlMiB0ZXN0UGFydGljYWxNYXhPY2N1cnNUeXBlMiA9IG5ldyBUZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnNUeXBlMigpOwotICAgICAgICB0ZXN0UGFydGljYWxNYXhPY2N1cmVzMi5zZXRUZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnMyKHRlc3RQYXJ0aWNhbE1heE9jY3Vyc1R5cGUyKTsKLQotICAgICAgICBUZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnNUeXBlMkNob2ljZVtdIHRlc3RDaG9pY2VzID0gbmV3IFRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3Vyc1R5cGUyQ2hvaWNlWzJdOwotCi0gICAgICAgIHRlc3RDaG9pY2VzWzBdID0gbmV3IFRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3Vyc1R5cGUyQ2hvaWNlKCk7Ci0gICAgICAgIHRlc3RDaG9pY2VzWzBdLnNldFBhcm0xKG5ldyBTdHJpbmdbXXsiUGFyYW0xMTEiLCAiUGFyYW0xMTIiLCAiUGFyYW0xMTMifSk7Ci0KLSAgICAgICAgdGVzdENob2ljZXNbMV0gPSBuZXcgVGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzVHlwZTJDaG9pY2UoKTsKLSAgICAgICAgdGVzdENob2ljZXNbMV0uc2V0UGFybTIobmV3IFN0cmluZ1tdeyJQYXJhbTEyMSIsICJQYXJhbTEyMiIsICJQYXJhbTEyMyJ9KTsKLQotICAgICAgICB0ZXN0UGFydGljYWxNYXhPY2N1cnNUeXBlMi5zZXRUZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnNUeXBlMkNob2ljZSh0ZXN0Q2hvaWNlcyk7Ci0KLSAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IHRlc3RQYXJ0aWNhbE1heE9jY3VyZXMyLmdldE9NRWxlbWVudChUZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnMyLk1ZX1FOQU1FLAotICAgICAgICAgICAgICAgICAgICAgIE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgICAgIFN0cmluZyBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTSBTdHJpbmcgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICBUZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnMyIHJlc3VsdCA9IFRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3VyczIuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpOwotICAgICAgICAgICAgVGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzVHlwZTJDaG9pY2VbXSByZXN1bHRDaG9pY2VzID0KLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmdldFRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3VyczIoKS5nZXRUZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnNUeXBlMkNob2ljZSgpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdENob2ljZXNbMF0uZ2V0UGFybTEoKVswXSwgIlBhcmFtMTExIik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0Q2hvaWNlc1swXS5nZXRQYXJtMSgpWzFdLCAiUGFyYW0xMTIiKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHRDaG9pY2VzWzBdLmdldFBhcm0xKClbMl0sICJQYXJhbTExMyIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdENob2ljZXNbMV0uZ2V0UGFybTIoKVswXSwgIlBhcmFtMTIxIik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0Q2hvaWNlc1sxXS5nZXRQYXJtMigpWzFdLCAiUGFyYW0xMjIiKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHRDaG9pY2VzWzFdLmdldFBhcm0yKClbMl0sICJQYXJhbTEyMyIpOwotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBhcnRpY2xlQ2hvaWNlTWF4T2NjdXJzMygpIHsKLSAgICAgICAgVGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzMyB0ZXN0UGFydGljYWxNYXhPY2N1cmVzMyA9IG5ldyBUZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnMzKCk7Ci0gICAgICAgIFRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3Vyc1R5cGUzIHRlc3RQYXJ0aWNhbE1heE9jY3Vyc1R5cGUzID0gbmV3IFRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3Vyc1R5cGUzKCk7Ci0gICAgICAgIHRlc3RQYXJ0aWNhbE1heE9jY3VyZXMzLnNldFRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3VyczModGVzdFBhcnRpY2FsTWF4T2NjdXJzVHlwZTMpOwotCi0gICAgICAgIFRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3Vyc1R5cGUzQ2hvaWNlW10gdGVzdENob2ljZXMgPSBuZXcgVGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzVHlwZTNDaG9pY2VbMl07Ci0KLSAgICAgICAgdGVzdENob2ljZXNbMF0gPSBuZXcgVGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzVHlwZTNDaG9pY2UoKTsKLSAgICAgICAgdGVzdENob2ljZXNbMF0uc2V0UGFybTEobmV3IFN0cmluZ1tdeyJQYXJhbTExMSIsIG51bGwsICJQYXJhbTExMyJ9KTsKLQotICAgICAgICB0ZXN0Q2hvaWNlc1sxXSA9IG5ldyBUZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnNUeXBlM0Nob2ljZSgpOwotICAgICAgICB0ZXN0Q2hvaWNlc1sxXS5zZXRQYXJtMihuZXcgU3RyaW5nW117IlBhcmFtMTIxIiwgIlBhcmFtMTIyIiwgbnVsbH0pOwotCi0gICAgICAgIHRlc3RQYXJ0aWNhbE1heE9jY3Vyc1R5cGUzLnNldFRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3Vyc1R5cGUzQ2hvaWNlKHRlc3RDaG9pY2VzKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IHRlc3RQYXJ0aWNhbE1heE9jY3VyZXMzLmdldE9NRWxlbWVudChUZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnMzLk1ZX1FOQU1FLAotICAgICAgICAgICAgICAgICAgICAgT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCkpOwotICAgICAgICAgICAgU3RyaW5nIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NIFN0cmluZyA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIFRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3VyczMgcmVzdWx0ID0gVGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzMy5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcik7Ci0gICAgICAgICAgICBUZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnNUeXBlM0Nob2ljZVtdIHJlc3VsdENob2ljZXMgPQotICAgICAgICAgICAgICAgICAgICByZXN1bHQuZ2V0VGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzMygpLmdldFRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3Vyc1R5cGUzQ2hvaWNlKCk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0Q2hvaWNlc1swXS5nZXRQYXJtMSgpWzBdLCAiUGFyYW0xMTEiKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHRDaG9pY2VzWzBdLmdldFBhcm0xKClbMV0sIG51bGwpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdENob2ljZXNbMF0uZ2V0UGFybTEoKVsyXSwgIlBhcmFtMTEzIik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0Q2hvaWNlc1sxXS5nZXRQYXJtMigpWzBdLCAiUGFyYW0xMjEiKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHRDaG9pY2VzWzFdLmdldFBhcm0yKClbMV0sICJQYXJhbTEyMiIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdENob2ljZXNbMV0uZ2V0UGFybTIoKVsyXSwgbnVsbCk7Ci0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGFydGljbGVDaG9pY2VNYXhPY2N1cnM0KCkgewotCi0gICAgICAgIFRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3VyczQgdGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzNCA9IG5ldyBUZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnM0KCk7Ci0gICAgICAgIFRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3Vyc1R5cGU0IHRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3Vyc1R5cGU0ID0gbmV3IFRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3Vyc1R5cGU0KCk7Ci0gICAgICAgIHRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3VyczQuc2V0VGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzNCh0ZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnNUeXBlNCk7Ci0KLSAgICAgICAgVGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzVHlwZTRDaG9pY2VbXSB0ZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnNUeXBlNENob2ljZSA9Ci0gICAgICAgICAgICAgICAgbmV3IFRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3Vyc1R5cGU0Q2hvaWNlWzNdOwotCi0gICAgICAgIHRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3Vyc1R5cGU0LnNldFRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3Vyc1R5cGU0Q2hvaWNlKHRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3Vyc1R5cGU0Q2hvaWNlKTsKLSAgICAgICAgdGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzVHlwZTRDaG9pY2VbMF0gPSBuZXcgVGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzVHlwZTRDaG9pY2UoKTsKLSAgICAgICAgdGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzVHlwZTRDaG9pY2VbMF0uc2V0UGFybTEoZ2V0TmV3Q3VzdG9tVHlwZSgpKTsKLQotICAgICAgICB0ZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnNUeXBlNENob2ljZVsxXSA9IG5ldyBUZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnNUeXBlNENob2ljZSgpOwotICAgICAgICB0ZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnNUeXBlNENob2ljZVsxXS5zZXRQYXJtMigiUGFyYW0yIik7Ci0KLSAgICAgICAgdGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzVHlwZTRDaG9pY2VbMl0gPSBuZXcgVGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzVHlwZTRDaG9pY2UoKTsKLSAgICAgICAgdGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzVHlwZTRDaG9pY2VbMl0uc2V0UGFybTMoZ2V0TmV3Q3VzdG9tVHlwZSgpKTsKLQotICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gdGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzNC5nZXRPTUVsZW1lbnQoVGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzNC5NWV9RTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT00gU3RyaW5nID09PiAiICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvbUVsZW1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgVGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzNCByZXN1bHQgPSBUZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnM0LkZhY3RvcnkucGFyc2UoeG1sUmVhZGVyKTsKLSAgICAgICAgICAgIFRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3Vyc1R5cGU0Q2hvaWNlW10gcmVzdWx0Q2hvaWNlcyA9Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5nZXRUZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnM0KCkuZ2V0VGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzVHlwZTRDaG9pY2UoKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoaXNFcXVhbChyZXN1bHRDaG9pY2VzWzBdLmdldFBhcm0xKCksIHRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3Vyc1R5cGU0Q2hvaWNlWzBdLmdldFBhcm0xKCkpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoaXNFcXVhbChyZXN1bHRDaG9pY2VzWzBdLmdldFBhcm0yKCksIHRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3Vyc1R5cGU0Q2hvaWNlWzBdLmdldFBhcm0yKCkpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoaXNFcXVhbChyZXN1bHRDaG9pY2VzWzBdLmdldFBhcm0zKCksIHRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3Vyc1R5cGU0Q2hvaWNlWzBdLmdldFBhcm0zKCkpKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShpc0VxdWFsKHJlc3VsdENob2ljZXNbMV0uZ2V0UGFybTEoKSwgdGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzVHlwZTRDaG9pY2VbMV0uZ2V0UGFybTEoKSkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShpc0VxdWFsKHJlc3VsdENob2ljZXNbMV0uZ2V0UGFybTIoKSwgdGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzVHlwZTRDaG9pY2VbMV0uZ2V0UGFybTIoKSkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShpc0VxdWFsKHJlc3VsdENob2ljZXNbMV0uZ2V0UGFybTMoKSwgdGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzVHlwZTRDaG9pY2VbMV0uZ2V0UGFybTMoKSkpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGlzRXF1YWwocmVzdWx0Q2hvaWNlc1syXS5nZXRQYXJtMSgpLCB0ZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnNUeXBlNENob2ljZVsyXS5nZXRQYXJtMSgpKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGlzRXF1YWwocmVzdWx0Q2hvaWNlc1syXS5nZXRQYXJtMigpLCB0ZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnNUeXBlNENob2ljZVsyXS5nZXRQYXJtMigpKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGlzRXF1YWwocmVzdWx0Q2hvaWNlc1syXS5nZXRQYXJtMygpLCB0ZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnNUeXBlNENob2ljZVsyXS5nZXRQYXJtMygpKSk7Ci0KLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotCi0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGFydGljbGVDaG9pY2VNYXhPY2N1cnM1KCkgewotCi0gICAgICAgIFRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3VyczUgdGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzNSA9IG5ldyBUZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnM1KCk7Ci0gICAgICAgIFRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3Vyc1R5cGU1IHRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3Vyc1R5cGU1ID0gbmV3IFRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3Vyc1R5cGU1KCk7Ci0gICAgICAgIHRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3VyczUuc2V0VGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzNSh0ZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnNUeXBlNSk7Ci0KLSAgICAgICAgVGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzVHlwZTVDaG9pY2VbXSB0ZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnNUeXBlNUNob2ljZSA9Ci0gICAgICAgICAgICAgICAgbmV3IFRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3Vyc1R5cGU1Q2hvaWNlWzNdOwotCi0gICAgICAgIHRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3Vyc1R5cGU1LnNldFRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3Vyc1R5cGU1Q2hvaWNlKHRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3Vyc1R5cGU1Q2hvaWNlKTsKLQotICAgICAgICB0ZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnNUeXBlNUNob2ljZVswXSA9IG5ldyBUZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnNUeXBlNUNob2ljZSgpOwotICAgICAgICB0ZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnNUeXBlNUNob2ljZVswXS5zZXRQYXJtMShuZXcgVGVzdEN1c3RvbVR5cGVbXXtnZXROZXdDdXN0b21UeXBlKCl9KTsKLQotICAgICAgICB0ZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnNUeXBlNUNob2ljZVsxXSA9IG5ldyBUZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnNUeXBlNUNob2ljZSgpOwotICAgICAgICB0ZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnNUeXBlNUNob2ljZVsxXS5zZXRQYXJtMigiUGFyYW0yIik7Ci0KLSAgICAgICAgdGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzVHlwZTVDaG9pY2VbMl0gPSBuZXcgVGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzVHlwZTVDaG9pY2UoKTsKLSAgICAgICAgdGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzVHlwZTVDaG9pY2VbMl0uc2V0UGFybTMobmV3IFRlc3RDdXN0b21UeXBlW117Z2V0TmV3Q3VzdG9tVHlwZSgpfSk7Ci0KLSAgICAgICB0cnkgewotICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IHRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3VyczUuZ2V0T01FbGVtZW50KFRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3VyczUuTVlfUU5BTUUsCi0gICAgICAgICAgICAgICAgICAgT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCkpOwotICAgICAgICAgICAgU3RyaW5nIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NIFN0cmluZyA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIFRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3VyczUgcmVzdWx0ID0gVGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzNS5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcik7Ci0gICAgICAgICAgICBUZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnNUeXBlNUNob2ljZVtdIHJlc3VsdENob2ljZXMgPQotICAgICAgICAgICAgICAgICAgICByZXN1bHQuZ2V0VGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzNSgpLmdldFRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3Vyc1R5cGU1Q2hvaWNlKCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGlzRXF1YWwocmVzdWx0Q2hvaWNlc1swXS5nZXRQYXJtMSgpLCB0ZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnNUeXBlNUNob2ljZVswXS5nZXRQYXJtMSgpKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGlzRXF1YWwocmVzdWx0Q2hvaWNlc1swXS5nZXRQYXJtMigpLCB0ZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnNUeXBlNUNob2ljZVswXS5nZXRQYXJtMigpKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGlzRXF1YWwocmVzdWx0Q2hvaWNlc1swXS5nZXRQYXJtMygpLCB0ZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnNUeXBlNUNob2ljZVswXS5nZXRQYXJtMygpKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoaXNFcXVhbChyZXN1bHRDaG9pY2VzWzFdLmdldFBhcm0xKCksIHRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3Vyc1R5cGU1Q2hvaWNlWzFdLmdldFBhcm0xKCkpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoaXNFcXVhbChyZXN1bHRDaG9pY2VzWzFdLmdldFBhcm0yKCksIHRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3Vyc1R5cGU1Q2hvaWNlWzFdLmdldFBhcm0yKCkpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoaXNFcXVhbChyZXN1bHRDaG9pY2VzWzFdLmdldFBhcm0zKCksIHRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3Vyc1R5cGU1Q2hvaWNlWzFdLmdldFBhcm0zKCkpKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShpc0VxdWFsKHJlc3VsdENob2ljZXNbMl0uZ2V0UGFybTEoKSwgdGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzVHlwZTVDaG9pY2VbMl0uZ2V0UGFybTEoKSkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShpc0VxdWFsKHJlc3VsdENob2ljZXNbMl0uZ2V0UGFybTIoKSwgdGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzVHlwZTVDaG9pY2VbMl0uZ2V0UGFybTIoKSkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShpc0VxdWFsKHJlc3VsdENob2ljZXNbMl0uZ2V0UGFybTMoKSwgdGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzVHlwZTVDaG9pY2VbMl0uZ2V0UGFybTMoKSkpOwotCi0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotCi0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnNUZXN0NigpIHsKLSAgICAgICAgVGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzNiB0ZXN0UGFydGljYWxNYXhPY2N1cmVzNiA9IG5ldyBUZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnM2KCk7Ci0gICAgICAgIFRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3Vyc1R5cGU2IHRlc3RQYXJ0aWNhbE1heE9jY3Vyc1R5cGU2ID0gbmV3IFRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3Vyc1R5cGU2KCk7Ci0gICAgICAgIHRlc3RQYXJ0aWNhbE1heE9jY3VyZXM2LnNldFRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3VyczYodGVzdFBhcnRpY2FsTWF4T2NjdXJzVHlwZTYpOwotCi0gICAgICAgIFRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3Vyc1R5cGU2Q2hvaWNlW10gdGVzdENob2ljZXMgPSBuZXcgVGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzVHlwZTZDaG9pY2VbMl07Ci0KLSAgICAgICAgdGVzdENob2ljZXNbMF0gPSBuZXcgVGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzVHlwZTZDaG9pY2UoKTsKLSAgICAgICAgdGVzdENob2ljZXNbMF0uc2V0UGFybTEoIlBhcmFtMTEiKTsKLQotICAgICAgICB0ZXN0Q2hvaWNlc1sxXSA9IG5ldyBUZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnNUeXBlNkNob2ljZSgpOwotICAgICAgICB0ZXN0Q2hvaWNlc1sxXS5zZXRQYXJtMigiUGFyYW0xMiIpOwotCi0gICAgICAgIHRlc3RQYXJ0aWNhbE1heE9jY3Vyc1R5cGU2LnNldFRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3Vyc1R5cGU2Q2hvaWNlKHRlc3RDaG9pY2VzKTsKLSAgICAgICAgdGVzdFBhcnRpY2FsTWF4T2NjdXJzVHlwZTYuc2V0QXR0cmlidXRlMSgiQXR0cmlidXRlMSIpOwotICAgICAgICB0ZXN0UGFydGljYWxNYXhPY2N1cnNUeXBlNi5zZXRBdHRyaWJ1dGUyKCJBdHRyaWJ1dGUyIik7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSB0ZXN0UGFydGljYWxNYXhPY2N1cmVzNi5nZXRPTUVsZW1lbnQoVGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzNi5NWV9RTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCkpOwotICAgICAgICAgICAgU3RyaW5nIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NIFN0cmluZyA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIFRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3VyczYgcmVzdWx0ID0gVGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzNi5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcik7Ci0gICAgICAgICAgICBUZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnNUeXBlNkNob2ljZVtdIHJlc3VsdENob2ljZXMgPQotICAgICAgICAgICAgICAgICAgICByZXN1bHQuZ2V0VGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzNigpLmdldFRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3Vyc1R5cGU2Q2hvaWNlKCk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0Q2hvaWNlc1swXS5nZXRQYXJtMSgpLCAiUGFyYW0xMSIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdENob2ljZXNbMV0uZ2V0UGFybTIoKSwgIlBhcmFtMTIiKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0VGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzNigpLmdldEF0dHJpYnV0ZTEoKSwgIkF0dHJpYnV0ZTEiKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0VGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzNigpLmdldEF0dHJpYnV0ZTIoKSwgIkF0dHJpYnV0ZTIiKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgVGVzdEN1c3RvbVR5cGUgZ2V0TmV3Q3VzdG9tVHlwZSgpIHsKLSAgICAgICAgaSsrOwotICAgICAgICBUZXN0Q3VzdG9tVHlwZSB0ZXN0Q3VzdG9tVHlwZSA9IG5ldyBUZXN0Q3VzdG9tVHlwZSgpOwotICAgICAgICB0ZXN0Q3VzdG9tVHlwZS5zZXRQYXJhbTEoIlBhcmFtIiArIGkgKyAiMiIpOwotICAgICAgICB0ZXN0Q3VzdG9tVHlwZS5zZXRQYXJhbTIobmV3IFN0cmluZ1tdeyJQYXJhbSIgKyBpICsgIjIxIiwgIlBhcmFtIiArIGkgKyAiMjIiLCAiUGFyYW0iICsgaSArICIyMyJ9KTsKLSAgICAgICAgdGVzdEN1c3RvbVR5cGUuc2V0UGFyYW0zKCJQYXJhbSIgKyBpICsgIjMiKTsKLSAgICAgICAgcmV0dXJuIHRlc3RDdXN0b21UeXBlOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0VxdWFsKFRlc3RDdXN0b21UeXBlIG9iamVjdDEsIFRlc3RDdXN0b21UeXBlIG9iamVjdDIpIHsKLSAgICAgICAgYm9vbGVhbiBpc0VxdWFsID0gZmFsc2U7Ci0gICAgICAgIGlmICgob2JqZWN0MSAhPSBudWxsKSAmJiAob2JqZWN0MiAhPSBudWxsKSkgewotICAgICAgICAgICAgaXNFcXVhbCA9IGlzRXF1YWwob2JqZWN0MS5nZXRQYXJhbTEoKSwgb2JqZWN0Mi5nZXRQYXJhbTEoKSkgJiYKLSAgICAgICAgICAgICAgICAgICAgaXNFcXVhbChvYmplY3QxLmdldFBhcmFtMigpLCBvYmplY3QyLmdldFBhcmFtMigpKSAmJgotICAgICAgICAgICAgICAgICAgICBpc0VxdWFsKG9iamVjdDEuZ2V0UGFyYW0zKCksIG9iamVjdDIuZ2V0UGFyYW0zKCkpOwotICAgICAgICB9IGVsc2UgaWYgKChvYmplY3QxID09IG51bGwpICYmIChvYmplY3QyID09IG51bGwpKSB7Ci0gICAgICAgICAgICBpc0VxdWFsID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXNFcXVhbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNFcXVhbChUZXN0Q3VzdG9tVHlwZVtdIG9iamVjdDEsIFRlc3RDdXN0b21UeXBlW10gb2JqZWN0MikgewotICAgICAgICBib29sZWFuIGlzRXF1YWwgPSBmYWxzZTsKLSAgICAgICAgaWYgKChvYmplY3QxICE9IG51bGwpICYmIChvYmplY3QyICE9IG51bGwpKSB7Ci0gICAgICAgICAgICBpZiAob2JqZWN0MS5sZW5ndGggPT0gb2JqZWN0Mi5sZW5ndGgpIHsKLSAgICAgICAgICAgICAgICBpc0VxdWFsID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG9iamVjdDEubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0VxdWFsKG9iamVjdDFbaV0sIG9iamVjdDJbaV0pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpc0VxdWFsID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmICgob2JqZWN0MSA9PSBudWxsKSAmJiAob2JqZWN0MiA9PSBudWxsKSkgewotICAgICAgICAgICAgaXNFcXVhbCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlzRXF1YWw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzRXF1YWwoU3RyaW5nW10gb2JqZWN0MSwgU3RyaW5nW10gb2JqZWN0MikgewotICAgICAgICBib29sZWFuIGlzRXF1YWwgPSBmYWxzZTsKLSAgICAgICAgaWYgKChvYmplY3QxICE9IG51bGwpICYmIChvYmplY3QyICE9IG51bGwpKSB7Ci0gICAgICAgICAgICBpZiAob2JqZWN0MS5sZW5ndGggPT0gb2JqZWN0Mi5sZW5ndGgpIHsKLSAgICAgICAgICAgICAgICBpc0VxdWFsID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG9iamVjdDEubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0VxdWFsKG9iamVjdDFbaV0sIG9iamVjdDJbaV0pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpc0VxdWFsID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmICgob2JqZWN0MSA9PSBudWxsKSAmJiAob2JqZWN0MiA9PSBudWxsKSkgewotICAgICAgICAgICAgaXNFcXVhbCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlzRXF1YWw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzRXF1YWwoU3RyaW5nIG9iamVjdDEsIFN0cmluZyBvYmplY3QyKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNFcXVhbCA9IGZhbHNlOwotICAgICAgICBpZiAoKG9iamVjdDEgIT0gbnVsbCkgJiYgKG9iamVjdDIgIT0gbnVsbCkpIHsKLSAgICAgICAgICAgIGlzRXF1YWwgPSBvYmplY3QxLmVxdWFscyhvYmplY3QyKTsKLSAgICAgICAgfSBlbHNlIGlmICgob2JqZWN0MSA9PSBudWxsKSAmJiAob2JqZWN0MiA9PSBudWxsKSkgewotICAgICAgICAgICAgaXNFcXVhbCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlzRXF1YWw7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3BvcHVsYXRlL1V0aWwuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWVlZmZjLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEucG9wdWxhdGU7DQotDQotcHVibGljIGNsYXNzIFV0aWwgew0KLSAgICBwdWJsaWMgc3RhdGljIENsYXNzIGdldEZhY3RvcnkoQ2xhc3MgY2xhenopICB7DQotICAgICAgICBDbGFzc1tdIGRlY2xhcmVkQ2xhc3NlID0gY2xhenouZ2V0RGVjbGFyZWRDbGFzc2VzKCk7DQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlY2xhcmVkQ2xhc3NlLmxlbmd0aDsgaSsrKSB7DQotICAgICAgICAgICAgQ2xhc3MgYUNsYXNzID0gZGVjbGFyZWRDbGFzc2VbaV07DQotICAgICAgICAgICAgaWYoYUNsYXNzICE9IG51bGwgJiYgYUNsYXNzLmdldE5hbWUoKS5lbmRzV2l0aCgiRmFjdG9yeSIpKXsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGFDbGFzczsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRmFjdG9yeSBpbm5lciBjbGFzcyBub3QgZm91bmQiKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3BvcHVsYXRlL2Rlcml2ZWQvQWJzdHJhY3REZXJpdmVkUG9wdWxhdGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3BvcHVsYXRlL2Rlcml2ZWQvQWJzdHJhY3REZXJpdmVkUG9wdWxhdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhNjIxMDEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9wb3B1bGF0ZS9kZXJpdmVkL0Fic3RyYWN0RGVyaXZlZFBvcHVsYXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEucG9wdWxhdGUuZGVyaXZlZDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS51dGlsLlN0QVhVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5wb3B1bGF0ZS5VdGlsOwotaW1wb3J0IG9yZy5jdXN0b21tb25rZXkueG1sdW5pdC5YTUxUZXN0Q2FzZTsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MT3V0cHV0RmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZhLmJlYW5zLkJlYW5JbmZvOwotaW1wb3J0IGphdmEuYmVhbnMuSW50cm9zcGVjdG9yOwotaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3REZXJpdmVkUG9wdWxhdGVyIGV4dGVuZHMgWE1MVGVzdENhc2UgewotCi0gICAgLy8gZm9yY2Ugb3RoZXJzIHRvIGltcGxlbWVudCB0aGlzIG1ldGhvZAotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHRlc3RQb3B1bGF0ZSgpIHRocm93cyBFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBTaW1wbGUgcmV1c2FibGUgbWV0aG9kIHRvIG1ha2Ugb2JqZWN0IGluc3RhbmNlcyB2aWEgcmVmbGVjdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCBPYmplY3QgcHJvY2VzcyhTdHJpbmcgdGVzdFN0cmluZyxTdHJpbmcgY2xhc3NOYW1lKSB0aHJvd3MgRXhjZXB0aW9uewotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0odGVzdFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgIENsYXNzIGNsYXp6ID0gQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUpOwotICAgICAgICBDbGFzcyBpbm5lckNsYXp6ID0gVXRpbC5nZXRGYWN0b3J5KGNsYXp6KTsKLSAgICAgICAgTWV0aG9kIHBhcnNlTWV0aG9kID0gaW5uZXJDbGF6ei5nZXRNZXRob2QoInBhcnNlIixuZXcgQ2xhc3NbXXtYTUxTdHJlYW1SZWFkZXIuY2xhc3N9KTsKLSAgICAgICAgT2JqZWN0IG9iaiA9IHBhcnNlTWV0aG9kLmludm9rZShudWxsLG5ldyBPYmplY3RbXXtyZWFkZXJ9KTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChvYmopOwotCi0gICAgICAgIHJldHVybiBvYmo7Ci0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgIFN0cmluZyBjbGFzc05hbWU9IG51bGw7Ci0gICAgcHJvdGVjdGVkIENsYXNzIHByb3BlcnR5Q2xhc3MgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogY2hlY2sgdmFsdWUgZnVuY3Rpb24gLSBtYXkgYmUgb3ZlcnJpZGRlbgotICAgICAqIEBwYXJhbSB4bWxUb1NldAotICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgY2hlY2tWYWx1ZShTdHJpbmcgeG1sVG9TZXQsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE9iamVjdCBvID0gcHJvY2Vzcyh4bWxUb1NldCwgY2xhc3NOYW1lKTsKLSAgICAgICAgQ2xhc3MgYmVhbkNsYXNzID0gQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUpOwotCi0gICAgICAgIEJlYW5JbmZvIGluZm8gPSBJbnRyb3NwZWN0b3IuZ2V0QmVhbkluZm8oYmVhbkNsYXNzKTsKLSAgICAgICAgUHJvcGVydHlEZXNjcmlwdG9yW10gcHJvcERlc2NzID0gaW5mby5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvcERlc2NzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBQcm9wZXJ0eURlc2NyaXB0b3IgcHJvcERlc2MgPSBwcm9wRGVzY3NbaV07Ci0KLSAgICAgICAgICAgIGlmICAocHJvcERlc2MuZ2V0UHJvcGVydHlUeXBlKCkuZXF1YWxzKHByb3BlcnR5Q2xhc3MpKXsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcyA9IGNvbnZlcnRUb1N0cmluZyhwcm9wRGVzYy5nZXRSZWFkTWV0aG9kKCkuaW52b2tlKG8sCi0gICAgICAgICAgICAgICAgICAgICAgICAoT2JqZWN0W10pIG51bGwpKTsKLSAgICAgICAgICAgICAgICBjb21wYXJlKHZhbHVlLHMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLQotICAgICAgICBDb21wYXJlT01FbGVtbnRTZXJpYWxpemF0aW9ucyhvLCB4bWxUb1NldCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29tcGFyZXMgc2VyaWFsaXphdGlvbnMgLSBtYXkgYmUgb3ZlcnJpZGRlbgotICAgICAqIEBwYXJhbSBvCi0gICAgICogQHBhcmFtIHhtbFRvU2V0Ci0gICAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBDb21wYXJlT01FbGVtbnRTZXJpYWxpemF0aW9ucyhPYmplY3QgbywgU3RyaW5nIHhtbFRvU2V0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgT01FbGVtZW50IGVsZW1lbnQgPSBnZXRPTUVsZW1lbnQobyk7Ci0gICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICBYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyID0gWE1MT3V0cHV0RmFjdG9yeS5uZXdJbnN0YW5jZSgpLmNyZWF0ZVhNTFN0cmVhbVdyaXRlcihiYW9zKTsKLSAgICAgICAgZWxlbWVudC5zZXJpYWxpemUod3JpdGVyKTsKLSAgICAgICAgd3JpdGVyLmZsdXNoKCk7Ci0KLSAgICAgICAgYXNzZXJ0WE1MRXF1YWwoYmFvcy50b1N0cmluZygpLHhtbFRvU2V0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgT00gZWxlbWVudCB2aWEgcmVmbGVjdGlvbgotICAgICAqIEBwYXJhbSBiZWFuCi0gICAgICogQHJldHVybgotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIE9NRWxlbWVudCBnZXRPTUVsZW1lbnQoT2JqZWN0IGJlYW4pIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBNZXRob2QgbWV0aG9kID0gYmVhbi5nZXRDbGFzcygpLmdldE1ldGhvZCgiZ2V0T01FbGVtZW50IiwgbmV3IENsYXNzW117Ci0gICAgICAgICAgICAgICAgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZS5jbGFzcywKLSAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeS5jbGFzc30pOwotCi0gICAgICAgIHJldHVybiAoT01FbGVtZW50KSBtZXRob2QuaW52b2tlKGJlYW4sIG5ldyBPYmplY3RbXXtudWxsLCBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKX0pOwotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogY29tYXBhcmUgbWV0aG9kIC0gbWF5IGJlIG92ZXJyaWRkZW4KLSAgICAgKiBAcGFyYW0gdmFsMQotICAgICAqIEBwYXJhbSB2YWwyCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgY29tcGFyZShTdHJpbmcgdmFsMSxTdHJpbmcgdmFsMil7Ci0gICAgICAgIGFzc2VydEVxdWFscyh2YWwxLHZhbDIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqCi0gICAgICogQHBhcmFtIG8KLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoT2JqZWN0IG8pewotICAgICAgICByZXR1cm4gby50b1N0cmluZygpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvZGVyaXZlZC9EZXJpdmVkVHlwZUJ5dGVQb3B1bGF0ZVRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvZGVyaXZlZC9EZXJpdmVkVHlwZUJ5dGVQb3B1bGF0ZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODkxZTNiNi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3BvcHVsYXRlL2Rlcml2ZWQvRGVyaXZlZFR5cGVCeXRlUG9wdWxhdGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLnBvcHVsYXRlLmRlcml2ZWQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWw7Ci0KLXB1YmxpYyBjbGFzcyBEZXJpdmVkVHlwZUJ5dGVQb3B1bGF0ZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdERlcml2ZWRQb3B1bGF0ZXJ7Ci0KLSAgICAgcHJpdmF0ZSBTdHJpbmcgdmFsdWVzW109IHsKLSAgICAgICAgICAgICIxIiwKLSAgICAgICAgICAgICIwIiwKLSAgICAgICAgICAgICIyIgotICAgIH07Ci0gICAgcHJpdmF0ZSBTdHJpbmcgeG1sU3RyaW5nW10gPSB7Ci0gICAgICAgICAgICAiPERlcml2ZWRCeXRlIHhtbG5zPVwiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2RcIj4iK3ZhbHVlc1swXSsiPC9EZXJpdmVkQnl0ZT4iLAotICAgICAgICAgICAgIjxEZXJpdmVkQnl0ZSB4bWxucz1cImh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkXCI+Iit2YWx1ZXNbMV0rIjwvRGVyaXZlZEJ5dGU+IiwKLSAgICAgICAgICAgICI8RGVyaXZlZEJ5dGUgeG1sbnM9XCJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZFwiPiIrdmFsdWVzWzJdKyI8L0Rlcml2ZWRCeXRlPiIKLSAgICB9OwotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgY2xhc3NOYW1lID0gIm9yZy5zb2FwaW50ZXJvcC54c2QuRGVyaXZlZEJ5dGUiOwotICAgICAgICBwcm9wZXJ0eUNsYXNzID0gYnl0ZS5jbGFzczsKLSAgICB9Ci0KLSAgICAvLyBmb3JjZSBvdGhlcnMgdG8gaW1wbGVtZW50IHRoaXMgbWV0aG9kCi0gICAgcHVibGljIHZvaWQgdGVzdFBvcHVsYXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBjaGVja1ZhbHVlKHhtbFN0cmluZ1tpXSx2YWx1ZXNbaV0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoT2JqZWN0IG8pIHsKLSAgICAgICAgcmV0dXJuIENvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKChCeXRlKW8pOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvZGVyaXZlZC9EZXJpdmVkVHlwZUludFBvcHVsYXRlVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9wb3B1bGF0ZS9kZXJpdmVkL0Rlcml2ZWRUeXBlSW50UG9wdWxhdGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhM2YxYWEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9wb3B1bGF0ZS9kZXJpdmVkL0Rlcml2ZWRUeXBlSW50UG9wdWxhdGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLnBvcHVsYXRlLmRlcml2ZWQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWw7Ci0KLXB1YmxpYyBjbGFzcyBEZXJpdmVkVHlwZUludFBvcHVsYXRlVGVzdCBleHRlbmRzIEFic3RyYWN0RGVyaXZlZFBvcHVsYXRlcnsKLSAgICBwcml2YXRlIFN0cmluZyB2YWx1ZXNbXT0gewotICAgICAgICAgICAgIjEyMjIyMiIsCi0gICAgICAgICAgICAiMCIsCi0gICAgICAgICAgICAiLTIzNDQ1NTYiCi0gICAgfTsKLQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgeG1sU3RyaW5nW10gPSB7Ci0gICAgICAgICAgICAiPERlcml2ZWRJbnQgeG1sbnM9XCJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZFwiPiIrdmFsdWVzWzBdKyI8L0Rlcml2ZWRJbnQ+IiwKLSAgICAgICAgICAgICI8RGVyaXZlZEludCB4bWxucz1cImh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkXCI+Iit2YWx1ZXNbMV0rIjwvRGVyaXZlZEludD4iLAotICAgICAgICAgICAgIjxEZXJpdmVkSW50IHhtbG5zPVwiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2RcIj4iK3ZhbHVlc1syXSsiPC9EZXJpdmVkSW50PiIKLSAgICB9OwotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgY2xhc3NOYW1lID0gIm9yZy5zb2FwaW50ZXJvcC54c2QuRGVyaXZlZEludCI7Ci0gICAgICAgIHByb3BlcnR5Q2xhc3MgPSBpbnQuY2xhc3M7Ci0gICAgfQotCi0gICAgLy8gZm9yY2Ugb3RoZXJzIHRvIGltcGxlbWVudCB0aGlzIG1ldGhvZAotICAgIHB1YmxpYyB2b2lkIHRlc3RQb3B1bGF0ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI7IGkrKykgewotICAgICAgICAgICAgY2hlY2tWYWx1ZSh4bWxTdHJpbmdbaV0sdmFsdWVzW2ldKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgY29udmVydFRvU3RyaW5nKE9iamVjdCBvKSB7Ci0gICAgICAgIHJldHVybiBDb252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZygoSW50ZWdlcilvKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3BvcHVsYXRlL2Rlcml2ZWQvRGVyaXZlZFR5cGVJbnRlZ2VyUG9wdWxhdGVUZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3BvcHVsYXRlL2Rlcml2ZWQvRGVyaXZlZFR5cGVJbnRlZ2VyUG9wdWxhdGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhZjAxMmQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9wb3B1bGF0ZS9kZXJpdmVkL0Rlcml2ZWRUeXBlSW50ZWdlclBvcHVsYXRlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5wb3B1bGF0ZS5kZXJpdmVkOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLXB1YmxpYyBjbGFzcyBEZXJpdmVkVHlwZUludGVnZXJQb3B1bGF0ZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdERlcml2ZWRQb3B1bGF0ZXJ7Ci0KLSAgICAgcHJpdmF0ZSBTdHJpbmcgdmFsdWVzW109IHsKLSAgICAgICAgICAgICIxMjIyMjIiLAotICAgICAgICAgICAgIjAiLAotICAgICAgICAgICAgIi0yMzQ0NTU2IgotICAgIH07Ci0gICAgcHJpdmF0ZSBTdHJpbmcgeG1sU3RyaW5nW10gPSB7Ci0gICAgICAgICAgICAiPERlcml2ZWRJbnRlZ2VyIHhtbG5zPVwiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2RcIj4iK3ZhbHVlc1swXSsiPC9EZXJpdmVkSW50ZWdlcj4iLAotICAgICAgICAgICAgIjxEZXJpdmVkSW50ZWdlciB4bWxucz1cImh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkXCI+Iit2YWx1ZXNbMV0rIjwvRGVyaXZlZEludGVnZXI+IiwKLSAgICAgICAgICAgICI8RGVyaXZlZEludGVnZXIgeG1sbnM9XCJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZFwiPiIrdmFsdWVzWzJdKyI8L0Rlcml2ZWRJbnRlZ2VyPiIKLSAgICB9OwotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgY2xhc3NOYW1lID0gIm9yZy5zb2FwaW50ZXJvcC54c2QuRGVyaXZlZEludGVnZXIiOwotICAgICAgICBwcm9wZXJ0eUNsYXNzID0gQmlnSW50ZWdlci5jbGFzczsKLSAgICB9Ci0KLSAgICAvLyBmb3JjZSBvdGhlcnMgdG8gaW1wbGVtZW50IHRoaXMgbWV0aG9kCi0gICAgcHVibGljIHZvaWQgdGVzdFBvcHVsYXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBjaGVja1ZhbHVlKHhtbFN0cmluZ1tpXSx2YWx1ZXNbaV0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoT2JqZWN0IG8pIHsKLSAgICAgICAgcmV0dXJuIENvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKChCaWdJbnRlZ2VyKW8pOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvZGVyaXZlZC9EZXJpdmVkVHlwZUxvbmdQb3B1bGF0ZVRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvZGVyaXZlZC9EZXJpdmVkVHlwZUxvbmdQb3B1bGF0ZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQ0ZTUzNi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3BvcHVsYXRlL2Rlcml2ZWQvRGVyaXZlZFR5cGVMb25nUG9wdWxhdGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLnBvcHVsYXRlLmRlcml2ZWQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWw7Ci0KLXB1YmxpYyBjbGFzcyBEZXJpdmVkVHlwZUxvbmdQb3B1bGF0ZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdERlcml2ZWRQb3B1bGF0ZXJ7Ci0KLSAgICBwcml2YXRlIFN0cmluZyB2YWx1ZXNbXT0gewotICAgICAgICAgICAgIjE3NTc4MjgzMjgyIiwKLSAgICAgICAgICAgICItMTIyODI4NDQ0MyIsCi0gICAgICAgICAgICAiMiIsCi0gICAgICAgICAgICBMb25nLk1BWF9WQUxVRSArICIiLAotICAgICAgICAgICAgTG9uZy5NSU5fVkFMVUUgKyAiIgotICAgIH07Ci0KLSAgICBwcml2YXRlIFN0cmluZyB4bWxTdHJpbmdbXSA9IHsKLSAgICAgICAgICAgICI8RGVyaXZlZExvbmcgeG1sbnM9XCJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZFwiPiIrdmFsdWVzWzBdKyI8L0Rlcml2ZWRMb25nPiIsCi0gICAgICAgICAgICAiPERlcml2ZWRMb25nIHhtbG5zPVwiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2RcIj4iK3ZhbHVlc1sxXSsiPC9EZXJpdmVkTG9uZz4iLAotICAgICAgICAgICAgIjxEZXJpdmVkTG9uZyB4bWxucz1cImh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkXCI+Iit2YWx1ZXNbMl0rIjwvRGVyaXZlZExvbmc+IiwKLSAgICAgICAgICAgICI8RGVyaXZlZExvbmcgeG1sbnM9XCJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZFwiPiIrdmFsdWVzWzNdKyI8L0Rlcml2ZWRMb25nPiIsCi0gICAgICAgICAgICAiPERlcml2ZWRMb25nIHhtbG5zPVwiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2RcIj4iK3ZhbHVlc1s0XSsiPC9EZXJpdmVkTG9uZz4iCi0gICAgfTsKLQotCi0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGNsYXNzTmFtZSA9ICJvcmcuc29hcGludGVyb3AueHNkLkRlcml2ZWRMb25nIjsKLSAgICAgICAgcHJvcGVydHlDbGFzcyA9IGxvbmcuY2xhc3M7Ci0gICAgfQotCi0gICAgLy8gZm9yY2Ugb3RoZXJzIHRvIGltcGxlbWVudCB0aGlzIG1ldGhvZAotICAgIHB1YmxpYyB2b2lkIHRlc3RQb3B1bGF0ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI7IGkrKykgewotICAgICAgICAgICAgY2hlY2tWYWx1ZSh4bWxTdHJpbmdbaV0sdmFsdWVzW2ldKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgY29udmVydFRvU3RyaW5nKE9iamVjdCBvKSB7Ci0gICAgICAgIHJldHVybiBDb252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZygoTG9uZylvKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3BvcHVsYXRlL2Rlcml2ZWQvRGVyaXZlZFR5cGVOZWdhdGl2ZUludGVnZXJQb3B1bGF0ZVRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvZGVyaXZlZC9EZXJpdmVkVHlwZU5lZ2F0aXZlSW50ZWdlclBvcHVsYXRlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjE1NmMwLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvZGVyaXZlZC9EZXJpdmVkVHlwZU5lZ2F0aXZlSW50ZWdlclBvcHVsYXRlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5wb3B1bGF0ZS5kZXJpdmVkOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5OZWdhdGl2ZUludGVnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsOwotCi1wdWJsaWMgY2xhc3MgRGVyaXZlZFR5cGVOZWdhdGl2ZUludGVnZXJQb3B1bGF0ZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdERlcml2ZWRQb3B1bGF0ZXJ7Ci0gICAgCi0gICAgIHByaXZhdGUgU3RyaW5nIHZhbHVlc1tdPSB7Ci0gICAgICAgICAgICAiLTE4NDQzIiwKLSAgICAgICAgICAgICItMSIsCi0gICAgICAgICAgICAiLTI2MzMiLAotICAgICAgICAgICAgIjI2NzU4MjIzMyIsCi0gICAgICAgICAgICAiMCIsCi0gICAgfTsKLSAgICBwcml2YXRlIFN0cmluZyB4bWxTdHJpbmdbXSA9IHsKLSAgICAgICAgICAgICI8RGVyaXZlZE5lZ2F0aXZlSW50ZWdlciB4bWxucz1cImh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkXCI+Iit2YWx1ZXNbMF0rIjwvRGVyaXZlZE5lZ2F0aXZlSW50ZWdlcj4iLAotICAgICAgICAgICAgIjxEZXJpdmVkTmVnYXRpdmVJbnRlZ2VyIHhtbG5zPVwiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2RcIj4iK3ZhbHVlc1sxXSsiPC9EZXJpdmVkTmVnYXRpdmVJbnRlZ2VyPiIsCi0gICAgICAgICAgICAiPERlcml2ZWROZWdhdGl2ZUludGVnZXIgeG1sbnM9XCJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZFwiPiIrdmFsdWVzWzJdKyI8L0Rlcml2ZWROZWdhdGl2ZUludGVnZXI+IiwKLSAgICAgICAgICAgICI8RGVyaXZlZE5lZ2F0aXZlSW50ZWdlciB4bWxucz1cImh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkXCI+Iit2YWx1ZXNbM10rIjwvRGVyaXZlZE5lZ2F0aXZlSW50ZWdlcj4iLAotICAgICAgICAgICAgIjxEZXJpdmVkTmVnYXRpdmVJbnRlZ2VyIHhtbG5zPVwiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2RcIj4iK3ZhbHVlc1s0XSsiPC9EZXJpdmVkTmVnYXRpdmVJbnRlZ2VyPiIKLSAgICB9OwotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgY2xhc3NOYW1lID0gIm9yZy5zb2FwaW50ZXJvcC54c2QuRGVyaXZlZE5lZ2F0aXZlSW50ZWdlciI7Ci0gICAgICAgIHByb3BlcnR5Q2xhc3MgPSBOZWdhdGl2ZUludGVnZXIuY2xhc3M7Ci0gICAgfQotCi0gICAgLy8gZm9yY2Ugb3RoZXJzIHRvIGltcGxlbWVudCB0aGlzIG1ldGhvZAotICAgIHB1YmxpYyB2b2lkIHRlc3RQb3B1bGF0ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgewotICAgICAgICAgICAgY2hlY2tWYWx1ZSh4bWxTdHJpbmdbaV0sdmFsdWVzW2ldKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoaW50IGkgPSAzOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGNoZWNrVmFsdWUoeG1sU3RyaW5nW2ldLHZhbHVlc1tpXSk7Ci0gICAgICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhPYmplY3QgbykgewotICAgICAgICByZXR1cm4gQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcoKE5lZ2F0aXZlSW50ZWdlcilvKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3BvcHVsYXRlL2Rlcml2ZWQvRGVyaXZlZFR5cGVOb25OZWdhdGl2ZUludGVnZXJQb3B1bGF0ZVRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvZGVyaXZlZC9EZXJpdmVkVHlwZU5vbk5lZ2F0aXZlSW50ZWdlclBvcHVsYXRlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmNmMWM5Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvZGVyaXZlZC9EZXJpdmVkVHlwZU5vbk5lZ2F0aXZlSW50ZWdlclBvcHVsYXRlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5wb3B1bGF0ZS5kZXJpdmVkOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5Ob25OZWdhdGl2ZUludGVnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsOwotCi1wdWJsaWMgY2xhc3MgRGVyaXZlZFR5cGVOb25OZWdhdGl2ZUludGVnZXJQb3B1bGF0ZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdERlcml2ZWRQb3B1bGF0ZXJ7Ci0KLSAgICBwcml2YXRlIFN0cmluZyB2YWx1ZXNbXT0gewotICAgICAgICAgICAgIjE4NDQ0IiwKLSAgICAgICAgICAgICIxIiwKLSAgICAgICAgICAgICIwIiAsCi0gICAgICAgICAgICAiLTEiICwKLSAgICAgICAgICAgICItMzQ1MzQzNCIKLQotICAgIH07Ci0KLSAgICBwcml2YXRlIFN0cmluZyB4bWxTdHJpbmdbXSA9IHsKLSAgICAgICAgICAgICI8RGVyaXZlZE5vbk5lZ2F0aXZlSW50ZWdlciB4bWxucz1cImh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkXCI+Iit2YWx1ZXNbMF0rIjwvRGVyaXZlZE5vbk5lZ2F0aXZlSW50ZWdlcj4iLAotICAgICAgICAgICAgIjxEZXJpdmVkTm9uTmVnYXRpdmVJbnRlZ2VyIHhtbG5zPVwiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2RcIj4iK3ZhbHVlc1sxXSsiPC9EZXJpdmVkTm9uTmVnYXRpdmVJbnRlZ2VyPiIsCi0gICAgICAgICAgICAiPERlcml2ZWROb25OZWdhdGl2ZUludGVnZXIgeG1sbnM9XCJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZFwiPiIrdmFsdWVzWzJdKyI8L0Rlcml2ZWROb25OZWdhdGl2ZUludGVnZXI+IiwKLSAgICAgICAgICAgICI8RGVyaXZlZE5vbk5lZ2F0aXZlSW50ZWdlciB4bWxucz1cImh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkXCI+Iit2YWx1ZXNbM10rIjwvRGVyaXZlZE5vbk5lZ2F0aXZlSW50ZWdlcj4iLAotICAgICAgICAgICAgIjxEZXJpdmVkTm9uTmVnYXRpdmVJbnRlZ2VyIHhtbG5zPVwiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2RcIj4iK3ZhbHVlc1s0XSsiPC9EZXJpdmVkTm9uTmVnYXRpdmVJbnRlZ2VyPiIKLSAgICB9OwotCi0KLQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgY2xhc3NOYW1lID0gIm9yZy5zb2FwaW50ZXJvcC54c2QuRGVyaXZlZE5vbk5lZ2F0aXZlSW50ZWdlciI7Ci0gICAgICAgIHByb3BlcnR5Q2xhc3MgPSBOb25OZWdhdGl2ZUludGVnZXIuY2xhc3M7Ci0gICAgfQotCi0gICAgLy8gZm9yY2Ugb3RoZXJzIHRvIGltcGxlbWVudCB0aGlzIG1ldGhvZAotICAgIHB1YmxpYyB2b2lkIHRlc3RQb3B1bGF0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKSB7Ci0gICAgICAgICAgICBjaGVja1ZhbHVlKHhtbFN0cmluZ1tpXSx2YWx1ZXNbaV0pOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGkgPSAzOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGNoZWNrVmFsdWUoeG1sU3RyaW5nW2ldLHZhbHVlc1tpXSk7Ci0gICAgICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoT2JqZWN0IG8pIHsKLSAgICAgICAgcmV0dXJuIENvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKChOb25OZWdhdGl2ZUludGVnZXIpbyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9wb3B1bGF0ZS9kZXJpdmVkL0Rlcml2ZWRUeXBlTm9uUG9zaXRpdmVJbnRlZ2VyUG9wdWxhdGVUZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3BvcHVsYXRlL2Rlcml2ZWQvRGVyaXZlZFR5cGVOb25Qb3NpdGl2ZUludGVnZXJQb3B1bGF0ZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY2MDdjOS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3BvcHVsYXRlL2Rlcml2ZWQvRGVyaXZlZFR5cGVOb25Qb3NpdGl2ZUludGVnZXJQb3B1bGF0ZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEucG9wdWxhdGUuZGVyaXZlZDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuTm9uUG9zaXRpdmVJbnRlZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbDsKLQotcHVibGljIGNsYXNzIERlcml2ZWRUeXBlTm9uUG9zaXRpdmVJbnRlZ2VyUG9wdWxhdGVUZXN0IGV4dGVuZHMgQWJzdHJhY3REZXJpdmVkUG9wdWxhdGVyewotCi0gICAgcHJpdmF0ZSBTdHJpbmcgdmFsdWVzW109IHsKLSAgICAgICAgICAgICItMTg0NDQiLAotICAgICAgICAgICAgIi0xIiwKLSAgICAgICAgICAgICIwIiAsCi0gICAgICAgICAgICAiMSIgLAotICAgICAgICAgICAgIjM0NTM0MzQiCi0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgeG1sU3RyaW5nW10gPSB7Ci0gICAgICAgICAgICAiPERlcml2ZWROb25Qb3NpdGl2ZUludGVnZXIgeG1sbnM9XCJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZFwiPiIrdmFsdWVzWzBdKyI8L0Rlcml2ZWROb25Qb3NpdGl2ZUludGVnZXI+IiwKLSAgICAgICAgICAgICI8RGVyaXZlZE5vblBvc2l0aXZlSW50ZWdlciB4bWxucz1cImh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkXCI+Iit2YWx1ZXNbMV0rIjwvRGVyaXZlZE5vblBvc2l0aXZlSW50ZWdlcj4iLAotICAgICAgICAgICAgIjxEZXJpdmVkTm9uUG9zaXRpdmVJbnRlZ2VyIHhtbG5zPVwiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2RcIj4iK3ZhbHVlc1syXSsiPC9EZXJpdmVkTm9uUG9zaXRpdmVJbnRlZ2VyPiIsCi0gICAgICAgICAgICAiPERlcml2ZWROb25Qb3NpdGl2ZUludGVnZXIgeG1sbnM9XCJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZFwiPiIrdmFsdWVzWzNdKyI8L0Rlcml2ZWROb25Qb3NpdGl2ZUludGVnZXI+IiwKLSAgICAgICAgICAgICI8RGVyaXZlZE5vblBvc2l0aXZlSW50ZWdlciB4bWxucz1cImh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkXCI+Iit2YWx1ZXNbNF0rIjwvRGVyaXZlZE5vblBvc2l0aXZlSW50ZWdlcj4iCi0gICAgfTsKLQotCi0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGNsYXNzTmFtZSA9ICJvcmcuc29hcGludGVyb3AueHNkLkRlcml2ZWROb25Qb3NpdGl2ZUludGVnZXIiOwotICAgICAgICBwcm9wZXJ0eUNsYXNzID0gbG9uZy5jbGFzczsKLSAgICB9Ci0KLSAgICAvLyBmb3JjZSBvdGhlcnMgdG8gaW1wbGVtZW50IHRoaXMgbWV0aG9kCi0gICAgcHVibGljIHZvaWQgdGVzdFBvcHVsYXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKLSAgICAgICAgICAgIGNoZWNrVmFsdWUoeG1sU3RyaW5nW2ldLHZhbHVlc1tpXSk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgaSA9IDM7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgY2hlY2tWYWx1ZSh4bWxTdHJpbmdbaV0sdmFsdWVzW2ldKTsKLSAgICAgICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhPYmplY3QgbykgewotICAgICAgICByZXR1cm4gQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcoKE5vblBvc2l0aXZlSW50ZWdlcilvKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3BvcHVsYXRlL2Rlcml2ZWQvRGVyaXZlZFR5cGVQb3NpdHZlSW50ZWdlclBvcHVsYXRlVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9wb3B1bGF0ZS9kZXJpdmVkL0Rlcml2ZWRUeXBlUG9zaXR2ZUludGVnZXJQb3B1bGF0ZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGIyNmFjNS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3BvcHVsYXRlL2Rlcml2ZWQvRGVyaXZlZFR5cGVQb3NpdHZlSW50ZWdlclBvcHVsYXRlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5wb3B1bGF0ZS5kZXJpdmVkOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5Qb3NpdGl2ZUludGVnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsOwotCi1wdWJsaWMgY2xhc3MgRGVyaXZlZFR5cGVQb3NpdHZlSW50ZWdlclBvcHVsYXRlVGVzdCBleHRlbmRzIEFic3RyYWN0RGVyaXZlZFBvcHVsYXRlcnsKLQotICAgICBwcml2YXRlIFN0cmluZyB2YWx1ZXNbXT0gewotICAgICAgICAgICAgIjE4NDQ0IiwKLSAgICAgICAgICAgICIxIiwKLSAgICAgICAgICAgICI1NjM2MzMyIiAsCi0gICAgICAgICAgICAiMCIgLAotICAgICAgICAgICAgIi0zNDUzNDM0IgotCi0gICAgfTsKLQotICAgIHByaXZhdGUgU3RyaW5nIHhtbFN0cmluZ1tdID0gewotICAgICAgICAgICAgIjxEZXJpdmVkUG9zaXRpdmVJbnRlZ2VyIHhtbG5zPVwiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2RcIj4iK3ZhbHVlc1swXSsiPC9EZXJpdmVkUG9zaXRpdmVJbnRlZ2VyPiIsCi0gICAgICAgICAgICAiPERlcml2ZWRQb3NpdGl2ZUludGVnZXIgeG1sbnM9XCJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZFwiPiIrdmFsdWVzWzFdKyI8L0Rlcml2ZWRQb3NpdGl2ZUludGVnZXI+IiwKLSAgICAgICAgICAgICI8RGVyaXZlZFBvc2l0aXZlSW50ZWdlciB4bWxucz1cImh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkXCI+Iit2YWx1ZXNbMl0rIjwvRGVyaXZlZFBvc2l0aXZlSW50ZWdlcj4iLAotICAgICAgICAgICAgIjxEZXJpdmVkUG9zaXRpdmVJbnRlZ2VyIHhtbG5zPVwiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2RcIj4iK3ZhbHVlc1szXSsiPC9EZXJpdmVkUG9zaXRpdmVJbnRlZ2VyPiIsCi0gICAgICAgICAgICAiPERlcml2ZWRQb3NpdGl2ZUludGVnZXIgeG1sbnM9XCJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZFwiPiIrdmFsdWVzWzRdKyI8L0Rlcml2ZWRQb3NpdGl2ZUludGVnZXI+IgotICAgIH07Ci0KLQotCi0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBjbGFzc05hbWUgPSAib3JnLnNvYXBpbnRlcm9wLnhzZC5EZXJpdmVkUG9zaXRpdmVJbnRlZ2VyIjsKLSAgICAgICAgcHJvcGVydHlDbGFzcyA9IFBvc2l0aXZlSW50ZWdlci5jbGFzczsKLSAgICB9Ci0KLSAgICAvLyBmb3JjZSBvdGhlcnMgdG8gaW1wbGVtZW50IHRoaXMgbWV0aG9kCi0gICAgcHVibGljIHZvaWQgdGVzdFBvcHVsYXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKLSAgICAgICAgICAgIGNoZWNrVmFsdWUoeG1sU3RyaW5nW2ldLHZhbHVlc1tpXSk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgaSA9IDM7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgY2hlY2tWYWx1ZSh4bWxTdHJpbmdbaV0sdmFsdWVzW2ldKTsKLSAgICAgICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhPYmplY3QgbykgewotICAgICAgICByZXR1cm4gQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcoKFBvc2l0aXZlSW50ZWdlcilvKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3BvcHVsYXRlL2Rlcml2ZWQvRGVyaXZlZFR5cGVTaG9ydFBvcHVsYXRlVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9wb3B1bGF0ZS9kZXJpdmVkL0Rlcml2ZWRUeXBlU2hvcnRQb3B1bGF0ZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTgxMjhjZC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3BvcHVsYXRlL2Rlcml2ZWQvRGVyaXZlZFR5cGVTaG9ydFBvcHVsYXRlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5wb3B1bGF0ZS5kZXJpdmVkOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsOwotCi1wdWJsaWMgY2xhc3MgRGVyaXZlZFR5cGVTaG9ydFBvcHVsYXRlVGVzdCBleHRlbmRzIEFic3RyYWN0RGVyaXZlZFBvcHVsYXRlcnsKLSAgICAgICAgCi0gICAgcHJpdmF0ZSBTdHJpbmcgdmFsdWVzW109IHsKLSAgICAgICAgICAgICIxNzQ0NCIsCi0gICAgICAgICAgICAiLTEyMzQzIiwKLSAgICAgICAgICAgICIyIiAsCi0gICAgICAgICAgICAiMCIgLAotICAgICAgICAgICAgIi02IgotCi0gICAgfTsKLQotICAgIHByaXZhdGUgU3RyaW5nIHhtbFN0cmluZ1tdID0gewotICAgICAgICAgICAgIjxEZXJpdmVkU2hvcnQgeG1sbnM9XCJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZFwiPiIrdmFsdWVzWzBdKyI8L0Rlcml2ZWRTaG9ydD4iLAotICAgICAgICAgICAgIjxEZXJpdmVkU2hvcnQgeG1sbnM9XCJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZFwiPiIrdmFsdWVzWzFdKyI8L0Rlcml2ZWRTaG9ydD4iLAotICAgICAgICAgICAgIjxEZXJpdmVkU2hvcnQgeG1sbnM9XCJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZFwiPiIrdmFsdWVzWzJdKyI8L0Rlcml2ZWRTaG9ydD4iLAotICAgICAgICAgICAgIjxEZXJpdmVkU2hvcnQgeG1sbnM9XCJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZFwiPiIrdmFsdWVzWzNdKyI8L0Rlcml2ZWRTaG9ydD4iLAotICAgICAgICAgICAgIjxEZXJpdmVkU2hvcnQgeG1sbnM9XCJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZFwiPiIrdmFsdWVzWzRdKyI8L0Rlcml2ZWRTaG9ydD4iCi0gICAgfTsKLQotCi0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGNsYXNzTmFtZSA9ICJvcmcuc29hcGludGVyb3AueHNkLkRlcml2ZWRTaG9ydCI7Ci0gICAgICAgIHByb3BlcnR5Q2xhc3MgPSBTaG9ydC5jbGFzczsKLSAgICB9Ci0KLSAgICAvLyBmb3JjZSBvdGhlcnMgdG8gaW1wbGVtZW50IHRoaXMgbWV0aG9kCi0gICAgcHVibGljIHZvaWQgdGVzdFBvcHVsYXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGNoZWNrVmFsdWUoeG1sU3RyaW5nW2ldLHZhbHVlc1tpXSk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgY29udmVydFRvU3RyaW5nKE9iamVjdCBvKSB7Ci0gICAgICAgIHJldHVybiBDb252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZygoU2hvcnQpbyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9wb3B1bGF0ZS9kZXJpdmVkL0Rlcml2ZWRUeXBlVW5zaWduZWRCeXRlUG9wdWxhdGVUZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3BvcHVsYXRlL2Rlcml2ZWQvRGVyaXZlZFR5cGVVbnNpZ25lZEJ5dGVQb3B1bGF0ZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk5YmVlYi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3BvcHVsYXRlL2Rlcml2ZWQvRGVyaXZlZFR5cGVVbnNpZ25lZEJ5dGVQb3B1bGF0ZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEucG9wdWxhdGUuZGVyaXZlZDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuVW5zaWduZWRCeXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbDsKLQotcHVibGljIGNsYXNzIERlcml2ZWRUeXBlVW5zaWduZWRCeXRlUG9wdWxhdGVUZXN0IGV4dGVuZHMgQWJzdHJhY3REZXJpdmVkUG9wdWxhdGVyewotICAgIAotICAgICBwcml2YXRlIFN0cmluZyB2YWx1ZXNbXT0gewotICAgICAgICAgICAgIjEiLAotICAgICAgICAgICAgIjAiLAotICAgICAgICAgICAgIjIiICwKLSAgICAgICAgICAgICItMSIgLAotICAgICAgICAgICAgIi02IgotCi0gICAgfTsKLQotICAgIHByaXZhdGUgU3RyaW5nIHhtbFN0cmluZ1tdID0gewotICAgICAgICAgICAgIjxEZXJpdmVkVW5zaWduZWRCeXRlIHhtbG5zPVwiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2RcIj4iK3ZhbHVlc1swXSsiPC9EZXJpdmVkVW5zaWduZWRCeXRlPiIsCi0gICAgICAgICAgICAiPERlcml2ZWRVbnNpZ25lZEJ5dGUgeG1sbnM9XCJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZFwiPiIrdmFsdWVzWzFdKyI8L0Rlcml2ZWRVbnNpZ25lZEJ5dGU+IiwKLSAgICAgICAgICAgICI8RGVyaXZlZFVuc2lnbmVkQnl0ZSB4bWxucz1cImh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkXCI+Iit2YWx1ZXNbMl0rIjwvRGVyaXZlZFVuc2lnbmVkQnl0ZT4iLAotICAgICAgICAgICAgIjxEZXJpdmVkVW5zaWduZWRCeXRlIHhtbG5zPVwiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2RcIj4iK3ZhbHVlc1szXSsiPC9EZXJpdmVkVW5zaWduZWRCeXRlPiIsCi0gICAgICAgICAgICAiPERlcml2ZWRVbnNpZ25lZEJ5dGUgeG1sbnM9XCJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZFwiPiIrdmFsdWVzWzRdKyI8L0Rlcml2ZWRVbnNpZ25lZEJ5dGU+IgotICAgIH07Ci0KLQotCi0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBjbGFzc05hbWUgPSAib3JnLnNvYXBpbnRlcm9wLnhzZC5EZXJpdmVkVW5zaWduZWRCeXRlIjsKLSAgICAgICAgcHJvcGVydHlDbGFzcyA9IFVuc2lnbmVkQnl0ZS5jbGFzczsKLSAgICB9Ci0KLSAgICAvLyBmb3JjZSBvdGhlcnMgdG8gaW1wbGVtZW50IHRoaXMgbWV0aG9kCi0gICAgcHVibGljIHZvaWQgdGVzdFBvcHVsYXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKLSAgICAgICAgICAgIGNoZWNrVmFsdWUoeG1sU3RyaW5nW2ldLHZhbHVlc1tpXSk7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGludCBpID0gMzsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBjaGVja1ZhbHVlKHhtbFN0cmluZ1tpXSx2YWx1ZXNbaV0pOwotICAgICAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoT2JqZWN0IG8pIHsKLSAgICAgICAgcmV0dXJuIENvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKChVbnNpZ25lZEJ5dGUpbyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9wb3B1bGF0ZS9kZXJpdmVkL0Rlcml2ZWRUeXBlVW5zaWduZWRJbnRQb3B1bGF0ZVRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvZGVyaXZlZC9EZXJpdmVkVHlwZVVuc2lnbmVkSW50UG9wdWxhdGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5YTg4ODcuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9wb3B1bGF0ZS9kZXJpdmVkL0Rlcml2ZWRUeXBlVW5zaWduZWRJbnRQb3B1bGF0ZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEucG9wdWxhdGUuZGVyaXZlZDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuVW5zaWduZWRJbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsOwotCi1wdWJsaWMgY2xhc3MgRGVyaXZlZFR5cGVVbnNpZ25lZEludFBvcHVsYXRlVGVzdCBleHRlbmRzIEFic3RyYWN0RGVyaXZlZFBvcHVsYXRlcnsKLQotICAgIHByaXZhdGUgU3RyaW5nIHZhbHVlc1tdPSB7Ci0gICAgICAgICAgICAiMSIsCi0gICAgICAgICAgICAiMCIsCi0gICAgICAgICAgICAiMjY3NTgyMjMzIiAsCi0gICAgICAgICAgICAiLTEiICwKLSAgICAgICAgICAgICItMjY3NTgyMjMzIgotCi0gICAgfTsKLQotICAgIHByaXZhdGUgU3RyaW5nIHhtbFN0cmluZ1tdID0gewotICAgICAgICAgICAgIjxEZXJpdmVkVW5zaWduZWRJbnQgeG1sbnM9XCJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZFwiPiIrdmFsdWVzWzBdKyI8L0Rlcml2ZWRVbnNpZ25lZEludD4iLAotICAgICAgICAgICAgIjxEZXJpdmVkVW5zaWduZWRJbnQgeG1sbnM9XCJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZFwiPiIrdmFsdWVzWzFdKyI8L0Rlcml2ZWRVbnNpZ25lZEludD4iLAotICAgICAgICAgICAgIjxEZXJpdmVkVW5zaWduZWRJbnQgeG1sbnM9XCJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZFwiPiIrdmFsdWVzWzJdKyI8L0Rlcml2ZWRVbnNpZ25lZEludD4iLAotICAgICAgICAgICAgIjxEZXJpdmVkVW5zaWduZWRJbnQgeG1sbnM9XCJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZFwiPiIrdmFsdWVzWzNdKyI8L0Rlcml2ZWRVbnNpZ25lZEludD4iLAotICAgICAgICAgICAgIjxEZXJpdmVkVW5zaWduZWRJbnQgeG1sbnM9XCJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZFwiPiIrdmFsdWVzWzRdKyI8L0Rlcml2ZWRVbnNpZ25lZEludD4iCi0gICAgfTsKLQotCi0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGNsYXNzTmFtZSA9ICJvcmcuc29hcGludGVyb3AueHNkLkRlcml2ZWRVbnNpZ25lZEludCI7Ci0gICAgICAgIHByb3BlcnR5Q2xhc3MgPSBVbnNpZ25lZEludC5jbGFzczsKLSAgICB9Ci0KLSAgICAvLyBmb3JjZSBvdGhlcnMgdG8gaW1wbGVtZW50IHRoaXMgbWV0aG9kCi0gICAgcHVibGljIHZvaWQgdGVzdFBvcHVsYXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKLSAgICAgICAgICAgIGNoZWNrVmFsdWUoeG1sU3RyaW5nW2ldLHZhbHVlc1tpXSk7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGludCBpID0gMzsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBjaGVja1ZhbHVlKHhtbFN0cmluZ1tpXSx2YWx1ZXNbaV0pOwotICAgICAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoT2JqZWN0IG8pIHsKLSAgICAgICAgcmV0dXJuIENvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKChVbnNpZ25lZEludClvKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3BvcHVsYXRlL2Rlcml2ZWQvRGVyaXZlZFR5cGVVbnNpZ25lZExvbmdQb3B1bGF0ZVRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvZGVyaXZlZC9EZXJpdmVkVHlwZVVuc2lnbmVkTG9uZ1BvcHVsYXRlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjM0YzM0Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvZGVyaXZlZC9EZXJpdmVkVHlwZVVuc2lnbmVkTG9uZ1BvcHVsYXRlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5wb3B1bGF0ZS5kZXJpdmVkOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5VbnNpZ25lZExvbmc7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsOwotCi1wdWJsaWMgY2xhc3MgRGVyaXZlZFR5cGVVbnNpZ25lZExvbmdQb3B1bGF0ZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdERlcml2ZWRQb3B1bGF0ZXJ7Ci0KLSAgICBwcml2YXRlIFN0cmluZyB2YWx1ZXNbXT0gewotICAgICAgICAgICAgIjEiLAotICAgICAgICAgICAgIjAiLAotICAgICAgICAgICAgIjI2NzU4MjIzMzM0MzM0IiAsCi0JICAgICIxODQ0Njc0NDA3MzcwOTU1MTYxNSIsCi0gICAgICAgICAgICAiLTEiICwKLSAgICAgICAgICAgICItMjY3NTgyMjMzIgotCi0gICAgfTsKLQotICAgIHByaXZhdGUgU3RyaW5nIHhtbFN0cmluZ1tdID0gewotICAgICAgICAgICAgIjxEZXJpdmVkVW5zaWduZWRMb25nIHhtbG5zPVwiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2RcIj4iK3ZhbHVlc1swXSsiPC9EZXJpdmVkVW5zaWduZWRMb25nPiIsCi0gICAgICAgICAgICAiPERlcml2ZWRVbnNpZ25lZExvbmcgeG1sbnM9XCJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZFwiPiIrdmFsdWVzWzFdKyI8L0Rlcml2ZWRVbnNpZ25lZExvbmc+IiwKLSAgICAgICAgICAgICI8RGVyaXZlZFVuc2lnbmVkTG9uZyB4bWxucz1cImh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkXCI+Iit2YWx1ZXNbMl0rIjwvRGVyaXZlZFVuc2lnbmVkTG9uZz4iLAotICAgICAgICAgICAgIjxEZXJpdmVkVW5zaWduZWRMb25nIHhtbG5zPVwiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2RcIj4iK3ZhbHVlc1szXSsiPC9EZXJpdmVkVW5zaWduZWRMb25nPiIsCi0gICAgICAgICAgICAiPERlcml2ZWRVbnNpZ25lZExvbmcgeG1sbnM9XCJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZFwiPiIrdmFsdWVzWzRdKyI8L0Rlcml2ZWRVbnNpZ25lZExvbmc+IiwKLSAgICAgICAgICAgICI8RGVyaXZlZFVuc2lnbmVkTG9uZyB4bWxucz1cImh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkXCI+Iit2YWx1ZXNbNV0rIjwvRGVyaXZlZFVuc2lnbmVkTG9uZz4iCi0gICAgfTsKLQotCi0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGNsYXNzTmFtZSA9ICJvcmcuc29hcGludGVyb3AueHNkLkRlcml2ZWRVbnNpZ25lZExvbmciOwotICAgICAgICBwcm9wZXJ0eUNsYXNzID0gVW5zaWduZWRMb25nLmNsYXNzOwotICAgIH0KLQotICAgIC8vIGZvcmNlIG90aGVycyB0byBpbXBsZW1lbnQgdGhpcyBtZXRob2QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0UG9wdWxhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgewotICAgICAgICAgICAgY2hlY2tWYWx1ZSh4bWxTdHJpbmdbaV0sdmFsdWVzW2ldKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoaW50IGkgPSA0OyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGNoZWNrVmFsdWUoeG1sU3RyaW5nW2ldLHZhbHVlc1tpXSk7Ci0gICAgICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhPYmplY3QgbykgewotICAgICAgICByZXR1cm4gQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcoKFVuc2lnbmVkTG9uZylvKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3BvcHVsYXRlL2Rlcml2ZWQvRGVyaXZlZFR5cGVVbnNpZ25lZFNob3J0UG9wdWxhdGVUZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3BvcHVsYXRlL2Rlcml2ZWQvRGVyaXZlZFR5cGVVbnNpZ25lZFNob3J0UG9wdWxhdGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyZGYyM2QuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9wb3B1bGF0ZS9kZXJpdmVkL0Rlcml2ZWRUeXBlVW5zaWduZWRTaG9ydFBvcHVsYXRlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5wb3B1bGF0ZS5kZXJpdmVkOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5VbnNpZ25lZFNob3J0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbDsKLQotcHVibGljIGNsYXNzIERlcml2ZWRUeXBlVW5zaWduZWRTaG9ydFBvcHVsYXRlVGVzdCBleHRlbmRzIEFic3RyYWN0RGVyaXZlZFBvcHVsYXRlcnsKLQotICAgIHByaXZhdGUgU3RyaW5nIHZhbHVlc1tdPSB7Ci0gICAgICAgICAgICAiMSIsCi0gICAgICAgICAgICAiMCIsCi0gICAgICAgICAgICAiMjY3NSIgLAotICAgICAgICAgICAgIi0xIiAsCi0gICAgICAgICAgICAiLTI2NzU4MjMiCi0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgeG1sU3RyaW5nW10gPSB7Ci0gICAgICAgICAgICAiPERlcml2ZWRVbnNpZ25lZFNob3J0IHhtbG5zPVwiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2RcIj4iK3ZhbHVlc1swXSsiPC9EZXJpdmVkVW5zaWduZWRTaG9ydD4iLAotICAgICAgICAgICAgIjxEZXJpdmVkVW5zaWduZWRTaG9ydCB4bWxucz1cImh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkXCI+Iit2YWx1ZXNbMV0rIjwvRGVyaXZlZFVuc2lnbmVkU2hvcnQ+IiwKLSAgICAgICAgICAgICI8RGVyaXZlZFVuc2lnbmVkU2hvcnQgeG1sbnM9XCJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZFwiID4iK3ZhbHVlc1syXSsiPC9EZXJpdmVkVW5zaWduZWRTaG9ydD4iLAotICAgICAgICAgICAgIjxEZXJpdmVkVW5zaWduZWRTaG9ydCB4bWxucz1cImh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkXCI+Iit2YWx1ZXNbM10rIjwvRGVyaXZlZFVuc2lnbmVkU2hvcnQ+IiwKLSAgICAgICAgICAgICI8RGVyaXZlZFVuc2lnbmVkU2hvcnQgeG1sbnM9XCJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZFwiPiIrdmFsdWVzWzRdKyI8L0Rlcml2ZWRVbnNpZ25lZFNob3J0PiIKLSAgICB9OwotCi0KLQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgY2xhc3NOYW1lID0gIm9yZy5zb2FwaW50ZXJvcC54c2QuRGVyaXZlZFVuc2lnbmVkU2hvcnQiOwotICAgICAgICBwcm9wZXJ0eUNsYXNzID0gVW5zaWduZWRTaG9ydC5jbGFzczsKLSAgICB9Ci0KLSAgICAvLyBmb3JjZSBvdGhlcnMgdG8gaW1wbGVtZW50IHRoaXMgbWV0aG9kCi0gICAgcHVibGljIHZvaWQgdGVzdFBvcHVsYXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKLSAgICAgICAgICAgIGNoZWNrVmFsdWUoeG1sU3RyaW5nW2ldLHZhbHVlc1tpXSk7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGludCBpID0gMzsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBjaGVja1ZhbHVlKHhtbFN0cmluZ1tpXSx2YWx1ZXNbaV0pOwotICAgICAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoT2JqZWN0IG8pIHsKLSAgICAgICAgcmV0dXJuIENvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKChVbnNpZ25lZFNob3J0KW8pOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvb3RoZXIvQURCSW5PdXRUZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3BvcHVsYXRlL290aGVyL0FEQkluT3V0VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzliMzlhLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvb3RoZXIvQURCSW5PdXRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLnBvcHVsYXRlLm90aGVyOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmJ1aWxkZXIuU3RBWE9NQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MSW5wdXRGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci0KLXB1YmxpYyBjbGFzcyBBREJJbk91dFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwcml2YXRlIFN0cmluZyB4bWxTdHJpbmcgPSAiPHRlbXBFbHQgeG1sbnM9XCJodHRwOi8vc29hcGludGVyb3Aub3JnMS90eXBlc1wiPiIgKwotICAgICAgICAgICAgImhlbGxvIiArCi0gICAgICAgICAgICAiPC90ZW1wRWx0PiI7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgeG1sU3RyaW5nMiA9ICI8aGVhZGVyMSB4bWxucz1cImh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcxL3R5cGVzXCI+IiArCi0gICAgICAgICAgICAiPHZhclN0cmluZz5IZWxsbzwvdmFyU3RyaW5nPiIgKwotICAgICAgICAgICAgIjx2YXJJbnQ+NTwvdmFySW50PiIgKwotICAgICAgICAgICAgIjx2YXJGbG9hdD4zLjM8L3ZhckZsb2F0PiIgKwotICAgICAgICAgICAgIjwvaGVhZGVyMT4iOwotCi0gICAgcHVibGljIHZvaWQgdGVzdFBvcHVsYXRlKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLQotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyID0gWE1MSW5wdXRGYWN0b3J5Lm5ld0luc3RhbmNlKCkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSh4bWxTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICBTT0FQRW52ZWxvcGUgZGVmYXVsdEVudmVsb3BlID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDExRmFjdG9yeSgpLmdldERlZmF1bHRFbnZlbG9wZSgpOwotICAgICAgICBPTUVsZW1lbnQgZG9jdW1lbnRFbGVtZW50ID0gbmV3IFN0QVhPTUJ1aWxkZXIocmVhZGVyKS5nZXREb2N1bWVudEVsZW1lbnQoKTsKLSAgICAgICAgZGVmYXVsdEVudmVsb3BlLmdldEJvZHkoKS5hZGRDaGlsZChkb2N1bWVudEVsZW1lbnQpOwotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0gZGVmYXVsdEVudmVsb3BlLmdldEJvZHkoKS5nZXRGaXJzdEVsZW1lbnQoKS5nZXRYTUxTdHJlYW1SZWFkZXIoKTsKLSAgICAgICAgd2hpbGUoeG1sU3RyZWFtUmVhZGVyLmhhc05leHQoKSl7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImV2ZW50ICIgKyB4bWxTdHJlYW1SZWFkZXIubmV4dCgpKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigidGV4dCAiICsgICh4bWxTdHJlYW1SZWFkZXIuaGFzVGV4dCgpP3htbFN0cmVhbVJlYWRlci5nZXRUZXh0KCk6IiIpKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigibG9jYWxOYW1lICIgKyAoeG1sU3RyZWFtUmVhZGVyLmhhc05hbWUoKT94bWxTdHJlYW1SZWFkZXIuZ2V0TG9jYWxOYW1lKCk6IiIpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQb3B1bGF0ZTIoKSB0aHJvd3MgRXhjZXB0aW9uewotCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlciByZWFkZXIgPSBYTUxJbnB1dEZhY3RvcnkubmV3SW5zdGFuY2UoKS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHhtbFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgIFhNTFN0cmVhbVJlYWRlciByZWFkZXIyID0gWE1MSW5wdXRGYWN0b3J5Lm5ld0luc3RhbmNlKCkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSh4bWxTdHJpbmcyLmdldEJ5dGVzKCkpKTsKLQotICAgICAgICBTT0FQRmFjdG9yeSBzb2FwMTFGYWN0b3J5ID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDExRmFjdG9yeSgpOwotCi0gICAgICAgIFNPQVBFbnZlbG9wZSBkZWZhdWx0RW52ZWxvcGUgPSBzb2FwMTFGYWN0b3J5LmdldERlZmF1bHRFbnZlbG9wZSgpOwotICAgICAgICBPTUVsZW1lbnQgZG9jdW1lbnRFbGVtZW50ID0gbmV3IFN0QVhPTUJ1aWxkZXIocmVhZGVyKS5nZXREb2N1bWVudEVsZW1lbnQoKTsKLSAgICAgICAgZGVmYXVsdEVudmVsb3BlLmdldEJvZHkoKS5hZGRDaGlsZChkb2N1bWVudEVsZW1lbnQpOwotCi0gICAgICAgIE9NRWxlbWVudCBkb2N1bWVudEVsZW1lbnQyID0gbmV3IFN0QVhPTUJ1aWxkZXIocmVhZGVyMikuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0gICAgICAgIGRlZmF1bHRFbnZlbG9wZS5nZXRIZWFkZXIoKS5hZGRDaGlsZChkb2N1bWVudEVsZW1lbnQyKTsKLQotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0gZGVmYXVsdEVudmVsb3BlLmdldEJvZHkoKS5nZXRGaXJzdEVsZW1lbnQoKS5nZXRYTUxTdHJlYW1SZWFkZXIoKTsKLSAgICAgICAgd2hpbGUoeG1sU3RyZWFtUmVhZGVyLmhhc05leHQoKSl7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImV2ZW50ICIgKyB4bWxTdHJlYW1SZWFkZXIubmV4dCgpKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigidGV4dCAiICsgICh4bWxTdHJlYW1SZWFkZXIuaGFzVGV4dCgpP3htbFN0cmVhbVJlYWRlci5nZXRUZXh0KCk6IiIpKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigibG9jYWxOYW1lICIgKyAoeG1sU3RyZWFtUmVhZGVyLmhhc05hbWUoKT94bWxTdHJlYW1SZWFkZXIuZ2V0TG9jYWxOYW1lKCk6IiIpKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvb3RoZXIvUG9wdWxhdGVBbm9uQ29tcGxleFR5cGVUZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3BvcHVsYXRlL290aGVyL1BvcHVsYXRlQW5vbkNvbXBsZXhUeXBlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGI4NjQ5Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvb3RoZXIvUG9wdWxhdGVBbm9uQ29tcGxleFR5cGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLnBvcHVsYXRlLm90aGVyOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5TdEFYVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEucG9wdWxhdGUuVXRpbDsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuYmVhbnMuQmVhbkluZm87Ci1pbXBvcnQgamF2YS5iZWFucy5JbnRyb3NwZWN0b3I7Ci1pbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci0KLXB1YmxpYyBjbGFzcyBQb3B1bGF0ZUFub25Db21wbGV4VHlwZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgeG1sU3RyaW5nID0gIjx0ZW1wRWx0IHhtbG5zPVwiaHR0cDovL3NvYXBpbnRlcm9wLm9yZzEvdHlwZXNcIj4iICsKLSAgICAgICAgICAgICI8dmFyU3RyaW5nPkhlbGxvPC92YXJTdHJpbmc+IiArCi0gICAgICAgICAgICAiPHZhckludD41PC92YXJJbnQ+IiArCi0gICAgICAgICAgICAiPHZhckZsb2F0PjMuMzwvdmFyRmxvYXQ+IiArCi0gICAgICAgICAgICAiPC90ZW1wRWx0PiI7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UG9wdWxhdGUoKSB0aHJvd3MgRXhjZXB0aW9uewotCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlciByZWFkZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSh4bWxTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICBDbGFzcyBjbGF6eiA9IENsYXNzLmZvck5hbWUoIm9yZzEuc29hcGludGVyb3AudHlwZXMuVGVtcEVsdCIpOwotICAgICAgICBDbGFzcyBpbm5lckNsYXp6ID0gVXRpbC5nZXRGYWN0b3J5KGNsYXp6KTsKLSAgICAgICAgTWV0aG9kIHBhcnNlTWV0aG9kID0gaW5uZXJDbGF6ei5nZXRNZXRob2QoInBhcnNlIixuZXcgQ2xhc3NbXXtYTUxTdHJlYW1SZWFkZXIuY2xhc3N9KTsKLSAgICAgICAgT2JqZWN0IG9iaiA9IHBhcnNlTWV0aG9kLmludm9rZShudWxsLG5ldyBPYmplY3RbXXtyZWFkZXJ9KTsKLQotCi0gICAgICAgIEJlYW5JbmZvIGJlYW5JbmZvID0gIEludHJvc3BlY3Rvci5nZXRCZWFuSW5mbyhvYmouZ2V0Q2xhc3MoKSk7Ci0gICAgICAgIFByb3BlcnR5RGVzY3JpcHRvcltdIHByb3BlcnR5RGVzY3JpcHRvcnMgPSBiZWFuSW5mby5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKCk7Ci0gICAgICAgIE1ldGhvZCByZWFkTWV0aG9kOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb3BlcnR5RGVzY3JpcHRvcnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFByb3BlcnR5RGVzY3JpcHRvciBwcm9wZXJ0eURlc2NyaXB0b3IgPSBwcm9wZXJ0eURlc2NyaXB0b3JzW2ldOwotICAgICAgICAgICAgaWYgKCJ2YXJJbnQiLmVxdWFscyhwcm9wZXJ0eURlc2NyaXB0b3IuZ2V0RGlzcGxheU5hbWUoKSkpewotICAgICAgICAgICAgICAgIHJlYWRNZXRob2QgPSBwcm9wZXJ0eURlc2NyaXB0b3IuZ2V0UmVhZE1ldGhvZCgpOwotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhuZXcgSW50ZWdlcig1KSxyZWFkTWV0aG9kLmludm9rZShvYmosKE9iamVjdFtdKSBudWxsKSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCJ2YXJGbG9hdCIuZXF1YWxzKHByb3BlcnR5RGVzY3JpcHRvci5nZXREaXNwbGF5TmFtZSgpKSl7Ci0gICAgICAgICAgICAgICAgcmVhZE1ldGhvZCA9IHByb3BlcnR5RGVzY3JpcHRvci5nZXRSZWFkTWV0aG9kKCk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBGbG9hdCgzLjMpLHJlYWRNZXRob2QuaW52b2tlKG9iaiwKLSAgICAgICAgICAgICAgICAgICAgICAgIChPYmplY3RbXSkgbnVsbCkpOwotICAgICAgICAgICAgfSAgZWxzZSBpZiAoInZhclN0cmluZyIuZXF1YWxzKHByb3BlcnR5RGVzY3JpcHRvci5nZXREaXNwbGF5TmFtZSgpKSl7Ci0gICAgICAgICAgICAgICAgcmVhZE1ldGhvZCA9IHByb3BlcnR5RGVzY3JpcHRvci5nZXRSZWFkTWV0aG9kKCk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJIZWxsbyIscmVhZE1ldGhvZC5pbnZva2Uob2JqLCAoT2JqZWN0W10pIG51bGwpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLSAgICB9Ci0KLQotCi19Ci0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvb3RoZXIvUG9wdWxhdGVBbnlUeXBlVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9wb3B1bGF0ZS9vdGhlci9Qb3B1bGF0ZUFueVR5cGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1YWZhZTUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9wb3B1bGF0ZS9vdGhlci9Qb3B1bGF0ZUFueVR5cGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLnBvcHVsYXRlLm90aGVyOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5TdEFYVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEucG9wdWxhdGUuVXRpbDsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotCi1wdWJsaWMgY2xhc3MgUG9wdWxhdGVBbnlUeXBlVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgICBwcml2YXRlIFN0cmluZyB4bWxTdHJpbmcgPSAiPG15T2JqZWN0IHhtbG5zOnhzaT1cImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlXCIgeG1sbnM6eHNkPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWFcIiB4bWxucz1cImh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkMlwiIHhzaTp0eXBlPVwieHNkOmludFwiPiIgKwotICAgICAgICAgICAgIjUiICsKLSAgICAgICAgICAgICI8L215T2JqZWN0PiI7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UG9wdWxhdGUoKSB0aHJvd3MgRXhjZXB0aW9uewotCi0gICAgICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oeG1sU3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgICAgIENsYXNzIGNsYXp6ID0gQ2xhc3MuZm9yTmFtZSgib3JnLnNvYXBpbnRlcm9wLnhzZDIuTXlPYmplY3QiKTsKLSAgICAgICAgICAgICAgIENsYXNzIGlubmVyQ2xhenogPSBVdGlsLmdldEZhY3RvcnkoY2xhenopOwotICAgICAgICAgICAgICAgTWV0aG9kIHBhcnNlTWV0aG9kID0gaW5uZXJDbGF6ei5nZXRNZXRob2QoInBhcnNlIixuZXcgQ2xhc3NbXXtYTUxTdHJlYW1SZWFkZXIuY2xhc3N9KTsKLSAgICAgICAgICAgICAgIE9iamVjdCBvYmogPSBwYXJzZU1ldGhvZC5pbnZva2UobnVsbCxuZXcgT2JqZWN0W117cmVhZGVyfSk7Ci0KLQotCi0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvb3RoZXIvUG9wdWxhdGVBcnJheUluQXJyYXlUZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3BvcHVsYXRlL290aGVyL1BvcHVsYXRlQXJyYXlJbkFycmF5VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTkwMDE0Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvb3RoZXIvUG9wdWxhdGVBcnJheUluQXJyYXlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLnBvcHVsYXRlLm90aGVyOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5TdEFYVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEucG9wdWxhdGUuVXRpbDsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuYmVhbnMuQmVhbkluZm87Ci1pbXBvcnQgamF2YS5iZWFucy5JbnRyb3NwZWN0b3I7Ci1pbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci0KLXB1YmxpYyBjbGFzcyBQb3B1bGF0ZUFycmF5SW5BcnJheVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZXsKLSAgICBwcml2YXRlIFN0cmluZyB4bWxTdHJpbmcgPSAiPG15b2JqZWN0IHhtbG5zPVwiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2RcIj4iICsKLSAgICAgICAgICAgICI8c29hcFN0cnVjdHVyZXM+IiArCi0gICAgICAgICAgICAiPHZhckZsb2F0PjMuMzwvdmFyRmxvYXQ+IiArCi0gICAgICAgICAgICAiPHZhckludD41PC92YXJJbnQ+IiArCi0gICAgICAgICAgICAiPHZhclN0cmluZz5IZWxsbzExPC92YXJTdHJpbmc+IiArCi0gICAgICAgICAgICAiPHZhclN0cmluZz5IZWxsbzExPC92YXJTdHJpbmc+IiArCi0gICAgICAgICAgICAiPHZhclN0cmluZz5IZWxsbzEyPC92YXJTdHJpbmc+IiArCi0gICAgICAgICAgICAiPHZhclN0cmluZz5IZWxsbzEzPC92YXJTdHJpbmc+IiArCi0gICAgICAgICAgICAiPC9zb2FwU3RydWN0dXJlcz4iICsKLSAgICAgICAgICAgICI8c29hcFN0cnVjdHVyZXM+IiArCi0gICAgICAgICAgICAiPHZhckZsb2F0PjMuMzE8L3ZhckZsb2F0PiIgKwotICAgICAgICAgICAgIjx2YXJJbnQ+NTE8L3ZhckludD4iICsKLSAgICAgICAgICAgICI8dmFyU3RyaW5nPkhlbGxvMjE8L3ZhclN0cmluZz4iICsKLSAgICAgICAgICAgICI8dmFyU3RyaW5nPkhlbGxvMjE8L3ZhclN0cmluZz4iICsKLSAgICAgICAgICAgICI8dmFyU3RyaW5nPkhlbGxvMjI8L3ZhclN0cmluZz4iICsKLSAgICAgICAgICAgICI8dmFyU3RyaW5nPkhlbGxvMjM8L3ZhclN0cmluZz4iICsKLSAgICAgICAgICAgICI8L3NvYXBTdHJ1Y3R1cmVzPiIgKwotICAgICAgICAgICAgIjwvbXlvYmplY3Q+IjsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQb3B1bGF0ZSgpIHRocm93cyBFeGNlcHRpb257Ci0KLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciByZWFkZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSh4bWxTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgQ2xhc3MgY2xhenogPSBDbGFzcy5mb3JOYW1lKCJvcmcuc29hcGludGVyb3AueHNkLk15b2JqZWN0Iik7Ci0gICAgICAgICAgICBDbGFzcyBpbm5lckNsYXp6ID0gVXRpbC5nZXRGYWN0b3J5KGNsYXp6KTsKLSAgICAgICAgICAgIE1ldGhvZCBwYXJzZU1ldGhvZCA9IGlubmVyQ2xhenouZ2V0TWV0aG9kKCJwYXJzZSIsbmV3IENsYXNzW117WE1MU3RyZWFtUmVhZGVyLmNsYXNzfSk7Ci0gICAgICAgICAgICBPYmplY3Qgb2JqID0gcGFyc2VNZXRob2QuaW52b2tlKG51bGwsbmV3IE9iamVjdFtde3JlYWRlcn0pOwotCi0KLSAgICAgICAgICAgIE9iamVjdCBteU9iamVjdCA9IG51bGwgOwotICAgICAgICAgICAgQmVhbkluZm8gYmVhbkluZm8gPSAgSW50cm9zcGVjdG9yLmdldEJlYW5JbmZvKG9iai5nZXRDbGFzcygpKTsKLSAgICAgICAgICAgIFByb3BlcnR5RGVzY3JpcHRvcltdIHByb3BlcnR5RGVzY3JpcHRvcnMgPSBiZWFuSW5mby5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb3BlcnR5RGVzY3JpcHRvcnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBQcm9wZXJ0eURlc2NyaXB0b3IgcHJvcGVydHlEZXNjcmlwdG9yID0gcHJvcGVydHlEZXNjcmlwdG9yc1tpXTsKLSAgICAgICAgICAgICAgICBpZiAoIm15b2JqZWN0Ii5lcXVhbHMocHJvcGVydHlEZXNjcmlwdG9yLmdldERpc3BsYXlOYW1lKCkpKXsKLSAgICAgICAgICAgICAgICAgICAgTWV0aG9kIHJlYWRNZXRob2QgPSBwcm9wZXJ0eURlc2NyaXB0b3IuZ2V0UmVhZE1ldGhvZCgpOwotICAgICAgICAgICAgICAgICAgICBteU9iamVjdCA9IHJlYWRNZXRob2QuaW52b2tlKG9iaixuZXcgT2JqZWN0W117fSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwobXlPYmplY3QpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvb3RoZXIvUG9wdWxhdGVBcnJheVRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvb3RoZXIvUG9wdWxhdGVBcnJheVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc2ODk3NS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3BvcHVsYXRlL290aGVyL1BvcHVsYXRlQXJyYXlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLnBvcHVsYXRlLm90aGVyOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5TdEFYVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEucG9wdWxhdGUuVXRpbDsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuYmVhbnMuQmVhbkluZm87Ci1pbXBvcnQgamF2YS5iZWFucy5JbnRyb3NwZWN0b3I7Ci1pbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5BcnJheTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci0KLXB1YmxpYyBjbGFzcyBQb3B1bGF0ZUFycmF5VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICBwcml2YXRlIFN0cmluZyB4bWxTdHJpbmcgPSAiPG15b2JqZWN0IHhtbG5zPVwiaHR0cDovL3NvYXBpbnRlcm9wLm9yZzIveHNkXCI+IiArCi0gICAgICAgICAgICAiPHZhckZsb2F0PjMuMzwvdmFyRmxvYXQ+IiArCi0gICAgICAgICAgICAiPHZhckludD41PC92YXJJbnQ+IiArCi0gICAgICAgICAgICAiPHZhclN0cmluZz5IZWxsbzwvdmFyU3RyaW5nPiIgKwotICAgICAgICAgICAgIjx2YXJTdHJpbmc+SGVsbG8yPC92YXJTdHJpbmc+IiArCi0gICAgICAgICAgICAiPHZhclN0cmluZz5IZWxsbzM8L3ZhclN0cmluZz4iICsKLSAgICAgICAgICAgICI8L215b2JqZWN0PiI7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UG9wdWxhdGUoKSB0aHJvd3MgRXhjZXB0aW9uewotCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlciByZWFkZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSh4bWxTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICBDbGFzcyBjbGF6eiA9IENsYXNzLmZvck5hbWUoIm9yZzIuc29hcGludGVyb3AueHNkLk15b2JqZWN0Iik7Ci0gICAgICAgIENsYXNzIGlubmVyQ2xhenogPSBVdGlsLmdldEZhY3RvcnkoY2xhenopOwotICAgICAgICBNZXRob2QgcGFyc2VNZXRob2QgPSBpbm5lckNsYXp6LmdldE1ldGhvZCgicGFyc2UiLG5ldyBDbGFzc1tde1hNTFN0cmVhbVJlYWRlci5jbGFzc30pOwotICAgICAgICBPYmplY3Qgb2JqID0gcGFyc2VNZXRob2QuaW52b2tlKG51bGwsbmV3IE9iamVjdFtde3JlYWRlcn0pOwotCi0gICAgICAgIE9iamVjdCBzb2FwU3RydWN0ID0gbnVsbDsKLSAgICAgICAgQmVhbkluZm8gYmVhbkluZm8gPSAgSW50cm9zcGVjdG9yLmdldEJlYW5JbmZvKG9iai5nZXRDbGFzcygpKTsKLSAgICAgICAgUHJvcGVydHlEZXNjcmlwdG9yW10gcHJvcGVydHlEZXNjcmlwdG9ycyA9IGJlYW5JbmZvLmdldFByb3BlcnR5RGVzY3JpcHRvcnMoKTsKLSAgICAgICAgTWV0aG9kIHJlYWRNZXRob2Q7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvcGVydHlEZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgUHJvcGVydHlEZXNjcmlwdG9yIHByb3BlcnR5RGVzY3JpcHRvciA9IHByb3BlcnR5RGVzY3JpcHRvcnNbaV07Ci0gICAgICAgICAgICBpZiAoIm15b2JqZWN0Ii5lcXVhbHMocHJvcGVydHlEZXNjcmlwdG9yLmdldERpc3BsYXlOYW1lKCkpKXsKLSAgICAgICAgICAgICAgICByZWFkTWV0aG9kID0gcHJvcGVydHlEZXNjcmlwdG9yLmdldFJlYWRNZXRob2QoKTsKLSAgICAgICAgICAgICAgICBzb2FwU3RydWN0ID0gcmVhZE1ldGhvZC5pbnZva2Uob2JqLCAoT2JqZWN0W10pIG51bGwpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzb2FwU3RydWN0KTsKLQotICAgICAgICBCZWFuSW5mbyBzdHJ1Y3RCZWFuSW5mbyA9ICBJbnRyb3NwZWN0b3IuZ2V0QmVhbkluZm8oc29hcFN0cnVjdC5nZXRDbGFzcygpKTsKLSAgICAgICAgUHJvcGVydHlEZXNjcmlwdG9yW10gc3RydWN0UHJvcGVydHlEZXNjcmlwdG9ycyA9IHN0cnVjdEJlYW5JbmZvLmdldFByb3BlcnR5RGVzY3JpcHRvcnMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdHJ1Y3RQcm9wZXJ0eURlc2NyaXB0b3JzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBQcm9wZXJ0eURlc2NyaXB0b3IgcHJvcGVydHlEZXNjcmlwdG9yID0gc3RydWN0UHJvcGVydHlEZXNjcmlwdG9yc1tpXTsKLSAgICAgICAgICAgIGlmICgidmFySW50Ii5lcXVhbHMocHJvcGVydHlEZXNjcmlwdG9yLmdldERpc3BsYXlOYW1lKCkpKXsKLSAgICAgICAgICAgICAgICByZWFkTWV0aG9kID0gcHJvcGVydHlEZXNjcmlwdG9yLmdldFJlYWRNZXRob2QoKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoInZhckludCBpcyBub3QgcHJvcGVybHkgc2V0IixuZXcgSW50ZWdlcig1KSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRNZXRob2QuaW52b2tlKHNvYXBTdHJ1Y3QsIChPYmplY3RbXSkgbnVsbCkpOwotICAgICAgICAgICAgfSBlbHNlIGlmICgidmFyRmxvYXQiLmVxdWFscyhwcm9wZXJ0eURlc2NyaXB0b3IuZ2V0RGlzcGxheU5hbWUoKSkpewotICAgICAgICAgICAgICAgIHJlYWRNZXRob2QgPSBwcm9wZXJ0eURlc2NyaXB0b3IuZ2V0UmVhZE1ldGhvZCgpOwotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygidmFyRmxvYXQgaXMgbm90IHByb3Blcmx5IHNldCIsbmV3IEZsb2F0KDMuMyksCi0gICAgICAgICAgICAgICAgICAgICAgICByZWFkTWV0aG9kLmludm9rZShzb2FwU3RydWN0LCAoT2JqZWN0W10pIG51bGwpKTsKLSAgICAgICAgICAgIH0gIGVsc2UgaWYgKCJ2YXJTdHJpbmciLmVxdWFscyhwcm9wZXJ0eURlc2NyaXB0b3IuZ2V0RGlzcGxheU5hbWUoKSkpewotICAgICAgICAgICAgICAgIHJlYWRNZXRob2QgPSBwcm9wZXJ0eURlc2NyaXB0b3IuZ2V0UmVhZE1ldGhvZCgpOwotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIlN0cmluZyBhcnJheSBpcyBub3Qgc2V0IixyZWFkTWV0aG9kLmdldFJldHVyblR5cGUoKS5pc0FycmF5KCkpOwotICAgICAgICAgICAgICAgIE9iamVjdCBhcnJheSA9IHJlYWRNZXRob2QuaW52b2tlKHNvYXBTdHJ1Y3QsIChPYmplY3RbXSkgbnVsbCk7Ci0gICAgICAgICAgICAgICAgaW50IGxlbmd0aCA9IEFycmF5LmdldExlbmd0aChhcnJheSk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJBcnJheSBsZW5ndGggaXMgbm90IGNvcnJlY3QiLGxlbmd0aCwzKTsKLQotICAgICAgICAgICAgICAgIC8vY2hlY2sgdGhlIGl0ZW1zIGhlcmUKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLQotICAgIH0KLQotCi0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvb3RoZXIvUG9wdWxhdGVDaG9pY2VUZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3BvcHVsYXRlL290aGVyL1BvcHVsYXRlQ2hvaWNlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTY4OThlLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvb3RoZXIvUG9wdWxhdGVDaG9pY2VUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLnBvcHVsYXRlLm90aGVyOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5TdEFYVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEucG9wdWxhdGUuVXRpbDsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuYmVhbnMuQmVhbkluZm87Ci1pbXBvcnQgamF2YS5iZWFucy5JbnRyb3NwZWN0b3I7Ci1pbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci0KLXB1YmxpYyBjbGFzcyBQb3B1bGF0ZUNob2ljZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgeG1sU3RyaW5nID0gIjxteUVsZW1lbnQgeG1sbnM9XCJodHRwOi8vc29hcGludGVyb3Aub3JnL3R5cGVzXCI+IiArCi0gICAgICAgICAgICAiPHZhckZsb2F0PjMuMzwvdmFyRmxvYXQ+IiArCi0gICAgICAgICAgICAiPC9teUVsZW1lbnQ+IjsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQb3B1bGF0ZSgpIHRocm93cyBFeGNlcHRpb257Ci0KLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHJlYWRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHhtbFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgIENsYXNzIGNsYXp6ID0gQ2xhc3MuZm9yTmFtZSgib3JnLnNvYXBpbnRlcm9wLnR5cGVzLk15RWxlbWVudCIpOwotICAgICAgICBDbGFzcyBpbm5lckNsYXp6ID0gVXRpbC5nZXRGYWN0b3J5KGNsYXp6KTsKLSAgICAgICAgTWV0aG9kIHBhcnNlTWV0aG9kID0gaW5uZXJDbGF6ei5nZXRNZXRob2QoInBhcnNlIixuZXcgQ2xhc3NbXXtYTUxTdHJlYW1SZWFkZXIuY2xhc3N9KTsKLSAgICAgICAgT2JqZWN0IG9iaiA9IHBhcnNlTWV0aG9kLmludm9rZShudWxsLG5ldyBPYmplY3RbXXtyZWFkZXJ9KTsKLQotICAgICAgICBPYmplY3QgbXlFbGVtZW50ID0gbnVsbDsKLSAgICAgICAgQmVhbkluZm8gYmVhbkluZm8gPSAgSW50cm9zcGVjdG9yLmdldEJlYW5JbmZvKG9iai5nZXRDbGFzcygpKTsKLSAgICAgICAgUHJvcGVydHlEZXNjcmlwdG9yW10gcHJvcGVydHlEZXNjcmlwdG9ycyA9IGJlYW5JbmZvLmdldFByb3BlcnR5RGVzY3JpcHRvcnMoKTsKLSAgICAgICAgTWV0aG9kIHJlYWRNZXRob2Q7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvcGVydHlEZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgUHJvcGVydHlEZXNjcmlwdG9yIHByb3BlcnR5RGVzY3JpcHRvciA9IHByb3BlcnR5RGVzY3JpcHRvcnNbaV07Ci0gICAgICAgICAgICBpZiAoIm15RWxlbWVudCIuZXF1YWxzKHByb3BlcnR5RGVzY3JpcHRvci5nZXREaXNwbGF5TmFtZSgpKSl7Ci0gICAgICAgICAgICAgICAgcmVhZE1ldGhvZCA9IHByb3BlcnR5RGVzY3JpcHRvci5nZXRSZWFkTWV0aG9kKCk7Ci0gICAgICAgICAgICAgICAgbXlFbGVtZW50ID0gcmVhZE1ldGhvZC5pbnZva2Uob2JqLCAoT2JqZWN0W10pIG51bGwpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGFzc2VydE5vdE51bGwobXlFbGVtZW50KTsKLQotICAgICAgICBCZWFuSW5mbyBzdHJ1Y3RCZWFuSW5mbyA9ICBJbnRyb3NwZWN0b3IuZ2V0QmVhbkluZm8obXlFbGVtZW50LmdldENsYXNzKCkpOwotICAgICAgICBQcm9wZXJ0eURlc2NyaXB0b3JbXSBzdHJ1Y3RQcm9wZXJ0eURlc2NyaXB0b3JzID0gc3RydWN0QmVhbkluZm8uZ2V0UHJvcGVydHlEZXNjcmlwdG9ycygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0cnVjdFByb3BlcnR5RGVzY3JpcHRvcnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFByb3BlcnR5RGVzY3JpcHRvciBwcm9wZXJ0eURlc2NyaXB0b3IgPSBzdHJ1Y3RQcm9wZXJ0eURlc2NyaXB0b3JzW2ldOwotICAgICAgICAgICAgaWYgKCJ2YXJGbG9hdCIuZXF1YWxzKHByb3BlcnR5RGVzY3JpcHRvci5nZXREaXNwbGF5TmFtZSgpKSl7Ci0gICAgICAgICAgICAgICAgcmVhZE1ldGhvZCA9IHByb3BlcnR5RGVzY3JpcHRvci5nZXRSZWFkTWV0aG9kKCk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ2YXJGbG9hdCBpcyBub3QgcHJvcGVybHkgc2V0IixuZXcgRmxvYXQoMy4zKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRNZXRob2QuaW52b2tlKG15RWxlbWVudCwgKE9iamVjdFtdKSBudWxsKSk7Ci0KLSAgICAgICAgICAgIH1lbHNlIGlmICgidmFySW50Ii5lcXVhbHMocHJvcGVydHlEZXNjcmlwdG9yLmdldERpc3BsYXlOYW1lKCkpKXsKLSAgICAgICAgICAgICAgICByZWFkTWV0aG9kID0gcHJvcGVydHlEZXNjcmlwdG9yLmdldFJlYWRNZXRob2QoKTsKLSAgICAgICAgICAgICAgICAvL3RoaXMgc2hvdWxkIG5vdCBiZSBzZXQgISAtIGl0IHNob3VsZCByZXR1cm4gemVybwotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygidmFySW50IGlzIG5vdCBwcm9wZXJseSBzZXQiLG5ldyBJbnRlZ2VyKDApLAotICAgICAgICAgICAgICAgICAgICAgICAgcmVhZE1ldGhvZC5pbnZva2UobXlFbGVtZW50LCAoT2JqZWN0W10pIG51bGwpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9wb3B1bGF0ZS9vdGhlci9Qb3B1bGF0ZUNvbXBsZXhNaW5PY2N1cnMwVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9wb3B1bGF0ZS9vdGhlci9Qb3B1bGF0ZUNvbXBsZXhNaW5PY2N1cnMwVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjgyOTY3Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvb3RoZXIvUG9wdWxhdGVDb21wbGV4TWluT2NjdXJzMFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLnBvcHVsYXRlLm90aGVyOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5TdEFYVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEucG9wdWxhdGUuVXRpbDsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuYmVhbnMuQmVhbkluZm87Ci1pbXBvcnQgamF2YS5iZWFucy5JbnRyb3NwZWN0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuYmVhbnMuSW50cm9zcGVjdG9yOwotaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci0KLXB1YmxpYyBjbGFzcyBQb3B1bGF0ZUNvbXBsZXhNaW5PY2N1cnMwVGVzdCAgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQotCi0gICAgLy8gYWxsIGFyZSBwcmVzZW50Ci0gICAgcHJpdmF0ZSBTdHJpbmcgeG1sU3RyaW5nMSA9ICI8cm9vdCB4bWxucz1cImh0dHA6Ly90ZXN0MS5vcmdcIj4iICsKLSAgICAgICAgICAgICI8Y2l0eT5Db2xvbWJvPC9jaXR5PiIgKwotICAgICAgICAgICAgIjxwZXJzb24+IiArCi0gICAgICAgICAgICAiPG5hbWU+QW15PC9uYW1lPiIgKwotICAgICAgICAgICAgIjxhZ2U+MTA8L2FnZT4iICsKLSAgICAgICAgICAgICI8L3BlcnNvbj4iICsKLSAgICAgICAgICAgICI8YWRkcmVzcz4iICsKLSAgICAgICAgICAgICI8c3RyZWV0TmFtZT5NeSBTdHJlZXQ8L3N0cmVldE5hbWU+IiArCi0gICAgICAgICAgICAiPHN0cmVldE5vPjE8L3N0cmVldE5vPiIgKwotICAgICAgICAgICAgIjwvYWRkcmVzcz4iICsKLSAgICAgICAgICAgICI8L3Jvb3Q+IjsKLQotCi0KLSAgICAvL3BlcnNvbiBlbGVtZW50IGlzIG1pc3NpbmcKLSAgICBwcml2YXRlIFN0cmluZyB4bWxTdHJpbmcyID0gIjxyb290IHhtbG5zPVwiaHR0cDovL3Rlc3QxLm9yZ1wiPiIgKwotICAgICAgICAgICAgIjxjaXR5PkNvbG9tYm88L2NpdHk+IiArCi0gICAgICAgICAgICAiPGFkZHJlc3M+IiArCi0gICAgICAgICAgICAiPHN0cmVldE5hbWU+TXkgU3RyZWV0PC9zdHJlZXROYW1lPiIgKwotICAgICAgICAgICAgIjxzdHJlZXRObz4xPC9zdHJlZXRObz4iICsKLSAgICAgICAgICAgICI8L2FkZHJlc3M+IiArCi0gICAgICAgICAgICAiPC9yb290PiI7Ci0KLSAgICAvL09ubHkgY2l0eSBpcyBwcmVzZW50Ci0gICAgcHJpdmF0ZSBTdHJpbmcgeG1sU3RyaW5nMyA9ICI8cm9vdCB4bWxucz1cImh0dHA6Ly90ZXN0MS5vcmdcIj4iICsKLSAgICAgICAgICAgICI8Y2l0eT5Db2xvbWJvPC9jaXR5PiIgKwotICAgICAgICAgICAgIjwvcm9vdD4iOwotCi0KLSAgICAvLyBhbGwgYXJlIHByZXNlbnQgd2l0aCB0d28gYWRkcmVzc2VzCi0gICAgcHJpdmF0ZSBTdHJpbmcgeG1sU3RyaW5nNCA9ICI8cm9vdCB4bWxucz1cImh0dHA6Ly90ZXN0MS5vcmdcIj4iICsKLSAgICAgICAgICAgICI8Y2l0eT5Db2xvbWJvPC9jaXR5PiIgKwotICAgICAgICAgICAgIjxwZXJzb24+IiArCi0gICAgICAgICAgICAiPG5hbWU+QW15PC9uYW1lPiIgKwotICAgICAgICAgICAgIjxhZ2U+MTA8L2FnZT4iICsKLSAgICAgICAgICAgICI8L3BlcnNvbj4iICsKLSAgICAgICAgICAgICI8YWRkcmVzcz4iICsKLSAgICAgICAgICAgICI8c3RyZWV0TmFtZT5NeSBTdHJlZXQ8L3N0cmVldE5hbWU+IiArCi0gICAgICAgICAgICAiPHN0cmVldE5vPjE8L3N0cmVldE5vPiIgKwotICAgICAgICAgICAgIjwvYWRkcmVzcz4iICsKLSAgICAgICAgICAgICI8YWRkcmVzcz4iICsKLSAgICAgICAgICAgICI8c3RyZWV0TmFtZT5NeSBTdHJlZXQyPC9zdHJlZXROYW1lPiIgKwotICAgICAgICAgICAgIjxzdHJlZXRObz4yPC9zdHJlZXRObz4iICsKLSAgICAgICAgICAgICI8L2FkZHJlc3M+IiArCi0gICAgICAgICAgICAiPC9yb290PiI7Ci0gICAgcHVibGljIHZvaWQgdGVzdFBvcHVsYXRlMSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBwb3B1bGF0ZUFuZEFzc2VydCh4bWxTdHJpbmcxLCAxLCB0cnVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UG9wdWxhdGUyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHBvcHVsYXRlQW5kQXNzZXJ0KHhtbFN0cmluZzIsIDEsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UG9wdWxhdGUzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHBvcHVsYXRlQW5kQXNzZXJ0KHhtbFN0cmluZzMsIDAsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UG9wdWxhdGU0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHBvcHVsYXRlQW5kQXNzZXJ0KHhtbFN0cmluZzQsIDIsIHRydWUpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBwb3B1bGF0ZUFuZEFzc2VydChTdHJpbmcgcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGV4cGVjdGVkQWRkcmVzc0NvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHBlcnNvblByZXNlbnQpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24sIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50cm9zcGVjdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIFhNTFN0cmVhbVJlYWRlciByZWFkZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShzLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgQ2xhc3MgY2xhenogPSBDbGFzcy5mb3JOYW1lKCJvcmcudGVzdDEuUm9vdCIpOwotICAgICAgICBDbGFzcyBpbm5lckNsYXp6ID0gVXRpbC5nZXRGYWN0b3J5KGNsYXp6KTsKLSAgICAgICAgTWV0aG9kIHBhcnNlTWV0aG9kID0gaW5uZXJDbGF6ei5nZXRNZXRob2QoInBhcnNlIiwgbmV3IENsYXNzW117WE1MU3RyZWFtUmVhZGVyLmNsYXNzfSk7Ci0gICAgICAgIE9iamVjdCBvYmogPSBwYXJzZU1ldGhvZC5pbnZva2UobnVsbCwgbmV3IE9iamVjdFtde3JlYWRlcn0pOwotCi0gICAgICAgIGFzc2VydE5vdE51bGwob2JqKTsKLQotICAgICAgICBPYmplY3QgcGVyc29uT2JqZWN0ID0gbnVsbDsKLSAgICAgICAgT2JqZWN0IGFkZHJlc3NPYmplY3QgPSBudWxsOwotICAgICAgICBCZWFuSW5mbyBiZWFuSW5mbyA9IEludHJvc3BlY3Rvci5nZXRCZWFuSW5mbyhvYmouZ2V0Q2xhc3MoKSk7Ci0gICAgICAgIFByb3BlcnR5RGVzY3JpcHRvcltdIHByb3BlcnR5RGVzY3JpcHRvcnMgPSBiZWFuSW5mby5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKCk7Ci0gICAgICAgIE1ldGhvZCByZWFkTWV0aG9kOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvcGVydHlEZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgUHJvcGVydHlEZXNjcmlwdG9yIHByb3BlcnR5RGVzY3JpcHRvciA9IHByb3BlcnR5RGVzY3JpcHRvcnNbaV07Ci0gICAgICAgICAgICBpZiAoInBlcnNvbiIuZXF1YWxzKHByb3BlcnR5RGVzY3JpcHRvci5nZXREaXNwbGF5TmFtZSgpKSkgewotICAgICAgICAgICAgICAgIHJlYWRNZXRob2QgPSBwcm9wZXJ0eURlc2NyaXB0b3IuZ2V0UmVhZE1ldGhvZCgpOwotICAgICAgICAgICAgICAgIHBlcnNvbk9iamVjdCA9IHJlYWRNZXRob2QuaW52b2tlKG9iaiwgbnVsbCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocGVyc29uUHJlc2VudCkKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChwZXJzb25PYmplY3QpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0TnVsbChwZXJzb25PYmplY3QpOwotICAgICAgICAgICAgfWVsc2UgaWYgKCJhZGRyZXNzIi5lcXVhbHMocHJvcGVydHlEZXNjcmlwdG9yLmdldERpc3BsYXlOYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgcmVhZE1ldGhvZCA9IHByb3BlcnR5RGVzY3JpcHRvci5nZXRSZWFkTWV0aG9kKCk7Ci0gICAgICAgICAgICAgICAgYWRkcmVzc09iamVjdCA9IHJlYWRNZXRob2QuaW52b2tlKG9iaiwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgaWYgKGV4cGVjdGVkQWRkcmVzc0NvdW50IT0wKSB7Ci0gICAgICAgICAgICAgICAgICAgIE9iamVjdFtdIG9iakFycmF5ID0gKE9iamVjdFtdKWFkZHJlc3NPYmplY3Q7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZEFkZHJlc3NDb3VudCxvYmpBcnJheS5sZW5ndGgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvb3RoZXIvUG9wdWxhdGVNaW5PY2N1cnMwVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9wb3B1bGF0ZS9vdGhlci9Qb3B1bGF0ZU1pbk9jY3VyczBUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0YmY3ZDkuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9wb3B1bGF0ZS9vdGhlci9Qb3B1bGF0ZU1pbk9jY3VyczBUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5wb3B1bGF0ZS5vdGhlcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLnV0aWwuU3RBWFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLnBvcHVsYXRlLlV0aWw7Ci0KLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmJlYW5zLkJlYW5JbmZvOwotaW1wb3J0IGphdmEuYmVhbnMuSW50cm9zcGVjdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmJlYW5zLkludHJvc3BlY3RvcjsKLWltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotCi1wdWJsaWMgY2xhc3MgUG9wdWxhdGVNaW5PY2N1cnMwVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIC8qCi0gICAgIDx4czplbGVtZW50IG5hbWU9IkEiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCSA8eHM6ZWxlbWVudCBuYW1lPSJCIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkgPHhzOmVsZW1lbnQgbmFtZT0iQyIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JIDx4czplbGVtZW50IG5hbWU9IkQiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICovCi0KLSAgICAvLyBlbGVtZW50IEQgaXMgbWlzc2luZwotICAgIHByaXZhdGUgU3RyaW5nIHhtbFN0cmluZzEgPSAiPHJvb3QgeG1sbnM9XCJodHRwOi8vdGVzdC5vcmdcIj4iICsKLSAgICAgICAgICAgICI8QT5JIGFtIEE8L0E+IiArCi0gICAgICAgICAgICAiPEI+SSBhbSBCMTwvQj4iICsKLSAgICAgICAgICAgICI8Qj5JIGFtIEIyPC9CPiIgKwotICAgICAgICAgICAgIjxDPkkgYW0gQzE8L0M+IiArCi0gICAgICAgICAgICAiPEM+SSBhbSBDMjwvQz4iICsKLSAgICAgICAgICAgICI8L3Jvb3Q+IjsKLQotICAgIC8vQiBlbGVtZW50cyBhcmUgbWlzc2luZwotICAgIHByaXZhdGUgU3RyaW5nIHhtbFN0cmluZzIgPSAiPHJvb3QgeG1sbnM9XCJodHRwOi8vdGVzdC5vcmdcIj4iICsKLSAgICAgICAgICAgICI8QT5JIGFtIEE8L0E+IiArCi0gICAgICAgICAgICAiPEM+SSBhbSBCMjwvQz4iICsKLSAgICAgICAgICAgICI8Qz5JIGFtIEIyPC9DPiIgKwotICAgICAgICAgICAgIjxEPkkgYW0gRDE8L0Q+IiArCi0gICAgICAgICAgICAiPC9yb290PiI7Ci0KLSAgICAvL09ubHkgQSBpcyBwcmVzZW50Ci0gICAgcHJpdmF0ZSBTdHJpbmcgeG1sU3RyaW5nMyA9ICI8cm9vdCB4bWxucz1cImh0dHA6Ly90ZXN0Lm9yZ1wiPiIgKwotICAgICAgICAgICAgIjxBPkkgYW0gQTwvQT4iICsKLSAgICAgICAgICAgICI8L3Jvb3Q+IjsKLQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBvcHVsYXRlMSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBwb3B1bGF0ZUFuZEFzc2VydCh4bWxTdHJpbmcxLCAyLCAiYiIpOwotICAgICAgICBwb3B1bGF0ZUFuZEFzc2VydCh4bWxTdHJpbmcxLCAyLCAiYyIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQb3B1bGF0ZTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgcG9wdWxhdGVBbmRBc3NlcnQoeG1sU3RyaW5nMiwgMCwgImIiKTsKLSAgICAgICAgcG9wdWxhdGVBbmRBc3NlcnQoeG1sU3RyaW5nMiwgMiwgImMiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UG9wdWxhdGUzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHBvcHVsYXRlQW5kQXNzZXJ0KHhtbFN0cmluZzMsIDAsICJiIik7Ci0gICAgICAgIHBvcHVsYXRlQW5kQXNzZXJ0KHhtbFN0cmluZzMsIDEsICJhIik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHBvcHVsYXRlQW5kQXNzZXJ0KFN0cmluZyBzLCBpbnQgZXhwZWN0ZWRDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGl0ZW10b1Rlc3QpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sCi0gICAgICAgICAgICBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLCBOb1N1Y2hNZXRob2RFeGNlcHRpb24sCi0gICAgICAgICAgICBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLAotICAgICAgICAgICAgSW50cm9zcGVjdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIFhNTFN0cmVhbVJlYWRlciByZWFkZXIgPQotICAgICAgICAgICAgICAgIFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHMuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICBDbGFzcyBjbGF6eiA9IENsYXNzLmZvck5hbWUoIm9yZy50ZXN0LlJvb3QiKTsKLSAgICAgICAgQ2xhc3MgaW5uZXJDbGF6eiA9IFV0aWwuZ2V0RmFjdG9yeShjbGF6eik7Ci0gICAgICAgIE1ldGhvZCBwYXJzZU1ldGhvZCA9IGlubmVyQ2xhenouZ2V0TWV0aG9kKCJwYXJzZSIsIG5ldyBDbGFzc1tde1hNTFN0cmVhbVJlYWRlci5jbGFzc30pOwotICAgICAgICBPYmplY3Qgb2JqID0gcGFyc2VNZXRob2QuaW52b2tlKG51bGwsIG5ldyBPYmplY3RbXXtyZWFkZXJ9KTsKLQotICAgICAgICBhc3NlcnROb3ROdWxsKG9iaik7Ci0KLSAgICAgICAgT2JqZWN0IHN0cmluZ0FycmF5ID0gbnVsbDsKLSAgICAgICAgQmVhbkluZm8gYmVhbkluZm8gPSBJbnRyb3NwZWN0b3IuZ2V0QmVhbkluZm8ob2JqLmdldENsYXNzKCkpOwotICAgICAgICBQcm9wZXJ0eURlc2NyaXB0b3JbXSBwcm9wZXJ0eURlc2NyaXB0b3JzID0gYmVhbkluZm8uZ2V0UHJvcGVydHlEZXNjcmlwdG9ycygpOwotICAgICAgICBNZXRob2QgcmVhZE1ldGhvZDsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb3BlcnR5RGVzY3JpcHRvcnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFByb3BlcnR5RGVzY3JpcHRvciBwcm9wZXJ0eURlc2NyaXB0b3IgPSBwcm9wZXJ0eURlc2NyaXB0b3JzW2ldOwotICAgICAgICAgICAgaWYgKGl0ZW10b1Rlc3QuZXF1YWxzKHByb3BlcnR5RGVzY3JpcHRvci5nZXREaXNwbGF5TmFtZSgpKSkgewotICAgICAgICAgICAgICAgIHJlYWRNZXRob2QgPSBwcm9wZXJ0eURlc2NyaXB0b3IuZ2V0UmVhZE1ldGhvZCgpOwotICAgICAgICAgICAgICAgIHN0cmluZ0FycmF5ID0gcmVhZE1ldGhvZC5pbnZva2Uob2JqLCBudWxsKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChleHBlY3RlZENvdW50IT0wKXsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoc3RyaW5nQXJyYXkpOwotICAgICAgICAgICAgU3RyaW5nW10gYXJyYXkgPSAoU3RyaW5nW10pIHN0cmluZ0FycmF5OwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGFycmF5Lmxlbmd0aCwgZXhwZWN0ZWRDb3VudCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvb3RoZXIvUG9wdWxhdGVNaXhlZE1pbm9jY3VyczBUZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3BvcHVsYXRlL290aGVyL1BvcHVsYXRlTWl4ZWRNaW5vY2N1cnMwVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2JlMGJmLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvb3RoZXIvUG9wdWxhdGVNaXhlZE1pbm9jY3VyczBUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5wb3B1bGF0ZS5vdGhlcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLnV0aWwuU3RBWFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLnBvcHVsYXRlLlV0aWw7Ci0KLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmJlYW5zLkJlYW5JbmZvOwotaW1wb3J0IGphdmEuYmVhbnMuSW50cm9zcGVjdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmJlYW5zLkludHJvc3BlY3RvcjsKLWltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotCi1wdWJsaWMgY2xhc3MgUG9wdWxhdGVNaXhlZE1pbm9jY3VyczBUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgLyoKLQotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJpbmdMaXN0UmVzcG9uc2VFbGVtZW50IiB0eXBlPSJ0bnM6U3RyaW5nTGlzdFJlc3BvbnNlVHlwZSIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iU3RyaW5nTGlzdFJlc3BvbnNlVHlwZSI+Ci0gICAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cmluZ0xpc3QiIHR5cGU9InRuczpTdHJpbmdMaXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhjZXB0aW9uIiB0eXBlPSJ0bnM6RXhjZXB0aW9uVHlwZSIvPgotICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJTdHJpbmdMaXN0Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAqLwotCi0KLSAgICBwcml2YXRlIFN0cmluZyB4bWxTdHJpbmcxID0gIjxzdHJpbmdMaXN0UmVzcG9uc2VFbGVtZW50ICIgKwotICAgICAgICAgICAgInhtbG5zPVwiaHR0cDovL3JlY3Vyc2lvbjEub3JnXCI+IiArCi0gICAgICAgICAgICAiPHN0cmluZ0xpc3Q+IiArCi0gICAgICAgICAgICAiPHM+aXRlbTE8L3M+IiArCi0gICAgICAgICAgICAiPHM+aXRlbTI8L3M+IiArCi0gICAgICAgICAgICAiPHM+aXRlbTM8L3M+IiArCi0gICAgICAgICAgICAiPC9zdHJpbmdMaXN0PiIgKwotICAgICAgICAgICAgIjwvc3RyaW5nTGlzdFJlc3BvbnNlRWxlbWVudD4iOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgeG1sU3RyaW5nMiA9ICI8c3RyaW5nTGlzdFJlc3BvbnNlRWxlbWVudCAiICsKLSAgICAgICAgICAgICJ4bWxucz1cImh0dHA6Ly9yZWN1cnNpb24xLm9yZ1wiPiIgKwotICAgICAgICAgICAgIjxzdHJpbmdMaXN0PiIgKwotICAgICAgICAgICAgIjwvc3RyaW5nTGlzdD4iICsKLSAgICAgICAgICAgICI8L3N0cmluZ0xpc3RSZXNwb25zZUVsZW1lbnQ+IjsKLQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBvcHVsYXRlMSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBwb3B1bGF0ZUFuZEFzc2VydCh4bWxTdHJpbmcxLDMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQb3B1bGF0ZTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgcG9wdWxhdGVBbmRBc3NlcnQoeG1sU3RyaW5nMiwwKTsKLSAgICB9Ci0KLQotICAgIHByaXZhdGUgdm9pZCBwb3B1bGF0ZUFuZEFzc2VydChTdHJpbmcgcyxpbnQgY291bnQpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24sIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50cm9zcGVjdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIFhNTFN0cmVhbVJlYWRlciByZWFkZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShzLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgQ2xhc3MgY2xhenogPSBDbGFzcy5mb3JOYW1lKCJvcmcucmVjdXJzaW9uMS5TdHJpbmdMaXN0UmVzcG9uc2VFbGVtZW50Iik7Ci0gICAgICAgIENsYXNzIGlubmVyQ2xhenogPSBVdGlsLmdldEZhY3RvcnkoY2xhenopOwotICAgICAgICBNZXRob2QgcGFyc2VNZXRob2QgPSBpbm5lckNsYXp6LmdldE1ldGhvZCgicGFyc2UiLCBuZXcgQ2xhc3NbXXtYTUxTdHJlYW1SZWFkZXIuY2xhc3N9KTsKLSAgICAgICAgT2JqZWN0IG9iaiA9IHBhcnNlTWV0aG9kLmludm9rZShudWxsLCBuZXcgT2JqZWN0W117cmVhZGVyfSk7Ci0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChvYmopOwotCi0gICAgICAgIE9iamVjdCBzdHJpbmdMaXN0UmVzcG9uc2VFbGVtZW50ID0gbnVsbDsKLSAgICAgICAgQmVhbkluZm8gYmVhbkluZm8gPSBJbnRyb3NwZWN0b3IuZ2V0QmVhbkluZm8ob2JqLmdldENsYXNzKCkpOwotICAgICAgICBQcm9wZXJ0eURlc2NyaXB0b3JbXSBwcm9wZXJ0eURlc2NyaXB0b3JzID0gYmVhbkluZm8uZ2V0UHJvcGVydHlEZXNjcmlwdG9ycygpOwotICAgICAgICBNZXRob2QgcmVhZE1ldGhvZDsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb3BlcnR5RGVzY3JpcHRvcnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFByb3BlcnR5RGVzY3JpcHRvciBwcm9wZXJ0eURlc2NyaXB0b3IgPSBwcm9wZXJ0eURlc2NyaXB0b3JzW2ldOwotICAgICAgICAgICAgU3RyaW5nIGRpc3BsYXlOYW1lID0gcHJvcGVydHlEZXNjcmlwdG9yLmdldERpc3BsYXlOYW1lKCk7Ci0gICAgICAgICAgICBpZiAoInN0cmluZ0xpc3RSZXNwb25zZUVsZW1lbnQiLmVxdWFscyhkaXNwbGF5TmFtZSkpIHsKLSAgICAgICAgICAgICAgICByZWFkTWV0aG9kID0gcHJvcGVydHlEZXNjcmlwdG9yLmdldFJlYWRNZXRob2QoKTsKLSAgICAgICAgICAgICAgICBzdHJpbmdMaXN0UmVzcG9uc2VFbGVtZW50ID0gcmVhZE1ldGhvZC5pbnZva2Uob2JqLCBudWxsKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGFzc2VydE5vdE51bGwoc3RyaW5nTGlzdFJlc3BvbnNlRWxlbWVudCk7Ci0KLSAgICAgICAgYmVhbkluZm8gPSBJbnRyb3NwZWN0b3IuZ2V0QmVhbkluZm8oc3RyaW5nTGlzdFJlc3BvbnNlRWxlbWVudC5nZXRDbGFzcygpKTsKLSAgICAgICAgcHJvcGVydHlEZXNjcmlwdG9ycyA9IGJlYW5JbmZvLmdldFByb3BlcnR5RGVzY3JpcHRvcnMoKTsKLSAgICAgICAgT2JqZWN0IHN0cmluZ0FycmF5ID0gbnVsbDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9wZXJ0eURlc2NyaXB0b3JzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBQcm9wZXJ0eURlc2NyaXB0b3IgcHJvcGVydHlEZXNjcmlwdG9yID0gcHJvcGVydHlEZXNjcmlwdG9yc1tpXTsKLSAgICAgICAgICAgIFN0cmluZyBkaXNwbGF5TmFtZSA9IHByb3BlcnR5RGVzY3JpcHRvci5nZXREaXNwbGF5TmFtZSgpOwotICAgICAgICAgICAgaWYgKCJzdHJpbmdMaXN0Ii5lcXVhbHMoZGlzcGxheU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgcmVhZE1ldGhvZCA9IHByb3BlcnR5RGVzY3JpcHRvci5nZXRSZWFkTWV0aG9kKCk7Ci0gICAgICAgICAgICAgICAgc3RyaW5nQXJyYXkgPSByZWFkTWV0aG9kLmludm9rZShzdHJpbmdMaXN0UmVzcG9uc2VFbGVtZW50LCBudWxsKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGFzc2VydE5vdE51bGwoc3RyaW5nQXJyYXkpOwotCi0gICAgICAgIGJlYW5JbmZvID0gSW50cm9zcGVjdG9yLmdldEJlYW5JbmZvKHN0cmluZ0FycmF5LmdldENsYXNzKCkpOwotICAgICAgICBwcm9wZXJ0eURlc2NyaXB0b3JzID0gYmVhbkluZm8uZ2V0UHJvcGVydHlEZXNjcmlwdG9ycygpOwotICAgICAgICBPYmplY3Qgc0FycmF5ID0gbnVsbDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9wZXJ0eURlc2NyaXB0b3JzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBQcm9wZXJ0eURlc2NyaXB0b3IgcHJvcGVydHlEZXNjcmlwdG9yID0gcHJvcGVydHlEZXNjcmlwdG9yc1tpXTsKLSAgICAgICAgICAgIFN0cmluZyBkaXNwbGF5TmFtZSA9IHByb3BlcnR5RGVzY3JpcHRvci5nZXREaXNwbGF5TmFtZSgpOwotICAgICAgICAgICAgaWYgKCJzdHJpbmdMaXN0Ii5lcXVhbHMoZGlzcGxheU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgcmVhZE1ldGhvZCA9IHByb3BlcnR5RGVzY3JpcHRvci5nZXRSZWFkTWV0aG9kKCk7Ci0gICAgICAgICAgICAgICAgc0FycmF5ID0gcmVhZE1ldGhvZC5pbnZva2Uoc3RyaW5nQXJyYXksIG51bGwpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChzQXJyYXkhPW51bGwpewotICAgICAgICAgICAgT2JqZWN0W10gYXJyYXkgPSAoT2JqZWN0W10pc0FycmF5OwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGNvdW50LGFycmF5Lmxlbmd0aCk7Ci0gICAgICAgIH0KLQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvb3RoZXIvUG9wdWxhdGVQYXJ0aWNsZUFsbFRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvb3RoZXIvUG9wdWxhdGVQYXJ0aWNsZUFsbFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU1NmYxNS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3BvcHVsYXRlL290aGVyL1BvcHVsYXRlUGFydGljbGVBbGxUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLnBvcHVsYXRlLm90aGVyOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5TdEFYVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEucG9wdWxhdGUuVXRpbDsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuYmVhbnMuQmVhbkluZm87Ci1pbXBvcnQgamF2YS5iZWFucy5JbnRyb3NwZWN0b3I7Ci1pbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci0KLXB1YmxpYyBjbGFzcyBQb3B1bGF0ZVBhcnRpY2xlQWxsVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICBwcml2YXRlIFN0cmluZyB4bWxTdHJpbmcgPSAiPG15UGFydGljbGVBbGxFbGVtZW50IHhtbG5zPVwiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy90eXBlc1wiPiIgKwotICAgICAgICAgICAgIjx2YXJGbG9hdD4zLjM8L3ZhckZsb2F0PiIgKwotICAgICAgICAgICAgIjx2YXJTdHJpbmc+Zm9vPC92YXJTdHJpbmc+IiArCi0gICAgICAgICAgICAiPC9teVBhcnRpY2xlQWxsRWxlbWVudD4iOwotCi0gICAgcHVibGljIHZvaWQgdGVzdFBvcHVsYXRlKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLQotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oeG1sU3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgQ2xhc3MgY2xhenogPSBDbGFzcy5mb3JOYW1lKCJvcmcuc29hcGludGVyb3AudHlwZXMuTXlQYXJ0aWNsZUFsbEVsZW1lbnQiKTsKLSAgICAgICAgQ2xhc3MgaW5uZXJDbGF6eiA9IFV0aWwuZ2V0RmFjdG9yeShjbGF6eik7Ci0gICAgICAgIE1ldGhvZCBwYXJzZU1ldGhvZCA9IGlubmVyQ2xhenouZ2V0TWV0aG9kKCJwYXJzZSIsbmV3IENsYXNzW117WE1MU3RyZWFtUmVhZGVyLmNsYXNzfSk7Ci0gICAgICAgIE9iamVjdCBvYmogPSBwYXJzZU1ldGhvZC5pbnZva2UobnVsbCxuZXcgT2JqZWN0W117cmVhZGVyfSk7Ci0KLSAgICAgICAgT2JqZWN0IG15UGFydGljbGVBbGxFbGVtZW50ID0gbnVsbDsKLSAgICAgICAgQmVhbkluZm8gYmVhbkluZm8gPSAgSW50cm9zcGVjdG9yLmdldEJlYW5JbmZvKG9iai5nZXRDbGFzcygpKTsKLSAgICAgICAgUHJvcGVydHlEZXNjcmlwdG9yW10gcHJvcGVydHlEZXNjcmlwdG9ycyA9IGJlYW5JbmZvLmdldFByb3BlcnR5RGVzY3JpcHRvcnMoKTsKLSAgICAgICAgTWV0aG9kIHJlYWRNZXRob2Q7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvcGVydHlEZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgUHJvcGVydHlEZXNjcmlwdG9yIHByb3BlcnR5RGVzY3JpcHRvciA9IHByb3BlcnR5RGVzY3JpcHRvcnNbaV07Ci0gICAgICAgICAgICBpZiAoIm15UGFydGljbGVBbGxFbGVtZW50Ii5lcXVhbHMocHJvcGVydHlEZXNjcmlwdG9yLmdldERpc3BsYXlOYW1lKCkpKXsKLSAgICAgICAgICAgICAgICByZWFkTWV0aG9kID0gcHJvcGVydHlEZXNjcmlwdG9yLmdldFJlYWRNZXRob2QoKTsKLSAgICAgICAgICAgICAgICBteVBhcnRpY2xlQWxsRWxlbWVudCA9IHJlYWRNZXRob2QuaW52b2tlKG9iaiwgKE9iamVjdFtdKSBudWxsKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBhc3NlcnROb3ROdWxsKG15UGFydGljbGVBbGxFbGVtZW50KTsKLQotICAgICAgICBCZWFuSW5mbyBzdHJ1Y3RCZWFuSW5mbyA9ICBJbnRyb3NwZWN0b3IuZ2V0QmVhbkluZm8obXlQYXJ0aWNsZUFsbEVsZW1lbnQuZ2V0Q2xhc3MoKSk7Ci0gICAgICAgIFByb3BlcnR5RGVzY3JpcHRvcltdIHN0cnVjdFByb3BlcnR5RGVzY3JpcHRvcnMgPSBzdHJ1Y3RCZWFuSW5mby5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RydWN0UHJvcGVydHlEZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgUHJvcGVydHlEZXNjcmlwdG9yIHByb3BlcnR5RGVzY3JpcHRvciA9IHN0cnVjdFByb3BlcnR5RGVzY3JpcHRvcnNbaV07Ci0gICAgICAgICAgICBpZiAoInZhckZsb2F0Ii5lcXVhbHMocHJvcGVydHlEZXNjcmlwdG9yLmdldERpc3BsYXlOYW1lKCkpKXsKLSAgICAgICAgICAgICAgICByZWFkTWV0aG9kID0gcHJvcGVydHlEZXNjcmlwdG9yLmdldFJlYWRNZXRob2QoKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoInZhckZsb2F0IGlzIG5vdCBwcm9wZXJseSBzZXQiLG5ldyBGbG9hdCgzLjMpLAotICAgICAgICAgICAgICAgICAgICAgICAgcmVhZE1ldGhvZC5pbnZva2UobXlQYXJ0aWNsZUFsbEVsZW1lbnQsIChPYmplY3RbXSkgbnVsbCkpOwotCi0gICAgICAgICAgICB9ZWxzZSBpZiAoInZhclN0cmluZyIuZXF1YWxzKHByb3BlcnR5RGVzY3JpcHRvci5nZXREaXNwbGF5TmFtZSgpKSl7Ci0gICAgICAgICAgICAgICAgcmVhZE1ldGhvZCA9IHByb3BlcnR5RGVzY3JpcHRvci5nZXRSZWFkTWV0aG9kKCk7Ci0gICAgICAgICAgICAgICAgLy90aGlzIHNob3VsZCBub3QgYmUgc2V0ICEgLSBpdCBzaG91bGQgcmV0dXJuIHplcm8KLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoInZhclN0cmluZyBpcyBub3QgcHJvcGVybHkgc2V0IiwiZm9vIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRNZXRob2QuaW52b2tlKG15UGFydGljbGVBbGxFbGVtZW50LCAoT2JqZWN0W10pIG51bGwpKTsKLQotICAgICAgICAgICAgfWVsc2UgaWYgKCJ2YXJJbnQiLmVxdWFscyhwcm9wZXJ0eURlc2NyaXB0b3IuZ2V0RGlzcGxheU5hbWUoKSkpewotICAgICAgICAgICAgICAgIHJlYWRNZXRob2QgPSBwcm9wZXJ0eURlc2NyaXB0b3IuZ2V0UmVhZE1ldGhvZCgpOwotICAgICAgICAgICAgICAgIC8vdGhpcyBzaG91bGQgbm90IGJlIHNldCAhIC0gaXQgc2hvdWxkIHJldHVybiB6ZXJvCi0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ2YXJJbnQgaXMgbm90IHByb3Blcmx5IHNldCIsbmV3IEludGVnZXIoMCksCi0gICAgICAgICAgICAgICAgICAgICAgICByZWFkTWV0aG9kLmludm9rZShteVBhcnRpY2xlQWxsRWxlbWVudCwgKE9iamVjdFtdKSBudWxsKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvb3RoZXIvUG9wdWxhdGVSZWN1cnNpdmVUZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3BvcHVsYXRlL290aGVyL1BvcHVsYXRlUmVjdXJzaXZlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjQ3Y2E2Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvb3RoZXIvUG9wdWxhdGVSZWN1cnNpdmVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLnBvcHVsYXRlLm90aGVyOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5TdEFYVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEucG9wdWxhdGUuVXRpbDsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuYmVhbnMuQmVhbkluZm87Ci1pbXBvcnQgamF2YS5iZWFucy5JbnRyb3NwZWN0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuYmVhbnMuSW50cm9zcGVjdG9yOwotaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci0KLXB1YmxpYyBjbGFzcyBQb3B1bGF0ZVJlY3Vyc2l2ZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLS8vIGFsbCBhcmUgcHJlc2VudAotICAgIHByaXZhdGUgU3RyaW5nIHhtbFN0cmluZzEgPSAiPEUgeG1sbnM9XCJodHRwOi8vcmVjdXJzaW9uLm9yZ1wiPiIgKwotICAgICAgICAgICAgIjxFPnRlc3Q8L0U+IiArCi0gICAgICAgICAgICAiPC9FPiI7Ci0KLQotCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UG9wdWxhdGUxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHBvcHVsYXRlQW5kQXNzZXJ0KHhtbFN0cmluZzEpOwotICAgIH0KLQotCi0gICAgcHJpdmF0ZSB2b2lkIHBvcHVsYXRlQW5kQXNzZXJ0KFN0cmluZyBzCi0gICAgKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLCBOb1N1Y2hNZXRob2RFeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludHJvc3BlY3Rpb25FeGNlcHRpb24gewotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ocy5nZXRCeXRlcygpKSk7Ci0gICAgICAgIENsYXNzIGNsYXp6ID0gQ2xhc3MuZm9yTmFtZSgib3JnLnJlY3Vyc2lvbi5FIik7Ci0gICAgICAgIENsYXNzIGlubmVyQ2xhenogPSBVdGlsLmdldEZhY3RvcnkoY2xhenopOwotICAgICAgICBNZXRob2QgcGFyc2VNZXRob2QgPSBpbm5lckNsYXp6LmdldE1ldGhvZCgicGFyc2UiLCBuZXcgQ2xhc3NbXXtYTUxTdHJlYW1SZWFkZXIuY2xhc3N9KTsKLSAgICAgICAgT2JqZWN0IG9iaiA9IHBhcnNlTWV0aG9kLmludm9rZShudWxsLCBuZXcgT2JqZWN0W117cmVhZGVyfSk7Ci0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChvYmopOwotCi0gICAgICAgIE9iamVjdCBlT2JqZWN0ID0gbnVsbDsKLSAgICAgICAgQmVhbkluZm8gYmVhbkluZm8gPSBJbnRyb3NwZWN0b3IuZ2V0QmVhbkluZm8ob2JqLmdldENsYXNzKCkpOwotICAgICAgICBQcm9wZXJ0eURlc2NyaXB0b3JbXSBwcm9wZXJ0eURlc2NyaXB0b3JzID0gYmVhbkluZm8uZ2V0UHJvcGVydHlEZXNjcmlwdG9ycygpOwotICAgICAgICBNZXRob2QgcmVhZE1ldGhvZDsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb3BlcnR5RGVzY3JpcHRvcnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFByb3BlcnR5RGVzY3JpcHRvciBwcm9wZXJ0eURlc2NyaXB0b3IgPSBwcm9wZXJ0eURlc2NyaXB0b3JzW2ldOwotICAgICAgICAgICAgaWYgKCJlIi5lcXVhbHMocHJvcGVydHlEZXNjcmlwdG9yLmdldERpc3BsYXlOYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgcmVhZE1ldGhvZCA9IHByb3BlcnR5RGVzY3JpcHRvci5nZXRSZWFkTWV0aG9kKCk7Ci0gICAgICAgICAgICAgICAgZU9iamVjdCA9IHJlYWRNZXRob2QuaW52b2tlKG9iaiwgbnVsbCk7Ci0KLSAgICAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKGVPYmplY3QpOwotCi0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShlT2JqZWN0LmdldENsYXNzKCkuZXF1YWxzKENsYXNzLmZvck5hbWUoIm9yZy5yZWN1cnNpb24uVHlwZUUiKSkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotCi0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvc2ltcGxlL0Fic3RyYWN0U2ltcGxlUG9wdWxhdGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3BvcHVsYXRlL3NpbXBsZS9BYnN0cmFjdFNpbXBsZVBvcHVsYXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDU5NWNiLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvc2ltcGxlL0Fic3RyYWN0U2ltcGxlUG9wdWxhdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5wb3B1bGF0ZS5zaW1wbGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5TdEFYVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEucG9wdWxhdGUuVXRpbDsKLWltcG9ydCBvcmcuY3VzdG9tbW9ua2V5LnhtbHVuaXQuWE1MVGVzdENhc2U7Ci0KLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTE91dHB1dEZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YS5iZWFucy5CZWFuSW5mbzsKLWltcG9ydCBqYXZhLmJlYW5zLkludHJvc3BlY3RvcjsKLWltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U2ltcGxlUG9wdWxhdGVyIGV4dGVuZHMgWE1MVGVzdENhc2UgewotCi0gICAgLy8gZm9yY2Ugb3RoZXJzIHRvIGltcGxlbWVudCB0aGlzIG1ldGhvZAotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHRlc3RQb3B1bGF0ZSgpIHRocm93cyBFeGNlcHRpb247Ci0KLSAgICBwcm90ZWN0ZWQgIFN0cmluZyBjbGFzc05hbWU9IG51bGw7Ci0gICAgcHJvdGVjdGVkIENsYXNzIHByb3BlcnR5Q2xhc3MgPSBudWxsOwotCi0KLSAgICAvKioKLSAgICAgKiAgU2ltcGxlIHJldXNhYmxlIG1ldGhvZCB0byBtYWtlIG9iamVjdCBpbnN0YW5jZXMgdmlhIHJlZmxlY3Rpb24KLSAgICAgKiBAcGFyYW0gdGVzdFN0cmluZwotICAgICAqIEBwYXJhbSBjbGFzc05hbWUKLSAgICAgKiBAcmV0dXJuCi0gICAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IHByb2Nlc3MoU3RyaW5nIHRlc3RTdHJpbmcsU3RyaW5nIGNsYXNzTmFtZSkgdGhyb3dzIEV4Y2VwdGlvbnsKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHJlYWRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHRlc3RTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICBDbGFzcyBjbGF6eiA9IENsYXNzLmZvck5hbWUoY2xhc3NOYW1lKTsKLSAgICAgICAgQ2xhc3MgaW5uZXJDbGF6eiA9IFV0aWwuZ2V0RmFjdG9yeShjbGF6eik7Ci0gICAgICAgIE1ldGhvZCBwYXJzZU1ldGhvZCA9IGlubmVyQ2xhenouZ2V0TWV0aG9kKCJwYXJzZSIsbmV3IENsYXNzW117WE1MU3RyZWFtUmVhZGVyLmNsYXNzfSk7Ci0gICAgICAgIE9iamVjdCBvYmogPSBwYXJzZU1ldGhvZC5pbnZva2UobnVsbCxuZXcgT2JqZWN0W117cmVhZGVyfSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwob2JqKTsKLQotICAgICAgICByZXR1cm4gb2JqOwotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2ltcGxlIG1ldGhvZCB0byBjb21wYXJlLiBNYXkgYmUgb3ZlcnJpZGRlbgotICAgICAqIEBwYXJhbSB4bWxUb1NldAotICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgY2hlY2tWYWx1ZShTdHJpbmcgeG1sVG9TZXQsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE9iamVjdCBvID0gcHJvY2Vzcyh4bWxUb1NldCwgY2xhc3NOYW1lKTsKLSAgICAgICAgQ2xhc3MgYmVhbkNsYXNzID0gQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUpOwotICAgICAgICBCZWFuSW5mbyBpbmZvID0gSW50cm9zcGVjdG9yLmdldEJlYW5JbmZvKGJlYW5DbGFzcyk7Ci0gICAgICAgIFByb3BlcnR5RGVzY3JpcHRvcltdIHByb3BEZXNjcyA9IGluZm8uZ2V0UHJvcGVydHlEZXNjcmlwdG9ycygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb3BEZXNjcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgUHJvcGVydHlEZXNjcmlwdG9yIHByb3BEZXNjID0gcHJvcERlc2NzW2ldOwotICAgICAgICAgICAgaWYgIChwcm9wRGVzYy5nZXRQcm9wZXJ0eVR5cGUoKS5lcXVhbHMocHJvcGVydHlDbGFzcykpewotICAgICAgICAgICAgICAgIFN0cmluZyBzID0gY29udmVydFRvU3RyaW5nKHByb3BEZXNjLmdldFJlYWRNZXRob2QoKS5pbnZva2UobywKLSAgICAgICAgICAgICAgICAgICAgICAgIChPYmplY3RbXSkgbnVsbCkpOwotICAgICAgICAgICAgICAgIGNvbXBhcmUodmFsdWUscyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgIC8qKgotICAgICAqIENvbXBhcmVzIHNlcmlhbGl6YXRpb25zIC0gbWF5IGJlIG92ZXJyaWRkZW4KLSAgICAgKiBAcGFyYW0gbwotICAgICAqIEBwYXJhbSB4bWxUb1NldAotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgQ29tcGFyZU9NRWxlbW50U2VyaWFsaXphdGlvbnMoT2JqZWN0IG8sIFN0cmluZyB4bWxUb1NldCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE9NRWxlbWVudCBlbGVtZW50ID0gZ2V0T01FbGVtZW50KG8pOwotICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgWE1MU3RyZWFtV3JpdGVyIHdyaXRlciA9IFhNTE91dHB1dEZhY3RvcnkubmV3SW5zdGFuY2UoKS5jcmVhdGVYTUxTdHJlYW1Xcml0ZXIoYmFvcyk7Ci0gICAgICAgIGVsZW1lbnQuc2VyaWFsaXplKHdyaXRlcik7Ci0gICAgICAgIHdyaXRlci5mbHVzaCgpOwotCi0gICAgICAgIGFzc2VydFhNTEVxdWFsKGJhb3MudG9TdHJpbmcoKSx4bWxUb1NldCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IE9NIGVsZW1lbnQgdmlhIHJlZmxlY3Rpb24KLSAgICAgKiBAcGFyYW0gYmVhbgotICAgICAqIEByZXR1cm4KLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCBPTUVsZW1lbnQgZ2V0T01FbGVtZW50KE9iamVjdCBiZWFuKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgTWV0aG9kIG1ldGhvZCA9IGJlYW4uZ2V0Q2xhc3MoKS5nZXRNZXRob2QoImdldE9NRWxlbWVudCIsIG5ldyBDbGFzc1tdewotICAgICAgICAgICAgICAgIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUuY2xhc3MsCi0gICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkuY2xhc3N9KTsKLQotICAgICAgICByZXR1cm4gKE9NRWxlbWVudCkgbWV0aG9kLmludm9rZShiZWFuLCBuZXcgT2JqZWN0W117bnVsbCwgT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCl9KTsKLQotICAgIH0KLSAgICAvKioKLSAgICAgKiB2YWx1ZSBjb21wYXJpc29tCi0gICAgICogQHBhcmFtIHZhbDEKLSAgICAgKiBAcGFyYW0gdmFsMgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGNvbXBhcmUoU3RyaW5nIHZhbDEsU3RyaW5nIHZhbDIpewotICAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbDEsdmFsMik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogY29udmVyc2lvbiAtIG1heSBiZSBvdmVycmlkZGVucwotICAgICAqIEBwYXJhbSBvCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgY29udmVydFRvU3RyaW5nKE9iamVjdCBvKXsKLSAgICAgICAgcmV0dXJuIG8udG9TdHJpbmcoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3BvcHVsYXRlL3NpbXBsZS9TaW1wbGVUeXBlQW55VVJJUG9wdWxhdGVUZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3BvcHVsYXRlL3NpbXBsZS9TaW1wbGVUeXBlQW55VVJJUG9wdWxhdGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyNDFlMTkuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9wb3B1bGF0ZS9zaW1wbGUvU2ltcGxlVHlwZUFueVVSSVBvcHVsYXRlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5wb3B1bGF0ZS5zaW1wbGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLlVSSTsKLQotcHVibGljIGNsYXNzIFNpbXBsZVR5cGVBbnlVUklQb3B1bGF0ZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdFNpbXBsZVBvcHVsYXRlcnsKLSAgICBwcml2YXRlIFN0cmluZyB2YWx1ZXNbXSA9IHsiaHR0cDovL3d3dy53aXNjLmVkdS9ncmFkL2VkdWNhdGlvbi9tYXMvMjI5Lmh0bWwiLAotICAgICAgICAgICAgImZ0cDovL2dyYWQvZWR1Y2F0aW9uL21hcy8yMjkuaHRtbCIsCi0gICAgICAgICAgICAiaHR0cDovL21haWwuZ29vZ2xlLmNvbS9tYWlsLz9hdXRoPURRQUFBSEVBQUFDMDQxIn07Ci0gICAgcHJpdmF0ZSBTdHJpbmcgeG1sU3RyaW5nW10gPSB7Ci0gICAgICAgICAgICAiPGFueVVSSVBhcmFtIHhtbG5zPVwiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2RcIj4iICsgdmFsdWVzWzBdKyI8L2FueVVSSVBhcmFtPiIsCi0gICAgICAgICAgICAiPGFueVVSSVBhcmFtIHhtbG5zPVwiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2RcIj4iICsgdmFsdWVzWzFdKyI8L2FueVVSSVBhcmFtPiIsCi0gICAgICAgICAgICAiPGFueVVSSVBhcmFtIHhtbG5zPVwiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2RcIj4iICsgdmFsdWVzWzJdKyI8L2FueVVSSVBhcmFtPiIKLSAgICB9OwotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgY2xhc3NOYW1lID0gIm9yZy5zb2FwaW50ZXJvcC54c2QuQW55VVJJUGFyYW0iOwotICAgICAgICBwcm9wZXJ0eUNsYXNzID0gVVJJLmNsYXNzOwotICAgIH0KLQotCi0gICAgLy8gZm9yY2Ugb3RoZXJzIHRvIGltcGxlbWVudCB0aGlzIG1ldGhvZAotICAgIHB1YmxpYyB2b2lkIHRlc3RQb3B1bGF0ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgY2hlY2tWYWx1ZSh4bWxTdHJpbmdbaV0sdmFsdWVzW2ldKTsKLSAgICAgICAgfQotCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3BvcHVsYXRlL3NpbXBsZS9TaW1wbGVUeXBlQmFzZTY0QmluUG9wdWxhdGVUZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3BvcHVsYXRlL3NpbXBsZS9TaW1wbGVUeXBlQmFzZTY0QmluUG9wdWxhdGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhMTEzNmIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9wb3B1bGF0ZS9zaW1wbGUvU2ltcGxlVHlwZUJhc2U2NEJpblBvcHVsYXRlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5wb3B1bGF0ZS5zaW1wbGU7Ci0KLXB1YmxpYyBjbGFzcyBTaW1wbGVUeXBlQmFzZTY0QmluUG9wdWxhdGVUZXN0IGV4dGVuZHMgQWJzdHJhY3RTaW1wbGVQb3B1bGF0ZXJ7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgeG1sU3RyaW5nW10gPSB7Ci0gICAgICAgICAgICAiPGJhc2U2NEJpblBhcmFtIHhtbG5zPVwiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2RcIj5hYmNkQUJDRDwvYmFzZTY0QmluUGFyYW0+IiwKLSAgICAgICAgICAgICI8YmFzZTY0QmluUGFyYW0geG1sbnM9XCJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZFwiPmFiY2RBQkNEMDlyVDwvYmFzZTY0QmluUGFyYW0+IiwKLSAgICB9OwotCi0gICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGNsYXNzTmFtZSA9ICJvcmcuc29hcGludGVyb3AueHNkLkJhc2U2NEJpblBhcmFtIjsKLSAgICAgICAgcHJvcGVydHlDbGFzcyA9IGJ5dGVbXS5jbGFzczsKLSAgICB9Ci0gICAgLy8gZm9yY2Ugb3RoZXJzIHRvIGltcGxlbWVudCB0aGlzIG1ldGhvZAotICAgIHB1YmxpYyB2b2lkIHRlc3RQb3B1bGF0ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBwcm9jZXNzKHhtbFN0cmluZ1swXSwib3JnLnNvYXBpbnRlcm9wLnhzZC5CYXNlNjRCaW5QYXJhbSIpOwotICAgICAgICBwcm9jZXNzKHhtbFN0cmluZ1sxXSwib3JnLnNvYXBpbnRlcm9wLnhzZC5CYXNlNjRCaW5QYXJhbSIpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvc2ltcGxlL1NpbXBsZVR5cGVCb29sZWFuUG9wdWxhdGVUZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3BvcHVsYXRlL3NpbXBsZS9TaW1wbGVUeXBlQm9vbGVhblBvcHVsYXRlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDlkYTMyLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvc2ltcGxlL1NpbXBsZVR5cGVCb29sZWFuUG9wdWxhdGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLnBvcHVsYXRlLnNpbXBsZTsKLQotcHVibGljIGNsYXNzIFNpbXBsZVR5cGVCb29sZWFuUG9wdWxhdGVUZXN0IGV4dGVuZHMgQWJzdHJhY3RTaW1wbGVQb3B1bGF0ZXJ7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgdmFsdWVzW109IHsKLSAgICAgICAgICAgICJ0cnVlIiwKLSAgICAgICAgICAgICJmYWxzZSIKLSAgICB9OwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgeG1sU3RyaW5nW10gPSB7Ci0gICAgICAgICAgICAiPGJvb2xlYW5QYXJhbSB4bWxucz1cImh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkXCI+IisgdmFsdWVzWzBdICsiPC9ib29sZWFuUGFyYW0+IiwKLSAgICAgICAgICAgICI8Ym9vbGVhblBhcmFtIHhtbG5zPVwiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2RcIj4iKyB2YWx1ZXNbMV0gKyI8L2Jvb2xlYW5QYXJhbT4iLAotICAgIH07Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBjbGFzc05hbWUgPSJvcmcuc29hcGludGVyb3AueHNkLkJvb2xlYW5QYXJhbSI7Ci0gICAgICAgIHByb3BlcnR5Q2xhc3MgPSBib29sZWFuLmNsYXNzOwotICAgIH0KLQotICAgIC8vIGZvcmNlIG90aGVycyB0byBpbXBsZW1lbnQgdGhpcyBtZXRob2QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0UG9wdWxhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICBjaGVja1ZhbHVlKHhtbFN0cmluZ1tpXSx2YWx1ZXNbaV0pOwotICAgICAgICB9Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvc2ltcGxlL1NpbXBsZVR5cGVEYXRlUG9wdWxhdGVUZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3BvcHVsYXRlL3NpbXBsZS9TaW1wbGVUeXBlRGF0ZVBvcHVsYXRlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmU0Yzg0Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvc2ltcGxlL1NpbXBsZVR5cGVEYXRlUG9wdWxhdGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLnBvcHVsYXRlLnNpbXBsZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotCi1wdWJsaWMgY2xhc3MgU2ltcGxlVHlwZURhdGVQb3B1bGF0ZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdFNpbXBsZVBvcHVsYXRlcnsKLSAgICBwcml2YXRlIFN0cmluZyB2YWx1ZXNbXT17Ci0gICAgICAgICAgICAgICAgIjIwMDItMTAtMTBaIiwKLSAgICAgICAgICAgICAgICAiMjAwMC0xMi0zMSswNTozMCIsCi0gICAgICAgICAgICAgICAgIjIwMDItMDItMjhaIgotICAgIH0gOwotICAgIHByaXZhdGUgU3RyaW5nIHhtbFN0cmluZ1tdID0gewotICAgICAgICAgICAgIjxkYXRlUGFyYW0geG1sbnM9XCJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZFwiPiIrCi0gICAgICAgICAgICAgICAgICAgIENvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKENvbnZlcnRlclV0aWwuY29udmVydFRvRGF0ZSh2YWx1ZXNbMF0pKSArIjwvZGF0ZVBhcmFtPiIsCi0gICAgICAgICAgICAiPGRhdGVQYXJhbSB4bWxucz1cImh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkXCI+IisKLSAgICAgICAgICAgICAgICAgICAgQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcoQ29udmVydGVyVXRpbC5jb252ZXJ0VG9EYXRlKHZhbHVlc1sxXSkpKyI8L2RhdGVQYXJhbT4iLAotICAgICAgICAgICAgIjxkYXRlUGFyYW0geG1sbnM9XCJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZFwiPiIrCi0gICAgICAgICAgICAgICAgICAgIENvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKENvbnZlcnRlclV0aWwuY29udmVydFRvRGF0ZSh2YWx1ZXNbMl0pKSsiPC9kYXRlUGFyYW0+IgotICAgIH07Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBjbGFzc05hbWUgPSAib3JnLnNvYXBpbnRlcm9wLnhzZC5EYXRlUGFyYW0iOwotICAgICAgICBwcm9wZXJ0eUNsYXNzID0gamF2YS51dGlsLkRhdGUuY2xhc3M7Ci0gICAgfQotCi0gICAgLy8gZm9yY2Ugb3RoZXJzIHRvIGltcGxlbWVudCB0aGlzIG1ldGhvZAotICAgIHB1YmxpYyB2b2lkIHRlc3RQb3B1bGF0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIERhdGUgZGF0ZSA9IG51bGw7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGRhdGUgPSBDb252ZXJ0ZXJVdGlsLmNvbnZlcnRUb0RhdGUodmFsdWVzW2ldKTsKLSAgICAgICAgICAgIGNoZWNrVmFsdWUoeG1sU3RyaW5nW2ldLENvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGRhdGUpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgY29udmVydFRvU3RyaW5nKE9iamVjdCBvKSB7Ci0gICAgICAgIFN0cmluZyBzID0gQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcoKERhdGUpIG8pOwotICAgICAgICByZXR1cm4gczsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3BvcHVsYXRlL3NpbXBsZS9TaW1wbGVUeXBlRGF0ZVRpbWVQb3B1bGF0ZVRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvc2ltcGxlL1NpbXBsZVR5cGVEYXRlVGltZVBvcHVsYXRlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTVlMzMxLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvc2ltcGxlL1NpbXBsZVR5cGVEYXRlVGltZVBvcHVsYXRlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5wb3B1bGF0ZS5zaW1wbGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWw7Ci0KLWltcG9ydCBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7Ci1pbXBvcnQgamF2YS51dGlsLlRpbWVab25lOwotCi1wdWJsaWMgY2xhc3MgU2ltcGxlVHlwZURhdGVUaW1lUG9wdWxhdGVUZXN0IGV4dGVuZHMgQWJzdHJhY3RTaW1wbGVQb3B1bGF0ZXJ7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgdmFsdWVzW10gPXsiMjAwMi0xMC0xMFQxMjowMDowMCswNTowMCIsCi0gICAgICAgICAgICAiMjAwMC0xMi0zMVQxMTo1OTo1OS0wNTowMCIsCi0gICAgICAgICAgICAiMjAwMi0xMC0xMFQwNzowMDowMFoiCi0gICAgfTsKLSAgICBwcml2YXRlIFN0cmluZyB4bWxTdHJpbmdbXSA9IHsKLSAgICAgICAgICAgICI8ZGF0ZVRpbWVQYXJhbSB4bWxucz1cImh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkXCI+IisKLSAgICAgICAgICAgICAgICAgICAgQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcoQ29udmVydGVyVXRpbC5jb252ZXJ0VG9EYXRlVGltZSh2YWx1ZXNbMF0pKSArIjwvZGF0ZVRpbWVQYXJhbT4iLAotICAgICAgICAgICAgIjxkYXRlVGltZVBhcmFtIHhtbG5zPVwiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2RcIj4iKwotICAgICAgICAgICAgICAgICAgICBDb252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhDb252ZXJ0ZXJVdGlsLmNvbnZlcnRUb0RhdGVUaW1lKHZhbHVlc1sxXSkpKyI8L2RhdGVUaW1lUGFyYW0+IiwKLSAgICAgICAgICAgICI8ZGF0ZVRpbWVQYXJhbSB4bWxucz1cImh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkXCI+IisKLSAgICAgICAgICAgICAgICAgICAgQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcoQ29udmVydGVyVXRpbC5jb252ZXJ0VG9EYXRlVGltZSh2YWx1ZXNbMl0pKSsiPC9kYXRlVGltZVBhcmFtPiIKLSAgICB9OwotICAgIC8vIGZvcmNlIG90aGVycyB0byBpbXBsZW1lbnQgdGhpcyBtZXRob2QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0UG9wdWxhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gU2tpcCBmb3IgSkRLMS40Ci0gICAgICAgIGlmIChTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEudmVyc2lvbiIpLnN0YXJ0c1dpdGgoIjEuNC4iKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIENhbGVuZGFyIGNhbGVuZGFyOwotICAgICAgICBTaW1wbGVEYXRlRm9ybWF0IHNpbXBsZURhdGVGb3JtYXQgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgieXl5eS1NTS1kZCdUJ0hIOm1tOnNzLlNTUydaJyIpOwotICAgICAgICBzaW1wbGVEYXRlRm9ybWF0LnNldFRpbWVab25lKFRpbWVab25lLmdldFRpbWVab25lKCJHTVQiKSk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBjYWxlbmRhciA9IENvbnZlcnRlclV0aWwuY29udmVydFRvRGF0ZVRpbWUodmFsdWVzW2ldKTsKLSAgICAgICAgICAgIGNoZWNrVmFsdWUoeG1sU3RyaW5nW2ldLENvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGNhbGVuZGFyKSk7Ci0gICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGNsYXNzTmFtZSA9ICJvcmcuc29hcGludGVyb3AueHNkLkRhdGVUaW1lUGFyYW0iOwotICAgICAgICBwcm9wZXJ0eUNsYXNzID0gQ2FsZW5kYXIuY2xhc3M7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoT2JqZWN0IG8pIHsKLSAgICAgICAgcmV0dXJuIENvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKChDYWxlbmRhcikgbyk7Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvc2ltcGxlL1NpbXBsZVR5cGVEYXlQb3B1bGF0ZVRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvc2ltcGxlL1NpbXBsZVR5cGVEYXlQb3B1bGF0ZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZlY2RiNi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3BvcHVsYXRlL3NpbXBsZS9TaW1wbGVUeXBlRGF5UG9wdWxhdGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLnBvcHVsYXRlLnNpbXBsZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuRGF5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbDsKLQotcHVibGljIGNsYXNzIFNpbXBsZVR5cGVEYXlQb3B1bGF0ZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdFNpbXBsZVBvcHVsYXRlcnsKLSAgICBwcml2YXRlIFN0cmluZyB2YWx1ZXNbXSA9IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICItLS0wNSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiLS0tMDYiLAotICAgICAgICAgICAgICAgICAgICAgICAgIi0tLTEyIgotICAgIH07Ci0gICAgcHJpdmF0ZSBTdHJpbmcgeG1sU3RyaW5nW10gPSB7Ci0gICAgICAgICAgICAiPGRheVBhcmFtIHhtbG5zPVwiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2RcIj4iK3ZhbHVlc1swXSsiPC9kYXlQYXJhbT4iLAotICAgICAgICAgICAgIjxkYXlQYXJhbSB4bWxucz1cImh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkXCI+Iit2YWx1ZXNbMV0rIjwvZGF5UGFyYW0+IiwKLSAgICAgICAgICAgICI8ZGF5UGFyYW0geG1sbnM9XCJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZFwiPiIrdmFsdWVzWzJdKyI8L2RheVBhcmFtPiIKLSAgICB9OwotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgY2xhc3NOYW1lID0ib3JnLnNvYXBpbnRlcm9wLnhzZC5EYXlQYXJhbSI7Ci0gICAgICAgIHByb3BlcnR5Q2xhc3MgPSBEYXkuY2xhc3M7Ci0gICAgfQotCi0gICAgLy8gZm9yY2Ugb3RoZXJzIHRvIGltcGxlbWVudCB0aGlzIG1ldGhvZAotICAgIHB1YmxpYyB2b2lkIHRlc3RQb3B1bGF0ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGNoZWNrVmFsdWUoeG1sU3RyaW5nW2ldLHZhbHVlc1tpXSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhPYmplY3QgbykgewotICAgICAgICByZXR1cm4gQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcoKERheSlvKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvc2ltcGxlL1NpbXBsZVR5cGVEb3VibGVQb3B1bGF0ZVRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvc2ltcGxlL1NpbXBsZVR5cGVEb3VibGVQb3B1bGF0ZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhlOTI2MC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3BvcHVsYXRlL3NpbXBsZS9TaW1wbGVUeXBlRG91YmxlUG9wdWxhdGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLnBvcHVsYXRlLnNpbXBsZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbDsKLQotcHVibGljIGNsYXNzIFNpbXBsZVR5cGVEb3VibGVQb3B1bGF0ZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdFNpbXBsZVBvcHVsYXRlcnsKLSAgICBwcml2YXRlIFN0cmluZyB2YWx1ZXNbXT0gewotICAgICAgICAgICAgIjIwMzAwLjAwNTU0NDMzNDIyIiwKLSAgICAgICAgICAgICIyMDMwNDU1MzQyMzQiLAotICAgICAgICAgICAgIjY2NzMzLjAwNjA2MDQzNDMiCi0gICAgfTsKLSAgICBwcml2YXRlIFN0cmluZyB4bWxTdHJpbmdbXSA9IHsKLSAgICAgICAgICAgICI8ZG91YmxlUGFyYW0geG1sbnM9XCJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZFwiPiIrdmFsdWVzWzBdKyI8L2RvdWJsZVBhcmFtPiIsCi0gICAgICAgICAgICAiPGRvdWJsZVBhcmFtIHhtbG5zPVwiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2RcIj4iK3ZhbHVlc1sxXSsiPC9kb3VibGVQYXJhbT4iLAotICAgICAgICAgICAgIjxkb3VibGVQYXJhbSB4bWxucz1cImh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkXCI+Iit2YWx1ZXNbMl0rIjwvZG91YmxlUGFyYW0+IgotICAgIH07Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgIGNsYXNzTmFtZSA9ICJvcmcuc29hcGludGVyb3AueHNkLkRvdWJsZVBhcmFtIjsKLSAgICAgICBwcm9wZXJ0eUNsYXNzID0gZmxvYXQuY2xhc3M7Ci0gICAgfQotCi0gICAgLy8gZm9yY2Ugb3RoZXJzIHRvIGltcGxlbWVudCB0aGlzIG1ldGhvZAotICAgIHB1YmxpYyB2b2lkIHRlc3RQb3B1bGF0ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGNoZWNrVmFsdWUoeG1sU3RyaW5nW2ldLHZhbHVlc1tpXSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhPYmplY3QgbykgewotICAgICAgICByZXR1cm4gIENvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKChEb3VibGUpbykgOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvc2ltcGxlL1NpbXBsZVR5cGVEdXJhdGlvblBvcHVsYXRlVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9wb3B1bGF0ZS9zaW1wbGUvU2ltcGxlVHlwZUR1cmF0aW9uUG9wdWxhdGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2NWJlYmMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9wb3B1bGF0ZS9zaW1wbGUvU2ltcGxlVHlwZUR1cmF0aW9uUG9wdWxhdGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLnBvcHVsYXRlLnNpbXBsZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuRHVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsOwotCi1wdWJsaWMgY2xhc3MgU2ltcGxlVHlwZUR1cmF0aW9uUG9wdWxhdGVUZXN0IGV4dGVuZHMgQWJzdHJhY3RTaW1wbGVQb3B1bGF0ZXJ7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgdmFsdWVzW109IHsKLSAgICAgICAgICAgICJQMVkyTVQySCIsCi0gICAgICAgICAgICAiUDEzNDdNIiwKLSAgICAgICAgICAgICJQMFkxMzQ3TTBEIgotICAgIH07Ci0KLSAgICBwcml2YXRlIFN0cmluZyB4bWxTdHJpbmdbXSA9IHsKLSAgICAgICAgICAgICI8ZHVyYXRpb25QYXJhbSB4bWxucz1cImh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkXCI+Iit2YWx1ZXNbMF0rIjwvZHVyYXRpb25QYXJhbT4iLAotICAgICAgICAgICAgIjxkdXJhdGlvblBhcmFtIHhtbG5zPVwiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2RcIj4iK3ZhbHVlc1sxXSsiPC9kdXJhdGlvblBhcmFtPiIsCi0gICAgICAgICAgICAiPGR1cmF0aW9uUGFyYW0geG1sbnM9XCJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZFwiPiIrdmFsdWVzWzJdKyI8L2R1cmF0aW9uUGFyYW0+IgotICAgIH07Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBjbGFzc05hbWUgPSAib3JnLnNvYXBpbnRlcm9wLnhzZC5EdXJhdGlvblBhcmFtIjsKLSAgICAgICAgcHJvcGVydHlDbGFzcyA9IER1cmF0aW9uLmNsYXNzOwotICAgIH0KLQotICAgIC8vIGZvcmNlIG90aGVycyB0byBpbXBsZW1lbnQgdGhpcyBtZXRob2QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0UG9wdWxhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGNoZWNrVmFsdWUoeG1sU3RyaW5nW2ldLHZhbHVlc1tpXSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjb21wYXJlKFN0cmluZyB2YWwxLCBTdHJpbmcgdmFsMikgewotICAgICAgICBhc3NlcnRUcnVlKG5ldyAgRHVyYXRpb24odmFsMSkuZXF1YWxzKG5ldyBEdXJhdGlvbih2YWwyKSkpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgY29udmVydFRvU3RyaW5nKE9iamVjdCBvKSB7Ci0gICAgICAgIHJldHVybiBDb252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZygoRHVyYXRpb24pbyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9wb3B1bGF0ZS9zaW1wbGUvU2ltcGxlVHlwZUZsb2F0UG9wdWxhdGVUZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3BvcHVsYXRlL3NpbXBsZS9TaW1wbGVUeXBlRmxvYXRQb3B1bGF0ZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWI4MzM2ZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3BvcHVsYXRlL3NpbXBsZS9TaW1wbGVUeXBlRmxvYXRQb3B1bGF0ZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEucG9wdWxhdGUuc2ltcGxlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsOwotCi1wdWJsaWMgY2xhc3MgU2ltcGxlVHlwZUZsb2F0UG9wdWxhdGVUZXN0IGV4dGVuZHMgQWJzdHJhY3RTaW1wbGVQb3B1bGF0ZXJ7Ci0KLSAgICAgcHJpdmF0ZSBTdHJpbmcgdmFsdWVzW109ewotICAgICAgICAgICAgICIyMDMwMC4wMDUiLAotICAgICAgICAgICAgICIzMDQ1NTM0MjM0IiwKLSAgICAgICAgICAgICAiNjY3MzMuODgiCi0KLSAgICB9OwotCi0KLSAgICBwcml2YXRlIFN0cmluZyB4bWxTdHJpbmdbXSA9IHsKLSAgICAgICAgICAgICI8ZmxvYXRQYXJhbSB4bWxucz1cImh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkXCI+Iit2YWx1ZXNbMF0rIjwvZmxvYXRQYXJhbT4iLAotICAgICAgICAgICAgIjxmbG9hdFBhcmFtIHhtbG5zPVwiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2RcIj4iK3ZhbHVlc1sxXSsiPC9mbG9hdFBhcmFtPiIsCi0gICAgICAgICAgICAiPGZsb2F0UGFyYW0geG1sbnM9XCJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZFwiPiIrdmFsdWVzWzJdKyI8L2Zsb2F0UGFyYW0+IgotICAgIH07Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBjbGFzc05hbWUgPSAib3JnLnNvYXBpbnRlcm9wLnhzZC5GbG9hdFBhcmFtIjsKLSAgICAgICAgcHJvcGVydHlDbGFzcyA9IGZsb2F0LmNsYXNzOwotICAgIH0KLQotICAgIC8vIGZvcmNlIG90aGVycyB0byBpbXBsZW1lbnQgdGhpcyBtZXRob2QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0UG9wdWxhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBjaGVja1ZhbHVlKHhtbFN0cmluZ1tpXSx2YWx1ZXNbaV0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgY29tcGFyZShTdHJpbmcgdmFsMSwgU3RyaW5nIHZhbDIpIHsKLSAgICAgICAgLy93ZSBuZWVkIHRvIHJldGhpbmsgYSB3YXkgdG8gY29tcGFyZSB0aGVzZSB2YWx1ZXMgc2luY2UgdGhlaXIgcHJlY2lzaW9uCi0gICAgICAgIC8vZGlmZmVycwotICAgICAgICAvL2NoZWNrIGZvciBudWxsIGZvciBub3cKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh2YWwxKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh2YWwyKTsKLSAgICAgICAgLy8gc3VwZXIuY29tcGFyZSh2YWwxLCB2YWwyKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhPYmplY3QgbykgewotICAgICAgICByZXR1cm4gQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcoKEZsb2F0KW8pOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvc2ltcGxlL1NpbXBsZVR5cGVIZXhCaW5hcnlQb3B1bGF0ZVRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvc2ltcGxlL1NpbXBsZVR5cGVIZXhCaW5hcnlQb3B1bGF0ZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjZiYWI5Yy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3BvcHVsYXRlL3NpbXBsZS9TaW1wbGVUeXBlSGV4QmluYXJ5UG9wdWxhdGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLnBvcHVsYXRlLnNpbXBsZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuSGV4QmluYXJ5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbDsKLQotcHVibGljIGNsYXNzIFNpbXBsZVR5cGVIZXhCaW5hcnlQb3B1bGF0ZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdFNpbXBsZVBvcHVsYXRlcnsKLQotICAgIHByaXZhdGUgU3RyaW5nIHZhbHVlc1tdPSB7Ci0gICAgICAgICAgICAiMEZCNyIsCi0gICAgICAgICAgICAiRkZGRkZGRkYiLAotICAgICAgICAgICAgIjE5NzgiCi0gICAgfTsKLSAgICBwcml2YXRlIFN0cmluZyB4bWxTdHJpbmdbXSA9IHsKLSAgICAgICAgICAgICI8aGV4QmluUGFyYW0geG1sbnM9XCJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZFwiPiIrdmFsdWVzWzBdKyI8L2hleEJpblBhcmFtPiIsCi0gICAgICAgICAgICAiPGhleEJpblBhcmFtIHhtbG5zPVwiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2RcIj4iK3ZhbHVlc1sxXSsiPC9oZXhCaW5QYXJhbT4iLAotICAgICAgICAgICAgIjxoZXhCaW5QYXJhbSB4bWxucz1cImh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkXCI+Iit2YWx1ZXNbMl0rIjwvaGV4QmluUGFyYW0+IgotICAgIH07Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBjbGFzc05hbWUgPSAib3JnLnNvYXBpbnRlcm9wLnhzZC5IZXhCaW5QYXJhbSI7Ci0gICAgICAgIHByb3BlcnR5Q2xhc3MgPSBIZXhCaW5hcnkuY2xhc3M7Ci0gICAgfQotCi0gICAgLy8gZm9yY2Ugb3RoZXJzIHRvIGltcGxlbWVudCB0aGlzIG1ldGhvZAotICAgIHB1YmxpYyB2b2lkIHRlc3RQb3B1bGF0ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI7IGkrKykgewotICAgICAgICAgICAgY2hlY2tWYWx1ZSh4bWxTdHJpbmdbaV0sdmFsdWVzW2ldKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgY29udmVydFRvU3RyaW5nKE9iamVjdCBvKSB7Ci0gICAgICAgIHJldHVybiBDb252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZygoSGV4QmluYXJ5KW8pOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGNvbXBhcmUoU3RyaW5nIHZhbDEsIFN0cmluZyB2YWwyKSB7Ci0gICAgICAgYXNzZXJ0VHJ1ZSh2YWwxLmVxdWFsc0lnbm9yZUNhc2UodmFsMikpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvc2ltcGxlL1NpbXBsZVR5cGVNb250aERheVBvcHVsYXRlVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9wb3B1bGF0ZS9zaW1wbGUvU2ltcGxlVHlwZU1vbnRoRGF5UG9wdWxhdGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhM2E2NjUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9wb3B1bGF0ZS9zaW1wbGUvU2ltcGxlVHlwZU1vbnRoRGF5UG9wdWxhdGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLnBvcHVsYXRlLnNpbXBsZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuTW9udGhEYXk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsOwotCi1wdWJsaWMgY2xhc3MgU2ltcGxlVHlwZU1vbnRoRGF5UG9wdWxhdGVUZXN0IGV4dGVuZHMgQWJzdHJhY3RTaW1wbGVQb3B1bGF0ZXJ7Ci0KLSAgICBwcml2YXRlIFN0cmluZyB2YWx1ZXNbXT0gewotICAgICAgICAgICAgIi0tMDUtMTIiLAotICAgICAgICAgICAgIi0tMDYtMzAiLAotICAgICAgICAgICAgIi0tMTItMzEiCi0gICAgfTsKLSAgICBwcml2YXRlIFN0cmluZyB4bWxTdHJpbmdbXSA9IHsKLSAgICAgICAgICAgICI8bW9udGhEYXlQYXJhbSB4bWxucz1cImh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkXCI+Iit2YWx1ZXNbMF0rIjwvbW9udGhEYXlQYXJhbT4iLAotICAgICAgICAgICAgIjxtb250aERheVBhcmFtIHhtbG5zPVwiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2RcIj4iK3ZhbHVlc1sxXSsiPC9tb250aERheVBhcmFtPiIsCi0gICAgICAgICAgICAiPG1vbnRoRGF5UGFyYW0geG1sbnM9XCJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZFwiPiIrdmFsdWVzWzJdKyI8L21vbnRoRGF5UGFyYW0+IgotICAgIH07Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBjbGFzc05hbWUgPSAib3JnLnNvYXBpbnRlcm9wLnhzZC5Nb250aERheVBhcmFtIjsKLSAgICAgICAgcHJvcGVydHlDbGFzcyA9IE1vbnRoRGF5LmNsYXNzOwotICAgIH0KLQotICAgIC8vIGZvcmNlIG90aGVycyB0byBpbXBsZW1lbnQgdGhpcyBtZXRob2QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0UG9wdWxhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyBpKyspIHsKLSAgICAgICAgICAgIGNoZWNrVmFsdWUoeG1sU3RyaW5nW2ldLHZhbHVlc1tpXSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhPYmplY3QgbykgewotICAgICAgICByZXR1cm4gQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcoKE1vbnRoRGF5KW8pOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9wb3B1bGF0ZS9zaW1wbGUvU2ltcGxlVHlwZVFOYW1lUG9wdWxhdGVUZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3BvcHVsYXRlL3NpbXBsZS9TaW1wbGVUeXBlUU5hbWVQb3B1bGF0ZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ1NmMxMS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3BvcHVsYXRlL3NpbXBsZS9TaW1wbGVUeXBlUU5hbWVQb3B1bGF0ZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEucG9wdWxhdGUuc2ltcGxlOwotCi1wdWJsaWMgY2xhc3MgU2ltcGxlVHlwZVFOYW1lUG9wdWxhdGVUZXN0IGV4dGVuZHMgQWJzdHJhY3RTaW1wbGVQb3B1bGF0ZXJ7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgeG1sU3RyaW5nW10gPSB7Ci0gICAgICAgICAgICAiPHFOYW1lUGFyYW0geG1sbnM9XCJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZFwiPnVuaXZlcnNpdHk8L3FOYW1lUGFyYW0+IiwKLSAgICAgICAgICAgICI8cU5hbWVQYXJhbSB4bWxucz1cImh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkXCIgeG1sbnM6bnMxPVwiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczJcIj5uczE6YXhpczI8L3FOYW1lUGFyYW0+IgotICAgICAgICAgICAgLy8iPHFOYW1lUGFyYW0+aHR0cDovL21haWwuZ29vZ2xlLmNvbS9tYWlsLz9hdXRoPURRQUFBSEVBQUFDMDQxPC9xTmFtZVBhcmFtPiIKLSAgICB9OwotICAgIC8vIGZvcmNlIG90aGVycyB0byBpbXBsZW1lbnQgdGhpcyBtZXRob2QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0UG9wdWxhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgcHJvY2Vzcyh4bWxTdHJpbmdbMF0sIm9yZy5zb2FwaW50ZXJvcC54c2QuUU5hbWVQYXJhbSIpOwotICAgICAgICBwcm9jZXNzKHhtbFN0cmluZ1sxXSwib3JnLnNvYXBpbnRlcm9wLnhzZC5RTmFtZVBhcmFtIik7Ci0gICAgICAgLy8gcHJvY2Vzcyh4bWxTdHJpbmdbMl0sIm9yZy5zb2FwaW50ZXJvcC5xTmFtZVBhcmFtIik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9wb3B1bGF0ZS9zaW1wbGUvU2ltcGxlVHlwZVRpbWVQb3B1bGF0ZVRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvc2ltcGxlL1NpbXBsZVR5cGVUaW1lUG9wdWxhdGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiNjVmY2IuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9wb3B1bGF0ZS9zaW1wbGUvU2ltcGxlVHlwZVRpbWVQb3B1bGF0ZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEucG9wdWxhdGUuc2ltcGxlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5UaW1lOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbDsKLQotcHVibGljIGNsYXNzIFNpbXBsZVR5cGVUaW1lUG9wdWxhdGVUZXN0IGV4dGVuZHMgQWJzdHJhY3RTaW1wbGVQb3B1bGF0ZXJ7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgdmFsdWVzW109IHsKLSAgICAgICAgICAgICIxMzoyMDowMFoiLAotICAgICAgICAgICAgIjIzOjU5OjU5KzA1OjMwIiwKLSAgICAgICAgICAgICIyMzo1OTo1OSIKLSAgICB9OwotICAgIHByaXZhdGUgU3RyaW5nIHhtbFN0cmluZ1tdID0gewotICAgICAgICAgICAgIjx0aW1lUGFyYW0geG1sbnM9XCJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZFwiPiIrdmFsdWVzWzBdKyI8L3RpbWVQYXJhbT4iLAotICAgICAgICAgICAgIjx0aW1lUGFyYW0geG1sbnM9XCJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZFwiPiIrdmFsdWVzWzFdKyI8L3RpbWVQYXJhbT4iLAotICAgIH07Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBjbGFzc05hbWUgPSAib3JnLnNvYXBpbnRlcm9wLnhzZC5UaW1lUGFyYW0iOwotICAgICAgICBwcm9wZXJ0eUNsYXNzID0gVGltZS5jbGFzczsKLSAgICB9Ci0KLSAgICAvLyBmb3JjZSBvdGhlcnMgdG8gaW1wbGVtZW50IHRoaXMgbWV0aG9kCi0gICAgcHVibGljIHZvaWQgdGVzdFBvcHVsYXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgVGltZSB0aW1lOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI7IGkrKykgewotICAgICAgICAgICAgdGltZSA9IG5ldyBUaW1lKHZhbHVlc1tpXSk7Ci0gICAgICAgICAgICBjaGVja1ZhbHVlKHhtbFN0cmluZ1tpXSx0aW1lLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoT2JqZWN0IG8pIHsKLSAgICAgICAgcmV0dXJuIENvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKChUaW1lKW8pOwotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3BvcHVsYXRlL3NpbXBsZS9TaW1wbGVUeXBlZ01vbnRoUG9wdWxhdGVUZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3BvcHVsYXRlL3NpbXBsZS9TaW1wbGVUeXBlZ01vbnRoUG9wdWxhdGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlNjlkZjEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9wb3B1bGF0ZS9zaW1wbGUvU2ltcGxlVHlwZWdNb250aFBvcHVsYXRlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5wb3B1bGF0ZS5zaW1wbGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLk1vbnRoOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbDsKLQotcHVibGljIGNsYXNzIFNpbXBsZVR5cGVnTW9udGhQb3B1bGF0ZVRlc3QgIGV4dGVuZHMgQWJzdHJhY3RTaW1wbGVQb3B1bGF0ZXIgewotICAgICBwcml2YXRlIFN0cmluZyB2YWx1ZXNbXT17Ci0gICAgICAgICAgICAgIi0tMDEtLSIsCi0gICAgICAgICAgICAgIi0tMTItLSIsCi0gICAgICAgICAgICAgIi0tMDMtLSIKLQotICAgIH07Ci0KLQotICAgIHByaXZhdGUgU3RyaW5nIHhtbFN0cmluZ1tdID0gewotICAgICAgICAgICAgIjxtb250aFBhcmFtIHhtbG5zPVwiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2RcIj4iK3ZhbHVlc1swXSsiPC9tb250aFBhcmFtPiIsCi0gICAgICAgICAgICAiPG1vbnRoUGFyYW0geG1sbnM9XCJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZFwiPiIrdmFsdWVzWzFdKyI8L21vbnRoUGFyYW0+IiwKLSAgICAgICAgICAgICI8bW9udGhQYXJhbSB4bWxucz1cImh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkXCI+Iit2YWx1ZXNbMl0rIjwvbW9udGhQYXJhbT4iCi0gICAgfTsKLQotCi0gICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGNsYXNzTmFtZSA9ICJvcmcuc29hcGludGVyb3AueHNkLk1vbnRoUGFyYW0iOwotICAgICAgICBwcm9wZXJ0eUNsYXNzID0gTW9udGguY2xhc3M7Ci0gICAgfQotCi0gICAgLy8gZm9yY2Ugb3RoZXJzIHRvIGltcGxlbWVudCB0aGlzIG1ldGhvZAotICAgIHB1YmxpYyB2b2lkIHRlc3RQb3B1bGF0ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGNoZWNrVmFsdWUoeG1sU3RyaW5nW2ldLHZhbHVlc1tpXSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhPYmplY3QgbykgewotICAgICAgICByZXR1cm4gQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcoKE1vbnRoKW8pOwotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3BvcHVsYXRlL3NpbXBsZS9TaW1wbGVUeXBlZ1llYXJNb250aFBvcHVsYXRlVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9wb3B1bGF0ZS9zaW1wbGUvU2ltcGxlVHlwZWdZZWFyTW9udGhQb3B1bGF0ZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZmNmEwNy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3BvcHVsYXRlL3NpbXBsZS9TaW1wbGVUeXBlZ1llYXJNb250aFBvcHVsYXRlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5wb3B1bGF0ZS5zaW1wbGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLlllYXJNb250aDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWw7Ci0KLXB1YmxpYyBjbGFzcyBTaW1wbGVUeXBlZ1llYXJNb250aFBvcHVsYXRlVGVzdCBleHRlbmRzIEFic3RyYWN0U2ltcGxlUG9wdWxhdGVyewotICAgIHByaXZhdGUgU3RyaW5nIHZhbHVlc1tdPSB7Ci0gICAgICAgICAgICAiMDAwMS0wNSIsCi0gICAgICAgICAgICAiLTAyMzQtMDkiLAotICAgICAgICAgICAgIjE5NzgtMDEiLAotICAgICAgICAgICAgIjE5NzgtMDEtR01UIgotICAgIH07Ci0gICAgcHJpdmF0ZSBTdHJpbmcgeG1sU3RyaW5nW10gPSB7Ci0gICAgICAgICAgICAiPHllYXJNb250aFBhcmFtIHhtbG5zPVwiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2RcIj4iK3ZhbHVlc1swXSsiPC95ZWFyTW9udGhQYXJhbT4iLAotICAgICAgICAgICAgIjx5ZWFyTW9udGhQYXJhbSB4bWxucz1cImh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkXCI+Iit2YWx1ZXNbMV0rIjwveWVhck1vbnRoUGFyYW0+IiwKLSAgICAgICAgICAgICI8eWVhck1vbnRoUGFyYW0geG1sbnM9XCJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZFwiPiIrdmFsdWVzWzJdKyI8L3llYXJNb250aFBhcmFtPiIKLSAgICB9OwotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgY2xhc3NOYW1lID0gIm9yZy5zb2FwaW50ZXJvcC54c2QuWWVhck1vbnRoUGFyYW0iOwotICAgICAgICBwcm9wZXJ0eUNsYXNzID0gWWVhck1vbnRoLmNsYXNzOwotICAgIH0KLQotICAgIC8vIGZvcmNlIG90aGVycyB0byBpbXBsZW1lbnQgdGhpcyBtZXRob2QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0UG9wdWxhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyBpKyspIHsKLSAgICAgICAgICAgIGNoZWNrVmFsdWUoeG1sU3RyaW5nW2ldLHZhbHVlc1tpXSk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcHJvY2Vzcyh4bWxTdHJpbmdbM10sIm9yZy5zb2FwaW50ZXJvcC55ZWFyTW9udGhQYXJhbSIpOwotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhPYmplY3QgbykgewotICAgICAgICByZXR1cm4gQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcoKFllYXJNb250aClvKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvc2ltcGxlL1NpbXBsZVR5cGVnWWVhclBvcHVsYXRlVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9wb3B1bGF0ZS9zaW1wbGUvU2ltcGxlVHlwZWdZZWFyUG9wdWxhdGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViMWQ4ZTQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9wb3B1bGF0ZS9zaW1wbGUvU2ltcGxlVHlwZWdZZWFyUG9wdWxhdGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLnBvcHVsYXRlLnNpbXBsZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuWWVhcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWw7Ci0KLXB1YmxpYyBjbGFzcyBTaW1wbGVUeXBlZ1llYXJQb3B1bGF0ZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdFNpbXBsZVBvcHVsYXRlcnsKLQotICAgIHByaXZhdGUgU3RyaW5nIHZhbHVlc1tdPSB7Ci0gICAgICAgICAgICAiMDAwMSIsCi0gICAgICAgICAgICAiLTAyMzQiLAotICAgICAgICAgICAgIjE5NzgiCi0gICAgfTsKLSAgICBwcml2YXRlIFN0cmluZyB4bWxTdHJpbmdbXSA9IHsKLSAgICAgICAgICAgICI8eWVhclBhcmFtIHhtbG5zPVwiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2RcIj4iK3ZhbHVlc1swXSsiPC95ZWFyUGFyYW0+IiwKLSAgICAgICAgICAgICI8eWVhclBhcmFtIHhtbG5zPVwiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2RcIj4iK3ZhbHVlc1sxXSsiPC95ZWFyUGFyYW0+IiwKLSAgICAgICAgICAgICI8eWVhclBhcmFtIHhtbG5zPVwiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2RcIj4iK3ZhbHVlc1syXSsiPC95ZWFyUGFyYW0+IgotICAgIH07Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBjbGFzc05hbWUgPSAib3JnLnNvYXBpbnRlcm9wLnhzZC5ZZWFyUGFyYW0iOwotICAgICAgICBwcm9wZXJ0eUNsYXNzID0gWWVhci5jbGFzczsKLSAgICB9Ci0KLSAgICAvLyBmb3JjZSBvdGhlcnMgdG8gaW1wbGVtZW50IHRoaXMgbWV0aG9kCi0gICAgcHVibGljIHZvaWQgdGVzdFBvcHVsYXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgaSsrKSB7Ci0gICAgICAgICAgICBjaGVja1ZhbHVlKHhtbFN0cmluZ1tpXSx2YWx1ZXNbaV0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoT2JqZWN0IG8pIHsKLSAgICAgICAgcmV0dXJuIENvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKChZZWFyKW8pOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvc2ltcGxlL3BhY2thZ2UuaHRtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvc2ltcGxlL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ0MDI2Ny4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3BvcHVsYXRlL3NpbXBsZS9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08aHRtbD4NCi08Ym9keT4NCi0gICBUaGlzIHBhY2thZ2UgY29udGFpbnMgdGhlIGZvbGxvd2luZyB0ZXN0cw0KLSAgIA0KLSAgICAgICAgMy4yLjEgc3RyaW5nDQotICAgICAgICAzLjIuMiBib29sZWFuDQotICAgICAgICAzLjIuMyBkZWNpbWFsDQotICAgICAgICAzLjIuNCBmbG9hdA0KLSAgICAgICAgMy4yLjUgZG91YmxlDQotICAgICAgICAzLjIuNiBkdXJhdGlvbg0KLSAgICAgICAgMy4yLjcgZGF0ZVRpbWUNCi0gICAgICAgIDMuMi44IHRpbWUNCi0gICAgICAgIDMuMi45IGRhdGUNCi0gICAgICAgIDMuMi4xMCBnWWVhck1vbnRoDQotICAgICAgICAzLjIuMTEgZ1llYXINCi0gICAgICAgIDMuMi4xMiBnTW9udGhEYXkNCi0gICAgICAgIDMuMi4xMyBnRGF5DQotICAgICAgICAzLjIuMTQgZ01vbnRoDQotICAgICAgICAzLjIuMTUgaGV4QmluYXJ5DQotICAgICAgICAzLjIuMTYgYmFzZTY0QmluYXJ5DQotICAgICAgICAzLjIuMTcgYW55VVJJDQotICAgICAgICAzLjIuMTggUU5hbWUNCi0gICAgICAgIDMuMi4xOSBOT1RBVElPTiAgJmx0Oz0gTm90IGNvbXBsZXRlbHkgdGVzdGVkDQotDQotPC9ib2R5Pg0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3JhbXBhcnQvUmFtcGFydFRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcmFtcGFydC9SYW1wYXJ0VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTk4NDk0Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcmFtcGFydC9SYW1wYXJ0VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5yYW1wYXJ0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uYXR0YWNobWVudHMuQnl0ZUFycmF5RGF0YVNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5TdEFYVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczLnd3dy5fMjAwNS5fMDUueG1sbWltZS5CYXNlNjRCaW5hcnk7Ci1pbXBvcnQgb3JnLnczLnd3dy5fMjAwNS5fMDUueG1sbWltZS5Db250ZW50VHlwZV90eXBlMDsKLWltcG9ydCBvcmcudzMud3d3Ll8yMDA1Ll8wNS54bWxtaW1lLlRlc3RFeHRlbnNpb247Ci0KLWltcG9ydCBqYXZheC5hY3RpdmF0aW9uLkRhdGFIYW5kbGVyOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci0KLQotcHVibGljIGNsYXNzIFJhbXBhcnRUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHVibGljIHZvaWQgdGVzdEV4dGVuc2lvbigpewotICAgICAgICBUZXN0RXh0ZW5zaW9uIHRlc3RFeHRlbnNpb24gPSBuZXcgVGVzdEV4dGVuc2lvbigpOwotCi0gICAgICAgIEJhc2U2NEJpbmFyeSBiYXNlNjRCaW5hcnkgPSBuZXcgQmFzZTY0QmluYXJ5KCk7Ci0gICAgICAgIHRlc3RFeHRlbnNpb24uc2V0VGVzdEV4dGVuc2lvbihiYXNlNjRCaW5hcnkpOwotCi0gICAgICAgIFN0cmluZyB0ZXN0U3RyaW5nID0gInRlc3QgYmFzZSA2NCBlbGVlbW50IjsKLSAgICAgICAgRGF0YUhhbmRsZXIgZGF0YUhhbmRsZXIgPSBuZXcgRGF0YUhhbmRsZXIobmV3IEJ5dGVBcnJheURhdGFTb3VyY2UodGVzdFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgIGJhc2U2NEJpbmFyeS5zZXRCYXNlNjRCaW5hcnkoZGF0YUhhbmRsZXIpOwotCi0gICAgICAgIENvbnRlbnRUeXBlX3R5cGUwIGNvbnRlbnRUeXBlX3R5cGUwID0gbmV3IENvbnRlbnRUeXBlX3R5cGUwKCk7Ci0gICAgICAgIGNvbnRlbnRUeXBlX3R5cGUwLnNldENvbnRlbnRUeXBlX3R5cGUwKCJ0ZXN0IHN0cmluZyIpOwotICAgICAgICBiYXNlNjRCaW5hcnkuc2V0Q29udGVudFR5cGUoY29udGVudFR5cGVfdHlwZTApOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gdGVzdEV4dGVuc2lvbi5nZXRPTUVsZW1lbnQoVGVzdEV4dGVuc2lvbi5NWV9RTkFNRSwgT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCkpOwotICAgICAgICAgICAgU3RyaW5nIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NIFN0cmluZyAiICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvbUVsZW1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgVGVzdEV4dGVuc2lvbiByZXN1bHQgPSBUZXN0RXh0ZW5zaW9uLkZhY3RvcnkucGFyc2UoeG1sUmVhZGVyKTsKLSAgICAgICAgICAgIAotICAgICAgICB9IGNhdGNoIChBREJFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9yZWZlcmVuY2VzL0VsZW1lbnRSZWZlcmVuY2VUZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3JlZmVyZW5jZXMvRWxlbWVudFJlZmVyZW5jZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGFkOWUyOC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3JlZmVyZW5jZXMvRWxlbWVudFJlZmVyZW5jZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLnJlZmVyZW5jZXM7Ci0KLWltcG9ydCBjb20uYW1lcmljYW5leHByZXNzLnd3dy53c2RsLmN0bi51dGlsaXRpZXMuYXRiLio7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS51dGlsLlN0QVhVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci0KLQotcHVibGljIGNsYXNzIEVsZW1lbnRSZWZlcmVuY2VUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHVibGljIHZvaWQgdGVzdFNpbmdsZUVsZW1lbnRSZWZlcmVuY2UoKSB7Ci0gICAgICAgIENoZWNrRWxpZ2liaWxpdHkxIGVjaENoZWNrRWxpZ2liaWxpdHkxID0gbmV3IENoZWNrRWxpZ2liaWxpdHkxKCk7Ci0gICAgICAgIEF0YlJlcXVlc3RDaGVja0VsaWdpYmlsaXR5X3R5cGUwIGF0YlJlcXVlc3RDaGVja0VsaWdpYmlsaXR5ID0gbmV3IEF0YlJlcXVlc3RDaGVja0VsaWdpYmlsaXR5X3R5cGUwKCk7Ci0gICAgICAgIGVjaENoZWNrRWxpZ2liaWxpdHkxLnNldEF0YlJlcXVlc3RDaGVja0VsaWdpYmlsaXR5KGF0YlJlcXVlc3RDaGVja0VsaWdpYmlsaXR5KTsKLSAgICAgICAgYXRiUmVxdWVzdENoZWNrRWxpZ2liaWxpdHkuc2V0Q2FyZE51bWJlcigiY2FybnVtYmVyIik7Ci0gICAgICAgIGF0YlJlcXVlc3RDaGVja0VsaWdpYmlsaXR5LnNldENsaWVudElkKCJjbGllbnRpZCIpOwotICAgICAgICBhdGJSZXF1ZXN0Q2hlY2tFbGlnaWJpbGl0eS5zZXRFeHBpcmF0aW9uRGF0ZSgiZGF0ZSIpOwotICAgICAgICBhdGJSZXF1ZXN0Q2hlY2tFbGlnaWJpbGl0eS5zZXROYW1lQXNPbkNhcmQoImNhcmRuYW1lIik7Ci0gICAgICAgIGF0YlJlcXVlc3RDaGVja0VsaWdpYmlsaXR5LnNldFllYXJPZlJlZGVtcHRpb24oMik7Ci0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IGVjaENoZWNrRWxpZ2liaWxpdHkxLmdldE9NRWxlbWVudChDaGVja0VsaWdpYmlsaXR5MS5NWV9RTkFNRSwgT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDEyRmFjdG9yeSgpKTsKLSAgICAgICAgICAgIFN0cmluZyBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICBDaGVja0VsaWdpYmlsaXR5MSByZXN1bHQgPSBDaGVja0VsaWdpYmlsaXR5MS5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldEF0YlJlcXVlc3RDaGVja0VsaWdpYmlsaXR5KCkuZ2V0Q2FyZE51bWJlcigpLCAiY2FybnVtYmVyIik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldEF0YlJlcXVlc3RDaGVja0VsaWdpYmlsaXR5KCkuZ2V0Q2xpZW50SWQoKSwgImNsaWVudGlkIik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldEF0YlJlcXVlc3RDaGVja0VsaWdpYmlsaXR5KCkuZ2V0RXhwaXJhdGlvbkRhdGUoKSwgImRhdGUiKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0QXRiUmVxdWVzdENoZWNrRWxpZ2liaWxpdHkoKS5nZXROYW1lQXNPbkNhcmQoKSwgImNhcmRuYW1lIik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldEF0YlJlcXVlc3RDaGVja0VsaWdpYmlsaXR5KCkuZ2V0WWVhck9mUmVkZW1wdGlvbigpLCAyKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aXBsZUVsZW1lbnRSZWZlcmVuY2UoKSB7Ci0gICAgICAgIENoZWNrRWxpZ2liaWxpdHkyIGVjaENoZWNrRWxpZ2liaWxpdHkyID0gbmV3IENoZWNrRWxpZ2liaWxpdHkyKCk7Ci0gICAgICAgIEF0YlJlcXVlc3RDaGVja0VsaWdpYmlsaXR5X3R5cGUwW10gYXRiUmVxdWVzdENoZWNrRWxpZ2liaWxpdHkgPSBuZXcgQXRiUmVxdWVzdENoZWNrRWxpZ2liaWxpdHlfdHlwZTBbMl07Ci0gICAgICAgIGVjaENoZWNrRWxpZ2liaWxpdHkyLnNldEF0YlJlcXVlc3RDaGVja0VsaWdpYmlsaXR5KGF0YlJlcXVlc3RDaGVja0VsaWdpYmlsaXR5KTsKLQotICAgICAgICBhdGJSZXF1ZXN0Q2hlY2tFbGlnaWJpbGl0eVswXSA9IG5ldyBBdGJSZXF1ZXN0Q2hlY2tFbGlnaWJpbGl0eV90eXBlMCgpOwotICAgICAgICBhdGJSZXF1ZXN0Q2hlY2tFbGlnaWJpbGl0eVswXS5zZXRDYXJkTnVtYmVyKCJjYXJudW1iZXIiKTsKLSAgICAgICAgYXRiUmVxdWVzdENoZWNrRWxpZ2liaWxpdHlbMF0uc2V0Q2xpZW50SWQoImNsaWVudGlkIik7Ci0gICAgICAgIGF0YlJlcXVlc3RDaGVja0VsaWdpYmlsaXR5WzBdLnNldEV4cGlyYXRpb25EYXRlKCJkYXRlIik7Ci0gICAgICAgIGF0YlJlcXVlc3RDaGVja0VsaWdpYmlsaXR5WzBdLnNldE5hbWVBc09uQ2FyZCgiY2FyZG5hbWUiKTsKLSAgICAgICAgYXRiUmVxdWVzdENoZWNrRWxpZ2liaWxpdHlbMF0uc2V0WWVhck9mUmVkZW1wdGlvbigyKTsKLQotICAgICAgICBhdGJSZXF1ZXN0Q2hlY2tFbGlnaWJpbGl0eVsxXSA9IG5ldyBBdGJSZXF1ZXN0Q2hlY2tFbGlnaWJpbGl0eV90eXBlMCgpOwotICAgICAgICBhdGJSZXF1ZXN0Q2hlY2tFbGlnaWJpbGl0eVsxXS5zZXRDYXJkTnVtYmVyKCJjYXJudW1iZXIiKTsKLSAgICAgICAgYXRiUmVxdWVzdENoZWNrRWxpZ2liaWxpdHlbMV0uc2V0Q2xpZW50SWQoImNsaWVudGlkIik7Ci0gICAgICAgIGF0YlJlcXVlc3RDaGVja0VsaWdpYmlsaXR5WzFdLnNldEV4cGlyYXRpb25EYXRlKCJkYXRlIik7Ci0gICAgICAgIGF0YlJlcXVlc3RDaGVja0VsaWdpYmlsaXR5WzFdLnNldE5hbWVBc09uQ2FyZCgiY2FyZG5hbWUiKTsKLSAgICAgICAgYXRiUmVxdWVzdENoZWNrRWxpZ2liaWxpdHlbMV0uc2V0WWVhck9mUmVkZW1wdGlvbigyKTsKLQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gZWNoQ2hlY2tFbGlnaWJpbGl0eTIuZ2V0T01FbGVtZW50KENoZWNrRWxpZ2liaWxpdHkyLk1ZX1FOQU1FLCBPTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTJGYWN0b3J5KCkpOwotICAgICAgICAgICAgU3RyaW5nIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIENoZWNrRWxpZ2liaWxpdHkyIHJlc3VsdCA9IENoZWNrRWxpZ2liaWxpdHkyLkZhY3RvcnkucGFyc2UoeG1sUmVhZGVyKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0QXRiUmVxdWVzdENoZWNrRWxpZ2liaWxpdHkoKVswXS5nZXRDYXJkTnVtYmVyKCksICJjYXJudW1iZXIiKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0QXRiUmVxdWVzdENoZWNrRWxpZ2liaWxpdHkoKVswXS5nZXRDbGllbnRJZCgpLCAiY2xpZW50aWQiKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0QXRiUmVxdWVzdENoZWNrRWxpZ2liaWxpdHkoKVswXS5nZXRFeHBpcmF0aW9uRGF0ZSgpLCAiZGF0ZSIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRBdGJSZXF1ZXN0Q2hlY2tFbGlnaWJpbGl0eSgpWzBdLmdldE5hbWVBc09uQ2FyZCgpLCAiY2FyZG5hbWUiKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0QXRiUmVxdWVzdENoZWNrRWxpZ2liaWxpdHkoKVswXS5nZXRZZWFyT2ZSZWRlbXB0aW9uKCksIDIpOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldEF0YlJlcXVlc3RDaGVja0VsaWdpYmlsaXR5KClbMV0uZ2V0Q2FyZE51bWJlcigpLCAiY2FybnVtYmVyIik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldEF0YlJlcXVlc3RDaGVja0VsaWdpYmlsaXR5KClbMV0uZ2V0Q2xpZW50SWQoKSwgImNsaWVudGlkIik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldEF0YlJlcXVlc3RDaGVja0VsaWdpYmlsaXR5KClbMV0uZ2V0RXhwaXJhdGlvbkRhdGUoKSwgImRhdGUiKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0QXRiUmVxdWVzdENoZWNrRWxpZ2liaWxpdHkoKVsxXS5nZXROYW1lQXNPbkNhcmQoKSwgImNhcmRuYW1lIik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldEF0YlJlcXVlc3RDaGVja0VsaWdpYmlsaXR5KClbMV0uZ2V0WWVhck9mUmVkZW1wdGlvbigpLCAyKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFbGVtZW50MTEoKXsKLQotICAgICAgICBFbGVtZW50MSBlbGVtZW50MSA9IG5ldyBFbGVtZW50MSgpOwotICAgICAgICBDb21wbGV4VHlwZTEgY29tcGxleFR5cGUxID0gbmV3IENvbXBsZXhUeXBlMSgpOwotICAgICAgICBlbGVtZW50MS5zZXRFbGVtZW50MShjb21wbGV4VHlwZTEpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gZWxlbWVudDEuZ2V0T01FbGVtZW50KEVsZW1lbnQxLk1ZX1FOQU1FLE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgICAgIFN0cmluZyBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTSBTdHJpbmcgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICBFbGVtZW50MSByZXN1bHQgPSBFbGVtZW50MS5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcik7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0gICAgICAgIH0gY2F0Y2ggKEFEQkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RWxlbWVudDEyKCl7Ci0KLSAgICAgICAgRWxlbWVudDEgZWxlbWVudDEgPSBuZXcgRWxlbWVudDEoKTsKLSAgICAgICAgQ29tcGxleFR5cGUxIGNvbXBsZXhUeXBlMSA9IG5ldyBDb21wbGV4VHlwZTEoKTsKLSAgICAgICAgZWxlbWVudDEuc2V0RWxlbWVudDEoY29tcGxleFR5cGUxKTsKLSAgICAgICAgQ29tcGxleFR5cGUxIGNvbXBsZXhUeXBlMiA9IG5ldyBDb21wbGV4VHlwZTEoKTsKLSAgICAgICAgY29tcGxleFR5cGUxLnNldEVsZW1lbnQxKGNvbXBsZXhUeXBlMik7Ci0gICAgICAgIENvbXBsZXhUeXBlMSBjb21wbGV4VHlwZTMgPSBuZXcgQ29tcGxleFR5cGUxKCk7Ci0gICAgICAgIGNvbXBsZXhUeXBlMi5zZXRFbGVtZW50MShjb21wbGV4VHlwZTMpOwotCi0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSBlbGVtZW50MS5nZXRPTUVsZW1lbnQoRWxlbWVudDEuTVlfUU5BTUUsT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCkpOwotICAgICAgICAgICAgU3RyaW5nIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NIFN0cmluZyA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIEVsZW1lbnQxIHJlc3VsdCA9IEVsZW1lbnQxLkZhY3RvcnkucGFyc2UoeG1sUmVhZGVyKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwocmVzdWx0KTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwocmVzdWx0LmdldEVsZW1lbnQxKCkpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXN1bHQuZ2V0RWxlbWVudDEoKS5nZXRFbGVtZW50MSgpKTsKLSAgICAgICAgfSBjYXRjaCAoQURCRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFbGVtZW50MjEoKXsKLSAgICAgICAgRWxlbWVudDIgZWxlbWVudDIgPSBuZXcgRWxlbWVudDIoKTsKLSAgICAgICAgRWxlbWVudDJfdHlwZTAgZWxlbWVudDJfdHlwZTAgPSBuZXcgRWxlbWVudDJfdHlwZTAoKTsKLSAgICAgICAgZWxlbWVudDIuc2V0RWxlbWVudDIoZWxlbWVudDJfdHlwZTApOwotICAgICAgICBlbGVtZW50Ml90eXBlMC5zZXRQYXJhbTEoInRlc3Qgc3RyaW5nMSIpOwotCi0gICAgICAgIEVsZW1lbnQyX3R5cGUwIGVsZW1lbnQyX3R5cGUxID0gbmV3IEVsZW1lbnQyX3R5cGUwKCk7Ci0gICAgICAgIGVsZW1lbnQyX3R5cGUxLnNldFBhcmFtMSgidGVzdCBzdHJpbmcyIik7Ci0gICAgICAgIGVsZW1lbnQyX3R5cGUwLnNldEVsZW1lbnQyKGVsZW1lbnQyX3R5cGUxKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IGVsZW1lbnQyLmdldE9NRWxlbWVudChFbGVtZW50Mi5NWV9RTkFNRSxPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgb21FbG1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTSBlbGVtZW50ID09PiIgKyBvbUVsbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbG1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgRWxlbWVudDIgcmVzdWx0ID0gRWxlbWVudDIuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRFbGVtZW50MigpLmdldFBhcmFtMSgpLCJ0ZXN0IHN0cmluZzEiKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0RWxlbWVudDIoKS5nZXRFbGVtZW50MigpLmdldFBhcmFtMSgpLCAidGVzdCBzdHJpbmcyIik7Ci0gICAgICAgIH0gY2F0Y2ggKEFEQkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlUmVmZXJlbmNlKCkgewotICAgICAgICBUZXN0U2ltcGxlUmVmZXJlbmNlIHRlc3RTaW1wbGVSZWZlcmVuY2UgPSBuZXcgVGVzdFNpbXBsZVJlZmVyZW5jZSgpOwotICAgICAgICBEaXNjYXJkX3RyYW5zZmVyVG9rZW4gZGlzY2FyZF90cmFuc2ZlclRva2VuID0gbmV3IERpc2NhcmRfdHJhbnNmZXJUb2tlbigpOwotLy8gRklYTUU6IEJyZWFrcyBpbiBJQk0gSkRLIDEuNSAtIHRoZSBnZW5lcmF0ZWQgY29kZSB0aGVyZSBpcyBsb29raW5nIGZvciBBdXRoSW5mb190eXBlMCBpbnN0ZWFkIG9mIEF1dGhJbmZvX3R5cGUxCi0vLyAgICAgICAgQXV0aEluZm9fdHlwZTEgYXV0aEluZm9fdHlwZTEgPSBuZXcgQXV0aEluZm9fdHlwZTEoKTsKLS8vICAgICAgICBhdXRoSW5mb190eXBlMS5zZXRBdXRoSW5mb190eXBlMSgiU2ltcGxlIHBhcmFtIik7Ci0vLyAgICAgICAgZGlzY2FyZF90cmFuc2ZlclRva2VuLnNldEF1dGhJbmZvKGF1dGhJbmZvX3R5cGUxKTsKLSAgICAgICAgZGlzY2FyZF90cmFuc2ZlclRva2VuLnNldFBhcmFtMSgiTmV3IHBhcm0iKTsKLSAgICAgICAgdGVzdFNpbXBsZVJlZmVyZW5jZS5zZXRUZXN0U2ltcGxlUmVmZXJlbmNlKGRpc2NhcmRfdHJhbnNmZXJUb2tlbik7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSB0ZXN0U2ltcGxlUmVmZXJlbmNlLmdldE9NRWxlbWVudChUZXN0U2ltcGxlUmVmZXJlbmNlLk1ZX1FOQU1FLAotICAgICAgICAgICAgICAgICAgICBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgb21FbG1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTSBlbGVtZW50ID09PiIgKyBvbUVsbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbG1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgVGVzdFNpbXBsZVJlZmVyZW5jZSByZXN1bHQgPSBUZXN0U2ltcGxlUmVmZXJlbmNlLkZhY3RvcnkucGFyc2UoeG1sUmVhZGVyKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0VGVzdFNpbXBsZVJlZmVyZW5jZSgpLmdldFBhcmFtMSgpLCJOZXcgcGFybSIpOwotLy8gU2VlIEZJWE1FIGFib3ZlOgotLy8gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFRlc3RTaW1wbGVSZWZlcmVuY2UoKS5nZXRBdXRoSW5mbygpLmdldEF1dGhJbmZvX3R5cGUxKCksIlNpbXBsZSBwYXJhbSIpOwotICAgICAgICB9IGNhdGNoIChBREJFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0KLQotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3Jlc3RyaWN0aW9uL0NvbXBsZXhSZXN0cmljdGlvblRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcmVzdHJpY3Rpb24vQ29tcGxleFJlc3RyaWN0aW9uVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2QzYzhiLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcmVzdHJpY3Rpb24vQ29tcGxleFJlc3RyaWN0aW9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5yZXN0cmljdGlvbjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5TdEFYVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnRlbXB1cmkuR2V0RXhlbXBsYXJSZXNwb25zZVR5cGU7Ci1pbXBvcnQgb3JnLnRlbXB1cmkuR2V0RXhlbXBsYXJSZXNwb25zZVR5cGVFbGVtZW50OwotCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotcHVibGljIGNsYXNzIENvbXBsZXhSZXN0cmljdGlvblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0RXhlbXBsYXJSZXNwb25zZVR5cGVFbGVtZW50KCl7Ci0gICAgICAgIEdldEV4ZW1wbGFyUmVzcG9uc2VUeXBlRWxlbWVudCBnZXRFeGVtcGxhclJlc3BvbnNlVHlwZUVsZW1lbnQgPSBuZXcgR2V0RXhlbXBsYXJSZXNwb25zZVR5cGVFbGVtZW50KCk7Ci0gICAgICAgIEdldEV4ZW1wbGFyUmVzcG9uc2VUeXBlIGdldEV4ZW1wbGFyUmVzcG9uc2VUeXBlID0gbmV3IEdldEV4ZW1wbGFyUmVzcG9uc2VUeXBlKCk7Ci0gICAgICAgIGdldEV4ZW1wbGFyUmVzcG9uc2VUeXBlLnNldEV4ZW1wbGFyKCJ0ZXN0IHN0cmluZzEiKTsKLSAgICAgICAgZ2V0RXhlbXBsYXJSZXNwb25zZVR5cGUuc2V0UmVzcG9uc2VDb2RlKG5ldyBCaWdJbnRlZ2VyKCIyMyIpKTsKLSAgICAgICAgZ2V0RXhlbXBsYXJSZXNwb25zZVR5cGUuc2V0UmVzcG9uc2VNZXNzYWdlKCJ0ZXN0IHN0cmluZzIiKTsKLSAgICAgICAgZ2V0RXhlbXBsYXJSZXNwb25zZVR5cGUuc2V0U3VwcG9ydGVkTWV0aG9kcygidGVzdCBzdHJpbmczIik7Ci0KLSAgICAgICAgZ2V0RXhlbXBsYXJSZXNwb25zZVR5cGVFbGVtZW50LnNldEdldEV4ZW1wbGFyUmVzcG9uc2VUeXBlRWxlbWVudChnZXRFeGVtcGxhclJlc3BvbnNlVHlwZSk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPQotICAgICAgICAgICAgICAgICAgICBnZXRFeGVtcGxhclJlc3BvbnNlVHlwZUVsZW1lbnQuZ2V0T01FbGVtZW50KEdldEV4ZW1wbGFyUmVzcG9uc2VUeXBlRWxlbWVudC5NWV9RTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT01FbGVtZW50IHN0cmluZyA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIEdldEV4ZW1wbGFyUmVzcG9uc2VUeXBlRWxlbWVudCByZXN1bHQgPSBHZXRFeGVtcGxhclJlc3BvbnNlVHlwZUVsZW1lbnQuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpOwotICAgICAgICAgICAgR2V0RXhlbXBsYXJSZXNwb25zZVR5cGUgcmVzdWx0VHlwZSA9IHJlc3VsdC5nZXRHZXRFeGVtcGxhclJlc3BvbnNlVHlwZUVsZW1lbnQoKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHRUeXBlLmdldEV4ZW1wbGFyKCksInRlc3Qgc3RyaW5nMSIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdFR5cGUuZ2V0UmVzcG9uc2VNZXNzYWdlKCksInRlc3Qgc3RyaW5nMiIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdFR5cGUuZ2V0U3VwcG9ydGVkTWV0aG9kcygpLCJ0ZXN0IHN0cmluZzMiKTsKLSAgICAgICAgfSBjYXRjaCAoQURCRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9yZXN0cmljdGlvbi9TaW1wbGVSZXN0cmljdGlvblRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcmVzdHJpY3Rpb24vU2ltcGxlUmVzdHJpY3Rpb25UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwNmZiZjQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9yZXN0cmljdGlvbi9TaW1wbGVSZXN0cmljdGlvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLnJlc3RyaWN0aW9uOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS51dGlsLlN0QVhVdGlsczsKLWltcG9ydCBvcmcudGVtcHVyaS5BZGRyZXNzOwotaW1wb3J0IG9yZy50ZW1wdXJpLkNvbXBsZXhSZXN0cmljdGlvblR5cGVUZXN0RWxlbWVudDsKLWltcG9ydCBvcmcudGVtcHVyaS5FbnVtZXJhdGlvblNpbXBsZVR5cGVFbGVtZW50OwotaW1wb3J0IG9yZy50ZW1wdXJpLkhhaXJDb2xvcl90eXBlMTsKLWltcG9ydCBvcmcudGVtcHVyaS5Ob3JtYWxTaW1wbGVUeXBlRWxlbWVudDsKLWltcG9ydCBvcmcudGVtcHVyaS5QYXJlbnRFbnVtZXJhdGlvblNpbXBsZVR5cGU7Ci1pbXBvcnQgb3JnLnRlbXB1cmkuUGFyZW50Tm9ybWFsU2ltcGxlVHlwZTsKLWltcG9ydCBvcmcudGVtcHVyaS5QYXJlbnRSZXN0cmljdGlvblR5cGU7Ci1pbXBvcnQgb3JnLnRlbXB1cmkuUGFyZW50U2ltcGxlVHlwZTsKLWltcG9ydCBvcmcudGVtcHVyaS5QZXJzb247Ci1pbXBvcnQgb3JnLnRlbXB1cmkuUGVyc29uRWxlbWVudDsKLWltcG9ydCBvcmcudGVtcHVyaS5UZXN0U2ltcGxlQXR0cmlidXRlOwotaW1wb3J0IG9yZy50ZW1wdXJpLlRlc3RTaW1wbGVBdHRyaWJ1dGVFbGVtZW50OwotaW1wb3J0IG9yZy50ZW1wdXJpLlppcF90eXBlMTsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLQotCi1wdWJsaWMgY2xhc3MgU2ltcGxlUmVzdHJpY3Rpb25UZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHVibGljIHZvaWQgdGVzdFNpbXBsZUF0dHJpYnV0ZSgpIHsKLQotICAgICAgICBUZXN0U2ltcGxlQXR0cmlidXRlRWxlbWVudCB0ZXN0U2ltcGxlQXR0cmlidXRlRWxlbWVudCA9IG5ldyBUZXN0U2ltcGxlQXR0cmlidXRlRWxlbWVudCgpOwotCi0gICAgICAgIFRlc3RTaW1wbGVBdHRyaWJ1dGUgdGVzdFNpbXBsZUF0dHJpYnV0ZSA9IG5ldyBUZXN0U2ltcGxlQXR0cmlidXRlKCk7Ci0gICAgICAgIHRlc3RTaW1wbGVBdHRyaWJ1dGVFbGVtZW50LnNldFRlc3RTaW1wbGVBdHRyaWJ1dGVFbGVtZW50KHRlc3RTaW1wbGVBdHRyaWJ1dGUpOwotICAgICAgICB0ZXN0U2ltcGxlQXR0cmlidXRlLnNldFRlc3RFbGVtZW50MShuZXcgUU5hbWUoImh0dHA6Ly93c28yLmNvbSIsICJ0ZXN0MSIpKTsKLSAgICAgICAgdGVzdFNpbXBsZUF0dHJpYnV0ZS5zZXRUZXN0RWxlbWVudDIobmV3IFFOYW1lKCJodHRwOi8vd3NvMi5jb20iLCAidGVzdDIiKSk7Ci0gICAgICAgIHRlc3RTaW1wbGVBdHRyaWJ1dGUuc2V0VGVzdEVsZW1lbnQzKG5ldyBRTmFtZSgiaHR0cDovL3dzbzIuY29tIiwgInRlc3QzIikpOwotCi0gICAgICAgIFBhcmVudFNpbXBsZVR5cGUgcGFyZW50U2ltcGxlVHlwZTEgPSBuZXcgUGFyZW50U2ltcGxlVHlwZSgpOwotICAgICAgICBwYXJlbnRTaW1wbGVUeXBlMS5zZXRDaGlsZFNpbXBsZVR5cGUoInRlc3Qgc2ltcGxlIHR5cGUgMSIpOwotCi0gICAgICAgIFBhcmVudFNpbXBsZVR5cGUgcGFyZW50U2ltcGxlVHlwZTIgPSBuZXcgUGFyZW50U2ltcGxlVHlwZSgpOwotICAgICAgICBwYXJlbnRTaW1wbGVUeXBlMi5zZXRDaGlsZFNpbXBsZVR5cGUoInRlc3Qgc2ltcGxlIHR5cGUgMiIpOwotCi0gICAgICAgIHRlc3RTaW1wbGVBdHRyaWJ1dGUuc2V0QXR0cmliMShwYXJlbnRTaW1wbGVUeXBlMSk7Ci0gICAgICAgIHRlc3RTaW1wbGVBdHRyaWJ1dGUuc2V0QXR0cmliMihwYXJlbnRTaW1wbGVUeXBlMik7Ci0KLSAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IHRlc3RTaW1wbGVBdHRyaWJ1dGVFbGVtZW50LmdldE9NRWxlbWVudChUZXN0U2ltcGxlQXR0cmlidXRlRWxlbWVudC5NWV9RTkFNRSwgT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCkpOwotICAgICAgICAgICAgU3RyaW5nIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NIFN0cmluZyA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIFRlc3RTaW1wbGVBdHRyaWJ1dGVFbGVtZW50IHJlc3VsdCA9IFRlc3RTaW1wbGVBdHRyaWJ1dGVFbGVtZW50LkZhY3RvcnkucGFyc2UoeG1sUmVhZGVyKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0VGVzdFNpbXBsZUF0dHJpYnV0ZUVsZW1lbnQoKS5nZXRUZXN0RWxlbWVudDEoKSwgdGVzdFNpbXBsZUF0dHJpYnV0ZS5nZXRUZXN0RWxlbWVudDEoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFRlc3RTaW1wbGVBdHRyaWJ1dGVFbGVtZW50KCkuZ2V0VGVzdEVsZW1lbnQyKCksIHRlc3RTaW1wbGVBdHRyaWJ1dGUuZ2V0VGVzdEVsZW1lbnQyKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRUZXN0U2ltcGxlQXR0cmlidXRlRWxlbWVudCgpLmdldFRlc3RFbGVtZW50MygpLCB0ZXN0U2ltcGxlQXR0cmlidXRlLmdldFRlc3RFbGVtZW50MygpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0VGVzdFNpbXBsZUF0dHJpYnV0ZUVsZW1lbnQoKS5nZXRBdHRyaWIxKCkuZ2V0Q2hpbGRTaW1wbGVUeXBlKCksIHBhcmVudFNpbXBsZVR5cGUxLmdldENoaWxkU2ltcGxlVHlwZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0VGVzdFNpbXBsZUF0dHJpYnV0ZUVsZW1lbnQoKS5nZXRBdHRyaWIyKCkuZ2V0Q2hpbGRTaW1wbGVUeXBlKCksIHBhcmVudFNpbXBsZVR5cGUyLmdldENoaWxkU2ltcGxlVHlwZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGFzc2VydEZhbHNlKHRydWUpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9ybWFsU2ltcGxlVHlwZUVsZW1lbnQoKSB7Ci0KLSAgICAgICAgTm9ybWFsU2ltcGxlVHlwZUVsZW1lbnQgbm9ybWFsU2ltcGxlVHlwZUVsZW1lbnQgPSBuZXcgTm9ybWFsU2ltcGxlVHlwZUVsZW1lbnQoKTsKLSAgICAgICAgUGFyZW50Tm9ybWFsU2ltcGxlVHlwZSBwYXJlbnROb3JtYWxTaW1wbGVUeXBlID0gbmV3IFBhcmVudE5vcm1hbFNpbXBsZVR5cGUoKTsKLSAgICAgICAgbm9ybWFsU2ltcGxlVHlwZUVsZW1lbnQuc2V0Tm9ybWFsU2ltcGxlVHlwZUVsZW1lbnQocGFyZW50Tm9ybWFsU2ltcGxlVHlwZSk7Ci0gICAgICAgIHBhcmVudE5vcm1hbFNpbXBsZVR5cGUuc2V0Tm9ybWFsU2ltcGxlVHlwZShuZXcgUU5hbWUoImh0dHA6Ly93c28yLmNvbSIsICJ0ZXN0IikpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gbm9ybWFsU2ltcGxlVHlwZUVsZW1lbnQuZ2V0T01FbGVtZW50KE5vcm1hbFNpbXBsZVR5cGVFbGVtZW50Lk1ZX1FOQU1FLCBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT00gRWxlbWVudCA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIE5vcm1hbFNpbXBsZVR5cGVFbGVtZW50IHJlc3VsdCA9IE5vcm1hbFNpbXBsZVR5cGVFbGVtZW50LkZhY3RvcnkucGFyc2UoeG1sUmVhZGVyKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0Tm9ybWFsU2ltcGxlVHlwZUVsZW1lbnQoKS5nZXROb3JtYWxTaW1wbGVUeXBlKCksIHBhcmVudE5vcm1hbFNpbXBsZVR5cGUuZ2V0Tm9ybWFsU2ltcGxlVHlwZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGFzc2VydEZhbHNlKHRydWUpOwotICAgICAgICB9Ci0KLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFbnVtZXJhdGlvblNpbXBsZVR5cGVFbGVtZW50KCkgewotCi0gICAgICAgIEVudW1lcmF0aW9uU2ltcGxlVHlwZUVsZW1lbnQgZW51bWVyYXRpb25TaW1wbGVUeXBlRWxlbWVudCA9IG5ldyBFbnVtZXJhdGlvblNpbXBsZVR5cGVFbGVtZW50KCk7Ci0gICAgICAgIGVudW1lcmF0aW9uU2ltcGxlVHlwZUVsZW1lbnQuc2V0RW51bWVyYXRpb25TaW1wbGVUeXBlRWxlbWVudChQYXJlbnRFbnVtZXJhdGlvblNpbXBsZVR5cGUudmFsdWUxKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IGVudW1lcmF0aW9uU2ltcGxlVHlwZUVsZW1lbnQuZ2V0T01FbGVtZW50KEVudW1lcmF0aW9uU2ltcGxlVHlwZUVsZW1lbnQuTVlfUU5BTUUsIE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgICAgIFN0cmluZyBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTSBFbGVtZW50ID09PiAiICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvbUVsZW1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgRW51bWVyYXRpb25TaW1wbGVUeXBlRWxlbWVudCByZXN1bHQgPSBFbnVtZXJhdGlvblNpbXBsZVR5cGVFbGVtZW50LkZhY3RvcnkucGFyc2UoeG1sUmVhZGVyKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0RW51bWVyYXRpb25TaW1wbGVUeXBlRWxlbWVudCgpLmdldFZhbHVlKCksIFBhcmVudEVudW1lcmF0aW9uU2ltcGxlVHlwZS52YWx1ZTEuZ2V0VmFsdWUoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBhc3NlcnRGYWxzZSh0cnVlKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENvbXBsZXhSZXN0cmljdGlvblR5cGUoKSB7Ci0KLSAgICAgICAgQ29tcGxleFJlc3RyaWN0aW9uVHlwZVRlc3RFbGVtZW50IGNvbXBsZXhSZXN0cmljdGlvblR5cGVUZXN0RWxlbWVudCA9IG5ldyBDb21wbGV4UmVzdHJpY3Rpb25UeXBlVGVzdEVsZW1lbnQoKTsKLSAgICAgICAgUGFyZW50UmVzdHJpY3Rpb25UeXBlIHBhcmVudFJlc3RyaWN0aW9uVHlwZSA9IG5ldyBQYXJlbnRSZXN0cmljdGlvblR5cGUoKTsKLSAgICAgICAgY29tcGxleFJlc3RyaWN0aW9uVHlwZVRlc3RFbGVtZW50LnNldENvbXBsZXhSZXN0cmljdGlvblR5cGVUZXN0RWxlbWVudChwYXJlbnRSZXN0cmljdGlvblR5cGUpOwotICAgICAgICBwYXJlbnRSZXN0cmljdGlvblR5cGUuc2V0QmFzZVR5cGVFbGVtZW50MSgidGVzdCAxIik7Ci0gICAgICAgIHBhcmVudFJlc3RyaWN0aW9uVHlwZS5zZXRCYXNlVHlwZUVsZW1lbnQyKDUpOwotCi0gICAgICAgICB0cnkgewotICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IGNvbXBsZXhSZXN0cmljdGlvblR5cGVUZXN0RWxlbWVudC5nZXRPTUVsZW1lbnQoQ29tcGxleFJlc3RyaWN0aW9uVHlwZVRlc3RFbGVtZW50Lk1ZX1FOQU1FLCBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT00gRWxlbWVudCA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIENvbXBsZXhSZXN0cmljdGlvblR5cGVUZXN0RWxlbWVudCByZXN1bHQgPSBDb21wbGV4UmVzdHJpY3Rpb25UeXBlVGVzdEVsZW1lbnQuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRDb21wbGV4UmVzdHJpY3Rpb25UeXBlVGVzdEVsZW1lbnQoKS5nZXRCYXNlVHlwZUVsZW1lbnQxKCksIHBhcmVudFJlc3RyaWN0aW9uVHlwZS5nZXRCYXNlVHlwZUVsZW1lbnQxKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRDb21wbGV4UmVzdHJpY3Rpb25UeXBlVGVzdEVsZW1lbnQoKS5nZXRCYXNlVHlwZUVsZW1lbnQyKCksIHBhcmVudFJlc3RyaWN0aW9uVHlwZS5nZXRCYXNlVHlwZUVsZW1lbnQyKCkpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIGFzc2VydEZhbHNlKHRydWUpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGVyc29uRWxlbWVudCgpIHsKLSAgICAgICAgUGVyc29uRWxlbWVudCBwZXJzb25FbGVtZW50ID0gbmV3IFBlcnNvbkVsZW1lbnQoKTsKLSAgICAgICAgUGVyc29uIHBlcnNvbiA9IG5ldyBQZXJzb24oKTsKLSAgICAgICAgcGVyc29uRWxlbWVudC5zZXRQZXJzb25FbGVtZW50KHBlcnNvbik7Ci0gICAgICAgIHBlcnNvbi5zZXROYW1lKCJhbWlsYSIpOwotICAgICAgICBwZXJzb24uc2V0QWdlKDIzKTsKLSAgICAgICAgcGVyc29uLnNldEhhaXJDb2xvcihIYWlyQ29sb3JfdHlwZTEuYmxhY2spOwotICAgICAgICBEYXRlIGRhdGUgPSBuZXcgRGF0ZSgpOwotICAgICAgICBwZXJzb24uc2V0QmlydGhEYXRlKGRhdGUpOwotICAgICAgICBBZGRyZXNzIGFkZHJlc3MgPSBuZXcgQWRkcmVzcygpOwotICAgICAgICBwZXJzb24uc2V0QWRkcmVzcyhhZGRyZXNzKTsKLSAgICAgICAgYWRkcmVzcy5zZXRDaXR5KCJHYWxsZSIpOwotICAgICAgICBhZGRyZXNzLnNldExpbmUxKCJsaW5lMSIpOwotICAgICAgICBhZGRyZXNzLnNldExpbmUyKCJsaW5lMiIpOwotICAgICAgICBhZGRyZXNzLnNldFN0YXRlKCJzdGF0ZSIpOwotICAgICAgICBaaXBfdHlwZTEgemlwdHlwZSA9IG5ldyBaaXBfdHlwZTEoKTsKLSAgICAgICAgYWRkcmVzcy5zZXRaaXAoemlwdHlwZSk7Ci0gICAgICAgIHppcHR5cGUuc2V0WmlwX3R5cGUwKCJDIik7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSBwZXJzb25FbGVtZW50LmdldE9NRWxlbWVudChDb21wbGV4UmVzdHJpY3Rpb25UeXBlVGVzdEVsZW1lbnQuTVlfUU5BTUUsIE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgICAgIFN0cmluZyBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTSBFbGVtZW50ID09PiAiICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvbUVsZW1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgUGVyc29uRWxlbWVudCByZXN1bHQgPSBQZXJzb25FbGVtZW50LkZhY3RvcnkucGFyc2UoeG1sUmVhZGVyKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UGVyc29uRWxlbWVudCgpLmdldE5hbWUoKSwiYW1pbGEiKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UGVyc29uRWxlbWVudCgpLmdldEFnZSgpLDIzKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UGVyc29uRWxlbWVudCgpLmdldEhhaXJDb2xvcigpLEhhaXJDb2xvcl90eXBlMS5ibGFjayk7Ci0gICAgICAgICAgICBBZGRyZXNzIHJlc3VsdEFkZHJlc3MgPSByZXN1bHQuZ2V0UGVyc29uRWxlbWVudCgpLmdldEFkZHJlc3MoKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHRBZGRyZXNzLmdldENpdHkoKSwiR2FsbGUiKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHRBZGRyZXNzLmdldExpbmUxKCksImxpbmUxIik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0QWRkcmVzcy5nZXRMaW5lMigpLCJsaW5lMiIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdEFkZHJlc3MuZ2V0U3RhdGUoKSwic3RhdGUiKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHRBZGRyZXNzLmdldFppcCgpLmdldFppcF90eXBlMCgpLCJDIik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgYXNzZXJ0RmFsc2UodHJ1ZSk7Ci0gICAgICAgIH0KLQotCi0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvc29hcGVuY29kaW5nL1NvYXBFbmNvZGluZ1Rlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvc29hcGVuY29kaW5nL1NvYXBFbmNvZGluZ1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjMyNzNmMC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3NvYXBlbmNvZGluZy9Tb2FwRW5jb2RpbmdUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5zb2FwZW5jb2Rpbmc7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLnV0aWwuU3RBWFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLkFycmF5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLl9kb3VibGU7Ci1pbXBvcnQgb3JnLnRlbXB1cmkuc29hcGVuY29kaW5nLlRlc3RDb21wbGV4VHlwZTsKLWltcG9ydCBvcmcudGVtcHVyaS5zb2FwZW5jb2RpbmcuVGVzdFNvYXBFbGVtZW50MTsKLWltcG9ydCBvcmcudGVtcHVyaS5zb2FwZW5jb2RpbmcuVGVzdFNvYXBFbGVtZW50MjsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGNsYXNzIFNvYXBFbmNvZGluZ1Rlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U29hcEVsZW1lbnQxMSgpIHsKLQotICAgICAgICBBcnJheSBhcnJheSA9IG5ldyBBcnJheSgpOwotICAgICAgICBhcnJheS5zZXRBcnJheVR5cGVRTmFtZShuZXcgUU5hbWUoImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIiwgImRvdWJsZSIpKTsKLSAgICAgICAgX2RvdWJsZSB0ZXN0RG91YmxlOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKLSAgICAgICAgICAgIHRlc3REb3VibGUgPSBuZXcgX2RvdWJsZSgpOwotICAgICAgICAgICAgdGVzdERvdWJsZS5zZXRfZG91YmxlKDIzLjQ1KTsKLSAgICAgICAgICAgIGFycmF5LmFkZE9iamVjdCh0ZXN0RG91YmxlKTsKLSAgICAgICAgfQotICAgICAgICB0ZXN0U29hcEVsZW1lbnQxMShhcnJheSk7Ci0gICAgICAgIHRlc3RTb2FwRWxlbWVudDIxKGFycmF5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U29hcEVsZW1lbnQxMigpIHsKLQotICAgICAgICBBcnJheSBhcnJheSA9IG5ldyBBcnJheSgpOwotICAgICAgICBfZG91YmxlIHRlc3REb3VibGU7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgewotICAgICAgICAgICAgdGVzdERvdWJsZSA9IG5ldyBfZG91YmxlKCk7Ci0gICAgICAgICAgICB0ZXN0RG91YmxlLnNldF9kb3VibGUoMjMuNDUpOwotICAgICAgICAgICAgYXJyYXkuYWRkT2JqZWN0KHRlc3REb3VibGUpOwotICAgICAgICB9Ci0gICAgICAgIHRlc3RTb2FwRWxlbWVudDExKGFycmF5KTsKLSAgICAgICAgdGVzdFNvYXBFbGVtZW50MjEoYXJyYXkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTb2FwRWxlbWVudDEzKCkgewotCi0gICAgICAgIEFycmF5IGFycmF5ID0gbmV3IEFycmF5KCk7Ci0gICAgICAgIGFycmF5LnNldEFycmF5VHlwZVFOYW1lKG5ldyBRTmFtZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiLCAiZG91YmxlIikpOwotICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnhzZC5fZG91YmxlIHRlc3REb3VibGU7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgewotICAgICAgICAgICAgdGVzdERvdWJsZSA9IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnhzZC5fZG91YmxlKCk7Ci0gICAgICAgICAgICB0ZXN0RG91YmxlLnNldF9kb3VibGUoMjMuNDUpOwotICAgICAgICAgICAgYXJyYXkuYWRkT2JqZWN0KHRlc3REb3VibGUpOwotICAgICAgICB9Ci0gICAgICAgIHRlc3RTb2FwRWxlbWVudDEyKGFycmF5KTsKLSAgICAgICAgdGVzdFNvYXBFbGVtZW50MjIoYXJyYXkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTb2FwRWxlbWVudDE0KCkgewotCi0gICAgICAgIEFycmF5IGFycmF5ID0gbmV3IEFycmF5KCk7Ci0gICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkLl9kb3VibGUgdGVzdERvdWJsZTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7Ci0gICAgICAgICAgICB0ZXN0RG91YmxlID0gbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkLl9kb3VibGUoKTsKLSAgICAgICAgICAgIHRlc3REb3VibGUuc2V0X2RvdWJsZSgyMy40NSk7Ci0gICAgICAgICAgICBhcnJheS5hZGRPYmplY3QodGVzdERvdWJsZSk7Ci0gICAgICAgIH0KLSAgICAgICAgdGVzdFNvYXBFbGVtZW50MTIoYXJyYXkpOwotICAgICAgICB0ZXN0U29hcEVsZW1lbnQyMihhcnJheSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNvYXBFbGVtZW50MTUoKSB7Ci0KLSAgICAgICAgQXJyYXkgYXJyYXkgPSBuZXcgQXJyYXkoKTsKLSAgICAgICAgYXJyYXkuc2V0QXJyYXlUeXBlUU5hbWUobmV3IFFOYW1lKCJodHRwOi8vdGVtcHVyaS5vcmcvc29hcGVuY29kaW5nIiwgIlRlc3RDb21wbGV4VHlwZSIpKTsKLSAgICAgICAgVGVzdENvbXBsZXhUeXBlIHRlc3RDb21wbGV4VHlwZTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7Ci0gICAgICAgICAgICB0ZXN0Q29tcGxleFR5cGUgPSBuZXcgVGVzdENvbXBsZXhUeXBlKCk7Ci0gICAgICAgICAgICB0ZXN0Q29tcGxleFR5cGUuc2V0UGFyYW0xKCJQYXJhbTEiKTsKLSAgICAgICAgICAgIHRlc3RDb21wbGV4VHlwZS5zZXRQYXJhbTIoMik7Ci0gICAgICAgICAgICBhcnJheS5hZGRPYmplY3QodGVzdENvbXBsZXhUeXBlKTsKLSAgICAgICAgfQotICAgICAgICB0ZXN0U29hcEVsZW1lbnQzMShhcnJheSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNvYXBFbGVtZW50MTYoKSB7Ci0KLSAgICAgICAgQXJyYXkgYXJyYXkgPSBuZXcgQXJyYXkoKTsKLSAgICAgICAgVGVzdENvbXBsZXhUeXBlIHRlc3RDb21wbGV4VHlwZTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7Ci0gICAgICAgICAgICB0ZXN0Q29tcGxleFR5cGUgPSBuZXcgVGVzdENvbXBsZXhUeXBlKCk7Ci0gICAgICAgICAgICB0ZXN0Q29tcGxleFR5cGUuc2V0UGFyYW0xKCJQYXJhbTEiKTsKLSAgICAgICAgICAgIHRlc3RDb21wbGV4VHlwZS5zZXRQYXJhbTIoMik7Ci0gICAgICAgICAgICBhcnJheS5hZGRPYmplY3QodGVzdENvbXBsZXhUeXBlKTsKLSAgICAgICAgfQotICAgICAgICB0ZXN0U29hcEVsZW1lbnQzMShhcnJheSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RTb2FwRWxlbWVudDExKEFycmF5IGFycmF5KSB7Ci0gICAgICAgIFRlc3RTb2FwRWxlbWVudDEgdGVzdFNvYXBFbGVtZW50MSA9IG5ldyBUZXN0U29hcEVsZW1lbnQxKCk7Ci0gICAgICAgIHRlc3RTb2FwRWxlbWVudDEuc2V0VGVzdFNvYXBFbGVtZW50MShhcnJheSk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSB0ZXN0U29hcEVsZW1lbnQxLmdldE9NRWxlbWVudCgKLSAgICAgICAgICAgICAgICAgICAgVGVzdFNvYXBFbGVtZW50MS5NWV9RTkFNRSwgT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCkpOwotICAgICAgICAgICAgU3RyaW5nIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NIFN0cmluZyA9PT4iICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKAotICAgICAgICAgICAgICAgICAgICBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIFRlc3RTb2FwRWxlbWVudDEgcmVzdWx0ID0gVGVzdFNvYXBFbGVtZW50MS5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcik7Ci0gICAgICAgICAgICBMaXN0IHJlc3VsdExpc3QgPSByZXN1bHQuZ2V0VGVzdFNvYXBFbGVtZW50MSgpLmdldE9iamVjdExpc3QoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXkuZ2V0T2JqZWN0TGlzdCgpLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCgoX2RvdWJsZSkgcmVzdWx0TGlzdC5nZXQoaSkpLmdldF9kb3VibGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICgoX2RvdWJsZSkgYXJyYXkuZ2V0T2JqZWN0TGlzdCgpLmdldChpKSkuZ2V0X2RvdWJsZSgpLDAuMDAxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoQURCRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAgcHJpdmF0ZSB2b2lkIHRlc3RTb2FwRWxlbWVudDIxKEFycmF5IGFycmF5KSB7Ci0gICAgICAgIFRlc3RTb2FwRWxlbWVudDIgdGVzdFNvYXBFbGVtZW50MiA9IG5ldyBUZXN0U29hcEVsZW1lbnQyKCk7Ci0gICAgICAgIHRlc3RTb2FwRWxlbWVudDIuc2V0UGFyYW0xKCJ0ZXN0IHBhcmFtIik7Ci0gICAgICAgIHRlc3RTb2FwRWxlbWVudDIuc2V0UGFyYW0yKGFycmF5KTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IHRlc3RTb2FwRWxlbWVudDIuZ2V0T01FbGVtZW50KAotICAgICAgICAgICAgICAgICAgICBUZXN0U29hcEVsZW1lbnQxLk1ZX1FOQU1FLCBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT00gU3RyaW5nID09PiIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoCi0gICAgICAgICAgICAgICAgICAgIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvbUVsZW1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgVGVzdFNvYXBFbGVtZW50MiByZXN1bHQgPSBUZXN0U29hcEVsZW1lbnQyLkZhY3RvcnkucGFyc2UoeG1sUmVhZGVyKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UGFyYW0xKCksInRlc3QgcGFyYW0iKTsKLSAgICAgICAgICAgIExpc3QgcmVzdWx0TGlzdCA9IHJlc3VsdC5nZXRQYXJhbTIoKS5nZXRPYmplY3RMaXN0KCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFycmF5LmdldE9iamVjdExpc3QoKS5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygoKF9kb3VibGUpIHJlc3VsdExpc3QuZ2V0KGkpKS5nZXRfZG91YmxlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAoKF9kb3VibGUpIGFycmF5LmdldE9iamVjdExpc3QoKS5nZXQoaSkpLmdldF9kb3VibGUoKSwwLjAwMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEFEQkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RTb2FwRWxlbWVudDEyKEFycmF5IGFycmF5KSB7Ci0gICAgICAgIFRlc3RTb2FwRWxlbWVudDEgdGVzdFNvYXBFbGVtZW50MSA9IG5ldyBUZXN0U29hcEVsZW1lbnQxKCk7Ci0gICAgICAgIHRlc3RTb2FwRWxlbWVudDEuc2V0VGVzdFNvYXBFbGVtZW50MShhcnJheSk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSB0ZXN0U29hcEVsZW1lbnQxLmdldE9NRWxlbWVudCgKLSAgICAgICAgICAgICAgICAgICAgVGVzdFNvYXBFbGVtZW50MS5NWV9RTkFNRSwgT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCkpOwotICAgICAgICAgICAgU3RyaW5nIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NIFN0cmluZyA9PT4iICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKAotICAgICAgICAgICAgICAgICAgICBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIFRlc3RTb2FwRWxlbWVudDEgcmVzdWx0ID0gVGVzdFNvYXBFbGVtZW50MS5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcik7Ci0gICAgICAgICAgICBMaXN0IHJlc3VsdExpc3QgPSByZXN1bHQuZ2V0VGVzdFNvYXBFbGVtZW50MSgpLmdldE9iamVjdExpc3QoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXkuZ2V0T2JqZWN0TGlzdCgpLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCgob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy54c2QuX2RvdWJsZSkgcmVzdWx0TGlzdC5nZXQoaSkpLmdldF9kb3VibGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICgob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy54c2QuX2RvdWJsZSkgYXJyYXkuZ2V0T2JqZWN0TGlzdCgpLmdldChpKSkuZ2V0X2RvdWJsZSgpLDAuMDAxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoQURCRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGVzdFNvYXBFbGVtZW50MjIoQXJyYXkgYXJyYXkpIHsKLSAgICAgICAgVGVzdFNvYXBFbGVtZW50MiB0ZXN0U29hcEVsZW1lbnQyID0gbmV3IFRlc3RTb2FwRWxlbWVudDIoKTsKLSAgICAgICAgdGVzdFNvYXBFbGVtZW50Mi5zZXRQYXJhbTEoInRlc3QgcGFyYW0iKTsKLSAgICAgICAgdGVzdFNvYXBFbGVtZW50Mi5zZXRQYXJhbTIoYXJyYXkpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gdGVzdFNvYXBFbGVtZW50Mi5nZXRPTUVsZW1lbnQoCi0gICAgICAgICAgICAgICAgICAgIFRlc3RTb2FwRWxlbWVudDEuTVlfUU5BTUUsIE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgICAgIFN0cmluZyBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTSBTdHJpbmcgPT0+IiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcigKLSAgICAgICAgICAgICAgICAgICAgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICBUZXN0U29hcEVsZW1lbnQyIHJlc3VsdCA9IFRlc3RTb2FwRWxlbWVudDIuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTEoKSwidGVzdCBwYXJhbSIpOwotICAgICAgICAgICAgTGlzdCByZXN1bHRMaXN0ID0gcmVzdWx0LmdldFBhcmFtMigpLmdldE9iamVjdExpc3QoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXkuZ2V0T2JqZWN0TGlzdCgpLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCgob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy54c2QuX2RvdWJsZSkgcmVzdWx0TGlzdC5nZXQoaSkpLmdldF9kb3VibGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICgob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy54c2QuX2RvdWJsZSkgYXJyYXkuZ2V0T2JqZWN0TGlzdCgpLmdldChpKSkuZ2V0X2RvdWJsZSgpLDAuMDAxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoQURCRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGVzdFNvYXBFbGVtZW50MzEoQXJyYXkgYXJyYXkpIHsKLSAgICAgICAgVGVzdFNvYXBFbGVtZW50MSB0ZXN0U29hcEVsZW1lbnQxID0gbmV3IFRlc3RTb2FwRWxlbWVudDEoKTsKLSAgICAgICAgdGVzdFNvYXBFbGVtZW50MS5zZXRUZXN0U29hcEVsZW1lbnQxKGFycmF5KTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IHRlc3RTb2FwRWxlbWVudDEuZ2V0T01FbGVtZW50KAotICAgICAgICAgICAgICAgICAgICBUZXN0U29hcEVsZW1lbnQxLk1ZX1FOQU1FLCBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT00gU3RyaW5nID09PiIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoCi0gICAgICAgICAgICAgICAgICAgIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvbUVsZW1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgVGVzdFNvYXBFbGVtZW50MSByZXN1bHQgPSBUZXN0U29hcEVsZW1lbnQxLkZhY3RvcnkucGFyc2UoeG1sUmVhZGVyKTsKLSAgICAgICAgICAgIExpc3QgcmVzdWx0TGlzdCA9IHJlc3VsdC5nZXRUZXN0U29hcEVsZW1lbnQxKCkuZ2V0T2JqZWN0TGlzdCgpOwotICAgICAgICAgICAgVGVzdENvbXBsZXhUeXBlIHRlc3RDb21wbGV4VHlwZSA9IG51bGw7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdExpc3Quc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICB0ZXN0Q29tcGxleFR5cGUgPSAoVGVzdENvbXBsZXhUeXBlKSByZXN1bHRMaXN0LmdldChpKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHModGVzdENvbXBsZXhUeXBlLmdldFBhcmFtMSgpLCJQYXJhbTEiKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHModGVzdENvbXBsZXhUeXBlLmdldFBhcmFtMigpLDIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChBREJFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3Rlc3RzdWl0ZS9BYnN0cmFjdFRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvdGVzdHN1aXRlL0Fic3RyYWN0VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGY5OTg3Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvdGVzdHN1aXRlL0Fic3RyYWN0VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEudGVzdHN1aXRlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5hbWVzcGFjZTsKLWltcG9ydCBzZXJ2aWNlcy5lY2hvLnR5cGVzLkJvb2tJbmZvcm1hdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgQWJzdHJhY3RUZXN0ICBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgICBwcm90ZWN0ZWQgT01FbGVtZW50IGdldE9NRWxlbWVudCgpewotICAgICAgICBPTUZhY3RvcnkgZmFjID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDEyRmFjdG9yeSgpOwotICAgICAgICBPTU5hbWVzcGFjZSBvbU5hbWVzcGFjZSA9IGZhYy5jcmVhdGVPTU5hbWVzcGFjZSgiaHR0cDovL3Rlc3Qud3MwMi5jb20iLCJuczEiKTsKLSAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoIlRlc3RWYWx1ZSIsIG9tTmFtZXNwYWNlKTsKLSAgICAgICAgb21FbGVtZW50LmFkZENoaWxkKGZhYy5jcmVhdGVPTVRleHQoInRlc3RTdHJpbmciKSk7Ci0gICAgICAgIHJldHVybiBvbUVsZW1lbnQ7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNPTUVsZW1lbnRzRXF1YWwoT01FbGVtZW50IG9tRWxlbWVudDEsT01FbGVtZW50IG9tRWxlbWVudDIpewotICAgICAgICBib29sZWFuIGlzRXF1YWwgPSBmYWxzZTsKLSAgICAgICAgaWYgKChvbUVsZW1lbnQxID09IG51bGwpIHx8IChvbUVsZW1lbnQyID09IG51bGwpKXsKLSAgICAgICAgICAgIGlzRXF1YWwgPSAob21FbGVtZW50MSA9PSBvbUVsZW1lbnQyKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlzRXF1YWwgPSBvbUVsZW1lbnQxLmdldExvY2FsTmFtZSgpLmVxdWFscyhvbUVsZW1lbnQyLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXNFcXVhbDsKLSAgICB9Ci0KLSAgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNPYmplY3RzRXF1YWwoT2JqZWN0IG9iamVjdDEsT2JqZWN0IG9iamVjdDIpewotICAgICAgICBib29sZWFuIGlzRXF1YWwgPSBmYWxzZTsKLSAgICAgICAgaWYgKChvYmplY3QxID09IG51bGwpIHx8IChvYmplY3QyID09IG51bGwpKXsKLSAgICAgICAgICAgIGlzRXF1YWwgPSAob2JqZWN0MSA9PSBvYmplY3QyKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlzRXF1YWwgPSBvYmplY3QxLmVxdWFscyhvYmplY3QyKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXNFcXVhbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kKCl7Ci0JICAgIC8vIGR1bW15IHRlc3QgbWV0aG9kCi0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gYXNzZXJ0QXJyYXlFcXVhbChPYmplY3RbXSBvYmplY3RBcnJheTEsIE9iamVjdFtdIG9iamVjdEFycmF5MikgewotICAgICAgICBib29sZWFuIGlzRXF1YWwgPSBmYWxzZTsKLSAgICAgICAgaWYgKChvYmplY3RBcnJheTEgPT0gbnVsbCkgfHwgKG9iamVjdEFycmF5MiA9PSBudWxsKSkgewotICAgICAgICAgICAgaXNFcXVhbCA9IChvYmplY3RBcnJheTEgPT0gb2JqZWN0QXJyYXkyKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIGkuZSBib3RoIGFyZSBub3QgbnVsbAotICAgICAgICAgICAgaWYgKG9iamVjdEFycmF5MS5sZW5ndGggPT0gb2JqZWN0QXJyYXkyLmxlbmd0aCkgewotICAgICAgICAgICAgICAgIGlzRXF1YWwgPSB0cnVlOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgb2JqZWN0QXJyYXkxLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghaXNPYmplY3RDb250YWlucyhvYmplY3RBcnJheTIsIG9iamVjdEFycmF5MVtpXSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlzRXF1YWwgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpc0VxdWFsOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIGlzT2JqZWN0Q29udGFpbnMoT2JqZWN0W10gb2JqZWN0QXJyYXksIE9iamVjdCBvYmplY3QpIHsKLSAgICAgICAgYm9vbGVhbiBpc0NvbnRhaW4gPSBmYWxzZTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvYmplY3RBcnJheS5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKChvYmplY3RBcnJheVtpXSA9PSBudWxsKSB8fCAob2JqZWN0ID09IG51bGwpKSB7Ci0gICAgICAgICAgICAgICAgaXNDb250YWluID0gIChvYmplY3RBcnJheVtpXSA9PSBvYmplY3QpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgQm9va0luZm9ybWF0aW9uKXsKLSAgICAgICAgICAgICAgICAgICAgaXNDb250YWluID0gaXNCb29rSW5mb3JtYXRpb25PYmplY3RzRXF1YWxzKChCb29rSW5mb3JtYXRpb24pb2JqZWN0QXJyYXlbaV0sKEJvb2tJbmZvcm1hdGlvbilvYmplY3QpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgT01FbGVtZW50KXsKLSAgICAgICAgICAgICAgICAgICAgaXNDb250YWluID0gaXNPTUVsZW1lbnRzRXF1YWwoKE9NRWxlbWVudClvYmplY3RBcnJheVtpXSwoT01FbGVtZW50KW9iamVjdCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaXNDb250YWluID0gb2JqZWN0QXJyYXlbaV0uZXF1YWxzKG9iamVjdCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGlzQ29udGFpbikgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpc0NvbnRhaW47Ci0gICAgfQotCi0gICAgIHByb3RlY3RlZCBib29sZWFuIGlzQm9va0luZm9ybWF0aW9uT2JqZWN0c0VxdWFscyhCb29rSW5mb3JtYXRpb24gYm9va0luZm9ybWF0aW9uMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvb2tJbmZvcm1hdGlvbiBib29rSW5mb3JtYXRpb24yKXsKLSAgICAgICAgIGJvb2xlYW4gaXNFcXVhbDsKLSAgICAgICAgIGlmICgoYm9va0luZm9ybWF0aW9uMSA9PSBudWxsKSB8fCAoYm9va0luZm9ybWF0aW9uMiA9PSBudWxsKSl7Ci0gICAgICAgICAgICBpc0VxdWFsID0gKGJvb2tJbmZvcm1hdGlvbjEgPT0gYm9va0luZm9ybWF0aW9uMik7Ci0gICAgICAgICB9ICBlbHNlIHsKLSAgICAgICAgICAgICBpc0VxdWFsID0gYm9va0luZm9ybWF0aW9uMS5nZXRUeXBlKCkuZXF1YWxzKGJvb2tJbmZvcm1hdGlvbjIuZ2V0VHlwZSgpKSAmJgotICAgICAgICAgICAgICAgICAgICAgYm9va0luZm9ybWF0aW9uMS5nZXRUaXRsZSgpLmVxdWFscyhib29rSW5mb3JtYXRpb24yLmdldFRpdGxlKCkpICYmCi0gICAgICAgICAgICAgICAgICAgICBib29rSW5mb3JtYXRpb24xLmdldElzYm4oKS5lcXVhbHMoYm9va0luZm9ybWF0aW9uMi5nZXRJc2JuKCkpOwotICAgICAgICAgfQotICAgICAgICAgcmV0dXJuIGlzRXF1YWw7Ci0gICAgIH0KLQotICAgICBwcm90ZWN0ZWQgQm9va0luZm9ybWF0aW9uIGdldEJvb2tJbmZvcm1hdGlvbigpIHsKLSAgICAgICAgQm9va0luZm9ybWF0aW9uIGJvb2tJbmZvcm1hdGlvbiA9IG5ldyBCb29rSW5mb3JtYXRpb24oKTsKLSAgICAgICAgYm9va0luZm9ybWF0aW9uLnNldFR5cGUoInRlc3QiKTsKLSAgICAgICAgYm9va0luZm9ybWF0aW9uLnNldFRpdGxlKCJ0ZXN0Iik7Ci0gICAgICAgIGJvb2tJbmZvcm1hdGlvbi5zZXRJc2JuKCJ0ZXN0Iik7Ci0gICAgICAgIHJldHVybiBib29rSW5mb3JtYXRpb247Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvdGVzdHN1aXRlL0FueUVsZW1lbnRzVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS90ZXN0c3VpdGUvQW55RWxlbWVudHNUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwZWQ5MzguLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS90ZXN0c3VpdGUvQW55RWxlbWVudHNUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS50ZXN0c3VpdGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5TdEFYVXRpbHM7Ci1pbXBvcnQgc2VydmljZXMuZWNoby50eXBlcy5UZXN0QW55MTsKLWltcG9ydCBzZXJ2aWNlcy5lY2hvLnR5cGVzLlRlc3RBbnkyOwotaW1wb3J0IHNlcnZpY2VzLmVjaG8udHlwZXMuVGVzdEFueTM7Ci1pbXBvcnQgc2VydmljZXMuZWNoby50eXBlcy5UZXN0QW55NDsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci0KLQotcHVibGljIGNsYXNzIEFueUVsZW1lbnRzVGVzdCBleHRlbmRzIEFic3RyYWN0VGVzdCB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNSU5fRVFVQUxTX1pFUk8gPSAwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1JTl9FUVVBTFNfT05FID0gMTsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBbnlBcnJheSgpIHsKLSAgICAgICAgT01FbGVtZW50W10gcmV0dXJuT2JqZWN0OwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gdGVzdEFueUFycmF5KG51bGwsIE1JTl9FUVVBTFNfWkVSTyk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGFzc2VydEFycmF5RXF1YWwocmV0dXJuT2JqZWN0LCBudWxsKSk7Ci0gICAgICAgICAgICByZXR1cm5PYmplY3QgPSB0ZXN0QW55QXJyYXkobmV3IE9NRWxlbWVudFtde251bGx9LCBNSU5fRVFVQUxTX1pFUk8pOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhc3NlcnRBcnJheUVxdWFsKHJldHVybk9iamVjdCwgbnVsbCkpOwotICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gdGVzdEFueUFycmF5KG5ldyBPTUVsZW1lbnRbXXtnZXRPTUVsZW1lbnQoKX0sIE1JTl9FUVVBTFNfWkVSTyk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGFzc2VydEFycmF5RXF1YWwocmV0dXJuT2JqZWN0LCBuZXcgT01FbGVtZW50W117Z2V0T01FbGVtZW50KCl9KSk7Ci0gICAgICAgICAgICByZXR1cm5PYmplY3QgPSB0ZXN0QW55QXJyYXkobmV3IE9NRWxlbWVudFtde2dldE9NRWxlbWVudCgpLCBnZXRPTUVsZW1lbnQoKX0sIE1JTl9FUVVBTFNfWkVSTyk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGFzc2VydEFycmF5RXF1YWwocmV0dXJuT2JqZWN0LCBuZXcgT01FbGVtZW50W117Z2V0T01FbGVtZW50KCksIGdldE9NRWxlbWVudCgpfSkpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm5PYmplY3QgPSB0ZXN0QW55QXJyYXkobnVsbCwgTUlOX0VRVUFMU19PTkUpOwotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh0cnVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm5PYmplY3QgPSB0ZXN0QW55QXJyYXkobmV3IE9NRWxlbWVudFtde251bGx9LCBNSU5fRVFVQUxTX09ORSk7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHRydWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybk9iamVjdCA9IHRlc3RBbnlBcnJheShuZXcgT01FbGVtZW50W117Z2V0T01FbGVtZW50KCksIGdldE9NRWxlbWVudCgpfSwgTUlOX0VRVUFMU19PTkUpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhc3NlcnRBcnJheUVxdWFsKHJldHVybk9iamVjdCwgbmV3IE9NRWxlbWVudFtde2dldE9NRWxlbWVudCgpLCBnZXRPTUVsZW1lbnQoKX0pKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotCi0KLSAgICB9Ci0KLSAgICBwcml2YXRlIE9NRWxlbWVudFtdIHRlc3RBbnlBcnJheShPTUVsZW1lbnRbXSBpbm5lck9iamVjdCwgaW50IHR5cGUpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50OwotICAgICAgICBTdHJpbmcgb21FbGVtZW50U3RyaW5nOwotICAgICAgICBPTUVsZW1lbnRbXSByZXR1cm5PYmplY3QgPSBudWxsOwotCi0gICAgICAgIHN3aXRjaCAodHlwZSkgewotICAgICAgICAgICAgY2FzZSBNSU5fRVFVQUxTX1pFUk8gOiB7Ci0gICAgICAgICAgICAgICAgVGVzdEFueTEgdGVzdEFueSA9IG5ldyBUZXN0QW55MSgpOwotICAgICAgICAgICAgICAgIHRlc3RBbnkuc2V0RXh0cmFFbGVtZW50KGlubmVyT2JqZWN0KTsKLSAgICAgICAgICAgICAgICBvbUVsZW1lbnQgPSB0ZXN0QW55LmdldE9NRWxlbWVudChUZXN0QW55MS5NWV9RTkFNRSwgT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDEyRmFjdG9yeSgpKTsKLSAgICAgICAgICAgICAgICBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT01FbGVtZW50ID09PiAiICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0KLSAgICAgICAgICAgICAgICAgICAgICAgIFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gVGVzdEFueTEuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpLmdldEV4dHJhRWxlbWVudCgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBNSU5fRVFVQUxTX09ORSA6IHsKLSAgICAgICAgICAgICAgICBUZXN0QW55MyB0ZXN0QW55ID0gbmV3IFRlc3RBbnkzKCk7Ci0gICAgICAgICAgICAgICAgdGVzdEFueS5zZXRFeHRyYUVsZW1lbnQoaW5uZXJPYmplY3QpOwotICAgICAgICAgICAgICAgIG9tRWxlbWVudCA9IHRlc3RBbnkuZ2V0T01FbGVtZW50KFRlc3RBbnkzLk1ZX1FOQU1FLCBPTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTJGYWN0b3J5KCkpOwotICAgICAgICAgICAgICAgIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTUVsZW1lbnQgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgICAgICByZXR1cm5PYmplY3QgPSBUZXN0QW55My5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcikuZ2V0RXh0cmFFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldHVybk9iamVjdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QW55KCkgewotICAgICAgICBPTUVsZW1lbnQgcmV0dXJuT2JqZWN0OwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gdGVzdEFueShudWxsLCBNSU5fRVFVQUxTX1pFUk8pOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShpc09NRWxlbWVudHNFcXVhbChyZXR1cm5PYmplY3QsIG51bGwpKTsKLSAgICAgICAgICAgIHJldHVybk9iamVjdCA9IHRlc3RBbnkoZ2V0T01FbGVtZW50KCksIE1JTl9FUVVBTFNfWkVSTyk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGlzT01FbGVtZW50c0VxdWFsKHJldHVybk9iamVjdCwgZ2V0T01FbGVtZW50KCkpKTsKLQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybk9iamVjdCA9IHRlc3RBbnkobnVsbCwgTUlOX0VRVUFMU19PTkUpOwotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh0cnVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm5PYmplY3QgPSB0ZXN0QW55KGdldE9NRWxlbWVudCgpLCBNSU5fRVFVQUxTX09ORSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGlzT01FbGVtZW50c0VxdWFsKHJldHVybk9iamVjdCwgZ2V0T01FbGVtZW50KCkpKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgT01FbGVtZW50IHRlc3RBbnkoT01FbGVtZW50IGlubmVyT2JqZWN0LCBpbnQgdHlwZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQ7Ci0gICAgICAgIE9NRWxlbWVudCByZXR1cm5PYmplY3QgPSBudWxsOwotICAgICAgICBTdHJpbmcgb21FbGVtZW50U3RyaW5nOwotCi0gICAgICAgIHN3aXRjaCAodHlwZSkgewotICAgICAgICAgICAgY2FzZSBNSU5fRVFVQUxTX1pFUk8gOiB7Ci0gICAgICAgICAgICAgICAgVGVzdEFueTIgdGVzdEFueSA9IG5ldyBUZXN0QW55MigpOwotICAgICAgICAgICAgICAgIHRlc3RBbnkuc2V0RXh0cmFFbGVtZW50KGlubmVyT2JqZWN0KTsKLSAgICAgICAgICAgICAgICBvbUVsZW1lbnQgPSB0ZXN0QW55LmdldE9NRWxlbWVudChUZXN0QW55Mi5NWV9RTkFNRSwgT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDEyRmFjdG9yeSgpKTsKLSAgICAgICAgICAgICAgICBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT01FbGVtZW50ID09PiAiICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0KLSAgICAgICAgICAgICAgICAgICAgICAgIFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gVGVzdEFueTIuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpLmdldEV4dHJhRWxlbWVudCgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBNSU5fRVFVQUxTX09ORSA6IHsKLSAgICAgICAgICAgICAgICBUZXN0QW55NCB0ZXN0QW55ID0gbmV3IFRlc3RBbnk0KCk7Ci0gICAgICAgICAgICAgICAgdGVzdEFueS5zZXRFeHRyYUVsZW1lbnQoaW5uZXJPYmplY3QpOwotICAgICAgICAgICAgICAgIG9tRWxlbWVudCA9IHRlc3RBbnkuZ2V0T01FbGVtZW50KFRlc3RBbnk0Lk1ZX1FOQU1FLCBPTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTJGYWN0b3J5KCkpOwotICAgICAgICAgICAgICAgIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTUVsZW1lbnQgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgICAgICByZXR1cm5PYmplY3QgPSBUZXN0QW55NC5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcikuZ2V0RXh0cmFFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldHVybk9iamVjdDsKLSAgICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS90ZXN0c3VpdGUvQ3VzdG9tRWxlbWVudHNUZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3Rlc3RzdWl0ZS9DdXN0b21FbGVtZW50c1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRjOTUwOS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3Rlc3RzdWl0ZS9DdXN0b21FbGVtZW50c1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLnRlc3RzdWl0ZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS51dGlsLlN0QVhVdGlsczsKLWltcG9ydCBzZXJ2aWNlcy5lY2hvLnR5cGVzLio7Ci0KLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotCi0KLXB1YmxpYyBjbGFzcyBDdXN0b21FbGVtZW50c1Rlc3QgZXh0ZW5kcyBBYnN0cmFjdFRlc3QgewotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUlOX0VRVUFMU19aRVJPX05JTExBQkxFX1RSVUVfVEVTVCA9IDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUlOX0VRVUFMU19aRVJPX05JTExBQkxFX0ZBTFNFX1RFU1QgPSAyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1JTl9FUVVBTFNfT05FX05JTExBQkxFX1RSVUVfVEVTVCA9IDM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUlOX0VRVUFMU19PTkVfTklMTEFCTEVfRkFMU0VfVEVTVCA9IDQ7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3VzdG9tQXJyYXkoKSB7Ci0KLSAgICAgICAgQm9va0luZm9ybWF0aW9uW10gcmV0dXJuT2JqZWN0OwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIm1pbk9jY3VycyA9IDAgYW5kIG5pbGxhYmxlIHRydWUiKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybk9iamVjdCA9IHRlc3RDdXN0b21BcnJheShudWxsLCBNSU5fRVFVQUxTX1pFUk9fTklMTEFCTEVfVFJVRV9URVNUKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoYXNzZXJ0QXJyYXlFcXVhbChyZXR1cm5PYmplY3QsIG5ldyBCb29rSW5mb3JtYXRpb25bXXtudWxsfSkpOwotICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gdGVzdEN1c3RvbUFycmF5KG5ldyBCb29rSW5mb3JtYXRpb25bXXtudWxsfSwgTUlOX0VRVUFMU19aRVJPX05JTExBQkxFX1RSVUVfVEVTVCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGFzc2VydEFycmF5RXF1YWwocmV0dXJuT2JqZWN0LCBuZXcgQm9va0luZm9ybWF0aW9uW117bnVsbH0pKTsKLSAgICAgICAgICAgIHJldHVybk9iamVjdCA9IHRlc3RDdXN0b21BcnJheShuZXcgQm9va0luZm9ybWF0aW9uW117Z2V0Qm9va0luZm9ybWF0aW9uKCl9LCBNSU5fRVFVQUxTX1pFUk9fTklMTEFCTEVfVFJVRV9URVNUKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoYXNzZXJ0QXJyYXlFcXVhbChyZXR1cm5PYmplY3QsIG5ldyBCb29rSW5mb3JtYXRpb25bXXtnZXRCb29rSW5mb3JtYXRpb24oKX0pKTsKLSAgICAgICAgICAgIHJldHVybk9iamVjdCA9IHRlc3RDdXN0b21BcnJheShuZXcgQm9va0luZm9ybWF0aW9uW117Z2V0Qm9va0luZm9ybWF0aW9uKCksIG51bGx9LCBNSU5fRVFVQUxTX1pFUk9fTklMTEFCTEVfVFJVRV9URVNUKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoYXNzZXJ0QXJyYXlFcXVhbChyZXR1cm5PYmplY3QsIG5ldyBCb29rSW5mb3JtYXRpb25bXXtnZXRCb29rSW5mb3JtYXRpb24oKSwgbnVsbH0pKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIm1pbk9jY3VycyA9IDAgYW5kIG5pbGxhYmxlIGZhbHNlIik7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm5PYmplY3QgPSB0ZXN0Q3VzdG9tQXJyYXkobnVsbCwgTUlOX0VRVUFMU19aRVJPX05JTExBQkxFX0ZBTFNFX1RFU1QpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhc3NlcnRBcnJheUVxdWFsKHJldHVybk9iamVjdCwgbnVsbCkpOwotICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gdGVzdEN1c3RvbUFycmF5KG5ldyBCb29rSW5mb3JtYXRpb25bXXtudWxsfSwgTUlOX0VRVUFMU19aRVJPX05JTExBQkxFX0ZBTFNFX1RFU1QpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhc3NlcnRBcnJheUVxdWFsKHJldHVybk9iamVjdCwgbnVsbCkpOwotICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gdGVzdEN1c3RvbUFycmF5KG5ldyBCb29rSW5mb3JtYXRpb25bXXtnZXRCb29rSW5mb3JtYXRpb24oKX0sIE1JTl9FUVVBTFNfWkVST19OSUxMQUJMRV9GQUxTRV9URVNUKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoYXNzZXJ0QXJyYXlFcXVhbChyZXR1cm5PYmplY3QsIG5ldyBCb29rSW5mb3JtYXRpb25bXXtnZXRCb29rSW5mb3JtYXRpb24oKX0pKTsKLSAgICAgICAgICAgIHJldHVybk9iamVjdCA9IHRlc3RDdXN0b21BcnJheShuZXcgQm9va0luZm9ybWF0aW9uW117Z2V0Qm9va0luZm9ybWF0aW9uKCksIG51bGx9LCBNSU5fRVFVQUxTX1pFUk9fTklMTEFCTEVfRkFMU0VfVEVTVCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGFzc2VydEFycmF5RXF1YWwocmV0dXJuT2JqZWN0LCBuZXcgQm9va0luZm9ybWF0aW9uW117Z2V0Qm9va0luZm9ybWF0aW9uKCl9KSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigibWluT2NjdXJzID0gMSBhbmQgbmlsbGFibGUgdHJ1ZSIpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gdGVzdEN1c3RvbUFycmF5KG51bGwsIE1JTl9FUVVBTFNfT05FX05JTExBQkxFX1RSVUVfVEVTVCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGFzc2VydEFycmF5RXF1YWwocmV0dXJuT2JqZWN0LCBuZXcgQm9va0luZm9ybWF0aW9uW117bnVsbH0pKTsKLSAgICAgICAgICAgIHJldHVybk9iamVjdCA9IHRlc3RDdXN0b21BcnJheShuZXcgQm9va0luZm9ybWF0aW9uW117bnVsbH0sIE1JTl9FUVVBTFNfT05FX05JTExBQkxFX1RSVUVfVEVTVCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGFzc2VydEFycmF5RXF1YWwocmV0dXJuT2JqZWN0LCBuZXcgQm9va0luZm9ybWF0aW9uW117bnVsbH0pKTsKLSAgICAgICAgICAgIHJldHVybk9iamVjdCA9IHRlc3RDdXN0b21BcnJheShuZXcgQm9va0luZm9ybWF0aW9uW117Z2V0Qm9va0luZm9ybWF0aW9uKCl9LCBNSU5fRVFVQUxTX09ORV9OSUxMQUJMRV9UUlVFX1RFU1QpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhc3NlcnRBcnJheUVxdWFsKHJldHVybk9iamVjdCwgbmV3IEJvb2tJbmZvcm1hdGlvbltde2dldEJvb2tJbmZvcm1hdGlvbigpfSkpOwotICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gdGVzdEN1c3RvbUFycmF5KG5ldyBCb29rSW5mb3JtYXRpb25bXXtnZXRCb29rSW5mb3JtYXRpb24oKSwgbnVsbH0sIE1JTl9FUVVBTFNfT05FX05JTExBQkxFX1RSVUVfVEVTVCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGFzc2VydEFycmF5RXF1YWwocmV0dXJuT2JqZWN0LCBuZXcgQm9va0luZm9ybWF0aW9uW117Z2V0Qm9va0luZm9ybWF0aW9uKCksIG51bGx9KSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIm1pbk9jY3VycyA9IDEgYW5kIG5pbGxhYmxlIGZhbHNlIik7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm5PYmplY3QgPSB0ZXN0Q3VzdG9tQXJyYXkobnVsbCwgTUlOX0VRVUFMU19PTkVfTklMTEFCTEVfRkFMU0VfVEVTVCk7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHRydWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybk9iamVjdCA9IHRlc3RDdXN0b21BcnJheShuZXcgQm9va0luZm9ybWF0aW9uW117bnVsbH0sIE1JTl9FUVVBTFNfT05FX05JTExBQkxFX0ZBTFNFX1RFU1QpOwotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh0cnVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm5PYmplY3QgPSB0ZXN0Q3VzdG9tQXJyYXkobmV3IEJvb2tJbmZvcm1hdGlvbltde2dldEJvb2tJbmZvcm1hdGlvbigpLCBudWxsfSwgTUlOX0VRVUFMU19PTkVfTklMTEFCTEVfRkFMU0VfVEVTVCk7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHRydWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybk9iamVjdCA9IHRlc3RDdXN0b21BcnJheShuZXcgQm9va0luZm9ybWF0aW9uW117Z2V0Qm9va0luZm9ybWF0aW9uKCl9LCBNSU5fRVFVQUxTX09ORV9OSUxMQUJMRV9GQUxTRV9URVNUKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoYXNzZXJ0QXJyYXlFcXVhbChyZXR1cm5PYmplY3QsIG5ldyBCb29rSW5mb3JtYXRpb25bXXtnZXRCb29rSW5mb3JtYXRpb24oKX0pKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotCi0KLSAgICB9Ci0KLSAgICBwcml2YXRlIEJvb2tJbmZvcm1hdGlvbltdIHRlc3RDdXN0b21BcnJheShCb29rSW5mb3JtYXRpb25bXSBpbm5lckVsZW1lbnQsIGludCB0eXBlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudDsKLSAgICAgICAgQm9va0luZm9ybWF0aW9uW10gcmV0dXJuT2JqZWN0ID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIG9tRWxlbWVudFN0cmluZzsKLSAgICAgICAgc3dpdGNoICh0eXBlKSB7Ci0gICAgICAgICAgICBjYXNlIE1JTl9FUVVBTFNfWkVST19OSUxMQUJMRV9UUlVFX1RFU1QgOiB7Ci0gICAgICAgICAgICAgICAgVGVzdEJvb2tJbmZvcm1hdGlvbjEgdGVzdEJvb2tJbmZvcm1hdGlvbiA9IG5ldyBUZXN0Qm9va0luZm9ybWF0aW9uMSgpOwotICAgICAgICAgICAgICAgIHRlc3RCb29rSW5mb3JtYXRpb24uc2V0VGVzdFZhbHVlKGlubmVyRWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgb21FbGVtZW50ID0gdGVzdEJvb2tJbmZvcm1hdGlvbi5nZXRPTUVsZW1lbnQoVGVzdEJvb2tJbmZvcm1hdGlvbjEuTVlfUU5BTUUsIE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMkZhY3RvcnkoKSk7Ci0gICAgICAgICAgICAgICAgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NRWxlbWVudCA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvbUVsZW1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgICAgIHJldHVybk9iamVjdCA9IFRlc3RCb29rSW5mb3JtYXRpb24xLkZhY3RvcnkucGFyc2UoeG1sUmVhZGVyKS5nZXRUZXN0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgTUlOX0VRVUFMU19aRVJPX05JTExBQkxFX0ZBTFNFX1RFU1QgOiB7Ci0gICAgICAgICAgICAgICAgVGVzdEJvb2tJbmZvcm1hdGlvbjMgdGVzdEJvb2tJbmZvcm1hdGlvbiA9IG5ldyBUZXN0Qm9va0luZm9ybWF0aW9uMygpOwotICAgICAgICAgICAgICAgIHRlc3RCb29rSW5mb3JtYXRpb24uc2V0VGVzdFZhbHVlKGlubmVyRWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgb21FbGVtZW50ID0gdGVzdEJvb2tJbmZvcm1hdGlvbi5nZXRPTUVsZW1lbnQoVGVzdEJvb2tJbmZvcm1hdGlvbjMuTVlfUU5BTUUsIE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMkZhY3RvcnkoKSk7Ci0gICAgICAgICAgICAgICAgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NRWxlbWVudCA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvbUVsZW1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgICAgIHJldHVybk9iamVjdCA9IFRlc3RCb29rSW5mb3JtYXRpb24zLkZhY3RvcnkucGFyc2UoeG1sUmVhZGVyKS5nZXRUZXN0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgTUlOX0VRVUFMU19PTkVfTklMTEFCTEVfVFJVRV9URVNUIDogewotICAgICAgICAgICAgICAgIFRlc3RCb29rSW5mb3JtYXRpb241IHRlc3RCb29rSW5mb3JtYXRpb24gPSBuZXcgVGVzdEJvb2tJbmZvcm1hdGlvbjUoKTsKLSAgICAgICAgICAgICAgICB0ZXN0Qm9va0luZm9ybWF0aW9uLnNldFRlc3RWYWx1ZShpbm5lckVsZW1lbnQpOwotICAgICAgICAgICAgICAgIG9tRWxlbWVudCA9IHRlc3RCb29rSW5mb3JtYXRpb24uZ2V0T01FbGVtZW50KFRlc3RCb29rSW5mb3JtYXRpb241Lk1ZX1FOQU1FLCBPTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTJGYWN0b3J5KCkpOwotICAgICAgICAgICAgICAgIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTUVsZW1lbnQgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgICAgICByZXR1cm5PYmplY3QgPSBUZXN0Qm9va0luZm9ybWF0aW9uNS5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcikuZ2V0VGVzdFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIE1JTl9FUVVBTFNfT05FX05JTExBQkxFX0ZBTFNFX1RFU1QgOiB7Ci0gICAgICAgICAgICAgICAgVGVzdEJvb2tJbmZvcm1hdGlvbjcgdGVzdEJvb2tJbmZvcm1hdGlvbiA9IG5ldyBUZXN0Qm9va0luZm9ybWF0aW9uNygpOwotICAgICAgICAgICAgICAgIHRlc3RCb29rSW5mb3JtYXRpb24uc2V0VGVzdFZhbHVlKGlubmVyRWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgb21FbGVtZW50ID0gdGVzdEJvb2tJbmZvcm1hdGlvbi5nZXRPTUVsZW1lbnQoVGVzdEJvb2tJbmZvcm1hdGlvbjcuTVlfUU5BTUUsIE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMkZhY3RvcnkoKSk7Ci0gICAgICAgICAgICAgICAgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NRWxlbWVudCA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvbUVsZW1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgICAgIHJldHVybk9iamVjdCA9IFRlc3RCb29rSW5mb3JtYXRpb243LkZhY3RvcnkucGFyc2UoeG1sUmVhZGVyKS5nZXRUZXN0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0dXJuT2JqZWN0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDdXN0b20oKSB7Ci0gICAgICAgIEJvb2tJbmZvcm1hdGlvbiByZXR1cm5PYmplY3Q7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigibWluT2NjdXJzID0gMCBhbmQgbmlsbGFibGUgdHJ1ZSIpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gdGVzdEN1c3RvbShudWxsLCBNSU5fRVFVQUxTX1pFUk9fTklMTEFCTEVfVFJVRV9URVNUKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoaXNCb29rSW5mb3JtYXRpb25PYmplY3RzRXF1YWxzKHJldHVybk9iamVjdCwgbnVsbCkpOwotICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gdGVzdEN1c3RvbShnZXRCb29rSW5mb3JtYXRpb24oKSwgTUlOX0VRVUFMU19aRVJPX05JTExBQkxFX1RSVUVfVEVTVCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGlzQm9va0luZm9ybWF0aW9uT2JqZWN0c0VxdWFscyhyZXR1cm5PYmplY3QsIGdldEJvb2tJbmZvcm1hdGlvbigpKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJtaW5PY2N1cnMgPSAwIGFuZCBuaWxsYWJsZSBmYWxzZSIpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gdGVzdEN1c3RvbShudWxsLCBNSU5fRVFVQUxTX1pFUk9fTklMTEFCTEVfRkFMU0VfVEVTVCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGlzQm9va0luZm9ybWF0aW9uT2JqZWN0c0VxdWFscyhyZXR1cm5PYmplY3QsIG51bGwpKTsKLSAgICAgICAgICAgIHJldHVybk9iamVjdCA9IHRlc3RDdXN0b20oZ2V0Qm9va0luZm9ybWF0aW9uKCksIE1JTl9FUVVBTFNfWkVST19OSUxMQUJMRV9GQUxTRV9URVNUKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoaXNCb29rSW5mb3JtYXRpb25PYmplY3RzRXF1YWxzKHJldHVybk9iamVjdCwgZ2V0Qm9va0luZm9ybWF0aW9uKCkpKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIm1pbk9jY3VycyA9IDEgYW5kIG5pbGxhYmxlIHRydWUiKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybk9iamVjdCA9IHRlc3RDdXN0b20obnVsbCwgTUlOX0VRVUFMU19PTkVfTklMTEFCTEVfVFJVRV9URVNUKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoaXNCb29rSW5mb3JtYXRpb25PYmplY3RzRXF1YWxzKHJldHVybk9iamVjdCwgbnVsbCkpOwotICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gdGVzdEN1c3RvbShnZXRCb29rSW5mb3JtYXRpb24oKSwgTUlOX0VRVUFMU19PTkVfTklMTEFCTEVfVFJVRV9URVNUKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoaXNCb29rSW5mb3JtYXRpb25PYmplY3RzRXF1YWxzKHJldHVybk9iamVjdCwgZ2V0Qm9va0luZm9ybWF0aW9uKCkpKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIm1pbk9jY3VycyA9IDEgYW5kIG5pbGxhYmxlIGZhbHNlIik7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm5PYmplY3QgPSB0ZXN0Q3VzdG9tKG51bGwsIE1JTl9FUVVBTFNfT05FX05JTExBQkxFX0ZBTFNFX1RFU1QpOwotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh0cnVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm5PYmplY3QgPSB0ZXN0Q3VzdG9tKGdldEJvb2tJbmZvcm1hdGlvbigpLCBNSU5fRVFVQUxTX09ORV9OSUxMQUJMRV9GQUxTRV9URVNUKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoaXNCb29rSW5mb3JtYXRpb25PYmplY3RzRXF1YWxzKHJldHVybk9iamVjdCwgZ2V0Qm9va0luZm9ybWF0aW9uKCkpKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHJpdmF0ZSBCb29rSW5mb3JtYXRpb24gdGVzdEN1c3RvbShCb29rSW5mb3JtYXRpb24gaW5uZXJFbGVtZW50LCBpbnQgdHlwZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQ7Ci0gICAgICAgIEJvb2tJbmZvcm1hdGlvbiByZXR1cm5PYmplY3QgPSBudWxsOwotICAgICAgICBTdHJpbmcgb21FbGVtZW50U3RyaW5nOwotICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICAgICAgICAgIGNhc2UgTUlOX0VRVUFMU19aRVJPX05JTExBQkxFX1RSVUVfVEVTVCA6IHsKLSAgICAgICAgICAgICAgICBUZXN0Qm9va0luZm9ybWF0aW9uMiB0ZXN0Qm9va0luZm9ybWF0aW9uID0gbmV3IFRlc3RCb29rSW5mb3JtYXRpb24yKCk7Ci0gICAgICAgICAgICAgICAgdGVzdEJvb2tJbmZvcm1hdGlvbi5zZXRUZXN0VmFsdWUoaW5uZXJFbGVtZW50KTsKLSAgICAgICAgICAgICAgICBvbUVsZW1lbnQgPSB0ZXN0Qm9va0luZm9ybWF0aW9uLmdldE9NRWxlbWVudChUZXN0Qm9va0luZm9ybWF0aW9uMi5NWV9RTkFNRSwgT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDEyRmFjdG9yeSgpKTsKLSAgICAgICAgICAgICAgICBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT01FbGVtZW50ID09PiAiICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0KLSAgICAgICAgICAgICAgICAgICAgICAgIFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gVGVzdEJvb2tJbmZvcm1hdGlvbjIuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpLmdldFRlc3RWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBNSU5fRVFVQUxTX1pFUk9fTklMTEFCTEVfRkFMU0VfVEVTVCA6IHsKLSAgICAgICAgICAgICAgICBUZXN0Qm9va0luZm9ybWF0aW9uNCB0ZXN0Qm9va0luZm9ybWF0aW9uID0gbmV3IFRlc3RCb29rSW5mb3JtYXRpb240KCk7Ci0gICAgICAgICAgICAgICAgdGVzdEJvb2tJbmZvcm1hdGlvbi5zZXRUZXN0VmFsdWUoaW5uZXJFbGVtZW50KTsKLSAgICAgICAgICAgICAgICBvbUVsZW1lbnQgPSB0ZXN0Qm9va0luZm9ybWF0aW9uLmdldE9NRWxlbWVudChUZXN0Qm9va0luZm9ybWF0aW9uNC5NWV9RTkFNRSwgT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDEyRmFjdG9yeSgpKTsKLSAgICAgICAgICAgICAgICBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT01FbGVtZW50ID09PiAiICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0KLSAgICAgICAgICAgICAgICAgICAgICAgIFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gVGVzdEJvb2tJbmZvcm1hdGlvbjQuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpLmdldFRlc3RWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBNSU5fRVFVQUxTX09ORV9OSUxMQUJMRV9UUlVFX1RFU1QgOiB7Ci0gICAgICAgICAgICAgICAgVGVzdEJvb2tJbmZvcm1hdGlvbjYgdGVzdEJvb2tJbmZvcm1hdGlvbiA9IG5ldyBUZXN0Qm9va0luZm9ybWF0aW9uNigpOwotICAgICAgICAgICAgICAgIHRlc3RCb29rSW5mb3JtYXRpb24uc2V0VGVzdFZhbHVlKGlubmVyRWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgb21FbGVtZW50ID0gdGVzdEJvb2tJbmZvcm1hdGlvbi5nZXRPTUVsZW1lbnQoVGVzdEJvb2tJbmZvcm1hdGlvbjYuTVlfUU5BTUUsIE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMkZhY3RvcnkoKSk7Ci0gICAgICAgICAgICAgICAgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NRWxlbWVudCA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvbUVsZW1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgICAgIHJldHVybk9iamVjdCA9IFRlc3RCb29rSW5mb3JtYXRpb242LkZhY3RvcnkucGFyc2UoeG1sUmVhZGVyKS5nZXRUZXN0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgTUlOX0VRVUFMU19PTkVfTklMTEFCTEVfRkFMU0VfVEVTVCA6IHsKLSAgICAgICAgICAgICAgICBUZXN0Qm9va0luZm9ybWF0aW9uOCB0ZXN0Qm9va0luZm9ybWF0aW9uID0gbmV3IFRlc3RCb29rSW5mb3JtYXRpb244KCk7Ci0gICAgICAgICAgICAgICAgdGVzdEJvb2tJbmZvcm1hdGlvbi5zZXRUZXN0VmFsdWUoaW5uZXJFbGVtZW50KTsKLSAgICAgICAgICAgICAgICBvbUVsZW1lbnQgPSB0ZXN0Qm9va0luZm9ybWF0aW9uLmdldE9NRWxlbWVudChUZXN0Qm9va0luZm9ybWF0aW9uOC5NWV9RTkFNRSwgT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDEyRmFjdG9yeSgpKTsKLSAgICAgICAgICAgICAgICBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT01FbGVtZW50ID09PiAiICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0KLSAgICAgICAgICAgICAgICAgICAgICAgIFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gVGVzdEJvb2tJbmZvcm1hdGlvbjguRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpLmdldFRlc3RWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXR1cm5PYmplY3Q7Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvdGVzdHN1aXRlL0ludEVsZW1lbnRzVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS90ZXN0c3VpdGUvSW50RWxlbWVudHNUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkMGNjYTQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS90ZXN0c3VpdGUvSW50RWxlbWVudHNUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS50ZXN0c3VpdGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5TdEFYVXRpbHM7Ci1pbXBvcnQgc2VydmljZXMuZWNoby50eXBlcy4qOwotCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi0KLXB1YmxpYyBjbGFzcyBJbnRFbGVtZW50c1Rlc3QgZXh0ZW5kcyBBYnN0cmFjdFRlc3QgewotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUlOX0VRVUFMU19aRVJPX05JTExBQkxFX1RSVUVfVEVTVCA9IDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUlOX0VRVUFMU19aRVJPX05JTExBQkxFX0ZBTFNFX1RFU1QgPSAyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1JTl9FUVVBTFNfT05FX05JTExBQkxFX1RSVUVfVEVTVCA9IDM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUlOX0VRVUFMU19PTkVfTklMTEFCTEVfRkFMU0VfVEVTVCA9IDQ7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW50QXJyYXkoKSB7Ci0gICAgICAgIGludFtdIHJldHVybk9iamVjdDsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJtaW5PY2N1cnMgPSAwIG5pbGxhYmxlIHRydWUiKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybk9iamVjdCA9IHRlc3RJbnRBcnJheShudWxsLCBNSU5fRVFVQUxTX1pFUk9fTklMTEFCTEVfVFJVRV9URVNUKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhyZXR1cm5PYmplY3QsIG5ldyBpbnRbXXtJbnRlZ2VyLk1JTl9WQUxVRX0pKTsKLSAgICAgICAgICAgIHJldHVybk9iamVjdCA9IHRlc3RJbnRBcnJheShuZXcgaW50W117NX0sIE1JTl9FUVVBTFNfWkVST19OSUxMQUJMRV9UUlVFX1RFU1QpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKHJldHVybk9iamVjdCwgbmV3IGludFtdezV9KSk7Ci0gICAgICAgICAgICByZXR1cm5PYmplY3QgPSB0ZXN0SW50QXJyYXkobmV3IGludFtde0ludGVnZXIuTUlOX1ZBTFVFfSwgTUlOX0VRVUFMU19aRVJPX05JTExBQkxFX1RSVUVfVEVTVCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMocmV0dXJuT2JqZWN0LCBuZXcgaW50W117SW50ZWdlci5NSU5fVkFMVUV9KSk7Ci0gICAgICAgICAgICByZXR1cm5PYmplY3QgPSB0ZXN0SW50QXJyYXkobmV3IGludFtde0ludGVnZXIuTUlOX1ZBTFVFLDV9LCBNSU5fRVFVQUxTX1pFUk9fTklMTEFCTEVfVFJVRV9URVNUKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhyZXR1cm5PYmplY3QsIG5ldyBpbnRbXXtJbnRlZ2VyLk1JTl9WQUxVRSw1fSkpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigibWluT2NjdXJzID0gMCBuaWxsYWJsZSBmYWxzZSIpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gdGVzdEludEFycmF5KG51bGwsIE1JTl9FUVVBTFNfWkVST19OSUxMQUJMRV9GQUxTRV9URVNUKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhyZXR1cm5PYmplY3QsIG51bGwpKTsKLSAgICAgICAgICAgIHJldHVybk9iamVjdCA9IHRlc3RJbnRBcnJheShuZXcgaW50W117NX0sIE1JTl9FUVVBTFNfWkVST19OSUxMQUJMRV9GQUxTRV9URVNUKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhyZXR1cm5PYmplY3QsIG5ldyBpbnRbXXs1fSkpOwotICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gdGVzdEludEFycmF5KG5ldyBpbnRbXXtJbnRlZ2VyLk1JTl9WQUxVRX0sIE1JTl9FUVVBTFNfWkVST19OSUxMQUJMRV9GQUxTRV9URVNUKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhyZXR1cm5PYmplY3QsIG51bGwpKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIm1pbk9jY3VycyA9IDEgbmlsbGFibGUgdHJ1ZSIpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gdGVzdEludEFycmF5KG51bGwsIE1JTl9FUVVBTFNfT05FX05JTExBQkxFX1RSVUVfVEVTVCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMocmV0dXJuT2JqZWN0LCBuZXcgaW50W117SW50ZWdlci5NSU5fVkFMVUV9KSk7Ci0gICAgICAgICAgICByZXR1cm5PYmplY3QgPSB0ZXN0SW50QXJyYXkobmV3IGludFtdezV9LCBNSU5fRVFVQUxTX09ORV9OSUxMQUJMRV9UUlVFX1RFU1QpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKHJldHVybk9iamVjdCwgbmV3IGludFtdezV9KSk7Ci0gICAgICAgICAgICByZXR1cm5PYmplY3QgPSB0ZXN0SW50QXJyYXkobmV3IGludFtde0ludGVnZXIuTUlOX1ZBTFVFfSwgTUlOX0VRVUFMU19PTkVfTklMTEFCTEVfVFJVRV9URVNUKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhyZXR1cm5PYmplY3QsIG5ldyBpbnRbXXtJbnRlZ2VyLk1JTl9WQUxVRX0pKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIm1pbk9jY3VycyA9IDEgbmlsbGFibGUgZmFsc2UiKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybk9iamVjdCA9IHRlc3RJbnRBcnJheShudWxsLCBNSU5fRVFVQUxTX09ORV9OSUxMQUJMRV9GQUxTRV9URVNUKTsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUodHJ1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gdGVzdEludEFycmF5KG5ldyBpbnRbXXtJbnRlZ2VyLk1JTl9WQUxVRX0sIE1JTl9FUVVBTFNfT05FX05JTExBQkxFX0ZBTFNFX1RFU1QpOwotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh0cnVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm5PYmplY3QgPSB0ZXN0SW50QXJyYXkobmV3IGludFtdezV9LCBNSU5fRVFVQUxTX09ORV9OSUxMQUJMRV9GQUxTRV9URVNUKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhyZXR1cm5PYmplY3QsIG5ldyBpbnRbXXs1fSkpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnRbXSB0ZXN0SW50QXJyYXkoaW50W10gaW5uZXJFbGVtZW50LCBpbnQgdHlwZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQ7Ci0gICAgICAgIGludFtdIHJldHVybk9iamVjdCA9IG51bGw7Ci0gICAgICAgIFN0cmluZyBvbUVsZW1lbnRTdHJpbmc7Ci0gICAgICAgIHN3aXRjaCAodHlwZSkgewotICAgICAgICAgICAgY2FzZSBNSU5fRVFVQUxTX1pFUk9fTklMTEFCTEVfVFJVRV9URVNUIDogewotICAgICAgICAgICAgICAgIFRlc3RJbnQxIHRlc3RJbnQgPSBuZXcgVGVzdEludDEoKTsKLSAgICAgICAgICAgICAgICB0ZXN0SW50LnNldFRlc3RWYWx1ZShpbm5lckVsZW1lbnQpOwotICAgICAgICAgICAgICAgIG9tRWxlbWVudCA9IHRlc3RJbnQuZ2V0T01FbGVtZW50KFRlc3RJbnQxLk1ZX1FOQU1FLCBPTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTJGYWN0b3J5KCkpOwotICAgICAgICAgICAgICAgIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTUVsZW1lbnQgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgICAgICByZXR1cm5PYmplY3QgPSBUZXN0SW50MS5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcikuZ2V0VGVzdFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIE1JTl9FUVVBTFNfWkVST19OSUxMQUJMRV9GQUxTRV9URVNUIDogewotICAgICAgICAgICAgICAgIFRlc3RJbnQzIHRlc3RJbnQgPSBuZXcgVGVzdEludDMoKTsKLSAgICAgICAgICAgICAgICB0ZXN0SW50LnNldFRlc3RWYWx1ZShpbm5lckVsZW1lbnQpOwotICAgICAgICAgICAgICAgIG9tRWxlbWVudCA9IHRlc3RJbnQuZ2V0T01FbGVtZW50KFRlc3RJbnQzLk1ZX1FOQU1FLCBPTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTJGYWN0b3J5KCkpOwotICAgICAgICAgICAgICAgIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTUVsZW1lbnQgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgICAgICByZXR1cm5PYmplY3QgPSBUZXN0SW50My5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcikuZ2V0VGVzdFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIE1JTl9FUVVBTFNfT05FX05JTExBQkxFX1RSVUVfVEVTVCA6IHsKLSAgICAgICAgICAgICAgICBUZXN0SW50NSB0ZXN0SW50ID0gbmV3IFRlc3RJbnQ1KCk7Ci0gICAgICAgICAgICAgICAgdGVzdEludC5zZXRUZXN0VmFsdWUoaW5uZXJFbGVtZW50KTsKLSAgICAgICAgICAgICAgICBvbUVsZW1lbnQgPSB0ZXN0SW50LmdldE9NRWxlbWVudChUZXN0SW50NS5NWV9RTkFNRSwgT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDEyRmFjdG9yeSgpKTsKLSAgICAgICAgICAgICAgICBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT01FbGVtZW50ID09PiAiICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0KLSAgICAgICAgICAgICAgICAgICAgICAgIFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gVGVzdEludDUuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpLmdldFRlc3RWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBNSU5fRVFVQUxTX09ORV9OSUxMQUJMRV9GQUxTRV9URVNUIDogewotICAgICAgICAgICAgICAgIFRlc3RJbnQ3IHRlc3RJbnQgPSBuZXcgVGVzdEludDcoKTsKLSAgICAgICAgICAgICAgICB0ZXN0SW50LnNldFRlc3RWYWx1ZShpbm5lckVsZW1lbnQpOwotICAgICAgICAgICAgICAgIG9tRWxlbWVudCA9IHRlc3RJbnQuZ2V0T01FbGVtZW50KFRlc3RJbnQ3Lk1ZX1FOQU1FLCBPTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTJGYWN0b3J5KCkpOwotICAgICAgICAgICAgICAgIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTUVsZW1lbnQgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgICAgICByZXR1cm5PYmplY3QgPSBUZXN0SW50Ny5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcikuZ2V0VGVzdFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldHVybk9iamVjdDsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJbnQoKSB7Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJtaW4gPTAgYW5kIG5pbGxhYmxlIHRydWUgdGVzdCIpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHRlc3RJbnQoMSwgTUlOX0VRVUFMU19aRVJPX05JTExBQkxFX1RSVUVfVEVTVCksIDEpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHRlc3RJbnQoSW50ZWdlci5NSU5fVkFMVUUsIE1JTl9FUVVBTFNfWkVST19OSUxMQUJMRV9UUlVFX1RFU1QpLCBJbnRlZ2VyLk1JTl9WQUxVRSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHRlc3RJbnQoMSwgTUlOX0VRVUFMU19aRVJPX05JTExBQkxFX0ZBTFNFX1RFU1QpLCAxKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyh0ZXN0SW50KEludGVnZXIuTUlOX1ZBTFVFLE1JTl9FUVVBTFNfWkVST19OSUxMQUJMRV9GQUxTRV9URVNUKSxJbnRlZ2VyLk1JTl9WQUxVRSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHRlc3RJbnQoMSwgTUlOX0VRVUFMU19PTkVfTklMTEFCTEVfVFJVRV9URVNUKSwgMSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHModGVzdEludChJbnRlZ2VyLk1JTl9WQUxVRSxNSU5fRVFVQUxTX09ORV9OSUxMQUJMRV9UUlVFX1RFU1QpLEludGVnZXIuTUlOX1ZBTFVFKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotCi0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyh0ZXN0SW50KDEsIE1JTl9FUVVBTFNfT05FX05JTExBQkxFX0ZBTFNFX1RFU1QpLCAxKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHModGVzdEludChJbnRlZ2VyLk1JTl9WQUxVRSwgTUlOX0VRVUFMU19PTkVfTklMTEFCTEVfRkFMU0VfVEVTVCksIEludGVnZXIuTUlOX1ZBTFVFKTsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUodHJ1ZSk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgdGVzdEludChpbnQgaW5uZXJFbGVtZW50LCBpbnQgdHlwZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQ7Ci0gICAgICAgIGludCByZXR1cm5JbnQgPSAwOwotICAgICAgICBTdHJpbmcgb21FbGVtZW50U3RyaW5nOwotCi0gICAgICAgIHN3aXRjaCAodHlwZSkgewotICAgICAgICAgICAgY2FzZSBNSU5fRVFVQUxTX1pFUk9fTklMTEFCTEVfVFJVRV9URVNUIDogewotICAgICAgICAgICAgICAgIFRlc3RJbnQyIHRlc3RJbnQgPSBuZXcgVGVzdEludDIoKTsKLSAgICAgICAgICAgICAgICB0ZXN0SW50LnNldFRlc3RWYWx1ZShpbm5lckVsZW1lbnQpOwotICAgICAgICAgICAgICAgIG9tRWxlbWVudCA9IHRlc3RJbnQuZ2V0T01FbGVtZW50KFRlc3RJbnQyLk1ZX1FOQU1FLCBPTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTJGYWN0b3J5KCkpOwotICAgICAgICAgICAgICAgIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTUVsZW1lbnQgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgICAgICByZXR1cm5JbnQgPSBUZXN0SW50Mi5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcikuZ2V0VGVzdFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIE1JTl9FUVVBTFNfWkVST19OSUxMQUJMRV9GQUxTRV9URVNUIDogewotICAgICAgICAgICAgICAgIFRlc3RJbnQ0IHRlc3RJbnQgPSBuZXcgVGVzdEludDQoKTsKLSAgICAgICAgICAgICAgICB0ZXN0SW50LnNldFRlc3RWYWx1ZShpbm5lckVsZW1lbnQpOwotICAgICAgICAgICAgICAgIG9tRWxlbWVudCA9IHRlc3RJbnQuZ2V0T01FbGVtZW50KFRlc3RJbnQ0Lk1ZX1FOQU1FLCBPTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTJGYWN0b3J5KCkpOwotICAgICAgICAgICAgICAgIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTUVsZW1lbnQgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgICAgICByZXR1cm5JbnQgPSBUZXN0SW50NC5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcikuZ2V0VGVzdFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIE1JTl9FUVVBTFNfT05FX05JTExBQkxFX1RSVUVfVEVTVCA6IHsKLSAgICAgICAgICAgICAgICBUZXN0SW50NiB0ZXN0SW50ID0gbmV3IFRlc3RJbnQ2KCk7Ci0gICAgICAgICAgICAgICAgdGVzdEludC5zZXRUZXN0VmFsdWUoaW5uZXJFbGVtZW50KTsKLSAgICAgICAgICAgICAgICBvbUVsZW1lbnQgPSB0ZXN0SW50LmdldE9NRWxlbWVudChUZXN0SW50Ni5NWV9RTkFNRSwgT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDEyRmFjdG9yeSgpKTsKLSAgICAgICAgICAgICAgICBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT01FbGVtZW50ID09PiAiICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0KLSAgICAgICAgICAgICAgICAgICAgICAgIFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuSW50ID0gVGVzdEludDYuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpLmdldFRlc3RWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBNSU5fRVFVQUxTX09ORV9OSUxMQUJMRV9GQUxTRV9URVNUIDogewotICAgICAgICAgICAgICAgIFRlc3RJbnQ4IHRlc3RJbnQgPSBuZXcgVGVzdEludDgoKTsKLSAgICAgICAgICAgICAgICB0ZXN0SW50LnNldFRlc3RWYWx1ZShpbm5lckVsZW1lbnQpOwotICAgICAgICAgICAgICAgIG9tRWxlbWVudCA9IHRlc3RJbnQuZ2V0T01FbGVtZW50KFRlc3RJbnQ4Lk1ZX1FOQU1FLCBPTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTJGYWN0b3J5KCkpOwotICAgICAgICAgICAgICAgIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTUVsZW1lbnQgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgICAgICByZXR1cm5JbnQgPSBUZXN0SW50Ni5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcikuZ2V0VGVzdFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldHVybkludDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3Rlc3RzdWl0ZS9PdXRlckVsZW1lbnRzVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS90ZXN0c3VpdGUvT3V0ZXJFbGVtZW50c1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODdjZjhiOC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3Rlc3RzdWl0ZS9PdXRlckVsZW1lbnRzVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEudGVzdHN1aXRlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLnV0aWwuU3RBWFV0aWxzOwotaW1wb3J0IHNlcnZpY2VzLmVjaG8udHlwZXMuKjsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci0KLXB1YmxpYyBjbGFzcyBPdXRlckVsZW1lbnRzVGVzdCBleHRlbmRzIEFic3RyYWN0VGVzdCB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOSUxMQUJMRV9UUlVFID0gMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOSUxMQUJMRV9GQUxTRSA9IDE7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nKCkgewotICAgICAgICBTdHJpbmcgcmV0dXJuU3RyaW5nOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuU3RyaW5nID0gdGVzdFN0cmluZyhudWxsLCBOSUxMQUJMRV9UUlVFKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXR1cm5TdHJpbmcsIG51bGwpOwotICAgICAgICAgICAgcmV0dXJuU3RyaW5nID0gdGVzdFN0cmluZygiVGVzdCBTdHJpbmciLCBOSUxMQUJMRV9UUlVFKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXR1cm5TdHJpbmcsICJUZXN0IFN0cmluZyIpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVyblN0cmluZyA9IHRlc3RTdHJpbmcobnVsbCwgTklMTEFCTEVfRkFMU0UpOwotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh0cnVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm5TdHJpbmcgPSB0ZXN0U3RyaW5nKCJUZXN0IFN0cmluZyIsIE5JTExBQkxFX0ZBTFNFKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXR1cm5TdHJpbmcsICJUZXN0IFN0cmluZyIpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgdGVzdFN0cmluZyhTdHJpbmcgaW5uZXJFbGVtZW50LCBpbnQgdHlwZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQ7Ci0gICAgICAgIFN0cmluZyByZXR1cm5TdHJpbmcgPSBudWxsOwotICAgICAgICBTdHJpbmcgb21FbGVtZW50U3RyaW5nOwotCi0gICAgICAgIHN3aXRjaCAodHlwZSkgewotICAgICAgICAgICAgY2FzZSBOSUxMQUJMRV9UUlVFIDogewotICAgICAgICAgICAgICAgIE91dGVyVGVzdFN0cmluZzEgb3V0ZXJUZXN0U3RyaW5nID0gbmV3IE91dGVyVGVzdFN0cmluZzEoKTsKLSAgICAgICAgICAgICAgICBvdXRlclRlc3RTdHJpbmcuc2V0T3V0ZXJUZXN0U3RyaW5nMShpbm5lckVsZW1lbnQpOwotICAgICAgICAgICAgICAgIG9tRWxlbWVudCA9IG91dGVyVGVzdFN0cmluZy5nZXRPTUVsZW1lbnQoT3V0ZXJUZXN0U3RyaW5nMS5NWV9RTkFNRSwgT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDEyRmFjdG9yeSgpKTsKLSAgICAgICAgICAgICAgICBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT01FbGVtZW50ID09PiAiICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0KLSAgICAgICAgICAgICAgICAgICAgICAgIFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuU3RyaW5nID0gT3V0ZXJUZXN0U3RyaW5nMS5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcikuZ2V0T3V0ZXJUZXN0U3RyaW5nMSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIE5JTExBQkxFX0ZBTFNFIDogewotICAgICAgICAgICAgICAgIE91dGVyVGVzdFN0cmluZzIgb3V0ZXJUZXN0U3RyaW5nID0gbmV3IE91dGVyVGVzdFN0cmluZzIoKTsKLSAgICAgICAgICAgICAgICBvdXRlclRlc3RTdHJpbmcuc2V0T3V0ZXJUZXN0U3RyaW5nMihpbm5lckVsZW1lbnQpOwotICAgICAgICAgICAgICAgIG9tRWxlbWVudCA9IG91dGVyVGVzdFN0cmluZy5nZXRPTUVsZW1lbnQoT3V0ZXJUZXN0U3RyaW5nMi5NWV9RTkFNRSwgT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDEyRmFjdG9yeSgpKTsKLSAgICAgICAgICAgICAgICBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT01FbGVtZW50ID09PiAiICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0KLSAgICAgICAgICAgICAgICAgICAgICAgIFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuU3RyaW5nID0gT3V0ZXJUZXN0U3RyaW5nMi5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcikuZ2V0T3V0ZXJUZXN0U3RyaW5nMigpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldHVyblN0cmluZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW50KCkgewotCi0gICAgICAgICB0cnkgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHRlc3RJbnQoNSwgTklMTEFCTEVfVFJVRSksIDUpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHRlc3RJbnQoSW50ZWdlci5NSU5fVkFMVUUsIE5JTExBQkxFX1RSVUUpLCBJbnRlZ2VyLk1JTl9WQUxVRSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHRlc3RJbnQoNSwgTklMTEFCTEVfRkFMU0UpLCA1KTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHModGVzdEludChJbnRlZ2VyLk1JTl9WQUxVRSwgTklMTEFCTEVfRkFMU0UpLCBJbnRlZ2VyLk1JTl9WQUxVRSk7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHRydWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgdGVzdEludChpbnQgaW5uZXJFbGVtZW50LCBpbnQgdHlwZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQ7Ci0gICAgICAgIGludCByZXR1cm5JbnQgPSAwOwotICAgICAgICBTdHJpbmcgb21FbGVtZW50U3RyaW5nOwotICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICAgICAgICAgIGNhc2UgTklMTEFCTEVfVFJVRSA6IHsKLSAgICAgICAgICAgICAgICBPdXRlclRlc3RJbnQxIG91dGVyVGVzdEludCA9IG5ldyBPdXRlclRlc3RJbnQxKCk7Ci0gICAgICAgICAgICAgICAgb3V0ZXJUZXN0SW50LnNldE91dGVyVGVzdEludDEoaW5uZXJFbGVtZW50KTsKLSAgICAgICAgICAgICAgICBvbUVsZW1lbnQgPSBvdXRlclRlc3RJbnQuZ2V0T01FbGVtZW50KE91dGVyVGVzdEludDEuTVlfUU5BTUUsIE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMkZhY3RvcnkoKSk7Ci0gICAgICAgICAgICAgICAgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NRWxlbWVudCA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvbUVsZW1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgICAgIHJldHVybkludCA9IE91dGVyVGVzdEludDEuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpLmdldE91dGVyVGVzdEludDEoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgTklMTEFCTEVfRkFMU0UgOiB7Ci0gICAgICAgICAgICAgICAgT3V0ZXJUZXN0SW50MiBvdXRlclRlc3RJbnQgPSBuZXcgT3V0ZXJUZXN0SW50MigpOwotICAgICAgICAgICAgICAgIG91dGVyVGVzdEludC5zZXRPdXRlclRlc3RJbnQyKGlubmVyRWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgb21FbGVtZW50ID0gb3V0ZXJUZXN0SW50LmdldE9NRWxlbWVudChPdXRlclRlc3RJbnQyLk1ZX1FOQU1FLCBPTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTJGYWN0b3J5KCkpOwotICAgICAgICAgICAgICAgIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTUVsZW1lbnQgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgICAgICByZXR1cm5JbnQgPSBPdXRlclRlc3RJbnQyLkZhY3RvcnkucGFyc2UoeG1sUmVhZGVyKS5nZXRPdXRlclRlc3RJbnQyKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldHVybkludDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QW55VHlwZSgpIHsKLSAgICAgICAgT2JqZWN0IHJldHVybk9iamVjdDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybk9iamVjdCA9IHRlc3RBbnlUeXBlKG51bGwsIE5JTExBQkxFX1RSVUUpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShpc09iamVjdHNFcXVhbChyZXR1cm5PYmplY3QsIG51bGwpKTsKLSAgICAgICAgICAgIHJldHVybk9iamVjdCA9IHRlc3RBbnlUeXBlKG5ldyBEb3VibGUoMjMuNDUpLCBOSUxMQUJMRV9UUlVFKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoaXNPYmplY3RzRXF1YWwocmV0dXJuT2JqZWN0LCBuZXcgRG91YmxlKDIzLjQ1KSkpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybk9iamVjdCA9IHRlc3RBbnlUeXBlKG51bGwsIE5JTExBQkxFX0ZBTFNFKTsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUodHJ1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gdGVzdEFueVR5cGUobmV3IERvdWJsZSgyMy40NSksIE5JTExBQkxFX0ZBTFNFKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoaXNPYmplY3RzRXF1YWwocmV0dXJuT2JqZWN0LCBuZXcgRG91YmxlKDIzLjQ1KSkpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBPYmplY3QgdGVzdEFueVR5cGUoT2JqZWN0IGlubmVyRWxlbWVudCwgaW50IHR5cGUpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50OwotICAgICAgICBPYmplY3QgcmV0dXJuT2JqZWN0ID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIG9tRWxlbWVudFN0cmluZzsKLQotICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICAgICAgICAgIGNhc2UgTklMTEFCTEVfVFJVRSA6IHsKLSAgICAgICAgICAgICAgICBPdXRlclRlc3RBbnlUeXBlMSBvdXRlclRlc3RBbnlUeXBlID0gbmV3IE91dGVyVGVzdEFueVR5cGUxKCk7Ci0gICAgICAgICAgICAgICAgb3V0ZXJUZXN0QW55VHlwZS5zZXRPdXRlclRlc3RBbnlUeXBlMShpbm5lckVsZW1lbnQpOwotICAgICAgICAgICAgICAgIG9tRWxlbWVudCA9IG91dGVyVGVzdEFueVR5cGUuZ2V0T01FbGVtZW50KE91dGVyVGVzdEFueVR5cGUxLk1ZX1FOQU1FLCBPTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTJGYWN0b3J5KCkpOwotICAgICAgICAgICAgICAgIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTUVsZW1lbnQgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgICAgICByZXR1cm5PYmplY3QgPSBPdXRlclRlc3RBbnlUeXBlMS5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcikuZ2V0T3V0ZXJUZXN0QW55VHlwZTEoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSBOSUxMQUJMRV9GQUxTRSA6IHsKLSAgICAgICAgICAgICAgICBPdXRlclRlc3RBbnlUeXBlMiBvdXRlclRlc3RBbnlUeXBlID0gbmV3IE91dGVyVGVzdEFueVR5cGUyKCk7Ci0gICAgICAgICAgICAgICAgb3V0ZXJUZXN0QW55VHlwZS5zZXRPdXRlclRlc3RBbnlUeXBlMihpbm5lckVsZW1lbnQpOwotICAgICAgICAgICAgICAgIG9tRWxlbWVudCA9IG91dGVyVGVzdEFueVR5cGUuZ2V0T01FbGVtZW50KE91dGVyVGVzdEFueVR5cGUyLk1ZX1FOQU1FLCBPTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTJGYWN0b3J5KCkpOwotICAgICAgICAgICAgICAgIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTUVsZW1lbnQgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgICAgICByZXR1cm5PYmplY3QgPSBPdXRlclRlc3RBbnlUeXBlMi5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcikuZ2V0T3V0ZXJUZXN0QW55VHlwZTIoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0dXJuT2JqZWN0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RCb29rSW5mb3JtYXRpb24oKSB7Ci0gICAgICAgIEJvb2tJbmZvcm1hdGlvbiByZXR1cm5PYmplY3Q7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm5PYmplY3QgPSB0ZXN0Qm9va0luZm9ybWF0aW9uKG51bGwsIE5JTExBQkxFX1RSVUUpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShpc0Jvb2tJbmZvcm1hdGlvbk9iamVjdHNFcXVhbHMocmV0dXJuT2JqZWN0LCBudWxsKSk7Ci0gICAgICAgICAgICByZXR1cm5PYmplY3QgPSB0ZXN0Qm9va0luZm9ybWF0aW9uKGdldEJvb2tJbmZvcm1hdGlvbigpLCBOSUxMQUJMRV9UUlVFKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoaXNCb29rSW5mb3JtYXRpb25PYmplY3RzRXF1YWxzKHJldHVybk9iamVjdCwgZ2V0Qm9va0luZm9ybWF0aW9uKCkpKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm5PYmplY3QgPSB0ZXN0Qm9va0luZm9ybWF0aW9uKG51bGwsIE5JTExBQkxFX0ZBTFNFKTsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUodHJ1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gdGVzdEJvb2tJbmZvcm1hdGlvbihnZXRCb29rSW5mb3JtYXRpb24oKSwgTklMTEFCTEVfRkFMU0UpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShpc0Jvb2tJbmZvcm1hdGlvbk9iamVjdHNFcXVhbHMocmV0dXJuT2JqZWN0LCBnZXRCb29rSW5mb3JtYXRpb24oKSkpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBCb29rSW5mb3JtYXRpb24gdGVzdEJvb2tJbmZvcm1hdGlvbihCb29rSW5mb3JtYXRpb24gaW5uZXJFbGVtZW50LCBpbnQgdHlwZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQ7Ci0gICAgICAgIEJvb2tJbmZvcm1hdGlvbiByZXR1cm5PYmplY3QgPSBudWxsOwotICAgICAgICBTdHJpbmcgb21FbGVtZW50U3RyaW5nOwotCi0gICAgICAgIHN3aXRjaCAodHlwZSkgewotICAgICAgICAgICAgY2FzZSBOSUxMQUJMRV9UUlVFIDogewotICAgICAgICAgICAgICAgIE91dGVyVGVzdEJvb2tJbmZvcm1hdGlvbjEgb3V0ZXJUZXN0Qm9va0luZm9ybWF0aW9uID0gbmV3IE91dGVyVGVzdEJvb2tJbmZvcm1hdGlvbjEoKTsKLSAgICAgICAgICAgICAgICBvdXRlclRlc3RCb29rSW5mb3JtYXRpb24uc2V0T3V0ZXJUZXN0Qm9va0luZm9ybWF0aW9uMShpbm5lckVsZW1lbnQpOwotICAgICAgICAgICAgICAgIG9tRWxlbWVudCA9IG91dGVyVGVzdEJvb2tJbmZvcm1hdGlvbi5nZXRPTUVsZW1lbnQoT3V0ZXJUZXN0Qm9va0luZm9ybWF0aW9uMS5NWV9RTkFNRSwgT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDEyRmFjdG9yeSgpKTsKLSAgICAgICAgICAgICAgICBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT01FbGVtZW50ID09PiAiICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0KLSAgICAgICAgICAgICAgICAgICAgICAgIFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gT3V0ZXJUZXN0Qm9va0luZm9ybWF0aW9uMS5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcikuZ2V0T3V0ZXJUZXN0Qm9va0luZm9ybWF0aW9uMSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIE5JTExBQkxFX0ZBTFNFIDogewotICAgICAgICAgICAgICAgIE91dGVyVGVzdEJvb2tJbmZvcm1hdGlvbjIgb3V0ZXJUZXN0Qm9va0luZm9ybWF0aW9uID0gbmV3IE91dGVyVGVzdEJvb2tJbmZvcm1hdGlvbjIoKTsKLSAgICAgICAgICAgICAgICBvdXRlclRlc3RCb29rSW5mb3JtYXRpb24uc2V0T3V0ZXJUZXN0Qm9va0luZm9ybWF0aW9uMihpbm5lckVsZW1lbnQpOwotICAgICAgICAgICAgICAgIG9tRWxlbWVudCA9IG91dGVyVGVzdEJvb2tJbmZvcm1hdGlvbi5nZXRPTUVsZW1lbnQoT3V0ZXJUZXN0Qm9va0luZm9ybWF0aW9uMi5NWV9RTkFNRSwgT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDEyRmFjdG9yeSgpKTsKLSAgICAgICAgICAgICAgICBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT01FbGVtZW50ID09PiAiICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0KLSAgICAgICAgICAgICAgICAgICAgICAgIFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gT3V0ZXJUZXN0Qm9va0luZm9ybWF0aW9uMi5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcikuZ2V0T3V0ZXJUZXN0Qm9va0luZm9ybWF0aW9uMigpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXR1cm5PYmplY3Q7Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvdGVzdHN1aXRlL1N0cmluZ0VsZW1lbnRzVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS90ZXN0c3VpdGUvU3RyaW5nRWxlbWVudHNUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MWFmYjcuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS90ZXN0c3VpdGUvU3RyaW5nRWxlbWVudHNUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS50ZXN0c3VpdGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5TdEFYVXRpbHM7Ci1pbXBvcnQgc2VydmljZXMuZWNoby50eXBlcy4qOwotCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLQotcHVibGljIGNsYXNzIFN0cmluZ0VsZW1lbnRzVGVzdCBleHRlbmRzIEFic3RyYWN0VGVzdCB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNSU5fRVFVQUxTX1pFUk9fTklMTEFCTEVfVFJVRV9URVNUID0gMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNSU5fRVFVQUxTX1pFUk9fTklMTEFCTEVfRkFMU0VfVEVTVCA9IDI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUlOX0VRVUFMU19PTkVfTklMTEFCTEVfVFJVRV9URVNUID0gMzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNSU5fRVFVQUxTX09ORV9OSUxMQUJMRV9GQUxTRV9URVNUID0gNDsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpbmdBcnJheSgpIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUZXN0IG1pbk9jY3VycyAwIG5pbGxhYmxlIHRydWUiKTsKLSAgICAgICAgU3RyaW5nW10gcmV0dXJuT2JqZWN0ID0gbnVsbDsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gdGVzdFN0cmluZ0FycmF5KG51bGwsIE1JTl9FUVVBTFNfWkVST19OSUxMQUJMRV9UUlVFX1RFU1QpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhc3NlcnRBcnJheUVxdWFsKHJldHVybk9iamVjdCwgbmV3IFN0cmluZ1tde251bGx9KSk7Ci0gICAgICAgICAgICByZXR1cm5PYmplY3QgPSB0ZXN0U3RyaW5nQXJyYXkobmV3IFN0cmluZ1tde251bGx9LCBNSU5fRVFVQUxTX1pFUk9fTklMTEFCTEVfVFJVRV9URVNUKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoYXNzZXJ0QXJyYXlFcXVhbChyZXR1cm5PYmplY3QsIG5ldyBTdHJpbmdbXXtudWxsfSkpOwotICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gdGVzdFN0cmluZ0FycmF5KG5ldyBTdHJpbmdbXXsidGVzdCJ9LCBNSU5fRVFVQUxTX1pFUk9fTklMTEFCTEVfVFJVRV9URVNUKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoYXNzZXJ0QXJyYXlFcXVhbChyZXR1cm5PYmplY3QsIG5ldyBTdHJpbmdbXXsidGVzdCJ9KSk7Ci0gICAgICAgICAgICByZXR1cm5PYmplY3QgPSB0ZXN0U3RyaW5nQXJyYXkobmV3IFN0cmluZ1tdeyJ0ZXN0IiwgbnVsbH0sIE1JTl9FUVVBTFNfWkVST19OSUxMQUJMRV9UUlVFX1RFU1QpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhc3NlcnRBcnJheUVxdWFsKHJldHVybk9iamVjdCwgbmV3IFN0cmluZ1tdeyJ0ZXN0IiwgbnVsbH0pKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGVzdCBtaW5PY2N1cnMgPSAwIG5pbGxhYmxlIGZhbHNlIik7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm5PYmplY3QgPSB0ZXN0U3RyaW5nQXJyYXkobnVsbCwgTUlOX0VRVUFMU19aRVJPX05JTExBQkxFX0ZBTFNFX1RFU1QpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhc3NlcnRBcnJheUVxdWFsKHJldHVybk9iamVjdCwgbnVsbCkpOwotICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gdGVzdFN0cmluZ0FycmF5KG5ldyBTdHJpbmdbXXtudWxsfSwgTUlOX0VRVUFMU19aRVJPX05JTExBQkxFX0ZBTFNFX1RFU1QpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhc3NlcnRBcnJheUVxdWFsKHJldHVybk9iamVjdCwgbnVsbCkpOwotICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gdGVzdFN0cmluZ0FycmF5KG5ldyBTdHJpbmdbXXsidGVzdCJ9LCBNSU5fRVFVQUxTX1pFUk9fTklMTEFCTEVfRkFMU0VfVEVTVCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGFzc2VydEFycmF5RXF1YWwocmV0dXJuT2JqZWN0LCBuZXcgU3RyaW5nW117InRlc3QifSkpOwotICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gdGVzdFN0cmluZ0FycmF5KG5ldyBTdHJpbmdbXXsidGVzdCIsIG51bGx9LCBNSU5fRVFVQUxTX1pFUk9fTklMTEFCTEVfRkFMU0VfVEVTVCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGFzc2VydEFycmF5RXF1YWwocmV0dXJuT2JqZWN0LCBuZXcgU3RyaW5nW117InRlc3QifSkpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGVzdCBtaW5PY2N1cnMgPSAxIG5pbGxhYmxlIHRydWUiKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybk9iamVjdCA9IHRlc3RTdHJpbmdBcnJheShudWxsLCBNSU5fRVFVQUxTX09ORV9OSUxMQUJMRV9UUlVFX1RFU1QpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhc3NlcnRBcnJheUVxdWFsKHJldHVybk9iamVjdCwgbmV3IFN0cmluZ1tde251bGx9KSk7Ci0gICAgICAgICAgICByZXR1cm5PYmplY3QgPSB0ZXN0U3RyaW5nQXJyYXkobmV3IFN0cmluZ1tde251bGx9LCBNSU5fRVFVQUxTX09ORV9OSUxMQUJMRV9UUlVFX1RFU1QpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhc3NlcnRBcnJheUVxdWFsKHJldHVybk9iamVjdCwgbmV3IFN0cmluZ1tde251bGx9KSk7Ci0gICAgICAgICAgICByZXR1cm5PYmplY3QgPSB0ZXN0U3RyaW5nQXJyYXkobmV3IFN0cmluZ1tdeyJ0ZXN0In0sIE1JTl9FUVVBTFNfT05FX05JTExBQkxFX1RSVUVfVEVTVCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGFzc2VydEFycmF5RXF1YWwocmV0dXJuT2JqZWN0LCBuZXcgU3RyaW5nW117InRlc3QifSkpOwotICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gdGVzdFN0cmluZ0FycmF5KG5ldyBTdHJpbmdbXXsidGVzdCIsIG51bGx9LCBNSU5fRVFVQUxTX09ORV9OSUxMQUJMRV9UUlVFX1RFU1QpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhc3NlcnRBcnJheUVxdWFsKHJldHVybk9iamVjdCwgbmV3IFN0cmluZ1tdeyJ0ZXN0IiwgbnVsbH0pKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGVzdCBtaW5PY2N1cnMgPSAxIG5pbGxhYmxlIGZhbHNlIik7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybk9iamVjdCA9IHRlc3RTdHJpbmdBcnJheShudWxsLCBNSU5fRVFVQUxTX09ORV9OSUxMQUJMRV9GQUxTRV9URVNUKTsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUodHJ1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gdGVzdFN0cmluZ0FycmF5KG5ldyBTdHJpbmdbXXtudWxsfSwgTUlOX0VRVUFMU19PTkVfTklMTEFCTEVfRkFMU0VfVEVTVCk7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHRydWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybk9iamVjdCA9IHRlc3RTdHJpbmdBcnJheShuZXcgU3RyaW5nW117InRlc3QiLCBudWxsfSwgTUlOX0VRVUFMU19PTkVfTklMTEFCTEVfRkFMU0VfVEVTVCk7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHRydWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybk9iamVjdCA9IHRlc3RTdHJpbmdBcnJheShuZXcgU3RyaW5nW117InRlc3QifSwgTUlOX0VRVUFMU19PTkVfTklMTEFCTEVfRkFMU0VfVEVTVCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGFzc2VydEFycmF5RXF1YWwocmV0dXJuT2JqZWN0LCBuZXcgU3RyaW5nW117InRlc3QifSkpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0KLQotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nW10gdGVzdFN0cmluZ0FycmF5KFN0cmluZ1tdIGlubmVyU3RyaW5nLCBpbnQgdHlwZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgU3RyaW5nW10gcmV0dXJuT2JqZWN0ID0gbnVsbDsKLSAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudDsKLSAgICAgICAgU3RyaW5nIG9tRWxlbWVudFN0cmluZzsKLQotICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICAgICAgICAgIGNhc2UgTUlOX0VRVUFMU19aRVJPX05JTExBQkxFX1RSVUVfVEVTVCA6IHsKLSAgICAgICAgICAgICAgICBUZXN0U3RyaW5nMSB0ZXN0U3RyaW5nID0gbmV3IFRlc3RTdHJpbmcxKCk7Ci0gICAgICAgICAgICAgICAgdGVzdFN0cmluZy5zZXRUZXN0VmFsdWUoaW5uZXJTdHJpbmcpOwotICAgICAgICAgICAgICAgIG9tRWxlbWVudCA9IHRlc3RTdHJpbmcuZ2V0T01FbGVtZW50KFRlc3RTdHJpbmcxLk1ZX1FOQU1FLCBPTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTJGYWN0b3J5KCkpOwotICAgICAgICAgICAgICAgIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTUVsZW1lbnQgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgICAgICByZXR1cm5PYmplY3QgPSBUZXN0U3RyaW5nMS5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcikuZ2V0VGVzdFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIE1JTl9FUVVBTFNfWkVST19OSUxMQUJMRV9GQUxTRV9URVNUIDogewotICAgICAgICAgICAgICAgIFRlc3RTdHJpbmczIHRlc3RTdHJpbmcgPSBuZXcgVGVzdFN0cmluZzMoKTsKLSAgICAgICAgICAgICAgICB0ZXN0U3RyaW5nLnNldFRlc3RWYWx1ZShpbm5lclN0cmluZyk7Ci0gICAgICAgICAgICAgICAgb21FbGVtZW50ID0gdGVzdFN0cmluZy5nZXRPTUVsZW1lbnQoVGVzdFN0cmluZzMuTVlfUU5BTUUsIE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMkZhY3RvcnkoKSk7Ci0gICAgICAgICAgICAgICAgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NRWxlbWVudCA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvbUVsZW1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgICAgIHJldHVybk9iamVjdCA9IFRlc3RTdHJpbmczLkZhY3RvcnkucGFyc2UoeG1sUmVhZGVyKS5nZXRUZXN0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgTUlOX0VRVUFMU19PTkVfTklMTEFCTEVfVFJVRV9URVNUIDogewotICAgICAgICAgICAgICAgIFRlc3RTdHJpbmc1IHRlc3RTdHJpbmcgPSBuZXcgVGVzdFN0cmluZzUoKTsKLSAgICAgICAgICAgICAgICB0ZXN0U3RyaW5nLnNldFRlc3RWYWx1ZShpbm5lclN0cmluZyk7Ci0gICAgICAgICAgICAgICAgb21FbGVtZW50ID0gdGVzdFN0cmluZy5nZXRPTUVsZW1lbnQoVGVzdFN0cmluZzUuTVlfUU5BTUUsIE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMkZhY3RvcnkoKSk7Ci0gICAgICAgICAgICAgICAgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NRWxlbWVudCA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvbUVsZW1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgICAgIHJldHVybk9iamVjdCA9IFRlc3RTdHJpbmc1LkZhY3RvcnkucGFyc2UoeG1sUmVhZGVyKS5nZXRUZXN0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgTUlOX0VRVUFMU19PTkVfTklMTEFCTEVfRkFMU0VfVEVTVCA6IHsKLSAgICAgICAgICAgICAgICBUZXN0U3RyaW5nNyB0ZXN0U3RyaW5nID0gbmV3IFRlc3RTdHJpbmc3KCk7Ci0gICAgICAgICAgICAgICAgdGVzdFN0cmluZy5zZXRUZXN0VmFsdWUoaW5uZXJTdHJpbmcpOwotICAgICAgICAgICAgICAgIG9tRWxlbWVudCA9IHRlc3RTdHJpbmcuZ2V0T01FbGVtZW50KFRlc3RTdHJpbmc3Lk1ZX1FOQU1FLCBPTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTJGYWN0b3J5KCkpOwotICAgICAgICAgICAgICAgIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTUVsZW1lbnQgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgICAgICByZXR1cm5PYmplY3QgPSBUZXN0U3RyaW5nNy5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcikuZ2V0VGVzdFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0dXJuT2JqZWN0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpbmcoKSB7Ci0KLSAgICAgICAgU3RyaW5nIHJldHVybk9iamVjdDsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUZXN0IG1pbk9jY3VycyAwIG5pbGxhYmxlIHRydWUiKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybk9iamVjdCA9IHRlc3RTdHJpbmcobnVsbCwgTUlOX0VRVUFMU19aRVJPX05JTExBQkxFX1RSVUVfVEVTVCk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmV0dXJuT2JqZWN0LCBudWxsKTsKLSAgICAgICAgICAgIHJldHVybk9iamVjdCA9IHRlc3RTdHJpbmcoIlRlc3QiLCBNSU5fRVFVQUxTX1pFUk9fTklMTEFCTEVfVFJVRV9URVNUKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXR1cm5PYmplY3QsICJUZXN0Iik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRlc3QgbWluT2NjdXJzID0gMCBuaWxsYWJsZSBmYWxzZSIpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gdGVzdFN0cmluZyhudWxsLCBNSU5fRVFVQUxTX1pFUk9fTklMTEFCTEVfRkFMU0VfVEVTVCk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmV0dXJuT2JqZWN0LCBudWxsKTsKLSAgICAgICAgICAgIHJldHVybk9iamVjdCA9IHRlc3RTdHJpbmcoIlRlc3QiLCBNSU5fRVFVQUxTX1pFUk9fTklMTEFCTEVfRkFMU0VfVEVTVCk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmV0dXJuT2JqZWN0LCAiVGVzdCIpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUZXN0IG1pbk9jY3VycyA9IDEgbmlsbGFibGUgdHJ1ZSIpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gdGVzdFN0cmluZyhudWxsLCBNSU5fRVFVQUxTX09ORV9OSUxMQUJMRV9UUlVFX1RFU1QpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJldHVybk9iamVjdCwgbnVsbCk7Ci0gICAgICAgICAgICByZXR1cm5PYmplY3QgPSB0ZXN0U3RyaW5nKCJUZXN0IiwgTUlOX0VRVUFMU19PTkVfTklMTEFCTEVfVFJVRV9URVNUKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXR1cm5PYmplY3QsICJUZXN0Iik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUZXN0IG1pbk9jY3VycyA9IDEgbmlsbGFibGUgZmFsc2UiKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybk9iamVjdCA9IHRlc3RTdHJpbmcobnVsbCwgTUlOX0VRVUFMU19PTkVfTklMTEFCTEVfRkFMU0VfVEVTVCk7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHRydWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybk9iamVjdCA9IHRlc3RTdHJpbmcoIlRlc3QiLCBNSU5fRVFVQUxTX09ORV9OSUxMQUJMRV9GQUxTRV9URVNUKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXR1cm5PYmplY3QsICJUZXN0Iik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIHRlc3RTdHJpbmcoU3RyaW5nIGlubmVyU3RyaW5nLCBpbnQgdHlwZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgU3RyaW5nIHJldHVybk9iamVjdCA9IG51bGw7Ci0gICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQ7Ci0gICAgICAgIFN0cmluZyBvbUVsZW1lbnRTdHJpbmc7Ci0KLSAgICAgICAgc3dpdGNoICh0eXBlKSB7Ci0gICAgICAgICAgICBjYXNlIE1JTl9FUVVBTFNfWkVST19OSUxMQUJMRV9UUlVFX1RFU1QgOiB7Ci0gICAgICAgICAgICAgICAgVGVzdFN0cmluZzIgdGVzdFN0cmluZyA9IG5ldyBUZXN0U3RyaW5nMigpOwotICAgICAgICAgICAgICAgIHRlc3RTdHJpbmcuc2V0VGVzdFZhbHVlKGlubmVyU3RyaW5nKTsKLSAgICAgICAgICAgICAgICBvbUVsZW1lbnQgPSB0ZXN0U3RyaW5nLmdldE9NRWxlbWVudChUZXN0U3RyaW5nMi5NWV9RTkFNRSwgT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDEyRmFjdG9yeSgpKTsKLSAgICAgICAgICAgICAgICBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT01FbGVtZW50ID09PiAiICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0KLSAgICAgICAgICAgICAgICAgICAgICAgIFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gVGVzdFN0cmluZzIuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpLmdldFRlc3RWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBNSU5fRVFVQUxTX1pFUk9fTklMTEFCTEVfRkFMU0VfVEVTVCA6IHsKLSAgICAgICAgICAgICAgICBUZXN0U3RyaW5nNCB0ZXN0U3RyaW5nID0gbmV3IFRlc3RTdHJpbmc0KCk7Ci0gICAgICAgICAgICAgICAgdGVzdFN0cmluZy5zZXRUZXN0VmFsdWUoaW5uZXJTdHJpbmcpOwotICAgICAgICAgICAgICAgIG9tRWxlbWVudCA9IHRlc3RTdHJpbmcuZ2V0T01FbGVtZW50KFRlc3RTdHJpbmc0Lk1ZX1FOQU1FLCBPTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTJGYWN0b3J5KCkpOwotICAgICAgICAgICAgICAgIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTUVsZW1lbnQgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgICAgICByZXR1cm5PYmplY3QgPSBUZXN0U3RyaW5nNC5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcikuZ2V0VGVzdFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIE1JTl9FUVVBTFNfT05FX05JTExBQkxFX1RSVUVfVEVTVCA6IHsKLSAgICAgICAgICAgICAgICBUZXN0U3RyaW5nNiB0ZXN0U3RyaW5nID0gbmV3IFRlc3RTdHJpbmc2KCk7Ci0gICAgICAgICAgICAgICAgdGVzdFN0cmluZy5zZXRUZXN0VmFsdWUoaW5uZXJTdHJpbmcpOwotICAgICAgICAgICAgICAgIG9tRWxlbWVudCA9IHRlc3RTdHJpbmcuZ2V0T01FbGVtZW50KFRlc3RTdHJpbmc2Lk1ZX1FOQU1FLCBPTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTJGYWN0b3J5KCkpOwotICAgICAgICAgICAgICAgIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTUVsZW1lbnQgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgICAgICByZXR1cm5PYmplY3QgPSBUZXN0U3RyaW5nNi5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcikuZ2V0VGVzdFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIE1JTl9FUVVBTFNfT05FX05JTExBQkxFX0ZBTFNFX1RFU1QgOiB7Ci0gICAgICAgICAgICAgICAgVGVzdFN0cmluZzggdGVzdFN0cmluZyA9IG5ldyBUZXN0U3RyaW5nOCgpOwotICAgICAgICAgICAgICAgIHRlc3RTdHJpbmcuc2V0VGVzdFZhbHVlKGlubmVyU3RyaW5nKTsKLSAgICAgICAgICAgICAgICBvbUVsZW1lbnQgPSB0ZXN0U3RyaW5nLmdldE9NRWxlbWVudChUZXN0U3RyaW5nOC5NWV9RTkFNRSwgT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDEyRmFjdG9yeSgpKTsKLSAgICAgICAgICAgICAgICBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT01FbGVtZW50ID09PiAiICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0KLSAgICAgICAgICAgICAgICAgICAgICAgIFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gVGVzdFN0cmluZzguRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpLmdldFRlc3RWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldHVybk9iamVjdDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvdGVzdHN1aXRlL1hzZEFueUVsZW1lbnRzVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS90ZXN0c3VpdGUvWHNkQW55RWxlbWVudHNUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiODA1MjguLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS90ZXN0c3VpdGUvWHNkQW55RWxlbWVudHNUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS50ZXN0c3VpdGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5TdEFYVXRpbHM7Ci1pbXBvcnQgc2VydmljZXMuZWNoby50eXBlcy4qOwotCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLQotcHVibGljIGNsYXNzIFhzZEFueUVsZW1lbnRzVGVzdCBleHRlbmRzIEFic3RyYWN0VGVzdCB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNSU5fRVFVQUxTX1pFUk9fTklMTEFCTEVfVFJVRV9URVNUID0gMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNSU5fRVFVQUxTX1pFUk9fTklMTEFCTEVfRkFMU0VfVEVTVCA9IDI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUlOX0VRVUFMU19PTkVfTklMTEFCTEVfVFJVRV9URVNUID0gMzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNSU5fRVFVQUxTX09ORV9OSUxMQUJMRV9GQUxTRV9URVNUID0gNDsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBbnlUeXBlQXJyYXkoKSB7Ci0gICAgICAgIE9iamVjdFtdIHJldHVybk9iamVjdDsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJtaW5PY2N1cnMgPSAwIGFuZCBuaWxsYWJsZSB0cnVlIik7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm5PYmplY3QgPSB0ZXN0QW55VHlwZUFycmF5KG51bGwsIE1JTl9FUVVBTFNfWkVST19OSUxMQUJMRV9UUlVFX1RFU1QpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhc3NlcnRBcnJheUVxdWFsKHJldHVybk9iamVjdCwgbmV3IE9iamVjdFtde251bGx9KSk7Ci0gICAgICAgICAgICByZXR1cm5PYmplY3QgPSB0ZXN0QW55VHlwZUFycmF5KG5ldyBPYmplY3RbXXtudWxsfSwgTUlOX0VRVUFMU19aRVJPX05JTExBQkxFX1RSVUVfVEVTVCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGFzc2VydEFycmF5RXF1YWwocmV0dXJuT2JqZWN0LCBuZXcgT2JqZWN0W117bnVsbH0pKTsKLSAgICAgICAgICAgIHJldHVybk9iamVjdCA9IHRlc3RBbnlUeXBlQXJyYXkobmV3IE9iamVjdFtde25ldyBEb3VibGUoNS42Nyl9LCBNSU5fRVFVQUxTX1pFUk9fTklMTEFCTEVfVFJVRV9URVNUKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoYXNzZXJ0QXJyYXlFcXVhbChyZXR1cm5PYmplY3QsIG5ldyBPYmplY3RbXXtuZXcgRG91YmxlKDUuNjcpfSkpOwotICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gdGVzdEFueVR5cGVBcnJheShuZXcgT2JqZWN0W117bmV3IERvdWJsZSg1LjY3KSwgbnVsbH0sIE1JTl9FUVVBTFNfWkVST19OSUxMQUJMRV9UUlVFX1RFU1QpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhc3NlcnRBcnJheUVxdWFsKHJldHVybk9iamVjdCwgbmV3IE9iamVjdFtde25ldyBEb3VibGUoNS42NyksIG51bGx9KSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJtaW5PY2N1cnMgPSAwIGFuZCBuaWxsYWJsZSBmYWxzZSIpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gdGVzdEFueVR5cGVBcnJheShudWxsLCBNSU5fRVFVQUxTX1pFUk9fTklMTEFCTEVfRkFMU0VfVEVTVCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGFzc2VydEFycmF5RXF1YWwocmV0dXJuT2JqZWN0LCBudWxsKSk7Ci0gICAgICAgICAgICByZXR1cm5PYmplY3QgPSB0ZXN0QW55VHlwZUFycmF5KG5ldyBPYmplY3RbXXtudWxsfSwgTUlOX0VRVUFMU19aRVJPX05JTExBQkxFX0ZBTFNFX1RFU1QpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhc3NlcnRBcnJheUVxdWFsKHJldHVybk9iamVjdCwgbnVsbCkpOwotICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gdGVzdEFueVR5cGVBcnJheShuZXcgT2JqZWN0W117bmV3IERvdWJsZSg1LjY3KX0sIE1JTl9FUVVBTFNfWkVST19OSUxMQUJMRV9GQUxTRV9URVNUKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoYXNzZXJ0QXJyYXlFcXVhbChyZXR1cm5PYmplY3QsIG5ldyBPYmplY3RbXXtuZXcgRG91YmxlKDUuNjcpfSkpOwotICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gdGVzdEFueVR5cGVBcnJheShuZXcgT2JqZWN0W117bmV3IERvdWJsZSg1LjY3KSwgbnVsbH0sIE1JTl9FUVVBTFNfWkVST19OSUxMQUJMRV9GQUxTRV9URVNUKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoYXNzZXJ0QXJyYXlFcXVhbChyZXR1cm5PYmplY3QsIG5ldyBPYmplY3RbXXtuZXcgRG91YmxlKDUuNjcpfSkpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJtaW5PY2N1cnMgPSAxIGFuZCBuaWxsYWJsZSB0cnVlIik7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm5PYmplY3QgPSB0ZXN0QW55VHlwZUFycmF5KG51bGwsIE1JTl9FUVVBTFNfT05FX05JTExBQkxFX1RSVUVfVEVTVCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGFzc2VydEFycmF5RXF1YWwocmV0dXJuT2JqZWN0LCBuZXcgT2JqZWN0W117bnVsbH0pKTsKLSAgICAgICAgICAgIHJldHVybk9iamVjdCA9IHRlc3RBbnlUeXBlQXJyYXkobmV3IE9iamVjdFtde251bGx9LCBNSU5fRVFVQUxTX09ORV9OSUxMQUJMRV9UUlVFX1RFU1QpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhc3NlcnRBcnJheUVxdWFsKHJldHVybk9iamVjdCwgbmV3IE9iamVjdFtde251bGx9KSk7Ci0gICAgICAgICAgICByZXR1cm5PYmplY3QgPSB0ZXN0QW55VHlwZUFycmF5KG5ldyBPYmplY3RbXXtuZXcgRG91YmxlKDUuNjcpfSwgTUlOX0VRVUFMU19PTkVfTklMTEFCTEVfVFJVRV9URVNUKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoYXNzZXJ0QXJyYXlFcXVhbChyZXR1cm5PYmplY3QsIG5ldyBPYmplY3RbXXtuZXcgRG91YmxlKDUuNjcpfSkpOwotICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gdGVzdEFueVR5cGVBcnJheShuZXcgT2JqZWN0W117bmV3IERvdWJsZSg1LjY3KSwgbnVsbH0sIE1JTl9FUVVBTFNfT05FX05JTExBQkxFX1RSVUVfVEVTVCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGFzc2VydEFycmF5RXF1YWwocmV0dXJuT2JqZWN0LCBuZXcgT2JqZWN0W117bmV3IERvdWJsZSg1LjY3KSwgbnVsbH0pKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigibWluT2NjdXJzID0gMSBhbmQgbmlsbGFibGUgZmFsc2UiKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybk9iamVjdCA9IHRlc3RBbnlUeXBlQXJyYXkobnVsbCwgTUlOX0VRVUFMU19PTkVfTklMTEFCTEVfRkFMU0VfVEVTVCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGFzc2VydEFycmF5RXF1YWwocmV0dXJuT2JqZWN0LCBudWxsKSk7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHRydWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybk9iamVjdCA9IHRlc3RBbnlUeXBlQXJyYXkobmV3IE9iamVjdFtde251bGx9LCBNSU5fRVFVQUxTX09ORV9OSUxMQUJMRV9GQUxTRV9URVNUKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoYXNzZXJ0QXJyYXlFcXVhbChyZXR1cm5PYmplY3QsIG5ldyBPYmplY3RbXXtudWxsfSkpOwotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh0cnVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm5PYmplY3QgPSB0ZXN0QW55VHlwZUFycmF5KG5ldyBPYmplY3RbXXtuZXcgRG91YmxlKDUuNjcpLCBudWxsfSwgTUlOX0VRVUFMU19PTkVfTklMTEFCTEVfRkFMU0VfVEVTVCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGFzc2VydEFycmF5RXF1YWwocmV0dXJuT2JqZWN0LCBuZXcgT2JqZWN0W117bmV3IERvdWJsZSg1LjY3KSwgbnVsbH0pKTsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUodHJ1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gdGVzdEFueVR5cGVBcnJheShuZXcgT2JqZWN0W117bmV3IERvdWJsZSg1LjY3KX0sIE1JTl9FUVVBTFNfT05FX05JTExBQkxFX0ZBTFNFX1RFU1QpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhc3NlcnRBcnJheUVxdWFsKHJldHVybk9iamVjdCwgbmV3IE9iamVjdFtde25ldyBEb3VibGUoNS42Nyl9KSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0W10gdGVzdEFueVR5cGVBcnJheShPYmplY3RbXSBpbm5lckVsZW1lbnQsIGludCB0eXBlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudDsKLSAgICAgICAgT2JqZWN0W10gcmV0dXJuT2JqZWN0ID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIG9tRWxlbWVudFN0cmluZzsKLSAgICAgICAgc3dpdGNoICh0eXBlKSB7Ci0gICAgICAgICAgICBjYXNlIE1JTl9FUVVBTFNfWkVST19OSUxMQUJMRV9UUlVFX1RFU1QgOiB7Ci0gICAgICAgICAgICAgICAgVGVzdEFueVR5cGUxIHRlc3RBbnlUeXBlID0gbmV3IFRlc3RBbnlUeXBlMSgpOwotICAgICAgICAgICAgICAgIHRlc3RBbnlUeXBlLnNldFRlc3RWYWx1ZShpbm5lckVsZW1lbnQpOwotICAgICAgICAgICAgICAgIG9tRWxlbWVudCA9IHRlc3RBbnlUeXBlLmdldE9NRWxlbWVudChUZXN0QW55VHlwZTEuTVlfUU5BTUUsIE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMkZhY3RvcnkoKSk7Ci0gICAgICAgICAgICAgICAgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NRWxlbWVudCA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvbUVsZW1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgICAgIHJldHVybk9iamVjdCA9IFRlc3RBbnlUeXBlMS5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcikuZ2V0VGVzdFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIE1JTl9FUVVBTFNfWkVST19OSUxMQUJMRV9GQUxTRV9URVNUIDogewotICAgICAgICAgICAgICAgIFRlc3RBbnlUeXBlMyB0ZXN0QW55VHlwZSA9IG5ldyBUZXN0QW55VHlwZTMoKTsKLSAgICAgICAgICAgICAgICB0ZXN0QW55VHlwZS5zZXRUZXN0VmFsdWUoaW5uZXJFbGVtZW50KTsKLSAgICAgICAgICAgICAgICBvbUVsZW1lbnQgPSB0ZXN0QW55VHlwZS5nZXRPTUVsZW1lbnQoVGVzdEFueVR5cGUzLk1ZX1FOQU1FLCBPTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTJGYWN0b3J5KCkpOwotICAgICAgICAgICAgICAgIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTUVsZW1lbnQgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgICAgICByZXR1cm5PYmplY3QgPSBUZXN0QW55VHlwZTMuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpLmdldFRlc3RWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBNSU5fRVFVQUxTX09ORV9OSUxMQUJMRV9UUlVFX1RFU1QgOiB7Ci0gICAgICAgICAgICAgICAgVGVzdEFueVR5cGU1IHRlc3RBbnlUeXBlID0gbmV3IFRlc3RBbnlUeXBlNSgpOwotICAgICAgICAgICAgICAgIHRlc3RBbnlUeXBlLnNldFRlc3RWYWx1ZShpbm5lckVsZW1lbnQpOwotICAgICAgICAgICAgICAgIG9tRWxlbWVudCA9IHRlc3RBbnlUeXBlLmdldE9NRWxlbWVudChUZXN0QW55VHlwZTUuTVlfUU5BTUUsIE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMkZhY3RvcnkoKSk7Ci0gICAgICAgICAgICAgICAgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NRWxlbWVudCA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvbUVsZW1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgICAgIHJldHVybk9iamVjdCA9IFRlc3RBbnlUeXBlNS5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcikuZ2V0VGVzdFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIE1JTl9FUVVBTFNfT05FX05JTExBQkxFX0ZBTFNFX1RFU1QgOiB7Ci0gICAgICAgICAgICAgICAgVGVzdEFueVR5cGU3IHRlc3RBbnlUeXBlID0gbmV3IFRlc3RBbnlUeXBlNygpOwotICAgICAgICAgICAgICAgIHRlc3RBbnlUeXBlLnNldFRlc3RWYWx1ZShpbm5lckVsZW1lbnQpOwotICAgICAgICAgICAgICAgIG9tRWxlbWVudCA9IHRlc3RBbnlUeXBlLmdldE9NRWxlbWVudChUZXN0QW55VHlwZTcuTVlfUU5BTUUsIE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMkZhY3RvcnkoKSk7Ci0gICAgICAgICAgICAgICAgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NRWxlbWVudCA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvbUVsZW1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgICAgIHJldHVybk9iamVjdCA9IFRlc3RBbnlUeXBlNy5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcikuZ2V0VGVzdFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldHVybk9iamVjdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QW55VHlwZSgpIHsKLQotICAgICAgICBPYmplY3QgcmV0dXJuT2JqZWN0OwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIm1pbk9jY3VycyA9IDAgbmlsbGFibGUgdHJ1ZSIpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gdGVzdEFueVR5cGUobnVsbCwgTUlOX0VRVUFMU19aRVJPX05JTExBQkxFX1RSVUVfVEVTVCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGlzT2JqZWN0c0VxdWFsKHJldHVybk9iamVjdCwgbnVsbCkpOwotICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gdGVzdEFueVR5cGUobmV3IERvdWJsZSgyMy40NSksIE1JTl9FUVVBTFNfWkVST19OSUxMQUJMRV9UUlVFX1RFU1QpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShpc09iamVjdHNFcXVhbChyZXR1cm5PYmplY3QsIG5ldyBEb3VibGUoMjMuNDUpKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJtaW5PY2N1cnMgPSAwIG5pbGxhYmxlIGZhbHNlIik7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm5PYmplY3QgPSB0ZXN0QW55VHlwZShudWxsLCBNSU5fRVFVQUxTX1pFUk9fTklMTEFCTEVfRkFMU0VfVEVTVCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGlzT2JqZWN0c0VxdWFsKHJldHVybk9iamVjdCwgbnVsbCkpOwotICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gdGVzdEFueVR5cGUobmV3IERvdWJsZSgyMy40NSksIE1JTl9FUVVBTFNfWkVST19OSUxMQUJMRV9GQUxTRV9URVNUKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoaXNPYmplY3RzRXF1YWwocmV0dXJuT2JqZWN0LCBuZXcgRG91YmxlKDIzLjQ1KSkpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigibWluT2NjdXJzID0gMSBuaWxsYWJsZSB0cnVlIik7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm5PYmplY3QgPSB0ZXN0QW55VHlwZShudWxsLCBNSU5fRVFVQUxTX09ORV9OSUxMQUJMRV9UUlVFX1RFU1QpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShpc09iamVjdHNFcXVhbChyZXR1cm5PYmplY3QsIG51bGwpKTsKLSAgICAgICAgICAgIHJldHVybk9iamVjdCA9IHRlc3RBbnlUeXBlKG5ldyBEb3VibGUoMjMuNDUpLCBNSU5fRVFVQUxTX09ORV9OSUxMQUJMRV9UUlVFX1RFU1QpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShpc09iamVjdHNFcXVhbChyZXR1cm5PYmplY3QsIG5ldyBEb3VibGUoMjMuNDUpKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJtaW5PY2N1cnMgPSAxIG5pbGxhYmxlIGZhbHNlIik7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm5PYmplY3QgPSB0ZXN0QW55VHlwZShudWxsLCBNSU5fRVFVQUxTX09ORV9OSUxMQUJMRV9GQUxTRV9URVNUKTsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUodHJ1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gdGVzdEFueVR5cGUobmV3IERvdWJsZSgyMy40NSksIE1JTl9FUVVBTFNfT05FX05JTExBQkxFX0ZBTFNFX1RFU1QpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShpc09iamVjdHNFcXVhbChyZXR1cm5PYmplY3QsIG5ldyBEb3VibGUoMjMuNDUpKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgdGVzdEFueVR5cGUoT2JqZWN0IGlubmVyRWxlbWVudCwgaW50IHR5cGUpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50OwotICAgICAgICBPYmplY3QgcmV0dXJuT2JqZWN0ID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIG9tRWxlbWVudFN0cmluZzsKLSAgICAgICAgc3dpdGNoICh0eXBlKSB7Ci0gICAgICAgICAgICBjYXNlIE1JTl9FUVVBTFNfWkVST19OSUxMQUJMRV9UUlVFX1RFU1QgOiB7Ci0gICAgICAgICAgICAgICAgVGVzdEFueVR5cGUyIHRlc3RBbnlUeXBlID0gbmV3IFRlc3RBbnlUeXBlMigpOwotICAgICAgICAgICAgICAgIHRlc3RBbnlUeXBlLnNldFRlc3RWYWx1ZShpbm5lckVsZW1lbnQpOwotICAgICAgICAgICAgICAgIG9tRWxlbWVudCA9IHRlc3RBbnlUeXBlLmdldE9NRWxlbWVudChUZXN0QW55VHlwZTIuTVlfUU5BTUUsIE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMkZhY3RvcnkoKSk7Ci0gICAgICAgICAgICAgICAgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NRWxlbWVudCA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvbUVsZW1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgICAgIHJldHVybk9iamVjdCA9IFRlc3RBbnlUeXBlMi5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcikuZ2V0VGVzdFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIE1JTl9FUVVBTFNfWkVST19OSUxMQUJMRV9GQUxTRV9URVNUIDogewotICAgICAgICAgICAgICAgIFRlc3RBbnlUeXBlNCB0ZXN0QW55VHlwZSA9IG5ldyBUZXN0QW55VHlwZTQoKTsKLSAgICAgICAgICAgICAgICB0ZXN0QW55VHlwZS5zZXRUZXN0VmFsdWUoaW5uZXJFbGVtZW50KTsKLSAgICAgICAgICAgICAgICBvbUVsZW1lbnQgPSB0ZXN0QW55VHlwZS5nZXRPTUVsZW1lbnQoVGVzdEFueVR5cGU0Lk1ZX1FOQU1FLCBPTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTJGYWN0b3J5KCkpOwotICAgICAgICAgICAgICAgIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTUVsZW1lbnQgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgICAgICByZXR1cm5PYmplY3QgPSBUZXN0QW55VHlwZTQuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpLmdldFRlc3RWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBNSU5fRVFVQUxTX09ORV9OSUxMQUJMRV9UUlVFX1RFU1QgOiB7Ci0gICAgICAgICAgICAgICAgVGVzdEFueVR5cGU2IHRlc3RBbnlUeXBlID0gbmV3IFRlc3RBbnlUeXBlNigpOwotICAgICAgICAgICAgICAgIHRlc3RBbnlUeXBlLnNldFRlc3RWYWx1ZShpbm5lckVsZW1lbnQpOwotICAgICAgICAgICAgICAgIG9tRWxlbWVudCA9IHRlc3RBbnlUeXBlLmdldE9NRWxlbWVudChUZXN0QW55VHlwZTYuTVlfUU5BTUUsIE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMkZhY3RvcnkoKSk7Ci0gICAgICAgICAgICAgICAgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NRWxlbWVudCA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvbUVsZW1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgICAgIHJldHVybk9iamVjdCA9IFRlc3RBbnlUeXBlNi5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcikuZ2V0VGVzdFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIE1JTl9FUVVBTFNfT05FX05JTExBQkxFX0ZBTFNFX1RFU1QgOiB7Ci0gICAgICAgICAgICAgICAgVGVzdEFueVR5cGU4IHRlc3RBbnlUeXBlID0gbmV3IFRlc3RBbnlUeXBlOCgpOwotICAgICAgICAgICAgICAgIHRlc3RBbnlUeXBlLnNldFRlc3RWYWx1ZShpbm5lckVsZW1lbnQpOwotICAgICAgICAgICAgICAgIG9tRWxlbWVudCA9IHRlc3RBbnlUeXBlLmdldE9NRWxlbWVudChUZXN0QW55VHlwZTguTVlfUU5BTUUsIE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMkZhY3RvcnkoKSk7Ci0gICAgICAgICAgICAgICAgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NRWxlbWVudCA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvbUVsZW1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgICAgIHJldHVybk9iamVjdCA9IFRlc3RBbnlUeXBlOC5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcikuZ2V0VGVzdFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldHVybk9iamVjdDsKLSAgICB9Ci0KLQotfQotCi0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvdW5pb24vVW5pb25UZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3VuaW9uL1VuaW9uVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDA4NTEwLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvdW5pb24vVW5pb25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS51bmlvbjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5TdEFYVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5VUkk7Ci1pbXBvcnQgb3JnLnRlbXB1cmkudW5pb24uKjsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLQotcHVibGljIGNsYXNzIFVuaW9uVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZWNvcmQyKCl7Ci0gICAgICAgIE9iamVjdCByZXN1bHQ7Ci0gICAgICAgIHJlc3VsdCA9IHRlc3RSZWNvcmQyKG5ldyBJbnRlZ2VyKDEwKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQsbmV3IEludGVnZXIoMTApKTsKLSAgICAgICAgcmVzdWx0ID0gdGVzdFJlY29yZDIobmV3IEJvb2xlYW4odHJ1ZSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LG5ldyBCb29sZWFuKHRydWUpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE9iamVjdCB0ZXN0UmVjb3JkMihPYmplY3QgdGVzdE9iamVjdCkgewotICAgICAgICBSZWNvcmQyIHJlY29yZDIgPSBuZXcgUmVjb3JkMigpOwotICAgICAgICBEYXRlT3JEYXRlVGltZVR5cGUgZGF0ZU9yRGF0ZVRpbWVUeXBlID0gbmV3IERhdGVPckRhdGVUaW1lVHlwZSgpOwotICAgICAgICByZWNvcmQyLnNldEVsZW0xKGRhdGVPckRhdGVUaW1lVHlwZSk7Ci0gICAgICAgIGRhdGVPckRhdGVUaW1lVHlwZS5zZXRPYmplY3QodGVzdE9iamVjdCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSByZWNvcmQyLmdldE9NRWxlbWVudChSZWNvcmQyLk1ZX1FOQU1FLAotICAgICAgICAgICAgICAgICAgICAgT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCkpOwotICAgICAgICAgICAgU3RyaW5nIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NIFN0cmluZyA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIFJlY29yZDIgbmV3UmVjb3JkMiA9IFJlY29yZDIuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpOwotICAgICAgICAgICAgcmV0dXJuIG5ld1JlY29yZDIuZ2V0RWxlbTEoKS5nZXRPYmplY3QoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGFzc2VydEZhbHNlKHRydWUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZWNvcmQxKCkgewotICAgICAgICBPYmplY3QgcmVzdWx0OwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmVzdWx0ID0gdGVzdFJlY29yZDEobmV3IFVSSSgiaHR0cDovL3d3dy5nb29nbGUuY29tIikpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdCxuZXcgVVJJKCJodHRwOi8vd3d3Lmdvb2dsZS5jb20iKSk7Ci0gICAgICAgICAgICByZXN1bHQgPSB0ZXN0UmVjb3JkMShGb29FbnVtLl92YWx1ZTEpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdCxGb29FbnVtLl92YWx1ZTEpOwotICAgICAgICB9IGNhdGNoIChVUkkuTWFsZm9ybWVkVVJJRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7ICAvL1RvIGNoYW5nZSBib2R5IG9mIGNhdGNoIHN0YXRlbWVudCB1c2UgRmlsZSB8IFNldHRpbmdzIHwgRmlsZSBUZW1wbGF0ZXMuCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIE9iamVjdCB0ZXN0UmVjb3JkMShPYmplY3QgdGVzdE9iamVjdCkgewotICAgICAgICBSZWNvcmQxIHJlY29yZDEgPSBuZXcgUmVjb3JkMSgpOwotICAgICAgICBGb29PcGVuRW51bSBmb29PcGVuRW51bSA9IG5ldyBGb29PcGVuRW51bSgpOwotICAgICAgICByZWNvcmQxLnNldEVsZW0xKGZvb09wZW5FbnVtKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZvb09wZW5FbnVtLnNldE9iamVjdCh0ZXN0T2JqZWN0KTsKLSAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSByZWNvcmQxLmdldE9NRWxlbWVudChSZWNvcmQxLk1ZX1FOQU1FLCBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT00gU3RyaW5nID09PiAiICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvbUVsZW1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgUmVjb3JkMSBuZXdSZWNvcmQxID0gUmVjb3JkMS5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcik7Ci0gICAgICAgICAgICByZXR1cm4gbmV3UmVjb3JkMS5nZXRFbGVtMSgpLmdldE9iamVjdCgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYXNzZXJ0RmFsc2UodHJ1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFVuaW9uUU5hbWUoKXsKLSAgICAgICAgVW5pb25RTmFtZVRlc3RFbGVtZW50IHVuaW9uUU5hbWVUZXN0RWxlbWVudCA9IG5ldyBVbmlvblFOYW1lVGVzdEVsZW1lbnQoKTsKLSAgICAgICAgVW5pb25RTmFtZVRlc3QgdW5pb25RTmFtZVRlc3QgPSBuZXcgVW5pb25RTmFtZVRlc3QoKTsKLSAgICAgICAgdW5pb25RTmFtZVRlc3RFbGVtZW50LnNldFVuaW9uUU5hbWVUZXN0RWxlbWVudCh1bmlvblFOYW1lVGVzdCk7Ci0gICAgICAgIHVuaW9uUU5hbWVUZXN0LnNldE9iamVjdChuZXcgUU5hbWUoImh0dHA6Ly93d3cuZ29vZ2xlLmNvbSIsInRlc3QiKSk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSB1bmlvblFOYW1lVGVzdEVsZW1lbnQuZ2V0T01FbGVtZW50KFVuaW9uUU5hbWVUZXN0RWxlbWVudC5NWV9RTkFNRSxPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT00gRWxlbWVudCA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIFVuaW9uUU5hbWVUZXN0RWxlbWVudCByZXN1bHQgPSBVbmlvblFOYW1lVGVzdEVsZW1lbnQuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHVuaW9uUU5hbWVUZXN0LmdldE9iamVjdCgpLHJlc3VsdC5nZXRVbmlvblFOYW1lVGVzdEVsZW1lbnQoKS5nZXRPYmplY3QoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGZhbHNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJbm5lclNpbXBsZVR5cGVzKCl7Ci0gICAgICAgIFRlc3RJbm5lclVuaW9uVHlwZSB0ZXN0SW5uZXJVbmlvblR5cGUgPSBuZXcgVGVzdElubmVyVW5pb25UeXBlKCk7Ci0gICAgICAgIFBhY2tpbmdUeXBlX1QgcGFja2luZ1R5cGVfdCA9IG5ldyBQYWNraW5nVHlwZV9UKCk7Ci0gICAgICAgIHRlc3RJbm5lclVuaW9uVHlwZS5zZXRUZXN0SW5uZXJVbmlvblR5cGUocGFja2luZ1R5cGVfdCk7Ci0gICAgICAgIFBhY2tpbmdUeXBlX1RfdHlwZTAgcGFja2luZ1R5cGVfdF90eXBlMCA9IG5ldyBQYWNraW5nVHlwZV9UX3R5cGUwKCk7Ci0gICAgICAgIHBhY2tpbmdUeXBlX3RfdHlwZTAuc2V0UGFja2luZ1R5cGVfVF90eXBlMCgiTUlOT1JfYSIpOwotICAgICAgICBwYWNraW5nVHlwZV90LnNldE9iamVjdChwYWNraW5nVHlwZV90X3R5cGUwKTsKLSAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG9tRWxlbWVudCA9IHRlc3RJbm5lclVuaW9uVHlwZS5nZXRPTUVsZW1lbnQoVGVzdElubmVyVW5pb25UeXBlLk1ZX1FOQU1FLCBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT00gRWxlbWVudCA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIFRlc3RJbm5lclVuaW9uVHlwZSByZXN1bHQgPSBUZXN0SW5uZXJVbmlvblR5cGUuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHBhY2tpbmdUeXBlX3RfdHlwZTAudG9TdHJpbmcoKSxyZXN1bHQuZ2V0VGVzdElubmVyVW5pb25UeXBlKCkuZ2V0T2JqZWN0KCkudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGZhbHNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRlc3RJbm5lclVuaW9uVHlwZSA9IG5ldyBUZXN0SW5uZXJVbmlvblR5cGUoKTsKLSAgICAgICAgcGFja2luZ1R5cGVfdCA9IG5ldyBQYWNraW5nVHlwZV9UKCk7Ci0gICAgICAgIHRlc3RJbm5lclVuaW9uVHlwZS5zZXRUZXN0SW5uZXJVbmlvblR5cGUocGFja2luZ1R5cGVfdCk7Ci0gICAgICAgIFBhY2tpbmdUeXBlX1RfdHlwZTEgcGFja2luZ1R5cGVfdF90eXBlMSA9IG5ldyBQYWNraW5nVHlwZV9UX3R5cGUxKCk7Ci0gICAgICAgIHBhY2tpbmdUeXBlX3RfdHlwZTEuc2V0UGFja2luZ1R5cGVfVF90eXBlMSgiUFJPUF9hIik7Ci0gICAgICAgIHBhY2tpbmdUeXBlX3Quc2V0T2JqZWN0KHBhY2tpbmdUeXBlX3RfdHlwZTEpOwotCi0gICAgICAgICB0cnkgewotICAgICAgICAgICAgb21FbGVtZW50ID0gdGVzdElubmVyVW5pb25UeXBlLmdldE9NRWxlbWVudChUZXN0SW5uZXJVbmlvblR5cGUuTVlfUU5BTUUsT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCkpOwotICAgICAgICAgICAgU3RyaW5nIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NIEVsZW1lbnQgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICBUZXN0SW5uZXJVbmlvblR5cGUgcmVzdWx0ID0gVGVzdElubmVyVW5pb25UeXBlLkZhY3RvcnkucGFyc2UoeG1sUmVhZGVyKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhwYWNraW5nVHlwZV90X3R5cGUxLnRvU3RyaW5nKCkscmVzdWx0LmdldFRlc3RJbm5lclVuaW9uVHlwZSgpLmdldE9iamVjdCgpLnRvU3RyaW5nKCkpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShmYWxzZSk7Ci0gICAgICAgIH0KLQotICAgICAgICB0ZXN0SW5uZXJVbmlvblR5cGUgPSBuZXcgVGVzdElubmVyVW5pb25UeXBlKCk7Ci0gICAgICAgIHBhY2tpbmdUeXBlX3QgPSBuZXcgUGFja2luZ1R5cGVfVCgpOwotICAgICAgICB0ZXN0SW5uZXJVbmlvblR5cGUuc2V0VGVzdElubmVyVW5pb25UeXBlKHBhY2tpbmdUeXBlX3QpOwotICAgICAgICBwYWNraW5nVHlwZV90LnNldE9iamVjdChQYWNraW5nVHlwZV9UX3R5cGUyLlRBUik7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG9tRWxlbWVudCA9IHRlc3RJbm5lclVuaW9uVHlwZS5nZXRPTUVsZW1lbnQoVGVzdElubmVyVW5pb25UeXBlLk1ZX1FOQU1FLE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgICAgIFN0cmluZyBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTSBFbGVtZW50ID09PiAiICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvbUVsZW1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgVGVzdElubmVyVW5pb25UeXBlIHJlc3VsdCA9IFRlc3RJbm5lclVuaW9uVHlwZS5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoUGFja2luZ1R5cGVfVF90eXBlMi5UQVIscmVzdWx0LmdldFRlc3RJbm5lclVuaW9uVHlwZSgpLmdldE9iamVjdCgpKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUoZmFsc2UpOwotICAgICAgICB9Ci0KLQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvdW5pb24yL1VuaW9uMlRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvdW5pb24yL1VuaW9uMlRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzViNWE4MS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3VuaW9uMi9VbmlvbjJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS51bmlvbjI7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLnV0aWwuU3RBWFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uOwotaW1wb3J0IG9yZy50ZW1wdXJpLnVuaW9uMi4qOwotCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLQotCi1wdWJsaWMgY2xhc3MgVW5pb24yVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RVbmlvbkVsZW1lbnQyKCkgewotICAgICAgICBUZXN0VW5pb25FbGVtZW50MiB0ZXN0VW5pb25FbGVtZW50MiA9IG5ldyBUZXN0VW5pb25FbGVtZW50MigpOwotCi0gICAgICAgIFRlc3RVbmlvbjEgcGFyYW0xID0gbmV3IFRlc3RVbmlvbjEoKTsKLSAgICAgICAgcGFyYW0xLnNldE9iamVjdChCb29sZWFuLlRSVUUpOwotICAgICAgICB0ZXN0VW5pb25FbGVtZW50Mi5zZXRQYXJhbTEocGFyYW0xKTsKLQotICAgICAgICBUZXN0VW5pb24xIGF0dHJpYnV0ZTEgPSBuZXcgVGVzdFVuaW9uMSgpOwotICAgICAgICBhdHRyaWJ1dGUxLnNldE9iamVjdCgidGVzdCBhdHRyaWJ1dGUiKTsKLQotICAgICAgICB0ZXN0VW5pb25FbGVtZW50Mi5zZXRBdHRyaWJ1dGUxKGF0dHJpYnV0ZTEpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gdGVzdFVuaW9uRWxlbWVudDIuZ2V0T01FbGVtZW50KAotICAgICAgICAgICAgICAgICAgICBUZXN0VW5pb25FbGVtZW50Mi5NWV9RTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCkpOwotICAgICAgICAgICAgU3RyaW5nIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NIEVsZW1lbnQgU3RyaW5nID09PiAiICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPQotICAgICAgICAgICAgICAgICAgICBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvbUVsZW1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgVGVzdFVuaW9uRWxlbWVudDIgcmVzdWx0ID0gVGVzdFVuaW9uRWxlbWVudDIuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTEoKS5nZXRPYmplY3QoKSwgQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0QXR0cmlidXRlMSgpLmdldE9iamVjdCgpLCAidGVzdCBhdHRyaWJ1dGUiKTsKLSAgICAgICAgfSBjYXRjaCAoQURCRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RMaXN0RWxlbWVudDIoKSB7Ci0gICAgICAgIFRlc3RMaXN0RWxlbWVudDEgdGVzdExpc3RFbGVtZW50MSA9IG5ldyBUZXN0TGlzdEVsZW1lbnQxKCk7Ci0KLSAgICAgICAgVGVzdExpc3QxIHBhcmFtMSA9IG5ldyBUZXN0TGlzdDEoKTsKLSAgICAgICAgcGFyYW0xLnNldFN0cmluZyhuZXcgU3RyaW5nW117InBhcmFtMSIsICJwYXJhbTIifSk7Ci0gICAgICAgIHRlc3RMaXN0RWxlbWVudDEuc2V0UGFyYW0xKHBhcmFtMSk7Ci0KLSAgICAgICAgVGVzdExpc3QxIGF0dHJpYnV0ZTEgPSBuZXcgVGVzdExpc3QxKCk7Ci0gICAgICAgIGF0dHJpYnV0ZTEuc2V0U3RyaW5nKG5ldyBTdHJpbmdbXXsiYXR0cmlidXRlMSIsImF0dHJpYnV0ZTIifSk7Ci0gICAgICAgIHRlc3RMaXN0RWxlbWVudDEuc2V0QXR0cmlidXRlMShhdHRyaWJ1dGUxKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IHRlc3RMaXN0RWxlbWVudDEuZ2V0T01FbGVtZW50KAotICAgICAgICAgICAgICAgICAgICBUZXN0TGlzdEVsZW1lbnQxLk1ZX1FOQU1FLAotICAgICAgICAgICAgICAgICAgICBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT00gRWxlbWVudCBTdHJpbmcgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9Ci0gICAgICAgICAgICAgICAgICAgIFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICBUZXN0TGlzdEVsZW1lbnQxIHJlc3VsdCA9IFRlc3RMaXN0RWxlbWVudDEuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTEoKS5nZXRTdHJpbmcoKVswXSwgInBhcmFtMSIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTEoKS5nZXRTdHJpbmcoKVsxXSwgInBhcmFtMiIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRBdHRyaWJ1dGUxKCkuZ2V0U3RyaW5nKClbMF0sICJhdHRyaWJ1dGUxIik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldEF0dHJpYnV0ZTEoKS5nZXRTdHJpbmcoKVsxXSwgImF0dHJpYnV0ZTIiKTsKLSAgICAgICAgfSBjYXRjaCAoQURCRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RGdXp6RGF0ZVR5cGUoKXsKLSAgICAgICAgVGVzdEZ1enp5RGF0ZVR5cGUgdGVzdEZ1enp5RGF0ZVR5cGUgPSBuZXcgVGVzdEZ1enp5RGF0ZVR5cGUoKTsKLQotICAgICAgICBGdXp6eURhdGVUeXBlIGZ1enp5RGF0ZVR5cGUgPSBuZXcgRnV6enlEYXRlVHlwZSgpOwotICAgICAgICBmdXp6eURhdGVUeXBlLnNldE9iamVjdChuZXcgRGF0ZSgpKTsKLQotICAgICAgICB0ZXN0RnV6enlEYXRlVHlwZS5zZXRUZXN0RnV6enlEYXRlVHlwZShmdXp6eURhdGVUeXBlKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IHRlc3RGdXp6eURhdGVUeXBlLmdldE9NRWxlbWVudCgKLSAgICAgICAgICAgICAgICAgICAgVGVzdEZ1enp5RGF0ZVR5cGUuTVlfUU5BTUUsT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCkpOwotICAgICAgICAgICAgU3RyaW5nIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NIEVsZW1lbnQgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9Ci0gICAgICAgICAgICAgICAgICAgIFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICBUZXN0RnV6enlEYXRlVHlwZSByZXN1bHQgPSBUZXN0RnV6enlEYXRlVHlwZS5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcik7Ci0gICAgICAgIH0gY2F0Y2ggKEFEQkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvcG9tLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjQ3ZmJjLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHByb2plY3QKLSAgICAgICAgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIKLSAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+MS41LjE8L3ZlcnNpb24+Ci0gICAgICAgIDxyZWxhdGl2ZVBhdGg+Li4vcGFyZW50L3BvbS54bWw8L3JlbGF0aXZlUGF0aD4KLSAgICA8L3BhcmVudD4KLQotICAgIDxhcnRpZmFjdElkPmF4aXMyLWFkYjwvYXJ0aWZhY3RJZD4KLSAgICA8bmFtZT5BcGFjaGUgQXhpczIgLSBEYXRhIEJpbmRpbmc8L25hbWU+Ci0gICAgPGRlc2NyaXB0aW9uPkF4aXMyIERhdGEgQmluZGluZyBtb2R1bGU8L2Rlc2NyaXB0aW9uPgotICAgIDxzY20+Ci0gICAgICAgIDxjb25uZWN0aW9uPgotICAgICAgICAgICAgc2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL3dlYnNlcnZpY2VzL2F4aXMyL3RydW5rL2phdmEvbW9kdWxlcy9hZGIKLSAgICAgICAgPC9jb25uZWN0aW9uPgotICAgICAgICA8ZGV2ZWxvcGVyQ29ubmVjdGlvbj4KLSAgICAgICAgICAgIHNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2Yvd2Vic2VydmljZXMvYXhpczIvdHJ1bmsvamF2YS9tb2R1bGVzL2FkYgotICAgICAgICA8L2RldmVsb3BlckNvbm5lY3Rpb24+Ci0gICAgICAgIDx1cmw+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXd2Yy93ZWJzZXJ2aWNlcy9heGlzMi90cnVuay9qYXZhL21vZHVsZXMvYWRiPC91cmw+Ci0gICAgPC9zY20+Ci0gICAgPGRlcGVuZGVuY2llcz4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD4ke3Byb2plY3QuZ3JvdXBJZH08L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1rZXJuZWw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3ZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5nZXJvbmltby5zcGVjczwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmdlcm9uaW1vLWFjdGl2YXRpb25fMS4xX3NwZWM8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8L2RlcGVuZGVuY2llcz4KLQotICAgIDxidWlsZD4KLSAgICAgICAgPHNvdXJjZURpcmVjdG9yeT5zcmM8L3NvdXJjZURpcmVjdG9yeT4KLSAgICAgICAgPHRlc3RTb3VyY2VEaXJlY3Rvcnk+dGVzdDwvdGVzdFNvdXJjZURpcmVjdG9yeT4KLSAgICAgICAgPHJlc291cmNlcz4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PmNvbmY8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqLyoucHJvcGVydGllczwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1ZGVzPgotICAgICAgICAgICAgICAgIDxmaWx0ZXJpbmc+ZmFsc2U8L2ZpbHRlcmluZz4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmM8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqLyouamF2YTwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1ZGVzPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5Pi4uLy4uPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5OT1RJQ0UudHh0PC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5MSUNFTlNFLnR4dDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgICAgIDxmaWx0ZXJpbmc+ZmFsc2U8L2ZpbHRlcmluZz4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgIDwvcmVzb3VyY2VzPgotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphci1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgIDxhcmNoaXZlPiAgCi0gICAgICAgICAgICAgICAgICA8bWFuaWZlc3RGaWxlPnJlc291cmNlcy9NRVRBLUlORi9NQU5JRkVTVC5NRjwvbWFuaWZlc3RGaWxlPgotICAgICAgICAgICAgICAgIDwvYXJjaGl2ZT4gCi0gICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPiAgCi0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHNraXA+ZmFsc2U8L3NraXA+Ci0gICAgICAgICAgICAgICAgICAgIDxleGNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqLypBYnN0cmFjdCouamF2YTwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqLypVdGlsKi5qYXZhPC9leGNsdWRlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovKlBoYXNlUmVzb2x2aW5nVGVzdC5qYXZhPC9leGNsdWRlPgotICAgICAgICAgICAgICAgICAgICA8L2V4Y2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qVGVzdC5qYXZhPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgPC9idWlsZD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9yZXNvdXJjZXMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi92MS41LjFSQzMvbW9kdWxlcy9hZGIvcmVzb3VyY2VzL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjQzNjNmLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9yZXNvdXJjZXMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjANCi1CdW5kbGUtTGljZW5zZTogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wLnR4dA0KLUltcG9ydC1QYWNrYWdlOiANCi0gamF2YS51dGlsLmNvbmN1cnJlbnQsDQotIGphdmF4LmFjdGl2YXRpb24sDQotIGphdmF4Lm5hbWluZywNCi0gamF2YXgucm1pLA0KLSBqYXZheC54bWwubmFtZXNwYWNlLA0KLSBqYXZheC54bWwuc3RyZWFtLA0KLSBvcmcuYXBhY2hlLmF4aW9tLmF0dGFjaG1lbnRzLA0KLSBvcmcuYXBhY2hlLmF4aW9tLmF0dGFjaG1lbnRzLnV0aWxzLA0KLSBvcmcuYXBhY2hlLmF4aW9tLm9tLA0KLSBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuYnVpbGRlciwNCi0gb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmxsb20sDQotIG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5sbG9tLmZhY3RvcnksDQotIG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC51dGlsLA0KLSBvcmcuYXBhY2hlLmF4aW9tLm9tLnV0aWwsDQotIG9yZy5hcGFjaGUuYXhpb20uc29hcCwNCi0gb3JnLmFwYWNoZS5heGlvbS5zb2FwLmltcGwuYnVpbGRlciwNCi0gb3JnLmFwYWNoZS5heGlzMiwNCi0gb3JnLmFwYWNoZS5heGlzMi5jbGllbnQsDQotIG9yZy5hcGFjaGUuYXhpczIuY2xpZW50LmFzeW5jLA0KLSBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQsDQotIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcsDQotIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuaTE4biwNCi0gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlbWFwcGluZywNCi0gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcywNCi0gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2RpbmcsDQotIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkLA0KLSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLA0KLSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlciwNCi0gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIsDQotIG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC51dGlsLA0KLSBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLA0KLSBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLmphdmEyd3NkbCwNCi0gb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUsDQotIG9yZy5hcGFjaGUuYXhpczIuaGFuZGxlcnMsDQotIG9yZy5hcGFjaGUuYXhpczIuaTE4biwNCi0gb3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMsDQotIG9yZy5hcGFjaGUuYXhpczIucnBjLmNsaWVudCwNCi0gb3JnLmFwYWNoZS5heGlzMi5ycGMucmVjZWl2ZXJzLA0KLSBvcmcuYXBhY2hlLmF4aXMyLnJwYy5yZWNlaXZlcnMuZWpiLA0KLSBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydCwNCi0gb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuamF2YSwNCi0gb3JnLmFwYWNoZS5heGlzMi51dGlsLA0KLSBvcmcuYXBhY2hlLmF4aXMyLnV0aWwudGhyZWFkcG9vbCwNCi0gb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcsDQotIG9yZy5jb2RlaGF1cy5qYW0NCi1FeHBvcnQtUGFja2FnZTogDQotIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuaTE4biwNCi0gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlbWFwcGluZywNCi0gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcywNCi0gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2RpbmcsDQotIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkLA0KLSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLA0KLSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlciwNCi0gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIsDQotIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMsDQotIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcsDQotIG9yZy5hcGFjaGUuYXhpczIucnBjLmNsaWVudCwNCi0gb3JnLmFwYWNoZS5heGlzMi5ycGMucmVjZWl2ZXJzLmVqYiwNCi0gb3JnLmFwYWNoZS5heGlzMi5ycGMucmVjZWl2ZXJzLA0KLSBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5qYXZhLA0KLSBvcmcuYXBhY2hlLmF4aXMyLnV0aWwNCi1CdW5kbGUtVmVyc2lvbjogMS40DQotQnVuZGxlLU5hbWU6IEF4aXMyIEFEQg0KLUJ1bmRsZS1Eb2NVUkw6IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8NCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyDQotQnVuZGxlLVZlbmRvcjogQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuYXBhY2hlLmF4aXMyLmFkYg0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy9BREJCZWFuLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvQURCQmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGY1MzEwLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy9BREJCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmc7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXI7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotCi0vKgotICogQURCQmVhbiAtIEF4aXMgRGF0YSBCaW5kaW5nIEJlYW4uIFRoaXMgd2lsbCBiZSBpbXBsZW1lbnRlZCBieSBhbGwgdGhlIGJlYW5zIHRoYXQgYXJlIGJlaW5nIGdlbmVyYXRlZCBieQotICogQXhpczIgZGF0YSBiaW5kaW5nIGZyYW1ld29yawotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgQURCQmVhbiBleHRlbmRzIFNlcmlhbGl6YWJsZSB7Ci0gICAgLyoqCi0gICAgICogU2VyaWFsaXplcyBhbiBBREJCZWFuLiBHZXRzIHRoZSBwdWxsIHBhcnNlciBhbmQgZmV0Y2hlcyB0aGUgWE1MIHB1bGwgZXZlbnRzIHRvIHJlcHJlc2VudCB0aGUKLSAgICAgKiBiZWFuLgotICAgICAqCi0gICAgICogQHBhcmFtIGFkYkJlYW5RTmFtZSB0aGUgbmFtZSBvZiB0aGUgZWxlbWVudCB0byBiZSBnZW5lcmF0ZWQgZm9yIHRoaXMgQURCQmVhbi4KLSAgICAgKiBAcmV0dXJuIFJldHVybnMgYSBwdWxsIHBhcnNlciBmb3IgdGhpcyBBREJCZWFuLgotICAgICAqLwotICAgIHB1YmxpYyBYTUxTdHJlYW1SZWFkZXIgZ2V0UHVsbFBhcnNlcihRTmFtZSBhZGJCZWFuUU5hbWUpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb247Ci0KLQotICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBRTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpCi0gICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uLCBBREJFeGNlcHRpb247Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICBNVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNlcmlhbGl6ZVR5cGUpCi0gICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uLCBBREJFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBUaGVyZSB3aWxsIGJlIGEgc2VsZiBmYWN0b3J5IGluIGV2ZXJ5IGdlbmVyYXRlZCBkYXRhIGJvdW5kIGNsYXNzIFhYWDoKLSAgICAgKiBwdWJsaWMgc3RhdGljIFhYWCByZWFkIChYTUxTdHJlYW1SZWFkZXIpOwotICAgICAqLwotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL0FEQkRhdGFTb3VyY2UuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy9BREJEYXRhU291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwNTRlMWQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL0FEQkRhdGFTb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmc7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZUV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01PdXRwdXRGb3JtYXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS51dGlsLlN0QVhVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVPTUJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU2VyaWFsaXplcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXI7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBREJEYXRhU291cmNlIGltcGxlbWVudHMgT01EYXRhU291cmNlRXh0IHsKLSAgICBwcm90ZWN0ZWQgUU5hbWUgcGFyZW50UU5hbWU7Ci0gICAgcHJpdmF0ZSBBREJCZWFuIGJlYW47Ci0gICAgCi0gICAgSGFzaE1hcCBtYXAgPSBudWxsOyAgLy8gTWFwIG9mIHByb3BlcnRpZXMKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIHRha2luZyBpbiBhbiBBREJCZWFuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYmVhbgotICAgICAqLwotICAgIHByb3RlY3RlZCBBREJEYXRhU291cmNlKEFEQkJlYW4gYmVhbiwgUU5hbWUgcGFyZW50UU5hbWUpIHsKLSAgICAgICAgdGhpcy5iZWFuID0gYmVhbjsKLSAgICAgICAgdGhpcy5wYXJlbnRRTmFtZSA9IHBhcmVudFFOYW1lOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIG91dHB1dAotICAgICAqIEBwYXJhbSBmb3JtYXQKLSAgICAgKiBAdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbgotICAgICAqIEBzZWUgT01EYXRhU291cmNlI3NlcmlhbGl6ZShqYXZhLmlvLk91dHB1dFN0cmVhbSwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU91dHB1dEZvcm1hdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoT3V0cHV0U3RyZWFtIG91dHB1dCwgT01PdXRwdXRGb3JtYXQgZm9ybWF0KSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgWE1MU3RyZWFtV3JpdGVyIHhtbFN0cmVhbVdyaXRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1Xcml0ZXIob3V0cHV0KTsKLSAgICAgICAgc2VyaWFsaXplKHhtbFN0cmVhbVdyaXRlcik7Ci0gICAgICAgIHhtbFN0cmVhbVdyaXRlci5mbHVzaCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSB3cml0ZXIKLSAgICAgKiBAcGFyYW0gZm9ybWF0Ci0gICAgICogQHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24KLSAgICAgKiBAc2VlIE9NRGF0YVNvdXJjZSNzZXJpYWxpemUoamF2YS5pby5Xcml0ZXIsIG9yZy5hcGFjaGUuYXhpb20ub20uT01PdXRwdXRGb3JtYXQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2VyaWFsaXplKFdyaXRlciB3cml0ZXIsIE9NT3V0cHV0Rm9ybWF0IGZvcm1hdCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIFhNTFN0cmVhbVdyaXRlciB4bWxTdHJlYW1Xcml0ZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtV3JpdGVyKHdyaXRlcik7Ci0gICAgICAgIHNlcmlhbGl6ZSh4bWxTdHJlYW1Xcml0ZXIpOwotICAgICAgICB4bWxTdHJlYW1Xcml0ZXIuZmx1c2goKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG5lZWRzIHRvIGJlIGdlbmVyYXRlZCBpbnNpZGUgdGhlIEFEQiBiZWFuCi0gICAgICoKLSAgICAgKiBAcGFyYW0geG1sV3JpdGVyCi0gICAgICogQHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24KLSAgICAgKiBAc2VlIE9NRGF0YVNvdXJjZSNzZXJpYWxpemUoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2VyaWFsaXplKFhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgIE1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciBtdG9tQXdhcmVYTUxTdHJlYW1Xcml0ZXIgPSBuZXcgTVRPTUF3YXJlWE1MU2VyaWFsaXplcih4bWxXcml0ZXIpOwotICAgICAgICBzZXJpYWxpemUobXRvbUF3YXJlWE1MU3RyZWFtV3JpdGVyKTsKLSAgICAgICAgbXRvbUF3YXJlWE1MU3RyZWFtV3JpdGVyLmZsdXNoKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2VyaWFsaXplKE1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb247Ci0KLQotICAgIC8qKgotICAgICAqIEB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZSNnZXRSZWFkZXIoKQotICAgICAqLwotICAgIHB1YmxpYyBYTUxTdHJlYW1SZWFkZXIgZ2V0UmVhZGVyKCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIHNpbmNlIG9ubHkgQURCQmVhbnMgcmVsYXRlZCB0byBlbGVtZW50cyBjYW4gYmUgc2VyaWFsaXplZAotICAgICAgICAvLyB3ZSBhcmUgc2FmZSBpbiBwYXNzaW5nIG51bGwgaGVyZS4KLSAgICAgICAgTVRPTUF3YXJlT01CdWlsZGVyIG10b21Bd2FyZU9NQnVpbGRlciA9IG5ldyBNVE9NQXdhcmVPTUJ1aWxkZXIoKTsKLSAgICAgICAgc2VyaWFsaXplKG10b21Bd2FyZU9NQnVpbGRlcik7Ci0gICAgICAgIHJldHVybiBtdG9tQXdhcmVPTUJ1aWxkZXIuZ2V0T01FbGVtZW50KCkuZ2V0WE1MU3RyZWFtUmVhZGVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYmFja2luZyBPYmplY3QuCi0gICAgICogQHJldHVybiBPYmplY3QKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldE9iamVjdCgpIHsKLSAgICAgICAgcmV0dXJuIGJlYW47Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiByZWFkaW5nIHRoZSBiYWNraW5nIG9iamVjdCBpcyBkZXN0cnVjdGl2ZS4KLSAgICAgKiBBbiBleGFtcGxlIG9mIGFuIG9iamVjdCB3aXRoIGEgZGVzdHJ1Y3RpdmUgcmVhZCBpcyBhbiBJbnB1dFN0ZWFtLgotICAgICAqIFRoZSBvd25pbmcgT01Tb3VyY2VkRWxlbWVudCB1c2VzIHRoaXMgaW5mb3JtYXRpb24gdG8gZGV0ZW1pbmUgaWYgT00gdHJlZQotICAgICAqIGV4cGFuc2lvbiBpcyBuZWVkZWQgd2hlbiByZWFkaW5nIHRoZSBPTURhdGFTb3VyY2VFeHQuCi0gICAgICogQHJldHVybiBib29sZWFuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNEZXN0cnVjdGl2ZVJlYWQoKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHdyaXRpbmcgdGhlIGJhY2tpbmcgb2JqZWN0IGlzIGRlc3RydWN0aXZlLgotICAgICAqIEFuIGV4YW1wbGUgb2YgYW4gb2JqZWN0IHdpdGggYSBkZXN0cnVjdGl2ZSB3cml0ZSBpcyBhbiBJbnB1dFN0cmVhbS4KLSAgICAgKiBUaGUgb3duaW5nIE9NU291cmNlZEVsZW1lbnQgdXNlcyB0aGlzIGluZm9ybWF0aW9uIHRvIGRldGVtaW5lIGlmIE9NIHRyZWUKLSAgICAgKiBleHBhbnNpb24gaXMgbmVlZGVkIHdoZW4gd3JpdGluZyB0aGUgT01EYXRhU291cmNlRXh0LgotICAgICAqIEByZXR1cm4gYm9vbGVhbgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRGVzdHJ1Y3RpdmVXcml0ZSgpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgSW5wdXRTdHJlYW0gcmVwcmVzZW50aW5nIHRoZSB4bWwgZGF0YQotICAgICAqIEBwYXJhbSBlbmNvZGluZyBTdHJpbmcgZW5jb2Rpbmcgb2YgSW5wdXRTdHJlYW0KLSAgICAgKiBAcmV0dXJuIElucHV0U3RyZWFtCi0gICAgICovCi0gICAgcHVibGljIElucHV0U3RyZWFtIGdldFhNTElucHV0U3RyZWFtKFN0cmluZyBlbmNvZGluZykgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGdldFhNTEJ5dGVzKGVuY29kaW5nKSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBieXRlW10gcmVwcmVzZW50aW5nIHRoZSB4bWwgZGF0YQotICAgICAqIEBwYXJhbSBlbmNvZGluZyBTdHJpbmcgZW5jb2Rpbmcgb2YgSW5wdXRTdHJlYW0KLSAgICAgKiBAcmV0dXJuIGJ5dGVbXQotICAgICAqIEBzZWUgZ2V0WE1MSW5wdXRTdHJlYW0KLSAgICAgKi8KLSAgICBwdWJsaWMgYnl0ZVtdIGdldFhNTEJ5dGVzKFN0cmluZyBlbmNvZGluZykgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gewotICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgT01PdXRwdXRGb3JtYXQgZm9ybWF0ID0gbmV3IE9NT3V0cHV0Rm9ybWF0KCk7Ci0gICAgICAgIGZvcm1hdC5zZXRDaGFyU2V0RW5jb2RpbmcoZW5jb2RpbmcpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgc2VyaWFsaXplKGJhb3MsIGZvcm1hdCk7Ci0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBuZXcgT01FeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJhb3MudG9CeXRlQXJyYXkoKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ2xvc2UgdGhlIERhdGFTb3VyY2UgYW5kIGZyZWUgaXRzIHJlc291cmNlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKLSAgICAgICAgcGFyZW50UU5hbWUgPSBudWxsOwotICAgICAgICBiZWFuID0gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIE9NRGF0YVNvdXJjZUV4dCBjb3B5KCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcga2V5KSB7Ci0gICAgICAgIGlmIChtYXAgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1hcC5nZXQoa2V5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IHNldFByb3BlcnR5KFN0cmluZyBrZXksIE9iamVjdCB2YWx1ZSkgewotICAgICAgICBpZiAobWFwID09IG51bGwpIHsKLSAgICAgICAgICAgIG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1hcC5wdXQoa2V5LCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaGFzUHJvcGVydHkoU3RyaW5nIGtleSkgewotICAgICAgICBpZiAobWFwID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfSAKLSAgICAgICAgcmV0dXJuIG1hcC5jb250YWluc0tleShrZXkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy9BREJFeGNlcHRpb24uamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy9BREJFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQwMTM1My4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvQURCRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmc7Ci0KLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLkxvY2F0aW9uOwotCi0vKioKLSAqIHVzZXMgdG8gaGFuZGxlIEFEQiBleGNlcHRpb25zCi0gKi8KLQotcHVibGljIGNsYXNzIEFEQkV4Y2VwdGlvbiBleHRlbmRzIERhdGFCaW5kRXhjZXB0aW9uIHsKLQotICAgIHB1YmxpYyBBREJFeGNlcHRpb24oKSB7Ci0gICAgfQotCi0gICAgcHVibGljIEFEQkV4Y2VwdGlvbihTdHJpbmcgc3RyaW5nKSB7Ci0gICAgICAgIHN1cGVyKHN0cmluZyk7Ci0gICAgfQotCi0gICAgcHVibGljIEFEQkV4Y2VwdGlvbihUaHJvd2FibGUgdGhyb3dhYmxlKSB7Ci0gICAgICAgIHN1cGVyKHRocm93YWJsZSk7Ci0gICAgfQotCi0gICAgcHVibGljIEFEQkV4Y2VwdGlvbihTdHJpbmcgc3RyaW5nLCBUaHJvd2FibGUgdGhyb3dhYmxlKSB7Ci0gICAgICAgIHN1cGVyKHN0cmluZywgdGhyb3dhYmxlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQURCRXhjZXB0aW9uKFN0cmluZyBzdHJpbmcsIExvY2F0aW9uIGxvY2F0aW9uLCBUaHJvd2FibGUgdGhyb3dhYmxlKSB7Ci0gICAgICAgIHN1cGVyKHN0cmluZywgbG9jYXRpb24sIHRocm93YWJsZSk7Ci0gICAgfQotCi0gICAgcHVibGljIEFEQkV4Y2VwdGlvbihTdHJpbmcgc3RyaW5nLCBMb2NhdGlvbiBsb2NhdGlvbikgewotICAgICAgICBzdXBlcihzdHJpbmcsIGxvY2F0aW9uKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvQURCSGVscGVyRGF0YVNvdXJjZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL0FEQkhlbHBlckRhdGFTb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmFjN2M0ZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvQURCSGVscGVyRGF0YVNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZzsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlRXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU91dHB1dEZvcm1hdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLnV0aWwuU3RBWFV0aWxzOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uV3JpdGVyOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQURCSGVscGVyRGF0YVNvdXJjZSBpbXBsZW1lbnRzIE9NRGF0YVNvdXJjZUV4dCB7Ci0KLSAgICBwcm90ZWN0ZWQgUU5hbWUgcGFyZW50UU5hbWU7Ci0gICAgcHJvdGVjdGVkIE9iamVjdCBiZWFuOwotICAgIHByb3RlY3RlZCBTdHJpbmcgaGVscGVyQ2xhc3NOYW1lOwotICAgIAotICAgIEhhc2hNYXAgbWFwID0gbnVsbDsgIC8vIE1hcCBvZiBwcm9wZXJ0aWVzCi0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciB0YWtpbmcgaW4gYW4gQURCQmVhbgotICAgICAqCi0gICAgICogQHBhcmFtIGJlYW4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQURCSGVscGVyRGF0YVNvdXJjZShPYmplY3QgYmVhbiwgUU5hbWUgcGFyZW50UU5hbWUsIFN0cmluZyBoZWxwZXJDbGFzc05hbWUpIHsKLSAgICAgICAgdGhpcy5iZWFuID0gYmVhbjsKLSAgICAgICAgdGhpcy5wYXJlbnRRTmFtZSA9IHBhcmVudFFOYW1lOwotICAgICAgICB0aGlzLmhlbHBlckNsYXNzTmFtZSA9IGhlbHBlckNsYXNzTmFtZTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBvdXRwdXQKLSAgICAgKiBAcGFyYW0gZm9ybWF0Ci0gICAgICogQHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbgotICAgICAqCi0gICAgICogQHNlZSBPTURhdGFTb3VyY2Ujc2VyaWFsaXplKGphdmEuaW8uT3V0cHV0U3RyZWFtLCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NT3V0cHV0Rm9ybWF0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShPdXRwdXRTdHJlYW0gb3V0cHV0LCBPTU91dHB1dEZvcm1hdCBmb3JtYXQpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBYTUxTdHJlYW1Xcml0ZXIgeG1sU3RyZWFtV3JpdGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVdyaXRlcihvdXRwdXQpOwotICAgICAgICBzZXJpYWxpemUoeG1sU3RyZWFtV3JpdGVyKTsKLSAgICAgICAgeG1sU3RyZWFtV3JpdGVyLmZsdXNoKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHdyaXRlcgotICAgICAqIEBwYXJhbSBmb3JtYXQKLSAgICAgKiBAdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbgotICAgICAqIEBzZWUgT01EYXRhU291cmNlI3NlcmlhbGl6ZShqYXZhLmlvLldyaXRlciwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU91dHB1dEZvcm1hdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoV3JpdGVyIHdyaXRlciwgT01PdXRwdXRGb3JtYXQgZm9ybWF0KSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgWE1MU3RyZWFtV3JpdGVyIHhtbFN0cmVhbVdyaXRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1Xcml0ZXIod3JpdGVyKTsKLSAgICAgICAgc2VyaWFsaXplKHhtbFN0cmVhbVdyaXRlcik7Ci0gICAgICAgIHhtbFN0cmVhbVdyaXRlci5mbHVzaCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbmVlZHMgdG8gYmUgZ2VuZXJhdGVkIGluc2lkZSB0aGUgQURCIGJlYW4KLSAgICAgKgotICAgICAqIEBwYXJhbSB4bWxXcml0ZXIKLSAgICAgKiBAdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbgotICAgICAqIEBzZWUgT01EYXRhU291cmNlI3NlcmlhbGl6ZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlcikKLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXJpYWxpemUoWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikKLSAgICAgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb247Ci0KLQotICAgIC8qKgotICAgICAqIEB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZSNnZXRSZWFkZXIoKQotICAgICAqLwotICAgIHB1YmxpYyBYTUxTdHJlYW1SZWFkZXIgZ2V0UmVhZGVyKCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIHNpbmNlIG9ubHkgQURCQmVhbnMgcmVsYXRlZCB0byBlbGVtZW50cyBjYW4gYmUgc2VyaWFsaXplZAotICAgICAgICB0cnkgewotICAgICAgICAgICAgQ2xhc3MgaGVscGVyQ2xhc3MgPSBDbGFzcy5mb3JOYW1lKGhlbHBlckNsYXNzTmFtZSk7Ci0gICAgICAgICAgICBNZXRob2QgbWV0aG9kID0gaGVscGVyQ2xhc3MuZ2V0TWV0aG9kKCJnZXRQdWxsUGFyc2VyIiwgbmV3IENsYXNzW10geyBPYmplY3QuY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgIFFOYW1lLmNsYXNzIH0pOwotICAgICAgICAgICAgcmV0dXJuIChYTUxTdHJlYW1SZWFkZXIpbWV0aG9kLmludm9rZShudWxsLCBuZXcgT2JqZWN0W10geyBiZWFuLCBwYXJlbnRRTmFtZSB9KTsKLSAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgWE1MU3RyZWFtRXhjZXB0aW9uKGUpOwotICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFhNTFN0cmVhbUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgWE1MU3RyZWFtRXhjZXB0aW9uKGUpOwotICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBYTUxTdHJlYW1FeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGJhY2tpbmcgT2JqZWN0LgotICAgICAqIEByZXR1cm4gT2JqZWN0Ci0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRPYmplY3QoKSB7Ci0gICAgICAgIHJldHVybiBiZWFuOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgcmVhZGluZyB0aGUgYmFja2luZyBvYmplY3QgaXMgZGVzdHJ1Y3RpdmUuCi0gICAgICogQW4gZXhhbXBsZSBvZiBhbiBvYmplY3Qgd2l0aCBhIGRlc3RydWN0aXZlIHJlYWQgaXMgYW4gSW5wdXRTdGVhbS4KLSAgICAgKiBUaGUgb3duaW5nIE9NU291cmNlZEVsZW1lbnQgdXNlcyB0aGlzIGluZm9ybWF0aW9uIHRvIGRldGVtaW5lIGlmIE9NIHRyZWUKLSAgICAgKiBleHBhbnNpb24gaXMgbmVlZGVkIHdoZW4gcmVhZGluZyB0aGUgT01EYXRhU291cmNlRXh0LgotICAgICAqIEByZXR1cm4gYm9vbGVhbgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRGVzdHJ1Y3RpdmVSZWFkKCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB3cml0aW5nIHRoZSBiYWNraW5nIG9iamVjdCBpcyBkZXN0cnVjdGl2ZS4KLSAgICAgKiBBbiBleGFtcGxlIG9mIGFuIG9iamVjdCB3aXRoIGEgZGVzdHJ1Y3RpdmUgd3JpdGUgaXMgYW4gSW5wdXRTdHJlYW0uCi0gICAgICogVGhlIG93bmluZyBPTVNvdXJjZWRFbGVtZW50IHVzZXMgdGhpcyBpbmZvcm1hdGlvbiB0byBkZXRlbWluZSBpZiBPTSB0cmVlCi0gICAgICogZXhwYW5zaW9uIGlzIG5lZWRlZCB3aGVuIHdyaXRpbmcgdGhlIE9NRGF0YVNvdXJjZUV4dC4KLSAgICAgKiBAcmV0dXJuIGJvb2xlYW4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0Rlc3RydWN0aXZlV3JpdGUoKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIElucHV0U3RyZWFtIHJlcHJlc2VudGluZyB0aGUgeG1sIGRhdGEKLSAgICAgKiBAcGFyYW0gZW5jb2RpbmcgU3RyaW5nIGVuY29kaW5nIG9mIElucHV0U3RyZWFtCi0gICAgICogQHJldHVybiBJbnB1dFN0cmVhbQotICAgICAqLwotICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRYTUxJbnB1dFN0cmVhbShTdHJpbmcgZW5jb2RpbmcpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShnZXRYTUxCeXRlcyhlbmNvZGluZykpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgYnl0ZVtdIHJlcHJlc2VudGluZyB0aGUgeG1sIGRhdGEKLSAgICAgKiBAcGFyYW0gZW5jb2RpbmcgU3RyaW5nIGVuY29kaW5nIG9mIElucHV0U3RyZWFtCi0gICAgICogQHJldHVybiBieXRlW10KLSAgICAgKiBAc2VlIGdldFhNTElucHV0U3RyZWFtCi0gICAgICovCi0gICAgcHVibGljIGJ5dGVbXSBnZXRYTUxCeXRlcyhTdHJpbmcgZW5jb2RpbmcpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKLSAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgIE9NT3V0cHV0Rm9ybWF0IGZvcm1hdCA9IG5ldyBPTU91dHB1dEZvcm1hdCgpOwotICAgICAgICBmb3JtYXQuc2V0Q2hhclNldEVuY29kaW5nKGVuY29kaW5nKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNlcmlhbGl6ZShiYW9zLCBmb3JtYXQpOwotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbmV3IE9NRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBiYW9zLnRvQnl0ZUFycmF5KCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENsb3NlIHRoZSBEYXRhU291cmNlIGFuZCBmcmVlIGl0cyByZXNvdXJjZXMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY2xvc2UoKSB7Ci0gICAgICAgIHBhcmVudFFOYW1lID0gbnVsbDsKLSAgICAgICAgYmVhbiA9IG51bGw7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBPTURhdGFTb3VyY2VFeHQgY29weSgpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIGtleSkgewotICAgICAgICBpZiAobWFwID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtYXAuZ2V0KGtleSk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBzZXRQcm9wZXJ0eShTdHJpbmcga2V5LCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgaWYgKG1hcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtYXAucHV0KGtleSwgdmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGhhc1Byb3BlcnR5KFN0cmluZyBrZXkpIHsKLSAgICAgICAgaWYgKG1hcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0gCi0gICAgICAgIHJldHVybiBtYXAuY29udGFpbnNLZXkoa2V5KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvQURCU09BUE1vZGVsQnVpbGRlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL0FEQlNPQVBNb2RlbEJ1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM2N2FmNC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvQURCU09BUE1vZGVsQnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZzsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5pbXBsLmJ1aWxkZXIuU3RBWFNPQVBNb2RlbEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5TdHJlYW1XcmFwcGVyOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKLQotLyoqIEJ1aWxkcyBhIFNPQVBFbnZlbG9wZSBhcm91bmQgYW4gQURCIHB1bGwgcGFyc2VyICovCi1wdWJsaWMgY2xhc3MgQURCU09BUE1vZGVsQnVpbGRlciBleHRlbmRzIFN0QVhTT0FQTW9kZWxCdWlsZGVyIHsKLQotICAgIHB1YmxpYyBBREJTT0FQTW9kZWxCdWlsZGVyKFhNTFN0cmVhbVJlYWRlciBwYXJzZXIsIFNPQVBGYWN0b3J5IGZhY3RvcnkpIHsKLSAgICAgICAgc3VwZXIobmV3IEVudmVsb3BlKHBhcnNlcikuCi0gICAgICAgICAgICAgICAgZ2V0UHVsbFBhcnNlcigKLSAgICAgICAgICAgICAgICBuZXcgUU5hbWUoZmFjdG9yeS5nZXRTb2FwVmVyc2lvblVSSSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBTT0FQQ29uc3RhbnRzLlNPQVBFTlZFTE9QRV9MT0NBTF9OQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgICBTT0FQQ29uc3RhbnRzLlNPQVBfREVGQVVMVF9OQU1FU1BBQ0VfUFJFRklYKSksCi0gICAgICAgICAgICAgIGZhY3RvcnksCi0gICAgICAgICAgICAgIGZhY3RvcnkuZ2V0U29hcFZlcnNpb25VUkkoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIFNPQVBFbnZlbG9wZSBnZXRFbnZlbG9wZSgpIHsKLSAgICAgICAgcmV0dXJuIGdldFNPQVBFbnZlbG9wZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRW52ZWxvcGUKLSAgICAgICAgICAgIGltcGxlbWVudHMgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJCZWFuIHsKLSAgICAgICAgQm9keSBib2R5OwotCi0gICAgICAgIEVudmVsb3BlKFhNTFN0cmVhbVJlYWRlciBwYXJzZXIpIHsKLSAgICAgICAgICAgIGJvZHkgPSBuZXcgQm9keShwYXJzZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIGdldFB1bGxQYXJzZXIoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxTmFtZSkgewotICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBlbGVtZW50TGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQobmV3IFFOYW1lKHFOYW1lLmdldE5hbWVzcGFjZVVSSSgpLCAiSGVhZGVyIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09BUENvbnN0YW50cy5CT0RZX05BTUVTUEFDRV9QUkVGSVgpKTsKLSAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChuZXcgSGVhZGVyKCkpOwotICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG5ldyBRTmFtZShxTmFtZS5nZXROYW1lc3BhY2VVUkkoKSwgIkJvZHkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT0FQQ29uc3RhbnRzLkJPRFlfTkFNRVNQQUNFX1BSRUZJWCkpOwotICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKGJvZHkpOwotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgICAgICAgICAgICAgIG5ldyBTdHJlYW1XcmFwcGVyKG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBREJYTUxTdHJlYW1SZWFkZXJJbXBsKHFOYW1lLCBlbGVtZW50TGlzdC50b0FycmF5KCksIG51bGwpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBRTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikKLSAgICAgICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uLCBBREJFeGNlcHRpb24gewotICAgICAgICAgICAgc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyLGZhbHNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBRTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VyaWFsaXplVHlwZSkKLSAgICAgICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uLCBBREJFeGNlcHRpb24gewotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJVbiBpbXBsZW1lbnRlZCBtZXRob2QiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGlkZW50aWZ5U09BUFZlcnNpb24oU3RyaW5nIHNvYXBWZXJzaW9uVVJJRnJvbVRyYW5zcG9ydCkgewotICAgICAgICAvL0RvIG5vdGhpbmcKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJvZHkKLSAgICAgICAgICAgIGltcGxlbWVudHMgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJCZWFuIHsKLSAgICAgICAgQ2hpbGQgY2hpbGQ7Ci0KLSAgICAgICAgQm9keShYTUxTdHJlYW1SZWFkZXIgcGFyc2VyKSB7Ci0gICAgICAgICAgICBjaGlsZCA9IG5ldyBDaGlsZChwYXJzZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIGdldFB1bGxQYXJzZXIoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxTmFtZSkgewotICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBlbGVtZW50TGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQocU5hbWUpOwotICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKGNoaWxkKTsKLSAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVySW1wbChxTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC50b0FycmF5KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpCi0gICAgICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgQURCRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcixmYWxzZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNlcmlhbGl6ZVR5cGUpCi0gICAgICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgQURCRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiVW4gaW1wbGVtZW50ZWQgbWV0aG9kIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEhlYWRlcgotICAgICAgICAgICAgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkJlYW4gewotICAgICAgICBwdWJsaWMgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgZ2V0UHVsbFBhcnNlcihqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFOYW1lKSB7Ci0gICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGVsZW1lbnRMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLSAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVySW1wbChxTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC50b0FycmF5KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCk7Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIFFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKQotICAgICAgICAgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sIEFEQkV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBzZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIsZmFsc2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIFFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzZXJpYWxpemVUeXBlKQotICAgICAgICAgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sIEFEQkV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlVuIGltcGxlbWVudGVkIG1ldGhvZCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBDaGlsZAotICAgICAgICAgICAgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkJlYW4gewotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgcGFyc2VyOwotCi0gICAgICAgIENoaWxkKFhNTFN0cmVhbVJlYWRlciBwYXJzZXIpIHsKLSAgICAgICAgICAgIHRoaXMucGFyc2VyID0gcGFyc2VyOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIGdldFB1bGxQYXJzZXIoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxTmFtZSkgewotICAgICAgICAgICAgcmV0dXJuIHBhcnNlcjsKLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpCi0gICAgICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgQURCRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcixmYWxzZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNlcmlhbGl6ZVR5cGUpCi0gICAgICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgQURCRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiVW4gaW1wbGVtZW50ZWQgbWV0aG9kIik7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvRGF0YUJpbmRFeGNlcHRpb24uamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy9EYXRhQmluZEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMmFhNDkxLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy9EYXRhQmluZEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nOwotCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5Mb2NhdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBoYW5kbGVzIGRhdGFiaW5kaW5nIGV4Y2VwdGlvbnMKLSAqLwotCi1wdWJsaWMgY2xhc3MgRGF0YUJpbmRFeGNlcHRpb24gZXh0ZW5kcyBYTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgcHVibGljIERhdGFCaW5kRXhjZXB0aW9uKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBEYXRhQmluZEV4Y2VwdGlvbihTdHJpbmcgc3RyaW5nKSB7Ci0gICAgICAgIHN1cGVyKHN0cmluZyk7Ci0gICAgfQotCi0gICAgcHVibGljIERhdGFCaW5kRXhjZXB0aW9uKFRocm93YWJsZSB0aHJvd2FibGUpIHsKLSAgICAgICAgc3VwZXIodGhyb3dhYmxlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRGF0YUJpbmRFeGNlcHRpb24oU3RyaW5nIHN0cmluZywgVGhyb3dhYmxlIHRocm93YWJsZSkgewotICAgICAgICBzdXBlcihzdHJpbmcsIHRocm93YWJsZSk7Ci0gICAgfQotCi0gICAgcHVibGljIERhdGFCaW5kRXhjZXB0aW9uKFN0cmluZyBzdHJpbmcsIExvY2F0aW9uIGxvY2F0aW9uLCBUaHJvd2FibGUgdGhyb3dhYmxlKSB7Ci0gICAgICAgIHN1cGVyKHN0cmluZywgbG9jYXRpb24sIHRocm93YWJsZSk7Ci0gICAgfQotCi0gICAgcHVibGljIERhdGFCaW5kRXhjZXB0aW9uKFN0cmluZyBzdHJpbmcsIExvY2F0aW9uIGxvY2F0aW9uKSB7Ci0gICAgICAgIHN1cGVyKHN0cmluZywgbG9jYXRpb24pOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL2kxOG4vQURCTWVzc2FnZXMuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy9pMThuL0FEQk1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjZmRkMTYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL2kxOG4vQURCTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuaTE4bjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaTE4bi5NZXNzYWdlQnVuZGxlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaTE4bi5NZXNzYWdlc0NvbnN0YW50czsKLQotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLXB1YmxpYyBjbGFzcyBBREJNZXNzYWdlcyB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3MgdGhpc0NsYXNzID0gQURCTWVzc2FnZXMuY2xhc3M7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9OQU1FID0gTWVzc2FnZXNDb25zdGFudHMucHJvamVjdE5hbWU7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTT1VSQ0VfTkFNRSA9IE1lc3NhZ2VzQ29uc3RhbnRzLnJlc291cmNlTmFtZTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2NhbGUgTE9DQUwgPSBNZXNzYWdlc0NvbnN0YW50cy5sb2NhbGU7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFDS0FHRV9OQU1FID0gZ2V0UGFja2FnZSh0aGlzQ2xhc3MuZ2V0TmFtZSgpKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzc0xvYWRlciBDTEFTU19MT0FERVIgPSB0aGlzQ2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFJlc291cmNlQnVuZGxlIFBBUkVOVCA9Ci0gICAgICAgICAgICAoTWVzc2FnZXNDb25zdGFudHMucm9vdFBhY2thZ2VOYW1lLmVxdWFscyhQQUNLQUdFX05BTUUpKQotICAgICAgICAgICAgICAgICAgICA/IG51bGwKLSAgICAgICAgICAgICAgICAgICAgOiBNZXNzYWdlc0NvbnN0YW50cy5yb290QnVuZGxlOwotCi0KLSAgICAvKiogKiogTk8gTkVFRCBUTyBDSEFOR0UgQU5ZVEhJTkcgQkVMT1cgKioqKiAqLwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWVzc2FnZUJ1bmRsZSBtZXNzYWdlQnVuZGxlID0KLSAgICAgICAgICAgIG5ldyBNZXNzYWdlQnVuZGxlKFBST0pFQ1RfTkFNRSwgUEFDS0FHRV9OQU1FLCBSRVNPVVJDRV9OQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9DQUwsIENMQVNTX0xPQURFUiwgUEFSRU5UKTsKLQotICAgIC8qKgotICAgICAqIEdldHMgYSBtZXNzYWdlIGZyb20gcmVzb3VyY2UucHJvcGVydGllcyBmcm9tIHRoZSBwYWNrYWdlIG9mIHRoZSBnaXZlbiBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5IFRoZSByZXNvdXJjZSBrZXkKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGZvcm1hdHRlZCBtZXNzYWdlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIGtleSkKLSAgICAgICAgICAgIHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbWVzc2FnZUJ1bmRsZS5nZXRNZXNzYWdlKGtleSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGEgbWVzc2FnZSBmcm9tIHJlc291cmNlLnByb3BlcnRpZXMgZnJvbSB0aGUgcGFja2FnZSBvZiB0aGUgZ2l2ZW4gb2JqZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIGtleSAgVGhlIHJlc291cmNlIGtleQotICAgICAqIEBwYXJhbSBhcmcwIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7MH0KLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGZvcm1hdHRlZCBtZXNzYWdlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIGtleSwgU3RyaW5nIGFyZzApCi0gICAgICAgICAgICB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG1lc3NhZ2VCdW5kbGUuZ2V0TWVzc2FnZShrZXksIGFyZzApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgYSBtZXNzYWdlIGZyb20gcmVzb3VyY2UucHJvcGVydGllcyBmcm9tIHRoZSBwYWNrYWdlIG9mIHRoZSBnaXZlbiBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5ICBUaGUgcmVzb3VyY2Uga2V5Ci0gICAgICogQHBhcmFtIGFyZzAgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHswfQotICAgICAqIEBwYXJhbSBhcmcxIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7MX0KLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGZvcm1hdHRlZCBtZXNzYWdlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIGtleSwgU3RyaW5nIGFyZzAsIFN0cmluZyBhcmcxKQotICAgICAgICAgICAgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBtZXNzYWdlQnVuZGxlLmdldE1lc3NhZ2Uoa2V5LCBhcmcwLCBhcmcxKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGEgbWVzc2FnZSBmcm9tIHJlc291cmNlLnByb3BlcnRpZXMgZnJvbSB0aGUgcGFja2FnZSBvZiB0aGUgZ2l2ZW4gb2JqZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIGtleSAgVGhlIHJlc291cmNlIGtleQotICAgICAqIEBwYXJhbSBhcmcwIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7MH0KLSAgICAgKiBAcGFyYW0gYXJnMSBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezF9Ci0gICAgICogQHBhcmFtIGFyZzIgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHsyfQotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgZm9ybWF0dGVkIG1lc3NhZ2UuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZShTdHJpbmcga2V5LCBTdHJpbmcgYXJnMCwgU3RyaW5nIGFyZzEsIFN0cmluZyBhcmcyKQotICAgICAgICAgICAgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBtZXNzYWdlQnVuZGxlLmdldE1lc3NhZ2Uoa2V5LCBhcmcwLCBhcmcxLCBhcmcyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYSBtZXNzYWdlIGZyb20gcmVzb3VyY2UucHJvcGVydGllcyBmcm9tIHRoZSBwYWNrYWdlIG9mIHRoZSBnaXZlbiBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5ICBUaGUgcmVzb3VyY2Uga2V5Ci0gICAgICogQHBhcmFtIGFyZzAgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHswfQotICAgICAqIEBwYXJhbSBhcmcxIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7MX0KLSAgICAgKiBAcGFyYW0gYXJnMiBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezJ9Ci0gICAgICogQHBhcmFtIGFyZzMgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHszfQotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgZm9ybWF0dGVkIG1lc3NhZ2UuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZShTdHJpbmcga2V5LCBTdHJpbmcgYXJnMCwgU3RyaW5nIGFyZzEsIFN0cmluZyBhcmcyLCBTdHJpbmcgYXJnMykKLSAgICAgICAgICAgIHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbWVzc2FnZUJ1bmRsZS5nZXRNZXNzYWdlKGtleSwgYXJnMCwgYXJnMSwgYXJnMiwgYXJnMyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhIG1lc3NhZ2UgZnJvbSByZXNvdXJjZS5wcm9wZXJ0aWVzIGZyb20gdGhlIHBhY2thZ2Ugb2YgdGhlIGdpdmVuIG9iamVjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXkgIFRoZSByZXNvdXJjZSBrZXkKLSAgICAgKiBAcGFyYW0gYXJnMCBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezB9Ci0gICAgICogQHBhcmFtIGFyZzEgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHsxfQotICAgICAqIEBwYXJhbSBhcmcyIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7Mn0KLSAgICAgKiBAcGFyYW0gYXJnMyBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezN9Ci0gICAgICogQHBhcmFtIGFyZzQgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHs0fQotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgZm9ybWF0dGVkIG1lc3NhZ2UuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZShTdHJpbmcga2V5LCBTdHJpbmcgYXJnMCwgU3RyaW5nIGFyZzEsIFN0cmluZyBhcmcyLCBTdHJpbmcgYXJnMywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhcmc0KQotICAgICAgICAgICAgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBtZXNzYWdlQnVuZGxlLmdldE1lc3NhZ2Uoa2V5LCBhcmcwLCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGEgbWVzc2FnZSBmcm9tIHJlc291cmNlLnByb3BlcnRpZXMgZnJvbSB0aGUgcGFja2FnZSBvZiB0aGUgZ2l2ZW4gb2JqZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIGtleSAgVGhlIHJlc291cmNlIGtleQotICAgICAqIEBwYXJhbSBhcmdzIEFuIGFycmF5IG9mIG9iamVjdHMgdG8gcGxhY2UgaW4gY29ycmVzcG9uZGluZyB2YXJpYWJsZXMKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGZvcm1hdHRlZCBtZXNzYWdlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIGtleSwgU3RyaW5nW10gYXJncykKLSAgICAgICAgICAgIHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbWVzc2FnZUJ1bmRsZS5nZXRNZXNzYWdlKGtleSwgYXJncyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpIHsKLSAgICAgICAgcmV0dXJuIG1lc3NhZ2VCdW5kbGUuZ2V0UmVzb3VyY2VCdW5kbGUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE1lc3NhZ2VCdW5kbGUgZ2V0TWVzc2FnZUJ1bmRsZSgpIHsKLSAgICAgICAgcmV0dXJuIG1lc3NhZ2VCdW5kbGU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFBhY2thZ2UoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgcmV0dXJuIG5hbWUuc3Vic3RyaW5nKDAsIG5hbWUubGFzdEluZGV4T2YoJy4nKSkuaW50ZXJuKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL2kxOG4vcmVzb3VyY2UucHJvcGVydGllcyBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy9pMThuL3Jlc291cmNlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlZWE1ZDEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL2kxOG4vcmVzb3VyY2UucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLSMKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotIyBUcmFuc2xhdGlvbiBpbnN0cnVjdGlvbnMuCi0jIDEuICBFYWNoIG1lc3NhZ2UgbGluZSBpcyBvZiB0aGUgZm9ybSBrZXk9dmFsdWUuCi0jICAgICBUcmFuc2xhdGUgdGhlIHZhbHVlLCBETyBOT1QgdHJhbnNsYXRlIHRoZSBrZXkuCi0jIDIuICBUaGUgbWVzc2FnZXMgbWF5IGNvbnRhaW4gYXJndW1lbnRzIHRoYXQgd2lsbCBiZSBmaWxsZWQgaW4KLSMgICAgIGJ5IHRoZSBydW50aW1lLiAgVGhlc2UgYXJlIG9mIHRoZSBmb3JtOiB7MH0sIHsxfSwgZXRjLgotIyAgICAgVGhlc2UgbXVzdCBhcHBlYXIgYXMgaXMgaW4gdGhlIG1lc3NhZ2UsIHRob3VnaCB0aGUgb3JkZXIKLSMgICAgIG1heSBiZSBjaGFuZ2VkIHRvIHN1cHBvcnQgcHJvcGVyIGxhbmd1YWdlIHN5bnRheC4KLSMgMy4gIElmIGEgc2luZ2xlIHF1b3RlIGNoYXJhY3RlciBpcyB0byBhcHBlYXIgaW4gdGhlIHJlc3VsdGluZwotIyAgICAgbWVzc2FnZSwgaXQgbXVzdCBhcHBlYXIgaW4gdGhpcyBmaWxlIGFzIHR3byBjb25zZWN1dGl2ZQotIyAgICAgc2luZ2xlIHF1b3RlIGNoYXJhY3RlcnMuCi0jIDQuICBMaW5lcyBiZWdpbm5pbmcgd2l0aCAiIyIgKGxpa2UgdGhpcyBvbmUpIGFyZSBjb21tZW50IGxpbmVzCi0jICAgICBhbmQgbWF5IGNvbnRhaW4gdHJhbnNsYXRpb24gaW5zdHJ1Y3Rpb25zLiAgVGhleSBuZWVkIG5vdCBiZQotIyAgICAgdHJhbnNsYXRlZCB1bmxlc3MgeW91ciB0cmFuc2xhdGVkIGZpbGUsIHJhdGhlciB0aGFuIHRoaXMgZmlsZSwKLSMgICAgIHdpbGwgc2VydmUgYXMgYSBiYXNlIGZvciBvdGhlciB0cmFuc2xhdG9ycy4KLSMjIyMjIyMjIyMjIyMjIyMjIyBDb252ZXJ0ZXIgVXRpbCAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1jb252ZXJ0ZXIuY2Fubm90R2VuZXJhdGU9Q2Fubm90IGdlbmVyYXRlIG9iamVjdCBmb3IgezB9Ci1jb252ZXJ0ZXIuY2Fubm90Q29udmVydD1ObyB3YXkgdG8gY29udmVydCB7MH0KLWNvbnZlcnRlci5jYW5ub3RQYXJzZT1VbmFibGUgdG8gcGFyc2UgJyd7MH0nJwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlbWFwcGluZy9TaW1wbGVUeXBlTWFwcGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZW1hcHBpbmcvU2ltcGxlVHlwZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzAxZWVmLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlbWFwcGluZy9TaW1wbGVUeXBlTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVtYXBwaW5nOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5hdHRhY2htZW50cy51dGlscy5EYXRhSGFuZGxlclV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01Ob2RlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01UZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLQotaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXI7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotcHVibGljIGNsYXNzIFNpbXBsZVR5cGVNYXBwZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUUklORyA9ICJqYXZhLmxhbmcuU3RyaW5nIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV19JTlQgPSAiamF2YS5sYW5nLkludGVnZXIiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXX0RPVUJMRSA9ICJqYXZhLmxhbmcuRG91YmxlIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV19MT05HID0gImphdmEubGFuZy5Mb25nIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV19CWVRFID0gImphdmEubGFuZy5CeXRlIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV19TSE9SVCA9ICJqYXZhLmxhbmcuU2hvcnQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXX0JPT0xFQU4gPSAiamF2YS5sYW5nLkJvb2xlYW4iOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXX0NIQVIgPSAiamF2YS5sYW5nLkNoYXJhY3RlciI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdfRkxPQVQgPSAiamF2YS5sYW5nLkZsb2F0IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV19DQUxFTkRBUiA9ICJqYXZhLnV0aWwuQ2FsZW5kYXIiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXX0RBVEUgPSAiamF2YS51dGlsLkRhdGUiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTlQgPSAiaW50IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQk9PTEVBTiA9ICJib29sZWFuIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQllURSA9ICJieXRlIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9VQkxFID0gImRvdWJsZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNIT1JUID0gInNob3J0IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9ORyA9ICJsb25nIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxPQVQgPSAiZmxvYXQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDSEFSID0gImNoYXIiOwotCi0gICAgLyoKLSAgICAgKiBUbyBzdXBwb3J0IGRlc2VyaWFsaXplIEJpZ0RlY2ltYWwsIEJpZ0ludGVnZXIKLSAgICAgKiBEYXksIER1cmF0aW9uLCBNb250aCwgTW9udGhEYXksIFRpbWUsIFllYXIsIFllYXJNb250aAotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCSUdfREVDSU1BTCA9ICJqYXZhLm1hdGguQmlnRGVjaW1hbCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJJR19JTlRFR0VSID0gImphdmEubWF0aC5CaWdJbnRlZ2VyIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFZID0gIm9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuRGF5IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFVSQVRJT04gPSAib3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5EdXJhdGlvbiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1PTlRIID0gIm9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuTW9udGgiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNT05USF9EQVkgPSAib3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5Nb250aERheSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRJTUUgPSAib3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5UaW1lIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWUVBUiA9ICJvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLlllYXIiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBZRUFSX01PTlRIID0gIm9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuWWVhck1vbnRoIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldFNpbXBsZVR5cGVPYmplY3QoQ2xhc3MgcGFyYW1ldGVyLCBPTUVsZW1lbnQgdmFsdWUpIHsKLSAgICAgICAgU3RyaW5nIG5hbWUgPSBwYXJhbWV0ZXIuZ2V0TmFtZSgpOwotICAgICAgICBTdHJpbmcgdGV4dCA9IHZhbHVlLmdldFRleHQoKTsKLSAgICAgICAgCi0gICAgICAgIGlmKG5hbWUuZXF1YWxzKFNUUklORykpIHsKLSAgICAgICAgICAgIHJldHVybiB0ZXh0OwotICAgICAgICB9IGVsc2UgIGlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFscyhJTlQpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEludGVnZXIodGV4dCk7Ci0gICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHMoQk9PTEVBTikpIHsKLSAgICAgICAgICAgIHJldHVybiBDb252ZXJ0ZXJVdGlsLmNvbnZlcnRUb0Jvb2xlYW4odGV4dCk7Ci0gICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHMoQllURSkpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgQnl0ZSh0ZXh0KTsKLSAgICAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFscyhET1VCTEUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IERvdWJsZSh0ZXh0KTsKLSAgICAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFscyhTSE9SVCkpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgU2hvcnQodGV4dCk7Ci0gICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHMoTE9ORykpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgTG9uZyh0ZXh0KTsKLSAgICAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFscyhGTE9BVCkpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgRmxvYXQodGV4dCk7Ci0gICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHMoQ0hBUikpIHsKLSAgICAgICAgICAgIHJldHVybiB0ZXh0LnRvQ2hhckFycmF5KClbMF07Ci0gICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHMoV19JTlQpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEludGVnZXIodGV4dCk7Ci0gICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHMoV19CT09MRUFOKSkgewotICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0ZXh0KTsKLSAgICAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFscyhXX0JZVEUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEJ5dGUodGV4dCk7Ci0gICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHMoV19ET1VCTEUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IERvdWJsZSh0ZXh0KTsKLSAgICAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFscyhXX1NIT1JUKSkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBTaG9ydCh0ZXh0KTsKLSAgICAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFscyhXX0xPTkcpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IExvbmcodGV4dCk7Ci0gICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHMoV19GTE9BVCkpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgRmxvYXQodGV4dCk7Ci0gICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHMoV19DSEFSKSkgewotICAgICAgICAgICAgcmV0dXJuIHRleHQudG9DaGFyQXJyYXkoKVswXTsKLSAgICAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFscyhXX0NBTEVOREFSKSkgewotICAgICAgICAgICAgcmV0dXJuIG1ha2VDYWxlbmRhcih0ZXh0KTsKLSAgICAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFscyhXX0RBVEUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbWFrZURhdGUodGV4dCk7Ci0gICAgICAgIH0vKgotICAgICAgICAgKiByZXR1cm4gdGhlIGNvcnJlcHNvbmRpbmcgb2JqZWN0IGZvciBhZGRpbmcgZGF0YSB0eXBlCi0gICAgICAgICAqLwotICAgICAgICBlbHNlIGlmKG5hbWUuZXF1YWxzKEJJR19ERUNJTUFMKSkgewotICAgICAgICAJcmV0dXJuIG5ldyBqYXZhLm1hdGguQmlnRGVjaW1hbCh0ZXh0KTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKG5hbWUuZXF1YWxzKEJJR19JTlRFR0VSKSkgewotICAgICAgICAJcmV0dXJuIG5ldyBqYXZhLm1hdGguQmlnSW50ZWdlcih0ZXh0KTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKG5hbWUuZXF1YWxzKERBWSkpIHsKLSAgICAgICAgCXJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5EYXkodGV4dCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZihuYW1lLmVxdWFscyhEVVJBVElPTikpIHsKLSAgICAgICAgCXJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5EdXJhdGlvbih0ZXh0KTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKG5hbWUuZXF1YWxzKE1PTlRIKSkgewotICAgICAgICAJcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLk1vbnRoKHRleHQpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYobmFtZS5lcXVhbHMoTU9OVEhfREFZKSkgewotICAgICAgICAJcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLk1vbnRoRGF5KHRleHQpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYobmFtZS5lcXVhbHMoVElNRSkpIHsKLSAgICAgICAgCXJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5UaW1lKHRleHQpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYobmFtZS5lcXVhbHMoWUVBUikpIHsKLSAgICAgICAgCXJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5ZZWFyKHRleHQpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYobmFtZS5lcXVhbHMoWUVBUl9NT05USCkpIHsKLSAgICAgICAgCXJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5ZZWFyTW9udGgodGV4dCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQXJyYXlMaXN0IGdldEFycmF5TGlzdChPTUVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIGxvY2FsTmFtZSkgewotICAgICAgICBJdGVyYXRvciBjaGlsZGl0ciA9IGVsZW1lbnQuZ2V0Q2hpbGRyZW5XaXRoTmFtZShuZXcgUU5hbWUobG9jYWxOYW1lKSk7Ci0gICAgICAgIEFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICB3aGlsZSAoY2hpbGRpdHIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBPYmplY3QgbyA9IGNoaWxkaXRyLm5leHQoKTsKLSAgICAgICAgICAgIGxpc3QuYWRkKG8pOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBsaXN0OwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgSGFzaFNldCBnZXRIYXNoU2V0KE9NRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgbG9jYWxOYW1lKSB7Ci0gICAgICAgIEl0ZXJhdG9yIGNoaWxkaXRyID0gZWxlbWVudC5nZXRDaGlsZHJlbldpdGhOYW1lKG5ldyBRTmFtZShsb2NhbE5hbWUpKTsKLSAgICAgICAgZmluYWwgSGFzaFNldCBsaXN0ID0gbmV3IEhhc2hTZXQoKTsKLSAgICAgICAgd2hpbGUgKGNoaWxkaXRyLmhhc05leHQoKSkgewotICAgICAgICAgICAgT01FbGVtZW50IG8gPSAoT01FbGVtZW50KSBjaGlsZGl0ci5uZXh0KCk7Ci0gICAgICAgICAgICBsaXN0LmFkZChvLmdldFRleHQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGxpc3Q7Ci0gICAgfQotCi0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIERhdGFIYW5kbGVyIGdldERhdGFIYW5kbGVyKE9NRWxlbWVudCBlbGVtZW50KSB7Ci0gICAgICAgIE9NTm9kZSBub2RlID0gZWxlbWVudC5nZXRGaXJzdE9NQ2hpbGQoKTsKLSAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBPTVRleHQpIHsKLSAgICAgICAgICAgIE9NVGV4dCB0eHQgPSAoT01UZXh0KW5vZGU7Ci0gICAgICAgICAgICBpZiAodHh0LmlzT3B0aW1pemVkKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKERhdGFIYW5kbGVyKXR4dC5nZXREYXRhSGFuZGxlcigpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKERhdGFIYW5kbGVyKURhdGFIYW5kbGVyVXRpbHMuZ2V0RGF0YUhhbmRsZXJGcm9tVGV4dCh0eHQuZ2V0VGV4dCgpLCBudWxsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyBzdGF0aWMgQXJyYXlMaXN0IGdldEFycmF5TGlzdChPTUVsZW1lbnQgZWxlbWVudCkgewotICAgICAgICBJdGVyYXRvciBjaGlsZGl0ciA9IGVsZW1lbnQuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgICAgQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIHdoaWxlIChjaGlsZGl0ci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIE9iamVjdCBvID0gY2hpbGRpdHIubmV4dCgpOwotICAgICAgICAgICAgbGlzdC5hZGQobyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGxpc3Q7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzU2ltcGxlVHlwZShPYmplY3Qgb2JqKSB7Ci0gICAgICAgIFN0cmluZyBvYmpDbGFzc05hbWUgPSBvYmouZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0gICAgICAgIHJldHVybiBvYmogaW5zdGFuY2VvZiBDYWxlbmRhciB8fCBvYmogaW5zdGFuY2VvZiBEYXRlIHx8IGlzU2ltcGxlVHlwZShvYmpDbGFzc05hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1NpbXBsZVR5cGUoQ2xhc3Mgb2JqKSB7Ci0gICAgICAgIFN0cmluZyBvYmpDbGFzc05hbWUgPSBvYmouZ2V0TmFtZSgpOwotICAgICAgICByZXR1cm4gaXNTaW1wbGVUeXBlKG9iakNsYXNzTmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzRGF0YUhhbmRsZXIoQ2xhc3Mgb2JqKSB7Ci0gICAgICAgcmV0dXJuIG9iai5pc0Fzc2lnbmFibGVGcm9tKERhdGFIYW5kbGVyLmNsYXNzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNIYXNoU2V0KENsYXNzIG9iaikgewotICAgICAgICByZXR1cm4gamF2YS51dGlsLkhhc2hTZXQuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShvYmopOwotICAgIH0KLQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQ29sbGVjdGlvbihDbGFzcyBvYmopIHsKLSAgICAgICAgcmV0dXJuIGphdmEudXRpbC5Db2xsZWN0aW9uLmNsYXNzLmlzQXNzaWduYWJsZUZyb20ob2JqKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTaW1wbGVUeXBlKFN0cmluZyBvYmpDbGFzc05hbWUpIHsKLSAgICAgICAgaWYgKG9iakNsYXNzTmFtZS5lcXVhbHMoU1RSSU5HKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZSBpZiAob2JqQ2xhc3NOYW1lLmVxdWFscyhJTlQpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIGlmIChvYmpDbGFzc05hbWUuZXF1YWxzKEJPT0xFQU4pKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIGlmIChvYmpDbGFzc05hbWUuZXF1YWxzKEJZVEUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIGlmIChvYmpDbGFzc05hbWUuZXF1YWxzKERPVUJMRSkpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9IGVsc2UgaWYgKG9iakNsYXNzTmFtZS5lcXVhbHMoU0hPUlQpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIGlmIChvYmpDbGFzc05hbWUuZXF1YWxzKExPTkcpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIGlmIChvYmpDbGFzc05hbWUuZXF1YWxzKEZMT0FUKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZSBpZiAob2JqQ2xhc3NOYW1lLmVxdWFscyhDSEFSKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZSBpZiAob2JqQ2xhc3NOYW1lLmVxdWFscyhXX0lOVCkpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9IGVsc2UgaWYgKG9iakNsYXNzTmFtZS5lcXVhbHMoV19CT09MRUFOKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZSBpZiAob2JqQ2xhc3NOYW1lLmVxdWFscyhXX0JZVEUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIGlmIChvYmpDbGFzc05hbWUuZXF1YWxzKFdfRE9VQkxFKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZSBpZiAob2JqQ2xhc3NOYW1lLmVxdWFscyhXX1NIT1JUKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZSBpZiAob2JqQ2xhc3NOYW1lLmVxdWFscyhXX0xPTkcpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIGlmIChvYmpDbGFzc05hbWUuZXF1YWxzKFdfRkxPQVQpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIGlmIChvYmpDbGFzc05hbWUuZXF1YWxzKFdfQ0FMRU5EQVIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIGlmIChvYmpDbGFzc05hbWUuZXF1YWxzKFdfREFURSkpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9IC8qCi0gICAgICAgICAqIGNvbnNpZGVyIEJpZ0RlY2ltYWwsIEJpZ0ludGVnZXIsIERheSwgRHVyYXRpb24sIE1vbnRoCi0gICAgICAgICAqIE1vbnRoRGF5LCBUaW1lLCBZZWFyLCBZZWFyTW9udGggYXMgc2ltcGxlIHR5cGUKLSAgICAgICAgICovCi0gICAgICAgIGVsc2UgcmV0dXJuIG9iakNsYXNzTmFtZS5lcXVhbHMoQklHX0RFQ0lNQUwpCi0gICAgICAgICAgICAgICAgICAgIHx8IG9iakNsYXNzTmFtZS5lcXVhbHMoQklHX0lOVEVHRVIpCi0gICAgICAgICAgICAgICAgICAgIHx8IG9iakNsYXNzTmFtZS5lcXVhbHMoREFZKQotICAgICAgICAgICAgICAgICAgICB8fCBvYmpDbGFzc05hbWUuZXF1YWxzKERVUkFUSU9OKQotICAgICAgICAgICAgICAgICAgICB8fCBvYmpDbGFzc05hbWUuZXF1YWxzKE1PTlRIKQotICAgICAgICAgICAgICAgICAgICB8fCBvYmpDbGFzc05hbWUuZXF1YWxzKE1PTlRIX0RBWSkKLSAgICAgICAgICAgICAgICAgICAgfHwgb2JqQ2xhc3NOYW1lLmVxdWFscyhUSU1FKQotICAgICAgICAgICAgICAgICAgICB8fCBvYmpDbGFzc05hbWUuZXF1YWxzKFlFQVIpCi0gICAgICAgICAgICAgICAgICAgIHx8IG9iakNsYXNzTmFtZS5lcXVhbHMoWUVBUl9NT05USCkgfHwgb2JqQ2xhc3NOYW1lLmVxdWFscyhXX0NIQVIpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZ1ZhbHVlKE9iamVjdCBvYmopIHsKLSAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIEZsb2F0IHx8Ci0gICAgICAgICAgICAgICAgb2JqIGluc3RhbmNlb2YgRG91YmxlKSB7Ci0gICAgICAgICAgICBkb3VibGUgZGF0YTsKLSAgICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBGbG9hdCkgewotICAgICAgICAgICAgICAgIGRhdGEgPSAoKEZsb2F0KW9iaikuZG91YmxlVmFsdWUoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZGF0YSA9IChEb3VibGUpb2JqOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKERvdWJsZS5pc05hTihkYXRhKSkgewotICAgICAgICAgICAgICAgIHJldHVybiAiTmFOIjsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZGF0YSA9PSBEb3VibGUuUE9TSVRJVkVfSU5GSU5JVFkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gIklORiI7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGRhdGEgPT0gRG91YmxlLk5FR0FUSVZFX0lORklOSVRZKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICItSU5GIjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG9iai50b1N0cmluZygpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIENhbGVuZGFyKSB7Ci0gICAgICAgICAgICBTaW1wbGVEYXRlRm9ybWF0IHp1bHUgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgieXl5eS1NTS1kZCdUJ0hIOm1tOnNzLlNTUydaJyIpOwotICAgICAgICAgICAgenVsdS5zZXRUaW1lWm9uZShUaW1lWm9uZS5nZXRUaW1lWm9uZSgiR01UIikpOwotICAgICAgICAgICAgcmV0dXJuIHp1bHUuZm9ybWF0KCgoQ2FsZW5kYXIpb2JqKS5nZXRUaW1lKCkpOwotICAgICAgICB9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIERhdGUpIHsKLSAgICAgICAgICAgIFNpbXBsZURhdGVGb3JtYXQgenVsdSA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KCJ5eXl5LU1NLWRkIik7Ci0KLSAgICAgICAgICAgIE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0ID0gTWVzc2FnZUNvbnRleHQuZ2V0Q3VycmVudE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgICAgICBBeGlzU2VydmljZSBheGlzU2VydmNlID0gbWVzc2FnZUNvbnRleHQuZ2V0QXhpc1NlcnZpY2UoKTsKLSAgICAgICAgICAgIC8vIGlmIHRoZSB1c2VyIGhhcyBnaXZlbiBhIHBpcnRpY3VhbHIgdGltZXpvbmUgd2UgdXNlIGl0LgotICAgICAgICAgICAgaWYgKGF4aXNTZXJ2Y2UuZ2V0UGFyYW1ldGVyKCJUaW1lWm9uZSIpICE9IG51bGwpewotICAgICAgICAgICAgICAgenVsdS5zZXRUaW1lWm9uZShUaW1lWm9uZS5nZXRUaW1lWm9uZSgoU3RyaW5nKWF4aXNTZXJ2Y2UuZ2V0UGFyYW1ldGVyKCJUaW1lWm9uZSIpLmdldFZhbHVlKCkpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHp1bHUuZm9ybWF0KG9iaik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG9iai50b1N0cmluZygpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IG1ha2VDYWxlbmRhcihTdHJpbmcgc291cmNlKSB7Ci0gICAgICAgIHJldHVybiBDb252ZXJ0ZXJVdGlsLmNvbnZlcnRUb0RhdGVUaW1lKHNvdXJjZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgbWFrZURhdGUoU3RyaW5nIHNvdXJjZSkgewotICAgICAgICByZXR1cm4gQ29udmVydGVyVXRpbC5jb252ZXJ0VG9EYXRlVGltZShzb3VyY2UpLmdldFRpbWUoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9EYXkuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9EYXkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzAxYTU5Yy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvRGF5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzOwotCi0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnRleHQuTnVtYmVyRm9ybWF0OwotCi0vKioKLSAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBYTUwgU2NoZW1hIHR5cGUgZ0RheQotICoKLSAqIEBzZWUgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2dEYXkiPlhNTCBTY2hlbWEgMy4yLjEzPC9hPgotICovCi1wdWJsaWMgY2xhc3MgRGF5IGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC05MDI0NjYyNTUzOTE4NTk4MTMyTDsKLQotICAgIGludCBkYXk7Ci0gICAgU3RyaW5nIHRpbWV6b25lOwotCi0gICAgLyoqIENvbnN0cnVjdHMgYSBEYXkgd2l0aCB0aGUgZ2l2ZW4gdmFsdWVzIE5vIHRpbWV6b25lIGlzIHNwZWNpZmllZCAqLwotICAgIHB1YmxpYyBEYXkoaW50IGRheSkgdGhyb3dzIE51bWJlckZvcm1hdEV4Y2VwdGlvbiB7Ci0gICAgICAgIHNldFZhbHVlKGRheSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIERheSB3aXRoIHRoZSBnaXZlbiB2YWx1ZXMsIGluY2x1ZGluZyBhIHRpbWV6b25lIHN0cmluZyBUaGUgdGltZXpvbmUgaXMgdmFsaWRhdGVkCi0gICAgICogYnV0IG5vdCB1c2VkLgotICAgICAqLwotICAgIHB1YmxpYyBEYXkoaW50IGRheSwgU3RyaW5nIHRpbWV6b25lKQotICAgICAgICAgICAgdGhyb3dzIE51bWJlckZvcm1hdEV4Y2VwdGlvbiB7Ci0gICAgICAgIHNldFZhbHVlKGRheSwgdGltZXpvbmUpOwotICAgIH0KLQotICAgIC8qKiBDb25zdHJ1Y3QgYSBEYXkgZnJvbSBhIFN0cmluZyBpbiB0aGUgZm9ybWF0IC0tLUREW3RpbWV6b25lXSAqLwotICAgIHB1YmxpYyBEYXkoU3RyaW5nIHNvdXJjZSkgdGhyb3dzIE51bWJlckZvcm1hdEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChzb3VyY2UubGVuZ3RoKCkgPCA1KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTnVtYmVyRm9ybWF0RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAvL01lc3NhZ2VzLmdldE1lc3NhZ2UoImJhZERheTAwIikpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNvdXJjZS5jaGFyQXQoMCkgIT0gJy0nIHx8Ci0gICAgICAgICAgICAgICAgc291cmNlLmNoYXJBdCgxKSAhPSAnLScgfHwKLSAgICAgICAgICAgICAgICBzb3VyY2UuY2hhckF0KDIpICE9ICctJykgewotICAgICAgICAgICAgdGhyb3cgbmV3IE51bWJlckZvcm1hdEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgLy9NZXNzYWdlcy5nZXRNZXNzYWdlKCJiYWREYXkwMCIpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHNldFZhbHVlKEludGVnZXIucGFyc2VJbnQoc291cmNlLnN1YnN0cmluZygzLCA1KSksCi0gICAgICAgICAgICAgICAgIHNvdXJjZS5zdWJzdHJpbmcoNSkpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0RGF5KCkgewotICAgICAgICByZXR1cm4gZGF5OwotICAgIH0KLQotICAgIC8qKiBTZXQgdGhlIGRheSAqLwotICAgIHB1YmxpYyB2b2lkIHNldERheShpbnQgZGF5KSB7Ci0gICAgICAgIC8vIHZhbGlkYXRlIGRheQotICAgICAgICBpZiAoZGF5IDwgMSB8fCBkYXkgPiAzMSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE51bWJlckZvcm1hdEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgLy9NZXNzYWdlcy5nZXRNZXNzYWdlKCJiYWREYXkwMCIpKTsKLSAgICAgICAgfQotICAgICAgICB0aGlzLmRheSA9IGRheTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRpbWV6b25lKCkgewotICAgICAgICByZXR1cm4gdGltZXpvbmU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VGltZXpvbmUoU3RyaW5nIHRpbWV6b25lKSB7Ci0gICAgICAgIC8vIHZhbGlkYXRlIHRpbWV6b25lCi0gICAgICAgIGlmICh0aW1lem9uZSAhPSBudWxsICYmIHRpbWV6b25lLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgLy8gRm9ybWF0IFsrLy1dSEg6TU0KLSAgICAgICAgICAgIGlmICh0aW1lem9uZS5jaGFyQXQoMCkgPT0gJysnIHx8ICh0aW1lem9uZS5jaGFyQXQoMCkgPT0gJy0nKSkgewotICAgICAgICAgICAgICAgIGlmICh0aW1lem9uZS5sZW5ndGgoKSAhPSA2IHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAhQ2hhcmFjdGVyLmlzRGlnaXQodGltZXpvbmUuY2hhckF0KDEpKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgIUNoYXJhY3Rlci5pc0RpZ2l0KHRpbWV6b25lLmNoYXJBdCgyKSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRpbWV6b25lLmNoYXJBdCgzKSAhPSAnOicgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICFDaGFyYWN0ZXIuaXNEaWdpdCh0aW1lem9uZS5jaGFyQXQoNCkpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAhQ2hhcmFjdGVyLmlzRGlnaXQodGltZXpvbmUuY2hhckF0KDUpKSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE51bWJlckZvcm1hdEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgICAgIC8vIE1lc3NhZ2VzLmdldE1lc3NhZ2UoImJhZFRpbWV6b25lMDAiKSk7Ci0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIXRpbWV6b25lLmVxdWFscygiWiIpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE51bWJlckZvcm1hdEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgICAgIC8vIE1lc3NhZ2VzLmdldE1lc3NhZ2UoImJhZFRpbWV6b25lMDAiKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBpZiB3ZSBnb3QgdGhpcyBmYXIsIGl0cyBnb29kCi0gICAgICAgICAgICB0aGlzLnRpbWV6b25lID0gdGltZXpvbmU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShpbnQgZGF5LCBTdHJpbmcgdGltZXpvbmUpCi0gICAgICAgICAgICB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIHsKLSAgICAgICAgc2V0RGF5KGRheSk7Ci0gICAgICAgIHNldFRpbWV6b25lKHRpbWV6b25lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShpbnQgZGF5KSB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIHsKLSAgICAgICAgc2V0RGF5KGRheSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgLy8gdXNlIE51bWJlckZvcm1hdCB0byBlbnN1cmUgbGVhZGluZyB6ZXJvcwotICAgICAgICBOdW1iZXJGb3JtYXQgbmYgPSBOdW1iZXJGb3JtYXQuZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgbmYuc2V0R3JvdXBpbmdVc2VkKGZhbHNlKTsKLQotICAgICAgICAvLyBEYXkKLSAgICAgICAgbmYuc2V0TWluaW11bUludGVnZXJEaWdpdHMoMik7Ci0gICAgICAgIFN0cmluZyBzID0gIi0tLSIgKyBuZi5mb3JtYXQoZGF5KTsKLQotICAgICAgICAvLyB0aW1lem9uZQotICAgICAgICBpZiAodGltZXpvbmUgIT0gbnVsbCkgewotICAgICAgICAgICAgcyA9IHMgKyB0aW1lem9uZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBEYXkpKSByZXR1cm4gZmFsc2U7Ci0gICAgICAgIERheSBvdGhlciA9IChEYXkpb2JqOwotICAgICAgICBpZiAodGhpcyA9PSBvYmopIHJldHVybiB0cnVlOwotCi0gICAgICAgIGJvb2xlYW4gZXF1YWxzID0gKHRoaXMuZGF5ID09IG90aGVyLmRheSk7Ci0gICAgICAgIGlmICh0aW1lem9uZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBlcXVhbHMgPSBlcXVhbHMgJiYgdGltZXpvbmUuZXF1YWxzKG90aGVyLnRpbWV6b25lKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZXF1YWxzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgdmFsdWUgb2YgZGF5IFhPUmVkIHdpdGggdGhlIGhhc2hDb2RlIG9mIHRpbWV6b25lIGlmZiBvbmUgaXMgZGVmaW5lZC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYW4gPGNvZGU+aW50PC9jb2RlPiB2YWx1ZQotICAgICAqLwotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgIHJldHVybiBudWxsID09IHRpbWV6b25lID8gZGF5IDogZGF5IF4gdGltZXpvbmUuaGFzaENvZGUoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvRHVyYXRpb24uamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9EdXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTllMTYyLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9EdXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDc4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlczsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKLQotLyoqCi0gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgWE1MIFNjaGVtYSB0eXBlIGR1cmF0aW9uLiBEdXJhdGlvbiBzdXBwb3J0cyBhIG1pbmltdW0gZnJhY3Rpb25hbCBzZWNvbmQKLSAqIHByZWNpc2lvbiBvZiBtaWxsaXNlY29uZHMuCi0gKgotICogQHNlZSA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZHVyYXRpb24iPlhNTCBTY2hlbWEgMy4yLjY8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBEdXJhdGlvbiBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMzczNjc2MDk5MjU0MTM2OTA5OEw7Ci0KLSAgICBib29sZWFuIGlzTmVnYXRpdmU7Ci0gICAgaW50IHllYXJzOwotICAgIGludCBtb250aHM7Ci0gICAgaW50IGRheXM7Ci0gICAgaW50IGhvdXJzOwotICAgIGludCBtaW51dGVzOwotICAgIGRvdWJsZSBzZWNvbmRzOwotCi0gICAgLyoqIERlZmF1bHQgbm8tYXJnIGNvbnN0cnVjdG9yICovCi0gICAgcHVibGljIER1cmF0aW9uKCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBuZWdhdGl2ZQotICAgICAqIEBwYXJhbSBhWWVhcnMKLSAgICAgKiBAcGFyYW0gYU1vbnRocwotICAgICAqIEBwYXJhbSBhRGF5cwotICAgICAqIEBwYXJhbSBhSG91cnMKLSAgICAgKiBAcGFyYW0gYU1pbnV0ZXMKLSAgICAgKiBAcGFyYW0gYVNlY29uZHMKLSAgICAgKi8KLSAgICBwdWJsaWMgRHVyYXRpb24oYm9vbGVhbiBuZWdhdGl2ZSwgaW50IGFZZWFycywgaW50IGFNb250aHMsIGludCBhRGF5cywKLSAgICAgICAgICAgICAgICAgICAgaW50IGFIb3VycywgaW50IGFNaW51dGVzLCBkb3VibGUgYVNlY29uZHMpIHsKLSAgICAgICAgaXNOZWdhdGl2ZSA9IG5lZ2F0aXZlOwotICAgICAgICB5ZWFycyA9IGFZZWFyczsKLSAgICAgICAgbW9udGhzID0gYU1vbnRoczsKLSAgICAgICAgZGF5cyA9IGFEYXlzOwotICAgICAgICBob3VycyA9IGFIb3VyczsKLSAgICAgICAgbWludXRlcyA9IGFNaW51dGVzOwotICAgICAgICBzZXRTZWNvbmRzKGFTZWNvbmRzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIER1cmF0aW9uIGZyb20gYSBTdHJpbmcgaW4gYW4geHNkOmR1cmF0aW9uIGZvcm1hdCAtIFBuWW5NbkRUbkhuTW5TLgotICAgICAqCi0gICAgICogQHBhcmFtIGR1cmF0aW9uIFN0cmluZwotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBzdHJpbmcgZG9lc24ndCBwYXJzZSBjb3JyZWN0bHkuCi0gICAgICovCi0gICAgcHVibGljIER1cmF0aW9uKFN0cmluZyBkdXJhdGlvbikgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIGludCBwb3NpdGlvbiA9IDE7Ci0gICAgICAgIGludCB0aW1lUG9zaXRpb24gPSBkdXJhdGlvbi5pbmRleE9mKCJUIik7Ci0KLSAgICAgICAgLy8gUCBpcyByZXF1aXJlZCBidXQgUCBieSBpdHNlbGYgaXMgaW52YWxpZAotICAgICAgICBpZiAoZHVyYXRpb24uaW5kZXhPZigiUCIpID09IC0xIHx8IGR1cmF0aW9uLmVxdWFscygiUCIpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAvLyBNZXNzYWdlcy5nZXRNZXNzYWdlKCJiYWREdXJhdGlvbiIpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGlmIHByZXNlbnQsIHRpbWUgY2Fubm90IGJlIGVtcHR5Ci0gICAgICAgIGlmIChkdXJhdGlvbi5sYXN0SW5kZXhPZigiVCIpID09IGR1cmF0aW9uLmxlbmd0aCgpIC0gMSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotLy8gICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoImJhZER1cmF0aW9uIikpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY2hlY2sgdGhlIHNpZ24KLSAgICAgICAgaWYgKGR1cmF0aW9uLnN0YXJ0c1dpdGgoIi0iKSkgewotICAgICAgICAgICAgaXNOZWdhdGl2ZSA9IHRydWU7Ci0gICAgICAgICAgICBwb3NpdGlvbisrOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gcGFyc2UgdGltZSBwYXJ0Ci0gICAgICAgIGlmICh0aW1lUG9zaXRpb24gIT0gLTEpIHsKLSAgICAgICAgICAgIHBhcnNlVGltZShkdXJhdGlvbi5zdWJzdHJpbmcodGltZVBvc2l0aW9uICsgMSkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGltZVBvc2l0aW9uID0gZHVyYXRpb24ubGVuZ3RoKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBwYXJzZSBkYXRlIHBhcnQKLSAgICAgICAgaWYgKHBvc2l0aW9uICE9IHRpbWVQb3NpdGlvbikgewotICAgICAgICAgICAgcGFyc2VEYXRlKGR1cmF0aW9uLnN1YnN0cmluZyhwb3NpdGlvbiwgdGltZVBvc2l0aW9uKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIER1cmF0aW9uIGZyb20gYSBDYWxlbmRhci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjYWxlbmRhciBDYWxlbmRhcgotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBjYWxlbmRhciBvYmplY3QgZG9lcyBub3QgcmVwcmVzZW50IGFueSBkYXRlIG5vcgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUuCi0gICAgICovCi0gICAgcHVibGljIER1cmF0aW9uKGJvb2xlYW4gbmVnYXRpdmUsIENhbGVuZGFyIGNhbGVuZGFyKSB0aHJvd3MKLSAgICAgICAgICAgIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMuaXNOZWdhdGl2ZSA9IG5lZ2F0aXZlOwotICAgICAgICB0aGlzLnllYXJzID0gY2FsZW5kYXIuZ2V0KENhbGVuZGFyLllFQVIpOwotICAgICAgICB0aGlzLm1vbnRocyA9IGNhbGVuZGFyLmdldChDYWxlbmRhci5NT05USCk7Ci0gICAgICAgIHRoaXMuZGF5cyA9IGNhbGVuZGFyLmdldChDYWxlbmRhci5EQVRFKTsKLSAgICAgICAgdGhpcy5ob3VycyA9IGNhbGVuZGFyLmdldChDYWxlbmRhci5IT1VSKTsKLSAgICAgICAgdGhpcy5taW51dGVzID0gY2FsZW5kYXIuZ2V0KENhbGVuZGFyLk1JTlVURSk7Ci0gICAgICAgIHRoaXMuc2Vjb25kcyA9IGNhbGVuZGFyLmdldChDYWxlbmRhci5TRUNPTkQpOwotICAgICAgICB0aGlzLnNlY29uZHMgKz0gKChkb3VibGUpY2FsZW5kYXIuZ2V0KENhbGVuZGFyLk1JTExJU0VDT05EKSkgLyAxMDA7Ci0gICAgICAgIGlmICh5ZWFycyA9PSAwICYmIG1vbnRocyA9PSAwICYmIGRheXMgPT0gMCAmJiBob3VycyA9PSAwICYmCi0gICAgICAgICAgICAgICAgbWludXRlcyA9PSAwICYmIHNlY29uZHMgPT0gMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgLy9NZXNzYWdlcy5nZXRNZXNzYWdlKCJiYWRDYWxlbmRhckZvckR1cmF0aW9uIikpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgcGFyc2VzIHRoZSB0aW1lIHBvcnRpb24gb2YgYSBTdHJpbmcgdGhhdCByZXByZXNlbnRzIHhzZDpkdXJhdGlvbiAtIG5Ibk1uUy4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0aW1lCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGltZSBkb2VzIG5vdCBtYXRjaCBwYXR0ZXJuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcGFyc2VUaW1lKFN0cmluZyB0aW1lKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHRpbWUubGVuZ3RoKCkgPT0gMCB8fCB0aW1lLmluZGV4T2YoIi0iKSAhPSAtMSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgLy9NZXNzYWdlcy5nZXRNZXNzYWdlKCJiYWRUaW1lRHVyYXRpb24iKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjaGVjayBpZiB0aW1lIGVuZHMgd2l0aCBlaXRoZXIgSCwgTSwgb3IgUwotICAgICAgICBpZiAoIXRpbWUuZW5kc1dpdGgoIkgiKSAmJiAhdGltZS5lbmRzV2l0aCgiTSIpICYmICF0aW1lLmVuZHNXaXRoKCJTIikpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIC8vTWVzc2FnZXMuZ2V0TWVzc2FnZSgiYmFkVGltZUR1cmF0aW9uIikpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIHBhcnNlIHN0cmluZyBhbmQgZXh0cmFjdCBob3VycywgbWludXRlcywgYW5kIHNlY29uZHMKLSAgICAgICAgICAgIGludCBzdGFydCA9IDA7Ci0KLSAgICAgICAgICAgIC8vIEhvdXJzCi0gICAgICAgICAgICBpbnQgZW5kID0gdGltZS5pbmRleE9mKCJIIik7Ci0gICAgICAgICAgICAvLyBpZiB0aGVyZSBpcyBIIGluIGEgc3RyaW5nIGJ1dCB0aGVyZSBpcyBubyB2YWx1ZSBmb3IgaG91cnMsCi0gICAgICAgICAgICAvLyB0aHJvdyBhbiBleGNlcHRpb24KLSAgICAgICAgICAgIGlmIChzdGFydCA9PSBlbmQpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgLy9NZXNzYWdlcy5nZXRNZXNzYWdlKCJiYWRUaW1lRHVyYXRpb24iKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZW5kICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgaG91cnMgPSBJbnRlZ2VyLnBhcnNlSW50KHRpbWUuc3Vic3RyaW5nKDAsIGVuZCkpOwotICAgICAgICAgICAgICAgIHN0YXJ0ID0gZW5kICsgMTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gTWludXRlcwotICAgICAgICAgICAgZW5kID0gdGltZS5pbmRleE9mKCJNIik7Ci0gICAgICAgICAgICAvLyBpZiB0aGVyZSBpcyBNIGluIGEgc3RyaW5nIGJ1dCB0aGVyZSBpcyBubyB2YWx1ZSBmb3IgaG91cnMsCi0gICAgICAgICAgICAvLyB0aHJvdyBhbiBleGNlcHRpb24KLSAgICAgICAgICAgIGlmIChzdGFydCA9PSBlbmQpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoImJhZFRpbWVEdXJhdGlvbiIpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGVuZCAhPSAtMSkgewotICAgICAgICAgICAgICAgIG1pbnV0ZXMgPSBJbnRlZ2VyLnBhcnNlSW50KHRpbWUuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpKTsKLSAgICAgICAgICAgICAgICBzdGFydCA9IGVuZCArIDE7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFNlY29uZHMKLSAgICAgICAgICAgIGVuZCA9IHRpbWUuaW5kZXhPZigiUyIpOwotICAgICAgICAgICAgLy8gaWYgdGhlcmUgaXMgUyBpbiBhIHN0cmluZyBidXQgdGhlcmUgaXMgbm8gdmFsdWUgZm9yIGhvdXJzLAotICAgICAgICAgICAgLy8gdGhyb3cgYW4gZXhjZXB0aW9uCi0gICAgICAgICAgICBpZiAoc3RhcnQgPT0gZW5kKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgICAgIC8vTWVzc2FnZXMuZ2V0TWVzc2FnZSgiYmFkVGltZUR1cmF0aW9uIikpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoZW5kICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgc2V0U2Vjb25kcyhEb3VibGUucGFyc2VEb3VibGUodGltZS5zdWJzdHJpbmcoc3RhcnQsIGVuZCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIC8vTWVzc2FnZXMuZ2V0TWVzc2FnZSgiYmFkVGltZUR1cmF0aW9uIikpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgcGFyc2VzIHRoZSBkYXRlIHBvcnRpb24gb2YgYSBTdHJpbmcgdGhhdCByZXByZXNlbnRzIHhzZDpkdXJhdGlvbiAtIG5Zbk1uRC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBkYXRlCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgZGF0ZSBkb2VzIG5vdCBtYXRjaCBwYXR0ZXJuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcGFyc2VEYXRlKFN0cmluZyBkYXRlKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGRhdGUubGVuZ3RoKCkgPT0gMCB8fCBkYXRlLmluZGV4T2YoIi0iKSAhPSAtMSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgLy9NZXNzYWdlcy5nZXRNZXNzYWdlKCJiYWREYXRlRHVyYXRpb24iKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjaGVjayBpZiBkYXRlIHN0cmluZyBlbmRzIHdpdGggZWl0aGVyIFksIE0sIG9yIEQKLSAgICAgICAgaWYgKCFkYXRlLmVuZHNXaXRoKCJZIikgJiYgIWRhdGUuZW5kc1dpdGgoIk0iKSAmJiAhZGF0ZS5lbmRzV2l0aCgiRCIpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAvL01lc3NhZ2VzLmdldE1lc3NhZ2UoImJhZERhdGVEdXJhdGlvbiIpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNhdGNoIGFueSBwYXJzaW5nIGV4Y2VwdGlvbgotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gcGFyc2Ugc3RyaW5nIGFuZCBleHRyYWN0IHllYXJzLCBtb250aHMsIGRheXMKLSAgICAgICAgICAgIGludCBzdGFydCA9IDA7Ci0gICAgICAgICAgICBpbnQgZW5kID0gZGF0ZS5pbmRleE9mKCJZIik7Ci0KLSAgICAgICAgICAgIC8vIGlmIHRoZXJlIGlzIFkgaW4gYSBzdHJpbmcgYnV0IHRoZXJlIGlzIG5vIHZhbHVlIGZvciB5ZWFycywKLSAgICAgICAgICAgIC8vIHRocm93IGFuIGV4Y2VwdGlvbgotICAgICAgICAgICAgaWYgKHN0YXJ0ID09IGVuZCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICAvLyBNZXNzYWdlcy5nZXRNZXNzYWdlKCJiYWREYXRlRHVyYXRpb24iKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZW5kICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgeWVhcnMgPSBJbnRlZ2VyLnBhcnNlSW50KGRhdGUuc3Vic3RyaW5nKDAsIGVuZCkpOwotICAgICAgICAgICAgICAgIHN0YXJ0ID0gZW5kICsgMTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gbW9udGhzCi0gICAgICAgICAgICBlbmQgPSBkYXRlLmluZGV4T2YoIk0iKTsKLSAgICAgICAgICAgIC8vIGlmIHRoZXJlIGlzIE0gaW4gYSBzdHJpbmcgYnV0IHRoZXJlIGlzIG5vIHZhbHVlIGZvciBtb250aHMsCi0gICAgICAgICAgICAvLyB0aHJvdyBhbiBleGNlcHRpb24KLSAgICAgICAgICAgIGlmIChzdGFydCA9PSBlbmQpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgLy9NZXNzYWdlcy5nZXRNZXNzYWdlKCJiYWREYXRlRHVyYXRpb24iKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZW5kICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgbW9udGhzID0gSW50ZWdlci5wYXJzZUludChkYXRlLnN1YnN0cmluZyhzdGFydCwgZW5kKSk7Ci0gICAgICAgICAgICAgICAgc3RhcnQgPSBlbmQgKyAxOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBlbmQgPSBkYXRlLmluZGV4T2YoIkQiKTsKLSAgICAgICAgICAgIC8vIGlmIHRoZXJlIGlzIEQgaW4gYSBzdHJpbmcgYnV0IHRoZXJlIGlzIG5vIHZhbHVlIGZvciBkYXlzLAotICAgICAgICAgICAgLy8gdGhyb3cgYW4gZXhjZXB0aW9uCi0gICAgICAgICAgICBpZiAoc3RhcnQgPT0gZW5kKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgICAgIC8vIE1lc3NhZ2VzLmdldE1lc3NhZ2UoImJhZERhdGVEdXJhdGlvbiIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChlbmQgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICBkYXlzID0gSW50ZWdlci5wYXJzZUludChkYXRlLnN1YnN0cmluZyhzdGFydCwgZW5kKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAvL01lc3NhZ2VzLmdldE1lc3NhZ2UoImJhZERhdGVEdXJhdGlvbiIpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNOZWdhdGl2ZSgpIHsKLSAgICAgICAgcmV0dXJuIGlzTmVnYXRpdmU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFllYXJzKCkgewotICAgICAgICByZXR1cm4geWVhcnM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldE1vbnRocygpIHsKLSAgICAgICAgcmV0dXJuIG1vbnRoczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0RGF5cygpIHsKLSAgICAgICAgcmV0dXJuIGRheXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldEhvdXJzKCkgewotICAgICAgICByZXR1cm4gaG91cnM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldE1pbnV0ZXMoKSB7Ci0gICAgICAgIHJldHVybiBtaW51dGVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqCi0gICAgICovCi0gICAgcHVibGljIGRvdWJsZSBnZXRTZWNvbmRzKCkgewotICAgICAgICByZXR1cm4gc2Vjb25kczsKLSAgICB9Ci0KLSAgICAvKiogQHBhcmFtIG5lZ2F0aXZlICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE5lZ2F0aXZlKGJvb2xlYW4gbmVnYXRpdmUpIHsKLSAgICAgICAgaXNOZWdhdGl2ZSA9IG5lZ2F0aXZlOwotICAgIH0KLQotICAgIC8qKiBAcGFyYW0geWVhcnMgICovCi0gICAgcHVibGljIHZvaWQgc2V0WWVhcnMoaW50IHllYXJzKSB7Ci0gICAgICAgIHRoaXMueWVhcnMgPSB5ZWFyczsKLSAgICB9Ci0KLSAgICAvKiogQHBhcmFtIG1vbnRocyAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRNb250aHMoaW50IG1vbnRocykgewotICAgICAgICB0aGlzLm1vbnRocyA9IG1vbnRoczsKLSAgICB9Ci0KLSAgICAvKiogQHBhcmFtIGRheXMgICovCi0gICAgcHVibGljIHZvaWQgc2V0RGF5cyhpbnQgZGF5cykgewotICAgICAgICB0aGlzLmRheXMgPSBkYXlzOwotICAgIH0KLQotICAgIC8qKiBAcGFyYW0gaG91cnMgICovCi0gICAgcHVibGljIHZvaWQgc2V0SG91cnMoaW50IGhvdXJzKSB7Ci0gICAgICAgIHRoaXMuaG91cnMgPSBob3VyczsKLSAgICB9Ci0KLSAgICAvKiogQHBhcmFtIG1pbnV0ZXMgICovCi0gICAgcHVibGljIHZvaWQgc2V0TWludXRlcyhpbnQgbWludXRlcykgewotICAgICAgICB0aGlzLm1pbnV0ZXMgPSBtaW51dGVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBzZWNvbmRzCi0gICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAjc2V0U2Vjb25kcyhkb3VibGUpIHNldFNlY29uZHMoZG91YmxlKX0gaW5zdGVhZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNlY29uZHMoaW50IHNlY29uZHMpIHsKLSAgICAgICAgdGhpcy5zZWNvbmRzID0gc2Vjb25kczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBzZWNvbmRzLiBOT1RFOiBUaGUgZnJhY3Rpb25hbCB2YWx1ZSBvZiBzZWNvbmRzIGlzIHJvdW5kZWQgdXAgdG8gbWlsbGlzZWNvbmRzLgotICAgICAqCi0gICAgICogQHBhcmFtIHNlY29uZHMgZG91YmxlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U2Vjb25kcyhkb3VibGUgc2Vjb25kcykgewotICAgICAgICB0aGlzLnNlY29uZHMgPSAoKGRvdWJsZSkoTWF0aC5yb3VuZChzZWNvbmRzICogMTAwKSkpIC8gMTAwOwotICAgIH0KLQotICAgIC8qKiBUaGlzIHJldHVybnMgdGhlIHhtbCByZXByZXNlbnRhdGlvbiBvZiBhbiB4c2Q6ZHVyYXRpb24gb2JqZWN0LiAqLwotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBkdXJhdGlvbiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotICAgICAgICBkdXJhdGlvbi5hcHBlbmQoIlAiKTsKLQotICAgICAgICBpZiAoeWVhcnMgIT0gMCkgewotICAgICAgICAgICAgZHVyYXRpb24uYXBwZW5kKHllYXJzKS5hcHBlbmQoIlkiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobW9udGhzICE9IDApIHsKLSAgICAgICAgICAgIGR1cmF0aW9uLmFwcGVuZChtb250aHMpLmFwcGVuZCgiTSIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChkYXlzICE9IDApIHsKLSAgICAgICAgICAgIGR1cmF0aW9uLmFwcGVuZChkYXlzKS5hcHBlbmQoIkQiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaG91cnMgIT0gMCB8fCBtaW51dGVzICE9IDAgfHwgc2Vjb25kcyAhPSAwLjApIHsKLSAgICAgICAgICAgIGR1cmF0aW9uLmFwcGVuZCgiVCIpOwotCi0gICAgICAgICAgICBpZiAoaG91cnMgIT0gMCkgewotICAgICAgICAgICAgICAgIGR1cmF0aW9uLmFwcGVuZChob3VycykuYXBwZW5kKCJIIik7Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtaW51dGVzICE9IDApIHsKLSAgICAgICAgICAgICAgICBkdXJhdGlvbi5hcHBlbmQobWludXRlcykuYXBwZW5kKCJNIik7Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzZWNvbmRzICE9IDApIHsKLSAgICAgICAgICAgICAgICBpZiAoc2Vjb25kcyA9PSAoaW50KXNlY29uZHMpIHsKLSAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24uYXBwZW5kKChpbnQpc2Vjb25kcykuYXBwZW5kKCJTIik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24uYXBwZW5kKHNlY29uZHMpLmFwcGVuZCgiUyIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChkdXJhdGlvbi5sZW5ndGgoKSA9PSAxKSB7Ci0gICAgICAgICAgICBkdXJhdGlvbi5hcHBlbmQoIlQwUyIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGlzTmVnYXRpdmUpIHsKLSAgICAgICAgICAgIGR1cmF0aW9uLmluc2VydCgwLCAiLSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGR1cmF0aW9uLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIGVxdWFscyBtZXRob2QgY29tcGFyZXMgdGhlIHRpbWUgcmVwcmVzZW50ZWQgYnkgZHVyYXRpb24gb2JqZWN0LCBub3QgaXRzIHN0cmluZwotICAgICAqIHJlcHJlc2VudGF0aW9uLiBIZW5jZSwgYSBkdXJhdGlvbiBvYmplY3QgcmVwcmVzZW50aW5nIDY1IG1pbnV0ZXMgaXMgY29uc2lkZXJlZCBlcXVhbCB0byBhCi0gICAgICogZHVyYXRpb24gb2JqZWN0IHJlcHJlc2VudGluZyAxIGhvdXIgYW5kIDUgbWludXRlcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvYmplY3QKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iamVjdCkgewotICAgICAgICBpZiAoIShvYmplY3QgaW5zdGFuY2VvZiBEdXJhdGlvbikpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIER1cmF0aW9uIGR1cmF0aW9uID0gKER1cmF0aW9uKW9iamVjdDsKLQotICAgICAgICByZXR1cm4gdGhpcy5pc05lZ2F0aXZlID09IGR1cmF0aW9uLmlzTmVnYXRpdmUgJiYKLSAgICAgICAgICAgICAgICB0aGlzLmdldEFzQ2FsZW5kYXIoKS5lcXVhbHMoZHVyYXRpb24uZ2V0QXNDYWxlbmRhcigpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgbG9uZyBjb21wYXJlKER1cmF0aW9uIGR1cmF0aW9uKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmdldEFzQ2FsZW5kYXIoKS5nZXRUaW1lSW5NaWxsaXMoKSAtIGR1cmF0aW9uLmdldEFzQ2FsZW5kYXIoKS5nZXRUaW1lSW5NaWxsaXMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICBpbnQgaGFzaENvZGUgPSAwOwotCi0gICAgICAgIGlmIChpc05lZ2F0aXZlKSB7Ci0gICAgICAgICAgICBoYXNoQ29kZSsrOwotICAgICAgICB9Ci0gICAgICAgIGhhc2hDb2RlICs9IHllYXJzOwotICAgICAgICBoYXNoQ29kZSArPSBtb250aHM7Ci0gICAgICAgIGhhc2hDb2RlICs9IGRheXM7Ci0gICAgICAgIGhhc2hDb2RlICs9IGhvdXJzOwotICAgICAgICBoYXNoQ29kZSArPSBtaW51dGVzOwotICAgICAgICBoYXNoQ29kZSArPSBzZWNvbmRzOwotICAgICAgICAvLyBtaWxsaXNlY29uZHMKLSAgICAgICAgaGFzaENvZGUgKz0gKHNlY29uZHMgKiAxMDApICUgMTAwOwotCi0gICAgICAgIHJldHVybiBoYXNoQ29kZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGR1cmF0aW9uIGFzIGEgY2FsZW5kYXIuICBEdWUgdG8gdGhlIHdheSBhIENhbGVuZGFyIGNsYXNzIHdvcmtzLCB0aGUgdmFsdWVzIGZvcgotICAgICAqIHBhcnRpY3VsYXIgZmllbGRzIG1heSBub3QgYmUgdGhlIHNhbWUgYXMgb2J0YWluZWQgdGhyb3VnaCBnZXR0ZXIgbWV0aG9kcy4gIEZvciBleGFtcGxlLCBpZiBhCi0gICAgICogZHVyYXRpb24ncyBvYmplY3QgZ2V0TW9udGhzIHJldHVybnMgMjAsIGEgc2ltaWxhciBjYWxsIG9uIGEgY2FsZW5kYXIgb2JqZWN0IHdpbGwgcmV0dXJuIDEKLSAgICAgKiB5ZWFyIGFuZCA4IG1vbnRocy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gQ2FsZW5kYXIKLSAgICAgKi8KLSAgICBwdWJsaWMgQ2FsZW5kYXIgZ2V0QXNDYWxlbmRhcigpIHsKLSAgICAgICAgcmV0dXJuIGdldEFzQ2FsZW5kYXIoQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBkdXJhdGlvbiBhcyBhIGNhbGVuZGFyLiAgRHVlIHRvIHRoZSB3YXkgYSBDYWxlbmRhciBjbGFzcyB3b3JrcywgdGhlIHZhbHVlcyBmb3IKLSAgICAgKiBwYXJ0aWN1bGFyIGZpZWxkcyBtYXkgbm90IGJlIHRoZSBzYW1lIGFzIG9idGFpbmVkIHRocm91Z2ggZ2V0dGVyIG1ldGhvZHMuICBGb3IgZXhhbXBsZSwgaWYgYQotICAgICAqIER1cmF0aW9uJ3Mgb2JqZWN0IGdldE1vbnRocyByZXR1cm5zIDIwLCBhIHNpbWlsYXIgY2FsbCBvbiBhIENhbGVuZGFyIG9iamVjdCB3aWxsIHJldHVybiAxCi0gICAgICogeWVhciBhbmQgOCBtb250aHMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3RhcnRUaW1lIENhbGVuZGFyCi0gICAgICogQHJldHVybiBDYWxlbmRhcgotICAgICAqLwotICAgIHB1YmxpYyBDYWxlbmRhciBnZXRBc0NhbGVuZGFyKENhbGVuZGFyIHN0YXJ0VGltZSkgewotICAgICAgICBDYWxlbmRhciByZXQgPSAoQ2FsZW5kYXIpc3RhcnRUaW1lLmNsb25lKCk7Ci0gICAgICAgIHJldC5zZXQoQ2FsZW5kYXIuWUVBUiwgeWVhcnMpOwotICAgICAgICByZXQuc2V0KENhbGVuZGFyLk1PTlRILCBtb250aHMpOwotICAgICAgICByZXQuc2V0KENhbGVuZGFyLkRBVEUsIGRheXMpOwotICAgICAgICByZXQuc2V0KENhbGVuZGFyLkhPVVIsIGhvdXJzKTsKLSAgICAgICAgcmV0LnNldChDYWxlbmRhci5NSU5VVEUsIG1pbnV0ZXMpOwotICAgICAgICByZXQuc2V0KENhbGVuZGFyLlNFQ09ORCwgKGludClzZWNvbmRzKTsKLSAgICAgICAgcmV0LnNldChDYWxlbmRhci5NSUxMSVNFQ09ORCwKLSAgICAgICAgICAgICAgICAoaW50KShzZWNvbmRzICogMTAwIC0gTWF0aC5yb3VuZChzZWNvbmRzKSAqIDEwMCkpOwotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9FbnRpdGllcy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL0VudGl0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmODE4OWYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL0VudGl0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi0vKioKLSAqIEN1c3RvbSBjbGFzcyBmb3Igc3VwcG9ydGluZyBYU0QgZGF0YSB0eXBlIEVudGl0aWVzCi0gKgotICogQHNlZSA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jRU5USVRJRVMiPlhNTCBTY2hlbWEgMy4zLjEyIEVOVElUSUVTPC9hPgotICovCi1wdWJsaWMgY2xhc3MgRW50aXRpZXMgZXh0ZW5kcyBOQ05hbWUgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTQ1MTEzNjgxOTUxNDM1NjA4MDlMOwotCi0gICAgcHJpdmF0ZSBFbnRpdHlbXSBlbnRpdGllczsKLQotICAgIHB1YmxpYyBFbnRpdGllcygpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBjdG9yIGZvciBFbnRpdGllcwotICAgICAqCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gd2lsbCBiZSB0aHJvd24gaWYgdmFsaWRhdGlvbiBmYWlscwotICAgICAqLwotICAgIHB1YmxpYyBFbnRpdGllcyhTdHJpbmcgc3RWYWx1ZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHN0VmFsdWUpOwotICAgICAgICBpbnQgY291bnQgPSB0b2tlbml6ZXIuY291bnRUb2tlbnMoKTsKLSAgICAgICAgZW50aXRpZXMgPSBuZXcgRW50aXR5W2NvdW50XTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBlbnRpdGllc1tpXSA9IG5ldyBFbnRpdHkodG9rZW5pemVyLm5leHRUb2tlbigpKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9FbnRpdHkuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9FbnRpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2I3YjQ1Ni4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvRW50aXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXM7Ci0KLQotLyoqCi0gKiBDdXN0b20gY2xhc3MgZm9yIHN1cHBvcnRpbmcgWFNEIGRhdGEgdHlwZSBFbnRpdHkKLSAqCi0gKiBAc2VlIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNFTlRJVFkiPlhNTCBTY2hlbWEgMy4zLjExIEVOVElUWTwvYT4KLSAqLwotcHVibGljIGNsYXNzIEVudGl0eSBleHRlbmRzIE5DTmFtZSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNDg2ODQxMDg4Mzg1Njk2MTk0Mkw7Ci0KLSAgICBwdWJsaWMgRW50aXR5KCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGN0b3IgZm9yIEVudGl0eQotICAgICAqCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gd2lsbCBiZSB0aHJvd24gaWYgdmFsaWRhdGlvbiBmYWlscwotICAgICAqLwotICAgIHB1YmxpYyBFbnRpdHkoU3RyaW5nIHN0VmFsdWUpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotICAgICAgICBzdXBlcihzdFZhbHVlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvSGV4QmluYXJ5LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvSGV4QmluYXJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjZmM2ZTUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL0hleEJpbmFyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcyA7Ci0KLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotCi0vKiogQ3VzdG9tIGNsYXNzIGZvciBzdXBwb3J0aW5nIHByaW1pdGl2ZSBYU0QgZGF0YSB0eXBlIGhleEJpbmFyeS4gKi8KLXB1YmxpYyBjbGFzcyBIZXhCaW5hcnkgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTUwODI0MDM4OTk5ODY3MjA3NjdMOwotCi0gICAgYnl0ZVtdIG1fdmFsdWU7Ci0KLSAgICBwdWJsaWMgSGV4QmluYXJ5KCkgewotICAgIH0KLQotICAgIHB1YmxpYyBIZXhCaW5hcnkoU3RyaW5nIHN0cmluZykgewotICAgICAgICBtX3ZhbHVlID0gZGVjb2RlKHN0cmluZyk7Ci0gICAgfQotCi0gICAgcHVibGljIEhleEJpbmFyeShieXRlW10gYnl0ZXMpIHsKLSAgICAgICAgbV92YWx1ZSA9IGJ5dGVzOwotICAgIH0KLQotICAgIHB1YmxpYyBieXRlW10gZ2V0Qnl0ZXMoKSB7Ci0gICAgICAgIHJldHVybiBtX3ZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiBlbmNvZGUobV92YWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICAgICAgLy9UT0RPOiBIb3cgZG8gd2UgaGFzaCB0aGlzPwotICAgICAgICByZXR1cm4gc3VwZXIuaGFzaENvZGUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iamVjdCkgewotICAgICAgICAvL1RPRE86IElzIHRoaXMgZ29vZCBlbm91Z2g/Ci0gICAgICAgIFN0cmluZyBzMSA9IG9iamVjdC50b1N0cmluZygpOwotICAgICAgICBTdHJpbmcgczIgPSB0aGlzLnRvU3RyaW5nKCk7Ci0gICAgICAgIHJldHVybiBzMS5lcXVhbHMoczIpOwotICAgIH0KLQotICAgIC8vIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX09ERF9OVU1CRVJfT0ZfRElHSVRTID0KLSAgICAvL01lc3NhZ2VzLmdldE1lc3NhZ2UoIm9kZERpZ2l0czAwIik7Ci0gICAgLy9wdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9CQURfQ0hBUkFDVEVSX0lOX0hFWF9TVFJJTkcgPQotICAgIC8vICAgICAgICBNZXNzYWdlcy5nZXRNZXNzYWdlKCJiYWRDaGFyczAxIik7Ci0KLSAgICAvLyBDb2RlIGZyb20gQWpwMTEsIGZyb20gQXBhY2hlJ3MgSlNlcnYKLQotICAgIC8vIFRhYmxlIGZvciBIRVggdG8gREVDIGJ5dGUgdHJhbnNsYXRpb24KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIERFQyA9IHsKLSAgICAgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAotICAgICAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCi0gICAgICAgICAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKLSAgICAgICAgICAgIDAwLCAwMSwgMDIsIDAzLCAwNCwgMDUsIDA2LCAwNywgOCwgOSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKLSAgICAgICAgICAgIC0xLCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAotICAgICAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCi0gICAgICAgICAgICAtMSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKLSAgICAgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAotICAgICAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCi0gICAgICAgICAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKLSAgICAgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAotICAgICAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCi0gICAgICAgICAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKLSAgICAgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAotICAgICAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCi0gICAgICAgICAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKLSAgICB9OwotCi0gICAgLyoqCi0gICAgICogQ29udmVydCBhIFN0cmluZyBvZiBoZXhhZGVjaW1hbCBkaWdpdHMgaW50byB0aGUgY29ycmVzcG9uZGluZyBieXRlIGFycmF5IGJ5IGVuY29kaW5nIGVhY2ggdHdvCi0gICAgICogaGV4YWRlY2ltYWwgZGlnaXRzIGFzIGEgYnl0ZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBkaWdpdHMgSGV4YWRlY2ltYWwgZGlnaXRzIHJlcHJlc2VudGF0aW9uCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgYW4gaW52YWxpZCBoZXhhZGVjaW1hbCBkaWdpdCBpcyBmb3VuZCwgb3IgdGhlIGlucHV0Ci0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGNvbnRhaW5zIGFuIG9kZCBudW1iZXIgb2YgaGV4YWRlY2ltYWwgZGlnaXRzCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBieXRlW10gZGVjb2RlKFN0cmluZyBkaWdpdHMpIHsKLQotICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkaWdpdHMubGVuZ3RoKCk7IGkgKz0gMikgewotICAgICAgICAgICAgY2hhciBjMSA9IGRpZ2l0cy5jaGFyQXQoaSk7Ci0gICAgICAgICAgICBpZiAoKGkgKyAxKSA+PSBkaWdpdHMubGVuZ3RoKCkpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgKCk7Ly9FUlJPUl9PRERfTlVNQkVSX09GX0RJR0lUUyk7Ci0gICAgICAgICAgICBjaGFyIGMyID0gZGlnaXRzLmNoYXJBdChpICsgMSk7Ci0gICAgICAgICAgICBieXRlIGIgPSAwOwotICAgICAgICAgICAgaWYgKChjMSA+PSAnMCcpICYmIChjMSA8PSAnOScpKQotICAgICAgICAgICAgICAgIGIgKz0gKChjMSAtICcwJykgKiAxNik7Ci0gICAgICAgICAgICBlbHNlIGlmICgoYzEgPj0gJ2EnKSAmJiAoYzEgPD0gJ2YnKSkKLSAgICAgICAgICAgICAgICBiICs9ICgoYzEgLSAnYScgKyAxMCkgKiAxNik7Ci0gICAgICAgICAgICBlbHNlIGlmICgoYzEgPj0gJ0EnKSAmJiAoYzEgPD0gJ0YnKSkKLSAgICAgICAgICAgICAgICBiICs9ICgoYzEgLSAnQScgKyAxMCkgKiAxNik7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgKCk7Ly9FUlJPUl9CQURfQ0hBUkFDVEVSX0lOX0hFWF9TVFJJTkcpOwotICAgICAgICAgICAgaWYgKChjMiA+PSAnMCcpICYmIChjMiA8PSAnOScpKQotICAgICAgICAgICAgICAgIGIgKz0gKGMyIC0gJzAnKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKChjMiA+PSAnYScpICYmIChjMiA8PSAnZicpKQotICAgICAgICAgICAgICAgIGIgKz0gKGMyIC0gJ2EnICsgMTApOwotICAgICAgICAgICAgZWxzZSBpZiAoKGMyID49ICdBJykgJiYgKGMyIDw9ICdGJykpCi0gICAgICAgICAgICAgICAgYiArPSAoYzIgLSAnQScgKyAxMCk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgKCk7Ly9FUlJPUl9CQURfQ0hBUkFDVEVSX0lOX0hFWF9TVFJJTkcpOwotICAgICAgICAgICAgYmFvcy53cml0ZShiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKGJhb3MudG9CeXRlQXJyYXkoKSk7Ci0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnQgYSBieXRlIGFycmF5IGludG8gYSBwcmludGFibGUgZm9ybWF0IGNvbnRhaW5pbmcgYSBTdHJpbmcgb2YgaGV4YWRlY2ltYWwgZGlnaXQKLSAgICAgKiBjaGFyYWN0ZXJzICh0d28gcGVyIGJ5dGUpLgotICAgICAqCi0gICAgICogQHBhcmFtIGJ5dGVzIEJ5dGUgYXJyYXkgcmVwcmVzZW50YXRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBlbmNvZGUoYnl0ZSBieXRlc1tdKSB7Ci0KLSAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcihieXRlcy5sZW5ndGggKiAyKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgc2IuYXBwZW5kKGNvbnZlcnREaWdpdChieXRlc1tpXSA+PiA0KSk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoY29udmVydERpZ2l0KGJ5dGVzW2ldICYgMHgwZikpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAoc2IudG9TdHJpbmcoKSk7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0IDQgaGV4IGRpZ2l0cyB0byBhbiBpbnQsIGFuZCByZXR1cm4gdGhlIG51bWJlciBvZiBjb252ZXJ0ZWQgYnl0ZXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaGV4IEJ5dGUgYXJyYXkgY29udGFpbmluZyBleGFjdGx5IGZvdXIgaGV4YWRlY2ltYWwgZGlnaXRzCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgYW4gaW52YWxpZCBoZXhhZGVjaW1hbCBkaWdpdCBpcyBpbmNsdWRlZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgaW50IGNvbnZlcnQySW50KGJ5dGVbXSBoZXgpIHsKLSAgICAgICAgLy8gQ29kZSBmcm9tIEFqcDExLCBmcm9tIEFwYWNoZSdzIEpTZXJ2Ci0KLSAgICAgICAgLy8gYXNzZXJ0IGIubGVuZ3RoPT00Ci0gICAgICAgIC8vIGFzc2VydCB2YWxpZCBkYXRhCi0gICAgICAgIGludCBsZW47Ci0gICAgICAgIGlmIChoZXgubGVuZ3RoIDwgNCkgcmV0dXJuIDA7Ci0gICAgICAgIGlmIChERUNbaGV4WzBdXSA8IDApCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ly9FUlJPUl9CQURfQ0hBUkFDVEVSX0lOX0hFWF9TVFJJTkcpOwotICAgICAgICBsZW4gPSBERUNbaGV4WzBdXTsKLSAgICAgICAgbGVuID0gbGVuIDw8IDQ7Ci0gICAgICAgIGlmIChERUNbaGV4WzFdXSA8IDApCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ly9FUlJPUl9CQURfQ0hBUkFDVEVSX0lOX0hFWF9TVFJJTkcpOwotICAgICAgICBsZW4gKz0gREVDW2hleFsxXV07Ci0gICAgICAgIGxlbiA9IGxlbiA8PCA0OwotICAgICAgICBpZiAoREVDW2hleFsyXV0gPCAwKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOy8vRVJST1JfQkFEX0NIQVJBQ1RFUl9JTl9IRVhfU1RSSU5HKTsKLSAgICAgICAgbGVuICs9IERFQ1toZXhbMl1dOwotICAgICAgICBsZW4gPSBsZW4gPDwgNDsKLSAgICAgICAgaWYgKERFQ1toZXhbM11dIDwgMCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsvL0VSUk9SX0JBRF9DSEFSQUNURVJfSU5fSEVYX1NUUklORyk7Ci0gICAgICAgIGxlbiArPSBERUNbaGV4WzNdXTsKLSAgICAgICAgcmV0dXJuIGxlbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBbUHJpdmF0ZV0gQ29udmVydCB0aGUgc3BlY2lmaWVkIHZhbHVlICgwIC4uIDE1KSB0byB0aGUgY29ycmVzcG9uZGluZyBoZXhhZGVjaW1hbCBkaWdpdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSBWYWx1ZSB0byBiZSBjb252ZXJ0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBjaGFyIGNvbnZlcnREaWdpdChpbnQgdmFsdWUpIHsKLQotICAgICAgICB2YWx1ZSAmPSAweDBmOwotICAgICAgICBpZiAodmFsdWUgPj0gMTApCi0gICAgICAgICAgICByZXR1cm4gKChjaGFyKSh2YWx1ZSAtIDEwICsgJ2EnKSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiAoKGNoYXIpKHZhbHVlICsgJzAnKSk7Ci0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvSURSZWYuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9JRFJlZi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWM1YjY5Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9JRFJlZi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzOwotCi0KLS8qKgotICogQ3VzdG9tIGNsYXNzIGZvciBzdXBwb3J0aW5nIFhTRCBkYXRhIHR5cGUgSURSZWYKLSAqCi0gKiBAc2VlIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNJRFJFRiI+WE1MIFNjaGVtYSAzLjMuMTAgSURSRUZTPC9hPgotICovCi1wdWJsaWMgY2xhc3MgSURSZWYgZXh0ZW5kcyBOQ05hbWUgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNjgyMTgzNTA2NTkzOTg2ODU3Nkw7Ci0KLSAgICBwdWJsaWMgSURSZWYoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogY3RvciBmb3IgSURSZWYKLSAgICAgKgotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duIGlmIHZhbGlkYXRpb24gZmFpbHMKLSAgICAgKi8KLSAgICBwdWJsaWMgSURSZWYoU3RyaW5nIHN0VmFsdWUpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotICAgICAgICBzdXBlcihzdFZhbHVlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvSURSZWZzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvSURSZWZzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyODZjMWYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL0lEUmVmcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi0vKioKLSAqIEN1c3RvbSBjbGFzcyBmb3Igc3VwcG9ydGluZyBYU0QgZGF0YSB0eXBlIElEUmVmcwotICoKLSAqIEBzZWUgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI0lEUkVGUyI+WE1MIFNjaGVtYSAzLjMuMTAgSURSRUZTPC9hPgotICovCi1wdWJsaWMgY2xhc3MgSURSZWZzIGV4dGVuZHMgTkNOYW1lIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDUzOTQwOTc3OTgzNjEwNzU5MDJMOwotCi0gICAgcHJpdmF0ZSBJRFJlZltdIGlkcmVmczsKLQotICAgIHB1YmxpYyBJRFJlZnMoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogY3RvciBmb3IgSURSZWZzCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB3aWxsIGJlIHRocm93biBpZiB2YWxpZGF0aW9uIGZhaWxzCi0gICAgICovCi0gICAgcHVibGljIElEUmVmcyhTdHJpbmcgc3RWYWx1ZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIHNldFZhbHVlKHN0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBzdFZhbHVlKSB7Ci0gICAgICAgIFN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHN0VmFsdWUpOwotICAgICAgICBpbnQgY291bnQgPSB0b2tlbml6ZXIuY291bnRUb2tlbnMoKTsKLSAgICAgICAgaWRyZWZzID0gbmV3IElEUmVmW2NvdW50XTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBpZHJlZnNbaV0gPSBuZXcgSURSZWYodG9rZW5pemVyLm5leHRUb2tlbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaWRyZWZzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBJRFJlZiByZWYgPSBpZHJlZnNbaV07Ci0gICAgICAgICAgICBpZiAoaSA+IDApIGJ1Zi5hcHBlbmQoIiAiKTsKLSAgICAgICAgICAgIGJ1Zi5hcHBlbmQocmVmLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJRFJFRnMgY2FuIGJlIGVxdWFsIHdpdGhvdXQgaGF2aW5nIGlkZW50aWNhbCBvcmRlcmluZyBiZWNhdXNlIHRoZXkgcmVwcmVzZW50IGEgc2V0IG9mCi0gICAgICogcmVmZXJlbmNlcy4gIEhlbmNlIHdlIGhhdmUgdG8gY29tcGFyZSB2YWx1ZXMgaGVyZSBhcyBhIHNldCwgbm90IGEgbGlzdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvYmplY3QgYW4gPGNvZGU+T2JqZWN0PC9jb2RlPiB2YWx1ZQotICAgICAqIEByZXR1cm4gYSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqZWN0KSB7Ci0gICAgICAgIGlmIChvYmplY3QgPT0gdGhpcykgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7ICAgICAgICAvLyBzdWNjZWVkIHF1aWNrbHksIHdoZW4gcG9zc2libGUKLSAgICAgICAgfQotICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgSURSZWZzKSB7Ci0gICAgICAgICAgICBJRFJlZnMgdGhhdCA9IChJRFJlZnMpb2JqZWN0OwotICAgICAgICAgICAgaWYgKHRoaXMuaWRyZWZzLmxlbmd0aCA9PSB0aGF0LmlkcmVmcy5sZW5ndGgpIHsKLSAgICAgICAgICAgICAgICBTZXQgb3VyU2V0ID0gbmV3IEhhc2hTZXQoQXJyYXlzLmFzTGlzdCh0aGlzLmlkcmVmcykpOwotICAgICAgICAgICAgICAgIFNldCB0aGVpclNldCA9IG5ldyBIYXNoU2V0KEFycmF5cy5hc0xpc3QodGhhdC5pZHJlZnMpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gb3VyU2V0LmVxdWFscyh0aGVpclNldCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHN1bSBvZiB0aGUgaGFzaGNvZGVzIG9mIHRoZSB1bmRlcmx5aW5nIGlkcmVmcywgYW4gb3BlcmF0aW9uIHdoaWNoIGlzIG5vdAotICAgICAqIHNlbnNpdGl2ZSB0byBvcmRlcmluZy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYW4gPGNvZGU+aW50PC9jb2RlPiB2YWx1ZQotICAgICAqLwotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgIGludCBoYXNoID0gMDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpZHJlZnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGhhc2ggKz0gaWRyZWZzW2ldLmhhc2hDb2RlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGhhc2g7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL0lkLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvSWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTJhYzNlOC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvSWQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlczsKLQotCi0vKioKLSAqIEN1c3RvbSBjbGFzcyBmb3Igc3VwcG9ydGluZyBYU0QgZGF0YSB0eXBlIElEIFRoZSBiYXNlIHR5cGUgb2YgSWQgaXMgTkNOYW1lLgotICoKLSAqIEBzZWUgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI0lEIj5YTUwgU2NoZW1hIDMuMy44PC9hPgotICovCi1wdWJsaWMgY2xhc3MgSWQgZXh0ZW5kcyBOQ05hbWUgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTg0NDI0MzgwODMyMTQyMTE0MzdMOwotCi0gICAgcHVibGljIElkKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIGZvciBJZC4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duIGlmIHZhbGlkYXRpb24gZmFpbHMKLSAgICAgKi8KLSAgICBwdWJsaWMgSWQoU3RyaW5nIHN0VmFsdWUpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgc2V0VmFsdWUoc3RWYWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyByZWNhc3Qgbm9ybWFsaXplZFN0cmluZyBleGNlcHRpb24gYXMgdG9rZW4gZXhjZXB0aW9uCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAvL01lc3NhZ2VzLmdldE1lc3NhZ2UoImJhZElkVHlwZTAwIikgKyAiZGF0YT1bIiArCi0gICAgICAgICAgICAvL3N0VmFsdWUgKyAiXSIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVmFsaWRhdGVzIHRoZSBkYXRhIGFuZCBzZXRzIHRoZSB2YWx1ZSBmb3IgdGhlIG9iamVjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzdFZhbHVlIFN0cmluZyB2YWx1ZQotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGludmFsaWQgZm9ybWF0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHN0VmFsdWUpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotICAgICAgICBpZiAoIUlkLmlzVmFsaWQoc3RWYWx1ZSkpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAvLyBNZXNzYWdlcy5nZXRNZXNzYWdlKCJiYWRJZFR5cGUwMCIpICsKLSAgICAgICAgICAgICAgICAgICAgIiBkYXRhPVsiICsgc3RWYWx1ZSArICJdIik7Ci0gICAgICAgIG1fdmFsdWUgPSBzdFZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFZhbGlkYXRlcyB0aGUgdmFsdWUgYWdhaW5zdCB0aGUgeHNkIGRlZmluaXRpb24uCi0gICAgICogPHAvPgotICAgICAqIFNhbWUgdmFsaWRhdGlvbiBhcyBOQ05hbWUgZm9yIHRoZSB0aW1lIGJlaW5nCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWQoU3RyaW5nIHN0VmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIE5DTmFtZS5pc1ZhbGlkKHN0VmFsdWUpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9MYW5ndWFnZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL0xhbmd1YWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyZmIxYjIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL0xhbmd1YWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXM7Ci0KLQotLyoqCi0gKiBDdXN0b20gY2xhc3MgZm9yIHN1cHBvcnRpbmcgWFNEIGRhdGEgdHlwZSBsYW5ndWFnZSBsYW5ndWFnZSByZXByZXNlbnRzIG5hdHVyYWwgbGFuZ3VhZ2UKLSAqIGlkZW50aWZpZXJzIGFzIGRlZmluZWQgYnkgW1JGQyAxNzY2XS4gVGhlIHZhbHVlIHNwYWNlIG9mIGxhbmd1YWdlIGlzIHRoZSBzZXQgb2YgYWxsIHN0cmluZ3MgdGhhdAotICogYXJlIHZhbGlkIGxhbmd1YWdlIGlkZW50aWZpZXJzIGFzIGRlZmluZWQgaW4gdGhlIGxhbmd1YWdlIGlkZW50aWZpY2F0aW9uIHNlY3Rpb24gb2YgW1hNTCAxLjAKLSAqIChTZWNvbmQgRWRpdGlvbildLiBUaGUgbGV4aWNhbCBzcGFjZSBvZiBsYW5ndWFnZSBpcyB0aGUgc2V0IG9mIGFsbCBzdHJpbmdzIHRoYXQgYXJlIHZhbGlkCi0gKiBsYW5ndWFnZSBpZGVudGlmaWVycyBhcyBkZWZpbmVkIGluIHRoZSBsYW5ndWFnZSBpZGVudGlmaWNhdGlvbiBzZWN0aW9uIG9mIFtYTUwgMS4wIChTZWNvbmQKLSAqIEVkaXRpb24pXS4gVGhlIGJhc2UgdHlwZSBvZiBsYW5ndWFnZSBpcyB0b2tlbi4KLSAqCi0gKiBAc2VlIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNsYW5ndWFnZSI+WE1MIFNjaGVtYSAzLjMuMzwvYT4KLSAqLwotcHVibGljIGNsYXNzIExhbmd1YWdlIGV4dGVuZHMgVG9rZW4gewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTQxMDUzMjAyOTMwOTAwODc5NTlMOwotCi0gICAgcHVibGljIExhbmd1YWdlKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGN0b3IgZm9yIExhbmd1YWdlCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB3aWxsIGJlIHRocm93biBpZiB2YWxpZGF0aW9uIGZhaWxzCi0gICAgICovCi0gICAgcHVibGljIExhbmd1YWdlKFN0cmluZyBzdFZhbHVlKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNldFZhbHVlKHN0VmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gcmVjYXN0IG5vcm1hbGl6ZWRTdHJpbmcgZXhjZXB0aW9uIGFzIHRva2VuIGV4Y2VwdGlvbgotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLS8vICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoImJhZExhbmd1YWdlMDAiKSArCi0iZGF0YT1bIiArIHN0VmFsdWUgKyAiXSIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVmFsaWRhdGVzIHRoZSB2YWx1ZSBhZ2FpbnN0IHRoZSB4c2QgZGVmaW5pdGlvbi4gTGFuZ3VhZ2UtVGFnID0gUHJpbWFyeS10YWcgKiggIi0iIFN1YnRhZyApCi0gICAgICogUHJpbWFyeS10YWcgPSAxKjhBTFBIQSBTdWJ0YWcgPSAxKjhBTFBIQSBUT0RPCi0gICAgICoKLSAgICAgKiBAc2VlIDxhIGhyZWY9Imh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzE3NjYudHh0Ij5SRkMxNzY2PC9hPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkKFN0cmluZyBzdFZhbHVlKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9Nb250aC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL01vbnRoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5ZDQ4YjcuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL01vbnRoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzOwotCi0KLWltcG9ydCBqYXZhLnRleHQuTnVtYmVyRm9ybWF0OwotCi0vKioKLSAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBYTUwgU2NoZW1hIHR5cGUgZ01vbnRoCi0gKgotICogQHNlZSA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZ01vbnRoIj5YTUwgU2NoZW1hIDMuMi4xNDwvYT4KLSAqLwotcHVibGljIGNsYXNzIE1vbnRoIGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTc0NjkyNjU4MDI4MDcyNjIzNDdMOwotCi0gICAgaW50IG1vbnRoOwotICAgIFN0cmluZyB0aW1lem9uZTsKLQotICAgIC8qKiBDb25zdHJ1Y3RzIGEgTW9udGggd2l0aCB0aGUgZ2l2ZW4gdmFsdWVzIE5vIHRpbWV6b25lIGlzIHNwZWNpZmllZCAqLwotICAgIHB1YmxpYyBNb250aChpbnQgbW9udGgpIHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24gewotICAgICAgICBzZXRWYWx1ZShtb250aCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIE1vbnRoIHdpdGggdGhlIGdpdmVuIHZhbHVlcywgaW5jbHVkaW5nIGEgdGltZXpvbmUgc3RyaW5nIFRoZSB0aW1lem9uZSBpcwotICAgICAqIHZhbGlkYXRlZCBidXQgbm90IHVzZWQuCi0gICAgICovCi0gICAgcHVibGljIE1vbnRoKGludCBtb250aCwgU3RyaW5nIHRpbWV6b25lKQotICAgICAgICAgICAgdGhyb3dzIE51bWJlckZvcm1hdEV4Y2VwdGlvbiB7Ci0gICAgICAgIHNldFZhbHVlKG1vbnRoLCB0aW1lem9uZSk7Ci0gICAgfQotCi0gICAgLyoqIENvbnN0cnVjdCBhIE1vbnRoIGZyb20gYSBTdHJpbmcgaW4gdGhlIGZvcm1hdCAtLU1NLS1bdGltZXpvbmVdICovCi0gICAgcHVibGljIE1vbnRoKFN0cmluZyBzb3VyY2UpIHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24gewotICAgICAgICBpZiAoc291cmNlLmxlbmd0aCgpIDwgKDYpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTnVtYmVyRm9ybWF0RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAvLyBNZXNzYWdlcy5nZXRNZXNzYWdlKCJiYWRNb250aDAwIikpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNvdXJjZS5jaGFyQXQoMCkgIT0gJy0nIHx8Ci0gICAgICAgICAgICAgICAgc291cmNlLmNoYXJBdCgxKSAhPSAnLScgfHwKLSAgICAgICAgICAgICAgICBzb3VyY2UuY2hhckF0KDQpICE9ICctJyB8fAotICAgICAgICAgICAgICAgIHNvdXJjZS5jaGFyQXQoNSkgIT0gJy0nKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTnVtYmVyRm9ybWF0RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAvL01lc3NhZ2VzLmdldE1lc3NhZ2UoImJhZE1vbnRoMDAiKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBzZXRWYWx1ZShJbnRlZ2VyLnBhcnNlSW50KHNvdXJjZS5zdWJzdHJpbmcoMiwgNCkpLAotICAgICAgICAgICAgICAgICBzb3VyY2Uuc3Vic3RyaW5nKDYpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldE1vbnRoKCkgewotICAgICAgICByZXR1cm4gbW9udGg7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TW9udGgoaW50IG1vbnRoKSB7Ci0gICAgICAgIC8vIHZhbGlkYXRlIG1vbnRoCi0gICAgICAgIGlmIChtb250aCA8IDEgfHwgbW9udGggPiAxMikgewotICAgICAgICAgICAgdGhyb3cgbmV3IE51bWJlckZvcm1hdEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgLy8gTWVzc2FnZXMuZ2V0TWVzc2FnZSgiYmFkTW9udGgwMCIpKTsKLSAgICAgICAgfQotICAgICAgICB0aGlzLm1vbnRoID0gbW9udGg7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRUaW1lem9uZSgpIHsKLSAgICAgICAgcmV0dXJuIHRpbWV6b25lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFRpbWV6b25lKFN0cmluZyB0aW1lem9uZSkgewotICAgICAgICAvLyB2YWxpZGF0ZSB0aW1lem9uZQotICAgICAgICBpZiAodGltZXpvbmUgIT0gbnVsbCAmJiB0aW1lem9uZS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIC8vIEZvcm1hdCBbKy8tXUhIOk1NCi0gICAgICAgICAgICBpZiAodGltZXpvbmUuY2hhckF0KDApID09ICcrJyB8fCAodGltZXpvbmUuY2hhckF0KDApID09ICctJykpIHsKLSAgICAgICAgICAgICAgICBpZiAodGltZXpvbmUubGVuZ3RoKCkgIT0gNiB8fAotICAgICAgICAgICAgICAgICAgICAgICAgIUNoYXJhY3Rlci5pc0RpZ2l0KHRpbWV6b25lLmNoYXJBdCgxKSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICFDaGFyYWN0ZXIuaXNEaWdpdCh0aW1lem9uZS5jaGFyQXQoMikpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aW1lem9uZS5jaGFyQXQoMykgIT0gJzonIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAhQ2hhcmFjdGVyLmlzRGlnaXQodGltZXpvbmUuY2hhckF0KDQpKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgIUNoYXJhY3Rlci5pc0RpZ2l0KHRpbWV6b25lLmNoYXJBdCg1KSkpCi0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBOdW1iZXJGb3JtYXRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICAvL01lc3NhZ2VzLmdldE1lc3NhZ2UoImJhZFRpbWV6b25lMDAiKSk7Ci0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIXRpbWV6b25lLmVxdWFscygiWiIpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE51bWJlckZvcm1hdEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgICAgIC8vTWVzc2FnZXMuZ2V0TWVzc2FnZSgiYmFkVGltZXpvbmUwMCIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIGlmIHdlIGdvdCB0aGlzIGZhciwgaXRzIGdvb2QKLSAgICAgICAgICAgIHRoaXMudGltZXpvbmUgPSB0aW1lem9uZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKGludCBtb250aCwgU3RyaW5nIHRpbWV6b25lKSB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIHsKLSAgICAgICAgc2V0TW9udGgobW9udGgpOwotICAgICAgICBzZXRUaW1lem9uZSh0aW1lem9uZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWUoaW50IG1vbnRoKSB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIHsKLSAgICAgICAgc2V0TW9udGgobW9udGgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIC8vIHVzZSBOdW1iZXJGb3JtYXQgdG8gZW5zdXJlIGxlYWRpbmcgemVyb3MKLSAgICAgICAgTnVtYmVyRm9ybWF0IG5mID0gTnVtYmVyRm9ybWF0LmdldEluc3RhbmNlKCk7Ci0gICAgICAgIG5mLnNldEdyb3VwaW5nVXNlZChmYWxzZSk7Ci0KLSAgICAgICAgLy8gbW9udGgKLSAgICAgICAgbmYuc2V0TWluaW11bUludGVnZXJEaWdpdHMoMik7Ci0gICAgICAgIFN0cmluZyBzID0gIi0tIiArIG5mLmZvcm1hdChtb250aCkgKyAiLS0iOwotCi0gICAgICAgIC8vIHRpbWV6b25lCi0gICAgICAgIGlmICh0aW1lem9uZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzID0gcyArIHRpbWV6b25lOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0gICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIE1vbnRoKSkgcmV0dXJuIGZhbHNlOwotICAgICAgICBNb250aCBvdGhlciA9IChNb250aClvYmo7Ci0gICAgICAgIGlmICh0aGlzID09IG9iaikgcmV0dXJuIHRydWU7Ci0KLSAgICAgICAgYm9vbGVhbiBlcXVhbHMgPSAodGhpcy5tb250aCA9PSBvdGhlci5tb250aCk7Ci0gICAgICAgIGlmICh0aW1lem9uZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBlcXVhbHMgPSBlcXVhbHMgJiYgdGltZXpvbmUuZXF1YWxzKG90aGVyLnRpbWV6b25lKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZXF1YWxzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgdmFsdWUgb2YgbW9udGggWE9SZWQgd2l0aCB0aGUgaGFzaENvZGUgb2YgdGltZXpvbmUgaWZmIG9uZSBpcyBkZWZpbmVkLgotICAgICAqCi0gICAgICogQHJldHVybiBhbiA8Y29kZT5pbnQ8L2NvZGU+IHZhbHVlCi0gICAgICovCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICAgICAgcmV0dXJuIG51bGwgPT0gdGltZXpvbmUgPyBtb250aCA6IG1vbnRoIF4gdGltZXpvbmUuaGFzaENvZGUoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvTW9udGhEYXkuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9Nb250aERheS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjVkOWI5Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9Nb250aERheS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlczsKLQotCi1pbXBvcnQgamF2YS50ZXh0Lk51bWJlckZvcm1hdDsKLQotLyoqCi0gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgWE1MIFNjaGVtYSB0eXBlIGdNb250aERheQotICoKLSAqIEBzZWUgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2dNb250aERheSI+WE1MIFNjaGVtYSAzLjIuMTI8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBNb250aERheSBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0zNDUxODk2MDk4MjUyNDkzMThMOwotCi0gICAgaW50IG1vbnRoOwotICAgIGludCBkYXk7Ci0gICAgU3RyaW5nIHRpbWV6b25lOwotCi0gICAgLyoqIENvbnN0cnVjdHMgYSBNb250aERheSB3aXRoIHRoZSBnaXZlbiB2YWx1ZXMgTm8gdGltZXpvbmUgaXMgc3BlY2lmaWVkICovCi0gICAgcHVibGljIE1vbnRoRGF5KGludCBtb250aCwgaW50IGRheSkKLSAgICAgICAgICAgIHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24gewotICAgICAgICBzZXRWYWx1ZShtb250aCwgZGF5KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgTW9udGhEYXkgd2l0aCB0aGUgZ2l2ZW4gdmFsdWVzLCBpbmNsdWRpbmcgYSB0aW1lem9uZSBzdHJpbmcgVGhlIHRpbWV6b25lIGlzCi0gICAgICogdmFsaWRhdGVkIGJ1dCBub3QgdXNlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgTW9udGhEYXkoaW50IG1vbnRoLCBpbnQgZGF5LCBTdHJpbmcgdGltZXpvbmUpCi0gICAgICAgICAgICB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIHsKLSAgICAgICAgc2V0VmFsdWUobW9udGgsIGRheSwgdGltZXpvbmUpOwotICAgIH0KLQotICAgIC8qKiBDb25zdHJ1Y3QgYSBNb250aERheSBmcm9tIGEgU3RyaW5nIGluIHRoZSBmb3JtYXQgLS1NTS1ERFt0aW1lem9uZV0gKi8KLSAgICBwdWJsaWMgTW9udGhEYXkoU3RyaW5nIHNvdXJjZSkgdGhyb3dzIE51bWJlckZvcm1hdEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChzb3VyY2UubGVuZ3RoKCkgPCA2KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTnVtYmVyRm9ybWF0RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAvL01lc3NhZ2VzLmdldE1lc3NhZ2UoImJhZE1vbnRoRGF5MDAiKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc291cmNlLmNoYXJBdCgwKSAhPSAnLScgfHwKLSAgICAgICAgICAgICAgICBzb3VyY2UuY2hhckF0KDEpICE9ICctJyB8fAotICAgICAgICAgICAgICAgIHNvdXJjZS5jaGFyQXQoNCkgIT0gJy0nKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTnVtYmVyRm9ybWF0RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAvL01lc3NhZ2VzLmdldE1lc3NhZ2UoImJhZE1vbnRoRGF5MDAiKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBzZXRWYWx1ZShJbnRlZ2VyLnBhcnNlSW50KHNvdXJjZS5zdWJzdHJpbmcoMiwgNCkpLAotICAgICAgICAgICAgICAgICBJbnRlZ2VyLnBhcnNlSW50KHNvdXJjZS5zdWJzdHJpbmcoNSwgNykpLAotICAgICAgICAgICAgICAgICBzb3VyY2Uuc3Vic3RyaW5nKDcpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldE1vbnRoKCkgewotICAgICAgICByZXR1cm4gbW9udGg7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TW9udGgoaW50IG1vbnRoKSB7Ci0gICAgICAgIC8vIHZhbGlkYXRlIG1vbnRoCi0gICAgICAgIGlmIChtb250aCA8IDEgfHwgbW9udGggPiAxMikgewotICAgICAgICAgICAgdGhyb3cgbmV3IE51bWJlckZvcm1hdEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgLy9NZXNzYWdlcy5nZXRNZXNzYWdlKCJiYWRNb250aERheTAwIikpOwotICAgICAgICB9Ci0gICAgICAgIHRoaXMubW9udGggPSBtb250aDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldERheSgpIHsKLSAgICAgICAgcmV0dXJuIGRheTsKLSAgICB9Ci0KLSAgICAvKiogU2V0IHRoZSBkYXkgTk9URTogaWYgdGhlIG1vbnRoIGlzbid0IHNldCB5ZXQsIHRoZSBkYXkgaXNuJ3QgdmFsaWRhdGVkICovCi0gICAgcHVibGljIHZvaWQgc2V0RGF5KGludCBkYXkpIHsKLSAgICAgICAgLy8gdmFsaWRhdGUgZGF5Ci0gICAgICAgIGlmIChkYXkgPCAxIHx8IGRheSA+IDMxKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTnVtYmVyRm9ybWF0RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAvL01lc3NhZ2VzLmdldE1lc3NhZ2UoImJhZE1vbnRoRGF5MDAiKSk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gMzAgZGF5cyBoYXMgU2VwdGVtYmVyLi4uIEFsbCB0aGUgcmVzdCBoYXZlIDMxIChleGNlcHQgRmViISkKLSAgICAgICAgLy8gTk9URTogaWYgbW9udGggaXNuJ3Qgc2V0LCB3ZSBkb24ndCB2YWxpZGF0ZSBkYXkuCi0gICAgICAgIGlmICgobW9udGggPT0gMiAmJiBkYXkgPiAyOSkgfHwKLSAgICAgICAgICAgICAgICAoKG1vbnRoID09IDkgfHwgbW9udGggPT0gNCB8fCBtb250aCA9PSA2IHx8IG1vbnRoID09IDExKSAmJiBkYXkgPiAzMCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBOdW1iZXJGb3JtYXRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIC8vIE1lc3NhZ2VzLmdldE1lc3NhZ2UoImJhZE1vbnRoRGF5MDAiKSk7Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy5kYXkgPSBkYXk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRUaW1lem9uZSgpIHsKLSAgICAgICAgcmV0dXJuIHRpbWV6b25lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFRpbWV6b25lKFN0cmluZyB0aW1lem9uZSkgewotICAgICAgICAvLyB2YWxpZGF0ZSB0aW1lem9uZQotICAgICAgICBpZiAodGltZXpvbmUgIT0gbnVsbCAmJiB0aW1lem9uZS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIC8vIEZvcm1hdCBbKy8tXUhIOk1NCi0gICAgICAgICAgICBpZiAodGltZXpvbmUuY2hhckF0KDApID09ICcrJyB8fCAodGltZXpvbmUuY2hhckF0KDApID09ICctJykpIHsKLSAgICAgICAgICAgICAgICBpZiAodGltZXpvbmUubGVuZ3RoKCkgIT0gNiB8fAotICAgICAgICAgICAgICAgICAgICAgICAgIUNoYXJhY3Rlci5pc0RpZ2l0KHRpbWV6b25lLmNoYXJBdCgxKSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICFDaGFyYWN0ZXIuaXNEaWdpdCh0aW1lem9uZS5jaGFyQXQoMikpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aW1lem9uZS5jaGFyQXQoMykgIT0gJzonIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAhQ2hhcmFjdGVyLmlzRGlnaXQodGltZXpvbmUuY2hhckF0KDQpKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgIUNoYXJhY3Rlci5pc0RpZ2l0KHRpbWV6b25lLmNoYXJBdCg1KSkpCi0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBOdW1iZXJGb3JtYXRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICAvLyBNZXNzYWdlcy5nZXRNZXNzYWdlKCJiYWRUaW1lem9uZTAwIikpOwotCi0gICAgICAgICAgICB9IGVsc2UgaWYgKCF0aW1lem9uZS5lcXVhbHMoIloiKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBOdW1iZXJGb3JtYXRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICAvL01lc3NhZ2VzLmdldE1lc3NhZ2UoImJhZFRpbWV6b25lMDAiKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBpZiB3ZSBnb3QgdGhpcyBmYXIsIGl0cyBnb29kCi0gICAgICAgICAgICB0aGlzLnRpbWV6b25lID0gdGltZXpvbmU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShpbnQgbW9udGgsIGludCBkYXksIFN0cmluZyB0aW1lem9uZSkKLSAgICAgICAgICAgIHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24gewotICAgICAgICBzZXRNb250aChtb250aCk7Ci0gICAgICAgIHNldERheShkYXkpOwotICAgICAgICBzZXRUaW1lem9uZSh0aW1lem9uZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWUoaW50IG1vbnRoLCBpbnQgZGF5KSB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIHsKLSAgICAgICAgc2V0TW9udGgobW9udGgpOwotICAgICAgICBzZXREYXkoZGF5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAvLyB1c2UgTnVtYmVyRm9ybWF0IHRvIGVuc3VyZSBsZWFkaW5nIHplcm9zCi0gICAgICAgIE51bWJlckZvcm1hdCBuZiA9IE51bWJlckZvcm1hdC5nZXRJbnN0YW5jZSgpOwotICAgICAgICBuZi5zZXRHcm91cGluZ1VzZWQoZmFsc2UpOwotCi0gICAgICAgIC8vIG1vbnRoICYgRGF5OiAtLU1NLURECi0gICAgICAgIG5mLnNldE1pbmltdW1JbnRlZ2VyRGlnaXRzKDIpOwotICAgICAgICBTdHJpbmcgcyA9ICItLSIgKyBuZi5mb3JtYXQobW9udGgpICsgIi0iICsgbmYuZm9ybWF0KGRheSk7Ci0KLSAgICAgICAgLy8gdGltZXpvbmUKLSAgICAgICAgaWYgKHRpbWV6b25lICE9IG51bGwpIHsKLSAgICAgICAgICAgIHMgPSBzICsgdGltZXpvbmU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHM7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLSAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgTW9udGhEYXkpKSByZXR1cm4gZmFsc2U7Ci0gICAgICAgIE1vbnRoRGF5IG90aGVyID0gKE1vbnRoRGF5KW9iajsKLSAgICAgICAgaWYgKHRoaXMgPT0gb2JqKSByZXR1cm4gdHJ1ZTsKLQotICAgICAgICBib29sZWFuIGVxdWFscyA9ICh0aGlzLm1vbnRoID09IG90aGVyLm1vbnRoICYmIHRoaXMuZGF5ID09IG90aGVyLmRheSk7Ci0gICAgICAgIGlmICh0aW1lem9uZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBlcXVhbHMgPSBlcXVhbHMgJiYgdGltZXpvbmUuZXF1YWxzKG90aGVyLnRpbWV6b25lKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZXF1YWxzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgdmFsdWUgb2YgKG1vbnRoICsgZGF5KSBYT1JlZCB3aXRoIHRoZSBoYXNoQ29kZSBvZiB0aW1lem9uZSBpZmYgb25lIGlzIGRlZmluZWQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGFuIDxjb2RlPmludDwvY29kZT4gdmFsdWUKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICByZXR1cm4gbnVsbCA9PSB0aW1lem9uZQotICAgICAgICAgICAgICAgID8gKG1vbnRoICsgZGF5KQotICAgICAgICAgICAgICAgIDogKG1vbnRoICsgZGF5KSBeIHRpbWV6b25lLmhhc2hDb2RlKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL05DTmFtZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL05DTmFtZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTU1YjI2Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9OQ05hbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5YTUxDaGFyOwotCi0KLS8qKgotICogQ3VzdG9tIGNsYXNzIGZvciBzdXBwb3J0aW5nIFhTRCBkYXRhIHR5cGUgTkNOYW1lIE5DTmFtZSByZXByZXNlbnRzIFhNTCAibm9uLWNvbG9uaXplZCIgTmFtZXMgVGhlCi0gKiBiYXNlIHR5cGUgb2YgTkNOYW1lIGlzIE5hbWUuCi0gKgotICogQHNlZSA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jTkNOYW1lIj5YTUwgU2NoZW1hIDMuMy43PC9hPgotICogQHNlZSA8QSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi8xOTk5L1JFQy14bWwtbmFtZXMtMTk5OTAxMTQvI05ULU5DTmFtZSI+TkNOYW1lIFByb2R1Y3Rpb248L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBOQ05hbWUgZXh0ZW5kcyBOYW1lIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDg1NzM0NTE2MjgyNzY4OTgyOTdMOwotCi0gICAgcHVibGljIE5DTmFtZSgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBjdG9yIGZvciBOQ05hbWUKLSAgICAgKgotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duIGlmIHZhbGlkYXRpb24gZmFpbHMKLSAgICAgKi8KLSAgICBwdWJsaWMgTkNOYW1lKFN0cmluZyBzdFZhbHVlKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNldFZhbHVlKHN0VmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gcmVjYXN0IG5vcm1hbGl6ZWRTdHJpbmcgZXhjZXB0aW9uIGFzIHRva2VuIGV4Y2VwdGlvbgotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgLy8gTWVzc2FnZXMuZ2V0TWVzc2FnZSgiYmFkTkNOYW1lVHlwZTAwIikgKwotICAgICAgICAgICAgICAgICAgICAiZGF0YT1bIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RWYWx1ZSArICJdIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB2YWxpZGF0ZXMgdGhlIGRhdGEgYW5kIHNldHMgdGhlIHZhbHVlIGZvciB0aGUgb2JqZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIHN0VmFsdWUgU3RyaW5nIHZhbHVlCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgaW52YWxpZCBmb3JtYXQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgc3RWYWx1ZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghTkNOYW1lLmlzVmFsaWQoc3RWYWx1ZSkpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAvL01lc3NhZ2VzLmdldE1lc3NhZ2UoImJhZE5DTmFtZVR5cGUwMCIpICsKLSAgICAgICAgICAgICAgICAgICAgIiBkYXRhPVsiICsgc3RWYWx1ZSArICJdIik7Ci0gICAgICAgIG1fdmFsdWUgPSBzdFZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHZhbGlkYXRlIHRoZSB2YWx1ZSBhZ2FpbnN0IHRoZSB4c2QgZGVmaW5pdGlvbgotICAgICAqIDxwLz4KLSAgICAgKiBOQ05hbWUgOjo9ICAoTGV0dGVyIHwgJ18nKSAoTkNOYW1lQ2hhcikqIE5DTmFtZUNoYXIgOjo9ICBMZXR0ZXIgfCBEaWdpdCB8ICcuJyB8ICctJyB8ICdfJyB8Ci0gICAgICogQ29tYmluaW5nQ2hhciB8IEV4dGVuZGVyCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWQoU3RyaW5nIHN0VmFsdWUpIHsKLSAgICAgICAgaW50IHNjYW47Ci0gICAgICAgIGJvb2xlYW4gYlZhbGlkID0gdHJ1ZTsKLQotICAgICAgICBmb3IgKHNjYW4gPSAwOyBzY2FuIDwgc3RWYWx1ZS5sZW5ndGgoKTsgc2NhbisrKSB7Ci0gICAgICAgICAgICBpZiAoc2NhbiA9PSAwKQotICAgICAgICAgICAgICAgIGJWYWxpZCA9IFhNTENoYXIuaXNOQ05hbWVTdGFydChzdFZhbHVlLmNoYXJBdChzY2FuKSk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgYlZhbGlkID0gWE1MQ2hhci5pc05DTmFtZShzdFZhbHVlLmNoYXJBdChzY2FuKSk7Ci0gICAgICAgICAgICBpZiAoIWJWYWxpZCkKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYlZhbGlkOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9OTVRva2VuLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvTk1Ub2tlbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjJiYWU2Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9OTVRva2VuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuWE1MQ2hhcjsKLQotCi0vKioKLSAqIEN1c3RvbSBjbGFzcyBmb3Igc3VwcG9ydGluZyBYU0QgZGF0YSB0eXBlIE5NVG9rZW4KLSAqIDxwLz4KLSAqIE5NVE9LRU4gcmVwcmVzZW50cyB0aGUgTk1UT0tFTiBhdHRyaWJ1dGUgdHlwZSBmcm9tIFtYTUwgMS4wKFNlY29uZCBFZGl0aW9uKV0uIFRoZSB2YWx1ZSBzcGFjZSBvZgotICogTk1UT0tFTiBpcyB0aGUgc2V0IG9mIHRva2VucyB0aGF0IG1hdGNoIHRoZSBObXRva2VuIHByb2R1Y3Rpb24gaW4gW1hNTCAxLjAgKFNlY29uZCBFZGl0aW9uKV0uIFRoZQotICogYmFzZSB0eXBlIG9mIE5NVE9LRU4gaXMgdG9rZW4uCi0gKgotICogQHNlZSA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jbm10b2tlbiI+WE1MIFNjaGVtYSAzLjMuNDwvYT4KLSAqLwotcHVibGljIGNsYXNzIE5NVG9rZW4gZXh0ZW5kcyBUb2tlbiB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMTMxOTc0MTAwMjczMzE3NDMyOUw7Ci0KLSAgICBwdWJsaWMgTk1Ub2tlbigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBjdG9yIGZvciBOTVRva2VuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB3aWxsIGJlIHRocm93biBpZiB2YWxpZGF0aW9uIGZhaWxzCi0gICAgICovCi0gICAgcHVibGljIE5NVG9rZW4oU3RyaW5nIHN0VmFsdWUpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgc2V0VmFsdWUoc3RWYWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyByZWNhc3Qgbm9ybWFsaXplZFN0cmluZyBleGNlcHRpb24gYXMgdG9rZW4gZXhjZXB0aW9uCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAvLyAgTWVzc2FnZXMuZ2V0TWVzc2FnZSgiYmFkTm10b2tlbjAwIikgKyAiZGF0YT1bIiArCi0gICAgICAgICAgICAgICAgICAgIHN0VmFsdWUgKyAiXSIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogdmFsaWRhdGUgdGhlIHZhbHVlIGFnYWluc3QgdGhlIHhzZCBkZWZpbml0aW9uIE5tdG9rZW4gICAgOjo9ICAgIChOYW1lQ2hhcikrIE5hbWVDaGFyICAgIDo6PQotICAgICAqIExldHRlciB8IERpZ2l0IHwgJy4nIHwgJy0nIHwgJ18nIHwgJzonIHwgQ29tYmluaW5nQ2hhciB8IEV4dGVuZGVyCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWQoU3RyaW5nIHN0VmFsdWUpIHsKLSAgICAgICAgaW50IHNjYW47Ci0KLSAgICAgICAgZm9yIChzY2FuID0gMDsgc2NhbiA8IHN0VmFsdWUubGVuZ3RoKCk7IHNjYW4rKykgewotICAgICAgICAgICAgaWYgKCFYTUxDaGFyLmlzTmFtZShzdFZhbHVlLmNoYXJBdChzY2FuKSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL05NVG9rZW5zLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvTk1Ub2tlbnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBjM2M4OS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvTk1Ub2tlbnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotLyoqIEN1c3RvbSBjbGFzcyBmb3Igc3VwcG9ydGluZyBYU0QgZGF0YSB0eXBlIE5NVG9rZW5zICovCi1wdWJsaWMgY2xhc3MgTk1Ub2tlbnMgZXh0ZW5kcyBOQ05hbWUgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0yNDM1ODU0ODI0MjE2MTgxMTY1TDsKLSAgICBwcml2YXRlIE5NVG9rZW5bXSB0b2tlbnM7Ci0KLSAgICBwdWJsaWMgTk1Ub2tlbnMoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogY3RvciBmb3IgTk1Ub2tlbnMKLSAgICAgKgotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duIGlmIHZhbGlkYXRpb24gZmFpbHMKLSAgICAgKi8KLSAgICBwdWJsaWMgTk1Ub2tlbnMoU3RyaW5nIHN0VmFsdWUpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotICAgICAgICBzZXRWYWx1ZShzdFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgc3RWYWx1ZSkgewotICAgICAgICBTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihzdFZhbHVlKTsKLSAgICAgICAgaW50IGNvdW50ID0gdG9rZW5pemVyLmNvdW50VG9rZW5zKCk7Ci0gICAgICAgIHRva2VucyA9IG5ldyBOTVRva2VuW2NvdW50XTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICB0b2tlbnNbaV0gPSBuZXcgTk1Ub2tlbih0b2tlbml6ZXIubmV4dFRva2VuKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIE5NVG9rZW4gdG9rZW4gPSB0b2tlbnNbaV07Ci0gICAgICAgICAgICBpZiAoaSA+IDApIGJ1Zi5hcHBlbmQoIiAiKTsKLSAgICAgICAgICAgIGJ1Zi5hcHBlbmQodG9rZW4udG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE5NVG9rZW5zIGNhbiBiZSBlcXVhbCB3aXRob3V0IGhhdmluZyBpZGVudGljYWwgb3JkZXJpbmcgYmVjYXVzZSB0aGV5IHJlcHJlc2VudCBhIHNldCBvZgotICAgICAqIHJlZmVyZW5jZXMuICBIZW5jZSB3ZSBoYXZlIHRvIGNvbXBhcmUgdmFsdWVzIGhlcmUgYXMgYSBzZXQsIG5vdCBhIGxpc3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb2JqZWN0IGFuIDxjb2RlPk9iamVjdDwvY29kZT4gdmFsdWUKLSAgICAgKiBAcmV0dXJuIGEgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iamVjdCkgewotICAgICAgICBpZiAob2JqZWN0ID09IHRoaXMpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOyAgICAgICAgLy8gc3VjY2VlZCBxdWlja2x5LCB3aGVuIHBvc3NpYmxlCi0gICAgICAgIH0KLSAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIE5NVG9rZW5zKSB7Ci0gICAgICAgICAgICBOTVRva2VucyB0aGF0ID0gKE5NVG9rZW5zKW9iamVjdDsKLSAgICAgICAgICAgIGlmICh0aGlzLnRva2Vucy5sZW5ndGggPT0gdGhhdC50b2tlbnMubGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgU2V0IG91clNldCA9IG5ldyBIYXNoU2V0KEFycmF5cy5hc0xpc3QodGhpcy50b2tlbnMpKTsKLSAgICAgICAgICAgICAgICBTZXQgdGhlaXJTZXQgPSBuZXcgSGFzaFNldChBcnJheXMuYXNMaXN0KHRoYXQudG9rZW5zKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG91clNldC5lcXVhbHModGhlaXJTZXQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzdW0gb2YgdGhlIGhhc2hjb2RlcyBvZiB0aGUgdW5kZXJseWluZyB0b2tlbnMsIGFuIG9wZXJhdGlvbiB3aGljaCBpcyBub3QKLSAgICAgKiBzZW5zaXRpdmUgdG8gb3JkZXJpbmcuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGFuIDxjb2RlPmludDwvY29kZT4gdmFsdWUKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICBpbnQgaGFzaCA9IDA7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBoYXNoICs9IHRva2Vuc1tpXS5oYXNoQ29kZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBoYXNoOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9OYW1lLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvTmFtZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzZmOTNjLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9OYW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXM7Ci0KLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5YTUxDaGFyOwotCi0vKioKLSAqIEN1c3RvbSBjbGFzcyBmb3Igc3VwcG9ydGluZyBYU0QgZGF0YSB0eXBlIE5hbWUgTmFtZSByZXByZXNlbnRzIFhNTCBOYW1lcy4gVGhlIHZhbHVlIHNwYWNlIG9mIE5hbWUKLSAqIGlzIHRoZSBzZXQgb2YgYWxsIHN0cmluZ3Mgd2hpY2ggbWF0Y2ggdGhlIE5hbWUgcHJvZHVjdGlvbiBvZiBbWE1MIDEuMCAoU2Vjb25kIEVkaXRpb24pXS4gVGhlIGJhc2UKLSAqIHR5cGUgb2YgTmFtZSBpcyB0b2tlbi4KLSAqCi0gKiBAc2VlIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNOYW1lIj5YTUwgU2NoZW1hIDMuMy42PC9hPgotICovCi1wdWJsaWMgY2xhc3MgTmFtZSBleHRlbmRzIFRva2VuIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC04MzU0NTk0MzAxNzM3MzU4NDQxTDsKLQotICAgIHB1YmxpYyBOYW1lKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGN0b3IgZm9yIE5hbWUKLSAgICAgKgotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duIGlmIHZhbGlkYXRpb24gZmFpbHMKLSAgICAgKi8KLSAgICBwdWJsaWMgTmFtZShTdHJpbmcgc3RWYWx1ZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzZXRWYWx1ZShzdFZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIHJlY2FzdCBub3JtYWxpemVkU3RyaW5nIGV4Y2VwdGlvbiBhcyB0b2tlbiBleGNlcHRpb24KLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICIgaW52YWxpZCB2YWx1ZSBmb3IgbmFtZSAiICsKLSAgICAgICAgICAgICAgICAgICAgImRhdGE9WyIgKyBzdFZhbHVlICsgIl0iKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIHZhbGlkYXRlcyB0aGUgZGF0YSBhbmQgc2V0cyB0aGUgdmFsdWUgZm9yIHRoZSBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3RWYWx1ZSBTdHJpbmcgdmFsdWUKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBpbnZhbGlkIGZvcm1hdAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBzdFZhbHVlKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFOYW1lLmlzVmFsaWQoc3RWYWx1ZSkpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiIGludmFsaWQgdmFsdWUgZm9yIG5hbWUgIiArCi0gICAgICAgICAgICAgICAgICAgICIgZGF0YT1bIiArIHN0VmFsdWUgKyAiXSIpOwotICAgICAgICBtX3ZhbHVlID0gc3RWYWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB2YWxpZGF0ZSB0aGUgdmFsdWUgYWdhaW5zdCB0aGUgeHNkIGRlZmluaXRpb24gTmFtZSAgICA6Oj0gICAgKExldHRlciB8ICdfJyB8ICc6JykgKAotICAgICAqIE5hbWVDaGFyKSogTmFtZUNoYXIgICAgOjo9ICAgICBMZXR0ZXIgfCBEaWdpdCB8ICcuJyB8ICctJyB8ICdfJyB8ICc6JyB8IENvbWJpbmluZ0NoYXIgfAotICAgICAqIEV4dGVuZGVyCi0gICAgICovCi0gICAgLy90b2RvIC0gRml4IHRoaXMKLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZChTdHJpbmcgc3RWYWx1ZSkgewotICAgICAgICBpbnQgc2NhbjsKLSAgICAgICAgYm9vbGVhbiBiVmFsaWQgPSB0cnVlOwotCi0gICAgICAgIGZvciAoc2NhbiA9IDA7IHNjYW4gPCBzdFZhbHVlLmxlbmd0aCgpOyBzY2FuKyspIHsKLSAgICAgICAgICAgIGlmIChzY2FuID09IDApIHsKLSAgICAgICAgICAgICAgICBiVmFsaWQgPSBYTUxDaGFyLmlzTmFtZVN0YXJ0KHN0VmFsdWUuY2hhckF0KHNjYW4pKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYlZhbGlkID0gWE1MQ2hhci5pc05hbWUoc3RWYWx1ZS5jaGFyQXQoc2NhbikpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFiVmFsaWQpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gYlZhbGlkOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9OZWdhdGl2ZUludGVnZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9OZWdhdGl2ZUludGVnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ4ZmQzNi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvTmVnYXRpdmVJbnRlZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzOwotCi0KLWltcG9ydCBqYXZhLmlvLk9iamVjdFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLWltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOwotCi0vKioKLSAqIEN1c3RvbSBjbGFzcyBmb3Igc3VwcG9ydGluZyBwcmltaXRpdmUgWFNEIGRhdGEgdHlwZSBuZWdhdGl2ZWludGVnZXIKLSAqIDxwLz4KLSAqIG5lZ2F0aXZlSW50ZWdlciBpcyBkZXJpdmVkIGZyb20gbm9uUG9zaXRpdmVJbnRlZ2VyIGJ5IHNldHRpbmcgdGhlIHZhbHVlIG9mIG1heEluY2x1c2l2ZSB0byBiZSAtMS4KLSAqIFRoaXMgcmVzdWx0cyBpbiB0aGUgc3RhbmRhcmQgbWF0aGVtYXRpY2FsIGNvbmNlcHQgb2YgdGhlIG5lZ2F0aXZlIGludGVnZXJzLiBUaGUgdmFsdWUgc3BhY2Ugb2YKLSAqIG5lZ2F0aXZlSW50ZWdlciBpcyB0aGUgaW5maW5pdGUgc2V0IHsuLi4sLTIsLTF9LiBUaGUgYmFzZSB0eXBlIG9mIG5lZ2F0aXZlSW50ZWdlciBpcwotICogbm9uUG9zaXRpdmVJbnRlZ2VyLgotICoKLSAqIEBzZWUgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI25lZ2F0aXZlSW50ZWdlciI+WE1MIFNjaGVtYSAzLjMuMTU8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBOZWdhdGl2ZUludGVnZXIgZXh0ZW5kcyBOb25Qb3NpdGl2ZUludGVnZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTIyOTU5Mjg3MTU2OTM2Mzk0MjdMOwotCi0gICAgcHVibGljIE5lZ2F0aXZlSW50ZWdlcihieXRlW10gdmFsKSB7Ci0gICAgICAgIHN1cGVyKHZhbCk7Ci0gICAgICAgIGNoZWNrVmFsaWRpdHkoKTsKLSAgICB9IC8vIGN0b3IKLQotICAgIHB1YmxpYyBOZWdhdGl2ZUludGVnZXIoaW50IHNpZ251bSwgYnl0ZVtdIG1hZ25pdHVkZSkgewotICAgICAgICBzdXBlcihzaWdudW0sIG1hZ25pdHVkZSk7Ci0gICAgICAgIGNoZWNrVmFsaWRpdHkoKTsKLSAgICB9IC8vIGN0b3IKLQotICAgIHB1YmxpYyBOZWdhdGl2ZUludGVnZXIoaW50IGJpdExlbmd0aCwgaW50IGNlcnRhaW50eSwgUmFuZG9tIHJuZCkgewotICAgICAgICBzdXBlcihiaXRMZW5ndGgsIGNlcnRhaW50eSwgcm5kKTsKLSAgICAgICAgY2hlY2tWYWxpZGl0eSgpOwotICAgIH0gLy8gY3RvcgotCi0gICAgcHVibGljIE5lZ2F0aXZlSW50ZWdlcihpbnQgbnVtQml0cywgUmFuZG9tIHJuZCkgewotICAgICAgICBzdXBlcihudW1CaXRzLCBybmQpOwotICAgICAgICBjaGVja1ZhbGlkaXR5KCk7Ci0gICAgfSAvLyBjdG9yCi0KLSAgICBwdWJsaWMgTmVnYXRpdmVJbnRlZ2VyKFN0cmluZyB2YWwpIHsKLSAgICAgICAgc3VwZXIodmFsKTsKLSAgICAgICAgY2hlY2tWYWxpZGl0eSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBOZWdhdGl2ZUludGVnZXIoU3RyaW5nIHZhbCwgaW50IHJhZGl4KSB7Ci0gICAgICAgIHN1cGVyKHZhbCwgcmFkaXgpOwotICAgICAgICBjaGVja1ZhbGlkaXR5KCk7Ci0gICAgfSAvLyBjdG9yCi0KLSAgICAvKiogdmFsaWRhdGUgdGhlIHZhbHVlIGFnYWluc3QgdGhlIHhzZCBkZWZpbml0aW9uICovCi0gICAgcHJpdmF0ZSBCaWdJbnRlZ2VyIHplcm8gPSBuZXcgQmlnSW50ZWdlcigiMCIpOwotCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrVmFsaWRpdHkoKSB7Ci0gICAgICAgIGlmIChjb21wYXJlVG8oemVybykgPj0gMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE51bWJlckZvcm1hdEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgLy8gTWVzc2FnZXMuZ2V0TWVzc2FnZSgiYmFkbmVnSW50MDAiKSArCi0gICAgICAgICAgICAgICAgICAgICI6ICAiICsgdGhpcyk7Ci0gICAgICAgIH0KLSAgICB9IC8vIGNoZWNrVmFsaWRpdHkKLQotICAgIC8qKgotICAgICAqIFdvcmstYXJvdW5kIGZvciBodHRwOi8vZGV2ZWxvcGVyLmphdmEuc3VuLmNvbS9kZXZlbG9wZXIvYnVnUGFyYWRlL2J1Z3MvNDM3ODM3MC5odG1sCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIEJpZ0ludGVnZXJSZXAKLSAgICAgKiBAdGhyb3dzIGphdmEuaW8uT2JqZWN0U3RyZWFtRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCB3cml0ZVJlcGxhY2UoKSB0aHJvd3MgT2JqZWN0U3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG5ldyBCaWdJbnRlZ2VyUmVwKHRvQnl0ZUFycmF5KCkpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBzdGF0aWMgY2xhc3MgQmlnSW50ZWdlclJlcCBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlIHsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMTIwOTYxODQ4NzAzMTQwNDExMEw7Ci0gICAgICAgIHByaXZhdGUgYnl0ZVtdIGFycmF5OwotCi0gICAgICAgIHByb3RlY3RlZCBCaWdJbnRlZ2VyUmVwKGJ5dGVbXSBhcnJheSkgewotICAgICAgICAgICAgdGhpcy5hcnJheSA9IGFycmF5OwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIE9iamVjdCByZWFkUmVzb2x2ZSgpIHRocm93cyBqYXZhLmlvLk9iamVjdFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IE5lZ2F0aXZlSW50ZWdlcihhcnJheSk7Ci0gICAgICAgIH0KLSAgICB9Ci19IC8vIGNsYXNzIE5vbk5lZ2F0aXZlSW50ZWdlcgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL05vbk5lZ2F0aXZlSW50ZWdlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL05vbk5lZ2F0aXZlSW50ZWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDNmNWM5Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9Ob25OZWdhdGl2ZUludGVnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlczsKLQotaW1wb3J0IGphdmEuaW8uT2JqZWN0U3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEudXRpbC5SYW5kb207Ci0KLS8qKgotICogQ3VzdG9tIGNsYXNzIGZvciBzdXBwb3J0aW5nIHByaW1pdGl2ZSBYU0QgZGF0YSB0eXBlIG5vbk5lZ2F0aXZlSW50ZWdlcgotICoKLSAqIEBzZWUgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI25vbk5lZ2F0aXZlSW50ZWdlciI+WE1MIFNjaGVtYSAzLjMuMjA8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBOb25OZWdhdGl2ZUludGVnZXIgZXh0ZW5kcyBCaWdJbnRlZ2VyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC00ODQ1Nzc4NjAzNTE0MDYwNTRMOwotCi0gICAgcHVibGljIE5vbk5lZ2F0aXZlSW50ZWdlcihieXRlW10gdmFsKSB7Ci0gICAgICAgIHN1cGVyKHZhbCk7Ci0gICAgICAgIGNoZWNrVmFsaWRpdHkoKTsKLSAgICB9IC8vIGN0b3IKLQotICAgIHB1YmxpYyBOb25OZWdhdGl2ZUludGVnZXIoaW50IHNpZ251bSwgYnl0ZVtdIG1hZ25pdHVkZSkgewotICAgICAgICBzdXBlcihzaWdudW0sIG1hZ25pdHVkZSk7Ci0gICAgICAgIGNoZWNrVmFsaWRpdHkoKTsKLSAgICB9IC8vIGN0b3IKLQotICAgIHB1YmxpYyBOb25OZWdhdGl2ZUludGVnZXIoaW50IGJpdExlbmd0aCwgaW50IGNlcnRhaW50eSwgUmFuZG9tIHJuZCkgewotICAgICAgICBzdXBlcihiaXRMZW5ndGgsIGNlcnRhaW50eSwgcm5kKTsKLSAgICAgICAgY2hlY2tWYWxpZGl0eSgpOwotICAgIH0gLy8gY3RvcgotCi0gICAgcHVibGljIE5vbk5lZ2F0aXZlSW50ZWdlcihpbnQgbnVtQml0cywgUmFuZG9tIHJuZCkgewotICAgICAgICBzdXBlcihudW1CaXRzLCBybmQpOwotICAgICAgICBjaGVja1ZhbGlkaXR5KCk7Ci0gICAgfSAvLyBjdG9yCi0KLSAgICBwdWJsaWMgTm9uTmVnYXRpdmVJbnRlZ2VyKFN0cmluZyB2YWwpIHsKLSAgICAgICAgc3VwZXIodmFsKTsKLSAgICAgICAgY2hlY2tWYWxpZGl0eSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBOb25OZWdhdGl2ZUludGVnZXIoU3RyaW5nIHZhbCwgaW50IHJhZGl4KSB7Ci0gICAgICAgIHN1cGVyKHZhbCwgcmFkaXgpOwotICAgICAgICBjaGVja1ZhbGlkaXR5KCk7Ci0gICAgfSAvLyBjdG9yCi0KLSAgICAvKiogdmFsaWRhdGUgdGhlIHZhbHVlIGFnYWluc3QgdGhlIHhzZCBkZWZpbml0aW9uICovCi0gICAgcHJpdmF0ZSBCaWdJbnRlZ2VyIHplcm8gPSBuZXcgQmlnSW50ZWdlcigiMCIpOwotCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrVmFsaWRpdHkoKSB7Ci0gICAgICAgIGlmIChjb21wYXJlVG8oemVybykgPCAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTnVtYmVyRm9ybWF0RXhjZXB0aW9uKAotLy8gICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoImJhZE5vbk5lZ0ludDAwIikgKwotIjogICIgKyB0aGlzKTsKLSAgICAgICAgfQotICAgIH0gLy8gY2hlY2tWYWxpZGl0eQotCi0gICAgLyoqCi0gICAgICogV29yay1hcm91bmQgZm9yIGh0dHA6Ly9kZXZlbG9wZXIuamF2YS5zdW4uY29tL2RldmVsb3Blci9idWdQYXJhZGUvYnVncy80Mzc4MzcwLmh0bWwKLSAgICAgKgotICAgICAqIEByZXR1cm4gQmlnSW50ZWdlclJlcAotICAgICAqIEB0aHJvd3MgT2JqZWN0U3RyZWFtRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCB3cml0ZVJlcGxhY2UoKSB0aHJvd3MgT2JqZWN0U3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG5ldyBCaWdJbnRlZ2VyUmVwKHRvQnl0ZUFycmF5KCkpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBzdGF0aWMgY2xhc3MgQmlnSW50ZWdlclJlcCBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlIHsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTYxMzUwNjU2MDU1MTQ2Nzg2ODlMOwotICAgICAgICBwcml2YXRlIGJ5dGVbXSBhcnJheTsKLQotICAgICAgICBwcm90ZWN0ZWQgQmlnSW50ZWdlclJlcChieXRlW10gYXJyYXkpIHsKLSAgICAgICAgICAgIHRoaXMuYXJyYXkgPSBhcnJheTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCBPYmplY3QgcmVhZFJlc29sdmUoKSB0aHJvd3MgamF2YS5pby5PYmplY3RTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgcmV0dXJuIG5ldyBOb25OZWdhdGl2ZUludGVnZXIoYXJyYXkpOwotICAgICAgICB9Ci0gICAgfQotfSAvLyBjbGFzcyBOb25OZWdhdGl2ZUludGVnZXIKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9Ob25Qb3NpdGl2ZUludGVnZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9Ob25Qb3NpdGl2ZUludGVnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThmNmNiZi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvTm9uUG9zaXRpdmVJbnRlZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzOwotCi1pbXBvcnQgamF2YS5pby5PYmplY3RTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci1pbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKLQotLyoqCi0gKiBDdXN0b20gY2xhc3MgZm9yIHN1cHBvcnRpbmcgcHJpbWl0aXZlIFhTRCBkYXRhIHR5cGUgbm9uUG9zaXRpdmVJbnRlZ2VyCi0gKiA8cC8+Ci0gKiBub25Qb3NpdGl2ZUludGVnZXIgaXMgZGVyaXZlZCBmcm9tIGludGVnZXIgYnkgc2V0dGluZyB0aGUgdmFsdWUgb2YgbWF4SW5jbHVzaXZlIHRvIGJlIDAuIFRoaXMKLSAqIHJlc3VsdHMgaW4gdGhlIHN0YW5kYXJkIG1hdGhlbWF0aWNhbCBjb25jZXB0IG9mIHRoZSBub24tcG9zaXRpdmUgaW50ZWdlcnMuIFRoZSB2YWx1ZSBzcGFjZSBvZgotICogbm9uUG9zaXRpdmVJbnRlZ2VyIGlzIHRoZSBpbmZpbml0ZSBzZXQgey4uLiwtMiwtMSwwfS4KLSAqCi0gKiBAc2VlIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNub25Qb3NpdGl2ZUludGVnZXIiPlhNTCBTY2hlbWEgMy4zLjE0PC9hPgotICovCi1wdWJsaWMgY2xhc3MgTm9uUG9zaXRpdmVJbnRlZ2VyIGV4dGVuZHMgQmlnSW50ZWdlciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtODYwOTA1MTk2MTgzODExNzYwMEw7Ci0KLSAgICBwdWJsaWMgTm9uUG9zaXRpdmVJbnRlZ2VyKGJ5dGVbXSB2YWwpIHsKLSAgICAgICAgc3VwZXIodmFsKTsKLSAgICAgICAgY2hlY2tWYWxpZGl0eSgpOwotICAgIH0gLy8gY3RvcgotCi0gICAgcHVibGljIE5vblBvc2l0aXZlSW50ZWdlcihpbnQgc2lnbnVtLCBieXRlW10gbWFnbml0dWRlKSB7Ci0gICAgICAgIHN1cGVyKHNpZ251bSwgbWFnbml0dWRlKTsKLSAgICAgICAgY2hlY2tWYWxpZGl0eSgpOwotICAgIH0gLy8gY3RvcgotCi0gICAgcHVibGljIE5vblBvc2l0aXZlSW50ZWdlcihpbnQgYml0TGVuZ3RoLCBpbnQgY2VydGFpbnR5LCBSYW5kb20gcm5kKSB7Ci0gICAgICAgIHN1cGVyKGJpdExlbmd0aCwgY2VydGFpbnR5LCBybmQpOwotICAgICAgICBjaGVja1ZhbGlkaXR5KCk7Ci0gICAgfSAvLyBjdG9yCi0KLSAgICBwdWJsaWMgTm9uUG9zaXRpdmVJbnRlZ2VyKGludCBudW1CaXRzLCBSYW5kb20gcm5kKSB7Ci0gICAgICAgIHN1cGVyKG51bUJpdHMsIHJuZCk7Ci0gICAgICAgIGNoZWNrVmFsaWRpdHkoKTsKLSAgICB9IC8vIGN0b3IKLQotICAgIHB1YmxpYyBOb25Qb3NpdGl2ZUludGVnZXIoU3RyaW5nIHZhbCkgewotICAgICAgICBzdXBlcih2YWwpOwotICAgICAgICBjaGVja1ZhbGlkaXR5KCk7Ci0gICAgfQotCi0gICAgcHVibGljIE5vblBvc2l0aXZlSW50ZWdlcihTdHJpbmcgdmFsLCBpbnQgcmFkaXgpIHsKLSAgICAgICAgc3VwZXIodmFsLCByYWRpeCk7Ci0gICAgICAgIGNoZWNrVmFsaWRpdHkoKTsKLSAgICB9IC8vIGN0b3IKLQotICAgIC8qKiB2YWxpZGF0ZSB0aGUgdmFsdWUgYWdhaW5zdCB0aGUgeHNkIGRlZmluaXRpb24gKi8KLSAgICBwcml2YXRlIEJpZ0ludGVnZXIgemVybyA9IG5ldyBCaWdJbnRlZ2VyKCIwIik7Ci0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tWYWxpZGl0eSgpIHsKLSAgICAgICAgaWYgKGNvbXBhcmVUbyh6ZXJvKSA+IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBOdW1iZXJGb3JtYXRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIC8vTWVzc2FnZXMuZ2V0TWVzc2FnZSgiYmFkTm9uUG9zSW50MDAiKSArCi0gICAgICAgICAgICAgICAgICAgICI6ICAiICsgdGhpcyk7Ci0gICAgICAgIH0KLSAgICB9IC8vIGNoZWNrVmFsaWRpdHkKLQotICAgIC8qKgotICAgICAqIFdvcmstYXJvdW5kIGZvciBodHRwOi8vZGV2ZWxvcGVyLmphdmEuc3VuLmNvbS9kZXZlbG9wZXIvYnVnUGFyYWRlL2J1Z3MvNDM3ODM3MC5odG1sCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIEJpZ0ludGVnZXJSZXAKLSAgICAgKiBAdGhyb3dzIGphdmEuaW8uT2JqZWN0U3RyZWFtRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCB3cml0ZVJlcGxhY2UoKSB0aHJvd3MgT2JqZWN0U3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG5ldyBCaWdJbnRlZ2VyUmVwKHRvQnl0ZUFycmF5KCkpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBzdGF0aWMgY2xhc3MgQmlnSW50ZWdlclJlcCBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlIHsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTM2MDEzNTc2OTAzNjU2OTg1MTdMOwotICAgICAgICBwcml2YXRlIGJ5dGVbXSBhcnJheTsKLQotICAgICAgICBwcm90ZWN0ZWQgQmlnSW50ZWdlclJlcChieXRlW10gYXJyYXkpIHsKLSAgICAgICAgICAgIHRoaXMuYXJyYXkgPSBhcnJheTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCBPYmplY3QgcmVhZFJlc29sdmUoKSB0aHJvd3MgamF2YS5pby5PYmplY3RTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgcmV0dXJuIG5ldyBOb25Qb3NpdGl2ZUludGVnZXIoYXJyYXkpOwotICAgICAgICB9Ci0gICAgfQotfSAvLyBjbGFzcyBOb25Qb3NpdGl2ZUludGVnZXIKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9Ob3JtYWxpemVkU3RyaW5nLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvTm9ybWFsaXplZFN0cmluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OWY5ZjVjLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9Ob3JtYWxpemVkU3RyaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzOwotCi0KLS8qKgotICogQ3VzdG9tIGNsYXNzIGZvciBzdXBwb3J0aW5nIFhTRCBkYXRhIHR5cGUgTm9ybWFsaXplZFN0cmluZy4gbm9ybWFsaXplZFN0cmluZyByZXByZXNlbnRzIHdoaXRlCi0gKiBzcGFjZSBub3JtYWxpemVkIHN0cmluZ3MuIFRoZSBiYXNlIHR5cGUgb2Ygbm9ybWFsaXplZFN0cmluZyBpcyBzdHJpbmcuCi0gKgotICogQHNlZSA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jbm9ybWFsaXplZFN0cmluZyI+WE1MIFNjaGVtYSBQYXJ0IDI6IERhdGF0eXBlcwotICogICAgICAzLjMuMTwvYT4KLSAqLwotcHVibGljIGNsYXNzIE5vcm1hbGl6ZWRTdHJpbmcgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMjkwODc4MTUxODcwMzk5NDAxTDsKLQotICAgIFN0cmluZyBtX3ZhbHVlOyAgIC8vIEpBWC1SUEMgbWFwcyB4c2Q6c3RyaW5nIHRvIGphdmEubGFuZy5TdHJpbmcKLQotICAgIHB1YmxpYyBOb3JtYWxpemVkU3RyaW5nKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGN0b3IgZm9yIE5vcm1hbGl6ZWRTdHJpbmcKLSAgICAgKgotICAgICAqIEBwYXJhbSBzdFZhbHVlIGlzIHRoZSBTdHJpbmcgdmFsdWUKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBpbnZhbGlkIGZvcm1hdAotICAgICAqLwotICAgIHB1YmxpYyBOb3JtYWxpemVkU3RyaW5nKFN0cmluZyBzdFZhbHVlKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLSAgICAgICAgc2V0VmFsdWUoc3RWYWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogdmFsaWRhdGVzIHRoZSBkYXRhIGFuZCBzZXRzIHRoZSB2YWx1ZSBmb3IgdGhlIG9iamVjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzdFZhbHVlIFN0cmluZyB2YWx1ZQotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGludmFsaWQgZm9ybWF0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHN0VmFsdWUpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotICAgICAgICBpZiAoIU5vcm1hbGl6ZWRTdHJpbmcuaXNWYWxpZChzdFZhbHVlKSkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0vLyAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoImJhZE5vcm1hbGl6ZWRTdHJpbmcwMCIpICsKLSIgZGF0YT1bIiArIHN0VmFsdWUgKyAiXSIpOwotICAgICAgICBtX3ZhbHVlID0gc3RWYWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gbV92YWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICByZXR1cm4gbV92YWx1ZS5oYXNoQ29kZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHZhbGlkYXRlIHRoZSB2YWx1ZSBhZ2FpbnN0IHRoZSB4c2QgZGVmaW5pdGlvbiBmb3IgdGhlIG9iamVjdAotICAgICAqIDxwLz4KLSAgICAgKiBUaGUgdmFsdWUgc3BhY2Ugb2Ygbm9ybWFsaXplZFN0cmluZyBpcyB0aGUgc2V0IG9mIHN0cmluZ3MgdGhhdCBkbyBub3QgY29udGFpbiB0aGUgY2FycmlhZ2UKLSAgICAgKiByZXR1cm4gKCN4RCksIGxpbmUgZmVlZCAoI3hBKSBub3IgdGFiICgjeDkpIGNoYXJhY3RlcnMuIFRoZSBsZXhpY2FsIHNwYWNlIG9mIG5vcm1hbGl6ZWRTdHJpbmcKLSAgICAgKiBpcyB0aGUgc2V0IG9mIHN0cmluZ3MgdGhhdCBkbyBub3QgY29udGFpbiB0aGUgY2FycmlhZ2UgcmV0dXJuICgjeEQpIG5vciB0YWIgKCN4OSkKLSAgICAgKiBjaGFyYWN0ZXJzLgotICAgICAqCi0gICAgICogQHBhcmFtIHN0VmFsdWUgdGhlIFN0cmluZyB0byB0ZXN0Ci0gICAgICogQHJldHVybiBSZXR1cm5zIHRydWUgaWYgdmFsaWQgbm9ybWFsaXplZFN0cmluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZChTdHJpbmcgc3RWYWx1ZSkgewotICAgICAgICBpbnQgc2NhbjsKLQotICAgICAgICBmb3IgKHNjYW4gPSAwOyBzY2FuIDwgc3RWYWx1ZS5sZW5ndGgoKTsgc2NhbisrKSB7Ci0gICAgICAgICAgICBjaGFyIGNEaWdpdCA9IHN0VmFsdWUuY2hhckF0KHNjYW4pOwotICAgICAgICAgICAgc3dpdGNoIChjRGlnaXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDB4MDk6Ci0gICAgICAgICAgICAgICAgY2FzZSAweDBBOgotICAgICAgICAgICAgICAgIGNhc2UgMHgwRDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqZWN0KSB7Ci0gICAgICAgIFN0cmluZyBzMSA9IG9iamVjdC50b1N0cmluZygpOwotICAgICAgICByZXR1cm4gczEuZXF1YWxzKG1fdmFsdWUpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9Ob3RhdGlvbi5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL05vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4M2YwZGMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL05vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzOwotCi0KLS8qKgotICogQ3VzdG9tIGNsYXNzIGZvciBzdXBwb3J0aW5nIFhTRCBkYXRhIHR5cGUgTk9UQVRJT04uCi0gKgotICogQHNlZSA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jZWxlbWVudC1ub3RhdGlvbiI+WE1MIFNjaGVtYSBQYXJ0IDE6IDMuMTIKLSAqICAgICAgTm90YXRpb24gRGVjbGFyYXRpb25zPC9hPgotICovCi0KLXB1YmxpYyBjbGFzcyBOb3RhdGlvbiBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDIzOTMwNzQ2NTE5NzIxOTI1MzZMOwotCi0gICAgTkNOYW1lIG5hbWU7Ci0gICAgVVJJIHB1YmxpY1VSSTsKLSAgICBVUkkgc3lzdGVtVVJJOwotCi0gICAgcHVibGljIE5vdGF0aW9uKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBOb3RhdGlvbihOQ05hbWUgbmFtZSwgVVJJIHB1YmxpY1VSSSwgVVJJIHN5c3RlbVVSSSkgewotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgICAgICB0aGlzLnB1YmxpY1VSSSA9IHB1YmxpY1VSSTsKLSAgICAgICAgdGhpcy5zeXN0ZW1VUkkgPSBzeXN0ZW1VUkk7Ci0gICAgfQotCi0gICAgcHVibGljIE5DTmFtZSBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lKE5DTmFtZSBuYW1lKSB7Ci0gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFVSSSBnZXRQdWJsaWMoKSB7Ci0gICAgICAgIHJldHVybiBwdWJsaWNVUkk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UHVibGljKFVSSSBwdWJsaWNVUkkpIHsKLSAgICAgICAgdGhpcy5wdWJsaWNVUkkgPSBwdWJsaWNVUkk7Ci0gICAgfQotCi0gICAgcHVibGljIFVSSSBnZXRTeXN0ZW0oKSB7Ci0gICAgICAgIHJldHVybiBzeXN0ZW1VUkk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U3lzdGVtKFVSSSBzeXN0ZW1VUkkpIHsKLSAgICAgICAgdGhpcy5zeXN0ZW1VUkkgPSBzeXN0ZW1VUkk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLSAgICAgICAgaWYgKG9iaiA9PSBudWxsIHx8ICEob2JqIGluc3RhbmNlb2YgTm90YXRpb24pKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBOb3RhdGlvbiBvdGhlciA9IChOb3RhdGlvbilvYmo7Ci0gICAgICAgIGlmIChuYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChvdGhlci5uYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoIW5hbWUuZXF1YWxzKG90aGVyLm5hbWUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHB1YmxpY1VSSSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAob3RoZXIucHVibGljVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoIXB1YmxpY1VSSS5lcXVhbHMob3RoZXIucHVibGljVVJJKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzeXN0ZW1VUkkgPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKG90aGVyLnN5c3RlbVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKCFzeXN0ZW1VUkkuZXF1YWxzKG90aGVyLnN5c3RlbVVSSSkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzdW0gb2YgdGhlIGhhc2hjb2RlcyBvZiB7bmFtZSxwdWJsaWNVUkksc3lzdGVtVVJJfSBmb3Igd2hpY2hldmVyIHByb3BlcnRpZXMgaW4KLSAgICAgKiB0aGF0IHNldCBpcyBub24gbnVsbC4gIFRoaXMgaXMgY29uc2lzdGVudCB3aXRoIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBlcXVhbHMsIGFzIHJlcXVpcmVkIGJ5Ci0gICAgICoge0BsaW5rIE9iamVjdCNoYXNoQ29kZSgpIE9iamVjdC5oYXNoQ29kZX0uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGFuIDxjb2RlPmludDwvY29kZT4gdmFsdWUKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICBpbnQgaGFzaCA9IDA7Ci0gICAgICAgIGlmIChudWxsICE9IG5hbWUpIHsKLSAgICAgICAgICAgIGhhc2ggKz0gbmFtZS5oYXNoQ29kZSgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChudWxsICE9IHB1YmxpY1VSSSkgewotICAgICAgICAgICAgaGFzaCArPSBwdWJsaWNVUkkuaGFzaENvZGUoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobnVsbCAhPSBzeXN0ZW1VUkkpIHsKLSAgICAgICAgICAgIGhhc2ggKz0gc3lzdGVtVVJJLmhhc2hDb2RlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGhhc2g7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTm90ZSAtIEEgbG90IG9mIGNvZGUgdGhhdCBkZXBlbmRlZCBvbiBjZXJ0YWluIGRlc2NyaXB0aW9ucyBoYXMgYmVlbiBkZWxldGVkIGZyb20gdGhpcyBjbGFzcwotICAgICAqLwotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvUG9zaXRpdmVJbnRlZ2VyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvUG9zaXRpdmVJbnRlZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2YjI2NDIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL1Bvc2l0aXZlSW50ZWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlczsKLQotCi1pbXBvcnQgamF2YS5pby5PYmplY3RTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci1pbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKLQotLyoqCi0gKiBDdXN0b20gY2xhc3MgZm9yIHN1cHBvcnRpbmcgcHJpbWl0aXZlIFhTRCBkYXRhIHR5cGUgcG9zaXRpdmVJbnRlZ2VyCi0gKiA8cC8+Ci0gKiBwb3NpdGl2ZUludGVnZXIgaXMgZGVyaXZlZCBmcm9tIG5vbk5lZ2F0aXZlSW50ZWdlciBieSBzZXR0aW5nIHRoZSB2YWx1ZSBvZiBtaW5JbmNsdXNpdmUgdG8gYmUgMS4KLSAqIFRoaXMgcmVzdWx0cyBpbiB0aGUgc3RhbmRhcmQgbWF0aGVtYXRpY2FsIGNvbmNlcHQgb2YgdGhlIHBvc2l0aXZlIGludGVnZXIgbnVtYmVycy4gVGhlIHZhbHVlCi0gKiBzcGFjZSBvZiBwb3NpdGl2ZUludGVnZXIgaXMgdGhlIGluZmluaXRlIHNldCB7MSwyLC4uLn0uCi0gKgotICogQHNlZSA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jcG9zaXRpdmVJbnRlZ2VyIj5YTUwgU2NoZW1hIDMuMy4yNTwvYT4KLSAqLwotcHVibGljIGNsYXNzIFBvc2l0aXZlSW50ZWdlciBleHRlbmRzIE5vbk5lZ2F0aXZlSW50ZWdlciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNDU2MjMwMTQyMzIzMTkyMDgxM0w7Ci0KLSAgICBwdWJsaWMgUG9zaXRpdmVJbnRlZ2VyKGJ5dGVbXSB2YWwpIHsKLSAgICAgICAgc3VwZXIodmFsKTsKLSAgICAgICAgY2hlY2tWYWxpZGl0eSgpOwotICAgIH0gLy8gY3RvcgotCi0gICAgcHVibGljIFBvc2l0aXZlSW50ZWdlcihpbnQgc2lnbnVtLCBieXRlW10gbWFnbml0dWRlKSB7Ci0gICAgICAgIHN1cGVyKHNpZ251bSwgbWFnbml0dWRlKTsKLSAgICAgICAgY2hlY2tWYWxpZGl0eSgpOwotICAgIH0gLy8gY3RvcgotCi0gICAgcHVibGljIFBvc2l0aXZlSW50ZWdlcihpbnQgYml0TGVuZ3RoLCBpbnQgY2VydGFpbnR5LCBSYW5kb20gcm5kKSB7Ci0gICAgICAgIHN1cGVyKGJpdExlbmd0aCwgY2VydGFpbnR5LCBybmQpOwotICAgICAgICBjaGVja1ZhbGlkaXR5KCk7Ci0gICAgfSAvLyBjdG9yCi0KLSAgICBwdWJsaWMgUG9zaXRpdmVJbnRlZ2VyKGludCBudW1CaXRzLCBSYW5kb20gcm5kKSB7Ci0gICAgICAgIHN1cGVyKG51bUJpdHMsIHJuZCk7Ci0gICAgICAgIGNoZWNrVmFsaWRpdHkoKTsKLSAgICB9IC8vIGN0b3IKLQotICAgIHB1YmxpYyBQb3NpdGl2ZUludGVnZXIoU3RyaW5nIHZhbCkgewotICAgICAgICBzdXBlcih2YWwpOwotICAgICAgICBjaGVja1ZhbGlkaXR5KCk7Ci0gICAgfQotCi0gICAgcHVibGljIFBvc2l0aXZlSW50ZWdlcihTdHJpbmcgdmFsLCBpbnQgcmFkaXgpIHsKLSAgICAgICAgc3VwZXIodmFsLCByYWRpeCk7Ci0gICAgICAgIGNoZWNrVmFsaWRpdHkoKTsKLSAgICB9IC8vIGN0b3IKLQotICAgIC8qKiB2YWxpZGF0ZSB0aGUgdmFsdWUgYWdhaW5zdCB0aGUgeHNkIGRlZmluaXRpb24gKi8KLSAgICBwcml2YXRlIEJpZ0ludGVnZXIgaU1pbkluY2x1c2l2ZSA9IG5ldyBCaWdJbnRlZ2VyKCIxIik7Ci0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tWYWxpZGl0eSgpIHsKLSAgICAgICAgaWYgKGNvbXBhcmVUbyhpTWluSW5jbHVzaXZlKSA8IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBOdW1iZXJGb3JtYXRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIC8vTWVzc2FnZXMuZ2V0TWVzc2FnZSgiYmFkcG9zSW50MDAiKQotICAgICAgICAgICAgICAgICAgICAiOiAgIiArIHRoaXMpOwotICAgICAgICB9Ci0gICAgfSAvLyBjaGVja1ZhbGlkaXR5Ci0KLSAgICAvKioKLSAgICAgKiBXb3JrLWFyb3VuZCBmb3IgaHR0cDovL2RldmVsb3Blci5qYXZhLnN1bi5jb20vZGV2ZWxvcGVyL2J1Z1BhcmFkZS9idWdzLzQzNzgzNzAuaHRtbAotICAgICAqCi0gICAgICogQHJldHVybiBCaWdJbnRlZ2VyUmVwCi0gICAgICogQHRocm93cyBqYXZhLmlvLk9iamVjdFN0cmVhbUV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3Qgd3JpdGVSZXBsYWNlKCkgdGhyb3dzIE9iamVjdFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBuZXcgQmlnSW50ZWdlclJlcCh0b0J5dGVBcnJheSgpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIEJpZ0ludGVnZXJSZXAgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZSB7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDEyNTE2NjQxNjA5MzYxNTA0OTlMOwotICAgICAgICBwcml2YXRlIGJ5dGVbXSBhcnJheTsKLQotICAgICAgICBwcm90ZWN0ZWQgQmlnSW50ZWdlclJlcChieXRlW10gYXJyYXkpIHsKLSAgICAgICAgICAgIHRoaXMuYXJyYXkgPSBhcnJheTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCBPYmplY3QgcmVhZFJlc29sdmUoKSB0aHJvd3MgamF2YS5pby5PYmplY3RTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgcmV0dXJuIG5ldyBQb3NpdGl2ZUludGVnZXIoYXJyYXkpOwotICAgICAgICB9Ci0gICAgfQotfSAvLyBjbGFzcyBOb25OZWdhdGl2ZUludGVnZXIKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9UaW1lLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvVGltZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGNjOTc2Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9UaW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzOwotCi0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci1pbXBvcnQgamF2YS51dGlsLlRpbWVab25lOwotCi0vKiogQ2xhc3MgdGhhdCByZXByZXNlbnRzIHRoZSB4c2Q6dGltZSBYTUwgU2NoZW1hIHR5cGUgKi8KLXB1YmxpYyBjbGFzcyBUaW1lIGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTkwMjIyMDE1NTU1MzU1ODk5MDhMOwotCi0gICAgcHJpdmF0ZSBDYWxlbmRhciBfdmFsdWU7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGlzRnJvbVN0cmluZzsKLSAgICBwcml2YXRlIFN0cmluZyBvcmlnaW5hbFN0cmluZzsKLQotICAgIC8qKgotICAgICAqIGEgc2hhcmVkIGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0IGluc3RhbmNlIHVzZWQgZm9yIHBhcnNpbmcgdGhlIGJhc2ljIGNvbXBvbmVudCBvZiB0aGUKLSAgICAgKiB0aW1lc3RhbXAKLSAgICAgKi8KLQotICAgIC8qKiBJbml0aWFsaXplcyB3aXRoIGEgQ2FsZW5kZXIuIFllYXIsIG1vbnRoIGFuZCBkYXRlIGFyZSBpZ25vcmVkLiAqLwotICAgIHB1YmxpYyBUaW1lKENhbGVuZGFyIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7Ci0gICAgICAgIHRoaXMuX3ZhbHVlLmNsZWFyKENhbGVuZGFyLllFQVIpOwotICAgICAgICB0aGlzLl92YWx1ZS5jbGVhcihDYWxlbmRhci5NT05USCk7Ci0gICAgICAgIHRoaXMuX3ZhbHVlLmNsZWFyKENhbGVuZGFyLkRBVEUpOwotICAgIH0KLQotICAgIC8qKiBDb252ZXJ0cyBhIHN0cmluZyBmb3JtYXR0ZWQgYXMgSEg6bW06c3NbLlNTU11bKy8tb2Zmc2V0XSAqLwotICAgIHB1YmxpYyBUaW1lKFN0cmluZyB2YWx1ZSkgdGhyb3dzIE51bWJlckZvcm1hdEV4Y2VwdGlvbiB7Ci0gICAgICAgIF92YWx1ZSA9IG1ha2VWYWx1ZSh2YWx1ZSk7Ci0gICAgICAgIHRoaXMuaXNGcm9tU3RyaW5nID0gdHJ1ZTsKLSAgICAgICAgdGhpcy5vcmlnaW5hbFN0cmluZyA9IHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHRpbWUgYXMgYSBjYWxlbmRhci4gSWdub3JlcyB0aGUgeWVhciwgbW9udGggYW5kIGRhdGUgZmllbGRzLgotICAgICAqCi0gICAgICogQHJldHVybiBSZXR1cm5zIGNhbGVuZGFyIHZhbHVlOyBtYXkgYmUgbnVsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ2FsZW5kYXIgZ2V0QXNDYWxlbmRhcigpIHsKLSAgICAgICAgcmV0dXJuIF92YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB0aW1lOyBpZ25vcmVzIHllYXIsIG1vbnRoLCBkYXRlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZGF0ZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFRpbWUoQ2FsZW5kYXIgZGF0ZSkgewotICAgICAgICB0aGlzLl92YWx1ZSA9IGRhdGU7Ci0gICAgICAgIHRoaXMuX3ZhbHVlLmNsZWFyKENhbGVuZGFyLllFQVIpOwotICAgICAgICB0aGlzLl92YWx1ZS5jbGVhcihDYWxlbmRhci5NT05USCk7Ci0gICAgICAgIHRoaXMuX3ZhbHVlLmNsZWFyKENhbGVuZGFyLkRBVEUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHRpbWUgZnJvbSBhIGRhdGUgaW5zdGFuY2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZGF0ZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFRpbWUoRGF0ZSBkYXRlKSB7Ci0gICAgICAgIF92YWx1ZS5zZXRUaW1lKGRhdGUpOwotICAgICAgICB0aGlzLl92YWx1ZS5jbGVhcihDYWxlbmRhci5ZRUFSKTsKLSAgICAgICAgdGhpcy5fdmFsdWUuY2xlYXIoQ2FsZW5kYXIuTU9OVEgpOwotICAgICAgICB0aGlzLl92YWx1ZS5jbGVhcihDYWxlbmRhci5EQVRFKTsKLSAgICB9Ci0KLSAgICAvKiogVXRpbGl0eSBmdW5jdGlvbiB0aGF0IHBhcnNlcyB4c2Q6dGltZSBzdHJpbmdzIGFuZCByZXR1cm5zIGEgRGF0ZSBvYmplY3QgKi8KLSAgICBwcml2YXRlIENhbGVuZGFyIG1ha2VWYWx1ZShTdHJpbmcgc291cmNlKSB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIHsKLQotICAgICAgICAvLyBjYW5ub25pY2FsIGZvcm0gb2YgdGhlIHRpbWVzIGlzICBoaCAnOicgbW0gJzonIHNzICgnLicgcyspPyAoenp6enp6KT8KLSAgICAgICAgaWYgKChzb3VyY2UgPT0gbnVsbCkgfHwgKHNvdXJjZS50cmltKCkubGVuZ3RoKCkgPT0gMCkpewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBzb3VyY2UgPSBzb3VyY2UudHJpbSgpOwotCi0gICAgICAgIENhbGVuZGFyIGNhbGVuZGFyID0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgY2FsZW5kYXIuY2xlYXIoKTsKLSAgICAgICAgY2FsZW5kYXIuc2V0TGVuaWVudChmYWxzZSk7Ci0gICAgICAgIGludCBob3VyID0gMDsKLSAgICAgICAgaW50IG1pbml0ZSA9IDA7Ci0gICAgICAgIGludCBzZWNvbmQgPSAwOwotICAgICAgICBsb25nIG1pbGlTZWNvbmQgPSAwOwotCi0gICAgICAgIGludCB0aW1lWm9uZU9mZlNldCA9IFRpbWVab25lLmdldERlZmF1bHQoKS5nZXRSYXdPZmZzZXQoKTsKLSAgICAgICAgIGludCBtaWxsaVNlY29uZFBhcnRMZW5ndGggPSAwOwotICAgICAgICBpZiAoc291cmNlLmxlbmd0aCgpID49IDgpIHsKLSAgICAgICAgICAgIGlmICgoc291cmNlLmNoYXJBdCgyKSAhPSAnOicgKXx8IChzb3VyY2UuY2hhckF0KDUpICE9ICc6JykpewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJJbnZhbGlkIHRpbWUgZm9ybWF0ICgiICsgc291cmNlICsgIikgaGF2aW5nIDogcyBpbiB3cm9uZyBwbGFjZXMiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGhvdXIgPSBJbnRlZ2VyLnBhcnNlSW50KHNvdXJjZS5zdWJzdHJpbmcoMCwgMikpOwotICAgICAgICAgICAgbWluaXRlID0gSW50ZWdlci5wYXJzZUludChzb3VyY2Uuc3Vic3RyaW5nKDMsIDUpKTsKLSAgICAgICAgICAgIHNlY29uZCA9IEludGVnZXIucGFyc2VJbnQoc291cmNlLnN1YnN0cmluZyg2LCA4KSk7Ci0KLQotCi0gICAgICAgICAgICBpZiAoc291cmNlLmxlbmd0aCgpID4gOCkgewotICAgICAgICAgICAgICAgIFN0cmluZyByZXN0ID0gc291cmNlLnN1YnN0cmluZyg4KTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdC5zdGFydHNXaXRoKCIuIikpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaS5lIHRoaXMgaGF2ZSB0aGUgKCcuJ3MrKSBwYXJ0Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXN0LmVuZHNXaXRoKCJaIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgaW4gZ210IHRpbWUgem9uZQotICAgICAgICAgICAgICAgICAgICAgICAgdGltZVpvbmVPZmZTZXQgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgbWlsaVNlY29uZCA9IEludGVnZXIucGFyc2VJbnQocmVzdC5zdWJzdHJpbmcoMSwgcmVzdC5sYXN0SW5kZXhPZigiWiIpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtaWxsaVNlY29uZFBhcnRMZW5ndGggPSByZXN0LnN1YnN0cmluZygxLHJlc3QubGFzdEluZGV4T2YoIloiKSkudHJpbSgpLmxlbmd0aCgpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChyZXN0Lmxhc3RJbmRleE9mKCIrIikgPiAwKSB8fCAocmVzdC5sYXN0SW5kZXhPZigiLSIpID4gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgZ2l2ZW4gaW4gYSBnZW5lcmFsIHRpbWUgemlvbmUKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0aW1lT2ZmU2V0ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN0Lmxhc3RJbmRleE9mKCIrIikgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZU9mZlNldCA9IHJlc3Quc3Vic3RyaW5nKHJlc3QubGFzdEluZGV4T2YoIisiKSArIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbGlTZWNvbmQgPSBJbnRlZ2VyLnBhcnNlSW50KHJlc3Quc3Vic3RyaW5nKDEsIHJlc3QubGFzdEluZGV4T2YoIisiKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbGxpU2Vjb25kUGFydExlbmd0aCA9IHJlc3Quc3Vic3RyaW5nKDEsIHJlc3QubGFzdEluZGV4T2YoIisiKSkudHJpbSgpLmxlbmd0aCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGtlZXAgKzEgb3IgLTEgdG8gZmluYWxseSBjYWxjdWxhdGUgdGhlIHZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZVpvbmVPZmZTZXQgPSAxOwotCi0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlc3QubGFzdEluZGV4T2YoIi0iKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lT2ZmU2V0ID0gcmVzdC5zdWJzdHJpbmcocmVzdC5sYXN0SW5kZXhPZigiLSIpICsgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlsaVNlY29uZCA9IEludGVnZXIucGFyc2VJbnQocmVzdC5zdWJzdHJpbmcoMSwgcmVzdC5sYXN0SW5kZXhPZigiLSIpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlsbGlTZWNvbmRQYXJ0TGVuZ3RoID0gcmVzdC5zdWJzdHJpbmcoMSwgcmVzdC5sYXN0SW5kZXhPZigiLSIpKS50cmltKCkubGVuZ3RoKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2Uga2VlcCArMSBvciAtMSB0byBmaW5hbGx5IGNhbGN1bGF0ZSB0aGUgdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lWm9uZU9mZlNldCA9IC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRpbWVPZmZTZXQuY2hhckF0KDIpICE9ICc6JykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJpbnZhbGlkIHRpbWUgem9uZSBmb3JtYXQgKCIgKyBzb3VyY2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIikgd2l0aG91dCA6IGF0IGNvcnJlY3QgcGxhY2UiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBob3VycyA9IEludGVnZXIucGFyc2VJbnQodGltZU9mZlNldC5zdWJzdHJpbmcoMCwgMikpOwotICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1pbml0cyA9IEludGVnZXIucGFyc2VJbnQodGltZU9mZlNldC5zdWJzdHJpbmcoMywgNSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgdGltZVpvbmVPZmZTZXQgPSAoKGhvdXJzICogNjApICsgbWluaXRzKSAqIDYwMDAwICogdGltZVpvbmVPZmZTZXQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGkuZSBpdCBkb2VzIG5vdCBoYXZlIHRpbWUgem9uZQotICAgICAgICAgICAgICAgICAgICAgICAgbWlsaVNlY29uZCA9IEludGVnZXIucGFyc2VJbnQocmVzdC5zdWJzdHJpbmcoMSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgbWlsbGlTZWNvbmRQYXJ0TGVuZ3RoID0gcmVzdC5zdWJzdHJpbmcoMSkudHJpbSgpLmxlbmd0aCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAocmVzdC5zdGFydHNXaXRoKCJaIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgaW4gZ210IHRpbWUgem9uZQotICAgICAgICAgICAgICAgICAgICAgICAgdGltZVpvbmVPZmZTZXQgPSAwOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlc3Quc3RhcnRzV2l0aCgiKyIpIHx8IHJlc3Quc3RhcnRzV2l0aCgiLSIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIGdpdmVuIGluIGEgZ2VuZXJhbCB0aW1lIHppb25lCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdC5jaGFyQXQoMykgIT0gJzonKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImludmFsaWQgdGltZSB6b25lIGZvcm1hdCAoIiArIHNvdXJjZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiKSB3aXRob3V0IDogYXQgY29ycmVjdCBwbGFjZSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhvdXJzID0gSW50ZWdlci5wYXJzZUludChyZXN0LnN1YnN0cmluZygxLCAzKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWluaXRzID0gSW50ZWdlci5wYXJzZUludChyZXN0LnN1YnN0cmluZyg0LCA2KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aW1lWm9uZU9mZlNldCA9ICgoaG91cnMgKiA2MCkgKyBtaW5pdHMpICogNjAwMDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdC5zdGFydHNXaXRoKCItIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lWm9uZU9mZlNldCA9IHRpbWVab25lT2ZmU2V0ICogLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTnVtYmVyRm9ybWF0RXhjZXB0aW9uKCJpbiB2YWxpZCB0aW1lIHpvbmUgYXR0cmlidXRlIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiaW52YWxpZCBtZXNzYWdlIHN0cmluZyIpOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FsZW5kYXIuc2V0KENhbGVuZGFyLkhPVVJfT0ZfREFZLCBob3VyKTsKLSAgICAgICAgY2FsZW5kYXIuc2V0KENhbGVuZGFyLk1JTlVURSwgbWluaXRlKTsKLSAgICAgICAgY2FsZW5kYXIuc2V0KENhbGVuZGFyLlNFQ09ORCwgc2Vjb25kKTsKLSAgICAgICAgaWYgKG1pbGxpU2Vjb25kUGFydExlbmd0aCAhPSAzKSB7Ci0gICAgICAgICAgICAvLyBtaWxpc2Vjb25kIHBhcnQgcmVwcmVzZW5zdCB0aGUgZnJhY3Rpb24gb2YgdGhlIHNlY29uZCBzbyB3ZSBoYXZlIHRvCi0gICAgICAgICAgICAvLyBmaW5kIHRoZSBmcmFjdGlvbiBhbmQgbXVsdGlwbHkgaXQgYnkgMTAwMC4gU28gaWYgbWlsaXNlY29uZCBwYXJ0Ci0gICAgICAgICAgICAvLyBoYXMgdGhyZWUgZGlnaXRzIG5vdGhpbmcgcmVxdWlyZWQKLSAgICAgICAgICAgIG1pbGlTZWNvbmQgPSBtaWxpU2Vjb25kICogMTAwMDsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWlsbGlTZWNvbmRQYXJ0TGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBtaWxpU2Vjb25kID0gbWlsaVNlY29uZCAvIDEwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhbGVuZGFyLnNldChDYWxlbmRhci5NSUxMSVNFQ09ORCwgKGludCltaWxpU2Vjb25kKTsKLSAgICAgICAgY2FsZW5kYXIuc2V0KENhbGVuZGFyLlpPTkVfT0ZGU0VULCB0aW1lWm9uZU9mZlNldCk7Ci0gICAgICAgIGNhbGVuZGFyLnNldChDYWxlbmRhci5EU1RfT0ZGU0VULCAwKTsKLQotICAgICAgICByZXR1cm4gY2FsZW5kYXI7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0aW1lIGFzIGl0IHdvdWxkIGJlIGluIEdNVC4gVGhpcyBpcyBhY2N1cmF0ZSB0byB0aGUgc2Vjb25kcy4gTWlsbGlzZWNvbmRzCi0gICAgICogcHJvYmFibHkgZ2V0cyBsb3N0LgotICAgICAqCi0gICAgICogQHJldHVybiBSZXR1cm5zIFN0cmluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBpZiAoX3ZhbHVlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiAidW5hc3NpZ25lZCBUaW1lIjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpc0Zyb21TdHJpbmcpIHsKLSAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbFN0cmluZzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFN0cmluZ0J1ZmZlciB0aW1lU3RyaW5nID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgQ29udmVydGVyVXRpbC5hcHBlbmRUaW1lKF92YWx1ZSx0aW1lU3RyaW5nKTsKLSAgICAgICAgICAgIENvbnZlcnRlclV0aWwuYXBwZW5kVGltZVpvbmUoX3ZhbHVlLHRpbWVTdHJpbmcpOwotICAgICAgICAgICAgcmV0dXJuIHRpbWVTdHJpbmcudG9TdHJpbmcoKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLSAgICAgICAgaWYgKG9iaiA9PSBudWxsKSByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIFRpbWUpKSByZXR1cm4gZmFsc2U7Ci0gICAgICAgIFRpbWUgb3RoZXIgPSAoVGltZSlvYmo7Ci0gICAgICAgIGlmICh0aGlzID09IG9iaikgcmV0dXJuIHRydWU7Ci0KLSAgICAgICAgYm9vbGVhbiBfZXF1YWxzOwotICAgICAgICBfZXF1YWxzID0gKChfdmFsdWUgPT0gbnVsbCAmJiBvdGhlci5fdmFsdWUgPT0gbnVsbCkgfHwKLSAgICAgICAgICAgICAgICAoX3ZhbHVlICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIF92YWx1ZS5nZXRUaW1lKCkuZXF1YWxzKG90aGVyLl92YWx1ZS5nZXRUaW1lKCkpKSk7Ci0KLSAgICAgICAgcmV0dXJuIF9lcXVhbHM7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBoYXNoY29kZSBvZiB0aGUgdW5kZXJseWluZyBjYWxlbmRhci4KLSAgICAgKgotICAgICAqIEByZXR1cm4gUmV0dXJucyBhbiA8Y29kZT5pbnQ8L2NvZGU+IHZhbHVlLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgIHJldHVybiBfdmFsdWUgPT0gbnVsbCA/IDAgOiBfdmFsdWUuaGFzaENvZGUoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvVG9rZW4uamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9Ub2tlbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjQxOTE4Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9Ub2tlbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlczsKLQotLyoqCi0gKiBDdXN0b20gY2xhc3MgZm9yIHN1cHBvcnRpbmcgcHJpbWl0aXZlIFhTRCBkYXRhIHR5cGUgVG9rZW4uIHRva2VuIHJlcHJlc2VudHMgdG9rZW5pemVkIHN0cmluZ3MuCi0gKiBUaGUgYmFzZSB0eXBlIG9mIHRva2VuIGlzIG5vcm1hbGl6ZWRTdHJpbmcuCi0gKgotICogQHNlZSA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jdG9rZW4iPlhNTCBTY2hlbWEgMy4zLjI8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBUb2tlbiBleHRlbmRzIE5vcm1hbGl6ZWRTdHJpbmcgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTczNzA1MjQ3NDA1MTQ0NjU0NjdMOwotCi0gICAgcHVibGljIFRva2VuKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGN0b3IgZm9yIFRva2VuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB3aWxsIGJlIHRocm93biBpZiB2YWxpZGF0aW9uIGZhaWxzCi0gICAgICovCi0gICAgcHVibGljIFRva2VuKFN0cmluZyBzdFZhbHVlKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNldFZhbHVlKHN0VmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gcmVjYXN0IG5vcm1hbGl6ZWRTdHJpbmcgZXhjZXB0aW9uIGFzIHRva2VuIGV4Y2VwdGlvbgotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgLy9NZXNzYWdlcy5nZXRNZXNzYWdlKCJiYWRUb2tlbjAwIikgKwotICAgICAgICAgICAgICAgICAgICAiZGF0YT1bIiArIHN0VmFsdWUgKyAiXSIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogdmFsaWRhdGUgdGhlIHZhbHVlIGFnYWluc3QgdGhlIHhzZCBkZWZpbml0aW9uCi0gICAgICogPHAvPgotICAgICAqIFRoZSB2YWx1ZSBzcGFjZSBvZiB0b2tlbiBpcyB0aGUgc2V0IG9mIHN0cmluZ3MgdGhhdCBkbyBub3QgY29udGFpbiB0aGUgbGluZSBmZWVkICgjeEEpIG5vcgotICAgICAqIHRhYiAoI3g5KSBjaGFyYWN0ZXJzLCB0aGF0IGhhdmUgbm8gbGVhZGluZyBvciB0cmFpbGluZyBzcGFjZXMgKCN4MjApIGFuZCB0aGF0IGhhdmUgbm8KLSAgICAgKiBpbnRlcm5hbCBzZXF1ZW5jZXMgb2YgdHdvIG9yIG1vcmUgc3BhY2VzLiBUaGUgbGV4aWNhbCBzcGFjZSBvZiB0b2tlbiBpcyB0aGUgc2V0IG9mIHN0cmluZ3MKLSAgICAgKiB0aGF0IGRvIG5vdCBjb250YWluIHRoZSBsaW5lIGZlZWQgKCN4QSkgbm9yIHRhYiAoI3g5KSBjaGFyYWN0ZXJzLCB0aGF0IGhhdmUgbm8gbGVhZGluZyBvcgotICAgICAqIHRyYWlsaW5nIHNwYWNlcyAoI3gyMCkgYW5kIHRoYXQgaGF2ZSBubyBpbnRlcm5hbCBzZXF1ZW5jZXMgb2YgdHdvIG9yIG1vcmUgc3BhY2VzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkKFN0cmluZyBzdFZhbHVlKSB7Ci0gICAgICAgIGludCBzY2FuOwotICAgICAgICAvLyBjaGVjayB0byBzZWUgaWYgd2UgaGF2ZSBhIHN0cmluZyB0byByZXZpZXcKLSAgICAgICAgaWYgKChzdFZhbHVlID09IG51bGwpIHx8IChzdFZhbHVlLmxlbmd0aCgpID09IDApKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAgICAgLy8gbm8gbGVhZGluZyBzcGFjZQotICAgICAgICBpZiAoc3RWYWx1ZS5jaGFyQXQoMCkgPT0gMHgyMCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICAvLyBubyB0cmFpbCBzcGFjZQotICAgICAgICBpZiAoc3RWYWx1ZS5jaGFyQXQoc3RWYWx1ZS5sZW5ndGgoKSAtIDEpID09IDB4MjApCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgZm9yIChzY2FuID0gMDsgc2NhbiA8IHN0VmFsdWUubGVuZ3RoKCk7IHNjYW4rKykgewotICAgICAgICAgICAgY2hhciBjRGlnaXQgPSBzdFZhbHVlLmNoYXJBdChzY2FuKTsKLSAgICAgICAgICAgIHN3aXRjaCAoY0RpZ2l0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAweDA5OgotICAgICAgICAgICAgICAgIGNhc2UgMHgwQToKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIGNhc2UgMHgyMDoKLSAgICAgICAgICAgICAgICAgICAgLy8gbm8gZG91YmxzcGFjZQotICAgICAgICAgICAgICAgICAgICBpZiAoc2NhbiArIDEgPCBzdFZhbHVlLmxlbmd0aCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0VmFsdWUuY2hhckF0KHNjYW4gKyAxKSA9PSAweDIwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHZhbGlkYXRlcyB0aGUgZGF0YSBhbmQgc2V0cyB0aGUgdmFsdWUgZm9yIHRoZSBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3RWYWx1ZSBTdHJpbmcgdmFsdWUKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBpbnZhbGlkIGZvcm1hdAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBzdFZhbHVlKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFUb2tlbi5pc1ZhbGlkKHN0VmFsdWUpKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgLy9NZXNzYWdlcy5nZXRNZXNzYWdlKCJiYWRUb2tlbjAwIikgKwotICAgICAgICAgICAgICAgICAgICAiIGRhdGE9WyIgKyBzdFZhbHVlICsgIl0iKTsKLSAgICAgICAgbV92YWx1ZSA9IHN0VmFsdWU7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvVVJJLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvVVJJLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyYTMyMzMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL1VSSS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgyMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXM7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotCi0vKioKLSAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogPGk+QXhpcyBOb3RlOiBUaGlzIGNsYXNzIHdhcwotICogJ2JvcnJvd2VkJyBmcm9tIFhlcmNlcyAyLjAuMjwvaT4KLSAqIDxwLz4KLSAqIEEgY2xhc3MgdG8gcmVwcmVzZW50IGEgVW5pZm9ybSBSZXNvdXJjZSBJZGVudGlmaWVyIChVUkkpLiBUaGlzIGNsYXNzIGlzIGRlc2lnbmVkIHRvIGhhbmRsZSB0aGUKLSAqIHBhcnNpbmcgb2YgVVJJcyBhbmQgcHJvdmlkZSBhY2Nlc3MgdG8gdGhlIHZhcmlvdXMgY29tcG9uZW50cyAoc2NoZW1lLCBob3N0LCBwb3J0LCB1c2VyaW5mbywKLSAqIHBhdGgsIHF1ZXJ5IHN0cmluZyBhbmQgZnJhZ21lbnQpIHRoYXQgbWF5IGNvbnN0aXR1dGUgYSBVUkkuCi0gKiA8cC8+Ci0gKiBQYXJzaW5nIG9mIGEgVVJJIHNwZWNpZmljYXRpb24gaXMgZG9uZSBhY2NvcmRpbmcgdG8gdGhlIFVSSSBzeW50YXggZGVzY3JpYmVkIGluIDxhCi0gKiBocmVmPSJodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMyMzk2LnR4dD9udW1iZXI9MjM5NiI+UkZDIDIzOTY8L2E+LCBhbmQgYW1lbmRlZCBieSA8YQotICogaHJlZj0iaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMjczMi50eHQ/bnVtYmVyPTI3MzIiPlJGQyAyNzMyPC9hPi4KLSAqIDxwLz4KLSAqIEV2ZXJ5IGFic29sdXRlIFVSSSBjb25zaXN0cyBvZiBhIHNjaGVtZSwgZm9sbG93ZWQgYnkgYSBjb2xvbiAoJzonKSwgZm9sbG93ZWQgYnkgYQotICogc2NoZW1lLXNwZWNpZmljIHBhcnQuIEZvciBVUklzIHRoYXQgZm9sbG93IHRoZSAiZ2VuZXJpYyBVUkkiIHN5bnRheCwgdGhlIHNjaGVtZS1zcGVjaWZpYyBwYXJ0Ci0gKiBiZWdpbnMgd2l0aCB0d28gc2xhc2hlcyAoIi8vIikgYW5kIG1heSBiZSBmb2xsb3dlZCBieSBhbiBhdXRob3JpdHkgc2VnbWVudCAoY29tcHJpc2VkIG9mIHVzZXIKLSAqIGluZm9ybWF0aW9uLCBob3N0LCBhbmQgcG9ydCksIHBhdGggc2VnbWVudCwgcXVlcnkgc2VnbWVudCBhbmQgZnJhZ21lbnQuIE5vdGUgdGhhdCBSRkMgMjM5NiBubwotICogbG9uZ2VyIHNwZWNpZmllcyB0aGUgdXNlIG9mIHRoZSBwYXJhbWV0ZXJzIHNlZ21lbnQgYW5kIGV4Y2x1ZGVzIHRoZSAidXNlcjpwYXNzd29yZCIgc3ludGF4IGFzCi0gKiBwYXJ0IG9mIHRoZSBhdXRob3JpdHkgc2VnbWVudC4gSWYgInVzZXI6cGFzc3dvcmQiIGFwcGVhcnMgaW4gYSBVUkksIHRoZSBlbnRpcmUgdXNlci9wYXNzd29yZAotICogc3RyaW5nIGlzIHN0b3JlZCBhcyB1c2VyaW5mby4KLSAqIDxwLz4KLSAqIEZvciBVUklzIHRoYXQgZG8gbm90IGZvbGxvdyB0aGUgImdlbmVyaWMgVVJJIiBzeW50YXggKGUuZy4gbWFpbHRvKSwgdGhlIGVudGlyZSBzY2hlbWUtc3BlY2lmaWMKLSAqIHBhcnQgaXMgdHJlYXRlZCBhcyB0aGUgInBhdGgiIHBvcnRpb24gb2YgdGhlIFVSSS4KLSAqIDxwLz4KLSAqIE5vdGUgdGhhdCwgdW5saWtlIHRoZSBqYXZhLm5ldC5VUkwgY2xhc3MsIHRoaXMgY2xhc3MgZG9lcyBub3QgcHJvdmlkZSBhbnkgYnVpbHQtaW4gbmV0d29yawotICogYWNjZXNzIGZ1bmN0aW9uYWxpdHkgbm9yIGRvZXMgaXQgcHJvdmlkZSBhbnkgc2NoZW1lLXNwZWNpZmljIGZ1bmN0aW9uYWxpdHkgKGZvciBleGFtcGxlLCBpdCBkb2VzCi0gKiBub3Qga25vdyBhIGRlZmF1bHQgcG9ydCBmb3IgYSBzcGVjaWZpYyBzY2hlbWUpLiBSYXRoZXIsIGl0IG9ubHkga25vd3MgdGhlIGdyYW1tYXIgYW5kIGJhc2ljIHNldAotICogb2Ygb3BlcmF0aW9ucyB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGEgVVJJLgotICogPHAvPgotICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotcHVibGljIGNsYXNzIFVSSSBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAyMTcyMzA2MDQ0MzYxMjI3NjI3TDsKLQotCi0gICAgLyoqCi0gICAgICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBNYWxmb3JtZWRVUklFeGNlcHRpb25zIGFyZQotICAgICAqIHRocm93biBpbiB0aGUgcHJvY2VzcyBvZiBidWlsZGluZyBhIFVSSSBvciBzZXR0aW5nIGZpZWxkcyBvbiBhIFVSSSB3aGVuIGFuIG9wZXJhdGlvbiB3b3VsZAotICAgICAqIHJlc3VsdCBpbiBhbiBpbnZhbGlkIFVSSSBzcGVjaWZpY2F0aW9uLgotICAgICAqIDxwLz4KLSAgICAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE1hbGZvcm1lZFVSSUV4Y2VwdGlvbiBleHRlbmRzIElPRXhjZXB0aW9uIHsKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtODQ4ODY5Mjc2MDk3NTc2ODc1N0w7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBDb25zdHJ1Y3RzIGEKLSAgICAgICAgICogPGNvZGU+TWFsZm9ybWVkVVJJRXhjZXB0aW9uPC9jb2RlPiB3aXRoIG5vIHNwZWNpZmllZCBkZXRhaWwgbWVzc2FnZS4KLSAgICAgICAgICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIE1hbGZvcm1lZFVSSUV4Y2VwdGlvbigpIHsKLSAgICAgICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogQ29uc3RydWN0cyBhCi0gICAgICAgICAqIDxjb2RlPk1hbGZvcm1lZFVSSUV4Y2VwdGlvbjwvY29kZT4gd2l0aCB0aGUgc3BlY2lmaWVkIGRldGFpbCBtZXNzYWdlLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gcF9tc2cgdGhlIGRldGFpbCBtZXNzYWdlLiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgTWFsZm9ybWVkVVJJRXhjZXB0aW9uKFN0cmluZyBwX21zZykgewotICAgICAgICAgICAgc3VwZXIocF9tc2cpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBbXSBmZ0xvb2t1cFRhYmxlID0gbmV3IGJ5dGVbMTI4XTsKLQotICAgIC8qKgotICAgICAqIENoYXJhY3RlciBDbGFzc2VzCi0gICAgICovCi0KLSAgICAvKiogcmVzZXJ2ZWQgY2hhcmFjdGVycyA7Lz86QCY9KyQsW10gKi8KLSAgICAvL1JGQyAyNzMyIGFkZGVkICdbJyBhbmQgJ10nIGFzIHJlc2VydmVkIGNoYXJhY3RlcnMKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkVTRVJWRURfQ0hBUkFDVEVSUyA9IDB4MDE7Ci0KLSAgICAvKioKLSAgICAgKiBVUkkgcHVuY3R1YXRpb24gbWFyayBjaGFyYWN0ZXJzOiAtXy4hfionKCkgLSB0aGVzZSwgY29tYmluZWQgd2l0aCBhbHBoYW51bWVyaWNzLCBjb25zdGl0dXRlIHRoZQotICAgICAqICJ1bnJlc2VydmVkIiBjaGFyYWN0ZXJzCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BUktfQ0hBUkFDVEVSUyA9IDB4MDI7Ci0KLSAgICAvKiogc2NoZW1lIGNhbiBiZSBjb21wb3NlZCBvZiBhbHBoYW51bWVyaWNzIGFuZCB0aGVzZSBjaGFyYWN0ZXJzOiArLS4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0NIRU1FX0NIQVJBQ1RFUlMgPSAweDA0OwotCi0gICAgLyoqIHVzZXJpbmZvIGNhbiBiZSBjb21wb3NlZCBvZiB1bnJlc2VydmVkLCBlc2NhcGVkIGFuZCB0aGVzZSBjaGFyYWN0ZXJzOiA7OiY9KyQsICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFVTRVJJTkZPX0NIQVJBQ1RFUlMgPSAweDA4OwotCi0gICAgLyoqIEFTQ0lJIGxldHRlciBjaGFyYWN0ZXJzICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFTQ0lJX0FMUEhBX0NIQVJBQ1RFUlMgPSAweDEwOwotCi0gICAgLyoqIEFTQ0lJIGRpZ2l0IGNoYXJhY3RlcnMgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQVNDSUlfRElHSVRfQ0hBUkFDVEVSUyA9IDB4MjA7Ci0KLSAgICAvKiogQVNDSUkgaGV4IGNoYXJhY3RlcnMgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQVNDSUlfSEVYX0NIQVJBQ1RFUlMgPSAweDQwOwotCi0gICAgLyoqIFBhdGggY2hhcmFjdGVycyAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQQVRIX0NIQVJBQ1RFUlMgPSAweDgwOwotCi0gICAgLyoqIE1hc2sgZm9yIGFscGhhLW51bWVyaWMgY2hhcmFjdGVycyAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVNLX0FMUEhBX05VTUVSSUMgPSBBU0NJSV9BTFBIQV9DSEFSQUNURVJTIHwgQVNDSUlfRElHSVRfQ0hBUkFDVEVSUzsKLQotICAgIC8qKiBNYXNrIGZvciB1bnJlc2VydmVkIGNoYXJhY3RlcnMgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFTS19VTlJFU0VSVkVEX01BU0sgPSBNQVNLX0FMUEhBX05VTUVSSUMgfCBNQVJLX0NIQVJBQ1RFUlM7Ci0KLSAgICAvKiogTWFzayBmb3IgVVJJIGFsbG93YWJsZSBjaGFyYWN0ZXJzIGV4Y2VwdCBmb3IgJSAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVNLX1VSSV9DSEFSQUNURVIgPSBNQVNLX1VOUkVTRVJWRURfTUFTSyB8IFJFU0VSVkVEX0NIQVJBQ1RFUlM7Ci0KLSAgICAvKiogTWFzayBmb3Igc2NoZW1lIGNoYXJhY3RlcnMgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFTS19TQ0hFTUVfQ0hBUkFDVEVSID0gTUFTS19BTFBIQV9OVU1FUklDIHwgU0NIRU1FX0NIQVJBQ1RFUlM7Ci0KLSAgICAvKiogTWFzayBmb3IgdXNlcmluZm8gY2hhcmFjdGVycyAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVNLX1VTRVJJTkZPX0NIQVJBQ1RFUiA9IE1BU0tfVU5SRVNFUlZFRF9NQVNLIHwgVVNFUklORk9fQ0hBUkFDVEVSUzsKLQotICAgIC8qKiBNYXNrIGZvciBwYXRoIGNoYXJhY3RlcnMgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFTS19QQVRIX0NIQVJBQ1RFUiA9IE1BU0tfVU5SRVNFUlZFRF9NQVNLIHwgUEFUSF9DSEFSQUNURVJTOwotCi0gICAgc3RhdGljIHsKLSAgICAgICAgLy8gQWRkIEFTQ0lJIERpZ2l0cyBhbmQgQVNDSUkgSGV4IE51bWJlcnMKLSAgICAgICAgZm9yIChpbnQgaSA9ICcwJzsgaSA8PSAnOSc7ICsraSkgewotICAgICAgICAgICAgZmdMb29rdXBUYWJsZVtpXSB8PSBBU0NJSV9ESUdJVF9DSEFSQUNURVJTIHwgQVNDSUlfSEVYX0NIQVJBQ1RFUlM7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBBZGQgQVNDSUkgTGV0dGVycyBhbmQgQVNDSUkgSGV4IE51bWJlcnMKLSAgICAgICAgZm9yIChpbnQgaSA9ICdBJzsgaSA8PSAnRic7ICsraSkgewotICAgICAgICAgICAgZmdMb29rdXBUYWJsZVtpXSB8PSBBU0NJSV9BTFBIQV9DSEFSQUNURVJTIHwgQVNDSUlfSEVYX0NIQVJBQ1RFUlM7Ci0gICAgICAgICAgICBmZ0xvb2t1cFRhYmxlW2kgKyAweDAwMDAwMDIwXSB8PSBBU0NJSV9BTFBIQV9DSEFSQUNURVJTIHwgQVNDSUlfSEVYX0NIQVJBQ1RFUlM7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBBZGQgQVNDSUkgTGV0dGVycwotICAgICAgICBmb3IgKGludCBpID0gJ0cnOyBpIDw9ICdaJzsgKytpKSB7Ci0gICAgICAgICAgICBmZ0xvb2t1cFRhYmxlW2ldIHw9IEFTQ0lJX0FMUEhBX0NIQVJBQ1RFUlM7Ci0gICAgICAgICAgICBmZ0xvb2t1cFRhYmxlW2kgKyAweDAwMDAwMDIwXSB8PSBBU0NJSV9BTFBIQV9DSEFSQUNURVJTOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQWRkIFJlc2VydmVkIENoYXJhY3RlcnMKLSAgICAgICAgZmdMb29rdXBUYWJsZVsnOyddIHw9IFJFU0VSVkVEX0NIQVJBQ1RFUlM7Ci0gICAgICAgIGZnTG9va3VwVGFibGVbJy8nXSB8PSBSRVNFUlZFRF9DSEFSQUNURVJTOwotICAgICAgICBmZ0xvb2t1cFRhYmxlWyc/J10gfD0gUkVTRVJWRURfQ0hBUkFDVEVSUzsKLSAgICAgICAgZmdMb29rdXBUYWJsZVsnOiddIHw9IFJFU0VSVkVEX0NIQVJBQ1RFUlM7Ci0gICAgICAgIGZnTG9va3VwVGFibGVbJ0AnXSB8PSBSRVNFUlZFRF9DSEFSQUNURVJTOwotICAgICAgICBmZ0xvb2t1cFRhYmxlWycmJ10gfD0gUkVTRVJWRURfQ0hBUkFDVEVSUzsKLSAgICAgICAgZmdMb29rdXBUYWJsZVsnPSddIHw9IFJFU0VSVkVEX0NIQVJBQ1RFUlM7Ci0gICAgICAgIGZnTG9va3VwVGFibGVbJysnXSB8PSBSRVNFUlZFRF9DSEFSQUNURVJTOwotICAgICAgICBmZ0xvb2t1cFRhYmxlWyckJ10gfD0gUkVTRVJWRURfQ0hBUkFDVEVSUzsKLSAgICAgICAgZmdMb29rdXBUYWJsZVsnLCddIHw9IFJFU0VSVkVEX0NIQVJBQ1RFUlM7Ci0gICAgICAgIGZnTG9va3VwVGFibGVbJ1snXSB8PSBSRVNFUlZFRF9DSEFSQUNURVJTOwotICAgICAgICBmZ0xvb2t1cFRhYmxlWyddJ10gfD0gUkVTRVJWRURfQ0hBUkFDVEVSUzsKLQotICAgICAgICAvLyBBZGQgTWFyayBDaGFyYWN0ZXJzCi0gICAgICAgIGZnTG9va3VwVGFibGVbJy0nXSB8PSBNQVJLX0NIQVJBQ1RFUlM7Ci0gICAgICAgIGZnTG9va3VwVGFibGVbJ18nXSB8PSBNQVJLX0NIQVJBQ1RFUlM7Ci0gICAgICAgIGZnTG9va3VwVGFibGVbJy4nXSB8PSBNQVJLX0NIQVJBQ1RFUlM7Ci0gICAgICAgIGZnTG9va3VwVGFibGVbJyEnXSB8PSBNQVJLX0NIQVJBQ1RFUlM7Ci0gICAgICAgIGZnTG9va3VwVGFibGVbJ34nXSB8PSBNQVJLX0NIQVJBQ1RFUlM7Ci0gICAgICAgIGZnTG9va3VwVGFibGVbJyonXSB8PSBNQVJLX0NIQVJBQ1RFUlM7Ci0gICAgICAgIGZnTG9va3VwVGFibGVbJ1wnJ10gfD0gTUFSS19DSEFSQUNURVJTOwotICAgICAgICBmZ0xvb2t1cFRhYmxlWycoJ10gfD0gTUFSS19DSEFSQUNURVJTOwotICAgICAgICBmZ0xvb2t1cFRhYmxlWycpJ10gfD0gTUFSS19DSEFSQUNURVJTOwotCi0gICAgICAgIC8vIEFkZCBTY2hlbWUgQ2hhcmFjdGVycwotICAgICAgICBmZ0xvb2t1cFRhYmxlWycrJ10gfD0gU0NIRU1FX0NIQVJBQ1RFUlM7Ci0gICAgICAgIGZnTG9va3VwVGFibGVbJy0nXSB8PSBTQ0hFTUVfQ0hBUkFDVEVSUzsKLSAgICAgICAgZmdMb29rdXBUYWJsZVsnLiddIHw9IFNDSEVNRV9DSEFSQUNURVJTOwotCi0gICAgICAgIC8vIEFkZCBVc2VyaW5mbyBDaGFyYWN0ZXJzCi0gICAgICAgIGZnTG9va3VwVGFibGVbJzsnXSB8PSBVU0VSSU5GT19DSEFSQUNURVJTOwotICAgICAgICBmZ0xvb2t1cFRhYmxlWyc6J10gfD0gVVNFUklORk9fQ0hBUkFDVEVSUzsKLSAgICAgICAgZmdMb29rdXBUYWJsZVsnJiddIHw9IFVTRVJJTkZPX0NIQVJBQ1RFUlM7Ci0gICAgICAgIGZnTG9va3VwVGFibGVbJz0nXSB8PSBVU0VSSU5GT19DSEFSQUNURVJTOwotICAgICAgICBmZ0xvb2t1cFRhYmxlWycrJ10gfD0gVVNFUklORk9fQ0hBUkFDVEVSUzsKLSAgICAgICAgZmdMb29rdXBUYWJsZVsnJCddIHw9IFVTRVJJTkZPX0NIQVJBQ1RFUlM7Ci0gICAgICAgIGZnTG9va3VwVGFibGVbJywnXSB8PSBVU0VSSU5GT19DSEFSQUNURVJTOwotCi0gICAgICAgIC8vIEFkZCBQYXRoIENoYXJhY3RlcnMKLSAgICAgICAgZmdMb29rdXBUYWJsZVsnOyddIHw9IFBBVEhfQ0hBUkFDVEVSUzsKLSAgICAgICAgZmdMb29rdXBUYWJsZVsnLyddIHw9IFBBVEhfQ0hBUkFDVEVSUzsKLSAgICAgICAgZmdMb29rdXBUYWJsZVsnOiddIHw9IFBBVEhfQ0hBUkFDVEVSUzsKLSAgICAgICAgZmdMb29rdXBUYWJsZVsnQCddIHw9IFBBVEhfQ0hBUkFDVEVSUzsKLSAgICAgICAgZmdMb29rdXBUYWJsZVsnJiddIHw9IFBBVEhfQ0hBUkFDVEVSUzsKLSAgICAgICAgZmdMb29rdXBUYWJsZVsnPSddIHw9IFBBVEhfQ0hBUkFDVEVSUzsKLSAgICAgICAgZmdMb29rdXBUYWJsZVsnKyddIHw9IFBBVEhfQ0hBUkFDVEVSUzsKLSAgICAgICAgZmdMb29rdXBUYWJsZVsnJCddIHw9IFBBVEhfQ0hBUkFDVEVSUzsKLSAgICAgICAgZmdMb29rdXBUYWJsZVsnLCddIHw9IFBBVEhfQ0hBUkFDVEVSUzsKLSAgICB9Ci0KLSAgICAvKiogU3RvcmVzIHRoZSBzY2hlbWUgKHVzdWFsbHkgdGhlIHByb3RvY29sKSBmb3IgdGhpcyBVUkkuICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgbV9zY2hlbWUgPSBudWxsOwotCi0gICAgLyoqIElmIHNwZWNpZmllZCwgc3RvcmVzIHRoZSB1c2VyaW5mbyBmb3IgdGhpcyBVUkk7IG90aGVyd2lzZSBudWxsICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgbV91c2VyaW5mbyA9IG51bGw7Ci0KLSAgICAvKiogSWYgc3BlY2lmaWVkLCBzdG9yZXMgdGhlIGhvc3QgZm9yIHRoaXMgVVJJOyBvdGhlcndpc2UgbnVsbCAqLwotICAgIHByaXZhdGUgU3RyaW5nIG1faG9zdCA9IG51bGw7Ci0KLSAgICAvKiogSWYgc3BlY2lmaWVkLCBzdG9yZXMgdGhlIHBvcnQgZm9yIHRoaXMgVVJJOyBvdGhlcndpc2UgLTEgKi8KLSAgICBwcml2YXRlIGludCBtX3BvcnQgPSAtMTsKLQotICAgIC8qKiBJZiBzcGVjaWZpZWQsIHN0b3JlcyB0aGUgcmVnaXN0cnkgYmFzZWQgYXV0aG9yaXR5IGZvciB0aGlzIFVSSTsgb3RoZXJ3aXNlIC0xICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgbV9yZWdBdXRob3JpdHkgPSBudWxsOwotCi0gICAgLyoqIElmIHNwZWNpZmllZCwgc3RvcmVzIHRoZSBwYXRoIGZvciB0aGlzIFVSSTsgb3RoZXJ3aXNlIG51bGwgKi8KLSAgICBwcml2YXRlIFN0cmluZyBtX3BhdGggPSBudWxsOwotCi0gICAgLyoqIElmIHNwZWNpZmllZCwgc3RvcmVzIHRoZSBxdWVyeSBzdHJpbmcgZm9yIHRoaXMgVVJJOyBvdGhlcndpc2UgbnVsbC4gKi8KLSAgICBwcml2YXRlIFN0cmluZyBtX3F1ZXJ5U3RyaW5nID0gbnVsbDsKLQotICAgIC8qKiBJZiBzcGVjaWZpZWQsIHN0b3JlcyB0aGUgZnJhZ21lbnQgZm9yIHRoaXMgVVJJOyBvdGhlcndpc2UgbnVsbCAqLwotICAgIHByaXZhdGUgU3RyaW5nIG1fZnJhZ21lbnQ7Ci0KLSAgICAvKiogQ29uc3RydWN0IGEgbmV3IGFuZCB1bmluaXRpYWxpemVkIFVSSS4gKi8KLSAgICBwdWJsaWMgVVJJKCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdCBhIG5ldyBVUkkgZnJvbSBhbm90aGVyIFVSSS4gQWxsIGZpZWxkcyBmb3IgdGhpcyBVUkkgYXJlIHNldCBlcXVhbCB0byB0aGUgZmllbGRzIG9mCi0gICAgICogdGhlIFVSSSBwYXNzZWQgaW4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcF9vdGhlciB0aGUgVVJJIHRvIGNvcHkgKGNhbm5vdCBiZSBudWxsKQotICAgICAqLwotICAgIHB1YmxpYyBVUkkoVVJJIHBfb3RoZXIpIHsKLSAgICAgICAgaW5pdGlhbGl6ZShwX290aGVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgVVJJIGZyb20gYSBVUkkgc3BlY2lmaWNhdGlvbiBzdHJpbmcuIElmIHRoZSBzcGVjaWZpY2F0aW9uIGZvbGxvd3MgdGhlICJnZW5lcmljCi0gICAgICogVVJJIiBzeW50YXgsICh0d28gc2xhc2hlcyBmb2xsb3dpbmcgdGhlIGZpcnN0IGNvbG9uKSwgdGhlIHNwZWNpZmljYXRpb24gd2lsbCBiZSBwYXJzZWQKLSAgICAgKiBhY2NvcmRpbmdseSAtIHNldHRpbmcgdGhlIHNjaGVtZSwgdXNlcmluZm8sIGhvc3QscG9ydCwgcGF0aCwgcXVlcnkgc3RyaW5nIGFuZCBmcmFnbWVudCBmaWVsZHMKLSAgICAgKiBhcyBuZWNlc3NhcnkuIElmIHRoZSBzcGVjaWZpY2F0aW9uIGRvZXMgbm90IGZvbGxvdyB0aGUgImdlbmVyaWMgVVJJIiBzeW50YXgsIHRoZSBzcGVjaWZpY2F0aW9uCi0gICAgICogaXMgcGFyc2VkIGludG8gYSBzY2hlbWUgYW5kIHNjaGVtZS1zcGVjaWZpYyBwYXJ0IChzdG9yZWQgYXMgdGhlIHBhdGgpIG9ubHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcF91cmlTcGVjIHRoZSBVUkkgc3BlY2lmaWNhdGlvbiBzdHJpbmcgKGNhbm5vdCBiZSBudWxsIG9yIGVtcHR5KQotICAgICAqIEB0aHJvd3MgTWFsZm9ybWVkVVJJRXhjZXB0aW9uIGlmIHBfdXJpU3BlYyB2aW9sYXRlcyBhbnkgc3ludGF4IHJ1bGVzCi0gICAgICovCi0gICAgcHVibGljIFVSSShTdHJpbmcgcF91cmlTcGVjKSB0aHJvd3MgTWFsZm9ybWVkVVJJRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcygoVVJJKW51bGwsIHBfdXJpU3BlYyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0IGEgbmV3IFVSSSBmcm9tIGEgYmFzZSBVUkkgYW5kIGEgVVJJIHNwZWNpZmljYXRpb24gc3RyaW5nLiBUaGUgVVJJIHNwZWNpZmljYXRpb24KLSAgICAgKiBzdHJpbmcgbWF5IGJlIGEgcmVsYXRpdmUgVVJJLgotICAgICAqCi0gICAgICogQHBhcmFtIHBfYmFzZSAgICB0aGUgYmFzZSBVUkkgKGNhbm5vdCBiZSBudWxsIGlmIHBfdXJpU3BlYyBpcyBudWxsIG9yIGVtcHR5KQotICAgICAqIEBwYXJhbSBwX3VyaVNwZWMgdGhlIFVSSSBzcGVjaWZpY2F0aW9uIHN0cmluZyAoY2Fubm90IGJlIG51bGwgb3IgZW1wdHkgaWYgcF9iYXNlIGlzIG51bGwpCi0gICAgICogQHRocm93cyBNYWxmb3JtZWRVUklFeGNlcHRpb24gaWYgcF91cmlTcGVjIHZpb2xhdGVzIGFueSBzeW50YXggcnVsZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgVVJJKFVSSSBwX2Jhc2UsIFN0cmluZyBwX3VyaVNwZWMpIHRocm93cyBNYWxmb3JtZWRVUklFeGNlcHRpb24gewotICAgICAgICBpbml0aWFsaXplKHBfYmFzZSwgcF91cmlTcGVjKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgVVJJIHRoYXQgZG9lcyBub3QgZm9sbG93IHRoZSBnZW5lcmljIFVSSSBzeW50YXguIE9ubHkgdGhlIHNjaGVtZSBhbmQKLSAgICAgKiBzY2hlbWUtc3BlY2lmaWMgcGFydCAoc3RvcmVkIGFzIHRoZSBwYXRoKSBhcmUgaW5pdGlhbGl6ZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcF9zY2hlbWUgICAgICAgICAgICAgdGhlIFVSSSBzY2hlbWUgKGNhbm5vdCBiZSBudWxsIG9yIGVtcHR5KQotICAgICAqIEBwYXJhbSBwX3NjaGVtZVNwZWNpZmljUGFydCB0aGUgc2NoZW1lLXNwZWNpZmljIHBhcnQgKGNhbm5vdCBiZSBudWxsIG9yIGVtcHR5KQotICAgICAqIEB0aHJvd3MgTWFsZm9ybWVkVVJJRXhjZXB0aW9uIGlmIHBfc2NoZW1lIHZpb2xhdGVzIGFueSBzeW50YXggcnVsZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgVVJJKFN0cmluZyBwX3NjaGVtZSwgU3RyaW5nIHBfc2NoZW1lU3BlY2lmaWNQYXJ0KQotICAgICAgICAgICAgdGhyb3dzIE1hbGZvcm1lZFVSSUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChwX3NjaGVtZSA9PSBudWxsIHx8IHBfc2NoZW1lLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTWFsZm9ybWVkVVJJRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IGNvbnN0cnVjdCBVUkkgd2l0aCBudWxsL2VtcHR5IHNjaGVtZSEiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocF9zY2hlbWVTcGVjaWZpY1BhcnQgPT0gbnVsbCB8fAotICAgICAgICAgICAgICAgIHBfc2NoZW1lU3BlY2lmaWNQYXJ0LnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTWFsZm9ybWVkVVJJRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IGNvbnN0cnVjdCBVUkkgd2l0aCBudWxsL2VtcHR5IHNjaGVtZS1zcGVjaWZpYyBwYXJ0ISIpOwotICAgICAgICB9Ci0gICAgICAgIHNldFNjaGVtZShwX3NjaGVtZSk7Ci0gICAgICAgIHNldFBhdGgocF9zY2hlbWVTcGVjaWZpY1BhcnQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdCBhIG5ldyBVUkkgdGhhdCBmb2xsb3dzIHRoZSBnZW5lcmljIFVSSSBzeW50YXggZnJvbSBpdHMgY29tcG9uZW50IHBhcnRzLiBFYWNoCi0gICAgICogY29tcG9uZW50IGlzIHZhbGlkYXRlZCBmb3Igc3ludGF4IGFuZCBzb21lIGJhc2ljIHNlbWFudGljIGNoZWNrcyBhcmUgcGVyZm9ybWVkIGFzIHdlbGwuICBTZWUKLSAgICAgKiB0aGUgaW5kaXZpZHVhbCBzZXR0ZXIgbWV0aG9kcyBmb3Igc3BlY2lmaWNzLgotICAgICAqCi0gICAgICogQHBhcmFtIHBfc2NoZW1lICAgICAgdGhlIFVSSSBzY2hlbWUgKGNhbm5vdCBiZSBudWxsIG9yIGVtcHR5KQotICAgICAqIEBwYXJhbSBwX2hvc3QgICAgICAgIHRoZSBob3N0bmFtZSwgSVB2NCBhZGRyZXNzIG9yIElQdjYgcmVmZXJlbmNlIGZvciB0aGUgVVJJCi0gICAgICogQHBhcmFtIHBfcGF0aCAgICAgICAgdGhlIFVSSSBwYXRoIC0gaWYgdGhlIHBhdGggY29udGFpbnMgJz8nIG9yICcjJywgdGhlbiB0aGUgcXVlcnkgc3RyaW5nCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgYW5kL29yIGZyYWdtZW50IHdpbGwgYmUgc2V0IGZyb20gdGhlIHBhdGg7IGhvd2V2ZXIsIGlmIHRoZSBxdWVyeSBhbmQKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBmcmFnbWVudCBhcmUgc3BlY2lmaWVkIGJvdGggaW4gdGhlIHBhdGggYW5kIGFzIHNlcGFyYXRlIHBhcmFtZXRlcnMsIGFuCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uIGlzIHRocm93bgotICAgICAqIEBwYXJhbSBwX3F1ZXJ5U3RyaW5nIHRoZSBVUkkgcXVlcnkgc3RyaW5nIChjYW5ub3QgYmUgc3BlY2lmaWVkIGlmIHBhdGggaXMgbnVsbCkKLSAgICAgKiBAcGFyYW0gcF9mcmFnbWVudCAgICB0aGUgVVJJIGZyYWdtZW50IChjYW5ub3QgYmUgc3BlY2lmaWVkIGlmIHBhdGggaXMgbnVsbCkKLSAgICAgKiBAdGhyb3dzIE1hbGZvcm1lZFVSSUV4Y2VwdGlvbiBpZiBhbnkgb2YgdGhlIHBhcmFtZXRlcnMgdmlvbGF0ZXMgc3ludGF4IHJ1bGVzIG9yIHNlbWFudGljIHJ1bGVzCi0gICAgICovCi0gICAgcHVibGljIFVSSShTdHJpbmcgcF9zY2hlbWUsIFN0cmluZyBwX2hvc3QsIFN0cmluZyBwX3BhdGgsCi0gICAgICAgICAgICAgICBTdHJpbmcgcF9xdWVyeVN0cmluZywgU3RyaW5nIHBfZnJhZ21lbnQpCi0gICAgICAgICAgICB0aHJvd3MgTWFsZm9ybWVkVVJJRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcyhwX3NjaGVtZSwgbnVsbCwgcF9ob3N0LCAtMSwgcF9wYXRoLCBwX3F1ZXJ5U3RyaW5nLCBwX2ZyYWdtZW50KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgVVJJIHRoYXQgZm9sbG93cyB0aGUgZ2VuZXJpYyBVUkkgc3ludGF4IGZyb20gaXRzIGNvbXBvbmVudCBwYXJ0cy4gRWFjaAotICAgICAqIGNvbXBvbmVudCBpcyB2YWxpZGF0ZWQgZm9yIHN5bnRheCBhbmQgc29tZSBiYXNpYyBzZW1hbnRpYyBjaGVja3MgYXJlIHBlcmZvcm1lZCBhcyB3ZWxsLiAgU2VlCi0gICAgICogdGhlIGluZGl2aWR1YWwgc2V0dGVyIG1ldGhvZHMgZm9yIHNwZWNpZmljcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwX3NjaGVtZSAgICAgIHRoZSBVUkkgc2NoZW1lIChjYW5ub3QgYmUgbnVsbCBvciBlbXB0eSkKLSAgICAgKiBAcGFyYW0gcF91c2VyaW5mbyAgICB0aGUgVVJJIHVzZXJpbmZvIChjYW5ub3QgYmUgc3BlY2lmaWVkIGlmIGhvc3QgaXMgbnVsbCkKLSAgICAgKiBAcGFyYW0gcF9ob3N0ICAgICAgICB0aGUgaG9zdG5hbWUsIElQdjQgYWRkcmVzcyBvciBJUHY2IHJlZmVyZW5jZSBmb3IgdGhlIFVSSQotICAgICAqIEBwYXJhbSBwX3BvcnQgICAgICAgIHRoZSBVUkkgcG9ydCAobWF5IGJlIC0xIGZvciAidW5zcGVjaWZpZWQiOyBjYW5ub3QgYmUgc3BlY2lmaWVkIGlmIGhvc3QgaXMKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBudWxsKQotICAgICAqIEBwYXJhbSBwX3BhdGggICAgICAgIHRoZSBVUkkgcGF0aCAtIGlmIHRoZSBwYXRoIGNvbnRhaW5zICc/JyBvciAnIycsIHRoZW4gdGhlIHF1ZXJ5IHN0cmluZwotICAgICAqICAgICAgICAgICAgICAgICAgICAgIGFuZC9vciBmcmFnbWVudCB3aWxsIGJlIHNldCBmcm9tIHRoZSBwYXRoOyBob3dldmVyLCBpZiB0aGUgcXVlcnkgYW5kCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgZnJhZ21lbnQgYXJlIHNwZWNpZmllZCBib3RoIGluIHRoZSBwYXRoIGFuZCBhcyBzZXBhcmF0ZSBwYXJhbWV0ZXJzLCBhbgotICAgICAqICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbiBpcyB0aHJvd24KLSAgICAgKiBAcGFyYW0gcF9xdWVyeVN0cmluZyB0aGUgVVJJIHF1ZXJ5IHN0cmluZyAoY2Fubm90IGJlIHNwZWNpZmllZCBpZiBwYXRoIGlzIG51bGwpCi0gICAgICogQHBhcmFtIHBfZnJhZ21lbnQgICAgdGhlIFVSSSBmcmFnbWVudCAoY2Fubm90IGJlIHNwZWNpZmllZCBpZiBwYXRoIGlzIG51bGwpCi0gICAgICogQHRocm93cyBNYWxmb3JtZWRVUklFeGNlcHRpb24gaWYgYW55IG9mIHRoZSBwYXJhbWV0ZXJzIHZpb2xhdGVzIHN5bnRheCBydWxlcyBvciBzZW1hbnRpYyBydWxlcwotICAgICAqLwotICAgIHB1YmxpYyBVUkkoU3RyaW5nIHBfc2NoZW1lLCBTdHJpbmcgcF91c2VyaW5mbywKLSAgICAgICAgICAgICAgIFN0cmluZyBwX2hvc3QsIGludCBwX3BvcnQsIFN0cmluZyBwX3BhdGgsCi0gICAgICAgICAgICAgICBTdHJpbmcgcF9xdWVyeVN0cmluZywgU3RyaW5nIHBfZnJhZ21lbnQpCi0gICAgICAgICAgICB0aHJvd3MgTWFsZm9ybWVkVVJJRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHBfc2NoZW1lID09IG51bGwgfHwgcF9zY2hlbWUudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNYWxmb3JtZWRVUklFeGNlcHRpb24oIlNjaGVtZSBpcyByZXF1aXJlZCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwX2hvc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKHBfdXNlcmluZm8gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBNYWxmb3JtZWRVUklFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAiVXNlcmluZm8gbWF5IG5vdCBiZSBzcGVjaWZpZWQgaWYgaG9zdCBpcyBub3Qgc3BlY2lmaWVkISIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHBfcG9ydCAhPSAtMSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBNYWxmb3JtZWRVUklFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAiUG9ydCBtYXkgbm90IGJlIHNwZWNpZmllZCBpZiBob3N0IGlzIG5vdCBzcGVjaWZpZWQhIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocF9wYXRoICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChwX3BhdGguaW5kZXhPZignPycpICE9IC0xICYmIHBfcXVlcnlTdHJpbmcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBNYWxmb3JtZWRVUklFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAiUXVlcnkgc3RyaW5nIGNhbm5vdCBiZSBzcGVjaWZpZWQgaW4gcGF0aCBhbmQgcXVlcnkgc3RyaW5nISIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocF9wYXRoLmluZGV4T2YoJyMnKSAhPSAtMSAmJiBwX2ZyYWdtZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWFsZm9ybWVkVVJJRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgIkZyYWdtZW50IGNhbm5vdCBiZSBzcGVjaWZpZWQgaW4gYm90aCB0aGUgcGF0aCBhbmQgZnJhZ21lbnQhIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBzZXRTY2hlbWUocF9zY2hlbWUpOwotICAgICAgICBzZXRIb3N0KHBfaG9zdCk7Ci0gICAgICAgIHNldFBvcnQocF9wb3J0KTsKLSAgICAgICAgc2V0VXNlcmluZm8ocF91c2VyaW5mbyk7Ci0gICAgICAgIHNldFBhdGgocF9wYXRoKTsKLSAgICAgICAgc2V0UXVlcnlTdHJpbmcocF9xdWVyeVN0cmluZyk7Ci0gICAgICAgIHNldEZyYWdtZW50KHBfZnJhZ21lbnQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluaXRpYWxpemUgYWxsIGZpZWxkcyBvZiB0aGlzIFVSSSBmcm9tIGFub3RoZXIgVVJJLgotICAgICAqCi0gICAgICogQHBhcmFtIHBfb3RoZXIgdGhlIFVSSSB0byBjb3B5IChjYW5ub3QgYmUgbnVsbCkKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZShVUkkgcF9vdGhlcikgewotICAgICAgICBtX3NjaGVtZSA9IHBfb3RoZXIuZ2V0U2NoZW1lKCk7Ci0gICAgICAgIG1fdXNlcmluZm8gPSBwX290aGVyLmdldFVzZXJpbmZvKCk7Ci0gICAgICAgIG1faG9zdCA9IHBfb3RoZXIuZ2V0SG9zdCgpOwotICAgICAgICBtX3BvcnQgPSBwX290aGVyLmdldFBvcnQoKTsKLSAgICAgICAgbV9yZWdBdXRob3JpdHkgPSBwX290aGVyLmdldFJlZ0Jhc2VkQXV0aG9yaXR5KCk7Ci0gICAgICAgIG1fcGF0aCA9IHBfb3RoZXIuZ2V0UGF0aCgpOwotICAgICAgICBtX3F1ZXJ5U3RyaW5nID0gcF9vdGhlci5nZXRRdWVyeVN0cmluZygpOwotICAgICAgICBtX2ZyYWdtZW50ID0gcF9vdGhlci5nZXRGcmFnbWVudCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluaXRpYWxpemVzIHRoaXMgVVJJIGZyb20gYSBiYXNlIFVSSSBhbmQgYSBVUkkgc3BlY2lmaWNhdGlvbiBzdHJpbmcuIFNlZSBSRkMgMjM5NiBTZWN0aW9uIDQgYW5kCi0gICAgICogQXBwZW5kaXggQiBmb3Igc3BlY2lmaWNhdGlvbnMgb24gcGFyc2luZyB0aGUgVVJJIGFuZCBTZWN0aW9uIDUgZm9yIHNwZWNpZmljYXRpb25zIG9uIHJlc29sdmluZwotICAgICAqIHJlbGF0aXZlIFVSSXMgYW5kIHJlbGF0aXZlIHBhdGhzLgotICAgICAqCi0gICAgICogQHBhcmFtIHBfYmFzZSAgICB0aGUgYmFzZSBVUkkgKG1heSBiZSBudWxsIGlmIHBfdXJpU3BlYyBpcyBhbiBhYnNvbHV0ZSBVUkkpCi0gICAgICogQHBhcmFtIHBfdXJpU3BlYyB0aGUgVVJJIHNwZWMgc3RyaW5nIHdoaWNoIG1heSBiZSBhbiBhYnNvbHV0ZSBvciByZWxhdGl2ZSBVUkkgKGNhbiBvbmx5IGJlCi0gICAgICogICAgICAgICAgICAgICAgICBudWxsL2VtcHR5IGlmIHBfYmFzZSBpcyBub3QgbnVsbCkKLSAgICAgKiBAdGhyb3dzIE1hbGZvcm1lZFVSSUV4Y2VwdGlvbiBpZiBwX2Jhc2UgaXMgbnVsbCBhbmQgcF91cmlTcGVjIGlzIG5vdCBhbiBhYnNvbHV0ZSBVUkkgb3IgaWYKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3VyaVNwZWMgdmlvbGF0ZXMgc3ludGF4IHJ1bGVzCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoVVJJIHBfYmFzZSwgU3RyaW5nIHBfdXJpU3BlYykKLSAgICAgICAgICAgIHRocm93cyBNYWxmb3JtZWRVUklFeGNlcHRpb24gewotCi0gICAgICAgIFN0cmluZyB1cmlTcGVjID0gcF91cmlTcGVjOwotICAgICAgICBpbnQgdXJpU3BlY0xlbiA9ICh1cmlTcGVjICE9IG51bGwpID8gdXJpU3BlYy5sZW5ndGgoKSA6IDA7Ci0KLSAgICAgICAgaWYgKHBfYmFzZSA9PSBudWxsICYmIHVyaVNwZWNMZW4gPT0gMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1hbGZvcm1lZFVSSUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCBpbml0aWFsaXplIFVSSSB3aXRoIGVtcHR5IHBhcmFtZXRlcnMuIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBqdXN0IG1ha2UgYSBjb3B5IG9mIHRoZSBiYXNlIGlmIHNwZWMgaXMgZW1wdHkKLSAgICAgICAgaWYgKHVyaVNwZWNMZW4gPT0gMCkgewotICAgICAgICAgICAgaW5pdGlhbGl6ZShwX2Jhc2UpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGluZGV4ID0gMDsKLQotICAgICAgICAvLyBDaGVjayBmb3Igc2NoZW1lLCB3aGljaCBtdXN0IGJlIGJlZm9yZSAnLycsICc/JyBvciAnIycuIEFsc28gaGFuZGxlCi0gICAgICAgIC8vIG5hbWVzIHdpdGggRE9TIGRyaXZlIGxldHRlcnMgKCdEOicpLCBzbyAxLWNoYXJhY3RlciBzY2hlbWVzIGFyZSBub3QKLSAgICAgICAgLy8gYWxsb3dlZC4KLSAgICAgICAgaW50IGNvbG9uSWR4ID0gdXJpU3BlYy5pbmRleE9mKCc6Jyk7Ci0gICAgICAgIGlmIChjb2xvbklkeCAhPSAtMSkgewotICAgICAgICAgICAgZmluYWwgaW50IHNlYXJjaEZyb20gPSBjb2xvbklkeCAtIDE7Ci0gICAgICAgICAgICAvLyBzZWFyY2ggYmFja3dhcmRzIHN0YXJ0aW5nIGZyb20gY2hhcmFjdGVyIGJlZm9yZSAnOicuCi0gICAgICAgICAgICBpbnQgc2xhc2hJZHggPSB1cmlTcGVjLmxhc3RJbmRleE9mKCcvJywgc2VhcmNoRnJvbSk7Ci0gICAgICAgICAgICBpbnQgcXVlcnlJZHggPSB1cmlTcGVjLmxhc3RJbmRleE9mKCc/Jywgc2VhcmNoRnJvbSk7Ci0gICAgICAgICAgICBpbnQgZnJhZ21lbnRJZHggPSB1cmlTcGVjLmxhc3RJbmRleE9mKCcjJywgc2VhcmNoRnJvbSk7Ci0KLSAgICAgICAgICAgIGlmIChjb2xvbklkeCA8IDIgfHwgc2xhc2hJZHggIT0gLTEgfHwKLSAgICAgICAgICAgICAgICAgICAgcXVlcnlJZHggIT0gLTEgfHwgZnJhZ21lbnRJZHggIT0gLTEpIHsKLSAgICAgICAgICAgICAgICAvLyBBIHN0YW5kYWxvbmUgYmFzZSBpcyBhIHZhbGlkIFVSSSBhY2NvcmRpbmcgdG8gc3BlYwotICAgICAgICAgICAgICAgIGlmIChjb2xvbklkeCA9PSAwIHx8IChwX2Jhc2UgPT0gbnVsbCAmJiBmcmFnbWVudElkeCAhPSAwKSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWFsZm9ybWVkVVJJRXhjZXB0aW9uKCJObyBzY2hlbWUgZm91bmQgaW4gVVJJLiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaW5pdGlhbGl6ZVNjaGVtZSh1cmlTcGVjKTsKLSAgICAgICAgICAgICAgICBpbmRleCA9IG1fc2NoZW1lLmxlbmd0aCgpICsgMTsKLQotICAgICAgICAgICAgICAgIC8vIE5laXRoZXIgJ3NjaGVtZTonIG9yICdzY2hlbWU6I2ZyYWdtZW50JyBhcmUgdmFsaWQgVVJJcy4KLSAgICAgICAgICAgICAgICBpZiAoY29sb25JZHggPT0gdXJpU3BlY0xlbiAtIDEgfHwgdXJpU3BlYy5jaGFyQXQoY29sb25JZHggKyAxKSA9PSAnIycpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1hbGZvcm1lZFVSSUV4Y2VwdGlvbigiU2NoZW1lIHNwZWNpZmljIHBhcnQgY2Fubm90IGJlIGVtcHR5LiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBUd28gc2xhc2hlcyBtZWFucyB3ZSBtYXkgaGF2ZSBhdXRob3JpdHksIGJ1dCBkZWZpbml0ZWx5IG1lYW5zIHdlJ3JlIGVpdGhlcgotICAgICAgICAvLyBtYXRjaGluZyBuZXRfcGF0aCBvciBhYnNfcGF0aC4gVGhlc2UgdHdvIHByb2R1Y3Rpb25zIGFyZSBhbWJpZ3VvdXMgaW4gdGhhdAotICAgICAgICAvLyBldmVyeSBuZXRfcGF0aCAoZXhjZXB0IHRob3NlIGNvbnRhaW5pbmcgYW4gSVB2NlJlZmVyZW5jZSkgaXMgYW4gYWJzX3BhdGguCi0gICAgICAgIC8vIFJGQyAyMzk2IHJlc29sdmVzIHRoaXMgYW1iaWd1aXR5IGJ5IGFwcGx5aW5nIGEgZ3JlZWR5IGxlZnQgbW9zdCBtYXRjaGluZyBydWxlLgotICAgICAgICAvLyBUcnkgbWF0Y2hpbmcgbmV0X3BhdGggZmlyc3QsIGFuZCBpZiB0aGF0IGZhaWxzIHdlIGRvbid0IGhhdmUgYXV0aG9yaXR5IHNvCi0gICAgICAgIC8vIHRoZW4gYXR0ZW1wdCB0byBtYXRjaCBhYnNfcGF0aC4KLSAgICAgICAgLy8KLSAgICAgICAgLy8gbmV0X3BhdGggPSAiLy8iIGF1dGhvcml0eSBbIGFic19wYXRoIF0KLSAgICAgICAgLy8gYWJzX3BhdGggPSAiLyIgIHBhdGhfc2VnbWVudHMKLSAgICAgICAgaWYgKCgoaW5kZXggKyAxKSA8IHVyaVNwZWNMZW4pICYmCi0gICAgICAgICAgICAgICAgKHVyaVNwZWMuY2hhckF0KGluZGV4KSA9PSAnLycgJiYgdXJpU3BlYy5jaGFyQXQoaW5kZXggKyAxKSA9PSAnLycpKSB7Ci0gICAgICAgICAgICBpbmRleCArPSAyOwotICAgICAgICAgICAgaW50IHN0YXJ0UG9zID0gaW5kZXg7Ci0KLSAgICAgICAgICAgIC8vIEF1dGhvcml0eSB3aWxsIGJlIGV2ZXJ5dGhpbmcgdXAgdG8gcGF0aCwgcXVlcnkgb3IgZnJhZ21lbnQKLSAgICAgICAgICAgIGNoYXIgdGVzdENoYXIgPSAnXDAnOwotICAgICAgICAgICAgd2hpbGUgKGluZGV4IDwgdXJpU3BlY0xlbikgewotICAgICAgICAgICAgICAgIHRlc3RDaGFyID0gdXJpU3BlYy5jaGFyQXQoaW5kZXgpOwotICAgICAgICAgICAgICAgIGlmICh0ZXN0Q2hhciA9PSAnLycgfHwgdGVzdENoYXIgPT0gJz8nIHx8IHRlc3RDaGFyID09ICcjJykgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaW5kZXgrKzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gQXR0ZW1wdCB0byBwYXJzZSBhdXRob3JpdHkuIElmIHRoZSBzZWN0aW9uIGlzIGFuIGVtcHR5IHN0cmluZwotICAgICAgICAgICAgLy8gdGhpcyBpcyBhIHZhbGlkIHNlcnZlciBiYXNlZCBhdXRob3JpdHksIHNvIHNldCB0aGUgaG9zdCB0byB0aGlzCi0gICAgICAgICAgICAvLyB2YWx1ZS4KLSAgICAgICAgICAgIGlmIChpbmRleCA+IHN0YXJ0UG9zKSB7Ci0gICAgICAgICAgICAgICAgLy8gSWYgd2UgZGlkbid0IGZpbmQgYXV0aG9yaXR5IHdlIG5lZWQgdG8gYmFjayB1cC4gQXR0ZW1wdCB0bwotICAgICAgICAgICAgICAgIC8vIG1hdGNoIGFnYWluc3QgYWJzX3BhdGggbmV4dC4KLSAgICAgICAgICAgICAgICBpZiAoIWluaXRpYWxpemVBdXRob3JpdHkodXJpU3BlYy5zdWJzdHJpbmcoc3RhcnRQb3MsIGluZGV4KSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBzdGFydFBvcyAtIDI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtX2hvc3QgPSAiIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGluaXRpYWxpemVQYXRoKHVyaVNwZWMsIGluZGV4KTsKLQotICAgICAgICAvLyBSZXNvbHZlIHJlbGF0aXZlIFVSSSB0byBiYXNlIFVSSSAtIHNlZSBSRkMgMjM5NiBTZWN0aW9uIDUuMgotICAgICAgICAvLyBJbiBzb21lIGNhc2VzLCBpdCBtaWdodCBtYWtlIG1vcmUgc2Vuc2UgdG8gdGhyb3cgYW4gZXhjZXB0aW9uCi0gICAgICAgIC8vICh3aGVuIHNjaGVtZSBpcyBzcGVjaWZpZWQgaXMgdGhlIHN0cmluZyBzcGVjIGFuZCB0aGUgYmFzZSBVUkkKLSAgICAgICAgLy8gaXMgYWxzbyBzcGVjaWZpZWQsIGZvciBleGFtcGxlKSwgYnV0IHdlJ3JlIGp1c3QgZm9sbG93aW5nIHRoZQotICAgICAgICAvLyBSRkMgc3BlY2lmaWNhdGlvbnMKLSAgICAgICAgaWYgKHBfYmFzZSAhPSBudWxsKSB7Ci0KLSAgICAgICAgICAgIC8vIGNoZWNrIHRvIHNlZSBpZiB0aGlzIGlzIHRoZSBjdXJyZW50IGRvYyAtIFJGQyAyMzk2IDUuMiAjMgotICAgICAgICAgICAgLy8gbm90ZSB0aGF0IHRoaXMgaXMgc2xpZ2h0bHkgZGlmZmVyZW50IGZyb20gdGhlIFJGQyBzcGVjIGluIHRoYXQKLSAgICAgICAgICAgIC8vIHdlIGRvbid0IGluY2x1ZGUgdGhlIGNoZWNrIGZvciBxdWVyeSBzdHJpbmcgYmVpbmcgbnVsbAotICAgICAgICAgICAgLy8gLSB0aGlzIGhhbmRsZXMgY2FzZXMgd2hlcmUgdGhlIHVyaXNwZWMgaXMganVzdCBhIHF1ZXJ5Ci0gICAgICAgICAgICAvLyBzdHJpbmcgb3IgYSBmcmFnbWVudCAoZS5nLiAiP3kiIG9yICIjcyIpIC0KLSAgICAgICAgICAgIC8vIHNlZSA8aHR0cDovL3d3dy5pY3MudWNpLmVkdS9+ZmllbGRpbmcvdXJsL3Rlc3QxLmh0bWw+IHdoaWNoCi0gICAgICAgICAgICAvLyBpZGVudGlmaWVkIHRoaXMgYXMgYSBidWcgaW4gdGhlIFJGQwotICAgICAgICAgICAgaWYgKG1fcGF0aC5sZW5ndGgoKSA9PSAwICYmIG1fc2NoZW1lID09IG51bGwgJiYKLSAgICAgICAgICAgICAgICAgICAgbV9ob3N0ID09IG51bGwgJiYgbV9yZWdBdXRob3JpdHkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1fc2NoZW1lID0gcF9iYXNlLmdldFNjaGVtZSgpOwotICAgICAgICAgICAgICAgIG1fdXNlcmluZm8gPSBwX2Jhc2UuZ2V0VXNlcmluZm8oKTsKLSAgICAgICAgICAgICAgICBtX2hvc3QgPSBwX2Jhc2UuZ2V0SG9zdCgpOwotICAgICAgICAgICAgICAgIG1fcG9ydCA9IHBfYmFzZS5nZXRQb3J0KCk7Ci0gICAgICAgICAgICAgICAgbV9yZWdBdXRob3JpdHkgPSBwX2Jhc2UuZ2V0UmVnQmFzZWRBdXRob3JpdHkoKTsKLSAgICAgICAgICAgICAgICBtX3BhdGggPSBwX2Jhc2UuZ2V0UGF0aCgpOwotCi0gICAgICAgICAgICAgICAgaWYgKG1fcXVlcnlTdHJpbmcgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtX3F1ZXJ5U3RyaW5nID0gcF9iYXNlLmdldFF1ZXJ5U3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gY2hlY2sgZm9yIHNjaGVtZSAtIFJGQyAyMzk2IDUuMiAjMwotICAgICAgICAgICAgLy8gaWYgd2UgZm91bmQgYSBzY2hlbWUsIGl0IG1lYW5zIGFic29sdXRlIFVSSSwgc28gd2UncmUgZG9uZQotICAgICAgICAgICAgaWYgKG1fc2NoZW1lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtX3NjaGVtZSA9IHBfYmFzZS5nZXRTY2hlbWUoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBjaGVjayBmb3IgYXV0aG9yaXR5IC0gUkZDIDIzOTYgNS4yICM0Ci0gICAgICAgICAgICAvLyBpZiB3ZSBmb3VuZCBhIGhvc3QsIHRoZW4gd2UndmUgZ290IGEgbmV0d29yayBwYXRoLCBzbyB3ZSdyZSBkb25lCi0gICAgICAgICAgICBpZiAobV9ob3N0ID09IG51bGwgJiYgbV9yZWdBdXRob3JpdHkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1fdXNlcmluZm8gPSBwX2Jhc2UuZ2V0VXNlcmluZm8oKTsKLSAgICAgICAgICAgICAgICBtX2hvc3QgPSBwX2Jhc2UuZ2V0SG9zdCgpOwotICAgICAgICAgICAgICAgIG1fcG9ydCA9IHBfYmFzZS5nZXRQb3J0KCk7Ci0gICAgICAgICAgICAgICAgbV9yZWdBdXRob3JpdHkgPSBwX2Jhc2UuZ2V0UmVnQmFzZWRBdXRob3JpdHkoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBjaGVjayBmb3IgYWJzb2x1dGUgcGF0aCAtIFJGQyAyMzk2IDUuMiAjNQotICAgICAgICAgICAgaWYgKG1fcGF0aC5sZW5ndGgoKSA+IDAgJiYKLSAgICAgICAgICAgICAgICAgICAgbV9wYXRoLnN0YXJ0c1dpdGgoIi8iKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gaWYgd2UgZ2V0IHRvIHRoaXMgcG9pbnQsIHdlIG5lZWQgdG8gcmVzb2x2ZSByZWxhdGl2ZSBwYXRoCi0gICAgICAgICAgICAvLyBSRkMgMjM5NiA1LjIgIzYKLSAgICAgICAgICAgIFN0cmluZyBwYXRoID0gIiI7Ci0gICAgICAgICAgICBTdHJpbmcgYmFzZVBhdGggPSBwX2Jhc2UuZ2V0UGF0aCgpOwotCi0gICAgICAgICAgICAvLyA2YSAtIGdldCBhbGwgYnV0IHRoZSBsYXN0IHNlZ21lbnQgb2YgdGhlIGJhc2UgVVJJIHBhdGgKLSAgICAgICAgICAgIGlmIChiYXNlUGF0aCAhPSBudWxsICYmIGJhc2VQYXRoLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgIGludCBsYXN0U2xhc2ggPSBiYXNlUGF0aC5sYXN0SW5kZXhPZignLycpOwotICAgICAgICAgICAgICAgIGlmIChsYXN0U2xhc2ggIT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgcGF0aCA9IGJhc2VQYXRoLnN1YnN0cmluZygwLCBsYXN0U2xhc2ggKyAxKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1fcGF0aC5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBwYXRoID0gIi8iOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyA2YiAtIGFwcGVuZCB0aGUgcmVsYXRpdmUgVVJJIHBhdGgKLSAgICAgICAgICAgIHBhdGggPSBwYXRoLmNvbmNhdChtX3BhdGgpOwotCi0gICAgICAgICAgICAvLyA2YyAtIHJlbW92ZSBhbGwgIi4vIiB3aGVyZSAiLiIgaXMgYSBjb21wbGV0ZSBwYXRoIHNlZ21lbnQKLSAgICAgICAgICAgIGluZGV4ID0gLTE7Ci0gICAgICAgICAgICB3aGlsZSAoKGluZGV4ID0gcGF0aC5pbmRleE9mKCIvLi8iKSkgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICBwYXRoID0gcGF0aC5zdWJzdHJpbmcoMCwgaW5kZXggKyAxKS5jb25jYXQocGF0aC5zdWJzdHJpbmcoaW5kZXggKyAzKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIDZkIC0gcmVtb3ZlICIuIiBpZiBwYXRoIGVuZHMgd2l0aCAiLiIgYXMgYSBjb21wbGV0ZSBwYXRoIHNlZ21lbnQKLSAgICAgICAgICAgIGlmIChwYXRoLmVuZHNXaXRoKCIvLiIpKSB7Ci0gICAgICAgICAgICAgICAgcGF0aCA9IHBhdGguc3Vic3RyaW5nKDAsIHBhdGgubGVuZ3RoKCkgLSAxKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gNmUgLSByZW1vdmUgYWxsICI8c2VnbWVudD4vLi4vIiB3aGVyZSAiPHNlZ21lbnQ+IiBpcyBhIGNvbXBsZXRlCi0gICAgICAgICAgICAvLyBwYXRoIHNlZ21lbnQgbm90IGVxdWFsIHRvICIuLiIKLSAgICAgICAgICAgIGluZGV4ID0gMTsKLSAgICAgICAgICAgIGludCBzZWdJbmRleCA9IC0xOwotICAgICAgICAgICAgU3RyaW5nIHRlbXBTdHJpbmcgPSBudWxsOwotCi0gICAgICAgICAgICB3aGlsZSAoKGluZGV4ID0gcGF0aC5pbmRleE9mKCIvLi4vIiwgaW5kZXgpKSA+IDApIHsKLSAgICAgICAgICAgICAgICB0ZW1wU3RyaW5nID0gcGF0aC5zdWJzdHJpbmcoMCwgcGF0aC5pbmRleE9mKCIvLi4vIikpOwotICAgICAgICAgICAgICAgIHNlZ0luZGV4ID0gdGVtcFN0cmluZy5sYXN0SW5kZXhPZignLycpOwotICAgICAgICAgICAgICAgIGlmIChzZWdJbmRleCAhPSAtMSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoIXRlbXBTdHJpbmcuc3Vic3RyaW5nKHNlZ0luZGV4KS5lcXVhbHMoIi4uIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhdGggPSBwYXRoLnN1YnN0cmluZygwLCBzZWdJbmRleCArIDEpLmNvbmNhdChwYXRoLnN1YnN0cmluZyhpbmRleCArIDQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gc2VnSW5kZXg7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggKz0gNDsKLSAgICAgICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICAgICAgaW5kZXggKz0gNDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gNmYgLSByZW1vdmUgZW5kaW5nICI8c2VnbWVudD4vLi4iIHdoZXJlICI8c2VnbWVudD4iIGlzIGEKLSAgICAgICAgICAgIC8vIGNvbXBsZXRlIHBhdGggc2VnbWVudAotICAgICAgICAgICAgaWYgKHBhdGguZW5kc1dpdGgoIi8uLiIpKSB7Ci0gICAgICAgICAgICAgICAgdGVtcFN0cmluZyA9IHBhdGguc3Vic3RyaW5nKDAsIHBhdGgubGVuZ3RoKCkgLSAzKTsKLSAgICAgICAgICAgICAgICBzZWdJbmRleCA9IHRlbXBTdHJpbmcubGFzdEluZGV4T2YoJy8nKTsKLSAgICAgICAgICAgICAgICBpZiAoc2VnSW5kZXggIT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgcGF0aCA9IHBhdGguc3Vic3RyaW5nKDAsIHNlZ0luZGV4ICsgMSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgbV9wYXRoID0gcGF0aDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluaXRpYWxpemUgdGhlIHNjaGVtZSBmb3IgdGhpcyBVUkkgZnJvbSBhIFVSSSBzdHJpbmcgc3BlYy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwX3VyaVNwZWMgdGhlIFVSSSBzcGVjaWZpY2F0aW9uIChjYW5ub3QgYmUgbnVsbCkKLSAgICAgKiBAdGhyb3dzIE1hbGZvcm1lZFVSSUV4Y2VwdGlvbiBpZiBVUkkgZG9lcyBub3QgaGF2ZSBhIGNvbmZvcm1hbnQgc2NoZW1lCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVTY2hlbWUoU3RyaW5nIHBfdXJpU3BlYykKLSAgICAgICAgICAgIHRocm93cyBNYWxmb3JtZWRVUklFeGNlcHRpb24gewotICAgICAgICBpbnQgdXJpU3BlY0xlbiA9IHBfdXJpU3BlYy5sZW5ndGgoKTsKLSAgICAgICAgaW50IGluZGV4ID0gMDsKLSAgICAgICAgU3RyaW5nIHNjaGVtZSA9IG51bGw7Ci0gICAgICAgIGNoYXIgdGVzdENoYXIgPSAnXDAnOwotCi0gICAgICAgIHdoaWxlIChpbmRleCA8IHVyaVNwZWNMZW4pIHsKLSAgICAgICAgICAgIHRlc3RDaGFyID0gcF91cmlTcGVjLmNoYXJBdChpbmRleCk7Ci0gICAgICAgICAgICBpZiAodGVzdENoYXIgPT0gJzonIHx8IHRlc3RDaGFyID09ICcvJyB8fAotICAgICAgICAgICAgICAgICAgICB0ZXN0Q2hhciA9PSAnPycgfHwgdGVzdENoYXIgPT0gJyMnKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbmRleCsrOwotICAgICAgICB9Ci0gICAgICAgIHNjaGVtZSA9IHBfdXJpU3BlYy5zdWJzdHJpbmcoMCwgaW5kZXgpOwotCi0gICAgICAgIGlmIChzY2hlbWUubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1hbGZvcm1lZFVSSUV4Y2VwdGlvbigiTm8gc2NoZW1lIGZvdW5kIGluIFVSSS4iKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNldFNjaGVtZShzY2hlbWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5pdGlhbGl6ZSB0aGUgYXV0aG9yaXR5IChlaXRoZXIgc2VydmVyIG9yIHJlZ2lzdHJ5IGJhc2VkKSBmb3IgdGhpcyBVUkkgZnJvbSBhIFVSSSBzdHJpbmcKLSAgICAgKiBzcGVjLgotICAgICAqCi0gICAgICogQHBhcmFtIHBfdXJpU3BlYyB0aGUgVVJJIHNwZWNpZmljYXRpb24gKGNhbm5vdCBiZSBudWxsKQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gc3RyaW5nIG1hdGNoZWQgc2VydmVyIG9yIHJlZ2lzdHJ5IGJhc2VkIGF1dGhvcml0eQotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBpbml0aWFsaXplQXV0aG9yaXR5KFN0cmluZyBwX3VyaVNwZWMpIHsKLQotICAgICAgICBpbnQgaW5kZXggPSAwOwotICAgICAgICBpbnQgc3RhcnQgPSAwOwotICAgICAgICBpbnQgZW5kID0gcF91cmlTcGVjLmxlbmd0aCgpOwotCi0gICAgICAgIGNoYXIgdGVzdENoYXIgPSAnXDAnOwotICAgICAgICBTdHJpbmcgdXNlcmluZm8gPSBudWxsOwotCi0gICAgICAgIC8vIHVzZXJpbmZvIGlzIGV2ZXJ5dGhpbmcgdXAgdG8gQAotICAgICAgICBpZiAocF91cmlTcGVjLmluZGV4T2YoJ0AnLCBzdGFydCkgIT0gLTEpIHsKLSAgICAgICAgICAgIHdoaWxlIChpbmRleCA8IGVuZCkgewotICAgICAgICAgICAgICAgIHRlc3RDaGFyID0gcF91cmlTcGVjLmNoYXJBdChpbmRleCk7Ci0gICAgICAgICAgICAgICAgaWYgKHRlc3RDaGFyID09ICdAJykgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaW5kZXgrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVzZXJpbmZvID0gcF91cmlTcGVjLnN1YnN0cmluZyhzdGFydCwgaW5kZXgpOwotICAgICAgICAgICAgaW5kZXgrKzsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGhvc3QgaXMgZXZlcnl0aGluZyB1cCB0byBsYXN0ICc6Jywgb3IgdXAgdG8KLSAgICAgICAgLy8gYW5kIGluY2x1ZGluZyAnXScgaWYgZm9sbG93ZWQgYnkgJzonLgotICAgICAgICBTdHJpbmcgaG9zdCA9IG51bGw7Ci0gICAgICAgIHN0YXJ0ID0gaW5kZXg7Ci0gICAgICAgIGJvb2xlYW4gaGFzUG9ydCA9IGZhbHNlOwotICAgICAgICBpZiAoaW5kZXggPCBlbmQpIHsKLSAgICAgICAgICAgIGlmIChwX3VyaVNwZWMuY2hhckF0KHN0YXJ0KSA9PSAnWycpIHsKLSAgICAgICAgICAgICAgICBpbnQgYnJhY2tldEluZGV4ID0gcF91cmlTcGVjLmluZGV4T2YoJ10nLCBzdGFydCk7Ci0gICAgICAgICAgICAgICAgaW5kZXggPSAoYnJhY2tldEluZGV4ICE9IC0xKSA/IGJyYWNrZXRJbmRleCA6IGVuZDsKLSAgICAgICAgICAgICAgICBpZiAoaW5kZXggKyAxIDwgZW5kICYmIHBfdXJpU3BlYy5jaGFyQXQoaW5kZXggKyAxKSA9PSAnOicpIHsKLSAgICAgICAgICAgICAgICAgICAgKytpbmRleDsKLSAgICAgICAgICAgICAgICAgICAgaGFzUG9ydCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBlbmQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpbnQgY29sb25JbmRleCA9IHBfdXJpU3BlYy5sYXN0SW5kZXhPZignOicsIGVuZCk7Ci0gICAgICAgICAgICAgICAgaW5kZXggPSAoY29sb25JbmRleCA+IHN0YXJ0KSA/IGNvbG9uSW5kZXggOiBlbmQ7Ci0gICAgICAgICAgICAgICAgaGFzUG9ydCA9IChpbmRleCAhPSBlbmQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGhvc3QgPSBwX3VyaVNwZWMuc3Vic3RyaW5nKHN0YXJ0LCBpbmRleCk7Ci0gICAgICAgIGludCBwb3J0ID0gLTE7Ci0gICAgICAgIGlmIChob3N0Lmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgLy8gcG9ydAotICAgICAgICAgICAgaWYgKGhhc1BvcnQpIHsKLSAgICAgICAgICAgICAgICBpbmRleCsrOwotICAgICAgICAgICAgICAgIHN0YXJ0ID0gaW5kZXg7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGluZGV4IDwgZW5kKSB7Ci0gICAgICAgICAgICAgICAgICAgIGluZGV4Kys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFN0cmluZyBwb3J0U3RyID0gcF91cmlTcGVjLnN1YnN0cmluZyhzdGFydCwgaW5kZXgpOwotICAgICAgICAgICAgICAgIGlmIChwb3J0U3RyLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAvLyBSRVZJU0lUOiBSZW1vdmUgdGhpcyBjb2RlLgotICAgICAgICAgICAgICAgICAgICAvKiogZm9yIChpbnQgaSA9IDA7IGkgPCBwb3J0U3RyLmxlbmd0aCgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgIGlmICghaXNEaWdpdChwb3J0U3RyLmNoYXJBdChpKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBNYWxmb3JtZWRVUklFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICBwb3J0U3RyICsKLSAgICAgICAgICAgICAgICAgICAgICIgaXMgaW52YWxpZC4gUG9ydCBzaG91bGQgb25seSBjb250YWluIGRpZ2l0cyEiKTsKLSAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgIH0qKi8KLSAgICAgICAgICAgICAgICAgICAgLy8gUkVWSVNJVDogUmVtb3ZlIHRoaXMgY29kZS4KLSAgICAgICAgICAgICAgICAgICAgLy8gU3RvcmUgcG9ydCB2YWx1ZSBhcyBzdHJpbmcgaW5zdGVhZCBvZiBpbnRlZ2VyLgotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgcG9ydCA9IEludGVnZXIucGFyc2VJbnQocG9ydFN0cik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocG9ydCA9PSAtMSkgLS1wb3J0OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwb3J0ID0gLTI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaXNWYWxpZFNlcnZlckJhc2VkQXV0aG9yaXR5KGhvc3QsIHBvcnQsIHVzZXJpbmZvKSkgewotICAgICAgICAgICAgbV9ob3N0ID0gaG9zdDsKLSAgICAgICAgICAgIG1fcG9ydCA9IHBvcnQ7Ci0gICAgICAgICAgICBtX3VzZXJpbmZvID0gdXNlcmluZm87Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICAvLyBOb3RlOiBSZWdpc3RyeSBiYXNlZCBhdXRob3JpdHkgaXMgYmVpbmcgcmVtb3ZlZCBmcm9tIGEKLSAgICAgICAgLy8gbmV3IHNwZWMgZm9yIFVSSSB3aGljaCB3b3VsZCBvYnNvbGV0ZSBSRkMgMjM5Ni4gSWYgdGhlCi0gICAgICAgIC8vIHNwZWMgaXMgYWRkZWQgdG8gWE1MIGVycmF0YSwgcHJvY2Vzc2luZyBvZiByZWdfbmFtZQotICAgICAgICAvLyBuZWVkcyB0byBiZSByZW1vdmVkLiAtIG1yZ2xhdmFzLgotICAgICAgICBlbHNlIGlmIChpc1ZhbGlkUmVnaXN0cnlCYXNlZEF1dGhvcml0eShwX3VyaVNwZWMpKSB7Ci0gICAgICAgICAgICBtX3JlZ0F1dGhvcml0eSA9IHBfdXJpU3BlYzsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGNvbXBvbmVudHMgaG9zdCwgcG9ydCwgYW5kIHVzZXIgaW5mbyBhcmUgdmFsaWQgYXMgYSBzZXJ2ZXIgYXV0aG9yaXR5LgotICAgICAqCi0gICAgICogQHBhcmFtIGhvc3QgICAgIHRoZSBob3N0IGNvbXBvbmVudCBvZiBhdXRob3JpdHkKLSAgICAgKiBAcGFyYW0gcG9ydCAgICAgdGhlIHBvcnQgbnVtYmVyIGNvbXBvbmVudCBvZiBhdXRob3JpdHkKLSAgICAgKiBAcGFyYW0gdXNlcmluZm8gdGhlIHVzZXIgaW5mbyBjb21wb25lbnQgb2YgYXV0aG9yaXR5Ci0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBob3N0LCBwb3J0LCBhbmQgdXNlcmluZm8gY29tcG9zZSBhIHZhbGlkIHNlcnZlciBhdXRob3JpdHkKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNWYWxpZFNlcnZlckJhc2VkQXV0aG9yaXR5KFN0cmluZyBob3N0LCBpbnQgcG9ydCwgU3RyaW5nIHVzZXJpbmZvKSB7Ci0KLSAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGhvc3QgaXMgd2VsbCBmb3JtZWQuCi0gICAgICAgIGlmICghaXNXZWxsRm9ybWVkQWRkcmVzcyhob3N0KSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQ2hlY2sgdGhhdCBwb3J0IGlzIHdlbGwgZm9ybWVkIGlmIGl0IGV4aXN0cy4KLSAgICAgICAgLy8gUkVWSVNJVDogVGhlcmUncyBubyByZXN0cmljdGlvbiBvbiBwb3J0IHZhbHVlIHJhbmdlcywgYnV0Ci0gICAgICAgIC8vIHBlcmZvcm0gdGhlIHNhbWUgY2hlY2sgYXMgaW4gc2V0UG9ydCB0byBiZSBjb25zaXN0ZW50LiBQYXNzCi0gICAgICAgIC8vIGluIGEgc3RyaW5nIHRvIHRoaXMgbWV0aG9kIGluc3RlYWQgb2YgYW4gaW50ZWdlci4KLSAgICAgICAgaWYgKHBvcnQgPCAtMSB8fCBwb3J0ID4gNjU1MzUpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIENoZWNrIHRoYXQgdXNlcmluZm8gaXMgd2VsbCBmb3JtZWQgaWYgaXQgZXhpc3RzLgotICAgICAgICBpZiAodXNlcmluZm8gIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gVXNlcmluZm8gY2FuIGNvbnRhaW4gYWxwaGFudW1lcmljcywgbWFyayBjaGFyYWN0ZXJzLCBlc2NhcGVkCi0gICAgICAgICAgICAvLyBhbmQgJzsnLCc6JywnJicsJz0nLCcrJywnJCcsJywnCi0gICAgICAgICAgICBpbnQgaW5kZXggPSAwOwotICAgICAgICAgICAgaW50IGVuZCA9IHVzZXJpbmZvLmxlbmd0aCgpOwotICAgICAgICAgICAgY2hhciB0ZXN0Q2hhciA9ICdcMCc7Ci0gICAgICAgICAgICB3aGlsZSAoaW5kZXggPCBlbmQpIHsKLSAgICAgICAgICAgICAgICB0ZXN0Q2hhciA9IHVzZXJpbmZvLmNoYXJBdChpbmRleCk7Ci0gICAgICAgICAgICAgICAgaWYgKHRlc3RDaGFyID09ICclJykgewotICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggKyAyID49IGVuZCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICFpc0hleCh1c2VyaW5mby5jaGFyQXQoaW5kZXggKyAxKSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAhaXNIZXgodXNlcmluZm8uY2hhckF0KGluZGV4ICsgMikpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaW5kZXggKz0gMjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFpc1VzZXJpbmZvQ2hhcmFjdGVyKHRlc3RDaGFyKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICsraW5kZXg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBnaXZlbiBzdHJpbmcgaXMgYSByZWdpc3RyeSBiYXNlZCBhdXRob3JpdHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYXV0aG9yaXR5IHRoZSBhdXRob3JpdHkgY29tcG9uZW50IG9mIGEgVVJJCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBzdHJpbmcgaXMgYSByZWdpc3RyeSBiYXNlZCBhdXRob3JpdHkKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNWYWxpZFJlZ2lzdHJ5QmFzZWRBdXRob3JpdHkoU3RyaW5nIGF1dGhvcml0eSkgewotICAgICAgICBpbnQgaW5kZXggPSAwOwotICAgICAgICBpbnQgZW5kID0gYXV0aG9yaXR5Lmxlbmd0aCgpOwotICAgICAgICBjaGFyIHRlc3RDaGFyOwotCi0gICAgICAgIHdoaWxlIChpbmRleCA8IGVuZCkgewotICAgICAgICAgICAgdGVzdENoYXIgPSBhdXRob3JpdHkuY2hhckF0KGluZGV4KTsKLQotICAgICAgICAgICAgLy8gY2hlY2sgZm9yIHZhbGlkIGVzY2FwZSBzZXF1ZW5jZQotICAgICAgICAgICAgaWYgKHRlc3RDaGFyID09ICclJykgewotICAgICAgICAgICAgICAgIGlmIChpbmRleCArIDIgPj0gZW5kIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAhaXNIZXgoYXV0aG9yaXR5LmNoYXJBdChpbmRleCArIDEpKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgIWlzSGV4KGF1dGhvcml0eS5jaGFyQXQoaW5kZXggKyAyKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpbmRleCArPSAyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gY2FuIGNoZWNrIGFnYWluc3QgcGF0aCBjaGFyYWN0ZXJzIGJlY2F1c2UgdGhlIHNldAotICAgICAgICAgICAgLy8gaXMgdGhlIHNhbWUgZXhjZXB0IGZvciAnLycgd2hpY2ggd2UndmUgYWxyZWFkeSBleGNsdWRlZC4KLSAgICAgICAgICAgIGVsc2UgaWYgKCFpc1BhdGhDaGFyYWN0ZXIodGVzdENoYXIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgKytpbmRleDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbml0aWFsaXplIHRoZSBwYXRoIGZvciB0aGlzIFVSSSBmcm9tIGEgVVJJIHN0cmluZyBzcGVjLgotICAgICAqCi0gICAgICogQHBhcmFtIHBfdXJpU3BlYyAgICAgdGhlIFVSSSBzcGVjaWZpY2F0aW9uIChjYW5ub3QgYmUgbnVsbCkKLSAgICAgKiBAcGFyYW0gcF9uU3RhcnRJbmRleCB0aGUgaW5kZXggdG8gYmVnaW4gc2Nhbm5pbmcgZnJvbQotICAgICAqIEB0aHJvd3MgTWFsZm9ybWVkVVJJRXhjZXB0aW9uIGlmIHBfdXJpU3BlYyB2aW9sYXRlcyBzeW50YXggcnVsZXMKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVBhdGgoU3RyaW5nIHBfdXJpU3BlYywgaW50IHBfblN0YXJ0SW5kZXgpCi0gICAgICAgICAgICB0aHJvd3MgTWFsZm9ybWVkVVJJRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHBfdXJpU3BlYyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTWFsZm9ybWVkVVJJRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IGluaXRpYWxpemUgcGF0aCBmcm9tIG51bGwgc3RyaW5nISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGluZGV4ID0gcF9uU3RhcnRJbmRleDsKLSAgICAgICAgaW50IHN0YXJ0ID0gcF9uU3RhcnRJbmRleDsKLSAgICAgICAgaW50IGVuZCA9IHBfdXJpU3BlYy5sZW5ndGgoKTsKLSAgICAgICAgY2hhciB0ZXN0Q2hhciA9ICdcMCc7Ci0KLSAgICAgICAgLy8gcGF0aCAtIGV2ZXJ5dGhpbmcgdXAgdG8gcXVlcnkgc3RyaW5nIG9yIGZyYWdtZW50Ci0gICAgICAgIGlmIChzdGFydCA8IGVuZCkgewotICAgICAgICAgICAgLy8gUkZDIDI3MzIgb25seSBhbGxvd3MgJ1snIGFuZCAnXScgdG8gYXBwZWFyIGluIHRoZSBvcGFxdWUgcGFydC4KLSAgICAgICAgICAgIGlmIChnZXRTY2hlbWUoKSA9PSBudWxsIHx8IHBfdXJpU3BlYy5jaGFyQXQoc3RhcnQpID09ICcvJykgewotCi0gICAgICAgICAgICAgICAgLy8gU2NhbiBwYXRoLgotICAgICAgICAgICAgICAgIC8vIGFic19wYXRoID0gIi8iICBwYXRoX3NlZ21lbnRzCi0gICAgICAgICAgICAgICAgLy8gcmVsX3BhdGggPSByZWxfc2VnbWVudCBbIGFic19wYXRoIF0KLSAgICAgICAgICAgICAgICB3aGlsZSAoaW5kZXggPCBlbmQpIHsKLSAgICAgICAgICAgICAgICAgICAgdGVzdENoYXIgPSBwX3VyaVNwZWMuY2hhckF0KGluZGV4KTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBmb3IgdmFsaWQgZXNjYXBlIHNlcXVlbmNlCi0gICAgICAgICAgICAgICAgICAgIGlmICh0ZXN0Q2hhciA9PSAnJScpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCArIDIgPj0gZW5kIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFpc0hleChwX3VyaVNwZWMuY2hhckF0KGluZGV4ICsgMSkpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFpc0hleChwX3VyaVNwZWMuY2hhckF0KGluZGV4ICsgMikpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1hbGZvcm1lZFVSSUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQYXRoIGNvbnRhaW5zIGludmFsaWQgZXNjYXBlIHNlcXVlbmNlISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggKz0gMjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBQYXRoIHNlZ21lbnRzIGNhbm5vdCBjb250YWluICdbJyBvciAnXScgc2luY2UgcGNoYXIKLSAgICAgICAgICAgICAgICAgICAgLy8gcHJvZHVjdGlvbiB3YXMgbm90IGNoYW5nZWQgYnkgUkZDIDI3MzIuCi0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFpc1BhdGhDaGFyYWN0ZXIodGVzdENoYXIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGVzdENoYXIgPT0gJz8nIHx8IHRlc3RDaGFyID09ICcjJykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1hbGZvcm1lZFVSSUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBhdGggY29udGFpbnMgaW52YWxpZCBjaGFyYWN0ZXI6ICIgKyB0ZXN0Q2hhcik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgKytpbmRleDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotCi0gICAgICAgICAgICAgICAgLy8gU2NhbiBvcGFxdWUgcGFydC4KLSAgICAgICAgICAgICAgICAvLyBvcGFxdWVfcGFydCA9IHVyaWNfbm9fc2xhc2ggKnVyaWMKLSAgICAgICAgICAgICAgICB3aGlsZSAoaW5kZXggPCBlbmQpIHsKLSAgICAgICAgICAgICAgICAgICAgdGVzdENoYXIgPSBwX3VyaVNwZWMuY2hhckF0KGluZGV4KTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAodGVzdENoYXIgPT0gJz8nIHx8IHRlc3RDaGFyID09ICcjJykgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBmb3IgdmFsaWQgZXNjYXBlIHNlcXVlbmNlCi0gICAgICAgICAgICAgICAgICAgIGlmICh0ZXN0Q2hhciA9PSAnJScpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCArIDIgPj0gZW5kIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFpc0hleChwX3VyaVNwZWMuY2hhckF0KGluZGV4ICsgMSkpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFpc0hleChwX3VyaVNwZWMuY2hhckF0KGluZGV4ICsgMikpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1hbGZvcm1lZFVSSUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPcGFxdWUgcGFydCBjb250YWlucyBpbnZhbGlkIGVzY2FwZSBzZXF1ZW5jZSEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ICs9IDI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHNjaGVtZSBzcGVjaWZpYyBwYXJ0IGlzIG9wYXF1ZSwgaXQgY2FuIGNvbnRhaW4gJ1snCi0gICAgICAgICAgICAgICAgICAgIC8vIGFuZCAnXScuIHVyaWNfbm9fc2xhc2ggd2Fzbid0IG1vZGlmaWVkIGJ5IFJGQyAyNzMyLCB3aGljaAotICAgICAgICAgICAgICAgICAgICAvLyBJJ3ZlIGludGVycHJldGVkIGFzIGFuIGVycm9yIGluIHRoZSBzcGVjLCBzaW5jZSB0aGUKLSAgICAgICAgICAgICAgICAgICAgLy8gcHJvZHVjdGlvbiBzaG91bGQgYmUgZXF1aXZhbGVudCB0byAodXJpYyAtICcvJyksIGFuZCB1cmljCi0gICAgICAgICAgICAgICAgICAgIC8vIGNvbnRhaW5zICdbJyBhbmQgJ10nLiAtIG1yZ2xhdmFzCi0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFpc1VSSUNoYXJhY3Rlcih0ZXN0Q2hhcikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBNYWxmb3JtZWRVUklFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPcGFxdWUgcGFydCBjb250YWlucyBpbnZhbGlkIGNoYXJhY3RlcjogIiArIHRlc3RDaGFyKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICArK2luZGV4OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBtX3BhdGggPSBwX3VyaVNwZWMuc3Vic3RyaW5nKHN0YXJ0LCBpbmRleCk7Ci0KLSAgICAgICAgLy8gcXVlcnkgLSBzdGFydHMgd2l0aCA/IGFuZCB1cCB0byBmcmFnbWVudCBvciBlbmQKLSAgICAgICAgaWYgKHRlc3RDaGFyID09ICc/JykgewotICAgICAgICAgICAgaW5kZXgrKzsKLSAgICAgICAgICAgIHN0YXJ0ID0gaW5kZXg7Ci0gICAgICAgICAgICB3aGlsZSAoaW5kZXggPCBlbmQpIHsKLSAgICAgICAgICAgICAgICB0ZXN0Q2hhciA9IHBfdXJpU3BlYy5jaGFyQXQoaW5kZXgpOwotICAgICAgICAgICAgICAgIGlmICh0ZXN0Q2hhciA9PSAnIycpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICh0ZXN0Q2hhciA9PSAnJScpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ICsgMiA+PSBlbmQgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAhaXNIZXgocF91cmlTcGVjLmNoYXJBdChpbmRleCArIDEpKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICFpc0hleChwX3VyaVNwZWMuY2hhckF0KGluZGV4ICsgMikpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWFsZm9ybWVkVVJJRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUXVlcnkgc3RyaW5nIGNvbnRhaW5zIGludmFsaWQgZXNjYXBlIHNlcXVlbmNlISIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGluZGV4ICs9IDI7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghaXNVUklDaGFyYWN0ZXIodGVzdENoYXIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBNYWxmb3JtZWRVUklFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIlF1ZXJ5IHN0cmluZyBjb250YWlucyBpbnZhbGlkIGNoYXJhY3RlcjogIiArIHRlc3RDaGFyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaW5kZXgrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1fcXVlcnlTdHJpbmcgPSBwX3VyaVNwZWMuc3Vic3RyaW5nKHN0YXJ0LCBpbmRleCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBmcmFnbWVudCAtIHN0YXJ0cyB3aXRoICMKLSAgICAgICAgaWYgKHRlc3RDaGFyID09ICcjJykgewotICAgICAgICAgICAgaW5kZXgrKzsKLSAgICAgICAgICAgIHN0YXJ0ID0gaW5kZXg7Ci0gICAgICAgICAgICB3aGlsZSAoaW5kZXggPCBlbmQpIHsKLSAgICAgICAgICAgICAgICB0ZXN0Q2hhciA9IHBfdXJpU3BlYy5jaGFyQXQoaW5kZXgpOwotCi0gICAgICAgICAgICAgICAgaWYgKHRlc3RDaGFyID09ICclJykgewotICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggKyAyID49IGVuZCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICFpc0hleChwX3VyaVNwZWMuY2hhckF0KGluZGV4ICsgMSkpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIWlzSGV4KHBfdXJpU3BlYy5jaGFyQXQoaW5kZXggKyAyKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBNYWxmb3JtZWRVUklFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGcmFnbWVudCBjb250YWlucyBpbnZhbGlkIGVzY2FwZSBzZXF1ZW5jZSEiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpbmRleCArPSAyOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWlzVVJJQ2hhcmFjdGVyKHRlc3RDaGFyKSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWFsZm9ybWVkVVJJRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGcmFnbWVudCBjb250YWlucyBpbnZhbGlkIGNoYXJhY3RlcjogIiArIHRlc3RDaGFyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaW5kZXgrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1fZnJhZ21lbnQgPSBwX3VyaVNwZWMuc3Vic3RyaW5nKHN0YXJ0LCBpbmRleCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHNjaGVtZSBmb3IgdGhpcyBVUkkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBzY2hlbWUgZm9yIHRoaXMgVVJJCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRTY2hlbWUoKSB7Ci0gICAgICAgIHJldHVybiBtX3NjaGVtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHNjaGVtZS1zcGVjaWZpYyBwYXJ0IGZvciB0aGlzIFVSSSAoZXZlcnl0aGluZyBmb2xsb3dpbmcgdGhlIHNjaGVtZSBhbmQgdGhlIGZpcnN0Ci0gICAgICogY29sb24pLiBTZWUgUkZDIDIzOTYgU2VjdGlvbiA1LjIgZm9yIHNwZWMuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBzY2hlbWUtc3BlY2lmaWMgcGFydCBmb3IgdGhpcyBVUkkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNjaGVtZVNwZWNpZmljUGFydCgpIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHNjaGVtZXNwZWMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLSAgICAgICAgaWYgKG1faG9zdCAhPSBudWxsIHx8IG1fcmVnQXV0aG9yaXR5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNjaGVtZXNwZWMuYXBwZW5kKCIvLyIpOwotCi0gICAgICAgICAgICAvLyBTZXJ2ZXIgYmFzZWQgYXV0aG9yaXR5LgotICAgICAgICAgICAgaWYgKG1faG9zdCAhPSBudWxsKSB7Ci0KLSAgICAgICAgICAgICAgICBpZiAobV91c2VyaW5mbyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNjaGVtZXNwZWMuYXBwZW5kKG1fdXNlcmluZm8pOwotICAgICAgICAgICAgICAgICAgICBzY2hlbWVzcGVjLmFwcGVuZCgnQCcpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHNjaGVtZXNwZWMuYXBwZW5kKG1faG9zdCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAobV9wb3J0ICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNjaGVtZXNwZWMuYXBwZW5kKCc6Jyk7Ci0gICAgICAgICAgICAgICAgICAgIHNjaGVtZXNwZWMuYXBwZW5kKG1fcG9ydCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gUmVnaXN0cnkgYmFzZWQgYXV0aG9yaXR5LgotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2NoZW1lc3BlYy5hcHBlbmQobV9yZWdBdXRob3JpdHkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1fcGF0aCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzY2hlbWVzcGVjLmFwcGVuZCgobV9wYXRoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobV9xdWVyeVN0cmluZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzY2hlbWVzcGVjLmFwcGVuZCgnPycpOwotICAgICAgICAgICAgc2NoZW1lc3BlYy5hcHBlbmQobV9xdWVyeVN0cmluZyk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobV9mcmFnbWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzY2hlbWVzcGVjLmFwcGVuZCgnIycpOwotICAgICAgICAgICAgc2NoZW1lc3BlYy5hcHBlbmQobV9mcmFnbWVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc2NoZW1lc3BlYy50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgdXNlcmluZm8gZm9yIHRoaXMgVVJJLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgdXNlcmluZm8gZm9yIHRoaXMgVVJJIChudWxsIGlmIG5vdCBzcGVjaWZpZWQpLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXNlcmluZm8oKSB7Ci0gICAgICAgIHJldHVybiBtX3VzZXJpbmZvOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgaG9zdCBmb3IgdGhpcyBVUkkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBob3N0IGZvciB0aGlzIFVSSSAobnVsbCBpZiBub3Qgc3BlY2lmaWVkKS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEhvc3QoKSB7Ci0gICAgICAgIHJldHVybiBtX2hvc3Q7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBwb3J0IGZvciB0aGlzIFVSSS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHBvcnQgZm9yIHRoaXMgVVJJICgtMSBpZiBub3Qgc3BlY2lmaWVkKS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFBvcnQoKSB7Ci0gICAgICAgIHJldHVybiBtX3BvcnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSByZWdpc3RyeSBiYXNlZCBhdXRob3JpdHkgZm9yIHRoaXMgVVJJLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgcmVnaXN0cnkgYmFzZWQgYXV0aG9yaXR5IChudWxsIGlmIG5vdCBzcGVjaWZpZWQpLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVnQmFzZWRBdXRob3JpdHkoKSB7Ci0gICAgICAgIHJldHVybiBtX3JlZ0F1dGhvcml0eTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHBhdGggZm9yIHRoaXMgVVJJIChvcHRpb25hbGx5IHdpdGggdGhlIHF1ZXJ5IHN0cmluZyBhbmQgZnJhZ21lbnQpLgotICAgICAqCi0gICAgICogQHBhcmFtIHBfaW5jbHVkZVF1ZXJ5U3RyaW5nIGlmIHRydWUgKGFuZCBxdWVyeSBzdHJpbmcgaXMgbm90IG51bGwpLCB0aGVuIGEgIj8iIGZvbGxvd2VkIGJ5IHRoZQotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeSBzdHJpbmcgd2lsbCBiZSBhcHBlbmRlZAotICAgICAqIEBwYXJhbSBwX2luY2x1ZGVGcmFnbWVudCAgICBpZiB0cnVlIChhbmQgZnJhZ21lbnQgaXMgbm90IG51bGwpLCB0aGVuIGEgIiMiIGZvbGxvd2VkIGJ5IHRoZQotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFnbWVudCB3aWxsIGJlIGFwcGVuZGVkCi0gICAgICogQHJldHVybiB0aGUgcGF0aCBmb3IgdGhpcyBVUkkgcG9zc2libHkgaW5jbHVkaW5nIHRoZSBxdWVyeSBzdHJpbmcgYW5kIGZyYWdtZW50Ci0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRQYXRoKGJvb2xlYW4gcF9pbmNsdWRlUXVlcnlTdHJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gcF9pbmNsdWRlRnJhZ21lbnQpIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHBhdGhTdHJpbmcgPSBuZXcgU3RyaW5nQnVmZmVyKG1fcGF0aCk7Ci0KLSAgICAgICAgaWYgKHBfaW5jbHVkZVF1ZXJ5U3RyaW5nICYmIG1fcXVlcnlTdHJpbmcgIT0gbnVsbCkgewotICAgICAgICAgICAgcGF0aFN0cmluZy5hcHBlbmQoJz8nKTsKLSAgICAgICAgICAgIHBhdGhTdHJpbmcuYXBwZW5kKG1fcXVlcnlTdHJpbmcpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHBfaW5jbHVkZUZyYWdtZW50ICYmIG1fZnJhZ21lbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgcGF0aFN0cmluZy5hcHBlbmQoJyMnKTsKLSAgICAgICAgICAgIHBhdGhTdHJpbmcuYXBwZW5kKG1fZnJhZ21lbnQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwYXRoU3RyaW5nLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBwYXRoIGZvciB0aGlzIFVSSS4gTm90ZSB0aGF0IHRoZSB2YWx1ZSByZXR1cm5lZCBpcyB0aGUgcGF0aCBvbmx5IGFuZCBkb2VzIG5vdCBpbmNsdWRlCi0gICAgICogdGhlIHF1ZXJ5IHN0cmluZyBvciBmcmFnbWVudC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHBhdGggZm9yIHRoaXMgVVJJLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aCgpIHsKLSAgICAgICAgcmV0dXJuIG1fcGF0aDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHF1ZXJ5IHN0cmluZyBmb3IgdGhpcyBVUkkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBxdWVyeSBzdHJpbmcgZm9yIHRoaXMgVVJJLiBOdWxsIGlzIHJldHVybmVkIGlmIHRoZXJlIHdhcyBubyAiPyIgaW4gdGhlIFVSSSBzcGVjLAotICAgICAqICAgICAgICAgZW1wdHkgc3RyaW5nIGlmIHRoZXJlIHdhcyBhICI/IiBidXQgbm8gcXVlcnkgc3RyaW5nIGZvbGxvd2luZyBpdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFF1ZXJ5U3RyaW5nKCkgewotICAgICAgICByZXR1cm4gbV9xdWVyeVN0cmluZzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGZyYWdtZW50IGZvciB0aGlzIFVSSS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIGZyYWdtZW50IGZvciB0aGlzIFVSSS4gTnVsbCBpcyByZXR1cm5lZCBpZiB0aGVyZSB3YXMgbm8gIiMiIGluIHRoZSBVUkkgc3BlYywgZW1wdHkKLSAgICAgKiAgICAgICAgIHN0cmluZyBpZiB0aGVyZSB3YXMgYSAiIyIgYnV0IG5vIGZyYWdtZW50IGZvbGxvd2luZyBpdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZyYWdtZW50KCkgewotICAgICAgICByZXR1cm4gbV9mcmFnbWVudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIHNjaGVtZSBmb3IgdGhpcyBVUkkuIFRoZSBzY2hlbWUgaXMgY29udmVydGVkIHRvIGxvd2VyY2FzZSBiZWZvcmUgaXQgaXMgc2V0LgotICAgICAqCi0gICAgICogQHBhcmFtIHBfc2NoZW1lIHRoZSBzY2hlbWUgZm9yIHRoaXMgVVJJIChjYW5ub3QgYmUgbnVsbCkKLSAgICAgKiBAdGhyb3dzIE1hbGZvcm1lZFVSSUV4Y2VwdGlvbiBpZiBwX3NjaGVtZSBpcyBub3QgYSBjb25mb3JtYW50IHNjaGVtZSBuYW1lCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U2NoZW1lKFN0cmluZyBwX3NjaGVtZSkgdGhyb3dzIE1hbGZvcm1lZFVSSUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChwX3NjaGVtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTWFsZm9ybWVkVVJJRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IHNldCBzY2hlbWUgZnJvbSBudWxsIHN0cmluZyEiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIWlzQ29uZm9ybWFudFNjaGVtZU5hbWUocF9zY2hlbWUpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTWFsZm9ybWVkVVJJRXhjZXB0aW9uKCJUaGUgc2NoZW1lIGlzIG5vdCBjb25mb3JtYW50LiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgbV9zY2hlbWUgPSBwX3NjaGVtZS50b0xvd2VyQ2FzZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgdXNlcmluZm8gZm9yIHRoaXMgVVJJLiBJZiBhIG5vbi1udWxsIHZhbHVlIGlzIHBhc3NlZCBpbiBhbmQgdGhlIGhvc3QgdmFsdWUgaXMgbnVsbCwKLSAgICAgKiB0aGVuIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcF91c2VyaW5mbyB0aGUgdXNlcmluZm8gZm9yIHRoaXMgVVJJCi0gICAgICogQHRocm93cyBNYWxmb3JtZWRVUklFeGNlcHRpb24gaWYgcF91c2VyaW5mbyBjb250YWlucyBpbnZhbGlkIGNoYXJhY3RlcnMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRVc2VyaW5mbyhTdHJpbmcgcF91c2VyaW5mbykgdGhyb3dzIE1hbGZvcm1lZFVSSUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChwX3VzZXJpbmZvID09IG51bGwpIHsKLSAgICAgICAgICAgIG1fdXNlcmluZm8gPSBudWxsOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKG1faG9zdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1hbGZvcm1lZFVSSUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICJVc2VyaW5mbyBjYW5ub3QgYmUgc2V0IHdoZW4gaG9zdCBpcyBudWxsISIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyB1c2VyaW5mbyBjYW4gY29udGFpbiBhbHBoYW51bWVyaWNzLCBtYXJrIGNoYXJhY3RlcnMsIGVzY2FwZWQKLSAgICAgICAgICAgIC8vIGFuZCAnOycsJzonLCcmJywnPScsJysnLCckJywnLCcKLSAgICAgICAgICAgIGludCBpbmRleCA9IDA7Ci0gICAgICAgICAgICBpbnQgZW5kID0gcF91c2VyaW5mby5sZW5ndGgoKTsKLSAgICAgICAgICAgIGNoYXIgdGVzdENoYXIgPSAnXDAnOwotICAgICAgICAgICAgd2hpbGUgKGluZGV4IDwgZW5kKSB7Ci0gICAgICAgICAgICAgICAgdGVzdENoYXIgPSBwX3VzZXJpbmZvLmNoYXJBdChpbmRleCk7Ci0gICAgICAgICAgICAgICAgaWYgKHRlc3RDaGFyID09ICclJykgewotICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggKyAyID49IGVuZCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICFpc0hleChwX3VzZXJpbmZvLmNoYXJBdChpbmRleCArIDEpKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICFpc0hleChwX3VzZXJpbmZvLmNoYXJBdChpbmRleCArIDIpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1hbGZvcm1lZFVSSUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVzZXJpbmZvIGNvbnRhaW5zIGludmFsaWQgZXNjYXBlIHNlcXVlbmNlISIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghaXNVc2VyaW5mb0NoYXJhY3Rlcih0ZXN0Q2hhcikpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1hbGZvcm1lZFVSSUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVXNlcmluZm8gY29udGFpbnMgaW52YWxpZCBjaGFyYWN0ZXI6IiArIHRlc3RDaGFyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaW5kZXgrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBtX3VzZXJpbmZvID0gcF91c2VyaW5mbzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8cD5TZXQgdGhlIGhvc3QgZm9yIHRoaXMgVVJJLiBJZiBudWxsIGlzIHBhc3NlZCBpbiwgdGhlIHVzZXJpbmZvIGZpZWxkIGlzIGFsc28gc2V0IHRvIG51bGwgYW5kCi0gICAgICogdGhlIHBvcnQgaXMgc2V0IHRvIC0xLjwvcD4KLSAgICAgKiA8cC8+Ci0gICAgICogPHA+Tm90ZTogVGhpcyBtZXRob2Qgb3ZlcndyaXRlcyByZWdpc3RyeSBiYXNlZCBhdXRob3JpdHkgaWYgaXQgcHJldmlvdXNseSBleGlzdGVkIGluIHRoaXMKLSAgICAgKiBVUkkuPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIHBfaG9zdCB0aGUgaG9zdCBmb3IgdGhpcyBVUkkKLSAgICAgKiBAdGhyb3dzIE1hbGZvcm1lZFVSSUV4Y2VwdGlvbiBpZiBwX2hvc3QgaXMgbm90IGEgdmFsaWQgSVAgYWRkcmVzcyBvciBETlMgaG9zdG5hbWUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SG9zdChTdHJpbmcgcF9ob3N0KSB0aHJvd3MgTWFsZm9ybWVkVVJJRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHBfaG9zdCA9PSBudWxsIHx8IHBfaG9zdC5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICBpZiAocF9ob3N0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtX3JlZ0F1dGhvcml0eSA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtX2hvc3QgPSBwX2hvc3Q7Ci0gICAgICAgICAgICBtX3VzZXJpbmZvID0gbnVsbDsKLSAgICAgICAgICAgIG1fcG9ydCA9IC0xOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9IGVsc2UgaWYgKCFpc1dlbGxGb3JtZWRBZGRyZXNzKHBfaG9zdCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNYWxmb3JtZWRVUklFeGNlcHRpb24oIkhvc3QgaXMgbm90IGEgd2VsbCBmb3JtZWQgYWRkcmVzcyEiKTsKLSAgICAgICAgfQotICAgICAgICBtX2hvc3QgPSBwX2hvc3Q7Ci0gICAgICAgIG1fcmVnQXV0aG9yaXR5ID0gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIHBvcnQgZm9yIHRoaXMgVVJJLiAtMSBpcyB1c2VkIHRvIGluZGljYXRlIHRoYXQgdGhlIHBvcnQgaXMgbm90IHNwZWNpZmllZCwgb3RoZXJ3aXNlCi0gICAgICogdmFsaWQgcG9ydCBudW1iZXJzIGFyZSAgYmV0d2VlbiAwIGFuZCA2NTUzNS4gSWYgYSB2YWxpZCBwb3J0IG51bWJlciBpcyBwYXNzZWQgaW4gYW5kIHRoZSBob3N0Ci0gICAgICogZmllbGQgaXMgbnVsbCwgYW4gZXhjZXB0aW9uIGlzIHRocm93bi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwX3BvcnQgdGhlIHBvcnQgbnVtYmVyIGZvciB0aGlzIFVSSQotICAgICAqIEB0aHJvd3MgTWFsZm9ybWVkVVJJRXhjZXB0aW9uIGlmIHBfcG9ydCBpcyBub3QgLTEgYW5kIG5vdCBhIHZhbGlkIHBvcnQgbnVtYmVyCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UG9ydChpbnQgcF9wb3J0KSB0aHJvd3MgTWFsZm9ybWVkVVJJRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHBfcG9ydCA+PSAwICYmIHBfcG9ydCA8PSA2NTUzNSkgewotICAgICAgICAgICAgaWYgKG1faG9zdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1hbGZvcm1lZFVSSUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICJQb3J0IGNhbm5vdCBiZSBzZXQgd2hlbiBob3N0IGlzIG51bGwhIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAocF9wb3J0ICE9IC0xKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTWFsZm9ybWVkVVJJRXhjZXB0aW9uKCJJbnZhbGlkIHBvcnQgbnVtYmVyISIpOwotICAgICAgICB9Ci0gICAgICAgIG1fcG9ydCA9IHBfcG9ydDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8cD5TZXRzIHRoZSByZWdpc3RyeSBiYXNlZCBhdXRob3JpdHkgZm9yIHRoaXMgVVJJLjwvcD4KLSAgICAgKiA8cC8+Ci0gICAgICogPHA+Tm90ZTogVGhpcyBtZXRob2Qgb3ZlcndyaXRlcyBzZXJ2ZXIgYmFzZWQgYXV0aG9yaXR5IGlmIGl0IHByZXZpb3VzbHkgZXhpc3RlZCBpbiB0aGlzCi0gICAgICogVVJJLjwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhdXRob3JpdHkgdGhlIHJlZ2lzdHJ5IGJhc2VkIGF1dGhvcml0eSBmb3IgdGhpcyBVUkkKLSAgICAgKiBAdGhyb3dzIE1hbGZvcm1lZFVSSUV4Y2VwdGlvbiBpdCBhdXRob3JpdHkgaXMgbm90IGEgd2VsbCBmb3JtZWQgcmVnaXN0cnkgYmFzZWQgYXV0aG9yaXR5Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UmVnQmFzZWRBdXRob3JpdHkoU3RyaW5nIGF1dGhvcml0eSkKLSAgICAgICAgICAgIHRocm93cyBNYWxmb3JtZWRVUklFeGNlcHRpb24gewotCi0gICAgICAgIGlmIChhdXRob3JpdHkgPT0gbnVsbCkgewotICAgICAgICAgICAgbV9yZWdBdXRob3JpdHkgPSBudWxsOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIC8vIHJlZ19uYW1lID0gMSooIHVucmVzZXJ2ZWQgfCBlc2NhcGVkIHwgIiQiIHwgIiwiIHwKLSAgICAgICAgLy8gICAgICAgICAgICAiOyIgfCAiOiIgfCAiQCIgfCAiJiIgfCAiPSIgfCAiKyIgKQotICAgICAgICBlbHNlIGlmIChhdXRob3JpdHkubGVuZ3RoKCkgPCAxIHx8Ci0gICAgICAgICAgICAgICAgIWlzVmFsaWRSZWdpc3RyeUJhc2VkQXV0aG9yaXR5KGF1dGhvcml0eSkgfHwKLSAgICAgICAgICAgICAgICBhdXRob3JpdHkuaW5kZXhPZignLycpICE9IC0xKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTWFsZm9ybWVkVVJJRXhjZXB0aW9uKCJSZWdpc3RyeSBiYXNlZCBhdXRob3JpdHkgaXMgbm90IHdlbGwgZm9ybWVkLiIpOwotICAgICAgICB9Ci0gICAgICAgIG1fcmVnQXV0aG9yaXR5ID0gYXV0aG9yaXR5OwotICAgICAgICBtX2hvc3QgPSBudWxsOwotICAgICAgICBtX3VzZXJpbmZvID0gbnVsbDsKLSAgICAgICAgbV9wb3J0ID0gLTE7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBwYXRoIGZvciB0aGlzIFVSSS4gSWYgdGhlIHN1cHBsaWVkIHBhdGggaXMgbnVsbCwgdGhlbiB0aGUgcXVlcnkgc3RyaW5nIGFuZCBmcmFnbWVudCBhcmUKLSAgICAgKiBzZXQgdG8gbnVsbCBhcyB3ZWxsLiBJZiB0aGUgc3VwcGxpZWQgcGF0aCBpbmNsdWRlcyBhIHF1ZXJ5IHN0cmluZyBhbmQvb3IgZnJhZ21lbnQsIHRoZXNlIGZpZWxkcwotICAgICAqIHdpbGwgYmUgcGFyc2VkIGFuZCBzZXQgYXMgd2VsbC4gTm90ZSB0aGF0LCBmb3IgVVJJcyBmb2xsb3dpbmcgdGhlICJnZW5lcmljIFVSSSIgc3ludGF4LCB0aGUKLSAgICAgKiBwYXRoIHNwZWNpZmllZCBzaG91bGQgc3RhcnQgd2l0aCBhIHNsYXNoLiBGb3IgVVJJcyB0aGF0IGRvIG5vdCBmb2xsb3cgdGhlIGdlbmVyaWMgVVJJIHN5bnRheCwKLSAgICAgKiB0aGlzIG1ldGhvZCBzZXRzIHRoZSBzY2hlbWUtc3BlY2lmaWMgcGFydC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwX3BhdGggdGhlIHBhdGggZm9yIHRoaXMgVVJJIChtYXkgYmUgbnVsbCkKLSAgICAgKiBAdGhyb3dzIE1hbGZvcm1lZFVSSUV4Y2VwdGlvbiBpZiBwX3BhdGggY29udGFpbnMgaW52YWxpZCBjaGFyYWN0ZXJzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UGF0aChTdHJpbmcgcF9wYXRoKSB0aHJvd3MgTWFsZm9ybWVkVVJJRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHBfcGF0aCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtX3BhdGggPSBudWxsOwotICAgICAgICAgICAgbV9xdWVyeVN0cmluZyA9IG51bGw7Ci0gICAgICAgICAgICBtX2ZyYWdtZW50ID0gbnVsbDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGluaXRpYWxpemVQYXRoKHBfcGF0aCwgMCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgcGF0aCBvZiB0aGlzIFVSSS4gSWYgdGhlIGN1cnJlbnQgcGF0aCBkb2VzIG5vdCBlbmQgaW4gYSBzbGFzaCBhbmQgdGhlCi0gICAgICogcGF0aCB0byBiZSBhcHBlbmRlZCBkb2VzIG5vdCBiZWdpbiB3aXRoIGEgc2xhc2gsIGEgc2xhc2ggd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgY3VycmVudCBwYXRoCi0gICAgICogYmVmb3JlIHRoZSBuZXcgc2VnbWVudCBpcyBhZGRlZC4gQWxzbywgaWYgdGhlIGN1cnJlbnQgcGF0aCBlbmRzIGluIGEgc2xhc2ggYW5kIHRoZSBuZXcgc2VnbWVudAotICAgICAqIGJlZ2lucyB3aXRoIGEgc2xhc2gsIHRoZSBleHRyYSBzbGFzaCB3aWxsIGJlIHJlbW92ZWQgYmVmb3JlIHRoZSBuZXcgc2VnbWVudCBpcyBhcHBlbmRlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwX2FkZFRvUGF0aCB0aGUgbmV3IHNlZ21lbnQgdG8gYmUgYWRkZWQgdG8gdGhlIGN1cnJlbnQgcGF0aAotICAgICAqIEB0aHJvd3MgTWFsZm9ybWVkVVJJRXhjZXB0aW9uIGlmIHBfYWRkVG9QYXRoIGNvbnRhaW5zIHN5bnRheCBlcnJvcnMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhcHBlbmRQYXRoKFN0cmluZyBwX2FkZFRvUGF0aCkKLSAgICAgICAgICAgIHRocm93cyBNYWxmb3JtZWRVUklFeGNlcHRpb24gewotICAgICAgICBpZiAocF9hZGRUb1BhdGggPT0gbnVsbCB8fCBwX2FkZFRvUGF0aC50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFpc1VSSVN0cmluZyhwX2FkZFRvUGF0aCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNYWxmb3JtZWRVUklFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICJQYXRoIGNvbnRhaW5zIGludmFsaWQgY2hhcmFjdGVyISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1fcGF0aCA9PSBudWxsIHx8IG1fcGF0aC50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgaWYgKHBfYWRkVG9QYXRoLnN0YXJ0c1dpdGgoIi8iKSkgewotICAgICAgICAgICAgICAgIG1fcGF0aCA9IHBfYWRkVG9QYXRoOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtX3BhdGggPSAiLyIgKyBwX2FkZFRvUGF0aDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChtX3BhdGguZW5kc1dpdGgoIi8iKSkgewotICAgICAgICAgICAgaWYgKHBfYWRkVG9QYXRoLnN0YXJ0c1dpdGgoIi8iKSkgewotICAgICAgICAgICAgICAgIG1fcGF0aCA9IG1fcGF0aC5jb25jYXQocF9hZGRUb1BhdGguc3Vic3RyaW5nKDEpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbV9wYXRoID0gbV9wYXRoLmNvbmNhdChwX2FkZFRvUGF0aCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAocF9hZGRUb1BhdGguc3RhcnRzV2l0aCgiLyIpKSB7Ci0gICAgICAgICAgICAgICAgbV9wYXRoID0gbV9wYXRoLmNvbmNhdChwX2FkZFRvUGF0aCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1fcGF0aCA9IG1fcGF0aC5jb25jYXQoIi8iICsgcF9hZGRUb1BhdGgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBxdWVyeSBzdHJpbmcgZm9yIHRoaXMgVVJJLiBBIG5vbi1udWxsIHZhbHVlIGlzIHZhbGlkIG9ubHkgaWYgdGhpcyBpcyBhbiBVUkkgY29uZm9ybWluZwotICAgICAqIHRvIHRoZSBnZW5lcmljIFVSSSBzeW50YXggYW5kIHRoZSBwYXRoIHZhbHVlIGlzIG5vdCBudWxsLgotICAgICAqCi0gICAgICogQHBhcmFtIHBfcXVlcnlTdHJpbmcgdGhlIHF1ZXJ5IHN0cmluZyBmb3IgdGhpcyBVUkkKLSAgICAgKiBAdGhyb3dzIE1hbGZvcm1lZFVSSUV4Y2VwdGlvbiBpZiBwX3F1ZXJ5U3RyaW5nIGlzIG5vdCBudWxsIGFuZCB0aGlzIFVSSSBkb2VzIG5vdCBjb25mb3JtIHRvIHRoZQotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyaWMgVVJJIHN5bnRheCBvciBpZiB0aGUgcGF0aCBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UXVlcnlTdHJpbmcoU3RyaW5nIHBfcXVlcnlTdHJpbmcpIHRocm93cyBNYWxmb3JtZWRVUklFeGNlcHRpb24gewotICAgICAgICBpZiAocF9xdWVyeVN0cmluZyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtX3F1ZXJ5U3RyaW5nID0gbnVsbDsKLSAgICAgICAgfSBlbHNlIGlmICghaXNHZW5lcmljVVJJKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNYWxmb3JtZWRVUklFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICJRdWVyeSBzdHJpbmcgY2FuIG9ubHkgYmUgc2V0IGZvciBhIGdlbmVyaWMgVVJJISIpOwotICAgICAgICB9IGVsc2UgaWYgKHRoaXMubV9wYXRoID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNYWxmb3JtZWRVUklFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICJRdWVyeSBzdHJpbmcgY2Fubm90IGJlIHNldCB3aGVuIHBhdGggaXMgbnVsbCEiKTsKLSAgICAgICAgfSBlbHNlIGlmICghaXNVUklTdHJpbmcocF9xdWVyeVN0cmluZykpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNYWxmb3JtZWRVUklFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICJRdWVyeSBzdHJpbmcgY29udGFpbnMgaW52YWxpZCBjaGFyYWN0ZXIhIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtX3F1ZXJ5U3RyaW5nID0gcF9xdWVyeVN0cmluZzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgZnJhZ21lbnQgZm9yIHRoaXMgVVJJLiBBIG5vbi1udWxsIHZhbHVlIGlzIHZhbGlkIG9ubHkgaWYgdGhpcyBpcyBhIFVSSSBjb25mb3JtaW5nIHRvCi0gICAgICogdGhlIGdlbmVyaWMgVVJJIHN5bnRheCBhbmQgdGhlIHBhdGggdmFsdWUgaXMgbm90IG51bGwuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcF9mcmFnbWVudCB0aGUgZnJhZ21lbnQgZm9yIHRoaXMgVVJJCi0gICAgICogQHRocm93cyBNYWxmb3JtZWRVUklFeGNlcHRpb24gaWYgcF9mcmFnbWVudCBpcyBub3QgbnVsbCBhbmQgdGhpcyBVUkkgZG9lcyBub3QgY29uZm9ybSB0byB0aGUKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmljIFVSSSBzeW50YXggb3IgaWYgdGhlIHBhdGggaXMgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEZyYWdtZW50KFN0cmluZyBwX2ZyYWdtZW50KSB0aHJvd3MgTWFsZm9ybWVkVVJJRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHBfZnJhZ21lbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgbV9mcmFnbWVudCA9IG51bGw7Ci0gICAgICAgIH0gZWxzZSBpZiAoIWlzR2VuZXJpY1VSSSgpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTWFsZm9ybWVkVVJJRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiRnJhZ21lbnQgY2FuIG9ubHkgYmUgc2V0IGZvciBhIGdlbmVyaWMgVVJJISIpOwotICAgICAgICB9IGVsc2UgaWYgKGdldFBhdGgoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTWFsZm9ybWVkVVJJRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiRnJhZ21lbnQgY2Fubm90IGJlIHNldCB3aGVuIHBhdGggaXMgbnVsbCEiKTsKLSAgICAgICAgfSBlbHNlIGlmICghaXNVUklTdHJpbmcocF9mcmFnbWVudCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNYWxmb3JtZWRVUklFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICJGcmFnbWVudCBjb250YWlucyBpbnZhbGlkIGNoYXJhY3RlciEiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1fZnJhZ21lbnQgPSBwX2ZyYWdtZW50OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGV0ZXJtaW5lcyBpZiB0aGUgcGFzc2VkLWluIE9iamVjdCBpcyBlcXVpdmFsZW50IHRvIHRoaXMgVVJJLgotICAgICAqCi0gICAgICogQHBhcmFtIHBfdGVzdCB0aGUgT2JqZWN0IHRvIHRlc3QgZm9yIGVxdWFsaXR5LgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBwX3Rlc3QgaXMgYSBVUkkgd2l0aCBhbGwgdmFsdWVzIGVxdWFsIHRvIHRoaXMgVVJJLCBmYWxzZSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IHBfdGVzdCkgewotICAgICAgICBpZiAocF90ZXN0IGluc3RhbmNlb2YgVVJJKSB7Ci0gICAgICAgICAgICBVUkkgdGVzdFVSSSA9IChVUkkpcF90ZXN0OwotICAgICAgICAgICAgaWYgKCgobV9zY2hlbWUgPT0gbnVsbCAmJiB0ZXN0VVJJLm1fc2NoZW1lID09IG51bGwpIHx8Ci0gICAgICAgICAgICAgICAgICAgIChtX3NjaGVtZSAhPSBudWxsICYmIHRlc3RVUkkubV9zY2hlbWUgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fc2NoZW1lLmVxdWFscyh0ZXN0VVJJLm1fc2NoZW1lKSkpICYmCi0gICAgICAgICAgICAgICAgICAgICgobV91c2VyaW5mbyA9PSBudWxsICYmIHRlc3RVUkkubV91c2VyaW5mbyA9PSBudWxsKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtX3VzZXJpbmZvICE9IG51bGwgJiYgdGVzdFVSSS5tX3VzZXJpbmZvICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdXNlcmluZm8uZXF1YWxzKHRlc3RVUkkubV91c2VyaW5mbykpKSAmJgotICAgICAgICAgICAgICAgICAgICAoKG1faG9zdCA9PSBudWxsICYmIHRlc3RVUkkubV9ob3N0ID09IG51bGwpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1faG9zdCAhPSBudWxsICYmIHRlc3RVUkkubV9ob3N0ICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1faG9zdC5lcXVhbHModGVzdFVSSS5tX2hvc3QpKSkgJiYKLSAgICAgICAgICAgICAgICAgICAgbV9wb3J0ID09IHRlc3RVUkkubV9wb3J0ICYmCi0gICAgICAgICAgICAgICAgICAgICgobV9wYXRoID09IG51bGwgJiYgdGVzdFVSSS5tX3BhdGggPT0gbnVsbCkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAobV9wYXRoICE9IG51bGwgJiYgdGVzdFVSSS5tX3BhdGggIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wYXRoLmVxdWFscyh0ZXN0VVJJLm1fcGF0aCkpKSAmJgotICAgICAgICAgICAgICAgICAgICAoKG1fcXVlcnlTdHJpbmcgPT0gbnVsbCAmJiB0ZXN0VVJJLm1fcXVlcnlTdHJpbmcgPT0gbnVsbCkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAobV9xdWVyeVN0cmluZyAhPSBudWxsICYmIHRlc3RVUkkubV9xdWVyeVN0cmluZyAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3F1ZXJ5U3RyaW5nLmVxdWFscyh0ZXN0VVJJLm1fcXVlcnlTdHJpbmcpKSkgJiYKLSAgICAgICAgICAgICAgICAgICAgKChtX2ZyYWdtZW50ID09IG51bGwgJiYgdGVzdFVSSS5tX2ZyYWdtZW50ID09IG51bGwpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1fZnJhZ21lbnQgIT0gbnVsbCAmJiB0ZXN0VVJJLm1fZnJhZ21lbnQgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9mcmFnbWVudC5lcXVhbHModGVzdFVSSS5tX2ZyYWdtZW50KSkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBoYXNoLWNvZGUgdmFsdWUgZm9yIHRoaXMgVVJJLiAgVGhlIGhhc2ggY29kZSBpcyBiYXNlZCB1cG9uIGFsbCBvZiB0aGUgVVJJJ3MKLSAgICAgKiBjb21wb25lbnRzLCBhbmQgc2F0aXNmaWVzIHRoZSBnZW5lcmFsIGNvbnRyYWN0IG9mIHRoZSB7QGxpbmsgT2JqZWN0I2hhc2hDb2RlKCkKLSAgICAgKiBPYmplY3QuaGFzaENvZGV9IG1ldGhvZC4gPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiBBIGhhc2gtY29kZSB2YWx1ZSBmb3IgdGhpcyBVUkkKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICByZXR1cm4gdG9TdHJpbmcoKS5oYXNoQ29kZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgVVJJIGFzIGEgc3RyaW5nIHNwZWNpZmljYXRpb24uIFNlZSBSRkMgMjM5NiBTZWN0aW9uIDUuMi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIFVSSSBzdHJpbmcgc3BlY2lmaWNhdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciB1cmlTcGVjU3RyaW5nID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0gICAgICAgIGlmIChtX3NjaGVtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB1cmlTcGVjU3RyaW5nLmFwcGVuZChtX3NjaGVtZSk7Ci0gICAgICAgICAgICB1cmlTcGVjU3RyaW5nLmFwcGVuZCgnOicpOwotICAgICAgICB9Ci0gICAgICAgIHVyaVNwZWNTdHJpbmcuYXBwZW5kKGdldFNjaGVtZVNwZWNpZmljUGFydCgpKTsKLSAgICAgICAgcmV0dXJuIHVyaVNwZWNTdHJpbmcudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGluZGljYXRvciBhcyB0byB3aGV0aGVyIHRoaXMgVVJJIHVzZXMgdGhlICJnZW5lcmljIFVSSSIgc3ludGF4LgotICAgICAqCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgVVJJIHVzZXMgdGhlICJnZW5lcmljIFVSSSIgc3ludGF4LCBmYWxzZSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0dlbmVyaWNVUkkoKSB7Ci0gICAgICAgIC8vIHByZXNlbmNlIG9mIHRoZSBob3N0ICh3aGV0aGVyIHZhbGlkIG9yIGVtcHR5KSBtZWFucwotICAgICAgICAvLyBkb3VibGUtc2xhc2hlcyB3aGljaCBtZWFucyBnZW5lcmljIHVyaQotICAgICAgICByZXR1cm4gKG1faG9zdCAhPSBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZXRlcm1pbmUgd2hldGhlciBhIHNjaGVtZSBjb25mb3JtcyB0byB0aGUgcnVsZXMgZm9yIGEgc2NoZW1lIG5hbWUuIEEgc2NoZW1lIGlzIGNvbmZvcm1hbnQgaWYKLSAgICAgKiBpdCBzdGFydHMgd2l0aCBhbiBhbHBoYW51bWVyaWMsIGFuZCBjb250YWlucyBvbmx5IGFscGhhbnVtZXJpY3MsICcrJywnLScgYW5kICcuJy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc2NoZW1lIGlzIGNvbmZvcm1hbnQsIGZhbHNlIG90aGVyd2lzZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0NvbmZvcm1hbnRTY2hlbWVOYW1lKFN0cmluZyBwX3NjaGVtZSkgewotICAgICAgICBpZiAocF9zY2hlbWUgPT0gbnVsbCB8fCBwX3NjaGVtZS50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFpc0FscGhhKHBfc2NoZW1lLmNoYXJBdCgwKSkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGNoYXIgdGVzdENoYXI7Ci0gICAgICAgIGludCBzY2hlbWVMZW5ndGggPSBwX3NjaGVtZS5sZW5ndGgoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBzY2hlbWVMZW5ndGg7ICsraSkgewotICAgICAgICAgICAgdGVzdENoYXIgPSBwX3NjaGVtZS5jaGFyQXQoaSk7Ci0gICAgICAgICAgICBpZiAoIWlzU2NoZW1lQ2hhcmFjdGVyKHRlc3RDaGFyKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERldGVybWluZSB3aGV0aGVyIGEgc3RyaW5nIGlzIHN5bnRhY3RpY2FsbHkgY2FwYWJsZSBvZiByZXByZXNlbnRpbmcgYSB2YWxpZCBJUHY0IGFkZHJlc3MsIElQdjYKLSAgICAgKiByZWZlcmVuY2Ugb3IgdGhlIGRvbWFpbiBuYW1lIG9mIGEgbmV0d29yayBob3N0LiBBIHZhbGlkIElQdjQgYWRkcmVzcyBjb25zaXN0cyBvZiBmb3VyIGRlY2ltYWwKLSAgICAgKiBkaWdpdCBncm91cHMgc2VwYXJhdGVkIGJ5IGEgJy4nLiBFYWNoIGdyb3VwIG11c3QgY29uc2lzdCBvZiBvbmUgdG8gdGhyZWUgZGlnaXRzLiBTZWUgUkZDIDI3MzIKLSAgICAgKiBTZWN0aW9uIDMsIGFuZCBSRkMgMjM3MyBTZWN0aW9uIDIuMiwgZm9yIHRoZSBkZWZpbml0aW9uIG9mIElQdjYgcmVmZXJlbmNlcy4gQSBob3N0bmFtZSBjb25zaXN0cwotICAgICAqIG9mIGRvbWFpbiBsYWJlbHMgKGVhY2ggb2Ygd2hpY2ggbXVzdCBiZWdpbiBhbmQgZW5kIHdpdGggYW4gYWxwaGFudW1lcmljIGJ1dCBtYXkgY29udGFpbiAnLScpCi0gICAgICogc2VwYXJhdGVkICYgYnkgYSAnLicuIFNlZSBSRkMgMjM5NiBTZWN0aW9uIDMuMi4yLgotICAgICAqCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBzdHJpbmcgaXMgYSBzeW50YWN0aWNhbGx5IHZhbGlkIElQdjQgYWRkcmVzcywgSVB2NiByZWZlcmVuY2Ugb3IgaG9zdG5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNXZWxsRm9ybWVkQWRkcmVzcyhTdHJpbmcgYWRkcmVzcykgewotICAgICAgICBpZiAoYWRkcmVzcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgYWRkckxlbmd0aCA9IGFkZHJlc3MubGVuZ3RoKCk7Ci0gICAgICAgIGlmIChhZGRyTGVuZ3RoID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIENoZWNrIGlmIHRoZSBob3N0IGlzIGEgdmFsaWQgSVB2NnJlZmVyZW5jZS4KLSAgICAgICAgaWYgKGFkZHJlc3Muc3RhcnRzV2l0aCgiWyIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gaXNXZWxsRm9ybWVkSVB2NlJlZmVyZW5jZShhZGRyZXNzKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIENhbm5vdCBzdGFydCB3aXRoIGEgJy4nLCAnLScsIG9yIGVuZCB3aXRoIGEgJy0nLgotICAgICAgICBpZiAoYWRkcmVzcy5zdGFydHNXaXRoKCIuIikgfHwKLSAgICAgICAgICAgICAgICBhZGRyZXNzLnN0YXJ0c1dpdGgoIi0iKSB8fAotICAgICAgICAgICAgICAgIGFkZHJlc3MuZW5kc1dpdGgoIi0iKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gcmlnaHRtb3N0IGRvbWFpbiBsYWJlbCBzdGFydGluZyB3aXRoIGRpZ2l0IGluZGljYXRlcyBJUCBhZGRyZXNzCi0gICAgICAgIC8vIHNpbmNlIHRvcCBsZXZlbCBkb21haW4gbGFiZWwgY2FuIG9ubHkgc3RhcnQgd2l0aCBhbiBhbHBoYQotICAgICAgICAvLyBzZWUgUkZDIDIzOTYgU2VjdGlvbiAzLjIuMgotICAgICAgICBpbnQgaW5kZXggPSBhZGRyZXNzLmxhc3RJbmRleE9mKCcuJyk7Ci0gICAgICAgIGlmIChhZGRyZXNzLmVuZHNXaXRoKCIuIikpIHsKLSAgICAgICAgICAgIGluZGV4ID0gYWRkcmVzcy5zdWJzdHJpbmcoMCwgaW5kZXgpLmxhc3RJbmRleE9mKCcuJyk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaW5kZXggKyAxIDwgYWRkckxlbmd0aCAmJiBpc0RpZ2l0KGFkZHJlc3MuY2hhckF0KGluZGV4ICsgMSkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gaXNXZWxsRm9ybWVkSVB2NEFkZHJlc3MoYWRkcmVzcyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBob3N0bmFtZSAgICAgID0gKiggZG9tYWlubGFiZWwgIi4iICkgdG9wbGFiZWwgWyAiLiIgXQotICAgICAgICAgICAgLy8gZG9tYWlubGFiZWwgICA9IGFscGhhbnVtIHwgYWxwaGFudW0gKiggYWxwaGFudW0gfCAiLSIgKSBhbHBoYW51bQotICAgICAgICAgICAgLy8gdG9wbGFiZWwgICAgICA9IGFscGhhIHwgYWxwaGEgKiggYWxwaGFudW0gfCAiLSIgKSBhbHBoYW51bQotCi0gICAgICAgICAgICAvLyBSRkMgMjM5NiBzdGF0ZXMgdGhhdCBob3N0bmFtZXMgdGFrZSB0aGUgZm9ybSBkZXNjcmliZWQgaW4KLSAgICAgICAgICAgIC8vIFJGQyAxMDM0IChTZWN0aW9uIDMpIGFuZCBSRkMgMTEyMyAoU2VjdGlvbiAyLjEpLiBBY2NvcmRpbmcKLSAgICAgICAgICAgIC8vIHRvIFJGQyAxMDM0LCBob3N0bmFtZXMgYXJlIGxpbWl0ZWQgdG8gMjU1IGNoYXJhY3RlcnMuCi0gICAgICAgICAgICBpZiAoYWRkckxlbmd0aCA+IDI1NSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gZG9tYWluIGxhYmVscyBjYW4gY29udGFpbiBhbHBoYW51bWVyaWNzIGFuZCAnLSIKLSAgICAgICAgICAgIC8vIGJ1dCBtdXN0IHN0YXJ0IGFuZCBlbmQgd2l0aCBhbiBhbHBoYW51bWVyaWMKLSAgICAgICAgICAgIGNoYXIgdGVzdENoYXI7Ci0gICAgICAgICAgICBpbnQgbGFiZWxDaGFyQ291bnQgPSAwOwotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFkZHJMZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIHRlc3RDaGFyID0gYWRkcmVzcy5jaGFyQXQoaSk7Ci0gICAgICAgICAgICAgICAgaWYgKHRlc3RDaGFyID09ICcuJykgewotICAgICAgICAgICAgICAgICAgICBpZiAoIWlzQWxwaGFudW0oYWRkcmVzcy5jaGFyQXQoaSAtIDEpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpICsgMSA8IGFkZHJMZW5ndGggJiYgIWlzQWxwaGFudW0oYWRkcmVzcy5jaGFyQXQoaSArIDEpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGxhYmVsQ2hhckNvdW50ID0gMDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFpc0FscGhhbnVtKHRlc3RDaGFyKSAmJiB0ZXN0Q2hhciAhPSAnLScpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBSRkMgMTAzNDogTGFiZWxzIG11c3QgYmUgNjMgY2hhcmFjdGVycyBvciBsZXNzLgotICAgICAgICAgICAgICAgIGVsc2UgaWYgKCsrbGFiZWxDaGFyQ291bnQgPiA2MykgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDxwPkRldGVybWluZXMgd2hldGhlciBhIHN0cmluZyBpcyBhbiBJUHY0IGFkZHJlc3MgYXMgZGVmaW5lZCBieSBSRkMgMjM3MywgYW5kIHVuZGVyIHRoZSBmdXJ0aGVyCi0gICAgICogY29uc3RyYWludCB0aGF0IGl0IG11c3QgYmUgYSAzMi1iaXQgYWRkcmVzcy4gVGhvdWdoIG5vdCBleHByZXNzZWQgaW4gdGhlIGdyYW1tYXIsIGluIG9yZGVyIHRvCi0gICAgICogc2F0aXNmeSB0aGUgMzItYml0IGFkZHJlc3MgY29uc3RyYWludCwgZWFjaCBzZWdtZW50IG9mIHRoZSBhZGRyZXNzIGNhbm5vdCBiZSBncmVhdGVyIHRoYW4gMjU1Ci0gICAgICogKDggYml0cyBvZiBpbmZvcm1hdGlvbikuPC9wPgotICAgICAqIDxwLz4KLSAgICAgKiA8cD48Y29kZT5JUHY0YWRkcmVzcyA9IDEqM0RJR0lUICIuIiAxKjNESUdJVCAiLiIgMSozRElHSVQgIi4iIDEqM0RJR0lUPC9jb2RlPjwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc3RyaW5nIGlzIGEgc3ludGFjdGljYWxseSB2YWxpZCBJUHY0IGFkZHJlc3MKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNXZWxsRm9ybWVkSVB2NEFkZHJlc3MoU3RyaW5nIGFkZHJlc3MpIHsKLQotICAgICAgICBpbnQgYWRkckxlbmd0aCA9IGFkZHJlc3MubGVuZ3RoKCk7Ci0gICAgICAgIGNoYXIgdGVzdENoYXI7Ci0gICAgICAgIGludCBudW1Eb3RzID0gMDsKLSAgICAgICAgaW50IG51bURpZ2l0cyA9IDA7Ci0KLSAgICAgICAgLy8gbWFrZSBzdXJlIHRoYXQgMSkgd2Ugc2VlIG9ubHkgZGlnaXRzIGFuZCBkb3Qgc2VwYXJhdG9ycywgMikgdGhhdAotICAgICAgICAvLyBhbnkgZG90IHNlcGFyYXRvciBpcyBwcmVjZWRlZCBhbmQgZm9sbG93ZWQgYnkgYSBkaWdpdCBhbmQKLSAgICAgICAgLy8gMykgdGhhdCB3ZSBmaW5kIDMgZG90cwotICAgICAgICAvLwotICAgICAgICAvLyBSRkMgMjczMiBhbWVuZGVkIFJGQyAyMzk2IGJ5IHJlcGxhY2luZyB0aGUgZGVmaW5pdGlvbgotICAgICAgICAvLyBvZiBJUHY0YWRkcmVzcyB3aXRoIHRoZSBvbmUgZGVmaW5lZCBieSBSRkMgMjM3My4gLSBtcmdsYXZhcwotICAgICAgICAvLwotICAgICAgICAvLyBJUHY0YWRkcmVzcyA9IDEqM0RJR0lUICIuIiAxKjNESUdJVCAiLiIgMSozRElHSVQgIi4iIDEqM0RJR0lUCi0gICAgICAgIC8vCi0gICAgICAgIC8vIE9uZSB0byB0aHJlZSBkaWdpdHMgbXVzdCBiZSBpbiBlYWNoIHNlZ21lbnQuCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWRkckxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICB0ZXN0Q2hhciA9IGFkZHJlc3MuY2hhckF0KGkpOwotICAgICAgICAgICAgaWYgKHRlc3RDaGFyID09ICcuJykgewotICAgICAgICAgICAgICAgIGlmICgoaSA+IDAgJiYgIWlzRGlnaXQoYWRkcmVzcy5jaGFyQXQoaSAtIDEpKSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIChpICsgMSA8IGFkZHJMZW5ndGggJiYgIWlzRGlnaXQoYWRkcmVzcy5jaGFyQXQoaSArIDEpKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBudW1EaWdpdHMgPSAwOwotICAgICAgICAgICAgICAgIGlmICgrK251bURvdHMgPiAzKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFpc0RpZ2l0KHRlc3RDaGFyKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIENoZWNrIHRoYXQgdGhhdCB0aGVyZSBhcmUgbm8gbW9yZSB0aGFuIHRocmVlIGRpZ2l0cwotICAgICAgICAgICAgLy8gaW4gdGhpcyBzZWdtZW50LgotICAgICAgICAgICAgZWxzZSBpZiAoKytudW1EaWdpdHMgPiAzKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gQ2hlY2sgdGhhdCB0aGlzIHNlZ21lbnQgaXMgbm90IGdyZWF0ZXIgdGhhbiAyNTUuCi0gICAgICAgICAgICBlbHNlIGlmIChudW1EaWdpdHMgPT0gMykgewotICAgICAgICAgICAgICAgIGNoYXIgZmlyc3QgPSBhZGRyZXNzLmNoYXJBdChpIC0gMik7Ci0gICAgICAgICAgICAgICAgY2hhciBzZWNvbmQgPSBhZGRyZXNzLmNoYXJBdChpIC0gMSk7Ci0gICAgICAgICAgICAgICAgaWYgKCEoZmlyc3QgPCAnMicgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIChmaXJzdCA9PSAnMicgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlY29uZCA8ICc1JyB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWNvbmQgPT0gJzUnICYmIHRlc3RDaGFyIDw9ICc1JykpKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKG51bURvdHMgPT0gMyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPHA+RGV0ZXJtaW5lcyB3aGV0aGVyIGEgc3RyaW5nIGlzIGFuIElQdjYgcmVmZXJlbmNlIGFzIGRlZmluZWQgYnkgUkZDIDI3MzIsIHdoZXJlIElQdjZhZGRyZXNzCi0gICAgICogaXMgZGVmaW5lZCBpbiBSRkMgMjM3My4gVGhlIElQdjYgYWRkcmVzcyBpcyBwYXJzZWQgYWNjb3JkaW5nIHRvIFNlY3Rpb24gMi4yIG9mIFJGQyAyMzczLCB3aXRoCi0gICAgICogdGhlIGFkZGl0aW9uYWwgY29uc3RyYWludCB0aGF0IHRoZSBhZGRyZXNzIGJlIGNvbXBvc2VkIG9mIDEyOCBiaXRzIG9mIGluZm9ybWF0aW9uLjwvcD4KLSAgICAgKiA8cC8+Ci0gICAgICogPHA+PGNvZGU+SVB2NnJlZmVyZW5jZSA9ICJbIiBJUHY2YWRkcmVzcyAiXSI8L2NvZGU+PC9wPgotICAgICAqIDxwLz4KLSAgICAgKiA8cD5Ob3RlOiBUaGUgQk5GIGV4cHJlc3NlZCBpbiBSRkMgMjM3MyBBcHBlbmRpeCBCIGRvZXMgbm90IGFjY3VyYXRlbHkgZGVzY3JpYmUgc2VjdGlvbiAyLjIsIGFuZAotICAgICAqIHdhcyBpbiBmYWN0IHJlbW92ZWQgZnJvbSBSRkMgMzUxMywgdGhlIHN1Y2Nlc3NvciBvZiBSRkMgMjM3My48L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHN0cmluZyBpcyBhIHN5bnRhY3RpY2FsbHkgdmFsaWQgSVB2NiByZWZlcmVuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNXZWxsRm9ybWVkSVB2NlJlZmVyZW5jZShTdHJpbmcgYWRkcmVzcykgewotCi0gICAgICAgIGludCBhZGRyTGVuZ3RoID0gYWRkcmVzcy5sZW5ndGgoKTsKLSAgICAgICAgaW50IGluZGV4ID0gMTsKLSAgICAgICAgaW50IGVuZCA9IGFkZHJMZW5ndGggLSAxOwotCi0gICAgICAgIC8vIENoZWNrIGlmIHN0cmluZyBpcyBhIHBvdGVudGlhbCBtYXRjaCBmb3IgSVB2NnJlZmVyZW5jZS4KLSAgICAgICAgaWYgKCEoYWRkckxlbmd0aCA+IDIgJiYgYWRkcmVzcy5jaGFyQXQoMCkgPT0gJ1snCi0gICAgICAgICAgICAgICAgJiYgYWRkcmVzcy5jaGFyQXQoZW5kKSA9PSAnXScpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBDb3VudGVyIGZvciB0aGUgbnVtYmVyIG9mIDE2LWJpdCBzZWN0aW9ucyByZWFkIGluIHRoZSBhZGRyZXNzLgotICAgICAgICBpbnQgW10gY291bnRlciA9IG5ldyBpbnRbMV07Ci0KLSAgICAgICAgLy8gU2NhbiBoZXggc2VxdWVuY2UgYmVmb3JlIHBvc3NpYmxlICc6Oicgb3IgSVB2NCBhZGRyZXNzLgotICAgICAgICBpbmRleCA9IHNjYW5IZXhTZXF1ZW5jZShhZGRyZXNzLCBpbmRleCwgZW5kLCBjb3VudGVyKTsKLSAgICAgICAgaWYgKGluZGV4ID09IC0xKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gQWRkcmVzcyBtdXN0IGNvbnRhaW4gMTI4LWJpdHMgb2YgaW5mb3JtYXRpb24uCi0gICAgICAgIGVsc2UgaWYgKGluZGV4ID09IGVuZCkgewotICAgICAgICAgICAgcmV0dXJuIChjb3VudGVyWzBdID09IDgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGluZGV4ICsgMSA8IGVuZCAmJiBhZGRyZXNzLmNoYXJBdChpbmRleCkgPT0gJzonKSB7Ci0gICAgICAgICAgICBpZiAoYWRkcmVzcy5jaGFyQXQoaW5kZXggKyAxKSA9PSAnOicpIHsKLSAgICAgICAgICAgICAgICAvLyAnOjonIHJlcHJlc2VudHMgYXQgbGVhc3Qgb25lIDE2LWJpdCBncm91cCBvZiB6ZXJvcy4KLSAgICAgICAgICAgICAgICBpZiAoKytjb3VudGVyWzBdID4gOCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGluZGV4ICs9IDI7Ci0gICAgICAgICAgICAgICAgLy8gVHJhaWxpbmcgemVyb3Mgd2lsbCBmaWxsIG91dCB0aGUgcmVzdCBvZiB0aGUgYWRkcmVzcy4KLSAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT0gZW5kKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIElmIHRoZSBzZWNvbmQgY2hhcmFjdGVyIHdhc24ndCAnOicsIGluIG9yZGVyIHRvIGJlIHZhbGlkLAotICAgICAgICAgICAgLy8gdGhlIHJlbWFpbmRlciBvZiB0aGUgc3RyaW5nIG11c3QgbWF0Y2ggSVB2NEFkZHJlc3MsCi0gICAgICAgICAgICAvLyBhbmQgd2UgbXVzdCBoYXZlIHJlYWQgZXhhY3RseSA2IDE2LWJpdCBncm91cHMuCi0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKGNvdW50ZXJbMF0gPT0gNikgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIGlzV2VsbEZvcm1lZElQdjRBZGRyZXNzKGFkZHJlc3Muc3Vic3RyaW5nKGluZGV4ICsgMSwgZW5kKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyAzLiBTY2FuIGhleCBzZXF1ZW5jZSBhZnRlciAnOjonLgotICAgICAgICBpbnQgcHJldkNvdW50ID0gY291bnRlclswXTsKLSAgICAgICAgaW5kZXggPSBzY2FuSGV4U2VxdWVuY2UoYWRkcmVzcywgaW5kZXgsIGVuZCwgY291bnRlcik7Ci0KLSAgICAgICAgLy8gV2UndmUgZWl0aGVyIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgc3RyaW5nLCB0aGUgYWRkcmVzcyBlbmRzIGluCi0gICAgICAgIC8vIGFuIElQdjQgYWRkcmVzcywgb3IgaXQgaXMgaW52YWxpZC4gc2NhbkhleFNlcXVlbmNlIGhhcyBhbHJlYWR5Ci0gICAgICAgIC8vIG1hZGUgc3VyZSB0aGF0IHdlIGhhdmUgdGhlIHJpZ2h0IG51bWJlciBvZiBiaXRzLgotICAgICAgICByZXR1cm4gKGluZGV4ID09IGVuZCkgfHwKLSAgICAgICAgICAgICAgICAoaW5kZXggIT0gLTEgJiYgaXNXZWxsRm9ybWVkSVB2NEFkZHJlc3MoCi0gICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLnN1YnN0cmluZygoY291bnRlclswXSA+IHByZXZDb3VudCkgPyBpbmRleCArIDEgOiBpbmRleCwgZW5kKSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhlbHBlciBtZXRob2QgZm9yIGlzV2VsbEZvcm1lZElQdjZSZWZlcmVuY2Ugd2hpY2ggc2NhbnMgdGhlIGhleCBzZXF1ZW5jZXMgb2YgYW4gSVB2NiBhZGRyZXNzLgotICAgICAqIEl0IHJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBuZXh0IGNoYXJhY3RlciB0byBzY2FuIGluIHRoZSBhZGRyZXNzLCBvciAtMSBpZiB0aGUgc3RyaW5nIGNhbm5vdAotICAgICAqIG1hdGNoIGEgdmFsaWQgSVB2NiBhZGRyZXNzLgotICAgICAqCi0gICAgICogQHBhcmFtIGFkZHJlc3MgdGhlIHN0cmluZyB0byBiZSBzY2FubmVkCi0gICAgICogQHBhcmFtIGluZGV4ICAgdGhlIGJlZ2lubmluZyBpbmRleCAoaW5jbHVzaXZlKQotICAgICAqIEBwYXJhbSBlbmQgICAgIHRoZSBlbmRpbmcgaW5kZXggKGV4Y2x1c2l2ZSkKLSAgICAgKiBAcGFyYW0gY291bnRlciBhIGNvdW50ZXIgZm9yIHRoZSBudW1iZXIgb2YgMTYtYml0IHNlY3Rpb25zIHJlYWQgaW4gdGhlIGFkZHJlc3MKLSAgICAgKiBAcmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgbmV4dCBjaGFyYWN0ZXIgdG8gc2Nhbiwgb3IgLTEgaWYgdGhlIHN0cmluZyBjYW5ub3QgbWF0Y2ggYSB2YWxpZCBJUHY2Ci0gICAgICogICAgICAgICBhZGRyZXNzCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IHNjYW5IZXhTZXF1ZW5jZShTdHJpbmcgYWRkcmVzcywgaW50IGluZGV4LCBpbnQgZW5kLCBpbnQgW10gY291bnRlcikgewotCi0gICAgICAgIGNoYXIgdGVzdENoYXI7Ci0gICAgICAgIGludCBudW1EaWdpdHMgPSAwOwotICAgICAgICBpbnQgc3RhcnQgPSBpbmRleDsKLQotICAgICAgICAvLyBUcnlpbmcgdG8gbWF0Y2ggdGhlIGZvbGxvd2luZyBwcm9kdWN0aW9uczoKLSAgICAgICAgLy8gaGV4c2VxID0gaGV4NCAqKCAiOiIgaGV4NCkKLSAgICAgICAgLy8gaGV4NCAgID0gMSo0SEVYRElHCi0gICAgICAgIGZvciAoOyBpbmRleCA8IGVuZDsgKytpbmRleCkgewotICAgICAgICAgICAgdGVzdENoYXIgPSBhZGRyZXNzLmNoYXJBdChpbmRleCk7Ci0gICAgICAgICAgICBpZiAodGVzdENoYXIgPT0gJzonKSB7Ci0gICAgICAgICAgICAgICAgLy8gSVB2NiBhZGRyZXNzZXMgYXJlIDEyOC1iaXQsIHNvIHRoZXJlIGNhbiBiZSBhdCBtb3N0IGVpZ2h0IHNlY3Rpb25zLgotICAgICAgICAgICAgICAgIGlmIChudW1EaWdpdHMgPiAwICYmICsrY291bnRlclswXSA+IDgpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBUaGlzIGNvdWxkIGJlICc6OicuCi0gICAgICAgICAgICAgICAgaWYgKG51bURpZ2l0cyA9PSAwIHx8ICgoaW5kZXggKyAxIDwgZW5kKSAmJiBhZGRyZXNzLmNoYXJBdChpbmRleCArIDEpID09ICc6JykpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGluZGV4OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBudW1EaWdpdHMgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gVGhpcyBtaWdodCBiZSBpbnZhbGlkIG9yIGFuIElQdjRhZGRyZXNzLiBJZiBpdCdzIHBvdGVudGlhbGx5IGFuIElQdjRhZGRyZXNzLAotICAgICAgICAgICAgLy8gYmFja3VwIHRvIGp1c3QgYWZ0ZXIgdGhlIGxhc3QgdmFsaWQgY2hhcmFjdGVyIHRoYXQgbWF0Y2hlcyBoZXhzZXEuCi0gICAgICAgICAgICBlbHNlIGlmICghaXNIZXgodGVzdENoYXIpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHRlc3RDaGFyID09ICcuJyAmJiBudW1EaWdpdHMgPCA0ICYmIG51bURpZ2l0cyA+IDAgJiYgY291bnRlclswXSA8PSA2KSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBiYWNrID0gaW5kZXggLSBudW1EaWdpdHMgLSAxOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGJhY2sgPj0gc3RhcnQpID8gYmFjayA6IChiYWNrICsgMSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIFRoZXJlIGNhbiBiZSBhdCBtb3N0IDQgaGV4IGRpZ2l0cyBwZXIgZ3JvdXAuCi0gICAgICAgICAgICBlbHNlIGlmICgrK251bURpZ2l0cyA+IDQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIChudW1EaWdpdHMgPiAwICYmICsrY291bnRlclswXSA8PSA4KSA/IGVuZCA6IC0xOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogRGV0ZXJtaW5lIHdoZXRoZXIgYSBjaGFyIGlzIGEgZGlnaXQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNoYXIgaXMgYmV0d2VlZW4gJzAnIGFuZCAnOScsIGZhbHNlIG90aGVyd2lzZQotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNEaWdpdChjaGFyIHBfY2hhcikgewotICAgICAgICByZXR1cm4gcF9jaGFyID49ICcwJyAmJiBwX2NoYXIgPD0gJzknOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERldGVybWluZSB3aGV0aGVyIGEgY2hhcmFjdGVyIGlzIGEgaGV4YWRlY2ltYWwgY2hhcmFjdGVyLgotICAgICAqCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjaGFyIGlzIGJldHdlZWVuICcwJyBhbmQgJzknLCAnYScgYW5kICdmJyBvciAnQScgYW5kICdGJywgZmFsc2Ugb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0hleChjaGFyIHBfY2hhcikgewotICAgICAgICByZXR1cm4gKHBfY2hhciA8PSAnZicgJiYgKGZnTG9va3VwVGFibGVbcF9jaGFyXSAmIEFTQ0lJX0hFWF9DSEFSQUNURVJTKSAhPSAwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZXRlcm1pbmUgd2hldGhlciBhIGNoYXIgaXMgYW4gYWxwaGFiZXRpYyBjaGFyYWN0ZXI6IGEteiBvciBBLVoKLSAgICAgKgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY2hhciBpcyBhbHBoYWJldGljLCBmYWxzZSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzQWxwaGEoY2hhciBwX2NoYXIpIHsKLSAgICAgICAgcmV0dXJuICgocF9jaGFyID49ICdhJyAmJiBwX2NoYXIgPD0gJ3onKSB8fCAocF9jaGFyID49ICdBJyAmJiBwX2NoYXIgPD0gJ1onKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGV0ZXJtaW5lIHdoZXRoZXIgYSBjaGFyIGlzIGFuIGFscGhhbnVtZXJpYzogMC05LCBhLXogb3IgQS1aCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNoYXIgaXMgYWxwaGFudW1lcmljLCBmYWxzZSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzQWxwaGFudW0oY2hhciBwX2NoYXIpIHsKLSAgICAgICAgcmV0dXJuIChwX2NoYXIgPD0gJ3onICYmIChmZ0xvb2t1cFRhYmxlW3BfY2hhcl0gJiBNQVNLX0FMUEhBX05VTUVSSUMpICE9IDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERldGVybWluZSB3aGV0aGVyIGEgY2hhciBpcyBhIFVSSSBjaGFyYWN0ZXIgKHJlc2VydmVkIG9yIHVucmVzZXJ2ZWQsIG5vdCBpbmNsdWRpbmcgJyUnIGZvcgotICAgICAqIGVzY2FwZWQgb2N0ZXRzKS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY2hhciBpcyBhIFVSSSBjaGFyYWN0ZXIsIGZhbHNlIG90aGVyd2lzZQotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNVUklDaGFyYWN0ZXIoY2hhciBwX2NoYXIpIHsKLSAgICAgICAgcmV0dXJuIChwX2NoYXIgPD0gJ34nICYmIChmZ0xvb2t1cFRhYmxlW3BfY2hhcl0gJiBNQVNLX1VSSV9DSEFSQUNURVIpICE9IDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERldGVybWluZSB3aGV0aGVyIGEgY2hhciBpcyBhIHNjaGVtZSBjaGFyYWN0ZXIuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNoYXIgaXMgYSBzY2hlbWUgY2hhcmFjdGVyLCBmYWxzZSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzU2NoZW1lQ2hhcmFjdGVyKGNoYXIgcF9jaGFyKSB7Ci0gICAgICAgIHJldHVybiAocF9jaGFyIDw9ICd6JyAmJiAoZmdMb29rdXBUYWJsZVtwX2NoYXJdICYgTUFTS19TQ0hFTUVfQ0hBUkFDVEVSKSAhPSAwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZXRlcm1pbmUgd2hldGhlciBhIGNoYXIgaXMgYSB1c2VyaW5mbyBjaGFyYWN0ZXIuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNoYXIgaXMgYSB1c2VyaW5mbyBjaGFyYWN0ZXIsIGZhbHNlIG90aGVyd2lzZQotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNVc2VyaW5mb0NoYXJhY3RlcihjaGFyIHBfY2hhcikgewotICAgICAgICByZXR1cm4gKHBfY2hhciA8PSAneicgJiYgKGZnTG9va3VwVGFibGVbcF9jaGFyXSAmIE1BU0tfVVNFUklORk9fQ0hBUkFDVEVSKSAhPSAwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZXRlcm1pbmUgd2hldGhlciBhIGNoYXIgaXMgYSBwYXRoIGNoYXJhY3Rlci4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY2hhciBpcyBhIHBhdGggY2hhcmFjdGVyLCBmYWxzZSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzUGF0aENoYXJhY3RlcihjaGFyIHBfY2hhcikgewotICAgICAgICByZXR1cm4gKHBfY2hhciA8PSAnficgJiYgKGZnTG9va3VwVGFibGVbcF9jaGFyXSAmIE1BU0tfUEFUSF9DSEFSQUNURVIpICE9IDApOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogRGV0ZXJtaW5lIHdoZXRoZXIgYSBnaXZlbiBzdHJpbmcgY29udGFpbnMgb25seSBVUkkgY2hhcmFjdGVycyAoYWxzbwotICAgICAqIGNhbGxlZCAidXJpYyIgaW4gUkZDIDIzOTYpLiB1cmljIGNvbnNpc3Qgb2YgYWxsIHJlc2VydmVkCi0gICAgICogY2hhcmFjdGVycywgdW5yZXNlcnZlZCBjaGFyYWN0ZXJzIGFuZCBlc2NhcGVkIGNoYXJhY3RlcnMuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHN0cmluZyBpcyBjb21wcmlzZWQgb2YgdXJpYywgZmFsc2Ugb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1VSSVN0cmluZyhTdHJpbmcgcF91cmljKSB7Ci0gICAgICAgIGlmIChwX3VyaWMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGludCBlbmQgPSBwX3VyaWMubGVuZ3RoKCk7Ci0gICAgICAgIGNoYXIgdGVzdENoYXIgPSAnXDAnOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVuZDsgaSsrKSB7Ci0gICAgICAgICAgICB0ZXN0Q2hhciA9IHBfdXJpYy5jaGFyQXQoaSk7Ci0gICAgICAgICAgICBpZiAodGVzdENoYXIgPT0gJyUnKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGkgKyAyID49IGVuZCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgIWlzSGV4KHBfdXJpYy5jaGFyQXQoaSArIDEpKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgIWlzSGV4KHBfdXJpYy5jaGFyQXQoaSArIDIpKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaSArPSAyOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgICBpZiAoIWlzVVJJQ2hhcmFjdGVyKHRlc3RDaGFyKSkgewotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotfQotCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvVW5pb24uamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9Vbmlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWI5OGY5Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9Vbmlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlczsKLQotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKLQotCi0vKiogdGhpcyBjbGFzcyBpcyB0aGUgc3VwZXIgY2xhc3Mgb2YgYWxsIHRoZSB1bmlvbiBzaW1wbGUgdHlwZXMgKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBVbmlvbiB7Ci0gICAgLy8gb2JqZWN0IHRvIHN0b3JlIHZhbHVlcwotICAgIHByb3RlY3RlZCBPYmplY3QgbG9jYWxPYmplY3Q7Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldE9iamVjdCgpIHsKLSAgICAgICAgcmV0dXJuIGxvY2FsT2JqZWN0OwotICAgIH0KLQotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldE9iamVjdChPYmplY3QgbG9jYWxPYmplY3QpOwotCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxPYmplY3QudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBtZXRob2QgdG8gcGFyc2UgeG1sc2NoZW1hIG9iamVjdHMKLSAgICAgKgotICAgICAqIEBwYXJhbSB4bWxTdHJlYW1SZWFkZXIKLSAgICAgKiBAcGFyYW0gbmFtZXNwYWNlVVJJCi0gICAgICogQHBhcmFtIHR5cGUKLSAgICAgKiBAdGhyb3dzIFVSSS5NYWxmb3JtZWRVUklFeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbgotICAgICAqLwotCi0gICAgcHVibGljIHZvaWQgc2V0T2JqZWN0KFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lc3BhY2VVUkksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0eXBlKSB0aHJvd3MgVVJJLk1hbGZvcm1lZFVSSUV4Y2VwdGlvbiwgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHZhbHVlID0geG1sU3RyZWFtUmVhZGVyLmdldEVsZW1lbnRUZXh0KCk7Ci0gICAgICAgIGlmICgic3RyaW5nIi5lcXVhbHModHlwZSkpIHsKLSAgICAgICAgICAgIHNldE9iamVjdCh2YWx1ZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoImludCIuZXF1YWxzKHR5cGUpIHx8ICJpbnRlZ2VyIi5lcXVhbHModHlwZSkpIHsKLSAgICAgICAgICAgIHNldE9iamVjdChuZXcgSW50ZWdlcih2YWx1ZSkpOwotICAgICAgICB9IGVsc2UgaWYgKCJib29sZWFuIi5lcXVhbHModHlwZSkpIHsKLSAgICAgICAgICAgIHNldE9iamVjdChuZXcgQm9vbGVhbih2YWx1ZSkpOwotICAgICAgICB9IGVsc2UgaWYgKCJhbnlVUkkiLmVxdWFscyh0eXBlKSkgewotICAgICAgICAgICAgc2V0T2JqZWN0KG5ldyBVUkkodmFsdWUpKTsKLSAgICAgICAgfSBlbHNlIGlmICgiZGF0ZSIuZXF1YWxzKHR5cGUpKSB7Ci0gICAgICAgICAgICBzZXRPYmplY3QoQ29udmVydGVyVXRpbC5jb252ZXJ0VG9EYXRlKHZhbHVlKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoIlFOYW1lIi5lcXVhbHModHlwZSkpIHsKLSAgICAgICAgICAgIGlmICh2YWx1ZS5pbmRleE9mKCI6IikgPiAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gaS5lIGl0IGhhcyBhIG5hbWUgc3BhY2UKLSAgICAgICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gdmFsdWUuc3Vic3RyaW5nKDAsIHZhbHVlLmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGxvY2FsUGFydCA9IHZhbHVlLnN1YnN0cmluZyh2YWx1ZS5pbmRleE9mKCI6IikgKyAxKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZXNwYWNlID0geG1sU3RyZWFtUmVhZGVyLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpOwotICAgICAgICAgICAgICAgIHNldE9iamVjdChuZXcgUU5hbWUobmFtZXNwYWNlLCBsb2NhbFBhcnQsIHByZWZpeCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzZXRPYmplY3QobmV3IFFOYW1lKHZhbHVlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoImRhdGVUaW1lIi5lcXVhbHModHlwZSkpIHsKLSAgICAgICAgICAgIHNldE9iamVjdChDb252ZXJ0ZXJVdGlsLmNvbnZlcnRUb0RhdGVUaW1lKHZhbHVlKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoInRpbWUiLmVxdWFscyh0eXBlKSkgewotICAgICAgICAgICAgc2V0T2JqZWN0KENvbnZlcnRlclV0aWwuY29udmVydFRvVGltZSh2YWx1ZSkpOwotICAgICAgICB9IGVsc2UgaWYgKCJmbG9hdCIuZXF1YWxzKHR5cGUpKSB7Ci0gICAgICAgICAgICBzZXRPYmplY3QobmV3IEZsb2F0KHZhbHVlKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoImxvbmciLmVxdWFscyh0eXBlKSkgewotICAgICAgICAgICAgc2V0T2JqZWN0KG5ldyBMb25nKHZhbHVlKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoImRvdWJsZSIuZXF1YWxzKHR5cGUpKSB7Ci0gICAgICAgICAgICBzZXRPYmplY3QobmV3IERvdWJsZSh2YWx1ZSkpOwotICAgICAgICB9IGVsc2UgaWYgKCJkZWNpbWFsIi5lcXVhbHModHlwZSkpIHsKLSAgICAgICAgICAgIHNldE9iamVjdChuZXcgQmlnRGVjaW1hbCh2YWx1ZSkpOwotICAgICAgICB9IGVsc2UgaWYgKCJ1bnNpZ25lZExvbmciLmVxdWFscyh0eXBlKSkgewotICAgICAgICAgICAgc2V0T2JqZWN0KG5ldyBVbnNpZ25lZExvbmcodmFsdWUpKTsKLSAgICAgICAgfSBlbHNlIGlmICgidW5zaWduZWRJbnQiLmVxdWFscyh0eXBlKSkgewotICAgICAgICAgICAgc2V0T2JqZWN0KG5ldyBVbnNpZ25lZEludCh2YWx1ZSkpOwotICAgICAgICB9IGVsc2UgaWYgKCJ1bnNpZ25lZFNob3J0Ii5lcXVhbHModHlwZSkpIHsKLSAgICAgICAgICAgIHNldE9iamVjdChuZXcgVW5zaWduZWRTaG9ydCh2YWx1ZSkpOwotICAgICAgICB9IGVsc2UgaWYgKCJ1bnNpZ25lZEJ5dGUiLmVxdWFscyh0eXBlKSkgewotICAgICAgICAgICAgc2V0T2JqZWN0KG5ldyBVbnNpZ25lZEJ5dGUodmFsdWUpKTsKLSAgICAgICAgfSBlbHNlIGlmICgicG9zaXRpdmVJbnRlZ2VyIi5lcXVhbHModHlwZSkpIHsKLSAgICAgICAgICAgIHNldE9iamVjdChuZXcgUG9zaXRpdmVJbnRlZ2VyKHZhbHVlKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoIm5lZ2F0aXZlSW50ZWdlciIuZXF1YWxzKHR5cGUpKSB7Ci0gICAgICAgICAgICBzZXRPYmplY3QobmV3IE5lZ2F0aXZlSW50ZWdlcih2YWx1ZSkpOwotICAgICAgICB9IGVsc2UgaWYgKCJub25OZWdhdGl2ZUludGVnZXIiLmVxdWFscyh0eXBlKSkgewotICAgICAgICAgICAgc2V0T2JqZWN0KG5ldyBOb25OZWdhdGl2ZUludGVnZXIodmFsdWUpKTsKLSAgICAgICAgfSBlbHNlIGlmICgibm9uUG9zaXRpdmVJbnRlZ2VyIi5lcXVhbHModHlwZSkpIHsKLSAgICAgICAgICAgIHNldE9iamVjdChuZXcgTm9uUG9zaXRpdmVJbnRlZ2VyKHZhbHVlKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiT2JqZWN0IG5vdCBmb3VuZCIpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvVW5zaWduZWRCeXRlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvVW5zaWduZWRCeXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkMTRhM2EuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL1Vuc2lnbmVkQnl0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzOwotCi0KLS8qKgotICogQ3VzdG9tIGNsYXNzIGZvciBzdXBwb3J0aW5nIHByaW1pdGl2ZSBYU0QgZGF0YSB0eXBlIFVuc2lnbmVkQnl0ZQotICoKLSAqIEBzZWUgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI3Vuc2lnbmVkQnl0ZSI+WE1MIFNjaGVtYSAzLjMuMjQ8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBVbnNpZ25lZEJ5dGUgZXh0ZW5kcyBVbnNpZ25lZFNob3J0IHsKLQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNDYzMTc1NDc4NzE0NTUyNjc1OUw7Ci0KLSAgICBwdWJsaWMgVW5zaWduZWRCeXRlKCkgewotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogY3RvciBmb3IgVW5zaWduZWRCeXRlCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiB3aWxsIGJlIHRocm93biBpZiB2YWxpZGF0aW9uIGZhaWxzCi0gICAgICovCi0gICAgcHVibGljIFVuc2lnbmVkQnl0ZShsb25nIHNWYWx1ZSkgdGhyb3dzIE51bWJlckZvcm1hdEV4Y2VwdGlvbiB7Ci0gICAgICAgIHNldFZhbHVlKHNWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFVuc2lnbmVkQnl0ZShTdHJpbmcgc1ZhbHVlKSB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIHsKLSAgICAgICAgc2V0VmFsdWUoTG9uZy5wYXJzZUxvbmcoc1ZhbHVlKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogdmFsaWRhdGVzIHRoZSBkYXRhIGFuZCBzZXRzIHRoZSB2YWx1ZSBmb3IgdGhlIG9iamVjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzVmFsdWUgdGhlIG51bWJlciB0byBzZXQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShsb25nIHNWYWx1ZSkgdGhyb3dzIE51bWJlckZvcm1hdEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghVW5zaWduZWRCeXRlLmlzVmFsaWQoc1ZhbHVlKSkKLSAgICAgICAgICAgIHRocm93IG5ldyBOdW1iZXJGb3JtYXRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIC8vIE1lc3NhZ2VzLmdldE1lc3NhZ2UoImJhZFVuc2lnbmVkQnl0ZTAwIikgKwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcudmFsdWVPZihzVmFsdWUpICsgIl0iKTsKLSAgICAgICAgbFZhbHVlID0gbmV3IExvbmcoc1ZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB2YWxpZGF0ZSB0aGUgdmFsdWUgYWdhaW5zdCB0aGUgeHNkIHZhbHVlIHNwYWNlIGRlZmluaXRpb24KLSAgICAgKgotICAgICAqIEBwYXJhbSBzVmFsdWUgbnVtYmVyIHRvIGNoZWNrIGFnYWluc3QgcmFuZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZChsb25nIHNWYWx1ZSkgewotICAgICAgICByZXR1cm4gISgoc1ZhbHVlIDwgMEwpIHx8IChzVmFsdWUgPiAyNTVMKSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvVW5zaWduZWRJbnQuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9VbnNpZ25lZEludC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWYxOTkxLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9VbnNpZ25lZEludC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlczsKLQotCi0vKioKLSAqIEN1c3RvbSBjbGFzcyBmb3Igc3VwcG9ydGluZyBwcmltaXRpdmUgWFNEIGRhdGEgdHlwZSBVbnNpZ25lZEludAotICoKLSAqIEBzZWUgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI3Vuc2lnbmVkSW50Ij5YTUwgU2NoZW1hIDMuMy4yMjwvYT4KLSAqLwotcHVibGljIGNsYXNzIFVuc2lnbmVkSW50IGV4dGVuZHMgamF2YS5sYW5nLk51bWJlciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtODkxNTIwNDE2ODE1NDc0NjMwNUw7Ci0KLSAgICBwcm90ZWN0ZWQgTG9uZyBsVmFsdWUgPSBuZXcgTG9uZygwKTsKLQotICAgIHB1YmxpYyBVbnNpZ25lZEludCgpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBjdG9yIGZvciBVbnNpZ25lZEludAotICAgICAqCi0gICAgICogQHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24gd2lsbCBiZSB0aHJvd24gaWYgdmFsaWRhdGlvbiBmYWlscwotICAgICAqLwotICAgIHB1YmxpYyBVbnNpZ25lZEludChsb25nIGlWYWx1ZSkgdGhyb3dzIE51bWJlckZvcm1hdEV4Y2VwdGlvbiB7Ci0gICAgICAgIHNldFZhbHVlKGlWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFVuc2lnbmVkSW50KFN0cmluZyBzdFZhbHVlKSB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIHsKLSAgICAgICAgc2V0VmFsdWUoTG9uZy5wYXJzZUxvbmcoc3RWYWx1ZSkpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogdmFsaWRhdGVzIHRoZSBkYXRhIGFuZCBzZXRzIHRoZSB2YWx1ZSBmb3IgdGhlIG9iamVjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpVmFsdWUgdmFsdWUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShsb25nIGlWYWx1ZSkgdGhyb3dzIE51bWJlckZvcm1hdEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghVW5zaWduZWRJbnQuaXNWYWxpZChpVmFsdWUpKQotICAgICAgICAgICAgdGhyb3cgbmV3IE51bWJlckZvcm1hdEV4Y2VwdGlvbigKLS8vICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRNZXNzYWdlKCJiYWRVbnNpZ25lZEludDAwIikgKwotU3RyaW5nLnZhbHVlT2YoaVZhbHVlKSArICJdIik7Ci0gICAgICAgIGxWYWx1ZSA9IG5ldyBMb25nKGlWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgaWYgKGxWYWx1ZSAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGxWYWx1ZS50b1N0cmluZygpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICBpZiAobFZhbHVlICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbFZhbHVlLmhhc2hDb2RlKCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIC8qKiB2YWxpZGF0ZSB0aGUgdmFsdWUgYWdhaW5zdCB0aGUgeHNkIGRlZmluaXRpb24gKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZChsb25nIGlWYWx1ZSkgewotICAgICAgICByZXR1cm4gISgoaVZhbHVlIDwgMEwpIHx8IChpVmFsdWUgPiA0Mjk0OTY3Mjk1TCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgT2JqZWN0IF9fZXF1YWxzQ2FsYyA9IG51bGw7Ci0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLSAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgVW5zaWduZWRJbnQpKSByZXR1cm4gZmFsc2U7Ci0gICAgICAgIFVuc2lnbmVkSW50IG90aGVyID0gKFVuc2lnbmVkSW50KW9iajsKLSAgICAgICAgaWYgKHRoaXMgPT0gb2JqKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKF9fZXF1YWxzQ2FsYyAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gKF9fZXF1YWxzQ2FsYyA9PSBvYmopOwotICAgICAgICB9Ci0gICAgICAgIF9fZXF1YWxzQ2FsYyA9IG9iajsKLSAgICAgICAgYm9vbGVhbiBfZXF1YWxzOwotICAgICAgICBfZXF1YWxzID0gKChsVmFsdWUgPT0gbnVsbCAmJiBvdGhlci5sVmFsdWUgPT0gbnVsbCkgfHwKLSAgICAgICAgICAgICAgICAobFZhbHVlICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIGxWYWx1ZS5lcXVhbHMob3RoZXIubFZhbHVlKSkpOwotICAgICAgICBfX2VxdWFsc0NhbGMgPSBudWxsOwotICAgICAgICByZXR1cm4gX2VxdWFsczsKLSAgICB9Ci0KLSAgICAvLyBJbXBsZW1lbnQgamF2YS5sYW5nLk51bWJlciBpbnRlcmZhY2UKLSAgICBwdWJsaWMgYnl0ZSBieXRlVmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiBsVmFsdWUuYnl0ZVZhbHVlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHNob3J0IHNob3J0VmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiBsVmFsdWUuc2hvcnRWYWx1ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgaW50VmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiBsVmFsdWUuaW50VmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgbG9uZyBsb25nVmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiBsVmFsdWUubG9uZ1ZhbHVlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGRvdWJsZSBkb3VibGVWYWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIGxWYWx1ZS5kb3VibGVWYWx1ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBmbG9hdCBmbG9hdFZhbHVlKCkgewotICAgICAgICByZXR1cm4gbFZhbHVlLmZsb2F0VmFsdWUoKTsKLSAgICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL1Vuc2lnbmVkTG9uZy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL1Vuc2lnbmVkTG9uZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDZjNTU2Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9VbnNpZ25lZExvbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXM7Ci0KLS8vIENvbnNpZGVyIHJlbW92aW5nIHRoaXMuCi0vLyBBbGwgb3BlcmF0aW9ucyBiZWhhdmUgYXMgaWYgQmlnSW50ZWdlcnMgd2VyZSByZXByZXNlbnRlZCBpbiB0d28ncy1jb21wbGVtZW50IG5vdGF0aW9uLgotLy8gSW4gaXRzIHBsYWNlLCBjb25zaWRlciB1c2luZyBwcmltaXRpdmUgdHlwZSBsb25nICh3aGljaCBpcyBhbHJlYWR5IHRoZSByaWdodCBzaXplKSB0byBob2xkIHRoZSBkYXRhLgotLy8gVGhpcyBjbGFzcyBjYW4gaGlkZSB0aGUgZmFjdCB0aGF0IHRoZSBkYXRhIGlzIHN0b3JlZCBpbiBhIHNpZ25lZCBlbnRpdHksIGJ5IGNhcmVmdWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIGNsYXNzJyBtZXRob2RzLgotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLS8qKgotICogQ3VzdG9tIGNsYXNzIGZvciBzdXBwb3J0aW5nIHByaW1pdGl2ZSBYU0QgZGF0YSB0eXBlIFVuc2lnbmVkTG9uZwotICoKLSAqIEBzZWUgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI3Vuc2lnbmVkTG9uZyI+WE1MIFNjaGVtYSAzLjMuMjE8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBVbnNpZ25lZExvbmcgZXh0ZW5kcyBqYXZhLmxhbmcuTnVtYmVyIGltcGxlbWVudHMgQ29tcGFyYWJsZSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNTkxOTk0MjU4NDI4NDg5NzU4M0w7Ci0KLSAgICBwcm90ZWN0ZWQgQmlnSW50ZWdlciBsVmFsdWUgPSBCaWdJbnRlZ2VyLlpFUk87Ci0gICAgcHJpdmF0ZSBzdGF0aWMgQmlnSW50ZWdlciBNQVggPSBuZXcgQmlnSW50ZWdlcigiMTg0NDY3NDQwNzM3MDk1NTE2MTUiKTsgLy8gbWF4IHVuc2lnbmVkIGxvbmcKLQotICAgIHB1YmxpYyBVbnNpZ25lZExvbmcoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIFVuc2lnbmVkTG9uZyhkb3VibGUgdmFsdWUpIHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24gewotICAgICAgICBzZXRWYWx1ZShuZXcgQmlnSW50ZWdlcihEb3VibGUudG9TdHJpbmcodmFsdWUpKSk7Ci0gICAgfQotCi0gICAgcHVibGljIFVuc2lnbmVkTG9uZyhCaWdJbnRlZ2VyIHZhbHVlKSB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIHsKLSAgICAgICAgc2V0VmFsdWUodmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBVbnNpZ25lZExvbmcobG9uZyBsVmFsdWUpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotICAgICAgICAvLyBuZXcgVW5zaWduZWRMb25nKCAweGZmZmZmZmZmZmZmZmZmZmZMICkKLSAgICAgICAgLy8gc2hvdWxkIG5vdCB0aHJvdyBhbnkgRXhjZXB0aW9uIGJlY2F1c2UsIGFzIGFuIFVuc2lnbmVkTG9uZywgaXQgaXMgaW4gcmFuZ2UgYW5kIG5vbm5lZ2F0aXZlLgotICAgICAgICBzZXRWYWx1ZShCaWdJbnRlZ2VyLnZhbHVlT2YobFZhbHVlKSk7Ci0gICAgfQotCi0gICAgcHVibGljIFVuc2lnbmVkTG9uZyhTdHJpbmcgc3RWYWx1ZSkgdGhyb3dzIE51bWJlckZvcm1hdEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgLy8gSWYgc3RWYWx1ZSBzdGFydHMgd2l0aCBhIG1pbnVzIHNpZ24sIHRoYXQgd2lsbCBiZSBhY2NlcHRhYmxlIHRvIHRoZSBCaWdJbnRlZ2VyIGNvbnN0cnVjdG9yLAotICAgICAgICAvLyBidXQgaXQgaXMgbm90IGFjY2VwdGFibGUgdG8gdXMuCi0gICAgICAgIC8vIE9uY2UgZW5jb2RlZCBpbnRvIGJpbmFyeSwgaXQgaXMgdG9vIGxhdGUgdG8gZGV0ZWN0IHRoYXQgdGhlIGNsaWVudCBpbnRlbmRlZCBhIG5lZ2F0aXZlIGludGVnZXIuCi0gICAgICAgIC8vIFRoYXQgZGV0ZWN0aW9uIG11c3QgYmUgcGVyZm9ybWVkIGhlcmUuCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoc3RWYWx1ZS5jaGFyQXQoMCkgPT0gJ1x1MDAyZCcpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTnVtYmVyRm9ybWF0RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgIkEgU3RyaW5nIHRoYXQgc3RhcnRzIHdpdGggYSBtaW51cyBzaWduIGlzIG5vdCBhIHZhbGlkIHJlcHJlc2VudGF0aW9uIG9mIGFuIFVuc2lnbmVkTG9uZy4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldFZhbHVlKG5ldyBCaWdJbnRlZ2VyKHN0VmFsdWUpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbnVtYmVyRm9ybWF0RXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB0aHJvdyBudW1iZXJGb3JtYXRFeGNlcHRpb247Ci0gICAgICAgIH0KLQotICAgICAgICBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAvLyBUaGlzIGNvdWxkIGhhcHBlbiBpZiBzdFZhbHVlIGlzIGVtcHR5IHdoZW4gd2UgYXR0ZW1wdCB0byBkZXRlY3QgYSBtaW51cyBzaWduLgotICAgICAgICAgICAgLy8gRnJvbSB0aGUgY2xpZW50J3MgcG9pbnQgb2YgdmlldywgdGhlIGVtcHR5IFN0cmluZyBzaG91bGQgY2F1c2UgYSBOdW1iZXJGb3JtYXRFeGNlcHRpb24uCi0gICAgICAgICAgICB0aHJvdyBuZXcgTnVtYmVyRm9ybWF0RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiQW4gZW1wdHkgc3RyaW5nIGlzIG5vdCBhIHZhbGlkIHJlcHJlc2VudGF0aW9uIG9mIGFuIFVuc2lnbmVkTG9uZy4iKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNldFZhbHVlKEJpZ0ludGVnZXIgdmFsKSB7Ci0gICAgICAgIGlmICghVW5zaWduZWRMb25nLmlzVmFsaWQodmFsKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLS8vICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRNZXNzYWdlKCJiYWRVbnNpZ25lZExvbmcwMCIpICsKLVN0cmluZy52YWx1ZU9mKHZhbCkgKyAiXSIpOwotICAgICAgICB9Ci0gICAgICAgIHRoaXMubFZhbHVlID0gdmFsOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkKEJpZ0ludGVnZXIgdmFsdWUpIHsKLQotICAgICAgICAvLyBDb252ZXJ0cyB0aGlzIEJpZ0ludGVnZXIgdG8gYSBsb25nLgotICAgICAgICAvLyBUaGlzIGNvbnZlcnNpb24gaXMgYW5hbG9nb3VzIHRvIGEgbmFycm93aW5nIHByaW1pdGl2ZSBjb252ZXJzaW9uIGZyb20gbG9uZyB0byBpbnQgYXMgZGVmaW5lZCBpbiB0aGUgSmF2YSBMYW5ndWFnZSBTcGVjaWZpY2F0aW9uOgotICAgICAgICAvLyBpZiB0aGlzIEJpZ0ludGVnZXIgaXMgdG9vIGJpZyB0byBmaXQgaW4gYSBsb25nLCBvbmx5IHRoZSBsb3ctb3JkZXIgNjQgYml0cyBhcmUgcmV0dXJuZWQuCi0gICAgICAgIC8vIE5vdGUgdGhhdCB0aGlzIGNvbnZlcnNpb24gY2FuIGxvc2UgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG92ZXJhbGwgbWFnbml0dWRlIG9mIHRoZSBCaWdJbnRlZ2VyIHZhbHVlIGFzIHdlbGwgYXMgcmV0dXJuIGEgcmVzdWx0IHdpdGggdGhlIG9wcG9zaXRlIHNpZ24uCi0gICAgICAgIGxvbmcgdW5zaWduZWRMb25nVmFsdWUgPSB2YWx1ZS5sb25nVmFsdWUoKTsKLQotICAgICAgICByZXR1cm4gIShjb21wYXJlKHVuc2lnbmVkTG9uZ1ZhbHVlLCBCaWdJbnRlZ2VyLlpFUk8ubG9uZ1ZhbHVlKCkpIDwgMCB8fCAvLyBsZXNzIHRoYW4gemVybwotICAgICAgICAgICAgICAgIGNvbXBhcmUodW5zaWduZWRMb25nVmFsdWUsIE1BWC5sb25nVmFsdWUoKSkgPiAwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gbFZhbHVlLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICAgICAgaWYgKGxWYWx1ZSAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGxWYWx1ZS5oYXNoQ29kZSgpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE9iamVjdCBfX2VxdWFsc0NhbGMgPSBudWxsOwotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0gICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIFVuc2lnbmVkTG9uZykpIHJldHVybiBmYWxzZTsKLSAgICAgICAgVW5zaWduZWRMb25nIG90aGVyID0gKFVuc2lnbmVkTG9uZylvYmo7Ci0gICAgICAgIGlmICh0aGlzID09IG9iaikgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChfX2VxdWFsc0NhbGMgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIChfX2VxdWFsc0NhbGMgPT0gb2JqKTsKLSAgICAgICAgfQotICAgICAgICBfX2VxdWFsc0NhbGMgPSBvYmo7Ci0gICAgICAgIGJvb2xlYW4gX2VxdWFsczsKLSAgICAgICAgX2VxdWFscyA9ICgobFZhbHVlID09IG51bGwgJiYgb3RoZXIubFZhbHVlID09IG51bGwpIHx8Ci0gICAgICAgICAgICAgICAgKGxWYWx1ZSAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBsVmFsdWUuZXF1YWxzKG90aGVyLmxWYWx1ZSkpKTsKLSAgICAgICAgX19lcXVhbHNDYWxjID0gbnVsbDsKLSAgICAgICAgcmV0dXJuIF9lcXVhbHM7Ci0gICAgfQotCi0gICAgLy8gSW1wbGVtZW50IGphdmEubGFuZy5OdW1iZXIgaW50ZXJmYWNlCi0gICAgcHVibGljIGJ5dGUgYnl0ZVZhbHVlKCkgewotICAgICAgICByZXR1cm4gbFZhbHVlLmJ5dGVWYWx1ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBzaG9ydCBzaG9ydFZhbHVlKCkgewotICAgICAgICByZXR1cm4gbFZhbHVlLnNob3J0VmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGludFZhbHVlKCkgewotICAgICAgICByZXR1cm4gbFZhbHVlLmludFZhbHVlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGxvbmcgbG9uZ1ZhbHVlKCkgewotICAgICAgICByZXR1cm4gbFZhbHVlLmxvbmdWYWx1ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBkb3VibGUgZG91YmxlVmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiBsVmFsdWUuZG91YmxlVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmxvYXQgZmxvYXRWYWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIGxWYWx1ZS5mbG9hdFZhbHVlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgMCBpZiB0aGUgYXJndW1lbnQgaXMgYW4gVW5zaWduZWRMb25nIG51bWVyaWNhbGx5IGVxdWFsIHRvIHRoaXMKLSAgICAgKiAgICAgICAgIFVuc2lnbmVkTG9uZzsgYSB2YWx1ZSBsZXNzIHRoYW4gMCBpZiB0aGUgYXJndW1lbnQgaXMgYW4gVW5zaWduZWRMb25nIG51bWVyaWNhbGx5Ci0gICAgICogICAgICAgICBncmVhdGVyIHRoYW4gdGhpcyBVbnNpZ25lZExvbmc7IGFuZCBhIHZhbHVlIGdyZWF0ZXIgdGhhbiAwIGlmIHRoZSBhcmd1bWVudCBpcyBhbgotICAgICAqICAgICAgICAgVW5zaWduZWRMb25nIG51bWVyaWNhbGx5IGxlc3MgdGhhbiB0aGlzIFVuc2lnbmVkTG9uZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGNvbXBhcmVUbyhPYmplY3QgbykgewotICAgICAgICBpbnQgcmV0VmFsID0KLSAgICAgICAgICAgICAgICAwOyAvLyBhcmJpdHJhcnkgZGVmYXVsdCB2YWx1ZSBpbiBjYXNlIG9mIGV4Y2VwdGlvbjsgcmVxdWlyZWQgcmV0dXJuIHZhbHVlIGluIGNhc2UgdGhpcyBvYmplY3QgaXMgZXF1YWwgdG8gdGhlIHNwZWNpZmllZCBvYmplY3QKLQotICAgICAgICBpZiAobyA9PSBudWxsIHx8ICEobyBpbnN0YW5jZW9mIFVuc2lnbmVkTG9uZykpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbGFzc0Nhc3RFeGNlcHRpb24oIlRoZSBhcmd1bWVudCBpcyBub3QgYW4gVW5zaWduZWRMb25nLiIpOwotICAgICAgICB9Ci0gICAgICAgIC8vIE9ubHkgbmVlZCB0byBjaGFuZ2UgcmV0VmFsIGlmIHRoaXMgb2JqZWN0IGlzIG5vdCBlcXVhbCB0byB0aGUgc3BlY2lmaWVkIG9iamVjdC4KLSAgICAgICAgcmV0VmFsID0gY29tcGFyZShsb25nVmFsdWUoKSwgKChVbnNpZ25lZExvbmcpbykubG9uZ1ZhbHVlKCkpOwotCi0gICAgICAgIHJldHVybiByZXRWYWw7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSAwIGlmIHRoYXRMb25nIGlzIGEgbG9uZyBudW1lcmljYWxseSBlcXVhbCB0byB0aGlzTG9uZzsgYSB2YWx1ZSBsZXNzIHRoYW4gMAotICAgICAqICAgICAgICAgaWYgdGhhdExvbmcgaXMgYSBsb25nIG51bWVyaWNhbGx5IGdyZWF0ZXIgdGhhbiB0aGlzTG9uZzsgYW5kIGEgdmFsdWUgZ3JlYXRlciB0aGFuIDAKLSAgICAgKiAgICAgICAgIGlmIHRoYXRMb25nIGlzIGEgbG9uZyBudW1lcmljYWxseSBsZXNzIHRoYW4gdGhpc0xvbmcgKHVuc2lnbmVkIGNvbXBhcmlzb24pLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGludCBjb21wYXJlKGxvbmcgdGhpc0xvbmcsIGxvbmcgdGhhdExvbmcpIHsKLSAgICAgICAgLy8gVG8gYXZvaWQgaW5maW5pdGUgcmVjdXJzaW9uLCBkbyBub3QgaW5zdGFudGlhdGUgVW5zaWduZWRMb25nIGluIHRoaXMgbWV0aG9kLCB3aGljaCBtYXkgYmUgY2FsbGVkIGR1cmluZyBVbnNpZ25lZExvbmcgaW5zdGFudGlhdGlvbi4KLQotICAgICAgICBpZiAodGhpc0xvbmcgPT0gdGhhdExvbmcpIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYm9vbGVhbiBpc0xlc3NUaGFuOyAvLyBUaGlzIGlzIGxlc3MgdGhhbiB0aGF0LgotCi0gICAgICAgICAgICAvLyBQcmVwYXJlIHRoZSBtb3N0IHNpZ25pZmljYW50IGhhbGYgb2YgdGhlIGRhdGEgZm9yIGNvbXBhcmlzb24uCi0gICAgICAgICAgICAvLyBUaGUgc2hpZnQgZGlzdGFuY2UgY2FuIGJlIGFueSBudW1iZXIgZnJvbSAxIHRvIDMyIGluY2x1c2l2ZSAoMSBpcyBwcm9iYWJseSBmYXN0ZXN0KS4KLSAgICAgICAgICAgIC8vIEEgc2hpZnQgZGlzdGFuY2Ugb2Ygb25lIGlzIHN1ZmZpY2llbnQgdG8gbW92ZSB0aGUgc2lnbmlmaWNhbnQgZGF0YSBvZmYgb2YgdGhlIHNpZ24gYml0LCBhbGxvd2luZyBmb3IgYSBzaWduZWQgY29tcGFyaXNvbiBvZiBwb3NpdGl2ZSBudW1iZXJzIChpLmUuIGFuIHVuc2lnbmVkIGNvbXBhcmlzb24pLgotICAgICAgICAgICAgbG9uZyB0aGlzSGFsZkxvbmcgPSAodGhpc0xvbmcgJiAweGZmZmZmZmZmMDAwMDAwMDBMKSA+Pj4gMTsKLSAgICAgICAgICAgIGxvbmcgdGhhdEhhbGZMb25nID0gKHRoYXRMb25nICYgMHhmZmZmZmZmZjAwMDAwMDAwTCkgPj4+IDE7Ci0KLSAgICAgICAgICAgIGlmICh0aGlzSGFsZkxvbmcgPT0gdGhhdEhhbGZMb25nKSB7Ci0gICAgICAgICAgICAgICAgLy8gV2UgbXVzdCBhbHNvIGxvb2sgYXQgdGhlIGxlYXN0IHNpZ25pZmljYW50IGhhbGYgb2YgdGhlIGRhdGEuCi0KLSAgICAgICAgICAgICAgICAvLyBQcmVwYXJlIHRoZSBsZWFzdCBzaWduaWZpY2FudCBoYWxmIG9mIHRoZSBkYXRhIGZvciBjb21wYXJpc29uLgotICAgICAgICAgICAgICAgIHRoaXNIYWxmTG9uZyA9ICh0aGlzTG9uZyAmIDB4MDAwMDAwMDBmZmZmZmZmZkwpOwotICAgICAgICAgICAgICAgIHRoYXRIYWxmTG9uZyA9ICh0aGF0TG9uZyAmIDB4MDAwMDAwMDBmZmZmZmZmZkwpOwotCi0gICAgICAgICAgICAgICAgLy8gV2UgYWxyZWFkeSBrbm93IHRoYXQgdGhlIGRhdGEgaXMgbm90IGVxdWFsLgotICAgICAgICAgICAgICAgIGlzTGVzc1RoYW4gPSB0aGlzSGFsZkxvbmcgPCB0aGF0SGFsZkxvbmc7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIFRoZSBhbnN3ZXIgaXMgaW4gdGhlIG1vc3Qgc2lnbmlmaWNhbnQgaGFsZiBvZiB0aGUgZGF0YS4KLSAgICAgICAgICAgICAgICBpc0xlc3NUaGFuID0gdGhpc0hhbGZMb25nIDwgdGhhdEhhbGZMb25nOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoaXNMZXNzVGhhbikgewotICAgICAgICAgICAgICAgIHJldHVybiAtMTsgLy8gUmV0dXJucyBhIG5lZ2F0aXZlIGludGVnZXIgYXMgdGhpcyBvYmplY3QgaXMgbGVzcyB0aGFuIHRoYW4gdGhlIHNwZWNpZmllZCBvYmplY3QuCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiAxOyAvLyBSZXR1cm5zIGEgcG9zaXRpdmUgaW50ZWdlciBhcyB0aGlzIG9iamVjdCBpcyBncmVhdGVyIHRoYW4gdGhhbiB0aGUgc3BlY2lmaWVkIG9iamVjdC4KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL1Vuc2lnbmVkU2hvcnQuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9VbnNpZ25lZFNob3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmOGIwZGQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL1Vuc2lnbmVkU2hvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlczsKLQotCi0vKioKLSAqIEN1c3RvbSBjbGFzcyBmb3Igc3VwcG9ydGluZyBwcmltaXRpdmUgWFNEIGRhdGEgdHlwZSBVbnNpZ25lZFNob3J0Ci0gKgotICogQHNlZSA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jdW5zaWduZWRTaG9ydCI+WE1MIFNjaGVtYSAzLjMuMjM8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBVbnNpZ25lZFNob3J0IGV4dGVuZHMgVW5zaWduZWRJbnQgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNjgyMjU5ODQ0NzY5MjgxNjM4MEw7Ci0KLSAgICBwdWJsaWMgVW5zaWduZWRTaG9ydCgpIHsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIGN0b3IgZm9yIFVuc2lnbmVkU2hvcnQKLSAgICAgKgotICAgICAqIEB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duIGlmIHZhbGlkYXRpb24gZmFpbHMKLSAgICAgKi8KLSAgICBwdWJsaWMgVW5zaWduZWRTaG9ydChsb25nIHNWYWx1ZSkgdGhyb3dzIE51bWJlckZvcm1hdEV4Y2VwdGlvbiB7Ci0gICAgICAgIHNldFZhbHVlKHNWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFVuc2lnbmVkU2hvcnQoU3RyaW5nIHNWYWx1ZSkgdGhyb3dzIE51bWJlckZvcm1hdEV4Y2VwdGlvbiB7Ci0gICAgICAgIHNldFZhbHVlKExvbmcucGFyc2VMb25nKHNWYWx1ZSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHZhbGlkYXRlcyB0aGUgZGF0YSBhbmQgc2V0cyB0aGUgdmFsdWUgZm9yIHRoZSBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc1ZhbHVlIHZhbHVlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWUobG9uZyBzVmFsdWUpIHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24gewotICAgICAgICBpZiAoIVVuc2lnbmVkU2hvcnQuaXNWYWxpZChzVmFsdWUpKQotICAgICAgICAgICAgdGhyb3cgbmV3IE51bWJlckZvcm1hdEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgLy8gTWVzc2FnZXMuZ2V0TWVzc2FnZSgiYmFkVW5zaWduZWRTaG9ydDAwIikgKwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcudmFsdWVPZihzVmFsdWUpICsgIl0iKTsKLSAgICAgICAgbFZhbHVlID0gbmV3IExvbmcoc1ZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKiogdmFsaWRhdGUgdGhlIHZhbHVlIGFnYWluc3QgdGhlIHhzZCBkZWZpbml0aW9uICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWQobG9uZyBzVmFsdWUpIHsKLSAgICAgICAgcmV0dXJuICEoKHNWYWx1ZSA8IDBMKSB8fCAoc1ZhbHVlID4gNjU1MzVMKSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvWWVhci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL1llYXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM2YmE3Yi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvWWVhci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlczsKLQotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS50ZXh0Lk51bWJlckZvcm1hdDsKLQotLyoqCi0gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgWE1MIFNjaGVtYSB0eXBlIGdZZWFyCi0gKgotICogQHNlZSA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZ1llYXIiPlhNTCBTY2hlbWEgMy4yLjExPC9hPgotICovCi1wdWJsaWMgY2xhc3MgWWVhciBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA3NDk4ODc2MTIwMzM0ODU3MDE5TDsKLQotICAgIGludCB5ZWFyOwotICAgIFN0cmluZyB0aW1lem9uZSA9IG51bGw7Ci0KLSAgICAvKiogQ29uc3RydWN0cyBhIFllYXIgd2l0aCB0aGUgZ2l2ZW4gdmFsdWVzIE5vIHRpbWV6b25lIGlzIHNwZWNpZmllZCAqLwotICAgIHB1YmxpYyBZZWFyKGludCB5ZWFyKSB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIHsKLSAgICAgICAgc2V0VmFsdWUoeWVhcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIFllYXIgd2l0aCB0aGUgZ2l2ZW4gdmFsdWVzLCBpbmNsdWRpbmcgYSB0aW1lem9uZSBzdHJpbmcgVGhlIHRpbWV6b25lIGlzCi0gICAgICogdmFsaWRhdGVkIGJ1dCBub3QgdXNlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgWWVhcihpbnQgeWVhciwgU3RyaW5nIHRpbWV6b25lKSB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIHsKLSAgICAgICAgc2V0VmFsdWUoeWVhciwgdGltZXpvbmUpOwotICAgIH0KLQotICAgIC8qKiBDb25zdHJ1Y3QgYSBZZWFyIGZyb20gYSBTdHJpbmcgaW4gdGhlIGZvcm1hdCBbLV1DQ1lZW3RpbWV6b25lXSAqLwotICAgIHB1YmxpYyBZZWFyKFN0cmluZyBzb3VyY2UpIHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24gewotICAgICAgICBpbnQgbmVnYXRpdmUgPSAwOwotCi0gICAgICAgIGlmIChzb3VyY2UuY2hhckF0KDApID09ICctJykgewotICAgICAgICAgICAgbmVnYXRpdmUgPSAxOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzb3VyY2UubGVuZ3RoKCkgPCAoNCArIG5lZ2F0aXZlKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE51bWJlckZvcm1hdEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgLy9NZXNzYWdlcy5nZXRNZXNzYWdlKCJiYWRZZWFyMDAiKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjYWxjdWxhdGUgaG93IG1hbnkgbW9yZSB0aGFuIDQgZGlnaXRzIChpZiBhbnkpIGluIHRoZSB5ZWFyCi0gICAgICAgIGludCBwb3MgPSA0ICsgbmVnYXRpdmU7ICAvLyBza2lwIG1pbnVzIHNpZ24gaWYgcHJlc2VudAotICAgICAgICB3aGlsZSAocG9zIDwgc291cmNlLmxlbmd0aCgpICYmIENoYXJhY3Rlci5pc0RpZ2l0KHNvdXJjZS5jaGFyQXQocG9zKSkpIHsKLSAgICAgICAgICAgICsrcG9zOwotICAgICAgICB9Ci0KLSAgICAgICAgc2V0VmFsdWUoSW50ZWdlci5wYXJzZUludChzb3VyY2Uuc3Vic3RyaW5nKDAsIHBvcykpLAotICAgICAgICAgICAgICAgICBzb3VyY2Uuc3Vic3RyaW5nKHBvcykpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0WWVhcigpIHsKLSAgICAgICAgcmV0dXJuIHllYXI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0WWVhcihpbnQgeWVhcikgewotICAgICAgICAvLyB2YWxpZGF0ZSB5ZWFyLCBtb3JlIHRoYW4gNCBkaWdpdHMgYXJlIGFsbG93ZWQhCi0gICAgICAgIGlmICh5ZWFyID09IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBOdW1iZXJGb3JtYXRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIC8vTWVzc2FnZXMuZ2V0TWVzc2FnZSgiYmFkWWVhcjAwIikpOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy55ZWFyID0geWVhcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRpbWV6b25lKCkgewotICAgICAgICByZXR1cm4gdGltZXpvbmU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VGltZXpvbmUoU3RyaW5nIHRpbWV6b25lKSB7Ci0gICAgICAgIC8vIHZhbGlkYXRlIHRpbWV6b25lCi0gICAgICAgIGlmICh0aW1lem9uZSAhPSBudWxsICYmIHRpbWV6b25lLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgLy8gRm9ybWF0IFsrLy1dSEg6TU0KLSAgICAgICAgICAgIGlmICh0aW1lem9uZS5jaGFyQXQoMCkgPT0gJysnIHx8ICh0aW1lem9uZS5jaGFyQXQoMCkgPT0gJy0nKSkgewotICAgICAgICAgICAgICAgIGlmICh0aW1lem9uZS5sZW5ndGgoKSAhPSA2IHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAhQ2hhcmFjdGVyLmlzRGlnaXQodGltZXpvbmUuY2hhckF0KDEpKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgIUNoYXJhY3Rlci5pc0RpZ2l0KHRpbWV6b25lLmNoYXJBdCgyKSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRpbWV6b25lLmNoYXJBdCgzKSAhPSAnOicgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICFDaGFyYWN0ZXIuaXNEaWdpdCh0aW1lem9uZS5jaGFyQXQoNCkpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAhQ2hhcmFjdGVyLmlzRGlnaXQodGltZXpvbmUuY2hhckF0KDUpKSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE51bWJlckZvcm1hdEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgICAgIC8vTWVzc2FnZXMuZ2V0TWVzc2FnZSgiYmFkVGltZXpvbmUwMCIpKTsKLQotICAgICAgICAgICAgfSBlbHNlIGlmICghdGltZXpvbmUuZXF1YWxzKCJaIikpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTnVtYmVyRm9ybWF0RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgLy8gTWVzc2FnZXMuZ2V0TWVzc2FnZSgiYmFkVGltZXpvbmUwMCIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIGlmIHdlIGdvdCB0aGlzIGZhciwgaXRzIGdvb2QKLSAgICAgICAgICAgIHRoaXMudGltZXpvbmUgPSB0aW1lem9uZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKGludCB5ZWFyLCBTdHJpbmcgdGltZXpvbmUpCi0gICAgICAgICAgICB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIHsKLSAgICAgICAgc2V0WWVhcih5ZWFyKTsKLSAgICAgICAgc2V0VGltZXpvbmUodGltZXpvbmUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKGludCB5ZWFyKSB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIHsKLSAgICAgICAgc2V0WWVhcih5ZWFyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAvLyB1c2UgTnVtYmVyRm9ybWF0IHRvIGVuc3VyZSBsZWFkaW5nIHplcm9zCi0gICAgICAgIE51bWJlckZvcm1hdCBuZiA9IE51bWJlckZvcm1hdC5nZXRJbnN0YW5jZSgpOwotICAgICAgICBuZi5zZXRHcm91cGluZ1VzZWQoZmFsc2UpOwotCi0gICAgICAgIC8vIHllYXIKLSAgICAgICAgbmYuc2V0TWluaW11bUludGVnZXJEaWdpdHMoNCk7Ci0gICAgICAgIFN0cmluZyBzID0gbmYuZm9ybWF0KHllYXIpOwotCi0gICAgICAgIC8vIHRpbWV6b25lCi0gICAgICAgIGlmICh0aW1lem9uZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzID0gcyArIHRpbWV6b25lOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0gICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIFllYXIpKSByZXR1cm4gZmFsc2U7Ci0gICAgICAgIFllYXIgb3RoZXIgPSAoWWVhcilvYmo7Ci0gICAgICAgIGlmICh0aGlzID09IG9iaikgcmV0dXJuIHRydWU7Ci0KLSAgICAgICAgYm9vbGVhbiBlcXVhbHMgPSAodGhpcy55ZWFyID09IG90aGVyLnllYXIpOwotICAgICAgICBpZiAodGltZXpvbmUgIT0gbnVsbCkgewotICAgICAgICAgICAgZXF1YWxzID0gZXF1YWxzICYmIHRpbWV6b25lLmVxdWFscyhvdGhlci50aW1lem9uZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVxdWFsczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIHZhbHVlIG9mIHllYXIgWE9SZWQgd2l0aCB0aGUgaGFzaENvZGUgb2YgdGltZXpvbmUgaWZmIG9uZSBpcyBkZWZpbmVkLgotICAgICAqCi0gICAgICogQHJldHVybiBhbiA8Y29kZT5pbnQ8L2NvZGU+IHZhbHVlCi0gICAgICovCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICAgICAgcmV0dXJuIG51bGwgPT0gdGltZXpvbmUgPyB5ZWFyIDogeWVhciBeIHRpbWV6b25lLmhhc2hDb2RlKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL1llYXJNb250aC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL1llYXJNb250aC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NWZlNGNhLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9ZZWFyTW9udGguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXM7Ci0KLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudGV4dC5OdW1iZXJGb3JtYXQ7Ci0KLS8qKgotICogSW1wbGVtZW50YXRpb24gb2YgdGhlIFhNTCBTY2hlbWEgdHlwZSBnWWVhck1vbnRoCi0gKgotICogQHNlZSA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZ1llYXJNb250aCI+WE1MIFNjaGVtYSAzLjIuMTA8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBZZWFyTW9udGggaW1wbGVtZW50cyBTZXJpYWxpemFibGUgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTU1MTA3Mzk4NDI2NjE2OTA1NTFMOwotCi0gICAgaW50IHllYXI7Ci0gICAgaW50IG1vbnRoOwotICAgIFN0cmluZyB0aW1lem9uZSA9IG51bGw7Ci0KLSAgICAvKiogQ29uc3RydWN0cyBhIFllYXJNb250aCB3aXRoIHRoZSBnaXZlbiB2YWx1ZXMgTm8gdGltZXpvbmUgaXMgc3BlY2lmaWVkICovCi0gICAgcHVibGljIFllYXJNb250aChpbnQgeWVhciwgaW50IG1vbnRoKSB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIHsKLSAgICAgICAgc2V0VmFsdWUoeWVhciwgbW9udGgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBZZWFyTW9udGggd2l0aCB0aGUgZ2l2ZW4gdmFsdWVzLCBpbmNsdWRpbmcgYSB0aW1lem9uZSBzdHJpbmcgVGhlIHRpbWV6b25lIGlzCi0gICAgICogdmFsaWRhdGVkIGJ1dCBub3QgdXNlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgWWVhck1vbnRoKGludCB5ZWFyLCBpbnQgbW9udGgsIFN0cmluZyB0aW1lem9uZSkgdGhyb3dzIE51bWJlckZvcm1hdEV4Y2VwdGlvbiB7Ci0gICAgICAgIHNldFZhbHVlKHllYXIsIG1vbnRoLCB0aW1lem9uZSk7Ci0gICAgfQotCi0gICAgLyoqIENvbnN0cnVjdCBhIFllYXJNb250aCBmcm9tIGEgU3RyaW5nIGluIHRoZSBmb3JtYXQgWy1dQ0NZWS1NTSAqLwotICAgIHB1YmxpYyBZZWFyTW9udGgoU3RyaW5nIHNvdXJjZSkgdGhyb3dzIE51bWJlckZvcm1hdEV4Y2VwdGlvbiB7Ci0gICAgICAgIGludCBuZWdhdGl2ZSA9IDA7Ci0KLSAgICAgICAgaWYgKHNvdXJjZS5jaGFyQXQoMCkgPT0gJy0nKSB7Ci0gICAgICAgICAgICBuZWdhdGl2ZSA9IDE7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNvdXJjZS5sZW5ndGgoKSA8ICg3ICsgbmVnYXRpdmUpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTnVtYmVyRm9ybWF0RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAvLyBNZXNzYWdlcy5nZXRNZXNzYWdlKCJiYWRZZWFyTW9udGgwMCIpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGxvb2sgZm9yIGZpcnN0ICctJwotICAgICAgICBpbnQgcG9zID0gc291cmNlLnN1YnN0cmluZyhuZWdhdGl2ZSkuaW5kZXhPZignLScpOwotICAgICAgICBpZiAocG9zIDwgMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE51bWJlckZvcm1hdEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgLy9NZXNzYWdlcy5nZXRNZXNzYWdlKCJiYWRZZWFyTW9udGgwMCIpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobmVnYXRpdmUgPiAwKSBwb3MrKzsgICAgLy9hZGp1c3QgaW5kZXggZm9yIG9yZ2luYWwgc3RyaW5nCi0KLSAgICAgICAgc2V0VmFsdWUoSW50ZWdlci5wYXJzZUludChzb3VyY2Uuc3Vic3RyaW5nKDAsIHBvcykpLAotICAgICAgICAgICAgICAgICBJbnRlZ2VyLnBhcnNlSW50KHNvdXJjZS5zdWJzdHJpbmcocG9zICsgMSwgcG9zICsgMykpLAotICAgICAgICAgICAgICAgICBzb3VyY2Uuc3Vic3RyaW5nKHBvcyArIDMpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldFllYXIoKSB7Ci0gICAgICAgIHJldHVybiB5ZWFyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFllYXIoaW50IHllYXIpIHsKLSAgICAgICAgLy8gdmFsaWRhdGUgeWVhciwgbW9yZSB0aGFuIDQgZGlnaXRzIGFyZSBhbGxvd2VkIQotICAgICAgICBpZiAoeWVhciA9PSAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTnVtYmVyRm9ybWF0RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAvLyBNZXNzYWdlcy5nZXRNZXNzYWdlKCJiYWRZZWFyTW9udGgwMCIpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRoaXMueWVhciA9IHllYXI7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRNb250aCgpIHsKLSAgICAgICAgcmV0dXJuIG1vbnRoOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE1vbnRoKGludCBtb250aCkgewotICAgICAgICAvLyB2YWxpZGF0ZSBtb250aAotICAgICAgICBpZiAobW9udGggPCAxIHx8IG1vbnRoID4gMTIpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBOdW1iZXJGb3JtYXRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIC8vTWVzc2FnZXMuZ2V0TWVzc2FnZSgiYmFkWWVhck1vbnRoMDAiKSk7Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy5tb250aCA9IG1vbnRoOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGltZXpvbmUoKSB7Ci0gICAgICAgIHJldHVybiB0aW1lem9uZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRUaW1lem9uZShTdHJpbmcgdGltZXpvbmUpIHsKLSAgICAgICAgLy8gdmFsaWRhdGUgdGltZXpvbmUKLSAgICAgICAgaWYgKHRpbWV6b25lICE9IG51bGwgJiYgdGltZXpvbmUubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAvLyBGb3JtYXQgWysvLV1ISDpNTQotICAgICAgICAgICAgaWYgKHRpbWV6b25lLmNoYXJBdCgwKSA9PSAnKycgfHwgKHRpbWV6b25lLmNoYXJBdCgwKSA9PSAnLScpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHRpbWV6b25lLmxlbmd0aCgpICE9IDYgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICFDaGFyYWN0ZXIuaXNEaWdpdCh0aW1lem9uZS5jaGFyQXQoMSkpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAhQ2hhcmFjdGVyLmlzRGlnaXQodGltZXpvbmUuY2hhckF0KDIpKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgdGltZXpvbmUuY2hhckF0KDMpICE9ICc6JyB8fAotICAgICAgICAgICAgICAgICAgICAgICAgIUNoYXJhY3Rlci5pc0RpZ2l0KHRpbWV6b25lLmNoYXJBdCg0KSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICFDaGFyYWN0ZXIuaXNEaWdpdCh0aW1lem9uZS5jaGFyQXQoNSkpKQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTnVtYmVyRm9ybWF0RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgLy9NZXNzYWdlcy5nZXRNZXNzYWdlKCJiYWRUaW1lem9uZTAwIikpOwotCi0gICAgICAgICAgICB9IGVsc2UgaWYgKCF0aW1lem9uZS5lcXVhbHMoIloiKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBOdW1iZXJGb3JtYXRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICAvL01lc3NhZ2VzLmdldE1lc3NhZ2UoImJhZFRpbWV6b25lMDAiKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBpZiB3ZSBnb3QgdGhpcyBmYXIsIGl0cyBnb29kCi0gICAgICAgICAgICB0aGlzLnRpbWV6b25lID0gdGltZXpvbmU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShpbnQgeWVhciwgaW50IG1vbnRoLCBTdHJpbmcgdGltZXpvbmUpIHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24gewotICAgICAgICBzZXRZZWFyKHllYXIpOwotICAgICAgICBzZXRNb250aChtb250aCk7Ci0gICAgICAgIHNldFRpbWV6b25lKHRpbWV6b25lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShpbnQgeWVhciwgaW50IG1vbnRoKSB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIHsKLSAgICAgICAgc2V0WWVhcih5ZWFyKTsKLSAgICAgICAgc2V0TW9udGgobW9udGgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIC8vIHVzZSBOdW1iZXJGb3JtYXQgdG8gZW5zdXJlIGxlYWRpbmcgemVyb3MKLSAgICAgICAgTnVtYmVyRm9ybWF0IG5mID0gTnVtYmVyRm9ybWF0LmdldEluc3RhbmNlKCk7Ci0gICAgICAgIG5mLnNldEdyb3VwaW5nVXNlZChmYWxzZSk7Ci0KLSAgICAgICAgLy8geWVhcgotICAgICAgICBuZi5zZXRNaW5pbXVtSW50ZWdlckRpZ2l0cyg0KTsKLSAgICAgICAgU3RyaW5nIHMgPSBuZi5mb3JtYXQoeWVhcikgKyAiLSI7Ci0KLSAgICAgICAgLy8gbW9udGgKLSAgICAgICAgbmYuc2V0TWluaW11bUludGVnZXJEaWdpdHMoMik7Ci0gICAgICAgIHMgKz0gbmYuZm9ybWF0KG1vbnRoKTsKLQotICAgICAgICAvLyB0aW1lem9uZQotICAgICAgICBpZiAodGltZXpvbmUgIT0gbnVsbCkgewotICAgICAgICAgICAgcyA9IHMgKyB0aW1lem9uZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBZZWFyTW9udGgpKSByZXR1cm4gZmFsc2U7Ci0gICAgICAgIFllYXJNb250aCBvdGhlciA9IChZZWFyTW9udGgpb2JqOwotICAgICAgICBpZiAodGhpcyA9PSBvYmopIHJldHVybiB0cnVlOwotCi0gICAgICAgIGJvb2xlYW4gZXF1YWxzID0gKHRoaXMueWVhciA9PSBvdGhlci55ZWFyICYmIHRoaXMubW9udGggPT0gb3RoZXIubW9udGgpOwotICAgICAgICBpZiAodGltZXpvbmUgIT0gbnVsbCkgewotICAgICAgICAgICAgZXF1YWxzID0gZXF1YWxzICYmIHRpbWV6b25lLmVxdWFscyhvdGhlci50aW1lem9uZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVxdWFsczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIHZhbHVlIG9mIChtb250aCArIHllYXIpIFhPUmVkIHdpdGggdGhlIGhhc2hDb2RlIG9mIHRpbWV6b25lIGlmZiBvbmUgaXMgZGVmaW5lZC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYW4gPGNvZGU+aW50PC9jb2RlPiB2YWx1ZQotICAgICAqLwotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgIHJldHVybiBudWxsID09IHRpbWV6b25lCi0gICAgICAgICAgICAgICAgPyAobW9udGggKyB5ZWFyKQotICAgICAgICAgICAgICAgIDogKG1vbnRoICsgeWVhcikgXiB0aW1lem9uZS5oYXNoQ29kZSgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9wYWNrYWdlLmh0bWwgYi92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzUyZjc1Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08aHRtbD4NCi08Ym9keT4NCi1UaGVzZSBjbGFzc2VzIGFyZSBkaXJlY3RseSBzYWx2YWdlZCBmcm9tIEF4aXMgMSBjb2RlYmFzZS4gT3JpZ2luYWwgYXV0aG9yIGNvbW1lbnRzIGhhdmUgYmVlbg0KLXByZXNlcnZlZCENCi08L2JvZHk+DQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvQW55VHlwZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9BbnlUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkMTNkZWMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9BbnlUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzggKzAsMCBAQAotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIEFueVR5cGUuamF2YQotICoKLSAqIFRoaXMgZmlsZSB3YXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBXU0RMCi0gKiBieSB0aGUgQXBhY2hlIEF4aXMyIHZlcnNpb246IFNOQVBTSE9UICBCdWlsdCBvbiA6IERlYyAyMSwgMjAwNyAoMDQ6MDM6MzAgTEtUKQotICovCi0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBwYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nOwotICAgICAgICAgICAgCi0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiAgQW55VHlwZSBiZWFuIGNsYXNzCi0gICAgICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgcHVibGljICBjbGFzcyBBbnlUeXBlCi0gICAgICAgIGltcGxlbWVudHMgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJCZWFuewotICAgICAgICAKLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgTVlfUU5BTUUgPSBuZXcgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSgKLSAgICAgICAgICAgICAgICAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLAotICAgICAgICAgICAgICAgICJhbnlUeXBlIiwKLSAgICAgICAgICAgICAgICAiU09BUC1FTkMiKTsKLQotICAgICAgICAgICAgCi0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZW5lcmF0ZVByZWZpeChqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICAgICAgaWYobmFtZXNwYWNlLmVxdWFscygiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iKSl7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJTT0FQLUVOQyI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgfQotCi0gICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogZmllbGQgZm9yIEFueVR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IGxvY2FsQW55VHlwZSA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgZ2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCBnZXRBbnlUeXBlKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsQW55VHlwZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIHNldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSBwYXJhbSBBbnlUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRBbnlUeXBlKG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IHBhcmFtKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2NhbEFueVR5cGU9cGFyYW07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAvKioKLSAgICAgKiBpc1JlYWRlck1UT01Bd2FyZQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVhZGVyIHN1cHBvcnRzIE1UT00KLSAgICAgKi8KLSAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKLSAgICAgICAgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICAKLSAgICAgICAgdHJ5ewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gamF2YS5sYW5nLkJvb2xlYW4uVFJVRS5lcXVhbHMocmVhZGVyLmdldFByb3BlcnR5KG9yZy5hcGFjaGUuYXhpb20ub20uT01Db25zdGFudHMuSVNfREFUQV9IQU5ETEVSU19BV0FSRSkpOwotICAgICAgICB9Y2F0Y2goamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpc1JlYWRlck1UT01Bd2FyZTsKLSAgIH0KLSAgICAgCi0gICAgIAotICAgICAgICAvKioKLSAgICAgICAgKgotICAgICAgICAqIEBwYXJhbSBwYXJlbnRRTmFtZQotICAgICAgICAqIEBwYXJhbSBmYWN0b3J5Ci0gICAgICAgICogQHJldHVybiBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudAotICAgICAgICAqLwotICAgICAgIHB1YmxpYyBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCBnZXRPTUVsZW1lbnQgKAotICAgICAgICAgICAgICAgZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnkpIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlIGRhdGFTb3VyY2UgPQotICAgICAgICAgICAgICAgICAgICAgICBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJEYXRhU291cmNlKHRoaXMsTVlfUU5BTUUpewotCi0gICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICBBbnlUeXBlLnRoaXMuc2VyaWFsaXplKE1ZX1FOQU1FLGZhY3RvcnkseG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmxsb20uT01Tb3VyY2VkRWxlbWVudEltcGwoCi0gICAgICAgICAgICAgICBNWV9RTkFNRSxmYWN0b3J5LGRhdGFTb3VyY2UpOwotICAgICAgICAgICAgCi0gICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyLGZhbHNlKTsKLSAgICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VyaWFsaXplVHlwZSkKLSAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvL1dlIGNhbiBzYWZlbHkgYXNzdW1lIGFuIGVsZW1lbnQgaGFzIG9ubHkgb25lIHR5cGUgYXNzb2NpYXRlZCB3aXRoIGl0Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UgPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbG9jYWxOYW1lID0gImFueVR5cGUiOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEgbmFtZXNwYWNlLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocHJlZml4LCBsb2NhbE5hbWUsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChuYW1lc3BhY2UsIGxvY2FsTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChsb2NhbE5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkZCB0aGUgdHlwZSBkZXRhaWxzIGlmIHRoaXMgaXMgdXNlZCBpbiBhIHNpbXBsZSB0eXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlcmlhbGl6ZVR5cGUpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2VQcmVmaXggIT0gbnVsbCkgJiYgKG5hbWVzcGFjZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VQcmVmaXgrIjphbnlUeXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFueVR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxBbnlUeXBlPT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiVmFsdWUgY2Fubm90IGJlIG51bGwgISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbEFueVR5cGUuc2VyaWFsaXplKHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRoIHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCxqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgIGlmICh4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLQotICAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsIGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlTmFtZXNwYWNlID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVWYWx1ZTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBhdHRyaWJ1dGVQcmVmaXggKyAiOiIgKyBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSwgYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICBtZXRob2QgdG8gaGFuZGxlIFFuYW1lcwotICAgICAgICAgKi8KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZShqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhwcmVmaXggKyAiOiIgKyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaS5lIHRoaXMgaXMgdGhlIGRlZmF1bHQgbmFtZXNwYWNlCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lcyhqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lW10gcW5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICBpZiAocW5hbWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHRvIHN0b3JlIHRoaXMgZGF0YSB1bnRpbCBsYXN0IG1vbWVudCBzaW5jZSBpdCBpcyBub3QgcG9zc2libGUgdG8gd3JpdGUgYW55Ci0gICAgICAgICAgICAgICAgLy8gbmFtZXNwYWNlIGRhdGEgYWZ0ZXIgd3JpdGluZyB0aGUgY2hhcmFjdG9yIGRhdGEKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIHN0cmluZ1RvV3JpdGUgPSBuZXcgamF2YS5sYW5nLlN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHFuYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKCIgIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlVVJJID0gcW5hbWVzW2ldLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocHJlZml4ID09IG51bGwpIHx8IChwcmVmaXgubGVuZ3RoKCkgPT0gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChwcmVmaXgpLmFwcGVuZCgiOiIpLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHN0cmluZ1RvV3JpdGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0KLSAgICAgICAgIC8qKgotICAgICAgICAgKiBSZWdpc3RlciBhIG5hbWVzcGFjZSBwcmVmaXgKLSAgICAgICAgICovCi0gICAgICAgICBwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgcmVnaXN0ZXJQcmVmaXgoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLCBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlICh4bWxXcml0ZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gcHJlZml4OwotICAgICAgICAgICAgfQotCi0KLSAgCi0gICAgICAgIC8qKgotICAgICAgICAqIGRhdGFiaW5kaW5nIG1ldGhvZCB0byBnZXQgYW4gWE1MIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0Ci0gICAgICAgICoKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIGdldFB1bGxQYXJzZXIoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxTmFtZSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy9XZSBjYW4gc2FmZWx5IGFzc3VtZSBhbiBlbGVtZW50IGhhcyBvbmx5IG9uZSB0eXBlIGFzc29jaWF0ZWQgd2l0aCBpdAotICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlckltcGwoTVlfUU5BTUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGphdmEubGFuZy5PYmplY3RbXXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXIuRUxFTUVOVF9URVhULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxBbnlUeXBlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCk7Ci0KLSAgICAgICAgfQotCi0gIAotCi0gICAgIC8qKgotICAgICAgKiAgRmFjdG9yeSBjbGFzcyB0aGF0IGtlZXBzIHRoZSBwYXJzZSBtZXRob2QKLSAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5ewotCi0gICAgICAgIAotICAgICAgICAKLQotICAgICAgICAvKioKLSAgICAgICAgKiBzdGF0aWMgbWV0aG9kIHRvIGNyZWF0ZSB0aGUgb2JqZWN0Ci0gICAgICAgICogUHJlY29uZGl0aW9uOiAgSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIGN1cnJlbnQgb3IgbmV4dCBzdGFydCBlbGVtZW50IHN0YXJ0cyB0aGlzIG9iamVjdCBhbmQgYW55IGludGVydmVuaW5nIHJlYWRlciBldmVudHMgYXJlIGlnbm9yYWJsZQotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIG5vdCBhbiBlbGVtZW50LCBpdCBpcyBhIGNvbXBsZXggdHlwZSBhbmQgdGhlIHJlYWRlciBpcyBhdCB0aGUgZXZlbnQganVzdCBhZnRlciB0aGUgb3V0ZXIgc3RhcnQgZWxlbWVudAotICAgICAgICAqIFBvc3Rjb25kaXRpb246IElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCBpdHMgZW5kIGVsZW1lbnQKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBhIGNvbXBsZXggdHlwZSwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IHRoZSBlbmQgZWxlbWVudCBvZiBpdHMgb3V0ZXIgZWxlbWVudAotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIEFueVR5cGUgcGFyc2UoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIEFueVR5cGUgb2JqZWN0ID0KLSAgICAgICAgICAgICAgICBuZXcgQW55VHlwZSgpOwotCi0gICAgICAgICAgICBpbnQgZXZlbnQ7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5pbGxhYmxlVmFsdWUgPSBudWxsOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSIiOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2V1cmkgPSIiOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSAoIXJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICYmICFyZWFkZXIuaXNFbmRFbGVtZW50KCkpCi0gICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIE5vdGUgYWxsIGF0dHJpYnV0ZXMgdGhhdCB3ZXJlIGhhbmRsZWQuIFVzZWQgdG8gZGlmZmVyIG5vcm1hbCBhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgICAgLy8gZnJvbSBhbnlBdHRyaWJ1dGVzLgotICAgICAgICAgICAgICAgIGphdmEudXRpbC5WZWN0b3IgaGFuZGxlZEF0dHJpYnV0ZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlKCFyZWFkZXIuaXNFbmRFbGVtZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICl7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy91c2UgdGhlIFFOYW1lIGZyb20gdGhlIHBhcnNlciBhcyB0aGUgbmFtZSBmb3IgdGhlIGJ1aWxkZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHN0YXJ0UW5hbWUxID0gcmVhZGVyLmdldE5hbWUoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gd3JhcCB0aGUgcmVhZGVyIHNvIHRoYXQgaXQgcHJvZHVjZXMgYSBmYWtlIFNUQVJUX0RPQ1VNRU5UIGV2ZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBuZWVkZWQgYnkgdGhlIGJ1aWxkZXIgY2xhc3NlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuTmFtZWRTdGF4T01CdWlsZGVyIGJ1aWxkZXIxID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuTmFtZWRTdGF4T01CdWlsZGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUuYXhpczIudXRpbC5TdHJlYW1XcmFwcGVyKHJlYWRlciksc3RhcnRRbmFtZTEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5zZXRBbnlUeXBlKGJ1aWxkZXIxLmdldE9NRWxlbWVudCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIEVuZCBvZiBpZiBmb3IgZXhwZWN0ZWQgcHJvcGVydHkgc3RhcnQgZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHN0YXJ0IGVsZW1lbnQgd2UgYXJlIG5vdCBleHBlY3RpbmcgaW5kaWNhdGVzIGFuIGludmFsaWQgcGFyYW1ldGVyIHdhcyBwYXNzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIlVuZXhwZWN0ZWQgc3ViZWxlbWVudCAiICsgcmVhZGVyLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBlbmQgb2Ygd2hpbGUgbG9vcAotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLQotCi0gICAgICAgICAgICB9IGNhdGNoIChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEubGFuZy5FeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBvYmplY3Q7Ci0gICAgICAgIH0KLQotICAgICAgICB9Ly9lbmQgb2YgZmFjdG9yeSBjbGFzcwotCi0gICAgICAgIAotCi0gICAgICAgIH0KLSAgICAgICAgICAgCi0gICAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9BbnlVUkkuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvQW55VVJJLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwMzIwMWMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9BbnlVUkkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwMyArMCwwIEBACi0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICogQW55VVJJLmphdmEKLSAqCi0gKiBUaGlzIGZpbGUgd2FzIGF1dG8tZ2VuZXJhdGVkIGZyb20gV1NETAotICogYnkgdGhlIEFwYWNoZSBBeGlzMiB2ZXJzaW9uOiBTTkFQU0hPVCAgQnVpbHQgb24gOiBEZWMgMjEsIDIwMDcgKDA0OjAzOjMwIExLVCkKLSAqLwotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZzsKLSAgICAgICAgICAgIAotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogIEFueVVSSSBiZWFuIGNsYXNzCi0gICAgICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgcHVibGljICBjbGFzcyBBbnlVUkkKLSAgICAgICAgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkJlYW57Ci0gICAgICAgIC8qIFRoaXMgdHlwZSB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIHBpZWNlIG9mIHNjaGVtYSB0aGF0IGhhZAotICAgICAgICAgICAgICAgIG5hbWUgPSBhbnlVUkkKLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgVVJJID0gaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8KLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgUHJlZml4ID0gbnMxCi0gICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIAotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2VuZXJhdGVQcmVmaXgoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHsKLSAgICAgICAgICAgIGlmKG5hbWVzcGFjZS5lcXVhbHMoImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIikpewotICAgICAgICAgICAgICAgIHJldHVybiAiU09BUC1FTkMiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgIH0KLQotICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIGZpZWxkIGZvciBBbnlVUkkKLSAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuVVJJIGxvY2FsQW55VVJJIDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBnZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5VUkkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuVVJJIGdldEFueVVSSSgpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbEFueVVSSTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIHNldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSBwYXJhbSBBbnlVUkkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldEFueVVSSShvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLlVSSSBwYXJhbSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYWxBbnlVUkk9cGFyYW07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbEFueVVSSS50b1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgLyoqCi0gICAgICogaXNSZWFkZXJNVE9NQXdhcmUKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlYWRlciBzdXBwb3J0cyBNVE9NCi0gICAgICovCi0gICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIHRyeXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGphdmEubGFuZy5Cb29sZWFuLlRSVUUuZXF1YWxzKHJlYWRlci5nZXRQcm9wZXJ0eShvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQ29uc3RhbnRzLklTX0RBVEFfSEFORExFUlNfQVdBUkUpKTsKLSAgICAgICAgfWNhdGNoKGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXNSZWFkZXJNVE9NQXdhcmU7Ci0gICB9Ci0gICAgIAotICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICoKLSAgICAgICAgKiBAcGFyYW0gcGFyZW50UU5hbWUKLSAgICAgICAgKiBAcGFyYW0gZmFjdG9yeQotICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICBwdWJsaWMgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgZ2V0T01FbGVtZW50ICgKLSAgICAgICAgICAgICAgIGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5KSB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlIGRhdGFTb3VyY2UgPQotICAgICAgICAgICAgICAgICAgICAgICBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJEYXRhU291cmNlKHRoaXMscGFyZW50UU5hbWUpewotCi0gICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICBBbnlVUkkudGhpcy5zZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5PTVNvdXJjZWRFbGVtZW50SW1wbCgKLSAgICAgICAgICAgICAgIHBhcmVudFFOYW1lLGZhY3RvcnksZGF0YVNvdXJjZSk7Ci0gICAgICAgICAgICAKLSAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIsZmFsc2UpOwotICAgICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzZXJpYWxpemVUeXBlKQotICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotCi0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UgPSBudWxsOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHBhcmVudFFOYW1lLmdldFByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UgPSBwYXJlbnRRTmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZSAhPSBudWxsKSAmJiAobmFtZXNwYWNlLnRyaW0oKS5sZW5ndGgoKSA+IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHdyaXRlclByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3cml0ZXJQcmVmaXggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChuYW1lc3BhY2UsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHByZWZpeCwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCksIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIGlmIChzZXJpYWxpemVUeXBlKXsKLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIpOwotICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlUHJlZml4ICE9IG51bGwpICYmIChuYW1lc3BhY2VQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkpewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVByZWZpeCsiOmFueVVSSSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgImFueVVSSSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbEFueVVSST09bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgdGhlIG5pbCBhdHRyaWJ1dGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJhbnlVUkkgY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxBbnlVUkkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRoIHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCxqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgIGlmICh4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLQotICAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsIGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlTmFtZXNwYWNlID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVWYWx1ZTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBhdHRyaWJ1dGVQcmVmaXggKyAiOiIgKyBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSwgYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICBtZXRob2QgdG8gaGFuZGxlIFFuYW1lcwotICAgICAgICAgKi8KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZShqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhwcmVmaXggKyAiOiIgKyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaS5lIHRoaXMgaXMgdGhlIGRlZmF1bHQgbmFtZXNwYWNlCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lcyhqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lW10gcW5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICBpZiAocW5hbWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHRvIHN0b3JlIHRoaXMgZGF0YSB1bnRpbCBsYXN0IG1vbWVudCBzaW5jZSBpdCBpcyBub3QgcG9zc2libGUgdG8gd3JpdGUgYW55Ci0gICAgICAgICAgICAgICAgLy8gbmFtZXNwYWNlIGRhdGEgYWZ0ZXIgd3JpdGluZyB0aGUgY2hhcmFjdG9yIGRhdGEKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIHN0cmluZ1RvV3JpdGUgPSBuZXcgamF2YS5sYW5nLlN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHFuYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKCIgIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlVVJJID0gcW5hbWVzW2ldLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocHJlZml4ID09IG51bGwpIHx8IChwcmVmaXgubGVuZ3RoKCkgPT0gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChwcmVmaXgpLmFwcGVuZCgiOiIpLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHN0cmluZ1RvV3JpdGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0KLSAgICAgICAgIC8qKgotICAgICAgICAgKiBSZWdpc3RlciBhIG5hbWVzcGFjZSBwcmVmaXgKLSAgICAgICAgICovCi0gICAgICAgICBwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgcmVnaXN0ZXJQcmVmaXgoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLCBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlICh4bWxXcml0ZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gcHJlZml4OwotICAgICAgICAgICAgfQotCi0KLSAgCi0gICAgICAgIC8qKgotICAgICAgICAqIGRhdGFiaW5kaW5nIG1ldGhvZCB0byBnZXQgYW4gWE1MIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0Ci0gICAgICAgICoKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIGdldFB1bGxQYXJzZXIoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxTmFtZSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgZWxlbWVudExpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGF0dHJpYkxpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlci5FTEVNRU5UX1RFWFQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsQW55VVJJICE9IG51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbEFueVVSSSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJhbnlVUkkgY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXJJbXBsKHFOYW1lLCBlbGVtZW50TGlzdC50b0FycmF5KCksIGF0dHJpYkxpc3QudG9BcnJheSgpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gIAotCi0gICAgIC8qKgotICAgICAgKiAgRmFjdG9yeSBjbGFzcyB0aGF0IGtlZXBzIHRoZSBwYXJzZSBtZXRob2QKLSAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5ewotCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIEFueVVSSSBmcm9tU3RyaW5nKGphdmEubGFuZy5TdHJpbmcgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkpewotICAgICAgICAgICAgICAgICAgICBBbnlVUkkgcmV0dXJuVmFsdWUgPSBuZXcgIEFueVVSSSgpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZS5zZXRBbnlVUkkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9BbnlVUkkodmFsdWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIEFueVVSSSBmcm9tU3RyaW5nKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50LmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gY29udGVudC5zdWJzdHJpbmcoMCxjb250ZW50LmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVyaSA9IHhtbFN0cmVhbVJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQW55VVJJLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LG5hbWVzcGFjZVVyaSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBbnlVUkkuRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsIiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAKLQotICAgICAgICAvKioKLSAgICAgICAgKiBzdGF0aWMgbWV0aG9kIHRvIGNyZWF0ZSB0aGUgb2JqZWN0Ci0gICAgICAgICogUHJlY29uZGl0aW9uOiAgSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIGN1cnJlbnQgb3IgbmV4dCBzdGFydCBlbGVtZW50IHN0YXJ0cyB0aGlzIG9iamVjdCBhbmQgYW55IGludGVydmVuaW5nIHJlYWRlciBldmVudHMgYXJlIGlnbm9yYWJsZQotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIG5vdCBhbiBlbGVtZW50LCBpdCBpcyBhIGNvbXBsZXggdHlwZSBhbmQgdGhlIHJlYWRlciBpcyBhdCB0aGUgZXZlbnQganVzdCBhZnRlciB0aGUgb3V0ZXIgc3RhcnQgZWxlbWVudAotICAgICAgICAqIFBvc3Rjb25kaXRpb246IElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCBpdHMgZW5kIGVsZW1lbnQKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBhIGNvbXBsZXggdHlwZSwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IHRoZSBlbmQgZWxlbWVudCBvZiBpdHMgb3V0ZXIgZWxlbWVudAotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIEFueVVSSSBwYXJzZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uewotICAgICAgICAgICAgQW55VVJJIG9iamVjdCA9Ci0gICAgICAgICAgICAgICAgbmV3IEFueVVSSSgpOwotCi0gICAgICAgICAgICBpbnQgZXZlbnQ7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5pbGxhYmxlVmFsdWUgPSBudWxsOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSIiOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2V1cmkgPSIiOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSAoIXJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICYmICFyZWFkZXIuaXNFbmRFbGVtZW50KCkpCi0gICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiKSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGZ1bGxUeXBlTmFtZSA9IHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiKTsKLSAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUhPW51bGwpewotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zUHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoMCxmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IG5zUHJlZml4PT1udWxsPyIiOm5zUHJlZml4OwotCi0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgdHlwZSA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSsxKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEiYW55VVJJIi5lcXVhbHModHlwZSkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2ZpbmQgbmFtZXNwYWNlIGZvciB0aGUgcHJlZml4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNVcmkgPSByZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShuc1ByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoQW55VVJJKW9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLkV4dGVuc2lvbk1hcHBlci5nZXRUeXBlT2JqZWN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zVXJpLHR5cGUscmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIE5vdGUgYWxsIGF0dHJpYnV0ZXMgdGhhdCB3ZXJlIGhhbmRsZWQuIFVzZWQgdG8gZGlmZmVyIG5vcm1hbCBhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgICAgLy8gZnJvbSBhbnlBdHRyaWJ1dGVzLgotICAgICAgICAgICAgICAgIGphdmEudXRpbC5WZWN0b3IgaGFuZGxlZEF0dHJpYnV0ZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlKCFyZWFkZXIuaXNFbmRFbGVtZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50ID0gcmVhZGVyLmdldEVsZW1lbnRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0QW55VVJJKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9BbnlVUkkoY29udGVudCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIEVuZCBvZiBpZiBmb3IgZXhwZWN0ZWQgcHJvcGVydHkgc3RhcnQgZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHN0YXJ0IGVsZW1lbnQgd2UgYXJlIG5vdCBleHBlY3RpbmcgaW5kaWNhdGVzIGFuIGludmFsaWQgcGFyYW1ldGVyIHdhcyBwYXNzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIlVuZXhwZWN0ZWQgc3ViZWxlbWVudCAiICsgcmVhZGVyLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBlbmQgb2Ygd2hpbGUgbG9vcAotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLQotCi0gICAgICAgICAgICB9IGNhdGNoIChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEubGFuZy5FeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBvYmplY3Q7Ci0gICAgICAgIH0KLQotICAgICAgICB9Ly9lbmQgb2YgZmFjdG9yeSBjbGFzcwotCi0gICAgICAgIAotCi0gICAgICAgIH0KLSAgICAgICAgICAgCi0gICAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9BcnJheS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9BcnJheS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTgyZGVmLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvQXJyYXkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIEFycmF5LmphdmEKLSAqCi0gKiBUaGlzIGZpbGUgd2FzIGF1dG8tZ2VuZXJhdGVkIGZyb20gV1NETAotICogYnkgdGhlIEFwYWNoZSBBeGlzMiB2ZXJzaW9uOiBTTkFQU0hPVCAgQnVpbHQgb24gOiBEZWMgMjEsIDIwMDcgKDA0OjAzOjMwIExLVCkKLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTURhdGFTb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmxsb20uT01Tb3VyY2VkRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJCZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRGF0YVNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXI7Ci0KLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLQotLyoqCi0gKiBBcnJheSBiZWFuIGNsYXNzCi0gKi8KLQotcHVibGljIGNsYXNzIEFycmF5IGltcGxlbWVudHMgQURCQmVhbiB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQ0hJTERfTE9DQUxfTkFNRSA9ICJpdGVtIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgU09BUF9OQU1FU1BBQ0VfUFJFRklYID0gIlNPQVAtRU5DIjsKLQotICAgIHB1YmxpYyBBcnJheSgpIHsKLSAgICAgICAgdGhpcy5vYmplY3RMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2VuZXJhdGVQcmVmaXgoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHsKLSAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIikpIHsKLSAgICAgICAgICAgIHJldHVybiAiU09BUC1FTkMiOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBCZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICB9Ci0KLQotICAgIHByb3RlY3RlZCBMaXN0IG9iamVjdExpc3Q7Ci0KLSAgICBwdWJsaWMgTGlzdCBnZXRPYmplY3RMaXN0KCkgewotICAgICAgICByZXR1cm4gb2JqZWN0TGlzdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRPYmplY3RMaXN0KExpc3Qgb2JqZWN0TGlzdCkgewotICAgICAgICB0aGlzLm9iamVjdExpc3QgPSBvYmplY3RMaXN0OwotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgYWRkT2JqZWN0KE9iamVjdCBvYmplY3QpIHsKLSAgICAgICAgdGhpcy5vYmplY3RMaXN0LmFkZChvYmplY3QpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIGFycmF5VHlwZVFOYW1lOwotCi0gICAgcHVibGljIHZvaWQgc2V0QXJyYXlUeXBlUU5hbWUoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSl7Ci0gICAgICAgIGFycmF5VHlwZVFOYW1lID0gcW5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgZ2V0QXJyYXlUeXBlUU5hbWUoKXsKLSAgICAgICAgcmV0dXJuIGFycmF5VHlwZVFOYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGZpZWxkIGZvciBBcnJheVR5cGUKLSAgICAgKiBUaGlzIHdhcyBhbiBBdHRyaWJ1dGUhCi0gICAgICovCi0KLQotICAgIHByb3RlY3RlZCBqYXZhLmxhbmcuU3RyaW5nIGxvY2FsQXJyYXlUeXBlOwotCi0KLSAgICAvKioKLSAgICAgKiBBdXRvIGdlbmVyYXRlZCBnZXR0ZXIgbWV0aG9kCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRBcnJheVR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBsb2NhbEFycmF5VHlwZTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIEF1dG8gZ2VuZXJhdGVkIHNldHRlciBtZXRob2QKLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJhbSBBcnJheVR5cGUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRBcnJheVR5cGUoamF2YS5sYW5nLlN0cmluZyBwYXJhbSkgewotCi0gICAgICAgIHRoaXMubG9jYWxBcnJheVR5cGUgPSBwYXJhbTsKLQotCi0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBmaWVsZCBmb3IgT2Zmc2V0Ci0gICAgICogVGhpcyB3YXMgYW4gQXR0cmlidXRlIQotICAgICAqLwotCi0KLSAgICBwcm90ZWN0ZWQgamF2YS5sYW5nLlN0cmluZyBsb2NhbE9mZnNldDsKLQotCi0gICAgLyoqCi0gICAgICogQXV0byBnZW5lcmF0ZWQgZ2V0dGVyIG1ldGhvZAotICAgICAqCi0gICAgICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0T2Zmc2V0KCkgewotICAgICAgICByZXR1cm4gbG9jYWxPZmZzZXQ7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBBdXRvIGdlbmVyYXRlZCBzZXR0ZXIgbWV0aG9kCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGFyYW0gT2Zmc2V0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0T2Zmc2V0KGphdmEubGFuZy5TdHJpbmcgcGFyYW0pIHsKLQotICAgICAgICB0aGlzLmxvY2FsT2Zmc2V0ID0gcGFyYW07Ci0KLQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogZmllbGQgZm9yIElkCi0gICAgICogVGhpcyB3YXMgYW4gQXR0cmlidXRlIQotICAgICAqLwotCi0KLSAgICBwcm90ZWN0ZWQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5JZCBsb2NhbElkOwotCi0KLSAgICAvKioKLSAgICAgKiBBdXRvIGdlbmVyYXRlZCBnZXR0ZXIgbWV0aG9kCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuSWQKLSAgICAgKi8KLSAgICBwdWJsaWMgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5JZCBnZXRJZCgpIHsKLSAgICAgICAgcmV0dXJuIGxvY2FsSWQ7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBBdXRvIGdlbmVyYXRlZCBzZXR0ZXIgbWV0aG9kCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGFyYW0gSWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLklkIHBhcmFtKSB7Ci0KLSAgICAgICAgdGhpcy5sb2NhbElkID0gcGFyYW07Ci0KLQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogZmllbGQgZm9yIEhyZWYKLSAgICAgKiBUaGlzIHdhcyBhbiBBdHRyaWJ1dGUhCi0gICAgICovCi0KLQotICAgIHByb3RlY3RlZCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLlVSSSBsb2NhbEhyZWY7Ci0KLQotICAgIC8qKgotICAgICAqIEF1dG8gZ2VuZXJhdGVkIGdldHRlciBtZXRob2QKLSAgICAgKgotICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5VUkkKLSAgICAgKi8KLSAgICBwdWJsaWMgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5VUkkgZ2V0SHJlZigpIHsKLSAgICAgICAgcmV0dXJuIGxvY2FsSHJlZjsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIEF1dG8gZ2VuZXJhdGVkIHNldHRlciBtZXRob2QKLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJhbSBIcmVmCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SHJlZihvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLlVSSSBwYXJhbSkgewotCi0gICAgICAgIHRoaXMubG9jYWxIcmVmID0gcGFyYW07Ci0KLQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogaXNSZWFkZXJNVE9NQXdhcmUKLSAgICAgKgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVhZGVyIHN1cHBvcnRzIE1UT00KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBqYXZhLmxhbmcuQm9vbGVhbi5UUlVFLmVxdWFscyhyZWFkZXIuZ2V0UHJvcGVydHkob3JnLmFwYWNoZS5heGlvbS5vbS5PTUNvbnN0YW50cy5JU19EQVRBX0hBTkRMRVJTX0FXQVJFKSk7Ci0gICAgICAgIH0gY2F0Y2ggKGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXNSZWFkZXJNVE9NQXdhcmU7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gcGFyZW50UU5hbWUKLSAgICAgKiBAcGFyYW0gZmFjdG9yeQotICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgT01FbGVtZW50IGdldE9NRWxlbWVudCgKLSAgICAgICAgICAgIGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICBmaW5hbCBPTUZhY3RvcnkgZmFjdG9yeSkgdGhyb3dzIEFEQkV4Y2VwdGlvbiB7Ci0KLQotICAgICAgICBPTURhdGFTb3VyY2UgZGF0YVNvdXJjZSA9IG5ldyBBREJEYXRhU291cmNlKHRoaXMsIHBhcmVudFFOYW1lKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgQXJyYXkudGhpcy5zZXJpYWxpemUocGFyZW50UU5hbWUsIGZhY3RvcnksIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIHJldHVybiBuZXcgT01Tb3VyY2VkRWxlbWVudEltcGwocGFyZW50UU5hbWUsIGZhY3RvcnksIGRhdGFTb3VyY2UpOwotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICBNVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uLCBBREJFeGNlcHRpb24gewotICAgICAgICBzZXJpYWxpemUocGFyZW50UU5hbWUsIGZhY3RvcnksIHhtbFdyaXRlciwgZmFsc2UpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzZXJpYWxpemVUeXBlKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uLCBBREJFeGNlcHRpb24gewotCi0KLSAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBwYXJlbnRRTmFtZS5nZXRQcmVmaXgoKTsKLSAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UgPSBwYXJlbnRRTmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLQotCi0gICAgICAgIHdyaXRlU3RhcnRFbGVtZW50KG5hbWVzcGFjZSwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCksIHByZWZpeCwgeG1sV3JpdGVyKTsKLQotICAgICAgICBpZiAoc2VyaWFsaXplVHlwZSkgewotCi0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIik7Ci0gICAgICAgICAgICBpZiAoKG5hbWVzcGFjZVByZWZpeCAhPSBudWxsKSAmJiAobmFtZXNwYWNlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApKSB7Ci0gICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsICJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVByZWZpeCArICI6QXJyYXkiLAotICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsICJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJBcnJheSIsCi0gICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhcnJheVR5cGVQcmVmaXggPSBudWxsOwotICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGFycmF5VHlwZSA9IG51bGw7Ci0gICAgICAgIGlmIChhcnJheVR5cGVRTmFtZSAhPSBudWxsKXsKLSAgICAgICAgICAgIGFycmF5VHlwZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgYXJyYXlUeXBlUU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgICAgICAgICAgYXJyYXlUeXBlID0gYXJyYXlUeXBlUU5hbWUuZ2V0TG9jYWxQYXJ0KCkgKyAiWyIgKyBvYmplY3RMaXN0LnNpemUoKSArICJdIjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIHdyaXRlIGl0IGFzIHVyLXR5cGUKLSAgICAgICAgICAgIGFycmF5VHlwZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIik7Ci0gICAgICAgICAgICBhcnJheVR5cGUgPSAgInVyLXR5cGVbIiArIG9iamVjdExpc3Quc2l6ZSgpICsgIl0iOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKChhcnJheVR5cGVQcmVmaXggIT0gbnVsbCkgJiYgKGFycmF5VHlwZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSkgewotICAgICAgICAgICAgYXJyYXlUeXBlID0gYXJyYXlUeXBlUHJlZml4ICsgIjoiICsgYXJyYXlUeXBlOwotICAgICAgICB9Ci0KLSAgICAgICAgd3JpdGVBdHRyaWJ1dGUocmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iKSwKLSAgICAgICAgICAgICAgICAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLAotICAgICAgICAgICAgICAgICJhcnJheVR5cGUiLCBhcnJheVR5cGUsIHhtbFdyaXRlcik7Ci0KLSAgICAgICAgaWYgKGxvY2FsT2Zmc2V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIsCi0gICAgICAgICAgICAgICAgICAgICJvZmZzZXQiLCBDb252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbE9mZnNldCksIHhtbFdyaXRlcik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobG9jYWxJZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgiIiwgImlkIiwgQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxJZCksIHhtbFdyaXRlcik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobG9jYWxIcmVmICE9IG51bGwpIHsKLSAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCIiLCAiaHJlZiIsIENvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsSHJlZiksIHhtbFdyaXRlcik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBzZXJpYWxpemUgdGhlIG9iamVjdCBhcnJheQotICAgICAgICAvLyBzaW5jZSBzb2FwIGVuY29kaW5nIGRvZXMgbm90IGVuZm9yY2UgdGhlIG5hbWUgb2YgdGhlIGNoaWxkcmVuIGl0ZW1zCi0gICAgICAgIC8vIGhlcmUgd2UgdXNlIGl0ZW0gYXMgdGhlIGNoaWxkIG5hbWUuCi0KLSAgICAgICAgLy8gYWxsIHRoZSBsaXN0IG9iamVjdHMgbXVzdCBiZSBBREJCZWFucyBmb3IgYmFzaWMgc2NoZW1hIHR5cGVzIHN1Y2ggYXMKLSAgICAgICAgLy8gaW50LGZsb2F0IGNvcnJlc3BvbmRpbmcgc29hcGVuY29kaW5nIGNsYXNzIG11c3QgYmUgdXNlZAotICAgICAgICBBREJCZWFuIGFkYkJlYW47Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IG9iamVjdExpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBhZGJCZWFuID0gKEFEQkJlYW4pIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgaWYgKGFkYkJlYW4gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChhcnJheVR5cGVRTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBhcnJheSBUeXBlIGlzIGdpdmVuIHRoZW4gZWFjaCBlbGVtZW50IGRvZXMgbm90IGhhdmUgdG8KLSAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgdGhlIHR5cGUKLSAgICAgICAgICAgICAgICAgICAgYWRiQmVhbi5zZXJpYWxpemUobmV3IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUoIiIsIENISUxEX0xPQ0FMX05BTUUpLCBmYWN0b3J5LCB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkYkJlYW4uc2VyaWFsaXplKG5ldyBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lKCIiLCBDSElMRF9MT0NBTF9OQU1FKSwgZmFjdG9yeSwgeG1sV3JpdGVyLCB0cnVlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy93cml0ZSB0aGUgbnVsbCBhdHRyaWJ1dGUKLSAgICAgICAgICAgICAgICB3cml0ZVN0YXJ0RWxlbWVudCgiIiwgQ0hJTERfTE9DQUxfTkFNRSwgbnVsbCwgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwgIm5pbCIsICIxIiwgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotCi0gICAgICAgIHhtbFdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKLQotCi0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHdyaXRlU3RhcnRFbGVtZW50KGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGxvY2FsUGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBpZiAoKG5hbWVzcGFjZSAhPSBudWxsKSAmJiAobmFtZXNwYWNlLnRyaW0oKS5sZW5ndGgoKSA+IDApKSB7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHdyaXRlclByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgIGlmICh3cml0ZXJQcmVmaXggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChuYW1lc3BhY2UsIGxvY2FsUGFydCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwcmVmaXgsIGxvY2FsUGFydCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KGxvY2FsUGFydCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aCB0aGUgbnMgcHJlZml4Ci0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgcHJlZml4LCBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSwgamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICh4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSkgPT0gbnVsbCkgewotICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotCi0gICAgICAgIH0KLQotICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLCBhdHROYW1lLCBhdHRWYWx1ZSk7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLCBqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSwgYXR0VmFsdWUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSwgYXR0TmFtZSwgYXR0VmFsdWUpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsIGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVOYW1lc3BhY2UgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgYXR0cmlidXRlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICB9Ci0gICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlVmFsdWU7Ci0gICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBhdHRyaWJ1dGVQcmVmaXggKyAiOiIgKyBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLCBhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBtZXRob2QgdG8gaGFuZGxlIFFuYW1lcwotICAgICAqLwotCi0gICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWUoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMocHJlZml4ICsgIjoiICsgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBpLmUgdGhpcyBpcyB0aGUgZGVmYXVsdCBuYW1lc3BhY2UKLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZXMoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZVtdIHFuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgIGlmIChxbmFtZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBzdG9yZSB0aGlzIGRhdGEgdW50aWwgbGFzdCBtb21lbnQgc2luY2UgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHdyaXRlIGFueQotICAgICAgICAgICAgLy8gbmFtZXNwYWNlIGRhdGEgYWZ0ZXIgd3JpdGluZyB0aGUgY2hhcmFjdG9yIGRhdGEKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmdCdWZmZXIgc3RyaW5nVG9Xcml0ZSA9IG5ldyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IG51bGw7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcW5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKCIgIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG5hbWVzcGFjZVVSSSA9IHFuYW1lc1tpXS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoKHByZWZpeCA9PSBudWxsKSB8fCAocHJlZml4Lmxlbmd0aCgpID09IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChwcmVmaXgpLmFwcGVuZCgiOiIpLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhzdHJpbmdUb1dyaXRlLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFJlZ2lzdGVyIGEgbmFtZXNwYWNlIHByZWZpeAotICAgICAqLwotICAgIHByaXZhdGUgamF2YS5sYW5nLlN0cmluZyByZWdpc3RlclByZWZpeChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgIHdoaWxlICh4bWxXcml0ZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBwcmVmaXggPSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcHJlZml4OwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogZGF0YWJpbmRpbmcgbWV0aG9kIHRvIGdldCBhbiBYTUwgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QKLSAgICAgKi8KLSAgICBwdWJsaWMgWE1MU3RyZWFtUmVhZGVyIGdldFB1bGxQYXJzZXIoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxTmFtZSkgdGhyb3dzIEFEQkV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogRmFjdG9yeSBjbGFzcyB0aGF0IGtlZXBzIHRoZSBwYXJzZSBtZXRob2QKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3RvcnkgewotCi0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIHN0YXRpYyBtZXRob2QgdG8gY3JlYXRlIHRoZSBvYmplY3QKLSAgICAgICAgICogUHJlY29uZGl0aW9uOiAgSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIGN1cnJlbnQgb3IgbmV4dCBzdGFydCBlbGVtZW50IHN0YXJ0cyB0aGlzIG9iamVjdCBhbmQgYW55IGludGVydmVuaW5nIHJlYWRlciBldmVudHMgYXJlIGlnbm9yYWJsZQotICAgICAgICAgKiBJZiB0aGlzIG9iamVjdCBpcyBub3QgYW4gZWxlbWVudCwgaXQgaXMgYSBjb21wbGV4IHR5cGUgYW5kIHRoZSByZWFkZXIgaXMgYXQgdGhlIGV2ZW50IGp1c3QgYWZ0ZXIgdGhlIG91dGVyIHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgICogUG9zdGNvbmRpdGlvbjogSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IGl0cyBlbmQgZWxlbWVudAotICAgICAgICAgKiBJZiB0aGlzIG9iamVjdCBpcyBhIGNvbXBsZXggdHlwZSwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IHRoZSBlbmQgZWxlbWVudCBvZiBpdHMgb3V0ZXIgZWxlbWVudAotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBBcnJheSBwYXJzZShYTUxTdHJlYW1SZWFkZXIgcmVhZGVyLCBDbGFzcyBtYXBwZXJDbGFzcykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBBcnJheSBvYmplY3QgPSBuZXcgQXJyYXkoKTsKLQotICAgICAgICAgICAgaW50IGV2ZW50OwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuaWxsYWJsZVZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gIiI7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZXVyaSA9ICIiOwotICAgICAgICAgICAgdHJ5IHsKLQotICAgICAgICAgICAgICAgIHdoaWxlICghcmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgJiYgIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkKLSAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLQotLy8gICAgICAgICAgICAgICAgaWYgKHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCAidHlwZSIpICE9IG51bGwpIHsKLS8vICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGZ1bGxUeXBlTmFtZSA9IHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiKTsKLS8vICAgICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lICE9IG51bGwpIHsKLS8vICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1ByZWZpeCA9IG51bGw7Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpID4gLTEpIHsKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZygwLCBmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKTsKLS8vICAgICAgICAgICAgICAgICAgICAgICAgfQotLy8gICAgICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IG5zUHJlZml4ID09IG51bGwgPyAiIiA6IG5zUHJlZml4OwotLy8KLS8vICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB0eXBlID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZyhmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpICsgMSk7Ci0vLwotLy8gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISJBcnJheSIuZXF1YWxzKHR5cGUpKSB7Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2ZpbmQgbmFtZXNwYWNlIGZvciB0aGUgcHJlZml4Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zVXJpID0gcmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkobnNQcmVmaXgpOwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChBcnJheSkgRXh0ZW5zaW9uTWFwcGVyLmdldFR5cGVPYmplY3QobnNVcmksIHR5cGUsIHJlYWRlcik7Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgICAgICAgICB9Ci0vLyAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBOb3RlIGFsbCBhdHRyaWJ1dGVzIHRoYXQgd2VyZSBoYW5kbGVkLiBVc2VkIHRvIGRpZmZlciBub3JtYWwgYXR0cmlidXRlcwotICAgICAgICAgICAgICAgIC8vIGZyb20gYW55QXR0cmlidXRlcy4KLSAgICAgICAgICAgICAgICBqYXZhLnV0aWwuVmVjdG9yIGhhbmRsZWRBdHRyaWJ1dGVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQotICAgICAgICAgICAgICAgIC8vIGhhbmRsZSBhdHRyaWJ1dGUgImFycmF5VHlwZSIKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVR5cGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIsICJhcnJheVR5cGUiKTsKLSAgICAgICAgICAgICAgICBvYmplY3Quc2V0QXJyYXlUeXBlKENvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGF0dHJpYnV0ZVR5cGUpKTsKLQotICAgICAgICAgICAgICAgIGhhbmRsZWRBdHRyaWJ1dGVzLmFkZCgiYXJyYXlUeXBlIik7Ci0KLSAgICAgICAgICAgICAgICAvLyBoYW5kbGUgYXR0cmlidXRlICJvZmZzZXQiCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBvZmZzZXQgPQotICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIsICJvZmZzZXQiKTsKLSAgICAgICAgICAgICAgICBvYmplY3Quc2V0T2Zmc2V0KENvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKG9mZnNldCkpOwotCi0gICAgICAgICAgICAgICAgaGFuZGxlZEF0dHJpYnV0ZXMuYWRkKCJvZmZzZXQiKTsKLQotICAgICAgICAgICAgICAgIC8vIGhhbmRsZSBhdHRyaWJ1dGUgImlkIgotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgaWQgPSByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgImlkIik7Ci0gICAgICAgICAgICAgICAgb2JqZWN0LnNldElkKENvbnZlcnRlclV0aWwuY29udmVydFRvSUQoaWQpKTsKLSAgICAgICAgICAgICAgICBoYW5kbGVkQXR0cmlidXRlcy5hZGQoImlkIik7Ci0KLSAgICAgICAgICAgICAgICAvLyBoYW5kbGUgYXR0cmlidXRlICJocmVmIgotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgaHJlZiA9IHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCAiaHJlZiIpOwotICAgICAgICAgICAgICAgIG9iamVjdC5zZXRIcmVmKENvbnZlcnRlclV0aWwuY29udmVydFRvQW55VVJJKGhyZWYpKTsKLSAgICAgICAgICAgICAgICBoYW5kbGVkQXR0cmlidXRlcy5hZGQoImhyZWYiKTsKLQotICAgICAgICAgICAgICAgIC8vIGF0IHRoZSBzdGFydGluZyBwb2ludCBvZiB0aGUgY2hpbGQgZWxlbWVudHMKLSAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgd2hpbGUgKCFyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAmJiAhcmVhZGVyLmlzRW5kRWxlbWVudCgpKSByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgYXJyYXlFbGVtZW50UU5hbWUgPSBnZXRJbm5lckVsZW1lbnRzUU5hbWUoYXR0cmlidXRlVHlwZSwgcmVhZGVyKTsKLSAgICAgICAgICAgICAgICBvYmplY3Quc2V0QXJyYXlUeXBlUU5hbWUoYXJyYXlFbGVtZW50UU5hbWUpOwotICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSkgewotCi0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gbG9vcERvbmUgPSBmYWxzZTsKLQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoIWxvb3BEb25lKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIHdoZXRoZXIgaXMgb2JqZWN0IGlzIG51bGwgb3Igbm90Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmlsbGFibGVWYWx1ZSA9IHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJuaWwiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoInRydWUiLmVxdWFscyhuaWxsYWJsZVZhbHVlKSB8fCAiMSIuZXF1YWxzKG5pbGxhYmxlVmFsdWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1vdmUgdGhlIGN1cnNvciB0byB0aGUgZW5kIGVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCFyZWFkZXIuaXNFbmRFbGVtZW50KCkpIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5hZGRPYmplY3QobnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhcnJheUVsZW1lbnRRTmFtZSAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaS5lIHRoaXMgYXJyYXkgaGFzIHNhbWUgYXR0cmlidXRlIHR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LmFkZE9iamVjdChnZXRPYmplY3QoYXJyYXlFbGVtZW50UU5hbWUscmVhZGVyLG1hcHBlckNsYXNzKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXJyYXlFbGVtZW50UU5hbWUgbnVsbCBtZWFucyB0aGlzIGRvZXMgbm90IGhhdmUgYW4gYXJyeSBsZXZlbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0eXBlIGRlY2xhcmF0aW9uIHdlIGhhdmUgdG8gY2hlY2sgZm9yIGVhY2ggYW5kIGV2ZXJ5IGVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSB0eXBlUU5hbWUgPSBnZXRUeXBlUU5hbWUocmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVRTmFtZSA9PSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVRTmFtZSA9IHJlYWRlci5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LmFkZE9iamVjdChnZXRPYmplY3QodHlwZVFOYW1lLHJlYWRlcixtYXBwZXJDbGFzcykpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoIXJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICYmICFyZWFkZXIuaXNFbmRFbGVtZW50KCkpIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVhZGVyLmlzRW5kRWxlbWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcERvbmUgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHdoaWxlICghcmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgJiYgIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkKLSAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLQotICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgLy8gQSBzdGFydCBlbGVtZW50IHdlIGFyZSBub3QgZXhwZWN0aW5nIGluZGljYXRlcyBhIHRyYWlsaW5nIGludmFsaWQgcHJvcGVydHkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFEQkV4Y2VwdGlvbigiVW5leHBlY3RlZCBzdWJlbGVtZW50ICIgKyByZWFkZXIuZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJFeGNlcHRpb24gd2hpbGUgcGFyc2luZyBhcnJheSIsZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBvYmplY3Q7Ci0gICAgICAgIH0KLQotICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0IGdldE9iamVjdChqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyBtYXBwZXJDbGFzcykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBPYmplY3QgcmV0dXJuT2JqZWN0ID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChxTmFtZS5nZXROYW1lc3BhY2VVUkkoKS5lcXVhbHMoImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIikpewotICAgICAgICAgICAgICByZXR1cm5PYmplY3QgPSBFeHRlbnNpb25NYXBwZXIuZ2V0VHlwZU9iamVjdCgKLSAgICAgICAgICAgICAgICAgICAgICAgcU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCksCi0gICAgICAgICAgICAgICAgICAgICAgIHFOYW1lLmdldExvY2FsUGFydCgpLAotICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChxTmFtZS5nZXROYW1lc3BhY2VVUkkoKS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikpewotICAgICAgICAgICAgICAgIHJldHVybk9iamVjdCA9IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkLkV4dGVuc2lvbk1hcHBlci5nZXRUeXBlT2JqZWN0KAotICAgICAgICAgICAgICAgICAgICAgICBxTmFtZS5nZXROYW1lc3BhY2VVUkkoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgcU5hbWUuZ2V0TG9jYWxQYXJ0KCksCi0gICAgICAgICAgICAgICAgICAgICAgIHJlYWRlcik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIHRoaXMgY291bGQgYmUgYSBnZW5lcmFsIG9uZSBvZiBoYXZlIHRvIGNhbGwgZm9yIHRoZSBzeXN0ZW0gRXh0ZW5zaW9uIG1hcHBlcgotICAgICAgICAgICAgICAgIC8vIGludm9raW5nIHRoZSBtYXBwZXJjbGFzcyB1c2luZyByZWZsZWN0aW9uCi0gICAgICAgICAgICAgICAgTWV0aG9kIGdldE9iamVjdE1ldGhvZCA9IG1hcHBlckNsYXNzLmdldE1ldGhvZCgiZ2V0VHlwZU9iamVjdCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXXtqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBYTUxTdHJlYW1SZWFkZXIuY2xhc3N9KTsKLSAgICAgICAgICAgICAgICByZXR1cm5PYmplY3QgPSBnZXRPYmplY3RNZXRob2QuaW52b2tlKG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W117cU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCksIHFOYW1lLmdldExvY2FsUGFydCgpLCByZWFkZXJ9KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiByZXR1cm5PYmplY3Q7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIGdldElubmVyRWxlbWVudHNRTmFtZSgKLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVUeXBlLCBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyKXsKLSAgICAgICAgICAgICAgIC8vIGF0dHJpYnV0ZSB0eXBlIGlzIHNpbWlsYXIgdG8geHNkOnVyLXR5cGVbNF0KLSAgICAgICAgICAgICAgIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgdHlwZVFOYW1lID0gbnVsbDsKLSAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gIiI7Ci0gICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHR5cGUgPSBhdHRyaWJ1dGVUeXBlOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVUeXBlLmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gYXR0cmlidXRlVHlwZS5zdWJzdHJpbmcoMCxhdHRyaWJ1dGVUeXBlLmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgIHR5cGUgPSBhdHRyaWJ1dGVUeXBlLnN1YnN0cmluZyhhdHRyaWJ1dGVUeXBlLmluZGV4T2YoIjoiKSArIDEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSA9IHJlYWRlci5nZXROYW1lc3BhY2VVUkkocHJlZml4KTsKLSAgICAgICAgICAgICAgICB0eXBlID0gdHlwZS5zdWJzdHJpbmcoMCx0eXBlLmluZGV4T2YoIlsiKSk7Ci0gICAgICAgICAgICAgICAgaWYgKCF0eXBlLmVxdWFscygidXItdHlwZSIpKXsKLSAgICAgICAgICAgICAgICAgICAgdHlwZVFOYW1lID0gbmV3IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUobmFtZXNwYWNlLHR5cGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gdHlwZVFOYW1lOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwcml2YXRlIHN0YXRpYyBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIGdldFR5cGVRTmFtZShYTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7Ci0gICAgICAgICAgICAgICAgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSB0eXBlUU5hbWUgPSBudWxsOwotICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwgInR5cGUiKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgZnVsbFR5cGVOYW1lID0gcmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zUHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpID4gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoMCwgZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IG5zUHJlZml4ID09IG51bGwgPyAiIiA6IG5zUHJlZml4OwotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB0eXBlID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZyhmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpICsgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlUU5hbWUgPSBuZXcgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZShyZWFkZXIuZ2V0TmFtZXNwYWNlVVJJKG5zUHJlZml4KSwgdHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHR5cGVRTmFtZTsKLSAgICAgICAgICAgIH0KLQotICAgIH0KLQotfQotICAgICAgICAgICAKLSAgICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL0FycmF5Q29vcmRpbmF0ZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9BcnJheUNvb3JkaW5hdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzI0ODA2MS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL0FycmF5Q29vcmRpbmF0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYyICswLDAgQEAKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBBcnJheUNvb3JkaW5hdGUuamF2YQotICoKLSAqIFRoaXMgZmlsZSB3YXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBXU0RMCi0gKiBieSB0aGUgQXBhY2hlIEF4aXMyIHZlcnNpb246IFNOQVBTSE9UICBCdWlsdCBvbiA6IERlYyAyMSwgMjAwNyAoMDQ6MDM6MzAgTEtUKQotICovCi0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBwYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nOwotICAgICAgICAgICAgCi0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiAgQXJyYXlDb29yZGluYXRlIGJlYW4gY2xhc3MKLSAgICAgICAgICAgICovCi0gICAgICAgIAotICAgICAgICBwdWJsaWMgIGNsYXNzIEFycmF5Q29vcmRpbmF0ZQotICAgICAgICBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCQmVhbnsKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIE1ZX1FOQU1FID0gbmV3IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUoCi0gICAgICAgICAgICAgICAgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIiwKLSAgICAgICAgICAgICAgICAiYXJyYXlDb29yZGluYXRlIiwKLSAgICAgICAgICAgICAgICAibnMxIik7Ci0KLSAgICAgICAgICAgIAotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2VuZXJhdGVQcmVmaXgoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHsKLSAgICAgICAgICAgIGlmKG5hbWVzcGFjZS5lcXVhbHMoImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIikpewotICAgICAgICAgICAgICAgIHJldHVybiAiU09BUC1FTkMiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgIH0KLQotICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIGZpZWxkIGZvciBBcnJheUNvb3JkaW5hdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIGphdmEubGFuZy5TdHJpbmcgbG9jYWxBcnJheUNvb3JkaW5hdGUgOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIGdldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljICBqYXZhLmxhbmcuU3RyaW5nIGdldEFycmF5Q29vcmRpbmF0ZSgpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbEFycmF5Q29vcmRpbmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIHNldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSBwYXJhbSBBcnJheUNvb3JkaW5hdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldEFycmF5Q29vcmRpbmF0ZShqYXZhLmxhbmcuU3RyaW5nIHBhcmFtKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYWxBcnJheUNvb3JkaW5hdGU9cGFyYW07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxBcnJheUNvb3JkaW5hdGUudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgIC8qKgotICAgICAqIGlzUmVhZGVyTVRPTUF3YXJlCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSByZWFkZXIgc3VwcG9ydHMgTVRPTQotICAgICAqLwotICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgewotICAgICAgICBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICB0cnl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBqYXZhLmxhbmcuQm9vbGVhbi5UUlVFLmVxdWFscyhyZWFkZXIuZ2V0UHJvcGVydHkob3JnLmFwYWNoZS5heGlvbS5vbS5PTUNvbnN0YW50cy5JU19EQVRBX0hBTkRMRVJTX0FXQVJFKSk7Ci0gICAgICAgIH1jYXRjaChqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlzUmVhZGVyTVRPTUF3YXJlOwotICAgfQotICAgICAKLSAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAqCi0gICAgICAgICogQHBhcmFtIHBhcmVudFFOYW1lCi0gICAgICAgICogQHBhcmFtIGZhY3RvcnkKLSAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgcHVibGljIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IGdldE9NRWxlbWVudCAoCi0gICAgICAgICAgICAgICBmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSkgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTURhdGFTb3VyY2UgZGF0YVNvdXJjZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkRhdGFTb3VyY2UodGhpcyxNWV9RTkFNRSl7Ci0KLSAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgIEFycmF5Q29vcmRpbmF0ZS50aGlzLnNlcmlhbGl6ZShNWV9RTkFNRSxmYWN0b3J5LHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5sbG9tLk9NU291cmNlZEVsZW1lbnRJbXBsKAotICAgICAgICAgICAgICAgTVlfUU5BTUUsZmFjdG9yeSxkYXRhU291cmNlKTsKLSAgICAgICAgICAgIAotICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcixmYWxzZSk7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNlcmlhbGl6ZVR5cGUpCi0gICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy9XZSBjYW4gc2FmZWx5IGFzc3VtZSBhbiBlbGVtZW50IGhhcyBvbmx5IG9uZSB0eXBlIGFzc29jaWF0ZWQgd2l0aCBpdAotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlID0gcGFyZW50UU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBsb2NhbE5hbWUgPSBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIG5hbWVzcGFjZS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHByZWZpeCwgbG9jYWxOYW1lLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQobmFtZXNwYWNlLCBsb2NhbE5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQobG9jYWxOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGQgdGhlIHR5cGUgZGV0YWlscyBpZiB0aGlzIGlzIHVzZWQgaW4gYSBzaW1wbGUgdHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXJpYWxpemVUeXBlKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlUHJlZml4ICE9IG51bGwpICYmIChuYW1lc3BhY2VQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlUHJlZml4KyI6YXJyYXlDb29yZGluYXRlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFycmF5Q29vcmRpbmF0ZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbEFycmF5Q29vcmRpbmF0ZT09bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIlZhbHVlIGNhbm5vdCBiZSBudWxsICEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhsb2NhbEFycmF5Q29vcmRpbmF0ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRoIHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCxqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgIGlmICh4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLQotICAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsIGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlTmFtZXNwYWNlID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVWYWx1ZTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBhdHRyaWJ1dGVQcmVmaXggKyAiOiIgKyBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSwgYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICBtZXRob2QgdG8gaGFuZGxlIFFuYW1lcwotICAgICAgICAgKi8KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZShqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhwcmVmaXggKyAiOiIgKyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaS5lIHRoaXMgaXMgdGhlIGRlZmF1bHQgbmFtZXNwYWNlCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lcyhqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lW10gcW5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICBpZiAocW5hbWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHRvIHN0b3JlIHRoaXMgZGF0YSB1bnRpbCBsYXN0IG1vbWVudCBzaW5jZSBpdCBpcyBub3QgcG9zc2libGUgdG8gd3JpdGUgYW55Ci0gICAgICAgICAgICAgICAgLy8gbmFtZXNwYWNlIGRhdGEgYWZ0ZXIgd3JpdGluZyB0aGUgY2hhcmFjdG9yIGRhdGEKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIHN0cmluZ1RvV3JpdGUgPSBuZXcgamF2YS5sYW5nLlN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHFuYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKCIgIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlVVJJID0gcW5hbWVzW2ldLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocHJlZml4ID09IG51bGwpIHx8IChwcmVmaXgubGVuZ3RoKCkgPT0gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChwcmVmaXgpLmFwcGVuZCgiOiIpLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHN0cmluZ1RvV3JpdGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0KLSAgICAgICAgIC8qKgotICAgICAgICAgKiBSZWdpc3RlciBhIG5hbWVzcGFjZSBwcmVmaXgKLSAgICAgICAgICovCi0gICAgICAgICBwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgcmVnaXN0ZXJQcmVmaXgoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLCBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlICh4bWxXcml0ZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gcHJlZml4OwotICAgICAgICAgICAgfQotCi0KLSAgCi0gICAgICAgIC8qKgotICAgICAgICAqIGRhdGFiaW5kaW5nIG1ldGhvZCB0byBnZXQgYW4gWE1MIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0Ci0gICAgICAgICoKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIGdldFB1bGxQYXJzZXIoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxTmFtZSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy9XZSBjYW4gc2FmZWx5IGFzc3VtZSBhbiBlbGVtZW50IGhhcyBvbmx5IG9uZSB0eXBlIGFzc29jaWF0ZWQgd2l0aCBpdAotICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlckltcGwoTVlfUU5BTUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGphdmEubGFuZy5PYmplY3RbXXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXIuRUxFTUVOVF9URVhULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxBcnJheUNvb3JkaW5hdGUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsKTsKLQotICAgICAgICB9Ci0KLSAgCi0KLSAgICAgLyoqCi0gICAgICAqICBGYWN0b3J5IGNsYXNzIHRoYXQga2VlcHMgdGhlIHBhcnNlIG1ldGhvZAotICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3Rvcnl7Ci0KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgQXJyYXlDb29yZGluYXRlIGZyb21TdHJpbmcoamF2YS5sYW5nLlN0cmluZyB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSl7Ci0gICAgICAgICAgICAgICAgICAgIEFycmF5Q29vcmRpbmF0ZSByZXR1cm5WYWx1ZSA9IG5ldyAgQXJyYXlDb29yZGluYXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlLnNldEFycmF5Q29vcmRpbmF0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyh2YWx1ZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgQXJyYXlDb29yZGluYXRlIGZyb21TdHJpbmcoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBjb250ZW50LnN1YnN0cmluZygwLGNvbnRlbnQuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVXJpID0geG1sU3RyZWFtUmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBcnJheUNvb3JkaW5hdGUuRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsbmFtZXNwYWNlVXJpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5Q29vcmRpbmF0ZS5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCwiIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIAotCi0gICAgICAgIC8qKgotICAgICAgICAqIHN0YXRpYyBtZXRob2QgdG8gY3JlYXRlIHRoZSBvYmplY3QKLSAgICAgICAgKiBQcmVjb25kaXRpb246ICBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgY3VycmVudCBvciBuZXh0IHN0YXJ0IGVsZW1lbnQgc3RhcnRzIHRoaXMgb2JqZWN0IGFuZCBhbnkgaW50ZXJ2ZW5pbmcgcmVhZGVyIGV2ZW50cyBhcmUgaWdub3JhYmxlCi0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgbm90IGFuIGVsZW1lbnQsIGl0IGlzIGEgY29tcGxleCB0eXBlIGFuZCB0aGUgcmVhZGVyIGlzIGF0IHRoZSBldmVudCBqdXN0IGFmdGVyIHRoZSBvdXRlciBzdGFydCBlbGVtZW50Ci0gICAgICAgICogUG9zdGNvbmRpdGlvbjogSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IGl0cyBlbmQgZWxlbWVudAotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIGEgY29tcGxleCB0eXBlLCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgdGhlIGVuZCBlbGVtZW50IG9mIGl0cyBvdXRlciBlbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgQXJyYXlDb29yZGluYXRlIHBhcnNlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb257Ci0gICAgICAgICAgICBBcnJheUNvb3JkaW5hdGUgb2JqZWN0ID0KLSAgICAgICAgICAgICAgICBuZXcgQXJyYXlDb29yZGluYXRlKCk7Ci0KLSAgICAgICAgICAgIGludCBldmVudDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmlsbGFibGVWYWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IiI7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZXVyaSA9IiI7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlICghcmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgJiYgIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkKLSAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gTm90ZSBhbGwgYXR0cmlidXRlcyB0aGF0IHdlcmUgaGFuZGxlZC4gVXNlZCB0byBkaWZmZXIgbm9ybWFsIGF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgICAvLyBmcm9tIGFueUF0dHJpYnV0ZXMuCi0gICAgICAgICAgICAgICAgamF2YS51dGlsLlZlY3RvciBoYW5kbGVkQXR0cmlidXRlcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUoIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQgPSByZWFkZXIuZ2V0RWxlbWVudFRleHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5zZXRBcnJheUNvb3JkaW5hdGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhjb250ZW50KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gRW5kIG9mIGlmIGZvciBleHBlY3RlZCBwcm9wZXJ0eSBzdGFydCBlbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgc3RhcnQgZWxlbWVudCB3ZSBhcmUgbm90IGV4cGVjdGluZyBpbmRpY2F0ZXMgYW4gaW52YWxpZCBwYXJhbWV0ZXIgd2FzIHBhc3NlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiVW5leHBlY3RlZCBzdWJlbGVtZW50ICIgKyByZWFkZXIuZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIGVuZCBvZiB3aGlsZSBsb29wCi0gICAgICAgICAgICAgICAgICAgICAgICAKLQotCi0KLSAgICAgICAgICAgIH0gY2F0Y2ggKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5sYW5nLkV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG9iamVjdDsKLSAgICAgICAgfQotCi0gICAgICAgIH0vL2VuZCBvZiBmYWN0b3J5IGNsYXNzCi0KLSAgICAgICAgCi0KLSAgICAgICAgfQotICAgICAgICAgICAKLSAgICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL0FycmF5RS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9BcnJheUUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY0NDg5OS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL0FycmF5RS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzgxICswLDAgQEAKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBBcnJheUUuamF2YQotICoKLSAqIFRoaXMgZmlsZSB3YXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBXU0RMCi0gKiBieSB0aGUgQXBhY2hlIEF4aXMyIHZlcnNpb246IFNOQVBTSE9UICBCdWlsdCBvbiA6IERlYyAyMSwgMjAwNyAoMDQ6MDM6MzAgTEtUKQotICovCi0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBwYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nOwotICAgICAgICAgICAgCi0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiAgQXJyYXlFIGJlYW4gY2xhc3MKLSAgICAgICAgICAgICovCi0gICAgICAgIAotICAgICAgICBwdWJsaWMgIGNsYXNzIEFycmF5RQotICAgICAgICBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCQmVhbnsKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIE1ZX1FOQU1FID0gbmV3IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUoCi0gICAgICAgICAgICAgICAgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIiwKLSAgICAgICAgICAgICAgICAiQXJyYXkiLAotICAgICAgICAgICAgICAgICJTT0FQLUVOQyIpOwotCi0gICAgICAgICAgICAKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdlbmVyYXRlUHJlZml4KGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB7Ci0gICAgICAgICAgICBpZihuYW1lc3BhY2UuZXF1YWxzKCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIpKXsKLSAgICAgICAgICAgICAgICByZXR1cm4gIlNPQVAtRU5DIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBmaWVsZCBmb3IgQXJyYXkKLSAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLkFycmF5IGxvY2FsQXJyYXkgOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIGdldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZy5BcnJheQotICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2RpbmcuQXJyYXkgZ2V0QXJyYXkoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxBcnJheTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIHNldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSBwYXJhbSBBcnJheQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0QXJyYXkob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2RpbmcuQXJyYXkgcGFyYW0pewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2FsQXJyYXk9cGFyYW07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAvKioKLSAgICAgKiBpc1JlYWRlck1UT01Bd2FyZQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVhZGVyIHN1cHBvcnRzIE1UT00KLSAgICAgKi8KLSAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKLSAgICAgICAgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICAKLSAgICAgICAgdHJ5ewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gamF2YS5sYW5nLkJvb2xlYW4uVFJVRS5lcXVhbHMocmVhZGVyLmdldFByb3BlcnR5KG9yZy5hcGFjaGUuYXhpb20ub20uT01Db25zdGFudHMuSVNfREFUQV9IQU5ETEVSU19BV0FSRSkpOwotICAgICAgICB9Y2F0Y2goamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpc1JlYWRlck1UT01Bd2FyZTsKLSAgIH0KLSAgICAgCi0gICAgIAotICAgICAgICAvKioKLSAgICAgICAgKgotICAgICAgICAqIEBwYXJhbSBwYXJlbnRRTmFtZQotICAgICAgICAqIEBwYXJhbSBmYWN0b3J5Ci0gICAgICAgICogQHJldHVybiBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudAotICAgICAgICAqLwotICAgICAgIHB1YmxpYyBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCBnZXRPTUVsZW1lbnQgKAotICAgICAgICAgICAgICAgZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnkpIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlIGRhdGFTb3VyY2UgPQotICAgICAgICAgICAgICAgICAgICAgICBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJEYXRhU291cmNlKHRoaXMsTVlfUU5BTUUpewotCi0gICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICBBcnJheUUudGhpcy5zZXJpYWxpemUoTVlfUU5BTUUsZmFjdG9yeSx4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5PTVNvdXJjZWRFbGVtZW50SW1wbCgKLSAgICAgICAgICAgICAgIE1ZX1FOQU1FLGZhY3RvcnksZGF0YVNvdXJjZSk7Ci0gICAgICAgICAgICAKLSAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIsZmFsc2UpOwotICAgICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzZXJpYWxpemVUeXBlKQotICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vV2UgY2FuIHNhZmVseSBhc3N1bWUgYW4gZWxlbWVudCBoYXMgb25seSBvbmUgdHlwZSBhc3NvY2lhdGVkIHdpdGggaXQKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbEFycmF5PT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJQcm9wZXJ0eSBjYW5ub3QgYmUgbnVsbCEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsQXJyYXkuc2VyaWFsaXplKE1ZX1FOQU1FLGZhY3RvcnkseG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGggdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgcHJlZml4LGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgaWYgKHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotCi0gICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotCi0gICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSwgamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVOYW1lc3BhY2UgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgoYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVZhbHVlOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IGF0dHJpYnV0ZVByZWZpeCArICI6IiArIHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLCBhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAvKioKLSAgICAgICAgICogIG1ldGhvZCB0byBoYW5kbGUgUW5hbWVzCi0gICAgICAgICAqLwotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHByZWZpeCArICI6IiArIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBpLmUgdGhpcyBpcyB0aGUgZGVmYXVsdCBuYW1lc3BhY2UKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVzKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWVbXSBxbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgIGlmIChxbmFtZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gc3RvcmUgdGhpcyBkYXRhIHVudGlsIGxhc3QgbW9tZW50IHNpbmNlIGl0IGlzIG5vdCBwb3NzaWJsZSB0byB3cml0ZSBhbnkKLSAgICAgICAgICAgICAgICAvLyBuYW1lc3BhY2UgZGF0YSBhZnRlciB3cml0aW5nIHRoZSBjaGFyYWN0b3IgZGF0YQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmdCdWZmZXIgc3RyaW5nVG9Xcml0ZSA9IG5ldyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcW5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQoIiAiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VVUkkgPSBxbmFtZXNbaV0uZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwcmVmaXggPT0gbnVsbCkgfHwgKHByZWZpeC5sZW5ndGgoKSA9PSAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKHByZWZpeCkuYXBwZW5kKCI6IikuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMoc3RyaW5nVG9Xcml0ZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAqIFJlZ2lzdGVyIGEgbmFtZXNwYWNlIHByZWZpeAotICAgICAgICAgKi8KLSAgICAgICAgIHByaXZhdGUgamF2YS5sYW5nLlN0cmluZyByZWdpc3RlclByZWZpeChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHhtbFdyaXRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiBwcmVmaXg7Ci0gICAgICAgICAgICB9Ci0KLQotICAKLSAgICAgICAgLyoqCi0gICAgICAgICogZGF0YWJpbmRpbmcgbWV0aG9kIHRvIGdldCBhbiBYTUwgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QKLSAgICAgICAgKgotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgZ2V0UHVsbFBhcnNlcihqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFOYW1lKQotICAgICAgICAgICAgICAgICAgICB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvL1dlIGNhbiBzYWZlbHkgYXNzdW1lIGFuIGVsZW1lbnQgaGFzIG9ubHkgb25lIHR5cGUgYXNzb2NpYXRlZCB3aXRoIGl0Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsQXJyYXkuZ2V0UHVsbFBhcnNlcihNWV9RTkFNRSk7Ci0KLSAgICAgICAgfQotCi0gIAotCi0gICAgIC8qKgotICAgICAgKiAgRmFjdG9yeSBjbGFzcyB0aGF0IGtlZXBzIHRoZSBwYXJzZSBtZXRob2QKLSAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5ewotCi0gICAgICAgIAotICAgICAgICAKLQotICAgICAgICAvKioKLSAgICAgICAgKiBzdGF0aWMgbWV0aG9kIHRvIGNyZWF0ZSB0aGUgb2JqZWN0Ci0gICAgICAgICogUHJlY29uZGl0aW9uOiAgSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIGN1cnJlbnQgb3IgbmV4dCBzdGFydCBlbGVtZW50IHN0YXJ0cyB0aGlzIG9iamVjdCBhbmQgYW55IGludGVydmVuaW5nIHJlYWRlciBldmVudHMgYXJlIGlnbm9yYWJsZQotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIG5vdCBhbiBlbGVtZW50LCBpdCBpcyBhIGNvbXBsZXggdHlwZSBhbmQgdGhlIHJlYWRlciBpcyBhdCB0aGUgZXZlbnQganVzdCBhZnRlciB0aGUgb3V0ZXIgc3RhcnQgZWxlbWVudAotICAgICAgICAqIFBvc3Rjb25kaXRpb246IElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCBpdHMgZW5kIGVsZW1lbnQKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBhIGNvbXBsZXggdHlwZSwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IHRoZSBlbmQgZWxlbWVudCBvZiBpdHMgb3V0ZXIgZWxlbWVudAotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIEFycmF5RSBwYXJzZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uewotICAgICAgICAgICAgQXJyYXlFIG9iamVjdCA9Ci0gICAgICAgICAgICAgICAgbmV3IEFycmF5RSgpOwotCi0gICAgICAgICAgICBpbnQgZXZlbnQ7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5pbGxhYmxlVmFsdWUgPSBudWxsOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSIiOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2V1cmkgPSIiOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSAoIXJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICYmICFyZWFkZXIuaXNFbmRFbGVtZW50KCkpCi0gICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIE5vdGUgYWxsIGF0dHJpYnV0ZXMgdGhhdCB3ZXJlIGhhbmRsZWQuIFVzZWQgdG8gZGlmZmVyIG5vcm1hbCBhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgICAgLy8gZnJvbSBhbnlBdHRyaWJ1dGVzLgotICAgICAgICAgICAgICAgIGphdmEudXRpbC5WZWN0b3IgaGFuZGxlZEF0dHJpYnV0ZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlKCFyZWFkZXIuaXNFbmRFbGVtZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICl7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgJiYgbmV3IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUoImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIiwiQXJyYXkiKS5lcXVhbHMocmVhZGVyLmdldE5hbWUoKSkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0QXJyYXkob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2RpbmcuQXJyYXkuRmFjdG9yeS5wYXJzZShyZWFkZXIsIEV4dGVuc2lvbk1hcHBlci5jbGFzcykpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBFbmQgb2YgaWYgZm9yIGV4cGVjdGVkIHByb3BlcnR5IHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2V7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBzdGFydCBlbGVtZW50IHdlIGFyZSBub3QgZXhwZWN0aW5nIGluZGljYXRlcyBhbiBpbnZhbGlkIHBhcmFtZXRlciB3YXMgcGFzc2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJVbmV4cGVjdGVkIHN1YmVsZW1lbnQgIiArIHJlYWRlci5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gZW5kIG9mIHdoaWxlIGxvb3AKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0KLQotICAgICAgICAgICAgfSBjYXRjaCAoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gb2JqZWN0OwotICAgICAgICB9Ci0KLSAgICAgICAgfS8vZW5kIG9mIGZhY3RvcnkgY2xhc3MKLQotICAgICAgICAKLQotICAgICAgICB9Ci0gICAgICAgICAgIAotICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvQmFzZTY0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL0Jhc2U2NC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTBkZDc5Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvQmFzZTY0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NjIgKzAsMCBAQAotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIEJhc2U2NC5qYXZhCi0gKgotICogVGhpcyBmaWxlIHdhcyBhdXRvLWdlbmVyYXRlZCBmcm9tIFdTREwKLSAqIGJ5IHRoZSBBcGFjaGUgQXhpczIgdmVyc2lvbjogU05BUFNIT1QgIEJ1aWx0IG9uIDogRGVjIDIxLCAyMDA3ICgwNDowMzozMCBMS1QpCi0gKi8KLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2Rpbmc7Ci0gICAgICAgICAgICAKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqICBCYXNlNjQgYmVhbiBjbGFzcwotICAgICAgICAgICAgKi8KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyAgY2xhc3MgQmFzZTY0Ci0gICAgICAgIGltcGxlbWVudHMgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJCZWFuewotICAgICAgICAKLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgTVlfUU5BTUUgPSBuZXcgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSgKLSAgICAgICAgICAgICAgICAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLAotICAgICAgICAgICAgICAgICJiYXNlNjQiLAotICAgICAgICAgICAgICAgICJTT0FQLUVOQyIpOwotCi0gICAgICAgICAgICAKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdlbmVyYXRlUHJlZml4KGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB7Ci0gICAgICAgICAgICBpZihuYW1lc3BhY2UuZXF1YWxzKCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIpKXsKLSAgICAgICAgICAgICAgICByZXR1cm4gIlNPQVAtRU5DIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBmaWVsZCBmb3IgQmFzZTY0Ci0gICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBqYXZheC5hY3RpdmF0aW9uLkRhdGFIYW5kbGVyIGxvY2FsQmFzZTY0IDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBnZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gamF2YXguYWN0aXZhdGlvbi5EYXRhSGFuZGxlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyAgamF2YXguYWN0aXZhdGlvbi5EYXRhSGFuZGxlciBnZXRCYXNlNjQoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxCYXNlNjQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBzZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gcGFyYW0gQmFzZTY0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRCYXNlNjQoamF2YXguYWN0aXZhdGlvbi5EYXRhSGFuZGxlciBwYXJhbSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2FsQmFzZTY0PXBhcmFtOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsQmFzZTY0LnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAvKioKLSAgICAgKiBpc1JlYWRlck1UT01Bd2FyZQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVhZGVyIHN1cHBvcnRzIE1UT00KLSAgICAgKi8KLSAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKLSAgICAgICAgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICAKLSAgICAgICAgdHJ5ewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gamF2YS5sYW5nLkJvb2xlYW4uVFJVRS5lcXVhbHMocmVhZGVyLmdldFByb3BlcnR5KG9yZy5hcGFjaGUuYXhpb20ub20uT01Db25zdGFudHMuSVNfREFUQV9IQU5ETEVSU19BV0FSRSkpOwotICAgICAgICB9Y2F0Y2goamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpc1JlYWRlck1UT01Bd2FyZTsKLSAgIH0KLSAgICAgCi0gICAgIAotICAgICAgICAvKioKLSAgICAgICAgKgotICAgICAgICAqIEBwYXJhbSBwYXJlbnRRTmFtZQotICAgICAgICAqIEBwYXJhbSBmYWN0b3J5Ci0gICAgICAgICogQHJldHVybiBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudAotICAgICAgICAqLwotICAgICAgIHB1YmxpYyBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCBnZXRPTUVsZW1lbnQgKAotICAgICAgICAgICAgICAgZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnkpIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlIGRhdGFTb3VyY2UgPQotICAgICAgICAgICAgICAgICAgICAgICBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJEYXRhU291cmNlKHRoaXMsTVlfUU5BTUUpewotCi0gICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICBCYXNlNjQudGhpcy5zZXJpYWxpemUoTVlfUU5BTUUsZmFjdG9yeSx4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5PTVNvdXJjZWRFbGVtZW50SW1wbCgKLSAgICAgICAgICAgICAgIE1ZX1FOQU1FLGZhY3RvcnksZGF0YVNvdXJjZSk7Ci0gICAgICAgICAgICAKLSAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIsZmFsc2UpOwotICAgICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzZXJpYWxpemVUeXBlKQotICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vV2UgY2FuIHNhZmVseSBhc3N1bWUgYW4gZWxlbWVudCBoYXMgb25seSBvbmUgdHlwZSBhc3NvY2lhdGVkIHdpdGggaXQKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSA9IHBhcmVudFFOYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbG9jYWxOYW1lID0gcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISBuYW1lc3BhY2UuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwcmVmaXgsIGxvY2FsTmFtZSwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KG5hbWVzcGFjZSwgbG9jYWxOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KGxvY2FsTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRkIHRoZSB0eXBlIGRldGFpbHMgaWYgdGhpcyBpcyB1c2VkIGluIGEgc2ltcGxlIHR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VyaWFsaXplVHlwZSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZVByZWZpeCAhPSBudWxsKSAmJiAobmFtZXNwYWNlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVByZWZpeCsiOmJhc2U2NCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYXNlNjQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxCYXNlNjQ9PW51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJWYWx1ZSBjYW5ub3QgYmUgbnVsbCAhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbEJhc2U2NCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotCi0gICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBwcmVmaXgsamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICBpZiAoeG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0KLSAgICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0KLSAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLCBqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZU5hbWVzcGFjZSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlVmFsdWU7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gYXR0cmlidXRlUHJlZml4ICsgIjoiICsgcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsIGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIC8qKgotICAgICAgICAgKiAgbWV0aG9kIHRvIGhhbmRsZSBRbmFtZXMKLSAgICAgICAgICovCi0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWUoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMocHJlZml4ICsgIjoiICsgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGkuZSB0aGlzIGlzIHRoZSBkZWZhdWx0IG5hbWVzcGFjZQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZXMoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZVtdIHFuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgaWYgKHFuYW1lcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBzdG9yZSB0aGlzIGRhdGEgdW50aWwgbGFzdCBtb21lbnQgc2luY2UgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHdyaXRlIGFueQotICAgICAgICAgICAgICAgIC8vIG5hbWVzcGFjZSBkYXRhIGFmdGVyIHdyaXRpbmcgdGhlIGNoYXJhY3RvciBkYXRhCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZ0J1ZmZlciBzdHJpbmdUb1dyaXRlID0gbmV3IGphdmEubGFuZy5TdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBxbmFtZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZCgiICIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVVSSSA9IHFuYW1lc1tpXS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHByZWZpeCA9PSBudWxsKSB8fCAocHJlZml4Lmxlbmd0aCgpID09IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQocHJlZml4KS5hcHBlbmQoIjoiKS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhzdHJpbmdUb1dyaXRlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotCi0gICAgICAgICAvKioKLSAgICAgICAgICogUmVnaXN0ZXIgYSBuYW1lc3BhY2UgcHJlZml4Ci0gICAgICAgICAqLwotICAgICAgICAgcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHJlZ2lzdGVyUHJlZml4KGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoeG1sV3JpdGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHByZWZpeDsKLSAgICAgICAgICAgIH0KLQotCi0gIAotICAgICAgICAvKioKLSAgICAgICAgKiBkYXRhYmluZGluZyBtZXRob2QgdG8gZ2V0IGFuIFhNTCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdAotICAgICAgICAqCi0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciBnZXRQdWxsUGFyc2VyKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcU5hbWUpCi0gICAgICAgICAgICAgICAgICAgIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vV2UgY2FuIHNhZmVseSBhc3N1bWUgYW4gZWxlbWVudCBoYXMgb25seSBvbmUgdHlwZSBhc3NvY2lhdGVkIHdpdGggaXQKLSAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXJJbXBsKE1ZX1FOQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBqYXZhLmxhbmcuT2JqZWN0W117Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVyLkVMRU1FTlRfVEVYVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsQmFzZTY0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCk7Ci0KLSAgICAgICAgfQotCi0gIAotCi0gICAgIC8qKgotICAgICAgKiAgRmFjdG9yeSBjbGFzcyB0aGF0IGtlZXBzIHRoZSBwYXJzZSBtZXRob2QKLSAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5ewotCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIEJhc2U2NCBmcm9tU3RyaW5nKGphdmEubGFuZy5TdHJpbmcgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkpewotICAgICAgICAgICAgICAgICAgICBCYXNlNjQgcmV0dXJuVmFsdWUgPSBuZXcgIEJhc2U2NCgpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZS5zZXRCYXNlNjQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9CYXNlNjRCaW5hcnkodmFsdWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIEJhc2U2NCBmcm9tU3RyaW5nKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50LmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gY29udGVudC5zdWJzdHJpbmcoMCxjb250ZW50LmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVyaSA9IHhtbFN0cmVhbVJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQmFzZTY0LkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LG5hbWVzcGFjZVVyaSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCYXNlNjQuRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsIiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAKLQotICAgICAgICAvKioKLSAgICAgICAgKiBzdGF0aWMgbWV0aG9kIHRvIGNyZWF0ZSB0aGUgb2JqZWN0Ci0gICAgICAgICogUHJlY29uZGl0aW9uOiAgSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIGN1cnJlbnQgb3IgbmV4dCBzdGFydCBlbGVtZW50IHN0YXJ0cyB0aGlzIG9iamVjdCBhbmQgYW55IGludGVydmVuaW5nIHJlYWRlciBldmVudHMgYXJlIGlnbm9yYWJsZQotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIG5vdCBhbiBlbGVtZW50LCBpdCBpcyBhIGNvbXBsZXggdHlwZSBhbmQgdGhlIHJlYWRlciBpcyBhdCB0aGUgZXZlbnQganVzdCBhZnRlciB0aGUgb3V0ZXIgc3RhcnQgZWxlbWVudAotICAgICAgICAqIFBvc3Rjb25kaXRpb246IElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCBpdHMgZW5kIGVsZW1lbnQKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBhIGNvbXBsZXggdHlwZSwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IHRoZSBlbmQgZWxlbWVudCBvZiBpdHMgb3V0ZXIgZWxlbWVudAotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIEJhc2U2NCBwYXJzZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uewotICAgICAgICAgICAgQmFzZTY0IG9iamVjdCA9Ci0gICAgICAgICAgICAgICAgbmV3IEJhc2U2NCgpOwotCi0gICAgICAgICAgICBpbnQgZXZlbnQ7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5pbGxhYmxlVmFsdWUgPSBudWxsOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSIiOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2V1cmkgPSIiOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSAoIXJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICYmICFyZWFkZXIuaXNFbmRFbGVtZW50KCkpCi0gICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIE5vdGUgYWxsIGF0dHJpYnV0ZXMgdGhhdCB3ZXJlIGhhbmRsZWQuIFVzZWQgdG8gZGlmZmVyIG5vcm1hbCBhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgICAgLy8gZnJvbSBhbnlBdHRyaWJ1dGVzLgotICAgICAgICAgICAgICAgIGphdmEudXRpbC5WZWN0b3IgaGFuZGxlZEF0dHJpYnV0ZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlKCFyZWFkZXIuaXNFbmRFbGVtZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50ID0gcmVhZGVyLmdldEVsZW1lbnRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0QmFzZTY0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9CYXNlNjRCaW5hcnkoY29udGVudCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIEVuZCBvZiBpZiBmb3IgZXhwZWN0ZWQgcHJvcGVydHkgc3RhcnQgZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHN0YXJ0IGVsZW1lbnQgd2UgYXJlIG5vdCBleHBlY3RpbmcgaW5kaWNhdGVzIGFuIGludmFsaWQgcGFyYW1ldGVyIHdhcyBwYXNzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIlVuZXhwZWN0ZWQgc3ViZWxlbWVudCAiICsgcmVhZGVyLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBlbmQgb2Ygd2hpbGUgbG9vcAotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLQotCi0gICAgICAgICAgICB9IGNhdGNoIChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEubGFuZy5FeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBvYmplY3Q7Ci0gICAgICAgIH0KLQotICAgICAgICB9Ly9lbmQgb2YgZmFjdG9yeSBjbGFzcwotCi0gICAgICAgIAotCi0gICAgICAgIH0KLSAgICAgICAgICAgCi0gICAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9CYXNlNjRCaW5hcnkuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvQmFzZTY0QmluYXJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4NzJlZjIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9CYXNlNjRCaW5hcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxMiArMCwwIEBACi0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICogQmFzZTY0QmluYXJ5LmphdmEKLSAqCi0gKiBUaGlzIGZpbGUgd2FzIGF1dG8tZ2VuZXJhdGVkIGZyb20gV1NETAotICogYnkgdGhlIEFwYWNoZSBBeGlzMiB2ZXJzaW9uOiBTTkFQU0hPVCAgQnVpbHQgb24gOiBEZWMgMjEsIDIwMDcgKDA0OjAzOjMwIExLVCkKLSAqLwotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZzsKLSAgICAgICAgICAgIAotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogIEJhc2U2NEJpbmFyeSBiZWFuIGNsYXNzCi0gICAgICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgcHVibGljICBjbGFzcyBCYXNlNjRCaW5hcnkKLSAgICAgICAgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkJlYW57Ci0gICAgICAgIC8qIFRoaXMgdHlwZSB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIHBpZWNlIG9mIHNjaGVtYSB0aGF0IGhhZAotICAgICAgICAgICAgICAgIG5hbWUgPSBiYXNlNjRCaW5hcnkKLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgVVJJID0gaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8KLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgUHJlZml4ID0gbnMxCi0gICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIAotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2VuZXJhdGVQcmVmaXgoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHsKLSAgICAgICAgICAgIGlmKG5hbWVzcGFjZS5lcXVhbHMoImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIikpewotICAgICAgICAgICAgICAgIHJldHVybiAiU09BUC1FTkMiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgIH0KLQotICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIGZpZWxkIGZvciBCYXNlNjRCaW5hcnkKLSAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIGphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXIgbG9jYWxCYXNlNjRCaW5hcnkgOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIGdldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiBqYXZheC5hY3RpdmF0aW9uLkRhdGFIYW5kbGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljICBqYXZheC5hY3RpdmF0aW9uLkRhdGFIYW5kbGVyIGdldEJhc2U2NEJpbmFyeSgpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbEJhc2U2NEJpbmFyeTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIHNldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSBwYXJhbSBCYXNlNjRCaW5hcnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldEJhc2U2NEJpbmFyeShqYXZheC5hY3RpdmF0aW9uLkRhdGFIYW5kbGVyIHBhcmFtKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2NhbEJhc2U2NEJpbmFyeT1wYXJhbTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsQmFzZTY0QmluYXJ5LnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAvKioKLSAgICAgKiBpc1JlYWRlck1UT01Bd2FyZQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVhZGVyIHN1cHBvcnRzIE1UT00KLSAgICAgKi8KLSAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKLSAgICAgICAgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICAKLSAgICAgICAgdHJ5ewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gamF2YS5sYW5nLkJvb2xlYW4uVFJVRS5lcXVhbHMocmVhZGVyLmdldFByb3BlcnR5KG9yZy5hcGFjaGUuYXhpb20ub20uT01Db25zdGFudHMuSVNfREFUQV9IQU5ETEVSU19BV0FSRSkpOwotICAgICAgICB9Y2F0Y2goamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpc1JlYWRlck1UT01Bd2FyZTsKLSAgIH0KLSAgICAgCi0gICAgIAotICAgICAgICAvKioKLSAgICAgICAgKgotICAgICAgICAqIEBwYXJhbSBwYXJlbnRRTmFtZQotICAgICAgICAqIEBwYXJhbSBmYWN0b3J5Ci0gICAgICAgICogQHJldHVybiBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudAotICAgICAgICAqLwotICAgICAgIHB1YmxpYyBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCBnZXRPTUVsZW1lbnQgKAotICAgICAgICAgICAgICAgZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnkpIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTURhdGFTb3VyY2UgZGF0YVNvdXJjZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkRhdGFTb3VyY2UodGhpcyxwYXJlbnRRTmFtZSl7Ci0KLSAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgIEJhc2U2NEJpbmFyeS50aGlzLnNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5sbG9tLk9NU291cmNlZEVsZW1lbnRJbXBsKAotICAgICAgICAgICAgICAgcGFyZW50UU5hbWUsZmFjdG9yeSxkYXRhU291cmNlKTsKLSAgICAgICAgICAgIAotICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcixmYWxzZSk7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNlcmlhbGl6ZVR5cGUpCi0gICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgCi0KLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gcGFyZW50UU5hbWUuZ2V0UHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZSA9IHBhcmVudFFOYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlICE9IG51bGwpICYmIChuYW1lc3BhY2UudHJpbSgpLmxlbmd0aCgpID4gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgd3JpdGVyUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdyaXRlclByZWZpeCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KG5hbWVzcGFjZSwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocHJlZml4LCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgaWYgKHNlcmlhbGl6ZVR5cGUpewotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIik7Ci0gICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2VQcmVmaXggIT0gbnVsbCkgJiYgKG5hbWVzcGFjZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlUHJlZml4KyI6YmFzZTY0QmluYXJ5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFzZTY0QmluYXJ5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbEJhc2U2NEJpbmFyeSE9bnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZURhdGFIYW5kbGVyKGxvY2FsQmFzZTY0QmluYXJ5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGggdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgcHJlZml4LGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgaWYgKHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotCi0gICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotCi0gICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSwgamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVOYW1lc3BhY2UgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgoYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVZhbHVlOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IGF0dHJpYnV0ZVByZWZpeCArICI6IiArIHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLCBhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAvKioKLSAgICAgICAgICogIG1ldGhvZCB0byBoYW5kbGUgUW5hbWVzCi0gICAgICAgICAqLwotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHByZWZpeCArICI6IiArIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBpLmUgdGhpcyBpcyB0aGUgZGVmYXVsdCBuYW1lc3BhY2UKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVzKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWVbXSBxbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgIGlmIChxbmFtZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gc3RvcmUgdGhpcyBkYXRhIHVudGlsIGxhc3QgbW9tZW50IHNpbmNlIGl0IGlzIG5vdCBwb3NzaWJsZSB0byB3cml0ZSBhbnkKLSAgICAgICAgICAgICAgICAvLyBuYW1lc3BhY2UgZGF0YSBhZnRlciB3cml0aW5nIHRoZSBjaGFyYWN0b3IgZGF0YQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmdCdWZmZXIgc3RyaW5nVG9Xcml0ZSA9IG5ldyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcW5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQoIiAiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VVUkkgPSBxbmFtZXNbaV0uZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwcmVmaXggPT0gbnVsbCkgfHwgKHByZWZpeC5sZW5ndGgoKSA9PSAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKHByZWZpeCkuYXBwZW5kKCI6IikuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMoc3RyaW5nVG9Xcml0ZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAqIFJlZ2lzdGVyIGEgbmFtZXNwYWNlIHByZWZpeAotICAgICAgICAgKi8KLSAgICAgICAgIHByaXZhdGUgamF2YS5sYW5nLlN0cmluZyByZWdpc3RlclByZWZpeChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHhtbFdyaXRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiBwcmVmaXg7Ci0gICAgICAgICAgICB9Ci0KLQotICAKLSAgICAgICAgLyoqCi0gICAgICAgICogZGF0YWJpbmRpbmcgbWV0aG9kIHRvIGdldCBhbiBYTUwgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QKLSAgICAgICAgKgotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgZ2V0UHVsbFBhcnNlcihqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFOYW1lKQotICAgICAgICAgICAgICAgICAgICB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBlbGVtZW50TGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgYXR0cmliTGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlci5FTEVNRU5UX1RFWFQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQobG9jYWxCYXNlNjRCaW5hcnkpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlckltcGwocU5hbWUsIGVsZW1lbnRMaXN0LnRvQXJyYXkoKSwgYXR0cmliTGlzdC50b0FycmF5KCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgCi0KLSAgICAgLyoqCi0gICAgICAqICBGYWN0b3J5IGNsYXNzIHRoYXQga2VlcHMgdGhlIHBhcnNlIG1ldGhvZAotICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3Rvcnl7Ci0KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgQmFzZTY0QmluYXJ5IGZyb21TdHJpbmcoamF2YS5sYW5nLlN0cmluZyB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSl7Ci0gICAgICAgICAgICAgICAgICAgIEJhc2U2NEJpbmFyeSByZXR1cm5WYWx1ZSA9IG5ldyAgQmFzZTY0QmluYXJ5KCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlLnNldEJhc2U2NEJpbmFyeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb0Jhc2U2NEJpbmFyeSh2YWx1ZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgQmFzZTY0QmluYXJ5IGZyb21TdHJpbmcoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBjb250ZW50LnN1YnN0cmluZygwLGNvbnRlbnQuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVXJpID0geG1sU3RyZWFtUmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCYXNlNjRCaW5hcnkuRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsbmFtZXNwYWNlVXJpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJhc2U2NEJpbmFyeS5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCwiIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIAotCi0gICAgICAgIC8qKgotICAgICAgICAqIHN0YXRpYyBtZXRob2QgdG8gY3JlYXRlIHRoZSBvYmplY3QKLSAgICAgICAgKiBQcmVjb25kaXRpb246ICBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgY3VycmVudCBvciBuZXh0IHN0YXJ0IGVsZW1lbnQgc3RhcnRzIHRoaXMgb2JqZWN0IGFuZCBhbnkgaW50ZXJ2ZW5pbmcgcmVhZGVyIGV2ZW50cyBhcmUgaWdub3JhYmxlCi0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgbm90IGFuIGVsZW1lbnQsIGl0IGlzIGEgY29tcGxleCB0eXBlIGFuZCB0aGUgcmVhZGVyIGlzIGF0IHRoZSBldmVudCBqdXN0IGFmdGVyIHRoZSBvdXRlciBzdGFydCBlbGVtZW50Ci0gICAgICAgICogUG9zdGNvbmRpdGlvbjogSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IGl0cyBlbmQgZWxlbWVudAotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIGEgY29tcGxleCB0eXBlLCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgdGhlIGVuZCBlbGVtZW50IG9mIGl0cyBvdXRlciBlbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgQmFzZTY0QmluYXJ5IHBhcnNlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb257Ci0gICAgICAgICAgICBCYXNlNjRCaW5hcnkgb2JqZWN0ID0KLSAgICAgICAgICAgICAgICBuZXcgQmFzZTY0QmluYXJ5KCk7Ci0KLSAgICAgICAgICAgIGludCBldmVudDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmlsbGFibGVWYWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IiI7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZXVyaSA9IiI7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlICghcmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgJiYgIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkKLSAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIpIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgZnVsbFR5cGVOYW1lID0gcmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAidHlwZSIpOwotICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNQcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZygwLGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gbnNQcmVmaXg9PW51bGw/IiI6bnNQcmVmaXg7Ci0KLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB0eXBlID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZyhmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKzEpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISJiYXNlNjRCaW5hcnkiLmVxdWFscyh0eXBlKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZmluZCBuYW1lc3BhY2UgZm9yIHRoZSBwcmVmaXgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1VyaSA9IHJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKG5zUHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChCYXNlNjRCaW5hcnkpb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2RpbmcuRXh0ZW5zaW9uTWFwcGVyLmdldFR5cGVPYmplY3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNVcmksdHlwZSxyZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gTm90ZSBhbGwgYXR0cmlidXRlcyB0aGF0IHdlcmUgaGFuZGxlZC4gVXNlZCB0byBkaWZmZXIgbm9ybWFsIGF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgICAvLyBmcm9tIGFueUF0dHJpYnV0ZXMuCi0gICAgICAgICAgICAgICAgamF2YS51dGlsLlZlY3RvciBoYW5kbGVkQXR0cmlidXRlcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUoIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNSZWFkZXJNVE9NQXdhcmUocmVhZGVyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuQm9vbGVhbi5UUlVFLmVxdWFscyhyZWFkZXIuZ2V0UHJvcGVydHkob3JnLmFwYWNoZS5heGlvbS5vbS5PTUNvbnN0YW50cy5JU19CSU5BUlkpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL01UT00gYXdhcmUgcmVhZGVyIC0gZ2V0IHRoZSBkYXRhaGFuZGxlciBkaXJlY3RseSBhbmQgcHV0IGl0IGluIHRoZSBvYmplY3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0QmFzZTY0QmluYXJ5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXIpIHJlYWRlci5nZXRQcm9wZXJ0eShvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQ29uc3RhbnRzLkRBVEFfSEFORExFUikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmdldEV2ZW50VHlwZSgpID09IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtQ29uc3RhbnRzLlNUQVJUX0VMRU1FTlQgJiYgcmVhZGVyLmdldE5hbWUoKS5lcXVhbHMobmV3IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUob3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLk1UT01Db25zdGFudHMuWE9QX05BTUVTUEFDRV9VUkksIG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5NVE9NQ29uc3RhbnRzLlhPUF9JTkNMVURFKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGlkID0gb3JnLmFwYWNoZS5heGlvbS5vbS51dGlsLkVsZW1lbnRIZWxwZXIuZ2V0Q29udGVudElEKHJlYWRlciwgIlVURi04Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5zZXRCYXNlNjRCaW5hcnkoKChvcmcuYXBhY2hlLmF4aW9tLnNvYXAuaW1wbC5idWlsZGVyLk1UT01TdEFYU09BUE1vZGVsQnVpbGRlcikgKChvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5PTVN0QVhXcmFwcGVyKSByZWFkZXIpLmdldEJ1aWxkZXIoKSkuZ2V0RGF0YUhhbmRsZXIoaWQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmKHJlYWRlci5oYXNUZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9EbyB0aGUgdXN1YWwgY29udmVyc2lvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQgPSByZWFkZXIuZ2V0VGV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0QmFzZTY0QmluYXJ5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9CYXNlNjRCaW5hcnkoY29udGVudCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gRW5kIG9mIGlmIGZvciBleHBlY3RlZCBwcm9wZXJ0eSBzdGFydCBlbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgc3RhcnQgZWxlbWVudCB3ZSBhcmUgbm90IGV4cGVjdGluZyBpbmRpY2F0ZXMgYW4gaW52YWxpZCBwYXJhbWV0ZXIgd2FzIHBhc3NlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiVW5leHBlY3RlZCBzdWJlbGVtZW50ICIgKyByZWFkZXIuZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIGVuZCBvZiB3aGlsZSBsb29wCi0gICAgICAgICAgICAgICAgICAgICAgICAKLQotCi0KLSAgICAgICAgICAgIH0gY2F0Y2ggKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5sYW5nLkV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG9iamVjdDsKLSAgICAgICAgfQotCi0gICAgICAgIH0vL2VuZCBvZiBmYWN0b3J5IGNsYXNzCi0KLSAgICAgICAgCi0KLSAgICAgICAgfQotICAgICAgICAgICAKLSAgICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL0RhdGUuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvRGF0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzkyN2U0Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvRGF0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAzICswLDAgQEAKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBEYXRlLmphdmEKLSAqCi0gKiBUaGlzIGZpbGUgd2FzIGF1dG8tZ2VuZXJhdGVkIGZyb20gV1NETAotICogYnkgdGhlIEFwYWNoZSBBeGlzMiB2ZXJzaW9uOiBTTkFQU0hPVCAgQnVpbHQgb24gOiBEZWMgMjEsIDIwMDcgKDA0OjAzOjMwIExLVCkKLSAqLwotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZzsKLSAgICAgICAgICAgIAotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogIERhdGUgYmVhbiBjbGFzcwotICAgICAgICAgICAgKi8KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyAgY2xhc3MgRGF0ZQotICAgICAgICBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCQmVhbnsKLSAgICAgICAgLyogVGhpcyB0eXBlIHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgcGllY2Ugb2Ygc2NoZW1hIHRoYXQgaGFkCi0gICAgICAgICAgICAgICAgbmFtZSA9IGRhdGUKLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgVVJJID0gaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8KLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgUHJlZml4ID0gbnMxCi0gICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIAotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2VuZXJhdGVQcmVmaXgoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHsKLSAgICAgICAgICAgIGlmKG5hbWVzcGFjZS5lcXVhbHMoImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIikpewotICAgICAgICAgICAgICAgIHJldHVybiAiU09BUC1FTkMiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgIH0KLQotICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIGZpZWxkIGZvciBEYXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBqYXZhLnV0aWwuRGF0ZSBsb2NhbERhdGUgOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIGdldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiBqYXZhLnV0aWwuRGF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyAgamF2YS51dGlsLkRhdGUgZ2V0RGF0ZSgpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbERhdGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBzZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gcGFyYW0gRGF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0RGF0ZShqYXZhLnV0aWwuRGF0ZSBwYXJhbSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYWxEYXRlPXBhcmFtOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxEYXRlLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAvKioKLSAgICAgKiBpc1JlYWRlck1UT01Bd2FyZQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVhZGVyIHN1cHBvcnRzIE1UT00KLSAgICAgKi8KLSAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKLSAgICAgICAgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICAKLSAgICAgICAgdHJ5ewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gamF2YS5sYW5nLkJvb2xlYW4uVFJVRS5lcXVhbHMocmVhZGVyLmdldFByb3BlcnR5KG9yZy5hcGFjaGUuYXhpb20ub20uT01Db25zdGFudHMuSVNfREFUQV9IQU5ETEVSU19BV0FSRSkpOwotICAgICAgICB9Y2F0Y2goamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpc1JlYWRlck1UT01Bd2FyZTsKLSAgIH0KLSAgICAgCi0gICAgIAotICAgICAgICAvKioKLSAgICAgICAgKgotICAgICAgICAqIEBwYXJhbSBwYXJlbnRRTmFtZQotICAgICAgICAqIEBwYXJhbSBmYWN0b3J5Ci0gICAgICAgICogQHJldHVybiBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudAotICAgICAgICAqLwotICAgICAgIHB1YmxpYyBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCBnZXRPTUVsZW1lbnQgKAotICAgICAgICAgICAgICAgZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnkpIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTURhdGFTb3VyY2UgZGF0YVNvdXJjZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkRhdGFTb3VyY2UodGhpcyxwYXJlbnRRTmFtZSl7Ci0KLSAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgIERhdGUudGhpcy5zZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5PTVNvdXJjZWRFbGVtZW50SW1wbCgKLSAgICAgICAgICAgICAgIHBhcmVudFFOYW1lLGZhY3RvcnksZGF0YVNvdXJjZSk7Ci0gICAgICAgICAgICAKLSAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIsZmFsc2UpOwotICAgICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzZXJpYWxpemVUeXBlKQotICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotCi0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UgPSBudWxsOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHBhcmVudFFOYW1lLmdldFByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UgPSBwYXJlbnRRTmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZSAhPSBudWxsKSAmJiAobmFtZXNwYWNlLnRyaW0oKS5sZW5ndGgoKSA+IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHdyaXRlclByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3cml0ZXJQcmVmaXggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChuYW1lc3BhY2UsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHByZWZpeCwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCksIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIGlmIChzZXJpYWxpemVUeXBlKXsKLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIpOwotICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlUHJlZml4ICE9IG51bGwpICYmIChuYW1lc3BhY2VQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkpewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVByZWZpeCsiOmRhdGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsRGF0ZT09bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgdGhlIG5pbCBhdHRyaWJ1dGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJkYXRlIGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsRGF0ZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGggdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgcHJlZml4LGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgaWYgKHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotCi0gICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotCi0gICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSwgamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVOYW1lc3BhY2UgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgoYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVZhbHVlOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IGF0dHJpYnV0ZVByZWZpeCArICI6IiArIHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLCBhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAvKioKLSAgICAgICAgICogIG1ldGhvZCB0byBoYW5kbGUgUW5hbWVzCi0gICAgICAgICAqLwotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHByZWZpeCArICI6IiArIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBpLmUgdGhpcyBpcyB0aGUgZGVmYXVsdCBuYW1lc3BhY2UKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVzKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWVbXSBxbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgIGlmIChxbmFtZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gc3RvcmUgdGhpcyBkYXRhIHVudGlsIGxhc3QgbW9tZW50IHNpbmNlIGl0IGlzIG5vdCBwb3NzaWJsZSB0byB3cml0ZSBhbnkKLSAgICAgICAgICAgICAgICAvLyBuYW1lc3BhY2UgZGF0YSBhZnRlciB3cml0aW5nIHRoZSBjaGFyYWN0b3IgZGF0YQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmdCdWZmZXIgc3RyaW5nVG9Xcml0ZSA9IG5ldyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcW5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQoIiAiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VVUkkgPSBxbmFtZXNbaV0uZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwcmVmaXggPT0gbnVsbCkgfHwgKHByZWZpeC5sZW5ndGgoKSA9PSAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKHByZWZpeCkuYXBwZW5kKCI6IikuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMoc3RyaW5nVG9Xcml0ZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAqIFJlZ2lzdGVyIGEgbmFtZXNwYWNlIHByZWZpeAotICAgICAgICAgKi8KLSAgICAgICAgIHByaXZhdGUgamF2YS5sYW5nLlN0cmluZyByZWdpc3RlclByZWZpeChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHhtbFdyaXRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiBwcmVmaXg7Ci0gICAgICAgICAgICB9Ci0KLQotICAKLSAgICAgICAgLyoqCi0gICAgICAgICogZGF0YWJpbmRpbmcgbWV0aG9kIHRvIGdldCBhbiBYTUwgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QKLSAgICAgICAgKgotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgZ2V0UHVsbFBhcnNlcihqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFOYW1lKQotICAgICAgICAgICAgICAgICAgICB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBlbGVtZW50TGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgYXR0cmliTGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVyLkVMRU1FTlRfVEVYVCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxEYXRlICE9IG51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbERhdGUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiZGF0ZSBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlckltcGwocU5hbWUsIGVsZW1lbnRMaXN0LnRvQXJyYXkoKSwgYXR0cmliTGlzdC50b0FycmF5KCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgCi0KLSAgICAgLyoqCi0gICAgICAqICBGYWN0b3J5IGNsYXNzIHRoYXQga2VlcHMgdGhlIHBhcnNlIG1ldGhvZAotICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3Rvcnl7Ci0KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgRGF0ZSBmcm9tU3RyaW5nKGphdmEubGFuZy5TdHJpbmcgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkpewotICAgICAgICAgICAgICAgICAgICBEYXRlIHJldHVyblZhbHVlID0gbmV3ICBEYXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlLnNldERhdGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9EYXRlKHZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBEYXRlIGZyb21TdHJpbmcoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBjb250ZW50LnN1YnN0cmluZygwLGNvbnRlbnQuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVXJpID0geG1sU3RyZWFtUmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBEYXRlLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LG5hbWVzcGFjZVVyaSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBEYXRlLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LCIiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgCi0KLSAgICAgICAgLyoqCi0gICAgICAgICogc3RhdGljIG1ldGhvZCB0byBjcmVhdGUgdGhlIG9iamVjdAotICAgICAgICAqIFByZWNvbmRpdGlvbjogIElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSBjdXJyZW50IG9yIG5leHQgc3RhcnQgZWxlbWVudCBzdGFydHMgdGhpcyBvYmplY3QgYW5kIGFueSBpbnRlcnZlbmluZyByZWFkZXIgZXZlbnRzIGFyZSBpZ25vcmFibGUKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBub3QgYW4gZWxlbWVudCwgaXQgaXMgYSBjb21wbGV4IHR5cGUgYW5kIHRoZSByZWFkZXIgaXMgYXQgdGhlIGV2ZW50IGp1c3QgYWZ0ZXIgdGhlIG91dGVyIHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgKiBQb3N0Y29uZGl0aW9uOiBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgaXRzIGVuZCBlbGVtZW50Ci0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgYSBjb21wbGV4IHR5cGUsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCB0aGUgZW5kIGVsZW1lbnQgb2YgaXRzIG91dGVyIGVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBEYXRlIHBhcnNlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb257Ci0gICAgICAgICAgICBEYXRlIG9iamVjdCA9Ci0gICAgICAgICAgICAgICAgbmV3IERhdGUoKTsKLQotICAgICAgICAgICAgaW50IGV2ZW50OwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuaWxsYWJsZVZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0iIjsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNldXJpID0iIjsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUgKCFyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAmJiAhcmVhZGVyLmlzRW5kRWxlbWVudCgpKQotICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIikhPW51bGwpewotICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBmdWxsVHlwZU5hbWUgPSByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIik7Ci0gICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1ByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKDAsZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBuc1ByZWZpeD09bnVsbD8iIjpuc1ByZWZpeDsKLQotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHR5cGUgPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikrMSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghImRhdGUiLmVxdWFscyh0eXBlKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZmluZCBuYW1lc3BhY2UgZm9yIHRoZSBwcmVmaXgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1VyaSA9IHJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKG5zUHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChEYXRlKW9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLkV4dGVuc2lvbk1hcHBlci5nZXRUeXBlT2JqZWN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zVXJpLHR5cGUscmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIE5vdGUgYWxsIGF0dHJpYnV0ZXMgdGhhdCB3ZXJlIGhhbmRsZWQuIFVzZWQgdG8gZGlmZmVyIG5vcm1hbCBhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgICAgLy8gZnJvbSBhbnlBdHRyaWJ1dGVzLgotICAgICAgICAgICAgICAgIGphdmEudXRpbC5WZWN0b3IgaGFuZGxlZEF0dHJpYnV0ZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlKCFyZWFkZXIuaXNFbmRFbGVtZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50ID0gcmVhZGVyLmdldEVsZW1lbnRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0RGF0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvRGF0ZShjb250ZW50KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gRW5kIG9mIGlmIGZvciBleHBlY3RlZCBwcm9wZXJ0eSBzdGFydCBlbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgc3RhcnQgZWxlbWVudCB3ZSBhcmUgbm90IGV4cGVjdGluZyBpbmRpY2F0ZXMgYW4gaW52YWxpZCBwYXJhbWV0ZXIgd2FzIHBhc3NlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiVW5leHBlY3RlZCBzdWJlbGVtZW50ICIgKyByZWFkZXIuZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIGVuZCBvZiB3aGlsZSBsb29wCi0gICAgICAgICAgICAgICAgICAgICAgICAKLQotCi0KLSAgICAgICAgICAgIH0gY2F0Y2ggKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5sYW5nLkV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG9iamVjdDsKLSAgICAgICAgfQotCi0gICAgICAgIH0vL2VuZCBvZiBmYWN0b3J5IGNsYXNzCi0KLSAgICAgICAgCi0KLSAgICAgICAgfQotICAgICAgICAgICAKLSAgICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL0RhdGVUaW1lLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL0RhdGVUaW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3ZjQ4MDcuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9EYXRlVGltZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAzICswLDAgQEAKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBEYXRlVGltZS5qYXZhCi0gKgotICogVGhpcyBmaWxlIHdhcyBhdXRvLWdlbmVyYXRlZCBmcm9tIFdTREwKLSAqIGJ5IHRoZSBBcGFjaGUgQXhpczIgdmVyc2lvbjogU05BUFNIT1QgIEJ1aWx0IG9uIDogRGVjIDIxLCAyMDA3ICgwNDowMzozMCBMS1QpCi0gKi8KLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2Rpbmc7Ci0gICAgICAgICAgICAKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqICBEYXRlVGltZSBiZWFuIGNsYXNzCi0gICAgICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgcHVibGljICBjbGFzcyBEYXRlVGltZQotICAgICAgICBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCQmVhbnsKLSAgICAgICAgLyogVGhpcyB0eXBlIHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgcGllY2Ugb2Ygc2NoZW1hIHRoYXQgaGFkCi0gICAgICAgICAgICAgICAgbmFtZSA9IGRhdGVUaW1lCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFVSSSA9IGh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFByZWZpeCA9IG5zMQotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdlbmVyYXRlUHJlZml4KGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB7Ci0gICAgICAgICAgICBpZihuYW1lc3BhY2UuZXF1YWxzKCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIpKXsKLSAgICAgICAgICAgICAgICByZXR1cm4gIlNPQVAtRU5DIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBmaWVsZCBmb3IgRGF0ZVRpbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIGphdmEudXRpbC5DYWxlbmRhciBsb2NhbERhdGVUaW1lIDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBnZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gamF2YS51dGlsLkNhbGVuZGFyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljICBqYXZhLnV0aWwuQ2FsZW5kYXIgZ2V0RGF0ZVRpbWUoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxEYXRlVGltZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIHNldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSBwYXJhbSBEYXRlVGltZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0RGF0ZVRpbWUoamF2YS51dGlsLkNhbGVuZGFyIHBhcmFtKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2NhbERhdGVUaW1lPXBhcmFtOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxEYXRlVGltZS50b1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgLyoqCi0gICAgICogaXNSZWFkZXJNVE9NQXdhcmUKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlYWRlciBzdXBwb3J0cyBNVE9NCi0gICAgICovCi0gICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIHRyeXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGphdmEubGFuZy5Cb29sZWFuLlRSVUUuZXF1YWxzKHJlYWRlci5nZXRQcm9wZXJ0eShvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQ29uc3RhbnRzLklTX0RBVEFfSEFORExFUlNfQVdBUkUpKTsKLSAgICAgICAgfWNhdGNoKGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXNSZWFkZXJNVE9NQXdhcmU7Ci0gICB9Ci0gICAgIAotICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICoKLSAgICAgICAgKiBAcGFyYW0gcGFyZW50UU5hbWUKLSAgICAgICAgKiBAcGFyYW0gZmFjdG9yeQotICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICBwdWJsaWMgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgZ2V0T01FbGVtZW50ICgKLSAgICAgICAgICAgICAgIGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5KSB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlIGRhdGFTb3VyY2UgPQotICAgICAgICAgICAgICAgICAgICAgICBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJEYXRhU291cmNlKHRoaXMscGFyZW50UU5hbWUpewotCi0gICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICBEYXRlVGltZS50aGlzLnNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5sbG9tLk9NU291cmNlZEVsZW1lbnRJbXBsKAotICAgICAgICAgICAgICAgcGFyZW50UU5hbWUsZmFjdG9yeSxkYXRhU291cmNlKTsKLSAgICAgICAgICAgIAotICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcixmYWxzZSk7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNlcmlhbGl6ZVR5cGUpCi0gICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgCi0KLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gcGFyZW50UU5hbWUuZ2V0UHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZSA9IHBhcmVudFFOYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlICE9IG51bGwpICYmIChuYW1lc3BhY2UudHJpbSgpLmxlbmd0aCgpID4gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgd3JpdGVyUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdyaXRlclByZWZpeCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KG5hbWVzcGFjZSwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocHJlZml4LCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgaWYgKHNlcmlhbGl6ZVR5cGUpewotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIik7Ci0gICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2VQcmVmaXggIT0gbnVsbCkgJiYgKG5hbWVzcGFjZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlUHJlZml4KyI6ZGF0ZVRpbWUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRlVGltZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbERhdGVUaW1lPT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZSB0aGUgbmlsIGF0dHJpYnV0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oImRhdGVUaW1lIGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsRGF0ZVRpbWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRoIHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCxqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgIGlmICh4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLQotICAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsIGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlTmFtZXNwYWNlID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVWYWx1ZTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBhdHRyaWJ1dGVQcmVmaXggKyAiOiIgKyBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSwgYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICBtZXRob2QgdG8gaGFuZGxlIFFuYW1lcwotICAgICAgICAgKi8KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZShqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhwcmVmaXggKyAiOiIgKyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaS5lIHRoaXMgaXMgdGhlIGRlZmF1bHQgbmFtZXNwYWNlCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lcyhqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lW10gcW5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICBpZiAocW5hbWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHRvIHN0b3JlIHRoaXMgZGF0YSB1bnRpbCBsYXN0IG1vbWVudCBzaW5jZSBpdCBpcyBub3QgcG9zc2libGUgdG8gd3JpdGUgYW55Ci0gICAgICAgICAgICAgICAgLy8gbmFtZXNwYWNlIGRhdGEgYWZ0ZXIgd3JpdGluZyB0aGUgY2hhcmFjdG9yIGRhdGEKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIHN0cmluZ1RvV3JpdGUgPSBuZXcgamF2YS5sYW5nLlN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHFuYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKCIgIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlVVJJID0gcW5hbWVzW2ldLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocHJlZml4ID09IG51bGwpIHx8IChwcmVmaXgubGVuZ3RoKCkgPT0gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChwcmVmaXgpLmFwcGVuZCgiOiIpLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHN0cmluZ1RvV3JpdGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0KLSAgICAgICAgIC8qKgotICAgICAgICAgKiBSZWdpc3RlciBhIG5hbWVzcGFjZSBwcmVmaXgKLSAgICAgICAgICovCi0gICAgICAgICBwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgcmVnaXN0ZXJQcmVmaXgoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLCBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlICh4bWxXcml0ZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gcHJlZml4OwotICAgICAgICAgICAgfQotCi0KLSAgCi0gICAgICAgIC8qKgotICAgICAgICAqIGRhdGFiaW5kaW5nIG1ldGhvZCB0byBnZXQgYW4gWE1MIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0Ci0gICAgICAgICoKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIGdldFB1bGxQYXJzZXIoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxTmFtZSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgZWxlbWVudExpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGF0dHJpYkxpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlci5FTEVNRU5UX1RFWFQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsRGF0ZVRpbWUgIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsRGF0ZVRpbWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiZGF0ZVRpbWUgY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXJJbXBsKHFOYW1lLCBlbGVtZW50TGlzdC50b0FycmF5KCksIGF0dHJpYkxpc3QudG9BcnJheSgpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gIAotCi0gICAgIC8qKgotICAgICAgKiAgRmFjdG9yeSBjbGFzcyB0aGF0IGtlZXBzIHRoZSBwYXJzZSBtZXRob2QKLSAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5ewotCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIERhdGVUaW1lIGZyb21TdHJpbmcoamF2YS5sYW5nLlN0cmluZyB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSl7Ci0gICAgICAgICAgICAgICAgICAgIERhdGVUaW1lIHJldHVyblZhbHVlID0gbmV3ICBEYXRlVGltZSgpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZS5zZXREYXRlVGltZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb0RhdGVUaW1lKHZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBEYXRlVGltZSBmcm9tU3RyaW5nKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50LmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gY29udGVudC5zdWJzdHJpbmcoMCxjb250ZW50LmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVyaSA9IHhtbFN0cmVhbVJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRGF0ZVRpbWUuRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsbmFtZXNwYWNlVXJpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERhdGVUaW1lLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LCIiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgCi0KLSAgICAgICAgLyoqCi0gICAgICAgICogc3RhdGljIG1ldGhvZCB0byBjcmVhdGUgdGhlIG9iamVjdAotICAgICAgICAqIFByZWNvbmRpdGlvbjogIElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSBjdXJyZW50IG9yIG5leHQgc3RhcnQgZWxlbWVudCBzdGFydHMgdGhpcyBvYmplY3QgYW5kIGFueSBpbnRlcnZlbmluZyByZWFkZXIgZXZlbnRzIGFyZSBpZ25vcmFibGUKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBub3QgYW4gZWxlbWVudCwgaXQgaXMgYSBjb21wbGV4IHR5cGUgYW5kIHRoZSByZWFkZXIgaXMgYXQgdGhlIGV2ZW50IGp1c3QgYWZ0ZXIgdGhlIG91dGVyIHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgKiBQb3N0Y29uZGl0aW9uOiBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgaXRzIGVuZCBlbGVtZW50Ci0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgYSBjb21wbGV4IHR5cGUsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCB0aGUgZW5kIGVsZW1lbnQgb2YgaXRzIG91dGVyIGVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBEYXRlVGltZSBwYXJzZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uewotICAgICAgICAgICAgRGF0ZVRpbWUgb2JqZWN0ID0KLSAgICAgICAgICAgICAgICBuZXcgRGF0ZVRpbWUoKTsKLQotICAgICAgICAgICAgaW50IGV2ZW50OwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuaWxsYWJsZVZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0iIjsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNldXJpID0iIjsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUgKCFyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAmJiAhcmVhZGVyLmlzRW5kRWxlbWVudCgpKQotICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIikhPW51bGwpewotICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBmdWxsVHlwZU5hbWUgPSByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIik7Ci0gICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1ByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKDAsZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBuc1ByZWZpeD09bnVsbD8iIjpuc1ByZWZpeDsKLQotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHR5cGUgPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikrMSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghImRhdGVUaW1lIi5lcXVhbHModHlwZSkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2ZpbmQgbmFtZXNwYWNlIGZvciB0aGUgcHJlZml4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNVcmkgPSByZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShuc1ByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoRGF0ZVRpbWUpb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2RpbmcuRXh0ZW5zaW9uTWFwcGVyLmdldFR5cGVPYmplY3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNVcmksdHlwZSxyZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gTm90ZSBhbGwgYXR0cmlidXRlcyB0aGF0IHdlcmUgaGFuZGxlZC4gVXNlZCB0byBkaWZmZXIgbm9ybWFsIGF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgICAvLyBmcm9tIGFueUF0dHJpYnV0ZXMuCi0gICAgICAgICAgICAgICAgamF2YS51dGlsLlZlY3RvciBoYW5kbGVkQXR0cmlidXRlcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUoIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQgPSByZWFkZXIuZ2V0RWxlbWVudFRleHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5zZXREYXRlVGltZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvRGF0ZVRpbWUoY29udGVudCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIEVuZCBvZiBpZiBmb3IgZXhwZWN0ZWQgcHJvcGVydHkgc3RhcnQgZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHN0YXJ0IGVsZW1lbnQgd2UgYXJlIG5vdCBleHBlY3RpbmcgaW5kaWNhdGVzIGFuIGludmFsaWQgcGFyYW1ldGVyIHdhcyBwYXNzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIlVuZXhwZWN0ZWQgc3ViZWxlbWVudCAiICsgcmVhZGVyLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBlbmQgb2Ygd2hpbGUgbG9vcAotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLQotCi0gICAgICAgICAgICB9IGNhdGNoIChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEubGFuZy5FeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBvYmplY3Q7Ci0gICAgICAgIH0KLQotICAgICAgICB9Ly9lbmQgb2YgZmFjdG9yeSBjbGFzcwotCi0gICAgICAgIAotCi0gICAgICAgIH0KLSAgICAgICAgICAgCi0gICAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9EZWNpbWFsLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL0RlY2ltYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2QyZTA2Mi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL0RlY2ltYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwMyArMCwwIEBACi0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICogRGVjaW1hbC5qYXZhCi0gKgotICogVGhpcyBmaWxlIHdhcyBhdXRvLWdlbmVyYXRlZCBmcm9tIFdTREwKLSAqIGJ5IHRoZSBBcGFjaGUgQXhpczIgdmVyc2lvbjogU05BUFNIT1QgIEJ1aWx0IG9uIDogRGVjIDIxLCAyMDA3ICgwNDowMzozMCBMS1QpCi0gKi8KLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2Rpbmc7Ci0gICAgICAgICAgICAKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqICBEZWNpbWFsIGJlYW4gY2xhc3MKLSAgICAgICAgICAgICovCi0gICAgICAgIAotICAgICAgICBwdWJsaWMgIGNsYXNzIERlY2ltYWwKLSAgICAgICAgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkJlYW57Ci0gICAgICAgIC8qIFRoaXMgdHlwZSB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIHBpZWNlIG9mIHNjaGVtYSB0aGF0IGhhZAotICAgICAgICAgICAgICAgIG5hbWUgPSBkZWNpbWFsCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFVSSSA9IGh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFByZWZpeCA9IG5zMQotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdlbmVyYXRlUHJlZml4KGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB7Ci0gICAgICAgICAgICBpZihuYW1lc3BhY2UuZXF1YWxzKCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIpKXsKLSAgICAgICAgICAgICAgICByZXR1cm4gIlNPQVAtRU5DIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBmaWVsZCBmb3IgRGVjaW1hbAotICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgamF2YS5tYXRoLkJpZ0RlY2ltYWwgbG9jYWxEZWNpbWFsIDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBnZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gamF2YS5tYXRoLkJpZ0RlY2ltYWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgIGphdmEubWF0aC5CaWdEZWNpbWFsIGdldERlY2ltYWwoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxEZWNpbWFsOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgc2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtIHBhcmFtIERlY2ltYWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldERlY2ltYWwoamF2YS5tYXRoLkJpZ0RlY2ltYWwgcGFyYW0pewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2FsRGVjaW1hbD1wYXJhbTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsRGVjaW1hbC50b1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgLyoqCi0gICAgICogaXNSZWFkZXJNVE9NQXdhcmUKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlYWRlciBzdXBwb3J0cyBNVE9NCi0gICAgICovCi0gICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIHRyeXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGphdmEubGFuZy5Cb29sZWFuLlRSVUUuZXF1YWxzKHJlYWRlci5nZXRQcm9wZXJ0eShvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQ29uc3RhbnRzLklTX0RBVEFfSEFORExFUlNfQVdBUkUpKTsKLSAgICAgICAgfWNhdGNoKGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXNSZWFkZXJNVE9NQXdhcmU7Ci0gICB9Ci0gICAgIAotICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICoKLSAgICAgICAgKiBAcGFyYW0gcGFyZW50UU5hbWUKLSAgICAgICAgKiBAcGFyYW0gZmFjdG9yeQotICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICBwdWJsaWMgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgZ2V0T01FbGVtZW50ICgKLSAgICAgICAgICAgICAgIGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5KSB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlIGRhdGFTb3VyY2UgPQotICAgICAgICAgICAgICAgICAgICAgICBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJEYXRhU291cmNlKHRoaXMscGFyZW50UU5hbWUpewotCi0gICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICBEZWNpbWFsLnRoaXMuc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmxsb20uT01Tb3VyY2VkRWxlbWVudEltcGwoCi0gICAgICAgICAgICAgICBwYXJlbnRRTmFtZSxmYWN0b3J5LGRhdGFTb3VyY2UpOwotICAgICAgICAgICAgCi0gICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyLGZhbHNlKTsKLSAgICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VyaWFsaXplVHlwZSkKLSAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLQotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBwYXJlbnRRTmFtZS5nZXRQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlID0gcGFyZW50UU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2UgIT0gbnVsbCkgJiYgKG5hbWVzcGFjZS50cmltKCkubGVuZ3RoKCkgPiAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB3cml0ZXJQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAod3JpdGVyUHJlZml4ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQobmFtZXNwYWNlLCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwcmVmaXgsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICBpZiAoc2VyaWFsaXplVHlwZSl7Ci0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iKTsKLSAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZVByZWZpeCAhPSBudWxsKSAmJiAobmFtZXNwYWNlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApKXsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VQcmVmaXgrIjpkZWNpbWFsIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVjaW1hbCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbERlY2ltYWw9PW51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIHRoZSBuaWwgYXR0cmlidXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiZGVjaW1hbCBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbERlY2ltYWwpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRoIHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCxqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgIGlmICh4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLQotICAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsIGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlTmFtZXNwYWNlID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVWYWx1ZTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBhdHRyaWJ1dGVQcmVmaXggKyAiOiIgKyBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSwgYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICBtZXRob2QgdG8gaGFuZGxlIFFuYW1lcwotICAgICAgICAgKi8KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZShqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhwcmVmaXggKyAiOiIgKyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaS5lIHRoaXMgaXMgdGhlIGRlZmF1bHQgbmFtZXNwYWNlCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lcyhqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lW10gcW5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICBpZiAocW5hbWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHRvIHN0b3JlIHRoaXMgZGF0YSB1bnRpbCBsYXN0IG1vbWVudCBzaW5jZSBpdCBpcyBub3QgcG9zc2libGUgdG8gd3JpdGUgYW55Ci0gICAgICAgICAgICAgICAgLy8gbmFtZXNwYWNlIGRhdGEgYWZ0ZXIgd3JpdGluZyB0aGUgY2hhcmFjdG9yIGRhdGEKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIHN0cmluZ1RvV3JpdGUgPSBuZXcgamF2YS5sYW5nLlN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHFuYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKCIgIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlVVJJID0gcW5hbWVzW2ldLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocHJlZml4ID09IG51bGwpIHx8IChwcmVmaXgubGVuZ3RoKCkgPT0gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChwcmVmaXgpLmFwcGVuZCgiOiIpLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHN0cmluZ1RvV3JpdGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0KLSAgICAgICAgIC8qKgotICAgICAgICAgKiBSZWdpc3RlciBhIG5hbWVzcGFjZSBwcmVmaXgKLSAgICAgICAgICovCi0gICAgICAgICBwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgcmVnaXN0ZXJQcmVmaXgoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLCBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlICh4bWxXcml0ZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gcHJlZml4OwotICAgICAgICAgICAgfQotCi0KLSAgCi0gICAgICAgIC8qKgotICAgICAgICAqIGRhdGFiaW5kaW5nIG1ldGhvZCB0byBnZXQgYW4gWE1MIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0Ci0gICAgICAgICoKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIGdldFB1bGxQYXJzZXIoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxTmFtZSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgZWxlbWVudExpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGF0dHJpYkxpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlci5FTEVNRU5UX1RFWFQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsRGVjaW1hbCAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxEZWNpbWFsKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oImRlY2ltYWwgY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXJJbXBsKHFOYW1lLCBlbGVtZW50TGlzdC50b0FycmF5KCksIGF0dHJpYkxpc3QudG9BcnJheSgpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gIAotCi0gICAgIC8qKgotICAgICAgKiAgRmFjdG9yeSBjbGFzcyB0aGF0IGtlZXBzIHRoZSBwYXJzZSBtZXRob2QKLSAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5ewotCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIERlY2ltYWwgZnJvbVN0cmluZyhqYXZhLmxhbmcuU3RyaW5nIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJKXsKLSAgICAgICAgICAgICAgICAgICAgRGVjaW1hbCByZXR1cm5WYWx1ZSA9IG5ldyAgRGVjaW1hbCgpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZS5zZXREZWNpbWFsKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvRGVjaW1hbCh2YWx1ZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgRGVjaW1hbCBmcm9tU3RyaW5nKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50LmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gY29udGVudC5zdWJzdHJpbmcoMCxjb250ZW50LmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVyaSA9IHhtbFN0cmVhbVJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRGVjaW1hbC5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCxuYW1lc3BhY2VVcmkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRGVjaW1hbC5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCwiIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIAotCi0gICAgICAgIC8qKgotICAgICAgICAqIHN0YXRpYyBtZXRob2QgdG8gY3JlYXRlIHRoZSBvYmplY3QKLSAgICAgICAgKiBQcmVjb25kaXRpb246ICBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgY3VycmVudCBvciBuZXh0IHN0YXJ0IGVsZW1lbnQgc3RhcnRzIHRoaXMgb2JqZWN0IGFuZCBhbnkgaW50ZXJ2ZW5pbmcgcmVhZGVyIGV2ZW50cyBhcmUgaWdub3JhYmxlCi0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgbm90IGFuIGVsZW1lbnQsIGl0IGlzIGEgY29tcGxleCB0eXBlIGFuZCB0aGUgcmVhZGVyIGlzIGF0IHRoZSBldmVudCBqdXN0IGFmdGVyIHRoZSBvdXRlciBzdGFydCBlbGVtZW50Ci0gICAgICAgICogUG9zdGNvbmRpdGlvbjogSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IGl0cyBlbmQgZWxlbWVudAotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIGEgY29tcGxleCB0eXBlLCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgdGhlIGVuZCBlbGVtZW50IG9mIGl0cyBvdXRlciBlbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgRGVjaW1hbCBwYXJzZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uewotICAgICAgICAgICAgRGVjaW1hbCBvYmplY3QgPQotICAgICAgICAgICAgICAgIG5ldyBEZWNpbWFsKCk7Ci0KLSAgICAgICAgICAgIGludCBldmVudDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmlsbGFibGVWYWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IiI7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZXVyaSA9IiI7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlICghcmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgJiYgIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkKLSAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIpIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgZnVsbFR5cGVOYW1lID0gcmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAidHlwZSIpOwotICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNQcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZygwLGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gbnNQcmVmaXg9PW51bGw/IiI6bnNQcmVmaXg7Ci0KLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB0eXBlID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZyhmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKzEpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISJkZWNpbWFsIi5lcXVhbHModHlwZSkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2ZpbmQgbmFtZXNwYWNlIGZvciB0aGUgcHJlZml4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNVcmkgPSByZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShuc1ByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoRGVjaW1hbClvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZy5FeHRlbnNpb25NYXBwZXIuZ2V0VHlwZU9iamVjdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc1VyaSx0eXBlLHJlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBOb3RlIGFsbCBhdHRyaWJ1dGVzIHRoYXQgd2VyZSBoYW5kbGVkLiBVc2VkIHRvIGRpZmZlciBub3JtYWwgYXR0cmlidXRlcwotICAgICAgICAgICAgICAgIC8vIGZyb20gYW55QXR0cmlidXRlcy4KLSAgICAgICAgICAgICAgICBqYXZhLnV0aWwuVmVjdG9yIGhhbmRsZWRBdHRyaWJ1dGVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSghcmVhZGVyLmlzRW5kRWxlbWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCA9IHJlYWRlci5nZXRFbGVtZW50VGV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldERlY2ltYWwoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb0RlY2ltYWwoY29udGVudCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIEVuZCBvZiBpZiBmb3IgZXhwZWN0ZWQgcHJvcGVydHkgc3RhcnQgZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHN0YXJ0IGVsZW1lbnQgd2UgYXJlIG5vdCBleHBlY3RpbmcgaW5kaWNhdGVzIGFuIGludmFsaWQgcGFyYW1ldGVyIHdhcyBwYXNzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIlVuZXhwZWN0ZWQgc3ViZWxlbWVudCAiICsgcmVhZGVyLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBlbmQgb2Ygd2hpbGUgbG9vcAotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLQotCi0gICAgICAgICAgICB9IGNhdGNoIChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEubGFuZy5FeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBvYmplY3Q7Ci0gICAgICAgIH0KLQotICAgICAgICB9Ly9lbmQgb2YgZmFjdG9yeSBjbGFzcwotCi0gICAgICAgIAotCi0gICAgICAgIH0KLSAgICAgICAgICAgCi0gICAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9EdXJhdGlvbi5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9EdXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTQzZTU2Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvRHVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwMyArMCwwIEBACi0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICogRHVyYXRpb24uamF2YQotICoKLSAqIFRoaXMgZmlsZSB3YXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBXU0RMCi0gKiBieSB0aGUgQXBhY2hlIEF4aXMyIHZlcnNpb246IFNOQVBTSE9UICBCdWlsdCBvbiA6IERlYyAyMSwgMjAwNyAoMDQ6MDM6MzAgTEtUKQotICovCi0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBwYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nOwotICAgICAgICAgICAgCi0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiAgRHVyYXRpb24gYmVhbiBjbGFzcwotICAgICAgICAgICAgKi8KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyAgY2xhc3MgRHVyYXRpb24KLSAgICAgICAgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkJlYW57Ci0gICAgICAgIC8qIFRoaXMgdHlwZSB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIHBpZWNlIG9mIHNjaGVtYSB0aGF0IGhhZAotICAgICAgICAgICAgICAgIG5hbWUgPSBkdXJhdGlvbgotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBVUkkgPSBodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLwotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBQcmVmaXggPSBuczEKLSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgCi0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZW5lcmF0ZVByZWZpeChqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICAgICAgaWYobmFtZXNwYWNlLmVxdWFscygiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iKSl7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJTT0FQLUVOQyI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgfQotCi0gICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogZmllbGQgZm9yIER1cmF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLkR1cmF0aW9uIGxvY2FsRHVyYXRpb24gOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIGdldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLkR1cmF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLkR1cmF0aW9uIGdldER1cmF0aW9uKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsRHVyYXRpb247Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBzZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gcGFyYW0gRHVyYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldER1cmF0aW9uKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuRHVyYXRpb24gcGFyYW0pewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2FsRHVyYXRpb249cGFyYW07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbER1cmF0aW9uLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAvKioKLSAgICAgKiBpc1JlYWRlck1UT01Bd2FyZQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVhZGVyIHN1cHBvcnRzIE1UT00KLSAgICAgKi8KLSAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKLSAgICAgICAgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICAKLSAgICAgICAgdHJ5ewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gamF2YS5sYW5nLkJvb2xlYW4uVFJVRS5lcXVhbHMocmVhZGVyLmdldFByb3BlcnR5KG9yZy5hcGFjaGUuYXhpb20ub20uT01Db25zdGFudHMuSVNfREFUQV9IQU5ETEVSU19BV0FSRSkpOwotICAgICAgICB9Y2F0Y2goamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpc1JlYWRlck1UT01Bd2FyZTsKLSAgIH0KLSAgICAgCi0gICAgIAotICAgICAgICAvKioKLSAgICAgICAgKgotICAgICAgICAqIEBwYXJhbSBwYXJlbnRRTmFtZQotICAgICAgICAqIEBwYXJhbSBmYWN0b3J5Ci0gICAgICAgICogQHJldHVybiBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudAotICAgICAgICAqLwotICAgICAgIHB1YmxpYyBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCBnZXRPTUVsZW1lbnQgKAotICAgICAgICAgICAgICAgZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnkpIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTURhdGFTb3VyY2UgZGF0YVNvdXJjZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkRhdGFTb3VyY2UodGhpcyxwYXJlbnRRTmFtZSl7Ci0KLSAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgIER1cmF0aW9uLnRoaXMuc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmxsb20uT01Tb3VyY2VkRWxlbWVudEltcGwoCi0gICAgICAgICAgICAgICBwYXJlbnRRTmFtZSxmYWN0b3J5LGRhdGFTb3VyY2UpOwotICAgICAgICAgICAgCi0gICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyLGZhbHNlKTsKLSAgICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VyaWFsaXplVHlwZSkKLSAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLQotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBwYXJlbnRRTmFtZS5nZXRQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlID0gcGFyZW50UU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2UgIT0gbnVsbCkgJiYgKG5hbWVzcGFjZS50cmltKCkubGVuZ3RoKCkgPiAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB3cml0ZXJQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAod3JpdGVyUHJlZml4ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQobmFtZXNwYWNlLCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwcmVmaXgsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICBpZiAoc2VyaWFsaXplVHlwZSl7Ci0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iKTsKLSAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZVByZWZpeCAhPSBudWxsKSAmJiAobmFtZXNwYWNlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApKXsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VQcmVmaXgrIjpkdXJhdGlvbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgImR1cmF0aW9uIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsRHVyYXRpb249PW51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIHRoZSBuaWwgYXR0cmlidXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiZHVyYXRpb24gY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxEdXJhdGlvbikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGggdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgcHJlZml4LGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgaWYgKHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotCi0gICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotCi0gICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSwgamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVOYW1lc3BhY2UgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgoYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVZhbHVlOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IGF0dHJpYnV0ZVByZWZpeCArICI6IiArIHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLCBhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAvKioKLSAgICAgICAgICogIG1ldGhvZCB0byBoYW5kbGUgUW5hbWVzCi0gICAgICAgICAqLwotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHByZWZpeCArICI6IiArIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBpLmUgdGhpcyBpcyB0aGUgZGVmYXVsdCBuYW1lc3BhY2UKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVzKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWVbXSBxbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgIGlmIChxbmFtZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gc3RvcmUgdGhpcyBkYXRhIHVudGlsIGxhc3QgbW9tZW50IHNpbmNlIGl0IGlzIG5vdCBwb3NzaWJsZSB0byB3cml0ZSBhbnkKLSAgICAgICAgICAgICAgICAvLyBuYW1lc3BhY2UgZGF0YSBhZnRlciB3cml0aW5nIHRoZSBjaGFyYWN0b3IgZGF0YQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmdCdWZmZXIgc3RyaW5nVG9Xcml0ZSA9IG5ldyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcW5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQoIiAiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VVUkkgPSBxbmFtZXNbaV0uZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwcmVmaXggPT0gbnVsbCkgfHwgKHByZWZpeC5sZW5ndGgoKSA9PSAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKHByZWZpeCkuYXBwZW5kKCI6IikuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMoc3RyaW5nVG9Xcml0ZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAqIFJlZ2lzdGVyIGEgbmFtZXNwYWNlIHByZWZpeAotICAgICAgICAgKi8KLSAgICAgICAgIHByaXZhdGUgamF2YS5sYW5nLlN0cmluZyByZWdpc3RlclByZWZpeChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHhtbFdyaXRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiBwcmVmaXg7Ci0gICAgICAgICAgICB9Ci0KLQotICAKLSAgICAgICAgLyoqCi0gICAgICAgICogZGF0YWJpbmRpbmcgbWV0aG9kIHRvIGdldCBhbiBYTUwgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QKLSAgICAgICAgKgotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgZ2V0UHVsbFBhcnNlcihqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFOYW1lKQotICAgICAgICAgICAgICAgICAgICB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBlbGVtZW50TGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgYXR0cmliTGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVyLkVMRU1FTlRfVEVYVCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxEdXJhdGlvbiAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxEdXJhdGlvbikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJkdXJhdGlvbiBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlckltcGwocU5hbWUsIGVsZW1lbnRMaXN0LnRvQXJyYXkoKSwgYXR0cmliTGlzdC50b0FycmF5KCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgCi0KLSAgICAgLyoqCi0gICAgICAqICBGYWN0b3J5IGNsYXNzIHRoYXQga2VlcHMgdGhlIHBhcnNlIG1ldGhvZAotICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3Rvcnl7Ci0KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgRHVyYXRpb24gZnJvbVN0cmluZyhqYXZhLmxhbmcuU3RyaW5nIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJKXsKLSAgICAgICAgICAgICAgICAgICAgRHVyYXRpb24gcmV0dXJuVmFsdWUgPSBuZXcgIER1cmF0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlLnNldER1cmF0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvRHVyYXRpb24odmFsdWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIER1cmF0aW9uIGZyb21TdHJpbmcoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBjb250ZW50LnN1YnN0cmluZygwLGNvbnRlbnQuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVXJpID0geG1sU3RyZWFtUmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBEdXJhdGlvbi5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCxuYW1lc3BhY2VVcmkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRHVyYXRpb24uRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsIiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAKLQotICAgICAgICAvKioKLSAgICAgICAgKiBzdGF0aWMgbWV0aG9kIHRvIGNyZWF0ZSB0aGUgb2JqZWN0Ci0gICAgICAgICogUHJlY29uZGl0aW9uOiAgSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIGN1cnJlbnQgb3IgbmV4dCBzdGFydCBlbGVtZW50IHN0YXJ0cyB0aGlzIG9iamVjdCBhbmQgYW55IGludGVydmVuaW5nIHJlYWRlciBldmVudHMgYXJlIGlnbm9yYWJsZQotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIG5vdCBhbiBlbGVtZW50LCBpdCBpcyBhIGNvbXBsZXggdHlwZSBhbmQgdGhlIHJlYWRlciBpcyBhdCB0aGUgZXZlbnQganVzdCBhZnRlciB0aGUgb3V0ZXIgc3RhcnQgZWxlbWVudAotICAgICAgICAqIFBvc3Rjb25kaXRpb246IElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCBpdHMgZW5kIGVsZW1lbnQKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBhIGNvbXBsZXggdHlwZSwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IHRoZSBlbmQgZWxlbWVudCBvZiBpdHMgb3V0ZXIgZWxlbWVudAotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIER1cmF0aW9uIHBhcnNlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb257Ci0gICAgICAgICAgICBEdXJhdGlvbiBvYmplY3QgPQotICAgICAgICAgICAgICAgIG5ldyBEdXJhdGlvbigpOwotCi0gICAgICAgICAgICBpbnQgZXZlbnQ7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5pbGxhYmxlVmFsdWUgPSBudWxsOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSIiOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2V1cmkgPSIiOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSAoIXJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICYmICFyZWFkZXIuaXNFbmRFbGVtZW50KCkpCi0gICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiKSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGZ1bGxUeXBlTmFtZSA9IHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiKTsKLSAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUhPW51bGwpewotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zUHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoMCxmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IG5zUHJlZml4PT1udWxsPyIiOm5zUHJlZml4OwotCi0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgdHlwZSA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSsxKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEiZHVyYXRpb24iLmVxdWFscyh0eXBlKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZmluZCBuYW1lc3BhY2UgZm9yIHRoZSBwcmVmaXgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1VyaSA9IHJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKG5zUHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChEdXJhdGlvbilvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZy5FeHRlbnNpb25NYXBwZXIuZ2V0VHlwZU9iamVjdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc1VyaSx0eXBlLHJlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBOb3RlIGFsbCBhdHRyaWJ1dGVzIHRoYXQgd2VyZSBoYW5kbGVkLiBVc2VkIHRvIGRpZmZlciBub3JtYWwgYXR0cmlidXRlcwotICAgICAgICAgICAgICAgIC8vIGZyb20gYW55QXR0cmlidXRlcy4KLSAgICAgICAgICAgICAgICBqYXZhLnV0aWwuVmVjdG9yIGhhbmRsZWRBdHRyaWJ1dGVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSghcmVhZGVyLmlzRW5kRWxlbWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCA9IHJlYWRlci5nZXRFbGVtZW50VGV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldER1cmF0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9EdXJhdGlvbihjb250ZW50KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gRW5kIG9mIGlmIGZvciBleHBlY3RlZCBwcm9wZXJ0eSBzdGFydCBlbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgc3RhcnQgZWxlbWVudCB3ZSBhcmUgbm90IGV4cGVjdGluZyBpbmRpY2F0ZXMgYW4gaW52YWxpZCBwYXJhbWV0ZXIgd2FzIHBhc3NlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiVW5leHBlY3RlZCBzdWJlbGVtZW50ICIgKyByZWFkZXIuZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIGVuZCBvZiB3aGlsZSBsb29wCi0gICAgICAgICAgICAgICAgICAgICAgICAKLQotCi0KLSAgICAgICAgICAgIH0gY2F0Y2ggKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5sYW5nLkV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG9iamVjdDsKLSAgICAgICAgfQotCi0gICAgICAgIH0vL2VuZCBvZiBmYWN0b3J5IGNsYXNzCi0KLSAgICAgICAgCi0KLSAgICAgICAgfQotICAgICAgICAgICAKLSAgICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL0VOVElUSUVTLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL0VOVElUSUVTLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjODRjOWMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9FTlRJVElFUy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAzICswLDAgQEAKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBFTlRJVElFUy5qYXZhCi0gKgotICogVGhpcyBmaWxlIHdhcyBhdXRvLWdlbmVyYXRlZCBmcm9tIFdTREwKLSAqIGJ5IHRoZSBBcGFjaGUgQXhpczIgdmVyc2lvbjogU05BUFNIT1QgIEJ1aWx0IG9uIDogRGVjIDIxLCAyMDA3ICgwNDowMzozMCBMS1QpCi0gKi8KLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2Rpbmc7Ci0gICAgICAgICAgICAKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqICBFTlRJVElFUyBiZWFuIGNsYXNzCi0gICAgICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgcHVibGljICBjbGFzcyBFTlRJVElFUwotICAgICAgICBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCQmVhbnsKLSAgICAgICAgLyogVGhpcyB0eXBlIHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgcGllY2Ugb2Ygc2NoZW1hIHRoYXQgaGFkCi0gICAgICAgICAgICAgICAgbmFtZSA9IEVOVElUSUVTCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFVSSSA9IGh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFByZWZpeCA9IG5zMQotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdlbmVyYXRlUHJlZml4KGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB7Ci0gICAgICAgICAgICBpZihuYW1lc3BhY2UuZXF1YWxzKCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIpKXsKLSAgICAgICAgICAgICAgICByZXR1cm4gIlNPQVAtRU5DIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBmaWVsZCBmb3IgRU5USVRJRVMKLSAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuRW50aXRpZXMgbG9jYWxFTlRJVElFUyA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgZ2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuRW50aXRpZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuRW50aXRpZXMgZ2V0RU5USVRJRVMoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxFTlRJVElFUzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIHNldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSBwYXJhbSBFTlRJVElFUwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0RU5USVRJRVMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5FbnRpdGllcyBwYXJhbSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYWxFTlRJVElFUz1wYXJhbTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsRU5USVRJRVMudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgIC8qKgotICAgICAqIGlzUmVhZGVyTVRPTUF3YXJlCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSByZWFkZXIgc3VwcG9ydHMgTVRPTQotICAgICAqLwotICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgewotICAgICAgICBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICB0cnl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBqYXZhLmxhbmcuQm9vbGVhbi5UUlVFLmVxdWFscyhyZWFkZXIuZ2V0UHJvcGVydHkob3JnLmFwYWNoZS5heGlvbS5vbS5PTUNvbnN0YW50cy5JU19EQVRBX0hBTkRMRVJTX0FXQVJFKSk7Ci0gICAgICAgIH1jYXRjaChqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlzUmVhZGVyTVRPTUF3YXJlOwotICAgfQotICAgICAKLSAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAqCi0gICAgICAgICogQHBhcmFtIHBhcmVudFFOYW1lCi0gICAgICAgICogQHBhcmFtIGZhY3RvcnkKLSAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgcHVibGljIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IGdldE9NRWxlbWVudCAoCi0gICAgICAgICAgICAgICBmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSkgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZSBkYXRhU291cmNlID0KLSAgICAgICAgICAgICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRGF0YVNvdXJjZSh0aGlzLHBhcmVudFFOYW1lKXsKLQotICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgRU5USVRJRVMudGhpcy5zZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5PTVNvdXJjZWRFbGVtZW50SW1wbCgKLSAgICAgICAgICAgICAgIHBhcmVudFFOYW1lLGZhY3RvcnksZGF0YVNvdXJjZSk7Ci0gICAgICAgICAgICAKLSAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIsZmFsc2UpOwotICAgICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzZXJpYWxpemVUeXBlKQotICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotCi0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UgPSBudWxsOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHBhcmVudFFOYW1lLmdldFByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UgPSBwYXJlbnRRTmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZSAhPSBudWxsKSAmJiAobmFtZXNwYWNlLnRyaW0oKS5sZW5ndGgoKSA+IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHdyaXRlclByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3cml0ZXJQcmVmaXggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChuYW1lc3BhY2UsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHByZWZpeCwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCksIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIGlmIChzZXJpYWxpemVUeXBlKXsKLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIpOwotICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlUHJlZml4ICE9IG51bGwpICYmIChuYW1lc3BhY2VQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkpewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVByZWZpeCsiOkVOVElUSUVTIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiRU5USVRJRVMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxFTlRJVElFUz09bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgdGhlIG5pbCBhdHRyaWJ1dGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJFTlRJVElFUyBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbEVOVElUSUVTKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBwcmVmaXgsamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICBpZiAoeG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0KLSAgICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0KLSAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLCBqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZU5hbWVzcGFjZSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlVmFsdWU7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gYXR0cmlidXRlUHJlZml4ICsgIjoiICsgcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsIGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIC8qKgotICAgICAgICAgKiAgbWV0aG9kIHRvIGhhbmRsZSBRbmFtZXMKLSAgICAgICAgICovCi0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWUoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMocHJlZml4ICsgIjoiICsgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGkuZSB0aGlzIGlzIHRoZSBkZWZhdWx0IG5hbWVzcGFjZQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZXMoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZVtdIHFuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgaWYgKHFuYW1lcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBzdG9yZSB0aGlzIGRhdGEgdW50aWwgbGFzdCBtb21lbnQgc2luY2UgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHdyaXRlIGFueQotICAgICAgICAgICAgICAgIC8vIG5hbWVzcGFjZSBkYXRhIGFmdGVyIHdyaXRpbmcgdGhlIGNoYXJhY3RvciBkYXRhCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZ0J1ZmZlciBzdHJpbmdUb1dyaXRlID0gbmV3IGphdmEubGFuZy5TdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBxbmFtZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZCgiICIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVVSSSA9IHFuYW1lc1tpXS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHByZWZpeCA9PSBudWxsKSB8fCAocHJlZml4Lmxlbmd0aCgpID09IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQocHJlZml4KS5hcHBlbmQoIjoiKS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhzdHJpbmdUb1dyaXRlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotCi0gICAgICAgICAvKioKLSAgICAgICAgICogUmVnaXN0ZXIgYSBuYW1lc3BhY2UgcHJlZml4Ci0gICAgICAgICAqLwotICAgICAgICAgcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHJlZ2lzdGVyUHJlZml4KGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoeG1sV3JpdGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHByZWZpeDsKLSAgICAgICAgICAgIH0KLQotCi0gIAotICAgICAgICAvKioKLSAgICAgICAgKiBkYXRhYmluZGluZyBtZXRob2QgdG8gZ2V0IGFuIFhNTCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdAotICAgICAgICAqCi0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciBnZXRQdWxsUGFyc2VyKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcU5hbWUpCi0gICAgICAgICAgICAgICAgICAgIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGVsZW1lbnRMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBhdHRyaWJMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXIuRUxFTUVOVF9URVhUKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbEVOVElUSUVTICE9IG51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbEVOVElUSUVTKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIkVOVElUSUVTIGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVySW1wbChxTmFtZSwgZWxlbWVudExpc3QudG9BcnJheSgpLCBhdHRyaWJMaXN0LnRvQXJyYXkoKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAKLQotICAgICAvKioKLSAgICAgICogIEZhY3RvcnkgY2xhc3MgdGhhdCBrZWVwcyB0aGUgcGFyc2UgbWV0aG9kCi0gICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeXsKLQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBFTlRJVElFUyBmcm9tU3RyaW5nKGphdmEubGFuZy5TdHJpbmcgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkpewotICAgICAgICAgICAgICAgICAgICBFTlRJVElFUyByZXR1cm5WYWx1ZSA9IG5ldyAgRU5USVRJRVMoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUuc2V0RU5USVRJRVMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9FTlRJVElFUyh2YWx1ZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgRU5USVRJRVMgZnJvbVN0cmluZyhqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudC5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IGNvbnRlbnQuc3Vic3RyaW5nKDAsY29udGVudC5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVcmkgPSB4bWxTdHJlYW1SZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVOVElUSUVTLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LG5hbWVzcGFjZVVyaSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFTlRJVElFUy5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCwiIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIAotCi0gICAgICAgIC8qKgotICAgICAgICAqIHN0YXRpYyBtZXRob2QgdG8gY3JlYXRlIHRoZSBvYmplY3QKLSAgICAgICAgKiBQcmVjb25kaXRpb246ICBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgY3VycmVudCBvciBuZXh0IHN0YXJ0IGVsZW1lbnQgc3RhcnRzIHRoaXMgb2JqZWN0IGFuZCBhbnkgaW50ZXJ2ZW5pbmcgcmVhZGVyIGV2ZW50cyBhcmUgaWdub3JhYmxlCi0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgbm90IGFuIGVsZW1lbnQsIGl0IGlzIGEgY29tcGxleCB0eXBlIGFuZCB0aGUgcmVhZGVyIGlzIGF0IHRoZSBldmVudCBqdXN0IGFmdGVyIHRoZSBvdXRlciBzdGFydCBlbGVtZW50Ci0gICAgICAgICogUG9zdGNvbmRpdGlvbjogSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IGl0cyBlbmQgZWxlbWVudAotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIGEgY29tcGxleCB0eXBlLCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgdGhlIGVuZCBlbGVtZW50IG9mIGl0cyBvdXRlciBlbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgRU5USVRJRVMgcGFyc2UoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIEVOVElUSUVTIG9iamVjdCA9Ci0gICAgICAgICAgICAgICAgbmV3IEVOVElUSUVTKCk7Ci0KLSAgICAgICAgICAgIGludCBldmVudDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmlsbGFibGVWYWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IiI7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZXVyaSA9IiI7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlICghcmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgJiYgIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkKLSAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIpIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgZnVsbFR5cGVOYW1lID0gcmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAidHlwZSIpOwotICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNQcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZygwLGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gbnNQcmVmaXg9PW51bGw/IiI6bnNQcmVmaXg7Ci0KLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB0eXBlID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZyhmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKzEpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISJFTlRJVElFUyIuZXF1YWxzKHR5cGUpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9maW5kIG5hbWVzcGFjZSBmb3IgdGhlIHByZWZpeAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zVXJpID0gcmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkobnNQcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKEVOVElUSUVTKW9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLkV4dGVuc2lvbk1hcHBlci5nZXRUeXBlT2JqZWN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zVXJpLHR5cGUscmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIE5vdGUgYWxsIGF0dHJpYnV0ZXMgdGhhdCB3ZXJlIGhhbmRsZWQuIFVzZWQgdG8gZGlmZmVyIG5vcm1hbCBhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgICAgLy8gZnJvbSBhbnlBdHRyaWJ1dGVzLgotICAgICAgICAgICAgICAgIGphdmEudXRpbC5WZWN0b3IgaGFuZGxlZEF0dHJpYnV0ZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlKCFyZWFkZXIuaXNFbmRFbGVtZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50ID0gcmVhZGVyLmdldEVsZW1lbnRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0RU5USVRJRVMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb0VOVElUSUVTKGNvbnRlbnQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBFbmQgb2YgaWYgZm9yIGV4cGVjdGVkIHByb3BlcnR5IHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2V7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBzdGFydCBlbGVtZW50IHdlIGFyZSBub3QgZXhwZWN0aW5nIGluZGljYXRlcyBhbiBpbnZhbGlkIHBhcmFtZXRlciB3YXMgcGFzc2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJVbmV4cGVjdGVkIHN1YmVsZW1lbnQgIiArIHJlYWRlci5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gZW5kIG9mIHdoaWxlIGxvb3AKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0KLQotICAgICAgICAgICAgfSBjYXRjaCAoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gb2JqZWN0OwotICAgICAgICB9Ci0KLSAgICAgICAgfS8vZW5kIG9mIGZhY3RvcnkgY2xhc3MKLQotICAgICAgICAKLQotICAgICAgICB9Ci0gICAgICAgICAgIAotICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvRU5USVRZLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL0VOVElUWS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MWFkN2I0Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvRU5USVRZLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDMgKzAsMCBAQAotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIEVOVElUWS5qYXZhCi0gKgotICogVGhpcyBmaWxlIHdhcyBhdXRvLWdlbmVyYXRlZCBmcm9tIFdTREwKLSAqIGJ5IHRoZSBBcGFjaGUgQXhpczIgdmVyc2lvbjogU05BUFNIT1QgIEJ1aWx0IG9uIDogRGVjIDIxLCAyMDA3ICgwNDowMzozMCBMS1QpCi0gKi8KLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2Rpbmc7Ci0gICAgICAgICAgICAKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqICBFTlRJVFkgYmVhbiBjbGFzcwotICAgICAgICAgICAgKi8KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyAgY2xhc3MgRU5USVRZCi0gICAgICAgIGltcGxlbWVudHMgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJCZWFuewotICAgICAgICAvKiBUaGlzIHR5cGUgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBwaWVjZSBvZiBzY2hlbWEgdGhhdCBoYWQKLSAgICAgICAgICAgICAgICBuYW1lID0gRU5USVRZCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFVSSSA9IGh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFByZWZpeCA9IG5zMQotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdlbmVyYXRlUHJlZml4KGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB7Ci0gICAgICAgICAgICBpZihuYW1lc3BhY2UuZXF1YWxzKCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIpKXsKLSAgICAgICAgICAgICAgICByZXR1cm4gIlNPQVAtRU5DIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBmaWVsZCBmb3IgRU5USVRZCi0gICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLkVudGl0eSBsb2NhbEVOVElUWSA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgZ2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuRW50aXR5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLkVudGl0eSBnZXRFTlRJVFkoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxFTlRJVFk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBzZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gcGFyYW0gRU5USVRZCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRFTlRJVFkob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5FbnRpdHkgcGFyYW0pewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2FsRU5USVRZPXBhcmFtOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxFTlRJVFkudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgIC8qKgotICAgICAqIGlzUmVhZGVyTVRPTUF3YXJlCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSByZWFkZXIgc3VwcG9ydHMgTVRPTQotICAgICAqLwotICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgewotICAgICAgICBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICB0cnl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBqYXZhLmxhbmcuQm9vbGVhbi5UUlVFLmVxdWFscyhyZWFkZXIuZ2V0UHJvcGVydHkob3JnLmFwYWNoZS5heGlvbS5vbS5PTUNvbnN0YW50cy5JU19EQVRBX0hBTkRMRVJTX0FXQVJFKSk7Ci0gICAgICAgIH1jYXRjaChqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlzUmVhZGVyTVRPTUF3YXJlOwotICAgfQotICAgICAKLSAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAqCi0gICAgICAgICogQHBhcmFtIHBhcmVudFFOYW1lCi0gICAgICAgICogQHBhcmFtIGZhY3RvcnkKLSAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgcHVibGljIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IGdldE9NRWxlbWVudCAoCi0gICAgICAgICAgICAgICBmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSkgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZSBkYXRhU291cmNlID0KLSAgICAgICAgICAgICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRGF0YVNvdXJjZSh0aGlzLHBhcmVudFFOYW1lKXsKLQotICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgRU5USVRZLnRoaXMuc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmxsb20uT01Tb3VyY2VkRWxlbWVudEltcGwoCi0gICAgICAgICAgICAgICBwYXJlbnRRTmFtZSxmYWN0b3J5LGRhdGFTb3VyY2UpOwotICAgICAgICAgICAgCi0gICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyLGZhbHNlKTsKLSAgICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VyaWFsaXplVHlwZSkKLSAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLQotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBwYXJlbnRRTmFtZS5nZXRQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlID0gcGFyZW50UU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2UgIT0gbnVsbCkgJiYgKG5hbWVzcGFjZS50cmltKCkubGVuZ3RoKCkgPiAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB3cml0ZXJQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAod3JpdGVyUHJlZml4ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQobmFtZXNwYWNlLCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwcmVmaXgsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICBpZiAoc2VyaWFsaXplVHlwZSl7Ci0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iKTsKLSAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZVByZWZpeCAhPSBudWxsKSAmJiAobmFtZXNwYWNlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApKXsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VQcmVmaXgrIjpFTlRJVFkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJFTlRJVFkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxFTlRJVFk9PW51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIHRoZSBuaWwgYXR0cmlidXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiRU5USVRZIGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsRU5USVRZKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBwcmVmaXgsamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICBpZiAoeG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0KLSAgICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0KLSAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLCBqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZU5hbWVzcGFjZSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlVmFsdWU7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gYXR0cmlidXRlUHJlZml4ICsgIjoiICsgcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsIGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIC8qKgotICAgICAgICAgKiAgbWV0aG9kIHRvIGhhbmRsZSBRbmFtZXMKLSAgICAgICAgICovCi0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWUoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMocHJlZml4ICsgIjoiICsgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGkuZSB0aGlzIGlzIHRoZSBkZWZhdWx0IG5hbWVzcGFjZQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZXMoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZVtdIHFuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgaWYgKHFuYW1lcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBzdG9yZSB0aGlzIGRhdGEgdW50aWwgbGFzdCBtb21lbnQgc2luY2UgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHdyaXRlIGFueQotICAgICAgICAgICAgICAgIC8vIG5hbWVzcGFjZSBkYXRhIGFmdGVyIHdyaXRpbmcgdGhlIGNoYXJhY3RvciBkYXRhCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZ0J1ZmZlciBzdHJpbmdUb1dyaXRlID0gbmV3IGphdmEubGFuZy5TdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBxbmFtZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZCgiICIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVVSSSA9IHFuYW1lc1tpXS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHByZWZpeCA9PSBudWxsKSB8fCAocHJlZml4Lmxlbmd0aCgpID09IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQocHJlZml4KS5hcHBlbmQoIjoiKS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhzdHJpbmdUb1dyaXRlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotCi0gICAgICAgICAvKioKLSAgICAgICAgICogUmVnaXN0ZXIgYSBuYW1lc3BhY2UgcHJlZml4Ci0gICAgICAgICAqLwotICAgICAgICAgcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHJlZ2lzdGVyUHJlZml4KGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoeG1sV3JpdGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHByZWZpeDsKLSAgICAgICAgICAgIH0KLQotCi0gIAotICAgICAgICAvKioKLSAgICAgICAgKiBkYXRhYmluZGluZyBtZXRob2QgdG8gZ2V0IGFuIFhNTCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdAotICAgICAgICAqCi0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciBnZXRQdWxsUGFyc2VyKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcU5hbWUpCi0gICAgICAgICAgICAgICAgICAgIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGVsZW1lbnRMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBhdHRyaWJMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXIuRUxFTUVOVF9URVhUKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbEVOVElUWSAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxFTlRJVFkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiRU5USVRZIGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVySW1wbChxTmFtZSwgZWxlbWVudExpc3QudG9BcnJheSgpLCBhdHRyaWJMaXN0LnRvQXJyYXkoKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAKLQotICAgICAvKioKLSAgICAgICogIEZhY3RvcnkgY2xhc3MgdGhhdCBrZWVwcyB0aGUgcGFyc2UgbWV0aG9kCi0gICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeXsKLQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBFTlRJVFkgZnJvbVN0cmluZyhqYXZhLmxhbmcuU3RyaW5nIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJKXsKLSAgICAgICAgICAgICAgICAgICAgRU5USVRZIHJldHVyblZhbHVlID0gbmV3ICBFTlRJVFkoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUuc2V0RU5USVRZKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvRU5USVRZKHZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBFTlRJVFkgZnJvbVN0cmluZyhqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudC5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IGNvbnRlbnQuc3Vic3RyaW5nKDAsY29udGVudC5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVcmkgPSB4bWxTdHJlYW1SZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVOVElUWS5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCxuYW1lc3BhY2VVcmkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRU5USVRZLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LCIiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgCi0KLSAgICAgICAgLyoqCi0gICAgICAgICogc3RhdGljIG1ldGhvZCB0byBjcmVhdGUgdGhlIG9iamVjdAotICAgICAgICAqIFByZWNvbmRpdGlvbjogIElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSBjdXJyZW50IG9yIG5leHQgc3RhcnQgZWxlbWVudCBzdGFydHMgdGhpcyBvYmplY3QgYW5kIGFueSBpbnRlcnZlbmluZyByZWFkZXIgZXZlbnRzIGFyZSBpZ25vcmFibGUKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBub3QgYW4gZWxlbWVudCwgaXQgaXMgYSBjb21wbGV4IHR5cGUgYW5kIHRoZSByZWFkZXIgaXMgYXQgdGhlIGV2ZW50IGp1c3QgYWZ0ZXIgdGhlIG91dGVyIHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgKiBQb3N0Y29uZGl0aW9uOiBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgaXRzIGVuZCBlbGVtZW50Ci0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgYSBjb21wbGV4IHR5cGUsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCB0aGUgZW5kIGVsZW1lbnQgb2YgaXRzIG91dGVyIGVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBFTlRJVFkgcGFyc2UoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIEVOVElUWSBvYmplY3QgPQotICAgICAgICAgICAgICAgIG5ldyBFTlRJVFkoKTsKLQotICAgICAgICAgICAgaW50IGV2ZW50OwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuaWxsYWJsZVZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0iIjsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNldXJpID0iIjsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUgKCFyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAmJiAhcmVhZGVyLmlzRW5kRWxlbWVudCgpKQotICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIikhPW51bGwpewotICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBmdWxsVHlwZU5hbWUgPSByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIik7Ci0gICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1ByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKDAsZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBuc1ByZWZpeD09bnVsbD8iIjpuc1ByZWZpeDsKLQotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHR5cGUgPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikrMSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIkVOVElUWSIuZXF1YWxzKHR5cGUpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9maW5kIG5hbWVzcGFjZSBmb3IgdGhlIHByZWZpeAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zVXJpID0gcmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkobnNQcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKEVOVElUWSlvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZy5FeHRlbnNpb25NYXBwZXIuZ2V0VHlwZU9iamVjdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc1VyaSx0eXBlLHJlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBOb3RlIGFsbCBhdHRyaWJ1dGVzIHRoYXQgd2VyZSBoYW5kbGVkLiBVc2VkIHRvIGRpZmZlciBub3JtYWwgYXR0cmlidXRlcwotICAgICAgICAgICAgICAgIC8vIGZyb20gYW55QXR0cmlidXRlcy4KLSAgICAgICAgICAgICAgICBqYXZhLnV0aWwuVmVjdG9yIGhhbmRsZWRBdHRyaWJ1dGVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSghcmVhZGVyLmlzRW5kRWxlbWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCA9IHJlYWRlci5nZXRFbGVtZW50VGV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldEVOVElUWSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvRU5USVRZKGNvbnRlbnQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBFbmQgb2YgaWYgZm9yIGV4cGVjdGVkIHByb3BlcnR5IHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2V7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBzdGFydCBlbGVtZW50IHdlIGFyZSBub3QgZXhwZWN0aW5nIGluZGljYXRlcyBhbiBpbnZhbGlkIHBhcmFtZXRlciB3YXMgcGFzc2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJVbmV4cGVjdGVkIHN1YmVsZW1lbnQgIiArIHJlYWRlci5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gZW5kIG9mIHdoaWxlIGxvb3AKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0KLQotICAgICAgICAgICAgfSBjYXRjaCAoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gb2JqZWN0OwotICAgICAgICB9Ci0KLSAgICAgICAgfS8vZW5kIG9mIGZhY3RvcnkgY2xhc3MKLQotICAgICAgICAKLQotICAgICAgICB9Ci0gICAgICAgICAgIAotICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvRXh0ZW5zaW9uTWFwcGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL0V4dGVuc2lvbk1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDU0NWM2Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvRXh0ZW5zaW9uTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MTMgKzAsMCBAQAotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIEV4dGVuc2lvbk1hcHBlci5qYXZhCi0gKgotICogVGhpcyBmaWxlIHdhcyBhdXRvLWdlbmVyYXRlZCBmcm9tIFdTREwKLSAqIGJ5IHRoZSBBcGFjaGUgQXhpczIgdmVyc2lvbjogU05BUFNIT1QgIEJ1aWx0IG9uIDogRGVjIDIxLCAyMDA3ICgwNDowMzozMCBMS1QpCi0gKi8KLQotICAgICAgICAgICAgcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZzsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiAgRXh0ZW5zaW9uTWFwcGVyIGNsYXNzCi0gICAgICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgcHVibGljICBjbGFzcyBFeHRlbnNpb25NYXBwZXJ7Ci0KLSAgICAgICAgICBwdWJsaWMgc3RhdGljIGphdmEubGFuZy5PYmplY3QgZ2V0VHlwZU9iamVjdChqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHR5cGVOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb257Ci0KLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICBpZiAoCi0gICAgICAgICAgICAgICAgICAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLmVxdWFscyhuYW1lc3BhY2VVUkkpICYmCi0gICAgICAgICAgICAgICAgICAiYXJyYXlDb29yZGluYXRlIi5lcXVhbHModHlwZU5hbWUpKXsKLSAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLkFycmF5Q29vcmRpbmF0ZS5GYWN0b3J5LnBhcnNlKHJlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgaWYgKAotICAgICAgICAgICAgICAgICAgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi5lcXVhbHMobmFtZXNwYWNlVVJJKSAmJgotICAgICAgICAgICAgICAgICAgIm5vblBvc2l0aXZlSW50ZWdlciIuZXF1YWxzKHR5cGVOYW1lKSl7Ci0gICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZy5Ob25Qb3NpdGl2ZUludGVnZXIuRmFjdG9yeS5wYXJzZShyZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIGlmICgKLSAgICAgICAgICAgICAgICAgICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIuZXF1YWxzKG5hbWVzcGFjZVVSSSkgJiYKLSAgICAgICAgICAgICAgICAgICJpbnQiLmVxdWFscyh0eXBlTmFtZSkpewotICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2RpbmcuX2ludC5GYWN0b3J5LnBhcnNlKHJlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgaWYgKAotICAgICAgICAgICAgICAgICAgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi5lcXVhbHMobmFtZXNwYWNlVVJJKSAmJgotICAgICAgICAgICAgICAgICAgIk5NVE9LRU4iLmVxdWFscyh0eXBlTmFtZSkpewotICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2RpbmcuTk1UT0tFTi5GYWN0b3J5LnBhcnNlKHJlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgaWYgKAotICAgICAgICAgICAgICAgICAgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi5lcXVhbHMobmFtZXNwYWNlVVJJKSAmJgotICAgICAgICAgICAgICAgICAgInVuc2lnbmVkSW50Ii5lcXVhbHModHlwZU5hbWUpKXsKLSAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLlVuc2lnbmVkSW50LkZhY3RvcnkucGFyc2UocmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICBpZiAoCi0gICAgICAgICAgICAgICAgICAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLmVxdWFscyhuYW1lc3BhY2VVUkkpICYmCi0gICAgICAgICAgICAgICAgICAiSURSRUZTIi5lcXVhbHModHlwZU5hbWUpKXsKLSAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLklEUkVGUy5GYWN0b3J5LnBhcnNlKHJlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgaWYgKAotICAgICAgICAgICAgICAgICAgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi5lcXVhbHMobmFtZXNwYWNlVVJJKSAmJgotICAgICAgICAgICAgICAgICAgInNob3J0Ii5lcXVhbHModHlwZU5hbWUpKXsKLSAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLl9zaG9ydC5GYWN0b3J5LnBhcnNlKHJlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgaWYgKAotICAgICAgICAgICAgICAgICAgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi5lcXVhbHMobmFtZXNwYWNlVVJJKSAmJgotICAgICAgICAgICAgICAgICAgIm5lZ2F0aXZlSW50ZWdlciIuZXF1YWxzKHR5cGVOYW1lKSl7Ci0gICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZy5OZWdhdGl2ZUludGVnZXIuRmFjdG9yeS5wYXJzZShyZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIGlmICgKLSAgICAgICAgICAgICAgICAgICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIuZXF1YWxzKG5hbWVzcGFjZVVSSSkgJiYKLSAgICAgICAgICAgICAgICAgICJub3JtYWxpemVkU3RyaW5nIi5lcXVhbHModHlwZU5hbWUpKXsKLSAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLk5vcm1hbGl6ZWRTdHJpbmcuRmFjdG9yeS5wYXJzZShyZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIGlmICgKLSAgICAgICAgICAgICAgICAgICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIuZXF1YWxzKG5hbWVzcGFjZVVSSSkgJiYKLSAgICAgICAgICAgICAgICAgICJib29sZWFuIi5lcXVhbHModHlwZU5hbWUpKXsKLSAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLl9ib29sZWFuLkZhY3RvcnkucGFyc2UocmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICBpZiAoCi0gICAgICAgICAgICAgICAgICAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLmVxdWFscyhuYW1lc3BhY2VVUkkpICYmCi0gICAgICAgICAgICAgICAgICAidW5zaWduZWRMb25nIi5lcXVhbHModHlwZU5hbWUpKXsKLSAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLlVuc2lnbmVkTG9uZy5GYWN0b3J5LnBhcnNlKHJlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgaWYgKAotICAgICAgICAgICAgICAgICAgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi5lcXVhbHMobmFtZXNwYWNlVVJJKSAmJgotICAgICAgICAgICAgICAgICAgIklEUkVGIi5lcXVhbHModHlwZU5hbWUpKXsKLSAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLklEUkVGLkZhY3RvcnkucGFyc2UocmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICBpZiAoCi0gICAgICAgICAgICAgICAgICAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLmVxdWFscyhuYW1lc3BhY2VVUkkpICYmCi0gICAgICAgICAgICAgICAgICAiYmFzZTY0QmluYXJ5Ii5lcXVhbHModHlwZU5hbWUpKXsKLSAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLkJhc2U2NEJpbmFyeS5GYWN0b3J5LnBhcnNlKHJlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgaWYgKAotICAgICAgICAgICAgICAgICAgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi5lcXVhbHMobmFtZXNwYWNlVVJJKSAmJgotICAgICAgICAgICAgICAgICAgIklEIi5lcXVhbHModHlwZU5hbWUpKXsKLSAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLklELkZhY3RvcnkucGFyc2UocmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICBpZiAoCi0gICAgICAgICAgICAgICAgICAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLmVxdWFscyhuYW1lc3BhY2VVUkkpICYmCi0gICAgICAgICAgICAgICAgICAiZG91YmxlIi5lcXVhbHModHlwZU5hbWUpKXsKLSAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLl9kb3VibGUuRmFjdG9yeS5wYXJzZShyZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIGlmICgKLSAgICAgICAgICAgICAgICAgICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIuZXF1YWxzKG5hbWVzcGFjZVVSSSkgJiYKLSAgICAgICAgICAgICAgICAgICJhbnlVUkkiLmVxdWFscyh0eXBlTmFtZSkpewotICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2RpbmcuQW55VVJJLkZhY3RvcnkucGFyc2UocmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICBpZiAoCi0gICAgICAgICAgICAgICAgICAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLmVxdWFscyhuYW1lc3BhY2VVUkkpICYmCi0gICAgICAgICAgICAgICAgICAibGFuZ3VhZ2UiLmVxdWFscyh0eXBlTmFtZSkpewotICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2RpbmcuTGFuZ3VhZ2UuRmFjdG9yeS5wYXJzZShyZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIGlmICgKLSAgICAgICAgICAgICAgICAgICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIuZXF1YWxzKG5hbWVzcGFjZVVSSSkgJiYKLSAgICAgICAgICAgICAgICAgICJFTlRJVFkiLmVxdWFscyh0eXBlTmFtZSkpewotICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2RpbmcuRU5USVRZLkZhY3RvcnkucGFyc2UocmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICBpZiAoCi0gICAgICAgICAgICAgICAgICAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLmVxdWFscyhuYW1lc3BhY2VVUkkpICYmCi0gICAgICAgICAgICAgICAgICAidW5zaWduZWRTaG9ydCIuZXF1YWxzKHR5cGVOYW1lKSl7Ci0gICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZy5VbnNpZ25lZFNob3J0LkZhY3RvcnkucGFyc2UocmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICBpZiAoCi0gICAgICAgICAgICAgICAgICAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLmVxdWFscyhuYW1lc3BhY2VVUkkpICYmCi0gICAgICAgICAgICAgICAgICAiTk1UT0tFTlMiLmVxdWFscyh0eXBlTmFtZSkpewotICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2RpbmcuTk1UT0tFTlMuRmFjdG9yeS5wYXJzZShyZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIGlmICgKLSAgICAgICAgICAgICAgICAgICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIuZXF1YWxzKG5hbWVzcGFjZVVSSSkgJiYKLSAgICAgICAgICAgICAgICAgICJOQ05hbWUiLmVxdWFscyh0eXBlTmFtZSkpewotICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2RpbmcuTkNOYW1lLkZhY3RvcnkucGFyc2UocmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICBpZiAoCi0gICAgICAgICAgICAgICAgICAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLmVxdWFscyhuYW1lc3BhY2VVUkkpICYmCi0gICAgICAgICAgICAgICAgICAiZ01vbnRoRGF5Ii5lcXVhbHModHlwZU5hbWUpKXsKLSAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLkdNb250aERheS5GYWN0b3J5LnBhcnNlKHJlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgaWYgKAotICAgICAgICAgICAgICAgICAgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi5lcXVhbHMobmFtZXNwYWNlVVJJKSAmJgotICAgICAgICAgICAgICAgICAgInRpbWUiLmVxdWFscyh0eXBlTmFtZSkpewotICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2RpbmcuVGltZS5GYWN0b3J5LnBhcnNlKHJlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgaWYgKAotICAgICAgICAgICAgICAgICAgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi5lcXVhbHMobmFtZXNwYWNlVVJJKSAmJgotICAgICAgICAgICAgICAgICAgInRva2VuIi5lcXVhbHModHlwZU5hbWUpKXsKLSAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLlRva2VuLkZhY3RvcnkucGFyc2UocmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICBpZiAoCi0gICAgICAgICAgICAgICAgICAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLmVxdWFscyhuYW1lc3BhY2VVUkkpICYmCi0gICAgICAgICAgICAgICAgICAidW5zaWduZWRCeXRlIi5lcXVhbHModHlwZU5hbWUpKXsKLSAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLlVuc2lnbmVkQnl0ZS5GYWN0b3J5LnBhcnNlKHJlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgaWYgKAotICAgICAgICAgICAgICAgICAgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi5lcXVhbHMobmFtZXNwYWNlVVJJKSAmJgotICAgICAgICAgICAgICAgICAgIm5vbk5lZ2F0aXZlSW50ZWdlciIuZXF1YWxzKHR5cGVOYW1lKSl7Ci0gICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZy5Ob25OZWdhdGl2ZUludGVnZXIuRmFjdG9yeS5wYXJzZShyZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIGlmICgKLSAgICAgICAgICAgICAgICAgICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIuZXF1YWxzKG5hbWVzcGFjZVVSSSkgJiYKLSAgICAgICAgICAgICAgICAgICJiYXNlNjQiLmVxdWFscyh0eXBlTmFtZSkpewotICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2RpbmcuQmFzZTY0LkZhY3RvcnkucGFyc2UocmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICBpZiAoCi0gICAgICAgICAgICAgICAgICAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLmVxdWFscyhuYW1lc3BhY2VVUkkpICYmCi0gICAgICAgICAgICAgICAgICAic3RyaW5nIi5lcXVhbHModHlwZU5hbWUpKXsKLSAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLlN0cmluZy5GYWN0b3J5LnBhcnNlKHJlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgaWYgKAotICAgICAgICAgICAgICAgICAgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi5lcXVhbHMobmFtZXNwYWNlVVJJKSAmJgotICAgICAgICAgICAgICAgICAgImhleEJpbmFyeSIuZXF1YWxzKHR5cGVOYW1lKSl7Ci0gICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZy5IZXhCaW5hcnkuRmFjdG9yeS5wYXJzZShyZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIGlmICgKLSAgICAgICAgICAgICAgICAgICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIuZXF1YWxzKG5hbWVzcGFjZVVSSSkgJiYKLSAgICAgICAgICAgICAgICAgICJOT1RBVElPTiIuZXF1YWxzKHR5cGVOYW1lKSl7Ci0gICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZy5OT1RBVElPTi5GYWN0b3J5LnBhcnNlKHJlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgaWYgKAotICAgICAgICAgICAgICAgICAgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi5lcXVhbHMobmFtZXNwYWNlVVJJKSAmJgotICAgICAgICAgICAgICAgICAgImRhdGUiLmVxdWFscyh0eXBlTmFtZSkpewotICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2RpbmcuRGF0ZS5GYWN0b3J5LnBhcnNlKHJlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgaWYgKAotICAgICAgICAgICAgICAgICAgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi5lcXVhbHMobmFtZXNwYWNlVVJJKSAmJgotICAgICAgICAgICAgICAgICAgInBvc2l0aXZlSW50ZWdlciIuZXF1YWxzKHR5cGVOYW1lKSl7Ci0gICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZy5Qb3NpdGl2ZUludGVnZXIuRmFjdG9yeS5wYXJzZShyZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIGlmICgKLSAgICAgICAgICAgICAgICAgICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIuZXF1YWxzKG5hbWVzcGFjZVVSSSkgJiYKLSAgICAgICAgICAgICAgICAgICJOYW1lIi5lcXVhbHModHlwZU5hbWUpKXsKLSAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLk5hbWUuRmFjdG9yeS5wYXJzZShyZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIGlmICgKLSAgICAgICAgICAgICAgICAgICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIuZXF1YWxzKG5hbWVzcGFjZVVSSSkgJiYKLSAgICAgICAgICAgICAgICAgICJkZWNpbWFsIi5lcXVhbHModHlwZU5hbWUpKXsKLSAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLkRlY2ltYWwuRmFjdG9yeS5wYXJzZShyZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIGlmICgKLSAgICAgICAgICAgICAgICAgICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIuZXF1YWxzKG5hbWVzcGFjZVVSSSkgJiYKLSAgICAgICAgICAgICAgICAgICJRTmFtZSIuZXF1YWxzKHR5cGVOYW1lKSl7Ci0gICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZy5RTmFtZS5GYWN0b3J5LnBhcnNlKHJlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIGlmICgKLSAgICAgICAgICAgICAgICAgICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIuZXF1YWxzKG5hbWVzcGFjZVVSSSkgJiYKLSAgICAgICAgICAgICAgICAgICJkdXJhdGlvbiIuZXF1YWxzKHR5cGVOYW1lKSl7Ci0gICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZy5EdXJhdGlvbi5GYWN0b3J5LnBhcnNlKHJlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgaWYgKAotICAgICAgICAgICAgICAgICAgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi5lcXVhbHMobmFtZXNwYWNlVVJJKSAmJgotICAgICAgICAgICAgICAgICAgIlN0cnVjdCIuZXF1YWxzKHR5cGVOYW1lKSl7Ci0gICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZy5TdHJ1Y3QuRmFjdG9yeS5wYXJzZShyZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIGlmICgKLSAgICAgICAgICAgICAgICAgICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIuZXF1YWxzKG5hbWVzcGFjZVVSSSkgJiYKLSAgICAgICAgICAgICAgICAgICJnWWVhck1vbnRoIi5lcXVhbHModHlwZU5hbWUpKXsKLSAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLkdZZWFyTW9udGguRmFjdG9yeS5wYXJzZShyZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIGlmICgKLSAgICAgICAgICAgICAgICAgICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIuZXF1YWxzKG5hbWVzcGFjZVVSSSkgJiYKLSAgICAgICAgICAgICAgICAgICJnTW9udGgiLmVxdWFscyh0eXBlTmFtZSkpewotICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2RpbmcuR01vbnRoLkZhY3RvcnkucGFyc2UocmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICBpZiAoCi0gICAgICAgICAgICAgICAgICAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLmVxdWFscyhuYW1lc3BhY2VVUkkpICYmCi0gICAgICAgICAgICAgICAgICAibG9uZyIuZXF1YWxzKHR5cGVOYW1lKSl7Ci0gICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZy5fbG9uZy5GYWN0b3J5LnBhcnNlKHJlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgaWYgKAotICAgICAgICAgICAgICAgICAgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi5lcXVhbHMobmFtZXNwYWNlVVJJKSAmJgotICAgICAgICAgICAgICAgICAgImdZZWFyIi5lcXVhbHModHlwZU5hbWUpKXsKLSAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLkdZZWFyLkZhY3RvcnkucGFyc2UocmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICBpZiAoCi0gICAgICAgICAgICAgICAgICAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLmVxdWFscyhuYW1lc3BhY2VVUkkpICYmCi0gICAgICAgICAgICAgICAgICAiaW50ZWdlciIuZXF1YWxzKHR5cGVOYW1lKSl7Ci0gICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZy5JbnRlZ2VyLkZhY3RvcnkucGFyc2UocmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICBpZiAoCi0gICAgICAgICAgICAgICAgICAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLmVxdWFscyhuYW1lc3BhY2VVUkkpICYmCi0gICAgICAgICAgICAgICAgICAiZ0RheSIuZXF1YWxzKHR5cGVOYW1lKSl7Ci0gICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZy5HRGF5LkZhY3RvcnkucGFyc2UocmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICBpZiAoCi0gICAgICAgICAgICAgICAgICAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLmVxdWFscyhuYW1lc3BhY2VVUkkpICYmCi0gICAgICAgICAgICAgICAgICAiZmxvYXQiLmVxdWFscyh0eXBlTmFtZSkpewotICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2RpbmcuX2Zsb2F0LkZhY3RvcnkucGFyc2UocmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICBpZiAoCi0gICAgICAgICAgICAgICAgICAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLmVxdWFscyhuYW1lc3BhY2VVUkkpICYmCi0gICAgICAgICAgICAgICAgICAiRU5USVRJRVMiLmVxdWFscyh0eXBlTmFtZSkpewotICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2RpbmcuRU5USVRJRVMuRmFjdG9yeS5wYXJzZShyZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIGlmICgKLSAgICAgICAgICAgICAgICAgICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIuZXF1YWxzKG5hbWVzcGFjZVVSSSkgJiYKLSAgICAgICAgICAgICAgICAgICJkYXRlVGltZSIuZXF1YWxzKHR5cGVOYW1lKSl7Ci0gICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZy5EYXRlVGltZS5GYWN0b3J5LnBhcnNlKHJlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgaWYgKAotICAgICAgICAgICAgICAgICAgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi5lcXVhbHMobmFtZXNwYWNlVVJJKSAmJgotICAgICAgICAgICAgICAgICAgImJ5dGUiLmVxdWFscyh0eXBlTmFtZSkpewotICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2RpbmcuX2J5dGUuRmFjdG9yeS5wYXJzZShyZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIlVuc3VwcG9ydGVkIHR5cGUgIiArIG5hbWVzcGFjZVVSSSArICIgIiArIHR5cGVOYW1lKTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvR0RheS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9HRGF5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0MGUzMTUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9HRGF5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDMgKzAsMCBAQAotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIEdEYXkuamF2YQotICoKLSAqIFRoaXMgZmlsZSB3YXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBXU0RMCi0gKiBieSB0aGUgQXBhY2hlIEF4aXMyIHZlcnNpb246IFNOQVBTSE9UICBCdWlsdCBvbiA6IERlYyAyMSwgMjAwNyAoMDQ6MDM6MzAgTEtUKQotICovCi0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBwYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nOwotICAgICAgICAgICAgCi0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiAgR0RheSBiZWFuIGNsYXNzCi0gICAgICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgcHVibGljICBjbGFzcyBHRGF5Ci0gICAgICAgIGltcGxlbWVudHMgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJCZWFuewotICAgICAgICAvKiBUaGlzIHR5cGUgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBwaWVjZSBvZiBzY2hlbWEgdGhhdCBoYWQKLSAgICAgICAgICAgICAgICBuYW1lID0gZ0RheQotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBVUkkgPSBodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLwotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBQcmVmaXggPSBuczEKLSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgCi0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZW5lcmF0ZVByZWZpeChqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICAgICAgaWYobmFtZXNwYWNlLmVxdWFscygiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iKSl7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJTT0FQLUVOQyI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgfQotCi0gICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogZmllbGQgZm9yIEdEYXkKLSAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuRGF5IGxvY2FsR0RheSA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgZ2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuRGF5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLkRheSBnZXRHRGF5KCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsR0RheTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIHNldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSBwYXJhbSBHRGF5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRHRGF5KG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuRGF5IHBhcmFtKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2NhbEdEYXk9cGFyYW07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbEdEYXkudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgIC8qKgotICAgICAqIGlzUmVhZGVyTVRPTUF3YXJlCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSByZWFkZXIgc3VwcG9ydHMgTVRPTQotICAgICAqLwotICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgewotICAgICAgICBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICB0cnl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBqYXZhLmxhbmcuQm9vbGVhbi5UUlVFLmVxdWFscyhyZWFkZXIuZ2V0UHJvcGVydHkob3JnLmFwYWNoZS5heGlvbS5vbS5PTUNvbnN0YW50cy5JU19EQVRBX0hBTkRMRVJTX0FXQVJFKSk7Ci0gICAgICAgIH1jYXRjaChqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlzUmVhZGVyTVRPTUF3YXJlOwotICAgfQotICAgICAKLSAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAqCi0gICAgICAgICogQHBhcmFtIHBhcmVudFFOYW1lCi0gICAgICAgICogQHBhcmFtIGZhY3RvcnkKLSAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgcHVibGljIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IGdldE9NRWxlbWVudCAoCi0gICAgICAgICAgICAgICBmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSkgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZSBkYXRhU291cmNlID0KLSAgICAgICAgICAgICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRGF0YVNvdXJjZSh0aGlzLHBhcmVudFFOYW1lKXsKLQotICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgR0RheS50aGlzLnNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5sbG9tLk9NU291cmNlZEVsZW1lbnRJbXBsKAotICAgICAgICAgICAgICAgcGFyZW50UU5hbWUsZmFjdG9yeSxkYXRhU291cmNlKTsKLSAgICAgICAgICAgIAotICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcixmYWxzZSk7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNlcmlhbGl6ZVR5cGUpCi0gICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgCi0KLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gcGFyZW50UU5hbWUuZ2V0UHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZSA9IHBhcmVudFFOYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlICE9IG51bGwpICYmIChuYW1lc3BhY2UudHJpbSgpLmxlbmd0aCgpID4gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgd3JpdGVyUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdyaXRlclByZWZpeCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KG5hbWVzcGFjZSwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocHJlZml4LCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgaWYgKHNlcmlhbGl6ZVR5cGUpewotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIik7Ci0gICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2VQcmVmaXggIT0gbnVsbCkgJiYgKG5hbWVzcGFjZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlUHJlZml4KyI6Z0RheSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgImdEYXkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxHRGF5PT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZSB0aGUgbmlsIGF0dHJpYnV0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oImdEYXkgY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxHRGF5KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBwcmVmaXgsamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICBpZiAoeG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0KLSAgICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0KLSAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLCBqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZU5hbWVzcGFjZSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlVmFsdWU7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gYXR0cmlidXRlUHJlZml4ICsgIjoiICsgcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsIGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIC8qKgotICAgICAgICAgKiAgbWV0aG9kIHRvIGhhbmRsZSBRbmFtZXMKLSAgICAgICAgICovCi0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWUoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMocHJlZml4ICsgIjoiICsgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGkuZSB0aGlzIGlzIHRoZSBkZWZhdWx0IG5hbWVzcGFjZQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZXMoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZVtdIHFuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgaWYgKHFuYW1lcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBzdG9yZSB0aGlzIGRhdGEgdW50aWwgbGFzdCBtb21lbnQgc2luY2UgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHdyaXRlIGFueQotICAgICAgICAgICAgICAgIC8vIG5hbWVzcGFjZSBkYXRhIGFmdGVyIHdyaXRpbmcgdGhlIGNoYXJhY3RvciBkYXRhCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZ0J1ZmZlciBzdHJpbmdUb1dyaXRlID0gbmV3IGphdmEubGFuZy5TdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBxbmFtZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZCgiICIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVVSSSA9IHFuYW1lc1tpXS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHByZWZpeCA9PSBudWxsKSB8fCAocHJlZml4Lmxlbmd0aCgpID09IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQocHJlZml4KS5hcHBlbmQoIjoiKS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhzdHJpbmdUb1dyaXRlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotCi0gICAgICAgICAvKioKLSAgICAgICAgICogUmVnaXN0ZXIgYSBuYW1lc3BhY2UgcHJlZml4Ci0gICAgICAgICAqLwotICAgICAgICAgcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHJlZ2lzdGVyUHJlZml4KGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoeG1sV3JpdGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHByZWZpeDsKLSAgICAgICAgICAgIH0KLQotCi0gIAotICAgICAgICAvKioKLSAgICAgICAgKiBkYXRhYmluZGluZyBtZXRob2QgdG8gZ2V0IGFuIFhNTCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdAotICAgICAgICAqCi0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciBnZXRQdWxsUGFyc2VyKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcU5hbWUpCi0gICAgICAgICAgICAgICAgICAgIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGVsZW1lbnRMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBhdHRyaWJMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXIuRUxFTUVOVF9URVhUKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbEdEYXkgIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsR0RheSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJnRGF5IGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVySW1wbChxTmFtZSwgZWxlbWVudExpc3QudG9BcnJheSgpLCBhdHRyaWJMaXN0LnRvQXJyYXkoKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAKLQotICAgICAvKioKLSAgICAgICogIEZhY3RvcnkgY2xhc3MgdGhhdCBrZWVwcyB0aGUgcGFyc2UgbWV0aG9kCi0gICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeXsKLQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBHRGF5IGZyb21TdHJpbmcoamF2YS5sYW5nLlN0cmluZyB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSl7Ci0gICAgICAgICAgICAgICAgICAgIEdEYXkgcmV0dXJuVmFsdWUgPSBuZXcgIEdEYXkoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUuc2V0R0RheSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb0dEYXkodmFsdWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIEdEYXkgZnJvbVN0cmluZyhqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudC5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IGNvbnRlbnQuc3Vic3RyaW5nKDAsY29udGVudC5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVcmkgPSB4bWxTdHJlYW1SZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEdEYXkuRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsbmFtZXNwYWNlVXJpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEdEYXkuRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsIiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAKLQotICAgICAgICAvKioKLSAgICAgICAgKiBzdGF0aWMgbWV0aG9kIHRvIGNyZWF0ZSB0aGUgb2JqZWN0Ci0gICAgICAgICogUHJlY29uZGl0aW9uOiAgSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIGN1cnJlbnQgb3IgbmV4dCBzdGFydCBlbGVtZW50IHN0YXJ0cyB0aGlzIG9iamVjdCBhbmQgYW55IGludGVydmVuaW5nIHJlYWRlciBldmVudHMgYXJlIGlnbm9yYWJsZQotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIG5vdCBhbiBlbGVtZW50LCBpdCBpcyBhIGNvbXBsZXggdHlwZSBhbmQgdGhlIHJlYWRlciBpcyBhdCB0aGUgZXZlbnQganVzdCBhZnRlciB0aGUgb3V0ZXIgc3RhcnQgZWxlbWVudAotICAgICAgICAqIFBvc3Rjb25kaXRpb246IElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCBpdHMgZW5kIGVsZW1lbnQKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBhIGNvbXBsZXggdHlwZSwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IHRoZSBlbmQgZWxlbWVudCBvZiBpdHMgb3V0ZXIgZWxlbWVudAotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIEdEYXkgcGFyc2UoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIEdEYXkgb2JqZWN0ID0KLSAgICAgICAgICAgICAgICBuZXcgR0RheSgpOwotCi0gICAgICAgICAgICBpbnQgZXZlbnQ7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5pbGxhYmxlVmFsdWUgPSBudWxsOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSIiOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2V1cmkgPSIiOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSAoIXJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICYmICFyZWFkZXIuaXNFbmRFbGVtZW50KCkpCi0gICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiKSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGZ1bGxUeXBlTmFtZSA9IHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiKTsKLSAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUhPW51bGwpewotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zUHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoMCxmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IG5zUHJlZml4PT1udWxsPyIiOm5zUHJlZml4OwotCi0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgdHlwZSA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSsxKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEiZ0RheSIuZXF1YWxzKHR5cGUpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9maW5kIG5hbWVzcGFjZSBmb3IgdGhlIHByZWZpeAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zVXJpID0gcmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkobnNQcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKEdEYXkpb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2RpbmcuRXh0ZW5zaW9uTWFwcGVyLmdldFR5cGVPYmplY3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNVcmksdHlwZSxyZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gTm90ZSBhbGwgYXR0cmlidXRlcyB0aGF0IHdlcmUgaGFuZGxlZC4gVXNlZCB0byBkaWZmZXIgbm9ybWFsIGF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgICAvLyBmcm9tIGFueUF0dHJpYnV0ZXMuCi0gICAgICAgICAgICAgICAgamF2YS51dGlsLlZlY3RvciBoYW5kbGVkQXR0cmlidXRlcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUoIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQgPSByZWFkZXIuZ2V0RWxlbWVudFRleHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5zZXRHRGF5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9HRGF5KGNvbnRlbnQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBFbmQgb2YgaWYgZm9yIGV4cGVjdGVkIHByb3BlcnR5IHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2V7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBzdGFydCBlbGVtZW50IHdlIGFyZSBub3QgZXhwZWN0aW5nIGluZGljYXRlcyBhbiBpbnZhbGlkIHBhcmFtZXRlciB3YXMgcGFzc2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJVbmV4cGVjdGVkIHN1YmVsZW1lbnQgIiArIHJlYWRlci5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gZW5kIG9mIHdoaWxlIGxvb3AKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0KLQotICAgICAgICAgICAgfSBjYXRjaCAoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gb2JqZWN0OwotICAgICAgICB9Ci0KLSAgICAgICAgfS8vZW5kIG9mIGZhY3RvcnkgY2xhc3MKLQotICAgICAgICAKLQotICAgICAgICB9Ci0gICAgICAgICAgIAotICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvR01vbnRoLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL0dNb250aC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDgxOTQzLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvR01vbnRoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDMgKzAsMCBAQAotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIEdNb250aC5qYXZhCi0gKgotICogVGhpcyBmaWxlIHdhcyBhdXRvLWdlbmVyYXRlZCBmcm9tIFdTREwKLSAqIGJ5IHRoZSBBcGFjaGUgQXhpczIgdmVyc2lvbjogU05BUFNIT1QgIEJ1aWx0IG9uIDogRGVjIDIxLCAyMDA3ICgwNDowMzozMCBMS1QpCi0gKi8KLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2Rpbmc7Ci0gICAgICAgICAgICAKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqICBHTW9udGggYmVhbiBjbGFzcwotICAgICAgICAgICAgKi8KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyAgY2xhc3MgR01vbnRoCi0gICAgICAgIGltcGxlbWVudHMgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJCZWFuewotICAgICAgICAvKiBUaGlzIHR5cGUgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBwaWVjZSBvZiBzY2hlbWEgdGhhdCBoYWQKLSAgICAgICAgICAgICAgICBuYW1lID0gZ01vbnRoCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFVSSSA9IGh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFByZWZpeCA9IG5zMQotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdlbmVyYXRlUHJlZml4KGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB7Ci0gICAgICAgICAgICBpZihuYW1lc3BhY2UuZXF1YWxzKCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIpKXsKLSAgICAgICAgICAgICAgICByZXR1cm4gIlNPQVAtRU5DIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBmaWVsZCBmb3IgR01vbnRoCi0gICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLk1vbnRoIGxvY2FsR01vbnRoIDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBnZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5Nb250aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5Nb250aCBnZXRHTW9udGgoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxHTW9udGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBzZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gcGFyYW0gR01vbnRoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRHTW9udGgob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5Nb250aCBwYXJhbSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYWxHTW9udGg9cGFyYW07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbEdNb250aC50b1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgLyoqCi0gICAgICogaXNSZWFkZXJNVE9NQXdhcmUKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlYWRlciBzdXBwb3J0cyBNVE9NCi0gICAgICovCi0gICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIHRyeXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGphdmEubGFuZy5Cb29sZWFuLlRSVUUuZXF1YWxzKHJlYWRlci5nZXRQcm9wZXJ0eShvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQ29uc3RhbnRzLklTX0RBVEFfSEFORExFUlNfQVdBUkUpKTsKLSAgICAgICAgfWNhdGNoKGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXNSZWFkZXJNVE9NQXdhcmU7Ci0gICB9Ci0gICAgIAotICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICoKLSAgICAgICAgKiBAcGFyYW0gcGFyZW50UU5hbWUKLSAgICAgICAgKiBAcGFyYW0gZmFjdG9yeQotICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICBwdWJsaWMgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgZ2V0T01FbGVtZW50ICgKLSAgICAgICAgICAgICAgIGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5KSB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlIGRhdGFTb3VyY2UgPQotICAgICAgICAgICAgICAgICAgICAgICBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJEYXRhU291cmNlKHRoaXMscGFyZW50UU5hbWUpewotCi0gICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICBHTW9udGgudGhpcy5zZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5PTVNvdXJjZWRFbGVtZW50SW1wbCgKLSAgICAgICAgICAgICAgIHBhcmVudFFOYW1lLGZhY3RvcnksZGF0YVNvdXJjZSk7Ci0gICAgICAgICAgICAKLSAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIsZmFsc2UpOwotICAgICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzZXJpYWxpemVUeXBlKQotICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotCi0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UgPSBudWxsOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHBhcmVudFFOYW1lLmdldFByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UgPSBwYXJlbnRRTmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZSAhPSBudWxsKSAmJiAobmFtZXNwYWNlLnRyaW0oKS5sZW5ndGgoKSA+IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHdyaXRlclByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3cml0ZXJQcmVmaXggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChuYW1lc3BhY2UsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHByZWZpeCwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCksIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIGlmIChzZXJpYWxpemVUeXBlKXsKLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIpOwotICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlUHJlZml4ICE9IG51bGwpICYmIChuYW1lc3BhY2VQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkpewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVByZWZpeCsiOmdNb250aCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgImdNb250aCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbEdNb250aD09bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgdGhlIG5pbCBhdHRyaWJ1dGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJnTW9udGggY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxHTW9udGgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRoIHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCxqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgIGlmICh4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLQotICAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsIGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlTmFtZXNwYWNlID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVWYWx1ZTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBhdHRyaWJ1dGVQcmVmaXggKyAiOiIgKyBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSwgYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICBtZXRob2QgdG8gaGFuZGxlIFFuYW1lcwotICAgICAgICAgKi8KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZShqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhwcmVmaXggKyAiOiIgKyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaS5lIHRoaXMgaXMgdGhlIGRlZmF1bHQgbmFtZXNwYWNlCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lcyhqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lW10gcW5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICBpZiAocW5hbWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHRvIHN0b3JlIHRoaXMgZGF0YSB1bnRpbCBsYXN0IG1vbWVudCBzaW5jZSBpdCBpcyBub3QgcG9zc2libGUgdG8gd3JpdGUgYW55Ci0gICAgICAgICAgICAgICAgLy8gbmFtZXNwYWNlIGRhdGEgYWZ0ZXIgd3JpdGluZyB0aGUgY2hhcmFjdG9yIGRhdGEKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIHN0cmluZ1RvV3JpdGUgPSBuZXcgamF2YS5sYW5nLlN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHFuYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKCIgIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlVVJJID0gcW5hbWVzW2ldLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocHJlZml4ID09IG51bGwpIHx8IChwcmVmaXgubGVuZ3RoKCkgPT0gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChwcmVmaXgpLmFwcGVuZCgiOiIpLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHN0cmluZ1RvV3JpdGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0KLSAgICAgICAgIC8qKgotICAgICAgICAgKiBSZWdpc3RlciBhIG5hbWVzcGFjZSBwcmVmaXgKLSAgICAgICAgICovCi0gICAgICAgICBwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgcmVnaXN0ZXJQcmVmaXgoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLCBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlICh4bWxXcml0ZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gcHJlZml4OwotICAgICAgICAgICAgfQotCi0KLSAgCi0gICAgICAgIC8qKgotICAgICAgICAqIGRhdGFiaW5kaW5nIG1ldGhvZCB0byBnZXQgYW4gWE1MIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0Ci0gICAgICAgICoKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIGdldFB1bGxQYXJzZXIoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxTmFtZSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgZWxlbWVudExpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGF0dHJpYkxpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlci5FTEVNRU5UX1RFWFQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsR01vbnRoICE9IG51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbEdNb250aCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJnTW9udGggY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXJJbXBsKHFOYW1lLCBlbGVtZW50TGlzdC50b0FycmF5KCksIGF0dHJpYkxpc3QudG9BcnJheSgpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gIAotCi0gICAgIC8qKgotICAgICAgKiAgRmFjdG9yeSBjbGFzcyB0aGF0IGtlZXBzIHRoZSBwYXJzZSBtZXRob2QKLSAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5ewotCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIEdNb250aCBmcm9tU3RyaW5nKGphdmEubGFuZy5TdHJpbmcgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkpewotICAgICAgICAgICAgICAgICAgICBHTW9udGggcmV0dXJuVmFsdWUgPSBuZXcgIEdNb250aCgpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZS5zZXRHTW9udGgoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9HTW9udGgodmFsdWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIEdNb250aCBmcm9tU3RyaW5nKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50LmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gY29udGVudC5zdWJzdHJpbmcoMCxjb250ZW50LmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVyaSA9IHhtbFN0cmVhbVJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gR01vbnRoLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LG5hbWVzcGFjZVVyaSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBHTW9udGguRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsIiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAKLQotICAgICAgICAvKioKLSAgICAgICAgKiBzdGF0aWMgbWV0aG9kIHRvIGNyZWF0ZSB0aGUgb2JqZWN0Ci0gICAgICAgICogUHJlY29uZGl0aW9uOiAgSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIGN1cnJlbnQgb3IgbmV4dCBzdGFydCBlbGVtZW50IHN0YXJ0cyB0aGlzIG9iamVjdCBhbmQgYW55IGludGVydmVuaW5nIHJlYWRlciBldmVudHMgYXJlIGlnbm9yYWJsZQotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIG5vdCBhbiBlbGVtZW50LCBpdCBpcyBhIGNvbXBsZXggdHlwZSBhbmQgdGhlIHJlYWRlciBpcyBhdCB0aGUgZXZlbnQganVzdCBhZnRlciB0aGUgb3V0ZXIgc3RhcnQgZWxlbWVudAotICAgICAgICAqIFBvc3Rjb25kaXRpb246IElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCBpdHMgZW5kIGVsZW1lbnQKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBhIGNvbXBsZXggdHlwZSwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IHRoZSBlbmQgZWxlbWVudCBvZiBpdHMgb3V0ZXIgZWxlbWVudAotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIEdNb250aCBwYXJzZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uewotICAgICAgICAgICAgR01vbnRoIG9iamVjdCA9Ci0gICAgICAgICAgICAgICAgbmV3IEdNb250aCgpOwotCi0gICAgICAgICAgICBpbnQgZXZlbnQ7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5pbGxhYmxlVmFsdWUgPSBudWxsOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSIiOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2V1cmkgPSIiOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSAoIXJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICYmICFyZWFkZXIuaXNFbmRFbGVtZW50KCkpCi0gICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiKSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGZ1bGxUeXBlTmFtZSA9IHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiKTsKLSAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUhPW51bGwpewotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zUHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoMCxmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IG5zUHJlZml4PT1udWxsPyIiOm5zUHJlZml4OwotCi0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgdHlwZSA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSsxKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEiZ01vbnRoIi5lcXVhbHModHlwZSkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2ZpbmQgbmFtZXNwYWNlIGZvciB0aGUgcHJlZml4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNVcmkgPSByZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShuc1ByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoR01vbnRoKW9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLkV4dGVuc2lvbk1hcHBlci5nZXRUeXBlT2JqZWN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zVXJpLHR5cGUscmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIE5vdGUgYWxsIGF0dHJpYnV0ZXMgdGhhdCB3ZXJlIGhhbmRsZWQuIFVzZWQgdG8gZGlmZmVyIG5vcm1hbCBhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgICAgLy8gZnJvbSBhbnlBdHRyaWJ1dGVzLgotICAgICAgICAgICAgICAgIGphdmEudXRpbC5WZWN0b3IgaGFuZGxlZEF0dHJpYnV0ZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlKCFyZWFkZXIuaXNFbmRFbGVtZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50ID0gcmVhZGVyLmdldEVsZW1lbnRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0R01vbnRoKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9HTW9udGgoY29udGVudCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIEVuZCBvZiBpZiBmb3IgZXhwZWN0ZWQgcHJvcGVydHkgc3RhcnQgZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHN0YXJ0IGVsZW1lbnQgd2UgYXJlIG5vdCBleHBlY3RpbmcgaW5kaWNhdGVzIGFuIGludmFsaWQgcGFyYW1ldGVyIHdhcyBwYXNzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIlVuZXhwZWN0ZWQgc3ViZWxlbWVudCAiICsgcmVhZGVyLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBlbmQgb2Ygd2hpbGUgbG9vcAotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLQotCi0gICAgICAgICAgICB9IGNhdGNoIChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEubGFuZy5FeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBvYmplY3Q7Ci0gICAgICAgIH0KLQotICAgICAgICB9Ly9lbmQgb2YgZmFjdG9yeSBjbGFzcwotCi0gICAgICAgIAotCi0gICAgICAgIH0KLSAgICAgICAgICAgCi0gICAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9HTW9udGhEYXkuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvR01vbnRoRGF5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3MGQxMmEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9HTW9udGhEYXkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwMyArMCwwIEBACi0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICogR01vbnRoRGF5LmphdmEKLSAqCi0gKiBUaGlzIGZpbGUgd2FzIGF1dG8tZ2VuZXJhdGVkIGZyb20gV1NETAotICogYnkgdGhlIEFwYWNoZSBBeGlzMiB2ZXJzaW9uOiBTTkFQU0hPVCAgQnVpbHQgb24gOiBEZWMgMjEsIDIwMDcgKDA0OjAzOjMwIExLVCkKLSAqLwotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZzsKLSAgICAgICAgICAgIAotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogIEdNb250aERheSBiZWFuIGNsYXNzCi0gICAgICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgcHVibGljICBjbGFzcyBHTW9udGhEYXkKLSAgICAgICAgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkJlYW57Ci0gICAgICAgIC8qIFRoaXMgdHlwZSB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIHBpZWNlIG9mIHNjaGVtYSB0aGF0IGhhZAotICAgICAgICAgICAgICAgIG5hbWUgPSBnTW9udGhEYXkKLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgVVJJID0gaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8KLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgUHJlZml4ID0gbnMxCi0gICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIAotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2VuZXJhdGVQcmVmaXgoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHsKLSAgICAgICAgICAgIGlmKG5hbWVzcGFjZS5lcXVhbHMoImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIikpewotICAgICAgICAgICAgICAgIHJldHVybiAiU09BUC1FTkMiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgIH0KLQotICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIGZpZWxkIGZvciBHTW9udGhEYXkKLSAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuTW9udGhEYXkgbG9jYWxHTW9udGhEYXkgOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIGdldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLk1vbnRoRGF5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLk1vbnRoRGF5IGdldEdNb250aERheSgpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbEdNb250aERheTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIHNldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSBwYXJhbSBHTW9udGhEYXkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldEdNb250aERheShvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLk1vbnRoRGF5IHBhcmFtKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2NhbEdNb250aERheT1wYXJhbTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsR01vbnRoRGF5LnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAvKioKLSAgICAgKiBpc1JlYWRlck1UT01Bd2FyZQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVhZGVyIHN1cHBvcnRzIE1UT00KLSAgICAgKi8KLSAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKLSAgICAgICAgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICAKLSAgICAgICAgdHJ5ewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gamF2YS5sYW5nLkJvb2xlYW4uVFJVRS5lcXVhbHMocmVhZGVyLmdldFByb3BlcnR5KG9yZy5hcGFjaGUuYXhpb20ub20uT01Db25zdGFudHMuSVNfREFUQV9IQU5ETEVSU19BV0FSRSkpOwotICAgICAgICB9Y2F0Y2goamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpc1JlYWRlck1UT01Bd2FyZTsKLSAgIH0KLSAgICAgCi0gICAgIAotICAgICAgICAvKioKLSAgICAgICAgKgotICAgICAgICAqIEBwYXJhbSBwYXJlbnRRTmFtZQotICAgICAgICAqIEBwYXJhbSBmYWN0b3J5Ci0gICAgICAgICogQHJldHVybiBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudAotICAgICAgICAqLwotICAgICAgIHB1YmxpYyBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCBnZXRPTUVsZW1lbnQgKAotICAgICAgICAgICAgICAgZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnkpIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTURhdGFTb3VyY2UgZGF0YVNvdXJjZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkRhdGFTb3VyY2UodGhpcyxwYXJlbnRRTmFtZSl7Ci0KLSAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgIEdNb250aERheS50aGlzLnNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5sbG9tLk9NU291cmNlZEVsZW1lbnRJbXBsKAotICAgICAgICAgICAgICAgcGFyZW50UU5hbWUsZmFjdG9yeSxkYXRhU291cmNlKTsKLSAgICAgICAgICAgIAotICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcixmYWxzZSk7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNlcmlhbGl6ZVR5cGUpCi0gICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgCi0KLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gcGFyZW50UU5hbWUuZ2V0UHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZSA9IHBhcmVudFFOYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlICE9IG51bGwpICYmIChuYW1lc3BhY2UudHJpbSgpLmxlbmd0aCgpID4gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgd3JpdGVyUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdyaXRlclByZWZpeCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KG5hbWVzcGFjZSwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocHJlZml4LCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgaWYgKHNlcmlhbGl6ZVR5cGUpewotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIik7Ci0gICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2VQcmVmaXggIT0gbnVsbCkgJiYgKG5hbWVzcGFjZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlUHJlZml4KyI6Z01vbnRoRGF5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiZ01vbnRoRGF5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsR01vbnRoRGF5PT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZSB0aGUgbmlsIGF0dHJpYnV0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oImdNb250aERheSBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbEdNb250aERheSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGggdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgcHJlZml4LGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgaWYgKHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotCi0gICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotCi0gICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSwgamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVOYW1lc3BhY2UgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgoYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVZhbHVlOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IGF0dHJpYnV0ZVByZWZpeCArICI6IiArIHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLCBhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAvKioKLSAgICAgICAgICogIG1ldGhvZCB0byBoYW5kbGUgUW5hbWVzCi0gICAgICAgICAqLwotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHByZWZpeCArICI6IiArIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBpLmUgdGhpcyBpcyB0aGUgZGVmYXVsdCBuYW1lc3BhY2UKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVzKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWVbXSBxbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgIGlmIChxbmFtZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gc3RvcmUgdGhpcyBkYXRhIHVudGlsIGxhc3QgbW9tZW50IHNpbmNlIGl0IGlzIG5vdCBwb3NzaWJsZSB0byB3cml0ZSBhbnkKLSAgICAgICAgICAgICAgICAvLyBuYW1lc3BhY2UgZGF0YSBhZnRlciB3cml0aW5nIHRoZSBjaGFyYWN0b3IgZGF0YQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmdCdWZmZXIgc3RyaW5nVG9Xcml0ZSA9IG5ldyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcW5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQoIiAiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VVUkkgPSBxbmFtZXNbaV0uZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwcmVmaXggPT0gbnVsbCkgfHwgKHByZWZpeC5sZW5ndGgoKSA9PSAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKHByZWZpeCkuYXBwZW5kKCI6IikuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMoc3RyaW5nVG9Xcml0ZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAqIFJlZ2lzdGVyIGEgbmFtZXNwYWNlIHByZWZpeAotICAgICAgICAgKi8KLSAgICAgICAgIHByaXZhdGUgamF2YS5sYW5nLlN0cmluZyByZWdpc3RlclByZWZpeChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHhtbFdyaXRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiBwcmVmaXg7Ci0gICAgICAgICAgICB9Ci0KLQotICAKLSAgICAgICAgLyoqCi0gICAgICAgICogZGF0YWJpbmRpbmcgbWV0aG9kIHRvIGdldCBhbiBYTUwgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QKLSAgICAgICAgKgotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgZ2V0UHVsbFBhcnNlcihqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFOYW1lKQotICAgICAgICAgICAgICAgICAgICB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBlbGVtZW50TGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgYXR0cmliTGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVyLkVMRU1FTlRfVEVYVCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxHTW9udGhEYXkgIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsR01vbnRoRGF5KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oImdNb250aERheSBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlckltcGwocU5hbWUsIGVsZW1lbnRMaXN0LnRvQXJyYXkoKSwgYXR0cmliTGlzdC50b0FycmF5KCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgCi0KLSAgICAgLyoqCi0gICAgICAqICBGYWN0b3J5IGNsYXNzIHRoYXQga2VlcHMgdGhlIHBhcnNlIG1ldGhvZAotICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3Rvcnl7Ci0KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgR01vbnRoRGF5IGZyb21TdHJpbmcoamF2YS5sYW5nLlN0cmluZyB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSl7Ci0gICAgICAgICAgICAgICAgICAgIEdNb250aERheSByZXR1cm5WYWx1ZSA9IG5ldyAgR01vbnRoRGF5KCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlLnNldEdNb250aERheSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb0dNb250aERheSh2YWx1ZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgR01vbnRoRGF5IGZyb21TdHJpbmcoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBjb250ZW50LnN1YnN0cmluZygwLGNvbnRlbnQuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVXJpID0geG1sU3RyZWFtUmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBHTW9udGhEYXkuRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsbmFtZXNwYWNlVXJpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEdNb250aERheS5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCwiIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIAotCi0gICAgICAgIC8qKgotICAgICAgICAqIHN0YXRpYyBtZXRob2QgdG8gY3JlYXRlIHRoZSBvYmplY3QKLSAgICAgICAgKiBQcmVjb25kaXRpb246ICBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgY3VycmVudCBvciBuZXh0IHN0YXJ0IGVsZW1lbnQgc3RhcnRzIHRoaXMgb2JqZWN0IGFuZCBhbnkgaW50ZXJ2ZW5pbmcgcmVhZGVyIGV2ZW50cyBhcmUgaWdub3JhYmxlCi0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgbm90IGFuIGVsZW1lbnQsIGl0IGlzIGEgY29tcGxleCB0eXBlIGFuZCB0aGUgcmVhZGVyIGlzIGF0IHRoZSBldmVudCBqdXN0IGFmdGVyIHRoZSBvdXRlciBzdGFydCBlbGVtZW50Ci0gICAgICAgICogUG9zdGNvbmRpdGlvbjogSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IGl0cyBlbmQgZWxlbWVudAotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIGEgY29tcGxleCB0eXBlLCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgdGhlIGVuZCBlbGVtZW50IG9mIGl0cyBvdXRlciBlbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgR01vbnRoRGF5IHBhcnNlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb257Ci0gICAgICAgICAgICBHTW9udGhEYXkgb2JqZWN0ID0KLSAgICAgICAgICAgICAgICBuZXcgR01vbnRoRGF5KCk7Ci0KLSAgICAgICAgICAgIGludCBldmVudDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmlsbGFibGVWYWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IiI7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZXVyaSA9IiI7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlICghcmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgJiYgIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkKLSAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIpIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgZnVsbFR5cGVOYW1lID0gcmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAidHlwZSIpOwotICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNQcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZygwLGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gbnNQcmVmaXg9PW51bGw/IiI6bnNQcmVmaXg7Ci0KLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB0eXBlID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZyhmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKzEpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISJnTW9udGhEYXkiLmVxdWFscyh0eXBlKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZmluZCBuYW1lc3BhY2UgZm9yIHRoZSBwcmVmaXgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1VyaSA9IHJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKG5zUHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChHTW9udGhEYXkpb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2RpbmcuRXh0ZW5zaW9uTWFwcGVyLmdldFR5cGVPYmplY3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNVcmksdHlwZSxyZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gTm90ZSBhbGwgYXR0cmlidXRlcyB0aGF0IHdlcmUgaGFuZGxlZC4gVXNlZCB0byBkaWZmZXIgbm9ybWFsIGF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgICAvLyBmcm9tIGFueUF0dHJpYnV0ZXMuCi0gICAgICAgICAgICAgICAgamF2YS51dGlsLlZlY3RvciBoYW5kbGVkQXR0cmlidXRlcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUoIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQgPSByZWFkZXIuZ2V0RWxlbWVudFRleHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5zZXRHTW9udGhEYXkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb0dNb250aERheShjb250ZW50KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gRW5kIG9mIGlmIGZvciBleHBlY3RlZCBwcm9wZXJ0eSBzdGFydCBlbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgc3RhcnQgZWxlbWVudCB3ZSBhcmUgbm90IGV4cGVjdGluZyBpbmRpY2F0ZXMgYW4gaW52YWxpZCBwYXJhbWV0ZXIgd2FzIHBhc3NlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiVW5leHBlY3RlZCBzdWJlbGVtZW50ICIgKyByZWFkZXIuZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIGVuZCBvZiB3aGlsZSBsb29wCi0gICAgICAgICAgICAgICAgICAgICAgICAKLQotCi0KLSAgICAgICAgICAgIH0gY2F0Y2ggKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5sYW5nLkV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG9iamVjdDsKLSAgICAgICAgfQotCi0gICAgICAgIH0vL2VuZCBvZiBmYWN0b3J5IGNsYXNzCi0KLSAgICAgICAgCi0KLSAgICAgICAgfQotICAgICAgICAgICAKLSAgICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL0dZZWFyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL0dZZWFyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwM2Q5YmMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9HWWVhci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAzICswLDAgQEAKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBHWWVhci5qYXZhCi0gKgotICogVGhpcyBmaWxlIHdhcyBhdXRvLWdlbmVyYXRlZCBmcm9tIFdTREwKLSAqIGJ5IHRoZSBBcGFjaGUgQXhpczIgdmVyc2lvbjogU05BUFNIT1QgIEJ1aWx0IG9uIDogRGVjIDIxLCAyMDA3ICgwNDowMzozMCBMS1QpCi0gKi8KLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2Rpbmc7Ci0gICAgICAgICAgICAKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqICBHWWVhciBiZWFuIGNsYXNzCi0gICAgICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgcHVibGljICBjbGFzcyBHWWVhcgotICAgICAgICBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCQmVhbnsKLSAgICAgICAgLyogVGhpcyB0eXBlIHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgcGllY2Ugb2Ygc2NoZW1hIHRoYXQgaGFkCi0gICAgICAgICAgICAgICAgbmFtZSA9IGdZZWFyCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFVSSSA9IGh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFByZWZpeCA9IG5zMQotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdlbmVyYXRlUHJlZml4KGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB7Ci0gICAgICAgICAgICBpZihuYW1lc3BhY2UuZXF1YWxzKCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIpKXsKLSAgICAgICAgICAgICAgICByZXR1cm4gIlNPQVAtRU5DIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBmaWVsZCBmb3IgR1llYXIKLSAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuWWVhciBsb2NhbEdZZWFyIDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBnZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5ZZWFyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLlllYXIgZ2V0R1llYXIoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxHWWVhcjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIHNldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSBwYXJhbSBHWWVhcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0R1llYXIob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5ZZWFyIHBhcmFtKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2NhbEdZZWFyPXBhcmFtOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxHWWVhci50b1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgLyoqCi0gICAgICogaXNSZWFkZXJNVE9NQXdhcmUKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlYWRlciBzdXBwb3J0cyBNVE9NCi0gICAgICovCi0gICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIHRyeXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGphdmEubGFuZy5Cb29sZWFuLlRSVUUuZXF1YWxzKHJlYWRlci5nZXRQcm9wZXJ0eShvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQ29uc3RhbnRzLklTX0RBVEFfSEFORExFUlNfQVdBUkUpKTsKLSAgICAgICAgfWNhdGNoKGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXNSZWFkZXJNVE9NQXdhcmU7Ci0gICB9Ci0gICAgIAotICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICoKLSAgICAgICAgKiBAcGFyYW0gcGFyZW50UU5hbWUKLSAgICAgICAgKiBAcGFyYW0gZmFjdG9yeQotICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICBwdWJsaWMgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgZ2V0T01FbGVtZW50ICgKLSAgICAgICAgICAgICAgIGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5KSB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlIGRhdGFTb3VyY2UgPQotICAgICAgICAgICAgICAgICAgICAgICBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJEYXRhU291cmNlKHRoaXMscGFyZW50UU5hbWUpewotCi0gICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICBHWWVhci50aGlzLnNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5sbG9tLk9NU291cmNlZEVsZW1lbnRJbXBsKAotICAgICAgICAgICAgICAgcGFyZW50UU5hbWUsZmFjdG9yeSxkYXRhU291cmNlKTsKLSAgICAgICAgICAgIAotICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcixmYWxzZSk7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNlcmlhbGl6ZVR5cGUpCi0gICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgCi0KLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gcGFyZW50UU5hbWUuZ2V0UHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZSA9IHBhcmVudFFOYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlICE9IG51bGwpICYmIChuYW1lc3BhY2UudHJpbSgpLmxlbmd0aCgpID4gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgd3JpdGVyUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdyaXRlclByZWZpeCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KG5hbWVzcGFjZSwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocHJlZml4LCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgaWYgKHNlcmlhbGl6ZVR5cGUpewotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIik7Ci0gICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2VQcmVmaXggIT0gbnVsbCkgJiYgKG5hbWVzcGFjZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlUHJlZml4KyI6Z1llYXIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJnWWVhciIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbEdZZWFyPT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZSB0aGUgbmlsIGF0dHJpYnV0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oImdZZWFyIGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsR1llYXIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRoIHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCxqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgIGlmICh4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLQotICAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsIGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlTmFtZXNwYWNlID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVWYWx1ZTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBhdHRyaWJ1dGVQcmVmaXggKyAiOiIgKyBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSwgYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICBtZXRob2QgdG8gaGFuZGxlIFFuYW1lcwotICAgICAgICAgKi8KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZShqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhwcmVmaXggKyAiOiIgKyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaS5lIHRoaXMgaXMgdGhlIGRlZmF1bHQgbmFtZXNwYWNlCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lcyhqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lW10gcW5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICBpZiAocW5hbWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHRvIHN0b3JlIHRoaXMgZGF0YSB1bnRpbCBsYXN0IG1vbWVudCBzaW5jZSBpdCBpcyBub3QgcG9zc2libGUgdG8gd3JpdGUgYW55Ci0gICAgICAgICAgICAgICAgLy8gbmFtZXNwYWNlIGRhdGEgYWZ0ZXIgd3JpdGluZyB0aGUgY2hhcmFjdG9yIGRhdGEKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIHN0cmluZ1RvV3JpdGUgPSBuZXcgamF2YS5sYW5nLlN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHFuYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKCIgIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlVVJJID0gcW5hbWVzW2ldLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocHJlZml4ID09IG51bGwpIHx8IChwcmVmaXgubGVuZ3RoKCkgPT0gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChwcmVmaXgpLmFwcGVuZCgiOiIpLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHN0cmluZ1RvV3JpdGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0KLSAgICAgICAgIC8qKgotICAgICAgICAgKiBSZWdpc3RlciBhIG5hbWVzcGFjZSBwcmVmaXgKLSAgICAgICAgICovCi0gICAgICAgICBwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgcmVnaXN0ZXJQcmVmaXgoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLCBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlICh4bWxXcml0ZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gcHJlZml4OwotICAgICAgICAgICAgfQotCi0KLSAgCi0gICAgICAgIC8qKgotICAgICAgICAqIGRhdGFiaW5kaW5nIG1ldGhvZCB0byBnZXQgYW4gWE1MIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0Ci0gICAgICAgICoKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIGdldFB1bGxQYXJzZXIoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxTmFtZSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgZWxlbWVudExpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGF0dHJpYkxpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlci5FTEVNRU5UX1RFWFQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsR1llYXIgIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsR1llYXIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiZ1llYXIgY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXJJbXBsKHFOYW1lLCBlbGVtZW50TGlzdC50b0FycmF5KCksIGF0dHJpYkxpc3QudG9BcnJheSgpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gIAotCi0gICAgIC8qKgotICAgICAgKiAgRmFjdG9yeSBjbGFzcyB0aGF0IGtlZXBzIHRoZSBwYXJzZSBtZXRob2QKLSAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5ewotCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIEdZZWFyIGZyb21TdHJpbmcoamF2YS5sYW5nLlN0cmluZyB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSl7Ci0gICAgICAgICAgICAgICAgICAgIEdZZWFyIHJldHVyblZhbHVlID0gbmV3ICBHWWVhcigpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZS5zZXRHWWVhcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb0dZZWFyKHZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBHWWVhciBmcm9tU3RyaW5nKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50LmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gY29udGVudC5zdWJzdHJpbmcoMCxjb250ZW50LmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVyaSA9IHhtbFN0cmVhbVJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gR1llYXIuRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsbmFtZXNwYWNlVXJpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEdZZWFyLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LCIiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgCi0KLSAgICAgICAgLyoqCi0gICAgICAgICogc3RhdGljIG1ldGhvZCB0byBjcmVhdGUgdGhlIG9iamVjdAotICAgICAgICAqIFByZWNvbmRpdGlvbjogIElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSBjdXJyZW50IG9yIG5leHQgc3RhcnQgZWxlbWVudCBzdGFydHMgdGhpcyBvYmplY3QgYW5kIGFueSBpbnRlcnZlbmluZyByZWFkZXIgZXZlbnRzIGFyZSBpZ25vcmFibGUKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBub3QgYW4gZWxlbWVudCwgaXQgaXMgYSBjb21wbGV4IHR5cGUgYW5kIHRoZSByZWFkZXIgaXMgYXQgdGhlIGV2ZW50IGp1c3QgYWZ0ZXIgdGhlIG91dGVyIHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgKiBQb3N0Y29uZGl0aW9uOiBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgaXRzIGVuZCBlbGVtZW50Ci0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgYSBjb21wbGV4IHR5cGUsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCB0aGUgZW5kIGVsZW1lbnQgb2YgaXRzIG91dGVyIGVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBHWWVhciBwYXJzZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uewotICAgICAgICAgICAgR1llYXIgb2JqZWN0ID0KLSAgICAgICAgICAgICAgICBuZXcgR1llYXIoKTsKLQotICAgICAgICAgICAgaW50IGV2ZW50OwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuaWxsYWJsZVZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0iIjsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNldXJpID0iIjsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUgKCFyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAmJiAhcmVhZGVyLmlzRW5kRWxlbWVudCgpKQotICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIikhPW51bGwpewotICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBmdWxsVHlwZU5hbWUgPSByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIik7Ci0gICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1ByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKDAsZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBuc1ByZWZpeD09bnVsbD8iIjpuc1ByZWZpeDsKLQotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHR5cGUgPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikrMSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghImdZZWFyIi5lcXVhbHModHlwZSkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2ZpbmQgbmFtZXNwYWNlIGZvciB0aGUgcHJlZml4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNVcmkgPSByZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShuc1ByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoR1llYXIpb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2RpbmcuRXh0ZW5zaW9uTWFwcGVyLmdldFR5cGVPYmplY3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNVcmksdHlwZSxyZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gTm90ZSBhbGwgYXR0cmlidXRlcyB0aGF0IHdlcmUgaGFuZGxlZC4gVXNlZCB0byBkaWZmZXIgbm9ybWFsIGF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgICAvLyBmcm9tIGFueUF0dHJpYnV0ZXMuCi0gICAgICAgICAgICAgICAgamF2YS51dGlsLlZlY3RvciBoYW5kbGVkQXR0cmlidXRlcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUoIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQgPSByZWFkZXIuZ2V0RWxlbWVudFRleHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5zZXRHWWVhcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvR1llYXIoY29udGVudCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIEVuZCBvZiBpZiBmb3IgZXhwZWN0ZWQgcHJvcGVydHkgc3RhcnQgZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHN0YXJ0IGVsZW1lbnQgd2UgYXJlIG5vdCBleHBlY3RpbmcgaW5kaWNhdGVzIGFuIGludmFsaWQgcGFyYW1ldGVyIHdhcyBwYXNzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIlVuZXhwZWN0ZWQgc3ViZWxlbWVudCAiICsgcmVhZGVyLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBlbmQgb2Ygd2hpbGUgbG9vcAotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLQotCi0gICAgICAgICAgICB9IGNhdGNoIChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEubGFuZy5FeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBvYmplY3Q7Ci0gICAgICAgIH0KLQotICAgICAgICB9Ly9lbmQgb2YgZmFjdG9yeSBjbGFzcwotCi0gICAgICAgIAotCi0gICAgICAgIH0KLSAgICAgICAgICAgCi0gICAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9HWWVhck1vbnRoLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL0dZZWFyTW9udGguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZkNTkyMC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL0dZZWFyTW9udGguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwMyArMCwwIEBACi0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICogR1llYXJNb250aC5qYXZhCi0gKgotICogVGhpcyBmaWxlIHdhcyBhdXRvLWdlbmVyYXRlZCBmcm9tIFdTREwKLSAqIGJ5IHRoZSBBcGFjaGUgQXhpczIgdmVyc2lvbjogU05BUFNIT1QgIEJ1aWx0IG9uIDogRGVjIDIxLCAyMDA3ICgwNDowMzozMCBMS1QpCi0gKi8KLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2Rpbmc7Ci0gICAgICAgICAgICAKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqICBHWWVhck1vbnRoIGJlYW4gY2xhc3MKLSAgICAgICAgICAgICovCi0gICAgICAgIAotICAgICAgICBwdWJsaWMgIGNsYXNzIEdZZWFyTW9udGgKLSAgICAgICAgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkJlYW57Ci0gICAgICAgIC8qIFRoaXMgdHlwZSB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIHBpZWNlIG9mIHNjaGVtYSB0aGF0IGhhZAotICAgICAgICAgICAgICAgIG5hbWUgPSBnWWVhck1vbnRoCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFVSSSA9IGh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFByZWZpeCA9IG5zMQotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdlbmVyYXRlUHJlZml4KGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB7Ci0gICAgICAgICAgICBpZihuYW1lc3BhY2UuZXF1YWxzKCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIpKXsKLSAgICAgICAgICAgICAgICByZXR1cm4gIlNPQVAtRU5DIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBmaWVsZCBmb3IgR1llYXJNb250aAotICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5ZZWFyTW9udGggbG9jYWxHWWVhck1vbnRoIDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBnZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5ZZWFyTW9udGgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuWWVhck1vbnRoIGdldEdZZWFyTW9udGgoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxHWWVhck1vbnRoOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgc2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtIHBhcmFtIEdZZWFyTW9udGgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldEdZZWFyTW9udGgob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5ZZWFyTW9udGggcGFyYW0pewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2FsR1llYXJNb250aD1wYXJhbTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsR1llYXJNb250aC50b1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgLyoqCi0gICAgICogaXNSZWFkZXJNVE9NQXdhcmUKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlYWRlciBzdXBwb3J0cyBNVE9NCi0gICAgICovCi0gICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIHRyeXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGphdmEubGFuZy5Cb29sZWFuLlRSVUUuZXF1YWxzKHJlYWRlci5nZXRQcm9wZXJ0eShvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQ29uc3RhbnRzLklTX0RBVEFfSEFORExFUlNfQVdBUkUpKTsKLSAgICAgICAgfWNhdGNoKGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXNSZWFkZXJNVE9NQXdhcmU7Ci0gICB9Ci0gICAgIAotICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICoKLSAgICAgICAgKiBAcGFyYW0gcGFyZW50UU5hbWUKLSAgICAgICAgKiBAcGFyYW0gZmFjdG9yeQotICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICBwdWJsaWMgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgZ2V0T01FbGVtZW50ICgKLSAgICAgICAgICAgICAgIGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5KSB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlIGRhdGFTb3VyY2UgPQotICAgICAgICAgICAgICAgICAgICAgICBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJEYXRhU291cmNlKHRoaXMscGFyZW50UU5hbWUpewotCi0gICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICBHWWVhck1vbnRoLnRoaXMuc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmxsb20uT01Tb3VyY2VkRWxlbWVudEltcGwoCi0gICAgICAgICAgICAgICBwYXJlbnRRTmFtZSxmYWN0b3J5LGRhdGFTb3VyY2UpOwotICAgICAgICAgICAgCi0gICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyLGZhbHNlKTsKLSAgICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VyaWFsaXplVHlwZSkKLSAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLQotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBwYXJlbnRRTmFtZS5nZXRQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlID0gcGFyZW50UU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2UgIT0gbnVsbCkgJiYgKG5hbWVzcGFjZS50cmltKCkubGVuZ3RoKCkgPiAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB3cml0ZXJQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAod3JpdGVyUHJlZml4ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQobmFtZXNwYWNlLCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwcmVmaXgsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICBpZiAoc2VyaWFsaXplVHlwZSl7Ci0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iKTsKLSAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZVByZWZpeCAhPSBudWxsKSAmJiAobmFtZXNwYWNlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApKXsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VQcmVmaXgrIjpnWWVhck1vbnRoIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiZ1llYXJNb250aCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbEdZZWFyTW9udGg9PW51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIHRoZSBuaWwgYXR0cmlidXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiZ1llYXJNb250aCBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbEdZZWFyTW9udGgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRoIHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCxqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgIGlmICh4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLQotICAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsIGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlTmFtZXNwYWNlID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVWYWx1ZTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBhdHRyaWJ1dGVQcmVmaXggKyAiOiIgKyBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSwgYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICBtZXRob2QgdG8gaGFuZGxlIFFuYW1lcwotICAgICAgICAgKi8KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZShqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhwcmVmaXggKyAiOiIgKyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaS5lIHRoaXMgaXMgdGhlIGRlZmF1bHQgbmFtZXNwYWNlCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lcyhqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lW10gcW5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICBpZiAocW5hbWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHRvIHN0b3JlIHRoaXMgZGF0YSB1bnRpbCBsYXN0IG1vbWVudCBzaW5jZSBpdCBpcyBub3QgcG9zc2libGUgdG8gd3JpdGUgYW55Ci0gICAgICAgICAgICAgICAgLy8gbmFtZXNwYWNlIGRhdGEgYWZ0ZXIgd3JpdGluZyB0aGUgY2hhcmFjdG9yIGRhdGEKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIHN0cmluZ1RvV3JpdGUgPSBuZXcgamF2YS5sYW5nLlN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHFuYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKCIgIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlVVJJID0gcW5hbWVzW2ldLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocHJlZml4ID09IG51bGwpIHx8IChwcmVmaXgubGVuZ3RoKCkgPT0gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChwcmVmaXgpLmFwcGVuZCgiOiIpLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHN0cmluZ1RvV3JpdGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0KLSAgICAgICAgIC8qKgotICAgICAgICAgKiBSZWdpc3RlciBhIG5hbWVzcGFjZSBwcmVmaXgKLSAgICAgICAgICovCi0gICAgICAgICBwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgcmVnaXN0ZXJQcmVmaXgoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLCBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlICh4bWxXcml0ZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gcHJlZml4OwotICAgICAgICAgICAgfQotCi0KLSAgCi0gICAgICAgIC8qKgotICAgICAgICAqIGRhdGFiaW5kaW5nIG1ldGhvZCB0byBnZXQgYW4gWE1MIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0Ci0gICAgICAgICoKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIGdldFB1bGxQYXJzZXIoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxTmFtZSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgZWxlbWVudExpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGF0dHJpYkxpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlci5FTEVNRU5UX1RFWFQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsR1llYXJNb250aCAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxHWWVhck1vbnRoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oImdZZWFyTW9udGggY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXJJbXBsKHFOYW1lLCBlbGVtZW50TGlzdC50b0FycmF5KCksIGF0dHJpYkxpc3QudG9BcnJheSgpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gIAotCi0gICAgIC8qKgotICAgICAgKiAgRmFjdG9yeSBjbGFzcyB0aGF0IGtlZXBzIHRoZSBwYXJzZSBtZXRob2QKLSAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5ewotCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIEdZZWFyTW9udGggZnJvbVN0cmluZyhqYXZhLmxhbmcuU3RyaW5nIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJKXsKLSAgICAgICAgICAgICAgICAgICAgR1llYXJNb250aCByZXR1cm5WYWx1ZSA9IG5ldyAgR1llYXJNb250aCgpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZS5zZXRHWWVhck1vbnRoKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvR1llYXJNb250aCh2YWx1ZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgR1llYXJNb250aCBmcm9tU3RyaW5nKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50LmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gY29udGVudC5zdWJzdHJpbmcoMCxjb250ZW50LmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVyaSA9IHhtbFN0cmVhbVJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gR1llYXJNb250aC5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCxuYW1lc3BhY2VVcmkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gR1llYXJNb250aC5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCwiIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIAotCi0gICAgICAgIC8qKgotICAgICAgICAqIHN0YXRpYyBtZXRob2QgdG8gY3JlYXRlIHRoZSBvYmplY3QKLSAgICAgICAgKiBQcmVjb25kaXRpb246ICBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgY3VycmVudCBvciBuZXh0IHN0YXJ0IGVsZW1lbnQgc3RhcnRzIHRoaXMgb2JqZWN0IGFuZCBhbnkgaW50ZXJ2ZW5pbmcgcmVhZGVyIGV2ZW50cyBhcmUgaWdub3JhYmxlCi0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgbm90IGFuIGVsZW1lbnQsIGl0IGlzIGEgY29tcGxleCB0eXBlIGFuZCB0aGUgcmVhZGVyIGlzIGF0IHRoZSBldmVudCBqdXN0IGFmdGVyIHRoZSBvdXRlciBzdGFydCBlbGVtZW50Ci0gICAgICAgICogUG9zdGNvbmRpdGlvbjogSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IGl0cyBlbmQgZWxlbWVudAotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIGEgY29tcGxleCB0eXBlLCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgdGhlIGVuZCBlbGVtZW50IG9mIGl0cyBvdXRlciBlbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgR1llYXJNb250aCBwYXJzZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uewotICAgICAgICAgICAgR1llYXJNb250aCBvYmplY3QgPQotICAgICAgICAgICAgICAgIG5ldyBHWWVhck1vbnRoKCk7Ci0KLSAgICAgICAgICAgIGludCBldmVudDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmlsbGFibGVWYWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IiI7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZXVyaSA9IiI7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlICghcmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgJiYgIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkKLSAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIpIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgZnVsbFR5cGVOYW1lID0gcmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAidHlwZSIpOwotICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNQcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZygwLGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gbnNQcmVmaXg9PW51bGw/IiI6bnNQcmVmaXg7Ci0KLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB0eXBlID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZyhmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKzEpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISJnWWVhck1vbnRoIi5lcXVhbHModHlwZSkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2ZpbmQgbmFtZXNwYWNlIGZvciB0aGUgcHJlZml4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNVcmkgPSByZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShuc1ByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoR1llYXJNb250aClvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZy5FeHRlbnNpb25NYXBwZXIuZ2V0VHlwZU9iamVjdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc1VyaSx0eXBlLHJlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBOb3RlIGFsbCBhdHRyaWJ1dGVzIHRoYXQgd2VyZSBoYW5kbGVkLiBVc2VkIHRvIGRpZmZlciBub3JtYWwgYXR0cmlidXRlcwotICAgICAgICAgICAgICAgIC8vIGZyb20gYW55QXR0cmlidXRlcy4KLSAgICAgICAgICAgICAgICBqYXZhLnV0aWwuVmVjdG9yIGhhbmRsZWRBdHRyaWJ1dGVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSghcmVhZGVyLmlzRW5kRWxlbWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCA9IHJlYWRlci5nZXRFbGVtZW50VGV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldEdZZWFyTW9udGgoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb0dZZWFyTW9udGgoY29udGVudCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIEVuZCBvZiBpZiBmb3IgZXhwZWN0ZWQgcHJvcGVydHkgc3RhcnQgZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHN0YXJ0IGVsZW1lbnQgd2UgYXJlIG5vdCBleHBlY3RpbmcgaW5kaWNhdGVzIGFuIGludmFsaWQgcGFyYW1ldGVyIHdhcyBwYXNzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIlVuZXhwZWN0ZWQgc3ViZWxlbWVudCAiICsgcmVhZGVyLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBlbmQgb2Ygd2hpbGUgbG9vcAotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLQotCi0gICAgICAgICAgICB9IGNhdGNoIChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEubGFuZy5FeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBvYmplY3Q7Ci0gICAgICAgIH0KLQotICAgICAgICB9Ly9lbmQgb2YgZmFjdG9yeSBjbGFzcwotCi0gICAgICAgIAotCi0gICAgICAgIH0KLSAgICAgICAgICAgCi0gICAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9IZXhCaW5hcnkuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvSGV4QmluYXJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjOWFiODkuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9IZXhCaW5hcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwMyArMCwwIEBACi0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICogSGV4QmluYXJ5LmphdmEKLSAqCi0gKiBUaGlzIGZpbGUgd2FzIGF1dG8tZ2VuZXJhdGVkIGZyb20gV1NETAotICogYnkgdGhlIEFwYWNoZSBBeGlzMiB2ZXJzaW9uOiBTTkFQU0hPVCAgQnVpbHQgb24gOiBEZWMgMjEsIDIwMDcgKDA0OjAzOjMwIExLVCkKLSAqLwotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZzsKLSAgICAgICAgICAgIAotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogIEhleEJpbmFyeSBiZWFuIGNsYXNzCi0gICAgICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgcHVibGljICBjbGFzcyBIZXhCaW5hcnkKLSAgICAgICAgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkJlYW57Ci0gICAgICAgIC8qIFRoaXMgdHlwZSB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIHBpZWNlIG9mIHNjaGVtYSB0aGF0IGhhZAotICAgICAgICAgICAgICAgIG5hbWUgPSBoZXhCaW5hcnkKLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgVVJJID0gaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8KLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgUHJlZml4ID0gbnMxCi0gICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIAotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2VuZXJhdGVQcmVmaXgoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHsKLSAgICAgICAgICAgIGlmKG5hbWVzcGFjZS5lcXVhbHMoImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIikpewotICAgICAgICAgICAgICAgIHJldHVybiAiU09BUC1FTkMiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgIH0KLQotICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIGZpZWxkIGZvciBIZXhCaW5hcnkKLSAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuSGV4QmluYXJ5IGxvY2FsSGV4QmluYXJ5IDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBnZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5IZXhCaW5hcnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuSGV4QmluYXJ5IGdldEhleEJpbmFyeSgpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbEhleEJpbmFyeTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIHNldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSBwYXJhbSBIZXhCaW5hcnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldEhleEJpbmFyeShvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLkhleEJpbmFyeSBwYXJhbSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYWxIZXhCaW5hcnk9cGFyYW07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbEhleEJpbmFyeS50b1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgLyoqCi0gICAgICogaXNSZWFkZXJNVE9NQXdhcmUKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlYWRlciBzdXBwb3J0cyBNVE9NCi0gICAgICovCi0gICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIHRyeXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGphdmEubGFuZy5Cb29sZWFuLlRSVUUuZXF1YWxzKHJlYWRlci5nZXRQcm9wZXJ0eShvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQ29uc3RhbnRzLklTX0RBVEFfSEFORExFUlNfQVdBUkUpKTsKLSAgICAgICAgfWNhdGNoKGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXNSZWFkZXJNVE9NQXdhcmU7Ci0gICB9Ci0gICAgIAotICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICoKLSAgICAgICAgKiBAcGFyYW0gcGFyZW50UU5hbWUKLSAgICAgICAgKiBAcGFyYW0gZmFjdG9yeQotICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICBwdWJsaWMgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgZ2V0T01FbGVtZW50ICgKLSAgICAgICAgICAgICAgIGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5KSB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlIGRhdGFTb3VyY2UgPQotICAgICAgICAgICAgICAgICAgICAgICBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJEYXRhU291cmNlKHRoaXMscGFyZW50UU5hbWUpewotCi0gICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICBIZXhCaW5hcnkudGhpcy5zZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5PTVNvdXJjZWRFbGVtZW50SW1wbCgKLSAgICAgICAgICAgICAgIHBhcmVudFFOYW1lLGZhY3RvcnksZGF0YVNvdXJjZSk7Ci0gICAgICAgICAgICAKLSAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIsZmFsc2UpOwotICAgICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzZXJpYWxpemVUeXBlKQotICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotCi0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UgPSBudWxsOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHBhcmVudFFOYW1lLmdldFByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UgPSBwYXJlbnRRTmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZSAhPSBudWxsKSAmJiAobmFtZXNwYWNlLnRyaW0oKS5sZW5ndGgoKSA+IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHdyaXRlclByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3cml0ZXJQcmVmaXggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChuYW1lc3BhY2UsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHByZWZpeCwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCksIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIGlmIChzZXJpYWxpemVUeXBlKXsKLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIpOwotICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlUHJlZml4ICE9IG51bGwpICYmIChuYW1lc3BhY2VQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkpewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVByZWZpeCsiOmhleEJpbmFyeSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgImhleEJpbmFyeSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbEhleEJpbmFyeT09bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgdGhlIG5pbCBhdHRyaWJ1dGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJoZXhCaW5hcnkgY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxIZXhCaW5hcnkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRoIHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCxqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgIGlmICh4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLQotICAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsIGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlTmFtZXNwYWNlID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVWYWx1ZTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBhdHRyaWJ1dGVQcmVmaXggKyAiOiIgKyBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSwgYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICBtZXRob2QgdG8gaGFuZGxlIFFuYW1lcwotICAgICAgICAgKi8KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZShqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhwcmVmaXggKyAiOiIgKyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaS5lIHRoaXMgaXMgdGhlIGRlZmF1bHQgbmFtZXNwYWNlCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lcyhqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lW10gcW5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICBpZiAocW5hbWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHRvIHN0b3JlIHRoaXMgZGF0YSB1bnRpbCBsYXN0IG1vbWVudCBzaW5jZSBpdCBpcyBub3QgcG9zc2libGUgdG8gd3JpdGUgYW55Ci0gICAgICAgICAgICAgICAgLy8gbmFtZXNwYWNlIGRhdGEgYWZ0ZXIgd3JpdGluZyB0aGUgY2hhcmFjdG9yIGRhdGEKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIHN0cmluZ1RvV3JpdGUgPSBuZXcgamF2YS5sYW5nLlN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHFuYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKCIgIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlVVJJID0gcW5hbWVzW2ldLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocHJlZml4ID09IG51bGwpIHx8IChwcmVmaXgubGVuZ3RoKCkgPT0gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChwcmVmaXgpLmFwcGVuZCgiOiIpLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHN0cmluZ1RvV3JpdGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0KLSAgICAgICAgIC8qKgotICAgICAgICAgKiBSZWdpc3RlciBhIG5hbWVzcGFjZSBwcmVmaXgKLSAgICAgICAgICovCi0gICAgICAgICBwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgcmVnaXN0ZXJQcmVmaXgoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLCBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlICh4bWxXcml0ZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gcHJlZml4OwotICAgICAgICAgICAgfQotCi0KLSAgCi0gICAgICAgIC8qKgotICAgICAgICAqIGRhdGFiaW5kaW5nIG1ldGhvZCB0byBnZXQgYW4gWE1MIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0Ci0gICAgICAgICoKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIGdldFB1bGxQYXJzZXIoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxTmFtZSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgZWxlbWVudExpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGF0dHJpYkxpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlci5FTEVNRU5UX1RFWFQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsSGV4QmluYXJ5ICE9IG51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbEhleEJpbmFyeSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJoZXhCaW5hcnkgY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXJJbXBsKHFOYW1lLCBlbGVtZW50TGlzdC50b0FycmF5KCksIGF0dHJpYkxpc3QudG9BcnJheSgpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gIAotCi0gICAgIC8qKgotICAgICAgKiAgRmFjdG9yeSBjbGFzcyB0aGF0IGtlZXBzIHRoZSBwYXJzZSBtZXRob2QKLSAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5ewotCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIEhleEJpbmFyeSBmcm9tU3RyaW5nKGphdmEubGFuZy5TdHJpbmcgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkpewotICAgICAgICAgICAgICAgICAgICBIZXhCaW5hcnkgcmV0dXJuVmFsdWUgPSBuZXcgIEhleEJpbmFyeSgpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZS5zZXRIZXhCaW5hcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9IZXhCaW5hcnkodmFsdWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIEhleEJpbmFyeSBmcm9tU3RyaW5nKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50LmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gY29udGVudC5zdWJzdHJpbmcoMCxjb250ZW50LmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVyaSA9IHhtbFN0cmVhbVJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSGV4QmluYXJ5LkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LG5hbWVzcGFjZVVyaSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBIZXhCaW5hcnkuRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsIiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAKLQotICAgICAgICAvKioKLSAgICAgICAgKiBzdGF0aWMgbWV0aG9kIHRvIGNyZWF0ZSB0aGUgb2JqZWN0Ci0gICAgICAgICogUHJlY29uZGl0aW9uOiAgSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIGN1cnJlbnQgb3IgbmV4dCBzdGFydCBlbGVtZW50IHN0YXJ0cyB0aGlzIG9iamVjdCBhbmQgYW55IGludGVydmVuaW5nIHJlYWRlciBldmVudHMgYXJlIGlnbm9yYWJsZQotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIG5vdCBhbiBlbGVtZW50LCBpdCBpcyBhIGNvbXBsZXggdHlwZSBhbmQgdGhlIHJlYWRlciBpcyBhdCB0aGUgZXZlbnQganVzdCBhZnRlciB0aGUgb3V0ZXIgc3RhcnQgZWxlbWVudAotICAgICAgICAqIFBvc3Rjb25kaXRpb246IElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCBpdHMgZW5kIGVsZW1lbnQKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBhIGNvbXBsZXggdHlwZSwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IHRoZSBlbmQgZWxlbWVudCBvZiBpdHMgb3V0ZXIgZWxlbWVudAotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIEhleEJpbmFyeSBwYXJzZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uewotICAgICAgICAgICAgSGV4QmluYXJ5IG9iamVjdCA9Ci0gICAgICAgICAgICAgICAgbmV3IEhleEJpbmFyeSgpOwotCi0gICAgICAgICAgICBpbnQgZXZlbnQ7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5pbGxhYmxlVmFsdWUgPSBudWxsOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSIiOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2V1cmkgPSIiOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSAoIXJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICYmICFyZWFkZXIuaXNFbmRFbGVtZW50KCkpCi0gICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiKSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGZ1bGxUeXBlTmFtZSA9IHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiKTsKLSAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUhPW51bGwpewotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zUHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoMCxmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IG5zUHJlZml4PT1udWxsPyIiOm5zUHJlZml4OwotCi0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgdHlwZSA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSsxKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEiaGV4QmluYXJ5Ii5lcXVhbHModHlwZSkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2ZpbmQgbmFtZXNwYWNlIGZvciB0aGUgcHJlZml4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNVcmkgPSByZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShuc1ByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoSGV4QmluYXJ5KW9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLkV4dGVuc2lvbk1hcHBlci5nZXRUeXBlT2JqZWN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zVXJpLHR5cGUscmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIE5vdGUgYWxsIGF0dHJpYnV0ZXMgdGhhdCB3ZXJlIGhhbmRsZWQuIFVzZWQgdG8gZGlmZmVyIG5vcm1hbCBhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgICAgLy8gZnJvbSBhbnlBdHRyaWJ1dGVzLgotICAgICAgICAgICAgICAgIGphdmEudXRpbC5WZWN0b3IgaGFuZGxlZEF0dHJpYnV0ZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlKCFyZWFkZXIuaXNFbmRFbGVtZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50ID0gcmVhZGVyLmdldEVsZW1lbnRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0SGV4QmluYXJ5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9IZXhCaW5hcnkoY29udGVudCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIEVuZCBvZiBpZiBmb3IgZXhwZWN0ZWQgcHJvcGVydHkgc3RhcnQgZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHN0YXJ0IGVsZW1lbnQgd2UgYXJlIG5vdCBleHBlY3RpbmcgaW5kaWNhdGVzIGFuIGludmFsaWQgcGFyYW1ldGVyIHdhcyBwYXNzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIlVuZXhwZWN0ZWQgc3ViZWxlbWVudCAiICsgcmVhZGVyLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBlbmQgb2Ygd2hpbGUgbG9vcAotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLQotCi0gICAgICAgICAgICB9IGNhdGNoIChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEubGFuZy5FeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBvYmplY3Q7Ci0gICAgICAgIH0KLQotICAgICAgICB9Ly9lbmQgb2YgZmFjdG9yeSBjbGFzcwotCi0gICAgICAgIAotCi0gICAgICAgIH0KLSAgICAgICAgICAgCi0gICAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9JRC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9JRC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjQ0YjRmLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvSUQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwMyArMCwwIEBACi0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICogSUQuamF2YQotICoKLSAqIFRoaXMgZmlsZSB3YXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBXU0RMCi0gKiBieSB0aGUgQXBhY2hlIEF4aXMyIHZlcnNpb246IFNOQVBTSE9UICBCdWlsdCBvbiA6IERlYyAyMSwgMjAwNyAoMDQ6MDM6MzAgTEtUKQotICovCi0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBwYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nOwotICAgICAgICAgICAgCi0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiAgSUQgYmVhbiBjbGFzcwotICAgICAgICAgICAgKi8KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyAgY2xhc3MgSUQKLSAgICAgICAgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkJlYW57Ci0gICAgICAgIC8qIFRoaXMgdHlwZSB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIHBpZWNlIG9mIHNjaGVtYSB0aGF0IGhhZAotICAgICAgICAgICAgICAgIG5hbWUgPSBJRAotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBVUkkgPSBodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLwotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBQcmVmaXggPSBuczEKLSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgCi0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZW5lcmF0ZVByZWZpeChqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICAgICAgaWYobmFtZXNwYWNlLmVxdWFscygiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iKSl7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJTT0FQLUVOQyI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgfQotCi0gICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogZmllbGQgZm9yIElECi0gICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLklkIGxvY2FsSUQgOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIGdldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLklkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLklkIGdldElEKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsSUQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBzZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gcGFyYW0gSUQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldElEKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuSWQgcGFyYW0pewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2FsSUQ9cGFyYW07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbElELnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAvKioKLSAgICAgKiBpc1JlYWRlck1UT01Bd2FyZQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVhZGVyIHN1cHBvcnRzIE1UT00KLSAgICAgKi8KLSAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKLSAgICAgICAgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICAKLSAgICAgICAgdHJ5ewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gamF2YS5sYW5nLkJvb2xlYW4uVFJVRS5lcXVhbHMocmVhZGVyLmdldFByb3BlcnR5KG9yZy5hcGFjaGUuYXhpb20ub20uT01Db25zdGFudHMuSVNfREFUQV9IQU5ETEVSU19BV0FSRSkpOwotICAgICAgICB9Y2F0Y2goamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpc1JlYWRlck1UT01Bd2FyZTsKLSAgIH0KLSAgICAgCi0gICAgIAotICAgICAgICAvKioKLSAgICAgICAgKgotICAgICAgICAqIEBwYXJhbSBwYXJlbnRRTmFtZQotICAgICAgICAqIEBwYXJhbSBmYWN0b3J5Ci0gICAgICAgICogQHJldHVybiBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudAotICAgICAgICAqLwotICAgICAgIHB1YmxpYyBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCBnZXRPTUVsZW1lbnQgKAotICAgICAgICAgICAgICAgZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnkpIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTURhdGFTb3VyY2UgZGF0YVNvdXJjZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkRhdGFTb3VyY2UodGhpcyxwYXJlbnRRTmFtZSl7Ci0KLSAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgIElELnRoaXMuc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmxsb20uT01Tb3VyY2VkRWxlbWVudEltcGwoCi0gICAgICAgICAgICAgICBwYXJlbnRRTmFtZSxmYWN0b3J5LGRhdGFTb3VyY2UpOwotICAgICAgICAgICAgCi0gICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyLGZhbHNlKTsKLSAgICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VyaWFsaXplVHlwZSkKLSAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLQotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBwYXJlbnRRTmFtZS5nZXRQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlID0gcGFyZW50UU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2UgIT0gbnVsbCkgJiYgKG5hbWVzcGFjZS50cmltKCkubGVuZ3RoKCkgPiAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB3cml0ZXJQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAod3JpdGVyUHJlZml4ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQobmFtZXNwYWNlLCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwcmVmaXgsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICBpZiAoc2VyaWFsaXplVHlwZSl7Ci0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iKTsKLSAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZVByZWZpeCAhPSBudWxsKSAmJiAobmFtZXNwYWNlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApKXsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VQcmVmaXgrIjpJRCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIklEIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsSUQ9PW51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIHRoZSBuaWwgYXR0cmlidXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiSUQgY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxJRCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGggdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgcHJlZml4LGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgaWYgKHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotCi0gICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotCi0gICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSwgamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVOYW1lc3BhY2UgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgoYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVZhbHVlOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IGF0dHJpYnV0ZVByZWZpeCArICI6IiArIHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLCBhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAvKioKLSAgICAgICAgICogIG1ldGhvZCB0byBoYW5kbGUgUW5hbWVzCi0gICAgICAgICAqLwotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHByZWZpeCArICI6IiArIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBpLmUgdGhpcyBpcyB0aGUgZGVmYXVsdCBuYW1lc3BhY2UKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVzKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWVbXSBxbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgIGlmIChxbmFtZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gc3RvcmUgdGhpcyBkYXRhIHVudGlsIGxhc3QgbW9tZW50IHNpbmNlIGl0IGlzIG5vdCBwb3NzaWJsZSB0byB3cml0ZSBhbnkKLSAgICAgICAgICAgICAgICAvLyBuYW1lc3BhY2UgZGF0YSBhZnRlciB3cml0aW5nIHRoZSBjaGFyYWN0b3IgZGF0YQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmdCdWZmZXIgc3RyaW5nVG9Xcml0ZSA9IG5ldyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcW5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQoIiAiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VVUkkgPSBxbmFtZXNbaV0uZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwcmVmaXggPT0gbnVsbCkgfHwgKHByZWZpeC5sZW5ndGgoKSA9PSAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKHByZWZpeCkuYXBwZW5kKCI6IikuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMoc3RyaW5nVG9Xcml0ZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAqIFJlZ2lzdGVyIGEgbmFtZXNwYWNlIHByZWZpeAotICAgICAgICAgKi8KLSAgICAgICAgIHByaXZhdGUgamF2YS5sYW5nLlN0cmluZyByZWdpc3RlclByZWZpeChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHhtbFdyaXRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiBwcmVmaXg7Ci0gICAgICAgICAgICB9Ci0KLQotICAKLSAgICAgICAgLyoqCi0gICAgICAgICogZGF0YWJpbmRpbmcgbWV0aG9kIHRvIGdldCBhbiBYTUwgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QKLSAgICAgICAgKgotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgZ2V0UHVsbFBhcnNlcihqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFOYW1lKQotICAgICAgICAgICAgICAgICAgICB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBlbGVtZW50TGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgYXR0cmliTGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVyLkVMRU1FTlRfVEVYVCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxJRCAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxJRCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJJRCBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlckltcGwocU5hbWUsIGVsZW1lbnRMaXN0LnRvQXJyYXkoKSwgYXR0cmliTGlzdC50b0FycmF5KCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgCi0KLSAgICAgLyoqCi0gICAgICAqICBGYWN0b3J5IGNsYXNzIHRoYXQga2VlcHMgdGhlIHBhcnNlIG1ldGhvZAotICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3Rvcnl7Ci0KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgSUQgZnJvbVN0cmluZyhqYXZhLmxhbmcuU3RyaW5nIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJKXsKLSAgICAgICAgICAgICAgICAgICAgSUQgcmV0dXJuVmFsdWUgPSBuZXcgIElEKCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlLnNldElEKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvSUQodmFsdWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIElEIGZyb21TdHJpbmcoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBjb250ZW50LnN1YnN0cmluZygwLGNvbnRlbnQuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVXJpID0geG1sU3RyZWFtUmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJRC5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCxuYW1lc3BhY2VVcmkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSUQuRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsIiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAKLQotICAgICAgICAvKioKLSAgICAgICAgKiBzdGF0aWMgbWV0aG9kIHRvIGNyZWF0ZSB0aGUgb2JqZWN0Ci0gICAgICAgICogUHJlY29uZGl0aW9uOiAgSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIGN1cnJlbnQgb3IgbmV4dCBzdGFydCBlbGVtZW50IHN0YXJ0cyB0aGlzIG9iamVjdCBhbmQgYW55IGludGVydmVuaW5nIHJlYWRlciBldmVudHMgYXJlIGlnbm9yYWJsZQotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIG5vdCBhbiBlbGVtZW50LCBpdCBpcyBhIGNvbXBsZXggdHlwZSBhbmQgdGhlIHJlYWRlciBpcyBhdCB0aGUgZXZlbnQganVzdCBhZnRlciB0aGUgb3V0ZXIgc3RhcnQgZWxlbWVudAotICAgICAgICAqIFBvc3Rjb25kaXRpb246IElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCBpdHMgZW5kIGVsZW1lbnQKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBhIGNvbXBsZXggdHlwZSwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IHRoZSBlbmQgZWxlbWVudCBvZiBpdHMgb3V0ZXIgZWxlbWVudAotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIElEIHBhcnNlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb257Ci0gICAgICAgICAgICBJRCBvYmplY3QgPQotICAgICAgICAgICAgICAgIG5ldyBJRCgpOwotCi0gICAgICAgICAgICBpbnQgZXZlbnQ7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5pbGxhYmxlVmFsdWUgPSBudWxsOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSIiOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2V1cmkgPSIiOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSAoIXJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICYmICFyZWFkZXIuaXNFbmRFbGVtZW50KCkpCi0gICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiKSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGZ1bGxUeXBlTmFtZSA9IHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiKTsKLSAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUhPW51bGwpewotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zUHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoMCxmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IG5zUHJlZml4PT1udWxsPyIiOm5zUHJlZml4OwotCi0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgdHlwZSA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSsxKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEiSUQiLmVxdWFscyh0eXBlKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZmluZCBuYW1lc3BhY2UgZm9yIHRoZSBwcmVmaXgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1VyaSA9IHJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKG5zUHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChJRClvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZy5FeHRlbnNpb25NYXBwZXIuZ2V0VHlwZU9iamVjdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc1VyaSx0eXBlLHJlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBOb3RlIGFsbCBhdHRyaWJ1dGVzIHRoYXQgd2VyZSBoYW5kbGVkLiBVc2VkIHRvIGRpZmZlciBub3JtYWwgYXR0cmlidXRlcwotICAgICAgICAgICAgICAgIC8vIGZyb20gYW55QXR0cmlidXRlcy4KLSAgICAgICAgICAgICAgICBqYXZhLnV0aWwuVmVjdG9yIGhhbmRsZWRBdHRyaWJ1dGVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSghcmVhZGVyLmlzRW5kRWxlbWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCA9IHJlYWRlci5nZXRFbGVtZW50VGV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldElEKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9JRChjb250ZW50KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gRW5kIG9mIGlmIGZvciBleHBlY3RlZCBwcm9wZXJ0eSBzdGFydCBlbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgc3RhcnQgZWxlbWVudCB3ZSBhcmUgbm90IGV4cGVjdGluZyBpbmRpY2F0ZXMgYW4gaW52YWxpZCBwYXJhbWV0ZXIgd2FzIHBhc3NlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiVW5leHBlY3RlZCBzdWJlbGVtZW50ICIgKyByZWFkZXIuZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIGVuZCBvZiB3aGlsZSBsb29wCi0gICAgICAgICAgICAgICAgICAgICAgICAKLQotCi0KLSAgICAgICAgICAgIH0gY2F0Y2ggKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5sYW5nLkV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG9iamVjdDsKLSAgICAgICAgfQotCi0gICAgICAgIH0vL2VuZCBvZiBmYWN0b3J5IGNsYXNzCi0KLSAgICAgICAgCi0KLSAgICAgICAgfQotICAgICAgICAgICAKLSAgICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL0lEUkVGLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL0lEUkVGLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3NWJjODUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9JRFJFRi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAzICswLDAgQEAKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBJRFJFRi5qYXZhCi0gKgotICogVGhpcyBmaWxlIHdhcyBhdXRvLWdlbmVyYXRlZCBmcm9tIFdTREwKLSAqIGJ5IHRoZSBBcGFjaGUgQXhpczIgdmVyc2lvbjogU05BUFNIT1QgIEJ1aWx0IG9uIDogRGVjIDIxLCAyMDA3ICgwNDowMzozMCBMS1QpCi0gKi8KLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2Rpbmc7Ci0gICAgICAgICAgICAKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqICBJRFJFRiBiZWFuIGNsYXNzCi0gICAgICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgcHVibGljICBjbGFzcyBJRFJFRgotICAgICAgICBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCQmVhbnsKLSAgICAgICAgLyogVGhpcyB0eXBlIHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgcGllY2Ugb2Ygc2NoZW1hIHRoYXQgaGFkCi0gICAgICAgICAgICAgICAgbmFtZSA9IElEUkVGCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFVSSSA9IGh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFByZWZpeCA9IG5zMQotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdlbmVyYXRlUHJlZml4KGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB7Ci0gICAgICAgICAgICBpZihuYW1lc3BhY2UuZXF1YWxzKCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIpKXsKLSAgICAgICAgICAgICAgICByZXR1cm4gIlNPQVAtRU5DIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBmaWVsZCBmb3IgSURSRUYKLSAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuSURSZWYgbG9jYWxJRFJFRiA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgZ2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuSURSZWYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuSURSZWYgZ2V0SURSRUYoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxJRFJFRjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIHNldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSBwYXJhbSBJRFJFRgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0SURSRUYob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5JRFJlZiBwYXJhbSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYWxJRFJFRj1wYXJhbTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsSURSRUYudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgIC8qKgotICAgICAqIGlzUmVhZGVyTVRPTUF3YXJlCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSByZWFkZXIgc3VwcG9ydHMgTVRPTQotICAgICAqLwotICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgewotICAgICAgICBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICB0cnl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBqYXZhLmxhbmcuQm9vbGVhbi5UUlVFLmVxdWFscyhyZWFkZXIuZ2V0UHJvcGVydHkob3JnLmFwYWNoZS5heGlvbS5vbS5PTUNvbnN0YW50cy5JU19EQVRBX0hBTkRMRVJTX0FXQVJFKSk7Ci0gICAgICAgIH1jYXRjaChqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlzUmVhZGVyTVRPTUF3YXJlOwotICAgfQotICAgICAKLSAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAqCi0gICAgICAgICogQHBhcmFtIHBhcmVudFFOYW1lCi0gICAgICAgICogQHBhcmFtIGZhY3RvcnkKLSAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgcHVibGljIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IGdldE9NRWxlbWVudCAoCi0gICAgICAgICAgICAgICBmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSkgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZSBkYXRhU291cmNlID0KLSAgICAgICAgICAgICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRGF0YVNvdXJjZSh0aGlzLHBhcmVudFFOYW1lKXsKLQotICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgSURSRUYudGhpcy5zZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5PTVNvdXJjZWRFbGVtZW50SW1wbCgKLSAgICAgICAgICAgICAgIHBhcmVudFFOYW1lLGZhY3RvcnksZGF0YVNvdXJjZSk7Ci0gICAgICAgICAgICAKLSAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIsZmFsc2UpOwotICAgICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzZXJpYWxpemVUeXBlKQotICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotCi0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UgPSBudWxsOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHBhcmVudFFOYW1lLmdldFByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UgPSBwYXJlbnRRTmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZSAhPSBudWxsKSAmJiAobmFtZXNwYWNlLnRyaW0oKS5sZW5ndGgoKSA+IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHdyaXRlclByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3cml0ZXJQcmVmaXggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChuYW1lc3BhY2UsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHByZWZpeCwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCksIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIGlmIChzZXJpYWxpemVUeXBlKXsKLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIpOwotICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlUHJlZml4ICE9IG51bGwpICYmIChuYW1lc3BhY2VQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkpewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVByZWZpeCsiOklEUkVGIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiSURSRUYiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxJRFJFRj09bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgdGhlIG5pbCBhdHRyaWJ1dGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJJRFJFRiBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbElEUkVGKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBwcmVmaXgsamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICBpZiAoeG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0KLSAgICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0KLSAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLCBqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZU5hbWVzcGFjZSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlVmFsdWU7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gYXR0cmlidXRlUHJlZml4ICsgIjoiICsgcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsIGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIC8qKgotICAgICAgICAgKiAgbWV0aG9kIHRvIGhhbmRsZSBRbmFtZXMKLSAgICAgICAgICovCi0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWUoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMocHJlZml4ICsgIjoiICsgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGkuZSB0aGlzIGlzIHRoZSBkZWZhdWx0IG5hbWVzcGFjZQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZXMoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZVtdIHFuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgaWYgKHFuYW1lcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBzdG9yZSB0aGlzIGRhdGEgdW50aWwgbGFzdCBtb21lbnQgc2luY2UgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHdyaXRlIGFueQotICAgICAgICAgICAgICAgIC8vIG5hbWVzcGFjZSBkYXRhIGFmdGVyIHdyaXRpbmcgdGhlIGNoYXJhY3RvciBkYXRhCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZ0J1ZmZlciBzdHJpbmdUb1dyaXRlID0gbmV3IGphdmEubGFuZy5TdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBxbmFtZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZCgiICIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVVSSSA9IHFuYW1lc1tpXS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHByZWZpeCA9PSBudWxsKSB8fCAocHJlZml4Lmxlbmd0aCgpID09IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQocHJlZml4KS5hcHBlbmQoIjoiKS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhzdHJpbmdUb1dyaXRlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotCi0gICAgICAgICAvKioKLSAgICAgICAgICogUmVnaXN0ZXIgYSBuYW1lc3BhY2UgcHJlZml4Ci0gICAgICAgICAqLwotICAgICAgICAgcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHJlZ2lzdGVyUHJlZml4KGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoeG1sV3JpdGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHByZWZpeDsKLSAgICAgICAgICAgIH0KLQotCi0gIAotICAgICAgICAvKioKLSAgICAgICAgKiBkYXRhYmluZGluZyBtZXRob2QgdG8gZ2V0IGFuIFhNTCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdAotICAgICAgICAqCi0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciBnZXRQdWxsUGFyc2VyKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcU5hbWUpCi0gICAgICAgICAgICAgICAgICAgIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGVsZW1lbnRMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBhdHRyaWJMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXIuRUxFTUVOVF9URVhUKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbElEUkVGICE9IG51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbElEUkVGKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIklEUkVGIGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVySW1wbChxTmFtZSwgZWxlbWVudExpc3QudG9BcnJheSgpLCBhdHRyaWJMaXN0LnRvQXJyYXkoKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAKLQotICAgICAvKioKLSAgICAgICogIEZhY3RvcnkgY2xhc3MgdGhhdCBrZWVwcyB0aGUgcGFyc2UgbWV0aG9kCi0gICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeXsKLQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBJRFJFRiBmcm9tU3RyaW5nKGphdmEubGFuZy5TdHJpbmcgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkpewotICAgICAgICAgICAgICAgICAgICBJRFJFRiByZXR1cm5WYWx1ZSA9IG5ldyAgSURSRUYoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUuc2V0SURSRUYoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9JRFJFRih2YWx1ZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgSURSRUYgZnJvbVN0cmluZyhqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudC5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IGNvbnRlbnQuc3Vic3RyaW5nKDAsY29udGVudC5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVcmkgPSB4bWxTdHJlYW1SZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElEUkVGLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LG5hbWVzcGFjZVVyaSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJRFJFRi5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCwiIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIAotCi0gICAgICAgIC8qKgotICAgICAgICAqIHN0YXRpYyBtZXRob2QgdG8gY3JlYXRlIHRoZSBvYmplY3QKLSAgICAgICAgKiBQcmVjb25kaXRpb246ICBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgY3VycmVudCBvciBuZXh0IHN0YXJ0IGVsZW1lbnQgc3RhcnRzIHRoaXMgb2JqZWN0IGFuZCBhbnkgaW50ZXJ2ZW5pbmcgcmVhZGVyIGV2ZW50cyBhcmUgaWdub3JhYmxlCi0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgbm90IGFuIGVsZW1lbnQsIGl0IGlzIGEgY29tcGxleCB0eXBlIGFuZCB0aGUgcmVhZGVyIGlzIGF0IHRoZSBldmVudCBqdXN0IGFmdGVyIHRoZSBvdXRlciBzdGFydCBlbGVtZW50Ci0gICAgICAgICogUG9zdGNvbmRpdGlvbjogSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IGl0cyBlbmQgZWxlbWVudAotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIGEgY29tcGxleCB0eXBlLCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgdGhlIGVuZCBlbGVtZW50IG9mIGl0cyBvdXRlciBlbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgSURSRUYgcGFyc2UoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIElEUkVGIG9iamVjdCA9Ci0gICAgICAgICAgICAgICAgbmV3IElEUkVGKCk7Ci0KLSAgICAgICAgICAgIGludCBldmVudDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmlsbGFibGVWYWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IiI7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZXVyaSA9IiI7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlICghcmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgJiYgIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkKLSAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIpIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgZnVsbFR5cGVOYW1lID0gcmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAidHlwZSIpOwotICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNQcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZygwLGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gbnNQcmVmaXg9PW51bGw/IiI6bnNQcmVmaXg7Ci0KLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB0eXBlID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZyhmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKzEpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISJJRFJFRiIuZXF1YWxzKHR5cGUpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9maW5kIG5hbWVzcGFjZSBmb3IgdGhlIHByZWZpeAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zVXJpID0gcmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkobnNQcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKElEUkVGKW9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLkV4dGVuc2lvbk1hcHBlci5nZXRUeXBlT2JqZWN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zVXJpLHR5cGUscmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIE5vdGUgYWxsIGF0dHJpYnV0ZXMgdGhhdCB3ZXJlIGhhbmRsZWQuIFVzZWQgdG8gZGlmZmVyIG5vcm1hbCBhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgICAgLy8gZnJvbSBhbnlBdHRyaWJ1dGVzLgotICAgICAgICAgICAgICAgIGphdmEudXRpbC5WZWN0b3IgaGFuZGxlZEF0dHJpYnV0ZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlKCFyZWFkZXIuaXNFbmRFbGVtZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50ID0gcmVhZGVyLmdldEVsZW1lbnRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0SURSRUYoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb0lEUkVGKGNvbnRlbnQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBFbmQgb2YgaWYgZm9yIGV4cGVjdGVkIHByb3BlcnR5IHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2V7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBzdGFydCBlbGVtZW50IHdlIGFyZSBub3QgZXhwZWN0aW5nIGluZGljYXRlcyBhbiBpbnZhbGlkIHBhcmFtZXRlciB3YXMgcGFzc2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJVbmV4cGVjdGVkIHN1YmVsZW1lbnQgIiArIHJlYWRlci5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gZW5kIG9mIHdoaWxlIGxvb3AKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0KLQotICAgICAgICAgICAgfSBjYXRjaCAoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gb2JqZWN0OwotICAgICAgICB9Ci0KLSAgICAgICAgfS8vZW5kIG9mIGZhY3RvcnkgY2xhc3MKLQotICAgICAgICAKLQotICAgICAgICB9Ci0gICAgICAgICAgIAotICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvSURSRUZTLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL0lEUkVGUy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODZiZTA3Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvSURSRUZTLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDMgKzAsMCBAQAotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIElEUkVGUy5qYXZhCi0gKgotICogVGhpcyBmaWxlIHdhcyBhdXRvLWdlbmVyYXRlZCBmcm9tIFdTREwKLSAqIGJ5IHRoZSBBcGFjaGUgQXhpczIgdmVyc2lvbjogU05BUFNIT1QgIEJ1aWx0IG9uIDogRGVjIDIxLCAyMDA3ICgwNDowMzozMCBMS1QpCi0gKi8KLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2Rpbmc7Ci0gICAgICAgICAgICAKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqICBJRFJFRlMgYmVhbiBjbGFzcwotICAgICAgICAgICAgKi8KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyAgY2xhc3MgSURSRUZTCi0gICAgICAgIGltcGxlbWVudHMgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJCZWFuewotICAgICAgICAvKiBUaGlzIHR5cGUgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBwaWVjZSBvZiBzY2hlbWEgdGhhdCBoYWQKLSAgICAgICAgICAgICAgICBuYW1lID0gSURSRUZTCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFVSSSA9IGh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFByZWZpeCA9IG5zMQotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdlbmVyYXRlUHJlZml4KGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB7Ci0gICAgICAgICAgICBpZihuYW1lc3BhY2UuZXF1YWxzKCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIpKXsKLSAgICAgICAgICAgICAgICByZXR1cm4gIlNPQVAtRU5DIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBmaWVsZCBmb3IgSURSRUZTCi0gICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLklEUmVmcyBsb2NhbElEUkVGUyA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgZ2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuSURSZWZzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLklEUmVmcyBnZXRJRFJFRlMoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxJRFJFRlM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBzZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gcGFyYW0gSURSRUZTCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRJRFJFRlMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5JRFJlZnMgcGFyYW0pewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2FsSURSRUZTPXBhcmFtOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxJRFJFRlMudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgIC8qKgotICAgICAqIGlzUmVhZGVyTVRPTUF3YXJlCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSByZWFkZXIgc3VwcG9ydHMgTVRPTQotICAgICAqLwotICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgewotICAgICAgICBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICB0cnl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBqYXZhLmxhbmcuQm9vbGVhbi5UUlVFLmVxdWFscyhyZWFkZXIuZ2V0UHJvcGVydHkob3JnLmFwYWNoZS5heGlvbS5vbS5PTUNvbnN0YW50cy5JU19EQVRBX0hBTkRMRVJTX0FXQVJFKSk7Ci0gICAgICAgIH1jYXRjaChqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlzUmVhZGVyTVRPTUF3YXJlOwotICAgfQotICAgICAKLSAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAqCi0gICAgICAgICogQHBhcmFtIHBhcmVudFFOYW1lCi0gICAgICAgICogQHBhcmFtIGZhY3RvcnkKLSAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgcHVibGljIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IGdldE9NRWxlbWVudCAoCi0gICAgICAgICAgICAgICBmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSkgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZSBkYXRhU291cmNlID0KLSAgICAgICAgICAgICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRGF0YVNvdXJjZSh0aGlzLHBhcmVudFFOYW1lKXsKLQotICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgSURSRUZTLnRoaXMuc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmxsb20uT01Tb3VyY2VkRWxlbWVudEltcGwoCi0gICAgICAgICAgICAgICBwYXJlbnRRTmFtZSxmYWN0b3J5LGRhdGFTb3VyY2UpOwotICAgICAgICAgICAgCi0gICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyLGZhbHNlKTsKLSAgICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VyaWFsaXplVHlwZSkKLSAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLQotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBwYXJlbnRRTmFtZS5nZXRQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlID0gcGFyZW50UU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2UgIT0gbnVsbCkgJiYgKG5hbWVzcGFjZS50cmltKCkubGVuZ3RoKCkgPiAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB3cml0ZXJQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAod3JpdGVyUHJlZml4ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQobmFtZXNwYWNlLCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwcmVmaXgsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICBpZiAoc2VyaWFsaXplVHlwZSl7Ci0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iKTsKLSAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZVByZWZpeCAhPSBudWxsKSAmJiAobmFtZXNwYWNlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApKXsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VQcmVmaXgrIjpJRFJFRlMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJJRFJFRlMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxJRFJFRlM9PW51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIHRoZSBuaWwgYXR0cmlidXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiSURSRUZTIGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsSURSRUZTKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBwcmVmaXgsamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICBpZiAoeG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0KLSAgICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0KLSAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLCBqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZU5hbWVzcGFjZSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlVmFsdWU7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gYXR0cmlidXRlUHJlZml4ICsgIjoiICsgcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsIGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIC8qKgotICAgICAgICAgKiAgbWV0aG9kIHRvIGhhbmRsZSBRbmFtZXMKLSAgICAgICAgICovCi0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWUoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMocHJlZml4ICsgIjoiICsgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGkuZSB0aGlzIGlzIHRoZSBkZWZhdWx0IG5hbWVzcGFjZQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZXMoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZVtdIHFuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgaWYgKHFuYW1lcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBzdG9yZSB0aGlzIGRhdGEgdW50aWwgbGFzdCBtb21lbnQgc2luY2UgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHdyaXRlIGFueQotICAgICAgICAgICAgICAgIC8vIG5hbWVzcGFjZSBkYXRhIGFmdGVyIHdyaXRpbmcgdGhlIGNoYXJhY3RvciBkYXRhCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZ0J1ZmZlciBzdHJpbmdUb1dyaXRlID0gbmV3IGphdmEubGFuZy5TdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBxbmFtZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZCgiICIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVVSSSA9IHFuYW1lc1tpXS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHByZWZpeCA9PSBudWxsKSB8fCAocHJlZml4Lmxlbmd0aCgpID09IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQocHJlZml4KS5hcHBlbmQoIjoiKS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhzdHJpbmdUb1dyaXRlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotCi0gICAgICAgICAvKioKLSAgICAgICAgICogUmVnaXN0ZXIgYSBuYW1lc3BhY2UgcHJlZml4Ci0gICAgICAgICAqLwotICAgICAgICAgcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHJlZ2lzdGVyUHJlZml4KGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoeG1sV3JpdGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHByZWZpeDsKLSAgICAgICAgICAgIH0KLQotCi0gIAotICAgICAgICAvKioKLSAgICAgICAgKiBkYXRhYmluZGluZyBtZXRob2QgdG8gZ2V0IGFuIFhNTCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdAotICAgICAgICAqCi0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciBnZXRQdWxsUGFyc2VyKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcU5hbWUpCi0gICAgICAgICAgICAgICAgICAgIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGVsZW1lbnRMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBhdHRyaWJMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXIuRUxFTUVOVF9URVhUKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbElEUkVGUyAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxJRFJFRlMpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiSURSRUZTIGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVySW1wbChxTmFtZSwgZWxlbWVudExpc3QudG9BcnJheSgpLCBhdHRyaWJMaXN0LnRvQXJyYXkoKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAKLQotICAgICAvKioKLSAgICAgICogIEZhY3RvcnkgY2xhc3MgdGhhdCBrZWVwcyB0aGUgcGFyc2UgbWV0aG9kCi0gICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeXsKLQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBJRFJFRlMgZnJvbVN0cmluZyhqYXZhLmxhbmcuU3RyaW5nIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJKXsKLSAgICAgICAgICAgICAgICAgICAgSURSRUZTIHJldHVyblZhbHVlID0gbmV3ICBJRFJFRlMoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUuc2V0SURSRUZTKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvSURSRUZTKHZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBJRFJFRlMgZnJvbVN0cmluZyhqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudC5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IGNvbnRlbnQuc3Vic3RyaW5nKDAsY29udGVudC5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVcmkgPSB4bWxTdHJlYW1SZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElEUkVGUy5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCxuYW1lc3BhY2VVcmkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSURSRUZTLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LCIiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgCi0KLSAgICAgICAgLyoqCi0gICAgICAgICogc3RhdGljIG1ldGhvZCB0byBjcmVhdGUgdGhlIG9iamVjdAotICAgICAgICAqIFByZWNvbmRpdGlvbjogIElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSBjdXJyZW50IG9yIG5leHQgc3RhcnQgZWxlbWVudCBzdGFydHMgdGhpcyBvYmplY3QgYW5kIGFueSBpbnRlcnZlbmluZyByZWFkZXIgZXZlbnRzIGFyZSBpZ25vcmFibGUKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBub3QgYW4gZWxlbWVudCwgaXQgaXMgYSBjb21wbGV4IHR5cGUgYW5kIHRoZSByZWFkZXIgaXMgYXQgdGhlIGV2ZW50IGp1c3QgYWZ0ZXIgdGhlIG91dGVyIHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgKiBQb3N0Y29uZGl0aW9uOiBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgaXRzIGVuZCBlbGVtZW50Ci0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgYSBjb21wbGV4IHR5cGUsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCB0aGUgZW5kIGVsZW1lbnQgb2YgaXRzIG91dGVyIGVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBJRFJFRlMgcGFyc2UoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIElEUkVGUyBvYmplY3QgPQotICAgICAgICAgICAgICAgIG5ldyBJRFJFRlMoKTsKLQotICAgICAgICAgICAgaW50IGV2ZW50OwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuaWxsYWJsZVZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0iIjsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNldXJpID0iIjsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUgKCFyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAmJiAhcmVhZGVyLmlzRW5kRWxlbWVudCgpKQotICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIikhPW51bGwpewotICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBmdWxsVHlwZU5hbWUgPSByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIik7Ci0gICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1ByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKDAsZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBuc1ByZWZpeD09bnVsbD8iIjpuc1ByZWZpeDsKLQotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHR5cGUgPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikrMSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIklEUkVGUyIuZXF1YWxzKHR5cGUpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9maW5kIG5hbWVzcGFjZSBmb3IgdGhlIHByZWZpeAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zVXJpID0gcmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkobnNQcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKElEUkVGUylvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZy5FeHRlbnNpb25NYXBwZXIuZ2V0VHlwZU9iamVjdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc1VyaSx0eXBlLHJlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBOb3RlIGFsbCBhdHRyaWJ1dGVzIHRoYXQgd2VyZSBoYW5kbGVkLiBVc2VkIHRvIGRpZmZlciBub3JtYWwgYXR0cmlidXRlcwotICAgICAgICAgICAgICAgIC8vIGZyb20gYW55QXR0cmlidXRlcy4KLSAgICAgICAgICAgICAgICBqYXZhLnV0aWwuVmVjdG9yIGhhbmRsZWRBdHRyaWJ1dGVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSghcmVhZGVyLmlzRW5kRWxlbWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCA9IHJlYWRlci5nZXRFbGVtZW50VGV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldElEUkVGUygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvSURSRUZTKGNvbnRlbnQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBFbmQgb2YgaWYgZm9yIGV4cGVjdGVkIHByb3BlcnR5IHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2V7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBzdGFydCBlbGVtZW50IHdlIGFyZSBub3QgZXhwZWN0aW5nIGluZGljYXRlcyBhbiBpbnZhbGlkIHBhcmFtZXRlciB3YXMgcGFzc2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJVbmV4cGVjdGVkIHN1YmVsZW1lbnQgIiArIHJlYWRlci5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gZW5kIG9mIHdoaWxlIGxvb3AKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0KLQotICAgICAgICAgICAgfSBjYXRjaCAoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gb2JqZWN0OwotICAgICAgICB9Ci0KLSAgICAgICAgfS8vZW5kIG9mIGZhY3RvcnkgY2xhc3MKLQotICAgICAgICAKLQotICAgICAgICB9Ci0gICAgICAgICAgIAotICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvSW50ZWdlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9JbnRlZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkYTk0NmYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9JbnRlZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDMgKzAsMCBAQAotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIEludGVnZXIuamF2YQotICoKLSAqIFRoaXMgZmlsZSB3YXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBXU0RMCi0gKiBieSB0aGUgQXBhY2hlIEF4aXMyIHZlcnNpb246IFNOQVBTSE9UICBCdWlsdCBvbiA6IERlYyAyMSwgMjAwNyAoMDQ6MDM6MzAgTEtUKQotICovCi0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBwYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nOwotICAgICAgICAgICAgCi0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiAgSW50ZWdlciBiZWFuIGNsYXNzCi0gICAgICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgcHVibGljICBjbGFzcyBJbnRlZ2VyCi0gICAgICAgIGltcGxlbWVudHMgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJCZWFuewotICAgICAgICAvKiBUaGlzIHR5cGUgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBwaWVjZSBvZiBzY2hlbWEgdGhhdCBoYWQKLSAgICAgICAgICAgICAgICBuYW1lID0gaW50ZWdlcgotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBVUkkgPSBodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLwotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBQcmVmaXggPSBuczEKLSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgCi0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZW5lcmF0ZVByZWZpeChqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICAgICAgaWYobmFtZXNwYWNlLmVxdWFscygiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iKSl7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJTT0FQLUVOQyI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgfQotCi0gICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogZmllbGQgZm9yIEludGVnZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIGphdmEubWF0aC5CaWdJbnRlZ2VyIGxvY2FsSW50ZWdlciA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgZ2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljICBqYXZhLm1hdGguQmlnSW50ZWdlciBnZXRJbnRlZ2VyKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsSW50ZWdlcjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIHNldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSBwYXJhbSBJbnRlZ2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRJbnRlZ2VyKGphdmEubWF0aC5CaWdJbnRlZ2VyIHBhcmFtKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2NhbEludGVnZXI9cGFyYW07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbEludGVnZXIudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgIC8qKgotICAgICAqIGlzUmVhZGVyTVRPTUF3YXJlCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSByZWFkZXIgc3VwcG9ydHMgTVRPTQotICAgICAqLwotICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgewotICAgICAgICBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICB0cnl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBqYXZhLmxhbmcuQm9vbGVhbi5UUlVFLmVxdWFscyhyZWFkZXIuZ2V0UHJvcGVydHkob3JnLmFwYWNoZS5heGlvbS5vbS5PTUNvbnN0YW50cy5JU19EQVRBX0hBTkRMRVJTX0FXQVJFKSk7Ci0gICAgICAgIH1jYXRjaChqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlzUmVhZGVyTVRPTUF3YXJlOwotICAgfQotICAgICAKLSAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAqCi0gICAgICAgICogQHBhcmFtIHBhcmVudFFOYW1lCi0gICAgICAgICogQHBhcmFtIGZhY3RvcnkKLSAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgcHVibGljIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IGdldE9NRWxlbWVudCAoCi0gICAgICAgICAgICAgICBmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSkgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZSBkYXRhU291cmNlID0KLSAgICAgICAgICAgICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRGF0YVNvdXJjZSh0aGlzLHBhcmVudFFOYW1lKXsKLQotICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50aGlzLnNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5sbG9tLk9NU291cmNlZEVsZW1lbnRJbXBsKAotICAgICAgICAgICAgICAgcGFyZW50UU5hbWUsZmFjdG9yeSxkYXRhU291cmNlKTsKLSAgICAgICAgICAgIAotICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcixmYWxzZSk7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNlcmlhbGl6ZVR5cGUpCi0gICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgCi0KLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gcGFyZW50UU5hbWUuZ2V0UHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZSA9IHBhcmVudFFOYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlICE9IG51bGwpICYmIChuYW1lc3BhY2UudHJpbSgpLmxlbmd0aCgpID4gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgd3JpdGVyUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdyaXRlclByZWZpeCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KG5hbWVzcGFjZSwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocHJlZml4LCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgaWYgKHNlcmlhbGl6ZVR5cGUpewotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIik7Ci0gICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2VQcmVmaXggIT0gbnVsbCkgJiYgKG5hbWVzcGFjZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlUHJlZml4KyI6aW50ZWdlciIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgImludGVnZXIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxJbnRlZ2VyPT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZSB0aGUgbmlsIGF0dHJpYnV0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oImludGVnZXIgY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxJbnRlZ2VyKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBwcmVmaXgsamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICBpZiAoeG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0KLSAgICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0KLSAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLCBqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZU5hbWVzcGFjZSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlVmFsdWU7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gYXR0cmlidXRlUHJlZml4ICsgIjoiICsgcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsIGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIC8qKgotICAgICAgICAgKiAgbWV0aG9kIHRvIGhhbmRsZSBRbmFtZXMKLSAgICAgICAgICovCi0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWUoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMocHJlZml4ICsgIjoiICsgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGkuZSB0aGlzIGlzIHRoZSBkZWZhdWx0IG5hbWVzcGFjZQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZXMoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZVtdIHFuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgaWYgKHFuYW1lcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBzdG9yZSB0aGlzIGRhdGEgdW50aWwgbGFzdCBtb21lbnQgc2luY2UgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHdyaXRlIGFueQotICAgICAgICAgICAgICAgIC8vIG5hbWVzcGFjZSBkYXRhIGFmdGVyIHdyaXRpbmcgdGhlIGNoYXJhY3RvciBkYXRhCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZ0J1ZmZlciBzdHJpbmdUb1dyaXRlID0gbmV3IGphdmEubGFuZy5TdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBxbmFtZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZCgiICIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVVSSSA9IHFuYW1lc1tpXS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHByZWZpeCA9PSBudWxsKSB8fCAocHJlZml4Lmxlbmd0aCgpID09IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQocHJlZml4KS5hcHBlbmQoIjoiKS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhzdHJpbmdUb1dyaXRlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotCi0gICAgICAgICAvKioKLSAgICAgICAgICogUmVnaXN0ZXIgYSBuYW1lc3BhY2UgcHJlZml4Ci0gICAgICAgICAqLwotICAgICAgICAgcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHJlZ2lzdGVyUHJlZml4KGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoeG1sV3JpdGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHByZWZpeDsKLSAgICAgICAgICAgIH0KLQotCi0gIAotICAgICAgICAvKioKLSAgICAgICAgKiBkYXRhYmluZGluZyBtZXRob2QgdG8gZ2V0IGFuIFhNTCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdAotICAgICAgICAqCi0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciBnZXRQdWxsUGFyc2VyKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcU5hbWUpCi0gICAgICAgICAgICAgICAgICAgIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGVsZW1lbnRMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBhdHRyaWJMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXIuRUxFTUVOVF9URVhUKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbEludGVnZXIgIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsSW50ZWdlcikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJpbnRlZ2VyIGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVySW1wbChxTmFtZSwgZWxlbWVudExpc3QudG9BcnJheSgpLCBhdHRyaWJMaXN0LnRvQXJyYXkoKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAKLQotICAgICAvKioKLSAgICAgICogIEZhY3RvcnkgY2xhc3MgdGhhdCBrZWVwcyB0aGUgcGFyc2UgbWV0aG9kCi0gICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeXsKLQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBJbnRlZ2VyIGZyb21TdHJpbmcoamF2YS5sYW5nLlN0cmluZyB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSl7Ci0gICAgICAgICAgICAgICAgICAgIEludGVnZXIgcmV0dXJuVmFsdWUgPSBuZXcgIEludGVnZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUuc2V0SW50ZWdlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb0ludGVnZXIodmFsdWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIEludGVnZXIgZnJvbVN0cmluZyhqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudC5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IGNvbnRlbnQuc3Vic3RyaW5nKDAsY29udGVudC5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVcmkgPSB4bWxTdHJlYW1SZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEludGVnZXIuRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsbmFtZXNwYWNlVXJpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEludGVnZXIuRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsIiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAKLQotICAgICAgICAvKioKLSAgICAgICAgKiBzdGF0aWMgbWV0aG9kIHRvIGNyZWF0ZSB0aGUgb2JqZWN0Ci0gICAgICAgICogUHJlY29uZGl0aW9uOiAgSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIGN1cnJlbnQgb3IgbmV4dCBzdGFydCBlbGVtZW50IHN0YXJ0cyB0aGlzIG9iamVjdCBhbmQgYW55IGludGVydmVuaW5nIHJlYWRlciBldmVudHMgYXJlIGlnbm9yYWJsZQotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIG5vdCBhbiBlbGVtZW50LCBpdCBpcyBhIGNvbXBsZXggdHlwZSBhbmQgdGhlIHJlYWRlciBpcyBhdCB0aGUgZXZlbnQganVzdCBhZnRlciB0aGUgb3V0ZXIgc3RhcnQgZWxlbWVudAotICAgICAgICAqIFBvc3Rjb25kaXRpb246IElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCBpdHMgZW5kIGVsZW1lbnQKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBhIGNvbXBsZXggdHlwZSwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IHRoZSBlbmQgZWxlbWVudCBvZiBpdHMgb3V0ZXIgZWxlbWVudAotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIEludGVnZXIgcGFyc2UoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIEludGVnZXIgb2JqZWN0ID0KLSAgICAgICAgICAgICAgICBuZXcgSW50ZWdlcigpOwotCi0gICAgICAgICAgICBpbnQgZXZlbnQ7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5pbGxhYmxlVmFsdWUgPSBudWxsOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSIiOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2V1cmkgPSIiOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSAoIXJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICYmICFyZWFkZXIuaXNFbmRFbGVtZW50KCkpCi0gICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiKSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGZ1bGxUeXBlTmFtZSA9IHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiKTsKLSAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUhPW51bGwpewotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zUHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoMCxmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IG5zUHJlZml4PT1udWxsPyIiOm5zUHJlZml4OwotCi0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgdHlwZSA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSsxKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEiaW50ZWdlciIuZXF1YWxzKHR5cGUpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9maW5kIG5hbWVzcGFjZSBmb3IgdGhlIHByZWZpeAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zVXJpID0gcmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkobnNQcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKEludGVnZXIpb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2RpbmcuRXh0ZW5zaW9uTWFwcGVyLmdldFR5cGVPYmplY3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNVcmksdHlwZSxyZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gTm90ZSBhbGwgYXR0cmlidXRlcyB0aGF0IHdlcmUgaGFuZGxlZC4gVXNlZCB0byBkaWZmZXIgbm9ybWFsIGF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgICAvLyBmcm9tIGFueUF0dHJpYnV0ZXMuCi0gICAgICAgICAgICAgICAgamF2YS51dGlsLlZlY3RvciBoYW5kbGVkQXR0cmlidXRlcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUoIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQgPSByZWFkZXIuZ2V0RWxlbWVudFRleHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5zZXRJbnRlZ2VyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9JbnRlZ2VyKGNvbnRlbnQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBFbmQgb2YgaWYgZm9yIGV4cGVjdGVkIHByb3BlcnR5IHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2V7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBzdGFydCBlbGVtZW50IHdlIGFyZSBub3QgZXhwZWN0aW5nIGluZGljYXRlcyBhbiBpbnZhbGlkIHBhcmFtZXRlciB3YXMgcGFzc2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJVbmV4cGVjdGVkIHN1YmVsZW1lbnQgIiArIHJlYWRlci5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gZW5kIG9mIHdoaWxlIGxvb3AKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0KLQotICAgICAgICAgICAgfSBjYXRjaCAoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gb2JqZWN0OwotICAgICAgICB9Ci0KLSAgICAgICAgfS8vZW5kIG9mIGZhY3RvcnkgY2xhc3MKLQotICAgICAgICAKLQotICAgICAgICB9Ci0gICAgICAgICAgIAotICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvTGFuZ3VhZ2UuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvTGFuZ3VhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M5YzI0ZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL0xhbmd1YWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDMgKzAsMCBAQAotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIExhbmd1YWdlLmphdmEKLSAqCi0gKiBUaGlzIGZpbGUgd2FzIGF1dG8tZ2VuZXJhdGVkIGZyb20gV1NETAotICogYnkgdGhlIEFwYWNoZSBBeGlzMiB2ZXJzaW9uOiBTTkFQU0hPVCAgQnVpbHQgb24gOiBEZWMgMjEsIDIwMDcgKDA0OjAzOjMwIExLVCkKLSAqLwotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZzsKLSAgICAgICAgICAgIAotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogIExhbmd1YWdlIGJlYW4gY2xhc3MKLSAgICAgICAgICAgICovCi0gICAgICAgIAotICAgICAgICBwdWJsaWMgIGNsYXNzIExhbmd1YWdlCi0gICAgICAgIGltcGxlbWVudHMgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJCZWFuewotICAgICAgICAvKiBUaGlzIHR5cGUgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBwaWVjZSBvZiBzY2hlbWEgdGhhdCBoYWQKLSAgICAgICAgICAgICAgICBuYW1lID0gbGFuZ3VhZ2UKLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgVVJJID0gaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8KLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgUHJlZml4ID0gbnMxCi0gICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIAotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2VuZXJhdGVQcmVmaXgoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHsKLSAgICAgICAgICAgIGlmKG5hbWVzcGFjZS5lcXVhbHMoImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIikpewotICAgICAgICAgICAgICAgIHJldHVybiAiU09BUC1FTkMiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgIH0KLQotICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIGZpZWxkIGZvciBMYW5ndWFnZQotICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5MYW5ndWFnZSBsb2NhbExhbmd1YWdlIDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBnZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5MYW5ndWFnZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5MYW5ndWFnZSBnZXRMYW5ndWFnZSgpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbExhbmd1YWdlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgc2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtIHBhcmFtIExhbmd1YWdlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRMYW5ndWFnZShvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLkxhbmd1YWdlIHBhcmFtKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2NhbExhbmd1YWdlPXBhcmFtOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxMYW5ndWFnZS50b1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgLyoqCi0gICAgICogaXNSZWFkZXJNVE9NQXdhcmUKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlYWRlciBzdXBwb3J0cyBNVE9NCi0gICAgICovCi0gICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIHRyeXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGphdmEubGFuZy5Cb29sZWFuLlRSVUUuZXF1YWxzKHJlYWRlci5nZXRQcm9wZXJ0eShvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQ29uc3RhbnRzLklTX0RBVEFfSEFORExFUlNfQVdBUkUpKTsKLSAgICAgICAgfWNhdGNoKGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXNSZWFkZXJNVE9NQXdhcmU7Ci0gICB9Ci0gICAgIAotICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICoKLSAgICAgICAgKiBAcGFyYW0gcGFyZW50UU5hbWUKLSAgICAgICAgKiBAcGFyYW0gZmFjdG9yeQotICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICBwdWJsaWMgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgZ2V0T01FbGVtZW50ICgKLSAgICAgICAgICAgICAgIGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5KSB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlIGRhdGFTb3VyY2UgPQotICAgICAgICAgICAgICAgICAgICAgICBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJEYXRhU291cmNlKHRoaXMscGFyZW50UU5hbWUpewotCi0gICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICBMYW5ndWFnZS50aGlzLnNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5sbG9tLk9NU291cmNlZEVsZW1lbnRJbXBsKAotICAgICAgICAgICAgICAgcGFyZW50UU5hbWUsZmFjdG9yeSxkYXRhU291cmNlKTsKLSAgICAgICAgICAgIAotICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcixmYWxzZSk7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNlcmlhbGl6ZVR5cGUpCi0gICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgCi0KLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gcGFyZW50UU5hbWUuZ2V0UHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZSA9IHBhcmVudFFOYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlICE9IG51bGwpICYmIChuYW1lc3BhY2UudHJpbSgpLmxlbmd0aCgpID4gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgd3JpdGVyUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdyaXRlclByZWZpeCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KG5hbWVzcGFjZSwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocHJlZml4LCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgaWYgKHNlcmlhbGl6ZVR5cGUpewotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIik7Ci0gICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2VQcmVmaXggIT0gbnVsbCkgJiYgKG5hbWVzcGFjZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlUHJlZml4KyI6bGFuZ3VhZ2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJsYW5ndWFnZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbExhbmd1YWdlPT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZSB0aGUgbmlsIGF0dHJpYnV0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oImxhbmd1YWdlIGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsTGFuZ3VhZ2UpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRoIHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCxqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgIGlmICh4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLQotICAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsIGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlTmFtZXNwYWNlID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVWYWx1ZTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBhdHRyaWJ1dGVQcmVmaXggKyAiOiIgKyBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSwgYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICBtZXRob2QgdG8gaGFuZGxlIFFuYW1lcwotICAgICAgICAgKi8KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZShqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhwcmVmaXggKyAiOiIgKyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaS5lIHRoaXMgaXMgdGhlIGRlZmF1bHQgbmFtZXNwYWNlCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lcyhqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lW10gcW5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICBpZiAocW5hbWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHRvIHN0b3JlIHRoaXMgZGF0YSB1bnRpbCBsYXN0IG1vbWVudCBzaW5jZSBpdCBpcyBub3QgcG9zc2libGUgdG8gd3JpdGUgYW55Ci0gICAgICAgICAgICAgICAgLy8gbmFtZXNwYWNlIGRhdGEgYWZ0ZXIgd3JpdGluZyB0aGUgY2hhcmFjdG9yIGRhdGEKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIHN0cmluZ1RvV3JpdGUgPSBuZXcgamF2YS5sYW5nLlN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHFuYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKCIgIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlVVJJID0gcW5hbWVzW2ldLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocHJlZml4ID09IG51bGwpIHx8IChwcmVmaXgubGVuZ3RoKCkgPT0gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChwcmVmaXgpLmFwcGVuZCgiOiIpLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHN0cmluZ1RvV3JpdGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0KLSAgICAgICAgIC8qKgotICAgICAgICAgKiBSZWdpc3RlciBhIG5hbWVzcGFjZSBwcmVmaXgKLSAgICAgICAgICovCi0gICAgICAgICBwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgcmVnaXN0ZXJQcmVmaXgoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLCBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlICh4bWxXcml0ZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gcHJlZml4OwotICAgICAgICAgICAgfQotCi0KLSAgCi0gICAgICAgIC8qKgotICAgICAgICAqIGRhdGFiaW5kaW5nIG1ldGhvZCB0byBnZXQgYW4gWE1MIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0Ci0gICAgICAgICoKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIGdldFB1bGxQYXJzZXIoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxTmFtZSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgZWxlbWVudExpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGF0dHJpYkxpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlci5FTEVNRU5UX1RFWFQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsTGFuZ3VhZ2UgIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsTGFuZ3VhZ2UpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigibGFuZ3VhZ2UgY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXJJbXBsKHFOYW1lLCBlbGVtZW50TGlzdC50b0FycmF5KCksIGF0dHJpYkxpc3QudG9BcnJheSgpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gIAotCi0gICAgIC8qKgotICAgICAgKiAgRmFjdG9yeSBjbGFzcyB0aGF0IGtlZXBzIHRoZSBwYXJzZSBtZXRob2QKLSAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5ewotCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIExhbmd1YWdlIGZyb21TdHJpbmcoamF2YS5sYW5nLlN0cmluZyB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSl7Ci0gICAgICAgICAgICAgICAgICAgIExhbmd1YWdlIHJldHVyblZhbHVlID0gbmV3ICBMYW5ndWFnZSgpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZS5zZXRMYW5ndWFnZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb0xhbmd1YWdlKHZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBMYW5ndWFnZSBmcm9tU3RyaW5nKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50LmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gY29udGVudC5zdWJzdHJpbmcoMCxjb250ZW50LmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVyaSA9IHhtbFN0cmVhbVJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTGFuZ3VhZ2UuRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsbmFtZXNwYWNlVXJpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIExhbmd1YWdlLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LCIiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgCi0KLSAgICAgICAgLyoqCi0gICAgICAgICogc3RhdGljIG1ldGhvZCB0byBjcmVhdGUgdGhlIG9iamVjdAotICAgICAgICAqIFByZWNvbmRpdGlvbjogIElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSBjdXJyZW50IG9yIG5leHQgc3RhcnQgZWxlbWVudCBzdGFydHMgdGhpcyBvYmplY3QgYW5kIGFueSBpbnRlcnZlbmluZyByZWFkZXIgZXZlbnRzIGFyZSBpZ25vcmFibGUKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBub3QgYW4gZWxlbWVudCwgaXQgaXMgYSBjb21wbGV4IHR5cGUgYW5kIHRoZSByZWFkZXIgaXMgYXQgdGhlIGV2ZW50IGp1c3QgYWZ0ZXIgdGhlIG91dGVyIHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgKiBQb3N0Y29uZGl0aW9uOiBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgaXRzIGVuZCBlbGVtZW50Ci0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgYSBjb21wbGV4IHR5cGUsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCB0aGUgZW5kIGVsZW1lbnQgb2YgaXRzIG91dGVyIGVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBMYW5ndWFnZSBwYXJzZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uewotICAgICAgICAgICAgTGFuZ3VhZ2Ugb2JqZWN0ID0KLSAgICAgICAgICAgICAgICBuZXcgTGFuZ3VhZ2UoKTsKLQotICAgICAgICAgICAgaW50IGV2ZW50OwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuaWxsYWJsZVZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0iIjsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNldXJpID0iIjsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUgKCFyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAmJiAhcmVhZGVyLmlzRW5kRWxlbWVudCgpKQotICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIikhPW51bGwpewotICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBmdWxsVHlwZU5hbWUgPSByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIik7Ci0gICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1ByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKDAsZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBuc1ByZWZpeD09bnVsbD8iIjpuc1ByZWZpeDsKLQotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHR5cGUgPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikrMSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghImxhbmd1YWdlIi5lcXVhbHModHlwZSkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2ZpbmQgbmFtZXNwYWNlIGZvciB0aGUgcHJlZml4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNVcmkgPSByZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShuc1ByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoTGFuZ3VhZ2Upb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2RpbmcuRXh0ZW5zaW9uTWFwcGVyLmdldFR5cGVPYmplY3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNVcmksdHlwZSxyZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gTm90ZSBhbGwgYXR0cmlidXRlcyB0aGF0IHdlcmUgaGFuZGxlZC4gVXNlZCB0byBkaWZmZXIgbm9ybWFsIGF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgICAvLyBmcm9tIGFueUF0dHJpYnV0ZXMuCi0gICAgICAgICAgICAgICAgamF2YS51dGlsLlZlY3RvciBoYW5kbGVkQXR0cmlidXRlcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUoIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQgPSByZWFkZXIuZ2V0RWxlbWVudFRleHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5zZXRMYW5ndWFnZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvTGFuZ3VhZ2UoY29udGVudCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIEVuZCBvZiBpZiBmb3IgZXhwZWN0ZWQgcHJvcGVydHkgc3RhcnQgZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHN0YXJ0IGVsZW1lbnQgd2UgYXJlIG5vdCBleHBlY3RpbmcgaW5kaWNhdGVzIGFuIGludmFsaWQgcGFyYW1ldGVyIHdhcyBwYXNzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIlVuZXhwZWN0ZWQgc3ViZWxlbWVudCAiICsgcmVhZGVyLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBlbmQgb2Ygd2hpbGUgbG9vcAotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLQotCi0gICAgICAgICAgICB9IGNhdGNoIChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEubGFuZy5FeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBvYmplY3Q7Ci0gICAgICAgIH0KLQotICAgICAgICB9Ly9lbmQgb2YgZmFjdG9yeSBjbGFzcwotCi0gICAgICAgIAotCi0gICAgICAgIH0KLSAgICAgICAgICAgCi0gICAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9OQ05hbWUuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvTkNOYW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyMjA5MDAuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9OQ05hbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwMyArMCwwIEBACi0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICogTkNOYW1lLmphdmEKLSAqCi0gKiBUaGlzIGZpbGUgd2FzIGF1dG8tZ2VuZXJhdGVkIGZyb20gV1NETAotICogYnkgdGhlIEFwYWNoZSBBeGlzMiB2ZXJzaW9uOiBTTkFQU0hPVCAgQnVpbHQgb24gOiBEZWMgMjEsIDIwMDcgKDA0OjAzOjMwIExLVCkKLSAqLwotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZzsKLSAgICAgICAgICAgIAotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogIE5DTmFtZSBiZWFuIGNsYXNzCi0gICAgICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgcHVibGljICBjbGFzcyBOQ05hbWUKLSAgICAgICAgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkJlYW57Ci0gICAgICAgIC8qIFRoaXMgdHlwZSB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIHBpZWNlIG9mIHNjaGVtYSB0aGF0IGhhZAotICAgICAgICAgICAgICAgIG5hbWUgPSBOQ05hbWUKLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgVVJJID0gaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8KLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgUHJlZml4ID0gbnMxCi0gICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIAotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2VuZXJhdGVQcmVmaXgoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHsKLSAgICAgICAgICAgIGlmKG5hbWVzcGFjZS5lcXVhbHMoImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIikpewotICAgICAgICAgICAgICAgIHJldHVybiAiU09BUC1FTkMiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgIH0KLQotICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIGZpZWxkIGZvciBOQ05hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuTkNOYW1lIGxvY2FsTkNOYW1lIDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBnZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5OQ05hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuTkNOYW1lIGdldE5DTmFtZSgpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbE5DTmFtZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIHNldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSBwYXJhbSBOQ05hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldE5DTmFtZShvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLk5DTmFtZSBwYXJhbSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYWxOQ05hbWU9cGFyYW07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbE5DTmFtZS50b1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgLyoqCi0gICAgICogaXNSZWFkZXJNVE9NQXdhcmUKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlYWRlciBzdXBwb3J0cyBNVE9NCi0gICAgICovCi0gICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIHRyeXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGphdmEubGFuZy5Cb29sZWFuLlRSVUUuZXF1YWxzKHJlYWRlci5nZXRQcm9wZXJ0eShvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQ29uc3RhbnRzLklTX0RBVEFfSEFORExFUlNfQVdBUkUpKTsKLSAgICAgICAgfWNhdGNoKGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXNSZWFkZXJNVE9NQXdhcmU7Ci0gICB9Ci0gICAgIAotICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICoKLSAgICAgICAgKiBAcGFyYW0gcGFyZW50UU5hbWUKLSAgICAgICAgKiBAcGFyYW0gZmFjdG9yeQotICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICBwdWJsaWMgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgZ2V0T01FbGVtZW50ICgKLSAgICAgICAgICAgICAgIGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5KSB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlIGRhdGFTb3VyY2UgPQotICAgICAgICAgICAgICAgICAgICAgICBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJEYXRhU291cmNlKHRoaXMscGFyZW50UU5hbWUpewotCi0gICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICBOQ05hbWUudGhpcy5zZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5PTVNvdXJjZWRFbGVtZW50SW1wbCgKLSAgICAgICAgICAgICAgIHBhcmVudFFOYW1lLGZhY3RvcnksZGF0YVNvdXJjZSk7Ci0gICAgICAgICAgICAKLSAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIsZmFsc2UpOwotICAgICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzZXJpYWxpemVUeXBlKQotICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotCi0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UgPSBudWxsOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHBhcmVudFFOYW1lLmdldFByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UgPSBwYXJlbnRRTmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZSAhPSBudWxsKSAmJiAobmFtZXNwYWNlLnRyaW0oKS5sZW5ndGgoKSA+IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHdyaXRlclByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3cml0ZXJQcmVmaXggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChuYW1lc3BhY2UsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHByZWZpeCwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCksIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIGlmIChzZXJpYWxpemVUeXBlKXsKLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIpOwotICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlUHJlZml4ICE9IG51bGwpICYmIChuYW1lc3BhY2VQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkpewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVByZWZpeCsiOk5DTmFtZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5DTmFtZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbE5DTmFtZT09bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgdGhlIG5pbCBhdHRyaWJ1dGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJOQ05hbWUgY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxOQ05hbWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRoIHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCxqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgIGlmICh4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLQotICAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsIGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlTmFtZXNwYWNlID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVWYWx1ZTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBhdHRyaWJ1dGVQcmVmaXggKyAiOiIgKyBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSwgYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICBtZXRob2QgdG8gaGFuZGxlIFFuYW1lcwotICAgICAgICAgKi8KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZShqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhwcmVmaXggKyAiOiIgKyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaS5lIHRoaXMgaXMgdGhlIGRlZmF1bHQgbmFtZXNwYWNlCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lcyhqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lW10gcW5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICBpZiAocW5hbWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHRvIHN0b3JlIHRoaXMgZGF0YSB1bnRpbCBsYXN0IG1vbWVudCBzaW5jZSBpdCBpcyBub3QgcG9zc2libGUgdG8gd3JpdGUgYW55Ci0gICAgICAgICAgICAgICAgLy8gbmFtZXNwYWNlIGRhdGEgYWZ0ZXIgd3JpdGluZyB0aGUgY2hhcmFjdG9yIGRhdGEKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIHN0cmluZ1RvV3JpdGUgPSBuZXcgamF2YS5sYW5nLlN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHFuYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKCIgIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlVVJJID0gcW5hbWVzW2ldLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocHJlZml4ID09IG51bGwpIHx8IChwcmVmaXgubGVuZ3RoKCkgPT0gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChwcmVmaXgpLmFwcGVuZCgiOiIpLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHN0cmluZ1RvV3JpdGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0KLSAgICAgICAgIC8qKgotICAgICAgICAgKiBSZWdpc3RlciBhIG5hbWVzcGFjZSBwcmVmaXgKLSAgICAgICAgICovCi0gICAgICAgICBwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgcmVnaXN0ZXJQcmVmaXgoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLCBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlICh4bWxXcml0ZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gcHJlZml4OwotICAgICAgICAgICAgfQotCi0KLSAgCi0gICAgICAgIC8qKgotICAgICAgICAqIGRhdGFiaW5kaW5nIG1ldGhvZCB0byBnZXQgYW4gWE1MIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0Ci0gICAgICAgICoKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIGdldFB1bGxQYXJzZXIoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxTmFtZSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgZWxlbWVudExpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGF0dHJpYkxpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlci5FTEVNRU5UX1RFWFQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsTkNOYW1lICE9IG51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbE5DTmFtZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJOQ05hbWUgY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXJJbXBsKHFOYW1lLCBlbGVtZW50TGlzdC50b0FycmF5KCksIGF0dHJpYkxpc3QudG9BcnJheSgpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gIAotCi0gICAgIC8qKgotICAgICAgKiAgRmFjdG9yeSBjbGFzcyB0aGF0IGtlZXBzIHRoZSBwYXJzZSBtZXRob2QKLSAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5ewotCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIE5DTmFtZSBmcm9tU3RyaW5nKGphdmEubGFuZy5TdHJpbmcgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkpewotICAgICAgICAgICAgICAgICAgICBOQ05hbWUgcmV0dXJuVmFsdWUgPSBuZXcgIE5DTmFtZSgpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZS5zZXROQ05hbWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9OQ05hbWUodmFsdWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIE5DTmFtZSBmcm9tU3RyaW5nKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50LmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gY29udGVudC5zdWJzdHJpbmcoMCxjb250ZW50LmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVyaSA9IHhtbFN0cmVhbVJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTkNOYW1lLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LG5hbWVzcGFjZVVyaSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOQ05hbWUuRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsIiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAKLQotICAgICAgICAvKioKLSAgICAgICAgKiBzdGF0aWMgbWV0aG9kIHRvIGNyZWF0ZSB0aGUgb2JqZWN0Ci0gICAgICAgICogUHJlY29uZGl0aW9uOiAgSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIGN1cnJlbnQgb3IgbmV4dCBzdGFydCBlbGVtZW50IHN0YXJ0cyB0aGlzIG9iamVjdCBhbmQgYW55IGludGVydmVuaW5nIHJlYWRlciBldmVudHMgYXJlIGlnbm9yYWJsZQotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIG5vdCBhbiBlbGVtZW50LCBpdCBpcyBhIGNvbXBsZXggdHlwZSBhbmQgdGhlIHJlYWRlciBpcyBhdCB0aGUgZXZlbnQganVzdCBhZnRlciB0aGUgb3V0ZXIgc3RhcnQgZWxlbWVudAotICAgICAgICAqIFBvc3Rjb25kaXRpb246IElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCBpdHMgZW5kIGVsZW1lbnQKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBhIGNvbXBsZXggdHlwZSwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IHRoZSBlbmQgZWxlbWVudCBvZiBpdHMgb3V0ZXIgZWxlbWVudAotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIE5DTmFtZSBwYXJzZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uewotICAgICAgICAgICAgTkNOYW1lIG9iamVjdCA9Ci0gICAgICAgICAgICAgICAgbmV3IE5DTmFtZSgpOwotCi0gICAgICAgICAgICBpbnQgZXZlbnQ7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5pbGxhYmxlVmFsdWUgPSBudWxsOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSIiOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2V1cmkgPSIiOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSAoIXJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICYmICFyZWFkZXIuaXNFbmRFbGVtZW50KCkpCi0gICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiKSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGZ1bGxUeXBlTmFtZSA9IHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiKTsKLSAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUhPW51bGwpewotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zUHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoMCxmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IG5zUHJlZml4PT1udWxsPyIiOm5zUHJlZml4OwotCi0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgdHlwZSA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSsxKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEiTkNOYW1lIi5lcXVhbHModHlwZSkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2ZpbmQgbmFtZXNwYWNlIGZvciB0aGUgcHJlZml4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNVcmkgPSByZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShuc1ByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoTkNOYW1lKW9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLkV4dGVuc2lvbk1hcHBlci5nZXRUeXBlT2JqZWN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zVXJpLHR5cGUscmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIE5vdGUgYWxsIGF0dHJpYnV0ZXMgdGhhdCB3ZXJlIGhhbmRsZWQuIFVzZWQgdG8gZGlmZmVyIG5vcm1hbCBhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgICAgLy8gZnJvbSBhbnlBdHRyaWJ1dGVzLgotICAgICAgICAgICAgICAgIGphdmEudXRpbC5WZWN0b3IgaGFuZGxlZEF0dHJpYnV0ZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlKCFyZWFkZXIuaXNFbmRFbGVtZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50ID0gcmVhZGVyLmdldEVsZW1lbnRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0TkNOYW1lKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9OQ05hbWUoY29udGVudCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIEVuZCBvZiBpZiBmb3IgZXhwZWN0ZWQgcHJvcGVydHkgc3RhcnQgZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHN0YXJ0IGVsZW1lbnQgd2UgYXJlIG5vdCBleHBlY3RpbmcgaW5kaWNhdGVzIGFuIGludmFsaWQgcGFyYW1ldGVyIHdhcyBwYXNzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIlVuZXhwZWN0ZWQgc3ViZWxlbWVudCAiICsgcmVhZGVyLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBlbmQgb2Ygd2hpbGUgbG9vcAotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLQotCi0gICAgICAgICAgICB9IGNhdGNoIChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEubGFuZy5FeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBvYmplY3Q7Ci0gICAgICAgIH0KLQotICAgICAgICB9Ly9lbmQgb2YgZmFjdG9yeSBjbGFzcwotCi0gICAgICAgIAotCi0gICAgICAgIH0KLSAgICAgICAgICAgCi0gICAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9OTVRPS0VOLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL05NVE9LRU4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM0MWExMy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL05NVE9LRU4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwMyArMCwwIEBACi0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICogTk1UT0tFTi5qYXZhCi0gKgotICogVGhpcyBmaWxlIHdhcyBhdXRvLWdlbmVyYXRlZCBmcm9tIFdTREwKLSAqIGJ5IHRoZSBBcGFjaGUgQXhpczIgdmVyc2lvbjogU05BUFNIT1QgIEJ1aWx0IG9uIDogRGVjIDIxLCAyMDA3ICgwNDowMzozMCBMS1QpCi0gKi8KLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2Rpbmc7Ci0gICAgICAgICAgICAKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqICBOTVRPS0VOIGJlYW4gY2xhc3MKLSAgICAgICAgICAgICovCi0gICAgICAgIAotICAgICAgICBwdWJsaWMgIGNsYXNzIE5NVE9LRU4KLSAgICAgICAgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkJlYW57Ci0gICAgICAgIC8qIFRoaXMgdHlwZSB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIHBpZWNlIG9mIHNjaGVtYSB0aGF0IGhhZAotICAgICAgICAgICAgICAgIG5hbWUgPSBOTVRPS0VOCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFVSSSA9IGh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFByZWZpeCA9IG5zMQotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdlbmVyYXRlUHJlZml4KGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB7Ci0gICAgICAgICAgICBpZihuYW1lc3BhY2UuZXF1YWxzKCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIpKXsKLSAgICAgICAgICAgICAgICByZXR1cm4gIlNPQVAtRU5DIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBmaWVsZCBmb3IgTk1UT0tFTgotICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5OTVRva2VuIGxvY2FsTk1UT0tFTiA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgZ2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuTk1Ub2tlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5OTVRva2VuIGdldE5NVE9LRU4oKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxOTVRPS0VOOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgc2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtIHBhcmFtIE5NVE9LRU4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldE5NVE9LRU4ob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5OTVRva2VuIHBhcmFtKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2NhbE5NVE9LRU49cGFyYW07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbE5NVE9LRU4udG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgIC8qKgotICAgICAqIGlzUmVhZGVyTVRPTUF3YXJlCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSByZWFkZXIgc3VwcG9ydHMgTVRPTQotICAgICAqLwotICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgewotICAgICAgICBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICB0cnl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBqYXZhLmxhbmcuQm9vbGVhbi5UUlVFLmVxdWFscyhyZWFkZXIuZ2V0UHJvcGVydHkob3JnLmFwYWNoZS5heGlvbS5vbS5PTUNvbnN0YW50cy5JU19EQVRBX0hBTkRMRVJTX0FXQVJFKSk7Ci0gICAgICAgIH1jYXRjaChqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlzUmVhZGVyTVRPTUF3YXJlOwotICAgfQotICAgICAKLSAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAqCi0gICAgICAgICogQHBhcmFtIHBhcmVudFFOYW1lCi0gICAgICAgICogQHBhcmFtIGZhY3RvcnkKLSAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgcHVibGljIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IGdldE9NRWxlbWVudCAoCi0gICAgICAgICAgICAgICBmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSkgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZSBkYXRhU291cmNlID0KLSAgICAgICAgICAgICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRGF0YVNvdXJjZSh0aGlzLHBhcmVudFFOYW1lKXsKLQotICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgTk1UT0tFTi50aGlzLnNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5sbG9tLk9NU291cmNlZEVsZW1lbnRJbXBsKAotICAgICAgICAgICAgICAgcGFyZW50UU5hbWUsZmFjdG9yeSxkYXRhU291cmNlKTsKLSAgICAgICAgICAgIAotICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcixmYWxzZSk7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNlcmlhbGl6ZVR5cGUpCi0gICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgCi0KLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gcGFyZW50UU5hbWUuZ2V0UHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZSA9IHBhcmVudFFOYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlICE9IG51bGwpICYmIChuYW1lc3BhY2UudHJpbSgpLmxlbmd0aCgpID4gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgd3JpdGVyUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdyaXRlclByZWZpeCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KG5hbWVzcGFjZSwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocHJlZml4LCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgaWYgKHNlcmlhbGl6ZVR5cGUpewotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIik7Ci0gICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2VQcmVmaXggIT0gbnVsbCkgJiYgKG5hbWVzcGFjZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlUHJlZml4KyI6Tk1UT0tFTiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5NVE9LRU4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxOTVRPS0VOPT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZSB0aGUgbmlsIGF0dHJpYnV0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIk5NVE9LRU4gY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxOTVRPS0VOKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBwcmVmaXgsamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICBpZiAoeG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0KLSAgICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0KLSAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLCBqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZU5hbWVzcGFjZSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlVmFsdWU7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gYXR0cmlidXRlUHJlZml4ICsgIjoiICsgcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsIGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIC8qKgotICAgICAgICAgKiAgbWV0aG9kIHRvIGhhbmRsZSBRbmFtZXMKLSAgICAgICAgICovCi0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWUoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMocHJlZml4ICsgIjoiICsgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGkuZSB0aGlzIGlzIHRoZSBkZWZhdWx0IG5hbWVzcGFjZQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZXMoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZVtdIHFuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgaWYgKHFuYW1lcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBzdG9yZSB0aGlzIGRhdGEgdW50aWwgbGFzdCBtb21lbnQgc2luY2UgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHdyaXRlIGFueQotICAgICAgICAgICAgICAgIC8vIG5hbWVzcGFjZSBkYXRhIGFmdGVyIHdyaXRpbmcgdGhlIGNoYXJhY3RvciBkYXRhCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZ0J1ZmZlciBzdHJpbmdUb1dyaXRlID0gbmV3IGphdmEubGFuZy5TdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBxbmFtZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZCgiICIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVVSSSA9IHFuYW1lc1tpXS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHByZWZpeCA9PSBudWxsKSB8fCAocHJlZml4Lmxlbmd0aCgpID09IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQocHJlZml4KS5hcHBlbmQoIjoiKS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhzdHJpbmdUb1dyaXRlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotCi0gICAgICAgICAvKioKLSAgICAgICAgICogUmVnaXN0ZXIgYSBuYW1lc3BhY2UgcHJlZml4Ci0gICAgICAgICAqLwotICAgICAgICAgcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHJlZ2lzdGVyUHJlZml4KGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoeG1sV3JpdGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHByZWZpeDsKLSAgICAgICAgICAgIH0KLQotCi0gIAotICAgICAgICAvKioKLSAgICAgICAgKiBkYXRhYmluZGluZyBtZXRob2QgdG8gZ2V0IGFuIFhNTCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdAotICAgICAgICAqCi0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciBnZXRQdWxsUGFyc2VyKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcU5hbWUpCi0gICAgICAgICAgICAgICAgICAgIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGVsZW1lbnRMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBhdHRyaWJMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXIuRUxFTUVOVF9URVhUKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbE5NVE9LRU4gIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsTk1UT0tFTikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJOTVRPS0VOIGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVySW1wbChxTmFtZSwgZWxlbWVudExpc3QudG9BcnJheSgpLCBhdHRyaWJMaXN0LnRvQXJyYXkoKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAKLQotICAgICAvKioKLSAgICAgICogIEZhY3RvcnkgY2xhc3MgdGhhdCBrZWVwcyB0aGUgcGFyc2UgbWV0aG9kCi0gICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeXsKLQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBOTVRPS0VOIGZyb21TdHJpbmcoamF2YS5sYW5nLlN0cmluZyB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSl7Ci0gICAgICAgICAgICAgICAgICAgIE5NVE9LRU4gcmV0dXJuVmFsdWUgPSBuZXcgIE5NVE9LRU4oKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUuc2V0Tk1UT0tFTigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb05NVE9LRU4odmFsdWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIE5NVE9LRU4gZnJvbVN0cmluZyhqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudC5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IGNvbnRlbnQuc3Vic3RyaW5nKDAsY29udGVudC5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVcmkgPSB4bWxTdHJlYW1SZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5NVE9LRU4uRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsbmFtZXNwYWNlVXJpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5NVE9LRU4uRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsIiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAKLQotICAgICAgICAvKioKLSAgICAgICAgKiBzdGF0aWMgbWV0aG9kIHRvIGNyZWF0ZSB0aGUgb2JqZWN0Ci0gICAgICAgICogUHJlY29uZGl0aW9uOiAgSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIGN1cnJlbnQgb3IgbmV4dCBzdGFydCBlbGVtZW50IHN0YXJ0cyB0aGlzIG9iamVjdCBhbmQgYW55IGludGVydmVuaW5nIHJlYWRlciBldmVudHMgYXJlIGlnbm9yYWJsZQotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIG5vdCBhbiBlbGVtZW50LCBpdCBpcyBhIGNvbXBsZXggdHlwZSBhbmQgdGhlIHJlYWRlciBpcyBhdCB0aGUgZXZlbnQganVzdCBhZnRlciB0aGUgb3V0ZXIgc3RhcnQgZWxlbWVudAotICAgICAgICAqIFBvc3Rjb25kaXRpb246IElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCBpdHMgZW5kIGVsZW1lbnQKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBhIGNvbXBsZXggdHlwZSwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IHRoZSBlbmQgZWxlbWVudCBvZiBpdHMgb3V0ZXIgZWxlbWVudAotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIE5NVE9LRU4gcGFyc2UoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIE5NVE9LRU4gb2JqZWN0ID0KLSAgICAgICAgICAgICAgICBuZXcgTk1UT0tFTigpOwotCi0gICAgICAgICAgICBpbnQgZXZlbnQ7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5pbGxhYmxlVmFsdWUgPSBudWxsOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSIiOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2V1cmkgPSIiOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSAoIXJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICYmICFyZWFkZXIuaXNFbmRFbGVtZW50KCkpCi0gICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiKSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGZ1bGxUeXBlTmFtZSA9IHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiKTsKLSAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUhPW51bGwpewotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zUHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoMCxmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IG5zUHJlZml4PT1udWxsPyIiOm5zUHJlZml4OwotCi0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgdHlwZSA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSsxKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEiTk1UT0tFTiIuZXF1YWxzKHR5cGUpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9maW5kIG5hbWVzcGFjZSBmb3IgdGhlIHByZWZpeAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zVXJpID0gcmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkobnNQcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKE5NVE9LRU4pb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2RpbmcuRXh0ZW5zaW9uTWFwcGVyLmdldFR5cGVPYmplY3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNVcmksdHlwZSxyZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gTm90ZSBhbGwgYXR0cmlidXRlcyB0aGF0IHdlcmUgaGFuZGxlZC4gVXNlZCB0byBkaWZmZXIgbm9ybWFsIGF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgICAvLyBmcm9tIGFueUF0dHJpYnV0ZXMuCi0gICAgICAgICAgICAgICAgamF2YS51dGlsLlZlY3RvciBoYW5kbGVkQXR0cmlidXRlcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUoIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQgPSByZWFkZXIuZ2V0RWxlbWVudFRleHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5zZXROTVRPS0VOKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9OTVRPS0VOKGNvbnRlbnQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBFbmQgb2YgaWYgZm9yIGV4cGVjdGVkIHByb3BlcnR5IHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2V7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBzdGFydCBlbGVtZW50IHdlIGFyZSBub3QgZXhwZWN0aW5nIGluZGljYXRlcyBhbiBpbnZhbGlkIHBhcmFtZXRlciB3YXMgcGFzc2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJVbmV4cGVjdGVkIHN1YmVsZW1lbnQgIiArIHJlYWRlci5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gZW5kIG9mIHdoaWxlIGxvb3AKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0KLQotICAgICAgICAgICAgfSBjYXRjaCAoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gb2JqZWN0OwotICAgICAgICB9Ci0KLSAgICAgICAgfS8vZW5kIG9mIGZhY3RvcnkgY2xhc3MKLQotICAgICAgICAKLQotICAgICAgICB9Ci0gICAgICAgICAgIAotICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvTk1UT0tFTlMuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvTk1UT0tFTlMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWU3YWM1Ny4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL05NVE9LRU5TLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDMgKzAsMCBAQAotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIE5NVE9LRU5TLmphdmEKLSAqCi0gKiBUaGlzIGZpbGUgd2FzIGF1dG8tZ2VuZXJhdGVkIGZyb20gV1NETAotICogYnkgdGhlIEFwYWNoZSBBeGlzMiB2ZXJzaW9uOiBTTkFQU0hPVCAgQnVpbHQgb24gOiBEZWMgMjEsIDIwMDcgKDA0OjAzOjMwIExLVCkKLSAqLwotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZzsKLSAgICAgICAgICAgIAotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogIE5NVE9LRU5TIGJlYW4gY2xhc3MKLSAgICAgICAgICAgICovCi0gICAgICAgIAotICAgICAgICBwdWJsaWMgIGNsYXNzIE5NVE9LRU5TCi0gICAgICAgIGltcGxlbWVudHMgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJCZWFuewotICAgICAgICAvKiBUaGlzIHR5cGUgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBwaWVjZSBvZiBzY2hlbWEgdGhhdCBoYWQKLSAgICAgICAgICAgICAgICBuYW1lID0gTk1UT0tFTlMKLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgVVJJID0gaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8KLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgUHJlZml4ID0gbnMxCi0gICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIAotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2VuZXJhdGVQcmVmaXgoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHsKLSAgICAgICAgICAgIGlmKG5hbWVzcGFjZS5lcXVhbHMoImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIikpewotICAgICAgICAgICAgICAgIHJldHVybiAiU09BUC1FTkMiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgIH0KLQotICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIGZpZWxkIGZvciBOTVRPS0VOUwotICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5OTVRva2VucyBsb2NhbE5NVE9LRU5TIDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBnZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5OTVRva2VucwotICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5OTVRva2VucyBnZXROTVRPS0VOUygpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbE5NVE9LRU5TOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgc2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtIHBhcmFtIE5NVE9LRU5TCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXROTVRPS0VOUyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLk5NVG9rZW5zIHBhcmFtKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2NhbE5NVE9LRU5TPXBhcmFtOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxOTVRPS0VOUy50b1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgLyoqCi0gICAgICogaXNSZWFkZXJNVE9NQXdhcmUKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlYWRlciBzdXBwb3J0cyBNVE9NCi0gICAgICovCi0gICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIHRyeXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGphdmEubGFuZy5Cb29sZWFuLlRSVUUuZXF1YWxzKHJlYWRlci5nZXRQcm9wZXJ0eShvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQ29uc3RhbnRzLklTX0RBVEFfSEFORExFUlNfQVdBUkUpKTsKLSAgICAgICAgfWNhdGNoKGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXNSZWFkZXJNVE9NQXdhcmU7Ci0gICB9Ci0gICAgIAotICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICoKLSAgICAgICAgKiBAcGFyYW0gcGFyZW50UU5hbWUKLSAgICAgICAgKiBAcGFyYW0gZmFjdG9yeQotICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICBwdWJsaWMgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgZ2V0T01FbGVtZW50ICgKLSAgICAgICAgICAgICAgIGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5KSB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlIGRhdGFTb3VyY2UgPQotICAgICAgICAgICAgICAgICAgICAgICBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJEYXRhU291cmNlKHRoaXMscGFyZW50UU5hbWUpewotCi0gICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICBOTVRPS0VOUy50aGlzLnNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5sbG9tLk9NU291cmNlZEVsZW1lbnRJbXBsKAotICAgICAgICAgICAgICAgcGFyZW50UU5hbWUsZmFjdG9yeSxkYXRhU291cmNlKTsKLSAgICAgICAgICAgIAotICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcixmYWxzZSk7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNlcmlhbGl6ZVR5cGUpCi0gICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgCi0KLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gcGFyZW50UU5hbWUuZ2V0UHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZSA9IHBhcmVudFFOYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlICE9IG51bGwpICYmIChuYW1lc3BhY2UudHJpbSgpLmxlbmd0aCgpID4gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgd3JpdGVyUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdyaXRlclByZWZpeCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KG5hbWVzcGFjZSwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocHJlZml4LCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgaWYgKHNlcmlhbGl6ZVR5cGUpewotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIik7Ci0gICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2VQcmVmaXggIT0gbnVsbCkgJiYgKG5hbWVzcGFjZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlUHJlZml4KyI6Tk1UT0tFTlMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJOTVRPS0VOUyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbE5NVE9LRU5TPT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZSB0aGUgbmlsIGF0dHJpYnV0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIk5NVE9LRU5TIGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsTk1UT0tFTlMpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRoIHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCxqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgIGlmICh4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLQotICAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsIGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlTmFtZXNwYWNlID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVWYWx1ZTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBhdHRyaWJ1dGVQcmVmaXggKyAiOiIgKyBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSwgYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICBtZXRob2QgdG8gaGFuZGxlIFFuYW1lcwotICAgICAgICAgKi8KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZShqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhwcmVmaXggKyAiOiIgKyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaS5lIHRoaXMgaXMgdGhlIGRlZmF1bHQgbmFtZXNwYWNlCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lcyhqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lW10gcW5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICBpZiAocW5hbWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHRvIHN0b3JlIHRoaXMgZGF0YSB1bnRpbCBsYXN0IG1vbWVudCBzaW5jZSBpdCBpcyBub3QgcG9zc2libGUgdG8gd3JpdGUgYW55Ci0gICAgICAgICAgICAgICAgLy8gbmFtZXNwYWNlIGRhdGEgYWZ0ZXIgd3JpdGluZyB0aGUgY2hhcmFjdG9yIGRhdGEKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIHN0cmluZ1RvV3JpdGUgPSBuZXcgamF2YS5sYW5nLlN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHFuYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKCIgIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlVVJJID0gcW5hbWVzW2ldLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocHJlZml4ID09IG51bGwpIHx8IChwcmVmaXgubGVuZ3RoKCkgPT0gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChwcmVmaXgpLmFwcGVuZCgiOiIpLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHN0cmluZ1RvV3JpdGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0KLSAgICAgICAgIC8qKgotICAgICAgICAgKiBSZWdpc3RlciBhIG5hbWVzcGFjZSBwcmVmaXgKLSAgICAgICAgICovCi0gICAgICAgICBwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgcmVnaXN0ZXJQcmVmaXgoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLCBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlICh4bWxXcml0ZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gcHJlZml4OwotICAgICAgICAgICAgfQotCi0KLSAgCi0gICAgICAgIC8qKgotICAgICAgICAqIGRhdGFiaW5kaW5nIG1ldGhvZCB0byBnZXQgYW4gWE1MIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0Ci0gICAgICAgICoKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIGdldFB1bGxQYXJzZXIoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxTmFtZSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgZWxlbWVudExpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGF0dHJpYkxpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlci5FTEVNRU5UX1RFWFQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsTk1UT0tFTlMgIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsTk1UT0tFTlMpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiTk1UT0tFTlMgY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXJJbXBsKHFOYW1lLCBlbGVtZW50TGlzdC50b0FycmF5KCksIGF0dHJpYkxpc3QudG9BcnJheSgpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gIAotCi0gICAgIC8qKgotICAgICAgKiAgRmFjdG9yeSBjbGFzcyB0aGF0IGtlZXBzIHRoZSBwYXJzZSBtZXRob2QKLSAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5ewotCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIE5NVE9LRU5TIGZyb21TdHJpbmcoamF2YS5sYW5nLlN0cmluZyB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSl7Ci0gICAgICAgICAgICAgICAgICAgIE5NVE9LRU5TIHJldHVyblZhbHVlID0gbmV3ICBOTVRPS0VOUygpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZS5zZXROTVRPS0VOUygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb05NVE9LRU5TKHZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBOTVRPS0VOUyBmcm9tU3RyaW5nKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50LmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gY29udGVudC5zdWJzdHJpbmcoMCxjb250ZW50LmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVyaSA9IHhtbFN0cmVhbVJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk1UT0tFTlMuRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsbmFtZXNwYWNlVXJpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5NVE9LRU5TLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LCIiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgCi0KLSAgICAgICAgLyoqCi0gICAgICAgICogc3RhdGljIG1ldGhvZCB0byBjcmVhdGUgdGhlIG9iamVjdAotICAgICAgICAqIFByZWNvbmRpdGlvbjogIElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSBjdXJyZW50IG9yIG5leHQgc3RhcnQgZWxlbWVudCBzdGFydHMgdGhpcyBvYmplY3QgYW5kIGFueSBpbnRlcnZlbmluZyByZWFkZXIgZXZlbnRzIGFyZSBpZ25vcmFibGUKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBub3QgYW4gZWxlbWVudCwgaXQgaXMgYSBjb21wbGV4IHR5cGUgYW5kIHRoZSByZWFkZXIgaXMgYXQgdGhlIGV2ZW50IGp1c3QgYWZ0ZXIgdGhlIG91dGVyIHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgKiBQb3N0Y29uZGl0aW9uOiBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgaXRzIGVuZCBlbGVtZW50Ci0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgYSBjb21wbGV4IHR5cGUsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCB0aGUgZW5kIGVsZW1lbnQgb2YgaXRzIG91dGVyIGVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBOTVRPS0VOUyBwYXJzZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uewotICAgICAgICAgICAgTk1UT0tFTlMgb2JqZWN0ID0KLSAgICAgICAgICAgICAgICBuZXcgTk1UT0tFTlMoKTsKLQotICAgICAgICAgICAgaW50IGV2ZW50OwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuaWxsYWJsZVZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0iIjsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNldXJpID0iIjsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUgKCFyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAmJiAhcmVhZGVyLmlzRW5kRWxlbWVudCgpKQotICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIikhPW51bGwpewotICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBmdWxsVHlwZU5hbWUgPSByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIik7Ci0gICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1ByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKDAsZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBuc1ByZWZpeD09bnVsbD8iIjpuc1ByZWZpeDsKLQotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHR5cGUgPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikrMSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIk5NVE9LRU5TIi5lcXVhbHModHlwZSkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2ZpbmQgbmFtZXNwYWNlIGZvciB0aGUgcHJlZml4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNVcmkgPSByZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShuc1ByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoTk1UT0tFTlMpb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2RpbmcuRXh0ZW5zaW9uTWFwcGVyLmdldFR5cGVPYmplY3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNVcmksdHlwZSxyZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gTm90ZSBhbGwgYXR0cmlidXRlcyB0aGF0IHdlcmUgaGFuZGxlZC4gVXNlZCB0byBkaWZmZXIgbm9ybWFsIGF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgICAvLyBmcm9tIGFueUF0dHJpYnV0ZXMuCi0gICAgICAgICAgICAgICAgamF2YS51dGlsLlZlY3RvciBoYW5kbGVkQXR0cmlidXRlcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUoIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQgPSByZWFkZXIuZ2V0RWxlbWVudFRleHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5zZXROTVRPS0VOUygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvTk1UT0tFTlMoY29udGVudCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIEVuZCBvZiBpZiBmb3IgZXhwZWN0ZWQgcHJvcGVydHkgc3RhcnQgZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHN0YXJ0IGVsZW1lbnQgd2UgYXJlIG5vdCBleHBlY3RpbmcgaW5kaWNhdGVzIGFuIGludmFsaWQgcGFyYW1ldGVyIHdhcyBwYXNzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIlVuZXhwZWN0ZWQgc3ViZWxlbWVudCAiICsgcmVhZGVyLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBlbmQgb2Ygd2hpbGUgbG9vcAotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLQotCi0gICAgICAgICAgICB9IGNhdGNoIChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEubGFuZy5FeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBvYmplY3Q7Ci0gICAgICAgIH0KLQotICAgICAgICB9Ly9lbmQgb2YgZmFjdG9yeSBjbGFzcwotCi0gICAgICAgIAotCi0gICAgICAgIH0KLSAgICAgICAgICAgCi0gICAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9OT1RBVElPTi5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9OT1RBVElPTi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzg4NWFiLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvTk9UQVRJT04uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxMCArMCwwIEBACi0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICogTk9UQVRJT04uamF2YQotICoKLSAqIFRoaXMgZmlsZSB3YXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBXU0RMCi0gKiBieSB0aGUgQXBhY2hlIEF4aXMyIHZlcnNpb246IFNOQVBTSE9UICBCdWlsdCBvbiA6IERlYyAyMSwgMjAwNyAoMDQ6MDM6MzAgTEtUKQotICovCi0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBwYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nOwotICAgICAgICAgICAgCi0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiAgTk9UQVRJT04gYmVhbiBjbGFzcwotICAgICAgICAgICAgKi8KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyAgY2xhc3MgTk9UQVRJT04KLSAgICAgICAgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkJlYW57Ci0gICAgICAgIC8qIFRoaXMgdHlwZSB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIHBpZWNlIG9mIHNjaGVtYSB0aGF0IGhhZAotICAgICAgICAgICAgICAgIG5hbWUgPSBOT1RBVElPTgotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBVUkkgPSBodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLwotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBQcmVmaXggPSBuczEKLSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgCi0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZW5lcmF0ZVByZWZpeChqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICAgICAgaWYobmFtZXNwYWNlLmVxdWFscygiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iKSl7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJTT0FQLUVOQyI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgfQotCi0gICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogZmllbGQgZm9yIFFOYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIGxvY2FsUU5hbWUgOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIGdldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljICBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIGdldFFOYW1lKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsUU5hbWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBzZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gcGFyYW0gUU5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldFFOYW1lKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyYW0pewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2FsUU5hbWU9cGFyYW07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbFFOYW1lLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAvKioKLSAgICAgKiBpc1JlYWRlck1UT01Bd2FyZQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVhZGVyIHN1cHBvcnRzIE1UT00KLSAgICAgKi8KLSAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKLSAgICAgICAgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICAKLSAgICAgICAgdHJ5ewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gamF2YS5sYW5nLkJvb2xlYW4uVFJVRS5lcXVhbHMocmVhZGVyLmdldFByb3BlcnR5KG9yZy5hcGFjaGUuYXhpb20ub20uT01Db25zdGFudHMuSVNfREFUQV9IQU5ETEVSU19BV0FSRSkpOwotICAgICAgICB9Y2F0Y2goamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpc1JlYWRlck1UT01Bd2FyZTsKLSAgIH0KLSAgICAgCi0gICAgIAotICAgICAgICAvKioKLSAgICAgICAgKgotICAgICAgICAqIEBwYXJhbSBwYXJlbnRRTmFtZQotICAgICAgICAqIEBwYXJhbSBmYWN0b3J5Ci0gICAgICAgICogQHJldHVybiBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudAotICAgICAgICAqLwotICAgICAgIHB1YmxpYyBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCBnZXRPTUVsZW1lbnQgKAotICAgICAgICAgICAgICAgZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnkpIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTURhdGFTb3VyY2UgZGF0YVNvdXJjZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkRhdGFTb3VyY2UodGhpcyxwYXJlbnRRTmFtZSl7Ci0KLSAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgIE5PVEFUSU9OLnRoaXMuc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmxsb20uT01Tb3VyY2VkRWxlbWVudEltcGwoCi0gICAgICAgICAgICAgICBwYXJlbnRRTmFtZSxmYWN0b3J5LGRhdGFTb3VyY2UpOwotICAgICAgICAgICAgCi0gICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyLGZhbHNlKTsKLSAgICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VyaWFsaXplVHlwZSkKLSAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLQotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBwYXJlbnRRTmFtZS5nZXRQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlID0gcGFyZW50UU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2UgIT0gbnVsbCkgJiYgKG5hbWVzcGFjZS50cmltKCkubGVuZ3RoKCkgPiAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB3cml0ZXJQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAod3JpdGVyUHJlZml4ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQobmFtZXNwYWNlLCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwcmVmaXgsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICBpZiAoc2VyaWFsaXplVHlwZSl7Ci0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iKTsKLSAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZVByZWZpeCAhPSBudWxsKSAmJiAobmFtZXNwYWNlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApKXsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VQcmVmaXgrIjpOT1RBVElPTiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5PVEFUSU9OIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsUU5hbWU9PW51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIHRoZSBuaWwgYXR0cmlidXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiUU5hbWUgY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZVFOYW1lKGxvY2FsUU5hbWUseG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRoIHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCxqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgIGlmICh4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLQotICAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsIGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlTmFtZXNwYWNlID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVWYWx1ZTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBhdHRyaWJ1dGVQcmVmaXggKyAiOiIgKyBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSwgYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICBtZXRob2QgdG8gaGFuZGxlIFFuYW1lcwotICAgICAgICAgKi8KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZShqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhwcmVmaXggKyAiOiIgKyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaS5lIHRoaXMgaXMgdGhlIGRlZmF1bHQgbmFtZXNwYWNlCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lcyhqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lW10gcW5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICBpZiAocW5hbWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHRvIHN0b3JlIHRoaXMgZGF0YSB1bnRpbCBsYXN0IG1vbWVudCBzaW5jZSBpdCBpcyBub3QgcG9zc2libGUgdG8gd3JpdGUgYW55Ci0gICAgICAgICAgICAgICAgLy8gbmFtZXNwYWNlIGRhdGEgYWZ0ZXIgd3JpdGluZyB0aGUgY2hhcmFjdG9yIGRhdGEKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIHN0cmluZ1RvV3JpdGUgPSBuZXcgamF2YS5sYW5nLlN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHFuYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKCIgIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlVVJJID0gcW5hbWVzW2ldLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocHJlZml4ID09IG51bGwpIHx8IChwcmVmaXgubGVuZ3RoKCkgPT0gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChwcmVmaXgpLmFwcGVuZCgiOiIpLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHN0cmluZ1RvV3JpdGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0KLSAgICAgICAgIC8qKgotICAgICAgICAgKiBSZWdpc3RlciBhIG5hbWVzcGFjZSBwcmVmaXgKLSAgICAgICAgICovCi0gICAgICAgICBwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgcmVnaXN0ZXJQcmVmaXgoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLCBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlICh4bWxXcml0ZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gcHJlZml4OwotICAgICAgICAgICAgfQotCi0KLSAgCi0gICAgICAgIC8qKgotICAgICAgICAqIGRhdGFiaW5kaW5nIG1ldGhvZCB0byBnZXQgYW4gWE1MIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0Ci0gICAgICAgICoKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIGdldFB1bGxQYXJzZXIoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxTmFtZSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgZWxlbWVudExpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGF0dHJpYkxpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlci5FTEVNRU5UX1RFWFQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsUU5hbWUgIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsUU5hbWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiUU5hbWUgY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXJJbXBsKHFOYW1lLCBlbGVtZW50TGlzdC50b0FycmF5KCksIGF0dHJpYkxpc3QudG9BcnJheSgpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gIAotCi0gICAgIC8qKgotICAgICAgKiAgRmFjdG9yeSBjbGFzcyB0aGF0IGtlZXBzIHRoZSBwYXJzZSBtZXRob2QKLSAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5ewotCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIE5PVEFUSU9OIGZyb21TdHJpbmcoamF2YS5sYW5nLlN0cmluZyB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSl7Ci0gICAgICAgICAgICAgICAgICAgIE5PVEFUSU9OIHJldHVyblZhbHVlID0gbmV3ICBOT1RBVElPTigpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZS5zZXRRTmFtZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1FOYW1lKHZhbHVlLG5hbWVzcGFjZVVSSSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgTk9UQVRJT04gZnJvbVN0cmluZyhqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudC5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IGNvbnRlbnQuc3Vic3RyaW5nKDAsY29udGVudC5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVcmkgPSB4bWxTdHJlYW1SZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PVEFUSU9OLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LG5hbWVzcGFjZVVyaSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT1RBVElPTi5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCwiIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIAotCi0gICAgICAgIC8qKgotICAgICAgICAqIHN0YXRpYyBtZXRob2QgdG8gY3JlYXRlIHRoZSBvYmplY3QKLSAgICAgICAgKiBQcmVjb25kaXRpb246ICBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgY3VycmVudCBvciBuZXh0IHN0YXJ0IGVsZW1lbnQgc3RhcnRzIHRoaXMgb2JqZWN0IGFuZCBhbnkgaW50ZXJ2ZW5pbmcgcmVhZGVyIGV2ZW50cyBhcmUgaWdub3JhYmxlCi0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgbm90IGFuIGVsZW1lbnQsIGl0IGlzIGEgY29tcGxleCB0eXBlIGFuZCB0aGUgcmVhZGVyIGlzIGF0IHRoZSBldmVudCBqdXN0IGFmdGVyIHRoZSBvdXRlciBzdGFydCBlbGVtZW50Ci0gICAgICAgICogUG9zdGNvbmRpdGlvbjogSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IGl0cyBlbmQgZWxlbWVudAotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIGEgY29tcGxleCB0eXBlLCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgdGhlIGVuZCBlbGVtZW50IG9mIGl0cyBvdXRlciBlbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgTk9UQVRJT04gcGFyc2UoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIE5PVEFUSU9OIG9iamVjdCA9Ci0gICAgICAgICAgICAgICAgbmV3IE5PVEFUSU9OKCk7Ci0KLSAgICAgICAgICAgIGludCBldmVudDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmlsbGFibGVWYWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IiI7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZXVyaSA9IiI7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlICghcmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgJiYgIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkKLSAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIpIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgZnVsbFR5cGVOYW1lID0gcmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAidHlwZSIpOwotICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNQcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZygwLGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gbnNQcmVmaXg9PW51bGw/IiI6bnNQcmVmaXg7Ci0KLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB0eXBlID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZyhmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKzEpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISJOT1RBVElPTiIuZXF1YWxzKHR5cGUpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9maW5kIG5hbWVzcGFjZSBmb3IgdGhlIHByZWZpeAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zVXJpID0gcmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkobnNQcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKE5PVEFUSU9OKW9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLkV4dGVuc2lvbk1hcHBlci5nZXRUeXBlT2JqZWN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zVXJpLHR5cGUscmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIE5vdGUgYWxsIGF0dHJpYnV0ZXMgdGhhdCB3ZXJlIGhhbmRsZWQuIFVzZWQgdG8gZGlmZmVyIG5vcm1hbCBhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgICAgLy8gZnJvbSBhbnlBdHRyaWJ1dGVzLgotICAgICAgICAgICAgICAgIGphdmEudXRpbC5WZWN0b3IgaGFuZGxlZEF0dHJpYnV0ZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlKCFyZWFkZXIuaXNFbmRFbGVtZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50ID0gcmVhZGVyLmdldEVsZW1lbnRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4ID0gY29udGVudC5pbmRleE9mKCI6Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGluZGV4ID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBjb250ZW50LnN1YnN0cmluZygwLGluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSAiIjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZXVyaSA9IHJlYWRlci5nZXROYW1lc3BhY2VVUkkocHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5zZXRRTmFtZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1FOYW1lKGNvbnRlbnQsbmFtZXNwYWNldXJpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gRW5kIG9mIGlmIGZvciBleHBlY3RlZCBwcm9wZXJ0eSBzdGFydCBlbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgc3RhcnQgZWxlbWVudCB3ZSBhcmUgbm90IGV4cGVjdGluZyBpbmRpY2F0ZXMgYW4gaW52YWxpZCBwYXJhbWV0ZXIgd2FzIHBhc3NlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiVW5leHBlY3RlZCBzdWJlbGVtZW50ICIgKyByZWFkZXIuZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIGVuZCBvZiB3aGlsZSBsb29wCi0gICAgICAgICAgICAgICAgICAgICAgICAKLQotCi0KLSAgICAgICAgICAgIH0gY2F0Y2ggKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5sYW5nLkV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG9iamVjdDsKLSAgICAgICAgfQotCi0gICAgICAgIH0vL2VuZCBvZiBmYWN0b3J5IGNsYXNzCi0KLSAgICAgICAgCi0KLSAgICAgICAgfQotICAgICAgICAgICAKLSAgICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL05hbWUuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvTmFtZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGMwNDA3Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvTmFtZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAzICswLDAgQEAKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBOYW1lLmphdmEKLSAqCi0gKiBUaGlzIGZpbGUgd2FzIGF1dG8tZ2VuZXJhdGVkIGZyb20gV1NETAotICogYnkgdGhlIEFwYWNoZSBBeGlzMiB2ZXJzaW9uOiBTTkFQU0hPVCAgQnVpbHQgb24gOiBEZWMgMjEsIDIwMDcgKDA0OjAzOjMwIExLVCkKLSAqLwotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZzsKLSAgICAgICAgICAgIAotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogIE5hbWUgYmVhbiBjbGFzcwotICAgICAgICAgICAgKi8KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyAgY2xhc3MgTmFtZQotICAgICAgICBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCQmVhbnsKLSAgICAgICAgLyogVGhpcyB0eXBlIHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgcGllY2Ugb2Ygc2NoZW1hIHRoYXQgaGFkCi0gICAgICAgICAgICAgICAgbmFtZSA9IE5hbWUKLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgVVJJID0gaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8KLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgUHJlZml4ID0gbnMxCi0gICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIAotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2VuZXJhdGVQcmVmaXgoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHsKLSAgICAgICAgICAgIGlmKG5hbWVzcGFjZS5lcXVhbHMoImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIikpewotICAgICAgICAgICAgICAgIHJldHVybiAiU09BUC1FTkMiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgIH0KLQotICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIGZpZWxkIGZvciBOYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLk5hbWUgbG9jYWxOYW1lIDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBnZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5OYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLk5hbWUgZ2V0TmFtZSgpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbE5hbWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBzZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gcGFyYW0gTmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0TmFtZShvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLk5hbWUgcGFyYW0pewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2FsTmFtZT1wYXJhbTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsTmFtZS50b1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgLyoqCi0gICAgICogaXNSZWFkZXJNVE9NQXdhcmUKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlYWRlciBzdXBwb3J0cyBNVE9NCi0gICAgICovCi0gICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIHRyeXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGphdmEubGFuZy5Cb29sZWFuLlRSVUUuZXF1YWxzKHJlYWRlci5nZXRQcm9wZXJ0eShvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQ29uc3RhbnRzLklTX0RBVEFfSEFORExFUlNfQVdBUkUpKTsKLSAgICAgICAgfWNhdGNoKGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXNSZWFkZXJNVE9NQXdhcmU7Ci0gICB9Ci0gICAgIAotICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICoKLSAgICAgICAgKiBAcGFyYW0gcGFyZW50UU5hbWUKLSAgICAgICAgKiBAcGFyYW0gZmFjdG9yeQotICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICBwdWJsaWMgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgZ2V0T01FbGVtZW50ICgKLSAgICAgICAgICAgICAgIGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5KSB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlIGRhdGFTb3VyY2UgPQotICAgICAgICAgICAgICAgICAgICAgICBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJEYXRhU291cmNlKHRoaXMscGFyZW50UU5hbWUpewotCi0gICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICBOYW1lLnRoaXMuc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmxsb20uT01Tb3VyY2VkRWxlbWVudEltcGwoCi0gICAgICAgICAgICAgICBwYXJlbnRRTmFtZSxmYWN0b3J5LGRhdGFTb3VyY2UpOwotICAgICAgICAgICAgCi0gICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyLGZhbHNlKTsKLSAgICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VyaWFsaXplVHlwZSkKLSAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLQotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBwYXJlbnRRTmFtZS5nZXRQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlID0gcGFyZW50UU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2UgIT0gbnVsbCkgJiYgKG5hbWVzcGFjZS50cmltKCkubGVuZ3RoKCkgPiAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB3cml0ZXJQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAod3JpdGVyUHJlZml4ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQobmFtZXNwYWNlLCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwcmVmaXgsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICBpZiAoc2VyaWFsaXplVHlwZSl7Ci0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iKTsKLSAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZVByZWZpeCAhPSBudWxsKSAmJiAobmFtZXNwYWNlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApKXsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VQcmVmaXgrIjpOYW1lIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiTmFtZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbE5hbWU9PW51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIHRoZSBuaWwgYXR0cmlidXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiTmFtZSBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbE5hbWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRoIHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCxqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgIGlmICh4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLQotICAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsIGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlTmFtZXNwYWNlID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVWYWx1ZTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBhdHRyaWJ1dGVQcmVmaXggKyAiOiIgKyBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSwgYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICBtZXRob2QgdG8gaGFuZGxlIFFuYW1lcwotICAgICAgICAgKi8KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZShqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhwcmVmaXggKyAiOiIgKyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaS5lIHRoaXMgaXMgdGhlIGRlZmF1bHQgbmFtZXNwYWNlCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lcyhqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lW10gcW5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICBpZiAocW5hbWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHRvIHN0b3JlIHRoaXMgZGF0YSB1bnRpbCBsYXN0IG1vbWVudCBzaW5jZSBpdCBpcyBub3QgcG9zc2libGUgdG8gd3JpdGUgYW55Ci0gICAgICAgICAgICAgICAgLy8gbmFtZXNwYWNlIGRhdGEgYWZ0ZXIgd3JpdGluZyB0aGUgY2hhcmFjdG9yIGRhdGEKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIHN0cmluZ1RvV3JpdGUgPSBuZXcgamF2YS5sYW5nLlN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHFuYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKCIgIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlVVJJID0gcW5hbWVzW2ldLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocHJlZml4ID09IG51bGwpIHx8IChwcmVmaXgubGVuZ3RoKCkgPT0gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChwcmVmaXgpLmFwcGVuZCgiOiIpLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHN0cmluZ1RvV3JpdGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0KLSAgICAgICAgIC8qKgotICAgICAgICAgKiBSZWdpc3RlciBhIG5hbWVzcGFjZSBwcmVmaXgKLSAgICAgICAgICovCi0gICAgICAgICBwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgcmVnaXN0ZXJQcmVmaXgoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLCBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlICh4bWxXcml0ZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gcHJlZml4OwotICAgICAgICAgICAgfQotCi0KLSAgCi0gICAgICAgIC8qKgotICAgICAgICAqIGRhdGFiaW5kaW5nIG1ldGhvZCB0byBnZXQgYW4gWE1MIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0Ci0gICAgICAgICoKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIGdldFB1bGxQYXJzZXIoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxTmFtZSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgZWxlbWVudExpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGF0dHJpYkxpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlci5FTEVNRU5UX1RFWFQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsTmFtZSAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxOYW1lKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIk5hbWUgY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXJJbXBsKHFOYW1lLCBlbGVtZW50TGlzdC50b0FycmF5KCksIGF0dHJpYkxpc3QudG9BcnJheSgpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gIAotCi0gICAgIC8qKgotICAgICAgKiAgRmFjdG9yeSBjbGFzcyB0aGF0IGtlZXBzIHRoZSBwYXJzZSBtZXRob2QKLSAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5ewotCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIE5hbWUgZnJvbVN0cmluZyhqYXZhLmxhbmcuU3RyaW5nIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJKXsKLSAgICAgICAgICAgICAgICAgICAgTmFtZSByZXR1cm5WYWx1ZSA9IG5ldyAgTmFtZSgpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZS5zZXROYW1lKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvTmFtZSh2YWx1ZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgTmFtZSBmcm9tU3RyaW5nKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50LmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gY29udGVudC5zdWJzdHJpbmcoMCxjb250ZW50LmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVyaSA9IHhtbFN0cmVhbVJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTmFtZS5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCxuYW1lc3BhY2VVcmkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTmFtZS5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCwiIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIAotCi0gICAgICAgIC8qKgotICAgICAgICAqIHN0YXRpYyBtZXRob2QgdG8gY3JlYXRlIHRoZSBvYmplY3QKLSAgICAgICAgKiBQcmVjb25kaXRpb246ICBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgY3VycmVudCBvciBuZXh0IHN0YXJ0IGVsZW1lbnQgc3RhcnRzIHRoaXMgb2JqZWN0IGFuZCBhbnkgaW50ZXJ2ZW5pbmcgcmVhZGVyIGV2ZW50cyBhcmUgaWdub3JhYmxlCi0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgbm90IGFuIGVsZW1lbnQsIGl0IGlzIGEgY29tcGxleCB0eXBlIGFuZCB0aGUgcmVhZGVyIGlzIGF0IHRoZSBldmVudCBqdXN0IGFmdGVyIHRoZSBvdXRlciBzdGFydCBlbGVtZW50Ci0gICAgICAgICogUG9zdGNvbmRpdGlvbjogSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IGl0cyBlbmQgZWxlbWVudAotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIGEgY29tcGxleCB0eXBlLCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgdGhlIGVuZCBlbGVtZW50IG9mIGl0cyBvdXRlciBlbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgTmFtZSBwYXJzZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uewotICAgICAgICAgICAgTmFtZSBvYmplY3QgPQotICAgICAgICAgICAgICAgIG5ldyBOYW1lKCk7Ci0KLSAgICAgICAgICAgIGludCBldmVudDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmlsbGFibGVWYWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IiI7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZXVyaSA9IiI7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlICghcmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgJiYgIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkKLSAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIpIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgZnVsbFR5cGVOYW1lID0gcmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAidHlwZSIpOwotICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNQcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZygwLGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gbnNQcmVmaXg9PW51bGw/IiI6bnNQcmVmaXg7Ci0KLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB0eXBlID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZyhmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKzEpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISJOYW1lIi5lcXVhbHModHlwZSkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2ZpbmQgbmFtZXNwYWNlIGZvciB0aGUgcHJlZml4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNVcmkgPSByZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShuc1ByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoTmFtZSlvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZy5FeHRlbnNpb25NYXBwZXIuZ2V0VHlwZU9iamVjdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc1VyaSx0eXBlLHJlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBOb3RlIGFsbCBhdHRyaWJ1dGVzIHRoYXQgd2VyZSBoYW5kbGVkLiBVc2VkIHRvIGRpZmZlciBub3JtYWwgYXR0cmlidXRlcwotICAgICAgICAgICAgICAgIC8vIGZyb20gYW55QXR0cmlidXRlcy4KLSAgICAgICAgICAgICAgICBqYXZhLnV0aWwuVmVjdG9yIGhhbmRsZWRBdHRyaWJ1dGVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSghcmVhZGVyLmlzRW5kRWxlbWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCA9IHJlYWRlci5nZXRFbGVtZW50VGV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldE5hbWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb05hbWUoY29udGVudCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIEVuZCBvZiBpZiBmb3IgZXhwZWN0ZWQgcHJvcGVydHkgc3RhcnQgZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHN0YXJ0IGVsZW1lbnQgd2UgYXJlIG5vdCBleHBlY3RpbmcgaW5kaWNhdGVzIGFuIGludmFsaWQgcGFyYW1ldGVyIHdhcyBwYXNzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIlVuZXhwZWN0ZWQgc3ViZWxlbWVudCAiICsgcmVhZGVyLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBlbmQgb2Ygd2hpbGUgbG9vcAotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLQotCi0gICAgICAgICAgICB9IGNhdGNoIChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEubGFuZy5FeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBvYmplY3Q7Ci0gICAgICAgIH0KLQotICAgICAgICB9Ly9lbmQgb2YgZmFjdG9yeSBjbGFzcwotCi0gICAgICAgIAotCi0gICAgICAgIH0KLSAgICAgICAgICAgCi0gICAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9OZWdhdGl2ZUludGVnZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvTmVnYXRpdmVJbnRlZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5NmQyOTcuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9OZWdhdGl2ZUludGVnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwMyArMCwwIEBACi0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICogTmVnYXRpdmVJbnRlZ2VyLmphdmEKLSAqCi0gKiBUaGlzIGZpbGUgd2FzIGF1dG8tZ2VuZXJhdGVkIGZyb20gV1NETAotICogYnkgdGhlIEFwYWNoZSBBeGlzMiB2ZXJzaW9uOiBTTkFQU0hPVCAgQnVpbHQgb24gOiBEZWMgMjEsIDIwMDcgKDA0OjAzOjMwIExLVCkKLSAqLwotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZzsKLSAgICAgICAgICAgIAotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogIE5lZ2F0aXZlSW50ZWdlciBiZWFuIGNsYXNzCi0gICAgICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgcHVibGljICBjbGFzcyBOZWdhdGl2ZUludGVnZXIKLSAgICAgICAgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkJlYW57Ci0gICAgICAgIC8qIFRoaXMgdHlwZSB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIHBpZWNlIG9mIHNjaGVtYSB0aGF0IGhhZAotICAgICAgICAgICAgICAgIG5hbWUgPSBuZWdhdGl2ZUludGVnZXIKLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgVVJJID0gaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8KLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgUHJlZml4ID0gbnMxCi0gICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIAotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2VuZXJhdGVQcmVmaXgoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHsKLSAgICAgICAgICAgIGlmKG5hbWVzcGFjZS5lcXVhbHMoImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIikpewotICAgICAgICAgICAgICAgIHJldHVybiAiU09BUC1FTkMiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgIH0KLQotICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIGZpZWxkIGZvciBOZWdhdGl2ZUludGVnZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuTmVnYXRpdmVJbnRlZ2VyIGxvY2FsTmVnYXRpdmVJbnRlZ2VyIDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBnZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5OZWdhdGl2ZUludGVnZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuTmVnYXRpdmVJbnRlZ2VyIGdldE5lZ2F0aXZlSW50ZWdlcigpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbE5lZ2F0aXZlSW50ZWdlcjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIHNldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSBwYXJhbSBOZWdhdGl2ZUludGVnZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldE5lZ2F0aXZlSW50ZWdlcihvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLk5lZ2F0aXZlSW50ZWdlciBwYXJhbSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYWxOZWdhdGl2ZUludGVnZXI9cGFyYW07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbE5lZ2F0aXZlSW50ZWdlci50b1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgLyoqCi0gICAgICogaXNSZWFkZXJNVE9NQXdhcmUKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlYWRlciBzdXBwb3J0cyBNVE9NCi0gICAgICovCi0gICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIHRyeXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGphdmEubGFuZy5Cb29sZWFuLlRSVUUuZXF1YWxzKHJlYWRlci5nZXRQcm9wZXJ0eShvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQ29uc3RhbnRzLklTX0RBVEFfSEFORExFUlNfQVdBUkUpKTsKLSAgICAgICAgfWNhdGNoKGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXNSZWFkZXJNVE9NQXdhcmU7Ci0gICB9Ci0gICAgIAotICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICoKLSAgICAgICAgKiBAcGFyYW0gcGFyZW50UU5hbWUKLSAgICAgICAgKiBAcGFyYW0gZmFjdG9yeQotICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICBwdWJsaWMgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgZ2V0T01FbGVtZW50ICgKLSAgICAgICAgICAgICAgIGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5KSB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlIGRhdGFTb3VyY2UgPQotICAgICAgICAgICAgICAgICAgICAgICBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJEYXRhU291cmNlKHRoaXMscGFyZW50UU5hbWUpewotCi0gICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICBOZWdhdGl2ZUludGVnZXIudGhpcy5zZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5PTVNvdXJjZWRFbGVtZW50SW1wbCgKLSAgICAgICAgICAgICAgIHBhcmVudFFOYW1lLGZhY3RvcnksZGF0YVNvdXJjZSk7Ci0gICAgICAgICAgICAKLSAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIsZmFsc2UpOwotICAgICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzZXJpYWxpemVUeXBlKQotICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotCi0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UgPSBudWxsOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHBhcmVudFFOYW1lLmdldFByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UgPSBwYXJlbnRRTmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZSAhPSBudWxsKSAmJiAobmFtZXNwYWNlLnRyaW0oKS5sZW5ndGgoKSA+IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHdyaXRlclByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3cml0ZXJQcmVmaXggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChuYW1lc3BhY2UsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHByZWZpeCwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCksIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIGlmIChzZXJpYWxpemVUeXBlKXsKLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIpOwotICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlUHJlZml4ICE9IG51bGwpICYmIChuYW1lc3BhY2VQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkpewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVByZWZpeCsiOm5lZ2F0aXZlSW50ZWdlciIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5lZ2F0aXZlSW50ZWdlciIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbE5lZ2F0aXZlSW50ZWdlcj09bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgdGhlIG5pbCBhdHRyaWJ1dGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJuZWdhdGl2ZUludGVnZXIgY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxOZWdhdGl2ZUludGVnZXIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRoIHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCxqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgIGlmICh4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLQotICAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsIGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlTmFtZXNwYWNlID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVWYWx1ZTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBhdHRyaWJ1dGVQcmVmaXggKyAiOiIgKyBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSwgYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICBtZXRob2QgdG8gaGFuZGxlIFFuYW1lcwotICAgICAgICAgKi8KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZShqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhwcmVmaXggKyAiOiIgKyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaS5lIHRoaXMgaXMgdGhlIGRlZmF1bHQgbmFtZXNwYWNlCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lcyhqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lW10gcW5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICBpZiAocW5hbWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHRvIHN0b3JlIHRoaXMgZGF0YSB1bnRpbCBsYXN0IG1vbWVudCBzaW5jZSBpdCBpcyBub3QgcG9zc2libGUgdG8gd3JpdGUgYW55Ci0gICAgICAgICAgICAgICAgLy8gbmFtZXNwYWNlIGRhdGEgYWZ0ZXIgd3JpdGluZyB0aGUgY2hhcmFjdG9yIGRhdGEKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIHN0cmluZ1RvV3JpdGUgPSBuZXcgamF2YS5sYW5nLlN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHFuYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKCIgIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlVVJJID0gcW5hbWVzW2ldLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocHJlZml4ID09IG51bGwpIHx8IChwcmVmaXgubGVuZ3RoKCkgPT0gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChwcmVmaXgpLmFwcGVuZCgiOiIpLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHN0cmluZ1RvV3JpdGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0KLSAgICAgICAgIC8qKgotICAgICAgICAgKiBSZWdpc3RlciBhIG5hbWVzcGFjZSBwcmVmaXgKLSAgICAgICAgICovCi0gICAgICAgICBwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgcmVnaXN0ZXJQcmVmaXgoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLCBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlICh4bWxXcml0ZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gcHJlZml4OwotICAgICAgICAgICAgfQotCi0KLSAgCi0gICAgICAgIC8qKgotICAgICAgICAqIGRhdGFiaW5kaW5nIG1ldGhvZCB0byBnZXQgYW4gWE1MIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0Ci0gICAgICAgICoKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIGdldFB1bGxQYXJzZXIoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxTmFtZSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgZWxlbWVudExpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGF0dHJpYkxpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlci5FTEVNRU5UX1RFWFQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsTmVnYXRpdmVJbnRlZ2VyICE9IG51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbE5lZ2F0aXZlSW50ZWdlcikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJuZWdhdGl2ZUludGVnZXIgY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXJJbXBsKHFOYW1lLCBlbGVtZW50TGlzdC50b0FycmF5KCksIGF0dHJpYkxpc3QudG9BcnJheSgpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gIAotCi0gICAgIC8qKgotICAgICAgKiAgRmFjdG9yeSBjbGFzcyB0aGF0IGtlZXBzIHRoZSBwYXJzZSBtZXRob2QKLSAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5ewotCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIE5lZ2F0aXZlSW50ZWdlciBmcm9tU3RyaW5nKGphdmEubGFuZy5TdHJpbmcgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkpewotICAgICAgICAgICAgICAgICAgICBOZWdhdGl2ZUludGVnZXIgcmV0dXJuVmFsdWUgPSBuZXcgIE5lZ2F0aXZlSW50ZWdlcigpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZS5zZXROZWdhdGl2ZUludGVnZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9OZWdhdGl2ZUludGVnZXIodmFsdWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIE5lZ2F0aXZlSW50ZWdlciBmcm9tU3RyaW5nKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50LmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gY29udGVudC5zdWJzdHJpbmcoMCxjb250ZW50LmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVyaSA9IHhtbFN0cmVhbVJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTmVnYXRpdmVJbnRlZ2VyLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LG5hbWVzcGFjZVVyaSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOZWdhdGl2ZUludGVnZXIuRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsIiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAKLQotICAgICAgICAvKioKLSAgICAgICAgKiBzdGF0aWMgbWV0aG9kIHRvIGNyZWF0ZSB0aGUgb2JqZWN0Ci0gICAgICAgICogUHJlY29uZGl0aW9uOiAgSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIGN1cnJlbnQgb3IgbmV4dCBzdGFydCBlbGVtZW50IHN0YXJ0cyB0aGlzIG9iamVjdCBhbmQgYW55IGludGVydmVuaW5nIHJlYWRlciBldmVudHMgYXJlIGlnbm9yYWJsZQotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIG5vdCBhbiBlbGVtZW50LCBpdCBpcyBhIGNvbXBsZXggdHlwZSBhbmQgdGhlIHJlYWRlciBpcyBhdCB0aGUgZXZlbnQganVzdCBhZnRlciB0aGUgb3V0ZXIgc3RhcnQgZWxlbWVudAotICAgICAgICAqIFBvc3Rjb25kaXRpb246IElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCBpdHMgZW5kIGVsZW1lbnQKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBhIGNvbXBsZXggdHlwZSwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IHRoZSBlbmQgZWxlbWVudCBvZiBpdHMgb3V0ZXIgZWxlbWVudAotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIE5lZ2F0aXZlSW50ZWdlciBwYXJzZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uewotICAgICAgICAgICAgTmVnYXRpdmVJbnRlZ2VyIG9iamVjdCA9Ci0gICAgICAgICAgICAgICAgbmV3IE5lZ2F0aXZlSW50ZWdlcigpOwotCi0gICAgICAgICAgICBpbnQgZXZlbnQ7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5pbGxhYmxlVmFsdWUgPSBudWxsOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSIiOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2V1cmkgPSIiOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSAoIXJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICYmICFyZWFkZXIuaXNFbmRFbGVtZW50KCkpCi0gICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiKSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGZ1bGxUeXBlTmFtZSA9IHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiKTsKLSAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUhPW51bGwpewotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zUHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoMCxmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IG5zUHJlZml4PT1udWxsPyIiOm5zUHJlZml4OwotCi0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgdHlwZSA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSsxKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEibmVnYXRpdmVJbnRlZ2VyIi5lcXVhbHModHlwZSkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2ZpbmQgbmFtZXNwYWNlIGZvciB0aGUgcHJlZml4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNVcmkgPSByZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShuc1ByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoTmVnYXRpdmVJbnRlZ2VyKW9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLkV4dGVuc2lvbk1hcHBlci5nZXRUeXBlT2JqZWN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zVXJpLHR5cGUscmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIE5vdGUgYWxsIGF0dHJpYnV0ZXMgdGhhdCB3ZXJlIGhhbmRsZWQuIFVzZWQgdG8gZGlmZmVyIG5vcm1hbCBhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgICAgLy8gZnJvbSBhbnlBdHRyaWJ1dGVzLgotICAgICAgICAgICAgICAgIGphdmEudXRpbC5WZWN0b3IgaGFuZGxlZEF0dHJpYnV0ZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlKCFyZWFkZXIuaXNFbmRFbGVtZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50ID0gcmVhZGVyLmdldEVsZW1lbnRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0TmVnYXRpdmVJbnRlZ2VyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9OZWdhdGl2ZUludGVnZXIoY29udGVudCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIEVuZCBvZiBpZiBmb3IgZXhwZWN0ZWQgcHJvcGVydHkgc3RhcnQgZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHN0YXJ0IGVsZW1lbnQgd2UgYXJlIG5vdCBleHBlY3RpbmcgaW5kaWNhdGVzIGFuIGludmFsaWQgcGFyYW1ldGVyIHdhcyBwYXNzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIlVuZXhwZWN0ZWQgc3ViZWxlbWVudCAiICsgcmVhZGVyLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBlbmQgb2Ygd2hpbGUgbG9vcAotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLQotCi0gICAgICAgICAgICB9IGNhdGNoIChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEubGFuZy5FeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBvYmplY3Q7Ci0gICAgICAgIH0KLQotICAgICAgICB9Ly9lbmQgb2YgZmFjdG9yeSBjbGFzcwotCi0gICAgICAgIAotCi0gICAgICAgIH0KLSAgICAgICAgICAgCi0gICAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9Ob25OZWdhdGl2ZUludGVnZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvTm9uTmVnYXRpdmVJbnRlZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkYzk0ZDYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9Ob25OZWdhdGl2ZUludGVnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwMyArMCwwIEBACi0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICogTm9uTmVnYXRpdmVJbnRlZ2VyLmphdmEKLSAqCi0gKiBUaGlzIGZpbGUgd2FzIGF1dG8tZ2VuZXJhdGVkIGZyb20gV1NETAotICogYnkgdGhlIEFwYWNoZSBBeGlzMiB2ZXJzaW9uOiBTTkFQU0hPVCAgQnVpbHQgb24gOiBEZWMgMjEsIDIwMDcgKDA0OjAzOjMwIExLVCkKLSAqLwotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZzsKLSAgICAgICAgICAgIAotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogIE5vbk5lZ2F0aXZlSW50ZWdlciBiZWFuIGNsYXNzCi0gICAgICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgcHVibGljICBjbGFzcyBOb25OZWdhdGl2ZUludGVnZXIKLSAgICAgICAgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkJlYW57Ci0gICAgICAgIC8qIFRoaXMgdHlwZSB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIHBpZWNlIG9mIHNjaGVtYSB0aGF0IGhhZAotICAgICAgICAgICAgICAgIG5hbWUgPSBub25OZWdhdGl2ZUludGVnZXIKLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgVVJJID0gaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8KLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgUHJlZml4ID0gbnMxCi0gICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIAotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2VuZXJhdGVQcmVmaXgoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHsKLSAgICAgICAgICAgIGlmKG5hbWVzcGFjZS5lcXVhbHMoImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIikpewotICAgICAgICAgICAgICAgIHJldHVybiAiU09BUC1FTkMiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgIH0KLQotICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIGZpZWxkIGZvciBOb25OZWdhdGl2ZUludGVnZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuTm9uTmVnYXRpdmVJbnRlZ2VyIGxvY2FsTm9uTmVnYXRpdmVJbnRlZ2VyIDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBnZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5Ob25OZWdhdGl2ZUludGVnZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuTm9uTmVnYXRpdmVJbnRlZ2VyIGdldE5vbk5lZ2F0aXZlSW50ZWdlcigpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbE5vbk5lZ2F0aXZlSW50ZWdlcjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIHNldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSBwYXJhbSBOb25OZWdhdGl2ZUludGVnZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldE5vbk5lZ2F0aXZlSW50ZWdlcihvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLk5vbk5lZ2F0aXZlSW50ZWdlciBwYXJhbSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYWxOb25OZWdhdGl2ZUludGVnZXI9cGFyYW07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbE5vbk5lZ2F0aXZlSW50ZWdlci50b1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgLyoqCi0gICAgICogaXNSZWFkZXJNVE9NQXdhcmUKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlYWRlciBzdXBwb3J0cyBNVE9NCi0gICAgICovCi0gICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIHRyeXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGphdmEubGFuZy5Cb29sZWFuLlRSVUUuZXF1YWxzKHJlYWRlci5nZXRQcm9wZXJ0eShvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQ29uc3RhbnRzLklTX0RBVEFfSEFORExFUlNfQVdBUkUpKTsKLSAgICAgICAgfWNhdGNoKGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXNSZWFkZXJNVE9NQXdhcmU7Ci0gICB9Ci0gICAgIAotICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICoKLSAgICAgICAgKiBAcGFyYW0gcGFyZW50UU5hbWUKLSAgICAgICAgKiBAcGFyYW0gZmFjdG9yeQotICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICBwdWJsaWMgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgZ2V0T01FbGVtZW50ICgKLSAgICAgICAgICAgICAgIGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5KSB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlIGRhdGFTb3VyY2UgPQotICAgICAgICAgICAgICAgICAgICAgICBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJEYXRhU291cmNlKHRoaXMscGFyZW50UU5hbWUpewotCi0gICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICBOb25OZWdhdGl2ZUludGVnZXIudGhpcy5zZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5PTVNvdXJjZWRFbGVtZW50SW1wbCgKLSAgICAgICAgICAgICAgIHBhcmVudFFOYW1lLGZhY3RvcnksZGF0YVNvdXJjZSk7Ci0gICAgICAgICAgICAKLSAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIsZmFsc2UpOwotICAgICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzZXJpYWxpemVUeXBlKQotICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotCi0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UgPSBudWxsOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHBhcmVudFFOYW1lLmdldFByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UgPSBwYXJlbnRRTmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZSAhPSBudWxsKSAmJiAobmFtZXNwYWNlLnRyaW0oKS5sZW5ndGgoKSA+IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHdyaXRlclByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3cml0ZXJQcmVmaXggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChuYW1lc3BhY2UsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHByZWZpeCwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCksIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIGlmIChzZXJpYWxpemVUeXBlKXsKLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIpOwotICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlUHJlZml4ICE9IG51bGwpICYmIChuYW1lc3BhY2VQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkpewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVByZWZpeCsiOm5vbk5lZ2F0aXZlSW50ZWdlciIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vbk5lZ2F0aXZlSW50ZWdlciIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbE5vbk5lZ2F0aXZlSW50ZWdlcj09bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgdGhlIG5pbCBhdHRyaWJ1dGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJub25OZWdhdGl2ZUludGVnZXIgY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxOb25OZWdhdGl2ZUludGVnZXIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRoIHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCxqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgIGlmICh4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLQotICAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsIGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlTmFtZXNwYWNlID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVWYWx1ZTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBhdHRyaWJ1dGVQcmVmaXggKyAiOiIgKyBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSwgYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICBtZXRob2QgdG8gaGFuZGxlIFFuYW1lcwotICAgICAgICAgKi8KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZShqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhwcmVmaXggKyAiOiIgKyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaS5lIHRoaXMgaXMgdGhlIGRlZmF1bHQgbmFtZXNwYWNlCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lcyhqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lW10gcW5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICBpZiAocW5hbWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHRvIHN0b3JlIHRoaXMgZGF0YSB1bnRpbCBsYXN0IG1vbWVudCBzaW5jZSBpdCBpcyBub3QgcG9zc2libGUgdG8gd3JpdGUgYW55Ci0gICAgICAgICAgICAgICAgLy8gbmFtZXNwYWNlIGRhdGEgYWZ0ZXIgd3JpdGluZyB0aGUgY2hhcmFjdG9yIGRhdGEKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIHN0cmluZ1RvV3JpdGUgPSBuZXcgamF2YS5sYW5nLlN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHFuYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKCIgIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlVVJJID0gcW5hbWVzW2ldLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocHJlZml4ID09IG51bGwpIHx8IChwcmVmaXgubGVuZ3RoKCkgPT0gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChwcmVmaXgpLmFwcGVuZCgiOiIpLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHN0cmluZ1RvV3JpdGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0KLSAgICAgICAgIC8qKgotICAgICAgICAgKiBSZWdpc3RlciBhIG5hbWVzcGFjZSBwcmVmaXgKLSAgICAgICAgICovCi0gICAgICAgICBwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgcmVnaXN0ZXJQcmVmaXgoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLCBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlICh4bWxXcml0ZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gcHJlZml4OwotICAgICAgICAgICAgfQotCi0KLSAgCi0gICAgICAgIC8qKgotICAgICAgICAqIGRhdGFiaW5kaW5nIG1ldGhvZCB0byBnZXQgYW4gWE1MIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0Ci0gICAgICAgICoKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIGdldFB1bGxQYXJzZXIoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxTmFtZSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgZWxlbWVudExpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGF0dHJpYkxpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlci5FTEVNRU5UX1RFWFQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsTm9uTmVnYXRpdmVJbnRlZ2VyICE9IG51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbE5vbk5lZ2F0aXZlSW50ZWdlcikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJub25OZWdhdGl2ZUludGVnZXIgY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXJJbXBsKHFOYW1lLCBlbGVtZW50TGlzdC50b0FycmF5KCksIGF0dHJpYkxpc3QudG9BcnJheSgpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gIAotCi0gICAgIC8qKgotICAgICAgKiAgRmFjdG9yeSBjbGFzcyB0aGF0IGtlZXBzIHRoZSBwYXJzZSBtZXRob2QKLSAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5ewotCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIE5vbk5lZ2F0aXZlSW50ZWdlciBmcm9tU3RyaW5nKGphdmEubGFuZy5TdHJpbmcgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkpewotICAgICAgICAgICAgICAgICAgICBOb25OZWdhdGl2ZUludGVnZXIgcmV0dXJuVmFsdWUgPSBuZXcgIE5vbk5lZ2F0aXZlSW50ZWdlcigpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZS5zZXROb25OZWdhdGl2ZUludGVnZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9Ob25OZWdhdGl2ZUludGVnZXIodmFsdWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIE5vbk5lZ2F0aXZlSW50ZWdlciBmcm9tU3RyaW5nKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50LmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gY29udGVudC5zdWJzdHJpbmcoMCxjb250ZW50LmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVyaSA9IHhtbFN0cmVhbVJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTm9uTmVnYXRpdmVJbnRlZ2VyLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LG5hbWVzcGFjZVVyaSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOb25OZWdhdGl2ZUludGVnZXIuRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsIiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAKLQotICAgICAgICAvKioKLSAgICAgICAgKiBzdGF0aWMgbWV0aG9kIHRvIGNyZWF0ZSB0aGUgb2JqZWN0Ci0gICAgICAgICogUHJlY29uZGl0aW9uOiAgSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIGN1cnJlbnQgb3IgbmV4dCBzdGFydCBlbGVtZW50IHN0YXJ0cyB0aGlzIG9iamVjdCBhbmQgYW55IGludGVydmVuaW5nIHJlYWRlciBldmVudHMgYXJlIGlnbm9yYWJsZQotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIG5vdCBhbiBlbGVtZW50LCBpdCBpcyBhIGNvbXBsZXggdHlwZSBhbmQgdGhlIHJlYWRlciBpcyBhdCB0aGUgZXZlbnQganVzdCBhZnRlciB0aGUgb3V0ZXIgc3RhcnQgZWxlbWVudAotICAgICAgICAqIFBvc3Rjb25kaXRpb246IElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCBpdHMgZW5kIGVsZW1lbnQKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBhIGNvbXBsZXggdHlwZSwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IHRoZSBlbmQgZWxlbWVudCBvZiBpdHMgb3V0ZXIgZWxlbWVudAotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIE5vbk5lZ2F0aXZlSW50ZWdlciBwYXJzZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uewotICAgICAgICAgICAgTm9uTmVnYXRpdmVJbnRlZ2VyIG9iamVjdCA9Ci0gICAgICAgICAgICAgICAgbmV3IE5vbk5lZ2F0aXZlSW50ZWdlcigpOwotCi0gICAgICAgICAgICBpbnQgZXZlbnQ7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5pbGxhYmxlVmFsdWUgPSBudWxsOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSIiOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2V1cmkgPSIiOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSAoIXJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICYmICFyZWFkZXIuaXNFbmRFbGVtZW50KCkpCi0gICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiKSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGZ1bGxUeXBlTmFtZSA9IHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiKTsKLSAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUhPW51bGwpewotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zUHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoMCxmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IG5zUHJlZml4PT1udWxsPyIiOm5zUHJlZml4OwotCi0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgdHlwZSA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSsxKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEibm9uTmVnYXRpdmVJbnRlZ2VyIi5lcXVhbHModHlwZSkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2ZpbmQgbmFtZXNwYWNlIGZvciB0aGUgcHJlZml4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNVcmkgPSByZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShuc1ByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoTm9uTmVnYXRpdmVJbnRlZ2VyKW9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLkV4dGVuc2lvbk1hcHBlci5nZXRUeXBlT2JqZWN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zVXJpLHR5cGUscmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIE5vdGUgYWxsIGF0dHJpYnV0ZXMgdGhhdCB3ZXJlIGhhbmRsZWQuIFVzZWQgdG8gZGlmZmVyIG5vcm1hbCBhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgICAgLy8gZnJvbSBhbnlBdHRyaWJ1dGVzLgotICAgICAgICAgICAgICAgIGphdmEudXRpbC5WZWN0b3IgaGFuZGxlZEF0dHJpYnV0ZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlKCFyZWFkZXIuaXNFbmRFbGVtZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50ID0gcmVhZGVyLmdldEVsZW1lbnRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0Tm9uTmVnYXRpdmVJbnRlZ2VyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9Ob25OZWdhdGl2ZUludGVnZXIoY29udGVudCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIEVuZCBvZiBpZiBmb3IgZXhwZWN0ZWQgcHJvcGVydHkgc3RhcnQgZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHN0YXJ0IGVsZW1lbnQgd2UgYXJlIG5vdCBleHBlY3RpbmcgaW5kaWNhdGVzIGFuIGludmFsaWQgcGFyYW1ldGVyIHdhcyBwYXNzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIlVuZXhwZWN0ZWQgc3ViZWxlbWVudCAiICsgcmVhZGVyLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBlbmQgb2Ygd2hpbGUgbG9vcAotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLQotCi0gICAgICAgICAgICB9IGNhdGNoIChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEubGFuZy5FeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBvYmplY3Q7Ci0gICAgICAgIH0KLQotICAgICAgICB9Ly9lbmQgb2YgZmFjdG9yeSBjbGFzcwotCi0gICAgICAgIAotCi0gICAgICAgIH0KLSAgICAgICAgICAgCi0gICAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9Ob25Qb3NpdGl2ZUludGVnZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvTm9uUG9zaXRpdmVJbnRlZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2M2JkM2QuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9Ob25Qb3NpdGl2ZUludGVnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwMyArMCwwIEBACi0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICogTm9uUG9zaXRpdmVJbnRlZ2VyLmphdmEKLSAqCi0gKiBUaGlzIGZpbGUgd2FzIGF1dG8tZ2VuZXJhdGVkIGZyb20gV1NETAotICogYnkgdGhlIEFwYWNoZSBBeGlzMiB2ZXJzaW9uOiBTTkFQU0hPVCAgQnVpbHQgb24gOiBEZWMgMjEsIDIwMDcgKDA0OjAzOjMwIExLVCkKLSAqLwotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZzsKLSAgICAgICAgICAgIAotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogIE5vblBvc2l0aXZlSW50ZWdlciBiZWFuIGNsYXNzCi0gICAgICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgcHVibGljICBjbGFzcyBOb25Qb3NpdGl2ZUludGVnZXIKLSAgICAgICAgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkJlYW57Ci0gICAgICAgIC8qIFRoaXMgdHlwZSB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIHBpZWNlIG9mIHNjaGVtYSB0aGF0IGhhZAotICAgICAgICAgICAgICAgIG5hbWUgPSBub25Qb3NpdGl2ZUludGVnZXIKLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgVVJJID0gaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8KLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgUHJlZml4ID0gbnMxCi0gICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIAotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2VuZXJhdGVQcmVmaXgoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHsKLSAgICAgICAgICAgIGlmKG5hbWVzcGFjZS5lcXVhbHMoImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIikpewotICAgICAgICAgICAgICAgIHJldHVybiAiU09BUC1FTkMiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgIH0KLQotICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIGZpZWxkIGZvciBOb25Qb3NpdGl2ZUludGVnZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuTm9uUG9zaXRpdmVJbnRlZ2VyIGxvY2FsTm9uUG9zaXRpdmVJbnRlZ2VyIDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBnZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5Ob25Qb3NpdGl2ZUludGVnZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuTm9uUG9zaXRpdmVJbnRlZ2VyIGdldE5vblBvc2l0aXZlSW50ZWdlcigpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbE5vblBvc2l0aXZlSW50ZWdlcjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIHNldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSBwYXJhbSBOb25Qb3NpdGl2ZUludGVnZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldE5vblBvc2l0aXZlSW50ZWdlcihvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLk5vblBvc2l0aXZlSW50ZWdlciBwYXJhbSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYWxOb25Qb3NpdGl2ZUludGVnZXI9cGFyYW07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbE5vblBvc2l0aXZlSW50ZWdlci50b1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgLyoqCi0gICAgICogaXNSZWFkZXJNVE9NQXdhcmUKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlYWRlciBzdXBwb3J0cyBNVE9NCi0gICAgICovCi0gICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIHRyeXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGphdmEubGFuZy5Cb29sZWFuLlRSVUUuZXF1YWxzKHJlYWRlci5nZXRQcm9wZXJ0eShvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQ29uc3RhbnRzLklTX0RBVEFfSEFORExFUlNfQVdBUkUpKTsKLSAgICAgICAgfWNhdGNoKGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXNSZWFkZXJNVE9NQXdhcmU7Ci0gICB9Ci0gICAgIAotICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICoKLSAgICAgICAgKiBAcGFyYW0gcGFyZW50UU5hbWUKLSAgICAgICAgKiBAcGFyYW0gZmFjdG9yeQotICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICBwdWJsaWMgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgZ2V0T01FbGVtZW50ICgKLSAgICAgICAgICAgICAgIGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5KSB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlIGRhdGFTb3VyY2UgPQotICAgICAgICAgICAgICAgICAgICAgICBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJEYXRhU291cmNlKHRoaXMscGFyZW50UU5hbWUpewotCi0gICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICBOb25Qb3NpdGl2ZUludGVnZXIudGhpcy5zZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5PTVNvdXJjZWRFbGVtZW50SW1wbCgKLSAgICAgICAgICAgICAgIHBhcmVudFFOYW1lLGZhY3RvcnksZGF0YVNvdXJjZSk7Ci0gICAgICAgICAgICAKLSAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIsZmFsc2UpOwotICAgICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzZXJpYWxpemVUeXBlKQotICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotCi0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UgPSBudWxsOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHBhcmVudFFOYW1lLmdldFByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UgPSBwYXJlbnRRTmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZSAhPSBudWxsKSAmJiAobmFtZXNwYWNlLnRyaW0oKS5sZW5ndGgoKSA+IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHdyaXRlclByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3cml0ZXJQcmVmaXggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChuYW1lc3BhY2UsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHByZWZpeCwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCksIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIGlmIChzZXJpYWxpemVUeXBlKXsKLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIpOwotICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlUHJlZml4ICE9IG51bGwpICYmIChuYW1lc3BhY2VQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkpewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVByZWZpeCsiOm5vblBvc2l0aXZlSW50ZWdlciIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vblBvc2l0aXZlSW50ZWdlciIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbE5vblBvc2l0aXZlSW50ZWdlcj09bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgdGhlIG5pbCBhdHRyaWJ1dGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJub25Qb3NpdGl2ZUludGVnZXIgY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxOb25Qb3NpdGl2ZUludGVnZXIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRoIHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCxqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgIGlmICh4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLQotICAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsIGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlTmFtZXNwYWNlID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVWYWx1ZTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBhdHRyaWJ1dGVQcmVmaXggKyAiOiIgKyBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSwgYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICBtZXRob2QgdG8gaGFuZGxlIFFuYW1lcwotICAgICAgICAgKi8KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZShqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhwcmVmaXggKyAiOiIgKyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaS5lIHRoaXMgaXMgdGhlIGRlZmF1bHQgbmFtZXNwYWNlCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lcyhqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lW10gcW5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICBpZiAocW5hbWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHRvIHN0b3JlIHRoaXMgZGF0YSB1bnRpbCBsYXN0IG1vbWVudCBzaW5jZSBpdCBpcyBub3QgcG9zc2libGUgdG8gd3JpdGUgYW55Ci0gICAgICAgICAgICAgICAgLy8gbmFtZXNwYWNlIGRhdGEgYWZ0ZXIgd3JpdGluZyB0aGUgY2hhcmFjdG9yIGRhdGEKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIHN0cmluZ1RvV3JpdGUgPSBuZXcgamF2YS5sYW5nLlN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHFuYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKCIgIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlVVJJID0gcW5hbWVzW2ldLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocHJlZml4ID09IG51bGwpIHx8IChwcmVmaXgubGVuZ3RoKCkgPT0gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChwcmVmaXgpLmFwcGVuZCgiOiIpLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHN0cmluZ1RvV3JpdGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0KLSAgICAgICAgIC8qKgotICAgICAgICAgKiBSZWdpc3RlciBhIG5hbWVzcGFjZSBwcmVmaXgKLSAgICAgICAgICovCi0gICAgICAgICBwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgcmVnaXN0ZXJQcmVmaXgoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLCBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlICh4bWxXcml0ZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gcHJlZml4OwotICAgICAgICAgICAgfQotCi0KLSAgCi0gICAgICAgIC8qKgotICAgICAgICAqIGRhdGFiaW5kaW5nIG1ldGhvZCB0byBnZXQgYW4gWE1MIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0Ci0gICAgICAgICoKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIGdldFB1bGxQYXJzZXIoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxTmFtZSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgZWxlbWVudExpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGF0dHJpYkxpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlci5FTEVNRU5UX1RFWFQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsTm9uUG9zaXRpdmVJbnRlZ2VyICE9IG51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbE5vblBvc2l0aXZlSW50ZWdlcikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJub25Qb3NpdGl2ZUludGVnZXIgY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXJJbXBsKHFOYW1lLCBlbGVtZW50TGlzdC50b0FycmF5KCksIGF0dHJpYkxpc3QudG9BcnJheSgpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gIAotCi0gICAgIC8qKgotICAgICAgKiAgRmFjdG9yeSBjbGFzcyB0aGF0IGtlZXBzIHRoZSBwYXJzZSBtZXRob2QKLSAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5ewotCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIE5vblBvc2l0aXZlSW50ZWdlciBmcm9tU3RyaW5nKGphdmEubGFuZy5TdHJpbmcgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkpewotICAgICAgICAgICAgICAgICAgICBOb25Qb3NpdGl2ZUludGVnZXIgcmV0dXJuVmFsdWUgPSBuZXcgIE5vblBvc2l0aXZlSW50ZWdlcigpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZS5zZXROb25Qb3NpdGl2ZUludGVnZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9Ob25Qb3NpdGl2ZUludGVnZXIodmFsdWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIE5vblBvc2l0aXZlSW50ZWdlciBmcm9tU3RyaW5nKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50LmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gY29udGVudC5zdWJzdHJpbmcoMCxjb250ZW50LmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVyaSA9IHhtbFN0cmVhbVJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTm9uUG9zaXRpdmVJbnRlZ2VyLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LG5hbWVzcGFjZVVyaSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOb25Qb3NpdGl2ZUludGVnZXIuRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsIiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAKLQotICAgICAgICAvKioKLSAgICAgICAgKiBzdGF0aWMgbWV0aG9kIHRvIGNyZWF0ZSB0aGUgb2JqZWN0Ci0gICAgICAgICogUHJlY29uZGl0aW9uOiAgSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIGN1cnJlbnQgb3IgbmV4dCBzdGFydCBlbGVtZW50IHN0YXJ0cyB0aGlzIG9iamVjdCBhbmQgYW55IGludGVydmVuaW5nIHJlYWRlciBldmVudHMgYXJlIGlnbm9yYWJsZQotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIG5vdCBhbiBlbGVtZW50LCBpdCBpcyBhIGNvbXBsZXggdHlwZSBhbmQgdGhlIHJlYWRlciBpcyBhdCB0aGUgZXZlbnQganVzdCBhZnRlciB0aGUgb3V0ZXIgc3RhcnQgZWxlbWVudAotICAgICAgICAqIFBvc3Rjb25kaXRpb246IElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCBpdHMgZW5kIGVsZW1lbnQKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBhIGNvbXBsZXggdHlwZSwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IHRoZSBlbmQgZWxlbWVudCBvZiBpdHMgb3V0ZXIgZWxlbWVudAotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIE5vblBvc2l0aXZlSW50ZWdlciBwYXJzZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uewotICAgICAgICAgICAgTm9uUG9zaXRpdmVJbnRlZ2VyIG9iamVjdCA9Ci0gICAgICAgICAgICAgICAgbmV3IE5vblBvc2l0aXZlSW50ZWdlcigpOwotCi0gICAgICAgICAgICBpbnQgZXZlbnQ7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5pbGxhYmxlVmFsdWUgPSBudWxsOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSIiOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2V1cmkgPSIiOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSAoIXJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICYmICFyZWFkZXIuaXNFbmRFbGVtZW50KCkpCi0gICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiKSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGZ1bGxUeXBlTmFtZSA9IHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiKTsKLSAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUhPW51bGwpewotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zUHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoMCxmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IG5zUHJlZml4PT1udWxsPyIiOm5zUHJlZml4OwotCi0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgdHlwZSA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSsxKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEibm9uUG9zaXRpdmVJbnRlZ2VyIi5lcXVhbHModHlwZSkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2ZpbmQgbmFtZXNwYWNlIGZvciB0aGUgcHJlZml4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNVcmkgPSByZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShuc1ByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoTm9uUG9zaXRpdmVJbnRlZ2VyKW9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLkV4dGVuc2lvbk1hcHBlci5nZXRUeXBlT2JqZWN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zVXJpLHR5cGUscmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIE5vdGUgYWxsIGF0dHJpYnV0ZXMgdGhhdCB3ZXJlIGhhbmRsZWQuIFVzZWQgdG8gZGlmZmVyIG5vcm1hbCBhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgICAgLy8gZnJvbSBhbnlBdHRyaWJ1dGVzLgotICAgICAgICAgICAgICAgIGphdmEudXRpbC5WZWN0b3IgaGFuZGxlZEF0dHJpYnV0ZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlKCFyZWFkZXIuaXNFbmRFbGVtZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50ID0gcmVhZGVyLmdldEVsZW1lbnRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0Tm9uUG9zaXRpdmVJbnRlZ2VyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9Ob25Qb3NpdGl2ZUludGVnZXIoY29udGVudCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIEVuZCBvZiBpZiBmb3IgZXhwZWN0ZWQgcHJvcGVydHkgc3RhcnQgZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHN0YXJ0IGVsZW1lbnQgd2UgYXJlIG5vdCBleHBlY3RpbmcgaW5kaWNhdGVzIGFuIGludmFsaWQgcGFyYW1ldGVyIHdhcyBwYXNzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIlVuZXhwZWN0ZWQgc3ViZWxlbWVudCAiICsgcmVhZGVyLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBlbmQgb2Ygd2hpbGUgbG9vcAotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLQotCi0gICAgICAgICAgICB9IGNhdGNoIChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEubGFuZy5FeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBvYmplY3Q7Ci0gICAgICAgIH0KLQotICAgICAgICB9Ly9lbmQgb2YgZmFjdG9yeSBjbGFzcwotCi0gICAgICAgIAotCi0gICAgICAgIH0KLSAgICAgICAgICAgCi0gICAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9Ob3JtYWxpemVkU3RyaW5nLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL05vcm1hbGl6ZWRTdHJpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzAyNDZmMS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL05vcm1hbGl6ZWRTdHJpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwMyArMCwwIEBACi0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICogTm9ybWFsaXplZFN0cmluZy5qYXZhCi0gKgotICogVGhpcyBmaWxlIHdhcyBhdXRvLWdlbmVyYXRlZCBmcm9tIFdTREwKLSAqIGJ5IHRoZSBBcGFjaGUgQXhpczIgdmVyc2lvbjogU05BUFNIT1QgIEJ1aWx0IG9uIDogRGVjIDIxLCAyMDA3ICgwNDowMzozMCBMS1QpCi0gKi8KLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2Rpbmc7Ci0gICAgICAgICAgICAKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqICBOb3JtYWxpemVkU3RyaW5nIGJlYW4gY2xhc3MKLSAgICAgICAgICAgICovCi0gICAgICAgIAotICAgICAgICBwdWJsaWMgIGNsYXNzIE5vcm1hbGl6ZWRTdHJpbmcKLSAgICAgICAgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkJlYW57Ci0gICAgICAgIC8qIFRoaXMgdHlwZSB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIHBpZWNlIG9mIHNjaGVtYSB0aGF0IGhhZAotICAgICAgICAgICAgICAgIG5hbWUgPSBub3JtYWxpemVkU3RyaW5nCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFVSSSA9IGh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFByZWZpeCA9IG5zMQotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdlbmVyYXRlUHJlZml4KGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB7Ci0gICAgICAgICAgICBpZihuYW1lc3BhY2UuZXF1YWxzKCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIpKXsKLSAgICAgICAgICAgICAgICByZXR1cm4gIlNPQVAtRU5DIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBmaWVsZCBmb3IgTm9ybWFsaXplZFN0cmluZwotICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5Ob3JtYWxpemVkU3RyaW5nIGxvY2FsTm9ybWFsaXplZFN0cmluZyA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgZ2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuTm9ybWFsaXplZFN0cmluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5Ob3JtYWxpemVkU3RyaW5nIGdldE5vcm1hbGl6ZWRTdHJpbmcoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxOb3JtYWxpemVkU3RyaW5nOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgc2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtIHBhcmFtIE5vcm1hbGl6ZWRTdHJpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldE5vcm1hbGl6ZWRTdHJpbmcob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5Ob3JtYWxpemVkU3RyaW5nIHBhcmFtKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2NhbE5vcm1hbGl6ZWRTdHJpbmc9cGFyYW07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbE5vcm1hbGl6ZWRTdHJpbmcudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgIC8qKgotICAgICAqIGlzUmVhZGVyTVRPTUF3YXJlCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSByZWFkZXIgc3VwcG9ydHMgTVRPTQotICAgICAqLwotICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgewotICAgICAgICBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICB0cnl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBqYXZhLmxhbmcuQm9vbGVhbi5UUlVFLmVxdWFscyhyZWFkZXIuZ2V0UHJvcGVydHkob3JnLmFwYWNoZS5heGlvbS5vbS5PTUNvbnN0YW50cy5JU19EQVRBX0hBTkRMRVJTX0FXQVJFKSk7Ci0gICAgICAgIH1jYXRjaChqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlzUmVhZGVyTVRPTUF3YXJlOwotICAgfQotICAgICAKLSAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAqCi0gICAgICAgICogQHBhcmFtIHBhcmVudFFOYW1lCi0gICAgICAgICogQHBhcmFtIGZhY3RvcnkKLSAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgcHVibGljIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IGdldE9NRWxlbWVudCAoCi0gICAgICAgICAgICAgICBmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSkgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZSBkYXRhU291cmNlID0KLSAgICAgICAgICAgICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRGF0YVNvdXJjZSh0aGlzLHBhcmVudFFOYW1lKXsKLQotICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgTm9ybWFsaXplZFN0cmluZy50aGlzLnNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5sbG9tLk9NU291cmNlZEVsZW1lbnRJbXBsKAotICAgICAgICAgICAgICAgcGFyZW50UU5hbWUsZmFjdG9yeSxkYXRhU291cmNlKTsKLSAgICAgICAgICAgIAotICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcixmYWxzZSk7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNlcmlhbGl6ZVR5cGUpCi0gICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgCi0KLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gcGFyZW50UU5hbWUuZ2V0UHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZSA9IHBhcmVudFFOYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlICE9IG51bGwpICYmIChuYW1lc3BhY2UudHJpbSgpLmxlbmd0aCgpID4gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgd3JpdGVyUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdyaXRlclByZWZpeCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KG5hbWVzcGFjZSwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocHJlZml4LCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgaWYgKHNlcmlhbGl6ZVR5cGUpewotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIik7Ci0gICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2VQcmVmaXggIT0gbnVsbCkgJiYgKG5hbWVzcGFjZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlUHJlZml4KyI6bm9ybWFsaXplZFN0cmluZyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vcm1hbGl6ZWRTdHJpbmciLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxOb3JtYWxpemVkU3RyaW5nPT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZSB0aGUgbmlsIGF0dHJpYnV0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIm5vcm1hbGl6ZWRTdHJpbmcgY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxOb3JtYWxpemVkU3RyaW5nKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBwcmVmaXgsamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICBpZiAoeG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0KLSAgICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0KLSAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLCBqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZU5hbWVzcGFjZSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlVmFsdWU7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gYXR0cmlidXRlUHJlZml4ICsgIjoiICsgcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsIGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIC8qKgotICAgICAgICAgKiAgbWV0aG9kIHRvIGhhbmRsZSBRbmFtZXMKLSAgICAgICAgICovCi0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWUoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMocHJlZml4ICsgIjoiICsgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGkuZSB0aGlzIGlzIHRoZSBkZWZhdWx0IG5hbWVzcGFjZQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZXMoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZVtdIHFuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgaWYgKHFuYW1lcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBzdG9yZSB0aGlzIGRhdGEgdW50aWwgbGFzdCBtb21lbnQgc2luY2UgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHdyaXRlIGFueQotICAgICAgICAgICAgICAgIC8vIG5hbWVzcGFjZSBkYXRhIGFmdGVyIHdyaXRpbmcgdGhlIGNoYXJhY3RvciBkYXRhCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZ0J1ZmZlciBzdHJpbmdUb1dyaXRlID0gbmV3IGphdmEubGFuZy5TdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBxbmFtZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZCgiICIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVVSSSA9IHFuYW1lc1tpXS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHByZWZpeCA9PSBudWxsKSB8fCAocHJlZml4Lmxlbmd0aCgpID09IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQocHJlZml4KS5hcHBlbmQoIjoiKS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhzdHJpbmdUb1dyaXRlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotCi0gICAgICAgICAvKioKLSAgICAgICAgICogUmVnaXN0ZXIgYSBuYW1lc3BhY2UgcHJlZml4Ci0gICAgICAgICAqLwotICAgICAgICAgcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHJlZ2lzdGVyUHJlZml4KGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoeG1sV3JpdGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHByZWZpeDsKLSAgICAgICAgICAgIH0KLQotCi0gIAotICAgICAgICAvKioKLSAgICAgICAgKiBkYXRhYmluZGluZyBtZXRob2QgdG8gZ2V0IGFuIFhNTCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdAotICAgICAgICAqCi0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciBnZXRQdWxsUGFyc2VyKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcU5hbWUpCi0gICAgICAgICAgICAgICAgICAgIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGVsZW1lbnRMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBhdHRyaWJMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXIuRUxFTUVOVF9URVhUKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbE5vcm1hbGl6ZWRTdHJpbmcgIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsTm9ybWFsaXplZFN0cmluZykpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJub3JtYWxpemVkU3RyaW5nIGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVySW1wbChxTmFtZSwgZWxlbWVudExpc3QudG9BcnJheSgpLCBhdHRyaWJMaXN0LnRvQXJyYXkoKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAKLQotICAgICAvKioKLSAgICAgICogIEZhY3RvcnkgY2xhc3MgdGhhdCBrZWVwcyB0aGUgcGFyc2UgbWV0aG9kCi0gICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeXsKLQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBOb3JtYWxpemVkU3RyaW5nIGZyb21TdHJpbmcoamF2YS5sYW5nLlN0cmluZyB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSl7Ci0gICAgICAgICAgICAgICAgICAgIE5vcm1hbGl6ZWRTdHJpbmcgcmV0dXJuVmFsdWUgPSBuZXcgIE5vcm1hbGl6ZWRTdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUuc2V0Tm9ybWFsaXplZFN0cmluZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb05vcm1hbGl6ZWRTdHJpbmcodmFsdWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIE5vcm1hbGl6ZWRTdHJpbmcgZnJvbVN0cmluZyhqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudC5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IGNvbnRlbnQuc3Vic3RyaW5nKDAsY29udGVudC5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVcmkgPSB4bWxTdHJlYW1SZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5vcm1hbGl6ZWRTdHJpbmcuRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsbmFtZXNwYWNlVXJpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5vcm1hbGl6ZWRTdHJpbmcuRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsIiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAKLQotICAgICAgICAvKioKLSAgICAgICAgKiBzdGF0aWMgbWV0aG9kIHRvIGNyZWF0ZSB0aGUgb2JqZWN0Ci0gICAgICAgICogUHJlY29uZGl0aW9uOiAgSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIGN1cnJlbnQgb3IgbmV4dCBzdGFydCBlbGVtZW50IHN0YXJ0cyB0aGlzIG9iamVjdCBhbmQgYW55IGludGVydmVuaW5nIHJlYWRlciBldmVudHMgYXJlIGlnbm9yYWJsZQotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIG5vdCBhbiBlbGVtZW50LCBpdCBpcyBhIGNvbXBsZXggdHlwZSBhbmQgdGhlIHJlYWRlciBpcyBhdCB0aGUgZXZlbnQganVzdCBhZnRlciB0aGUgb3V0ZXIgc3RhcnQgZWxlbWVudAotICAgICAgICAqIFBvc3Rjb25kaXRpb246IElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCBpdHMgZW5kIGVsZW1lbnQKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBhIGNvbXBsZXggdHlwZSwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IHRoZSBlbmQgZWxlbWVudCBvZiBpdHMgb3V0ZXIgZWxlbWVudAotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIE5vcm1hbGl6ZWRTdHJpbmcgcGFyc2UoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIE5vcm1hbGl6ZWRTdHJpbmcgb2JqZWN0ID0KLSAgICAgICAgICAgICAgICBuZXcgTm9ybWFsaXplZFN0cmluZygpOwotCi0gICAgICAgICAgICBpbnQgZXZlbnQ7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5pbGxhYmxlVmFsdWUgPSBudWxsOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSIiOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2V1cmkgPSIiOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSAoIXJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICYmICFyZWFkZXIuaXNFbmRFbGVtZW50KCkpCi0gICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiKSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGZ1bGxUeXBlTmFtZSA9IHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiKTsKLSAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUhPW51bGwpewotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zUHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoMCxmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IG5zUHJlZml4PT1udWxsPyIiOm5zUHJlZml4OwotCi0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgdHlwZSA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSsxKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEibm9ybWFsaXplZFN0cmluZyIuZXF1YWxzKHR5cGUpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9maW5kIG5hbWVzcGFjZSBmb3IgdGhlIHByZWZpeAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zVXJpID0gcmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkobnNQcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKE5vcm1hbGl6ZWRTdHJpbmcpb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2RpbmcuRXh0ZW5zaW9uTWFwcGVyLmdldFR5cGVPYmplY3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNVcmksdHlwZSxyZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gTm90ZSBhbGwgYXR0cmlidXRlcyB0aGF0IHdlcmUgaGFuZGxlZC4gVXNlZCB0byBkaWZmZXIgbm9ybWFsIGF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgICAvLyBmcm9tIGFueUF0dHJpYnV0ZXMuCi0gICAgICAgICAgICAgICAgamF2YS51dGlsLlZlY3RvciBoYW5kbGVkQXR0cmlidXRlcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUoIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQgPSByZWFkZXIuZ2V0RWxlbWVudFRleHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5zZXROb3JtYWxpemVkU3RyaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9Ob3JtYWxpemVkU3RyaW5nKGNvbnRlbnQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBFbmQgb2YgaWYgZm9yIGV4cGVjdGVkIHByb3BlcnR5IHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2V7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBzdGFydCBlbGVtZW50IHdlIGFyZSBub3QgZXhwZWN0aW5nIGluZGljYXRlcyBhbiBpbnZhbGlkIHBhcmFtZXRlciB3YXMgcGFzc2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJVbmV4cGVjdGVkIHN1YmVsZW1lbnQgIiArIHJlYWRlci5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gZW5kIG9mIHdoaWxlIGxvb3AKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0KLQotICAgICAgICAgICAgfSBjYXRjaCAoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gb2JqZWN0OwotICAgICAgICB9Ci0KLSAgICAgICAgfS8vZW5kIG9mIGZhY3RvcnkgY2xhc3MKLQotICAgICAgICAKLQotICAgICAgICB9Ci0gICAgICAgICAgIAotICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvUG9zaXRpdmVJbnRlZ2VyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL1Bvc2l0aXZlSW50ZWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzBmYWE5Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvUG9zaXRpdmVJbnRlZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDMgKzAsMCBAQAotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIFBvc2l0aXZlSW50ZWdlci5qYXZhCi0gKgotICogVGhpcyBmaWxlIHdhcyBhdXRvLWdlbmVyYXRlZCBmcm9tIFdTREwKLSAqIGJ5IHRoZSBBcGFjaGUgQXhpczIgdmVyc2lvbjogU05BUFNIT1QgIEJ1aWx0IG9uIDogRGVjIDIxLCAyMDA3ICgwNDowMzozMCBMS1QpCi0gKi8KLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2Rpbmc7Ci0gICAgICAgICAgICAKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqICBQb3NpdGl2ZUludGVnZXIgYmVhbiBjbGFzcwotICAgICAgICAgICAgKi8KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyAgY2xhc3MgUG9zaXRpdmVJbnRlZ2VyCi0gICAgICAgIGltcGxlbWVudHMgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJCZWFuewotICAgICAgICAvKiBUaGlzIHR5cGUgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBwaWVjZSBvZiBzY2hlbWEgdGhhdCBoYWQKLSAgICAgICAgICAgICAgICBuYW1lID0gcG9zaXRpdmVJbnRlZ2VyCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFVSSSA9IGh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFByZWZpeCA9IG5zMQotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdlbmVyYXRlUHJlZml4KGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB7Ci0gICAgICAgICAgICBpZihuYW1lc3BhY2UuZXF1YWxzKCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIpKXsKLSAgICAgICAgICAgICAgICByZXR1cm4gIlNPQVAtRU5DIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBmaWVsZCBmb3IgUG9zaXRpdmVJbnRlZ2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLlBvc2l0aXZlSW50ZWdlciBsb2NhbFBvc2l0aXZlSW50ZWdlciA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgZ2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuUG9zaXRpdmVJbnRlZ2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLlBvc2l0aXZlSW50ZWdlciBnZXRQb3NpdGl2ZUludGVnZXIoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxQb3NpdGl2ZUludGVnZXI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBzZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gcGFyYW0gUG9zaXRpdmVJbnRlZ2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRQb3NpdGl2ZUludGVnZXIob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5Qb3NpdGl2ZUludGVnZXIgcGFyYW0pewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2FsUG9zaXRpdmVJbnRlZ2VyPXBhcmFtOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxQb3NpdGl2ZUludGVnZXIudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgIC8qKgotICAgICAqIGlzUmVhZGVyTVRPTUF3YXJlCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSByZWFkZXIgc3VwcG9ydHMgTVRPTQotICAgICAqLwotICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgewotICAgICAgICBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICB0cnl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBqYXZhLmxhbmcuQm9vbGVhbi5UUlVFLmVxdWFscyhyZWFkZXIuZ2V0UHJvcGVydHkob3JnLmFwYWNoZS5heGlvbS5vbS5PTUNvbnN0YW50cy5JU19EQVRBX0hBTkRMRVJTX0FXQVJFKSk7Ci0gICAgICAgIH1jYXRjaChqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlzUmVhZGVyTVRPTUF3YXJlOwotICAgfQotICAgICAKLSAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAqCi0gICAgICAgICogQHBhcmFtIHBhcmVudFFOYW1lCi0gICAgICAgICogQHBhcmFtIGZhY3RvcnkKLSAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgcHVibGljIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IGdldE9NRWxlbWVudCAoCi0gICAgICAgICAgICAgICBmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSkgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZSBkYXRhU291cmNlID0KLSAgICAgICAgICAgICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRGF0YVNvdXJjZSh0aGlzLHBhcmVudFFOYW1lKXsKLQotICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgUG9zaXRpdmVJbnRlZ2VyLnRoaXMuc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmxsb20uT01Tb3VyY2VkRWxlbWVudEltcGwoCi0gICAgICAgICAgICAgICBwYXJlbnRRTmFtZSxmYWN0b3J5LGRhdGFTb3VyY2UpOwotICAgICAgICAgICAgCi0gICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyLGZhbHNlKTsKLSAgICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VyaWFsaXplVHlwZSkKLSAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLQotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBwYXJlbnRRTmFtZS5nZXRQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlID0gcGFyZW50UU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2UgIT0gbnVsbCkgJiYgKG5hbWVzcGFjZS50cmltKCkubGVuZ3RoKCkgPiAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB3cml0ZXJQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAod3JpdGVyUHJlZml4ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQobmFtZXNwYWNlLCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwcmVmaXgsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICBpZiAoc2VyaWFsaXplVHlwZSl7Ci0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iKTsKLSAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZVByZWZpeCAhPSBudWxsKSAmJiAobmFtZXNwYWNlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApKXsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VQcmVmaXgrIjpwb3NpdGl2ZUludGVnZXIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3NpdGl2ZUludGVnZXIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxQb3NpdGl2ZUludGVnZXI9PW51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIHRoZSBuaWwgYXR0cmlidXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigicG9zaXRpdmVJbnRlZ2VyIGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsUG9zaXRpdmVJbnRlZ2VyKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBwcmVmaXgsamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICBpZiAoeG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0KLSAgICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0KLSAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLCBqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZU5hbWVzcGFjZSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlVmFsdWU7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gYXR0cmlidXRlUHJlZml4ICsgIjoiICsgcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsIGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIC8qKgotICAgICAgICAgKiAgbWV0aG9kIHRvIGhhbmRsZSBRbmFtZXMKLSAgICAgICAgICovCi0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWUoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMocHJlZml4ICsgIjoiICsgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGkuZSB0aGlzIGlzIHRoZSBkZWZhdWx0IG5hbWVzcGFjZQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZXMoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZVtdIHFuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgaWYgKHFuYW1lcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBzdG9yZSB0aGlzIGRhdGEgdW50aWwgbGFzdCBtb21lbnQgc2luY2UgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHdyaXRlIGFueQotICAgICAgICAgICAgICAgIC8vIG5hbWVzcGFjZSBkYXRhIGFmdGVyIHdyaXRpbmcgdGhlIGNoYXJhY3RvciBkYXRhCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZ0J1ZmZlciBzdHJpbmdUb1dyaXRlID0gbmV3IGphdmEubGFuZy5TdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBxbmFtZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZCgiICIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVVSSSA9IHFuYW1lc1tpXS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHByZWZpeCA9PSBudWxsKSB8fCAocHJlZml4Lmxlbmd0aCgpID09IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQocHJlZml4KS5hcHBlbmQoIjoiKS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhzdHJpbmdUb1dyaXRlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotCi0gICAgICAgICAvKioKLSAgICAgICAgICogUmVnaXN0ZXIgYSBuYW1lc3BhY2UgcHJlZml4Ci0gICAgICAgICAqLwotICAgICAgICAgcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHJlZ2lzdGVyUHJlZml4KGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoeG1sV3JpdGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHByZWZpeDsKLSAgICAgICAgICAgIH0KLQotCi0gIAotICAgICAgICAvKioKLSAgICAgICAgKiBkYXRhYmluZGluZyBtZXRob2QgdG8gZ2V0IGFuIFhNTCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdAotICAgICAgICAqCi0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciBnZXRQdWxsUGFyc2VyKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcU5hbWUpCi0gICAgICAgICAgICAgICAgICAgIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGVsZW1lbnRMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBhdHRyaWJMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXIuRUxFTUVOVF9URVhUKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbFBvc2l0aXZlSW50ZWdlciAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxQb3NpdGl2ZUludGVnZXIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigicG9zaXRpdmVJbnRlZ2VyIGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVySW1wbChxTmFtZSwgZWxlbWVudExpc3QudG9BcnJheSgpLCBhdHRyaWJMaXN0LnRvQXJyYXkoKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAKLQotICAgICAvKioKLSAgICAgICogIEZhY3RvcnkgY2xhc3MgdGhhdCBrZWVwcyB0aGUgcGFyc2UgbWV0aG9kCi0gICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeXsKLQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBQb3NpdGl2ZUludGVnZXIgZnJvbVN0cmluZyhqYXZhLmxhbmcuU3RyaW5nIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJKXsKLSAgICAgICAgICAgICAgICAgICAgUG9zaXRpdmVJbnRlZ2VyIHJldHVyblZhbHVlID0gbmV3ICBQb3NpdGl2ZUludGVnZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUuc2V0UG9zaXRpdmVJbnRlZ2VyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvUG9zaXRpdmVJbnRlZ2VyKHZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBQb3NpdGl2ZUludGVnZXIgZnJvbVN0cmluZyhqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudC5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IGNvbnRlbnQuc3Vic3RyaW5nKDAsY29udGVudC5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVcmkgPSB4bWxTdHJlYW1SZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFBvc2l0aXZlSW50ZWdlci5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCxuYW1lc3BhY2VVcmkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUG9zaXRpdmVJbnRlZ2VyLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LCIiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgCi0KLSAgICAgICAgLyoqCi0gICAgICAgICogc3RhdGljIG1ldGhvZCB0byBjcmVhdGUgdGhlIG9iamVjdAotICAgICAgICAqIFByZWNvbmRpdGlvbjogIElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSBjdXJyZW50IG9yIG5leHQgc3RhcnQgZWxlbWVudCBzdGFydHMgdGhpcyBvYmplY3QgYW5kIGFueSBpbnRlcnZlbmluZyByZWFkZXIgZXZlbnRzIGFyZSBpZ25vcmFibGUKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBub3QgYW4gZWxlbWVudCwgaXQgaXMgYSBjb21wbGV4IHR5cGUgYW5kIHRoZSByZWFkZXIgaXMgYXQgdGhlIGV2ZW50IGp1c3QgYWZ0ZXIgdGhlIG91dGVyIHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgKiBQb3N0Y29uZGl0aW9uOiBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgaXRzIGVuZCBlbGVtZW50Ci0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgYSBjb21wbGV4IHR5cGUsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCB0aGUgZW5kIGVsZW1lbnQgb2YgaXRzIG91dGVyIGVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBQb3NpdGl2ZUludGVnZXIgcGFyc2UoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIFBvc2l0aXZlSW50ZWdlciBvYmplY3QgPQotICAgICAgICAgICAgICAgIG5ldyBQb3NpdGl2ZUludGVnZXIoKTsKLQotICAgICAgICAgICAgaW50IGV2ZW50OwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuaWxsYWJsZVZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0iIjsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNldXJpID0iIjsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUgKCFyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAmJiAhcmVhZGVyLmlzRW5kRWxlbWVudCgpKQotICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIikhPW51bGwpewotICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBmdWxsVHlwZU5hbWUgPSByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIik7Ci0gICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1ByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKDAsZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBuc1ByZWZpeD09bnVsbD8iIjpuc1ByZWZpeDsKLQotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHR5cGUgPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikrMSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghInBvc2l0aXZlSW50ZWdlciIuZXF1YWxzKHR5cGUpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9maW5kIG5hbWVzcGFjZSBmb3IgdGhlIHByZWZpeAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zVXJpID0gcmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkobnNQcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFBvc2l0aXZlSW50ZWdlcilvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZy5FeHRlbnNpb25NYXBwZXIuZ2V0VHlwZU9iamVjdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc1VyaSx0eXBlLHJlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBOb3RlIGFsbCBhdHRyaWJ1dGVzIHRoYXQgd2VyZSBoYW5kbGVkLiBVc2VkIHRvIGRpZmZlciBub3JtYWwgYXR0cmlidXRlcwotICAgICAgICAgICAgICAgIC8vIGZyb20gYW55QXR0cmlidXRlcy4KLSAgICAgICAgICAgICAgICBqYXZhLnV0aWwuVmVjdG9yIGhhbmRsZWRBdHRyaWJ1dGVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSghcmVhZGVyLmlzRW5kRWxlbWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCA9IHJlYWRlci5nZXRFbGVtZW50VGV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldFBvc2l0aXZlSW50ZWdlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvUG9zaXRpdmVJbnRlZ2VyKGNvbnRlbnQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBFbmQgb2YgaWYgZm9yIGV4cGVjdGVkIHByb3BlcnR5IHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2V7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBzdGFydCBlbGVtZW50IHdlIGFyZSBub3QgZXhwZWN0aW5nIGluZGljYXRlcyBhbiBpbnZhbGlkIHBhcmFtZXRlciB3YXMgcGFzc2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJVbmV4cGVjdGVkIHN1YmVsZW1lbnQgIiArIHJlYWRlci5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gZW5kIG9mIHdoaWxlIGxvb3AKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0KLQotICAgICAgICAgICAgfSBjYXRjaCAoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gb2JqZWN0OwotICAgICAgICB9Ci0KLSAgICAgICAgfS8vZW5kIG9mIGZhY3RvcnkgY2xhc3MKLQotICAgICAgICAKLQotICAgICAgICB9Ci0gICAgICAgICAgIAotICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvUU5hbWUuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvUU5hbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU5ZjAyNC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL1FOYW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MTAgKzAsMCBAQAotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIFFOYW1lLmphdmEKLSAqCi0gKiBUaGlzIGZpbGUgd2FzIGF1dG8tZ2VuZXJhdGVkIGZyb20gV1NETAotICogYnkgdGhlIEFwYWNoZSBBeGlzMiB2ZXJzaW9uOiBTTkFQU0hPVCAgQnVpbHQgb24gOiBEZWMgMjEsIDIwMDcgKDA0OjAzOjMwIExLVCkKLSAqLwotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZzsKLSAgICAgICAgICAgIAotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogIFFOYW1lIGJlYW4gY2xhc3MKLSAgICAgICAgICAgICovCi0gICAgICAgIAotICAgICAgICBwdWJsaWMgIGNsYXNzIFFOYW1lCi0gICAgICAgIGltcGxlbWVudHMgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJCZWFuewotICAgICAgICAvKiBUaGlzIHR5cGUgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBwaWVjZSBvZiBzY2hlbWEgdGhhdCBoYWQKLSAgICAgICAgICAgICAgICBuYW1lID0gUU5hbWUKLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgVVJJID0gaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8KLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgUHJlZml4ID0gbnMxCi0gICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIAotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2VuZXJhdGVQcmVmaXgoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHsKLSAgICAgICAgICAgIGlmKG5hbWVzcGFjZS5lcXVhbHMoImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIikpewotICAgICAgICAgICAgICAgIHJldHVybiAiU09BUC1FTkMiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgIH0KLQotICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIGZpZWxkIGZvciBRTmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBsb2NhbFFOYW1lIDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBnZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyAgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBnZXRRTmFtZSgpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbFFOYW1lOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgc2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtIHBhcmFtIFFOYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRRTmFtZShqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmFtKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2NhbFFOYW1lPXBhcmFtOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxRTmFtZS50b1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgLyoqCi0gICAgICogaXNSZWFkZXJNVE9NQXdhcmUKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlYWRlciBzdXBwb3J0cyBNVE9NCi0gICAgICovCi0gICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIHRyeXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGphdmEubGFuZy5Cb29sZWFuLlRSVUUuZXF1YWxzKHJlYWRlci5nZXRQcm9wZXJ0eShvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQ29uc3RhbnRzLklTX0RBVEFfSEFORExFUlNfQVdBUkUpKTsKLSAgICAgICAgfWNhdGNoKGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXNSZWFkZXJNVE9NQXdhcmU7Ci0gICB9Ci0gICAgIAotICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICoKLSAgICAgICAgKiBAcGFyYW0gcGFyZW50UU5hbWUKLSAgICAgICAgKiBAcGFyYW0gZmFjdG9yeQotICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICBwdWJsaWMgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgZ2V0T01FbGVtZW50ICgKLSAgICAgICAgICAgICAgIGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5KSB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlIGRhdGFTb3VyY2UgPQotICAgICAgICAgICAgICAgICAgICAgICBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJEYXRhU291cmNlKHRoaXMscGFyZW50UU5hbWUpewotCi0gICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICBRTmFtZS50aGlzLnNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5sbG9tLk9NU291cmNlZEVsZW1lbnRJbXBsKAotICAgICAgICAgICAgICAgcGFyZW50UU5hbWUsZmFjdG9yeSxkYXRhU291cmNlKTsKLSAgICAgICAgICAgIAotICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcixmYWxzZSk7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNlcmlhbGl6ZVR5cGUpCi0gICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgCi0KLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gcGFyZW50UU5hbWUuZ2V0UHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZSA9IHBhcmVudFFOYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlICE9IG51bGwpICYmIChuYW1lc3BhY2UudHJpbSgpLmxlbmd0aCgpID4gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgd3JpdGVyUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdyaXRlclByZWZpeCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KG5hbWVzcGFjZSwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocHJlZml4LCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgaWYgKHNlcmlhbGl6ZVR5cGUpewotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIik7Ci0gICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2VQcmVmaXggIT0gbnVsbCkgJiYgKG5hbWVzcGFjZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlUHJlZml4KyI6UU5hbWUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJRTmFtZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbFFOYW1lPT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZSB0aGUgbmlsIGF0dHJpYnV0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIlFOYW1lIGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVRTmFtZShsb2NhbFFOYW1lLHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBwcmVmaXgsamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICBpZiAoeG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0KLSAgICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0KLSAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLCBqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZU5hbWVzcGFjZSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlVmFsdWU7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gYXR0cmlidXRlUHJlZml4ICsgIjoiICsgcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsIGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIC8qKgotICAgICAgICAgKiAgbWV0aG9kIHRvIGhhbmRsZSBRbmFtZXMKLSAgICAgICAgICovCi0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWUoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMocHJlZml4ICsgIjoiICsgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGkuZSB0aGlzIGlzIHRoZSBkZWZhdWx0IG5hbWVzcGFjZQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZXMoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZVtdIHFuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgaWYgKHFuYW1lcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBzdG9yZSB0aGlzIGRhdGEgdW50aWwgbGFzdCBtb21lbnQgc2luY2UgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHdyaXRlIGFueQotICAgICAgICAgICAgICAgIC8vIG5hbWVzcGFjZSBkYXRhIGFmdGVyIHdyaXRpbmcgdGhlIGNoYXJhY3RvciBkYXRhCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZ0J1ZmZlciBzdHJpbmdUb1dyaXRlID0gbmV3IGphdmEubGFuZy5TdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBxbmFtZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZCgiICIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVVSSSA9IHFuYW1lc1tpXS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHByZWZpeCA9PSBudWxsKSB8fCAocHJlZml4Lmxlbmd0aCgpID09IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQocHJlZml4KS5hcHBlbmQoIjoiKS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhzdHJpbmdUb1dyaXRlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotCi0gICAgICAgICAvKioKLSAgICAgICAgICogUmVnaXN0ZXIgYSBuYW1lc3BhY2UgcHJlZml4Ci0gICAgICAgICAqLwotICAgICAgICAgcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHJlZ2lzdGVyUHJlZml4KGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoeG1sV3JpdGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHByZWZpeDsKLSAgICAgICAgICAgIH0KLQotCi0gIAotICAgICAgICAvKioKLSAgICAgICAgKiBkYXRhYmluZGluZyBtZXRob2QgdG8gZ2V0IGFuIFhNTCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdAotICAgICAgICAqCi0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciBnZXRQdWxsUGFyc2VyKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcU5hbWUpCi0gICAgICAgICAgICAgICAgICAgIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGVsZW1lbnRMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBhdHRyaWJMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXIuRUxFTUVOVF9URVhUKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbFFOYW1lICE9IG51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbFFOYW1lKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIlFOYW1lIGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVySW1wbChxTmFtZSwgZWxlbWVudExpc3QudG9BcnJheSgpLCBhdHRyaWJMaXN0LnRvQXJyYXkoKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAKLQotICAgICAvKioKLSAgICAgICogIEZhY3RvcnkgY2xhc3MgdGhhdCBrZWVwcyB0aGUgcGFyc2UgbWV0aG9kCi0gICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeXsKLQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBRTmFtZSBmcm9tU3RyaW5nKGphdmEubGFuZy5TdHJpbmcgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkpewotICAgICAgICAgICAgICAgICAgICBRTmFtZSByZXR1cm5WYWx1ZSA9IG5ldyAgUU5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUuc2V0UU5hbWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9RTmFtZSh2YWx1ZSxuYW1lc3BhY2VVUkkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIFFOYW1lIGZyb21TdHJpbmcoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBjb250ZW50LnN1YnN0cmluZygwLGNvbnRlbnQuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVXJpID0geG1sU3RyZWFtUmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBRTmFtZS5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCxuYW1lc3BhY2VVcmkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUU5hbWUuRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsIiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAKLQotICAgICAgICAvKioKLSAgICAgICAgKiBzdGF0aWMgbWV0aG9kIHRvIGNyZWF0ZSB0aGUgb2JqZWN0Ci0gICAgICAgICogUHJlY29uZGl0aW9uOiAgSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIGN1cnJlbnQgb3IgbmV4dCBzdGFydCBlbGVtZW50IHN0YXJ0cyB0aGlzIG9iamVjdCBhbmQgYW55IGludGVydmVuaW5nIHJlYWRlciBldmVudHMgYXJlIGlnbm9yYWJsZQotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIG5vdCBhbiBlbGVtZW50LCBpdCBpcyBhIGNvbXBsZXggdHlwZSBhbmQgdGhlIHJlYWRlciBpcyBhdCB0aGUgZXZlbnQganVzdCBhZnRlciB0aGUgb3V0ZXIgc3RhcnQgZWxlbWVudAotICAgICAgICAqIFBvc3Rjb25kaXRpb246IElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCBpdHMgZW5kIGVsZW1lbnQKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBhIGNvbXBsZXggdHlwZSwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IHRoZSBlbmQgZWxlbWVudCBvZiBpdHMgb3V0ZXIgZWxlbWVudAotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFFOYW1lIHBhcnNlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb257Ci0gICAgICAgICAgICBRTmFtZSBvYmplY3QgPQotICAgICAgICAgICAgICAgIG5ldyBRTmFtZSgpOwotCi0gICAgICAgICAgICBpbnQgZXZlbnQ7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5pbGxhYmxlVmFsdWUgPSBudWxsOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSIiOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2V1cmkgPSIiOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSAoIXJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICYmICFyZWFkZXIuaXNFbmRFbGVtZW50KCkpCi0gICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiKSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGZ1bGxUeXBlTmFtZSA9IHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiKTsKLSAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUhPW51bGwpewotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zUHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoMCxmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IG5zUHJlZml4PT1udWxsPyIiOm5zUHJlZml4OwotCi0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgdHlwZSA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSsxKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEiUU5hbWUiLmVxdWFscyh0eXBlKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZmluZCBuYW1lc3BhY2UgZm9yIHRoZSBwcmVmaXgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1VyaSA9IHJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKG5zUHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChRTmFtZSlvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZy5FeHRlbnNpb25NYXBwZXIuZ2V0VHlwZU9iamVjdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc1VyaSx0eXBlLHJlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBOb3RlIGFsbCBhdHRyaWJ1dGVzIHRoYXQgd2VyZSBoYW5kbGVkLiBVc2VkIHRvIGRpZmZlciBub3JtYWwgYXR0cmlidXRlcwotICAgICAgICAgICAgICAgIC8vIGZyb20gYW55QXR0cmlidXRlcy4KLSAgICAgICAgICAgICAgICBqYXZhLnV0aWwuVmVjdG9yIGhhbmRsZWRBdHRyaWJ1dGVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSghcmVhZGVyLmlzRW5kRWxlbWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCA9IHJlYWRlci5nZXRFbGVtZW50VGV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCA9IGNvbnRlbnQuaW5kZXhPZigiOiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihpbmRleCA+IDApewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gY29udGVudC5zdWJzdHJpbmcoMCxpbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gIiI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2V1cmkgPSByZWFkZXIuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0UU5hbWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9RTmFtZShjb250ZW50LG5hbWVzcGFjZXVyaSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIEVuZCBvZiBpZiBmb3IgZXhwZWN0ZWQgcHJvcGVydHkgc3RhcnQgZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHN0YXJ0IGVsZW1lbnQgd2UgYXJlIG5vdCBleHBlY3RpbmcgaW5kaWNhdGVzIGFuIGludmFsaWQgcGFyYW1ldGVyIHdhcyBwYXNzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIlVuZXhwZWN0ZWQgc3ViZWxlbWVudCAiICsgcmVhZGVyLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBlbmQgb2Ygd2hpbGUgbG9vcAotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLQotCi0gICAgICAgICAgICB9IGNhdGNoIChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEubGFuZy5FeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBvYmplY3Q7Ci0gICAgICAgIH0KLQotICAgICAgICB9Ly9lbmQgb2YgZmFjdG9yeSBjbGFzcwotCi0gICAgICAgIAotCi0gICAgICAgIH0KLSAgICAgICAgICAgCi0gICAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9TdHJpbmcuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvU3RyaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzZmM4MDUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9TdHJpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwMyArMCwwIEBACi0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICogU3RyaW5nLmphdmEKLSAqCi0gKiBUaGlzIGZpbGUgd2FzIGF1dG8tZ2VuZXJhdGVkIGZyb20gV1NETAotICogYnkgdGhlIEFwYWNoZSBBeGlzMiB2ZXJzaW9uOiBTTkFQU0hPVCAgQnVpbHQgb24gOiBEZWMgMjEsIDIwMDcgKDA0OjAzOjMwIExLVCkKLSAqLwotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZzsKLSAgICAgICAgICAgIAotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogIFN0cmluZyBiZWFuIGNsYXNzCi0gICAgICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgcHVibGljICBjbGFzcyBTdHJpbmcKLSAgICAgICAgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkJlYW57Ci0gICAgICAgIC8qIFRoaXMgdHlwZSB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIHBpZWNlIG9mIHNjaGVtYSB0aGF0IGhhZAotICAgICAgICAgICAgICAgIG5hbWUgPSBzdHJpbmcKLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgVVJJID0gaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8KLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgUHJlZml4ID0gbnMxCi0gICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIAotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2VuZXJhdGVQcmVmaXgoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHsKLSAgICAgICAgICAgIGlmKG5hbWVzcGFjZS5lcXVhbHMoImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIikpewotICAgICAgICAgICAgICAgIHJldHVybiAiU09BUC1FTkMiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgIH0KLQotICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIGZpZWxkIGZvciBTdHJpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIGphdmEubGFuZy5TdHJpbmcgbG9jYWxTdHJpbmcgOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIGdldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljICBqYXZhLmxhbmcuU3RyaW5nIGdldFN0cmluZygpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbFN0cmluZzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIHNldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSBwYXJhbSBTdHJpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldFN0cmluZyhqYXZhLmxhbmcuU3RyaW5nIHBhcmFtKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2NhbFN0cmluZz1wYXJhbTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsU3RyaW5nLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAvKioKLSAgICAgKiBpc1JlYWRlck1UT01Bd2FyZQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVhZGVyIHN1cHBvcnRzIE1UT00KLSAgICAgKi8KLSAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKLSAgICAgICAgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICAKLSAgICAgICAgdHJ5ewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gamF2YS5sYW5nLkJvb2xlYW4uVFJVRS5lcXVhbHMocmVhZGVyLmdldFByb3BlcnR5KG9yZy5hcGFjaGUuYXhpb20ub20uT01Db25zdGFudHMuSVNfREFUQV9IQU5ETEVSU19BV0FSRSkpOwotICAgICAgICB9Y2F0Y2goamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpc1JlYWRlck1UT01Bd2FyZTsKLSAgIH0KLSAgICAgCi0gICAgIAotICAgICAgICAvKioKLSAgICAgICAgKgotICAgICAgICAqIEBwYXJhbSBwYXJlbnRRTmFtZQotICAgICAgICAqIEBwYXJhbSBmYWN0b3J5Ci0gICAgICAgICogQHJldHVybiBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudAotICAgICAgICAqLwotICAgICAgIHB1YmxpYyBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCBnZXRPTUVsZW1lbnQgKAotICAgICAgICAgICAgICAgZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnkpIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTURhdGFTb3VyY2UgZGF0YVNvdXJjZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkRhdGFTb3VyY2UodGhpcyxwYXJlbnRRTmFtZSl7Ci0KLSAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgIFN0cmluZy50aGlzLnNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5sbG9tLk9NU291cmNlZEVsZW1lbnRJbXBsKAotICAgICAgICAgICAgICAgcGFyZW50UU5hbWUsZmFjdG9yeSxkYXRhU291cmNlKTsKLSAgICAgICAgICAgIAotICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcixmYWxzZSk7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNlcmlhbGl6ZVR5cGUpCi0gICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgCi0KLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gcGFyZW50UU5hbWUuZ2V0UHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZSA9IHBhcmVudFFOYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlICE9IG51bGwpICYmIChuYW1lc3BhY2UudHJpbSgpLmxlbmd0aCgpID4gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgd3JpdGVyUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdyaXRlclByZWZpeCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KG5hbWVzcGFjZSwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocHJlZml4LCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgaWYgKHNlcmlhbGl6ZVR5cGUpewotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIik7Ci0gICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2VQcmVmaXggIT0gbnVsbCkgJiYgKG5hbWVzcGFjZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlUHJlZml4KyI6c3RyaW5nIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAic3RyaW5nIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsU3RyaW5nPT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZSB0aGUgbmlsIGF0dHJpYnV0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oInN0cmluZyBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMobG9jYWxTdHJpbmcpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGggdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgcHJlZml4LGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgaWYgKHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotCi0gICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotCi0gICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSwgamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVOYW1lc3BhY2UgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgoYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVZhbHVlOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IGF0dHJpYnV0ZVByZWZpeCArICI6IiArIHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLCBhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAvKioKLSAgICAgICAgICogIG1ldGhvZCB0byBoYW5kbGUgUW5hbWVzCi0gICAgICAgICAqLwotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHByZWZpeCArICI6IiArIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBpLmUgdGhpcyBpcyB0aGUgZGVmYXVsdCBuYW1lc3BhY2UKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVzKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWVbXSBxbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgIGlmIChxbmFtZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gc3RvcmUgdGhpcyBkYXRhIHVudGlsIGxhc3QgbW9tZW50IHNpbmNlIGl0IGlzIG5vdCBwb3NzaWJsZSB0byB3cml0ZSBhbnkKLSAgICAgICAgICAgICAgICAvLyBuYW1lc3BhY2UgZGF0YSBhZnRlciB3cml0aW5nIHRoZSBjaGFyYWN0b3IgZGF0YQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmdCdWZmZXIgc3RyaW5nVG9Xcml0ZSA9IG5ldyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcW5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQoIiAiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VVUkkgPSBxbmFtZXNbaV0uZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwcmVmaXggPT0gbnVsbCkgfHwgKHByZWZpeC5sZW5ndGgoKSA9PSAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKHByZWZpeCkuYXBwZW5kKCI6IikuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMoc3RyaW5nVG9Xcml0ZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAqIFJlZ2lzdGVyIGEgbmFtZXNwYWNlIHByZWZpeAotICAgICAgICAgKi8KLSAgICAgICAgIHByaXZhdGUgamF2YS5sYW5nLlN0cmluZyByZWdpc3RlclByZWZpeChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHhtbFdyaXRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiBwcmVmaXg7Ci0gICAgICAgICAgICB9Ci0KLQotICAKLSAgICAgICAgLyoqCi0gICAgICAgICogZGF0YWJpbmRpbmcgbWV0aG9kIHRvIGdldCBhbiBYTUwgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QKLSAgICAgICAgKgotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgZ2V0UHVsbFBhcnNlcihqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFOYW1lKQotICAgICAgICAgICAgICAgICAgICB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBlbGVtZW50TGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgYXR0cmliTGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVyLkVMRU1FTlRfVEVYVCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxTdHJpbmcgIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsU3RyaW5nKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oInN0cmluZyBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlckltcGwocU5hbWUsIGVsZW1lbnRMaXN0LnRvQXJyYXkoKSwgYXR0cmliTGlzdC50b0FycmF5KCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgCi0KLSAgICAgLyoqCi0gICAgICAqICBGYWN0b3J5IGNsYXNzIHRoYXQga2VlcHMgdGhlIHBhcnNlIG1ldGhvZAotICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3Rvcnl7Ci0KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGZyb21TdHJpbmcoamF2YS5sYW5nLlN0cmluZyB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSl7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyByZXR1cm5WYWx1ZSA9IG5ldyAgU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlLnNldFN0cmluZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyh2YWx1ZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGZyb21TdHJpbmcoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBjb250ZW50LnN1YnN0cmluZygwLGNvbnRlbnQuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVXJpID0geG1sU3RyZWFtUmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcuRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsbmFtZXNwYWNlVXJpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCwiIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIAotCi0gICAgICAgIC8qKgotICAgICAgICAqIHN0YXRpYyBtZXRob2QgdG8gY3JlYXRlIHRoZSBvYmplY3QKLSAgICAgICAgKiBQcmVjb25kaXRpb246ICBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgY3VycmVudCBvciBuZXh0IHN0YXJ0IGVsZW1lbnQgc3RhcnRzIHRoaXMgb2JqZWN0IGFuZCBhbnkgaW50ZXJ2ZW5pbmcgcmVhZGVyIGV2ZW50cyBhcmUgaWdub3JhYmxlCi0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgbm90IGFuIGVsZW1lbnQsIGl0IGlzIGEgY29tcGxleCB0eXBlIGFuZCB0aGUgcmVhZGVyIGlzIGF0IHRoZSBldmVudCBqdXN0IGFmdGVyIHRoZSBvdXRlciBzdGFydCBlbGVtZW50Ci0gICAgICAgICogUG9zdGNvbmRpdGlvbjogSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IGl0cyBlbmQgZWxlbWVudAotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIGEgY29tcGxleCB0eXBlLCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgdGhlIGVuZCBlbGVtZW50IG9mIGl0cyBvdXRlciBlbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhcnNlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb257Ci0gICAgICAgICAgICBTdHJpbmcgb2JqZWN0ID0KLSAgICAgICAgICAgICAgICBuZXcgU3RyaW5nKCk7Ci0KLSAgICAgICAgICAgIGludCBldmVudDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmlsbGFibGVWYWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IiI7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZXVyaSA9IiI7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlICghcmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgJiYgIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkKLSAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIpIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgZnVsbFR5cGVOYW1lID0gcmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAidHlwZSIpOwotICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNQcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZygwLGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gbnNQcmVmaXg9PW51bGw/IiI6bnNQcmVmaXg7Ci0KLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB0eXBlID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZyhmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKzEpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISJzdHJpbmciLmVxdWFscyh0eXBlKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZmluZCBuYW1lc3BhY2UgZm9yIHRoZSBwcmVmaXgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1VyaSA9IHJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKG5zUHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChTdHJpbmcpb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2RpbmcuRXh0ZW5zaW9uTWFwcGVyLmdldFR5cGVPYmplY3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNVcmksdHlwZSxyZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gTm90ZSBhbGwgYXR0cmlidXRlcyB0aGF0IHdlcmUgaGFuZGxlZC4gVXNlZCB0byBkaWZmZXIgbm9ybWFsIGF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgICAvLyBmcm9tIGFueUF0dHJpYnV0ZXMuCi0gICAgICAgICAgICAgICAgamF2YS51dGlsLlZlY3RvciBoYW5kbGVkQXR0cmlidXRlcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUoIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQgPSByZWFkZXIuZ2V0RWxlbWVudFRleHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5zZXRTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhjb250ZW50KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gRW5kIG9mIGlmIGZvciBleHBlY3RlZCBwcm9wZXJ0eSBzdGFydCBlbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgc3RhcnQgZWxlbWVudCB3ZSBhcmUgbm90IGV4cGVjdGluZyBpbmRpY2F0ZXMgYW4gaW52YWxpZCBwYXJhbWV0ZXIgd2FzIHBhc3NlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiVW5leHBlY3RlZCBzdWJlbGVtZW50ICIgKyByZWFkZXIuZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIGVuZCBvZiB3aGlsZSBsb29wCi0gICAgICAgICAgICAgICAgICAgICAgICAKLQotCi0KLSAgICAgICAgICAgIH0gY2F0Y2ggKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5sYW5nLkV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG9iamVjdDsKLSAgICAgICAgfQotCi0gICAgICAgIH0vL2VuZCBvZiBmYWN0b3J5IGNsYXNzCi0KLSAgICAgICAgCi0KLSAgICAgICAgfQotICAgICAgICAgICAKLSAgICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL1N0cnVjdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9TdHJ1Y3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE2NmQzNy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL1N0cnVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjk0ICswLDAgQEAKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBTdHJ1Y3QuamF2YQotICoKLSAqIFRoaXMgZmlsZSB3YXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBXU0RMCi0gKiBieSB0aGUgQXBhY2hlIEF4aXMyIHZlcnNpb246IFNOQVBTSE9UICBCdWlsdCBvbiA6IERlYyAyMSwgMjAwNyAoMDQ6MDM6MzAgTEtUKQotICovCi0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBwYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nOwotICAgICAgICAgICAgCi0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiAgU3RydWN0IGJlYW4gY2xhc3MKLSAgICAgICAgICAgICovCi0gICAgICAgIAotICAgICAgICBwdWJsaWMgIGNsYXNzIFN0cnVjdAotICAgICAgICBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCQmVhbnsKLSAgICAgICAgLyogVGhpcyB0eXBlIHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgcGllY2Ugb2Ygc2NoZW1hIHRoYXQgaGFkCi0gICAgICAgICAgICAgICAgbmFtZSA9IFN0cnVjdAotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBVUkkgPSBodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLwotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBQcmVmaXggPSBuczEKLSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgCi0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZW5lcmF0ZVByZWZpeChqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICAgICAgaWYobmFtZXNwYWNlLmVxdWFscygiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iKSl7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJTT0FQLUVOQyI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgfQotCi0gICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogZmllbGQgZm9yIEV4dHJhRWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgKiBUaGlzIHdhcyBhbiBBcnJheSEKLSAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50W10gbG9jYWxFeHRyYUVsZW1lbnQgOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBUaGlzIHRyYWNrZXIgYm9vbGVhbiB3aWwgYmUgdXNlZCB0byBkZXRlY3Qgd2hldGhlciB0aGUgdXNlciBjYWxsZWQgdGhlIHNldCBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIGZvciB0aGlzIGF0dHJpYnV0ZS4gSXQgd2lsbCBiZSB1c2VkIHRvIGRldGVybWluZSB3aGV0aGVyIHRvIGluY2x1ZGUgdGhpcyBmaWVsZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIGluIHRoZSBzZXJpYWxpemVkIFhNTAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBib29sZWFuIGxvY2FsRXh0cmFFbGVtZW50VHJhY2tlciA9IGZhbHNlIDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgZ2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50W10KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50W10gZ2V0RXh0cmFFbGVtZW50KCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsRXh0cmFFbGVtZW50OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogdmFsaWRhdGUgdGhlIGFycmF5IGZvciBFeHRyYUVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVFeHRyYUVsZW1lbnQob3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnRbXSBwYXJhbSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIHNldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtIHBhcmFtIEV4dHJhRWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldEV4dHJhRWxlbWVudChvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudFtdIHBhcmFtKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZUV4dHJhRWxlbWVudChwYXJhbSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbSAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdXBkYXRlIHRoZSBzZXR0aW5nIHRyYWNrZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsRXh0cmFFbGVtZW50VHJhY2tlciA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxFeHRyYUVsZW1lbnRUcmFja2VyID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2FsRXh0cmFFbGVtZW50PXBhcmFtOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBhZGQgbWV0aG9kIGZvciB0aGUgYXJyYXkgZm9yIGNvbnZlbmllbmNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtIHBhcmFtIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFkZEV4dHJhRWxlbWVudChvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCBwYXJhbSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbEV4dHJhRWxlbWVudCA9PSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxFeHRyYUVsZW1lbnQgPSBuZXcgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnRbXXt9OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdXBkYXRlIHRoZSBzZXR0aW5nIHRyYWNrZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxFeHRyYUVsZW1lbnRUcmFja2VyID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEudXRpbC5MaXN0IGxpc3QgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC50b0xpc3QobG9jYWxFeHRyYUVsZW1lbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QuYWRkKHBhcmFtKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2FsRXh0cmFFbGVtZW50ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50W10pbGlzdC50b0FycmF5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudFtsaXN0LnNpemUoKV0pOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBmaWVsZCBmb3IgSWQKLSAgICAgICAgICAgICAgICAgICAgICAgICogVGhpcyB3YXMgYW4gQXR0cmlidXRlIQotICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5JZCBsb2NhbElkIDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBnZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5JZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5JZCBnZXRJZCgpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbElkOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgc2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtIHBhcmFtIElkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRJZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLklkIHBhcmFtKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2NhbElkPXBhcmFtOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBmaWVsZCBmb3IgSHJlZgotICAgICAgICAgICAgICAgICAgICAgICAgKiBUaGlzIHdhcyBhbiBBdHRyaWJ1dGUhCi0gICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLlVSSSBsb2NhbEhyZWYgOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIGdldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLlVSSQotICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5VUkkgZ2V0SHJlZigpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbEhyZWY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBzZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gcGFyYW0gSHJlZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0SHJlZihvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLlVSSSBwYXJhbSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYWxIcmVmPXBhcmFtOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgLyoqCi0gICAgICogaXNSZWFkZXJNVE9NQXdhcmUKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlYWRlciBzdXBwb3J0cyBNVE9NCi0gICAgICovCi0gICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIHRyeXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGphdmEubGFuZy5Cb29sZWFuLlRSVUUuZXF1YWxzKHJlYWRlci5nZXRQcm9wZXJ0eShvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQ29uc3RhbnRzLklTX0RBVEFfSEFORExFUlNfQVdBUkUpKTsKLSAgICAgICAgfWNhdGNoKGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXNSZWFkZXJNVE9NQXdhcmU7Ci0gICB9Ci0gICAgIAotICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICoKLSAgICAgICAgKiBAcGFyYW0gcGFyZW50UU5hbWUKLSAgICAgICAgKiBAcGFyYW0gZmFjdG9yeQotICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICBwdWJsaWMgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgZ2V0T01FbGVtZW50ICgKLSAgICAgICAgICAgICAgIGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5KSB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlIGRhdGFTb3VyY2UgPQotICAgICAgICAgICAgICAgICAgICAgICBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJEYXRhU291cmNlKHRoaXMscGFyZW50UU5hbWUpewotCi0gICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICBTdHJ1Y3QudGhpcy5zZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5PTVNvdXJjZWRFbGVtZW50SW1wbCgKLSAgICAgICAgICAgICAgIHBhcmVudFFOYW1lLGZhY3RvcnksZGF0YVNvdXJjZSk7Ci0gICAgICAgICAgICAKLSAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIsZmFsc2UpOwotICAgICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzZXJpYWxpemVUeXBlKQotICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotCi0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UgPSBudWxsOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHBhcmVudFFOYW1lLmdldFByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UgPSBwYXJlbnRRTmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZSAhPSBudWxsKSAmJiAobmFtZXNwYWNlLnRyaW0oKS5sZW5ndGgoKSA+IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHdyaXRlclByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3cml0ZXJQcmVmaXggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChuYW1lc3BhY2UsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHByZWZpeCwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCksIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIGlmIChzZXJpYWxpemVUeXBlKXsKLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIpOwotICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlUHJlZml4ICE9IG51bGwpICYmIChuYW1lc3BhY2VQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkpewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVByZWZpeCsiOlN0cnVjdCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIlN0cnVjdCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbElkICE9IG51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbElkKSwgeG1sV3JpdGVyKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbEhyZWYgIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJocmVmIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxIcmVmKSwgeG1sV3JpdGVyKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbEV4dHJhRWxlbWVudFRyYWNrZXIpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbEV4dHJhRWxlbWVudCAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7aSA8IGxvY2FsRXh0cmFFbGVtZW50Lmxlbmd0aDtpKyspewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsRXh0cmFFbGVtZW50W2ldICE9IG51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsRXh0cmFFbGVtZW50W2ldLnNlcmlhbGl6ZSh4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gZG8gbm90aGluZyBzaW5jZSBtaW5PY2N1cmVzIHplcm8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oImV4dHJhRWxlbWVudCBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGggdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgcHJlZml4LGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgaWYgKHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotCi0gICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotCi0gICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSwgamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVOYW1lc3BhY2UgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgoYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVZhbHVlOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IGF0dHJpYnV0ZVByZWZpeCArICI6IiArIHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLCBhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAvKioKLSAgICAgICAgICogIG1ldGhvZCB0byBoYW5kbGUgUW5hbWVzCi0gICAgICAgICAqLwotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHByZWZpeCArICI6IiArIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBpLmUgdGhpcyBpcyB0aGUgZGVmYXVsdCBuYW1lc3BhY2UKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVzKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWVbXSBxbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgIGlmIChxbmFtZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gc3RvcmUgdGhpcyBkYXRhIHVudGlsIGxhc3QgbW9tZW50IHNpbmNlIGl0IGlzIG5vdCBwb3NzaWJsZSB0byB3cml0ZSBhbnkKLSAgICAgICAgICAgICAgICAvLyBuYW1lc3BhY2UgZGF0YSBhZnRlciB3cml0aW5nIHRoZSBjaGFyYWN0b3IgZGF0YQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmdCdWZmZXIgc3RyaW5nVG9Xcml0ZSA9IG5ldyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcW5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQoIiAiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VVUkkgPSBxbmFtZXNbaV0uZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwcmVmaXggPT0gbnVsbCkgfHwgKHByZWZpeC5sZW5ndGgoKSA9PSAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKHByZWZpeCkuYXBwZW5kKCI6IikuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMoc3RyaW5nVG9Xcml0ZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAqIFJlZ2lzdGVyIGEgbmFtZXNwYWNlIHByZWZpeAotICAgICAgICAgKi8KLSAgICAgICAgIHByaXZhdGUgamF2YS5sYW5nLlN0cmluZyByZWdpc3RlclByZWZpeChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHhtbFdyaXRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiBwcmVmaXg7Ci0gICAgICAgICAgICB9Ci0KLQotICAKLSAgICAgICAgLyoqCi0gICAgICAgICogZGF0YWJpbmRpbmcgbWV0aG9kIHRvIGdldCBhbiBYTUwgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QKLSAgICAgICAgKgotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgZ2V0UHVsbFBhcnNlcihqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFOYW1lKQotICAgICAgICAgICAgICAgICAgICB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBlbGVtZW50TGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgYXR0cmliTGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgICAgICAgICAgaWYgKGxvY2FsRXh0cmFFbGVtZW50VHJhY2tlcil7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsRXh0cmFFbGVtZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7aSA8IGxvY2FsRXh0cmFFbGVtZW50Lmxlbmd0aDtpKyspewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsRXh0cmFFbGVtZW50W2ldICE9IG51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG5ldyBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lKCIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXh0cmFFbGVtZW50IikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxFeHRyYUVsZW1lbnRbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBoYXZlIHRvIGRvIG5vdGhpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJleHRyYUVsZW1lbnQgY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJMaXN0LmFkZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSgiIiwiaWQiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYkxpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxJZCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJMaXN0LmFkZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSgiIiwiaHJlZiIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmliTGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbEhyZWYpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlckltcGwocU5hbWUsIGVsZW1lbnRMaXN0LnRvQXJyYXkoKSwgYXR0cmliTGlzdC50b0FycmF5KCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgCi0KLSAgICAgLyoqCi0gICAgICAqICBGYWN0b3J5IGNsYXNzIHRoYXQga2VlcHMgdGhlIHBhcnNlIG1ldGhvZAotICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3Rvcnl7Ci0KLSAgICAgICAgCi0gICAgICAgIAotCi0gICAgICAgIC8qKgotICAgICAgICAqIHN0YXRpYyBtZXRob2QgdG8gY3JlYXRlIHRoZSBvYmplY3QKLSAgICAgICAgKiBQcmVjb25kaXRpb246ICBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgY3VycmVudCBvciBuZXh0IHN0YXJ0IGVsZW1lbnQgc3RhcnRzIHRoaXMgb2JqZWN0IGFuZCBhbnkgaW50ZXJ2ZW5pbmcgcmVhZGVyIGV2ZW50cyBhcmUgaWdub3JhYmxlCi0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgbm90IGFuIGVsZW1lbnQsIGl0IGlzIGEgY29tcGxleCB0eXBlIGFuZCB0aGUgcmVhZGVyIGlzIGF0IHRoZSBldmVudCBqdXN0IGFmdGVyIHRoZSBvdXRlciBzdGFydCBlbGVtZW50Ci0gICAgICAgICogUG9zdGNvbmRpdGlvbjogSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IGl0cyBlbmQgZWxlbWVudAotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIGEgY29tcGxleCB0eXBlLCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgdGhlIGVuZCBlbGVtZW50IG9mIGl0cyBvdXRlciBlbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RydWN0IHBhcnNlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb257Ci0gICAgICAgICAgICBTdHJ1Y3Qgb2JqZWN0ID0KLSAgICAgICAgICAgICAgICBuZXcgU3RydWN0KCk7Ci0KLSAgICAgICAgICAgIGludCBldmVudDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmlsbGFibGVWYWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IiI7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZXVyaSA9IiI7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlICghcmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgJiYgIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkKLSAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIpIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgZnVsbFR5cGVOYW1lID0gcmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAidHlwZSIpOwotICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNQcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZygwLGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gbnNQcmVmaXg9PW51bGw/IiI6bnNQcmVmaXg7Ci0KLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB0eXBlID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZyhmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKzEpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISJTdHJ1Y3QiLmVxdWFscyh0eXBlKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZmluZCBuYW1lc3BhY2UgZm9yIHRoZSBwcmVmaXgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1VyaSA9IHJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKG5zUHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChTdHJ1Y3Qpb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2RpbmcuRXh0ZW5zaW9uTWFwcGVyLmdldFR5cGVPYmplY3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNVcmksdHlwZSxyZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gTm90ZSBhbGwgYXR0cmlidXRlcyB0aGF0IHdlcmUgaGFuZGxlZC4gVXNlZCB0byBkaWZmZXIgbm9ybWFsIGF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgICAvLyBmcm9tIGFueUF0dHJpYnV0ZXMuCi0gICAgICAgICAgICAgICAgamF2YS51dGlsLlZlY3RvciBoYW5kbGVkQXR0cmlidXRlcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZSBhdHRyaWJ1dGUgImlkIgotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHRlbXBBdHRyaWJJZCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsImlkIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgaWYgKHRlbXBBdHRyaWJJZCE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50ID0gdGVtcEF0dHJpYklkOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldElkKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9JRCh0ZW1wQXR0cmliSWQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZWRBdHRyaWJ1dGVzLmFkZCgiaWQiKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZSBhdHRyaWJ1dGUgImhyZWYiCi0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgdGVtcEF0dHJpYkhyZWYgPQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCJocmVmIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgaWYgKHRlbXBBdHRyaWJIcmVmIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQgPSB0ZW1wQXR0cmliSHJlZjsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5zZXRIcmVmKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9BbnlVUkkodGVtcEF0dHJpYkhyZWYpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZWRBdHRyaWJ1dGVzLmFkZCgiaHJlZiIpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGxpc3QxID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICghcmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgJiYgIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByb2Nlc3MgdGhlIGFycmF5IGFuZCBzdGVwIHBhc3QgaXRzIGZpbmFsIGVsZW1lbnQncyBlbmQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGxvb3BEb25lMT1mYWxzZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCFsb29wRG9uZTEpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50ID0gcmVhZGVyLmdldEV2ZW50VHlwZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUNvbnN0YW50cy5TVEFSVF9FTEVNRU5UID09IGV2ZW50KXsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgbmVlZCB0byB3cmFwIHRoZSByZWFkZXIgc28gdGhhdCBpdCBwcm9kdWNlcyBhIGZha2UgU1RBUlRfRE9DVUVNRU5UIGV2ZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLk5hbWVkU3RheE9NQnVpbGRlciBidWlsZGVyMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5OYW1lZFN0YXhPTUJ1aWxkZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuU3RyZWFtV3JhcHBlcihyZWFkZXIpLCByZWFkZXIuZ2V0TmFtZSgpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QxLmFkZChidWlsZGVyMS5nZXRPTUVsZW1lbnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNFbmRFbGVtZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgdHdvIGNvdW50aW51b3MgZW5kIGVsZW1lbnRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BEb25lMSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmIChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUNvbnN0YW50cy5FTkRfRUxFTUVOVCA9PSBldmVudCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BEb25lMSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0RXh0cmFFbGVtZW50KChvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudFtdKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9BcnJheSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQuY2xhc3MsbGlzdDEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gRW5kIG9mIGlmIGZvciBleHBlY3RlZCBwcm9wZXJ0eSBzdGFydCBlbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCFyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAmJiAhcmVhZGVyLmlzRW5kRWxlbWVudCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgc3RhcnQgZWxlbWVudCB3ZSBhcmUgbm90IGV4cGVjdGluZyBpbmRpY2F0ZXMgYSB0cmFpbGluZyBpbnZhbGlkIHByb3BlcnR5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiVW5leHBlY3RlZCBzdWJlbGVtZW50ICIgKyByZWFkZXIuZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0KLQotICAgICAgICAgICAgfSBjYXRjaCAoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gb2JqZWN0OwotICAgICAgICB9Ci0KLSAgICAgICAgfS8vZW5kIG9mIGZhY3RvcnkgY2xhc3MKLQotICAgICAgICAKLQotICAgICAgICB9Ci0gICAgICAgICAgIAotICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvVGltZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9UaW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxMDgwOGEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9UaW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDMgKzAsMCBAQAotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIFRpbWUuamF2YQotICoKLSAqIFRoaXMgZmlsZSB3YXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBXU0RMCi0gKiBieSB0aGUgQXBhY2hlIEF4aXMyIHZlcnNpb246IFNOQVBTSE9UICBCdWlsdCBvbiA6IERlYyAyMSwgMjAwNyAoMDQ6MDM6MzAgTEtUKQotICovCi0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBwYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nOwotICAgICAgICAgICAgCi0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiAgVGltZSBiZWFuIGNsYXNzCi0gICAgICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgcHVibGljICBjbGFzcyBUaW1lCi0gICAgICAgIGltcGxlbWVudHMgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJCZWFuewotICAgICAgICAvKiBUaGlzIHR5cGUgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBwaWVjZSBvZiBzY2hlbWEgdGhhdCBoYWQKLSAgICAgICAgICAgICAgICBuYW1lID0gdGltZQotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBVUkkgPSBodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLwotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBQcmVmaXggPSBuczEKLSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgCi0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZW5lcmF0ZVByZWZpeChqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICAgICAgaWYobmFtZXNwYWNlLmVxdWFscygiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iKSl7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJTT0FQLUVOQyI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgfQotCi0gICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogZmllbGQgZm9yIFRpbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuVGltZSBsb2NhbFRpbWUgOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIGdldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLlRpbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuVGltZSBnZXRUaW1lKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsVGltZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIHNldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSBwYXJhbSBUaW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRUaW1lKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuVGltZSBwYXJhbSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYWxUaW1lPXBhcmFtOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxUaW1lLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAvKioKLSAgICAgKiBpc1JlYWRlck1UT01Bd2FyZQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVhZGVyIHN1cHBvcnRzIE1UT00KLSAgICAgKi8KLSAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKLSAgICAgICAgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICAKLSAgICAgICAgdHJ5ewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gamF2YS5sYW5nLkJvb2xlYW4uVFJVRS5lcXVhbHMocmVhZGVyLmdldFByb3BlcnR5KG9yZy5hcGFjaGUuYXhpb20ub20uT01Db25zdGFudHMuSVNfREFUQV9IQU5ETEVSU19BV0FSRSkpOwotICAgICAgICB9Y2F0Y2goamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpc1JlYWRlck1UT01Bd2FyZTsKLSAgIH0KLSAgICAgCi0gICAgIAotICAgICAgICAvKioKLSAgICAgICAgKgotICAgICAgICAqIEBwYXJhbSBwYXJlbnRRTmFtZQotICAgICAgICAqIEBwYXJhbSBmYWN0b3J5Ci0gICAgICAgICogQHJldHVybiBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudAotICAgICAgICAqLwotICAgICAgIHB1YmxpYyBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCBnZXRPTUVsZW1lbnQgKAotICAgICAgICAgICAgICAgZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnkpIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTURhdGFTb3VyY2UgZGF0YVNvdXJjZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkRhdGFTb3VyY2UodGhpcyxwYXJlbnRRTmFtZSl7Ci0KLSAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgIFRpbWUudGhpcy5zZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5PTVNvdXJjZWRFbGVtZW50SW1wbCgKLSAgICAgICAgICAgICAgIHBhcmVudFFOYW1lLGZhY3RvcnksZGF0YVNvdXJjZSk7Ci0gICAgICAgICAgICAKLSAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIsZmFsc2UpOwotICAgICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzZXJpYWxpemVUeXBlKQotICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotCi0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UgPSBudWxsOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHBhcmVudFFOYW1lLmdldFByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UgPSBwYXJlbnRRTmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZSAhPSBudWxsKSAmJiAobmFtZXNwYWNlLnRyaW0oKS5sZW5ndGgoKSA+IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHdyaXRlclByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3cml0ZXJQcmVmaXggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChuYW1lc3BhY2UsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHByZWZpeCwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCksIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIGlmIChzZXJpYWxpemVUeXBlKXsKLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIpOwotICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlUHJlZml4ICE9IG51bGwpICYmIChuYW1lc3BhY2VQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkpewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVByZWZpeCsiOnRpbWUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aW1lIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsVGltZT09bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgdGhlIG5pbCBhdHRyaWJ1dGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJ0aW1lIGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsVGltZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGggdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgcHJlZml4LGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgaWYgKHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotCi0gICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotCi0gICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSwgamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVOYW1lc3BhY2UgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgoYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVZhbHVlOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IGF0dHJpYnV0ZVByZWZpeCArICI6IiArIHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLCBhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAvKioKLSAgICAgICAgICogIG1ldGhvZCB0byBoYW5kbGUgUW5hbWVzCi0gICAgICAgICAqLwotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHByZWZpeCArICI6IiArIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBpLmUgdGhpcyBpcyB0aGUgZGVmYXVsdCBuYW1lc3BhY2UKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVzKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWVbXSBxbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgIGlmIChxbmFtZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gc3RvcmUgdGhpcyBkYXRhIHVudGlsIGxhc3QgbW9tZW50IHNpbmNlIGl0IGlzIG5vdCBwb3NzaWJsZSB0byB3cml0ZSBhbnkKLSAgICAgICAgICAgICAgICAvLyBuYW1lc3BhY2UgZGF0YSBhZnRlciB3cml0aW5nIHRoZSBjaGFyYWN0b3IgZGF0YQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmdCdWZmZXIgc3RyaW5nVG9Xcml0ZSA9IG5ldyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcW5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQoIiAiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VVUkkgPSBxbmFtZXNbaV0uZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwcmVmaXggPT0gbnVsbCkgfHwgKHByZWZpeC5sZW5ndGgoKSA9PSAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKHByZWZpeCkuYXBwZW5kKCI6IikuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMoc3RyaW5nVG9Xcml0ZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAqIFJlZ2lzdGVyIGEgbmFtZXNwYWNlIHByZWZpeAotICAgICAgICAgKi8KLSAgICAgICAgIHByaXZhdGUgamF2YS5sYW5nLlN0cmluZyByZWdpc3RlclByZWZpeChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHhtbFdyaXRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiBwcmVmaXg7Ci0gICAgICAgICAgICB9Ci0KLQotICAKLSAgICAgICAgLyoqCi0gICAgICAgICogZGF0YWJpbmRpbmcgbWV0aG9kIHRvIGdldCBhbiBYTUwgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QKLSAgICAgICAgKgotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgZ2V0UHVsbFBhcnNlcihqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFOYW1lKQotICAgICAgICAgICAgICAgICAgICB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBlbGVtZW50TGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgYXR0cmliTGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVyLkVMRU1FTlRfVEVYVCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxUaW1lICE9IG51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbFRpbWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigidGltZSBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlckltcGwocU5hbWUsIGVsZW1lbnRMaXN0LnRvQXJyYXkoKSwgYXR0cmliTGlzdC50b0FycmF5KCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgCi0KLSAgICAgLyoqCi0gICAgICAqICBGYWN0b3J5IGNsYXNzIHRoYXQga2VlcHMgdGhlIHBhcnNlIG1ldGhvZAotICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3Rvcnl7Ci0KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgVGltZSBmcm9tU3RyaW5nKGphdmEubGFuZy5TdHJpbmcgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkpewotICAgICAgICAgICAgICAgICAgICBUaW1lIHJldHVyblZhbHVlID0gbmV3ICBUaW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlLnNldFRpbWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9UaW1lKHZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBUaW1lIGZyb21TdHJpbmcoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBjb250ZW50LnN1YnN0cmluZygwLGNvbnRlbnQuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVXJpID0geG1sU3RyZWFtUmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUaW1lLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LG5hbWVzcGFjZVVyaSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUaW1lLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LCIiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgCi0KLSAgICAgICAgLyoqCi0gICAgICAgICogc3RhdGljIG1ldGhvZCB0byBjcmVhdGUgdGhlIG9iamVjdAotICAgICAgICAqIFByZWNvbmRpdGlvbjogIElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSBjdXJyZW50IG9yIG5leHQgc3RhcnQgZWxlbWVudCBzdGFydHMgdGhpcyBvYmplY3QgYW5kIGFueSBpbnRlcnZlbmluZyByZWFkZXIgZXZlbnRzIGFyZSBpZ25vcmFibGUKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBub3QgYW4gZWxlbWVudCwgaXQgaXMgYSBjb21wbGV4IHR5cGUgYW5kIHRoZSByZWFkZXIgaXMgYXQgdGhlIGV2ZW50IGp1c3QgYWZ0ZXIgdGhlIG91dGVyIHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgKiBQb3N0Y29uZGl0aW9uOiBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgaXRzIGVuZCBlbGVtZW50Ci0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgYSBjb21wbGV4IHR5cGUsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCB0aGUgZW5kIGVsZW1lbnQgb2YgaXRzIG91dGVyIGVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBUaW1lIHBhcnNlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb257Ci0gICAgICAgICAgICBUaW1lIG9iamVjdCA9Ci0gICAgICAgICAgICAgICAgbmV3IFRpbWUoKTsKLQotICAgICAgICAgICAgaW50IGV2ZW50OwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuaWxsYWJsZVZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0iIjsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNldXJpID0iIjsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUgKCFyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAmJiAhcmVhZGVyLmlzRW5kRWxlbWVudCgpKQotICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIikhPW51bGwpewotICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBmdWxsVHlwZU5hbWUgPSByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIik7Ci0gICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1ByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKDAsZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBuc1ByZWZpeD09bnVsbD8iIjpuc1ByZWZpeDsKLQotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHR5cGUgPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikrMSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghInRpbWUiLmVxdWFscyh0eXBlKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZmluZCBuYW1lc3BhY2UgZm9yIHRoZSBwcmVmaXgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1VyaSA9IHJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKG5zUHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChUaW1lKW9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLkV4dGVuc2lvbk1hcHBlci5nZXRUeXBlT2JqZWN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zVXJpLHR5cGUscmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIE5vdGUgYWxsIGF0dHJpYnV0ZXMgdGhhdCB3ZXJlIGhhbmRsZWQuIFVzZWQgdG8gZGlmZmVyIG5vcm1hbCBhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgICAgLy8gZnJvbSBhbnlBdHRyaWJ1dGVzLgotICAgICAgICAgICAgICAgIGphdmEudXRpbC5WZWN0b3IgaGFuZGxlZEF0dHJpYnV0ZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlKCFyZWFkZXIuaXNFbmRFbGVtZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50ID0gcmVhZGVyLmdldEVsZW1lbnRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0VGltZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvVGltZShjb250ZW50KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gRW5kIG9mIGlmIGZvciBleHBlY3RlZCBwcm9wZXJ0eSBzdGFydCBlbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgc3RhcnQgZWxlbWVudCB3ZSBhcmUgbm90IGV4cGVjdGluZyBpbmRpY2F0ZXMgYW4gaW52YWxpZCBwYXJhbWV0ZXIgd2FzIHBhc3NlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiVW5leHBlY3RlZCBzdWJlbGVtZW50ICIgKyByZWFkZXIuZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIGVuZCBvZiB3aGlsZSBsb29wCi0gICAgICAgICAgICAgICAgICAgICAgICAKLQotCi0KLSAgICAgICAgICAgIH0gY2F0Y2ggKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5sYW5nLkV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG9iamVjdDsKLSAgICAgICAgfQotCi0gICAgICAgIH0vL2VuZCBvZiBmYWN0b3J5IGNsYXNzCi0KLSAgICAgICAgCi0KLSAgICAgICAgfQotICAgICAgICAgICAKLSAgICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL1Rva2VuLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL1Rva2VuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2Yzg2NjkuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9Ub2tlbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAzICswLDAgQEAKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBUb2tlbi5qYXZhCi0gKgotICogVGhpcyBmaWxlIHdhcyBhdXRvLWdlbmVyYXRlZCBmcm9tIFdTREwKLSAqIGJ5IHRoZSBBcGFjaGUgQXhpczIgdmVyc2lvbjogU05BUFNIT1QgIEJ1aWx0IG9uIDogRGVjIDIxLCAyMDA3ICgwNDowMzozMCBMS1QpCi0gKi8KLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2Rpbmc7Ci0gICAgICAgICAgICAKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqICBUb2tlbiBiZWFuIGNsYXNzCi0gICAgICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgcHVibGljICBjbGFzcyBUb2tlbgotICAgICAgICBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCQmVhbnsKLSAgICAgICAgLyogVGhpcyB0eXBlIHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgcGllY2Ugb2Ygc2NoZW1hIHRoYXQgaGFkCi0gICAgICAgICAgICAgICAgbmFtZSA9IHRva2VuCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFVSSSA9IGh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFByZWZpeCA9IG5zMQotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdlbmVyYXRlUHJlZml4KGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB7Ci0gICAgICAgICAgICBpZihuYW1lc3BhY2UuZXF1YWxzKCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIpKXsKLSAgICAgICAgICAgICAgICByZXR1cm4gIlNPQVAtRU5DIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBmaWVsZCBmb3IgVG9rZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuVG9rZW4gbG9jYWxUb2tlbiA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgZ2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuVG9rZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuVG9rZW4gZ2V0VG9rZW4oKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxUb2tlbjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIHNldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSBwYXJhbSBUb2tlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0VG9rZW4ob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5Ub2tlbiBwYXJhbSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYWxUb2tlbj1wYXJhbTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsVG9rZW4udG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgIC8qKgotICAgICAqIGlzUmVhZGVyTVRPTUF3YXJlCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSByZWFkZXIgc3VwcG9ydHMgTVRPTQotICAgICAqLwotICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgewotICAgICAgICBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICB0cnl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBqYXZhLmxhbmcuQm9vbGVhbi5UUlVFLmVxdWFscyhyZWFkZXIuZ2V0UHJvcGVydHkob3JnLmFwYWNoZS5heGlvbS5vbS5PTUNvbnN0YW50cy5JU19EQVRBX0hBTkRMRVJTX0FXQVJFKSk7Ci0gICAgICAgIH1jYXRjaChqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlzUmVhZGVyTVRPTUF3YXJlOwotICAgfQotICAgICAKLSAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAqCi0gICAgICAgICogQHBhcmFtIHBhcmVudFFOYW1lCi0gICAgICAgICogQHBhcmFtIGZhY3RvcnkKLSAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgcHVibGljIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IGdldE9NRWxlbWVudCAoCi0gICAgICAgICAgICAgICBmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSkgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZSBkYXRhU291cmNlID0KLSAgICAgICAgICAgICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRGF0YVNvdXJjZSh0aGlzLHBhcmVudFFOYW1lKXsKLQotICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgVG9rZW4udGhpcy5zZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5PTVNvdXJjZWRFbGVtZW50SW1wbCgKLSAgICAgICAgICAgICAgIHBhcmVudFFOYW1lLGZhY3RvcnksZGF0YVNvdXJjZSk7Ci0gICAgICAgICAgICAKLSAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIsZmFsc2UpOwotICAgICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzZXJpYWxpemVUeXBlKQotICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotCi0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UgPSBudWxsOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHBhcmVudFFOYW1lLmdldFByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UgPSBwYXJlbnRRTmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZSAhPSBudWxsKSAmJiAobmFtZXNwYWNlLnRyaW0oKS5sZW5ndGgoKSA+IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHdyaXRlclByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3cml0ZXJQcmVmaXggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChuYW1lc3BhY2UsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHByZWZpeCwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCksIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIGlmIChzZXJpYWxpemVUeXBlKXsKLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIpOwotICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlUHJlZml4ICE9IG51bGwpICYmIChuYW1lc3BhY2VQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkpewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVByZWZpeCsiOnRva2VuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAidG9rZW4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxUb2tlbj09bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgdGhlIG5pbCBhdHRyaWJ1dGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJ0b2tlbiBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbFRva2VuKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBwcmVmaXgsamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICBpZiAoeG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0KLSAgICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0KLSAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLCBqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZU5hbWVzcGFjZSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlVmFsdWU7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gYXR0cmlidXRlUHJlZml4ICsgIjoiICsgcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsIGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIC8qKgotICAgICAgICAgKiAgbWV0aG9kIHRvIGhhbmRsZSBRbmFtZXMKLSAgICAgICAgICovCi0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWUoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMocHJlZml4ICsgIjoiICsgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGkuZSB0aGlzIGlzIHRoZSBkZWZhdWx0IG5hbWVzcGFjZQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZXMoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZVtdIHFuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgaWYgKHFuYW1lcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBzdG9yZSB0aGlzIGRhdGEgdW50aWwgbGFzdCBtb21lbnQgc2luY2UgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHdyaXRlIGFueQotICAgICAgICAgICAgICAgIC8vIG5hbWVzcGFjZSBkYXRhIGFmdGVyIHdyaXRpbmcgdGhlIGNoYXJhY3RvciBkYXRhCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZ0J1ZmZlciBzdHJpbmdUb1dyaXRlID0gbmV3IGphdmEubGFuZy5TdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBxbmFtZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZCgiICIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVVSSSA9IHFuYW1lc1tpXS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHByZWZpeCA9PSBudWxsKSB8fCAocHJlZml4Lmxlbmd0aCgpID09IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQocHJlZml4KS5hcHBlbmQoIjoiKS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhzdHJpbmdUb1dyaXRlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotCi0gICAgICAgICAvKioKLSAgICAgICAgICogUmVnaXN0ZXIgYSBuYW1lc3BhY2UgcHJlZml4Ci0gICAgICAgICAqLwotICAgICAgICAgcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHJlZ2lzdGVyUHJlZml4KGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoeG1sV3JpdGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHByZWZpeDsKLSAgICAgICAgICAgIH0KLQotCi0gIAotICAgICAgICAvKioKLSAgICAgICAgKiBkYXRhYmluZGluZyBtZXRob2QgdG8gZ2V0IGFuIFhNTCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdAotICAgICAgICAqCi0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciBnZXRQdWxsUGFyc2VyKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcU5hbWUpCi0gICAgICAgICAgICAgICAgICAgIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGVsZW1lbnRMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBhdHRyaWJMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXIuRUxFTUVOVF9URVhUKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbFRva2VuICE9IG51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbFRva2VuKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oInRva2VuIGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVySW1wbChxTmFtZSwgZWxlbWVudExpc3QudG9BcnJheSgpLCBhdHRyaWJMaXN0LnRvQXJyYXkoKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAKLQotICAgICAvKioKLSAgICAgICogIEZhY3RvcnkgY2xhc3MgdGhhdCBrZWVwcyB0aGUgcGFyc2UgbWV0aG9kCi0gICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeXsKLQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBUb2tlbiBmcm9tU3RyaW5nKGphdmEubGFuZy5TdHJpbmcgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkpewotICAgICAgICAgICAgICAgICAgICBUb2tlbiByZXR1cm5WYWx1ZSA9IG5ldyAgVG9rZW4oKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUuc2V0VG9rZW4oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9Ub2tlbih2YWx1ZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgVG9rZW4gZnJvbVN0cmluZyhqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudC5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IGNvbnRlbnQuc3Vic3RyaW5nKDAsY29udGVudC5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVcmkgPSB4bWxTdHJlYW1SZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRva2VuLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LG5hbWVzcGFjZVVyaSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUb2tlbi5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCwiIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIAotCi0gICAgICAgIC8qKgotICAgICAgICAqIHN0YXRpYyBtZXRob2QgdG8gY3JlYXRlIHRoZSBvYmplY3QKLSAgICAgICAgKiBQcmVjb25kaXRpb246ICBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgY3VycmVudCBvciBuZXh0IHN0YXJ0IGVsZW1lbnQgc3RhcnRzIHRoaXMgb2JqZWN0IGFuZCBhbnkgaW50ZXJ2ZW5pbmcgcmVhZGVyIGV2ZW50cyBhcmUgaWdub3JhYmxlCi0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgbm90IGFuIGVsZW1lbnQsIGl0IGlzIGEgY29tcGxleCB0eXBlIGFuZCB0aGUgcmVhZGVyIGlzIGF0IHRoZSBldmVudCBqdXN0IGFmdGVyIHRoZSBvdXRlciBzdGFydCBlbGVtZW50Ci0gICAgICAgICogUG9zdGNvbmRpdGlvbjogSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IGl0cyBlbmQgZWxlbWVudAotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIGEgY29tcGxleCB0eXBlLCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgdGhlIGVuZCBlbGVtZW50IG9mIGl0cyBvdXRlciBlbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgVG9rZW4gcGFyc2UoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIFRva2VuIG9iamVjdCA9Ci0gICAgICAgICAgICAgICAgbmV3IFRva2VuKCk7Ci0KLSAgICAgICAgICAgIGludCBldmVudDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmlsbGFibGVWYWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IiI7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZXVyaSA9IiI7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlICghcmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgJiYgIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkKLSAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIpIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgZnVsbFR5cGVOYW1lID0gcmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAidHlwZSIpOwotICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNQcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZygwLGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gbnNQcmVmaXg9PW51bGw/IiI6bnNQcmVmaXg7Ci0KLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB0eXBlID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZyhmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKzEpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISJ0b2tlbiIuZXF1YWxzKHR5cGUpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9maW5kIG5hbWVzcGFjZSBmb3IgdGhlIHByZWZpeAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zVXJpID0gcmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkobnNQcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFRva2VuKW9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLkV4dGVuc2lvbk1hcHBlci5nZXRUeXBlT2JqZWN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zVXJpLHR5cGUscmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIE5vdGUgYWxsIGF0dHJpYnV0ZXMgdGhhdCB3ZXJlIGhhbmRsZWQuIFVzZWQgdG8gZGlmZmVyIG5vcm1hbCBhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgICAgLy8gZnJvbSBhbnlBdHRyaWJ1dGVzLgotICAgICAgICAgICAgICAgIGphdmEudXRpbC5WZWN0b3IgaGFuZGxlZEF0dHJpYnV0ZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlKCFyZWFkZXIuaXNFbmRFbGVtZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50ID0gcmVhZGVyLmdldEVsZW1lbnRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0VG9rZW4oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1Rva2VuKGNvbnRlbnQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBFbmQgb2YgaWYgZm9yIGV4cGVjdGVkIHByb3BlcnR5IHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2V7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBzdGFydCBlbGVtZW50IHdlIGFyZSBub3QgZXhwZWN0aW5nIGluZGljYXRlcyBhbiBpbnZhbGlkIHBhcmFtZXRlciB3YXMgcGFzc2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJVbmV4cGVjdGVkIHN1YmVsZW1lbnQgIiArIHJlYWRlci5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gZW5kIG9mIHdoaWxlIGxvb3AKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0KLQotICAgICAgICAgICAgfSBjYXRjaCAoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gb2JqZWN0OwotICAgICAgICB9Ci0KLSAgICAgICAgfS8vZW5kIG9mIGZhY3RvcnkgY2xhc3MKLQotICAgICAgICAKLQotICAgICAgICB9Ci0gICAgICAgICAgIAotICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvVW5zaWduZWRCeXRlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL1Vuc2lnbmVkQnl0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOWYwNzA2Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvVW5zaWduZWRCeXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDMgKzAsMCBAQAotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIFVuc2lnbmVkQnl0ZS5qYXZhCi0gKgotICogVGhpcyBmaWxlIHdhcyBhdXRvLWdlbmVyYXRlZCBmcm9tIFdTREwKLSAqIGJ5IHRoZSBBcGFjaGUgQXhpczIgdmVyc2lvbjogU05BUFNIT1QgIEJ1aWx0IG9uIDogRGVjIDIxLCAyMDA3ICgwNDowMzozMCBMS1QpCi0gKi8KLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2Rpbmc7Ci0gICAgICAgICAgICAKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqICBVbnNpZ25lZEJ5dGUgYmVhbiBjbGFzcwotICAgICAgICAgICAgKi8KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyAgY2xhc3MgVW5zaWduZWRCeXRlCi0gICAgICAgIGltcGxlbWVudHMgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJCZWFuewotICAgICAgICAvKiBUaGlzIHR5cGUgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBwaWVjZSBvZiBzY2hlbWEgdGhhdCBoYWQKLSAgICAgICAgICAgICAgICBuYW1lID0gdW5zaWduZWRCeXRlCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFVSSSA9IGh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFByZWZpeCA9IG5zMQotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdlbmVyYXRlUHJlZml4KGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB7Ci0gICAgICAgICAgICBpZihuYW1lc3BhY2UuZXF1YWxzKCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIpKXsKLSAgICAgICAgICAgICAgICByZXR1cm4gIlNPQVAtRU5DIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBmaWVsZCBmb3IgVW5zaWduZWRCeXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLlVuc2lnbmVkQnl0ZSBsb2NhbFVuc2lnbmVkQnl0ZSA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgZ2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuVW5zaWduZWRCeXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLlVuc2lnbmVkQnl0ZSBnZXRVbnNpZ25lZEJ5dGUoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxVbnNpZ25lZEJ5dGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBzZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gcGFyYW0gVW5zaWduZWRCeXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRVbnNpZ25lZEJ5dGUob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5VbnNpZ25lZEJ5dGUgcGFyYW0pewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2FsVW5zaWduZWRCeXRlPXBhcmFtOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxVbnNpZ25lZEJ5dGUudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgIC8qKgotICAgICAqIGlzUmVhZGVyTVRPTUF3YXJlCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSByZWFkZXIgc3VwcG9ydHMgTVRPTQotICAgICAqLwotICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgewotICAgICAgICBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICB0cnl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBqYXZhLmxhbmcuQm9vbGVhbi5UUlVFLmVxdWFscyhyZWFkZXIuZ2V0UHJvcGVydHkob3JnLmFwYWNoZS5heGlvbS5vbS5PTUNvbnN0YW50cy5JU19EQVRBX0hBTkRMRVJTX0FXQVJFKSk7Ci0gICAgICAgIH1jYXRjaChqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlzUmVhZGVyTVRPTUF3YXJlOwotICAgfQotICAgICAKLSAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAqCi0gICAgICAgICogQHBhcmFtIHBhcmVudFFOYW1lCi0gICAgICAgICogQHBhcmFtIGZhY3RvcnkKLSAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgcHVibGljIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IGdldE9NRWxlbWVudCAoCi0gICAgICAgICAgICAgICBmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSkgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZSBkYXRhU291cmNlID0KLSAgICAgICAgICAgICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRGF0YVNvdXJjZSh0aGlzLHBhcmVudFFOYW1lKXsKLQotICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgVW5zaWduZWRCeXRlLnRoaXMuc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmxsb20uT01Tb3VyY2VkRWxlbWVudEltcGwoCi0gICAgICAgICAgICAgICBwYXJlbnRRTmFtZSxmYWN0b3J5LGRhdGFTb3VyY2UpOwotICAgICAgICAgICAgCi0gICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyLGZhbHNlKTsKLSAgICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VyaWFsaXplVHlwZSkKLSAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLQotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBwYXJlbnRRTmFtZS5nZXRQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlID0gcGFyZW50UU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2UgIT0gbnVsbCkgJiYgKG5hbWVzcGFjZS50cmltKCkubGVuZ3RoKCkgPiAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB3cml0ZXJQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAod3JpdGVyUHJlZml4ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQobmFtZXNwYWNlLCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwcmVmaXgsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICBpZiAoc2VyaWFsaXplVHlwZSl7Ci0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iKTsKLSAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZVByZWZpeCAhPSBudWxsKSAmJiAobmFtZXNwYWNlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApKXsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VQcmVmaXgrIjp1bnNpZ25lZEJ5dGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bnNpZ25lZEJ5dGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxVbnNpZ25lZEJ5dGU9PW51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIHRoZSBuaWwgYXR0cmlidXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigidW5zaWduZWRCeXRlIGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsVW5zaWduZWRCeXRlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBwcmVmaXgsamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICBpZiAoeG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0KLSAgICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0KLSAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLCBqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZU5hbWVzcGFjZSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlVmFsdWU7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gYXR0cmlidXRlUHJlZml4ICsgIjoiICsgcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsIGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIC8qKgotICAgICAgICAgKiAgbWV0aG9kIHRvIGhhbmRsZSBRbmFtZXMKLSAgICAgICAgICovCi0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWUoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMocHJlZml4ICsgIjoiICsgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGkuZSB0aGlzIGlzIHRoZSBkZWZhdWx0IG5hbWVzcGFjZQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZXMoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZVtdIHFuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgaWYgKHFuYW1lcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBzdG9yZSB0aGlzIGRhdGEgdW50aWwgbGFzdCBtb21lbnQgc2luY2UgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHdyaXRlIGFueQotICAgICAgICAgICAgICAgIC8vIG5hbWVzcGFjZSBkYXRhIGFmdGVyIHdyaXRpbmcgdGhlIGNoYXJhY3RvciBkYXRhCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZ0J1ZmZlciBzdHJpbmdUb1dyaXRlID0gbmV3IGphdmEubGFuZy5TdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBxbmFtZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZCgiICIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVVSSSA9IHFuYW1lc1tpXS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHByZWZpeCA9PSBudWxsKSB8fCAocHJlZml4Lmxlbmd0aCgpID09IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQocHJlZml4KS5hcHBlbmQoIjoiKS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhzdHJpbmdUb1dyaXRlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotCi0gICAgICAgICAvKioKLSAgICAgICAgICogUmVnaXN0ZXIgYSBuYW1lc3BhY2UgcHJlZml4Ci0gICAgICAgICAqLwotICAgICAgICAgcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHJlZ2lzdGVyUHJlZml4KGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoeG1sV3JpdGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHByZWZpeDsKLSAgICAgICAgICAgIH0KLQotCi0gIAotICAgICAgICAvKioKLSAgICAgICAgKiBkYXRhYmluZGluZyBtZXRob2QgdG8gZ2V0IGFuIFhNTCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdAotICAgICAgICAqCi0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciBnZXRQdWxsUGFyc2VyKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcU5hbWUpCi0gICAgICAgICAgICAgICAgICAgIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGVsZW1lbnRMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBhdHRyaWJMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXIuRUxFTUVOVF9URVhUKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbFVuc2lnbmVkQnl0ZSAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxVbnNpZ25lZEJ5dGUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigidW5zaWduZWRCeXRlIGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVySW1wbChxTmFtZSwgZWxlbWVudExpc3QudG9BcnJheSgpLCBhdHRyaWJMaXN0LnRvQXJyYXkoKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAKLQotICAgICAvKioKLSAgICAgICogIEZhY3RvcnkgY2xhc3MgdGhhdCBrZWVwcyB0aGUgcGFyc2UgbWV0aG9kCi0gICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeXsKLQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBVbnNpZ25lZEJ5dGUgZnJvbVN0cmluZyhqYXZhLmxhbmcuU3RyaW5nIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJKXsKLSAgICAgICAgICAgICAgICAgICAgVW5zaWduZWRCeXRlIHJldHVyblZhbHVlID0gbmV3ICBVbnNpZ25lZEJ5dGUoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUuc2V0VW5zaWduZWRCeXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvVW5zaWduZWRCeXRlKHZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBVbnNpZ25lZEJ5dGUgZnJvbVN0cmluZyhqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudC5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IGNvbnRlbnQuc3Vic3RyaW5nKDAsY29udGVudC5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVcmkgPSB4bWxTdHJlYW1SZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFVuc2lnbmVkQnl0ZS5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCxuYW1lc3BhY2VVcmkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVW5zaWduZWRCeXRlLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LCIiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgCi0KLSAgICAgICAgLyoqCi0gICAgICAgICogc3RhdGljIG1ldGhvZCB0byBjcmVhdGUgdGhlIG9iamVjdAotICAgICAgICAqIFByZWNvbmRpdGlvbjogIElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSBjdXJyZW50IG9yIG5leHQgc3RhcnQgZWxlbWVudCBzdGFydHMgdGhpcyBvYmplY3QgYW5kIGFueSBpbnRlcnZlbmluZyByZWFkZXIgZXZlbnRzIGFyZSBpZ25vcmFibGUKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBub3QgYW4gZWxlbWVudCwgaXQgaXMgYSBjb21wbGV4IHR5cGUgYW5kIHRoZSByZWFkZXIgaXMgYXQgdGhlIGV2ZW50IGp1c3QgYWZ0ZXIgdGhlIG91dGVyIHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgKiBQb3N0Y29uZGl0aW9uOiBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgaXRzIGVuZCBlbGVtZW50Ci0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgYSBjb21wbGV4IHR5cGUsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCB0aGUgZW5kIGVsZW1lbnQgb2YgaXRzIG91dGVyIGVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBVbnNpZ25lZEJ5dGUgcGFyc2UoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIFVuc2lnbmVkQnl0ZSBvYmplY3QgPQotICAgICAgICAgICAgICAgIG5ldyBVbnNpZ25lZEJ5dGUoKTsKLQotICAgICAgICAgICAgaW50IGV2ZW50OwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuaWxsYWJsZVZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0iIjsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNldXJpID0iIjsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUgKCFyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAmJiAhcmVhZGVyLmlzRW5kRWxlbWVudCgpKQotICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIikhPW51bGwpewotICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBmdWxsVHlwZU5hbWUgPSByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIik7Ci0gICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1ByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKDAsZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBuc1ByZWZpeD09bnVsbD8iIjpuc1ByZWZpeDsKLQotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHR5cGUgPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikrMSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghInVuc2lnbmVkQnl0ZSIuZXF1YWxzKHR5cGUpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9maW5kIG5hbWVzcGFjZSBmb3IgdGhlIHByZWZpeAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zVXJpID0gcmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkobnNQcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFVuc2lnbmVkQnl0ZSlvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZy5FeHRlbnNpb25NYXBwZXIuZ2V0VHlwZU9iamVjdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc1VyaSx0eXBlLHJlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBOb3RlIGFsbCBhdHRyaWJ1dGVzIHRoYXQgd2VyZSBoYW5kbGVkLiBVc2VkIHRvIGRpZmZlciBub3JtYWwgYXR0cmlidXRlcwotICAgICAgICAgICAgICAgIC8vIGZyb20gYW55QXR0cmlidXRlcy4KLSAgICAgICAgICAgICAgICBqYXZhLnV0aWwuVmVjdG9yIGhhbmRsZWRBdHRyaWJ1dGVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSghcmVhZGVyLmlzRW5kRWxlbWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCA9IHJlYWRlci5nZXRFbGVtZW50VGV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldFVuc2lnbmVkQnl0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvVW5zaWduZWRCeXRlKGNvbnRlbnQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBFbmQgb2YgaWYgZm9yIGV4cGVjdGVkIHByb3BlcnR5IHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2V7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBzdGFydCBlbGVtZW50IHdlIGFyZSBub3QgZXhwZWN0aW5nIGluZGljYXRlcyBhbiBpbnZhbGlkIHBhcmFtZXRlciB3YXMgcGFzc2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJVbmV4cGVjdGVkIHN1YmVsZW1lbnQgIiArIHJlYWRlci5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gZW5kIG9mIHdoaWxlIGxvb3AKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0KLQotICAgICAgICAgICAgfSBjYXRjaCAoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gb2JqZWN0OwotICAgICAgICB9Ci0KLSAgICAgICAgfS8vZW5kIG9mIGZhY3RvcnkgY2xhc3MKLQotICAgICAgICAKLQotICAgICAgICB9Ci0gICAgICAgICAgIAotICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvVW5zaWduZWRJbnQuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvVW5zaWduZWRJbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjcyZTdmYy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL1Vuc2lnbmVkSW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDMgKzAsMCBAQAotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIFVuc2lnbmVkSW50LmphdmEKLSAqCi0gKiBUaGlzIGZpbGUgd2FzIGF1dG8tZ2VuZXJhdGVkIGZyb20gV1NETAotICogYnkgdGhlIEFwYWNoZSBBeGlzMiB2ZXJzaW9uOiBTTkFQU0hPVCAgQnVpbHQgb24gOiBEZWMgMjEsIDIwMDcgKDA0OjAzOjMwIExLVCkKLSAqLwotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZzsKLSAgICAgICAgICAgIAotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogIFVuc2lnbmVkSW50IGJlYW4gY2xhc3MKLSAgICAgICAgICAgICovCi0gICAgICAgIAotICAgICAgICBwdWJsaWMgIGNsYXNzIFVuc2lnbmVkSW50Ci0gICAgICAgIGltcGxlbWVudHMgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJCZWFuewotICAgICAgICAvKiBUaGlzIHR5cGUgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBwaWVjZSBvZiBzY2hlbWEgdGhhdCBoYWQKLSAgICAgICAgICAgICAgICBuYW1lID0gdW5zaWduZWRJbnQKLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgVVJJID0gaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8KLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgUHJlZml4ID0gbnMxCi0gICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIAotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2VuZXJhdGVQcmVmaXgoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHsKLSAgICAgICAgICAgIGlmKG5hbWVzcGFjZS5lcXVhbHMoImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIikpewotICAgICAgICAgICAgICAgIHJldHVybiAiU09BUC1FTkMiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgIH0KLQotICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIGZpZWxkIGZvciBVbnNpZ25lZEludAotICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5VbnNpZ25lZEludCBsb2NhbFVuc2lnbmVkSW50IDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBnZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5VbnNpZ25lZEludAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5VbnNpZ25lZEludCBnZXRVbnNpZ25lZEludCgpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbFVuc2lnbmVkSW50OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgc2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtIHBhcmFtIFVuc2lnbmVkSW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRVbnNpZ25lZEludChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLlVuc2lnbmVkSW50IHBhcmFtKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2NhbFVuc2lnbmVkSW50PXBhcmFtOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxVbnNpZ25lZEludC50b1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgLyoqCi0gICAgICogaXNSZWFkZXJNVE9NQXdhcmUKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlYWRlciBzdXBwb3J0cyBNVE9NCi0gICAgICovCi0gICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIHRyeXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGphdmEubGFuZy5Cb29sZWFuLlRSVUUuZXF1YWxzKHJlYWRlci5nZXRQcm9wZXJ0eShvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQ29uc3RhbnRzLklTX0RBVEFfSEFORExFUlNfQVdBUkUpKTsKLSAgICAgICAgfWNhdGNoKGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXNSZWFkZXJNVE9NQXdhcmU7Ci0gICB9Ci0gICAgIAotICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICoKLSAgICAgICAgKiBAcGFyYW0gcGFyZW50UU5hbWUKLSAgICAgICAgKiBAcGFyYW0gZmFjdG9yeQotICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICBwdWJsaWMgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgZ2V0T01FbGVtZW50ICgKLSAgICAgICAgICAgICAgIGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5KSB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlIGRhdGFTb3VyY2UgPQotICAgICAgICAgICAgICAgICAgICAgICBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJEYXRhU291cmNlKHRoaXMscGFyZW50UU5hbWUpewotCi0gICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICBVbnNpZ25lZEludC50aGlzLnNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5sbG9tLk9NU291cmNlZEVsZW1lbnRJbXBsKAotICAgICAgICAgICAgICAgcGFyZW50UU5hbWUsZmFjdG9yeSxkYXRhU291cmNlKTsKLSAgICAgICAgICAgIAotICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcixmYWxzZSk7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNlcmlhbGl6ZVR5cGUpCi0gICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgCi0KLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gcGFyZW50UU5hbWUuZ2V0UHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZSA9IHBhcmVudFFOYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlICE9IG51bGwpICYmIChuYW1lc3BhY2UudHJpbSgpLmxlbmd0aCgpID4gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgd3JpdGVyUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdyaXRlclByZWZpeCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KG5hbWVzcGFjZSwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocHJlZml4LCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgaWYgKHNlcmlhbGl6ZVR5cGUpewotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIik7Ci0gICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2VQcmVmaXggIT0gbnVsbCkgJiYgKG5hbWVzcGFjZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlUHJlZml4KyI6dW5zaWduZWRJbnQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bnNpZ25lZEludCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbFVuc2lnbmVkSW50PT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZSB0aGUgbmlsIGF0dHJpYnV0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oInVuc2lnbmVkSW50IGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsVW5zaWduZWRJbnQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRoIHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCxqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgIGlmICh4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLQotICAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsIGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlTmFtZXNwYWNlID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVWYWx1ZTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBhdHRyaWJ1dGVQcmVmaXggKyAiOiIgKyBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSwgYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICBtZXRob2QgdG8gaGFuZGxlIFFuYW1lcwotICAgICAgICAgKi8KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZShqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhwcmVmaXggKyAiOiIgKyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaS5lIHRoaXMgaXMgdGhlIGRlZmF1bHQgbmFtZXNwYWNlCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lcyhqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lW10gcW5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICBpZiAocW5hbWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHRvIHN0b3JlIHRoaXMgZGF0YSB1bnRpbCBsYXN0IG1vbWVudCBzaW5jZSBpdCBpcyBub3QgcG9zc2libGUgdG8gd3JpdGUgYW55Ci0gICAgICAgICAgICAgICAgLy8gbmFtZXNwYWNlIGRhdGEgYWZ0ZXIgd3JpdGluZyB0aGUgY2hhcmFjdG9yIGRhdGEKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIHN0cmluZ1RvV3JpdGUgPSBuZXcgamF2YS5sYW5nLlN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHFuYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKCIgIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlVVJJID0gcW5hbWVzW2ldLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocHJlZml4ID09IG51bGwpIHx8IChwcmVmaXgubGVuZ3RoKCkgPT0gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChwcmVmaXgpLmFwcGVuZCgiOiIpLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHN0cmluZ1RvV3JpdGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0KLSAgICAgICAgIC8qKgotICAgICAgICAgKiBSZWdpc3RlciBhIG5hbWVzcGFjZSBwcmVmaXgKLSAgICAgICAgICovCi0gICAgICAgICBwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgcmVnaXN0ZXJQcmVmaXgoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLCBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlICh4bWxXcml0ZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gcHJlZml4OwotICAgICAgICAgICAgfQotCi0KLSAgCi0gICAgICAgIC8qKgotICAgICAgICAqIGRhdGFiaW5kaW5nIG1ldGhvZCB0byBnZXQgYW4gWE1MIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0Ci0gICAgICAgICoKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIGdldFB1bGxQYXJzZXIoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxTmFtZSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgZWxlbWVudExpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGF0dHJpYkxpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlci5FTEVNRU5UX1RFWFQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsVW5zaWduZWRJbnQgIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsVW5zaWduZWRJbnQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigidW5zaWduZWRJbnQgY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXJJbXBsKHFOYW1lLCBlbGVtZW50TGlzdC50b0FycmF5KCksIGF0dHJpYkxpc3QudG9BcnJheSgpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gIAotCi0gICAgIC8qKgotICAgICAgKiAgRmFjdG9yeSBjbGFzcyB0aGF0IGtlZXBzIHRoZSBwYXJzZSBtZXRob2QKLSAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5ewotCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIFVuc2lnbmVkSW50IGZyb21TdHJpbmcoamF2YS5sYW5nLlN0cmluZyB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSl7Ci0gICAgICAgICAgICAgICAgICAgIFVuc2lnbmVkSW50IHJldHVyblZhbHVlID0gbmV3ICBVbnNpZ25lZEludCgpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZS5zZXRVbnNpZ25lZEludCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1Vuc2lnbmVkSW50KHZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBVbnNpZ25lZEludCBmcm9tU3RyaW5nKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50LmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gY29udGVudC5zdWJzdHJpbmcoMCxjb250ZW50LmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVyaSA9IHhtbFN0cmVhbVJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVW5zaWduZWRJbnQuRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsbmFtZXNwYWNlVXJpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFVuc2lnbmVkSW50LkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LCIiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgCi0KLSAgICAgICAgLyoqCi0gICAgICAgICogc3RhdGljIG1ldGhvZCB0byBjcmVhdGUgdGhlIG9iamVjdAotICAgICAgICAqIFByZWNvbmRpdGlvbjogIElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSBjdXJyZW50IG9yIG5leHQgc3RhcnQgZWxlbWVudCBzdGFydHMgdGhpcyBvYmplY3QgYW5kIGFueSBpbnRlcnZlbmluZyByZWFkZXIgZXZlbnRzIGFyZSBpZ25vcmFibGUKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBub3QgYW4gZWxlbWVudCwgaXQgaXMgYSBjb21wbGV4IHR5cGUgYW5kIHRoZSByZWFkZXIgaXMgYXQgdGhlIGV2ZW50IGp1c3QgYWZ0ZXIgdGhlIG91dGVyIHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgKiBQb3N0Y29uZGl0aW9uOiBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgaXRzIGVuZCBlbGVtZW50Ci0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgYSBjb21wbGV4IHR5cGUsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCB0aGUgZW5kIGVsZW1lbnQgb2YgaXRzIG91dGVyIGVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBVbnNpZ25lZEludCBwYXJzZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uewotICAgICAgICAgICAgVW5zaWduZWRJbnQgb2JqZWN0ID0KLSAgICAgICAgICAgICAgICBuZXcgVW5zaWduZWRJbnQoKTsKLQotICAgICAgICAgICAgaW50IGV2ZW50OwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuaWxsYWJsZVZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0iIjsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNldXJpID0iIjsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUgKCFyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAmJiAhcmVhZGVyLmlzRW5kRWxlbWVudCgpKQotICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIikhPW51bGwpewotICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBmdWxsVHlwZU5hbWUgPSByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIik7Ci0gICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1ByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKDAsZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBuc1ByZWZpeD09bnVsbD8iIjpuc1ByZWZpeDsKLQotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHR5cGUgPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikrMSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghInVuc2lnbmVkSW50Ii5lcXVhbHModHlwZSkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2ZpbmQgbmFtZXNwYWNlIGZvciB0aGUgcHJlZml4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNVcmkgPSByZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShuc1ByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoVW5zaWduZWRJbnQpb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2RpbmcuRXh0ZW5zaW9uTWFwcGVyLmdldFR5cGVPYmplY3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNVcmksdHlwZSxyZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gTm90ZSBhbGwgYXR0cmlidXRlcyB0aGF0IHdlcmUgaGFuZGxlZC4gVXNlZCB0byBkaWZmZXIgbm9ybWFsIGF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgICAvLyBmcm9tIGFueUF0dHJpYnV0ZXMuCi0gICAgICAgICAgICAgICAgamF2YS51dGlsLlZlY3RvciBoYW5kbGVkQXR0cmlidXRlcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUoIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQgPSByZWFkZXIuZ2V0RWxlbWVudFRleHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5zZXRVbnNpZ25lZEludCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvVW5zaWduZWRJbnQoY29udGVudCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIEVuZCBvZiBpZiBmb3IgZXhwZWN0ZWQgcHJvcGVydHkgc3RhcnQgZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHN0YXJ0IGVsZW1lbnQgd2UgYXJlIG5vdCBleHBlY3RpbmcgaW5kaWNhdGVzIGFuIGludmFsaWQgcGFyYW1ldGVyIHdhcyBwYXNzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIlVuZXhwZWN0ZWQgc3ViZWxlbWVudCAiICsgcmVhZGVyLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBlbmQgb2Ygd2hpbGUgbG9vcAotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLQotCi0gICAgICAgICAgICB9IGNhdGNoIChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEubGFuZy5FeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBvYmplY3Q7Ci0gICAgICAgIH0KLQotICAgICAgICB9Ly9lbmQgb2YgZmFjdG9yeSBjbGFzcwotCi0gICAgICAgIAotCi0gICAgICAgIH0KLSAgICAgICAgICAgCi0gICAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9VbnNpZ25lZExvbmcuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvVW5zaWduZWRMb25nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiYTcwY2UuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9VbnNpZ25lZExvbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwMyArMCwwIEBACi0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICogVW5zaWduZWRMb25nLmphdmEKLSAqCi0gKiBUaGlzIGZpbGUgd2FzIGF1dG8tZ2VuZXJhdGVkIGZyb20gV1NETAotICogYnkgdGhlIEFwYWNoZSBBeGlzMiB2ZXJzaW9uOiBTTkFQU0hPVCAgQnVpbHQgb24gOiBEZWMgMjEsIDIwMDcgKDA0OjAzOjMwIExLVCkKLSAqLwotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZzsKLSAgICAgICAgICAgIAotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogIFVuc2lnbmVkTG9uZyBiZWFuIGNsYXNzCi0gICAgICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgcHVibGljICBjbGFzcyBVbnNpZ25lZExvbmcKLSAgICAgICAgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkJlYW57Ci0gICAgICAgIC8qIFRoaXMgdHlwZSB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIHBpZWNlIG9mIHNjaGVtYSB0aGF0IGhhZAotICAgICAgICAgICAgICAgIG5hbWUgPSB1bnNpZ25lZExvbmcKLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgVVJJID0gaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8KLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgUHJlZml4ID0gbnMxCi0gICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIAotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2VuZXJhdGVQcmVmaXgoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHsKLSAgICAgICAgICAgIGlmKG5hbWVzcGFjZS5lcXVhbHMoImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIikpewotICAgICAgICAgICAgICAgIHJldHVybiAiU09BUC1FTkMiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgIH0KLQotICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIGZpZWxkIGZvciBVbnNpZ25lZExvbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuVW5zaWduZWRMb25nIGxvY2FsVW5zaWduZWRMb25nIDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBnZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5VbnNpZ25lZExvbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuVW5zaWduZWRMb25nIGdldFVuc2lnbmVkTG9uZygpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbFVuc2lnbmVkTG9uZzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIHNldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSBwYXJhbSBVbnNpZ25lZExvbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldFVuc2lnbmVkTG9uZyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLlVuc2lnbmVkTG9uZyBwYXJhbSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYWxVbnNpZ25lZExvbmc9cGFyYW07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbFVuc2lnbmVkTG9uZy50b1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgLyoqCi0gICAgICogaXNSZWFkZXJNVE9NQXdhcmUKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlYWRlciBzdXBwb3J0cyBNVE9NCi0gICAgICovCi0gICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIHRyeXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGphdmEubGFuZy5Cb29sZWFuLlRSVUUuZXF1YWxzKHJlYWRlci5nZXRQcm9wZXJ0eShvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQ29uc3RhbnRzLklTX0RBVEFfSEFORExFUlNfQVdBUkUpKTsKLSAgICAgICAgfWNhdGNoKGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXNSZWFkZXJNVE9NQXdhcmU7Ci0gICB9Ci0gICAgIAotICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICoKLSAgICAgICAgKiBAcGFyYW0gcGFyZW50UU5hbWUKLSAgICAgICAgKiBAcGFyYW0gZmFjdG9yeQotICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICBwdWJsaWMgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgZ2V0T01FbGVtZW50ICgKLSAgICAgICAgICAgICAgIGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5KSB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlIGRhdGFTb3VyY2UgPQotICAgICAgICAgICAgICAgICAgICAgICBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJEYXRhU291cmNlKHRoaXMscGFyZW50UU5hbWUpewotCi0gICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICBVbnNpZ25lZExvbmcudGhpcy5zZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5PTVNvdXJjZWRFbGVtZW50SW1wbCgKLSAgICAgICAgICAgICAgIHBhcmVudFFOYW1lLGZhY3RvcnksZGF0YVNvdXJjZSk7Ci0gICAgICAgICAgICAKLSAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIsZmFsc2UpOwotICAgICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzZXJpYWxpemVUeXBlKQotICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotCi0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UgPSBudWxsOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHBhcmVudFFOYW1lLmdldFByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UgPSBwYXJlbnRRTmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZSAhPSBudWxsKSAmJiAobmFtZXNwYWNlLnRyaW0oKS5sZW5ndGgoKSA+IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHdyaXRlclByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3cml0ZXJQcmVmaXggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChuYW1lc3BhY2UsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHByZWZpeCwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCksIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIGlmIChzZXJpYWxpemVUeXBlKXsKLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIpOwotICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlUHJlZml4ICE9IG51bGwpICYmIChuYW1lc3BhY2VQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkpewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVByZWZpeCsiOnVuc2lnbmVkTG9uZyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgInVuc2lnbmVkTG9uZyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbFVuc2lnbmVkTG9uZz09bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgdGhlIG5pbCBhdHRyaWJ1dGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJ1bnNpZ25lZExvbmcgY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxVbnNpZ25lZExvbmcpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRoIHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCxqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgIGlmICh4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLQotICAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsIGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlTmFtZXNwYWNlID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVWYWx1ZTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBhdHRyaWJ1dGVQcmVmaXggKyAiOiIgKyBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSwgYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICBtZXRob2QgdG8gaGFuZGxlIFFuYW1lcwotICAgICAgICAgKi8KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZShqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhwcmVmaXggKyAiOiIgKyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaS5lIHRoaXMgaXMgdGhlIGRlZmF1bHQgbmFtZXNwYWNlCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lcyhqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lW10gcW5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICBpZiAocW5hbWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHRvIHN0b3JlIHRoaXMgZGF0YSB1bnRpbCBsYXN0IG1vbWVudCBzaW5jZSBpdCBpcyBub3QgcG9zc2libGUgdG8gd3JpdGUgYW55Ci0gICAgICAgICAgICAgICAgLy8gbmFtZXNwYWNlIGRhdGEgYWZ0ZXIgd3JpdGluZyB0aGUgY2hhcmFjdG9yIGRhdGEKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIHN0cmluZ1RvV3JpdGUgPSBuZXcgamF2YS5sYW5nLlN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHFuYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKCIgIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlVVJJID0gcW5hbWVzW2ldLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocHJlZml4ID09IG51bGwpIHx8IChwcmVmaXgubGVuZ3RoKCkgPT0gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChwcmVmaXgpLmFwcGVuZCgiOiIpLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHN0cmluZ1RvV3JpdGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0KLSAgICAgICAgIC8qKgotICAgICAgICAgKiBSZWdpc3RlciBhIG5hbWVzcGFjZSBwcmVmaXgKLSAgICAgICAgICovCi0gICAgICAgICBwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgcmVnaXN0ZXJQcmVmaXgoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLCBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlICh4bWxXcml0ZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gcHJlZml4OwotICAgICAgICAgICAgfQotCi0KLSAgCi0gICAgICAgIC8qKgotICAgICAgICAqIGRhdGFiaW5kaW5nIG1ldGhvZCB0byBnZXQgYW4gWE1MIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0Ci0gICAgICAgICoKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIGdldFB1bGxQYXJzZXIoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxTmFtZSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgZWxlbWVudExpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGF0dHJpYkxpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlci5FTEVNRU5UX1RFWFQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsVW5zaWduZWRMb25nICE9IG51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbFVuc2lnbmVkTG9uZykpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJ1bnNpZ25lZExvbmcgY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXJJbXBsKHFOYW1lLCBlbGVtZW50TGlzdC50b0FycmF5KCksIGF0dHJpYkxpc3QudG9BcnJheSgpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gIAotCi0gICAgIC8qKgotICAgICAgKiAgRmFjdG9yeSBjbGFzcyB0aGF0IGtlZXBzIHRoZSBwYXJzZSBtZXRob2QKLSAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5ewotCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIFVuc2lnbmVkTG9uZyBmcm9tU3RyaW5nKGphdmEubGFuZy5TdHJpbmcgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkpewotICAgICAgICAgICAgICAgICAgICBVbnNpZ25lZExvbmcgcmV0dXJuVmFsdWUgPSBuZXcgIFVuc2lnbmVkTG9uZygpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZS5zZXRVbnNpZ25lZExvbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9VbnNpZ25lZExvbmcodmFsdWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIFVuc2lnbmVkTG9uZyBmcm9tU3RyaW5nKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50LmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gY29udGVudC5zdWJzdHJpbmcoMCxjb250ZW50LmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVyaSA9IHhtbFN0cmVhbVJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVW5zaWduZWRMb25nLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LG5hbWVzcGFjZVVyaSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBVbnNpZ25lZExvbmcuRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsIiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAKLQotICAgICAgICAvKioKLSAgICAgICAgKiBzdGF0aWMgbWV0aG9kIHRvIGNyZWF0ZSB0aGUgb2JqZWN0Ci0gICAgICAgICogUHJlY29uZGl0aW9uOiAgSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIGN1cnJlbnQgb3IgbmV4dCBzdGFydCBlbGVtZW50IHN0YXJ0cyB0aGlzIG9iamVjdCBhbmQgYW55IGludGVydmVuaW5nIHJlYWRlciBldmVudHMgYXJlIGlnbm9yYWJsZQotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIG5vdCBhbiBlbGVtZW50LCBpdCBpcyBhIGNvbXBsZXggdHlwZSBhbmQgdGhlIHJlYWRlciBpcyBhdCB0aGUgZXZlbnQganVzdCBhZnRlciB0aGUgb3V0ZXIgc3RhcnQgZWxlbWVudAotICAgICAgICAqIFBvc3Rjb25kaXRpb246IElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCBpdHMgZW5kIGVsZW1lbnQKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBhIGNvbXBsZXggdHlwZSwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IHRoZSBlbmQgZWxlbWVudCBvZiBpdHMgb3V0ZXIgZWxlbWVudAotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFVuc2lnbmVkTG9uZyBwYXJzZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uewotICAgICAgICAgICAgVW5zaWduZWRMb25nIG9iamVjdCA9Ci0gICAgICAgICAgICAgICAgbmV3IFVuc2lnbmVkTG9uZygpOwotCi0gICAgICAgICAgICBpbnQgZXZlbnQ7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5pbGxhYmxlVmFsdWUgPSBudWxsOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSIiOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2V1cmkgPSIiOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSAoIXJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICYmICFyZWFkZXIuaXNFbmRFbGVtZW50KCkpCi0gICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiKSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGZ1bGxUeXBlTmFtZSA9IHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiKTsKLSAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUhPW51bGwpewotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zUHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoMCxmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IG5zUHJlZml4PT1udWxsPyIiOm5zUHJlZml4OwotCi0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgdHlwZSA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSsxKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEidW5zaWduZWRMb25nIi5lcXVhbHModHlwZSkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2ZpbmQgbmFtZXNwYWNlIGZvciB0aGUgcHJlZml4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNVcmkgPSByZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShuc1ByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoVW5zaWduZWRMb25nKW9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLkV4dGVuc2lvbk1hcHBlci5nZXRUeXBlT2JqZWN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zVXJpLHR5cGUscmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIE5vdGUgYWxsIGF0dHJpYnV0ZXMgdGhhdCB3ZXJlIGhhbmRsZWQuIFVzZWQgdG8gZGlmZmVyIG5vcm1hbCBhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgICAgLy8gZnJvbSBhbnlBdHRyaWJ1dGVzLgotICAgICAgICAgICAgICAgIGphdmEudXRpbC5WZWN0b3IgaGFuZGxlZEF0dHJpYnV0ZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlKCFyZWFkZXIuaXNFbmRFbGVtZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50ID0gcmVhZGVyLmdldEVsZW1lbnRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0VW5zaWduZWRMb25nKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9VbnNpZ25lZExvbmcoY29udGVudCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIEVuZCBvZiBpZiBmb3IgZXhwZWN0ZWQgcHJvcGVydHkgc3RhcnQgZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHN0YXJ0IGVsZW1lbnQgd2UgYXJlIG5vdCBleHBlY3RpbmcgaW5kaWNhdGVzIGFuIGludmFsaWQgcGFyYW1ldGVyIHdhcyBwYXNzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIlVuZXhwZWN0ZWQgc3ViZWxlbWVudCAiICsgcmVhZGVyLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBlbmQgb2Ygd2hpbGUgbG9vcAotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLQotCi0gICAgICAgICAgICB9IGNhdGNoIChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEubGFuZy5FeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBvYmplY3Q7Ci0gICAgICAgIH0KLQotICAgICAgICB9Ly9lbmQgb2YgZmFjdG9yeSBjbGFzcwotCi0gICAgICAgIAotCi0gICAgICAgIH0KLSAgICAgICAgICAgCi0gICAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9VbnNpZ25lZFNob3J0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL1Vuc2lnbmVkU2hvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTlmNzE0YS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL1Vuc2lnbmVkU2hvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwMyArMCwwIEBACi0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICogVW5zaWduZWRTaG9ydC5qYXZhCi0gKgotICogVGhpcyBmaWxlIHdhcyBhdXRvLWdlbmVyYXRlZCBmcm9tIFdTREwKLSAqIGJ5IHRoZSBBcGFjaGUgQXhpczIgdmVyc2lvbjogU05BUFNIT1QgIEJ1aWx0IG9uIDogRGVjIDIxLCAyMDA3ICgwNDowMzozMCBMS1QpCi0gKi8KLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2Rpbmc7Ci0gICAgICAgICAgICAKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqICBVbnNpZ25lZFNob3J0IGJlYW4gY2xhc3MKLSAgICAgICAgICAgICovCi0gICAgICAgIAotICAgICAgICBwdWJsaWMgIGNsYXNzIFVuc2lnbmVkU2hvcnQKLSAgICAgICAgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkJlYW57Ci0gICAgICAgIC8qIFRoaXMgdHlwZSB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIHBpZWNlIG9mIHNjaGVtYSB0aGF0IGhhZAotICAgICAgICAgICAgICAgIG5hbWUgPSB1bnNpZ25lZFNob3J0Ci0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFVSSSA9IGh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFByZWZpeCA9IG5zMQotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdlbmVyYXRlUHJlZml4KGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB7Ci0gICAgICAgICAgICBpZihuYW1lc3BhY2UuZXF1YWxzKCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIpKXsKLSAgICAgICAgICAgICAgICByZXR1cm4gIlNPQVAtRU5DIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBmaWVsZCBmb3IgVW5zaWduZWRTaG9ydAotICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5VbnNpZ25lZFNob3J0IGxvY2FsVW5zaWduZWRTaG9ydCA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgZ2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuVW5zaWduZWRTaG9ydAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5VbnNpZ25lZFNob3J0IGdldFVuc2lnbmVkU2hvcnQoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxVbnNpZ25lZFNob3J0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgc2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtIHBhcmFtIFVuc2lnbmVkU2hvcnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldFVuc2lnbmVkU2hvcnQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5VbnNpZ25lZFNob3J0IHBhcmFtKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2NhbFVuc2lnbmVkU2hvcnQ9cGFyYW07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbFVuc2lnbmVkU2hvcnQudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgIC8qKgotICAgICAqIGlzUmVhZGVyTVRPTUF3YXJlCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSByZWFkZXIgc3VwcG9ydHMgTVRPTQotICAgICAqLwotICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgewotICAgICAgICBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICB0cnl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBqYXZhLmxhbmcuQm9vbGVhbi5UUlVFLmVxdWFscyhyZWFkZXIuZ2V0UHJvcGVydHkob3JnLmFwYWNoZS5heGlvbS5vbS5PTUNvbnN0YW50cy5JU19EQVRBX0hBTkRMRVJTX0FXQVJFKSk7Ci0gICAgICAgIH1jYXRjaChqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlzUmVhZGVyTVRPTUF3YXJlOwotICAgfQotICAgICAKLSAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAqCi0gICAgICAgICogQHBhcmFtIHBhcmVudFFOYW1lCi0gICAgICAgICogQHBhcmFtIGZhY3RvcnkKLSAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgcHVibGljIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IGdldE9NRWxlbWVudCAoCi0gICAgICAgICAgICAgICBmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSkgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZSBkYXRhU291cmNlID0KLSAgICAgICAgICAgICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRGF0YVNvdXJjZSh0aGlzLHBhcmVudFFOYW1lKXsKLQotICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgVW5zaWduZWRTaG9ydC50aGlzLnNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5sbG9tLk9NU291cmNlZEVsZW1lbnRJbXBsKAotICAgICAgICAgICAgICAgcGFyZW50UU5hbWUsZmFjdG9yeSxkYXRhU291cmNlKTsKLSAgICAgICAgICAgIAotICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcixmYWxzZSk7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNlcmlhbGl6ZVR5cGUpCi0gICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgCi0KLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gcGFyZW50UU5hbWUuZ2V0UHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZSA9IHBhcmVudFFOYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlICE9IG51bGwpICYmIChuYW1lc3BhY2UudHJpbSgpLmxlbmd0aCgpID4gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgd3JpdGVyUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdyaXRlclByZWZpeCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KG5hbWVzcGFjZSwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocHJlZml4LCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgaWYgKHNlcmlhbGl6ZVR5cGUpewotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIik7Ci0gICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2VQcmVmaXggIT0gbnVsbCkgJiYgKG5hbWVzcGFjZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlUHJlZml4KyI6dW5zaWduZWRTaG9ydCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgInVuc2lnbmVkU2hvcnQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxVbnNpZ25lZFNob3J0PT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZSB0aGUgbmlsIGF0dHJpYnV0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oInVuc2lnbmVkU2hvcnQgY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxVbnNpZ25lZFNob3J0KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBwcmVmaXgsamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICBpZiAoeG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0KLSAgICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0KLSAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLCBqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZU5hbWVzcGFjZSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlVmFsdWU7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gYXR0cmlidXRlUHJlZml4ICsgIjoiICsgcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsIGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIC8qKgotICAgICAgICAgKiAgbWV0aG9kIHRvIGhhbmRsZSBRbmFtZXMKLSAgICAgICAgICovCi0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWUoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMocHJlZml4ICsgIjoiICsgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGkuZSB0aGlzIGlzIHRoZSBkZWZhdWx0IG5hbWVzcGFjZQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZXMoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZVtdIHFuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgaWYgKHFuYW1lcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBzdG9yZSB0aGlzIGRhdGEgdW50aWwgbGFzdCBtb21lbnQgc2luY2UgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHdyaXRlIGFueQotICAgICAgICAgICAgICAgIC8vIG5hbWVzcGFjZSBkYXRhIGFmdGVyIHdyaXRpbmcgdGhlIGNoYXJhY3RvciBkYXRhCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZ0J1ZmZlciBzdHJpbmdUb1dyaXRlID0gbmV3IGphdmEubGFuZy5TdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBxbmFtZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZCgiICIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVVSSSA9IHFuYW1lc1tpXS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHByZWZpeCA9PSBudWxsKSB8fCAocHJlZml4Lmxlbmd0aCgpID09IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQocHJlZml4KS5hcHBlbmQoIjoiKS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhzdHJpbmdUb1dyaXRlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotCi0gICAgICAgICAvKioKLSAgICAgICAgICogUmVnaXN0ZXIgYSBuYW1lc3BhY2UgcHJlZml4Ci0gICAgICAgICAqLwotICAgICAgICAgcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHJlZ2lzdGVyUHJlZml4KGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoeG1sV3JpdGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHByZWZpeDsKLSAgICAgICAgICAgIH0KLQotCi0gIAotICAgICAgICAvKioKLSAgICAgICAgKiBkYXRhYmluZGluZyBtZXRob2QgdG8gZ2V0IGFuIFhNTCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdAotICAgICAgICAqCi0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciBnZXRQdWxsUGFyc2VyKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcU5hbWUpCi0gICAgICAgICAgICAgICAgICAgIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGVsZW1lbnRMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBhdHRyaWJMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXIuRUxFTUVOVF9URVhUKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbFVuc2lnbmVkU2hvcnQgIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsVW5zaWduZWRTaG9ydCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJ1bnNpZ25lZFNob3J0IGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVySW1wbChxTmFtZSwgZWxlbWVudExpc3QudG9BcnJheSgpLCBhdHRyaWJMaXN0LnRvQXJyYXkoKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAKLQotICAgICAvKioKLSAgICAgICogIEZhY3RvcnkgY2xhc3MgdGhhdCBrZWVwcyB0aGUgcGFyc2UgbWV0aG9kCi0gICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeXsKLQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBVbnNpZ25lZFNob3J0IGZyb21TdHJpbmcoamF2YS5sYW5nLlN0cmluZyB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSl7Ci0gICAgICAgICAgICAgICAgICAgIFVuc2lnbmVkU2hvcnQgcmV0dXJuVmFsdWUgPSBuZXcgIFVuc2lnbmVkU2hvcnQoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUuc2V0VW5zaWduZWRTaG9ydCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1Vuc2lnbmVkU2hvcnQodmFsdWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIFVuc2lnbmVkU2hvcnQgZnJvbVN0cmluZyhqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudC5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IGNvbnRlbnQuc3Vic3RyaW5nKDAsY29udGVudC5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVcmkgPSB4bWxTdHJlYW1SZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFVuc2lnbmVkU2hvcnQuRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsbmFtZXNwYWNlVXJpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFVuc2lnbmVkU2hvcnQuRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsIiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAKLQotICAgICAgICAvKioKLSAgICAgICAgKiBzdGF0aWMgbWV0aG9kIHRvIGNyZWF0ZSB0aGUgb2JqZWN0Ci0gICAgICAgICogUHJlY29uZGl0aW9uOiAgSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIGN1cnJlbnQgb3IgbmV4dCBzdGFydCBlbGVtZW50IHN0YXJ0cyB0aGlzIG9iamVjdCBhbmQgYW55IGludGVydmVuaW5nIHJlYWRlciBldmVudHMgYXJlIGlnbm9yYWJsZQotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIG5vdCBhbiBlbGVtZW50LCBpdCBpcyBhIGNvbXBsZXggdHlwZSBhbmQgdGhlIHJlYWRlciBpcyBhdCB0aGUgZXZlbnQganVzdCBhZnRlciB0aGUgb3V0ZXIgc3RhcnQgZWxlbWVudAotICAgICAgICAqIFBvc3Rjb25kaXRpb246IElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCBpdHMgZW5kIGVsZW1lbnQKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBhIGNvbXBsZXggdHlwZSwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IHRoZSBlbmQgZWxlbWVudCBvZiBpdHMgb3V0ZXIgZWxlbWVudAotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFVuc2lnbmVkU2hvcnQgcGFyc2UoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIFVuc2lnbmVkU2hvcnQgb2JqZWN0ID0KLSAgICAgICAgICAgICAgICBuZXcgVW5zaWduZWRTaG9ydCgpOwotCi0gICAgICAgICAgICBpbnQgZXZlbnQ7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5pbGxhYmxlVmFsdWUgPSBudWxsOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSIiOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2V1cmkgPSIiOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSAoIXJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICYmICFyZWFkZXIuaXNFbmRFbGVtZW50KCkpCi0gICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiKSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGZ1bGxUeXBlTmFtZSA9IHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiKTsKLSAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUhPW51bGwpewotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zUHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoMCxmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IG5zUHJlZml4PT1udWxsPyIiOm5zUHJlZml4OwotCi0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgdHlwZSA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSsxKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEidW5zaWduZWRTaG9ydCIuZXF1YWxzKHR5cGUpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9maW5kIG5hbWVzcGFjZSBmb3IgdGhlIHByZWZpeAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zVXJpID0gcmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkobnNQcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFVuc2lnbmVkU2hvcnQpb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2RpbmcuRXh0ZW5zaW9uTWFwcGVyLmdldFR5cGVPYmplY3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNVcmksdHlwZSxyZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gTm90ZSBhbGwgYXR0cmlidXRlcyB0aGF0IHdlcmUgaGFuZGxlZC4gVXNlZCB0byBkaWZmZXIgbm9ybWFsIGF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgICAvLyBmcm9tIGFueUF0dHJpYnV0ZXMuCi0gICAgICAgICAgICAgICAgamF2YS51dGlsLlZlY3RvciBoYW5kbGVkQXR0cmlidXRlcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUoIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQgPSByZWFkZXIuZ2V0RWxlbWVudFRleHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5zZXRVbnNpZ25lZFNob3J0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9VbnNpZ25lZFNob3J0KGNvbnRlbnQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBFbmQgb2YgaWYgZm9yIGV4cGVjdGVkIHByb3BlcnR5IHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2V7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBzdGFydCBlbGVtZW50IHdlIGFyZSBub3QgZXhwZWN0aW5nIGluZGljYXRlcyBhbiBpbnZhbGlkIHBhcmFtZXRlciB3YXMgcGFzc2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJVbmV4cGVjdGVkIHN1YmVsZW1lbnQgIiArIHJlYWRlci5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gZW5kIG9mIHdoaWxlIGxvb3AKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0KLQotICAgICAgICAgICAgfSBjYXRjaCAoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gb2JqZWN0OwotICAgICAgICB9Ci0KLSAgICAgICAgfS8vZW5kIG9mIGZhY3RvcnkgY2xhc3MKLQotICAgICAgICAKLQotICAgICAgICB9Ci0gICAgICAgICAgIAotICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvX2Jvb2xlYW4uamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvX2Jvb2xlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA1NjQ5NS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL19ib29sZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OTUgKzAsMCBAQAotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIF9ib29sZWFuLmphdmEKLSAqCi0gKiBUaGlzIGZpbGUgd2FzIGF1dG8tZ2VuZXJhdGVkIGZyb20gV1NETAotICogYnkgdGhlIEFwYWNoZSBBeGlzMiB2ZXJzaW9uOiBTTkFQU0hPVCAgQnVpbHQgb24gOiBEZWMgMjEsIDIwMDcgKDA0OjAzOjMwIExLVCkKLSAqLwotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZzsKLSAgICAgICAgICAgIAotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogIF9ib29sZWFuIGJlYW4gY2xhc3MKLSAgICAgICAgICAgICovCi0gICAgICAgIAotICAgICAgICBwdWJsaWMgIGNsYXNzIF9ib29sZWFuCi0gICAgICAgIGltcGxlbWVudHMgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJCZWFuewotICAgICAgICAvKiBUaGlzIHR5cGUgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBwaWVjZSBvZiBzY2hlbWEgdGhhdCBoYWQKLSAgICAgICAgICAgICAgICBuYW1lID0gYm9vbGVhbgotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBVUkkgPSBodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLwotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBQcmVmaXggPSBuczEKLSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgCi0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZW5lcmF0ZVByZWZpeChqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICAgICAgaWYobmFtZXNwYWNlLmVxdWFscygiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iKSl7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJTT0FQLUVOQyI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgfQotCi0gICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogZmllbGQgZm9yIF9ib29sZWFuCi0gICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBib29sZWFuIGxvY2FsX2Jvb2xlYW4gOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIGdldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiBib29sZWFuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljICBib29sZWFuIGdldF9ib29sZWFuKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsX2Jvb2xlYW47Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBzZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gcGFyYW0gX2Jvb2xlYW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldF9ib29sZWFuKGJvb2xlYW4gcGFyYW0pewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2FsX2Jvb2xlYW49cGFyYW07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbF9ib29sZWFuICsgIiI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAvKioKLSAgICAgKiBpc1JlYWRlck1UT01Bd2FyZQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVhZGVyIHN1cHBvcnRzIE1UT00KLSAgICAgKi8KLSAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKLSAgICAgICAgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICAKLSAgICAgICAgdHJ5ewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gamF2YS5sYW5nLkJvb2xlYW4uVFJVRS5lcXVhbHMocmVhZGVyLmdldFByb3BlcnR5KG9yZy5hcGFjaGUuYXhpb20ub20uT01Db25zdGFudHMuSVNfREFUQV9IQU5ETEVSU19BV0FSRSkpOwotICAgICAgICB9Y2F0Y2goamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpc1JlYWRlck1UT01Bd2FyZTsKLSAgIH0KLSAgICAgCi0gICAgIAotICAgICAgICAvKioKLSAgICAgICAgKgotICAgICAgICAqIEBwYXJhbSBwYXJlbnRRTmFtZQotICAgICAgICAqIEBwYXJhbSBmYWN0b3J5Ci0gICAgICAgICogQHJldHVybiBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudAotICAgICAgICAqLwotICAgICAgIHB1YmxpYyBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCBnZXRPTUVsZW1lbnQgKAotICAgICAgICAgICAgICAgZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnkpIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTURhdGFTb3VyY2UgZGF0YVNvdXJjZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkRhdGFTb3VyY2UodGhpcyxwYXJlbnRRTmFtZSl7Ci0KLSAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgIF9ib29sZWFuLnRoaXMuc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmxsb20uT01Tb3VyY2VkRWxlbWVudEltcGwoCi0gICAgICAgICAgICAgICBwYXJlbnRRTmFtZSxmYWN0b3J5LGRhdGFTb3VyY2UpOwotICAgICAgICAgICAgCi0gICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyLGZhbHNlKTsKLSAgICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VyaWFsaXplVHlwZSkKLSAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLQotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBwYXJlbnRRTmFtZS5nZXRQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlID0gcGFyZW50UU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2UgIT0gbnVsbCkgJiYgKG5hbWVzcGFjZS50cmltKCkubGVuZ3RoKCkgPiAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB3cml0ZXJQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAod3JpdGVyUHJlZml4ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQobmFtZXNwYWNlLCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwcmVmaXgsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICBpZiAoc2VyaWFsaXplVHlwZSl7Ci0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iKTsKLSAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZVByZWZpeCAhPSBudWxsKSAmJiAobmFtZXNwYWNlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApKXsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VQcmVmaXgrIjpib29sZWFuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiYm9vbGVhbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmYWxzZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJib29sZWFuIGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbF9ib29sZWFuKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGggdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgcHJlZml4LGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgaWYgKHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotCi0gICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotCi0gICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSwgamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVOYW1lc3BhY2UgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgoYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVZhbHVlOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IGF0dHJpYnV0ZVByZWZpeCArICI6IiArIHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLCBhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAvKioKLSAgICAgICAgICogIG1ldGhvZCB0byBoYW5kbGUgUW5hbWVzCi0gICAgICAgICAqLwotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHByZWZpeCArICI6IiArIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBpLmUgdGhpcyBpcyB0aGUgZGVmYXVsdCBuYW1lc3BhY2UKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVzKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWVbXSBxbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgIGlmIChxbmFtZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gc3RvcmUgdGhpcyBkYXRhIHVudGlsIGxhc3QgbW9tZW50IHNpbmNlIGl0IGlzIG5vdCBwb3NzaWJsZSB0byB3cml0ZSBhbnkKLSAgICAgICAgICAgICAgICAvLyBuYW1lc3BhY2UgZGF0YSBhZnRlciB3cml0aW5nIHRoZSBjaGFyYWN0b3IgZGF0YQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmdCdWZmZXIgc3RyaW5nVG9Xcml0ZSA9IG5ldyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcW5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQoIiAiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VVUkkgPSBxbmFtZXNbaV0uZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwcmVmaXggPT0gbnVsbCkgfHwgKHByZWZpeC5sZW5ndGgoKSA9PSAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKHByZWZpeCkuYXBwZW5kKCI6IikuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMoc3RyaW5nVG9Xcml0ZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAqIFJlZ2lzdGVyIGEgbmFtZXNwYWNlIHByZWZpeAotICAgICAgICAgKi8KLSAgICAgICAgIHByaXZhdGUgamF2YS5sYW5nLlN0cmluZyByZWdpc3RlclByZWZpeChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHhtbFdyaXRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiBwcmVmaXg7Ci0gICAgICAgICAgICB9Ci0KLQotICAKLSAgICAgICAgLyoqCi0gICAgICAgICogZGF0YWJpbmRpbmcgbWV0aG9kIHRvIGdldCBhbiBYTUwgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QKLSAgICAgICAgKgotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgZ2V0UHVsbFBhcnNlcihqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFOYW1lKQotICAgICAgICAgICAgICAgICAgICB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBlbGVtZW50TGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgYXR0cmliTGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVyLkVMRU1FTlRfVEVYVCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsX2Jvb2xlYW4pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVySW1wbChxTmFtZSwgZWxlbWVudExpc3QudG9BcnJheSgpLCBhdHRyaWJMaXN0LnRvQXJyYXkoKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAKLQotICAgICAvKioKLSAgICAgICogIEZhY3RvcnkgY2xhc3MgdGhhdCBrZWVwcyB0aGUgcGFyc2UgbWV0aG9kCi0gICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeXsKLQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBfYm9vbGVhbiBmcm9tU3RyaW5nKGphdmEubGFuZy5TdHJpbmcgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkpewotICAgICAgICAgICAgICAgICAgICBfYm9vbGVhbiByZXR1cm5WYWx1ZSA9IG5ldyAgX2Jvb2xlYW4oKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUuc2V0X2Jvb2xlYW4oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9Cb29sZWFuKHZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBfYm9vbGVhbiBmcm9tU3RyaW5nKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50LmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gY29udGVudC5zdWJzdHJpbmcoMCxjb250ZW50LmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVyaSA9IHhtbFN0cmVhbVJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2Jvb2xlYW4uRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsbmFtZXNwYWNlVXJpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9ib29sZWFuLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LCIiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgCi0KLSAgICAgICAgLyoqCi0gICAgICAgICogc3RhdGljIG1ldGhvZCB0byBjcmVhdGUgdGhlIG9iamVjdAotICAgICAgICAqIFByZWNvbmRpdGlvbjogIElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSBjdXJyZW50IG9yIG5leHQgc3RhcnQgZWxlbWVudCBzdGFydHMgdGhpcyBvYmplY3QgYW5kIGFueSBpbnRlcnZlbmluZyByZWFkZXIgZXZlbnRzIGFyZSBpZ25vcmFibGUKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBub3QgYW4gZWxlbWVudCwgaXQgaXMgYSBjb21wbGV4IHR5cGUgYW5kIHRoZSByZWFkZXIgaXMgYXQgdGhlIGV2ZW50IGp1c3QgYWZ0ZXIgdGhlIG91dGVyIHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgKiBQb3N0Y29uZGl0aW9uOiBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgaXRzIGVuZCBlbGVtZW50Ci0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgYSBjb21wbGV4IHR5cGUsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCB0aGUgZW5kIGVsZW1lbnQgb2YgaXRzIG91dGVyIGVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBfYm9vbGVhbiBwYXJzZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uewotICAgICAgICAgICAgX2Jvb2xlYW4gb2JqZWN0ID0KLSAgICAgICAgICAgICAgICBuZXcgX2Jvb2xlYW4oKTsKLQotICAgICAgICAgICAgaW50IGV2ZW50OwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuaWxsYWJsZVZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0iIjsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNldXJpID0iIjsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUgKCFyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAmJiAhcmVhZGVyLmlzRW5kRWxlbWVudCgpKQotICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIikhPW51bGwpewotICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBmdWxsVHlwZU5hbWUgPSByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIik7Ci0gICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1ByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKDAsZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBuc1ByZWZpeD09bnVsbD8iIjpuc1ByZWZpeDsKLQotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHR5cGUgPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikrMSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghImJvb2xlYW4iLmVxdWFscyh0eXBlKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZmluZCBuYW1lc3BhY2UgZm9yIHRoZSBwcmVmaXgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1VyaSA9IHJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKG5zUHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChfYm9vbGVhbilvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZy5FeHRlbnNpb25NYXBwZXIuZ2V0VHlwZU9iamVjdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc1VyaSx0eXBlLHJlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBOb3RlIGFsbCBhdHRyaWJ1dGVzIHRoYXQgd2VyZSBoYW5kbGVkLiBVc2VkIHRvIGRpZmZlciBub3JtYWwgYXR0cmlidXRlcwotICAgICAgICAgICAgICAgIC8vIGZyb20gYW55QXR0cmlidXRlcy4KLSAgICAgICAgICAgICAgICBqYXZhLnV0aWwuVmVjdG9yIGhhbmRsZWRBdHRyaWJ1dGVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSghcmVhZGVyLmlzRW5kRWxlbWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCA9IHJlYWRlci5nZXRFbGVtZW50VGV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldF9ib29sZWFuKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9Cb29sZWFuKGNvbnRlbnQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBFbmQgb2YgaWYgZm9yIGV4cGVjdGVkIHByb3BlcnR5IHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2V7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBzdGFydCBlbGVtZW50IHdlIGFyZSBub3QgZXhwZWN0aW5nIGluZGljYXRlcyBhbiBpbnZhbGlkIHBhcmFtZXRlciB3YXMgcGFzc2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJVbmV4cGVjdGVkIHN1YmVsZW1lbnQgIiArIHJlYWRlci5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gZW5kIG9mIHdoaWxlIGxvb3AKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0KLQotICAgICAgICAgICAgfSBjYXRjaCAoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gb2JqZWN0OwotICAgICAgICB9Ci0KLSAgICAgICAgfS8vZW5kIG9mIGZhY3RvcnkgY2xhc3MKLQotICAgICAgICAKLQotICAgICAgICB9Ci0gICAgICAgICAgIAotICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvX2J5dGUuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvX2J5dGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU3YjliMi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL19ieXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OTUgKzAsMCBAQAotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIF9ieXRlLmphdmEKLSAqCi0gKiBUaGlzIGZpbGUgd2FzIGF1dG8tZ2VuZXJhdGVkIGZyb20gV1NETAotICogYnkgdGhlIEFwYWNoZSBBeGlzMiB2ZXJzaW9uOiBTTkFQU0hPVCAgQnVpbHQgb24gOiBEZWMgMjEsIDIwMDcgKDA0OjAzOjMwIExLVCkKLSAqLwotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZzsKLSAgICAgICAgICAgIAotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogIF9ieXRlIGJlYW4gY2xhc3MKLSAgICAgICAgICAgICovCi0gICAgICAgIAotICAgICAgICBwdWJsaWMgIGNsYXNzIF9ieXRlCi0gICAgICAgIGltcGxlbWVudHMgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJCZWFuewotICAgICAgICAvKiBUaGlzIHR5cGUgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBwaWVjZSBvZiBzY2hlbWEgdGhhdCBoYWQKLSAgICAgICAgICAgICAgICBuYW1lID0gYnl0ZQotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBVUkkgPSBodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLwotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBQcmVmaXggPSBuczEKLSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgCi0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZW5lcmF0ZVByZWZpeChqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICAgICAgaWYobmFtZXNwYWNlLmVxdWFscygiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iKSl7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJTT0FQLUVOQyI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgfQotCi0gICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogZmllbGQgZm9yIF9ieXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBieXRlIGxvY2FsX2J5dGUgOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIGdldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiBieXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljICBieXRlIGdldF9ieXRlKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsX2J5dGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBzZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gcGFyYW0gX2J5dGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldF9ieXRlKGJ5dGUgcGFyYW0pewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2FsX2J5dGU9cGFyYW07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbF9ieXRlICsgIiI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAvKioKLSAgICAgKiBpc1JlYWRlck1UT01Bd2FyZQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVhZGVyIHN1cHBvcnRzIE1UT00KLSAgICAgKi8KLSAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKLSAgICAgICAgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICAKLSAgICAgICAgdHJ5ewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gamF2YS5sYW5nLkJvb2xlYW4uVFJVRS5lcXVhbHMocmVhZGVyLmdldFByb3BlcnR5KG9yZy5hcGFjaGUuYXhpb20ub20uT01Db25zdGFudHMuSVNfREFUQV9IQU5ETEVSU19BV0FSRSkpOwotICAgICAgICB9Y2F0Y2goamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpc1JlYWRlck1UT01Bd2FyZTsKLSAgIH0KLSAgICAgCi0gICAgIAotICAgICAgICAvKioKLSAgICAgICAgKgotICAgICAgICAqIEBwYXJhbSBwYXJlbnRRTmFtZQotICAgICAgICAqIEBwYXJhbSBmYWN0b3J5Ci0gICAgICAgICogQHJldHVybiBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudAotICAgICAgICAqLwotICAgICAgIHB1YmxpYyBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCBnZXRPTUVsZW1lbnQgKAotICAgICAgICAgICAgICAgZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnkpIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTURhdGFTb3VyY2UgZGF0YVNvdXJjZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkRhdGFTb3VyY2UodGhpcyxwYXJlbnRRTmFtZSl7Ci0KLSAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgIF9ieXRlLnRoaXMuc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmxsb20uT01Tb3VyY2VkRWxlbWVudEltcGwoCi0gICAgICAgICAgICAgICBwYXJlbnRRTmFtZSxmYWN0b3J5LGRhdGFTb3VyY2UpOwotICAgICAgICAgICAgCi0gICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyLGZhbHNlKTsKLSAgICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VyaWFsaXplVHlwZSkKLSAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLQotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBwYXJlbnRRTmFtZS5nZXRQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlID0gcGFyZW50UU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2UgIT0gbnVsbCkgJiYgKG5hbWVzcGFjZS50cmltKCkubGVuZ3RoKCkgPiAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB3cml0ZXJQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAod3JpdGVyUHJlZml4ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQobmFtZXNwYWNlLCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwcmVmaXgsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICBpZiAoc2VyaWFsaXplVHlwZSl7Ci0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iKTsKLSAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZVByZWZpeCAhPSBudWxsKSAmJiAobmFtZXNwYWNlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApKXsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VQcmVmaXgrIjpieXRlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiYnl0ZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbF9ieXRlPT1qYXZhLmxhbmcuQnl0ZS5NSU5fVkFMVUUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiYnl0ZSBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxfYnl0ZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRoIHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCxqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgIGlmICh4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLQotICAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsIGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlTmFtZXNwYWNlID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVWYWx1ZTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBhdHRyaWJ1dGVQcmVmaXggKyAiOiIgKyBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSwgYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICBtZXRob2QgdG8gaGFuZGxlIFFuYW1lcwotICAgICAgICAgKi8KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZShqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhwcmVmaXggKyAiOiIgKyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaS5lIHRoaXMgaXMgdGhlIGRlZmF1bHQgbmFtZXNwYWNlCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lcyhqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lW10gcW5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICBpZiAocW5hbWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHRvIHN0b3JlIHRoaXMgZGF0YSB1bnRpbCBsYXN0IG1vbWVudCBzaW5jZSBpdCBpcyBub3QgcG9zc2libGUgdG8gd3JpdGUgYW55Ci0gICAgICAgICAgICAgICAgLy8gbmFtZXNwYWNlIGRhdGEgYWZ0ZXIgd3JpdGluZyB0aGUgY2hhcmFjdG9yIGRhdGEKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIHN0cmluZ1RvV3JpdGUgPSBuZXcgamF2YS5sYW5nLlN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHFuYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKCIgIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlVVJJID0gcW5hbWVzW2ldLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocHJlZml4ID09IG51bGwpIHx8IChwcmVmaXgubGVuZ3RoKCkgPT0gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChwcmVmaXgpLmFwcGVuZCgiOiIpLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHN0cmluZ1RvV3JpdGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0KLSAgICAgICAgIC8qKgotICAgICAgICAgKiBSZWdpc3RlciBhIG5hbWVzcGFjZSBwcmVmaXgKLSAgICAgICAgICovCi0gICAgICAgICBwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgcmVnaXN0ZXJQcmVmaXgoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLCBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlICh4bWxXcml0ZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gcHJlZml4OwotICAgICAgICAgICAgfQotCi0KLSAgCi0gICAgICAgIC8qKgotICAgICAgICAqIGRhdGFiaW5kaW5nIG1ldGhvZCB0byBnZXQgYW4gWE1MIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0Ci0gICAgICAgICoKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIGdldFB1bGxQYXJzZXIoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxTmFtZSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgZWxlbWVudExpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGF0dHJpYkxpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlci5FTEVNRU5UX1RFWFQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbF9ieXRlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlckltcGwocU5hbWUsIGVsZW1lbnRMaXN0LnRvQXJyYXkoKSwgYXR0cmliTGlzdC50b0FycmF5KCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgCi0KLSAgICAgLyoqCi0gICAgICAqICBGYWN0b3J5IGNsYXNzIHRoYXQga2VlcHMgdGhlIHBhcnNlIG1ldGhvZAotICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3Rvcnl7Ci0KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgX2J5dGUgZnJvbVN0cmluZyhqYXZhLmxhbmcuU3RyaW5nIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJKXsKLSAgICAgICAgICAgICAgICAgICAgX2J5dGUgcmV0dXJuVmFsdWUgPSBuZXcgIF9ieXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlLnNldF9ieXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvQnl0ZSh2YWx1ZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgX2J5dGUgZnJvbVN0cmluZyhqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudC5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IGNvbnRlbnQuc3Vic3RyaW5nKDAsY29udGVudC5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVcmkgPSB4bWxTdHJlYW1SZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9ieXRlLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LG5hbWVzcGFjZVVyaSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfYnl0ZS5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCwiIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIAotCi0gICAgICAgIC8qKgotICAgICAgICAqIHN0YXRpYyBtZXRob2QgdG8gY3JlYXRlIHRoZSBvYmplY3QKLSAgICAgICAgKiBQcmVjb25kaXRpb246ICBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgY3VycmVudCBvciBuZXh0IHN0YXJ0IGVsZW1lbnQgc3RhcnRzIHRoaXMgb2JqZWN0IGFuZCBhbnkgaW50ZXJ2ZW5pbmcgcmVhZGVyIGV2ZW50cyBhcmUgaWdub3JhYmxlCi0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgbm90IGFuIGVsZW1lbnQsIGl0IGlzIGEgY29tcGxleCB0eXBlIGFuZCB0aGUgcmVhZGVyIGlzIGF0IHRoZSBldmVudCBqdXN0IGFmdGVyIHRoZSBvdXRlciBzdGFydCBlbGVtZW50Ci0gICAgICAgICogUG9zdGNvbmRpdGlvbjogSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IGl0cyBlbmQgZWxlbWVudAotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIGEgY29tcGxleCB0eXBlLCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgdGhlIGVuZCBlbGVtZW50IG9mIGl0cyBvdXRlciBlbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgX2J5dGUgcGFyc2UoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIF9ieXRlIG9iamVjdCA9Ci0gICAgICAgICAgICAgICAgbmV3IF9ieXRlKCk7Ci0KLSAgICAgICAgICAgIGludCBldmVudDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmlsbGFibGVWYWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IiI7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZXVyaSA9IiI7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlICghcmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgJiYgIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkKLSAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIpIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgZnVsbFR5cGVOYW1lID0gcmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAidHlwZSIpOwotICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNQcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZygwLGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gbnNQcmVmaXg9PW51bGw/IiI6bnNQcmVmaXg7Ci0KLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB0eXBlID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZyhmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKzEpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISJieXRlIi5lcXVhbHModHlwZSkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2ZpbmQgbmFtZXNwYWNlIGZvciB0aGUgcHJlZml4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNVcmkgPSByZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShuc1ByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoX2J5dGUpb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2RpbmcuRXh0ZW5zaW9uTWFwcGVyLmdldFR5cGVPYmplY3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNVcmksdHlwZSxyZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gTm90ZSBhbGwgYXR0cmlidXRlcyB0aGF0IHdlcmUgaGFuZGxlZC4gVXNlZCB0byBkaWZmZXIgbm9ybWFsIGF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgICAvLyBmcm9tIGFueUF0dHJpYnV0ZXMuCi0gICAgICAgICAgICAgICAgamF2YS51dGlsLlZlY3RvciBoYW5kbGVkQXR0cmlidXRlcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUoIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQgPSByZWFkZXIuZ2V0RWxlbWVudFRleHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5zZXRfYnl0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvQnl0ZShjb250ZW50KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gRW5kIG9mIGlmIGZvciBleHBlY3RlZCBwcm9wZXJ0eSBzdGFydCBlbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgc3RhcnQgZWxlbWVudCB3ZSBhcmUgbm90IGV4cGVjdGluZyBpbmRpY2F0ZXMgYW4gaW52YWxpZCBwYXJhbWV0ZXIgd2FzIHBhc3NlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiVW5leHBlY3RlZCBzdWJlbGVtZW50ICIgKyByZWFkZXIuZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIGVuZCBvZiB3aGlsZSBsb29wCi0gICAgICAgICAgICAgICAgICAgICAgICAKLQotCi0KLSAgICAgICAgICAgIH0gY2F0Y2ggKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5sYW5nLkV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG9iamVjdDsKLSAgICAgICAgfQotCi0gICAgICAgIH0vL2VuZCBvZiBmYWN0b3J5IGNsYXNzCi0KLSAgICAgICAgCi0KLSAgICAgICAgfQotICAgICAgICAgICAKLSAgICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL19kb3VibGUuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvX2RvdWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGIwYWY1Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvX2RvdWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDk1ICswLDAgQEAKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBfZG91YmxlLmphdmEKLSAqCi0gKiBUaGlzIGZpbGUgd2FzIGF1dG8tZ2VuZXJhdGVkIGZyb20gV1NETAotICogYnkgdGhlIEFwYWNoZSBBeGlzMiB2ZXJzaW9uOiBTTkFQU0hPVCAgQnVpbHQgb24gOiBEZWMgMjEsIDIwMDcgKDA0OjAzOjMwIExLVCkKLSAqLwotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZzsKLSAgICAgICAgICAgIAotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogIF9kb3VibGUgYmVhbiBjbGFzcwotICAgICAgICAgICAgKi8KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyAgY2xhc3MgX2RvdWJsZQotICAgICAgICBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCQmVhbnsKLSAgICAgICAgLyogVGhpcyB0eXBlIHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgcGllY2Ugb2Ygc2NoZW1hIHRoYXQgaGFkCi0gICAgICAgICAgICAgICAgbmFtZSA9IGRvdWJsZQotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBVUkkgPSBodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLwotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBQcmVmaXggPSBuczEKLSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgCi0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZW5lcmF0ZVByZWZpeChqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICAgICAgaWYobmFtZXNwYWNlLmVxdWFscygiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iKSl7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJTT0FQLUVOQyI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgfQotCi0gICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogZmllbGQgZm9yIF9kb3VibGUKLSAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIGRvdWJsZSBsb2NhbF9kb3VibGUgOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIGdldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiBkb3VibGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgIGRvdWJsZSBnZXRfZG91YmxlKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsX2RvdWJsZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIHNldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSBwYXJhbSBfZG91YmxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRfZG91YmxlKGRvdWJsZSBwYXJhbSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYWxfZG91YmxlPXBhcmFtOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxfZG91YmxlICsgIiI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAvKioKLSAgICAgKiBpc1JlYWRlck1UT01Bd2FyZQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVhZGVyIHN1cHBvcnRzIE1UT00KLSAgICAgKi8KLSAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKLSAgICAgICAgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICAKLSAgICAgICAgdHJ5ewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gamF2YS5sYW5nLkJvb2xlYW4uVFJVRS5lcXVhbHMocmVhZGVyLmdldFByb3BlcnR5KG9yZy5hcGFjaGUuYXhpb20ub20uT01Db25zdGFudHMuSVNfREFUQV9IQU5ETEVSU19BV0FSRSkpOwotICAgICAgICB9Y2F0Y2goamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpc1JlYWRlck1UT01Bd2FyZTsKLSAgIH0KLSAgICAgCi0gICAgIAotICAgICAgICAvKioKLSAgICAgICAgKgotICAgICAgICAqIEBwYXJhbSBwYXJlbnRRTmFtZQotICAgICAgICAqIEBwYXJhbSBmYWN0b3J5Ci0gICAgICAgICogQHJldHVybiBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudAotICAgICAgICAqLwotICAgICAgIHB1YmxpYyBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCBnZXRPTUVsZW1lbnQgKAotICAgICAgICAgICAgICAgZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnkpIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTURhdGFTb3VyY2UgZGF0YVNvdXJjZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkRhdGFTb3VyY2UodGhpcyxwYXJlbnRRTmFtZSl7Ci0KLSAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgIF9kb3VibGUudGhpcy5zZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5PTVNvdXJjZWRFbGVtZW50SW1wbCgKLSAgICAgICAgICAgICAgIHBhcmVudFFOYW1lLGZhY3RvcnksZGF0YVNvdXJjZSk7Ci0gICAgICAgICAgICAKLSAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIsZmFsc2UpOwotICAgICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzZXJpYWxpemVUeXBlKQotICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotCi0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UgPSBudWxsOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHBhcmVudFFOYW1lLmdldFByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UgPSBwYXJlbnRRTmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZSAhPSBudWxsKSAmJiAobmFtZXNwYWNlLnRyaW0oKS5sZW5ndGgoKSA+IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHdyaXRlclByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3cml0ZXJQcmVmaXggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChuYW1lc3BhY2UsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHByZWZpeCwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCksIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIGlmIChzZXJpYWxpemVUeXBlKXsKLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIpOwotICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlUHJlZml4ICE9IG51bGwpICYmIChuYW1lc3BhY2VQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkpewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVByZWZpeCsiOmRvdWJsZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgImRvdWJsZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqYXZhLmxhbmcuRG91YmxlLmlzTmFOKGxvY2FsX2RvdWJsZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiZG91YmxlIGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbF9kb3VibGUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBwcmVmaXgsamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICBpZiAoeG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0KLSAgICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0KLSAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLCBqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZU5hbWVzcGFjZSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlVmFsdWU7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gYXR0cmlidXRlUHJlZml4ICsgIjoiICsgcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsIGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIC8qKgotICAgICAgICAgKiAgbWV0aG9kIHRvIGhhbmRsZSBRbmFtZXMKLSAgICAgICAgICovCi0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWUoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMocHJlZml4ICsgIjoiICsgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGkuZSB0aGlzIGlzIHRoZSBkZWZhdWx0IG5hbWVzcGFjZQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZXMoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZVtdIHFuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgaWYgKHFuYW1lcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBzdG9yZSB0aGlzIGRhdGEgdW50aWwgbGFzdCBtb21lbnQgc2luY2UgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHdyaXRlIGFueQotICAgICAgICAgICAgICAgIC8vIG5hbWVzcGFjZSBkYXRhIGFmdGVyIHdyaXRpbmcgdGhlIGNoYXJhY3RvciBkYXRhCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZ0J1ZmZlciBzdHJpbmdUb1dyaXRlID0gbmV3IGphdmEubGFuZy5TdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBxbmFtZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZCgiICIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVVSSSA9IHFuYW1lc1tpXS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHByZWZpeCA9PSBudWxsKSB8fCAocHJlZml4Lmxlbmd0aCgpID09IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQocHJlZml4KS5hcHBlbmQoIjoiKS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhzdHJpbmdUb1dyaXRlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotCi0gICAgICAgICAvKioKLSAgICAgICAgICogUmVnaXN0ZXIgYSBuYW1lc3BhY2UgcHJlZml4Ci0gICAgICAgICAqLwotICAgICAgICAgcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHJlZ2lzdGVyUHJlZml4KGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoeG1sV3JpdGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHByZWZpeDsKLSAgICAgICAgICAgIH0KLQotCi0gIAotICAgICAgICAvKioKLSAgICAgICAgKiBkYXRhYmluZGluZyBtZXRob2QgdG8gZ2V0IGFuIFhNTCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdAotICAgICAgICAqCi0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciBnZXRQdWxsUGFyc2VyKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcU5hbWUpCi0gICAgICAgICAgICAgICAgICAgIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGVsZW1lbnRMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBhdHRyaWJMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXIuRUxFTUVOVF9URVhUKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxfZG91YmxlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlckltcGwocU5hbWUsIGVsZW1lbnRMaXN0LnRvQXJyYXkoKSwgYXR0cmliTGlzdC50b0FycmF5KCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgCi0KLSAgICAgLyoqCi0gICAgICAqICBGYWN0b3J5IGNsYXNzIHRoYXQga2VlcHMgdGhlIHBhcnNlIG1ldGhvZAotICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3Rvcnl7Ci0KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgX2RvdWJsZSBmcm9tU3RyaW5nKGphdmEubGFuZy5TdHJpbmcgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkpewotICAgICAgICAgICAgICAgICAgICBfZG91YmxlIHJldHVyblZhbHVlID0gbmV3ICBfZG91YmxlKCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlLnNldF9kb3VibGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9Eb3VibGUodmFsdWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIF9kb3VibGUgZnJvbVN0cmluZyhqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudC5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IGNvbnRlbnQuc3Vic3RyaW5nKDAsY29udGVudC5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVcmkgPSB4bWxTdHJlYW1SZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9kb3VibGUuRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsbmFtZXNwYWNlVXJpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9kb3VibGUuRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsIiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAKLQotICAgICAgICAvKioKLSAgICAgICAgKiBzdGF0aWMgbWV0aG9kIHRvIGNyZWF0ZSB0aGUgb2JqZWN0Ci0gICAgICAgICogUHJlY29uZGl0aW9uOiAgSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIGN1cnJlbnQgb3IgbmV4dCBzdGFydCBlbGVtZW50IHN0YXJ0cyB0aGlzIG9iamVjdCBhbmQgYW55IGludGVydmVuaW5nIHJlYWRlciBldmVudHMgYXJlIGlnbm9yYWJsZQotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIG5vdCBhbiBlbGVtZW50LCBpdCBpcyBhIGNvbXBsZXggdHlwZSBhbmQgdGhlIHJlYWRlciBpcyBhdCB0aGUgZXZlbnQganVzdCBhZnRlciB0aGUgb3V0ZXIgc3RhcnQgZWxlbWVudAotICAgICAgICAqIFBvc3Rjb25kaXRpb246IElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCBpdHMgZW5kIGVsZW1lbnQKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBhIGNvbXBsZXggdHlwZSwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IHRoZSBlbmQgZWxlbWVudCBvZiBpdHMgb3V0ZXIgZWxlbWVudAotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIF9kb3VibGUgcGFyc2UoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIF9kb3VibGUgb2JqZWN0ID0KLSAgICAgICAgICAgICAgICBuZXcgX2RvdWJsZSgpOwotCi0gICAgICAgICAgICBpbnQgZXZlbnQ7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5pbGxhYmxlVmFsdWUgPSBudWxsOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSIiOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2V1cmkgPSIiOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSAoIXJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICYmICFyZWFkZXIuaXNFbmRFbGVtZW50KCkpCi0gICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiKSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGZ1bGxUeXBlTmFtZSA9IHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiKTsKLSAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUhPW51bGwpewotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zUHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoMCxmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IG5zUHJlZml4PT1udWxsPyIiOm5zUHJlZml4OwotCi0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgdHlwZSA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSsxKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEiZG91YmxlIi5lcXVhbHModHlwZSkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2ZpbmQgbmFtZXNwYWNlIGZvciB0aGUgcHJlZml4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNVcmkgPSByZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShuc1ByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoX2RvdWJsZSlvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZy5FeHRlbnNpb25NYXBwZXIuZ2V0VHlwZU9iamVjdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc1VyaSx0eXBlLHJlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBOb3RlIGFsbCBhdHRyaWJ1dGVzIHRoYXQgd2VyZSBoYW5kbGVkLiBVc2VkIHRvIGRpZmZlciBub3JtYWwgYXR0cmlidXRlcwotICAgICAgICAgICAgICAgIC8vIGZyb20gYW55QXR0cmlidXRlcy4KLSAgICAgICAgICAgICAgICBqYXZhLnV0aWwuVmVjdG9yIGhhbmRsZWRBdHRyaWJ1dGVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSghcmVhZGVyLmlzRW5kRWxlbWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCA9IHJlYWRlci5nZXRFbGVtZW50VGV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldF9kb3VibGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb0RvdWJsZShjb250ZW50KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gRW5kIG9mIGlmIGZvciBleHBlY3RlZCBwcm9wZXJ0eSBzdGFydCBlbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgc3RhcnQgZWxlbWVudCB3ZSBhcmUgbm90IGV4cGVjdGluZyBpbmRpY2F0ZXMgYW4gaW52YWxpZCBwYXJhbWV0ZXIgd2FzIHBhc3NlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiVW5leHBlY3RlZCBzdWJlbGVtZW50ICIgKyByZWFkZXIuZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIGVuZCBvZiB3aGlsZSBsb29wCi0gICAgICAgICAgICAgICAgICAgICAgICAKLQotCi0KLSAgICAgICAgICAgIH0gY2F0Y2ggKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5sYW5nLkV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG9iamVjdDsKLSAgICAgICAgfQotCi0gICAgICAgIH0vL2VuZCBvZiBmYWN0b3J5IGNsYXNzCi0KLSAgICAgICAgCi0KLSAgICAgICAgfQotICAgICAgICAgICAKLSAgICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL19mbG9hdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9fZmxvYXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2MyMTcxMC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL19mbG9hdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDk1ICswLDAgQEAKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBfZmxvYXQuamF2YQotICoKLSAqIFRoaXMgZmlsZSB3YXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBXU0RMCi0gKiBieSB0aGUgQXBhY2hlIEF4aXMyIHZlcnNpb246IFNOQVBTSE9UICBCdWlsdCBvbiA6IERlYyAyMSwgMjAwNyAoMDQ6MDM6MzAgTEtUKQotICovCi0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBwYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nOwotICAgICAgICAgICAgCi0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiAgX2Zsb2F0IGJlYW4gY2xhc3MKLSAgICAgICAgICAgICovCi0gICAgICAgIAotICAgICAgICBwdWJsaWMgIGNsYXNzIF9mbG9hdAotICAgICAgICBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCQmVhbnsKLSAgICAgICAgLyogVGhpcyB0eXBlIHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgcGllY2Ugb2Ygc2NoZW1hIHRoYXQgaGFkCi0gICAgICAgICAgICAgICAgbmFtZSA9IGZsb2F0Ci0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFVSSSA9IGh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFByZWZpeCA9IG5zMQotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdlbmVyYXRlUHJlZml4KGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB7Ci0gICAgICAgICAgICBpZihuYW1lc3BhY2UuZXF1YWxzKCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIpKXsKLSAgICAgICAgICAgICAgICByZXR1cm4gIlNPQVAtRU5DIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBmaWVsZCBmb3IgX2Zsb2F0Ci0gICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBmbG9hdCBsb2NhbF9mbG9hdCA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgZ2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIGZsb2F0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljICBmbG9hdCBnZXRfZmxvYXQoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxfZmxvYXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBzZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gcGFyYW0gX2Zsb2F0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRfZmxvYXQoZmxvYXQgcGFyYW0pewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2FsX2Zsb2F0PXBhcmFtOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxfZmxvYXQgKyAiIjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgIC8qKgotICAgICAqIGlzUmVhZGVyTVRPTUF3YXJlCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSByZWFkZXIgc3VwcG9ydHMgTVRPTQotICAgICAqLwotICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgewotICAgICAgICBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICB0cnl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBqYXZhLmxhbmcuQm9vbGVhbi5UUlVFLmVxdWFscyhyZWFkZXIuZ2V0UHJvcGVydHkob3JnLmFwYWNoZS5heGlvbS5vbS5PTUNvbnN0YW50cy5JU19EQVRBX0hBTkRMRVJTX0FXQVJFKSk7Ci0gICAgICAgIH1jYXRjaChqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlzUmVhZGVyTVRPTUF3YXJlOwotICAgfQotICAgICAKLSAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAqCi0gICAgICAgICogQHBhcmFtIHBhcmVudFFOYW1lCi0gICAgICAgICogQHBhcmFtIGZhY3RvcnkKLSAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgcHVibGljIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IGdldE9NRWxlbWVudCAoCi0gICAgICAgICAgICAgICBmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSkgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZSBkYXRhU291cmNlID0KLSAgICAgICAgICAgICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRGF0YVNvdXJjZSh0aGlzLHBhcmVudFFOYW1lKXsKLQotICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgX2Zsb2F0LnRoaXMuc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmxsb20uT01Tb3VyY2VkRWxlbWVudEltcGwoCi0gICAgICAgICAgICAgICBwYXJlbnRRTmFtZSxmYWN0b3J5LGRhdGFTb3VyY2UpOwotICAgICAgICAgICAgCi0gICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyLGZhbHNlKTsKLSAgICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VyaWFsaXplVHlwZSkKLSAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLQotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBwYXJlbnRRTmFtZS5nZXRQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlID0gcGFyZW50UU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2UgIT0gbnVsbCkgJiYgKG5hbWVzcGFjZS50cmltKCkubGVuZ3RoKCkgPiAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB3cml0ZXJQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAod3JpdGVyUHJlZml4ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQobmFtZXNwYWNlLCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwcmVmaXgsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICBpZiAoc2VyaWFsaXplVHlwZSl7Ci0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iKTsKLSAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZVByZWZpeCAhPSBudWxsKSAmJiAobmFtZXNwYWNlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApKXsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VQcmVmaXgrIjpmbG9hdCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgImZsb2F0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGphdmEubGFuZy5GbG9hdC5pc05hTihsb2NhbF9mbG9hdCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiZmxvYXQgY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsX2Zsb2F0KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGggdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgcHJlZml4LGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgaWYgKHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotCi0gICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotCi0gICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSwgamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVOYW1lc3BhY2UgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgoYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVZhbHVlOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IGF0dHJpYnV0ZVByZWZpeCArICI6IiArIHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLCBhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAvKioKLSAgICAgICAgICogIG1ldGhvZCB0byBoYW5kbGUgUW5hbWVzCi0gICAgICAgICAqLwotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHByZWZpeCArICI6IiArIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBpLmUgdGhpcyBpcyB0aGUgZGVmYXVsdCBuYW1lc3BhY2UKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVzKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWVbXSBxbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgIGlmIChxbmFtZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gc3RvcmUgdGhpcyBkYXRhIHVudGlsIGxhc3QgbW9tZW50IHNpbmNlIGl0IGlzIG5vdCBwb3NzaWJsZSB0byB3cml0ZSBhbnkKLSAgICAgICAgICAgICAgICAvLyBuYW1lc3BhY2UgZGF0YSBhZnRlciB3cml0aW5nIHRoZSBjaGFyYWN0b3IgZGF0YQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmdCdWZmZXIgc3RyaW5nVG9Xcml0ZSA9IG5ldyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcW5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQoIiAiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VVUkkgPSBxbmFtZXNbaV0uZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwcmVmaXggPT0gbnVsbCkgfHwgKHByZWZpeC5sZW5ndGgoKSA9PSAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKHByZWZpeCkuYXBwZW5kKCI6IikuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMoc3RyaW5nVG9Xcml0ZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAqIFJlZ2lzdGVyIGEgbmFtZXNwYWNlIHByZWZpeAotICAgICAgICAgKi8KLSAgICAgICAgIHByaXZhdGUgamF2YS5sYW5nLlN0cmluZyByZWdpc3RlclByZWZpeChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHhtbFdyaXRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiBwcmVmaXg7Ci0gICAgICAgICAgICB9Ci0KLQotICAKLSAgICAgICAgLyoqCi0gICAgICAgICogZGF0YWJpbmRpbmcgbWV0aG9kIHRvIGdldCBhbiBYTUwgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QKLSAgICAgICAgKgotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgZ2V0UHVsbFBhcnNlcihqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFOYW1lKQotICAgICAgICAgICAgICAgICAgICB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBlbGVtZW50TGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgYXR0cmliTGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVyLkVMRU1FTlRfVEVYVCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsX2Zsb2F0KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlckltcGwocU5hbWUsIGVsZW1lbnRMaXN0LnRvQXJyYXkoKSwgYXR0cmliTGlzdC50b0FycmF5KCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgCi0KLSAgICAgLyoqCi0gICAgICAqICBGYWN0b3J5IGNsYXNzIHRoYXQga2VlcHMgdGhlIHBhcnNlIG1ldGhvZAotICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3Rvcnl7Ci0KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgX2Zsb2F0IGZyb21TdHJpbmcoamF2YS5sYW5nLlN0cmluZyB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSl7Ci0gICAgICAgICAgICAgICAgICAgIF9mbG9hdCByZXR1cm5WYWx1ZSA9IG5ldyAgX2Zsb2F0KCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlLnNldF9mbG9hdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb0Zsb2F0KHZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBfZmxvYXQgZnJvbVN0cmluZyhqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudC5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IGNvbnRlbnQuc3Vic3RyaW5nKDAsY29udGVudC5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVcmkgPSB4bWxTdHJlYW1SZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9mbG9hdC5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCxuYW1lc3BhY2VVcmkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2Zsb2F0LkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LCIiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgCi0KLSAgICAgICAgLyoqCi0gICAgICAgICogc3RhdGljIG1ldGhvZCB0byBjcmVhdGUgdGhlIG9iamVjdAotICAgICAgICAqIFByZWNvbmRpdGlvbjogIElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSBjdXJyZW50IG9yIG5leHQgc3RhcnQgZWxlbWVudCBzdGFydHMgdGhpcyBvYmplY3QgYW5kIGFueSBpbnRlcnZlbmluZyByZWFkZXIgZXZlbnRzIGFyZSBpZ25vcmFibGUKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBub3QgYW4gZWxlbWVudCwgaXQgaXMgYSBjb21wbGV4IHR5cGUgYW5kIHRoZSByZWFkZXIgaXMgYXQgdGhlIGV2ZW50IGp1c3QgYWZ0ZXIgdGhlIG91dGVyIHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgKiBQb3N0Y29uZGl0aW9uOiBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgaXRzIGVuZCBlbGVtZW50Ci0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgYSBjb21wbGV4IHR5cGUsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCB0aGUgZW5kIGVsZW1lbnQgb2YgaXRzIG91dGVyIGVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBfZmxvYXQgcGFyc2UoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIF9mbG9hdCBvYmplY3QgPQotICAgICAgICAgICAgICAgIG5ldyBfZmxvYXQoKTsKLQotICAgICAgICAgICAgaW50IGV2ZW50OwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuaWxsYWJsZVZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0iIjsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNldXJpID0iIjsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUgKCFyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAmJiAhcmVhZGVyLmlzRW5kRWxlbWVudCgpKQotICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIikhPW51bGwpewotICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBmdWxsVHlwZU5hbWUgPSByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIik7Ci0gICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1ByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKDAsZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBuc1ByZWZpeD09bnVsbD8iIjpuc1ByZWZpeDsKLQotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHR5cGUgPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikrMSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghImZsb2F0Ii5lcXVhbHModHlwZSkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2ZpbmQgbmFtZXNwYWNlIGZvciB0aGUgcHJlZml4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNVcmkgPSByZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShuc1ByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoX2Zsb2F0KW9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLkV4dGVuc2lvbk1hcHBlci5nZXRUeXBlT2JqZWN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zVXJpLHR5cGUscmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIE5vdGUgYWxsIGF0dHJpYnV0ZXMgdGhhdCB3ZXJlIGhhbmRsZWQuIFVzZWQgdG8gZGlmZmVyIG5vcm1hbCBhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgICAgLy8gZnJvbSBhbnlBdHRyaWJ1dGVzLgotICAgICAgICAgICAgICAgIGphdmEudXRpbC5WZWN0b3IgaGFuZGxlZEF0dHJpYnV0ZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlKCFyZWFkZXIuaXNFbmRFbGVtZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50ID0gcmVhZGVyLmdldEVsZW1lbnRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0X2Zsb2F0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9GbG9hdChjb250ZW50KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gRW5kIG9mIGlmIGZvciBleHBlY3RlZCBwcm9wZXJ0eSBzdGFydCBlbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgc3RhcnQgZWxlbWVudCB3ZSBhcmUgbm90IGV4cGVjdGluZyBpbmRpY2F0ZXMgYW4gaW52YWxpZCBwYXJhbWV0ZXIgd2FzIHBhc3NlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiVW5leHBlY3RlZCBzdWJlbGVtZW50ICIgKyByZWFkZXIuZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIGVuZCBvZiB3aGlsZSBsb29wCi0gICAgICAgICAgICAgICAgICAgICAgICAKLQotCi0KLSAgICAgICAgICAgIH0gY2F0Y2ggKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5sYW5nLkV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG9iamVjdDsKLSAgICAgICAgfQotCi0gICAgICAgIH0vL2VuZCBvZiBmYWN0b3J5IGNsYXNzCi0KLSAgICAgICAgCi0KLSAgICAgICAgfQotICAgICAgICAgICAKLSAgICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL19pbnQuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvX2ludC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDE2ZmUxLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvX2ludC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDc0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICogX2ludC5qYXZhCi0gKgotICogVGhpcyBmaWxlIHdhcyBhdXRvLWdlbmVyYXRlZCBmcm9tIFdTREwKLSAqIGJ5IHRoZSBBcGFjaGUgQXhpczIgdmVyc2lvbjogU05BUFNIT1QgIEJ1aWx0IG9uIDogRGVjIDIxLCAyMDA3ICgwNDowMzozMCBMS1QpCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZzsKLQotCi0vKioKLSAqIF9pbnQgYmVhbiBjbGFzcwotICovCi0KLXB1YmxpYyBjbGFzcyBfaW50Ci0gICAgICAgIGltcGxlbWVudHMgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJCZWFuIHsKLSAgICAvKiBUaGlzIHR5cGUgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBwaWVjZSBvZiBzY2hlbWEgdGhhdCBoYWQKLSAgICBuYW1lID0gaW50Ci0gICAgTmFtZXNwYWNlIFVSSSA9IGh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvCi0gICAgTmFtZXNwYWNlIFByZWZpeCA9IG5zMQotICAgICovCi0KLQotICAgIHByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2VuZXJhdGVQcmVmaXgoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHsKLSAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIikpIHsKLSAgICAgICAgICAgIHJldHVybiAiU09BUC1FTkMiOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogZmllbGQgZm9yIF9pbnQKLSAgICAgKi8KLQotCi0gICAgcHJvdGVjdGVkIGludCBsb2NhbF9pbnQ7Ci0KLQotICAgIC8qKgotICAgICAqIEF1dG8gZ2VuZXJhdGVkIGdldHRlciBtZXRob2QKLSAgICAgKgotICAgICAqIEByZXR1cm4gaW50Ci0gICAgICovCi0gICAgcHVibGljIGludCBnZXRfaW50KCkgewotICAgICAgICByZXR1cm4gbG9jYWxfaW50OwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQXV0byBnZW5lcmF0ZWQgc2V0dGVyIG1ldGhvZAotICAgICAqCi0gICAgICogQHBhcmFtIHBhcmFtIF9pbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRfaW50KGludCBwYXJhbSkgewotCi0gICAgICAgIHRoaXMubG9jYWxfaW50ID0gcGFyYW07Ci0KLQotICAgIH0KLQotCi0gICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKSB7Ci0KLSAgICAgICAgcmV0dXJuIGxvY2FsX2ludCArICIiOwotCi0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBpc1JlYWRlck1UT01Bd2FyZQotICAgICAqCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSByZWFkZXIgc3VwcG9ydHMgTVRPTQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKLSAgICAgICAgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGphdmEubGFuZy5Cb29sZWFuLlRSVUUuZXF1YWxzKHJlYWRlci5nZXRQcm9wZXJ0eShvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQ29uc3RhbnRzLklTX0RBVEFfSEFORExFUlNfQVdBUkUpKTsKLSAgICAgICAgfSBjYXRjaCAoamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpc1JlYWRlck1UT01Bd2FyZTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBwYXJlbnRRTmFtZQotICAgICAqIEBwYXJhbSBmYWN0b3J5Ci0gICAgICogQHJldHVybiBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudAotICAgICAqLwotICAgIHB1YmxpYyBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCBnZXRPTUVsZW1lbnQoCi0gICAgICAgICAgICBmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSkgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uIHsKLQotCi0gICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlIGRhdGFTb3VyY2UgPQotICAgICAgICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkRhdGFTb3VyY2UodGhpcywgcGFyZW50UU5hbWUpIHsKLQotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIF9pbnQudGhpcy5zZXJpYWxpemUocGFyZW50UU5hbWUsIGZhY3RvcnksIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9OwotICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5sbG9tLk9NU291cmNlZEVsZW1lbnRJbXBsKAotICAgICAgICAgICAgICAgIHBhcmVudFFOYW1lLCBmYWN0b3J5LCBkYXRhU291cmNlKTsKLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKQotICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbiB7Ci0gICAgICAgIHNlcmlhbGl6ZShwYXJlbnRRTmFtZSwgZmFjdG9yeSwgeG1sV3JpdGVyLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VyaWFsaXplVHlwZSkKLSAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24gewotCi0KLSAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSA9IG51bGw7Ci0KLQotICAgICAgICBwcmVmaXggPSBwYXJlbnRRTmFtZS5nZXRQcmVmaXgoKTsKLSAgICAgICAgbmFtZXNwYWNlID0gcGFyZW50UU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLSAgICAgICAgaWYgKChuYW1lc3BhY2UgIT0gbnVsbCkgJiYgKG5hbWVzcGFjZS50cmltKCkubGVuZ3RoKCkgPiAwKSkgewotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB3cml0ZXJQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICBpZiAod3JpdGVyUHJlZml4ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQobmFtZXNwYWNlLCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwcmVmaXgsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNlcmlhbGl6ZVR5cGUpIHsKLQotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIpOwotICAgICAgICAgICAgaWYgKChuYW1lc3BhY2VQcmVmaXggIT0gbnVsbCkgJiYgKG5hbWVzcGFjZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSkgewotICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCAidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VQcmVmaXggKyAiOmludCIsCi0gICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwgInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgImludCIsCi0gICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgfQotCi0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChsb2NhbF9pbnQgPT0gamF2YS5sYW5nLkludGVnZXIuTUlOX1ZBTFVFKSB7Ci0KLSAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiaW50IGNhbm5vdCBiZSBudWxsISEiKTsKLQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsX2ludCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgeG1sV3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotCi0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aCB0aGUgbnMgcHJlZml4Ci0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgcHJlZml4LCBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSwgamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICh4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSkgPT0gbnVsbCkgewotICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotCi0gICAgICAgIH0KLQotICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLCBhdHROYW1lLCBhdHRWYWx1ZSk7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLCBqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSwgYXR0VmFsdWUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSwgYXR0TmFtZSwgYXR0VmFsdWUpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsIGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVOYW1lc3BhY2UgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgYXR0cmlidXRlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICB9Ci0gICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlVmFsdWU7Ci0gICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBhdHRyaWJ1dGVQcmVmaXggKyAiOiIgKyBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLCBhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBtZXRob2QgdG8gaGFuZGxlIFFuYW1lcwotICAgICAqLwotCi0gICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWUoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMocHJlZml4ICsgIjoiICsgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBpLmUgdGhpcyBpcyB0aGUgZGVmYXVsdCBuYW1lc3BhY2UKLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZXMoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZVtdIHFuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgIGlmIChxbmFtZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBzdG9yZSB0aGlzIGRhdGEgdW50aWwgbGFzdCBtb21lbnQgc2luY2UgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHdyaXRlIGFueQotICAgICAgICAgICAgLy8gbmFtZXNwYWNlIGRhdGEgYWZ0ZXIgd3JpdGluZyB0aGUgY2hhcmFjdG9yIGRhdGEKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmdCdWZmZXIgc3RyaW5nVG9Xcml0ZSA9IG5ldyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IG51bGw7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcW5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKCIgIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG5hbWVzcGFjZVVSSSA9IHFuYW1lc1tpXS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoKHByZWZpeCA9PSBudWxsKSB8fCAocHJlZml4Lmxlbmd0aCgpID09IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChwcmVmaXgpLmFwcGVuZCgiOiIpLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhzdHJpbmdUb1dyaXRlLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFJlZ2lzdGVyIGEgbmFtZXNwYWNlIHByZWZpeAotICAgICAqLwotICAgIHByaXZhdGUgamF2YS5sYW5nLlN0cmluZyByZWdpc3RlclByZWZpeChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgIHdoaWxlICh4bWxXcml0ZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBwcmVmaXggPSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcHJlZml4OwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogZGF0YWJpbmRpbmcgbWV0aG9kIHRvIGdldCBhbiBYTUwgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QKLSAgICAgKi8KLSAgICBwdWJsaWMgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgZ2V0UHVsbFBhcnNlcihqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFOYW1lKQotICAgICAgICAgICAgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uIHsKLQotCi0gICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgZWxlbWVudExpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGF0dHJpYkxpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotCi0KLSAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlci5FTEVNRU5UX1RFWFQpOwotCi0gICAgICAgIGVsZW1lbnRMaXN0LmFkZCgKLSAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsX2ludCkpOwotCi0KLSAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXJJbXBsKHFOYW1lLCBlbGVtZW50TGlzdC50b0FycmF5KCksIGF0dHJpYkxpc3QudG9BcnJheSgpKTsKLQotCi0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBGYWN0b3J5IGNsYXNzIHRoYXQga2VlcHMgdGhlIHBhcnNlIG1ldGhvZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeSB7Ci0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIF9pbnQgZnJvbVN0cmluZyhqYXZhLmxhbmcuU3RyaW5nIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSkgewotICAgICAgICAgICAgX2ludCByZXR1cm5WYWx1ZSA9IG5ldyBfaW50KCk7Ci0KLSAgICAgICAgICAgIHJldHVyblZhbHVlLnNldF9pbnQoCi0gICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9JbnQodmFsdWUpKTsKLQotCi0gICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIF9pbnQgZnJvbVN0cmluZyhqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCkgewotICAgICAgICAgICAgaWYgKGNvbnRlbnQuaW5kZXhPZigiOiIpID4gLTEpIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IGNvbnRlbnQuc3Vic3RyaW5nKDAsIGNvbnRlbnQuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVyaSA9IHhtbFN0cmVhbVJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9pbnQuRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsIG5hbWVzcGFjZVVyaSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBfaW50LkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LCAiIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBzdGF0aWMgbWV0aG9kIHRvIGNyZWF0ZSB0aGUgb2JqZWN0Ci0gICAgICAgICAqIFByZWNvbmRpdGlvbjogIElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSBjdXJyZW50IG9yIG5leHQgc3RhcnQgZWxlbWVudCBzdGFydHMgdGhpcyBvYmplY3QgYW5kIGFueSBpbnRlcnZlbmluZyByZWFkZXIgZXZlbnRzIGFyZSBpZ25vcmFibGUKLSAgICAgICAgICogSWYgdGhpcyBvYmplY3QgaXMgbm90IGFuIGVsZW1lbnQsIGl0IGlzIGEgY29tcGxleCB0eXBlIGFuZCB0aGUgcmVhZGVyIGlzIGF0IHRoZSBldmVudCBqdXN0IGFmdGVyIHRoZSBvdXRlciBzdGFydCBlbGVtZW50Ci0gICAgICAgICAqIFBvc3Rjb25kaXRpb246IElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCBpdHMgZW5kIGVsZW1lbnQKLSAgICAgICAgICogSWYgdGhpcyBvYmplY3QgaXMgYSBjb21wbGV4IHR5cGUsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCB0aGUgZW5kIGVsZW1lbnQgb2YgaXRzIG91dGVyIGVsZW1lbnQKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgX2ludCBwYXJzZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIF9pbnQgb2JqZWN0ID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IF9pbnQoKTsKLQotICAgICAgICAgICAgaW50IGV2ZW50OwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuaWxsYWJsZVZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gIiI7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZXVyaSA9ICIiOwotICAgICAgICAgICAgdHJ5IHsKLQotICAgICAgICAgICAgICAgIHdoaWxlICghcmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgJiYgIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkKLSAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLQotCi0gICAgICAgICAgICAgICAgaWYgKHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCAidHlwZSIpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBmdWxsVHlwZU5hbWUgPSByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSIpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNQcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikgPiAtMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZygwLCBmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gbnNQcmVmaXggPT0gbnVsbCA/ICIiIDogbnNQcmVmaXg7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgdHlwZSA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSArIDEpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISJpbnQiLmVxdWFscyh0eXBlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZmluZCBuYW1lc3BhY2UgZm9yIHRoZSBwcmVmaXgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zVXJpID0gcmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkobnNQcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoX2ludCkgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2RpbmcuRXh0ZW5zaW9uTWFwcGVyLmdldFR5cGVPYmplY3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc1VyaSwgdHlwZSwgcmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotCi0gICAgICAgICAgICAgICAgICAgIH0KLQotCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gTm90ZSBhbGwgYXR0cmlidXRlcyB0aGF0IHdlcmUgaGFuZGxlZC4gVXNlZCB0byBkaWZmZXIgbm9ybWFsIGF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgICAvLyBmcm9tIGFueUF0dHJpYnV0ZXMuCi0gICAgICAgICAgICAgICAgamF2YS51dGlsLlZlY3RvciBoYW5kbGVkQXR0cmlidXRlcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0KLQotICAgICAgICAgICAgICAgIHdoaWxlICghcmVhZGVyLmlzRW5kRWxlbWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSB8fCByZWFkZXIuaGFzVGV4dCgpKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSB8fCByZWFkZXIuaGFzVGV4dCgpKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQgPSByZWFkZXIuZ2V0RWxlbWVudFRleHQoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5zZXRfaW50KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb0ludChjb250ZW50KSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIEVuZCBvZiBpZiBmb3IgZXhwZWN0ZWQgcHJvcGVydHkgc3RhcnQgZWxlbWVudAotCi0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHN0YXJ0IGVsZW1lbnQgd2UgYXJlIG5vdCBleHBlY3RpbmcgaW5kaWNhdGVzIGFuIGludmFsaWQgcGFyYW1ldGVyIHdhcyBwYXNzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIlVuZXhwZWN0ZWQgc3ViZWxlbWVudCAiICsgcmVhZGVyLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gIC8vIGVuZCBvZiB3aGlsZSBsb29wCi0KLQotICAgICAgICAgICAgfSBjYXRjaCAoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gb2JqZWN0OwotICAgICAgICB9Ci0KLSAgICB9Ly9lbmQgb2YgZmFjdG9yeSBjbGFzcwotCi0KLX0KLSAgICAgICAgICAgCi0gICAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9fbG9uZy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9fbG9uZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjEyOWNhLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvX2xvbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5NSArMCwwIEBACi0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICogX2xvbmcuamF2YQotICoKLSAqIFRoaXMgZmlsZSB3YXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBXU0RMCi0gKiBieSB0aGUgQXBhY2hlIEF4aXMyIHZlcnNpb246IFNOQVBTSE9UICBCdWlsdCBvbiA6IERlYyAyMSwgMjAwNyAoMDQ6MDM6MzAgTEtUKQotICovCi0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBwYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nOwotICAgICAgICAgICAgCi0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiAgX2xvbmcgYmVhbiBjbGFzcwotICAgICAgICAgICAgKi8KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyAgY2xhc3MgX2xvbmcKLSAgICAgICAgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkJlYW57Ci0gICAgICAgIC8qIFRoaXMgdHlwZSB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIHBpZWNlIG9mIHNjaGVtYSB0aGF0IGhhZAotICAgICAgICAgICAgICAgIG5hbWUgPSBsb25nCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFVSSSA9IGh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFByZWZpeCA9IG5zMQotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdlbmVyYXRlUHJlZml4KGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB7Ci0gICAgICAgICAgICBpZihuYW1lc3BhY2UuZXF1YWxzKCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIpKXsKLSAgICAgICAgICAgICAgICByZXR1cm4gIlNPQVAtRU5DIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBmaWVsZCBmb3IgX2xvbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIGxvbmcgbG9jYWxfbG9uZyA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgZ2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIGxvbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgIGxvbmcgZ2V0X2xvbmcoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxfbG9uZzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIHNldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSBwYXJhbSBfbG9uZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0X2xvbmcobG9uZyBwYXJhbSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYWxfbG9uZz1wYXJhbTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsX2xvbmcgKyAiIjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgIC8qKgotICAgICAqIGlzUmVhZGVyTVRPTUF3YXJlCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSByZWFkZXIgc3VwcG9ydHMgTVRPTQotICAgICAqLwotICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgewotICAgICAgICBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICB0cnl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBqYXZhLmxhbmcuQm9vbGVhbi5UUlVFLmVxdWFscyhyZWFkZXIuZ2V0UHJvcGVydHkob3JnLmFwYWNoZS5heGlvbS5vbS5PTUNvbnN0YW50cy5JU19EQVRBX0hBTkRMRVJTX0FXQVJFKSk7Ci0gICAgICAgIH1jYXRjaChqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlzUmVhZGVyTVRPTUF3YXJlOwotICAgfQotICAgICAKLSAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAqCi0gICAgICAgICogQHBhcmFtIHBhcmVudFFOYW1lCi0gICAgICAgICogQHBhcmFtIGZhY3RvcnkKLSAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgcHVibGljIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IGdldE9NRWxlbWVudCAoCi0gICAgICAgICAgICAgICBmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSkgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZSBkYXRhU291cmNlID0KLSAgICAgICAgICAgICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRGF0YVNvdXJjZSh0aGlzLHBhcmVudFFOYW1lKXsKLQotICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgX2xvbmcudGhpcy5zZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5PTVNvdXJjZWRFbGVtZW50SW1wbCgKLSAgICAgICAgICAgICAgIHBhcmVudFFOYW1lLGZhY3RvcnksZGF0YVNvdXJjZSk7Ci0gICAgICAgICAgICAKLSAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIsZmFsc2UpOwotICAgICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzZXJpYWxpemVUeXBlKQotICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotCi0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UgPSBudWxsOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHBhcmVudFFOYW1lLmdldFByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UgPSBwYXJlbnRRTmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZSAhPSBudWxsKSAmJiAobmFtZXNwYWNlLnRyaW0oKS5sZW5ndGgoKSA+IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHdyaXRlclByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3cml0ZXJQcmVmaXggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChuYW1lc3BhY2UsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHByZWZpeCwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCksIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIGlmIChzZXJpYWxpemVUeXBlKXsKLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIpOwotICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlUHJlZml4ICE9IG51bGwpICYmIChuYW1lc3BhY2VQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkpewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVByZWZpeCsiOmxvbmciLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJsb25nIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsX2xvbmc9PWphdmEubGFuZy5Mb25nLk1JTl9WQUxVRSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJsb25nIGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbF9sb25nKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGggdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgcHJlZml4LGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgaWYgKHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotCi0gICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotCi0gICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSwgamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVOYW1lc3BhY2UgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgoYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVZhbHVlOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IGF0dHJpYnV0ZVByZWZpeCArICI6IiArIHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLCBhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAvKioKLSAgICAgICAgICogIG1ldGhvZCB0byBoYW5kbGUgUW5hbWVzCi0gICAgICAgICAqLwotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHByZWZpeCArICI6IiArIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBpLmUgdGhpcyBpcyB0aGUgZGVmYXVsdCBuYW1lc3BhY2UKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVzKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWVbXSBxbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgIGlmIChxbmFtZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gc3RvcmUgdGhpcyBkYXRhIHVudGlsIGxhc3QgbW9tZW50IHNpbmNlIGl0IGlzIG5vdCBwb3NzaWJsZSB0byB3cml0ZSBhbnkKLSAgICAgICAgICAgICAgICAvLyBuYW1lc3BhY2UgZGF0YSBhZnRlciB3cml0aW5nIHRoZSBjaGFyYWN0b3IgZGF0YQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmdCdWZmZXIgc3RyaW5nVG9Xcml0ZSA9IG5ldyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcW5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQoIiAiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VVUkkgPSBxbmFtZXNbaV0uZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwcmVmaXggPT0gbnVsbCkgfHwgKHByZWZpeC5sZW5ndGgoKSA9PSAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKHByZWZpeCkuYXBwZW5kKCI6IikuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMoc3RyaW5nVG9Xcml0ZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAqIFJlZ2lzdGVyIGEgbmFtZXNwYWNlIHByZWZpeAotICAgICAgICAgKi8KLSAgICAgICAgIHByaXZhdGUgamF2YS5sYW5nLlN0cmluZyByZWdpc3RlclByZWZpeChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHhtbFdyaXRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiBwcmVmaXg7Ci0gICAgICAgICAgICB9Ci0KLQotICAKLSAgICAgICAgLyoqCi0gICAgICAgICogZGF0YWJpbmRpbmcgbWV0aG9kIHRvIGdldCBhbiBYTUwgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QKLSAgICAgICAgKgotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgZ2V0UHVsbFBhcnNlcihqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFOYW1lKQotICAgICAgICAgICAgICAgICAgICB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBlbGVtZW50TGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgYXR0cmliTGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVyLkVMRU1FTlRfVEVYVCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsX2xvbmcpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVySW1wbChxTmFtZSwgZWxlbWVudExpc3QudG9BcnJheSgpLCBhdHRyaWJMaXN0LnRvQXJyYXkoKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAKLQotICAgICAvKioKLSAgICAgICogIEZhY3RvcnkgY2xhc3MgdGhhdCBrZWVwcyB0aGUgcGFyc2UgbWV0aG9kCi0gICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeXsKLQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBfbG9uZyBmcm9tU3RyaW5nKGphdmEubGFuZy5TdHJpbmcgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkpewotICAgICAgICAgICAgICAgICAgICBfbG9uZyByZXR1cm5WYWx1ZSA9IG5ldyAgX2xvbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUuc2V0X2xvbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9Mb25nKHZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBfbG9uZyBmcm9tU3RyaW5nKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50LmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gY29udGVudC5zdWJzdHJpbmcoMCxjb250ZW50LmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVyaSA9IHhtbFN0cmVhbVJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2xvbmcuRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsbmFtZXNwYWNlVXJpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9sb25nLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LCIiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgCi0KLSAgICAgICAgLyoqCi0gICAgICAgICogc3RhdGljIG1ldGhvZCB0byBjcmVhdGUgdGhlIG9iamVjdAotICAgICAgICAqIFByZWNvbmRpdGlvbjogIElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSBjdXJyZW50IG9yIG5leHQgc3RhcnQgZWxlbWVudCBzdGFydHMgdGhpcyBvYmplY3QgYW5kIGFueSBpbnRlcnZlbmluZyByZWFkZXIgZXZlbnRzIGFyZSBpZ25vcmFibGUKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBub3QgYW4gZWxlbWVudCwgaXQgaXMgYSBjb21wbGV4IHR5cGUgYW5kIHRoZSByZWFkZXIgaXMgYXQgdGhlIGV2ZW50IGp1c3QgYWZ0ZXIgdGhlIG91dGVyIHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgKiBQb3N0Y29uZGl0aW9uOiBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgaXRzIGVuZCBlbGVtZW50Ci0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgYSBjb21wbGV4IHR5cGUsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCB0aGUgZW5kIGVsZW1lbnQgb2YgaXRzIG91dGVyIGVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBfbG9uZyBwYXJzZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uewotICAgICAgICAgICAgX2xvbmcgb2JqZWN0ID0KLSAgICAgICAgICAgICAgICBuZXcgX2xvbmcoKTsKLQotICAgICAgICAgICAgaW50IGV2ZW50OwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuaWxsYWJsZVZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0iIjsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNldXJpID0iIjsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUgKCFyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAmJiAhcmVhZGVyLmlzRW5kRWxlbWVudCgpKQotICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIikhPW51bGwpewotICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBmdWxsVHlwZU5hbWUgPSByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIik7Ci0gICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1ByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKDAsZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBuc1ByZWZpeD09bnVsbD8iIjpuc1ByZWZpeDsKLQotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHR5cGUgPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikrMSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghImxvbmciLmVxdWFscyh0eXBlKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZmluZCBuYW1lc3BhY2UgZm9yIHRoZSBwcmVmaXgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1VyaSA9IHJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKG5zUHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChfbG9uZylvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZy5FeHRlbnNpb25NYXBwZXIuZ2V0VHlwZU9iamVjdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc1VyaSx0eXBlLHJlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBOb3RlIGFsbCBhdHRyaWJ1dGVzIHRoYXQgd2VyZSBoYW5kbGVkLiBVc2VkIHRvIGRpZmZlciBub3JtYWwgYXR0cmlidXRlcwotICAgICAgICAgICAgICAgIC8vIGZyb20gYW55QXR0cmlidXRlcy4KLSAgICAgICAgICAgICAgICBqYXZhLnV0aWwuVmVjdG9yIGhhbmRsZWRBdHRyaWJ1dGVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSghcmVhZGVyLmlzRW5kRWxlbWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCA9IHJlYWRlci5nZXRFbGVtZW50VGV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldF9sb25nKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9Mb25nKGNvbnRlbnQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBFbmQgb2YgaWYgZm9yIGV4cGVjdGVkIHByb3BlcnR5IHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2V7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBzdGFydCBlbGVtZW50IHdlIGFyZSBub3QgZXhwZWN0aW5nIGluZGljYXRlcyBhbiBpbnZhbGlkIHBhcmFtZXRlciB3YXMgcGFzc2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJVbmV4cGVjdGVkIHN1YmVsZW1lbnQgIiArIHJlYWRlci5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gZW5kIG9mIHdoaWxlIGxvb3AKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0KLQotICAgICAgICAgICAgfSBjYXRjaCAoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gb2JqZWN0OwotICAgICAgICB9Ci0KLSAgICAgICAgfS8vZW5kIG9mIGZhY3RvcnkgY2xhc3MKLQotICAgICAgICAKLQotICAgICAgICB9Ci0gICAgICAgICAgIAotICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvX3Nob3J0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL19zaG9ydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTJlMmMzLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvX3Nob3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OTUgKzAsMCBAQAotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIF9zaG9ydC5qYXZhCi0gKgotICogVGhpcyBmaWxlIHdhcyBhdXRvLWdlbmVyYXRlZCBmcm9tIFdTREwKLSAqIGJ5IHRoZSBBcGFjaGUgQXhpczIgdmVyc2lvbjogU05BUFNIT1QgIEJ1aWx0IG9uIDogRGVjIDIxLCAyMDA3ICgwNDowMzozMCBMS1QpCi0gKi8KLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2Rpbmc7Ci0gICAgICAgICAgICAKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqICBfc2hvcnQgYmVhbiBjbGFzcwotICAgICAgICAgICAgKi8KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyAgY2xhc3MgX3Nob3J0Ci0gICAgICAgIGltcGxlbWVudHMgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJCZWFuewotICAgICAgICAvKiBUaGlzIHR5cGUgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBwaWVjZSBvZiBzY2hlbWEgdGhhdCBoYWQKLSAgICAgICAgICAgICAgICBuYW1lID0gc2hvcnQKLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgVVJJID0gaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8KLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgUHJlZml4ID0gbnMxCi0gICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIAotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2VuZXJhdGVQcmVmaXgoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHsKLSAgICAgICAgICAgIGlmKG5hbWVzcGFjZS5lcXVhbHMoImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIikpewotICAgICAgICAgICAgICAgIHJldHVybiAiU09BUC1FTkMiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgIH0KLQotICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIGZpZWxkIGZvciBfc2hvcnQKLSAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIHNob3J0IGxvY2FsX3Nob3J0IDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBnZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gc2hvcnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgIHNob3J0IGdldF9zaG9ydCgpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbF9zaG9ydDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIHNldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSBwYXJhbSBfc2hvcnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldF9zaG9ydChzaG9ydCBwYXJhbSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYWxfc2hvcnQ9cGFyYW07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbF9zaG9ydCArICIiOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgLyoqCi0gICAgICogaXNSZWFkZXJNVE9NQXdhcmUKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlYWRlciBzdXBwb3J0cyBNVE9NCi0gICAgICovCi0gICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIHRyeXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGphdmEubGFuZy5Cb29sZWFuLlRSVUUuZXF1YWxzKHJlYWRlci5nZXRQcm9wZXJ0eShvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQ29uc3RhbnRzLklTX0RBVEFfSEFORExFUlNfQVdBUkUpKTsKLSAgICAgICAgfWNhdGNoKGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXNSZWFkZXJNVE9NQXdhcmU7Ci0gICB9Ci0gICAgIAotICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICoKLSAgICAgICAgKiBAcGFyYW0gcGFyZW50UU5hbWUKLSAgICAgICAgKiBAcGFyYW0gZmFjdG9yeQotICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICBwdWJsaWMgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgZ2V0T01FbGVtZW50ICgKLSAgICAgICAgICAgICAgIGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5KSB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlIGRhdGFTb3VyY2UgPQotICAgICAgICAgICAgICAgICAgICAgICBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJEYXRhU291cmNlKHRoaXMscGFyZW50UU5hbWUpewotCi0gICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICBfc2hvcnQudGhpcy5zZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5PTVNvdXJjZWRFbGVtZW50SW1wbCgKLSAgICAgICAgICAgICAgIHBhcmVudFFOYW1lLGZhY3RvcnksZGF0YVNvdXJjZSk7Ci0gICAgICAgICAgICAKLSAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIsZmFsc2UpOwotICAgICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzZXJpYWxpemVUeXBlKQotICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotCi0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UgPSBudWxsOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHBhcmVudFFOYW1lLmdldFByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UgPSBwYXJlbnRRTmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZSAhPSBudWxsKSAmJiAobmFtZXNwYWNlLnRyaW0oKS5sZW5ndGgoKSA+IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHdyaXRlclByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3cml0ZXJQcmVmaXggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChuYW1lc3BhY2UsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHByZWZpeCwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCksIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIGlmIChzZXJpYWxpemVUeXBlKXsKLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIpOwotICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlUHJlZml4ICE9IG51bGwpICYmIChuYW1lc3BhY2VQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkpewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVByZWZpeCsiOnNob3J0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAic2hvcnQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxfc2hvcnQ9PWphdmEubGFuZy5TaG9ydC5NSU5fVkFMVUUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigic2hvcnQgY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsX3Nob3J0KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGggdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgcHJlZml4LGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgaWYgKHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotCi0gICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotCi0gICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSwgamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVOYW1lc3BhY2UgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgoYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVZhbHVlOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IGF0dHJpYnV0ZVByZWZpeCArICI6IiArIHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLCBhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAvKioKLSAgICAgICAgICogIG1ldGhvZCB0byBoYW5kbGUgUW5hbWVzCi0gICAgICAgICAqLwotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHByZWZpeCArICI6IiArIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBpLmUgdGhpcyBpcyB0aGUgZGVmYXVsdCBuYW1lc3BhY2UKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVzKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWVbXSBxbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgIGlmIChxbmFtZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gc3RvcmUgdGhpcyBkYXRhIHVudGlsIGxhc3QgbW9tZW50IHNpbmNlIGl0IGlzIG5vdCBwb3NzaWJsZSB0byB3cml0ZSBhbnkKLSAgICAgICAgICAgICAgICAvLyBuYW1lc3BhY2UgZGF0YSBhZnRlciB3cml0aW5nIHRoZSBjaGFyYWN0b3IgZGF0YQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmdCdWZmZXIgc3RyaW5nVG9Xcml0ZSA9IG5ldyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcW5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQoIiAiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VVUkkgPSBxbmFtZXNbaV0uZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwcmVmaXggPT0gbnVsbCkgfHwgKHByZWZpeC5sZW5ndGgoKSA9PSAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKHByZWZpeCkuYXBwZW5kKCI6IikuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMoc3RyaW5nVG9Xcml0ZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAqIFJlZ2lzdGVyIGEgbmFtZXNwYWNlIHByZWZpeAotICAgICAgICAgKi8KLSAgICAgICAgIHByaXZhdGUgamF2YS5sYW5nLlN0cmluZyByZWdpc3RlclByZWZpeChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHhtbFdyaXRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiBwcmVmaXg7Ci0gICAgICAgICAgICB9Ci0KLQotICAKLSAgICAgICAgLyoqCi0gICAgICAgICogZGF0YWJpbmRpbmcgbWV0aG9kIHRvIGdldCBhbiBYTUwgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QKLSAgICAgICAgKgotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgZ2V0UHVsbFBhcnNlcihqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFOYW1lKQotICAgICAgICAgICAgICAgICAgICB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBlbGVtZW50TGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgYXR0cmliTGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVyLkVMRU1FTlRfVEVYVCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsX3Nob3J0KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlckltcGwocU5hbWUsIGVsZW1lbnRMaXN0LnRvQXJyYXkoKSwgYXR0cmliTGlzdC50b0FycmF5KCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgCi0KLSAgICAgLyoqCi0gICAgICAqICBGYWN0b3J5IGNsYXNzIHRoYXQga2VlcHMgdGhlIHBhcnNlIG1ldGhvZAotICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3Rvcnl7Ci0KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgX3Nob3J0IGZyb21TdHJpbmcoamF2YS5sYW5nLlN0cmluZyB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSl7Ci0gICAgICAgICAgICAgICAgICAgIF9zaG9ydCByZXR1cm5WYWx1ZSA9IG5ldyAgX3Nob3J0KCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlLnNldF9zaG9ydCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1Nob3J0KHZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBfc2hvcnQgZnJvbVN0cmluZyhqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudC5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IGNvbnRlbnQuc3Vic3RyaW5nKDAsY29udGVudC5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVcmkgPSB4bWxTdHJlYW1SZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9zaG9ydC5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCxuYW1lc3BhY2VVcmkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3Nob3J0LkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LCIiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgCi0KLSAgICAgICAgLyoqCi0gICAgICAgICogc3RhdGljIG1ldGhvZCB0byBjcmVhdGUgdGhlIG9iamVjdAotICAgICAgICAqIFByZWNvbmRpdGlvbjogIElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSBjdXJyZW50IG9yIG5leHQgc3RhcnQgZWxlbWVudCBzdGFydHMgdGhpcyBvYmplY3QgYW5kIGFueSBpbnRlcnZlbmluZyByZWFkZXIgZXZlbnRzIGFyZSBpZ25vcmFibGUKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBub3QgYW4gZWxlbWVudCwgaXQgaXMgYSBjb21wbGV4IHR5cGUgYW5kIHRoZSByZWFkZXIgaXMgYXQgdGhlIGV2ZW50IGp1c3QgYWZ0ZXIgdGhlIG91dGVyIHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgKiBQb3N0Y29uZGl0aW9uOiBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgaXRzIGVuZCBlbGVtZW50Ci0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgYSBjb21wbGV4IHR5cGUsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCB0aGUgZW5kIGVsZW1lbnQgb2YgaXRzIG91dGVyIGVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBfc2hvcnQgcGFyc2UoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIF9zaG9ydCBvYmplY3QgPQotICAgICAgICAgICAgICAgIG5ldyBfc2hvcnQoKTsKLQotICAgICAgICAgICAgaW50IGV2ZW50OwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuaWxsYWJsZVZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0iIjsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNldXJpID0iIjsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUgKCFyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAmJiAhcmVhZGVyLmlzRW5kRWxlbWVudCgpKQotICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIikhPW51bGwpewotICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBmdWxsVHlwZU5hbWUgPSByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIik7Ci0gICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1ByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKDAsZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBuc1ByZWZpeD09bnVsbD8iIjpuc1ByZWZpeDsKLQotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHR5cGUgPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikrMSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghInNob3J0Ii5lcXVhbHModHlwZSkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2ZpbmQgbmFtZXNwYWNlIGZvciB0aGUgcHJlZml4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNVcmkgPSByZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShuc1ByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoX3Nob3J0KW9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLkV4dGVuc2lvbk1hcHBlci5nZXRUeXBlT2JqZWN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zVXJpLHR5cGUscmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIE5vdGUgYWxsIGF0dHJpYnV0ZXMgdGhhdCB3ZXJlIGhhbmRsZWQuIFVzZWQgdG8gZGlmZmVyIG5vcm1hbCBhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgICAgLy8gZnJvbSBhbnlBdHRyaWJ1dGVzLgotICAgICAgICAgICAgICAgIGphdmEudXRpbC5WZWN0b3IgaGFuZGxlZEF0dHJpYnV0ZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlKCFyZWFkZXIuaXNFbmRFbGVtZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50ID0gcmVhZGVyLmdldEVsZW1lbnRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0X3Nob3J0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TaG9ydChjb250ZW50KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gRW5kIG9mIGlmIGZvciBleHBlY3RlZCBwcm9wZXJ0eSBzdGFydCBlbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgc3RhcnQgZWxlbWVudCB3ZSBhcmUgbm90IGV4cGVjdGluZyBpbmRpY2F0ZXMgYW4gaW52YWxpZCBwYXJhbWV0ZXIgd2FzIHBhc3NlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiVW5leHBlY3RlZCBzdWJlbGVtZW50ICIgKyByZWFkZXIuZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIGVuZCBvZiB3aGlsZSBsb29wCi0gICAgICAgICAgICAgICAgICAgICAgICAKLQotCi0KLSAgICAgICAgICAgIH0gY2F0Y2ggKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5sYW5nLkV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG9iamVjdDsKLSAgICAgICAgfQotCi0gICAgICAgIH0vL2VuZCBvZiBmYWN0b3J5IGNsYXNzCi0KLSAgICAgICAgCi0KLSAgICAgICAgfQotICAgICAgICAgICAKLSAgICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMveHNkL0FueVVSSS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3hzZC9BbnlVUkkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM1ZGIwNC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMveHNkL0FueVVSSS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAzICswLDAgQEAKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBBbnlVUkkuamF2YQotICoKLSAqIFRoaXMgZmlsZSB3YXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBXU0RMCi0gKiBieSB0aGUgQXBhY2hlIEF4aXMyIHZlcnNpb246IFNOQVBTSE9UICBCdWlsdCBvbiA6IERlYyAyMSwgMjAwNyAoMDQ6MDM6MzAgTEtUKQotICovCi0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBwYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkOwotICAgICAgICAgICAgCi0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiAgQW55VVJJIGJlYW4gY2xhc3MKLSAgICAgICAgICAgICovCi0gICAgICAgIAotICAgICAgICBwdWJsaWMgIGNsYXNzIEFueVVSSQotICAgICAgICBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCQmVhbnsKLSAgICAgICAgLyogVGhpcyB0eXBlIHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgcGllY2Ugb2Ygc2NoZW1hIHRoYXQgaGFkCi0gICAgICAgICAgICAgICAgbmFtZSA9IGFueVVSSQotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBVUkkgPSBodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYQotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBQcmVmaXggPSBuczEKLSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgCi0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZW5lcmF0ZVByZWZpeChqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICAgICAgaWYobmFtZXNwYWNlLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSl7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJ4c2QiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgIH0KLQotICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIGZpZWxkIGZvciBBbnlVUkkKLSAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuVVJJIGxvY2FsQW55VVJJIDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBnZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5VUkkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuVVJJIGdldEFueVVSSSgpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbEFueVVSSTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIHNldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSBwYXJhbSBBbnlVUkkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldEFueVVSSShvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLlVSSSBwYXJhbSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYWxBbnlVUkk9cGFyYW07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbEFueVVSSS50b1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgLyoqCi0gICAgICogaXNSZWFkZXJNVE9NQXdhcmUKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlYWRlciBzdXBwb3J0cyBNVE9NCi0gICAgICovCi0gICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIHRyeXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGphdmEubGFuZy5Cb29sZWFuLlRSVUUuZXF1YWxzKHJlYWRlci5nZXRQcm9wZXJ0eShvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQ29uc3RhbnRzLklTX0RBVEFfSEFORExFUlNfQVdBUkUpKTsKLSAgICAgICAgfWNhdGNoKGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXNSZWFkZXJNVE9NQXdhcmU7Ci0gICB9Ci0gICAgIAotICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICoKLSAgICAgICAgKiBAcGFyYW0gcGFyZW50UU5hbWUKLSAgICAgICAgKiBAcGFyYW0gZmFjdG9yeQotICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICBwdWJsaWMgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgZ2V0T01FbGVtZW50ICgKLSAgICAgICAgICAgICAgIGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5KSB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlIGRhdGFTb3VyY2UgPQotICAgICAgICAgICAgICAgICAgICAgICBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJEYXRhU291cmNlKHRoaXMscGFyZW50UU5hbWUpewotCi0gICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICBBbnlVUkkudGhpcy5zZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5PTVNvdXJjZWRFbGVtZW50SW1wbCgKLSAgICAgICAgICAgICAgIHBhcmVudFFOYW1lLGZhY3RvcnksZGF0YVNvdXJjZSk7Ci0gICAgICAgICAgICAKLSAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIsZmFsc2UpOwotICAgICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzZXJpYWxpemVUeXBlKQotICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotCi0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UgPSBudWxsOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHBhcmVudFFOYW1lLmdldFByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UgPSBwYXJlbnRRTmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZSAhPSBudWxsKSAmJiAobmFtZXNwYWNlLnRyaW0oKS5sZW5ndGgoKSA+IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHdyaXRlclByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3cml0ZXJQcmVmaXggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChuYW1lc3BhY2UsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHByZWZpeCwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCksIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIGlmIChzZXJpYWxpemVUeXBlKXsKLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpOwotICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlUHJlZml4ICE9IG51bGwpICYmIChuYW1lc3BhY2VQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkpewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVByZWZpeCsiOmFueVVSSSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgImFueVVSSSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbEFueVVSST09bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgdGhlIG5pbCBhdHRyaWJ1dGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJhbnlVUkkgY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxBbnlVUkkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRoIHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCxqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgIGlmICh4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLQotICAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsIGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlTmFtZXNwYWNlID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVWYWx1ZTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBhdHRyaWJ1dGVQcmVmaXggKyAiOiIgKyBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSwgYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICBtZXRob2QgdG8gaGFuZGxlIFFuYW1lcwotICAgICAgICAgKi8KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZShqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhwcmVmaXggKyAiOiIgKyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaS5lIHRoaXMgaXMgdGhlIGRlZmF1bHQgbmFtZXNwYWNlCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lcyhqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lW10gcW5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICBpZiAocW5hbWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHRvIHN0b3JlIHRoaXMgZGF0YSB1bnRpbCBsYXN0IG1vbWVudCBzaW5jZSBpdCBpcyBub3QgcG9zc2libGUgdG8gd3JpdGUgYW55Ci0gICAgICAgICAgICAgICAgLy8gbmFtZXNwYWNlIGRhdGEgYWZ0ZXIgd3JpdGluZyB0aGUgY2hhcmFjdG9yIGRhdGEKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIHN0cmluZ1RvV3JpdGUgPSBuZXcgamF2YS5sYW5nLlN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHFuYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKCIgIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlVVJJID0gcW5hbWVzW2ldLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocHJlZml4ID09IG51bGwpIHx8IChwcmVmaXgubGVuZ3RoKCkgPT0gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChwcmVmaXgpLmFwcGVuZCgiOiIpLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHN0cmluZ1RvV3JpdGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0KLSAgICAgICAgIC8qKgotICAgICAgICAgKiBSZWdpc3RlciBhIG5hbWVzcGFjZSBwcmVmaXgKLSAgICAgICAgICovCi0gICAgICAgICBwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgcmVnaXN0ZXJQcmVmaXgoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLCBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlICh4bWxXcml0ZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gcHJlZml4OwotICAgICAgICAgICAgfQotCi0KLSAgCi0gICAgICAgIC8qKgotICAgICAgICAqIGRhdGFiaW5kaW5nIG1ldGhvZCB0byBnZXQgYW4gWE1MIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0Ci0gICAgICAgICoKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIGdldFB1bGxQYXJzZXIoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxTmFtZSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgZWxlbWVudExpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGF0dHJpYkxpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlci5FTEVNRU5UX1RFWFQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsQW55VVJJICE9IG51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbEFueVVSSSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJhbnlVUkkgY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXJJbXBsKHFOYW1lLCBlbGVtZW50TGlzdC50b0FycmF5KCksIGF0dHJpYkxpc3QudG9BcnJheSgpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gIAotCi0gICAgIC8qKgotICAgICAgKiAgRmFjdG9yeSBjbGFzcyB0aGF0IGtlZXBzIHRoZSBwYXJzZSBtZXRob2QKLSAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5ewotCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIEFueVVSSSBmcm9tU3RyaW5nKGphdmEubGFuZy5TdHJpbmcgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkpewotICAgICAgICAgICAgICAgICAgICBBbnlVUkkgcmV0dXJuVmFsdWUgPSBuZXcgIEFueVVSSSgpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZS5zZXRBbnlVUkkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9BbnlVUkkodmFsdWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIEFueVVSSSBmcm9tU3RyaW5nKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50LmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gY29udGVudC5zdWJzdHJpbmcoMCxjb250ZW50LmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVyaSA9IHhtbFN0cmVhbVJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQW55VVJJLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LG5hbWVzcGFjZVVyaSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBbnlVUkkuRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsIiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAKLQotICAgICAgICAvKioKLSAgICAgICAgKiBzdGF0aWMgbWV0aG9kIHRvIGNyZWF0ZSB0aGUgb2JqZWN0Ci0gICAgICAgICogUHJlY29uZGl0aW9uOiAgSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIGN1cnJlbnQgb3IgbmV4dCBzdGFydCBlbGVtZW50IHN0YXJ0cyB0aGlzIG9iamVjdCBhbmQgYW55IGludGVydmVuaW5nIHJlYWRlciBldmVudHMgYXJlIGlnbm9yYWJsZQotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIG5vdCBhbiBlbGVtZW50LCBpdCBpcyBhIGNvbXBsZXggdHlwZSBhbmQgdGhlIHJlYWRlciBpcyBhdCB0aGUgZXZlbnQganVzdCBhZnRlciB0aGUgb3V0ZXIgc3RhcnQgZWxlbWVudAotICAgICAgICAqIFBvc3Rjb25kaXRpb246IElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCBpdHMgZW5kIGVsZW1lbnQKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBhIGNvbXBsZXggdHlwZSwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IHRoZSBlbmQgZWxlbWVudCBvZiBpdHMgb3V0ZXIgZWxlbWVudAotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIEFueVVSSSBwYXJzZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uewotICAgICAgICAgICAgQW55VVJJIG9iamVjdCA9Ci0gICAgICAgICAgICAgICAgbmV3IEFueVVSSSgpOwotCi0gICAgICAgICAgICBpbnQgZXZlbnQ7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5pbGxhYmxlVmFsdWUgPSBudWxsOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSIiOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2V1cmkgPSIiOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSAoIXJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICYmICFyZWFkZXIuaXNFbmRFbGVtZW50KCkpCi0gICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiKSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGZ1bGxUeXBlTmFtZSA9IHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiKTsKLSAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUhPW51bGwpewotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zUHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoMCxmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IG5zUHJlZml4PT1udWxsPyIiOm5zUHJlZml4OwotCi0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgdHlwZSA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSsxKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEiYW55VVJJIi5lcXVhbHModHlwZSkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2ZpbmQgbmFtZXNwYWNlIGZvciB0aGUgcHJlZml4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNVcmkgPSByZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShuc1ByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoQW55VVJJKW9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkLkV4dGVuc2lvbk1hcHBlci5nZXRUeXBlT2JqZWN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zVXJpLHR5cGUscmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIE5vdGUgYWxsIGF0dHJpYnV0ZXMgdGhhdCB3ZXJlIGhhbmRsZWQuIFVzZWQgdG8gZGlmZmVyIG5vcm1hbCBhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgICAgLy8gZnJvbSBhbnlBdHRyaWJ1dGVzLgotICAgICAgICAgICAgICAgIGphdmEudXRpbC5WZWN0b3IgaGFuZGxlZEF0dHJpYnV0ZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlKCFyZWFkZXIuaXNFbmRFbGVtZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50ID0gcmVhZGVyLmdldEVsZW1lbnRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0QW55VVJJKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9BbnlVUkkoY29udGVudCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIEVuZCBvZiBpZiBmb3IgZXhwZWN0ZWQgcHJvcGVydHkgc3RhcnQgZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHN0YXJ0IGVsZW1lbnQgd2UgYXJlIG5vdCBleHBlY3RpbmcgaW5kaWNhdGVzIGFuIGludmFsaWQgcGFyYW1ldGVyIHdhcyBwYXNzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIlVuZXhwZWN0ZWQgc3ViZWxlbWVudCAiICsgcmVhZGVyLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBlbmQgb2Ygd2hpbGUgbG9vcAotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLQotCi0gICAgICAgICAgICB9IGNhdGNoIChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEubGFuZy5FeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBvYmplY3Q7Ci0gICAgICAgIH0KLQotICAgICAgICB9Ly9lbmQgb2YgZmFjdG9yeSBjbGFzcwotCi0gICAgICAgIAotCi0gICAgICAgIH0KLSAgICAgICAgICAgCi0gICAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3hzZC9CYXNlNjQuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy94c2QvQmFzZTY0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2MzU2MTAuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3hzZC9CYXNlNjQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2MiArMCwwIEBACi0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICogQmFzZTY0LmphdmEKLSAqCi0gKiBUaGlzIGZpbGUgd2FzIGF1dG8tZ2VuZXJhdGVkIGZyb20gV1NETAotICogYnkgdGhlIEFwYWNoZSBBeGlzMiB2ZXJzaW9uOiBTTkFQU0hPVCAgQnVpbHQgb24gOiBEZWMgMjEsIDIwMDcgKDA0OjAzOjMwIExLVCkKLSAqLwotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnhzZDsKLSAgICAgICAgICAgIAotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogIEJhc2U2NCBiZWFuIGNsYXNzCi0gICAgICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgcHVibGljICBjbGFzcyBCYXNlNjQKLSAgICAgICAgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkJlYW57Ci0gICAgICAgIAotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBNWV9RTkFNRSA9IG5ldyBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lKAotICAgICAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIsCi0gICAgICAgICAgICAgICAgImJhc2U2NCIsCi0gICAgICAgICAgICAgICAgInhzZCIpOwotCi0gICAgICAgICAgICAKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdlbmVyYXRlUHJlZml4KGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB7Ci0gICAgICAgICAgICBpZihuYW1lc3BhY2UuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpKXsKLSAgICAgICAgICAgICAgICByZXR1cm4gInhzZCI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgfQotCi0gICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogZmllbGQgZm9yIEJhc2U2NAotICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgamF2YXguYWN0aXZhdGlvbi5EYXRhSGFuZGxlciBsb2NhbEJhc2U2NCA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgZ2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIGphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgIGphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXIgZ2V0QmFzZTY0KCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsQmFzZTY0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgc2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtIHBhcmFtIEJhc2U2NAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0QmFzZTY0KGphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXIgcGFyYW0pewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2NhbEJhc2U2ND1wYXJhbTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbEJhc2U2NC50b1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgLyoqCi0gICAgICogaXNSZWFkZXJNVE9NQXdhcmUKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlYWRlciBzdXBwb3J0cyBNVE9NCi0gICAgICovCi0gICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIHRyeXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGphdmEubGFuZy5Cb29sZWFuLlRSVUUuZXF1YWxzKHJlYWRlci5nZXRQcm9wZXJ0eShvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQ29uc3RhbnRzLklTX0RBVEFfSEFORExFUlNfQVdBUkUpKTsKLSAgICAgICAgfWNhdGNoKGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXNSZWFkZXJNVE9NQXdhcmU7Ci0gICB9Ci0gICAgIAotICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICoKLSAgICAgICAgKiBAcGFyYW0gcGFyZW50UU5hbWUKLSAgICAgICAgKiBAcGFyYW0gZmFjdG9yeQotICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICBwdWJsaWMgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgZ2V0T01FbGVtZW50ICgKLSAgICAgICAgICAgICAgIGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5KSB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZSBkYXRhU291cmNlID0KLSAgICAgICAgICAgICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRGF0YVNvdXJjZSh0aGlzLE1ZX1FOQU1FKXsKLQotICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgQmFzZTY0LnRoaXMuc2VyaWFsaXplKE1ZX1FOQU1FLGZhY3RvcnkseG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmxsb20uT01Tb3VyY2VkRWxlbWVudEltcGwoCi0gICAgICAgICAgICAgICBNWV9RTkFNRSxmYWN0b3J5LGRhdGFTb3VyY2UpOwotICAgICAgICAgICAgCi0gICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyLGZhbHNlKTsKLSAgICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VyaWFsaXplVHlwZSkKLSAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvL1dlIGNhbiBzYWZlbHkgYXNzdW1lIGFuIGVsZW1lbnQgaGFzIG9ubHkgb25lIHR5cGUgYXNzb2NpYXRlZCB3aXRoIGl0Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UgPSBwYXJlbnRRTmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGxvY2FsTmFtZSA9IHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEgbmFtZXNwYWNlLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocHJlZml4LCBsb2NhbE5hbWUsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChuYW1lc3BhY2UsIGxvY2FsTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChsb2NhbE5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkZCB0aGUgdHlwZSBkZXRhaWxzIGlmIHRoaXMgaXMgdXNlZCBpbiBhIHNpbXBsZSB0eXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlcmlhbGl6ZVR5cGUpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2VQcmVmaXggIT0gbnVsbCkgJiYgKG5hbWVzcGFjZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VQcmVmaXgrIjpiYXNlNjQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFzZTY0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsQmFzZTY0PT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiVmFsdWUgY2Fubm90IGJlIG51bGwgISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxCYXNlNjQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKLQotICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGggdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgcHJlZml4LGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgaWYgKHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotCi0gICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotCi0gICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSwgamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVOYW1lc3BhY2UgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgoYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVZhbHVlOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IGF0dHJpYnV0ZVByZWZpeCArICI6IiArIHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLCBhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAvKioKLSAgICAgICAgICogIG1ldGhvZCB0byBoYW5kbGUgUW5hbWVzCi0gICAgICAgICAqLwotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHByZWZpeCArICI6IiArIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBpLmUgdGhpcyBpcyB0aGUgZGVmYXVsdCBuYW1lc3BhY2UKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVzKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWVbXSBxbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgIGlmIChxbmFtZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gc3RvcmUgdGhpcyBkYXRhIHVudGlsIGxhc3QgbW9tZW50IHNpbmNlIGl0IGlzIG5vdCBwb3NzaWJsZSB0byB3cml0ZSBhbnkKLSAgICAgICAgICAgICAgICAvLyBuYW1lc3BhY2UgZGF0YSBhZnRlciB3cml0aW5nIHRoZSBjaGFyYWN0b3IgZGF0YQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmdCdWZmZXIgc3RyaW5nVG9Xcml0ZSA9IG5ldyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcW5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQoIiAiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VVUkkgPSBxbmFtZXNbaV0uZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwcmVmaXggPT0gbnVsbCkgfHwgKHByZWZpeC5sZW5ndGgoKSA9PSAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKHByZWZpeCkuYXBwZW5kKCI6IikuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMoc3RyaW5nVG9Xcml0ZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAqIFJlZ2lzdGVyIGEgbmFtZXNwYWNlIHByZWZpeAotICAgICAgICAgKi8KLSAgICAgICAgIHByaXZhdGUgamF2YS5sYW5nLlN0cmluZyByZWdpc3RlclByZWZpeChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHhtbFdyaXRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiBwcmVmaXg7Ci0gICAgICAgICAgICB9Ci0KLQotICAKLSAgICAgICAgLyoqCi0gICAgICAgICogZGF0YWJpbmRpbmcgbWV0aG9kIHRvIGdldCBhbiBYTUwgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QKLSAgICAgICAgKgotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgZ2V0UHVsbFBhcnNlcihqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFOYW1lKQotICAgICAgICAgICAgICAgICAgICB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvL1dlIGNhbiBzYWZlbHkgYXNzdW1lIGFuIGVsZW1lbnQgaGFzIG9ubHkgb25lIHR5cGUgYXNzb2NpYXRlZCB3aXRoIGl0Ci0gICAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVySW1wbChNWV9RTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgamF2YS5sYW5nLk9iamVjdFtdewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlci5FTEVNRU5UX1RFWFQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbEJhc2U2NCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwpOwotCi0gICAgICAgIH0KLQotICAKLQotICAgICAvKioKLSAgICAgICogIEZhY3RvcnkgY2xhc3MgdGhhdCBrZWVwcyB0aGUgcGFyc2UgbWV0aG9kCi0gICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeXsKLQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBCYXNlNjQgZnJvbVN0cmluZyhqYXZhLmxhbmcuU3RyaW5nIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJKXsKLSAgICAgICAgICAgICAgICAgICAgQmFzZTY0IHJldHVyblZhbHVlID0gbmV3ICBCYXNlNjQoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUuc2V0QmFzZTY0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvQmFzZTY0QmluYXJ5KHZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBCYXNlNjQgZnJvbVN0cmluZyhqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudC5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IGNvbnRlbnQuc3Vic3RyaW5nKDAsY29udGVudC5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVcmkgPSB4bWxTdHJlYW1SZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJhc2U2NC5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCxuYW1lc3BhY2VVcmkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQmFzZTY0LkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LCIiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgCi0KLSAgICAgICAgLyoqCi0gICAgICAgICogc3RhdGljIG1ldGhvZCB0byBjcmVhdGUgdGhlIG9iamVjdAotICAgICAgICAqIFByZWNvbmRpdGlvbjogIElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSBjdXJyZW50IG9yIG5leHQgc3RhcnQgZWxlbWVudCBzdGFydHMgdGhpcyBvYmplY3QgYW5kIGFueSBpbnRlcnZlbmluZyByZWFkZXIgZXZlbnRzIGFyZSBpZ25vcmFibGUKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBub3QgYW4gZWxlbWVudCwgaXQgaXMgYSBjb21wbGV4IHR5cGUgYW5kIHRoZSByZWFkZXIgaXMgYXQgdGhlIGV2ZW50IGp1c3QgYWZ0ZXIgdGhlIG91dGVyIHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgKiBQb3N0Y29uZGl0aW9uOiBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgaXRzIGVuZCBlbGVtZW50Ci0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgYSBjb21wbGV4IHR5cGUsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCB0aGUgZW5kIGVsZW1lbnQgb2YgaXRzIG91dGVyIGVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBCYXNlNjQgcGFyc2UoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIEJhc2U2NCBvYmplY3QgPQotICAgICAgICAgICAgICAgIG5ldyBCYXNlNjQoKTsKLQotICAgICAgICAgICAgaW50IGV2ZW50OwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuaWxsYWJsZVZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0iIjsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNldXJpID0iIjsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUgKCFyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAmJiAhcmVhZGVyLmlzRW5kRWxlbWVudCgpKQotICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBOb3RlIGFsbCBhdHRyaWJ1dGVzIHRoYXQgd2VyZSBoYW5kbGVkLiBVc2VkIHRvIGRpZmZlciBub3JtYWwgYXR0cmlidXRlcwotICAgICAgICAgICAgICAgIC8vIGZyb20gYW55QXR0cmlidXRlcy4KLSAgICAgICAgICAgICAgICBqYXZhLnV0aWwuVmVjdG9yIGhhbmRsZWRBdHRyaWJ1dGVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSghcmVhZGVyLmlzRW5kRWxlbWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCA9IHJlYWRlci5nZXRFbGVtZW50VGV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldEJhc2U2NCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvQmFzZTY0QmluYXJ5KGNvbnRlbnQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBFbmQgb2YgaWYgZm9yIGV4cGVjdGVkIHByb3BlcnR5IHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2V7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBzdGFydCBlbGVtZW50IHdlIGFyZSBub3QgZXhwZWN0aW5nIGluZGljYXRlcyBhbiBpbnZhbGlkIHBhcmFtZXRlciB3YXMgcGFzc2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJVbmV4cGVjdGVkIHN1YmVsZW1lbnQgIiArIHJlYWRlci5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gZW5kIG9mIHdoaWxlIGxvb3AKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0KLQotICAgICAgICAgICAgfSBjYXRjaCAoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gb2JqZWN0OwotICAgICAgICB9Ci0KLSAgICAgICAgfS8vZW5kIG9mIGZhY3RvcnkgY2xhc3MKLQotICAgICAgICAKLQotICAgICAgICB9Ci0gICAgICAgICAgIAotICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy94c2QvQmFzZTY0QmluYXJ5LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMveHNkL0Jhc2U2NEJpbmFyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYmEwY2Q3Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy94c2QvQmFzZTY0QmluYXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MTIgKzAsMCBAQAotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIEJhc2U2NEJpbmFyeS5qYXZhCi0gKgotICogVGhpcyBmaWxlIHdhcyBhdXRvLWdlbmVyYXRlZCBmcm9tIFdTREwKLSAqIGJ5IHRoZSBBcGFjaGUgQXhpczIgdmVyc2lvbjogU05BUFNIT1QgIEJ1aWx0IG9uIDogRGVjIDIxLCAyMDA3ICgwNDowMzozMCBMS1QpCi0gKi8KLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy54c2Q7Ci0gICAgICAgICAgICAKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqICBCYXNlNjRCaW5hcnkgYmVhbiBjbGFzcwotICAgICAgICAgICAgKi8KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyAgY2xhc3MgQmFzZTY0QmluYXJ5Ci0gICAgICAgIGltcGxlbWVudHMgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJCZWFuewotICAgICAgICAvKiBUaGlzIHR5cGUgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBwaWVjZSBvZiBzY2hlbWEgdGhhdCBoYWQKLSAgICAgICAgICAgICAgICBuYW1lID0gYmFzZTY0QmluYXJ5Ci0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFVSSSA9IGh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFByZWZpeCA9IG5zMQotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdlbmVyYXRlUHJlZml4KGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB7Ci0gICAgICAgICAgICBpZihuYW1lc3BhY2UuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpKXsKLSAgICAgICAgICAgICAgICByZXR1cm4gInhzZCI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgfQotCi0gICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogZmllbGQgZm9yIEJhc2U2NEJpbmFyeQotICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgamF2YXguYWN0aXZhdGlvbi5EYXRhSGFuZGxlciBsb2NhbEJhc2U2NEJpbmFyeSA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgZ2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIGphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgIGphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXIgZ2V0QmFzZTY0QmluYXJ5KCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsQmFzZTY0QmluYXJ5OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgc2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtIHBhcmFtIEJhc2U2NEJpbmFyeQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0QmFzZTY0QmluYXJ5KGphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXIgcGFyYW0pewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2FsQmFzZTY0QmluYXJ5PXBhcmFtOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxCYXNlNjRCaW5hcnkudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgIC8qKgotICAgICAqIGlzUmVhZGVyTVRPTUF3YXJlCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSByZWFkZXIgc3VwcG9ydHMgTVRPTQotICAgICAqLwotICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgewotICAgICAgICBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICB0cnl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBqYXZhLmxhbmcuQm9vbGVhbi5UUlVFLmVxdWFscyhyZWFkZXIuZ2V0UHJvcGVydHkob3JnLmFwYWNoZS5heGlvbS5vbS5PTUNvbnN0YW50cy5JU19EQVRBX0hBTkRMRVJTX0FXQVJFKSk7Ci0gICAgICAgIH1jYXRjaChqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlzUmVhZGVyTVRPTUF3YXJlOwotICAgfQotICAgICAKLSAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAqCi0gICAgICAgICogQHBhcmFtIHBhcmVudFFOYW1lCi0gICAgICAgICogQHBhcmFtIGZhY3RvcnkKLSAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgcHVibGljIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IGdldE9NRWxlbWVudCAoCi0gICAgICAgICAgICAgICBmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSkgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZSBkYXRhU291cmNlID0KLSAgICAgICAgICAgICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRGF0YVNvdXJjZSh0aGlzLHBhcmVudFFOYW1lKXsKLQotICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgQmFzZTY0QmluYXJ5LnRoaXMuc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmxsb20uT01Tb3VyY2VkRWxlbWVudEltcGwoCi0gICAgICAgICAgICAgICBwYXJlbnRRTmFtZSxmYWN0b3J5LGRhdGFTb3VyY2UpOwotICAgICAgICAgICAgCi0gICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyLGZhbHNlKTsKLSAgICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VyaWFsaXplVHlwZSkKLSAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLQotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBwYXJlbnRRTmFtZS5nZXRQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlID0gcGFyZW50UU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2UgIT0gbnVsbCkgJiYgKG5hbWVzcGFjZS50cmltKCkubGVuZ3RoKCkgPiAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB3cml0ZXJQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAod3JpdGVyUHJlZml4ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQobmFtZXNwYWNlLCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwcmVmaXgsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICBpZiAoc2VyaWFsaXplVHlwZSl7Ci0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKTsKLSAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZVByZWZpeCAhPSBudWxsKSAmJiAobmFtZXNwYWNlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApKXsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VQcmVmaXgrIjpiYXNlNjRCaW5hcnkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYXNlNjRCaW5hcnkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsQmFzZTY0QmluYXJ5IT1udWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlRGF0YUhhbmRsZXIobG9jYWxCYXNlNjRCaW5hcnkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBwcmVmaXgsamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICBpZiAoeG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0KLSAgICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0KLSAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLCBqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZU5hbWVzcGFjZSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlVmFsdWU7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gYXR0cmlidXRlUHJlZml4ICsgIjoiICsgcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsIGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIC8qKgotICAgICAgICAgKiAgbWV0aG9kIHRvIGhhbmRsZSBRbmFtZXMKLSAgICAgICAgICovCi0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWUoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMocHJlZml4ICsgIjoiICsgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGkuZSB0aGlzIGlzIHRoZSBkZWZhdWx0IG5hbWVzcGFjZQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZXMoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZVtdIHFuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgaWYgKHFuYW1lcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBzdG9yZSB0aGlzIGRhdGEgdW50aWwgbGFzdCBtb21lbnQgc2luY2UgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHdyaXRlIGFueQotICAgICAgICAgICAgICAgIC8vIG5hbWVzcGFjZSBkYXRhIGFmdGVyIHdyaXRpbmcgdGhlIGNoYXJhY3RvciBkYXRhCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZ0J1ZmZlciBzdHJpbmdUb1dyaXRlID0gbmV3IGphdmEubGFuZy5TdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBxbmFtZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZCgiICIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVVSSSA9IHFuYW1lc1tpXS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHByZWZpeCA9PSBudWxsKSB8fCAocHJlZml4Lmxlbmd0aCgpID09IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQocHJlZml4KS5hcHBlbmQoIjoiKS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhzdHJpbmdUb1dyaXRlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotCi0gICAgICAgICAvKioKLSAgICAgICAgICogUmVnaXN0ZXIgYSBuYW1lc3BhY2UgcHJlZml4Ci0gICAgICAgICAqLwotICAgICAgICAgcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHJlZ2lzdGVyUHJlZml4KGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoeG1sV3JpdGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHByZWZpeDsKLSAgICAgICAgICAgIH0KLQotCi0gIAotICAgICAgICAvKioKLSAgICAgICAgKiBkYXRhYmluZGluZyBtZXRob2QgdG8gZ2V0IGFuIFhNTCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdAotICAgICAgICAqCi0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciBnZXRQdWxsUGFyc2VyKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcU5hbWUpCi0gICAgICAgICAgICAgICAgICAgIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGVsZW1lbnRMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBhdHRyaWJMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVyLkVMRU1FTlRfVEVYVCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChsb2NhbEJhc2U2NEJpbmFyeSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVySW1wbChxTmFtZSwgZWxlbWVudExpc3QudG9BcnJheSgpLCBhdHRyaWJMaXN0LnRvQXJyYXkoKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAKLQotICAgICAvKioKLSAgICAgICogIEZhY3RvcnkgY2xhc3MgdGhhdCBrZWVwcyB0aGUgcGFyc2UgbWV0aG9kCi0gICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeXsKLQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBCYXNlNjRCaW5hcnkgZnJvbVN0cmluZyhqYXZhLmxhbmcuU3RyaW5nIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJKXsKLSAgICAgICAgICAgICAgICAgICAgQmFzZTY0QmluYXJ5IHJldHVyblZhbHVlID0gbmV3ICBCYXNlNjRCaW5hcnkoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUuc2V0QmFzZTY0QmluYXJ5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvQmFzZTY0QmluYXJ5KHZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBCYXNlNjRCaW5hcnkgZnJvbVN0cmluZyhqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudC5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IGNvbnRlbnQuc3Vic3RyaW5nKDAsY29udGVudC5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVcmkgPSB4bWxTdHJlYW1SZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJhc2U2NEJpbmFyeS5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCxuYW1lc3BhY2VVcmkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQmFzZTY0QmluYXJ5LkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LCIiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgCi0KLSAgICAgICAgLyoqCi0gICAgICAgICogc3RhdGljIG1ldGhvZCB0byBjcmVhdGUgdGhlIG9iamVjdAotICAgICAgICAqIFByZWNvbmRpdGlvbjogIElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSBjdXJyZW50IG9yIG5leHQgc3RhcnQgZWxlbWVudCBzdGFydHMgdGhpcyBvYmplY3QgYW5kIGFueSBpbnRlcnZlbmluZyByZWFkZXIgZXZlbnRzIGFyZSBpZ25vcmFibGUKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBub3QgYW4gZWxlbWVudCwgaXQgaXMgYSBjb21wbGV4IHR5cGUgYW5kIHRoZSByZWFkZXIgaXMgYXQgdGhlIGV2ZW50IGp1c3QgYWZ0ZXIgdGhlIG91dGVyIHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgKiBQb3N0Y29uZGl0aW9uOiBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgaXRzIGVuZCBlbGVtZW50Ci0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgYSBjb21wbGV4IHR5cGUsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCB0aGUgZW5kIGVsZW1lbnQgb2YgaXRzIG91dGVyIGVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBCYXNlNjRCaW5hcnkgcGFyc2UoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIEJhc2U2NEJpbmFyeSBvYmplY3QgPQotICAgICAgICAgICAgICAgIG5ldyBCYXNlNjRCaW5hcnkoKTsKLQotICAgICAgICAgICAgaW50IGV2ZW50OwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuaWxsYWJsZVZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0iIjsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNldXJpID0iIjsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUgKCFyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAmJiAhcmVhZGVyLmlzRW5kRWxlbWVudCgpKQotICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIikhPW51bGwpewotICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBmdWxsVHlwZU5hbWUgPSByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIik7Ci0gICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1ByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKDAsZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBuc1ByZWZpeD09bnVsbD8iIjpuc1ByZWZpeDsKLQotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHR5cGUgPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikrMSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghImJhc2U2NEJpbmFyeSIuZXF1YWxzKHR5cGUpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9maW5kIG5hbWVzcGFjZSBmb3IgdGhlIHByZWZpeAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zVXJpID0gcmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkobnNQcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKEJhc2U2NEJpbmFyeSlvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnhzZC5FeHRlbnNpb25NYXBwZXIuZ2V0VHlwZU9iamVjdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc1VyaSx0eXBlLHJlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBOb3RlIGFsbCBhdHRyaWJ1dGVzIHRoYXQgd2VyZSBoYW5kbGVkLiBVc2VkIHRvIGRpZmZlciBub3JtYWwgYXR0cmlidXRlcwotICAgICAgICAgICAgICAgIC8vIGZyb20gYW55QXR0cmlidXRlcy4KLSAgICAgICAgICAgICAgICBqYXZhLnV0aWwuVmVjdG9yIGhhbmRsZWRBdHRyaWJ1dGVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSghcmVhZGVyLmlzRW5kRWxlbWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc1JlYWRlck1UT01Bd2FyZShyZWFkZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5Cb29sZWFuLlRSVUUuZXF1YWxzKHJlYWRlci5nZXRQcm9wZXJ0eShvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQ29uc3RhbnRzLklTX0JJTkFSWSkpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vTVRPTSBhd2FyZSByZWFkZXIgLSBnZXQgdGhlIGRhdGFoYW5kbGVyIGRpcmVjdGx5IGFuZCBwdXQgaXQgaW4gdGhlIG9iamVjdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5zZXRCYXNlNjRCaW5hcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoamF2YXguYWN0aXZhdGlvbi5EYXRhSGFuZGxlcikgcmVhZGVyLmdldFByb3BlcnR5KG9yZy5hcGFjaGUuYXhpb20ub20uT01Db25zdGFudHMuREFUQV9IQU5ETEVSKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuZ2V0RXZlbnRUeXBlKCkgPT0gamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Db25zdGFudHMuU1RBUlRfRUxFTUVOVCAmJiByZWFkZXIuZ2V0TmFtZSgpLmVxdWFscyhuZXcgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZShvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuTVRPTUNvbnN0YW50cy5YT1BfTkFNRVNQQUNFX1VSSSwgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLk1UT01Db25zdGFudHMuWE9QX0lOQ0xVREUpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgaWQgPSBvcmcuYXBhY2hlLmF4aW9tLm9tLnV0aWwuRWxlbWVudEhlbHBlci5nZXRDb250ZW50SUQocmVhZGVyLCAiVVRGLTgiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldEJhc2U2NEJpbmFyeSgoKG9yZy5hcGFjaGUuYXhpb20uc29hcC5pbXBsLmJ1aWxkZXIuTVRPTVN0QVhTT0FQTW9kZWxCdWlsZGVyKSAoKG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5sbG9tLk9NU3RBWFdyYXBwZXIpIHJlYWRlcikuZ2V0QnVpbGRlcigpKS5nZXREYXRhSGFuZGxlcihpZCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYocmVhZGVyLmhhc1RleHQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0RvIHRoZSB1c3VhbCBjb252ZXJzaW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCA9IHJlYWRlci5nZXRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5zZXRCYXNlNjRCaW5hcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb0Jhc2U2NEJpbmFyeShjb250ZW50KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBFbmQgb2YgaWYgZm9yIGV4cGVjdGVkIHByb3BlcnR5IHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2V7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBzdGFydCBlbGVtZW50IHdlIGFyZSBub3QgZXhwZWN0aW5nIGluZGljYXRlcyBhbiBpbnZhbGlkIHBhcmFtZXRlciB3YXMgcGFzc2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJVbmV4cGVjdGVkIHN1YmVsZW1lbnQgIiArIHJlYWRlci5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gZW5kIG9mIHdoaWxlIGxvb3AKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0KLQotICAgICAgICAgICAgfSBjYXRjaCAoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gb2JqZWN0OwotICAgICAgICB9Ci0KLSAgICAgICAgfS8vZW5kIG9mIGZhY3RvcnkgY2xhc3MKLQotICAgICAgICAKLQotICAgICAgICB9Ci0gICAgICAgICAgIAotICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy94c2QvRGF0ZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3hzZC9EYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhMTZkNzcuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3hzZC9EYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDMgKzAsMCBAQAotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIERhdGUuamF2YQotICoKLSAqIFRoaXMgZmlsZSB3YXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBXU0RMCi0gKiBieSB0aGUgQXBhY2hlIEF4aXMyIHZlcnNpb246IFNOQVBTSE9UICBCdWlsdCBvbiA6IERlYyAyMSwgMjAwNyAoMDQ6MDM6MzAgTEtUKQotICovCi0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBwYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkOwotICAgICAgICAgICAgCi0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiAgRGF0ZSBiZWFuIGNsYXNzCi0gICAgICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgcHVibGljICBjbGFzcyBEYXRlCi0gICAgICAgIGltcGxlbWVudHMgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJCZWFuewotICAgICAgICAvKiBUaGlzIHR5cGUgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBwaWVjZSBvZiBzY2hlbWEgdGhhdCBoYWQKLSAgICAgICAgICAgICAgICBuYW1lID0gZGF0ZQotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBVUkkgPSBodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYQotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBQcmVmaXggPSBuczEKLSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgCi0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZW5lcmF0ZVByZWZpeChqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICAgICAgaWYobmFtZXNwYWNlLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSl7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJ4c2QiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgIH0KLQotICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIGZpZWxkIGZvciBEYXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBqYXZhLnV0aWwuRGF0ZSBsb2NhbERhdGUgOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIGdldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiBqYXZhLnV0aWwuRGF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyAgamF2YS51dGlsLkRhdGUgZ2V0RGF0ZSgpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbERhdGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBzZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gcGFyYW0gRGF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0RGF0ZShqYXZhLnV0aWwuRGF0ZSBwYXJhbSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYWxEYXRlPXBhcmFtOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxEYXRlLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAvKioKLSAgICAgKiBpc1JlYWRlck1UT01Bd2FyZQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVhZGVyIHN1cHBvcnRzIE1UT00KLSAgICAgKi8KLSAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKLSAgICAgICAgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICAKLSAgICAgICAgdHJ5ewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gamF2YS5sYW5nLkJvb2xlYW4uVFJVRS5lcXVhbHMocmVhZGVyLmdldFByb3BlcnR5KG9yZy5hcGFjaGUuYXhpb20ub20uT01Db25zdGFudHMuSVNfREFUQV9IQU5ETEVSU19BV0FSRSkpOwotICAgICAgICB9Y2F0Y2goamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpc1JlYWRlck1UT01Bd2FyZTsKLSAgIH0KLSAgICAgCi0gICAgIAotICAgICAgICAvKioKLSAgICAgICAgKgotICAgICAgICAqIEBwYXJhbSBwYXJlbnRRTmFtZQotICAgICAgICAqIEBwYXJhbSBmYWN0b3J5Ci0gICAgICAgICogQHJldHVybiBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudAotICAgICAgICAqLwotICAgICAgIHB1YmxpYyBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCBnZXRPTUVsZW1lbnQgKAotICAgICAgICAgICAgICAgZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnkpIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTURhdGFTb3VyY2UgZGF0YVNvdXJjZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkRhdGFTb3VyY2UodGhpcyxwYXJlbnRRTmFtZSl7Ci0KLSAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgIERhdGUudGhpcy5zZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5PTVNvdXJjZWRFbGVtZW50SW1wbCgKLSAgICAgICAgICAgICAgIHBhcmVudFFOYW1lLGZhY3RvcnksZGF0YVNvdXJjZSk7Ci0gICAgICAgICAgICAKLSAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIsZmFsc2UpOwotICAgICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzZXJpYWxpemVUeXBlKQotICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotCi0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UgPSBudWxsOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHBhcmVudFFOYW1lLmdldFByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UgPSBwYXJlbnRRTmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZSAhPSBudWxsKSAmJiAobmFtZXNwYWNlLnRyaW0oKS5sZW5ndGgoKSA+IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHdyaXRlclByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3cml0ZXJQcmVmaXggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChuYW1lc3BhY2UsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHByZWZpeCwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCksIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIGlmIChzZXJpYWxpemVUeXBlKXsKLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpOwotICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlUHJlZml4ICE9IG51bGwpICYmIChuYW1lc3BhY2VQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkpewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVByZWZpeCsiOmRhdGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsRGF0ZT09bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgdGhlIG5pbCBhdHRyaWJ1dGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJkYXRlIGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsRGF0ZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGggdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgcHJlZml4LGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgaWYgKHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotCi0gICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotCi0gICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSwgamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVOYW1lc3BhY2UgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgoYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVZhbHVlOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IGF0dHJpYnV0ZVByZWZpeCArICI6IiArIHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLCBhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAvKioKLSAgICAgICAgICogIG1ldGhvZCB0byBoYW5kbGUgUW5hbWVzCi0gICAgICAgICAqLwotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHByZWZpeCArICI6IiArIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBpLmUgdGhpcyBpcyB0aGUgZGVmYXVsdCBuYW1lc3BhY2UKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVzKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWVbXSBxbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgIGlmIChxbmFtZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gc3RvcmUgdGhpcyBkYXRhIHVudGlsIGxhc3QgbW9tZW50IHNpbmNlIGl0IGlzIG5vdCBwb3NzaWJsZSB0byB3cml0ZSBhbnkKLSAgICAgICAgICAgICAgICAvLyBuYW1lc3BhY2UgZGF0YSBhZnRlciB3cml0aW5nIHRoZSBjaGFyYWN0b3IgZGF0YQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmdCdWZmZXIgc3RyaW5nVG9Xcml0ZSA9IG5ldyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcW5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQoIiAiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VVUkkgPSBxbmFtZXNbaV0uZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwcmVmaXggPT0gbnVsbCkgfHwgKHByZWZpeC5sZW5ndGgoKSA9PSAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKHByZWZpeCkuYXBwZW5kKCI6IikuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMoc3RyaW5nVG9Xcml0ZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAqIFJlZ2lzdGVyIGEgbmFtZXNwYWNlIHByZWZpeAotICAgICAgICAgKi8KLSAgICAgICAgIHByaXZhdGUgamF2YS5sYW5nLlN0cmluZyByZWdpc3RlclByZWZpeChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHhtbFdyaXRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiBwcmVmaXg7Ci0gICAgICAgICAgICB9Ci0KLQotICAKLSAgICAgICAgLyoqCi0gICAgICAgICogZGF0YWJpbmRpbmcgbWV0aG9kIHRvIGdldCBhbiBYTUwgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QKLSAgICAgICAgKgotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgZ2V0UHVsbFBhcnNlcihqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFOYW1lKQotICAgICAgICAgICAgICAgICAgICB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBlbGVtZW50TGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgYXR0cmliTGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVyLkVMRU1FTlRfVEVYVCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxEYXRlICE9IG51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbERhdGUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiZGF0ZSBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlckltcGwocU5hbWUsIGVsZW1lbnRMaXN0LnRvQXJyYXkoKSwgYXR0cmliTGlzdC50b0FycmF5KCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgCi0KLSAgICAgLyoqCi0gICAgICAqICBGYWN0b3J5IGNsYXNzIHRoYXQga2VlcHMgdGhlIHBhcnNlIG1ldGhvZAotICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3Rvcnl7Ci0KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgRGF0ZSBmcm9tU3RyaW5nKGphdmEubGFuZy5TdHJpbmcgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkpewotICAgICAgICAgICAgICAgICAgICBEYXRlIHJldHVyblZhbHVlID0gbmV3ICBEYXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlLnNldERhdGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9EYXRlKHZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBEYXRlIGZyb21TdHJpbmcoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBjb250ZW50LnN1YnN0cmluZygwLGNvbnRlbnQuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVXJpID0geG1sU3RyZWFtUmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBEYXRlLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LG5hbWVzcGFjZVVyaSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBEYXRlLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LCIiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgCi0KLSAgICAgICAgLyoqCi0gICAgICAgICogc3RhdGljIG1ldGhvZCB0byBjcmVhdGUgdGhlIG9iamVjdAotICAgICAgICAqIFByZWNvbmRpdGlvbjogIElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSBjdXJyZW50IG9yIG5leHQgc3RhcnQgZWxlbWVudCBzdGFydHMgdGhpcyBvYmplY3QgYW5kIGFueSBpbnRlcnZlbmluZyByZWFkZXIgZXZlbnRzIGFyZSBpZ25vcmFibGUKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBub3QgYW4gZWxlbWVudCwgaXQgaXMgYSBjb21wbGV4IHR5cGUgYW5kIHRoZSByZWFkZXIgaXMgYXQgdGhlIGV2ZW50IGp1c3QgYWZ0ZXIgdGhlIG91dGVyIHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgKiBQb3N0Y29uZGl0aW9uOiBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgaXRzIGVuZCBlbGVtZW50Ci0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgYSBjb21wbGV4IHR5cGUsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCB0aGUgZW5kIGVsZW1lbnQgb2YgaXRzIG91dGVyIGVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBEYXRlIHBhcnNlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb257Ci0gICAgICAgICAgICBEYXRlIG9iamVjdCA9Ci0gICAgICAgICAgICAgICAgbmV3IERhdGUoKTsKLQotICAgICAgICAgICAgaW50IGV2ZW50OwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuaWxsYWJsZVZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0iIjsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNldXJpID0iIjsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUgKCFyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAmJiAhcmVhZGVyLmlzRW5kRWxlbWVudCgpKQotICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIikhPW51bGwpewotICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBmdWxsVHlwZU5hbWUgPSByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIik7Ci0gICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1ByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKDAsZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBuc1ByZWZpeD09bnVsbD8iIjpuc1ByZWZpeDsKLQotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHR5cGUgPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikrMSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghImRhdGUiLmVxdWFscyh0eXBlKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZmluZCBuYW1lc3BhY2UgZm9yIHRoZSBwcmVmaXgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1VyaSA9IHJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKG5zUHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChEYXRlKW9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkLkV4dGVuc2lvbk1hcHBlci5nZXRUeXBlT2JqZWN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zVXJpLHR5cGUscmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIE5vdGUgYWxsIGF0dHJpYnV0ZXMgdGhhdCB3ZXJlIGhhbmRsZWQuIFVzZWQgdG8gZGlmZmVyIG5vcm1hbCBhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgICAgLy8gZnJvbSBhbnlBdHRyaWJ1dGVzLgotICAgICAgICAgICAgICAgIGphdmEudXRpbC5WZWN0b3IgaGFuZGxlZEF0dHJpYnV0ZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlKCFyZWFkZXIuaXNFbmRFbGVtZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50ID0gcmVhZGVyLmdldEVsZW1lbnRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0RGF0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvRGF0ZShjb250ZW50KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gRW5kIG9mIGlmIGZvciBleHBlY3RlZCBwcm9wZXJ0eSBzdGFydCBlbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgc3RhcnQgZWxlbWVudCB3ZSBhcmUgbm90IGV4cGVjdGluZyBpbmRpY2F0ZXMgYW4gaW52YWxpZCBwYXJhbWV0ZXIgd2FzIHBhc3NlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiVW5leHBlY3RlZCBzdWJlbGVtZW50ICIgKyByZWFkZXIuZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIGVuZCBvZiB3aGlsZSBsb29wCi0gICAgICAgICAgICAgICAgICAgICAgICAKLQotCi0KLSAgICAgICAgICAgIH0gY2F0Y2ggKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5sYW5nLkV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG9iamVjdDsKLSAgICAgICAgfQotCi0gICAgICAgIH0vL2VuZCBvZiBmYWN0b3J5IGNsYXNzCi0KLSAgICAgICAgCi0KLSAgICAgICAgfQotICAgICAgICAgICAKLSAgICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMveHNkL0RhdGVUaW1lLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMveHNkL0RhdGVUaW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkMWQ1NGYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3hzZC9EYXRlVGltZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAzICswLDAgQEAKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBEYXRlVGltZS5qYXZhCi0gKgotICogVGhpcyBmaWxlIHdhcyBhdXRvLWdlbmVyYXRlZCBmcm9tIFdTREwKLSAqIGJ5IHRoZSBBcGFjaGUgQXhpczIgdmVyc2lvbjogU05BUFNIT1QgIEJ1aWx0IG9uIDogRGVjIDIxLCAyMDA3ICgwNDowMzozMCBMS1QpCi0gKi8KLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy54c2Q7Ci0gICAgICAgICAgICAKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqICBEYXRlVGltZSBiZWFuIGNsYXNzCi0gICAgICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgcHVibGljICBjbGFzcyBEYXRlVGltZQotICAgICAgICBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCQmVhbnsKLSAgICAgICAgLyogVGhpcyB0eXBlIHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgcGllY2Ugb2Ygc2NoZW1hIHRoYXQgaGFkCi0gICAgICAgICAgICAgICAgbmFtZSA9IGRhdGVUaW1lCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFVSSSA9IGh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFByZWZpeCA9IG5zMQotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdlbmVyYXRlUHJlZml4KGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB7Ci0gICAgICAgICAgICBpZihuYW1lc3BhY2UuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpKXsKLSAgICAgICAgICAgICAgICByZXR1cm4gInhzZCI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgfQotCi0gICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogZmllbGQgZm9yIERhdGVUaW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBqYXZhLnV0aWwuQ2FsZW5kYXIgbG9jYWxEYXRlVGltZSA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgZ2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIGphdmEudXRpbC5DYWxlbmRhcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyAgamF2YS51dGlsLkNhbGVuZGFyIGdldERhdGVUaW1lKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsRGF0ZVRpbWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBzZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gcGFyYW0gRGF0ZVRpbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldERhdGVUaW1lKGphdmEudXRpbC5DYWxlbmRhciBwYXJhbSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYWxEYXRlVGltZT1wYXJhbTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsRGF0ZVRpbWUudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgIC8qKgotICAgICAqIGlzUmVhZGVyTVRPTUF3YXJlCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSByZWFkZXIgc3VwcG9ydHMgTVRPTQotICAgICAqLwotICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgewotICAgICAgICBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICB0cnl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBqYXZhLmxhbmcuQm9vbGVhbi5UUlVFLmVxdWFscyhyZWFkZXIuZ2V0UHJvcGVydHkob3JnLmFwYWNoZS5heGlvbS5vbS5PTUNvbnN0YW50cy5JU19EQVRBX0hBTkRMRVJTX0FXQVJFKSk7Ci0gICAgICAgIH1jYXRjaChqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlzUmVhZGVyTVRPTUF3YXJlOwotICAgfQotICAgICAKLSAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAqCi0gICAgICAgICogQHBhcmFtIHBhcmVudFFOYW1lCi0gICAgICAgICogQHBhcmFtIGZhY3RvcnkKLSAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgcHVibGljIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IGdldE9NRWxlbWVudCAoCi0gICAgICAgICAgICAgICBmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSkgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZSBkYXRhU291cmNlID0KLSAgICAgICAgICAgICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRGF0YVNvdXJjZSh0aGlzLHBhcmVudFFOYW1lKXsKLQotICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgRGF0ZVRpbWUudGhpcy5zZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5PTVNvdXJjZWRFbGVtZW50SW1wbCgKLSAgICAgICAgICAgICAgIHBhcmVudFFOYW1lLGZhY3RvcnksZGF0YVNvdXJjZSk7Ci0gICAgICAgICAgICAKLSAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIsZmFsc2UpOwotICAgICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzZXJpYWxpemVUeXBlKQotICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotCi0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UgPSBudWxsOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHBhcmVudFFOYW1lLmdldFByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UgPSBwYXJlbnRRTmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZSAhPSBudWxsKSAmJiAobmFtZXNwYWNlLnRyaW0oKS5sZW5ndGgoKSA+IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHdyaXRlclByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3cml0ZXJQcmVmaXggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChuYW1lc3BhY2UsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHByZWZpeCwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCksIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIGlmIChzZXJpYWxpemVUeXBlKXsKLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpOwotICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlUHJlZml4ICE9IG51bGwpICYmIChuYW1lc3BhY2VQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkpewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVByZWZpeCsiOmRhdGVUaW1lIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0ZVRpbWUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxEYXRlVGltZT09bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgdGhlIG5pbCBhdHRyaWJ1dGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJkYXRlVGltZSBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbERhdGVUaW1lKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBwcmVmaXgsamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICBpZiAoeG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0KLSAgICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0KLSAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLCBqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZU5hbWVzcGFjZSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlVmFsdWU7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gYXR0cmlidXRlUHJlZml4ICsgIjoiICsgcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsIGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIC8qKgotICAgICAgICAgKiAgbWV0aG9kIHRvIGhhbmRsZSBRbmFtZXMKLSAgICAgICAgICovCi0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWUoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMocHJlZml4ICsgIjoiICsgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGkuZSB0aGlzIGlzIHRoZSBkZWZhdWx0IG5hbWVzcGFjZQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZXMoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZVtdIHFuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgaWYgKHFuYW1lcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBzdG9yZSB0aGlzIGRhdGEgdW50aWwgbGFzdCBtb21lbnQgc2luY2UgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHdyaXRlIGFueQotICAgICAgICAgICAgICAgIC8vIG5hbWVzcGFjZSBkYXRhIGFmdGVyIHdyaXRpbmcgdGhlIGNoYXJhY3RvciBkYXRhCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZ0J1ZmZlciBzdHJpbmdUb1dyaXRlID0gbmV3IGphdmEubGFuZy5TdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBxbmFtZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZCgiICIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVVSSSA9IHFuYW1lc1tpXS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHByZWZpeCA9PSBudWxsKSB8fCAocHJlZml4Lmxlbmd0aCgpID09IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQocHJlZml4KS5hcHBlbmQoIjoiKS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhzdHJpbmdUb1dyaXRlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotCi0gICAgICAgICAvKioKLSAgICAgICAgICogUmVnaXN0ZXIgYSBuYW1lc3BhY2UgcHJlZml4Ci0gICAgICAgICAqLwotICAgICAgICAgcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHJlZ2lzdGVyUHJlZml4KGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoeG1sV3JpdGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHByZWZpeDsKLSAgICAgICAgICAgIH0KLQotCi0gIAotICAgICAgICAvKioKLSAgICAgICAgKiBkYXRhYmluZGluZyBtZXRob2QgdG8gZ2V0IGFuIFhNTCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdAotICAgICAgICAqCi0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciBnZXRQdWxsUGFyc2VyKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcU5hbWUpCi0gICAgICAgICAgICAgICAgICAgIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGVsZW1lbnRMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBhdHRyaWJMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXIuRUxFTUVOVF9URVhUKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbERhdGVUaW1lICE9IG51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbERhdGVUaW1lKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oImRhdGVUaW1lIGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVySW1wbChxTmFtZSwgZWxlbWVudExpc3QudG9BcnJheSgpLCBhdHRyaWJMaXN0LnRvQXJyYXkoKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAKLQotICAgICAvKioKLSAgICAgICogIEZhY3RvcnkgY2xhc3MgdGhhdCBrZWVwcyB0aGUgcGFyc2UgbWV0aG9kCi0gICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeXsKLQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBEYXRlVGltZSBmcm9tU3RyaW5nKGphdmEubGFuZy5TdHJpbmcgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkpewotICAgICAgICAgICAgICAgICAgICBEYXRlVGltZSByZXR1cm5WYWx1ZSA9IG5ldyAgRGF0ZVRpbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUuc2V0RGF0ZVRpbWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9EYXRlVGltZSh2YWx1ZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgRGF0ZVRpbWUgZnJvbVN0cmluZyhqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudC5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IGNvbnRlbnQuc3Vic3RyaW5nKDAsY29udGVudC5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVcmkgPSB4bWxTdHJlYW1SZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERhdGVUaW1lLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LG5hbWVzcGFjZVVyaSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBEYXRlVGltZS5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCwiIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIAotCi0gICAgICAgIC8qKgotICAgICAgICAqIHN0YXRpYyBtZXRob2QgdG8gY3JlYXRlIHRoZSBvYmplY3QKLSAgICAgICAgKiBQcmVjb25kaXRpb246ICBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgY3VycmVudCBvciBuZXh0IHN0YXJ0IGVsZW1lbnQgc3RhcnRzIHRoaXMgb2JqZWN0IGFuZCBhbnkgaW50ZXJ2ZW5pbmcgcmVhZGVyIGV2ZW50cyBhcmUgaWdub3JhYmxlCi0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgbm90IGFuIGVsZW1lbnQsIGl0IGlzIGEgY29tcGxleCB0eXBlIGFuZCB0aGUgcmVhZGVyIGlzIGF0IHRoZSBldmVudCBqdXN0IGFmdGVyIHRoZSBvdXRlciBzdGFydCBlbGVtZW50Ci0gICAgICAgICogUG9zdGNvbmRpdGlvbjogSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IGl0cyBlbmQgZWxlbWVudAotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIGEgY29tcGxleCB0eXBlLCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgdGhlIGVuZCBlbGVtZW50IG9mIGl0cyBvdXRlciBlbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgRGF0ZVRpbWUgcGFyc2UoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIERhdGVUaW1lIG9iamVjdCA9Ci0gICAgICAgICAgICAgICAgbmV3IERhdGVUaW1lKCk7Ci0KLSAgICAgICAgICAgIGludCBldmVudDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmlsbGFibGVWYWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IiI7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZXVyaSA9IiI7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlICghcmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgJiYgIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkKLSAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIpIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgZnVsbFR5cGVOYW1lID0gcmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAidHlwZSIpOwotICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNQcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZygwLGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gbnNQcmVmaXg9PW51bGw/IiI6bnNQcmVmaXg7Ci0KLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB0eXBlID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZyhmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKzEpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISJkYXRlVGltZSIuZXF1YWxzKHR5cGUpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9maW5kIG5hbWVzcGFjZSBmb3IgdGhlIHByZWZpeAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zVXJpID0gcmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkobnNQcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKERhdGVUaW1lKW9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkLkV4dGVuc2lvbk1hcHBlci5nZXRUeXBlT2JqZWN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zVXJpLHR5cGUscmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIE5vdGUgYWxsIGF0dHJpYnV0ZXMgdGhhdCB3ZXJlIGhhbmRsZWQuIFVzZWQgdG8gZGlmZmVyIG5vcm1hbCBhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgICAgLy8gZnJvbSBhbnlBdHRyaWJ1dGVzLgotICAgICAgICAgICAgICAgIGphdmEudXRpbC5WZWN0b3IgaGFuZGxlZEF0dHJpYnV0ZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlKCFyZWFkZXIuaXNFbmRFbGVtZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50ID0gcmVhZGVyLmdldEVsZW1lbnRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0RGF0ZVRpbWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb0RhdGVUaW1lKGNvbnRlbnQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBFbmQgb2YgaWYgZm9yIGV4cGVjdGVkIHByb3BlcnR5IHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2V7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBzdGFydCBlbGVtZW50IHdlIGFyZSBub3QgZXhwZWN0aW5nIGluZGljYXRlcyBhbiBpbnZhbGlkIHBhcmFtZXRlciB3YXMgcGFzc2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJVbmV4cGVjdGVkIHN1YmVsZW1lbnQgIiArIHJlYWRlci5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gZW5kIG9mIHdoaWxlIGxvb3AKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0KLQotICAgICAgICAgICAgfSBjYXRjaCAoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gb2JqZWN0OwotICAgICAgICB9Ci0KLSAgICAgICAgfS8vZW5kIG9mIGZhY3RvcnkgY2xhc3MKLQotICAgICAgICAKLQotICAgICAgICB9Ci0gICAgICAgICAgIAotICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy94c2QvRGVjaW1hbC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3hzZC9EZWNpbWFsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0NmRkOTYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3hzZC9EZWNpbWFsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDMgKzAsMCBAQAotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIERlY2ltYWwuamF2YQotICoKLSAqIFRoaXMgZmlsZSB3YXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBXU0RMCi0gKiBieSB0aGUgQXBhY2hlIEF4aXMyIHZlcnNpb246IFNOQVBTSE9UICBCdWlsdCBvbiA6IERlYyAyMSwgMjAwNyAoMDQ6MDM6MzAgTEtUKQotICovCi0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBwYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkOwotICAgICAgICAgICAgCi0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiAgRGVjaW1hbCBiZWFuIGNsYXNzCi0gICAgICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgcHVibGljICBjbGFzcyBEZWNpbWFsCi0gICAgICAgIGltcGxlbWVudHMgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJCZWFuewotICAgICAgICAvKiBUaGlzIHR5cGUgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBwaWVjZSBvZiBzY2hlbWEgdGhhdCBoYWQKLSAgICAgICAgICAgICAgICBuYW1lID0gZGVjaW1hbAotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBVUkkgPSBodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYQotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBQcmVmaXggPSBuczEKLSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgCi0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZW5lcmF0ZVByZWZpeChqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICAgICAgaWYobmFtZXNwYWNlLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSl7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJ4c2QiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgIH0KLQotICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIGZpZWxkIGZvciBEZWNpbWFsCi0gICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBqYXZhLm1hdGguQmlnRGVjaW1hbCBsb2NhbERlY2ltYWwgOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIGdldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiBqYXZhLm1hdGguQmlnRGVjaW1hbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyAgamF2YS5tYXRoLkJpZ0RlY2ltYWwgZ2V0RGVjaW1hbCgpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbERlY2ltYWw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBzZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gcGFyYW0gRGVjaW1hbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0RGVjaW1hbChqYXZhLm1hdGguQmlnRGVjaW1hbCBwYXJhbSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYWxEZWNpbWFsPXBhcmFtOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxEZWNpbWFsLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAvKioKLSAgICAgKiBpc1JlYWRlck1UT01Bd2FyZQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVhZGVyIHN1cHBvcnRzIE1UT00KLSAgICAgKi8KLSAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKLSAgICAgICAgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICAKLSAgICAgICAgdHJ5ewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gamF2YS5sYW5nLkJvb2xlYW4uVFJVRS5lcXVhbHMocmVhZGVyLmdldFByb3BlcnR5KG9yZy5hcGFjaGUuYXhpb20ub20uT01Db25zdGFudHMuSVNfREFUQV9IQU5ETEVSU19BV0FSRSkpOwotICAgICAgICB9Y2F0Y2goamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpc1JlYWRlck1UT01Bd2FyZTsKLSAgIH0KLSAgICAgCi0gICAgIAotICAgICAgICAvKioKLSAgICAgICAgKgotICAgICAgICAqIEBwYXJhbSBwYXJlbnRRTmFtZQotICAgICAgICAqIEBwYXJhbSBmYWN0b3J5Ci0gICAgICAgICogQHJldHVybiBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudAotICAgICAgICAqLwotICAgICAgIHB1YmxpYyBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCBnZXRPTUVsZW1lbnQgKAotICAgICAgICAgICAgICAgZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnkpIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTURhdGFTb3VyY2UgZGF0YVNvdXJjZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkRhdGFTb3VyY2UodGhpcyxwYXJlbnRRTmFtZSl7Ci0KLSAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgIERlY2ltYWwudGhpcy5zZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5PTVNvdXJjZWRFbGVtZW50SW1wbCgKLSAgICAgICAgICAgICAgIHBhcmVudFFOYW1lLGZhY3RvcnksZGF0YVNvdXJjZSk7Ci0gICAgICAgICAgICAKLSAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIsZmFsc2UpOwotICAgICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzZXJpYWxpemVUeXBlKQotICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotCi0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UgPSBudWxsOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHBhcmVudFFOYW1lLmdldFByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UgPSBwYXJlbnRRTmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZSAhPSBudWxsKSAmJiAobmFtZXNwYWNlLnRyaW0oKS5sZW5ndGgoKSA+IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHdyaXRlclByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3cml0ZXJQcmVmaXggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChuYW1lc3BhY2UsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHByZWZpeCwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCksIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIGlmIChzZXJpYWxpemVUeXBlKXsKLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpOwotICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlUHJlZml4ICE9IG51bGwpICYmIChuYW1lc3BhY2VQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkpewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVByZWZpeCsiOmRlY2ltYWwiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZWNpbWFsIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsRGVjaW1hbD09bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgdGhlIG5pbCBhdHRyaWJ1dGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJkZWNpbWFsIGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsRGVjaW1hbCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGggdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgcHJlZml4LGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgaWYgKHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotCi0gICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotCi0gICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSwgamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVOYW1lc3BhY2UgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgoYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVZhbHVlOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IGF0dHJpYnV0ZVByZWZpeCArICI6IiArIHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLCBhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAvKioKLSAgICAgICAgICogIG1ldGhvZCB0byBoYW5kbGUgUW5hbWVzCi0gICAgICAgICAqLwotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHByZWZpeCArICI6IiArIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBpLmUgdGhpcyBpcyB0aGUgZGVmYXVsdCBuYW1lc3BhY2UKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVzKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWVbXSBxbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgIGlmIChxbmFtZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gc3RvcmUgdGhpcyBkYXRhIHVudGlsIGxhc3QgbW9tZW50IHNpbmNlIGl0IGlzIG5vdCBwb3NzaWJsZSB0byB3cml0ZSBhbnkKLSAgICAgICAgICAgICAgICAvLyBuYW1lc3BhY2UgZGF0YSBhZnRlciB3cml0aW5nIHRoZSBjaGFyYWN0b3IgZGF0YQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmdCdWZmZXIgc3RyaW5nVG9Xcml0ZSA9IG5ldyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcW5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQoIiAiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VVUkkgPSBxbmFtZXNbaV0uZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwcmVmaXggPT0gbnVsbCkgfHwgKHByZWZpeC5sZW5ndGgoKSA9PSAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKHByZWZpeCkuYXBwZW5kKCI6IikuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMoc3RyaW5nVG9Xcml0ZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAqIFJlZ2lzdGVyIGEgbmFtZXNwYWNlIHByZWZpeAotICAgICAgICAgKi8KLSAgICAgICAgIHByaXZhdGUgamF2YS5sYW5nLlN0cmluZyByZWdpc3RlclByZWZpeChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHhtbFdyaXRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiBwcmVmaXg7Ci0gICAgICAgICAgICB9Ci0KLQotICAKLSAgICAgICAgLyoqCi0gICAgICAgICogZGF0YWJpbmRpbmcgbWV0aG9kIHRvIGdldCBhbiBYTUwgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QKLSAgICAgICAgKgotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgZ2V0UHVsbFBhcnNlcihqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFOYW1lKQotICAgICAgICAgICAgICAgICAgICB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBlbGVtZW50TGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgYXR0cmliTGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVyLkVMRU1FTlRfVEVYVCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxEZWNpbWFsICE9IG51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbERlY2ltYWwpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiZGVjaW1hbCBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlckltcGwocU5hbWUsIGVsZW1lbnRMaXN0LnRvQXJyYXkoKSwgYXR0cmliTGlzdC50b0FycmF5KCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgCi0KLSAgICAgLyoqCi0gICAgICAqICBGYWN0b3J5IGNsYXNzIHRoYXQga2VlcHMgdGhlIHBhcnNlIG1ldGhvZAotICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3Rvcnl7Ci0KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgRGVjaW1hbCBmcm9tU3RyaW5nKGphdmEubGFuZy5TdHJpbmcgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkpewotICAgICAgICAgICAgICAgICAgICBEZWNpbWFsIHJldHVyblZhbHVlID0gbmV3ICBEZWNpbWFsKCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlLnNldERlY2ltYWwoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9EZWNpbWFsKHZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBEZWNpbWFsIGZyb21TdHJpbmcoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBjb250ZW50LnN1YnN0cmluZygwLGNvbnRlbnQuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVXJpID0geG1sU3RyZWFtUmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBEZWNpbWFsLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LG5hbWVzcGFjZVVyaSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBEZWNpbWFsLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LCIiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgCi0KLSAgICAgICAgLyoqCi0gICAgICAgICogc3RhdGljIG1ldGhvZCB0byBjcmVhdGUgdGhlIG9iamVjdAotICAgICAgICAqIFByZWNvbmRpdGlvbjogIElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSBjdXJyZW50IG9yIG5leHQgc3RhcnQgZWxlbWVudCBzdGFydHMgdGhpcyBvYmplY3QgYW5kIGFueSBpbnRlcnZlbmluZyByZWFkZXIgZXZlbnRzIGFyZSBpZ25vcmFibGUKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBub3QgYW4gZWxlbWVudCwgaXQgaXMgYSBjb21wbGV4IHR5cGUgYW5kIHRoZSByZWFkZXIgaXMgYXQgdGhlIGV2ZW50IGp1c3QgYWZ0ZXIgdGhlIG91dGVyIHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgKiBQb3N0Y29uZGl0aW9uOiBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgaXRzIGVuZCBlbGVtZW50Ci0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgYSBjb21wbGV4IHR5cGUsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCB0aGUgZW5kIGVsZW1lbnQgb2YgaXRzIG91dGVyIGVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBEZWNpbWFsIHBhcnNlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb257Ci0gICAgICAgICAgICBEZWNpbWFsIG9iamVjdCA9Ci0gICAgICAgICAgICAgICAgbmV3IERlY2ltYWwoKTsKLQotICAgICAgICAgICAgaW50IGV2ZW50OwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuaWxsYWJsZVZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0iIjsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNldXJpID0iIjsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUgKCFyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAmJiAhcmVhZGVyLmlzRW5kRWxlbWVudCgpKQotICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIikhPW51bGwpewotICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBmdWxsVHlwZU5hbWUgPSByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIik7Ci0gICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1ByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKDAsZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBuc1ByZWZpeD09bnVsbD8iIjpuc1ByZWZpeDsKLQotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHR5cGUgPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikrMSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghImRlY2ltYWwiLmVxdWFscyh0eXBlKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZmluZCBuYW1lc3BhY2UgZm9yIHRoZSBwcmVmaXgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1VyaSA9IHJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKG5zUHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChEZWNpbWFsKW9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkLkV4dGVuc2lvbk1hcHBlci5nZXRUeXBlT2JqZWN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zVXJpLHR5cGUscmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIE5vdGUgYWxsIGF0dHJpYnV0ZXMgdGhhdCB3ZXJlIGhhbmRsZWQuIFVzZWQgdG8gZGlmZmVyIG5vcm1hbCBhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgICAgLy8gZnJvbSBhbnlBdHRyaWJ1dGVzLgotICAgICAgICAgICAgICAgIGphdmEudXRpbC5WZWN0b3IgaGFuZGxlZEF0dHJpYnV0ZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlKCFyZWFkZXIuaXNFbmRFbGVtZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50ID0gcmVhZGVyLmdldEVsZW1lbnRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0RGVjaW1hbCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvRGVjaW1hbChjb250ZW50KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gRW5kIG9mIGlmIGZvciBleHBlY3RlZCBwcm9wZXJ0eSBzdGFydCBlbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgc3RhcnQgZWxlbWVudCB3ZSBhcmUgbm90IGV4cGVjdGluZyBpbmRpY2F0ZXMgYW4gaW52YWxpZCBwYXJhbWV0ZXIgd2FzIHBhc3NlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiVW5leHBlY3RlZCBzdWJlbGVtZW50ICIgKyByZWFkZXIuZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIGVuZCBvZiB3aGlsZSBsb29wCi0gICAgICAgICAgICAgICAgICAgICAgICAKLQotCi0KLSAgICAgICAgICAgIH0gY2F0Y2ggKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5sYW5nLkV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG9iamVjdDsKLSAgICAgICAgfQotCi0gICAgICAgIH0vL2VuZCBvZiBmYWN0b3J5IGNsYXNzCi0KLSAgICAgICAgCi0KLSAgICAgICAgfQotICAgICAgICAgICAKLSAgICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMveHNkL0R1cmF0aW9uLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMveHNkL0R1cmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjNmRiNTYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3hzZC9EdXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAzICswLDAgQEAKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBEdXJhdGlvbi5qYXZhCi0gKgotICogVGhpcyBmaWxlIHdhcyBhdXRvLWdlbmVyYXRlZCBmcm9tIFdTREwKLSAqIGJ5IHRoZSBBcGFjaGUgQXhpczIgdmVyc2lvbjogU05BUFNIT1QgIEJ1aWx0IG9uIDogRGVjIDIxLCAyMDA3ICgwNDowMzozMCBMS1QpCi0gKi8KLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy54c2Q7Ci0gICAgICAgICAgICAKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqICBEdXJhdGlvbiBiZWFuIGNsYXNzCi0gICAgICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgcHVibGljICBjbGFzcyBEdXJhdGlvbgotICAgICAgICBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCQmVhbnsKLSAgICAgICAgLyogVGhpcyB0eXBlIHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgcGllY2Ugb2Ygc2NoZW1hIHRoYXQgaGFkCi0gICAgICAgICAgICAgICAgbmFtZSA9IGR1cmF0aW9uCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFVSSSA9IGh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFByZWZpeCA9IG5zMQotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdlbmVyYXRlUHJlZml4KGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB7Ci0gICAgICAgICAgICBpZihuYW1lc3BhY2UuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpKXsKLSAgICAgICAgICAgICAgICByZXR1cm4gInhzZCI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgfQotCi0gICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogZmllbGQgZm9yIER1cmF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLkR1cmF0aW9uIGxvY2FsRHVyYXRpb24gOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIGdldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLkR1cmF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLkR1cmF0aW9uIGdldER1cmF0aW9uKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsRHVyYXRpb247Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBzZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gcGFyYW0gRHVyYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldER1cmF0aW9uKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuRHVyYXRpb24gcGFyYW0pewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2FsRHVyYXRpb249cGFyYW07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbER1cmF0aW9uLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAvKioKLSAgICAgKiBpc1JlYWRlck1UT01Bd2FyZQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVhZGVyIHN1cHBvcnRzIE1UT00KLSAgICAgKi8KLSAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKLSAgICAgICAgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICAKLSAgICAgICAgdHJ5ewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gamF2YS5sYW5nLkJvb2xlYW4uVFJVRS5lcXVhbHMocmVhZGVyLmdldFByb3BlcnR5KG9yZy5hcGFjaGUuYXhpb20ub20uT01Db25zdGFudHMuSVNfREFUQV9IQU5ETEVSU19BV0FSRSkpOwotICAgICAgICB9Y2F0Y2goamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpc1JlYWRlck1UT01Bd2FyZTsKLSAgIH0KLSAgICAgCi0gICAgIAotICAgICAgICAvKioKLSAgICAgICAgKgotICAgICAgICAqIEBwYXJhbSBwYXJlbnRRTmFtZQotICAgICAgICAqIEBwYXJhbSBmYWN0b3J5Ci0gICAgICAgICogQHJldHVybiBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudAotICAgICAgICAqLwotICAgICAgIHB1YmxpYyBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCBnZXRPTUVsZW1lbnQgKAotICAgICAgICAgICAgICAgZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnkpIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTURhdGFTb3VyY2UgZGF0YVNvdXJjZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkRhdGFTb3VyY2UodGhpcyxwYXJlbnRRTmFtZSl7Ci0KLSAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgIER1cmF0aW9uLnRoaXMuc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmxsb20uT01Tb3VyY2VkRWxlbWVudEltcGwoCi0gICAgICAgICAgICAgICBwYXJlbnRRTmFtZSxmYWN0b3J5LGRhdGFTb3VyY2UpOwotICAgICAgICAgICAgCi0gICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyLGZhbHNlKTsKLSAgICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VyaWFsaXplVHlwZSkKLSAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLQotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBwYXJlbnRRTmFtZS5nZXRQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlID0gcGFyZW50UU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2UgIT0gbnVsbCkgJiYgKG5hbWVzcGFjZS50cmltKCkubGVuZ3RoKCkgPiAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB3cml0ZXJQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAod3JpdGVyUHJlZml4ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQobmFtZXNwYWNlLCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwcmVmaXgsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICBpZiAoc2VyaWFsaXplVHlwZSl7Ci0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKTsKLSAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZVByZWZpeCAhPSBudWxsKSAmJiAobmFtZXNwYWNlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApKXsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VQcmVmaXgrIjpkdXJhdGlvbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgImR1cmF0aW9uIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsRHVyYXRpb249PW51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIHRoZSBuaWwgYXR0cmlidXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiZHVyYXRpb24gY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxEdXJhdGlvbikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGggdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgcHJlZml4LGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgaWYgKHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotCi0gICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotCi0gICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSwgamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVOYW1lc3BhY2UgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgoYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVZhbHVlOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IGF0dHJpYnV0ZVByZWZpeCArICI6IiArIHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLCBhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAvKioKLSAgICAgICAgICogIG1ldGhvZCB0byBoYW5kbGUgUW5hbWVzCi0gICAgICAgICAqLwotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHByZWZpeCArICI6IiArIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBpLmUgdGhpcyBpcyB0aGUgZGVmYXVsdCBuYW1lc3BhY2UKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVzKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWVbXSBxbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgIGlmIChxbmFtZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gc3RvcmUgdGhpcyBkYXRhIHVudGlsIGxhc3QgbW9tZW50IHNpbmNlIGl0IGlzIG5vdCBwb3NzaWJsZSB0byB3cml0ZSBhbnkKLSAgICAgICAgICAgICAgICAvLyBuYW1lc3BhY2UgZGF0YSBhZnRlciB3cml0aW5nIHRoZSBjaGFyYWN0b3IgZGF0YQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmdCdWZmZXIgc3RyaW5nVG9Xcml0ZSA9IG5ldyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcW5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQoIiAiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VVUkkgPSBxbmFtZXNbaV0uZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwcmVmaXggPT0gbnVsbCkgfHwgKHByZWZpeC5sZW5ndGgoKSA9PSAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKHByZWZpeCkuYXBwZW5kKCI6IikuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMoc3RyaW5nVG9Xcml0ZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAqIFJlZ2lzdGVyIGEgbmFtZXNwYWNlIHByZWZpeAotICAgICAgICAgKi8KLSAgICAgICAgIHByaXZhdGUgamF2YS5sYW5nLlN0cmluZyByZWdpc3RlclByZWZpeChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHhtbFdyaXRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiBwcmVmaXg7Ci0gICAgICAgICAgICB9Ci0KLQotICAKLSAgICAgICAgLyoqCi0gICAgICAgICogZGF0YWJpbmRpbmcgbWV0aG9kIHRvIGdldCBhbiBYTUwgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QKLSAgICAgICAgKgotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgZ2V0UHVsbFBhcnNlcihqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFOYW1lKQotICAgICAgICAgICAgICAgICAgICB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBlbGVtZW50TGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgYXR0cmliTGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVyLkVMRU1FTlRfVEVYVCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxEdXJhdGlvbiAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxEdXJhdGlvbikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJkdXJhdGlvbiBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlckltcGwocU5hbWUsIGVsZW1lbnRMaXN0LnRvQXJyYXkoKSwgYXR0cmliTGlzdC50b0FycmF5KCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgCi0KLSAgICAgLyoqCi0gICAgICAqICBGYWN0b3J5IGNsYXNzIHRoYXQga2VlcHMgdGhlIHBhcnNlIG1ldGhvZAotICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3Rvcnl7Ci0KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgRHVyYXRpb24gZnJvbVN0cmluZyhqYXZhLmxhbmcuU3RyaW5nIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJKXsKLSAgICAgICAgICAgICAgICAgICAgRHVyYXRpb24gcmV0dXJuVmFsdWUgPSBuZXcgIER1cmF0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlLnNldER1cmF0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvRHVyYXRpb24odmFsdWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIER1cmF0aW9uIGZyb21TdHJpbmcoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBjb250ZW50LnN1YnN0cmluZygwLGNvbnRlbnQuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVXJpID0geG1sU3RyZWFtUmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBEdXJhdGlvbi5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCxuYW1lc3BhY2VVcmkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRHVyYXRpb24uRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsIiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAKLQotICAgICAgICAvKioKLSAgICAgICAgKiBzdGF0aWMgbWV0aG9kIHRvIGNyZWF0ZSB0aGUgb2JqZWN0Ci0gICAgICAgICogUHJlY29uZGl0aW9uOiAgSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIGN1cnJlbnQgb3IgbmV4dCBzdGFydCBlbGVtZW50IHN0YXJ0cyB0aGlzIG9iamVjdCBhbmQgYW55IGludGVydmVuaW5nIHJlYWRlciBldmVudHMgYXJlIGlnbm9yYWJsZQotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIG5vdCBhbiBlbGVtZW50LCBpdCBpcyBhIGNvbXBsZXggdHlwZSBhbmQgdGhlIHJlYWRlciBpcyBhdCB0aGUgZXZlbnQganVzdCBhZnRlciB0aGUgb3V0ZXIgc3RhcnQgZWxlbWVudAotICAgICAgICAqIFBvc3Rjb25kaXRpb246IElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCBpdHMgZW5kIGVsZW1lbnQKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBhIGNvbXBsZXggdHlwZSwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IHRoZSBlbmQgZWxlbWVudCBvZiBpdHMgb3V0ZXIgZWxlbWVudAotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIER1cmF0aW9uIHBhcnNlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb257Ci0gICAgICAgICAgICBEdXJhdGlvbiBvYmplY3QgPQotICAgICAgICAgICAgICAgIG5ldyBEdXJhdGlvbigpOwotCi0gICAgICAgICAgICBpbnQgZXZlbnQ7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5pbGxhYmxlVmFsdWUgPSBudWxsOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSIiOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2V1cmkgPSIiOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSAoIXJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICYmICFyZWFkZXIuaXNFbmRFbGVtZW50KCkpCi0gICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiKSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGZ1bGxUeXBlTmFtZSA9IHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiKTsKLSAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUhPW51bGwpewotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zUHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoMCxmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IG5zUHJlZml4PT1udWxsPyIiOm5zUHJlZml4OwotCi0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgdHlwZSA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSsxKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEiZHVyYXRpb24iLmVxdWFscyh0eXBlKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZmluZCBuYW1lc3BhY2UgZm9yIHRoZSBwcmVmaXgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1VyaSA9IHJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKG5zUHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChEdXJhdGlvbilvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnhzZC5FeHRlbnNpb25NYXBwZXIuZ2V0VHlwZU9iamVjdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc1VyaSx0eXBlLHJlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBOb3RlIGFsbCBhdHRyaWJ1dGVzIHRoYXQgd2VyZSBoYW5kbGVkLiBVc2VkIHRvIGRpZmZlciBub3JtYWwgYXR0cmlidXRlcwotICAgICAgICAgICAgICAgIC8vIGZyb20gYW55QXR0cmlidXRlcy4KLSAgICAgICAgICAgICAgICBqYXZhLnV0aWwuVmVjdG9yIGhhbmRsZWRBdHRyaWJ1dGVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSghcmVhZGVyLmlzRW5kRWxlbWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCA9IHJlYWRlci5nZXRFbGVtZW50VGV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldER1cmF0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9EdXJhdGlvbihjb250ZW50KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gRW5kIG9mIGlmIGZvciBleHBlY3RlZCBwcm9wZXJ0eSBzdGFydCBlbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgc3RhcnQgZWxlbWVudCB3ZSBhcmUgbm90IGV4cGVjdGluZyBpbmRpY2F0ZXMgYW4gaW52YWxpZCBwYXJhbWV0ZXIgd2FzIHBhc3NlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiVW5leHBlY3RlZCBzdWJlbGVtZW50ICIgKyByZWFkZXIuZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIGVuZCBvZiB3aGlsZSBsb29wCi0gICAgICAgICAgICAgICAgICAgICAgICAKLQotCi0KLSAgICAgICAgICAgIH0gY2F0Y2ggKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5sYW5nLkV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG9iamVjdDsKLSAgICAgICAgfQotCi0gICAgICAgIH0vL2VuZCBvZiBmYWN0b3J5IGNsYXNzCi0KLSAgICAgICAgCi0KLSAgICAgICAgfQotICAgICAgICAgICAKLSAgICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMveHNkL0VOVElUSUVTLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMveHNkL0VOVElUSUVTLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjOTU0ODEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3hzZC9FTlRJVElFUy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAzICswLDAgQEAKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBFTlRJVElFUy5qYXZhCi0gKgotICogVGhpcyBmaWxlIHdhcyBhdXRvLWdlbmVyYXRlZCBmcm9tIFdTREwKLSAqIGJ5IHRoZSBBcGFjaGUgQXhpczIgdmVyc2lvbjogU05BUFNIT1QgIEJ1aWx0IG9uIDogRGVjIDIxLCAyMDA3ICgwNDowMzozMCBMS1QpCi0gKi8KLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy54c2Q7Ci0gICAgICAgICAgICAKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqICBFTlRJVElFUyBiZWFuIGNsYXNzCi0gICAgICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgcHVibGljICBjbGFzcyBFTlRJVElFUwotICAgICAgICBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCQmVhbnsKLSAgICAgICAgLyogVGhpcyB0eXBlIHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgcGllY2Ugb2Ygc2NoZW1hIHRoYXQgaGFkCi0gICAgICAgICAgICAgICAgbmFtZSA9IEVOVElUSUVTCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFVSSSA9IGh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFByZWZpeCA9IG5zMQotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdlbmVyYXRlUHJlZml4KGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB7Ci0gICAgICAgICAgICBpZihuYW1lc3BhY2UuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpKXsKLSAgICAgICAgICAgICAgICByZXR1cm4gInhzZCI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgfQotCi0gICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogZmllbGQgZm9yIEVOVElUSUVTCi0gICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLkVudGl0aWVzIGxvY2FsRU5USVRJRVMgOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIGdldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLkVudGl0aWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLkVudGl0aWVzIGdldEVOVElUSUVTKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsRU5USVRJRVM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBzZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gcGFyYW0gRU5USVRJRVMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldEVOVElUSUVTKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuRW50aXRpZXMgcGFyYW0pewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2FsRU5USVRJRVM9cGFyYW07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbEVOVElUSUVTLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAvKioKLSAgICAgKiBpc1JlYWRlck1UT01Bd2FyZQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVhZGVyIHN1cHBvcnRzIE1UT00KLSAgICAgKi8KLSAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKLSAgICAgICAgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICAKLSAgICAgICAgdHJ5ewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gamF2YS5sYW5nLkJvb2xlYW4uVFJVRS5lcXVhbHMocmVhZGVyLmdldFByb3BlcnR5KG9yZy5hcGFjaGUuYXhpb20ub20uT01Db25zdGFudHMuSVNfREFUQV9IQU5ETEVSU19BV0FSRSkpOwotICAgICAgICB9Y2F0Y2goamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpc1JlYWRlck1UT01Bd2FyZTsKLSAgIH0KLSAgICAgCi0gICAgIAotICAgICAgICAvKioKLSAgICAgICAgKgotICAgICAgICAqIEBwYXJhbSBwYXJlbnRRTmFtZQotICAgICAgICAqIEBwYXJhbSBmYWN0b3J5Ci0gICAgICAgICogQHJldHVybiBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudAotICAgICAgICAqLwotICAgICAgIHB1YmxpYyBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCBnZXRPTUVsZW1lbnQgKAotICAgICAgICAgICAgICAgZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnkpIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTURhdGFTb3VyY2UgZGF0YVNvdXJjZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkRhdGFTb3VyY2UodGhpcyxwYXJlbnRRTmFtZSl7Ci0KLSAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgIEVOVElUSUVTLnRoaXMuc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmxsb20uT01Tb3VyY2VkRWxlbWVudEltcGwoCi0gICAgICAgICAgICAgICBwYXJlbnRRTmFtZSxmYWN0b3J5LGRhdGFTb3VyY2UpOwotICAgICAgICAgICAgCi0gICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyLGZhbHNlKTsKLSAgICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VyaWFsaXplVHlwZSkKLSAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLQotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBwYXJlbnRRTmFtZS5nZXRQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlID0gcGFyZW50UU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2UgIT0gbnVsbCkgJiYgKG5hbWVzcGFjZS50cmltKCkubGVuZ3RoKCkgPiAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB3cml0ZXJQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAod3JpdGVyUHJlZml4ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQobmFtZXNwYWNlLCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwcmVmaXgsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICBpZiAoc2VyaWFsaXplVHlwZSl7Ci0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKTsKLSAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZVByZWZpeCAhPSBudWxsKSAmJiAobmFtZXNwYWNlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApKXsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VQcmVmaXgrIjpFTlRJVElFUyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVOVElUSUVTIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsRU5USVRJRVM9PW51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIHRoZSBuaWwgYXR0cmlidXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiRU5USVRJRVMgY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxFTlRJVElFUykpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGggdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgcHJlZml4LGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgaWYgKHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotCi0gICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotCi0gICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSwgamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVOYW1lc3BhY2UgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgoYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVZhbHVlOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IGF0dHJpYnV0ZVByZWZpeCArICI6IiArIHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLCBhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAvKioKLSAgICAgICAgICogIG1ldGhvZCB0byBoYW5kbGUgUW5hbWVzCi0gICAgICAgICAqLwotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHByZWZpeCArICI6IiArIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBpLmUgdGhpcyBpcyB0aGUgZGVmYXVsdCBuYW1lc3BhY2UKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVzKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWVbXSBxbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgIGlmIChxbmFtZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gc3RvcmUgdGhpcyBkYXRhIHVudGlsIGxhc3QgbW9tZW50IHNpbmNlIGl0IGlzIG5vdCBwb3NzaWJsZSB0byB3cml0ZSBhbnkKLSAgICAgICAgICAgICAgICAvLyBuYW1lc3BhY2UgZGF0YSBhZnRlciB3cml0aW5nIHRoZSBjaGFyYWN0b3IgZGF0YQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmdCdWZmZXIgc3RyaW5nVG9Xcml0ZSA9IG5ldyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcW5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQoIiAiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VVUkkgPSBxbmFtZXNbaV0uZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwcmVmaXggPT0gbnVsbCkgfHwgKHByZWZpeC5sZW5ndGgoKSA9PSAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKHByZWZpeCkuYXBwZW5kKCI6IikuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMoc3RyaW5nVG9Xcml0ZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAqIFJlZ2lzdGVyIGEgbmFtZXNwYWNlIHByZWZpeAotICAgICAgICAgKi8KLSAgICAgICAgIHByaXZhdGUgamF2YS5sYW5nLlN0cmluZyByZWdpc3RlclByZWZpeChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHhtbFdyaXRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiBwcmVmaXg7Ci0gICAgICAgICAgICB9Ci0KLQotICAKLSAgICAgICAgLyoqCi0gICAgICAgICogZGF0YWJpbmRpbmcgbWV0aG9kIHRvIGdldCBhbiBYTUwgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QKLSAgICAgICAgKgotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgZ2V0UHVsbFBhcnNlcihqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFOYW1lKQotICAgICAgICAgICAgICAgICAgICB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBlbGVtZW50TGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgYXR0cmliTGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVyLkVMRU1FTlRfVEVYVCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxFTlRJVElFUyAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxFTlRJVElFUykpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJFTlRJVElFUyBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlckltcGwocU5hbWUsIGVsZW1lbnRMaXN0LnRvQXJyYXkoKSwgYXR0cmliTGlzdC50b0FycmF5KCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgCi0KLSAgICAgLyoqCi0gICAgICAqICBGYWN0b3J5IGNsYXNzIHRoYXQga2VlcHMgdGhlIHBhcnNlIG1ldGhvZAotICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3Rvcnl7Ci0KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgRU5USVRJRVMgZnJvbVN0cmluZyhqYXZhLmxhbmcuU3RyaW5nIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJKXsKLSAgICAgICAgICAgICAgICAgICAgRU5USVRJRVMgcmV0dXJuVmFsdWUgPSBuZXcgIEVOVElUSUVTKCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlLnNldEVOVElUSUVTKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvRU5USVRJRVModmFsdWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIEVOVElUSUVTIGZyb21TdHJpbmcoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBjb250ZW50LnN1YnN0cmluZygwLGNvbnRlbnQuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVXJpID0geG1sU3RyZWFtUmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFTlRJVElFUy5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCxuYW1lc3BhY2VVcmkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRU5USVRJRVMuRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsIiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAKLQotICAgICAgICAvKioKLSAgICAgICAgKiBzdGF0aWMgbWV0aG9kIHRvIGNyZWF0ZSB0aGUgb2JqZWN0Ci0gICAgICAgICogUHJlY29uZGl0aW9uOiAgSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIGN1cnJlbnQgb3IgbmV4dCBzdGFydCBlbGVtZW50IHN0YXJ0cyB0aGlzIG9iamVjdCBhbmQgYW55IGludGVydmVuaW5nIHJlYWRlciBldmVudHMgYXJlIGlnbm9yYWJsZQotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIG5vdCBhbiBlbGVtZW50LCBpdCBpcyBhIGNvbXBsZXggdHlwZSBhbmQgdGhlIHJlYWRlciBpcyBhdCB0aGUgZXZlbnQganVzdCBhZnRlciB0aGUgb3V0ZXIgc3RhcnQgZWxlbWVudAotICAgICAgICAqIFBvc3Rjb25kaXRpb246IElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCBpdHMgZW5kIGVsZW1lbnQKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBhIGNvbXBsZXggdHlwZSwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IHRoZSBlbmQgZWxlbWVudCBvZiBpdHMgb3V0ZXIgZWxlbWVudAotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIEVOVElUSUVTIHBhcnNlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb257Ci0gICAgICAgICAgICBFTlRJVElFUyBvYmplY3QgPQotICAgICAgICAgICAgICAgIG5ldyBFTlRJVElFUygpOwotCi0gICAgICAgICAgICBpbnQgZXZlbnQ7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5pbGxhYmxlVmFsdWUgPSBudWxsOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSIiOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2V1cmkgPSIiOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSAoIXJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICYmICFyZWFkZXIuaXNFbmRFbGVtZW50KCkpCi0gICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiKSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGZ1bGxUeXBlTmFtZSA9IHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiKTsKLSAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUhPW51bGwpewotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zUHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoMCxmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IG5zUHJlZml4PT1udWxsPyIiOm5zUHJlZml4OwotCi0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgdHlwZSA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSsxKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEiRU5USVRJRVMiLmVxdWFscyh0eXBlKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZmluZCBuYW1lc3BhY2UgZm9yIHRoZSBwcmVmaXgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1VyaSA9IHJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKG5zUHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChFTlRJVElFUylvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnhzZC5FeHRlbnNpb25NYXBwZXIuZ2V0VHlwZU9iamVjdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc1VyaSx0eXBlLHJlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBOb3RlIGFsbCBhdHRyaWJ1dGVzIHRoYXQgd2VyZSBoYW5kbGVkLiBVc2VkIHRvIGRpZmZlciBub3JtYWwgYXR0cmlidXRlcwotICAgICAgICAgICAgICAgIC8vIGZyb20gYW55QXR0cmlidXRlcy4KLSAgICAgICAgICAgICAgICBqYXZhLnV0aWwuVmVjdG9yIGhhbmRsZWRBdHRyaWJ1dGVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSghcmVhZGVyLmlzRW5kRWxlbWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCA9IHJlYWRlci5nZXRFbGVtZW50VGV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldEVOVElUSUVTKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9FTlRJVElFUyhjb250ZW50KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gRW5kIG9mIGlmIGZvciBleHBlY3RlZCBwcm9wZXJ0eSBzdGFydCBlbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgc3RhcnQgZWxlbWVudCB3ZSBhcmUgbm90IGV4cGVjdGluZyBpbmRpY2F0ZXMgYW4gaW52YWxpZCBwYXJhbWV0ZXIgd2FzIHBhc3NlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiVW5leHBlY3RlZCBzdWJlbGVtZW50ICIgKyByZWFkZXIuZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIGVuZCBvZiB3aGlsZSBsb29wCi0gICAgICAgICAgICAgICAgICAgICAgICAKLQotCi0KLSAgICAgICAgICAgIH0gY2F0Y2ggKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5sYW5nLkV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG9iamVjdDsKLSAgICAgICAgfQotCi0gICAgICAgIH0vL2VuZCBvZiBmYWN0b3J5IGNsYXNzCi0KLSAgICAgICAgCi0KLSAgICAgICAgfQotICAgICAgICAgICAKLSAgICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMveHNkL0VOVElUWS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3hzZC9FTlRJVFkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTUwNDMyMy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMveHNkL0VOVElUWS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAzICswLDAgQEAKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBFTlRJVFkuamF2YQotICoKLSAqIFRoaXMgZmlsZSB3YXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBXU0RMCi0gKiBieSB0aGUgQXBhY2hlIEF4aXMyIHZlcnNpb246IFNOQVBTSE9UICBCdWlsdCBvbiA6IERlYyAyMSwgMjAwNyAoMDQ6MDM6MzAgTEtUKQotICovCi0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBwYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkOwotICAgICAgICAgICAgCi0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiAgRU5USVRZIGJlYW4gY2xhc3MKLSAgICAgICAgICAgICovCi0gICAgICAgIAotICAgICAgICBwdWJsaWMgIGNsYXNzIEVOVElUWQotICAgICAgICBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCQmVhbnsKLSAgICAgICAgLyogVGhpcyB0eXBlIHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgcGllY2Ugb2Ygc2NoZW1hIHRoYXQgaGFkCi0gICAgICAgICAgICAgICAgbmFtZSA9IEVOVElUWQotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBVUkkgPSBodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYQotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBQcmVmaXggPSBuczEKLSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgCi0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZW5lcmF0ZVByZWZpeChqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICAgICAgaWYobmFtZXNwYWNlLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSl7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJ4c2QiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgIH0KLQotICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIGZpZWxkIGZvciBFTlRJVFkKLSAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuRW50aXR5IGxvY2FsRU5USVRZIDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBnZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5FbnRpdHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuRW50aXR5IGdldEVOVElUWSgpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbEVOVElUWTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIHNldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSBwYXJhbSBFTlRJVFkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldEVOVElUWShvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLkVudGl0eSBwYXJhbSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYWxFTlRJVFk9cGFyYW07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbEVOVElUWS50b1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgLyoqCi0gICAgICogaXNSZWFkZXJNVE9NQXdhcmUKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlYWRlciBzdXBwb3J0cyBNVE9NCi0gICAgICovCi0gICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIHRyeXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGphdmEubGFuZy5Cb29sZWFuLlRSVUUuZXF1YWxzKHJlYWRlci5nZXRQcm9wZXJ0eShvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQ29uc3RhbnRzLklTX0RBVEFfSEFORExFUlNfQVdBUkUpKTsKLSAgICAgICAgfWNhdGNoKGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXNSZWFkZXJNVE9NQXdhcmU7Ci0gICB9Ci0gICAgIAotICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICoKLSAgICAgICAgKiBAcGFyYW0gcGFyZW50UU5hbWUKLSAgICAgICAgKiBAcGFyYW0gZmFjdG9yeQotICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICBwdWJsaWMgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgZ2V0T01FbGVtZW50ICgKLSAgICAgICAgICAgICAgIGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5KSB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlIGRhdGFTb3VyY2UgPQotICAgICAgICAgICAgICAgICAgICAgICBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJEYXRhU291cmNlKHRoaXMscGFyZW50UU5hbWUpewotCi0gICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICBFTlRJVFkudGhpcy5zZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5PTVNvdXJjZWRFbGVtZW50SW1wbCgKLSAgICAgICAgICAgICAgIHBhcmVudFFOYW1lLGZhY3RvcnksZGF0YVNvdXJjZSk7Ci0gICAgICAgICAgICAKLSAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIsZmFsc2UpOwotICAgICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzZXJpYWxpemVUeXBlKQotICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotCi0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UgPSBudWxsOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHBhcmVudFFOYW1lLmdldFByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UgPSBwYXJlbnRRTmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZSAhPSBudWxsKSAmJiAobmFtZXNwYWNlLnRyaW0oKS5sZW5ndGgoKSA+IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHdyaXRlclByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3cml0ZXJQcmVmaXggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChuYW1lc3BhY2UsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHByZWZpeCwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCksIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIGlmIChzZXJpYWxpemVUeXBlKXsKLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpOwotICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlUHJlZml4ICE9IG51bGwpICYmIChuYW1lc3BhY2VQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkpewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVByZWZpeCsiOkVOVElUWSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVOVElUWSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbEVOVElUWT09bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgdGhlIG5pbCBhdHRyaWJ1dGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJFTlRJVFkgY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxFTlRJVFkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRoIHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCxqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgIGlmICh4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLQotICAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsIGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlTmFtZXNwYWNlID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVWYWx1ZTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBhdHRyaWJ1dGVQcmVmaXggKyAiOiIgKyBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSwgYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICBtZXRob2QgdG8gaGFuZGxlIFFuYW1lcwotICAgICAgICAgKi8KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZShqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhwcmVmaXggKyAiOiIgKyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaS5lIHRoaXMgaXMgdGhlIGRlZmF1bHQgbmFtZXNwYWNlCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lcyhqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lW10gcW5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICBpZiAocW5hbWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHRvIHN0b3JlIHRoaXMgZGF0YSB1bnRpbCBsYXN0IG1vbWVudCBzaW5jZSBpdCBpcyBub3QgcG9zc2libGUgdG8gd3JpdGUgYW55Ci0gICAgICAgICAgICAgICAgLy8gbmFtZXNwYWNlIGRhdGEgYWZ0ZXIgd3JpdGluZyB0aGUgY2hhcmFjdG9yIGRhdGEKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIHN0cmluZ1RvV3JpdGUgPSBuZXcgamF2YS5sYW5nLlN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHFuYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKCIgIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlVVJJID0gcW5hbWVzW2ldLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocHJlZml4ID09IG51bGwpIHx8IChwcmVmaXgubGVuZ3RoKCkgPT0gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChwcmVmaXgpLmFwcGVuZCgiOiIpLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHN0cmluZ1RvV3JpdGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0KLSAgICAgICAgIC8qKgotICAgICAgICAgKiBSZWdpc3RlciBhIG5hbWVzcGFjZSBwcmVmaXgKLSAgICAgICAgICovCi0gICAgICAgICBwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgcmVnaXN0ZXJQcmVmaXgoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLCBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlICh4bWxXcml0ZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gcHJlZml4OwotICAgICAgICAgICAgfQotCi0KLSAgCi0gICAgICAgIC8qKgotICAgICAgICAqIGRhdGFiaW5kaW5nIG1ldGhvZCB0byBnZXQgYW4gWE1MIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0Ci0gICAgICAgICoKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIGdldFB1bGxQYXJzZXIoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxTmFtZSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgZWxlbWVudExpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGF0dHJpYkxpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlci5FTEVNRU5UX1RFWFQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsRU5USVRZICE9IG51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbEVOVElUWSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJFTlRJVFkgY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXJJbXBsKHFOYW1lLCBlbGVtZW50TGlzdC50b0FycmF5KCksIGF0dHJpYkxpc3QudG9BcnJheSgpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gIAotCi0gICAgIC8qKgotICAgICAgKiAgRmFjdG9yeSBjbGFzcyB0aGF0IGtlZXBzIHRoZSBwYXJzZSBtZXRob2QKLSAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5ewotCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIEVOVElUWSBmcm9tU3RyaW5nKGphdmEubGFuZy5TdHJpbmcgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkpewotICAgICAgICAgICAgICAgICAgICBFTlRJVFkgcmV0dXJuVmFsdWUgPSBuZXcgIEVOVElUWSgpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZS5zZXRFTlRJVFkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9FTlRJVFkodmFsdWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIEVOVElUWSBmcm9tU3RyaW5nKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50LmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gY29udGVudC5zdWJzdHJpbmcoMCxjb250ZW50LmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVyaSA9IHhtbFN0cmVhbVJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRU5USVRZLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LG5hbWVzcGFjZVVyaSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFTlRJVFkuRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsIiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAKLQotICAgICAgICAvKioKLSAgICAgICAgKiBzdGF0aWMgbWV0aG9kIHRvIGNyZWF0ZSB0aGUgb2JqZWN0Ci0gICAgICAgICogUHJlY29uZGl0aW9uOiAgSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIGN1cnJlbnQgb3IgbmV4dCBzdGFydCBlbGVtZW50IHN0YXJ0cyB0aGlzIG9iamVjdCBhbmQgYW55IGludGVydmVuaW5nIHJlYWRlciBldmVudHMgYXJlIGlnbm9yYWJsZQotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIG5vdCBhbiBlbGVtZW50LCBpdCBpcyBhIGNvbXBsZXggdHlwZSBhbmQgdGhlIHJlYWRlciBpcyBhdCB0aGUgZXZlbnQganVzdCBhZnRlciB0aGUgb3V0ZXIgc3RhcnQgZWxlbWVudAotICAgICAgICAqIFBvc3Rjb25kaXRpb246IElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCBpdHMgZW5kIGVsZW1lbnQKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBhIGNvbXBsZXggdHlwZSwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IHRoZSBlbmQgZWxlbWVudCBvZiBpdHMgb3V0ZXIgZWxlbWVudAotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIEVOVElUWSBwYXJzZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uewotICAgICAgICAgICAgRU5USVRZIG9iamVjdCA9Ci0gICAgICAgICAgICAgICAgbmV3IEVOVElUWSgpOwotCi0gICAgICAgICAgICBpbnQgZXZlbnQ7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5pbGxhYmxlVmFsdWUgPSBudWxsOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSIiOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2V1cmkgPSIiOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSAoIXJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICYmICFyZWFkZXIuaXNFbmRFbGVtZW50KCkpCi0gICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiKSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGZ1bGxUeXBlTmFtZSA9IHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiKTsKLSAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUhPW51bGwpewotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zUHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoMCxmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IG5zUHJlZml4PT1udWxsPyIiOm5zUHJlZml4OwotCi0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgdHlwZSA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSsxKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEiRU5USVRZIi5lcXVhbHModHlwZSkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2ZpbmQgbmFtZXNwYWNlIGZvciB0aGUgcHJlZml4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNVcmkgPSByZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShuc1ByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoRU5USVRZKW9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkLkV4dGVuc2lvbk1hcHBlci5nZXRUeXBlT2JqZWN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zVXJpLHR5cGUscmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIE5vdGUgYWxsIGF0dHJpYnV0ZXMgdGhhdCB3ZXJlIGhhbmRsZWQuIFVzZWQgdG8gZGlmZmVyIG5vcm1hbCBhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgICAgLy8gZnJvbSBhbnlBdHRyaWJ1dGVzLgotICAgICAgICAgICAgICAgIGphdmEudXRpbC5WZWN0b3IgaGFuZGxlZEF0dHJpYnV0ZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlKCFyZWFkZXIuaXNFbmRFbGVtZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50ID0gcmVhZGVyLmdldEVsZW1lbnRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0RU5USVRZKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9FTlRJVFkoY29udGVudCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIEVuZCBvZiBpZiBmb3IgZXhwZWN0ZWQgcHJvcGVydHkgc3RhcnQgZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHN0YXJ0IGVsZW1lbnQgd2UgYXJlIG5vdCBleHBlY3RpbmcgaW5kaWNhdGVzIGFuIGludmFsaWQgcGFyYW1ldGVyIHdhcyBwYXNzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIlVuZXhwZWN0ZWQgc3ViZWxlbWVudCAiICsgcmVhZGVyLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBlbmQgb2Ygd2hpbGUgbG9vcAotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLQotCi0gICAgICAgICAgICB9IGNhdGNoIChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEubGFuZy5FeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBvYmplY3Q7Ci0gICAgICAgIH0KLQotICAgICAgICB9Ly9lbmQgb2YgZmFjdG9yeSBjbGFzcwotCi0gICAgICAgIAotCi0gICAgICAgIH0KLSAgICAgICAgICAgCi0gICAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3hzZC9FeHRlbnNpb25NYXBwZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy94c2QvRXh0ZW5zaW9uTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwYzJiZjkuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3hzZC9FeHRlbnNpb25NYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIEV4dGVuc2lvbk1hcHBlci5qYXZhCi0gKgotICogVGhpcyBmaWxlIHdhcyBhdXRvLWdlbmVyYXRlZCBmcm9tIFdTREwKLSAqIGJ5IHRoZSBBcGFjaGUgQXhpczIgdmVyc2lvbjogU05BUFNIT1QgIEJ1aWx0IG9uIDogRGVjIDIxLCAyMDA3ICgwNDowMzozMCBMS1QpCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnhzZDsKLQotLyoqCi0gKiBFeHRlbnNpb25NYXBwZXIgY2xhc3MKLSAqLwotCi1wdWJsaWMgY2xhc3MgRXh0ZW5zaW9uTWFwcGVyIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLk9iamVjdCBnZXRUeXBlT2JqZWN0KGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgdHlwZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbiB7Ci0KLQotICAgICAgICBpZiAoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIi5lcXVhbHMobmFtZXNwYWNlVVJJKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgInVuc2lnbmVkQnl0ZSIuZXF1YWxzKHR5cGVOYW1lKSkgewotCi0gICAgICAgICAgICByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy54c2QuVW5zaWduZWRCeXRlLkZhY3RvcnkucGFyc2UocmVhZGVyKTsKLQotCi0gICAgICAgIH0KLQotCi0gICAgICAgIGlmICgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiLmVxdWFscyhuYW1lc3BhY2VVUkkpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAiTk1UT0tFTiIuZXF1YWxzKHR5cGVOYW1lKSkgewotCi0gICAgICAgICAgICByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy54c2QuTk1UT0tFTi5GYWN0b3J5LnBhcnNlKHJlYWRlcik7Ci0KLQotICAgICAgICB9Ci0KLQotICAgICAgICBpZiAoCi0gICAgICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIi5lcXVhbHMobmFtZXNwYWNlVVJJKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgImR1cmF0aW9uIi5lcXVhbHModHlwZU5hbWUpKSB7Ci0KLSAgICAgICAgICAgIHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnhzZC5EdXJhdGlvbi5GYWN0b3J5LnBhcnNlKHJlYWRlcik7Ci0KLQotICAgICAgICB9Ci0KLQotICAgICAgICBpZiAoCi0gICAgICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIi5lcXVhbHMobmFtZXNwYWNlVVJJKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgImludCIuZXF1YWxzKHR5cGVOYW1lKSkgewotCi0gICAgICAgICAgICByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy54c2QuX2ludC5GYWN0b3J5LnBhcnNlKHJlYWRlcik7Ci0KLQotICAgICAgICB9Ci0KLQotICAgICAgICBpZiAoCi0gICAgICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIi5lcXVhbHMobmFtZXNwYWNlVVJJKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgInN0cmluZyIuZXF1YWxzKHR5cGVOYW1lKSkgewotCi0gICAgICAgICAgICByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy54c2QuU3RyaW5nLkZhY3RvcnkucGFyc2UocmVhZGVyKTsKLQotCi0gICAgICAgIH0KLQotCi0gICAgICAgIGlmICgKLSAgICAgICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiLmVxdWFscyhuYW1lc3BhY2VVUkkpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAiTk9UQVRJT04iLmVxdWFscyh0eXBlTmFtZSkpIHsKLQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkLk5PVEFUSU9OLkZhY3RvcnkucGFyc2UocmVhZGVyKTsKLQotCi0gICAgICAgIH0KLQotCi0gICAgICAgIGlmICgKLSAgICAgICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiLmVxdWFscyhuYW1lc3BhY2VVUkkpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAidGltZSIuZXF1YWxzKHR5cGVOYW1lKSkgewotCi0gICAgICAgICAgICByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy54c2QuVGltZS5GYWN0b3J5LnBhcnNlKHJlYWRlcik7Ci0KLQotICAgICAgICB9Ci0KLQotICAgICAgICBpZiAoCi0gICAgICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIi5lcXVhbHMobmFtZXNwYWNlVVJJKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgImdEYXkiLmVxdWFscyh0eXBlTmFtZSkpIHsKLQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkLkdEYXkuRmFjdG9yeS5wYXJzZShyZWFkZXIpOwotCi0KLSAgICAgICAgfQotCi0KLSAgICAgICAgaWYgKAotICAgICAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIuZXF1YWxzKG5hbWVzcGFjZVVSSSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICJoZXhCaW5hcnkiLmVxdWFscyh0eXBlTmFtZSkpIHsKLQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkLkhleEJpbmFyeS5GYWN0b3J5LnBhcnNlKHJlYWRlcik7Ci0KLQotICAgICAgICB9Ci0KLQotICAgICAgICBpZiAoCi0gICAgICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIi5lcXVhbHMobmFtZXNwYWNlVVJJKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgIm5vbk5lZ2F0aXZlSW50ZWdlciIuZXF1YWxzKHR5cGVOYW1lKSkgewotCi0gICAgICAgICAgICByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy54c2QuTm9uTmVnYXRpdmVJbnRlZ2VyLkZhY3RvcnkucGFyc2UocmVhZGVyKTsKLQotCi0gICAgICAgIH0KLQotCi0gICAgICAgIGlmICgKLSAgICAgICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiLmVxdWFscyhuYW1lc3BhY2VVUkkpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAiTkNOYW1lIi5lcXVhbHModHlwZU5hbWUpKSB7Ci0KLSAgICAgICAgICAgIHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnhzZC5OQ05hbWUuRmFjdG9yeS5wYXJzZShyZWFkZXIpOwotCi0KLSAgICAgICAgfQotCi0KLSAgICAgICAgaWYgKAotICAgICAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIuZXF1YWxzKG5hbWVzcGFjZVVSSSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICJOTVRPS0VOUyIuZXF1YWxzKHR5cGVOYW1lKSkgewotCi0gICAgICAgICAgICByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy54c2QuTk1UT0tFTlMuRmFjdG9yeS5wYXJzZShyZWFkZXIpOwotCi0KLSAgICAgICAgfQotCi0KLSAgICAgICAgaWYgKAotICAgICAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIuZXF1YWxzKG5hbWVzcGFjZVVSSSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICJ1bnNpZ25lZEludCIuZXF1YWxzKHR5cGVOYW1lKSkgewotCi0gICAgICAgICAgICByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy54c2QuVW5zaWduZWRJbnQuRmFjdG9yeS5wYXJzZShyZWFkZXIpOwotCi0KLSAgICAgICAgfQotCi0KLSAgICAgICAgaWYgKAotICAgICAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIuZXF1YWxzKG5hbWVzcGFjZVVSSSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICJ1bnNpZ25lZExvbmciLmVxdWFscyh0eXBlTmFtZSkpIHsKLQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkLlVuc2lnbmVkTG9uZy5GYWN0b3J5LnBhcnNlKHJlYWRlcik7Ci0KLQotICAgICAgICB9Ci0KLQotICAgICAgICBpZiAoCi0gICAgICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIi5lcXVhbHMobmFtZXNwYWNlVVJJKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgIm5lZ2F0aXZlSW50ZWdlciIuZXF1YWxzKHR5cGVOYW1lKSkgewotCi0gICAgICAgICAgICByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy54c2QuTmVnYXRpdmVJbnRlZ2VyLkZhY3RvcnkucGFyc2UocmVhZGVyKTsKLQotCi0gICAgICAgIH0KLQotCi0gICAgICAgIGlmICgKLSAgICAgICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiLmVxdWFscyhuYW1lc3BhY2VVUkkpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAiZGF0ZVRpbWUiLmVxdWFscyh0eXBlTmFtZSkpIHsKLQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkLkRhdGVUaW1lLkZhY3RvcnkucGFyc2UocmVhZGVyKTsKLQotCi0gICAgICAgIH0KLQotCi0gICAgICAgIGlmICgKLSAgICAgICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiLmVxdWFscyhuYW1lc3BhY2VVUkkpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAidW5zaWduZWRTaG9ydCIuZXF1YWxzKHR5cGVOYW1lKSkgewotCi0gICAgICAgICAgICByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy54c2QuVW5zaWduZWRTaG9ydC5GYWN0b3J5LnBhcnNlKHJlYWRlcik7Ci0KLQotICAgICAgICB9Ci0KLQotICAgICAgICBpZiAoCi0gICAgICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIi5lcXVhbHMobmFtZXNwYWNlVVJJKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgImdZZWFyTW9udGgiLmVxdWFscyh0eXBlTmFtZSkpIHsKLQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkLkdZZWFyTW9udGguRmFjdG9yeS5wYXJzZShyZWFkZXIpOwotCi0KLSAgICAgICAgfQotCi0KLSAgICAgICAgaWYgKAotICAgICAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIuZXF1YWxzKG5hbWVzcGFjZVVSSSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICJib29sZWFuIi5lcXVhbHModHlwZU5hbWUpKSB7Ci0KLSAgICAgICAgICAgIHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnhzZC5fYm9vbGVhbi5GYWN0b3J5LnBhcnNlKHJlYWRlcik7Ci0KLQotICAgICAgICB9Ci0KLQotICAgICAgICBpZiAoCi0gICAgICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIi5lcXVhbHMobmFtZXNwYWNlVVJJKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgIm5vblBvc2l0aXZlSW50ZWdlciIuZXF1YWxzKHR5cGVOYW1lKSkgewotCi0gICAgICAgICAgICByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy54c2QuTm9uUG9zaXRpdmVJbnRlZ2VyLkZhY3RvcnkucGFyc2UocmVhZGVyKTsKLQotCi0gICAgICAgIH0KLQotCi0gICAgICAgIGlmICgKLSAgICAgICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiLmVxdWFscyhuYW1lc3BhY2VVUkkpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAiYmFzZTY0Ii5lcXVhbHModHlwZU5hbWUpKSB7Ci0KLSAgICAgICAgICAgIHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnhzZC5CYXNlNjQuRmFjdG9yeS5wYXJzZShyZWFkZXIpOwotCi0KLSAgICAgICAgfQotCi0KLSAgICAgICAgaWYgKAotICAgICAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIuZXF1YWxzKG5hbWVzcGFjZVVSSSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICJkb3VibGUiLmVxdWFscyh0eXBlTmFtZSkpIHsKLQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkLl9kb3VibGUuRmFjdG9yeS5wYXJzZShyZWFkZXIpOwotCi0KLSAgICAgICAgfQotCi0KLSAgICAgICAgaWYgKAotICAgICAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIuZXF1YWxzKG5hbWVzcGFjZVVSSSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICJmbG9hdCIuZXF1YWxzKHR5cGVOYW1lKSkgewotCi0gICAgICAgICAgICByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy54c2QuX2Zsb2F0LkZhY3RvcnkucGFyc2UocmVhZGVyKTsKLQotCi0gICAgICAgIH0KLQotCi0gICAgICAgIGlmICgKLSAgICAgICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiLmVxdWFscyhuYW1lc3BhY2VVUkkpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAiYmFzZTY0QmluYXJ5Ii5lcXVhbHModHlwZU5hbWUpKSB7Ci0KLSAgICAgICAgICAgIHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnhzZC5CYXNlNjRCaW5hcnkuRmFjdG9yeS5wYXJzZShyZWFkZXIpOwotCi0KLSAgICAgICAgfQotCi0KLSAgICAgICAgaWYgKAotICAgICAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIuZXF1YWxzKG5hbWVzcGFjZVVSSSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICJnTW9udGhEYXkiLmVxdWFscyh0eXBlTmFtZSkpIHsKLQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkLkdNb250aERheS5GYWN0b3J5LnBhcnNlKHJlYWRlcik7Ci0KLQotICAgICAgICB9Ci0KLQotICAgICAgICBpZiAoCi0gICAgICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIi5lcXVhbHMobmFtZXNwYWNlVVJJKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgIk5hbWUiLmVxdWFscyh0eXBlTmFtZSkpIHsKLQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkLk5hbWUuRmFjdG9yeS5wYXJzZShyZWFkZXIpOwotCi0KLSAgICAgICAgfQotCi0KLSAgICAgICAgaWYgKAotICAgICAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIuZXF1YWxzKG5hbWVzcGFjZVVSSSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICJFTlRJVFkiLmVxdWFscyh0eXBlTmFtZSkpIHsKLQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkLkVOVElUWS5GYWN0b3J5LnBhcnNlKHJlYWRlcik7Ci0KLQotICAgICAgICB9Ci0KLQotICAgICAgICBpZiAoCi0gICAgICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIi5lcXVhbHMobmFtZXNwYWNlVVJJKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgImJ5dGUiLmVxdWFscyh0eXBlTmFtZSkpIHsKLQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkLl9ieXRlLkZhY3RvcnkucGFyc2UocmVhZGVyKTsKLQotCi0gICAgICAgIH0KLQotCi0gICAgICAgIGlmICgKLSAgICAgICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiLmVxdWFscyhuYW1lc3BhY2VVUkkpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAibG9uZyIuZXF1YWxzKHR5cGVOYW1lKSkgewotCi0gICAgICAgICAgICByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy54c2QuX2xvbmcuRmFjdG9yeS5wYXJzZShyZWFkZXIpOwotCi0KLSAgICAgICAgfQotCi0KLSAgICAgICAgaWYgKAotICAgICAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIuZXF1YWxzKG5hbWVzcGFjZVVSSSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICJJRFJFRiIuZXF1YWxzKHR5cGVOYW1lKSkgewotCi0gICAgICAgICAgICByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy54c2QuSURSRUYuRmFjdG9yeS5wYXJzZShyZWFkZXIpOwotCi0KLSAgICAgICAgfQotCi0KLSAgICAgICAgaWYgKAotICAgICAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIuZXF1YWxzKG5hbWVzcGFjZVVSSSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICJnWWVhciIuZXF1YWxzKHR5cGVOYW1lKSkgewotCi0gICAgICAgICAgICByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy54c2QuR1llYXIuRmFjdG9yeS5wYXJzZShyZWFkZXIpOwotCi0KLSAgICAgICAgfQotCi0KLSAgICAgICAgaWYgKAotICAgICAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIuZXF1YWxzKG5hbWVzcGFjZVVSSSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICJJRCIuZXF1YWxzKHR5cGVOYW1lKSkgewotCi0gICAgICAgICAgICByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy54c2QuSUQuRmFjdG9yeS5wYXJzZShyZWFkZXIpOwotCi0KLSAgICAgICAgfQotCi0KLSAgICAgICAgaWYgKAotICAgICAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIuZXF1YWxzKG5hbWVzcGFjZVVSSSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICJhbnlVUkkiLmVxdWFscyh0eXBlTmFtZSkpIHsKLQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkLkFueVVSSS5GYWN0b3J5LnBhcnNlKHJlYWRlcik7Ci0KLQotICAgICAgICB9Ci0KLQotICAgICAgICBpZiAoCi0gICAgICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIi5lcXVhbHMobmFtZXNwYWNlVVJJKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgInRva2VuIi5lcXVhbHModHlwZU5hbWUpKSB7Ci0KLSAgICAgICAgICAgIHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnhzZC5Ub2tlbi5GYWN0b3J5LnBhcnNlKHJlYWRlcik7Ci0KLQotICAgICAgICB9Ci0KLQotICAgICAgICBpZiAoCi0gICAgICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIi5lcXVhbHMobmFtZXNwYWNlVVJJKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgInBvc2l0aXZlSW50ZWdlciIuZXF1YWxzKHR5cGVOYW1lKSkgewotCi0gICAgICAgICAgICByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy54c2QuUG9zaXRpdmVJbnRlZ2VyLkZhY3RvcnkucGFyc2UocmVhZGVyKTsKLQotCi0gICAgICAgIH0KLQotCi0gICAgICAgIGlmICgKLSAgICAgICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiLmVxdWFscyhuYW1lc3BhY2VVUkkpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAic2hvcnQiLmVxdWFscyh0eXBlTmFtZSkpIHsKLQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkLl9zaG9ydC5GYWN0b3J5LnBhcnNlKHJlYWRlcik7Ci0KLQotICAgICAgICB9Ci0KLQotICAgICAgICBpZiAoCi0gICAgICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIi5lcXVhbHMobmFtZXNwYWNlVVJJKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgImxhbmd1YWdlIi5lcXVhbHModHlwZU5hbWUpKSB7Ci0KLSAgICAgICAgICAgIHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnhzZC5MYW5ndWFnZS5GYWN0b3J5LnBhcnNlKHJlYWRlcik7Ci0KLQotICAgICAgICB9Ci0KLQotICAgICAgICBpZiAoCi0gICAgICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIi5lcXVhbHMobmFtZXNwYWNlVVJJKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgIkVOVElUSUVTIi5lcXVhbHModHlwZU5hbWUpKSB7Ci0KLSAgICAgICAgICAgIHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnhzZC5FTlRJVElFUy5GYWN0b3J5LnBhcnNlKHJlYWRlcik7Ci0KLQotICAgICAgICB9Ci0KLQotICAgICAgICBpZiAoCi0gICAgICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIi5lcXVhbHMobmFtZXNwYWNlVVJJKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgImRhdGUiLmVxdWFscyh0eXBlTmFtZSkpIHsKLQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkLkRhdGUuRmFjdG9yeS5wYXJzZShyZWFkZXIpOwotCi0KLSAgICAgICAgfQotCi0KLSAgICAgICAgaWYgKAotICAgICAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIuZXF1YWxzKG5hbWVzcGFjZVVSSSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICJpbnRlZ2VyIi5lcXVhbHModHlwZU5hbWUpKSB7Ci0KLSAgICAgICAgICAgIHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnhzZC5JbnRlZ2VyLkZhY3RvcnkucGFyc2UocmVhZGVyKTsKLQotCi0gICAgICAgIH0KLQotCi0gICAgICAgIGlmICgKLSAgICAgICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiLmVxdWFscyhuYW1lc3BhY2VVUkkpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAiUU5hbWUiLmVxdWFscyh0eXBlTmFtZSkpIHsKLQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkLlFOYW1lLkZhY3RvcnkucGFyc2UocmVhZGVyKTsKLQotCi0gICAgICAgIH0KLQotCi0gICAgICAgIGlmICgKLSAgICAgICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiLmVxdWFscyhuYW1lc3BhY2VVUkkpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAibm9ybWFsaXplZFN0cmluZyIuZXF1YWxzKHR5cGVOYW1lKSkgewotCi0gICAgICAgICAgICByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy54c2QuTm9ybWFsaXplZFN0cmluZy5GYWN0b3J5LnBhcnNlKHJlYWRlcik7Ci0KLQotICAgICAgICB9Ci0KLQotICAgICAgICBpZiAoCi0gICAgICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIi5lcXVhbHMobmFtZXNwYWNlVVJJKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgIklEUkVGUyIuZXF1YWxzKHR5cGVOYW1lKSkgewotCi0gICAgICAgICAgICByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy54c2QuSURSRUZTLkZhY3RvcnkucGFyc2UocmVhZGVyKTsKLQotCi0gICAgICAgIH0KLQotCi0gICAgICAgIGlmICgKLSAgICAgICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiLmVxdWFscyhuYW1lc3BhY2VVUkkpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAiZGVjaW1hbCIuZXF1YWxzKHR5cGVOYW1lKSkgewotCi0gICAgICAgICAgICByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy54c2QuRGVjaW1hbC5GYWN0b3J5LnBhcnNlKHJlYWRlcik7Ci0KLQotICAgICAgICB9Ci0KLQotICAgICAgICBpZiAoCi0gICAgICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIi5lcXVhbHMobmFtZXNwYWNlVVJJKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgImdNb250aCIuZXF1YWxzKHR5cGVOYW1lKSkgewotCi0gICAgICAgICAgICByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy54c2QuR01vbnRoLkZhY3RvcnkucGFyc2UocmVhZGVyKTsKLQotCi0gICAgICAgIH0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJOYW1lcyBwYWNlID09PiAiICsgbmFtZXNwYWNlVVJJICsgIiB0eXBlICIgKyB0eXBlTmFtZSk7Ci0KLSAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJVbnN1cHBvcnRlZCB0eXBlICIgKyBuYW1lc3BhY2VVUkkgKyAiICIgKyB0eXBlTmFtZSk7Ci0gICAgfQotCi19Ci0gICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3hzZC9HRGF5LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMveHNkL0dEYXkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQ1YjM5Ny4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMveHNkL0dEYXkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwMyArMCwwIEBACi0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICogR0RheS5qYXZhCi0gKgotICogVGhpcyBmaWxlIHdhcyBhdXRvLWdlbmVyYXRlZCBmcm9tIFdTREwKLSAqIGJ5IHRoZSBBcGFjaGUgQXhpczIgdmVyc2lvbjogU05BUFNIT1QgIEJ1aWx0IG9uIDogRGVjIDIxLCAyMDA3ICgwNDowMzozMCBMS1QpCi0gKi8KLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy54c2Q7Ci0gICAgICAgICAgICAKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqICBHRGF5IGJlYW4gY2xhc3MKLSAgICAgICAgICAgICovCi0gICAgICAgIAotICAgICAgICBwdWJsaWMgIGNsYXNzIEdEYXkKLSAgICAgICAgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkJlYW57Ci0gICAgICAgIC8qIFRoaXMgdHlwZSB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIHBpZWNlIG9mIHNjaGVtYSB0aGF0IGhhZAotICAgICAgICAgICAgICAgIG5hbWUgPSBnRGF5Ci0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFVSSSA9IGh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFByZWZpeCA9IG5zMQotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdlbmVyYXRlUHJlZml4KGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB7Ci0gICAgICAgICAgICBpZihuYW1lc3BhY2UuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpKXsKLSAgICAgICAgICAgICAgICByZXR1cm4gInhzZCI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgfQotCi0gICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogZmllbGQgZm9yIEdEYXkKLSAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuRGF5IGxvY2FsR0RheSA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgZ2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuRGF5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLkRheSBnZXRHRGF5KCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsR0RheTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIHNldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSBwYXJhbSBHRGF5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRHRGF5KG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuRGF5IHBhcmFtKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2NhbEdEYXk9cGFyYW07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbEdEYXkudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgIC8qKgotICAgICAqIGlzUmVhZGVyTVRPTUF3YXJlCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSByZWFkZXIgc3VwcG9ydHMgTVRPTQotICAgICAqLwotICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgewotICAgICAgICBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICB0cnl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBqYXZhLmxhbmcuQm9vbGVhbi5UUlVFLmVxdWFscyhyZWFkZXIuZ2V0UHJvcGVydHkob3JnLmFwYWNoZS5heGlvbS5vbS5PTUNvbnN0YW50cy5JU19EQVRBX0hBTkRMRVJTX0FXQVJFKSk7Ci0gICAgICAgIH1jYXRjaChqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlzUmVhZGVyTVRPTUF3YXJlOwotICAgfQotICAgICAKLSAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAqCi0gICAgICAgICogQHBhcmFtIHBhcmVudFFOYW1lCi0gICAgICAgICogQHBhcmFtIGZhY3RvcnkKLSAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgcHVibGljIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IGdldE9NRWxlbWVudCAoCi0gICAgICAgICAgICAgICBmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSkgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZSBkYXRhU291cmNlID0KLSAgICAgICAgICAgICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRGF0YVNvdXJjZSh0aGlzLHBhcmVudFFOYW1lKXsKLQotICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgR0RheS50aGlzLnNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5sbG9tLk9NU291cmNlZEVsZW1lbnRJbXBsKAotICAgICAgICAgICAgICAgcGFyZW50UU5hbWUsZmFjdG9yeSxkYXRhU291cmNlKTsKLSAgICAgICAgICAgIAotICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcixmYWxzZSk7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNlcmlhbGl6ZVR5cGUpCi0gICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgCi0KLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gcGFyZW50UU5hbWUuZ2V0UHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZSA9IHBhcmVudFFOYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlICE9IG51bGwpICYmIChuYW1lc3BhY2UudHJpbSgpLmxlbmd0aCgpID4gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgd3JpdGVyUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdyaXRlclByZWZpeCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KG5hbWVzcGFjZSwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocHJlZml4LCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgaWYgKHNlcmlhbGl6ZVR5cGUpewotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIik7Ci0gICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2VQcmVmaXggIT0gbnVsbCkgJiYgKG5hbWVzcGFjZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlUHJlZml4KyI6Z0RheSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgImdEYXkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxHRGF5PT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZSB0aGUgbmlsIGF0dHJpYnV0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oImdEYXkgY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxHRGF5KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBwcmVmaXgsamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICBpZiAoeG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0KLSAgICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0KLSAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLCBqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZU5hbWVzcGFjZSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlVmFsdWU7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gYXR0cmlidXRlUHJlZml4ICsgIjoiICsgcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsIGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIC8qKgotICAgICAgICAgKiAgbWV0aG9kIHRvIGhhbmRsZSBRbmFtZXMKLSAgICAgICAgICovCi0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWUoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMocHJlZml4ICsgIjoiICsgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGkuZSB0aGlzIGlzIHRoZSBkZWZhdWx0IG5hbWVzcGFjZQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZXMoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZVtdIHFuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgaWYgKHFuYW1lcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBzdG9yZSB0aGlzIGRhdGEgdW50aWwgbGFzdCBtb21lbnQgc2luY2UgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHdyaXRlIGFueQotICAgICAgICAgICAgICAgIC8vIG5hbWVzcGFjZSBkYXRhIGFmdGVyIHdyaXRpbmcgdGhlIGNoYXJhY3RvciBkYXRhCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZ0J1ZmZlciBzdHJpbmdUb1dyaXRlID0gbmV3IGphdmEubGFuZy5TdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBxbmFtZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZCgiICIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVVSSSA9IHFuYW1lc1tpXS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHByZWZpeCA9PSBudWxsKSB8fCAocHJlZml4Lmxlbmd0aCgpID09IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQocHJlZml4KS5hcHBlbmQoIjoiKS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhzdHJpbmdUb1dyaXRlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotCi0gICAgICAgICAvKioKLSAgICAgICAgICogUmVnaXN0ZXIgYSBuYW1lc3BhY2UgcHJlZml4Ci0gICAgICAgICAqLwotICAgICAgICAgcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHJlZ2lzdGVyUHJlZml4KGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoeG1sV3JpdGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHByZWZpeDsKLSAgICAgICAgICAgIH0KLQotCi0gIAotICAgICAgICAvKioKLSAgICAgICAgKiBkYXRhYmluZGluZyBtZXRob2QgdG8gZ2V0IGFuIFhNTCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdAotICAgICAgICAqCi0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciBnZXRQdWxsUGFyc2VyKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcU5hbWUpCi0gICAgICAgICAgICAgICAgICAgIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGVsZW1lbnRMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBhdHRyaWJMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXIuRUxFTUVOVF9URVhUKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbEdEYXkgIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsR0RheSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJnRGF5IGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVySW1wbChxTmFtZSwgZWxlbWVudExpc3QudG9BcnJheSgpLCBhdHRyaWJMaXN0LnRvQXJyYXkoKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAKLQotICAgICAvKioKLSAgICAgICogIEZhY3RvcnkgY2xhc3MgdGhhdCBrZWVwcyB0aGUgcGFyc2UgbWV0aG9kCi0gICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeXsKLQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBHRGF5IGZyb21TdHJpbmcoamF2YS5sYW5nLlN0cmluZyB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSl7Ci0gICAgICAgICAgICAgICAgICAgIEdEYXkgcmV0dXJuVmFsdWUgPSBuZXcgIEdEYXkoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUuc2V0R0RheSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb0dEYXkodmFsdWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIEdEYXkgZnJvbVN0cmluZyhqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudC5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IGNvbnRlbnQuc3Vic3RyaW5nKDAsY29udGVudC5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVcmkgPSB4bWxTdHJlYW1SZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEdEYXkuRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsbmFtZXNwYWNlVXJpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEdEYXkuRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsIiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAKLQotICAgICAgICAvKioKLSAgICAgICAgKiBzdGF0aWMgbWV0aG9kIHRvIGNyZWF0ZSB0aGUgb2JqZWN0Ci0gICAgICAgICogUHJlY29uZGl0aW9uOiAgSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIGN1cnJlbnQgb3IgbmV4dCBzdGFydCBlbGVtZW50IHN0YXJ0cyB0aGlzIG9iamVjdCBhbmQgYW55IGludGVydmVuaW5nIHJlYWRlciBldmVudHMgYXJlIGlnbm9yYWJsZQotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIG5vdCBhbiBlbGVtZW50LCBpdCBpcyBhIGNvbXBsZXggdHlwZSBhbmQgdGhlIHJlYWRlciBpcyBhdCB0aGUgZXZlbnQganVzdCBhZnRlciB0aGUgb3V0ZXIgc3RhcnQgZWxlbWVudAotICAgICAgICAqIFBvc3Rjb25kaXRpb246IElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCBpdHMgZW5kIGVsZW1lbnQKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBhIGNvbXBsZXggdHlwZSwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IHRoZSBlbmQgZWxlbWVudCBvZiBpdHMgb3V0ZXIgZWxlbWVudAotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIEdEYXkgcGFyc2UoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIEdEYXkgb2JqZWN0ID0KLSAgICAgICAgICAgICAgICBuZXcgR0RheSgpOwotCi0gICAgICAgICAgICBpbnQgZXZlbnQ7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5pbGxhYmxlVmFsdWUgPSBudWxsOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSIiOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2V1cmkgPSIiOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSAoIXJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICYmICFyZWFkZXIuaXNFbmRFbGVtZW50KCkpCi0gICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiKSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGZ1bGxUeXBlTmFtZSA9IHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiKTsKLSAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUhPW51bGwpewotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zUHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoMCxmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IG5zUHJlZml4PT1udWxsPyIiOm5zUHJlZml4OwotCi0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgdHlwZSA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSsxKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEiZ0RheSIuZXF1YWxzKHR5cGUpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9maW5kIG5hbWVzcGFjZSBmb3IgdGhlIHByZWZpeAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zVXJpID0gcmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkobnNQcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKEdEYXkpb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy54c2QuRXh0ZW5zaW9uTWFwcGVyLmdldFR5cGVPYmplY3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNVcmksdHlwZSxyZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gTm90ZSBhbGwgYXR0cmlidXRlcyB0aGF0IHdlcmUgaGFuZGxlZC4gVXNlZCB0byBkaWZmZXIgbm9ybWFsIGF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgICAvLyBmcm9tIGFueUF0dHJpYnV0ZXMuCi0gICAgICAgICAgICAgICAgamF2YS51dGlsLlZlY3RvciBoYW5kbGVkQXR0cmlidXRlcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUoIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQgPSByZWFkZXIuZ2V0RWxlbWVudFRleHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5zZXRHRGF5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9HRGF5KGNvbnRlbnQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBFbmQgb2YgaWYgZm9yIGV4cGVjdGVkIHByb3BlcnR5IHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2V7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBzdGFydCBlbGVtZW50IHdlIGFyZSBub3QgZXhwZWN0aW5nIGluZGljYXRlcyBhbiBpbnZhbGlkIHBhcmFtZXRlciB3YXMgcGFzc2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJVbmV4cGVjdGVkIHN1YmVsZW1lbnQgIiArIHJlYWRlci5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gZW5kIG9mIHdoaWxlIGxvb3AKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0KLQotICAgICAgICAgICAgfSBjYXRjaCAoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gb2JqZWN0OwotICAgICAgICB9Ci0KLSAgICAgICAgfS8vZW5kIG9mIGZhY3RvcnkgY2xhc3MKLQotICAgICAgICAKLQotICAgICAgICB9Ci0gICAgICAgICAgIAotICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy94c2QvR01vbnRoLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMveHNkL0dNb250aC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjdmMmE3Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy94c2QvR01vbnRoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDMgKzAsMCBAQAotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIEdNb250aC5qYXZhCi0gKgotICogVGhpcyBmaWxlIHdhcyBhdXRvLWdlbmVyYXRlZCBmcm9tIFdTREwKLSAqIGJ5IHRoZSBBcGFjaGUgQXhpczIgdmVyc2lvbjogU05BUFNIT1QgIEJ1aWx0IG9uIDogRGVjIDIxLCAyMDA3ICgwNDowMzozMCBMS1QpCi0gKi8KLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy54c2Q7Ci0gICAgICAgICAgICAKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqICBHTW9udGggYmVhbiBjbGFzcwotICAgICAgICAgICAgKi8KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyAgY2xhc3MgR01vbnRoCi0gICAgICAgIGltcGxlbWVudHMgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJCZWFuewotICAgICAgICAvKiBUaGlzIHR5cGUgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBwaWVjZSBvZiBzY2hlbWEgdGhhdCBoYWQKLSAgICAgICAgICAgICAgICBuYW1lID0gZ01vbnRoCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFVSSSA9IGh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFByZWZpeCA9IG5zMQotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdlbmVyYXRlUHJlZml4KGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB7Ci0gICAgICAgICAgICBpZihuYW1lc3BhY2UuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpKXsKLSAgICAgICAgICAgICAgICByZXR1cm4gInhzZCI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgfQotCi0gICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogZmllbGQgZm9yIEdNb250aAotICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5Nb250aCBsb2NhbEdNb250aCA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgZ2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuTW9udGgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuTW9udGggZ2V0R01vbnRoKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsR01vbnRoOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgc2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtIHBhcmFtIEdNb250aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0R01vbnRoKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuTW9udGggcGFyYW0pewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2FsR01vbnRoPXBhcmFtOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxHTW9udGgudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgIC8qKgotICAgICAqIGlzUmVhZGVyTVRPTUF3YXJlCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSByZWFkZXIgc3VwcG9ydHMgTVRPTQotICAgICAqLwotICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgewotICAgICAgICBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICB0cnl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBqYXZhLmxhbmcuQm9vbGVhbi5UUlVFLmVxdWFscyhyZWFkZXIuZ2V0UHJvcGVydHkob3JnLmFwYWNoZS5heGlvbS5vbS5PTUNvbnN0YW50cy5JU19EQVRBX0hBTkRMRVJTX0FXQVJFKSk7Ci0gICAgICAgIH1jYXRjaChqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlzUmVhZGVyTVRPTUF3YXJlOwotICAgfQotICAgICAKLSAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAqCi0gICAgICAgICogQHBhcmFtIHBhcmVudFFOYW1lCi0gICAgICAgICogQHBhcmFtIGZhY3RvcnkKLSAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgcHVibGljIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IGdldE9NRWxlbWVudCAoCi0gICAgICAgICAgICAgICBmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSkgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZSBkYXRhU291cmNlID0KLSAgICAgICAgICAgICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRGF0YVNvdXJjZSh0aGlzLHBhcmVudFFOYW1lKXsKLQotICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgR01vbnRoLnRoaXMuc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmxsb20uT01Tb3VyY2VkRWxlbWVudEltcGwoCi0gICAgICAgICAgICAgICBwYXJlbnRRTmFtZSxmYWN0b3J5LGRhdGFTb3VyY2UpOwotICAgICAgICAgICAgCi0gICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyLGZhbHNlKTsKLSAgICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VyaWFsaXplVHlwZSkKLSAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLQotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBwYXJlbnRRTmFtZS5nZXRQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlID0gcGFyZW50UU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2UgIT0gbnVsbCkgJiYgKG5hbWVzcGFjZS50cmltKCkubGVuZ3RoKCkgPiAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB3cml0ZXJQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAod3JpdGVyUHJlZml4ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQobmFtZXNwYWNlLCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwcmVmaXgsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICBpZiAoc2VyaWFsaXplVHlwZSl7Ci0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKTsKLSAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZVByZWZpeCAhPSBudWxsKSAmJiAobmFtZXNwYWNlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApKXsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VQcmVmaXgrIjpnTW9udGgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJnTW9udGgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxHTW9udGg9PW51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIHRoZSBuaWwgYXR0cmlidXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiZ01vbnRoIGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsR01vbnRoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBwcmVmaXgsamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICBpZiAoeG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0KLSAgICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0KLSAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLCBqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZU5hbWVzcGFjZSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlVmFsdWU7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gYXR0cmlidXRlUHJlZml4ICsgIjoiICsgcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsIGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIC8qKgotICAgICAgICAgKiAgbWV0aG9kIHRvIGhhbmRsZSBRbmFtZXMKLSAgICAgICAgICovCi0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWUoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMocHJlZml4ICsgIjoiICsgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGkuZSB0aGlzIGlzIHRoZSBkZWZhdWx0IG5hbWVzcGFjZQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZXMoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZVtdIHFuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgaWYgKHFuYW1lcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBzdG9yZSB0aGlzIGRhdGEgdW50aWwgbGFzdCBtb21lbnQgc2luY2UgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHdyaXRlIGFueQotICAgICAgICAgICAgICAgIC8vIG5hbWVzcGFjZSBkYXRhIGFmdGVyIHdyaXRpbmcgdGhlIGNoYXJhY3RvciBkYXRhCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZ0J1ZmZlciBzdHJpbmdUb1dyaXRlID0gbmV3IGphdmEubGFuZy5TdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBxbmFtZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZCgiICIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVVSSSA9IHFuYW1lc1tpXS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHByZWZpeCA9PSBudWxsKSB8fCAocHJlZml4Lmxlbmd0aCgpID09IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQocHJlZml4KS5hcHBlbmQoIjoiKS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhzdHJpbmdUb1dyaXRlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotCi0gICAgICAgICAvKioKLSAgICAgICAgICogUmVnaXN0ZXIgYSBuYW1lc3BhY2UgcHJlZml4Ci0gICAgICAgICAqLwotICAgICAgICAgcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHJlZ2lzdGVyUHJlZml4KGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoeG1sV3JpdGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHByZWZpeDsKLSAgICAgICAgICAgIH0KLQotCi0gIAotICAgICAgICAvKioKLSAgICAgICAgKiBkYXRhYmluZGluZyBtZXRob2QgdG8gZ2V0IGFuIFhNTCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdAotICAgICAgICAqCi0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciBnZXRQdWxsUGFyc2VyKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcU5hbWUpCi0gICAgICAgICAgICAgICAgICAgIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGVsZW1lbnRMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBhdHRyaWJMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXIuRUxFTUVOVF9URVhUKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbEdNb250aCAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxHTW9udGgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiZ01vbnRoIGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVySW1wbChxTmFtZSwgZWxlbWVudExpc3QudG9BcnJheSgpLCBhdHRyaWJMaXN0LnRvQXJyYXkoKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAKLQotICAgICAvKioKLSAgICAgICogIEZhY3RvcnkgY2xhc3MgdGhhdCBrZWVwcyB0aGUgcGFyc2UgbWV0aG9kCi0gICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeXsKLQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBHTW9udGggZnJvbVN0cmluZyhqYXZhLmxhbmcuU3RyaW5nIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJKXsKLSAgICAgICAgICAgICAgICAgICAgR01vbnRoIHJldHVyblZhbHVlID0gbmV3ICBHTW9udGgoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUuc2V0R01vbnRoKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvR01vbnRoKHZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBHTW9udGggZnJvbVN0cmluZyhqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudC5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IGNvbnRlbnQuc3Vic3RyaW5nKDAsY29udGVudC5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVcmkgPSB4bWxTdHJlYW1SZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEdNb250aC5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCxuYW1lc3BhY2VVcmkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gR01vbnRoLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LCIiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgCi0KLSAgICAgICAgLyoqCi0gICAgICAgICogc3RhdGljIG1ldGhvZCB0byBjcmVhdGUgdGhlIG9iamVjdAotICAgICAgICAqIFByZWNvbmRpdGlvbjogIElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSBjdXJyZW50IG9yIG5leHQgc3RhcnQgZWxlbWVudCBzdGFydHMgdGhpcyBvYmplY3QgYW5kIGFueSBpbnRlcnZlbmluZyByZWFkZXIgZXZlbnRzIGFyZSBpZ25vcmFibGUKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBub3QgYW4gZWxlbWVudCwgaXQgaXMgYSBjb21wbGV4IHR5cGUgYW5kIHRoZSByZWFkZXIgaXMgYXQgdGhlIGV2ZW50IGp1c3QgYWZ0ZXIgdGhlIG91dGVyIHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgKiBQb3N0Y29uZGl0aW9uOiBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgaXRzIGVuZCBlbGVtZW50Ci0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgYSBjb21wbGV4IHR5cGUsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCB0aGUgZW5kIGVsZW1lbnQgb2YgaXRzIG91dGVyIGVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBHTW9udGggcGFyc2UoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIEdNb250aCBvYmplY3QgPQotICAgICAgICAgICAgICAgIG5ldyBHTW9udGgoKTsKLQotICAgICAgICAgICAgaW50IGV2ZW50OwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuaWxsYWJsZVZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0iIjsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNldXJpID0iIjsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUgKCFyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAmJiAhcmVhZGVyLmlzRW5kRWxlbWVudCgpKQotICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIikhPW51bGwpewotICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBmdWxsVHlwZU5hbWUgPSByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIik7Ci0gICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1ByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKDAsZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBuc1ByZWZpeD09bnVsbD8iIjpuc1ByZWZpeDsKLQotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHR5cGUgPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikrMSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghImdNb250aCIuZXF1YWxzKHR5cGUpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9maW5kIG5hbWVzcGFjZSBmb3IgdGhlIHByZWZpeAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zVXJpID0gcmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkobnNQcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKEdNb250aClvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnhzZC5FeHRlbnNpb25NYXBwZXIuZ2V0VHlwZU9iamVjdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc1VyaSx0eXBlLHJlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBOb3RlIGFsbCBhdHRyaWJ1dGVzIHRoYXQgd2VyZSBoYW5kbGVkLiBVc2VkIHRvIGRpZmZlciBub3JtYWwgYXR0cmlidXRlcwotICAgICAgICAgICAgICAgIC8vIGZyb20gYW55QXR0cmlidXRlcy4KLSAgICAgICAgICAgICAgICBqYXZhLnV0aWwuVmVjdG9yIGhhbmRsZWRBdHRyaWJ1dGVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSghcmVhZGVyLmlzRW5kRWxlbWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCA9IHJlYWRlci5nZXRFbGVtZW50VGV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldEdNb250aCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvR01vbnRoKGNvbnRlbnQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBFbmQgb2YgaWYgZm9yIGV4cGVjdGVkIHByb3BlcnR5IHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2V7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBzdGFydCBlbGVtZW50IHdlIGFyZSBub3QgZXhwZWN0aW5nIGluZGljYXRlcyBhbiBpbnZhbGlkIHBhcmFtZXRlciB3YXMgcGFzc2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJVbmV4cGVjdGVkIHN1YmVsZW1lbnQgIiArIHJlYWRlci5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gZW5kIG9mIHdoaWxlIGxvb3AKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0KLQotICAgICAgICAgICAgfSBjYXRjaCAoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gb2JqZWN0OwotICAgICAgICB9Ci0KLSAgICAgICAgfS8vZW5kIG9mIGZhY3RvcnkgY2xhc3MKLQotICAgICAgICAKLQotICAgICAgICB9Ci0gICAgICAgICAgIAotICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy94c2QvR01vbnRoRGF5LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMveHNkL0dNb250aERheS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNWUyNzY3Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy94c2QvR01vbnRoRGF5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDMgKzAsMCBAQAotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIEdNb250aERheS5qYXZhCi0gKgotICogVGhpcyBmaWxlIHdhcyBhdXRvLWdlbmVyYXRlZCBmcm9tIFdTREwKLSAqIGJ5IHRoZSBBcGFjaGUgQXhpczIgdmVyc2lvbjogU05BUFNIT1QgIEJ1aWx0IG9uIDogRGVjIDIxLCAyMDA3ICgwNDowMzozMCBMS1QpCi0gKi8KLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy54c2Q7Ci0gICAgICAgICAgICAKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqICBHTW9udGhEYXkgYmVhbiBjbGFzcwotICAgICAgICAgICAgKi8KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyAgY2xhc3MgR01vbnRoRGF5Ci0gICAgICAgIGltcGxlbWVudHMgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJCZWFuewotICAgICAgICAvKiBUaGlzIHR5cGUgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBwaWVjZSBvZiBzY2hlbWEgdGhhdCBoYWQKLSAgICAgICAgICAgICAgICBuYW1lID0gZ01vbnRoRGF5Ci0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFVSSSA9IGh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFByZWZpeCA9IG5zMQotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdlbmVyYXRlUHJlZml4KGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB7Ci0gICAgICAgICAgICBpZihuYW1lc3BhY2UuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpKXsKLSAgICAgICAgICAgICAgICByZXR1cm4gInhzZCI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgfQotCi0gICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogZmllbGQgZm9yIEdNb250aERheQotICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5Nb250aERheSBsb2NhbEdNb250aERheSA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgZ2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuTW9udGhEYXkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuTW9udGhEYXkgZ2V0R01vbnRoRGF5KCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsR01vbnRoRGF5OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgc2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtIHBhcmFtIEdNb250aERheQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0R01vbnRoRGF5KG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuTW9udGhEYXkgcGFyYW0pewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2FsR01vbnRoRGF5PXBhcmFtOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxHTW9udGhEYXkudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgIC8qKgotICAgICAqIGlzUmVhZGVyTVRPTUF3YXJlCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSByZWFkZXIgc3VwcG9ydHMgTVRPTQotICAgICAqLwotICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgewotICAgICAgICBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICB0cnl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBqYXZhLmxhbmcuQm9vbGVhbi5UUlVFLmVxdWFscyhyZWFkZXIuZ2V0UHJvcGVydHkob3JnLmFwYWNoZS5heGlvbS5vbS5PTUNvbnN0YW50cy5JU19EQVRBX0hBTkRMRVJTX0FXQVJFKSk7Ci0gICAgICAgIH1jYXRjaChqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlzUmVhZGVyTVRPTUF3YXJlOwotICAgfQotICAgICAKLSAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAqCi0gICAgICAgICogQHBhcmFtIHBhcmVudFFOYW1lCi0gICAgICAgICogQHBhcmFtIGZhY3RvcnkKLSAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgcHVibGljIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IGdldE9NRWxlbWVudCAoCi0gICAgICAgICAgICAgICBmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSkgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZSBkYXRhU291cmNlID0KLSAgICAgICAgICAgICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRGF0YVNvdXJjZSh0aGlzLHBhcmVudFFOYW1lKXsKLQotICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgR01vbnRoRGF5LnRoaXMuc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmxsb20uT01Tb3VyY2VkRWxlbWVudEltcGwoCi0gICAgICAgICAgICAgICBwYXJlbnRRTmFtZSxmYWN0b3J5LGRhdGFTb3VyY2UpOwotICAgICAgICAgICAgCi0gICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyLGZhbHNlKTsKLSAgICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VyaWFsaXplVHlwZSkKLSAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLQotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBwYXJlbnRRTmFtZS5nZXRQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlID0gcGFyZW50UU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2UgIT0gbnVsbCkgJiYgKG5hbWVzcGFjZS50cmltKCkubGVuZ3RoKCkgPiAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB3cml0ZXJQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAod3JpdGVyUHJlZml4ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQobmFtZXNwYWNlLCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwcmVmaXgsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICBpZiAoc2VyaWFsaXplVHlwZSl7Ci0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKTsKLSAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZVByZWZpeCAhPSBudWxsKSAmJiAobmFtZXNwYWNlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApKXsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VQcmVmaXgrIjpnTW9udGhEYXkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJnTW9udGhEYXkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxHTW9udGhEYXk9PW51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIHRoZSBuaWwgYXR0cmlidXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiZ01vbnRoRGF5IGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsR01vbnRoRGF5KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBwcmVmaXgsamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICBpZiAoeG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0KLSAgICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0KLSAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLCBqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZU5hbWVzcGFjZSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlVmFsdWU7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gYXR0cmlidXRlUHJlZml4ICsgIjoiICsgcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsIGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIC8qKgotICAgICAgICAgKiAgbWV0aG9kIHRvIGhhbmRsZSBRbmFtZXMKLSAgICAgICAgICovCi0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWUoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMocHJlZml4ICsgIjoiICsgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGkuZSB0aGlzIGlzIHRoZSBkZWZhdWx0IG5hbWVzcGFjZQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZXMoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZVtdIHFuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgaWYgKHFuYW1lcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBzdG9yZSB0aGlzIGRhdGEgdW50aWwgbGFzdCBtb21lbnQgc2luY2UgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHdyaXRlIGFueQotICAgICAgICAgICAgICAgIC8vIG5hbWVzcGFjZSBkYXRhIGFmdGVyIHdyaXRpbmcgdGhlIGNoYXJhY3RvciBkYXRhCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZ0J1ZmZlciBzdHJpbmdUb1dyaXRlID0gbmV3IGphdmEubGFuZy5TdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBxbmFtZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZCgiICIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVVSSSA9IHFuYW1lc1tpXS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHByZWZpeCA9PSBudWxsKSB8fCAocHJlZml4Lmxlbmd0aCgpID09IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQocHJlZml4KS5hcHBlbmQoIjoiKS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhzdHJpbmdUb1dyaXRlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotCi0gICAgICAgICAvKioKLSAgICAgICAgICogUmVnaXN0ZXIgYSBuYW1lc3BhY2UgcHJlZml4Ci0gICAgICAgICAqLwotICAgICAgICAgcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHJlZ2lzdGVyUHJlZml4KGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoeG1sV3JpdGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHByZWZpeDsKLSAgICAgICAgICAgIH0KLQotCi0gIAotICAgICAgICAvKioKLSAgICAgICAgKiBkYXRhYmluZGluZyBtZXRob2QgdG8gZ2V0IGFuIFhNTCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdAotICAgICAgICAqCi0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciBnZXRQdWxsUGFyc2VyKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcU5hbWUpCi0gICAgICAgICAgICAgICAgICAgIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGVsZW1lbnRMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBhdHRyaWJMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXIuRUxFTUVOVF9URVhUKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbEdNb250aERheSAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxHTW9udGhEYXkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiZ01vbnRoRGF5IGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVySW1wbChxTmFtZSwgZWxlbWVudExpc3QudG9BcnJheSgpLCBhdHRyaWJMaXN0LnRvQXJyYXkoKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAKLQotICAgICAvKioKLSAgICAgICogIEZhY3RvcnkgY2xhc3MgdGhhdCBrZWVwcyB0aGUgcGFyc2UgbWV0aG9kCi0gICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeXsKLQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBHTW9udGhEYXkgZnJvbVN0cmluZyhqYXZhLmxhbmcuU3RyaW5nIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJKXsKLSAgICAgICAgICAgICAgICAgICAgR01vbnRoRGF5IHJldHVyblZhbHVlID0gbmV3ICBHTW9udGhEYXkoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUuc2V0R01vbnRoRGF5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvR01vbnRoRGF5KHZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBHTW9udGhEYXkgZnJvbVN0cmluZyhqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudC5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IGNvbnRlbnQuc3Vic3RyaW5nKDAsY29udGVudC5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVcmkgPSB4bWxTdHJlYW1SZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEdNb250aERheS5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCxuYW1lc3BhY2VVcmkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gR01vbnRoRGF5LkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LCIiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgCi0KLSAgICAgICAgLyoqCi0gICAgICAgICogc3RhdGljIG1ldGhvZCB0byBjcmVhdGUgdGhlIG9iamVjdAotICAgICAgICAqIFByZWNvbmRpdGlvbjogIElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSBjdXJyZW50IG9yIG5leHQgc3RhcnQgZWxlbWVudCBzdGFydHMgdGhpcyBvYmplY3QgYW5kIGFueSBpbnRlcnZlbmluZyByZWFkZXIgZXZlbnRzIGFyZSBpZ25vcmFibGUKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBub3QgYW4gZWxlbWVudCwgaXQgaXMgYSBjb21wbGV4IHR5cGUgYW5kIHRoZSByZWFkZXIgaXMgYXQgdGhlIGV2ZW50IGp1c3QgYWZ0ZXIgdGhlIG91dGVyIHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgKiBQb3N0Y29uZGl0aW9uOiBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgaXRzIGVuZCBlbGVtZW50Ci0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgYSBjb21wbGV4IHR5cGUsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCB0aGUgZW5kIGVsZW1lbnQgb2YgaXRzIG91dGVyIGVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBHTW9udGhEYXkgcGFyc2UoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIEdNb250aERheSBvYmplY3QgPQotICAgICAgICAgICAgICAgIG5ldyBHTW9udGhEYXkoKTsKLQotICAgICAgICAgICAgaW50IGV2ZW50OwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuaWxsYWJsZVZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0iIjsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNldXJpID0iIjsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUgKCFyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAmJiAhcmVhZGVyLmlzRW5kRWxlbWVudCgpKQotICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIikhPW51bGwpewotICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBmdWxsVHlwZU5hbWUgPSByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIik7Ci0gICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1ByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKDAsZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBuc1ByZWZpeD09bnVsbD8iIjpuc1ByZWZpeDsKLQotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHR5cGUgPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikrMSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghImdNb250aERheSIuZXF1YWxzKHR5cGUpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9maW5kIG5hbWVzcGFjZSBmb3IgdGhlIHByZWZpeAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zVXJpID0gcmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkobnNQcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKEdNb250aERheSlvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnhzZC5FeHRlbnNpb25NYXBwZXIuZ2V0VHlwZU9iamVjdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc1VyaSx0eXBlLHJlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBOb3RlIGFsbCBhdHRyaWJ1dGVzIHRoYXQgd2VyZSBoYW5kbGVkLiBVc2VkIHRvIGRpZmZlciBub3JtYWwgYXR0cmlidXRlcwotICAgICAgICAgICAgICAgIC8vIGZyb20gYW55QXR0cmlidXRlcy4KLSAgICAgICAgICAgICAgICBqYXZhLnV0aWwuVmVjdG9yIGhhbmRsZWRBdHRyaWJ1dGVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSghcmVhZGVyLmlzRW5kRWxlbWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCA9IHJlYWRlci5nZXRFbGVtZW50VGV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldEdNb250aERheSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvR01vbnRoRGF5KGNvbnRlbnQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBFbmQgb2YgaWYgZm9yIGV4cGVjdGVkIHByb3BlcnR5IHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2V7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBzdGFydCBlbGVtZW50IHdlIGFyZSBub3QgZXhwZWN0aW5nIGluZGljYXRlcyBhbiBpbnZhbGlkIHBhcmFtZXRlciB3YXMgcGFzc2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJVbmV4cGVjdGVkIHN1YmVsZW1lbnQgIiArIHJlYWRlci5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gZW5kIG9mIHdoaWxlIGxvb3AKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0KLQotICAgICAgICAgICAgfSBjYXRjaCAoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gb2JqZWN0OwotICAgICAgICB9Ci0KLSAgICAgICAgfS8vZW5kIG9mIGZhY3RvcnkgY2xhc3MKLQotICAgICAgICAKLQotICAgICAgICB9Ci0gICAgICAgICAgIAotICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy94c2QvR1llYXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy94c2QvR1llYXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI1YmI3Mi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMveHNkL0dZZWFyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDMgKzAsMCBAQAotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIEdZZWFyLmphdmEKLSAqCi0gKiBUaGlzIGZpbGUgd2FzIGF1dG8tZ2VuZXJhdGVkIGZyb20gV1NETAotICogYnkgdGhlIEFwYWNoZSBBeGlzMiB2ZXJzaW9uOiBTTkFQU0hPVCAgQnVpbHQgb24gOiBEZWMgMjEsIDIwMDcgKDA0OjAzOjMwIExLVCkKLSAqLwotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnhzZDsKLSAgICAgICAgICAgIAotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogIEdZZWFyIGJlYW4gY2xhc3MKLSAgICAgICAgICAgICovCi0gICAgICAgIAotICAgICAgICBwdWJsaWMgIGNsYXNzIEdZZWFyCi0gICAgICAgIGltcGxlbWVudHMgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJCZWFuewotICAgICAgICAvKiBUaGlzIHR5cGUgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBwaWVjZSBvZiBzY2hlbWEgdGhhdCBoYWQKLSAgICAgICAgICAgICAgICBuYW1lID0gZ1llYXIKLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgVVJJID0gaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEKLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgUHJlZml4ID0gbnMxCi0gICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIAotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2VuZXJhdGVQcmVmaXgoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHsKLSAgICAgICAgICAgIGlmKG5hbWVzcGFjZS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikpewotICAgICAgICAgICAgICAgIHJldHVybiAieHNkIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBmaWVsZCBmb3IgR1llYXIKLSAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuWWVhciBsb2NhbEdZZWFyIDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBnZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5ZZWFyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLlllYXIgZ2V0R1llYXIoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxHWWVhcjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIHNldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSBwYXJhbSBHWWVhcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0R1llYXIob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5ZZWFyIHBhcmFtKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2NhbEdZZWFyPXBhcmFtOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxHWWVhci50b1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgLyoqCi0gICAgICogaXNSZWFkZXJNVE9NQXdhcmUKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlYWRlciBzdXBwb3J0cyBNVE9NCi0gICAgICovCi0gICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIHRyeXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGphdmEubGFuZy5Cb29sZWFuLlRSVUUuZXF1YWxzKHJlYWRlci5nZXRQcm9wZXJ0eShvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQ29uc3RhbnRzLklTX0RBVEFfSEFORExFUlNfQVdBUkUpKTsKLSAgICAgICAgfWNhdGNoKGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXNSZWFkZXJNVE9NQXdhcmU7Ci0gICB9Ci0gICAgIAotICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICoKLSAgICAgICAgKiBAcGFyYW0gcGFyZW50UU5hbWUKLSAgICAgICAgKiBAcGFyYW0gZmFjdG9yeQotICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICBwdWJsaWMgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgZ2V0T01FbGVtZW50ICgKLSAgICAgICAgICAgICAgIGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5KSB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlIGRhdGFTb3VyY2UgPQotICAgICAgICAgICAgICAgICAgICAgICBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJEYXRhU291cmNlKHRoaXMscGFyZW50UU5hbWUpewotCi0gICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICBHWWVhci50aGlzLnNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5sbG9tLk9NU291cmNlZEVsZW1lbnRJbXBsKAotICAgICAgICAgICAgICAgcGFyZW50UU5hbWUsZmFjdG9yeSxkYXRhU291cmNlKTsKLSAgICAgICAgICAgIAotICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcixmYWxzZSk7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNlcmlhbGl6ZVR5cGUpCi0gICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgCi0KLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gcGFyZW50UU5hbWUuZ2V0UHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZSA9IHBhcmVudFFOYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlICE9IG51bGwpICYmIChuYW1lc3BhY2UudHJpbSgpLmxlbmd0aCgpID4gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgd3JpdGVyUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdyaXRlclByZWZpeCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KG5hbWVzcGFjZSwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocHJlZml4LCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgaWYgKHNlcmlhbGl6ZVR5cGUpewotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIik7Ci0gICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2VQcmVmaXggIT0gbnVsbCkgJiYgKG5hbWVzcGFjZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlUHJlZml4KyI6Z1llYXIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJnWWVhciIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbEdZZWFyPT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZSB0aGUgbmlsIGF0dHJpYnV0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oImdZZWFyIGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsR1llYXIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRoIHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCxqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgIGlmICh4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLQotICAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsIGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlTmFtZXNwYWNlID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVWYWx1ZTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBhdHRyaWJ1dGVQcmVmaXggKyAiOiIgKyBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSwgYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICBtZXRob2QgdG8gaGFuZGxlIFFuYW1lcwotICAgICAgICAgKi8KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZShqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhwcmVmaXggKyAiOiIgKyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaS5lIHRoaXMgaXMgdGhlIGRlZmF1bHQgbmFtZXNwYWNlCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lcyhqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lW10gcW5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICBpZiAocW5hbWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHRvIHN0b3JlIHRoaXMgZGF0YSB1bnRpbCBsYXN0IG1vbWVudCBzaW5jZSBpdCBpcyBub3QgcG9zc2libGUgdG8gd3JpdGUgYW55Ci0gICAgICAgICAgICAgICAgLy8gbmFtZXNwYWNlIGRhdGEgYWZ0ZXIgd3JpdGluZyB0aGUgY2hhcmFjdG9yIGRhdGEKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIHN0cmluZ1RvV3JpdGUgPSBuZXcgamF2YS5sYW5nLlN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHFuYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKCIgIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlVVJJID0gcW5hbWVzW2ldLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocHJlZml4ID09IG51bGwpIHx8IChwcmVmaXgubGVuZ3RoKCkgPT0gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChwcmVmaXgpLmFwcGVuZCgiOiIpLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHN0cmluZ1RvV3JpdGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0KLSAgICAgICAgIC8qKgotICAgICAgICAgKiBSZWdpc3RlciBhIG5hbWVzcGFjZSBwcmVmaXgKLSAgICAgICAgICovCi0gICAgICAgICBwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgcmVnaXN0ZXJQcmVmaXgoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLCBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlICh4bWxXcml0ZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gcHJlZml4OwotICAgICAgICAgICAgfQotCi0KLSAgCi0gICAgICAgIC8qKgotICAgICAgICAqIGRhdGFiaW5kaW5nIG1ldGhvZCB0byBnZXQgYW4gWE1MIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0Ci0gICAgICAgICoKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIGdldFB1bGxQYXJzZXIoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxTmFtZSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgZWxlbWVudExpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGF0dHJpYkxpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlci5FTEVNRU5UX1RFWFQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsR1llYXIgIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsR1llYXIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiZ1llYXIgY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXJJbXBsKHFOYW1lLCBlbGVtZW50TGlzdC50b0FycmF5KCksIGF0dHJpYkxpc3QudG9BcnJheSgpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gIAotCi0gICAgIC8qKgotICAgICAgKiAgRmFjdG9yeSBjbGFzcyB0aGF0IGtlZXBzIHRoZSBwYXJzZSBtZXRob2QKLSAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5ewotCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIEdZZWFyIGZyb21TdHJpbmcoamF2YS5sYW5nLlN0cmluZyB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSl7Ci0gICAgICAgICAgICAgICAgICAgIEdZZWFyIHJldHVyblZhbHVlID0gbmV3ICBHWWVhcigpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZS5zZXRHWWVhcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb0dZZWFyKHZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBHWWVhciBmcm9tU3RyaW5nKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50LmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gY29udGVudC5zdWJzdHJpbmcoMCxjb250ZW50LmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVyaSA9IHhtbFN0cmVhbVJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gR1llYXIuRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsbmFtZXNwYWNlVXJpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEdZZWFyLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LCIiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgCi0KLSAgICAgICAgLyoqCi0gICAgICAgICogc3RhdGljIG1ldGhvZCB0byBjcmVhdGUgdGhlIG9iamVjdAotICAgICAgICAqIFByZWNvbmRpdGlvbjogIElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSBjdXJyZW50IG9yIG5leHQgc3RhcnQgZWxlbWVudCBzdGFydHMgdGhpcyBvYmplY3QgYW5kIGFueSBpbnRlcnZlbmluZyByZWFkZXIgZXZlbnRzIGFyZSBpZ25vcmFibGUKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBub3QgYW4gZWxlbWVudCwgaXQgaXMgYSBjb21wbGV4IHR5cGUgYW5kIHRoZSByZWFkZXIgaXMgYXQgdGhlIGV2ZW50IGp1c3QgYWZ0ZXIgdGhlIG91dGVyIHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgKiBQb3N0Y29uZGl0aW9uOiBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgaXRzIGVuZCBlbGVtZW50Ci0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgYSBjb21wbGV4IHR5cGUsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCB0aGUgZW5kIGVsZW1lbnQgb2YgaXRzIG91dGVyIGVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBHWWVhciBwYXJzZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uewotICAgICAgICAgICAgR1llYXIgb2JqZWN0ID0KLSAgICAgICAgICAgICAgICBuZXcgR1llYXIoKTsKLQotICAgICAgICAgICAgaW50IGV2ZW50OwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuaWxsYWJsZVZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0iIjsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNldXJpID0iIjsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUgKCFyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAmJiAhcmVhZGVyLmlzRW5kRWxlbWVudCgpKQotICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIikhPW51bGwpewotICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBmdWxsVHlwZU5hbWUgPSByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIik7Ci0gICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1ByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKDAsZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBuc1ByZWZpeD09bnVsbD8iIjpuc1ByZWZpeDsKLQotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHR5cGUgPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikrMSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghImdZZWFyIi5lcXVhbHModHlwZSkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2ZpbmQgbmFtZXNwYWNlIGZvciB0aGUgcHJlZml4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNVcmkgPSByZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShuc1ByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoR1llYXIpb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy54c2QuRXh0ZW5zaW9uTWFwcGVyLmdldFR5cGVPYmplY3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNVcmksdHlwZSxyZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gTm90ZSBhbGwgYXR0cmlidXRlcyB0aGF0IHdlcmUgaGFuZGxlZC4gVXNlZCB0byBkaWZmZXIgbm9ybWFsIGF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgICAvLyBmcm9tIGFueUF0dHJpYnV0ZXMuCi0gICAgICAgICAgICAgICAgamF2YS51dGlsLlZlY3RvciBoYW5kbGVkQXR0cmlidXRlcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUoIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQgPSByZWFkZXIuZ2V0RWxlbWVudFRleHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5zZXRHWWVhcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvR1llYXIoY29udGVudCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIEVuZCBvZiBpZiBmb3IgZXhwZWN0ZWQgcHJvcGVydHkgc3RhcnQgZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHN0YXJ0IGVsZW1lbnQgd2UgYXJlIG5vdCBleHBlY3RpbmcgaW5kaWNhdGVzIGFuIGludmFsaWQgcGFyYW1ldGVyIHdhcyBwYXNzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIlVuZXhwZWN0ZWQgc3ViZWxlbWVudCAiICsgcmVhZGVyLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBlbmQgb2Ygd2hpbGUgbG9vcAotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLQotCi0gICAgICAgICAgICB9IGNhdGNoIChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEubGFuZy5FeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBvYmplY3Q7Ci0gICAgICAgIH0KLQotICAgICAgICB9Ly9lbmQgb2YgZmFjdG9yeSBjbGFzcwotCi0gICAgICAgIAotCi0gICAgICAgIH0KLSAgICAgICAgICAgCi0gICAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3hzZC9HWWVhck1vbnRoLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMveHNkL0dZZWFyTW9udGguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RhOTE1YS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMveHNkL0dZZWFyTW9udGguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwMyArMCwwIEBACi0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICogR1llYXJNb250aC5qYXZhCi0gKgotICogVGhpcyBmaWxlIHdhcyBhdXRvLWdlbmVyYXRlZCBmcm9tIFdTREwKLSAqIGJ5IHRoZSBBcGFjaGUgQXhpczIgdmVyc2lvbjogU05BUFNIT1QgIEJ1aWx0IG9uIDogRGVjIDIxLCAyMDA3ICgwNDowMzozMCBMS1QpCi0gKi8KLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy54c2Q7Ci0gICAgICAgICAgICAKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqICBHWWVhck1vbnRoIGJlYW4gY2xhc3MKLSAgICAgICAgICAgICovCi0gICAgICAgIAotICAgICAgICBwdWJsaWMgIGNsYXNzIEdZZWFyTW9udGgKLSAgICAgICAgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkJlYW57Ci0gICAgICAgIC8qIFRoaXMgdHlwZSB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIHBpZWNlIG9mIHNjaGVtYSB0aGF0IGhhZAotICAgICAgICAgICAgICAgIG5hbWUgPSBnWWVhck1vbnRoCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFVSSSA9IGh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFByZWZpeCA9IG5zMQotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdlbmVyYXRlUHJlZml4KGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB7Ci0gICAgICAgICAgICBpZihuYW1lc3BhY2UuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpKXsKLSAgICAgICAgICAgICAgICByZXR1cm4gInhzZCI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgfQotCi0gICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogZmllbGQgZm9yIEdZZWFyTW9udGgKLSAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuWWVhck1vbnRoIGxvY2FsR1llYXJNb250aCA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgZ2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuWWVhck1vbnRoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLlllYXJNb250aCBnZXRHWWVhck1vbnRoKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsR1llYXJNb250aDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIHNldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSBwYXJhbSBHWWVhck1vbnRoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRHWWVhck1vbnRoKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuWWVhck1vbnRoIHBhcmFtKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2NhbEdZZWFyTW9udGg9cGFyYW07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbEdZZWFyTW9udGgudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgIC8qKgotICAgICAqIGlzUmVhZGVyTVRPTUF3YXJlCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSByZWFkZXIgc3VwcG9ydHMgTVRPTQotICAgICAqLwotICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgewotICAgICAgICBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICB0cnl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBqYXZhLmxhbmcuQm9vbGVhbi5UUlVFLmVxdWFscyhyZWFkZXIuZ2V0UHJvcGVydHkob3JnLmFwYWNoZS5heGlvbS5vbS5PTUNvbnN0YW50cy5JU19EQVRBX0hBTkRMRVJTX0FXQVJFKSk7Ci0gICAgICAgIH1jYXRjaChqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlzUmVhZGVyTVRPTUF3YXJlOwotICAgfQotICAgICAKLSAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAqCi0gICAgICAgICogQHBhcmFtIHBhcmVudFFOYW1lCi0gICAgICAgICogQHBhcmFtIGZhY3RvcnkKLSAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgcHVibGljIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IGdldE9NRWxlbWVudCAoCi0gICAgICAgICAgICAgICBmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSkgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZSBkYXRhU291cmNlID0KLSAgICAgICAgICAgICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRGF0YVNvdXJjZSh0aGlzLHBhcmVudFFOYW1lKXsKLQotICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgR1llYXJNb250aC50aGlzLnNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5sbG9tLk9NU291cmNlZEVsZW1lbnRJbXBsKAotICAgICAgICAgICAgICAgcGFyZW50UU5hbWUsZmFjdG9yeSxkYXRhU291cmNlKTsKLSAgICAgICAgICAgIAotICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcixmYWxzZSk7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNlcmlhbGl6ZVR5cGUpCi0gICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgCi0KLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gcGFyZW50UU5hbWUuZ2V0UHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZSA9IHBhcmVudFFOYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlICE9IG51bGwpICYmIChuYW1lc3BhY2UudHJpbSgpLmxlbmd0aCgpID4gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgd3JpdGVyUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdyaXRlclByZWZpeCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KG5hbWVzcGFjZSwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocHJlZml4LCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgaWYgKHNlcmlhbGl6ZVR5cGUpewotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIik7Ci0gICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2VQcmVmaXggIT0gbnVsbCkgJiYgKG5hbWVzcGFjZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlUHJlZml4KyI6Z1llYXJNb250aCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgImdZZWFyTW9udGgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxHWWVhck1vbnRoPT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZSB0aGUgbmlsIGF0dHJpYnV0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oImdZZWFyTW9udGggY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxHWWVhck1vbnRoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBwcmVmaXgsamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICBpZiAoeG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0KLSAgICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0KLSAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLCBqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZU5hbWVzcGFjZSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlVmFsdWU7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gYXR0cmlidXRlUHJlZml4ICsgIjoiICsgcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsIGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIC8qKgotICAgICAgICAgKiAgbWV0aG9kIHRvIGhhbmRsZSBRbmFtZXMKLSAgICAgICAgICovCi0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWUoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMocHJlZml4ICsgIjoiICsgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGkuZSB0aGlzIGlzIHRoZSBkZWZhdWx0IG5hbWVzcGFjZQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZXMoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZVtdIHFuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgaWYgKHFuYW1lcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBzdG9yZSB0aGlzIGRhdGEgdW50aWwgbGFzdCBtb21lbnQgc2luY2UgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHdyaXRlIGFueQotICAgICAgICAgICAgICAgIC8vIG5hbWVzcGFjZSBkYXRhIGFmdGVyIHdyaXRpbmcgdGhlIGNoYXJhY3RvciBkYXRhCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZ0J1ZmZlciBzdHJpbmdUb1dyaXRlID0gbmV3IGphdmEubGFuZy5TdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBxbmFtZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZCgiICIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVVSSSA9IHFuYW1lc1tpXS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHByZWZpeCA9PSBudWxsKSB8fCAocHJlZml4Lmxlbmd0aCgpID09IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQocHJlZml4KS5hcHBlbmQoIjoiKS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhzdHJpbmdUb1dyaXRlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotCi0gICAgICAgICAvKioKLSAgICAgICAgICogUmVnaXN0ZXIgYSBuYW1lc3BhY2UgcHJlZml4Ci0gICAgICAgICAqLwotICAgICAgICAgcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHJlZ2lzdGVyUHJlZml4KGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoeG1sV3JpdGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHByZWZpeDsKLSAgICAgICAgICAgIH0KLQotCi0gIAotICAgICAgICAvKioKLSAgICAgICAgKiBkYXRhYmluZGluZyBtZXRob2QgdG8gZ2V0IGFuIFhNTCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdAotICAgICAgICAqCi0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciBnZXRQdWxsUGFyc2VyKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcU5hbWUpCi0gICAgICAgICAgICAgICAgICAgIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGVsZW1lbnRMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBhdHRyaWJMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXIuRUxFTUVOVF9URVhUKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbEdZZWFyTW9udGggIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsR1llYXJNb250aCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJnWWVhck1vbnRoIGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVySW1wbChxTmFtZSwgZWxlbWVudExpc3QudG9BcnJheSgpLCBhdHRyaWJMaXN0LnRvQXJyYXkoKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAKLQotICAgICAvKioKLSAgICAgICogIEZhY3RvcnkgY2xhc3MgdGhhdCBrZWVwcyB0aGUgcGFyc2UgbWV0aG9kCi0gICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeXsKLQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBHWWVhck1vbnRoIGZyb21TdHJpbmcoamF2YS5sYW5nLlN0cmluZyB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSl7Ci0gICAgICAgICAgICAgICAgICAgIEdZZWFyTW9udGggcmV0dXJuVmFsdWUgPSBuZXcgIEdZZWFyTW9udGgoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUuc2V0R1llYXJNb250aCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb0dZZWFyTW9udGgodmFsdWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIEdZZWFyTW9udGggZnJvbVN0cmluZyhqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudC5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IGNvbnRlbnQuc3Vic3RyaW5nKDAsY29udGVudC5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVcmkgPSB4bWxTdHJlYW1SZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEdZZWFyTW9udGguRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsbmFtZXNwYWNlVXJpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEdZZWFyTW9udGguRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsIiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAKLQotICAgICAgICAvKioKLSAgICAgICAgKiBzdGF0aWMgbWV0aG9kIHRvIGNyZWF0ZSB0aGUgb2JqZWN0Ci0gICAgICAgICogUHJlY29uZGl0aW9uOiAgSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIGN1cnJlbnQgb3IgbmV4dCBzdGFydCBlbGVtZW50IHN0YXJ0cyB0aGlzIG9iamVjdCBhbmQgYW55IGludGVydmVuaW5nIHJlYWRlciBldmVudHMgYXJlIGlnbm9yYWJsZQotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIG5vdCBhbiBlbGVtZW50LCBpdCBpcyBhIGNvbXBsZXggdHlwZSBhbmQgdGhlIHJlYWRlciBpcyBhdCB0aGUgZXZlbnQganVzdCBhZnRlciB0aGUgb3V0ZXIgc3RhcnQgZWxlbWVudAotICAgICAgICAqIFBvc3Rjb25kaXRpb246IElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCBpdHMgZW5kIGVsZW1lbnQKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBhIGNvbXBsZXggdHlwZSwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IHRoZSBlbmQgZWxlbWVudCBvZiBpdHMgb3V0ZXIgZWxlbWVudAotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIEdZZWFyTW9udGggcGFyc2UoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIEdZZWFyTW9udGggb2JqZWN0ID0KLSAgICAgICAgICAgICAgICBuZXcgR1llYXJNb250aCgpOwotCi0gICAgICAgICAgICBpbnQgZXZlbnQ7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5pbGxhYmxlVmFsdWUgPSBudWxsOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSIiOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2V1cmkgPSIiOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSAoIXJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICYmICFyZWFkZXIuaXNFbmRFbGVtZW50KCkpCi0gICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiKSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGZ1bGxUeXBlTmFtZSA9IHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiKTsKLSAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUhPW51bGwpewotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zUHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoMCxmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IG5zUHJlZml4PT1udWxsPyIiOm5zUHJlZml4OwotCi0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgdHlwZSA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSsxKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEiZ1llYXJNb250aCIuZXF1YWxzKHR5cGUpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9maW5kIG5hbWVzcGFjZSBmb3IgdGhlIHByZWZpeAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zVXJpID0gcmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkobnNQcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKEdZZWFyTW9udGgpb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy54c2QuRXh0ZW5zaW9uTWFwcGVyLmdldFR5cGVPYmplY3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNVcmksdHlwZSxyZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gTm90ZSBhbGwgYXR0cmlidXRlcyB0aGF0IHdlcmUgaGFuZGxlZC4gVXNlZCB0byBkaWZmZXIgbm9ybWFsIGF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgICAvLyBmcm9tIGFueUF0dHJpYnV0ZXMuCi0gICAgICAgICAgICAgICAgamF2YS51dGlsLlZlY3RvciBoYW5kbGVkQXR0cmlidXRlcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUoIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQgPSByZWFkZXIuZ2V0RWxlbWVudFRleHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5zZXRHWWVhck1vbnRoKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9HWWVhck1vbnRoKGNvbnRlbnQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBFbmQgb2YgaWYgZm9yIGV4cGVjdGVkIHByb3BlcnR5IHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2V7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBzdGFydCBlbGVtZW50IHdlIGFyZSBub3QgZXhwZWN0aW5nIGluZGljYXRlcyBhbiBpbnZhbGlkIHBhcmFtZXRlciB3YXMgcGFzc2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJVbmV4cGVjdGVkIHN1YmVsZW1lbnQgIiArIHJlYWRlci5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gZW5kIG9mIHdoaWxlIGxvb3AKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0KLQotICAgICAgICAgICAgfSBjYXRjaCAoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gb2JqZWN0OwotICAgICAgICB9Ci0KLSAgICAgICAgfS8vZW5kIG9mIGZhY3RvcnkgY2xhc3MKLQotICAgICAgICAKLQotICAgICAgICB9Ci0gICAgICAgICAgIAotICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy94c2QvSGV4QmluYXJ5LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMveHNkL0hleEJpbmFyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzQ0MGJhLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy94c2QvSGV4QmluYXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDMgKzAsMCBAQAotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIEhleEJpbmFyeS5qYXZhCi0gKgotICogVGhpcyBmaWxlIHdhcyBhdXRvLWdlbmVyYXRlZCBmcm9tIFdTREwKLSAqIGJ5IHRoZSBBcGFjaGUgQXhpczIgdmVyc2lvbjogU05BUFNIT1QgIEJ1aWx0IG9uIDogRGVjIDIxLCAyMDA3ICgwNDowMzozMCBMS1QpCi0gKi8KLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy54c2Q7Ci0gICAgICAgICAgICAKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqICBIZXhCaW5hcnkgYmVhbiBjbGFzcwotICAgICAgICAgICAgKi8KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyAgY2xhc3MgSGV4QmluYXJ5Ci0gICAgICAgIGltcGxlbWVudHMgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJCZWFuewotICAgICAgICAvKiBUaGlzIHR5cGUgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBwaWVjZSBvZiBzY2hlbWEgdGhhdCBoYWQKLSAgICAgICAgICAgICAgICBuYW1lID0gaGV4QmluYXJ5Ci0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFVSSSA9IGh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFByZWZpeCA9IG5zMQotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdlbmVyYXRlUHJlZml4KGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB7Ci0gICAgICAgICAgICBpZihuYW1lc3BhY2UuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpKXsKLSAgICAgICAgICAgICAgICByZXR1cm4gInhzZCI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgfQotCi0gICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogZmllbGQgZm9yIEhleEJpbmFyeQotICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5IZXhCaW5hcnkgbG9jYWxIZXhCaW5hcnkgOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIGdldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLkhleEJpbmFyeQotICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5IZXhCaW5hcnkgZ2V0SGV4QmluYXJ5KCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsSGV4QmluYXJ5OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgc2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtIHBhcmFtIEhleEJpbmFyeQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0SGV4QmluYXJ5KG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuSGV4QmluYXJ5IHBhcmFtKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2NhbEhleEJpbmFyeT1wYXJhbTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsSGV4QmluYXJ5LnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAvKioKLSAgICAgKiBpc1JlYWRlck1UT01Bd2FyZQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVhZGVyIHN1cHBvcnRzIE1UT00KLSAgICAgKi8KLSAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKLSAgICAgICAgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICAKLSAgICAgICAgdHJ5ewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gamF2YS5sYW5nLkJvb2xlYW4uVFJVRS5lcXVhbHMocmVhZGVyLmdldFByb3BlcnR5KG9yZy5hcGFjaGUuYXhpb20ub20uT01Db25zdGFudHMuSVNfREFUQV9IQU5ETEVSU19BV0FSRSkpOwotICAgICAgICB9Y2F0Y2goamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpc1JlYWRlck1UT01Bd2FyZTsKLSAgIH0KLSAgICAgCi0gICAgIAotICAgICAgICAvKioKLSAgICAgICAgKgotICAgICAgICAqIEBwYXJhbSBwYXJlbnRRTmFtZQotICAgICAgICAqIEBwYXJhbSBmYWN0b3J5Ci0gICAgICAgICogQHJldHVybiBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudAotICAgICAgICAqLwotICAgICAgIHB1YmxpYyBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCBnZXRPTUVsZW1lbnQgKAotICAgICAgICAgICAgICAgZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnkpIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTURhdGFTb3VyY2UgZGF0YVNvdXJjZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkRhdGFTb3VyY2UodGhpcyxwYXJlbnRRTmFtZSl7Ci0KLSAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgIEhleEJpbmFyeS50aGlzLnNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5sbG9tLk9NU291cmNlZEVsZW1lbnRJbXBsKAotICAgICAgICAgICAgICAgcGFyZW50UU5hbWUsZmFjdG9yeSxkYXRhU291cmNlKTsKLSAgICAgICAgICAgIAotICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcixmYWxzZSk7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNlcmlhbGl6ZVR5cGUpCi0gICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgCi0KLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gcGFyZW50UU5hbWUuZ2V0UHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZSA9IHBhcmVudFFOYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlICE9IG51bGwpICYmIChuYW1lc3BhY2UudHJpbSgpLmxlbmd0aCgpID4gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgd3JpdGVyUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdyaXRlclByZWZpeCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KG5hbWVzcGFjZSwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocHJlZml4LCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgaWYgKHNlcmlhbGl6ZVR5cGUpewotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIik7Ci0gICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2VQcmVmaXggIT0gbnVsbCkgJiYgKG5hbWVzcGFjZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlUHJlZml4KyI6aGV4QmluYXJ5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiaGV4QmluYXJ5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsSGV4QmluYXJ5PT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZSB0aGUgbmlsIGF0dHJpYnV0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oImhleEJpbmFyeSBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbEhleEJpbmFyeSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGggdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgcHJlZml4LGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgaWYgKHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotCi0gICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotCi0gICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSwgamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVOYW1lc3BhY2UgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgoYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVZhbHVlOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IGF0dHJpYnV0ZVByZWZpeCArICI6IiArIHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLCBhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAvKioKLSAgICAgICAgICogIG1ldGhvZCB0byBoYW5kbGUgUW5hbWVzCi0gICAgICAgICAqLwotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHByZWZpeCArICI6IiArIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBpLmUgdGhpcyBpcyB0aGUgZGVmYXVsdCBuYW1lc3BhY2UKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVzKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWVbXSBxbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgIGlmIChxbmFtZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gc3RvcmUgdGhpcyBkYXRhIHVudGlsIGxhc3QgbW9tZW50IHNpbmNlIGl0IGlzIG5vdCBwb3NzaWJsZSB0byB3cml0ZSBhbnkKLSAgICAgICAgICAgICAgICAvLyBuYW1lc3BhY2UgZGF0YSBhZnRlciB3cml0aW5nIHRoZSBjaGFyYWN0b3IgZGF0YQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmdCdWZmZXIgc3RyaW5nVG9Xcml0ZSA9IG5ldyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcW5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQoIiAiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VVUkkgPSBxbmFtZXNbaV0uZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwcmVmaXggPT0gbnVsbCkgfHwgKHByZWZpeC5sZW5ndGgoKSA9PSAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKHByZWZpeCkuYXBwZW5kKCI6IikuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMoc3RyaW5nVG9Xcml0ZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAqIFJlZ2lzdGVyIGEgbmFtZXNwYWNlIHByZWZpeAotICAgICAgICAgKi8KLSAgICAgICAgIHByaXZhdGUgamF2YS5sYW5nLlN0cmluZyByZWdpc3RlclByZWZpeChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHhtbFdyaXRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiBwcmVmaXg7Ci0gICAgICAgICAgICB9Ci0KLQotICAKLSAgICAgICAgLyoqCi0gICAgICAgICogZGF0YWJpbmRpbmcgbWV0aG9kIHRvIGdldCBhbiBYTUwgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QKLSAgICAgICAgKgotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgZ2V0UHVsbFBhcnNlcihqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFOYW1lKQotICAgICAgICAgICAgICAgICAgICB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBlbGVtZW50TGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgYXR0cmliTGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVyLkVMRU1FTlRfVEVYVCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxIZXhCaW5hcnkgIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsSGV4QmluYXJ5KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oImhleEJpbmFyeSBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlckltcGwocU5hbWUsIGVsZW1lbnRMaXN0LnRvQXJyYXkoKSwgYXR0cmliTGlzdC50b0FycmF5KCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgCi0KLSAgICAgLyoqCi0gICAgICAqICBGYWN0b3J5IGNsYXNzIHRoYXQga2VlcHMgdGhlIHBhcnNlIG1ldGhvZAotICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3Rvcnl7Ci0KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgSGV4QmluYXJ5IGZyb21TdHJpbmcoamF2YS5sYW5nLlN0cmluZyB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSl7Ci0gICAgICAgICAgICAgICAgICAgIEhleEJpbmFyeSByZXR1cm5WYWx1ZSA9IG5ldyAgSGV4QmluYXJ5KCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlLnNldEhleEJpbmFyeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb0hleEJpbmFyeSh2YWx1ZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgSGV4QmluYXJ5IGZyb21TdHJpbmcoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBjb250ZW50LnN1YnN0cmluZygwLGNvbnRlbnQuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVXJpID0geG1sU3RyZWFtUmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBIZXhCaW5hcnkuRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsbmFtZXNwYWNlVXJpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEhleEJpbmFyeS5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCwiIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIAotCi0gICAgICAgIC8qKgotICAgICAgICAqIHN0YXRpYyBtZXRob2QgdG8gY3JlYXRlIHRoZSBvYmplY3QKLSAgICAgICAgKiBQcmVjb25kaXRpb246ICBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgY3VycmVudCBvciBuZXh0IHN0YXJ0IGVsZW1lbnQgc3RhcnRzIHRoaXMgb2JqZWN0IGFuZCBhbnkgaW50ZXJ2ZW5pbmcgcmVhZGVyIGV2ZW50cyBhcmUgaWdub3JhYmxlCi0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgbm90IGFuIGVsZW1lbnQsIGl0IGlzIGEgY29tcGxleCB0eXBlIGFuZCB0aGUgcmVhZGVyIGlzIGF0IHRoZSBldmVudCBqdXN0IGFmdGVyIHRoZSBvdXRlciBzdGFydCBlbGVtZW50Ci0gICAgICAgICogUG9zdGNvbmRpdGlvbjogSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IGl0cyBlbmQgZWxlbWVudAotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIGEgY29tcGxleCB0eXBlLCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgdGhlIGVuZCBlbGVtZW50IG9mIGl0cyBvdXRlciBlbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgSGV4QmluYXJ5IHBhcnNlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb257Ci0gICAgICAgICAgICBIZXhCaW5hcnkgb2JqZWN0ID0KLSAgICAgICAgICAgICAgICBuZXcgSGV4QmluYXJ5KCk7Ci0KLSAgICAgICAgICAgIGludCBldmVudDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmlsbGFibGVWYWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IiI7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZXVyaSA9IiI7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlICghcmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgJiYgIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkKLSAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIpIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgZnVsbFR5cGVOYW1lID0gcmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAidHlwZSIpOwotICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNQcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZygwLGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gbnNQcmVmaXg9PW51bGw/IiI6bnNQcmVmaXg7Ci0KLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB0eXBlID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZyhmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKzEpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISJoZXhCaW5hcnkiLmVxdWFscyh0eXBlKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZmluZCBuYW1lc3BhY2UgZm9yIHRoZSBwcmVmaXgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1VyaSA9IHJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKG5zUHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChIZXhCaW5hcnkpb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy54c2QuRXh0ZW5zaW9uTWFwcGVyLmdldFR5cGVPYmplY3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNVcmksdHlwZSxyZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gTm90ZSBhbGwgYXR0cmlidXRlcyB0aGF0IHdlcmUgaGFuZGxlZC4gVXNlZCB0byBkaWZmZXIgbm9ybWFsIGF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgICAvLyBmcm9tIGFueUF0dHJpYnV0ZXMuCi0gICAgICAgICAgICAgICAgamF2YS51dGlsLlZlY3RvciBoYW5kbGVkQXR0cmlidXRlcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUoIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQgPSByZWFkZXIuZ2V0RWxlbWVudFRleHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5zZXRIZXhCaW5hcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb0hleEJpbmFyeShjb250ZW50KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gRW5kIG9mIGlmIGZvciBleHBlY3RlZCBwcm9wZXJ0eSBzdGFydCBlbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgc3RhcnQgZWxlbWVudCB3ZSBhcmUgbm90IGV4cGVjdGluZyBpbmRpY2F0ZXMgYW4gaW52YWxpZCBwYXJhbWV0ZXIgd2FzIHBhc3NlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiVW5leHBlY3RlZCBzdWJlbGVtZW50ICIgKyByZWFkZXIuZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIGVuZCBvZiB3aGlsZSBsb29wCi0gICAgICAgICAgICAgICAgICAgICAgICAKLQotCi0KLSAgICAgICAgICAgIH0gY2F0Y2ggKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5sYW5nLkV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG9iamVjdDsKLSAgICAgICAgfQotCi0gICAgICAgIH0vL2VuZCBvZiBmYWN0b3J5IGNsYXNzCi0KLSAgICAgICAgCi0KLSAgICAgICAgfQotICAgICAgICAgICAKLSAgICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMveHNkL0lELmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMveHNkL0lELmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzMjlhNzcuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3hzZC9JRC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAzICswLDAgQEAKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBJRC5qYXZhCi0gKgotICogVGhpcyBmaWxlIHdhcyBhdXRvLWdlbmVyYXRlZCBmcm9tIFdTREwKLSAqIGJ5IHRoZSBBcGFjaGUgQXhpczIgdmVyc2lvbjogU05BUFNIT1QgIEJ1aWx0IG9uIDogRGVjIDIxLCAyMDA3ICgwNDowMzozMCBMS1QpCi0gKi8KLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy54c2Q7Ci0gICAgICAgICAgICAKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqICBJRCBiZWFuIGNsYXNzCi0gICAgICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgcHVibGljICBjbGFzcyBJRAotICAgICAgICBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCQmVhbnsKLSAgICAgICAgLyogVGhpcyB0eXBlIHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgcGllY2Ugb2Ygc2NoZW1hIHRoYXQgaGFkCi0gICAgICAgICAgICAgICAgbmFtZSA9IElECi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFVSSSA9IGh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFByZWZpeCA9IG5zMQotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdlbmVyYXRlUHJlZml4KGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB7Ci0gICAgICAgICAgICBpZihuYW1lc3BhY2UuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpKXsKLSAgICAgICAgICAgICAgICByZXR1cm4gInhzZCI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgfQotCi0gICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogZmllbGQgZm9yIElECi0gICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLklkIGxvY2FsSUQgOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIGdldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLklkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLklkIGdldElEKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsSUQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBzZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gcGFyYW0gSUQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldElEKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuSWQgcGFyYW0pewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2FsSUQ9cGFyYW07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbElELnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAvKioKLSAgICAgKiBpc1JlYWRlck1UT01Bd2FyZQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVhZGVyIHN1cHBvcnRzIE1UT00KLSAgICAgKi8KLSAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKLSAgICAgICAgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICAKLSAgICAgICAgdHJ5ewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gamF2YS5sYW5nLkJvb2xlYW4uVFJVRS5lcXVhbHMocmVhZGVyLmdldFByb3BlcnR5KG9yZy5hcGFjaGUuYXhpb20ub20uT01Db25zdGFudHMuSVNfREFUQV9IQU5ETEVSU19BV0FSRSkpOwotICAgICAgICB9Y2F0Y2goamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpc1JlYWRlck1UT01Bd2FyZTsKLSAgIH0KLSAgICAgCi0gICAgIAotICAgICAgICAvKioKLSAgICAgICAgKgotICAgICAgICAqIEBwYXJhbSBwYXJlbnRRTmFtZQotICAgICAgICAqIEBwYXJhbSBmYWN0b3J5Ci0gICAgICAgICogQHJldHVybiBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudAotICAgICAgICAqLwotICAgICAgIHB1YmxpYyBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCBnZXRPTUVsZW1lbnQgKAotICAgICAgICAgICAgICAgZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnkpIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTURhdGFTb3VyY2UgZGF0YVNvdXJjZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkRhdGFTb3VyY2UodGhpcyxwYXJlbnRRTmFtZSl7Ci0KLSAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgIElELnRoaXMuc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmxsb20uT01Tb3VyY2VkRWxlbWVudEltcGwoCi0gICAgICAgICAgICAgICBwYXJlbnRRTmFtZSxmYWN0b3J5LGRhdGFTb3VyY2UpOwotICAgICAgICAgICAgCi0gICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyLGZhbHNlKTsKLSAgICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VyaWFsaXplVHlwZSkKLSAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLQotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBwYXJlbnRRTmFtZS5nZXRQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlID0gcGFyZW50UU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2UgIT0gbnVsbCkgJiYgKG5hbWVzcGFjZS50cmltKCkubGVuZ3RoKCkgPiAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB3cml0ZXJQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAod3JpdGVyUHJlZml4ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQobmFtZXNwYWNlLCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwcmVmaXgsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICBpZiAoc2VyaWFsaXplVHlwZSl7Ci0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKTsKLSAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZVByZWZpeCAhPSBudWxsKSAmJiAobmFtZXNwYWNlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApKXsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VQcmVmaXgrIjpJRCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIklEIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsSUQ9PW51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIHRoZSBuaWwgYXR0cmlidXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiSUQgY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxJRCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGggdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgcHJlZml4LGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgaWYgKHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotCi0gICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotCi0gICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSwgamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVOYW1lc3BhY2UgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgoYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVZhbHVlOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IGF0dHJpYnV0ZVByZWZpeCArICI6IiArIHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLCBhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAvKioKLSAgICAgICAgICogIG1ldGhvZCB0byBoYW5kbGUgUW5hbWVzCi0gICAgICAgICAqLwotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHByZWZpeCArICI6IiArIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBpLmUgdGhpcyBpcyB0aGUgZGVmYXVsdCBuYW1lc3BhY2UKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVzKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWVbXSBxbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgIGlmIChxbmFtZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gc3RvcmUgdGhpcyBkYXRhIHVudGlsIGxhc3QgbW9tZW50IHNpbmNlIGl0IGlzIG5vdCBwb3NzaWJsZSB0byB3cml0ZSBhbnkKLSAgICAgICAgICAgICAgICAvLyBuYW1lc3BhY2UgZGF0YSBhZnRlciB3cml0aW5nIHRoZSBjaGFyYWN0b3IgZGF0YQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmdCdWZmZXIgc3RyaW5nVG9Xcml0ZSA9IG5ldyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcW5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQoIiAiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VVUkkgPSBxbmFtZXNbaV0uZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwcmVmaXggPT0gbnVsbCkgfHwgKHByZWZpeC5sZW5ndGgoKSA9PSAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKHByZWZpeCkuYXBwZW5kKCI6IikuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMoc3RyaW5nVG9Xcml0ZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAqIFJlZ2lzdGVyIGEgbmFtZXNwYWNlIHByZWZpeAotICAgICAgICAgKi8KLSAgICAgICAgIHByaXZhdGUgamF2YS5sYW5nLlN0cmluZyByZWdpc3RlclByZWZpeChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHhtbFdyaXRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiBwcmVmaXg7Ci0gICAgICAgICAgICB9Ci0KLQotICAKLSAgICAgICAgLyoqCi0gICAgICAgICogZGF0YWJpbmRpbmcgbWV0aG9kIHRvIGdldCBhbiBYTUwgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QKLSAgICAgICAgKgotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgZ2V0UHVsbFBhcnNlcihqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFOYW1lKQotICAgICAgICAgICAgICAgICAgICB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBlbGVtZW50TGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgYXR0cmliTGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVyLkVMRU1FTlRfVEVYVCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxJRCAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxJRCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJJRCBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlckltcGwocU5hbWUsIGVsZW1lbnRMaXN0LnRvQXJyYXkoKSwgYXR0cmliTGlzdC50b0FycmF5KCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgCi0KLSAgICAgLyoqCi0gICAgICAqICBGYWN0b3J5IGNsYXNzIHRoYXQga2VlcHMgdGhlIHBhcnNlIG1ldGhvZAotICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3Rvcnl7Ci0KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgSUQgZnJvbVN0cmluZyhqYXZhLmxhbmcuU3RyaW5nIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJKXsKLSAgICAgICAgICAgICAgICAgICAgSUQgcmV0dXJuVmFsdWUgPSBuZXcgIElEKCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlLnNldElEKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvSUQodmFsdWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIElEIGZyb21TdHJpbmcoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBjb250ZW50LnN1YnN0cmluZygwLGNvbnRlbnQuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVXJpID0geG1sU3RyZWFtUmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJRC5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCxuYW1lc3BhY2VVcmkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSUQuRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsIiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAKLQotICAgICAgICAvKioKLSAgICAgICAgKiBzdGF0aWMgbWV0aG9kIHRvIGNyZWF0ZSB0aGUgb2JqZWN0Ci0gICAgICAgICogUHJlY29uZGl0aW9uOiAgSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIGN1cnJlbnQgb3IgbmV4dCBzdGFydCBlbGVtZW50IHN0YXJ0cyB0aGlzIG9iamVjdCBhbmQgYW55IGludGVydmVuaW5nIHJlYWRlciBldmVudHMgYXJlIGlnbm9yYWJsZQotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIG5vdCBhbiBlbGVtZW50LCBpdCBpcyBhIGNvbXBsZXggdHlwZSBhbmQgdGhlIHJlYWRlciBpcyBhdCB0aGUgZXZlbnQganVzdCBhZnRlciB0aGUgb3V0ZXIgc3RhcnQgZWxlbWVudAotICAgICAgICAqIFBvc3Rjb25kaXRpb246IElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCBpdHMgZW5kIGVsZW1lbnQKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBhIGNvbXBsZXggdHlwZSwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IHRoZSBlbmQgZWxlbWVudCBvZiBpdHMgb3V0ZXIgZWxlbWVudAotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIElEIHBhcnNlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb257Ci0gICAgICAgICAgICBJRCBvYmplY3QgPQotICAgICAgICAgICAgICAgIG5ldyBJRCgpOwotCi0gICAgICAgICAgICBpbnQgZXZlbnQ7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5pbGxhYmxlVmFsdWUgPSBudWxsOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSIiOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2V1cmkgPSIiOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSAoIXJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICYmICFyZWFkZXIuaXNFbmRFbGVtZW50KCkpCi0gICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiKSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGZ1bGxUeXBlTmFtZSA9IHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiKTsKLSAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUhPW51bGwpewotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zUHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoMCxmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IG5zUHJlZml4PT1udWxsPyIiOm5zUHJlZml4OwotCi0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgdHlwZSA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSsxKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEiSUQiLmVxdWFscyh0eXBlKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZmluZCBuYW1lc3BhY2UgZm9yIHRoZSBwcmVmaXgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1VyaSA9IHJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKG5zUHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChJRClvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnhzZC5FeHRlbnNpb25NYXBwZXIuZ2V0VHlwZU9iamVjdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc1VyaSx0eXBlLHJlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBOb3RlIGFsbCBhdHRyaWJ1dGVzIHRoYXQgd2VyZSBoYW5kbGVkLiBVc2VkIHRvIGRpZmZlciBub3JtYWwgYXR0cmlidXRlcwotICAgICAgICAgICAgICAgIC8vIGZyb20gYW55QXR0cmlidXRlcy4KLSAgICAgICAgICAgICAgICBqYXZhLnV0aWwuVmVjdG9yIGhhbmRsZWRBdHRyaWJ1dGVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSghcmVhZGVyLmlzRW5kRWxlbWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCA9IHJlYWRlci5nZXRFbGVtZW50VGV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldElEKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9JRChjb250ZW50KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gRW5kIG9mIGlmIGZvciBleHBlY3RlZCBwcm9wZXJ0eSBzdGFydCBlbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgc3RhcnQgZWxlbWVudCB3ZSBhcmUgbm90IGV4cGVjdGluZyBpbmRpY2F0ZXMgYW4gaW52YWxpZCBwYXJhbWV0ZXIgd2FzIHBhc3NlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiVW5leHBlY3RlZCBzdWJlbGVtZW50ICIgKyByZWFkZXIuZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIGVuZCBvZiB3aGlsZSBsb29wCi0gICAgICAgICAgICAgICAgICAgICAgICAKLQotCi0KLSAgICAgICAgICAgIH0gY2F0Y2ggKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5sYW5nLkV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG9iamVjdDsKLSAgICAgICAgfQotCi0gICAgICAgIH0vL2VuZCBvZiBmYWN0b3J5IGNsYXNzCi0KLSAgICAgICAgCi0KLSAgICAgICAgfQotICAgICAgICAgICAKLSAgICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMveHNkL0lEUkVGLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMveHNkL0lEUkVGLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhMGUyMzUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3hzZC9JRFJFRi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAzICswLDAgQEAKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBJRFJFRi5qYXZhCi0gKgotICogVGhpcyBmaWxlIHdhcyBhdXRvLWdlbmVyYXRlZCBmcm9tIFdTREwKLSAqIGJ5IHRoZSBBcGFjaGUgQXhpczIgdmVyc2lvbjogU05BUFNIT1QgIEJ1aWx0IG9uIDogRGVjIDIxLCAyMDA3ICgwNDowMzozMCBMS1QpCi0gKi8KLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy54c2Q7Ci0gICAgICAgICAgICAKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqICBJRFJFRiBiZWFuIGNsYXNzCi0gICAgICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgcHVibGljICBjbGFzcyBJRFJFRgotICAgICAgICBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCQmVhbnsKLSAgICAgICAgLyogVGhpcyB0eXBlIHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgcGllY2Ugb2Ygc2NoZW1hIHRoYXQgaGFkCi0gICAgICAgICAgICAgICAgbmFtZSA9IElEUkVGCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFVSSSA9IGh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFByZWZpeCA9IG5zMQotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdlbmVyYXRlUHJlZml4KGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB7Ci0gICAgICAgICAgICBpZihuYW1lc3BhY2UuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpKXsKLSAgICAgICAgICAgICAgICByZXR1cm4gInhzZCI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgfQotCi0gICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogZmllbGQgZm9yIElEUkVGCi0gICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLklEUmVmIGxvY2FsSURSRUYgOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIGdldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLklEUmVmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLklEUmVmIGdldElEUkVGKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsSURSRUY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBzZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gcGFyYW0gSURSRUYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldElEUkVGKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuSURSZWYgcGFyYW0pewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2FsSURSRUY9cGFyYW07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbElEUkVGLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAvKioKLSAgICAgKiBpc1JlYWRlck1UT01Bd2FyZQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVhZGVyIHN1cHBvcnRzIE1UT00KLSAgICAgKi8KLSAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKLSAgICAgICAgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICAKLSAgICAgICAgdHJ5ewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gamF2YS5sYW5nLkJvb2xlYW4uVFJVRS5lcXVhbHMocmVhZGVyLmdldFByb3BlcnR5KG9yZy5hcGFjaGUuYXhpb20ub20uT01Db25zdGFudHMuSVNfREFUQV9IQU5ETEVSU19BV0FSRSkpOwotICAgICAgICB9Y2F0Y2goamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpc1JlYWRlck1UT01Bd2FyZTsKLSAgIH0KLSAgICAgCi0gICAgIAotICAgICAgICAvKioKLSAgICAgICAgKgotICAgICAgICAqIEBwYXJhbSBwYXJlbnRRTmFtZQotICAgICAgICAqIEBwYXJhbSBmYWN0b3J5Ci0gICAgICAgICogQHJldHVybiBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudAotICAgICAgICAqLwotICAgICAgIHB1YmxpYyBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCBnZXRPTUVsZW1lbnQgKAotICAgICAgICAgICAgICAgZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnkpIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTURhdGFTb3VyY2UgZGF0YVNvdXJjZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkRhdGFTb3VyY2UodGhpcyxwYXJlbnRRTmFtZSl7Ci0KLSAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgIElEUkVGLnRoaXMuc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmxsb20uT01Tb3VyY2VkRWxlbWVudEltcGwoCi0gICAgICAgICAgICAgICBwYXJlbnRRTmFtZSxmYWN0b3J5LGRhdGFTb3VyY2UpOwotICAgICAgICAgICAgCi0gICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyLGZhbHNlKTsKLSAgICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VyaWFsaXplVHlwZSkKLSAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLQotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBwYXJlbnRRTmFtZS5nZXRQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlID0gcGFyZW50UU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2UgIT0gbnVsbCkgJiYgKG5hbWVzcGFjZS50cmltKCkubGVuZ3RoKCkgPiAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB3cml0ZXJQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAod3JpdGVyUHJlZml4ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQobmFtZXNwYWNlLCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwcmVmaXgsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICBpZiAoc2VyaWFsaXplVHlwZSl7Ci0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKTsKLSAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZVByZWZpeCAhPSBudWxsKSAmJiAobmFtZXNwYWNlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApKXsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VQcmVmaXgrIjpJRFJFRiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIklEUkVGIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsSURSRUY9PW51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIHRoZSBuaWwgYXR0cmlidXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiSURSRUYgY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxJRFJFRikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGggdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgcHJlZml4LGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgaWYgKHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotCi0gICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotCi0gICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSwgamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVOYW1lc3BhY2UgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgoYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVZhbHVlOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IGF0dHJpYnV0ZVByZWZpeCArICI6IiArIHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLCBhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAvKioKLSAgICAgICAgICogIG1ldGhvZCB0byBoYW5kbGUgUW5hbWVzCi0gICAgICAgICAqLwotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHByZWZpeCArICI6IiArIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBpLmUgdGhpcyBpcyB0aGUgZGVmYXVsdCBuYW1lc3BhY2UKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVzKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWVbXSBxbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgIGlmIChxbmFtZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gc3RvcmUgdGhpcyBkYXRhIHVudGlsIGxhc3QgbW9tZW50IHNpbmNlIGl0IGlzIG5vdCBwb3NzaWJsZSB0byB3cml0ZSBhbnkKLSAgICAgICAgICAgICAgICAvLyBuYW1lc3BhY2UgZGF0YSBhZnRlciB3cml0aW5nIHRoZSBjaGFyYWN0b3IgZGF0YQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmdCdWZmZXIgc3RyaW5nVG9Xcml0ZSA9IG5ldyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcW5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQoIiAiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VVUkkgPSBxbmFtZXNbaV0uZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwcmVmaXggPT0gbnVsbCkgfHwgKHByZWZpeC5sZW5ndGgoKSA9PSAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKHByZWZpeCkuYXBwZW5kKCI6IikuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMoc3RyaW5nVG9Xcml0ZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAqIFJlZ2lzdGVyIGEgbmFtZXNwYWNlIHByZWZpeAotICAgICAgICAgKi8KLSAgICAgICAgIHByaXZhdGUgamF2YS5sYW5nLlN0cmluZyByZWdpc3RlclByZWZpeChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHhtbFdyaXRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiBwcmVmaXg7Ci0gICAgICAgICAgICB9Ci0KLQotICAKLSAgICAgICAgLyoqCi0gICAgICAgICogZGF0YWJpbmRpbmcgbWV0aG9kIHRvIGdldCBhbiBYTUwgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QKLSAgICAgICAgKgotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgZ2V0UHVsbFBhcnNlcihqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFOYW1lKQotICAgICAgICAgICAgICAgICAgICB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBlbGVtZW50TGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgYXR0cmliTGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVyLkVMRU1FTlRfVEVYVCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxJRFJFRiAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxJRFJFRikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJJRFJFRiBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlckltcGwocU5hbWUsIGVsZW1lbnRMaXN0LnRvQXJyYXkoKSwgYXR0cmliTGlzdC50b0FycmF5KCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgCi0KLSAgICAgLyoqCi0gICAgICAqICBGYWN0b3J5IGNsYXNzIHRoYXQga2VlcHMgdGhlIHBhcnNlIG1ldGhvZAotICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3Rvcnl7Ci0KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgSURSRUYgZnJvbVN0cmluZyhqYXZhLmxhbmcuU3RyaW5nIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJKXsKLSAgICAgICAgICAgICAgICAgICAgSURSRUYgcmV0dXJuVmFsdWUgPSBuZXcgIElEUkVGKCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlLnNldElEUkVGKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvSURSRUYodmFsdWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIElEUkVGIGZyb21TdHJpbmcoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBjb250ZW50LnN1YnN0cmluZygwLGNvbnRlbnQuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVXJpID0geG1sU3RyZWFtUmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJRFJFRi5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCxuYW1lc3BhY2VVcmkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSURSRUYuRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsIiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAKLQotICAgICAgICAvKioKLSAgICAgICAgKiBzdGF0aWMgbWV0aG9kIHRvIGNyZWF0ZSB0aGUgb2JqZWN0Ci0gICAgICAgICogUHJlY29uZGl0aW9uOiAgSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIGN1cnJlbnQgb3IgbmV4dCBzdGFydCBlbGVtZW50IHN0YXJ0cyB0aGlzIG9iamVjdCBhbmQgYW55IGludGVydmVuaW5nIHJlYWRlciBldmVudHMgYXJlIGlnbm9yYWJsZQotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIG5vdCBhbiBlbGVtZW50LCBpdCBpcyBhIGNvbXBsZXggdHlwZSBhbmQgdGhlIHJlYWRlciBpcyBhdCB0aGUgZXZlbnQganVzdCBhZnRlciB0aGUgb3V0ZXIgc3RhcnQgZWxlbWVudAotICAgICAgICAqIFBvc3Rjb25kaXRpb246IElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCBpdHMgZW5kIGVsZW1lbnQKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBhIGNvbXBsZXggdHlwZSwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IHRoZSBlbmQgZWxlbWVudCBvZiBpdHMgb3V0ZXIgZWxlbWVudAotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIElEUkVGIHBhcnNlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb257Ci0gICAgICAgICAgICBJRFJFRiBvYmplY3QgPQotICAgICAgICAgICAgICAgIG5ldyBJRFJFRigpOwotCi0gICAgICAgICAgICBpbnQgZXZlbnQ7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5pbGxhYmxlVmFsdWUgPSBudWxsOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSIiOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2V1cmkgPSIiOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSAoIXJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICYmICFyZWFkZXIuaXNFbmRFbGVtZW50KCkpCi0gICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiKSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGZ1bGxUeXBlTmFtZSA9IHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiKTsKLSAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUhPW51bGwpewotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zUHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoMCxmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IG5zUHJlZml4PT1udWxsPyIiOm5zUHJlZml4OwotCi0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgdHlwZSA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSsxKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEiSURSRUYiLmVxdWFscyh0eXBlKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZmluZCBuYW1lc3BhY2UgZm9yIHRoZSBwcmVmaXgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1VyaSA9IHJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKG5zUHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChJRFJFRilvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnhzZC5FeHRlbnNpb25NYXBwZXIuZ2V0VHlwZU9iamVjdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc1VyaSx0eXBlLHJlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBOb3RlIGFsbCBhdHRyaWJ1dGVzIHRoYXQgd2VyZSBoYW5kbGVkLiBVc2VkIHRvIGRpZmZlciBub3JtYWwgYXR0cmlidXRlcwotICAgICAgICAgICAgICAgIC8vIGZyb20gYW55QXR0cmlidXRlcy4KLSAgICAgICAgICAgICAgICBqYXZhLnV0aWwuVmVjdG9yIGhhbmRsZWRBdHRyaWJ1dGVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSghcmVhZGVyLmlzRW5kRWxlbWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCA9IHJlYWRlci5nZXRFbGVtZW50VGV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldElEUkVGKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9JRFJFRihjb250ZW50KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gRW5kIG9mIGlmIGZvciBleHBlY3RlZCBwcm9wZXJ0eSBzdGFydCBlbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgc3RhcnQgZWxlbWVudCB3ZSBhcmUgbm90IGV4cGVjdGluZyBpbmRpY2F0ZXMgYW4gaW52YWxpZCBwYXJhbWV0ZXIgd2FzIHBhc3NlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiVW5leHBlY3RlZCBzdWJlbGVtZW50ICIgKyByZWFkZXIuZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIGVuZCBvZiB3aGlsZSBsb29wCi0gICAgICAgICAgICAgICAgICAgICAgICAKLQotCi0KLSAgICAgICAgICAgIH0gY2F0Y2ggKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5sYW5nLkV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG9iamVjdDsKLSAgICAgICAgfQotCi0gICAgICAgIH0vL2VuZCBvZiBmYWN0b3J5IGNsYXNzCi0KLSAgICAgICAgCi0KLSAgICAgICAgfQotICAgICAgICAgICAKLSAgICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMveHNkL0lEUkVGUy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3hzZC9JRFJFRlMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWYyZWJjOS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMveHNkL0lEUkVGUy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAzICswLDAgQEAKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBJRFJFRlMuamF2YQotICoKLSAqIFRoaXMgZmlsZSB3YXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBXU0RMCi0gKiBieSB0aGUgQXBhY2hlIEF4aXMyIHZlcnNpb246IFNOQVBTSE9UICBCdWlsdCBvbiA6IERlYyAyMSwgMjAwNyAoMDQ6MDM6MzAgTEtUKQotICovCi0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBwYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkOwotICAgICAgICAgICAgCi0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiAgSURSRUZTIGJlYW4gY2xhc3MKLSAgICAgICAgICAgICovCi0gICAgICAgIAotICAgICAgICBwdWJsaWMgIGNsYXNzIElEUkVGUwotICAgICAgICBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCQmVhbnsKLSAgICAgICAgLyogVGhpcyB0eXBlIHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgcGllY2Ugb2Ygc2NoZW1hIHRoYXQgaGFkCi0gICAgICAgICAgICAgICAgbmFtZSA9IElEUkVGUwotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBVUkkgPSBodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYQotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBQcmVmaXggPSBuczEKLSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgCi0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZW5lcmF0ZVByZWZpeChqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICAgICAgaWYobmFtZXNwYWNlLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSl7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJ4c2QiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgIH0KLQotICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIGZpZWxkIGZvciBJRFJFRlMKLSAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuSURSZWZzIGxvY2FsSURSRUZTIDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBnZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5JRFJlZnMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuSURSZWZzIGdldElEUkVGUygpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbElEUkVGUzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIHNldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSBwYXJhbSBJRFJFRlMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldElEUkVGUyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLklEUmVmcyBwYXJhbSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYWxJRFJFRlM9cGFyYW07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbElEUkVGUy50b1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgLyoqCi0gICAgICogaXNSZWFkZXJNVE9NQXdhcmUKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlYWRlciBzdXBwb3J0cyBNVE9NCi0gICAgICovCi0gICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIHRyeXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGphdmEubGFuZy5Cb29sZWFuLlRSVUUuZXF1YWxzKHJlYWRlci5nZXRQcm9wZXJ0eShvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQ29uc3RhbnRzLklTX0RBVEFfSEFORExFUlNfQVdBUkUpKTsKLSAgICAgICAgfWNhdGNoKGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXNSZWFkZXJNVE9NQXdhcmU7Ci0gICB9Ci0gICAgIAotICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICoKLSAgICAgICAgKiBAcGFyYW0gcGFyZW50UU5hbWUKLSAgICAgICAgKiBAcGFyYW0gZmFjdG9yeQotICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICBwdWJsaWMgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgZ2V0T01FbGVtZW50ICgKLSAgICAgICAgICAgICAgIGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5KSB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlIGRhdGFTb3VyY2UgPQotICAgICAgICAgICAgICAgICAgICAgICBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJEYXRhU291cmNlKHRoaXMscGFyZW50UU5hbWUpewotCi0gICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICBJRFJFRlMudGhpcy5zZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5PTVNvdXJjZWRFbGVtZW50SW1wbCgKLSAgICAgICAgICAgICAgIHBhcmVudFFOYW1lLGZhY3RvcnksZGF0YVNvdXJjZSk7Ci0gICAgICAgICAgICAKLSAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIsZmFsc2UpOwotICAgICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzZXJpYWxpemVUeXBlKQotICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotCi0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UgPSBudWxsOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHBhcmVudFFOYW1lLmdldFByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UgPSBwYXJlbnRRTmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZSAhPSBudWxsKSAmJiAobmFtZXNwYWNlLnRyaW0oKS5sZW5ndGgoKSA+IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHdyaXRlclByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3cml0ZXJQcmVmaXggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChuYW1lc3BhY2UsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHByZWZpeCwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCksIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIGlmIChzZXJpYWxpemVUeXBlKXsKLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpOwotICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlUHJlZml4ICE9IG51bGwpICYmIChuYW1lc3BhY2VQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkpewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVByZWZpeCsiOklEUkVGUyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIklEUkVGUyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbElEUkVGUz09bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgdGhlIG5pbCBhdHRyaWJ1dGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJJRFJFRlMgY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxJRFJFRlMpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRoIHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCxqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgIGlmICh4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLQotICAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsIGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlTmFtZXNwYWNlID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVWYWx1ZTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBhdHRyaWJ1dGVQcmVmaXggKyAiOiIgKyBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSwgYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICBtZXRob2QgdG8gaGFuZGxlIFFuYW1lcwotICAgICAgICAgKi8KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZShqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhwcmVmaXggKyAiOiIgKyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaS5lIHRoaXMgaXMgdGhlIGRlZmF1bHQgbmFtZXNwYWNlCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lcyhqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lW10gcW5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICBpZiAocW5hbWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHRvIHN0b3JlIHRoaXMgZGF0YSB1bnRpbCBsYXN0IG1vbWVudCBzaW5jZSBpdCBpcyBub3QgcG9zc2libGUgdG8gd3JpdGUgYW55Ci0gICAgICAgICAgICAgICAgLy8gbmFtZXNwYWNlIGRhdGEgYWZ0ZXIgd3JpdGluZyB0aGUgY2hhcmFjdG9yIGRhdGEKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIHN0cmluZ1RvV3JpdGUgPSBuZXcgamF2YS5sYW5nLlN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHFuYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKCIgIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlVVJJID0gcW5hbWVzW2ldLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocHJlZml4ID09IG51bGwpIHx8IChwcmVmaXgubGVuZ3RoKCkgPT0gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChwcmVmaXgpLmFwcGVuZCgiOiIpLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHN0cmluZ1RvV3JpdGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0KLSAgICAgICAgIC8qKgotICAgICAgICAgKiBSZWdpc3RlciBhIG5hbWVzcGFjZSBwcmVmaXgKLSAgICAgICAgICovCi0gICAgICAgICBwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgcmVnaXN0ZXJQcmVmaXgoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLCBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlICh4bWxXcml0ZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gcHJlZml4OwotICAgICAgICAgICAgfQotCi0KLSAgCi0gICAgICAgIC8qKgotICAgICAgICAqIGRhdGFiaW5kaW5nIG1ldGhvZCB0byBnZXQgYW4gWE1MIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0Ci0gICAgICAgICoKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIGdldFB1bGxQYXJzZXIoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxTmFtZSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgZWxlbWVudExpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGF0dHJpYkxpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlci5FTEVNRU5UX1RFWFQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsSURSRUZTICE9IG51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbElEUkVGUykpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJJRFJFRlMgY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXJJbXBsKHFOYW1lLCBlbGVtZW50TGlzdC50b0FycmF5KCksIGF0dHJpYkxpc3QudG9BcnJheSgpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gIAotCi0gICAgIC8qKgotICAgICAgKiAgRmFjdG9yeSBjbGFzcyB0aGF0IGtlZXBzIHRoZSBwYXJzZSBtZXRob2QKLSAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5ewotCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIElEUkVGUyBmcm9tU3RyaW5nKGphdmEubGFuZy5TdHJpbmcgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkpewotICAgICAgICAgICAgICAgICAgICBJRFJFRlMgcmV0dXJuVmFsdWUgPSBuZXcgIElEUkVGUygpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZS5zZXRJRFJFRlMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9JRFJFRlModmFsdWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIElEUkVGUyBmcm9tU3RyaW5nKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50LmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gY29udGVudC5zdWJzdHJpbmcoMCxjb250ZW50LmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVyaSA9IHhtbFN0cmVhbVJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSURSRUZTLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LG5hbWVzcGFjZVVyaSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJRFJFRlMuRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsIiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAKLQotICAgICAgICAvKioKLSAgICAgICAgKiBzdGF0aWMgbWV0aG9kIHRvIGNyZWF0ZSB0aGUgb2JqZWN0Ci0gICAgICAgICogUHJlY29uZGl0aW9uOiAgSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIGN1cnJlbnQgb3IgbmV4dCBzdGFydCBlbGVtZW50IHN0YXJ0cyB0aGlzIG9iamVjdCBhbmQgYW55IGludGVydmVuaW5nIHJlYWRlciBldmVudHMgYXJlIGlnbm9yYWJsZQotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIG5vdCBhbiBlbGVtZW50LCBpdCBpcyBhIGNvbXBsZXggdHlwZSBhbmQgdGhlIHJlYWRlciBpcyBhdCB0aGUgZXZlbnQganVzdCBhZnRlciB0aGUgb3V0ZXIgc3RhcnQgZWxlbWVudAotICAgICAgICAqIFBvc3Rjb25kaXRpb246IElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCBpdHMgZW5kIGVsZW1lbnQKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBhIGNvbXBsZXggdHlwZSwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IHRoZSBlbmQgZWxlbWVudCBvZiBpdHMgb3V0ZXIgZWxlbWVudAotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIElEUkVGUyBwYXJzZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uewotICAgICAgICAgICAgSURSRUZTIG9iamVjdCA9Ci0gICAgICAgICAgICAgICAgbmV3IElEUkVGUygpOwotCi0gICAgICAgICAgICBpbnQgZXZlbnQ7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5pbGxhYmxlVmFsdWUgPSBudWxsOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSIiOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2V1cmkgPSIiOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSAoIXJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICYmICFyZWFkZXIuaXNFbmRFbGVtZW50KCkpCi0gICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiKSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGZ1bGxUeXBlTmFtZSA9IHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiKTsKLSAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUhPW51bGwpewotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zUHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoMCxmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IG5zUHJlZml4PT1udWxsPyIiOm5zUHJlZml4OwotCi0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgdHlwZSA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSsxKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEiSURSRUZTIi5lcXVhbHModHlwZSkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2ZpbmQgbmFtZXNwYWNlIGZvciB0aGUgcHJlZml4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNVcmkgPSByZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShuc1ByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoSURSRUZTKW9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkLkV4dGVuc2lvbk1hcHBlci5nZXRUeXBlT2JqZWN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zVXJpLHR5cGUscmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIE5vdGUgYWxsIGF0dHJpYnV0ZXMgdGhhdCB3ZXJlIGhhbmRsZWQuIFVzZWQgdG8gZGlmZmVyIG5vcm1hbCBhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgICAgLy8gZnJvbSBhbnlBdHRyaWJ1dGVzLgotICAgICAgICAgICAgICAgIGphdmEudXRpbC5WZWN0b3IgaGFuZGxlZEF0dHJpYnV0ZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlKCFyZWFkZXIuaXNFbmRFbGVtZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50ID0gcmVhZGVyLmdldEVsZW1lbnRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0SURSRUZTKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9JRFJFRlMoY29udGVudCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIEVuZCBvZiBpZiBmb3IgZXhwZWN0ZWQgcHJvcGVydHkgc3RhcnQgZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHN0YXJ0IGVsZW1lbnQgd2UgYXJlIG5vdCBleHBlY3RpbmcgaW5kaWNhdGVzIGFuIGludmFsaWQgcGFyYW1ldGVyIHdhcyBwYXNzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIlVuZXhwZWN0ZWQgc3ViZWxlbWVudCAiICsgcmVhZGVyLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBlbmQgb2Ygd2hpbGUgbG9vcAotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLQotCi0gICAgICAgICAgICB9IGNhdGNoIChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEubGFuZy5FeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBvYmplY3Q7Ci0gICAgICAgIH0KLQotICAgICAgICB9Ly9lbmQgb2YgZmFjdG9yeSBjbGFzcwotCi0gICAgICAgIAotCi0gICAgICAgIH0KLSAgICAgICAgICAgCi0gICAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3hzZC9JbnRlZ2VyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMveHNkL0ludGVnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzgyZjNlZC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMveHNkL0ludGVnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwMyArMCwwIEBACi0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICogSW50ZWdlci5qYXZhCi0gKgotICogVGhpcyBmaWxlIHdhcyBhdXRvLWdlbmVyYXRlZCBmcm9tIFdTREwKLSAqIGJ5IHRoZSBBcGFjaGUgQXhpczIgdmVyc2lvbjogU05BUFNIT1QgIEJ1aWx0IG9uIDogRGVjIDIxLCAyMDA3ICgwNDowMzozMCBMS1QpCi0gKi8KLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy54c2Q7Ci0gICAgICAgICAgICAKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqICBJbnRlZ2VyIGJlYW4gY2xhc3MKLSAgICAgICAgICAgICovCi0gICAgICAgIAotICAgICAgICBwdWJsaWMgIGNsYXNzIEludGVnZXIKLSAgICAgICAgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkJlYW57Ci0gICAgICAgIC8qIFRoaXMgdHlwZSB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIHBpZWNlIG9mIHNjaGVtYSB0aGF0IGhhZAotICAgICAgICAgICAgICAgIG5hbWUgPSBpbnRlZ2VyCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFVSSSA9IGh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFByZWZpeCA9IG5zMQotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdlbmVyYXRlUHJlZml4KGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB7Ci0gICAgICAgICAgICBpZihuYW1lc3BhY2UuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpKXsKLSAgICAgICAgICAgICAgICByZXR1cm4gInhzZCI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgfQotCi0gICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogZmllbGQgZm9yIEludGVnZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIGphdmEubWF0aC5CaWdJbnRlZ2VyIGxvY2FsSW50ZWdlciA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgZ2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljICBqYXZhLm1hdGguQmlnSW50ZWdlciBnZXRJbnRlZ2VyKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsSW50ZWdlcjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIHNldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSBwYXJhbSBJbnRlZ2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRJbnRlZ2VyKGphdmEubWF0aC5CaWdJbnRlZ2VyIHBhcmFtKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2NhbEludGVnZXI9cGFyYW07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbEludGVnZXIudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgIC8qKgotICAgICAqIGlzUmVhZGVyTVRPTUF3YXJlCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSByZWFkZXIgc3VwcG9ydHMgTVRPTQotICAgICAqLwotICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgewotICAgICAgICBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICB0cnl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBqYXZhLmxhbmcuQm9vbGVhbi5UUlVFLmVxdWFscyhyZWFkZXIuZ2V0UHJvcGVydHkob3JnLmFwYWNoZS5heGlvbS5vbS5PTUNvbnN0YW50cy5JU19EQVRBX0hBTkRMRVJTX0FXQVJFKSk7Ci0gICAgICAgIH1jYXRjaChqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlzUmVhZGVyTVRPTUF3YXJlOwotICAgfQotICAgICAKLSAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAqCi0gICAgICAgICogQHBhcmFtIHBhcmVudFFOYW1lCi0gICAgICAgICogQHBhcmFtIGZhY3RvcnkKLSAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgcHVibGljIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IGdldE9NRWxlbWVudCAoCi0gICAgICAgICAgICAgICBmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSkgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZSBkYXRhU291cmNlID0KLSAgICAgICAgICAgICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRGF0YVNvdXJjZSh0aGlzLHBhcmVudFFOYW1lKXsKLQotICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50aGlzLnNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5sbG9tLk9NU291cmNlZEVsZW1lbnRJbXBsKAotICAgICAgICAgICAgICAgcGFyZW50UU5hbWUsZmFjdG9yeSxkYXRhU291cmNlKTsKLSAgICAgICAgICAgIAotICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcixmYWxzZSk7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNlcmlhbGl6ZVR5cGUpCi0gICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgCi0KLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gcGFyZW50UU5hbWUuZ2V0UHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZSA9IHBhcmVudFFOYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlICE9IG51bGwpICYmIChuYW1lc3BhY2UudHJpbSgpLmxlbmd0aCgpID4gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgd3JpdGVyUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdyaXRlclByZWZpeCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KG5hbWVzcGFjZSwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocHJlZml4LCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgaWYgKHNlcmlhbGl6ZVR5cGUpewotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIik7Ci0gICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2VQcmVmaXggIT0gbnVsbCkgJiYgKG5hbWVzcGFjZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlUHJlZml4KyI6aW50ZWdlciIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgImludGVnZXIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxJbnRlZ2VyPT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZSB0aGUgbmlsIGF0dHJpYnV0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oImludGVnZXIgY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxJbnRlZ2VyKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBwcmVmaXgsamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICBpZiAoeG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0KLSAgICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0KLSAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLCBqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZU5hbWVzcGFjZSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlVmFsdWU7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gYXR0cmlidXRlUHJlZml4ICsgIjoiICsgcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsIGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIC8qKgotICAgICAgICAgKiAgbWV0aG9kIHRvIGhhbmRsZSBRbmFtZXMKLSAgICAgICAgICovCi0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWUoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMocHJlZml4ICsgIjoiICsgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGkuZSB0aGlzIGlzIHRoZSBkZWZhdWx0IG5hbWVzcGFjZQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZXMoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZVtdIHFuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgaWYgKHFuYW1lcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBzdG9yZSB0aGlzIGRhdGEgdW50aWwgbGFzdCBtb21lbnQgc2luY2UgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHdyaXRlIGFueQotICAgICAgICAgICAgICAgIC8vIG5hbWVzcGFjZSBkYXRhIGFmdGVyIHdyaXRpbmcgdGhlIGNoYXJhY3RvciBkYXRhCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZ0J1ZmZlciBzdHJpbmdUb1dyaXRlID0gbmV3IGphdmEubGFuZy5TdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBxbmFtZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZCgiICIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVVSSSA9IHFuYW1lc1tpXS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHByZWZpeCA9PSBudWxsKSB8fCAocHJlZml4Lmxlbmd0aCgpID09IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQocHJlZml4KS5hcHBlbmQoIjoiKS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhzdHJpbmdUb1dyaXRlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotCi0gICAgICAgICAvKioKLSAgICAgICAgICogUmVnaXN0ZXIgYSBuYW1lc3BhY2UgcHJlZml4Ci0gICAgICAgICAqLwotICAgICAgICAgcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHJlZ2lzdGVyUHJlZml4KGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoeG1sV3JpdGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHByZWZpeDsKLSAgICAgICAgICAgIH0KLQotCi0gIAotICAgICAgICAvKioKLSAgICAgICAgKiBkYXRhYmluZGluZyBtZXRob2QgdG8gZ2V0IGFuIFhNTCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdAotICAgICAgICAqCi0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciBnZXRQdWxsUGFyc2VyKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcU5hbWUpCi0gICAgICAgICAgICAgICAgICAgIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGVsZW1lbnRMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBhdHRyaWJMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXIuRUxFTUVOVF9URVhUKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbEludGVnZXIgIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsSW50ZWdlcikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJpbnRlZ2VyIGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVySW1wbChxTmFtZSwgZWxlbWVudExpc3QudG9BcnJheSgpLCBhdHRyaWJMaXN0LnRvQXJyYXkoKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAKLQotICAgICAvKioKLSAgICAgICogIEZhY3RvcnkgY2xhc3MgdGhhdCBrZWVwcyB0aGUgcGFyc2UgbWV0aG9kCi0gICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeXsKLQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBJbnRlZ2VyIGZyb21TdHJpbmcoamF2YS5sYW5nLlN0cmluZyB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSl7Ci0gICAgICAgICAgICAgICAgICAgIEludGVnZXIgcmV0dXJuVmFsdWUgPSBuZXcgIEludGVnZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUuc2V0SW50ZWdlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb0ludGVnZXIodmFsdWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIEludGVnZXIgZnJvbVN0cmluZyhqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudC5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IGNvbnRlbnQuc3Vic3RyaW5nKDAsY29udGVudC5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVcmkgPSB4bWxTdHJlYW1SZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEludGVnZXIuRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsbmFtZXNwYWNlVXJpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEludGVnZXIuRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsIiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAKLQotICAgICAgICAvKioKLSAgICAgICAgKiBzdGF0aWMgbWV0aG9kIHRvIGNyZWF0ZSB0aGUgb2JqZWN0Ci0gICAgICAgICogUHJlY29uZGl0aW9uOiAgSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIGN1cnJlbnQgb3IgbmV4dCBzdGFydCBlbGVtZW50IHN0YXJ0cyB0aGlzIG9iamVjdCBhbmQgYW55IGludGVydmVuaW5nIHJlYWRlciBldmVudHMgYXJlIGlnbm9yYWJsZQotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIG5vdCBhbiBlbGVtZW50LCBpdCBpcyBhIGNvbXBsZXggdHlwZSBhbmQgdGhlIHJlYWRlciBpcyBhdCB0aGUgZXZlbnQganVzdCBhZnRlciB0aGUgb3V0ZXIgc3RhcnQgZWxlbWVudAotICAgICAgICAqIFBvc3Rjb25kaXRpb246IElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCBpdHMgZW5kIGVsZW1lbnQKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBhIGNvbXBsZXggdHlwZSwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IHRoZSBlbmQgZWxlbWVudCBvZiBpdHMgb3V0ZXIgZWxlbWVudAotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIEludGVnZXIgcGFyc2UoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIEludGVnZXIgb2JqZWN0ID0KLSAgICAgICAgICAgICAgICBuZXcgSW50ZWdlcigpOwotCi0gICAgICAgICAgICBpbnQgZXZlbnQ7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5pbGxhYmxlVmFsdWUgPSBudWxsOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSIiOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2V1cmkgPSIiOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSAoIXJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICYmICFyZWFkZXIuaXNFbmRFbGVtZW50KCkpCi0gICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiKSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGZ1bGxUeXBlTmFtZSA9IHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiKTsKLSAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUhPW51bGwpewotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zUHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoMCxmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IG5zUHJlZml4PT1udWxsPyIiOm5zUHJlZml4OwotCi0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgdHlwZSA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSsxKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEiaW50ZWdlciIuZXF1YWxzKHR5cGUpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9maW5kIG5hbWVzcGFjZSBmb3IgdGhlIHByZWZpeAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zVXJpID0gcmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkobnNQcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKEludGVnZXIpb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy54c2QuRXh0ZW5zaW9uTWFwcGVyLmdldFR5cGVPYmplY3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNVcmksdHlwZSxyZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gTm90ZSBhbGwgYXR0cmlidXRlcyB0aGF0IHdlcmUgaGFuZGxlZC4gVXNlZCB0byBkaWZmZXIgbm9ybWFsIGF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgICAvLyBmcm9tIGFueUF0dHJpYnV0ZXMuCi0gICAgICAgICAgICAgICAgamF2YS51dGlsLlZlY3RvciBoYW5kbGVkQXR0cmlidXRlcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUoIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQgPSByZWFkZXIuZ2V0RWxlbWVudFRleHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5zZXRJbnRlZ2VyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9JbnRlZ2VyKGNvbnRlbnQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBFbmQgb2YgaWYgZm9yIGV4cGVjdGVkIHByb3BlcnR5IHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2V7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBzdGFydCBlbGVtZW50IHdlIGFyZSBub3QgZXhwZWN0aW5nIGluZGljYXRlcyBhbiBpbnZhbGlkIHBhcmFtZXRlciB3YXMgcGFzc2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJVbmV4cGVjdGVkIHN1YmVsZW1lbnQgIiArIHJlYWRlci5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gZW5kIG9mIHdoaWxlIGxvb3AKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0KLQotICAgICAgICAgICAgfSBjYXRjaCAoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gb2JqZWN0OwotICAgICAgICB9Ci0KLSAgICAgICAgfS8vZW5kIG9mIGZhY3RvcnkgY2xhc3MKLQotICAgICAgICAKLQotICAgICAgICB9Ci0gICAgICAgICAgIAotICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy94c2QvTGFuZ3VhZ2UuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy94c2QvTGFuZ3VhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNjMzhiZi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMveHNkL0xhbmd1YWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDMgKzAsMCBAQAotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIExhbmd1YWdlLmphdmEKLSAqCi0gKiBUaGlzIGZpbGUgd2FzIGF1dG8tZ2VuZXJhdGVkIGZyb20gV1NETAotICogYnkgdGhlIEFwYWNoZSBBeGlzMiB2ZXJzaW9uOiBTTkFQU0hPVCAgQnVpbHQgb24gOiBEZWMgMjEsIDIwMDcgKDA0OjAzOjMwIExLVCkKLSAqLwotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnhzZDsKLSAgICAgICAgICAgIAotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogIExhbmd1YWdlIGJlYW4gY2xhc3MKLSAgICAgICAgICAgICovCi0gICAgICAgIAotICAgICAgICBwdWJsaWMgIGNsYXNzIExhbmd1YWdlCi0gICAgICAgIGltcGxlbWVudHMgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJCZWFuewotICAgICAgICAvKiBUaGlzIHR5cGUgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBwaWVjZSBvZiBzY2hlbWEgdGhhdCBoYWQKLSAgICAgICAgICAgICAgICBuYW1lID0gbGFuZ3VhZ2UKLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgVVJJID0gaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEKLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgUHJlZml4ID0gbnMxCi0gICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIAotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2VuZXJhdGVQcmVmaXgoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHsKLSAgICAgICAgICAgIGlmKG5hbWVzcGFjZS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikpewotICAgICAgICAgICAgICAgIHJldHVybiAieHNkIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBmaWVsZCBmb3IgTGFuZ3VhZ2UKLSAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuTGFuZ3VhZ2UgbG9jYWxMYW5ndWFnZSA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgZ2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuTGFuZ3VhZ2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuTGFuZ3VhZ2UgZ2V0TGFuZ3VhZ2UoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxMYW5ndWFnZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIHNldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSBwYXJhbSBMYW5ndWFnZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0TGFuZ3VhZ2Uob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5MYW5ndWFnZSBwYXJhbSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYWxMYW5ndWFnZT1wYXJhbTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsTGFuZ3VhZ2UudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgIC8qKgotICAgICAqIGlzUmVhZGVyTVRPTUF3YXJlCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSByZWFkZXIgc3VwcG9ydHMgTVRPTQotICAgICAqLwotICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgewotICAgICAgICBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICB0cnl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBqYXZhLmxhbmcuQm9vbGVhbi5UUlVFLmVxdWFscyhyZWFkZXIuZ2V0UHJvcGVydHkob3JnLmFwYWNoZS5heGlvbS5vbS5PTUNvbnN0YW50cy5JU19EQVRBX0hBTkRMRVJTX0FXQVJFKSk7Ci0gICAgICAgIH1jYXRjaChqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlzUmVhZGVyTVRPTUF3YXJlOwotICAgfQotICAgICAKLSAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAqCi0gICAgICAgICogQHBhcmFtIHBhcmVudFFOYW1lCi0gICAgICAgICogQHBhcmFtIGZhY3RvcnkKLSAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgcHVibGljIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IGdldE9NRWxlbWVudCAoCi0gICAgICAgICAgICAgICBmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSkgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZSBkYXRhU291cmNlID0KLSAgICAgICAgICAgICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRGF0YVNvdXJjZSh0aGlzLHBhcmVudFFOYW1lKXsKLQotICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgTGFuZ3VhZ2UudGhpcy5zZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5PTVNvdXJjZWRFbGVtZW50SW1wbCgKLSAgICAgICAgICAgICAgIHBhcmVudFFOYW1lLGZhY3RvcnksZGF0YVNvdXJjZSk7Ci0gICAgICAgICAgICAKLSAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIsZmFsc2UpOwotICAgICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzZXJpYWxpemVUeXBlKQotICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotCi0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UgPSBudWxsOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHBhcmVudFFOYW1lLmdldFByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UgPSBwYXJlbnRRTmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZSAhPSBudWxsKSAmJiAobmFtZXNwYWNlLnRyaW0oKS5sZW5ndGgoKSA+IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHdyaXRlclByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3cml0ZXJQcmVmaXggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChuYW1lc3BhY2UsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHByZWZpeCwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCksIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIGlmIChzZXJpYWxpemVUeXBlKXsKLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpOwotICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlUHJlZml4ICE9IG51bGwpICYmIChuYW1lc3BhY2VQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkpewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVByZWZpeCsiOmxhbmd1YWdlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAibGFuZ3VhZ2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxMYW5ndWFnZT09bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgdGhlIG5pbCBhdHRyaWJ1dGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJsYW5ndWFnZSBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbExhbmd1YWdlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBwcmVmaXgsamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICBpZiAoeG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0KLSAgICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0KLSAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLCBqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZU5hbWVzcGFjZSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlVmFsdWU7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gYXR0cmlidXRlUHJlZml4ICsgIjoiICsgcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsIGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIC8qKgotICAgICAgICAgKiAgbWV0aG9kIHRvIGhhbmRsZSBRbmFtZXMKLSAgICAgICAgICovCi0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWUoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMocHJlZml4ICsgIjoiICsgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGkuZSB0aGlzIGlzIHRoZSBkZWZhdWx0IG5hbWVzcGFjZQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZXMoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZVtdIHFuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgaWYgKHFuYW1lcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBzdG9yZSB0aGlzIGRhdGEgdW50aWwgbGFzdCBtb21lbnQgc2luY2UgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHdyaXRlIGFueQotICAgICAgICAgICAgICAgIC8vIG5hbWVzcGFjZSBkYXRhIGFmdGVyIHdyaXRpbmcgdGhlIGNoYXJhY3RvciBkYXRhCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZ0J1ZmZlciBzdHJpbmdUb1dyaXRlID0gbmV3IGphdmEubGFuZy5TdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBxbmFtZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZCgiICIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVVSSSA9IHFuYW1lc1tpXS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHByZWZpeCA9PSBudWxsKSB8fCAocHJlZml4Lmxlbmd0aCgpID09IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQocHJlZml4KS5hcHBlbmQoIjoiKS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhzdHJpbmdUb1dyaXRlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotCi0gICAgICAgICAvKioKLSAgICAgICAgICogUmVnaXN0ZXIgYSBuYW1lc3BhY2UgcHJlZml4Ci0gICAgICAgICAqLwotICAgICAgICAgcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHJlZ2lzdGVyUHJlZml4KGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoeG1sV3JpdGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHByZWZpeDsKLSAgICAgICAgICAgIH0KLQotCi0gIAotICAgICAgICAvKioKLSAgICAgICAgKiBkYXRhYmluZGluZyBtZXRob2QgdG8gZ2V0IGFuIFhNTCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdAotICAgICAgICAqCi0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciBnZXRQdWxsUGFyc2VyKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcU5hbWUpCi0gICAgICAgICAgICAgICAgICAgIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGVsZW1lbnRMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBhdHRyaWJMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXIuRUxFTUVOVF9URVhUKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbExhbmd1YWdlICE9IG51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbExhbmd1YWdlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oImxhbmd1YWdlIGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVySW1wbChxTmFtZSwgZWxlbWVudExpc3QudG9BcnJheSgpLCBhdHRyaWJMaXN0LnRvQXJyYXkoKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAKLQotICAgICAvKioKLSAgICAgICogIEZhY3RvcnkgY2xhc3MgdGhhdCBrZWVwcyB0aGUgcGFyc2UgbWV0aG9kCi0gICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeXsKLQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBMYW5ndWFnZSBmcm9tU3RyaW5nKGphdmEubGFuZy5TdHJpbmcgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkpewotICAgICAgICAgICAgICAgICAgICBMYW5ndWFnZSByZXR1cm5WYWx1ZSA9IG5ldyAgTGFuZ3VhZ2UoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUuc2V0TGFuZ3VhZ2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9MYW5ndWFnZSh2YWx1ZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgTGFuZ3VhZ2UgZnJvbVN0cmluZyhqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudC5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IGNvbnRlbnQuc3Vic3RyaW5nKDAsY29udGVudC5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVcmkgPSB4bWxTdHJlYW1SZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIExhbmd1YWdlLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LG5hbWVzcGFjZVVyaSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBMYW5ndWFnZS5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCwiIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIAotCi0gICAgICAgIC8qKgotICAgICAgICAqIHN0YXRpYyBtZXRob2QgdG8gY3JlYXRlIHRoZSBvYmplY3QKLSAgICAgICAgKiBQcmVjb25kaXRpb246ICBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgY3VycmVudCBvciBuZXh0IHN0YXJ0IGVsZW1lbnQgc3RhcnRzIHRoaXMgb2JqZWN0IGFuZCBhbnkgaW50ZXJ2ZW5pbmcgcmVhZGVyIGV2ZW50cyBhcmUgaWdub3JhYmxlCi0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgbm90IGFuIGVsZW1lbnQsIGl0IGlzIGEgY29tcGxleCB0eXBlIGFuZCB0aGUgcmVhZGVyIGlzIGF0IHRoZSBldmVudCBqdXN0IGFmdGVyIHRoZSBvdXRlciBzdGFydCBlbGVtZW50Ci0gICAgICAgICogUG9zdGNvbmRpdGlvbjogSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IGl0cyBlbmQgZWxlbWVudAotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIGEgY29tcGxleCB0eXBlLCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgdGhlIGVuZCBlbGVtZW50IG9mIGl0cyBvdXRlciBlbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgTGFuZ3VhZ2UgcGFyc2UoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIExhbmd1YWdlIG9iamVjdCA9Ci0gICAgICAgICAgICAgICAgbmV3IExhbmd1YWdlKCk7Ci0KLSAgICAgICAgICAgIGludCBldmVudDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmlsbGFibGVWYWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IiI7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZXVyaSA9IiI7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlICghcmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgJiYgIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkKLSAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIpIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgZnVsbFR5cGVOYW1lID0gcmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAidHlwZSIpOwotICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNQcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZygwLGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gbnNQcmVmaXg9PW51bGw/IiI6bnNQcmVmaXg7Ci0KLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB0eXBlID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZyhmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKzEpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISJsYW5ndWFnZSIuZXF1YWxzKHR5cGUpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9maW5kIG5hbWVzcGFjZSBmb3IgdGhlIHByZWZpeAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zVXJpID0gcmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkobnNQcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKExhbmd1YWdlKW9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkLkV4dGVuc2lvbk1hcHBlci5nZXRUeXBlT2JqZWN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zVXJpLHR5cGUscmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIE5vdGUgYWxsIGF0dHJpYnV0ZXMgdGhhdCB3ZXJlIGhhbmRsZWQuIFVzZWQgdG8gZGlmZmVyIG5vcm1hbCBhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgICAgLy8gZnJvbSBhbnlBdHRyaWJ1dGVzLgotICAgICAgICAgICAgICAgIGphdmEudXRpbC5WZWN0b3IgaGFuZGxlZEF0dHJpYnV0ZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlKCFyZWFkZXIuaXNFbmRFbGVtZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50ID0gcmVhZGVyLmdldEVsZW1lbnRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0TGFuZ3VhZ2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb0xhbmd1YWdlKGNvbnRlbnQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBFbmQgb2YgaWYgZm9yIGV4cGVjdGVkIHByb3BlcnR5IHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2V7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBzdGFydCBlbGVtZW50IHdlIGFyZSBub3QgZXhwZWN0aW5nIGluZGljYXRlcyBhbiBpbnZhbGlkIHBhcmFtZXRlciB3YXMgcGFzc2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJVbmV4cGVjdGVkIHN1YmVsZW1lbnQgIiArIHJlYWRlci5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gZW5kIG9mIHdoaWxlIGxvb3AKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0KLQotICAgICAgICAgICAgfSBjYXRjaCAoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gb2JqZWN0OwotICAgICAgICB9Ci0KLSAgICAgICAgfS8vZW5kIG9mIGZhY3RvcnkgY2xhc3MKLQotICAgICAgICAKLQotICAgICAgICB9Ci0gICAgICAgICAgIAotICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy94c2QvTkNOYW1lLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMveHNkL05DTmFtZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDI5ODYzLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy94c2QvTkNOYW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDMgKzAsMCBAQAotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIE5DTmFtZS5qYXZhCi0gKgotICogVGhpcyBmaWxlIHdhcyBhdXRvLWdlbmVyYXRlZCBmcm9tIFdTREwKLSAqIGJ5IHRoZSBBcGFjaGUgQXhpczIgdmVyc2lvbjogU05BUFNIT1QgIEJ1aWx0IG9uIDogRGVjIDIxLCAyMDA3ICgwNDowMzozMCBMS1QpCi0gKi8KLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy54c2Q7Ci0gICAgICAgICAgICAKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqICBOQ05hbWUgYmVhbiBjbGFzcwotICAgICAgICAgICAgKi8KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyAgY2xhc3MgTkNOYW1lCi0gICAgICAgIGltcGxlbWVudHMgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJCZWFuewotICAgICAgICAvKiBUaGlzIHR5cGUgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBwaWVjZSBvZiBzY2hlbWEgdGhhdCBoYWQKLSAgICAgICAgICAgICAgICBuYW1lID0gTkNOYW1lCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFVSSSA9IGh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFByZWZpeCA9IG5zMQotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdlbmVyYXRlUHJlZml4KGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB7Ci0gICAgICAgICAgICBpZihuYW1lc3BhY2UuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpKXsKLSAgICAgICAgICAgICAgICByZXR1cm4gInhzZCI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgfQotCi0gICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogZmllbGQgZm9yIE5DTmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5OQ05hbWUgbG9jYWxOQ05hbWUgOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIGdldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLk5DTmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5OQ05hbWUgZ2V0TkNOYW1lKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsTkNOYW1lOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgc2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtIHBhcmFtIE5DTmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0TkNOYW1lKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuTkNOYW1lIHBhcmFtKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2NhbE5DTmFtZT1wYXJhbTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsTkNOYW1lLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAvKioKLSAgICAgKiBpc1JlYWRlck1UT01Bd2FyZQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVhZGVyIHN1cHBvcnRzIE1UT00KLSAgICAgKi8KLSAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKLSAgICAgICAgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICAKLSAgICAgICAgdHJ5ewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gamF2YS5sYW5nLkJvb2xlYW4uVFJVRS5lcXVhbHMocmVhZGVyLmdldFByb3BlcnR5KG9yZy5hcGFjaGUuYXhpb20ub20uT01Db25zdGFudHMuSVNfREFUQV9IQU5ETEVSU19BV0FSRSkpOwotICAgICAgICB9Y2F0Y2goamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpc1JlYWRlck1UT01Bd2FyZTsKLSAgIH0KLSAgICAgCi0gICAgIAotICAgICAgICAvKioKLSAgICAgICAgKgotICAgICAgICAqIEBwYXJhbSBwYXJlbnRRTmFtZQotICAgICAgICAqIEBwYXJhbSBmYWN0b3J5Ci0gICAgICAgICogQHJldHVybiBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudAotICAgICAgICAqLwotICAgICAgIHB1YmxpYyBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCBnZXRPTUVsZW1lbnQgKAotICAgICAgICAgICAgICAgZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnkpIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTURhdGFTb3VyY2UgZGF0YVNvdXJjZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkRhdGFTb3VyY2UodGhpcyxwYXJlbnRRTmFtZSl7Ci0KLSAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgIE5DTmFtZS50aGlzLnNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5sbG9tLk9NU291cmNlZEVsZW1lbnRJbXBsKAotICAgICAgICAgICAgICAgcGFyZW50UU5hbWUsZmFjdG9yeSxkYXRhU291cmNlKTsKLSAgICAgICAgICAgIAotICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcixmYWxzZSk7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNlcmlhbGl6ZVR5cGUpCi0gICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgCi0KLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gcGFyZW50UU5hbWUuZ2V0UHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZSA9IHBhcmVudFFOYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlICE9IG51bGwpICYmIChuYW1lc3BhY2UudHJpbSgpLmxlbmd0aCgpID4gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgd3JpdGVyUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdyaXRlclByZWZpeCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KG5hbWVzcGFjZSwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocHJlZml4LCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgaWYgKHNlcmlhbGl6ZVR5cGUpewotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIik7Ci0gICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2VQcmVmaXggIT0gbnVsbCkgJiYgKG5hbWVzcGFjZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlUHJlZml4KyI6TkNOYW1lIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiTkNOYW1lIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsTkNOYW1lPT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZSB0aGUgbmlsIGF0dHJpYnV0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIk5DTmFtZSBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbE5DTmFtZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGggdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgcHJlZml4LGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgaWYgKHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotCi0gICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotCi0gICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSwgamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVOYW1lc3BhY2UgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgoYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVZhbHVlOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IGF0dHJpYnV0ZVByZWZpeCArICI6IiArIHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLCBhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAvKioKLSAgICAgICAgICogIG1ldGhvZCB0byBoYW5kbGUgUW5hbWVzCi0gICAgICAgICAqLwotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHByZWZpeCArICI6IiArIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBpLmUgdGhpcyBpcyB0aGUgZGVmYXVsdCBuYW1lc3BhY2UKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVzKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWVbXSBxbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgIGlmIChxbmFtZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gc3RvcmUgdGhpcyBkYXRhIHVudGlsIGxhc3QgbW9tZW50IHNpbmNlIGl0IGlzIG5vdCBwb3NzaWJsZSB0byB3cml0ZSBhbnkKLSAgICAgICAgICAgICAgICAvLyBuYW1lc3BhY2UgZGF0YSBhZnRlciB3cml0aW5nIHRoZSBjaGFyYWN0b3IgZGF0YQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmdCdWZmZXIgc3RyaW5nVG9Xcml0ZSA9IG5ldyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcW5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQoIiAiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VVUkkgPSBxbmFtZXNbaV0uZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwcmVmaXggPT0gbnVsbCkgfHwgKHByZWZpeC5sZW5ndGgoKSA9PSAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKHByZWZpeCkuYXBwZW5kKCI6IikuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMoc3RyaW5nVG9Xcml0ZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAqIFJlZ2lzdGVyIGEgbmFtZXNwYWNlIHByZWZpeAotICAgICAgICAgKi8KLSAgICAgICAgIHByaXZhdGUgamF2YS5sYW5nLlN0cmluZyByZWdpc3RlclByZWZpeChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHhtbFdyaXRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiBwcmVmaXg7Ci0gICAgICAgICAgICB9Ci0KLQotICAKLSAgICAgICAgLyoqCi0gICAgICAgICogZGF0YWJpbmRpbmcgbWV0aG9kIHRvIGdldCBhbiBYTUwgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QKLSAgICAgICAgKgotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgZ2V0UHVsbFBhcnNlcihqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFOYW1lKQotICAgICAgICAgICAgICAgICAgICB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBlbGVtZW50TGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgYXR0cmliTGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVyLkVMRU1FTlRfVEVYVCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxOQ05hbWUgIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsTkNOYW1lKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIk5DTmFtZSBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlckltcGwocU5hbWUsIGVsZW1lbnRMaXN0LnRvQXJyYXkoKSwgYXR0cmliTGlzdC50b0FycmF5KCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgCi0KLSAgICAgLyoqCi0gICAgICAqICBGYWN0b3J5IGNsYXNzIHRoYXQga2VlcHMgdGhlIHBhcnNlIG1ldGhvZAotICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3Rvcnl7Ci0KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgTkNOYW1lIGZyb21TdHJpbmcoamF2YS5sYW5nLlN0cmluZyB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSl7Ci0gICAgICAgICAgICAgICAgICAgIE5DTmFtZSByZXR1cm5WYWx1ZSA9IG5ldyAgTkNOYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlLnNldE5DTmFtZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb05DTmFtZSh2YWx1ZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgTkNOYW1lIGZyb21TdHJpbmcoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBjb250ZW50LnN1YnN0cmluZygwLGNvbnRlbnQuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVXJpID0geG1sU3RyZWFtUmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOQ05hbWUuRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsbmFtZXNwYWNlVXJpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5DTmFtZS5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCwiIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIAotCi0gICAgICAgIC8qKgotICAgICAgICAqIHN0YXRpYyBtZXRob2QgdG8gY3JlYXRlIHRoZSBvYmplY3QKLSAgICAgICAgKiBQcmVjb25kaXRpb246ICBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgY3VycmVudCBvciBuZXh0IHN0YXJ0IGVsZW1lbnQgc3RhcnRzIHRoaXMgb2JqZWN0IGFuZCBhbnkgaW50ZXJ2ZW5pbmcgcmVhZGVyIGV2ZW50cyBhcmUgaWdub3JhYmxlCi0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgbm90IGFuIGVsZW1lbnQsIGl0IGlzIGEgY29tcGxleCB0eXBlIGFuZCB0aGUgcmVhZGVyIGlzIGF0IHRoZSBldmVudCBqdXN0IGFmdGVyIHRoZSBvdXRlciBzdGFydCBlbGVtZW50Ci0gICAgICAgICogUG9zdGNvbmRpdGlvbjogSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IGl0cyBlbmQgZWxlbWVudAotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIGEgY29tcGxleCB0eXBlLCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgdGhlIGVuZCBlbGVtZW50IG9mIGl0cyBvdXRlciBlbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgTkNOYW1lIHBhcnNlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb257Ci0gICAgICAgICAgICBOQ05hbWUgb2JqZWN0ID0KLSAgICAgICAgICAgICAgICBuZXcgTkNOYW1lKCk7Ci0KLSAgICAgICAgICAgIGludCBldmVudDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmlsbGFibGVWYWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IiI7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZXVyaSA9IiI7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlICghcmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgJiYgIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkKLSAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIpIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgZnVsbFR5cGVOYW1lID0gcmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAidHlwZSIpOwotICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNQcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZygwLGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gbnNQcmVmaXg9PW51bGw/IiI6bnNQcmVmaXg7Ci0KLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB0eXBlID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZyhmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKzEpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISJOQ05hbWUiLmVxdWFscyh0eXBlKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZmluZCBuYW1lc3BhY2UgZm9yIHRoZSBwcmVmaXgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1VyaSA9IHJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKG5zUHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChOQ05hbWUpb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy54c2QuRXh0ZW5zaW9uTWFwcGVyLmdldFR5cGVPYmplY3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNVcmksdHlwZSxyZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gTm90ZSBhbGwgYXR0cmlidXRlcyB0aGF0IHdlcmUgaGFuZGxlZC4gVXNlZCB0byBkaWZmZXIgbm9ybWFsIGF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgICAvLyBmcm9tIGFueUF0dHJpYnV0ZXMuCi0gICAgICAgICAgICAgICAgamF2YS51dGlsLlZlY3RvciBoYW5kbGVkQXR0cmlidXRlcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUoIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQgPSByZWFkZXIuZ2V0RWxlbWVudFRleHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5zZXROQ05hbWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb05DTmFtZShjb250ZW50KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gRW5kIG9mIGlmIGZvciBleHBlY3RlZCBwcm9wZXJ0eSBzdGFydCBlbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgc3RhcnQgZWxlbWVudCB3ZSBhcmUgbm90IGV4cGVjdGluZyBpbmRpY2F0ZXMgYW4gaW52YWxpZCBwYXJhbWV0ZXIgd2FzIHBhc3NlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiVW5leHBlY3RlZCBzdWJlbGVtZW50ICIgKyByZWFkZXIuZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIGVuZCBvZiB3aGlsZSBsb29wCi0gICAgICAgICAgICAgICAgICAgICAgICAKLQotCi0KLSAgICAgICAgICAgIH0gY2F0Y2ggKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5sYW5nLkV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG9iamVjdDsKLSAgICAgICAgfQotCi0gICAgICAgIH0vL2VuZCBvZiBmYWN0b3J5IGNsYXNzCi0KLSAgICAgICAgCi0KLSAgICAgICAgfQotICAgICAgICAgICAKLSAgICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMveHNkL05NVE9LRU4uamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy94c2QvTk1UT0tFTi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTA1ZTRhLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy94c2QvTk1UT0tFTi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAzICswLDAgQEAKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBOTVRPS0VOLmphdmEKLSAqCi0gKiBUaGlzIGZpbGUgd2FzIGF1dG8tZ2VuZXJhdGVkIGZyb20gV1NETAotICogYnkgdGhlIEFwYWNoZSBBeGlzMiB2ZXJzaW9uOiBTTkFQU0hPVCAgQnVpbHQgb24gOiBEZWMgMjEsIDIwMDcgKDA0OjAzOjMwIExLVCkKLSAqLwotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnhzZDsKLSAgICAgICAgICAgIAotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogIE5NVE9LRU4gYmVhbiBjbGFzcwotICAgICAgICAgICAgKi8KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyAgY2xhc3MgTk1UT0tFTgotICAgICAgICBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCQmVhbnsKLSAgICAgICAgLyogVGhpcyB0eXBlIHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgcGllY2Ugb2Ygc2NoZW1hIHRoYXQgaGFkCi0gICAgICAgICAgICAgICAgbmFtZSA9IE5NVE9LRU4KLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgVVJJID0gaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEKLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgUHJlZml4ID0gbnMxCi0gICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIAotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2VuZXJhdGVQcmVmaXgoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHsKLSAgICAgICAgICAgIGlmKG5hbWVzcGFjZS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikpewotICAgICAgICAgICAgICAgIHJldHVybiAieHNkIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBmaWVsZCBmb3IgTk1UT0tFTgotICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5OTVRva2VuIGxvY2FsTk1UT0tFTiA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgZ2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuTk1Ub2tlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5OTVRva2VuIGdldE5NVE9LRU4oKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxOTVRPS0VOOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgc2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtIHBhcmFtIE5NVE9LRU4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldE5NVE9LRU4ob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5OTVRva2VuIHBhcmFtKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2NhbE5NVE9LRU49cGFyYW07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbE5NVE9LRU4udG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgIC8qKgotICAgICAqIGlzUmVhZGVyTVRPTUF3YXJlCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSByZWFkZXIgc3VwcG9ydHMgTVRPTQotICAgICAqLwotICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgewotICAgICAgICBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICB0cnl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBqYXZhLmxhbmcuQm9vbGVhbi5UUlVFLmVxdWFscyhyZWFkZXIuZ2V0UHJvcGVydHkob3JnLmFwYWNoZS5heGlvbS5vbS5PTUNvbnN0YW50cy5JU19EQVRBX0hBTkRMRVJTX0FXQVJFKSk7Ci0gICAgICAgIH1jYXRjaChqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlzUmVhZGVyTVRPTUF3YXJlOwotICAgfQotICAgICAKLSAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAqCi0gICAgICAgICogQHBhcmFtIHBhcmVudFFOYW1lCi0gICAgICAgICogQHBhcmFtIGZhY3RvcnkKLSAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgcHVibGljIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IGdldE9NRWxlbWVudCAoCi0gICAgICAgICAgICAgICBmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSkgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZSBkYXRhU291cmNlID0KLSAgICAgICAgICAgICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRGF0YVNvdXJjZSh0aGlzLHBhcmVudFFOYW1lKXsKLQotICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgTk1UT0tFTi50aGlzLnNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5sbG9tLk9NU291cmNlZEVsZW1lbnRJbXBsKAotICAgICAgICAgICAgICAgcGFyZW50UU5hbWUsZmFjdG9yeSxkYXRhU291cmNlKTsKLSAgICAgICAgICAgIAotICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcixmYWxzZSk7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNlcmlhbGl6ZVR5cGUpCi0gICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgCi0KLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gcGFyZW50UU5hbWUuZ2V0UHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZSA9IHBhcmVudFFOYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlICE9IG51bGwpICYmIChuYW1lc3BhY2UudHJpbSgpLmxlbmd0aCgpID4gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgd3JpdGVyUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdyaXRlclByZWZpeCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KG5hbWVzcGFjZSwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocHJlZml4LCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgaWYgKHNlcmlhbGl6ZVR5cGUpewotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIik7Ci0gICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2VQcmVmaXggIT0gbnVsbCkgJiYgKG5hbWVzcGFjZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlUHJlZml4KyI6Tk1UT0tFTiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5NVE9LRU4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxOTVRPS0VOPT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZSB0aGUgbmlsIGF0dHJpYnV0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIk5NVE9LRU4gY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxOTVRPS0VOKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBwcmVmaXgsamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICBpZiAoeG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0KLSAgICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0KLSAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLCBqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZU5hbWVzcGFjZSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlVmFsdWU7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gYXR0cmlidXRlUHJlZml4ICsgIjoiICsgcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsIGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIC8qKgotICAgICAgICAgKiAgbWV0aG9kIHRvIGhhbmRsZSBRbmFtZXMKLSAgICAgICAgICovCi0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWUoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMocHJlZml4ICsgIjoiICsgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGkuZSB0aGlzIGlzIHRoZSBkZWZhdWx0IG5hbWVzcGFjZQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZXMoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZVtdIHFuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgaWYgKHFuYW1lcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBzdG9yZSB0aGlzIGRhdGEgdW50aWwgbGFzdCBtb21lbnQgc2luY2UgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHdyaXRlIGFueQotICAgICAgICAgICAgICAgIC8vIG5hbWVzcGFjZSBkYXRhIGFmdGVyIHdyaXRpbmcgdGhlIGNoYXJhY3RvciBkYXRhCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZ0J1ZmZlciBzdHJpbmdUb1dyaXRlID0gbmV3IGphdmEubGFuZy5TdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBxbmFtZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZCgiICIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVVSSSA9IHFuYW1lc1tpXS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHByZWZpeCA9PSBudWxsKSB8fCAocHJlZml4Lmxlbmd0aCgpID09IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQocHJlZml4KS5hcHBlbmQoIjoiKS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhzdHJpbmdUb1dyaXRlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotCi0gICAgICAgICAvKioKLSAgICAgICAgICogUmVnaXN0ZXIgYSBuYW1lc3BhY2UgcHJlZml4Ci0gICAgICAgICAqLwotICAgICAgICAgcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHJlZ2lzdGVyUHJlZml4KGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoeG1sV3JpdGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHByZWZpeDsKLSAgICAgICAgICAgIH0KLQotCi0gIAotICAgICAgICAvKioKLSAgICAgICAgKiBkYXRhYmluZGluZyBtZXRob2QgdG8gZ2V0IGFuIFhNTCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdAotICAgICAgICAqCi0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciBnZXRQdWxsUGFyc2VyKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcU5hbWUpCi0gICAgICAgICAgICAgICAgICAgIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGVsZW1lbnRMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBhdHRyaWJMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXIuRUxFTUVOVF9URVhUKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbE5NVE9LRU4gIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsTk1UT0tFTikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJOTVRPS0VOIGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVySW1wbChxTmFtZSwgZWxlbWVudExpc3QudG9BcnJheSgpLCBhdHRyaWJMaXN0LnRvQXJyYXkoKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAKLQotICAgICAvKioKLSAgICAgICogIEZhY3RvcnkgY2xhc3MgdGhhdCBrZWVwcyB0aGUgcGFyc2UgbWV0aG9kCi0gICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeXsKLQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBOTVRPS0VOIGZyb21TdHJpbmcoamF2YS5sYW5nLlN0cmluZyB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSl7Ci0gICAgICAgICAgICAgICAgICAgIE5NVE9LRU4gcmV0dXJuVmFsdWUgPSBuZXcgIE5NVE9LRU4oKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUuc2V0Tk1UT0tFTigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb05NVE9LRU4odmFsdWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIE5NVE9LRU4gZnJvbVN0cmluZyhqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudC5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IGNvbnRlbnQuc3Vic3RyaW5nKDAsY29udGVudC5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVcmkgPSB4bWxTdHJlYW1SZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5NVE9LRU4uRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsbmFtZXNwYWNlVXJpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5NVE9LRU4uRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsIiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAKLQotICAgICAgICAvKioKLSAgICAgICAgKiBzdGF0aWMgbWV0aG9kIHRvIGNyZWF0ZSB0aGUgb2JqZWN0Ci0gICAgICAgICogUHJlY29uZGl0aW9uOiAgSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIGN1cnJlbnQgb3IgbmV4dCBzdGFydCBlbGVtZW50IHN0YXJ0cyB0aGlzIG9iamVjdCBhbmQgYW55IGludGVydmVuaW5nIHJlYWRlciBldmVudHMgYXJlIGlnbm9yYWJsZQotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIG5vdCBhbiBlbGVtZW50LCBpdCBpcyBhIGNvbXBsZXggdHlwZSBhbmQgdGhlIHJlYWRlciBpcyBhdCB0aGUgZXZlbnQganVzdCBhZnRlciB0aGUgb3V0ZXIgc3RhcnQgZWxlbWVudAotICAgICAgICAqIFBvc3Rjb25kaXRpb246IElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCBpdHMgZW5kIGVsZW1lbnQKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBhIGNvbXBsZXggdHlwZSwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IHRoZSBlbmQgZWxlbWVudCBvZiBpdHMgb3V0ZXIgZWxlbWVudAotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIE5NVE9LRU4gcGFyc2UoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIE5NVE9LRU4gb2JqZWN0ID0KLSAgICAgICAgICAgICAgICBuZXcgTk1UT0tFTigpOwotCi0gICAgICAgICAgICBpbnQgZXZlbnQ7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5pbGxhYmxlVmFsdWUgPSBudWxsOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSIiOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2V1cmkgPSIiOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSAoIXJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICYmICFyZWFkZXIuaXNFbmRFbGVtZW50KCkpCi0gICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiKSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGZ1bGxUeXBlTmFtZSA9IHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiKTsKLSAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUhPW51bGwpewotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zUHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoMCxmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IG5zUHJlZml4PT1udWxsPyIiOm5zUHJlZml4OwotCi0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgdHlwZSA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSsxKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEiTk1UT0tFTiIuZXF1YWxzKHR5cGUpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9maW5kIG5hbWVzcGFjZSBmb3IgdGhlIHByZWZpeAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zVXJpID0gcmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkobnNQcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKE5NVE9LRU4pb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy54c2QuRXh0ZW5zaW9uTWFwcGVyLmdldFR5cGVPYmplY3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNVcmksdHlwZSxyZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gTm90ZSBhbGwgYXR0cmlidXRlcyB0aGF0IHdlcmUgaGFuZGxlZC4gVXNlZCB0byBkaWZmZXIgbm9ybWFsIGF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgICAvLyBmcm9tIGFueUF0dHJpYnV0ZXMuCi0gICAgICAgICAgICAgICAgamF2YS51dGlsLlZlY3RvciBoYW5kbGVkQXR0cmlidXRlcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUoIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQgPSByZWFkZXIuZ2V0RWxlbWVudFRleHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5zZXROTVRPS0VOKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9OTVRPS0VOKGNvbnRlbnQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBFbmQgb2YgaWYgZm9yIGV4cGVjdGVkIHByb3BlcnR5IHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2V7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBzdGFydCBlbGVtZW50IHdlIGFyZSBub3QgZXhwZWN0aW5nIGluZGljYXRlcyBhbiBpbnZhbGlkIHBhcmFtZXRlciB3YXMgcGFzc2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJVbmV4cGVjdGVkIHN1YmVsZW1lbnQgIiArIHJlYWRlci5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gZW5kIG9mIHdoaWxlIGxvb3AKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0KLQotICAgICAgICAgICAgfSBjYXRjaCAoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gb2JqZWN0OwotICAgICAgICB9Ci0KLSAgICAgICAgfS8vZW5kIG9mIGZhY3RvcnkgY2xhc3MKLQotICAgICAgICAKLQotICAgICAgICB9Ci0gICAgICAgICAgIAotICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy94c2QvTk1UT0tFTlMuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy94c2QvTk1UT0tFTlMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDEyZTczMy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMveHNkL05NVE9LRU5TLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDMgKzAsMCBAQAotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIE5NVE9LRU5TLmphdmEKLSAqCi0gKiBUaGlzIGZpbGUgd2FzIGF1dG8tZ2VuZXJhdGVkIGZyb20gV1NETAotICogYnkgdGhlIEFwYWNoZSBBeGlzMiB2ZXJzaW9uOiBTTkFQU0hPVCAgQnVpbHQgb24gOiBEZWMgMjEsIDIwMDcgKDA0OjAzOjMwIExLVCkKLSAqLwotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnhzZDsKLSAgICAgICAgICAgIAotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogIE5NVE9LRU5TIGJlYW4gY2xhc3MKLSAgICAgICAgICAgICovCi0gICAgICAgIAotICAgICAgICBwdWJsaWMgIGNsYXNzIE5NVE9LRU5TCi0gICAgICAgIGltcGxlbWVudHMgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJCZWFuewotICAgICAgICAvKiBUaGlzIHR5cGUgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBwaWVjZSBvZiBzY2hlbWEgdGhhdCBoYWQKLSAgICAgICAgICAgICAgICBuYW1lID0gTk1UT0tFTlMKLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgVVJJID0gaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEKLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgUHJlZml4ID0gbnMxCi0gICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIAotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2VuZXJhdGVQcmVmaXgoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHsKLSAgICAgICAgICAgIGlmKG5hbWVzcGFjZS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikpewotICAgICAgICAgICAgICAgIHJldHVybiAieHNkIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBmaWVsZCBmb3IgTk1UT0tFTlMKLSAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuTk1Ub2tlbnMgbG9jYWxOTVRPS0VOUyA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgZ2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuTk1Ub2tlbnMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuTk1Ub2tlbnMgZ2V0Tk1UT0tFTlMoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxOTVRPS0VOUzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIHNldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSBwYXJhbSBOTVRPS0VOUwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0Tk1UT0tFTlMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5OTVRva2VucyBwYXJhbSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYWxOTVRPS0VOUz1wYXJhbTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsTk1UT0tFTlMudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgIC8qKgotICAgICAqIGlzUmVhZGVyTVRPTUF3YXJlCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSByZWFkZXIgc3VwcG9ydHMgTVRPTQotICAgICAqLwotICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgewotICAgICAgICBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICB0cnl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBqYXZhLmxhbmcuQm9vbGVhbi5UUlVFLmVxdWFscyhyZWFkZXIuZ2V0UHJvcGVydHkob3JnLmFwYWNoZS5heGlvbS5vbS5PTUNvbnN0YW50cy5JU19EQVRBX0hBTkRMRVJTX0FXQVJFKSk7Ci0gICAgICAgIH1jYXRjaChqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlzUmVhZGVyTVRPTUF3YXJlOwotICAgfQotICAgICAKLSAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAqCi0gICAgICAgICogQHBhcmFtIHBhcmVudFFOYW1lCi0gICAgICAgICogQHBhcmFtIGZhY3RvcnkKLSAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgcHVibGljIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IGdldE9NRWxlbWVudCAoCi0gICAgICAgICAgICAgICBmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSkgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZSBkYXRhU291cmNlID0KLSAgICAgICAgICAgICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRGF0YVNvdXJjZSh0aGlzLHBhcmVudFFOYW1lKXsKLQotICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgTk1UT0tFTlMudGhpcy5zZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5PTVNvdXJjZWRFbGVtZW50SW1wbCgKLSAgICAgICAgICAgICAgIHBhcmVudFFOYW1lLGZhY3RvcnksZGF0YVNvdXJjZSk7Ci0gICAgICAgICAgICAKLSAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIsZmFsc2UpOwotICAgICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzZXJpYWxpemVUeXBlKQotICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotCi0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UgPSBudWxsOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHBhcmVudFFOYW1lLmdldFByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UgPSBwYXJlbnRRTmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZSAhPSBudWxsKSAmJiAobmFtZXNwYWNlLnRyaW0oKS5sZW5ndGgoKSA+IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHdyaXRlclByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3cml0ZXJQcmVmaXggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChuYW1lc3BhY2UsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHByZWZpeCwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCksIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIGlmIChzZXJpYWxpemVUeXBlKXsKLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpOwotICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlUHJlZml4ICE9IG51bGwpICYmIChuYW1lc3BhY2VQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkpewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVByZWZpeCsiOk5NVE9LRU5TIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiTk1UT0tFTlMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxOTVRPS0VOUz09bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgdGhlIG5pbCBhdHRyaWJ1dGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJOTVRPS0VOUyBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbE5NVE9LRU5TKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBwcmVmaXgsamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICBpZiAoeG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0KLSAgICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0KLSAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLCBqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZU5hbWVzcGFjZSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlVmFsdWU7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gYXR0cmlidXRlUHJlZml4ICsgIjoiICsgcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsIGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIC8qKgotICAgICAgICAgKiAgbWV0aG9kIHRvIGhhbmRsZSBRbmFtZXMKLSAgICAgICAgICovCi0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWUoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMocHJlZml4ICsgIjoiICsgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGkuZSB0aGlzIGlzIHRoZSBkZWZhdWx0IG5hbWVzcGFjZQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZXMoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZVtdIHFuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgaWYgKHFuYW1lcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBzdG9yZSB0aGlzIGRhdGEgdW50aWwgbGFzdCBtb21lbnQgc2luY2UgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHdyaXRlIGFueQotICAgICAgICAgICAgICAgIC8vIG5hbWVzcGFjZSBkYXRhIGFmdGVyIHdyaXRpbmcgdGhlIGNoYXJhY3RvciBkYXRhCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZ0J1ZmZlciBzdHJpbmdUb1dyaXRlID0gbmV3IGphdmEubGFuZy5TdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBxbmFtZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZCgiICIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVVSSSA9IHFuYW1lc1tpXS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHByZWZpeCA9PSBudWxsKSB8fCAocHJlZml4Lmxlbmd0aCgpID09IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQocHJlZml4KS5hcHBlbmQoIjoiKS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhzdHJpbmdUb1dyaXRlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotCi0gICAgICAgICAvKioKLSAgICAgICAgICogUmVnaXN0ZXIgYSBuYW1lc3BhY2UgcHJlZml4Ci0gICAgICAgICAqLwotICAgICAgICAgcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHJlZ2lzdGVyUHJlZml4KGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoeG1sV3JpdGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHByZWZpeDsKLSAgICAgICAgICAgIH0KLQotCi0gIAotICAgICAgICAvKioKLSAgICAgICAgKiBkYXRhYmluZGluZyBtZXRob2QgdG8gZ2V0IGFuIFhNTCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdAotICAgICAgICAqCi0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciBnZXRQdWxsUGFyc2VyKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcU5hbWUpCi0gICAgICAgICAgICAgICAgICAgIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGVsZW1lbnRMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBhdHRyaWJMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXIuRUxFTUVOVF9URVhUKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbE5NVE9LRU5TICE9IG51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbE5NVE9LRU5TKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIk5NVE9LRU5TIGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVySW1wbChxTmFtZSwgZWxlbWVudExpc3QudG9BcnJheSgpLCBhdHRyaWJMaXN0LnRvQXJyYXkoKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAKLQotICAgICAvKioKLSAgICAgICogIEZhY3RvcnkgY2xhc3MgdGhhdCBrZWVwcyB0aGUgcGFyc2UgbWV0aG9kCi0gICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeXsKLQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBOTVRPS0VOUyBmcm9tU3RyaW5nKGphdmEubGFuZy5TdHJpbmcgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkpewotICAgICAgICAgICAgICAgICAgICBOTVRPS0VOUyByZXR1cm5WYWx1ZSA9IG5ldyAgTk1UT0tFTlMoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUuc2V0Tk1UT0tFTlMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9OTVRPS0VOUyh2YWx1ZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgTk1UT0tFTlMgZnJvbVN0cmluZyhqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudC5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IGNvbnRlbnQuc3Vic3RyaW5nKDAsY29udGVudC5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVcmkgPSB4bWxTdHJlYW1SZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5NVE9LRU5TLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LG5hbWVzcGFjZVVyaSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOTVRPS0VOUy5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCwiIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIAotCi0gICAgICAgIC8qKgotICAgICAgICAqIHN0YXRpYyBtZXRob2QgdG8gY3JlYXRlIHRoZSBvYmplY3QKLSAgICAgICAgKiBQcmVjb25kaXRpb246ICBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgY3VycmVudCBvciBuZXh0IHN0YXJ0IGVsZW1lbnQgc3RhcnRzIHRoaXMgb2JqZWN0IGFuZCBhbnkgaW50ZXJ2ZW5pbmcgcmVhZGVyIGV2ZW50cyBhcmUgaWdub3JhYmxlCi0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgbm90IGFuIGVsZW1lbnQsIGl0IGlzIGEgY29tcGxleCB0eXBlIGFuZCB0aGUgcmVhZGVyIGlzIGF0IHRoZSBldmVudCBqdXN0IGFmdGVyIHRoZSBvdXRlciBzdGFydCBlbGVtZW50Ci0gICAgICAgICogUG9zdGNvbmRpdGlvbjogSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IGl0cyBlbmQgZWxlbWVudAotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIGEgY29tcGxleCB0eXBlLCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgdGhlIGVuZCBlbGVtZW50IG9mIGl0cyBvdXRlciBlbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgTk1UT0tFTlMgcGFyc2UoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIE5NVE9LRU5TIG9iamVjdCA9Ci0gICAgICAgICAgICAgICAgbmV3IE5NVE9LRU5TKCk7Ci0KLSAgICAgICAgICAgIGludCBldmVudDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmlsbGFibGVWYWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IiI7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZXVyaSA9IiI7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlICghcmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgJiYgIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkKLSAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIpIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgZnVsbFR5cGVOYW1lID0gcmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAidHlwZSIpOwotICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNQcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZygwLGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gbnNQcmVmaXg9PW51bGw/IiI6bnNQcmVmaXg7Ci0KLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB0eXBlID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZyhmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKzEpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISJOTVRPS0VOUyIuZXF1YWxzKHR5cGUpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9maW5kIG5hbWVzcGFjZSBmb3IgdGhlIHByZWZpeAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zVXJpID0gcmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkobnNQcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKE5NVE9LRU5TKW9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkLkV4dGVuc2lvbk1hcHBlci5nZXRUeXBlT2JqZWN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zVXJpLHR5cGUscmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIE5vdGUgYWxsIGF0dHJpYnV0ZXMgdGhhdCB3ZXJlIGhhbmRsZWQuIFVzZWQgdG8gZGlmZmVyIG5vcm1hbCBhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgICAgLy8gZnJvbSBhbnlBdHRyaWJ1dGVzLgotICAgICAgICAgICAgICAgIGphdmEudXRpbC5WZWN0b3IgaGFuZGxlZEF0dHJpYnV0ZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlKCFyZWFkZXIuaXNFbmRFbGVtZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50ID0gcmVhZGVyLmdldEVsZW1lbnRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0Tk1UT0tFTlMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb05NVE9LRU5TKGNvbnRlbnQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBFbmQgb2YgaWYgZm9yIGV4cGVjdGVkIHByb3BlcnR5IHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2V7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBzdGFydCBlbGVtZW50IHdlIGFyZSBub3QgZXhwZWN0aW5nIGluZGljYXRlcyBhbiBpbnZhbGlkIHBhcmFtZXRlciB3YXMgcGFzc2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJVbmV4cGVjdGVkIHN1YmVsZW1lbnQgIiArIHJlYWRlci5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gZW5kIG9mIHdoaWxlIGxvb3AKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0KLQotICAgICAgICAgICAgfSBjYXRjaCAoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gb2JqZWN0OwotICAgICAgICB9Ci0KLSAgICAgICAgfS8vZW5kIG9mIGZhY3RvcnkgY2xhc3MKLQotICAgICAgICAKLQotICAgICAgICB9Ci0gICAgICAgICAgIAotICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy94c2QvTk9UQVRJT04uamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy94c2QvTk9UQVRJT04uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2QzNTE5Ni4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMveHNkL05PVEFUSU9OLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MTAgKzAsMCBAQAotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIE5PVEFUSU9OLmphdmEKLSAqCi0gKiBUaGlzIGZpbGUgd2FzIGF1dG8tZ2VuZXJhdGVkIGZyb20gV1NETAotICogYnkgdGhlIEFwYWNoZSBBeGlzMiB2ZXJzaW9uOiBTTkFQU0hPVCAgQnVpbHQgb24gOiBEZWMgMjEsIDIwMDcgKDA0OjAzOjMwIExLVCkKLSAqLwotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnhzZDsKLSAgICAgICAgICAgIAotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogIE5PVEFUSU9OIGJlYW4gY2xhc3MKLSAgICAgICAgICAgICovCi0gICAgICAgIAotICAgICAgICBwdWJsaWMgIGNsYXNzIE5PVEFUSU9OCi0gICAgICAgIGltcGxlbWVudHMgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJCZWFuewotICAgICAgICAvKiBUaGlzIHR5cGUgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBwaWVjZSBvZiBzY2hlbWEgdGhhdCBoYWQKLSAgICAgICAgICAgICAgICBuYW1lID0gTk9UQVRJT04KLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgVVJJID0gaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEKLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgUHJlZml4ID0gbnMxCi0gICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIAotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2VuZXJhdGVQcmVmaXgoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHsKLSAgICAgICAgICAgIGlmKG5hbWVzcGFjZS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikpewotICAgICAgICAgICAgICAgIHJldHVybiAieHNkIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBmaWVsZCBmb3IgUU5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgbG9jYWxRTmFtZSA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgZ2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgZ2V0UU5hbWUoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxRTmFtZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIHNldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSBwYXJhbSBRTmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0UU5hbWUoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJhbSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYWxRTmFtZT1wYXJhbTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsUU5hbWUudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgIC8qKgotICAgICAqIGlzUmVhZGVyTVRPTUF3YXJlCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSByZWFkZXIgc3VwcG9ydHMgTVRPTQotICAgICAqLwotICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgewotICAgICAgICBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICB0cnl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBqYXZhLmxhbmcuQm9vbGVhbi5UUlVFLmVxdWFscyhyZWFkZXIuZ2V0UHJvcGVydHkob3JnLmFwYWNoZS5heGlvbS5vbS5PTUNvbnN0YW50cy5JU19EQVRBX0hBTkRMRVJTX0FXQVJFKSk7Ci0gICAgICAgIH1jYXRjaChqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlzUmVhZGVyTVRPTUF3YXJlOwotICAgfQotICAgICAKLSAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAqCi0gICAgICAgICogQHBhcmFtIHBhcmVudFFOYW1lCi0gICAgICAgICogQHBhcmFtIGZhY3RvcnkKLSAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgcHVibGljIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IGdldE9NRWxlbWVudCAoCi0gICAgICAgICAgICAgICBmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSkgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZSBkYXRhU291cmNlID0KLSAgICAgICAgICAgICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRGF0YVNvdXJjZSh0aGlzLHBhcmVudFFOYW1lKXsKLQotICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgTk9UQVRJT04udGhpcy5zZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5PTVNvdXJjZWRFbGVtZW50SW1wbCgKLSAgICAgICAgICAgICAgIHBhcmVudFFOYW1lLGZhY3RvcnksZGF0YVNvdXJjZSk7Ci0gICAgICAgICAgICAKLSAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIsZmFsc2UpOwotICAgICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzZXJpYWxpemVUeXBlKQotICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotCi0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UgPSBudWxsOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHBhcmVudFFOYW1lLmdldFByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UgPSBwYXJlbnRRTmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZSAhPSBudWxsKSAmJiAobmFtZXNwYWNlLnRyaW0oKS5sZW5ndGgoKSA+IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHdyaXRlclByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3cml0ZXJQcmVmaXggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChuYW1lc3BhY2UsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHByZWZpeCwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCksIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIGlmIChzZXJpYWxpemVUeXBlKXsKLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpOwotICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlUHJlZml4ICE9IG51bGwpICYmIChuYW1lc3BhY2VQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkpewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVByZWZpeCsiOk5PVEFUSU9OIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiTk9UQVRJT04iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxRTmFtZT09bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgdGhlIG5pbCBhdHRyaWJ1dGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJRTmFtZSBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlUU5hbWUobG9jYWxRTmFtZSx4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGggdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgcHJlZml4LGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgaWYgKHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotCi0gICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotCi0gICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSwgamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVOYW1lc3BhY2UgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgoYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVZhbHVlOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IGF0dHJpYnV0ZVByZWZpeCArICI6IiArIHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLCBhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAvKioKLSAgICAgICAgICogIG1ldGhvZCB0byBoYW5kbGUgUW5hbWVzCi0gICAgICAgICAqLwotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHByZWZpeCArICI6IiArIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBpLmUgdGhpcyBpcyB0aGUgZGVmYXVsdCBuYW1lc3BhY2UKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVzKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWVbXSBxbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgIGlmIChxbmFtZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gc3RvcmUgdGhpcyBkYXRhIHVudGlsIGxhc3QgbW9tZW50IHNpbmNlIGl0IGlzIG5vdCBwb3NzaWJsZSB0byB3cml0ZSBhbnkKLSAgICAgICAgICAgICAgICAvLyBuYW1lc3BhY2UgZGF0YSBhZnRlciB3cml0aW5nIHRoZSBjaGFyYWN0b3IgZGF0YQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmdCdWZmZXIgc3RyaW5nVG9Xcml0ZSA9IG5ldyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcW5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQoIiAiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VVUkkgPSBxbmFtZXNbaV0uZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwcmVmaXggPT0gbnVsbCkgfHwgKHByZWZpeC5sZW5ndGgoKSA9PSAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKHByZWZpeCkuYXBwZW5kKCI6IikuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMoc3RyaW5nVG9Xcml0ZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAqIFJlZ2lzdGVyIGEgbmFtZXNwYWNlIHByZWZpeAotICAgICAgICAgKi8KLSAgICAgICAgIHByaXZhdGUgamF2YS5sYW5nLlN0cmluZyByZWdpc3RlclByZWZpeChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHhtbFdyaXRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiBwcmVmaXg7Ci0gICAgICAgICAgICB9Ci0KLQotICAKLSAgICAgICAgLyoqCi0gICAgICAgICogZGF0YWJpbmRpbmcgbWV0aG9kIHRvIGdldCBhbiBYTUwgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QKLSAgICAgICAgKgotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgZ2V0UHVsbFBhcnNlcihqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFOYW1lKQotICAgICAgICAgICAgICAgICAgICB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBlbGVtZW50TGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgYXR0cmliTGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVyLkVMRU1FTlRfVEVYVCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxRTmFtZSAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxRTmFtZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJRTmFtZSBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlckltcGwocU5hbWUsIGVsZW1lbnRMaXN0LnRvQXJyYXkoKSwgYXR0cmliTGlzdC50b0FycmF5KCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgCi0KLSAgICAgLyoqCi0gICAgICAqICBGYWN0b3J5IGNsYXNzIHRoYXQga2VlcHMgdGhlIHBhcnNlIG1ldGhvZAotICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3Rvcnl7Ci0KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgTk9UQVRJT04gZnJvbVN0cmluZyhqYXZhLmxhbmcuU3RyaW5nIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJKXsKLSAgICAgICAgICAgICAgICAgICAgTk9UQVRJT04gcmV0dXJuVmFsdWUgPSBuZXcgIE5PVEFUSU9OKCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlLnNldFFOYW1lKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvUU5hbWUodmFsdWUsbmFtZXNwYWNlVVJJKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBOT1RBVElPTiBmcm9tU3RyaW5nKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50LmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gY29udGVudC5zdWJzdHJpbmcoMCxjb250ZW50LmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVyaSA9IHhtbFN0cmVhbVJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk9UQVRJT04uRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsbmFtZXNwYWNlVXJpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PVEFUSU9OLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LCIiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgCi0KLSAgICAgICAgLyoqCi0gICAgICAgICogc3RhdGljIG1ldGhvZCB0byBjcmVhdGUgdGhlIG9iamVjdAotICAgICAgICAqIFByZWNvbmRpdGlvbjogIElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSBjdXJyZW50IG9yIG5leHQgc3RhcnQgZWxlbWVudCBzdGFydHMgdGhpcyBvYmplY3QgYW5kIGFueSBpbnRlcnZlbmluZyByZWFkZXIgZXZlbnRzIGFyZSBpZ25vcmFibGUKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBub3QgYW4gZWxlbWVudCwgaXQgaXMgYSBjb21wbGV4IHR5cGUgYW5kIHRoZSByZWFkZXIgaXMgYXQgdGhlIGV2ZW50IGp1c3QgYWZ0ZXIgdGhlIG91dGVyIHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgKiBQb3N0Y29uZGl0aW9uOiBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgaXRzIGVuZCBlbGVtZW50Ci0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgYSBjb21wbGV4IHR5cGUsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCB0aGUgZW5kIGVsZW1lbnQgb2YgaXRzIG91dGVyIGVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBOT1RBVElPTiBwYXJzZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uewotICAgICAgICAgICAgTk9UQVRJT04gb2JqZWN0ID0KLSAgICAgICAgICAgICAgICBuZXcgTk9UQVRJT04oKTsKLQotICAgICAgICAgICAgaW50IGV2ZW50OwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuaWxsYWJsZVZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0iIjsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNldXJpID0iIjsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUgKCFyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAmJiAhcmVhZGVyLmlzRW5kRWxlbWVudCgpKQotICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIikhPW51bGwpewotICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBmdWxsVHlwZU5hbWUgPSByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIik7Ci0gICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1ByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKDAsZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBuc1ByZWZpeD09bnVsbD8iIjpuc1ByZWZpeDsKLQotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHR5cGUgPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikrMSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIk5PVEFUSU9OIi5lcXVhbHModHlwZSkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2ZpbmQgbmFtZXNwYWNlIGZvciB0aGUgcHJlZml4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNVcmkgPSByZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShuc1ByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoTk9UQVRJT04pb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy54c2QuRXh0ZW5zaW9uTWFwcGVyLmdldFR5cGVPYmplY3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNVcmksdHlwZSxyZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gTm90ZSBhbGwgYXR0cmlidXRlcyB0aGF0IHdlcmUgaGFuZGxlZC4gVXNlZCB0byBkaWZmZXIgbm9ybWFsIGF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgICAvLyBmcm9tIGFueUF0dHJpYnV0ZXMuCi0gICAgICAgICAgICAgICAgamF2YS51dGlsLlZlY3RvciBoYW5kbGVkQXR0cmlidXRlcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUoIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQgPSByZWFkZXIuZ2V0RWxlbWVudFRleHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBjb250ZW50LmluZGV4T2YoIjoiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaW5kZXggPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGNvbnRlbnQuc3Vic3RyaW5nKDAsaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9ICIiOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNldXJpID0gcmVhZGVyLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldFFOYW1lKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvUU5hbWUoY29udGVudCxuYW1lc3BhY2V1cmkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBFbmQgb2YgaWYgZm9yIGV4cGVjdGVkIHByb3BlcnR5IHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2V7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBzdGFydCBlbGVtZW50IHdlIGFyZSBub3QgZXhwZWN0aW5nIGluZGljYXRlcyBhbiBpbnZhbGlkIHBhcmFtZXRlciB3YXMgcGFzc2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJVbmV4cGVjdGVkIHN1YmVsZW1lbnQgIiArIHJlYWRlci5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gZW5kIG9mIHdoaWxlIGxvb3AKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0KLQotICAgICAgICAgICAgfSBjYXRjaCAoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gb2JqZWN0OwotICAgICAgICB9Ci0KLSAgICAgICAgfS8vZW5kIG9mIGZhY3RvcnkgY2xhc3MKLQotICAgICAgICAKLQotICAgICAgICB9Ci0gICAgICAgICAgIAotICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy94c2QvTmFtZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3hzZC9OYW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5M2IwNTkuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3hzZC9OYW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDMgKzAsMCBAQAotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIE5hbWUuamF2YQotICoKLSAqIFRoaXMgZmlsZSB3YXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBXU0RMCi0gKiBieSB0aGUgQXBhY2hlIEF4aXMyIHZlcnNpb246IFNOQVBTSE9UICBCdWlsdCBvbiA6IERlYyAyMSwgMjAwNyAoMDQ6MDM6MzAgTEtUKQotICovCi0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBwYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkOwotICAgICAgICAgICAgCi0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiAgTmFtZSBiZWFuIGNsYXNzCi0gICAgICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgcHVibGljICBjbGFzcyBOYW1lCi0gICAgICAgIGltcGxlbWVudHMgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJCZWFuewotICAgICAgICAvKiBUaGlzIHR5cGUgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBwaWVjZSBvZiBzY2hlbWEgdGhhdCBoYWQKLSAgICAgICAgICAgICAgICBuYW1lID0gTmFtZQotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBVUkkgPSBodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYQotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBQcmVmaXggPSBuczEKLSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgCi0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZW5lcmF0ZVByZWZpeChqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICAgICAgaWYobmFtZXNwYWNlLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSl7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJ4c2QiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgIH0KLQotICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIGZpZWxkIGZvciBOYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLk5hbWUgbG9jYWxOYW1lIDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBnZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5OYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLk5hbWUgZ2V0TmFtZSgpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbE5hbWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBzZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gcGFyYW0gTmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0TmFtZShvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLk5hbWUgcGFyYW0pewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2FsTmFtZT1wYXJhbTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsTmFtZS50b1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgLyoqCi0gICAgICogaXNSZWFkZXJNVE9NQXdhcmUKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlYWRlciBzdXBwb3J0cyBNVE9NCi0gICAgICovCi0gICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIHRyeXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGphdmEubGFuZy5Cb29sZWFuLlRSVUUuZXF1YWxzKHJlYWRlci5nZXRQcm9wZXJ0eShvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQ29uc3RhbnRzLklTX0RBVEFfSEFORExFUlNfQVdBUkUpKTsKLSAgICAgICAgfWNhdGNoKGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXNSZWFkZXJNVE9NQXdhcmU7Ci0gICB9Ci0gICAgIAotICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICoKLSAgICAgICAgKiBAcGFyYW0gcGFyZW50UU5hbWUKLSAgICAgICAgKiBAcGFyYW0gZmFjdG9yeQotICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICBwdWJsaWMgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgZ2V0T01FbGVtZW50ICgKLSAgICAgICAgICAgICAgIGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5KSB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlIGRhdGFTb3VyY2UgPQotICAgICAgICAgICAgICAgICAgICAgICBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJEYXRhU291cmNlKHRoaXMscGFyZW50UU5hbWUpewotCi0gICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICBOYW1lLnRoaXMuc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmxsb20uT01Tb3VyY2VkRWxlbWVudEltcGwoCi0gICAgICAgICAgICAgICBwYXJlbnRRTmFtZSxmYWN0b3J5LGRhdGFTb3VyY2UpOwotICAgICAgICAgICAgCi0gICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyLGZhbHNlKTsKLSAgICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VyaWFsaXplVHlwZSkKLSAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLQotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBwYXJlbnRRTmFtZS5nZXRQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlID0gcGFyZW50UU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2UgIT0gbnVsbCkgJiYgKG5hbWVzcGFjZS50cmltKCkubGVuZ3RoKCkgPiAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB3cml0ZXJQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAod3JpdGVyUHJlZml4ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQobmFtZXNwYWNlLCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwcmVmaXgsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICBpZiAoc2VyaWFsaXplVHlwZSl7Ci0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKTsKLSAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZVByZWZpeCAhPSBudWxsKSAmJiAobmFtZXNwYWNlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApKXsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VQcmVmaXgrIjpOYW1lIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiTmFtZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbE5hbWU9PW51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIHRoZSBuaWwgYXR0cmlidXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiTmFtZSBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbE5hbWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRoIHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCxqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgIGlmICh4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLQotICAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsIGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlTmFtZXNwYWNlID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVWYWx1ZTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBhdHRyaWJ1dGVQcmVmaXggKyAiOiIgKyBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSwgYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICBtZXRob2QgdG8gaGFuZGxlIFFuYW1lcwotICAgICAgICAgKi8KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZShqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhwcmVmaXggKyAiOiIgKyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaS5lIHRoaXMgaXMgdGhlIGRlZmF1bHQgbmFtZXNwYWNlCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lcyhqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lW10gcW5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICBpZiAocW5hbWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHRvIHN0b3JlIHRoaXMgZGF0YSB1bnRpbCBsYXN0IG1vbWVudCBzaW5jZSBpdCBpcyBub3QgcG9zc2libGUgdG8gd3JpdGUgYW55Ci0gICAgICAgICAgICAgICAgLy8gbmFtZXNwYWNlIGRhdGEgYWZ0ZXIgd3JpdGluZyB0aGUgY2hhcmFjdG9yIGRhdGEKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIHN0cmluZ1RvV3JpdGUgPSBuZXcgamF2YS5sYW5nLlN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHFuYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKCIgIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlVVJJID0gcW5hbWVzW2ldLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocHJlZml4ID09IG51bGwpIHx8IChwcmVmaXgubGVuZ3RoKCkgPT0gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChwcmVmaXgpLmFwcGVuZCgiOiIpLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHN0cmluZ1RvV3JpdGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0KLSAgICAgICAgIC8qKgotICAgICAgICAgKiBSZWdpc3RlciBhIG5hbWVzcGFjZSBwcmVmaXgKLSAgICAgICAgICovCi0gICAgICAgICBwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgcmVnaXN0ZXJQcmVmaXgoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLCBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlICh4bWxXcml0ZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gcHJlZml4OwotICAgICAgICAgICAgfQotCi0KLSAgCi0gICAgICAgIC8qKgotICAgICAgICAqIGRhdGFiaW5kaW5nIG1ldGhvZCB0byBnZXQgYW4gWE1MIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0Ci0gICAgICAgICoKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIGdldFB1bGxQYXJzZXIoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxTmFtZSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgZWxlbWVudExpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGF0dHJpYkxpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlci5FTEVNRU5UX1RFWFQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsTmFtZSAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxOYW1lKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIk5hbWUgY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXJJbXBsKHFOYW1lLCBlbGVtZW50TGlzdC50b0FycmF5KCksIGF0dHJpYkxpc3QudG9BcnJheSgpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gIAotCi0gICAgIC8qKgotICAgICAgKiAgRmFjdG9yeSBjbGFzcyB0aGF0IGtlZXBzIHRoZSBwYXJzZSBtZXRob2QKLSAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5ewotCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIE5hbWUgZnJvbVN0cmluZyhqYXZhLmxhbmcuU3RyaW5nIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJKXsKLSAgICAgICAgICAgICAgICAgICAgTmFtZSByZXR1cm5WYWx1ZSA9IG5ldyAgTmFtZSgpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZS5zZXROYW1lKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvTmFtZSh2YWx1ZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgTmFtZSBmcm9tU3RyaW5nKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50LmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gY29udGVudC5zdWJzdHJpbmcoMCxjb250ZW50LmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVyaSA9IHhtbFN0cmVhbVJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTmFtZS5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCxuYW1lc3BhY2VVcmkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTmFtZS5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCwiIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIAotCi0gICAgICAgIC8qKgotICAgICAgICAqIHN0YXRpYyBtZXRob2QgdG8gY3JlYXRlIHRoZSBvYmplY3QKLSAgICAgICAgKiBQcmVjb25kaXRpb246ICBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgY3VycmVudCBvciBuZXh0IHN0YXJ0IGVsZW1lbnQgc3RhcnRzIHRoaXMgb2JqZWN0IGFuZCBhbnkgaW50ZXJ2ZW5pbmcgcmVhZGVyIGV2ZW50cyBhcmUgaWdub3JhYmxlCi0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgbm90IGFuIGVsZW1lbnQsIGl0IGlzIGEgY29tcGxleCB0eXBlIGFuZCB0aGUgcmVhZGVyIGlzIGF0IHRoZSBldmVudCBqdXN0IGFmdGVyIHRoZSBvdXRlciBzdGFydCBlbGVtZW50Ci0gICAgICAgICogUG9zdGNvbmRpdGlvbjogSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IGl0cyBlbmQgZWxlbWVudAotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIGEgY29tcGxleCB0eXBlLCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgdGhlIGVuZCBlbGVtZW50IG9mIGl0cyBvdXRlciBlbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgTmFtZSBwYXJzZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uewotICAgICAgICAgICAgTmFtZSBvYmplY3QgPQotICAgICAgICAgICAgICAgIG5ldyBOYW1lKCk7Ci0KLSAgICAgICAgICAgIGludCBldmVudDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmlsbGFibGVWYWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IiI7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZXVyaSA9IiI7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlICghcmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgJiYgIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkKLSAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIpIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgZnVsbFR5cGVOYW1lID0gcmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAidHlwZSIpOwotICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNQcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZygwLGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gbnNQcmVmaXg9PW51bGw/IiI6bnNQcmVmaXg7Ci0KLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB0eXBlID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZyhmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKzEpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISJOYW1lIi5lcXVhbHModHlwZSkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2ZpbmQgbmFtZXNwYWNlIGZvciB0aGUgcHJlZml4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNVcmkgPSByZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShuc1ByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoTmFtZSlvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnhzZC5FeHRlbnNpb25NYXBwZXIuZ2V0VHlwZU9iamVjdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc1VyaSx0eXBlLHJlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBOb3RlIGFsbCBhdHRyaWJ1dGVzIHRoYXQgd2VyZSBoYW5kbGVkLiBVc2VkIHRvIGRpZmZlciBub3JtYWwgYXR0cmlidXRlcwotICAgICAgICAgICAgICAgIC8vIGZyb20gYW55QXR0cmlidXRlcy4KLSAgICAgICAgICAgICAgICBqYXZhLnV0aWwuVmVjdG9yIGhhbmRsZWRBdHRyaWJ1dGVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSghcmVhZGVyLmlzRW5kRWxlbWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCA9IHJlYWRlci5nZXRFbGVtZW50VGV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldE5hbWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb05hbWUoY29udGVudCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIEVuZCBvZiBpZiBmb3IgZXhwZWN0ZWQgcHJvcGVydHkgc3RhcnQgZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHN0YXJ0IGVsZW1lbnQgd2UgYXJlIG5vdCBleHBlY3RpbmcgaW5kaWNhdGVzIGFuIGludmFsaWQgcGFyYW1ldGVyIHdhcyBwYXNzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIlVuZXhwZWN0ZWQgc3ViZWxlbWVudCAiICsgcmVhZGVyLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBlbmQgb2Ygd2hpbGUgbG9vcAotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLQotCi0gICAgICAgICAgICB9IGNhdGNoIChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEubGFuZy5FeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBvYmplY3Q7Ci0gICAgICAgIH0KLQotICAgICAgICB9Ly9lbmQgb2YgZmFjdG9yeSBjbGFzcwotCi0gICAgICAgIAotCi0gICAgICAgIH0KLSAgICAgICAgICAgCi0gICAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3hzZC9OZWdhdGl2ZUludGVnZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy94c2QvTmVnYXRpdmVJbnRlZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2ZDNhMWMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3hzZC9OZWdhdGl2ZUludGVnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwMyArMCwwIEBACi0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICogTmVnYXRpdmVJbnRlZ2VyLmphdmEKLSAqCi0gKiBUaGlzIGZpbGUgd2FzIGF1dG8tZ2VuZXJhdGVkIGZyb20gV1NETAotICogYnkgdGhlIEFwYWNoZSBBeGlzMiB2ZXJzaW9uOiBTTkFQU0hPVCAgQnVpbHQgb24gOiBEZWMgMjEsIDIwMDcgKDA0OjAzOjMwIExLVCkKLSAqLwotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnhzZDsKLSAgICAgICAgICAgIAotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogIE5lZ2F0aXZlSW50ZWdlciBiZWFuIGNsYXNzCi0gICAgICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgcHVibGljICBjbGFzcyBOZWdhdGl2ZUludGVnZXIKLSAgICAgICAgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkJlYW57Ci0gICAgICAgIC8qIFRoaXMgdHlwZSB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIHBpZWNlIG9mIHNjaGVtYSB0aGF0IGhhZAotICAgICAgICAgICAgICAgIG5hbWUgPSBuZWdhdGl2ZUludGVnZXIKLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgVVJJID0gaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEKLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgUHJlZml4ID0gbnMxCi0gICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIAotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2VuZXJhdGVQcmVmaXgoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHsKLSAgICAgICAgICAgIGlmKG5hbWVzcGFjZS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikpewotICAgICAgICAgICAgICAgIHJldHVybiAieHNkIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBmaWVsZCBmb3IgTmVnYXRpdmVJbnRlZ2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLk5lZ2F0aXZlSW50ZWdlciBsb2NhbE5lZ2F0aXZlSW50ZWdlciA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgZ2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuTmVnYXRpdmVJbnRlZ2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLk5lZ2F0aXZlSW50ZWdlciBnZXROZWdhdGl2ZUludGVnZXIoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxOZWdhdGl2ZUludGVnZXI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBzZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gcGFyYW0gTmVnYXRpdmVJbnRlZ2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXROZWdhdGl2ZUludGVnZXIob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5OZWdhdGl2ZUludGVnZXIgcGFyYW0pewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2FsTmVnYXRpdmVJbnRlZ2VyPXBhcmFtOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxOZWdhdGl2ZUludGVnZXIudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgIC8qKgotICAgICAqIGlzUmVhZGVyTVRPTUF3YXJlCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSByZWFkZXIgc3VwcG9ydHMgTVRPTQotICAgICAqLwotICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgewotICAgICAgICBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICB0cnl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBqYXZhLmxhbmcuQm9vbGVhbi5UUlVFLmVxdWFscyhyZWFkZXIuZ2V0UHJvcGVydHkob3JnLmFwYWNoZS5heGlvbS5vbS5PTUNvbnN0YW50cy5JU19EQVRBX0hBTkRMRVJTX0FXQVJFKSk7Ci0gICAgICAgIH1jYXRjaChqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlzUmVhZGVyTVRPTUF3YXJlOwotICAgfQotICAgICAKLSAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAqCi0gICAgICAgICogQHBhcmFtIHBhcmVudFFOYW1lCi0gICAgICAgICogQHBhcmFtIGZhY3RvcnkKLSAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgcHVibGljIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IGdldE9NRWxlbWVudCAoCi0gICAgICAgICAgICAgICBmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSkgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZSBkYXRhU291cmNlID0KLSAgICAgICAgICAgICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRGF0YVNvdXJjZSh0aGlzLHBhcmVudFFOYW1lKXsKLQotICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgTmVnYXRpdmVJbnRlZ2VyLnRoaXMuc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmxsb20uT01Tb3VyY2VkRWxlbWVudEltcGwoCi0gICAgICAgICAgICAgICBwYXJlbnRRTmFtZSxmYWN0b3J5LGRhdGFTb3VyY2UpOwotICAgICAgICAgICAgCi0gICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyLGZhbHNlKTsKLSAgICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VyaWFsaXplVHlwZSkKLSAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLQotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBwYXJlbnRRTmFtZS5nZXRQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlID0gcGFyZW50UU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2UgIT0gbnVsbCkgJiYgKG5hbWVzcGFjZS50cmltKCkubGVuZ3RoKCkgPiAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB3cml0ZXJQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAod3JpdGVyUHJlZml4ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQobmFtZXNwYWNlLCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwcmVmaXgsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICBpZiAoc2VyaWFsaXplVHlwZSl7Ci0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKTsKLSAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZVByZWZpeCAhPSBudWxsKSAmJiAobmFtZXNwYWNlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApKXsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VQcmVmaXgrIjpuZWdhdGl2ZUludGVnZXIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJuZWdhdGl2ZUludGVnZXIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxOZWdhdGl2ZUludGVnZXI9PW51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIHRoZSBuaWwgYXR0cmlidXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigibmVnYXRpdmVJbnRlZ2VyIGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsTmVnYXRpdmVJbnRlZ2VyKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBwcmVmaXgsamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICBpZiAoeG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0KLSAgICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0KLSAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLCBqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZU5hbWVzcGFjZSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlVmFsdWU7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gYXR0cmlidXRlUHJlZml4ICsgIjoiICsgcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsIGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIC8qKgotICAgICAgICAgKiAgbWV0aG9kIHRvIGhhbmRsZSBRbmFtZXMKLSAgICAgICAgICovCi0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWUoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMocHJlZml4ICsgIjoiICsgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGkuZSB0aGlzIGlzIHRoZSBkZWZhdWx0IG5hbWVzcGFjZQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZXMoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZVtdIHFuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgaWYgKHFuYW1lcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBzdG9yZSB0aGlzIGRhdGEgdW50aWwgbGFzdCBtb21lbnQgc2luY2UgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHdyaXRlIGFueQotICAgICAgICAgICAgICAgIC8vIG5hbWVzcGFjZSBkYXRhIGFmdGVyIHdyaXRpbmcgdGhlIGNoYXJhY3RvciBkYXRhCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZ0J1ZmZlciBzdHJpbmdUb1dyaXRlID0gbmV3IGphdmEubGFuZy5TdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBxbmFtZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZCgiICIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVVSSSA9IHFuYW1lc1tpXS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHByZWZpeCA9PSBudWxsKSB8fCAocHJlZml4Lmxlbmd0aCgpID09IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQocHJlZml4KS5hcHBlbmQoIjoiKS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhzdHJpbmdUb1dyaXRlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotCi0gICAgICAgICAvKioKLSAgICAgICAgICogUmVnaXN0ZXIgYSBuYW1lc3BhY2UgcHJlZml4Ci0gICAgICAgICAqLwotICAgICAgICAgcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHJlZ2lzdGVyUHJlZml4KGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoeG1sV3JpdGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHByZWZpeDsKLSAgICAgICAgICAgIH0KLQotCi0gIAotICAgICAgICAvKioKLSAgICAgICAgKiBkYXRhYmluZGluZyBtZXRob2QgdG8gZ2V0IGFuIFhNTCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdAotICAgICAgICAqCi0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciBnZXRQdWxsUGFyc2VyKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcU5hbWUpCi0gICAgICAgICAgICAgICAgICAgIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGVsZW1lbnRMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBhdHRyaWJMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXIuRUxFTUVOVF9URVhUKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbE5lZ2F0aXZlSW50ZWdlciAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxOZWdhdGl2ZUludGVnZXIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigibmVnYXRpdmVJbnRlZ2VyIGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVySW1wbChxTmFtZSwgZWxlbWVudExpc3QudG9BcnJheSgpLCBhdHRyaWJMaXN0LnRvQXJyYXkoKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAKLQotICAgICAvKioKLSAgICAgICogIEZhY3RvcnkgY2xhc3MgdGhhdCBrZWVwcyB0aGUgcGFyc2UgbWV0aG9kCi0gICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeXsKLQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBOZWdhdGl2ZUludGVnZXIgZnJvbVN0cmluZyhqYXZhLmxhbmcuU3RyaW5nIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJKXsKLSAgICAgICAgICAgICAgICAgICAgTmVnYXRpdmVJbnRlZ2VyIHJldHVyblZhbHVlID0gbmV3ICBOZWdhdGl2ZUludGVnZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUuc2V0TmVnYXRpdmVJbnRlZ2VyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvTmVnYXRpdmVJbnRlZ2VyKHZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBOZWdhdGl2ZUludGVnZXIgZnJvbVN0cmluZyhqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudC5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IGNvbnRlbnQuc3Vic3RyaW5nKDAsY29udGVudC5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVcmkgPSB4bWxTdHJlYW1SZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5lZ2F0aXZlSW50ZWdlci5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCxuYW1lc3BhY2VVcmkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTmVnYXRpdmVJbnRlZ2VyLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LCIiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgCi0KLSAgICAgICAgLyoqCi0gICAgICAgICogc3RhdGljIG1ldGhvZCB0byBjcmVhdGUgdGhlIG9iamVjdAotICAgICAgICAqIFByZWNvbmRpdGlvbjogIElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSBjdXJyZW50IG9yIG5leHQgc3RhcnQgZWxlbWVudCBzdGFydHMgdGhpcyBvYmplY3QgYW5kIGFueSBpbnRlcnZlbmluZyByZWFkZXIgZXZlbnRzIGFyZSBpZ25vcmFibGUKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBub3QgYW4gZWxlbWVudCwgaXQgaXMgYSBjb21wbGV4IHR5cGUgYW5kIHRoZSByZWFkZXIgaXMgYXQgdGhlIGV2ZW50IGp1c3QgYWZ0ZXIgdGhlIG91dGVyIHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgKiBQb3N0Y29uZGl0aW9uOiBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgaXRzIGVuZCBlbGVtZW50Ci0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgYSBjb21wbGV4IHR5cGUsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCB0aGUgZW5kIGVsZW1lbnQgb2YgaXRzIG91dGVyIGVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBOZWdhdGl2ZUludGVnZXIgcGFyc2UoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIE5lZ2F0aXZlSW50ZWdlciBvYmplY3QgPQotICAgICAgICAgICAgICAgIG5ldyBOZWdhdGl2ZUludGVnZXIoKTsKLQotICAgICAgICAgICAgaW50IGV2ZW50OwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuaWxsYWJsZVZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0iIjsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNldXJpID0iIjsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUgKCFyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAmJiAhcmVhZGVyLmlzRW5kRWxlbWVudCgpKQotICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIikhPW51bGwpewotICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBmdWxsVHlwZU5hbWUgPSByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIik7Ci0gICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1ByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKDAsZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBuc1ByZWZpeD09bnVsbD8iIjpuc1ByZWZpeDsKLQotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHR5cGUgPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikrMSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIm5lZ2F0aXZlSW50ZWdlciIuZXF1YWxzKHR5cGUpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9maW5kIG5hbWVzcGFjZSBmb3IgdGhlIHByZWZpeAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zVXJpID0gcmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkobnNQcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKE5lZ2F0aXZlSW50ZWdlcilvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnhzZC5FeHRlbnNpb25NYXBwZXIuZ2V0VHlwZU9iamVjdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc1VyaSx0eXBlLHJlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBOb3RlIGFsbCBhdHRyaWJ1dGVzIHRoYXQgd2VyZSBoYW5kbGVkLiBVc2VkIHRvIGRpZmZlciBub3JtYWwgYXR0cmlidXRlcwotICAgICAgICAgICAgICAgIC8vIGZyb20gYW55QXR0cmlidXRlcy4KLSAgICAgICAgICAgICAgICBqYXZhLnV0aWwuVmVjdG9yIGhhbmRsZWRBdHRyaWJ1dGVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSghcmVhZGVyLmlzRW5kRWxlbWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCA9IHJlYWRlci5nZXRFbGVtZW50VGV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldE5lZ2F0aXZlSW50ZWdlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvTmVnYXRpdmVJbnRlZ2VyKGNvbnRlbnQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBFbmQgb2YgaWYgZm9yIGV4cGVjdGVkIHByb3BlcnR5IHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2V7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBzdGFydCBlbGVtZW50IHdlIGFyZSBub3QgZXhwZWN0aW5nIGluZGljYXRlcyBhbiBpbnZhbGlkIHBhcmFtZXRlciB3YXMgcGFzc2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJVbmV4cGVjdGVkIHN1YmVsZW1lbnQgIiArIHJlYWRlci5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gZW5kIG9mIHdoaWxlIGxvb3AKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0KLQotICAgICAgICAgICAgfSBjYXRjaCAoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gb2JqZWN0OwotICAgICAgICB9Ci0KLSAgICAgICAgfS8vZW5kIG9mIGZhY3RvcnkgY2xhc3MKLQotICAgICAgICAKLQotICAgICAgICB9Ci0gICAgICAgICAgIAotICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy94c2QvTm9uTmVnYXRpdmVJbnRlZ2VyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMveHNkL05vbk5lZ2F0aXZlSW50ZWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNmIwNWFlLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy94c2QvTm9uTmVnYXRpdmVJbnRlZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDMgKzAsMCBAQAotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIE5vbk5lZ2F0aXZlSW50ZWdlci5qYXZhCi0gKgotICogVGhpcyBmaWxlIHdhcyBhdXRvLWdlbmVyYXRlZCBmcm9tIFdTREwKLSAqIGJ5IHRoZSBBcGFjaGUgQXhpczIgdmVyc2lvbjogU05BUFNIT1QgIEJ1aWx0IG9uIDogRGVjIDIxLCAyMDA3ICgwNDowMzozMCBMS1QpCi0gKi8KLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy54c2Q7Ci0gICAgICAgICAgICAKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqICBOb25OZWdhdGl2ZUludGVnZXIgYmVhbiBjbGFzcwotICAgICAgICAgICAgKi8KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyAgY2xhc3MgTm9uTmVnYXRpdmVJbnRlZ2VyCi0gICAgICAgIGltcGxlbWVudHMgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJCZWFuewotICAgICAgICAvKiBUaGlzIHR5cGUgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBwaWVjZSBvZiBzY2hlbWEgdGhhdCBoYWQKLSAgICAgICAgICAgICAgICBuYW1lID0gbm9uTmVnYXRpdmVJbnRlZ2VyCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFVSSSA9IGh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFByZWZpeCA9IG5zMQotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdlbmVyYXRlUHJlZml4KGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB7Ci0gICAgICAgICAgICBpZihuYW1lc3BhY2UuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpKXsKLSAgICAgICAgICAgICAgICByZXR1cm4gInhzZCI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgfQotCi0gICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogZmllbGQgZm9yIE5vbk5lZ2F0aXZlSW50ZWdlcgotICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5Ob25OZWdhdGl2ZUludGVnZXIgbG9jYWxOb25OZWdhdGl2ZUludGVnZXIgOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIGdldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLk5vbk5lZ2F0aXZlSW50ZWdlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5Ob25OZWdhdGl2ZUludGVnZXIgZ2V0Tm9uTmVnYXRpdmVJbnRlZ2VyKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsTm9uTmVnYXRpdmVJbnRlZ2VyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgc2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtIHBhcmFtIE5vbk5lZ2F0aXZlSW50ZWdlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0Tm9uTmVnYXRpdmVJbnRlZ2VyKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuTm9uTmVnYXRpdmVJbnRlZ2VyIHBhcmFtKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2NhbE5vbk5lZ2F0aXZlSW50ZWdlcj1wYXJhbTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsTm9uTmVnYXRpdmVJbnRlZ2VyLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAvKioKLSAgICAgKiBpc1JlYWRlck1UT01Bd2FyZQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVhZGVyIHN1cHBvcnRzIE1UT00KLSAgICAgKi8KLSAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKLSAgICAgICAgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICAKLSAgICAgICAgdHJ5ewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gamF2YS5sYW5nLkJvb2xlYW4uVFJVRS5lcXVhbHMocmVhZGVyLmdldFByb3BlcnR5KG9yZy5hcGFjaGUuYXhpb20ub20uT01Db25zdGFudHMuSVNfREFUQV9IQU5ETEVSU19BV0FSRSkpOwotICAgICAgICB9Y2F0Y2goamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpc1JlYWRlck1UT01Bd2FyZTsKLSAgIH0KLSAgICAgCi0gICAgIAotICAgICAgICAvKioKLSAgICAgICAgKgotICAgICAgICAqIEBwYXJhbSBwYXJlbnRRTmFtZQotICAgICAgICAqIEBwYXJhbSBmYWN0b3J5Ci0gICAgICAgICogQHJldHVybiBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudAotICAgICAgICAqLwotICAgICAgIHB1YmxpYyBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCBnZXRPTUVsZW1lbnQgKAotICAgICAgICAgICAgICAgZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnkpIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTURhdGFTb3VyY2UgZGF0YVNvdXJjZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkRhdGFTb3VyY2UodGhpcyxwYXJlbnRRTmFtZSl7Ci0KLSAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgIE5vbk5lZ2F0aXZlSW50ZWdlci50aGlzLnNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5sbG9tLk9NU291cmNlZEVsZW1lbnRJbXBsKAotICAgICAgICAgICAgICAgcGFyZW50UU5hbWUsZmFjdG9yeSxkYXRhU291cmNlKTsKLSAgICAgICAgICAgIAotICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcixmYWxzZSk7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNlcmlhbGl6ZVR5cGUpCi0gICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgCi0KLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gcGFyZW50UU5hbWUuZ2V0UHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZSA9IHBhcmVudFFOYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlICE9IG51bGwpICYmIChuYW1lc3BhY2UudHJpbSgpLmxlbmd0aCgpID4gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgd3JpdGVyUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdyaXRlclByZWZpeCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KG5hbWVzcGFjZSwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocHJlZml4LCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgaWYgKHNlcmlhbGl6ZVR5cGUpewotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIik7Ci0gICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2VQcmVmaXggIT0gbnVsbCkgJiYgKG5hbWVzcGFjZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlUHJlZml4KyI6bm9uTmVnYXRpdmVJbnRlZ2VyIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAibm9uTmVnYXRpdmVJbnRlZ2VyIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsTm9uTmVnYXRpdmVJbnRlZ2VyPT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZSB0aGUgbmlsIGF0dHJpYnV0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIm5vbk5lZ2F0aXZlSW50ZWdlciBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbE5vbk5lZ2F0aXZlSW50ZWdlcikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGggdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgcHJlZml4LGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgaWYgKHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotCi0gICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotCi0gICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSwgamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVOYW1lc3BhY2UgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgoYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVZhbHVlOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IGF0dHJpYnV0ZVByZWZpeCArICI6IiArIHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLCBhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAvKioKLSAgICAgICAgICogIG1ldGhvZCB0byBoYW5kbGUgUW5hbWVzCi0gICAgICAgICAqLwotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHByZWZpeCArICI6IiArIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBpLmUgdGhpcyBpcyB0aGUgZGVmYXVsdCBuYW1lc3BhY2UKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVzKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWVbXSBxbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgIGlmIChxbmFtZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gc3RvcmUgdGhpcyBkYXRhIHVudGlsIGxhc3QgbW9tZW50IHNpbmNlIGl0IGlzIG5vdCBwb3NzaWJsZSB0byB3cml0ZSBhbnkKLSAgICAgICAgICAgICAgICAvLyBuYW1lc3BhY2UgZGF0YSBhZnRlciB3cml0aW5nIHRoZSBjaGFyYWN0b3IgZGF0YQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmdCdWZmZXIgc3RyaW5nVG9Xcml0ZSA9IG5ldyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcW5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQoIiAiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VVUkkgPSBxbmFtZXNbaV0uZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwcmVmaXggPT0gbnVsbCkgfHwgKHByZWZpeC5sZW5ndGgoKSA9PSAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKHByZWZpeCkuYXBwZW5kKCI6IikuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMoc3RyaW5nVG9Xcml0ZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAqIFJlZ2lzdGVyIGEgbmFtZXNwYWNlIHByZWZpeAotICAgICAgICAgKi8KLSAgICAgICAgIHByaXZhdGUgamF2YS5sYW5nLlN0cmluZyByZWdpc3RlclByZWZpeChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHhtbFdyaXRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiBwcmVmaXg7Ci0gICAgICAgICAgICB9Ci0KLQotICAKLSAgICAgICAgLyoqCi0gICAgICAgICogZGF0YWJpbmRpbmcgbWV0aG9kIHRvIGdldCBhbiBYTUwgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QKLSAgICAgICAgKgotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgZ2V0UHVsbFBhcnNlcihqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFOYW1lKQotICAgICAgICAgICAgICAgICAgICB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBlbGVtZW50TGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgYXR0cmliTGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVyLkVMRU1FTlRfVEVYVCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxOb25OZWdhdGl2ZUludGVnZXIgIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsTm9uTmVnYXRpdmVJbnRlZ2VyKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIm5vbk5lZ2F0aXZlSW50ZWdlciBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlckltcGwocU5hbWUsIGVsZW1lbnRMaXN0LnRvQXJyYXkoKSwgYXR0cmliTGlzdC50b0FycmF5KCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgCi0KLSAgICAgLyoqCi0gICAgICAqICBGYWN0b3J5IGNsYXNzIHRoYXQga2VlcHMgdGhlIHBhcnNlIG1ldGhvZAotICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3Rvcnl7Ci0KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgTm9uTmVnYXRpdmVJbnRlZ2VyIGZyb21TdHJpbmcoamF2YS5sYW5nLlN0cmluZyB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSl7Ci0gICAgICAgICAgICAgICAgICAgIE5vbk5lZ2F0aXZlSW50ZWdlciByZXR1cm5WYWx1ZSA9IG5ldyAgTm9uTmVnYXRpdmVJbnRlZ2VyKCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlLnNldE5vbk5lZ2F0aXZlSW50ZWdlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb05vbk5lZ2F0aXZlSW50ZWdlcih2YWx1ZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgTm9uTmVnYXRpdmVJbnRlZ2VyIGZyb21TdHJpbmcoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBjb250ZW50LnN1YnN0cmluZygwLGNvbnRlbnQuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVXJpID0geG1sU3RyZWFtUmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOb25OZWdhdGl2ZUludGVnZXIuRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsbmFtZXNwYWNlVXJpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5vbk5lZ2F0aXZlSW50ZWdlci5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCwiIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIAotCi0gICAgICAgIC8qKgotICAgICAgICAqIHN0YXRpYyBtZXRob2QgdG8gY3JlYXRlIHRoZSBvYmplY3QKLSAgICAgICAgKiBQcmVjb25kaXRpb246ICBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgY3VycmVudCBvciBuZXh0IHN0YXJ0IGVsZW1lbnQgc3RhcnRzIHRoaXMgb2JqZWN0IGFuZCBhbnkgaW50ZXJ2ZW5pbmcgcmVhZGVyIGV2ZW50cyBhcmUgaWdub3JhYmxlCi0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgbm90IGFuIGVsZW1lbnQsIGl0IGlzIGEgY29tcGxleCB0eXBlIGFuZCB0aGUgcmVhZGVyIGlzIGF0IHRoZSBldmVudCBqdXN0IGFmdGVyIHRoZSBvdXRlciBzdGFydCBlbGVtZW50Ci0gICAgICAgICogUG9zdGNvbmRpdGlvbjogSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IGl0cyBlbmQgZWxlbWVudAotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIGEgY29tcGxleCB0eXBlLCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgdGhlIGVuZCBlbGVtZW50IG9mIGl0cyBvdXRlciBlbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgTm9uTmVnYXRpdmVJbnRlZ2VyIHBhcnNlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb257Ci0gICAgICAgICAgICBOb25OZWdhdGl2ZUludGVnZXIgb2JqZWN0ID0KLSAgICAgICAgICAgICAgICBuZXcgTm9uTmVnYXRpdmVJbnRlZ2VyKCk7Ci0KLSAgICAgICAgICAgIGludCBldmVudDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmlsbGFibGVWYWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IiI7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZXVyaSA9IiI7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlICghcmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgJiYgIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkKLSAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIpIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgZnVsbFR5cGVOYW1lID0gcmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAidHlwZSIpOwotICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNQcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZygwLGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gbnNQcmVmaXg9PW51bGw/IiI6bnNQcmVmaXg7Ci0KLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB0eXBlID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZyhmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKzEpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISJub25OZWdhdGl2ZUludGVnZXIiLmVxdWFscyh0eXBlKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZmluZCBuYW1lc3BhY2UgZm9yIHRoZSBwcmVmaXgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1VyaSA9IHJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKG5zUHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChOb25OZWdhdGl2ZUludGVnZXIpb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy54c2QuRXh0ZW5zaW9uTWFwcGVyLmdldFR5cGVPYmplY3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNVcmksdHlwZSxyZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gTm90ZSBhbGwgYXR0cmlidXRlcyB0aGF0IHdlcmUgaGFuZGxlZC4gVXNlZCB0byBkaWZmZXIgbm9ybWFsIGF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgICAvLyBmcm9tIGFueUF0dHJpYnV0ZXMuCi0gICAgICAgICAgICAgICAgamF2YS51dGlsLlZlY3RvciBoYW5kbGVkQXR0cmlidXRlcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUoIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQgPSByZWFkZXIuZ2V0RWxlbWVudFRleHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5zZXROb25OZWdhdGl2ZUludGVnZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb05vbk5lZ2F0aXZlSW50ZWdlcihjb250ZW50KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gRW5kIG9mIGlmIGZvciBleHBlY3RlZCBwcm9wZXJ0eSBzdGFydCBlbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgc3RhcnQgZWxlbWVudCB3ZSBhcmUgbm90IGV4cGVjdGluZyBpbmRpY2F0ZXMgYW4gaW52YWxpZCBwYXJhbWV0ZXIgd2FzIHBhc3NlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiVW5leHBlY3RlZCBzdWJlbGVtZW50ICIgKyByZWFkZXIuZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIGVuZCBvZiB3aGlsZSBsb29wCi0gICAgICAgICAgICAgICAgICAgICAgICAKLQotCi0KLSAgICAgICAgICAgIH0gY2F0Y2ggKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5sYW5nLkV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG9iamVjdDsKLSAgICAgICAgfQotCi0gICAgICAgIH0vL2VuZCBvZiBmYWN0b3J5IGNsYXNzCi0KLSAgICAgICAgCi0KLSAgICAgICAgfQotICAgICAgICAgICAKLSAgICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMveHNkL05vblBvc2l0aXZlSW50ZWdlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3hzZC9Ob25Qb3NpdGl2ZUludGVnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzEzNmJlYi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMveHNkL05vblBvc2l0aXZlSW50ZWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAzICswLDAgQEAKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBOb25Qb3NpdGl2ZUludGVnZXIuamF2YQotICoKLSAqIFRoaXMgZmlsZSB3YXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBXU0RMCi0gKiBieSB0aGUgQXBhY2hlIEF4aXMyIHZlcnNpb246IFNOQVBTSE9UICBCdWlsdCBvbiA6IERlYyAyMSwgMjAwNyAoMDQ6MDM6MzAgTEtUKQotICovCi0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBwYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkOwotICAgICAgICAgICAgCi0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiAgTm9uUG9zaXRpdmVJbnRlZ2VyIGJlYW4gY2xhc3MKLSAgICAgICAgICAgICovCi0gICAgICAgIAotICAgICAgICBwdWJsaWMgIGNsYXNzIE5vblBvc2l0aXZlSW50ZWdlcgotICAgICAgICBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCQmVhbnsKLSAgICAgICAgLyogVGhpcyB0eXBlIHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgcGllY2Ugb2Ygc2NoZW1hIHRoYXQgaGFkCi0gICAgICAgICAgICAgICAgbmFtZSA9IG5vblBvc2l0aXZlSW50ZWdlcgotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBVUkkgPSBodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYQotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBQcmVmaXggPSBuczEKLSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgCi0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZW5lcmF0ZVByZWZpeChqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICAgICAgaWYobmFtZXNwYWNlLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSl7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJ4c2QiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgIH0KLQotICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIGZpZWxkIGZvciBOb25Qb3NpdGl2ZUludGVnZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuTm9uUG9zaXRpdmVJbnRlZ2VyIGxvY2FsTm9uUG9zaXRpdmVJbnRlZ2VyIDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBnZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5Ob25Qb3NpdGl2ZUludGVnZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuTm9uUG9zaXRpdmVJbnRlZ2VyIGdldE5vblBvc2l0aXZlSW50ZWdlcigpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbE5vblBvc2l0aXZlSW50ZWdlcjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIHNldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSBwYXJhbSBOb25Qb3NpdGl2ZUludGVnZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldE5vblBvc2l0aXZlSW50ZWdlcihvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLk5vblBvc2l0aXZlSW50ZWdlciBwYXJhbSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYWxOb25Qb3NpdGl2ZUludGVnZXI9cGFyYW07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbE5vblBvc2l0aXZlSW50ZWdlci50b1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgLyoqCi0gICAgICogaXNSZWFkZXJNVE9NQXdhcmUKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlYWRlciBzdXBwb3J0cyBNVE9NCi0gICAgICovCi0gICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIHRyeXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGphdmEubGFuZy5Cb29sZWFuLlRSVUUuZXF1YWxzKHJlYWRlci5nZXRQcm9wZXJ0eShvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQ29uc3RhbnRzLklTX0RBVEFfSEFORExFUlNfQVdBUkUpKTsKLSAgICAgICAgfWNhdGNoKGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXNSZWFkZXJNVE9NQXdhcmU7Ci0gICB9Ci0gICAgIAotICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICoKLSAgICAgICAgKiBAcGFyYW0gcGFyZW50UU5hbWUKLSAgICAgICAgKiBAcGFyYW0gZmFjdG9yeQotICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICBwdWJsaWMgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgZ2V0T01FbGVtZW50ICgKLSAgICAgICAgICAgICAgIGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5KSB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlIGRhdGFTb3VyY2UgPQotICAgICAgICAgICAgICAgICAgICAgICBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJEYXRhU291cmNlKHRoaXMscGFyZW50UU5hbWUpewotCi0gICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICBOb25Qb3NpdGl2ZUludGVnZXIudGhpcy5zZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5PTVNvdXJjZWRFbGVtZW50SW1wbCgKLSAgICAgICAgICAgICAgIHBhcmVudFFOYW1lLGZhY3RvcnksZGF0YVNvdXJjZSk7Ci0gICAgICAgICAgICAKLSAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIsZmFsc2UpOwotICAgICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzZXJpYWxpemVUeXBlKQotICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotCi0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UgPSBudWxsOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHBhcmVudFFOYW1lLmdldFByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UgPSBwYXJlbnRRTmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZSAhPSBudWxsKSAmJiAobmFtZXNwYWNlLnRyaW0oKS5sZW5ndGgoKSA+IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHdyaXRlclByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3cml0ZXJQcmVmaXggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChuYW1lc3BhY2UsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHByZWZpeCwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCksIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIGlmIChzZXJpYWxpemVUeXBlKXsKLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpOwotICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlUHJlZml4ICE9IG51bGwpICYmIChuYW1lc3BhY2VQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkpewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVByZWZpeCsiOm5vblBvc2l0aXZlSW50ZWdlciIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vblBvc2l0aXZlSW50ZWdlciIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbE5vblBvc2l0aXZlSW50ZWdlcj09bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgdGhlIG5pbCBhdHRyaWJ1dGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJub25Qb3NpdGl2ZUludGVnZXIgY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxOb25Qb3NpdGl2ZUludGVnZXIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRoIHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCxqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgIGlmICh4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLQotICAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsIGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlTmFtZXNwYWNlID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVWYWx1ZTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBhdHRyaWJ1dGVQcmVmaXggKyAiOiIgKyBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSwgYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICBtZXRob2QgdG8gaGFuZGxlIFFuYW1lcwotICAgICAgICAgKi8KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZShqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhwcmVmaXggKyAiOiIgKyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaS5lIHRoaXMgaXMgdGhlIGRlZmF1bHQgbmFtZXNwYWNlCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lcyhqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lW10gcW5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICBpZiAocW5hbWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHRvIHN0b3JlIHRoaXMgZGF0YSB1bnRpbCBsYXN0IG1vbWVudCBzaW5jZSBpdCBpcyBub3QgcG9zc2libGUgdG8gd3JpdGUgYW55Ci0gICAgICAgICAgICAgICAgLy8gbmFtZXNwYWNlIGRhdGEgYWZ0ZXIgd3JpdGluZyB0aGUgY2hhcmFjdG9yIGRhdGEKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIHN0cmluZ1RvV3JpdGUgPSBuZXcgamF2YS5sYW5nLlN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHFuYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKCIgIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlVVJJID0gcW5hbWVzW2ldLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocHJlZml4ID09IG51bGwpIHx8IChwcmVmaXgubGVuZ3RoKCkgPT0gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChwcmVmaXgpLmFwcGVuZCgiOiIpLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHN0cmluZ1RvV3JpdGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0KLSAgICAgICAgIC8qKgotICAgICAgICAgKiBSZWdpc3RlciBhIG5hbWVzcGFjZSBwcmVmaXgKLSAgICAgICAgICovCi0gICAgICAgICBwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgcmVnaXN0ZXJQcmVmaXgoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLCBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlICh4bWxXcml0ZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gcHJlZml4OwotICAgICAgICAgICAgfQotCi0KLSAgCi0gICAgICAgIC8qKgotICAgICAgICAqIGRhdGFiaW5kaW5nIG1ldGhvZCB0byBnZXQgYW4gWE1MIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0Ci0gICAgICAgICoKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIGdldFB1bGxQYXJzZXIoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxTmFtZSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgZWxlbWVudExpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGF0dHJpYkxpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlci5FTEVNRU5UX1RFWFQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsTm9uUG9zaXRpdmVJbnRlZ2VyICE9IG51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbE5vblBvc2l0aXZlSW50ZWdlcikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJub25Qb3NpdGl2ZUludGVnZXIgY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXJJbXBsKHFOYW1lLCBlbGVtZW50TGlzdC50b0FycmF5KCksIGF0dHJpYkxpc3QudG9BcnJheSgpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gIAotCi0gICAgIC8qKgotICAgICAgKiAgRmFjdG9yeSBjbGFzcyB0aGF0IGtlZXBzIHRoZSBwYXJzZSBtZXRob2QKLSAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5ewotCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIE5vblBvc2l0aXZlSW50ZWdlciBmcm9tU3RyaW5nKGphdmEubGFuZy5TdHJpbmcgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkpewotICAgICAgICAgICAgICAgICAgICBOb25Qb3NpdGl2ZUludGVnZXIgcmV0dXJuVmFsdWUgPSBuZXcgIE5vblBvc2l0aXZlSW50ZWdlcigpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZS5zZXROb25Qb3NpdGl2ZUludGVnZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9Ob25Qb3NpdGl2ZUludGVnZXIodmFsdWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIE5vblBvc2l0aXZlSW50ZWdlciBmcm9tU3RyaW5nKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50LmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gY29udGVudC5zdWJzdHJpbmcoMCxjb250ZW50LmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVyaSA9IHhtbFN0cmVhbVJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTm9uUG9zaXRpdmVJbnRlZ2VyLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LG5hbWVzcGFjZVVyaSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOb25Qb3NpdGl2ZUludGVnZXIuRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsIiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAKLQotICAgICAgICAvKioKLSAgICAgICAgKiBzdGF0aWMgbWV0aG9kIHRvIGNyZWF0ZSB0aGUgb2JqZWN0Ci0gICAgICAgICogUHJlY29uZGl0aW9uOiAgSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIGN1cnJlbnQgb3IgbmV4dCBzdGFydCBlbGVtZW50IHN0YXJ0cyB0aGlzIG9iamVjdCBhbmQgYW55IGludGVydmVuaW5nIHJlYWRlciBldmVudHMgYXJlIGlnbm9yYWJsZQotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIG5vdCBhbiBlbGVtZW50LCBpdCBpcyBhIGNvbXBsZXggdHlwZSBhbmQgdGhlIHJlYWRlciBpcyBhdCB0aGUgZXZlbnQganVzdCBhZnRlciB0aGUgb3V0ZXIgc3RhcnQgZWxlbWVudAotICAgICAgICAqIFBvc3Rjb25kaXRpb246IElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCBpdHMgZW5kIGVsZW1lbnQKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBhIGNvbXBsZXggdHlwZSwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IHRoZSBlbmQgZWxlbWVudCBvZiBpdHMgb3V0ZXIgZWxlbWVudAotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIE5vblBvc2l0aXZlSW50ZWdlciBwYXJzZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uewotICAgICAgICAgICAgTm9uUG9zaXRpdmVJbnRlZ2VyIG9iamVjdCA9Ci0gICAgICAgICAgICAgICAgbmV3IE5vblBvc2l0aXZlSW50ZWdlcigpOwotCi0gICAgICAgICAgICBpbnQgZXZlbnQ7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5pbGxhYmxlVmFsdWUgPSBudWxsOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSIiOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2V1cmkgPSIiOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSAoIXJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICYmICFyZWFkZXIuaXNFbmRFbGVtZW50KCkpCi0gICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiKSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGZ1bGxUeXBlTmFtZSA9IHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiKTsKLSAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUhPW51bGwpewotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zUHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoMCxmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IG5zUHJlZml4PT1udWxsPyIiOm5zUHJlZml4OwotCi0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgdHlwZSA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSsxKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEibm9uUG9zaXRpdmVJbnRlZ2VyIi5lcXVhbHModHlwZSkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2ZpbmQgbmFtZXNwYWNlIGZvciB0aGUgcHJlZml4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNVcmkgPSByZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShuc1ByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoTm9uUG9zaXRpdmVJbnRlZ2VyKW9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkLkV4dGVuc2lvbk1hcHBlci5nZXRUeXBlT2JqZWN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zVXJpLHR5cGUscmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIE5vdGUgYWxsIGF0dHJpYnV0ZXMgdGhhdCB3ZXJlIGhhbmRsZWQuIFVzZWQgdG8gZGlmZmVyIG5vcm1hbCBhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgICAgLy8gZnJvbSBhbnlBdHRyaWJ1dGVzLgotICAgICAgICAgICAgICAgIGphdmEudXRpbC5WZWN0b3IgaGFuZGxlZEF0dHJpYnV0ZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlKCFyZWFkZXIuaXNFbmRFbGVtZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50ID0gcmVhZGVyLmdldEVsZW1lbnRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0Tm9uUG9zaXRpdmVJbnRlZ2VyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9Ob25Qb3NpdGl2ZUludGVnZXIoY29udGVudCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIEVuZCBvZiBpZiBmb3IgZXhwZWN0ZWQgcHJvcGVydHkgc3RhcnQgZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHN0YXJ0IGVsZW1lbnQgd2UgYXJlIG5vdCBleHBlY3RpbmcgaW5kaWNhdGVzIGFuIGludmFsaWQgcGFyYW1ldGVyIHdhcyBwYXNzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIlVuZXhwZWN0ZWQgc3ViZWxlbWVudCAiICsgcmVhZGVyLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBlbmQgb2Ygd2hpbGUgbG9vcAotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLQotCi0gICAgICAgICAgICB9IGNhdGNoIChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEubGFuZy5FeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBvYmplY3Q7Ci0gICAgICAgIH0KLQotICAgICAgICB9Ly9lbmQgb2YgZmFjdG9yeSBjbGFzcwotCi0gICAgICAgIAotCi0gICAgICAgIH0KLSAgICAgICAgICAgCi0gICAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3hzZC9Ob3JtYWxpemVkU3RyaW5nLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMveHNkL05vcm1hbGl6ZWRTdHJpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjMwNGYwMS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMveHNkL05vcm1hbGl6ZWRTdHJpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwMyArMCwwIEBACi0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICogTm9ybWFsaXplZFN0cmluZy5qYXZhCi0gKgotICogVGhpcyBmaWxlIHdhcyBhdXRvLWdlbmVyYXRlZCBmcm9tIFdTREwKLSAqIGJ5IHRoZSBBcGFjaGUgQXhpczIgdmVyc2lvbjogU05BUFNIT1QgIEJ1aWx0IG9uIDogRGVjIDIxLCAyMDA3ICgwNDowMzozMCBMS1QpCi0gKi8KLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy54c2Q7Ci0gICAgICAgICAgICAKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqICBOb3JtYWxpemVkU3RyaW5nIGJlYW4gY2xhc3MKLSAgICAgICAgICAgICovCi0gICAgICAgIAotICAgICAgICBwdWJsaWMgIGNsYXNzIE5vcm1hbGl6ZWRTdHJpbmcKLSAgICAgICAgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkJlYW57Ci0gICAgICAgIC8qIFRoaXMgdHlwZSB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIHBpZWNlIG9mIHNjaGVtYSB0aGF0IGhhZAotICAgICAgICAgICAgICAgIG5hbWUgPSBub3JtYWxpemVkU3RyaW5nCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFVSSSA9IGh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFByZWZpeCA9IG5zMQotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdlbmVyYXRlUHJlZml4KGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB7Ci0gICAgICAgICAgICBpZihuYW1lc3BhY2UuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpKXsKLSAgICAgICAgICAgICAgICByZXR1cm4gInhzZCI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgfQotCi0gICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogZmllbGQgZm9yIE5vcm1hbGl6ZWRTdHJpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuTm9ybWFsaXplZFN0cmluZyBsb2NhbE5vcm1hbGl6ZWRTdHJpbmcgOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIGdldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLk5vcm1hbGl6ZWRTdHJpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuTm9ybWFsaXplZFN0cmluZyBnZXROb3JtYWxpemVkU3RyaW5nKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsTm9ybWFsaXplZFN0cmluZzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIHNldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSBwYXJhbSBOb3JtYWxpemVkU3RyaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXROb3JtYWxpemVkU3RyaW5nKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuTm9ybWFsaXplZFN0cmluZyBwYXJhbSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYWxOb3JtYWxpemVkU3RyaW5nPXBhcmFtOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxOb3JtYWxpemVkU3RyaW5nLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAvKioKLSAgICAgKiBpc1JlYWRlck1UT01Bd2FyZQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVhZGVyIHN1cHBvcnRzIE1UT00KLSAgICAgKi8KLSAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKLSAgICAgICAgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICAKLSAgICAgICAgdHJ5ewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gamF2YS5sYW5nLkJvb2xlYW4uVFJVRS5lcXVhbHMocmVhZGVyLmdldFByb3BlcnR5KG9yZy5hcGFjaGUuYXhpb20ub20uT01Db25zdGFudHMuSVNfREFUQV9IQU5ETEVSU19BV0FSRSkpOwotICAgICAgICB9Y2F0Y2goamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpc1JlYWRlck1UT01Bd2FyZTsKLSAgIH0KLSAgICAgCi0gICAgIAotICAgICAgICAvKioKLSAgICAgICAgKgotICAgICAgICAqIEBwYXJhbSBwYXJlbnRRTmFtZQotICAgICAgICAqIEBwYXJhbSBmYWN0b3J5Ci0gICAgICAgICogQHJldHVybiBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudAotICAgICAgICAqLwotICAgICAgIHB1YmxpYyBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCBnZXRPTUVsZW1lbnQgKAotICAgICAgICAgICAgICAgZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnkpIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTURhdGFTb3VyY2UgZGF0YVNvdXJjZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkRhdGFTb3VyY2UodGhpcyxwYXJlbnRRTmFtZSl7Ci0KLSAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgIE5vcm1hbGl6ZWRTdHJpbmcudGhpcy5zZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5PTVNvdXJjZWRFbGVtZW50SW1wbCgKLSAgICAgICAgICAgICAgIHBhcmVudFFOYW1lLGZhY3RvcnksZGF0YVNvdXJjZSk7Ci0gICAgICAgICAgICAKLSAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIsZmFsc2UpOwotICAgICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzZXJpYWxpemVUeXBlKQotICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotCi0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UgPSBudWxsOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHBhcmVudFFOYW1lLmdldFByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UgPSBwYXJlbnRRTmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZSAhPSBudWxsKSAmJiAobmFtZXNwYWNlLnRyaW0oKS5sZW5ndGgoKSA+IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHdyaXRlclByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3cml0ZXJQcmVmaXggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChuYW1lc3BhY2UsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHByZWZpeCwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCksIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIGlmIChzZXJpYWxpemVUeXBlKXsKLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpOwotICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlUHJlZml4ICE9IG51bGwpICYmIChuYW1lc3BhY2VQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkpewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVByZWZpeCsiOm5vcm1hbGl6ZWRTdHJpbmciLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJub3JtYWxpemVkU3RyaW5nIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsTm9ybWFsaXplZFN0cmluZz09bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgdGhlIG5pbCBhdHRyaWJ1dGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJub3JtYWxpemVkU3RyaW5nIGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsTm9ybWFsaXplZFN0cmluZykpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGggdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgcHJlZml4LGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgaWYgKHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotCi0gICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotCi0gICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSwgamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVOYW1lc3BhY2UgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgoYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVZhbHVlOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IGF0dHJpYnV0ZVByZWZpeCArICI6IiArIHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLCBhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAvKioKLSAgICAgICAgICogIG1ldGhvZCB0byBoYW5kbGUgUW5hbWVzCi0gICAgICAgICAqLwotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHByZWZpeCArICI6IiArIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBpLmUgdGhpcyBpcyB0aGUgZGVmYXVsdCBuYW1lc3BhY2UKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVzKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWVbXSBxbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgIGlmIChxbmFtZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gc3RvcmUgdGhpcyBkYXRhIHVudGlsIGxhc3QgbW9tZW50IHNpbmNlIGl0IGlzIG5vdCBwb3NzaWJsZSB0byB3cml0ZSBhbnkKLSAgICAgICAgICAgICAgICAvLyBuYW1lc3BhY2UgZGF0YSBhZnRlciB3cml0aW5nIHRoZSBjaGFyYWN0b3IgZGF0YQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmdCdWZmZXIgc3RyaW5nVG9Xcml0ZSA9IG5ldyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcW5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQoIiAiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VVUkkgPSBxbmFtZXNbaV0uZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwcmVmaXggPT0gbnVsbCkgfHwgKHByZWZpeC5sZW5ndGgoKSA9PSAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKHByZWZpeCkuYXBwZW5kKCI6IikuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMoc3RyaW5nVG9Xcml0ZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAqIFJlZ2lzdGVyIGEgbmFtZXNwYWNlIHByZWZpeAotICAgICAgICAgKi8KLSAgICAgICAgIHByaXZhdGUgamF2YS5sYW5nLlN0cmluZyByZWdpc3RlclByZWZpeChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHhtbFdyaXRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiBwcmVmaXg7Ci0gICAgICAgICAgICB9Ci0KLQotICAKLSAgICAgICAgLyoqCi0gICAgICAgICogZGF0YWJpbmRpbmcgbWV0aG9kIHRvIGdldCBhbiBYTUwgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QKLSAgICAgICAgKgotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgZ2V0UHVsbFBhcnNlcihqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFOYW1lKQotICAgICAgICAgICAgICAgICAgICB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBlbGVtZW50TGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgYXR0cmliTGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVyLkVMRU1FTlRfVEVYVCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxOb3JtYWxpemVkU3RyaW5nICE9IG51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbE5vcm1hbGl6ZWRTdHJpbmcpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigibm9ybWFsaXplZFN0cmluZyBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlckltcGwocU5hbWUsIGVsZW1lbnRMaXN0LnRvQXJyYXkoKSwgYXR0cmliTGlzdC50b0FycmF5KCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgCi0KLSAgICAgLyoqCi0gICAgICAqICBGYWN0b3J5IGNsYXNzIHRoYXQga2VlcHMgdGhlIHBhcnNlIG1ldGhvZAotICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3Rvcnl7Ci0KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgTm9ybWFsaXplZFN0cmluZyBmcm9tU3RyaW5nKGphdmEubGFuZy5TdHJpbmcgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkpewotICAgICAgICAgICAgICAgICAgICBOb3JtYWxpemVkU3RyaW5nIHJldHVyblZhbHVlID0gbmV3ICBOb3JtYWxpemVkU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlLnNldE5vcm1hbGl6ZWRTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9Ob3JtYWxpemVkU3RyaW5nKHZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBOb3JtYWxpemVkU3RyaW5nIGZyb21TdHJpbmcoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBjb250ZW50LnN1YnN0cmluZygwLGNvbnRlbnQuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVXJpID0geG1sU3RyZWFtUmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOb3JtYWxpemVkU3RyaW5nLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LG5hbWVzcGFjZVVyaSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOb3JtYWxpemVkU3RyaW5nLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LCIiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgCi0KLSAgICAgICAgLyoqCi0gICAgICAgICogc3RhdGljIG1ldGhvZCB0byBjcmVhdGUgdGhlIG9iamVjdAotICAgICAgICAqIFByZWNvbmRpdGlvbjogIElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSBjdXJyZW50IG9yIG5leHQgc3RhcnQgZWxlbWVudCBzdGFydHMgdGhpcyBvYmplY3QgYW5kIGFueSBpbnRlcnZlbmluZyByZWFkZXIgZXZlbnRzIGFyZSBpZ25vcmFibGUKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBub3QgYW4gZWxlbWVudCwgaXQgaXMgYSBjb21wbGV4IHR5cGUgYW5kIHRoZSByZWFkZXIgaXMgYXQgdGhlIGV2ZW50IGp1c3QgYWZ0ZXIgdGhlIG91dGVyIHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgKiBQb3N0Y29uZGl0aW9uOiBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgaXRzIGVuZCBlbGVtZW50Ci0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgYSBjb21wbGV4IHR5cGUsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCB0aGUgZW5kIGVsZW1lbnQgb2YgaXRzIG91dGVyIGVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBOb3JtYWxpemVkU3RyaW5nIHBhcnNlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb257Ci0gICAgICAgICAgICBOb3JtYWxpemVkU3RyaW5nIG9iamVjdCA9Ci0gICAgICAgICAgICAgICAgbmV3IE5vcm1hbGl6ZWRTdHJpbmcoKTsKLQotICAgICAgICAgICAgaW50IGV2ZW50OwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuaWxsYWJsZVZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0iIjsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNldXJpID0iIjsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUgKCFyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAmJiAhcmVhZGVyLmlzRW5kRWxlbWVudCgpKQotICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIikhPW51bGwpewotICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBmdWxsVHlwZU5hbWUgPSByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIik7Ci0gICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1ByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKDAsZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBuc1ByZWZpeD09bnVsbD8iIjpuc1ByZWZpeDsKLQotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHR5cGUgPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikrMSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIm5vcm1hbGl6ZWRTdHJpbmciLmVxdWFscyh0eXBlKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZmluZCBuYW1lc3BhY2UgZm9yIHRoZSBwcmVmaXgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1VyaSA9IHJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKG5zUHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChOb3JtYWxpemVkU3RyaW5nKW9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkLkV4dGVuc2lvbk1hcHBlci5nZXRUeXBlT2JqZWN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zVXJpLHR5cGUscmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIE5vdGUgYWxsIGF0dHJpYnV0ZXMgdGhhdCB3ZXJlIGhhbmRsZWQuIFVzZWQgdG8gZGlmZmVyIG5vcm1hbCBhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgICAgLy8gZnJvbSBhbnlBdHRyaWJ1dGVzLgotICAgICAgICAgICAgICAgIGphdmEudXRpbC5WZWN0b3IgaGFuZGxlZEF0dHJpYnV0ZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlKCFyZWFkZXIuaXNFbmRFbGVtZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50ID0gcmVhZGVyLmdldEVsZW1lbnRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0Tm9ybWFsaXplZFN0cmluZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvTm9ybWFsaXplZFN0cmluZyhjb250ZW50KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gRW5kIG9mIGlmIGZvciBleHBlY3RlZCBwcm9wZXJ0eSBzdGFydCBlbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgc3RhcnQgZWxlbWVudCB3ZSBhcmUgbm90IGV4cGVjdGluZyBpbmRpY2F0ZXMgYW4gaW52YWxpZCBwYXJhbWV0ZXIgd2FzIHBhc3NlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiVW5leHBlY3RlZCBzdWJlbGVtZW50ICIgKyByZWFkZXIuZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIGVuZCBvZiB3aGlsZSBsb29wCi0gICAgICAgICAgICAgICAgICAgICAgICAKLQotCi0KLSAgICAgICAgICAgIH0gY2F0Y2ggKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5sYW5nLkV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG9iamVjdDsKLSAgICAgICAgfQotCi0gICAgICAgIH0vL2VuZCBvZiBmYWN0b3J5IGNsYXNzCi0KLSAgICAgICAgCi0KLSAgICAgICAgfQotICAgICAgICAgICAKLSAgICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMveHNkL1Bvc2l0aXZlSW50ZWdlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3hzZC9Qb3NpdGl2ZUludGVnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjEwZjE5ZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMveHNkL1Bvc2l0aXZlSW50ZWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAzICswLDAgQEAKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBQb3NpdGl2ZUludGVnZXIuamF2YQotICoKLSAqIFRoaXMgZmlsZSB3YXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBXU0RMCi0gKiBieSB0aGUgQXBhY2hlIEF4aXMyIHZlcnNpb246IFNOQVBTSE9UICBCdWlsdCBvbiA6IERlYyAyMSwgMjAwNyAoMDQ6MDM6MzAgTEtUKQotICovCi0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBwYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkOwotICAgICAgICAgICAgCi0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiAgUG9zaXRpdmVJbnRlZ2VyIGJlYW4gY2xhc3MKLSAgICAgICAgICAgICovCi0gICAgICAgIAotICAgICAgICBwdWJsaWMgIGNsYXNzIFBvc2l0aXZlSW50ZWdlcgotICAgICAgICBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCQmVhbnsKLSAgICAgICAgLyogVGhpcyB0eXBlIHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgcGllY2Ugb2Ygc2NoZW1hIHRoYXQgaGFkCi0gICAgICAgICAgICAgICAgbmFtZSA9IHBvc2l0aXZlSW50ZWdlcgotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBVUkkgPSBodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYQotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBQcmVmaXggPSBuczEKLSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgCi0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZW5lcmF0ZVByZWZpeChqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICAgICAgaWYobmFtZXNwYWNlLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSl7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJ4c2QiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgIH0KLQotICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIGZpZWxkIGZvciBQb3NpdGl2ZUludGVnZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuUG9zaXRpdmVJbnRlZ2VyIGxvY2FsUG9zaXRpdmVJbnRlZ2VyIDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBnZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5Qb3NpdGl2ZUludGVnZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuUG9zaXRpdmVJbnRlZ2VyIGdldFBvc2l0aXZlSW50ZWdlcigpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbFBvc2l0aXZlSW50ZWdlcjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIHNldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSBwYXJhbSBQb3NpdGl2ZUludGVnZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldFBvc2l0aXZlSW50ZWdlcihvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLlBvc2l0aXZlSW50ZWdlciBwYXJhbSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYWxQb3NpdGl2ZUludGVnZXI9cGFyYW07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbFBvc2l0aXZlSW50ZWdlci50b1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgLyoqCi0gICAgICogaXNSZWFkZXJNVE9NQXdhcmUKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlYWRlciBzdXBwb3J0cyBNVE9NCi0gICAgICovCi0gICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIHRyeXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGphdmEubGFuZy5Cb29sZWFuLlRSVUUuZXF1YWxzKHJlYWRlci5nZXRQcm9wZXJ0eShvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQ29uc3RhbnRzLklTX0RBVEFfSEFORExFUlNfQVdBUkUpKTsKLSAgICAgICAgfWNhdGNoKGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXNSZWFkZXJNVE9NQXdhcmU7Ci0gICB9Ci0gICAgIAotICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICoKLSAgICAgICAgKiBAcGFyYW0gcGFyZW50UU5hbWUKLSAgICAgICAgKiBAcGFyYW0gZmFjdG9yeQotICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICBwdWJsaWMgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgZ2V0T01FbGVtZW50ICgKLSAgICAgICAgICAgICAgIGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5KSB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlIGRhdGFTb3VyY2UgPQotICAgICAgICAgICAgICAgICAgICAgICBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJEYXRhU291cmNlKHRoaXMscGFyZW50UU5hbWUpewotCi0gICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICBQb3NpdGl2ZUludGVnZXIudGhpcy5zZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5PTVNvdXJjZWRFbGVtZW50SW1wbCgKLSAgICAgICAgICAgICAgIHBhcmVudFFOYW1lLGZhY3RvcnksZGF0YVNvdXJjZSk7Ci0gICAgICAgICAgICAKLSAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIsZmFsc2UpOwotICAgICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzZXJpYWxpemVUeXBlKQotICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotCi0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UgPSBudWxsOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHBhcmVudFFOYW1lLmdldFByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UgPSBwYXJlbnRRTmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZSAhPSBudWxsKSAmJiAobmFtZXNwYWNlLnRyaW0oKS5sZW5ndGgoKSA+IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHdyaXRlclByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3cml0ZXJQcmVmaXggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChuYW1lc3BhY2UsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHByZWZpeCwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCksIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIGlmIChzZXJpYWxpemVUeXBlKXsKLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpOwotICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlUHJlZml4ICE9IG51bGwpICYmIChuYW1lc3BhY2VQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkpewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVByZWZpeCsiOnBvc2l0aXZlSW50ZWdlciIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvc2l0aXZlSW50ZWdlciIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbFBvc2l0aXZlSW50ZWdlcj09bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgdGhlIG5pbCBhdHRyaWJ1dGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJwb3NpdGl2ZUludGVnZXIgY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxQb3NpdGl2ZUludGVnZXIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRoIHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCxqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgIGlmICh4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLQotICAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsIGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlTmFtZXNwYWNlID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVWYWx1ZTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBhdHRyaWJ1dGVQcmVmaXggKyAiOiIgKyBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSwgYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICBtZXRob2QgdG8gaGFuZGxlIFFuYW1lcwotICAgICAgICAgKi8KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZShqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhwcmVmaXggKyAiOiIgKyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaS5lIHRoaXMgaXMgdGhlIGRlZmF1bHQgbmFtZXNwYWNlCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lcyhqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lW10gcW5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICBpZiAocW5hbWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHRvIHN0b3JlIHRoaXMgZGF0YSB1bnRpbCBsYXN0IG1vbWVudCBzaW5jZSBpdCBpcyBub3QgcG9zc2libGUgdG8gd3JpdGUgYW55Ci0gICAgICAgICAgICAgICAgLy8gbmFtZXNwYWNlIGRhdGEgYWZ0ZXIgd3JpdGluZyB0aGUgY2hhcmFjdG9yIGRhdGEKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIHN0cmluZ1RvV3JpdGUgPSBuZXcgamF2YS5sYW5nLlN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHFuYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKCIgIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlVVJJID0gcW5hbWVzW2ldLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocHJlZml4ID09IG51bGwpIHx8IChwcmVmaXgubGVuZ3RoKCkgPT0gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChwcmVmaXgpLmFwcGVuZCgiOiIpLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHN0cmluZ1RvV3JpdGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0KLSAgICAgICAgIC8qKgotICAgICAgICAgKiBSZWdpc3RlciBhIG5hbWVzcGFjZSBwcmVmaXgKLSAgICAgICAgICovCi0gICAgICAgICBwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgcmVnaXN0ZXJQcmVmaXgoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLCBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlICh4bWxXcml0ZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gcHJlZml4OwotICAgICAgICAgICAgfQotCi0KLSAgCi0gICAgICAgIC8qKgotICAgICAgICAqIGRhdGFiaW5kaW5nIG1ldGhvZCB0byBnZXQgYW4gWE1MIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0Ci0gICAgICAgICoKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIGdldFB1bGxQYXJzZXIoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxTmFtZSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgZWxlbWVudExpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGF0dHJpYkxpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlci5FTEVNRU5UX1RFWFQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsUG9zaXRpdmVJbnRlZ2VyICE9IG51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbFBvc2l0aXZlSW50ZWdlcikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJwb3NpdGl2ZUludGVnZXIgY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXJJbXBsKHFOYW1lLCBlbGVtZW50TGlzdC50b0FycmF5KCksIGF0dHJpYkxpc3QudG9BcnJheSgpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gIAotCi0gICAgIC8qKgotICAgICAgKiAgRmFjdG9yeSBjbGFzcyB0aGF0IGtlZXBzIHRoZSBwYXJzZSBtZXRob2QKLSAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5ewotCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIFBvc2l0aXZlSW50ZWdlciBmcm9tU3RyaW5nKGphdmEubGFuZy5TdHJpbmcgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkpewotICAgICAgICAgICAgICAgICAgICBQb3NpdGl2ZUludGVnZXIgcmV0dXJuVmFsdWUgPSBuZXcgIFBvc2l0aXZlSW50ZWdlcigpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZS5zZXRQb3NpdGl2ZUludGVnZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9Qb3NpdGl2ZUludGVnZXIodmFsdWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIFBvc2l0aXZlSW50ZWdlciBmcm9tU3RyaW5nKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50LmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gY29udGVudC5zdWJzdHJpbmcoMCxjb250ZW50LmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVyaSA9IHhtbFN0cmVhbVJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUG9zaXRpdmVJbnRlZ2VyLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LG5hbWVzcGFjZVVyaSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQb3NpdGl2ZUludGVnZXIuRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsIiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAKLQotICAgICAgICAvKioKLSAgICAgICAgKiBzdGF0aWMgbWV0aG9kIHRvIGNyZWF0ZSB0aGUgb2JqZWN0Ci0gICAgICAgICogUHJlY29uZGl0aW9uOiAgSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIGN1cnJlbnQgb3IgbmV4dCBzdGFydCBlbGVtZW50IHN0YXJ0cyB0aGlzIG9iamVjdCBhbmQgYW55IGludGVydmVuaW5nIHJlYWRlciBldmVudHMgYXJlIGlnbm9yYWJsZQotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIG5vdCBhbiBlbGVtZW50LCBpdCBpcyBhIGNvbXBsZXggdHlwZSBhbmQgdGhlIHJlYWRlciBpcyBhdCB0aGUgZXZlbnQganVzdCBhZnRlciB0aGUgb3V0ZXIgc3RhcnQgZWxlbWVudAotICAgICAgICAqIFBvc3Rjb25kaXRpb246IElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCBpdHMgZW5kIGVsZW1lbnQKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBhIGNvbXBsZXggdHlwZSwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IHRoZSBlbmQgZWxlbWVudCBvZiBpdHMgb3V0ZXIgZWxlbWVudAotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFBvc2l0aXZlSW50ZWdlciBwYXJzZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uewotICAgICAgICAgICAgUG9zaXRpdmVJbnRlZ2VyIG9iamVjdCA9Ci0gICAgICAgICAgICAgICAgbmV3IFBvc2l0aXZlSW50ZWdlcigpOwotCi0gICAgICAgICAgICBpbnQgZXZlbnQ7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5pbGxhYmxlVmFsdWUgPSBudWxsOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSIiOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2V1cmkgPSIiOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSAoIXJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICYmICFyZWFkZXIuaXNFbmRFbGVtZW50KCkpCi0gICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiKSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGZ1bGxUeXBlTmFtZSA9IHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiKTsKLSAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUhPW51bGwpewotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zUHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoMCxmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IG5zUHJlZml4PT1udWxsPyIiOm5zUHJlZml4OwotCi0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgdHlwZSA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSsxKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEicG9zaXRpdmVJbnRlZ2VyIi5lcXVhbHModHlwZSkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2ZpbmQgbmFtZXNwYWNlIGZvciB0aGUgcHJlZml4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNVcmkgPSByZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShuc1ByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoUG9zaXRpdmVJbnRlZ2VyKW9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkLkV4dGVuc2lvbk1hcHBlci5nZXRUeXBlT2JqZWN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zVXJpLHR5cGUscmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIE5vdGUgYWxsIGF0dHJpYnV0ZXMgdGhhdCB3ZXJlIGhhbmRsZWQuIFVzZWQgdG8gZGlmZmVyIG5vcm1hbCBhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgICAgLy8gZnJvbSBhbnlBdHRyaWJ1dGVzLgotICAgICAgICAgICAgICAgIGphdmEudXRpbC5WZWN0b3IgaGFuZGxlZEF0dHJpYnV0ZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlKCFyZWFkZXIuaXNFbmRFbGVtZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50ID0gcmVhZGVyLmdldEVsZW1lbnRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0UG9zaXRpdmVJbnRlZ2VyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9Qb3NpdGl2ZUludGVnZXIoY29udGVudCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIEVuZCBvZiBpZiBmb3IgZXhwZWN0ZWQgcHJvcGVydHkgc3RhcnQgZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHN0YXJ0IGVsZW1lbnQgd2UgYXJlIG5vdCBleHBlY3RpbmcgaW5kaWNhdGVzIGFuIGludmFsaWQgcGFyYW1ldGVyIHdhcyBwYXNzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIlVuZXhwZWN0ZWQgc3ViZWxlbWVudCAiICsgcmVhZGVyLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBlbmQgb2Ygd2hpbGUgbG9vcAotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLQotCi0gICAgICAgICAgICB9IGNhdGNoIChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEubGFuZy5FeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBvYmplY3Q7Ci0gICAgICAgIH0KLQotICAgICAgICB9Ly9lbmQgb2YgZmFjdG9yeSBjbGFzcwotCi0gICAgICAgIAotCi0gICAgICAgIH0KLSAgICAgICAgICAgCi0gICAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3hzZC9RTmFtZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3hzZC9RTmFtZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDEzMWUwLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy94c2QvUU5hbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxMCArMCwwIEBACi0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICogUU5hbWUuamF2YQotICoKLSAqIFRoaXMgZmlsZSB3YXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBXU0RMCi0gKiBieSB0aGUgQXBhY2hlIEF4aXMyIHZlcnNpb246IFNOQVBTSE9UICBCdWlsdCBvbiA6IERlYyAyMSwgMjAwNyAoMDQ6MDM6MzAgTEtUKQotICovCi0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBwYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkOwotICAgICAgICAgICAgCi0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiAgUU5hbWUgYmVhbiBjbGFzcwotICAgICAgICAgICAgKi8KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyAgY2xhc3MgUU5hbWUKLSAgICAgICAgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkJlYW57Ci0gICAgICAgIC8qIFRoaXMgdHlwZSB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIHBpZWNlIG9mIHNjaGVtYSB0aGF0IGhhZAotICAgICAgICAgICAgICAgIG5hbWUgPSBRTmFtZQotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBVUkkgPSBodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYQotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBQcmVmaXggPSBuczEKLSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgCi0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZW5lcmF0ZVByZWZpeChqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICAgICAgaWYobmFtZXNwYWNlLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSl7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJ4c2QiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgIH0KLQotICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIGZpZWxkIGZvciBRTmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBsb2NhbFFOYW1lIDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBnZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyAgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBnZXRRTmFtZSgpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbFFOYW1lOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgc2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtIHBhcmFtIFFOYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRRTmFtZShqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmFtKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2NhbFFOYW1lPXBhcmFtOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxRTmFtZS50b1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgLyoqCi0gICAgICogaXNSZWFkZXJNVE9NQXdhcmUKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlYWRlciBzdXBwb3J0cyBNVE9NCi0gICAgICovCi0gICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIHRyeXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGphdmEubGFuZy5Cb29sZWFuLlRSVUUuZXF1YWxzKHJlYWRlci5nZXRQcm9wZXJ0eShvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQ29uc3RhbnRzLklTX0RBVEFfSEFORExFUlNfQVdBUkUpKTsKLSAgICAgICAgfWNhdGNoKGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXNSZWFkZXJNVE9NQXdhcmU7Ci0gICB9Ci0gICAgIAotICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICoKLSAgICAgICAgKiBAcGFyYW0gcGFyZW50UU5hbWUKLSAgICAgICAgKiBAcGFyYW0gZmFjdG9yeQotICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICBwdWJsaWMgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgZ2V0T01FbGVtZW50ICgKLSAgICAgICAgICAgICAgIGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5KSB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlIGRhdGFTb3VyY2UgPQotICAgICAgICAgICAgICAgICAgICAgICBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJEYXRhU291cmNlKHRoaXMscGFyZW50UU5hbWUpewotCi0gICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICBRTmFtZS50aGlzLnNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5sbG9tLk9NU291cmNlZEVsZW1lbnRJbXBsKAotICAgICAgICAgICAgICAgcGFyZW50UU5hbWUsZmFjdG9yeSxkYXRhU291cmNlKTsKLSAgICAgICAgICAgIAotICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcixmYWxzZSk7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNlcmlhbGl6ZVR5cGUpCi0gICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgCi0KLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gcGFyZW50UU5hbWUuZ2V0UHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZSA9IHBhcmVudFFOYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlICE9IG51bGwpICYmIChuYW1lc3BhY2UudHJpbSgpLmxlbmd0aCgpID4gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgd3JpdGVyUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdyaXRlclByZWZpeCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KG5hbWVzcGFjZSwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocHJlZml4LCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgaWYgKHNlcmlhbGl6ZVR5cGUpewotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIik7Ci0gICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2VQcmVmaXggIT0gbnVsbCkgJiYgKG5hbWVzcGFjZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlUHJlZml4KyI6UU5hbWUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJRTmFtZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbFFOYW1lPT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZSB0aGUgbmlsIGF0dHJpYnV0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIlFOYW1lIGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVRTmFtZShsb2NhbFFOYW1lLHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBwcmVmaXgsamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICBpZiAoeG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0KLSAgICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0KLSAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLCBqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZU5hbWVzcGFjZSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlVmFsdWU7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gYXR0cmlidXRlUHJlZml4ICsgIjoiICsgcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsIGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIC8qKgotICAgICAgICAgKiAgbWV0aG9kIHRvIGhhbmRsZSBRbmFtZXMKLSAgICAgICAgICovCi0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWUoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMocHJlZml4ICsgIjoiICsgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGkuZSB0aGlzIGlzIHRoZSBkZWZhdWx0IG5hbWVzcGFjZQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZXMoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZVtdIHFuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgaWYgKHFuYW1lcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBzdG9yZSB0aGlzIGRhdGEgdW50aWwgbGFzdCBtb21lbnQgc2luY2UgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHdyaXRlIGFueQotICAgICAgICAgICAgICAgIC8vIG5hbWVzcGFjZSBkYXRhIGFmdGVyIHdyaXRpbmcgdGhlIGNoYXJhY3RvciBkYXRhCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZ0J1ZmZlciBzdHJpbmdUb1dyaXRlID0gbmV3IGphdmEubGFuZy5TdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBxbmFtZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZCgiICIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVVSSSA9IHFuYW1lc1tpXS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHByZWZpeCA9PSBudWxsKSB8fCAocHJlZml4Lmxlbmd0aCgpID09IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQocHJlZml4KS5hcHBlbmQoIjoiKS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhzdHJpbmdUb1dyaXRlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotCi0gICAgICAgICAvKioKLSAgICAgICAgICogUmVnaXN0ZXIgYSBuYW1lc3BhY2UgcHJlZml4Ci0gICAgICAgICAqLwotICAgICAgICAgcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHJlZ2lzdGVyUHJlZml4KGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoeG1sV3JpdGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHByZWZpeDsKLSAgICAgICAgICAgIH0KLQotCi0gIAotICAgICAgICAvKioKLSAgICAgICAgKiBkYXRhYmluZGluZyBtZXRob2QgdG8gZ2V0IGFuIFhNTCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdAotICAgICAgICAqCi0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciBnZXRQdWxsUGFyc2VyKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcU5hbWUpCi0gICAgICAgICAgICAgICAgICAgIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGVsZW1lbnRMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBhdHRyaWJMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXIuRUxFTUVOVF9URVhUKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbFFOYW1lICE9IG51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbFFOYW1lKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIlFOYW1lIGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVySW1wbChxTmFtZSwgZWxlbWVudExpc3QudG9BcnJheSgpLCBhdHRyaWJMaXN0LnRvQXJyYXkoKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAKLQotICAgICAvKioKLSAgICAgICogIEZhY3RvcnkgY2xhc3MgdGhhdCBrZWVwcyB0aGUgcGFyc2UgbWV0aG9kCi0gICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeXsKLQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBRTmFtZSBmcm9tU3RyaW5nKGphdmEubGFuZy5TdHJpbmcgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkpewotICAgICAgICAgICAgICAgICAgICBRTmFtZSByZXR1cm5WYWx1ZSA9IG5ldyAgUU5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUuc2V0UU5hbWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9RTmFtZSh2YWx1ZSxuYW1lc3BhY2VVUkkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIFFOYW1lIGZyb21TdHJpbmcoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBjb250ZW50LnN1YnN0cmluZygwLGNvbnRlbnQuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVXJpID0geG1sU3RyZWFtUmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBRTmFtZS5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCxuYW1lc3BhY2VVcmkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUU5hbWUuRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsIiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAKLQotICAgICAgICAvKioKLSAgICAgICAgKiBzdGF0aWMgbWV0aG9kIHRvIGNyZWF0ZSB0aGUgb2JqZWN0Ci0gICAgICAgICogUHJlY29uZGl0aW9uOiAgSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIGN1cnJlbnQgb3IgbmV4dCBzdGFydCBlbGVtZW50IHN0YXJ0cyB0aGlzIG9iamVjdCBhbmQgYW55IGludGVydmVuaW5nIHJlYWRlciBldmVudHMgYXJlIGlnbm9yYWJsZQotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIG5vdCBhbiBlbGVtZW50LCBpdCBpcyBhIGNvbXBsZXggdHlwZSBhbmQgdGhlIHJlYWRlciBpcyBhdCB0aGUgZXZlbnQganVzdCBhZnRlciB0aGUgb3V0ZXIgc3RhcnQgZWxlbWVudAotICAgICAgICAqIFBvc3Rjb25kaXRpb246IElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCBpdHMgZW5kIGVsZW1lbnQKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBhIGNvbXBsZXggdHlwZSwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IHRoZSBlbmQgZWxlbWVudCBvZiBpdHMgb3V0ZXIgZWxlbWVudAotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFFOYW1lIHBhcnNlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb257Ci0gICAgICAgICAgICBRTmFtZSBvYmplY3QgPQotICAgICAgICAgICAgICAgIG5ldyBRTmFtZSgpOwotCi0gICAgICAgICAgICBpbnQgZXZlbnQ7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5pbGxhYmxlVmFsdWUgPSBudWxsOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSIiOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2V1cmkgPSIiOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSAoIXJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICYmICFyZWFkZXIuaXNFbmRFbGVtZW50KCkpCi0gICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiKSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGZ1bGxUeXBlTmFtZSA9IHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiKTsKLSAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUhPW51bGwpewotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zUHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoMCxmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IG5zUHJlZml4PT1udWxsPyIiOm5zUHJlZml4OwotCi0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgdHlwZSA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSsxKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEiUU5hbWUiLmVxdWFscyh0eXBlKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZmluZCBuYW1lc3BhY2UgZm9yIHRoZSBwcmVmaXgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1VyaSA9IHJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKG5zUHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChRTmFtZSlvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnhzZC5FeHRlbnNpb25NYXBwZXIuZ2V0VHlwZU9iamVjdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc1VyaSx0eXBlLHJlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBOb3RlIGFsbCBhdHRyaWJ1dGVzIHRoYXQgd2VyZSBoYW5kbGVkLiBVc2VkIHRvIGRpZmZlciBub3JtYWwgYXR0cmlidXRlcwotICAgICAgICAgICAgICAgIC8vIGZyb20gYW55QXR0cmlidXRlcy4KLSAgICAgICAgICAgICAgICBqYXZhLnV0aWwuVmVjdG9yIGhhbmRsZWRBdHRyaWJ1dGVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSghcmVhZGVyLmlzRW5kRWxlbWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCA9IHJlYWRlci5nZXRFbGVtZW50VGV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCA9IGNvbnRlbnQuaW5kZXhPZigiOiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihpbmRleCA+IDApewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gY29udGVudC5zdWJzdHJpbmcoMCxpbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gIiI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2V1cmkgPSByZWFkZXIuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0UU5hbWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9RTmFtZShjb250ZW50LG5hbWVzcGFjZXVyaSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIEVuZCBvZiBpZiBmb3IgZXhwZWN0ZWQgcHJvcGVydHkgc3RhcnQgZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHN0YXJ0IGVsZW1lbnQgd2UgYXJlIG5vdCBleHBlY3RpbmcgaW5kaWNhdGVzIGFuIGludmFsaWQgcGFyYW1ldGVyIHdhcyBwYXNzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIlVuZXhwZWN0ZWQgc3ViZWxlbWVudCAiICsgcmVhZGVyLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBlbmQgb2Ygd2hpbGUgbG9vcAotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLQotCi0gICAgICAgICAgICB9IGNhdGNoIChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEubGFuZy5FeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBvYmplY3Q7Ci0gICAgICAgIH0KLQotICAgICAgICB9Ly9lbmQgb2YgZmFjdG9yeSBjbGFzcwotCi0gICAgICAgIAotCi0gICAgICAgIH0KLSAgICAgICAgICAgCi0gICAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3hzZC9TdHJpbmcuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy94c2QvU3RyaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmMThlMWUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3hzZC9TdHJpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwMyArMCwwIEBACi0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICogU3RyaW5nLmphdmEKLSAqCi0gKiBUaGlzIGZpbGUgd2FzIGF1dG8tZ2VuZXJhdGVkIGZyb20gV1NETAotICogYnkgdGhlIEFwYWNoZSBBeGlzMiB2ZXJzaW9uOiBTTkFQU0hPVCAgQnVpbHQgb24gOiBEZWMgMjEsIDIwMDcgKDA0OjAzOjMwIExLVCkKLSAqLwotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnhzZDsKLSAgICAgICAgICAgIAotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogIFN0cmluZyBiZWFuIGNsYXNzCi0gICAgICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgcHVibGljICBjbGFzcyBTdHJpbmcKLSAgICAgICAgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkJlYW57Ci0gICAgICAgIC8qIFRoaXMgdHlwZSB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIHBpZWNlIG9mIHNjaGVtYSB0aGF0IGhhZAotICAgICAgICAgICAgICAgIG5hbWUgPSBzdHJpbmcKLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgVVJJID0gaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEKLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgUHJlZml4ID0gbnMxCi0gICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIAotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2VuZXJhdGVQcmVmaXgoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHsKLSAgICAgICAgICAgIGlmKG5hbWVzcGFjZS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikpewotICAgICAgICAgICAgICAgIHJldHVybiAieHNkIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBmaWVsZCBmb3IgU3RyaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBqYXZhLmxhbmcuU3RyaW5nIGxvY2FsU3RyaW5nIDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBnZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyAgamF2YS5sYW5nLlN0cmluZyBnZXRTdHJpbmcoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxTdHJpbmc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBzZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gcGFyYW0gU3RyaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRTdHJpbmcoamF2YS5sYW5nLlN0cmluZyBwYXJhbSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYWxTdHJpbmc9cGFyYW07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbFN0cmluZy50b1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgLyoqCi0gICAgICogaXNSZWFkZXJNVE9NQXdhcmUKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlYWRlciBzdXBwb3J0cyBNVE9NCi0gICAgICovCi0gICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIHRyeXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGphdmEubGFuZy5Cb29sZWFuLlRSVUUuZXF1YWxzKHJlYWRlci5nZXRQcm9wZXJ0eShvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQ29uc3RhbnRzLklTX0RBVEFfSEFORExFUlNfQVdBUkUpKTsKLSAgICAgICAgfWNhdGNoKGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXNSZWFkZXJNVE9NQXdhcmU7Ci0gICB9Ci0gICAgIAotICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICoKLSAgICAgICAgKiBAcGFyYW0gcGFyZW50UU5hbWUKLSAgICAgICAgKiBAcGFyYW0gZmFjdG9yeQotICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICBwdWJsaWMgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgZ2V0T01FbGVtZW50ICgKLSAgICAgICAgICAgICAgIGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5KSB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlIGRhdGFTb3VyY2UgPQotICAgICAgICAgICAgICAgICAgICAgICBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJEYXRhU291cmNlKHRoaXMscGFyZW50UU5hbWUpewotCi0gICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcudGhpcy5zZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5PTVNvdXJjZWRFbGVtZW50SW1wbCgKLSAgICAgICAgICAgICAgIHBhcmVudFFOYW1lLGZhY3RvcnksZGF0YVNvdXJjZSk7Ci0gICAgICAgICAgICAKLSAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIsZmFsc2UpOwotICAgICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzZXJpYWxpemVUeXBlKQotICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotCi0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UgPSBudWxsOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHBhcmVudFFOYW1lLmdldFByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UgPSBwYXJlbnRRTmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZSAhPSBudWxsKSAmJiAobmFtZXNwYWNlLnRyaW0oKS5sZW5ndGgoKSA+IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHdyaXRlclByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3cml0ZXJQcmVmaXggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChuYW1lc3BhY2UsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHByZWZpeCwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCksIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIGlmIChzZXJpYWxpemVUeXBlKXsKLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpOwotICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlUHJlZml4ICE9IG51bGwpICYmIChuYW1lc3BhY2VQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkpewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVByZWZpeCsiOnN0cmluZyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgInN0cmluZyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbFN0cmluZz09bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgdGhlIG5pbCBhdHRyaWJ1dGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJzdHJpbmcgY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKGxvY2FsU3RyaW5nKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRoIHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCxqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgIGlmICh4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLQotICAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsIGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlTmFtZXNwYWNlID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVWYWx1ZTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBhdHRyaWJ1dGVQcmVmaXggKyAiOiIgKyBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSwgYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICBtZXRob2QgdG8gaGFuZGxlIFFuYW1lcwotICAgICAgICAgKi8KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZShqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhwcmVmaXggKyAiOiIgKyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaS5lIHRoaXMgaXMgdGhlIGRlZmF1bHQgbmFtZXNwYWNlCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lcyhqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lW10gcW5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICBpZiAocW5hbWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHRvIHN0b3JlIHRoaXMgZGF0YSB1bnRpbCBsYXN0IG1vbWVudCBzaW5jZSBpdCBpcyBub3QgcG9zc2libGUgdG8gd3JpdGUgYW55Ci0gICAgICAgICAgICAgICAgLy8gbmFtZXNwYWNlIGRhdGEgYWZ0ZXIgd3JpdGluZyB0aGUgY2hhcmFjdG9yIGRhdGEKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIHN0cmluZ1RvV3JpdGUgPSBuZXcgamF2YS5sYW5nLlN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHFuYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKCIgIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlVVJJID0gcW5hbWVzW2ldLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocHJlZml4ID09IG51bGwpIHx8IChwcmVmaXgubGVuZ3RoKCkgPT0gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChwcmVmaXgpLmFwcGVuZCgiOiIpLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHN0cmluZ1RvV3JpdGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0KLSAgICAgICAgIC8qKgotICAgICAgICAgKiBSZWdpc3RlciBhIG5hbWVzcGFjZSBwcmVmaXgKLSAgICAgICAgICovCi0gICAgICAgICBwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgcmVnaXN0ZXJQcmVmaXgoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLCBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlICh4bWxXcml0ZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gcHJlZml4OwotICAgICAgICAgICAgfQotCi0KLSAgCi0gICAgICAgIC8qKgotICAgICAgICAqIGRhdGFiaW5kaW5nIG1ldGhvZCB0byBnZXQgYW4gWE1MIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0Ci0gICAgICAgICoKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIGdldFB1bGxQYXJzZXIoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxTmFtZSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgZWxlbWVudExpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGF0dHJpYkxpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlci5FTEVNRU5UX1RFWFQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsU3RyaW5nICE9IG51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbFN0cmluZykpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJzdHJpbmcgY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXJJbXBsKHFOYW1lLCBlbGVtZW50TGlzdC50b0FycmF5KCksIGF0dHJpYkxpc3QudG9BcnJheSgpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gIAotCi0gICAgIC8qKgotICAgICAgKiAgRmFjdG9yeSBjbGFzcyB0aGF0IGtlZXBzIHRoZSBwYXJzZSBtZXRob2QKLSAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5ewotCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBmcm9tU3RyaW5nKGphdmEubGFuZy5TdHJpbmcgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkpewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmV0dXJuVmFsdWUgPSBuZXcgIFN0cmluZygpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZS5zZXRTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcodmFsdWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBmcm9tU3RyaW5nKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50LmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gY29udGVudC5zdWJzdHJpbmcoMCxjb250ZW50LmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVyaSA9IHhtbFN0cmVhbVJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LG5hbWVzcGFjZVVyaSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcuRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsIiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAKLQotICAgICAgICAvKioKLSAgICAgICAgKiBzdGF0aWMgbWV0aG9kIHRvIGNyZWF0ZSB0aGUgb2JqZWN0Ci0gICAgICAgICogUHJlY29uZGl0aW9uOiAgSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIGN1cnJlbnQgb3IgbmV4dCBzdGFydCBlbGVtZW50IHN0YXJ0cyB0aGlzIG9iamVjdCBhbmQgYW55IGludGVydmVuaW5nIHJlYWRlciBldmVudHMgYXJlIGlnbm9yYWJsZQotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIG5vdCBhbiBlbGVtZW50LCBpdCBpcyBhIGNvbXBsZXggdHlwZSBhbmQgdGhlIHJlYWRlciBpcyBhdCB0aGUgZXZlbnQganVzdCBhZnRlciB0aGUgb3V0ZXIgc3RhcnQgZWxlbWVudAotICAgICAgICAqIFBvc3Rjb25kaXRpb246IElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCBpdHMgZW5kIGVsZW1lbnQKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBhIGNvbXBsZXggdHlwZSwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IHRoZSBlbmQgZWxlbWVudCBvZiBpdHMgb3V0ZXIgZWxlbWVudAotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBwYXJzZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uewotICAgICAgICAgICAgU3RyaW5nIG9iamVjdCA9Ci0gICAgICAgICAgICAgICAgbmV3IFN0cmluZygpOwotCi0gICAgICAgICAgICBpbnQgZXZlbnQ7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5pbGxhYmxlVmFsdWUgPSBudWxsOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSIiOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2V1cmkgPSIiOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSAoIXJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICYmICFyZWFkZXIuaXNFbmRFbGVtZW50KCkpCi0gICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiKSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGZ1bGxUeXBlTmFtZSA9IHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiKTsKLSAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUhPW51bGwpewotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zUHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoMCxmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IG5zUHJlZml4PT1udWxsPyIiOm5zUHJlZml4OwotCi0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgdHlwZSA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSsxKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEic3RyaW5nIi5lcXVhbHModHlwZSkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2ZpbmQgbmFtZXNwYWNlIGZvciB0aGUgcHJlZml4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNVcmkgPSByZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShuc1ByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoU3RyaW5nKW9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkLkV4dGVuc2lvbk1hcHBlci5nZXRUeXBlT2JqZWN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zVXJpLHR5cGUscmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIE5vdGUgYWxsIGF0dHJpYnV0ZXMgdGhhdCB3ZXJlIGhhbmRsZWQuIFVzZWQgdG8gZGlmZmVyIG5vcm1hbCBhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgICAgLy8gZnJvbSBhbnlBdHRyaWJ1dGVzLgotICAgICAgICAgICAgICAgIGphdmEudXRpbC5WZWN0b3IgaGFuZGxlZEF0dHJpYnV0ZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlKCFyZWFkZXIuaXNFbmRFbGVtZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50ID0gcmVhZGVyLmdldEVsZW1lbnRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0U3RyaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcoY29udGVudCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIEVuZCBvZiBpZiBmb3IgZXhwZWN0ZWQgcHJvcGVydHkgc3RhcnQgZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHN0YXJ0IGVsZW1lbnQgd2UgYXJlIG5vdCBleHBlY3RpbmcgaW5kaWNhdGVzIGFuIGludmFsaWQgcGFyYW1ldGVyIHdhcyBwYXNzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIlVuZXhwZWN0ZWQgc3ViZWxlbWVudCAiICsgcmVhZGVyLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBlbmQgb2Ygd2hpbGUgbG9vcAotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLQotCi0gICAgICAgICAgICB9IGNhdGNoIChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEubGFuZy5FeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBvYmplY3Q7Ci0gICAgICAgIH0KLQotICAgICAgICB9Ly9lbmQgb2YgZmFjdG9yeSBjbGFzcwotCi0gICAgICAgIAotCi0gICAgICAgIH0KLSAgICAgICAgICAgCi0gICAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3hzZC9UaW1lLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMveHNkL1RpbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWY1YmU4MC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMveHNkL1RpbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwMyArMCwwIEBACi0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICogVGltZS5qYXZhCi0gKgotICogVGhpcyBmaWxlIHdhcyBhdXRvLWdlbmVyYXRlZCBmcm9tIFdTREwKLSAqIGJ5IHRoZSBBcGFjaGUgQXhpczIgdmVyc2lvbjogU05BUFNIT1QgIEJ1aWx0IG9uIDogRGVjIDIxLCAyMDA3ICgwNDowMzozMCBMS1QpCi0gKi8KLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy54c2Q7Ci0gICAgICAgICAgICAKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqICBUaW1lIGJlYW4gY2xhc3MKLSAgICAgICAgICAgICovCi0gICAgICAgIAotICAgICAgICBwdWJsaWMgIGNsYXNzIFRpbWUKLSAgICAgICAgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkJlYW57Ci0gICAgICAgIC8qIFRoaXMgdHlwZSB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIHBpZWNlIG9mIHNjaGVtYSB0aGF0IGhhZAotICAgICAgICAgICAgICAgIG5hbWUgPSB0aW1lCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFVSSSA9IGh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFByZWZpeCA9IG5zMQotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdlbmVyYXRlUHJlZml4KGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB7Ci0gICAgICAgICAgICBpZihuYW1lc3BhY2UuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpKXsKLSAgICAgICAgICAgICAgICByZXR1cm4gInhzZCI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgfQotCi0gICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogZmllbGQgZm9yIFRpbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuVGltZSBsb2NhbFRpbWUgOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIGdldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLlRpbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuVGltZSBnZXRUaW1lKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsVGltZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIHNldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSBwYXJhbSBUaW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRUaW1lKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuVGltZSBwYXJhbSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYWxUaW1lPXBhcmFtOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxUaW1lLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAvKioKLSAgICAgKiBpc1JlYWRlck1UT01Bd2FyZQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVhZGVyIHN1cHBvcnRzIE1UT00KLSAgICAgKi8KLSAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKLSAgICAgICAgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICAKLSAgICAgICAgdHJ5ewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gamF2YS5sYW5nLkJvb2xlYW4uVFJVRS5lcXVhbHMocmVhZGVyLmdldFByb3BlcnR5KG9yZy5hcGFjaGUuYXhpb20ub20uT01Db25zdGFudHMuSVNfREFUQV9IQU5ETEVSU19BV0FSRSkpOwotICAgICAgICB9Y2F0Y2goamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpc1JlYWRlck1UT01Bd2FyZTsKLSAgIH0KLSAgICAgCi0gICAgIAotICAgICAgICAvKioKLSAgICAgICAgKgotICAgICAgICAqIEBwYXJhbSBwYXJlbnRRTmFtZQotICAgICAgICAqIEBwYXJhbSBmYWN0b3J5Ci0gICAgICAgICogQHJldHVybiBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudAotICAgICAgICAqLwotICAgICAgIHB1YmxpYyBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCBnZXRPTUVsZW1lbnQgKAotICAgICAgICAgICAgICAgZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnkpIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTURhdGFTb3VyY2UgZGF0YVNvdXJjZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkRhdGFTb3VyY2UodGhpcyxwYXJlbnRRTmFtZSl7Ci0KLSAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgIFRpbWUudGhpcy5zZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5PTVNvdXJjZWRFbGVtZW50SW1wbCgKLSAgICAgICAgICAgICAgIHBhcmVudFFOYW1lLGZhY3RvcnksZGF0YVNvdXJjZSk7Ci0gICAgICAgICAgICAKLSAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIsZmFsc2UpOwotICAgICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzZXJpYWxpemVUeXBlKQotICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotCi0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UgPSBudWxsOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHBhcmVudFFOYW1lLmdldFByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UgPSBwYXJlbnRRTmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZSAhPSBudWxsKSAmJiAobmFtZXNwYWNlLnRyaW0oKS5sZW5ndGgoKSA+IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHdyaXRlclByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3cml0ZXJQcmVmaXggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChuYW1lc3BhY2UsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHByZWZpeCwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCksIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIGlmIChzZXJpYWxpemVUeXBlKXsKLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpOwotICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlUHJlZml4ICE9IG51bGwpICYmIChuYW1lc3BhY2VQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkpewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVByZWZpeCsiOnRpbWUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aW1lIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsVGltZT09bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgdGhlIG5pbCBhdHRyaWJ1dGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJ0aW1lIGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsVGltZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGggdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgcHJlZml4LGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgaWYgKHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotCi0gICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotCi0gICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSwgamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVOYW1lc3BhY2UgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgoYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVZhbHVlOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IGF0dHJpYnV0ZVByZWZpeCArICI6IiArIHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLCBhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAvKioKLSAgICAgICAgICogIG1ldGhvZCB0byBoYW5kbGUgUW5hbWVzCi0gICAgICAgICAqLwotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHByZWZpeCArICI6IiArIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBpLmUgdGhpcyBpcyB0aGUgZGVmYXVsdCBuYW1lc3BhY2UKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVzKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWVbXSBxbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgIGlmIChxbmFtZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gc3RvcmUgdGhpcyBkYXRhIHVudGlsIGxhc3QgbW9tZW50IHNpbmNlIGl0IGlzIG5vdCBwb3NzaWJsZSB0byB3cml0ZSBhbnkKLSAgICAgICAgICAgICAgICAvLyBuYW1lc3BhY2UgZGF0YSBhZnRlciB3cml0aW5nIHRoZSBjaGFyYWN0b3IgZGF0YQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmdCdWZmZXIgc3RyaW5nVG9Xcml0ZSA9IG5ldyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcW5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQoIiAiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VVUkkgPSBxbmFtZXNbaV0uZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwcmVmaXggPT0gbnVsbCkgfHwgKHByZWZpeC5sZW5ndGgoKSA9PSAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKHByZWZpeCkuYXBwZW5kKCI6IikuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMoc3RyaW5nVG9Xcml0ZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAqIFJlZ2lzdGVyIGEgbmFtZXNwYWNlIHByZWZpeAotICAgICAgICAgKi8KLSAgICAgICAgIHByaXZhdGUgamF2YS5sYW5nLlN0cmluZyByZWdpc3RlclByZWZpeChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHhtbFdyaXRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiBwcmVmaXg7Ci0gICAgICAgICAgICB9Ci0KLQotICAKLSAgICAgICAgLyoqCi0gICAgICAgICogZGF0YWJpbmRpbmcgbWV0aG9kIHRvIGdldCBhbiBYTUwgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QKLSAgICAgICAgKgotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgZ2V0UHVsbFBhcnNlcihqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFOYW1lKQotICAgICAgICAgICAgICAgICAgICB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBlbGVtZW50TGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgYXR0cmliTGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVyLkVMRU1FTlRfVEVYVCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxUaW1lICE9IG51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbFRpbWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigidGltZSBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlckltcGwocU5hbWUsIGVsZW1lbnRMaXN0LnRvQXJyYXkoKSwgYXR0cmliTGlzdC50b0FycmF5KCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgCi0KLSAgICAgLyoqCi0gICAgICAqICBGYWN0b3J5IGNsYXNzIHRoYXQga2VlcHMgdGhlIHBhcnNlIG1ldGhvZAotICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3Rvcnl7Ci0KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgVGltZSBmcm9tU3RyaW5nKGphdmEubGFuZy5TdHJpbmcgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkpewotICAgICAgICAgICAgICAgICAgICBUaW1lIHJldHVyblZhbHVlID0gbmV3ICBUaW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlLnNldFRpbWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9UaW1lKHZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBUaW1lIGZyb21TdHJpbmcoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBjb250ZW50LnN1YnN0cmluZygwLGNvbnRlbnQuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVXJpID0geG1sU3RyZWFtUmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUaW1lLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LG5hbWVzcGFjZVVyaSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUaW1lLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LCIiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgCi0KLSAgICAgICAgLyoqCi0gICAgICAgICogc3RhdGljIG1ldGhvZCB0byBjcmVhdGUgdGhlIG9iamVjdAotICAgICAgICAqIFByZWNvbmRpdGlvbjogIElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSBjdXJyZW50IG9yIG5leHQgc3RhcnQgZWxlbWVudCBzdGFydHMgdGhpcyBvYmplY3QgYW5kIGFueSBpbnRlcnZlbmluZyByZWFkZXIgZXZlbnRzIGFyZSBpZ25vcmFibGUKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBub3QgYW4gZWxlbWVudCwgaXQgaXMgYSBjb21wbGV4IHR5cGUgYW5kIHRoZSByZWFkZXIgaXMgYXQgdGhlIGV2ZW50IGp1c3QgYWZ0ZXIgdGhlIG91dGVyIHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgKiBQb3N0Y29uZGl0aW9uOiBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgaXRzIGVuZCBlbGVtZW50Ci0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgYSBjb21wbGV4IHR5cGUsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCB0aGUgZW5kIGVsZW1lbnQgb2YgaXRzIG91dGVyIGVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBUaW1lIHBhcnNlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb257Ci0gICAgICAgICAgICBUaW1lIG9iamVjdCA9Ci0gICAgICAgICAgICAgICAgbmV3IFRpbWUoKTsKLQotICAgICAgICAgICAgaW50IGV2ZW50OwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuaWxsYWJsZVZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0iIjsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNldXJpID0iIjsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUgKCFyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAmJiAhcmVhZGVyLmlzRW5kRWxlbWVudCgpKQotICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIikhPW51bGwpewotICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBmdWxsVHlwZU5hbWUgPSByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIik7Ci0gICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1ByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKDAsZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBuc1ByZWZpeD09bnVsbD8iIjpuc1ByZWZpeDsKLQotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHR5cGUgPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikrMSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghInRpbWUiLmVxdWFscyh0eXBlKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZmluZCBuYW1lc3BhY2UgZm9yIHRoZSBwcmVmaXgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1VyaSA9IHJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKG5zUHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChUaW1lKW9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkLkV4dGVuc2lvbk1hcHBlci5nZXRUeXBlT2JqZWN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zVXJpLHR5cGUscmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIE5vdGUgYWxsIGF0dHJpYnV0ZXMgdGhhdCB3ZXJlIGhhbmRsZWQuIFVzZWQgdG8gZGlmZmVyIG5vcm1hbCBhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgICAgLy8gZnJvbSBhbnlBdHRyaWJ1dGVzLgotICAgICAgICAgICAgICAgIGphdmEudXRpbC5WZWN0b3IgaGFuZGxlZEF0dHJpYnV0ZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlKCFyZWFkZXIuaXNFbmRFbGVtZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50ID0gcmVhZGVyLmdldEVsZW1lbnRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0VGltZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvVGltZShjb250ZW50KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gRW5kIG9mIGlmIGZvciBleHBlY3RlZCBwcm9wZXJ0eSBzdGFydCBlbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgc3RhcnQgZWxlbWVudCB3ZSBhcmUgbm90IGV4cGVjdGluZyBpbmRpY2F0ZXMgYW4gaW52YWxpZCBwYXJhbWV0ZXIgd2FzIHBhc3NlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiVW5leHBlY3RlZCBzdWJlbGVtZW50ICIgKyByZWFkZXIuZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIGVuZCBvZiB3aGlsZSBsb29wCi0gICAgICAgICAgICAgICAgICAgICAgICAKLQotCi0KLSAgICAgICAgICAgIH0gY2F0Y2ggKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5sYW5nLkV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG9iamVjdDsKLSAgICAgICAgfQotCi0gICAgICAgIH0vL2VuZCBvZiBmYWN0b3J5IGNsYXNzCi0KLSAgICAgICAgCi0KLSAgICAgICAgfQotICAgICAgICAgICAKLSAgICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMveHNkL1Rva2VuLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMveHNkL1Rva2VuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1YmJmN2EuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3hzZC9Ub2tlbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAzICswLDAgQEAKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBUb2tlbi5qYXZhCi0gKgotICogVGhpcyBmaWxlIHdhcyBhdXRvLWdlbmVyYXRlZCBmcm9tIFdTREwKLSAqIGJ5IHRoZSBBcGFjaGUgQXhpczIgdmVyc2lvbjogU05BUFNIT1QgIEJ1aWx0IG9uIDogRGVjIDIxLCAyMDA3ICgwNDowMzozMCBMS1QpCi0gKi8KLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy54c2Q7Ci0gICAgICAgICAgICAKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqICBUb2tlbiBiZWFuIGNsYXNzCi0gICAgICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgcHVibGljICBjbGFzcyBUb2tlbgotICAgICAgICBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCQmVhbnsKLSAgICAgICAgLyogVGhpcyB0eXBlIHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgcGllY2Ugb2Ygc2NoZW1hIHRoYXQgaGFkCi0gICAgICAgICAgICAgICAgbmFtZSA9IHRva2VuCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFVSSSA9IGh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFByZWZpeCA9IG5zMQotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdlbmVyYXRlUHJlZml4KGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB7Ci0gICAgICAgICAgICBpZihuYW1lc3BhY2UuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpKXsKLSAgICAgICAgICAgICAgICByZXR1cm4gInhzZCI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgfQotCi0gICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogZmllbGQgZm9yIFRva2VuCi0gICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLlRva2VuIGxvY2FsVG9rZW4gOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIGdldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLlRva2VuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLlRva2VuIGdldFRva2VuKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsVG9rZW47Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBzZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gcGFyYW0gVG9rZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldFRva2VuKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuVG9rZW4gcGFyYW0pewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2FsVG9rZW49cGFyYW07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbFRva2VuLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAvKioKLSAgICAgKiBpc1JlYWRlck1UT01Bd2FyZQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVhZGVyIHN1cHBvcnRzIE1UT00KLSAgICAgKi8KLSAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKLSAgICAgICAgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICAKLSAgICAgICAgdHJ5ewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gamF2YS5sYW5nLkJvb2xlYW4uVFJVRS5lcXVhbHMocmVhZGVyLmdldFByb3BlcnR5KG9yZy5hcGFjaGUuYXhpb20ub20uT01Db25zdGFudHMuSVNfREFUQV9IQU5ETEVSU19BV0FSRSkpOwotICAgICAgICB9Y2F0Y2goamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpc1JlYWRlck1UT01Bd2FyZTsKLSAgIH0KLSAgICAgCi0gICAgIAotICAgICAgICAvKioKLSAgICAgICAgKgotICAgICAgICAqIEBwYXJhbSBwYXJlbnRRTmFtZQotICAgICAgICAqIEBwYXJhbSBmYWN0b3J5Ci0gICAgICAgICogQHJldHVybiBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudAotICAgICAgICAqLwotICAgICAgIHB1YmxpYyBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCBnZXRPTUVsZW1lbnQgKAotICAgICAgICAgICAgICAgZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnkpIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTURhdGFTb3VyY2UgZGF0YVNvdXJjZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkRhdGFTb3VyY2UodGhpcyxwYXJlbnRRTmFtZSl7Ci0KLSAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgIFRva2VuLnRoaXMuc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmxsb20uT01Tb3VyY2VkRWxlbWVudEltcGwoCi0gICAgICAgICAgICAgICBwYXJlbnRRTmFtZSxmYWN0b3J5LGRhdGFTb3VyY2UpOwotICAgICAgICAgICAgCi0gICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyLGZhbHNlKTsKLSAgICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VyaWFsaXplVHlwZSkKLSAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLQotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBwYXJlbnRRTmFtZS5nZXRQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlID0gcGFyZW50UU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2UgIT0gbnVsbCkgJiYgKG5hbWVzcGFjZS50cmltKCkubGVuZ3RoKCkgPiAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB3cml0ZXJQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAod3JpdGVyUHJlZml4ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQobmFtZXNwYWNlLCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwcmVmaXgsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICBpZiAoc2VyaWFsaXplVHlwZSl7Ci0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKTsKLSAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZVByZWZpeCAhPSBudWxsKSAmJiAobmFtZXNwYWNlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApKXsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VQcmVmaXgrIjp0b2tlbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgInRva2VuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsVG9rZW49PW51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIHRoZSBuaWwgYXR0cmlidXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigidG9rZW4gY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxUb2tlbikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGggdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgcHJlZml4LGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgaWYgKHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotCi0gICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotCi0gICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSwgamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVOYW1lc3BhY2UgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgoYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVZhbHVlOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IGF0dHJpYnV0ZVByZWZpeCArICI6IiArIHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLCBhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAvKioKLSAgICAgICAgICogIG1ldGhvZCB0byBoYW5kbGUgUW5hbWVzCi0gICAgICAgICAqLwotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHByZWZpeCArICI6IiArIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBpLmUgdGhpcyBpcyB0aGUgZGVmYXVsdCBuYW1lc3BhY2UKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVzKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWVbXSBxbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgIGlmIChxbmFtZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gc3RvcmUgdGhpcyBkYXRhIHVudGlsIGxhc3QgbW9tZW50IHNpbmNlIGl0IGlzIG5vdCBwb3NzaWJsZSB0byB3cml0ZSBhbnkKLSAgICAgICAgICAgICAgICAvLyBuYW1lc3BhY2UgZGF0YSBhZnRlciB3cml0aW5nIHRoZSBjaGFyYWN0b3IgZGF0YQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmdCdWZmZXIgc3RyaW5nVG9Xcml0ZSA9IG5ldyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcW5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQoIiAiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VVUkkgPSBxbmFtZXNbaV0uZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwcmVmaXggPT0gbnVsbCkgfHwgKHByZWZpeC5sZW5ndGgoKSA9PSAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKHByZWZpeCkuYXBwZW5kKCI6IikuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMoc3RyaW5nVG9Xcml0ZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAqIFJlZ2lzdGVyIGEgbmFtZXNwYWNlIHByZWZpeAotICAgICAgICAgKi8KLSAgICAgICAgIHByaXZhdGUgamF2YS5sYW5nLlN0cmluZyByZWdpc3RlclByZWZpeChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHhtbFdyaXRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiBwcmVmaXg7Ci0gICAgICAgICAgICB9Ci0KLQotICAKLSAgICAgICAgLyoqCi0gICAgICAgICogZGF0YWJpbmRpbmcgbWV0aG9kIHRvIGdldCBhbiBYTUwgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QKLSAgICAgICAgKgotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgZ2V0UHVsbFBhcnNlcihqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFOYW1lKQotICAgICAgICAgICAgICAgICAgICB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBlbGVtZW50TGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgYXR0cmliTGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVyLkVMRU1FTlRfVEVYVCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxUb2tlbiAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxUb2tlbikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJ0b2tlbiBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlckltcGwocU5hbWUsIGVsZW1lbnRMaXN0LnRvQXJyYXkoKSwgYXR0cmliTGlzdC50b0FycmF5KCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgCi0KLSAgICAgLyoqCi0gICAgICAqICBGYWN0b3J5IGNsYXNzIHRoYXQga2VlcHMgdGhlIHBhcnNlIG1ldGhvZAotICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3Rvcnl7Ci0KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgVG9rZW4gZnJvbVN0cmluZyhqYXZhLmxhbmcuU3RyaW5nIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJKXsKLSAgICAgICAgICAgICAgICAgICAgVG9rZW4gcmV0dXJuVmFsdWUgPSBuZXcgIFRva2VuKCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlLnNldFRva2VuKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvVG9rZW4odmFsdWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIFRva2VuIGZyb21TdHJpbmcoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBjb250ZW50LnN1YnN0cmluZygwLGNvbnRlbnQuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVXJpID0geG1sU3RyZWFtUmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUb2tlbi5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCxuYW1lc3BhY2VVcmkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVG9rZW4uRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsIiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAKLQotICAgICAgICAvKioKLSAgICAgICAgKiBzdGF0aWMgbWV0aG9kIHRvIGNyZWF0ZSB0aGUgb2JqZWN0Ci0gICAgICAgICogUHJlY29uZGl0aW9uOiAgSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIGN1cnJlbnQgb3IgbmV4dCBzdGFydCBlbGVtZW50IHN0YXJ0cyB0aGlzIG9iamVjdCBhbmQgYW55IGludGVydmVuaW5nIHJlYWRlciBldmVudHMgYXJlIGlnbm9yYWJsZQotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIG5vdCBhbiBlbGVtZW50LCBpdCBpcyBhIGNvbXBsZXggdHlwZSBhbmQgdGhlIHJlYWRlciBpcyBhdCB0aGUgZXZlbnQganVzdCBhZnRlciB0aGUgb3V0ZXIgc3RhcnQgZWxlbWVudAotICAgICAgICAqIFBvc3Rjb25kaXRpb246IElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCBpdHMgZW5kIGVsZW1lbnQKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBhIGNvbXBsZXggdHlwZSwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IHRoZSBlbmQgZWxlbWVudCBvZiBpdHMgb3V0ZXIgZWxlbWVudAotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFRva2VuIHBhcnNlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb257Ci0gICAgICAgICAgICBUb2tlbiBvYmplY3QgPQotICAgICAgICAgICAgICAgIG5ldyBUb2tlbigpOwotCi0gICAgICAgICAgICBpbnQgZXZlbnQ7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5pbGxhYmxlVmFsdWUgPSBudWxsOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSIiOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2V1cmkgPSIiOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSAoIXJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICYmICFyZWFkZXIuaXNFbmRFbGVtZW50KCkpCi0gICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiKSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGZ1bGxUeXBlTmFtZSA9IHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiKTsKLSAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUhPW51bGwpewotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zUHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoMCxmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IG5zUHJlZml4PT1udWxsPyIiOm5zUHJlZml4OwotCi0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgdHlwZSA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSsxKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEidG9rZW4iLmVxdWFscyh0eXBlKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZmluZCBuYW1lc3BhY2UgZm9yIHRoZSBwcmVmaXgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1VyaSA9IHJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKG5zUHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChUb2tlbilvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnhzZC5FeHRlbnNpb25NYXBwZXIuZ2V0VHlwZU9iamVjdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc1VyaSx0eXBlLHJlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBOb3RlIGFsbCBhdHRyaWJ1dGVzIHRoYXQgd2VyZSBoYW5kbGVkLiBVc2VkIHRvIGRpZmZlciBub3JtYWwgYXR0cmlidXRlcwotICAgICAgICAgICAgICAgIC8vIGZyb20gYW55QXR0cmlidXRlcy4KLSAgICAgICAgICAgICAgICBqYXZhLnV0aWwuVmVjdG9yIGhhbmRsZWRBdHRyaWJ1dGVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSghcmVhZGVyLmlzRW5kRWxlbWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCA9IHJlYWRlci5nZXRFbGVtZW50VGV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldFRva2VuKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9Ub2tlbihjb250ZW50KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gRW5kIG9mIGlmIGZvciBleHBlY3RlZCBwcm9wZXJ0eSBzdGFydCBlbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgc3RhcnQgZWxlbWVudCB3ZSBhcmUgbm90IGV4cGVjdGluZyBpbmRpY2F0ZXMgYW4gaW52YWxpZCBwYXJhbWV0ZXIgd2FzIHBhc3NlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiVW5leHBlY3RlZCBzdWJlbGVtZW50ICIgKyByZWFkZXIuZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIGVuZCBvZiB3aGlsZSBsb29wCi0gICAgICAgICAgICAgICAgICAgICAgICAKLQotCi0KLSAgICAgICAgICAgIH0gY2F0Y2ggKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5sYW5nLkV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG9iamVjdDsKLSAgICAgICAgfQotCi0gICAgICAgIH0vL2VuZCBvZiBmYWN0b3J5IGNsYXNzCi0KLSAgICAgICAgCi0KLSAgICAgICAgfQotICAgICAgICAgICAKLSAgICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMveHNkL1Vuc2lnbmVkQnl0ZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3hzZC9VbnNpZ25lZEJ5dGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE5ZTJlMy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMveHNkL1Vuc2lnbmVkQnl0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAzICswLDAgQEAKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBVbnNpZ25lZEJ5dGUuamF2YQotICoKLSAqIFRoaXMgZmlsZSB3YXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBXU0RMCi0gKiBieSB0aGUgQXBhY2hlIEF4aXMyIHZlcnNpb246IFNOQVBTSE9UICBCdWlsdCBvbiA6IERlYyAyMSwgMjAwNyAoMDQ6MDM6MzAgTEtUKQotICovCi0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBwYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkOwotICAgICAgICAgICAgCi0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiAgVW5zaWduZWRCeXRlIGJlYW4gY2xhc3MKLSAgICAgICAgICAgICovCi0gICAgICAgIAotICAgICAgICBwdWJsaWMgIGNsYXNzIFVuc2lnbmVkQnl0ZQotICAgICAgICBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCQmVhbnsKLSAgICAgICAgLyogVGhpcyB0eXBlIHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgcGllY2Ugb2Ygc2NoZW1hIHRoYXQgaGFkCi0gICAgICAgICAgICAgICAgbmFtZSA9IHVuc2lnbmVkQnl0ZQotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBVUkkgPSBodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYQotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBQcmVmaXggPSBuczEKLSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgCi0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZW5lcmF0ZVByZWZpeChqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICAgICAgaWYobmFtZXNwYWNlLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSl7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJ4c2QiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgIH0KLQotICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIGZpZWxkIGZvciBVbnNpZ25lZEJ5dGUKLSAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuVW5zaWduZWRCeXRlIGxvY2FsVW5zaWduZWRCeXRlIDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBnZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5VbnNpZ25lZEJ5dGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuVW5zaWduZWRCeXRlIGdldFVuc2lnbmVkQnl0ZSgpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbFVuc2lnbmVkQnl0ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIHNldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSBwYXJhbSBVbnNpZ25lZEJ5dGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldFVuc2lnbmVkQnl0ZShvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLlVuc2lnbmVkQnl0ZSBwYXJhbSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYWxVbnNpZ25lZEJ5dGU9cGFyYW07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbFVuc2lnbmVkQnl0ZS50b1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgLyoqCi0gICAgICogaXNSZWFkZXJNVE9NQXdhcmUKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlYWRlciBzdXBwb3J0cyBNVE9NCi0gICAgICovCi0gICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIHRyeXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGphdmEubGFuZy5Cb29sZWFuLlRSVUUuZXF1YWxzKHJlYWRlci5nZXRQcm9wZXJ0eShvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQ29uc3RhbnRzLklTX0RBVEFfSEFORExFUlNfQVdBUkUpKTsKLSAgICAgICAgfWNhdGNoKGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXNSZWFkZXJNVE9NQXdhcmU7Ci0gICB9Ci0gICAgIAotICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICoKLSAgICAgICAgKiBAcGFyYW0gcGFyZW50UU5hbWUKLSAgICAgICAgKiBAcGFyYW0gZmFjdG9yeQotICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICBwdWJsaWMgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgZ2V0T01FbGVtZW50ICgKLSAgICAgICAgICAgICAgIGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5KSB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlIGRhdGFTb3VyY2UgPQotICAgICAgICAgICAgICAgICAgICAgICBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJEYXRhU291cmNlKHRoaXMscGFyZW50UU5hbWUpewotCi0gICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICBVbnNpZ25lZEJ5dGUudGhpcy5zZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5PTVNvdXJjZWRFbGVtZW50SW1wbCgKLSAgICAgICAgICAgICAgIHBhcmVudFFOYW1lLGZhY3RvcnksZGF0YVNvdXJjZSk7Ci0gICAgICAgICAgICAKLSAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIsZmFsc2UpOwotICAgICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzZXJpYWxpemVUeXBlKQotICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotCi0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UgPSBudWxsOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHBhcmVudFFOYW1lLmdldFByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UgPSBwYXJlbnRRTmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZSAhPSBudWxsKSAmJiAobmFtZXNwYWNlLnRyaW0oKS5sZW5ndGgoKSA+IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHdyaXRlclByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3cml0ZXJQcmVmaXggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChuYW1lc3BhY2UsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHByZWZpeCwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCksIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIGlmIChzZXJpYWxpemVUeXBlKXsKLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpOwotICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlUHJlZml4ICE9IG51bGwpICYmIChuYW1lc3BhY2VQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkpewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVByZWZpeCsiOnVuc2lnbmVkQnl0ZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgInVuc2lnbmVkQnl0ZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbFVuc2lnbmVkQnl0ZT09bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgdGhlIG5pbCBhdHRyaWJ1dGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJ1bnNpZ25lZEJ5dGUgY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxVbnNpZ25lZEJ5dGUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRoIHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCxqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgIGlmICh4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLQotICAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsIGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlTmFtZXNwYWNlID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVWYWx1ZTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBhdHRyaWJ1dGVQcmVmaXggKyAiOiIgKyBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSwgYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICBtZXRob2QgdG8gaGFuZGxlIFFuYW1lcwotICAgICAgICAgKi8KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZShqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhwcmVmaXggKyAiOiIgKyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaS5lIHRoaXMgaXMgdGhlIGRlZmF1bHQgbmFtZXNwYWNlCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lcyhqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lW10gcW5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICBpZiAocW5hbWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHRvIHN0b3JlIHRoaXMgZGF0YSB1bnRpbCBsYXN0IG1vbWVudCBzaW5jZSBpdCBpcyBub3QgcG9zc2libGUgdG8gd3JpdGUgYW55Ci0gICAgICAgICAgICAgICAgLy8gbmFtZXNwYWNlIGRhdGEgYWZ0ZXIgd3JpdGluZyB0aGUgY2hhcmFjdG9yIGRhdGEKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIHN0cmluZ1RvV3JpdGUgPSBuZXcgamF2YS5sYW5nLlN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHFuYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKCIgIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlVVJJID0gcW5hbWVzW2ldLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocHJlZml4ID09IG51bGwpIHx8IChwcmVmaXgubGVuZ3RoKCkgPT0gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChwcmVmaXgpLmFwcGVuZCgiOiIpLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHN0cmluZ1RvV3JpdGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0KLSAgICAgICAgIC8qKgotICAgICAgICAgKiBSZWdpc3RlciBhIG5hbWVzcGFjZSBwcmVmaXgKLSAgICAgICAgICovCi0gICAgICAgICBwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgcmVnaXN0ZXJQcmVmaXgoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLCBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlICh4bWxXcml0ZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gcHJlZml4OwotICAgICAgICAgICAgfQotCi0KLSAgCi0gICAgICAgIC8qKgotICAgICAgICAqIGRhdGFiaW5kaW5nIG1ldGhvZCB0byBnZXQgYW4gWE1MIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0Ci0gICAgICAgICoKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIGdldFB1bGxQYXJzZXIoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxTmFtZSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgZWxlbWVudExpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGF0dHJpYkxpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlci5FTEVNRU5UX1RFWFQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsVW5zaWduZWRCeXRlICE9IG51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbFVuc2lnbmVkQnl0ZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJ1bnNpZ25lZEJ5dGUgY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXJJbXBsKHFOYW1lLCBlbGVtZW50TGlzdC50b0FycmF5KCksIGF0dHJpYkxpc3QudG9BcnJheSgpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gIAotCi0gICAgIC8qKgotICAgICAgKiAgRmFjdG9yeSBjbGFzcyB0aGF0IGtlZXBzIHRoZSBwYXJzZSBtZXRob2QKLSAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5ewotCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIFVuc2lnbmVkQnl0ZSBmcm9tU3RyaW5nKGphdmEubGFuZy5TdHJpbmcgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkpewotICAgICAgICAgICAgICAgICAgICBVbnNpZ25lZEJ5dGUgcmV0dXJuVmFsdWUgPSBuZXcgIFVuc2lnbmVkQnl0ZSgpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZS5zZXRVbnNpZ25lZEJ5dGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9VbnNpZ25lZEJ5dGUodmFsdWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIFVuc2lnbmVkQnl0ZSBmcm9tU3RyaW5nKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50LmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gY29udGVudC5zdWJzdHJpbmcoMCxjb250ZW50LmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVyaSA9IHhtbFN0cmVhbVJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVW5zaWduZWRCeXRlLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LG5hbWVzcGFjZVVyaSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBVbnNpZ25lZEJ5dGUuRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsIiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAKLQotICAgICAgICAvKioKLSAgICAgICAgKiBzdGF0aWMgbWV0aG9kIHRvIGNyZWF0ZSB0aGUgb2JqZWN0Ci0gICAgICAgICogUHJlY29uZGl0aW9uOiAgSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIGN1cnJlbnQgb3IgbmV4dCBzdGFydCBlbGVtZW50IHN0YXJ0cyB0aGlzIG9iamVjdCBhbmQgYW55IGludGVydmVuaW5nIHJlYWRlciBldmVudHMgYXJlIGlnbm9yYWJsZQotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIG5vdCBhbiBlbGVtZW50LCBpdCBpcyBhIGNvbXBsZXggdHlwZSBhbmQgdGhlIHJlYWRlciBpcyBhdCB0aGUgZXZlbnQganVzdCBhZnRlciB0aGUgb3V0ZXIgc3RhcnQgZWxlbWVudAotICAgICAgICAqIFBvc3Rjb25kaXRpb246IElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCBpdHMgZW5kIGVsZW1lbnQKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBhIGNvbXBsZXggdHlwZSwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IHRoZSBlbmQgZWxlbWVudCBvZiBpdHMgb3V0ZXIgZWxlbWVudAotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFVuc2lnbmVkQnl0ZSBwYXJzZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uewotICAgICAgICAgICAgVW5zaWduZWRCeXRlIG9iamVjdCA9Ci0gICAgICAgICAgICAgICAgbmV3IFVuc2lnbmVkQnl0ZSgpOwotCi0gICAgICAgICAgICBpbnQgZXZlbnQ7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5pbGxhYmxlVmFsdWUgPSBudWxsOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSIiOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2V1cmkgPSIiOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSAoIXJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICYmICFyZWFkZXIuaXNFbmRFbGVtZW50KCkpCi0gICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiKSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGZ1bGxUeXBlTmFtZSA9IHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiKTsKLSAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUhPW51bGwpewotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zUHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoMCxmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IG5zUHJlZml4PT1udWxsPyIiOm5zUHJlZml4OwotCi0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgdHlwZSA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSsxKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEidW5zaWduZWRCeXRlIi5lcXVhbHModHlwZSkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2ZpbmQgbmFtZXNwYWNlIGZvciB0aGUgcHJlZml4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNVcmkgPSByZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShuc1ByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoVW5zaWduZWRCeXRlKW9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkLkV4dGVuc2lvbk1hcHBlci5nZXRUeXBlT2JqZWN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zVXJpLHR5cGUscmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIE5vdGUgYWxsIGF0dHJpYnV0ZXMgdGhhdCB3ZXJlIGhhbmRsZWQuIFVzZWQgdG8gZGlmZmVyIG5vcm1hbCBhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgICAgLy8gZnJvbSBhbnlBdHRyaWJ1dGVzLgotICAgICAgICAgICAgICAgIGphdmEudXRpbC5WZWN0b3IgaGFuZGxlZEF0dHJpYnV0ZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlKCFyZWFkZXIuaXNFbmRFbGVtZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50ID0gcmVhZGVyLmdldEVsZW1lbnRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0VW5zaWduZWRCeXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9VbnNpZ25lZEJ5dGUoY29udGVudCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIEVuZCBvZiBpZiBmb3IgZXhwZWN0ZWQgcHJvcGVydHkgc3RhcnQgZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHN0YXJ0IGVsZW1lbnQgd2UgYXJlIG5vdCBleHBlY3RpbmcgaW5kaWNhdGVzIGFuIGludmFsaWQgcGFyYW1ldGVyIHdhcyBwYXNzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIlVuZXhwZWN0ZWQgc3ViZWxlbWVudCAiICsgcmVhZGVyLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBlbmQgb2Ygd2hpbGUgbG9vcAotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLQotCi0gICAgICAgICAgICB9IGNhdGNoIChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEubGFuZy5FeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBvYmplY3Q7Ci0gICAgICAgIH0KLQotICAgICAgICB9Ly9lbmQgb2YgZmFjdG9yeSBjbGFzcwotCi0gICAgICAgIAotCi0gICAgICAgIH0KLSAgICAgICAgICAgCi0gICAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3hzZC9VbnNpZ25lZEludC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3hzZC9VbnNpZ25lZEludC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmIyNDYwLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy94c2QvVW5zaWduZWRJbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwMyArMCwwIEBACi0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICogVW5zaWduZWRJbnQuamF2YQotICoKLSAqIFRoaXMgZmlsZSB3YXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBXU0RMCi0gKiBieSB0aGUgQXBhY2hlIEF4aXMyIHZlcnNpb246IFNOQVBTSE9UICBCdWlsdCBvbiA6IERlYyAyMSwgMjAwNyAoMDQ6MDM6MzAgTEtUKQotICovCi0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBwYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkOwotICAgICAgICAgICAgCi0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiAgVW5zaWduZWRJbnQgYmVhbiBjbGFzcwotICAgICAgICAgICAgKi8KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyAgY2xhc3MgVW5zaWduZWRJbnQKLSAgICAgICAgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkJlYW57Ci0gICAgICAgIC8qIFRoaXMgdHlwZSB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIHBpZWNlIG9mIHNjaGVtYSB0aGF0IGhhZAotICAgICAgICAgICAgICAgIG5hbWUgPSB1bnNpZ25lZEludAotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBVUkkgPSBodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYQotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBQcmVmaXggPSBuczEKLSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgCi0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZW5lcmF0ZVByZWZpeChqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICAgICAgaWYobmFtZXNwYWNlLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSl7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJ4c2QiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgIH0KLQotICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIGZpZWxkIGZvciBVbnNpZ25lZEludAotICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5VbnNpZ25lZEludCBsb2NhbFVuc2lnbmVkSW50IDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBnZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5VbnNpZ25lZEludAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5VbnNpZ25lZEludCBnZXRVbnNpZ25lZEludCgpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbFVuc2lnbmVkSW50OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgc2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtIHBhcmFtIFVuc2lnbmVkSW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRVbnNpZ25lZEludChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLlVuc2lnbmVkSW50IHBhcmFtKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2NhbFVuc2lnbmVkSW50PXBhcmFtOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxVbnNpZ25lZEludC50b1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgLyoqCi0gICAgICogaXNSZWFkZXJNVE9NQXdhcmUKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlYWRlciBzdXBwb3J0cyBNVE9NCi0gICAgICovCi0gICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIHRyeXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGphdmEubGFuZy5Cb29sZWFuLlRSVUUuZXF1YWxzKHJlYWRlci5nZXRQcm9wZXJ0eShvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQ29uc3RhbnRzLklTX0RBVEFfSEFORExFUlNfQVdBUkUpKTsKLSAgICAgICAgfWNhdGNoKGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXNSZWFkZXJNVE9NQXdhcmU7Ci0gICB9Ci0gICAgIAotICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICoKLSAgICAgICAgKiBAcGFyYW0gcGFyZW50UU5hbWUKLSAgICAgICAgKiBAcGFyYW0gZmFjdG9yeQotICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICBwdWJsaWMgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgZ2V0T01FbGVtZW50ICgKLSAgICAgICAgICAgICAgIGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5KSB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlIGRhdGFTb3VyY2UgPQotICAgICAgICAgICAgICAgICAgICAgICBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJEYXRhU291cmNlKHRoaXMscGFyZW50UU5hbWUpewotCi0gICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICBVbnNpZ25lZEludC50aGlzLnNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5sbG9tLk9NU291cmNlZEVsZW1lbnRJbXBsKAotICAgICAgICAgICAgICAgcGFyZW50UU5hbWUsZmFjdG9yeSxkYXRhU291cmNlKTsKLSAgICAgICAgICAgIAotICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcixmYWxzZSk7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNlcmlhbGl6ZVR5cGUpCi0gICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgCi0KLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gcGFyZW50UU5hbWUuZ2V0UHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZSA9IHBhcmVudFFOYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlICE9IG51bGwpICYmIChuYW1lc3BhY2UudHJpbSgpLmxlbmd0aCgpID4gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgd3JpdGVyUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdyaXRlclByZWZpeCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KG5hbWVzcGFjZSwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocHJlZml4LCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgaWYgKHNlcmlhbGl6ZVR5cGUpewotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIik7Ci0gICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2VQcmVmaXggIT0gbnVsbCkgJiYgKG5hbWVzcGFjZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlUHJlZml4KyI6dW5zaWduZWRJbnQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bnNpZ25lZEludCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbFVuc2lnbmVkSW50PT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZSB0aGUgbmlsIGF0dHJpYnV0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oInVuc2lnbmVkSW50IGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsVW5zaWduZWRJbnQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRoIHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCxqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgIGlmICh4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLQotICAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsIGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlTmFtZXNwYWNlID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVWYWx1ZTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBhdHRyaWJ1dGVQcmVmaXggKyAiOiIgKyBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSwgYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICBtZXRob2QgdG8gaGFuZGxlIFFuYW1lcwotICAgICAgICAgKi8KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZShqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhwcmVmaXggKyAiOiIgKyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaS5lIHRoaXMgaXMgdGhlIGRlZmF1bHQgbmFtZXNwYWNlCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lcyhqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lW10gcW5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICBpZiAocW5hbWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHRvIHN0b3JlIHRoaXMgZGF0YSB1bnRpbCBsYXN0IG1vbWVudCBzaW5jZSBpdCBpcyBub3QgcG9zc2libGUgdG8gd3JpdGUgYW55Ci0gICAgICAgICAgICAgICAgLy8gbmFtZXNwYWNlIGRhdGEgYWZ0ZXIgd3JpdGluZyB0aGUgY2hhcmFjdG9yIGRhdGEKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIHN0cmluZ1RvV3JpdGUgPSBuZXcgamF2YS5sYW5nLlN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHFuYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKCIgIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlVVJJID0gcW5hbWVzW2ldLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocHJlZml4ID09IG51bGwpIHx8IChwcmVmaXgubGVuZ3RoKCkgPT0gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChwcmVmaXgpLmFwcGVuZCgiOiIpLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHN0cmluZ1RvV3JpdGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0KLSAgICAgICAgIC8qKgotICAgICAgICAgKiBSZWdpc3RlciBhIG5hbWVzcGFjZSBwcmVmaXgKLSAgICAgICAgICovCi0gICAgICAgICBwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgcmVnaXN0ZXJQcmVmaXgoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLCBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlICh4bWxXcml0ZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gcHJlZml4OwotICAgICAgICAgICAgfQotCi0KLSAgCi0gICAgICAgIC8qKgotICAgICAgICAqIGRhdGFiaW5kaW5nIG1ldGhvZCB0byBnZXQgYW4gWE1MIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0Ci0gICAgICAgICoKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIGdldFB1bGxQYXJzZXIoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxTmFtZSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgZWxlbWVudExpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGF0dHJpYkxpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlci5FTEVNRU5UX1RFWFQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsVW5zaWduZWRJbnQgIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsVW5zaWduZWRJbnQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigidW5zaWduZWRJbnQgY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXJJbXBsKHFOYW1lLCBlbGVtZW50TGlzdC50b0FycmF5KCksIGF0dHJpYkxpc3QudG9BcnJheSgpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gIAotCi0gICAgIC8qKgotICAgICAgKiAgRmFjdG9yeSBjbGFzcyB0aGF0IGtlZXBzIHRoZSBwYXJzZSBtZXRob2QKLSAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5ewotCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIFVuc2lnbmVkSW50IGZyb21TdHJpbmcoamF2YS5sYW5nLlN0cmluZyB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSl7Ci0gICAgICAgICAgICAgICAgICAgIFVuc2lnbmVkSW50IHJldHVyblZhbHVlID0gbmV3ICBVbnNpZ25lZEludCgpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZS5zZXRVbnNpZ25lZEludCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1Vuc2lnbmVkSW50KHZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBVbnNpZ25lZEludCBmcm9tU3RyaW5nKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50LmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gY29udGVudC5zdWJzdHJpbmcoMCxjb250ZW50LmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVyaSA9IHhtbFN0cmVhbVJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVW5zaWduZWRJbnQuRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsbmFtZXNwYWNlVXJpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFVuc2lnbmVkSW50LkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LCIiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgCi0KLSAgICAgICAgLyoqCi0gICAgICAgICogc3RhdGljIG1ldGhvZCB0byBjcmVhdGUgdGhlIG9iamVjdAotICAgICAgICAqIFByZWNvbmRpdGlvbjogIElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSBjdXJyZW50IG9yIG5leHQgc3RhcnQgZWxlbWVudCBzdGFydHMgdGhpcyBvYmplY3QgYW5kIGFueSBpbnRlcnZlbmluZyByZWFkZXIgZXZlbnRzIGFyZSBpZ25vcmFibGUKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBub3QgYW4gZWxlbWVudCwgaXQgaXMgYSBjb21wbGV4IHR5cGUgYW5kIHRoZSByZWFkZXIgaXMgYXQgdGhlIGV2ZW50IGp1c3QgYWZ0ZXIgdGhlIG91dGVyIHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgKiBQb3N0Y29uZGl0aW9uOiBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgaXRzIGVuZCBlbGVtZW50Ci0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgYSBjb21wbGV4IHR5cGUsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCB0aGUgZW5kIGVsZW1lbnQgb2YgaXRzIG91dGVyIGVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBVbnNpZ25lZEludCBwYXJzZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uewotICAgICAgICAgICAgVW5zaWduZWRJbnQgb2JqZWN0ID0KLSAgICAgICAgICAgICAgICBuZXcgVW5zaWduZWRJbnQoKTsKLQotICAgICAgICAgICAgaW50IGV2ZW50OwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuaWxsYWJsZVZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0iIjsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNldXJpID0iIjsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUgKCFyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAmJiAhcmVhZGVyLmlzRW5kRWxlbWVudCgpKQotICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIikhPW51bGwpewotICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBmdWxsVHlwZU5hbWUgPSByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIik7Ci0gICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1ByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKDAsZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBuc1ByZWZpeD09bnVsbD8iIjpuc1ByZWZpeDsKLQotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHR5cGUgPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikrMSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghInVuc2lnbmVkSW50Ii5lcXVhbHModHlwZSkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2ZpbmQgbmFtZXNwYWNlIGZvciB0aGUgcHJlZml4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNVcmkgPSByZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShuc1ByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoVW5zaWduZWRJbnQpb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy54c2QuRXh0ZW5zaW9uTWFwcGVyLmdldFR5cGVPYmplY3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNVcmksdHlwZSxyZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gTm90ZSBhbGwgYXR0cmlidXRlcyB0aGF0IHdlcmUgaGFuZGxlZC4gVXNlZCB0byBkaWZmZXIgbm9ybWFsIGF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgICAvLyBmcm9tIGFueUF0dHJpYnV0ZXMuCi0gICAgICAgICAgICAgICAgamF2YS51dGlsLlZlY3RvciBoYW5kbGVkQXR0cmlidXRlcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUoIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQgPSByZWFkZXIuZ2V0RWxlbWVudFRleHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5zZXRVbnNpZ25lZEludCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvVW5zaWduZWRJbnQoY29udGVudCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIEVuZCBvZiBpZiBmb3IgZXhwZWN0ZWQgcHJvcGVydHkgc3RhcnQgZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHN0YXJ0IGVsZW1lbnQgd2UgYXJlIG5vdCBleHBlY3RpbmcgaW5kaWNhdGVzIGFuIGludmFsaWQgcGFyYW1ldGVyIHdhcyBwYXNzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIlVuZXhwZWN0ZWQgc3ViZWxlbWVudCAiICsgcmVhZGVyLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBlbmQgb2Ygd2hpbGUgbG9vcAotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLQotCi0gICAgICAgICAgICB9IGNhdGNoIChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEubGFuZy5FeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBvYmplY3Q7Ci0gICAgICAgIH0KLQotICAgICAgICB9Ly9lbmQgb2YgZmFjdG9yeSBjbGFzcwotCi0gICAgICAgIAotCi0gICAgICAgIH0KLSAgICAgICAgICAgCi0gICAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3hzZC9VbnNpZ25lZExvbmcuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy94c2QvVW5zaWduZWRMb25nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmZDgyMDIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3hzZC9VbnNpZ25lZExvbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwMyArMCwwIEBACi0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICogVW5zaWduZWRMb25nLmphdmEKLSAqCi0gKiBUaGlzIGZpbGUgd2FzIGF1dG8tZ2VuZXJhdGVkIGZyb20gV1NETAotICogYnkgdGhlIEFwYWNoZSBBeGlzMiB2ZXJzaW9uOiBTTkFQU0hPVCAgQnVpbHQgb24gOiBEZWMgMjEsIDIwMDcgKDA0OjAzOjMwIExLVCkKLSAqLwotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnhzZDsKLSAgICAgICAgICAgIAotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogIFVuc2lnbmVkTG9uZyBiZWFuIGNsYXNzCi0gICAgICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgcHVibGljICBjbGFzcyBVbnNpZ25lZExvbmcKLSAgICAgICAgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkJlYW57Ci0gICAgICAgIC8qIFRoaXMgdHlwZSB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIHBpZWNlIG9mIHNjaGVtYSB0aGF0IGhhZAotICAgICAgICAgICAgICAgIG5hbWUgPSB1bnNpZ25lZExvbmcKLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgVVJJID0gaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEKLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgUHJlZml4ID0gbnMxCi0gICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIAotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2VuZXJhdGVQcmVmaXgoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHsKLSAgICAgICAgICAgIGlmKG5hbWVzcGFjZS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikpewotICAgICAgICAgICAgICAgIHJldHVybiAieHNkIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBmaWVsZCBmb3IgVW5zaWduZWRMb25nCi0gICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLlVuc2lnbmVkTG9uZyBsb2NhbFVuc2lnbmVkTG9uZyA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgZ2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuVW5zaWduZWRMb25nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLlVuc2lnbmVkTG9uZyBnZXRVbnNpZ25lZExvbmcoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxVbnNpZ25lZExvbmc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBzZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gcGFyYW0gVW5zaWduZWRMb25nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRVbnNpZ25lZExvbmcob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5VbnNpZ25lZExvbmcgcGFyYW0pewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2FsVW5zaWduZWRMb25nPXBhcmFtOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxVbnNpZ25lZExvbmcudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgIC8qKgotICAgICAqIGlzUmVhZGVyTVRPTUF3YXJlCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSByZWFkZXIgc3VwcG9ydHMgTVRPTQotICAgICAqLwotICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgewotICAgICAgICBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICB0cnl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBqYXZhLmxhbmcuQm9vbGVhbi5UUlVFLmVxdWFscyhyZWFkZXIuZ2V0UHJvcGVydHkob3JnLmFwYWNoZS5heGlvbS5vbS5PTUNvbnN0YW50cy5JU19EQVRBX0hBTkRMRVJTX0FXQVJFKSk7Ci0gICAgICAgIH1jYXRjaChqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlzUmVhZGVyTVRPTUF3YXJlOwotICAgfQotICAgICAKLSAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAqCi0gICAgICAgICogQHBhcmFtIHBhcmVudFFOYW1lCi0gICAgICAgICogQHBhcmFtIGZhY3RvcnkKLSAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgcHVibGljIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IGdldE9NRWxlbWVudCAoCi0gICAgICAgICAgICAgICBmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSkgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZSBkYXRhU291cmNlID0KLSAgICAgICAgICAgICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRGF0YVNvdXJjZSh0aGlzLHBhcmVudFFOYW1lKXsKLQotICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgVW5zaWduZWRMb25nLnRoaXMuc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmxsb20uT01Tb3VyY2VkRWxlbWVudEltcGwoCi0gICAgICAgICAgICAgICBwYXJlbnRRTmFtZSxmYWN0b3J5LGRhdGFTb3VyY2UpOwotICAgICAgICAgICAgCi0gICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyLGZhbHNlKTsKLSAgICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VyaWFsaXplVHlwZSkKLSAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLQotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBwYXJlbnRRTmFtZS5nZXRQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlID0gcGFyZW50UU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2UgIT0gbnVsbCkgJiYgKG5hbWVzcGFjZS50cmltKCkubGVuZ3RoKCkgPiAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB3cml0ZXJQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAod3JpdGVyUHJlZml4ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQobmFtZXNwYWNlLCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwcmVmaXgsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICBpZiAoc2VyaWFsaXplVHlwZSl7Ci0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKTsKLSAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZVByZWZpeCAhPSBudWxsKSAmJiAobmFtZXNwYWNlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApKXsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VQcmVmaXgrIjp1bnNpZ25lZExvbmciLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bnNpZ25lZExvbmciLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxVbnNpZ25lZExvbmc9PW51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIHRoZSBuaWwgYXR0cmlidXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigidW5zaWduZWRMb25nIGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsVW5zaWduZWRMb25nKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBwcmVmaXgsamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICBpZiAoeG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0KLSAgICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0KLSAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLCBqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZU5hbWVzcGFjZSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlVmFsdWU7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gYXR0cmlidXRlUHJlZml4ICsgIjoiICsgcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsIGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIC8qKgotICAgICAgICAgKiAgbWV0aG9kIHRvIGhhbmRsZSBRbmFtZXMKLSAgICAgICAgICovCi0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWUoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMocHJlZml4ICsgIjoiICsgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGkuZSB0aGlzIGlzIHRoZSBkZWZhdWx0IG5hbWVzcGFjZQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZXMoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZVtdIHFuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgaWYgKHFuYW1lcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBzdG9yZSB0aGlzIGRhdGEgdW50aWwgbGFzdCBtb21lbnQgc2luY2UgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHdyaXRlIGFueQotICAgICAgICAgICAgICAgIC8vIG5hbWVzcGFjZSBkYXRhIGFmdGVyIHdyaXRpbmcgdGhlIGNoYXJhY3RvciBkYXRhCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZ0J1ZmZlciBzdHJpbmdUb1dyaXRlID0gbmV3IGphdmEubGFuZy5TdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBxbmFtZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZCgiICIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVVSSSA9IHFuYW1lc1tpXS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHByZWZpeCA9PSBudWxsKSB8fCAocHJlZml4Lmxlbmd0aCgpID09IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQocHJlZml4KS5hcHBlbmQoIjoiKS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhzdHJpbmdUb1dyaXRlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotCi0gICAgICAgICAvKioKLSAgICAgICAgICogUmVnaXN0ZXIgYSBuYW1lc3BhY2UgcHJlZml4Ci0gICAgICAgICAqLwotICAgICAgICAgcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHJlZ2lzdGVyUHJlZml4KGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoeG1sV3JpdGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHByZWZpeDsKLSAgICAgICAgICAgIH0KLQotCi0gIAotICAgICAgICAvKioKLSAgICAgICAgKiBkYXRhYmluZGluZyBtZXRob2QgdG8gZ2V0IGFuIFhNTCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdAotICAgICAgICAqCi0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciBnZXRQdWxsUGFyc2VyKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcU5hbWUpCi0gICAgICAgICAgICAgICAgICAgIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGVsZW1lbnRMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBhdHRyaWJMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXIuRUxFTUVOVF9URVhUKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbFVuc2lnbmVkTG9uZyAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxVbnNpZ25lZExvbmcpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigidW5zaWduZWRMb25nIGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVySW1wbChxTmFtZSwgZWxlbWVudExpc3QudG9BcnJheSgpLCBhdHRyaWJMaXN0LnRvQXJyYXkoKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAKLQotICAgICAvKioKLSAgICAgICogIEZhY3RvcnkgY2xhc3MgdGhhdCBrZWVwcyB0aGUgcGFyc2UgbWV0aG9kCi0gICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeXsKLQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBVbnNpZ25lZExvbmcgZnJvbVN0cmluZyhqYXZhLmxhbmcuU3RyaW5nIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJKXsKLSAgICAgICAgICAgICAgICAgICAgVW5zaWduZWRMb25nIHJldHVyblZhbHVlID0gbmV3ICBVbnNpZ25lZExvbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUuc2V0VW5zaWduZWRMb25nKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvVW5zaWduZWRMb25nKHZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBVbnNpZ25lZExvbmcgZnJvbVN0cmluZyhqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudC5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IGNvbnRlbnQuc3Vic3RyaW5nKDAsY29udGVudC5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVcmkgPSB4bWxTdHJlYW1SZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFVuc2lnbmVkTG9uZy5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCxuYW1lc3BhY2VVcmkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVW5zaWduZWRMb25nLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LCIiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgCi0KLSAgICAgICAgLyoqCi0gICAgICAgICogc3RhdGljIG1ldGhvZCB0byBjcmVhdGUgdGhlIG9iamVjdAotICAgICAgICAqIFByZWNvbmRpdGlvbjogIElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSBjdXJyZW50IG9yIG5leHQgc3RhcnQgZWxlbWVudCBzdGFydHMgdGhpcyBvYmplY3QgYW5kIGFueSBpbnRlcnZlbmluZyByZWFkZXIgZXZlbnRzIGFyZSBpZ25vcmFibGUKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBub3QgYW4gZWxlbWVudCwgaXQgaXMgYSBjb21wbGV4IHR5cGUgYW5kIHRoZSByZWFkZXIgaXMgYXQgdGhlIGV2ZW50IGp1c3QgYWZ0ZXIgdGhlIG91dGVyIHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgKiBQb3N0Y29uZGl0aW9uOiBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgaXRzIGVuZCBlbGVtZW50Ci0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgYSBjb21wbGV4IHR5cGUsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCB0aGUgZW5kIGVsZW1lbnQgb2YgaXRzIG91dGVyIGVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBVbnNpZ25lZExvbmcgcGFyc2UoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIFVuc2lnbmVkTG9uZyBvYmplY3QgPQotICAgICAgICAgICAgICAgIG5ldyBVbnNpZ25lZExvbmcoKTsKLQotICAgICAgICAgICAgaW50IGV2ZW50OwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuaWxsYWJsZVZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0iIjsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNldXJpID0iIjsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUgKCFyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAmJiAhcmVhZGVyLmlzRW5kRWxlbWVudCgpKQotICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIikhPW51bGwpewotICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBmdWxsVHlwZU5hbWUgPSByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIik7Ci0gICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1ByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKDAsZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBuc1ByZWZpeD09bnVsbD8iIjpuc1ByZWZpeDsKLQotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHR5cGUgPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikrMSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghInVuc2lnbmVkTG9uZyIuZXF1YWxzKHR5cGUpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9maW5kIG5hbWVzcGFjZSBmb3IgdGhlIHByZWZpeAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zVXJpID0gcmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkobnNQcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFVuc2lnbmVkTG9uZylvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnhzZC5FeHRlbnNpb25NYXBwZXIuZ2V0VHlwZU9iamVjdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc1VyaSx0eXBlLHJlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBOb3RlIGFsbCBhdHRyaWJ1dGVzIHRoYXQgd2VyZSBoYW5kbGVkLiBVc2VkIHRvIGRpZmZlciBub3JtYWwgYXR0cmlidXRlcwotICAgICAgICAgICAgICAgIC8vIGZyb20gYW55QXR0cmlidXRlcy4KLSAgICAgICAgICAgICAgICBqYXZhLnV0aWwuVmVjdG9yIGhhbmRsZWRBdHRyaWJ1dGVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSghcmVhZGVyLmlzRW5kRWxlbWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCA9IHJlYWRlci5nZXRFbGVtZW50VGV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldFVuc2lnbmVkTG9uZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvVW5zaWduZWRMb25nKGNvbnRlbnQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBFbmQgb2YgaWYgZm9yIGV4cGVjdGVkIHByb3BlcnR5IHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2V7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBzdGFydCBlbGVtZW50IHdlIGFyZSBub3QgZXhwZWN0aW5nIGluZGljYXRlcyBhbiBpbnZhbGlkIHBhcmFtZXRlciB3YXMgcGFzc2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJVbmV4cGVjdGVkIHN1YmVsZW1lbnQgIiArIHJlYWRlci5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gZW5kIG9mIHdoaWxlIGxvb3AKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0KLQotICAgICAgICAgICAgfSBjYXRjaCAoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gb2JqZWN0OwotICAgICAgICB9Ci0KLSAgICAgICAgfS8vZW5kIG9mIGZhY3RvcnkgY2xhc3MKLQotICAgICAgICAKLQotICAgICAgICB9Ci0gICAgICAgICAgIAotICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy94c2QvVW5zaWduZWRTaG9ydC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3hzZC9VbnNpZ25lZFNob3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjMTk0OWUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3hzZC9VbnNpZ25lZFNob3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDMgKzAsMCBAQAotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIFVuc2lnbmVkU2hvcnQuamF2YQotICoKLSAqIFRoaXMgZmlsZSB3YXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBXU0RMCi0gKiBieSB0aGUgQXBhY2hlIEF4aXMyIHZlcnNpb246IFNOQVBTSE9UICBCdWlsdCBvbiA6IERlYyAyMSwgMjAwNyAoMDQ6MDM6MzAgTEtUKQotICovCi0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBwYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkOwotICAgICAgICAgICAgCi0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiAgVW5zaWduZWRTaG9ydCBiZWFuIGNsYXNzCi0gICAgICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgcHVibGljICBjbGFzcyBVbnNpZ25lZFNob3J0Ci0gICAgICAgIGltcGxlbWVudHMgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJCZWFuewotICAgICAgICAvKiBUaGlzIHR5cGUgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBwaWVjZSBvZiBzY2hlbWEgdGhhdCBoYWQKLSAgICAgICAgICAgICAgICBuYW1lID0gdW5zaWduZWRTaG9ydAotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBVUkkgPSBodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYQotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBQcmVmaXggPSBuczEKLSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgCi0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZW5lcmF0ZVByZWZpeChqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICAgICAgaWYobmFtZXNwYWNlLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSl7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJ4c2QiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgIH0KLQotICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIGZpZWxkIGZvciBVbnNpZ25lZFNob3J0Ci0gICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLlVuc2lnbmVkU2hvcnQgbG9jYWxVbnNpZ25lZFNob3J0IDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBnZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5VbnNpZ25lZFNob3J0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLlVuc2lnbmVkU2hvcnQgZ2V0VW5zaWduZWRTaG9ydCgpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbFVuc2lnbmVkU2hvcnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBzZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gcGFyYW0gVW5zaWduZWRTaG9ydAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0VW5zaWduZWRTaG9ydChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLlVuc2lnbmVkU2hvcnQgcGFyYW0pewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2FsVW5zaWduZWRTaG9ydD1wYXJhbTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsVW5zaWduZWRTaG9ydC50b1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgLyoqCi0gICAgICogaXNSZWFkZXJNVE9NQXdhcmUKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlYWRlciBzdXBwb3J0cyBNVE9NCi0gICAgICovCi0gICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIHRyeXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGphdmEubGFuZy5Cb29sZWFuLlRSVUUuZXF1YWxzKHJlYWRlci5nZXRQcm9wZXJ0eShvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQ29uc3RhbnRzLklTX0RBVEFfSEFORExFUlNfQVdBUkUpKTsKLSAgICAgICAgfWNhdGNoKGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXNSZWFkZXJNVE9NQXdhcmU7Ci0gICB9Ci0gICAgIAotICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICoKLSAgICAgICAgKiBAcGFyYW0gcGFyZW50UU5hbWUKLSAgICAgICAgKiBAcGFyYW0gZmFjdG9yeQotICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICBwdWJsaWMgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgZ2V0T01FbGVtZW50ICgKLSAgICAgICAgICAgICAgIGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5KSB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlIGRhdGFTb3VyY2UgPQotICAgICAgICAgICAgICAgICAgICAgICBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJEYXRhU291cmNlKHRoaXMscGFyZW50UU5hbWUpewotCi0gICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICBVbnNpZ25lZFNob3J0LnRoaXMuc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmxsb20uT01Tb3VyY2VkRWxlbWVudEltcGwoCi0gICAgICAgICAgICAgICBwYXJlbnRRTmFtZSxmYWN0b3J5LGRhdGFTb3VyY2UpOwotICAgICAgICAgICAgCi0gICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyLGZhbHNlKTsKLSAgICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VyaWFsaXplVHlwZSkKLSAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLQotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBwYXJlbnRRTmFtZS5nZXRQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlID0gcGFyZW50UU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2UgIT0gbnVsbCkgJiYgKG5hbWVzcGFjZS50cmltKCkubGVuZ3RoKCkgPiAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB3cml0ZXJQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAod3JpdGVyUHJlZml4ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQobmFtZXNwYWNlLCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwcmVmaXgsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICBpZiAoc2VyaWFsaXplVHlwZSl7Ci0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKTsKLSAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZVByZWZpeCAhPSBudWxsKSAmJiAobmFtZXNwYWNlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApKXsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VQcmVmaXgrIjp1bnNpZ25lZFNob3J0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAidW5zaWduZWRTaG9ydCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbFVuc2lnbmVkU2hvcnQ9PW51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIHRoZSBuaWwgYXR0cmlidXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigidW5zaWduZWRTaG9ydCBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbFVuc2lnbmVkU2hvcnQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRoIHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCxqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgIGlmICh4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLQotICAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsIGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlTmFtZXNwYWNlID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVWYWx1ZTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBhdHRyaWJ1dGVQcmVmaXggKyAiOiIgKyBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSwgYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICBtZXRob2QgdG8gaGFuZGxlIFFuYW1lcwotICAgICAgICAgKi8KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZShqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhwcmVmaXggKyAiOiIgKyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaS5lIHRoaXMgaXMgdGhlIGRlZmF1bHQgbmFtZXNwYWNlCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lcyhqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lW10gcW5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICBpZiAocW5hbWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHRvIHN0b3JlIHRoaXMgZGF0YSB1bnRpbCBsYXN0IG1vbWVudCBzaW5jZSBpdCBpcyBub3QgcG9zc2libGUgdG8gd3JpdGUgYW55Ci0gICAgICAgICAgICAgICAgLy8gbmFtZXNwYWNlIGRhdGEgYWZ0ZXIgd3JpdGluZyB0aGUgY2hhcmFjdG9yIGRhdGEKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIHN0cmluZ1RvV3JpdGUgPSBuZXcgamF2YS5sYW5nLlN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHFuYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKCIgIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlVVJJID0gcW5hbWVzW2ldLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocHJlZml4ID09IG51bGwpIHx8IChwcmVmaXgubGVuZ3RoKCkgPT0gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChwcmVmaXgpLmFwcGVuZCgiOiIpLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHN0cmluZ1RvV3JpdGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0KLSAgICAgICAgIC8qKgotICAgICAgICAgKiBSZWdpc3RlciBhIG5hbWVzcGFjZSBwcmVmaXgKLSAgICAgICAgICovCi0gICAgICAgICBwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgcmVnaXN0ZXJQcmVmaXgoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLCBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlICh4bWxXcml0ZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gcHJlZml4OwotICAgICAgICAgICAgfQotCi0KLSAgCi0gICAgICAgIC8qKgotICAgICAgICAqIGRhdGFiaW5kaW5nIG1ldGhvZCB0byBnZXQgYW4gWE1MIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0Ci0gICAgICAgICoKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIGdldFB1bGxQYXJzZXIoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxTmFtZSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgZWxlbWVudExpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGF0dHJpYkxpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlci5FTEVNRU5UX1RFWFQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsVW5zaWduZWRTaG9ydCAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxVbnNpZ25lZFNob3J0KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oInVuc2lnbmVkU2hvcnQgY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXJJbXBsKHFOYW1lLCBlbGVtZW50TGlzdC50b0FycmF5KCksIGF0dHJpYkxpc3QudG9BcnJheSgpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gIAotCi0gICAgIC8qKgotICAgICAgKiAgRmFjdG9yeSBjbGFzcyB0aGF0IGtlZXBzIHRoZSBwYXJzZSBtZXRob2QKLSAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5ewotCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIFVuc2lnbmVkU2hvcnQgZnJvbVN0cmluZyhqYXZhLmxhbmcuU3RyaW5nIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJKXsKLSAgICAgICAgICAgICAgICAgICAgVW5zaWduZWRTaG9ydCByZXR1cm5WYWx1ZSA9IG5ldyAgVW5zaWduZWRTaG9ydCgpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZS5zZXRVbnNpZ25lZFNob3J0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvVW5zaWduZWRTaG9ydCh2YWx1ZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgVW5zaWduZWRTaG9ydCBmcm9tU3RyaW5nKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50LmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gY29udGVudC5zdWJzdHJpbmcoMCxjb250ZW50LmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVyaSA9IHhtbFN0cmVhbVJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVW5zaWduZWRTaG9ydC5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCxuYW1lc3BhY2VVcmkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVW5zaWduZWRTaG9ydC5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCwiIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIAotCi0gICAgICAgIC8qKgotICAgICAgICAqIHN0YXRpYyBtZXRob2QgdG8gY3JlYXRlIHRoZSBvYmplY3QKLSAgICAgICAgKiBQcmVjb25kaXRpb246ICBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgY3VycmVudCBvciBuZXh0IHN0YXJ0IGVsZW1lbnQgc3RhcnRzIHRoaXMgb2JqZWN0IGFuZCBhbnkgaW50ZXJ2ZW5pbmcgcmVhZGVyIGV2ZW50cyBhcmUgaWdub3JhYmxlCi0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgbm90IGFuIGVsZW1lbnQsIGl0IGlzIGEgY29tcGxleCB0eXBlIGFuZCB0aGUgcmVhZGVyIGlzIGF0IHRoZSBldmVudCBqdXN0IGFmdGVyIHRoZSBvdXRlciBzdGFydCBlbGVtZW50Ci0gICAgICAgICogUG9zdGNvbmRpdGlvbjogSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IGl0cyBlbmQgZWxlbWVudAotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIGEgY29tcGxleCB0eXBlLCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgdGhlIGVuZCBlbGVtZW50IG9mIGl0cyBvdXRlciBlbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgVW5zaWduZWRTaG9ydCBwYXJzZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uewotICAgICAgICAgICAgVW5zaWduZWRTaG9ydCBvYmplY3QgPQotICAgICAgICAgICAgICAgIG5ldyBVbnNpZ25lZFNob3J0KCk7Ci0KLSAgICAgICAgICAgIGludCBldmVudDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmlsbGFibGVWYWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IiI7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZXVyaSA9IiI7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlICghcmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgJiYgIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkKLSAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIpIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgZnVsbFR5cGVOYW1lID0gcmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAidHlwZSIpOwotICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNQcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZygwLGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gbnNQcmVmaXg9PW51bGw/IiI6bnNQcmVmaXg7Ci0KLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB0eXBlID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZyhmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKzEpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISJ1bnNpZ25lZFNob3J0Ii5lcXVhbHModHlwZSkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2ZpbmQgbmFtZXNwYWNlIGZvciB0aGUgcHJlZml4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNVcmkgPSByZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShuc1ByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoVW5zaWduZWRTaG9ydClvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnhzZC5FeHRlbnNpb25NYXBwZXIuZ2V0VHlwZU9iamVjdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc1VyaSx0eXBlLHJlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBOb3RlIGFsbCBhdHRyaWJ1dGVzIHRoYXQgd2VyZSBoYW5kbGVkLiBVc2VkIHRvIGRpZmZlciBub3JtYWwgYXR0cmlidXRlcwotICAgICAgICAgICAgICAgIC8vIGZyb20gYW55QXR0cmlidXRlcy4KLSAgICAgICAgICAgICAgICBqYXZhLnV0aWwuVmVjdG9yIGhhbmRsZWRBdHRyaWJ1dGVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSghcmVhZGVyLmlzRW5kRWxlbWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCA9IHJlYWRlci5nZXRFbGVtZW50VGV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldFVuc2lnbmVkU2hvcnQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1Vuc2lnbmVkU2hvcnQoY29udGVudCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIEVuZCBvZiBpZiBmb3IgZXhwZWN0ZWQgcHJvcGVydHkgc3RhcnQgZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHN0YXJ0IGVsZW1lbnQgd2UgYXJlIG5vdCBleHBlY3RpbmcgaW5kaWNhdGVzIGFuIGludmFsaWQgcGFyYW1ldGVyIHdhcyBwYXNzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIlVuZXhwZWN0ZWQgc3ViZWxlbWVudCAiICsgcmVhZGVyLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBlbmQgb2Ygd2hpbGUgbG9vcAotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLQotCi0gICAgICAgICAgICB9IGNhdGNoIChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEubGFuZy5FeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBvYmplY3Q7Ci0gICAgICAgIH0KLQotICAgICAgICB9Ly9lbmQgb2YgZmFjdG9yeSBjbGFzcwotCi0gICAgICAgIAotCi0gICAgICAgIH0KLSAgICAgICAgICAgCi0gICAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3hzZC9fYm9vbGVhbi5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3hzZC9fYm9vbGVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTZmODU4Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy94c2QvX2Jvb2xlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIF9ib29sZWFuLmphdmEKLSAqCi0gKiBUaGlzIGZpbGUgd2FzIGF1dG8tZ2VuZXJhdGVkIGZyb20gV1NETAotICogYnkgdGhlIEFwYWNoZSBBeGlzMiB2ZXJzaW9uOiBTTkFQU0hPVCAgQnVpbHQgb24gOiBEZWMgMjEsIDIwMDcgKDA0OjAzOjMwIExLVCkKLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkOwotCi0KLS8qKgotICogX2Jvb2xlYW4gYmVhbiBjbGFzcwotICovCi0KLXB1YmxpYyBjbGFzcyBfYm9vbGVhbgotICAgICAgICBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCQmVhbiB7Ci0gICAgLyogVGhpcyB0eXBlIHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgcGllY2Ugb2Ygc2NoZW1hIHRoYXQgaGFkCi0gICAgbmFtZSA9IGJvb2xlYW4KLSAgICBOYW1lc3BhY2UgVVJJID0gaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEKLSAgICBOYW1lc3BhY2UgUHJlZml4ID0gbnMxCi0gICAgKi8KLQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZW5lcmF0ZVByZWZpeChqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSkgewotICAgICAgICAgICAgcmV0dXJuICJ4c2QiOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogZmllbGQgZm9yIF9ib29sZWFuCi0gICAgICovCi0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIGxvY2FsX2Jvb2xlYW47Ci0KLQotICAgIC8qKgotICAgICAqIEF1dG8gZ2VuZXJhdGVkIGdldHRlciBtZXRob2QKLSAgICAgKgotICAgICAqIEByZXR1cm4gYm9vbGVhbgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGdldF9ib29sZWFuKCkgewotICAgICAgICByZXR1cm4gbG9jYWxfYm9vbGVhbjsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIEF1dG8gZ2VuZXJhdGVkIHNldHRlciBtZXRob2QKLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJhbSBfYm9vbGVhbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldF9ib29sZWFuKGJvb2xlYW4gcGFyYW0pIHsKLQotICAgICAgICB0aGlzLmxvY2FsX2Jvb2xlYW4gPSBwYXJhbTsKLQotCi0gICAgfQotCi0KLSAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpIHsKLQotICAgICAgICByZXR1cm4gbG9jYWxfYm9vbGVhbiArICIiOwotCi0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBpc1JlYWRlck1UT01Bd2FyZQotICAgICAqCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSByZWFkZXIgc3VwcG9ydHMgTVRPTQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKLSAgICAgICAgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGphdmEubGFuZy5Cb29sZWFuLlRSVUUuZXF1YWxzKHJlYWRlci5nZXRQcm9wZXJ0eShvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQ29uc3RhbnRzLklTX0RBVEFfSEFORExFUlNfQVdBUkUpKTsKLSAgICAgICAgfSBjYXRjaCAoamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpc1JlYWRlck1UT01Bd2FyZTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBwYXJlbnRRTmFtZQotICAgICAqIEBwYXJhbSBmYWN0b3J5Ci0gICAgICogQHJldHVybiBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudAotICAgICAqLwotICAgIHB1YmxpYyBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCBnZXRPTUVsZW1lbnQoCi0gICAgICAgICAgICBmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSkgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uIHsKLQotCi0gICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlIGRhdGFTb3VyY2UgPQotICAgICAgICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkRhdGFTb3VyY2UodGhpcywgcGFyZW50UU5hbWUpIHsKLQotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIF9ib29sZWFuLnRoaXMuc2VyaWFsaXplKHBhcmVudFFOYW1lLCBmYWN0b3J5LCB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfTsKLSAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5PTVNvdXJjZWRFbGVtZW50SW1wbCgKLSAgICAgICAgICAgICAgICBwYXJlbnRRTmFtZSwgZmFjdG9yeSwgZGF0YVNvdXJjZSk7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikKLSAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24gewotICAgICAgICBzZXJpYWxpemUocGFyZW50UU5hbWUsIGZhY3RvcnksIHhtbFdyaXRlciwgZmFsc2UpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNlcmlhbGl6ZVR5cGUpCi0gICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uIHsKLQotCi0gICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLSAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UgPSBudWxsOwotCi0KLSAgICAgICAgcHJlZml4ID0gcGFyZW50UU5hbWUuZ2V0UHJlZml4KCk7Ci0gICAgICAgIG5hbWVzcGFjZSA9IHBhcmVudFFOYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotCi0gICAgICAgIGlmICgobmFtZXNwYWNlICE9IG51bGwpICYmIChuYW1lc3BhY2UudHJpbSgpLmxlbmd0aCgpID4gMCkpIHsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgd3JpdGVyUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgaWYgKHdyaXRlclByZWZpeCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KG5hbWVzcGFjZSwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocHJlZml4LCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzZXJpYWxpemVUeXBlKSB7Ci0KLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKTsKLSAgICAgICAgICAgIGlmICgobmFtZXNwYWNlUHJlZml4ICE9IG51bGwpICYmIChuYW1lc3BhY2VQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkpIHsKLSAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwgInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlUHJlZml4ICsgIjpib29sZWFuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCAidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiYm9vbGVhbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgfQotCi0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChmYWxzZSkgewotCi0gICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oImJvb2xlYW4gY2Fubm90IGJlIG51bGwhISIpOwotCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxfYm9vbGVhbikpOwotICAgICAgICB9Ci0KLSAgICAgICAgeG1sV3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotCi0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aCB0aGUgbnMgcHJlZml4Ci0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgcHJlZml4LCBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSwgamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICh4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSkgPT0gbnVsbCkgewotICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotCi0gICAgICAgIH0KLQotICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLCBhdHROYW1lLCBhdHRWYWx1ZSk7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLCBqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSwgYXR0VmFsdWUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSwgYXR0TmFtZSwgYXR0VmFsdWUpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsIGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVOYW1lc3BhY2UgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgYXR0cmlidXRlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICB9Ci0gICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlVmFsdWU7Ci0gICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBhdHRyaWJ1dGVQcmVmaXggKyAiOiIgKyBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLCBhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBtZXRob2QgdG8gaGFuZGxlIFFuYW1lcwotICAgICAqLwotCi0gICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWUoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMocHJlZml4ICsgIjoiICsgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBpLmUgdGhpcyBpcyB0aGUgZGVmYXVsdCBuYW1lc3BhY2UKLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZXMoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZVtdIHFuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgIGlmIChxbmFtZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBzdG9yZSB0aGlzIGRhdGEgdW50aWwgbGFzdCBtb21lbnQgc2luY2UgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHdyaXRlIGFueQotICAgICAgICAgICAgLy8gbmFtZXNwYWNlIGRhdGEgYWZ0ZXIgd3JpdGluZyB0aGUgY2hhcmFjdG9yIGRhdGEKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmdCdWZmZXIgc3RyaW5nVG9Xcml0ZSA9IG5ldyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IG51bGw7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcW5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKCIgIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG5hbWVzcGFjZVVSSSA9IHFuYW1lc1tpXS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoKHByZWZpeCA9PSBudWxsKSB8fCAocHJlZml4Lmxlbmd0aCgpID09IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChwcmVmaXgpLmFwcGVuZCgiOiIpLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhzdHJpbmdUb1dyaXRlLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFJlZ2lzdGVyIGEgbmFtZXNwYWNlIHByZWZpeAotICAgICAqLwotICAgIHByaXZhdGUgamF2YS5sYW5nLlN0cmluZyByZWdpc3RlclByZWZpeChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgIHdoaWxlICh4bWxXcml0ZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBwcmVmaXggPSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcHJlZml4OwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogZGF0YWJpbmRpbmcgbWV0aG9kIHRvIGdldCBhbiBYTUwgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QKLSAgICAgKi8KLSAgICBwdWJsaWMgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgZ2V0UHVsbFBhcnNlcihqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFOYW1lKQotICAgICAgICAgICAgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uIHsKLQotCi0gICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgZWxlbWVudExpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGF0dHJpYkxpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotCi0KLSAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlci5FTEVNRU5UX1RFWFQpOwotCi0gICAgICAgIGVsZW1lbnRMaXN0LmFkZCgKLSAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsX2Jvb2xlYW4pKTsKLQotCi0gICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVySW1wbChxTmFtZSwgZWxlbWVudExpc3QudG9BcnJheSgpLCBhdHRyaWJMaXN0LnRvQXJyYXkoKSk7Ci0KLQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogRmFjdG9yeSBjbGFzcyB0aGF0IGtlZXBzIHRoZSBwYXJzZSBtZXRob2QKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3RvcnkgewotCi0KLSAgICAgICAgcHVibGljIHN0YXRpYyBfYm9vbGVhbiBmcm9tU3RyaW5nKGphdmEubGFuZy5TdHJpbmcgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSkgewotICAgICAgICAgICAgX2Jvb2xlYW4gcmV0dXJuVmFsdWUgPSBuZXcgX2Jvb2xlYW4oKTsKLQotICAgICAgICAgICAgcmV0dXJuVmFsdWUuc2V0X2Jvb2xlYW4oCi0gICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9Cb29sZWFuKHZhbHVlKSk7Ci0KLQotICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBfYm9vbGVhbiBmcm9tU3RyaW5nKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCkgewotICAgICAgICAgICAgaWYgKGNvbnRlbnQuaW5kZXhPZigiOiIpID4gLTEpIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IGNvbnRlbnQuc3Vic3RyaW5nKDAsIGNvbnRlbnQuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVyaSA9IHhtbFN0cmVhbVJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9ib29sZWFuLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LCBuYW1lc3BhY2VVcmkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gX2Jvb2xlYW4uRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsICIiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIHN0YXRpYyBtZXRob2QgdG8gY3JlYXRlIHRoZSBvYmplY3QKLSAgICAgICAgICogUHJlY29uZGl0aW9uOiAgSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIGN1cnJlbnQgb3IgbmV4dCBzdGFydCBlbGVtZW50IHN0YXJ0cyB0aGlzIG9iamVjdCBhbmQgYW55IGludGVydmVuaW5nIHJlYWRlciBldmVudHMgYXJlIGlnbm9yYWJsZQotICAgICAgICAgKiBJZiB0aGlzIG9iamVjdCBpcyBub3QgYW4gZWxlbWVudCwgaXQgaXMgYSBjb21wbGV4IHR5cGUgYW5kIHRoZSByZWFkZXIgaXMgYXQgdGhlIGV2ZW50IGp1c3QgYWZ0ZXIgdGhlIG91dGVyIHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgICogUG9zdGNvbmRpdGlvbjogSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IGl0cyBlbmQgZWxlbWVudAotICAgICAgICAgKiBJZiB0aGlzIG9iamVjdCBpcyBhIGNvbXBsZXggdHlwZSwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IHRoZSBlbmQgZWxlbWVudCBvZiBpdHMgb3V0ZXIgZWxlbWVudAotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBfYm9vbGVhbiBwYXJzZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIF9ib29sZWFuIG9iamVjdCA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBfYm9vbGVhbigpOwotCi0gICAgICAgICAgICBpbnQgZXZlbnQ7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5pbGxhYmxlVmFsdWUgPSBudWxsOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSAiIjsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNldXJpID0gIiI7Ci0gICAgICAgICAgICB0cnkgewotCi0gICAgICAgICAgICAgICAgd2hpbGUgKCFyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAmJiAhcmVhZGVyLmlzRW5kRWxlbWVudCgpKQotICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotCi0KLSAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsICJ0eXBlIikgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGZ1bGxUeXBlTmFtZSA9IHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1ByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSA+IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKDAsIGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBuc1ByZWZpeCA9PSBudWxsID8gIiIgOiBuc1ByZWZpeDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB0eXBlID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZyhmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpICsgMSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghImJvb2xlYW4iLmVxdWFscyh0eXBlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZmluZCBuYW1lc3BhY2UgZm9yIHRoZSBwcmVmaXgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zVXJpID0gcmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkobnNQcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoX2Jvb2xlYW4pIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkLkV4dGVuc2lvbk1hcHBlci5nZXRUeXBlT2JqZWN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNVcmksIHR5cGUsIHJlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIE5vdGUgYWxsIGF0dHJpYnV0ZXMgdGhhdCB3ZXJlIGhhbmRsZWQuIFVzZWQgdG8gZGlmZmVyIG5vcm1hbCBhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgICAgLy8gZnJvbSBhbnlBdHRyaWJ1dGVzLgotICAgICAgICAgICAgICAgIGphdmEudXRpbC5WZWN0b3IgaGFuZGxlZEF0dHJpYnV0ZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCi0KLSAgICAgICAgICAgICAgICB3aGlsZSAoIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgfHwgcmVhZGVyLmhhc1RleHQoKSkgewotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgfHwgcmVhZGVyLmhhc1RleHQoKSkgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50ID0gcmVhZGVyLmdldEVsZW1lbnRUZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0X2Jvb2xlYW4oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvQm9vbGVhbihjb250ZW50KSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIEVuZCBvZiBpZiBmb3IgZXhwZWN0ZWQgcHJvcGVydHkgc3RhcnQgZWxlbWVudAotCi0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHN0YXJ0IGVsZW1lbnQgd2UgYXJlIG5vdCBleHBlY3RpbmcgaW5kaWNhdGVzIGFuIGludmFsaWQgcGFyYW1ldGVyIHdhcyBwYXNzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIlVuZXhwZWN0ZWQgc3ViZWxlbWVudCAiICsgcmVhZGVyLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gIC8vIGVuZCBvZiB3aGlsZSBsb29wCi0KLQotICAgICAgICAgICAgfSBjYXRjaCAoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gb2JqZWN0OwotICAgICAgICB9Ci0KLSAgICB9Ly9lbmQgb2YgZmFjdG9yeSBjbGFzcwotCi0KLX0KLSAgICAgICAgICAgCi0gICAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3hzZC9fYnl0ZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3hzZC9fYnl0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWVmYTY1Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy94c2QvX2J5dGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5NSArMCwwIEBACi0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICogX2J5dGUuamF2YQotICoKLSAqIFRoaXMgZmlsZSB3YXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBXU0RMCi0gKiBieSB0aGUgQXBhY2hlIEF4aXMyIHZlcnNpb246IFNOQVBTSE9UICBCdWlsdCBvbiA6IERlYyAyMSwgMjAwNyAoMDQ6MDM6MzAgTEtUKQotICovCi0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBwYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkOwotICAgICAgICAgICAgCi0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiAgX2J5dGUgYmVhbiBjbGFzcwotICAgICAgICAgICAgKi8KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyAgY2xhc3MgX2J5dGUKLSAgICAgICAgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkJlYW57Ci0gICAgICAgIC8qIFRoaXMgdHlwZSB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIHBpZWNlIG9mIHNjaGVtYSB0aGF0IGhhZAotICAgICAgICAgICAgICAgIG5hbWUgPSBieXRlCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFVSSSA9IGh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFByZWZpeCA9IG5zMQotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdlbmVyYXRlUHJlZml4KGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB7Ci0gICAgICAgICAgICBpZihuYW1lc3BhY2UuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpKXsKLSAgICAgICAgICAgICAgICByZXR1cm4gInhzZCI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgfQotCi0gICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogZmllbGQgZm9yIF9ieXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBieXRlIGxvY2FsX2J5dGUgOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIGdldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiBieXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljICBieXRlIGdldF9ieXRlKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsX2J5dGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBzZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gcGFyYW0gX2J5dGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldF9ieXRlKGJ5dGUgcGFyYW0pewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2FsX2J5dGU9cGFyYW07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbF9ieXRlICsgIiI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAvKioKLSAgICAgKiBpc1JlYWRlck1UT01Bd2FyZQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVhZGVyIHN1cHBvcnRzIE1UT00KLSAgICAgKi8KLSAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKLSAgICAgICAgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICAKLSAgICAgICAgdHJ5ewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gamF2YS5sYW5nLkJvb2xlYW4uVFJVRS5lcXVhbHMocmVhZGVyLmdldFByb3BlcnR5KG9yZy5hcGFjaGUuYXhpb20ub20uT01Db25zdGFudHMuSVNfREFUQV9IQU5ETEVSU19BV0FSRSkpOwotICAgICAgICB9Y2F0Y2goamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpc1JlYWRlck1UT01Bd2FyZTsKLSAgIH0KLSAgICAgCi0gICAgIAotICAgICAgICAvKioKLSAgICAgICAgKgotICAgICAgICAqIEBwYXJhbSBwYXJlbnRRTmFtZQotICAgICAgICAqIEBwYXJhbSBmYWN0b3J5Ci0gICAgICAgICogQHJldHVybiBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudAotICAgICAgICAqLwotICAgICAgIHB1YmxpYyBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCBnZXRPTUVsZW1lbnQgKAotICAgICAgICAgICAgICAgZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnkpIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTURhdGFTb3VyY2UgZGF0YVNvdXJjZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkRhdGFTb3VyY2UodGhpcyxwYXJlbnRRTmFtZSl7Ci0KLSAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgIF9ieXRlLnRoaXMuc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmxsb20uT01Tb3VyY2VkRWxlbWVudEltcGwoCi0gICAgICAgICAgICAgICBwYXJlbnRRTmFtZSxmYWN0b3J5LGRhdGFTb3VyY2UpOwotICAgICAgICAgICAgCi0gICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyLGZhbHNlKTsKLSAgICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VyaWFsaXplVHlwZSkKLSAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLQotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBwYXJlbnRRTmFtZS5nZXRQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlID0gcGFyZW50UU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2UgIT0gbnVsbCkgJiYgKG5hbWVzcGFjZS50cmltKCkubGVuZ3RoKCkgPiAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB3cml0ZXJQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAod3JpdGVyUHJlZml4ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQobmFtZXNwYWNlLCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwcmVmaXgsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICBpZiAoc2VyaWFsaXplVHlwZSl7Ci0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKTsKLSAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZVByZWZpeCAhPSBudWxsKSAmJiAobmFtZXNwYWNlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApKXsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VQcmVmaXgrIjpieXRlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiYnl0ZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbF9ieXRlPT1qYXZhLmxhbmcuQnl0ZS5NSU5fVkFMVUUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiYnl0ZSBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxfYnl0ZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRoIHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCxqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgIGlmICh4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLQotICAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsIGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlTmFtZXNwYWNlID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVWYWx1ZTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBhdHRyaWJ1dGVQcmVmaXggKyAiOiIgKyBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSwgYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICBtZXRob2QgdG8gaGFuZGxlIFFuYW1lcwotICAgICAgICAgKi8KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZShqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhwcmVmaXggKyAiOiIgKyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaS5lIHRoaXMgaXMgdGhlIGRlZmF1bHQgbmFtZXNwYWNlCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lcyhqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lW10gcW5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICBpZiAocW5hbWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHRvIHN0b3JlIHRoaXMgZGF0YSB1bnRpbCBsYXN0IG1vbWVudCBzaW5jZSBpdCBpcyBub3QgcG9zc2libGUgdG8gd3JpdGUgYW55Ci0gICAgICAgICAgICAgICAgLy8gbmFtZXNwYWNlIGRhdGEgYWZ0ZXIgd3JpdGluZyB0aGUgY2hhcmFjdG9yIGRhdGEKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIHN0cmluZ1RvV3JpdGUgPSBuZXcgamF2YS5sYW5nLlN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHFuYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKCIgIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlVVJJID0gcW5hbWVzW2ldLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocHJlZml4ID09IG51bGwpIHx8IChwcmVmaXgubGVuZ3RoKCkgPT0gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChwcmVmaXgpLmFwcGVuZCgiOiIpLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHN0cmluZ1RvV3JpdGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0KLSAgICAgICAgIC8qKgotICAgICAgICAgKiBSZWdpc3RlciBhIG5hbWVzcGFjZSBwcmVmaXgKLSAgICAgICAgICovCi0gICAgICAgICBwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgcmVnaXN0ZXJQcmVmaXgoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLCBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlICh4bWxXcml0ZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gcHJlZml4OwotICAgICAgICAgICAgfQotCi0KLSAgCi0gICAgICAgIC8qKgotICAgICAgICAqIGRhdGFiaW5kaW5nIG1ldGhvZCB0byBnZXQgYW4gWE1MIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0Ci0gICAgICAgICoKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIGdldFB1bGxQYXJzZXIoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxTmFtZSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgZWxlbWVudExpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGF0dHJpYkxpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlci5FTEVNRU5UX1RFWFQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbF9ieXRlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlckltcGwocU5hbWUsIGVsZW1lbnRMaXN0LnRvQXJyYXkoKSwgYXR0cmliTGlzdC50b0FycmF5KCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgCi0KLSAgICAgLyoqCi0gICAgICAqICBGYWN0b3J5IGNsYXNzIHRoYXQga2VlcHMgdGhlIHBhcnNlIG1ldGhvZAotICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3Rvcnl7Ci0KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgX2J5dGUgZnJvbVN0cmluZyhqYXZhLmxhbmcuU3RyaW5nIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJKXsKLSAgICAgICAgICAgICAgICAgICAgX2J5dGUgcmV0dXJuVmFsdWUgPSBuZXcgIF9ieXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlLnNldF9ieXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvQnl0ZSh2YWx1ZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgX2J5dGUgZnJvbVN0cmluZyhqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudC5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IGNvbnRlbnQuc3Vic3RyaW5nKDAsY29udGVudC5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVcmkgPSB4bWxTdHJlYW1SZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9ieXRlLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LG5hbWVzcGFjZVVyaSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfYnl0ZS5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCwiIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIAotCi0gICAgICAgIC8qKgotICAgICAgICAqIHN0YXRpYyBtZXRob2QgdG8gY3JlYXRlIHRoZSBvYmplY3QKLSAgICAgICAgKiBQcmVjb25kaXRpb246ICBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgY3VycmVudCBvciBuZXh0IHN0YXJ0IGVsZW1lbnQgc3RhcnRzIHRoaXMgb2JqZWN0IGFuZCBhbnkgaW50ZXJ2ZW5pbmcgcmVhZGVyIGV2ZW50cyBhcmUgaWdub3JhYmxlCi0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgbm90IGFuIGVsZW1lbnQsIGl0IGlzIGEgY29tcGxleCB0eXBlIGFuZCB0aGUgcmVhZGVyIGlzIGF0IHRoZSBldmVudCBqdXN0IGFmdGVyIHRoZSBvdXRlciBzdGFydCBlbGVtZW50Ci0gICAgICAgICogUG9zdGNvbmRpdGlvbjogSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IGl0cyBlbmQgZWxlbWVudAotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIGEgY29tcGxleCB0eXBlLCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgdGhlIGVuZCBlbGVtZW50IG9mIGl0cyBvdXRlciBlbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgX2J5dGUgcGFyc2UoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIF9ieXRlIG9iamVjdCA9Ci0gICAgICAgICAgICAgICAgbmV3IF9ieXRlKCk7Ci0KLSAgICAgICAgICAgIGludCBldmVudDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmlsbGFibGVWYWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IiI7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZXVyaSA9IiI7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlICghcmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgJiYgIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkKLSAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIpIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgZnVsbFR5cGVOYW1lID0gcmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAidHlwZSIpOwotICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNQcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZygwLGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gbnNQcmVmaXg9PW51bGw/IiI6bnNQcmVmaXg7Ci0KLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB0eXBlID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZyhmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKzEpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISJieXRlIi5lcXVhbHModHlwZSkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2ZpbmQgbmFtZXNwYWNlIGZvciB0aGUgcHJlZml4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNVcmkgPSByZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShuc1ByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoX2J5dGUpb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy54c2QuRXh0ZW5zaW9uTWFwcGVyLmdldFR5cGVPYmplY3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNVcmksdHlwZSxyZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gTm90ZSBhbGwgYXR0cmlidXRlcyB0aGF0IHdlcmUgaGFuZGxlZC4gVXNlZCB0byBkaWZmZXIgbm9ybWFsIGF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgICAvLyBmcm9tIGFueUF0dHJpYnV0ZXMuCi0gICAgICAgICAgICAgICAgamF2YS51dGlsLlZlY3RvciBoYW5kbGVkQXR0cmlidXRlcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUoIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQgPSByZWFkZXIuZ2V0RWxlbWVudFRleHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5zZXRfYnl0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvQnl0ZShjb250ZW50KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gRW5kIG9mIGlmIGZvciBleHBlY3RlZCBwcm9wZXJ0eSBzdGFydCBlbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgc3RhcnQgZWxlbWVudCB3ZSBhcmUgbm90IGV4cGVjdGluZyBpbmRpY2F0ZXMgYW4gaW52YWxpZCBwYXJhbWV0ZXIgd2FzIHBhc3NlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiVW5leHBlY3RlZCBzdWJlbGVtZW50ICIgKyByZWFkZXIuZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIGVuZCBvZiB3aGlsZSBsb29wCi0gICAgICAgICAgICAgICAgICAgICAgICAKLQotCi0KLSAgICAgICAgICAgIH0gY2F0Y2ggKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5sYW5nLkV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG9iamVjdDsKLSAgICAgICAgfQotCi0gICAgICAgIH0vL2VuZCBvZiBmYWN0b3J5IGNsYXNzCi0KLSAgICAgICAgCi0KLSAgICAgICAgfQotICAgICAgICAgICAKLSAgICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMveHNkL19kb3VibGUuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy94c2QvX2RvdWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWE5OTUxLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy94c2QvX2RvdWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDk1ICswLDAgQEAKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBfZG91YmxlLmphdmEKLSAqCi0gKiBUaGlzIGZpbGUgd2FzIGF1dG8tZ2VuZXJhdGVkIGZyb20gV1NETAotICogYnkgdGhlIEFwYWNoZSBBeGlzMiB2ZXJzaW9uOiBTTkFQU0hPVCAgQnVpbHQgb24gOiBEZWMgMjEsIDIwMDcgKDA0OjAzOjMwIExLVCkKLSAqLwotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnhzZDsKLSAgICAgICAgICAgIAotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogIF9kb3VibGUgYmVhbiBjbGFzcwotICAgICAgICAgICAgKi8KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyAgY2xhc3MgX2RvdWJsZQotICAgICAgICBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCQmVhbnsKLSAgICAgICAgLyogVGhpcyB0eXBlIHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgcGllY2Ugb2Ygc2NoZW1hIHRoYXQgaGFkCi0gICAgICAgICAgICAgICAgbmFtZSA9IGRvdWJsZQotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBVUkkgPSBodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYQotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBQcmVmaXggPSBuczEKLSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgCi0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZW5lcmF0ZVByZWZpeChqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICAgICAgaWYobmFtZXNwYWNlLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSl7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJ4c2QiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgIH0KLQotICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIGZpZWxkIGZvciBfZG91YmxlCi0gICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBkb3VibGUgbG9jYWxfZG91YmxlIDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBnZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gZG91YmxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljICBkb3VibGUgZ2V0X2RvdWJsZSgpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbF9kb3VibGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBzZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gcGFyYW0gX2RvdWJsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0X2RvdWJsZShkb3VibGUgcGFyYW0pewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2FsX2RvdWJsZT1wYXJhbTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsX2RvdWJsZSArICIiOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgLyoqCi0gICAgICogaXNSZWFkZXJNVE9NQXdhcmUKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlYWRlciBzdXBwb3J0cyBNVE9NCi0gICAgICovCi0gICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIHRyeXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGphdmEubGFuZy5Cb29sZWFuLlRSVUUuZXF1YWxzKHJlYWRlci5nZXRQcm9wZXJ0eShvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQ29uc3RhbnRzLklTX0RBVEFfSEFORExFUlNfQVdBUkUpKTsKLSAgICAgICAgfWNhdGNoKGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXNSZWFkZXJNVE9NQXdhcmU7Ci0gICB9Ci0gICAgIAotICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICoKLSAgICAgICAgKiBAcGFyYW0gcGFyZW50UU5hbWUKLSAgICAgICAgKiBAcGFyYW0gZmFjdG9yeQotICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICBwdWJsaWMgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgZ2V0T01FbGVtZW50ICgKLSAgICAgICAgICAgICAgIGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5KSB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlIGRhdGFTb3VyY2UgPQotICAgICAgICAgICAgICAgICAgICAgICBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJEYXRhU291cmNlKHRoaXMscGFyZW50UU5hbWUpewotCi0gICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICBfZG91YmxlLnRoaXMuc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmxsb20uT01Tb3VyY2VkRWxlbWVudEltcGwoCi0gICAgICAgICAgICAgICBwYXJlbnRRTmFtZSxmYWN0b3J5LGRhdGFTb3VyY2UpOwotICAgICAgICAgICAgCi0gICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyLGZhbHNlKTsKLSAgICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VyaWFsaXplVHlwZSkKLSAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLQotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBwYXJlbnRRTmFtZS5nZXRQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlID0gcGFyZW50UU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2UgIT0gbnVsbCkgJiYgKG5hbWVzcGFjZS50cmltKCkubGVuZ3RoKCkgPiAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB3cml0ZXJQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAod3JpdGVyUHJlZml4ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQobmFtZXNwYWNlLCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwcmVmaXgsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICBpZiAoc2VyaWFsaXplVHlwZSl7Ci0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKTsKLSAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZVByZWZpeCAhPSBudWxsKSAmJiAobmFtZXNwYWNlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApKXsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VQcmVmaXgrIjpkb3VibGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJkb3VibGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoamF2YS5sYW5nLkRvdWJsZS5pc05hTihsb2NhbF9kb3VibGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oImRvdWJsZSBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxfZG91YmxlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGggdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgcHJlZml4LGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgaWYgKHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotCi0gICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotCi0gICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSwgamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVOYW1lc3BhY2UgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgoYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVZhbHVlOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IGF0dHJpYnV0ZVByZWZpeCArICI6IiArIHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLCBhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAvKioKLSAgICAgICAgICogIG1ldGhvZCB0byBoYW5kbGUgUW5hbWVzCi0gICAgICAgICAqLwotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHByZWZpeCArICI6IiArIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBpLmUgdGhpcyBpcyB0aGUgZGVmYXVsdCBuYW1lc3BhY2UKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVzKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWVbXSBxbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgIGlmIChxbmFtZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gc3RvcmUgdGhpcyBkYXRhIHVudGlsIGxhc3QgbW9tZW50IHNpbmNlIGl0IGlzIG5vdCBwb3NzaWJsZSB0byB3cml0ZSBhbnkKLSAgICAgICAgICAgICAgICAvLyBuYW1lc3BhY2UgZGF0YSBhZnRlciB3cml0aW5nIHRoZSBjaGFyYWN0b3IgZGF0YQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmdCdWZmZXIgc3RyaW5nVG9Xcml0ZSA9IG5ldyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcW5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQoIiAiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VVUkkgPSBxbmFtZXNbaV0uZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwcmVmaXggPT0gbnVsbCkgfHwgKHByZWZpeC5sZW5ndGgoKSA9PSAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKHByZWZpeCkuYXBwZW5kKCI6IikuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMoc3RyaW5nVG9Xcml0ZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAqIFJlZ2lzdGVyIGEgbmFtZXNwYWNlIHByZWZpeAotICAgICAgICAgKi8KLSAgICAgICAgIHByaXZhdGUgamF2YS5sYW5nLlN0cmluZyByZWdpc3RlclByZWZpeChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHhtbFdyaXRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiBwcmVmaXg7Ci0gICAgICAgICAgICB9Ci0KLQotICAKLSAgICAgICAgLyoqCi0gICAgICAgICogZGF0YWJpbmRpbmcgbWV0aG9kIHRvIGdldCBhbiBYTUwgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QKLSAgICAgICAgKgotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgZ2V0UHVsbFBhcnNlcihqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFOYW1lKQotICAgICAgICAgICAgICAgICAgICB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBlbGVtZW50TGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgYXR0cmliTGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVyLkVMRU1FTlRfVEVYVCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsX2RvdWJsZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXJJbXBsKHFOYW1lLCBlbGVtZW50TGlzdC50b0FycmF5KCksIGF0dHJpYkxpc3QudG9BcnJheSgpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gIAotCi0gICAgIC8qKgotICAgICAgKiAgRmFjdG9yeSBjbGFzcyB0aGF0IGtlZXBzIHRoZSBwYXJzZSBtZXRob2QKLSAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5ewotCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIF9kb3VibGUgZnJvbVN0cmluZyhqYXZhLmxhbmcuU3RyaW5nIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJKXsKLSAgICAgICAgICAgICAgICAgICAgX2RvdWJsZSByZXR1cm5WYWx1ZSA9IG5ldyAgX2RvdWJsZSgpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZS5zZXRfZG91YmxlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvRG91YmxlKHZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBfZG91YmxlIGZyb21TdHJpbmcoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBjb250ZW50LnN1YnN0cmluZygwLGNvbnRlbnQuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVXJpID0geG1sU3RyZWFtUmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfZG91YmxlLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LG5hbWVzcGFjZVVyaSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfZG91YmxlLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LCIiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgCi0KLSAgICAgICAgLyoqCi0gICAgICAgICogc3RhdGljIG1ldGhvZCB0byBjcmVhdGUgdGhlIG9iamVjdAotICAgICAgICAqIFByZWNvbmRpdGlvbjogIElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSBjdXJyZW50IG9yIG5leHQgc3RhcnQgZWxlbWVudCBzdGFydHMgdGhpcyBvYmplY3QgYW5kIGFueSBpbnRlcnZlbmluZyByZWFkZXIgZXZlbnRzIGFyZSBpZ25vcmFibGUKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBub3QgYW4gZWxlbWVudCwgaXQgaXMgYSBjb21wbGV4IHR5cGUgYW5kIHRoZSByZWFkZXIgaXMgYXQgdGhlIGV2ZW50IGp1c3QgYWZ0ZXIgdGhlIG91dGVyIHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgKiBQb3N0Y29uZGl0aW9uOiBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgaXRzIGVuZCBlbGVtZW50Ci0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgYSBjb21wbGV4IHR5cGUsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCB0aGUgZW5kIGVsZW1lbnQgb2YgaXRzIG91dGVyIGVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBfZG91YmxlIHBhcnNlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb257Ci0gICAgICAgICAgICBfZG91YmxlIG9iamVjdCA9Ci0gICAgICAgICAgICAgICAgbmV3IF9kb3VibGUoKTsKLQotICAgICAgICAgICAgaW50IGV2ZW50OwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuaWxsYWJsZVZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0iIjsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNldXJpID0iIjsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUgKCFyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAmJiAhcmVhZGVyLmlzRW5kRWxlbWVudCgpKQotICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIikhPW51bGwpewotICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBmdWxsVHlwZU5hbWUgPSByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIik7Ci0gICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1ByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKDAsZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBuc1ByZWZpeD09bnVsbD8iIjpuc1ByZWZpeDsKLQotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHR5cGUgPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikrMSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghImRvdWJsZSIuZXF1YWxzKHR5cGUpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9maW5kIG5hbWVzcGFjZSBmb3IgdGhlIHByZWZpeAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zVXJpID0gcmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkobnNQcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKF9kb3VibGUpb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy54c2QuRXh0ZW5zaW9uTWFwcGVyLmdldFR5cGVPYmplY3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNVcmksdHlwZSxyZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gTm90ZSBhbGwgYXR0cmlidXRlcyB0aGF0IHdlcmUgaGFuZGxlZC4gVXNlZCB0byBkaWZmZXIgbm9ybWFsIGF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgICAvLyBmcm9tIGFueUF0dHJpYnV0ZXMuCi0gICAgICAgICAgICAgICAgamF2YS51dGlsLlZlY3RvciBoYW5kbGVkQXR0cmlidXRlcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUoIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQgPSByZWFkZXIuZ2V0RWxlbWVudFRleHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5zZXRfZG91YmxlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9Eb3VibGUoY29udGVudCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIEVuZCBvZiBpZiBmb3IgZXhwZWN0ZWQgcHJvcGVydHkgc3RhcnQgZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHN0YXJ0IGVsZW1lbnQgd2UgYXJlIG5vdCBleHBlY3RpbmcgaW5kaWNhdGVzIGFuIGludmFsaWQgcGFyYW1ldGVyIHdhcyBwYXNzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIlVuZXhwZWN0ZWQgc3ViZWxlbWVudCAiICsgcmVhZGVyLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBlbmQgb2Ygd2hpbGUgbG9vcAotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLQotCi0gICAgICAgICAgICB9IGNhdGNoIChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEubGFuZy5FeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBvYmplY3Q7Ci0gICAgICAgIH0KLQotICAgICAgICB9Ly9lbmQgb2YgZmFjdG9yeSBjbGFzcwotCi0gICAgICAgIAotCi0gICAgICAgIH0KLSAgICAgICAgICAgCi0gICAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3hzZC9fZmxvYXQuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy94c2QvX2Zsb2F0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkMjgxNzUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3hzZC9fZmxvYXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5NSArMCwwIEBACi0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICogX2Zsb2F0LmphdmEKLSAqCi0gKiBUaGlzIGZpbGUgd2FzIGF1dG8tZ2VuZXJhdGVkIGZyb20gV1NETAotICogYnkgdGhlIEFwYWNoZSBBeGlzMiB2ZXJzaW9uOiBTTkFQU0hPVCAgQnVpbHQgb24gOiBEZWMgMjEsIDIwMDcgKDA0OjAzOjMwIExLVCkKLSAqLwotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnhzZDsKLSAgICAgICAgICAgIAotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogIF9mbG9hdCBiZWFuIGNsYXNzCi0gICAgICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgcHVibGljICBjbGFzcyBfZmxvYXQKLSAgICAgICAgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkJlYW57Ci0gICAgICAgIC8qIFRoaXMgdHlwZSB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIHBpZWNlIG9mIHNjaGVtYSB0aGF0IGhhZAotICAgICAgICAgICAgICAgIG5hbWUgPSBmbG9hdAotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBVUkkgPSBodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYQotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBQcmVmaXggPSBuczEKLSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgCi0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZW5lcmF0ZVByZWZpeChqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICAgICAgaWYobmFtZXNwYWNlLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSl7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJ4c2QiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgIH0KLQotICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIGZpZWxkIGZvciBfZmxvYXQKLSAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIGZsb2F0IGxvY2FsX2Zsb2F0IDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBnZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gZmxvYXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgIGZsb2F0IGdldF9mbG9hdCgpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbF9mbG9hdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIHNldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSBwYXJhbSBfZmxvYXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldF9mbG9hdChmbG9hdCBwYXJhbSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYWxfZmxvYXQ9cGFyYW07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbF9mbG9hdCArICIiOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgLyoqCi0gICAgICogaXNSZWFkZXJNVE9NQXdhcmUKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlYWRlciBzdXBwb3J0cyBNVE9NCi0gICAgICovCi0gICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIHRyeXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGphdmEubGFuZy5Cb29sZWFuLlRSVUUuZXF1YWxzKHJlYWRlci5nZXRQcm9wZXJ0eShvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQ29uc3RhbnRzLklTX0RBVEFfSEFORExFUlNfQVdBUkUpKTsKLSAgICAgICAgfWNhdGNoKGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXNSZWFkZXJNVE9NQXdhcmU7Ci0gICB9Ci0gICAgIAotICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICoKLSAgICAgICAgKiBAcGFyYW0gcGFyZW50UU5hbWUKLSAgICAgICAgKiBAcGFyYW0gZmFjdG9yeQotICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICBwdWJsaWMgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgZ2V0T01FbGVtZW50ICgKLSAgICAgICAgICAgICAgIGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5KSB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlIGRhdGFTb3VyY2UgPQotICAgICAgICAgICAgICAgICAgICAgICBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJEYXRhU291cmNlKHRoaXMscGFyZW50UU5hbWUpewotCi0gICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICBfZmxvYXQudGhpcy5zZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5PTVNvdXJjZWRFbGVtZW50SW1wbCgKLSAgICAgICAgICAgICAgIHBhcmVudFFOYW1lLGZhY3RvcnksZGF0YVNvdXJjZSk7Ci0gICAgICAgICAgICAKLSAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIsZmFsc2UpOwotICAgICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzZXJpYWxpemVUeXBlKQotICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotCi0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UgPSBudWxsOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHBhcmVudFFOYW1lLmdldFByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UgPSBwYXJlbnRRTmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZSAhPSBudWxsKSAmJiAobmFtZXNwYWNlLnRyaW0oKS5sZW5ndGgoKSA+IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHdyaXRlclByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3cml0ZXJQcmVmaXggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChuYW1lc3BhY2UsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHByZWZpeCwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCksIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIGlmIChzZXJpYWxpemVUeXBlKXsKLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpOwotICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlUHJlZml4ICE9IG51bGwpICYmIChuYW1lc3BhY2VQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkpewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVByZWZpeCsiOmZsb2F0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiZmxvYXQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoamF2YS5sYW5nLkZsb2F0LmlzTmFOKGxvY2FsX2Zsb2F0KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJmbG9hdCBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxfZmxvYXQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBwcmVmaXgsamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICBpZiAoeG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0KLSAgICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0KLSAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLCBqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZU5hbWVzcGFjZSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlVmFsdWU7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gYXR0cmlidXRlUHJlZml4ICsgIjoiICsgcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsIGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIC8qKgotICAgICAgICAgKiAgbWV0aG9kIHRvIGhhbmRsZSBRbmFtZXMKLSAgICAgICAgICovCi0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWUoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMocHJlZml4ICsgIjoiICsgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGkuZSB0aGlzIGlzIHRoZSBkZWZhdWx0IG5hbWVzcGFjZQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZXMoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZVtdIHFuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgaWYgKHFuYW1lcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBzdG9yZSB0aGlzIGRhdGEgdW50aWwgbGFzdCBtb21lbnQgc2luY2UgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHdyaXRlIGFueQotICAgICAgICAgICAgICAgIC8vIG5hbWVzcGFjZSBkYXRhIGFmdGVyIHdyaXRpbmcgdGhlIGNoYXJhY3RvciBkYXRhCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZ0J1ZmZlciBzdHJpbmdUb1dyaXRlID0gbmV3IGphdmEubGFuZy5TdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBxbmFtZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZCgiICIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVVSSSA9IHFuYW1lc1tpXS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHByZWZpeCA9PSBudWxsKSB8fCAocHJlZml4Lmxlbmd0aCgpID09IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQocHJlZml4KS5hcHBlbmQoIjoiKS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhzdHJpbmdUb1dyaXRlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotCi0gICAgICAgICAvKioKLSAgICAgICAgICogUmVnaXN0ZXIgYSBuYW1lc3BhY2UgcHJlZml4Ci0gICAgICAgICAqLwotICAgICAgICAgcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHJlZ2lzdGVyUHJlZml4KGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoeG1sV3JpdGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHByZWZpeDsKLSAgICAgICAgICAgIH0KLQotCi0gIAotICAgICAgICAvKioKLSAgICAgICAgKiBkYXRhYmluZGluZyBtZXRob2QgdG8gZ2V0IGFuIFhNTCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdAotICAgICAgICAqCi0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciBnZXRQdWxsUGFyc2VyKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcU5hbWUpCi0gICAgICAgICAgICAgICAgICAgIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGVsZW1lbnRMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBhdHRyaWJMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXIuRUxFTUVOVF9URVhUKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxfZmxvYXQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVySW1wbChxTmFtZSwgZWxlbWVudExpc3QudG9BcnJheSgpLCBhdHRyaWJMaXN0LnRvQXJyYXkoKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAKLQotICAgICAvKioKLSAgICAgICogIEZhY3RvcnkgY2xhc3MgdGhhdCBrZWVwcyB0aGUgcGFyc2UgbWV0aG9kCi0gICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeXsKLQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBfZmxvYXQgZnJvbVN0cmluZyhqYXZhLmxhbmcuU3RyaW5nIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJKXsKLSAgICAgICAgICAgICAgICAgICAgX2Zsb2F0IHJldHVyblZhbHVlID0gbmV3ICBfZmxvYXQoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUuc2V0X2Zsb2F0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvRmxvYXQodmFsdWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIF9mbG9hdCBmcm9tU3RyaW5nKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50LmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gY29udGVudC5zdWJzdHJpbmcoMCxjb250ZW50LmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVyaSA9IHhtbFN0cmVhbVJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2Zsb2F0LkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LG5hbWVzcGFjZVVyaSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfZmxvYXQuRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsIiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAKLQotICAgICAgICAvKioKLSAgICAgICAgKiBzdGF0aWMgbWV0aG9kIHRvIGNyZWF0ZSB0aGUgb2JqZWN0Ci0gICAgICAgICogUHJlY29uZGl0aW9uOiAgSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIGN1cnJlbnQgb3IgbmV4dCBzdGFydCBlbGVtZW50IHN0YXJ0cyB0aGlzIG9iamVjdCBhbmQgYW55IGludGVydmVuaW5nIHJlYWRlciBldmVudHMgYXJlIGlnbm9yYWJsZQotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIG5vdCBhbiBlbGVtZW50LCBpdCBpcyBhIGNvbXBsZXggdHlwZSBhbmQgdGhlIHJlYWRlciBpcyBhdCB0aGUgZXZlbnQganVzdCBhZnRlciB0aGUgb3V0ZXIgc3RhcnQgZWxlbWVudAotICAgICAgICAqIFBvc3Rjb25kaXRpb246IElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCBpdHMgZW5kIGVsZW1lbnQKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBhIGNvbXBsZXggdHlwZSwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IHRoZSBlbmQgZWxlbWVudCBvZiBpdHMgb3V0ZXIgZWxlbWVudAotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIF9mbG9hdCBwYXJzZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uewotICAgICAgICAgICAgX2Zsb2F0IG9iamVjdCA9Ci0gICAgICAgICAgICAgICAgbmV3IF9mbG9hdCgpOwotCi0gICAgICAgICAgICBpbnQgZXZlbnQ7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5pbGxhYmxlVmFsdWUgPSBudWxsOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSIiOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2V1cmkgPSIiOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSAoIXJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICYmICFyZWFkZXIuaXNFbmRFbGVtZW50KCkpCi0gICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiKSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGZ1bGxUeXBlTmFtZSA9IHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiKTsKLSAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUhPW51bGwpewotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zUHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoMCxmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IG5zUHJlZml4PT1udWxsPyIiOm5zUHJlZml4OwotCi0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgdHlwZSA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSsxKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEiZmxvYXQiLmVxdWFscyh0eXBlKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZmluZCBuYW1lc3BhY2UgZm9yIHRoZSBwcmVmaXgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1VyaSA9IHJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKG5zUHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChfZmxvYXQpb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy54c2QuRXh0ZW5zaW9uTWFwcGVyLmdldFR5cGVPYmplY3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNVcmksdHlwZSxyZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gTm90ZSBhbGwgYXR0cmlidXRlcyB0aGF0IHdlcmUgaGFuZGxlZC4gVXNlZCB0byBkaWZmZXIgbm9ybWFsIGF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgICAvLyBmcm9tIGFueUF0dHJpYnV0ZXMuCi0gICAgICAgICAgICAgICAgamF2YS51dGlsLlZlY3RvciBoYW5kbGVkQXR0cmlidXRlcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUoIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQgPSByZWFkZXIuZ2V0RWxlbWVudFRleHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5zZXRfZmxvYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb0Zsb2F0KGNvbnRlbnQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBFbmQgb2YgaWYgZm9yIGV4cGVjdGVkIHByb3BlcnR5IHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2V7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBzdGFydCBlbGVtZW50IHdlIGFyZSBub3QgZXhwZWN0aW5nIGluZGljYXRlcyBhbiBpbnZhbGlkIHBhcmFtZXRlciB3YXMgcGFzc2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJVbmV4cGVjdGVkIHN1YmVsZW1lbnQgIiArIHJlYWRlci5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gZW5kIG9mIHdoaWxlIGxvb3AKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0KLQotICAgICAgICAgICAgfSBjYXRjaCAoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gb2JqZWN0OwotICAgICAgICB9Ci0KLSAgICAgICAgfS8vZW5kIG9mIGZhY3RvcnkgY2xhc3MKLQotICAgICAgICAKLQotICAgICAgICB9Ci0gICAgICAgICAgIAotICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy94c2QvX2ludC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3hzZC9faW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5NDIzMTMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3hzZC9faW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OTUgKzAsMCBAQAotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIF9pbnQuamF2YQotICoKLSAqIFRoaXMgZmlsZSB3YXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBXU0RMCi0gKiBieSB0aGUgQXBhY2hlIEF4aXMyIHZlcnNpb246IFNOQVBTSE9UICBCdWlsdCBvbiA6IERlYyAyMSwgMjAwNyAoMDQ6MDM6MzAgTEtUKQotICovCi0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBwYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkOwotICAgICAgICAgICAgCi0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiAgX2ludCBiZWFuIGNsYXNzCi0gICAgICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgcHVibGljICBjbGFzcyBfaW50Ci0gICAgICAgIGltcGxlbWVudHMgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJCZWFuewotICAgICAgICAvKiBUaGlzIHR5cGUgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBwaWVjZSBvZiBzY2hlbWEgdGhhdCBoYWQKLSAgICAgICAgICAgICAgICBuYW1lID0gaW50Ci0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFVSSSA9IGh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFByZWZpeCA9IG5zMQotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdlbmVyYXRlUHJlZml4KGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB7Ci0gICAgICAgICAgICBpZihuYW1lc3BhY2UuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpKXsKLSAgICAgICAgICAgICAgICByZXR1cm4gInhzZCI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgfQotCi0gICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogZmllbGQgZm9yIF9pbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIGludCBsb2NhbF9pbnQgOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIGdldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiBpbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgIGludCBnZXRfaW50KCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsX2ludDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIHNldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSBwYXJhbSBfaW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRfaW50KGludCBwYXJhbSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYWxfaW50PXBhcmFtOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxfaW50ICsgIiI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAvKioKLSAgICAgKiBpc1JlYWRlck1UT01Bd2FyZQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVhZGVyIHN1cHBvcnRzIE1UT00KLSAgICAgKi8KLSAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKLSAgICAgICAgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICAKLSAgICAgICAgdHJ5ewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gamF2YS5sYW5nLkJvb2xlYW4uVFJVRS5lcXVhbHMocmVhZGVyLmdldFByb3BlcnR5KG9yZy5hcGFjaGUuYXhpb20ub20uT01Db25zdGFudHMuSVNfREFUQV9IQU5ETEVSU19BV0FSRSkpOwotICAgICAgICB9Y2F0Y2goamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpc1JlYWRlck1UT01Bd2FyZTsKLSAgIH0KLSAgICAgCi0gICAgIAotICAgICAgICAvKioKLSAgICAgICAgKgotICAgICAgICAqIEBwYXJhbSBwYXJlbnRRTmFtZQotICAgICAgICAqIEBwYXJhbSBmYWN0b3J5Ci0gICAgICAgICogQHJldHVybiBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudAotICAgICAgICAqLwotICAgICAgIHB1YmxpYyBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCBnZXRPTUVsZW1lbnQgKAotICAgICAgICAgICAgICAgZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnkpIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTURhdGFTb3VyY2UgZGF0YVNvdXJjZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkRhdGFTb3VyY2UodGhpcyxwYXJlbnRRTmFtZSl7Ci0KLSAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgIF9pbnQudGhpcy5zZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5PTVNvdXJjZWRFbGVtZW50SW1wbCgKLSAgICAgICAgICAgICAgIHBhcmVudFFOYW1lLGZhY3RvcnksZGF0YVNvdXJjZSk7Ci0gICAgICAgICAgICAKLSAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIsZmFsc2UpOwotICAgICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzZXJpYWxpemVUeXBlKQotICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotCi0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UgPSBudWxsOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHBhcmVudFFOYW1lLmdldFByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UgPSBwYXJlbnRRTmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZSAhPSBudWxsKSAmJiAobmFtZXNwYWNlLnRyaW0oKS5sZW5ndGgoKSA+IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHdyaXRlclByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3cml0ZXJQcmVmaXggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChuYW1lc3BhY2UsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHByZWZpeCwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCksIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIGlmIChzZXJpYWxpemVUeXBlKXsKLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpOwotICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlUHJlZml4ICE9IG51bGwpICYmIChuYW1lc3BhY2VQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkpewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVByZWZpeCsiOmludCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgImludCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbF9pbnQ9PWphdmEubGFuZy5JbnRlZ2VyLk1JTl9WQUxVRSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJpbnQgY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsX2ludCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRoIHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCxqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgIGlmICh4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLQotICAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsIGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlTmFtZXNwYWNlID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVWYWx1ZTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBhdHRyaWJ1dGVQcmVmaXggKyAiOiIgKyBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSwgYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICBtZXRob2QgdG8gaGFuZGxlIFFuYW1lcwotICAgICAgICAgKi8KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZShqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhwcmVmaXggKyAiOiIgKyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaS5lIHRoaXMgaXMgdGhlIGRlZmF1bHQgbmFtZXNwYWNlCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lcyhqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lW10gcW5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICBpZiAocW5hbWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHRvIHN0b3JlIHRoaXMgZGF0YSB1bnRpbCBsYXN0IG1vbWVudCBzaW5jZSBpdCBpcyBub3QgcG9zc2libGUgdG8gd3JpdGUgYW55Ci0gICAgICAgICAgICAgICAgLy8gbmFtZXNwYWNlIGRhdGEgYWZ0ZXIgd3JpdGluZyB0aGUgY2hhcmFjdG9yIGRhdGEKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIHN0cmluZ1RvV3JpdGUgPSBuZXcgamF2YS5sYW5nLlN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHFuYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKCIgIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlVVJJID0gcW5hbWVzW2ldLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocHJlZml4ID09IG51bGwpIHx8IChwcmVmaXgubGVuZ3RoKCkgPT0gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChwcmVmaXgpLmFwcGVuZCgiOiIpLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHN0cmluZ1RvV3JpdGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0KLSAgICAgICAgIC8qKgotICAgICAgICAgKiBSZWdpc3RlciBhIG5hbWVzcGFjZSBwcmVmaXgKLSAgICAgICAgICovCi0gICAgICAgICBwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgcmVnaXN0ZXJQcmVmaXgoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLCBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlICh4bWxXcml0ZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gcHJlZml4OwotICAgICAgICAgICAgfQotCi0KLSAgCi0gICAgICAgIC8qKgotICAgICAgICAqIGRhdGFiaW5kaW5nIG1ldGhvZCB0byBnZXQgYW4gWE1MIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0Ci0gICAgICAgICoKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIGdldFB1bGxQYXJzZXIoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxTmFtZSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgZWxlbWVudExpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGF0dHJpYkxpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlci5FTEVNRU5UX1RFWFQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbF9pbnQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVySW1wbChxTmFtZSwgZWxlbWVudExpc3QudG9BcnJheSgpLCBhdHRyaWJMaXN0LnRvQXJyYXkoKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAKLQotICAgICAvKioKLSAgICAgICogIEZhY3RvcnkgY2xhc3MgdGhhdCBrZWVwcyB0aGUgcGFyc2UgbWV0aG9kCi0gICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeXsKLQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBfaW50IGZyb21TdHJpbmcoamF2YS5sYW5nLlN0cmluZyB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSl7Ci0gICAgICAgICAgICAgICAgICAgIF9pbnQgcmV0dXJuVmFsdWUgPSBuZXcgIF9pbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUuc2V0X2ludCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb0ludCh2YWx1ZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgX2ludCBmcm9tU3RyaW5nKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50LmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gY29udGVudC5zdWJzdHJpbmcoMCxjb250ZW50LmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVyaSA9IHhtbFN0cmVhbVJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2ludC5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCxuYW1lc3BhY2VVcmkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2ludC5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCwiIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIAotCi0gICAgICAgIC8qKgotICAgICAgICAqIHN0YXRpYyBtZXRob2QgdG8gY3JlYXRlIHRoZSBvYmplY3QKLSAgICAgICAgKiBQcmVjb25kaXRpb246ICBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgY3VycmVudCBvciBuZXh0IHN0YXJ0IGVsZW1lbnQgc3RhcnRzIHRoaXMgb2JqZWN0IGFuZCBhbnkgaW50ZXJ2ZW5pbmcgcmVhZGVyIGV2ZW50cyBhcmUgaWdub3JhYmxlCi0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgbm90IGFuIGVsZW1lbnQsIGl0IGlzIGEgY29tcGxleCB0eXBlIGFuZCB0aGUgcmVhZGVyIGlzIGF0IHRoZSBldmVudCBqdXN0IGFmdGVyIHRoZSBvdXRlciBzdGFydCBlbGVtZW50Ci0gICAgICAgICogUG9zdGNvbmRpdGlvbjogSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IGl0cyBlbmQgZWxlbWVudAotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIGEgY29tcGxleCB0eXBlLCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgdGhlIGVuZCBlbGVtZW50IG9mIGl0cyBvdXRlciBlbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgX2ludCBwYXJzZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uewotICAgICAgICAgICAgX2ludCBvYmplY3QgPQotICAgICAgICAgICAgICAgIG5ldyBfaW50KCk7Ci0KLSAgICAgICAgICAgIGludCBldmVudDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmlsbGFibGVWYWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IiI7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZXVyaSA9IiI7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlICghcmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgJiYgIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkKLSAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIpIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgZnVsbFR5cGVOYW1lID0gcmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAidHlwZSIpOwotICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNQcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZygwLGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gbnNQcmVmaXg9PW51bGw/IiI6bnNQcmVmaXg7Ci0KLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB0eXBlID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZyhmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKzEpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISJpbnQiLmVxdWFscyh0eXBlKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZmluZCBuYW1lc3BhY2UgZm9yIHRoZSBwcmVmaXgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1VyaSA9IHJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKG5zUHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChfaW50KW9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkLkV4dGVuc2lvbk1hcHBlci5nZXRUeXBlT2JqZWN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zVXJpLHR5cGUscmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIE5vdGUgYWxsIGF0dHJpYnV0ZXMgdGhhdCB3ZXJlIGhhbmRsZWQuIFVzZWQgdG8gZGlmZmVyIG5vcm1hbCBhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgICAgLy8gZnJvbSBhbnlBdHRyaWJ1dGVzLgotICAgICAgICAgICAgICAgIGphdmEudXRpbC5WZWN0b3IgaGFuZGxlZEF0dHJpYnV0ZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlKCFyZWFkZXIuaXNFbmRFbGVtZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50ID0gcmVhZGVyLmdldEVsZW1lbnRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0X2ludCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvSW50KGNvbnRlbnQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBFbmQgb2YgaWYgZm9yIGV4cGVjdGVkIHByb3BlcnR5IHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2V7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBzdGFydCBlbGVtZW50IHdlIGFyZSBub3QgZXhwZWN0aW5nIGluZGljYXRlcyBhbiBpbnZhbGlkIHBhcmFtZXRlciB3YXMgcGFzc2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJVbmV4cGVjdGVkIHN1YmVsZW1lbnQgIiArIHJlYWRlci5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gZW5kIG9mIHdoaWxlIGxvb3AKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0KLQotICAgICAgICAgICAgfSBjYXRjaCAoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gb2JqZWN0OwotICAgICAgICB9Ci0KLSAgICAgICAgfS8vZW5kIG9mIGZhY3RvcnkgY2xhc3MKLQotICAgICAgICAKLQotICAgICAgICB9Ci0gICAgICAgICAgIAotICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy94c2QvX2xvbmcuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy94c2QvX2xvbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I5YWQ5My4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMveHNkL19sb25nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OTUgKzAsMCBAQAotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIF9sb25nLmphdmEKLSAqCi0gKiBUaGlzIGZpbGUgd2FzIGF1dG8tZ2VuZXJhdGVkIGZyb20gV1NETAotICogYnkgdGhlIEFwYWNoZSBBeGlzMiB2ZXJzaW9uOiBTTkFQU0hPVCAgQnVpbHQgb24gOiBEZWMgMjEsIDIwMDcgKDA0OjAzOjMwIExLVCkKLSAqLwotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnhzZDsKLSAgICAgICAgICAgIAotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogIF9sb25nIGJlYW4gY2xhc3MKLSAgICAgICAgICAgICovCi0gICAgICAgIAotICAgICAgICBwdWJsaWMgIGNsYXNzIF9sb25nCi0gICAgICAgIGltcGxlbWVudHMgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJCZWFuewotICAgICAgICAvKiBUaGlzIHR5cGUgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBwaWVjZSBvZiBzY2hlbWEgdGhhdCBoYWQKLSAgICAgICAgICAgICAgICBuYW1lID0gbG9uZwotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBVUkkgPSBodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYQotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBQcmVmaXggPSBuczEKLSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgCi0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZW5lcmF0ZVByZWZpeChqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICAgICAgaWYobmFtZXNwYWNlLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSl7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJ4c2QiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgIH0KLQotICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIGZpZWxkIGZvciBfbG9uZwotICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgbG9uZyBsb2NhbF9sb25nIDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBnZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gbG9uZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyAgbG9uZyBnZXRfbG9uZygpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbF9sb25nOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgc2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtIHBhcmFtIF9sb25nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRfbG9uZyhsb25nIHBhcmFtKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2NhbF9sb25nPXBhcmFtOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxfbG9uZyArICIiOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgLyoqCi0gICAgICogaXNSZWFkZXJNVE9NQXdhcmUKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlYWRlciBzdXBwb3J0cyBNVE9NCi0gICAgICovCi0gICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIHRyeXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGphdmEubGFuZy5Cb29sZWFuLlRSVUUuZXF1YWxzKHJlYWRlci5nZXRQcm9wZXJ0eShvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQ29uc3RhbnRzLklTX0RBVEFfSEFORExFUlNfQVdBUkUpKTsKLSAgICAgICAgfWNhdGNoKGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXNSZWFkZXJNVE9NQXdhcmU7Ci0gICB9Ci0gICAgIAotICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICoKLSAgICAgICAgKiBAcGFyYW0gcGFyZW50UU5hbWUKLSAgICAgICAgKiBAcGFyYW0gZmFjdG9yeQotICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICBwdWJsaWMgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgZ2V0T01FbGVtZW50ICgKLSAgICAgICAgICAgICAgIGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5KSB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlIGRhdGFTb3VyY2UgPQotICAgICAgICAgICAgICAgICAgICAgICBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJEYXRhU291cmNlKHRoaXMscGFyZW50UU5hbWUpewotCi0gICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICBfbG9uZy50aGlzLnNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5sbG9tLk9NU291cmNlZEVsZW1lbnRJbXBsKAotICAgICAgICAgICAgICAgcGFyZW50UU5hbWUsZmFjdG9yeSxkYXRhU291cmNlKTsKLSAgICAgICAgICAgIAotICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcixmYWxzZSk7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNlcmlhbGl6ZVR5cGUpCi0gICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgCi0KLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gcGFyZW50UU5hbWUuZ2V0UHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZSA9IHBhcmVudFFOYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlICE9IG51bGwpICYmIChuYW1lc3BhY2UudHJpbSgpLmxlbmd0aCgpID4gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgd3JpdGVyUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdyaXRlclByZWZpeCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KG5hbWVzcGFjZSwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocHJlZml4LCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgaWYgKHNlcmlhbGl6ZVR5cGUpewotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIik7Ci0gICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2VQcmVmaXggIT0gbnVsbCkgJiYgKG5hbWVzcGFjZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlUHJlZml4KyI6bG9uZyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgImxvbmciLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxfbG9uZz09amF2YS5sYW5nLkxvbmcuTUlOX1ZBTFVFKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oImxvbmcgY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsX2xvbmcpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBwcmVmaXgsamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICBpZiAoeG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0KLSAgICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0KLSAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLCBqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZU5hbWVzcGFjZSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlVmFsdWU7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gYXR0cmlidXRlUHJlZml4ICsgIjoiICsgcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsIGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIC8qKgotICAgICAgICAgKiAgbWV0aG9kIHRvIGhhbmRsZSBRbmFtZXMKLSAgICAgICAgICovCi0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWUoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMocHJlZml4ICsgIjoiICsgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGkuZSB0aGlzIGlzIHRoZSBkZWZhdWx0IG5hbWVzcGFjZQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZXMoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZVtdIHFuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgaWYgKHFuYW1lcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBzdG9yZSB0aGlzIGRhdGEgdW50aWwgbGFzdCBtb21lbnQgc2luY2UgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHdyaXRlIGFueQotICAgICAgICAgICAgICAgIC8vIG5hbWVzcGFjZSBkYXRhIGFmdGVyIHdyaXRpbmcgdGhlIGNoYXJhY3RvciBkYXRhCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZ0J1ZmZlciBzdHJpbmdUb1dyaXRlID0gbmV3IGphdmEubGFuZy5TdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBxbmFtZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZCgiICIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVVSSSA9IHFuYW1lc1tpXS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHByZWZpeCA9PSBudWxsKSB8fCAocHJlZml4Lmxlbmd0aCgpID09IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQocHJlZml4KS5hcHBlbmQoIjoiKS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhzdHJpbmdUb1dyaXRlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotCi0gICAgICAgICAvKioKLSAgICAgICAgICogUmVnaXN0ZXIgYSBuYW1lc3BhY2UgcHJlZml4Ci0gICAgICAgICAqLwotICAgICAgICAgcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHJlZ2lzdGVyUHJlZml4KGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoeG1sV3JpdGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHByZWZpeDsKLSAgICAgICAgICAgIH0KLQotCi0gIAotICAgICAgICAvKioKLSAgICAgICAgKiBkYXRhYmluZGluZyBtZXRob2QgdG8gZ2V0IGFuIFhNTCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdAotICAgICAgICAqCi0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciBnZXRQdWxsUGFyc2VyKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcU5hbWUpCi0gICAgICAgICAgICAgICAgICAgIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGVsZW1lbnRMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBhdHRyaWJMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXIuRUxFTUVOVF9URVhUKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxfbG9uZykpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXJJbXBsKHFOYW1lLCBlbGVtZW50TGlzdC50b0FycmF5KCksIGF0dHJpYkxpc3QudG9BcnJheSgpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gIAotCi0gICAgIC8qKgotICAgICAgKiAgRmFjdG9yeSBjbGFzcyB0aGF0IGtlZXBzIHRoZSBwYXJzZSBtZXRob2QKLSAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5ewotCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIF9sb25nIGZyb21TdHJpbmcoamF2YS5sYW5nLlN0cmluZyB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSl7Ci0gICAgICAgICAgICAgICAgICAgIF9sb25nIHJldHVyblZhbHVlID0gbmV3ICBfbG9uZygpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZS5zZXRfbG9uZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb0xvbmcodmFsdWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIF9sb25nIGZyb21TdHJpbmcoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBjb250ZW50LnN1YnN0cmluZygwLGNvbnRlbnQuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVXJpID0geG1sU3RyZWFtUmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfbG9uZy5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCxuYW1lc3BhY2VVcmkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2xvbmcuRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsIiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAKLQotICAgICAgICAvKioKLSAgICAgICAgKiBzdGF0aWMgbWV0aG9kIHRvIGNyZWF0ZSB0aGUgb2JqZWN0Ci0gICAgICAgICogUHJlY29uZGl0aW9uOiAgSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIGN1cnJlbnQgb3IgbmV4dCBzdGFydCBlbGVtZW50IHN0YXJ0cyB0aGlzIG9iamVjdCBhbmQgYW55IGludGVydmVuaW5nIHJlYWRlciBldmVudHMgYXJlIGlnbm9yYWJsZQotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIG5vdCBhbiBlbGVtZW50LCBpdCBpcyBhIGNvbXBsZXggdHlwZSBhbmQgdGhlIHJlYWRlciBpcyBhdCB0aGUgZXZlbnQganVzdCBhZnRlciB0aGUgb3V0ZXIgc3RhcnQgZWxlbWVudAotICAgICAgICAqIFBvc3Rjb25kaXRpb246IElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCBpdHMgZW5kIGVsZW1lbnQKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBhIGNvbXBsZXggdHlwZSwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IHRoZSBlbmQgZWxlbWVudCBvZiBpdHMgb3V0ZXIgZWxlbWVudAotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIF9sb25nIHBhcnNlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb257Ci0gICAgICAgICAgICBfbG9uZyBvYmplY3QgPQotICAgICAgICAgICAgICAgIG5ldyBfbG9uZygpOwotCi0gICAgICAgICAgICBpbnQgZXZlbnQ7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5pbGxhYmxlVmFsdWUgPSBudWxsOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSIiOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2V1cmkgPSIiOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSAoIXJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICYmICFyZWFkZXIuaXNFbmRFbGVtZW50KCkpCi0gICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiKSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGZ1bGxUeXBlTmFtZSA9IHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiKTsKLSAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUhPW51bGwpewotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zUHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoMCxmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IG5zUHJlZml4PT1udWxsPyIiOm5zUHJlZml4OwotCi0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgdHlwZSA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSsxKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEibG9uZyIuZXF1YWxzKHR5cGUpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9maW5kIG5hbWVzcGFjZSBmb3IgdGhlIHByZWZpeAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zVXJpID0gcmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkobnNQcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKF9sb25nKW9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkLkV4dGVuc2lvbk1hcHBlci5nZXRUeXBlT2JqZWN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zVXJpLHR5cGUscmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIE5vdGUgYWxsIGF0dHJpYnV0ZXMgdGhhdCB3ZXJlIGhhbmRsZWQuIFVzZWQgdG8gZGlmZmVyIG5vcm1hbCBhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgICAgLy8gZnJvbSBhbnlBdHRyaWJ1dGVzLgotICAgICAgICAgICAgICAgIGphdmEudXRpbC5WZWN0b3IgaGFuZGxlZEF0dHJpYnV0ZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlKCFyZWFkZXIuaXNFbmRFbGVtZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50ID0gcmVhZGVyLmdldEVsZW1lbnRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0X2xvbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb0xvbmcoY29udGVudCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIEVuZCBvZiBpZiBmb3IgZXhwZWN0ZWQgcHJvcGVydHkgc3RhcnQgZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHN0YXJ0IGVsZW1lbnQgd2UgYXJlIG5vdCBleHBlY3RpbmcgaW5kaWNhdGVzIGFuIGludmFsaWQgcGFyYW1ldGVyIHdhcyBwYXNzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIlVuZXhwZWN0ZWQgc3ViZWxlbWVudCAiICsgcmVhZGVyLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBlbmQgb2Ygd2hpbGUgbG9vcAotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLQotCi0gICAgICAgICAgICB9IGNhdGNoIChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEubGFuZy5FeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBvYmplY3Q7Ci0gICAgICAgIH0KLQotICAgICAgICB9Ly9lbmQgb2YgZmFjdG9yeSBjbGFzcwotCi0gICAgICAgIAotCi0gICAgICAgIH0KLSAgICAgICAgICAgCi0gICAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3hzZC9fc2hvcnQuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy94c2QvX3Nob3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkYjQ1MTYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3hzZC9fc2hvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5NSArMCwwIEBACi0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICogX3Nob3J0LmphdmEKLSAqCi0gKiBUaGlzIGZpbGUgd2FzIGF1dG8tZ2VuZXJhdGVkIGZyb20gV1NETAotICogYnkgdGhlIEFwYWNoZSBBeGlzMiB2ZXJzaW9uOiBTTkFQU0hPVCAgQnVpbHQgb24gOiBEZWMgMjEsIDIwMDcgKDA0OjAzOjMwIExLVCkKLSAqLwotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnhzZDsKLSAgICAgICAgICAgIAotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogIF9zaG9ydCBiZWFuIGNsYXNzCi0gICAgICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgcHVibGljICBjbGFzcyBfc2hvcnQKLSAgICAgICAgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkJlYW57Ci0gICAgICAgIC8qIFRoaXMgdHlwZSB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIHBpZWNlIG9mIHNjaGVtYSB0aGF0IGhhZAotICAgICAgICAgICAgICAgIG5hbWUgPSBzaG9ydAotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBVUkkgPSBodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYQotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBQcmVmaXggPSBuczEKLSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgCi0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZW5lcmF0ZVByZWZpeChqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICAgICAgaWYobmFtZXNwYWNlLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSl7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJ4c2QiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgIH0KLQotICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIGZpZWxkIGZvciBfc2hvcnQKLSAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIHNob3J0IGxvY2FsX3Nob3J0IDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBnZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gc2hvcnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgIHNob3J0IGdldF9zaG9ydCgpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbF9zaG9ydDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIHNldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSBwYXJhbSBfc2hvcnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldF9zaG9ydChzaG9ydCBwYXJhbSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYWxfc2hvcnQ9cGFyYW07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbF9zaG9ydCArICIiOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgLyoqCi0gICAgICogaXNSZWFkZXJNVE9NQXdhcmUKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlYWRlciBzdXBwb3J0cyBNVE9NCi0gICAgICovCi0gICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIHRyeXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGphdmEubGFuZy5Cb29sZWFuLlRSVUUuZXF1YWxzKHJlYWRlci5nZXRQcm9wZXJ0eShvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQ29uc3RhbnRzLklTX0RBVEFfSEFORExFUlNfQVdBUkUpKTsKLSAgICAgICAgfWNhdGNoKGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXNSZWFkZXJNVE9NQXdhcmU7Ci0gICB9Ci0gICAgIAotICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICoKLSAgICAgICAgKiBAcGFyYW0gcGFyZW50UU5hbWUKLSAgICAgICAgKiBAcGFyYW0gZmFjdG9yeQotICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICBwdWJsaWMgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgZ2V0T01FbGVtZW50ICgKLSAgICAgICAgICAgICAgIGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5KSB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlIGRhdGFTb3VyY2UgPQotICAgICAgICAgICAgICAgICAgICAgICBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJEYXRhU291cmNlKHRoaXMscGFyZW50UU5hbWUpewotCi0gICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICBfc2hvcnQudGhpcy5zZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5PTVNvdXJjZWRFbGVtZW50SW1wbCgKLSAgICAgICAgICAgICAgIHBhcmVudFFOYW1lLGZhY3RvcnksZGF0YVNvdXJjZSk7Ci0gICAgICAgICAgICAKLSAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIsZmFsc2UpOwotICAgICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzZXJpYWxpemVUeXBlKQotICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotCi0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UgPSBudWxsOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHBhcmVudFFOYW1lLmdldFByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UgPSBwYXJlbnRRTmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZSAhPSBudWxsKSAmJiAobmFtZXNwYWNlLnRyaW0oKS5sZW5ndGgoKSA+IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHdyaXRlclByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3cml0ZXJQcmVmaXggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChuYW1lc3BhY2UsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHByZWZpeCwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCksIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIGlmIChzZXJpYWxpemVUeXBlKXsKLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpOwotICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlUHJlZml4ICE9IG51bGwpICYmIChuYW1lc3BhY2VQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkpewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVByZWZpeCsiOnNob3J0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAic2hvcnQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxfc2hvcnQ9PWphdmEubGFuZy5TaG9ydC5NSU5fVkFMVUUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigic2hvcnQgY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsX3Nob3J0KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGggdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgcHJlZml4LGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgaWYgKHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotCi0gICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotCi0gICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSwgamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVOYW1lc3BhY2UgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgoYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVZhbHVlOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IGF0dHJpYnV0ZVByZWZpeCArICI6IiArIHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLCBhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAvKioKLSAgICAgICAgICogIG1ldGhvZCB0byBoYW5kbGUgUW5hbWVzCi0gICAgICAgICAqLwotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHByZWZpeCArICI6IiArIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBpLmUgdGhpcyBpcyB0aGUgZGVmYXVsdCBuYW1lc3BhY2UKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVzKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWVbXSBxbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgIGlmIChxbmFtZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gc3RvcmUgdGhpcyBkYXRhIHVudGlsIGxhc3QgbW9tZW50IHNpbmNlIGl0IGlzIG5vdCBwb3NzaWJsZSB0byB3cml0ZSBhbnkKLSAgICAgICAgICAgICAgICAvLyBuYW1lc3BhY2UgZGF0YSBhZnRlciB3cml0aW5nIHRoZSBjaGFyYWN0b3IgZGF0YQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmdCdWZmZXIgc3RyaW5nVG9Xcml0ZSA9IG5ldyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcW5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQoIiAiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VVUkkgPSBxbmFtZXNbaV0uZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwcmVmaXggPT0gbnVsbCkgfHwgKHByZWZpeC5sZW5ndGgoKSA9PSAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKHByZWZpeCkuYXBwZW5kKCI6IikuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMoc3RyaW5nVG9Xcml0ZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAqIFJlZ2lzdGVyIGEgbmFtZXNwYWNlIHByZWZpeAotICAgICAgICAgKi8KLSAgICAgICAgIHByaXZhdGUgamF2YS5sYW5nLlN0cmluZyByZWdpc3RlclByZWZpeChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHhtbFdyaXRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiBwcmVmaXg7Ci0gICAgICAgICAgICB9Ci0KLQotICAKLSAgICAgICAgLyoqCi0gICAgICAgICogZGF0YWJpbmRpbmcgbWV0aG9kIHRvIGdldCBhbiBYTUwgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QKLSAgICAgICAgKgotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgZ2V0UHVsbFBhcnNlcihqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFOYW1lKQotICAgICAgICAgICAgICAgICAgICB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBlbGVtZW50TGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgYXR0cmliTGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVyLkVMRU1FTlRfVEVYVCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsX3Nob3J0KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlckltcGwocU5hbWUsIGVsZW1lbnRMaXN0LnRvQXJyYXkoKSwgYXR0cmliTGlzdC50b0FycmF5KCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgCi0KLSAgICAgLyoqCi0gICAgICAqICBGYWN0b3J5IGNsYXNzIHRoYXQga2VlcHMgdGhlIHBhcnNlIG1ldGhvZAotICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3Rvcnl7Ci0KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgX3Nob3J0IGZyb21TdHJpbmcoamF2YS5sYW5nLlN0cmluZyB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSl7Ci0gICAgICAgICAgICAgICAgICAgIF9zaG9ydCByZXR1cm5WYWx1ZSA9IG5ldyAgX3Nob3J0KCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlLnNldF9zaG9ydCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1Nob3J0KHZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBfc2hvcnQgZnJvbVN0cmluZyhqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudC5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IGNvbnRlbnQuc3Vic3RyaW5nKDAsY29udGVudC5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVcmkgPSB4bWxTdHJlYW1SZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9zaG9ydC5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCxuYW1lc3BhY2VVcmkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3Nob3J0LkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LCIiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgCi0KLSAgICAgICAgLyoqCi0gICAgICAgICogc3RhdGljIG1ldGhvZCB0byBjcmVhdGUgdGhlIG9iamVjdAotICAgICAgICAqIFByZWNvbmRpdGlvbjogIElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSBjdXJyZW50IG9yIG5leHQgc3RhcnQgZWxlbWVudCBzdGFydHMgdGhpcyBvYmplY3QgYW5kIGFueSBpbnRlcnZlbmluZyByZWFkZXIgZXZlbnRzIGFyZSBpZ25vcmFibGUKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBub3QgYW4gZWxlbWVudCwgaXQgaXMgYSBjb21wbGV4IHR5cGUgYW5kIHRoZSByZWFkZXIgaXMgYXQgdGhlIGV2ZW50IGp1c3QgYWZ0ZXIgdGhlIG91dGVyIHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgKiBQb3N0Y29uZGl0aW9uOiBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgaXRzIGVuZCBlbGVtZW50Ci0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgYSBjb21wbGV4IHR5cGUsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCB0aGUgZW5kIGVsZW1lbnQgb2YgaXRzIG91dGVyIGVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBfc2hvcnQgcGFyc2UoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIF9zaG9ydCBvYmplY3QgPQotICAgICAgICAgICAgICAgIG5ldyBfc2hvcnQoKTsKLQotICAgICAgICAgICAgaW50IGV2ZW50OwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuaWxsYWJsZVZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0iIjsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNldXJpID0iIjsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUgKCFyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAmJiAhcmVhZGVyLmlzRW5kRWxlbWVudCgpKQotICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIikhPW51bGwpewotICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBmdWxsVHlwZU5hbWUgPSByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIik7Ci0gICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1ByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKDAsZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBuc1ByZWZpeD09bnVsbD8iIjpuc1ByZWZpeDsKLQotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHR5cGUgPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikrMSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghInNob3J0Ii5lcXVhbHModHlwZSkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2ZpbmQgbmFtZXNwYWNlIGZvciB0aGUgcHJlZml4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNVcmkgPSByZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShuc1ByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoX3Nob3J0KW9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkLkV4dGVuc2lvbk1hcHBlci5nZXRUeXBlT2JqZWN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zVXJpLHR5cGUscmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIE5vdGUgYWxsIGF0dHJpYnV0ZXMgdGhhdCB3ZXJlIGhhbmRsZWQuIFVzZWQgdG8gZGlmZmVyIG5vcm1hbCBhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgICAgLy8gZnJvbSBhbnlBdHRyaWJ1dGVzLgotICAgICAgICAgICAgICAgIGphdmEudXRpbC5WZWN0b3IgaGFuZGxlZEF0dHJpYnV0ZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlKCFyZWFkZXIuaXNFbmRFbGVtZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50ID0gcmVhZGVyLmdldEVsZW1lbnRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0X3Nob3J0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TaG9ydChjb250ZW50KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gRW5kIG9mIGlmIGZvciBleHBlY3RlZCBwcm9wZXJ0eSBzdGFydCBlbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgc3RhcnQgZWxlbWVudCB3ZSBhcmUgbm90IGV4cGVjdGluZyBpbmRpY2F0ZXMgYW4gaW52YWxpZCBwYXJhbWV0ZXIgd2FzIHBhc3NlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiVW5leHBlY3RlZCBzdWJlbGVtZW50ICIgKyByZWFkZXIuZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIGVuZCBvZiB3aGlsZSBsb29wCi0gICAgICAgICAgICAgICAgICAgICAgICAKLQotCi0KLSAgICAgICAgICAgIH0gY2F0Y2ggKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5sYW5nLkV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG9iamVjdDsKLSAgICAgICAgfQotCi0gICAgICAgIH0vL2VuZCBvZiBmYWN0b3J5IGNsYXNzCi0KLSAgICAgICAgCi0KLSAgICAgICAgfQotICAgICAgICAgICAKLSAgICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdXRpbHMvQmVhblV0aWwuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy91dGlscy9CZWFuVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2I0YzhhLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy91dGlscy9CZWFuVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODM1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlsczsKLQotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS4qOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5idWlsZGVyLlN0QVhPTUJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmxsb20uZmFjdG9yeS5PTVhNTEJ1aWxkZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5CYXNlNjQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZW1hcHBpbmcuU2ltcGxlVHlwZU1hcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXJJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC51dGlsLkJlYW5FeGNsdWRlSW5mbzsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uamF2YTJ3c2RsLlR5cGVUYWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5PYmplY3RTdXBwbGllcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuTG9hZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5TdHJlYW1XcmFwcGVyOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmJlYW5zLkJlYW5JbmZvOwotaW1wb3J0IGphdmEuYmVhbnMuSW50cm9zcGVjdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmJlYW5zLkludHJvc3BlY3RvcjsKLWltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5BcnJheTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotCi1wdWJsaWMgY2xhc3MgQmVhblV0aWwgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IG5zQ291bnQgPSAxOwotCi0KLSAgICAvKioKLSAgICAgKiBUbyBTZXJpbGl6ZSBCZWFuIG9iamVjdCB0aGlzIG1ldGhvZCBpcyB1c2VkLCB0aGlzIHdpbGwgY3JlYXRlIGFuIG9iamVjdCBhcnJheSB1c2luZyBnaXZlbgotICAgICAqIGJlYW4gb2JqZWN0Ci0gICAgICoKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFhNTFN0cmVhbVJlYWRlciBnZXRQdWxsUGFyc2VyKE9iamVjdCBiZWFuT2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUU5hbWUgYmVhbk5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlVGFibGUgdHlwZVRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBxdWFsaWZpZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHByb2Nlc3NpbmdEb2NMaXRCYXJlKSB7Ci0KLSAgICAgICAgQ2xhc3MgYmVhbkNsYXNzID0gYmVhbk9iamVjdC5nZXRDbGFzcygpOwotICAgICAgICBMaXN0IHByb3BlcnR5UW5hbWVWYWx1ZUxpc3QgPSBnZXRQcm9wZXJ0eVFuYW1lTGlzdChiZWFuT2JqZWN0LAotICAgICAgICAgICAgICAgIGJlYW5DbGFzcywgYmVhbk5hbWUsIHR5cGVUYWJsZSwgcXVhbGlmaWVkLCBwcm9jZXNzaW5nRG9jTGl0QmFyZSk7Ci0KLSAgICAgICAgQXJyYXlMaXN0IG9iamVjdEF0dHJpYnV0ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgaWYgKCh0eXBlVGFibGUgIT0gbnVsbCkpewotICAgICAgICAgICAgUU5hbWUgcU5hbWVmb3J0aGVUeXBlID0gdHlwZVRhYmxlLmdldFFOYW1lZm9ydGhlVHlwZShnZXRDbGFzc05hbWUoYmVhbkNsYXNzKSk7Ci0gICAgICAgICAgICBpZiAocU5hbWVmb3J0aGVUeXBlICE9IG51bGwpewotICAgICAgICAgICAgICAgIG9iamVjdEF0dHJpYnV0ZXMuYWRkKG5ldyBRTmFtZShDb25zdGFudHMuWFNJX05BTUVTUEFDRSwgInR5cGUiLCAieHNpIikpOwotICAgICAgICAgICAgICAgIG9iamVjdEF0dHJpYnV0ZXMuYWRkKHFOYW1lZm9ydGhlVHlwZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbmV3IEFEQlhNTFN0cmVhbVJlYWRlckltcGwoYmVhbk5hbWUsIHByb3BlcnR5UW5hbWVWYWx1ZUxpc3QudG9BcnJheSgpLCBvYmplY3RBdHRyaWJ1dGVzLnRvQXJyYXkoKSwKLSAgICAgICAgICAgICAgICB0eXBlVGFibGUsIHF1YWxpZmllZCk7Ci0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKENsYXNzIHR5cGUpIHsKLSAgICAgICAgU3RyaW5nIG5hbWUgPSB0eXBlLmdldE5hbWUoKTsKLSAgICAgICAgaWYgKG5hbWUuaW5kZXhPZigiJCIpID4gMCkgewotICAgICAgICAgICAgbmFtZSA9IG5hbWUucmVwbGFjZSgnJCcsICdfJyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTGlzdCBnZXRQcm9wZXJ0eVFuYW1lTGlzdChPYmplY3QgYmVhbk9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzIGJlYW5DbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFOYW1lIGJlYW5OYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZVRhYmxlIHR5cGVUYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gcXVhbGlmaWVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBwcm9jZXNzaW5nRG9jTGl0QmFyZSkgewotICAgICAgICBMaXN0IHByb3BlcnR5UW5hbWVWYWx1ZUxpc3Q7Ci0gICAgICAgIENsYXNzIHN1cHBlckNsYXNzID0gYmVhbkNsYXNzLmdldFN1cGVyY2xhc3MoKTsKLQotICAgICAgICBpZiAoIWdldFF1YWxpZmllZE5hbWUoc3VwcGVyQ2xhc3MuZ2V0UGFja2FnZSgpKS5zdGFydHNXaXRoKCJqYXZhLiIpKSB7Ci0gICAgICAgICAgICBwcm9wZXJ0eVFuYW1lVmFsdWVMaXN0ID0gZ2V0UHJvcGVydHlRbmFtZUxpc3QoYmVhbk9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgc3VwcGVyQ2xhc3MsIGJlYW5OYW1lLCB0eXBlVGFibGUsIHF1YWxpZmllZCwgcHJvY2Vzc2luZ0RvY0xpdEJhcmUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcHJvcGVydHlRbmFtZVZhbHVlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBRTmFtZSBlbGVtbnROYW1lU3BhY2UgPSBudWxsOwotICAgICAgICAgICAgaWYgKHR5cGVUYWJsZSAhPSBudWxsICYmIHF1YWxpZmllZCkgewotICAgICAgICAgICAgICAgIFFOYW1lIHFOYW1lZm9ydGhlVHlwZSA9IHR5cGVUYWJsZS5nZXRRTmFtZWZvcnRoZVR5cGUoYmVhbkNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKHFOYW1lZm9ydGhlVHlwZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHFOYW1lZm9ydGhlVHlwZSA9IHR5cGVUYWJsZS5nZXRRTmFtZWZvcnRoZVR5cGUoYmVhbkNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAocU5hbWVmb3J0aGVUeXBlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiTWFwcGluZyBxbmFtZSBub3QgZm9uZCBmb3IgdGhlIHBhY2thZ2U6ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlYW5PYmplY3QuZ2V0Q2xhc3MoKS5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBlbGVtbnROYW1lU3BhY2UgPSBuZXcgUU5hbWUocU5hbWVmb3J0aGVUeXBlLmdldE5hbWVzcGFjZVVSSSgpLCAiZWxlbWVudE5hbWUiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChNZXNzYWdlQ29udGV4dC5nZXRDdXJyZW50TWVzc2FnZUNvbnRleHQoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYXhpc1NlcnZpY2UgPSBNZXNzYWdlQ29udGV4dC5nZXRDdXJyZW50TWVzc2FnZUNvbnRleHQoKS5nZXRBeGlzU2VydmljZSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBCZWFuRXhjbHVkZUluZm8gYmVhbkV4Y2x1ZGVJbmZvID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChheGlzU2VydmljZSAhPSBudWxsICYmIGF4aXNTZXJ2aWNlLmdldEV4Y2x1ZGVJbmZvKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGJlYW5FeGNsdWRlSW5mbyA9IGF4aXNTZXJ2aWNlLmdldEV4Y2x1ZGVJbmZvKCkuZ2V0QmVhbkV4Y2x1ZGVJbmZvRm9yQ2xhc3MoYmVhbkNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBCZWFuSW5mbyBiZWFuSW5mbyA9IEludHJvc3BlY3Rvci5nZXRCZWFuSW5mbyhiZWFuQ2xhc3MsIGJlYW5DbGFzcy5nZXRTdXBlcmNsYXNzKCkpOwotICAgICAgICAgICAgUHJvcGVydHlEZXNjcmlwdG9yW10gcHJvcGVydGllcyA9IGJlYW5JbmZvLmdldFByb3BlcnR5RGVzY3JpcHRvcnMoKTsKLSAgICAgICAgICAgIFByb3BlcnR5RGVzY3JpcHRvciBwcm9wZXJ0eTsKLSAgICAgICAgICAgIGZvciAoUHJvcGVydHlEZXNjcmlwdG9yIHByb3BlcnR5MSA6IHByb3BlcnRpZXMpIHsKLSAgICAgICAgICAgICAgICBwcm9wZXJ0eSA9IHByb3BlcnR5MTsKLSAgICAgICAgICAgICAgICBpZiAoIXByb3BlcnR5LmdldE5hbWUoKS5lcXVhbHMoImNsYXNzIikpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChiZWFuRXhjbHVkZUluZm8gPT0gbnVsbCkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICFiZWFuRXhjbHVkZUluZm8uaXNFeGNsdWRlZFByb3BlcnR5KHByb3BlcnR5LmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzIHB0eXBlID0gcHJvcGVydHkuZ2V0UHJvcGVydHlUeXBlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoU2ltcGxlVHlwZU1hcHBlci5pc1NpbXBsZVR5cGUocHR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kIHJlYWRNZXRob2QgPSBwcm9wZXJ0eS5nZXRSZWFkTWV0aG9kKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHZhbHVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkTWV0aG9kICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZE1ldGhvZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHJlYWRNZXRob2QuaW52b2tlKGJlYW5PYmplY3QsIG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNhbiBub3QgZmluZCByZWFkIG1ldGhvZCBmb3IgOiAiICsgcHJvcGVydHkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRUeXBlUW5hbWUoZWxlbW50TmFtZVNwYWNlLCBwcm9wZXJ0eVFuYW1lVmFsdWVMaXN0LCBwcm9wZXJ0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVhbk5hbWUsIHByb2Nlc3NpbmdEb2NMaXRCYXJlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVFuYW1lVmFsdWVMaXN0LmFkZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID09IG51bGwgPyBudWxsIDogU2ltcGxlVHlwZU1hcHBlci5nZXRTdHJpbmdWYWx1ZSh2YWx1ZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwdHlwZS5pc0FycmF5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoU2ltcGxlVHlwZU1hcHBlci5pc1NpbXBsZVR5cGUocHR5cGUuZ2V0Q29tcG9uZW50VHlwZSgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRob2QgcmVhZE1ldGhvZCA9IHByb3BlcnR5LmdldFJlYWRNZXRob2QoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHZhbHVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZE1ldGhvZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkTWV0aG9kLnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHJlYWRNZXRob2QuaW52b2tlKGJlYW5PYmplY3QsIG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNhbiBub3QgZmluZCByZWFkIG1ldGhvZCBmb3IgOiAiICsgcHJvcGVydHkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCJieXRlIi5lcXVhbHMocHR5cGUuZ2V0Q29tcG9uZW50VHlwZSgpLmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRUeXBlUW5hbWUoZWxlbW50TmFtZVNwYWNlLCBwcm9wZXJ0eVFuYW1lVmFsdWVMaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eSwgYmVhbk5hbWUsIHByb2Nlc3NpbmdEb2NMaXRCYXJlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVFuYW1lVmFsdWVMaXN0LmFkZChCYXNlNjQuZW5jb2RlKChieXRlW10pdmFsdWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGkxID0gQXJyYXkuZ2V0TGVuZ3RoKHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGkxOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IG8gPSBBcnJheS5nZXQodmFsdWUsIGopOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRUeXBlUW5hbWUoZWxlbW50TmFtZVNwYWNlLCBwcm9wZXJ0eVFuYW1lVmFsdWVMaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHksIGJlYW5OYW1lLCBwcm9jZXNzaW5nRG9jTGl0QmFyZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5UW5hbWVWYWx1ZUxpc3QuYWRkKG8gPT0gbnVsbCA/IG51bGwgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNpbXBsZVR5cGVNYXBwZXIuZ2V0U3RyaW5nVmFsdWUobykpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZFR5cGVRbmFtZShlbGVtbnROYW1lU3BhY2UsIHByb3BlcnR5UW5hbWVWYWx1ZUxpc3QsIHByb3BlcnR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlYW5OYW1lLCBwcm9jZXNzaW5nRG9jTGl0QmFyZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVFuYW1lVmFsdWVMaXN0LmFkZCh2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRob2QgcmVhZE1ldGhvZCA9IHByb3BlcnR5LmdldFJlYWRNZXRob2QoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHZhbHVlW10gPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZE1ldGhvZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkTWV0aG9kLnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IChPYmplY3RbXSlwcm9wZXJ0eS5nZXRSZWFkTWV0aG9kKCkuaW52b2tlKGJlYW5PYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoT2JqZWN0IG8gOiB2YWx1ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZFR5cGVRbmFtZShlbGVtbnROYW1lU3BhY2UsIHByb3BlcnR5UW5hbWVWYWx1ZUxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5LCBiZWFuTmFtZSwgcHJvY2Vzc2luZ0RvY0xpdEJhcmUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5UW5hbWVWYWx1ZUxpc3QuYWRkKG8pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkVHlwZVFuYW1lKGVsZW1udE5hbWVTcGFjZSwgcHJvcGVydHlRbmFtZVZhbHVlTGlzdCwgcHJvcGVydHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVhbk5hbWUsIHByb2Nlc3NpbmdEb2NMaXRCYXJlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5UW5hbWVWYWx1ZUxpc3QuYWRkKHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoU2ltcGxlVHlwZU1hcHBlci5pc0NvbGxlY3Rpb24ocHR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kIHJlYWRNZXRob2QgPSBwcm9wZXJ0eS5nZXRSZWFkTWV0aG9kKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZE1ldGhvZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IHJlYWRNZXRob2QuaW52b2tlKGJlYW5PYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbiBvYmpMaXN0ID0gKENvbGxlY3Rpb24pdmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9iakxpc3QgIT0gbnVsbCAmJiBvYmpMaXN0LnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy90aGlzIHdhcyBnaXZlbiBlcnJvciAsIHdoZW4gdGhlIGFycmF5LnNpemUgPSAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBpZiB0aGUgYXJyYXkgY29udGFpbiBzaW1wbGUgdHlwZSAsIHRoZW4gdGhlIEFEQlB1bGxQYXJzZXIgYXNrZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUHVsbFBhcnNlciBmcm9tIFRoYXQgc2ltcGVsIHR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChPYmplY3QgbyA6IG9iakxpc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChTaW1wbGVUeXBlTWFwcGVyLmlzU2ltcGxlVHlwZShvKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZFR5cGVRbmFtZShlbGVtbnROYW1lU3BhY2UsIHByb3BlcnR5UW5hbWVWYWx1ZUxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5LCBiZWFuTmFtZSwgcHJvY2Vzc2luZ0RvY0xpdEJhcmUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5UW5hbWVWYWx1ZUxpc3QuYWRkKG8pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRUeXBlUW5hbWUoZWxlbW50TmFtZVNwYWNlLCBwcm9wZXJ0eVFuYW1lVmFsdWVMaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eSwgYmVhbk5hbWUsIHByb2Nlc3NpbmdEb2NMaXRCYXJlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVFuYW1lVmFsdWVMaXN0LmFkZChvKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkVHlwZVFuYW1lKGVsZW1udE5hbWVTcGFjZSwgcHJvcGVydHlRbmFtZVZhbHVlTGlzdCwgcHJvcGVydHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWFuTmFtZSwgcHJvY2Vzc2luZ0RvY0xpdEJhcmUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVFuYW1lVmFsdWVMaXN0LmFkZCh2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRUeXBlUW5hbWUoZWxlbW50TmFtZVNwYWNlLCBwcm9wZXJ0eVFuYW1lVmFsdWVMaXN0LCBwcm9wZXJ0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVhbk5hbWUsIHByb2Nlc3NpbmdEb2NMaXRCYXJlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRob2QgcmVhZE1ldGhvZCA9IHByb3BlcnR5LmdldFJlYWRNZXRob2QoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkTWV0aG9kLnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gcmVhZE1ldGhvZC5pbnZva2UoYmVhbk9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoImphdmEubGFuZy5PYmplY3QiLmVxdWFscyhwdHlwZS5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodmFsdWUgaW5zdGFuY2VvZiBJbnRlZ2VyKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZhbHVlIGluc3RhbmNlb2YgU2hvcnQpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmFsdWUgaW5zdGFuY2VvZiBMb25nKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZhbHVlIGluc3RhbmNlb2YgRmxvYXQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVFuYW1lVmFsdWVMaXN0LmFkZCh2YWx1ZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlRbmFtZVZhbHVlTGlzdC5hZGQodmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gcHJvcGVydHlRbmFtZVZhbHVlTGlzdDsKLQotICAgICAgICB9IGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9IGNhdGNoIChqYXZhLmJlYW5zLkludHJvc3BlY3Rpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gY2F0Y2ggKGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gY2F0Y2ggKGphdmEubGFuZy5JbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRUeXBlUW5hbWUoUU5hbWUgZWxlbW50TmFtZVNwYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3QgcHJvcGVydHlRbmFtZVZhbHVlTGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eURlc2NyaXB0b3IgcHJvcERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUU5hbWUgYmVhbk5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBwcm9jZXNzaW5nRG9jTGl0QmFyZSkgewotICAgICAgICBpZiAoZWxlbW50TmFtZVNwYWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHByb3BlcnR5UW5hbWVWYWx1ZUxpc3QuYWRkKG5ldyBRTmFtZShlbGVtbnROYW1lU3BhY2UuZ2V0TmFtZXNwYWNlVVJJKCksCi0gICAgICAgICAgICAgICAgICAgIHByb3BEZXNjLmdldE5hbWUoKSwgZWxlbW50TmFtZVNwYWNlLmdldFByZWZpeCgpKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAocHJvY2Vzc2luZ0RvY0xpdEJhcmUpIHsKLSAgICAgICAgICAgICAgICBwcm9wZXJ0eVFuYW1lVmFsdWVMaXN0LmFkZChuZXcgUU5hbWUocHJvcERlc2MuZ2V0TmFtZSgpKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHByb3BlcnR5UW5hbWVWYWx1ZUxpc3QuYWRkKG5ldyBRTmFtZShiZWFuTmFtZS5nZXROYW1lc3BhY2VVUkkoKSwgcHJvcERlc2MuZ2V0TmFtZSgpLCBiZWFuTmFtZS5nZXRQcmVmaXgoKSkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB0byBnZXQgdGhlIHB1bGwgcGFyc2VyIGZvciBhIGdpdmVuIGJlYW4gb2JqZWN0ICwgZ2VuZXJhdGUgdGhlIHdycHBlciBlbGVtZW50IHVzaW5nIGNsYXNzCi0gICAgICogbmFtZQotICAgICAqCi0gICAgICogQHBhcmFtIGJlYW5PYmplY3QKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFhNTFN0cmVhbVJlYWRlciBnZXRQdWxsUGFyc2VyKE9iamVjdCBiZWFuT2JqZWN0KSB7Ci0gICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBiZWFuT2JqZWN0LmdldENsYXNzKCkuZ2V0TmFtZSgpOwotICAgICAgICBpZiAoY2xhc3NOYW1lLmluZGV4T2YoIi4iKSA+IDApIHsKLSAgICAgICAgICAgIGNsYXNzTmFtZSA9IGNsYXNzTmFtZS5zdWJzdHJpbmcoY2xhc3NOYW1lLmxhc3RJbmRleE9mKCcuJykgKyAxLAotICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUubGVuZ3RoKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBnZXRQdWxsUGFyc2VyKGJlYW5PYmplY3QsIG5ldyBRTmFtZShjbGFzc05hbWUpLCBudWxsLCBmYWxzZSwgZmFsc2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGRlc2VyaWFsaXplKENsYXNzIGJlYW5DbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTUVsZW1lbnQgYmVhbkVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0U3VwcGxpZXIgb2JqZWN0U3VwcGxpZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGFycmF5TG9jYWxOYW1lKQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIE9iamVjdCBiZWFuT2JqID1udWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gQWRkZWQgdGhpcyBibG9jayBhcyBhIGZpeCBmb3IgaXNzdWVzIEFYSVMyLTIwNTUgYW5kIEFYSVMyLTE4OTkKLSAgICAgICAgICAgIC8vIHRvIHN1cHBvcnQgcG9seW1vcnBoaXNtIGluIFBPSk8gYXBwcm9hY2guCi0gICAgICAgICAgICAvLyBSZXRyaWV2ZSB0aGUgdHlwZSBuYW1lIG9mIHRoZSBpbnN0YW5jZSBmcm9tIHRoZSAndHlwZScgYXR0cmlidXRlCi0gICAgICAgICAgICAvLyBhbmQgcmV0cmlldmUgdGhlIGNsYXNzLgotICAgICAgICAgICAgU3RyaW5nIGluc3RhbmNlVHlwZU5hbWUgPSBiZWFuRWxlbWVudC5nZXRBdHRyaWJ1dGVWYWx1ZShuZXcgUU5hbWUoInR5cGUiKSk7Ci0gICAgICAgICAgICBpZiAoKGluc3RhbmNlVHlwZU5hbWUgIT0gbnVsbCkgJiYgKCEgYmVhbkNsYXNzLmlzQXJyYXkoKSkpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBiZWFuQ2xhc3MgPSBMb2FkZXIubG9hZENsYXNzKGJlYW5DbGFzcy5nZXRDbGFzc0xvYWRlcigpLCBpbnN0YW5jZVR5cGVOYW1lKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IEF4aXNGYXVsdC5tYWtlRmF1bHQoY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gY2hlY2sgZm9yIG5pbCBhdHRyaWJ1dGU6Ci0gICAgICAgICAgICBRTmFtZSBuaWxBdHROYW1lID0gbmV3IFFOYW1lKENvbnN0YW50cy5YU0lfTkFNRVNQQUNFLCBDb25zdGFudHMuTklMLCAieHNpIik7Ci0gICAgICAgICAgICBpZiAoYmVhbkVsZW1lbnQuZ2V0QXR0cmlidXRlKG5pbEF0dE5hbWUpICE9IG51bGwpIHsKLSAgICAgICAgICAgIAlyZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGJlYW5DbGFzcy5pc0FycmF5KCkpIHsKLSAgICAgICAgICAgICAgICBBcnJheUxpc3QgdmFsdWVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgIENsYXNzIGFycmF5Q2xhc3NUeXBlID0gYmVhbkNsYXNzLmdldENvbXBvbmVudFR5cGUoKTsKLSAgICAgICAgICAgICAgICBpZiAoImJ5dGUiLmVxdWFscyhhcnJheUNsYXNzVHlwZS5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBCYXNlNjQuZGVjb2RlKGJlYW5FbGVtZW50LmdldEZpcnN0RWxlbWVudCgpLmdldFRleHQoKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3IgcGFydHMgPSBiZWFuRWxlbWVudC5nZXRDaGlsZEVsZW1lbnRzKCk7Ci0gICAgICAgICAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlIChwYXJ0cy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBvYmpWYWx1ZSA9IHBhcnRzLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvYmpWYWx1ZSBpbnN0YW5jZW9mIE9NRWxlbWVudCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9tRWxlbWVudCA9IChPTUVsZW1lbnQpb2JqVmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChhcnJheUxvY2FsTmFtZSAhPSBudWxsKSAmJiAhYXJyYXlMb2NhbE5hbWUuZXF1YWxzKG9tRWxlbWVudC5nZXRMb2NhbE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgYSBtdWx0aSBkaW1lbnRpb25hbCBhcnJheSBzbyBhbHdheXMgaW5uZXIgZWxlbWVudCBpcyBhcnJheQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBvYmogPSBkZXNlcmlhbGl6ZShhcnJheUNsYXNzVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9tRWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdFN1cHBsaWVyLCAiYXJyYXkiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAJdmFsdWVMaXN0LmFkZChvYmopOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBDb252ZXJ0ZXJVdGlsLmNvbnZlcnRUb0FycmF5KGFycmF5Q2xhc3NUeXBlLCB2YWx1ZUxpc3QpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKFNpbXBsZVR5cGVNYXBwZXIuaXNTaW1wbGVUeXBlKGJlYW5DbGFzcykpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNpbXBsZVR5cGVNYXBwZXIuZ2V0U2ltcGxlVHlwZU9iamVjdChiZWFuQ2xhc3MsIGJlYW5FbGVtZW50KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJqYXZhLmxhbmcuT2JqZWN0Ii5lcXVhbHMoYmVhbkNsYXNzLmdldE5hbWUoKSkpewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmVhbkVsZW1lbnQuZ2V0Rmlyc3RPTUNoaWxkKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEhhc2hNYXAgcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgICAgICAgICAgQmVhbkluZm8gYmVhbkluZm8gPSBJbnRyb3NwZWN0b3IuZ2V0QmVhbkluZm8oYmVhbkNsYXNzKTsKLSAgICAgICAgICAgICAgICBQcm9wZXJ0eURlc2NyaXB0b3IgW10gcHJvcERlc2NzID0gYmVhbkluZm8uZ2V0UHJvcGVydHlEZXNjcmlwdG9ycygpOwotICAgICAgICAgICAgICAgIGZvciAoUHJvcGVydHlEZXNjcmlwdG9yIHByb3BydHkgOiBwcm9wRGVzY3MpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcy5wdXQocHJvcHJ0eS5nZXROYW1lKCksIHByb3BydHkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBJdGVyYXRvciBlbGVtZW50cyA9IGJlYW5FbGVtZW50LmdldENoaWxkcmVuKCk7Ci0gICAgICAgICAgICAgICAgYmVhbk9iaiA9IG9iamVjdFN1cHBsaWVyLmdldE9iamVjdChiZWFuQ2xhc3MpOwotICAgICAgICAgICAgICAgIHdoaWxlIChlbGVtZW50cy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGJlYW5DbGFzcyBjb3VsZCBiZSBhbiBhYnN0cmFjdCBvbmUuCi0gICAgICAgICAgICAgICAgICAgIC8vIHNvIGNyZWF0ZSBhbiBpbnN0YW5jZSBvbmx5IGlmIHRoZXJlIGFyZSBlbGVtZW50cywgaW4KLSAgICAgICAgICAgICAgICAgICAgLy8gd2hpY2ggY2FzZSBhIGNvbmNyZXRlIHN1YmNsYXNzIGlzIGF2YWlsYWJsZSB0byBpbnN0YW50aWF0ZS4KLSAgICAgICAgICAgICAgICAgICAgT01FbGVtZW50IHBhcnRzOwotICAgICAgICAgICAgICAgICAgICBPYmplY3Qgb2JqVmFsdWUgPSBlbGVtZW50cy5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvYmpWYWx1ZSBpbnN0YW5jZW9mIE9NRWxlbWVudCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcGFydHMgPSAoT01FbGVtZW50KW9ialZhbHVlOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgT01BdHRyaWJ1dGUgYXR0cmlidXRlID0gcGFydHMuZ2V0QXR0cmlidXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBRTmFtZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCAibmlsIiwgInhzaSIpKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBpZiBwYXJ0cy9AaHJlZiAhPSBudWxsIHRoZW4gbmVlZCB0byBmaW5kIGVsZW1lbnQgd2l0aCBpZCBhbmQgZGVzZXJpYWxpemUuCi0gICAgICAgICAgICAgICAgICAgIC8vIGJlZm9yZSB0aGF0IGZpcnN0IGNoZWNrIHdoZXRoZXIgd2UgYWxyZWFkeSBoYXZlIGl0IGluIHRoZSBoYXNodGFibGUKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhcnRzTG9jYWxOYW1lID0gcGFydHMuZ2V0TG9jYWxOYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIFByb3BlcnR5RGVzY3JpcHRvciBwcnR5ID0gKFByb3BlcnR5RGVzY3JpcHRvcilwcm9wZXJ0aWVzLnJlbW92ZShwYXJ0c0xvY2FsTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwcnR5ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzIHBhcmFtZXRlcnMgPSBwcnR5LmdldFByb3BlcnR5VHlwZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBydHkuZ2V0TmFtZSgpLmVxdWFscygiY2xhc3MiKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHBhcnRPYmo7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0T2JqID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFNpbXBsZVR5cGVNYXBwZXIuaXNTaW1wbGVUeXBlKHBhcmFtZXRlcnMpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRPYmogPSBTaW1wbGVUeXBlTWFwcGVyLmdldFNpbXBsZVR5cGVPYmplY3QocGFyYW1ldGVycywgcGFydHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgZWxzZSBpZiAoU2ltcGxlVHlwZU1hcHBlci5pc0hhc2hTZXQocGFyYW1ldGVycykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydE9iaiA9IFNpbXBsZVR5cGVNYXBwZXIuZ2V0SGFzaFNldCgoT01FbGVtZW50KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRzLmdldFBhcmVudCgpLCBwcnR5LmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChTaW1wbGVUeXBlTWFwcGVyLmlzQ29sbGVjdGlvbihwYXJhbWV0ZXJzKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0T2JqID0gU2ltcGxlVHlwZU1hcHBlci5nZXRBcnJheUxpc3QoKE9NRWxlbWVudCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0cy5nZXRQYXJlbnQoKSwgcHJ0eS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoU2ltcGxlVHlwZU1hcHBlci5pc0RhdGFIYW5kbGVyKHBhcmFtZXRlcnMpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydE9iaiA9IFNpbXBsZVR5cGVNYXBwZXIuZ2V0RGF0YUhhbmRsZXIocGFydHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyYW1ldGVycy5pc0FycmF5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydE9iaiA9IGRlc2VyaWFsaXplKHBhcmFtZXRlcnMsIChPTUVsZW1lbnQpcGFydHMuZ2V0UGFyZW50KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0U3VwcGxpZXIsIHBydHkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0T2JqID0gZGVzZXJpYWxpemUocGFyYW1ldGVycywgcGFydHMsIG9iamVjdFN1cHBsaWVyLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgW10gcGFybXMgPSBuZXcgT2JqZWN0W10geyBwYXJ0T2JqIH07Ci0gICAgICAgICAgICAgICAgICAgICAgICBNZXRob2Qgd3JpdGVNZXRob2QgPSBwcnR5LmdldFdyaXRlTWV0aG9kKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAod3JpdGVNZXRob2QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlTWV0aG9kLnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVNZXRob2QuaW52b2tlKGJlYW5PYmosIHBhcm1zKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gYmVhbk9iajsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIDogIiArIGUpOwotICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoIkludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gOiAiICsgZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEludHJvc3BlY3Rpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiSW50cm9zcGVjdGlvbkV4Y2VwdGlvbiA6ICIgKyBlKTsKLSAgICAgICAgfQotCi0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBkZXNlcmlhbGl6ZShDbGFzcyBiZWFuQ2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01FbGVtZW50IGJlYW5FbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE11bHRpcmVmSGVscGVyIGhlbHBlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RTdXBwbGllciBvYmplY3RTdXBwbGllcikgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIE9iamVjdCBiZWFuT2JqOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgSGFzaE1hcCBwcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgICAgIEJlYW5JbmZvIGJlYW5JbmZvID0gSW50cm9zcGVjdG9yLmdldEJlYW5JbmZvKGJlYW5DbGFzcyk7Ci0gICAgICAgICAgICBQcm9wZXJ0eURlc2NyaXB0b3IgW10gcHJvcERlc2NzID0gYmVhbkluZm8uZ2V0UHJvcGVydHlEZXNjcmlwdG9ycygpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9wRGVzY3MubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBQcm9wZXJ0eURlc2NyaXB0b3IgcHJvcHJ0eSA9IHByb3BEZXNjc1tpXTsKLSAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzLnB1dChwcm9wcnR5LmdldE5hbWUoKSwgcHJvcHJ0eSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJlYW5PYmogPSBvYmplY3RTdXBwbGllci5nZXRPYmplY3QoYmVhbkNsYXNzKTsKLSAgICAgICAgICAgIEl0ZXJhdG9yIGVsZW1lbnRzID0gYmVhbkVsZW1lbnQuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgICAgICAgIHdoaWxlIChlbGVtZW50cy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBPYmplY3QgY2hpbGQgPSBlbGVtZW50cy5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgT01FbGVtZW50IHBhcnRzOwotICAgICAgICAgICAgICAgIGlmIChjaGlsZCBpbnN0YW5jZW9mIE9NRWxlbWVudCkgewotICAgICAgICAgICAgICAgICAgICBwYXJ0cyA9IChPTUVsZW1lbnQpY2hpbGQ7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFN0cmluZyBwYXJ0c0xvY2FsTmFtZSA9IHBhcnRzLmdldExvY2FsTmFtZSgpOwotICAgICAgICAgICAgICAgIFByb3BlcnR5RGVzY3JpcHRvciBwcnR5ID0gKFByb3BlcnR5RGVzY3JpcHRvcilwcm9wZXJ0aWVzLmdldCgKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRzTG9jYWxOYW1lLnRvTG93ZXJDYXNlKCkpOwotICAgICAgICAgICAgICAgIGlmIChwcnR5ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgQ2xhc3MgcGFyYW1ldGVycyA9IHBydHkuZ2V0UHJvcGVydHlUeXBlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwcnR5LmdldE5hbWUoKS5lcXVhbHMoImNsYXNzIikpCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHBhcnRPYmo7Ci0gICAgICAgICAgICAgICAgICAgIE9NQXR0cmlidXRlIGF0dHIgPSBNdWx0aXJlZkhlbHBlci5wcm9jZXNzUmVmQXR0KHBhcnRzKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGF0dHIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlZklkID0gTXVsdGlyZWZIZWxwZXIuZ2V0QXR0dmFsdWUoYXR0cik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYXJ0T2JqID0gaGVscGVyLmdldE9iamVjdChyZWZJZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFydE9iaiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydE9iaiA9IGhlbHBlci5wcm9jZXNzUmVmKHBhcmFtZXRlcnMsIHJlZklkLCBvYmplY3RTdXBwbGllcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYXJ0T2JqID0gU2ltcGxlVHlwZU1hcHBlci5nZXRTaW1wbGVUeXBlT2JqZWN0KHBhcmFtZXRlcnMsIHBhcnRzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJ0T2JqID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0T2JqID0gZGVzZXJpYWxpemUocGFyYW1ldGVycywgcGFydHMsIG9iamVjdFN1cHBsaWVyLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBPYmplY3QgW10gcGFybXMgPSBuZXcgT2JqZWN0W10geyBwYXJ0T2JqIH07Ci0gICAgICAgICAgICAgICAgICAgIE1ldGhvZCB3cml0ZU1ldGhvZCA9IHBydHkuZ2V0V3JpdGVNZXRob2QoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHdyaXRlTWV0aG9kICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlTWV0aG9kLnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3cml0ZU1ldGhvZC5pbnZva2UoYmVhbk9iaiwgcGFybXMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoIklsbGVnYWxBY2Nlc3NFeGNlcHRpb24gOiAiICsgZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiA6ICIgKyBlKTsKLSAgICAgICAgfSBjYXRjaCAoSW50cm9zcGVjdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJJbnRyb3NwZWN0aW9uRXhjZXB0aW9uIDogIiArIGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBiZWFuT2JqOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogVG8gZ2V0IEphdmFPYmplY3RzIGZyb20gWE1MIGVsZW1udCAsIHRoZSBlbGVtZW50IG1vc3Qgb2YgdGhlIHRpbWUgY29udGFpbnMgb25seSBvbmUgZWxlbWVudAotICAgICAqIGluIHRoYXQgY2FzZSB0aGF0IGVsZW1lbnQgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gdGhlIEphdmFUeXBlIHNwZWNpZmllZCBieSB0aGUgamF2YVR5cGVzIGFycmF5Ci0gICAgICogVGhlIGFsZ28gaXMgYXMgZm9sbG93cywgZ2V0IHRoZSBjaGlsZGVybnMgb2YgdGhlIHJlc3BvbnNlIGVsZW1lbnQgLCBhbmQgaWYgaXQgY29uYXRpYW4gbW9yZQotICAgICAqIHRoYW4gb25lIGVsZW1lbnQgdGhlbiBjaGVjayB0aGUgcmV0dWVuIHR5cGUgb2YgdGhhdCBlbGVtZW50IGFuZCBjb252ZXIgdGhhdCB0byBjb3JyZXNwb25kaW5nCi0gICAgICogSmF2YVR5cGUKLSAgICAgKgotICAgICAqIEBwYXJhbSByZXNwb25zZSAgT01FbGVtZW50Ci0gICAgICogQHBhcmFtIGphdmFUeXBlcyBBcnJheSBvZiBKYXZhVHlwZXMKLSAgICAgKiBAcmV0dXJuIEFycmF5IG9mIG9iamVjdHMKLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IFtdIGRlc2VyaWFsaXplKE9NRWxlbWVudCByZXNwb25zZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgW10gamF2YVR5cGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdFN1cHBsaWVyIG9iamVjdFN1cHBsaWVyKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgLyoKLSAgICAgICAgICogVGFrZSB0aGUgbnVtYmVyIG9mIHBhcmFtZXRlcnMgaW4gdGhlIG1ldGhvZCBhbmQgLCBvbmx5IHRha2UgdGhhdCBtdWNoIG9mIGNoaWxkIGVsZW1lbnRzCi0gICAgICAgICAqIGZyb20gdGhlIE9NRWxlbWVudCAsIG90aGVyIGFyZSBpZ25vcmUgLCBhcyBhbiBleGFtcGxlCi0gICAgICAgICAqIGlmIHRoZSBtZXRob2QgaXMgLCBmb28oU3RyaW5nIGEgLCBpbnQgYikKLSAgICAgICAgICogYW5kIGlmIHRoZSBPTUVsZW1ldAotICAgICAgICAgKiA8Zm9vPgotICAgICAgICAgKiAgPGFyZzA+VmFsMTwvYXJnMD4KLSAgICAgICAgICogIDxhcmcxPlZhbDI8L2FyZzE+Ci0gICAgICAgICAqICA8YXJnMj5WYWwzPC9hcmcyPgotICAgICAgICAgKgotICAgICAgICAgKiBvbmx5IHRoZSB2YWwxIGFuZCBWYWwyIHRha2UgaW50byBhY2NvdW50Ci0gICAgICAgICAqLwotICAgICAgICBpbnQgbGVuZ3RoID0gamF2YVR5cGVzLmxlbmd0aDsKLSAgICAgICAgaW50IGNvdW50ID0gMDsKLSAgICAgICAgT2JqZWN0IFtdIHJldE9ianMgPSBuZXcgT2JqZWN0W2xlbmd0aF07Ci0KLSAgICAgICAgLyoKLSAgICAgICAgKiBJZiB0aGUgYm9keSBmaXJzdCBjaGlsZCBjb250YWlucyAsIHRoZW4gdGhlcmUgY2FuIG5vdCBiZSBhbnkgb3RoZXIgZWxlbWVudCB3aXRob3QKLSAgICAgICAgKiByZWZzICwgc28gSSBjYW4gYXNzdW1lIGlmIHRoZSBmaXJzdCBjaGlsZCBvZiB0aGUgYm9keSBmaXJzdCBlbGVtZW50IGhhcyByZWYgdGhlbgotICAgICAgICAqIHRoZSBtZXNzYWdlIGhhcyB0byBoYW5kbGUgYXMgbXV0aXJlZiBtZXNzYWdlLgotICAgICAgICAqIGFzIGFuIGV4bXBsZSBpZiB0aGUgYm9keSBpcyBsaWtlIGJlbG93Ci0gICAgICAgICogPGZvbz4KLSAgICAgICAgKiAgPGFyZzAgaHJlZj0iIzAiLz4KLSAgICAgICAgKiA8L2Zvbz4KLSAgICAgICAgKgotICAgICAgICAqIHRoZW4gdGhlcmUgY2FuIG5vdCBiZSBhbnkgZWxlbWVudCB3aXRob3V0IHJlZnMgLCBtZWFuaW5nIGZvbGxvd2luZyB3ZSBhcmUgbm90IGhhbmRsaW5nCi0gICAgICAgICogPGZvbz4KLSAgICAgICAgKiAgPGFyZzAgaHJlZj0iIzAiLz4KLSAgICAgICAgKiAgPGFyZzE+YWJzYnNiczwvYXJnMT4KLSAgICAgICAgKiA8L2Zvbz4KLSAgICAgICAgKi8KLSAgICAgICAgSXRlcmF0b3IgcGFydHMgPSByZXNwb25zZS5nZXRDaGlsZHJlbigpOwotICAgICAgICAvL3RvIGhhbmRsZSBtdWx0aXJlZnMKLSAgICAgICAgLy9oYXZlIHRvIGNoZWNrIHRoZSBpbnN0YW5jZW9mCi0gICAgICAgIE11bHRpcmVmSGVscGVyIGhlbHBlciA9IG5ldyBNdWx0aXJlZkhlbHBlcigoT01FbGVtZW50KXJlc3BvbnNlLmdldFBhcmVudCgpKTsKLSAgICAgICAgLy90byBzdXBwb3J0IGFycmF5IC4gaWYgdGhlIHBhcmFtZXRlciB0eXBlIGlzIGFycmF5ICwgdGhlbiBhbGwgdGhlIG9tZWxlbW50cyB3aXRoIHRoYXQgcGFyYW10cmUgbmFtZQotICAgICAgICAvLyBoYXMgdG8gIGdldCBhbmQgYWRkIHRvIHRoZSBsaXN0Ci0gICAgICAgIENsYXNzIGNsYXNzVHlwZTsKLSAgICAgICAgU3RyaW5nIGN1cnJlbnRMb2NhbE5hbWU7Ci0gICAgICAgIHdoaWxlIChwYXJ0cy5oYXNOZXh0KCkgJiYgY291bnQgPCBsZW5ndGgpIHsKLSAgICAgICAgICAgIE9iamVjdCBvYmpWYWx1ZSA9IHBhcnRzLm5leHQoKTsKLSAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQ7Ci0gICAgICAgICAgICBpZiAob2JqVmFsdWUgaW5zdGFuY2VvZiBPTUVsZW1lbnQpIHsKLSAgICAgICAgICAgICAgICBvbUVsZW1lbnQgPSAoT01FbGVtZW50KW9ialZhbHVlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGN1cnJlbnRMb2NhbE5hbWUgPSBvbUVsZW1lbnQuZ2V0TG9jYWxOYW1lKCk7Ci0gICAgICAgICAgICBjbGFzc1R5cGUgPSAoQ2xhc3MpamF2YVR5cGVzW2NvdW50XTsKLSAgICAgICAgICAgIG9tRWxlbWVudCA9IFByb2Nlc3NFbGVtZW50KGNsYXNzVHlwZSwgb21FbGVtZW50LCBoZWxwZXIsIHBhcnRzLAotICAgICAgICAgICAgICAgICAgICBjdXJyZW50TG9jYWxOYW1lLCByZXRPYmpzLCBjb3VudCwgb2JqZWN0U3VwcGxpZXIpOwotICAgICAgICAgICAgd2hpbGUgKG9tRWxlbWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY291bnQgKys7Ci0gICAgICAgICAgICAgICAgb21FbGVtZW50ID0gUHJvY2Vzc0VsZW1lbnQoKENsYXNzKWphdmFUeXBlc1tjb3VudF0sIG9tRWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGhlbHBlciwgcGFydHMsIG9tRWxlbWVudC5nZXRMb2NhbE5hbWUoKSwgcmV0T2JqcywgY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RTdXBwbGllcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjb3VudCArKzsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEVuc3VyZSB0aGF0IHdlIGhhdmUgYXQgbGVhc3QgYSB6ZXJvIGVsZW1lbnQgYXJyYXkKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotICAgICAgICAgICAgQ2xhc3MgY2xhenogPSAoQ2xhc3MpamF2YVR5cGVzW2ldOwotICAgICAgICAgICAgaWYgKHJldE9ianNbaV0gPT0gbnVsbCAmJiBjbGF6ei5pc0FycmF5KCkpIHsKLSAgICAgICAgICAgICAgICByZXRPYmpzW2ldID0gQXJyYXkubmV3SW5zdGFuY2UoY2xhenouZ2V0Q29tcG9uZW50VHlwZSgpLCAwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGhlbHBlci5jbGVhbigpOwotICAgICAgICByZXR1cm4gcmV0T2JqczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBPTUVsZW1lbnQgUHJvY2Vzc0VsZW1lbnQoQ2xhc3MgY2xhc3NUeXBlLCBPTUVsZW1lbnQgb21FbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdWx0aXJlZkhlbHBlciBoZWxwZXIsIEl0ZXJhdG9yIHBhcnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY3VycmVudExvY2FsTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0W10gcmV0T2JqcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RTdXBwbGllciBvYmplY3RTdXBwbGllcikgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIE9iamVjdCBvYmpWYWx1ZTsKLSAgICAgICAgaWYgKGNsYXNzVHlwZS5pc0FycmF5KCkpIHsKLSAgICAgICAgICAgIGJvb2xlYW4gZG9uZSA9IHRydWU7Ci0gICAgICAgICAgICBBcnJheUxpc3QgdmFsdWVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgQ2xhc3MgYXJyYXlDbGFzc1R5cGUgPSBjbGFzc1R5cGUuZ2V0Q29tcG9uZW50VHlwZSgpOwotICAgICAgICAgICAgaWYgKCJieXRlIi5lcXVhbHMoYXJyYXlDbGFzc1R5cGUuZ2V0TmFtZSgpKSkgewotICAgICAgICAgICAgICAgIHJldE9ianNbY291bnRdID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NPYmplY3Qob21FbGVtZW50LCBhcnJheUNsYXNzVHlwZSwgaGVscGVyLCB0cnVlLCBvYmplY3RTdXBwbGllcik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHZhbHVlTGlzdC5hZGQocHJvY2Vzc09iamVjdChvbUVsZW1lbnQsIGFycmF5Q2xhc3NUeXBlLCBoZWxwZXIsIHRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RTdXBwbGllcikpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgd2hpbGUgKHBhcnRzLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIG9ialZhbHVlID0gcGFydHMubmV4dCgpOwotICAgICAgICAgICAgICAgIGlmIChvYmpWYWx1ZSBpbnN0YW5jZW9mIE9NRWxlbWVudCkgewotICAgICAgICAgICAgICAgICAgICBvbUVsZW1lbnQgPSAoT01FbGVtZW50KW9ialZhbHVlOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoIWN1cnJlbnRMb2NhbE5hbWUuZXF1YWxzKG9tRWxlbWVudC5nZXRMb2NhbE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgZG9uZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgT2JqZWN0IG8gPSBwcm9jZXNzT2JqZWN0KG9tRWxlbWVudCwgYXJyYXlDbGFzc1R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBoZWxwZXIsIHRydWUsIG9iamVjdFN1cHBsaWVyKTsKLSAgICAgICAgICAgICAgICB2YWx1ZUxpc3QuYWRkKG8pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYodmFsdWVMaXN0LmdldCgwKT09bnVsbCl7Ci0gICAgICAgICAgICAgICAgcmV0T2Jqc1tjb3VudF0gPSBudWxsOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXRPYmpzW2NvdW50XSA9IENvbnZlcnRlclV0aWwuY29udmVydFRvQXJyYXkoYXJyYXlDbGFzc1R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZUxpc3QpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFkb25lKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG9tRWxlbWVudDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vaGFuZGxpbmcgcmVmcwotICAgICAgICAgICAgcmV0T2Jqc1tjb3VudF0gPSBwcm9jZXNzT2JqZWN0KG9tRWxlbWVudCwgY2xhc3NUeXBlLCBoZWxwZXIsIGZhbHNlLCBvYmplY3RTdXBwbGllcik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgcHJvY2Vzc09iamVjdChPTUVsZW1lbnQgb21FbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MgY2xhc3NUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXVsdGlyZWZIZWxwZXIgaGVscGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0FycmF5VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdFN1cHBsaWVyIG9iamVjdFN1cHBsaWVyKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgYm9vbGVhbiBoYXNSZWYgPSBmYWxzZTsKLSAgICAgICAgT01BdHRyaWJ1dGUgb21hdHJpYnV0ZSA9IE11bHRpcmVmSGVscGVyLnByb2Nlc3NSZWZBdHQob21FbGVtZW50KTsKLSAgICAgICAgU3RyaW5nIHJlZiA9IG51bGw7Ci0gICAgICAgIGlmIChvbWF0cmlidXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGhhc1JlZiA9IHRydWU7Ci0gICAgICAgICAgICByZWYgPSBNdWx0aXJlZkhlbHBlci5nZXRBdHR2YWx1ZShvbWF0cmlidXRlKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoT01FbGVtZW50LmNsYXNzLmlzQXNzaWduYWJsZUZyb20oY2xhc3NUeXBlKSkgewotICAgICAgICAgICAgaWYgKGhhc1JlZikgewotICAgICAgICAgICAgICAgIE9NRWxlbWVudCBlbGVtbnQgPSBoZWxwZXIuZ2V0T01FbGVtZW50KHJlZik7Ci0gICAgICAgICAgICAgICAgaWYgKGVsZW1udCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBoZWxwZXIucHJvY2Vzc09NRWxlbWVudFJlZihyZWYpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbGVtbnQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgcmV0dXJuIG9tRWxlbWVudDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChoYXNSZWYpIHsKLSAgICAgICAgICAgICAgICBpZiAoaGVscGVyLmdldE9iamVjdChyZWYpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhlbHBlci5nZXRPYmplY3QocmVmKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gaGVscGVyLnByb2Nlc3NSZWYoY2xhc3NUeXBlLCByZWYsIG9iamVjdFN1cHBsaWVyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIE9NQXR0cmlidXRlIGF0dHJpYnV0ZSA9IG9tRWxlbWVudC5nZXRBdHRyaWJ1dGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgUU5hbWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwgIm5pbCIsICJ4c2kiKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoU2ltcGxlVHlwZU1hcHBlci5pc1NpbXBsZVR5cGUoY2xhc3NUeXBlKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoaXNBcnJheVR5cGUgJiYgImJ5dGUiLmVxdWFscyhjbGFzc1R5cGUuZ2V0TmFtZSgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gb21FbGVtZW50LmdldFRleHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCYXNlNjQuZGVjb2RlKHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTaW1wbGVUeXBlTWFwcGVyLmdldFNpbXBsZVR5cGVPYmplY3QoY2xhc3NUeXBlLCBvbUVsZW1lbnQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChTaW1wbGVUeXBlTWFwcGVyLmlzQ29sbGVjdGlvbihjbGFzc1R5cGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBTaW1wbGVUeXBlTWFwcGVyLmdldEFycmF5TGlzdChvbUVsZW1lbnQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoU2ltcGxlVHlwZU1hcHBlci5pc0RhdGFIYW5kbGVyKGNsYXNzVHlwZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNpbXBsZVR5cGVNYXBwZXIuZ2V0RGF0YUhhbmRsZXIob21FbGVtZW50KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gQmVhblV0aWwuZGVzZXJpYWxpemUoY2xhc3NUeXBlLCBvbUVsZW1lbnQsIG9iamVjdFN1cHBsaWVyLCBudWxsKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotCi0KLQotCi0gICAgcHVibGljIHN0YXRpYyBPTUVsZW1lbnQgZ2V0T01FbGVtZW50KFFOYW1lIG9wTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IFtdIGFyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFOYW1lIHBhcnROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHF1YWxpZmVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlVGFibGUgdHlwZVRhYmxlKSB7Ci0gICAgICAgIEFycmF5TGlzdCBvYmplY3RzOwotICAgICAgICBvYmplY3RzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBpbnQgYXJnQ291bnQgPSAwOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIE9iamVjdCBhcmcgPSBhcmdzW2ldOwotICAgICAgICAgICAgaWYgKGFyZyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBhcnROYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgb2JqZWN0cy5hZGQoIml0ZW0iICsgYXJnQ291bnQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG9iamVjdHMuYWRkKHBhcnROYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb2JqZWN0cy5hZGQoYXJnKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGFyZyBpbnN0YW5jZW9mIE9iamVjdFtdKSB7Ci0gICAgICAgICAgICAgICAgLy8gYXQgdGhlIGNsaWVudCBzaWRlIHRoZSBwYXJ0bmFtZSBpcyBhbHdheXMgbnVsbC4gQXQgY2xpZW50IHNpZGUgdGhpcyBtZWFucyB1c2VyIHRyeSB0bwotICAgICAgICAgICAgICAgIC8vIGludm9rZSBhIHNlcnZpY2Ugd2l0aCBhbiBhcnJheSBhcmd1bWVudC4KLSAgICAgICAgICAgICAgICBpZiAocGFydE5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBPYmplY3QgYXJyYXkgW10gPSAoT2JqZWN0W10pIGFyZzsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBhcnJheS5sZW5ndGg7IGorKykgewotICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IG8gPSBhcnJheVtqXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RzLmFkZCgiaXRlbSIgKyBhcmdDb3VudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0cy5hZGQobyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChTaW1wbGVUeXBlTWFwcGVyLmlzU2ltcGxlVHlwZShvKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RzLmFkZCgiaXRlbSIgKyBhcmdDb3VudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdHMuYWRkKFNpbXBsZVR5cGVNYXBwZXIuZ2V0U3RyaW5nVmFsdWUobykpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdHMuYWRkKG5ldyBRTmFtZSgiaXRlbSIgKyBhcmdDb3VudCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobyBpbnN0YW5jZW9mIE9NRWxlbWVudCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01GYWN0b3J5IGZhYyA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01FbGVtZW50IHdyYXBwaW5nRWxlbWVudDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJ0TmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBpbmdFbGVtZW50ID0gZmFjLmNyZWF0ZU9NRWxlbWVudCgiaXRlbSIgKyBhcmdDb3VudCwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBpbmdFbGVtZW50LmFkZENoaWxkKChPTUVsZW1lbnQpIG8pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGluZ0VsZW1lbnQgPSBmYWMuY3JlYXRlT01FbGVtZW50KHBhcnROYW1lLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGluZ0VsZW1lbnQuYWRkQ2hpbGQoKE9NRWxlbWVudCkgbyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RzLmFkZCh3cmFwcGluZ0VsZW1lbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0cy5hZGQobyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGhhcHBlbnMgYXQgdGhlIHNlcnZlciBzaWRlLiB0aGlzIG1lYW5zIGl0IGlzIGFuIG11bHRpZGltZW50aW9uYWwgYXJyYXkuCi0gICAgICAgICAgICAgICAgICAgIG9iamVjdHMuYWRkKHBhcnROYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgb2JqZWN0cy5hZGQoYXJnKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKFNpbXBsZVR5cGVNYXBwZXIuaXNTaW1wbGVUeXBlKGFyZykpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnROYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdHMuYWRkKCJhcmciICsgYXJnQ291bnQpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0cy5hZGQocGFydE5hbWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG9iamVjdHMuYWRkKFNpbXBsZVR5cGVNYXBwZXIuZ2V0U3RyaW5nVmFsdWUoYXJnKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnROYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdHMuYWRkKG5ldyBRTmFtZSgiYXJnIiArIGFyZ0NvdW50KSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RzLmFkZChwYXJ0TmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGFyZyBpbnN0YW5jZW9mIE9NRWxlbWVudCkgewotICAgICAgICAgICAgICAgICAgICAgICAgT01GYWN0b3J5IGZhYyA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgT01FbGVtZW50IHdyYXBwaW5nRWxlbWVudDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJ0TmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBpbmdFbGVtZW50ID0gZmFjLmNyZWF0ZU9NRWxlbWVudCgiYXJnIiArIGFyZ0NvdW50LCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGluZ0VsZW1lbnQuYWRkQ2hpbGQoKE9NRWxlbWVudClhcmcpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGluZ0VsZW1lbnQgPSBmYWMuY3JlYXRlT01FbGVtZW50KHBhcnROYW1lLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGluZ0VsZW1lbnQuYWRkQ2hpbGQoKE9NRWxlbWVudClhcmcpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0cy5hZGQod3JhcHBpbmdFbGVtZW50KTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhcmcgaW5zdGFuY2VvZiBieXRlW10pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdHMuYWRkKEJhc2U2NC5lbmNvZGUoKGJ5dGVbXSlhcmcpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmKFNpbXBsZVR5cGVNYXBwZXIuaXNEYXRhSGFuZGxlcihhcmcuZ2V0Q2xhc3MoKSkpewotICAgICAgICAgICAgICAgICAgICAgICAgT01FbGVtZW50IHJlc0VsZW10OwotICAgICAgICAgICAgICAgICAgICAgICAgT01GYWN0b3J5IGZhYyA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgT01FbGVtZW50IHdyYXBwaW5nRWxlbWVudDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJ0TmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBpbmdFbGVtZW50ID0gZmFjLmNyZWF0ZU9NRWxlbWVudCgiYXJnIiArIGFyZ0NvdW50LCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBpbmdFbGVtZW50ID0gZmFjLmNyZWF0ZU9NRWxlbWVudChwYXJ0TmFtZSwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBPTVRleHQgdGV4dCA9IGZhYy5jcmVhdGVPTVRleHQoYXJnLCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBwaW5nRWxlbWVudC5hZGRDaGlsZCh0ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdHMuYWRkKHdyYXBwaW5nRWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RzLmFkZChhcmcpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXJnQ291bnQgKys7Ci0gICAgICAgIH0KLQotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeHIgPQotICAgICAgICAgICAgICAgIG5ldyBBREJYTUxTdHJlYW1SZWFkZXJJbXBsKG9wTmFtZSwgb2JqZWN0cy50b0FycmF5KCksIG51bGwsIHR5cGVUYWJsZSwgcXVhbGlmZWQpOwotCi0gICAgICAgIFN0cmVhbVdyYXBwZXIgcGFyc2VyID0gbmV3IFN0cmVhbVdyYXBwZXIoeHIpOwotICAgICAgICBTdEFYT01CdWlsZGVyIHN0QVhPTUJ1aWxkZXIgPQotICAgICAgICAgICAgICAgIE9NWE1MQnVpbGRlckZhY3RvcnkuY3JlYXRlU3RBWE9NQnVpbGRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMUZhY3RvcnkoKSwgcGFyc2VyKTsKLSAgICAgICAgcmV0dXJuIHN0QVhPTUJ1aWxkZXIuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0gICAgfQotCi0gICAgLyoqIEBkZXByZWNhdGVkIFBsZWFzZSB1c2UgZ2V0VW5pcXVlUHJlZml4ICovCi0gICAgcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgU3RyaW5nICBnZXRVbmlxdWVQcmlmaXgoKSB7Ci0gICAgICAgIHJldHVybiBnZXRVbmlxdWVQcmVmaXgoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBpbmNyZW1lbnRzIHRoZSBuYW1lc3BhY2UgY291bnRlciBhbmQgcmV0dXJucyBhIG5ldyBwcmVmaXgKLSAgICAgKgotICAgICAqIEByZXR1cm4gdW5pcXVlIHByZWZpeAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIFN0cmluZyBnZXRVbmlxdWVQcmVmaXgoKSB7Ci0gICAgICAgIGlmIChuc0NvdW50ID4gMTAwMCl7Ci0gICAgICAgICAgICBuc0NvdW50ID0gMTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gInMiICsgbnNDb3VudCsrOwotICAgIH0KLQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFF1YWxpZmllZE5hbWUoUGFja2FnZSBwYWNrYWdleikgewotICAgICAgICBpZiAocGFja2FnZXogIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHBhY2thZ2V6LmdldE5hbWUoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiAiIjsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3V0aWxzL0NvbnN0YW50cy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3V0aWxzL0NvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDJmZDBmLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy91dGlscy9Db25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlsczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuT01BdHRyaWJLZXk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuT01FbGVtZW50S2V5OwotCi1wdWJsaWMgaW50ZXJmYWNlIENvbnN0YW50cyB7Ci0KLSAgICBzdGF0aWMgU3RyaW5nIE5JTCA9ICJuaWwiOwotICAgIHN0YXRpYyBTdHJpbmcgVFJVRSA9ICJ0cnVlIjsKLSAgICBzdGF0aWMgU3RyaW5nIFhTSV9OQU1FU1BBQ0UgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiOwotICAgIHN0YXRpYyBTdHJpbmcgWFNEX05BTUVTUEFDRSA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI7Ci0KLSAgICBzdGF0aWMgT2JqZWN0IE9NX0FUVFJJQlVURV9LRVkgPSBuZXcgT01BdHRyaWJLZXkoKTsKLSAgICBzdGF0aWMgT2JqZWN0IE9NX0VMRU1FTlRfS0VZID0gbmV3IE9NRWxlbWVudEtleSgpOwotCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBJU19CSU5BUlkgPSBPTUNvbnN0YW50cy5JU19CSU5BUlk7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRBX0hBTkRMRVIgPSBPTUNvbnN0YW50cy5EQVRBX0hBTkRMRVI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRJTUlaQVRJT05fRU5BQkxFRCA9IE9NQ29uc3RhbnRzLklTX0RBVEFfSEFORExFUlNfQVdBUkU7Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdXRpbHMvQ29udmVydGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdXRpbHMvQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyMDNiOGYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3V0aWxzL0NvbnZlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlsczsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkFycmF5OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKiBDb252ZXJ0ZXIgKi8KLXB1YmxpYyBjbGFzcyBDb252ZXJ0ZXIgewotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGNvbnZlcnQoT2JqZWN0IGFyZywgQ2xhc3MgZGVzdENsYXNzKSB7Ci0gICAgICAgIGlmIChkZXN0Q2xhc3MgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGFyZzsKLSAgICAgICAgfQotCi0gICAgICAgIENsYXNzIGFyZ0hlbGRUeXBlID0gbnVsbDsKLSAgICAgICAgaWYgKGFyZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBhcmdIZWxkVHlwZSA9IGdldEhvbGRlclZhbHVlVHlwZShhcmcuZ2V0Q2xhc3MoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYXJnICE9IG51bGwgJiYgYXJnSGVsZFR5cGUgPT0gbnVsbCAmJiBkZXN0Q2xhc3MuaXNBc3NpZ25hYmxlRnJvbShhcmcuZ2V0Q2xhc3MoKSkpIHsKLSAgICAgICAgICAgIHJldHVybiBhcmc7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTZWUgaWYgYSBwcmV2aW91c2x5IGNvbnZlcnRlZCB2YWx1ZSBpcyBzdG9yZWQgaW4gdGhlIGFyZ3VtZW50LgotICAgICAgICBPYmplY3QgZGVzdFZhbHVlID0gbnVsbDsKLQotICAgICAgICAvLyBHZXQgdGhlIGRlc3RpbmF0aW9uIGhlbGQgdHlwZSBvciB0aGUgYXJndW1lbnQgaGVsZCB0eXBlIGlmIHRoZXkgZXhpc3QKLSAgICAgICAgQ2xhc3MgZGVzdEhlbGRUeXBlID0gZ2V0SG9sZGVyVmFsdWVUeXBlKGRlc3RDbGFzcyk7Ci0KLSAgICAgICAgLy8gQ29udmVydCBiZXR3ZWVuIENhbGVuZGFyIGFuZCBEYXRlCi0gICAgICAgIGlmIChhcmcgaW5zdGFuY2VvZiBDYWxlbmRhciAmJiBkZXN0Q2xhc3MgPT0gRGF0ZS5jbGFzcykgewotICAgICAgICAgICAgcmV0dXJuICgoQ2FsZW5kYXIpYXJnKS5nZXRUaW1lKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGFyZyBpbnN0YW5jZW9mIERhdGUgJiYgZGVzdENsYXNzID09IENhbGVuZGFyLmNsYXNzKSB7Ci0gICAgICAgICAgICBDYWxlbmRhciBjYWxlbmRhciA9IENhbGVuZGFyLmdldEluc3RhbmNlKCk7Ci0gICAgICAgICAgICBjYWxlbmRhci5zZXRUaW1lKChEYXRlKWFyZyk7Ci0gICAgICAgICAgICByZXR1cm4gY2FsZW5kYXI7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBDb252ZXJ0IGJldHdlZW4gQ2FsZW5kYXIgYW5kIGphdmEuc3FsLkRhdGUKLSAgICAgICAgaWYgKGFyZyBpbnN0YW5jZW9mIENhbGVuZGFyICYmIGRlc3RDbGFzcyA9PSBqYXZhLnNxbC5EYXRlLmNsYXNzKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IGphdmEuc3FsLkRhdGUoKChDYWxlbmRhcilhcmcpLmdldFRpbWUoKS5nZXRUaW1lKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQ29udmVydCBiZXR3ZWVuIEhhc2hNYXAgYW5kIEhhc2h0YWJsZQotICAgICAgICBpZiAoYXJnIGluc3RhbmNlb2YgSGFzaE1hcCAmJiBkZXN0Q2xhc3MgPT0gSGFzaHRhYmxlLmNsYXNzKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEhhc2h0YWJsZSgoSGFzaE1hcClhcmcpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSWYgdGhlIGRlc3RpbmF0aW9uIGlzIGFuIGFycmF5IGFuZCB0aGUgc291cmNlCi0gICAgICAgIC8vIGlzIGEgc3VpdGFibGUgY29tcG9uZW50LCByZXR1cm4gYW4gYXJyYXkgd2l0aAotICAgICAgICAvLyB0aGUgc2luZ2xlIGl0ZW0uCi0gICAgICAgIGlmIChhcmcgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgIGRlc3RDbGFzcy5pc0FycmF5KCkgJiYKLSAgICAgICAgICAgICAgICAhZGVzdENsYXNzLmdldENvbXBvbmVudFR5cGUoKS5lcXVhbHMoT2JqZWN0LmNsYXNzKSAmJgotICAgICAgICAgICAgICAgIGRlc3RDbGFzcy5nZXRDb21wb25lbnRUeXBlKCkuaXNBc3NpZ25hYmxlRnJvbShhcmcuZ2V0Q2xhc3MoKSkpIHsKLSAgICAgICAgICAgIE9iamVjdCBhcnJheSA9Ci0gICAgICAgICAgICAgICAgICAgIEFycmF5Lm5ld0luc3RhbmNlKGRlc3RDbGFzcy5nZXRDb21wb25lbnRUeXBlKCksIDEpOwotICAgICAgICAgICAgQXJyYXkuc2V0KGFycmF5LCAwLCBhcmcpOwotICAgICAgICAgICAgcmV0dXJuIGFycmF5OwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gUmV0dXJuIGlmIG5vIGNvbnZlcnNpb24gaXMgYXZhaWxhYmxlCi0gICAgICAgIGlmICghKGFyZyBpbnN0YW5jZW9mIENvbGxlY3Rpb24gfHwKLSAgICAgICAgICAgICAgICAoYXJnICE9IG51bGwgJiYgYXJnLmdldENsYXNzKCkuaXNBcnJheSgpKSkgJiYKLSAgICAgICAgICAgICAgICAoKGRlc3RIZWxkVHlwZSA9PSBudWxsICYmIGFyZ0hlbGRUeXBlID09IG51bGwpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAoZGVzdEhlbGRUeXBlICE9IG51bGwgJiYgYXJnSGVsZFR5cGUgIT0gbnVsbCkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gYXJnOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gRmxvdyB0byBoZXJlIGluZGljYXRlcyB0aGF0IG5laXRoZXIgYXJnIG9yIGRlc3RDbGFzcyBpcyBhIEhvbGRlcgotCi0gICAgICAgIGlmIChhcmcgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGFyZzsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFRoZSBhcmcgbWF5IGJlIGFuIGFycmF5IG9yIExpc3QKLSAgICAgICAgaW50IGxlbmd0aCA9IDA7Ci0gICAgICAgIGlmIChhcmcuZ2V0Q2xhc3MoKS5pc0FycmF5KCkpIHsKLSAgICAgICAgICAgIGxlbmd0aCA9IEFycmF5LmdldExlbmd0aChhcmcpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbGVuZ3RoID0gKChDb2xsZWN0aW9uKWFyZykuc2l6ZSgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChkZXN0Q2xhc3MuaXNBcnJheSgpKSB7Ci0gICAgICAgICAgICBpZiAoZGVzdENsYXNzLmdldENvbXBvbmVudFR5cGUoKS5pc1ByaW1pdGl2ZSgpKSB7Ci0KLSAgICAgICAgICAgICAgICBPYmplY3QgYXJyYXkgPSBBcnJheS5uZXdJbnN0YW5jZShkZXN0Q2xhc3MuZ2V0Q29tcG9uZW50VHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgLy8gQXNzaWduIGFycmF5IGVsZW1lbnRzCi0gICAgICAgICAgICAgICAgaWYgKGFyZy5nZXRDbGFzcygpLmlzQXJyYXkoKSkgewotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheS5zZXQoYXJyYXksIGksIEFycmF5LmdldChhcmcsIGkpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBpZHggPSAwOwotICAgICAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSAoKENvbGxlY3Rpb24pYXJnKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgIGkuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXkuc2V0KGFycmF5LCBpZHgrKywgaS5uZXh0KCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGRlc3RWYWx1ZSA9IGFycmF5OwotCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIE9iamVjdCBbXSBhcnJheTsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBhcnJheSA9IChPYmplY3QgW10pQXJyYXkubmV3SW5zdGFuY2UoZGVzdENsYXNzLmdldENvbXBvbmVudFR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFyZzsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBVc2UgY29udmVydCB0byBhc3NpZ24gYXJyYXkgZWxlbWVudHMuCi0gICAgICAgICAgICAgICAgaWYgKGFyZy5nZXRDbGFzcygpLmlzQXJyYXkoKSkgewotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhcnJheVtpXSA9IGNvbnZlcnQoQXJyYXkuZ2V0KGFyZywgaSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdENsYXNzLmdldENvbXBvbmVudFR5cGUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpbnQgaWR4ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gKChDb2xsZWN0aW9uKWFyZykuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICBpLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5W2lkeCsrXSA9IGNvbnZlcnQoaS5uZXh0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RDbGFzcy5nZXRDb21wb25lbnRUeXBlKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGRlc3RWYWx1ZSA9IGFycmF5OwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKENvbGxlY3Rpb24uY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShkZXN0Q2xhc3MpKSB7Ci0gICAgICAgICAgICBDb2xsZWN0aW9uIG5ld0xpc3QgPSBudWxsOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAvLyBpZiB3ZSBhcmUgdHJ5aW5nIHRvIGNyZWF0ZSBhbiBpbnRlcmZhY2UsIGJ1aWxkIHNvbWV0aGluZwotICAgICAgICAgICAgICAgIC8vIHRoYXQgaW1wbGVtZW50cyB0aGUgaW50ZXJmYWNlCi0gICAgICAgICAgICAgICAgaWYgKGRlc3RDbGFzcyA9PSBDb2xsZWN0aW9uLmNsYXNzIHx8IGRlc3RDbGFzcyA9PSBqYXZhLnV0aWwuTGlzdC5jbGFzcykgewotICAgICAgICAgICAgICAgICAgICBuZXdMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGVzdENsYXNzID09IFNldC5jbGFzcykgewotICAgICAgICAgICAgICAgICAgICBuZXdMaXN0ID0gbmV3IEhhc2hTZXQoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBuZXdMaXN0ID0gKENvbGxlY3Rpb24pZGVzdENsYXNzLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBDb3VsZG4ndCBidWlsZCBvbmUgZm9yIHNvbWUgcmVhc29uLi4uIHNvIGZvcmdldCBpdC4KLSAgICAgICAgICAgICAgICByZXR1cm4gYXJnOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoYXJnLmdldENsYXNzKCkuaXNBcnJheSgpKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBsZW5ndGg7IGorKykgewotICAgICAgICAgICAgICAgICAgICBuZXdMaXN0LmFkZChBcnJheS5nZXQoYXJnLCBqKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGogPSAoKENvbGxlY3Rpb24pYXJnKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgICAgICAgai5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgICAgIG5ld0xpc3QuYWRkKGoubmV4dCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZXN0VmFsdWUgPSBuZXdMaXN0OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZGVzdFZhbHVlID0gYXJnOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGRlc3RWYWx1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBDbGFzcyBnZXRIb2xkZXJWYWx1ZVR5cGUoQ2xhc3MgYUNsYXNzKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy91dGlscy9Db252ZXJ0ZXJVdGlsLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdXRpbHMvQ29udmVydGVyVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDc3ZjBmLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy91dGlscy9Db252ZXJ0ZXJVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjU3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlsczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uYXR0YWNobWVudHMuQnl0ZUFycmF5RGF0YVNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLmF0dGFjaG1lbnRzLnV0aWxzLklPVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5NVE9NQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5idWlsZGVyLlN0QVhPTUJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmxsb20uT01TdEFYV3JhcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLnV0aWwuQmFzZTY0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5FbGVtZW50SGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5TdEFYVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLmltcGwuYnVpbGRlci5NVE9NU3RBWFNPQVBNb2RlbEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJCZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuaTE4bi5BREJNZXNzYWdlczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLkRheTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLkR1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuRW50aXRpZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5FbnRpdHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5IZXhCaW5hcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5JRFJlZjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLklEUmVmczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLklkOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuTGFuZ3VhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5Nb250aDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLk1vbnRoRGF5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuTkNOYW1lOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuTk1Ub2tlbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLk5NVG9rZW5zOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuTmFtZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLk5lZ2F0aXZlSW50ZWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLk5vbk5lZ2F0aXZlSW50ZWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLk5vblBvc2l0aXZlSW50ZWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLk5vcm1hbGl6ZWRTdHJpbmc7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5Ob3RhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLlBvc2l0aXZlSW50ZWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLlRpbWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5Ub2tlbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLlVSSTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLlVuc2lnbmVkQnl0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLlVuc2lnbmVkSW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuVW5zaWduZWRMb25nOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuVW5zaWduZWRTaG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLlllYXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5ZZWFyTW9udGg7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXguYWN0aXZhdGlvbi5EYXRhSGFuZGxlcjsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLk5hbWVzcGFjZUNvbnRleHQ7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUNvbnN0YW50czsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQXJyYXk7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci1pbXBvcnQgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5UaW1lWm9uZTsKLQotLyoqCi0gKiBDb252ZXJ0ZXIgbWV0aG9kcyB0byBnbyBmcm9tIDEuIHNpbXBsZSB0eXBlIC0+IFN0cmluZyAyLiBzaW1wbGUgdHlwZSAtPiBPYmplY3QgMy4gU3RyaW5nIC0+Ci0gKiBzaW1wbGV0eXBlIDQuIE9iamVjdCBsaXN0IC0+IGFycmF5Ci0gKi8KLXB1YmxpYyBjbGFzcyBDb252ZXJ0ZXJVdGlsIHsKLQotICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhDb252ZXJ0ZXJVdGlsLmNsYXNzKTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQT1NJVElWRV9JTkZJTklUWSA9ICJJTkYiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBORUdBVElWRV9JTkZJTklUWSA9ICItSU5GIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNZU1RFTV9QUk9QRVJUWV9BREJfQ09OVkVSVEVSVVRJTCA9ICJhZGIuY29udmVydGVydXRpbCI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzQ3VzdG9tQ2xhc3NQcmVzZW50OwotICAgIHByaXZhdGUgc3RhdGljIENsYXNzIGN1c3RvbUNsYXNzOwotCi0gICAgLyogU3RyaW5nIGNvbnZlcnNpb24gbWV0aG9kcyAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhpbnQgaSkgewotICAgICAgICByZXR1cm4gSW50ZWdlci50b1N0cmluZyhpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoZmxvYXQgaSkgewotICAgICAgICByZXR1cm4gRmxvYXQudG9TdHJpbmcoaSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKGxvbmcgaSkgewotICAgICAgICByZXR1cm4gTG9uZy50b1N0cmluZyhpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoZG91YmxlIGkpIHsKLSAgICAgICAgcmV0dXJuIERvdWJsZS50b1N0cmluZyhpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoYnl0ZSBpKSB7Ci0gICAgICAgIHJldHVybiBCeXRlLnRvU3RyaW5nKGkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhjaGFyIGkpIHsKLSAgICAgICAgcmV0dXJuIENoYXJhY3Rlci50b1N0cmluZyhpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoc2hvcnQgaSkgewotICAgICAgICByZXR1cm4gU2hvcnQudG9TdHJpbmcoaSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKGJvb2xlYW4gaSkgewotICAgICAgICByZXR1cm4gQm9vbGVhbi50b1N0cmluZyhpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoRGF0ZSB2YWx1ZSkgewotCi0gICAgICAgIGlmIChpc0N1c3RvbUNsYXNzUHJlc2VudCkgewotICAgICAgICAgICAgLy8gdGhpcyBtZWFucyB1c2VyIGhhcyBkZWZpbmUgYSBzZXBlcmF0ZSBjb252ZXJ0ZXIgdXRpbCBjbGFzcwotICAgICAgICAgICAgcmV0dXJuIGludm9rZVRvU3RyaW5nTWV0aG9kKHZhbHVlLERhdGUuY2xhc3MpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gbGV4aWNhbCBmb3JtIG9mIHRoZSBkYXRlIGlzICctJz8geXl5eSAnLScgbW0gJy0nIGRkIHp6enp6ej8KLSAgICAgICAgICAgIENhbGVuZGFyIGNhbGVuZGFyID0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIGNhbGVuZGFyLmNsZWFyKCk7Ci0gICAgICAgICAgICBjYWxlbmRhci5zZXRUaW1lKHZhbHVlKTsKLSAgICAgICAgICAgIGlmICghY2FsZW5kYXIuaXNTZXQoQ2FsZW5kYXIuWk9ORV9PRkZTRVQpKXsKLSAgICAgICAgICAgICAgICBjYWxlbmRhci5zZXRUaW1lWm9uZShUaW1lWm9uZS5nZXREZWZhdWx0KCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgU3RyaW5nQnVmZmVyIGRhdGVTdHJpbmcgPSBuZXcgU3RyaW5nQnVmZmVyKDE2KTsKLSAgICAgICAgICAgIGFwcGVuZERhdGUoZGF0ZVN0cmluZywgY2FsZW5kYXIpOwotICAgICAgICAgICAgYXBwZW5kVGltZVpvbmUoY2FsZW5kYXIsIGRhdGVTdHJpbmcpOwotICAgICAgICAgICAgcmV0dXJuIGRhdGVTdHJpbmcudG9TdHJpbmcoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhcHBlbmRUaW1lWm9uZShDYWxlbmRhciBjYWxlbmRhciwgU3RyaW5nQnVmZmVyIGRhdGVTdHJpbmcpIHsKLSAgICAgICAgaW50IHRpbWV6b25lT2ZmU2V0ID0gY2FsZW5kYXIuZ2V0KENhbGVuZGFyLlpPTkVfT0ZGU0VUKSArIGNhbGVuZGFyLmdldChDYWxlbmRhci5EU1RfT0ZGU0VUKTsKLSAgICAgICAgaW50IHRpbWV6b25lT2ZmU2V0SW5NaW5pdHMgPSB0aW1lem9uZU9mZlNldCAvIDYwMDAwOwotICAgICAgICBpZiAodGltZXpvbmVPZmZTZXRJbk1pbml0cyA8IDApewotICAgICAgICAgICAgZGF0ZVN0cmluZy5hcHBlbmQoIi0iKTsKLSAgICAgICAgICAgIHRpbWV6b25lT2ZmU2V0SW5NaW5pdHMgPSB0aW1lem9uZU9mZlNldEluTWluaXRzICogLTE7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBkYXRlU3RyaW5nLmFwcGVuZCgiKyIpOwotICAgICAgICB9Ci0gICAgICAgIGludCBob3VycyA9IHRpbWV6b25lT2ZmU2V0SW5NaW5pdHMgLyA2MDsKLSAgICAgICAgaW50IG1pbml0cyA9IHRpbWV6b25lT2ZmU2V0SW5NaW5pdHMgJSA2MDsKLQotICAgICAgICBpZiAoaG91cnMgPCAxMCkgewotICAgICAgICAgICAgZGF0ZVN0cmluZy5hcHBlbmQoIjAiKTsKLSAgICAgICAgfQotICAgICAgICBkYXRlU3RyaW5nLmFwcGVuZChob3VycykuYXBwZW5kKCI6Iik7Ci0KLSAgICAgICAgaWYgKG1pbml0cyA8IDEwKXsKLSAgICAgICAgICAgIGRhdGVTdHJpbmcuYXBwZW5kKCIwIik7Ci0gICAgICAgIH0KLQotICAgICAgICBkYXRlU3RyaW5nLmFwcGVuZChtaW5pdHMpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhcHBlbmREYXRlKFN0cmluZ0J1ZmZlciBkYXRlU3RyaW5nLCBDYWxlbmRhciBjYWxlbmRhcikgewotCi0gICAgICAgIGludCB5ZWFyID0gY2FsZW5kYXIuZ2V0KENhbGVuZGFyLllFQVIpOwotCi0gICAgICAgIGlmICh5ZWFyIDwgMTAwMCl7Ci0gICAgICAgICAgICBkYXRlU3RyaW5nLmFwcGVuZCgiMCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmICh5ZWFyIDwgMTAwKXsKLSAgICAgICAgICAgIGRhdGVTdHJpbmcuYXBwZW5kKCIwIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHllYXIgPCAxMCkgewotICAgICAgICAgICAgZGF0ZVN0cmluZy5hcHBlbmQoIjAiKTsKLSAgICAgICAgfQotICAgICAgICBkYXRlU3RyaW5nLmFwcGVuZCh5ZWFyKS5hcHBlbmQoIi0iKTsKLQotICAgICAgICAvLyB4bWwgZGF0ZSBtb250aCBpcyBzdGFydGVkIGZyb20gMSBhbmQgY2FsZW5kYXIgbW9udGggaXMKLSAgICAgICAgLy8gc3RhcnRlZCBmcm9tIDAuIHNvIGhhdmUgdG8gYWRkIG9uZQotICAgICAgICBpbnQgbW9udGggPSBjYWxlbmRhci5nZXQoQ2FsZW5kYXIuTU9OVEgpICsgMTsKLSAgICAgICAgaWYgKG1vbnRoIDwgMTApewotICAgICAgICAgICAgZGF0ZVN0cmluZy5hcHBlbmQoIjAiKTsKLSAgICAgICAgfQotICAgICAgICBkYXRlU3RyaW5nLmFwcGVuZChtb250aCkuYXBwZW5kKCItIik7Ci0gICAgICAgIGlmIChjYWxlbmRhci5nZXQoQ2FsZW5kYXIuREFZX09GX01PTlRIKSA8IDEwKXsKLSAgICAgICAgICAgIGRhdGVTdHJpbmcuYXBwZW5kKCIwIik7Ci0gICAgICAgIH0KLSAgICAgICAgZGF0ZVN0cmluZy5hcHBlbmQoY2FsZW5kYXIuZ2V0KENhbGVuZGFyLkRBWV9PRl9NT05USCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBpbnZva2VUb1N0cmluZ01ldGhvZChPYmplY3QgdmFsdWUsIENsYXNzIHR5cGUpIHsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgTWV0aG9kIG1ldGhvZCA9IGN1c3RvbUNsYXNzLmdldE1ldGhvZCgiY29udmVydFRvU3RyaW5nIiwgbmV3IENsYXNzW117dHlwZX0pOwotICAgICAgICAgICAgU3RyaW5nIHJlc3VsdCA9IChTdHJpbmcpIG1ldGhvZC5pbnZva2UobnVsbCxuZXcgT2JqZWN0W117dmFsdWV9KTsKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiY2FuIG5vdCBmaW5kIHRoZSBtZXRob2QgY29udmVydFRvU3RyaW5nKCIKLSAgICAgICAgICAgICAgICAgICAgKyB0eXBlLmdldE5hbWUoKSArICIpIGluIGNvbnZlcnRlciB1dGlsIGNsYXNzICIgKyBjdXN0b21DbGFzcy5nZXROYW1lKCksIGUpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJjYW4gbm90IGFjY2VzcyB0aGUgbWV0aG9kIGNvbnZlcnRUb1N0cmluZygiCi0gICAgICAgICAgICAgICAgICAgICsgdHlwZS5nZXROYW1lKCkgKyAiKSBpbiBjb252ZXJ0ZXIgdXRpbCBjbGFzcyAiICsgY3VzdG9tQ2xhc3MuZ2V0TmFtZSgpLCBlKTsKLSAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiY2FuIG5vdCBpbnZvY2F0ZSB0aGUgbWV0aG9kIGNvbnZlcnRUb1N0cmluZygiCi0gICAgICAgICAgICAgICAgICAgICsgdHlwZS5nZXROYW1lKCkgKyAiKSBpbiBjb252ZXJ0ZXIgdXRpbCBjbGFzcyAiICsgY3VzdG9tQ2xhc3MuZ2V0TmFtZSgpLCBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhDYWxlbmRhciB2YWx1ZSkgewotICAgICAgICBpZiAoaXNDdXN0b21DbGFzc1ByZXNlbnQpIHsKLSAgICAgICAgICAgIHJldHVybiBpbnZva2VUb1N0cmluZ01ldGhvZCh2YWx1ZSxDYWxlbmRhci5jbGFzcyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBsZXhpY2FsIGZvcm0gb2YgdGhlIGNhbGVuZGFyIGlzICctJz8geXl5eSAnLScgbW0gJy0nIGRkICdUJyBoaCAnOicgbW0gJzonIHNzICgnLicgcyspPyAoenp6enp6KT8KLSAgICAgICAgICAgIGlmICh2YWx1ZS5nZXQoQ2FsZW5kYXIuWk9ORV9PRkZTRVQpID09IC0xKXsKLSAgICAgICAgICAgICAgICB2YWx1ZS5zZXRUaW1lWm9uZShUaW1lWm9uZS5nZXREZWZhdWx0KCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgU3RyaW5nQnVmZmVyIGRhdGVTdHJpbmcgPSBuZXcgU3RyaW5nQnVmZmVyKDI4KTsKLSAgICAgICAgICAgIGFwcGVuZERhdGUoZGF0ZVN0cmluZywgdmFsdWUpOwotICAgICAgICAgICAgZGF0ZVN0cmluZy5hcHBlbmQoIlQiKTsKLSAgICAgICAgICAgIC8vYWRkaW5nIGhvdXJzCi0gICAgICAgICAgICBhcHBlbmRUaW1lKHZhbHVlLCBkYXRlU3RyaW5nKTsKLSAgICAgICAgICAgIGFwcGVuZFRpbWVab25lKHZhbHVlLCBkYXRlU3RyaW5nKTsKLSAgICAgICAgICAgIHJldHVybiBkYXRlU3RyaW5nLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYXBwZW5kVGltZShDYWxlbmRhciB2YWx1ZSwgU3RyaW5nQnVmZmVyIGRhdGVTdHJpbmcpIHsKLSAgICAgICAgaWYgKHZhbHVlLmdldChDYWxlbmRhci5IT1VSX09GX0RBWSkgPCAxMCkgewotICAgICAgICAgICAgZGF0ZVN0cmluZy5hcHBlbmQoIjAiKTsKLSAgICAgICAgfQotICAgICAgICBkYXRlU3RyaW5nLmFwcGVuZCh2YWx1ZS5nZXQoQ2FsZW5kYXIuSE9VUl9PRl9EQVkpKS5hcHBlbmQoIjoiKTsKLSAgICAgICAgaWYgKHZhbHVlLmdldChDYWxlbmRhci5NSU5VVEUpIDwgMTApIHsKLSAgICAgICAgICAgIGRhdGVTdHJpbmcuYXBwZW5kKCIwIik7Ci0gICAgICAgIH0KLSAgICAgICAgZGF0ZVN0cmluZy5hcHBlbmQodmFsdWUuZ2V0KENhbGVuZGFyLk1JTlVURSkpLmFwcGVuZCgiOiIpOwotICAgICAgICBpZiAodmFsdWUuZ2V0KENhbGVuZGFyLlNFQ09ORCkgPCAxMCkgewotICAgICAgICAgICAgZGF0ZVN0cmluZy5hcHBlbmQoIjAiKTsKLSAgICAgICAgfQotICAgICAgICBkYXRlU3RyaW5nLmFwcGVuZCh2YWx1ZS5nZXQoQ2FsZW5kYXIuU0VDT05EKSkuYXBwZW5kKCIuIik7Ci0gICAgICAgIGlmICh2YWx1ZS5nZXQoQ2FsZW5kYXIuTUlMTElTRUNPTkQpIDwgMTApIHsKLSAgICAgICAgICAgIGRhdGVTdHJpbmcuYXBwZW5kKCIwIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHZhbHVlLmdldChDYWxlbmRhci5NSUxMSVNFQ09ORCkgPCAxMDApIHsKLSAgICAgICAgICAgIGRhdGVTdHJpbmcuYXBwZW5kKCIwIik7Ci0gICAgICAgIH0KLSAgICAgICAgZGF0ZVN0cmluZy5hcHBlbmQodmFsdWUuZ2V0KENhbGVuZGFyLk1JTExJU0VDT05EKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKERheSBvKSB7Ci0gICAgICAgIHJldHVybiBvLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKFllYXJNb250aCBvKSB7Ci0gICAgICAgIHJldHVybiBvLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKFllYXIgbykgewotICAgICAgICByZXR1cm4gby50b1N0cmluZygpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhIZXhCaW5hcnkgbykgewotICAgICAgICByZXR1cm4gby50b1N0cmluZygpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhNb250aERheSBvKSB7Ci0gICAgICAgIHJldHVybiBvLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKFRpbWUgbykgewotICAgICAgICByZXR1cm4gby50b1N0cmluZygpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhCeXRlIG8pIHsKLSAgICAgICAgcmV0dXJuIG8udG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoQmlnSW50ZWdlciBvKSB7Ci0gICAgICAgIHJldHVybiBvLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKEludGVnZXIgbykgewotICAgICAgICByZXR1cm4gby50b1N0cmluZygpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhMb25nIG8pIHsKLSAgICAgICAgcmV0dXJuIG8udG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoU2hvcnQgbykgewotICAgICAgICByZXR1cm4gby50b1N0cmluZygpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhVbnNpZ25lZEJ5dGUgbykgewotICAgICAgICByZXR1cm4gby50b1N0cmluZygpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhVbnNpZ25lZEludCBvKSB7Ci0gICAgICAgIHJldHVybiBvLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKFVuc2lnbmVkTG9uZyBvKSB7Ci0gICAgICAgIHJldHVybiBvLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKFFOYW1lIG8pIHsKLSAgICAgICAgaWYgKG8gIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG8uZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoT2JqZWN0IG8pIHsKLSAgICAgICAgcmV0dXJuIG8udG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoRG91YmxlIG8pIHsKLSAgICAgICAgcmV0dXJuIG8udG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoRHVyYXRpb24gbykgewotICAgICAgICByZXR1cm4gby50b1N0cmluZygpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhGbG9hdCBvKSB7Ci0gICAgICAgIHJldHVybiBvLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKE1vbnRoIG8pIHsKLSAgICAgICAgcmV0dXJuIG8udG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoYnl0ZVtdIGJ5dGVzKSB7Ci0gICAgICAgIHJldHVybiBCYXNlNjQuZW5jb2RlKGJ5dGVzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoamF2YXguYWN0aXZhdGlvbi5EYXRhSGFuZGxlciBoYW5kbGVyKSB7Ci0gICAgICAgIHJldHVybiBnZXRTdHJpbmdGcm9tRGF0YWhhbmRsZXIoaGFuZGxlcik7Ci0gICAgfQotCi0gICAgLyogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgKi8KLSAgICAvKiBTdHJpbmcgdG8gamF2YSB0eXBlIGNvbnZlcnNpb25zCi0gICAgICAgVGhlc2UgbWV0aG9kcyBoYXZlIGEgc3BlY2lhbCBzaWduYXR1cmUgc3RydWN0dXJlCi0gICAgICAgPGNvZGU+Y29udmVydFRvPC9jb2RlPiBmb2xsb3dlZCBieSB0aGUgc2NoZW1hIHR5cGUgbmFtZQotICAgICAgIFNheSBmb3IgaW50LCBjb252ZXJ0VG9pbnQoU3RyaW5nKSBpcyB0aGUgY29udmVydGVyIG1ldGhvZAotCi0gICAgICAgTm90IHZlcnkgZWxlZ2FudCBidXQgaXQgc2VlbXMgdG8gYmUgdGhlIG9ubHkgd2F5IQotCi0gICAgKi8KLQotCi0gICAgcHVibGljIHN0YXRpYyBpbnQgY29udmVydFRvSW50KFN0cmluZyBzKSB7Ci0gICAgICAgIGlmICgocyA9PSBudWxsKSB8fCBzLmVxdWFscygiIikpewotICAgICAgICAgICAgcmV0dXJuIEludGVnZXIuTUlOX1ZBTFVFOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzLnN0YXJ0c1dpdGgoIisiKSkgewotICAgICAgICAgICAgcyA9IHMuc3Vic3RyaW5nKDEpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBJbnRlZ2VyLnBhcnNlSW50KHMpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQmlnRGVjaW1hbCBjb252ZXJ0VG9CaWdEZWNpbWFsKFN0cmluZyBzKSB7Ci0gICAgICAgIGlmICgocyA9PSBudWxsKSB8fCBzLmVxdWFscygiIikpewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHMuc3RhcnRzV2l0aCgiKyIpKSB7Ci0gICAgICAgICAgICBzID0gcy5zdWJzdHJpbmcoMSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBCaWdEZWNpbWFsKHMpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZG91YmxlIGNvbnZlcnRUb0RvdWJsZShTdHJpbmcgcykgewotICAgICAgICBpZiAoKHMgPT0gbnVsbCkgfHwgcy5lcXVhbHMoIiIpKXsKLSAgICAgICAgICAgIHJldHVybiBEb3VibGUuTmFOOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzLnN0YXJ0c1dpdGgoIisiKSkgewotICAgICAgICAgICAgcyA9IHMuc3Vic3RyaW5nKDEpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChQT1NJVElWRV9JTkZJTklUWS5lcXVhbHMocykpIHsKLSAgICAgICAgICAgIHJldHVybiBEb3VibGUuUE9TSVRJVkVfSU5GSU5JVFk7Ci0gICAgICAgIH0gZWxzZSBpZiAoTkVHQVRJVkVfSU5GSU5JVFkuZXF1YWxzKHMpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRG91YmxlLk5FR0FUSVZFX0lORklOSVRZOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBEb3VibGUucGFyc2VEb3VibGUocyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBCaWdEZWNpbWFsIGNvbnZlcnRUb0RlY2ltYWwoU3RyaW5nIHMpIHsKLSAgICAgICAgaWYgKChzID09IG51bGwpIHx8IHMuZXF1YWxzKCIiKSl7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBpZiAocy5zdGFydHNXaXRoKCIrIikpIHsKLSAgICAgICAgICAgIHMgPSBzLnN1YnN0cmluZygxKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IEJpZ0RlY2ltYWwocyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmbG9hdCBjb252ZXJ0VG9GbG9hdChTdHJpbmcgcykgewotICAgICAgICBpZiAoKHMgPT0gbnVsbCkgfHwgcy5lcXVhbHMoIiIpKXsKLSAgICAgICAgICAgIHJldHVybiBGbG9hdC5OYU47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHMuc3RhcnRzV2l0aCgiKyIpKSB7Ci0gICAgICAgICAgICBzID0gcy5zdWJzdHJpbmcoMSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKFBPU0lUSVZFX0lORklOSVRZLmVxdWFscyhzKSkgewotICAgICAgICAgICAgcmV0dXJuIEZsb2F0LlBPU0lUSVZFX0lORklOSVRZOwotICAgICAgICB9IGVsc2UgaWYgKE5FR0FUSVZFX0lORklOSVRZLmVxdWFscyhzKSkgewotICAgICAgICAgICAgcmV0dXJuIEZsb2F0Lk5FR0FUSVZFX0lORklOSVRZOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBGbG9hdC5wYXJzZUZsb2F0KHMpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhTdHJpbmcgcykgewotICAgICAgICByZXR1cm4gczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGxvbmcgY29udmVydFRvTG9uZyhTdHJpbmcgcykgewotICAgICAgICBpZiAoKHMgPT0gbnVsbCkgfHwgcy5lcXVhbHMoIiIpKXsKLSAgICAgICAgICAgIHJldHVybiBMb25nLk1JTl9WQUxVRTsKLSAgICAgICAgfQotICAgICAgICBpZiAocy5zdGFydHNXaXRoKCIrIikpIHsKLSAgICAgICAgICAgIHMgPSBzLnN1YnN0cmluZygxKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gTG9uZy5wYXJzZUxvbmcocyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBzaG9ydCBjb252ZXJ0VG9TaG9ydChTdHJpbmcgcykgewotICAgICAgICBpZiAoKHMgPT0gbnVsbCkgfHwgcy5lcXVhbHMoIiIpKXsKLSAgICAgICAgICAgIHJldHVybiBTaG9ydC5NSU5fVkFMVUU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHMuc3RhcnRzV2l0aCgiKyIpKSB7Ci0gICAgICAgICAgICBzID0gcy5zdWJzdHJpbmcoMSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFNob3J0LnBhcnNlU2hvcnQocyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnZlcnRUb0Jvb2xlYW4oU3RyaW5nIHMpIHsKLQotICAgICAgICBib29sZWFuIHJldHVyblZhbHVlID0gZmFsc2U7Ci0gICAgICAgIGlmICgocyAhPSBudWxsKSAmJiAocy5sZW5ndGgoKSA+IDApKSB7Ci0gICAgICAgICAgICBpZiAoIjEiLmVxdWFscyhzKSB8fCBzLnRvTG93ZXJDYXNlKCkuZXF1YWxzKCJ0cnVlIikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZSA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCEiMCIuZXF1YWxzKHMpICYmICFzLnRvTG93ZXJDYXNlKCkuZXF1YWxzKCJmYWxzZSIpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImluIHZhbGlkIHN0cmluZyAtIiArIHMgKyAiIGZvciBib29sZWFuIHZhbHVlIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb0FueVNpbXBsZVR5cGUoU3RyaW5nIHMpIHsKLSAgICAgICAgcmV0dXJuIHM7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPTUVsZW1lbnQgY29udmVydFRvQW55VHlwZShTdHJpbmcgcykgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKAotICAgICAgICAgICAgICAgICAgICBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ocy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICBTdEFYT01CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RBWE9NQnVpbGRlcihPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKSwgcik7Ci0gICAgICAgICAgICByZXR1cm4gYnVpbGRlci5nZXREb2N1bWVudEVsZW1lbnQoKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBZZWFyTW9udGggY29udmVydFRvR1llYXJNb250aChTdHJpbmcgcykgewotICAgICAgICBpZiAoKHMgPT0gbnVsbCkgfHwgcy5lcXVhbHMoIiIpKXsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgWWVhck1vbnRoKHMpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTW9udGhEYXkgY29udmVydFRvR01vbnRoRGF5KFN0cmluZyBzKSB7Ci0gICAgICAgIGlmICgocyA9PSBudWxsKSB8fCBzLmVxdWFscygiIikpewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBNb250aERheShzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFllYXIgY29udmVydFRvR1llYXIoU3RyaW5nIHMpIHsKLSAgICAgICAgaWYgKChzID09IG51bGwpIHx8IHMuZXF1YWxzKCIiKSl7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IFllYXIocyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBNb250aCBjb252ZXJ0VG9HTW9udGgoU3RyaW5nIHMpIHsKLSAgICAgICAgaWYgKChzID09IG51bGwpIHx8IHMuZXF1YWxzKCIiKSl7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IE1vbnRoKHMpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgRGF5IGNvbnZlcnRUb0dEYXkoU3RyaW5nIHMpIHsKLSAgICAgICAgaWYgKChzID09IG51bGwpIHx8IHMuZXF1YWxzKCIiKSl7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IERheShzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIER1cmF0aW9uIGNvbnZlcnRUb0R1cmF0aW9uKFN0cmluZyBzKSB7Ci0gICAgICAgIGlmICgocyA9PSBudWxsKSB8fCBzLmVxdWFscygiIikpewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBEdXJhdGlvbihzKTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyBzdGF0aWMgSGV4QmluYXJ5IGNvbnZlcnRUb0hleEJpbmFyeShTdHJpbmcgcykgewotICAgICAgICBpZiAoKHMgPT0gbnVsbCkgfHwgcy5lcXVhbHMoIiIpKXsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgSGV4QmluYXJ5KHMpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgamF2YXguYWN0aXZhdGlvbi5EYXRhSGFuZGxlciBjb252ZXJ0VG9CYXNlNjRCaW5hcnkoU3RyaW5nIHMpIHsKLSAgICAgICAgLy8gcmV1c2luZyB0aGUgYnl0ZUFycmF5RGF0YVNvdXJjZSBmcm9tIHRoZSBBeGlvbSBjbGFzc2VzCi0gICAgICAgIGlmICgocyA9PSBudWxsKSB8fCBzLmVxdWFscygiIikpewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgQnl0ZUFycmF5RGF0YVNvdXJjZSBieXRlQXJyYXlEYXRhU291cmNlID0gbmV3IEJ5dGVBcnJheURhdGFTb3VyY2UoCi0gICAgICAgICAgICAgICAgQmFzZTY0LmRlY29kZShzKQotICAgICAgICApOwotICAgICAgICByZXR1cm4gbmV3IERhdGFIYW5kbGVyKGJ5dGVBcnJheURhdGFTb3VyY2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgamF2YXguYWN0aXZhdGlvbi5EYXRhSGFuZGxlciBjb252ZXJ0VG9EYXRhSGFuZGxlcihTdHJpbmcgcykgewotICAgICAgICByZXR1cm4gY29udmVydFRvQmFzZTY0QmluYXJ5KHMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIGEgZ2l2ZW4gc3RyaW5nIGludG8gYSBkYXRlLiBDb2RlIGZyb20gQXhpczEgRGF0ZURlc2VyaWFsaXplci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzb3VyY2UKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgRGF0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIERhdGUgY29udmVydFRvRGF0ZShTdHJpbmcgc291cmNlKSB7Ci0KLSAgICAgICAgLy8gdGhlIGxleGljYWwgZm9ybSBvZiB0aGUgZGF0ZSBpcyAnLSc/IHl5eXkgJy0nIG1tICctJyBkZCB6enp6eno/Ci0gICAgICAgIGlmICgoc291cmNlID09IG51bGwpIHx8IHNvdXJjZS50cmltKCkuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgc291cmNlID0gc291cmNlLnRyaW0oKTsKLSAgICAgICAgYm9vbGVhbiBiYyA9IGZhbHNlOwotICAgICAgICBpZiAoc291cmNlLnN0YXJ0c1dpdGgoIi0iKSkgewotICAgICAgICAgICAgc291cmNlID0gc291cmNlLnN1YnN0cmluZygxKTsKLSAgICAgICAgICAgIGJjID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCB5ZWFyID0gMDsKLSAgICAgICAgaW50IG1vbnRoID0gMDsKLSAgICAgICAgaW50IGRheSA9IDA7Ci0gICAgICAgIGludCB0aW1lWm9uZU9mZlNldCA9IFRpbWVab25lLmdldERlZmF1bHQoKS5nZXRSYXdPZmZzZXQoKTsKLQotICAgICAgICBpZiAoc291cmNlLmxlbmd0aCgpID49IDEwKSB7Ci0gICAgICAgICAgICAvL2ZpcnN0IDEwIG51bWJlcnMgbXVzdCBnaXZlIHRoZSB5ZWFyCi0gICAgICAgICAgICBpZiAoKHNvdXJjZS5jaGFyQXQoNCkgIT0gJy0nKSB8fCAoc291cmNlLmNoYXJBdCg3KSAhPSAnLScpKXsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiaW52YWxpZCBkYXRlIGZvcm1hdCAoIiArIHNvdXJjZSArICIpIHdpdGggb3V0IC0gcyBhdCBjb3JyZWN0IHBsYWNlICIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgeWVhciA9IEludGVnZXIucGFyc2VJbnQoc291cmNlLnN1YnN0cmluZygwLDQpKTsKLSAgICAgICAgICAgIG1vbnRoID0gSW50ZWdlci5wYXJzZUludChzb3VyY2Uuc3Vic3RyaW5nKDUsNykpOwotICAgICAgICAgICAgZGF5ID0gSW50ZWdlci5wYXJzZUludChzb3VyY2Uuc3Vic3RyaW5nKDgsMTApKTsKLQotICAgICAgICAgICAgaWYgKHNvdXJjZS5sZW5ndGgoKSA+IDEwKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHJlc3RwYXJ0ID0gc291cmNlLnN1YnN0cmluZygxMCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3RwYXJ0LnN0YXJ0c1dpdGgoIloiKSkgewotICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIGEgZ210IHRpbWUgem9uZSB2YWx1ZQotICAgICAgICAgICAgICAgICAgICB0aW1lWm9uZU9mZlNldCA9IDA7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXN0cGFydC5zdGFydHNXaXRoKCIrIikgfHwgcmVzdHBhcnQuc3RhcnRzV2l0aCgiLSIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgYSBzcGVjaWZpYyB0aW1lIGZvcm1hdCBzdHJpbmcKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3RwYXJ0LmNoYXJBdCgzKSAhPSAnOicpewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImludmFsaWQgdGltZSB6b25lIGZvcm1hdCAoIiArIHNvdXJjZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIpIHdpdGhvdXQgOiBhdCBjb3JyZWN0IHBsYWNlIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaW50IGhvdXJzID0gSW50ZWdlci5wYXJzZUludChyZXN0cGFydC5zdWJzdHJpbmcoMSwzKSk7Ci0gICAgICAgICAgICAgICAgICAgIGludCBtaW5pdHMgPSBJbnRlZ2VyLnBhcnNlSW50KHJlc3RwYXJ0LnN1YnN0cmluZyg0LDYpKTsKLSAgICAgICAgICAgICAgICAgICAgdGltZVpvbmVPZmZTZXQgPSAoKGhvdXJzICogNjApICsgbWluaXRzKSAqIDYwMDAwOwotICAgICAgICAgICAgICAgICAgICBpZiAocmVzdHBhcnQuc3RhcnRzV2l0aCgiLSIpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVab25lT2ZmU2V0ID0gdGltZVpvbmVPZmZTZXQgKiAtMTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJJbiB2YWxpZCBzdHJpbmcgc3VmaXgiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiSW4gdmFsaWQgc3RyaW5nIHRvIHBhcnNlIik7Ci0gICAgICAgIH0KLQotICAgICAgICBDYWxlbmRhciBjYWxlbmRhciA9IENhbGVuZGFyLmdldEluc3RhbmNlKCk7Ci0gICAgICAgIGNhbGVuZGFyLmNsZWFyKCk7Ci0gICAgICAgIGNhbGVuZGFyLnNldExlbmllbnQoZmFsc2UpOwotICAgICAgICBjYWxlbmRhci5zZXQoQ2FsZW5kYXIuWUVBUiwgeWVhcik7Ci0gICAgICAgIC8veG1sIG1vbnRoIHN0YXJzIGZyb20gdGhlIDEgYW5kIGNhbGVuZGFyIG1vbnRoIGlzIHN0YXJ0cyB3aXRoIDAKLSAgICAgICAgY2FsZW5kYXIuc2V0KENhbGVuZGFyLk1PTlRILCBtb250aCAtIDEpOwotICAgICAgICBjYWxlbmRhci5zZXQoQ2FsZW5kYXIuREFZX09GX01PTlRILCBkYXkpOwotICAgICAgICBjYWxlbmRhci5zZXQoQ2FsZW5kYXIuWk9ORV9PRkZTRVQsIHRpbWVab25lT2ZmU2V0KTsKLSAgICAgICAgY2FsZW5kYXIuc2V0KENhbGVuZGFyLkRTVF9PRkZTRVQsIDApOwotICAgICAgICBjYWxlbmRhci5nZXRUaW1lSW5NaWxsaXMoKTsKLSAgICAgICAgaWYgKGJjKXsKLSAgICAgICAgICAgIGNhbGVuZGFyLnNldChDYWxlbmRhci5FUkEsIEdyZWdvcmlhbkNhbGVuZGFyLkJDKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjYWxlbmRhci5nZXRUaW1lKCk7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRpbWUgY29udmVydFRvVGltZShTdHJpbmcgcykgewotICAgICAgICBpZiAoKHMgPT0gbnVsbCkgfHwgcy5lcXVhbHMoIiIpKXsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgVGltZShzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRva2VuIGNvbnZlcnRUb1Rva2VuKFN0cmluZyBzKSB7Ci0gICAgICAgIGlmICgocyA9PSBudWxsKSB8fCBzLmVxdWFscygiIikpewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBUb2tlbihzKTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyBzdGF0aWMgTm9ybWFsaXplZFN0cmluZyBjb252ZXJ0VG9Ob3JtYWxpemVkU3RyaW5nKFN0cmluZyBzKSB7Ci0gICAgICAgIGlmICgocyA9PSBudWxsKSB8fCBzLmVxdWFscygiIikpewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBOb3JtYWxpemVkU3RyaW5nKHMpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVW5zaWduZWRMb25nIGNvbnZlcnRUb1Vuc2lnbmVkTG9uZyhTdHJpbmcgcykgewotICAgICAgICBpZiAoKHMgPT0gbnVsbCkgfHwgcy5lcXVhbHMoIiIpKXsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzLnN0YXJ0c1dpdGgoIisiKSkgewotICAgICAgICAgICAgcyA9IHMuc3Vic3RyaW5nKDEpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgVW5zaWduZWRMb25nKHMpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVW5zaWduZWRJbnQgY29udmVydFRvVW5zaWduZWRJbnQoU3RyaW5nIHMpIHsKLSAgICAgICAgaWYgKChzID09IG51bGwpIHx8IHMuZXF1YWxzKCIiKSl7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBpZiAocy5zdGFydHNXaXRoKCIrIikpIHsKLSAgICAgICAgICAgIHMgPSBzLnN1YnN0cmluZygxKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IFVuc2lnbmVkSW50KHMpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVW5zaWduZWRTaG9ydCBjb252ZXJ0VG9VbnNpZ25lZFNob3J0KFN0cmluZyBzKSB7Ci0gICAgICAgIGlmICgocyA9PSBudWxsKSB8fCBzLmVxdWFscygiIikpewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHMuc3RhcnRzV2l0aCgiKyIpKSB7Ci0gICAgICAgICAgICBzID0gcy5zdWJzdHJpbmcoMSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBVbnNpZ25lZFNob3J0KHMpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVW5zaWduZWRCeXRlIGNvbnZlcnRUb1Vuc2lnbmVkQnl0ZShTdHJpbmcgcykgewotICAgICAgICBpZiAoKHMgPT0gbnVsbCkgfHwgcy5lcXVhbHMoIiIpKXsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzLnN0YXJ0c1dpdGgoIisiKSkgewotICAgICAgICAgICAgcyA9IHMuc3Vic3RyaW5nKDEpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgVW5zaWduZWRCeXRlKHMpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTm9uTmVnYXRpdmVJbnRlZ2VyIGNvbnZlcnRUb05vbk5lZ2F0aXZlSW50ZWdlcihTdHJpbmcgcykgewotICAgICAgICBpZiAoKHMgPT0gbnVsbCkgfHwgcy5lcXVhbHMoIiIpKXsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzLnN0YXJ0c1dpdGgoIisiKSkgewotICAgICAgICAgICAgcyA9IHMuc3Vic3RyaW5nKDEpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgTm9uTmVnYXRpdmVJbnRlZ2VyKHMpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTmVnYXRpdmVJbnRlZ2VyIGNvbnZlcnRUb05lZ2F0aXZlSW50ZWdlcihTdHJpbmcgcykgewotICAgICAgICBpZiAoKHMgPT0gbnVsbCkgfHwgcy5lcXVhbHMoIiIpKXsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzLnN0YXJ0c1dpdGgoIisiKSkgewotICAgICAgICAgICAgcyA9IHMuc3Vic3RyaW5nKDEpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgTmVnYXRpdmVJbnRlZ2VyKHMpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgUG9zaXRpdmVJbnRlZ2VyIGNvbnZlcnRUb1Bvc2l0aXZlSW50ZWdlcihTdHJpbmcgcykgewotICAgICAgICBpZiAoKHMgPT0gbnVsbCkgfHwgcy5lcXVhbHMoIiIpKXsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzLnN0YXJ0c1dpdGgoIisiKSkgewotICAgICAgICAgICAgcyA9IHMuc3Vic3RyaW5nKDEpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgUG9zaXRpdmVJbnRlZ2VyKHMpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTm9uUG9zaXRpdmVJbnRlZ2VyIGNvbnZlcnRUb05vblBvc2l0aXZlSW50ZWdlcihTdHJpbmcgcykgewotICAgICAgICBpZiAoKHMgPT0gbnVsbCkgfHwgcy5lcXVhbHMoIiIpKXsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzLnN0YXJ0c1dpdGgoIisiKSkgewotICAgICAgICAgICAgcyA9IHMuc3Vic3RyaW5nKDEpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgTm9uUG9zaXRpdmVJbnRlZ2VyKHMpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTmFtZSBjb252ZXJ0VG9OYW1lKFN0cmluZyBzKSB7Ci0gICAgICAgIGlmICgocyA9PSBudWxsKSB8fCBzLmVxdWFscygiIikpewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBOYW1lKHMpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTkNOYW1lIGNvbnZlcnRUb05DTmFtZShTdHJpbmcgcykgewotICAgICAgICBpZiAoKHMgPT0gbnVsbCkgfHwgcy5lcXVhbHMoIiIpKXsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgTkNOYW1lKHMpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgSWQgY29udmVydFRvSUQoU3RyaW5nIHMpIHsKLSAgICAgICAgaWYgKChzID09IG51bGwpIHx8IHMuZXF1YWxzKCIiKSl7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IElkKHMpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgSWQgY29udmVydFRvSWQoU3RyaW5nIHMpIHsKLSAgICAgICAgcmV0dXJuIGNvbnZlcnRUb0lEKHMpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTGFuZ3VhZ2UgY29udmVydFRvTGFuZ3VhZ2UoU3RyaW5nIHMpIHsKLSAgICAgICAgaWYgKChzID09IG51bGwpIHx8IHMuZXF1YWxzKCIiKSl7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IExhbmd1YWdlKHMpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTk1Ub2tlbiBjb252ZXJ0VG9OTVRPS0VOKFN0cmluZyBzKSB7Ci0gICAgICAgIGlmICgocyA9PSBudWxsKSB8fCBzLmVxdWFscygiIikpewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBOTVRva2VuKHMpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTk1Ub2tlbnMgY29udmVydFRvTk1UT0tFTlMoU3RyaW5nIHMpIHsKLSAgICAgICAgaWYgKChzID09IG51bGwpIHx8IHMuZXF1YWxzKCIiKSl7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IE5NVG9rZW5zKHMpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTm90YXRpb24gY29udmVydFRvTk9UQVRJT04oU3RyaW5nIHMpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7IC8vdG9kbyBOZWVkIHRvIGZpeCB0aGlzCi0gICAgICAgIC8vIHJldHVybiBuZXcgTm90YXRpb24ocyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBFbnRpdHkgY29udmVydFRvRU5USVRZKFN0cmluZyBzKSB7Ci0gICAgICAgIGlmICgocyA9PSBudWxsKSB8fCBzLmVxdWFscygiIikpewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBFbnRpdHkocyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBFbnRpdGllcyBjb252ZXJ0VG9FTlRJVElFUyhTdHJpbmcgcykgewotICAgICAgICBpZiAoKHMgPT0gbnVsbCkgfHwgcy5lcXVhbHMoIiIpKXsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgRW50aXRpZXMocyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBJRFJlZiBjb252ZXJ0VG9JRFJFRihTdHJpbmcgcykgewotICAgICAgICBpZiAoKHMgPT0gbnVsbCkgfHwgcy5lcXVhbHMoIiIpKXsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgSURSZWYocyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBJRFJlZnMgY29udmVydFRvSURSRUZTKFN0cmluZyBzKSB7Ci0gICAgICAgIGlmICgocyA9PSBudWxsKSB8fCBzLmVxdWFscygiIikpewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBJRFJlZnMocyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBVUkkgY29udmVydFRvVVJJKFN0cmluZyBzKXsKLSAgICAgICAgaWYgKChzID09IG51bGwpIHx8IHMuZXF1YWxzKCIiKSl7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY29udmVydFRvQW55VVJJKHMpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVVJJIGNvbnZlcnRUb0FueVVSSShTdHJpbmcgcykgewotICAgICAgICBpZiAoKHMgPT0gbnVsbCkgfHwgcy5lcXVhbHMoIiIpKXsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFVSSShzKTsKLSAgICAgICAgfSBjYXRjaCAoVVJJLk1hbGZvcm1lZFVSSUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgT2JqZWN0Q29udmVyc2lvbkV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgQURCTWVzc2FnZXMuZ2V0TWVzc2FnZSgiY29udmVydGVyLmNhbm5vdFBhcnNlIiwgcyksIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBCaWdJbnRlZ2VyIGNvbnZlcnRUb0ludGVnZXIoU3RyaW5nIHMpIHsKLSAgICAgICAgaWYgKChzID09IG51bGwpIHx8IHMuZXF1YWxzKCIiKSl7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBpZiAocy5zdGFydHNXaXRoKCIrIikpIHsKLSAgICAgICAgICAgIHMgPSBzLnN1YnN0cmluZygxKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IEJpZ0ludGVnZXIocyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBCaWdJbnRlZ2VyIGNvbnZlcnRUb0JpZ0ludGVnZXIoU3RyaW5nIHMpIHsKLSAgICAgICAgaWYgKChzID09IG51bGwpIHx8IHMuZXF1YWxzKCIiKSl7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBpZiAocy5zdGFydHNXaXRoKCIrIikpIHsKLSAgICAgICAgICAgIHMgPSBzLnN1YnN0cmluZygxKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY29udmVydFRvSW50ZWdlcihzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJ5dGUgY29udmVydFRvQnl0ZShTdHJpbmcgcykgewotICAgICAgICBpZiAoKHMgPT0gbnVsbCkgfHwgcy5lcXVhbHMoIiIpKXsKLSAgICAgICAgICAgIHJldHVybiBCeXRlLk1JTl9WQUxVRTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gQnl0ZS5wYXJzZUJ5dGUocyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29kZSBmcm9tIEF4aXMxIGNvZGUgYmFzZSBOb3RlIC0gV2Ugb25seSBmb2xsb3cgdGhlIGNvbnZlbnRpb24gaW4gdGhlIGxhdGVzdCBzY2hlbWEgc3BlYwotICAgICAqCi0gICAgICogQHBhcmFtIHNvdXJjZQotICAgICAqIEByZXR1cm4gUmV0dXJucyBDYWxlbmRhci4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIENhbGVuZGFyIGNvbnZlcnRUb0RhdGVUaW1lKFN0cmluZyBzb3VyY2UpIHsKLQotICAgICAgICBpZiAoKHNvdXJjZSA9PSBudWxsKSB8fCBzb3VyY2UudHJpbSgpLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHNvdXJjZSA9IHNvdXJjZS50cmltKCk7Ci0gICAgICAgIC8vIHRoZSBsZXhpY2FsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBkYXRlIHRpbWUgYXMgZm9sbG93cwotICAgICAgICAvLyAnLSc/IHl5eXkgJy0nIG1tICctJyBkZCAnVCcgaGggJzonIG1tICc6JyBzcyAoJy4nIHMrKT8gKHp6enp6eik/Ci0gICAgICAgIERhdGUgZGF0ZSA9IG51bGw7Ci0gICAgICAgIENhbGVuZGFyIGNhbGVuZGFyID0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgY2FsZW5kYXIuY2xlYXIoKTsKLSAgICAgICAgY2FsZW5kYXIuc2V0TGVuaWVudChmYWxzZSk7Ci0KLQotICAgICAgICBpZiAoc291cmNlLnN0YXJ0c1dpdGgoIi0iKSkgewotICAgICAgICAgICAgc291cmNlID0gc291cmNlLnN1YnN0cmluZygxKTsKLSAgICAgICAgICAgIGNhbGVuZGFyLnNldChDYWxlbmRhci5FUkEsIEdyZWdvcmlhbkNhbGVuZGFyLkJDKTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCB5ZWFyID0gMDsKLSAgICAgICAgaW50IG1vbnRoID0gMDsKLSAgICAgICAgaW50IGRheSA9IDA7Ci0gICAgICAgIGludCBob3VyID0gMDsKLSAgICAgICAgaW50IG1pbml0ZSA9IDA7Ci0gICAgICAgIGludCBzZWNvbmQgPSAwOwotICAgICAgICBsb25nIG1pbGlTZWNvbmQgPSAwOwotICAgICAgICBpbnQgdGltZVpvbmVPZmZTZXQgPSBUaW1lWm9uZS5nZXREZWZhdWx0KCkuZ2V0UmF3T2Zmc2V0KCk7Ci0KLQotICAgICAgICBpZiAoKHNvdXJjZSAhPSBudWxsKSAmJiAoc291cmNlLmxlbmd0aCgpID49IDE5KSkgewotICAgICAgICAgICAgaWYgKChzb3VyY2UuY2hhckF0KDQpICE9ICctJykgfHwKLSAgICAgICAgICAgICAgICAgICAgKHNvdXJjZS5jaGFyQXQoNykgIT0gJy0nKSB8fAotICAgICAgICAgICAgICAgICAgICAoc291cmNlLmNoYXJBdCgxMCkgIT0gJ1QnKSB8fAotICAgICAgICAgICAgICAgICAgICAoc291cmNlLmNoYXJBdCgxMykgIT0gJzonKSB8fAotICAgICAgICAgICAgICAgICAgICAoc291cmNlLmNoYXJBdCgxNikgIT0gJzonKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJpbnZhbGlkIGRhdGUgZm9ybWF0ICgiICsgc291cmNlICsgIikgd2l0aCBvdXQgLSBzIGF0IGNvcnJlY3QgcGxhY2UgIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB5ZWFyID0gSW50ZWdlci5wYXJzZUludChzb3VyY2Uuc3Vic3RyaW5nKDAsIDQpKTsKLSAgICAgICAgICAgIG1vbnRoID0gSW50ZWdlci5wYXJzZUludChzb3VyY2Uuc3Vic3RyaW5nKDUsIDcpKTsKLSAgICAgICAgICAgIGRheSA9IEludGVnZXIucGFyc2VJbnQoc291cmNlLnN1YnN0cmluZyg4LCAxMCkpOwotICAgICAgICAgICAgaG91ciA9IEludGVnZXIucGFyc2VJbnQoc291cmNlLnN1YnN0cmluZygxMSwgMTMpKTsKLSAgICAgICAgICAgIG1pbml0ZSA9IEludGVnZXIucGFyc2VJbnQoc291cmNlLnN1YnN0cmluZygxNCwgMTYpKTsKLSAgICAgICAgICAgIHNlY29uZCA9IEludGVnZXIucGFyc2VJbnQoc291cmNlLnN1YnN0cmluZygxNywgMTkpKTsKLQotICAgICAgICAgICAgaW50IG1pbGxpU2Vjb25kUGFydExlbmd0aCA9IDA7Ci0KLSAgICAgICAgICAgIGlmIChzb3VyY2UubGVuZ3RoKCkgPiAxOSkgIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcmVzdCA9IHNvdXJjZS5zdWJzdHJpbmcoMTkpOwotICAgICAgICAgICAgICAgIGlmIChyZXN0LnN0YXJ0c1dpdGgoIi4iKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBpLmUgdGhpcyBoYXZlIHRoZSAoJy4ncyspIHBhcnQKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3QuZW5kc1dpdGgoIloiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBpbiBnbXQgdGltZSB6b25lCi0gICAgICAgICAgICAgICAgICAgICAgICB0aW1lWm9uZU9mZlNldCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYWxlbmRhci5zZXRUaW1lWm9uZShUaW1lWm9uZS5nZXRUaW1lWm9uZSgiR01UIikpOwotICAgICAgICAgICAgICAgICAgICAgICAgbWlsaVNlY29uZCA9IEludGVnZXIucGFyc2VJbnQocmVzdC5zdWJzdHJpbmcoMSwgcmVzdC5sYXN0SW5kZXhPZigiWiIpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtaWxsaVNlY29uZFBhcnRMZW5ndGggPSByZXN0LnN1YnN0cmluZygxLHJlc3QubGFzdEluZGV4T2YoIloiKSkudHJpbSgpLmxlbmd0aCgpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChyZXN0Lmxhc3RJbmRleE9mKCIrIikgPiAwKSB8fCAocmVzdC5sYXN0SW5kZXhPZigiLSIpID4gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgZ2l2ZW4gaW4gYSBnZW5lcmFsIHRpbWUgemlvbmUKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0aW1lT2ZmU2V0ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN0Lmxhc3RJbmRleE9mKCIrIikgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZU9mZlNldCA9IHJlc3Quc3Vic3RyaW5nKHJlc3QubGFzdEluZGV4T2YoIisiKSArIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbGlTZWNvbmQgPSBJbnRlZ2VyLnBhcnNlSW50KHJlc3Quc3Vic3RyaW5nKDEsIHJlc3QubGFzdEluZGV4T2YoIisiKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbGxpU2Vjb25kUGFydExlbmd0aCA9IHJlc3Quc3Vic3RyaW5nKDEsIHJlc3QubGFzdEluZGV4T2YoIisiKSkudHJpbSgpLmxlbmd0aCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGtlZXAgKzEgb3IgLTEgdG8gZmluYWxseSBjYWxjdWxhdGUgdGhlIHZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZVpvbmVPZmZTZXQgPSAxOwotCi0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlc3QubGFzdEluZGV4T2YoIi0iKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lT2ZmU2V0ID0gcmVzdC5zdWJzdHJpbmcocmVzdC5sYXN0SW5kZXhPZigiLSIpICsgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlsaVNlY29uZCA9IEludGVnZXIucGFyc2VJbnQocmVzdC5zdWJzdHJpbmcoMSwgcmVzdC5sYXN0SW5kZXhPZigiLSIpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlsbGlTZWNvbmRQYXJ0TGVuZ3RoID0gcmVzdC5zdWJzdHJpbmcoMSwgcmVzdC5sYXN0SW5kZXhPZigiLSIpKS50cmltKCkubGVuZ3RoKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2Uga2VlcCArMSBvciAtMSB0byBmaW5hbGx5IGNhbGN1bGF0ZSB0aGUgdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lWm9uZU9mZlNldCA9IC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRpbWVPZmZTZXQuY2hhckF0KDIpICE9ICc6JykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJpbnZhbGlkIHRpbWUgem9uZSBmb3JtYXQgKCIgKyBzb3VyY2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIikgd2l0aG91dCA6IGF0IGNvcnJlY3QgcGxhY2UiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBob3VycyA9IEludGVnZXIucGFyc2VJbnQodGltZU9mZlNldC5zdWJzdHJpbmcoMCwgMikpOwotICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1pbml0cyA9IEludGVnZXIucGFyc2VJbnQodGltZU9mZlNldC5zdWJzdHJpbmcoMywgNSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgdGltZVpvbmVPZmZTZXQgPSAoKGhvdXJzICogNjApICsgbWluaXRzKSAqIDYwMDAwICogdGltZVpvbmVPZmZTZXQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGkuZSBpdCBkb2VzIG5vdCBoYXZlIHRpbWUgem9uZQotICAgICAgICAgICAgICAgICAgICAgICAgbWlsaVNlY29uZCA9IEludGVnZXIucGFyc2VJbnQocmVzdC5zdWJzdHJpbmcoMSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgbWlsbGlTZWNvbmRQYXJ0TGVuZ3RoID0gcmVzdC5zdWJzdHJpbmcoMSkudHJpbSgpLmxlbmd0aCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAocmVzdC5zdGFydHNXaXRoKCJaIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhbGVuZGFyLnNldFRpbWVab25lKFRpbWVab25lLmdldFRpbWVab25lKCJHTVQiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIGluIGdtdCB0aW1lIHpvbmUKLSAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVab25lT2ZmU2V0ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXN0LnN0YXJ0c1dpdGgoIisiKSB8fCByZXN0LnN0YXJ0c1dpdGgoIi0iKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBnaXZlbiBpbiBhIGdlbmVyYWwgdGltZSB6aW9uZQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3QuY2hhckF0KDMpICE9ICc6JykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJpbnZhbGlkIHRpbWUgem9uZSBmb3JtYXQgKCIgKyBzb3VyY2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIikgd2l0aG91dCA6IGF0IGNvcnJlY3QgcGxhY2UiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBob3VycyA9IEludGVnZXIucGFyc2VJbnQocmVzdC5zdWJzdHJpbmcoMSwgMykpOwotICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1pbml0cyA9IEludGVnZXIucGFyc2VJbnQocmVzdC5zdWJzdHJpbmcoNCwgNikpOwotICAgICAgICAgICAgICAgICAgICAgICAgdGltZVpvbmVPZmZTZXQgPSAoKGhvdXJzICogNjApICsgbWluaXRzKSAqIDYwMDAwOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3Quc3RhcnRzV2l0aCgiLSIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZVpvbmVPZmZTZXQgPSB0aW1lWm9uZU9mZlNldCAqIC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE51bWJlckZvcm1hdEV4Y2VwdGlvbigiaW4gdmFsaWQgdGltZSB6b25lIGF0dHJpYnV0ZSIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FsZW5kYXIuc2V0KENhbGVuZGFyLllFQVIsIHllYXIpOwotICAgICAgICAgICAgLy8geG1sIG1vbnRoIGlzIHN0YXJ0ZWQgZnJvbSAxIGFuZCBjYWxlbmRhciBtb250aCBpcyBzdGFydGVkIGZyb20gMAotICAgICAgICAgICAgY2FsZW5kYXIuc2V0KENhbGVuZGFyLk1PTlRILCBtb250aCAtIDEpOwotICAgICAgICAgICAgY2FsZW5kYXIuc2V0KENhbGVuZGFyLkRBWV9PRl9NT05USCwgZGF5KTsKLSAgICAgICAgICAgIGNhbGVuZGFyLnNldChDYWxlbmRhci5IT1VSX09GX0RBWSwgaG91cik7Ci0gICAgICAgICAgICBjYWxlbmRhci5zZXQoQ2FsZW5kYXIuTUlOVVRFLCBtaW5pdGUpOwotICAgICAgICAgICAgY2FsZW5kYXIuc2V0KENhbGVuZGFyLlNFQ09ORCwgc2Vjb25kKTsKLSAgICAgICAgICAgIGlmIChtaWxsaVNlY29uZFBhcnRMZW5ndGggIT0gMyl7Ci0gICAgICAgICAgICAgICAgLy8gbWlsaXNlY29uZCBwYXJ0IHJlcHJlc2Vuc3QgdGhlIGZyYWN0aW9uIG9mIHRoZSBzZWNvbmQgc28gd2UgaGF2ZSB0bwotICAgICAgICAgICAgICAgIC8vIGZpbmQgdGhlIGZyYWN0aW9uIGFuZCBtdWx0aXBseSBpdCBieSAxMDAwLiBTbyBpZiBtaWxpc2Vjb25kIHBhcnQKLSAgICAgICAgICAgICAgICAvLyBoYXMgdGhyZWUgZGlnaXRzIG5vdGhpbmcgcmVxdWlyZWQKLSAgICAgICAgICAgICAgICBtaWxpU2Vjb25kID0gbWlsaVNlY29uZCAqIDEwMDA7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtaWxsaVNlY29uZFBhcnRMZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBtaWxpU2Vjb25kID0gbWlsaVNlY29uZCAvIDEwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhbGVuZGFyLnNldChDYWxlbmRhci5NSUxMSVNFQ09ORCwgKGludCltaWxpU2Vjb25kKTsKLSAgICAgICAgICAgIGNhbGVuZGFyLnNldChDYWxlbmRhci5aT05FX09GRlNFVCwgdGltZVpvbmVPZmZTZXQpOwotICAgICAgICAgICAgY2FsZW5kYXIuc2V0KENhbGVuZGFyLkRTVF9PRkZTRVQsIDApOwotCi0KLQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IE51bWJlckZvcm1hdEV4Y2VwdGlvbigiZGF0ZSBzdHJpbmcgY2FuIG5vdCBiZSBsZXNzIHRoYW4gMTkgY2hhcmFjdG9ycyIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGNhbGVuZGFyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvZGUgZnJvbSBBeGlzMSBjb2RlIGJhc2UKLSAgICAgKgotICAgICAqIEBwYXJhbSBzb3VyY2UKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgUU5hbWUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBRTmFtZSBjb252ZXJ0VG9RTmFtZShTdHJpbmcgc291cmNlLCBTdHJpbmcgbmFtZVNwYWNldXJpKSB7Ci0gICAgICAgIHNvdXJjZSA9IHNvdXJjZS50cmltKCk7Ci0gICAgICAgIGludCBjb2xvbiA9IHNvdXJjZS5sYXN0SW5kZXhPZigiOiIpOwotICAgICAgICAvL2NvbnRleHQuZ2V0TmFtZXNwYWNlVVJJKHNvdXJjZS5zdWJzdHJpbmcoMCwgY29sb24pKTsKLSAgICAgICAgU3RyaW5nIGxvY2FsUGFydCA9IGNvbG9uIDwgMCA/IHNvdXJjZSA6IHNvdXJjZS5zdWJzdHJpbmcoY29sb24gKyAxKTsKLSAgICAgICAgU3RyaW5nIHBlcmZpeCA9IGNvbG9uIDw9IDAgPyAiIiA6IHNvdXJjZS5zdWJzdHJpbmcoMCwgY29sb24pOwotICAgICAgICByZXR1cm4gbmV3IFFOYW1lKG5hbWVTcGFjZXVyaSwgbG9jYWxQYXJ0LCBwZXJmaXgpOwotICAgIH0KLQotICAgIC8qICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICovCi0KLSAgICAvKiBqYXZhIFByaW1pdGl2ZSB0eXBlcyB0byBPYmplY3QgY29udmVyc2lvbiBtZXRob2RzICovCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgY29udmVydFRvT2JqZWN0KFN0cmluZyBpKSB7Ci0gICAgICAgIHJldHVybiBpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGNvbnZlcnRUb09iamVjdChib29sZWFuIGkpIHsKLSAgICAgICAgcmV0dXJuIEJvb2xlYW4udmFsdWVPZihpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBjb252ZXJ0VG9PYmplY3QoZG91YmxlIGkpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBEb3VibGUoaSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgY29udmVydFRvT2JqZWN0KGJ5dGUgaSkgewotICAgICAgICByZXR1cm4gbmV3IEJ5dGUoaSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgY29udmVydFRvT2JqZWN0KGNoYXIgaSkgewotICAgICAgICByZXR1cm4gbmV3IENoYXJhY3RlcihpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBjb252ZXJ0VG9PYmplY3Qoc2hvcnQgaSkgewotICAgICAgICByZXR1cm4gbmV3IFNob3J0KGkpOwotICAgIH0KLQotICAgIC8qIGxpc3QgdG8gYXJyYXkgY29udmVyc2lvbiBtZXRob2RzICovCi0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBjb252ZXJ0VG9BcnJheShDbGFzcyBiYXNlQXJyYXlDbGFzcywgU3RyaW5nW10gdmFsdWVBcnJheSkgewotICAgICAgICAvL2NyZWF0ZSBhIGxpc3QgdXNpbmcgdGhlIHN0cmluZyBhcnJheQotICAgICAgICBMaXN0IHZhbHVlc0xpc3QgPSBuZXcgQXJyYXlMaXN0KHZhbHVlQXJyYXkubGVuZ3RoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZUFycmF5Lmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICB2YWx1ZXNMaXN0LmFkZCh2YWx1ZUFycmF5W2ldKTsKLQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGNvbnZlcnRUb0FycmF5KGJhc2VBcnJheUNsYXNzLCB2YWx1ZXNMaXN0KTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBiYXNlQXJyYXlDbGFzcwotICAgICAqIEBwYXJhbSBvYmplY3RMaXN0ICAgICAtPiBmb3IgcHJpbWl0aXZlIHR5cGUgYXJyYXkgY29udmVyc2lvbiB3ZSBhc3N1bWUgdGhlIGNvbnRlbnQgdG8gYmUKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5ncyEKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgT2JqZWN0LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGNvbnZlcnRUb0FycmF5KENsYXNzIGJhc2VBcnJheUNsYXNzLCBMaXN0IG9iamVjdExpc3QpIHsKLSAgICAgICAgaW50IGxpc3RTaXplID0gb2JqZWN0TGlzdC5zaXplKCk7Ci0gICAgICAgIE9iamVjdCByZXR1cm5BcnJheSA9IG51bGw7Ci0gICAgICAgIGlmIChpbnQuY2xhc3MuZXF1YWxzKGJhc2VBcnJheUNsYXNzKSkgewotICAgICAgICAgICAgaW50W10gYXJyYXkgPSBuZXcgaW50W2xpc3RTaXplXTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdFNpemU7IGkrKykgewotICAgICAgICAgICAgICAgIE9iamVjdCBvID0gb2JqZWN0TGlzdC5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgaWYgKG8gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhcnJheVtpXSA9IEludGVnZXIucGFyc2VJbnQoby50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhcnJheVtpXSA9IEludGVnZXIuTUlOX1ZBTFVFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybkFycmF5ID0gYXJyYXk7Ci0gICAgICAgIH0gZWxzZSBpZiAoZmxvYXQuY2xhc3MuZXF1YWxzKGJhc2VBcnJheUNsYXNzKSkgewotICAgICAgICAgICAgZmxvYXRbXSBhcnJheSA9IG5ldyBmbG9hdFtsaXN0U2l6ZV07Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3RTaXplOyBpKyspIHsKLSAgICAgICAgICAgICAgICBPYmplY3QgbyA9IG9iamVjdExpc3QuZ2V0KGkpOwotICAgICAgICAgICAgICAgIGlmIChvICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYXJyYXlbaV0gPSBGbG9hdC5wYXJzZUZsb2F0KG8udG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYXJyYXlbaV0gPSBGbG9hdC5OYU47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuQXJyYXkgPSBhcnJheTsKLSAgICAgICAgfSBlbHNlIGlmIChzaG9ydC5jbGFzcy5lcXVhbHMoYmFzZUFycmF5Q2xhc3MpKSB7Ci0gICAgICAgICAgICBzaG9ydFtdIGFycmF5ID0gbmV3IHNob3J0W2xpc3RTaXplXTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdFNpemU7IGkrKykgewotICAgICAgICAgICAgICAgIE9iamVjdCBvID0gb2JqZWN0TGlzdC5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgaWYgKG8gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhcnJheVtpXSA9IFNob3J0LnBhcnNlU2hvcnQoby50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhcnJheVtpXSA9IFNob3J0Lk1JTl9WQUxVRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm5BcnJheSA9IGFycmF5OwotICAgICAgICB9IGVsc2UgaWYgKGJ5dGUuY2xhc3MuZXF1YWxzKGJhc2VBcnJheUNsYXNzKSkgewotICAgICAgICAgICAgYnl0ZVtdIGFycmF5ID0gbmV3IGJ5dGVbbGlzdFNpemVdOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0U2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IG8gPSBvYmplY3RMaXN0LmdldChpKTsKLSAgICAgICAgICAgICAgICBpZiAobyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFycmF5W2ldID0gQnl0ZS5wYXJzZUJ5dGUoby50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhcnJheVtpXSA9IEJ5dGUuTUlOX1ZBTFVFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybkFycmF5ID0gYXJyYXk7Ci0gICAgICAgIH0gZWxzZSBpZiAobG9uZy5jbGFzcy5lcXVhbHMoYmFzZUFycmF5Q2xhc3MpKSB7Ci0gICAgICAgICAgICBsb25nW10gYXJyYXkgPSBuZXcgbG9uZ1tsaXN0U2l6ZV07Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3RTaXplOyBpKyspIHsKLSAgICAgICAgICAgICAgICBPYmplY3QgbyA9IG9iamVjdExpc3QuZ2V0KGkpOwotICAgICAgICAgICAgICAgIGlmIChvICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYXJyYXlbaV0gPSBMb25nLnBhcnNlTG9uZyhvLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGFycmF5W2ldID0gTG9uZy5NSU5fVkFMVUU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuQXJyYXkgPSBhcnJheTsKLSAgICAgICAgfSBlbHNlIGlmIChib29sZWFuLmNsYXNzLmVxdWFscyhiYXNlQXJyYXlDbGFzcykpIHsKLSAgICAgICAgICAgIGJvb2xlYW5bXSBhcnJheSA9IG5ldyBib29sZWFuW2xpc3RTaXplXTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdFNpemU7IGkrKykgewotICAgICAgICAgICAgICAgIE9iamVjdCBvID0gb2JqZWN0TGlzdC5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgaWYgKG8gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhcnJheVtpXSA9IG8udG9TdHJpbmcoKS5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuQXJyYXkgPSBhcnJheTsKLSAgICAgICAgfSBlbHNlIGlmIChjaGFyLmNsYXNzLmVxdWFscyhiYXNlQXJyYXlDbGFzcykpIHsKLSAgICAgICAgICAgIGNoYXJbXSBhcnJheSA9IG5ldyBjaGFyW2xpc3RTaXplXTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdFNpemU7IGkrKykgewotICAgICAgICAgICAgICAgIE9iamVjdCBvID0gb2JqZWN0TGlzdC5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgaWYgKG8gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhcnJheVtpXSA9IG8udG9TdHJpbmcoKS50b0NoYXJBcnJheSgpWzBdOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybkFycmF5ID0gYXJyYXk7Ci0gICAgICAgIH0gZWxzZSBpZiAoZG91YmxlLmNsYXNzLmVxdWFscyhiYXNlQXJyYXlDbGFzcykpIHsKLSAgICAgICAgICAgIGRvdWJsZVtdIGFycmF5ID0gbmV3IGRvdWJsZVtsaXN0U2l6ZV07Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3RTaXplOyBpKyspIHsKLSAgICAgICAgICAgICAgICBPYmplY3QgbyA9IG9iamVjdExpc3QuZ2V0KGkpOwotICAgICAgICAgICAgICAgIGlmIChvICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYXJyYXlbaV0gPSBEb3VibGUucGFyc2VEb3VibGUoby50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhcnJheVtpXSA9IERvdWJsZS5OYU47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuQXJyYXkgPSBhcnJheTsKLSAgICAgICAgfSBlbHNlIGlmIChDYWxlbmRhci5jbGFzcy5lcXVhbHMoYmFzZUFycmF5Q2xhc3MpKSB7Ci0gICAgICAgICAgICBDYWxlbmRhcltdIGFycmF5ID0gbmV3IENhbGVuZGFyW2xpc3RTaXplXTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdFNpemU7IGkrKykgewotICAgICAgICAgICAgICAgIE9iamVjdCBvID0gb2JqZWN0TGlzdC5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgaWYgKG8gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAobyBpbnN0YW5jZW9mIFN0cmluZyl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhcnJheVtpXSA9IENvbnZlcnRlclV0aWwuY29udmVydFRvRGF0ZVRpbWUoby50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvIGluc3RhbmNlb2YgQ2FsZW5kYXIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5W2ldID0gKENhbGVuZGFyKSBvOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuQXJyYXkgPSBhcnJheTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybkFycmF5ID0gQXJyYXkubmV3SW5zdGFuY2UoYmFzZUFycmF5Q2xhc3MsIGxpc3RTaXplKTsKLSAgICAgICAgICAgIENvbnZlcnRUb0FyYml0cmFyeU9iamVjdEFycmF5KHJldHVybkFycmF5LCBiYXNlQXJyYXlDbGFzcywgb2JqZWN0TGlzdCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldHVybkFycmF5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSByZXR1cm5BcnJheQotICAgICAqIEBwYXJhbSBiYXNlQXJyYXlDbGFzcwotICAgICAqIEBwYXJhbSBvYmplY3RMaXN0Ci0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBDb252ZXJ0VG9BcmJpdHJhcnlPYmplY3RBcnJheShPYmplY3QgcmV0dXJuQXJyYXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyBiYXNlQXJyYXlDbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Qgb2JqZWN0TGlzdCkgewotICAgICAgICBpZiAoIShBREJCZWFuLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oYmFzZUFycmF5Q2xhc3MpKSkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG9iamVjdExpc3Quc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgT2JqZWN0IG8gPSBvYmplY3RMaXN0LmdldChpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG8gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHN0cmluZyBpcyBudWxsIHRoZSBvYmplY3QgdmFsdWUgbXVzdCBiZSBudWxsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheS5zZXQocmV0dXJuQXJyYXksIGksIG51bGwpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXkuc2V0KHJldHVybkFycmF5LCBpLCBnZXRPYmplY3RGb3JDbGFzcygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZUFycmF5Q2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8udG9TdHJpbmcoKSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvL29vcHMhIC0gdGhpcyBjYW5ub3QgYmUgY29udmVydGVkIGZhbGwgdGhyb3VnaCBhbmQKLSAgICAgICAgICAgICAgICAvL3RyeSB0aGUgb3RoZXIgYWx0ZXJuYXRpdmUKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBvYmplY3RMaXN0LnRvQXJyYXkoKE9iamVjdFtdKXJldHVybkFycmF5KTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vd2UgYXJlIG92ZXIgd2l0aCBhbHRlcm5hdGl2ZXMgLSB0aHJvdyB0aGUKLSAgICAgICAgICAgIC8vY29udmVyaXNvbiBleGNlcHRpb24KLSAgICAgICAgICAgIHRocm93IG5ldyBPYmplY3RDb252ZXJzaW9uRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV2UgY291bGQgaGF2ZSB1c2VkIHRoZSBBcnJheWEuYXNMaXN0KCkgbWV0aG9kIGJ1dCB0aGF0IHJldHVybnMgYW4gKmltbXV0YWJsZSogbGlzdCAhISEhIQotICAgICAqCi0gICAgICogQHBhcmFtIGFycmF5Ci0gICAgICogQHJldHVybiBsaXN0Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBMaXN0IHRvTGlzdChPYmplY3RbXSBhcnJheSkgewotICAgICAgICBpZiAoYXJyYXkgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGxpc3QuYWRkKGFycmF5W2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBsaXN0OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGludFZhbHVlCi0gICAgICogQHBhcmFtIHZhbHVlCi0gICAgICogQHJldHVybiAwIGlmIGVxdWFsICwgKyB2YWx1ZSBpZiBncmVhdGVyIHRoYW4gLCAtIHZhbHVlIGlmIGxlc3MgdGhhbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgaW50IGNvbXBhcmUoaW50IGludFZhbHVlLCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIGludFZhbHVlIC0gSW50ZWdlci5wYXJzZUludCh2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGRvdWJsZVZhbHVlCi0gICAgICogQHBhcmFtIHZhbHVlCi0gICAgICogQHJldHVybiAwIGlmIGVxdWFsICwgKyB2YWx1ZSBpZiBncmVhdGVyIHRoYW4gLCAtIHZhbHVlIGlmIGxlc3MgdGhhbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZG91YmxlIGNvbXBhcmUoZG91YmxlIGRvdWJsZVZhbHVlLCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIGRvdWJsZVZhbHVlIC0gRG91YmxlLnBhcnNlRG91YmxlKHZhbHVlKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBmbG9hdFZhbHVlCi0gICAgICogQHBhcmFtIHZhbHVlCi0gICAgICogQHJldHVybiAwIGlmIGVxdWFsICwgKyB2YWx1ZSBpZiBncmVhdGVyIHRoYW4gLCAtIHZhbHVlIGlmIGxlc3MgdGhhbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmxvYXQgY29tcGFyZShmbG9hdCBmbG9hdFZhbHVlLCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIGZsb2F0VmFsdWUgLSBGbG9hdC5wYXJzZUZsb2F0KHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gbG9uZ1ZhbHVlCi0gICAgICogQHBhcmFtIHZhbHVlCi0gICAgICogQHJldHVybiAwIGlmIGVxdWFsICwgKyB2YWx1ZSBpZiBncmVhdGVyIHRoYW4gLCAtIHZhbHVlIGlmIGxlc3MgdGhhbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgbG9uZyBjb21wYXJlKGxvbmcgbG9uZ1ZhbHVlLCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIGxvbmdWYWx1ZSAtIExvbmcucGFyc2VMb25nKHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gc2hvcnRWYWx1ZQotICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqIEByZXR1cm4gMCBpZiBlcXVhbCAsICsgdmFsdWUgaWYgZ3JlYXRlciB0aGFuICwgLSB2YWx1ZSBpZiBsZXNzIHRoYW4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGludCBjb21wYXJlKHNob3J0IHNob3J0VmFsdWUsIFN0cmluZyB2YWx1ZSkgewotICAgICAgICByZXR1cm4gc2hvcnRWYWx1ZSAtIFNob3J0LnBhcnNlU2hvcnQodmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBieXRlVmxhdWUKLSAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKiBAcmV0dXJuIDAgaWYgZXF1YWwgLCArIHZhbHVlIGlmIGdyZWF0ZXIgdGhhbiAsIC0gdmFsdWUgaWYgbGVzcyB0aGFuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBpbnQgY29tcGFyZShieXRlIGJ5dGVWbGF1ZSwgU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBieXRlVmxhdWUgLSBCeXRlLnBhcnNlQnl0ZSh2YWx1ZSk7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gYmluQmlnSW50ZWdlcgotICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqIEByZXR1cm4gMCBpZiBlcXVhbCAsICsgdmFsdWUgaWYgZ3JlYXRlciB0aGFuICwgLSB2YWx1ZSBpZiBsZXNzIHRoYW4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGludCBjb21wYXJlKEJpZ0ludGVnZXIgYmluQmlnSW50ZWdlciwgU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBiaW5CaWdJbnRlZ2VyLmludFZhbHVlKCkgLSBJbnRlZ2VyLnBhcnNlSW50KHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gYmluQmlnRGVjaW1hbAotICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqIEByZXR1cm4gMCBpZiBlcXVhbCAsICsgdmFsdWUgaWYgZ3JlYXRlciB0aGFuICwgLSB2YWx1ZSBpZiBsZXNzIHRoYW4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGRvdWJsZSBjb21wYXJlKEJpZ0RlY2ltYWwgYmluQmlnRGVjaW1hbCwgU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBiaW5CaWdEZWNpbWFsLmRvdWJsZVZhbHVlKCkgLSBEb3VibGUucGFyc2VEb3VibGUodmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgbG9uZyBjb21wYXJlKER1cmF0aW9uIGR1cmF0aW9uLCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgRHVyYXRpb24gY29tcGFyZVZhbHVlID0gbmV3IER1cmF0aW9uKHZhbHVlKTsKLSAgICAgICAgcmV0dXJuIGR1cmF0aW9uLmNvbXBhcmUoY29tcGFyZVZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGxvbmcgY29tcGFyZShEYXRlIGRhdGUsIFN0cmluZyB2YWx1ZSkgewotICAgICAgICBEYXRlIG5ld0RhdGUgPSBjb252ZXJ0VG9EYXRlKHZhbHVlKTsKLSAgICAgICAgcmV0dXJuIGRhdGUuZ2V0VGltZSgpIC0gbmV3RGF0ZS5nZXRUaW1lKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBsb25nIGNvbXBhcmUoVGltZSB0aW1lLCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgVGltZSBuZXdUaW1lID0gbmV3IFRpbWUodmFsdWUpOwotICAgICAgICByZXR1cm4gdGltZS5nZXRBc0NhbGVuZGFyKCkuZ2V0VGltZUluTWlsbGlzKCkgLSBuZXdUaW1lLmdldEFzQ2FsZW5kYXIoKS5nZXRUaW1lSW5NaWxsaXMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGxvbmcgY29tcGFyZShDYWxlbmRhciBjYWxlbmRhciwgU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIENhbGVuZGFyIG5ld0NhbGVuZGFyID0gY29udmVydFRvRGF0ZVRpbWUodmFsdWUpOwotICAgICAgICByZXR1cm4gY2FsZW5kYXIuZ2V0VGltZUluTWlsbGlzKCkgLSBuZXdDYWxlbmRhci5nZXRUaW1lSW5NaWxsaXMoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyB0aGUgZ2l2ZW4gLmRhdGFoYW5kbGVyIHRvIGEgc3RyaW5nCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHN0cmluZwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZ0Zyb21EYXRhaGFuZGxlcihEYXRhSGFuZGxlciBkYXRhSGFuZGxlcikgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgSW5wdXRTdHJlYW0gaW5TdHJlYW07Ci0gICAgICAgICAgICBpZiAoZGF0YUhhbmRsZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiAiIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGluU3RyZWFtID0gZGF0YUhhbmRsZXIuZ2V0RGF0YVNvdXJjZSgpLmdldElucHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICBieXRlW10gZGF0YSA9IElPVXRpbHMuZ2V0U3RyZWFtQXNCeXRlQXJyYXkoaW5TdHJlYW0pOwotICAgICAgICAgICAgcmV0dXJuIEJhc2U2NC5lbmNvZGUoZGF0YSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEEgcmVmbGVjdGlvbiBiYXNlZCBtZXRob2QgdG8gZ2VuZXJhdGUgYW4gaW5zdGFuY2Ugb2YgYSBnaXZlbiBjbGFzcyBhbmQgcG9wdWxhdGUgaXQgd2l0aCBhCi0gICAgICogZ2l2ZW4gdmFsdWUKLSAgICAgKgotICAgICAqIEBwYXJhbSBjbGF6egotICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqIEByZXR1cm4gb2JqZWN0Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0T2JqZWN0Rm9yQ2xhc3MoQ2xhc3MgY2xhenosIFN0cmluZyB2YWx1ZSkgewotICAgICAgICAvL2ZpcnN0IHNlZSB3aGV0aGVyIHRoaXMgY2xhc3MgaGFzIGEgY29uc3RydWN0b3IgdGhhdCBjYW4KLSAgICAgICAgLy90YWtlIHRoZSBzdHJpbmcgYXMgYW4gYXJndW1lbnQuCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBDb25zdHJ1Y3RvciBzdHJpbmdDb25zdHJ1Y3RvciA9IGNsYXp6LmdldENvbnN0cnVjdG9yKG5ldyBDbGFzc1tdIHsgU3RyaW5nLmNsYXNzIH0pOwotICAgICAgICAgICAgcmV0dXJuIHN0cmluZ0NvbnN0cnVjdG9yLm5ld0luc3RhbmNlKG5ldyBPYmplY3RbXSB7IHZhbHVlIH0pOwotICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy9vb3BzIC0gbm8gc3VjaCBjb25zdHJ1Y3RvcnMgLSBjb250aW51ZSB3aXRoIHRoZQotICAgICAgICAgICAgLy9wYXJzZSBtZXRob2QKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBPYmplY3RDb252ZXJzaW9uRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICBBREJNZXNzYWdlcy5nZXRNZXNzYWdlKCJjb252ZXJ0ZXIuY2Fubm90R2VuZXJhdGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXp6LmdldE5hbWUoKSksIGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE1ldGhvZCBwYXJzZU1ldGhvZCA9IGNsYXp6LmdldE1ldGhvZCgicGFyc2UiLCBuZXcgQ2xhc3NbXSB7IFN0cmluZy5jbGFzcyB9KTsKLSAgICAgICAgICAgIE9iamVjdCBpbnN0YW5jZSA9IGNsYXp6Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICByZXR1cm4gcGFyc2VNZXRob2QuaW52b2tlKGluc3RhbmNlLCBuZXcgT2JqZWN0W10geyB2YWx1ZSB9KTsKLSAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBPYmplY3RDb252ZXJzaW9uRXhjZXB0aW9uKGUpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE9iamVjdENvbnZlcnNpb25FeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIEFEQk1lc3NhZ2VzLmdldE1lc3NhZ2UoImNvbnZlcnRlci5jYW5ub3RHZW5lcmF0ZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhenouZ2V0TmFtZSgpKSwKLSAgICAgICAgICAgICAgICAgICAgZSk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIC8qKiBBIHNpbXBsZSBleGNlcHRpb24gdGhhdCBpcyB0aHJvd24gd2hlbiB0aGUgY29udmVyc2lvbiBmYWlscyAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgT2JqZWN0Q29udmVyc2lvbkV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24gewotICAgICAgICBwdWJsaWMgT2JqZWN0Q29udmVyc2lvbkV4Y2VwdGlvbigpIHsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBPYmplY3RDb252ZXJzaW9uRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgICAgICBzdXBlcihtZXNzYWdlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBPYmplY3RDb252ZXJzaW9uRXhjZXB0aW9uKFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICAgICAgc3VwZXIoY2F1c2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdENvbnZlcnNpb25FeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICAgICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvLyBzZXJpYWxpemF0aW9uIG1ldGhvZHMgZm9yIHhzZCBhbnkgdHlwZQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXJpYWxpemVBbnlUeXBlKE9iamVjdCB2YWx1ZSwgWE1MU3RyZWFtV3JpdGVyIHhtbFN0cmVhbVdyaXRlcikgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotICAgICAgICAgICAgc2VyaWFsaXplQW55VHlwZSgic3RyaW5nIiwgdmFsdWUudG9TdHJpbmcoKSwgeG1sU3RyZWFtV3JpdGVyKTsKLSAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEludGVnZXIpIHsKLSAgICAgICAgICAgIHNlcmlhbGl6ZUFueVR5cGUoImludCIsIHZhbHVlLnRvU3RyaW5nKCksIHhtbFN0cmVhbVdyaXRlcik7Ci0gICAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBCb29sZWFuKSB7Ci0gICAgICAgICAgICBzZXJpYWxpemVBbnlUeXBlKCJib29sZWFuIiwgdmFsdWUudG9TdHJpbmcoKSwgeG1sU3RyZWFtV3JpdGVyKTsKLSAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFVSSSkgewotICAgICAgICAgICAgc2VyaWFsaXplQW55VHlwZSgiYW55VVJJIiwgdmFsdWUudG9TdHJpbmcoKSwgeG1sU3RyZWFtV3JpdGVyKTsKLSAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEJ5dGUpIHsKLSAgICAgICAgICAgIHNlcmlhbGl6ZUFueVR5cGUoImJ5dGUiLCB2YWx1ZS50b1N0cmluZygpLCB4bWxTdHJlYW1Xcml0ZXIpOwotICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkgewotICAgICAgICAgICAgc2VyaWFsaXplQW55VHlwZSgiZGF0ZSIsIGNvbnZlcnRUb1N0cmluZygoRGF0ZSkgdmFsdWUpLCB4bWxTdHJlYW1Xcml0ZXIpOwotICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgQ2FsZW5kYXIpIHsKLSAgICAgICAgICAgIHNlcmlhbGl6ZUFueVR5cGUoImRhdGVUaW1lIiwgY29udmVydFRvU3RyaW5nKChDYWxlbmRhcikgdmFsdWUpLCB4bWxTdHJlYW1Xcml0ZXIpOwotICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgVGltZSkgewotICAgICAgICAgICAgc2VyaWFsaXplQW55VHlwZSgidGltZSIsIGNvbnZlcnRUb1N0cmluZygoVGltZSkgdmFsdWUpLCB4bWxTdHJlYW1Xcml0ZXIpOwotICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgRmxvYXQpIHsKLSAgICAgICAgICAgIHNlcmlhbGl6ZUFueVR5cGUoImZsb2F0IiwgdmFsdWUudG9TdHJpbmcoKSwgeG1sU3RyZWFtV3JpdGVyKTsKLSAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIExvbmcpIHsKLSAgICAgICAgICAgIHNlcmlhbGl6ZUFueVR5cGUoImxvbmciLCB2YWx1ZS50b1N0cmluZygpLCB4bWxTdHJlYW1Xcml0ZXIpOwotICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgRG91YmxlKSB7Ci0gICAgICAgICAgICBzZXJpYWxpemVBbnlUeXBlKCJkb3VibGUiLCB2YWx1ZS50b1N0cmluZygpLCB4bWxTdHJlYW1Xcml0ZXIpOwotICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgU2hvcnQpIHsKLSAgICAgICAgICAgIHNlcmlhbGl6ZUFueVR5cGUoInNob3J0IiwgdmFsdWUudG9TdHJpbmcoKSwgeG1sU3RyZWFtV3JpdGVyKTsKLSAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEJpZ0RlY2ltYWwpIHsKLSAgICAgICAgICAgIHNlcmlhbGl6ZUFueVR5cGUoImRlY2ltYWwiLCB2YWx1ZS50b1N0cmluZygpLCB4bWxTdHJlYW1Xcml0ZXIpOwotICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0YUhhbmRsZXIpIHsKLSAgICAgICAgICAgIGFkZFR5cGVBdHRyaWJ1dGUoeG1sU3RyZWFtV3JpdGVyLCJiYXNlNjRCaW5hcnkiKTsKLSAgICAgICAgICAgIE1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciBtdG9tQXdhcmVYTUxTdHJlYW1Xcml0ZXIgPSAoTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyKSB4bWxTdHJlYW1Xcml0ZXI7Ci0gICAgICAgICAgICBtdG9tQXdhcmVYTUxTdHJlYW1Xcml0ZXIud3JpdGVEYXRhSGFuZGxlcigoRGF0YUhhbmRsZXIpdmFsdWUpOwotICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgUU5hbWUpIHsKLSAgICAgICAgICAgIFFOYW1lIHFOYW1lVmFsdWUgPSAoUU5hbWUpIHZhbHVlOwotICAgICAgICAgICAgU3RyaW5nIHByZWZpeCA9IHhtbFN0cmVhbVdyaXRlci5nZXRQcmVmaXgocU5hbWVWYWx1ZS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBwcmVmaXggPSBCZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICB4bWxTdHJlYW1Xcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBxTmFtZVZhbHVlLmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICAgICAgICAgICAgICB4bWxTdHJlYW1Xcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgcU5hbWVWYWx1ZS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTdHJpbmcgYXR0cmlidXRlVmFsdWUgPSBxTmFtZVZhbHVlLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgaWYgKCFwcmVmaXguZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gcHJlZml4ICsgIjoiICsgYXR0cmlidXRlVmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXJpYWxpemVBbnlUeXBlKCJRTmFtZSIsIGF0dHJpYnV0ZVZhbHVlLCB4bWxTdHJlYW1Xcml0ZXIpOwotICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgVW5zaWduZWRCeXRlKSB7Ci0gICAgICAgICAgICBzZXJpYWxpemVBbnlUeXBlKCJ1bnNpZ25lZEJ5dGUiLCBjb252ZXJ0VG9TdHJpbmcoKFVuc2lnbmVkQnl0ZSkgdmFsdWUpLCB4bWxTdHJlYW1Xcml0ZXIpOwotICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgVW5zaWduZWRMb25nKSB7Ci0gICAgICAgICAgICBzZXJpYWxpemVBbnlUeXBlKCJ1bnNpZ25lZExvbmciLCBjb252ZXJ0VG9TdHJpbmcoKFVuc2lnbmVkTG9uZykgdmFsdWUpLCB4bWxTdHJlYW1Xcml0ZXIpOwotICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgVW5zaWduZWRTaG9ydCkgewotICAgICAgICAgICAgc2VyaWFsaXplQW55VHlwZSgidW5zaWduZWRTaG9ydCIsIGNvbnZlcnRUb1N0cmluZygoVW5zaWduZWRTaG9ydCkgdmFsdWUpLCB4bWxTdHJlYW1Xcml0ZXIpOwotICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgVW5zaWduZWRJbnQpIHsKLSAgICAgICAgICAgIHNlcmlhbGl6ZUFueVR5cGUoInVuc2lnbmVkSW50IiwgY29udmVydFRvU3RyaW5nKChVbnNpZ25lZEludCkgdmFsdWUpLCB4bWxTdHJlYW1Xcml0ZXIpOwotICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgUG9zaXRpdmVJbnRlZ2VyKSB7Ci0gICAgICAgICAgICBzZXJpYWxpemVBbnlUeXBlKCJwb3NpdGl2ZUludGVnZXIiLCBjb252ZXJ0VG9TdHJpbmcoKFBvc2l0aXZlSW50ZWdlcikgdmFsdWUpLCB4bWxTdHJlYW1Xcml0ZXIpOwotICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgTmVnYXRpdmVJbnRlZ2VyKSB7Ci0gICAgICAgICAgICBzZXJpYWxpemVBbnlUeXBlKCJuZWdhdGl2ZUludGVnZXIiLCBjb252ZXJ0VG9TdHJpbmcoKE5lZ2F0aXZlSW50ZWdlcikgdmFsdWUpLCB4bWxTdHJlYW1Xcml0ZXIpOwotICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgTm9uTmVnYXRpdmVJbnRlZ2VyKSB7Ci0gICAgICAgICAgICBzZXJpYWxpemVBbnlUeXBlKCJub25OZWdhdGl2ZUludGVnZXIiLCBjb252ZXJ0VG9TdHJpbmcoKE5vbk5lZ2F0aXZlSW50ZWdlcikgdmFsdWUpLCB4bWxTdHJlYW1Xcml0ZXIpOwotICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgTm9uUG9zaXRpdmVJbnRlZ2VyKSB7Ci0gICAgICAgICAgICBzZXJpYWxpemVBbnlUeXBlKCJub25Qb3NpdGl2ZUludGVnZXIiLCBjb252ZXJ0VG9TdHJpbmcoKE5vblBvc2l0aXZlSW50ZWdlcikgdmFsdWUpLCB4bWxTdHJlYW1Xcml0ZXIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IFhNTFN0cmVhbUV4Y2VwdGlvbigiVW5rbm93IHR5cGUgY2FuIG5vdCBzZXJpYWxpemUiKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogdGhpcyBtZXRob2Qgd3JpdGVzIHRoZSB4c2k6dHlwZSBhdHRydWJ0ZSBhbmQgdGhlIHZhbHVlIHRvIHRoZSB4bWxzdHJlYW13cml0ZXIKLSAgICAgKiB0byBzZXJpYWxpemUgdGhlIGFueXR5cGUgb2JqZWN0Ci0gICAgICogQHBhcmFtIHR5cGUgIC0geHNkIHR5cGUgb2YgdGhlIGF0dHJpYnV0ZQotICAgICAqIEBwYXJhbSB2YWx1ZSAtIHN0cmluZyB2YWx1ZSBvZiB0aGUgb2JqZWN0Ci0gICAgICogQHBhcmFtIHhtbFN0cmVhbVdyaXRlcgotICAgICAqIEB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXJpYWxpemVBbnlUeXBlKFN0cmluZyB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTFN0cmVhbVdyaXRlciB4bWxTdHJlYW1Xcml0ZXIpCi0gICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICBhZGRUeXBlQXR0cmlidXRlKHhtbFN0cmVhbVdyaXRlciwgdHlwZSk7Ci0gICAgICAgIHhtbFN0cmVhbVdyaXRlci53cml0ZUNoYXJhY3RlcnModmFsdWUpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYWRkVHlwZUF0dHJpYnV0ZShYTUxTdHJlYW1Xcml0ZXIgeG1sU3RyZWFtV3JpdGVyLCBTdHJpbmcgdHlwZSkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBwcmVmaXggPSB4bWxTdHJlYW1Xcml0ZXIuZ2V0UHJlZml4KENvbnN0YW50cy5YU0lfTkFNRVNQQUNFKTsKLSAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBwcmVmaXggPSBCZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgICAgIHhtbFN0cmVhbVdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIENvbnN0YW50cy5YU0lfTkFNRVNQQUNFKTsKLSAgICAgICAgICAgIHhtbFN0cmVhbVdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBDb25zdGFudHMuWFNJX05BTUVTUEFDRSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcmVmaXggPSB4bWxTdHJlYW1Xcml0ZXIuZ2V0UHJlZml4KENvbnN0YW50cy5YU0RfTkFNRVNQQUNFKTsKLSAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBwcmVmaXggPSBCZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgICAgIHhtbFN0cmVhbVdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIENvbnN0YW50cy5YU0RfTkFNRVNQQUNFKTsKLSAgICAgICAgICAgIHhtbFN0cmVhbVdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBDb25zdGFudHMuWFNEX05BTUVTUEFDRSk7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgYXR0cmlidXRlVmFsdWUgPSBudWxsOwotICAgICAgICBpZiAocHJlZml4LmVxdWFscygiIikpIHsKLSAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gdHlwZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gcHJlZml4ICsgIjoiICsgdHlwZTsKLSAgICAgICAgfQotCi0gICAgICAgIHhtbFN0cmVhbVdyaXRlci53cml0ZUF0dHJpYnV0ZShDb25zdGFudHMuWFNJX05BTUVTUEFDRSwgInR5cGUiLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0QW55VHlwZU9iamVjdChYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MgZXh0ZW5zaW9uTWFwcGVyQ2xhc3MpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBPYmplY3QgcmV0dXJuT2JqZWN0ID0gbnVsbDsKLQotICAgICAgICAvLyBtYWtlIHN1cmUgcmVhZGVyIGlzIGF0IHRoZSBmaXJzdCBlbGVtZW50LgotICAgICAgICB3aGlsZSgheG1sU3RyZWFtUmVhZGVyLmlzU3RhcnRFbGVtZW50KCkpewotICAgICAgICAgICAgeG1sU3RyZWFtUmVhZGVyLm5leHQoKTsKLSAgICAgICAgfQotICAgICAgICAvLyBmaXJzdCBjaGVjayB3aGV0aGVyIHRoaXMgZWxlbWVudCBpcyBudWxsIG9yIG5vdAotICAgICAgICBTdHJpbmcgbmlsbGFibGVWYWx1ZSA9IHhtbFN0cmVhbVJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZShDb25zdGFudHMuWFNJX05BTUVTUEFDRSwgIm5pbCIpOwotICAgICAgICBpZiAoInRydWUiLmVxdWFscyhuaWxsYWJsZVZhbHVlKSB8fCAiMSIuZXF1YWxzKG5pbGxhYmxlVmFsdWUpKXsKLSAgICAgICAgICAgIHJldHVybk9iamVjdCA9IG51bGw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBTdHJpbmcgYXR0cmlidXRlVHlwZSA9IHhtbFN0cmVhbVJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZShDb25zdGFudHMuWFNJX05BTUVTUEFDRSwgInR5cGUiKTsKLSAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVUeXBlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgYXR0cmlidXRlVHlwZVByZWZpeCA9ICIiOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVUeXBlLmluZGV4T2YoIjoiKSA+IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVR5cGVQcmVmaXggPSBhdHRyaWJ1dGVUeXBlLnN1YnN0cmluZygwLGF0dHJpYnV0ZVR5cGUuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVHlwZSA9IGF0dHJpYnV0ZVR5cGUuc3Vic3RyaW5nKGF0dHJpYnV0ZVR5cGUuaW5kZXhPZigiOiIpICsgMSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIE5hbWVzcGFjZUNvbnRleHQgbmFtZXNwYWNlQ29udGV4dCA9IHhtbFN0cmVhbVJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZU5hbWVTcGFjZSA9IG5hbWVzcGFjZUNvbnRleHQuZ2V0TmFtZXNwYWNlVVJJKGF0dHJpYnV0ZVR5cGVQcmVmaXgpOwotCi0gICAgICAgICAgICAgICAgaWYgKENvbnN0YW50cy5YU0RfTkFNRVNQQUNFLmVxdWFscyhhdHRyaWJ1dGVOYW1lU3BhY2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgiYmFzZTY0QmluYXJ5Ii5lcXVhbHMoYXR0cmlidXRlVHlwZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbFN0cmVhbVJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5PYmplY3QgPSBnZXREYXRhSGFuZGxlck9iamVjdCh4bWxTdHJlYW1SZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBkbyB0aGlzIG90aGVyIHdpc2UgeG1sc3RyZWFtIGV2ZW50IHR5cGUgaXMgbm90IHNldC4KLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbFN0cmVhbVJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYXR0cmliVmFsdWUgPSB4bWxTdHJlYW1SZWFkZXIuZ2V0VGV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgeG1sU3RyZWFtUmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhdHRyaWJWYWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVR5cGUuZXF1YWxzKCJzdHJpbmciKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5PYmplY3QgPSBhdHRyaWJWYWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGF0dHJpYnV0ZVR5cGUuZXF1YWxzKCJpbnQiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5PYmplY3QgPSBuZXcgSW50ZWdlcihhdHRyaWJWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhdHRyaWJ1dGVUeXBlLmVxdWFscygiUU5hbWUiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZXNwYWNlUHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxvY2FsUGFydCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhdHRyaWJWYWx1ZS5pbmRleE9mKCI6IikgPiAtMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlUHJlZml4ID0gYXR0cmliVmFsdWUuc3Vic3RyaW5nKDAsIGF0dHJpYlZhbHVlLmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFBhcnQgPSBhdHRyaWJWYWx1ZS5zdWJzdHJpbmcoYXR0cmliVmFsdWUuaW5kZXhPZigiOiIpICsgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5PYmplY3QgPSBuZXcgUU5hbWUobmFtZXNwYWNlQ29udGV4dC5nZXROYW1lc3BhY2VVUkkobmFtZXNwYWNlUHJlZml4KSwgbG9jYWxQYXJ0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoImJvb2xlYW4iLmVxdWFscyhhdHRyaWJ1dGVUeXBlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5PYmplY3QgPSBuZXcgQm9vbGVhbihhdHRyaWJWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgiYW55VVJJIi5lcXVhbHMoYXR0cmlidXRlVHlwZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybk9iamVjdCA9IG5ldyBVUkkoYXR0cmliVmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChVUkkuTWFsZm9ybWVkVVJJRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBYTUxTdHJlYW1FeGNlcHRpb24oIkludmFsaWQgVVJJIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJkYXRlIi5lcXVhbHMoYXR0cmlidXRlVHlwZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gQ29udmVydGVyVXRpbC5jb252ZXJ0VG9EYXRlKGF0dHJpYlZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJkYXRlVGltZSIuZXF1YWxzKGF0dHJpYnV0ZVR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybk9iamVjdCA9IENvbnZlcnRlclV0aWwuY29udmVydFRvRGF0ZVRpbWUoYXR0cmliVmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoInRpbWUiLmVxdWFscyhhdHRyaWJ1dGVUeXBlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5PYmplY3QgPSBDb252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1RpbWUoYXR0cmliVmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoImJ5dGUiLmVxdWFscyhhdHRyaWJ1dGVUeXBlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5PYmplY3QgPSBuZXcgQnl0ZShhdHRyaWJWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgic2hvcnQiLmVxdWFscyhhdHRyaWJ1dGVUeXBlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5PYmplY3QgPSBuZXcgU2hvcnQoYXR0cmliVmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoImZsb2F0Ii5lcXVhbHMoYXR0cmlidXRlVHlwZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gbmV3IEZsb2F0KGF0dHJpYlZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJsb25nIi5lcXVhbHMoYXR0cmlidXRlVHlwZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gbmV3IExvbmcoYXR0cmliVmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoImRvdWJsZSIuZXF1YWxzKGF0dHJpYnV0ZVR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybk9iamVjdCA9IG5ldyBEb3VibGUoYXR0cmliVmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoImRlY2ltYWwiLmVxdWFscyhhdHRyaWJ1dGVUeXBlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5PYmplY3QgPSBuZXcgQmlnRGVjaW1hbChhdHRyaWJWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgidW5zaWduZWRMb25nIi5lcXVhbHMoYXR0cmlidXRlVHlwZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gbmV3IFVuc2lnbmVkTG9uZyhhdHRyaWJWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgidW5zaWduZWRJbnQiLmVxdWFscyhhdHRyaWJ1dGVUeXBlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5PYmplY3QgPSBuZXcgVW5zaWduZWRJbnQoYXR0cmliVmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoInVuc2lnbmVkU2hvcnQiLmVxdWFscyhhdHRyaWJ1dGVUeXBlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5PYmplY3QgPSBuZXcgVW5zaWduZWRTaG9ydChhdHRyaWJWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgidW5zaWduZWRCeXRlIi5lcXVhbHMoYXR0cmlidXRlVHlwZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gbmV3IFVuc2lnbmVkQnl0ZShhdHRyaWJWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgicG9zaXRpdmVJbnRlZ2VyIi5lcXVhbHMoYXR0cmlidXRlVHlwZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gbmV3IFBvc2l0aXZlSW50ZWdlcihhdHRyaWJWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgibmVnYXRpdmVJbnRlZ2VyIi5lcXVhbHMoYXR0cmlidXRlVHlwZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gbmV3IE5lZ2F0aXZlSW50ZWdlcihhdHRyaWJWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgibm9uTmVnYXRpdmVJbnRlZ2VyIi5lcXVhbHMoYXR0cmlidXRlVHlwZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gbmV3IE5vbk5lZ2F0aXZlSW50ZWdlcihhdHRyaWJWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgibm9uUG9zaXRpdmVJbnRlZ2VyIi5lcXVhbHMoYXR0cmlidXRlVHlwZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gbmV3IE5vblBvc2l0aXZlSW50ZWdlcihhdHRyaWJWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFEQkV4Y2VwdGlvbigiVW5rbm93biB0eXBlID09PiAiICsgYXR0cmlidXRlVHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQURCRXhjZXB0aW9uKCJBdHRyaWJ1dGUgdmFsdWUgaXMgbnVsbCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE1ldGhvZCBnZXRPYmplY3RNZXRob2QgPSBleHRlbnNpb25NYXBwZXJDbGFzcy5nZXRNZXRob2QoImdldFR5cGVPYmplY3QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXXtTdHJpbmcuY2xhc3MsIFN0cmluZy5jbGFzcywgWE1MU3RyZWFtUmVhZGVyLmNsYXNzfSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5PYmplY3QgPSBnZXRPYmplY3RNZXRob2QuaW52b2tlKG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXXthdHRyaWJ1dGVOYW1lU3BhY2UsIGF0dHJpYnV0ZVR5cGUsIHhtbFN0cmVhbVJlYWRlcn0pOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFEQkV4Y2VwdGlvbigiQ2FuIG5vdCBmaW5kIHRoZSBnZXRUeXBlT2JqZWN0IG1ldGhvZCBpbiB0aGUgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHRlbnNpb24gbWFwcGVyIGNsYXNzICIsIGUpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBREJFeGNlcHRpb24oIkNhbiBub3QgYWNjZXNzIHRoZSBnZXRUeXBlT2JqZWN0IG1ldGhvZCBpbiB0aGUgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHRlbnNpb24gbWFwcGVyIGNsYXNzICIsIGUpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBREJFeGNlcHRpb24oIkNhbiBub3QgaW52b2tlIHRoZSBnZXRUeXBlT2JqZWN0IG1ldGhvZCBpbiB0aGUgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHRlbnNpb24gbWFwcGVyIGNsYXNzICIsIGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFEQkV4Y2VwdGlvbigiQW55IHR5cGUgZWxlbWVudCB0eXBlIGhhcyBub3QgYmVlbiBnaXZlbiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXR1cm5PYmplY3Q7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0IGdldERhdGFIYW5kbGVyT2JqZWN0KFhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBPYmplY3QgZGF0YUhhbmRsZXIgPSBudWxsOwotICAgICAgICBpZiAoQm9vbGVhbi5UUlVFLmVxdWFscyhyZWFkZXIuZ2V0UHJvcGVydHkoT01Db25zdGFudHMuSVNfREFUQV9IQU5ETEVSU19BV0FSRSkpCi0gICAgICAgICAgICAgICAgJiYgQm9vbGVhbi5UUlVFLmVxdWFscyhyZWFkZXIuZ2V0UHJvcGVydHkoT01Db25zdGFudHMuSVNfQklOQVJZKSkpIHsKLSAgICAgICAgICAgIGRhdGFIYW5kbGVyID0gcmVhZGVyLmdldFByb3BlcnR5KG9yZy5hcGFjaGUuYXhpb20ub20uT01Db25zdGFudHMuREFUQV9IQU5ETEVSKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChyZWFkZXIuZ2V0RXZlbnRUeXBlKCkgPT0gWE1MU3RyZWFtQ29uc3RhbnRzLlNUQVJUX0VMRU1FTlQgJiYKLSAgICAgICAgICAgICAgICAgICAgcmVhZGVyLmdldE5hbWUoKS5lcXVhbHMobmV3IFFOYW1lKE1UT01Db25zdGFudHMuWE9QX05BTUVTUEFDRV9VUkksIE1UT01Db25zdGFudHMuWE9QX0lOQ0xVREUpKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBpZCA9IEVsZW1lbnRIZWxwZXIuZ2V0Q29udGVudElEKHJlYWRlciwgIlVURi04Iik7Ci0gICAgICAgICAgICAgICAgZGF0YUhhbmRsZXIgPSAoKE1UT01TdEFYU09BUE1vZGVsQnVpbGRlcikgKChPTVN0QVhXcmFwcGVyKSByZWFkZXIpLmdldEJ1aWxkZXIoKSkuZ2V0RGF0YUhhbmRsZXIoaWQpOwotICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHJlYWRlci5oYXNUZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgY29udGVudCA9IHJlYWRlci5nZXRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgZGF0YUhhbmRsZXIgPSBDb252ZXJ0ZXJVdGlsLmNvbnZlcnRUb0Jhc2U2NEJpbmFyeShjb250ZW50KTsKLQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBkYXRhSGFuZGxlcjsKLSAgICB9Ci0KLSAgICBzdGF0aWMgewotICAgICAgICBpc0N1c3RvbUNsYXNzUHJlc2VudCA9IChTeXN0ZW0uZ2V0UHJvcGVydHkoU1lTVEVNX1BST1BFUlRZX0FEQl9DT05WRVJURVJVVElMKSAhPSBudWxsKTsKLSAgICAgICAgaWYgKGlzQ3VzdG9tQ2xhc3NQcmVzZW50KXsKLSAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoU1lTVEVNX1BST1BFUlRZX0FEQl9DT05WRVJURVJVVElMKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgY3VzdG9tQ2xhc3MgPSBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIkNhbiBub3QgbG9hZCB0aGUgY29udmVydGVyIHV0aWwgY2xhc3MgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBjbGFzc05hbWUgKyAiIHVzaW5nIGRlZmF1bHQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsIGNsYXNzIik7Ci0gICAgICAgICAgICAgICAgaXNDdXN0b21DbGFzc1ByZXNlbnQgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3V0aWxzL011bHRpcmVmSGVscGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdXRpbHMvTXVsdGlyZWZIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM1NDVlOC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdXRpbHMvTXVsdGlyZWZIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5vZGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTVRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmJ1aWxkZXIuU3RBWE9NQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEJvZHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVtYXBwaW5nLlNpbXBsZVR5cGVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuT2JqZWN0U3VwcGxpZXI7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1wdWJsaWMgY2xhc3MgTXVsdGlyZWZIZWxwZXIgewotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09BUDEyX1JFRl9BVFRSID0gInJlZiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09BUDExX1JFRl9BVFRSID0gImhyZWYiOwotCi0gICAgcHJpdmF0ZSBib29sZWFuIGZpbGxlZFRhYmxlOwotCi0gICAgcHJpdmF0ZSBPTUVsZW1lbnQgcGFyZW50OwotCi0gICAgcHJpdmF0ZSBIYXNoTWFwIG9iamVjdG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgcHJpdmF0ZSBIYXNoTWFwIGVsZW1lbnRNYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgIHByaXZhdGUgSGFzaE1hcCBvbUVsZW1lbnRNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgcHVibGljIE11bHRpcmVmSGVscGVyKE9NRWxlbWVudCBwYXJlbnQpIHsKLSAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRPYmplY3QoU3RyaW5nIGlkKSB7Ci0gICAgICAgIHJldHVybiBvYmplY3RtYXAuZ2V0KGlkKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT01FbGVtZW50IGdldE9NRWxlbWVudChTdHJpbmcgaWQpIHsKLSAgICAgICAgcmV0dXJuIChPTUVsZW1lbnQpb21FbGVtZW50TWFwLmdldChpZCk7Ci0gICAgfQotCi0gICAgcHVibGljIE9NRWxlbWVudCBwcm9jZXNzT01FbGVtZW50UmVmKFN0cmluZyBpZCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIGlmICghZmlsbGVkVGFibGUpIHsKLSAgICAgICAgICAgIHJlYWRhbGxDaGlsZEVsZW1lbnRzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgT01FbGVtZW50IHZhbCA9IChPTUVsZW1lbnQpZWxlbWVudE1hcC5nZXQoaWQpOwotICAgICAgICBpZiAodmFsID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoIkludmFsaWQgcmVmZXJlbmNlIDoiICsgaWQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgT01FbGVtZW50IGVsZSA9IHByb2Nlc3NFbGVtZW50Zm9yUmVmcyh2YWwpOwotICAgICAgICAgICAgT01FbGVtZW50IGNsb25lZWxlID0gZWxlbWVudENsb25lKGVsZSk7Ci0gICAgICAgICAgICBvbUVsZW1lbnRNYXAucHV0KGlkLCBjbG9uZWVsZSk7Ci0gICAgICAgICAgICByZXR1cm4gY2xvbmVlbGU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgT01FbGVtZW50IHByb2Nlc3NFbGVtZW50Zm9yUmVmcyhPTUVsZW1lbnQgZWxlbW50cykgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIEl0ZXJhdG9yIGl0ciA9IGVsZW1udHMuZ2V0Q2hpbGRFbGVtZW50cygpOwotICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgewotICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IChPTUVsZW1lbnQpaXRyLm5leHQoKTsKLSAgICAgICAgICAgIE9NQXR0cmlidXRlIGF0dHJpID0gcHJvY2Vzc1JlZkF0dChvbUVsZW1lbnQpOwotICAgICAgICAgICAgaWYgKGF0dHJpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcmVmID0gZ2V0QXR0dmFsdWUoYXR0cmkpOwotICAgICAgICAgICAgICAgIE9NRWxlbWVudCB0ZW1wZWxlID0gZ2V0T01FbGVtZW50KHJlZik7Ci0gICAgICAgICAgICAgICAgaWYgKHRlbXBlbGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0ZW1wZWxlID0gcHJvY2Vzc09NRWxlbWVudFJlZihyZWYpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBPTUVsZW1lbnQgZWxlMiA9IGVsZW1lbnRDbG9uZSh0ZW1wZWxlKTsKLSAgICAgICAgICAgICAgICBJdGVyYXRvciBpdHJDaGlsZCA9IGVsZTIuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAoaXRyQ2hpbGQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIE9iamVjdCBvYmogPSBpdHJDaGlsZC5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBPTU5vZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9tRWxlbWVudC5hZGRDaGlsZCgoT01Ob2RlKW9iaik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVsZW1udHM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBPTUVsZW1lbnQgZWxlbWVudENsb25lKE9NRWxlbWVudCBlbGUpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTdEFYT01CdWlsZGVyKGVsZS5nZXRYTUxTdHJlYW1SZWFkZXIoKSkuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBwcm9jZXNzUmVmKENsYXNzIGphdmF0eXBlLCBTdHJpbmcgaWQsIE9iamVjdFN1cHBsaWVyIG9iamVjdFN1cHBsaWVyKQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIGlmICghZmlsbGVkVGFibGUpIHsKLSAgICAgICAgICAgIHJlYWRhbGxDaGlsZEVsZW1lbnRzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgT01FbGVtZW50IHZhbCA9IChPTUVsZW1lbnQpZWxlbWVudE1hcC5nZXQoaWQpOwotICAgICAgICBpZiAodmFsID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoIkludmFsaWQgcmVmZXJlbmNlIDoiICsgaWQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKFNpbXBsZVR5cGVNYXBwZXIuaXNTaW1wbGVUeXBlKGphdmF0eXBlKSkgewotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIGluIHRoaXMgY2FzZSBPTSBlbGVtZW50IGNhbiBub3QgY29udGFpbnMgbW9yZSBjaGlsZCwgdGhhdCBpcyBubyB3YXkgdG8gZ2V0Ci0gICAgICAgICAgICAgICAgICogdGhlIHZhbHVlIGFzIGFuIGV4cCAsCi0gICAgICAgICAgICAgICAgICogPHJlZmVybmNlIGlkPSIxMiI+Ci0gICAgICAgICAgICAgICAgICogICA8dmFsdWU+Zm9vPC92YWx1ZT4KLSAgICAgICAgICAgICAgICAgKiA8L3JlZmVybmNlPgotICAgICAgICAgICAgICAgICAqIHRoZSBhYm92ZSBvbmUgaXMgbm90IHZhbGlkICwgdGhhdCBzaG91bGQgYWx3YXlzIGJlIGxpa2UgYmVsb3cKLSAgICAgICAgICAgICAgICAgKiA8cmVmZXJuY2UgaWQ9IjEyIj5mb288L3JlZmVybmNlPgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIE9iamVjdCB2YWxPYmogPSBTaW1wbGVUeXBlTWFwcGVyLmdldFNpbXBsZVR5cGVPYmplY3QoamF2YXR5cGUsIHZhbCk7Ci0gICAgICAgICAgICAgICAgb2JqZWN0bWFwLnB1dChpZCwgdmFsT2JqKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdmFsT2JqOwotICAgICAgICAgICAgfSBlbHNlIGlmIChTaW1wbGVUeXBlTWFwcGVyLmlzQ29sbGVjdGlvbihqYXZhdHlwZSkpIHsKLSAgICAgICAgICAgICAgICBPYmplY3QgdmFsb2JqID0gU2ltcGxlVHlwZU1hcHBlci5nZXRBcnJheUxpc3QodmFsKTsKLSAgICAgICAgICAgICAgICBvYmplY3RtYXAucHV0KGlkLCB2YWxvYmopOwotICAgICAgICAgICAgICAgIHJldHVybiB2YWxvYmo7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIE9iamVjdCBvYmogPSBCZWFuVXRpbC5kZXNlcmlhbGl6ZShqYXZhdHlwZSwgdmFsLCB0aGlzLCBvYmplY3RTdXBwbGllcik7Ci0gICAgICAgICAgICAgICAgb2JqZWN0bWFwLnB1dChpZCwgb2JqKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gb2JqOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHJlYWRhbGxDaGlsZEVsZW1lbnRzKCkgewotICAgICAgICBJdGVyYXRvciBjaGlsZHMgPSBwYXJlbnQuZ2V0Q2hpbGRFbGVtZW50cygpOwotICAgICAgICB3aGlsZSAoY2hpbGRzLmhhc05leHQoKSkgewotICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IChPTUVsZW1lbnQpY2hpbGRzLm5leHQoKTsKLSAgICAgICAgICAgIE9NQXR0cmlidXRlIGlkID0gb21FbGVtZW50LmdldEF0dHJpYnV0ZShuZXcgUU5hbWUoImlkIikpOwotICAgICAgICAgICAgaWYgKGlkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBvbUVsZW1lbnQuYnVpbGQoKTsKLSAgICAgICAgICAgICAgICBlbGVtZW50TWFwLnB1dChpZC5nZXRBdHRyaWJ1dGVWYWx1ZSgpLCBvbUVsZW1lbnQuZGV0YWNoKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZpbGxlZFRhYmxlID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBdHR2YWx1ZShPTUF0dHJpYnV0ZSBvbWF0cmlidXRlKSB7Ci0gICAgICAgIFN0cmluZyByZWY7Ci0gICAgICAgIHJlZiA9IG9tYXRyaWJ1dGUuZ2V0QXR0cmlidXRlVmFsdWUoKTsKLSAgICAgICAgaWYgKHJlZiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAocmVmLmNoYXJBdCgwKSA9PSAnIycpIHsKLSAgICAgICAgICAgICAgICByZWYgPSByZWYuc3Vic3RyaW5nKDEpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZWY7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPTUF0dHJpYnV0ZSBwcm9jZXNzUmVmQXR0KE9NRWxlbWVudCBvbUVsZW1lbnQpIHsKLSAgICAgICAgT01BdHRyaWJ1dGUgb21hdHJpYnV0ZSA9IG9tRWxlbWVudC5nZXRBdHRyaWJ1dGUobmV3IFFOYW1lKFNPQVAxMV9SRUZfQVRUUikpOwotICAgICAgICBpZiAob21hdHJpYnV0ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBvbWF0cmlidXRlID0gb21FbGVtZW50LmdldEF0dHJpYnV0ZShuZXcgUU5hbWUoU09BUDEyX1JFRl9BVFRSKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG9tYXRyaWJ1dGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2xlYW4oKSB7Ci0gICAgICAgIGVsZW1lbnRNYXAuY2xlYXIoKTsKLSAgICAgICAgb2JqZWN0bWFwLmNsZWFyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogdGhpcyBtZXRob2QgaXMgdXNlZCB0byBwcm9jZXNzIHRoZSBocmVmIGF0dHJpYnV0ZXMgd2hpY2ggbWF5IGNvbWVzIHdpdGggdGhlIGluY29tbWluZyBzb2FwIG1lc2FhZ2UKLSAgICAgKiA8c29hcDpib2R5PgotICAgICAqIDxvcGVyYXRpb24+Ci0gICAgICogPGFyZzEgaHJlZj0iI29iajEiLz4KLSAgICAgKiA8L29wZXJhdGlvbj4KLSAgICAgKiA8bXVsdGlyZWYgaWQ9Im9iajEiPgotICAgICAqIDxuYW1lPnRoZSByZWFsIGFyZ3VtZW50PC9uYW1lPgotICAgICAqIDxjb2xvcj5ibHVlPC9jb2xvcj4KLSAgICAgKiA8L211bHRpcmVmPgotICAgICAqIDwvc29hcDpib2R5PgotICAgICAqIGhlcmUgd2UgYXNzdW1lIGZpcnN0IGNoaWxkIG9mIHRoZSBzb2FwIGJvZHkgaGFzIHRoZSBtYWluIG9iamVjdCBzdHJ1Y3R1cmUgYW5kIG90aGVycyBjb250YWluIHRoZQotICAgICAqIG11bHRpcmVmIHBhcnRzLgotICAgICAqIFNvYXAgc3BlYyBzYXlzIHRoYXQgdGhvc2UgbXVsdGlyZWYgcGFydHMgbXVzdCBiZSB0b3AgbGV2ZWwgZWxlbWVudHMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc29hcEVudmVsb3BlCi0gICAgICovCi0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcHJvY2Vzc0hyZWZBdHRyaWJ1dGVzKFNPQVBFbnZlbG9wZSBzb2FwRW52ZWxvcGUpCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgLy8gZmlyc3QgcG9wdWxhdGUgdGhlIG11bHRpcmVmIHBhcnRzIHRvIGEgaGFzaCB0YWJsZS4KLSAgICAgICAgU09BUEJvZHkgc29hcEJvZHkgPSBzb2FwRW52ZWxvcGUuZ2V0Qm9keSgpOwotICAgICAgICAvLyBmaXJzdCBidWlsZCB0aGUgd2hvbGUgdHJlZQotICAgICAgICBzb2FwQm9keS5idWlsZCgpOwotICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gbnVsbDsKLSAgICAgICAgT01BdHRyaWJ1dGUgaWRBdHRyaWJ1dGUgPSBudWxsOwotICAgICAgICBNYXAgaWRBbmRPTUVsZW1lbnRNYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzb2FwQm9keS5nZXRDaGlsZEVsZW1lbnRzKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgb21FbGVtZW50ID0gKE9NRWxlbWVudCkgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAvLyB0aGUgYXR0cmlidXRlIGlkIGlzIGFuIHVucXVhbGlmaWVkIGF0dHJpYnV0ZQotICAgICAgICAgICAgaWRBdHRyaWJ1dGUgPSBvbUVsZW1lbnQuZ2V0QXR0cmlidXRlKG5ldyBRTmFtZShudWxsLCAiaWQiKSk7Ci0gICAgICAgICAgICBpZiAoaWRBdHRyaWJ1dGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIGZvciB0aGUgZmlyc3QgZWxlbWVudCB0aGVyZSBtYXkgbm90IGhhdmUgYW4gaWQKLSAgICAgICAgICAgICAgICBpZEFuZE9NRWxlbWVudE1hcC5wdXQoaWRBdHRyaWJ1dGUuZ2V0QXR0cmlidXRlVmFsdWUoKSwgb21FbGVtZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIHN0YXJ0IHByb2Nlc3NpbmcgZnJvbSB0aGUgZmlyc3QgY2hpbGQKLSAgICAgICAgcHJvY2Vzc0hyZWZBdHRyaWJ1dGVzKGlkQW5kT01FbGVtZW50TWFwLCBzb2FwQm9keS5nZXRGaXJzdEVsZW1lbnQoKSwgT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCkpOwotCi0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHByb2Nlc3NIcmVmQXR0cmlidXRlcyhNYXAgaWRBbmRPTUVsZW1lbnRNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NRWxlbWVudCBlbGVtZW50VG9Qcm9jZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTUZhY3Rvcnkgb21GYWN0b3J5KQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0KLSAgICAgICAgLy8gZmlyc3QgY2hlY2sgd2hldGhlciB0aGlzIGVsZW1lbnQgaGFzIGFuIGhyZWYgdmFsdWUuCi0gICAgICAgIC8vIGhyZWYgaXMgYWxzbyBhbiB1bnF1YWxpZmVkIGF0dHJpYnV0ZQotICAgICAgICBPTUF0dHJpYnV0ZSBocmVmQXR0cmlidXRlID0gZWxlbWVudFRvUHJvY2Vzcy5nZXRBdHRyaWJ1dGUobmV3IFFOYW1lKG51bGwsICJocmVmIikpOwotICAgICAgICBpZiAoaHJlZkF0dHJpYnV0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBpLmUgdGhpcyBoYXMgYW4gaHJlZiBhdHRyaWJ1dGUKLSAgICAgICAgICAgIFN0cmluZyBocmVmQXR0cmlidXRlVmFsdWUgPSBocmVmQXR0cmlidXRlLmdldEF0dHJpYnV0ZVZhbHVlKCk7Ci0gICAgICAgICAgICBpZiAoIWhyZWZBdHRyaWJ1dGVWYWx1ZS5zdGFydHNXaXRoKCIjIikpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJJbiB2YWxpZCBocmVmID09PiAiICsgaHJlZkF0dHJpYnV0ZVZhbHVlICsgIiBkb2VzIG5vdCBzdGFydHMgd2l0aCAjIik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIE9NRWxlbWVudCByZWZlcmVkT01FbGVtZW50ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChPTUVsZW1lbnQpIGlkQW5kT01FbGVtZW50TWFwLmdldChocmVmQXR0cmlidXRlVmFsdWUuc3Vic3RyaW5nKDEpKTsKLSAgICAgICAgICAgICAgICBpZiAocmVmZXJlZE9NRWxlbWVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoIkluIHZhbGlkIGhyZWYgPT0+ICIgKyBocmVmQXR0cmlidXRlVmFsdWUgKyAiIGNhbiBub3QgZmluZCIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGUgbWF0Y2hpbmcgZWxlbWVudCIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIG5vdyB3ZSBoYXZlIHRvIHJlbW92ZSB0aGUgaHJlZkF0dHJpYnV0ZSBhbmQgYWRkIGFsbCB0aGUgY2hpbGQgZWxlbWVudHMgdG8gdGhlCi0gICAgICAgICAgICAgICAgICAgIC8vIGVsZW1lbnQgYmVpbmcgcHJvY2Nlc2VkCi0gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRUb1Byb2Nlc3MucmVtb3ZlQXR0cmlidXRlKGhyZWZBdHRyaWJ1dGUpOwotICAgICAgICAgICAgICAgICAgICBPTUVsZW1lbnQgY2xvbmVkUmVmZXJlbmNlRWxlbWVudCA9IGdldENsb25lZE9NRWxlbWVudChyZWZlcmVkT01FbGVtZW50LCBvbUZhY3RvcnkpOwotICAgICAgICAgICAgICAgICAgICBPTU5vZGUgb21Ob2RlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gY2xvbmVkUmVmZXJlbmNlRWxlbWVudC5nZXRDaGlsZHJlbigpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9tTm9kZSA9IChPTU5vZGUpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFRvUHJvY2Vzcy5hZGRDaGlsZChvbU5vZGUuZGV0YWNoKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gYWRkIGF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgICAgICAgT01BdHRyaWJ1dGUgb21BdHRyaWJ1dGUgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjbG9uZWRSZWZlcmVuY2VFbGVtZW50LmdldEFsbEF0dHJpYnV0ZXMoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvbUF0dHJpYnV0ZSA9IChPTUF0dHJpYnV0ZSkgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBkbyBub3QgaGF2ZSB0byBwb3B1bGF0ZSB0aGUgaWQgYXR0cmlidXRlCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW9tQXR0cmlidXRlLmdldExvY2FsTmFtZSgpLmVxdWFscygiaWQiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRUb1Byb2Nlc3MuYWRkQXR0cmlidXRlKG9tQXR0cmlidXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNhbGwgcmVjdXJzaXZlbHkgdG8gcHJvY2VzIGFsbCBlbGVtZW50cwotICAgICAgICBPTUVsZW1lbnQgY2hpbGRPTUVsZW1lbnQgPSBudWxsOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50VG9Qcm9jZXNzLmdldENoaWxkRWxlbWVudHMoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBjaGlsZE9NRWxlbWVudCA9IChPTUVsZW1lbnQpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgcHJvY2Vzc0hyZWZBdHRyaWJ1dGVzKGlkQW5kT01FbGVtZW50TWFwLCBjaGlsZE9NRWxlbWVudCwgb21GYWN0b3J5KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIHJldHVybnMgYW4gY2xvbmVkIG9tIGVsZW1lbnQgZm9yIHRoaXMgT01FbGVtZW50Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gb21FbGVtZW50Ci0gICAgICogQHJldHVybiBjbG9uZWQgb21FbGVtZW50Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBPTUVsZW1lbnQgZ2V0Q2xvbmVkT01FbGVtZW50KE9NRWxlbWVudCBvbUVsZW1lbnQsIE9NRmFjdG9yeSBvbUZhY3RvcnkpIHRocm93cyBBeGlzRmF1bHQgewotCi0gICAgICAgIE9NRWxlbWVudCBuZXdPTUVsZW1lbnQgPSBvbUZhY3RvcnkuY3JlYXRlT01FbGVtZW50KG9tRWxlbWVudC5nZXRRTmFtZSgpKTsKLQotICAgICAgICAvLyBjb3B5aW5nIGF0dHJpYnV0ZXMKLSAgICAgICAgT01BdHRyaWJ1dGUgb21BdHRyaWJ1dGUgPSBudWxsOwotICAgICAgICBPTUF0dHJpYnV0ZSBuZXdPTUF0dHJpYnV0ZSA9IG51bGw7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IG9tRWxlbWVudC5nZXRBbGxBdHRyaWJ1dGVzKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgb21BdHRyaWJ1dGUgPSAoT01BdHRyaWJ1dGUpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgaWYgKCFvbUF0dHJpYnV0ZS5nZXRBdHRyaWJ1dGVWYWx1ZSgpLmVxdWFscygiaWQiKSkgewotICAgICAgICAgICAgICAgIG5ld09NQXR0cmlidXRlID0gb21GYWN0b3J5LmNyZWF0ZU9NQXR0cmlidXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgb21BdHRyaWJ1dGUuZ2V0TG9jYWxOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBvbUF0dHJpYnV0ZS5nZXROYW1lc3BhY2UoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG9tQXR0cmlidXRlLmdldEF0dHJpYnV0ZVZhbHVlKCkpOwotICAgICAgICAgICAgICAgIG5ld09NRWxlbWVudC5hZGRBdHRyaWJ1dGUobmV3T01BdHRyaWJ1dGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIE9NTm9kZSBvbU5vZGUgPSBudWxsOwotICAgICAgICBPTVRleHQgb21UZXh0ID0gbnVsbDsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gb21FbGVtZW50LmdldENoaWxkcmVuKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgb21Ob2RlID0gKE9NTm9kZSkgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAob21Ob2RlIGluc3RhbmNlb2YgT01UZXh0KSB7Ci0gICAgICAgICAgICAgICAgb21UZXh0ID0gKE9NVGV4dCkgb21Ob2RlOwotICAgICAgICAgICAgICAgIG5ld09NRWxlbWVudC5hZGRDaGlsZChvbUZhY3RvcnkuY3JlYXRlT01UZXh0KG9tVGV4dC5nZXRUZXh0KCkpKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAob21Ob2RlIGluc3RhbmNlb2YgT01FbGVtZW50KSB7Ci0gICAgICAgICAgICAgICAgbmV3T01FbGVtZW50LmFkZENoaWxkKGdldENsb25lZE9NRWxlbWVudCgoT01FbGVtZW50KSBvbU5vZGUsIG9tRmFjdG9yeSkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJVbmtub3duIGNoaWxkIGVsZW1lbnQgdHlwZSA9PT4gIiArIG9tTm9kZS5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ld09NRWxlbWVudDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy91dGlscy9OYW1lZFN0YXhPTUJ1aWxkZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy91dGlscy9OYW1lZFN0YXhPTUJ1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc4NjJmYS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdXRpbHMvTmFtZWRTdGF4T01CdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuYnVpbGRlci5TdEFYT01CdWlsZGVyOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUNvbnN0YW50czsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKLQotcHVibGljIGNsYXNzIE5hbWVkU3RheE9NQnVpbGRlciB7Ci0KLSAgICAvL3dyYXAgYSBTdEFYT01CdWlsZGVyCi0gICAgcHJpdmF0ZSBTdEFYT01CdWlsZGVyIGJ1aWxkZXI7Ci0gICAgcHJpdmF0ZSBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyOwotICAgIHByaXZhdGUgUU5hbWUgbmFtZVRvTWF0Y2g7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0geG1sU3RyZWFtUmVhZGVyCi0gICAgICogQHBhcmFtIG5hbWVUb01hdGNoCi0gICAgICovCi0gICAgcHVibGljIE5hbWVkU3RheE9NQnVpbGRlcihYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyLCBRTmFtZSBuYW1lVG9NYXRjaCkgewotICAgICAgICByZWFkZXIgPSB4bWxTdHJlYW1SZWFkZXI7Ci0gICAgICAgIGJ1aWxkZXIgPSBuZXcgU3RBWE9NQnVpbGRlcih4bWxTdHJlYW1SZWFkZXIpOwotICAgICAgICB0aGlzLm5hbWVUb01hdGNoID0gbmFtZVRvTWF0Y2g7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoKLSAgICAgKi8KLSAgICBwdWJsaWMgT01FbGVtZW50IGdldE9NRWxlbWVudCgpIHsKLSAgICAgICAgLy9mb3JjZSB0byBidWlsZCB3aXRoaW4gdGhlIGdpdmVuIFFOYW1lCi0gICAgICAgIGJvb2xlYW4gZG9uZSA9IGZhbHNlOwotICAgICAgICBpbnQgZGVwdGggPSAwOwotICAgICAgICB3aGlsZSAoIWRvbmUpIHsKLSAgICAgICAgICAgIGlmIChyZWFkZXIuZ2V0RXZlbnRUeXBlKCkgPT0gWE1MU3RyZWFtQ29uc3RhbnRzLkVORF9FTEVNRU5UKSB7Ci0gICAgICAgICAgICAgICAgZGVwdGgtLTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAocmVhZGVyLmdldEV2ZW50VHlwZSgpID09IFhNTFN0cmVhbUNvbnN0YW50cy5TVEFSVF9FTEVNRU5UKSB7Ci0gICAgICAgICAgICAgICAgZGVwdGgrKzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGRlcHRoID09IDAgJiYgcmVhZGVyLmdldEV2ZW50VHlwZSgpID09IFhNTFN0cmVhbUNvbnN0YW50cy5FTkRfRUxFTUVOVCAmJgotICAgICAgICAgICAgICAgICAgICBuYW1lVG9NYXRjaC5lcXVhbHMocmVhZGVyLmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICBkb25lID0gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5uZXh0KCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBidWlsZGVyLmdldERvY3VtZW50RWxlbWVudCgpOwotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdXRpbHMvU2ltcGxlQXJyYXlSZWFkZXJTdGF0ZU1hY2hpbmUuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy91dGlscy9TaW1wbGVBcnJheVJlYWRlclN0YXRlTWFjaGluZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjY0YjgwLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy91dGlscy9TaW1wbGVBcnJheVJlYWRlclN0YXRlTWFjaGluZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlsczsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Db25zdGFudHM7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqIEEgc3RhdGUgbWFjaGluZSB0aGF0IHJlYWRzIGFycmF5cyB3aXRoIHNpbXBsZSBjb250ZW50LiByZXR1cm5zIGEgc3RyaW5nIGFycmF5ICovCi1wdWJsaWMgY2xhc3MgU2ltcGxlQXJyYXlSZWFkZXJTdGF0ZU1hY2hpbmUgaW1wbGVtZW50cyBTdGF0ZXMsIENvbnN0YW50cyB7Ci0KLSAgICBwcml2YXRlIFFOYW1lIGVsZW1lbnROYW1lVG9UZXN0ID0gbnVsbDsKLSAgICBwcml2YXRlIGludCBjdXJyZW50U3RhdGUgPSBJTklUX1NUQVRFOwotICAgIHByaXZhdGUgYm9vbGVhbiBuaWxsYWJsZSA9IGZhbHNlOwotCi0gICAgcHJpdmF0ZSBib29sZWFuIGNhbmJlQWJzZW50ID0gZmFsc2U7Ci0KLSAgICBwcml2YXRlIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgIC8qKiBAcmV0dXJuIGFuIGFycmF5IG9mIHN0cmluZ3MgKi8KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VGV4dEFycmF5KCkgewotICAgICAgICByZXR1cm4gKFN0cmluZ1tdKWxpc3QudG9BcnJheShuZXcgU3RyaW5nW2xpc3Quc2l6ZSgpXSk7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCBzZXROaWxsYWJsZSgpIHsKLSAgICAgICAgbmlsbGFibGUgPSB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQ2FuYmVBYnNlbnQoKSB7Ci0gICAgICAgIHJldHVybiBjYW5iZUFic2VudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDYW5iZUFic2VudChib29sZWFuIGNhbmJlQWJzZW50KSB7Ci0gICAgICAgIHRoaXMuY2FuYmVBYnNlbnQgPSBjYW5iZUFic2VudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXNldHMgdGhlIHN0YXRlIG1hY2hpbmUuIE9uY2UgdGhlIHJlc2V0IGlzIGNhbGxlZCB0aGUgc3RhdGUgbWFjaGluZSBpcyBnb29kIGVub3VnaCBmb3IgYQotICAgICAqIGZyZXNoIHJ1bgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgewotICAgICAgICBlbGVtZW50TmFtZVRvVGVzdCA9IG51bGw7Ci0gICAgICAgIGN1cnJlbnRTdGF0ZSA9IElOSVRfU1RBVEU7Ci0gICAgICAgIG5pbGxhYmxlID0gZmFsc2U7Ci0gICAgICAgIGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RWxlbWVudE5hbWVUb1Rlc3QoUU5hbWUgZWxlbWVudE5hbWVUb1Rlc3QpIHsKLSAgICAgICAgdGhpcy5lbGVtZW50TmFtZVRvVGVzdCA9IGVsZW1lbnROYW1lVG9UZXN0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHB1YmxpYyByZWFkIG1ldGhvZCAtIHJlYWRzIGEgZ2l2ZW4gcmVhZGVyIHRvIGV4dHJhY3QgdGhlIHRleHQgdmFsdWUKLSAgICAgKgotICAgICAqIEBwYXJhbSByZWFkZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZWFkKFhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIHVwZGF0ZVN0YXRlKHJlYWRlcik7Ci0KLSAgICAgICAgICAgIC8vdGVzdCBmb3IgdGhlIG5pbGxhYmxlIGF0dHJpYnV0ZQotICAgICAgICAgICAgaWYgKGN1cnJlbnRTdGF0ZSA9PSBTVEFSVF9FTEVNRU5UX0ZPVU5EX1NUQVRFICYmCi0gICAgICAgICAgICAgICAgICAgIG5pbGxhYmxlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKFRSVUUuZXF1YWxzKHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZShYU0lfTkFNRVNQQUNFLCBOSUwpKSkgewotICAgICAgICAgICAgICAgICAgICBsaXN0LmFkZChudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgLy9mb3JjZSB0aGUgc3RhdGUgdG8gYmUgbnVsbCBmb3VuZAotICAgICAgICAgICAgICAgICAgICBjdXJyZW50U3RhdGUgPSBOVUxMRURfU1RBVEU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoY3VycmVudFN0YXRlID09IFRFWFRfRk9VTkRfU1RBVEUpIHsKLSAgICAgICAgICAgICAgICAvL3JlYWQgdGhlIHRleHQgdmFsdWUgYW5kIHN0b3JlIGl0IGluIHRoZSBsaXN0Ci0gICAgICAgICAgICAgICAgbGlzdC5hZGQocmVhZGVyLmdldFRleHQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvL2luY3JlbWVudCB0aGUgcGFyc2VyIG9ubHkgaWYgdGhlICBzdGF0ZSBpcwotICAgICAgICAgICAgLy9ub3QgZmluaXNoZWQKLSAgICAgICAgICAgIGlmIChjdXJyZW50U3RhdGUgIT0gRklOSVNIRURfU1RBVEUKLSAgICAgICAgICAgICAgICAgICAgJiYgY3VycmVudFN0YXRlICE9IElMTEVHQUxfU1RBVEUpIHsKLSAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gd2hpbGUgKGN1cnJlbnRTdGF0ZSAhPSBGSU5JU0hFRF9TVEFURQotICAgICAgICAgICAgICAgICYmIGN1cnJlbnRTdGF0ZSAhPSBJTExFR0FMX1NUQVRFKTsKLQotICAgICAgICBpZiAoY3VycmVudFN0YXRlID09IElMTEVHQUxfU1RBVEUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJJbGxlZ2FsIHN0YXRlISIpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVTdGF0ZShYTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgaW50IGV2ZW50ID0gcmVhZGVyLmdldEV2ZW50VHlwZSgpOwotCi0gICAgICAgIHN3aXRjaCAoY3VycmVudFN0YXRlKSB7Ci0KLSAgICAgICAgICAgIGNhc2UgSU5JVF9TVEFURToKLSAgICAgICAgICAgICAgICBpZiAoZXZlbnQgPT0gWE1MU3RyZWFtQ29uc3RhbnRzLlNUQVJUX0RPQ1VNRU5UKSB7Ci0gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTdGF0ZSA9IFNUQVJURURfU1RBVEU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudCA9PSBYTUxTdHJlYW1Db25zdGFudHMuU1RBUlRfRUxFTUVOVCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudE5hbWVUb1Rlc3QuZXF1YWxzKHJlYWRlci5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50U3RhdGUgPSBTVEFSVF9FTEVNRU5UX0ZPVU5EX1NUQVRFOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLy93ZSBmb3VuZCBhIHN0YXJ0IGVsZW1lbnQgdGhhdCBkb2VzIG5vdCBoYXZlCi0gICAgICAgICAgICAgICAgICAgICAgICAvL3RoZSBuYW1lIG9mIHRoZSBlbGVtZW50Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTdGF0ZSA9IGNhbmJlQWJzZW50ID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklOSVNIRURfU1RBVEUgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVEFSVEVEX1NUQVRFOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudCA9PSBYTUxTdHJlYW1Db25zdGFudHMuRU5EX0VMRU1FTlQpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gYW4gZW5kIGVsZW1lbnQgaXMgZm91bmQgYXQgdGhlIGluaXQgc3RhdGUKLSAgICAgICAgICAgICAgICAgICAgLy8gd2Ugc2hvdWxkIGJyZWFrIHRoZSBwcm9jZXNzIGhlcmUgPwotICAgICAgICAgICAgICAgICAgICBpZiAoIWVsZW1lbnROYW1lVG9UZXN0LmVxdWFscyhyZWFkZXIuZ2V0TmFtZSgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFN0YXRlID0gRklOSVNIRURfU1RBVEU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgU1RBUlRFRF9TVEFURToKLSAgICAgICAgICAgICAgICBpZiAoZXZlbnQgPT0gWE1MU3RyZWFtQ29uc3RhbnRzLkVORF9FTEVNRU5UKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50TmFtZVRvVGVzdC5lcXVhbHMocmVhZGVyLmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTdGF0ZSA9IElMTEVHQUxfU1RBVEU7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50U3RhdGUgPSBGSU5JU0hFRF9TVEFURTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQgPT0gWE1MU3RyZWFtQ29uc3RhbnRzLlNUQVJUX0VMRU1FTlQpIHsKLSAgICAgICAgICAgICAgICAgICAgUU5hbWUgbmFtZSA9IHJlYWRlci5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50TmFtZVRvVGVzdC5lcXVhbHMobmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTdGF0ZSA9IFNUQVJUX0VMRU1FTlRfRk9VTkRfU1RBVEU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgU1RBUlRfRUxFTUVOVF9GT1VORF9TVEFURToKLSAgICAgICAgICAgICAgICBpZiAoZXZlbnQgPT0gWE1MU3RyZWFtQ29uc3RhbnRzLkNIQVJBQ1RFUlMpIHsKLSAgICAgICAgICAgICAgICAgICAgY3VycmVudFN0YXRlID0gVEVYVF9GT1VORF9TVEFURTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgVEVYVF9GT1VORF9TVEFURToKLSAgICAgICAgICAgICAgICBpZiAoZXZlbnQgPT0gWE1MU3RyZWFtQ29uc3RhbnRzLkVORF9FTEVNRU5UKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50TmFtZVRvVGVzdC5lcXVhbHMocmVhZGVyLmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTdGF0ZSA9IEVORF9FTEVNRU5UX0ZPVU5EX1NUQVRFOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFN0YXRlID0gSUxMRUdBTF9TVEFURTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQgPT0gWE1MU3RyZWFtQ29uc3RhbnRzLkNIQVJBQ1RFUlMpIHsKLSAgICAgICAgICAgICAgICAgICAgLy9hbm90aGVyIGNoYXIgZXZlbnQgLQotICAgICAgICAgICAgICAgICAgICAvL3NvIGFwcGVuZCBpdCB0byB0aGUgY3VycmVudCB0ZXh0Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBOVUxMRURfU1RBVEU6Ci0gICAgICAgICAgICAgICAgLy9yZWFkIHVwdG8gdGhlIGVuZCBhbmQgc2V0IHRoZSBzdGF0ZSB0byBFTkRfRUxFTUVOVF9GT1VORF9TVEFURQotICAgICAgICAgICAgICAgIHdoaWxlIChldmVudCAhPSBYTUxTdHJlYW1Db25zdGFudHMuRU5EX0VMRU1FTlQpIHsKLSAgICAgICAgICAgICAgICAgICAgZXZlbnQgPSByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjdXJyZW50U3RhdGUgPSBFTkRfRUxFTUVOVF9GT1VORF9TVEFURTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgRU5EX0VMRU1FTlRfRk9VTkRfU1RBVEU6Ci0gICAgICAgICAgICAgICAgaWYgKGV2ZW50ID09IFhNTFN0cmVhbUNvbnN0YW50cy5TVEFSVF9FTEVNRU5UKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vcmVzdGFydCB0aGUgcGFyc2luZwotICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudE5hbWVUb1Rlc3QuZXF1YWxzKHJlYWRlci5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50U3RhdGUgPSBTVEFSVF9FTEVNRU5UX0ZPVU5EX1NUQVRFOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFN0YXRlID0gRklOSVNIRURfU1RBVEU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy9hbm90aGVyIGVuZCBlbGVtZW50IGZvdW5kIGFmdGVyIGVuZC1lbGVtZW50Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudCA9PSBYTUxTdHJlYW1Db25zdGFudHMuRU5EX0VMRU1FTlQpIHsKLSAgICAgICAgICAgICAgICAgICAgY3VycmVudFN0YXRlID0gRklOSVNIRURfU1RBVEU7Ci0gICAgICAgICAgICAgICAgICAgIC8vZW5kICBkb2N1bWVudCBmb3VuZAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0KLSAgICAgICAgICAgICAgICAvL2NoYXJhY3RlcnMgZm91bmQgLSBpZiB0aGlzIGlzIGEgY2hhcmFjdGVycyBldmVudCB0aGF0IHdhcyBpbiB0aGUgY29ycmVjdCBwbGFjZSB0aGVuCi0gICAgICAgICAgICAgICAgLy9pdCB3b3VsZCBoYXZlIGJlZW4gaGFuZGxlZCBhbHJlYWR5LiB3ZSBuZWVkIHRvIGNoZWNrIHdoZXRoZXIgdGhpcyBpcyBhIGlnbm9yYWJsZQotICAgICAgICAgICAgICAgIC8vd2hpdGVzcGFjZSBhbmQgaWYgbm90IHB1c2ggdGhlIHN0YXRlIG1hY2hpbmUgdG8gYSBpbGxlZ2FsIHN0YXRlLgotICAgICAgICAgICAgICAgIGlmIChldmVudCA9PSBYTUxTdHJlYW1Db25zdGFudHMuQ0hBUkFDVEVSUykgewotICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmdldFRleHQoKS50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy90aGUgdGV4dCBpcyBlbXB0eSAtIGRvbid0IGNoYW5nZSB0aGUgc3RhdGUKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vd2UgZG8gTk9UIGhhbmRsZSBtaXhlZCBjb250ZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50U3RhdGUgPSBJTExFR0FMX1NUQVRFOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBjdXJyZW50U3RhdGUgPSBJTExFR0FMX1NUQVRFOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLSAgICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3V0aWxzL1NpbXBsZUVsZW1lbnRSZWFkZXJTdGF0ZU1hY2hpbmUuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy91dGlscy9TaW1wbGVFbGVtZW50UmVhZGVyU3RhdGVNYWNoaW5lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlOGQzOGUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3V0aWxzL1NpbXBsZUVsZW1lbnRSZWFkZXJTdGF0ZU1hY2hpbmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHM7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtQ29uc3RhbnRzOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotCi0vKioKLSAqIEEgc3RhdGUgbWFjaGluZSB0byByZWFkIGVsZW1lbnRzIHdpdGggc2ltcGxlIGNvbnRlbnQuIFJldHVybnMgdGhlIHRleHQgb2YgdGhlIGVsZW1lbnQgYW5kIHRoZQotICogc3RyZWFtIHJlYWRlciB3aWxsIGJlIG9uZSBldmVudCBiZXlvbmQgdGhlIGVuZCBlbGVtZW50IGF0IHJldHVybgotICovCi1wdWJsaWMgY2xhc3MgU2ltcGxlRWxlbWVudFJlYWRlclN0YXRlTWFjaGluZSBpbXBsZW1lbnRzIFN0YXRlcywgQ29uc3RhbnRzIHsKLQotCi0gICAgcHJpdmF0ZSBRTmFtZSBlbGVtZW50TmFtZVRvVGVzdCA9IG51bGw7Ci0gICAgcHJpdmF0ZSBpbnQgY3VycmVudFN0YXRlID0gSU5JVF9TVEFURTsKLSAgICBwcml2YXRlIGJvb2xlYW4gbmlsbGFibGUgPSBmYWxzZTsKLSAgICBwcml2YXRlIFN0cmluZyB0ZXh0ID0gIiI7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgZXJyb3JNZXNzYWdlID0gIiI7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGVsZW1lbnRTa2lwcGVkID0gZmFsc2U7Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VsZW1lbnRTa2lwcGVkKCkgewotICAgICAgICByZXR1cm4gZWxlbWVudFNraXBwZWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0gICAgICAgIHJldHVybiB0ZXh0OwotICAgIH0KLQotICAgIC8qKiBzZXRzIHRoZSBuaWxsYWJsZSBmbGFnICovCi0gICAgcHVibGljIHZvaWQgc2V0TmlsbGFibGUoKSB7Ci0gICAgICAgIG5pbGxhYmxlID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB0aGUgUW5hbWUgb2YgdGhlIGVsZW1lbnQgdG8gYmUgdGVzdGVkCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZWxlbWVudE5hbWVUb1Rlc3QKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRFbGVtZW50TmFtZVRvVGVzdChRTmFtZSBlbGVtZW50TmFtZVRvVGVzdCkgewotICAgICAgICB0aGlzLmVsZW1lbnROYW1lVG9UZXN0ID0gZWxlbWVudE5hbWVUb1Rlc3Q7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXNldHMgdGhlIHN0YXRlIG1hY2hpbmUuIE9uY2UgdGhlIHJlc2V0IGlzIGNhbGxlZCB0aGUgc3RhdGUgbWFjaGluZSBpcyBnb29kIGVub3VnaCBmb3IgYQotICAgICAqIGZyZXNoIHJ1bgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgewotICAgICAgICBlbGVtZW50TmFtZVRvVGVzdCA9IG51bGw7Ci0gICAgICAgIGN1cnJlbnRTdGF0ZSA9IElOSVRfU1RBVEU7Ci0gICAgICAgIG5pbGxhYmxlID0gZmFsc2U7Ci0gICAgICAgIHRleHQgPSAiIjsKLSAgICAgICAgZXJyb3JNZXNzYWdlID0gIiI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogcHVibGljIHJlYWQgbWV0aG9kIC0gcmVhZHMgYSBnaXZlbiByZWFkZXIgdG8gZXh0cmFjdCB0aGUgdGV4dCB2YWx1ZQotICAgICAqCi0gICAgICogQHBhcmFtIHJlYWRlcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlYWQoWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgZG8gewotICAgICAgICAgICAgdXBkYXRlU3RhdGUocmVhZGVyKTsKLQotICAgICAgICAgICAgLy90ZXN0IGZvciB0aGUgbmlsbGFibGUgYXR0cmlidXRlCi0gICAgICAgICAgICBpZiAoY3VycmVudFN0YXRlID09IFNUQVJUX0VMRU1FTlRfRk9VTkRfU1RBVEUgJiYKLSAgICAgICAgICAgICAgICAgICAgbmlsbGFibGUpIHsKLSAgICAgICAgICAgICAgICBpZiAoVFJVRS5lcXVhbHMocmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKFhTSV9OQU1FU1BBQ0UsIE5JTCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRleHQgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAvL2ZvcmNlIHRoZSBzdGF0ZSB0byBiZSBudWxsIGZvdW5kCi0gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTdGF0ZSA9IE5VTExFRF9TVEFURTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChjdXJyZW50U3RhdGUgPT0gVEVYVF9GT1VORF9TVEFURSkgewotICAgICAgICAgICAgICAgIC8vcmVhZCB0aGUgdGV4dCB2YWx1ZSBhbmQgc3RvcmUgaXQKLSAgICAgICAgICAgICAgICB0ZXh0ID0gcmVhZGVyLmdldFRleHQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChjdXJyZW50U3RhdGUgIT0gRklOSVNIRURfU1RBVEUKLSAgICAgICAgICAgICAgICAgICAgJiYgY3VycmVudFN0YXRlICE9IElMTEVHQUxfU1RBVEUpIHsKLSAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gd2hpbGUgKGN1cnJlbnRTdGF0ZSAhPSBGSU5JU0hFRF9TVEFURQotICAgICAgICAgICAgICAgICYmIGN1cnJlbnRTdGF0ZSAhPSBJTExFR0FMX1NUQVRFKTsKLQotICAgICAgICBpZiAoY3VycmVudFN0YXRlID09IElMTEVHQUxfU1RBVEUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJJbGxlZ2FsIHN0YXRlISIgKyBlcnJvck1lc3NhZ2UpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFVwZGF0ZXMgdGhlIHN0YXRlIGRlcGVuZGluZyBvbiB0aGUgcGFyc2VyCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVhZGVyCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVN0YXRlKFhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBpbnQgZXZlbnQgPSByZWFkZXIuZ2V0RXZlbnRUeXBlKCk7Ci0KLQotICAgICAgICBzd2l0Y2ggKGN1cnJlbnRTdGF0ZSkgewotICAgICAgICAgICAgY2FzZSBJTklUX1NUQVRFOgotICAgICAgICAgICAgICAgIGlmIChldmVudCA9PSBYTUxTdHJlYW1Db25zdGFudHMuU1RBUlRfRE9DVU1FTlQpIHsKLSAgICAgICAgICAgICAgICAgICAgY3VycmVudFN0YXRlID0gU1RBUlRFRF9TVEFURTsKLSAgICAgICAgICAgICAgICAgICAgLy9zdGFydCBlbGVtZW50IGZvdW5kIGF0IGluaXQKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50ID09IFhNTFN0cmVhbUNvbnN0YW50cy5TVEFSVF9FTEVNRU5UKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50TmFtZVRvVGVzdC5lcXVhbHMocmVhZGVyLmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTdGF0ZSA9IFNUQVJUX0VMRU1FTlRfRk9VTkRfU1RBVEU7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50U3RhdGUgPSBTVEFSVEVEX1NUQVRFOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudCA9PSBYTUxTdHJlYW1Db25zdGFudHMuRU5EX0VMRU1FTlQpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gYW4gZW5kIGVsZW1lbnQgaXMgZm91bmQgYXQgdGhlIGluaXQgc3RhdGUKLSAgICAgICAgICAgICAgICAgICAgLy8gd2Ugc2hvdWxkIGJyZWFrIHRoZSBwcm9jZXNzIGhlcmUgPwotICAgICAgICAgICAgICAgICAgICBjdXJyZW50U3RhdGUgPSBGSU5JU0hFRF9TVEFURTsKLSAgICAgICAgICAgICAgICAgICAgZWxlbWVudFNraXBwZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTVEFSVEVEX1NUQVRFOgotICAgICAgICAgICAgICAgIGlmIChldmVudCA9PSBYTUxTdHJlYW1Db25zdGFudHMuU1RBUlRfRUxFTUVOVCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudE5hbWVUb1Rlc3QuZXF1YWxzKHJlYWRlci5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50U3RhdGUgPSBTVEFSVF9FTEVNRU5UX0ZPVU5EX1NUQVRFOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFNUQVJUX0VMRU1FTlRfRk9VTkRfU1RBVEU6Ci0gICAgICAgICAgICAgICAgaWYgKGV2ZW50ID09IFhNTFN0cmVhbUNvbnN0YW50cy5DSEFSQUNURVJTKSB7Ci0gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTdGF0ZSA9IFRFWFRfRk9VTkRfU1RBVEU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudCA9PSBYTUxTdHJlYW1Db25zdGFudHMuRU5EX0VMRU1FTlQpIHsKLSAgICAgICAgICAgICAgICAgICAgLy9mb3JjZSB0aGUgdGV4dCB0byBiZSBlbXB0eSEKLSAgICAgICAgICAgICAgICAgICAgdGV4dCA9ICIiOwotICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudE5hbWVUb1Rlc3QuZXF1YWxzKHJlYWRlci5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50U3RhdGUgPSBFTkRfRUxFTUVOVF9GT1VORF9TVEFURTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTdGF0ZSA9IElMTEVHQUxfU1RBVEU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSAiV3JvbmcgZWxlbWVudCBuYW1lICIgKyByZWFkZXIuZ2V0TmFtZSgpOyAgLy90b2RvIEkxOG4gdGhpcwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFRFWFRfRk9VTkRfU1RBVEU6Ci0gICAgICAgICAgICAgICAgaWYgKGV2ZW50ID09IFhNTFN0cmVhbUNvbnN0YW50cy5FTkRfRUxFTUVOVCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudE5hbWVUb1Rlc3QuZXF1YWxzKHJlYWRlci5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50U3RhdGUgPSBFTkRfRUxFTUVOVF9GT1VORF9TVEFURTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTdGF0ZSA9IElMTEVHQUxfU1RBVEU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL3NldCB0aGUgZXJyb3IgbWVzc2FnZQotICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gIldyb25nIGVsZW1lbnQgbmFtZSAiICsgcmVhZGVyLmdldE5hbWUoKTsgIC8vdG9kbyBJMThuIHRoaXMKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQgPT0gWE1MU3RyZWFtQ29uc3RhbnRzLkNIQVJBQ1RFUlMpIHsKLSAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHRleHQgKyByZWFkZXIuZ2V0VGV4dCgpOyAgLy9hcHBlbmQgdGhlIHRleHQKLSAgICAgICAgICAgICAgICAgICAgLy9kbyBub3QgY2hhbmdlIHRoZSBzdGF0ZQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBFTkRfRUxFTUVOVF9GT1VORF9TVEFURToKLSAgICAgICAgICAgICAgICBjdXJyZW50U3RhdGUgPSBGSU5JU0hFRF9TVEFURTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIC8vdGhlIGVsZW1lbnQgd2FzIGZvdW5kIHRvIGJlIG51bGwgYW5kIHRoaXMgc3RhdGUgd2FzIGZvcmNlZC4KLSAgICAgICAgICAgICAgICAvL3dlIGFyZSBzdXJlIGhlcmUgdGhhdCB0aGUgcGFyc2VyIHdhcyBhdCB0aGUKLSAgICAgICAgICAgICAgICAvL1NUQVJUX0VMRU1FTlRfRk9VTkRfU1RBVEUgYmVmb3JlCi0gICAgICAgICAgICAgICAgLy9iZWluZyBmb3JjZWQuIEhlbmNlIHdlIG5lZWQgdG8gYWR2YW5jZSB0aGUgcGFyc2VyIHVwdG8gdGhlCi0gICAgICAgICAgICAgICAgLy8gZW5kIGVsZW1lbnQgYW5kIHNldCB0aGUgc3RhdGUgdG8gYmUgZW5kIGVsZW1lbnQgZm91bmQKLSAgICAgICAgICAgIGNhc2UgTlVMTEVEX1NUQVRFOgotICAgICAgICAgICAgICAgIHdoaWxlIChldmVudCAhPSBYTUxTdHJlYW1Db25zdGFudHMuRU5EX0VMRU1FTlQpIHsKLSAgICAgICAgICAgICAgICAgICAgZXZlbnQgPSByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjdXJyZW50U3RhdGUgPSBFTkRfRUxFTUVOVF9GT1VORF9TVEFURTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBpZiAoZXZlbnQgPT0gWE1MU3RyZWFtQ29uc3RhbnRzLkNIQVJBQ1RFUlMpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5nZXRUZXh0KCkudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vdGhlIHRleHQgaXMgZW1wdHkgLSBkb24ndCBjaGFuZ2UgdGhlIHN0YXRlCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL3dlIGRvIE5PVCBoYW5kbGUgbWl4ZWQgY29udGVudAotICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFN0YXRlID0gSUxMRUdBTF9TVEFURTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9ICJNaXhlZCBDb250ZW50ICIgKyByZWFkZXIuZ2V0VGV4dCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgY3VycmVudFN0YXRlID0gSUxMRUdBTF9TVEFURTsKLSAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gIkN1cnJlbnQgc3RhdGUgaXMgIiArIGN1cnJlbnRTdGF0ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdXRpbHMvU3RhdGVzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdXRpbHMvU3RhdGVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjNWIyMTkuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3V0aWxzL1N0YXRlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzOwotCi1wdWJsaWMgaW50ZXJmYWNlIFN0YXRlcyB7Ci0KLSAgICBzdGF0aWMgaW50IElOSVRfU1RBVEUgPSAtMTsKLSAgICBzdGF0aWMgaW50IFNUQVJURURfU1RBVEUgPSAwOwotICAgIHN0YXRpYyBpbnQgU1RBUlRfRUxFTUVOVF9GT1VORF9TVEFURSA9IDE7Ci0gICAgc3RhdGljIGludCBURVhUX0ZPVU5EX1NUQVRFID0gMjsKLSAgICBzdGF0aWMgaW50IEVORF9FTEVNRU5UX0ZPVU5EX1NUQVRFID0gMzsKLSAgICBzdGF0aWMgaW50IEZJTklTSEVEX1NUQVRFID0gNDsKLSAgICBzdGF0aWMgaW50IElMTEVHQUxfU1RBVEUgPSA1OwotICAgIHN0YXRpYyBpbnQgQ09OVEVOVF9GT1VORF9TVEFURSA9IDY7Ci0gICAgc3RhdGljIGludCBOVUxMRURfU1RBVEUgPSA3OwotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdXRpbHMvcmVhZGVyL0FEQkRhdGFIYW5kbGVyU3RyZWFtUmVhZGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdXRpbHMvcmVhZGVyL0FEQkRhdGFIYW5kbGVyU3RyZWFtUmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwNGFiZDQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3V0aWxzL3JlYWRlci9BREJEYXRhSGFuZGxlclN0cmVhbVJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzg2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWw7Ci0KLWltcG9ydCBqYXZheC5hY3RpdmF0aW9uLkRhdGFIYW5kbGVyOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuTmFtZXNwYWNlQ29udGV4dDsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uTG9jYXRpb247Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBBREJEYXRhSGFuZGxlclN0cmVhbVJlYWRlciBpbXBsZW1lbnRzIEFEQlhNTFN0cmVhbVJlYWRlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVJUX0VMRU1FTlRfU1RBVEUgPSAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBURVhUX1NUQVRFID0gMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRU5EX0VMRU1FTlRfU1RBVEUgPSAyOwotCi0gICAgcHJpdmF0ZSBBREJOYW1lc3BhY2VDb250ZXh0IG5hbWVzcGFjZUNvbnRleHQgPQotICAgICAgICAgICAgbmV3IEFEQk5hbWVzcGFjZUNvbnRleHQoKTsKLQotICAgIHByaXZhdGUgUU5hbWUgbmFtZTsKLSAgICBwcml2YXRlIERhdGFIYW5kbGVyIHZhbHVlOwotCi0gICAgcHJpdmF0ZSBpbnQgc3RhdGUgPSBTVEFSVF9FTEVNRU5UX1NUQVRFOwotICAgIC8vaW5pdGlhdGUgYXQgdGhlIHN0YXJ0IGVsZW1lbnQgc3RhdGUKLQotICAgIC8va2VlcHMgdHJhY2sgd2hldGhlciB0aGUgbmFtZXNwYWNlIGlzIGRlY2xhcmVkCi0gICAgLy9mYWxzZSBieSBkZWZhdWx0Ci0gICAgcHJpdmF0ZSBib29sZWFuIG5zRGVjbGFyZWQgPSBmYWxzZTsKLQotICAgIHB1YmxpYyBBREJEYXRhSGFuZGxlclN0cmVhbVJlYWRlcihRTmFtZSBuYW1lLCBEYXRhSGFuZGxlciB2YWx1ZSkgewotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgY29udmVydGVkVGV4dCA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIHJpZ2h0IHByb3BlcnRpZXMgZm9yIHRoZSBvcHRpbWl6YXRpb24KLSAgICAgKgotICAgICAqIEBwYXJhbSBwcm9wS2V5Ci0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wS2V5KSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKE9QVElNSVpBVElPTl9FTkFCTEVELmVxdWFscyhwcm9wS2V5KSkgewotICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4uVFJVRTsKLSAgICAgICAgfQotICAgICAgICBpZiAoc3RhdGUgPT0gVEVYVF9TVEFURSkgewotICAgICAgICAgICAgaWYgKElTX0JJTkFSWS5lcXVhbHMocHJvcEtleSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbi5UUlVFOwotICAgICAgICAgICAgfSBlbHNlIGlmIChEQVRBX0hBTkRMRVIuZXF1YWxzKHByb3BLZXkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotCi0gICAgfQotCi0gICAgcHVibGljIGludCBuZXh0KCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vbm8gbmVlZCB0byBoYW5kbGUgbnVsbCBoZXJlLiBpdCBzaG91bGQgaGF2ZSBiZWVuIGhhbmRsZWQKLSAgICAgICAgLy9hbHJlYWR5Ci0gICAgICAgIHN3aXRjaCAoc3RhdGUpIHsKLSAgICAgICAgICAgIGNhc2UgU1RBUlRfRUxFTUVOVF9TVEFURToKLSAgICAgICAgICAgICAgICBzdGF0ZSA9IFRFWFRfU1RBVEU7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIENIQVJBQ1RFUlM7Ci0gICAgICAgICAgICBjYXNlIEVORF9FTEVNRU5UX1NUQVRFOgotICAgICAgICAgICAgICAgIC8vb29wcywgbm90IHN1cHBvc2VkIHRvIGhhcHBlbiEKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWE1MU3RyZWFtRXhjZXB0aW9uKCJlbmQgYWxyZWFkeSByZWFjaGVkISIpOwotICAgICAgICAgICAgY2FzZSBURVhUX1NUQVRFOgotICAgICAgICAgICAgICAgIHN0YXRlID0gRU5EX0VMRU1FTlRfU1RBVEU7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVORF9FTEVNRU5UOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWE1MU3RyZWFtRXhjZXB0aW9uKCJ1bmtub3duIGV2ZW50IHR5cGUhIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZXF1aXJlKGludCBpLCBTdHJpbmcgc3RyaW5nLCBTdHJpbmcgc3RyaW5nMSkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vbm90IGltcGxlbWVudGVkCi0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRFbGVtZW50VGV4dCgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBpZiAoc3RhdGUgPT0gU1RBUlRfRUxFTUVOVCkgewotICAgICAgICAgICAgLy9tb3ZlIHRvIHRoZSBlbmQgc3RhdGUgYW5kIHJldHVybiB0aGUgdmFsdWUKLSAgICAgICAgICAgIHN0YXRlID0gRU5EX0VMRU1FTlRfU1RBVEU7Ci0gICAgICAgICAgICBpZiAoY29udmVydGVkVGV4dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY29udmVydGVkVGV4dCA9IENvbnZlcnRlclV0aWwuZ2V0U3RyaW5nRnJvbURhdGFoYW5kbGVyKHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZWRUZXh0OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IFhNTFN0cmVhbUV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IG5leHRUYWcoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIDA7Ly90b2RvCi0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gKHN0YXRlICE9IEVORF9FTEVNRU5UX1NUQVRFKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAvL0RvIG5vdGhpbmcgLSB3ZSd2ZSBub3RoaW5nIHRvIGZyZWUgaGVyZQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKFN0cmluZyBwcmVmaXgpIHsKLSAgICAgICAgcmV0dXJuIG5hbWVzcGFjZUNvbnRleHQuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNTdGFydEVsZW1lbnQoKSB7Ci0gICAgICAgIHJldHVybiAoc3RhdGUgPT0gU1RBUlRfRUxFTUVOVF9TVEFURSk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbmRFbGVtZW50KCkgewotICAgICAgICByZXR1cm4gKHN0YXRlID09IEVORF9FTEVNRU5UX1NUQVRFKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0NoYXJhY3RlcnMoKSB7Ci0gICAgICAgIHJldHVybiAoc3RhdGUgPT0gVEVYVF9TVEFURSk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNXaGl0ZVNwYWNlKCkgewotICAgICAgICByZXR1cm4gZmFsc2U7ICAvL25vIHdoaXRlc3BhY2VzIGhlcmUKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZVZhbHVlKFN0cmluZyBzdHJpbmcsIFN0cmluZyBzdHJpbmcxKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0QXR0cmlidXRlQ291bnQoKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIHB1YmxpYyBRTmFtZSBnZXRBdHRyaWJ1dGVOYW1lKGludCBpKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlTmFtZXNwYWNlKGludCBpKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlTG9jYWxOYW1lKGludCBpKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlUHJlZml4KGludCBpKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlVHlwZShpbnQgaSkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZVZhbHVlKGludCBpKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQXR0cmlidXRlU3BlY2lmaWVkKGludCBpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsgLy9ubyBhdHRyaWJzIGhlcmUKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldE5hbWVzcGFjZUNvdW50KCkgewotICAgICAgICByZXR1cm4gKG5zRGVjbGFyZWQpID8gMSA6IDA7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VQcmVmaXgoaW50IGkpIHsKLSAgICAgICAgcmV0dXJuIChuc0RlY2xhcmVkICYmIGkgPT0gMCkgPyBuYW1lLmdldFByZWZpeCgpIDogbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVVSSShpbnQgaSkgewotICAgICAgICByZXR1cm4gKG5zRGVjbGFyZWQgJiYgaSA9PSAwKSA/IG5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkgOiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBOYW1lc3BhY2VDb250ZXh0IGdldE5hbWVzcGFjZUNvbnRleHQoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLm5hbWVzcGFjZUNvbnRleHQ7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRFdmVudFR5cGUoKSB7Ci0gICAgICAgIHN3aXRjaCAoc3RhdGUpIHsKLSAgICAgICAgICAgIGNhc2UgU1RBUlRfRUxFTUVOVF9TVEFURToKLSAgICAgICAgICAgICAgICByZXR1cm4gU1RBUlRfRUxFTUVOVDsKLSAgICAgICAgICAgIGNhc2UgRU5EX0VMRU1FTlRfU1RBVEU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVORF9FTEVNRU5UOwotICAgICAgICAgICAgY2FzZSBURVhUX1NUQVRFOgotICAgICAgICAgICAgICAgIHJldHVybiBDSEFSQUNURVJTOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICAvL3dlJ3ZlIG5vIGlkZWEgd2hhdCB0aGlzIGlzISEhISEKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotICAgICAgICBpZiAoc3RhdGUgPT0gVEVYVF9TVEFURSkgewotICAgICAgICAgICAgaWYgKGNvbnZlcnRlZFRleHQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNvbnZlcnRlZFRleHQgPQotICAgICAgICAgICAgICAgICAgICAgICAgQ29udmVydGVyVXRpbC5nZXRTdHJpbmdGcm9tRGF0YWhhbmRsZXIodmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlZFRleHQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgY2hhcltdIGdldFRleHRDaGFyYWN0ZXJzKCkgewotICAgICAgICBpZiAoc3RhdGUgPT0gVEVYVF9TVEFURSkgewotICAgICAgICAgICAgaWYgKGNvbnZlcnRlZFRleHQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNvbnZlcnRlZFRleHQgPQotICAgICAgICAgICAgICAgICAgICAgICAgQ29udmVydGVyVXRpbC5nZXRTdHJpbmdGcm9tRGF0YWhhbmRsZXIodmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlZFRleHQudG9DaGFyQXJyYXkoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0VGV4dENoYXJhY3RlcnMoaW50IGksIGNoYXJbXSBjaGFycywgaW50IGkxLCBpbnQgaTIpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAvL25vdCBpbXBsZW1lbnRlZAotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldFRleHRTdGFydCgpIHsKLSAgICAgICAgaWYgKHN0YXRlID09IFRFWFRfU1RBVEUpIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRUZXh0TGVuZ3RoKCkgewotICAgICAgICBpZiAoc3RhdGUgPT0gVEVYVF9TVEFURSkgewotICAgICAgICAgICAgaWYgKGNvbnZlcnRlZFRleHQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNvbnZlcnRlZFRleHQgPQotICAgICAgICAgICAgICAgICAgICAgICAgQ29udmVydGVyVXRpbC5nZXRTdHJpbmdGcm9tRGF0YWhhbmRsZXIodmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlZFRleHQubGVuZ3RoKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RW5jb2RpbmcoKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGhhc1RleHQoKSB7Ci0gICAgICAgIHJldHVybiAoc3RhdGUgPT0gVEVYVF9TVEFURSk7Ci0gICAgfQotCi0gICAgcHVibGljIExvY2F0aW9uIGdldExvY2F0aW9uKCkgewotICAgICAgICByZXR1cm4gbmV3IExvY2F0aW9uKCkgewotICAgICAgICAgICAgcHVibGljIGludCBnZXRMaW5lTnVtYmVyKCkgewotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgaW50IGdldENvbHVtbk51bWJlcigpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIGludCBnZXRDaGFyYWN0ZXJPZmZzZXQoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHVibGljSWQoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3lzdGVtSWQoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgfQotCi0gICAgcHVibGljIFFOYW1lIGdldE5hbWUoKSB7Ci0gICAgICAgIGlmIChzdGF0ZSAhPSBURVhUX1NUQVRFKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmFtZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRMb2NhbE5hbWUoKSB7Ci0gICAgICAgIGlmIChzdGF0ZSAhPSBURVhUX1NUQVRFKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaGFzTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIChzdGF0ZSAhPSBURVhUX1NUQVRFKTsKLQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKCkgewotICAgICAgICBpZiAoc3RhdGUgIT0gVEVYVF9TVEFURSkgewotICAgICAgICAgICAgcmV0dXJuIG5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQcmVmaXgoKSB7Ci0gICAgICAgIGlmIChzdGF0ZSAhPSBURVhUX1NUQVRFKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmFtZS5nZXRQcmVmaXgoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRWZXJzaW9uKCkgewotICAgICAgICByZXR1cm4gbnVsbDsgIC8vdG9kbyAxLjAgPwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzU3RhbmRhbG9uZSgpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHN0YW5kYWxvbmVTZXQoKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENoYXJhY3RlckVuY29kaW5nU2NoZW1lKCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBJVGFyZ2V0KCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBJRGF0YSgpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNEb25lKCkgewotICAgICAgICByZXR1cm4gKHN0YXRlID09IEVORF9FTEVNRU5UX1NUQVRFKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGROYW1lc3BhY2VDb250ZXh0KE5hbWVzcGFjZUNvbnRleHQgbnNDb250ZXh0KSB7Ci0gICAgICAgIHRoaXMubmFtZXNwYWNlQ29udGV4dC5zZXRQYXJlbnROc0NvbnRleHQobnNDb250ZXh0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbml0KCkgewotICAgICAgICAvL2p1c3QgYWRkIHRoZSBjdXJyZW50IGVsZW1lbnRzIG5hbWVzcGFjZSBhbmQgcHJlZml4IHRvIHRoZSB0aGlzCi0gICAgICAgIC8vZWxlbWVudHMgbnNjb250ZXh0Ci0gICAgICAgIGFkZFRvTnNNYXAobmFtZS5nZXRQcmVmaXgoKSwgbmFtZS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0KLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBwcmVmaXgKLSAgICAgKiBAcGFyYW0gdXJpCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGFkZFRvTnNNYXAoU3RyaW5nIHByZWZpeCwgU3RyaW5nIHVyaSkgewotICAgICAgICAvL3RvZG8gLSBuZWVkIHRvIGZpeCB0aGlzIHVwIHRvIGNhdGVyIGZvciBjYXNlcyB3aGVyZQotICAgICAgICAvL25hbWVzcGFjZXMgYXJlIGhhdmluZyAgbm8gcHJlZml4ZXMKLSAgICAgICAgaWYgKCF1cmkuZXF1YWxzKG5hbWVzcGFjZUNvbnRleHQuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCkpKSB7Ci0gICAgICAgICAgICAvL3RoaXMgbmFtZXNwYWNlIGlzIG5vdCB0aGVyZS4gTmVlZCB0byBkZWNsYXJlIGl0Ci0gICAgICAgICAgICBuYW1lc3BhY2VDb250ZXh0LnB1c2hOYW1lc3BhY2UocHJlZml4LCB1cmkpOwotICAgICAgICAgICAgbnNEZWNsYXJlZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3V0aWxzL3JlYWRlci9BREJOYW1lc3BhY2VDb250ZXh0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdXRpbHMvcmVhZGVyL0FEQk5hbWVzcGFjZUNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjcwOTYzZC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdXRpbHMvcmVhZGVyL0FEQk5hbWVzcGFjZUNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLkFycmF5U3RhY2s7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLk5hbWVzcGFjZUNvbnRleHQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBBREJOYW1lc3BhY2VDb250ZXh0IGltcGxlbWVudHMgTmFtZXNwYWNlQ29udGV4dCB7Ci0KLSAgICBwcml2YXRlIE5hbWVzcGFjZUNvbnRleHQgcGFyZW50TnNDb250ZXh0OwotCi0gICAgcHVibGljIE5hbWVzcGFjZUNvbnRleHQgZ2V0UGFyZW50TnNDb250ZXh0KCkgewotICAgICAgICByZXR1cm4gcGFyZW50TnNDb250ZXh0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBhcmVudE5zQ29udGV4dChOYW1lc3BhY2VDb250ZXh0IHBhcmVudE5zQ29udGV4dCkgewotICAgICAgICB0aGlzLnBhcmVudE5zQ29udGV4dCA9IHBhcmVudE5zQ29udGV4dDsKLSAgICB9Ci0KLSAgICAvL0tlZXAgdHdvIGFycmF5bGlzdHMgZm9yIHRoZSBwcmVmaXhlcyBhbmQgbmFtZXNwYWNlcy4gVGhleSBzaG91bGQgYmUgaW4gc3luYwotICAgIC8vc2luY2UgdGhlIGluZGV4IG9mIHRoZSBlbnRyeSB3aWxsIGJlIHVzZWQgdG8gcmVsYXRlIHRoZW0KLSAgICAvL3VzZSB0aGUgbWluaW11bSBpbml0aWFsIGNhcGFjaXR5IHRvIGxldCB0aGluZ3MgaGFuZGxlIG1lbW9yeSBiZXR0ZXIKLQotICAgIHByaXZhdGUgQXJyYXlTdGFjayBwcmVmaXhTdGFjayA9IG5ldyBBcnJheVN0YWNrKCk7Ci0gICAgcHJpdmF0ZSBBcnJheVN0YWNrIHVyaVN0YWNrID0gbmV3IEFycmF5U3RhY2soKTsKLQotICAgIC8qKgotICAgICAqIFJlZ2lzdGVyIGEgbmFtZXNwYWNlIGluIHRoaXMgY29udGV4dAotICAgICAqCi0gICAgICogQHBhcmFtIHByZWZpeAotICAgICAqIEBwYXJhbSB1cmkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwdXNoTmFtZXNwYWNlKFN0cmluZyBwcmVmaXgsIFN0cmluZyB1cmkpIHsKLSAgICAgICAgcHJlZml4U3RhY2sucHVzaChwcmVmaXgpOwotICAgICAgICB1cmlTdGFjay5wdXNoKHVyaSk7Ci0KLSAgICB9Ci0KLSAgICAvKiogUG9wIGEgbmFtZXNwYWNlICovCi0gICAgcHVibGljIHZvaWQgcG9wTmFtZXNwYWNlKCkgewotICAgICAgICBwcmVmaXhTdGFjay5wb3AoKTsKLSAgICAgICAgdXJpU3RhY2sucG9wKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VVUkkoU3RyaW5nIHByZWZpeCkgewotICAgICAgICAvL2RvIHRoZSBjb3JyZWN0aW9ucyBhcyBwZXIgdGhlIGphdmFkb2MKLSAgICAgICAgaWYgKHByZWZpeFN0YWNrLmNvbnRhaW5zKHByZWZpeCkpIHsKLSAgICAgICAgICAgIGludCBpbmRleCA9IHByZWZpeFN0YWNrLmluZGV4T2YocHJlZml4KTsKLSAgICAgICAgICAgIHJldHVybiAoU3RyaW5nKXVyaVN0YWNrLmdldChpbmRleCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBhcmVudE5zQ29udGV4dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gcGFyZW50TnNDb250ZXh0LmdldFByZWZpeChwcmVmaXgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KFN0cmluZyB1cmkpIHsKLSAgICAgICAgLy9kbyB0aGUgY29ycmVjdGlvbnMgYXMgcGVyIHRoZSBqYXZhZG9jCi0gICAgICAgIGludCBpbmRleCA9IHVyaVN0YWNrLmluZGV4T2YodXJpKTsKLSAgICAgICAgaWYgKGluZGV4ICE9IC0xKSB7Ci0gICAgICAgICAgICByZXR1cm4gKFN0cmluZylwcmVmaXhTdGFjay5nZXQoaW5kZXgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHBhcmVudE5zQ29udGV4dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gcGFyZW50TnNDb250ZXh0LmdldFByZWZpeCh1cmkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBJdGVyYXRvciBnZXRQcmVmaXhlcyhTdHJpbmcgdXJpKSB7Ci0gICAgICAgIC8vY3JlYXRlIGFuIGFycmF5bGlzdCB0aGF0IGNvbnRhaW5zIHRoZSByZWxldmFudCBwcmVmaXhlcwotICAgICAgICBTdHJpbmdbXSB1cmlzID0gKFN0cmluZ1tdKXVyaVN0YWNrLnRvQXJyYXkobmV3IFN0cmluZ1t1cmlTdGFjay5zaXplKCldKTsKLSAgICAgICAgQXJyYXlMaXN0IHRlbXBMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHVyaXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmICh1cmlzW2ldLmVxdWFscyh1cmkpKSB7Ci0gICAgICAgICAgICAgICAgdGVtcExpc3QuYWRkKHByZWZpeFN0YWNrLmdldChpKSk7Ci0gICAgICAgICAgICAgICAgLy93ZSBhc3N1bWUgdGhhdCBhcnJheSBjb252ZXJzaW9uIHByZXNlcnZlcyB0aGUgb3JkZXIKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvL2J5IG5vdyBhbGwgdGhlIHJlbGV2YW50IHByZWZpeGVzIGFyZSBjb2xsZWN0ZWQKLSAgICAgICAgLy9tYWtlIGEgbmV3IGl0ZXJhdG9yIGFuZCBwcm92aWRlIGEgd3JhcHBlciBpdGVyYXRvciB0bwotICAgICAgICAvL29iZXkgdGhlIGNvbnRyYWN0IG9uIHRoZSBBUEkKLSAgICAgICAgcmV0dXJuIG5ldyBXcmFwcGluZ0l0ZXJhdG9yKHRlbXBMaXN0Lml0ZXJhdG9yKCkpOwotICAgIH0KLQotCi0gICAgcHJpdmF0ZSBjbGFzcyBXcmFwcGluZ0l0ZXJhdG9yIGltcGxlbWVudHMgSXRlcmF0b3IgewotCi0gICAgICAgIHByaXZhdGUgSXRlcmF0b3IgY29udGFpbmVkSXRlcmF0b3IgPSBudWxsOwotCi0gICAgICAgIHB1YmxpYyBXcmFwcGluZ0l0ZXJhdG9yKEl0ZXJhdG9yIGNvbnRhaW5lZEl0ZXJhdG9yKSB7Ci0gICAgICAgICAgICB0aGlzLmNvbnRhaW5lZEl0ZXJhdG9yID0gY29udGFpbmVkSXRlcmF0b3I7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgSXRlcmF0b3IgZ2V0Q29udGFpbmVkSXRlcmF0b3IoKSB7Ci0gICAgICAgICAgICByZXR1cm4gY29udGFpbmVkSXRlcmF0b3I7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRDb250YWluZWRJdGVyYXRvcihJdGVyYXRvciBjb250YWluZWRJdGVyYXRvcikgewotICAgICAgICAgICAgdGhpcy5jb250YWluZWRJdGVyYXRvciA9IGNvbnRhaW5lZEl0ZXJhdG9yOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFzIHBlciB0aGUgY29udHJhY3Qgb24gdGhlIEFQSSBvZiBOYW1lc3BhY2UgY29udGV4dCB0aGUgcmV0dXJuZWQgaXRlcmF0b3Igc2hvdWxkIGJlCi0gICAgICAgICAqIGltbXV0YWJsZQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlKCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5lZEl0ZXJhdG9yLmhhc05leHQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBPYmplY3QgbmV4dCgpIHsKLSAgICAgICAgICAgIHJldHVybiBjb250YWluZWRJdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdXRpbHMvcmVhZGVyL0FEQlhNTFN0cmVhbVJlYWRlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3V0aWxzL3JlYWRlci9BREJYTUxTdHJlYW1SZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2MwOTUyMC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdXRpbHMvcmVhZGVyL0FEQlhNTFN0cmVhbVJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29uc3RhbnRzOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5OYW1lc3BhY2VDb250ZXh0OwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotCi1wdWJsaWMgaW50ZXJmYWNlIEFEQlhNTFN0cmVhbVJlYWRlciBleHRlbmRzIFhNTFN0cmVhbVJlYWRlciwgQ29uc3RhbnRzIHsKLQotICAgIC8vIHRoaXMgd2lsbCBoZWxwIHRvIGhhbmRsZSBUZXh0IHdpdGhpbiB0aGUgY3VycmVudCBlbGVtZW50LgotICAgIC8vIHVzZXIgc2hvdWxkIHBhc3MgdGhlIGVsZW1lbnQgdGV4dCB0byB0aGUgcHJvcGVydHkgbGlzdCBhcyB0aGlzCi0gICAgLy8gRUxFTUVOVF9URVhUIGFzIHRoZSBrZXkuIFRoaXMga2V5IGRlbGliZXJhdGVseSBoYXMgYSBzcGFjZSBpbiBpdAotICAgIC8vIHNvIHRoYXQgaXQgaXMgbm90IGEgdmFsaWQgWE1MIG5hbWUKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfVEVYVCA9ICJFbGVtZW50IFRleHQiOwotCi0gICAgLyoqIEV4dHJhIG1ldGhvZCB0byBxdWVyeSB0aGUgc3RhdGUgb2YgdGhlIHB1bGxwYXJzZXIgKi8KLSAgICBib29sZWFuIGlzRG9uZSgpOwotCi0gICAgLyoqIGFkZCB0aGUgcGFyZW50IG5hbWVzcGFjZSBjb250ZXh0IHRvIHRoaXMgcGFyc2VyICovCi0gICAgdm9pZCBhZGROYW1lc3BhY2VDb250ZXh0KE5hbWVzcGFjZUNvbnRleHQgbnNDb250ZXh0KTsKLQotICAgIC8qKgotICAgICAqIEluaXRpYXRlIHRoZSBwYXJzZXIgLSB0aGlzIHdpbGwgZG8gd2hhdGV2ZXIgdGhlIG5lZWRlZCB0YXNrcyB0byBpbml0aWF0ZSB0aGUgcGFyc2VyIGFuZCBtdXN0Ci0gICAgICogYmUgY2FsbGVkIGJlZm9yZSBhdHRlbXB0aW5nIGFueSBzcGVjaWZpYyBwYXJzaW5nIHVzaW5nIHRoaXMgcGFyc2VyCi0gICAgICovCi0gICAgdm9pZCBpbml0KCk7Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdXRpbHMvcmVhZGVyL0FEQlhNTFN0cmVhbVJlYWRlckltcGwuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy91dGlscy9yZWFkZXIvQURCWE1MU3RyZWFtUmVhZGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2NlNTdmLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy91dGlscy9yZWFkZXIvQURCWE1MU3RyZWFtUmVhZGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC51dGlsLk9NU2VyaWFsaXplclV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJCZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZW1hcHBpbmcuU2ltcGxlVHlwZU1hcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLmphdmEyd3NkbC5UeXBlVGFibGU7Ci0KLWltcG9ydCBqYXZheC5hY3RpdmF0aW9uLkRhdGFIYW5kbGVyOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuTmFtZXNwYWNlQ29udGV4dDsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uTG9jYXRpb247Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQXJyYXk7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgbmV3IGltcGxlbWVudGF0aW9uIG9mIHRoZSBBREJwdWxsYXBhcnNlci4gVGhlIGFwcHJvYWNoIGhlcmUgaXMgc2ltcGxlIFdoZW4gdGhlIHB1bGwKLSAqIHBhcnNlciBuZWVkcyB0byBnZW5lcmF0ZSBldmVudHMgZm9yIGEgcGFydGljdWxhciBuYW1lLXZhbHVlKHMpIHBhaXIgaXQgYWx3YXlzIGhhbmRlcyBvdmVyCi0gKiAoZGVsZWdhdGVzKSB0aGUgdGFzayB0byBhbm90aGVyIHB1bGwgcGFyc2VyIHdoaWNoIGtub3dzIGhvdyB0byBkZWFsIHdpdGggaXQgVGhlIGNvbW1vbiB0eXBlcyBvZgotICogbmFtZSB2YWx1ZSBwYWlycyB3ZSdsbCBjb21lIGFjcm9zcyBhcmUgMS4gU3RyaW5nIG5hbWUvUU5hbWUgbmFtZSAtIFN0cmluZyB2YWx1ZSAyLiBTdHJpbmcKLSAqIG5hbWUvUU5hbWUgbmFtZSAtIFN0cmluZ1tdIHZhbHVlIDMuIE9NRWxlbWVudGtleSAtIE9NRWxlbWVudCB2YWx1ZSA0LiBRTmFtZSBuYW1lL1N0cmluZyBuYW1lICAtCi0gKiBBREJCZWFuIHZhbHVlIDUuIFFOYW1lIG5hbWUvU3RyaW5nIG5hbWUgIC0gSmF2YSBiZWFuIDUuIFFOYW1lIG5hbWUvU3RyaW5nIG5hbWUgIC0gRGF0YWhhbmRsZXIKLSAqIDxwLz4KLSAqIEFzIGZvciB0aGUgYXR0cmlidXRlcywgdGhlc2UgYXJlIHRoZSBwb3NzaWJsZSBjb21iaW5hdGlvbnMgaW4gdGhlIGFycmF5IDEuIFN0cmluZyBuYW1lL1FOYW1lIG5hbWUKLSAqIC0gU3RyaW5nIHZhbHVlIDIuIE9NQXR0cmlidXRlS2V5IC0gT01BdHRyaWJ1dGUKLSAqIDxwLz4KLSAqIE5vdGUgdGhhdCBjZXJ0YWluIGFycmF5IG1ldGhvZHMgaGF2ZSAgYmVlbiBkZWxpYmVyYXRlbHkgcmVtb3ZlZCB0byBhdm9pZCBjb21wbGljYXRpb25zLiBUaGUKLSAqIGdlbmVyYXRlZCBjb2RlIHdpbGwgdGFrZSB0aGUgdHJvdWJsZSB0byBsYXkgdGhlIGVsZW1lbnRzIG9mIHRoZSBhcnJheSBpbiB0aGUgY29ycmVjdCBvcmRlcgotICogPHAvPgotICogPHAvPgotICogSGVuY2UgdGhlcmUgd2lsbCBiZSBhIHBhcnNlciBpbXBsIHRoYXQga25vd3MgaG93IHRvIGhhbmRsZSB0aGVzZSB0eXBlcywgYW5kIHRoaXMgcGFyZW50IHBhcnNlcgotICogd2lsbCBhbHdheXMgZGVsZWdhdGUgdGhlc2UgdGFza3MgdG8gdGhlIGNoaWxkIHB1bGxwYXJhc2VycyBpbiBlZmZlY3QgdGhpcyBpcyBvbmUgaHVnZSBzdGF0ZQotICogbWFjaGluZSB0aGF0IGhhcyBvbmx5IGEgZmV3IHN0YXRlcyBhbmQgZGVsZWdhdGVzIHRoaW5ncyBkb3duIHRvIHRoZSBjaGlsZCBwYXJzZXJzIHdoZW5ldmVyCi0gKiBwb3NzaWJsZQotICogPHAvPgotICovCi1wdWJsaWMgY2xhc3MgQURCWE1MU3RyZWFtUmVhZGVySW1wbCBpbXBsZW1lbnRzIEFEQlhNTFN0cmVhbVJlYWRlciB7Ci0KLSAgICBwcml2YXRlIE9iamVjdFtdIHByb3BlcnRpZXM7Ci0gICAgcHJpdmF0ZSBPYmplY3RbXSBhdHRyaWJ1dGVzOwotICAgIHByaXZhdGUgUU5hbWUgZWxlbWVudFFOYW1lOwotCi0gICAgLy9UaGlzIGlzIHRvIHN0b3JlIHRoZSBRTmFtZSB3aGljaCBhcmUgaW4gdGhlIHR5cGVUYWJsZSBhZnRlciBzZXR0aW5nIHRoZSBjb3JyZWN0IHByZWZpeAotICAgIHByaXZhdGUgSGFzaE1hcCBxbmFtZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICAvL3dlIGFsd2F5cyBjcmVhdGUgYSBuZXcgbmFtZXNwYWNlIGNvbnRleHQKLSAgICBwcml2YXRlIEFEQk5hbWVzcGFjZUNvbnRleHQgbmFtZXNwYWNlQ29udGV4dCA9IG5ldyBBREJOYW1lc3BhY2VDb250ZXh0KCk7Ci0KLSAgICBwcml2YXRlIE1hcCBkZWNsYXJlZE5hbWVzcGFjZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICAvL3N0YXRlcyBmb3IgdGhpcyBwdWxscGFyc2VyIC0gaXQgY2FuIG9ubHkgaGF2ZSBmb3VyIHN0YXRlcwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFSVF9FTEVNRU5UX1NUQVRFID0gMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRU5EX0VMRU1FTlRfU1RBVEUgPSAxOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUxFR0FURURfU1RBVEUgPSAyOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBURVhUX1NUQVRFID0gMzsKLQotICAgIC8vaW50ZWdlciBmaWVsZCB0aGF0IGtlZXBzIHRoZSBzdGF0ZSBvZiB0aGlzCi0gICAgLy9wYXJzZXIuCi0gICAgcHJpdmF0ZSBpbnQgc3RhdGUgPSBTVEFSVF9FTEVNRU5UX1NUQVRFOwotCi0gICAgLy9yZWZlcmVuY2UgdG8gdGhlIGNoaWxkIHJlYWRlcgotICAgIHByaXZhdGUgQURCWE1MU3RyZWFtUmVhZGVyIGNoaWxkUmVhZGVyOwotCi0gICAgLy9jdXJyZW50IHByb3BlcnR5IGluZGV4Ci0gICAgLy9pbml0aWFsaXplZCBhdCB6ZXJvCi0gICAgcHJpdmF0ZSBpbnQgY3VycmVudFByb3BlcnR5SW5kZXggPSAwOwotCi0gICAgLy9UbyBrZWVwIGVsZW1lbnQgZm9ybWRlZmF1bHQgcXVhbGlmaWVkIG9yIG5vdAotICAgIHByaXZhdGUgYm9vbGVhbiBxdWFsaWZpZWQgPSBmYWxzZTsKLQotICAgIC8vdG8ga2VlcCB0aGUgY3VycmVudCB0eXBlcyB3aGljaCBhcmUgaW4gQXhpc1NlcnZpY2UKLSAgICBwcml2YXRlIFR5cGVUYWJsZSB0eXBlVGFibGUgPSBudWxsOwotCi0KLSAgICAvKgotICAgICAqIHdlIG5lZWQgdG8gcGFzcyBpbiBhIG5hbWVzcGFjZSBjb250ZXh0IHNpbmNlIHdoZW4gZGVsZWdhdGVkLCB3ZSd2ZSBubwotICAgICogaWRlYSBvZiB0aGUgY3VycmVudCBuYW1lc3BhY2UgY29udGV4dC4gU28gaXQgbmVlZHMgdG8gYmUgcGFzc2VkIG9uCi0gICAgKiBoZXJlIQotICAgICovCi0gICAgcHVibGljIEFEQlhNTFN0cmVhbVJlYWRlckltcGwoUU5hbWUgYWRiQmVhbnNRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RbXSBwcm9wZXJ0aWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdFtdIGF0dHJpYnV0ZXMpIHsKLSAgICAgICAgLy92YWxpZGF0ZSB0aGUgbGVuZ3Rocywgc2luY2UgYm90aCB0aGUgYXJyYXlzIGFyZSBzdXBwb3NlZAotICAgICAgICAvL3RvIGhhdmUKLSAgICAgICAgdGhpcy5wcm9wZXJ0aWVzID0gcHJvcGVydGllczsKLSAgICAgICAgdGhpcy5lbGVtZW50UU5hbWUgPSBhZGJCZWFuc1FOYW1lOwotICAgICAgICB0aGlzLmF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzOwotICAgIH0KLQotICAgIHB1YmxpYyBBREJYTUxTdHJlYW1SZWFkZXJJbXBsKFFOYW1lIGFkYkJlYW5zUU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0W10gcHJvcGVydGllcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RbXSBhdHRyaWJ1dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVUYWJsZSB0eXBlVGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBxdWFsaWZpZWQpIHsKLSAgICAgICAgdGhpcyhhZGJCZWFuc1FOYW1lLCBwcm9wZXJ0aWVzLCBhdHRyaWJ1dGVzKTsKLSAgICAgICAgdGhpcy5xdWFsaWZpZWQgPSBxdWFsaWZpZWQ7Ci0gICAgICAgIHRoaXMudHlwZVRhYmxlID0gdHlwZVRhYmxlOwotICAgICAgICBpZih0aGlzLnR5cGVUYWJsZSE9bnVsbCl7Ci0gICAgICAgICAgICBNYXAgY29tcGxleFR5cGVNYXAgPSB0aGlzLnR5cGVUYWJsZS5nZXRDb21wbGV4U2NoZW1hTWFwKCk7Ci0gICAgICAgICAgICBpZihjb21wbGV4VHlwZU1hcCAhPW51bGwpewotICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGtleXMgPSBjb21wbGV4VHlwZU1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgIHdoaWxlIChrZXlzLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcga2V5ID0gKFN0cmluZykga2V5cy5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIFFOYW1lIHFuYW1lID0gKFFOYW1lKSBjb21wbGV4VHlwZU1hcC5nZXQoa2V5KTsKLSAgICAgICAgICAgICAgICAgICAgaWYocW5hbWUgIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPXFuYW1lLmdldFByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYocHJlZml4ID09bnVsbCAmJiAiIi5lcXVhbHMocHJlZml4KSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gT01TZXJpYWxpemVyVXRpbC5nZXROZXh0TlNQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHFuYW1lID0gbmV3IFFOYW1lKHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpLHFuYW1lLmdldExvY2FsUGFydCgpLHByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnR5cGVUYWJsZS5nZXRDb21wbGV4U2NoZW1hTWFwKCkucHV0KGtleSxxbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBxbmFtZU1hcC5wdXQocW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkscHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZFRvTnNNYXAocHJlZml4LCBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiogYWRkIHRoZSBuYW1lc3BhY2UgY29udGV4dCAqLwotCi0gICAgcHVibGljIHZvaWQgYWRkTmFtZXNwYWNlQ29udGV4dChOYW1lc3BhY2VDb250ZXh0IG5zQ29udGV4dCkgewotICAgICAgICAvLyByZWdpc3RlciB0aGUgbmFtZXNwYWNlIGNvbnRleHQgcGFzc2VkIGluIHRvIHRoaXMKLSAgICAgICAgdGhpcy5uYW1lc3BhY2VDb250ZXh0LnNldFBhcmVudE5zQ29udGV4dChuc0NvbnRleHQpOwotCi0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB3ZSBuZWVkIHRvIHNwbGl0IG91dCB0aGUgY2FsbGluZyB0byB0aGUgcG9wdWxhdGUgbmFtZXNwYWNlcyBzZXBlcmF0ZWx5IHNpbmNlIHRoaXMgbmVlZHMgdG8gYmUKLSAgICAgKiBkb25lICphZnRlciogc2V0dGluZyB0aGUgcGFyZW50IG5hbWVzcGFjZSBjb250ZXh0LiBXZSBjYW5ub3QgYXNzdW1lIGl0IHdpbGwgaGFwcGVuIGF0Ci0gICAgICogY29uc3RydWN0aW9uIQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGluaXQoKSB7Ci0gICAgICAgIC8vIGhlcmUgd2UgaGF2ZSBhbiBleHRyYSBpc3N1ZSB0byBhdHRlbmQgdG8uIHdlIG5lZWQgdG8gbG9vayBhdCB0aGUKLSAgICAgICAgLy8gcHJlZml4ZXMgYW5kIHVyaXMgKHRoZSBjb21iaW5hdGlvbikgYW5kIHBvcHVsYXRlIGEgaGFzaG1hcCBvZgotICAgICAgICAvLyBuYW1lc3BhY2VzLiBUaGUgaGFzaG1hcCBvZiBuYW1lc3BhY2VzIHdpbGwgYmUgdXNlZCB0byBzZXJ2ZSB0aGUKLSAgICAgICAgLy8gbmFtZXNwYWNlIGNvbnRleHQKLQotICAgICAgICBwb3B1bGF0ZU5hbWVzcGFjZUNvbnRleHQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0ga2V5Ci0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBrZXkpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotICAgICAgICBpZiAoc3RhdGUgPT0gU1RBUlRfRUxFTUVOVF9TVEFURSB8fCBzdGF0ZSA9PSBFTkRfRUxFTUVOVF9TVEFURSkgewotICAgICAgICAgICAgaWYgKE9QVElNSVpBVElPTl9FTkFCTEVELmVxdWFscyhrZXkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4uVFJVRTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT0gVEVYVF9TVEFURSkgewotICAgICAgICAgICAgaWYgKElTX0JJTkFSWS5lcXVhbHMoa2V5KSkgewotICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuLkZBTFNFOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PSBERUxFR0FURURfU1RBVEUpIHsKLSAgICAgICAgICAgIHJldHVybiBjaGlsZFJlYWRlci5nZXRQcm9wZXJ0eShrZXkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlcXVpcmUoaW50IGksIFN0cmluZyBzdHJpbmcsIFN0cmluZyBzdHJpbmcxKQotICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHRvZG8gaW1wbGVtZW50IHRoZSByaWdodCBjb250cmFjdCBmb3IgdGhpcwotICAgICAqCi0gICAgICogQHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnRUZXh0KCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChzdGF0ZSA9PSBERUxFR0FURURfU1RBVEUpIHsKLSAgICAgICAgICAgIHJldHVybiBjaGlsZFJlYWRlci5nZXRFbGVtZW50VGV4dCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIHRvZG8gaW1wbGVtZW50IHRoaXMKLSAgICAgKgotICAgICAqIEB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIGludCBuZXh0VGFnKCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIC8qKiBAdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChzdGF0ZSA9PSBERUxFR0FURURfU1RBVEUpIHsKLSAgICAgICAgICAgIGlmIChjaGlsZFJlYWRlci5pc0RvbmUoKSkgewotICAgICAgICAgICAgICAgIC8vdGhlIGNoaWxkIHJlYWRlciBpcyBkb25lLiBXZSBzaG91bGRuJ3QgYmUgZ2V0dGluZyB0aGUKLSAgICAgICAgICAgICAgICAvL2hhc25leHQgcmVzdWx0IGZyb20gdGhlIGNoaWxkIHB1bGxwYXJzZXIgdGhlbgotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gY2hpbGRSZWFkZXIuaGFzTmV4dCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIChzdGF0ZSA9PSBTVEFSVF9FTEVNRU5UX1NUQVRFCi0gICAgICAgICAgICAgICAgICAgIHx8IHN0YXRlID09IFRFWFRfU1RBVEUpOwotCi0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vZG8gbm90aGluZyBoZXJlIC0gd2UgaGF2ZSBubyByZXNvdXJjZXMgdG8gZnJlZQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKFN0cmluZyBwcmVmaXgpIHsKLSAgICAgICAgcmV0dXJuIG5hbWVzcGFjZUNvbnRleHQuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNTdGFydEVsZW1lbnQoKSB7Ci0gICAgICAgIGlmIChzdGF0ZSA9PSBTVEFSVF9FTEVNRU5UX1NUQVRFKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PSBFTkRfRUxFTUVOVF9TVEFURSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjaGlsZFJlYWRlci5pc1N0YXJ0RWxlbWVudCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRW5kRWxlbWVudCgpIHsKLSAgICAgICAgaWYgKHN0YXRlID09IFNUQVJUX0VMRU1FTlRfU1RBVEUpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PSBFTkRfRUxFTUVOVF9TVEFURSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNoaWxkUmVhZGVyLmlzRW5kRWxlbWVudCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQ2hhcmFjdGVycygpIHsKLSAgICAgICAgaWYgKHN0YXRlID09IFNUQVJUX0VMRU1FTlRfU1RBVEUgfHwgc3RhdGUgPT0gRU5EX0VMRU1FTlRfU1RBVEUpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY2hpbGRSZWFkZXIuaXNDaGFyYWN0ZXJzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNXaGl0ZVNwYWNlKCkgewotICAgICAgICBpZiAoc3RhdGUgPT0gU1RBUlRfRUxFTUVOVF9TVEFURSB8fCBzdGF0ZSA9PSBFTkRfRUxFTUVOVF9TVEFURSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjaGlsZFJlYWRlci5pc1doaXRlU3BhY2UoKTsKLSAgICB9Ci0KLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAvLy8gIGF0dHJpYnV0ZSBoYW5kbGluZwotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0gICAgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVWYWx1ZShTdHJpbmcgbnNVcmksIFN0cmluZyBsb2NhbE5hbWUpIHsKLQotICAgICAgICBpbnQgYXR0cmliQ291bnQgPSBnZXRBdHRyaWJ1dGVDb3VudCgpOwotICAgICAgICBTdHJpbmcgcmV0dXJuVmFsdWUgPSBudWxsOwotICAgICAgICBRTmFtZSBhdHRyaWJRdWFsaWZpZWROYW1lOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYkNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIGF0dHJpYlF1YWxpZmllZE5hbWUgPSBnZXRBdHRyaWJ1dGVOYW1lKGkpOwotICAgICAgICAgICAgaWYgKG5zVXJpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAobG9jYWxOYW1lLmVxdWFscyhhdHRyaWJRdWFsaWZpZWROYW1lLmdldExvY2FsUGFydCgpKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZSA9IGdldEF0dHJpYnV0ZVZhbHVlKGkpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChsb2NhbE5hbWUuZXF1YWxzKGF0dHJpYlF1YWxpZmllZE5hbWUuZ2V0TG9jYWxQYXJ0KCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBuc1VyaS5lcXVhbHMoYXR0cmliUXVhbGlmaWVkTmFtZS5nZXROYW1lc3BhY2VVUkkoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUgPSBnZXRBdHRyaWJ1dGVWYWx1ZShpKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotCi0gICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldEF0dHJpYnV0ZUNvdW50KCkgewotICAgICAgICByZXR1cm4gKHN0YXRlID09IERFTEVHQVRFRF9TVEFURSkgPwotICAgICAgICAgICAgICAgIGNoaWxkUmVhZGVyLmdldEF0dHJpYnV0ZUNvdW50KCkgOgotICAgICAgICAgICAgICAgICgoYXR0cmlidXRlcyAhPSBudWxsKSAmJiAoc3RhdGUgPT0gU1RBUlRfRUxFTUVOVF9TVEFURSkgPyBhdHRyaWJ1dGVzLmxlbmd0aCAvIDIgOgotICAgICAgICAgICAgICAgICAgICAgICAgMCk7Ci0gICAgfQotCi0gICAgLyoqIEBwYXJhbSBpICAqLwotICAgIHB1YmxpYyBRTmFtZSBnZXRBdHRyaWJ1dGVOYW1lKGludCBpKSB7Ci0gICAgICAgIGlmIChzdGF0ZSA9PSBERUxFR0FURURfU1RBVEUpIHsKLSAgICAgICAgICAgIHJldHVybiBjaGlsZFJlYWRlci5nZXRBdHRyaWJ1dGVOYW1lKGkpOwotICAgICAgICB9IGVsc2UgaWYgKHN0YXRlID09IFNUQVJUX0VMRU1FTlRfU1RBVEUpIHsKLSAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKChpID49IChhdHRyaWJ1dGVzLmxlbmd0aCAvIDIpKSB8fCBpIDwgMCkgeyAvL291dCBvZiByYW5nZQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvL2dldCB0aGUgYXR0cmlidXRlIHBvaW50ZXIKLSAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGF0dHJpYlBvaW50ZXIgPSBhdHRyaWJ1dGVzW2kgKiAyXTsKLSAgICAgICAgICAgICAgICAgICAgLy9jYXNlIG9uZSAtIGF0dHJpYiBuYW1lIGlzIG51bGwKLSAgICAgICAgICAgICAgICAgICAgLy90aGlzIHNob3VsZCBiZSB0aGUgcG9pbnRlciB0byB0aGUgT01BdHRyaWJ1dGUgdGhlbgotICAgICAgICAgICAgICAgICAgICBpZiAoYXR0cmliUG9pbnRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qgb21BdHRyaWJPYmogPSBhdHRyaWJ1dGVzWyhpICogMikgKyAxXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvbUF0dHJpYk9iaiA9PSBudWxsIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEob21BdHRyaWJPYmogaW5zdGFuY2VvZiBPTUF0dHJpYnV0ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3cm9uZyBvYmplY3Qgc2V0IHRvIGhhdmUgaW4gdGhlIGF0dHJpYiBhcnJheSAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBzaG91bGQgaGF2ZSBiZWVuIGRldGVjdGVkIGJ5IG5vdyBidXQganVzdCBiZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN1cmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIE9NQXR0cmlidXRlIGF0dCA9IChPTUF0dHJpYnV0ZSlvbUF0dHJpYk9iajsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhdHQuZ2V0UU5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhdHRyaWJQb2ludGVyIGluc3RhbmNlb2YgT01BdHRyaWJLZXkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBvbUF0dHJpYk9iaiA9IGF0dHJpYnV0ZXNbKGkgKiAyKSArIDFdOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9tQXR0cmliT2JqID09IG51bGwgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIShvbUF0dHJpYk9iaiBpbnN0YW5jZW9mIE9NQXR0cmlidXRlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyb25nIG9iamVjdCBzZXQgdG8gaGF2ZSBpbiB0aGUgYXR0cmliIGFycmF5IC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIHNob3VsZCBoYXZlIGJlZW4gZGV0ZWN0ZWQgYnkgbm93IGJ1dCBqdXN0IGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3VyZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgT01BdHRyaWJ1dGUgYXR0ID0gKE9NQXR0cmlidXRlKW9tQXR0cmliT2JqOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF0dC5nZXRRTmFtZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgLy9jYXNlIHR3byAtIGF0dHJpYiBuYW1lIGlzIGEgcGxhaW4gc3RyaW5nCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYXR0cmliUG9pbnRlciBpbnN0YW5jZW9mIFN0cmluZykgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBRTmFtZSgoU3RyaW5nKWF0dHJpYlBvaW50ZXIpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGF0dHJpYlBvaW50ZXIgaW5zdGFuY2VvZiBRTmFtZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChRTmFtZSlhdHRyaWJQb2ludGVyOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ly9hcyBwZXIgdGhlIGFwaSBjb250cmFjdAotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZU5hbWVzcGFjZShpbnQgaSkgewotICAgICAgICBpZiAoc3RhdGUgPT0gREVMRUdBVEVEX1NUQVRFKSB7Ci0gICAgICAgICAgICByZXR1cm4gY2hpbGRSZWFkZXIuZ2V0QXR0cmlidXRlTmFtZXNwYWNlKGkpOwotICAgICAgICB9IGVsc2UgaWYgKHN0YXRlID09IFNUQVJUX0VMRU1FTlRfU1RBVEUpIHsKLSAgICAgICAgICAgIFFOYW1lIG5hbWUgPSBnZXRBdHRyaWJ1dGVOYW1lKGkpOwotICAgICAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlTG9jYWxOYW1lKGludCBpKSB7Ci0gICAgICAgIGlmIChzdGF0ZSA9PSBERUxFR0FURURfU1RBVEUpIHsKLSAgICAgICAgICAgIHJldHVybiBjaGlsZFJlYWRlci5nZXRBdHRyaWJ1dGVMb2NhbE5hbWUoaSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT0gU1RBUlRfRUxFTUVOVF9TVEFURSkgewotICAgICAgICAgICAgUU5hbWUgbmFtZSA9IGdldEF0dHJpYnV0ZU5hbWUoaSk7Ci0gICAgICAgICAgICBpZiAobmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVQcmVmaXgoaW50IGkpIHsKLSAgICAgICAgaWYgKHN0YXRlID09IERFTEVHQVRFRF9TVEFURSkgewotICAgICAgICAgICAgcmV0dXJuIGNoaWxkUmVhZGVyLmdldEF0dHJpYnV0ZVByZWZpeChpKTsKLSAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PSBTVEFSVF9FTEVNRU5UX1NUQVRFKSB7Ci0gICAgICAgICAgICBRTmFtZSBuYW1lID0gZ2V0QXR0cmlidXRlTmFtZShpKTsKLSAgICAgICAgICAgIGlmIChuYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5hbWUuZ2V0UHJlZml4KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZVR5cGUoaW50IGkpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7ICAvL25vdCBzdXBwb3J0ZWQKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZVZhbHVlKGludCBpKSB7Ci0gICAgICAgIGlmIChzdGF0ZSA9PSBERUxFR0FURURfU1RBVEUpIHsKLSAgICAgICAgICAgIHJldHVybiBjaGlsZFJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZShpKTsKLSAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PSBTVEFSVF9FTEVNRU5UX1NUQVRFKSB7Ci0gICAgICAgICAgICBpZiAoYXR0cmlidXRlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmICgoaSA+PSAoYXR0cmlidXRlcy5sZW5ndGggLyAyKSkgfHwgaSA8IDApIHsgLy9vdXQgb2YgcmFuZ2UKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy9nZXQgdGhlIGF0dHJpYnV0ZSBwb2ludGVyCi0gICAgICAgICAgICAgICAgICAgIE9iamVjdCBhdHRyaWJQb2ludGVyID0gYXR0cmlidXRlc1tpICogMl07Ci0gICAgICAgICAgICAgICAgICAgIE9iamVjdCBvbUF0dHJpYk9iaiA9IGF0dHJpYnV0ZXNbKGkgKiAyKSArIDFdOwotICAgICAgICAgICAgICAgICAgICAvL2Nhc2Ugb25lIC0gYXR0cmliIG5hbWUgaXMgbnVsbAotICAgICAgICAgICAgICAgICAgICAvL3RoaXMgc2hvdWxkIGJlIHRoZSBwb2ludGVyIHRvIHRoZSBPTUF0dHJpYnV0ZSB0aGVuCi0gICAgICAgICAgICAgICAgICAgIGlmIChhdHRyaWJQb2ludGVyID09IG51bGwpIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9tQXR0cmliT2JqID09IG51bGwgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIShvbUF0dHJpYk9iaiBpbnN0YW5jZW9mIE9NQXR0cmlidXRlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyb25nIG9iamVjdCBzZXQgdG8gaGF2ZSBpbiB0aGUgYXR0cmliIGFycmF5IC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIHNob3VsZCBoYXZlIGJlZW4gZGV0ZWN0ZWQgYnkgbm93IGJ1dCBqdXN0IGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3VyZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgT01BdHRyaWJ1dGUgYXR0ID0gKE9NQXR0cmlidXRlKW9tQXR0cmliT2JqOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF0dC5nZXRBdHRyaWJ1dGVWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGF0dHJpYlBvaW50ZXIgaW5zdGFuY2VvZiBPTUF0dHJpYktleSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9tQXR0cmliT2JqID09IG51bGwgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIShvbUF0dHJpYk9iaiBpbnN0YW5jZW9mIE9NQXR0cmlidXRlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyb25nIG9iamVjdCBzZXQgdG8gaGF2ZSBpbiB0aGUgYXR0cmliIGFycmF5IC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIHNob3VsZCBoYXZlIGJlZW4gZGV0ZWN0ZWQgYnkgbm93IGJ1dCBqdXN0IGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3VyZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgT01BdHRyaWJ1dGUgYXR0ID0gKE9NQXR0cmlidXRlKW9tQXR0cmliT2JqOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF0dC5nZXRBdHRyaWJ1dGVWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgLy9jYXNlIHR3byAtIGF0dHJpYiBuYW1lIGlzIGEgcGxhaW4gc3RyaW5nCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYXR0cmliUG9pbnRlciBpbnN0YW5jZW9mIFN0cmluZykgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChTdHJpbmcpb21BdHRyaWJPYmo7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYXR0cmliUG9pbnRlciBpbnN0YW5jZW9mIFFOYW1lKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAob21BdHRyaWJPYmogaW5zdGFuY2VvZiBRTmFtZSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBRTmFtZSBhdHRyaWJ1dGVRTmFtZSA9IChRTmFtZSkgb21BdHRyaWJPYmo7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaXJzdCBjaGVjayBpdCBpcyBhbHJlYWR5IHRoZXJlIGlmIG5vdCBhZGQgdGhlIG5hbWVzcGFjZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSBuYW1lc3BhY2VDb250ZXh0LmdldFByZWZpeChhdHRyaWJ1dGVRTmFtZS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IE9NU2VyaWFsaXplclV0aWwuZ2V0TmV4dE5TUHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkVG9Oc01hcChwcmVmaXgsYXR0cmlidXRlUU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYXR0cmlidXRlVmFsdWUgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeC5lcXVhbHMoIiIpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpLmUuIHRoaXMgaXMgdGhlIGRlZmF1bHQgbmFtZXNwYWNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBhdHRyaWJ1dGVRTmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBwcmVmaXggKyAiOiIgKyBhdHRyaWJ1dGVRTmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhdHRyaWJ1dGVWYWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChTdHJpbmcpb21BdHRyaWJPYmo7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0F0dHJpYnV0ZVNwZWNpZmllZChpbnQgaSkgewotICAgICAgICByZXR1cm4gZmFsc2U7ICAvL25vdCBzdXBwb3J0ZWQKLSAgICB9Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8vLy8vLy8vLy8vLy8gIGVuZCBvZiBhdHRyaWJ1dGUgaGFuZGxpbmcKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLy8vLy8vLy8vLy8vLyAgIG5hbWVzcGFjZSBoYW5kbGluZwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0gICAgcHVibGljIGludCBnZXROYW1lc3BhY2VDb3VudCgpIHsKLSAgICAgICAgaWYgKHN0YXRlID09IERFTEVHQVRFRF9TVEFURSkgewotICAgICAgICAgICAgcmV0dXJuIGNoaWxkUmVhZGVyLmdldE5hbWVzcGFjZUNvdW50KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gZGVjbGFyZWROYW1lc3BhY2VNYXAuc2l6ZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqIEBwYXJhbSBpICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlUHJlZml4KGludCBpKSB7Ci0gICAgICAgIGlmIChzdGF0ZSA9PSBERUxFR0FURURfU1RBVEUpIHsKLSAgICAgICAgICAgIHJldHVybiBjaGlsZFJlYWRlci5nZXROYW1lc3BhY2VQcmVmaXgoaSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RhdGUgIT0gVEVYVF9TVEFURSkgewotICAgICAgICAgICAgLy9vcmRlciB0aGUgcHJlZml4ZXMKLSAgICAgICAgICAgIFN0cmluZ1tdIHByZWZpeGVzID0gbWFrZVByZWZpeEFycmF5KCk7Ci0gICAgICAgICAgICBpZiAoKGkgPj0gcHJlZml4ZXMubGVuZ3RoKSB8fCAoaSA8IDApKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBwcmVmaXhlc1tpXTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvKiogR2V0IHRoZSBwcmVmaXggbGlzdCBmcm9tIHRoZSBoYXN0YWJsZSBhbmQgdGFrZSB0aGF0IGludG8gYW4gYXJyYXkgKi8KLSAgICBwcml2YXRlIFN0cmluZ1tdIG1ha2VQcmVmaXhBcnJheSgpIHsKLSAgICAgICAgU3RyaW5nW10gcHJlZml4ZXMgPQotICAgICAgICAgICAgICAgIChTdHJpbmdbXSlkZWNsYXJlZE5hbWVzcGFjZU1hcC5rZXlTZXQoKS4KLSAgICAgICAgICAgICAgICAgICAgICAgIHRvQXJyYXkobmV3IFN0cmluZ1tkZWNsYXJlZE5hbWVzcGFjZU1hcC5zaXplKCldKTsKLSAgICAgICAgQXJyYXlzLnNvcnQocHJlZml4ZXMpOwotICAgICAgICByZXR1cm4gcHJlZml4ZXM7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VVUkkoaW50IGkpIHsKLSAgICAgICAgaWYgKHN0YXRlID09IERFTEVHQVRFRF9TVEFURSkgewotICAgICAgICAgICAgcmV0dXJuIGNoaWxkUmVhZGVyLmdldE5hbWVzcGFjZVVSSShpKTsKLSAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSAhPSBURVhUX1NUQVRFKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZXNwYWNlUHJlZml4ID0gZ2V0TmFtZXNwYWNlUHJlZml4KGkpOwotICAgICAgICAgICAgcmV0dXJuIG5hbWVzcGFjZVByZWZpeCA9PSBudWxsID8gbnVsbCA6Ci0gICAgICAgICAgICAgICAgICAgIChTdHJpbmcpZGVjbGFyZWROYW1lc3BhY2VNYXAuZ2V0KG5hbWVzcGFjZVByZWZpeCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHB1YmxpYyBOYW1lc3BhY2VDb250ZXh0IGdldE5hbWVzcGFjZUNvbnRleHQoKSB7Ci0gICAgICAgIGlmIChzdGF0ZSA9PSBERUxFR0FURURfU1RBVEUpIHsKLSAgICAgICAgICAgIHJldHVybiBjaGlsZFJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbmFtZXNwYWNlQ29udGV4dDsKLSAgICAgICAgfQotCi0KLSAgICB9Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8vLy8vLy8vICBlbmQgb2YgbmFtZXNwYWNlIGhhbmRsaW5nCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgIHB1YmxpYyBpbnQgZ2V0RXZlbnRUeXBlKCkgewotICAgICAgICBpZiAoc3RhdGUgPT0gU1RBUlRfRUxFTUVOVF9TVEFURSkgewotICAgICAgICAgICAgcmV0dXJuIFNUQVJUX0VMRU1FTlQ7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT0gRU5EX0VMRU1FTlRfU1RBVEUpIHsKLSAgICAgICAgICAgIHJldHVybiBFTkRfRUxFTUVOVDsKLSAgICAgICAgfSBlbHNlIHsgLy8gdGhpcyBpcyB0aGUgZGVsZWdhdGVkIHN0YXRlCi0gICAgICAgICAgICByZXR1cm4gY2hpbGRSZWFkZXIuZ2V0RXZlbnRUeXBlKCk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLSAgICAgICAgaWYgKHN0YXRlID09IERFTEVHQVRFRF9TVEFURSkgewotICAgICAgICAgICAgcmV0dXJuIGNoaWxkUmVhZGVyLmdldFRleHQoKTsKLSAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PSBURVhUX1NUQVRFKSB7Ci0gICAgICAgICAgICBPYmplY3QgcHJvcGVydHkgPSBwcm9wZXJ0aWVzW2N1cnJlbnRQcm9wZXJ0eUluZGV4IC0gMV07Ci0gICAgICAgICAgICBpZiAocHJvcGVydHkgaW5zdGFuY2VvZiBEYXRhSGFuZGxlcil7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIENvbnZlcnRlclV0aWwuZ2V0U3RyaW5nRnJvbURhdGFoYW5kbGVyKChEYXRhSGFuZGxlcilwcm9wZXJ0eSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiAoU3RyaW5nKXByb3BlcnRpZXNbY3VycmVudFByb3BlcnR5SW5kZXggLSAxXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBjaGFyW10gZ2V0VGV4dENoYXJhY3RlcnMoKSB7Ci0gICAgICAgIGlmIChzdGF0ZSA9PSBERUxFR0FURURfU1RBVEUpIHsKLSAgICAgICAgICAgIHJldHVybiBjaGlsZFJlYWRlci5nZXRUZXh0Q2hhcmFjdGVycygpOwotICAgICAgICB9IGVsc2UgaWYgKHN0YXRlID09IFRFWFRfU1RBVEUpIHsKLSAgICAgICAgICAgIHJldHVybiBwcm9wZXJ0aWVzW2N1cnJlbnRQcm9wZXJ0eUluZGV4IC0gMV0gPT0gbnVsbCA/IG5ldyBjaGFyWzBdIDoKLSAgICAgICAgICAgICAgICAgICAgKChTdHJpbmcpcHJvcGVydGllc1tjdXJyZW50UHJvcGVydHlJbmRleCAtIDFdKS50b0NoYXJBcnJheSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRUZXh0Q2hhcmFjdGVycyhpbnQgaSwgY2hhcltdIGNoYXJzLCBpbnQgaTEsIGludCBpMikKLSAgICAgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBpZiAoc3RhdGUgPT0gREVMRUdBVEVEX1NUQVRFKSB7Ci0gICAgICAgICAgICByZXR1cm4gY2hpbGRSZWFkZXIuZ2V0VGV4dENoYXJhY3RlcnMoaSwgY2hhcnMsIGkxLCBpMik7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT0gVEVYVF9TVEFURSkgewotICAgICAgICAgICAgLy90b2RvICAtIGltcGxlbWVudCB0aGlzCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0VGV4dFN0YXJ0KCkgewotICAgICAgICBpZiAoc3RhdGUgPT0gREVMRUdBVEVEX1NUQVRFKSB7Ci0gICAgICAgICAgICByZXR1cm4gY2hpbGRSZWFkZXIuZ2V0VGV4dFN0YXJ0KCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT0gVEVYVF9TVEFURSkgewotICAgICAgICAgICAgcmV0dXJuIDA7Ly9hc3N1bWUgdGV4dCBhbHdheXMgc3RhcnRzIGF0IDAKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0VGV4dExlbmd0aCgpIHsKLSAgICAgICAgaWYgKHN0YXRlID09IERFTEVHQVRFRF9TVEFURSkgewotICAgICAgICAgICAgcmV0dXJuIGNoaWxkUmVhZGVyLmdldFRleHRMZW5ndGgoKTsKLSAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PSBURVhUX1NUQVRFKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsvL2Fzc3VtZSB0ZXh0IGFsd2F5cyBzdGFydHMgYXQgMAotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRFbmNvZGluZygpIHsKLSAgICAgICAgaWYgKHN0YXRlID09IERFTEVHQVRFRF9TVEFURSkgewotICAgICAgICAgICAgcmV0dXJuIGNoaWxkUmVhZGVyLmdldEVuY29kaW5nKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvL3dlJ3ZlIG5vIGlkZWEgd2hhdCB0aGUgZW5jb2RpbmcgaXMgZ29pbmcgdG8gYmUgaW4gdGhpcyBjYXNlCi0gICAgICAgICAgICAvL3BlcmhhcHMgd2Ugb3VnaHQgdG8gcmV0dXJuIHNvbWUgY29uc3RhbnQgaGVyZSwgd2hpY2ggdGhlIHVzZXIgbWlnaHQKLSAgICAgICAgICAgIC8vaGF2ZSBhY2Nlc3MgdG8gY2hhbmdlIQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiogY2hlY2sgdGhlIHZhbGlkaXR5IG9mIHRoaXMgaW1wbGVtZW50YXRpb24gKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNUZXh0KCkgewotICAgICAgICBpZiAoc3RhdGUgPT0gREVMRUdBVEVEX1NUQVRFKSB7Ci0gICAgICAgICAgICByZXR1cm4gY2hpbGRSZWFkZXIuaGFzVGV4dCgpOwotICAgICAgICB9IGVsc2UgcmV0dXJuIHN0YXRlID09IFRFWFRfU1RBVEU7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKi8KLSAgICBwdWJsaWMgTG9jYXRpb24gZ2V0TG9jYXRpb24oKSB7Ci0gICAgICAgIC8vcmV0dXJuIGEgZGVmYXVsdCBsb2NhdGlvbgotICAgICAgICByZXR1cm4gbmV3IExvY2F0aW9uKCkgewotICAgICAgICAgICAgcHVibGljIGludCBnZXRMaW5lTnVtYmVyKCkgewotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgaW50IGdldENvbHVtbk51bWJlcigpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIGludCBnZXRDaGFyYWN0ZXJPZmZzZXQoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHVibGljSWQoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3lzdGVtSWQoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgfQotCi0gICAgcHVibGljIFFOYW1lIGdldE5hbWUoKSB7Ci0gICAgICAgIGlmIChzdGF0ZSA9PSBERUxFR0FURURfU1RBVEUpIHsKLSAgICAgICAgICAgIHJldHVybiBjaGlsZFJlYWRlci5nZXROYW1lKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RhdGUgIT0gVEVYVF9TVEFURSkgewotICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnRRTmFtZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRMb2NhbE5hbWUoKSB7Ci0gICAgICAgIGlmIChzdGF0ZSA9PSBERUxFR0FURURfU1RBVEUpIHsKLSAgICAgICAgICAgIHJldHVybiBjaGlsZFJlYWRlci5nZXRMb2NhbE5hbWUoKTsKLSAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSAhPSBURVhUX1NUQVRFKSB7Ci0gICAgICAgICAgICByZXR1cm4gZWxlbWVudFFOYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaGFzTmFtZSgpIHsKLSAgICAgICAgLy9zaW5jZSB0aGlzIHBhcnNlciBhbHdheXMgaGFzIGEgbmFtZSwgdGhlIGhhc25hbWUKLSAgICAgICAgLy9oYXMgdG8gcmV0dXJuIHRydWUgaWYgd2UgYXJlIHN0aWxsIG5hdmlnYXRpbmcgdGhpcyBlbGVtZW50Ci0gICAgICAgIC8vaWYgbm90IHdlIHNob3VsZCBhc2sgdGhlIGNoaWxkIHJlYWRlciBmb3IgaXQuCi0gICAgICAgIGlmIChzdGF0ZSA9PSBERUxFR0FURURfU1RBVEUpIHsKLSAgICAgICAgICAgIHJldHVybiBjaGlsZFJlYWRlci5oYXNOYW1lKCk7Ci0gICAgICAgIH0gZWxzZSByZXR1cm4gc3RhdGUgIT0gVEVYVF9TVEFURTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVVSSSgpIHsKLSAgICAgICAgaWYgKHN0YXRlID09IERFTEVHQVRFRF9TVEFURSkgewotICAgICAgICAgICAgcmV0dXJuIGNoaWxkUmVhZGVyLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICB9IGVsc2UgaWYgKHN0YXRlID09IFRFWFRfU1RBVEUpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnRRTmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KCkgewotICAgICAgICBpZiAoc3RhdGUgPT0gREVMRUdBVEVEX1NUQVRFKSB7Ci0gICAgICAgICAgICByZXR1cm4gY2hpbGRSZWFkZXIuZ2V0UHJlZml4KCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT0gVEVYVF9TVEFURSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gZWxlbWVudFFOYW1lLmdldFByZWZpeCgpOwotICAgICAgICAgICAgcmV0dXJuICIiLmVxdWFscyhwcmVmaXgpID8gbnVsbCA6IHByZWZpeDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNTdGFuZGFsb25lKCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBzdGFuZGFsb25lU2V0KCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENoYXJhY3RlckVuY29kaW5nU2NoZW1lKCkgewotICAgICAgICByZXR1cm4gbnVsbDsgICAvL3RvZG8gLSBzaG91bGQgd2UgcmV0dXJuIHNvbWV0aGluZyBmb3IgdGhpcyA/Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQSVRhcmdldCgpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJZZXQgdG8gYmUgaW1wbGVtZW50ZWQgISEiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBJRGF0YSgpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJZZXQgdG8gYmUgaW1wbGVtZW50ZWQgISEiKTsKLSAgICB9Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8vIE90aGVyIHV0aWxpdHkgbWV0aG9kcwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotCi0gICAgLyoqIFBvcHVsYXRlcyBhIG5hbWVzcGFjZSBjb250ZXh0ICovCi0gICAgcHJpdmF0ZSB2b2lkIHBvcHVsYXRlTmFtZXNwYWNlQ29udGV4dCgpIHsKLQotICAgICAgICAvL2ZpcnN0IGFkZCB0aGUgY3VycmVudCBlbGVtZW50IG5hbWVzcGFjZSB0byB0aGUgbmFtZXNwYWNlIGNvbnRleHQKLSAgICAgICAgLy9kZWNsYXJlIGl0IGlmIG5vdCBmb3VuZAotICAgICAgICBhZGRUb05zTWFwKGVsZW1lbnRRTmFtZS5nZXRQcmVmaXgoKSwgZWxlbWVudFFOYW1lLmdldE5hbWVzcGFjZVVSSSgpKTsKLQotICAgICAgICAvL3RyYXZlcnNlIHRocm91Z2ggdGhlIGF0dHJpYnV0ZXMgYW5kIHBvcHVsYXRlIHRoZSBuYW1lc3BhY2UgY29udGV4dAotICAgICAgICAvL3RoZSBhdHRyaWIgbGlzdCBjYW4gYmUgb2YgbWFueSBjb21iaW5hdGlvbnMKLSAgICAgICAgLy8gdGhlIHZhbGlkIGNvbWJpbmF0aW9ucyBhcmUKLSAgICAgICAgLy8gU3RyaW5nIC0gU3RyaW5nCi0gICAgICAgIC8vIFFOYW1lIC0gUU5hbWUKLSAgICAgICAgLy8gbnVsbCAtIE9NQXR0cmlidXRlCi0KLSAgICAgICAgaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzLmxlbmd0aDsgaSA9IGkgKyAyKSB7IC8vanVtcCBpbiB0d28KLSAgICAgICAgICAgICAgICBPYmplY3QgYXR0cmliTmFtZSA9IGF0dHJpYnV0ZXNbaV07Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYk5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAvL3RoaXMgc2hvdWxkIGJlIHRoZSBPTUF0dHJpYiBjYXNlIQotICAgICAgICAgICAgICAgICAgICBPTUF0dHJpYnV0ZSBPTUF0dHJpYiA9IChPTUF0dHJpYnV0ZSlhdHRyaWJ1dGVzW2kgKyAxXTsKLSAgICAgICAgICAgICAgICAgICAgT01OYW1lc3BhY2UgbmFtZXNwYWNlID0gT01BdHRyaWIuZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgYWRkVG9Oc01hcChuYW1lc3BhY2UuZ2V0UHJlZml4KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGF0dHJpYk5hbWUgaW5zdGFuY2VvZiBPTUF0dHJpYktleSkgewotICAgICAgICAgICAgICAgICAgICAvL3RoaXMgaXMgZGVmaW5pdGVseSB0aGUgT01BdHRyaWJ1dGUgY2FzZQotICAgICAgICAgICAgICAgICAgICBPTUF0dHJpYnV0ZSBPTUF0dHJpYiA9IChPTUF0dHJpYnV0ZSlhdHRyaWJ1dGVzW2kgKyAxXTsKLSAgICAgICAgICAgICAgICAgICAgT01OYW1lc3BhY2UgbmFtZXNwYWNlID0gT01BdHRyaWIuZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgYWRkVG9Oc01hcChuYW1lc3BhY2UuZ2V0UHJlZml4KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGF0dHJpYk5hbWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLSAgICAgICAgICAgICAgICAgICAgLy9pZ25vcmUgdGhpcyBjYXNlIC0gTm90aGluZyB0byBkbwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYXR0cmliTmFtZSBpbnN0YW5jZW9mIFFOYW1lKSB7Ci0gICAgICAgICAgICAgICAgICAgIFFOYW1lIGF0dHJpYlFOYW1lID0gKChRTmFtZSlhdHRyaWJOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkVG9Oc01hcChhdHRyaWJRTmFtZS5nZXRQcmVmaXgoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJRTmFtZS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHByZWZpeAotICAgICAqIEBwYXJhbSB1cmkKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYWRkVG9Oc01hcChTdHJpbmcgcHJlZml4LCBTdHJpbmcgdXJpKSB7Ci0gICAgICAgIGlmICghdXJpLmVxdWFscyhuYW1lc3BhY2VDb250ZXh0LmdldE5hbWVzcGFjZVVSSShwcmVmaXgpKSkgewotICAgICAgICAgICAgbmFtZXNwYWNlQ29udGV4dC5wdXNoTmFtZXNwYWNlKHByZWZpeCwgdXJpKTsKLSAgICAgICAgICAgIGRlY2xhcmVkTmFtZXNwYWNlTWFwLnB1dChwcmVmaXgsIHVyaSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBCeSBmYXIgdGhpcyBzaG91bGQgYmUgdGhlIG1vc3QgaW1wb3J0YW50IG1ldGhvZCBpbiB0aGlzIGNsYXNzIHRoaXMgbWV0aG9kIGNoYW5nZXMgdGhlIHN0YXRlCi0gICAgICogb2YgdGhlIHBhcnNlcgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgbmV4dCgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBpbnQgcmV0dXJuRXZlbnQgPSAtMTsgLy9pbnZhbGlkIHN0YXRlIGlzIHRoZSBkZWZhdWx0IHN0YXRlCi0gICAgICAgIHN3aXRjaCAoc3RhdGUpIHsKLSAgICAgICAgICAgIGNhc2UgU1RBUlRfRUxFTUVOVF9TVEFURToKLSAgICAgICAgICAgICAgICAvL2N1cnJlbnQgZWxlbWVudCBpcyBzdGFydCBlbGVtZW50LiBXZSBzaG91bGQgYmUgbG9va2luZyBhdCB0aGUKLSAgICAgICAgICAgICAgICAvL3Byb3BlcnR5IGxpc3QgYW5kIG1ha2luZyBhIHB1bGxwYXJzZXIgZm9yIHRoZSBwcm9wZXJ0eSB2YWx1ZQotICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0aWVzID09IG51bGwgfHwgcHJvcGVydGllcy5sZW5ndGggPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAvL25vIHByb3BlcnRpZXMgLSBtb3ZlIHRvIHRoZSBlbmQgZWxlbWVudCBzdGF0ZSBzdHJhaWdodGF3YXkKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBFTkRfRUxFTUVOVF9TVEFURTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuRXZlbnQgPSBFTkRfRUxFTUVOVDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvL3RoZXJlIGFyZSBwcm9wZXJ0aWVzLiBub3cgd2Ugc2hvdWxkIGRlbGVnYXRlIHRoaXMgdGFzayB0byBhCi0gICAgICAgICAgICAgICAgICAgIC8vY2hpbGQgcmVhZGVyIGRlcGVuZGluZyBvbiB0aGUgcHJvcGVydHkgdHlwZQotICAgICAgICAgICAgICAgICAgICByZXR1cm5FdmVudCA9IHByb2Nlc3NQcm9wZXJ0aWVzKCk7Ci0KLQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgRU5EX0VMRU1FTlRfU1RBVEU6Ci0gICAgICAgICAgICAgICAgLy93ZSd2ZSByZWFjaGVkIHRoZSBlbmQgZWxlbWVudCBhbHJlYWR5LiBJZiB0aGUgdXNlciB0cmllcyB0byBwdXNoCi0gICAgICAgICAgICAgICAgLy8gZnVydGhlciBhaGVhZCB0aGVuIGl0IGlzIGFuIGV4Y2VwdGlvbgotICAgICAgICAgICAgICAgIHRocm93IG5ldyBYTUxTdHJlYW1FeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAiVHJ5aW5nIHRvIGdvIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBwdWxscGFyc2VyIik7Ci0KLQotICAgICAgICAgICAgY2FzZSBERUxFR0FURURfU1RBVEU6Ci0gICAgICAgICAgICAgICAgaWYgKGNoaWxkUmVhZGVyLmlzRG9uZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vd2UndmUgcmVhY2hlZCB0aGUgZW5kIQotICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudFByb3BlcnR5SW5kZXggPiAocHJvcGVydGllcy5sZW5ndGggLSAxKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBFTkRfRUxFTUVOVF9TVEFURTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybkV2ZW50ID0gRU5EX0VMRU1FTlQ7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5FdmVudCA9IHByb2Nlc3NQcm9wZXJ0aWVzKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZXR1cm5FdmVudCA9IGNoaWxkUmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgVEVYVF9TVEFURToKLSAgICAgICAgICAgICAgICAvLyBpZiB0aGVyZSBhcmUgYW55IG1vcmUgZXZlbnQgd2Ugc2hvdWxkIGJlIGRlbGVnYXRpbmcgdG8KLSAgICAgICAgICAgICAgICAvLyBwcm9jZXNzUHJvcGVydGllcy4gaWYgbm90IHdlIGp1c3QgcmV0dXJuIGFuIGVuZCBlbGVtZW50Ci0gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRQcm9wZXJ0eUluZGV4ID4gKHByb3BlcnRpZXMubGVuZ3RoIC0gMSkpIHsKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBFTkRfRUxFTUVOVF9TVEFURTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuRXZlbnQgPSBFTkRfRUxFTUVOVDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZXR1cm5FdmVudCA9IHByb2Nlc3NQcm9wZXJ0aWVzKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXR1cm5FdmVudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBIGNvbnZlbmllbnQgbWV0aG9kIHRvIHJldXNlIHRoZSBwcm9wZXJ0aWVzCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGV2ZW50IHRvIGJlIHRocm93bgotICAgICAqIEB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSBpbnQgcHJvY2Vzc1Byb3BlcnRpZXMoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgLy9tb3ZlIHRvIHRoZSBuZXh0IHByb3BlcnR5IGRlcGVuZGluZyBvbiB0aGUgY3VycmVudCBwcm9wZXJ0eQotICAgICAgICAvL2luZGV4Ci0gICAgICAgIE9iamVjdCBwcm9wUG9pbnRlciA9IHByb3BlcnRpZXNbY3VycmVudFByb3BlcnR5SW5kZXhdOwotICAgICAgICBRTmFtZSBwcm9wZXJ0eVFOYW1lID0gbnVsbDsKLSAgICAgICAgYm9vbGVhbiB0ZXh0Rm91bmQgPSBmYWxzZTsKLSAgICAgICAgaWYgKHByb3BQb2ludGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBYTUxTdHJlYW1FeGNlcHRpb24oInByb3BlcnR5IGtleSBjYW5ub3QgYmUgbnVsbCEiKTsKLSAgICAgICAgfSBlbHNlIGlmIChwcm9wUG9pbnRlciBpbnN0YW5jZW9mIFN0cmluZykgewotICAgICAgICAgICAgLy8gcHJvcFBvaW50ZXIgYmVpbmcgYSBTdHJpbmcgaGFzIGEgc3BlY2lhbCBjYXNlCi0gICAgICAgICAgICAvLyB0aGF0IGlzIGl0IGNhbiBiZSBhIHRoZSBzcGVjaWFsIGNvbnN0YW50IEVMRU1FTlRfVEVYVCB0aGF0Ci0gICAgICAgICAgICAvLyBzYXlzIHRoaXMgdGV4dCBldmVudAotICAgICAgICAgICAgaWYgKEVMRU1FTlRfVEVYVC5lcXVhbHMocHJvcFBvaW50ZXIpKSB7Ci0gICAgICAgICAgICAgICAgdGV4dEZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcHJvcGVydHlRTmFtZSA9IG5ldyBRTmFtZSgoU3RyaW5nKXByb3BQb2ludGVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChwcm9wUG9pbnRlciBpbnN0YW5jZW9mIFFOYW1lKSB7Ci0gICAgICAgICAgICBwcm9wZXJ0eVFOYW1lID0gKFFOYW1lKXByb3BQb2ludGVyOwotICAgICAgICB9IGVsc2UgaWYgKHByb3BQb2ludGVyIGluc3RhbmNlb2YgT01FbGVtZW50S2V5KSB7Ci0gICAgICAgICAgICAvLyBhaCAtIGluIHRoaXMgY2FzZSB0aGVyZSdzIG5vdGhpbmcgdG8gYmUgZG9uZQotICAgICAgICAgICAgLy9hYm91dCB0aGUgcHJvcGVydHlRTmFtZSBpbiB0aGlzIGNhc2UgLSB3ZSdsbCBqdXN0IGxlYXZlCi0gICAgICAgICAgICAvL2l0IGFzIGl0IGlzCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvL29vcHMgLSB3ZSd2ZSBubyBpZGVhIHdoYXQga2luZCBvZiBrZXkgdGhpcyBpcwotICAgICAgICAgICAgdGhyb3cgbmV3IFhNTFN0cmVhbUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgInVuaWRlbnRpZmllZCBwcm9wZXJ0eSBrZXkhISEiICsgcHJvcFBvaW50ZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYocHJvcGVydHlRTmFtZSE9bnVsbCl7Ci0gICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gKFN0cmluZykgcW5hbWVNYXAuZ2V0KHByb3BlcnR5UU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgICAgICAgICAgaWYocHJlZml4IT1udWxsKXsKLSAgICAgICAgICAgICAgICBwcm9wZXJ0eVFOYW1lID0gbmV3IFFOYW1lKHByb3BlcnR5UU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkscHJvcGVydHlRTmFtZS5nZXRMb2NhbFBhcnQoKSxwcmVmaXgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy9vayEgd2UgZ290IHRoZSBrZXkuIE5vdyBsb29rIGF0IHRoZSB2YWx1ZQotICAgICAgICBPYmplY3QgcHJvcGVydHlWYWx1ZSA9IHByb3BlcnRpZXNbY3VycmVudFByb3BlcnR5SW5kZXggKyAxXTsKLSAgICAgICAgLy9jYXRlciBmb3IgdGhlIHNwZWNpYWwgY2FzZSBub3cKLSAgICAgICAgaWYgKHRleHRGb3VuZCkgewotICAgICAgICAgICAgLy9ubyBkZWxlZ2F0aW9uIGhlcmUgLSBtYWtlIHRoZSBwYXJzZXIgbnVsbCBhbmQgaW1tZWRpYXRlbHkKLSAgICAgICAgICAgIC8vcmV0dXJuIHdpdGggdGhlIGV2ZW50IGNoYXJhY3RlcnMKLSAgICAgICAgICAgIGNoaWxkUmVhZGVyID0gbnVsbDsKLSAgICAgICAgICAgIHN0YXRlID0gVEVYVF9TVEFURTsKLSAgICAgICAgICAgIGN1cnJlbnRQcm9wZXJ0eUluZGV4ID0gY3VycmVudFByb3BlcnR5SW5kZXggKyAyOwotICAgICAgICAgICAgcmV0dXJuIENIQVJBQ1RFUlM7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcGVydHlWYWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvL2lmIHRoZSB2YWx1ZSBpcyBudWxsIHdlIGRlbGVnYXRlIHRoZSB3b3JrIHRvIGEgbnVsbGFibGUKLSAgICAgICAgICAgIC8vIHBhcnNlcgotICAgICAgICAgICAgY2hpbGRSZWFkZXIgPSBuZXcgTnVsbFhNTFN0cmVhbVJlYWRlcihwcm9wZXJ0eVFOYW1lKTsKLSAgICAgICAgICAgIGNoaWxkUmVhZGVyLmFkZE5hbWVzcGFjZUNvbnRleHQodGhpcy5uYW1lc3BhY2VDb250ZXh0KTsKLSAgICAgICAgICAgIGNoaWxkUmVhZGVyLmluaXQoKTsKLQotICAgICAgICAgICAgLy93ZSd2ZSBhIHNwZWNpYWwgcHVsbHBhcnNlciBmb3IgYSBkYXRhaGFuZGxlciEKLSAgICAgICAgfSBlbHNlIGlmIChwcm9wZXJ0eVZhbHVlIGluc3RhbmNlb2YgRGF0YUhhbmRsZXIpIHsKLSAgICAgICAgICAgIGNoaWxkUmVhZGVyID0gbmV3IEFEQkRhdGFIYW5kbGVyU3RyZWFtUmVhZGVyKHByb3BlcnR5UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRGF0YUhhbmRsZXIpcHJvcGVydHlWYWx1ZSk7Ci0gICAgICAgICAgICBjaGlsZFJlYWRlci5hZGROYW1lc3BhY2VDb250ZXh0KHRoaXMubmFtZXNwYWNlQ29udGV4dCk7Ci0gICAgICAgICAgICBjaGlsZFJlYWRlci5pbml0KCk7Ci0KLSAgICAgICAgfSBlbHNlIGlmIChwcm9wZXJ0eVZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0gICAgICAgICAgICAvL3N0cmluZ3MgYXJlIGhhbmRsZWQgYnkgdGhlIE5hbWVWYWx1ZVBhaXJTdHJlYW1SZWFkZXIKLSAgICAgICAgICAgIGNoaWxkUmVhZGVyID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IE5hbWVWYWx1ZVBhaXJTdHJlYW1SZWFkZXIocHJvcGVydHlRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFN0cmluZylwcm9wZXJ0eVZhbHVlKTsKLSAgICAgICAgICAgIGNoaWxkUmVhZGVyLmFkZE5hbWVzcGFjZUNvbnRleHQodGhpcy5uYW1lc3BhY2VDb250ZXh0KTsKLSAgICAgICAgICAgIGNoaWxkUmVhZGVyLmluaXQoKTsKLSAgICAgICAgfSBlbHNlIGlmIChwcm9wZXJ0eVZhbHVlLmdldENsYXNzKCkuaXNBcnJheSgpKSB7Ci0gICAgICAgICAgICAvLyB0aGlzIGlzIGFuIGFycmFyeSBvYmplY3QgYW5kIHdlIG5lZWQgdG8gZ2V0IHRoZSBwdWxsIHBhcnNlciBmb3IgdGhhdAotICAgICAgICAgICAgaW50IGxlbmd0aCA9IEFycmF5LmdldExlbmd0aChwcm9wZXJ0eVZhbHVlKTsKLSAgICAgICAgICAgIGlmIChsZW5ndGggPT0gMCkgewotICAgICAgICAgICAgICAgIC8vYWR2YW5jZSB0aGUgaW5kZXgKLSAgICAgICAgICAgICAgICBjdXJyZW50UHJvcGVydHlJbmRleCA9IGN1cnJlbnRQcm9wZXJ0eUluZGV4ICsgMjsKLSAgICAgICAgICAgICAgICByZXR1cm4gcHJvY2Vzc1Byb3BlcnRpZXMoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgTGlzdCBvYmplY3RzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgIE9iamVjdCB2YWx1ZU9iamVjdCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAvL2ZvciBpbm50ZXIgQXJyYXJ5IENvbXBsZXggdHlwZXMgd2UgdXNlIHRoZSBzcGVjaWFsIGxvY2FsIG5hbWUgYXJyYXkKLSAgICAgICAgICAgICAgICAgICAgb2JqZWN0cy5hZGQobmV3IFFOYW1lKHByb3BlcnR5UU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCksICJhcnJheSIpKTsKLSAgICAgICAgICAgICAgICAgICAgdmFsdWVPYmplY3QgPSBBcnJheS5nZXQocHJvcGVydHlWYWx1ZSwgaSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgodmFsdWVPYmplY3QgIT0gbnVsbCkgJiYgU2ltcGxlVHlwZU1hcHBlci5pc1NpbXBsZVR5cGUodmFsdWVPYmplY3QpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdHMuYWRkKFNpbXBsZVR5cGVNYXBwZXIuZ2V0U3RyaW5nVmFsdWUodmFsdWVPYmplY3QpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdHMuYWRkKHZhbHVlT2JqZWN0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIEFEQlhNTFN0cmVhbVJlYWRlciByZWFkZXIgPSBuZXcgQURCWE1MU3RyZWFtUmVhZGVySW1wbChwcm9wZXJ0eVFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0cy50b0FycmF5KCksIG5ldyBBcnJheUxpc3QoKS50b0FycmF5KCksIHR5cGVUYWJsZSwgcXVhbGlmaWVkKTsKLSAgICAgICAgICAgICAgICBjaGlsZFJlYWRlciA9IG5ldyBXcmFwcGluZ1hNTFN0cmVhbVJlYWRlcihyZWFkZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5VmFsdWUgaW5zdGFuY2VvZiBBREJCZWFuKSB7Ci0gICAgICAgICAgICAvL0FEQmJlYW4gaGFzIGl0J3Mgb3duIG1ldGhvZCB0byBnZXQgYSByZWFkZXIKLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciByZWFkZXIgPSAoKEFEQkJlYW4pcHJvcGVydHlWYWx1ZSkuCi0gICAgICAgICAgICAgICAgICAgIGdldFB1bGxQYXJzZXIocHJvcGVydHlRTmFtZSk7Ci0gICAgICAgICAgICAvLyB3ZSBrbm93IGZvciBzdXJlIHRoYXQgdGhpcyBpcyBhbiBBREIgWE1MU3RyZWFtcmVhZGVyLgotICAgICAgICAgICAgLy8gSG93ZXZlciB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IGl0IGlzIGNvbXBhdGlibGUKLSAgICAgICAgICAgIGlmIChyZWFkZXIgaW5zdGFuY2VvZiBBREJYTUxTdHJlYW1SZWFkZXIpIHsKLSAgICAgICAgICAgICAgICBjaGlsZFJlYWRlciA9IChBREJYTUxTdHJlYW1SZWFkZXIpcmVhZGVyOwotICAgICAgICAgICAgICAgIGNoaWxkUmVhZGVyLmFkZE5hbWVzcGFjZUNvbnRleHQodGhpcy5uYW1lc3BhY2VDb250ZXh0KTsKLSAgICAgICAgICAgICAgICBjaGlsZFJlYWRlci5pbml0KCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vd3JhcCBpdCB0byBtYWtlIGNvbXBhdGlibGUKLSAgICAgICAgICAgICAgICBjaGlsZFJlYWRlciA9IG5ldyBXcmFwcGluZ1hNTFN0cmVhbVJlYWRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcGVydHlWYWx1ZSBpbnN0YW5jZW9mIE9NRWxlbWVudCkgewotICAgICAgICAgICAgLy9PTUVsZW1lbnRzIGRvIG5vdCBwcm92aWRlIHRoZSBraW5kIG9mIHBhcnNlciB3ZSBuZWVkCi0gICAgICAgICAgICAvL3RoZXJlIGlzIG5vIG90aGVyIG9wdGlvbiB0aGFuIHdyYXBwaW5nCi0gICAgICAgICAgICBjaGlsZFJlYWRlciA9IG5ldyBXcmFwcGluZ1hNTFN0cmVhbVJlYWRlcigKLSAgICAgICAgICAgICAgICAgICAgKChPTUVsZW1lbnQpcHJvcGVydHlWYWx1ZSkuZ2V0WE1MU3RyZWFtUmVhZGVyKCkpOwotICAgICAgICAgICAgLy93ZSBjYW5ub3QgcmVnaXN0ZXIgdGhlIG5hbWVzcGFjZSBjb250ZXh0IGhlcmUhIQotCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvL2FsbCBzcGVjaWFsIHBvc3NpYmxpbGl0aWVzIGhhcyBiZWVuIHRyaWVkISBMZXQncyB0cmVhdAotICAgICAgICAgICAgLy90aGUgdGhpbmcgYXMgYSBiZWFuIGFuZCB0cnkgZ2VuZXJhdGluZyBldmVudHMgZnJvbSBpdAotICAgICAgICAgICAgY2hpbGRSZWFkZXIgPSBuZXcgV3JhcHBpbmdYTUxTdHJlYW1SZWFkZXIKLSAgICAgICAgICAgICAgICAgICAgKEJlYW5VdGlsLmdldFB1bGxQYXJzZXIocHJvcGVydHlWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlRTmFtZSwgdHlwZVRhYmxlLCBxdWFsaWZpZWQsIGZhbHNlKSk7Ci0gICAgICAgICAgICAvL3dlIGNhbm5vdCByZWdpc3RlciB0aGUgbmFtZXNwYWNlIGNvbnRleHQgaGVyZQotICAgICAgICB9Ci0KLSAgICAgICAgLy9zZXQgdGhlIHN0YXRlIGhlcmUKLSAgICAgICAgc3RhdGUgPSBERUxFR0FURURfU1RBVEU7Ci0gICAgICAgIC8vd2UgYXJlIGRvbmUgd2l0aCB0aGUgZGVsZWdhdGlvbgotICAgICAgICAvL2luY3JlbWVudCB0aGUgcHJvcGVydHkgaW5kZXgKLSAgICAgICAgY3VycmVudFByb3BlcnR5SW5kZXggPSBjdXJyZW50UHJvcGVydHlJbmRleCArIDI7Ci0gICAgICAgIC8vIElmIG5lY2Vzc2FyeSwgZGlzY2FyZCB0aGUgU1RBUlRfRE9DVU1FTlQgZWxlbWVudCAoQVhJUzItNDI3MSkKLSAgICAgICAgaW50IGV2ZW50VHlwZSA9IGNoaWxkUmVhZGVyLmdldEV2ZW50VHlwZSgpOwotICAgICAgICByZXR1cm4gZXZlbnRUeXBlID09IFNUQVJUX0RPQ1VNRU5UID8gY2hpbGRSZWFkZXIubmV4dCgpIDogZXZlbnRUeXBlOwotICAgIH0KLQotICAgIC8qKiBhcmUgd2UgZG9uZSA/ICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNEb25lKCkgewotICAgICAgICByZXR1cm4gKHN0YXRlID09IEVORF9FTEVNRU5UX1NUQVRFKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy91dGlscy9yZWFkZXIvTmFtZVZhbHVlQXJyYXlTdHJlYW1SZWFkZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy91dGlscy9yZWFkZXIvTmFtZVZhbHVlQXJyYXlTdHJlYW1SZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmVmYTExMy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdXRpbHMvcmVhZGVyL05hbWVWYWx1ZUFycmF5U3RyZWFtUmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlcjsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuTmFtZXNwYWNlQ29udGV4dDsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uTG9jYXRpb247Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBOYW1lVmFsdWVBcnJheVN0cmVhbVJlYWRlciBpbXBsZW1lbnRzIEFEQlhNTFN0cmVhbVJlYWRlciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBUlRfRUxFTUVOVF9TVEFURSA9IDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRFWFRfU1RBVEUgPSAxOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFTkRfRUxFTUVOVF9TVEFURSA9IDI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZJTkFMX0VORF9FTEVNRU5UX1NUQVRFID0gMzsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBUlRfRUxFTUVOVF9TVEFURV9XSVRIX05VTEwgPSA0OwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUU5hbWUgTklMX1FOQU1FID0KLSAgICAgICAgICAgIG5ldyBRTmFtZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCAibmlsIiwgInhzaSIpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOSUxfVkFMVUVfVFJVRSA9ICJ0cnVlIjsKLQotCi0gICAgcHJpdmF0ZSBBREJOYW1lc3BhY2VDb250ZXh0IG5hbWVzcGFjZUNvbnRleHQgPQotICAgICAgICAgICAgbmV3IEFEQk5hbWVzcGFjZUNvbnRleHQoKTsKLSAgICAvL3RoZSBpbmRleCBvZiB0aGUgYXJyYXkKLSAgICBwcml2YXRlIGludCBhcnJheUluZGV4ID0gMDsKLQotICAgIHByaXZhdGUgUU5hbWUgbmFtZTsKLSAgICBwcml2YXRlIFN0cmluZ1tdIHZhbHVlczsKLQotICAgIC8vc3RhcnQgZWxlbWVudCBpcyB0aGUgZGVmYXVsdCBzdGF0ZQotICAgIHByaXZhdGUgaW50IHN0YXRlID0gU1RBUlRfRUxFTUVOVF9TVEFURTsKLQotCi0gICAgcHVibGljIE5hbWVWYWx1ZUFycmF5U3RyZWFtUmVhZGVyKFFOYW1lIG5hbWUsIFN0cmluZ1tdIHZhbHVlcykgewotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgICAgICB0aGlzLnZhbHVlcyA9IHZhbHVlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGROYW1lc3BhY2VDb250ZXh0KE5hbWVzcGFjZUNvbnRleHQgbnNDb250ZXh0KSB7Ci0gICAgICAgIHRoaXMubmFtZXNwYWNlQ29udGV4dC5zZXRQYXJlbnROc0NvbnRleHQobnNDb250ZXh0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbml0KCkgewotICAgICAgICAvL3RvZG8gd2hhdCBpZiB0aGUgUW5hbWUgbmFtZXNwYWNlIGhhcyBub3QgYmVlbiBkZWNsYXJlZAotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHN0cmluZykgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKiBAdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiAgKi8KLSAgICBwdWJsaWMgaW50IG5leHQoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgc3dpdGNoIChzdGF0ZSkgewotICAgICAgICAgICAgY2FzZSBTVEFSVF9FTEVNRU5UX1NUQVRFOgotICAgICAgICAgICAgICAgIGlmICh2YWx1ZXMubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IFRFWFRfU1RBVEU7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBDSEFSQUNURVJTOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXRlID0gRklOQUxfRU5EX0VMRU1FTlRfU1RBVEU7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBFTkRfRUxFTUVOVDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgU1RBUlRfRUxFTUVOVF9TVEFURV9XSVRIX05VTEw6Ci0gICAgICAgICAgICAgICAgaWYgKGFycmF5SW5kZXggPT0gKHZhbHVlcy5sZW5ndGggLSAxKSkgewotICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IEZJTkFMX0VORF9FTEVNRU5UX1NUQVRFOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXRlID0gRU5EX0VMRU1FTlRfU1RBVEU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBFTkRfRUxFTUVOVDsKLSAgICAgICAgICAgIGNhc2UgRklOQUxfRU5EX0VMRU1FTlRfU1RBVEU6Ci0gICAgICAgICAgICAgICAgLy9vb3BzLCBub3Qgc3VwcG9zZWQgdG8gaGFwcGVuIQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBYTUxTdHJlYW1FeGNlcHRpb24oImVuZCBhbHJlYWR5IHJlYWNoZWQhIik7Ci0gICAgICAgICAgICBjYXNlIEVORF9FTEVNRU5UX1NUQVRFOgotICAgICAgICAgICAgICAgIC8vd2UndmUgdG8gaGF2ZSBtb3JlIHZhbHVlcyBzaW5jZSB0aGlzIGlzIG5vdCB0aGUKLSAgICAgICAgICAgICAgICAvL2xhc3QgdmFsdWUKLSAgICAgICAgICAgICAgICAvL2luY3JlbWVudCB0aGUgY291bnRlcgotICAgICAgICAgICAgICAgIGFycmF5SW5kZXgrKzsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWVzW2FycmF5SW5kZXhdID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBTVEFSVF9FTEVNRU5UX1NUQVRFX1dJVEhfTlVMTDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IFNUQVJUX0VMRU1FTlRfU1RBVEU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBTVEFSVF9FTEVNRU5UOwotICAgICAgICAgICAgY2FzZSBURVhUX1NUQVRFOgotICAgICAgICAgICAgICAgIGlmIChhcnJheUluZGV4ID09ICh2YWx1ZXMubGVuZ3RoIC0gMSkpIHsKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBGSU5BTF9FTkRfRUxFTUVOVF9TVEFURTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVORF9FTEVNRU5UOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXRlID0gRU5EX0VMRU1FTlRfU1RBVEU7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBFTkRfRUxFTUVOVDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhNTFN0cmVhbUV4Y2VwdGlvbigidW5rbm93biBldmVudCB0eXBlISIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVxdWlyZShpbnQgaSwgU3RyaW5nIHN0cmluZywgU3RyaW5nIHN0cmluZzEpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAvL25vdGhpbmcgZG9uZSBoZXJlCi0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRFbGVtZW50VGV4dCgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbnVsbDsgLy9ub3QgaW1wbGVtZW50ZWQKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IG5leHRUYWcoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIDA7IC8vbm90IGltcGxlbWVudGVkCi0gICAgfQotCi0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZVZhbHVlKFN0cmluZyBzdHJpbmcsIFN0cmluZyBzdHJpbmcxKSB7Ci0gICAgICAgIGlmIChzdGF0ZSA9PSBURVhUX1NUQVRFKSB7Ci0gICAgICAgICAgICAvL3RvZG8gc29tZXRoaW5nCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldEF0dHJpYnV0ZUNvdW50KCkgewotICAgICAgICBpZiAoc3RhdGUgPT0gU1RBUlRfRUxFTUVOVF9TVEFURV9XSVRIX05VTEwpIHJldHVybiAxOwotICAgICAgICBpZiAoc3RhdGUgPT0gU1RBUlRfRUxFTUVOVF9TVEFURSkgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHB1YmxpYyBRTmFtZSBnZXRBdHRyaWJ1dGVOYW1lKGludCBpKSB7Ci0gICAgICAgIGlmIChzdGF0ZSA9PSBTVEFSVF9FTEVNRU5UX1NUQVRFX1dJVEhfTlVMTCAmJiBpID09IDApCi0gICAgICAgICAgICByZXR1cm4gTklMX1FOQU1FOwotICAgICAgICBpZiAoc3RhdGUgPT0gU1RBUlRfRUxFTUVOVF9TVEFURSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZU5hbWVzcGFjZShpbnQgaSkgewotICAgICAgICBpZiAoc3RhdGUgPT0gU1RBUlRfRUxFTUVOVF9TVEFURV9XSVRIX05VTEwgJiYgaSA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIE5JTF9RTkFNRS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgaWYgKHN0YXRlID09IFNUQVJUX0VMRU1FTlRfU1RBVEUpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVMb2NhbE5hbWUoaW50IGkpIHsKLSAgICAgICAgaWYgKHN0YXRlID09IFNUQVJUX0VMRU1FTlRfU1RBVEVfV0lUSF9OVUxMICYmIGkgPT0gMCkKLSAgICAgICAgICAgIHJldHVybiBOSUxfUU5BTUUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgIGlmIChzdGF0ZSA9PSBTVEFSVF9FTEVNRU5UX1NUQVRFKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlUHJlZml4KGludCBpKSB7Ci0gICAgICAgIGlmIChzdGF0ZSA9PSBTVEFSVF9FTEVNRU5UX1NUQVRFX1dJVEhfTlVMTCAmJiBpID09IDApCi0gICAgICAgICAgICByZXR1cm4gTklMX1FOQU1FLmdldFByZWZpeCgpOwotICAgICAgICBpZiAoc3RhdGUgPT0gU1RBUlRfRUxFTUVOVF9TVEFURSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZVR5cGUoaW50IGkpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7ICAvL25vdCBpbXBsZW1lbnRlZAotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlVmFsdWUoaW50IGkpIHsKLSAgICAgICAgaWYgKHN0YXRlID09IFNUQVJUX0VMRU1FTlRfU1RBVEVfV0lUSF9OVUxMICYmIGkgPT0gMCkKLSAgICAgICAgICAgIHJldHVybiBOSUxfVkFMVUVfVFJVRTsKLSAgICAgICAgaWYgKHN0YXRlID09IFNUQVJUX0VMRU1FTlRfU1RBVEUpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNBdHRyaWJ1dGVTcGVjaWZpZWQoaW50IGkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOyAvL25vdCBzdXBwb3J0ZWQKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldE5hbWVzcGFjZUNvdW50KCkgewotICAgICAgICBpZiAoc3RhdGUgPT0gU1RBUlRfRUxFTUVOVF9TVEFURV9XSVRIX05VTEwgJiYgaXNYc2lOYW1lc3BhY2VQcmVzZW50KCkpCi0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVByZWZpeChpbnQgaSkgewotICAgICAgICBpZiAoc3RhdGUgPT0gU1RBUlRfRUxFTUVOVF9TVEFURV9XSVRIX05VTEwKLSAgICAgICAgICAgICAgICAmJiBpc1hzaU5hbWVzcGFjZVByZXNlbnQoKSAmJiBpID09IDApCi0gICAgICAgICAgICByZXR1cm4gTklMX1FOQU1FLmdldFByZWZpeCgpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVVSSShpbnQgaSkgewotICAgICAgICBpZiAoc3RhdGUgPT0gU1RBUlRfRUxFTUVOVF9TVEFURV9XSVRIX05VTEwKLSAgICAgICAgICAgICAgICAmJiBpc1hzaU5hbWVzcGFjZVByZXNlbnQoKSAmJiBpID09IDApCi0gICAgICAgICAgICByZXR1cm4gTklMX1FOQU1FLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTmFtZXNwYWNlQ29udGV4dCBnZXROYW1lc3BhY2VDb250ZXh0KCkgewotICAgICAgICByZXR1cm4gdGhpcy5uYW1lc3BhY2VDb250ZXh0OwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRG9uZSgpIHsKLSAgICAgICAgcmV0dXJuIChzdGF0ZSA9PSBGSU5BTF9FTkRfRUxFTUVOVF9TVEFURSk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRFdmVudFR5cGUoKSB7Ci0gICAgICAgIHN3aXRjaCAoc3RhdGUpIHsKLSAgICAgICAgICAgIGNhc2UgU1RBUlRfRUxFTUVOVF9TVEFURToKLSAgICAgICAgICAgICAgICByZXR1cm4gU1RBUlRfRUxFTUVOVDsKLSAgICAgICAgICAgIGNhc2UgRU5EX0VMRU1FTlRfU1RBVEU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVORF9FTEVNRU5UOwotICAgICAgICAgICAgY2FzZSBURVhUX1NUQVRFOgotICAgICAgICAgICAgICAgIHJldHVybiBDSEFSQUNURVJTOwotICAgICAgICAgICAgY2FzZSBGSU5BTF9FTkRfRUxFTUVOVF9TVEFURToKLSAgICAgICAgICAgICAgICByZXR1cm4gRU5EX0VMRU1FTlQ7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgICAgICAgICAgICAgIC8vd2UndmUgbm8gaWRlYSB3aGF0IHRoaXMgaXMhISEhIQotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0gICAgICAgIGlmIChzdGF0ZSA9PSBURVhUX1NUQVRFKSB7Ci0gICAgICAgICAgICByZXR1cm4gdmFsdWVzW2FycmF5SW5kZXhdOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGNoYXJbXSBnZXRUZXh0Q2hhcmFjdGVycygpIHsKLSAgICAgICAgaWYgKHN0YXRlID09IFRFWFRfU1RBVEUpIHsKLSAgICAgICAgICAgIHJldHVybiB2YWx1ZXNbYXJyYXlJbmRleF0udG9DaGFyQXJyYXkoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0VGV4dENoYXJhY3RlcnMoaW50IGksIGNoYXJbXSBjaGFycywgaW50IGkxLCBpbnQgaTIpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAvL25vdCBpbXBsZW1lbnRlZAotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldFRleHRTdGFydCgpIHsKLSAgICAgICAgaWYgKHN0YXRlID09IFRFWFRfU1RBVEUpIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRUZXh0TGVuZ3RoKCkgewotICAgICAgICBpZiAoc3RhdGUgPT0gVEVYVF9TVEFURSkgewotICAgICAgICAgICAgcmV0dXJuIHZhbHVlc1thcnJheUluZGV4XS5sZW5ndGgoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRFbmNvZGluZygpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaGFzVGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIChzdGF0ZSA9PSBURVhUX1NUQVRFKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTG9jYXRpb24gZ2V0TG9jYXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBudWxsOyAgLy9ub3Qgc3VwcG9ydGVkCi0gICAgfQotCi0gICAgcHVibGljIFFOYW1lIGdldE5hbWUoKSB7Ci0gICAgICAgIGlmIChzdGF0ZSAhPSBURVhUX1NUQVRFKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmFtZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRMb2NhbE5hbWUoKSB7Ci0gICAgICAgIGlmIChzdGF0ZSAhPSBURVhUX1NUQVRFKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaGFzTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIChzdGF0ZSAhPSBURVhUX1NUQVRFKTsKLQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKCkgewotICAgICAgICBpZiAoc3RhdGUgIT0gVEVYVF9TVEFURSkgewotICAgICAgICAgICAgcmV0dXJuIG5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQcmVmaXgoKSB7Ci0gICAgICAgIGlmIChzdGF0ZSAhPSBURVhUX1NUQVRFKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmFtZS5nZXRQcmVmaXgoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRWZXJzaW9uKCkgewotICAgICAgICByZXR1cm4gbnVsbDsgIC8vdG9kbyAxLjAgPwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzU3RhbmRhbG9uZSgpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHN0YW5kYWxvbmVTZXQoKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENoYXJhY3RlckVuY29kaW5nU2NoZW1lKCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBJVGFyZ2V0KCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBJRGF0YSgpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gKHN0YXRlICE9IEZJTkFMX0VORF9FTEVNRU5UX1NUQVRFKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAvL0RvIG5vdGhpbmcgLSB3ZSd2ZSBub3RoaW5nIHRvIGZyZWUgaGVyZQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKFN0cmluZyBwcmVmaXgpIHsKLSAgICAgICAgcmV0dXJuIG5hbWVzcGFjZUNvbnRleHQuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNTdGFydEVsZW1lbnQoKSB7Ci0gICAgICAgIHJldHVybiAoc3RhdGUgPT0gU1RBUlRfRUxFTUVOVF9TVEFURSk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbmRFbGVtZW50KCkgewotICAgICAgICByZXR1cm4gKHN0YXRlID09IEVORF9FTEVNRU5UX1NUQVRFKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0NoYXJhY3RlcnMoKSB7Ci0gICAgICAgIHJldHVybiAoc3RhdGUgPT0gVEVYVF9TVEFURSk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNXaGl0ZVNwYWNlKCkgewotICAgICAgICByZXR1cm4gZmFsc2U7ICAvL25vIHdoaXRlc3BhY2VzIGhlcmUKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gcHJlZml4Ci0gICAgICogQHBhcmFtIHVyaQotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBhZGRUb05zTWFwKFN0cmluZyBwcmVmaXgsIFN0cmluZyB1cmkpIHsKLSAgICAgICAgLy90b2RvIC0gbmVlZCB0byBmaXggdGhpcyB1cCB0byBjYXRlciBmb3IgY2FzZXMgd2hlcmUKLSAgICAgICAgLy9uYW1lc3BhY2VzIGFyZSBoYXZpbmcgIG5vIHByZWZpeGVzCi0gICAgICAgIGlmICghdXJpLmVxdWFscyhuYW1lc3BhY2VDb250ZXh0LmdldE5hbWVzcGFjZVVSSShwcmVmaXgpKSkgewotICAgICAgICAgICAgLy90aGlzIG5hbWVzcGFjZSBpcyBub3QgdGhlcmUuIE5lZWQgdG8gZGVjbGFyZSBpdAotICAgICAgICAgICAgbmFtZXNwYWNlQ29udGV4dC5wdXNoTmFtZXNwYWNlKHByZWZpeCwgdXJpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKiBUZXN0IHdoZXRoZXIgdGhlIHhzaSBuYW1lc3BhY2UgaXMgcHJlc2VudCAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBpc1hzaU5hbWVzcGFjZVByZXNlbnQoKSB7Ci0gICAgICAgIHJldHVybiAobmFtZXNwYWNlQ29udGV4dC5nZXROYW1lc3BhY2VVUkkoTklMX1FOQU1FLmdldFByZWZpeCgpKSAhPSBudWxsKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdXRpbHMvcmVhZGVyL05hbWVWYWx1ZVBhaXJTdHJlYW1SZWFkZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy91dGlscy9yZWFkZXIvTmFtZVZhbHVlUGFpclN0cmVhbVJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODAxYmJmLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy91dGlscy9yZWFkZXIvTmFtZVZhbHVlUGFpclN0cmVhbVJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXI7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLk5hbWVzcGFjZUNvbnRleHQ7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLkxvY2F0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgTmFtZVZhbHVlUGFpclN0cmVhbVJlYWRlciBpbXBsZW1lbnRzIEFEQlhNTFN0cmVhbVJlYWRlciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBUlRfRUxFTUVOVF9TVEFURSA9IDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRFWFRfU1RBVEUgPSAxOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFTkRfRUxFTUVOVF9TVEFURSA9IDI7Ci0KLSAgICBwcml2YXRlIEFEQk5hbWVzcGFjZUNvbnRleHQgbmFtZXNwYWNlQ29udGV4dCA9Ci0gICAgICAgICAgICBuZXcgQURCTmFtZXNwYWNlQ29udGV4dCgpOwotCi0gICAgcHJpdmF0ZSBRTmFtZSBuYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIHZhbHVlOwotCi0gICAgcHJpdmF0ZSBpbnQgc3RhdGUgPSBTVEFSVF9FTEVNRU5UX1NUQVRFOwotICAgIC8vaW5pdGlhdGUgYXQgdGhlIHN0YXJ0IGVsZW1lbnQgc3RhdGUKLQotICAgIC8va2VlcHMgdHJhY2sgd2hldGhlciB0aGUgbmFtZXNwYWNlIGlzIGRlY2xhcmVkCi0gICAgLy9mYWxzZSBieSBkZWZhdWx0Ci0gICAgcHJpdmF0ZSBib29sZWFuIG5zRGVjbGFyZWQgPSBmYWxzZTsKLQotICAgIHB1YmxpYyBOYW1lVmFsdWVQYWlyU3RyZWFtUmVhZGVyKFFOYW1lIG5hbWUsIFN0cmluZyB2YWx1ZSkgewotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcga2V5KSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLSAgICAgICAgLy9zaW5jZSBvcHRpbWl6YXRpb24gaXMgYSBnbG9iYWwgcHJvcGVydHkKLSAgICAgICAgLy93ZSd2ZSB0byBpbXBsZW1lbnQgaXQgZXZlcnl3aGVyZQotICAgICAgICBpZiAoT1BUSU1JWkFUSU9OX0VOQUJMRUQuZXF1YWxzKGtleSkpIHsKLSAgICAgICAgICAgIHJldHVybiBCb29sZWFuLlRSVUU7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT0gVEVYVF9TVEFURSkgewotICAgICAgICAgICAgaWYgKElTX0JJTkFSWS5lcXVhbHMoa2V5KSkgewotICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuLkZBTFNFOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGludCBuZXh0KCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vbm8gbmVlZCB0byBoYW5kbGUgbnVsbCBoZXJlLiBpdCBzaG91bGQgaGF2ZSBiZWVuIGhhbmRsZWQKLSAgICAgICAgLy9hbHJlYWR5Ci0gICAgICAgIHN3aXRjaCAoc3RhdGUpIHsKLSAgICAgICAgICAgIGNhc2UgU1RBUlRfRUxFTUVOVF9TVEFURToKLSAgICAgICAgICAgICAgICBzdGF0ZSA9IFRFWFRfU1RBVEU7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIENIQVJBQ1RFUlM7Ci0gICAgICAgICAgICBjYXNlIEVORF9FTEVNRU5UX1NUQVRFOgotICAgICAgICAgICAgICAgIC8vb29wcywgbm90IHN1cHBvc2VkIHRvIGhhcHBlbiEKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWE1MU3RyZWFtRXhjZXB0aW9uKCJlbmQgYWxyZWFkeSByZWFjaGVkISIpOwotICAgICAgICAgICAgY2FzZSBURVhUX1NUQVRFOgotICAgICAgICAgICAgICAgIHN0YXRlID0gRU5EX0VMRU1FTlRfU1RBVEU7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVORF9FTEVNRU5UOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWE1MU3RyZWFtRXhjZXB0aW9uKCJ1bmtub3duIGV2ZW50IHR5cGUhIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZXF1aXJlKGludCBpLCBTdHJpbmcgc3RyaW5nLCBTdHJpbmcgc3RyaW5nMSkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vbm90IGltcGxlbWVudGVkCi0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRFbGVtZW50VGV4dCgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBpZiAoc3RhdGUgPT0gU1RBUlRfRUxFTUVOVCkgewotICAgICAgICAgICAgLy9tb3ZlIHRvIHRoZSBlbmQgc3RhdGUgYW5kIHJldHVybiB0aGUgdmFsdWUKLSAgICAgICAgICAgIHN0YXRlID0gRU5EX0VMRU1FTlRfU1RBVEU7Ci0gICAgICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgWE1MU3RyZWFtRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgbmV4dFRhZygpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gMDsvL3RvZG8KLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiAoc3RhdGUgIT0gRU5EX0VMRU1FTlRfU1RBVEUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vRG8gbm90aGluZyAtIHdlJ3ZlIG5vdGhpbmcgdG8gZnJlZSBoZXJlCi0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VVUkkoU3RyaW5nIHByZWZpeCkgewotICAgICAgICByZXR1cm4gbmFtZXNwYWNlQ29udGV4dC5nZXROYW1lc3BhY2VVUkkocHJlZml4KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1N0YXJ0RWxlbWVudCgpIHsKLSAgICAgICAgcmV0dXJuIChzdGF0ZSA9PSBTVEFSVF9FTEVNRU5UX1NUQVRFKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VuZEVsZW1lbnQoKSB7Ci0gICAgICAgIHJldHVybiAoc3RhdGUgPT0gRU5EX0VMRU1FTlRfU1RBVEUpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQ2hhcmFjdGVycygpIHsKLSAgICAgICAgcmV0dXJuIChzdGF0ZSA9PSBURVhUX1NUQVRFKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1doaXRlU3BhY2UoKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsgIC8vbm8gd2hpdGVzcGFjZXMgaGVyZQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlVmFsdWUoU3RyaW5nIHN0cmluZywgU3RyaW5nIHN0cmluZzEpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRBdHRyaWJ1dGVDb3VudCgpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgcHVibGljIFFOYW1lIGdldEF0dHJpYnV0ZU5hbWUoaW50IGkpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVOYW1lc3BhY2UoaW50IGkpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVMb2NhbE5hbWUoaW50IGkpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVQcmVmaXgoaW50IGkpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVUeXBlKGludCBpKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlVmFsdWUoaW50IGkpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNBdHRyaWJ1dGVTcGVjaWZpZWQoaW50IGkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOyAvL25vIGF0dHJpYnMgaGVyZQotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0TmFtZXNwYWNlQ291bnQoKSB7Ci0gICAgICAgIHJldHVybiAobnNEZWNsYXJlZCkgPyAxIDogMDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVByZWZpeChpbnQgaSkgewotICAgICAgICByZXR1cm4gKG5zRGVjbGFyZWQgJiYgaSA9PSAwKSA/IG5hbWUuZ2V0UHJlZml4KCkgOiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKGludCBpKSB7Ci0gICAgICAgIHJldHVybiAobnNEZWNsYXJlZCAmJiBpID09IDApID8gbmFtZS5nZXROYW1lc3BhY2VVUkkoKSA6IG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIE5hbWVzcGFjZUNvbnRleHQgZ2V0TmFtZXNwYWNlQ29udGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMubmFtZXNwYWNlQ29udGV4dDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldEV2ZW50VHlwZSgpIHsKLSAgICAgICAgc3dpdGNoIChzdGF0ZSkgewotICAgICAgICAgICAgY2FzZSBTVEFSVF9FTEVNRU5UX1NUQVRFOgotICAgICAgICAgICAgICAgIHJldHVybiBTVEFSVF9FTEVNRU5UOwotICAgICAgICAgICAgY2FzZSBFTkRfRUxFTUVOVF9TVEFURToKLSAgICAgICAgICAgICAgICByZXR1cm4gRU5EX0VMRU1FTlQ7Ci0gICAgICAgICAgICBjYXNlIFRFWFRfU1RBVEU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIENIQVJBQ1RFUlM7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgICAgICAgICAgICAgIC8vd2UndmUgbm8gaWRlYSB3aGF0IHRoaXMgaXMhISEhIQotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0gICAgICAgIGlmIChzdGF0ZSA9PSBURVhUX1NUQVRFKSB7Ci0gICAgICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgY2hhcltdIGdldFRleHRDaGFyYWN0ZXJzKCkgewotICAgICAgICBpZiAoc3RhdGUgPT0gVEVYVF9TVEFURSkgewotICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnRvQ2hhckFycmF5KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldFRleHRDaGFyYWN0ZXJzKGludCBpLCBjaGFyW10gY2hhcnMsIGludCBpMSwgaW50IGkyKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgLy9ub3QgaW1wbGVtZW50ZWQKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRUZXh0U3RhcnQoKSB7Ci0gICAgICAgIGlmIChzdGF0ZSA9PSBURVhUX1NUQVRFKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0VGV4dExlbmd0aCgpIHsKLSAgICAgICAgaWYgKHN0YXRlID09IFRFWFRfU1RBVEUpIHsKLSAgICAgICAgICAgIHJldHVybiB2YWx1ZS5sZW5ndGgoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRFbmNvZGluZygpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaGFzVGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIChzdGF0ZSA9PSBURVhUX1NUQVRFKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTG9jYXRpb24gZ2V0TG9jYXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTG9jYXRpb24oKSB7Ci0gICAgICAgICAgICBwdWJsaWMgaW50IGdldExpbmVOdW1iZXIoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBpbnQgZ2V0Q29sdW1uTnVtYmVyKCkgewotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgaW50IGdldENoYXJhY3Rlck9mZnNldCgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRQdWJsaWNJZCgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRTeXN0ZW1JZCgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUU5hbWUgZ2V0TmFtZSgpIHsKLSAgICAgICAgaWYgKHN0YXRlICE9IFRFWFRfU1RBVEUpIHsKLSAgICAgICAgICAgIHJldHVybiBuYW1lOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldExvY2FsTmFtZSgpIHsKLSAgICAgICAgaWYgKHN0YXRlICE9IFRFWFRfU1RBVEUpIHsKLSAgICAgICAgICAgIHJldHVybiBuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNOYW1lKCkgewotICAgICAgICByZXR1cm4gKHN0YXRlICE9IFRFWFRfU1RBVEUpOwotCi0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VVUkkoKSB7Ci0gICAgICAgIGlmIChzdGF0ZSAhPSBURVhUX1NUQVRFKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByZWZpeCgpIHsKLSAgICAgICAgaWYgKHN0YXRlICE9IFRFWFRfU1RBVEUpIHsKLSAgICAgICAgICAgIHJldHVybiBuYW1lLmdldFByZWZpeCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFZlcnNpb24oKSB7Ci0gICAgICAgIHJldHVybiBudWxsOyAgLy90b2RvIDEuMCA/Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNTdGFuZGFsb25lKCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gc3RhbmRhbG9uZVNldCgpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2hhcmFjdGVyRW5jb2RpbmdTY2hlbWUoKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UElUYXJnZXQoKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UElEYXRhKCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0RvbmUoKSB7Ci0gICAgICAgIHJldHVybiAoc3RhdGUgPT0gRU5EX0VMRU1FTlRfU1RBVEUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZE5hbWVzcGFjZUNvbnRleHQoTmFtZXNwYWNlQ29udGV4dCBuc0NvbnRleHQpIHsKLSAgICAgICAgdGhpcy5uYW1lc3BhY2VDb250ZXh0LnNldFBhcmVudE5zQ29udGV4dChuc0NvbnRleHQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGluaXQoKSB7Ci0gICAgICAgIC8vanVzdCBhZGQgdGhlIGN1cnJlbnQgZWxlbWVudHMgbmFtZXNwYWNlIGFuZCBwcmVmaXggdG8gdGhlIHRoaXMKLSAgICAgICAgLy9lbGVtZW50cyBuc2NvbnRleHQKLSAgICAgICAgYWRkVG9Oc01hcChuYW1lLmdldFByZWZpeCgpLCBuYW1lLmdldE5hbWVzcGFjZVVSSSgpKTsKLQotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHByZWZpeAotICAgICAqIEBwYXJhbSB1cmkKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYWRkVG9Oc01hcChTdHJpbmcgcHJlZml4LCBTdHJpbmcgdXJpKSB7Ci0gICAgICAgIC8vdG9kbyAtIG5lZWQgdG8gZml4IHRoaXMgdXAgdG8gY2F0ZXIgZm9yIGNhc2VzIHdoZXJlCi0gICAgICAgIC8vbmFtZXNwYWNlcyBhcmUgaGF2aW5nICBubyBwcmVmaXhlcwotICAgICAgICBpZiAoIXVyaS5lcXVhbHMobmFtZXNwYWNlQ29udGV4dC5nZXROYW1lc3BhY2VVUkkocHJlZml4KSkpIHsKLSAgICAgICAgICAgIC8vdGhpcyBuYW1lc3BhY2UgaXMgbm90IHRoZXJlLiBOZWVkIHRvIGRlY2xhcmUgaXQKLSAgICAgICAgICAgIG5hbWVzcGFjZUNvbnRleHQucHVzaE5hbWVzcGFjZShwcmVmaXgsIHVyaSk7Ci0gICAgICAgICAgICBuc0RlY2xhcmVkID0gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3V0aWxzL3JlYWRlci9OdWxsWE1MU3RyZWFtUmVhZGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdXRpbHMvcmVhZGVyL051bGxYTUxTdHJlYW1SZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIzMDRiMy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdXRpbHMvcmVhZGVyL051bGxYTUxTdHJlYW1SZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5OYW1lc3BhY2VDb250ZXh0OwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5Mb2NhdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIE51bGxYTUxTdHJlYW1SZWFkZXIgaW1wbGVtZW50cyBBREJYTUxTdHJlYW1SZWFkZXIgewotCi0gICAgcHJpdmF0ZSBRTmFtZSBvdXRlclFOYW1lID0gbnVsbDsKLQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVJUX0VMRU1FTlRfU1RBVEUgPSAxOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFTkRfRUxFTUVOVF9TVEFURSA9IDI7Ci0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFFOYW1lIE5JTF9RTkFNRSA9Ci0gICAgICAgICAgICBuZXcgUU5hbWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwgIm5pbCIsICJ4c2kiKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTklMX1ZBTFVFX1RSVUUgPSAidHJ1ZSI7Ci0KLSAgICBwcml2YXRlIGludCBjdXJyZW50U3RhdGUgPSBTVEFSVF9FTEVNRU5UOwotCi0gICAgcHVibGljIE51bGxYTUxTdHJlYW1SZWFkZXIoUU5hbWUgb3V0ZXJRTmFtZSkgewotICAgICAgICB0aGlzLm91dGVyUU5hbWUgPSBvdXRlclFOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIGtleSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vc2luY2Ugb3B0aW1pemF0aW9uIGlzIGEgZ2xvYmFsIHByb3BlcnR5Ci0gICAgICAgIC8vd2UndmUgdG8gaW1wbGVtZW50IGl0IGV2ZXJ5d2hlcmUKLSAgICAgICAgaWYgKE9QVElNSVpBVElPTl9FTkFCTEVELmVxdWFscyhrZXkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gQm9vbGVhbi5UUlVFOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IG5leHQoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgaW50IHJldHVybkV2ZW50ID0gU1RBUlRfRE9DVU1FTlQ7Ci0gICAgICAgIHN3aXRjaCAoY3VycmVudFN0YXRlKSB7Ci0gICAgICAgICAgICBjYXNlIFNUQVJUX0VMRU1FTlRfU1RBVEU6Ci0gICAgICAgICAgICAgICAgY3VycmVudFN0YXRlID0gRU5EX0VMRU1FTlRfU1RBVEU7Ci0gICAgICAgICAgICAgICAgcmV0dXJuRXZlbnQgPSBFTkRfRUxFTUVOVDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgRU5EX0VMRU1FTlRfU1RBVEU6Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhNTFN0cmVhbUV4Y2VwdGlvbigicGFyc2VyIGNvbXBsZXRlZCEiKTsKLQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJldHVybkV2ZW50OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlcXVpcmUoaW50IGksIFN0cmluZyBzdHJpbmcsIFN0cmluZyBzdHJpbmcxKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgLy9ub3RoaW5nCi0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRFbGVtZW50VGV4dCgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IG5leHRUYWcoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gKGN1cnJlbnRTdGF0ZSAhPSBFTkRfRUxFTUVOVF9TVEFURSk7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAvL2RvIG5vdGhpbmcKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVVSSShTdHJpbmcgc3RyaW5nKSB7Ci0gICAgICAgIGlmIChvdXRlclFOYW1lLmdldFByZWZpeCgpICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICBvdXRlclFOYW1lLmdldFByZWZpeCgpLmVxdWFscyhzdHJpbmcpKSB7Ci0gICAgICAgICAgICByZXR1cm4gb3V0ZXJRTmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNTdGFydEVsZW1lbnQoKSB7Ci0gICAgICAgIHJldHVybiAoY3VycmVudFN0YXRlID09IFNUQVJUX0VMRU1FTlRfU1RBVEUpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRW5kRWxlbWVudCgpIHsKLSAgICAgICAgcmV0dXJuIChjdXJyZW50U3RhdGUgPT0gRU5EX0VMRU1FTlRfU1RBVEUpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQ2hhcmFjdGVycygpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzV2hpdGVTcGFjZSgpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlVmFsdWUoU3RyaW5nIHN0cmluZywgU3RyaW5nIHN0cmluZzEpIHsKLSAgICAgICAgaWYgKHN0cmluZyA9PSBudWxsKSB7Ly9udWxsIG5hbWVzcGFjZSAtIGlnbm9yZSBpdAotICAgICAgICAgICAgaWYgKE5JTF9RTkFNRS5nZXRMb2NhbFBhcnQoKS5lcXVhbHMoc3RyaW5nMSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gTklMX1ZBTFVFX1RSVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRBdHRyaWJ1dGVDb3VudCgpIHsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gICAgcHVibGljIFFOYW1lIGdldEF0dHJpYnV0ZU5hbWUoaW50IGkpIHsKLSAgICAgICAgcmV0dXJuIChpID09IDApID8gTklMX1FOQU1FIDogbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZU5hbWVzcGFjZShpbnQgaSkgewotICAgICAgICByZXR1cm4gKGkgPT0gMCkgPyBOSUxfUU5BTUUuZ2V0TmFtZXNwYWNlVVJJKCkgOiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlTG9jYWxOYW1lKGludCBpKSB7Ci0gICAgICAgIHJldHVybiAoaSA9PSAwKSA/IE5JTF9RTkFNRS5nZXRMb2NhbFBhcnQoKSA6IG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVQcmVmaXgoaW50IGkpIHsKLSAgICAgICAgcmV0dXJuIChpID09IDApID8gTklMX1FOQU1FLmdldFByZWZpeCgpIDogbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZVR5cGUoaW50IGkpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVWYWx1ZShpbnQgaSkgewotICAgICAgICByZXR1cm4gKGkgPT0gMCkgPyBOSUxfVkFMVUVfVFJVRSA6IG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNBdHRyaWJ1dGVTcGVjaWZpZWQoaW50IGkpIHsKLSAgICAgICAgcmV0dXJuIChpID09IDApOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0TmFtZXNwYWNlQ291bnQoKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlUHJlZml4KGludCBpKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKGludCBpKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBOYW1lc3BhY2VDb250ZXh0IGdldE5hbWVzcGFjZUNvbnRleHQoKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0RXZlbnRUeXBlKCkgewotICAgICAgICBpbnQgcmV0dXJuRXZlbnQgPSBTVEFSVF9ET0NVTUVOVDsKLSAgICAgICAgc3dpdGNoIChjdXJyZW50U3RhdGUpIHsKLSAgICAgICAgICAgIGNhc2UgU1RBUlRfRUxFTUVOVF9TVEFURToKLSAgICAgICAgICAgICAgICByZXR1cm5FdmVudCA9IFNUQVJUX0VMRU1FTlQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEVORF9FTEVNRU5UX1NUQVRFOgotICAgICAgICAgICAgICAgIHJldHVybkV2ZW50ID0gRU5EX0VMRU1FTlQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0dXJuRXZlbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgY2hhcltdIGdldFRleHRDaGFyYWN0ZXJzKCkgewotICAgICAgICByZXR1cm4gbmV3IGNoYXJbMF07ICAvL1RvIGNoYW5nZSBib2R5IG9mIGltcGxlbWVudGVkIG1ldGhvZHMgdXNlIEZpbGUgfCBTZXR0aW5ncyB8IEZpbGUgVGVtcGxhdGVzLgotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0VGV4dENoYXJhY3RlcnMoaW50IGksIGNoYXJbXSBjaGFycywgaW50IGkxLCBpbnQgaTIpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldFRleHRTdGFydCgpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRUZXh0TGVuZ3RoKCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEVuY29kaW5nKCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNUZXh0KCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIExvY2F0aW9uIGdldExvY2F0aW9uKCkgewotICAgICAgICByZXR1cm4gbmV3IExvY2F0aW9uKCkgewotICAgICAgICAgICAgcHVibGljIGludCBnZXRMaW5lTnVtYmVyKCkgewotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgaW50IGdldENvbHVtbk51bWJlcigpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIGludCBnZXRDaGFyYWN0ZXJPZmZzZXQoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHVibGljSWQoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3lzdGVtSWQoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgfQotCi0gICAgcHVibGljIFFOYW1lIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBvdXRlclFOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxOYW1lKCkgewotICAgICAgICByZXR1cm4gb3V0ZXJRTmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNOYW1lKCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVVSSSgpIHsKLSAgICAgICAgcmV0dXJuIG91dGVyUU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQcmVmaXgoKSB7Ci0gICAgICAgIHJldHVybiBvdXRlclFOYW1lLmdldFByZWZpeCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNTdGFuZGFsb25lKCkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBzdGFuZGFsb25lU2V0KCkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENoYXJhY3RlckVuY29kaW5nU2NoZW1lKCkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBJVGFyZ2V0KCkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBJRGF0YSgpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNEb25lKCkgewotICAgICAgICByZXR1cm4gKGN1cnJlbnRTdGF0ZSA9PSBFTkRfRUxFTUVOVF9TVEFURSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkTmFtZXNwYWNlQ29udGV4dChOYW1lc3BhY2VDb250ZXh0IG5zQ29udGV4dCkgewotICAgICAgICAvL1RvIGNoYW5nZSBib2R5IG9mIGltcGxlbWVudGVkIG1ldGhvZHMgdXNlIEZpbGUgfCBTZXR0aW5ncyB8IEZpbGUgVGVtcGxhdGVzLgotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGluaXQoKSB7Ci0gICAgICAgIC8vVG8gY2hhbmdlIGJvZHkgb2YgaW1wbGVtZW50ZWQgbWV0aG9kcyB1c2UgRmlsZSB8IFNldHRpbmdzIHwgRmlsZSBUZW1wbGF0ZXMuCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3V0aWxzL3JlYWRlci9PTUF0dHJpYktleS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3V0aWxzL3JlYWRlci9PTUF0dHJpYktleS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTkzZWM4Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy91dGlscy9yZWFkZXIvT01BdHRyaWJLZXkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXI7Ci0KLS8qKgotICogQSBkdW1teSBvYmplY3QgdGhhdCBhY3RzIGFzIHRoZSBrZXkgZm9yIHRoZSBPTUF0dHJpYnV0ZSBpbiB0aGUgYXR0cmlidXRlIGFycmF5IC0gdGhpcyB3aWxsIGJlCi0gKiBwcm92aWRlZCBhcyBwYXJ0IG9mIHRoZSBjb25zdGFudHMKLSAqLwotcHVibGljIGNsYXNzIE9NQXR0cmliS2V5IHsKLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3V0aWxzL3JlYWRlci9PTUVsZW1lbnRLZXkuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy91dGlscy9yZWFkZXIvT01FbGVtZW50S2V5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3OGI4YmYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3V0aWxzL3JlYWRlci9PTUVsZW1lbnRLZXkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXI7Ci0KLS8qKgotICogQSBkdW1teSBjbGFzcyB0aGF0IGNyZWF0ZXMgbm90aGluZyBidXQgYSBrZXkgZm9yIHRoZSBPTUVsZW1lbnQgd2hlbiBpdCBpcyBwYXNzZWQgdG8gdGhlCi0gKiBBREJQdWxscGFyc2VyCi0gKi8KLXB1YmxpYyBjbGFzcyBPTUVsZW1lbnRLZXkgewotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3V0aWxzL3JlYWRlci9XcmFwcGluZ1hNTFN0cmVhbVJlYWRlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3V0aWxzL3JlYWRlci9XcmFwcGluZ1hNTFN0cmVhbVJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYmM1NWQ5Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy91dGlscy9yZWFkZXIvV3JhcHBpbmdYTUxTdHJlYW1SZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5OYW1lc3BhY2VDb250ZXh0OwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5Mb2NhdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKLQotcHVibGljIGNsYXNzIFdyYXBwaW5nWE1MU3RyZWFtUmVhZGVyIGltcGxlbWVudHMgQURCWE1MU3RyZWFtUmVhZGVyIHsKLQotICAgIHByaXZhdGUgWE1MU3RyZWFtUmVhZGVyIHJlYWRlcjsKLQotICAgIHB1YmxpYyBXcmFwcGluZ1hNTFN0cmVhbVJlYWRlcihYTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7Ci0gICAgICAgIHRoaXMucmVhZGVyID0gcmVhZGVyOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRG9uZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiAhaGFzTmV4dCgpOwotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBzdHJpbmcpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gcmVhZGVyLmdldFByb3BlcnR5KHN0cmluZyk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBuZXh0KCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiByZWFkZXIubmV4dCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlcXVpcmUoaW50IGksIFN0cmluZyBzdHJpbmcsIFN0cmluZyBzdHJpbmcxKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgLy9ub3RoaW5nIHRvIGRvCi0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRFbGVtZW50VGV4dCgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gcmVhZGVyLmdldEVsZW1lbnRUZXh0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBuZXh0VGFnKCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiByZWFkZXIubmV4dFRhZygpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIHJlYWRlci5oYXNOZXh0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgcmVhZGVyLmNsb3NlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VVUkkoU3RyaW5nIHN0cmluZykgewotICAgICAgICByZXR1cm4gcmVhZGVyLmdldE5hbWVzcGFjZVVSSShzdHJpbmcpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzU3RhcnRFbGVtZW50KCkgewotICAgICAgICByZXR1cm4gcmVhZGVyLmlzU3RhcnRFbGVtZW50KCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbmRFbGVtZW50KCkgewotICAgICAgICByZXR1cm4gcmVhZGVyLmlzRW5kRWxlbWVudCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQ2hhcmFjdGVycygpIHsKLSAgICAgICAgcmV0dXJuIHJlYWRlci5pc0NoYXJhY3RlcnMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1doaXRlU3BhY2UoKSB7Ci0gICAgICAgIHJldHVybiByZWFkZXIuaXNXaGl0ZVNwYWNlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVWYWx1ZShTdHJpbmcgc3RyaW5nLCBTdHJpbmcgc3RyaW5nMSkgewotICAgICAgICByZXR1cm4gcmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKHN0cmluZywgc3RyaW5nMSk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRBdHRyaWJ1dGVDb3VudCgpIHsKLSAgICAgICAgcmV0dXJuIHJlYWRlci5nZXRBdHRyaWJ1dGVDb3VudCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBRTmFtZSBnZXRBdHRyaWJ1dGVOYW1lKGludCBpKSB7Ci0gICAgICAgIHJldHVybiByZWFkZXIuZ2V0QXR0cmlidXRlTmFtZShpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZU5hbWVzcGFjZShpbnQgaSkgewotICAgICAgICByZXR1cm4gcmVhZGVyLmdldEF0dHJpYnV0ZU5hbWVzcGFjZShpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZUxvY2FsTmFtZShpbnQgaSkgewotICAgICAgICByZXR1cm4gcmVhZGVyLmdldEF0dHJpYnV0ZUxvY2FsTmFtZShpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZVByZWZpeChpbnQgaSkgewotICAgICAgICByZXR1cm4gcmVhZGVyLmdldEF0dHJpYnV0ZVByZWZpeChpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZVR5cGUoaW50IGkpIHsKLSAgICAgICAgcmV0dXJuIHJlYWRlci5nZXRBdHRyaWJ1dGVUeXBlKGkpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlVmFsdWUoaW50IGkpIHsKLSAgICAgICAgcmV0dXJuIHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZShpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0F0dHJpYnV0ZVNwZWNpZmllZChpbnQgaSkgewotICAgICAgICByZXR1cm4gcmVhZGVyLmlzQXR0cmlidXRlU3BlY2lmaWVkKGkpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0TmFtZXNwYWNlQ291bnQoKSB7Ci0gICAgICAgIHJldHVybiByZWFkZXIuZ2V0TmFtZXNwYWNlQ291bnQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVByZWZpeChpbnQgaSkgewotICAgICAgICByZXR1cm4gcmVhZGVyLmdldE5hbWVzcGFjZVByZWZpeChpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVVSSShpbnQgaSkgewotICAgICAgICByZXR1cm4gcmVhZGVyLmdldE5hbWVzcGFjZVVSSShpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTmFtZXNwYWNlQ29udGV4dCBnZXROYW1lc3BhY2VDb250ZXh0KCkgewotICAgICAgICByZXR1cm4gcmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldEV2ZW50VHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIHJlYWRlci5nZXRFdmVudFR5cGUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0gICAgICAgIHJldHVybiByZWFkZXIuZ2V0VGV4dCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBjaGFyW10gZ2V0VGV4dENoYXJhY3RlcnMoKSB7Ci0gICAgICAgIHJldHVybiByZWFkZXIuZ2V0VGV4dENoYXJhY3RlcnMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldFRleHRDaGFyYWN0ZXJzKGludCBpLCBjaGFyW10gY2hhcnMsIGludCBpMSwgaW50IGkyKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIHJlYWRlci5nZXRUZXh0Q2hhcmFjdGVycyhpLCBjaGFycywgaTEsIGkyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldFRleHRTdGFydCgpIHsKLSAgICAgICAgcmV0dXJuIHJlYWRlci5nZXRUZXh0U3RhcnQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldFRleHRMZW5ndGgoKSB7Ci0gICAgICAgIHJldHVybiByZWFkZXIuZ2V0VGV4dExlbmd0aCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RW5jb2RpbmcoKSB7Ci0gICAgICAgIHJldHVybiByZWFkZXIuZ2V0RW5jb2RpbmcoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNUZXh0KCkgewotICAgICAgICByZXR1cm4gcmVhZGVyLmhhc1RleHQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTG9jYXRpb24gZ2V0TG9jYXRpb24oKSB7Ci0gICAgICAgIHJldHVybiByZWFkZXIuZ2V0TG9jYXRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUU5hbWUgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHJlYWRlci5nZXROYW1lKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRMb2NhbE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiByZWFkZXIuZ2V0TG9jYWxOYW1lKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaGFzTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHJlYWRlci5oYXNOYW1lKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VVUkkoKSB7Ci0gICAgICAgIHJldHVybiByZWFkZXIuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQcmVmaXgoKSB7Ci0gICAgICAgIHJldHVybiByZWFkZXIuZ2V0UHJlZml4KCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRWZXJzaW9uKCkgewotICAgICAgICByZXR1cm4gcmVhZGVyLmdldFZlcnNpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1N0YW5kYWxvbmUoKSB7Ci0gICAgICAgIHJldHVybiByZWFkZXIuaXNTdGFuZGFsb25lKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gc3RhbmRhbG9uZVNldCgpIHsKLSAgICAgICAgcmV0dXJuIHJlYWRlci5zdGFuZGFsb25lU2V0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRDaGFyYWN0ZXJFbmNvZGluZ1NjaGVtZSgpIHsKLSAgICAgICAgcmV0dXJuIHJlYWRlci5nZXRDaGFyYWN0ZXJFbmNvZGluZ1NjaGVtZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UElUYXJnZXQoKSB7Ci0gICAgICAgIHJldHVybiByZWFkZXIuZ2V0UElUYXJnZXQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBJRGF0YSgpIHsKLSAgICAgICAgcmV0dXJuIHJlYWRlci5nZXRQSURhdGEoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGROYW1lc3BhY2VDb250ZXh0KE5hbWVzcGFjZUNvbnRleHQgbnNDb250ZXh0KSB7Ci0gICAgICAgIC8vbm90aGluZyB0byBkbyBoZXJlCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaW5pdCgpIHsKLSAgICAgICAgLy9Ob3RoaW5nIHRvIGRvIGhlcmUKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdXRpbHMvd3JpdGVyL01UT01Bd2FyZU9NQnVpbGRlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3V0aWxzL3dyaXRlci9NVE9NQXdhcmVPTUJ1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk0MzE4Mi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdXRpbHMvd3JpdGVyL01UT01Bd2FyZU9NQnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01OYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTVRleHQ7Ci0KLWltcG9ydCBqYXZheC5hY3RpdmF0aW9uLkRhdGFIYW5kbGVyOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuTmFtZXNwYWNlQ29udGV4dDsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLQotCi1wdWJsaWMgY2xhc3MgTVRPTUF3YXJlT01CdWlsZGVyIGltcGxlbWVudHMgTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHsKLSAgICAvLyB0aGlzIGlzIHRoZSBvbSBFbGVtZW50IHdlIGFyZSBnb2luZyB0byBjcmVhdGUKLSAgICBwcml2YXRlIE9NRWxlbWVudCByb290RWxlbWVudDsKLSAgICBwcml2YXRlIE9NRmFjdG9yeSBvbUZhY3Rvcnk7Ci0KLSAgICBwcml2YXRlIE9NRWxlbWVudCBjdXJyZW50T01FbGVtZW50OwotCi0gICAgcHJpdmF0ZSBTdGFjayBvbUVsZW1lbnRTdGFjazsKLQotICAgIC8vIHRoaXMgbWFwIGNvbnRhaW5zIHRoZSBuYW1lc3BhY2Uga2V5IGFuZCBPTU5hbWVzcGFjZQotICAgIHByaXZhdGUgTWFwIG5hbWVzcGFjZU9NTmFtZXNhcGNlTWFwOwotCi0gICAgcHJpdmF0ZSBpbnQgcHJlZml4TnVtOwotCi0gICAgcHJpdmF0ZSBPTVN0cmVhbU5hbWVzcGFjZUNvbnRleHQgb21TdHJlYW1OYW1lc3BhY2VDb250ZXh0OwotCi0KLSAgICBwdWJsaWMgTVRPTUF3YXJlT01CdWlsZGVyKCkgewotICAgICAgICBvbUZhY3RvcnkgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKTsKLSAgICAgICAgb21FbGVtZW50U3RhY2sgPSBuZXcgU3RhY2soKTsKLSAgICAgICAgY3VycmVudE9NRWxlbWVudCA9IG51bGw7Ci0gICAgICAgIG9tU3RyZWFtTmFtZXNwYWNlQ29udGV4dCA9IG5ldyBPTVN0cmVhbU5hbWVzcGFjZUNvbnRleHQoKTsKLSAgICAgICAgbmFtZXNwYWNlT01OYW1lc2FwY2VNYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICBwcmVmaXhOdW0gPSAwOwotCi0gICAgfQotCi0gICAgLy8gc2VyYWlsaXplciBtdXN0IGhhdmUgZmluaXNoIHNlcmlhbGl6aW5nIHdoZW4gd2UgY2FsbCB0aGlzIG1ldGhvZC4KLSAgICBwdWJsaWMgT01FbGVtZW50IGdldE9NRWxlbWVudCgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBpZiAoIW9tRWxlbWVudFN0YWNrLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFhNTFN0cmVhbUV4Y2VwdGlvbigiVGhpcyBpcyBhbiBpbnZhbGlkIFhtbCAiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcm9vdEVsZW1lbnQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBPTU5hbWVzcGFjZSBnZXRPTU5hbWVzcGFjZShTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgcHJlZml4KSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgT01OYW1lc3BhY2Ugb21OYW1lc3BhY2UgPSBudWxsOwotICAgICAgICBpZiAobmFtZXNwYWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChuYW1lc3BhY2VPTU5hbWVzYXBjZU1hcC5jb250YWluc0tleShuYW1lc3BhY2UpKSB7Ci0gICAgICAgICAgICAgICAgb21OYW1lc3BhY2UgPSAoT01OYW1lc3BhY2UpIG5hbWVzcGFjZU9NTmFtZXNhcGNlTWFwLmdldChuYW1lc3BhY2UpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gIm5zIiArICsrcHJlZml4TnVtOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5vbVN0cmVhbU5hbWVzcGFjZUNvbnRleHQuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWE1MU3RyZWFtRXhjZXB0aW9uKCJ0aGUgcHJlZml4ID09PiAiICsgcHJlZml4ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIEFscmVhZHkgZXhpc3RzIGZvciBuYW1lc3BhY2UgPT0+ICIgKyBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBvbU5hbWVzcGFjZSA9IG9tRmFjdG9yeS5jcmVhdGVPTU5hbWVzcGFjZShuYW1lc3BhY2UsIHByZWZpeCk7Ci0gICAgICAgICAgICAgICAgdGhpcy5vbVN0cmVhbU5hbWVzcGFjZUNvbnRleHQucmVnaXN0ZXJOYW1lc3BhY2UobmFtZXNwYWNlLCBwcmVmaXgpOwotICAgICAgICAgICAgICAgIG5hbWVzcGFjZU9NTmFtZXNhcGNlTWFwLnB1dChuYW1lc3BhY2UsIG9tTmFtZXNwYWNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gb21OYW1lc3BhY2U7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGVTdGFydEVsZW1lbnQoU3RyaW5nIGxvY2FsTmFtZSkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIHdyaXRlU3RhcnRFbGVtZW50KG51bGwsIGxvY2FsTmFtZSwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGVTdGFydEVsZW1lbnQoU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIGxvY2FsTmFtZSkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIHdyaXRlU3RhcnRFbGVtZW50KG51bGwsIGxvY2FsTmFtZSwgbmFtZXNwYWNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZVN0YXJ0RWxlbWVudChTdHJpbmcgcHJlZml4LCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgbmFtZXNwYWNlKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgT01OYW1lc3BhY2Ugb21OYW1lc3BhY2UgPSBnZXRPTU5hbWVzcGFjZShuYW1lc3BhY2UsIHByZWZpeCk7Ci0gICAgICAgIGN1cnJlbnRPTUVsZW1lbnQgPSBvbUZhY3RvcnkuY3JlYXRlT01FbGVtZW50KGxvY2FsTmFtZSwgb21OYW1lc3BhY2UpOwotICAgICAgICBpZiAoIW9tRWxlbWVudFN0YWNrLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgLy8gd2UgYWx3YXlzIGtlZXAgdGhlIHBhcmVudCBhdCB0aGUgdG9wIG9mIHRoZSBzdGFjawotICAgICAgICAgICAgT01FbGVtZW50IHBhcmVudCA9IChPTUVsZW1lbnQpIG9tRWxlbWVudFN0YWNrLnBlZWsoKTsKLSAgICAgICAgICAgIHBhcmVudC5hZGRDaGlsZChjdXJyZW50T01FbGVtZW50KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIGkuZSB0aGlzIG11c3QgYmUgYW4gc3RhcnQgcm9vdCBlbGVtZW50Ci0gICAgICAgICAgICByb290RWxlbWVudCA9IGN1cnJlbnRPTUVsZW1lbnQ7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gc2V0IHRoaXMgYXMgdGhlIHRvcCBlbGVtZW50Ci0gICAgICAgIG9tRWxlbWVudFN0YWNrLnB1c2goY3VycmVudE9NRWxlbWVudCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGVFbXB0eUVsZW1lbnQoU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIGxvY2FsTmFtZSkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIHdyaXRlRW1wdHlFbGVtZW50KG51bGwsIGxvY2FsTmFtZSwgbmFtZXNwYWNlVVJJKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUVtcHR5RWxlbWVudChTdHJpbmcgcHJlZml4LCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgbmFtZXNwYWNlVVJJKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgd3JpdGVTdGFydEVsZW1lbnQocHJlZml4LCBsb2NhbE5hbWUsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgIHdyaXRlRW5kRWxlbWVudCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlRW1wdHlFbGVtZW50KFN0cmluZyBsb2NhbE5hbWUpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICB3cml0ZUVtcHR5RWxlbWVudChudWxsLCBsb2NhbE5hbWUsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlRW5kRWxlbWVudCgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBvbUVsZW1lbnRTdGFjay5wb3AoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUVuZERvY3VtZW50KCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIG5vdGhpbmcgdG8gZG8KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAvLyBub3RoaW5nIHRvIGRvCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZmx1c2goKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gbm90aGluZyB0byBkbwotCi0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREYXRhSGFuZGxlcihEYXRhSGFuZGxlciBkYXRhSGFuZGxlcikgewotICAgICAgICBPTVRleHQgb21UZXh0ID0gb21GYWN0b3J5LmNyZWF0ZU9NVGV4dChkYXRhSGFuZGxlciwgdHJ1ZSk7Ci0gICAgICAgIGN1cnJlbnRPTUVsZW1lbnQuYWRkQ2hpbGQob21UZXh0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUF0dHJpYnV0ZShTdHJpbmcgYXR0cmlidXRlTmFtZSwgU3RyaW5nIGF0dHJpYnV0ZVZhbHVlKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgd3JpdGVBdHRyaWJ1dGUobnVsbCwgbnVsbCwgYXR0cmlidXRlTmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlQXR0cmlidXRlKFN0cmluZyBwcmVmaXgsIFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBTdHJpbmcgYXR0cmlidXRlVmFsdWUpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBjdXJyZW50T01FbGVtZW50LmFkZEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lLCBhdHRyaWJ1dGVWYWx1ZSwgZ2V0T01OYW1lc3BhY2UobmFtZXNwYWNlLCBwcmVmaXgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUF0dHJpYnV0ZShTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgYXR0cmlidXRlTmFtZSwgU3RyaW5nIGF0dHJpYnV0ZVZhbHVlKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgd3JpdGVBdHRyaWJ1dGUobnVsbCwgbmFtZXNwYWNlLCBhdHRyaWJ1dGVOYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGVOYW1lc3BhY2UoU3RyaW5nIHByZWZpeCwgU3RyaW5nIG5hbWVzcGFjZVVSSSkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgT01OYW1lc3BhY2Ugb21OYW1lc3BhY2UgPSBnZXRPTU5hbWVzcGFjZShuYW1lc3BhY2VVUkksIHByZWZpeCk7Ci0gICAgICAgICAgICBjdXJyZW50T01FbGVtZW50LmRlY2xhcmVOYW1lc3BhY2Uob21OYW1lc3BhY2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGVEZWZhdWx0TmFtZXNwYWNlKFN0cmluZyBuYW1lc3BhY2UpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICByb290RWxlbWVudC5kZWNsYXJlRGVmYXVsdE5hbWVzcGFjZShuYW1lc3BhY2UpOwotICAgICAgICBnZXRPTU5hbWVzcGFjZShuYW1lc3BhY2UsICIiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUNvbW1lbnQoU3RyaW5nIHN0cmluZykgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIG9tRmFjdG9yeS5jcmVhdGVPTUNvbW1lbnQoY3VycmVudE9NRWxlbWVudCwgc3RyaW5nKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZVByb2Nlc3NpbmdJbnN0cnVjdGlvbihTdHJpbmcgc3RyaW5nKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJ0aGlzIG1ldGhvZCBoYXMgbm90IHlldCBiZWVuIGltcGxlbWVudGVkIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGVQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oU3RyaW5nIHN0cmluZywgU3RyaW5nIHN0cmluZzEpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInRoaXMgbWV0aG9kIGhhcyBub3QgeWV0IGJlZW4gaW1wbGVtZW50ZWQiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUNEYXRhKFN0cmluZyBzdHJpbmcpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInRoaXMgbWV0aG9kIGhhcyBub3QgeWV0IGJlZW4gaW1wbGVtZW50ZWQiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZURURChTdHJpbmcgc3RyaW5nKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJ0aGlzIG1ldGhvZCBoYXMgbm90IHlldCBiZWVuIGltcGxlbWVudGVkIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGVFbnRpdHlSZWYoU3RyaW5nIHN0cmluZykgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigidGhpcyBtZXRob2QgaGFzIG5vdCB5ZXQgYmVlbiBpbXBsZW1lbnRlZCIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlU3RhcnREb2N1bWVudCgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAvLyBub3RoaW5nIHRvIGRvCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGVTdGFydERvY3VtZW50KFN0cmluZyBzdHJpbmcpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAvLyBub3RoaW5nIHRvIGRvCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGVTdGFydERvY3VtZW50KFN0cmluZyBzdHJpbmcsIFN0cmluZyBzdHJpbmcxKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gbm90aGluZyB0byBkbwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlQ2hhcmFjdGVycyhTdHJpbmcgc3RyaW5nKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgY3VycmVudE9NRWxlbWVudC5zZXRUZXh0KHN0cmluZyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGVDaGFyYWN0ZXJzKGNoYXJbXSBjaGFycywgaW50IGksIGludCBpMSkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIHdyaXRlQ2hhcmFjdGVycyhuZXcgU3RyaW5nKGNoYXJzLCBpLCBpMSkpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KFN0cmluZyBuYW1lc3BhY2UpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gdGhpcy5vbVN0cmVhbU5hbWVzcGFjZUNvbnRleHQuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UHJlZml4KFN0cmluZyBwcmVmaXgsIFN0cmluZyB1cmkpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAvLyB0aGlzIG1ldGhvZCB3aWxsIGFkZCB0aGUgbmFtZXNwYWNlIGNvcnJlY3RseS4KLSAgICAgICAgZ2V0T01OYW1lc3BhY2UodXJpLCBwcmVmaXgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHROYW1lc3BhY2UoU3RyaW5nIG5hbWVzcGFjZSkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJvb3RFbGVtZW50LmRlY2xhcmVEZWZhdWx0TmFtZXNwYWNlKG5hbWVzcGFjZSk7Ci0gICAgICAgIGdldE9NTmFtZXNwYWNlKG5hbWVzcGFjZSwgIiIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE5hbWVzcGFjZUNvbnRleHQoTmFtZXNwYWNlQ29udGV4dCBuYW1lc3BhY2VDb250ZXh0KSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJ0aGlzIG1ldGhvZCBoYXMgbm90IHlldCBiZWVuIGltcGxlbWVudGVkIik7Ci0gICAgfQotCi0gICAgcHVibGljIE5hbWVzcGFjZUNvbnRleHQgZ2V0TmFtZXNwYWNlQ29udGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMub21TdHJlYW1OYW1lc3BhY2VDb250ZXh0OwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHN0cmluZykgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigidGhpcyBtZXRob2QgaGFzIG5vdCB5ZXQgYmVlbiBpbXBsZW1lbnRlZCIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlRGF0YUhhbmRsZXIoRGF0YUhhbmRsZXIgZGF0YUhhbmRsZXIpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBPTVRleHQgb21UZXh0ID0gb21GYWN0b3J5LmNyZWF0ZU9NVGV4dChkYXRhSGFuZGxlciwgdHJ1ZSk7Ci0gICAgICAgIGN1cnJlbnRPTUVsZW1lbnQuYWRkQ2hpbGQob21UZXh0KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdXRpbHMvd3JpdGVyL01UT01Bd2FyZVhNTFNlcmlhbGl6ZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy91dGlscy93cml0ZXIvTVRPTUF3YXJlWE1MU2VyaWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDY3MDM4Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy91dGlscy93cml0ZXIvTVRPTUF3YXJlWE1MU2VyaWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5sbG9tLk9NVGV4dEltcGw7Ci0KLWltcG9ydCBqYXZheC5hY3RpdmF0aW9uLkRhdGFIYW5kbGVyOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuTmFtZXNwYWNlQ29udGV4dDsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlcjsKLQotLyoqCi0gKiB0aGlzIGNsYXNzIHdyYXBwcyB0aGUgZXhpc3RpbmcgeG1sU3RyZWFtV3JpdGVyIGFuZCBpbXBsZW1lbnRzIHRoZSBuZXcgbWV0aG9kCi0gKiB3cml0ZURhdGFIYW5kbGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBNVE9NQXdhcmVYTUxTZXJpYWxpemVyIGltcGxlbWVudHMgTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHsKLQotICAgIHByaXZhdGUgWE1MU3RyZWFtV3JpdGVyIHhtbFN0cmVhbVdyaXRlcjsKLQotICAgIHB1YmxpYyBNVE9NQXdhcmVYTUxTZXJpYWxpemVyKFhNTFN0cmVhbVdyaXRlciB4bWxTdHJlYW1Xcml0ZXIpIHsKLSAgICAgICAgdGhpcy54bWxTdHJlYW1Xcml0ZXIgPSB4bWxTdHJlYW1Xcml0ZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGVTdGFydEVsZW1lbnQoU3RyaW5nIHN0cmluZykgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMueG1sU3RyZWFtV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHN0cmluZyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGVTdGFydEVsZW1lbnQoU3RyaW5nIHN0cmluZywgU3RyaW5nIHN0cmluZzEpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICB0aGlzLnhtbFN0cmVhbVdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChzdHJpbmcsIHN0cmluZzEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlU3RhcnRFbGVtZW50KFN0cmluZyBzdHJpbmcsIFN0cmluZyBzdHJpbmcxLCBTdHJpbmcgc3RyaW5nMikgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMueG1sU3RyZWFtV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHN0cmluZywgc3RyaW5nMSwgc3RyaW5nMik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGVFbXB0eUVsZW1lbnQoU3RyaW5nIHN0cmluZywgU3RyaW5nIHN0cmluZzEpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICB0aGlzLnhtbFN0cmVhbVdyaXRlci53cml0ZUVtcHR5RWxlbWVudChzdHJpbmcsIHN0cmluZzEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlRW1wdHlFbGVtZW50KFN0cmluZyBzdHJpbmcsIFN0cmluZyBzdHJpbmcxLCBTdHJpbmcgc3RyaW5nMikgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMueG1sU3RyZWFtV3JpdGVyLndyaXRlRW1wdHlFbGVtZW50KHN0cmluZywgc3RyaW5nMSwgc3RyaW5nMik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGVFbXB0eUVsZW1lbnQoU3RyaW5nIHN0cmluZykgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMueG1sU3RyZWFtV3JpdGVyLndyaXRlRW1wdHlFbGVtZW50KHN0cmluZyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGVFbmRFbGVtZW50KCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMueG1sU3RyZWFtV3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlRW5kRG9jdW1lbnQoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy54bWxTdHJlYW1Xcml0ZXIud3JpdGVFbmREb2N1bWVudCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMueG1sU3RyZWFtV3JpdGVyLmNsb3NlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZmx1c2goKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy54bWxTdHJlYW1Xcml0ZXIuZmx1c2goKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUF0dHJpYnV0ZShTdHJpbmcgc3RyaW5nLCBTdHJpbmcgc3RyaW5nMSkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMueG1sU3RyZWFtV3JpdGVyLndyaXRlQXR0cmlidXRlKHN0cmluZywgc3RyaW5nMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGVBdHRyaWJ1dGUoU3RyaW5nIHN0cmluZywgU3RyaW5nIHN0cmluZzEsIFN0cmluZyBzdHJpbmcyLCBTdHJpbmcgc3RyaW5nMykgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMueG1sU3RyZWFtV3JpdGVyLndyaXRlQXR0cmlidXRlKHN0cmluZywgc3RyaW5nMSwgc3RyaW5nMiwgc3RyaW5nMyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGVBdHRyaWJ1dGUoU3RyaW5nIHN0cmluZywgU3RyaW5nIHN0cmluZzEsIFN0cmluZyBzdHJpbmcyKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy54bWxTdHJlYW1Xcml0ZXIud3JpdGVBdHRyaWJ1dGUoc3RyaW5nLCBzdHJpbmcxLCBzdHJpbmcyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZU5hbWVzcGFjZShTdHJpbmcgc3RyaW5nLCBTdHJpbmcgc3RyaW5nMSkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMueG1sU3RyZWFtV3JpdGVyLndyaXRlTmFtZXNwYWNlKHN0cmluZywgc3RyaW5nMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGVEZWZhdWx0TmFtZXNwYWNlKFN0cmluZyBzdHJpbmcpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICB0aGlzLnhtbFN0cmVhbVdyaXRlci53cml0ZURlZmF1bHROYW1lc3BhY2Uoc3RyaW5nKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUNvbW1lbnQoU3RyaW5nIHN0cmluZykgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMueG1sU3RyZWFtV3JpdGVyLndyaXRlQ29tbWVudChzdHJpbmcpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlUHJvY2Vzc2luZ0luc3RydWN0aW9uKFN0cmluZyBzdHJpbmcpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICB0aGlzLnhtbFN0cmVhbVdyaXRlci53cml0ZVByb2Nlc3NpbmdJbnN0cnVjdGlvbihzdHJpbmcpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlUHJvY2Vzc2luZ0luc3RydWN0aW9uKFN0cmluZyBzdHJpbmcsIFN0cmluZyBzdHJpbmcxKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy54bWxTdHJlYW1Xcml0ZXIud3JpdGVQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oc3RyaW5nLCBzdHJpbmcxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUNEYXRhKFN0cmluZyBzdHJpbmcpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICB0aGlzLnhtbFN0cmVhbVdyaXRlci53cml0ZUNEYXRhKHN0cmluZyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGVEVEQoU3RyaW5nIHN0cmluZykgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMueG1sU3RyZWFtV3JpdGVyLndyaXRlRFREKHN0cmluZyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGVFbnRpdHlSZWYoU3RyaW5nIHN0cmluZykgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMueG1sU3RyZWFtV3JpdGVyLndyaXRlRW50aXR5UmVmKHN0cmluZyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGVTdGFydERvY3VtZW50KCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMueG1sU3RyZWFtV3JpdGVyLndyaXRlU3RhcnREb2N1bWVudCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlU3RhcnREb2N1bWVudChTdHJpbmcgc3RyaW5nKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy54bWxTdHJlYW1Xcml0ZXIud3JpdGVTdGFydERvY3VtZW50KHN0cmluZyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGVTdGFydERvY3VtZW50KFN0cmluZyBzdHJpbmcsIFN0cmluZyBzdHJpbmcxKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy54bWxTdHJlYW1Xcml0ZXIud3JpdGVTdGFydERvY3VtZW50KHN0cmluZywgc3RyaW5nMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGVDaGFyYWN0ZXJzKFN0cmluZyBzdHJpbmcpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICB0aGlzLnhtbFN0cmVhbVdyaXRlci53cml0ZUNoYXJhY3RlcnMoc3RyaW5nKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUNoYXJhY3RlcnMoY2hhcltdIGNoYXJzLCBpbnQgaSwgaW50IGkxKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy54bWxTdHJlYW1Xcml0ZXIud3JpdGVDaGFyYWN0ZXJzKGNoYXJzLCBpLCBpMSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQcmVmaXgoU3RyaW5nIHN0cmluZykgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiB0aGlzLnhtbFN0cmVhbVdyaXRlci5nZXRQcmVmaXgoc3RyaW5nKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcmVmaXgoU3RyaW5nIHN0cmluZywgU3RyaW5nIHN0cmluZzEpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICB0aGlzLnhtbFN0cmVhbVdyaXRlci5zZXRQcmVmaXgoc3RyaW5nLCBzdHJpbmcxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0TmFtZXNwYWNlKFN0cmluZyBzdHJpbmcpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICB0aGlzLnhtbFN0cmVhbVdyaXRlci5zZXREZWZhdWx0TmFtZXNwYWNlKHN0cmluZyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZXNwYWNlQ29udGV4dChOYW1lc3BhY2VDb250ZXh0IG5hbWVzcGFjZUNvbnRleHQpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICB0aGlzLnhtbFN0cmVhbVdyaXRlci5zZXROYW1lc3BhY2VDb250ZXh0KG5hbWVzcGFjZUNvbnRleHQpOwotICAgIH0KLQotICAgIHB1YmxpYyBOYW1lc3BhY2VDb250ZXh0IGdldE5hbWVzcGFjZUNvbnRleHQoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnhtbFN0cmVhbVdyaXRlci5nZXROYW1lc3BhY2VDb250ZXh0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgc3RyaW5nKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIHRoaXMueG1sU3RyZWFtV3JpdGVyLmdldFByb3BlcnR5KHN0cmluZyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGVEYXRhSGFuZGxlcihEYXRhSGFuZGxlciBkYXRhSGFuZGxlcikgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIE9NVGV4dEltcGwgb21UZXh0ID0gbmV3IE9NVGV4dEltcGwoZGF0YUhhbmRsZXIsIE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgb21UZXh0LmludGVybmFsU2VyaWFsaXplQW5kQ29uc3VtZSh0aGlzLnhtbFN0cmVhbVdyaXRlcik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3V0aWxzL3dyaXRlci9NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy91dGlscy93cml0ZXIvTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5MDlmOGIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3V0aWxzL3dyaXRlci9NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXI7Ci0KLWltcG9ydCBqYXZheC5hY3RpdmF0aW9uLkRhdGFIYW5kbGVyOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyOwotCi1wdWJsaWMgaW50ZXJmYWNlIE1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciBleHRlbmRzIFhNTFN0cmVhbVdyaXRlciB7Ci0gICAgcHVibGljIHZvaWQgd3JpdGVEYXRhSGFuZGxlcihEYXRhSGFuZGxlciBkYXRhSGFuZGxlcikgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy91dGlscy93cml0ZXIvT01FbGVtZW50U3RyZWFtV3JpdGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdXRpbHMvd3JpdGVyL09NRWxlbWVudFN0cmVhbVdyaXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGMxNTBlLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy91dGlscy93cml0ZXIvT01FbGVtZW50U3RyZWFtV3JpdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NVGV4dDsKLQotaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXI7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5OYW1lc3BhY2VDb250ZXh0OwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlN0YWNrOwotCi0KLXB1YmxpYyBjbGFzcyBPTUVsZW1lbnRTdHJlYW1Xcml0ZXIgaW1wbGVtZW50cyBYTUxTdHJlYW1Xcml0ZXIgewotCi0gICAgLy8gdGhpcyBpcyB0aGUgb20gRWxlbWVudCB3ZSBhcmUgZ29pbmcgdG8gY3JlYXRlCi0gICAgcHJpdmF0ZSBPTUVsZW1lbnQgcm9vdEVsZW1lbnQ7Ci0gICAgcHJpdmF0ZSBPTUZhY3Rvcnkgb21GYWN0b3J5OwotCi0gICAgcHJpdmF0ZSBPTUVsZW1lbnQgY3VycmVudE9NRWxlbWVudDsKLQotICAgIHByaXZhdGUgU3RhY2sgb21FbGVtZW50U3RhY2s7Ci0KLSAgICAvLyB0aGlzIG1hcCBjb250YWlucyB0aGUgbmFtZXNwYWNlIGtleSBhbmQgT01OYW1lc3BhY2UKLSAgICBwcml2YXRlIE1hcCBuYW1lc3BhY2VPTU5hbWVzYXBjZU1hcDsKLQotICAgIHByaXZhdGUgaW50IHByZWZpeE51bTsKLQotICAgIHByaXZhdGUgT01TdHJlYW1OYW1lc3BhY2VDb250ZXh0IG9tU3RyZWFtTmFtZXNwYWNlQ29udGV4dDsKLQotCi0gICAgcHVibGljIE9NRWxlbWVudFN0cmVhbVdyaXRlcigpIHsKLSAgICAgICAgb21GYWN0b3J5ID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCk7Ci0gICAgICAgIG9tRWxlbWVudFN0YWNrID0gbmV3IFN0YWNrKCk7Ci0gICAgICAgIGN1cnJlbnRPTUVsZW1lbnQgPSBudWxsOwotICAgICAgICBvbVN0cmVhbU5hbWVzcGFjZUNvbnRleHQgPSBuZXcgT01TdHJlYW1OYW1lc3BhY2VDb250ZXh0KCk7Ci0gICAgICAgIG5hbWVzcGFjZU9NTmFtZXNhcGNlTWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgcHJlZml4TnVtID0gMDsKLQotICAgIH0KLQotICAgIC8vIHNlcmFpbGl6ZXIgbXVzdCBoYXZlIGZpbmlzaCBzZXJpYWxpemluZyB3aGVuIHdlIGNhbGwgdGhpcyBtZXRob2QuCi0gICAgcHVibGljIE9NRWxlbWVudCBnZXRPTUVsZW1lbnQoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFvbUVsZW1lbnRTdGFjay5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBYTUxTdHJlYW1FeGNlcHRpb24oIlRoaXMgaXMgYW4gaW52YWxpZCBYbWwgIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJvb3RFbGVtZW50OwotICAgIH0KLQotICAgIHByaXZhdGUgT01OYW1lc3BhY2UgZ2V0T01OYW1lc3BhY2UoU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIHByZWZpeCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIE9NTmFtZXNwYWNlIG9tTmFtZXNwYWNlID0gbnVsbDsKLSAgICAgICAgaWYgKG5hbWVzcGFjZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAobmFtZXNwYWNlT01OYW1lc2FwY2VNYXAuY29udGFpbnNLZXkobmFtZXNwYWNlKSkgewotICAgICAgICAgICAgICAgIG9tTmFtZXNwYWNlID0gKE9NTmFtZXNwYWNlKSBuYW1lc3BhY2VPTU5hbWVzYXBjZU1hcC5nZXQobmFtZXNwYWNlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9ICJucyIgKyArK3ByZWZpeE51bTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMub21TdHJlYW1OYW1lc3BhY2VDb250ZXh0LmdldE5hbWVzcGFjZVVSSShwcmVmaXgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhNTFN0cmVhbUV4Y2VwdGlvbigidGhlIHByZWZpeCA9PT4gIiArIHByZWZpeCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBBbHJlYWR5IGV4aXN0cyBmb3IgbmFtZXNwYWNlID09PiAiICsgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb21OYW1lc3BhY2UgPSBvbUZhY3RvcnkuY3JlYXRlT01OYW1lc3BhY2UobmFtZXNwYWNlLCBwcmVmaXgpOwotICAgICAgICAgICAgICAgIHRoaXMub21TdHJlYW1OYW1lc3BhY2VDb250ZXh0LnJlZ2lzdGVyTmFtZXNwYWNlKG5hbWVzcGFjZSwgcHJlZml4KTsKLSAgICAgICAgICAgICAgICBuYW1lc3BhY2VPTU5hbWVzYXBjZU1hcC5wdXQobmFtZXNwYWNlLCBvbU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG9tTmFtZXNwYWNlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlU3RhcnRFbGVtZW50KFN0cmluZyBsb2NhbE5hbWUpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICB3cml0ZVN0YXJ0RWxlbWVudChudWxsLCBsb2NhbE5hbWUsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlU3RhcnRFbGVtZW50KFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBsb2NhbE5hbWUpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICB3cml0ZVN0YXJ0RWxlbWVudChudWxsLCBsb2NhbE5hbWUsIG5hbWVzcGFjZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGVTdGFydEVsZW1lbnQoU3RyaW5nIHByZWZpeCwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIG5hbWVzcGFjZSkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIE9NTmFtZXNwYWNlIG9tTmFtZXNwYWNlID0gZ2V0T01OYW1lc3BhY2UobmFtZXNwYWNlLCBwcmVmaXgpOwotICAgICAgICBjdXJyZW50T01FbGVtZW50ID0gb21GYWN0b3J5LmNyZWF0ZU9NRWxlbWVudChsb2NhbE5hbWUsIG9tTmFtZXNwYWNlKTsKLSAgICAgICAgaWYgKCFvbUVsZW1lbnRTdGFjay5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIC8vIHdlIGFsd2F5cyBrZWVwIHRoZSBwYXJlbnQgYXQgdGhlIHRvcCBvZiB0aGUgc3RhY2sKLSAgICAgICAgICAgIE9NRWxlbWVudCBwYXJlbnQgPSAoT01FbGVtZW50KSBvbUVsZW1lbnRTdGFjay5wZWVrKCk7Ci0gICAgICAgICAgICBwYXJlbnQuYWRkQ2hpbGQoY3VycmVudE9NRWxlbWVudCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBpLmUgdGhpcyBtdXN0IGJlIGFuIHN0YXJ0IHJvb3QgZWxlbWVudAotICAgICAgICAgICAgcm9vdEVsZW1lbnQgPSBjdXJyZW50T01FbGVtZW50OwotICAgICAgICB9Ci0gICAgICAgIC8vIHNldCB0aGlzIGFzIHRoZSB0b3AgZWxlbWVudAotICAgICAgICBvbUVsZW1lbnRTdGFjay5wdXNoKGN1cnJlbnRPTUVsZW1lbnQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlRW1wdHlFbGVtZW50KFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBsb2NhbE5hbWUpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICB3cml0ZUVtcHR5RWxlbWVudChudWxsLCBsb2NhbE5hbWUsIG5hbWVzcGFjZVVSSSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGVFbXB0eUVsZW1lbnQoU3RyaW5nIHByZWZpeCwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIG5hbWVzcGFjZVVSSSkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIHdyaXRlU3RhcnRFbGVtZW50KHByZWZpeCwgbG9jYWxOYW1lLCBuYW1lc3BhY2VVUkkpOwotICAgICAgICB3cml0ZUVuZEVsZW1lbnQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUVtcHR5RWxlbWVudChTdHJpbmcgbG9jYWxOYW1lKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgd3JpdGVFbXB0eUVsZW1lbnQobnVsbCwgbG9jYWxOYW1lLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUVuZEVsZW1lbnQoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgb21FbGVtZW50U3RhY2sucG9wKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGVFbmREb2N1bWVudCgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAvLyBub3RoaW5nIHRvIGRvCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gbm90aGluZyB0byBkbwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGZsdXNoKCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIG5vdGhpbmcgdG8gZG8KLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERhdGFIYW5kbGVyKERhdGFIYW5kbGVyIGRhdGFIYW5kbGVyKXsKLSAgICAgICAgT01UZXh0IG9tVGV4dCA9IG9tRmFjdG9yeS5jcmVhdGVPTVRleHQoZGF0YUhhbmRsZXIsdHJ1ZSk7Ci0gICAgICAgIGN1cnJlbnRPTUVsZW1lbnQuYWRkQ2hpbGQob21UZXh0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUF0dHJpYnV0ZShTdHJpbmcgYXR0cmlidXRlTmFtZSwgU3RyaW5nIGF0dHJpYnV0ZVZhbHVlKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgd3JpdGVBdHRyaWJ1dGUobnVsbCwgbnVsbCwgYXR0cmlidXRlTmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlQXR0cmlidXRlKFN0cmluZyBwcmVmaXgsIFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBTdHJpbmcgYXR0cmlidXRlVmFsdWUpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBjdXJyZW50T01FbGVtZW50LmFkZEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lLCBhdHRyaWJ1dGVWYWx1ZSwgZ2V0T01OYW1lc3BhY2UobmFtZXNwYWNlLCBwcmVmaXgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUF0dHJpYnV0ZShTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgYXR0cmlidXRlTmFtZSwgU3RyaW5nIGF0dHJpYnV0ZVZhbHVlKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgd3JpdGVBdHRyaWJ1dGUobnVsbCwgbmFtZXNwYWNlLCBhdHRyaWJ1dGVOYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGVOYW1lc3BhY2UoU3RyaW5nIHByZWZpeCwgU3RyaW5nIG5hbWVzcGFjZVVSSSkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgT01OYW1lc3BhY2Ugb21OYW1lc3BhY2UgPSBnZXRPTU5hbWVzcGFjZShuYW1lc3BhY2VVUkksIHByZWZpeCk7Ci0gICAgICAgICAgICBjdXJyZW50T01FbGVtZW50LmRlY2xhcmVOYW1lc3BhY2Uob21OYW1lc3BhY2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGVEZWZhdWx0TmFtZXNwYWNlKFN0cmluZyBuYW1lc3BhY2UpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICByb290RWxlbWVudC5kZWNsYXJlRGVmYXVsdE5hbWVzcGFjZShuYW1lc3BhY2UpOwotICAgICAgICBnZXRPTU5hbWVzcGFjZShuYW1lc3BhY2UsICIiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUNvbW1lbnQoU3RyaW5nIHN0cmluZykgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIG9tRmFjdG9yeS5jcmVhdGVPTUNvbW1lbnQoY3VycmVudE9NRWxlbWVudCxzdHJpbmcpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlUHJvY2Vzc2luZ0luc3RydWN0aW9uKFN0cmluZyBzdHJpbmcpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInRoaXMgbWV0aG9kIGhhcyBub3QgeWV0IGJlZW4gaW1wbGVtZW50ZWQiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZVByb2Nlc3NpbmdJbnN0cnVjdGlvbihTdHJpbmcgc3RyaW5nLCBTdHJpbmcgc3RyaW5nMSkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigidGhpcyBtZXRob2QgaGFzIG5vdCB5ZXQgYmVlbiBpbXBsZW1lbnRlZCIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlQ0RhdGEoU3RyaW5nIHN0cmluZykgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigidGhpcyBtZXRob2QgaGFzIG5vdCB5ZXQgYmVlbiBpbXBsZW1lbnRlZCIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlRFREKFN0cmluZyBzdHJpbmcpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInRoaXMgbWV0aG9kIGhhcyBub3QgeWV0IGJlZW4gaW1wbGVtZW50ZWQiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUVudGl0eVJlZihTdHJpbmcgc3RyaW5nKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJ0aGlzIG1ldGhvZCBoYXMgbm90IHlldCBiZWVuIGltcGxlbWVudGVkIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGVTdGFydERvY3VtZW50KCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIG5vdGhpbmcgdG8gZG8KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZVN0YXJ0RG9jdW1lbnQoU3RyaW5nIHN0cmluZykgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIG5vdGhpbmcgdG8gZG8KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZVN0YXJ0RG9jdW1lbnQoU3RyaW5nIHN0cmluZywgU3RyaW5nIHN0cmluZzEpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAvLyBub3RoaW5nIHRvIGRvCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGVDaGFyYWN0ZXJzKFN0cmluZyBzdHJpbmcpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBjdXJyZW50T01FbGVtZW50LnNldFRleHQoc3RyaW5nKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUNoYXJhY3RlcnMoY2hhcltdIGNoYXJzLCBpbnQgaSwgaW50IGkxKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgd3JpdGVDaGFyYWN0ZXJzKG5ldyBTdHJpbmcoY2hhcnMsIGksIGkxKSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQcmVmaXgoU3RyaW5nIG5hbWVzcGFjZSkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiB0aGlzLm9tU3RyZWFtTmFtZXNwYWNlQ29udGV4dC5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcmVmaXgoU3RyaW5nIHByZWZpeCwgU3RyaW5nIHVyaSkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIHRoaXMgbWV0aG9kIHdpbGwgYWRkIHRoZSBuYW1lc3BhY2UgY29ycmVjdGx5LgotICAgICAgICBnZXRPTU5hbWVzcGFjZSh1cmksIHByZWZpeCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdE5hbWVzcGFjZShTdHJpbmcgbmFtZXNwYWNlKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgcm9vdEVsZW1lbnQuZGVjbGFyZURlZmF1bHROYW1lc3BhY2UobmFtZXNwYWNlKTsKLSAgICAgICAgZ2V0T01OYW1lc3BhY2UobmFtZXNwYWNlLCIiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lc3BhY2VDb250ZXh0KE5hbWVzcGFjZUNvbnRleHQgbmFtZXNwYWNlQ29udGV4dCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigidGhpcyBtZXRob2QgaGFzIG5vdCB5ZXQgYmVlbiBpbXBsZW1lbnRlZCIpOwotICAgIH0KLQotICAgIHB1YmxpYyBOYW1lc3BhY2VDb250ZXh0IGdldE5hbWVzcGFjZUNvbnRleHQoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLm9tU3RyZWFtTmFtZXNwYWNlQ29udGV4dDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBzdHJpbmcpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInRoaXMgbWV0aG9kIGhhcyBub3QgeWV0IGJlZW4gaW1wbGVtZW50ZWQiKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdXRpbHMvd3JpdGVyL09NU3RyZWFtTmFtZXNwYWNlQ29udGV4dC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3V0aWxzL3dyaXRlci9PTVN0cmVhbU5hbWVzcGFjZUNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmIxZWE3NC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdXRpbHMvd3JpdGVyL09NU3RyZWFtTmFtZXNwYWNlQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlcjsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuTmFtZXNwYWNlQ29udGV4dDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotCi1wdWJsaWMgY2xhc3MgT01TdHJlYW1OYW1lc3BhY2VDb250ZXh0IGltcGxlbWVudHMgTmFtZXNwYWNlQ29udGV4dCB7Ci0KLSAgICBwcml2YXRlIE1hcCBuYW1lc3BhY2VUb1ByZWZpeE1hcDsKLSAgICBwcml2YXRlIE1hcCBwcmVmaXhUb05hbWVzcGFjZU1hcDsKLQotICAgIHB1YmxpYyBPTVN0cmVhbU5hbWVzcGFjZUNvbnRleHQoKSB7Ci0gICAgICAgIHRoaXMubmFtZXNwYWNlVG9QcmVmaXhNYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICB0aGlzLnByZWZpeFRvTmFtZXNwYWNlTWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZWdpc3Rlck5hbWVzcGFjZShTdHJpbmcgbmFtZXNwYWNlLFN0cmluZyBwcmVmaXgpewotICAgICAgICB0aGlzLm5hbWVzcGFjZVRvUHJlZml4TWFwLnB1dChuYW1lc3BhY2UscHJlZml4KTsKLSAgICAgICAgdGhpcy5wcmVmaXhUb05hbWVzcGFjZU1hcC5wdXQocHJlZml4LG5hbWVzcGFjZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VVUkkoU3RyaW5nIHByZWZpeCkgewotICAgICAgICByZXR1cm4gKFN0cmluZykgcHJlZml4VG9OYW1lc3BhY2VNYXAuZ2V0KHByZWZpeCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQcmVmaXgoU3RyaW5nIG5hbWVzcGFjZVVSSSkgewotICAgICAgICByZXR1cm4gKFN0cmluZykgbmFtZXNwYWNlVG9QcmVmaXhNYXAuZ2V0KG5hbWVzcGFjZVVSSSk7Ci0gICAgfQotCi0gICAgcHVibGljIEl0ZXJhdG9yIGdldFByZWZpeGVzKFN0cmluZyBuYW1lc3BhY2VVUkkpIHsKLSAgICAgICAgcmV0dXJuIHByZWZpeFRvTmFtZXNwYWNlTWFwLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9ycGMvY2xpZW50L1JQQ1NlcnZpY2VDbGllbnQuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9ycGMvY2xpZW50L1JQQ1NlcnZpY2VDbGllbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJhMWYyMi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvcnBjL2NsaWVudC9SUENTZXJ2aWNlQ2xpZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJwYy5jbGllbnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5TZXJ2aWNlQ2xpZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50LmFzeW5jLkF4aXNDYWxsYmFjazsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5hc3luYy5DYWxsYmFjazsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkRlZmF1bHRPYmplY3RTdXBwbGllcjsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1wdWJsaWMgY2xhc3MgUlBDU2VydmljZUNsaWVudCBleHRlbmRzIFNlcnZpY2VDbGllbnQgewotCi0gICAgcHJpdmF0ZSBib29sZWFuIG5vdE51bGxTZXJ2aWNlOwotCi0gICAgcHVibGljIFJQQ1NlcnZpY2VDbGllbnQoQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ29udGV4dCwgQXhpc1NlcnZpY2Ugc2VydmljZSkKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBzdXBlcihjb25maWdDb250ZXh0LCBzZXJ2aWNlKTsKLSAgICAgICAgaWYgKHNlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgbm90TnVsbFNlcnZpY2UgPSB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFJQQ1NlcnZpY2VDbGllbnQoKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUlBDU2VydmljZUNsaWVudChDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTCB3c2RsVVJMLCBRTmFtZSB3c2RsU2VydmljZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBvcnROYW1lKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgc3VwZXIoY29uZmlnQ29udGV4dCwgd3NkbFVSTCwgd3NkbFNlcnZpY2VOYW1lLCBwb3J0TmFtZSk7Ci0gICAgICAgIG5vdE51bGxTZXJ2aWNlID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdmFsdWUgY2FuIGJlIGEgc2luZ2xlIGEgb2JqZWN0IG9yIGFuIG9iamVjdCBhcnJheSAoaXRzZWxmIGFuIG9iamVjdCkgLCBidXQgaXQgaXMKLSAgICAgKiBkaWZmaWN1bHR5IHRvIGZpZ3VyZSB0aGUgcmV0dXJuIG9iamVjdCBjb3JyZWN0bHkgdW5sZXNzIHdlIGhhdmUgVHllcE1hcHBpbmcgaW4gdGhlIGNsaWVudAotICAgICAqIHNpZGUgdG9vLiBVbnRpbCBpdCBpcyBmaW5hbGl6ZWQgbGV0cyByZXR1cm4gT01FbGVtZW50IGFzIHJldHVybiB2YWx1ZS4gQW5kIHRoZSByZXR1ZW4gdmFsdWUKLSAgICAgKiB3aWxsIGJlIHRoZSBib2R5IGZpcnN0IGVsZW1lbnQgdXNlciBoYXMgdG8gZGVhbCB3aXRoIHRoYXQgYW5kIGNyZWF0ZSBoaXMgb3duIG9iamVjdCBvdXQgb2YKLSAgICAgKiB0aGF0LgotICAgICAqCi0gICAgICogQHBhcmFtIG9wTmFtZSBPcGVyYXRpb24gUU5hbWUgKHRvIGdldCB0aGUgYm9keSB3cmFwcGVyIGVsZW1lbnQpCi0gICAgICogQHBhcmFtIGFyZ3MgICBBcnJheWxpc3Qgb2Ygb2JqZWN0cwotICAgICAqIEByZXR1cm4gUmVzcG9uc2UgT01FbGVtZW50Ci0gICAgICogQHRocm93cyBBeGlzRmF1bHQgaW4gY2FzZSBvZiBhIHByb2JsZW0gLSB0aGlzIGNhbiBlaXRoZXIgYmUgYSBwcm9jZXNzaW5nIGZhdWx0IG9yIGEgcmVjZWl2ZWQKLSAgICAgKiAgICAgICAgICAgICAgICAgICBvbi10aGUtd2lyZSBmYXVsdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgT01FbGVtZW50IGludm9rZUJsb2NraW5nKFFOYW1lIG9wTmFtZSwgT2JqZWN0IFtdIGFyZ3MpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gQmVhblV0aWwuZ2V0T01FbGVtZW50KG9wTmFtZSwgYXJncywgbnVsbCwgZmFsc2UsIG51bGwpOwotICAgICAgICBpZiAobm90TnVsbFNlcnZpY2UpIHsKLSAgICAgICAgICAgIHJldHVybiBzdXBlci5zZW5kUmVjZWl2ZShvcE5hbWUsIG9tRWxlbWVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN1cGVyLnNlbmRSZWNlaXZlKG9tRWxlbWVudCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIG9wTmFtZSAgICAgIE9wZXJhdGlvbiBRTmFtZSAodG8gZ2V0IHRoZSBib2R5IHdyYXBwZXIgZWxlbWVudCkKLSAgICAgKiBAcGFyYW0gYXJncyAgICAgICAgQXJyYXlsaXN0IG9mIG9iamVjdHMKLSAgICAgKiBAcGFyYW0gcmV0dXJuVHlwZXMgLCB0aGlzIGFycmF5IGNvbnRhaW5zIHRoZSBKYXZhVHlwZXMgZm9yIHRoZSByZXR1cm4gb2JqZWN0ICwgaXQgY291bGQgYmUKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgb25lIG9yIG1vcmUgZGVwZW5kaW5nIG9uIHRoZSByZXR1cm4gdHlwZSAsIG1vc3Qgb2YgdGhlIHR5cGUgYXJyYXkgd2lsbAotICAgICAqICAgICAgICAgICAgICAgICAgICBjb250YWluIGp1c3Qgb25lIGVsZW1lbnQgSXQgc2hvdWxkIGJlIG5vdGVkIHRoYXQgdGhlIGFycmF5IHNob3VsZCBvbmx5Ci0gICAgICogICAgICAgICAgICAgICAgICAgIGNvbnRhaW5zIEphdmFUeXBlcyBOT1QgcmVhbCBvYmplY3QgLCB3aGF0IHRoaXMgbWV0aG9kcyBkb2VzIGlzICwgZ2V0IHRoZQotICAgICAqICAgICAgICAgICAgICAgICAgICBib2R5IGZpcnN0IGVsZW1lbnQgLCBhbmQgaWYgaXQgY29udGFpbnMgbW9yZSB0aGFuIG9uZSBjaGlsZGVybiB0YWtlIGl0aAotICAgICAqICAgICAgICAgICAgICAgICAgICBlbGVtZW50IGFuZCBjb252ZXJ0IHRoYXQgdG8gaXRoIGphdmF0eXBlIGFuZCBmaWxsIHRoZSByZXR1cm4gYXJyeWEgdGhlCi0gICAgICogICAgICAgICAgICAgICAgICAgIGFycmF5IHdpbGwgbG9vayBsaWtlIGFzIGZvbGxvd3MgW0ludGVnZXIsIFN0cmluZywgTXlCZWFuICwgZXRjXQotICAgICAqIEByZXR1cm4gT2JqZWN0IGFycmF5ICwgd2hpYyB3aWxsIGNvbnRhaW5zIHJlYWwgb2JqZWN0ICwgYnV0IHRoZSBvYmplY3QgY2FuIGVpdGhlciBiZSBzaW1wbGUKLSAgICAgKiAgICAgICAgIHR5cGUgb2JqZWN0IG9yIHRoZSBKYXZhQmVhbnMsIHRoYXRzIHdoYXQgdGhpcyBtZXRob2QgY2FuIGhhbmRsZSByaWdodCBub3cgdGhlIHJldHVybgotICAgICAqICAgICAgICAgYXJyYXkgd2lsbCBjb250YWlucyBbMTAsICJBeGlzMkVjaG8iLCB7ImZvbyIsImJhYSIsIjExIn1dCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQgYSBwcm9ibGVtIG9jY3VycmVkLCBlaXRoZXIgbG9jYWxseSBvciBvbiB0aGUgb3RoZXIgc2lkZSBvZiB0aGUgd2lyZQotICAgICAqLwotCi0gICAgcHVibGljIE9iamVjdFtdIGludm9rZUJsb2NraW5nKFFOYW1lIG9wTmFtZSwgT2JqZWN0IFtdIGFyZ3MsIENsYXNzIFtdIHJldHVyblR5cGVzKQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSBCZWFuVXRpbC5nZXRPTUVsZW1lbnQob3BOYW1lLCBhcmdzLCBudWxsLCBmYWxzZSwgbnVsbCk7Ci0gICAgICAgIE9NRWxlbWVudCByZXNwb25zZTsKLSAgICAgICAgaWYgKG5vdE51bGxTZXJ2aWNlKSB7Ci0gICAgICAgICAgICByZXNwb25zZSA9IHN1cGVyLnNlbmRSZWNlaXZlKG9wTmFtZSwgb21FbGVtZW50KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJlc3BvbnNlID0gc3VwZXIuc2VuZFJlY2VpdmUob21FbGVtZW50KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gQmVhblV0aWwuZGVzZXJpYWxpemUocmVzcG9uc2UsIHJldHVyblR5cGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERlZmF1bHRPYmplY3RTdXBwbGllcigpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbnZva2UgdGhlIG5vbmJsb2NraW5nL0FzeW5jaHJvbm91cyBjYWxsCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb3BOYW1lIE9wZXJhdGlvbiBRTmFtZSAodG8gZ2V0IHRoZSBib2R5IHdyYXBwZXIgZWxlbWVudCkKLSAgICAgKiBAcGFyYW0gYXJncyBhbiBhcnJheSBvZiBhcmd1bWVudCBPYmplY3RzCi0gICAgICogQHBhcmFtIGNhbGxiYWNrIG9iamVjdCBleHRlbmRpbmcgQ2FsbGJhY2sgd2hpY2ggd2lsbCByZWNlaXZlIG5vdGlmaWNhdGlvbnMKLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdCBpbiBjYXNlIG9mIGEgbG9jYWwgcHJvY2Vzc2luZyBlcnJvcgotICAgICAqIEBkZXByZWNhdGVkIFBsZWFzZSB1c2UgdGhlIEF4aXNDYWxsYmFjayBpbnRlcmZhY2UgcmF0aGVyIHRoYW4gQ2FsbGJhY2ssIHdoaWNoIGhhcyBiZWVuIGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbnZva2VOb25CbG9ja2luZyhRTmFtZSBvcE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IFtdIGFyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbGJhY2sgY2FsbGJhY2spCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IEJlYW5VdGlsLmdldE9NRWxlbWVudChvcE5hbWUsIGFyZ3MsIG51bGwsIGZhbHNlLCBudWxsKTsKLSAgICAgICAgLy8gY2FsbCB0aGUgdW5kZXJseWluZyBpbXBsZW1lbnRhdGlvbgotICAgICAgICBpZiAobm90TnVsbFNlcnZpY2UpIHsKLSAgICAgICAgICAgIHN1cGVyLnNlbmRSZWNlaXZlTm9uQmxvY2tpbmcob3BOYW1lLCBvbUVsZW1lbnQsIGNhbGxiYWNrKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHN1cGVyLnNlbmRSZWNlaXZlTm9uQmxvY2tpbmcob21FbGVtZW50LCBjYWxsYmFjayk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbnZva2UgdGhlIG5vbmJsb2NraW5nL0FzeW5jaHJvbm91cyBjYWxsCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb3BOYW1lIE9wZXJhdGlvbiBRTmFtZSAodG8gZ2V0IHRoZSBib2R5IHdyYXBwZXIgZWxlbWVudCkKLSAgICAgKiBAcGFyYW0gYXJncyBhbiBhcnJheSBvZiBhcmd1bWVudCBPYmplY3RzCi0gICAgICogQHBhcmFtIGNhbGxiYWNrIG9iamVjdCBpbXBsZW1lbnRpbmcgQXhpc0NhbGxiYWNrIHdoaWNoIHdpbGwgcmVjZWl2ZSBub3RpZmljYXRpb25zCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQgaW4gY2FzZSBvZiBhIGxvY2FsIHByb2Nlc3NpbmcgZXJyb3IKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbnZva2VOb25CbG9ja2luZyhRTmFtZSBvcE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IFtdIGFyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXhpc0NhbGxiYWNrIGNhbGxiYWNrKQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSBCZWFuVXRpbC5nZXRPTUVsZW1lbnQob3BOYW1lLCBhcmdzLCBudWxsLCBmYWxzZSwgbnVsbCk7Ci0gICAgICAgIC8vIGNhbGwgdGhlIHVuZGVybHlpbmcgaW1wbGVtZW50YXRpb24KLSAgICAgICAgaWYgKG5vdE51bGxTZXJ2aWNlKSB7Ci0gICAgICAgICAgICBzdXBlci5zZW5kUmVjZWl2ZU5vbkJsb2NraW5nKG9wTmFtZSwgb21FbGVtZW50LCBjYWxsYmFjayk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzdXBlci5zZW5kUmVjZWl2ZU5vbkJsb2NraW5nKG9tRWxlbWVudCwgY2FsbGJhY2spOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaW52b2tlUm9idXN0KFFOYW1lIG9wTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IFtdIGFyZ3MpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gQmVhblV0aWwuZ2V0T01FbGVtZW50KG9wTmFtZSwgYXJncywgbnVsbCwgZmFsc2UsIG51bGwpOwotICAgICAgICAvL2NhbGwgdGhlIHVuZGVybGluZSBpbXBsZW1lbnRhdGlvbgotICAgICAgICBpZiAobm90TnVsbFNlcnZpY2UpIHsKLSAgICAgICAgICAgIHN1cGVyLnNlbmRSb2J1c3Qob3BOYW1lLCBvbUVsZW1lbnQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3VwZXIuc2VuZFJvYnVzdChvbUVsZW1lbnQpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JwYy9yZWNlaXZlcnMvUlBDSW5Pbmx5TWVzc2FnZVJlY2VpdmVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvcnBjL3JlY2VpdmVycy9SUENJbk9ubHlNZXNzYWdlUmVjZWl2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJkNTlkZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvcnBjL3JlY2VpdmVycy9SUENJbk9ubHlNZXNzYWdlUmVjZWl2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5ycGMucmVjZWl2ZXJzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc01lc3NhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLkFic3RyYWN0SW5NZXNzYWdlUmVjZWl2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLQotcHVibGljIGNsYXNzIFJQQ0luT25seU1lc3NhZ2VSZWNlaXZlciBleHRlbmRzIEFic3RyYWN0SW5NZXNzYWdlUmVjZWl2ZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFJQQ0luT25seU1lc3NhZ2VSZWNlaXZlci5jbGFzcyk7Ci0KLSAgICBwdWJsaWMgdm9pZCBpbnZva2VCdXNpbmVzc0xvZ2ljKE1lc3NhZ2VDb250ZXh0IGluTWVzc2FnZSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIE1ldGhvZCBtZXRob2QgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gZ2V0IHRoZSBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgdGhlIFdlYiBTZXJ2aWNlCi0gICAgICAgICAgICBPYmplY3Qgb2JqID0gZ2V0VGhlSW1wbGVtZW50YXRpb25PYmplY3QoaW5NZXNzYWdlKTsKLQotICAgICAgICAgICAgQ2xhc3MgSW1wbENsYXNzID0gb2JqLmdldENsYXNzKCk7Ci0KLSAgICAgICAgICAgIEF4aXNPcGVyYXRpb24gb3AgPSBpbk1lc3NhZ2UuZ2V0T3BlcmF0aW9uQ29udGV4dCgpLmdldEF4aXNPcGVyYXRpb24oKTsKLQotICAgICAgICAgICAgT01FbGVtZW50IG1ldGhvZEVsZW1lbnQgPSBpbk1lc3NhZ2UuZ2V0RW52ZWxvcGUoKS5nZXRCb2R5KCkKLSAgICAgICAgICAgICAgICAgICAgLmdldEZpcnN0RWxlbWVudCgpOwotCi0gICAgICAgICAgICBBeGlzTWVzc2FnZSBpbkF4aXNNZXNzYWdlID0gb3AuZ2V0TWVzc2FnZShXU0RMQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfSU5fVkFMVUUpOwotICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2VOYW1lU3BhY2UgPSBudWxsOwotICAgICAgICAgICAgU3RyaW5nIG1ldGhvZE5hbWUgPSBvcC5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICBNZXRob2RbXSBtZXRob2RzID0gSW1wbENsYXNzLmdldE1ldGhvZHMoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChtZXRob2RzW2ldLmdldE5hbWUoKS5lcXVhbHMobWV0aG9kTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gbWV0aG9kc1tpXTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGluQXhpc01lc3NhZ2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFJQQ1V0aWwuaW52b2tlU2VydmljZUNsYXNzKGluQXhpc01lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QsCi0gICAgICAgICAgICAgICAgICAgICAgICBvYmosCi0gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlTmFtZVNwYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kRWxlbWVudCxpbk1lc3NhZ2UpOwotCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXBsaWNhdGVTdGF0ZShpbk1lc3NhZ2UpOwotICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIFRocm93YWJsZSBjYXVzZSA9IGUuZ2V0Q2F1c2UoKTsKLSAgICAgICAgICAgIGlmIChjYXVzZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG1zZyA9IGNhdXNlLmdldE1lc3NhZ2UoKTsKLSAgICAgICAgICAgICAgICBpZiAobXNnID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbXNnID0gIkV4Y2VwdGlvbiBvY2N1cnJlZCB3aGlsZSB0cnlpbmcgdG8gaW52b2tlIHNlcnZpY2UgbWV0aG9kICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZC5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGxvZy5lcnJvcihtc2csIGNhdXNlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgY2F1c2UgPSBlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhyb3cgQXhpc0ZhdWx0Lm1ha2VGYXVsdChjYXVzZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbXNnID0gIkV4Y2VwdGlvbiBvY2N1cnJlZCB3aGlsZSB0cnlpbmcgdG8gaW52b2tlIHNlcnZpY2UgbWV0aG9kICIgKwotICAgICAgICAgICAgICAgICAgICBtZXRob2QuZ2V0TmFtZSgpOwotICAgICAgICAgICAgbG9nLmVycm9yKG1zZywgZSk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KG1zZywgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvcnBjL3JlY2VpdmVycy9SUENJbk91dEFzeW5jTWVzc2FnZVJlY2VpdmVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvcnBjL3JlY2VpdmVycy9SUENJbk91dEFzeW5jTWVzc2FnZVJlY2VpdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiNGQ2YWEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JwYy9yZWNlaXZlcnMvUlBDSW5PdXRBc3luY01lc3NhZ2VSZWNlaXZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5ycGMucmVjZWl2ZXJzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzTWVzc2FnZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLldTREwyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uamF2YTJ3c2RsLkphdmEyV1NETENvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5BYnN0cmFjdEluT3V0QXN5bmNNZXNzYWdlUmVjZWl2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLQotcHVibGljIGNsYXNzIFJQQ0luT3V0QXN5bmNNZXNzYWdlUmVjZWl2ZXIgZXh0ZW5kcyBBYnN0cmFjdEluT3V0QXN5bmNNZXNzYWdlUmVjZWl2ZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFJQQ0luT25seU1lc3NhZ2VSZWNlaXZlci5jbGFzcyk7Ci0KLSAgICAvKioKLSAgICAgKiByZWZsZWN0IGFuZCBnZXQgdGhlIEphdmEgbWV0aG9kIC0gZm9yIGVhY2ggaSd0aCBwYXJhbSBpbiB0aGUgamF2YSBtZXRob2QgLSBnZXQgdGhlIGZpcnN0Ci0gICAgICogY2hpbGQncyBpJ3RoIGNoaWxkIC1pZiB0aGUgZWxlbSBoYXMgYW4geHNpOnR5cGUgYXR0ciB0aGVuIGZpbmQgdGhlIGRlc2VyaWFsaXplciBmb3IgaXQgLSBpZgotICAgICAqIG5vdCBmb3VuZCwgbG9va3VwIGRlc2VyIGZvciB0aCBpJ3RoIHBhcmFtIChqYXZhIHR5cGUpIC0gZXJyb3IgaWYgbm90IGZvdW5kIC0gZGVzZXJpYWxpemUgJgotICAgICAqIHNhdmUgaW4gYW4gb2JqZWN0IGFycmF5IC0gZW5kIGZvcgotICAgICAqIDxwLz4KLSAgICAgKiAtIGludm9rZSBtZXRob2QgYW5kIGdldCB0aGUgcmV0dXJuIHZhbHVlCi0gICAgICogPHAvPgotICAgICAqIC0gbG9vayB1cCBzZXJpYWxpemVyIGZvciByZXR1cm4gdmFsdWUgYmFzZWQgb24gdGhlIHZhbHVlIGFuZCB0eXBlCi0gICAgICogPHAvPgotICAgICAqIC0gY3JlYXRlIHJlc3BvbnNlIG1zZyBhbmQgYWRkIHJldHVybiB2YWx1ZSBhcyBncmFuZCBjaGlsZCBvZiA8c29hcDpib2R5PgotICAgICAqCi0gICAgICogQHBhcmFtIGluTWVzc2FnZQotICAgICAqIEBwYXJhbSBvdXRNZXNzYWdlCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQKLSAgICAgKi8KLQotICAgIHB1YmxpYyB2b2lkIGludm9rZUJ1c2luZXNzTG9naWMoTWVzc2FnZUNvbnRleHQgaW5NZXNzYWdlLCBNZXNzYWdlQ29udGV4dCBvdXRNZXNzYWdlKQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIE1ldGhvZCBtZXRob2QgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gZ2V0IHRoZSBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgdGhlIFdlYiBTZXJ2aWNlCi0gICAgICAgICAgICBPYmplY3Qgb2JqID0gZ2V0VGhlSW1wbGVtZW50YXRpb25PYmplY3QoaW5NZXNzYWdlKTsKLQotICAgICAgICAgICAgQ2xhc3MgSW1wbENsYXNzID0gb2JqLmdldENsYXNzKCk7Ci0KLSAgICAgICAgICAgIEF4aXNPcGVyYXRpb24gb3AgPSBpbk1lc3NhZ2UuZ2V0T3BlcmF0aW9uQ29udGV4dCgpLmdldEF4aXNPcGVyYXRpb24oKTsKLSAgICAgICAgICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2UgPSBpbk1lc3NhZ2UuZ2V0QXhpc1NlcnZpY2UoKTsKLSAgICAgICAgICAgIE9NRWxlbWVudCBtZXRob2RFbGVtZW50ID0gaW5NZXNzYWdlLmdldEVudmVsb3BlKCkuZ2V0Qm9keSgpCi0gICAgICAgICAgICAgICAgICAgIC5nZXRGaXJzdEVsZW1lbnQoKTsKLQotICAgICAgICAgICAgQXhpc01lc3NhZ2UgaW5heGlzTWVzc2FnZSA9IG9wLmdldE1lc3NhZ2UoV1NETENvbnN0YW50cy5NRVNTQUdFX0xBQkVMX0lOX1ZBTFVFKTsKLSAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlTmFtZVNwYWNlID0gbnVsbDsKLSAgICAgICAgICAgIFN0cmluZyBtZXRob2ROYW1lID0gb3AuZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgTWV0aG9kW10gbWV0aG9kcyA9IEltcGxDbGFzcy5nZXRNZXRob2RzKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAobWV0aG9kc1tpXS5nZXROYW1lKCkuZXF1YWxzKG1ldGhvZE5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1ldGhvZCA9IG1ldGhvZHNbaV07Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE9iamVjdCByZXNPYmplY3QgPSBudWxsOwotICAgICAgICAgICAgaWYgKGluYXhpc01lc3NhZ2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJlc09iamVjdCA9IFJQQ1V0aWwuaW52b2tlU2VydmljZUNsYXNzKGluYXhpc01lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QsCi0gICAgICAgICAgICAgICAgICAgICAgICBvYmosCi0gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlTmFtZVNwYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kRWxlbWVudCxpbk1lc3NhZ2UpOwotICAgICAgICAgICAgfQotCi0KLSAgICAgICAgICAgIFNPQVBGYWN0b3J5IGZhYyA9IGdldFNPQVBGYWN0b3J5KGluTWVzc2FnZSk7Ci0KLSAgICAgICAgICAgIC8vIEhhbmRsaW5nIHRoZSByZXNwb25zZQotCi0gICAgICAgICAgICBBeGlzTWVzc2FnZSBvdXRheGlzTWVzc2FnZSA9IG9wLmdldE1lc3NhZ2UoV1NETENvbnN0YW50cy5NRVNTQUdFX0xBQkVMX09VVF9WQUxVRSk7Ci0gICAgICAgICAgICBpZiAob3V0YXhpc01lc3NhZ2UgIT0gbnVsbCAmJiBvdXRheGlzTWVzc2FnZS5nZXRFbGVtZW50UU5hbWUoKSAhPW51bGwpIHsKLSAgICAgICAgICAgICAgICBtZXNzYWdlTmFtZVNwYWNlID0gb3V0YXhpc01lc3NhZ2UuZ2V0RWxlbWVudFFOYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1lc3NhZ2VOYW1lU3BhY2UgPSBzZXJ2aWNlLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBPTU5hbWVzcGFjZSBucyA9IGZhYy5jcmVhdGVPTU5hbWVzcGFjZShtZXNzYWdlTmFtZVNwYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZS5nZXRTY2hlbWFUYXJnZXROYW1lc3BhY2VQcmVmaXgoKSk7Ci0gICAgICAgICAgICBTT0FQRW52ZWxvcGUgZW52ZWxvcGUgPSBmYWMuZ2V0RGVmYXVsdEVudmVsb3BlKCk7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgYm9keUNvbnRlbnQgPSBudWxsOwotCi0gICAgICAgICAgICBpZiAoV1NETDJDb25zdGFudHMuTUVQX1VSSV9ST0JVU1RfSU5fT05MWS5lcXVhbHMoCi0gICAgICAgICAgICAgICAgICAgIG9wLmdldE1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4oKSkpewotICAgICAgICAgICAgICAgIE9NRWxlbWVudCBib2R5Q2hpbGQgPSBmYWMuY3JlYXRlT01FbGVtZW50KG91dE1lc3NhZ2UuZ2V0QXhpc01lc3NhZ2UoKS5nZXROYW1lKCksIG5zKTsKLSAgICAgICAgICAgICAgICBlbnZlbG9wZS5nZXRCb2R5KCkuYWRkQ2hpbGQoYm9keUNoaWxkKTsKLSAgICAgICAgICAgICAgICBvdXRNZXNzYWdlLnNldEVudmVsb3BlKGVudmVsb3BlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBQYXJhbWV0ZXIgZ2VuZXJhdGVCYXJlID0gc2VydmljZS5nZXRQYXJhbWV0ZXIoSmF2YTJXU0RMQ29uc3RhbnRzLkRPQ19MSVRfQkFSRV9QQVJBTUVURVIpOwotICAgICAgICAgICAgaWYgKGdlbmVyYXRlQmFyZSE9bnVsbCAmJiAidHJ1ZSIuZXF1YWxzKGdlbmVyYXRlQmFyZS5nZXRWYWx1ZSgpKSkgewotICAgICAgICAgICAgICAgIFJQQ1V0aWwucHJvY2Vzc1Jlc29uc2VBc0RvY0xpdEJhcmUocmVzT2JqZWN0LCBzZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgZW52ZWxvcGUsIGZhYywgbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICBib2R5Q29udGVudCwgb3V0TWVzc2FnZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFJQQ1V0aWwucHJvY2Vzc1Jlc3BvbnNlQXNEb2NMaXRXcmFwcGVkKHJlc09iamVjdCwgc2VydmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZCwgZW52ZWxvcGUsIGZhYywgbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICBib2R5Q29udGVudCwgb3V0TWVzc2FnZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAgb3V0TWVzc2FnZS5zZXRFbnZlbG9wZShlbnZlbG9wZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgU3RyaW5nIG1zZyA9IG51bGw7Ci0gICAgICAgICAgICBUaHJvd2FibGUgY2F1c2UgPSBlLmdldENhdXNlKCk7Ci0gICAgICAgICAgICBpZiAoY2F1c2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1zZyA9IGNhdXNlLmdldE1lc3NhZ2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtc2cgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1zZyA9ICJFeGNlcHRpb24gb2NjdXJyZWQgd2hpbGUgdHJ5aW5nIHRvIGludm9rZSBzZXJ2aWNlIG1ldGhvZCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZC5nZXROYW1lKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBsb2cuZXJyb3IobXNnLCBlKTsKLSAgICAgICAgICAgIGlmIChjYXVzZSBpbnN0YW5jZW9mIEF4aXNGYXVsdCkgewotICAgICAgICAgICAgICAgIHRocm93IChBeGlzRmF1bHQpY2F1c2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KG1zZyk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbXNnID0gIkV4Y2VwdGlvbiBvY2N1cnJlZCB3aGlsZSB0cnlpbmcgdG8gaW52b2tlIHNlcnZpY2UgbWV0aG9kICIgKwotICAgICAgICAgICAgICAgICAgICBtZXRob2QuZ2V0TmFtZSgpOwotICAgICAgICAgICAgbG9nLmVycm9yKG1zZywgZSk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KG1zZywgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvcnBjL3JlY2VpdmVycy9SUENNZXNzYWdlUmVjZWl2ZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9ycGMvcmVjZWl2ZXJzL1JQQ01lc3NhZ2VSZWNlaXZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjhjMjc5Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9ycGMvcmVjZWl2ZXJzL1JQQ01lc3NhZ2VSZWNlaXZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qCi0qIFJlZmxlY3Rpb24gYmFzZWQgUlBDTWVzc2FnZVJlY2VpdmVyICwgcmVxdWVzdCB3aWxsIGJlIHByb2Nlc3NlZCBieSBsb29raW5nIGF0IHRoZSBtZXRob2Qgc2lnbmF0dXJlCi0qIG9mIHRoZSBpbnZvY2F0aW9uIG1ldGhvZAotKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5ycGMucmVjZWl2ZXJzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzTWVzc2FnZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLldTREwyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uamF2YTJ3c2RsLkphdmEyV1NETENvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5BYnN0cmFjdEluT3V0TWVzc2FnZVJlY2VpdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci0KLXB1YmxpYyBjbGFzcyBSUENNZXNzYWdlUmVjZWl2ZXIgZXh0ZW5kcyBBYnN0cmFjdEluT3V0TWVzc2FnZVJlY2VpdmVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coUlBDTWVzc2FnZVJlY2VpdmVyLmNsYXNzKTsKLQotICAgIC8qKgotICAgICAqIHJlZmxlY3QgYW5kIGdldCB0aGUgSmF2YSBtZXRob2QgLSBmb3IgZWFjaCBpJ3RoIHBhcmFtIGluIHRoZSBqYXZhIG1ldGhvZCAtIGdldCB0aGUgZmlyc3QKLSAgICAgKiBjaGlsZCdzIGkndGggY2hpbGQgLWlmIHRoZSBlbGVtIGhhcyBhbiB4c2k6dHlwZSBhdHRyIHRoZW4gZmluZCB0aGUgZGVzZXJpYWxpemVyIGZvciBpdCAtIGlmCi0gICAgICogbm90IGZvdW5kLCBsb29rdXAgZGVzZXIgZm9yIHRoIGkndGggcGFyYW0gKGphdmEgdHlwZSkgLSBlcnJvciBpZiBub3QgZm91bmQgLSBkZXNlcmlhbGl6ZSAmCi0gICAgICogc2F2ZSBpbiBhbiBvYmplY3QgYXJyYXkgLSBlbmQgZm9yCi0gICAgICogPHAvPgotICAgICAqIC0gaW52b2tlIG1ldGhvZCBhbmQgZ2V0IHRoZSByZXR1cm4gdmFsdWUKLSAgICAgKiA8cC8+Ci0gICAgICogLSBsb29rIHVwIHNlcmlhbGl6ZXIgZm9yIHJldHVybiB2YWx1ZSBiYXNlZCBvbiB0aGUgdmFsdWUgYW5kIHR5cGUKLSAgICAgKiA8cC8+Ci0gICAgICogLSBjcmVhdGUgcmVzcG9uc2UgbXNnIGFuZCBhZGQgcmV0dXJuIHZhbHVlIGFzIGdyYW5kIGNoaWxkIG9mIDxzb2FwOmJvZHk+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gaW5NZXNzYWdlIGluY29taW5nIE1lc3NhZ2VDb250ZXh0Ci0gICAgICogQHBhcmFtIG91dE1lc3NhZ2Ugb3V0Z29pbmcgTWVzc2FnZUNvbnRleHQKLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdAotICAgICAqLwotCi0gICAgcHVibGljIHZvaWQgaW52b2tlQnVzaW5lc3NMb2dpYyhNZXNzYWdlQ29udGV4dCBpbk1lc3NhZ2UsIE1lc3NhZ2VDb250ZXh0IG91dE1lc3NhZ2UpCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgTWV0aG9kIG1ldGhvZCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBnZXQgdGhlIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciB0aGUgV2ViIFNlcnZpY2UKLSAgICAgICAgICAgIE9iamVjdCBvYmogPSBnZXRUaGVJbXBsZW1lbnRhdGlvbk9iamVjdChpbk1lc3NhZ2UpOwotCi0gICAgICAgICAgICBDbGFzcyBJbXBsQ2xhc3MgPSBvYmouZ2V0Q2xhc3MoKTsKLQotICAgICAgICAgICAgQXhpc09wZXJhdGlvbiBvcCA9IGluTWVzc2FnZS5nZXRPcGVyYXRpb25Db250ZXh0KCkuZ2V0QXhpc09wZXJhdGlvbigpOwotICAgICAgICAgICAgbWV0aG9kID0gKE1ldGhvZCkob3AuZ2V0UGFyYW1ldGVyVmFsdWUoIm15TWV0aG9kIikpOwotICAgICAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSA9IGluTWVzc2FnZS5nZXRBeGlzU2VydmljZSgpOwotICAgICAgICAgICAgT01FbGVtZW50IG1ldGhvZEVsZW1lbnQgPSBpbk1lc3NhZ2UuZ2V0RW52ZWxvcGUoKS5nZXRCb2R5KCkKLSAgICAgICAgICAgICAgICAgICAgLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgICAgICAgQXhpc01lc3NhZ2UgaW5BeGlzTWVzc2FnZSA9IG9wLmdldE1lc3NhZ2UoV1NETENvbnN0YW50cy5NRVNTQUdFX0xBQkVMX0lOX1ZBTFVFKTsKLSAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlTmFtZVNwYWNlID0gbnVsbDsKLQotCi0gICAgICAgICAgICBpZiAobWV0aG9kID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbWV0aG9kTmFtZSA9IG9wLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICBNZXRob2RbXSBtZXRob2RzID0gSW1wbENsYXNzLmdldE1ldGhvZHMoKTsKLQotICAgICAgICAgICAgICAgIGZvciAoTWV0aG9kIG1ldGhvZDEgOiBtZXRob2RzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtZXRob2QxLmdldE5hbWUoKS5lcXVhbHMobWV0aG9kTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZCA9IG1ldGhvZDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcC5hZGRQYXJhbWV0ZXIoIm15TWV0aG9kIiwgbWV0aG9kKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtZXRob2QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJObyBzdWNoIG1ldGhvZCAnIiArIG1ldGhvZE5hbWUgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICInIGluIGNsYXNzICIgKyBJbXBsQ2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBPYmplY3QgcmVzT2JqZWN0ID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChpbkF4aXNNZXNzYWdlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXNPYmplY3QgPSBSUENVdGlsLmludm9rZVNlcnZpY2VDbGFzcyhpbkF4aXNNZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kLAotICAgICAgICAgICAgICAgICAgICAgICAgb2JqLAotICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZU5hbWVTcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEVsZW1lbnQsaW5NZXNzYWdlKTsKLSAgICAgICAgICAgIH0KLQotCi0gICAgICAgICAgICBTT0FQRmFjdG9yeSBmYWMgPSBnZXRTT0FQRmFjdG9yeShpbk1lc3NhZ2UpOwotCi0gICAgICAgICAgICAvLyBIYW5kbGluZyB0aGUgcmVzcG9uc2UKLSAgICAgICAgICAgIEF4aXNNZXNzYWdlIG91dGF4aXNNZXNzYWdlID0gb3AuZ2V0TWVzc2FnZShXU0RMQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfT1VUX1ZBTFVFKTsKLSAgICAgICAgICAgIGlmIChvdXRheGlzTWVzc2FnZSAhPSBudWxsICYmIG91dGF4aXNNZXNzYWdlLmdldEVsZW1lbnRRTmFtZSgpICE9bnVsbCkgewotICAgICAgICAgICAgICAgIG1lc3NhZ2VOYW1lU3BhY2UgPSBvdXRheGlzTWVzc2FnZS5nZXRFbGVtZW50UU5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbWVzc2FnZU5hbWVTcGFjZSA9IHNlcnZpY2UuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIE9NTmFtZXNwYWNlIG5zID0gZmFjLmNyZWF0ZU9NTmFtZXNwYWNlKG1lc3NhZ2VOYW1lU3BhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLmdldFNjaGVtYVRhcmdldE5hbWVzcGFjZVByZWZpeCgpKTsKLSAgICAgICAgICAgIFNPQVBFbnZlbG9wZSBlbnZlbG9wZSA9IGZhYy5nZXREZWZhdWx0RW52ZWxvcGUoKTsKLSAgICAgICAgICAgIE9NRWxlbWVudCBib2R5Q29udGVudCA9IG51bGw7Ci0KLSAgICAgICAgICAgIGlmIChXU0RMMkNvbnN0YW50cy5NRVBfVVJJX1JPQlVTVF9JTl9PTkxZLmVxdWFscygKLSAgICAgICAgICAgICAgICAgICAgb3AuZ2V0TWVzc2FnZUV4Y2hhbmdlUGF0dGVybigpKSl7Ci0gICAgICAgICAgICAgICAgT01FbGVtZW50IGJvZHlDaGlsZCA9IGZhYy5jcmVhdGVPTUVsZW1lbnQob3V0TWVzc2FnZS5nZXRBeGlzTWVzc2FnZSgpLmdldE5hbWUoKSwgbnMpOwotICAgICAgICAgICAgICAgIGVudmVsb3BlLmdldEJvZHkoKS5hZGRDaGlsZChib2R5Q2hpbGQpOwotICAgICAgICAgICAgICAgIG91dE1lc3NhZ2Uuc2V0RW52ZWxvcGUoZW52ZWxvcGUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFBhcmFtZXRlciBnZW5lcmF0ZUJhcmUgPSBzZXJ2aWNlLmdldFBhcmFtZXRlcihKYXZhMldTRExDb25zdGFudHMuRE9DX0xJVF9CQVJFX1BBUkFNRVRFUik7Ci0gICAgICAgICAgICBpZiAoZ2VuZXJhdGVCYXJlIT1udWxsICYmICJ0cnVlIi5lcXVhbHMoZ2VuZXJhdGVCYXJlLmdldFZhbHVlKCkpKSB7Ci0gICAgICAgICAgICAgICAgUlBDVXRpbC5wcm9jZXNzUmVzb25zZUFzRG9jTGl0QmFyZShyZXNPYmplY3QsIHNlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBlbnZlbG9wZSwgZmFjLCBucywKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvZHlDb250ZW50LCBvdXRNZXNzYWdlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgUlBDVXRpbC5wcm9jZXNzUmVzcG9uc2VBc0RvY0xpdFdyYXBwZWQocmVzT2JqZWN0LCBzZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kLCBlbnZlbG9wZSwgZmFjLCBucywKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvZHlDb250ZW50LCBvdXRNZXNzYWdlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG91dE1lc3NhZ2Uuc2V0RW52ZWxvcGUoZW52ZWxvcGUpOwotICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIFN0cmluZyBtc2cgPSBudWxsOwotICAgICAgICAgICAgVGhyb3dhYmxlIGNhdXNlID0gZS5nZXRDYXVzZSgpOwotICAgICAgICAgICAgaWYgKGNhdXNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtc2cgPSBjYXVzZS5nZXRNZXNzYWdlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobXNnID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtc2cgPSAiRXhjZXB0aW9uIG9jY3VycmVkIHdoaWxlIHRyeWluZyB0byBpbnZva2Ugc2VydmljZSBtZXRob2QgIiArCi0gICAgICAgICAgICAgICAgCShtZXRob2QgIT0gbnVsbCA/IG1ldGhvZC5nZXROYW1lKCkgOiAibnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGNhdXNlIGluc3RhbmNlb2YgQXhpc0ZhdWx0KSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKG1zZywgY2F1c2UpOwotICAgICAgICAgICAgICAgIHRocm93IChBeGlzRmF1bHQpY2F1c2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBsb2cuZXJyb3IobXNnLCBlKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQobXNnLCBlKTsKLSAgICAgICAgfSBjYXRjaChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGxvZy5lcnJvcihlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgICAgICB0aHJvdyBBeGlzRmF1bHQubWFrZUZhdWx0KGUpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJFeGNlcHRpb24gb2NjdXJyZWQgd2hpbGUgdHJ5aW5nIHRvIGludm9rZSBzZXJ2aWNlIG1ldGhvZCAiICsKLSAgICAgICAgICAgIAkobWV0aG9kICE9IG51bGwgPyBtZXRob2QuZ2V0TmFtZSgpIDogIm51bGwiKTsKLSAgICAgICAgICAgIGxvZy5lcnJvcihtc2csIGUpOwotICAgICAgICAgICAgdGhyb3cgQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9ycGMvcmVjZWl2ZXJzL1JQQ1V0aWwuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9ycGMvcmVjZWl2ZXJzL1JQQ1V0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzM2YmI4OS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvcnBjL3JlY2VpdmVycy9SUENVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJwYy5yZWNlaXZlcnM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01OYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTVRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmJ1aWxkZXIuU3RBWE9NQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5mYWN0b3J5Lk9NWE1MQnVpbGRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS51dGlsLkJhc2U2NDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlbWFwcGluZy5TaW1wbGVUeXBlTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuTnVsbFhNTFN0cmVhbVJlYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNNZXNzYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5qYXZhMndzZGwuVHlwZVRhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLk9iamVjdFN1cHBsaWVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5TdHJlYW1XcmFwcGVyOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5BcnJheTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBSUENVdGlsIHsKLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBSRVRVUk5fV1JBUFBFUiA9ICJyZXR1cm4iOwotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHByb2Nlc3NSZXNwb25zZShTT0FQRmFjdG9yeSBmYWMsIE9iamVjdCByZXNPYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTUVsZW1lbnQgYm9keUNvbnRlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTU5hbWVzcGFjZSBucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPQVBFbnZlbG9wZSBlbnZlbG9wZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGhvZCBtZXRob2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHF1YWxpZmllZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVUYWJsZSB0eXBlVGFibGUpIHsKLSAgICAgICAgaWYgKHJlc09iamVjdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvL3NpbXBsZSB0eXBlCi0gICAgICAgICAgICBpZiAocmVzT2JqZWN0IGluc3RhbmNlb2YgT01FbGVtZW50KSB7Ci0gICAgICAgICAgICAgICAgT01FbGVtZW50IHJlc3VsdCA9IChPTUVsZW1lbnQpIHJlc09iamVjdDsKLSAgICAgICAgICAgICAgICBib2R5Q29udGVudCA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoCi0gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QuZ2V0TmFtZSgpICsgIlJlc3BvbnNlIiwgbnMpOwotICAgICAgICAgICAgICAgIE9NRWxlbWVudCByZXNXcmFwcGVyOwotICAgICAgICAgICAgICAgIGlmIChxdWFsaWZpZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzV3JhcHBlciA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoUkVUVVJOX1dSQVBQRVIsIG5zLmdldE5hbWVzcGFjZVVSSSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zLmdldFByZWZpeCgpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZXNXcmFwcGVyID0gZmFjLmNyZWF0ZU9NRWxlbWVudChSRVRVUk5fV1JBUFBFUiwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJlc1dyYXBwZXIuYWRkQ2hpbGQocmVzdWx0KTsKLSAgICAgICAgICAgICAgICBib2R5Q29udGVudC5hZGRDaGlsZChyZXNXcmFwcGVyKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoU2ltcGxlVHlwZU1hcHBlci5pc1NpbXBsZVR5cGUocmVzT2JqZWN0KSkgewotICAgICAgICAgICAgICAgIGJvZHlDb250ZW50ID0gZmFjLmNyZWF0ZU9NRWxlbWVudCgKLSAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZC5nZXROYW1lKCkgKyAiUmVzcG9uc2UiLCBucyk7Ci0gICAgICAgICAgICAgICAgT01FbGVtZW50IGNoaWxkOwotICAgICAgICAgICAgICAgIGlmIChxdWFsaWZpZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgY2hpbGQgPSBmYWMuY3JlYXRlT01FbGVtZW50KFJFVFVSTl9XUkFQUEVSLCBucyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgY2hpbGQgPSBmYWMuY3JlYXRlT01FbGVtZW50KFJFVFVSTl9XUkFQUEVSLCBudWxsKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2hpbGQuYWRkQ2hpbGQoZmFjLmNyZWF0ZU9NVGV4dChjaGlsZCwgU2ltcGxlVHlwZU1hcHBlci5nZXRTdHJpbmdWYWx1ZShyZXNPYmplY3QpKSk7Ci0gICAgICAgICAgICAgICAgYm9keUNvbnRlbnQuYWRkQ2hpbGQoY2hpbGQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBib2R5Q29udGVudCA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoCi0gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QuZ2V0TmFtZSgpICsgIlJlc3BvbnNlIiwgbnMpOwotICAgICAgICAgICAgICAgIC8vIEphdmEgQmVhbnMKLSAgICAgICAgICAgICAgICBRTmFtZSByZXR1cm5XcmFwcGVyOwotICAgICAgICAgICAgICAgIGlmIChxdWFsaWZpZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuV3JhcHBlciA9IG5ldyBRTmFtZShucy5nZXROYW1lc3BhY2VVUkkoKSwgUkVUVVJOX1dSQVBQRVIsIG5zLmdldFByZWZpeCgpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZXR1cm5XcmFwcGVyID0gbmV3IFFOYW1lKFJFVFVSTl9XUkFQUEVSKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhyID0gQmVhblV0aWwuZ2V0UHVsbFBhcnNlcihyZXNPYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5XcmFwcGVyLCB0eXBlVGFibGUsIHF1YWxpZmllZCwgZmFsc2UpOwotICAgICAgICAgICAgICAgIFN0QVhPTUJ1aWxkZXIgc3RBWE9NQnVpbGRlciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBPTVhNTEJ1aWxkZXJGYWN0b3J5LmNyZWF0ZVN0QVhPTUJ1aWxkZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpLCBuZXcgU3RyZWFtV3JhcHBlcih4cikpOwotICAgICAgICAgICAgICAgIE9NRWxlbWVudCBkb2N1bWVudEVsZW1lbnQgPSBzdEFYT01CdWlsZGVyLmdldERvY3VtZW50RWxlbWVudCgpOwotICAgICAgICAgICAgICAgIGlmIChkb2N1bWVudEVsZW1lbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBib2R5Q29udGVudC5hZGRDaGlsZChkb2N1bWVudEVsZW1lbnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoYm9keUNvbnRlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgZW52ZWxvcGUuZ2V0Qm9keSgpLmFkZENoaWxkKGJvZHlDb250ZW50KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwcm9jZXNzT2JqZWN0QXNEb2NMaXRCYXJlKFNPQVBGYWN0b3J5IGZhYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgcmVzT2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NRWxlbWVudCBib2R5Q29udGVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTU5hbWVzcGFjZSBucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT0FQRW52ZWxvcGUgZW52ZWxvcGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBxdWFsaWZpZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZVRhYmxlIHR5cGVUYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGFydE5hbWUpIHsKLSAgICAgICAgaWYgKHJlc09iamVjdCBpbnN0YW5jZW9mIE9NRWxlbWVudCkgewotICAgICAgICAgICAgT01FbGVtZW50IHJlc3VsdCA9IChPTUVsZW1lbnQpIHJlc09iamVjdDsKLSAgICAgICAgICAgIGJvZHlDb250ZW50ID0gZmFjLmNyZWF0ZU9NRWxlbWVudCgKLSAgICAgICAgICAgICAgICAgICAgcGFydE5hbWUsIG5zKTsKLSAgICAgICAgICAgIGJvZHlDb250ZW50LmFkZENoaWxkKHJlc3VsdCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoU2ltcGxlVHlwZU1hcHBlci5pc1NpbXBsZVR5cGUocmVzT2JqZWN0KSkgewotICAgICAgICAgICAgYm9keUNvbnRlbnQgPSBmYWMuY3JlYXRlT01FbGVtZW50KAotICAgICAgICAgICAgICAgICAgICBwYXJ0TmFtZSwgbnMpOwotICAgICAgICAgICAgYm9keUNvbnRlbnQuYWRkQ2hpbGQoZmFjLmNyZWF0ZU9NVGV4dChib2R5Q29udGVudCwKLSAgICAgICAgICAgICAgICAgICAgU2ltcGxlVHlwZU1hcHBlci5nZXRTdHJpbmdWYWx1ZShyZXNPYmplY3QpKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBRTmFtZSByZXR1cm5XcmFwcGVyID0gbmV3IFFOYW1lKG5zLmdldE5hbWVzcGFjZVVSSSgpLCBwYXJ0TmFtZSwgbnMuZ2V0UHJlZml4KCkpOwotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhyID0gQmVhblV0aWwuZ2V0UHVsbFBhcnNlcihyZXNPYmplY3QsCi0gICAgICAgICAgICAgICAgICAgIHJldHVybldyYXBwZXIsIHR5cGVUYWJsZSwgcXVhbGlmaWVkLCB0cnVlKTsKLSAgICAgICAgICAgIFN0QVhPTUJ1aWxkZXIgc3RBWE9NQnVpbGRlciA9Ci0gICAgICAgICAgICAgICAgICAgIE9NWE1MQnVpbGRlckZhY3RvcnkuY3JlYXRlU3RBWE9NQnVpbGRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKSwgbmV3IFN0cmVhbVdyYXBwZXIoeHIpKTsKLSAgICAgICAgICAgIE9NRWxlbWVudCBkb2N1bWVudEVsZW1lbnQgPSBzdEFYT01CdWlsZGVyLmdldERvY3VtZW50RWxlbWVudCgpOwotICAgICAgICAgICAgaWYgKGRvY3VtZW50RWxlbWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZW52ZWxvcGUuZ2V0Qm9keSgpLmFkZENoaWxkKGRvY3VtZW50RWxlbWVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJvZHlDb250ZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGVudmVsb3BlLmdldEJvZHkoKS5hZGRDaGlsZChib2R5Q29udGVudCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0W10gcHJvY2Vzc1JlcXVlc3QoT01FbGVtZW50IG1ldGhvZEVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRob2QgbWV0aG9kLCBPYmplY3RTdXBwbGllciBvYmplY3RTdXBwbGllcikKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBDbGFzc1tdIHBhcmFtZXRlcnMgPSBtZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKTsKLSAgICAgICAgcmV0dXJuIEJlYW5VdGlsLmRlc2VyaWFsaXplKG1ldGhvZEVsZW1lbnQsIHBhcmFtZXRlcnMsIG9iamVjdFN1cHBsaWVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBpbnZva2VTZXJ2aWNlQ2xhc3MoQXhpc01lc3NhZ2UgaW5BeGlzTWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kIG1ldGhvZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGltcGxDbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2VOYW1lU3BhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NRWxlbWVudCBtZXRob2RFbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlQ29udGV4dCBpbk1lc3NhZ2UpIHRocm93cyBBeGlzRmF1bHQsCi0gICAgICAgICAgICBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGluQXhpc01lc3NhZ2UuZ2V0RWxlbWVudFFOYW1lKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gbWV0aG9kIGFjY2VwdCBlbXB0eSBTT0FQYm9keQotICAgICAgICAgICAgcmV0dXJuIG1ldGhvZC5pbnZva2UoaW1wbENsYXNzLCBuZXcgT2JqZWN0WzBdKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFFOYW1lIGVsZW1lbnRRTmFtZSA9IGluQXhpc01lc3NhZ2UuZ2V0RWxlbWVudFFOYW1lKCk7Ci0gICAgICAgICAgICBtZXNzYWdlTmFtZVNwYWNlID0gZWxlbWVudFFOYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgT01OYW1lc3BhY2UgbmFtZXNwYWNlID0gbWV0aG9kRWxlbWVudC5nZXROYW1lc3BhY2UoKTsKLSAgICAgICAgICAgIGlmIChtZXNzYWdlTmFtZVNwYWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgibmFtZXNwYWNlIG1pc21hdGNoIHJlcXVpcmUgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZU5hbWVTcGFjZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBmb3VuZCBub25lIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICghbWVzc2FnZU5hbWVTcGFjZS5lcXVhbHMobmFtZXNwYWNlLmdldE5hbWVzcGFjZVVSSSgpKSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJuYW1lc3BhY2UgbWlzbWF0Y2ggcmVxdWlyZSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlTmFtZVNwYWNlICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGZvdW5kICIgKyBtZXRob2RFbGVtZW50LmdldE5hbWVzcGFjZSgpLmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG5hbWVzcGFjZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lc3BhY2UgbWlzbWF0Y2guIEF4aXMgT2VwcmF0aW9uIGV4cGVjdHMgbm9uLW5hbWVzcGFjZSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInF1YWxpZmllZCBlbGVtZW50LiBCdXQgcmVjZWl2ZWQgYSBuYW1lc3BhY2UgcXVhbGlmaWVkIGVsZW1lbnQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE9iamVjdFtdIG9iamVjdEFycmF5OwotICAgICAgICAgICAgaWYgKGluQXhpc01lc3NhZ2UuaXNXcmFwcGVkKCkpIHsKLSAgICAgICAgICAgICAgICBvYmplY3RBcnJheSA9IFJQQ1V0aWwucHJvY2Vzc1JlcXVlc3QobWV0aG9kRWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZCwgaW5NZXNzYWdlLmdldEF4aXNTZXJ2aWNlKCkuZ2V0T2JqZWN0U3VwcGxpZXIoKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG9iamVjdEFycmF5ID0gUlBDVXRpbC5wcm9jZXNzUmVxdWVzdCgoT01FbGVtZW50KSBtZXRob2RFbGVtZW50LmdldFBhcmVudCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kLCBpbk1lc3NhZ2UuZ2V0QXhpc1NlcnZpY2UoKS5nZXRPYmplY3RTdXBwbGllcigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBtZXRob2QuaW52b2tlKGltcGxDbGFzcywgb2JqZWN0QXJyYXkpOwotCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9NRWxlbWVudCBnZXRSZXNwb25zZUVsZW1lbnQoUU5hbWUgcmVzbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0W10gb2JqcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBxdWFsaWZpZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVUYWJsZSB0eXBlVGFibGUpIHsKLSAgICAgICAgaWYgKHF1YWxpZmllZCkgewotICAgICAgICAgICAgcmV0dXJuIEJlYW5VdGlsLmdldE9NRWxlbWVudChyZXNuYW1lLCBvYmpzLAotICAgICAgICAgICAgICAgICAgICBuZXcgUU5hbWUocmVzbmFtZS5nZXROYW1lc3BhY2VVUkkoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRVRVUk5fV1JBUFBFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNuYW1lLmdldFByZWZpeCgpKSwKLSAgICAgICAgICAgICAgICAgICAgcXVhbGlmaWVkLAotICAgICAgICAgICAgICAgICAgICB0eXBlVGFibGUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIEJlYW5VdGlsLmdldE9NRWxlbWVudChyZXNuYW1lLCBvYmpzLAotICAgICAgICAgICAgICAgICAgICBuZXcgUU5hbWUoUkVUVVJOX1dSQVBQRVIpLCBxdWFsaWZpZWQsCi0gICAgICAgICAgICAgICAgICAgIHR5cGVUYWJsZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcHJvY2Vzc1Jlc29uc2VBc0RvY0xpdEJhcmUoT2JqZWN0IHJlc09iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09BUEVudmVsb3BlIGVudmVsb3BlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT0FQRmFjdG9yeSBmYWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NTmFtZXNwYWNlIG5zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTUVsZW1lbnQgYm9keUNvbnRlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VDb250ZXh0IG91dE1lc3NhZ2UKLSAgICApIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBRTmFtZSBlbGVtZW50UU5hbWUgPSBvdXRNZXNzYWdlLmdldEF4aXNNZXNzYWdlKCkuZ2V0RWxlbWVudFFOYW1lKCk7Ci0gICAgICAgIFN0cmluZyBwYXJ0TmFtZSA9IG91dE1lc3NhZ2UuZ2V0QXhpc01lc3NhZ2UoKS5nZXRQYXJ0TmFtZSgpOwotICAgICAgICBpZiAocmVzT2JqZWN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHByb2Nlc3NOdWxsUmV0dXJucyhzZXJ2aWNlLCBlbnZlbG9wZSwgcGFydE5hbWUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKHJlc09iamVjdCBpbnN0YW5jZW9mIE9iamVjdFtdKSB7Ci0gICAgICAgICAgICAgICAgUU5hbWUgcmVzTmFtZSA9IG5ldyBRTmFtZShlbGVtZW50UU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBwYXJ0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRRTmFtZS5nZXRQcmVmaXgoKSk7Ci0gICAgICAgICAgICAgICAgT01FbGVtZW50IGJvZHlDaGlsZCA9IFJQQ1V0aWwuZ2V0UmVzcG9uc2VFbGVtZW50KHJlc05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAoT2JqZWN0W10pIHJlc09iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UuaXNFbGVtZW50Rm9ybURlZmF1bHQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UuZ2V0VHlwZVRhYmxlKCkpOwotICAgICAgICAgICAgICAgIGVudmVsb3BlLmdldEJvZHkoKS5hZGRDaGlsZChib2R5Q2hpbGQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAocmVzT2JqZWN0LmdldENsYXNzKCkuaXNBcnJheSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBsZW5ndGggPSBBcnJheS5nZXRMZW5ndGgocmVzT2JqZWN0KTsKLSAgICAgICAgICAgICAgICAgICAgT2JqZWN0IG9iakFycmF5W107Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXNPYmplY3QgaW5zdGFuY2VvZiBieXRlW10pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9iakFycmF5ID0gbmV3IE9iamVjdFsxXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9iakFycmF5WzBdID0gQmFzZTY0LmVuY29kZSgoYnl0ZVtdKSByZXNPYmplY3QpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgb2JqQXJyYXkgPSBuZXcgT2JqZWN0W2xlbmd0aF07Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqQXJyYXlbaV0gPSBBcnJheS5nZXQocmVzT2JqZWN0LCBpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIFFOYW1lIHJlc05hbWUgPSBuZXcgUU5hbWUoZWxlbWVudFFOYW1lLmdldE5hbWVzcGFjZVVSSSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRRTmFtZS5nZXRQcmVmaXgoKSk7Ci0gICAgICAgICAgICAgICAgICAgIE9NRWxlbWVudCBib2R5Q2hpbGQgPSBSUENVdGlsLmdldFJlc3BvbnNlRWxlbWVudChyZXNOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iakFycmF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UuaXNFbGVtZW50Rm9ybURlZmF1bHQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLmdldFR5cGVUYWJsZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgZW52ZWxvcGUuZ2V0Qm9keSgpLmFkZENoaWxkKGJvZHlDaGlsZCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKFNpbXBsZVR5cGVNYXBwZXIuaXNDb2xsZWN0aW9uKHJlc09iamVjdC5nZXRDbGFzcygpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbiBjb2xsZWN0aW9uID0gKENvbGxlY3Rpb24pIHJlc09iamVjdDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplID0gY29sbGVjdGlvbi5zaXplKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWVzW10gPSBuZXcgT2JqZWN0W3NpemVdOwotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBjb2xsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXNbY291bnRdID0gaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50Kys7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIFFOYW1lIHJlc05hbWUgPSBuZXcgUU5hbWUoZWxlbWVudFFOYW1lLmdldE5hbWVzcGFjZVVSSSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFFOYW1lLmdldFByZWZpeCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIE9NRWxlbWVudCBib2R5Q2hpbGQgPSBSUENVdGlsLmdldFJlc3BvbnNlRWxlbWVudChyZXNOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UuaXNFbGVtZW50Rm9ybURlZmF1bHQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZS5nZXRUeXBlVGFibGUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbnZlbG9wZS5nZXRCb2R5KCkuYWRkQ2hpbGQoYm9keUNoaWxkKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChTaW1wbGVUeXBlTWFwcGVyLmlzRGF0YUhhbmRsZXIocmVzT2JqZWN0LmdldENsYXNzKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBPTUVsZW1lbnQgcmVzRWxlbXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VydmljZS5pc0VsZW1lbnRGb3JtRGVmYXVsdCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzRWxlbXQgPSBmYWMuY3JlYXRlT01FbGVtZW50KHBhcnROYW1lLCBucyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc0VsZW10ID0gZmFjLmNyZWF0ZU9NRWxlbWVudChwYXJ0TmFtZSwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBPTVRleHQgdGV4dCA9IGZhYy5jcmVhdGVPTVRleHQocmVzT2JqZWN0LCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc0VsZW10LmFkZENoaWxkKHRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgZW52ZWxvcGUuZ2V0Qm9keSgpLmFkZENoaWxkKHJlc0VsZW10KTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXJ2aWNlLmlzRWxlbWVudEZvcm1EZWZhdWx0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBSUENVdGlsLnByb2Nlc3NPYmplY3RBc0RvY0xpdEJhcmUoZmFjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzT2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9keUNvbnRlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudmVsb3BlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZS5pc0VsZW1lbnRGb3JtRGVmYXVsdCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZS5nZXRUeXBlVGFibGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnROYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUlBDVXRpbC5wcm9jZXNzT2JqZWN0QXNEb2NMaXRCYXJlKGZhYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc09iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvZHlDb250ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZlbG9wZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UuaXNFbGVtZW50Rm9ybURlZmF1bHQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0TmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgb3V0TWVzc2FnZS5zZXRFbnZlbG9wZShlbnZlbG9wZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgaXMgdXNlIHRvIHRvIGNyZXRlIHRoZSByZXBvc25lIHdoZW4gLCB0aGUgcmV0dXJuIHZhbHVlIGlzIG51bGwKLSAgICAgKgotICAgICAqIEBwYXJhbSBzZXJ2aWNlICBDdXJyZW50IEF4aXNTZXJ2aWNlCi0gICAgICogQHBhcmFtIGVudmVsb3BlIHJlc3BvbnNlIGVuZXZlbG9wCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcm9jZXNzTnVsbFJldHVybnMoQXhpc1NlcnZpY2Ugc2VydmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT0FQRW52ZWxvcGUgZW52ZWxvcGUsIFN0cmluZyBwYXJ0TmFtZSkgewotICAgICAgICBRTmFtZSByZXNOYW1lOwotICAgICAgICBpZiAoc2VydmljZS5pc0VsZW1lbnRGb3JtRGVmYXVsdCgpKSB7Ci0gICAgICAgICAgICByZXNOYW1lID0gbmV3IFFOYW1lKHNlcnZpY2UuZ2V0U2NoZW1hVGFyZ2V0TmFtZXNwYWNlKCksCi0gICAgICAgICAgICAgICAgICAgIHBhcnROYW1lLAotICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLmdldFNjaGVtYVRhcmdldE5hbWVzcGFjZVByZWZpeCgpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJlc05hbWUgPSBuZXcgUU5hbWUocGFydE5hbWUpOwotICAgICAgICB9Ci0gICAgICAgIFhNTFN0cmVhbVJlYWRlciB4ciA9IG5ldyBOdWxsWE1MU3RyZWFtUmVhZGVyKHJlc05hbWUpOwotICAgICAgICBTdHJlYW1XcmFwcGVyIHBhcnNlciA9IG5ldyBTdHJlYW1XcmFwcGVyKHhyKTsKLSAgICAgICAgU3RBWE9NQnVpbGRlciBzdEFYT01CdWlsZGVyID0KLSAgICAgICAgICAgICAgICBPTVhNTEJ1aWxkZXJGYWN0b3J5LmNyZWF0ZVN0QVhPTUJ1aWxkZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICBPTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTFGYWN0b3J5KCksIHBhcnNlcik7Ci0gICAgICAgIGVudmVsb3BlLmdldEJvZHkoKS5hZGRDaGlsZChzdEFYT01CdWlsZGVyLmdldERvY3VtZW50RWxlbWVudCgpKTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwcm9jZXNzUmVzcG9uc2VBc0RvY0xpdFdyYXBwZWQoT2JqZWN0IHJlc09iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRob2QgbWV0aG9kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09BUEVudmVsb3BlIGVudmVsb3BlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09BUEZhY3RvcnkgZmFjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01OYW1lc3BhY2UgbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTUVsZW1lbnQgYm9keUNvbnRlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlQ29udGV4dCBvdXRNZXNzYWdlCi0gICAgKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgUU5hbWUgZWxlbWVudFFOYW1lID0gb3V0TWVzc2FnZS5nZXRBeGlzTWVzc2FnZSgpLmdldEVsZW1lbnRRTmFtZSgpOwotICAgICAgICBpZiAocmVzT2JqZWN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIFFOYW1lIHJlc05hbWU7Ci0gICAgICAgICAgICBpZiAoc2VydmljZS5pc0VsZW1lbnRGb3JtRGVmYXVsdCgpKSB7Ci0gICAgICAgICAgICAgICAgcmVzTmFtZSA9IG5ldyBRTmFtZShzZXJ2aWNlLmdldFNjaGVtYVRhcmdldE5hbWVzcGFjZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgUkVUVVJOX1dSQVBQRVIsCi0gICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLmdldFNjaGVtYVRhcmdldE5hbWVzcGFjZVByZWZpeCgpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmVzTmFtZSA9IG5ldyBRTmFtZShSRVRVUk5fV1JBUFBFUik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeHIgPSBuZXcgTnVsbFhNTFN0cmVhbVJlYWRlcihyZXNOYW1lKTsKLSAgICAgICAgICAgIFN0cmVhbVdyYXBwZXIgcGFyc2VyID0gbmV3IFN0cmVhbVdyYXBwZXIoeHIpOwotICAgICAgICAgICAgU3RBWE9NQnVpbGRlciBzdEFYT01CdWlsZGVyID0KLSAgICAgICAgICAgICAgICAgICAgT01YTUxCdWlsZGVyRmFjdG9yeS5jcmVhdGVTdEFYT01CdWlsZGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMUZhY3RvcnkoKSwgcGFyc2VyKTsKLSAgICAgICAgICAgIG5zID0gZmFjLmNyZWF0ZU9NTmFtZXNwYWNlKHNlcnZpY2UuZ2V0U2NoZW1hVGFyZ2V0TmFtZXNwYWNlKCksCi0gICAgICAgICAgICAgICAgICAgIHNlcnZpY2UuZ2V0U2NoZW1hVGFyZ2V0TmFtZXNwYWNlUHJlZml4KCkpOwotICAgICAgICAgICAgT01FbGVtZW50IGJvZHlDaGlsZCA9IGZhYy5jcmVhdGVPTUVsZW1lbnQobWV0aG9kLmdldE5hbWUoKSArICJSZXNwb25zZSIsIG5zKTsKLSAgICAgICAgICAgIGJvZHlDaGlsZC5hZGRDaGlsZChzdEFYT01CdWlsZGVyLmdldERvY3VtZW50RWxlbWVudCgpKTsKLSAgICAgICAgICAgIGVudmVsb3BlLmdldEJvZHkoKS5hZGRDaGlsZChib2R5Q2hpbGQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKHJlc09iamVjdCBpbnN0YW5jZW9mIE9iamVjdFtdKSB7Ci0KLSAgICAgICAgICAgICAgICBRTmFtZSByZXNOYW1lID0gbmV3IFFOYW1lKGVsZW1lbnRRTmFtZS5nZXROYW1lc3BhY2VVUkkoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZC5nZXROYW1lKCkgKyAiUmVzcG9uc2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFFOYW1lLmdldFByZWZpeCgpKTsKLSAgICAgICAgICAgICAgICBPTUVsZW1lbnQgYm9keUNoaWxkID0gUlBDVXRpbC5nZXRSZXNwb25zZUVsZW1lbnQocmVzTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChPYmplY3RbXSkgcmVzT2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZS5pc0VsZW1lbnRGb3JtRGVmYXVsdCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZS5nZXRUeXBlVGFibGUoKSk7Ci0gICAgICAgICAgICAgICAgZW52ZWxvcGUuZ2V0Qm9keSgpLmFkZENoaWxkKGJvZHlDaGlsZCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChyZXNPYmplY3QuZ2V0Q2xhc3MoKS5pc0FycmF5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGxlbmd0aCA9IEFycmF5LmdldExlbmd0aChyZXNPYmplY3QpOwotICAgICAgICAgICAgICAgICAgICBPYmplY3Qgb2JqQXJyYXlbXTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlc09iamVjdCBpbnN0YW5jZW9mIGJ5dGVbXSkgewotICAgICAgICAgICAgICAgICAgICAgICAgb2JqQXJyYXkgPSBuZXcgT2JqZWN0WzFdOwotICAgICAgICAgICAgICAgICAgICAgICAgb2JqQXJyYXlbMF0gPSBCYXNlNjQuZW5jb2RlKChieXRlW10pIHJlc09iamVjdCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvYmpBcnJheSA9IG5ldyBPYmplY3RbbGVuZ3RoXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmpBcnJheVtpXSA9IEFycmF5LmdldChyZXNPYmplY3QsIGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgUU5hbWUgcmVzTmFtZSA9IG5ldyBRTmFtZShlbGVtZW50UU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kLmdldE5hbWUoKSArICJSZXNwb25zZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFFOYW1lLmdldFByZWZpeCgpKTsKLSAgICAgICAgICAgICAgICAgICAgT01FbGVtZW50IGJvZHlDaGlsZCA9IFJQQ1V0aWwuZ2V0UmVzcG9uc2VFbGVtZW50KHJlc05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqQXJyYXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZS5pc0VsZW1lbnRGb3JtRGVmYXVsdCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UuZ2V0VHlwZVRhYmxlKCkpOwotICAgICAgICAgICAgICAgICAgICBlbnZlbG9wZS5nZXRCb2R5KCkuYWRkQ2hpbGQoYm9keUNoaWxkKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAoU2ltcGxlVHlwZU1hcHBlci5pc0NvbGxlY3Rpb24ocmVzT2JqZWN0LmdldENsYXNzKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9uIGNvbGxlY3Rpb24gPSAoQ29sbGVjdGlvbikgcmVzT2JqZWN0OwotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemUgPSBjb2xsZWN0aW9uLnNpemUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCB2YWx1ZXNbXSA9IG5ldyBPYmplY3Rbc2l6ZV07Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlc1tjb3VudF0gPSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQrKzsKLQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgUU5hbWUgcmVzTmFtZSA9IG5ldyBRTmFtZShlbGVtZW50UU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZC5nZXROYW1lKCkgKyAiUmVzcG9uc2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50UU5hbWUuZ2V0UHJlZml4KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgT01FbGVtZW50IGJvZHlDaGlsZCA9IFJQQ1V0aWwuZ2V0UmVzcG9uc2VFbGVtZW50KHJlc05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZS5pc0VsZW1lbnRGb3JtRGVmYXVsdCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLmdldFR5cGVUYWJsZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVudmVsb3BlLmdldEJvZHkoKS5hZGRDaGlsZChib2R5Q2hpbGQpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFNpbXBsZVR5cGVNYXBwZXIuaXNEYXRhSGFuZGxlcihyZXNPYmplY3QuZ2V0Q2xhc3MoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE9NRWxlbWVudCByZXNFbGVtdCA9IGZhYy5jcmVhdGVPTUVsZW1lbnQobWV0aG9kLmdldE5hbWUoKSArICJSZXNwb25zZSIsIG5zKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIE9NVGV4dCB0ZXh0ID0gZmFjLmNyZWF0ZU9NVGV4dChyZXNPYmplY3QsIHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgT01FbGVtZW50IHJldHVybkVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VydmljZS5pc0VsZW1lbnRGb3JtRGVmYXVsdCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuRWxlbWVudCA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoUkVUVVJOX1dSQVBQRVIsIG5zKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuRWxlbWVudCA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoUkVUVVJOX1dSQVBQRVIsIG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuRWxlbWVudC5hZGRDaGlsZCh0ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc0VsZW10LmFkZENoaWxkKHJldHVybkVsZW1lbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgZW52ZWxvcGUuZ2V0Qm9keSgpLmFkZENoaWxkKHJlc0VsZW10KTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXJ2aWNlLmlzRWxlbWVudEZvcm1EZWZhdWx0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBSUENVdGlsLnByb2Nlc3NSZXNwb25zZShmYWMsIHJlc09iamVjdCwgYm9keUNvbnRlbnQsIG5zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52ZWxvcGUsIG1ldGhvZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UuaXNFbGVtZW50Rm9ybURlZmF1bHQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UuZ2V0VHlwZVRhYmxlKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBSUENVdGlsLnByb2Nlc3NSZXNwb25zZShmYWMsIHJlc09iamVjdCwgYm9keUNvbnRlbnQsIG5zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52ZWxvcGUsIG1ldGhvZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UuaXNFbGVtZW50Rm9ybURlZmF1bHQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UuZ2V0VHlwZVRhYmxlKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG91dE1lc3NhZ2Uuc2V0RW52ZWxvcGUoZW52ZWxvcGUpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9ycGMvcmVjZWl2ZXJzL2VqYi9FSkJJbk9ubHlNZXNzYWdlUmVjZWl2ZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9ycGMvcmVjZWl2ZXJzL2VqYi9FSkJJbk9ubHlNZXNzYWdlUmVjZWl2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDMxNDFlNy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvcnBjL3JlY2VpdmVycy9lamIvRUpCSW5Pbmx5TWVzc2FnZVJlY2VpdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucnBjLnJlY2VpdmVycy5lamI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ycGMucmVjZWl2ZXJzLlJQQ0luT25seU1lc3NhZ2VSZWNlaXZlcjsKLQotcHVibGljIGNsYXNzIEVKQkluT25seU1lc3NhZ2VSZWNlaXZlciBleHRlbmRzIFJQQ0luT25seU1lc3NhZ2VSZWNlaXZlciB7Ci0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IG1ha2VOZXdTZXJ2aWNlT2JqZWN0KE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICByZXR1cm4gRUpCVXRpbC5tYWtlTmV3U2VydmljZU9iamVjdChtc2dDb250ZXh0KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvcnBjL3JlY2VpdmVycy9lamIvRUpCSW5PdXRBc3luY01lc3NhZ2VSZWNlaXZlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JwYy9yZWNlaXZlcnMvZWpiL0VKQkluT3V0QXN5bmNNZXNzYWdlUmVjZWl2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjcyZTk2YS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvcnBjL3JlY2VpdmVycy9lamIvRUpCSW5PdXRBc3luY01lc3NhZ2VSZWNlaXZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJwYy5yZWNlaXZlcnMuZWpiOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucnBjLnJlY2VpdmVycy5SUENNZXNzYWdlUmVjZWl2ZXI7Ci0KLS8qKgotICogQW4gRUpCSW5PdXRBc3luY01lc3NhZ2VSZWNlaXZlcgotICoKLSAqIEBkZXByZWNhdGVkIHlvdSBjYW4ganVzdCB1c2UgRUpCTWVzc2FnZVJlY2VpdmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBFSkJJbk91dEFzeW5jTWVzc2FnZVJlY2VpdmVyIGV4dGVuZHMgUlBDTWVzc2FnZVJlY2VpdmVyIHsKLSAgICBwdWJsaWMgdm9pZCByZWNlaXZlKGZpbmFsIE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDdHgpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBtZXNzYWdlQ3R4LnNldFByb3BlcnR5KERPX0FTWU5DLCBCb29sZWFuLlRSVUUpOwotICAgICAgICBzdXBlci5yZWNlaXZlKG1lc3NhZ2VDdHgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBPYmplY3QgbWFrZU5ld1NlcnZpY2VPYmplY3QoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIHJldHVybiBFSkJVdGlsLm1ha2VOZXdTZXJ2aWNlT2JqZWN0KG1zZ0NvbnRleHQpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9ycGMvcmVjZWl2ZXJzL2VqYi9FSkJNZXNzYWdlUmVjZWl2ZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9ycGMvcmVjZWl2ZXJzL2VqYi9FSkJNZXNzYWdlUmVjZWl2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTY4N2Q4ZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvcnBjL3JlY2VpdmVycy9lamIvRUpCTWVzc2FnZVJlY2VpdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucnBjLnJlY2VpdmVycy5lamI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ycGMucmVjZWl2ZXJzLlJQQ01lc3NhZ2VSZWNlaXZlcjsKLQotcHVibGljIGNsYXNzIEVKQk1lc3NhZ2VSZWNlaXZlciBleHRlbmRzIFJQQ01lc3NhZ2VSZWNlaXZlciB7Ci0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IG1ha2VOZXdTZXJ2aWNlT2JqZWN0KE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICByZXR1cm4gRUpCVXRpbC5tYWtlTmV3U2VydmljZU9iamVjdChtc2dDb250ZXh0KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvcnBjL3JlY2VpdmVycy9lamIvRUpCVXRpbC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JwYy9yZWNlaXZlcnMvZWpiL0VKQlV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhlMjAzYS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvcnBjL3JlY2VpdmVycy9lamIvRUpCVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5ycGMucmVjZWl2ZXJzLmVqYjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC50aHJlYWRwb29sLkRlZmF1bHRUaHJlYWRGYWN0b3J5OwotCi1pbXBvcnQgamF2YXgubmFtaW5nLkNvbnRleHQ7Ci1pbXBvcnQgamF2YXgubmFtaW5nLkluaXRpYWxDb250ZXh0OwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvdW50RG93bkxhdGNoOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yU2VydmljZTsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5MaW5rZWRCbG9ja2luZ1F1ZXVlOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKLQotcHVibGljIGNsYXNzIEVKQlV0aWwgewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBFSkJfSk5ESV9OQU1FID0gImJlYW5KbmRpTmFtZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEVKQl9IT01FX0lOVEVSRkFDRV9OQU1FID0gImhvbWVJbnRlcmZhY2VOYW1lIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgRUpCX1JFTU9URV9JTlRFUkZBQ0VfTkFNRSA9ICJyZW1vdGVJbnRlcmZhY2VOYW1lIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgRUpCX0xPQ0FMX0hPTUVfSU5URVJGQUNFX05BTUUgPSAibG9jYWxIb21lSW50ZXJmYWNlTmFtZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEVKQl9MT0NBTF9JTlRFUkZBQ0VfTkFNRSA9ICJsb2NhbEludGVyZmFjZU5hbWUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBFSkJfSU5JVElBTF9DT05URVhUX0ZBQ1RPUlkgPSAiam5kaUNvbnRleHRDbGFzcyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEVKQl9QUk9WSURFUl9VUkwgPSAicHJvdmlkZXJVcmwiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBFSkJfSk5ESV9VU0VSTkFNRSA9ICJqbmRpVXNlciI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEVKQl9KTkRJX1BBU1NXT1JEID0gImpuZGlQYXNzd29yZCI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBFeGVjdXRvclNlcnZpY2Ugd29ya2VyUG9vbCA9IG51bGw7Ci0KLSAgICBzdGF0aWMgewotICAgICAgICB3b3JrZXJQb29sID0KLSAgICAgICAgICAgICAgICBuZXcgVGhyZWFkUG9vbEV4ZWN1dG9yKDEsIDUwLCAxNTBMLCBUaW1lVW5pdC5TRUNPTkRTLCBuZXcgTGlua2VkQmxvY2tpbmdRdWV1ZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERlZmF1bHRUaHJlYWRGYWN0b3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVGhyZWFkR3JvdXAoIkVKQiBwcm92aWRlciB0aHJlYWQgZ3JvdXAiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVKQlByb3ZpZGVyIikpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiBhIG9iamVjdCB3aGljaCBpbXBsZW1lbnRzIHRoZSBzZXJ2aWNlLgotICAgICAqCi0gICAgICogQHBhcmFtIG1zZ0NvbnRleHQgdGhlIG1lc3NhZ2UgY29udGV4dAotICAgICAqIEByZXR1cm4gYW4gb2JqZWN0IHRoYXQgaW1wbGVtZW50cyB0aGUgc2VydmljZQotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0IGlmIGZhaWxzCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBPYmplY3QgbWFrZU5ld1NlcnZpY2VPYmplY3QoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIENvdW50RG93bkxhdGNoIHN0YXJ0TGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMSk7Ci0gICAgICAgIENvdW50RG93bkxhdGNoIHN0b3BMYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKLSAgICAgICAgRUpCQ2xpZW50V29ya2VyIHdvcmtlciA9IG5ldyBFSkJDbGllbnRXb3JrZXIobXNnQ29udGV4dCwgc3RhcnRMYXRjaCwgc3RvcExhdGNoKTsKLSAgICAgICAgd29ya2VyUG9vbC5leGVjdXRlKHdvcmtlcik7Ci0gICAgICAgIHN0YXJ0TGF0Y2guY291bnREb3duKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzdG9wTGF0Y2guYXdhaXQoKTsKLSAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh3b3JrZXIuZ2V0RXhjZXB0aW9uKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgQXhpc0ZhdWx0Lm1ha2VGYXVsdCh3b3JrZXIuZ2V0RXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHdvcmtlci5nZXRSZXR1cm5lZFZhbHVlKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRUpCQ2xpZW50V29ya2VyIGltcGxlbWVudHMgUnVubmFibGUgewotCi0gICAgICAgIHByaXZhdGUgTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgQ291bnREb3duTGF0Y2ggc3RhcnRMYXRjaCA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgQ291bnREb3duTGF0Y2ggc3RvcExhdGNoID0gbnVsbDsKLSAgICAgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzc1tdIGVtcHR5X2NsYXNzX2FycmF5ID0gbmV3IENsYXNzWzBdOwotICAgICAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdFtdIGVtcHR5X29iamVjdF9hcnJheSA9IG5ldyBPYmplY3RbMF07Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIEluaXRpYWxDb250ZXh0IGNhY2hlZF9jb250ZXh0ID0gbnVsbDsKLSAgICAgICAgcHJpdmF0ZSBFeGNlcHRpb24gZXhjZXB0aW9uID0gbnVsbDsKLSAgICAgICAgcHJpdmF0ZSBPYmplY3QgcmV0dXJuZWRWYWx1ZSA9IG51bGw7Ci0KLSAgICAgICAgcHVibGljIEVKQkNsaWVudFdvcmtlcihNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0LCBDb3VudERvd25MYXRjaCBzdGFydExhdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvdW50RG93bkxhdGNoIHN0b3BMYXRjaCkgewotICAgICAgICAgICAgdGhpcy5tc2dDb250ZXh0ID0gbXNnQ29udGV4dDsKLSAgICAgICAgICAgIHRoaXMuc3RhcnRMYXRjaCA9IHN0YXJ0TGF0Y2g7Ci0gICAgICAgICAgICB0aGlzLnN0b3BMYXRjaCA9IHN0b3BMYXRjaDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgc3RhcnRMYXRjaC5hd2FpdCgpOwotICAgICAgICAgICAgICAgIGZpbmFsIEF4aXNTZXJ2aWNlIHNlcnZpY2UgPSBtc2dDb250ZXh0LmdldEF4aXNTZXJ2aWNlKCk7Ci0gICAgICAgICAgICAgICAgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgUHJpdmlsZWdlZEFjdGlvbigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRDb250ZXh0Q2xhc3NMb2FkZXIoc2VydmljZS5nZXRDbGFzc0xvYWRlcigpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICk7Ci0gICAgICAgICAgICAgICAgUGFyYW1ldGVyIHJlbW90ZUhvbWVOYW1lID0gc2VydmljZS5nZXRQYXJhbWV0ZXIoRUpCX0hPTUVfSU5URVJGQUNFX05BTUUpOwotICAgICAgICAgICAgICAgIFBhcmFtZXRlciBsb2NhbEhvbWVOYW1lID0gc2VydmljZS5nZXRQYXJhbWV0ZXIoRUpCX0xPQ0FMX0hPTUVfSU5URVJGQUNFX05BTUUpOwotICAgICAgICAgICAgICAgIFBhcmFtZXRlciBqbmRpTmFtZSA9IHNlcnZpY2UuZ2V0UGFyYW1ldGVyKEVKQl9KTkRJX05BTUUpOwotICAgICAgICAgICAgICAgIFBhcmFtZXRlciBob21lTmFtZSA9IChyZW1vdGVIb21lTmFtZSAhPSBudWxsID8gcmVtb3RlSG9tZU5hbWUgOiBsb2NhbEhvbWVOYW1lKTsKLQotICAgICAgICAgICAgICAgIGlmIChqbmRpTmFtZSA9PSBudWxsIHx8IGpuZGlOYW1lLmdldFZhbHVlKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJqbmRpIG5hbWUgaXMgbm90IHNwZWNpZmllZCIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaG9tZU5hbWUgPT0gbnVsbCB8fCBob21lTmFtZS5nZXRWYWx1ZSgpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gY2Fubm90IGZpbmQgYm90aCByZW1vdGUgaG9tZSBhbmQgbG9jYWwgaG9tZQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJlamIgcmVtb3RlL2xvY2FsIGhvbWUgY2xhc3MgbmFtZSBpcyBub3Qgc3BlY2lmaWVkIik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gd2UgY3JlYXRlIGVpdGhlciB0aGUgZWpiIHVzaW5nIGVpdGhlciB0aGUgUmVtb3RlSG9tZSBvciBMb2NhbEhvbWUgb2JqZWN0Ci0gICAgICAgICAgICAgICAgaWYgKHJlbW90ZUhvbWVOYW1lICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybmVkVmFsdWUgPSBjcmVhdGVSZW1vdGVFSkIobXNnQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFN0cmluZylqbmRpTmFtZS5nZXRWYWx1ZSgpKS50cmltKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTdHJpbmcpaG9tZU5hbWUuZ2V0VmFsdWUoKSkudHJpbSgpKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHJldHVybmVkVmFsdWUgPSBjcmVhdGVMb2NhbEVKQihtc2dDb250ZXh0LCAoKFN0cmluZylqbmRpTmFtZS5nZXRWYWx1ZSgpKS50cmltKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFN0cmluZylob21lTmFtZS5nZXRWYWx1ZSgpKS50cmltKCkpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgICAgIGV4Y2VwdGlvbiA9IGU7Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIHN0b3BMYXRjaC5jb3VudERvd24oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDcmVhdGUgYW4gRUpCIHVzaW5nIGEgcmVtb3RlIGhvbWUgb2JqZWN0Ci0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBtc2dDb250ZXh0ICAgdGhlIG1lc3NhZ2UgY29udGV4dAotICAgICAgICAgKiBAcGFyYW0gYmVhbkpuZGlOYW1lIFRoZSBKTkRJIG5hbWUgb2YgdGhlIEVKQiByZW1vdGUgaG9tZSBjbGFzcwotICAgICAgICAgKiBAcGFyYW0gaG9tZU5hbWUgICAgIHRoZSBuYW1lIG9mIHRoZSBob21lIGludGVyZmFjZSBjbGFzcwotICAgICAgICAgKiBAcmV0dXJuIGFuIEVKQgotICAgICAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBJZiBmYWlscwotICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSBPYmplY3QgY3JlYXRlUmVtb3RlRUpCKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQsIFN0cmluZyBiZWFuSm5kaU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaG9tZU5hbWUpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAgICAgLy8gR2V0IHRoZSBFSkIgSG9tZSBvYmplY3QgZnJvbSBKTkRJCi0gICAgICAgICAgICBPYmplY3QgZWpiSG9tZSA9IGdldEVKQkhvbWUobXNnQ29udGV4dC5nZXRBeGlzU2VydmljZSgpLCBiZWFuSm5kaU5hbWUpOwotICAgICAgICAgICAgQ2xhc3MgY2xzID0gZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkubG9hZENsYXNzKGhvbWVOYW1lKTsKLSAgICAgICAgICAgIE9iamVjdCBlaG9tZSA9IGphdmF4LnJtaS5Qb3J0YWJsZVJlbW90ZU9iamVjdC5uYXJyb3coZWpiSG9tZSwgY2xzKTsKLQotICAgICAgICAgICAgLy8gSW52b2tlIHRoZSBjcmVhdGUgbWV0aG9kIG9mIHRoZSBlamJIb21lIGNsYXNzIHdpdGhvdXQgYWN0dWFsbHkKLSAgICAgICAgICAgIC8vIHRvdWNoaW5nIGFueSBFSkIgY2xhc3NlcyAoaS5lLiBubyBjYXN0IHRvIEVKQkhvbWUpCi0gICAgICAgICAgICBNZXRob2QgY3JlYXRlTWV0aG9kID0gY2xzLmdldE1ldGhvZCgiY3JlYXRlIiwgZW1wdHlfY2xhc3NfYXJyYXkpOwotCi0gICAgICAgICAgICByZXR1cm4gY3JlYXRlTWV0aG9kLmludm9rZShlaG9tZSwgZW1wdHlfb2JqZWN0X2FycmF5KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDcmVhdGUgYW4gRUpCIHVzaW5nIGEgbG9jYWwgaG9tZSBvYmplY3QKLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIG1zZ0NvbnRleHQgICB0aGUgbWVzc2FnZSBjb250ZXh0Ci0gICAgICAgICAqIEBwYXJhbSBiZWFuSm5kaU5hbWUgVGhlIEpOREkgbmFtZSBvZiB0aGUgRUpCIGxvY2FsIGhvbWUgY2xhc3MKLSAgICAgICAgICogQHBhcmFtIGhvbWVOYW1lICAgICB0aGUgbmFtZSBvZiB0aGUgaG9tZSBpbnRlcmZhY2UgY2xhc3MKLSAgICAgICAgICogQHJldHVybiBhbiBFSkIKLSAgICAgICAgICogQHRocm93cyBFeGNlcHRpb24gaWYgZmFpbHMKLSAgICAgICAgICovCi0gICAgICAgIHByaXZhdGUgT2JqZWN0IGNyZWF0ZUxvY2FsRUpCKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQsIFN0cmluZyBiZWFuSm5kaU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBob21lTmFtZSkKLSAgICAgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIC8vIEdldCB0aGUgRUpCIEhvbWUgb2JqZWN0IGZyb20gSk5ESQotICAgICAgICAgICAgT2JqZWN0IGVqYkhvbWUgPSBnZXRFSkJIb21lKG1zZ0NvbnRleHQuZ2V0QXhpc1NlcnZpY2UoKSwgYmVhbkpuZGlOYW1lKTsKLQotICAgICAgICAgICAgLy8gdGhlIGhvbWUgb2JqZWN0IGlzIGEgbG9jYWwgaG9tZSBvYmplY3QKLSAgICAgICAgICAgIE9iamVjdCBlaG9tZTsKLQotICAgICAgICAgICAgQ2xhc3MgY2xzID0gZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkubG9hZENsYXNzKGhvbWVOYW1lKTsKLQotICAgICAgICAgICAgaWYgKGNscy5pc0luc3RhbmNlKGVqYkhvbWUpKQotICAgICAgICAgICAgICAgIGVob21lID0gZWpiSG9tZTsKLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbGFzc0Nhc3RFeGNlcHRpb24oImJhZCBlamIgaG9tZSB0eXBlIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEludm9rZSB0aGUgY3JlYXRlIG1ldGhvZCBvZiB0aGUgZWpiSG9tZSBjbGFzcyB3aXRob3V0IGFjdHVhbGx5Ci0gICAgICAgICAgICAvLyB0b3VjaGluZyBhbnkgRUpCIGNsYXNzZXMgKGkuZS4gbm8gY2FzdCB0byBFSkJMb2NhbEhvbWUpCi0gICAgICAgICAgICBNZXRob2QgY3JlYXRlTWV0aG9kID0gY2xzLmdldE1ldGhvZCgiY3JlYXRlIiwgZW1wdHlfY2xhc3NfYXJyYXkpOwotCi0gICAgICAgICAgICByZXR1cm4gY3JlYXRlTWV0aG9kLmludm9rZShlaG9tZSwgZW1wdHlfb2JqZWN0X2FycmF5KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDb21tb24gcm91dGluZSB0byBkbyB0aGUgSk5ESSBsb29rdXAgb24gdGhlIEhvbWUgaW50ZXJmYWNlIG9iamVjdCB1c2VybmFtZSBhbmQgcGFzc3dvcmQKLSAgICAgICAgICogZm9yIGpuZGkgbG9va3VwIGFyZSBnb3QgZnJvbSB0aGUgY29uZmlndXJhdGlvbiBvciBmcm9tIHRoZSBtZXNzYWdlQ29udGV4dCBpZiBub3QgZm91bmQgaW4KLSAgICAgICAgICogdGhlIGNvbmZpZ3VyYXRpb24KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHNlcnZpY2UgICAgICBBeGlzU2VydmljZSBvYmplY3QKLSAgICAgICAgICogQHBhcmFtIGJlYW5KbmRpTmFtZSBKTkRJIG5hbWUgb2YgdGhlIEVKQiBob21lIG9iamVjdAotICAgICAgICAgKiBAcmV0dXJuIEVKQiBob21lIG9iamVjdAotICAgICAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdCBJZiBmYWxzCi0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIE9iamVjdCBnZXRFSkJIb21lKEF4aXNTZXJ2aWNlIHNlcnZpY2UsIFN0cmluZyBiZWFuSm5kaU5hbWUpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICAgICAgT2JqZWN0IGVqYkhvbWU7Ci0KLSAgICAgICAgICAgIC8vIFNldCB1cCBhbiBJbml0aWFsQ29udGV4dCBhbmQgdXNlIGl0IGdldCB0aGUgYmVhbkpuZGlOYW1lIGZyb20gSk5ESQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBudWxsOwotCi0gICAgICAgICAgICAgICAgLy8gY29sbGVjdCBhbGwgdGhlIHByb3BlcnRpZXMgd2UgbmVlZCB0byBhY2Nlc3MgSk5ESToKLSAgICAgICAgICAgICAgICAvLyB1c2VybmFtZSwgcGFzc3dvcmQsIGZhY3RvcnljbGFzcywgY29udGV4dFVybAotCi0gICAgICAgICAgICAgICAgLy8gdXNlcm5hbWUKLSAgICAgICAgICAgICAgICBQYXJhbWV0ZXIgdXNlcm5hbWUgPSBzZXJ2aWNlLmdldFBhcmFtZXRlcihFSkJfSk5ESV9VU0VSTkFNRSk7Ci0gICAgICAgICAgICAgICAgaWYgKHVzZXJuYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnRpZXMgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcygpOwotICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzLnNldFByb3BlcnR5KENvbnRleHQuU0VDVVJJVFlfUFJJTkNJUEFMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU3RyaW5nKXVzZXJuYW1lLmdldFZhbHVlKCkpLnRyaW0oKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gcGFzc3dvcmQKLSAgICAgICAgICAgICAgICBQYXJhbWV0ZXIgcGFzc3dvcmQgPSBzZXJ2aWNlLmdldFBhcmFtZXRlcihFSkJfSk5ESV9QQVNTV09SRCk7Ci0gICAgICAgICAgICAgICAgaWYgKHBhc3N3b3JkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnRpZXMgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcygpOwotICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzLnNldFByb3BlcnR5KENvbnRleHQuU0VDVVJJVFlfQ1JFREVOVElBTFMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTdHJpbmcpcGFzc3dvcmQuZ2V0VmFsdWUoKSkudHJpbSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBmYWN0b3J5IGNsYXNzCi0gICAgICAgICAgICAgICAgUGFyYW1ldGVyIGZhY3RvcnlDbGFzcyA9IHNlcnZpY2UuZ2V0UGFyYW1ldGVyKEVKQl9JTklUSUFMX0NPTlRFWFRfRkFDVE9SWSk7Ci0gICAgICAgICAgICAgICAgaWYgKGZhY3RvcnlDbGFzcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0aWVzID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcy5zZXRQcm9wZXJ0eShDb250ZXh0LklOSVRJQUxfQ09OVEVYVF9GQUNUT1JZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU3RyaW5nKWZhY3RvcnlDbGFzcy5nZXRWYWx1ZSgpKS50cmltKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIGNvbnRleHRVcmwKLSAgICAgICAgICAgICAgICBQYXJhbWV0ZXIgY29udGV4dFVybCA9IHNlcnZpY2UuZ2V0UGFyYW1ldGVyKEVKQl9QUk9WSURFUl9VUkwpOwotICAgICAgICAgICAgICAgIGlmIChjb250ZXh0VXJsICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnRpZXMgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcygpOwotICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzLnNldFByb3BlcnR5KENvbnRleHQuUFJPVklERVJfVVJMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU3RyaW5nKWNvbnRleHRVcmwuZ2V0VmFsdWUoKSkudHJpbSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBnZXQgY29udGV4dCB1c2luZyB0aGVzZSBwcm9wZXJ0aWVzCi0gICAgICAgICAgICAgICAgSW5pdGlhbENvbnRleHQgY29udGV4dCA9IGdldENvbnRleHQocHJvcGVydGllcyk7Ci0KLSAgICAgICAgICAgICAgICAvLyBpZiB3ZSBkaWRuJ3QgZ2V0IGEgY29udGV4dCwgZmFpbAotICAgICAgICAgICAgICAgIGlmIChjb250ZXh0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoImNhbm5vdCBjcmVhdGUgaW5pdGlhbCBjb250ZXh0Iik7Ci0KLSAgICAgICAgICAgICAgICBlamJIb21lID0gZ2V0RUpCSG9tZShjb250ZXh0LCBiZWFuSm5kaU5hbWUpOwotCi0gICAgICAgICAgICAgICAgaWYgKGVqYkhvbWUgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiY2Fubm90IGZpbmQgam5kaSBob21lIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotICAgICAgICAgICAgICAgIHRocm93IEF4aXNGYXVsdC5tYWtlRmF1bHQoZXhjZXB0aW9uKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIGVqYkhvbWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIEluaXRpYWxDb250ZXh0IGdldENhY2hlZENvbnRleHQoKQotICAgICAgICAgICAgICAgIHRocm93cyBqYXZheC5uYW1pbmcuTmFtaW5nRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGlmIChjYWNoZWRfY29udGV4dCA9PSBudWxsKQotICAgICAgICAgICAgICAgIGNhY2hlZF9jb250ZXh0ID0gbmV3IEluaXRpYWxDb250ZXh0KCk7Ci0gICAgICAgICAgICByZXR1cm4gY2FjaGVkX2NvbnRleHQ7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIHByaXZhdGUgSW5pdGlhbENvbnRleHQgZ2V0Q29udGV4dChQcm9wZXJ0aWVzIHByb3BlcnRpZXMpCi0gICAgICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCwgamF2YXgubmFtaW5nLk5hbWluZ0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICByZXR1cm4gKChwcm9wZXJ0aWVzID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgID8gZ2V0Q2FjaGVkQ29udGV4dCgpCi0gICAgICAgICAgICAgICAgICAgIDogbmV3IEluaXRpYWxDb250ZXh0KHByb3BlcnRpZXMpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgT2JqZWN0IGdldEVKQkhvbWUoSW5pdGlhbENvbnRleHQgY29udGV4dCwgU3RyaW5nIGJlYW5KbmRpTmFtZSkKLSAgICAgICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0LCBqYXZheC5uYW1pbmcuTmFtaW5nRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHJldHVybiBjb250ZXh0Lmxvb2t1cChiZWFuSm5kaU5hbWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBDbGFzc0xvYWRlciBnZXRDb250ZXh0Q2xhc3NMb2FkZXIoKSB7Ci0gICAgICAgICAgICByZXR1cm4gKENsYXNzTG9hZGVyKUFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAotICAgICAgICAgICAgICAgICAgICBuZXcgUHJpdmlsZWdlZEFjdGlvbigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEV4Y2VwdGlvbiBnZXRFeGNlcHRpb24oKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXhjZXB0aW9uOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCBnZXRSZXR1cm5lZFZhbHVlKCkgewotICAgICAgICAgICAgcmV0dXJuIHJldHVybmVkVmFsdWU7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2phdmEvSmF2YVRyYW5zcG9ydFNlbmRlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9qYXZhL0phdmFUcmFuc3BvcnRTZW5kZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2IxNTY1Yi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2phdmEvSmF2YVRyYW5zcG9ydFNlbmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0LmphdmE7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTmFtZXNwYWNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUDExQ29uc3RhbnRzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUDEyQ29uc3RhbnRzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5QYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uVHJhbnNwb3J0T3V0RGVzY3JpcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkRlZmF1bHRPYmplY3RTdXBwbGllcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuT2JqZWN0U3VwcGxpZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaGFuZGxlcnMuQWJzdHJhY3RIYW5kbGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmkxOG4uTWVzc2FnZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucnBjLnJlY2VpdmVycy5SUENVdGlsOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5UcmFuc3BvcnRTZW5kZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMQ29uc3RhbnRzOw0KLQ0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOw0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7DQotDQotcHVibGljIGNsYXNzIEphdmFUcmFuc3BvcnRTZW5kZXIgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIgaW1wbGVtZW50cyBUcmFuc3BvcnRTZW5kZXIgew0KLQ0KLSAgICBwdWJsaWMgdm9pZCBjbGVhbnVwKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHRocm93cyBBeGlzRmF1bHQgew0KLSAgICB9DQotICAgIHB1YmxpYyB2b2lkIGluaXQoQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZkNvbnRleHQsIFRyYW5zcG9ydE91dERlc2NyaXB0aW9uIHRyYW5zcG9ydE91dCkNCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsNCi0gICAgfQ0KLSAgICBwdWJsaWMgdm9pZCBzdG9wKCkgew0KLSAgICB9DQotICAgIHB1YmxpYyBJbnZvY2F0aW9uUmVzcG9uc2UgaW52b2tlKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpDQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7DQotICAgICAgICBTT0FQRW52ZWxvcGUgcmVzdWx0RW52ZWxvcGUgPSBpbnZva2VKYXZhTWV0aG9kKG1zZ0NvbnRleHQpOw0KLSAgICAgICAgT2JqZWN0IHJlc3BvbnNlTUNPYmplY3QgPSBtc2dDb250ZXh0LmdldE9wZXJhdGlvbkNvbnRleHQoKS5nZXRNZXNzYWdlQ29udGV4dCgNCi0gICAgICAgICAgICAgICAgV1NETENvbnN0YW50cy5NRVNTQUdFX0xBQkVMX0lOX1ZBTFVFKTsNCi0gICAgICAgIGlmIChyZXNwb25zZU1DT2JqZWN0ICE9IG51bGwpIHsNCi0gICAgICAgICAgICBNZXNzYWdlQ29udGV4dCByZXNwb25zZU1DID0gKE1lc3NhZ2VDb250ZXh0KSByZXNwb25zZU1DT2JqZWN0Ow0KLSAgICAgICAgICAgIHJlc3BvbnNlTUMuc2V0RW52ZWxvcGUocmVzdWx0RW52ZWxvcGUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIEludm9jYXRpb25SZXNwb25zZS5DT05USU5VRTsNCi0gICAgfQ0KLSAgICBwcml2YXRlIFNPQVBFbnZlbG9wZSBpbnZva2VKYXZhTWV0aG9kKE1lc3NhZ2VDb250ZXh0IGluTWVzc2FnZSkNCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsNCi0gICAgICAgIENsYXNzIEltcGxDbGFzczsNCi0gICAgICAgIE9iamVjdCBvYmo7DQotICAgICAgICBQYXJhbWV0ZXIgaW1wbGVtZW50YXRpb25DbGFzcyA9IGluTWVzc2FnZS5nZXRQYXJhbWV0ZXIoImNsYXNzTmFtZSIpOw0KLSAgICAgICAgaWYgKGltcGxlbWVudGF0aW9uQ2xhc3MgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoIlNlcnZpY2UgQ2xhc3MgUGFyYW1hdGVyIGRvZXMgbm90IGZpbmQgZm9yIHRoZSBzZXJ2aWNlIDogIg0KLSAgICAgICAgICAgICAgICAgICAgKyBpbk1lc3NhZ2UuZ2V0QXhpc1NlcnZpY2UoKS5nZXROYW1lKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgT2JqZWN0IHNlcnZpY2VJbXBsZUNsYXNzID0gaW1wbGVtZW50YXRpb25DbGFzcy5nZXRWYWx1ZSgpOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBJbXBsQ2xhc3MgPSBDbGFzcy5mb3JOYW1lKHNlcnZpY2VJbXBsZUNsYXNzLnRvU3RyaW5nKCkpOw0KLSAgICAgICAgICAgIG9iaiA9IEltcGxDbGFzcy5uZXdJbnN0YW5jZSgpOw0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJFeGNlcHRpb24gb2NjdXIgd2hpbGUgY3JlYXRpbmcgWyAiICsgc2VydmljZUltcGxlQ2xhc3MgKyAiIF0iLCBlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2UgPSBpbk1lc3NhZ2UuZ2V0QXhpc1NlcnZpY2UoKTsNCi0gICAgICAgIE9NRWxlbWVudCBtZXRob2RFbGVtZW50ID0gaW5NZXNzYWdlLmdldEVudmVsb3BlKCkuZ2V0Qm9keSgpDQotICAgICAgICAgICAgICAgIC5nZXRGaXJzdEVsZW1lbnQoKTsNCi0gICAgICAgIFN0cmluZyBtZXNzYWdlTmFtZVNwYWNlID0gaW5NZXNzYWdlLmdldEF4aXNTZXJ2aWNlKCkuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7DQotICAgICAgICBTdHJpbmcgbWV0aG9kTmFtZSA9IG1ldGhvZEVsZW1lbnQuZ2V0TG9jYWxOYW1lKCk7DQotICAgICAgICAvL1Nlcml2ZSBpbXBwbGVtZW50YXRpb24gY2xhc3MNCi0gICAgICAgIE1ldGhvZCBtZXRob2QgPSBudWxsOw0KLSAgICAgICAgICBNZXRob2RbXSBtZXRob2RzID0gSW1wbENsYXNzLmdldE1ldGhvZHMoKTsNCi0JICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZHMubGVuZ3RoOyBpKyspIHsNCi0JICAgICAgICAgICAgaWYgKG1ldGhvZHNbaV0uZ2V0TmFtZSgpLmVxdWFscyhtZXRob2ROYW1lKSkgew0KLQkgICAgICAgICAgICAgICAgbWV0aG9kID0gbWV0aG9kc1tpXTsNCi0JICAgICAgICAgICAgICAgIGJyZWFrOw0KLQkgICAgICAgICAgICB9DQotCSAgICAgICAgfQ0KLSAgICAgICBpZiAobWV0aG9kID09IG51bGwpIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJtZXRob2QgOiAiICsgbWV0aG9kTmFtZSArDQotICAgICAgICAgICAgICAgICAgICAiIDogZG9lcyBub3QgZmluZCBpbiB0aGUgc2VydmljZSBpbXBsZW1lbnRhdGlvbiBjbGFzcyA6ICIgKw0KLSAgICAgICAgICAgICAgICAgICAgc2VydmljZUltcGxlQ2xhc3MpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgLy9nZXRzIHRoZSBvYmplY3QgYXJyYXkgZnJvbSB0aGUgcmVxdWVzdCBPTUVsZW1lbnQNCi0gICAgICAgIE9iamVjdFN1cHBsaWVyIG9iajEgPSBuZXcgRGVmYXVsdE9iamVjdFN1cHBsaWVyKCk7DQotICAgICAgICBPYmplY3RbXSBvYmplY3RBcnJheSA9IFJQQ1V0aWwucHJvY2Vzc1JlcXVlc3QobWV0aG9kRWxlbWVudCwgbWV0aG9kLCBvYmoxKTsNCi0gICAgICAgIC8vcmVmbGVjdGl2ZSBpbnZvY2F0aW9uDQotICAgICAgICBPYmplY3QgcmVzT2JqZWN0IDsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgcmVzT2JqZWN0ID0gbWV0aG9kLmludm9rZShvYmosIG9iamVjdEFycmF5KTsNCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiRXJyb3Igb2NjdXJlZCB3aGlsZSBpbnZva2luZyB0aGUgbWV0aG9kIFsgIiArIG1ldGhvZE5hbWUgKyAiIF0iLCBlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIFNPQVBGYWN0b3J5IGZhYyA9IGdldFNPQVBGYWN0b3J5KGluTWVzc2FnZSk7DQotICAgICAgICBPTU5hbWVzcGFjZSBucyA9IGZhYy5jcmVhdGVPTU5hbWVzcGFjZShtZXNzYWdlTmFtZVNwYWNlLA0KLSAgICAgICAgICAgICAgICBzZXJ2aWNlLmdldFNjaGVtYVRhcmdldE5hbWVzcGFjZVByZWZpeCgpKTsNCi0gICAgICAgIFNPQVBFbnZlbG9wZSBlbnZlbG9wZSA9IGZhYy5nZXREZWZhdWx0RW52ZWxvcGUoKTsNCi0gICAgICAgIE9NRWxlbWVudCBib2R5Q29udGVudCA9IG51bGw7DQotICAgICAgICBpZiAocmVzT2JqZWN0ID09IG51bGwpIHsNCi0gICAgICAgICAgICAvL1NlbmQgZW1wdHkgYm9keQ0KLSAgICAgICAgICAgIGVudmVsb3BlLmdldEJvZHkoKS5hZGRDaGlsZChmYWMuY3JlYXRlT01FbGVtZW50KCJpdGVtIiwgbnMpKTsNCi0gICAgICAgIH0gZWxzZSBpZiAocmVzT2JqZWN0IGluc3RhbmNlb2YgT2JqZWN0W10pIHsNCi0gICAgICAgICAgICBRTmFtZSByZXNOYW1lID0gbmV3IFFOYW1lKHNlcnZpY2UuZ2V0U2NoZW1hVGFyZ2V0TmFtZXNwYWNlKCksDQotICAgICAgICAgICAgICAgICAgICBtZXRob2QuZ2V0TmFtZSgpICsgIlJlc3BvbnNlIiwNCi0gICAgICAgICAgICAgICAgICAgIHNlcnZpY2UuZ2V0U2NoZW1hVGFyZ2V0TmFtZXNwYWNlUHJlZml4KCkpOw0KLSAgICAgICAgICAgIC8vY3JlYXRlIHRoZSBvbWVsZW1lbnQgZnJvbSB0aGUgcmVzcG9uc2UgYXJyYXkNCi0gICAgICAgICAgICBPTUVsZW1lbnQgYm9keUNoaWxkID0gUlBDVXRpbC5nZXRSZXNwb25zZUVsZW1lbnQocmVzTmFtZSwNCi0gICAgICAgICAgICAgICAgICAgIChPYmplY3RbXSkgcmVzT2JqZWN0LCBmYWxzZSwgbnVsbCk7DQotICAgICAgICAgICAgLy9yZXR1cm4gdHlwZSBpcyBzZW50IHdpdGggYXJyYXkgc2l6ZQ0KLSAgICAgICAgICAgIGJvZHlDaGlsZC5hZGRBdHRyaWJ1dGUoInJldHVyblR5cGUiLA0KLSAgICAgICAgICAgICAgICAgICAgbWV0aG9kLmdldFJldHVyblR5cGUoKS5nZXRDbGFzcygpLmdldE5hbWUoKSArICgoT2JqZWN0W10pIHJlc09iamVjdCkubGVuZ3RoLA0KLSAgICAgICAgICAgICAgICAgICAgZW52ZWxvcGUuZ2V0Qm9keSgpLmdldERlZmF1bHROYW1lc3BhY2UoKSk7DQotICAgICAgICAgICAgZW52ZWxvcGUuZ2V0Qm9keSgpLmFkZENoaWxkKGJvZHlDaGlsZCk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIFJQQ1V0aWwucHJvY2Vzc1Jlc3BvbnNlKGZhYywgcmVzT2JqZWN0LCBib2R5Q29udGVudCwgbnMsIGVudmVsb3BlLCBtZXRob2QsIGZhbHNlLCBudWxsKTsNCi0gICAgICAgICAgICBlbnZlbG9wZS5nZXRCb2R5KCkuZ2V0Rmlyc3RFbGVtZW50KCkuYWRkQXR0cmlidXRlKCJyZXR1cm5UeXBlIiwNCi0gICAgICAgICAgICAgICAgICAgIG1ldGhvZC5nZXRSZXR1cm5UeXBlKCkuZ2V0Q2xhc3MoKS5nZXROYW1lKCksIGVudmVsb3BlLmdldEJvZHkoKS5nZXREZWZhdWx0TmFtZXNwYWNlKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGVudmVsb3BlOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU09BUEZhY3RvcnkgZ2V0U09BUEZhY3RvcnkoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdCB7DQotICAgICAgICBTdHJpbmcgbnNVUkkgPSBtc2dDb250ZXh0LmdldEVudmVsb3BlKCkuZ2V0TmFtZXNwYWNlKCkuZ2V0TmFtZXNwYWNlVVJJKCk7DQotICAgICAgICBpZiAoU09BUDEyQ29uc3RhbnRzLlNPQVBfRU5WRUxPUEVfTkFNRVNQQUNFX1VSSS5lcXVhbHMobnNVUkkpKSB7DQotICAgICAgICAgICAgcmV0dXJuIE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMkZhY3RvcnkoKTsNCi0gICAgICAgIH0gZWxzZSBpZiAoU09BUDExQ29uc3RhbnRzLlNPQVBfRU5WRUxPUEVfTkFNRVNQQUNFX1VSSS5lcXVhbHMobnNVUkkpKSB7DQotICAgICAgICAgICAgcmV0dXJuIE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMUZhY3RvcnkoKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdChNZXNzYWdlcy5nZXRNZXNzYWdlKCJpbnZhbGlkU09BUHZlcnNpb24iKSk7DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvQXJyYXlTdGFjay5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvQXJyYXlTdGFjay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGYyOTcyLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi91dGlsL0FycmF5U3RhY2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkVtcHR5U3RhY2tFeGNlcHRpb247Ci0KLS8qKgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIHtAbGluayBqYXZhLnV0aWwuU3RhY2t9IEFQSSB0aGF0IGlzIGJhc2VkIG9uIGFuIDxjb2RlPkFycmF5TGlzdDwvY29kZT4KLSAqIGluc3RlYWQgb2YgYSA8Y29kZT5WZWN0b3I8L2NvZGU+LCBzbyBpdCBpcyBub3Qgc3luY2hyb25pemVkIHRvIHByb3RlY3QgYWdhaW5zdCBtdWx0aS10aHJlYWRlZAotICogYWNjZXNzLiAgVGhlIGltcGxlbWVudGF0aW9uIGlzIHRoZXJlZm9yZSBvcGVyYXRlcyBmYXN0ZXIgaW4gZW52aXJvbm1lbnRzIHdoZXJlIHlvdSBkbyBub3QgbmVlZCB0bwotICogd29ycnkgYWJvdXQgbXVsdGlwbGUgdGhyZWFkIGNvbnRlbnRpb24uCi0gKiA8cC8+Ci0gKiBUaGUgcmVtb3ZhbCBvcmRlciBvZiBhbiA8Y29kZT5BcnJheVN0YWNrPC9jb2RlPiBpcyBiYXNlZCBvbiBpbnNlcnRpb24gb3JkZXI6IFRoZSBtb3N0IHJlY2VudGx5Ci0gKiBhZGRlZCBlbGVtZW50IGlzIHJlbW92ZWQgZmlyc3QuICBUaGUgaXRlcmF0aW9uIG9yZGVyIGlzIDxpPm5vdDwvaT4gdGhlIHNhbWUgYXMgdGhlIHJlbW92YWwgb3JkZXIuCi0gKiAgVGhlIGl0ZXJhdG9yIHJldHVybnMgZWxlbWVudHMgZnJvbSB0aGUgYm90dG9tIHVwLCB3aGVyZWFzIHRoZSB7QGxpbmsgI3JlbW92ZSgpfSBtZXRob2QgcmVtb3ZlcwotICogdGhlbSBmcm9tIHRoZSB0b3AgZG93bi4KLSAqIDxwLz4KLSAqIFVubGlrZSA8Y29kZT5TdGFjazwvY29kZT4sIDxjb2RlPkFycmF5U3RhY2s8L2NvZGU+IGFjY2VwdHMgbnVsbCBlbnRyaWVzLgotICovCi1wdWJsaWMgY2xhc3MgQXJyYXlTdGFjayBleHRlbmRzIEFycmF5TGlzdCB7Ci0KLSAgICAvKiogRW5zdXJlIHNlcmlhbGl6YXRpb24gY29tcGF0aWJpbGl0eSAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDIxMzAwNzkxNTk5MzE1NzQ1OTlMOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBlbXB0eSA8Y29kZT5BcnJheVN0YWNrPC9jb2RlPi4gVGhlIGluaXRpYWwgc2l6ZSBpcyBjb250cm9sbGVkIGJ5Ci0gICAgICogPGNvZGU+QXJyYXlMaXN0PC9jb2RlPiBhbmQgaXMgY3VycmVudGx5IDEwLgotICAgICAqLwotICAgIHB1YmxpYyBBcnJheVN0YWNrKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgZW1wdHkgPGNvZGU+QXJyYXlTdGFjazwvY29kZT4gd2l0aCBhbiBpbml0aWFsIHNpemUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaW5pdGlhbFNpemUgdGhlIGluaXRpYWwgc2l6ZSB0byB1c2UKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgc3BlY2lmaWVkIGluaXRpYWwgc2l6ZSBpcyBuZWdhdGl2ZQotICAgICAqLwotICAgIHB1YmxpYyBBcnJheVN0YWNrKGludCBpbml0aWFsU2l6ZSkgewotICAgICAgICBzdXBlcihpbml0aWFsU2l6ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgc3RhY2sgaXMgY3VycmVudGx5IGVtcHR5LgotICAgICAqIDxwLz4KLSAgICAgKiBUaGlzIG1ldGhvZCBleGlzdHMgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCA8Y29kZT5qYXZhLnV0aWwuU3RhY2s8L2NvZGU+LiBOZXcgdXNlcnMgb2YgdGhpcwotICAgICAqIGNsYXNzIHNob3VsZCB1c2UgPGNvZGU+aXNFbXB0eTwvY29kZT4gaW5zdGVhZC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc3RhY2sgaXMgY3VycmVudGx5IGVtcHR5Ci0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZW1wdHkoKSB7Ci0gICAgICAgIHJldHVybiBpc0VtcHR5KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdG9wIGl0ZW0gb2ZmIG9mIHRoaXMgc3RhY2sgd2l0aG91dCByZW1vdmluZyBpdC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHRvcCBpdGVtIG9uIHRoZSBzdGFjawotICAgICAqIEB0aHJvd3MgRW1wdHlTdGFja0V4Y2VwdGlvbiBpZiB0aGUgc3RhY2sgaXMgZW1wdHkKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IHBlZWsoKSB0aHJvd3MgRW1wdHlTdGFja0V4Y2VwdGlvbiB7Ci0gICAgICAgIGludCBuID0gc2l6ZSgpOwotICAgICAgICBpZiAobiA8PSAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRW1wdHlTdGFja0V4Y2VwdGlvbigpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGdldChuIC0gMSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuJ3RoIGl0ZW0gZG93biAoemVyby1yZWxhdGl2ZSkgZnJvbSB0aGUgdG9wIG9mIHRoaXMgc3RhY2sgd2l0aG91dCByZW1vdmluZyBpdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuIHRoZSBudW1iZXIgb2YgaXRlbXMgZG93biB0byBnbwotICAgICAqIEByZXR1cm4gdGhlIG4ndGggaXRlbSBvbiB0aGUgc3RhY2ssIHplcm8gcmVsYXRpdmUKLSAgICAgKiBAdGhyb3dzIEVtcHR5U3RhY2tFeGNlcHRpb24gaWYgdGhlcmUgYXJlIG5vdCBlbm91Z2ggaXRlbXMgb24gdGhlIHN0YWNrIHRvIHNhdGlzZnkgdGhpcwotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0Ci0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBwZWVrKGludCBuKSB0aHJvd3MgRW1wdHlTdGFja0V4Y2VwdGlvbiB7Ci0gICAgICAgIGludCBtID0gKHNpemUoKSAtIG4pIC0gMTsKLSAgICAgICAgaWYgKG0gPCAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRW1wdHlTdGFja0V4Y2VwdGlvbigpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGdldChtKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBvcHMgdGhlIHRvcCBpdGVtIG9mZiBvZiB0aGlzIHN0YWNrIGFuZCByZXR1cm4gaXQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSB0b3AgaXRlbSBvbiB0aGUgc3RhY2sKLSAgICAgKiBAdGhyb3dzIEVtcHR5U3RhY2tFeGNlcHRpb24gaWYgdGhlIHN0YWNrIGlzIGVtcHR5Ci0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBwb3AoKSB0aHJvd3MgRW1wdHlTdGFja0V4Y2VwdGlvbiB7Ci0gICAgICAgIGludCBuID0gc2l6ZSgpOwotICAgICAgICBpZiAobiA8PSAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRW1wdHlTdGFja0V4Y2VwdGlvbigpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIHJlbW92ZShuIC0gMSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQdXNoZXMgYSBuZXcgaXRlbSBvbnRvIHRoZSB0b3Agb2YgdGhpcyBzdGFjay4gVGhlIHB1c2hlZCBpdGVtIGlzIGFsc28gcmV0dXJuZWQuIFRoaXMgaXMKLSAgICAgKiBlcXVpdmFsZW50IHRvIGNhbGxpbmcgPGNvZGU+YWRkPC9jb2RlPi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpdGVtIHRoZSBpdGVtIHRvIGJlIGFkZGVkCi0gICAgICogQHJldHVybiB0aGUgaXRlbSBqdXN0IHB1c2hlZAotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgcHVzaChPYmplY3QgaXRlbSkgewotICAgICAgICBhZGQoaXRlbSk7Ci0gICAgICAgIHJldHVybiBpdGVtOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG9uZS1iYXNlZCBwb3NpdGlvbiBvZiB0aGUgZGlzdGFuY2UgZnJvbSB0aGUgdG9wIHRoYXQgdGhlIHNwZWNpZmllZCBvYmplY3QgZXhpc3RzCi0gICAgICogb24gdGhpcyBzdGFjaywgd2hlcmUgdGhlIHRvcC1tb3N0IGVsZW1lbnQgaXMgY29uc2lkZXJlZCB0byBiZSBhdCBkaXN0YW5jZSA8Y29kZT4xPC9jb2RlPi4gIElmCi0gICAgICogdGhlIG9iamVjdCBpcyBub3QgcHJlc2VudCBvbiB0aGUgc3RhY2ssIHJldHVybiA8Y29kZT4tMTwvY29kZT4gaW5zdGVhZC4gIFRoZQotICAgICAqIDxjb2RlPmVxdWFscygpPC9jb2RlPiBtZXRob2QgaXMgdXNlZCB0byBjb21wYXJlIHRvIHRoZSBpdGVtcyBpbiB0aGlzIHN0YWNrLgotICAgICAqCi0gICAgICogQHBhcmFtIG9iamVjdCB0aGUgb2JqZWN0IHRvIGJlIHNlYXJjaGVkIGZvcgotICAgICAqIEByZXR1cm4gdGhlIDEtYmFzZWQgZGVwdGggaW50byB0aGUgc3RhY2sgb2YgdGhlIG9iamVjdCwgb3IgLTEgaWYgbm90IGZvdW5kCi0gICAgICovCi0gICAgcHVibGljIGludCBzZWFyY2goT2JqZWN0IG9iamVjdCkgewotICAgICAgICBpbnQgaSA9IHNpemUoKSAtIDE7ICAgICAgICAvLyBDdXJyZW50IGluZGV4Ci0gICAgICAgIGludCBuID0gMTsgICAgICAgICAgICAgICAgIC8vIEN1cnJlbnQgZGlzdGFuY2UKLSAgICAgICAgd2hpbGUgKGkgPj0gMCkgewotICAgICAgICAgICAgT2JqZWN0IGN1cnJlbnQgPSBnZXQoaSk7Ci0gICAgICAgICAgICBpZiAoKG9iamVjdCA9PSBudWxsICYmIGN1cnJlbnQgPT0gbnVsbCkgfHwKLSAgICAgICAgICAgICAgICAgICAgKG9iamVjdCAhPSBudWxsICYmIG9iamVjdC5lcXVhbHMoY3VycmVudCkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpLS07Ci0gICAgICAgICAgICBuKys7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGVsZW1lbnQgb24gdGhlIHRvcCBvZiB0aGUgc3RhY2suCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBlbGVtZW50IG9uIHRoZSB0b3Agb2YgdGhlIHN0YWNrCi0gICAgICogQHRocm93cyBFbXB0eVN0YWNrRXhjZXB0aW9uIGlmIHRoZSBzdGFjayBpcyBlbXB0eQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0KCkgewotICAgICAgICBpbnQgc2l6ZSA9IHNpemUoKTsKLSAgICAgICAgaWYgKHNpemUgPT0gMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEVtcHR5U3RhY2tFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZ2V0KHNpemUgLSAxKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIHRoZSBlbGVtZW50IG9uIHRoZSB0b3Agb2YgdGhlIHN0YWNrLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgcmVtb3ZlZCBlbGVtZW50Ci0gICAgICogQHRocm93cyBFbXB0eVN0YWNrRXhjZXB0aW9uIGlmIHRoZSBzdGFjayBpcyBlbXB0eQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgcmVtb3ZlKCkgewotICAgICAgICBpbnQgc2l6ZSA9IHNpemUoKTsKLSAgICAgICAgaWYgKHNpemUgPT0gMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEVtcHR5U3RhY2tFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVtb3ZlKHNpemUgLSAxKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi90ZXN0LXJlc291cmNlcy94bWxzL2FycmF5MS54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9hZGIvdGVzdC1yZXNvdXJjZXMveG1scy9hcnJheTEueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTM0ZjE4Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi90ZXN0LXJlc291cmNlcy94bWxzL2FycmF5MS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTx3cmFwcGVyPgotICAgIDxpdGVtPm9uZTwvaXRlbT4KLSAgICA8aXRlbT50d288L2l0ZW0+Ci0gICAgPGl0ZW0+dGhyZWU8L2l0ZW0+Ci08L3dyYXBwZXI+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy9BREJTT0FQTW9kZWxCdWlsZGVyVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy9BREJTT0FQTW9kZWxCdWlsZGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzFiN2ZiLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvQURCU09BUE1vZGVsQnVpbGRlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmc7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5kb20uRE9PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLnV0aWwuU3RBWFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQMTFDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuaW1wbC5idWlsZGVyLlN0QVhTT0FQTW9kZWxCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuUHJpbnRFdmVudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVySW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgb3JnLmN1c3RvbW1vbmtleS54bWx1bml0LlhNTFRlc3RDYXNlOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotcHVibGljIGNsYXNzIEFEQlNPQVBNb2RlbEJ1aWxkZXJUZXN0IGV4dGVuZHMgWE1MVGVzdENhc2UgewotICAgIHB1YmxpYyB2b2lkIHRlc3RTaW1wbGVBcnJheUxpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIGV4cGVjdGVkWE1MID0gIjw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J3V0Zi04Jz8+IiArCi0gICAgICAgICAgICAgICAgIjxzb2FwZW52OkVudmVsb3BlIHhtbG5zOnNvYXBlbnY9XCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlL1wiPiIgKwotICAgICAgICAgICAgICAgICI8c29hcGVudjpCb2R5PiIgKwotICAgICAgICAgICAgICAgICI8UGVyc29uIHhtbG5zPVwiXCI+IiArCi0gICAgICAgICAgICAgICAgIjxOYW1lIHhtbG5zPVwiXCI+Rm9vT25lPC9OYW1lPiIgKwotICAgICAgICAgICAgICAgICI8RGVwZW5kZW50T25lIHhtbG5zPVwiXCI+PE5hbWUgeG1sbnM9XCJcIj5Gb29Ud288L05hbWU+IiArCi0gICAgICAgICAgICAgICAgIjxBZ2UgeG1sbnM9XCJcIj4yNTwvQWdlPiIgKwotICAgICAgICAgICAgICAgICI8U2V4IHhtbG5zPVwiXCI+TWFsZTwvU2V4PjwvRGVwZW5kZW50T25lPiIgKwotICAgICAgICAgICAgICAgICI8RGVwZW5kZW50VHdvIHhtbG5zPVwiXCI+IiArCi0gICAgICAgICAgICAgICAgIjxOYW1lIHhtbG5zPVwiXCI+Rm9vVHdvPC9OYW1lPiIgKwotICAgICAgICAgICAgICAgICI8QWdlIHhtbG5zPVwiXCI+MjU8L0FnZT4iICsKLSAgICAgICAgICAgICAgICAiPFNleCB4bWxucz1cIlwiPk1hbGU8L1NleD48L0RlcGVuZGVudFR3bz4iICsKLSAgICAgICAgICAgICAgICAiPE9yZ2FuaXphdGlvbiB4bWxucz1cIlwiPkFwYWNoZTwvT3JnYW5pemF0aW9uPiIgKwotICAgICAgICAgICAgICAgICI8L1BlcnNvbj48L3NvYXBlbnY6Qm9keT48L3NvYXBlbnY6RW52ZWxvcGU+IjsKLSAgICAgICAgQXJyYXlMaXN0IHByb3BlcnR5TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgcHJvcGVydHlMaXN0LmFkZCgiTmFtZSIpOwotICAgICAgICBwcm9wZXJ0eUxpc3QuYWRkKCJGb29PbmUiKTsKLSAgICAgICAgcHJvcGVydHlMaXN0LmFkZChuZXcgUU5hbWUoIkRlcGVuZGVudE9uZSIpKTsKLSAgICAgICAgcHJvcGVydHlMaXN0LmFkZChuZXcgRHVtbXlBREJCZWFuKCkpOwotICAgICAgICBwcm9wZXJ0eUxpc3QuYWRkKG5ldyBRTmFtZSgiRGVwZW5kZW50VHdvIikpOwotICAgICAgICBwcm9wZXJ0eUxpc3QuYWRkKG5ldyBEdW1teUFEQkJlYW4oKSk7Ci0gICAgICAgIHByb3BlcnR5TGlzdC5hZGQoIk9yZ2FuaXphdGlvbiIpOwotICAgICAgICBwcm9wZXJ0eUxpc3QuYWRkKCJBcGFjaGUiKTsKLSAgICAgICAgUU5hbWUgcHJvamVjdFFOYW1lID0gbmV3IFFOYW1lKCJQZXJzb24iKTsKLQotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgcHVsbFBhcnNlciA9Ci0gICAgICAgICAgICAgICAgbmV3IEFEQlhNTFN0cmVhbVJlYWRlckltcGwocHJvamVjdFFOYW1lLCBwcm9wZXJ0eUxpc3QudG9BcnJheSgpLCBudWxsKTsKLSAgICAgICAgQURCU09BUE1vZGVsQnVpbGRlciBidWlsZGVyID0gbmV3IEFEQlNPQVBNb2RlbEJ1aWxkZXIoCi0gICAgICAgICAgICAgICAgcHVsbFBhcnNlciwgT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDExRmFjdG9yeSgpKTsKLQotICAgICAgICBPTUVsZW1lbnQgcm9vdCA9IGJ1aWxkZXIuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0gICAgICAgIGFzc2VydFRydWUoIlJvb3QgZWxlbWVudCBjYW4gbm90IGJlIG51bGwiLCByb290ICE9IG51bGwpOwotICAgICAgICBEb2N1bWVudCBleHBlY3RlZERPTSA9IG5ld0RvY3VtZW50KGV4cGVjdGVkWE1MKTsKLSAgICAgICAgRG9jdW1lbnQgYWN0dWFsRG9tID0gbmV3RG9jdW1lbnQocm9vdC50b1N0cmluZygpKTsKLSAgICAgICAgYXNzZXJ0WE1MRXF1YWwoYWN0dWFsRG9tLCBleHBlY3RlZERPTSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFByaW50RXZlbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFhNTFN0cmVhbVJlYWRlciByID0gZ2V0VGVzdEVudmVsb3BlKCkuZ2V0WE1MU3RyZWFtUmVhZGVyKCk7Ci0gICAgICAgIFByaW50RXZlbnRzLnByaW50KHIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQcmludEV2ZW50czIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy9UT0RPOiBGSVhNRS4gQ2hlY2sgdGhlIG91dHB1dCBkaWZmZXJlbmNlIGJldHdlZW4gdGhpcyBtZXRob2QgYW5kIHRoZSB0ZXN0UHJpbnRFdmVudHMgbWV0aG9kCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlciByID0gZ2V0VGVzdEVudmVsb3BlKCkuZ2V0WE1MU3RyZWFtUmVhZGVyV2l0aG91dENhY2hpbmcoKTsKLSAgICAgICAgUHJpbnRFdmVudHMucHJpbnQocik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENvbnZlcnRUb0RPT00oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHhtbCA9ICI8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSd1dGYtOCc/PiIgKwotICAgICAgICAgICAgICAgICI8c29hcGVudjpFbnZlbG9wZSB4bWxuczpzb2FwZW52PVwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS9cIj4iICsKLSAgICAgICAgICAgICAgICAiPHNvYXBlbnY6Qm9keT48bnMxOmNyZWF0ZUFjY291bnRSZXF1ZXN0IHhtbG5zOm5zMT1cImh0dHA6Ly93d3cud3NvMi5jb20vdHlwZXNcIj4iICsKLSAgICAgICAgICAgICAgICAiPGNsaWVudGluZm8geG1sbnM9XCJodHRwOi8vd3d3LndzbzIuY29tL3R5cGVzXCI+PG5hbWU+Ym9iPC9uYW1lPjxzc24+MTIzNDU2Nzg5PC9zc24+PC9jbGllbnRpbmZvPiIgKwotICAgICAgICAgICAgICAgICI8cGFzc3dvcmQgeG1sbnM9XCJcIj5wYXNzd2Q8L3Bhc3N3b3JkPjwvbnMxOmNyZWF0ZUFjY291bnRSZXF1ZXN0Pjwvc29hcGVudjpCb2R5Pjwvc29hcGVudjpFbnZlbG9wZT4iOwotCi0gICAgICAgIFN0QVhTT0FQTW9kZWxCdWlsZGVyIGJ1aWxkZXIyID0gbmV3IFN0QVhTT0FQTW9kZWxCdWlsZGVyKAotICAgICAgICAgICAgICAgIGdldFRlc3RFbnZlbG9wZSgpLmdldFhNTFN0cmVhbVJlYWRlcigpLAotICAgICAgICAgICAgICAgIERPT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDExRmFjdG9yeSgpLAotICAgICAgICAgICAgICAgIFNPQVAxMUNvbnN0YW50cy5TT0FQX0VOVkVMT1BFX05BTUVTUEFDRV9VUkkpOwotCi0gICAgICAgIFNPQVBFbnZlbG9wZSBlbnZlbG9wZSA9IGJ1aWxkZXIyLmdldFNPQVBFbnZlbG9wZSgpOwotICAgICAgICBlbnZlbG9wZS5idWlsZCgpOwotCi0gICAgICAgIFN0cmluZ1dyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgICAgIGVudmVsb3BlLnNlcmlhbGl6ZSh3cml0ZXIpOwotICAgICAgICB3cml0ZXIuZmx1c2goKTsKLQotICAgICAgICBTdHJpbmcgczIgPSB3cml0ZXIudG9TdHJpbmcoKTsKLQotICAgICAgICBhc3NlcnRYTUxFcXVhbChzMiwgeG1sKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFNPQVBFbnZlbG9wZSBnZXRUZXN0RW52ZWxvcGUoKSB7Ci0gICAgICAgIENyZWF0ZUFjY291bnRSZXF1ZXN0IHJlcXVlc3QgPSBuZXcgQ3JlYXRlQWNjb3VudFJlcXVlc3QoKTsKLSAgICAgICAgQ2xpZW50SW5mbyBjbGllbnRJbmZvID0gbmV3IENsaWVudEluZm8oKTsKLSAgICAgICAgY2xpZW50SW5mby5zZXROYW1lKCJib2IiKTsKLSAgICAgICAgY2xpZW50SW5mby5zZXRTc24oIjEyMzQ1Njc4OSIpOwotICAgICAgICByZXF1ZXN0LnNldENsaWVudEluZm8oY2xpZW50SW5mbyk7Ci0gICAgICAgIHJlcXVlc3Quc2V0UGFzc3dvcmQoInBhc3N3ZCIpOwotCi0gICAgICAgIEFEQlNPQVBNb2RlbEJ1aWxkZXIgYnVpbGRlciA9IG5ldyBBREJTT0FQTW9kZWxCdWlsZGVyKHJlcXVlc3QKLSAgICAgICAgICAgICAgICAuZ2V0UHVsbFBhcnNlcihDcmVhdGVBY2NvdW50UmVxdWVzdC5NWV9RTkFNRSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMUZhY3RvcnkoKSk7Ci0KLSAgICAgICAgcmV0dXJuIGJ1aWxkZXIuZ2V0RW52ZWxvcGUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udmVydFRvRE9PTTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHhtbCA9Ci0gICAgICAgICAgICAgICAgIjw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J3V0Zi04Jz8+PHNvYXBlbnY6RW52ZWxvcGUgeG1sbnM6c29hcGVudj1cImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvXCI+PHNvYXBlbnY6SGVhZGVyIC8+PHNvYXBlbnY6Qm9keT48bnMxOmNyZWF0ZUFjY291bnRSZXF1ZXN0IHhtbG5zOm5zMT1cImh0dHA6Ly93d3cud3NvMi5jb20vdHlwZXNcIj48bnMxOmNsaWVudGluZm8+PG5hbWUgeG1sbnM9XCJcIj5ib2I8L25hbWU+PHNzbiB4bWxucz1cIlwiPjEyMzQ1Njc4OTwvc3NuPjwvbnMxOmNsaWVudGluZm8+PHBhc3N3b3JkIHhtbG5zPVwiXCI+cGFzc3dkPC9wYXNzd29yZD48L25zMTpjcmVhdGVBY2NvdW50UmVxdWVzdD48L3NvYXBlbnY6Qm9keT48L3NvYXBlbnY6RW52ZWxvcGU+IjsKLQotICAgICAgICBDcmVhdGVBY2NvdW50UmVxdWVzdCByZXF1ZXN0ID0gbmV3IENyZWF0ZUFjY291bnRSZXF1ZXN0KCk7Ci0gICAgICAgIENsaWVudEluZm8gY2xpZW50SW5mbyA9IG5ldyBDbGllbnRJbmZvKCk7Ci0gICAgICAgIGNsaWVudEluZm8uc2V0TmFtZSgiYm9iIik7Ci0gICAgICAgIGNsaWVudEluZm8uc2V0U3NuKCIxMjM0NTY3ODkiKTsKLSAgICAgICAgcmVxdWVzdC5zZXRDbGllbnRJbmZvKGNsaWVudEluZm8pOwotICAgICAgICByZXF1ZXN0LnNldFBhc3N3b3JkKCJwYXNzd2QiKTsKLQotICAgICAgICBBREJTT0FQTW9kZWxCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgQURCU09BUE1vZGVsQnVpbGRlcihyZXF1ZXN0Ci0gICAgICAgICAgICAgICAgLmdldFB1bGxQYXJzZXIoQ3JlYXRlQWNjb3VudFJlcXVlc3QuTVlfUU5BTUUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTFGYWN0b3J5KCkpOwotCi0gICAgICAgIFNPQVBFbnZlbG9wZSBlbnYgPSBidWlsZGVyLmdldEVudmVsb3BlKCk7Ci0KLSAgICAgICAgU3RBWFNPQVBNb2RlbEJ1aWxkZXIgYnVpbGRlcjIgPSBuZXcgU3RBWFNPQVBNb2RlbEJ1aWxkZXIoCi0gICAgICAgICAgICAgICAgZ2V0VGVzdEVudmVsb3BlKCkuZ2V0WE1MU3RyZWFtUmVhZGVyV2l0aG91dENhY2hpbmcoKSwKLSAgICAgICAgICAgICAgICBET09NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMUZhY3RvcnkoKSwKLSAgICAgICAgICAgICAgICBTT0FQMTFDb25zdGFudHMuU09BUF9FTlZFTE9QRV9OQU1FU1BBQ0VfVVJJKTsKLSAgICAgICAgU09BUEVudmVsb3BlIGVudmVsb3BlID0gYnVpbGRlcjIuZ2V0U09BUEVudmVsb3BlKCk7Ci0gICAgICAgIGVudmVsb3BlLmJ1aWxkKCk7Ci0KLSAgICAgICAgU3RyaW5nV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICAgICAgZW52ZWxvcGUuc2VyaWFsaXplKHdyaXRlcik7Ci0gICAgICAgIHdyaXRlci5mbHVzaCgpOwotCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlciByID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKHdyaXRlci50b1N0cmluZygpKSk7Ci0gICAgICAgIFByaW50RXZlbnRzLnByaW50KHIpOwotCi0gICAgICAgIC8vVE9ETzogRklYTUUuIFNpbXBsZXIgdGVzdCBpbiB0ZXN0UHJpbnRFdmVudHMyCi0gICAgICAgIC8vYXNzZXJ0WE1MRXF1YWwod3JpdGVyLnRvU3RyaW5nKCkseG1sKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgY2xhc3MgRHVtbXlBREJCZWFuIGltcGxlbWVudHMgQURCQmVhbiB7Ci0gICAgICAgIEFycmF5TGlzdCBwcm9wZXJ0eUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgcHVibGljIER1bW15QURCQmVhbigpIHsKLSAgICAgICAgICAgIHByb3BlcnR5TGlzdC5hZGQoIk5hbWUiKTsKLSAgICAgICAgICAgIHByb3BlcnR5TGlzdC5hZGQoIkZvb1R3byIpOwotICAgICAgICAgICAgcHJvcGVydHlMaXN0LmFkZCgiQWdlIik7Ci0gICAgICAgICAgICBwcm9wZXJ0eUxpc3QuYWRkKCIyNSIpOwotICAgICAgICAgICAgcHJvcGVydHlMaXN0LmFkZCgiU2V4Iik7Ci0gICAgICAgICAgICBwcm9wZXJ0eUxpc3QuYWRkKCJNYWxlIik7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgRHVtbXlBREJCZWFuIGFkZEFub3RoZXJCZWFuKCkgewotICAgICAgICAgICAgcHJvcGVydHlMaXN0LmFkZChuZXcgUU5hbWUoIkRlcGVtZGVudCIpKTsKLSAgICAgICAgICAgIER1bW15QURCQmVhbiBkdW1teUJlYW4gPSBuZXcgRHVtbXlBREJCZWFuKCk7Ci0gICAgICAgICAgICBwcm9wZXJ0eUxpc3QuYWRkKGR1bW15QmVhbik7Ci0gICAgICAgICAgICByZXR1cm4gZHVtbXlCZWFuOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFhNTFN0cmVhbVJlYWRlciBnZXRQdWxsUGFyc2VyKFFOYW1lIGFkYkJlYW5RTmFtZSkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBBREJYTUxTdHJlYW1SZWFkZXJJbXBsKGFkYkJlYW5RTmFtZSwgcHJvcGVydHlMaXN0LnRvQXJyYXkoKSwgbnVsbCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpCi0gICAgICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgQURCRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcixmYWxzZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNlcmlhbGl6ZVR5cGUpCi0gICAgICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgQURCRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiVW4gaW1wbGVtZW50ZWQgbWV0aG9kIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgRG9jdW1lbnQgbmV3RG9jdW1lbnQoU3RyaW5nIHhtbCkKLSAgICAgICAgICAgIHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAgICAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBkYmYgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIGRiZi5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKLSAgICAgICAgRG9jdW1lbnRCdWlsZGVyIGRiID0gZGJmLm5ld0RvY3VtZW50QnVpbGRlcigpOwotICAgICAgICByZXR1cm4gZGIucGFyc2UobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHhtbC5nZXRCeXRlcygpKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy9DbGllbnRJbmZvLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGIvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL0NsaWVudEluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVjMWFlMC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL0NsaWVudEluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIENsaWVudEluZm8uamF2YQotICoKLSAqIFRoaXMgZmlsZSB3YXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBXU0RMCi0gKiBieSB0aGUgQXBhY2hlIEF4aXMyIHZlcnNpb246ICNheGlzVmVyc2lvbiMgI3RvZGF5IwotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZzsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlcjsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci0KLS8qKiBDbGllbnRJbmZvIGJlYW4gY2xhc3MgKi8KLQotcHVibGljIGNsYXNzIENsaWVudEluZm8KLSAgICAgICAgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkJlYW4gewotICAgIC8qIFRoaXMgdHlwZSB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIHBpZWNlIG9mIHNjaGVtYSB0aGF0IGhhZAotICAgIG5hbWUgPSBDbGllbnRJbmZvCi0gICAgTmFtZXNwYWNlIFVSSSA9IGh0dHA6Ly93d3cud3NvMi5jb20vdHlwZXMKLSAgICBOYW1lc3BhY2UgUHJlZml4ID0gbnMxCi0gICAgKi8KLQotICAgIHB1YmxpYyBDbGllbnRJbmZvKFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBsb2NhbFNzbikgewotICAgICAgICB0aGlzLmxvY2FsTmFtZSA9IGxvY2FsTmFtZTsKLSAgICAgICAgdGhpcy5sb2NhbFNzbiA9IGxvY2FsU3NuOwotICAgIH0KLQotICAgIHB1YmxpYyBDbGllbnRJbmZvKCkgewotICAgIH0KLQotICAgIC8qKiBmaWVsZCBmb3IgTmFtZSAqLwotICAgIHByb3RlY3RlZCBqYXZhLmxhbmcuU3RyaW5nIGxvY2FsTmFtZTsKLQotCi0gICAgLyoqCi0gICAgICogQXV0byBnZW5lcmF0ZWQgZ2V0dGVyIG1ldGhvZAotICAgICAqCi0gICAgICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGxvY2FsTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBdXRvIGdlbmVyYXRlZCBzZXR0ZXIgbWV0aG9kCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGFyYW0gTmFtZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoamF2YS5sYW5nLlN0cmluZyBwYXJhbSkgewotCi0KLSAgICAgICAgdGhpcy5sb2NhbE5hbWUgPSBwYXJhbTsKLSAgICB9Ci0KLQotICAgIC8qKiBmaWVsZCBmb3IgU3NuICovCi0gICAgcHJvdGVjdGVkIGphdmEubGFuZy5TdHJpbmcgbG9jYWxTc247Ci0KLQotICAgIC8qKgotICAgICAqIEF1dG8gZ2VuZXJhdGVkIGdldHRlciBtZXRob2QKLSAgICAgKgotICAgICAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotICAgICAqLwotICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFNzbigpIHsKLSAgICAgICAgcmV0dXJuIGxvY2FsU3NuOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEF1dG8gZ2VuZXJhdGVkIHNldHRlciBtZXRob2QKLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJhbSBTc24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTc24oamF2YS5sYW5nLlN0cmluZyBwYXJhbSkgewotCi0KLSAgICAgICAgdGhpcy5sb2NhbFNzbiA9IHBhcmFtOwotICAgIH0KLQotCi0gICAgLyoqIGRhdGFiaW5kaW5nIG1ldGhvZCB0byBnZXQgYW4gWE1MIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0ICovCi0gICAgcHVibGljIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIGdldFB1bGxQYXJzZXIoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxTmFtZSkgewotCi0KLSAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBlbGVtZW50TGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0gICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgYXR0cmliTGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0KLQotICAgICAgICBlbGVtZW50TGlzdC5hZGQobmV3IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUoImh0dHA6Ly93d3cud3NvMi5jb20vdHlwZXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiKSk7Ci0gICAgICAgIGVsZW1lbnRMaXN0Ci0gICAgICAgICAgICAgICAgLmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsTmFtZSkpOwotCi0gICAgICAgIGVsZW1lbnRMaXN0LmFkZChuZXcgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSgiaHR0cDovL3d3dy53c28yLmNvbS90eXBlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3NuIikpOwotICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbFNzbikpOwotCi0KLSAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXJJbXBsCi0gICAgICAgICAgICAgICAgKHFOYW1lLCBlbGVtZW50TGlzdC50b0FycmF5KCksIGF0dHJpYkxpc3QudG9BcnJheSgpKTsKLQotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIFFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikKLSAgICAgICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uLCBBREJFeGNlcHRpb24gewotICAgICAgICAgICAgc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyLGZhbHNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBRTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VyaWFsaXplVHlwZSkKLSAgICAgICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uLCBBREJFeGNlcHRpb24gewotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJVbiBpbXBsZW1lbnRlZCBtZXRob2QiKTsKLSAgICAgICAgfQotCi0gICAgLyoqIEZhY3RvcnkgY2xhc3MgdGhhdCBrZWVwcyB0aGUgcGFyc2UgbWV0aG9kICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5IHsKLSAgICAgICAgLyoqIHN0YXRpYyBtZXRob2QgdG8gY3JlYXRlIHRoZSBvYmplY3QgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBDbGllbnRJbmZvIHBhcnNlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikKLSAgICAgICAgICAgICAgICB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBDbGllbnRJbmZvIG9iamVjdCA9IG5ldyBDbGllbnRJbmZvKCk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGludCBldmVudCA9IHJlYWRlci5nZXRFdmVudFR5cGUoKTsKLSAgICAgICAgICAgICAgICBpbnQgY291bnQgPSAwOwotICAgICAgICAgICAgICAgIGludCBhcmd1bWVudENvdW50ID0gMjsKLSAgICAgICAgICAgICAgICBib29sZWFuIGRvbmUgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAvL2V2ZW50IGJldHRlciBiZSBhIFNUQVJUX0VMRU1FTlQuIGlmIG5vdCB3ZSBzaG91bGQgZ28gdXAgdG8gdGhlIHN0YXJ0IGVsZW1lbnQgaGVyZQotICAgICAgICAgICAgICAgIHdoaWxlICghcmVhZGVyLmlzU3RhcnRFbGVtZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZXZlbnQgPSByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgIH0KLQotCi0gICAgICAgICAgICAgICAgd2hpbGUgKCFkb25lKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUNvbnN0YW50cy5TVEFSVF9FTEVNRU5UID09IGV2ZW50KSB7Ci0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCJuYW1lIi5lcXVhbHMocmVhZGVyLmdldExvY2FsTmFtZSgpKSkgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNvbnRlbnQgPSByZWFkZXIuZ2V0RWxlbWVudFRleHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0TmFtZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCsrOwotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoInNzbiIuZXF1YWxzKHJlYWRlci5nZXRMb2NhbE5hbWUoKSkpIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjb250ZW50ID0gcmVhZGVyLmdldEVsZW1lbnRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldFNzbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCsrOwotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotCi0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAoYXJndW1lbnRDb3VudCA9PSBjb3VudCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZG9uZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAoIWRvbmUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50ID0gcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IGNhdGNoIChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEubGFuZy5FeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBvYmplY3Q7Ci0gICAgICAgIH0KLSAgICB9Ly9lbmQgb2YgZmFjdG9yeSBjbGFzcwotCi19Ci0gICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy9DcmVhdGVBY2NvdW50UmVxdWVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy9DcmVhdGVBY2NvdW50UmVxdWVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjM0N2NmLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvQ3JlYXRlQWNjb3VudFJlcXVlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIENyZWF0ZUFjY291bnRSZXF1ZXN0LmphdmEKLSAqCi0gKiBUaGlzIGZpbGUgd2FzIGF1dG8tZ2VuZXJhdGVkIGZyb20gV1NETAotICogYnkgdGhlIEFwYWNoZSBBeGlzMiB2ZXJzaW9uOiAjYXhpc1ZlcnNpb24jICN0b2RheSMKLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmc7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXI7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotCi0vKiogQ3JlYXRlQWNjb3VudFJlcXVlc3QgYmVhbiBjbGFzcyAqLwotCi1wdWJsaWMgY2xhc3MgQ3JlYXRlQWNjb3VudFJlcXVlc3QgaW1wbGVtZW50cwotICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkJlYW4gewotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIE1ZX1FOQU1FID0gbmV3IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUoCi0gICAgICAgICAgICAiaHR0cDovL3d3dy53c28yLmNvbS90eXBlcyIsICJjcmVhdGVBY2NvdW50UmVxdWVzdCIsICJuczEiKTsKLQotICAgIC8qKiBmaWVsZCBmb3IgQ2xpZW50SW5mbyAqLwotICAgIHByb3RlY3RlZCBDbGllbnRJbmZvIGxvY2FsQ2xpZW50SW5mbzsKLQotICAgIC8qKgotICAgICAqIEF1dG8gZ2VuZXJhdGVkIGdldHRlciBtZXRob2QKLSAgICAgKgotICAgICAqIEByZXR1cm4gY29tLndzbzIud3d3LnR5cGVzLkNsaWVudEluZm8KLSAgICAgKi8KLSAgICBwdWJsaWMgQ2xpZW50SW5mbyBnZXRDbGllbnRJbmZvKCkgewotICAgICAgICByZXR1cm4gbG9jYWxDbGllbnRJbmZvOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEF1dG8gZ2VuZXJhdGVkIHNldHRlciBtZXRob2QKLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJhbSBDbGllbnRJbmZvCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q2xpZW50SW5mbyhDbGllbnRJbmZvIHBhcmFtKSB7Ci0KLSAgICAgICAgdGhpcy5sb2NhbENsaWVudEluZm8gPSBwYXJhbTsKLSAgICB9Ci0KLSAgICAvKiogZmllbGQgZm9yIFBhc3N3b3JkICovCi0gICAgcHJvdGVjdGVkIGphdmEubGFuZy5TdHJpbmcgbG9jYWxQYXNzd29yZDsKLQotICAgIC8qKgotICAgICAqIEF1dG8gZ2VuZXJhdGVkIGdldHRlciBtZXRob2QKLSAgICAgKgotICAgICAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotICAgICAqLwotICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFBhc3N3b3JkKCkgewotICAgICAgICByZXR1cm4gbG9jYWxQYXNzd29yZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBdXRvIGdlbmVyYXRlZCBzZXR0ZXIgbWV0aG9kCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGFyYW0gUGFzc3dvcmQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZChqYXZhLmxhbmcuU3RyaW5nIHBhcmFtKSB7Ci0KLSAgICAgICAgdGhpcy5sb2NhbFBhc3N3b3JkID0gcGFyYW07Ci0gICAgfQotCi0gICAgLyoqIGRhdGFiaW5kaW5nIG1ldGhvZCB0byBnZXQgYW4gWE1MIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0ICovCi0gICAgcHVibGljIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIGdldFB1bGxQYXJzZXIoCi0gICAgICAgICAgICBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFOYW1lKSB7Ci0KLSAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBlbGVtZW50TGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0gICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgYXR0cmliTGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgZWxlbWVudExpc3QuYWRkKG5ldyBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lKAotICAgICAgICAgICAgICAgICJodHRwOi8vd3d3LndzbzIuY29tL3R5cGVzIiwgImNsaWVudGluZm8iKSk7Ci0gICAgICAgIGVsZW1lbnRMaXN0LmFkZChsb2NhbENsaWVudEluZm8pOwotCi0gICAgICAgIGVsZW1lbnRMaXN0LmFkZChuZXcgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSgiIiwgInBhc3N3b3JkIikpOwotICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsCi0gICAgICAgICAgICAgICAgLmNvbnZlcnRUb1N0cmluZyhsb2NhbFBhc3N3b3JkKSk7Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXJJbXBsCi0gICAgICAgICAgICAgICAgKHFOYW1lLCBlbGVtZW50TGlzdC50b0FycmF5KCksIGF0dHJpYkxpc3QKLSAgICAgICAgICAgICAgICAgICAgICAgIC50b0FycmF5KCkpOwotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIFFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikKLSAgICAgICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uLCBBREJFeGNlcHRpb24gewotICAgICAgICAgICAgc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyLGZhbHNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBRTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VyaWFsaXplVHlwZSkKLSAgICAgICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uLCBBREJFeGNlcHRpb24gewotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJVbiBpbXBsZW1lbnRlZCBtZXRob2QiKTsKLSAgICAgICAgfQotCi0gICAgLyoqIEZhY3RvcnkgY2xhc3MgdGhhdCBrZWVwcyB0aGUgcGFyc2UgbWV0aG9kICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5IHsKLSAgICAgICAgLyoqIHN0YXRpYyBtZXRob2QgdG8gY3JlYXRlIHRoZSBvYmplY3QgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBDcmVhdGVBY2NvdW50UmVxdWVzdCBwYXJzZSgKLSAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpCi0gICAgICAgICAgICAgICAgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24gewotICAgICAgICAgICAgQ3JlYXRlQWNjb3VudFJlcXVlc3Qgb2JqZWN0ID0gbmV3IENyZWF0ZUFjY291bnRSZXF1ZXN0KCk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGludCBldmVudCA9IHJlYWRlci5nZXRFdmVudFR5cGUoKTsKLSAgICAgICAgICAgICAgICBpbnQgY291bnQgPSAwOwotICAgICAgICAgICAgICAgIGludCBhcmd1bWVudENvdW50ID0gMjsKLSAgICAgICAgICAgICAgICBib29sZWFuIGRvbmUgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAvLyBldmVudCBiZXR0ZXIgYmUgYSBTVEFSVF9FTEVNRU5ULiBpZiBub3Qgd2Ugc2hvdWxkIGdvIHVwIHRvCi0gICAgICAgICAgICAgICAgLy8gdGhlIHN0YXJ0IGVsZW1lbnQgaGVyZQotICAgICAgICAgICAgICAgIHdoaWxlICghcmVhZGVyLmlzU3RhcnRFbGVtZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZXZlbnQgPSByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHdoaWxlICghZG9uZSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Db25zdGFudHMuU1RBUlRfRUxFTUVOVCA9PSBldmVudCkgewotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoImNsaWVudGluZm8iLmVxdWFscyhyZWFkZXIuZ2V0TG9jYWxOYW1lKCkpKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRDbGllbnRJbmZvKENsaWVudEluZm8uRmFjdG9yeQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucGFyc2UocmVhZGVyKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQrKzsKLQotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoInBhc3N3b3JkIi5lcXVhbHMocmVhZGVyLmdldExvY2FsTmFtZSgpKSkgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNvbnRlbnQgPSByZWFkZXIuZ2V0RWxlbWVudFRleHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQYXNzd29yZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbnZlcnRUb1N0cmluZyhjb250ZW50KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQrKzsKLQotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAoYXJndW1lbnRDb3VudCA9PSBjb3VudCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZG9uZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAoIWRvbmUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50ID0gcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IGNhdGNoIChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEubGFuZy5FeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBvYmplY3Q7Ci0gICAgICAgIH0KLSAgICB9Ly8gZW5kIG9mIGZhY3RvcnkgY2xhc3MKLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvQXJyYXlUZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGIvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9BcnJheVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg4ZDEwZC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9BcnJheVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS51dGlsLlN0QVhVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLQotcHVibGljIGNsYXNzIEFycmF5VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBcnJheTEoKSB7Ci0KLSAgICAgICAgQXJyYXlFIGFycmF5RWxlbWVudCA9IG5ldyBBcnJheUUoKTsKLSAgICAgICAgQXJyYXkgYXJyYXkgPSBuZXcgQXJyYXkoKTsKLQotICAgICAgICBfaW50IHRlc3RJbnQ7Ci0gICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgNjsgaSsrKSB7Ci0gICAgICAgICAgICB0ZXN0SW50ID0gbmV3IF9pbnQoKTsKLSAgICAgICAgICAgIHRlc3RJbnQuc2V0X2ludChpKTsKLSAgICAgICAgICAgIGFycmF5LmFkZE9iamVjdCh0ZXN0SW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIGFycmF5LnNldEFycmF5VHlwZVFOYW1lKG5ldyBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lKCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIsImludCIpKTsKLSAgICAgICAgYXJyYXlFbGVtZW50LnNldEFycmF5KGFycmF5KTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IGFycmF5RWxlbWVudC5nZXRPTUVsZW1lbnQoQXJyYXlFLk1ZX1FOQU1FLAotICAgICAgICAgICAgICAgICAgICBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NRWxlbWVudCA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcigKLSAgICAgICAgICAgICAgICAgICAgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICBBcnJheUUgcmVzdWx0ID0gQXJyYXlFLkZhY3RvcnkucGFyc2UoeG1sUmVhZGVyKTsKLSAgICAgICAgICAgIExpc3QgcmVzdWx0TGlzdCA9IHJlc3VsdC5nZXRBcnJheSgpLmdldE9iamVjdExpc3QoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgNjsgaSsrKSB7Ci0gICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoKChfaW50KXJlc3VsdExpc3QuZ2V0KGktMSkpLmdldF9pbnQoKSxpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoQURCRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEFycmF5MigpIHsKLQotICAgICAgICBBcnJheUUgYXJyYXlFbGVtZW50ID0gbmV3IEFycmF5RSgpOwotICAgICAgICBBcnJheSBhcnJheSA9IG5ldyBBcnJheSgpOwotCi0gICAgICAgIERhdGUgdGVzdERhdGU7Ci0gICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgNjsgaSsrKSB7Ci0gICAgICAgICAgICB0ZXN0RGF0ZSA9IG5ldyBEYXRlKCk7Ci0gICAgICAgICAgICB0ZXN0RGF0ZS5zZXREYXRlKG5ldyBqYXZhLnV0aWwuRGF0ZSgpKTsKLSAgICAgICAgICAgIGFycmF5LmFkZE9iamVjdCh0ZXN0RGF0ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBhcnJheS5zZXRBcnJheVR5cGVRTmFtZShuZXcgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSgiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLCJkYXRlIikpOwotICAgICAgICBhcnJheUVsZW1lbnQuc2V0QXJyYXkoYXJyYXkpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gYXJyYXlFbGVtZW50LmdldE9NRWxlbWVudChBcnJheUUuTVlfUU5BTUUsCi0gICAgICAgICAgICAgICAgICAgIE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT01FbGVtZW50ID09PiAiICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKAotICAgICAgICAgICAgICAgICAgICBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIEFycmF5RSByZXN1bHQgPSBBcnJheUUuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpOwotICAgICAgICAgICAgTGlzdCByZXN1bHRMaXN0ID0gcmVzdWx0LmdldEFycmF5KCkuZ2V0T2JqZWN0TGlzdCgpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdExpc3Quc2l6ZSgpLDUpOwotICAgICAgICB9IGNhdGNoIChBREJFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEFycmF5MygpIHsKLQotICAgICAgICBBcnJheUUgYXJyYXlFbGVtZW50ID0gbmV3IEFycmF5RSgpOwotICAgICAgICBBcnJheSBhcnJheSA9IG5ldyBBcnJheSgpOwotCi0gICAgICAgIF9pbnQgdGVzdEludDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCA2OyBpKyspIHsKLSAgICAgICAgICAgIHRlc3RJbnQgPSBuZXcgX2ludCgpOwotICAgICAgICAgICAgdGVzdEludC5zZXRfaW50KGkpOwotICAgICAgICAgICAgYXJyYXkuYWRkT2JqZWN0KHRlc3RJbnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgYXJyYXlFbGVtZW50LnNldEFycmF5KGFycmF5KTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IGFycmF5RWxlbWVudC5nZXRPTUVsZW1lbnQoQXJyYXlFLk1ZX1FOQU1FLAotICAgICAgICAgICAgICAgICAgICBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NRWxlbWVudCA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcigKLSAgICAgICAgICAgICAgICAgICAgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICBBcnJheUUgcmVzdWx0ID0gQXJyYXlFLkZhY3RvcnkucGFyc2UoeG1sUmVhZGVyKTsKLSAgICAgICAgICAgIExpc3QgcmVzdWx0TGlzdCA9IHJlc3VsdC5nZXRBcnJheSgpLmdldE9iamVjdExpc3QoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgNjsgaSsrKSB7Ci0gICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoKChfaW50KXJlc3VsdExpc3QuZ2V0KGktMSkpLmdldF9pbnQoKSxpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoQURCRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEFycmF5NCgpIHsKLQotICAgICAgICBBcnJheUUgYXJyYXlFbGVtZW50ID0gbmV3IEFycmF5RSgpOwotICAgICAgICBBcnJheSBhcnJheSA9IG5ldyBBcnJheSgpOwotCi0gICAgICAgIERhdGUgdGVzdERhdGU7Ci0gICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgNjsgaSsrKSB7Ci0gICAgICAgICAgICB0ZXN0RGF0ZSA9IG5ldyBEYXRlKCk7Ci0gICAgICAgICAgICB0ZXN0RGF0ZS5zZXREYXRlKG5ldyBqYXZhLnV0aWwuRGF0ZSgpKTsKLSAgICAgICAgICAgIGFycmF5LmFkZE9iamVjdCh0ZXN0RGF0ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBhcnJheUVsZW1lbnQuc2V0QXJyYXkoYXJyYXkpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gYXJyYXlFbGVtZW50LmdldE9NRWxlbWVudChBcnJheUUuTVlfUU5BTUUsCi0gICAgICAgICAgICAgICAgICAgIE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT01FbGVtZW50ID09PiAiICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKAotICAgICAgICAgICAgICAgICAgICBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIEFycmF5RSByZXN1bHQgPSBBcnJheUUuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpOwotICAgICAgICAgICAgTGlzdCByZXN1bHRMaXN0ID0gcmVzdWx0LmdldEFycmF5KCkuZ2V0T2JqZWN0TGlzdCgpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdExpc3Quc2l6ZSgpLDUpOwotICAgICAgICB9IGNhdGNoIChBREJFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEFycmF5NSgpIHsKLQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG9tRWxlbWVudFN0cmluZyA9ICI8bnMxOkFycmF5IHhtbG5zOm5zMT1cImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvXCIgXG4iICsKLSAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgeG1sbnM6czE9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYVwiXG4iICsKLSAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgbnMxOmFycmF5VHlwZT1cInMxOnVyLXR5cGVbNV1cIj5cbiIgKwotICAgICAgICAgICAgICAgICAgICAiICAgIDxuczE6aW50PjE8L25zMTppbnQ+XG4iICsKLSAgICAgICAgICAgICAgICAgICAgIiAgICA8bnMxOmludD4yPC9uczE6aW50PlxuIiArCi0gICAgICAgICAgICAgICAgICAgICIgICAgPG5zMTppbnQ+MzwvbnMxOmludD5cbiIgKwotICAgICAgICAgICAgICAgICAgICAiICAgIDxuczE6aW50PjQ8L25zMTppbnQ+XG4iICsKLSAgICAgICAgICAgICAgICAgICAgIiAgICA8bnMxOmludD41PC9uczE6aW50PlxuIiArCi0gICAgICAgICAgICAgICAgICAgICI8L25zMTpBcnJheT4iOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTUVsZW1lbnQgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoCi0gICAgICAgICAgICAgICAgICAgIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvbUVsZW1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgQXJyYXlFIHJlc3VsdCA9IEFycmF5RS5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcik7Ci0gICAgICAgICAgICBMaXN0IHJlc3VsdExpc3QgPSByZXN1bHQuZ2V0QXJyYXkoKS5nZXRPYmplY3RMaXN0KCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IDY7IGkrKykgewotICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCgoX2ludClyZXN1bHRMaXN0LmdldChpLTEpKS5nZXRfaW50KCksaSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEFEQkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXJyYXk2KCkgewotCi0gICAgICAgIEFycmF5RSBhcnJheUVsZW1lbnQgPSBuZXcgQXJyYXlFKCk7Ci0gICAgICAgIEFycmF5IGFycmF5ID0gbmV3IEFycmF5KCk7Ci0gICAgICAgIGFycmF5LmFkZE9iamVjdChudWxsKTsKLQotICAgICAgICBfaW50IHRlc3RJbnQ7Ci0gICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgNjsgaSsrKSB7Ci0gICAgICAgICAgICB0ZXN0SW50ID0gbmV3IF9pbnQoKTsKLSAgICAgICAgICAgIHRlc3RJbnQuc2V0X2ludChpKTsKLSAgICAgICAgICAgIGFycmF5LmFkZE9iamVjdCh0ZXN0SW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIGFycmF5LnNldEFycmF5VHlwZVFOYW1lKG5ldyBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lKCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIsImludCIpKTsKLSAgICAgICAgYXJyYXlFbGVtZW50LnNldEFycmF5KGFycmF5KTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IGFycmF5RWxlbWVudC5nZXRPTUVsZW1lbnQoQXJyYXlFLk1ZX1FOQU1FLAotICAgICAgICAgICAgICAgICAgICBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NRWxlbWVudCA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcigKLSAgICAgICAgICAgICAgICAgICAgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICBBcnJheUUgcmVzdWx0ID0gQXJyYXlFLkZhY3RvcnkucGFyc2UoeG1sUmVhZGVyKTsKLSAgICAgICAgICAgIExpc3QgcmVzdWx0TGlzdCA9IHJlc3VsdC5nZXRBcnJheSgpLmdldE9iamVjdExpc3QoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgNjsgaSsrKSB7Ci0gICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoKChfaW50KXJlc3VsdExpc3QuZ2V0KGkpKS5nZXRfaW50KCksaSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEFEQkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3hzZC9BcnJheVRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMveHNkL0FycmF5VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTJhZWRmLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMveHNkL0FycmF5VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy54c2Q7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5TdEFYVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2RpbmcuQXJyYXk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2RpbmcuQXJyYXlFOwotCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotCi1wdWJsaWMgY2xhc3MgQXJyYXlUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotICAgIHB1YmxpYyB2b2lkIHRlc3RBcnJheTEoKSB7Ci0KLSAgICAgICAgQXJyYXlFIGFycmF5RWxlbWVudCA9IG5ldyBBcnJheUUoKTsKLSAgICAgICAgQXJyYXkgYXJyYXkgPSBuZXcgQXJyYXkoKTsKLQotICAgICAgICBfaW50IHRlc3RJbnQ7Ci0gICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgNjsgaSsrKSB7Ci0gICAgICAgICAgICB0ZXN0SW50ID0gbmV3IF9pbnQoKTsKLSAgICAgICAgICAgIHRlc3RJbnQuc2V0X2ludChpKTsKLSAgICAgICAgICAgIGFycmF5LmFkZE9iamVjdCh0ZXN0SW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIGFycmF5LnNldEFycmF5VHlwZVFOYW1lKG5ldyBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIsImludCIpKTsKLSAgICAgICAgYXJyYXlFbGVtZW50LnNldEFycmF5KGFycmF5KTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IGFycmF5RWxlbWVudC5nZXRPTUVsZW1lbnQoQXJyYXlFLk1ZX1FOQU1FLAotICAgICAgICAgICAgICAgICAgICBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NRWxlbWVudCA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcigKLSAgICAgICAgICAgICAgICAgICAgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICBBcnJheUUgcmVzdWx0ID0gQXJyYXlFLkZhY3RvcnkucGFyc2UoeG1sUmVhZGVyKTsKLSAgICAgICAgICAgIExpc3QgcmVzdWx0TGlzdCA9IHJlc3VsdC5nZXRBcnJheSgpLmdldE9iamVjdExpc3QoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgNjsgaSsrKSB7Ci0gICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoKChfaW50KXJlc3VsdExpc3QuZ2V0KGktMSkpLmdldF9pbnQoKSxpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoQURCRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBcnJheTIoKSB7Ci0KLSAgICAgICAgQXJyYXlFIGFycmF5RWxlbWVudCA9IG5ldyBBcnJheUUoKTsKLSAgICAgICAgQXJyYXkgYXJyYXkgPSBuZXcgQXJyYXkoKTsKLQotICAgICAgICBEYXRlIHRlc3REYXRlOwotICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IDY7IGkrKykgewotICAgICAgICAgICAgdGVzdERhdGUgPSBuZXcgRGF0ZSgpOwotICAgICAgICAgICAgdGVzdERhdGUuc2V0RGF0ZShuZXcgamF2YS51dGlsLkRhdGUoKSk7Ci0gICAgICAgICAgICBhcnJheS5hZGRPYmplY3QodGVzdERhdGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgYXJyYXkuc2V0QXJyYXlUeXBlUU5hbWUobmV3IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiwiZGF0ZSIpKTsKLSAgICAgICAgYXJyYXlFbGVtZW50LnNldEFycmF5KGFycmF5KTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IGFycmF5RWxlbWVudC5nZXRPTUVsZW1lbnQoQXJyYXlFLk1ZX1FOQU1FLAotICAgICAgICAgICAgICAgICAgICBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NRWxlbWVudCA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcigKLSAgICAgICAgICAgICAgICAgICAgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICBBcnJheUUgcmVzdWx0ID0gQXJyYXlFLkZhY3RvcnkucGFyc2UoeG1sUmVhZGVyKTsKLSAgICAgICAgICAgIExpc3QgcmVzdWx0TGlzdCA9IHJlc3VsdC5nZXRBcnJheSgpLmdldE9iamVjdExpc3QoKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHRMaXN0LnNpemUoKSw1KTsKLSAgICAgICAgfSBjYXRjaCAoQURCRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBcnJheTMoKSB7Ci0KLSAgICAgICAgQXJyYXlFIGFycmF5RWxlbWVudCA9IG5ldyBBcnJheUUoKTsKLSAgICAgICAgQXJyYXkgYXJyYXkgPSBuZXcgQXJyYXkoKTsKLQotICAgICAgICBfaW50IHRlc3RJbnQ7Ci0gICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgNjsgaSsrKSB7Ci0gICAgICAgICAgICB0ZXN0SW50ID0gbmV3IF9pbnQoKTsKLSAgICAgICAgICAgIHRlc3RJbnQuc2V0X2ludChpKTsKLSAgICAgICAgICAgIGFycmF5LmFkZE9iamVjdCh0ZXN0SW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIGFycmF5RWxlbWVudC5zZXRBcnJheShhcnJheSk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSBhcnJheUVsZW1lbnQuZ2V0T01FbGVtZW50KEFycmF5RS5NWV9RTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCkpOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTUVsZW1lbnQgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoCi0gICAgICAgICAgICAgICAgICAgIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvbUVsZW1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgQXJyYXlFIHJlc3VsdCA9IEFycmF5RS5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcik7Ci0gICAgICAgICAgICBMaXN0IHJlc3VsdExpc3QgPSByZXN1bHQuZ2V0QXJyYXkoKS5nZXRPYmplY3RMaXN0KCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IDY7IGkrKykgewotICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCgoX2ludClyZXN1bHRMaXN0LmdldChpLTEpKS5nZXRfaW50KCksaSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEFEQkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBcnJheTQoKSB7Ci0KLSAgICAgICAgQXJyYXlFIGFycmF5RWxlbWVudCA9IG5ldyBBcnJheUUoKTsKLSAgICAgICAgQXJyYXkgYXJyYXkgPSBuZXcgQXJyYXkoKTsKLQotICAgICAgICBEYXRlIHRlc3REYXRlOwotICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IDY7IGkrKykgewotICAgICAgICAgICAgdGVzdERhdGUgPSBuZXcgRGF0ZSgpOwotICAgICAgICAgICAgdGVzdERhdGUuc2V0RGF0ZShuZXcgamF2YS51dGlsLkRhdGUoKSk7Ci0gICAgICAgICAgICBhcnJheS5hZGRPYmplY3QodGVzdERhdGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgYXJyYXlFbGVtZW50LnNldEFycmF5KGFycmF5KTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IGFycmF5RWxlbWVudC5nZXRPTUVsZW1lbnQoQXJyYXlFLk1ZX1FOQU1FLAotICAgICAgICAgICAgICAgICAgICBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NRWxlbWVudCA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcigKLSAgICAgICAgICAgICAgICAgICAgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICBBcnJheUUgcmVzdWx0ID0gQXJyYXlFLkZhY3RvcnkucGFyc2UoeG1sUmVhZGVyKTsKLSAgICAgICAgICAgIExpc3QgcmVzdWx0TGlzdCA9IHJlc3VsdC5nZXRBcnJheSgpLmdldE9iamVjdExpc3QoKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHRMaXN0LnNpemUoKSw1KTsKLSAgICAgICAgfSBjYXRjaCAoQURCRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBcnJheTUoKSB7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgb21FbGVtZW50U3RyaW5nID0gIjxuczE6QXJyYXkgeG1sbnM6bnMxPVwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy9cIiB4bWxuczpzMT1cImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hXCJcbiIgKwotICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICBuczE6YXJyYXlUeXBlPVwiczE6dXItdHlwZVs1XVwiPlxuIiArCi0gICAgICAgICAgICAgICAgICAgICIgICAgPHMxOmludD4xPC9zMTppbnQ+XG4iICsKLSAgICAgICAgICAgICAgICAgICAgIiAgICA8czE6aW50PjI8L3MxOmludD5cbiIgKwotICAgICAgICAgICAgICAgICAgICAiICAgIDxzMTppbnQ+MzwvczE6aW50PlxuIiArCi0gICAgICAgICAgICAgICAgICAgICIgICAgPHMxOmludD40PC9zMTppbnQ+XG4iICsKLSAgICAgICAgICAgICAgICAgICAgIiAgICA8czE6aW50PjU8L3MxOmludD5cbiIgKwotICAgICAgICAgICAgICAgICAgICAiPC9uczE6QXJyYXk+IjsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT01FbGVtZW50ID09PiAiICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKAotICAgICAgICAgICAgICAgICAgICBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIEFycmF5RSByZXN1bHQgPSBBcnJheUUuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpOwotICAgICAgICAgICAgTGlzdCByZXN1bHRMaXN0ID0gcmVzdWx0LmdldEFycmF5KCkuZ2V0T2JqZWN0TGlzdCgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCA2OyBpKyspIHsKLSAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygoKF9pbnQpcmVzdWx0TGlzdC5nZXQoaS0xKSkuZ2V0X2ludCgpLGkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChBREJFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0KLQotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3V0aWxzL0NvbnZlcnRlclV0aWxUZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGIvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3V0aWxzL0NvbnZlcnRlclV0aWxUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzZDQ3YmEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy91dGlscy9Db252ZXJ0ZXJVdGlsVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlsczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5UaW1lWm9uZTsKLQotcHVibGljIGNsYXNzIENvbnZlcnRlclV0aWxUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgLyoqIFRlc3QgY29udmVyc2lvbiBvZiBCaWcgSW50ZWdlciAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RCaWdJbnRlZ2VyKCkgewotICAgICAgICBMaXN0IGwgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGwuYWRkKCIyMzQ0NSIpOwotICAgICAgICBsLmFkZCgiMjM0NDYiKTsKLSAgICAgICAgbC5hZGQoIjIzNDU2NjQ2Iik7Ci0gICAgICAgIGwuYWRkKCIxMTEzNjQ2Iik7Ci0KLSAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iaiA9IENvbnZlcnRlclV0aWwuY29udmVydFRvQXJyYXkoCi0gICAgICAgICAgICAgICAgQmlnSW50ZWdlci5jbGFzcywgbCk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZShjb252ZXJ0ZWRPYmouZ2V0Q2xhc3MoKS5pc0FycmF5KCkpOwotICAgICAgICBhc3NlcnRUcnVlKGNvbnZlcnRlZE9iai5nZXRDbGFzcygpLmVxdWFscyhCaWdJbnRlZ2VyW10uY2xhc3MpKTsKLQotICAgIH0KLQotICAgIC8qKiBpbnRlZ2VyIGFycmF5cyAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RJbnQoKSB7Ci0gICAgICAgIExpc3QgbCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgbC5hZGQoIjIzNDQ1Iik7Ci0gICAgICAgIGwuYWRkKCIyMzQ0NiIpOwotICAgICAgICBsLmFkZCgiMjM0NTY2NDYiKTsKLSAgICAgICAgbC5hZGQoIjExMTM2NDYiKTsKLQotICAgICAgICBPYmplY3QgY29udmVydGVkT2JqID0gQ29udmVydGVyVXRpbC5jb252ZXJ0VG9BcnJheSgKLSAgICAgICAgICAgICAgICBpbnQuY2xhc3MsIGwpOwotCi0gICAgICAgIGFzc2VydFRydWUoY29udmVydGVkT2JqLmdldENsYXNzKCkuaXNBcnJheSgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShjb252ZXJ0ZWRPYmouZ2V0Q2xhc3MoKS5lcXVhbHMoaW50W10uY2xhc3MpKTsKLQotICAgIH0KLQotICAgIC8qKiBib29sZWFuIGFycmF5cyAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RCb29sKCkgewotICAgICAgICBMaXN0IGwgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGwuYWRkKCJ0cnVlIik7Ci0gICAgICAgIGwuYWRkKCJmYWxzZSIpOwotICAgICAgICBsLmFkZCgidHJ1ZSIpOwotICAgICAgICBsLmFkZCgiZmFsc2UiKTsKLQotICAgICAgICBPYmplY3QgY29udmVydGVkT2JqID0gQ29udmVydGVyVXRpbC5jb252ZXJ0VG9BcnJheSgKLSAgICAgICAgICAgICAgICBib29sZWFuLmNsYXNzLCBsKTsKLQotICAgICAgICBhc3NlcnRUcnVlKGNvbnZlcnRlZE9iai5nZXRDbGFzcygpLmlzQXJyYXkoKSk7Ci0gICAgICAgIGFzc2VydFRydWUoY29udmVydGVkT2JqLmdldENsYXNzKCkuZXF1YWxzKGJvb2xlYW5bXS5jbGFzcykpOwotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENvbnZlcnRUb0RhdGVUaW1lKCkgewotCi0gICAgICAgIFNpbXBsZURhdGVGb3JtYXQgc2ltcGxlRGF0ZUZvcm1hdCA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KCJ5eXl5LU1NLWRkJ1QnSEg6bW06c3MuU1NTWiIpOwotICAgICAgICBDYWxlbmRhciBjYWxlbmRhcjsKLQotICAgICAgICBjYWxlbmRhciA9IENvbnZlcnRlclV0aWwuY29udmVydFRvRGF0ZVRpbWUoIjIwMDctMDItMTVUMTQ6NTQ6MjkiKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTdHJpbmcgICA9PT4gIiArICIyMDA3LTAyLTE1VDE0OjU0OjI5Iik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiY2FsZW5kYXIgPT0+ICIgKyBzaW1wbGVEYXRlRm9ybWF0LmZvcm1hdChjYWxlbmRhci5nZXRUaW1lKCkpKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJjYWxlbmRhciA9PT4gIiArIENvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGNhbGVuZGFyKSk7Ci0KLSAgICAgICAgY2FsZW5kYXIgPSBDb252ZXJ0ZXJVdGlsLmNvbnZlcnRUb0RhdGVUaW1lKCIyMDA3LTAyLTE1VDE0OjU0OjI5LjM5OSIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlN0cmluZyAgID09PiAiICsgIjIwMDctMDItMTVUMTQ6NTQ6MjkuMzk5Iik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiY2FsZW5kYXIgPT0+ICIgKyBzaW1wbGVEYXRlRm9ybWF0LmZvcm1hdChjYWxlbmRhci5nZXRUaW1lKCkpKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJjYWxlbmRhciA9PT4gIiArIENvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGNhbGVuZGFyKSk7Ci0KLSAgICAgICAgY2FsZW5kYXIgPSBDb252ZXJ0ZXJVdGlsLmNvbnZlcnRUb0RhdGVUaW1lKCIyMDA3LTAyLTE1VDE0OjU0OjI5KzA1OjMwIik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU3RyaW5nICAgPT0+ICIgKyAiMjAwNy0wMi0xNVQxNDo1NDoyOSswNTozMCIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImNhbGVuZGFyID09PiAiICsgc2ltcGxlRGF0ZUZvcm1hdC5mb3JtYXQoY2FsZW5kYXIuZ2V0VGltZSgpKSk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiY2FsZW5kYXIgPT0+ICIgKyBDb252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhjYWxlbmRhcikpOwotCi0gICAgICAgIGNhbGVuZGFyID0gQ29udmVydGVyVXRpbC5jb252ZXJ0VG9EYXRlVGltZSgiMjAwNy0wMi0xNVQxNDo1NDoyOS4zOTkrMDU6MzAiKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTdHJpbmcgICA9PT4gIiArICIyMDA3LTAyLTE1VDE0OjU0OjI5LjM5OSswNTozMCIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImNhbGVuZGFyID09PiAiICsgc2ltcGxlRGF0ZUZvcm1hdC5mb3JtYXQoY2FsZW5kYXIuZ2V0VGltZSgpKSk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiY2FsZW5kYXIgPT0+ICIgKyBDb252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhjYWxlbmRhcikpOwotCi0gICAgICAgIGNhbGVuZGFyID0gQ29udmVydGVyVXRpbC5jb252ZXJ0VG9EYXRlVGltZSgiMjAwNy0wMi0xNVQxNDo1NDoyOVoiKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTdHJpbmcgICA9PT4gIiArICIyMDA3LTAyLTE1VDE0OjU0OjI5WiIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImNhbGVuZGFyID09PiAiICsgc2ltcGxlRGF0ZUZvcm1hdC5mb3JtYXQoY2FsZW5kYXIuZ2V0VGltZSgpKSk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiY2FsZW5kYXIgPT0+ICIgKyBDb252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhjYWxlbmRhcikpOwotCi0gICAgICAgIGNhbGVuZGFyID0gQ29udmVydGVyVXRpbC5jb252ZXJ0VG9EYXRlVGltZSgiMjAwNy0wMi0xNVQxNDo1NDoyOS4zOTlaIik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU3RyaW5nICAgPT0+ICIgKyAiMjAwNy0wMi0xNVQxNDo1NDoyOS4zOTlaIik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiY2FsZW5kYXIgPT0+ICIgKyBzaW1wbGVEYXRlRm9ybWF0LmZvcm1hdChjYWxlbmRhci5nZXRUaW1lKCkpKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJjYWxlbmRhciA9PT4gIiArIENvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGNhbGVuZGFyKSk7Ci0KLSAgICAgICAgY2FsZW5kYXIgPSBDb252ZXJ0ZXJVdGlsLmNvbnZlcnRUb0RhdGVUaW1lKCIyMDA2LTEyLTExVDIzOjU3OjE2LjYyNVoiKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTdHJpbmcgICA9PT4gIiArICIyMDA2LTEyLTExVDIzOjU3OjE2LjYyNVoiKTsKLSAgICAgICAgc2ltcGxlRGF0ZUZvcm1hdC5zZXRUaW1lWm9uZShUaW1lWm9uZS5nZXRUaW1lWm9uZSgiR01UIikpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImNhbGVuZGFyID09PiAiICsgc2ltcGxlRGF0ZUZvcm1hdC5mb3JtYXQoY2FsZW5kYXIuZ2V0VGltZSgpKSk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiY2FsZW5kYXIgPT0+ICIgKyBDb252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhjYWxlbmRhcikpOwotCi0gICAgICAgIGNhbGVuZGFyID0gQ29udmVydGVyVXRpbC5jb252ZXJ0VG9EYXRlVGltZSgiMjAwNy0wMi0xNVQxNDo1NDoyOS4zOTktMDU6MzAiKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTdHJpbmcgICA9PT4gIiArICIyMDA3LTAyLTE1VDE0OjU0OjI5LjM5OS0wNTozMCIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImNhbGVuZGFyID09PiAiICsgc2ltcGxlRGF0ZUZvcm1hdC5mb3JtYXQoY2FsZW5kYXIuZ2V0VGltZSgpKSk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiY2FsZW5kYXIgPT0+ICIgKyBDb252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhjYWxlbmRhcikpOwotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENvbnZlcnRUb0RhdGVTdHJpbmcoKSB7Ci0gICAgICAgIERhdGUgZGF0ZSA9IG5ldyBEYXRlKCk7Ci0gICAgICAgIFN0cmluZyBkYXRlU3RyaW5nID0gQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcoZGF0ZSk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRGF0ZSA9PT4gIiArIGRhdGVTdHJpbmcpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0VG9EYXRlKCkgewotCi0gICAgICAgIERhdGUgZGF0ZTsKLSAgICAgICAgU2ltcGxlRGF0ZUZvcm1hdCBzaW1wbGVEYXRlRm9ybWF0ID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoInl5eXktTU0tZGRaIik7Ci0gICAgICAgIGRhdGUgPSBDb252ZXJ0ZXJVdGlsLmNvbnZlcnRUb0RhdGUoIjIwMDctMDItMTUiKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTdHJpbmcgICA9PT4gIiArICIyMDA3LTAyLTE1Iik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiY2FsZW5kYXIgPT0+ICIgKyBzaW1wbGVEYXRlRm9ybWF0LmZvcm1hdChkYXRlKSk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiY2FsZW5kYXIgPT0+ICIgKyBDb252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhkYXRlKSk7Ci0KLSAgICAgICAgZGF0ZSA9IENvbnZlcnRlclV0aWwuY29udmVydFRvRGF0ZSgiMjAwNy0wMi0xNVoiKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTdHJpbmcgICA9PT4gIiArICIyMDA3LTAyLTE1WiIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImNhbGVuZGFyID09PiAiICsgc2ltcGxlRGF0ZUZvcm1hdC5mb3JtYXQoZGF0ZSkpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImNhbGVuZGFyID09PiAiICsgQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcoZGF0ZSkpOwotCi0gICAgICAgIGRhdGUgPSBDb252ZXJ0ZXJVdGlsLmNvbnZlcnRUb0RhdGUoIjIwMDctMDItMTUrMDU6MzAiKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTdHJpbmcgICA9PT4gIiArICIyMDA3LTAyLTE1KzA1OjMwIik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiY2FsZW5kYXIgPT0+ICIgKyBzaW1wbGVEYXRlRm9ybWF0LmZvcm1hdChkYXRlKSk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiY2FsZW5kYXIgPT0+ICIgKyBDb252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhkYXRlKSk7Ci0KLSAgICAgICAgZGF0ZSA9IENvbnZlcnRlclV0aWwuY29udmVydFRvRGF0ZSgiMjAwNy0wMi0xNS0xMjozMCIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlN0cmluZyAgID09PiAiICsgIjIwMDctMDItMTUtMTI6MzAiKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJjYWxlbmRhciA9PT4gIiArIHNpbXBsZURhdGVGb3JtYXQuZm9ybWF0KGRhdGUpKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJjYWxlbmRhciA9PT4gIiArIENvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGRhdGUpKTsKLQotICAgICAgICBUaW1lWm9uZSB0aW1lWm9uZSA9IFRpbWVab25lLmdldFRpbWVab25lKCJBdXN0cmFsaWEvUGVydGgiKTsKLSAgICAgICAgQ2FsZW5kYXIgYyA9IENhbGVuZGFyLmdldEluc3RhbmNlKHRpbWVab25lKTsKLSAgICAgICAgYy5jbGVhcigpOwotICAgICAgICBjLnNldCgyMDA4LCBDYWxlbmRhci5KQU5VQVJZLCAxKTsKLSAgICAgICAgVGVzdENhc2UuYXNzZXJ0VHJ1ZShDb252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhjKS5lbmRzV2l0aCgiKzA4OjAwIikpOwotICAgICAgICAKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdXRpbHMvTXVsdGlyZWZIZWxwZXJUZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGIvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3V0aWxzL011bHRpcmVmSGVscGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGEyMjUzLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdXRpbHMvTXVsdGlyZWZIZWxwZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmJ1aWxkZXIuU3RBWE9NQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLnV0aWwuU3RBWFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLQotcHVibGljIGNsYXNzIE11bHRpcmVmSGVscGVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICAgcHVibGljIHZvaWQgdGVzdFByb2Nlc3NIcmVmQXR0cmlidXRlczEoKXsKLSAgICAgICAgU3RyaW5nIGJvZHlFbGVtZW50ID0gIjxzb2FwOmJvZHkgeG1sbnM6c29hcD1cImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvXCI+XG4iICsKLSAgICAgICAgICAgICAgICAiICAgIDxvcGVyYXRpb24+XG4iICsKLSAgICAgICAgICAgICAgICAiICAgICAgICA8YXJnMSBocmVmPVwiI29iajFcIi8+XG4iICsKLSAgICAgICAgICAgICAgICAiICAgIDwvb3BlcmF0aW9uPlxuIiArCi0gICAgICAgICAgICAgICAgIiAgICA8bXVsdGlyZWYgaWQ9XCJvYmoxXCI+XG4iICsKLSAgICAgICAgICAgICAgICAiICAgICAgICA8bmFtZT50aGUgcmVhbCBhcmd1bWVudDwvbmFtZT5cbiIgKwotICAgICAgICAgICAgICAgICIgICAgICAgIDxjb2xvcj5ibHVlPC9jb2xvcj5cbiIgKwotICAgICAgICAgICAgICAgICIgICAgPC9tdWx0aXJlZj5cbiIgKwotICAgICAgICAgICAgICAgICI8L3NvYXA6Ym9keT4iOwotICAgICAgICB0ZXN0UHJvY2Vzc0hyZWZBdHRyaWJ1dGVzKGJvZHlFbGVtZW50KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvY2Vzc0hyZWZBdHRyaWJ1dGUyKCl7Ci0gICAgICAgIFN0cmluZyBib2R5RWxlbWVudCA9ICI8c29hcGVudjpCb2R5IHhtbG5zOnNvYXBlbnY9XCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlL1wiPlxuIiArCi0gICAgICAgICAgICAgICAgIiAgICA8bnMxOm9wZXJhdGlvbiB4bWxuczpuczE9XCJodHRwOnRlbXAxLm9yZ1wiPlxuIiArCi0gICAgICAgICAgICAgICAgIiAgICAgICAgPG5zMTphcmcxIGhyZWY9XCIjb2JqMVwiLz5cbiIgKwotICAgICAgICAgICAgICAgICIgICAgPC9uczE6b3BlcmF0aW9uPlxuIiArCi0gICAgICAgICAgICAgICAgIiAgICA8bnMyOm11bHRpcmVmIGlkPVwib2JqMVwiICB4bWxuczpuczI9XCJodHRwOnRlbXAxLm9yZ1wiPlxuIiArCi0gICAgICAgICAgICAgICAgIiAgICAgICAgPG5zMjpuYW1lPnRoZSByZWFsIGFyZ3VtZW50PC9uczI6bmFtZT5cbiIgKwotICAgICAgICAgICAgICAgICIgICAgICAgIDxuczI6Y29sb3I+Ymx1ZTwvbnMyOmNvbG9yPlxuIiArCi0gICAgICAgICAgICAgICAgIiAgICA8L25zMjptdWx0aXJlZj5cbiIgKwotICAgICAgICAgICAgICAgICI8L3NvYXBlbnY6Qm9keT4iOwotICAgICAgICB0ZXN0UHJvY2Vzc0hyZWZBdHRyaWJ1dGVzKGJvZHlFbGVtZW50KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvY2Vzc0hyZWZBdHRyaWJ1dGUzKCl7Ci0gICAgICAgIFN0cmluZyBib2R5RWxlbWVudCA9ICI8c29hcGVudjpCb2R5IHhtbG5zOnNvYXBlbnY9XCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlL1wiPlxuIiArCi0gICAgICAgICAgICAgICAgIiAgICAgICAgPG5zMTpvcGVyYXRpb24geG1sbnM6bnMxPVwiaHR0cDp0ZW1wMS5vcmdcIj5cbiIgKwotICAgICAgICAgICAgICAgICIgICAgICAgICAgICA8bnMxOmFyZzEgaHJlZj1cIiNvYmoxXCIvPlxuIiArCi0gICAgICAgICAgICAgICAgIiAgICAgICAgICAgIDxuczE6b3BlcmF0aW9uMj5cbiIgKwotICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgPG5zMTphcmcxIGhyZWY9XCIjb2JqMVwiLz5cbiIgKwotICAgICAgICAgICAgICAgICIgICAgICAgICAgICA8L25zMTpvcGVyYXRpb24yPlxuIiArCi0gICAgICAgICAgICAgICAgIiAgICAgICAgPC9uczE6b3BlcmF0aW9uPlxuIiArCi0gICAgICAgICAgICAgICAgIiAgICAgICAgPG5zMjptdWx0aXJlZiB4bWxuczpuczI9XCJodHRwOnRlbXAxLm9yZ1wiIGlkPVwib2JqMVwiPlxuIiArCi0gICAgICAgICAgICAgICAgIiAgICAgICAgICAgIDxuczI6bmFtZT50aGUgcmVhbCBhcmd1bWVudDwvbnMyOm5hbWU+XG4iICsKLSAgICAgICAgICAgICAgICAiICAgICAgICAgICAgPG5zMjpjb2xvcj5ibHVlPC9uczI6Y29sb3I+XG4iICsKLSAgICAgICAgICAgICAgICAiICAgICAgICA8L25zMjptdWx0aXJlZj5cbiIgKwotICAgICAgICAgICAgICAgICIgICAgPC9zb2FwZW52OkJvZHk+IjsKLSAgICAgICAgdGVzdFByb2Nlc3NIcmVmQXR0cmlidXRlcyhib2R5RWxlbWVudCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFByb2Nlc3NIcmVmQXR0cmlidXRlNCgpewotICAgICAgICBTdHJpbmcgYm9keUVsZW1lbnQgPSAiPHNvYXBlbnY6Qm9keSB4bWxuczpzb2FwZW52PVwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS9cIj5cbiIgKwotICAgICAgICAgICAgICAgICIgICAgPG5zMTpvcGVyYXRpb24geG1sbnM6bnMxPVwiaHR0cDp0ZW1wMS5vcmdcIj5cbiIgKwotICAgICAgICAgICAgICAgICIgICAgICAgIDxuczE6YXJnMSBocmVmPVwiI29iajFcIi8+XG4iICsKLSAgICAgICAgICAgICAgICAiICAgICAgICA8bnMxOm9wZXJhdGlvbjI+XG4iICsKLSAgICAgICAgICAgICAgICAiICAgICAgICAgICAgPG5zMTphcmcxIGhyZWY9XCIjb2JqMVwiLz5cbiIgKwotICAgICAgICAgICAgICAgICIgICAgICAgICAgICA8bnMxOnRlc3QgaHJlZj1cIiNvYmoyXCIvPlxuIiArCi0gICAgICAgICAgICAgICAgIiAgICAgICAgPC9uczE6b3BlcmF0aW9uMj5cbiIgKwotICAgICAgICAgICAgICAgICIgICAgPC9uczE6b3BlcmF0aW9uPlxuIiArCi0gICAgICAgICAgICAgICAgIiAgICA8bnMyOm11bHRpcmVmIHhtbG5zOm5zMj1cImh0dHA6dGVtcDEub3JnXCIgaWQ9XCJvYmoxXCI+XG4iICsKLSAgICAgICAgICAgICAgICAiICAgICAgICA8bnMyOm5hbWU+dGhlIHJlYWwgYXJndW1lbnQ8L25zMjpuYW1lPlxuIiArCi0gICAgICAgICAgICAgICAgIiAgICAgICAgPG5zMjpjb2xvcj5ibHVlPC9uczI6Y29sb3I+XG4iICsKLSAgICAgICAgICAgICAgICAiICAgICAgICA8bnMyOnBlcnNvbiBocmVmPVwiI29iajJcIi8+XG4iICsKLSAgICAgICAgICAgICAgICAiICAgIDwvbnMyOm11bHRpcmVmPlxuIiArCi0gICAgICAgICAgICAgICAgIiAgICA8bXVsdGlyZWYgaWQ9XCJvYmoyXCI+XG4iICsKLSAgICAgICAgICAgICAgICAiICAgICAgICA8YWdlPjIzPC9hZ2U+XG4iICsKLSAgICAgICAgICAgICAgICAiICAgICAgICA8bmFtZT5hbWlsYTwvbmFtZT5cbiIgKwotICAgICAgICAgICAgICAgICIgICAgPC9tdWx0aXJlZj5cbiIgKwotICAgICAgICAgICAgICAgICI8L3NvYXBlbnY6Qm9keT4iOwotICAgICAgICB0ZXN0UHJvY2Vzc0hyZWZBdHRyaWJ1dGVzKGJvZHlFbGVtZW50KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGVzdFByb2Nlc3NIcmVmQXR0cmlidXRlcyhTdHJpbmcgYm9keUVsZW1lbnQpewotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0KLSAgICAgICAgICAgICAgICAgICAgU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYm9keUVsZW1lbnQuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgU3RBWE9NQnVpbGRlciBzdEFYT01CdWlsZGVyID0gbmV3IFN0QVhPTUJ1aWxkZXIoeG1sUmVhZGVyKTsKLSAgICAgICAgICAgIE9NRWxlbWVudCBnZW5lcmF0ZWRFbGVtZW50ID0gc3RBWE9NQnVpbGRlci5nZXREb2N1bWVudEVsZW1lbnQoKTsKLSAgICAgICAgICAgIFNPQVBGYWN0b3J5IHNvYXBGYWN0b3J5ID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDExRmFjdG9yeSgpOwotICAgICAgICAgICAgU09BUEVudmVsb3BlIHNvYXBFbnZlbG9wZSA9ICBzb2FwRmFjdG9yeS5nZXREZWZhdWx0RW52ZWxvcGUoKTsKLSAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSBudWxsOwotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gZ2VuZXJhdGVkRWxlbWVudC5nZXRDaGlsZEVsZW1lbnRzKCk7aXRlci5oYXNOZXh0KCk7KXsKLSAgICAgICAgICAgICAgICBvbUVsZW1lbnQgPSAoT01FbGVtZW50KSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBzb2FwRW52ZWxvcGUuZ2V0Qm9keSgpLmFkZENoaWxkKG9tRWxlbWVudCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0cmluZyBvbUVsZW1lbnRTdHJpbmc7Ci0gICAgICAgICAgICBvbUVsZW1lbnRTdHJpbmcgPSBzb2FwRW52ZWxvcGUudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT00gRWxlbWVudCBiZWZvcmUgcHJvY2Vzc2luZyA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBNdWx0aXJlZkhlbHBlci5wcm9jZXNzSHJlZkF0dHJpYnV0ZXMoc29hcEVudmVsb3BlKTsKLSAgICAgICAgICAgIG9tRWxlbWVudFN0cmluZyA9IHNvYXBFbnZlbG9wZS50b1N0cmluZygpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTSBFbGVtZW50IGFmdGVyIHByb2Nlc3NpbmcgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotCi0KLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGF4aXNGYXVsdCkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3V0aWxzL05hbWVkU3RheE9NQnVpbGRlclRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdXRpbHMvTmFtZWRTdGF4T01CdWlsZGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMmM3ZTVlLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdXRpbHMvTmFtZWRTdGF4T01CdWlsZGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5TdEFYVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLlN0cmVhbVdyYXBwZXI7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOwotCi1wdWJsaWMgY2xhc3MgTmFtZWRTdGF4T01CdWlsZGVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3ROYW1lZE9NQnVpbGRlcigpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIFN0cmluZyB4bWxEb2MgPSAiPHdyYXBwZXI+PG15SW50VmFsPjIwMDwvbXlJbnRWYWw+PC93cmFwcGVyPiI7Ci0gICAgICAgIFhNTFN0cmVhbVJlYWRlciByZWFkZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKAotICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdSZWFkZXIoeG1sRG9jKSk7Ci0KLSAgICAgICAgTmFtZWRTdGF4T01CdWlsZGVyIHNtID0gbmV3IE5hbWVkU3RheE9NQnVpbGRlcihyZWFkZXIsIG5ldyBRTmFtZSgid3JhcHBlciIpKTsKLSAgICAgICAgT01FbGVtZW50IGVsdCA9IHNtLmdldE9NRWxlbWVudCgpOwotCi0gICAgICAgIGFzc2VydE5vdE51bGwoZWx0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGVsdC5nZXRMb2NhbE5hbWUoKSwgIndyYXBwZXIiKTsKLQotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE5hbWVkT01CdWlsZGVyMSgpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIFN0cmluZyB4bWxEb2MgPSAiPHdyYXBwZXI+PG15SW50VmFsPjIwMDwvbXlJbnRWYWw+PC93cmFwcGVyPiI7Ci0gICAgICAgIFhNTFN0cmVhbVJlYWRlciByZWFkZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKAotICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdSZWFkZXIoeG1sRG9jKSk7Ci0KLSAgICAgICAgLy9tb3ZlIHVwdG8gdGhlICBteUludFZhbCBzdGFydCBlbGVtZW50IGZpcnN0Ci0gICAgICAgIGJvb2xlYW4gZG9uZSA9IGZhbHNlOwotICAgICAgICBRTmFtZSBuYW1lVG9NYXRjaCA9IG5ldyBRTmFtZSgibXlJbnRWYWwiKTsKLSAgICAgICAgd2hpbGUgKCFkb25lKSB7Ci0gICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgJiYgbmFtZVRvTWF0Y2guZXF1YWxzKHJlYWRlci5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgZG9uZSA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvL3dlIG5lZWQgdGhlIHdyYXBwZXIgaGVyZSAtIGl0IGlzIHRoZSBuYXR1cmUgb2YgdGhlIGJ1aWxkZXJzIHRoYXQKLSAgICAgICAgLy90aGV5IGV4cGVjdCB0aGUgKm5leHQqIGV2ZW50IHRvIGJlIHRoZSBzdGFydCBlbGVtZW50IChub3QgdGhlCi0gICAgICAgIC8vY3VycmVudCBvbmUpIFNvIHdlIG5lZWQgdGhlIHdyYXBwZXIgdG8gc2ltdWxhdGUgYSBmdWxsIGZsZWRnZWQKLSAgICAgICAgLy8KLSAgICAgICAgTmFtZWRTdGF4T01CdWlsZGVyIHNtID0gbmV3IE5hbWVkU3RheE9NQnVpbGRlcigKLSAgICAgICAgICAgICAgICBuZXcgU3RyZWFtV3JhcHBlcihyZWFkZXIpLCBuYW1lVG9NYXRjaCk7Ci0gICAgICAgIE9NRWxlbWVudCBlbHQgPSBzbS5nZXRPTUVsZW1lbnQoKTsKLQotICAgICAgICBhc3NlcnROb3ROdWxsKGVsdCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhlbHQuZ2V0TG9jYWxOYW1lKCksICJteUludFZhbCIpOwotCi0KLSAgICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy91dGlscy9QcmludEV2ZW50cy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy91dGlscy9QcmludEV2ZW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkY2FkNjQzLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdXRpbHMvUHJpbnRFdmVudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHM7Ci0KLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUNvbnN0YW50czsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKLQotcHVibGljIGNsYXNzIFByaW50RXZlbnRzIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwcmludChYTUxTdHJlYW1SZWFkZXIgeG1scikgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIHdoaWxlICh4bWxyLmhhc05leHQoKSkgewotICAgICAgICAgICAgcHJpbnRFdmVudCh4bWxyKTsKLSAgICAgICAgICAgIHhtbHIubmV4dCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcmludEV2ZW50KFhNTFN0cmVhbVJlYWRlciB4bWxyKSB7Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludCgiRVZFTlQ6WyIgKyBnZXRFdmVudFN0cmluZyh4bWxyLmdldEV2ZW50VHlwZSgpKSArICJdICIpOwotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiBbIik7Ci0KLSAgICAgICAgc3dpdGNoICh4bWxyLmdldEV2ZW50VHlwZSgpKSB7Ci0KLSAgICAgICAgICAgIGNhc2UgWE1MU3RyZWFtQ29uc3RhbnRzLlNUQVJUX0VMRU1FTlQ6Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiPCIpOwotICAgICAgICAgICAgICAgIHByaW50TmFtZSh4bWxyKTsKLSAgICAgICAgICAgICAgICBwcmludE5hbWVzcGFjZXMoeG1scik7Ci0gICAgICAgICAgICAgICAgcHJpbnRBdHRyaWJ1dGVzKHhtbHIpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIj4iKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBYTUxTdHJlYW1Db25zdGFudHMuRU5EX0VMRU1FTlQ6Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiPC8iKTsKLSAgICAgICAgICAgICAgICBwcmludE5hbWUoeG1scik7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiPiIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFhNTFN0cmVhbUNvbnN0YW50cy5TUEFDRToKLQotICAgICAgICAgICAgY2FzZSBYTUxTdHJlYW1Db25zdGFudHMuQ0hBUkFDVEVSUzoKLSAgICAgICAgICAgICAgICBpbnQgc3RhcnQgPSB4bWxyLmdldFRleHRTdGFydCgpOwotICAgICAgICAgICAgICAgIGludCBsZW5ndGggPSB4bWxyLmdldFRleHRMZW5ndGgoKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KG5ldyBTdHJpbmcoeG1sci5nZXRUZXh0Q2hhcmFjdGVycygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgWE1MU3RyZWFtQ29uc3RhbnRzLlBST0NFU1NJTkdfSU5TVFJVQ1RJT046Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiPD8iKTsKLSAgICAgICAgICAgICAgICBpZiAoeG1sci5oYXNUZXh0KCkpCi0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoeG1sci5nZXRUZXh0KCkpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIj8+Iik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgWE1MU3RyZWFtQ29uc3RhbnRzLkNEQVRBOgotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIjwhW0NEQVRBWyIpOwotICAgICAgICAgICAgICAgIHN0YXJ0ID0geG1sci5nZXRUZXh0U3RhcnQoKTsKLSAgICAgICAgICAgICAgICBsZW5ndGggPSB4bWxyLmdldFRleHRMZW5ndGgoKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KG5ldyBTdHJpbmcoeG1sci5nZXRUZXh0Q2hhcmFjdGVycygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoKSk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiXV0+Iik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgWE1MU3RyZWFtQ29uc3RhbnRzLkNPTU1FTlQ6Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiPCEtLSIpOwotICAgICAgICAgICAgICAgIGlmICh4bWxyLmhhc1RleHQoKSkKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCh4bWxyLmdldFRleHQoKSk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiLS0+Iik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgWE1MU3RyZWFtQ29uc3RhbnRzLkVOVElUWV9SRUZFUkVOQ0U6Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCh4bWxyLmdldExvY2FsTmFtZSgpICsgIj0iKTsKLSAgICAgICAgICAgICAgICBpZiAoeG1sci5oYXNUZXh0KCkpCi0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIlsiICsgeG1sci5nZXRUZXh0KCkgKyAiXSIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFhNTFN0cmVhbUNvbnN0YW50cy5TVEFSVF9ET0NVTUVOVDoKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCI8P3htbCIpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiB2ZXJzaW9uPSciICsgeG1sci5nZXRWZXJzaW9uKCkgKyAiJyIpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiBlbmNvZGluZz0nIiArIHhtbHIuZ2V0Q2hhcmFjdGVyRW5jb2RpbmdTY2hlbWUoKSArICInIik7Ci0gICAgICAgICAgICAgICAgaWYgKHhtbHIuaXNTdGFuZGFsb25lKCkpCi0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiBzdGFuZGFsb25lPSd5ZXMnIik7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgc3RhbmRhbG9uZT0nbm8nIik7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiPz4iKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICB9Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXSIpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcHJpbnROYW1lKFhNTFN0cmVhbVJlYWRlciB4bWxyKSB7Ci0gICAgICAgIGlmICh4bWxyLmhhc05hbWUoKSkgewotICAgICAgICAgICAgU3RyaW5nIHByZWZpeCA9IHhtbHIuZ2V0UHJlZml4KCk7Ci0gICAgICAgICAgICBTdHJpbmcgdXJpID0geG1sci5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgIFN0cmluZyBsb2NhbE5hbWUgPSB4bWxyLmdldExvY2FsTmFtZSgpOwotICAgICAgICAgICAgcHJpbnROYW1lKHByZWZpeCwgdXJpLCBsb2NhbE5hbWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcmludE5hbWUoU3RyaW5nIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdXJpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsb2NhbE5hbWUpIHsKLSAgICAgICAgaWYgKHVyaSAhPSBudWxsICYmICEoIiIuZXF1YWxzKHVyaSkpKSBTeXN0ZW0ub3V0LnByaW50KCJbJyIgKyB1cmkgKyAiJ106Iik7Ci0gICAgICAgIGlmIChwcmVmaXggIT0gbnVsbCkgU3lzdGVtLm91dC5wcmludChwcmVmaXggKyAiOiIpOwotICAgICAgICBpZiAobG9jYWxOYW1lICE9IG51bGwpIFN5c3RlbS5vdXQucHJpbnQobG9jYWxOYW1lKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHByaW50QXR0cmlidXRlcyhYTUxTdHJlYW1SZWFkZXIgeG1scikgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHhtbHIuZ2V0QXR0cmlidXRlQ291bnQoKTsgaSsrKSB7Ci0gICAgICAgICAgICBwcmludEF0dHJpYnV0ZSh4bWxyLCBpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcHJpbnRBdHRyaWJ1dGUoWE1MU3RyZWFtUmVhZGVyIHhtbHIsIGludCBpbmRleCkgewotICAgICAgICBTdHJpbmcgcHJlZml4ID0geG1sci5nZXRBdHRyaWJ1dGVQcmVmaXgoaW5kZXgpOwotICAgICAgICBTdHJpbmcgbmFtZXNwYWNlID0geG1sci5nZXRBdHRyaWJ1dGVOYW1lc3BhY2UoaW5kZXgpOwotICAgICAgICBTdHJpbmcgbG9jYWxOYW1lID0geG1sci5nZXRBdHRyaWJ1dGVMb2NhbE5hbWUoaW5kZXgpOwotICAgICAgICBTdHJpbmcgdmFsdWUgPSB4bWxyLmdldEF0dHJpYnV0ZVZhbHVlKGluZGV4KTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludCgiICIpOwotICAgICAgICBwcmludE5hbWUocHJlZml4LCBuYW1lc3BhY2UsIGxvY2FsTmFtZSk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIj0nIiArIHZhbHVlICsgIiciKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHByaW50TmFtZXNwYWNlcyhYTUxTdHJlYW1SZWFkZXIgeG1scikgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHhtbHIuZ2V0TmFtZXNwYWNlQ291bnQoKTsgaSsrKSB7Ci0gICAgICAgICAgICBwcmludE5hbWVzcGFjZSh4bWxyLCBpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcHJpbnROYW1lc3BhY2UoWE1MU3RyZWFtUmVhZGVyIHhtbHIsIGludCBpbmRleCkgewotICAgICAgICBTdHJpbmcgcHJlZml4ID0geG1sci5nZXROYW1lc3BhY2VQcmVmaXgoaW5kZXgpOwotICAgICAgICBTdHJpbmcgdXJpID0geG1sci5nZXROYW1lc3BhY2VVUkkoaW5kZXgpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgIik7Ci0gICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInhtbG5zPSciICsgdXJpICsgIiciKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgieG1sbnM6IiArIHByZWZpeCArICI9JyIgKyB1cmkgKyAiJyIpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRFdmVudFN0cmluZyhpbnQgZXZlbnRDb2RlKSB7Ci0gICAgICAgIFN0cmluZyBldmVudCA9ICIiOwotCi0gICAgICAgIHN3aXRjaCAoZXZlbnRDb2RlKSB7Ci0gICAgICAgICAgICBjYXNlIDEgOgotICAgICAgICAgICAgICAgIGV2ZW50ID0gIlNUQVJUX0VMRU1FTlQiOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAyIDoKLSAgICAgICAgICAgICAgICBldmVudCA9ICJFTkRfRUxFTUVOVCI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDMgOgotICAgICAgICAgICAgICAgIGV2ZW50ID0gIlBST0NFU1NJTkdfSU5TVFJVQ1RJT04iOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSA0IDoKLSAgICAgICAgICAgICAgICBldmVudCA9ICJDSEFSQUNURVJTIjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgNSA6Ci0gICAgICAgICAgICAgICAgZXZlbnQgPSAiQ09NTUVOVCI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDYgOgotICAgICAgICAgICAgICAgIGV2ZW50ID0gIlNQQUNFIjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgNyA6Ci0gICAgICAgICAgICAgICAgZXZlbnQgPSAiU1RBUlRfRE9DVU1FTlQiOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSA4IDoKLSAgICAgICAgICAgICAgICBldmVudCA9ICJFTkRfRE9DVU1FTlQiOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSA5IDoKLSAgICAgICAgICAgICAgICBldmVudCA9ICJFTlRJVFlfUkVGRVJFTkNFIjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMTAgOgotICAgICAgICAgICAgICAgIGV2ZW50ID0gIkFUVFJJQlVURSI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDExIDoKLSAgICAgICAgICAgICAgICBldmVudCA9ICJEVEQiOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxMiA6Ci0gICAgICAgICAgICAgICAgZXZlbnQgPSAiQ0RBVEEiOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxMyA6Ci0gICAgICAgICAgICAgICAgZXZlbnQgPSAiTkFNRVNQQUNFIjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMTQgOgotICAgICAgICAgICAgICAgIGV2ZW50ID0gIk5PVEFUSU9OX0RFQ0xBUkFUSU9OIjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMTUgOgotICAgICAgICAgICAgICAgIGV2ZW50ID0gIkVOVElUWV9ERUNMQVJBVElPTiI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGV2ZW50OwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy91dGlscy9TaW1wbGVBcnJheVJlYWRlclN0YXRlTWFjaGluZVRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdXRpbHMvU2ltcGxlQXJyYXlSZWFkZXJTdGF0ZU1hY2hpbmVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjY2Y0MjEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy91dGlscy9TaW1wbGVBcnJheVJlYWRlclN0YXRlTWFjaGluZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS51dGlsLlN0QVhVdGlsczsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Db25zdGFudHM7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7Ci0KLXB1YmxpYyBjbGFzcyBTaW1wbGVBcnJheVJlYWRlclN0YXRlTWFjaGluZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhdGVNYWNoaW5lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyB4bWxEb2MgPQotICAgICAgICAgICAgICAgICI8d3JhcHBlcj48bXlJbnRWYWw+MjAwPC9teUludFZhbD48bXlJbnRWYWw+MjAwPC9teUludFZhbD48bXlJbnRWYWw+MjAwPC9teUludFZhbD4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICI8bXlJbnRWYWw+MjAwPC9teUludFZhbD48bXlJbnRWYWw+MjAwPC9teUludFZhbD48bXlJbnRWYWw+MjAwPC9teUludFZhbD48L3dyYXBwZXI+IjsKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHJlYWRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoCi0gICAgICAgICAgICAgICAgbmV3IFN0cmluZ1JlYWRlcih4bWxEb2MpKTsKLSAgICAgICAgU2ltcGxlQXJyYXlSZWFkZXJTdGF0ZU1hY2hpbmUgc20gPSBuZXcgU2ltcGxlQXJyYXlSZWFkZXJTdGF0ZU1hY2hpbmUoKTsKLSAgICAgICAgc20uc2V0RWxlbWVudE5hbWVUb1Rlc3QobmV3IFFOYW1lKCJteUludFZhbCIpKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNtLnJlYWQocmVhZGVyKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7ICAvL1RvIGNoYW5nZSBib2R5IG9mIGNhdGNoIHN0YXRlbWVudCB1c2UgRmlsZSB8IFNldHRpbmdzIHwgRmlsZSBUZW1wbGF0ZXMuCi0gICAgICAgIH0KLQotICAgICAgICBhc3NlcnRFcXVhbHMoNiwgc20uZ2V0VGV4dEFycmF5KCkubGVuZ3RoKTsKLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTdGF0ZU1hY2hpbmUzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyB4bWxEb2MgPQotICAgICAgICAgICAgICAgICI8d3JhcHBlcj48bXlJbnRWYWw+MjAwPC9teUludFZhbD48bXlJbnRWYWw+MjAwPC9teUludFZhbD48bXlJbnRWYWw+MjAwPC9teUludFZhbD4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICI8bXlJbnRWYWw+MjAwPC9teUludFZhbD48bXlJbnRWYWw+MjAwPC9teUludFZhbD48bXlJbnRWYWw+MjAwPC9teUludFZhbD48L3dyYXBwZXI+IjsKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHJlYWRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoCi0gICAgICAgICAgICAgICAgbmV3IFN0cmluZ1JlYWRlcih4bWxEb2MpKTsKLQotICAgICAgICB3aGlsZSAocmVhZGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgaW50IGV2ZW50ID0gcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgIGlmIChldmVudCA9PSBYTUxTdHJlYW1Db25zdGFudHMuU1RBUlRfRUxFTUVOVCAmJgotICAgICAgICAgICAgICAgICAgICAibXlJbnRWYWwiLmVxdWFscyhyZWFkZXIuZ2V0TG9jYWxOYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0gICAgICAgIFNpbXBsZUFycmF5UmVhZGVyU3RhdGVNYWNoaW5lIHNtID0gbmV3IFNpbXBsZUFycmF5UmVhZGVyU3RhdGVNYWNoaW5lKCk7Ci0gICAgICAgIHNtLnNldEVsZW1lbnROYW1lVG9UZXN0KG5ldyBRTmFtZSgibXlJbnRWYWwiKSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzbS5yZWFkKHJlYWRlcik7Ci0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOyAgLy9UbyBjaGFuZ2UgYm9keSBvZiBjYXRjaCBzdGF0ZW1lbnQgdXNlIEZpbGUgfCBTZXR0aW5ncyB8IEZpbGUgVGVtcGxhdGVzLgotICAgICAgICB9Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKDYsIHNtLmdldFRleHRBcnJheSgpLmxlbmd0aCk7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhdGVNYWNoaW5lMigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgeG1sRG9jID0gIjx3cmFwcGVyPjxteUludFZhbD4yMDA8L215SW50VmFsPjwvd3JhcHBlcj4iOwotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcigKLSAgICAgICAgICAgICAgICBuZXcgU3RyaW5nUmVhZGVyKHhtbERvYykpOwotICAgICAgICBTaW1wbGVBcnJheVJlYWRlclN0YXRlTWFjaGluZSBzbSA9IG5ldyBTaW1wbGVBcnJheVJlYWRlclN0YXRlTWFjaGluZSgpOwotICAgICAgICBzbS5zZXRFbGVtZW50TmFtZVRvVGVzdChuZXcgUU5hbWUoIm15SW50VmFsIikpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgc20ucmVhZChyZWFkZXIpOwotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsgIC8vVG8gY2hhbmdlIGJvZHkgb2YgY2F0Y2ggc3RhdGVtZW50IHVzZSBGaWxlIHwgU2V0dGluZ3MgfCBGaWxlIFRlbXBsYXRlcy4KLSAgICAgICAgfQotCi0gICAgICAgIGFzc2VydEVxdWFscygiMjAwIiwgc20uZ2V0VGV4dEFycmF5KClbMF0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTdGF0ZU1hY2hpbmVFbXB0eUFycmF5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyB4bWxEb2MgPSAiPHdyYXBwZXI+PC93cmFwcGVyPiI7Ci0gICAgICAgIFhNTFN0cmVhbVJlYWRlciByZWFkZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKAotICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdSZWFkZXIoeG1sRG9jKSk7Ci0gICAgICAgIFNpbXBsZUFycmF5UmVhZGVyU3RhdGVNYWNoaW5lIHNtID0gbmV3IFNpbXBsZUFycmF5UmVhZGVyU3RhdGVNYWNoaW5lKCk7Ci0gICAgICAgIHNtLnNldEVsZW1lbnROYW1lVG9UZXN0KG5ldyBRTmFtZSgibXlJbnRWYWwiKSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzbS5yZWFkKHJlYWRlcik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0KLSAgICAgICAgfQotCi0gICAgICAgIGFzc2VydEVxdWFscygwLCBzbS5nZXRUZXh0QXJyYXkoKS5sZW5ndGgpOwotCi0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdXRpbHMvU2ltcGxlRWxlbWVudFJlYWRlclN0YXRlTWFjaGluZVRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkYi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdXRpbHMvU2ltcGxlRWxlbWVudFJlYWRlclN0YXRlTWFjaGluZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFkMGE5NC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3V0aWxzL1NpbXBsZUVsZW1lbnRSZWFkZXJTdGF0ZU1hY2hpbmVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS51dGlsLlN0QVhVdGlsczsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7Ci0KLXB1YmxpYyBjbGFzcyBTaW1wbGVFbGVtZW50UmVhZGVyU3RhdGVNYWNoaW5lVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTdGF0ZU1hY2hpbmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHhtbERvYyA9ICI8bXlJbnRWYWw+MjAwPC9teUludFZhbD4iOwotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcigKLSAgICAgICAgICAgICAgICBuZXcgU3RyaW5nUmVhZGVyKHhtbERvYykpOwotICAgICAgICBTaW1wbGVFbGVtZW50UmVhZGVyU3RhdGVNYWNoaW5lIHNtID0gbmV3IFNpbXBsZUVsZW1lbnRSZWFkZXJTdGF0ZU1hY2hpbmUoKTsKLSAgICAgICAgc20uc2V0RWxlbWVudE5hbWVUb1Rlc3QobmV3IFFOYW1lKCJteUludFZhbCIpKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNtLnJlYWQocmVhZGVyKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7ICAvL1RvIGNoYW5nZSBib2R5IG9mIGNhdGNoIHN0YXRlbWVudCB1c2UgRmlsZSB8IFNldHRpbmdzIHwgRmlsZSBUZW1wbGF0ZXMuCi0gICAgICAgIH0KLQotICAgICAgICBhc3NlcnRFcXVhbHMoIjIwMCIsIHNtLmdldFRleHQoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFN0YXRlTWFjaGluZTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHhtbERvYyA9ICI8d3JhcHBlcj48bXlJbnRWYWw+MjAwPC9teUludFZhbD48L3dyYXBwZXI+IjsKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHJlYWRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoCi0gICAgICAgICAgICAgICAgbmV3IFN0cmluZ1JlYWRlcih4bWxEb2MpKTsKLSAgICAgICAgU2ltcGxlRWxlbWVudFJlYWRlclN0YXRlTWFjaGluZSBzbSA9IG5ldyBTaW1wbGVFbGVtZW50UmVhZGVyU3RhdGVNYWNoaW5lKCk7Ci0gICAgICAgIHNtLnNldEVsZW1lbnROYW1lVG9UZXN0KG5ldyBRTmFtZSgibXlJbnRWYWwiKSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzbS5yZWFkKHJlYWRlcik7Ci0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOyAgLy9UbyBjaGFuZ2UgYm9keSBvZiBjYXRjaCBzdGF0ZW1lbnQgdXNlIEZpbGUgfCBTZXR0aW5ncyB8IEZpbGUgVGVtcGxhdGVzLgotICAgICAgICB9Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIyMDAiLCBzbS5nZXRUZXh0KCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTdGF0ZU1hY2hpbmUzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyB4bWxEb2MgPSAiPG15SW50VmFsPjIwMDxhLz48L215SW50VmFsPiI7Ci0gICAgICAgIFhNTFN0cmVhbVJlYWRlciByZWFkZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKAotICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdSZWFkZXIoeG1sRG9jKSk7Ci0gICAgICAgIFNpbXBsZUVsZW1lbnRSZWFkZXJTdGF0ZU1hY2hpbmUgc20gPSBuZXcgU2ltcGxlRWxlbWVudFJlYWRlclN0YXRlTWFjaGluZSgpOwotICAgICAgICBzbS5zZXRFbGVtZW50TmFtZVRvVGVzdChuZXcgUU5hbWUoIm15SW50VmFsIikpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgc20ucmVhZChyZWFkZXIpOwotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCi0gICAgICAgIH0KLQotCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3V0aWxzL3JlYWRlci9BREJYTUxTdHJlYW1SZWFkZXJUZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGIvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3V0aWxzL3JlYWRlci9BREJYTUxTdHJlYW1SZWFkZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhNWU3YjYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy91dGlscy9yZWFkZXIvQURCWE1MU3RyZWFtUmVhZGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODc5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLmF0dGFjaG1lbnRzLkJ5dGVBcnJheURhdGFTb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQXR0cmlidXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01OYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLnNlcmlhbGl6ZS5TdHJlYW1pbmdPTVNlcmlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS51dGlsLkJhc2U2NDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLnV0aWwuU3RBWFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCQmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLlN0cmVhbVdyYXBwZXI7Ci1pbXBvcnQgb3JnLmN1c3RvbW1vbmtleS54bWx1bml0LlhNTFRlc3RDYXNlOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXI7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1wdWJsaWMgY2xhc3MgQURCWE1MU3RyZWFtUmVhZGVyVGVzdCBleHRlbmRzIFhNTFRlc3RDYXNlIHsKLQotICAgIHByaXZhdGUgRG9jdW1lbnRCdWlsZGVyIGRiOwotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBkYmYgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIGRiZi5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKLSAgICAgICAgZGIgPSBkYmYubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0gICAgfQotCi0gICAgLyoqIGNvbXBsZXggYXJyYXkgc2NlbmFyaW8gKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcGxleE9iamVjdEFycmF5U2NlbmFyaW8oKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTdHJpbmcgZXhwZWN0ZWRYTUwgPQotICAgICAgICAgICAgICAgICAgICAiPG5zMTpUZXN0Q29tcGxleFN0cmluZ0FycmF5U2NlbmFyaW8geG1sbnM6bnMxPVwiaHR0cDovL3Rlc3RDb21wbGV4U3RyaW5nQXJyYXlTY2VuYXJpby5vcmdcIj4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPEZvbz5Tb21lIFRleHQ8L0Zvbz4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPERlcGVuZGVudD4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPE5hbWU+Rm9vVHdvPC9OYW1lPiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8QWdlPjI1PC9BZ2U+IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxTZXg+TWFsZTwvU2V4PiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8L0RlcGVuZGVudD4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPEFkZGl0aW9uYWxEZXBlbmRlbnQ+IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxOYW1lPkZvb1R3bzwvTmFtZT4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPEFnZT4yNTwvQWdlPiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8U2V4Pk1hbGU8L1NleD4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPC9BZGRpdGlvbmFsRGVwZW5kZW50PiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8QWRkaXRpb25hbERlcGVuZGVudD4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPE5hbWU+Rm9vVHdvPC9OYW1lPiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8QWdlPjI1PC9BZ2U+IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxTZXg+TWFsZTwvU2V4PiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8L0FkZGl0aW9uYWxEZXBlbmRlbnQ+IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxBZGRpdGlvbmFsRGVwZW5kZW50PiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8TmFtZT5Gb29Ud288L05hbWU+IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxBZ2U+MjU8L0FnZT4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPFNleD5NYWxlPC9TZXg+IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIjwvQWRkaXRpb25hbERlcGVuZGVudD4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPEFkZGl0aW9uYWxEZXBlbmRlbnQ+IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxOYW1lPkZvb1R3bzwvTmFtZT4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPEFnZT4yNTwvQWdlPiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8U2V4Pk1hbGU8L1NleD4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPC9BZGRpdGlvbmFsRGVwZW5kZW50PiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8QmFyPlNvbWUgTW9yZSBUZXh0PC9CYXI+PCIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvbnMxOlRlc3RDb21wbGV4U3RyaW5nQXJyYXlTY2VuYXJpbz4iOwotCi0gICAgICAgICAgICBBcnJheUxpc3QgcHJvcGVydHlMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgcHJvcGVydHlMaXN0LmFkZCgiRm9vIik7Ci0gICAgICAgICAgICBwcm9wZXJ0eUxpc3QuYWRkKCJTb21lIFRleHQiKTsKLSAgICAgICAgICAgIHByb3BlcnR5TGlzdC5hZGQobmV3IFFOYW1lKCJEZXBlbmRlbnQiKSk7Ci0gICAgICAgICAgICBEdW1teUFEQkJlYW4gZHVtbXlCZWFuID0gbmV3IER1bW15QURCQmVhbigpOwotICAgICAgICAgICAgcHJvcGVydHlMaXN0LmFkZChkdW1teUJlYW4pOwotCi0gICAgICAgICAgICBBREJCZWFuW10gYWRiQmVhbnMgPSBuZXcgQURCQmVhbls0XTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgYWRiQmVhbnNbaV0gPSBuZXcgRHVtbXlBREJCZWFuKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFkYkJlYW5zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgcHJvcGVydHlMaXN0LmFkZChuZXcgUU5hbWUoIkFkZGl0aW9uYWxEZXBlbmRlbnQiKSk7Ci0gICAgICAgICAgICAgICAgcHJvcGVydHlMaXN0LmFkZChhZGJCZWFuc1tpXSk7Ci0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHJvcGVydHlMaXN0LmFkZCgiQmFyIik7Ci0gICAgICAgICAgICBwcm9wZXJ0eUxpc3QuYWRkKCJTb21lIE1vcmUgVGV4dCIpOwotCi0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgcHVsbFBhcnNlciA9IG5ldyBBREJYTUxTdHJlYW1SZWFkZXJJbXBsKG5ldyBRTmFtZSgKLSAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly90ZXN0Q29tcGxleFN0cmluZ0FycmF5U2NlbmFyaW8ub3JnIiwgIlRlc3RDb21wbGV4U3RyaW5nQXJyYXlTY2VuYXJpbyIsCi0gICAgICAgICAgICAgICAgICAgICJuczEiKSwgcHJvcGVydHlMaXN0LnRvQXJyYXkoKSwgbnVsbCk7Ci0gICAgICAgICAgICBTdHJpbmcgYWN0dWFsWE1MID0gZ2V0U3RyaW5nWE1MKHB1bGxQYXJzZXIpOwotCi0KLSAgICAgICAgICAgIGFzc2VydFhNTEVxdWFsKG5ld0RvY3VtZW50KGV4cGVjdGVkWE1MKSwgbmV3RG9jdW1lbnQoYWN0dWFsWE1MKSk7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiRXJyb3IgaGFzIG9jY3VycmVkICIgKyBlKTsKLSAgICAgICAgfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIkVycm9yIGhhcyBvY2N1cnJlZCAiICsgZSk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIkVycm9yIGhhcyBvY2N1cnJlZCAiICsgZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJFcnJvciBoYXMgb2NjdXJyZWQgIiArIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqIGNvbXBsZXggYXJyYXkgc2NlbmFyaW8gd2l0aCBudWxscyBpbiBiZXR3ZWVuICovCi0gICAgcHVibGljIHZvaWQgdGVzdENvbXBsZXhPYmplY3RBcnJheVNjZW5hcmlvV2l0aE51bGxzKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgU3RyaW5nIGV4cGVjdGVkWE1MID0KLSAgICAgICAgICAgICAgICAgICAgIjxuczE6VGVzdENvbXBsZXhTdHJpbmdBcnJheVNjZW5hcmlvIHhtbG5zOm5zMT1cImh0dHA6Ly90ZXN0Q29tcGxleFN0cmluZ0FycmF5U2NlbmFyaW8ub3JnXCI+IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxBZGRpdGlvbmFsRGVwZW5kZW50PiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8TmFtZT5Gb29Ud288L05hbWU+IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxBZ2U+MjU8L0FnZT4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPFNleD5NYWxlPC9TZXg+IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIjwvQWRkaXRpb25hbERlcGVuZGVudD4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPEFkZGl0aW9uYWxEZXBlbmRlbnQ+IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxOYW1lPkZvb1R3bzwvTmFtZT4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPEFnZT4yNTwvQWdlPiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8U2V4Pk1hbGU8L1NleD4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPC9BZGRpdGlvbmFsRGVwZW5kZW50PiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8QWRkaXRpb25hbERlcGVuZGVudD4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPE5hbWU+Rm9vVHdvPC9OYW1lPiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8QWdlPjI1PC9BZ2U+IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxTZXg+TWFsZTwvU2V4PiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8L0FkZGl0aW9uYWxEZXBlbmRlbnQ+IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxBZGRpdGlvbmFsRGVwZW5kZW50IHhzaTpuaWw9XCJ0cnVlXCIgeG1sbnM6eHNpPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2VcIj4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPC9BZGRpdGlvbmFsRGVwZW5kZW50PiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8QmFyPlNvbWUgTW9yZSBUZXh0PC9CYXI+PCIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvbnMxOlRlc3RDb21wbGV4U3RyaW5nQXJyYXlTY2VuYXJpbz4iOwotCi0gICAgICAgICAgICBBcnJheUxpc3QgcHJvcGVydHlMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgICAgICAgICBBREJCZWFuW10gYWRiQmVhbnMgPSBuZXcgQURCQmVhbls0XTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgYWRiQmVhbnNbaV0gPSBuZXcgRHVtbXlBREJCZWFuKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGFkYkJlYW5zWzNdID0gbnVsbDsKLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhZGJCZWFucy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIHByb3BlcnR5TGlzdC5hZGQobmV3IFFOYW1lKCJBZGRpdGlvbmFsRGVwZW5kZW50IikpOwotICAgICAgICAgICAgICAgIHByb3BlcnR5TGlzdC5hZGQoYWRiQmVhbnNbaV0pOwotCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHByb3BlcnR5TGlzdC5hZGQoIkJhciIpOwotICAgICAgICAgICAgcHJvcGVydHlMaXN0LmFkZCgiU29tZSBNb3JlIFRleHQiKTsKLQotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHB1bGxQYXJzZXIgPSBuZXcgQURCWE1MU3RyZWFtUmVhZGVySW1wbChuZXcgUU5hbWUoCi0gICAgICAgICAgICAgICAgICAgICJodHRwOi8vdGVzdENvbXBsZXhTdHJpbmdBcnJheVNjZW5hcmlvLm9yZyIsICJUZXN0Q29tcGxleFN0cmluZ0FycmF5U2NlbmFyaW8iLAotICAgICAgICAgICAgICAgICAgICAibnMxIiksIHByb3BlcnR5TGlzdC50b0FycmF5KCksIG51bGwpOwotICAgICAgICAgICAgU3RyaW5nIGFjdHVhbFhNTCA9IGdldFN0cmluZ1hNTChwdWxsUGFyc2VyKTsKLQotICAgICAgICAgICAgYXNzZXJ0WE1MRXF1YWwobmV3RG9jdW1lbnQoZXhwZWN0ZWRYTUwpLCBuZXdEb2N1bWVudChhY3R1YWxYTUwpKTsKLSAgICAgICAgfSBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJFcnJvciBoYXMgb2NjdXJyZWQgIiArIGUpOwotICAgICAgICB9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiRXJyb3IgaGFzIG9jY3VycmVkICIgKyBlKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiRXJyb3IgaGFzIG9jY3VycmVkICIgKyBlKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIkVycm9yIGhhcyBvY2N1cnJlZCAiICsgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiogRW1wdHkgYXJyYXkgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcGxleE9iamVjdEFycmF5U2NlbmFyaW9FbXB0eUFycmF5KCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgU3RyaW5nIGV4cGVjdGVkWE1MID0KLSAgICAgICAgICAgICAgICAgICAgIjxuczE6VGVzdENvbXBsZXhTdHJpbmdBcnJheVNjZW5hcmlvIHhtbG5zOm5zMT1cImh0dHA6Ly90ZXN0Q29tcGxleFN0cmluZ0FycmF5U2NlbmFyaW8ub3JnXCI+IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxGb28+U29tZSBUZXh0PC9Gb28+IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxEZXBlbmRlbnQ+IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxOYW1lPkZvb1R3bzwvTmFtZT4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPEFnZT4yNTwvQWdlPiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8U2V4Pk1hbGU8L1NleD4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPC9EZXBlbmRlbnQ+IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxCYXI+U29tZSBNb3JlIFRleHQ8L0Jhcj48IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9uczE6VGVzdENvbXBsZXhTdHJpbmdBcnJheVNjZW5hcmlvPiI7Ci0KLSAgICAgICAgICAgIEFycmF5TGlzdCBwcm9wZXJ0eUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICBwcm9wZXJ0eUxpc3QuYWRkKCJGb28iKTsKLSAgICAgICAgICAgIHByb3BlcnR5TGlzdC5hZGQoIlNvbWUgVGV4dCIpOwotICAgICAgICAgICAgcHJvcGVydHlMaXN0LmFkZChuZXcgUU5hbWUoIkRlcGVuZGVudCIpKTsKLSAgICAgICAgICAgIER1bW15QURCQmVhbiBkdW1teUJlYW4gPSBuZXcgRHVtbXlBREJCZWFuKCk7Ci0gICAgICAgICAgICBwcm9wZXJ0eUxpc3QuYWRkKGR1bW15QmVhbik7Ci0KLSAgICAgICAgICAgIFN0cmluZ1tdIGFycmF5ID0gbmV3IFN0cmluZ1tdIHt9OwotICAgICAgICAgICAgcHJvcGVydHlMaXN0LmFkZChuZXcgUU5hbWUoIkFkZGl0aW9uYWxEZXBlbmRlbnQiKSk7Ci0gICAgICAgICAgICBwcm9wZXJ0eUxpc3QuYWRkKGFycmF5KTsKLQotICAgICAgICAgICAgcHJvcGVydHlMaXN0LmFkZCgiQmFyIik7Ci0gICAgICAgICAgICBwcm9wZXJ0eUxpc3QuYWRkKCJTb21lIE1vcmUgVGV4dCIpOwotCi0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgcHVsbFBhcnNlciA9IG5ldyBBREJYTUxTdHJlYW1SZWFkZXJJbXBsKAotICAgICAgICAgICAgICAgICAgICBuZXcgUU5hbWUoImh0dHA6Ly90ZXN0Q29tcGxleFN0cmluZ0FycmF5U2NlbmFyaW8ub3JnIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUZXN0Q29tcGxleFN0cmluZ0FycmF5U2NlbmFyaW8iLCAibnMxIiksCi0gICAgICAgICAgICAgICAgICAgIHByb3BlcnR5TGlzdC50b0FycmF5KCksCi0gICAgICAgICAgICAgICAgICAgIG51bGwpOwotICAgICAgICAgICAgU3RyaW5nIGFjdHVhbFhNTCA9IGdldFN0cmluZ1hNTChwdWxsUGFyc2VyKTsKLSAgICAgICAgICAgIGFzc2VydFhNTEVxdWFsKG5ld0RvY3VtZW50KGV4cGVjdGVkWE1MKSwgbmV3RG9jdW1lbnQoYWN0dWFsWE1MKSk7Ci0KLSAgICAgICAgfSBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJFcnJvciBoYXMgb2NjdXJyZWQgIiArIGUpOwotICAgICAgICB9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiRXJyb3IgaGFzIG9jY3VycmVkICIgKyBlKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiRXJyb3IgaGFzIG9jY3VycmVkICIgKyBlKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIkVycm9yIGhhcyBvY2N1cnJlZCAiICsgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiogdGVzdCBhIGNvbXBsZXggYXJyYXkgbGlzdCAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RDb21wbGV4QXJyYXlMaXN0KCkgewotICAgICAgICB0cnkgewotCi0gICAgICAgICAgICBTdHJpbmcgZXhwdGVjdGVkWE1MID0gIjxQZXJzb24+PE5hbWU+Rm9vT25lPC9OYW1lPjxPcmdhbml6YXRpb24+QXBhY2hlPC9Pcmdhbml6YXRpb24+IiArCi0gICAgICAgICAgICAgICAgICAgICI8RGVwZW5kZW50PjxOYW1lPkZvb1R3bzwvTmFtZT48QWdlPjI1PC9BZ2U+PFNleD5NYWxlPC9TZXg+PERlcGVtZGVudD4iICsKLSAgICAgICAgICAgICAgICAgICAgIjxOYW1lPkZvb1R3bzwvTmFtZT48QWdlPjI1PC9BZ2U+PFNleD5NYWxlPC9TZXg+PERlcGVtZGVudD48TmFtZT5Gb29Ud288L05hbWU+IiArCi0gICAgICAgICAgICAgICAgICAgICI8QWdlPjI1PC9BZ2U+PFNleD5NYWxlPC9TZXg+PC9EZXBlbWRlbnQ+PC9EZXBlbWRlbnQ+PC9EZXBlbmRlbnQ+IiArCi0gICAgICAgICAgICAgICAgICAgICI8dGVzdDpEZXBlbmRlbnQgeG1sbnM6dGVzdD1cImh0dHA6Ly93aGF0ZXZlci5jb21cIj48TmFtZT5Gb29Ud288L05hbWU+PEFnZT4yNTwvQWdlPiIgKwotICAgICAgICAgICAgICAgICAgICAiPFNleD5NYWxlPC9TZXg+PERlcGVtZGVudD48TmFtZT5Gb29Ud288L05hbWU+PEFnZT4yNTwvQWdlPjxTZXg+TWFsZTwvU2V4PiIgKwotICAgICAgICAgICAgICAgICAgICAiPC9EZXBlbWRlbnQ+PC90ZXN0OkRlcGVuZGVudD48L1BlcnNvbj4iOwotCi0KLSAgICAgICAgICAgIEFycmF5TGlzdCBwcm9wZXJ0eUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICBwcm9wZXJ0eUxpc3QuYWRkKCJOYW1lIik7Ci0gICAgICAgICAgICBwcm9wZXJ0eUxpc3QuYWRkKCJGb29PbmUiKTsKLQotICAgICAgICAgICAgcHJvcGVydHlMaXN0LmFkZCgiT3JnYW5pemF0aW9uIik7Ci0gICAgICAgICAgICBwcm9wZXJ0eUxpc3QuYWRkKCJBcGFjaGUiKTsKLQotICAgICAgICAgICAgcHJvcGVydHlMaXN0LmFkZChuZXcgUU5hbWUoIkRlcGVuZGVudCIpKTsKLSAgICAgICAgICAgIER1bW15QURCQmVhbiBkdW1teUJlYW4gPSBuZXcgRHVtbXlBREJCZWFuKCk7Ci0gICAgICAgICAgICBEdW1teUFEQkJlYW4gbmV4dGR1bW15QmVhbiA9IGR1bW15QmVhbi5hZGRBbm90aGVyQmVhbigpOwotICAgICAgICAgICAgbmV4dGR1bW15QmVhbi5hZGRBbm90aGVyQmVhbigpOwotICAgICAgICAgICAgcHJvcGVydHlMaXN0LmFkZChkdW1teUJlYW4pOwotCi0gICAgICAgICAgICBwcm9wZXJ0eUxpc3QuYWRkKG5ldyBRTmFtZSgiaHR0cDovL3doYXRldmVyLmNvbSIsICJEZXBlbmRlbnQiLCAidGVzdCIpKTsKLSAgICAgICAgICAgIGR1bW15QmVhbiA9IG5ldyBEdW1teUFEQkJlYW4oKTsKLSAgICAgICAgICAgIGR1bW15QmVhbi5hZGRBbm90aGVyQmVhbigpOwotICAgICAgICAgICAgcHJvcGVydHlMaXN0LmFkZChkdW1teUJlYW4pOwotCi0gICAgICAgICAgICBRTmFtZSBwcm9qZWN0UU5hbWUgPSBuZXcgUU5hbWUoIlBlcnNvbiIpOwotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHB1bGxQYXJzZXIgPQotICAgICAgICAgICAgICAgICAgICBuZXcgQURCWE1MU3RyZWFtUmVhZGVySW1wbChwcm9qZWN0UU5hbWUsIHByb3BlcnR5TGlzdC50b0FycmF5KCksIG51bGwpOwotCi0gICAgICAgICAgICBEb2N1bWVudCBhY3R1YWxEb20gPSBuZXdEb2N1bWVudChnZXRTdHJpbmdYTUwocHVsbFBhcnNlcikpOwotICAgICAgICAgICAgRG9jdW1lbnQgZXhwZWN0ZWREb2N1bWVudCA9IG5ld0RvY3VtZW50KGV4cHRlY3RlZFhNTCk7Ci0gICAgICAgICAgICBhc3NlcnRYTUxFcXVhbChhY3R1YWxEb20sIGV4cGVjdGVkRG9jdW1lbnQpOwotICAgICAgICB9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiBpbiBwYXJzaW5nIGRvY3VtZW50cyAiICsgZSk7Ci0gICAgICAgIH0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gaW4gcGFyc2luZyBkb2N1bWVudHMgIiArIGUpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gaW4gcGFyc2luZyBkb2N1bWVudHMgIiArIGUpOwotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIGluIHBhcnNpbmcgZG9jdW1lbnRzICIgKyBlKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBEdW1teUFEQkJlYW4gaW1wbGVtZW50cyBBREJCZWFuIHsKLSAgICAgICAgQXJyYXlMaXN0IHByb3BlcnR5TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgICAgICBwdWJsaWMgRHVtbXlBREJCZWFuKCkgewotICAgICAgICAgICAgcHJvcGVydHlMaXN0LmFkZCgiTmFtZSIpOwotICAgICAgICAgICAgcHJvcGVydHlMaXN0LmFkZCgiRm9vVHdvIik7Ci0gICAgICAgICAgICBwcm9wZXJ0eUxpc3QuYWRkKCJBZ2UiKTsKLSAgICAgICAgICAgIHByb3BlcnR5TGlzdC5hZGQoIjI1Iik7Ci0gICAgICAgICAgICBwcm9wZXJ0eUxpc3QuYWRkKCJTZXgiKTsKLSAgICAgICAgICAgIHByb3BlcnR5TGlzdC5hZGQoIk1hbGUiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBEdW1teUFEQkJlYW4gYWRkQW5vdGhlckJlYW4oKSB7Ci0gICAgICAgICAgICBwcm9wZXJ0eUxpc3QuYWRkKG5ldyBRTmFtZSgiRGVwZW1kZW50IikpOwotICAgICAgICAgICAgRHVtbXlBREJCZWFuIGR1bW15QmVhbiA9IG5ldyBEdW1teUFEQkJlYW4oKTsKLSAgICAgICAgICAgIHByb3BlcnR5TGlzdC5hZGQoZHVtbXlCZWFuKTsKLSAgICAgICAgICAgIHJldHVybiBkdW1teUJlYW47Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgWE1MU3RyZWFtUmVhZGVyIGdldFB1bGxQYXJzZXIoUU5hbWUgYWRiQmVhblFOYW1lKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEFEQlhNTFN0cmVhbVJlYWRlckltcGwoYWRiQmVhblFOYW1lLCBwcm9wZXJ0eUxpc3QudG9BcnJheSgpLCBudWxsKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBRTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikKLSAgICAgICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uLCBBREJFeGNlcHRpb24gewotICAgICAgICAgICAgc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyLGZhbHNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBRTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VyaWFsaXplVHlwZSkKLSAgICAgICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uLCBBREJFeGNlcHRpb24gewotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJVbiBpbXBsZW1lbnRlZCBtZXRob2QiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RXaXRoT01FbGVtZW50cygpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgIFN0cmluZyBleHBlY3RlZFhNTCA9Ci0gICAgICAgICAgICAgICAgIjxPTUVsZW1lbnRUZXN0PjxheGlzMjpGaXJzdE9NRWxlbWVudCB4bWxuczpheGlzMj1cImh0dHA6Ly93cy5hcGFjaGUub3JnL25hbWVzcGFjZXMvYXhpczJcIj4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICI8YXhpczI6U2Vjb25kT01FbGVtZW50PjwvYXhpczI6U2Vjb25kT01FbGVtZW50PjwvYXhpczI6Rmlyc3RPTUVsZW1lbnQ+PEZvbz5Tb21lIFRleHQ8L0Zvbz4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICI8RGVwZW5kZW50PjxOYW1lPkZvb1R3bzwvTmFtZT48QWdlPjI1PC9BZ2U+PFNleD5NYWxlPC9TZXg+PC9EZXBlbmRlbnQ+IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiPGF4aXMyOlNlY29uZE9NRWxlbWVudCB4bWxuczpheGlzMj1cImh0dHA6Ly93cy5hcGFjaGUub3JnL25hbWVzcGFjZXMvYXhpczJcIj4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICI8L2F4aXMyOlNlY29uZE9NRWxlbWVudD48L09NRWxlbWVudFRlc3Q+IjsKLQotICAgICAgICBPTUZhY3RvcnkgZmFjdG9yeSA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpOwotICAgICAgICBPTU5hbWVzcGFjZSBheGlzMk5hbWVzcGFjZSA9IGZhY3RvcnkuY3JlYXRlT01OYW1lc3BhY2UoCi0gICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHMuQVhJUzJfTkFNRVNQQUNFX1VSSSwKLSAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50cy5BWElTMl9OQU1FU1BBQ0VfUFJFRklYKTsKLSAgICAgICAgT01FbGVtZW50IGZpcnN0RWxlbWVudCA9IGZhY3RvcnkuY3JlYXRlT01FbGVtZW50KCJGaXJzdE9NRWxlbWVudCIsIGF4aXMyTmFtZXNwYWNlKTsKLSAgICAgICAgT01FbGVtZW50IHNlY29uZEVsZW1lbnQgPQotICAgICAgICAgICAgICAgIGZhY3RvcnkuY3JlYXRlT01FbGVtZW50KCJTZWNvbmRPTUVsZW1lbnQiLCBheGlzMk5hbWVzcGFjZSwgZmlyc3RFbGVtZW50KTsKLQotICAgICAgICBBcnJheUxpc3QgcHJvcGVydHlMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgICAgIC8vIGFkZCBhbiBPTUVsZW1lbnQKLSAgICAgICAgcHJvcGVydHlMaXN0LmFkZChmaXJzdEVsZW1lbnQuZ2V0UU5hbWUoKSk7Ci0gICAgICAgIHByb3BlcnR5TGlzdC5hZGQoZmlyc3RFbGVtZW50KTsKLQotICAgICAgICAvLyBhZGQgc29tZSBtb3JlIHN0dWZmCi0gICAgICAgIHByb3BlcnR5TGlzdC5hZGQoIkZvbyIpOwotICAgICAgICBwcm9wZXJ0eUxpc3QuYWRkKCJTb21lIFRleHQiKTsKLSAgICAgICAgcHJvcGVydHlMaXN0LmFkZChuZXcgUU5hbWUoIkRlcGVuZGVudCIpKTsKLSAgICAgICAgRHVtbXlBREJCZWFuIGR1bW15QmVhbiA9IG5ldyBEdW1teUFEQkJlYW4oKTsKLSAgICAgICAgcHJvcGVydHlMaXN0LmFkZChkdW1teUJlYW4pOwotCi0vLyAgICAgICAgIGxldHMgYWRkIG9uZSBtb3JlIGVsZW1lbnQKLSAgICAgICAgcHJvcGVydHlMaXN0LmFkZChzZWNvbmRFbGVtZW50LmdldFFOYW1lKCkpOwotICAgICAgICBwcm9wZXJ0eUxpc3QuYWRkKHNlY29uZEVsZW1lbnQpOwotCi0KLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHB1bGxQYXJzZXIgPSBuZXcgQURCWE1MU3RyZWFtUmVhZGVySW1wbChuZXcgUU5hbWUoIk9NRWxlbWVudFRlc3QiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eUxpc3QudG9BcnJheSgpLCBudWxsKTsKLSAgICAgICAgU3RyaW5nIHN0cmluZ1hNTCA9IGdldFN0cmluZ1hNTChwdWxsUGFyc2VyKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIERvY3VtZW50IGFjdHVhbERvbSA9IG5ld0RvY3VtZW50KHN0cmluZ1hNTCk7Ci0gICAgICAgICAgICBEb2N1bWVudCBleHBlY3RlZERvY3VtZW50ID0gbmV3RG9jdW1lbnQoZXhwZWN0ZWRYTUwpOwotICAgICAgICAgICAgYXNzZXJ0WE1MRXF1YWwoYWN0dWFsRG9tLCBleHBlY3RlZERvY3VtZW50KTsKLSAgICAgICAgfSBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gaW4gcGFyc2luZyBkb2N1bWVudHMgIiArIGUpOwotICAgICAgICB9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIGluIHBhcnNpbmcgZG9jdW1lbnRzICIgKyBlKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIGluIHBhcnNpbmcgZG9jdW1lbnRzICIgKyBlKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgLyoqIFRlc3QgYSBjb21wbGV0ZWx5IG51bGwgZWxlbWVudCAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3ROdWxsYWJsZUF0dHJpYnV0ZSgpIHsKLSAgICAgICAgdHJ5IHsKLQotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgIFRoaXMgaXMgd2hhdCBJIGV4cGVjdCA6Ci0KLSAgICAgICAgICAgICovCi0gICAgICAgICAgICBTdHJpbmcgZXhwdGVjdGVkWE1MID0KLSAgICAgICAgICAgICAgICAgICAgIjxQZXJzb24geG1sbnM9XCJcIj48TmFtZSB4bWxucz1cIlwiPkZvb09uZTwvTmFtZT48RGVwZW5kZW50T25lIHhtbG5zPVwiXCIgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgInhzaTpuaWw9XCJ0cnVlXCIgeG1sbnM6eHNpPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2VcIi8+IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIjwvUGVyc29uPiI7Ci0KLSAgICAgICAgICAgIEFycmF5TGlzdCBwcm9wZXJ0eUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICBwcm9wZXJ0eUxpc3QuYWRkKCJOYW1lIik7Ci0gICAgICAgICAgICBwcm9wZXJ0eUxpc3QuYWRkKCJGb29PbmUiKTsKLSAgICAgICAgICAgIHByb3BlcnR5TGlzdC5hZGQobmV3IFFOYW1lKCJEZXBlbmRlbnRPbmUiKSk7Ci0gICAgICAgICAgICBwcm9wZXJ0eUxpc3QuYWRkKG51bGwpOwotCi0gICAgICAgICAgICBRTmFtZSBwcm9qZWN0UU5hbWUgPSBuZXcgUU5hbWUoIlBlcnNvbiIpOwotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHB1bGxQYXJzZXIgPQotICAgICAgICAgICAgICAgICAgICBuZXcgQURCWE1MU3RyZWFtUmVhZGVySW1wbChwcm9qZWN0UU5hbWUsIHByb3BlcnR5TGlzdC50b0FycmF5KCksIG51bGwpOwotCi0gICAgICAgICAgICBEb2N1bWVudCBhY3R1YWxEb20gPSBuZXdEb2N1bWVudChnZXRTdHJpbmdYTUwocHVsbFBhcnNlcikpOwotICAgICAgICAgICAgRG9jdW1lbnQgZXhwZWN0ZWREb2N1bWVudCA9IG5ld0RvY3VtZW50KGV4cHRlY3RlZFhNTCk7Ci0gICAgICAgICAgICBhc3NlcnRYTUxFcXVhbChhY3R1YWxEb20sIGV4cGVjdGVkRG9jdW1lbnQpOwotICAgICAgICB9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiBpbiBwYXJzaW5nIGRvY3VtZW50cyAiICsgZSk7Ci0gICAgICAgIH0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gaW4gcGFyc2luZyBkb2N1bWVudHMgIiArIGUpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gaW4gcGFyc2luZyBkb2N1bWVudHMgIiArIGUpOwotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIGluIHBhcnNpbmcgZG9jdW1lbnRzICIgKyBlKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgLyoqIFRlc3QgYSBzaW1wbGUgYXJyYXkgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlU3RyaW5nQXJyYXlTY2VuYXJpbygpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFN0cmluZyBleHBlY3RlZFhNTCA9Ci0gICAgICAgICAgICAgICAgICAgICI8bnMxOlRlc3RDb21wbGV4U3RyaW5nQXJyYXlTY2VuYXJpbyB4bWxuczpuczE9XCJodHRwOi8vdGVzdENvbXBsZXhTdHJpbmdBcnJheVNjZW5hcmlvLm9yZ1wiPiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8U3RyaW5nSW5mbz48YXJyYXk+U29tZSBUZXh0IDA8L2FycmF5PiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YXJyYXk+U29tZSBUZXh0IDE8L2FycmF5PiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YXJyYXk+U29tZSBUZXh0IDI8L2FycmF5PiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YXJyYXk+U29tZSBUZXh0IDM8L2FycmF5PjwvU3RyaW5nSW5mbz4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPC9uczE6VGVzdENvbXBsZXhTdHJpbmdBcnJheVNjZW5hcmlvPiI7Ci0KLSAgICAgICAgICAgIEFycmF5TGlzdCBwcm9wZXJ0eUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgICAgIFN0cmluZ1tdIHN0cmluZ0FycmF5ID0gbmV3IFN0cmluZ1s0XTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgc3RyaW5nQXJyYXlbaV0gPSAiU29tZSBUZXh0ICIgKyBpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHJvcGVydHlMaXN0LmFkZCgiU3RyaW5nSW5mbyIpOwotICAgICAgICAgICAgcHJvcGVydHlMaXN0LmFkZChzdHJpbmdBcnJheSk7Ci0KLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciBwdWxsUGFyc2VyID0gbmV3IEFEQlhNTFN0cmVhbVJlYWRlckltcGwoCi0gICAgICAgICAgICAgICAgICAgIG5ldyBRTmFtZSgiaHR0cDovL3Rlc3RDb21wbGV4U3RyaW5nQXJyYXlTY2VuYXJpby5vcmciLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRlc3RDb21wbGV4U3RyaW5nQXJyYXlTY2VuYXJpbyIsICJuczEiKSwKLSAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlMaXN0LnRvQXJyYXkoKSwgbnVsbCk7Ci0gICAgICAgICAgICBTdHJpbmcgYWN0dWFsWE1MID0gZ2V0U3RyaW5nWE1MKHB1bGxQYXJzZXIpOwotCi0KLSAgICAgICAgICAgIGFzc2VydFhNTEVxdWFsKG5ld0RvY3VtZW50KGV4cGVjdGVkWE1MKSwgbmV3RG9jdW1lbnQoYWN0dWFsWE1MKSk7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiRXJyb3IgaGFzIG9jY3VycmVkICIgKyBlKTsKLSAgICAgICAgfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIkVycm9yIGhhcyBvY2N1cnJlZCAiICsgZSk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIkVycm9yIGhhcyBvY2N1cnJlZCAiICsgZSk7Ci0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJFcnJvciBoYXMgb2NjdXJyZWQgIiArIGUpOwotICAgICAgICB9Ci0KLQotICAgIH0KLQotICAgIC8qKiBUZXN0IGEgc2ltcGxlIGFycmF5IHdpdGggbnVsbCdzIGluYmV0d2VlbiAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RTaW1wbGVTdHJpbmdBcnJheVNjZW5hcmlvV2l0aE51bGxzKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgU3RyaW5nIGV4cGVjdGVkWE1MID0KLSAgICAgICAgICAgICAgICAgICAgIjxuczE6VGVzdENvbXBsZXhTdHJpbmdBcnJheVNjZW5hcmlvIHhtbG5zOm5zMT1cImh0dHA6Ly90ZXN0Q29tcGxleFN0cmluZ0FycmF5U2NlbmFyaW8ub3JnXCI+IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxTdHJpbmdJbmZvPjxhcnJheT5Tb21lIFRleHQgMDwvYXJyYXk+IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxhcnJheSB4c2k6bmlsPVwidHJ1ZVwiIHhtbG5zOnhzaT1cImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlXCIvPiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YXJyYXk+U29tZSBUZXh0IDI8L2FycmF5PiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YXJyYXk+U29tZSBUZXh0IDM8L2FycmF5PjwvU3RyaW5nSW5mbz4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPC9uczE6VGVzdENvbXBsZXhTdHJpbmdBcnJheVNjZW5hcmlvPiI7Ci0KLSAgICAgICAgICAgIEFycmF5TGlzdCBwcm9wZXJ0eUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgICAgIFN0cmluZ1tdIHN0cmluZ0FycmF5ID0gbmV3IFN0cmluZ1s0XTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgc3RyaW5nQXJyYXlbaV0gPSAiU29tZSBUZXh0ICIgKyBpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3RyaW5nQXJyYXlbMV0gPSBudWxsOwotCi0gICAgICAgICAgICBwcm9wZXJ0eUxpc3QuYWRkKCJTdHJpbmdJbmZvIik7Ci0gICAgICAgICAgICBwcm9wZXJ0eUxpc3QuYWRkKHN0cmluZ0FycmF5KTsKLQotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHB1bGxQYXJzZXIgPSBuZXcgQURCWE1MU3RyZWFtUmVhZGVySW1wbCgKLSAgICAgICAgICAgICAgICAgICAgbmV3IFFOYW1lKCJodHRwOi8vdGVzdENvbXBsZXhTdHJpbmdBcnJheVNjZW5hcmlvLm9yZyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGVzdENvbXBsZXhTdHJpbmdBcnJheVNjZW5hcmlvIiwgIm5zMSIpLAotICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eUxpc3QudG9BcnJheSgpLCBudWxsKTsKLSAgICAgICAgICAgIFN0cmluZyBhY3R1YWxYTUwgPSBnZXRTdHJpbmdYTUwocHVsbFBhcnNlcik7Ci0KLQotICAgICAgICAgICAgYXNzZXJ0WE1MRXF1YWwobmV3RG9jdW1lbnQoZXhwZWN0ZWRYTUwpLCBuZXdEb2N1bWVudChhY3R1YWxYTUwpKTsKLSAgICAgICAgfSBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJFcnJvciBoYXMgb2NjdXJyZWQgIiArIGUpOwotICAgICAgICB9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiRXJyb3IgaGFzIG9jY3VycmVkICIgKyBlKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiRXJyb3IgaGFzIG9jY3VycmVkICIgKyBlKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIkVycm9yIGhhcyBvY2N1cnJlZCAiICsgZSk7Ci0gICAgICAgIH0KLQotCi0gICAgfQotCi0KLSAgICAvKiogdGVzdCB0aGUgbWl4ZWQgY29udGVudCAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RDb21wbGV4U3RyaW5nQXJyYXlTY2VuYXJpb1dpdGhNaXhlZENvbnRlbnQoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTdHJpbmcgZXhwZWN0ZWRYTUwgPQotICAgICAgICAgICAgICAgICAgICAiPG5zMTpUZXN0Q29tcGxleFN0cmluZ0FycmF5U2NlbmFyaW8geG1sbnM6bnMxPVwiaHR0cDovL3Rlc3RDb21wbGV4U3RyaW5nQXJyYXlTY2VuYXJpby5vcmdcIj4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPEZvbz5Tb21lIFRleHQ8L0Zvbz4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPERlcGVuZGVudD4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPE5hbWU+Rm9vVHdvPC9OYW1lPiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8QWdlPjI1PC9BZ2U+IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxTZXg+TWFsZTwvU2V4PiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8L0RlcGVuZGVudD4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPFN0cmluZ0luZm8+PGFycmF5PlNvbWUgVGV4dCAwPC9hcnJheT4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGFycmF5PlNvbWUgVGV4dCAxPC9hcnJheT4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGFycmF5PlNvbWUgVGV4dCAyPC9hcnJheT4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGFycmF5PlNvbWUgVGV4dCAzPC9hcnJheT48L1N0cmluZ0luZm8+IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxCYXI+U29tZSBNb3JlIFRleHQ8L0Jhcj4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPC9uczE6VGVzdENvbXBsZXhTdHJpbmdBcnJheVNjZW5hcmlvPiI7Ci0KLSAgICAgICAgICAgIEFycmF5TGlzdCBwcm9wZXJ0eUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICBwcm9wZXJ0eUxpc3QuYWRkKCJGb28iKTsKLSAgICAgICAgICAgIHByb3BlcnR5TGlzdC5hZGQoIlNvbWUgVGV4dCIpOwotICAgICAgICAgICAgcHJvcGVydHlMaXN0LmFkZChuZXcgUU5hbWUoIkRlcGVuZGVudCIpKTsKLSAgICAgICAgICAgIER1bW15QURCQmVhbiBkdW1teUJlYW4gPSBuZXcgRHVtbXlBREJCZWFuKCk7Ci0gICAgICAgICAgICBwcm9wZXJ0eUxpc3QuYWRkKGR1bW15QmVhbik7Ci0KLSAgICAgICAgICAgIFN0cmluZ1tdIHN0cmluZ0FycmF5ID0gbmV3IFN0cmluZ1s0XTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgc3RyaW5nQXJyYXlbaV0gPSAiU29tZSBUZXh0ICIgKyBpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHJvcGVydHlMaXN0LmFkZCgiU3RyaW5nSW5mbyIpOwotICAgICAgICAgICAgcHJvcGVydHlMaXN0LmFkZChzdHJpbmdBcnJheSk7Ci0KLSAgICAgICAgICAgIHByb3BlcnR5TGlzdC5hZGQoIkJhciIpOwotICAgICAgICAgICAgcHJvcGVydHlMaXN0LmFkZCgiU29tZSBNb3JlIFRleHQiKTsKLQotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHB1bGxQYXJzZXIgPSBuZXcgQURCWE1MU3RyZWFtUmVhZGVySW1wbCgKLSAgICAgICAgICAgICAgICAgICAgbmV3IFFOYW1lKCJodHRwOi8vdGVzdENvbXBsZXhTdHJpbmdBcnJheVNjZW5hcmlvLm9yZyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGVzdENvbXBsZXhTdHJpbmdBcnJheVNjZW5hcmlvIiwgIm5zMSIpLAotICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eUxpc3QudG9BcnJheSgpLAotICAgICAgICAgICAgICAgICAgICBudWxsKTsKLSAgICAgICAgICAgIFN0cmluZyBhY3R1YWxYTUwgPSBnZXRTdHJpbmdYTUwocHVsbFBhcnNlcik7Ci0KLQotICAgICAgICAgICAgYXNzZXJ0WE1MRXF1YWwobmV3RG9jdW1lbnQoZXhwZWN0ZWRYTUwpLCBuZXdEb2N1bWVudChhY3R1YWxYTUwpKTsKLSAgICAgICAgfSBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJFcnJvciBoYXMgb2NjdXJyZWQgIiArIGUpOwotICAgICAgICB9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiRXJyb3IgaGFzIG9jY3VycmVkICIgKyBlKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiRXJyb3IgaGFzIG9jY3VycmVkICIgKyBlKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIkVycm9yIGhhcyBvY2N1cnJlZCAiICsgZSk7Ci0gICAgICAgIH0KLQotCi0gICAgfQotCi0gICAgLyoqIFRlc3QgYSBzaW1wbGUgYXJyYXkgd2l0aCBvbmUgZWxlbWVudCBuaWwgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcGxleFN0cmluZ0FycmF5U2NlbmFyaW9XaXRoTnVsbCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFN0cmluZyBleHBlY3RlZFhNTCA9ICI8bnMxOlRlc3RDb21wbGV4U3RyaW5nQXJyYXlTY2VuYXJpbyAiICsKLSAgICAgICAgICAgICAgICAgICAgInhtbG5zOm5zMT1cImh0dHA6Ly90ZXN0Q29tcGxleFN0cmluZ0FycmF5U2NlbmFyaW8ub3JnXCIgIiArCi0gICAgICAgICAgICAgICAgICAgICI+IiArCi0gICAgICAgICAgICAgICAgICAgICI8U3RyaW5nSW5mbz48YXJyYXk+U29tZSBUZXh0IDA8L2FycmF5PiIgKwotICAgICAgICAgICAgICAgICAgICAiPGFycmF5IHhzaTpuaWw9XCJ0cnVlXCIgIiArCi0gICAgICAgICAgICAgICAgICAgICJ4bWxuczp4c2k9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZVwiPjwvYXJyYXk+IiArCi0gICAgICAgICAgICAgICAgICAgICI8YXJyYXk+U29tZSBUZXh0IDI8L2FycmF5PiIgKwotICAgICAgICAgICAgICAgICAgICAiPGFycmF5PlNvbWUgVGV4dCAzPC9hcnJheT48L1N0cmluZ0luZm8+IiArCi0gICAgICAgICAgICAgICAgICAgICI8L25zMTpUZXN0Q29tcGxleFN0cmluZ0FycmF5U2NlbmFyaW8+IjsKLQotICAgICAgICAgICAgQXJyYXlMaXN0IHByb3BlcnR5TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgICAgICAgICAgU3RyaW5nW10gc3RyaW5nQXJyYXkgPSBuZXcgU3RyaW5nWzRdOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoaSAhPSAxKSBzdHJpbmdBcnJheVtpXSA9ICJTb21lIFRleHQgIiArIGk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdHJpbmdBcnJheVsxXSA9IG51bGw7Ci0KLSAgICAgICAgICAgIHByb3BlcnR5TGlzdC5hZGQoIlN0cmluZ0luZm8iKTsKLSAgICAgICAgICAgIHByb3BlcnR5TGlzdC5hZGQoc3RyaW5nQXJyYXkpOwotCi0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgcHVsbFBhcnNlciA9IG5ldyBBREJYTUxTdHJlYW1SZWFkZXJJbXBsKAotICAgICAgICAgICAgICAgICAgICBuZXcgUU5hbWUoImh0dHA6Ly90ZXN0Q29tcGxleFN0cmluZ0FycmF5U2NlbmFyaW8ub3JnIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUZXN0Q29tcGxleFN0cmluZ0FycmF5U2NlbmFyaW8iLCAibnMxIiksCi0gICAgICAgICAgICAgICAgICAgIHByb3BlcnR5TGlzdC50b0FycmF5KCksIG51bGwpOwotICAgICAgICAgICAgU3RyaW5nIGFjdHVhbFhNTCA9IGdldFN0cmluZ1hNTChwdWxsUGFyc2VyKTsKLQotCi0gICAgICAgICAgICBhc3NlcnRYTUxFcXVhbChuZXdEb2N1bWVudChleHBlY3RlZFhNTCksIG5ld0RvY3VtZW50KGFjdHVhbFhNTCkpOwotICAgICAgICB9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIkVycm9yIGhhcyBvY2N1cnJlZCAiICsgZSk7Ci0gICAgICAgIH0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJFcnJvciBoYXMgb2NjdXJyZWQgIiArIGUpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJFcnJvciBoYXMgb2NjdXJyZWQgIiArIGUpOwotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiRXJyb3IgaGFzIG9jY3VycmVkICIgKyBlKTsKLSAgICAgICAgfQotCi0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IG11bHRpcGxlIHVucXVsaWZpZWQgYXR0cmlidXRlcwotICAgICAqCi0gICAgICogQHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXR0cmlidXRlcygpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgIFN0cmluZyBleHBlY3RlZFhNTCA9Ci0gICAgICAgICAgICAgICAgIjxlbXA6RW1wbG95ZWUgeG1sbnM6ZW1wPVwiaHR0cDovL2VjLm9yZy9zb2Z0d2FyZVwiIEF0dHIyPVwiVmFsdWUgMlwiICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIkF0dHIzPVwiVmFsdWUgM1wiIEF0dHIxPVwiVmFsdWUgMVwiIEF0dHI1PVwiVmFsdWUgNVwiIEF0dHI0PVwiVmFsdWUgNFwiPjwvZW1wOkVtcGxveWVlPiI7Ci0KLSAgICAgICAgT01GYWN0b3J5IGZhY3RvcnkgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKTsKLSAgICAgICAgUU5hbWUgZWxlbWVudFFOYW1lID0gbmV3IFFOYW1lKCJodHRwOi8vZWMub3JnL3NvZnR3YXJlIiwgIkVtcGxveWVlIiwgImVtcCIpOwotICAgICAgICBPTUF0dHJpYnV0ZVtdIGF0dHJpYnV0ZSA9IG5ldyBPTUF0dHJpYnV0ZVs1XTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDU7IGkrKykgewotICAgICAgICAgICAgYXR0cmlidXRlW2ldID0gZmFjdG9yeS5jcmVhdGVPTUF0dHJpYnV0ZSgiQXR0ciIgKyAoaSArIDEpLCBudWxsLCAiVmFsdWUgIiArIChpICsgMSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgTGlzdCBvbUF0dHJpYkxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBvbUF0dHJpYkxpc3QuYWRkKENvbnN0YW50cy5PTV9BVFRSSUJVVEVfS0VZKTsKLSAgICAgICAgICAgIG9tQXR0cmliTGlzdC5hZGQoYXR0cmlidXRlW2ldKTsKLSAgICAgICAgfQotCi0KLSAgICAgICAgU3RyaW5nIHN0cmluZ1hNTCA9IGdldFN0cmluZ1hNTChuZXcgQURCWE1MU3RyZWFtUmVhZGVySW1wbChlbGVtZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbUF0dHJpYkxpc3QudG9BcnJheSgpKSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBEb2N1bWVudCBhY3R1YWxEb20gPSBuZXdEb2N1bWVudChzdHJpbmdYTUwpOwotICAgICAgICAgICAgRG9jdW1lbnQgZXhwZWN0ZWREb2N1bWVudCA9IG5ld0RvY3VtZW50KGV4cGVjdGVkWE1MKTsKLSAgICAgICAgICAgIGFzc2VydFhNTEVxdWFsKGFjdHVhbERvbSwgZXhwZWN0ZWREb2N1bWVudCk7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIGluIHBhcnNpbmcgZG9jdW1lbnRzICIgKyBlKTsKLSAgICAgICAgfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiBpbiBwYXJzaW5nIGRvY3VtZW50cyAiICsgZSk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiBpbiBwYXJzaW5nIGRvY3VtZW50cyAiICsgZSk7Ci0gICAgICAgIH0KLQotCi0gICAgfQotCi0gICAgLyoqIEEgdGV4dCBvbmx5IGVsZW1lbnQgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RWxlbWVudFRleHQoKSB7Ci0KLSAgICAgICAgU3RyaW5nIGV4cGVjdGVkWE1MID0gIjxuczE6dGVzdEVsZW1lbnRUZXh0IHhtbG5zOm5zMT1cImh0dHA6Ly90ZXN0RWxlbWVudFRleHQub3JnXCI+IiArCi0gICAgICAgICAgICAgICAgIlRoaXMgaXMgc29tZSBUZXh0IGZvciB0aGUgZWxlbWVudDwvbnMxOnRlc3RFbGVtZW50VGV4dD4iOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgQXJyYXlMaXN0IHByb3BlcnRpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICBwcm9wZXJ0aWVzLmFkZChBREJYTUxTdHJlYW1SZWFkZXIuRUxFTUVOVF9URVhUKTsKLSAgICAgICAgICAgIHByb3BlcnRpZXMuYWRkKCJUaGlzIGlzIHNvbWUgVGV4dCBmb3IgdGhlIGVsZW1lbnQiKTsKLQotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHB1bGxQYXJzZXIgPSBuZXcgQURCWE1MU3RyZWFtUmVhZGVySW1wbCgKLSAgICAgICAgICAgICAgICAgICAgbmV3IFFOYW1lKCJodHRwOi8vdGVzdEVsZW1lbnRUZXh0Lm9yZyIsICJ0ZXN0RWxlbWVudFRleHQiLCAibnMxIiksCi0gICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMudG9BcnJheSgpLCBudWxsKTsKLQotICAgICAgICAgICAgU3RyaW5nIGFjdHVhbFhNTCA9IGdldFN0cmluZ1hNTChwdWxsUGFyc2VyKTsKLQotICAgICAgICAgICAgYXNzZXJ0WE1MRXF1YWwobmV3RG9jdW1lbnQoZXhwZWN0ZWRYTUwpLCBuZXdEb2N1bWVudChhY3R1YWxYTUwpKTsKLSAgICAgICAgfSBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJFcnJvciBoYXMgb2NjdXJyZWQgIiArIGUpOwotICAgICAgICB9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiRXJyb3IgaGFzIG9jY3VycmVkICIgKyBlKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiRXJyb3IgaGFzIG9jY3VycmVkICIgKyBlKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICBmYWlsKCJFcnJvciBoYXMgb2NjdXJyZWQgIiArIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0vLy8gdG9kbyBGYWlscyBkdWUgdG8gYSBidWcgaW4gV1NUWCB3cml0ZXIKLS8vICAgIC8qKgotLy8gICAgICogVGVzdCBtdWx0aXBsZSBxdWFsaWZpZWQgYXR0cmlidXRlcwotLy8gICAgICogQHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24KLS8vICAgICAqLwotLy8gICAgcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZXNXaXRoTmFtZXNwYWNlcygpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotLy8KLS8vICAgICAgICBTdHJpbmcgZXhwZWN0ZWRYTUwgPSAiPGVtcDpFbXBsb3llZSB4bWxuczplbXA9XCJodHRwOi8vZWMub3JnL3NvZnR3YXJlXCIgIiArCi0vLyAgICAgICAgICAgICAgICAieG1sbnM6YXR0ck5TPVwibWFpbHRvOndob2V2ZXJAd2hhdGV2ZXIuY29tXCIgYXR0ck5TOkF0dHIyPVwiVmFsdWUgMlwiICIgKwotLy8gICAgICAgICAgICAgICAgImF0dHJOUzpBdHRyMz1cIlZhbHVlIDNcIiBhdHRyTlM6QXR0cjE9XCJWYWx1ZSAxXCJcbiIgKwotLy8gICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgYXR0ck5TOkF0dHI1PVwiVmFsdWUgNVwiIGF0dHJOUzpBdHRyND1cIlZhbHVlIDRcIj48L2VtcDpFbXBsb3llZT4iOwotLy8KLS8vICAgICAgICBPTUZhY3RvcnkgZmFjdG9yeSA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpOwotLy8gICAgICAgIFFOYW1lIGVsZW1lbnRRTmFtZSA9IG5ldyBRTmFtZSgiaHR0cDovL2VjLm9yZy9zb2Z0d2FyZSIsICJFbXBsb3llZSIsICJlbXAiKTsKLS8vICAgICAgICBPTU5hbWVzcGFjZSBhdHRyTlMgPSBmYWN0b3J5LmNyZWF0ZU9NTmFtZXNwYWNlKCJtYWlsdG86d2hvZXZlckB3aGF0ZXZlci5jb20iLCAiYXR0ck5TIik7Ci0vLwotLy8gICAgICAgIC8vIGFkZCBzb21lIGF0dHJpYnV0ZXMgd2l0aCBuYW1lc3BhY2VzCi0vLyAgICAgICAgT01BdHRyaWJ1dGVbXSBhdHRyaWJ1dGUgPSBuZXcgT01BdHRyaWJ1dGVbNV07Ci0vLyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1OyBpKyspIHsKLS8vICAgICAgICAgICAgYXR0cmlidXRlW2ldID0gZmFjdG9yeS5jcmVhdGVPTUF0dHJpYnV0ZSgiQXR0ciIgKyAoaSArIDEpLCBhdHRyTlMsICJWYWx1ZSAiICsgKGkgKyAxKSk7Ci0vLyAgICAgICAgfQotLy8KLS8vICAgICAgICBMaXN0IG9tQXR0cmliTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLS8vICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZS5sZW5ndGg7IGkrKykgewotLy8gICAgICAgICAgICBvbUF0dHJpYkxpc3QuYWRkKENvbnN0YW50cy5PTV9BVFRSSUJVVEVfS0VZKTsKLS8vICAgICAgICAgICAgb21BdHRyaWJMaXN0LmFkZChhdHRyaWJ1dGVbaV0pOwotLy8gICAgICAgIH0KLS8vICAgICAgICBTdHJpbmcgc3RyaW5nWE1MID0gZ2V0U3RyaW5nWE1MKG5ldyBBREJYTUxTdHJlYW1SZWFkZXJJbXBsKGVsZW1lbnRRTmFtZSwKLS8vICAgICAgICAgICAgICAgIG51bGwsCi0vLyAgICAgICAgICAgICAgICBvbUF0dHJpYkxpc3QudG9BcnJheSgpKSk7Ci0vLyAgICAgICAgdHJ5IHsKLS8vICAgICAgICAgICAgRG9jdW1lbnQgYWN0dWFsRG9tID0gbmV3RG9jdW1lbnQoc3RyaW5nWE1MKTsKLS8vICAgICAgICAgICAgRG9jdW1lbnQgZXhwZWN0ZWREb2N1bWVudCA9IG5ld0RvY3VtZW50KGV4cGVjdGVkWE1MKTsKLS8vICAgICAgICAgICAgYXNzZXJ0WE1MRXF1YWwoYWN0dWFsRG9tLCBleHBlY3RlZERvY3VtZW50KTsKLS8vICAgICAgICB9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLS8vICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIGluIHBhcnNpbmcgZG9jdW1lbnRzICIgKyBlKTsKLS8vICAgICAgICB9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgewotLy8gICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gaW4gcGFyc2luZyBkb2N1bWVudHMgIiArIGUpOwotLy8gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLS8vICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIGluIHBhcnNpbmcgZG9jdW1lbnRzICIgKyBlKTsKLS8vICAgICAgICB9Ci0vLyAgICB9Ci0KLSAgICAvKiogdGVzdCBmb3IgcXVhbGlmaWVkIGF0dHJpYnV0ZXMgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VW5RdWFsaWZpZWRBdHRyaWJ1dGVzKCkgewotCi0gICAgICAgIFN0cmluZyBleHBlY3RlZFhNTCA9Ci0gICAgICAgICAgICAgICAgIjxuczE6dGVzdEVsZW1lbnRUZXh0IHhtbG5zOm5zMT1cImh0dHA6Ly90ZXN0RWxlbWVudFRleHQub3JnXCIgTXlVblF1YWxpZmllZEF0dHJpYnV0ZT1cIk15QXR0cmlidXRlVmFsdWVcIj4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICI8bnMyOlF1YWxpZmllZEVsZW1lbnQgeG1sbnM6bnMyPVwiaHR0cDovL3Rlc3RRRWxlbWVudFRleHQub3JnXCI+IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiVGhpcyBpcyBzb21lIFRleHQgZm9yIHRoZSBlbGVtZW50PC9uczI6UXVhbGlmaWVkRWxlbWVudD48L25zMTp0ZXN0RWxlbWVudFRleHQ+IjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEFycmF5TGlzdCBwcm9wZXJ0aWVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgcHJvcGVydGllcy5hZGQobmV3IFFOYW1lKCJodHRwOi8vdGVzdFFFbGVtZW50VGV4dC5vcmciLCAiUXVhbGlmaWVkRWxlbWVudCIsICJuczIiKSk7Ci0gICAgICAgICAgICBwcm9wZXJ0aWVzLmFkZCgiVGhpcyBpcyBzb21lIFRleHQgZm9yIHRoZSBlbGVtZW50Iik7Ci0KLSAgICAgICAgICAgIFN0cmluZ1tdIGF0dHJpYnV0ZXMgPSBuZXcgU3RyaW5nWzJdOwotICAgICAgICAgICAgYXR0cmlidXRlc1swXSA9ICJNeVVuUXVhbGlmaWVkQXR0cmlidXRlIjsKLSAgICAgICAgICAgIGF0dHJpYnV0ZXNbMV0gPSAiTXlBdHRyaWJ1dGVWYWx1ZSI7Ci0KLQotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHB1bGxQYXJzZXIgPSBuZXcgQURCWE1MU3RyZWFtUmVhZGVySW1wbCgKLSAgICAgICAgICAgICAgICAgICAgbmV3IFFOYW1lKCJodHRwOi8vdGVzdEVsZW1lbnRUZXh0Lm9yZyIsICJ0ZXN0RWxlbWVudFRleHQiLCAibnMxIiksCi0gICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMudG9BcnJheSgpLAotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzKTsKLQotICAgICAgICAgICAgU3RyaW5nIGFjdHVhbFhNTCA9IGdldFN0cmluZ1hNTChwdWxsUGFyc2VyKTsKLQotICAgICAgICAgICAgYXNzZXJ0WE1MRXF1YWwobmV3RG9jdW1lbnQoZXhwZWN0ZWRYTUwpLCBuZXdEb2N1bWVudChhY3R1YWxYTUwpKTsKLSAgICAgICAgfSBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJFcnJvciBoYXMgb2NjdXJyZWQgIiArIGUpOwotICAgICAgICB9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiRXJyb3IgaGFzIG9jY3VycmVkICIgKyBlKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiRXJyb3IgaGFzIG9jY3VycmVkICIgKyBlKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIkVycm9yIGhhcyBvY2N1cnJlZCAiICsgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiogdGVzdCBmb3IgYmFzZTY0ICovCi0gICAgcHVibGljIHZvaWQgdGVzdEJhc2U2NEVuY29kZWRUZXh0KCkgewotCi0gICAgICAgIFN0cmluZyB0ZXh0VG9iZVNlbnQgPSAiMzMzNDRNdGh3cnJld3JJT1RFTikoJioqXkUoVylFVyI7Ci0KLSAgICAgICAgU3RyaW5nIGV4cGVjdGVkWE1MID0gIjxuczE6dGVzdEVsZW1lbnRUZXh0IHhtbG5zOm5zMT1cImh0dHA6Ly90ZXN0RWxlbWVudFRleHQub3JnXCI+IiArCi0gICAgICAgICAgICAgICAgIjxuczI6UXVhbGlmaWVkRWxlbWVudCB4bWxuczpuczI9XCJodHRwOi8vdGVzdFFFbGVtZW50VGV4dC5vcmdcIj4iICsKLSAgICAgICAgICAgICAgICBCYXNlNjQuZW5jb2RlKHRleHRUb2JlU2VudC5nZXRCeXRlcygpKSArCi0gICAgICAgICAgICAgICAgIjwvbnMyOlF1YWxpZmllZEVsZW1lbnQ+PC9uczE6dGVzdEVsZW1lbnRUZXh0PiI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBBcnJheUxpc3QgcHJvcGVydGllcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgIHByb3BlcnRpZXMuYWRkKG5ldyBRTmFtZSgiaHR0cDovL3Rlc3RRRWxlbWVudFRleHQub3JnIiwgIlF1YWxpZmllZEVsZW1lbnQiLCAibnMyIikpOwotICAgICAgICAgICAgcHJvcGVydGllcy5hZGQobmV3IERhdGFIYW5kbGVyKG5ldyBCeXRlQXJyYXlEYXRhU291cmNlKHRleHRUb2JlU2VudC5nZXRCeXRlcygpKSkpOwotCi0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgcHVsbFBhcnNlciA9IG5ldyBBREJYTUxTdHJlYW1SZWFkZXJJbXBsKAotICAgICAgICAgICAgICAgICAgICBuZXcgUU5hbWUoImh0dHA6Ly90ZXN0RWxlbWVudFRleHQub3JnIiwgInRlc3RFbGVtZW50VGV4dCIsICJuczEiKSwKLSAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcy50b0FycmF5KCksCi0gICAgICAgICAgICAgICAgICAgIG51bGwpOwotCi0gICAgICAgICAgICBTdHJpbmcgYWN0dWFsWE1MID0gZ2V0U3RyaW5nWE1MKHB1bGxQYXJzZXIpOwotCi0gICAgICAgICAgICBhc3NlcnRYTUxFcXVhbChuZXdEb2N1bWVudChleHBlY3RlZFhNTCksIG5ld0RvY3VtZW50KGFjdHVhbFhNTCkpOwotICAgICAgICB9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIkVycm9yIGhhcyBvY2N1cnJlZCAiICsgZSk7Ci0gICAgICAgIH0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJFcnJvciBoYXMgb2NjdXJyZWQgIiArIGUpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJFcnJvciBoYXMgb2NjdXJyZWQgIiArIGUpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiRXJyb3IgaGFzIG9jY3VycmVkICIgKyBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKiB0ZXN0IHRoZSBxdWFsaWZpZWQgZWxlbWVudHMgQSBxdWxpZmllZCBlbGVtZW50IGhhcyBiZWVuIGFzc29jaWF0ZWQgd2l0aCBhIG5hbWVzcGFjZSAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RRdWFsaWZpZWRFbGVtZW50KCkgewotCi0gICAgICAgIFN0cmluZyBleHBlY3RlZFhNTCA9ICI8bnMxOnRlc3RFbGVtZW50VGV4dCB4bWxuczpuczE9XCJodHRwOi8vdGVzdEVsZW1lbnRUZXh0Lm9yZ1wiPiIgKwotICAgICAgICAgICAgICAgICI8bnMyOlF1YWxpZmllZEVsZW1lbnQgeG1sbnM6bnMyPVwiaHR0cDovL3Rlc3RRRWxlbWVudFRleHQub3JnXCI+IiArCi0gICAgICAgICAgICAgICAgIlRoaXMgaXMgc29tZSBUZXh0IGZvciB0aGUgZWxlbWVudDwvbnMyOlF1YWxpZmllZEVsZW1lbnQ+PC9uczE6dGVzdEVsZW1lbnRUZXh0PiI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBBcnJheUxpc3QgcHJvcGVydGllcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgIHByb3BlcnRpZXMuYWRkKG5ldyBRTmFtZSgiaHR0cDovL3Rlc3RRRWxlbWVudFRleHQub3JnIiwgIlF1YWxpZmllZEVsZW1lbnQiLCAibnMyIikpOwotICAgICAgICAgICAgcHJvcGVydGllcy5hZGQoIlRoaXMgaXMgc29tZSBUZXh0IGZvciB0aGUgZWxlbWVudCIpOwotCi0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgcHVsbFBhcnNlciA9IG5ldyBBREJYTUxTdHJlYW1SZWFkZXJJbXBsKAotICAgICAgICAgICAgICAgICAgICBuZXcgUU5hbWUoImh0dHA6Ly90ZXN0RWxlbWVudFRleHQub3JnIiwgInRlc3RFbGVtZW50VGV4dCIsICJuczEiKSwKLSAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcy50b0FycmF5KCksCi0gICAgICAgICAgICAgICAgICAgIG51bGwpOwotCi0gICAgICAgICAgICBTdHJpbmcgYWN0dWFsWE1MID0gZ2V0U3RyaW5nWE1MKHB1bGxQYXJzZXIpOwotICAgICAgICAgICAgYXNzZXJ0WE1MRXF1YWwobmV3RG9jdW1lbnQoZXhwZWN0ZWRYTUwpLCBuZXdEb2N1bWVudChhY3R1YWxYTUwpKTsKLSAgICAgICAgfSBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJFcnJvciBoYXMgb2NjdXJyZWQgIiArIGUpOwotICAgICAgICB9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiRXJyb3IgaGFzIG9jY3VycmVkICIgKyBlKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiRXJyb3IgaGFzIG9jY3VycmVkICIgKyBlKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIkVycm9yIGhhcyBvY2N1cnJlZCAiICsgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVdGlsIG1ldGhvZCB0byBjb252ZXJ0IHRoZSBwdWxsc3RyZWFtIHRvIGEgc3RyaW5nCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVhZGVyCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGdldFN0cmluZ1hNTChYTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgLy90aGUgcmV0dXJuZWQgcHVsbHBhcnNlciBzdGFydHMgYXQgYW4gRWxlbWVudCByYXRoZXIgdGhhbiB0aGUgc3RhcnQKLSAgICAgICAgLy9kb2N1bWVudCBldmVudC4gVGhpcyBpcyBzb21ld2hhdCBkaXN0dXJiaW5nIGJ1dCBzaW5jZSBhbiBBREJCZWFuCi0gICAgICAgIC8vZGVub3RlcyBhbiBYTUxGcmFnbWVudCwgaXQgaXMganVzdGlmaWFibGUgdG8ga2VlcCB0aGUgY3VycmVudCBldmVudAotICAgICAgICAvL2F0IHRoZSBTdGFydC1lbGVtZW50IHJhdGhlciB0aGFuIHRoZSBzdGFydCBkb2N1bWVudAotICAgICAgICAvL1doYXQgaXQgYm9pbHMgZG93biB0byBpcyB0aGF0IHdlIG5lZWQgdG8gd3JhcCB0aGUgcmVhZGVyIGluIGEKLSAgICAgICAgLy9zdHJlYW0gd3JhcHBlciB0byBnZXQgYSBmYWtlIHN0YXJ0LWRvY3VtZW50IGV2ZW50Ci0KLSAgICAgICAgU3RyZWFtaW5nT01TZXJpYWxpemVyIHNlciA9IG5ldyBTdHJlYW1pbmdPTVNlcmlhbGl6ZXIoKTsKLSAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJ5dGVBcnJheU91dHB1dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgWE1MU3RyZWFtV3JpdGVyIHdyaXRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1Xcml0ZXIoYnl0ZUFycmF5T3V0cHV0U3RyZWFtKTsKLSAgICAgICAgc2VyLnNlcmlhbGl6ZSgKLSAgICAgICAgICAgICAgICBuZXcgU3RyZWFtV3JhcHBlcihyZWFkZXIpLAotICAgICAgICAgICAgICAgIHdyaXRlcik7Ci0gICAgICAgIHdyaXRlci5mbHVzaCgpOwotICAgICAgICByZXR1cm4gYnl0ZUFycmF5T3V0cHV0U3RyZWFtLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0vLyAgICAgLyoqCi0vLyAgICAgKiBVdGlsIG1ldGhvZCB0byBjb252ZXJ0IHRoZSBwdWxsc3RyZWFtIHRvIGEgc3RyaW5nCi0vLyAgICAgKiBAcGFyYW0gcmVhZGVyCi0vLyAgICAgKiBAcmV0dXJuCi0vLyAgICAgKi8KLS8vICAgIHByaXZhdGUgU3RyaW5nIGdldFN0cmluZ1hNTChYTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7Ci0vLyAgICAgICAgLy90aGUgcmV0dXJuZWQgcHVsbHBhcnNlciBzdGFydHMgYXQgYW4gRWxlbWVudCByYXRoZXIgdGhhbiB0aGUgc3RhcnQKLS8vICAgICAgICAvL2RvY3VtZW50IGV2ZW50LiBUaGlzIGlzIHNvbWV3aGF0IGRpc3R1cmJpbmcgYnV0IHNpbmNlIGFuIEFEQkJlYW4KLS8vICAgICAgICAvL2Rlbm90ZXMgYW4gWE1MRnJhZ21lbnQsIGl0IGlzIGp1c3RpZmlhYmxlIHRvIGtlZXAgdGhlIGN1cnJlbnQgZXZlbnQKLS8vICAgICAgICAvL2F0IHRoZSBTdGFydC1lbGVtZW50IHJhdGhlciB0aGFuIHRoZSBzdGFydCBkb2N1bWVudAotLy8gICAgICAgIC8vV2hhdCBpdCBib2lscyBkb3duIHRvIGlzIHRoYXQgd2UgbmVlZCB0byB3cmFwIHRoZSByZWFkZXIgaW4gYQotLy8gICAgICAgIC8vc3RyZWFtIHdyYXBwZXIgdG8gZ2V0IGEgZmFrZSBzdGFydC1kb2N1bWVudCBldmVudAotLy8gICAgICAgIFN0QVhPTUJ1aWxkZXIgc3RBWE9NQnVpbGRlciA9IG5ldyBTdEFYT01CdWlsZGVyKAotLy8gICAgICAgICAgICAgICAgbmV3IFN0cmVhbVdyYXBwZXIocmVhZGVyKSk7Ci0vLyAgICAgICAgLy9zdEFYT01CdWlsZGVyLnNldERvRGVidWcodHJ1ZSk7Ci0vLyAgICAgICAgT01FbGVtZW50IG9tZWxlbWVudCA9IHN0QVhPTUJ1aWxkZXIuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0vLyAgICAgICAgcmV0dXJuIG9tZWxlbWVudC50b1N0cmluZygpOwotLy8gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIERPTSBkb2N1bWVudCBmcm9tIHRoZSBzdHJpbmcKLSAgICAgKgotICAgICAqIEBwYXJhbSB4bWwKLSAgICAgKiBAcmV0dXJuCi0gICAgICogQHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBTQVhFeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIERvY3VtZW50IG5ld0RvY3VtZW50KFN0cmluZyB4bWwpCi0gICAgICAgICAgICB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBkYi5wYXJzZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oeG1sLmdldEJ5dGVzKCkpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGIvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3V0aWxzL3dyaXRlci9PTUVsZW1lbnRTdHJlYW1Xcml0ZXJUZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGIvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3V0aWxzL3dyaXRlci9PTUVsZW1lbnRTdHJlYW1Xcml0ZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2MGI5ZjAuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRiL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy91dGlscy93cml0ZXIvT01FbGVtZW50U3RyZWFtV3JpdGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXI7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmJ1aWxkZXIuU3RBWE9NQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXI7Ci0KLQotcHVibGljIGNsYXNzIE9NRWxlbWVudFN0cmVhbVdyaXRlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwcml2YXRlIGludCBwcmVmaXhOdW07Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0T01FbGVtZW50KCkgewotCi0gICAgICAgIE9NRWxlbWVudFN0cmVhbVdyaXRlciBvbUVsZW1lbnRTdHJlYW1Xcml0ZXIgPSBuZXcgT01FbGVtZW50U3RyZWFtV3JpdGVyKCk7Ci0KLSAgICAgICAgdHJ5IHsKLQotICAgICAgICAgICAgd3JpdGVTdGFydEVsZW1lbnQobnVsbCwgInRlc3QxIiwgb21FbGVtZW50U3RyZWFtV3JpdGVyKTsKLSAgICAgICAgICAgIHdyaXRlU3RhcnRFbGVtZW50KCJodHRwOi8vYXBhY2gudGVtcC51cmkiLCAidGVzdDIiLCBvbUVsZW1lbnRTdHJlYW1Xcml0ZXIpOwotICAgICAgICAgICAgd3JpdGVTdGFydEVsZW1lbnQoImh0dHA6Ly9hcGFjaC50ZW1wLnVyaTEiLCAidGVzdDMiLCBvbUVsZW1lbnRTdHJlYW1Xcml0ZXIpOwotICAgICAgICAgICAgb21FbGVtZW50U3RyZWFtV3JpdGVyLndyaXRlQ2hhcmFjdGVycygidGVzdCBzdHJpbmczIik7Ci0gICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgiaHR0cDovL2FwYWNoLnRlbXAudXJpIiwgImF0dHJpYnV0ZTEiLCAiYXR0cnVidGVWYWx1ZTEiLCBvbUVsZW1lbnRTdHJlYW1Xcml0ZXIpOwotICAgICAgICAgICAgd3JpdGVRTmFtZXMobmV3IFFOYW1lW117bmV3IFFOYW1lKCJodHRwOi8vYXhpczIuYXBhY2gub3JnMSIsICJ0ZXN0UU5hbWUiKSwKLSAgICAgICAgICAgICAgICAgICAgbmV3IFFOYW1lKCJodHRwOi8vYXhpczIuYXBhY2gub3JnMiIsICJ0ZXN0UU5hbWUyIil9LCBvbUVsZW1lbnRTdHJlYW1Xcml0ZXIpOwotICAgICAgICAgICAgb21FbGVtZW50U3RyZWFtV3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICAgICAgd3JpdGVTdGFydEVsZW1lbnQoImh0dHA6Ly9hcGFjaC50ZW1wLnVyaTEiLCAidGVzdDQiLCBvbUVsZW1lbnRTdHJlYW1Xcml0ZXIpOwotICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUobnVsbCwgImF0dHJpYnV0ZTEiLCAiYXR0cnVidGVWYWx1ZTEiLCBvbUVsZW1lbnRTdHJlYW1Xcml0ZXIpOwotICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoIm5zMSIsICJodHRwOi8vYXBhY2gudGVtcC51cmkiLCAiYXR0cmlidXRlMSIsICJhdHRydWJ0ZVZhbHVlMSIsIG9tRWxlbWVudFN0cmVhbVdyaXRlcik7Ci0gICAgICAgICAgICBvbUVsZW1lbnRTdHJlYW1Xcml0ZXIud3JpdGVDaGFyYWN0ZXJzKCJ0ZXN0IHN0cmluZzQiKTsKLSAgICAgICAgICAgIG9tRWxlbWVudFN0cmVhbVdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICAgICAgICAgIHdyaXRlU3RhcnRFbGVtZW50KCJodHRwOi8vdGVtcC5uZXcub3JnIiwgInRlc3RhdHRyaWJ1dGVFbGVtZW50Iiwgb21FbGVtZW50U3RyZWFtV3JpdGVyKTsKLSAgICAgICAgICAgIHdyaXRlUU5hbWVBdHRyaWJ1dGUobnVsbCwgInRlc3RRbmFtZSIsIG5ldyBRTmFtZSgiaHR0cDovL3RlbXAubmV3Lm9yZyIsICJ0ZXN0UU5hbWUiKSwgb21FbGVtZW50U3RyZWFtV3JpdGVyKTsKLSAgICAgICAgICAgIHdyaXRlUU5hbWUobmV3IFFOYW1lKCJodHRwOi8vYXhpczIuYXBhY2gub3JnIiwgInRlc3RRTmFtZSIpLCBvbUVsZW1lbnRTdHJlYW1Xcml0ZXIpOwotICAgICAgICAgICAgb21FbGVtZW50U3RyZWFtV3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICAgICAgb21FbGVtZW50U3RyZWFtV3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICAgICAgb21FbGVtZW50U3RyZWFtV3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotCi0gICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gb21FbGVtZW50U3RyZWFtV3JpdGVyLmdldE9NRWxlbWVudCgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTSBTdHJpbmcgPT0+ICIgKyBvbUVsZW1lbnQudG9TdHJpbmcoKSk7Ci0KLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPSBvbUVsZW1lbnQuZ2V0WE1MU3RyZWFtUmVhZGVyKCk7Ci0gICAgICAgICAgICBTdEFYT01CdWlsZGVyIHN0QVhPTUJ1aWxkZXIgPSBuZXcgU3RBWE9NQnVpbGRlcih4bWxSZWFkZXIpOwotICAgICAgICAgICAgT01FbGVtZW50IHJlc3VsdCA9IHN0QVhPTUJ1aWxkZXIuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT00gcmVzdWx0ID09PiAiICsgcmVzdWx0LnRvU3RyaW5nKCkpOwotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZW5lcmF0ZVByZWZpeChTdHJpbmcgc3RyaW5nKSB7Ci0gICAgICAgIHJldHVybiAibnMiICsgKytwcmVmaXhOdW07Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHdyaXRlU3RhcnRFbGVtZW50KFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBsb2NhbE5hbWUsIFhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgIGlmICgobmFtZXNwYWNlICE9IG51bGwpICYmICEgbmFtZXNwYWNlLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBwcmVmaXggPSAibnMiICsgKytwcmVmaXhOdW07Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHByZWZpeCwgbG9jYWxOYW1lLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChuYW1lc3BhY2UsIGxvY2FsTmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQobG9jYWxOYW1lKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShTdHJpbmcgcHJlZml4LCBTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGF0dFZhbHVlLCBYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKQotICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICh4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSkgPT0gbnVsbCkgewotICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotCi0gICAgICAgIH0KLSAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSwgYXR0TmFtZSwgYXR0VmFsdWUpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGF0dFZhbHVlLCBYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKChuYW1lc3BhY2UgPT0gbnVsbCkgfHwgbmFtZXNwYWNlLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLCBhdHRWYWx1ZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLCBhdHROYW1lLCBhdHRWYWx1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZUF0dHJpYnV0ZShTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRTmFtZSBxbmFtZSwgWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICBTdHJpbmcgYXR0cmlidXRlTmFtZXNwYWNlID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgIFN0cmluZyBhdHRyaWJ1dGVQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgYXR0cmlidXRlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICB9Ci0gICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlVmFsdWU7Ci0gICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBhdHRyaWJ1dGVQcmVmaXggKyAiOiIgKyBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoKG5hbWVzcGFjZSAhPSBudWxsKSAmJiBuYW1lc3BhY2UuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChuYW1lc3BhY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsIGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lKFFOYW1lIHFuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBuYW1lc3BhY2VVUkkgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHByZWZpeCArICI6IiArIENvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIGkuZSB0aGlzIGlzIHRoZSBkZWZhdWx0IG5hbWVzcGFjZQotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMoQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhDb252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVzKFFOYW1lW10gcW5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICBpZiAocW5hbWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gc3RvcmUgdGhpcyBkYXRhIHVudGlsIGxhc3QgbW9tZW50IHNpbmNlIGl0IGlzIG5vdCBwb3NzaWJsZSB0byB3cml0ZSBhbnkKLSAgICAgICAgICAgIC8vIG5hbWVzcGFjZSBkYXRhIGFmdGVyIHdyaXRpbmcgdGhlIGNoYXJhY3RvciBkYXRhCi0gICAgICAgICAgICBTdHJpbmdCdWZmZXIgc3RyaW5nVG9Xcml0ZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lc3BhY2VVUkkgPSBudWxsOwotICAgICAgICAgICAgU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcW5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKCIgIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG5hbWVzcGFjZVVSSSA9IHFuYW1lc1tpXS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoKHByZWZpeCA9PSBudWxsKSB8fCAocHJlZml4Lmxlbmd0aCgpID09IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChwcmVmaXgpLmFwcGVuZCgiOiIpLmFwcGVuZChDb252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKENvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQoQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhzdHJpbmdUb1dyaXRlLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLQotICAgIHByaXZhdGUgU3RyaW5nIHJlZ2lzdGVyUHJlZml4KFhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsIFN0cmluZyBuYW1lc3BhY2UpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgIHdoaWxlICh4bWxXcml0ZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBwcmVmaXggPSBCZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcHJlZml4OwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRkcmVzc2luZy9wb20ueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRkcmVzc2luZy9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjE1NzQ3Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkZHJlc3NpbmcvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjEuNS4xPC92ZXJzaW9uPgotICAgICAgICA8cmVsYXRpdmVQYXRoPi4uL3BhcmVudC9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+Ci0gICAgPC9wYXJlbnQ+Ci0gICAgPGFydGlmYWN0SWQ+YWRkcmVzc2luZzwvYXJ0aWZhY3RJZD4KLSAgICA8cGFja2FnaW5nPm1hcjwvcGFja2FnaW5nPgotICAgIDxuYW1lPkFwYWNoZSBBeGlzMiAtIEFkZHJlc3Npbmc8L25hbWU+Ci0gICAgPGRlc2NyaXB0aW9uPldTLUFkZHJlc3NpbmcgaW1wbGVtZW50YXRpb248L2Rlc2NyaXB0aW9uPgotICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLWtlcm5lbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7dmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8L2RlcGVuZGVuY2llcz4KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxzb3VyY2VEaXJlY3Rvcnk+c3JjPC9zb3VyY2VEaXJlY3Rvcnk+Ci0gICAgICAgIDx0ZXN0U291cmNlRGlyZWN0b3J5PnRlc3Q8L3Rlc3RTb3VyY2VEaXJlY3Rvcnk+Ci0gICAgICAgIDxyZXNvdXJjZXM+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5jb25mPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi8qLnByb3BlcnRpZXM8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9leGNsdWRlcz4KLSAgICAgICAgICAgICAgICA8ZmlsdGVyaW5nPmZhbHNlPC9maWx0ZXJpbmc+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi8qLmphdmE8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9leGNsdWRlcz4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgIDwvcmVzb3VyY2VzPgotICAgICAgICA8dGVzdFJlc291cmNlcz4KLSAgICAgICAgICAgIDx0ZXN0UmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPHRhcmdldFBhdGg+Li4vdGVzdC1yZXNvdXJjZXM8L3RhcmdldFBhdGg+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT50ZXN0LXJlc291cmNlczwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKio8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgIDwvdGVzdFJlc291cmNlPgotICAgICAgICA8L3Rlc3RSZXNvdXJjZXM+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxza2lwPmZhbHNlPC9za2lwPgotICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi8qVXRpbC5qYXZhPC9leGNsdWRlPgotICAgICAgICAgICAgICAgICAgICA8L2V4Y2x1ZGVzPgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLW1hci1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+MS41LjE8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPGV4dGVuc2lvbnM+dHJ1ZTwvZXh0ZW5zaW9ucz4KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGVEZXBlbmRlbmNpZXM+ZmFsc2U8L2luY2x1ZGVEZXBlbmRlbmNpZXM+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgIDwvcGx1Z2lucz4KLSAgICA8L2J1aWxkPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRkcmVzc2luZy9zcmMvTUVUQS1JTkYvbW9kdWxlLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkZHJlc3Npbmcvc3JjL01FVEEtSU5GL21vZHVsZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkMDVmN2EuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRkcmVzc2luZy9zcmMvTUVUQS1JTkYvbW9kdWxlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPG1vZHVsZSBuYW1lPSJhZGRyZXNzaW5nIj4KLSAgICA8RGVzY3JpcHRpb24+VGhpcyBpcyB0aGUgV1MtQWRkcmVzc2luZyBpbXBsZW1lbnRhdGlvbiBvbiBBeGlzMiwgc3VwcG9ydGluZyB0aGUgV1MtQWRkcmVzc2luZyAxLjAgUmVjb21tZW5kYXRpb24sIGFzIHdlbGwgYXMgdGhlIFN1Ym1pc3Npb24gdmVyc2lvbiAoMjAwNC8wOCkuPC9EZXNjcmlwdGlvbj4KLSAgICA8SW5GbG93PgotICAgICAgICA8aGFuZGxlciBuYW1lPSJBZGRyZXNzaW5nSW5IYW5kbGVyIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5oYW5kbGVycy5hZGRyZXNzaW5nLkFkZHJlc3NpbmdJbkhhbmRsZXIiPgotICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJBZGRyZXNzaW5nIiBiZWZvcmU9IkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiLz4KLSAgICAgICAgPC9oYW5kbGVyPgotICAgICAgICA8aGFuZGxlciBuYW1lPSJBZGRyZXNzaW5nVmFsaWRhdGlvbkhhbmRsZXIiIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmhhbmRsZXJzLmFkZHJlc3NpbmcuQWRkcmVzc2luZ1ZhbGlkYXRpb25IYW5kbGVyIj4KLSAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iRGlzcGF0Y2giIGFmdGVyPSJTT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiLz4KLSAgICAgICAgPC9oYW5kbGVyPgotICAgIDwvSW5GbG93PgotCi0gICAgPE91dEZsb3c+Ci0gICAgICAgIDwhLS0gV2UgZG9uJ3QgbmVlZCB0byBoYXZlIHR3byBoYW5kbGVycyB0byBoYW5kbGUgdGhlc2UgdHdvIHZlcnNpb24uIFNvIGxldHMgaGFuZGxlIGJvdGggb2YgdGhlbSBpbiBvbmUuIC0tPgotICAgICAgICA8aGFuZGxlciBuYW1lPSJBZGRyZXNzaW5nT3V0SGFuZGxlciIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuaGFuZGxlcnMuYWRkcmVzc2luZy5BZGRyZXNzaW5nT3V0SGFuZGxlciI+Ci0gICAgICAgICAgICA8b3JkZXIgcGhhc2U9Ik1lc3NhZ2VPdXQiLz4KLSAgICAgICAgPC9oYW5kbGVyPgotICAgIDwvT3V0Rmxvdz4KLQotICAgIDxPdXRGYXVsdEZsb3c+Ci0gICAgICAgIDxoYW5kbGVyIG5hbWU9IkFkZHJlc3NpbmdPdXRIYW5kbGVyIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5oYW5kbGVycy5hZGRyZXNzaW5nLkFkZHJlc3NpbmdPdXRIYW5kbGVyIj4KLSAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iTWVzc2FnZU91dCIvPgotICAgICAgICA8L2hhbmRsZXI+Ci0gICAgPC9PdXRGYXVsdEZsb3c+Ci0KLSAgICA8SW5GYXVsdEZsb3c+Ci0gICAgICAgIDxoYW5kbGVyIG5hbWU9IkFkZHJlc3NpbmdJbkhhbmRsZXIiIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmhhbmRsZXJzLmFkZHJlc3NpbmcuQWRkcmVzc2luZ0luSGFuZGxlciI+Ci0gICAgICAgICAgICA8b3JkZXIgcGhhc2U9IkFkZHJlc3NpbmciIGJlZm9yZT0iQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciIvPgotICAgICAgICA8L2hhbmRsZXI+Ci0gICAgICAgIDxoYW5kbGVyIG5hbWU9IkFkZHJlc3NpbmdJbkZhdWx0SGFuZGxlciIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuaGFuZGxlcnMuYWRkcmVzc2luZy5BZGRyZXNzaW5nSW5GYXVsdEhhbmRsZXIiPgotICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJQcmVEaXNwYXRjaCIgYWZ0ZXI9IkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiLz4KLSAgICAgICAgPC9oYW5kbGVyPgotICAgICAgICA8IS0tIEFkZHJlc3NpbmdWYWxpZGF0aW9uSGFuZGxlciBub3QgcHJlc2VudCBvbiB0aGUgSU5mYXVsdGZsb3cgc28gdGhhdCB3ZSBkb24ndCBnZXQgZmF1bHRzIGJvdW5jaW5nIGFyb3VuZCBmb3JldmVyIC0tPgotICAgIDwvSW5GYXVsdEZsb3c+Ci08L21vZHVsZT4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkZHJlc3Npbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvaGFuZGxlcnMvYWRkcmVzc2luZy9BZGRyZXNzaW5nSW5GYXVsdEhhbmRsZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkZHJlc3Npbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvaGFuZGxlcnMvYWRkcmVzc2luZy9BZGRyZXNzaW5nSW5GYXVsdEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGVmZDRhNS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGRyZXNzaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2hhbmRsZXJzL2FkZHJlc3NpbmcvQWRkcmVzc2luZ0luRmF1bHRIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmhhbmRsZXJzLmFkZHJlc3Npbmc7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUDExQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYXVsdENvZGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYXVsdERldGFpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhdWx0UmVhc29uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmF1bHRTdWJDb2RlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmF1bHRUZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQSGVhZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5BZGRyZXNzaW5nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5BZGRyZXNzaW5nRmF1bHRzSGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmhhbmRsZXJzLkFic3RyYWN0SGFuZGxlcjsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gZXh0cmFjdCBXUy1BZGRyZXNzaW5nIFNwZWMgZGVmaW5lZCBGYXVsdHMgYW5kIEZhdWx0RGV0YWlsIGFuZCBjb252ZXJ0IHRoZW0KLSAqIGludG8gdW5kZXJzdGFuZGFibGUgQXhpc0ZhdWx0IG9iamVjdHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBBZGRyZXNzaW5nSW5GYXVsdEhhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIgaW1wbGVtZW50cyBBZGRyZXNzaW5nQ29uc3RhbnRzIHsKLQotICAgIHB1YmxpYyBJbnZvY2F0aW9uUmVzcG9uc2UgaW52b2tlKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBTdHJpbmcgYWN0aW9uID0gbXNnQ29udGV4dC5nZXRXU0FBY3Rpb24oKTsKLQotICAgICAgICBpZiAoRmluYWwuV1NBX0ZBVUxUX0FDVElPTi5lcXVhbHMoYWN0aW9uKQotICAgICAgICAgICAgICAgIHx8IEZpbmFsLldTQV9TT0FQX0ZBVUxUX0FDVElPTi5lcXVhbHMoYWN0aW9uKQotICAgICAgICAgICAgICAgIHx8IFN1Ym1pc3Npb24uV1NBX0ZBVUxUX0FDVElPTi5lcXVhbHMoYWN0aW9uKSkgewotICAgICAgICAgICAgU09BUEVudmVsb3BlIGVudmVsb3BlID0gbXNnQ29udGV4dC5nZXRFbnZlbG9wZSgpOwotICAgICAgICAgICAgU09BUEZhdWx0IGZhdWx0ID0gZW52ZWxvcGUuZ2V0Qm9keSgpLmdldEZhdWx0KCk7Ci0KLSAgICAgICAgICAgIGlmIChmYXVsdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiQSBTb2FwIGVudmVsb3BlIHdpdGggZmF1bHQgYWN0aW9uIC0iICsgYWN0aW9uICsgIiBoYXMgYmVlbiByZWNlaXZlZCB3aXRob3V0ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgImEgZmF1bHQgZWxlbWVudCBpbiB0aGUgc29hcCBib2R5Iik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFNPQVBGYWN0b3J5IHNmID0gKChTT0FQRmFjdG9yeSllbnZlbG9wZS5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICBTT0FQRmF1bHREZXRhaWwgZGV0YWlsID0gbnVsbDsKLQotICAgICAgICAgICAgaWYgKG1zZ0NvbnRleHQuaXNTT0FQMTEoKSkgewotICAgICAgICAgICAgICAgIFNPQVBIZWFkZXIgaGVhZGVyID0gZW52ZWxvcGUuZ2V0SGVhZGVyKCk7Ci0gICAgICAgICAgICAgICAgT01FbGVtZW50IGVsZW1lbnQgPSBoZWFkZXIuZ2V0Rmlyc3RDaGlsZFdpdGhOYW1lKEZpbmFsLlFOQU1FX1dTQV9IRUFERVJfREVUQUlMKTsKLSAgICAgICAgICAgICAgICBpZiAoZWxlbWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRldGFpbCA9IHNmLmNyZWF0ZVNPQVBGYXVsdERldGFpbChmYXVsdCk7Ci0gICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGkgPSBlbGVtZW50LmdldENoaWxkRWxlbWVudHMoKTsKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBPTUVsZW1lbnQgZGV0YWlsRWxlbWVudCA9IChPTUVsZW1lbnQpaS5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWwuYWRkRGV0YWlsRW50cnkoZGV0YWlsRWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGRldGFpbCA9IGZhdWx0LmdldERldGFpbCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTdHJpbmcgZmF1bHREZXRhaWxTdHJpbmcgPSBudWxsOwotICAgICAgICAgICAgaWYgKGRldGFpbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgT01FbGVtZW50IGVsZW1lbnQgPSBkZXRhaWwuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBmYXVsdERldGFpbFN0cmluZyA9IGVsZW1lbnQuZ2V0VGV4dCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3RyaW5nIGZhdWx0TG9jYWxOYW1lOwotICAgICAgICAgICAgU09BUEZhdWx0Q29kZSBjb2RlID0gZmF1bHQuZ2V0Q29kZSgpOwotICAgICAgICAgICAgU09BUEZhdWx0U3ViQ29kZSBzdWJDb2RlID0gY29kZS5nZXRTdWJDb2RlKCk7Ci0gICAgICAgICAgICBpZiAoc3ViQ29kZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZmF1bHRMb2NhbE5hbWUgPSBjb2RlLmdldFRleHRBc1FOYW1lKCkuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHdoaWxlIChzdWJDb2RlLmdldFN1YkNvZGUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN1YkNvZGUgPSBzdWJDb2RlLmdldFN1YkNvZGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZmF1bHRMb2NhbE5hbWUgPSBzdWJDb2RlLmdldFZhbHVlKCkuZ2V0VGV4dEFzUU5hbWUoKS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3RyaW5nIG5ld1JlYXNvbiA9IEFkZHJlc3NpbmdGYXVsdHNIZWxwZXIKLSAgICAgICAgICAgICAgICAgICAgLmdldE1lc3NhZ2VGb3JBeGlzRmF1bHQoZmF1bHRMb2NhbE5hbWUsIGZhdWx0RGV0YWlsU3RyaW5nKTsKLQotICAgICAgICAgICAgaWYgKG5ld1JlYXNvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgU09BUEZhdWx0UmVhc29uIHNmciA9IHNmLmNyZWF0ZVNPQVBGYXVsdFJlYXNvbigpOwotICAgICAgICAgICAgICAgIGlmIChlbnZlbG9wZS5nZXROYW1lc3BhY2UoKS5nZXROYW1lc3BhY2VVUkkoKQotICAgICAgICAgICAgICAgICAgICAgICAgLmVxdWFscyhTT0FQMTFDb25zdGFudHMuU09BUF9FTlZFTE9QRV9OQU1FU1BBQ0VfVVJJKSkgewotICAgICAgICAgICAgICAgICAgICBzZnIuc2V0VGV4dChuZXdSZWFzb24pOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIFNPQVBGYXVsdFRleHQgc2Z0ID0gc2YuY3JlYXRlU09BUEZhdWx0VGV4dCgpOwotICAgICAgICAgICAgICAgICAgICBzZnQuc2V0VGV4dChuZXdSZWFzb24pOwotICAgICAgICAgICAgICAgICAgICBzZnIuYWRkU09BUFRleHQoc2Z0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gZWxzZSBjYWxsIHRoZSBvbiBlcnJvciBtZXRob2Qgd2l0aCB0aGUgZmF1bHQKLSAgICAgICAgICAgICAgICBBeGlzRmF1bHQgYXhpc0ZhdWx0ID0gbmV3IEF4aXNGYXVsdChmYXVsdC5nZXRDb2RlKCksIHNmciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYXVsdC5nZXROb2RlKCksIGZhdWx0LmdldFJvbGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWwpOwotICAgICAgICAgICAgICAgIG1zZ0NvbnRleHQuc2V0UHJvcGVydHkoQ29uc3RhbnRzLklOQk9VTkRfRkFVTFRfT1ZFUlJJREUsIGF4aXNGYXVsdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gSW52b2NhdGlvblJlc3BvbnNlLkNPTlRJTlVFOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkZHJlc3Npbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvaGFuZGxlcnMvYWRkcmVzc2luZy9BZGRyZXNzaW5nSW5IYW5kbGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGRyZXNzaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2hhbmRsZXJzL2FkZHJlc3NpbmcvQWRkcmVzc2luZ0luSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjVjYmMxLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkZHJlc3Npbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvaGFuZGxlcnMvYWRkcmVzc2luZy9BZGRyZXNzaW5nSW5IYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MDggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmhhbmRsZXJzLmFkZHJlc3Npbmc7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQXR0cmlidXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5Sb2xlUGxheWVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQSGVhZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQSGVhZGVyQmxvY2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkFkZHJlc3NpbmdDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkFkZHJlc3NpbmdGYXVsdHNIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZUhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuUmVsYXRlc1RvOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50Lk9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uSGFuZGxlckRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaGFuZGxlcnMuQWJzdHJhY3RIYW5kbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5KYXZhVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLkxvZ2dpbmdDb250cm9sOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBBZGRyZXNzaW5nSW5IYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyIGltcGxlbWVudHMgQWRkcmVzc2luZ0NvbnN0YW50cyB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVE9fRkxBRyA9IDEsIEZST01fRkxBRyA9IDIsIFJFUExZVE9fRkxBRyA9IDMsCi0gICAgICAgICAgICBGQVVMVE9fRkxBRyA9IDQsIE1FU1NBR0VJRF9GTEFHID0gNiwgQUNUSU9OX0ZMQUcgPSAwOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEFkZHJlc3NpbmdJbkhhbmRsZXIuY2xhc3MpOwotCi0gICAgcHJpdmF0ZSBib29sZWFuIGRpc2FibGVSZWZwYXJhbUV4dHJhY3QgPSBmYWxzZTsKLSAgICBwcml2YXRlIEF4aXNDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gPSBudWxsOwotICAgIHByaXZhdGUgUm9sZVBsYXllciByb2xlUGxheWVyID0gbnVsbDsKLSAgICAKLSAgICBwdWJsaWMgdm9pZCBpbml0KEhhbmRsZXJEZXNjcmlwdGlvbiBoYW5kbGVyZGVzYyl7Ci0gICAgCXN1cGVyLmluaXQoaGFuZGxlcmRlc2MpOwotICAgIAkvLyBjaGVjayB3aGV0aGVyIHRvIHByb2Nlc3MgcmVmZXJlbmNlIHBhcmFtZXRlcnMuCi0gICAgICAgIFBhcmFtZXRlciBwYXJhbSA9IGhhbmRsZXJkZXNjLmdldFBhcmFtZXRlcihESVNBQkxFX1JFRl9QQVJBTUVURVJfRVhUUkFDVCk7Ci0gICAgICAgIFN0cmluZyB2YWx1ZSA9IFV0aWxzLmdldFBhcmFtZXRlclZhbHVlKHBhcmFtKTsKLSAgICAgICAgZGlzYWJsZVJlZnBhcmFtRXh0cmFjdCA9IEphdmFVdGlscy5pc1RydWVFeHBsaWNpdGx5KHZhbHVlKTsKLQotICAgICAgICBpZiAoTG9nZ2luZ0NvbnRyb2wuZGVidWdMb2dnaW5nQWxsb3dlZCAmJiBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJkaXNhYmxlUmVmcGFyYW1FeHRyYWN0PSIgKyBkaXNhYmxlUmVmcGFyYW1FeHRyYWN0KTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSW52b2NhdGlvblJlc3BvbnNlIGludm9rZShNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgLy9TZXQgdGhlIGRlZmF1bHRzIG9uIHRoZSBtZXNzYWdlIGNvbnRleHQuCi0gICAgICAgIG1zZ0NvbnRleHQuc2V0UHJvcGVydHkoRElTQUJMRV9BRERSRVNTSU5HX0ZPUl9PVVRfTUVTU0FHRVMsIEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgIG1zZ0NvbnRleHQuc2V0UHJvcGVydHkoSVNfQUREUl9JTkZPX0FMUkVBRFlfUFJPQ0VTU0VELCBCb29sZWFuLkZBTFNFKTsKLQotICAgICAgICAvL0RldGVybWluZSBpZiB3ZSB3YW50IHRvIGlnbm9yZSBhZGRyZXNzaW5nIGhlYWRlcnMuIFRoaXMgcGFyYW1ldGVyIG11c3QKLSAgICAgICAgLy9iZSByZXRyaWV2ZWQgZnJvbSB0aGUgbWVzc2FnZSBjb250ZXh0IGJlY2F1c2UgaXQncyB2YWx1ZSBjYW4gdmFyeSBvbiBhCi0gICAgICAgIC8vcGVyIHNlcnZpY2UgYmFzaXMuCi0gICAgICAgIFBhcmFtZXRlciBkaXNhYmxlUGFyYW0gPSBtc2dDb250ZXh0LmdldFBhcmFtZXRlcihESVNBQkxFX0FERFJFU1NJTkdfRk9SX0lOX01FU1NBR0VTKTsKLSAgICAgICAgU3RyaW5nIHZhbHVlID0gVXRpbHMuZ2V0UGFyYW1ldGVyVmFsdWUoZGlzYWJsZVBhcmFtKTsKLSAgICAgICAgaWYgKEphdmFVdGlscy5pc1RydWVFeHBsaWNpdGx5KHZhbHVlKSkgewotICAgICAgICAgICAgaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQgJiYgbG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoCi0gICAgICAgICAgICAgICAgICAgICAgICAiVGhlIEFkZHJlc3NpbmdJbkhhbmRsZXIgaGFzIGJlZW4gZGlzYWJsZWQuIE5vIGZ1cnRoZXIgcHJvY2Vzc2luZyB3aWxsIHRha2UgcGxhY2UuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gSW52b2NhdGlvblJlc3BvbnNlLkNPTlRJTlVFOyAgICAgICAgIAotICAgICAgICB9Ci0KLSAgICAgICAgLy8gaWYgdGhlcmUgYXJlIG5vdCBoZWFkZXJzIHB1dCBhIGZsYWcgdG8gZGlzYWJsZSBhZGRyZXNzaW5nIHRlbXBvcmFyeQotICAgICAgICBTT0FQSGVhZGVyIGhlYWRlciA9IG1zZ0NvbnRleHQuZ2V0RW52ZWxvcGUoKS5nZXRIZWFkZXIoKTsKLSAgICAgICAgaWYgKGhlYWRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gSW52b2NhdGlvblJlc3BvbnNlLkNPTlRJTlVFOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoY29uZmlndXJhdGlvbiA9PSBudWxsKXsKLSAgICAgICAgCUF4aXNDb25maWd1cmF0aW9uIGNvbmYgPSBtc2dDb250ZXh0LmdldENvbmZpZ3VyYXRpb25Db250ZXh0KCkuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKTsKLSAgICAgICAgCXJvbGVQbGF5ZXIgPSAoUm9sZVBsYXllciljb25mLmdldFBhcmFtZXRlclZhbHVlKENvbnN0YW50cy5TT0FQX1JPTEVfUExBWUVSX1BBUkFNRVRFUik7Ci0gICAgICAgIAljb25maWd1cmF0aW9uID0gY29uZjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gY2hlY2sgd2hldGhlciBhbm90aGVyIGhhbmRsZXIgaGFzIGV4cGxpY2l0bHkgc2V0IHdoaWNoIGFkZHJlc3NpbmcgbmFtZXNwYWNlIHRvIGV4cGVjdC4KLSAgICAgICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBudWxsOwotICAgICAgICBTdHJpbmcgbmFtZXNwYWNlID0gKFN0cmluZykgbXNnQ29udGV4dC5nZXRQcm9wZXJ0eShXU19BRERSRVNTSU5HX1ZFUlNJT04pOwotICAgICAgICAKLSAgICAgICAgLy8gY2hlY2sgd2hldGhlciB0aGUgc2VydmljZSBpcyBjb25maWd1cmVkIHRvIHVzZSBhIHBhcnRpY3VsYXIgdmVyc2lvbiBvZiBXUy1BZGRyZXNzaW5nLAotICAgICAgICAvLyBlLmcuIHZpYSBKQVgtV1MgYW5ub3RhdGlvbnMuCi0gICAgICAgIGlmIChuYW1lc3BhY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgUGFyYW1ldGVyIG5hbWVzcGFjZVBhcmFtID0gbXNnQ29udGV4dC5nZXRQYXJhbWV0ZXIoV1NfQUREUkVTU0lOR19WRVJTSU9OKTsKLSAgICAgICAgICAgIG5hbWVzcGFjZSA9IFV0aWxzLmdldFBhcmFtZXRlclZhbHVlKG5hbWVzcGFjZVBhcmFtKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKG5hbWVzcGFjZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBuYW1lc3BhY2UgPSBGaW5hbC5XU0FfTkFNRVNQQUNFOwotICAgICAgICAgICAgaXRlcmF0b3IgPSBoZWFkZXIuZ2V0SGVhZGVyc1RvUHJvY2Vzcyhyb2xlUGxheWVyLCBuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICBpZiAoIWl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkICYmIGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiTm8gaGVhZGVycyBwcmVzZW50IGNvcnJlc3BvbmRpbmcgdG8gIiArIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbmFtZXNwYWNlID0gU3VibWlzc2lvbi5XU0FfTkFNRVNQQUNFOwotICAgICAgICAgICAgICAgIGl0ZXJhdG9yID0gaGVhZGVyLmdldEhlYWRlcnNUb1Byb2Nlc3Mocm9sZVBsYXllciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChGaW5hbC5XU0FfTkFNRVNQQUNFLmVxdWFscyhuYW1lc3BhY2UpIHx8IFN1Ym1pc3Npb24uV1NBX05BTUVTUEFDRS5lcXVhbHMobmFtZXNwYWNlKSkgewotICAgICAgICAgICAgaXRlcmF0b3IgPSBoZWFkZXIuZ2V0SGVhZGVyc1RvUHJvY2Vzcyhyb2xlUGxheWVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoTG9nZ2luZ0NvbnRyb2wuZGVidWdMb2dnaW5nQWxsb3dlZCAmJiBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiVGhlIHByZWNvbmZpZ3VyZWQgbmFtZXNwYWNlIGlzLCAsICIgKyBuYW1lc3BhY2UpOwotICAgICAgICAgICAgfSAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQgJiYgbG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlRoZSBzcGVjaWZpZWQgbmFtZXNwYWNlIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBoYW5kbGVyLCAiICsgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgIH0gICAgICAgICAgICAKLQotICAgICAgICAgICAgcmV0dXJuIEludm9jYXRpb25SZXNwb25zZS5DT05USU5VRTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkICYmIGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKG5hbWVzcGFjZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICIgaGVhZGVycyBwcmVzZW50IGluIHRoZSBTT0FQIG1lc3NhZ2UuIFN0YXJ0aW5nIHRvIHByb2Nlc3MgLi4uIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vTmVlZCB0byBzZXQgdGhlc2UgcHJvcGVydGllcyBoZXJlLCBiZWZvcmUgd2UgZXh0cmFjdCB0aGUgV1MtQWRkcmVzc2luZwotICAgICAgICAgICAgLy9pbmZvcm1hdGlvbiwgaW4gY2FzZSB3ZSB0aHJvdyBhIGZhdWx0LgotICAgICAgICAgICAgbXNnQ29udGV4dC5zZXRQcm9wZXJ0eShXU19BRERSRVNTSU5HX1ZFUlNJT04sIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICBtc2dDb250ZXh0LnNldFByb3BlcnR5KERJU0FCTEVfQUREUkVTU0lOR19GT1JfT1VUX01FU1NBR0VTLCBCb29sZWFuLkZBTFNFKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZXh0cmFjdEFkZHJlc3NpbmdJbmZvcm1hdGlvbihtc2dDb250ZXh0LCBpdGVyYXRvciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gY2hlY2sgZm9yIHJlZmVyZW5jZSBwYXJhbWV0ZXJzCi0gICAgICAgICAgICBpZiAoIWRpc2FibGVSZWZwYXJhbUV4dHJhY3QpIHsKLSAgICAgICAgICAgICAgICBleHRyYWN0VG9FcHJSZWZlcmVuY2VQYXJhbWV0ZXJzKG1zZ0NvbnRleHQuZ2V0VG8oKSwgaGVhZGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICAvL1dlIHNob3VsZCBvbmx5IGdldCB0byB0aGlzIHBvaW50IGlmIHdlIGhhdmVuJ3QgdGhyb3duIGEgZmF1bHQuCi0gICAgICAgICAgICBtc2dDb250ZXh0LnNldFByb3BlcnR5KElTX0FERFJfSU5GT19BTFJFQURZX1BST0NFU1NFRCwgQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkICYmIGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJObyBoZWFkZXJzIHByZXNlbnQgY29ycmVzcG9uZGluZyB0byAiICsgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBJbnZvY2F0aW9uUmVzcG9uc2UuQ09OVElOVUU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHVsbCBhZGRyZXNzaW5nIGhlYWRlcnMgb3V0IGZyb20gdGhlIFNPQVAgbWVzc2FnZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXNzYWdlQ29udGV4dCB0aGUgYWN0aXZlIE1lc3NhZ2VDb250ZXh0Ci0gICAgICogQHBhcmFtIGhlYWRlcnMgYW4gSXRlcmF0b3Igb3ZlciB0aGUgYWRkcmVzc2luZyBoZWFkZXJzIHRhcmdldGVkIHRvIG1lCi0gICAgICogQHBhcmFtIG5hbWVzcGFjZSB0aGUgYWRkcmVzc2luZyBuYW1lc3BhY2UKLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdCBpZiBhbiBlcnJvciBvY2N1cnMKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgZXh0cmFjdEFkZHJlc3NpbmdJbmZvcm1hdGlvbihNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCwgSXRlcmF0b3IgaGVhZGVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWVzcGFjZSkKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBPcHRpb25zIG1lc3NhZ2VDb250ZXh0T3B0aW9ucyA9IG1lc3NhZ2VDb250ZXh0LmdldE9wdGlvbnMoKTsKLQotICAgICAgICBBcnJheUxpc3QgZHVwbGljYXRlSGVhZGVyTmFtZXMgPSBuZXcgQXJyYXlMaXN0KDEpOyAvLyBOb3JtYWxseSB3aWxsIG5vdCBiZSB1c2VkIGZvciBtb3JlIHRoYW4gMSBoZWFkZXIKLQotICAgICAgICBBcnJheUxpc3QgcmVsYXRlc1RvSGVhZGVycyA9IG51bGw7Ci0gICAgICAgIFNPQVBIZWFkZXJCbG9jayBhY3Rpb25CbG9jayA9IG51bGwsIHRvQmxvY2sgPSBudWxsLCBtZXNzYWdlSURCbG9jayA9IG51bGwsIHJlcGx5VG9CbG9jayA9Ci0gICAgICAgICAgICAgICAgbnVsbCwgZmF1bHRUb0Jsb2NrID0gbnVsbCwgZnJvbUJsb2NrID0gbnVsbDsKLQotICAgICAgICAvLyBQZXIgdGhlIFNPQVAgQmluZGluZyBzcGVjICJoZWFkZXJzIHdpdGggYW4gaW5jb3JyZWN0IGNhcmRpbmFsaXR5IE1VU1QgTk9UIGJlIHVzZWQiIFNvIHRoZXNlIHZhcmlhYmxlcwotICAgICAgICAvLyBhcmUgdXNlZCB0byBrZWVwIHRyYWNrIG9mIGludmFsaWQgY2FyZGluYWxpdHkgaGVhZGVycyBzbyB0aGV5IGFyZSBub3QgZGVzZXJpYWxpc2VkLgotICAgICAgICBib29sZWFuW10gaWdub3JlSGVhZGVycyA9IG5ldyBib29sZWFuWzddOwotICAgICAgICBib29sZWFuW10gY2hlY2tlZEhlYWRlck5hbWVzID0gbmV3IGJvb2xlYW5bN107Ci0KLSAgICAgICAgLy8gRmlyc3QgcGFzcyBqdXN0IGNoZWNrIGZvciBkdXBsaWNhdGVzCi0gICAgICAgIHdoaWxlIChoZWFkZXJzLmhhc05leHQoKSkgewotICAgICAgICAgICAgU09BUEhlYWRlckJsb2NrIHNvYXBIZWFkZXJCbG9jayA9IChTT0FQSGVhZGVyQmxvY2spaGVhZGVycy5uZXh0KCk7Ci0gICAgICAgICAgICBTdHJpbmcgbG9jYWxOYW1lID0gc29hcEhlYWRlckJsb2NrLmdldExvY2FsTmFtZSgpOwotICAgICAgICAgICAgaWYgKFdTQV9BQ1RJT04uZXF1YWxzKGxvY2FsTmFtZSkpIHsKLSAgICAgICAgICAgICAgICBhY3Rpb25CbG9jayA9IHNvYXBIZWFkZXJCbG9jazsKLSAgICAgICAgICAgICAgICBjaGVja0R1cGxpY2F0ZUhlYWRlcnMoV1NBX0FDVElPTiwgQUNUSU9OX0ZMQUcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrZWRIZWFkZXJOYW1lcywgaWdub3JlSGVhZGVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVwbGljYXRlSGVhZGVyTmFtZXMpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChXU0FfVE8uZXF1YWxzKGxvY2FsTmFtZSkpIHsKLSAgICAgICAgICAgICAgICB0b0Jsb2NrID0gc29hcEhlYWRlckJsb2NrOwotICAgICAgICAgICAgICAgIGNoZWNrRHVwbGljYXRlSGVhZGVycyhXU0FfVE8sIFRPX0ZMQUcsIGNoZWNrZWRIZWFkZXJOYW1lcywgaWdub3JlSGVhZGVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVwbGljYXRlSGVhZGVyTmFtZXMpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChXU0FfTUVTU0FHRV9JRC5lcXVhbHMobG9jYWxOYW1lKSkgewotICAgICAgICAgICAgICAgIG1lc3NhZ2VJREJsb2NrID0gc29hcEhlYWRlckJsb2NrOwotICAgICAgICAgICAgICAgIGNoZWNrRHVwbGljYXRlSGVhZGVycyhXU0FfTUVTU0FHRV9JRCwgTUVTU0FHRUlEX0ZMQUcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrZWRIZWFkZXJOYW1lcywgaWdub3JlSGVhZGVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVwbGljYXRlSGVhZGVyTmFtZXMpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChXU0FfUkVQTFlfVE8uZXF1YWxzKGxvY2FsTmFtZSkpIHsKLSAgICAgICAgICAgICAgICByZXBseVRvQmxvY2sgPSBzb2FwSGVhZGVyQmxvY2s7Ci0gICAgICAgICAgICAgICAgY2hlY2tEdXBsaWNhdGVIZWFkZXJzKFdTQV9SRVBMWV9UTywgUkVQTFlUT19GTEFHLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja2VkSGVhZGVyTmFtZXMsIGlnbm9yZUhlYWRlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cGxpY2F0ZUhlYWRlck5hbWVzKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoV1NBX0ZBVUxUX1RPLmVxdWFscyhsb2NhbE5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgZmF1bHRUb0Jsb2NrID0gc29hcEhlYWRlckJsb2NrOwotICAgICAgICAgICAgICAgIGNoZWNrRHVwbGljYXRlSGVhZGVycyhXU0FfRkFVTFRfVE8sIEZBVUxUT19GTEFHLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja2VkSGVhZGVyTmFtZXMsIGlnbm9yZUhlYWRlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cGxpY2F0ZUhlYWRlck5hbWVzKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoV1NBX0ZST00uZXF1YWxzKGxvY2FsTmFtZSkpIHsKLSAgICAgICAgICAgICAgICBmcm9tQmxvY2sgPSBzb2FwSGVhZGVyQmxvY2s7Ci0gICAgICAgICAgICAgICAgY2hlY2tEdXBsaWNhdGVIZWFkZXJzKFdTQV9GUk9NLCBGUk9NX0ZMQUcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrZWRIZWFkZXJOYW1lcywgaWdub3JlSGVhZGVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVwbGljYXRlSGVhZGVyTmFtZXMpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChXU0FfUkVMQVRFU19UTy5lcXVhbHMobG9jYWxOYW1lKSkgewotICAgICAgICAgICAgICAgIGlmIChyZWxhdGVzVG9IZWFkZXJzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVsYXRlc1RvSGVhZGVycyA9IG5ldyBBcnJheUxpc3QoMSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJlbGF0ZXNUb0hlYWRlcnMuYWRkKHNvYXBIZWFkZXJCbG9jayk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYWN0aW9uQmxvY2sgIT0gbnVsbCAmJiAhaWdub3JlSGVhZGVyc1tBQ1RJT05fRkxBR10pIHsKLSAgICAgICAgICAgIGV4dHJhY3RBY3Rpb25JbmZvcm1hdGlvbihhY3Rpb25CbG9jaywgbWVzc2FnZUNvbnRleHQpOwotICAgICAgICB9Ci0gICAgICAgIGlmICh0b0Jsb2NrICE9IG51bGwgJiYgIWlnbm9yZUhlYWRlcnNbVE9fRkxBR10pIHsKLSAgICAgICAgICAgIGV4dHJhY3RUb0VQUkluZm9ybWF0aW9uKHRvQmxvY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlQ29udGV4dE9wdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtZXNzYWdlSURCbG9jayAhPSBudWxsICYmICFpZ25vcmVIZWFkZXJzW01FU1NBR0VJRF9GTEFHXSkgewotICAgICAgICAgICAgZXh0cmFjdE1lc3NhZ2VJREluZm9ybWF0aW9uKG1lc3NhZ2VJREJsb2NrLCBtZXNzYWdlQ29udGV4dCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJlbGF0ZXNUb0hlYWRlcnMgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZWxhdGVzVG9IZWFkZXJzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgZXh0cmFjdFJlbGF0ZXNUb0luZm9ybWF0aW9uKChTT0FQSGVhZGVyQmxvY2spIHJlbGF0ZXNUb0hlYWRlcnMuZ2V0KGkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlQ29udGV4dE9wdGlvbnMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChyZXBseVRvQmxvY2sgIT0gbnVsbCAmJiAhaWdub3JlSGVhZGVyc1tSRVBMWVRPX0ZMQUddKSB7Ci0gICAgICAgICAgICBleHRyYWN0UmVwbHlUb0VQUkluZm9ybWF0aW9uKHJlcGx5VG9CbG9jaywgbmFtZXNwYWNlLCBtZXNzYWdlQ29udGV4dCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGZhdWx0VG9CbG9jayAhPSBudWxsICYmICFpZ25vcmVIZWFkZXJzW0ZBVUxUT19GTEFHXSkgewotICAgICAgICAgICAgZXh0cmFjdEZhdWx0VG9FUFJJbmZvcm1hdGlvbihmYXVsdFRvQmxvY2ssIG5hbWVzcGFjZSwgbWVzc2FnZUNvbnRleHQpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChmcm9tQmxvY2sgIT0gbnVsbCAmJiAhaWdub3JlSGVhZGVyc1tGUk9NX0ZMQUddKSB7Ci0gICAgICAgICAgICBleHRyYWN0RnJvbUVQUkluZm9ybWF0aW9uKGZyb21CbG9jaywgbmFtZXNwYWNlLCBtZXNzYWdlQ29udGV4dCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBOb3cgdGhhdCBhbGwgdGhlIHZhbGlkIHdzYSBoZWFkZXJzIGhhdmUgYmVlbiByZWFkLCB0aHJvdyBhbiBleGNlcHRpb24gaWYgdGhlcmUgd2FzIGFuIGludmFsaWQgY2FyZGluYWxpdHkKLSAgICAgICAgLy8gVGhpcyBtZWFucyB0aGF0IGlmIGZvciBleGFtcGxlIHRoZXJlIGFyZSBtdWx0aXBsZSBNZXNzYWdlSURzIGFuZCBhIEZhdWx0VG8sIHRoZSBGYXVsdFRvIHdpbGwgYmUgcmVzcGVjdGVkLgotICAgICAgICBpZiAoIWR1cGxpY2F0ZUhlYWRlck5hbWVzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgLy8gU2ltcGx5IGNob29zZSB0aGUgZmlyc3QgcHJvYmxlbSBoZWFkZXIgd2UgY2FtZSBhY3Jvc3MgYXMgd2UgY2FuIG9ubHkgZmF1bHQgZm9yIG9uZSBvZiB0aGVtLgotICAgICAgICAgICAgQWRkcmVzc2luZ0ZhdWx0c0hlbHBlci50cmlnZ2VySW52YWxpZENhcmRpbmFsaXR5RmF1bHQobWVzc2FnZUNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU3RyaW5nKSBkdXBsaWNhdGVIZWFkZXJOYW1lcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0KDApKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNoZWNrIGZvciB0aGUgcHJlc2VuY2Ugb2YgbWFkYXRvcnkgYWRkcmVzc2luZyBoZWFkZXJzCi0gICAgICAgIGNoZWNrRm9yTWFuZGF0b3J5SGVhZGVycyhjaGVja2VkSGVhZGVyTmFtZXMsIG1lc3NhZ2VDb250ZXh0LCBuYW1lc3BhY2UpOwotCi0gICAgICAgIC8vIHByb3ZpZGUgZGVmYXVsdCB2YWx1ZXMgZm9yIGhlYWRlcnMgdGhhdCBoYXZlIG5vdCBiZWVuIGZvdW5kLgotICAgICAgICBzZXREZWZhdWx0cyhjaGVja2VkSGVhZGVyTmFtZXMsIG1lc3NhZ2VDb250ZXh0LCBuYW1lc3BhY2UpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjaGVja0Zvck1hbmRhdG9yeUhlYWRlcnMoYm9vbGVhbltdIGFscmVhZHlGb3VuZEFkZHJIZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZXNwYWNlKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgaWYgKEZpbmFsLldTQV9OQU1FU1BBQ0UuZXF1YWxzKG5hbWVzcGFjZSkpIHsKLSAgICAgICAgICAgIC8vVW5hYmxlIHRvIHZhbGlkYXRlIHRoZSB3c2E6TWVzc2FnZUlEIGhlYWRlciBoZXJlIGFzIHdlIGRvIG5vdCB5ZXQga25vdyB3aGljaCBNRVAKLSAgICAgICAgICAgIC8vaXMgaW4gZWZmZWN0LgotICAgICAgICAgICAgLy8gQHNlZSBBZGRyZXNzaW5nVmFsaWRhdGlvbkhhbmRsZXIjY2hlY2tNZXNzYWdlSURIZWFkZXIKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKCFhbHJlYWR5Rm91bmRBZGRySGVhZGVyW0FDVElPTl9GTEFHXSkgewotICAgICAgICAgICAgICAgIEFkZHJlc3NpbmdGYXVsdHNIZWxwZXIKLSAgICAgICAgICAgICAgICAudHJpZ2dlck1lc3NhZ2VBZGRyZXNzaW5nUmVxdWlyZWRGYXVsdChtZXNzYWdlQ29udGV4dCwgV1NBX0FDVElPTik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBpZiAoIWFscmVhZHlGb3VuZEFkZHJIZWFkZXJbVE9fRkxBR10pIHsKLSAgICAgICAgICAgICAgICBBZGRyZXNzaW5nRmF1bHRzSGVscGVyLnRyaWdnZXJNZXNzYWdlQWRkcmVzc2luZ1JlcXVpcmVkRmF1bHQobWVzc2FnZUNvbnRleHQsIFdTQV9UTyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghYWxyZWFkeUZvdW5kQWRkckhlYWRlcltBQ1RJT05fRkxBR10pIHsKLSAgICAgICAgICAgICAgICBBZGRyZXNzaW5nRmF1bHRzSGVscGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAudHJpZ2dlck1lc3NhZ2VBZGRyZXNzaW5nUmVxdWlyZWRGYXVsdChtZXNzYWdlQ29udGV4dCwgV1NBX0FDVElPTik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChhbHJlYWR5Rm91bmRBZGRySGVhZGVyW1JFUExZVE9fRkxBR10gfHwKLSAgICAgICAgICAgICAgICAgICAgYWxyZWFkeUZvdW5kQWRkckhlYWRlcltGQVVMVE9fRkxBR10pIHsKLQotICAgICAgICAgICAgICAgIGlmICghYWxyZWFkeUZvdW5kQWRkckhlYWRlcltNRVNTQUdFSURfRkxBR10pIHsKLSAgICAgICAgICAgICAgICAgICAgQWRkcmVzc2luZ0ZhdWx0c0hlbHBlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50cmlnZ2VyTWVzc2FnZUFkZHJlc3NpbmdSZXF1aXJlZEZhdWx0KG1lc3NhZ2VDb250ZXh0LCBXU0FfTUVTU0FHRV9JRCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNldERlZmF1bHRzKGJvb2xlYW5bXSBhbHJlYWR5Rm91bmRBZGRySGVhZGVyLCBNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCwgU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICBpZiAoRmluYWwuV1NBX05BTUVTUEFDRS5lcXVhbHMobmFtZXNwYWNlKSkgewotICAgICAgICAgICAgLy9BY2NvcmRpbmcgdG8gdGhlIFdTLUFkZHJlc3Npbmcgc3BlYywgd2Ugc2hvdWxkIGRlZmF1bHQgdGhlIHdzYTpUbyBoZWFkZXIgdG8gdGhlCi0gICAgICAgICAgICAvL2Fub255bW91cyBVUkkuIERvaW5nIHRoYXQsIGhvd2V2ZXIsIG1pZ2h0IHByZXZlbnQgYSBkaWZmZXJlbnQgdmFsdWUgZnJvbSBiZWluZwotICAgICAgICAgICAgLy91c2VkIGluc3RlYWQsIHN1Y2ggYXMgdGhlIHRyYW5zcG9ydCBVUkwuIFRoZXJlZm9yZSwgd2Ugb25seSBhcHBseSB0aGUgZGVmYXVsdAotICAgICAgICAgICAgLy9vbiB0aGUgaW5ib3VuZCByZXNwb25zZSBzaWRlIG9mIGEgc3luY2hyb25vdXMgcmVxdWVzdC1yZXNwb25zZSBleGNoYW5nZS4KLSAgICAgICAgICAgIGlmICghYWxyZWFkeUZvdW5kQWRkckhlYWRlcltUT19GTEFHXSAmJiAhbWVzc2FnZUNvbnRleHQuaXNTZXJ2ZXJTaWRlKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoTG9nZ2luZ0NvbnRyb2wuZGVidWdMb2dnaW5nQWxsb3dlZCAmJiBsb2cuaXNUcmFjZUVuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cudHJhY2UobWVzc2FnZUNvbnRleHQuZ2V0TG9nSURTdHJpbmcoKSArCi0gICAgICAgICAgICAgICAgICAgICIgc2V0RGVmYXVsdHM6IFNldHRpbmcgV1MtQWRkcmVzc2luZyBkZWZhdWx0IHZhbHVlIGZvciB0aGUgVG8gcHJvcGVydHkuIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1lc3NhZ2VDb250ZXh0LnNldFRvKG5ldyBFbmRwb2ludFJlZmVyZW5jZShGaW5hbC5XU0FfQU5PTllNT1VTX1VSTCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoIWFscmVhZHlGb3VuZEFkZHJIZWFkZXJbUkVQTFlUT19GTEFHXSkgewotICAgICAgICAgICAgICAgIG1lc3NhZ2VDb250ZXh0LnNldFJlcGx5VG8obmV3IEVuZHBvaW50UmVmZXJlbmNlKEZpbmFsLldTQV9BTk9OWU1PVVNfVVJMKSk7Ci0gICAgICAgICAgICAgICAgaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQgJiYgbG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLnRyYWNlKG1lc3NhZ2VDb250ZXh0LmdldExvZ0lEU3RyaW5nKCkgKwotICAgICAgICAgICAgICAgICAgICAiIHNldERlZmF1bHRzOiBTZXR0aW5nIFdTLUFkZHJlc3NpbmcgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIFJlcGx5VG8gcHJvcGVydHkuIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgLy9UaGUgbm9uZSBVUkkgaXMgbm90IGRlZmluZWQgaW4gdGhlIDIwMDQvMDggc3BlYywgYnV0IGl0IGlzIHVzZWQgaGVyZSBhbnl3YXkKLSAgICAgICAgICAgIC8vYXMgYSBmbGFnIHRvIGluZGljYXRlIHRoZSBjb3JyZWN0IHNlbWFudGljcyB0byBhcHBseSwgaS5lLiBpbiB0aGUgMjAwNC8wOCBzcGVjCi0gICAgICAgICAgICAvL3RoZSBhYnNlbmNlIG9mIGEgUmVwbHlUbyBoZWFkZXIgaW5kaWNhdGVzIHRoYXQgYSByZXNwb25zZSBpcyBOT1QgcmVxdWlyZWQuCi0gICAgICAgICAgICBpZiAoIWFscmVhZHlGb3VuZEFkZHJIZWFkZXJbUkVQTFlUT19GTEFHXSkgewotICAgICAgICAgICAgICAgIG1lc3NhZ2VDb250ZXh0LnNldFJlcGx5VG8obmV3IEVuZHBvaW50UmVmZXJlbmNlKEZpbmFsLldTQV9OT05FX1VSSSkpOwotICAgICAgICAgICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkICYmIGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy50cmFjZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2V0RGVmYXVsdHM6IFNldHRpbmcgV1MtQWRkcmVzc2luZyBkZWZhdWx0IHZhbHVlIGZvciB0aGUgUmVwbHlUbyBwcm9wZXJ0eS4iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9ICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tEdXBsaWNhdGVIZWFkZXJzKFN0cmluZyBhZGRyZXNzaW5nSGVhZGVyTmFtZSwgaW50IGhlYWRlckZsYWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuW10gY2hlY2tlZEhlYWRlck5hbWVzLCBib29sZWFuW10gaWdub3JlSGVhZGVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5TGlzdCBkdXBsaWNhdGVIZWFkZXJOYW1lcykgey8vdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIC8vIElmIHRoZSBoZWFkZXIgbmFtZSBoYXMgYmVlbiBzZWVuIGJlZm9yZSB0aGVuIHdlIHNob3VsZCByZXR1cm4gdHJ1ZSBhbmQgYWRkIGl0IHRvIHRoZSBsaXN0Ci0gICAgICAgIC8vIG9mIGR1cGxpY2F0ZSBoZWFkZXIgbmFtZXMuIE90aGVyd2lzZSBpdCBpcyB0aGUgZmlyc3QgdGltZSB3ZSd2ZSBzZWVuIHRoZSBoZWFkZXIgc28gYWRkIGl0Ci0gICAgICAgIC8vIHRvIHRoZSBjaGVja2VkIGxpYXQgYW5kIHJldHVybiBmYWxzZS4KLSAgICAgICAgaWdub3JlSGVhZGVyc1toZWFkZXJGbGFnXSA9IGNoZWNrZWRIZWFkZXJOYW1lc1toZWFkZXJGbGFnXTsKLSAgICAgICAgaWYgKGlnbm9yZUhlYWRlcnNbaGVhZGVyRmxhZ10pIHsKLSAgICAgICAgICAgIGR1cGxpY2F0ZUhlYWRlck5hbWVzLmFkZChhZGRyZXNzaW5nSGVhZGVyTmFtZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjaGVja2VkSGVhZGVyTmFtZXNbaGVhZGVyRmxhZ10gPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQgJiYgbG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy50cmFjZSgiY2hlY2tEdXBsaWNhdGVIZWFkZXJzOiBhZGRyZXNzaW5nSGVhZGVyTmFtZT0iICsgYWRkcmVzc2luZ0hlYWRlck5hbWUKLSAgICAgICAgICAgICAgICAgICAgICArICIgaXNEdXBsaWNhdGU9IiArIGlnbm9yZUhlYWRlcnNbaGVhZGVyRmxhZ10pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGV4dHJhY3RSZWxhdGVzVG9JbmZvcm1hdGlvbihTT0FQSGVhZGVyQmxvY2sgc29hcEhlYWRlckJsb2NrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9ucyBtZXNzYWdlQ29udGV4dE9wdGlvbnMpIHsKLSAgICAgICAgU3RyaW5nIGFkZHJlc3MgPSBzb2FwSGVhZGVyQmxvY2suZ2V0VGV4dCgpOwotCi0gICAgICAgIC8vIEV4dHJhY3QgdGhlIFJlbGF0aW9uc2hpcFR5cGUgYXR0cmlidXRlIGlmIGl0IGV4aXN0cwotICAgICAgICBPTUF0dHJpYnV0ZSByZWxhdGlvbnNoaXBUeXBlID0KLSAgICAgICAgICAgICAgICBzb2FwSGVhZGVyQmxvY2suZ2V0QXR0cmlidXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFFOYW1lKEFkZHJlc3NpbmdDb25zdGFudHMuV1NBX1JFTEFURVNfVE9fUkVMQVRJT05TSElQX1RZUEUpKTsKLQotICAgICAgICBTdHJpbmcgcmVsYXRpb25zaGlwVHlwZVN0cmluZyA9Ci0gICAgICAgICAgICAgICAgcmVsYXRpb25zaGlwVHlwZSA9PSBudWxsID8gbnVsbCA6IHJlbGF0aW9uc2hpcFR5cGUuZ2V0QXR0cmlidXRlVmFsdWUoKTsKLQotICAgICAgICBpZiAoTG9nZ2luZ0NvbnRyb2wuZGVidWdMb2dnaW5nQWxsb3dlZCAmJiBsb2cuaXNUcmFjZUVuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLnRyYWNlKCJleHRyYWN0UmVsYXRlc1RvSW5mb3JtYXRpb246IEV4dHJhY3RlZCBSZWxhdGlvbnNoaXAuIFZhbHVlPSIgKyBhZGRyZXNzICsKLSAgICAgICAgICAgICAgICAgICAgICAiIFJlbGF0aW9uc2hpcFR5cGU9IiArIHJlbGF0aW9uc2hpcFR5cGVTdHJpbmcpOwotICAgICAgICB9Ci0KLSAgICAgICAgUmVsYXRlc1RvIHJlbGF0ZXNUbyA9IG5ldyBSZWxhdGVzVG8oYWRkcmVzcywgcmVsYXRpb25zaGlwVHlwZVN0cmluZyk7Ci0KLSAgICAgICAgQXJyYXlMaXN0IGF0dHJpYnV0ZXMgPSBleHRyYWN0QXR0cmlidXRlc0Zyb21TT0FQSGVhZGVyQmxvY2soc29hcEhlYWRlckJsb2NrKTsKLSAgICAgICAgcmVsYXRlc1RvLnNldEV4dGVuc2liaWxpdHlBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpOwotCi0gICAgICAgIG1lc3NhZ2VDb250ZXh0T3B0aW9ucy5hZGRSZWxhdGVzVG8ocmVsYXRlc1RvKTsKLQotICAgICAgICAvLyBDb21wbGV0ZWQgcHJvY2Vzc2luZyBvZiB0aGlzIGhlYWRlcgotICAgICAgICBzb2FwSGVhZGVyQmxvY2suc2V0UHJvY2Vzc2VkKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGV4dHJhY3RGYXVsdFRvRVBSSW5mb3JtYXRpb24oU09BUEhlYWRlckJsb2NrIHNvYXBIZWFkZXJCbG9jaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYWRkcmVzc2luZ05hbWVzcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIE9wdGlvbnMgbWVzc2FnZUNvbnRleHRPcHRpb25zID0gbWVzc2FnZUNvbnRleHQuZ2V0T3B0aW9ucygpOwotICAgICAgICBFbmRwb2ludFJlZmVyZW5jZSBlcHIgPSBtZXNzYWdlQ29udGV4dE9wdGlvbnMuZ2V0RmF1bHRUbygpOwotICAgICAgICBpZiAoZXByID09IG51bGwpIHsKLSAgICAgICAgICAgIGVwciA9IG5ldyBFbmRwb2ludFJlZmVyZW5jZSgiIik7Ci0gICAgICAgICAgICBtZXNzYWdlQ29udGV4dE9wdGlvbnMuc2V0RmF1bHRUbyhlcHIpOwotICAgICAgICB9Ci0gICAgICAgIGV4dHJhY3RFUFJJbmZvcm1hdGlvbihzb2FwSGVhZGVyQmxvY2ssIGVwciwgYWRkcmVzc2luZ05hbWVzcGFjZSwgbWVzc2FnZUNvbnRleHQpOwotICAgICAgICBpZiAoTG9nZ2luZ0NvbnRyb2wuZGVidWdMb2dnaW5nQWxsb3dlZCAmJiBsb2cuaXNUcmFjZUVuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLnRyYWNlKCJleHRyYWN0RmF1bHRUb0VQUkluZm9ybWF0aW9uOiBFeHRyYWN0ZWQgRmF1bHRUbyBFUFI6ICIgKyBlcHIpOwotICAgICAgICB9Ci0gICAgICAgIHNvYXBIZWFkZXJCbG9jay5zZXRQcm9jZXNzZWQoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZXh0cmFjdFJlcGx5VG9FUFJJbmZvcm1hdGlvbihTT0FQSGVhZGVyQmxvY2sgc29hcEhlYWRlckJsb2NrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhZGRyZXNzaW5nTmFtZXNwYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgT3B0aW9ucyBtZXNzYWdlQ29udGV4dE9wdGlvbnMgPSBtZXNzYWdlQ29udGV4dC5nZXRPcHRpb25zKCk7Ci0gICAgICAgIEVuZHBvaW50UmVmZXJlbmNlIGVwciA9IG1lc3NhZ2VDb250ZXh0T3B0aW9ucy5nZXRSZXBseVRvKCk7Ci0gICAgICAgIGlmIChlcHIgPT0gbnVsbCkgewotICAgICAgICAgICAgZXByID0gbmV3IEVuZHBvaW50UmVmZXJlbmNlKCIiKTsKLSAgICAgICAgICAgIG1lc3NhZ2VDb250ZXh0T3B0aW9ucy5zZXRSZXBseVRvKGVwcik7Ci0gICAgICAgIH0KLSAgICAgICAgZXh0cmFjdEVQUkluZm9ybWF0aW9uKHNvYXBIZWFkZXJCbG9jaywgZXByLCBhZGRyZXNzaW5nTmFtZXNwYWNlLCBtZXNzYWdlQ29udGV4dCk7Ci0gICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkICYmIGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cudHJhY2UoImV4dHJhY3RSZXBseVRvRVBSSW5mb3JtYXRpb246IEV4dHJhY3RlZCBSZXBseVRvIEVQUjogIiArIGVwcik7Ci0gICAgICAgIH0KLSAgICAgICAgc29hcEhlYWRlckJsb2NrLnNldFByb2Nlc3NlZCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBleHRyYWN0RnJvbUVQUkluZm9ybWF0aW9uKFNPQVBIZWFkZXJCbG9jayBzb2FwSGVhZGVyQmxvY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGFkZHJlc3NpbmdOYW1lc3BhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBPcHRpb25zIG1lc3NhZ2VDb250ZXh0T3B0aW9ucyA9IG1lc3NhZ2VDb250ZXh0LmdldE9wdGlvbnMoKTsKLSAgICAgICAgRW5kcG9pbnRSZWZlcmVuY2UgZXByID0gbWVzc2FnZUNvbnRleHRPcHRpb25zLmdldEZyb20oKTsKLSAgICAgICAgaWYgKGVwciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBlcHIgPSBuZXcgRW5kcG9pbnRSZWZlcmVuY2UoCi0gICAgICAgICAgICAgICAgICAgICIiKTsgIC8vIEkgZG9uJ3Qga25vdyB0aGUgYWRkcmVzcyBub3cuIExldCBtZSBwYXNzIHRoZSBlbXB0eSBzdHJpbmcgbm93IGFuZCBmaWxsIHRoaXMKLSAgICAgICAgICAgIC8vIG9uY2UgSSBwcm9jZXNzIHRoZSBFbGVtZW50cyB1bmRlciB0aGlzLgotICAgICAgICAgICAgbWVzc2FnZUNvbnRleHRPcHRpb25zLnNldEZyb20oZXByKTsKLSAgICAgICAgfQotICAgICAgICBleHRyYWN0RVBSSW5mb3JtYXRpb24oc29hcEhlYWRlckJsb2NrLCBlcHIsIGFkZHJlc3NpbmdOYW1lc3BhY2UsIG1lc3NhZ2VDb250ZXh0KTsKLSAgICAgICAgaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQgJiYgbG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy50cmFjZSgiZXh0cmFjdEZyb21FUFJJbmZvcm1hdGlvbjogRXh0cmFjdGVkIEZyb20gRVBSOiAiICsgZXByKTsKLSAgICAgICAgfQotICAgICAgICBzb2FwSGVhZGVyQmxvY2suc2V0UHJvY2Vzc2VkKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGV4dHJhY3RUb0VQUkluZm9ybWF0aW9uKFNPQVBIZWFkZXJCbG9jayBzb2FwSGVhZGVyQmxvY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbnMgbWVzc2FnZUNvbnRleHRPcHRpb25zLCBTdHJpbmcgbmFtZXNwYWNlKSB7Ci0KLSAgICAgICAgRW5kcG9pbnRSZWZlcmVuY2UgZXByOwotICAgICAgICAvL2hlcmUgdGhlIGFkZHJlc3NpbmcgZXByIG92ZXJpZGRlIHdoYXQgZXZlciBhbHJlYWR5IHRoZXJlIGluIHRoZSBtZXNzYWdlIGNvbnRleHQKLSAgICAgICAgZXByID0gbmV3IEVuZHBvaW50UmVmZXJlbmNlKHNvYXBIZWFkZXJCbG9jay5nZXRUZXh0KCkpOwotICAgICAgICBtZXNzYWdlQ29udGV4dE9wdGlvbnMuc2V0VG8oZXByKTsKLQotICAgICAgICAvLyBjaGVjayBmb3IgYWRkcmVzcyBhdHRyaWJ1dGVzCi0gICAgICAgIEl0ZXJhdG9yIGFkZHJlc3NBdHRyaWJ1dGVzID0gc29hcEhlYWRlckJsb2NrLmdldEFsbEF0dHJpYnV0ZXMoKTsKLSAgICAgICAgaWYgKGFkZHJlc3NBdHRyaWJ1dGVzICE9IG51bGwgJiYgYWRkcmVzc0F0dHJpYnV0ZXMuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBBcnJheUxpc3QgYXR0cmlidXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgIHdoaWxlIChhZGRyZXNzQXR0cmlidXRlcy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBPTUF0dHJpYnV0ZSBhdHRyID0gKE9NQXR0cmlidXRlKSBhZGRyZXNzQXR0cmlidXRlcy5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgYXR0cmlidXRlcy5hZGQoYXR0cik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlcHIuc2V0QWRkcmVzc0F0dHJpYnV0ZXMoYXR0cmlidXRlcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBzb2FwSGVhZGVyQmxvY2suc2V0UHJvY2Vzc2VkKCk7Ci0KLSAgICAgICAgaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQgJiYgbG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy50cmFjZSgiZXh0cmFjdFRvRVBSSW5mb3JtYXRpb246IEV4dHJhY3RlZCBUbyBFUFI6ICIgKyBlcHIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGV4dHJhY3RUb0VwclJlZmVyZW5jZVBhcmFtZXRlcnMoRW5kcG9pbnRSZWZlcmVuY2UgdG9FUFIsIFNPQVBIZWFkZXIgaGVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICBpZiAoRmluYWwuV1NBX05BTUVTUEFDRS5lcXVhbHMobmFtZXNwYWNlKSkgewotICAgICAgICAgICAgSXRlcmF0b3IgaGVhZGVyQmxvY2tzID0gaGVhZGVyLmdldENoaWxkRWxlbWVudHMoKTsKLSAgICAgICAgICAgIHdoaWxlIChoZWFkZXJCbG9ja3MuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgT01FbGVtZW50IGhlYWRlckVsZW1lbnQgPSAoT01FbGVtZW50KWhlYWRlckJsb2Nrcy5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgT01BdHRyaWJ1dGUgaXNSZWZQYXJhbUF0dHIgPQotICAgICAgICAgICAgICAgICAgICBoZWFkZXJFbGVtZW50LmdldEF0dHJpYnV0ZShuZXcgUU5hbWUobmFtZXNwYWNlLCAiSXNSZWZlcmVuY2VQYXJhbWV0ZXIiKSk7Ci0gICAgICAgICAgICAgICAgaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQgJiYgbG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLnRyYWNlKCJleHRyYWN0VG9FcHJSZWZlcmVuY2VQYXJhbWV0ZXJzOiBDaGVja2luZyBoZWFkZXI6ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlckVsZW1lbnQuZ2V0UU5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChpc1JlZlBhcmFtQXR0ciAhPSBudWxsICYmICJ0cnVlIi5lcXVhbHMoaXNSZWZQYXJhbUF0dHIuZ2V0QXR0cmlidXRlVmFsdWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgdG9FUFIuYWRkUmVmZXJlbmNlUGFyYW1ldGVyKGhlYWRlckVsZW1lbnQpOwotICAgICAgICAgICAgICAgICAgICBpZiAoTG9nZ2luZ0NvbnRyb2wuZGVidWdMb2dnaW5nQWxsb3dlZCAmJiBsb2cuaXNUcmFjZUVuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLnRyYWNlKCJleHRyYWN0VG9FcHJSZWZlcmVuY2VQYXJhbWV0ZXJzOiBIZWFkZXI6ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJFbGVtZW50LmdldFFOYW1lKCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgIiBoYXMgSXNSZWZlcmVuY2VQYXJhbWV0ZXIgYXR0cmlidXRlLiBBZGRpbmcgdG8gdG9FUFIuIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAvLyB0aGVyZSBpcyBubyBleGFjdCB3YXkgdG8gaWRlbnRpZnkgcmVmIHBhcmFtZXRlcnMgZm9yIFN1Ym1pc3Npb24gdmVyc2lvbi4gU28gbGV0J3MgaGF2ZSBhIGhhbmRsZXIKLSAgICAgICAgICAgIC8vIGF0IHRoZSBlbmQgb2YgdGhlIGZsb3csIHdoaWNoIHB1dHMgYWxsIHRoZSBoYW5kbGVycyAod2hpY2ggYXJlIG9mIGNvdXJzZSBtdXN0VW5kZXJzdGFuZD1mYWxzZSkKLSAgICAgICAgICAgIC8vIGFzIHJlZmVyZW5jZSBwYXJhbWV0ZXJzCi0KLSAgICAgICAgICAgIC8vIFRPRE8gOiBDaGludGhha2EKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vV2UgYXNzdW1lIHRoYXQgYW55IGFjdGlvbiB0aGF0IGFscmVhZHkgZXhpc3RzIGluIHRoZSBtZXNzYWdlIGNvbnRleHQgbXVzdCBiZSB0aGUKLSAgICAvL3NvYXBhY3Rpb24uIFdlIGNvbXBhcmUgdGhhdCBhY3Rpb24gdG8gdGhlIFdTLUFkZHJlc3NpbmcgYWN0aW9uLCBhbmQgaWYgdGhleSBhcmUKLSAgICAvL2RpZmZlcmVudCB3ZSB0aHJvdyBhIGZhdWx0LgotICAgIHByaXZhdGUgdm9pZCBleHRyYWN0QWN0aW9uSW5mb3JtYXRpb24oU09BUEhlYWRlckJsb2NrIHNvYXBIZWFkZXJCbG9jaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0KQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIE9wdGlvbnMgbWVzc2FnZUNvbnRleHRPcHRpb25zID0gbWVzc2FnZUNvbnRleHQuZ2V0T3B0aW9ucygpOwotICAgICAgICBTdHJpbmcgc29hcEFjdGlvbiA9IG1lc3NhZ2VDb250ZXh0T3B0aW9ucy5nZXRBY3Rpb24oKTsKLSAgICAgICAgU3RyaW5nIHdzYUFjdGlvbiA9IHNvYXBIZWFkZXJCbG9jay5nZXRUZXh0KCk7Ci0KLSAgICAgICAgaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQgJiYgbG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy50cmFjZSgiZXh0cmFjdEFjdGlvbkluZm9ybWF0aW9uOiBzb2FwQWN0aW9uPSciICsgc29hcEFjdGlvbiArICInIHdzYTpBY3Rpb249JyIgKwotICAgICAgICAgICAgICAgICAgICAgIHdzYUFjdGlvbiArICInIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBOZWVkIHRvIHZhbGlkYXRlIHRoYXQgdGhlIGNvbnRlbnQgb2YgdGhlIHdzYTpBY3Rpb24gaGVhZGVyIGlzIG5vdCBudWxsIG9yIHdoaXRlc3BhY2UKLSAgICAgICAgaWYgKCh3c2FBY3Rpb24gPT0gbnVsbCkgfHwgIiIuZXF1YWxzKHdzYUFjdGlvbi50cmltKCkpKSB7Ci0gICAgICAgICAgICBBZGRyZXNzaW5nRmF1bHRzSGVscGVyLnRyaWdnZXJBY3Rpb25Ob3RTdXBwb3J0ZWRGYXVsdChtZXNzYWdlQ29udGV4dCwgd3NhQWN0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFRoZSBpc1NlcnZlclNpZGUgY2hlY2sgaXMgYmVjYXVzZSB0aGUgdW5kZXJseWluZyBPcHRpb25zIG9iamVjdCBpcwotICAgICAgICAvLyBzaGFyZWQgYmV0d2VlbiByZXF1ZXN0IGFuZCByZXNwb25zZSBNZXNzYWdlQ29udGV4dHMgZm9yIFN5bmMKLSAgICAgICAgLy8gaW52b2NhdGlvbnMuIElmIHRoZSBzb2FwQWN0aW9uIGlzIHNldCBvdXRib3VuZCBhbmQgYSB3c2E6QWN0aW9uIGlzCi0gICAgICAgIC8vIHJlY2VpdmVkIG9uIHRoZSByZXNwb25zZSB0aGV5IHdpbGwgZGlmZmVyIChiZWNhdXNlIHRoZXJlIGlzIG5vCi0gICAgICAgIC8vIFNPQVBBY3Rpb24gaGVhZGVyIG9uIGFuIEhUVFAgcmVzcG9uc2UpLiBJbiB0aGlzIGNhc2Ugd2Ugc2hvdWxkIG5vdAotICAgICAgICAvLyBjaGVjayB0aGF0IHNvYXBBY3Rpb249PXdzYTpBY3Rpb24KLSAgICAgICAgaWYgKHNvYXBBY3Rpb24gIT0gbnVsbCAmJiAhIiIuZXF1YWxzKHNvYXBBY3Rpb24pICYmIG1lc3NhZ2VDb250ZXh0LmlzU2VydmVyU2lkZSgpKSB7Ci0gICAgICAgICAgICBpZiAoIXNvYXBBY3Rpb24uZXF1YWxzKHdzYUFjdGlvbikpIHsKLSAgICAgICAgICAgICAgICBBZGRyZXNzaW5nRmF1bHRzSGVscGVyLnRyaWdnZXJBY3Rpb25NaXNtYXRjaEZhdWx0KG1lc3NhZ2VDb250ZXh0LCBzb2FwQWN0aW9uLCB3c2FBY3Rpb24pOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbWVzc2FnZUNvbnRleHRPcHRpb25zLnNldEFjdGlvbih3c2FBY3Rpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgQXJyYXlMaXN0IGF0dHJpYnV0ZXMgPSBleHRyYWN0QXR0cmlidXRlc0Zyb21TT0FQSGVhZGVyQmxvY2soc29hcEhlYWRlckJsb2NrKTsKLSAgICAgICAgaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgbWVzc2FnZUNvbnRleHQuc2V0UHJvcGVydHkoQWRkcmVzc2luZ0NvbnN0YW50cy5BQ1RJT05fQVRUUklCVVRFUywgYXR0cmlidXRlcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBzb2FwSGVhZGVyQmxvY2suc2V0UHJvY2Vzc2VkKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGV4dHJhY3RNZXNzYWdlSURJbmZvcm1hdGlvbihTT0FQSGVhZGVyQmxvY2sgc29hcEhlYWRlckJsb2NrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBtZXNzYWdlQ29udGV4dC5nZXRPcHRpb25zKCkuc2V0TWVzc2FnZUlkKHNvYXBIZWFkZXJCbG9jay5nZXRUZXh0KCkpOwotCi0gICAgICAgIEFycmF5TGlzdCBhdHRyaWJ1dGVzID0gZXh0cmFjdEF0dHJpYnV0ZXNGcm9tU09BUEhlYWRlckJsb2NrKHNvYXBIZWFkZXJCbG9jayk7Ci0gICAgICAgIGlmIChhdHRyaWJ1dGVzICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1lc3NhZ2VDb250ZXh0LnNldFByb3BlcnR5KEFkZHJlc3NpbmdDb25zdGFudHMuTUVTU0FHRUlEX0FUVFJJQlVURVMsIGF0dHJpYnV0ZXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgc29hcEhlYWRlckJsb2NrLnNldFByb2Nlc3NlZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdpdmVuIHRoZSBzb2FwIGhlYWRlciBibG9jaywgdGhpcyBzaG91bGQgZXh0cmFjdCB0aGUgaW5mb3JtYXRpb24gd2l0aGluIEVQUi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBoZWFkZXJCbG9jayAgICAgICAgIGEgU09BUCBoZWFkZXIgd2hpY2ggaXMgb2YgdHlwZSBFbmRwb2ludFJlZmVyZW5jZQotICAgICAqIEBwYXJhbSBlcHIgICAgICAgICAgICAgICAgIHRoZSBFbmRwb2ludFJlZmVyZW5jZSB0byBmaWxsIGluIHdpdGggdGhlIGV4dHJhY3RlZCBkYXRhCi0gICAgICogQHBhcmFtIGFkZHJlc3NpbmdOYW1lc3BhY2UgdGhlIFdTQSBuYW1lc3BhY2UgVVJJCi0gICAgICogQHBhcmFtIG1lc3NhZ2VDb250ZXh0ICAgICAgdGhlIGFjdGl2ZSBNZXNzYWdlQ29udGV4dAotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0IGlmIHRoZXJlIGlzIGEgcHJvYmxlbQotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBleHRyYWN0RVBSSW5mb3JtYXRpb24oU09BUEhlYWRlckJsb2NrIGhlYWRlckJsb2NrLCBFbmRwb2ludFJlZmVyZW5jZSBlcHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYWRkcmVzc2luZ05hbWVzcGFjZSwgTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQpCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9IG51bGw7Ci0gICAgICAgIAotICAgICAgICB0cnkgewotICAgICAgICAgICAgbmFtZXNwYWNlID0gRW5kcG9pbnRSZWZlcmVuY2VIZWxwZXIuZnJvbU9NKGVwciwgaGVhZGVyQmxvY2spOyAgICAgICAgICAgIAotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgYWYpIHsKLSAgICAgICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkICYmIGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLnRyYWNlKAotICAgICAgICAgICAgICAgICAgICAgICAgImV4dHJhY3RFUFJJbmZvcm1hdGlvbjogRXhjZXB0aW9uIG9jY3VycmVkIGRlc2VyaWFsaXNpbmcgYW4gRW5kcG9pbnRSZWZlcmVuY2UuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGFmKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFkZHJlc3NpbmdGYXVsdHNIZWxwZXIKLSAgICAgICAgICAgICAgICAgICAgLnRyaWdnZXJNaXNzaW5nQWRkcmVzc0luRVBSRmF1bHQobWVzc2FnZUNvbnRleHQsIGhlYWRlckJsb2NrLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy9DaGVjayB0aGF0IHRoZSBFUFIgaGFzIHRoZSBjb3JyZWN0IG5hbWVzcGFjZS4KLSAgICAgICAgaWYgKCFuYW1lc3BhY2UuZXF1YWxzKGFkZHJlc3NpbmdOYW1lc3BhY2UpKSB7Ci0gICAgICAgICAgICBpZiAoTG9nZ2luZ0NvbnRyb2wuZGVidWdMb2dnaW5nQWxsb3dlZCAmJiBsb2cuaXNUcmFjZUVuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy50cmFjZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJleHRyYWN0RVBSSW5mb3JtYXRpb246IEFkZHJlc3NpbmcgbmFtZXNwYWNlID0gIiArIGFkZHJlc3NpbmdOYW1lc3BhY2UgKwotICAgICAgICAgICAgICAgICAgICAgICAgIiwgRVBSIG5hbWVzcGFjZSA9ICIgKyBuYW1lc3BhY2UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQWRkcmVzc2luZ0ZhdWx0c0hlbHBlcgotICAgICAgICAgICAgICAgICAgICAudHJpZ2dlckludmFsaWRFUFJGYXVsdChtZXNzYWdlQ29udGV4dCwgaGVhZGVyQmxvY2suZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBBcnJheUxpc3QgZXh0cmFjdEF0dHJpYnV0ZXNGcm9tU09BUEhlYWRlckJsb2NrKFNPQVBIZWFkZXJCbG9jayBzb2FwSGVhZGVyQmxvY2spIHsKLSAgICAgICAgSXRlcmF0b3IgYWN0aW9uQXR0cmlidXRlcyA9IHNvYXBIZWFkZXJCbG9jay5nZXRBbGxBdHRyaWJ1dGVzKCk7Ci0gICAgICAgIGlmIChhY3Rpb25BdHRyaWJ1dGVzICE9IG51bGwgJiYgYWN0aW9uQXR0cmlidXRlcy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIEFycmF5TGlzdCBhdHRyaWJ1dGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgd2hpbGUgKGFjdGlvbkF0dHJpYnV0ZXMuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgT01BdHRyaWJ1dGUgYXR0ciA9IChPTUF0dHJpYnV0ZSkgYWN0aW9uQXR0cmlidXRlcy5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgYXR0cmlidXRlcy5hZGQoYXR0cik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gYXR0cmlidXRlczsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGRyZXNzaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2hhbmRsZXJzL2FkZHJlc3NpbmcvQWRkcmVzc2luZ091dEhhbmRsZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkZHJlc3Npbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvaGFuZGxlcnMvYWRkcmVzc2luZy9BZGRyZXNzaW5nT3V0SGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjBmZTk4Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkZHJlc3Npbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvaGFuZGxlcnMvYWRkcmVzc2luZy9BZGRyZXNzaW5nT3V0SGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjI5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5oYW5kbGVycy5hZGRyZXNzaW5nOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5BdHRyaWJ1dGVIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS51dGlsLkVsZW1lbnRIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS51dGlsLlVVSURHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEhlYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEhlYWRlckJsb2NrOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5BZGRyZXNzaW5nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5BZGRyZXNzaW5nRmF1bHRzSGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLlJlbGF0ZXNUbzsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuaTE4bi5BZGRyZXNzaW5nTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuT3B0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzRW5kcG9pbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkhhbmRsZXJEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmhhbmRsZXJzLkFic3RyYWN0SGFuZGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuSmF2YVV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5Mb2dnaW5nQ29udHJvbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLXB1YmxpYyBjbGFzcyBBZGRyZXNzaW5nT3V0SGFuZGxlciBleHRlbmRzIEFic3RyYWN0SGFuZGxlciBpbXBsZW1lbnRzIEFkZHJlc3NpbmdDb25zdGFudHMgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEFkZHJlc3NpbmdPdXRIYW5kbGVyLmNsYXNzKTsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBpbmNsdWRlT3B0aW9uYWxIZWFkZXJzOwotICAgIHByaXZhdGUgYm9vbGVhbiBkaXNhYmxlQWRkcmVzc2luZzsKLQotICAgIHB1YmxpYyB2b2lkIGluaXQoSGFuZGxlckRlc2NyaXB0aW9uIGFyZzApIHsKLSAgICAgICAgc3VwZXIuaW5pdChhcmcwKTsKLQotICAgICAgICAvL0RldGVybWluZSB3aGV0aGVyIHRvIGluY2x1ZGUgb3B0aW9uYWwgYWRkcmVzc2luZyBoZWFkZXJzIGluIHRoZSBvdXRwdXQgbWVzc2FnZS4KLSAgICAgICAgLy9UaGUgZGVmYXVsdCBpcyBub3QgdG8gaW5jbHVkZSBhbnkgaGVhZGVycyB0aGF0IGNhbiBiZSBzYWZlbHkgb21pdHRlZC4KLSAgICAgICAgUGFyYW1ldGVyIHBhcmFtID0gYXJnMC5nZXRQYXJhbWV0ZXIoSU5DTFVERV9PUFRJT05BTF9IRUFERVJTKTsKLSAgICAgICAgU3RyaW5nIHZhbHVlID0gVXRpbHMuZ2V0UGFyYW1ldGVyVmFsdWUocGFyYW0pOwotICAgICAgICBpbmNsdWRlT3B0aW9uYWxIZWFkZXJzID0gSmF2YVV0aWxzLmlzVHJ1ZUV4cGxpY2l0bHkodmFsdWUpOwotCi0gICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkICYmIGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoImluY2x1ZGVPcHRpb25hbEhlYWRlcnM9IiArIGluY2x1ZGVPcHRpb25hbEhlYWRlcnMpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy9EZXRlcm1pbmUgd2hldGhlciB0byBkaXNhYmxlIHRoZSBoYW5kbGVyIGJ5IGRlZmF1bHQuCi0gICAgICAgIHBhcmFtID0gYXJnMC5nZXRQYXJhbWV0ZXIoRElTQUJMRV9BRERSRVNTSU5HX0ZPUl9PVVRfTUVTU0FHRVMpOwotICAgICAgICB2YWx1ZSA9IFV0aWxzLmdldFBhcmFtZXRlclZhbHVlKHBhcmFtKTsKLSAgICAgICAgZGlzYWJsZUFkZHJlc3NpbmcgPSBKYXZhVXRpbHMuaXNUcnVlRXhwbGljaXRseSh2YWx1ZSk7Ci0KLSAgICAgICAgaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQgJiYgbG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiZGlzYWJsZUFkZHJlc3Npbmc9IiArIGRpc2FibGVBZGRyZXNzaW5nKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBJbnZvY2F0aW9uUmVzcG9uc2UgaW52b2tlKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICAvL2RldGVybWluZSB3aGV0aGVyIG91dGJvdW5kIGFkZHJlc3NpbmcgaGFzIGJlZW4gZGlzYWJsZWQgb3Igbm90LgotICAgICAgICBib29sZWFuIGRpc2FibGVBZGRyZXNzaW5nID0KLSAgICAgICAgICAgIG1zZ0NvbnRleHQuaXNQcm9wZXJ0eVRydWUoRElTQUJMRV9BRERSRVNTSU5HX0ZPUl9PVVRfTUVTU0FHRVMsIHRoaXMuZGlzYWJsZUFkZHJlc3NpbmcpOwotCi0gICAgICAgIGlmIChkaXNhYmxlQWRkcmVzc2luZykgewotICAgICAgICAgICAgaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQgJiYgbG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cudHJhY2UobXNnQ29udGV4dC5nZXRMb2dJRFN0cmluZygpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIgQWRkcmVzc2luZyBpcyBkaXNhYmxlZC4gTm90IGFkZGluZyBXUy1BZGRyZXNzaW5nIGhlYWRlcnMuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gSW52b2NhdGlvblJlc3BvbnNlLkNPTlRJTlVFOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gRGV0ZXJtaW5lIHRoZSBhZGRyZXNzaW4gbmFtZXNwYWNlIGluIGVmZmVjdC4KLSAgICAgICAgT2JqZWN0IGFkZHJlc3NpbmdWZXJzaW9uRnJvbUN1cnJlbnRNc2dDdHh0ID0gbXNnQ29udGV4dC5nZXRQcm9wZXJ0eShXU19BRERSRVNTSU5HX1ZFUlNJT04pOwotICAgICAgICBpZiAoTG9nZ2luZ0NvbnRyb2wuZGVidWdMb2dnaW5nQWxsb3dlZCAmJiBsb2cuaXNUcmFjZUVuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLnRyYWNlKCJBZGRyZXNzaW5nIHZlcnNpb24gc3RyaW5nIGZyb20gbWVzc2FnZUNvbnRleHQ9IiArCi0gICAgICAgICAgICAgICAgICAgIGFkZHJlc3NpbmdWZXJzaW9uRnJvbUN1cnJlbnRNc2dDdHh0KTsKLSAgICAgICAgfQotICAgICAgICBib29sZWFuIGlzU3VibWlzc2lvbk5hbWVzcGFjZSA9Ci0gICAgICAgICAgICAgICAgU3VibWlzc2lvbi5XU0FfTkFNRVNQQUNFLmVxdWFscyhhZGRyZXNzaW5nVmVyc2lvbkZyb21DdXJyZW50TXNnQ3R4dCk7Ci0KLSAgICAgICAgLy8gRGV0ZXJtaW5lIHdoZXRoZXIgdG8gaW5jbHVkZSBvcHRpb25hbCBhZGRyZXNzaW5nIGhlYWRlcnMgaW4gdGhlIG91dHB1dC4KLSAgICAgICAgYm9vbGVhbiBpbmNsdWRlT3B0aW9uYWxIZWFkZXJzID0KLSAgICAgICAgICAgIG1zZ0NvbnRleHQuaXNQcm9wZXJ0eVRydWUoSU5DTFVERV9PUFRJT05BTF9IRUFERVJTLCB0aGlzLmluY2x1ZGVPcHRpb25hbEhlYWRlcnMpOwotCi0gICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkICYmIGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoImluY2x1ZGVPcHRpb25hbEhlYWRlcnM9IiArIGluY2x1ZGVPcHRpb25hbEhlYWRlcnMpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gRGV0ZXJtaW5lIGlmIGEgTXVzdFVuZGVyc3RhbmQgYXR0cmlidXRlIHdpbGwgYmUgYWRkZWQgdG8gYWxsIGhlYWRlcnMgaW4gdGhlCi0gICAgICAgIC8vIGFkZHJlc3NpbmcgbmFtZXNwYWNlLgotICAgICAgICBib29sZWFuIGFkZE11c3RVbmRlcnN0YW5kQXR0cmlidXRlID0KLSAgICAgICAgICAgICAgICBtc2dDb250ZXh0LmlzUHJvcGVydHlUcnVlKEFERF9NVVNUX1VOREVSU1RBTkRfVE9fQUREUkVTU0lOR19IRUFERVJTKTsKLQotICAgICAgICAvLyB3aGF0IGlmIHRoZXJlIGFyZSBhZGRyZXNzaW5nIGhlYWRlcnMgYWxyZWFkeSBpbiB0aGUgbWVzc2FnZS4gRG8geW91IHJlcGxhY2UgdGhhdCBvciBub3Q/Ci0gICAgICAgIC8vIExldHMgaGF2ZSBhIHBhcmFtZXRlciB0byBjb250cm9sIHRoYXQuIFRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIHlvdSB3b24ndCByZXBsYWNlIGFkZHJlc3NpbmcKLSAgICAgICAgLy8gaGVhZGVycyBpZiB0aGVyZSBhcmUgYW55ICh0aGlzIHdhcyB0aGUgY2FzZSBzbyBmYXIpLgotICAgICAgICBib29sZWFuIHJlcGxhY2VIZWFkZXJzID0gbXNnQ29udGV4dC5pc1Byb3BlcnR5VHJ1ZShSRVBMQUNFX0FERFJFU1NJTkdfSEVBREVSUyk7Ci0gICAgICAgIAotICAgICAgICAvLyBBbGxvdyB0aGUgdXNlciB0byBzcGVjaWZ5IHRoZSByb2xlIHRoZXNlIFdTLUFkZHJlc3NpbmcgaGVhZGVycyBzaG91bGQgYmUgdGFyZ2V0dGVkIGF0LgotICAgICAgICBTdHJpbmcgcm9sZSA9IChTdHJpbmcpIG1zZ0NvbnRleHQuZ2V0UHJvcGVydHkoU09BUF9ST0xFX0ZPUl9BRERSRVNTSU5HX0hFQURFUlMpOwotCi0gICAgICAgIFdTQUhlYWRlcldyaXRlciB3cml0ZXIgPSBuZXcgV1NBSGVhZGVyV3JpdGVyKG1zZ0NvbnRleHQsIGlzU3VibWlzc2lvbk5hbWVzcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkTXVzdFVuZGVyc3RhbmRBdHRyaWJ1dGUsIHJlcGxhY2VIZWFkZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlT3B0aW9uYWxIZWFkZXJzLCByb2xlKTsKLSAgICAgICAgd3JpdGVyLndyaXRlSGVhZGVycygpOwotCi0gICAgICAgIHJldHVybiBJbnZvY2F0aW9uUmVzcG9uc2UuQ09OVElOVUU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBjbGFzcyBXU0FIZWFkZXJXcml0ZXIgewotCi0gICAgICAgIHByaXZhdGUgTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQ7Ci0gICAgICAgIHByaXZhdGUgU09BUEVudmVsb3BlIGVudmVsb3BlOwotICAgICAgICBwcml2YXRlIFNPQVBIZWFkZXIgaGVhZGVyOwotICAgICAgICBwcml2YXRlIFNPQVBGYWN0b3J5IGZhY3Rvcnk7Ci0gICAgICAgIHByaXZhdGUgT3B0aW9ucyBtZXNzYWdlQ29udGV4dE9wdGlvbnM7Ci0gICAgICAgIHByaXZhdGUgT01OYW1lc3BhY2UgYWRkcmVzc2luZ05hbWVzcGFjZU9iamVjdDsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgYWRkcmVzc2luZ05hbWVzcGFjZTsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgYWRkcmVzc2luZ1JvbGU7Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGlzRmluYWxBZGRyZXNzaW5nTmFtZXNwYWNlOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gYWRkTXVzdFVuZGVyc3RhbmRBdHRyaWJ1dGU7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiByZXBsYWNlSGVhZGVyczsgIC8vIGRldGVybWluZXMgd2hldGhlciB3ZSByZXBsYWNlIHRoZSBleGlzdGluZyBoZWFkZXJzIG9yIG5vdCwgaWYgdGhleSBwcmVzZW50Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBpbmNsdWRlT3B0aW9uYWxIZWFkZXJzOwotCi0gICAgICAgIHByaXZhdGUgQXJyYXlMaXN0IGV4aXN0aW5nV1NBSGVhZGVycyA9IG51bGw7Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgV1NBSGVhZGVyV3JpdGVyKE1lc3NhZ2VDb250ZXh0IG1jLCBib29sZWFuIGlzU3VibWlzc2lvbk5hbWVzcGFjZSwgYm9vbGVhbiBhZGRNVSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHJlcGxhY2UsIGJvb2xlYW4gaW5jbHVkZU9wdGlvbmFsLCBTdHJpbmcgcm9sZSkgewotICAgICAgICAgICAgaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQgJiYgbG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIldTQUhlYWRlcldyaXRlcjogaXNGaW5hbD0iICsgIWlzU3VibWlzc2lvbk5hbWVzcGFjZSArICIgYWRkTVU9IiArIGFkZE1VICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIgcmVwbGFjZT0iICsgcmVwbGFjZSArICIgaW5jbHVkZU9wdGlvbmFsPSIgKyBpbmNsdWRlT3B0aW9uYWwrIiByb2xlPSIrcm9sZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1lc3NhZ2VDb250ZXh0ID0gbWM7Ci0gICAgICAgICAgICBlbnZlbG9wZSA9IG1jLmdldEVudmVsb3BlKCk7Ci0gICAgICAgICAgICBmYWN0b3J5ID0gKFNPQVBGYWN0b3J5KWVudmVsb3BlLmdldE9NRmFjdG9yeSgpOwotCi0gICAgICAgICAgICBtZXNzYWdlQ29udGV4dE9wdGlvbnMgPSBtZXNzYWdlQ29udGV4dC5nZXRPcHRpb25zKCk7Ci0KLSAgICAgICAgICAgIGFkZHJlc3NpbmdOYW1lc3BhY2UgPQotICAgICAgICAgICAgICAgICAgICBpc1N1Ym1pc3Npb25OYW1lc3BhY2UgPyBTdWJtaXNzaW9uLldTQV9OQU1FU1BBQ0UgOiBGaW5hbC5XU0FfTkFNRVNQQUNFOwotCi0gICAgICAgICAgICBoZWFkZXIgPSBlbnZlbG9wZS5nZXRIZWFkZXIoKTsKLSAgICAgICAgICAgIC8vIGlmIHRoZXJlIGlzIG5vIHNvYXAgaGVhZGVyIGluIHRoZSBlbnZlbG9wZSBiZWluZyBwcm9jZXNzZWQsIGFkZCBvbmUuCi0gICAgICAgICAgICBpZiAoaGVhZGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIAloZWFkZXIgPSBmYWN0b3J5LmNyZWF0ZVNPQVBIZWFkZXIoZW52ZWxvcGUpOwotICAgICAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICAJQXJyYXlMaXN0IGFkZHJlc3NpbmdIZWFkZXJzID0gaGVhZGVyLmdldEhlYWRlckJsb2Nrc1dpdGhOU1VSSShhZGRyZXNzaW5nTmFtZXNwYWNlKTsKLSAgICAgICAgICAgIAlpZihhZGRyZXNzaW5nSGVhZGVycyE9bnVsbCAmJiAhYWRkcmVzc2luZ0hlYWRlcnMuaXNFbXB0eSgpKXsKLSAgICAgICAgICAgIAkJZXhpc3RpbmdXU0FIZWFkZXJzID0gbmV3IEFycmF5TGlzdChhZGRyZXNzaW5nSGVhZGVycy5zaXplKCkpOwotICAgICAgICAgICAgCQlmb3IoSXRlcmF0b3IgaXRlcj1hZGRyZXNzaW5nSGVhZGVycy5pdGVyYXRvcigpO2l0ZXIuaGFzTmV4dCgpOyl7Ci0gICAgICAgICAgICAJCQlTT0FQSGVhZGVyQmxvY2sgb2UgPSAoU09BUEhlYWRlckJsb2NrKWl0ZXIubmV4dCgpOwotICAgICAgICAgICAgCQkJaWYoYWRkcmVzc2luZ1JvbGUgPT0gbnVsbCB8fCBhZGRyZXNzaW5nUm9sZS5sZW5ndGgoKSA9PTAgfHwgYWRkcmVzc2luZ1JvbGUuZXF1YWxzKG9lLmdldFJvbGUoKSkpewotICAgICAgICAgICAgCQkJCWV4aXN0aW5nV1NBSGVhZGVycy5hZGQob2UuZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICAgICAgCQkJfQotICAgICAgICAgICAgCQl9Ci0gICAgICAgICAgICAJfQotICAgICAgICAgICAgCWlmKGFkZHJlc3NpbmdIZWFkZXJzICE9IG51bGwgJiYgYWRkcmVzc2luZ0hlYWRlcnMuc2l6ZSgpID09MCl7Ci0gICAgICAgICAgICAJCWFkZHJlc3NpbmdIZWFkZXJzID0gbnVsbDsKLSAgICAgICAgICAgIAl9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlzRmluYWxBZGRyZXNzaW5nTmFtZXNwYWNlID0gIWlzU3VibWlzc2lvbk5hbWVzcGFjZTsKLSAgICAgICAgICAgIGFkZE11c3RVbmRlcnN0YW5kQXR0cmlidXRlID0gYWRkTVU7Ci0gICAgICAgICAgICByZXBsYWNlSGVhZGVycyA9IHJlcGxhY2U7Ci0gICAgICAgICAgICBpbmNsdWRlT3B0aW9uYWxIZWFkZXJzID0gaW5jbHVkZU9wdGlvbmFsOwotICAgICAgICAgICAgYWRkcmVzc2luZ1JvbGUgPSByb2xlOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZighaXNGaW5hbEFkZHJlc3NpbmdOYW1lc3BhY2UgJiYgbWMuZ2V0VG8oKSA9PSBudWxsKXsKLSAgICAgICAgICAgIAltYy5zZXRUbyhuZXcgRW5kcG9pbnRSZWZlcmVuY2UoQWRkcmVzc2luZ0NvbnN0YW50cy5TdWJtaXNzaW9uLldTQV9BTk9OWU1PVVNfVVJMKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZUhlYWRlcnMoKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLQotICAgICAgICAgICAgLy8gYnkgdGhpcyB0aW1lLCB3ZSBkZWZpbml0ZWx5IGhhdmUgc29tZSBhZGRyZXNzaW5nIGluZm9ybWF0aW9uIHRvIGJlIHNlbnQuIFRoaXMgaXMgYmVjYXVzZSwKLSAgICAgICAgICAgIC8vIHdlIGhhdmUgdGVzdGVkIGF0IHRoZSBzdGFydCBvZiB0aGlzIHdoZXRoZXIgbWVzc2FnZUluZm9ybWF0aW9uSGVhZGVycyBhcmUgbnVsbCBvciBub3QuCi0gICAgICAgICAgICAvLyBTbyByYXRoZXIgdGhhbiBkZWNsYXJpbmcgYWRkcmVzc2luZyBuYW1lc3BhY2UgaW4gZWFjaCBhbmQgZXZlcnkgYWRkcmVzc2luZyBoZWFkZXIsIGxldHMKLSAgICAgICAgICAgIC8vIGRlZmluZSB0aGF0IGluIHRoZSBIZWFkZXIgaXRzZWxmLgotICAgICAgICAJYWRkcmVzc2luZ05hbWVzcGFjZU9iamVjdCA9IGhlYWRlci5kZWNsYXJlTmFtZXNwYWNlKGFkZHJlc3NpbmdOYW1lc3BhY2UsIFdTQV9ERUZBVUxUX1BSRUZJWCk7Ci0KLSAgICAgICAgICAgIC8vIHByb2Nlc3NpbmcgV1NBIFRvCi0gICAgICAgICAgICBwcm9jZXNzVG9FUFIoKTsKLQotICAgICAgICAgICAgLy8gcHJvY2Vzc2luZyBXU0EgcmVwbHlUbwotICAgICAgICAgICAgcHJvY2Vzc1JlcGx5VG8oKTsKLQotICAgICAgICAgICAgLy8gcHJvY2Vzc2luZyBXU0EgRnJvbQotICAgICAgICAgICAgcHJvY2Vzc0Zyb21FUFIoKTsKLQotICAgICAgICAgICAgLy8gcHJvY2Vzc2luZyBXU0EgRmF1bHRUbwotICAgICAgICAgICAgcHJvY2Vzc0ZhdWx0VG9FUFIoKTsKLQotICAgICAgICAgICAgLy8gcHJvY2Vzc2luZyBXU0EgTWVzc2FnZUlECi0gICAgICAgICAgICBwcm9jZXNzTWVzc2FnZUlEKCk7Ci0KLSAgICAgICAgICAgIC8vIHByb2Nlc3NpbmcgV1NBIEFjdGlvbgotICAgICAgICAgICAgcHJvY2Vzc1dTQUFjdGlvbigpOwotCi0gICAgICAgICAgICAvLyBwcm9jZXNzaW5nIFdTQSBSZWxhdGVzVG8KLSAgICAgICAgICAgIHByb2Nlc3NSZWxhdGVzVG8oKTsKLQotICAgICAgICAgICAgLy8gcHJvY2VzcyBmYXVsdCBoZWFkZXJzLCBpZiBwcmVzZW50Ci0gICAgICAgICAgICBwcm9jZXNzRmF1bHRzSW5mb0lmUHJlc2VudCgpOwotCi0gICAgICAgICAgICAvLyBwcm9jZXNzIG11c3RVbmRlcnN0YW5kIGF0dHJpYnV0ZSwgaWYgcmVxdWlyZWQuCi0gICAgICAgICAgICBwcm9jZXNzTXVzdFVuZGVyc3RhbmRQcm9wZXJ0eSgpOwotICAgICAgICB9Ci0KLQotICAgICAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc01lc3NhZ2VJRCgpIHsKLSAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlSUQgPSBtZXNzYWdlQ29udGV4dE9wdGlvbnMuZ2V0TWVzc2FnZUlkKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vQ2hlY2sgd2hldGhlciB3ZSB3YW50IHRvIGZvcmNlIGEgbWVzc2FnZSBpZCB0byBiZSBzZW50LgotICAgICAgICAgICAgaWYgKG1lc3NhZ2VJRCA9PSBudWxsICYmIGluY2x1ZGVPcHRpb25hbEhlYWRlcnMpIHsKLSAgICAgICAgICAgICAgICBtZXNzYWdlSUQgPSBVVUlER2VuZXJhdG9yLmdldFVVSUQoKTsKLSAgICAgICAgICAgICAgICBtZXNzYWdlQ29udGV4dE9wdGlvbnMuc2V0TWVzc2FnZUlkKG1lc3NhZ2VJRCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChtZXNzYWdlSUQgIT0gbnVsbCAmJiAhaXNBZGRyZXNzaW5nSGVhZGVyQWxyZWFkeUF2YWlsYWJsZShXU0FfTUVTU0FHRV9JRCwgZmFsc2UpKQotICAgICAgICAgICAgey8vb3B0aW9uYWwKLSAgICAgICAgICAgIAlBcnJheUxpc3QgYXR0cmlidXRlcyA9IChBcnJheUxpc3QpbWVzc2FnZUNvbnRleHQuZ2V0TG9jYWxQcm9wZXJ0eSgKLSAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3NpbmdDb25zdGFudHMuTUVTU0FHRUlEX0FUVFJJQlVURVMpOwotICAgICAgICAgICAgICAgIGNyZWF0ZVNPQVBIZWFkZXJCbG9jayhtZXNzYWdlSUQsIFdTQV9NRVNTQUdFX0lELCBhdHRyaWJ1dGVzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzV1NBQWN0aW9uKCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgICAgICBTdHJpbmcgYWN0aW9uID0gbWVzc2FnZUNvbnRleHRPcHRpb25zLmdldEFjdGlvbigpOwotCi0gICAgICAgICAgICBpZiAoTG9nZ2luZ0NvbnRyb2wuZGVidWdMb2dnaW5nQWxsb3dlZCAmJiBsb2cuaXNUcmFjZUVuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy50cmFjZShtZXNzYWdlQ29udGV4dC5nZXRMb2dJRFN0cmluZygpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIgcHJvY2Vzc1dTQUFjdGlvbjogYWN0aW9uIGZyb20gbWVzc2FnZUNvbnRleHQ6ICIgKyBhY3Rpb24pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGFjdGlvbiA9PSBudWxsIHx8IGFjdGlvbi5sZW5ndGgoKT09MCkgewotICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlQ29udGV4dC5nZXRBeGlzT3BlcmF0aW9uKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhY3Rpb24gPSBtZXNzYWdlQ29udGV4dC5nZXRBeGlzT3BlcmF0aW9uKCkuZ2V0T3V0cHV0QWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmKGFjdGlvbiE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgIAkvLyBTZXQgdGhpcyBhY3Rpb24gYmFjayB0byBvYnZpYXRlIHBvc3NpYmxlIGFjdGlvbiBtaXNtYXRjaCBwcm9ibGVtcwotICAgICAgICAgICAgICAgICAgICAJbWVzc2FnZUNvbnRleHQuc2V0V1NBQWN0aW9uKGFjdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQgJiYgbG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy50cmFjZShtZXNzYWdlQ29udGV4dC5nZXRMb2dJRFN0cmluZygpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBwcm9jZXNzV1NBQWN0aW9uOiBhY3Rpb24gZnJvbSBBeGlzT3BlcmF0aW9uOiAiICsgYWN0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH1lbHNlewotCSAgICAgICAgICAgIC8vIFVzZSB0aGUgY29ycmVjdCBmYXVsdCBhY3Rpb24gZm9yIHRoZSBzZWxlY3RlZCBuYW1lc3BhY2UKLQkgICAgICAgICAgICBpZihpc0ZpbmFsQWRkcmVzc2luZ05hbWVzcGFjZSl7Ci0JICAgICAgICAgICAgCWlmKFN1Ym1pc3Npb24uV1NBX0ZBVUxUX0FDVElPTi5lcXVhbHMoYWN0aW9uKSl7Ci0JICAgICAgICAgICAgCQlhY3Rpb24gPSBGaW5hbC5XU0FfRkFVTFRfQUNUSU9OOwotCSAgICAgICAgICAgIAkJbWVzc2FnZUNvbnRleHRPcHRpb25zLnNldEFjdGlvbihhY3Rpb24pOwotCSAgICAgICAgICAgIAl9Ci0JICAgICAgICAgICAgfWVsc2V7Ci0JICAgICAgICAgICAgCWlmKEZpbmFsLldTQV9GQVVMVF9BQ1RJT04uZXF1YWxzKGFjdGlvbikpewotCSAgICAgICAgICAgIAkJYWN0aW9uID0gU3VibWlzc2lvbi5XU0FfRkFVTFRfQUNUSU9OOwotCSAgICAgICAgICAgIAkJbWVzc2FnZUNvbnRleHRPcHRpb25zLnNldEFjdGlvbihhY3Rpb24pOwotCSAgICAgICAgICAgIAl9ZWxzZSBpZihGaW5hbC5XU0FfU09BUF9GQVVMVF9BQ1RJT04uZXF1YWxzKGFjdGlvbikpewotCSAgICAgICAgICAgICAgICAgICAgYWN0aW9uID0gU3VibWlzc2lvbi5XU0FfRkFVTFRfQUNUSU9OOwotCSAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUNvbnRleHRPcHRpb25zLnNldEFjdGlvbihhY3Rpb24pOwotCSAgICAgICAgICAgIAl9Ci0JICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBJZiB3ZSBuZWVkIHRvIGFkZCBhIHdzYTpBY3Rpb24gaGVhZGVyCi0gICAgICAgICAgICBpZiAoIWlzQWRkcmVzc2luZ0hlYWRlckFscmVhZHlBdmFpbGFibGUoV1NBX0FDVElPTiwgZmFsc2UpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQgJiYgbG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLnRyYWNlKG1lc3NhZ2VDb250ZXh0LmdldExvZ0lEU3RyaW5nKCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgcHJvY2Vzc1dTQUFjdGlvbjogTm8gZXhpc3Rpbmcgd3NhOkFjdGlvbiBoZWFkZXIgZm91bmQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhbiBhY3Rpb24gdG8gYWRkLAotICAgICAgICAgICAgICAgIGlmIChhY3Rpb24gPT0gbnVsbCB8fCBhY3Rpb24ubGVuZ3RoKCk9PTApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQgJiYgbG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy50cmFjZShtZXNzYWdlQ29udGV4dC5nZXRMb2dJRFN0cmluZygpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBwcm9jZXNzV1NBQWN0aW9uOiBObyBhY3Rpb24gdG8gYWRkIHRvIGhlYWRlciIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIEZhdWx0IHVubGVzcyB2YWxpZGF0aW9uIGhhcyBiZWVuIGV4cGxpY3RpbHkgdHVybmVkIG9mZgotICAgICAgICAgICAgICAgICAgICBpZiAoIW1lc3NhZ2VDb250ZXh0LmlzUHJvcGVydHlUcnVlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3NpbmdDb25zdGFudHMuRElTQUJMRV9PVVRCT1VORF9BRERSRVNTSU5HX1ZBTElEQVRJT04pKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KEFkZHJlc3NpbmdNZXNzYWdlcy5nZXRNZXNzYWdlKCJvdXRib3VuZE5vQWN0aW9uIikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQgJiYgbG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy50cmFjZShtZXNzYWdlQ29udGV4dC5nZXRMb2dJRFN0cmluZygpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBwcm9jZXNzV1NBQWN0aW9uOiBBZGRpbmcgYWN0aW9uIHRvIGhlYWRlcjogIiArIGFjdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIGp1c3QgYWRkIHRoZSBoZWFkZXIKLSAgICAgICAgICAgICAgICAgICAgQXJyYXlMaXN0IGF0dHJpYnV0ZXMgPSAoQXJyYXlMaXN0KW1lc3NhZ2VDb250ZXh0LmdldExvY2FsUHJvcGVydHkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzc2luZ0NvbnN0YW50cy5BQ1RJT05fQVRUUklCVVRFUyk7Ci0gICAgICAgICAgICAgICAgICAgIGNyZWF0ZVNPQVBIZWFkZXJCbG9jayhhY3Rpb24sIFdTQV9BQ1RJT04sIGF0dHJpYnV0ZXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzRmF1bHRzSW5mb0lmUHJlc2VudCgpIHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBkZXRhaWxFbGVtZW50ID0gQWRkcmVzc2luZ0ZhdWx0c0hlbHBlcgotICAgICAgICAgICAgICAgICAgICAuZ2V0RGV0YWlsRWxlbWVudEZvckFkZHJlc3NpbmdGYXVsdChtZXNzYWdlQ29udGV4dCwgYWRkcmVzc2luZ05hbWVzcGFjZU9iamVjdCk7Ci0gICAgICAgICAgICBpZiAoZGV0YWlsRWxlbWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy9UaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIFNPQVAgMS4xIGFuZCBTT0FQIDEuMiBmYXVsdCBtZXNzYWdlcyBpcyBleHBsYWluZWQgaW4gdGhlIFdTLUFkZHJlc3NpbmcgU3BlY3MuCi0gICAgICAgICAgICAgICAgaWYgKGlzRmluYWxBZGRyZXNzaW5nTmFtZXNwYWNlICYmIG1lc3NhZ2VDb250ZXh0LmlzU09BUDExKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gQWRkIGRldGFpbCBhcyBhIHdzYTpGYXVsdERldGFpbCBoZWFkZXIKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0FkZHJlc3NpbmdIZWFkZXJBbHJlYWR5QXZhaWxhYmxlKEZpbmFsLkZBVUxUX0hFQURFUl9ERVRBSUwsIGZhbHNlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgU09BUEhlYWRlckJsb2NrIGZhdWx0RGV0YWlsID0gaGVhZGVyLmFkZEhlYWRlckJsb2NrKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaW5hbC5GQVVMVF9IRUFERVJfREVUQUlMLCBhZGRyZXNzaW5nTmFtZXNwYWNlT2JqZWN0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZhdWx0RGV0YWlsLmFkZENoaWxkKEVsZW1lbnRIZWxwZXIuaW1wb3J0T01FbGVtZW50KGRldGFpbEVsZW1lbnQsIGZhY3RvcnkpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIW1lc3NhZ2VDb250ZXh0LmlzU09BUDExKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gQWRkIGRldGFpbCB0byB0aGUgRmF1bHQgaW4gdGhlIFNPQVAgQm9keQotICAgICAgICAgICAgICAgICAgICBTT0FQRmF1bHQgZmF1bHQgPSBlbnZlbG9wZS5nZXRCb2R5KCkuZ2V0RmF1bHQoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZhdWx0ICE9IG51bGwgJiYgZmF1bHQuZ2V0RGV0YWlsKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZmF1bHQuZ2V0RGV0YWlsKCkuYWRkRGV0YWlsRW50cnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnRIZWxwZXIuaW1wb3J0T01FbGVtZW50KGRldGFpbEVsZW1lbnQsIGZhY3RvcnkpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzUmVsYXRlc1RvKCkgewotICAgICAgICAgICAgaWYgKCFpc0FkZHJlc3NpbmdIZWFkZXJBbHJlYWR5QXZhaWxhYmxlKFdTQV9SRUxBVEVTX1RPLCB0cnVlKSkgewotICAgICAgICAgICAgICAgIFJlbGF0ZXNUb1tdIHJlbGF0ZXNUbyA9IG1lc3NhZ2VDb250ZXh0T3B0aW9ucy5nZXRSZWxhdGlvbnNoaXBzKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocmVsYXRlc1RvICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHJlbGF0ZXNUby5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgT01FbGVtZW50IHJlbGF0ZXNUb0hlYWRlciA9IGNyZWF0ZVNPQVBIZWFkZXJCbG9jayhyZWxhdGVzVG9baV0uZ2V0VmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIAkJV1NBX1JFTEFURVNfVE8sIHJlbGF0ZXNUb1tpXS5nZXRFeHRlbnNpYmlsaXR5QXR0cmlidXRlcygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyByZWxhdGlvbnNoaXBUeXBlID0gcmVsYXRlc1RvW2ldLmdldFJlbGF0aW9uc2hpcFR5cGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWxhdGVzVG9IZWFkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgCQotICAgICAgICAgICAgICAgICAgICAgICAgCWlmKCFpbmNsdWRlT3B0aW9uYWxIZWFkZXJzKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIAkJaWYgKEZpbmFsLldTQV9ERUZBVUxUX1JFTEFUSU9OU0hJUF9UWVBFLmVxdWFscyhyZWxhdGlvbnNoaXBUeXBlKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1Ym1pc3Npb24uV1NBX0RFRkFVTFRfUkVMQVRJT05TSElQX1RZUEUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5lcXVhbHMocmVsYXRpb25zaGlwVHlwZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIAkJCXJlbGF0aW9uc2hpcFR5cGUgPSBudWxsOyAvL09taXQgdGhlIGF0dHJpYnV0ZS4KLSAgICAgICAgICAgICAgICAgICAgICAgIAkJfQotICAgICAgICAgICAgICAgICAgICAgICAgCX0KLSAgICAgICAgICAgICAgICAgICAgICAgIAkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihyZWxhdGlvbnNoaXBUeXBlICE9IG51bGwpewotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGVzVG9IZWFkZXIuYWRkQXR0cmlidXRlKFdTQV9SRUxBVEVTX1RPX1JFTEFUSU9OU0hJUF9UWVBFLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uc2hpcFR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NGYXVsdFRvRVBSKCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgICAgICBFbmRwb2ludFJlZmVyZW5jZSBlcHIgPSBtZXNzYWdlQ29udGV4dE9wdGlvbnMuZ2V0RmF1bHRUbygpOwotICAgICAgICAgICAgU3RyaW5nIGhlYWRlck5hbWUgPSBBZGRyZXNzaW5nQ29uc3RhbnRzLldTQV9GQVVMVF9UTzsKLQotICAgICAgICAgICAgLy9PbWl0IHRoZSBoZWFkZXIgaWYgdGhlIGVwciBpcyBudWxsLgotICAgICAgICAgICAgaWYgKGVwciAhPSBudWxsICYmICFpc0FkZHJlc3NpbmdIZWFkZXJBbHJlYWR5QXZhaWxhYmxlKGhlYWRlck5hbWUsIGZhbHNlKSkgewotICAgICAgICAgICAgICAgIGFkZFRvU09BUEhlYWRlcihlcHIsIGhlYWRlck5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NGcm9tRVBSKCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgICAgICBFbmRwb2ludFJlZmVyZW5jZSBlcHIgPSBtZXNzYWdlQ29udGV4dE9wdGlvbnMuZ2V0RnJvbSgpOwotICAgICAgICAgICAgU3RyaW5nIGhlYWRlck5hbWUgPSBBZGRyZXNzaW5nQ29uc3RhbnRzLldTQV9GUk9NOwotCi0gICAgICAgICAgICAvL09taXQgdGhlIGhlYWRlciBpZiB0aGUgZXByIGlzIG51bGwuCi0gICAgICAgICAgICBpZiAoZXByICE9IG51bGwgJiYgIWlzQWRkcmVzc2luZ0hlYWRlckFscmVhZHlBdmFpbGFibGUoaGVhZGVyTmFtZSwgZmFsc2UpKSB7Ci0gICAgICAgICAgICAgICAgYWRkVG9TT0FQSGVhZGVyKGVwciwgaGVhZGVyTmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc1JlcGx5VG8oKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgICAgIEVuZHBvaW50UmVmZXJlbmNlIGVwciA9IG1lc3NhZ2VDb250ZXh0T3B0aW9ucy5nZXRSZXBseVRvKCk7Ci0gICAgICAgICAgICBTdHJpbmcgaGVhZGVyTmFtZSA9IEFkZHJlc3NpbmdDb25zdGFudHMuV1NBX1JFUExZX1RPOwotCi0gICAgICAgICAgICAvL0Rvbid0IGNoZWNrIGVwciBmb3IgbnVsbCBoZXJlIGFzIGFkZFRvU09BUEhlYWRlcigpIHdpbGwgcHJvdmlkZSBhbiBhcHByb3ByaWF0ZSBkZWZhdWx0LgotICAgICAgICAgICAgLy9UaGlzIGRlZmF1bHQgaXMgZXNwZWNpYWxseSB1c2VmdWwgZm9yIGNsaWVudCBzaWRlIG91dGJvdW5kIHByb2Nlc3NpbmcuCi0gICAgICAgICAgICBpZiAoIWlzQWRkcmVzc2luZ0hlYWRlckFscmVhZHlBdmFpbGFibGUoaGVhZGVyTmFtZSwgZmFsc2UpKSB7Ci0gICAgICAgICAgICAgICAgYWRkVG9TT0FQSGVhZGVyKGVwciwgaGVhZGVyTmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc1RvRVBSKCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgICAgICBFbmRwb2ludFJlZmVyZW5jZSBlcHIgPSBtZXNzYWdlQ29udGV4dE9wdGlvbnMuZ2V0VG8oKTsKLSAgICAgICAgICAgIGlmIChlcHIgIT0gbnVsbCAmJiAhaXNBZGRyZXNzaW5nSGVhZGVyQWxyZWFkeUF2YWlsYWJsZShXU0FfVE8sIGZhbHNlKSkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NUb0VQUlJlZmVyZW5jZUluZm9ybWF0aW9uKGVwci5nZXRBbGxSZWZlcmVuY2VQYXJhbWV0ZXJzKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdChBZGRyZXNzaW5nTWVzc2FnZXMuZ2V0TWVzc2FnZSgicmVmZXJlbmNlUGFyYW1ldGVyRXJyb3IiKSwgZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFN0cmluZyBhZGRyZXNzID0gZXByLmdldEFkZHJlc3MoKTsKLSAgICAgICAgICAgICAgICBpZiAoYWRkcmVzcyAhPSBudWxsICYmIGFkZHJlc3MubGVuZ3RoKCkhPTApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFpbmNsdWRlT3B0aW9uYWxIZWFkZXJzICYmIGlzRmluYWxBZGRyZXNzaW5nTmFtZXNwYWNlICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXByLmlzV1NBZGRyZXNzaW5nQW5vbnltb3VzKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsgLy9PbWl0IHRoZSBoZWFkZXIuCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY3JlYXRlU09BUEhlYWRlckJsb2NrKGFkZHJlc3MsIFdTQV9UTywgZXByLmdldEFkZHJlc3NBdHRyaWJ1dGVzKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgT01FbGVtZW50IGNyZWF0ZVNPQVBIZWFkZXJCbG9jayhTdHJpbmcgdmFsdWUsIFN0cmluZyBoZWFkZXJOYW1lLCBBcnJheUxpc3QgYXR0cmlidXRlcykgewotICAgICAgICAgICAgaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQgJiYgbG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cudHJhY2UoImNyZWF0ZVNPQVBIZWFkZXJCbG9jazogdmFsdWU9IiArIHZhbHVlICsgIiBoZWFkZXJOYW1lPSIgKyBoZWFkZXJOYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmxlbmd0aCgpIT0wKSB7Ci0gICAgICAgICAgICAgICAgU09BUEhlYWRlckJsb2NrIHNvYXBIZWFkZXJCbG9jayA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXIuYWRkSGVhZGVyQmxvY2soaGVhZGVyTmFtZSwgYWRkcmVzc2luZ05hbWVzcGFjZU9iamVjdCk7Ci0gICAgICAgICAgICAgICAgc29hcEhlYWRlckJsb2NrLmFkZENoaWxkKGZhY3RvcnkuY3JlYXRlT01UZXh0KHZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCAmJiAhYXR0cmlidXRlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3IgYXR0ckl0ZXJhdG9yID0gYXR0cmlidXRlcy5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoYXR0ckl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlSGVscGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pbXBvcnRPTUF0dHJpYnV0ZSgoT01BdHRyaWJ1dGUpYXR0ckl0ZXJhdG9yLm5leHQoKSwgc29hcEhlYWRlckJsb2NrKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBhZGRSb2xlVG9IZWFkZXIoc29hcEhlYWRlckJsb2NrKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gc29hcEhlYWRlckJsb2NrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgYWRkVG9TT0FQSGVhZGVyKEVuZHBvaW50UmVmZXJlbmNlIGVwciwgU3RyaW5nIGhlYWRlck5hbWUpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICAgICAgU3RyaW5nIHByZWZpeCA9IGFkZHJlc3NpbmdOYW1lc3BhY2VPYmplY3QuZ2V0UHJlZml4KCk7Ci0gICAgICAgICAgICBTdHJpbmcgYW5vbnltb3VzID0gaXNGaW5hbEFkZHJlc3NpbmdOYW1lc3BhY2UgPwotICAgICAgICAgICAgICAgICAgICBGaW5hbC5XU0FfQU5PTllNT1VTX1VSTCA6IFN1Ym1pc3Npb24uV1NBX0FOT05ZTU9VU19VUkw7Ci0KLSAgICAgICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkICYmIGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLnRyYWNlKCJhZGRUb1NPQVBIZWFkZXI6IGVwcj0iICsgZXByICsgIiBoZWFkZXJOYW1lPSIgKyBoZWFkZXJOYW1lKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGVwciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFpbmNsdWRlT3B0aW9uYWxIZWFkZXJzICYmIGlzRmluYWxBZGRyZXNzaW5nTmFtZXNwYWNlICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzaW5nQ29uc3RhbnRzLldTQV9SRVBMWV9UTy5lcXVhbHMoaGVhZGVyTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOyAvL09taXQgdGhlIGhlYWRlci4KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBlcHIgPSBuZXcgRW5kcG9pbnRSZWZlcmVuY2UoYW5vbnltb3VzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICghaXNGaW5hbEFkZHJlc3NpbmdOYW1lc3BhY2UgJiYgZXByLmhhc05vbmVBZGRyZXNzKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47IC8vT21pdCB0aGUgaGVhZGVyLgotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoZXByLmlzV1NBZGRyZXNzaW5nQW5vbnltb3VzKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCFpbmNsdWRlT3B0aW9uYWxIZWFkZXJzICYmIGlzRmluYWxBZGRyZXNzaW5nTmFtZXNwYWNlICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzaW5nQ29uc3RhbnRzLldTQV9SRVBMWV9UTy5lcXVhbHMoaGVhZGVyTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOyAvL09taXQgdGhlIGhlYWRlci4KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBlcHIuc2V0QWRkcmVzcyhhbm9ueW1vdXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgT01FbGVtZW50IHNvYXBIZWFkZXJCbG9jayA9IEVuZHBvaW50UmVmZXJlbmNlSGVscGVyLnRvT00oZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVwciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBRTmFtZShhZGRyZXNzaW5nTmFtZXNwYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlck5hbWUsIHByZWZpeCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzaW5nTmFtZXNwYWNlKTsKLSAgICAgICAgICAgIGFkZFJvbGVUb0hlYWRlcigoU09BUEhlYWRlckJsb2NrKSBzb2FwSGVhZGVyQmxvY2spOwotICAgICAgICAgICAgaGVhZGVyLmFkZENoaWxkKHNvYXBIZWFkZXJCbG9jayk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhpcyB3aWxsIGFkZCByZWZlcmVuY2UgcGFyYW1ldGVycyBhbmQvb3IgcmVmZXJlbmNlIHByb3BlcnRpZXMgaW4gdG8gdGhlIG1lc3NhZ2UKLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHJlZmVyZW5jZUluZm9ybWF0aW9uIGEgTWFwIGZyb20gUU5hbWUgLT4gT01FbGVtZW50Ci0gICAgICAgICAqIEBwYXJhbSBwYXJlbnQgICAgICAgICAgICAgICBpcyB0aGUgZWxlbWVudCB0byB3aGljaCB0aGUgcmVmZXJlbmNlcGFyYW1ldGVycyBzaG91bGQgYmUKLSAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaGVkCi0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc1RvRVBSUmVmZXJlbmNlSW5mb3JtYXRpb24oTWFwIHJlZmVyZW5jZUluZm9ybWF0aW9uKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGlmIChyZWZlcmVuY2VJbmZvcm1hdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQgJiYgbG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLnRyYWNlKCJwcm9jZXNzVG9FUFJSZWZlcmVuY2VJbmZvcm1hdGlvbjogIiArIHJlZmVyZW5jZUluZm9ybWF0aW9uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgSXRlcmF0b3IgaXRlcmF0b3IgPSByZWZlcmVuY2VJbmZvcm1hdGlvbi52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IChPTUVsZW1lbnQpaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBTT0FQSGVhZGVyQmxvY2sgbmV3RWxlbWVudCA9IEVsZW1lbnRIZWxwZXIudG9TT0FQSGVhZGVyQmxvY2sob21FbGVtZW50LCBmYWN0b3J5KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzRmluYWxBZGRyZXNzaW5nTmFtZXNwYWNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZXdFbGVtZW50LmFkZEF0dHJpYnV0ZShGaW5hbC5XU0FfSVNfUkVGRVJFTkNFX1BBUkFNRVRFUl9BVFRSSUJVVEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbmFsLldTQV9UWVBFX0FUVFJJQlVURV9WQUxVRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzc2luZ05hbWVzcGFjZU9iamVjdCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYWRkUm9sZVRvSGVhZGVyKG5ld0VsZW1lbnQpOwotICAgICAgICAgICAgICAgICAgICBoZWFkZXIuYWRkQ2hpbGQobmV3RWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gTm93IGFkZCByZWZlcmVuY2UgcGFyYW1ldGVycyB3ZSBmb3VuZCBpbiB0aGUgV1NETCAoaWYgYW55KQotICAgICAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSA9IG1lc3NhZ2VDb250ZXh0LmdldEF4aXNTZXJ2aWNlKCk7Ci0gICAgICAgICAgICBpZihzZXJ2aWNlICE9IG51bGwpewotICAgICAgICAgICAgCUF4aXNFbmRwb2ludCBlbmRwb2ludCA9IHNlcnZpY2UuZ2V0RW5kcG9pbnQoc2VydmljZS5nZXRFbmRwb2ludE5hbWUoKSk7Ci0gICAgICAgICAgICAJaWYoZW5kcG9pbnQgIT0gbnVsbCl7Ci0gICAgICAgICAgICAJCUFycmF5TGlzdCByZWZlcmVuY2VwYXJhbWV0ZXJzID0gKEFycmF5TGlzdCkgZW5kcG9pbnQuZ2V0UGFyYW1ldGVyVmFsdWUoUkVGRVJFTkNFX1BBUkFNRVRFUl9QQVJBTUVURVIpOwotICAgICAgICAgICAgCQlpZiAoTG9nZ2luZ0NvbnRyb2wuZGVidWdMb2dnaW5nQWxsb3dlZCAmJiBsb2cuaXNUcmFjZUVuYWJsZWQoKSkgewotICAgICAgICAgICAgCQkJbG9nLnRyYWNlKCJwcm9jZXNzVG9FUFJSZWZlcmVuY2VJbmZvcm1hdGlvbjogUmVmZXJlbmNlIFBhcmFtZXRlcnMgZnJvbSBXU0RMOiIgKyByZWZlcmVuY2VwYXJhbWV0ZXJzKTsKLSAgICAgICAgICAgIAkJfQotICAgICAgICAgICAgCQlpZihyZWZlcmVuY2VwYXJhbWV0ZXJzIT1udWxsKXsKLSAgICAgICAgICAgIAkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gcmVmZXJlbmNlcGFyYW1ldGVycy5pdGVyYXRvcigpOwotICAgICAgICAgICAgCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgCQkJCU9NRWxlbWVudCBvbUVsZW1lbnQgPSAoT01FbGVtZW50KWl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT0FQSGVhZGVyQmxvY2sgbmV3RWxlbWVudCA9IEVsZW1lbnRIZWxwZXIudG9TT0FQSGVhZGVyQmxvY2sob21FbGVtZW50LCBmYWN0b3J5KTsKLSAgICAgICAgICAgIAkJCQlpZiAoaXNGaW5hbEFkZHJlc3NpbmdOYW1lc3BhY2UpIHsKLSAgICAgICAgICAgIAkJCQkJbmV3RWxlbWVudC5hZGRBdHRyaWJ1dGUoRmluYWwuV1NBX0lTX1JFRkVSRU5DRV9QQVJBTUVURVJfQVRUUklCVVRFLAotICAgICAgICAgICAgCQkJCQkJCUZpbmFsLldTQV9UWVBFX0FUVFJJQlVURV9WQUxVRSwKLSAgICAgICAgICAgIAkJCQkJCQlhZGRyZXNzaW5nTmFtZXNwYWNlT2JqZWN0KTsKLSAgICAgICAgICAgIAkJCQl9Ci0gICAgICAgICAgICAJCQkJYWRkUm9sZVRvSGVhZGVyKG5ld0VsZW1lbnQpOwotICAgICAgICAgICAgCQkJCWhlYWRlci5hZGRDaGlsZChuZXdFbGVtZW50KTsKLSAgICAgICAgICAgIAkJCX0KLSAgICAgICAgICAgIAkJfQotICAgICAgICAgICAgCX0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGlzIHdpbGwgY2hlY2sgZm9yIHRoZSBleGlzdGVuY2Ugb2YgbWVzc2FnZSBpbmZvcm1hdGlvbiBoZWFkZXJzIGFscmVhZHkgaW4gdGhlIG1lc3NhZ2UuCi0gICAgICAgICAqIElmIHRoZXJlIGFyZSBhbHJlYWR5IGhlYWRlcnMsIHRoZW4gcmVwbGFjaW5nIHRoZW0gb3Igbm90IGRlcGVuZHMgb24gdGhlIHJlcGxhY2VIZWFkZXJzCi0gICAgICAgICAqIHByb3BlcnR5LgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gbmFtZSAgICAgICAgICAgIC0gTmFtZSBvZiB0aGUgbWVzc2FnZSBpbmZvcm1hdGlvbiBoZWFkZXIKLSAgICAgICAgICogQHBhcmFtIG11bHRpcGxlSGVhZGVycyAtIGRldGVybWluZXMgd2hldGhlciB0byBzZWFyY2ggZm9yIG11bHRpcGxlIGhlYWRlcnMsIG9yIG5vdC4KLSAgICAgICAgICogQHJldHVybiBmYWxzZSAtIGlmIG9uZSBjYW4gYWRkIG5ldyBoZWFkZXJzIChhbHdheXMgdGhlIGNhc2UgaWYgbXVsdGlwbGVIZWFkZXJzIGlzIHRydWUpLAotICAgICAgICAgKiAgICAgICAgIHRydWUgLSBpZiBuZXcgaGVhZGVycyBjYW4ndCBiZSBhZGRlZC4KLSAgICAgICAgICovCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBpc0FkZHJlc3NpbmdIZWFkZXJBbHJlYWR5QXZhaWxhYmxlKFN0cmluZyBuYW1lLCBib29sZWFuIG11bHRpcGxlSGVhZGVycykgewotICAgICAgICAJYm9vbGVhbiBzdGF0dXMgPSBmYWxzZTsKLQotICAgICAgICAJaWYgKG11bHRpcGxlSGVhZGVycykgewotICAgICAgICAJCWlmIChyZXBsYWNlSGVhZGVycykgewotICAgICAgICAJCQlRTmFtZSBxbmFtZSA9IG5ldyBRTmFtZShhZGRyZXNzaW5nTmFtZXNwYWNlLCBuYW1lLCBXU0FfREVGQVVMVF9QUkVGSVgpOwotICAgICAgICAJCQlJdGVyYXRvciBpdGVyYXRvciA9IGhlYWRlci5nZXRDaGlsZHJlbldpdGhOYW1lKHFuYW1lKTsKLSAgICAgICAgCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAJCQkJT01FbGVtZW50IGFkZHJlc3NpbmdIZWFkZXIgPSAoT01FbGVtZW50KWl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgCQkJCWFkZHJlc3NpbmdIZWFkZXIuZGV0YWNoKCk7Ci0gICAgICAgIAkJCX0KLSAgICAgICAgCQl9Ci0gICAgICAgIAl9IGVsc2UgewotICAgICAgICAJCWJvb2xlYW4gZXhpc3RzID0gZGlkQWRkcmVzc2luZ0hlYWRlckV4aXN0KG5hbWUpOwotICAgICAgICAJCWlmIChleGlzdHMgJiYgcmVwbGFjZUhlYWRlcnMpIHsKLSAgICAgICAgCQkJUU5hbWUgcW5hbWUgPSBuZXcgUU5hbWUoYWRkcmVzc2luZ05hbWVzcGFjZSwgbmFtZSwgV1NBX0RFRkFVTFRfUFJFRklYKTsKLSAgICAgICAgCQkJT01FbGVtZW50IGFkZHJlc3NpbmdIZWFkZXIgPSBoZWFkZXIuZ2V0Rmlyc3RDaGlsZFdpdGhOYW1lKHFuYW1lKTsKLSAgICAgICAgCQkJaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQgJiYgbG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKLSAgICAgICAgCQkJCWxvZy50cmFjZSgiaXNBZGRyZXNzaW5nSGVhZGVyQWxyZWFkeUF2YWlsYWJsZTogUmVtb3ZpbmcgZXhpc3RpbmcgaGVhZGVyOiIgKwotICAgICAgICAJCQkJCQlhZGRyZXNzaW5nSGVhZGVyLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgCQkJfQotICAgICAgICAJCQlhZGRyZXNzaW5nSGVhZGVyLmRldGFjaCgpOwotICAgICAgICAJCX0gZWxzZSB7Ci0gICAgICAgIAkJCXN0YXR1cyA9IGV4aXN0czsKLSAgICAgICAgCQl9Ci0gICAgICAgIAl9Ci0KLSAgICAgICAgCWlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkICYmIGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7Ci0gICAgICAgIAkJbG9nLnRyYWNlKCJpc0FkZHJlc3NpbmdIZWFkZXJBbHJlYWR5QXZhaWxhYmxlOiBuYW1lPSIgKyBuYW1lICsgIiBzdGF0dXM9IiArIHN0YXR1cyk7Ci0gICAgICAgIAl9Ci0gICAgICAgIAlyZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGRpZEFkZHJlc3NpbmdIZWFkZXJFeGlzdChTdHJpbmcgaGVhZGVyTmFtZSl7Ci0gICAgICAgIAlpZiAoTG9nZ2luZ0NvbnRyb2wuZGVidWdMb2dnaW5nQWxsb3dlZCAmJiBsb2cuaXNUcmFjZUVuYWJsZWQoKSkgewotICAgICAgICAJCWxvZy50cmFjZSgiZGlkQWRkcmVzc2luZ0hlYWRlckV4aXN0OiBoZWFkZXJOYW1lPSIgKyBoZWFkZXJOYW1lKTsKLSAgICAgICAgCX0KLSAgICAgICAgCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0gICAgICAgIAlpZihleGlzdGluZ1dTQUhlYWRlcnMgIT0gbnVsbCl7Ci0gICAgICAgIAkJcmVzdWx0ID0gZXhpc3RpbmdXU0FIZWFkZXJzLmNvbnRhaW5zKGhlYWRlck5hbWUpOwotICAgICAgICAJCWlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkICYmIGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7Ci0gICAgICAgIAkJCWxvZy50cmFjZSgiZGlkQWRkcmVzc2luZ0hlYWRlckV4aXN0OiBleGlzdGluZ1dTQUhlYWRlcnM9IiArIGV4aXN0aW5nV1NBSGVhZGVycysiIHJlc3VsdD0iK3Jlc3VsdCk7Ci0gICAgICAgIAkJfQotICAgICAgICAJfQotICAgICAgICAJcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIGEgbXVzdFVuZGVyc3RhbmQgYXR0cmlidXRlIG9uIGFsbCBoZWFkZXJzIHRoYXQgYXJlIGZvdW5kIHdpdGggdGhlIGFwcHJvcHJpYXRlCi0gICAgICAgICAqIGFkZHJlc3NpbmcgbmFtZXNwYWNlLgotICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NNdXN0VW5kZXJzdGFuZFByb3BlcnR5KCkgewotICAgICAgICAgICAgaWYgKGFkZE11c3RVbmRlcnN0YW5kQXR0cmlidXRlKSB7Ci0gICAgICAgICAgICAgICAgTGlzdCBoZWFkZXJzID0gaGVhZGVyLmdldEhlYWRlckJsb2Nrc1dpdGhOU1VSSShhZGRyZXNzaW5nTmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwLCBzaXplID0gaGVhZGVycy5zaXplKCk7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgU09BUEhlYWRlckJsb2NrIHNvYXBIZWFkZXJCbG9jayA9IChTT0FQSGVhZGVyQmxvY2spaGVhZGVycy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgIHNvYXBIZWFkZXJCbG9jay5zZXRNdXN0VW5kZXJzdGFuZCh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQgJiYgbG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy50cmFjZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInByb2Nlc3NNdXN0VW5kZXJzdGFuZFByb3BlcnR5OiBTZXR0aW5nIG11c3RVbmRlcnN0YW5kPXRydWUgb246ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvYXBIZWFkZXJCbG9jay5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgdm9pZCBhZGRSb2xlVG9IZWFkZXIoU09BUEhlYWRlckJsb2NrIGhlYWRlcil7Ci0gICAgICAgIAlpZihhZGRyZXNzaW5nUm9sZSA9PSBudWxsIHx8IGFkZHJlc3NpbmdSb2xlLmxlbmd0aCgpPT0wKXsKLSAgICAgICAgCQlyZXR1cm47Ci0gICAgICAgIAl9Ci0gICAgICAgIAloZWFkZXIuc2V0Um9sZShhZGRyZXNzaW5nUm9sZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkZHJlc3Npbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvaGFuZGxlcnMvYWRkcmVzc2luZy9BZGRyZXNzaW5nVmFsaWRhdGlvbkhhbmRsZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkZHJlc3Npbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvaGFuZGxlcnMvYWRkcmVzc2luZy9BZGRyZXNzaW5nVmFsaWRhdGlvbkhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI2MjRjZC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGRyZXNzaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2hhbmRsZXJzL2FkZHJlc3NpbmcvQWRkcmVzc2luZ1ZhbGlkYXRpb25IYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmhhbmRsZXJzLmFkZHJlc3Npbmc7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuQWRkcmVzc2luZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuQWRkcmVzc2luZ0ZhdWx0c0hlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuQWRkcmVzc2luZ0hlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc0Rlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmhhbmRsZXJzLkFic3RyYWN0SGFuZGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuSmF2YVV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuV1NETENvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotcHVibGljIGNsYXNzIEFkZHJlc3NpbmdWYWxpZGF0aW9uSGFuZGxlciBleHRlbmRzIEFic3RyYWN0SGFuZGxlciBpbXBsZW1lbnRzIEFkZHJlc3NpbmdDb25zdGFudHMgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEFkZHJlc3NpbmdWYWxpZGF0aW9uSGFuZGxlci5jbGFzcyk7Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkhhbmRsZXIjaW52b2tlKG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dCkKLSAgICAqLwotICAgIHB1YmxpYyBJbnZvY2F0aW9uUmVzcG9uc2UgaW52b2tlKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBPYmplY3QgZmxhZyA9IG1zZ0NvbnRleHQuZ2V0TG9jYWxQcm9wZXJ0eShJU19BRERSX0lORk9fQUxSRUFEWV9QUk9DRVNTRUQpOwotICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy50cmFjZSgiaW52b2tlOiBJU19BRERSX0lORk9fQUxSRUFEWV9QUk9DRVNTRUQ9IiArIGZsYWcpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKEphdmFVdGlscy5pc1RydWVFeHBsaWNpdGx5KGZsYWcpKSB7Ci0gICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgd3NhOk1lc3NhZ2VJRCBpcyByZXF1aXJlZCBvciBub3QuCi0gICAgICAgICAgICBjaGVja01lc3NhZ2VJREhlYWRlcihtc2dDb250ZXh0KTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIC8vIENoZWNrIHRoYXQgaWYgd3NhZGRyZXNzaW5nPXJlcXVpcmVkIHRoYXQgYWRkcmVzc2luZyBoZWFkZXJzIHdlcmUgZm91bmQgaW5ib3VuZAotICAgICAgICAgICAgY2hlY2tVc2luZ0FkZHJlc3NpbmcobXNnQ29udGV4dCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIENoZWNrIHRoYXQgaWYgd3NhbUludm9jYXRpb25QYXR0ZXJuIGZsYWcgaXMgaW4gZWZmZWN0IHRoYXQgdGhlIHJlcGx5dG8gYW5kIGZhdWx0dG8gYXJlIHZhbGlkLgotICAgICAgICBpZiAoSmF2YVV0aWxzLmlzVHJ1ZShtc2dDb250ZXh0LmdldFByb3BlcnR5KEFERFJfVkFMSURBVEVfSU5WT0NBVElPTl9QQVRURVJOKSwgdHJ1ZSkpIHsKLSAgICAgICAgICAgIGNoZWNrV1NBTUludm9jYXRpb25QYXR0ZXJuKG1zZ0NvbnRleHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIEludm9jYXRpb25SZXNwb25zZS5DT05USU5VRTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVjayB0aGF0IGlmIHRoZSB3c2FkZHJlc3Npbmc9InJlcXVpcmVkIiBhdHRyaWJ1dGUgZXhpc3RzIG9uIHRoZSBzZXJ2aWNlIGRlZmluaXRpb24gb3IKLSAgICAgKiA8d3NhdzpVc2luZ0FkZHJlc3Npbmcgd3NkbDpyZXF1aXJlZD0idHJ1ZSIgLz4gd2FzIGZvdW5kIGluIHRoZSBXU0RMIHRoYXQgV1MtQWRkcmVzc2luZwotICAgICAqIGhlYWRlcnMgd2VyZSBmb3VuZCBvbiB0aGUgaW5ib3VuZCBtZXNzYWdlCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrVXNpbmdBZGRyZXNzaW5nKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAJQXhpc0Rlc2NyaXB0aW9uIGFkID0gbXNnQ29udGV4dC5nZXRBeGlzU2VydmljZSgpOwotICAgICAgICBpZiAoYWQgPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLnRyYWNlKCJjaGVja1VzaW5nQWRkcmVzc2luZzogYXhpc1NlcnZpY2UgbnVsbCwgY2Fubm90IGNoZWNrIFVzaW5nQWRkcmVzc2luZyIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmKG1zZ0NvbnRleHQuZ2V0QXhpc09wZXJhdGlvbigpIT1udWxsKXsKLSAgICAgICAgCWFkID0gbXNnQ29udGV4dC5nZXRBeGlzT3BlcmF0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nIGFkZHJlc3NpbmdGbGFnID0KLSAgICAgICAgICAgIEFkZHJlc3NpbmdIZWxwZXIuZ2V0QWRkcmVzc2luZ1JlcXVpcmVtZW50UGFyZW1ldGVyVmFsdWUoYWQpOwotICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy50cmFjZSgiY2hlY2tVc2luZ0FkZHJlc3Npbmc6IFdTQWRkcmVzc2luZ0ZsYWc9IiArIGFkZHJlc3NpbmdGbGFnKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoQWRkcmVzc2luZ0NvbnN0YW50cy5BRERSRVNTSU5HX1JFUVVJUkVELmVxdWFscyhhZGRyZXNzaW5nRmxhZykpIHsKLSAgICAgICAgICAgIEFkZHJlc3NpbmdGYXVsdHNIZWxwZXIudHJpZ2dlck1lc3NhZ2VBZGRyZXNzaW5nUmVxdWlyZWRGYXVsdChtc2dDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3NpbmdDb25zdGFudHMuV1NBX0FDVElPTik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVjayB0aGF0IGlmIGEgd3NhdzpBbm9ueW1vdXMgdmFsdWUgd2FzIHNldCBvbiB0aGUgQXhpc09wZXJhdGlvbiB0aGF0IHRoZSB2YWx1ZXMgaW4gdGhlCi0gICAgICogUmVwbHlUbytGYXVsdFRvIGFyZSB2YWxpZCBhbmQgZmF1bHQgaWYgbm90LgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjaGVja1dTQU1JbnZvY2F0aW9uUGF0dGVybihNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgU3RyaW5nIHZhbHVlID0KLSAgICAgICAgICAgICAgICBBZGRyZXNzaW5nSGVscGVyLmdldEludm9jYXRpb25QYXR0ZXJuUGFyYW1ldGVyVmFsdWUobXNnQ29udGV4dC5nZXRBeGlzT3BlcmF0aW9uKCkpOwotICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy50cmFjZSgiY2hlY2tXU0FNSW52b2NhdGlvblBhdHRlcm46IHZhbHVlPSIgKyB2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoIUFkZHJlc3NpbmdDb25zdGFudHMuV1NBTV9JTlZPQ0FUSU9OX1BBVFRFUk5fQk9USC5lcXVhbHModmFsdWUpKXsKLSAgICAgICAgCWlmIChXU0FNX0lOVk9DQVRJT05fUEFUVEVSTl9TWU5DSFJPTk9VUy5lcXVhbHModmFsdWUpKSB7Ci0gICAgICAgIAkJaWYgKCFBZGRyZXNzaW5nSGVscGVyLmlzU3luY1JlcGx5QWxsb3dlZChtc2dDb250ZXh0KSkgewotICAgICAgICAJCQlFbmRwb2ludFJlZmVyZW5jZSBhbm9uRVBSID0KLSAgICAgICAgCQkJCW5ldyBFbmRwb2ludFJlZmVyZW5jZShBZGRyZXNzaW5nQ29uc3RhbnRzLkZpbmFsLldTQV9BTk9OWU1PVVNfVVJMKTsKLSAgICAgICAgCQkJbXNnQ29udGV4dC5zZXRSZXBseVRvKGFub25FUFIpOwotICAgICAgICAJCQltc2dDb250ZXh0LnNldEZhdWx0VG8oYW5vbkVQUik7Ci0gICAgICAgIAkJCUFkZHJlc3NpbmdGYXVsdHNIZWxwZXIudHJpZ2dlck9ubHlBbm9ueW1vdXNBZGRyZXNzU3VwcG9ydGVkRmF1bHQobXNnQ29udGV4dCwKLSAgICAgICAgCQkJCQlBZGRyZXNzaW5nQ29uc3RhbnRzLldTQV9SRVBMWV9UTyk7Ci0gICAgICAgIAkJfQotICAgICAgICAJCWlmICghQWRkcmVzc2luZ0hlbHBlci5pc1N5bmNGYXVsdEFsbG93ZWQobXNnQ29udGV4dCkpIHsKLSAgICAgICAgCQkJRW5kcG9pbnRSZWZlcmVuY2UgYW5vbkVQUiA9Ci0gICAgICAgIAkJCQluZXcgRW5kcG9pbnRSZWZlcmVuY2UoQWRkcmVzc2luZ0NvbnN0YW50cy5GaW5hbC5XU0FfQU5PTllNT1VTX1VSTCk7Ci0gICAgICAgIAkJCW1zZ0NvbnRleHQuc2V0UmVwbHlUbyhhbm9uRVBSKTsKLSAgICAgICAgCQkJbXNnQ29udGV4dC5zZXRGYXVsdFRvKGFub25FUFIpOwotICAgICAgICAJCQlBZGRyZXNzaW5nRmF1bHRzSGVscGVyLnRyaWdnZXJPbmx5QW5vbnltb3VzQWRkcmVzc1N1cHBvcnRlZEZhdWx0KG1zZ0NvbnRleHQsCi0gICAgICAgIAkJCQkJQWRkcmVzc2luZ0NvbnN0YW50cy5XU0FfRkFVTFRfVE8pOwotICAgICAgICAJCX0KLSAgICAgICAgCX0gZWxzZSBpZiAoV1NBTV9JTlZPQ0FUSU9OX1BBVFRFUk5fQVNZTkNIUk9OT1VTLmVxdWFscyh2YWx1ZSkpIHsKLSAgICAgICAgCQlpZiAoIUFkZHJlc3NpbmdIZWxwZXIuaXNSZXBseVJlZGlyZWN0ZWQobXNnQ29udGV4dCkpIHsKLSAgICAgICAgCQkJQWRkcmVzc2luZ0ZhdWx0c0hlbHBlci50cmlnZ2VyT25seU5vbkFub255bW91c0FkZHJlc3NTdXBwb3J0ZWRGYXVsdChtc2dDb250ZXh0LAotICAgICAgICAJCQkJCUFkZHJlc3NpbmdDb25zdGFudHMuV1NBX1JFUExZX1RPKTsKLSAgICAgICAgCQl9Ci0gICAgICAgIAkJaWYgKCFBZGRyZXNzaW5nSGVscGVyLmlzRmF1bHRSZWRpcmVjdGVkKG1zZ0NvbnRleHQpKSB7Ci0gICAgICAgIAkJCUFkZHJlc3NpbmdGYXVsdHNIZWxwZXIudHJpZ2dlck9ubHlOb25Bbm9ueW1vdXNBZGRyZXNzU3VwcG9ydGVkRmF1bHQobXNnQ29udGV4dCwKLSAgICAgICAgCQkJCQlBZGRyZXNzaW5nQ29uc3RhbnRzLldTQV9GQVVMVF9UTyk7Ci0gICAgICAgIAkJfQotICAgICAgICAJfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVmFsaWRhdGUgdGhhdCBhIG1lc3NhZ2UgaWQgaXMgcHJlc2VudCB3aGVuIHJlcXVpcmVkLiBUaGUgY2hlY2sgYXBwbGllZCBoZXJlIG9ubHkgYXBwbGllcyB0bwotICAgICAqIFdTLUFkZHJlc3NpbmcgaGVhZGVycyB0aGF0IGNvbXBseSB3aXRoIHRoZSAyMDA1LzA4IChmaW5hbCkgc3BlYy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtc2dDb250ZXh0Ci0gICAgICogQHRocm93cyBBeGlzRmF1bHQKLSAgICAgKiBAc2VlIEFkZHJlc3NpbmdJbkhhbmRsZXIjY2hlY2tGb3JNYW5kYXRvcnlIZWFkZXJzCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrTWVzc2FnZUlESGVhZGVyKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBTdHJpbmcgbmFtZXNwYWNlID0gKFN0cmluZyltc2dDb250ZXh0LmdldExvY2FsUHJvcGVydHkoV1NfQUREUkVTU0lOR19WRVJTSU9OKTsKLSAgICAgICAgaWYgKCFGaW5hbC5XU0FfTkFNRVNQQUNFLmVxdWFscyhuYW1lc3BhY2UpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb24gPSBtc2dDb250ZXh0LmdldEF4aXNPcGVyYXRpb24oKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChheGlzT3BlcmF0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyBtZXAgPSBheGlzT3BlcmF0aW9uLmdldE1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4oKTsKLSAgICAgICAgICAgIGludCBtZXBDb25zdGFudCA9IFV0aWxzLmdldEF4aXNTcGVjaWZNRVBDb25zdGFudChtZXApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAobWVwQ29uc3RhbnQgPT0gV1NETENvbnN0YW50cy5NRVBfQ09OU1RBTlRfSU5fT1VUIHx8Ci0gICAgICAgICAgICAgICAgICAgIG1lcENvbnN0YW50ID09IFdTRExDb25zdGFudHMuTUVQX0NPTlNUQU5UX0lOX09QVElPTkFMX09VVCB8fAotICAgICAgICAgICAgICAgICAgICBtZXBDb25zdGFudCA9PSBXU0RMQ29uc3RhbnRzLk1FUF9DT05TVEFOVF9ST0JVU1RfSU5fT05MWSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlSWQgPSBtc2dDb250ZXh0LmdldE9wdGlvbnMoKS5nZXRNZXNzYWdlSWQoKTsKLSAgICAgICAgICAgICAgICBpZiAobWVzc2FnZUlkID09IG51bGwgfHwgIiIuZXF1YWxzKG1lc3NhZ2VJZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgQWRkcmVzc2luZ0ZhdWx0c0hlbHBlcgotICAgICAgICAgICAgICAgICAgICAudHJpZ2dlck1lc3NhZ2VBZGRyZXNzaW5nUmVxdWlyZWRGYXVsdChtc2dDb250ZXh0LCBXU0FfTUVTU0FHRV9JRCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRkcmVzc2luZy90ZXN0LXJlc291cmNlcy9PdXRIYW5kbGVyVGVzdC54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3QtcmVzb3VyY2VzL091dEhhbmRsZXJUZXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODIzNzZhOS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3QtcmVzb3VyY2VzL091dEhhbmRsZXJUZXN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHNvYXBlbnY6RW52ZWxvcGUgeG1sbnM6c29hcGVudj0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iPgotICAgIDxzb2FwZW52OkhlYWRlciB4bWxuczp3c2E9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDgvYWRkcmVzc2luZyIgeG1sbnM6bXlSZWY9Imh0dHA6Ly9yZWZlcmVuY2Uub3JnIj4KLSAgICAgICAgPHdzYTpGcm9tPgotICAgICAgICAgICAgPHdzYTpBZGRyZXNzPmh0dHA6Ly93d3cuZnJvbS5vcmcvc2VydmljZS88L3dzYTpBZGRyZXNzPgotICAgICAgICAgICAgPHdzYTpSZWZlcmVuY2VQYXJhbWV0ZXJzPgotICAgICAgICAgICAgICAgIDxSZWZlcmVuY2UyPlZhbHVlIDIwMDwvUmVmZXJlbmNlMj4KLSAgICAgICAgICAgIDwvd3NhOlJlZmVyZW5jZVBhcmFtZXRlcnM+Ci0gICAgICAgIDwvd3NhOkZyb20+Ci0gICAgICAgIDx3c2E6VG8+aHR0cDovL3d3dy50by5vcmcvc2VydmljZS88L3dzYTpUbz4KLSAgICAgICAgPHdzYTpNZXNzYWdlSUQ+MTIzNDU2LTc4OTA8L3dzYTpNZXNzYWdlSUQ+Ci0gICAgICAgIDxteVJlZjpSZWZlcmVuY2U0PlZhbHVlIDQwMDwvbXlSZWY6UmVmZXJlbmNlND4KLSAgICAgICAgPG15UmVmOlJlZmVyZW5jZTM+VmFsdWUgMzAwPC9teVJlZjpSZWZlcmVuY2UzPgotICAgICAgICA8d3NhOkFjdGlvbj5odHRwOi8vd3d3LmFjdGlvbnMub3JnL2FjdGlvbjwvd3NhOkFjdGlvbj4KLSAgICAgICAgPHdzYTpSZXBseVRvPgotICAgICAgICAgICAgPHdzYTpBZGRyZXNzPmh0dHA6Ly93d3cucmVwbHlUby5vcmcvc2VydmljZS88L3dzYTpBZGRyZXNzPgotICAgICAgICA8L3dzYTpSZXBseVRvPgotICAgICAgICA8d3NhOlJlbGF0ZXNUbyBSZWxhdGlvbnNoaXBUeXBlPSJUZXN0UmVsYXRpb24iPmh0dHA6Ly93d3cucmVsYXRlc1RvLm9yZy9zZXJ2aWNlLzwvd3NhOlJlbGF0ZXNUbz4KLSAgICA8L3NvYXBlbnY6SGVhZGVyPgotICAgIDxzb2FwZW52OkJvZHk+PC9zb2FwZW52OkJvZHk+Ci08L3NvYXBlbnY6RW52ZWxvcGU+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3QtcmVzb3VyY2VzL2F4aXMyLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkZHJlc3NpbmcvdGVzdC1yZXNvdXJjZXMvYXhpczIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTI1ZTFjLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkZHJlc3NpbmcvdGVzdC1yZXNvdXJjZXMvYXhpczIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08YXhpc2NvbmZpZyBuYW1lPSJBeGlzSmF2YTIuMCI+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJob3RkZXBsb3ltZW50Ij50cnVlPC9wYXJhbWV0ZXI+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJob3R1cGRhdGUiPnRydWU8L3BhcmFtZXRlcj4KLQotICAgIDxtZXNzYWdlUmVjZWl2ZXIgbWVwPSJJTk9VVCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLlJhd1hNTElOT3V0TWVzc2FnZVJlY2VpdmVyIi8+Ci0gICAgPHRyYW5zcG9ydFNlbmRlciBuYW1lPSJodHRwIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5Db21tb25zSFRUUFRyYW5zcG9ydFNlbmRlciI+Ci0gICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iUFJPVE9DT0wiPkhUVFAvMS4wPC9wYXJhbWV0ZXI+Ci0gICAgPC90cmFuc3BvcnRTZW5kZXI+Ci0KLSAgICA8bW9kdWxlIHJlZj0iYWRkcmVzc2luZyIvPgotCi0gICAgPHBoYXNlT3JkZXIgdHlwZT0iSW5GbG93Ij4KLSAgICAgICAgPCEtLSAgU3lzdGVtIHByZSBkZWZpbmVkIHBoYXNlcyAgICAgICAtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlRyYW5zcG9ydEluIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJQcmVEaXNwYXRjaCIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iRGlzcGF0Y2giIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5EaXNwYXRjaFBoYXNlIj4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiLz4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlJlcXVlc3RVUklPcGVyYXRpb25EaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5SZXF1ZXN0VVJJT3BlcmF0aW9uRGlzcGF0Y2hlciIvPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciIvPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciIvPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiLz4KLSAgICAgICAgPC9waGFzZT4KLSAgICAgICAgPCEtLSAgU3lzdGVtIHByZSBkZWZpbmVkIHBoYXNlcyAgICAgICAtLT4KLSAgICAgICAgPCEtLSAgIEFmdGVyIFBvc3RkaXNwYXRjaCBwaGFzZSBtb2R1bGUgYXV0aG9yIG9yIG9yIHNlcnZpY2UgYXV0aG9yIGNhbiBhZGQgYW55IHBoYXNlIGhlIHdhbnQgICAgICAtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9InVzZXJwaGFzZTEiLz4KLSAgICA8L3BoYXNlT3JkZXI+Ci0gICAgPHBoYXNlT3JkZXIgdHlwZT0iT3V0RmxvdyI+Ci0gICAgICAgIDwhLS0gICAgICB1c2VyIGNhbiBhZGQgaGlzIG93biBwaGFzZXMgdG8gdGhpcyBhcmVhICAtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9InVzZXJwaGFzZTEiLz4KLSAgICAgICAgPCEtLXN5c3RlbSBwcmVkZWZpbmVkIHBoYXNlLS0+Ci0gICAgICAgIDwhLS10aGVzZSBwaGFzZSB3aWxsIHJ1biBpcnJlc3BlY3RpdmUgb2YgdGhlIHNlcnZpY2UtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlBvbGljeURldGVybWluYXRpb24iLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik1lc3NhZ2VPdXQiLz4KLSAgICA8L3BoYXNlT3JkZXI+Ci0gICAgPHBoYXNlT3JkZXIgdHlwZT0iSW5GYXVsdEZsb3ciPgotICAgICAgICA8IS0tICAgICAgdXNlciBjYW4gYWRkIGhpcyBvd24gcGhhc2VzIHRvIHRoaXMgYXJlYSAgLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJ1c2VycGhhc2UxIi8+Ci0gICAgPC9waGFzZU9yZGVyPgotICAgIDxwaGFzZU9yZGVyIHR5cGU9Ik91dEZhdWx0RmxvdyI+Ci0gICAgICAgIDwhLS0gICAgICB1c2VyIGNhbiBhZGQgaGlzIG93biBwaGFzZXMgdG8gdGhpcyBhcmVhICAtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9InVzZXJwaGFzZTEiLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlBvbGljeURldGVybWluYXRpb24iLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik1lc3NhZ2VPdXQiLz4KLSAgICA8L3BoYXNlT3JkZXI+Ci08L2F4aXNjb25maWc+Ci0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkZHJlc3NpbmcvdGVzdC1yZXNvdXJjZXMvZXByVGVzdC54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3QtcmVzb3VyY2VzL2VwclRlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjJkYjM4Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkZHJlc3NpbmcvdGVzdC1yZXNvdXJjZXMvZXByVGVzdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzb2FwZW52OkVudmVsb3BlIHhtbG5zOnNvYXBlbnY9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIj4KLSAgICA8c29hcGVudjpIZWFkZXIgeG1sbnM6d3NhPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA4L2FkZHJlc3NpbmciIHhtbG5zOmF4aXMyPSJodHRwOi8vd3MuYXBhY2hlLm9yZy9uYW1lc3BhY2VzL2F4aXMyIj4KLSAgICAgICAgPHdzYTpSZWZlcmVuY2U0PlZhbHVlIDQwMDwvd3NhOlJlZmVyZW5jZTQ+Ci0gICAgICAgIDx3c2E6UmVmZXJlbmNlMT5WYWx1ZSAxMDA8L3dzYTpSZWZlcmVuY2UxPgotICAgICAgICA8d3NhOlJlZmVyZW5jZTA+VmFsdWUgMDwvd3NhOlJlZmVyZW5jZTA+Ci0gICAgICAgIDx3c2E6UmVmZXJlbmNlMj5WYWx1ZSAyMDA8L3dzYTpSZWZlcmVuY2UyPgotICAgICAgICA8d3NhOlJlZmVyZW5jZTM+VmFsdWUgMzAwPC93c2E6UmVmZXJlbmNlMz4KLSAgICAgICAgPHdzYTpUbz5odHRwOi8vd3d3LnRvLm9yZy9zZXJ2aWNlLzwvd3NhOlRvPgotICAgICAgICA8d3NhOlJlcGx5VG8+Ci0gICAgICAgICAgICA8d3NhOkFkZHJlc3M+Ci0gICAgICAgICAgICAgICAgaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOC9hZGRyZXNzaW5nL3JvbGUvYW5vbnltb3VzCi0gICAgICAgICAgICA8L3dzYTpBZGRyZXNzPgotICAgICAgICA8L3dzYTpSZXBseVRvPgotICAgICAgICA8d3NhOkFjdGlvbiBheGlzMjpBdHRyRXh0PSIxMjM0NTY3ODkiPmh0dHA6Ly93d3cuYWN0aW9ucy5vcmcvYWN0aW9uPC93c2E6QWN0aW9uPgotICAgICAgICA8d3NhOk1lc3NhZ2VJRCBheGlzMjpBdHRyRXh0PSIxMjM0NTY3ODkiPnVybjp0ZXN0OjEyMzwvd3NhOk1lc3NhZ2VJRD4KLSAgICA8L3NvYXBlbnY6SGVhZGVyPgotICAgIDxzb2FwZW52OkJvZHkvPgotPC9zb2FwZW52OkVudmVsb3BlPgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRkcmVzc2luZy90ZXN0LXJlc291cmNlcy9mYXVsdC1tZXNzYWdlcy9zb2FwMTEvSW52YWxpZEFkZHJlc3NpbmdIZWFkZXIueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRkcmVzc2luZy90ZXN0LXJlc291cmNlcy9mYXVsdC1tZXNzYWdlcy9zb2FwMTEvSW52YWxpZEFkZHJlc3NpbmdIZWFkZXIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MmE4YmJjLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkZHJlc3NpbmcvdGVzdC1yZXNvdXJjZXMvZmF1bHQtbWVzc2FnZXMvc29hcDExL0ludmFsaWRBZGRyZXNzaW5nSGVhZGVyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHNvYXBlbnY6RW52ZWxvcGUgeG1sbnM6c29hcGVudj0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iIHhtbG5zOnNvYXBlbmM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczp3c2E9Imh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDgvYWRkcmVzc2luZyI+Ci0gICAgPHNvYXBlbnY6SGVhZGVyPgotICAgICAgICA8d3NhOkZhdWx0RGV0YWlsIHhtbG5zOndzYT0iaHR0cDovL3d3dy53My5vcmcvMjAwNS8wOC9hZGRyZXNzaW5nIj4KLSAgICAgICAgICAgIDx3c2E6UHJvYmxlbUhlYWRlclFOYW1lPndzYTpUbzwvd3NhOlByb2JsZW1IZWFkZXJRTmFtZT4KLQotICAgICAgICA8L3dzYTpGYXVsdERldGFpbD4KLSAgICAgICAgPHdzYTpUbyB4bWxuczp3c2E9Imh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDgvYWRkcmVzc2luZyI+aHR0cDovL3d3dy53My5vcmcvMjAwNS8wOC9hZGRyZXNzaW5nL2Fub255bW91czwvd3NhOlRvPgotICAgICAgICA8d3NhOkFjdGlvbiB4bWxuczp3c2E9Imh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDgvYWRkcmVzc2luZyI+aHR0cDovL3d3dy53My5vcmcvMjAwNS8wOC9hZGRyZXNzaW5nL2ZhdWx0PC93c2E6QWN0aW9uPgotICAgICAgICA8d3NhOk1lc3NhZ2VJRCB4bWxuczp3c2E9Imh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDgvYWRkcmVzc2luZyI+dXVpZDpEMUMwQjkxRS0wMTA5LTQwMDAtRTAwMC0wMkFDQzBBODAxNUU8L3dzYTpNZXNzYWdlSUQ+Ci0gICAgICAgIDx3c2E6UmVsYXRlc1RvIHhtbG5zOndzYT0iaHR0cDovL3d3dy53My5vcmcvMjAwNS8wOC9hZGRyZXNzaW5nIj51cm46dXVpZDo5YTM1YWZjOC03YmU2LTRhNDEtYmE2NC05MmE0NGY3M2EzZDc8L3dzYTpSZWxhdGVzVG8+Ci0gICAgPC9zb2FwZW52OkhlYWRlcj4KLSAgICA8c29hcGVudjpCb2R5PgotCi0gICAgICAgIDxzb2FwZW52OkZhdWx0PgotICAgICAgICAgICAgPGZhdWx0Y29kZT53c2E6SW52YWxpZEFkZHJlc3NpbmdIZWFkZXI8L2ZhdWx0Y29kZT4KLSAgICAgICAgICAgIDxmYXVsdHN0cmluZz48IVtDREFUQVtBIGhlYWRlciByZXByZXNlbnRpbmcgYSBNZXNzYWdlIEFkZHJlc3NpbmcgUHJvcGVydHkgaXMgbm90IHZhbGlkIGFuZCB0aGUgbWVzc2FnZSBjYW5ub3QgYmUgcHJvY2Vzc2VkXV0+PC9mYXVsdHN0cmluZz4KLSAgICAgICAgPC9zb2FwZW52OkZhdWx0PgotICAgIDwvc29hcGVudjpCb2R5PgotPC9zb2FwZW52OkVudmVsb3BlPgotCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3QtcmVzb3VyY2VzL2ZhdWx0LW1lc3NhZ2VzL3NvYXAxMS9NZXNzYWdlQWRkcmVzc2luZ0hlYWRlclJlcXVpcmVkLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkZHJlc3NpbmcvdGVzdC1yZXNvdXJjZXMvZmF1bHQtbWVzc2FnZXMvc29hcDExL01lc3NhZ2VBZGRyZXNzaW5nSGVhZGVyUmVxdWlyZWQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDdlZDdkLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkZHJlc3NpbmcvdGVzdC1yZXNvdXJjZXMvZmF1bHQtbWVzc2FnZXMvc29hcDExL01lc3NhZ2VBZGRyZXNzaW5nSGVhZGVyUmVxdWlyZWQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08c29hcGVudjpFbnZlbG9wZSB4bWxuczpzb2FwZW52PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyIgeG1sbnM6c29hcGVuYz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOndzYT0iaHR0cDovL3d3dy53My5vcmcvMjAwNS8wOC9hZGRyZXNzaW5nIj4KLSAgICA8c29hcGVudjpIZWFkZXI+Ci0KLSAgICAgICAgPHdzYTpGYXVsdERldGFpbCB4bWxuczp3c2E9Imh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDgvYWRkcmVzc2luZyI+Ci0gICAgICAgICAgICA8d3NhOlByb2JsZW1IZWFkZXJRTmFtZT53c2E6QWN0aW9uPC93c2E6UHJvYmxlbUhlYWRlclFOYW1lPgotICAgICAgICA8L3dzYTpGYXVsdERldGFpbD4KLSAgICAgICAgPHdzYTpUbyB4bWxuczp3c2E9Imh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDgvYWRkcmVzc2luZyI+aHR0cDovL3d3dy53My5vcmcvMjAwNS8wOC9hZGRyZXNzaW5nL2Fub255bW91czwvd3NhOlRvPgotICAgICAgICA8d3NhOkFjdGlvbiB4bWxuczp3c2E9Imh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDgvYWRkcmVzc2luZyI+aHR0cDovL3d3dy53My5vcmcvMjAwNS8wOC9hZGRyZXNzaW5nL2ZhdWx0PC93c2E6QWN0aW9uPgotICAgICAgICA8d3NhOk1lc3NhZ2VJRCB4bWxuczp3c2E9Imh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDgvYWRkcmVzc2luZyI+dXVpZDpEMUMwQzNERi0wMTA5LTQwMDAtRTAwMC0wMkFDQzBBODAxNUU8L3dzYTpNZXNzYWdlSUQ+Ci0gICAgICAgIDx3c2E6UmVsYXRlc1RvIHhtbG5zOndzYT0iaHR0cDovL3d3dy53My5vcmcvMjAwNS8wOC9hZGRyZXNzaW5nIj51cm46dXVpZDozMjExOWFiZi05NGM0LTQ4ZTAtYmRhNS0zZGFhYWE5MDc3MWU8L3dzYTpSZWxhdGVzVG8+Ci0KLSAgICA8L3NvYXBlbnY6SGVhZGVyPgotICAgIDxzb2FwZW52OkJvZHk+Ci0gICAgICAgIDxzb2FwZW52OkZhdWx0PgotICAgICAgICAgICAgPGZhdWx0Y29kZT53c2E6TWVzc2FnZUFkZHJlc3NpbmdIZWFkZXJSZXF1aXJlZDwvZmF1bHRjb2RlPgotICAgICAgICAgICAgPGZhdWx0c3RyaW5nPjwhW0NEQVRBW0EgcmVxdWlyZWQgaGVhZGVyIHJlcHJlc2VudGluZyBhIE1lc3NhZ2UgQWRkcmVzc2luZyBQcm9wZXJ0eSBpcyBub3QgcHJlc2VudF1dPjwvZmF1bHRzdHJpbmc+Ci0gICAgICAgIDwvc29hcGVudjpGYXVsdD4KLSAgICA8L3NvYXBlbnY6Qm9keT4KLTwvc29hcGVudjpFbnZlbG9wZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3QtcmVzb3VyY2VzL2ZhdWx0LW1lc3NhZ2VzL3NvYXAxMi9JbnZhbGlkQWRkcmVzc2luZ0hlYWRlci54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3QtcmVzb3VyY2VzL2ZhdWx0LW1lc3NhZ2VzL3NvYXAxMi9JbnZhbGlkQWRkcmVzc2luZ0hlYWRlci54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjYTUwYzMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRkcmVzc2luZy90ZXN0LXJlc291cmNlcy9mYXVsdC1tZXNzYWdlcy9zb2FwMTIvSW52YWxpZEFkZHJlc3NpbmdIZWFkZXIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08c29hcGVudjpFbnZlbG9wZSB4bWxuczpzb2FwZW52PSJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUiIHhtbG5zOnNvYXBlbmM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbmNvZGluZyIgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6d3NhPSJodHRwOi8vd3d3LnczLm9yZy8yMDA1LzA4L2FkZHJlc3NpbmciPgotICAgIDxzb2FwZW52OkhlYWRlcj4KLSAgICAgICAgPHdzYTpUbyB4bWxuczp3c2E9Imh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDgvYWRkcmVzc2luZyI+aHR0cDovL3d3dy53My5vcmcvMjAwNS8wOC9hZGRyZXNzaW5nL2Fub255bW91czwvd3NhOlRvPgotCi0gICAgICAgIDx3c2E6QWN0aW9uIHhtbG5zOndzYT0iaHR0cDovL3d3dy53My5vcmcvMjAwNS8wOC9hZGRyZXNzaW5nIj5odHRwOi8vd3d3LnczLm9yZy8yMDA1LzA4L2FkZHJlc3NpbmcvZmF1bHQ8L3dzYTpBY3Rpb24+Ci0gICAgICAgIDx3c2E6TWVzc2FnZUlEIHhtbG5zOndzYT0iaHR0cDovL3d3dy53My5vcmcvMjAwNS8wOC9hZGRyZXNzaW5nIj51dWlkOkQxQzBDNTVDLTAxMDktNDAwMC1FMDAwLTAyQUNDMEE4MDE1RTwvd3NhOk1lc3NhZ2VJRD4KLSAgICAgICAgPHdzYTpSZWxhdGVzVG8geG1sbnM6d3NhPSJodHRwOi8vd3d3LnczLm9yZy8yMDA1LzA4L2FkZHJlc3NpbmciPnVybjp1dWlkOjUzZWI0MmVhLWIzZTUtNGU0Ny05OTFhLTYxMjIzNjUyZTZjODwvd3NhOlJlbGF0ZXNUbz4KLSAgICA8L3NvYXBlbnY6SGVhZGVyPgotICAgIDxzb2FwZW52OkJvZHk+Ci0gICAgICAgIDxzb2FwZW52OkZhdWx0PgotICAgICAgICAgICAgPHNvYXBlbnY6Q29kZT4KLQotICAgICAgICAgICAgICAgIDxzb2FwZW52OlZhbHVlPnNvYXBlbnY6U2VuZGVyPC9zb2FwZW52OlZhbHVlPgotICAgICAgICAgICAgICAgIDxzb2FwZW52OlN1YmNvZGU+Ci0gICAgICAgICAgICAgICAgICAgIDxzb2FwZW52OlZhbHVlPndzYTpJbnZhbGlkQWRkcmVzc2luZ0hlYWRlcjwvc29hcGVudjpWYWx1ZT4KLSAgICAgICAgICAgICAgICA8L3NvYXBlbnY6U3ViY29kZT4KLSAgICAgICAgICAgIDwvc29hcGVudjpDb2RlPgotICAgICAgICAgICAgPHNvYXBlbnY6UmVhc29uPgotICAgICAgICAgICAgICAgIDxzb2FwZW52OlRleHQgeG1sOmxhbmc9ImVuLVVTIj48IVtDREFUQVtBIGhlYWRlciByZXByZXNlbnRpbmcgYSBNZXNzYWdlIEFkZHJlc3NpbmcgUHJvcGVydHkgaXMgbm90IHZhbGlkIGFuZCB0aGUgbWVzc2FnZSBjYW5ub3QgYmUgcHJvY2Vzc2VkXV0+PC9zb2FwZW52OlRleHQ+Ci0gICAgICAgICAgICA8L3NvYXBlbnY6UmVhc29uPgotCi0gICAgICAgICAgICA8c29hcGVudjpEZXRhaWw+Ci0gICAgICAgICAgICAgICAgPHdzYTpQcm9ibGVtSGVhZGVyUU5hbWU+d3NhOlRvPC93c2E6UHJvYmxlbUhlYWRlclFOYW1lPgotICAgICAgICAgICAgPC9zb2FwZW52OkRldGFpbD4KLSAgICAgICAgPC9zb2FwZW52OkZhdWx0PgotICAgIDwvc29hcGVudjpCb2R5PgotPC9zb2FwZW52OkVudmVsb3BlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkZHJlc3NpbmcvdGVzdC1yZXNvdXJjZXMvZmF1bHQtbWVzc2FnZXMvc29hcDEyL01lc3NhZ2VBZGRyZXNzaW5nSGVhZGVyUmVxdWlyZWQueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRkcmVzc2luZy90ZXN0LXJlc291cmNlcy9mYXVsdC1tZXNzYWdlcy9zb2FwMTIvTWVzc2FnZUFkZHJlc3NpbmdIZWFkZXJSZXF1aXJlZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjYjI0ZDIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRkcmVzc2luZy90ZXN0LXJlc291cmNlcy9mYXVsdC1tZXNzYWdlcy9zb2FwMTIvTWVzc2FnZUFkZHJlc3NpbmdIZWFkZXJSZXF1aXJlZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzb2FwZW52OkVudmVsb3BlIHhtbG5zOnNvYXBlbnY9Imh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZSIgeG1sbnM6c29hcGVuYz0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVuY29kaW5nIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczp3c2E9Imh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDgvYWRkcmVzc2luZyI+Ci0gICAgPHNvYXBlbnY6SGVhZGVyPgotICAgICAgICA8d3NhOlRvIHhtbG5zOndzYT0iaHR0cDovL3d3dy53My5vcmcvMjAwNS8wOC9hZGRyZXNzaW5nIj5odHRwOi8vd3d3LnczLm9yZy8yMDA1LzA4L2FkZHJlc3NpbmcvYW5vbnltb3VzPC93c2E6VG8+Ci0KLSAgICAgICAgPHdzYTpBY3Rpb24geG1sbnM6d3NhPSJodHRwOi8vd3d3LnczLm9yZy8yMDA1LzA4L2FkZHJlc3NpbmciPmh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDgvYWRkcmVzc2luZy9mYXVsdDwvd3NhOkFjdGlvbj4KLSAgICAgICAgPHdzYTpNZXNzYWdlSUQgeG1sbnM6d3NhPSJodHRwOi8vd3d3LnczLm9yZy8yMDA1LzA4L2FkZHJlc3NpbmciPnV1aWQ6RDFDMENFNkYtMDEwOS00MDAwLUUwMDAtMDJBQ0MwQTgwMTVFPC93c2E6TWVzc2FnZUlEPgotICAgICAgICA8d3NhOlJlbGF0ZXNUbyB4bWxuczp3c2E9Imh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDgvYWRkcmVzc2luZyI+dXJuOnV1aWQ6Yzk2ZTAxNzItYzI1ZS00YTZlLWE5MGQtYTFmZTkzZTE0MWYwPC93c2E6UmVsYXRlc1RvPgotICAgIDwvc29hcGVudjpIZWFkZXI+Ci0gICAgPHNvYXBlbnY6Qm9keT4KLSAgICAgICAgPHNvYXBlbnY6RmF1bHQ+Ci0gICAgICAgICAgICA8c29hcGVudjpDb2RlPgotCi0gICAgICAgICAgICAgICAgPHNvYXBlbnY6VmFsdWU+c29hcGVudjpTZW5kZXI8L3NvYXBlbnY6VmFsdWU+Ci0gICAgICAgICAgICAgICAgPHNvYXBlbnY6U3ViY29kZT4KLSAgICAgICAgICAgICAgICAgICAgPHNvYXBlbnY6VmFsdWU+d3NhOkludmFsaWRBZGRyZXNzaW5nSGVhZGVyPC9zb2FwZW52OlZhbHVlPgotICAgICAgICAgICAgICAgIDwvc29hcGVudjpTdWJjb2RlPgotICAgICAgICAgICAgPC9zb2FwZW52OkNvZGU+Ci0gICAgICAgICAgICA8c29hcGVudjpSZWFzb24+Ci0gICAgICAgICAgICAgICAgPHNvYXBlbnY6VGV4dCB4bWw6bGFuZz0iZW4tVVMiPjwhW0NEQVRBW0EgaGVhZGVyIHJlcHJlc2VudGluZyBhIE1lc3NhZ2UgQWRkcmVzc2luZyBQcm9wZXJ0eSBpcyBub3QgdmFsaWQgYW5kIHRoZSBtZXNzYWdlIGNhbm5vdCBiZSBwcm9jZXNzZWRdXT48L3NvYXBlbnY6VGV4dD4KLSAgICAgICAgICAgIDwvc29hcGVudjpSZWFzb24+Ci0KLSAgICAgICAgICAgIDxzb2FwZW52OkRldGFpbD4KLSAgICAgICAgICAgICAgICA8d3NhOlByb2JsZW1IZWFkZXJRTmFtZT53c2E6VG88L3dzYTpQcm9ibGVtSGVhZGVyUU5hbWU+Ci0gICAgICAgICAgICA8L3NvYXBlbnY6RGV0YWlsPgotICAgICAgICA8L3NvYXBlbnY6RmF1bHQ+Ci0gICAgPC9zb2FwZW52OkJvZHk+Ci08L3NvYXBlbnY6RW52ZWxvcGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRkcmVzc2luZy90ZXN0LXJlc291cmNlcy9pbnZhbGlkLWNhcmRpbmFsaXR5LW1lc3NhZ2VzL2ZpbmFsL2ludmFsaWRDYXJkaW5hbGl0eUFjdGlvbk1lc3NhZ2UueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRkcmVzc2luZy90ZXN0LXJlc291cmNlcy9pbnZhbGlkLWNhcmRpbmFsaXR5LW1lc3NhZ2VzL2ZpbmFsL2ludmFsaWRDYXJkaW5hbGl0eUFjdGlvbk1lc3NhZ2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGQ4YjI1Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkZHJlc3NpbmcvdGVzdC1yZXNvdXJjZXMvaW52YWxpZC1jYXJkaW5hbGl0eS1tZXNzYWdlcy9maW5hbC9pbnZhbGlkQ2FyZGluYWxpdHlBY3Rpb25NZXNzYWdlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHNvYXBlbnY6RW52ZWxvcGUgeG1sbnM6c29hcGVudj0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iCi0gICAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgIHhtbG5zOndzYT0iaHR0cDovL3d3dy53My5vcmcvMjAwNS8wOC9hZGRyZXNzaW5nIj4KLSAgICA8c29hcGVudjpIZWFkZXIgeG1sbnM6ZmFicmlrYW09Imh0dHA6Ly9leGFtcGxlLmNvbS9mYWJyaWthbSIgeG1sbnM6YXhpczI9Imh0dHA6Ly93cy5hcGFjaGUub3JnL25hbWVzcGFjZXMvYXhpczIiPgotICAgICAgICA8d3NhOk1lc3NhZ2VJRCBheGlzMjpBdHRyRXh0PSIxMjM0NTY3ODkiIHNvYXBlbnY6bXVzdFVuZGVyc3RhbmQ9IjAiPgotICAgICAgICAgICAgdXVpZDo5MjBDNTE5MC0wQjhGLTExRDktOENFRC1GMjJFREVFQkY3RTU8L3dzYTpNZXNzYWdlSUQ+Ci0gICAgICAgIDx3c2E6VG8gYXhpczI6QXR0ckV4dD0iMTIzNDU2Nzg5IiBzb2FwZW52Om11c3RVbmRlcnN0YW5kPSIwIj5odHRwOi8vbG9jYWxob3N0OjgwODEvYXhpcy9zZXJ2aWNlcy9CYW5rUG9ydDwvd3NhOlRvPgotICAgICAgICA8d3NhOkZyb20gc29hcGVudjptdXN0VW5kZXJzdGFuZD0iMCI+Ci0gICAgICAgICAgICA8d3NhOkFkZHJlc3M+Ci0gICAgICAgICAgICAgICAgaHR0cDovL3d3dy53My5vcmcvMjAwNS8wOC9hZGRyZXNzaW5nL2Fub255bW91czwvd3NhOkFkZHJlc3M+Ci0gICAgICAgIDwvd3NhOkZyb20+Ci0gICAgICAgIDxheGlzMjpQYXJhbU9uZSB3c2E6SXNSZWZlcmVuY2VQYXJhbWV0ZXI9J3RydWUnPjEyMzQ1Njc4OTwvYXhpczI6UGFyYW1PbmU+Ci0gICAgICAgIDxheGlzMjpQYXJhbVR3byB3c2E6SXNSZWZlcmVuY2VQYXJhbWV0ZXI9J3RydWUnPkFCQ0RFRkc8L2F4aXMyOlBhcmFtVHdvPgotICAgICAgICA8d3NhOlJlcGx5VG8+Ci0gICAgICAgICAgICA8d3NhOkFkZHJlc3M+aHR0cDovL2V4YW1wbGUuY29tL2ZhYnJpa2FtL2FjY3Q8L3dzYTpBZGRyZXNzPgotICAgICAgICAgICAgPHdzYTpSZWZlcmVuY2VQYXJhbWV0ZXJzPgotICAgICAgICAgICAgICAgIDxmYWJyaWthbTpDdXN0b21lcktleT4xMjM0NTY3ODk8L2ZhYnJpa2FtOkN1c3RvbWVyS2V5PgotICAgICAgICAgICAgICAgIDxmYWJyaWthbTpTaG9wcGluZ0NhcnQ+QUJDREVGRzwvZmFicmlrYW06U2hvcHBpbmdDYXJ0PgotICAgICAgICAgICAgPC93c2E6UmVmZXJlbmNlUGFyYW1ldGVycz4KLSAgICAgICAgPC93c2E6UmVwbHlUbz4KLSAgICAgICAgPHdzYTpBY3Rpb24gYXhpczI6QXR0ckV4dD0iMTIzNDU2Nzg5Ij5odHRwOi8vd3MuYXBhY2hlLm9yZy90ZXN0cy9hY3Rpb248L3dzYTpBY3Rpb24+Ci0gICAgICAgIDx3c2E6QWN0aW9uIGF4aXMyOkF0dHJFeHQ9IjEyMzQ1Njc4OSI+aHR0cDovL3dzLmFwYWNoZS5vcmcvdGVzdHMvYWN0aW9uPC93c2E6QWN0aW9uPgotICAgICAgICA8d3NhOkZhdWx0VG8+Ci0gICAgICAgICAgICA8d3NhOkFkZHJlc3M+aHR0cDovL2V4YW1wbGUuY29tL2ZhYnJpa2FtL2ZhdWx0PC93c2E6QWRkcmVzcz4KLSAgICAgICAgPC93c2E6RmF1bHRUbz4KLSAgICA8L3NvYXBlbnY6SGVhZGVyPgotICAgIDxzb2FwZW52OkJvZHk+Ci0gICAgICAgIDxuczE6Z2V0QmFsYW5jZSBzb2FwZW52OmVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIgotICAgICAgICAgICAgICAgIHhtbG5zOm5zMT0iaHR0cDovL2xvY2FsaG9zdDo4MDgxL2F4aXMvc2VydmljZXMvQmFua1BvcnQiPgotICAgICAgICAgICAgPGFjY291bnRObyBocmVmPSIjaWQwIi8+Ci0gICAgICAgIDwvbnMxOmdldEJhbGFuY2U+Ci0gICAgICAgIDxtdWx0aVJlZiBpZD0iaWQwIiBzb2FwZW5jOnJvb3Q9IjAiCi0gICAgICAgICAgICAgICAgc29hcGVudjplbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIKLSAgICAgICAgICAgICAgICB4c2k6dHlwZT0ieHNkOmludCIgeG1sbnM6c29hcGVuYz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iPgotICAgICAgICAgICAgMTAwMTwvbXVsdGlSZWY+Ci0gICAgPC9zb2FwZW52OkJvZHk+Ci08L3NvYXBlbnY6RW52ZWxvcGU+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3QtcmVzb3VyY2VzL2ludmFsaWQtY2FyZGluYWxpdHktbWVzc2FnZXMvZmluYWwvaW52YWxpZENhcmRpbmFsaXR5RmF1bHRUb01lc3NhZ2UueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRkcmVzc2luZy90ZXN0LXJlc291cmNlcy9pbnZhbGlkLWNhcmRpbmFsaXR5LW1lc3NhZ2VzL2ZpbmFsL2ludmFsaWRDYXJkaW5hbGl0eUZhdWx0VG9NZXNzYWdlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRiYWRjZC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3QtcmVzb3VyY2VzL2ludmFsaWQtY2FyZGluYWxpdHktbWVzc2FnZXMvZmluYWwvaW52YWxpZENhcmRpbmFsaXR5RmF1bHRUb01lc3NhZ2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08c29hcGVudjpFbnZlbG9wZSB4bWxuczpzb2FwZW52PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyIKLSAgICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgICAgeG1sbnM6d3NhPSJodHRwOi8vd3d3LnczLm9yZy8yMDA1LzA4L2FkZHJlc3NpbmciPgotICAgIDxzb2FwZW52OkhlYWRlciB4bWxuczpmYWJyaWthbT0iaHR0cDovL2V4YW1wbGUuY29tL2ZhYnJpa2FtIiB4bWxuczpheGlzMj0iaHR0cDovL3dzLmFwYWNoZS5vcmcvbmFtZXNwYWNlcy9heGlzMiI+Ci0gICAgICAgIDx3c2E6TWVzc2FnZUlEIGF4aXMyOkF0dHJFeHQ9IjEyMzQ1Njc4OSIgc29hcGVudjptdXN0VW5kZXJzdGFuZD0iMCI+Ci0gICAgICAgICAgICB1dWlkOjkyMEM1MTkwLTBCOEYtMTFEOS04Q0VELUYyMkVERUVCRjdFNTwvd3NhOk1lc3NhZ2VJRD4KLSAgICAgICAgPHdzYTpUbyBheGlzMjpBdHRyRXh0PSIxMjM0NTY3ODkiIHNvYXBlbnY6bXVzdFVuZGVyc3RhbmQ9IjAiPmh0dHA6Ly9sb2NhbGhvc3Q6ODA4MS9heGlzL3NlcnZpY2VzL0JhbmtQb3J0PC93c2E6VG8+Ci0gICAgICAgIDx3c2E6RnJvbSBzb2FwZW52Om11c3RVbmRlcnN0YW5kPSIwIj4KLSAgICAgICAgICAgIDx3c2E6QWRkcmVzcz4KLSAgICAgICAgICAgICAgICBodHRwOi8vd3d3LnczLm9yZy8yMDA1LzA4L2FkZHJlc3NpbmcvYW5vbnltb3VzPC93c2E6QWRkcmVzcz4KLSAgICAgICAgPC93c2E6RnJvbT4KLSAgICAgICAgPGF4aXMyOlBhcmFtT25lIHdzYTpJc1JlZmVyZW5jZVBhcmFtZXRlcj0ndHJ1ZSc+MTIzNDU2Nzg5PC9heGlzMjpQYXJhbU9uZT4KLSAgICAgICAgPGF4aXMyOlBhcmFtVHdvIHdzYTpJc1JlZmVyZW5jZVBhcmFtZXRlcj0ndHJ1ZSc+QUJDREVGRzwvYXhpczI6UGFyYW1Ud28+Ci0gICAgICAgIDx3c2E6UmVwbHlUbz4KLSAgICAgICAgICAgIDx3c2E6QWRkcmVzcz5odHRwOi8vZXhhbXBsZS5jb20vZmFicmlrYW0vYWNjdDwvd3NhOkFkZHJlc3M+Ci0gICAgICAgICAgICA8d3NhOlJlZmVyZW5jZVBhcmFtZXRlcnM+Ci0gICAgICAgICAgICAgICAgPGZhYnJpa2FtOkN1c3RvbWVyS2V5PjEyMzQ1Njc4OTwvZmFicmlrYW06Q3VzdG9tZXJLZXk+Ci0gICAgICAgICAgICAgICAgPGZhYnJpa2FtOlNob3BwaW5nQ2FydD5BQkNERUZHPC9mYWJyaWthbTpTaG9wcGluZ0NhcnQ+Ci0gICAgICAgICAgICA8L3dzYTpSZWZlcmVuY2VQYXJhbWV0ZXJzPgotICAgICAgICA8L3dzYTpSZXBseVRvPgotICAgICAgICA8d3NhOkFjdGlvbiBheGlzMjpBdHRyRXh0PSIxMjM0NTY3ODkiPmh0dHA6Ly93cy5hcGFjaGUub3JnL3Rlc3RzL2FjdGlvbjwvd3NhOkFjdGlvbj4KLSAgICAgICAgPHdzYTpGYXVsdFRvPgotICAgICAgICAgICAgPHdzYTpBZGRyZXNzPmh0dHA6Ly9leGFtcGxlLmNvbS9mYWJyaWthbS9mYXVsdDwvd3NhOkFkZHJlc3M+Ci0gICAgICAgIDwvd3NhOkZhdWx0VG8+Ci0gICAgICAgIDx3c2E6RmF1bHRUbz4KLSAgICAgICAgICAgIDx3c2E6QWRkcmVzcz5odHRwOi8vZXhhbXBsZS5jb20vZmFicmlrYW0vZmF1bHQ8L3dzYTpBZGRyZXNzPgotICAgICAgICA8L3dzYTpGYXVsdFRvPgotICAgIDwvc29hcGVudjpIZWFkZXI+Ci0gICAgPHNvYXBlbnY6Qm9keT4KLSAgICAgICAgPG5zMTpnZXRCYWxhbmNlIHNvYXBlbnY6ZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iCi0gICAgICAgICAgICAgICAgeG1sbnM6bnMxPSJodHRwOi8vbG9jYWxob3N0OjgwODEvYXhpcy9zZXJ2aWNlcy9CYW5rUG9ydCI+Ci0gICAgICAgICAgICA8YWNjb3VudE5vIGhyZWY9IiNpZDAiLz4KLSAgICAgICAgPC9uczE6Z2V0QmFsYW5jZT4KLSAgICAgICAgPG11bHRpUmVmIGlkPSJpZDAiIHNvYXBlbmM6cm9vdD0iMCIKLSAgICAgICAgICAgICAgICBzb2FwZW52OmVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIgotICAgICAgICAgICAgICAgIHhzaTp0eXBlPSJ4c2Q6aW50IiB4bWxuczpzb2FwZW5jPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyI+Ci0gICAgICAgICAgICAxMDAxPC9tdWx0aVJlZj4KLSAgICA8L3NvYXBlbnY6Qm9keT4KLTwvc29hcGVudjpFbnZlbG9wZT4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkZHJlc3NpbmcvdGVzdC1yZXNvdXJjZXMvaW52YWxpZC1jYXJkaW5hbGl0eS1tZXNzYWdlcy9maW5hbC9pbnZhbGlkQ2FyZGluYWxpdHlGcm9tTWVzc2FnZS54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3QtcmVzb3VyY2VzL2ludmFsaWQtY2FyZGluYWxpdHktbWVzc2FnZXMvZmluYWwvaW52YWxpZENhcmRpbmFsaXR5RnJvbU1lc3NhZ2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzAxNzBiLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkZHJlc3NpbmcvdGVzdC1yZXNvdXJjZXMvaW52YWxpZC1jYXJkaW5hbGl0eS1tZXNzYWdlcy9maW5hbC9pbnZhbGlkQ2FyZGluYWxpdHlGcm9tTWVzc2FnZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzb2FwZW52OkVudmVsb3BlIHhtbG5zOnNvYXBlbnY9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIgotICAgICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICAgICB4bWxuczp3c2E9Imh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDgvYWRkcmVzc2luZyI+Ci0gICAgPHNvYXBlbnY6SGVhZGVyIHhtbG5zOmZhYnJpa2FtPSJodHRwOi8vZXhhbXBsZS5jb20vZmFicmlrYW0iIHhtbG5zOmF4aXMyPSJodHRwOi8vd3MuYXBhY2hlLm9yZy9uYW1lc3BhY2VzL2F4aXMyIj4KLSAgICAgICAgPHdzYTpNZXNzYWdlSUQgYXhpczI6QXR0ckV4dD0iMTIzNDU2Nzg5IiBzb2FwZW52Om11c3RVbmRlcnN0YW5kPSIwIj4KLSAgICAgICAgICAgIHV1aWQ6OTIwQzUxOTAtMEI4Ri0xMUQ5LThDRUQtRjIyRURFRUJGN0U1PC93c2E6TWVzc2FnZUlEPgotICAgICAgICA8d3NhOlRvIGF4aXMyOkF0dHJFeHQ9IjEyMzQ1Njc4OSIgc29hcGVudjptdXN0VW5kZXJzdGFuZD0iMCI+aHR0cDovL2xvY2FsaG9zdDo4MDgxL2F4aXMvc2VydmljZXMvQmFua1BvcnQ8L3dzYTpUbz4KLSAgICAgICAgPHdzYTpGcm9tIHNvYXBlbnY6bXVzdFVuZGVyc3RhbmQ9IjAiPgotICAgICAgICAgICAgPHdzYTpBZGRyZXNzPgotICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDgvYWRkcmVzc2luZy9hbm9ueW1vdXM8L3dzYTpBZGRyZXNzPgotICAgICAgICA8L3dzYTpGcm9tPgotICAgICAgICA8d3NhOkZyb20gc29hcGVudjptdXN0VW5kZXJzdGFuZD0iMCI+Ci0gICAgICAgICAgICA8d3NhOkFkZHJlc3M+Ci0gICAgICAgICAgICAgICAgaHR0cDovL3d3dy53My5vcmcvMjAwNS8wOC9hZGRyZXNzaW5nL2Fub255bW91czwvd3NhOkFkZHJlc3M+Ci0gICAgICAgIDwvd3NhOkZyb20+Ci0gICAgICAgIDxheGlzMjpQYXJhbU9uZSB3c2E6SXNSZWZlcmVuY2VQYXJhbWV0ZXI9J3RydWUnPjEyMzQ1Njc4OTwvYXhpczI6UGFyYW1PbmU+Ci0gICAgICAgIDxheGlzMjpQYXJhbVR3byB3c2E6SXNSZWZlcmVuY2VQYXJhbWV0ZXI9J3RydWUnPkFCQ0RFRkc8L2F4aXMyOlBhcmFtVHdvPgotICAgICAgICA8d3NhOlJlcGx5VG8+Ci0gICAgICAgICAgICA8d3NhOkFkZHJlc3M+aHR0cDovL2V4YW1wbGUuY29tL2ZhYnJpa2FtL2FjY3Q8L3dzYTpBZGRyZXNzPgotICAgICAgICAgICAgPHdzYTpSZWZlcmVuY2VQYXJhbWV0ZXJzPgotICAgICAgICAgICAgICAgIDxmYWJyaWthbTpDdXN0b21lcktleT4xMjM0NTY3ODk8L2ZhYnJpa2FtOkN1c3RvbWVyS2V5PgotICAgICAgICAgICAgICAgIDxmYWJyaWthbTpTaG9wcGluZ0NhcnQ+QUJDREVGRzwvZmFicmlrYW06U2hvcHBpbmdDYXJ0PgotICAgICAgICAgICAgPC93c2E6UmVmZXJlbmNlUGFyYW1ldGVycz4KLSAgICAgICAgPC93c2E6UmVwbHlUbz4KLSAgICAgICAgPHdzYTpBY3Rpb24gYXhpczI6QXR0ckV4dD0iMTIzNDU2Nzg5Ij5odHRwOi8vd3MuYXBhY2hlLm9yZy90ZXN0cy9hY3Rpb248L3dzYTpBY3Rpb24+Ci0gICAgICAgIDx3c2E6RmF1bHRUbz4KLSAgICAgICAgICAgIDx3c2E6QWRkcmVzcz5odHRwOi8vZXhhbXBsZS5jb20vZmFicmlrYW0vZmF1bHQ8L3dzYTpBZGRyZXNzPgotICAgICAgICA8L3dzYTpGYXVsdFRvPgotICAgIDwvc29hcGVudjpIZWFkZXI+Ci0gICAgPHNvYXBlbnY6Qm9keT4KLSAgICAgICAgPG5zMTpnZXRCYWxhbmNlIHNvYXBlbnY6ZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iCi0gICAgICAgICAgICAgICAgeG1sbnM6bnMxPSJodHRwOi8vbG9jYWxob3N0OjgwODEvYXhpcy9zZXJ2aWNlcy9CYW5rUG9ydCI+Ci0gICAgICAgICAgICA8YWNjb3VudE5vIGhyZWY9IiNpZDAiLz4KLSAgICAgICAgPC9uczE6Z2V0QmFsYW5jZT4KLSAgICAgICAgPG11bHRpUmVmIGlkPSJpZDAiIHNvYXBlbmM6cm9vdD0iMCIKLSAgICAgICAgICAgICAgICBzb2FwZW52OmVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIgotICAgICAgICAgICAgICAgIHhzaTp0eXBlPSJ4c2Q6aW50IiB4bWxuczpzb2FwZW5jPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyI+Ci0gICAgICAgICAgICAxMDAxPC9tdWx0aVJlZj4KLSAgICA8L3NvYXBlbnY6Qm9keT4KLTwvc29hcGVudjpFbnZlbG9wZT4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkZHJlc3NpbmcvdGVzdC1yZXNvdXJjZXMvaW52YWxpZC1jYXJkaW5hbGl0eS1tZXNzYWdlcy9maW5hbC9pbnZhbGlkQ2FyZGluYWxpdHlNZXNzYWdlSURNZXNzYWdlLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkZHJlc3NpbmcvdGVzdC1yZXNvdXJjZXMvaW52YWxpZC1jYXJkaW5hbGl0eS1tZXNzYWdlcy9maW5hbC9pbnZhbGlkQ2FyZGluYWxpdHlNZXNzYWdlSURNZXNzYWdlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWEzMGEwMy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3QtcmVzb3VyY2VzL2ludmFsaWQtY2FyZGluYWxpdHktbWVzc2FnZXMvZmluYWwvaW52YWxpZENhcmRpbmFsaXR5TWVzc2FnZUlETWVzc2FnZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzb2FwZW52OkVudmVsb3BlIHhtbG5zOnNvYXBlbnY9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIgotICAgICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICAgICB4bWxuczp3c2E9Imh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDgvYWRkcmVzc2luZyI+Ci0gICAgPHNvYXBlbnY6SGVhZGVyIHhtbG5zOmZhYnJpa2FtPSJodHRwOi8vZXhhbXBsZS5jb20vZmFicmlrYW0iIHhtbG5zOmF4aXMyPSJodHRwOi8vd3MuYXBhY2hlLm9yZy9uYW1lc3BhY2VzL2F4aXMyIj4KLSAgICAgICAgPHdzYTpNZXNzYWdlSUQgYXhpczI6QXR0ckV4dD0iMTIzNDU2Nzg5IiBzb2FwZW52Om11c3RVbmRlcnN0YW5kPSIwIj4KLSAgICAgICAgICAgIHV1aWQ6OTIwQzUxOTAtMEI4Ri0xMUQ5LThDRUQtRjIyRURFRUJGN0U1PC93c2E6TWVzc2FnZUlEPgotICAgICAgICA8d3NhOk1lc3NhZ2VJRCBzb2FwZW52Om11c3RVbmRlcnN0YW5kPSIwIj4KLSAgICAgICAgICAgIHV1aWQ6ODIwQzUxOTAtMEI4Ri0xMUQ5LThEREQtRjY3RURFRUJGN1o2PC93c2E6TWVzc2FnZUlEPgotICAgICAgICA8d3NhOlRvIGF4aXMyOkF0dHJFeHQ9IjEyMzQ1Njc4OSIgc29hcGVudjptdXN0VW5kZXJzdGFuZD0iMCI+aHR0cDovL2xvY2FsaG9zdDo4MDgxL2F4aXMvc2VydmljZXMvQmFua1BvcnQ8L3dzYTpUbz4KLSAgICAgICAgPHdzYTpGcm9tIHNvYXBlbnY6bXVzdFVuZGVyc3RhbmQ9IjAiPgotICAgICAgICAgICAgPHdzYTpBZGRyZXNzPgotICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDgvYWRkcmVzc2luZy9hbm9ueW1vdXM8L3dzYTpBZGRyZXNzPgotICAgICAgICA8L3dzYTpGcm9tPgotICAgICAgICA8YXhpczI6UGFyYW1PbmUgd3NhOklzUmVmZXJlbmNlUGFyYW1ldGVyPSd0cnVlJz4xMjM0NTY3ODk8L2F4aXMyOlBhcmFtT25lPgotICAgICAgICA8YXhpczI6UGFyYW1Ud28gd3NhOklzUmVmZXJlbmNlUGFyYW1ldGVyPSd0cnVlJz5BQkNERUZHPC9heGlzMjpQYXJhbVR3bz4KLSAgICAgICAgPHdzYTpSZXBseVRvPgotICAgICAgICAgICAgPHdzYTpBZGRyZXNzPmh0dHA6Ly9leGFtcGxlLmNvbS9mYWJyaWthbS9hY2N0PC93c2E6QWRkcmVzcz4KLSAgICAgICAgICAgIDx3c2E6UmVmZXJlbmNlUGFyYW1ldGVycz4KLSAgICAgICAgICAgICAgICA8ZmFicmlrYW06Q3VzdG9tZXJLZXk+MTIzNDU2Nzg5PC9mYWJyaWthbTpDdXN0b21lcktleT4KLSAgICAgICAgICAgICAgICA8ZmFicmlrYW06U2hvcHBpbmdDYXJ0PkFCQ0RFRkc8L2ZhYnJpa2FtOlNob3BwaW5nQ2FydD4KLSAgICAgICAgICAgIDwvd3NhOlJlZmVyZW5jZVBhcmFtZXRlcnM+Ci0gICAgICAgIDwvd3NhOlJlcGx5VG8+Ci0gICAgICAgIDx3c2E6QWN0aW9uIGF4aXMyOkF0dHJFeHQ9IjEyMzQ1Njc4OSI+aHR0cDovL3dzLmFwYWNoZS5vcmcvdGVzdHMvYWN0aW9uPC93c2E6QWN0aW9uPgotICAgICAgICA8d3NhOkZhdWx0VG8+Ci0gICAgICAgICAgICA8d3NhOkFkZHJlc3M+aHR0cDovL2V4YW1wbGUuY29tL2ZhYnJpa2FtL2ZhdWx0PC93c2E6QWRkcmVzcz4KLSAgICAgICAgPC93c2E6RmF1bHRUbz4KLSAgICA8L3NvYXBlbnY6SGVhZGVyPgotICAgIDxzb2FwZW52OkJvZHk+Ci0gICAgICAgIDxuczE6Z2V0QmFsYW5jZSBzb2FwZW52OmVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIgotICAgICAgICAgICAgICAgIHhtbG5zOm5zMT0iaHR0cDovL2xvY2FsaG9zdDo4MDgxL2F4aXMvc2VydmljZXMvQmFua1BvcnQiPgotICAgICAgICAgICAgPGFjY291bnRObyBocmVmPSIjaWQwIi8+Ci0gICAgICAgIDwvbnMxOmdldEJhbGFuY2U+Ci0gICAgICAgIDxtdWx0aVJlZiBpZD0iaWQwIiBzb2FwZW5jOnJvb3Q9IjAiCi0gICAgICAgICAgICAgICAgc29hcGVudjplbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIKLSAgICAgICAgICAgICAgICB4c2k6dHlwZT0ieHNkOmludCIgeG1sbnM6c29hcGVuYz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iPgotICAgICAgICAgICAgMTAwMTwvbXVsdGlSZWY+Ci0gICAgPC9zb2FwZW52OkJvZHk+Ci08L3NvYXBlbnY6RW52ZWxvcGU+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3QtcmVzb3VyY2VzL2ludmFsaWQtY2FyZGluYWxpdHktbWVzc2FnZXMvZmluYWwvaW52YWxpZENhcmRpbmFsaXR5UmVwbHlUb01lc3NhZ2UueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRkcmVzc2luZy90ZXN0LXJlc291cmNlcy9pbnZhbGlkLWNhcmRpbmFsaXR5LW1lc3NhZ2VzL2ZpbmFsL2ludmFsaWRDYXJkaW5hbGl0eVJlcGx5VG9NZXNzYWdlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGI5ODVlMi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3QtcmVzb3VyY2VzL2ludmFsaWQtY2FyZGluYWxpdHktbWVzc2FnZXMvZmluYWwvaW52YWxpZENhcmRpbmFsaXR5UmVwbHlUb01lc3NhZ2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08c29hcGVudjpFbnZlbG9wZSB4bWxuczpzb2FwZW52PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyIKLSAgICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgICAgeG1sbnM6d3NhPSJodHRwOi8vd3d3LnczLm9yZy8yMDA1LzA4L2FkZHJlc3NpbmciPgotICAgIDxzb2FwZW52OkhlYWRlciB4bWxuczpmYWJyaWthbT0iaHR0cDovL2V4YW1wbGUuY29tL2ZhYnJpa2FtIiB4bWxuczpheGlzMj0iaHR0cDovL3dzLmFwYWNoZS5vcmcvbmFtZXNwYWNlcy9heGlzMiI+Ci0gICAgICAgIDx3c2E6TWVzc2FnZUlEIGF4aXMyOkF0dHJFeHQ9IjEyMzQ1Njc4OSIgc29hcGVudjptdXN0VW5kZXJzdGFuZD0iMCI+Ci0gICAgICAgICAgICB1dWlkOjkyMEM1MTkwLTBCOEYtMTFEOS04Q0VELUYyMkVERUVCRjdFNTwvd3NhOk1lc3NhZ2VJRD4KLSAgICAgICAgPHdzYTpUbyBheGlzMjpBdHRyRXh0PSIxMjM0NTY3ODkiIHNvYXBlbnY6bXVzdFVuZGVyc3RhbmQ9IjAiPmh0dHA6Ly9sb2NhbGhvc3Q6ODA4MS9heGlzL3NlcnZpY2VzL0JhbmtQb3J0PC93c2E6VG8+Ci0gICAgICAgIDx3c2E6RnJvbSBzb2FwZW52Om11c3RVbmRlcnN0YW5kPSIwIj4KLSAgICAgICAgICAgIDx3c2E6QWRkcmVzcz4KLSAgICAgICAgICAgICAgICBodHRwOi8vd3d3LnczLm9yZy8yMDA1LzA4L2FkZHJlc3NpbmcvYW5vbnltb3VzPC93c2E6QWRkcmVzcz4KLSAgICAgICAgPC93c2E6RnJvbT4KLSAgICAgICAgPGF4aXMyOlBhcmFtT25lIHdzYTpJc1JlZmVyZW5jZVBhcmFtZXRlcj0ndHJ1ZSc+MTIzNDU2Nzg5PC9heGlzMjpQYXJhbU9uZT4KLSAgICAgICAgPGF4aXMyOlBhcmFtVHdvIHdzYTpJc1JlZmVyZW5jZVBhcmFtZXRlcj0ndHJ1ZSc+QUJDREVGRzwvYXhpczI6UGFyYW1Ud28+Ci0gICAgICAgIDx3c2E6UmVwbHlUbz4KLSAgICAgICAgICAgIDx3c2E6QWRkcmVzcz5odHRwOi8vZXhhbXBsZS5jb20vZmFicmlrYW0vYWNjdDwvd3NhOkFkZHJlc3M+Ci0gICAgICAgICAgICA8d3NhOlJlZmVyZW5jZVBhcmFtZXRlcnM+Ci0gICAgICAgICAgICAgICAgPGZhYnJpa2FtOkN1c3RvbWVyS2V5PjEyMzQ1Njc4OTwvZmFicmlrYW06Q3VzdG9tZXJLZXk+Ci0gICAgICAgICAgICAgICAgPGZhYnJpa2FtOlNob3BwaW5nQ2FydD5BQkNERUZHPC9mYWJyaWthbTpTaG9wcGluZ0NhcnQ+Ci0gICAgICAgICAgICA8L3dzYTpSZWZlcmVuY2VQYXJhbWV0ZXJzPgotICAgICAgICA8L3dzYTpSZXBseVRvPgotICAgICAgICA8d3NhOkFjdGlvbiBheGlzMjpBdHRyRXh0PSIxMjM0NTY3ODkiPmh0dHA6Ly93cy5hcGFjaGUub3JnL3Rlc3RzL2FjdGlvbjwvd3NhOkFjdGlvbj4KLSAgICAgICAgPHdzYTpSZXBseVRvPgotICAgICAgICAgICAgPHdzYTpBZGRyZXNzPmh0dHA6Ly9leGFtcGxlLmNvbS9mYWJyaWthbS9hY2N0Mjwvd3NhOkFkZHJlc3M+Ci0gICAgICAgICAgICA8d3NhOlJlZmVyZW5jZVBhcmFtZXRlcnM+Ci0gICAgICAgICAgICAgICAgPGZhYnJpa2FtOkN1c3RvbWVyS2V5PjEyMzQ1Njc4OTwvZmFicmlrYW06Q3VzdG9tZXJLZXk+Ci0gICAgICAgICAgICA8L3dzYTpSZWZlcmVuY2VQYXJhbWV0ZXJzPgotICAgICAgICA8L3dzYTpSZXBseVRvPgotICAgICAgICA8d3NhOkZhdWx0VG8+Ci0gICAgICAgICAgICA8d3NhOkFkZHJlc3M+aHR0cDovL2V4YW1wbGUuY29tL2ZhYnJpa2FtL2ZhdWx0PC93c2E6QWRkcmVzcz4KLSAgICAgICAgPC93c2E6RmF1bHRUbz4KLSAgICA8L3NvYXBlbnY6SGVhZGVyPgotICAgIDxzb2FwZW52OkJvZHk+Ci0gICAgICAgIDxuczE6Z2V0QmFsYW5jZSBzb2FwZW52OmVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIgotICAgICAgICAgICAgICAgIHhtbG5zOm5zMT0iaHR0cDovL2xvY2FsaG9zdDo4MDgxL2F4aXMvc2VydmljZXMvQmFua1BvcnQiPgotICAgICAgICAgICAgPGFjY291bnRObyBocmVmPSIjaWQwIi8+Ci0gICAgICAgIDwvbnMxOmdldEJhbGFuY2U+Ci0gICAgICAgIDxtdWx0aVJlZiBpZD0iaWQwIiBzb2FwZW5jOnJvb3Q9IjAiCi0gICAgICAgICAgICAgICAgc29hcGVudjplbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIKLSAgICAgICAgICAgICAgICB4c2k6dHlwZT0ieHNkOmludCIgeG1sbnM6c29hcGVuYz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iPgotICAgICAgICAgICAgMTAwMTwvbXVsdGlSZWY+Ci0gICAgPC9zb2FwZW52OkJvZHk+Ci08L3NvYXBlbnY6RW52ZWxvcGU+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3QtcmVzb3VyY2VzL2ludmFsaWQtY2FyZGluYWxpdHktbWVzc2FnZXMvZmluYWwvaW52YWxpZENhcmRpbmFsaXR5VG9NZXNzYWdlLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkZHJlc3NpbmcvdGVzdC1yZXNvdXJjZXMvaW52YWxpZC1jYXJkaW5hbGl0eS1tZXNzYWdlcy9maW5hbC9pbnZhbGlkQ2FyZGluYWxpdHlUb01lc3NhZ2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTM2MDc0Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkZHJlc3NpbmcvdGVzdC1yZXNvdXJjZXMvaW52YWxpZC1jYXJkaW5hbGl0eS1tZXNzYWdlcy9maW5hbC9pbnZhbGlkQ2FyZGluYWxpdHlUb01lc3NhZ2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08c29hcGVudjpFbnZlbG9wZSB4bWxuczpzb2FwZW52PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyIKLSAgICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgICAgeG1sbnM6d3NhPSJodHRwOi8vd3d3LnczLm9yZy8yMDA1LzA4L2FkZHJlc3NpbmciPgotICAgIDxzb2FwZW52OkhlYWRlciB4bWxuczpmYWJyaWthbT0iaHR0cDovL2V4YW1wbGUuY29tL2ZhYnJpa2FtIiB4bWxuczpheGlzMj0iaHR0cDovL3dzLmFwYWNoZS5vcmcvbmFtZXNwYWNlcy9heGlzMiI+Ci0gICAgICAgIDx3c2E6TWVzc2FnZUlEIGF4aXMyOkF0dHJFeHQ9IjEyMzQ1Njc4OSIgc29hcGVudjptdXN0VW5kZXJzdGFuZD0iMCI+Ci0gICAgICAgICAgICB1dWlkOjkyMEM1MTkwLTBCOEYtMTFEOS04Q0VELUYyMkVERUVCRjdFNTwvd3NhOk1lc3NhZ2VJRD4KLSAgICAgICAgPHdzYTpUbyBheGlzMjpBdHRyRXh0PSIxMjM0NTY3ODkiIHNvYXBlbnY6bXVzdFVuZGVyc3RhbmQ9IjAiPmh0dHA6Ly9sb2NhbGhvc3Q6ODA4MS9heGlzL3NlcnZpY2VzL0JhbmtQb3J0PC93c2E6VG8+Ci0gICAgICAgIDx3c2E6VG8gYXhpczI6QXR0ckV4dD0iMTIzNDU2Nzg5IiBzb2FwZW52Om11c3RVbmRlcnN0YW5kPSIwIj5odHRwOi8vbG9jYWxob3N0OjgwODEvYXhpcy9zZXJ2aWNlcy9CYW5rUG9ydDwvd3NhOlRvPgotICAgICAgICA8d3NhOkZyb20gc29hcGVudjptdXN0VW5kZXJzdGFuZD0iMCI+Ci0gICAgICAgICAgICA8d3NhOkFkZHJlc3M+Ci0gICAgICAgICAgICAgICAgaHR0cDovL3d3dy53My5vcmcvMjAwNS8wOC9hZGRyZXNzaW5nL2Fub255bW91czwvd3NhOkFkZHJlc3M+Ci0gICAgICAgIDwvd3NhOkZyb20+Ci0gICAgICAgIDxheGlzMjpQYXJhbU9uZSB3c2E6SXNSZWZlcmVuY2VQYXJhbWV0ZXI9J3RydWUnPjEyMzQ1Njc4OTwvYXhpczI6UGFyYW1PbmU+Ci0gICAgICAgIDxheGlzMjpQYXJhbVR3byB3c2E6SXNSZWZlcmVuY2VQYXJhbWV0ZXI9J3RydWUnPkFCQ0RFRkc8L2F4aXMyOlBhcmFtVHdvPgotICAgICAgICA8d3NhOlJlcGx5VG8+Ci0gICAgICAgICAgICA8d3NhOkFkZHJlc3M+aHR0cDovL2V4YW1wbGUuY29tL2ZhYnJpa2FtL2FjY3Q8L3dzYTpBZGRyZXNzPgotICAgICAgICAgICAgPHdzYTpSZWZlcmVuY2VQYXJhbWV0ZXJzPgotICAgICAgICAgICAgICAgIDxmYWJyaWthbTpDdXN0b21lcktleT4xMjM0NTY3ODk8L2ZhYnJpa2FtOkN1c3RvbWVyS2V5PgotICAgICAgICAgICAgICAgIDxmYWJyaWthbTpTaG9wcGluZ0NhcnQ+QUJDREVGRzwvZmFicmlrYW06U2hvcHBpbmdDYXJ0PgotICAgICAgICAgICAgPC93c2E6UmVmZXJlbmNlUGFyYW1ldGVycz4KLSAgICAgICAgPC93c2E6UmVwbHlUbz4KLSAgICAgICAgPHdzYTpBY3Rpb24gYXhpczI6QXR0ckV4dD0iMTIzNDU2Nzg5Ij5odHRwOi8vd3MuYXBhY2hlLm9yZy90ZXN0cy9hY3Rpb248L3dzYTpBY3Rpb24+Ci0gICAgICAgIDx3c2E6RmF1bHRUbz4KLSAgICAgICAgICAgIDx3c2E6QWRkcmVzcz5odHRwOi8vZXhhbXBsZS5jb20vZmFicmlrYW0vZmF1bHQ8L3dzYTpBZGRyZXNzPgotICAgICAgICA8L3dzYTpGYXVsdFRvPgotICAgIDwvc29hcGVudjpIZWFkZXI+Ci0gICAgPHNvYXBlbnY6Qm9keT4KLSAgICAgICAgPG5zMTpnZXRCYWxhbmNlIHNvYXBlbnY6ZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iCi0gICAgICAgICAgICAgICAgeG1sbnM6bnMxPSJodHRwOi8vbG9jYWxob3N0OjgwODEvYXhpcy9zZXJ2aWNlcy9CYW5rUG9ydCI+Ci0gICAgICAgICAgICA8YWNjb3VudE5vIGhyZWY9IiNpZDAiLz4KLSAgICAgICAgPC9uczE6Z2V0QmFsYW5jZT4KLSAgICAgICAgPG11bHRpUmVmIGlkPSJpZDAiIHNvYXBlbmM6cm9vdD0iMCIKLSAgICAgICAgICAgICAgICBzb2FwZW52OmVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIgotICAgICAgICAgICAgICAgIHhzaTp0eXBlPSJ4c2Q6aW50IiB4bWxuczpzb2FwZW5jPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyI+Ci0gICAgICAgICAgICAxMDAxPC9tdWx0aVJlZj4KLSAgICA8L3NvYXBlbnY6Qm9keT4KLTwvc29hcGVudjpFbnZlbG9wZT4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkZHJlc3NpbmcvdGVzdC1yZXNvdXJjZXMvaW52YWxpZC1jYXJkaW5hbGl0eS1tZXNzYWdlcy9zdWJtaXNzaW9uL2ludmFsaWRDYXJkaW5hbGl0eUFjdGlvbk1lc3NhZ2UueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRkcmVzc2luZy90ZXN0LXJlc291cmNlcy9pbnZhbGlkLWNhcmRpbmFsaXR5LW1lc3NhZ2VzL3N1Ym1pc3Npb24vaW52YWxpZENhcmRpbmFsaXR5QWN0aW9uTWVzc2FnZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyNzNkOGMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRkcmVzc2luZy90ZXN0LXJlc291cmNlcy9pbnZhbGlkLWNhcmRpbmFsaXR5LW1lc3NhZ2VzL3N1Ym1pc3Npb24vaW52YWxpZENhcmRpbmFsaXR5QWN0aW9uTWVzc2FnZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzb2FwZW52OkVudmVsb3BlIHhtbG5zOnNvYXBlbnY9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIgotICAgICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICAgICB4bWxuczp3c2E9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDgvYWRkcmVzc2luZyI+Ci0gICAgPHNvYXBlbnY6SGVhZGVyIHhtbG5zOmZhYnJpa2FtPSJodHRwOi8vZXhhbXBsZS5jb20vZmFicmlrYW0iIHhtbG5zOmF4aXMyPSJodHRwOi8vd3MuYXBhY2hlLm9yZy9uYW1lc3BhY2VzL2F4aXMyIj4KLSAgICAgICAgPHdzYTpNZXNzYWdlSUQgYXhpczI6QXR0ckV4dD0iMTIzNDU2Nzg5IiBzb2FwZW52Om11c3RVbmRlcnN0YW5kPSIwIj4KLSAgICAgICAgICAgIHV1aWQ6OTIwQzUxOTAtMEI4Ri0xMUQ5LThDRUQtRjIyRURFRUJGN0U1PC93c2E6TWVzc2FnZUlEPgotICAgICAgICA8d3NhOlRvIGF4aXMyOkF0dHJFeHQ9IjEyMzQ1Njc4OSIgc29hcGVudjptdXN0VW5kZXJzdGFuZD0iMCI+aHR0cDovL2xvY2FsaG9zdDo4MDgxL2F4aXMvc2VydmljZXMvQmFua1BvcnQ8L3dzYTpUbz4KLSAgICAgICAgPHdzYTpGcm9tIHNvYXBlbnY6bXVzdFVuZGVyc3RhbmQ9IjAiPgotICAgICAgICAgICAgPHdzYTpBZGRyZXNzPgotICAgICAgICAgICAgICAgIGh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDgvYWRkcmVzc2luZy9yb2xlL2Fub255bW91czwvd3NhOkFkZHJlc3M+Ci0gICAgICAgIDwvd3NhOkZyb20+Ci0gICAgICAgIDxheGlzMjpQYXJhbU9uZSB3c2E6SXNSZWZlcmVuY2VQYXJhbWV0ZXI9J3RydWUnPjEyMzQ1Njc4OTwvYXhpczI6UGFyYW1PbmU+Ci0gICAgICAgIDxheGlzMjpQYXJhbVR3byB3c2E6SXNSZWZlcmVuY2VQYXJhbWV0ZXI9J3RydWUnPkFCQ0RFRkc8L2F4aXMyOlBhcmFtVHdvPgotICAgICAgICA8d3NhOlJlcGx5VG8+Ci0gICAgICAgICAgICA8d3NhOkFkZHJlc3M+aHR0cDovL2V4YW1wbGUuY29tL2ZhYnJpa2FtL2FjY3Q8L3dzYTpBZGRyZXNzPgotICAgICAgICAgICAgPHdzYTpSZWZlcmVuY2VQYXJhbWV0ZXJzPgotICAgICAgICAgICAgICAgIDxmYWJyaWthbTpDdXN0b21lcktleT4xMjM0NTY3ODk8L2ZhYnJpa2FtOkN1c3RvbWVyS2V5PgotICAgICAgICAgICAgICAgIDxmYWJyaWthbTpTaG9wcGluZ0NhcnQ+QUJDREVGRzwvZmFicmlrYW06U2hvcHBpbmdDYXJ0PgotICAgICAgICAgICAgPC93c2E6UmVmZXJlbmNlUGFyYW1ldGVycz4KLSAgICAgICAgPC93c2E6UmVwbHlUbz4KLSAgICAgICAgPHdzYTpBY3Rpb24gYXhpczI6QXR0ckV4dD0iMTIzNDU2Nzg5Ij5odHRwOi8vd3MuYXBhY2hlLm9yZy90ZXN0cy9hY3Rpb248L3dzYTpBY3Rpb24+Ci0gICAgICAgIDx3c2E6QWN0aW9uIGF4aXMyOkF0dHJFeHQ9IjEyMzQ1Njc4OSI+aHR0cDovL3dzLmFwYWNoZS5vcmcvdGVzdHMvYWN0aW9uPC93c2E6QWN0aW9uPgotICAgICAgICA8d3NhOkZhdWx0VG8+Ci0gICAgICAgICAgICA8d3NhOkFkZHJlc3M+aHR0cDovL2V4YW1wbGUuY29tL2ZhYnJpa2FtL2ZhdWx0PC93c2E6QWRkcmVzcz4KLSAgICAgICAgPC93c2E6RmF1bHRUbz4KLSAgICA8L3NvYXBlbnY6SGVhZGVyPgotICAgIDxzb2FwZW52OkJvZHk+Ci0gICAgICAgIDxuczE6Z2V0QmFsYW5jZSBzb2FwZW52OmVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIgotICAgICAgICAgICAgICAgIHhtbG5zOm5zMT0iaHR0cDovL2xvY2FsaG9zdDo4MDgxL2F4aXMvc2VydmljZXMvQmFua1BvcnQiPgotICAgICAgICAgICAgPGFjY291bnRObyBocmVmPSIjaWQwIi8+Ci0gICAgICAgIDwvbnMxOmdldEJhbGFuY2U+Ci0gICAgICAgIDxtdWx0aVJlZiBpZD0iaWQwIiBzb2FwZW5jOnJvb3Q9IjAiCi0gICAgICAgICAgICAgICAgc29hcGVudjplbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIKLSAgICAgICAgICAgICAgICB4c2k6dHlwZT0ieHNkOmludCIgeG1sbnM6c29hcGVuYz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iPgotICAgICAgICAgICAgMTAwMTwvbXVsdGlSZWY+Ci0gICAgPC9zb2FwZW52OkJvZHk+Ci08L3NvYXBlbnY6RW52ZWxvcGU+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3QtcmVzb3VyY2VzL2ludmFsaWQtY2FyZGluYWxpdHktbWVzc2FnZXMvc3VibWlzc2lvbi9pbnZhbGlkQ2FyZGluYWxpdHlGYXVsdFRvTWVzc2FnZS54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3QtcmVzb3VyY2VzL2ludmFsaWQtY2FyZGluYWxpdHktbWVzc2FnZXMvc3VibWlzc2lvbi9pbnZhbGlkQ2FyZGluYWxpdHlGYXVsdFRvTWVzc2FnZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4MTE1YTMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRkcmVzc2luZy90ZXN0LXJlc291cmNlcy9pbnZhbGlkLWNhcmRpbmFsaXR5LW1lc3NhZ2VzL3N1Ym1pc3Npb24vaW52YWxpZENhcmRpbmFsaXR5RmF1bHRUb01lc3NhZ2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08c29hcGVudjpFbnZlbG9wZSB4bWxuczpzb2FwZW52PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyIKLSAgICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgICAgeG1sbnM6d3NhPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA4L2FkZHJlc3NpbmciPgotICAgIDxzb2FwZW52OkhlYWRlciB4bWxuczpmYWJyaWthbT0iaHR0cDovL2V4YW1wbGUuY29tL2ZhYnJpa2FtIiB4bWxuczpheGlzMj0iaHR0cDovL3dzLmFwYWNoZS5vcmcvbmFtZXNwYWNlcy9heGlzMiI+Ci0gICAgICAgIDx3c2E6TWVzc2FnZUlEIGF4aXMyOkF0dHJFeHQ9IjEyMzQ1Njc4OSIgc29hcGVudjptdXN0VW5kZXJzdGFuZD0iMCI+Ci0gICAgICAgICAgICB1dWlkOjkyMEM1MTkwLTBCOEYtMTFEOS04Q0VELUYyMkVERUVCRjdFNTwvd3NhOk1lc3NhZ2VJRD4KLSAgICAgICAgPHdzYTpUbyBheGlzMjpBdHRyRXh0PSIxMjM0NTY3ODkiIHNvYXBlbnY6bXVzdFVuZGVyc3RhbmQ9IjAiPmh0dHA6Ly9sb2NhbGhvc3Q6ODA4MS9heGlzL3NlcnZpY2VzL0JhbmtQb3J0PC93c2E6VG8+Ci0gICAgICAgIDx3c2E6RnJvbSBzb2FwZW52Om11c3RVbmRlcnN0YW5kPSIwIj4KLSAgICAgICAgICAgIDx3c2E6QWRkcmVzcz4KLSAgICAgICAgICAgICAgICBodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA4L2FkZHJlc3Npbmcvcm9sZS9hbm9ueW1vdXM8L3dzYTpBZGRyZXNzPgotICAgICAgICA8L3dzYTpGcm9tPgotICAgICAgICA8YXhpczI6UGFyYW1PbmUgd3NhOklzUmVmZXJlbmNlUGFyYW1ldGVyPSd0cnVlJz4xMjM0NTY3ODk8L2F4aXMyOlBhcmFtT25lPgotICAgICAgICA8YXhpczI6UGFyYW1Ud28gd3NhOklzUmVmZXJlbmNlUGFyYW1ldGVyPSd0cnVlJz5BQkNERUZHPC9heGlzMjpQYXJhbVR3bz4KLSAgICAgICAgPHdzYTpSZXBseVRvPgotICAgICAgICAgICAgPHdzYTpBZGRyZXNzPmh0dHA6Ly9leGFtcGxlLmNvbS9mYWJyaWthbS9hY2N0PC93c2E6QWRkcmVzcz4KLSAgICAgICAgICAgIDx3c2E6UmVmZXJlbmNlUGFyYW1ldGVycz4KLSAgICAgICAgICAgICAgICA8ZmFicmlrYW06Q3VzdG9tZXJLZXk+MTIzNDU2Nzg5PC9mYWJyaWthbTpDdXN0b21lcktleT4KLSAgICAgICAgICAgICAgICA8ZmFicmlrYW06U2hvcHBpbmdDYXJ0PkFCQ0RFRkc8L2ZhYnJpa2FtOlNob3BwaW5nQ2FydD4KLSAgICAgICAgICAgIDwvd3NhOlJlZmVyZW5jZVBhcmFtZXRlcnM+Ci0gICAgICAgIDwvd3NhOlJlcGx5VG8+Ci0gICAgICAgIDx3c2E6QWN0aW9uIGF4aXMyOkF0dHJFeHQ9IjEyMzQ1Njc4OSI+aHR0cDovL3dzLmFwYWNoZS5vcmcvdGVzdHMvYWN0aW9uPC93c2E6QWN0aW9uPgotICAgICAgICA8d3NhOkZhdWx0VG8+Ci0gICAgICAgICAgICA8d3NhOkFkZHJlc3M+aHR0cDovL2V4YW1wbGUuY29tL2ZhYnJpa2FtL2ZhdWx0PC93c2E6QWRkcmVzcz4KLSAgICAgICAgPC93c2E6RmF1bHRUbz4KLSAgICAgICAgPHdzYTpGYXVsdFRvPgotICAgICAgICAgICAgPHdzYTpBZGRyZXNzPmh0dHA6Ly9leGFtcGxlLmNvbS9mYWJyaWthbS9mYXVsdDwvd3NhOkFkZHJlc3M+Ci0gICAgICAgIDwvd3NhOkZhdWx0VG8+Ci0gICAgPC9zb2FwZW52OkhlYWRlcj4KLSAgICA8c29hcGVudjpCb2R5PgotICAgICAgICA8bnMxOmdldEJhbGFuY2Ugc29hcGVudjplbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIKLSAgICAgICAgICAgICAgICB4bWxuczpuczE9Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MS9heGlzL3NlcnZpY2VzL0JhbmtQb3J0Ij4KLSAgICAgICAgICAgIDxhY2NvdW50Tm8gaHJlZj0iI2lkMCIvPgotICAgICAgICA8L25zMTpnZXRCYWxhbmNlPgotICAgICAgICA8bXVsdGlSZWYgaWQ9ImlkMCIgc29hcGVuYzpyb290PSIwIgotICAgICAgICAgICAgICAgIHNvYXBlbnY6ZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iCi0gICAgICAgICAgICAgICAgeHNpOnR5cGU9InhzZDppbnQiIHhtbG5zOnNvYXBlbmM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIj4KLSAgICAgICAgICAgIDEwMDE8L211bHRpUmVmPgotICAgIDwvc29hcGVudjpCb2R5PgotPC9zb2FwZW52OkVudmVsb3BlPgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRkcmVzc2luZy90ZXN0LXJlc291cmNlcy9pbnZhbGlkLWNhcmRpbmFsaXR5LW1lc3NhZ2VzL3N1Ym1pc3Npb24vaW52YWxpZENhcmRpbmFsaXR5RnJvbU1lc3NhZ2UueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRkcmVzc2luZy90ZXN0LXJlc291cmNlcy9pbnZhbGlkLWNhcmRpbmFsaXR5LW1lc3NhZ2VzL3N1Ym1pc3Npb24vaW52YWxpZENhcmRpbmFsaXR5RnJvbU1lc3NhZ2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2RiZDE4Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkZHJlc3NpbmcvdGVzdC1yZXNvdXJjZXMvaW52YWxpZC1jYXJkaW5hbGl0eS1tZXNzYWdlcy9zdWJtaXNzaW9uL2ludmFsaWRDYXJkaW5hbGl0eUZyb21NZXNzYWdlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHNvYXBlbnY6RW52ZWxvcGUgeG1sbnM6c29hcGVudj0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iCi0gICAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgIHhtbG5zOndzYT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOC9hZGRyZXNzaW5nIj4KLSAgICA8c29hcGVudjpIZWFkZXIgeG1sbnM6ZmFicmlrYW09Imh0dHA6Ly9leGFtcGxlLmNvbS9mYWJyaWthbSIgeG1sbnM6YXhpczI9Imh0dHA6Ly93cy5hcGFjaGUub3JnL25hbWVzcGFjZXMvYXhpczIiPgotICAgICAgICA8d3NhOk1lc3NhZ2VJRCBheGlzMjpBdHRyRXh0PSIxMjM0NTY3ODkiIHNvYXBlbnY6bXVzdFVuZGVyc3RhbmQ9IjAiPgotICAgICAgICAgICAgdXVpZDo5MjBDNTE5MC0wQjhGLTExRDktOENFRC1GMjJFREVFQkY3RTU8L3dzYTpNZXNzYWdlSUQ+Ci0gICAgICAgIDx3c2E6VG8gYXhpczI6QXR0ckV4dD0iMTIzNDU2Nzg5IiBzb2FwZW52Om11c3RVbmRlcnN0YW5kPSIwIj5odHRwOi8vbG9jYWxob3N0OjgwODEvYXhpcy9zZXJ2aWNlcy9CYW5rUG9ydDwvd3NhOlRvPgotICAgICAgICA8d3NhOkZyb20gc29hcGVudjptdXN0VW5kZXJzdGFuZD0iMCI+Ci0gICAgICAgICAgICA8d3NhOkFkZHJlc3M+Ci0gICAgICAgICAgICAgICAgaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOC9hZGRyZXNzaW5nL3JvbGUvYW5vbnltb3VzPC93c2E6QWRkcmVzcz4KLSAgICAgICAgPC93c2E6RnJvbT4KLSAgICAgICAgPHdzYTpGcm9tIHNvYXBlbnY6bXVzdFVuZGVyc3RhbmQ9IjAiPgotICAgICAgICAgICAgPHdzYTpBZGRyZXNzPgotICAgICAgICAgICAgICAgIGh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDgvYWRkcmVzc2luZy9yb2xlL2Fub255bW91czwvd3NhOkFkZHJlc3M+Ci0gICAgICAgIDwvd3NhOkZyb20+Ci0gICAgICAgIDxheGlzMjpQYXJhbU9uZSB3c2E6SXNSZWZlcmVuY2VQYXJhbWV0ZXI9J3RydWUnPjEyMzQ1Njc4OTwvYXhpczI6UGFyYW1PbmU+Ci0gICAgICAgIDxheGlzMjpQYXJhbVR3byB3c2E6SXNSZWZlcmVuY2VQYXJhbWV0ZXI9J3RydWUnPkFCQ0RFRkc8L2F4aXMyOlBhcmFtVHdvPgotICAgICAgICA8d3NhOlJlcGx5VG8+Ci0gICAgICAgICAgICA8d3NhOkFkZHJlc3M+aHR0cDovL2V4YW1wbGUuY29tL2ZhYnJpa2FtL2FjY3Q8L3dzYTpBZGRyZXNzPgotICAgICAgICAgICAgPHdzYTpSZWZlcmVuY2VQYXJhbWV0ZXJzPgotICAgICAgICAgICAgICAgIDxmYWJyaWthbTpDdXN0b21lcktleT4xMjM0NTY3ODk8L2ZhYnJpa2FtOkN1c3RvbWVyS2V5PgotICAgICAgICAgICAgICAgIDxmYWJyaWthbTpTaG9wcGluZ0NhcnQ+QUJDREVGRzwvZmFicmlrYW06U2hvcHBpbmdDYXJ0PgotICAgICAgICAgICAgPC93c2E6UmVmZXJlbmNlUGFyYW1ldGVycz4KLSAgICAgICAgPC93c2E6UmVwbHlUbz4KLSAgICAgICAgPHdzYTpBY3Rpb24gYXhpczI6QXR0ckV4dD0iMTIzNDU2Nzg5Ij5odHRwOi8vd3MuYXBhY2hlLm9yZy90ZXN0cy9hY3Rpb248L3dzYTpBY3Rpb24+Ci0gICAgICAgIDx3c2E6RmF1bHRUbz4KLSAgICAgICAgICAgIDx3c2E6QWRkcmVzcz5odHRwOi8vZXhhbXBsZS5jb20vZmFicmlrYW0vZmF1bHQ8L3dzYTpBZGRyZXNzPgotICAgICAgICA8L3dzYTpGYXVsdFRvPgotICAgIDwvc29hcGVudjpIZWFkZXI+Ci0gICAgPHNvYXBlbnY6Qm9keT4KLSAgICAgICAgPG5zMTpnZXRCYWxhbmNlIHNvYXBlbnY6ZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iCi0gICAgICAgICAgICAgICAgeG1sbnM6bnMxPSJodHRwOi8vbG9jYWxob3N0OjgwODEvYXhpcy9zZXJ2aWNlcy9CYW5rUG9ydCI+Ci0gICAgICAgICAgICA8YWNjb3VudE5vIGhyZWY9IiNpZDAiLz4KLSAgICAgICAgPC9uczE6Z2V0QmFsYW5jZT4KLSAgICAgICAgPG11bHRpUmVmIGlkPSJpZDAiIHNvYXBlbmM6cm9vdD0iMCIKLSAgICAgICAgICAgICAgICBzb2FwZW52OmVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIgotICAgICAgICAgICAgICAgIHhzaTp0eXBlPSJ4c2Q6aW50IiB4bWxuczpzb2FwZW5jPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyI+Ci0gICAgICAgICAgICAxMDAxPC9tdWx0aVJlZj4KLSAgICA8L3NvYXBlbnY6Qm9keT4KLTwvc29hcGVudjpFbnZlbG9wZT4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkZHJlc3NpbmcvdGVzdC1yZXNvdXJjZXMvaW52YWxpZC1jYXJkaW5hbGl0eS1tZXNzYWdlcy9zdWJtaXNzaW9uL2ludmFsaWRDYXJkaW5hbGl0eU1lc3NhZ2VJRE1lc3NhZ2UueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRkcmVzc2luZy90ZXN0LXJlc291cmNlcy9pbnZhbGlkLWNhcmRpbmFsaXR5LW1lc3NhZ2VzL3N1Ym1pc3Npb24vaW52YWxpZENhcmRpbmFsaXR5TWVzc2FnZUlETWVzc2FnZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0YTgyNjcuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRkcmVzc2luZy90ZXN0LXJlc291cmNlcy9pbnZhbGlkLWNhcmRpbmFsaXR5LW1lc3NhZ2VzL3N1Ym1pc3Npb24vaW52YWxpZENhcmRpbmFsaXR5TWVzc2FnZUlETWVzc2FnZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzb2FwZW52OkVudmVsb3BlIHhtbG5zOnNvYXBlbnY9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIgotICAgICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICAgICB4bWxuczp3c2E9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDgvYWRkcmVzc2luZyI+Ci0gICAgPHNvYXBlbnY6SGVhZGVyIHhtbG5zOmZhYnJpa2FtPSJodHRwOi8vZXhhbXBsZS5jb20vZmFicmlrYW0iIHhtbG5zOmF4aXMyPSJodHRwOi8vd3MuYXBhY2hlLm9yZy9uYW1lc3BhY2VzL2F4aXMyIj4KLSAgICAgICAgPHdzYTpNZXNzYWdlSUQgYXhpczI6QXR0ckV4dD0iMTIzNDU2Nzg5IiBzb2FwZW52Om11c3RVbmRlcnN0YW5kPSIwIj4KLSAgICAgICAgICAgIHV1aWQ6OTIwQzUxOTAtMEI4Ri0xMUQ5LThDRUQtRjIyRURFRUJGN0U1PC93c2E6TWVzc2FnZUlEPgotICAgICAgICA8d3NhOk1lc3NhZ2VJRCBzb2FwZW52Om11c3RVbmRlcnN0YW5kPSIwIj4KLSAgICAgICAgICAgIHV1aWQ6ODIwQzUxOTAtMEI4Ri0xMUQ5LThEREQtRjY3RURFRUJGN1o2PC93c2E6TWVzc2FnZUlEPgotICAgICAgICA8d3NhOlRvIGF4aXMyOkF0dHJFeHQ9IjEyMzQ1Njc4OSIgc29hcGVudjptdXN0VW5kZXJzdGFuZD0iMCI+aHR0cDovL2xvY2FsaG9zdDo4MDgxL2F4aXMvc2VydmljZXMvQmFua1BvcnQ8L3dzYTpUbz4KLSAgICAgICAgPHdzYTpGcm9tIHNvYXBlbnY6bXVzdFVuZGVyc3RhbmQ9IjAiPgotICAgICAgICAgICAgPHdzYTpBZGRyZXNzPgotICAgICAgICAgICAgICAgIGh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDgvYWRkcmVzc2luZy9yb2xlL2Fub255bW91czwvd3NhOkFkZHJlc3M+Ci0gICAgICAgIDwvd3NhOkZyb20+Ci0gICAgICAgIDxheGlzMjpQYXJhbU9uZSB3c2E6SXNSZWZlcmVuY2VQYXJhbWV0ZXI9J3RydWUnPjEyMzQ1Njc4OTwvYXhpczI6UGFyYW1PbmU+Ci0gICAgICAgIDxheGlzMjpQYXJhbVR3byB3c2E6SXNSZWZlcmVuY2VQYXJhbWV0ZXI9J3RydWUnPkFCQ0RFRkc8L2F4aXMyOlBhcmFtVHdvPgotICAgICAgICA8d3NhOlJlcGx5VG8+Ci0gICAgICAgICAgICA8d3NhOkFkZHJlc3M+aHR0cDovL2V4YW1wbGUuY29tL2ZhYnJpa2FtL2FjY3Q8L3dzYTpBZGRyZXNzPgotICAgICAgICAgICAgPHdzYTpSZWZlcmVuY2VQYXJhbWV0ZXJzPgotICAgICAgICAgICAgICAgIDxmYWJyaWthbTpDdXN0b21lcktleT4xMjM0NTY3ODk8L2ZhYnJpa2FtOkN1c3RvbWVyS2V5PgotICAgICAgICAgICAgICAgIDxmYWJyaWthbTpTaG9wcGluZ0NhcnQ+QUJDREVGRzwvZmFicmlrYW06U2hvcHBpbmdDYXJ0PgotICAgICAgICAgICAgPC93c2E6UmVmZXJlbmNlUGFyYW1ldGVycz4KLSAgICAgICAgPC93c2E6UmVwbHlUbz4KLSAgICAgICAgPHdzYTpBY3Rpb24gYXhpczI6QXR0ckV4dD0iMTIzNDU2Nzg5Ij5odHRwOi8vd3MuYXBhY2hlLm9yZy90ZXN0cy9hY3Rpb248L3dzYTpBY3Rpb24+Ci0gICAgICAgIDx3c2E6RmF1bHRUbz4KLSAgICAgICAgICAgIDx3c2E6QWRkcmVzcz5odHRwOi8vZXhhbXBsZS5jb20vZmFicmlrYW0vZmF1bHQ8L3dzYTpBZGRyZXNzPgotICAgICAgICA8L3dzYTpGYXVsdFRvPgotICAgIDwvc29hcGVudjpIZWFkZXI+Ci0gICAgPHNvYXBlbnY6Qm9keT4KLSAgICAgICAgPG5zMTpnZXRCYWxhbmNlIHNvYXBlbnY6ZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iCi0gICAgICAgICAgICAgICAgeG1sbnM6bnMxPSJodHRwOi8vbG9jYWxob3N0OjgwODEvYXhpcy9zZXJ2aWNlcy9CYW5rUG9ydCI+Ci0gICAgICAgICAgICA8YWNjb3VudE5vIGhyZWY9IiNpZDAiLz4KLSAgICAgICAgPC9uczE6Z2V0QmFsYW5jZT4KLSAgICAgICAgPG11bHRpUmVmIGlkPSJpZDAiIHNvYXBlbmM6cm9vdD0iMCIKLSAgICAgICAgICAgICAgICBzb2FwZW52OmVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIgotICAgICAgICAgICAgICAgIHhzaTp0eXBlPSJ4c2Q6aW50IiB4bWxuczpzb2FwZW5jPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyI+Ci0gICAgICAgICAgICAxMDAxPC9tdWx0aVJlZj4KLSAgICA8L3NvYXBlbnY6Qm9keT4KLTwvc29hcGVudjpFbnZlbG9wZT4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkZHJlc3NpbmcvdGVzdC1yZXNvdXJjZXMvaW52YWxpZC1jYXJkaW5hbGl0eS1tZXNzYWdlcy9zdWJtaXNzaW9uL2ludmFsaWRDYXJkaW5hbGl0eVJlcGx5VG9NZXNzYWdlLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkZHJlc3NpbmcvdGVzdC1yZXNvdXJjZXMvaW52YWxpZC1jYXJkaW5hbGl0eS1tZXNzYWdlcy9zdWJtaXNzaW9uL2ludmFsaWRDYXJkaW5hbGl0eVJlcGx5VG9NZXNzYWdlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTdhZjYxNy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3QtcmVzb3VyY2VzL2ludmFsaWQtY2FyZGluYWxpdHktbWVzc2FnZXMvc3VibWlzc2lvbi9pbnZhbGlkQ2FyZGluYWxpdHlSZXBseVRvTWVzc2FnZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzb2FwZW52OkVudmVsb3BlIHhtbG5zOnNvYXBlbnY9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIgotICAgICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICAgICB4bWxuczp3c2E9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDgvYWRkcmVzc2luZyI+Ci0gICAgPHNvYXBlbnY6SGVhZGVyIHhtbG5zOmZhYnJpa2FtPSJodHRwOi8vZXhhbXBsZS5jb20vZmFicmlrYW0iIHhtbG5zOmF4aXMyPSJodHRwOi8vd3MuYXBhY2hlLm9yZy9uYW1lc3BhY2VzL2F4aXMyIj4KLSAgICAgICAgPHdzYTpNZXNzYWdlSUQgYXhpczI6QXR0ckV4dD0iMTIzNDU2Nzg5IiBzb2FwZW52Om11c3RVbmRlcnN0YW5kPSIwIj4KLSAgICAgICAgICAgIHV1aWQ6OTIwQzUxOTAtMEI4Ri0xMUQ5LThDRUQtRjIyRURFRUJGN0U1PC93c2E6TWVzc2FnZUlEPgotICAgICAgICA8d3NhOlRvIGF4aXMyOkF0dHJFeHQ9IjEyMzQ1Njc4OSIgc29hcGVudjptdXN0VW5kZXJzdGFuZD0iMCI+aHR0cDovL2xvY2FsaG9zdDo4MDgxL2F4aXMvc2VydmljZXMvQmFua1BvcnQ8L3dzYTpUbz4KLSAgICAgICAgPHdzYTpGcm9tIHNvYXBlbnY6bXVzdFVuZGVyc3RhbmQ9IjAiPgotICAgICAgICAgICAgPHdzYTpBZGRyZXNzPgotICAgICAgICAgICAgICAgIGh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDgvYWRkcmVzc2luZy9yb2xlL2Fub255bW91czwvd3NhOkFkZHJlc3M+Ci0gICAgICAgIDwvd3NhOkZyb20+Ci0gICAgICAgIDxheGlzMjpQYXJhbU9uZSB3c2E6SXNSZWZlcmVuY2VQYXJhbWV0ZXI9J3RydWUnPjEyMzQ1Njc4OTwvYXhpczI6UGFyYW1PbmU+Ci0gICAgICAgIDxheGlzMjpQYXJhbVR3byB3c2E6SXNSZWZlcmVuY2VQYXJhbWV0ZXI9J3RydWUnPkFCQ0RFRkc8L2F4aXMyOlBhcmFtVHdvPgotICAgICAgICA8d3NhOlJlcGx5VG8+Ci0gICAgICAgICAgICA8d3NhOkFkZHJlc3M+aHR0cDovL2V4YW1wbGUuY29tL2ZhYnJpa2FtL2FjY3Q8L3dzYTpBZGRyZXNzPgotICAgICAgICAgICAgPHdzYTpSZWZlcmVuY2VQYXJhbWV0ZXJzPgotICAgICAgICAgICAgICAgIDxmYWJyaWthbTpDdXN0b21lcktleT4xMjM0NTY3ODk8L2ZhYnJpa2FtOkN1c3RvbWVyS2V5PgotICAgICAgICAgICAgICAgIDxmYWJyaWthbTpTaG9wcGluZ0NhcnQ+QUJDREVGRzwvZmFicmlrYW06U2hvcHBpbmdDYXJ0PgotICAgICAgICAgICAgPC93c2E6UmVmZXJlbmNlUGFyYW1ldGVycz4KLSAgICAgICAgPC93c2E6UmVwbHlUbz4KLSAgICAgICAgPHdzYTpBY3Rpb24gYXhpczI6QXR0ckV4dD0iMTIzNDU2Nzg5Ij5odHRwOi8vd3MuYXBhY2hlLm9yZy90ZXN0cy9hY3Rpb248L3dzYTpBY3Rpb24+Ci0gICAgICAgIDx3c2E6UmVwbHlUbz4KLSAgICAgICAgICAgIDx3c2E6QWRkcmVzcz5odHRwOi8vZXhhbXBsZS5jb20vZmFicmlrYW0vYWNjdDI8L3dzYTpBZGRyZXNzPgotICAgICAgICAgICAgPHdzYTpSZWZlcmVuY2VQYXJhbWV0ZXJzPgotICAgICAgICAgICAgICAgIDxmYWJyaWthbTpDdXN0b21lcktleT4xMjM0NTY3ODk8L2ZhYnJpa2FtOkN1c3RvbWVyS2V5PgotICAgICAgICAgICAgPC93c2E6UmVmZXJlbmNlUGFyYW1ldGVycz4KLSAgICAgICAgPC93c2E6UmVwbHlUbz4KLSAgICAgICAgPHdzYTpGYXVsdFRvPgotICAgICAgICAgICAgPHdzYTpBZGRyZXNzPmh0dHA6Ly9leGFtcGxlLmNvbS9mYWJyaWthbS9mYXVsdDwvd3NhOkFkZHJlc3M+Ci0gICAgICAgIDwvd3NhOkZhdWx0VG8+Ci0gICAgPC9zb2FwZW52OkhlYWRlcj4KLSAgICA8c29hcGVudjpCb2R5PgotICAgICAgICA8bnMxOmdldEJhbGFuY2Ugc29hcGVudjplbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIKLSAgICAgICAgICAgICAgICB4bWxuczpuczE9Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MS9heGlzL3NlcnZpY2VzL0JhbmtQb3J0Ij4KLSAgICAgICAgICAgIDxhY2NvdW50Tm8gaHJlZj0iI2lkMCIvPgotICAgICAgICA8L25zMTpnZXRCYWxhbmNlPgotICAgICAgICA8bXVsdGlSZWYgaWQ9ImlkMCIgc29hcGVuYzpyb290PSIwIgotICAgICAgICAgICAgICAgIHNvYXBlbnY6ZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iCi0gICAgICAgICAgICAgICAgeHNpOnR5cGU9InhzZDppbnQiIHhtbG5zOnNvYXBlbmM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIj4KLSAgICAgICAgICAgIDEwMDE8L211bHRpUmVmPgotICAgIDwvc29hcGVudjpCb2R5PgotPC9zb2FwZW52OkVudmVsb3BlPgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRkcmVzc2luZy90ZXN0LXJlc291cmNlcy9pbnZhbGlkLWNhcmRpbmFsaXR5LW1lc3NhZ2VzL3N1Ym1pc3Npb24vaW52YWxpZENhcmRpbmFsaXR5VG9NZXNzYWdlLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkZHJlc3NpbmcvdGVzdC1yZXNvdXJjZXMvaW52YWxpZC1jYXJkaW5hbGl0eS1tZXNzYWdlcy9zdWJtaXNzaW9uL2ludmFsaWRDYXJkaW5hbGl0eVRvTWVzc2FnZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwMDRjOTQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRkcmVzc2luZy90ZXN0LXJlc291cmNlcy9pbnZhbGlkLWNhcmRpbmFsaXR5LW1lc3NhZ2VzL3N1Ym1pc3Npb24vaW52YWxpZENhcmRpbmFsaXR5VG9NZXNzYWdlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHNvYXBlbnY6RW52ZWxvcGUgeG1sbnM6c29hcGVudj0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iCi0gICAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgIHhtbG5zOndzYT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOC9hZGRyZXNzaW5nIj4KLSAgICA8c29hcGVudjpIZWFkZXIgeG1sbnM6ZmFicmlrYW09Imh0dHA6Ly9leGFtcGxlLmNvbS9mYWJyaWthbSIgeG1sbnM6YXhpczI9Imh0dHA6Ly93cy5hcGFjaGUub3JnL25hbWVzcGFjZXMvYXhpczIiPgotICAgICAgICA8d3NhOk1lc3NhZ2VJRCBheGlzMjpBdHRyRXh0PSIxMjM0NTY3ODkiIHNvYXBlbnY6bXVzdFVuZGVyc3RhbmQ9IjAiPgotICAgICAgICAgICAgdXVpZDo5MjBDNTE5MC0wQjhGLTExRDktOENFRC1GMjJFREVFQkY3RTU8L3dzYTpNZXNzYWdlSUQ+Ci0gICAgICAgIDx3c2E6VG8gYXhpczI6QXR0ckV4dD0iMTIzNDU2Nzg5IiBzb2FwZW52Om11c3RVbmRlcnN0YW5kPSIwIj5odHRwOi8vbG9jYWxob3N0OjgwODEvYXhpcy9zZXJ2aWNlcy9CYW5rUG9ydDwvd3NhOlRvPgotICAgICAgICA8d3NhOlRvIGF4aXMyOkF0dHJFeHQ9IjEyMzQ1Njc4OSIgc29hcGVudjptdXN0VW5kZXJzdGFuZD0iMCI+aHR0cDovL2xvY2FsaG9zdDo4MDgxL2F4aXMvc2VydmljZXMvQmFua1BvcnQ8L3dzYTpUbz4KLSAgICAgICAgPHdzYTpGcm9tIHNvYXBlbnY6bXVzdFVuZGVyc3RhbmQ9IjAiPgotICAgICAgICAgICAgPHdzYTpBZGRyZXNzPgotICAgICAgICAgICAgICAgIGh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDgvYWRkcmVzc2luZy9yb2xlL2Fub255bW91czwvd3NhOkFkZHJlc3M+Ci0gICAgICAgIDwvd3NhOkZyb20+Ci0gICAgICAgIDxheGlzMjpQYXJhbU9uZSB3c2E6SXNSZWZlcmVuY2VQYXJhbWV0ZXI9J3RydWUnPjEyMzQ1Njc4OTwvYXhpczI6UGFyYW1PbmU+Ci0gICAgICAgIDxheGlzMjpQYXJhbVR3byB3c2E6SXNSZWZlcmVuY2VQYXJhbWV0ZXI9J3RydWUnPkFCQ0RFRkc8L2F4aXMyOlBhcmFtVHdvPgotICAgICAgICA8d3NhOlJlcGx5VG8+Ci0gICAgICAgICAgICA8d3NhOkFkZHJlc3M+aHR0cDovL2V4YW1wbGUuY29tL2ZhYnJpa2FtL2FjY3Q8L3dzYTpBZGRyZXNzPgotICAgICAgICAgICAgPHdzYTpSZWZlcmVuY2VQYXJhbWV0ZXJzPgotICAgICAgICAgICAgICAgIDxmYWJyaWthbTpDdXN0b21lcktleT4xMjM0NTY3ODk8L2ZhYnJpa2FtOkN1c3RvbWVyS2V5PgotICAgICAgICAgICAgICAgIDxmYWJyaWthbTpTaG9wcGluZ0NhcnQ+QUJDREVGRzwvZmFicmlrYW06U2hvcHBpbmdDYXJ0PgotICAgICAgICAgICAgPC93c2E6UmVmZXJlbmNlUGFyYW1ldGVycz4KLSAgICAgICAgPC93c2E6UmVwbHlUbz4KLSAgICAgICAgPHdzYTpBY3Rpb24gYXhpczI6QXR0ckV4dD0iMTIzNDU2Nzg5Ij5odHRwOi8vd3MuYXBhY2hlLm9yZy90ZXN0cy9hY3Rpb248L3dzYTpBY3Rpb24+Ci0gICAgICAgIDx3c2E6RmF1bHRUbz4KLSAgICAgICAgICAgIDx3c2E6QWRkcmVzcz5odHRwOi8vZXhhbXBsZS5jb20vZmFicmlrYW0vZmF1bHQ8L3dzYTpBZGRyZXNzPgotICAgICAgICA8L3dzYTpGYXVsdFRvPgotICAgIDwvc29hcGVudjpIZWFkZXI+Ci0gICAgPHNvYXBlbnY6Qm9keT4KLSAgICAgICAgPG5zMTpnZXRCYWxhbmNlIHNvYXBlbnY6ZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iCi0gICAgICAgICAgICAgICAgeG1sbnM6bnMxPSJodHRwOi8vbG9jYWxob3N0OjgwODEvYXhpcy9zZXJ2aWNlcy9CYW5rUG9ydCI+Ci0gICAgICAgICAgICA8YWNjb3VudE5vIGhyZWY9IiNpZDAiLz4KLSAgICAgICAgPC9uczE6Z2V0QmFsYW5jZT4KLSAgICAgICAgPG11bHRpUmVmIGlkPSJpZDAiIHNvYXBlbmM6cm9vdD0iMCIKLSAgICAgICAgICAgICAgICBzb2FwZW52OmVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIgotICAgICAgICAgICAgICAgIHhzaTp0eXBlPSJ4c2Q6aW50IiB4bWxuczpzb2FwZW5jPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyI+Ci0gICAgICAgICAgICAxMDAxPC9tdWx0aVJlZj4KLSAgICA8L3NvYXBlbnY6Qm9keT4KLTwvc29hcGVudjpFbnZlbG9wZT4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkZHJlc3NpbmcvdGVzdC1yZXNvdXJjZXMvbXVzdFVuZGVyc3RhbmRUZXN0LnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkZHJlc3NpbmcvdGVzdC1yZXNvdXJjZXMvbXVzdFVuZGVyc3RhbmRUZXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI3MTRlMy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3QtcmVzb3VyY2VzL211c3RVbmRlcnN0YW5kVGVzdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzb2FwZW52OkVudmVsb3BlIHhtbG5zOnNvYXBlbnY9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIj4KLSAgICA8c29hcGVudjpIZWFkZXIgeG1sbnM6d3NhPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA4L2FkZHJlc3NpbmciIHhtbG5zOm15UmVmPSJodHRwOi8vcmVmZXJlbmNlLm9yZyI+Ci0gICAgICAgIDx3c2E6RnJvbSBzb2FwZW52Om11c3RVbmRlcnN0YW5kPSIxIj4KLSAgICAgICAgICAgIDx3c2E6QWRkcmVzcz5odHRwOi8vd3d3LmZyb20ub3JnL3NlcnZpY2UvPC93c2E6QWRkcmVzcz4KLSAgICAgICAgICAgIDx3c2E6UmVmZXJlbmNlUGFyYW1ldGVycz4KLSAgICAgICAgICAgICAgICA8UmVmZXJlbmNlMj5WYWx1ZSAyMDA8L1JlZmVyZW5jZTI+Ci0gICAgICAgICAgICA8L3dzYTpSZWZlcmVuY2VQYXJhbWV0ZXJzPgotICAgICAgICA8L3dzYTpGcm9tPgotICAgICAgICA8d3NhOlRvIHNvYXBlbnY6bXVzdFVuZGVyc3RhbmQ9IjEiPmh0dHA6Ly93d3cudG8ub3JnL3NlcnZpY2UvPC93c2E6VG8+Ci0gICAgICAgIDx3c2E6TWVzc2FnZUlEIHNvYXBlbnY6bXVzdFVuZGVyc3RhbmQ9IjEiPjEyMzQ1Ni03ODkwPC93c2E6TWVzc2FnZUlEPgotICAgICAgICA8bXlSZWY6UmVmZXJlbmNlND5WYWx1ZSA0MDA8L215UmVmOlJlZmVyZW5jZTQ+Ci0gICAgICAgIDxteVJlZjpSZWZlcmVuY2UzPlZhbHVlIDMwMDwvbXlSZWY6UmVmZXJlbmNlMz4KLSAgICAgICAgPHdzYTpBY3Rpb24gc29hcGVudjptdXN0VW5kZXJzdGFuZD0iMSI+aHR0cDovL3d3dy5hY3Rpb25zLm9yZy9hY3Rpb248L3dzYTpBY3Rpb24+Ci0gICAgICAgIDx3c2E6UmVwbHlUbyBzb2FwZW52Om11c3RVbmRlcnN0YW5kPSIxIj4KLSAgICAgICAgICAgIDx3c2E6QWRkcmVzcz5odHRwOi8vd3d3LnJlcGx5VG8ub3JnL3NlcnZpY2UvPC93c2E6QWRkcmVzcz4KLSAgICAgICAgPC93c2E6UmVwbHlUbz4KLSAgICAgICAgPHdzYTpSZWxhdGVzVG8gc29hcGVudjptdXN0VW5kZXJzdGFuZD0iMSIgUmVsYXRpb25zaGlwVHlwZT0iVGVzdFJlbGF0aW9uIj5odHRwOi8vd3d3LnJlbGF0ZXNUby5vcmcvc2VydmljZS88L3dzYTpSZWxhdGVzVG8+Ci0gICAgPC9zb2FwZW52OkhlYWRlcj4KLSAgICA8c29hcGVudjpCb2R5Pjwvc29hcGVudjpCb2R5PgotPC9zb2FwZW52OkVudmVsb3BlPgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRkcmVzc2luZy90ZXN0LXJlc291cmNlcy9vbWl0dGVkLWhlYWRlci1tZXNzYWdlcy9maW5hbC9ub0FjdGlvbk1lc3NhZ2UueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRkcmVzc2luZy90ZXN0LXJlc291cmNlcy9vbWl0dGVkLWhlYWRlci1tZXNzYWdlcy9maW5hbC9ub0FjdGlvbk1lc3NhZ2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2N2RlNjExLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkZHJlc3NpbmcvdGVzdC1yZXNvdXJjZXMvb21pdHRlZC1oZWFkZXItbWVzc2FnZXMvZmluYWwvbm9BY3Rpb25NZXNzYWdlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHNvYXBlbnY6RW52ZWxvcGUgeG1sbnM6c29hcGVudj0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iCi0gICAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgIHhtbG5zOndzYT0iaHR0cDovL3d3dy53My5vcmcvMjAwNS8wOC9hZGRyZXNzaW5nIj4KLSAgICA8c29hcGVudjpIZWFkZXIgeG1sbnM6ZmFicmlrYW09Imh0dHA6Ly9leGFtcGxlLmNvbS9mYWJyaWthbSIgeG1sbnM6YXhpczI9Imh0dHA6Ly93cy5hcGFjaGUub3JnL25hbWVzcGFjZXMvYXhpczIiPgotICAgICAgICA8d3NhOk1lc3NhZ2VJRCBzb2FwZW52Om11c3RVbmRlcnN0YW5kPSIwIj4KLSAgICAgICAgICAgIHV1aWQ6OTIwQzUxOTAtMEI4Ri0xMUQ5LThDRUQtRjIyRURFRUJGN0U1PC93c2E6TWVzc2FnZUlEPgotICAgICAgICA8d3NhOlRvIHNvYXBlbnY6bXVzdFVuZGVyc3RhbmQ9IjAiPmh0dHA6Ly9sb2NhbGhvc3Q6ODA4MS9heGlzL3NlcnZpY2VzL0JhbmtQb3J0PC93c2E6VG8+Ci0gICAgICAgIDx3c2E6RnJvbSBzb2FwZW52Om11c3RVbmRlcnN0YW5kPSIwIj4KLSAgICAgICAgICAgIDx3c2E6QWRkcmVzcz4KLSAgICAgICAgICAgICAgICBodHRwOi8vd3d3LnczLm9yZy8yMDA1LzA4L2FkZHJlc3NpbmcvYW5vbnltb3VzPC93c2E6QWRkcmVzcz4KLSAgICAgICAgPC93c2E6RnJvbT4KLSAgICAgICAgPGF4aXMyOlBhcmFtT25lIHdzYTpJc1JlZmVyZW5jZVBhcmFtZXRlcj0ndHJ1ZSc+MTIzNDU2Nzg5PC9heGlzMjpQYXJhbU9uZT4KLSAgICAgICAgPGF4aXMyOlBhcmFtVHdvIHdzYTpJc1JlZmVyZW5jZVBhcmFtZXRlcj0ndHJ1ZSc+QUJDREVGRzwvYXhpczI6UGFyYW1Ud28+Ci0gICAgICAgIDx3c2E6UmVwbHlUbz4KLSAgICAgICAgICAgIDx3c2E6QWRkcmVzcz5odHRwOi8vZXhhbXBsZS5jb20vZmFicmlrYW0vYWNjdDwvd3NhOkFkZHJlc3M+Ci0gICAgICAgICAgICA8d3NhOlJlZmVyZW5jZVBhcmFtZXRlcnM+Ci0gICAgICAgICAgICAgICAgPGZhYnJpa2FtOkN1c3RvbWVyS2V5PjEyMzQ1Njc4OTwvZmFicmlrYW06Q3VzdG9tZXJLZXk+Ci0gICAgICAgICAgICAgICAgPGZhYnJpa2FtOlNob3BwaW5nQ2FydD5BQkNERUZHPC9mYWJyaWthbTpTaG9wcGluZ0NhcnQ+Ci0gICAgICAgICAgICA8L3dzYTpSZWZlcmVuY2VQYXJhbWV0ZXJzPgotICAgICAgICA8L3dzYTpSZXBseVRvPgotICAgICAgICA8d3NhOkZhdWx0VG8+Ci0gICAgICAgICAgICA8d3NhOkFkZHJlc3M+aHR0cDovL2V4YW1wbGUuY29tL2ZhYnJpa2FtL2ZhdWx0PC93c2E6QWRkcmVzcz4KLSAgICAgICAgPC93c2E6RmF1bHRUbz4KLSAgICA8L3NvYXBlbnY6SGVhZGVyPgotICAgIDxzb2FwZW52OkJvZHk+Ci0gICAgICAgIDxuczE6Z2V0QmFsYW5jZSBzb2FwZW52OmVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIgotICAgICAgICAgICAgICAgIHhtbG5zOm5zMT0iaHR0cDovL2xvY2FsaG9zdDo4MDgxL2F4aXMvc2VydmljZXMvQmFua1BvcnQiPgotICAgICAgICAgICAgPGFjY291bnRObyBocmVmPSIjaWQwIi8+Ci0gICAgICAgIDwvbnMxOmdldEJhbGFuY2U+Ci0gICAgICAgIDxtdWx0aVJlZiBpZD0iaWQwIiBzb2FwZW5jOnJvb3Q9IjAiCi0gICAgICAgICAgICAgICAgc29hcGVudjplbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIKLSAgICAgICAgICAgICAgICB4c2k6dHlwZT0ieHNkOmludCIgeG1sbnM6c29hcGVuYz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iPgotICAgICAgICAgICAgMTAwMTwvbXVsdGlSZWY+Ci0gICAgPC9zb2FwZW52OkJvZHk+Ci08L3NvYXBlbnY6RW52ZWxvcGU+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3QtcmVzb3VyY2VzL29taXR0ZWQtaGVhZGVyLW1lc3NhZ2VzL2ZpbmFsL25vRmF1bHRUb01lc3NhZ2UueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRkcmVzc2luZy90ZXN0LXJlc291cmNlcy9vbWl0dGVkLWhlYWRlci1tZXNzYWdlcy9maW5hbC9ub0ZhdWx0VG9NZXNzYWdlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ExMDg5MC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3QtcmVzb3VyY2VzL29taXR0ZWQtaGVhZGVyLW1lc3NhZ2VzL2ZpbmFsL25vRmF1bHRUb01lc3NhZ2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08c29hcGVudjpFbnZlbG9wZSB4bWxuczpzb2FwZW52PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyIKLSAgICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgICAgeG1sbnM6d3NhPSJodHRwOi8vd3d3LnczLm9yZy8yMDA1LzA4L2FkZHJlc3NpbmciPgotICAgIDxzb2FwZW52OkhlYWRlciB4bWxuczpmYWJyaWthbT0iaHR0cDovL2V4YW1wbGUuY29tL2ZhYnJpa2FtIiB4bWxuczpheGlzMj0iaHR0cDovL3dzLmFwYWNoZS5vcmcvbmFtZXNwYWNlcy9heGlzMiI+Ci0gICAgICAgIDx3c2E6TWVzc2FnZUlEIHNvYXBlbnY6bXVzdFVuZGVyc3RhbmQ9IjAiPgotICAgICAgICAgICAgdXVpZDo5MjBDNTE5MC0wQjhGLTExRDktOENFRC1GMjJFREVFQkY3RTU8L3dzYTpNZXNzYWdlSUQ+Ci0gICAgICAgIDx3c2E6VG8gc29hcGVudjptdXN0VW5kZXJzdGFuZD0iMCI+aHR0cDovL2xvY2FsaG9zdDo4MDgxL2F4aXMvc2VydmljZXMvQmFua1BvcnQ8L3dzYTpUbz4KLSAgICAgICAgPHdzYTpGcm9tIHNvYXBlbnY6bXVzdFVuZGVyc3RhbmQ9IjAiPgotICAgICAgICAgICAgPHdzYTpBZGRyZXNzPgotICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDgvYWRkcmVzc2luZy9hbm9ueW1vdXM8L3dzYTpBZGRyZXNzPgotICAgICAgICA8L3dzYTpGcm9tPgotICAgICAgICA8YXhpczI6UGFyYW1PbmUgd3NhOklzUmVmZXJlbmNlUGFyYW1ldGVyPSd0cnVlJz4xMjM0NTY3ODk8L2F4aXMyOlBhcmFtT25lPgotICAgICAgICA8YXhpczI6UGFyYW1Ud28gd3NhOklzUmVmZXJlbmNlUGFyYW1ldGVyPSd0cnVlJz5BQkNERUZHPC9heGlzMjpQYXJhbVR3bz4KLSAgICAgICAgPHdzYTpSZXBseVRvPgotICAgICAgICAgICAgPHdzYTpBZGRyZXNzPmh0dHA6Ly9leGFtcGxlLmNvbS9mYWJyaWthbS9hY2N0PC93c2E6QWRkcmVzcz4KLSAgICAgICAgICAgIDx3c2E6UmVmZXJlbmNlUGFyYW1ldGVycz4KLSAgICAgICAgICAgICAgICA8ZmFicmlrYW06Q3VzdG9tZXJLZXk+MTIzNDU2Nzg5PC9mYWJyaWthbTpDdXN0b21lcktleT4KLSAgICAgICAgICAgICAgICA8ZmFicmlrYW06U2hvcHBpbmdDYXJ0PkFCQ0RFRkc8L2ZhYnJpa2FtOlNob3BwaW5nQ2FydD4KLSAgICAgICAgICAgIDwvd3NhOlJlZmVyZW5jZVBhcmFtZXRlcnM+Ci0gICAgICAgIDwvd3NhOlJlcGx5VG8+Ci0gICAgICAgIDx3c2E6QWN0aW9uPmh0dHA6Ly93cy5hcGFjaGUub3JnL3Rlc3RzL2FjdGlvbjwvd3NhOkFjdGlvbj4KLSAgICA8L3NvYXBlbnY6SGVhZGVyPgotICAgIDxzb2FwZW52OkJvZHk+Ci0gICAgICAgIDxuczE6Z2V0QmFsYW5jZSBzb2FwZW52OmVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIgotICAgICAgICAgICAgICAgIHhtbG5zOm5zMT0iaHR0cDovL2xvY2FsaG9zdDo4MDgxL2F4aXMvc2VydmljZXMvQmFua1BvcnQiPgotICAgICAgICAgICAgPGFjY291bnRObyBocmVmPSIjaWQwIi8+Ci0gICAgICAgIDwvbnMxOmdldEJhbGFuY2U+Ci0gICAgICAgIDxtdWx0aVJlZiBpZD0iaWQwIiBzb2FwZW5jOnJvb3Q9IjAiCi0gICAgICAgICAgICAgICAgc29hcGVudjplbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIKLSAgICAgICAgICAgICAgICB4c2k6dHlwZT0ieHNkOmludCIgeG1sbnM6c29hcGVuYz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iPgotICAgICAgICAgICAgMTAwMTwvbXVsdGlSZWY+Ci0gICAgPC9zb2FwZW52OkJvZHk+Ci08L3NvYXBlbnY6RW52ZWxvcGU+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3QtcmVzb3VyY2VzL29taXR0ZWQtaGVhZGVyLW1lc3NhZ2VzL2ZpbmFsL25vRnJvbU1lc3NhZ2UueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRkcmVzc2luZy90ZXN0LXJlc291cmNlcy9vbWl0dGVkLWhlYWRlci1tZXNzYWdlcy9maW5hbC9ub0Zyb21NZXNzYWdlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRlYTk1NC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3QtcmVzb3VyY2VzL29taXR0ZWQtaGVhZGVyLW1lc3NhZ2VzL2ZpbmFsL25vRnJvbU1lc3NhZ2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08c29hcGVudjpFbnZlbG9wZSB4bWxuczpzb2FwZW52PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyIKLSAgICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgICAgeG1sbnM6d3NhPSJodHRwOi8vd3d3LnczLm9yZy8yMDA1LzA4L2FkZHJlc3NpbmciPgotICAgIDxzb2FwZW52OkhlYWRlciB4bWxuczpmYWJyaWthbT0iaHR0cDovL2V4YW1wbGUuY29tL2ZhYnJpa2FtIiB4bWxuczpheGlzMj0iaHR0cDovL3dzLmFwYWNoZS5vcmcvbmFtZXNwYWNlcy9heGlzMiI+Ci0gICAgICAgIDx3c2E6TWVzc2FnZUlEIHNvYXBlbnY6bXVzdFVuZGVyc3RhbmQ9IjAiPgotICAgICAgICAgICAgdXVpZDo5MjBDNTE5MC0wQjhGLTExRDktOENFRC1GMjJFREVFQkY3RTU8L3dzYTpNZXNzYWdlSUQ+Ci0gICAgICAgIDx3c2E6VG8gc29hcGVudjptdXN0VW5kZXJzdGFuZD0iMCI+aHR0cDovL2xvY2FsaG9zdDo4MDgxL2F4aXMvc2VydmljZXMvQmFua1BvcnQ8L3dzYTpUbz4KLSAgICAgICAgPGF4aXMyOlBhcmFtT25lIHdzYTpJc1JlZmVyZW5jZVBhcmFtZXRlcj0ndHJ1ZSc+MTIzNDU2Nzg5PC9heGlzMjpQYXJhbU9uZT4KLSAgICAgICAgPGF4aXMyOlBhcmFtVHdvIHdzYTpJc1JlZmVyZW5jZVBhcmFtZXRlcj0ndHJ1ZSc+QUJDREVGRzwvYXhpczI6UGFyYW1Ud28+Ci0gICAgICAgIDx3c2E6UmVwbHlUbz4KLSAgICAgICAgICAgIDx3c2E6QWRkcmVzcz5odHRwOi8vZXhhbXBsZS5jb20vZmFicmlrYW0vYWNjdDwvd3NhOkFkZHJlc3M+Ci0gICAgICAgICAgICA8d3NhOlJlZmVyZW5jZVBhcmFtZXRlcnM+Ci0gICAgICAgICAgICAgICAgPGZhYnJpa2FtOkN1c3RvbWVyS2V5PjEyMzQ1Njc4OTwvZmFicmlrYW06Q3VzdG9tZXJLZXk+Ci0gICAgICAgICAgICAgICAgPGZhYnJpa2FtOlNob3BwaW5nQ2FydD5BQkNERUZHPC9mYWJyaWthbTpTaG9wcGluZ0NhcnQ+Ci0gICAgICAgICAgICA8L3dzYTpSZWZlcmVuY2VQYXJhbWV0ZXJzPgotICAgICAgICA8L3dzYTpSZXBseVRvPgotICAgICAgICA8d3NhOkFjdGlvbj5odHRwOi8vd3MuYXBhY2hlLm9yZy90ZXN0cy9hY3Rpb248L3dzYTpBY3Rpb24+Ci0gICAgICAgIDx3c2E6RmF1bHRUbz4KLSAgICAgICAgICAgIDx3c2E6QWRkcmVzcz5odHRwOi8vZXhhbXBsZS5jb20vZmFicmlrYW0vZmF1bHQ8L3dzYTpBZGRyZXNzPgotICAgICAgICA8L3dzYTpGYXVsdFRvPgotICAgIDwvc29hcGVudjpIZWFkZXI+Ci0gICAgPHNvYXBlbnY6Qm9keT4KLSAgICAgICAgPG5zMTpnZXRCYWxhbmNlIHNvYXBlbnY6ZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iCi0gICAgICAgICAgICAgICAgeG1sbnM6bnMxPSJodHRwOi8vbG9jYWxob3N0OjgwODEvYXhpcy9zZXJ2aWNlcy9CYW5rUG9ydCI+Ci0gICAgICAgICAgICA8YWNjb3VudE5vIGhyZWY9IiNpZDAiLz4KLSAgICAgICAgPC9uczE6Z2V0QmFsYW5jZT4KLSAgICAgICAgPG11bHRpUmVmIGlkPSJpZDAiIHNvYXBlbmM6cm9vdD0iMCIKLSAgICAgICAgICAgICAgICBzb2FwZW52OmVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIgotICAgICAgICAgICAgICAgIHhzaTp0eXBlPSJ4c2Q6aW50IiB4bWxuczpzb2FwZW5jPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyI+Ci0gICAgICAgICAgICAxMDAxPC9tdWx0aVJlZj4KLSAgICA8L3NvYXBlbnY6Qm9keT4KLTwvc29hcGVudjpFbnZlbG9wZT4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkZHJlc3NpbmcvdGVzdC1yZXNvdXJjZXMvb21pdHRlZC1oZWFkZXItbWVzc2FnZXMvZmluYWwvbm9NZXNzYWdlSURNZXNzYWdlLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkZHJlc3NpbmcvdGVzdC1yZXNvdXJjZXMvb21pdHRlZC1oZWFkZXItbWVzc2FnZXMvZmluYWwvbm9NZXNzYWdlSURNZXNzYWdlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU0YjU0NC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3QtcmVzb3VyY2VzL29taXR0ZWQtaGVhZGVyLW1lc3NhZ2VzL2ZpbmFsL25vTWVzc2FnZUlETWVzc2FnZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzb2FwZW52OkVudmVsb3BlIHhtbG5zOnNvYXBlbnY9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIgotICAgICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICAgICB4bWxuczp3c2E9Imh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDgvYWRkcmVzc2luZyI+Ci0gICAgPHNvYXBlbnY6SGVhZGVyIHhtbG5zOmZhYnJpa2FtPSJodHRwOi8vZXhhbXBsZS5jb20vZmFicmlrYW0iIHhtbG5zOmF4aXMyPSJodHRwOi8vd3MuYXBhY2hlLm9yZy9uYW1lc3BhY2VzL2F4aXMyIj4KLSAgICAgICAgPHdzYTpUbyBzb2FwZW52Om11c3RVbmRlcnN0YW5kPSIwIj5odHRwOi8vbG9jYWxob3N0OjgwODEvYXhpcy9zZXJ2aWNlcy9CYW5rUG9ydDwvd3NhOlRvPgotICAgICAgICA8d3NhOkZyb20gc29hcGVudjptdXN0VW5kZXJzdGFuZD0iMCI+Ci0gICAgICAgICAgICA8d3NhOkFkZHJlc3M+Ci0gICAgICAgICAgICAgICAgaHR0cDovL3d3dy53My5vcmcvMjAwNS8wOC9hZGRyZXNzaW5nL2Fub255bW91czwvd3NhOkFkZHJlc3M+Ci0gICAgICAgIDwvd3NhOkZyb20+Ci0gICAgICAgIDxheGlzMjpQYXJhbU9uZSB3c2E6SXNSZWZlcmVuY2VQYXJhbWV0ZXI9J3RydWUnPjEyMzQ1Njc4OTwvYXhpczI6UGFyYW1PbmU+Ci0gICAgICAgIDxheGlzMjpQYXJhbVR3byB3c2E6SXNSZWZlcmVuY2VQYXJhbWV0ZXI9J3RydWUnPkFCQ0RFRkc8L2F4aXMyOlBhcmFtVHdvPgotICAgICAgICA8d3NhOlJlcGx5VG8+Ci0gICAgICAgICAgICA8d3NhOkFkZHJlc3M+aHR0cDovL2V4YW1wbGUuY29tL2ZhYnJpa2FtL2FjY3Q8L3dzYTpBZGRyZXNzPgotICAgICAgICAgICAgPHdzYTpSZWZlcmVuY2VQYXJhbWV0ZXJzPgotICAgICAgICAgICAgICAgIDxmYWJyaWthbTpDdXN0b21lcktleT4xMjM0NTY3ODk8L2ZhYnJpa2FtOkN1c3RvbWVyS2V5PgotICAgICAgICAgICAgICAgIDxmYWJyaWthbTpTaG9wcGluZ0NhcnQ+QUJDREVGRzwvZmFicmlrYW06U2hvcHBpbmdDYXJ0PgotICAgICAgICAgICAgPC93c2E6UmVmZXJlbmNlUGFyYW1ldGVycz4KLSAgICAgICAgPC93c2E6UmVwbHlUbz4KLSAgICAgICAgPHdzYTpBY3Rpb24+aHR0cDovL3dzLmFwYWNoZS5vcmcvdGVzdHMvYWN0aW9uPC93c2E6QWN0aW9uPgotICAgICAgICA8d3NhOkZhdWx0VG8+Ci0gICAgICAgICAgICA8d3NhOkFkZHJlc3M+aHR0cDovL2V4YW1wbGUuY29tL2ZhYnJpa2FtL2ZhdWx0PC93c2E6QWRkcmVzcz4KLSAgICAgICAgPC93c2E6RmF1bHRUbz4KLSAgICA8L3NvYXBlbnY6SGVhZGVyPgotICAgIDxzb2FwZW52OkJvZHk+Ci0gICAgICAgIDxuczE6Z2V0QmFsYW5jZSBzb2FwZW52OmVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIgotICAgICAgICAgICAgICAgIHhtbG5zOm5zMT0iaHR0cDovL2xvY2FsaG9zdDo4MDgxL2F4aXMvc2VydmljZXMvQmFua1BvcnQiPgotICAgICAgICAgICAgPGFjY291bnRObyBocmVmPSIjaWQwIi8+Ci0gICAgICAgIDwvbnMxOmdldEJhbGFuY2U+Ci0gICAgICAgIDxtdWx0aVJlZiBpZD0iaWQwIiBzb2FwZW5jOnJvb3Q9IjAiCi0gICAgICAgICAgICAgICAgc29hcGVudjplbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIKLSAgICAgICAgICAgICAgICB4c2k6dHlwZT0ieHNkOmludCIgeG1sbnM6c29hcGVuYz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iPgotICAgICAgICAgICAgMTAwMTwvbXVsdGlSZWY+Ci0gICAgPC9zb2FwZW52OkJvZHk+Ci08L3NvYXBlbnY6RW52ZWxvcGU+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3QtcmVzb3VyY2VzL29taXR0ZWQtaGVhZGVyLW1lc3NhZ2VzL2ZpbmFsL25vUmVwbHlUb01lc3NhZ2UueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRkcmVzc2luZy90ZXN0LXJlc291cmNlcy9vbWl0dGVkLWhlYWRlci1tZXNzYWdlcy9maW5hbC9ub1JlcGx5VG9NZXNzYWdlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDJlY2RiZC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3QtcmVzb3VyY2VzL29taXR0ZWQtaGVhZGVyLW1lc3NhZ2VzL2ZpbmFsL25vUmVwbHlUb01lc3NhZ2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08c29hcGVudjpFbnZlbG9wZSB4bWxuczpzb2FwZW52PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyIKLSAgICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgICAgeG1sbnM6d3NhPSJodHRwOi8vd3d3LnczLm9yZy8yMDA1LzA4L2FkZHJlc3NpbmciPgotICAgIDxzb2FwZW52OkhlYWRlciB4bWxuczpmYWJyaWthbT0iaHR0cDovL2V4YW1wbGUuY29tL2ZhYnJpa2FtIiB4bWxuczpheGlzMj0iaHR0cDovL3dzLmFwYWNoZS5vcmcvbmFtZXNwYWNlcy9heGlzMiI+Ci0gICAgICAgIDx3c2E6TWVzc2FnZUlEIHNvYXBlbnY6bXVzdFVuZGVyc3RhbmQ9IjAiPgotICAgICAgICAgICAgdXVpZDo5MjBDNTE5MC0wQjhGLTExRDktOENFRC1GMjJFREVFQkY3RTU8L3dzYTpNZXNzYWdlSUQ+Ci0gICAgICAgIDx3c2E6VG8gc29hcGVudjptdXN0VW5kZXJzdGFuZD0iMCI+aHR0cDovL2xvY2FsaG9zdDo4MDgxL2F4aXMvc2VydmljZXMvQmFua1BvcnQ8L3dzYTpUbz4KLSAgICAgICAgPHdzYTpGcm9tIHNvYXBlbnY6bXVzdFVuZGVyc3RhbmQ9IjAiPgotICAgICAgICAgICAgPHdzYTpBZGRyZXNzPgotICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDgvYWRkcmVzc2luZy9hbm9ueW1vdXM8L3dzYTpBZGRyZXNzPgotICAgICAgICA8L3dzYTpGcm9tPgotICAgICAgICA8YXhpczI6UGFyYW1PbmUgd3NhOklzUmVmZXJlbmNlUGFyYW1ldGVyPSd0cnVlJz4xMjM0NTY3ODk8L2F4aXMyOlBhcmFtT25lPgotICAgICAgICA8YXhpczI6UGFyYW1Ud28gd3NhOklzUmVmZXJlbmNlUGFyYW1ldGVyPSd0cnVlJz5BQkNERUZHPC9heGlzMjpQYXJhbVR3bz4KLSAgICAgICAgPHdzYTpBY3Rpb24+aHR0cDovL3dzLmFwYWNoZS5vcmcvdGVzdHMvYWN0aW9uPC93c2E6QWN0aW9uPgotICAgICAgICA8d3NhOkZhdWx0VG8+Ci0gICAgICAgICAgICA8d3NhOkFkZHJlc3M+aHR0cDovL2V4YW1wbGUuY29tL2ZhYnJpa2FtL2ZhdWx0PC93c2E6QWRkcmVzcz4KLSAgICAgICAgPC93c2E6RmF1bHRUbz4KLSAgICA8L3NvYXBlbnY6SGVhZGVyPgotICAgIDxzb2FwZW52OkJvZHk+Ci0gICAgICAgIDxuczE6Z2V0QmFsYW5jZSBzb2FwZW52OmVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIgotICAgICAgICAgICAgICAgIHhtbG5zOm5zMT0iaHR0cDovL2xvY2FsaG9zdDo4MDgxL2F4aXMvc2VydmljZXMvQmFua1BvcnQiPgotICAgICAgICAgICAgPGFjY291bnRObyBocmVmPSIjaWQwIi8+Ci0gICAgICAgIDwvbnMxOmdldEJhbGFuY2U+Ci0gICAgICAgIDxtdWx0aVJlZiBpZD0iaWQwIiBzb2FwZW5jOnJvb3Q9IjAiCi0gICAgICAgICAgICAgICAgc29hcGVudjplbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIKLSAgICAgICAgICAgICAgICB4c2k6dHlwZT0ieHNkOmludCIgeG1sbnM6c29hcGVuYz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iPgotICAgICAgICAgICAgMTAwMTwvbXVsdGlSZWY+Ci0gICAgPC9zb2FwZW52OkJvZHk+Ci08L3NvYXBlbnY6RW52ZWxvcGU+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3QtcmVzb3VyY2VzL29taXR0ZWQtaGVhZGVyLW1lc3NhZ2VzL2ZpbmFsL25vVG9NZXNzYWdlLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkZHJlc3NpbmcvdGVzdC1yZXNvdXJjZXMvb21pdHRlZC1oZWFkZXItbWVzc2FnZXMvZmluYWwvbm9Ub01lc3NhZ2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmY2QzMjM3Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkZHJlc3NpbmcvdGVzdC1yZXNvdXJjZXMvb21pdHRlZC1oZWFkZXItbWVzc2FnZXMvZmluYWwvbm9Ub01lc3NhZ2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08c29hcGVudjpFbnZlbG9wZSB4bWxuczpzb2FwZW52PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyIKLSAgICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgICAgeG1sbnM6d3NhPSJodHRwOi8vd3d3LnczLm9yZy8yMDA1LzA4L2FkZHJlc3NpbmciPgotICAgIDxzb2FwZW52OkhlYWRlciB4bWxuczpmYWJyaWthbT0iaHR0cDovL2V4YW1wbGUuY29tL2ZhYnJpa2FtIiB4bWxuczpheGlzMj0iaHR0cDovL3dzLmFwYWNoZS5vcmcvbmFtZXNwYWNlcy9heGlzMiI+Ci0gICAgICAgIDx3c2E6TWVzc2FnZUlEIHNvYXBlbnY6bXVzdFVuZGVyc3RhbmQ9IjAiPgotICAgICAgICAgICAgdXVpZDo5MjBDNTE5MC0wQjhGLTExRDktOENFRC1GMjJFREVFQkY3RTU8L3dzYTpNZXNzYWdlSUQ+Ci0gICAgICAgIDx3c2E6RnJvbSBzb2FwZW52Om11c3RVbmRlcnN0YW5kPSIwIj4KLSAgICAgICAgICAgIDx3c2E6QWRkcmVzcz4KLSAgICAgICAgICAgICAgICBodHRwOi8vd3d3LnczLm9yZy8yMDA1LzA4L2FkZHJlc3NpbmcvYW5vbnltb3VzPC93c2E6QWRkcmVzcz4KLSAgICAgICAgPC93c2E6RnJvbT4KLSAgICAgICAgPHdzYTpSZXBseVRvPgotICAgICAgICAgICAgPHdzYTpBZGRyZXNzPmh0dHA6Ly9leGFtcGxlLmNvbS9mYWJyaWthbS9hY2N0PC93c2E6QWRkcmVzcz4KLSAgICAgICAgICAgIDx3c2E6UmVmZXJlbmNlUGFyYW1ldGVycz4KLSAgICAgICAgICAgICAgICA8ZmFicmlrYW06Q3VzdG9tZXJLZXk+MTIzNDU2Nzg5PC9mYWJyaWthbTpDdXN0b21lcktleT4KLSAgICAgICAgICAgICAgICA8ZmFicmlrYW06U2hvcHBpbmdDYXJ0PkFCQ0RFRkc8L2ZhYnJpa2FtOlNob3BwaW5nQ2FydD4KLSAgICAgICAgICAgIDwvd3NhOlJlZmVyZW5jZVBhcmFtZXRlcnM+Ci0gICAgICAgIDwvd3NhOlJlcGx5VG8+Ci0gICAgICAgIDx3c2E6QWN0aW9uPmh0dHA6Ly93cy5hcGFjaGUub3JnL3Rlc3RzL2FjdGlvbjwvd3NhOkFjdGlvbj4KLSAgICAgICAgPHdzYTpGYXVsdFRvPgotICAgICAgICAgICAgPHdzYTpBZGRyZXNzPmh0dHA6Ly9leGFtcGxlLmNvbS9mYWJyaWthbS9mYXVsdDwvd3NhOkFkZHJlc3M+Ci0gICAgICAgIDwvd3NhOkZhdWx0VG8+Ci0gICAgPC9zb2FwZW52OkhlYWRlcj4KLSAgICA8c29hcGVudjpCb2R5PgotICAgICAgICA8bnMxOmdldEJhbGFuY2Ugc29hcGVudjplbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIKLSAgICAgICAgICAgICAgICB4bWxuczpuczE9Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MS9heGlzL3NlcnZpY2VzL0JhbmtQb3J0Ij4KLSAgICAgICAgICAgIDxhY2NvdW50Tm8gaHJlZj0iI2lkMCIvPgotICAgICAgICA8L25zMTpnZXRCYWxhbmNlPgotICAgICAgICA8bXVsdGlSZWYgaWQ9ImlkMCIgc29hcGVuYzpyb290PSIwIgotICAgICAgICAgICAgICAgIHNvYXBlbnY6ZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iCi0gICAgICAgICAgICAgICAgeHNpOnR5cGU9InhzZDppbnQiIHhtbG5zOnNvYXBlbmM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIj4KLSAgICAgICAgICAgIDEwMDE8L211bHRpUmVmPgotICAgIDwvc29hcGVudjpCb2R5PgotPC9zb2FwZW52OkVudmVsb3BlPgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRkcmVzc2luZy90ZXN0LXJlc291cmNlcy9vbWl0dGVkLWhlYWRlci1tZXNzYWdlcy9zdWJtaXNzaW9uL25vQWN0aW9uTWVzc2FnZS54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3QtcmVzb3VyY2VzL29taXR0ZWQtaGVhZGVyLW1lc3NhZ2VzL3N1Ym1pc3Npb24vbm9BY3Rpb25NZXNzYWdlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDZkNDJjZC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3QtcmVzb3VyY2VzL29taXR0ZWQtaGVhZGVyLW1lc3NhZ2VzL3N1Ym1pc3Npb24vbm9BY3Rpb25NZXNzYWdlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHNvYXBlbnY6RW52ZWxvcGUgeG1sbnM6c29hcGVudj0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iCi0gICAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgIHhtbG5zOndzYT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOC9hZGRyZXNzaW5nIj4KLSAgICA8c29hcGVudjpIZWFkZXIgeG1sbnM6ZmFicmlrYW09Imh0dHA6Ly9leGFtcGxlLmNvbS9mYWJyaWthbSIgeG1sbnM6YXhpczI9Imh0dHA6Ly93cy5hcGFjaGUub3JnL25hbWVzcGFjZXMvYXhpczIiPgotICAgICAgICA8d3NhOk1lc3NhZ2VJRCBzb2FwZW52Om11c3RVbmRlcnN0YW5kPSIwIj4KLSAgICAgICAgICAgIHV1aWQ6OTIwQzUxOTAtMEI4Ri0xMUQ5LThDRUQtRjIyRURFRUJGN0U1PC93c2E6TWVzc2FnZUlEPgotICAgICAgICA8d3NhOlRvIHNvYXBlbnY6bXVzdFVuZGVyc3RhbmQ9IjAiPmh0dHA6Ly9sb2NhbGhvc3Q6ODA4MS9heGlzL3NlcnZpY2VzL0JhbmtQb3J0PC93c2E6VG8+Ci0gICAgICAgIDx3c2E6RnJvbSBzb2FwZW52Om11c3RVbmRlcnN0YW5kPSIwIj4KLSAgICAgICAgICAgIDx3c2E6QWRkcmVzcz4KLSAgICAgICAgICAgICAgICBodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA4L2FkZHJlc3Npbmcvcm9sZS9hbm9ueW1vdXM8L3dzYTpBZGRyZXNzPgotICAgICAgICA8L3dzYTpGcm9tPgotICAgICAgICA8YXhpczI6UGFyYW1PbmUgd3NhOklzUmVmZXJlbmNlUGFyYW1ldGVyPSd0cnVlJz4xMjM0NTY3ODk8L2F4aXMyOlBhcmFtT25lPgotICAgICAgICA8YXhpczI6UGFyYW1Ud28gd3NhOklzUmVmZXJlbmNlUGFyYW1ldGVyPSd0cnVlJz5BQkNERUZHPC9heGlzMjpQYXJhbVR3bz4KLSAgICAgICAgPHdzYTpSZXBseVRvPgotICAgICAgICAgICAgPHdzYTpBZGRyZXNzPmh0dHA6Ly9leGFtcGxlLmNvbS9mYWJyaWthbS9hY2N0PC93c2E6QWRkcmVzcz4KLSAgICAgICAgICAgIDx3c2E6UmVmZXJlbmNlUGFyYW1ldGVycz4KLSAgICAgICAgICAgICAgICA8ZmFicmlrYW06Q3VzdG9tZXJLZXk+MTIzNDU2Nzg5PC9mYWJyaWthbTpDdXN0b21lcktleT4KLSAgICAgICAgICAgICAgICA8ZmFicmlrYW06U2hvcHBpbmdDYXJ0PkFCQ0RFRkc8L2ZhYnJpa2FtOlNob3BwaW5nQ2FydD4KLSAgICAgICAgICAgIDwvd3NhOlJlZmVyZW5jZVBhcmFtZXRlcnM+Ci0gICAgICAgIDwvd3NhOlJlcGx5VG8+Ci0gICAgICAgIDx3c2E6RmF1bHRUbz4KLSAgICAgICAgICAgIDx3c2E6QWRkcmVzcz5odHRwOi8vZXhhbXBsZS5jb20vZmFicmlrYW0vZmF1bHQ8L3dzYTpBZGRyZXNzPgotICAgICAgICA8L3dzYTpGYXVsdFRvPgotICAgIDwvc29hcGVudjpIZWFkZXI+Ci0gICAgPHNvYXBlbnY6Qm9keT4KLSAgICAgICAgPG5zMTpnZXRCYWxhbmNlIHNvYXBlbnY6ZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iCi0gICAgICAgICAgICAgICAgeG1sbnM6bnMxPSJodHRwOi8vbG9jYWxob3N0OjgwODEvYXhpcy9zZXJ2aWNlcy9CYW5rUG9ydCI+Ci0gICAgICAgICAgICA8YWNjb3VudE5vIGhyZWY9IiNpZDAiLz4KLSAgICAgICAgPC9uczE6Z2V0QmFsYW5jZT4KLSAgICAgICAgPG11bHRpUmVmIGlkPSJpZDAiIHNvYXBlbmM6cm9vdD0iMCIKLSAgICAgICAgICAgICAgICBzb2FwZW52OmVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIgotICAgICAgICAgICAgICAgIHhzaTp0eXBlPSJ4c2Q6aW50IiB4bWxuczpzb2FwZW5jPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyI+Ci0gICAgICAgICAgICAxMDAxPC9tdWx0aVJlZj4KLSAgICA8L3NvYXBlbnY6Qm9keT4KLTwvc29hcGVudjpFbnZlbG9wZT4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkZHJlc3NpbmcvdGVzdC1yZXNvdXJjZXMvb21pdHRlZC1oZWFkZXItbWVzc2FnZXMvc3VibWlzc2lvbi9ub0ZhdWx0VG9NZXNzYWdlLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkZHJlc3NpbmcvdGVzdC1yZXNvdXJjZXMvb21pdHRlZC1oZWFkZXItbWVzc2FnZXMvc3VibWlzc2lvbi9ub0ZhdWx0VG9NZXNzYWdlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzAyYThjZi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3QtcmVzb3VyY2VzL29taXR0ZWQtaGVhZGVyLW1lc3NhZ2VzL3N1Ym1pc3Npb24vbm9GYXVsdFRvTWVzc2FnZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzb2FwZW52OkVudmVsb3BlIHhtbG5zOnNvYXBlbnY9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIgotICAgICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICAgICB4bWxuczp3c2E9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDgvYWRkcmVzc2luZyI+Ci0gICAgPHNvYXBlbnY6SGVhZGVyIHhtbG5zOmZhYnJpa2FtPSJodHRwOi8vZXhhbXBsZS5jb20vZmFicmlrYW0iIHhtbG5zOmF4aXMyPSJodHRwOi8vd3MuYXBhY2hlLm9yZy9uYW1lc3BhY2VzL2F4aXMyIj4KLSAgICAgICAgPHdzYTpNZXNzYWdlSUQgc29hcGVudjptdXN0VW5kZXJzdGFuZD0iMCI+Ci0gICAgICAgICAgICB1dWlkOjkyMEM1MTkwLTBCOEYtMTFEOS04Q0VELUYyMkVERUVCRjdFNTwvd3NhOk1lc3NhZ2VJRD4KLSAgICAgICAgPHdzYTpUbyBzb2FwZW52Om11c3RVbmRlcnN0YW5kPSIwIj5odHRwOi8vbG9jYWxob3N0OjgwODEvYXhpcy9zZXJ2aWNlcy9CYW5rUG9ydDwvd3NhOlRvPgotICAgICAgICA8d3NhOkZyb20gc29hcGVudjptdXN0VW5kZXJzdGFuZD0iMCI+Ci0gICAgICAgICAgICA8d3NhOkFkZHJlc3M+Ci0gICAgICAgICAgICAgICAgaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOC9hZGRyZXNzaW5nL3JvbGUvYW5vbnltb3VzPC93c2E6QWRkcmVzcz4KLSAgICAgICAgPC93c2E6RnJvbT4KLSAgICAgICAgPGF4aXMyOlBhcmFtT25lIHdzYTpJc1JlZmVyZW5jZVBhcmFtZXRlcj0ndHJ1ZSc+MTIzNDU2Nzg5PC9heGlzMjpQYXJhbU9uZT4KLSAgICAgICAgPGF4aXMyOlBhcmFtVHdvIHdzYTpJc1JlZmVyZW5jZVBhcmFtZXRlcj0ndHJ1ZSc+QUJDREVGRzwvYXhpczI6UGFyYW1Ud28+Ci0gICAgICAgIDx3c2E6UmVwbHlUbz4KLSAgICAgICAgICAgIDx3c2E6QWRkcmVzcz5odHRwOi8vZXhhbXBsZS5jb20vZmFicmlrYW0vYWNjdDwvd3NhOkFkZHJlc3M+Ci0gICAgICAgICAgICA8d3NhOlJlZmVyZW5jZVBhcmFtZXRlcnM+Ci0gICAgICAgICAgICAgICAgPGZhYnJpa2FtOkN1c3RvbWVyS2V5PjEyMzQ1Njc4OTwvZmFicmlrYW06Q3VzdG9tZXJLZXk+Ci0gICAgICAgICAgICAgICAgPGZhYnJpa2FtOlNob3BwaW5nQ2FydD5BQkNERUZHPC9mYWJyaWthbTpTaG9wcGluZ0NhcnQ+Ci0gICAgICAgICAgICA8L3dzYTpSZWZlcmVuY2VQYXJhbWV0ZXJzPgotICAgICAgICA8L3dzYTpSZXBseVRvPgotICAgICAgICA8d3NhOkFjdGlvbj5odHRwOi8vd3MuYXBhY2hlLm9yZy90ZXN0cy9hY3Rpb248L3dzYTpBY3Rpb24+Ci0gICAgPC9zb2FwZW52OkhlYWRlcj4KLSAgICA8c29hcGVudjpCb2R5PgotICAgICAgICA8bnMxOmdldEJhbGFuY2Ugc29hcGVudjplbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIKLSAgICAgICAgICAgICAgICB4bWxuczpuczE9Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MS9heGlzL3NlcnZpY2VzL0JhbmtQb3J0Ij4KLSAgICAgICAgICAgIDxhY2NvdW50Tm8gaHJlZj0iI2lkMCIvPgotICAgICAgICA8L25zMTpnZXRCYWxhbmNlPgotICAgICAgICA8bXVsdGlSZWYgaWQ9ImlkMCIgc29hcGVuYzpyb290PSIwIgotICAgICAgICAgICAgICAgIHNvYXBlbnY6ZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iCi0gICAgICAgICAgICAgICAgeHNpOnR5cGU9InhzZDppbnQiIHhtbG5zOnNvYXBlbmM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIj4KLSAgICAgICAgICAgIDEwMDE8L211bHRpUmVmPgotICAgIDwvc29hcGVudjpCb2R5PgotPC9zb2FwZW52OkVudmVsb3BlPgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRkcmVzc2luZy90ZXN0LXJlc291cmNlcy9vbWl0dGVkLWhlYWRlci1tZXNzYWdlcy9zdWJtaXNzaW9uL25vRnJvbU1lc3NhZ2UueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRkcmVzc2luZy90ZXN0LXJlc291cmNlcy9vbWl0dGVkLWhlYWRlci1tZXNzYWdlcy9zdWJtaXNzaW9uL25vRnJvbU1lc3NhZ2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjNlNGRhLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkZHJlc3NpbmcvdGVzdC1yZXNvdXJjZXMvb21pdHRlZC1oZWFkZXItbWVzc2FnZXMvc3VibWlzc2lvbi9ub0Zyb21NZXNzYWdlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHNvYXBlbnY6RW52ZWxvcGUgeG1sbnM6c29hcGVudj0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iCi0gICAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgIHhtbG5zOndzYT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOC9hZGRyZXNzaW5nIj4KLSAgICA8c29hcGVudjpIZWFkZXIgeG1sbnM6ZmFicmlrYW09Imh0dHA6Ly9leGFtcGxlLmNvbS9mYWJyaWthbSIgeG1sbnM6YXhpczI9Imh0dHA6Ly93cy5hcGFjaGUub3JnL25hbWVzcGFjZXMvYXhpczIiPgotICAgICAgICA8d3NhOk1lc3NhZ2VJRCBzb2FwZW52Om11c3RVbmRlcnN0YW5kPSIwIj4KLSAgICAgICAgICAgIHV1aWQ6OTIwQzUxOTAtMEI4Ri0xMUQ5LThDRUQtRjIyRURFRUJGN0U1PC93c2E6TWVzc2FnZUlEPgotICAgICAgICA8d3NhOlRvIHNvYXBlbnY6bXVzdFVuZGVyc3RhbmQ9IjAiPmh0dHA6Ly9sb2NhbGhvc3Q6ODA4MS9heGlzL3NlcnZpY2VzL0JhbmtQb3J0PC93c2E6VG8+Ci0gICAgICAgIDxheGlzMjpQYXJhbU9uZSB3c2E6SXNSZWZlcmVuY2VQYXJhbWV0ZXI9J3RydWUnPjEyMzQ1Njc4OTwvYXhpczI6UGFyYW1PbmU+Ci0gICAgICAgIDxheGlzMjpQYXJhbVR3byB3c2E6SXNSZWZlcmVuY2VQYXJhbWV0ZXI9J3RydWUnPkFCQ0RFRkc8L2F4aXMyOlBhcmFtVHdvPgotICAgICAgICA8d3NhOlJlcGx5VG8+Ci0gICAgICAgICAgICA8d3NhOkFkZHJlc3M+aHR0cDovL2V4YW1wbGUuY29tL2ZhYnJpa2FtL2FjY3Q8L3dzYTpBZGRyZXNzPgotICAgICAgICAgICAgPHdzYTpSZWZlcmVuY2VQYXJhbWV0ZXJzPgotICAgICAgICAgICAgICAgIDxmYWJyaWthbTpDdXN0b21lcktleT4xMjM0NTY3ODk8L2ZhYnJpa2FtOkN1c3RvbWVyS2V5PgotICAgICAgICAgICAgICAgIDxmYWJyaWthbTpTaG9wcGluZ0NhcnQ+QUJDREVGRzwvZmFicmlrYW06U2hvcHBpbmdDYXJ0PgotICAgICAgICAgICAgPC93c2E6UmVmZXJlbmNlUGFyYW1ldGVycz4KLSAgICAgICAgPC93c2E6UmVwbHlUbz4KLSAgICAgICAgPHdzYTpBY3Rpb24+aHR0cDovL3dzLmFwYWNoZS5vcmcvdGVzdHMvYWN0aW9uPC93c2E6QWN0aW9uPgotICAgICAgICA8d3NhOkZhdWx0VG8+Ci0gICAgICAgICAgICA8d3NhOkFkZHJlc3M+aHR0cDovL2V4YW1wbGUuY29tL2ZhYnJpa2FtL2ZhdWx0PC93c2E6QWRkcmVzcz4KLSAgICAgICAgPC93c2E6RmF1bHRUbz4KLSAgICA8L3NvYXBlbnY6SGVhZGVyPgotICAgIDxzb2FwZW52OkJvZHk+Ci0gICAgICAgIDxuczE6Z2V0QmFsYW5jZSBzb2FwZW52OmVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIgotICAgICAgICAgICAgICAgIHhtbG5zOm5zMT0iaHR0cDovL2xvY2FsaG9zdDo4MDgxL2F4aXMvc2VydmljZXMvQmFua1BvcnQiPgotICAgICAgICAgICAgPGFjY291bnRObyBocmVmPSIjaWQwIi8+Ci0gICAgICAgIDwvbnMxOmdldEJhbGFuY2U+Ci0gICAgICAgIDxtdWx0aVJlZiBpZD0iaWQwIiBzb2FwZW5jOnJvb3Q9IjAiCi0gICAgICAgICAgICAgICAgc29hcGVudjplbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIKLSAgICAgICAgICAgICAgICB4c2k6dHlwZT0ieHNkOmludCIgeG1sbnM6c29hcGVuYz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iPgotICAgICAgICAgICAgMTAwMTwvbXVsdGlSZWY+Ci0gICAgPC9zb2FwZW52OkJvZHk+Ci08L3NvYXBlbnY6RW52ZWxvcGU+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3QtcmVzb3VyY2VzL29taXR0ZWQtaGVhZGVyLW1lc3NhZ2VzL3N1Ym1pc3Npb24vbm9NZXNzYWdlSURNZXNzYWdlLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkZHJlc3NpbmcvdGVzdC1yZXNvdXJjZXMvb21pdHRlZC1oZWFkZXItbWVzc2FnZXMvc3VibWlzc2lvbi9ub01lc3NhZ2VJRE1lc3NhZ2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTgzMmY3Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkZHJlc3NpbmcvdGVzdC1yZXNvdXJjZXMvb21pdHRlZC1oZWFkZXItbWVzc2FnZXMvc3VibWlzc2lvbi9ub01lc3NhZ2VJRE1lc3NhZ2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08c29hcGVudjpFbnZlbG9wZSB4bWxuczpzb2FwZW52PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyIKLSAgICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgICAgeG1sbnM6d3NhPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA4L2FkZHJlc3NpbmciPgotICAgIDxzb2FwZW52OkhlYWRlciB4bWxuczpmYWJyaWthbT0iaHR0cDovL2V4YW1wbGUuY29tL2ZhYnJpa2FtIiB4bWxuczpheGlzMj0iaHR0cDovL3dzLmFwYWNoZS5vcmcvbmFtZXNwYWNlcy9heGlzMiI+Ci0gICAgICAgIDx3c2E6VG8gc29hcGVudjptdXN0VW5kZXJzdGFuZD0iMCI+aHR0cDovL2xvY2FsaG9zdDo4MDgxL2F4aXMvc2VydmljZXMvQmFua1BvcnQ8L3dzYTpUbz4KLSAgICAgICAgPHdzYTpGcm9tIHNvYXBlbnY6bXVzdFVuZGVyc3RhbmQ9IjAiPgotICAgICAgICAgICAgPHdzYTpBZGRyZXNzPgotICAgICAgICAgICAgICAgIGh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDgvYWRkcmVzc2luZy9yb2xlL2Fub255bW91czwvd3NhOkFkZHJlc3M+Ci0gICAgICAgIDwvd3NhOkZyb20+Ci0gICAgICAgIDxheGlzMjpQYXJhbU9uZSB3c2E6SXNSZWZlcmVuY2VQYXJhbWV0ZXI9J3RydWUnPjEyMzQ1Njc4OTwvYXhpczI6UGFyYW1PbmU+Ci0gICAgICAgIDxheGlzMjpQYXJhbVR3byB3c2E6SXNSZWZlcmVuY2VQYXJhbWV0ZXI9J3RydWUnPkFCQ0RFRkc8L2F4aXMyOlBhcmFtVHdvPgotICAgICAgICA8d3NhOlJlcGx5VG8+Ci0gICAgICAgICAgICA8d3NhOkFkZHJlc3M+aHR0cDovL2V4YW1wbGUuY29tL2ZhYnJpa2FtL2FjY3Q8L3dzYTpBZGRyZXNzPgotICAgICAgICAgICAgPHdzYTpSZWZlcmVuY2VQYXJhbWV0ZXJzPgotICAgICAgICAgICAgICAgIDxmYWJyaWthbTpDdXN0b21lcktleT4xMjM0NTY3ODk8L2ZhYnJpa2FtOkN1c3RvbWVyS2V5PgotICAgICAgICAgICAgICAgIDxmYWJyaWthbTpTaG9wcGluZ0NhcnQ+QUJDREVGRzwvZmFicmlrYW06U2hvcHBpbmdDYXJ0PgotICAgICAgICAgICAgPC93c2E6UmVmZXJlbmNlUGFyYW1ldGVycz4KLSAgICAgICAgPC93c2E6UmVwbHlUbz4KLSAgICAgICAgPHdzYTpBY3Rpb24+aHR0cDovL3dzLmFwYWNoZS5vcmcvdGVzdHMvYWN0aW9uPC93c2E6QWN0aW9uPgotICAgICAgICA8d3NhOkZhdWx0VG8+Ci0gICAgICAgICAgICA8d3NhOkFkZHJlc3M+aHR0cDovL2V4YW1wbGUuY29tL2ZhYnJpa2FtL2ZhdWx0PC93c2E6QWRkcmVzcz4KLSAgICAgICAgPC93c2E6RmF1bHRUbz4KLSAgICA8L3NvYXBlbnY6SGVhZGVyPgotICAgIDxzb2FwZW52OkJvZHk+Ci0gICAgICAgIDxuczE6Z2V0QmFsYW5jZSBzb2FwZW52OmVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIgotICAgICAgICAgICAgICAgIHhtbG5zOm5zMT0iaHR0cDovL2xvY2FsaG9zdDo4MDgxL2F4aXMvc2VydmljZXMvQmFua1BvcnQiPgotICAgICAgICAgICAgPGFjY291bnRObyBocmVmPSIjaWQwIi8+Ci0gICAgICAgIDwvbnMxOmdldEJhbGFuY2U+Ci0gICAgICAgIDxtdWx0aVJlZiBpZD0iaWQwIiBzb2FwZW5jOnJvb3Q9IjAiCi0gICAgICAgICAgICAgICAgc29hcGVudjplbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIKLSAgICAgICAgICAgICAgICB4c2k6dHlwZT0ieHNkOmludCIgeG1sbnM6c29hcGVuYz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iPgotICAgICAgICAgICAgMTAwMTwvbXVsdGlSZWY+Ci0gICAgPC9zb2FwZW52OkJvZHk+Ci08L3NvYXBlbnY6RW52ZWxvcGU+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3QtcmVzb3VyY2VzL29taXR0ZWQtaGVhZGVyLW1lc3NhZ2VzL3N1Ym1pc3Npb24vbm9NZXNzYWdlSUROb1JlcGx5VG9Ob0ZhdWx0VG9NZXNzYWdlLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkZHJlc3NpbmcvdGVzdC1yZXNvdXJjZXMvb21pdHRlZC1oZWFkZXItbWVzc2FnZXMvc3VibWlzc2lvbi9ub01lc3NhZ2VJRE5vUmVwbHlUb05vRmF1bHRUb01lc3NhZ2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmYzNDQ0Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkZHJlc3NpbmcvdGVzdC1yZXNvdXJjZXMvb21pdHRlZC1oZWFkZXItbWVzc2FnZXMvc3VibWlzc2lvbi9ub01lc3NhZ2VJRE5vUmVwbHlUb05vRmF1bHRUb01lc3NhZ2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08c29hcGVudjpFbnZlbG9wZSB4bWxuczpzb2FwZW52PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyIKLSAgICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgICAgeG1sbnM6d3NhPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA4L2FkZHJlc3NpbmciPgotICAgIDxzb2FwZW52OkhlYWRlciB4bWxuczpmYWJyaWthbT0iaHR0cDovL2V4YW1wbGUuY29tL2ZhYnJpa2FtIiB4bWxuczpheGlzMj0iaHR0cDovL3dzLmFwYWNoZS5vcmcvbmFtZXNwYWNlcy9heGlzMiI+Ci0gICAgICAgIDx3c2E6VG8gc29hcGVudjptdXN0VW5kZXJzdGFuZD0iMCI+aHR0cDovL2xvY2FsaG9zdDo4MDgxL2F4aXMvc2VydmljZXMvQmFua1BvcnQ8L3dzYTpUbz4KLSAgICAgICAgPHdzYTpGcm9tIHNvYXBlbnY6bXVzdFVuZGVyc3RhbmQ9IjAiPgotICAgICAgICAgICAgPHdzYTpBZGRyZXNzPgotICAgICAgICAgICAgICAgIGh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDgvYWRkcmVzc2luZy9yb2xlL2Fub255bW91czwvd3NhOkFkZHJlc3M+Ci0gICAgICAgIDwvd3NhOkZyb20+Ci0gICAgICAgIDxheGlzMjpQYXJhbU9uZSB3c2E6SXNSZWZlcmVuY2VQYXJhbWV0ZXI9J3RydWUnPjEyMzQ1Njc4OTwvYXhpczI6UGFyYW1PbmU+Ci0gICAgICAgIDxheGlzMjpQYXJhbVR3byB3c2E6SXNSZWZlcmVuY2VQYXJhbWV0ZXI9J3RydWUnPkFCQ0RFRkc8L2F4aXMyOlBhcmFtVHdvPgotICAgICAgICA8d3NhOkFjdGlvbj5odHRwOi8vd3MuYXBhY2hlLm9yZy90ZXN0cy9hY3Rpb248L3dzYTpBY3Rpb24+Ci0gICAgPC9zb2FwZW52OkhlYWRlcj4KLSAgICA8c29hcGVudjpCb2R5PgotICAgICAgICA8bnMxOmdldEJhbGFuY2Ugc29hcGVudjplbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIKLSAgICAgICAgICAgICAgICB4bWxuczpuczE9Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MS9heGlzL3NlcnZpY2VzL0JhbmtQb3J0Ij4KLSAgICAgICAgICAgIDxhY2NvdW50Tm8gaHJlZj0iI2lkMCIvPgotICAgICAgICA8L25zMTpnZXRCYWxhbmNlPgotICAgICAgICA8bXVsdGlSZWYgaWQ9ImlkMCIgc29hcGVuYzpyb290PSIwIgotICAgICAgICAgICAgICAgIHNvYXBlbnY6ZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iCi0gICAgICAgICAgICAgICAgeHNpOnR5cGU9InhzZDppbnQiIHhtbG5zOnNvYXBlbmM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIj4KLSAgICAgICAgICAgIDEwMDE8L211bHRpUmVmPgotICAgIDwvc29hcGVudjpCb2R5PgotPC9zb2FwZW52OkVudmVsb3BlPgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRkcmVzc2luZy90ZXN0LXJlc291cmNlcy9vbWl0dGVkLWhlYWRlci1tZXNzYWdlcy9zdWJtaXNzaW9uL25vUmVwbHlUb01lc3NhZ2UueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRkcmVzc2luZy90ZXN0LXJlc291cmNlcy9vbWl0dGVkLWhlYWRlci1tZXNzYWdlcy9zdWJtaXNzaW9uL25vUmVwbHlUb01lc3NhZ2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTAyNjI1Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkZHJlc3NpbmcvdGVzdC1yZXNvdXJjZXMvb21pdHRlZC1oZWFkZXItbWVzc2FnZXMvc3VibWlzc2lvbi9ub1JlcGx5VG9NZXNzYWdlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHNvYXBlbnY6RW52ZWxvcGUgeG1sbnM6c29hcGVudj0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iCi0gICAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgIHhtbG5zOndzYT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOC9hZGRyZXNzaW5nIj4KLSAgICA8c29hcGVudjpIZWFkZXIgeG1sbnM6ZmFicmlrYW09Imh0dHA6Ly9leGFtcGxlLmNvbS9mYWJyaWthbSIgeG1sbnM6YXhpczI9Imh0dHA6Ly93cy5hcGFjaGUub3JnL25hbWVzcGFjZXMvYXhpczIiPgotICAgICAgICA8d3NhOk1lc3NhZ2VJRCBzb2FwZW52Om11c3RVbmRlcnN0YW5kPSIwIj4KLSAgICAgICAgICAgIHV1aWQ6OTIwQzUxOTAtMEI4Ri0xMUQ5LThDRUQtRjIyRURFRUJGN0U1PC93c2E6TWVzc2FnZUlEPgotICAgICAgICA8d3NhOlRvIHNvYXBlbnY6bXVzdFVuZGVyc3RhbmQ9IjAiPmh0dHA6Ly9sb2NhbGhvc3Q6ODA4MS9heGlzL3NlcnZpY2VzL0JhbmtQb3J0PC93c2E6VG8+Ci0gICAgICAgIDx3c2E6RnJvbSBzb2FwZW52Om11c3RVbmRlcnN0YW5kPSIwIj4KLSAgICAgICAgICAgIDx3c2E6QWRkcmVzcz4KLSAgICAgICAgICAgICAgICBodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA4L2FkZHJlc3Npbmcvcm9sZS9hbm9ueW1vdXM8L3dzYTpBZGRyZXNzPgotICAgICAgICA8L3dzYTpGcm9tPgotICAgICAgICA8YXhpczI6UGFyYW1PbmUgd3NhOklzUmVmZXJlbmNlUGFyYW1ldGVyPSd0cnVlJz4xMjM0NTY3ODk8L2F4aXMyOlBhcmFtT25lPgotICAgICAgICA8YXhpczI6UGFyYW1Ud28gd3NhOklzUmVmZXJlbmNlUGFyYW1ldGVyPSd0cnVlJz5BQkNERUZHPC9heGlzMjpQYXJhbVR3bz4KLSAgICAgICAgPHdzYTpBY3Rpb24+aHR0cDovL3dzLmFwYWNoZS5vcmcvdGVzdHMvYWN0aW9uPC93c2E6QWN0aW9uPgotICAgICAgICA8d3NhOkZhdWx0VG8+Ci0gICAgICAgICAgICA8d3NhOkFkZHJlc3M+aHR0cDovL2V4YW1wbGUuY29tL2ZhYnJpa2FtL2ZhdWx0PC93c2E6QWRkcmVzcz4KLSAgICAgICAgPC93c2E6RmF1bHRUbz4KLSAgICA8L3NvYXBlbnY6SGVhZGVyPgotICAgIDxzb2FwZW52OkJvZHk+Ci0gICAgICAgIDxuczE6Z2V0QmFsYW5jZSBzb2FwZW52OmVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIgotICAgICAgICAgICAgICAgIHhtbG5zOm5zMT0iaHR0cDovL2xvY2FsaG9zdDo4MDgxL2F4aXMvc2VydmljZXMvQmFua1BvcnQiPgotICAgICAgICAgICAgPGFjY291bnRObyBocmVmPSIjaWQwIi8+Ci0gICAgICAgIDwvbnMxOmdldEJhbGFuY2U+Ci0gICAgICAgIDxtdWx0aVJlZiBpZD0iaWQwIiBzb2FwZW5jOnJvb3Q9IjAiCi0gICAgICAgICAgICAgICAgc29hcGVudjplbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIKLSAgICAgICAgICAgICAgICB4c2k6dHlwZT0ieHNkOmludCIgeG1sbnM6c29hcGVuYz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iPgotICAgICAgICAgICAgMTAwMTwvbXVsdGlSZWY+Ci0gICAgPC9zb2FwZW52OkJvZHk+Ci08L3NvYXBlbnY6RW52ZWxvcGU+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3QtcmVzb3VyY2VzL29taXR0ZWQtaGVhZGVyLW1lc3NhZ2VzL3N1Ym1pc3Npb24vbm9Ub01lc3NhZ2UueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRkcmVzc2luZy90ZXN0LXJlc291cmNlcy9vbWl0dGVkLWhlYWRlci1tZXNzYWdlcy9zdWJtaXNzaW9uL25vVG9NZXNzYWdlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJlNmU4Mi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3QtcmVzb3VyY2VzL29taXR0ZWQtaGVhZGVyLW1lc3NhZ2VzL3N1Ym1pc3Npb24vbm9Ub01lc3NhZ2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08c29hcGVudjpFbnZlbG9wZSB4bWxuczpzb2FwZW52PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyIKLSAgICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgICAgeG1sbnM6d3NhPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA4L2FkZHJlc3NpbmciPgotICAgIDxzb2FwZW52OkhlYWRlciB4bWxuczpmYWJyaWthbT0iaHR0cDovL2V4YW1wbGUuY29tL2ZhYnJpa2FtIiB4bWxuczpheGlzMj0iaHR0cDovL3dzLmFwYWNoZS5vcmcvbmFtZXNwYWNlcy9heGlzMiI+Ci0gICAgICAgIDx3c2E6TWVzc2FnZUlEIHNvYXBlbnY6bXVzdFVuZGVyc3RhbmQ9IjAiPgotICAgICAgICAgICAgdXVpZDo5MjBDNTE5MC0wQjhGLTExRDktOENFRC1GMjJFREVFQkY3RTU8L3dzYTpNZXNzYWdlSUQ+Ci0gICAgICAgIDx3c2E6RnJvbSBzb2FwZW52Om11c3RVbmRlcnN0YW5kPSIwIj4KLSAgICAgICAgICAgIDx3c2E6QWRkcmVzcz4KLSAgICAgICAgICAgICAgICBodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA4L2FkZHJlc3Npbmcvcm9sZS9hbm9ueW1vdXM8L3dzYTpBZGRyZXNzPgotICAgICAgICA8L3dzYTpGcm9tPgotICAgICAgICA8d3NhOlJlcGx5VG8+Ci0gICAgICAgICAgICA8d3NhOkFkZHJlc3M+aHR0cDovL2V4YW1wbGUuY29tL2ZhYnJpa2FtL2FjY3Q8L3dzYTpBZGRyZXNzPgotICAgICAgICAgICAgPHdzYTpSZWZlcmVuY2VQYXJhbWV0ZXJzPgotICAgICAgICAgICAgICAgIDxmYWJyaWthbTpDdXN0b21lcktleT4xMjM0NTY3ODk8L2ZhYnJpa2FtOkN1c3RvbWVyS2V5PgotICAgICAgICAgICAgICAgIDxmYWJyaWthbTpTaG9wcGluZ0NhcnQ+QUJDREVGRzwvZmFicmlrYW06U2hvcHBpbmdDYXJ0PgotICAgICAgICAgICAgPC93c2E6UmVmZXJlbmNlUGFyYW1ldGVycz4KLSAgICAgICAgPC93c2E6UmVwbHlUbz4KLSAgICAgICAgPHdzYTpBY3Rpb24+aHR0cDovL3dzLmFwYWNoZS5vcmcvdGVzdHMvYWN0aW9uPC93c2E6QWN0aW9uPgotICAgICAgICA8d3NhOkZhdWx0VG8+Ci0gICAgICAgICAgICA8d3NhOkFkZHJlc3M+aHR0cDovL2V4YW1wbGUuY29tL2ZhYnJpa2FtL2ZhdWx0PC93c2E6QWRkcmVzcz4KLSAgICAgICAgPC93c2E6RmF1bHRUbz4KLSAgICA8L3NvYXBlbnY6SGVhZGVyPgotICAgIDxzb2FwZW52OkJvZHk+Ci0gICAgICAgIDxuczE6Z2V0QmFsYW5jZSBzb2FwZW52OmVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIgotICAgICAgICAgICAgICAgIHhtbG5zOm5zMT0iaHR0cDovL2xvY2FsaG9zdDo4MDgxL2F4aXMvc2VydmljZXMvQmFua1BvcnQiPgotICAgICAgICAgICAgPGFjY291bnRObyBocmVmPSIjaWQwIi8+Ci0gICAgICAgIDwvbnMxOmdldEJhbGFuY2U+Ci0gICAgICAgIDxtdWx0aVJlZiBpZD0iaWQwIiBzb2FwZW5jOnJvb3Q9IjAiCi0gICAgICAgICAgICAgICAgc29hcGVudjplbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIKLSAgICAgICAgICAgICAgICB4c2k6dHlwZT0ieHNkOmludCIgeG1sbnM6c29hcGVuYz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iPgotICAgICAgICAgICAgMTAwMTwvbXVsdGlSZWY+Ci0gICAgPC9zb2FwZW52OkJvZHk+Ci08L3NvYXBlbnY6RW52ZWxvcGU+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3QtcmVzb3VyY2VzL3NvYXAxMXJvbGVUZXN0LnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkZHJlc3NpbmcvdGVzdC1yZXNvdXJjZXMvc29hcDExcm9sZVRlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTI4MzA1Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkZHJlc3NpbmcvdGVzdC1yZXNvdXJjZXMvc29hcDExcm9sZVRlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPHNvYXBlbnY6RW52ZWxvcGUgeG1sbnM6c29hcGVudj0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iPg0KLSAgICA8c29hcGVudjpIZWFkZXIgeG1sbnM6d3NhPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA4L2FkZHJlc3NpbmciIHhtbG5zOm15UmVmPSJodHRwOi8vcmVmZXJlbmNlLm9yZyI+DQotICAgICAgICA8d3NhOkZyb20gc29hcGVudjphY3Rvcj0idXJuOnRlc3Q6cm9sZSI+DQotICAgICAgICAgICAgPHdzYTpBZGRyZXNzPmh0dHA6Ly93d3cuZnJvbS5vcmcvc2VydmljZS88L3dzYTpBZGRyZXNzPg0KLSAgICAgICAgICAgIDx3c2E6UmVmZXJlbmNlUGFyYW1ldGVycz4NCi0gICAgICAgICAgICAgICAgPFJlZmVyZW5jZTI+VmFsdWUgMjAwPC9SZWZlcmVuY2UyPg0KLSAgICAgICAgICAgIDwvd3NhOlJlZmVyZW5jZVBhcmFtZXRlcnM+DQotICAgICAgICA8L3dzYTpGcm9tPg0KLSAgICAgICAgPHdzYTpUbyBzb2FwZW52OmFjdG9yPSJ1cm46dGVzdDpyb2xlIj5odHRwOi8vd3d3LnRvLm9yZy9zZXJ2aWNlLzwvd3NhOlRvPg0KLSAgICAgICAgPHdzYTpNZXNzYWdlSUQgc29hcGVudjphY3Rvcj0idXJuOnRlc3Q6cm9sZSI+MTIzNDU2LTc4OTA8L3dzYTpNZXNzYWdlSUQ+DQotICAgICAgICA8bXlSZWY6UmVmZXJlbmNlNCBzb2FwZW52OmFjdG9yPSJ1cm46dGVzdDpyb2xlIj5WYWx1ZSA0MDA8L215UmVmOlJlZmVyZW5jZTQ+DQotICAgICAgICA8bXlSZWY6UmVmZXJlbmNlMyBzb2FwZW52OmFjdG9yPSJ1cm46dGVzdDpyb2xlIj5WYWx1ZSAzMDA8L215UmVmOlJlZmVyZW5jZTM+DQotICAgICAgICA8d3NhOkFjdGlvbiBzb2FwZW52OmFjdG9yPSJ1cm46dGVzdDpyb2xlIj5odHRwOi8vd3d3LmFjdGlvbnMub3JnL2FjdGlvbjwvd3NhOkFjdGlvbj4NCi0gICAgICAgIDx3c2E6UmVwbHlUbyBzb2FwZW52OmFjdG9yPSJ1cm46dGVzdDpyb2xlIj4NCi0gICAgICAgICAgICA8d3NhOkFkZHJlc3M+aHR0cDovL3d3dy5yZXBseVRvLm9yZy9zZXJ2aWNlLzwvd3NhOkFkZHJlc3M+DQotICAgICAgICA8L3dzYTpSZXBseVRvPg0KLSAgICAgICAgPHdzYTpSZWxhdGVzVG8gc29hcGVudjphY3Rvcj0idXJuOnRlc3Q6cm9sZSIgUmVsYXRpb25zaGlwVHlwZT0iVGVzdFJlbGF0aW9uIj5odHRwOi8vd3d3LnJlbGF0ZXNUby5vcmcvc2VydmljZS88L3dzYTpSZWxhdGVzVG8+DQotICAgIDwvc29hcGVudjpIZWFkZXI+DQotICAgIDxzb2FwZW52OkJvZHk+PC9zb2FwZW52OkJvZHk+DQotPC9zb2FwZW52OkVudmVsb3BlPg0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkZHJlc3NpbmcvdGVzdC1yZXNvdXJjZXMvc29hcDEycm9sZVRlc3QueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRkcmVzc2luZy90ZXN0LXJlc291cmNlcy9zb2FwMTJyb2xlVGVzdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhNWRiMmIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRkcmVzc2luZy90ZXN0LXJlc291cmNlcy9zb2FwMTJyb2xlVGVzdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08c29hcGVudjpFbnZlbG9wZSB4bWxuczpzb2FwZW52PSJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUiPg0KLSAgICA8c29hcGVudjpIZWFkZXIgeG1sbnM6d3NhPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA4L2FkZHJlc3NpbmciIHhtbG5zOm15UmVmPSJodHRwOi8vcmVmZXJlbmNlLm9yZyI+DQotICAgICAgICA8d3NhOkZyb20gc29hcGVudjpyb2xlPSJ1cm46dGVzdDpyb2xlIj4NCi0gICAgICAgICAgICA8d3NhOkFkZHJlc3M+aHR0cDovL3d3dy5mcm9tLm9yZy9zZXJ2aWNlLzwvd3NhOkFkZHJlc3M+DQotICAgICAgICAgICAgPHdzYTpSZWZlcmVuY2VQYXJhbWV0ZXJzPg0KLSAgICAgICAgICAgICAgICA8UmVmZXJlbmNlMj5WYWx1ZSAyMDA8L1JlZmVyZW5jZTI+DQotICAgICAgICAgICAgPC93c2E6UmVmZXJlbmNlUGFyYW1ldGVycz4NCi0gICAgICAgIDwvd3NhOkZyb20+DQotICAgICAgICA8d3NhOlRvIHNvYXBlbnY6cm9sZT0idXJuOnRlc3Q6cm9sZSI+aHR0cDovL3d3dy50by5vcmcvc2VydmljZS88L3dzYTpUbz4NCi0gICAgICAgIDx3c2E6TWVzc2FnZUlEIHNvYXBlbnY6cm9sZT0idXJuOnRlc3Q6cm9sZSI+MTIzNDU2LTc4OTA8L3dzYTpNZXNzYWdlSUQ+DQotICAgICAgICA8bXlSZWY6UmVmZXJlbmNlNCBzb2FwZW52OnJvbGU9InVybjp0ZXN0OnJvbGUiPlZhbHVlIDQwMDwvbXlSZWY6UmVmZXJlbmNlND4NCi0gICAgICAgIDxteVJlZjpSZWZlcmVuY2UzIHNvYXBlbnY6cm9sZT0idXJuOnRlc3Q6cm9sZSI+VmFsdWUgMzAwPC9teVJlZjpSZWZlcmVuY2UzPg0KLSAgICAgICAgPHdzYTpBY3Rpb24gc29hcGVudjpyb2xlPSJ1cm46dGVzdDpyb2xlIj5odHRwOi8vd3d3LmFjdGlvbnMub3JnL2FjdGlvbjwvd3NhOkFjdGlvbj4NCi0gICAgICAgIDx3c2E6UmVwbHlUbyBzb2FwZW52OnJvbGU9InVybjp0ZXN0OnJvbGUiPg0KLSAgICAgICAgICAgIDx3c2E6QWRkcmVzcz5odHRwOi8vd3d3LnJlcGx5VG8ub3JnL3NlcnZpY2UvPC93c2E6QWRkcmVzcz4NCi0gICAgICAgIDwvd3NhOlJlcGx5VG8+DQotICAgICAgICA8d3NhOlJlbGF0ZXNUbyBzb2FwZW52OnJvbGU9InVybjp0ZXN0OnJvbGUiIFJlbGF0aW9uc2hpcFR5cGU9IlRlc3RSZWxhdGlvbiI+aHR0cDovL3d3dy5yZWxhdGVzVG8ub3JnL3NlcnZpY2UvPC93c2E6UmVsYXRlc1RvPg0KLSAgICA8L3NvYXBlbnY6SGVhZGVyPg0KLSAgICA8c29hcGVudjpCb2R5Pjwvc29hcGVudjpCb2R5Pg0KLTwvc29hcGVudjpFbnZlbG9wZT4NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3QtcmVzb3VyY2VzL3ZhbGlkLW1lc3NhZ2VzL2ZpbmFsL3NvYXBtZXNzYWdlLmN1c3RvbXJvbGUuc29hcDEyLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkZHJlc3NpbmcvdGVzdC1yZXNvdXJjZXMvdmFsaWQtbWVzc2FnZXMvZmluYWwvc29hcG1lc3NhZ2UuY3VzdG9tcm9sZS5zb2FwMTIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjAyMzUyLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkZHJlc3NpbmcvdGVzdC1yZXNvdXJjZXMvdmFsaWQtbWVzc2FnZXMvZmluYWwvc29hcG1lc3NhZ2UuY3VzdG9tcm9sZS5zb2FwMTIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPHNvYXBlbnY6RW52ZWxvcGUgeG1sbnM6c29hcGVudj0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIg0KLSAgICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSINCi0gICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQotICAgICAgICB4bWxuczp3c2E9Imh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDgvYWRkcmVzc2luZyI+DQotICAgIDxzb2FwZW52OkhlYWRlciB4bWxuczpmYWJyaWthbT0iaHR0cDovL2V4YW1wbGUuY29tL2ZhYnJpa2FtIiB4bWxuczpheGlzMj0iaHR0cDovL3dzLmFwYWNoZS5vcmcvbmFtZXNwYWNlcy9heGlzMiI+DQotICAgICAgICA8d3NhOk1lc3NhZ2VJRD5pbnZhbGlkLW5vdGlucm9sZTwvd3NhOk1lc3NhZ2VJRD4NCi0gICAgICAgIDx3c2E6VG8+c29hcGVudjptdXN0VW5kZXJzdGFuZD0iMCI+aW52YWxpZC1ub3RpbnJvbGU8L3dzYTpUbz4NCi0gICAgICAgIDx3c2E6RnJvbT4NCi0gICAgICAgICAgICA8d3NhOkFkZHJlc3M+aW52YWxpZC1ub3RpbnJvbGU8L3dzYTpBZGRyZXNzPg0KLSAgICAgICAgPC93c2E6RnJvbT4NCi0gICAgICAgIDx3c2E6QWN0aW9uPmludmFsaWQtbm90aW5yb2xlPC93c2E6QWN0aW9uPg0KLSAgICAgICAgPHdzYTpSZXBseVRvPg0KLSAgICAgICAgICAgIDx3c2E6QWRkcmVzcz5pbnZhbGlkLW5vdGlucm9sZTwvd3NhOkFkZHJlc3M+DQotICAgICAgICA8L3dzYTpSZXBseVRvPg0KLSAgICAgICAgPHdzYTpGYXVsdFRvPg0KLSAgICAgICAgICAgIDx3c2E6QWRkcmVzcz5pbnZhbGlkLW5vdGlucm9sZTwvd3NhOkFkZHJlc3M+DQotICAgICAgICA8L3dzYTpGYXVsdFRvPg0KLSAgICAgICAgPHdzYTpSZWxhdGVzVG8+aW52YWxpZC1ub3RpbnJvbGU8L3dzYTpSZWxhdGVzVG8+DQotICAgICAgICA8d3NhOlJlbGF0ZXNUbyBSZWxhdGlvbnNoaXBUeXBlPSJodHRwOi8vc29tZS5jdXN0b20ucmVsYXRpb25zaGlwIj5pbnZhbGlkLW5vdGlucm9sZTwvd3NhOlJlbGF0ZXNUbz4NCi0gICAgICAgIA0KLSAgICAgICAgPHdzYTpNZXNzYWdlSUQgYXhpczI6QXR0ckV4dD0iMTIzNDU2Nzg5IiBzb2FwZW52OnJvbGU9Imh0dHA6Ly9teS9jdXN0b20vcm9sZSI+DQotICAgICAgICAgICAgdXVpZDo5MjBDNTE5MC0wQjhGLTExRDktOENFRC1GMjJFREVFQkY3RTU8L3dzYTpNZXNzYWdlSUQ+DQotICAgICAgICA8d3NhOlRvIGF4aXMyOkF0dHJFeHQ9IjEyMzQ1Njc4OSIgc29hcGVudjpyb2xlPSJodHRwOi8vbXkvY3VzdG9tL3JvbGUiPmh0dHA6Ly9sb2NhbGhvc3Q6ODA4MS9heGlzL3NlcnZpY2VzL0JhbmtQb3J0PC93c2E6VG8+DQotICAgICAgICA8d3NhOkZyb20gc29hcGVudjptdXN0VW5kZXJzdGFuZD0iMCIgYXhpczI6QXR0ckV4dD0iMTIzNDU2Nzg5IiBzb2FwZW52OnJvbGU9Imh0dHA6Ly9teS9jdXN0b20vcm9sZSI+DQotICAgICAgICAgICAgPHdzYTpBZGRyZXNzPmh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDgvYWRkcmVzc2luZy9hbm9ueW1vdXM8L3dzYTpBZGRyZXNzPg0KLSAgICAgICAgICAgIDx3c2E6UmVmZXJlbmNlUGFyYW1ldGVycz4NCi0gICAgICAgICAgICAgICAgPGZhYnJpa2FtOkN1c3RvbWVyS2V5PjEyMzQ1Njc4OTwvZmFicmlrYW06Q3VzdG9tZXJLZXk+DQotICAgICAgICAgICAgICAgIDxmYWJyaWthbTpTaG9wcGluZ0NhcnQ+QUJDREVGRzwvZmFicmlrYW06U2hvcHBpbmdDYXJ0Pg0KLSAgICAgICAgICAgIDwvd3NhOlJlZmVyZW5jZVBhcmFtZXRlcnM+DQotICAgICAgICAgICAgPHdzYTpNZXRhZGF0YT4NCi0gICAgICAgICAgICAgICAgPGF4aXMyOk1ldGFFeHQgYXhpczI6QXR0ckV4dD0iMTIzNDU2Nzg5Ij4xMjM0NTY3ODk8L2F4aXMyOk1ldGFFeHQ+DQotICAgICAgICAgICAgPC93c2E6TWV0YWRhdGE+DQotICAgICAgICAgICAgPGF4aXMyOkVQUkV4dCBheGlzMjpBdHRyRXh0PSIxMjM0NTY3ODkiPjEyMzQ1Njc4OTwvYXhpczI6RVBSRXh0Pg0KLSAgICAgICAgPC93c2E6RnJvbT4NCi0gICAgICAgIDx3c2E6QWN0aW9uIGF4aXMyOkF0dHJFeHQ9IjEyMzQ1Njc4OSIgc29hcGVudjpyb2xlPSJodHRwOi8vbXkvY3VzdG9tL3JvbGUiPmh0dHA6Ly93cy5hcGFjaGUub3JnL3Rlc3RzL2FjdGlvbjwvd3NhOkFjdGlvbj4NCi0gICAgICAgIDx3c2E6UmVwbHlUbyBheGlzMjpBdHRyRXh0PSIxMjM0NTY3ODkiIHNvYXBlbnY6cm9sZT0iaHR0cDovL215L2N1c3RvbS9yb2xlIj4NCi0gICAgICAgICAgICA8d3NhOkFkZHJlc3M+aHR0cDovL2V4YW1wbGUuY29tL2ZhYnJpa2FtL2FjY3Q8L3dzYTpBZGRyZXNzPg0KLSAgICAgICAgICAgIDx3c2E6UmVmZXJlbmNlUGFyYW1ldGVycz4NCi0gICAgICAgICAgICAgICAgPGZhYnJpa2FtOkN1c3RvbWVyS2V5PjEyMzQ1Njc4OTwvZmFicmlrYW06Q3VzdG9tZXJLZXk+DQotICAgICAgICAgICAgICAgIDxmYWJyaWthbTpTaG9wcGluZ0NhcnQ+QUJDREVGRzwvZmFicmlrYW06U2hvcHBpbmdDYXJ0Pg0KLSAgICAgICAgICAgIDwvd3NhOlJlZmVyZW5jZVBhcmFtZXRlcnM+DQotICAgICAgICAgICAgPHdzYTpNZXRhZGF0YT4NCi0gICAgICAgICAgICAgICAgPGF4aXMyOk1ldGFFeHQgYXhpczI6QXR0ckV4dD0iMTIzNDU2Nzg5Ij4xMjM0NTY3ODk8L2F4aXMyOk1ldGFFeHQ+DQotICAgICAgICAgICAgPC93c2E6TWV0YWRhdGE+DQotICAgICAgICAgICAgPGF4aXMyOkVQUkV4dCBheGlzMjpBdHRyRXh0PSIxMjM0NTY3ODkiPjEyMzQ1Njc4OTwvYXhpczI6RVBSRXh0Pg0KLSAgICAgICAgPC93c2E6UmVwbHlUbz4NCi0gICAgICAgIDx3c2E6RmF1bHRUbyBheGlzMjpBdHRyRXh0PSIxMjM0NTY3ODkiIHNvYXBlbnY6cm9sZT0iaHR0cDovL215L2N1c3RvbS9yb2xlIj4NCi0gICAgICAgICAgICA8d3NhOkFkZHJlc3M+aHR0cDovL2V4YW1wbGUuY29tL2ZhYnJpa2FtL2ZhdWx0PC93c2E6QWRkcmVzcz4NCi0gICAgICAgICAgICA8d3NhOlJlZmVyZW5jZVBhcmFtZXRlcnM+DQotICAgICAgICAgICAgICAgIDxmYWJyaWthbTpDdXN0b21lcktleT4xMjM0NTY3ODk8L2ZhYnJpa2FtOkN1c3RvbWVyS2V5Pg0KLSAgICAgICAgICAgICAgICA8ZmFicmlrYW06U2hvcHBpbmdDYXJ0PkFCQ0RFRkc8L2ZhYnJpa2FtOlNob3BwaW5nQ2FydD4NCi0gICAgICAgICAgICA8L3dzYTpSZWZlcmVuY2VQYXJhbWV0ZXJzPg0KLSAgICAgICAgICAgIDx3c2E6TWV0YWRhdGE+DQotICAgICAgICAgICAgICAgIDxheGlzMjpNZXRhRXh0IGF4aXMyOkF0dHJFeHQ9IjEyMzQ1Njc4OSI+MTIzNDU2Nzg5PC9heGlzMjpNZXRhRXh0Pg0KLSAgICAgICAgICAgIDwvd3NhOk1ldGFkYXRhPg0KLSAgICAgICAgICAgIDxheGlzMjpFUFJFeHQgYXhpczI6QXR0ckV4dD0iMTIzNDU2Nzg5Ij4xMjM0NTY3ODk8L2F4aXMyOkVQUkV4dD4NCi0gICAgICAgIDwvd3NhOkZhdWx0VG8+DQotICAgICAgICA8d3NhOlJlbGF0ZXNUbyBheGlzMjpBdHRyRXh0PSIxMjM0NTY3ODkiIHNvYXBlbnY6cm9sZT0iaHR0cDovL215L2N1c3RvbS9yb2xlIj5odHRwOi8vc29tZS5wcmV2aW91cy5tZXNzYWdlPC93c2E6UmVsYXRlc1RvPg0KLSAgICAgICAgPHdzYTpSZWxhdGVzVG8gUmVsYXRpb25zaGlwVHlwZT0iaHR0cDovL3NvbWUuY3VzdG9tLnJlbGF0aW9uc2hpcCIgc29hcGVudjpyb2xlPSJodHRwOi8vbXkvY3VzdG9tL3JvbGUiPmh0dHA6Ly9pZGVudGlmaWVyLm9mLm90aGVyLm1lc3NhZ2UvPC93c2E6UmVsYXRlc1RvPg0KLSAgICA8L3NvYXBlbnY6SGVhZGVyPg0KLSAgICA8c29hcGVudjpCb2R5Pg0KLSAgICAgICAgPG5zMTpnZXRCYWxhbmNlIHNvYXBlbnY6ZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iDQotICAgICAgICAgICAgICAgIHhtbG5zOm5zMT0iaHR0cDovL2xvY2FsaG9zdDo4MDgxL2F4aXMvc2VydmljZXMvQmFua1BvcnQiPg0KLSAgICAgICAgICAgIDxhY2NvdW50Tm8gaHJlZj0iI2lkMCIvPg0KLSAgICAgICAgPC9uczE6Z2V0QmFsYW5jZT4NCi0gICAgICAgIDxtdWx0aVJlZiBpZD0iaWQwIiBzb2FwZW5jOnJvb3Q9IjAiDQotICAgICAgICAgICAgICAgIHNvYXBlbnY6ZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iDQotICAgICAgICAgICAgICAgIHhzaTp0eXBlPSJ4c2Q6aW50IiB4bWxuczpzb2FwZW5jPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyI+DQotICAgICAgICAgICAgMTAwMTwvbXVsdGlSZWY+DQotICAgIDwvc29hcGVudjpCb2R5Pg0KLTwvc29hcGVudjpFbnZlbG9wZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3QtcmVzb3VyY2VzL3ZhbGlkLW1lc3NhZ2VzL2ZpbmFsL3NvYXBtZXNzYWdlLmN1c3RvbXJvbGUueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRkcmVzc2luZy90ZXN0LXJlc291cmNlcy92YWxpZC1tZXNzYWdlcy9maW5hbC9zb2FwbWVzc2FnZS5jdXN0b21yb2xlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY3ZmY3Ni4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3QtcmVzb3VyY2VzL3ZhbGlkLW1lc3NhZ2VzL2ZpbmFsL3NvYXBtZXNzYWdlLmN1c3RvbXJvbGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPHNvYXBlbnY6RW52ZWxvcGUgeG1sbnM6c29hcGVudj0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iDQotICAgICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIg0KLSAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgIHhtbG5zOndzYT0iaHR0cDovL3d3dy53My5vcmcvMjAwNS8wOC9hZGRyZXNzaW5nIj4NCi0gICAgPHNvYXBlbnY6SGVhZGVyIHhtbG5zOmZhYnJpa2FtPSJodHRwOi8vZXhhbXBsZS5jb20vZmFicmlrYW0iIHhtbG5zOmF4aXMyPSJodHRwOi8vd3MuYXBhY2hlLm9yZy9uYW1lc3BhY2VzL2F4aXMyIj4NCi0gICAgICAgIDx3c2E6TWVzc2FnZUlEPmludmFsaWQtbm90aW5yb2xlPC93c2E6TWVzc2FnZUlEPg0KLSAgICAgICAgPHdzYTpUbz5zb2FwZW52Om11c3RVbmRlcnN0YW5kPSIwIj5pbnZhbGlkLW5vdGlucm9sZTwvd3NhOlRvPg0KLSAgICAgICAgPHdzYTpGcm9tPg0KLSAgICAgICAgICAgIDx3c2E6QWRkcmVzcz5pbnZhbGlkLW5vdGlucm9sZTwvd3NhOkFkZHJlc3M+DQotICAgICAgICA8L3dzYTpGcm9tPg0KLSAgICAgICAgPHdzYTpBY3Rpb24+aW52YWxpZC1ub3RpbnJvbGU8L3dzYTpBY3Rpb24+DQotICAgICAgICA8d3NhOlJlcGx5VG8+DQotICAgICAgICAgICAgPHdzYTpBZGRyZXNzPmludmFsaWQtbm90aW5yb2xlPC93c2E6QWRkcmVzcz4NCi0gICAgICAgIDwvd3NhOlJlcGx5VG8+DQotICAgICAgICA8d3NhOkZhdWx0VG8+DQotICAgICAgICAgICAgPHdzYTpBZGRyZXNzPmludmFsaWQtbm90aW5yb2xlPC93c2E6QWRkcmVzcz4NCi0gICAgICAgIDwvd3NhOkZhdWx0VG8+DQotICAgICAgICA8d3NhOlJlbGF0ZXNUbz5pbnZhbGlkLW5vdGlucm9sZTwvd3NhOlJlbGF0ZXNUbz4NCi0gICAgICAgIDx3c2E6UmVsYXRlc1RvIFJlbGF0aW9uc2hpcFR5cGU9Imh0dHA6Ly9zb21lLmN1c3RvbS5yZWxhdGlvbnNoaXAiPmludmFsaWQtbm90aW5yb2xlPC93c2E6UmVsYXRlc1RvPg0KLSAgICAgICAgDQotICAgICAgICA8d3NhOk1lc3NhZ2VJRCBheGlzMjpBdHRyRXh0PSIxMjM0NTY3ODkiIHNvYXBlbnY6bXVzdFVuZGVyc3RhbmQ9IjAiIHNvYXBlbnY6YWN0b3I9Imh0dHA6Ly9teS9jdXN0b20vcm9sZSI+DQotICAgICAgICAgICAgdXVpZDo5MjBDNTE5MC0wQjhGLTExRDktOENFRC1GMjJFREVFQkY3RTU8L3dzYTpNZXNzYWdlSUQ+DQotICAgICAgICA8d3NhOlRvIGF4aXMyOkF0dHJFeHQ9IjEyMzQ1Njc4OSIgc29hcGVudjptdXN0VW5kZXJzdGFuZD0iMCIgc29hcGVudjphY3Rvcj0iaHR0cDovL215L2N1c3RvbS9yb2xlIj5odHRwOi8vbG9jYWxob3N0OjgwODEvYXhpcy9zZXJ2aWNlcy9CYW5rUG9ydDwvd3NhOlRvPg0KLSAgICAgICAgPHdzYTpGcm9tIHNvYXBlbnY6bXVzdFVuZGVyc3RhbmQ9IjAiIGF4aXMyOkF0dHJFeHQ9IjEyMzQ1Njc4OSIgc29hcGVudjphY3Rvcj0iaHR0cDovL215L2N1c3RvbS9yb2xlIj4NCi0gICAgICAgICAgICA8d3NhOkFkZHJlc3M+aHR0cDovL3d3dy53My5vcmcvMjAwNS8wOC9hZGRyZXNzaW5nL2Fub255bW91czwvd3NhOkFkZHJlc3M+DQotICAgICAgICAgICAgPHdzYTpSZWZlcmVuY2VQYXJhbWV0ZXJzPg0KLSAgICAgICAgICAgICAgICA8ZmFicmlrYW06Q3VzdG9tZXJLZXk+MTIzNDU2Nzg5PC9mYWJyaWthbTpDdXN0b21lcktleT4NCi0gICAgICAgICAgICAgICAgPGZhYnJpa2FtOlNob3BwaW5nQ2FydD5BQkNERUZHPC9mYWJyaWthbTpTaG9wcGluZ0NhcnQ+DQotICAgICAgICAgICAgPC93c2E6UmVmZXJlbmNlUGFyYW1ldGVycz4NCi0gICAgICAgICAgICA8d3NhOk1ldGFkYXRhPg0KLSAgICAgICAgICAgICAgICA8YXhpczI6TWV0YUV4dCBheGlzMjpBdHRyRXh0PSIxMjM0NTY3ODkiPjEyMzQ1Njc4OTwvYXhpczI6TWV0YUV4dD4NCi0gICAgICAgICAgICA8L3dzYTpNZXRhZGF0YT4NCi0gICAgICAgICAgICA8YXhpczI6RVBSRXh0IGF4aXMyOkF0dHJFeHQ9IjEyMzQ1Njc4OSI+MTIzNDU2Nzg5PC9heGlzMjpFUFJFeHQ+DQotICAgICAgICA8L3dzYTpGcm9tPg0KLSAgICAgICAgPHdzYTpBY3Rpb24gYXhpczI6QXR0ckV4dD0iMTIzNDU2Nzg5IiBzb2FwZW52OmFjdG9yPSJodHRwOi8vbXkvY3VzdG9tL3JvbGUiPmh0dHA6Ly93cy5hcGFjaGUub3JnL3Rlc3RzL2FjdGlvbjwvd3NhOkFjdGlvbj4NCi0gICAgICAgIDx3c2E6UmVwbHlUbyBheGlzMjpBdHRyRXh0PSIxMjM0NTY3ODkiIHNvYXBlbnY6YWN0b3I9Imh0dHA6Ly9teS9jdXN0b20vcm9sZSI+DQotICAgICAgICAgICAgPHdzYTpBZGRyZXNzPmh0dHA6Ly9leGFtcGxlLmNvbS9mYWJyaWthbS9hY2N0PC93c2E6QWRkcmVzcz4NCi0gICAgICAgICAgICA8d3NhOlJlZmVyZW5jZVBhcmFtZXRlcnM+DQotICAgICAgICAgICAgICAgIDxmYWJyaWthbTpDdXN0b21lcktleT4xMjM0NTY3ODk8L2ZhYnJpa2FtOkN1c3RvbWVyS2V5Pg0KLSAgICAgICAgICAgICAgICA8ZmFicmlrYW06U2hvcHBpbmdDYXJ0PkFCQ0RFRkc8L2ZhYnJpa2FtOlNob3BwaW5nQ2FydD4NCi0gICAgICAgICAgICA8L3dzYTpSZWZlcmVuY2VQYXJhbWV0ZXJzPg0KLSAgICAgICAgICAgIDx3c2E6TWV0YWRhdGE+DQotICAgICAgICAgICAgICAgIDxheGlzMjpNZXRhRXh0IGF4aXMyOkF0dHJFeHQ9IjEyMzQ1Njc4OSI+MTIzNDU2Nzg5PC9heGlzMjpNZXRhRXh0Pg0KLSAgICAgICAgICAgIDwvd3NhOk1ldGFkYXRhPg0KLSAgICAgICAgICAgIDxheGlzMjpFUFJFeHQgYXhpczI6QXR0ckV4dD0iMTIzNDU2Nzg5Ij4xMjM0NTY3ODk8L2F4aXMyOkVQUkV4dD4NCi0gICAgICAgIDwvd3NhOlJlcGx5VG8+DQotICAgICAgICA8d3NhOkZhdWx0VG8gYXhpczI6QXR0ckV4dD0iMTIzNDU2Nzg5IiBzb2FwZW52OmFjdG9yPSJodHRwOi8vbXkvY3VzdG9tL3JvbGUiPg0KLSAgICAgICAgICAgIDx3c2E6QWRkcmVzcz5odHRwOi8vZXhhbXBsZS5jb20vZmFicmlrYW0vZmF1bHQ8L3dzYTpBZGRyZXNzPg0KLSAgICAgICAgICAgIDx3c2E6UmVmZXJlbmNlUGFyYW1ldGVycz4NCi0gICAgICAgICAgICAgICAgPGZhYnJpa2FtOkN1c3RvbWVyS2V5PjEyMzQ1Njc4OTwvZmFicmlrYW06Q3VzdG9tZXJLZXk+DQotICAgICAgICAgICAgICAgIDxmYWJyaWthbTpTaG9wcGluZ0NhcnQ+QUJDREVGRzwvZmFicmlrYW06U2hvcHBpbmdDYXJ0Pg0KLSAgICAgICAgICAgIDwvd3NhOlJlZmVyZW5jZVBhcmFtZXRlcnM+DQotICAgICAgICAgICAgPHdzYTpNZXRhZGF0YT4NCi0gICAgICAgICAgICAgICAgPGF4aXMyOk1ldGFFeHQgYXhpczI6QXR0ckV4dD0iMTIzNDU2Nzg5Ij4xMjM0NTY3ODk8L2F4aXMyOk1ldGFFeHQ+DQotICAgICAgICAgICAgPC93c2E6TWV0YWRhdGE+DQotICAgICAgICAgICAgPGF4aXMyOkVQUkV4dCBheGlzMjpBdHRyRXh0PSIxMjM0NTY3ODkiPjEyMzQ1Njc4OTwvYXhpczI6RVBSRXh0Pg0KLSAgICAgICAgPC93c2E6RmF1bHRUbz4NCi0gICAgICAgIDx3c2E6UmVsYXRlc1RvIGF4aXMyOkF0dHJFeHQ9IjEyMzQ1Njc4OSIgc29hcGVudjphY3Rvcj0iaHR0cDovL215L2N1c3RvbS9yb2xlIj5odHRwOi8vc29tZS5wcmV2aW91cy5tZXNzYWdlPC93c2E6UmVsYXRlc1RvPg0KLSAgICAgICAgPHdzYTpSZWxhdGVzVG8gUmVsYXRpb25zaGlwVHlwZT0iaHR0cDovL3NvbWUuY3VzdG9tLnJlbGF0aW9uc2hpcCIgc29hcGVudjphY3Rvcj0iaHR0cDovL215L2N1c3RvbS9yb2xlIj5odHRwOi8vaWRlbnRpZmllci5vZi5vdGhlci5tZXNzYWdlLzwvd3NhOlJlbGF0ZXNUbz4NCi0gICAgPC9zb2FwZW52OkhlYWRlcj4NCi0gICAgPHNvYXBlbnY6Qm9keT4NCi0gICAgICAgIDxuczE6Z2V0QmFsYW5jZSBzb2FwZW52OmVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIg0KLSAgICAgICAgICAgICAgICB4bWxuczpuczE9Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MS9heGlzL3NlcnZpY2VzL0JhbmtQb3J0Ij4NCi0gICAgICAgICAgICA8YWNjb3VudE5vIGhyZWY9IiNpZDAiLz4NCi0gICAgICAgIDwvbnMxOmdldEJhbGFuY2U+DQotICAgICAgICA8bXVsdGlSZWYgaWQ9ImlkMCIgc29hcGVuYzpyb290PSIwIg0KLSAgICAgICAgICAgICAgICBzb2FwZW52OmVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIg0KLSAgICAgICAgICAgICAgICB4c2k6dHlwZT0ieHNkOmludCIgeG1sbnM6c29hcGVuYz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iPg0KLSAgICAgICAgICAgIDEwMDE8L211bHRpUmVmPg0KLSAgICA8L3NvYXBlbnY6Qm9keT4NCi08L3NvYXBlbnY6RW52ZWxvcGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRkcmVzc2luZy90ZXN0LXJlc291cmNlcy92YWxpZC1tZXNzYWdlcy9maW5hbC9zb2FwbWVzc2FnZS54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3QtcmVzb3VyY2VzL3ZhbGlkLW1lc3NhZ2VzL2ZpbmFsL3NvYXBtZXNzYWdlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRkNjE1YS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3QtcmVzb3VyY2VzL3ZhbGlkLW1lc3NhZ2VzL2ZpbmFsL3NvYXBtZXNzYWdlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHNvYXBlbnY6RW52ZWxvcGUgeG1sbnM6c29hcGVudj0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iCi0gICAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgIHhtbG5zOndzYT0iaHR0cDovL3d3dy53My5vcmcvMjAwNS8wOC9hZGRyZXNzaW5nIj4KLSAgICA8c29hcGVudjpIZWFkZXIgeG1sbnM6ZmFicmlrYW09Imh0dHA6Ly9leGFtcGxlLmNvbS9mYWJyaWthbSIgeG1sbnM6YXhpczI9Imh0dHA6Ly93cy5hcGFjaGUub3JnL25hbWVzcGFjZXMvYXhpczIiPgotICAgICAgICA8d3NhOk1lc3NhZ2VJRCBheGlzMjpBdHRyRXh0PSIxMjM0NTY3ODkiIHNvYXBlbnY6bXVzdFVuZGVyc3RhbmQ9IjAiPgotICAgICAgICAgICAgdXVpZDo5MjBDNTE5MC0wQjhGLTExRDktOENFRC1GMjJFREVFQkY3RTU8L3dzYTpNZXNzYWdlSUQ+Ci0gICAgICAgIDx3c2E6VG8gYXhpczI6QXR0ckV4dD0iMTIzNDU2Nzg5IiBzb2FwZW52Om11c3RVbmRlcnN0YW5kPSIwIj5odHRwOi8vbG9jYWxob3N0OjgwODEvYXhpcy9zZXJ2aWNlcy9CYW5rUG9ydDwvd3NhOlRvPgotICAgICAgICA8d3NhOkZyb20gc29hcGVudjptdXN0VW5kZXJzdGFuZD0iMCIgYXhpczI6QXR0ckV4dD0iMTIzNDU2Nzg5Ij4KLSAgICAgICAgICAgIDx3c2E6QWRkcmVzcz5odHRwOi8vd3d3LnczLm9yZy8yMDA1LzA4L2FkZHJlc3NpbmcvYW5vbnltb3VzPC93c2E6QWRkcmVzcz4KLSAgICAgICAgICAgIDx3c2E6UmVmZXJlbmNlUGFyYW1ldGVycz4KLSAgICAgICAgICAgICAgICA8ZmFicmlrYW06Q3VzdG9tZXJLZXk+MTIzNDU2Nzg5PC9mYWJyaWthbTpDdXN0b21lcktleT4KLSAgICAgICAgICAgICAgICA8ZmFicmlrYW06U2hvcHBpbmdDYXJ0PkFCQ0RFRkc8L2ZhYnJpa2FtOlNob3BwaW5nQ2FydD4KLSAgICAgICAgICAgIDwvd3NhOlJlZmVyZW5jZVBhcmFtZXRlcnM+Ci0gICAgICAgICAgICA8d3NhOk1ldGFkYXRhPgotICAgICAgICAgICAgICAgIDxheGlzMjpNZXRhRXh0IGF4aXMyOkF0dHJFeHQ9IjEyMzQ1Njc4OSI+MTIzNDU2Nzg5PC9heGlzMjpNZXRhRXh0PgotICAgICAgICAgICAgPC93c2E6TWV0YWRhdGE+Ci0gICAgICAgICAgICA8YXhpczI6RVBSRXh0IGF4aXMyOkF0dHJFeHQ9IjEyMzQ1Njc4OSI+MTIzNDU2Nzg5PC9heGlzMjpFUFJFeHQ+Ci0gICAgICAgIDwvd3NhOkZyb20+Ci0gICAgICAgIDxheGlzMjpQYXJhbU9uZSB3c2E6SXNSZWZlcmVuY2VQYXJhbWV0ZXI9J3RydWUnPjEyMzQ1Njc4OTwvYXhpczI6UGFyYW1PbmU+Ci0gICAgICAgIDxheGlzMjpQYXJhbVR3byB3c2E6SXNSZWZlcmVuY2VQYXJhbWV0ZXI9J3RydWUnPkFCQ0RFRkc8L2F4aXMyOlBhcmFtVHdvPgotICAgICAgICA8d3NhOkFjdGlvbiBheGlzMjpBdHRyRXh0PSIxMjM0NTY3ODkiPmh0dHA6Ly93cy5hcGFjaGUub3JnL3Rlc3RzL2FjdGlvbjwvd3NhOkFjdGlvbj4KLSAgICAgICAgPHdzYTpSZXBseVRvIGF4aXMyOkF0dHJFeHQ9IjEyMzQ1Njc4OSI+Ci0gICAgICAgICAgICA8d3NhOkFkZHJlc3M+aHR0cDovL2V4YW1wbGUuY29tL2ZhYnJpa2FtL2FjY3Q8L3dzYTpBZGRyZXNzPgotICAgICAgICAgICAgPHdzYTpSZWZlcmVuY2VQYXJhbWV0ZXJzPgotICAgICAgICAgICAgICAgIDxmYWJyaWthbTpDdXN0b21lcktleT4xMjM0NTY3ODk8L2ZhYnJpa2FtOkN1c3RvbWVyS2V5PgotICAgICAgICAgICAgICAgIDxmYWJyaWthbTpTaG9wcGluZ0NhcnQ+QUJDREVGRzwvZmFicmlrYW06U2hvcHBpbmdDYXJ0PgotICAgICAgICAgICAgPC93c2E6UmVmZXJlbmNlUGFyYW1ldGVycz4KLSAgICAgICAgICAgIDx3c2E6TWV0YWRhdGE+Ci0gICAgICAgICAgICAgICAgPGF4aXMyOk1ldGFFeHQgYXhpczI6QXR0ckV4dD0iMTIzNDU2Nzg5Ij4xMjM0NTY3ODk8L2F4aXMyOk1ldGFFeHQ+Ci0gICAgICAgICAgICA8L3dzYTpNZXRhZGF0YT4KLSAgICAgICAgICAgIDxheGlzMjpFUFJFeHQgYXhpczI6QXR0ckV4dD0iMTIzNDU2Nzg5Ij4xMjM0NTY3ODk8L2F4aXMyOkVQUkV4dD4KLSAgICAgICAgPC93c2E6UmVwbHlUbz4KLSAgICAgICAgPHdzYTpGYXVsdFRvIGF4aXMyOkF0dHJFeHQ9IjEyMzQ1Njc4OSI+Ci0gICAgICAgICAgICA8d3NhOkFkZHJlc3M+aHR0cDovL2V4YW1wbGUuY29tL2ZhYnJpa2FtL2ZhdWx0PC93c2E6QWRkcmVzcz4KLSAgICAgICAgICAgIDx3c2E6UmVmZXJlbmNlUGFyYW1ldGVycz4KLSAgICAgICAgICAgICAgICA8ZmFicmlrYW06Q3VzdG9tZXJLZXk+MTIzNDU2Nzg5PC9mYWJyaWthbTpDdXN0b21lcktleT4KLSAgICAgICAgICAgICAgICA8ZmFicmlrYW06U2hvcHBpbmdDYXJ0PkFCQ0RFRkc8L2ZhYnJpa2FtOlNob3BwaW5nQ2FydD4KLSAgICAgICAgICAgIDwvd3NhOlJlZmVyZW5jZVBhcmFtZXRlcnM+Ci0gICAgICAgICAgICA8d3NhOk1ldGFkYXRhPgotICAgICAgICAgICAgICAgIDxheGlzMjpNZXRhRXh0IGF4aXMyOkF0dHJFeHQ9IjEyMzQ1Njc4OSI+MTIzNDU2Nzg5PC9heGlzMjpNZXRhRXh0PgotICAgICAgICAgICAgPC93c2E6TWV0YWRhdGE+Ci0gICAgICAgICAgICA8YXhpczI6RVBSRXh0IGF4aXMyOkF0dHJFeHQ9IjEyMzQ1Njc4OSI+MTIzNDU2Nzg5PC9heGlzMjpFUFJFeHQ+Ci0gICAgICAgIDwvd3NhOkZhdWx0VG8+Ci0gICAgICAgIDx3c2E6UmVsYXRlc1RvIGF4aXMyOkF0dHJFeHQ9IjEyMzQ1Njc4OSI+aHR0cDovL3NvbWUucHJldmlvdXMubWVzc2FnZTwvd3NhOlJlbGF0ZXNUbz4KLSAgICAgICAgPHdzYTpSZWxhdGVzVG8gUmVsYXRpb25zaGlwVHlwZT0iaHR0cDovL3NvbWUuY3VzdG9tLnJlbGF0aW9uc2hpcCI+aHR0cDovL2lkZW50aWZpZXIub2Yub3RoZXIubWVzc2FnZS88L3dzYTpSZWxhdGVzVG8+Ci0gICAgPC9zb2FwZW52OkhlYWRlcj4KLSAgICA8c29hcGVudjpCb2R5PgotICAgICAgICA8bnMxOmdldEJhbGFuY2Ugc29hcGVudjplbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIKLSAgICAgICAgICAgICAgICB4bWxuczpuczE9Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MS9heGlzL3NlcnZpY2VzL0JhbmtQb3J0Ij4KLSAgICAgICAgICAgIDxhY2NvdW50Tm8gaHJlZj0iI2lkMCIvPgotICAgICAgICA8L25zMTpnZXRCYWxhbmNlPgotICAgICAgICA8bXVsdGlSZWYgaWQ9ImlkMCIgc29hcGVuYzpyb290PSIwIgotICAgICAgICAgICAgICAgIHNvYXBlbnY6ZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iCi0gICAgICAgICAgICAgICAgeHNpOnR5cGU9InhzZDppbnQiIHhtbG5zOnNvYXBlbmM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIj4KLSAgICAgICAgICAgIDEwMDE8L211bHRpUmVmPgotICAgIDwvc29hcGVudjpCb2R5PgotPC9zb2FwZW52OkVudmVsb3BlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkZHJlc3NpbmcvdGVzdC1yZXNvdXJjZXMvdmFsaWQtbWVzc2FnZXMvc3VibWlzc2lvbi9zb2FwbWVzc2FnZS5jdXN0b21yb2xlLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkZHJlc3NpbmcvdGVzdC1yZXNvdXJjZXMvdmFsaWQtbWVzc2FnZXMvc3VibWlzc2lvbi9zb2FwbWVzc2FnZS5jdXN0b21yb2xlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODc1Zjc0Ny4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3QtcmVzb3VyY2VzL3ZhbGlkLW1lc3NhZ2VzL3N1Ym1pc3Npb24vc29hcG1lc3NhZ2UuY3VzdG9tcm9sZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08c29hcGVudjpFbnZlbG9wZSB4bWxuczpzb2FwZW52PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyINCi0gICAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiDQotICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSAgICAgICAgeG1sbnM6d3NhPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA4L2FkZHJlc3NpbmciDQotICAgICAgICB4bWxuczpheGlzMj0iaHR0cDovL3dzLmFwYWNoZS5vcmcvbmFtZXNwYWNlcy9heGlzMiI+DQotICAgIDxzb2FwZW52OkhlYWRlciB4bWxuczpmYWJyaWthbT0iaHR0cDovL2V4YW1wbGUuY29tL2ZhYnJpa2FtIj4NCi0gICAgICAgIDx3c2E6TWVzc2FnZUlEPmludmFsaWQtbm90aW5yb2xlPC93c2E6TWVzc2FnZUlEPg0KLSAgICAgICAgPHdzYTpUbz5zb2FwZW52Om11c3RVbmRlcnN0YW5kPSIwIj5pbnZhbGlkLW5vdGlucm9sZTwvd3NhOlRvPg0KLSAgICAgICAgPHdzYTpGcm9tPg0KLSAgICAgICAgICAgIDx3c2E6QWRkcmVzcz5pbnZhbGlkLW5vdGlucm9sZTwvd3NhOkFkZHJlc3M+DQotICAgICAgICA8L3dzYTpGcm9tPg0KLSAgICAgICAgPHdzYTpBY3Rpb24+aW52YWxpZC1ub3RpbnJvbGU8L3dzYTpBY3Rpb24+DQotICAgICAgICA8d3NhOlJlcGx5VG8+DQotICAgICAgICAgICAgPHdzYTpBZGRyZXNzPmludmFsaWQtbm90aW5yb2xlPC93c2E6QWRkcmVzcz4NCi0gICAgICAgIDwvd3NhOlJlcGx5VG8+DQotICAgICAgICA8d3NhOkZhdWx0VG8+DQotICAgICAgICAgICAgPHdzYTpBZGRyZXNzPmludmFsaWQtbm90aW5yb2xlPC93c2E6QWRkcmVzcz4NCi0gICAgICAgIDwvd3NhOkZhdWx0VG8+DQotICAgICAgICA8d3NhOlJlbGF0ZXNUbz5pbnZhbGlkLW5vdGlucm9sZTwvd3NhOlJlbGF0ZXNUbz4NCi0gICAgICAgIDx3c2E6UmVsYXRlc1RvIFJlbGF0aW9uc2hpcFR5cGU9Imh0dHA6Ly9zb21lLmN1c3RvbS5yZWxhdGlvbnNoaXAiPmludmFsaWQtbm90aW5yb2xlPC93c2E6UmVsYXRlc1RvPg0KLSAgICANCi0gICAgICAgIDx3c2E6TWVzc2FnZUlEIGF4aXMyOkF0dHJFeHQ9IjEyMzQ1Njc4OSIgc29hcGVudjptdXN0VW5kZXJzdGFuZD0iMCIgc29hcGVudjphY3Rvcj0iaHR0cDovL215L2N1c3RvbS9yb2xlIj4NCi0gICAgICAgICAgICB1dWlkOjkyMEM1MTkwLTBCOEYtMTFEOS04Q0VELUYyMkVERUVCRjdFNTwvd3NhOk1lc3NhZ2VJRD4NCi0gICAgICAgIDx3c2E6VG8gYXhpczI6QXR0ckV4dD0iMTIzNDU2Nzg5IiBzb2FwZW52Om11c3RVbmRlcnN0YW5kPSIwIiBzb2FwZW52OmFjdG9yPSJodHRwOi8vbXkvY3VzdG9tL3JvbGUiPmh0dHA6Ly9sb2NhbGhvc3Q6ODA4MS9heGlzL3NlcnZpY2VzL0JhbmtQb3J0PC93c2E6VG8+DQotICAgICAgICA8d3NhOkZyb20gYXhpczI6QXR0ckV4dD0iMTIzNDU2Nzg5IiBzb2FwZW52Om11c3RVbmRlcnN0YW5kPSIwIiBzb2FwZW52OmFjdG9yPSJodHRwOi8vbXkvY3VzdG9tL3JvbGUiPg0KLSAgICAgICAgICAgIDx3c2E6QWRkcmVzcz4NCi0gICAgICAgICAgICAgICAgaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOC9hZGRyZXNzaW5nL3JvbGUvYW5vbnltb3VzPC93c2E6QWRkcmVzcz4NCi0gICAgICAgICAgICA8d3NhOlJlZmVyZW5jZVBhcmFtZXRlcnM+DQotICAgICAgICAgICAgICAgIDxmYWJyaWthbTpDdXN0b21lcktleT4xMjM0NTY3ODk8L2ZhYnJpa2FtOkN1c3RvbWVyS2V5Pg0KLSAgICAgICAgICAgIDwvd3NhOlJlZmVyZW5jZVBhcmFtZXRlcnM+DQotICAgICAgICAgICAgPHdzYTpSZWZlcmVuY2VQcm9wZXJ0aWVzPg0KLSAgICAgICAgICAgICAgICA8ZmFicmlrYW06U2hvcHBpbmdDYXJ0PkFCQ0RFRkc8L2ZhYnJpa2FtOlNob3BwaW5nQ2FydD4NCi0gICAgICAgICAgICA8L3dzYTpSZWZlcmVuY2VQcm9wZXJ0aWVzPg0KLSAgICAgICAgICAgIDxheGlzMjpFUFJFeHQgYXhpczI6QXR0ckV4dD0iMTIzNDU2Nzg5Ij4xMjM0NTY3ODk8L2F4aXMyOkVQUkV4dD4NCi0gICAgICAgIDwvd3NhOkZyb20+DQotICAgICAgICA8d3NhOkFjdGlvbiBheGlzMjpBdHRyRXh0PSIxMjM0NTY3ODkiIHNvYXBlbnY6YWN0b3I9Imh0dHA6Ly9teS9jdXN0b20vcm9sZSI+aHR0cDovL3dzLmFwYWNoZS5vcmcvdGVzdHMvYWN0aW9uPC93c2E6QWN0aW9uPg0KLSAgICAgICAgPHdzYTpSZXBseVRvIGF4aXMyOkF0dHJFeHQ9IjEyMzQ1Njc4OSIgc29hcGVudjphY3Rvcj0iaHR0cDovL215L2N1c3RvbS9yb2xlIj4NCi0gICAgICAgICAgICA8d3NhOkFkZHJlc3M+aHR0cDovL2V4YW1wbGUuY29tL2ZhYnJpa2FtL2FjY3Q8L3dzYTpBZGRyZXNzPg0KLSAgICAgICAgICAgIDx3c2E6UmVmZXJlbmNlUGFyYW1ldGVycz4NCi0gICAgICAgICAgICAgICAgPGZhYnJpa2FtOkN1c3RvbWVyS2V5PjEyMzQ1Njc4OTwvZmFicmlrYW06Q3VzdG9tZXJLZXk+DQotICAgICAgICAgICAgPC93c2E6UmVmZXJlbmNlUGFyYW1ldGVycz4NCi0gICAgICAgICAgICA8d3NhOlJlZmVyZW5jZVByb3BlcnRpZXM+DQotICAgICAgICAgICAgICAgIDxmYWJyaWthbTpTaG9wcGluZ0NhcnQ+QUJDREVGRzwvZmFicmlrYW06U2hvcHBpbmdDYXJ0Pg0KLSAgICAgICAgICAgIDwvd3NhOlJlZmVyZW5jZVByb3BlcnRpZXM+DQotICAgICAgICAgICAgPGF4aXMyOkVQUkV4dCBheGlzMjpBdHRyRXh0PSIxMjM0NTY3ODkiPjEyMzQ1Njc4OTwvYXhpczI6RVBSRXh0Pg0KLSAgICAgICAgPC93c2E6UmVwbHlUbz4NCi0NCi0gICAgICAgIDx3c2E6RmF1bHRUbyBheGlzMjpBdHRyRXh0PSIxMjM0NTY3ODkiIHNvYXBlbnY6YWN0b3I9Imh0dHA6Ly9teS9jdXN0b20vcm9sZSI+DQotICAgICAgICAgICAgPHdzYTpBZGRyZXNzPmh0dHA6Ly9leGFtcGxlLmNvbS9mYWJyaWthbS9mYXVsdDwvd3NhOkFkZHJlc3M+DQotICAgICAgICAgICAgPHdzYTpSZWZlcmVuY2VQYXJhbWV0ZXJzPg0KLSAgICAgICAgICAgICAgICA8ZmFicmlrYW06Q3VzdG9tZXJLZXk+MTIzNDU2Nzg5PC9mYWJyaWthbTpDdXN0b21lcktleT4NCi0gICAgICAgICAgICA8L3dzYTpSZWZlcmVuY2VQYXJhbWV0ZXJzPg0KLSAgICAgICAgICAgIDx3c2E6UmVmZXJlbmNlUHJvcGVydGllcz4NCi0gICAgICAgICAgICAgICAgPGZhYnJpa2FtOlNob3BwaW5nQ2FydD5BQkNERUZHPC9mYWJyaWthbTpTaG9wcGluZ0NhcnQ+DQotICAgICAgICAgICAgPC93c2E6UmVmZXJlbmNlUHJvcGVydGllcz4NCi0gICAgICAgICAgICA8YXhpczI6RVBSRXh0IGF4aXMyOkF0dHJFeHQ9IjEyMzQ1Njc4OSI+MTIzNDU2Nzg5PC9heGlzMjpFUFJFeHQ+DQotICAgICAgICA8L3dzYTpGYXVsdFRvPg0KLSAgICAgICAgPHdzYTpSZWxhdGVzVG8gYXhpczI6QXR0ckV4dD0iMTIzNDU2Nzg5IiBzb2FwZW52OmFjdG9yPSJodHRwOi8vbXkvY3VzdG9tL3JvbGUiPmh0dHA6Ly9zb21lLnByZXZpb3VzLm1lc3NhZ2U8L3dzYTpSZWxhdGVzVG8+DQotICAgICAgICA8d3NhOlJlbGF0ZXNUbyBSZWxhdGlvbnNoaXBUeXBlPSJheGlzMjpzb21lLmN1c3RvbS5yZWxhdGlvbnNoaXAiIHNvYXBlbnY6YWN0b3I9Imh0dHA6Ly9teS9jdXN0b20vcm9sZSI+aHR0cDovL2lkZW50aWZpZXIub2Yub3RoZXIubWVzc2FnZS88L3dzYTpSZWxhdGVzVG8+DQotDQotICAgIDwvc29hcGVudjpIZWFkZXI+DQotICAgIDxzb2FwZW52OkJvZHk+DQotICAgICAgICA8bnMxOmdldEJhbGFuY2Ugc29hcGVudjplbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyINCi0gICAgICAgICAgICAgICAgeG1sbnM6bnMxPSJodHRwOi8vbG9jYWxob3N0OjgwODEvYXhpcy9zZXJ2aWNlcy9CYW5rUG9ydCI+DQotICAgICAgICAgICAgPGFjY291bnRObyBocmVmPSIjaWQwIi8+DQotICAgICAgICA8L25zMTpnZXRCYWxhbmNlPg0KLSAgICAgICAgPG11bHRpUmVmIGlkPSJpZDAiIHNvYXBlbmM6cm9vdD0iMCINCi0gICAgICAgICAgICAgICAgc29hcGVudjplbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyINCi0gICAgICAgICAgICAgICAgeHNpOnR5cGU9InhzZDppbnQiIHhtbG5zOnNvYXBlbmM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIj4NCi0gICAgICAgICAgICAxMDAxPC9tdWx0aVJlZj4NCi0gICAgPC9zb2FwZW52OkJvZHk+DQotPC9zb2FwZW52OkVudmVsb3BlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkZHJlc3NpbmcvdGVzdC1yZXNvdXJjZXMvdmFsaWQtbWVzc2FnZXMvc3VibWlzc2lvbi9zb2FwbWVzc2FnZS54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3QtcmVzb3VyY2VzL3ZhbGlkLW1lc3NhZ2VzL3N1Ym1pc3Npb24vc29hcG1lc3NhZ2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTE2NGNjLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkZHJlc3NpbmcvdGVzdC1yZXNvdXJjZXMvdmFsaWQtbWVzc2FnZXMvc3VibWlzc2lvbi9zb2FwbWVzc2FnZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzb2FwZW52OkVudmVsb3BlIHhtbG5zOnNvYXBlbnY9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIgotICAgICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICAgICB4bWxuczp3c2E9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDgvYWRkcmVzc2luZyIKLSAgICAgICAgeG1sbnM6YXhpczI9Imh0dHA6Ly93cy5hcGFjaGUub3JnL25hbWVzcGFjZXMvYXhpczIiPgotICAgIDxzb2FwZW52OkhlYWRlciB4bWxuczpmYWJyaWthbT0iaHR0cDovL2V4YW1wbGUuY29tL2ZhYnJpa2FtIj4KLSAgICAgICAgPHdzYTpNZXNzYWdlSUQgYXhpczI6QXR0ckV4dD0iMTIzNDU2Nzg5IiBzb2FwZW52Om11c3RVbmRlcnN0YW5kPSIwIj4KLSAgICAgICAgICAgIHV1aWQ6OTIwQzUxOTAtMEI4Ri0xMUQ5LThDRUQtRjIyRURFRUJGN0U1PC93c2E6TWVzc2FnZUlEPgotICAgICAgICA8d3NhOlRvIGF4aXMyOkF0dHJFeHQ9IjEyMzQ1Njc4OSIgc29hcGVudjptdXN0VW5kZXJzdGFuZD0iMCI+aHR0cDovL2xvY2FsaG9zdDo4MDgxL2F4aXMvc2VydmljZXMvQmFua1BvcnQ8L3dzYTpUbz4KLSAgICAgICAgPHdzYTpGcm9tIGF4aXMyOkF0dHJFeHQ9IjEyMzQ1Njc4OSIgc29hcGVudjptdXN0VW5kZXJzdGFuZD0iMCI+Ci0gICAgICAgICAgICA8d3NhOkFkZHJlc3M+Ci0gICAgICAgICAgICAgICAgaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOC9hZGRyZXNzaW5nL3JvbGUvYW5vbnltb3VzPC93c2E6QWRkcmVzcz4KLSAgICAgICAgICAgIDx3c2E6UmVmZXJlbmNlUGFyYW1ldGVycz4KLSAgICAgICAgICAgICAgICA8ZmFicmlrYW06Q3VzdG9tZXJLZXk+MTIzNDU2Nzg5PC9mYWJyaWthbTpDdXN0b21lcktleT4KLSAgICAgICAgICAgIDwvd3NhOlJlZmVyZW5jZVBhcmFtZXRlcnM+Ci0gICAgICAgICAgICA8d3NhOlJlZmVyZW5jZVByb3BlcnRpZXM+Ci0gICAgICAgICAgICAgICAgPGZhYnJpa2FtOlNob3BwaW5nQ2FydD5BQkNERUZHPC9mYWJyaWthbTpTaG9wcGluZ0NhcnQ+Ci0gICAgICAgICAgICA8L3dzYTpSZWZlcmVuY2VQcm9wZXJ0aWVzPgotICAgICAgICAgICAgPGF4aXMyOkVQUkV4dCBheGlzMjpBdHRyRXh0PSIxMjM0NTY3ODkiPjEyMzQ1Njc4OTwvYXhpczI6RVBSRXh0PgotICAgICAgICA8L3dzYTpGcm9tPgotICAgICAgICA8d3NhOkFjdGlvbiBheGlzMjpBdHRyRXh0PSIxMjM0NTY3ODkiPmh0dHA6Ly93cy5hcGFjaGUub3JnL3Rlc3RzL2FjdGlvbjwvd3NhOkFjdGlvbj4KLSAgICAgICAgPHdzYTpSZXBseVRvIGF4aXMyOkF0dHJFeHQ9IjEyMzQ1Njc4OSI+Ci0gICAgICAgICAgICA8d3NhOkFkZHJlc3M+aHR0cDovL2V4YW1wbGUuY29tL2ZhYnJpa2FtL2FjY3Q8L3dzYTpBZGRyZXNzPgotICAgICAgICAgICAgPHdzYTpSZWZlcmVuY2VQYXJhbWV0ZXJzPgotICAgICAgICAgICAgICAgIDxmYWJyaWthbTpDdXN0b21lcktleT4xMjM0NTY3ODk8L2ZhYnJpa2FtOkN1c3RvbWVyS2V5PgotICAgICAgICAgICAgPC93c2E6UmVmZXJlbmNlUGFyYW1ldGVycz4KLSAgICAgICAgICAgIDx3c2E6UmVmZXJlbmNlUHJvcGVydGllcz4KLSAgICAgICAgICAgICAgICA8ZmFicmlrYW06U2hvcHBpbmdDYXJ0PkFCQ0RFRkc8L2ZhYnJpa2FtOlNob3BwaW5nQ2FydD4KLSAgICAgICAgICAgIDwvd3NhOlJlZmVyZW5jZVByb3BlcnRpZXM+Ci0gICAgICAgICAgICA8YXhpczI6RVBSRXh0IGF4aXMyOkF0dHJFeHQ9IjEyMzQ1Njc4OSI+MTIzNDU2Nzg5PC9heGlzMjpFUFJFeHQ+Ci0gICAgICAgIDwvd3NhOlJlcGx5VG8+Ci0KLSAgICAgICAgPHdzYTpGYXVsdFRvIGF4aXMyOkF0dHJFeHQ9IjEyMzQ1Njc4OSI+Ci0gICAgICAgICAgICA8d3NhOkFkZHJlc3M+aHR0cDovL2V4YW1wbGUuY29tL2ZhYnJpa2FtL2ZhdWx0PC93c2E6QWRkcmVzcz4KLSAgICAgICAgICAgIDx3c2E6UmVmZXJlbmNlUGFyYW1ldGVycz4KLSAgICAgICAgICAgICAgICA8ZmFicmlrYW06Q3VzdG9tZXJLZXk+MTIzNDU2Nzg5PC9mYWJyaWthbTpDdXN0b21lcktleT4KLSAgICAgICAgICAgIDwvd3NhOlJlZmVyZW5jZVBhcmFtZXRlcnM+Ci0gICAgICAgICAgICA8d3NhOlJlZmVyZW5jZVByb3BlcnRpZXM+Ci0gICAgICAgICAgICAgICAgPGZhYnJpa2FtOlNob3BwaW5nQ2FydD5BQkNERUZHPC9mYWJyaWthbTpTaG9wcGluZ0NhcnQ+Ci0gICAgICAgICAgICA8L3dzYTpSZWZlcmVuY2VQcm9wZXJ0aWVzPgotICAgICAgICAgICAgPGF4aXMyOkVQUkV4dCBheGlzMjpBdHRyRXh0PSIxMjM0NTY3ODkiPjEyMzQ1Njc4OTwvYXhpczI6RVBSRXh0PgotICAgICAgICA8L3dzYTpGYXVsdFRvPgotICAgICAgICA8d3NhOlJlbGF0ZXNUbyBheGlzMjpBdHRyRXh0PSIxMjM0NTY3ODkiPmh0dHA6Ly9zb21lLnByZXZpb3VzLm1lc3NhZ2U8L3dzYTpSZWxhdGVzVG8+Ci0gICAgICAgIDx3c2E6UmVsYXRlc1RvIFJlbGF0aW9uc2hpcFR5cGU9ImF4aXMyOnNvbWUuY3VzdG9tLnJlbGF0aW9uc2hpcCI+aHR0cDovL2lkZW50aWZpZXIub2Yub3RoZXIubWVzc2FnZS88L3dzYTpSZWxhdGVzVG8+Ci0KLSAgICA8L3NvYXBlbnY6SGVhZGVyPgotICAgIDxzb2FwZW52OkJvZHk+Ci0gICAgICAgIDxuczE6Z2V0QmFsYW5jZSBzb2FwZW52OmVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIgotICAgICAgICAgICAgICAgIHhtbG5zOm5zMT0iaHR0cDovL2xvY2FsaG9zdDo4MDgxL2F4aXMvc2VydmljZXMvQmFua1BvcnQiPgotICAgICAgICAgICAgPGFjY291bnRObyBocmVmPSIjaWQwIi8+Ci0gICAgICAgIDwvbnMxOmdldEJhbGFuY2U+Ci0gICAgICAgIDxtdWx0aVJlZiBpZD0iaWQwIiBzb2FwZW5jOnJvb3Q9IjAiCi0gICAgICAgICAgICAgICAgc29hcGVudjplbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIKLSAgICAgICAgICAgICAgICB4c2k6dHlwZT0ieHNkOmludCIgeG1sbnM6c29hcGVuYz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iPgotICAgICAgICAgICAgMTAwMTwvbXVsdGlSZWY+Ci0gICAgPC9zb2FwZW52OkJvZHk+Ci08L3NvYXBlbnY6RW52ZWxvcGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRkcmVzc2luZy90ZXN0L29yZy9hcGFjaGUvYXhpczIvaGFuZGxlcnMvYWRkcmVzc2luZy9BZGRyZXNzaW5nRmluYWxJbkhhbmRsZXJUZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9oYW5kbGVycy9hZGRyZXNzaW5nL0FkZHJlc3NpbmdGaW5hbEluSGFuZGxlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRhODE0My4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9oYW5kbGVycy9hZGRyZXNzaW5nL0FkZHJlc3NpbmdGaW5hbEluSGFuZGxlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuaGFuZGxlcnMuYWRkcmVzc2luZzsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5Sb2xlUGxheWVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5BZGRyZXNzaW5nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5PcHRpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLXB1YmxpYyBjbGFzcyBBZGRyZXNzaW5nRmluYWxJbkhhbmRsZXJUZXN0IGV4dGVuZHMgQWRkcmVzc2luZ0luSGFuZGxlclRlc3RCYXNlIHsKLQotICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhBZGRyZXNzaW5nRmluYWxJbkhhbmRsZXJUZXN0LmNsYXNzKTsKLQotICAgIC8qKiBAcGFyYW0gdGVzdE5hbWUgICovCi0gICAgcHVibGljIEFkZHJlc3NpbmdGaW5hbEluSGFuZGxlclRlc3QoU3RyaW5nIHRlc3ROYW1lKSB7Ci0gICAgICAgIHN1cGVyKHRlc3ROYW1lKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgICAgICBpbkhhbmRsZXIgPSBuZXcgQWRkcmVzc2luZ0luSGFuZGxlcigpOwotICAgICAgICBhZGRyZXNzaW5nTmFtZXNwYWNlID0gQWRkcmVzc2luZ0NvbnN0YW50cy5GaW5hbC5XU0FfTkFNRVNQQUNFOwotICAgICAgICB2ZXJzaW9uRGlyZWN0b3J5ID0gImZpbmFsIjsKLSAgICAgICAgZnJvbUFkZHJlc3MgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwNS8wOC9hZGRyZXNzaW5nL2Fub255bW91cyI7Ci0gICAgICAgIHNlY29uZFJlbGF0aW9uc2hpcFR5cGUgPSAiaHR0cDovL3NvbWUuY3VzdG9tLnJlbGF0aW9uc2hpcCI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEV4dHJhY3RBZGRyZXNzaW5nSW5mb3JtYXRpb25Gcm9tSGVhZGVycygpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9wdGlvbnMgb3B0aW9ucyA9IGV4dHJhY3RBZGRyZXNzaW5nSW5mb3JtYXRpb25Gcm9tSGVhZGVycyhudWxsKTsKLQotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChvcHRpb25zKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwob3B0aW9ucy5nZXRUbygpKTsKLQotICAgICAgICAgICAgTWFwIGFsbFJlZmVyZW5jZVBhcmFtZXRlcnMgPSBvcHRpb25zLmdldFRvKCkuZ2V0QWxsUmVmZXJlbmNlUGFyYW1ldGVycygpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChhbGxSZWZlcmVuY2VQYXJhbWV0ZXJzKTsKLSAgICAgICAgICAgIFFOYW1lIHFOYW1lID0gbmV3IFFOYW1lKCJodHRwOi8vd3MuYXBhY2hlLm9yZy9uYW1lc3BhY2VzL2F4aXMyIiwgIlBhcmFtT25lIiwgImF4aXMyIik7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGFsbFJlZmVyZW5jZVBhcmFtZXRlcnMuZ2V0KHFOYW1lKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydEVQUkhhc0NvcnJlY3RNZXRhZGF0YShvcHRpb25zLmdldEZyb20oKSk7Ci0gICAgICAgICAgICBhc3NlcnRFUFJIYXNDb3JyZWN0TWV0YWRhdGEob3B0aW9ucy5nZXRGYXVsdFRvKCkpOwotICAgICAgICAgICAgYXNzZXJ0RVBSSGFzQ29ycmVjdE1ldGFkYXRhKG9wdGlvbnMuZ2V0UmVwbHlUbygpKTsKLQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIGxvZy5lcnJvcihlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICBmYWlsKCIgQW4gRXhjZXB0aW9uIGhhcyBvY2N1cmVkICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXh0cmFjdEFkZHJlc3NpbmdJbmZvcm1hdGlvbkZyb21IZWFkZXJzQ3VzdG9tUm9sZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0ZXN0RmlsZU5hbWUgPSAic29hcG1lc3NhZ2UuY3VzdG9tcm9sZS54bWwiOwotICAgICAgICBPcHRpb25zIG9wdGlvbnMgPSBleHRyYWN0QWRkcmVzc2luZ0luZm9ybWF0aW9uRnJvbUhlYWRlcnMobmV3IFJvbGVQbGF5ZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgTGlzdCBnZXRSb2xlcygpIHsKLSAgICAgICAgICAgICAgICBBcnJheUxpc3QgYWwgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgYWwuYWRkKCJodHRwOi8vbXkvY3VzdG9tL3JvbGUiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gYWw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzVWx0aW1hdGVEZXN0aW5hdGlvbigpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIGFzc2VydE5vdE51bGwob3B0aW9ucyk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwob3B0aW9ucy5nZXRUbygpKTsKLSAgICAgICAgYXNzZXJ0RVBSSGFzQ29ycmVjdE1ldGFkYXRhKG9wdGlvbnMuZ2V0RnJvbSgpKTsKLSAgICAgICAgYXNzZXJ0RVBSSGFzQ29ycmVjdE1ldGFkYXRhKG9wdGlvbnMuZ2V0RmF1bHRUbygpKTsKLSAgICAgICAgYXNzZXJ0RVBSSGFzQ29ycmVjdE1ldGFkYXRhKG9wdGlvbnMuZ2V0UmVwbHlUbygpKTsKLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFeHRyYWN0QWRkcmVzc2luZ0luZm9ybWF0aW9uRnJvbUhlYWRlcnNDdXN0b21Sb2xlU09BUDEyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRlc3RGaWxlTmFtZSA9ICJzb2FwbWVzc2FnZS5jdXN0b21yb2xlLnNvYXAxMi54bWwiOwotICAgICAgICBPcHRpb25zIG9wdGlvbnMgPSBleHRyYWN0QWRkcmVzc2luZ0luZm9ybWF0aW9uRnJvbUhlYWRlcnMobmV3IFJvbGVQbGF5ZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgTGlzdCBnZXRSb2xlcygpIHsKLSAgICAgICAgICAgICAgICBBcnJheUxpc3QgYWwgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgYWwuYWRkKCJodHRwOi8vbXkvY3VzdG9tL3JvbGUiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gYWw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzVWx0aW1hdGVEZXN0aW5hdGlvbigpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIGFzc2VydE5vdE51bGwob3B0aW9ucyk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwob3B0aW9ucy5nZXRUbygpKTsKLSAgICAgICAgYXNzZXJ0RVBSSGFzQ29ycmVjdE1ldGFkYXRhKG9wdGlvbnMuZ2V0RnJvbSgpKTsKLSAgICAgICAgYXNzZXJ0RVBSSGFzQ29ycmVjdE1ldGFkYXRhKG9wdGlvbnMuZ2V0RmF1bHRUbygpKTsKLSAgICAgICAgYXNzZXJ0RVBSSGFzQ29ycmVjdE1ldGFkYXRhKG9wdGlvbnMuZ2V0UmVwbHlUbygpKTsKLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNZXNzYWdlV2l0aE9taXR0ZWRBY3Rpb24oKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB0ZXN0TWVzc2FnZVdpdGhPbWl0dGVkSGVhZGVycygibm9BY3Rpb24iKTsKLSAgICAgICAgICAgIGZhaWwoIkFuIEF4aXNGYXVsdCBzaG91bGQgaGF2ZSBiZWVuIHRocm93biBkdWUgdG8gYSBtaXNzaW5nIEFjdGlvbiBoZWFkZXIuIik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEF4aXNGYXVsdCBhZikgewotICAgICAgICAgICAgLy90ZXN0IHBhc3NlZAotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIGxvZy5lcnJvcihlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICBmYWlsKCIgQW4gRXhjZXB0aW9uIGhhcyBvY2N1cmVkICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWVzc2FnZVdpdGhPbWl0dGVkRmF1bHRUbygpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9wdGlvbnMgb3B0aW9ucyA9IHRlc3RNZXNzYWdlV2l0aE9taXR0ZWRIZWFkZXJzKCJub0ZhdWx0VG8iKTsKLSAgICAgICAgICAgIEVuZHBvaW50UmVmZXJlbmNlIGVwciA9IG9wdGlvbnMuZ2V0RmF1bHRUbygpOwotCi0gICAgICAgICAgICBhc3NlcnROdWxsKCJUaGUgRmF1bHRUbyBlbmRwb2ludCByZWZlcmVuY2UgaXMgbm90IG51bGwuIiwgZXByKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoQXhpc0ZhdWx0IGFmKSB7Ci0gICAgICAgICAgICBhZi5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIGxvZy5lcnJvcihhZi5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgZmFpbCgiQW4gdW5leHBlY3RlZCBBeGlzRmF1bHQgd2FzIHRocm93biBkdWUgdG8gYSBtaXNzaW5nIEZhdWx0VG8gaGVhZGVyLiIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIGxvZy5lcnJvcihlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICBmYWlsKCIgQW4gRXhjZXB0aW9uIGhhcyBvY2N1cmVkICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWVzc2FnZVdpdGhPbWl0dGVkRnJvbSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9wdGlvbnMgb3B0aW9ucyA9IHRlc3RNZXNzYWdlV2l0aE9taXR0ZWRIZWFkZXJzKCJub0Zyb20iKTsKLSAgICAgICAgICAgIEVuZHBvaW50UmVmZXJlbmNlIGVwciA9IG9wdGlvbnMuZ2V0RnJvbSgpOwotCi0gICAgICAgICAgICBhc3NlcnROdWxsKCJUaGUgRnJvbSBlbmRwb2ludCByZWZlcmVuY2UgaXMgbm90IG51bGwuIiwgZXByKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoQXhpc0ZhdWx0IGFmKSB7Ci0gICAgICAgICAgICBhZi5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIGxvZy5lcnJvcihhZi5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgZmFpbCgiQW4gdW5leHBlY3RlZCBBeGlzRmF1bHQgd2FzIHRocm93biBkdWUgdG8gYSBtaXNzaW5nIEZyb20gaGVhZGVyLiIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIGxvZy5lcnJvcihlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICBmYWlsKCIgQW4gRXhjZXB0aW9uIGhhcyBvY2N1cmVkICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWVzc2FnZVdpdGhPbWl0dGVkTWVzc2FnZUlEKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgT3B0aW9ucyBvcHRpb25zID0gdGVzdE1lc3NhZ2VXaXRoT21pdHRlZEhlYWRlcnMoIm5vTWVzc2FnZUlEIik7Ci0gICAgICAgICAgICBTdHJpbmcgbWVzc2FnZUlEID0gb3B0aW9ucy5nZXRNZXNzYWdlSWQoKTsKLQotICAgICAgICAgICAgYXNzZXJ0TnVsbCgiVGhlIG1lc3NhZ2UgaWQgaXMgbm90IG51bGwuIiwgbWVzc2FnZUlEKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoQXhpc0ZhdWx0IGFmKSB7Ci0gICAgICAgICAgICBhZi5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIGxvZy5lcnJvcihhZi5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgZmFpbCgiQW4gdW5leHBlY3RlZCBBeGlzRmF1bHQgd2FzIHRocm93biBkdWUgdG8gYSBtaXNzaW5nIE1lc3NhZ2VJRCBoZWFkZXIuIik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgbG9nLmVycm9yKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIGZhaWwoIiBBbiBFeGNlcHRpb24gaGFzIG9jY3VyZWQgIiArIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNZXNzYWdlV2l0aE9taXR0ZWRSZXBseVRvKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgT3B0aW9ucyBvcHRpb25zID0gdGVzdE1lc3NhZ2VXaXRoT21pdHRlZEhlYWRlcnMoIm5vUmVwbHlUbyIpOwotICAgICAgICAgICAgRW5kcG9pbnRSZWZlcmVuY2UgZXByID0gb3B0aW9ucy5nZXRSZXBseVRvKCk7Ci0gICAgICAgICAgICBTdHJpbmcgYWRkcmVzcyA9IGVwci5nZXRBZGRyZXNzKCk7Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiVGhlIGFkZHJlc3Mgb2YgdGhlIFJlcGx5VG8gZW5kcG9pbnQgcmVmZXJlbmNlIGlzIG5vdCB0aGUgYW5vbnltb3VzIFVSSS4iLAotICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3NpbmdDb25zdGFudHMuRmluYWwuV1NBX0FOT05ZTU9VU19VUkwsIGFkZHJlc3MpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChBeGlzRmF1bHQgYWYpIHsKLSAgICAgICAgICAgIGFmLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgbG9nLmVycm9yKGFmLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICBmYWlsKCJBbiB1bmV4cGVjdGVkIEF4aXNGYXVsdCB3YXMgdGhyb3duIGR1ZSB0byBhIG1pc3NpbmcgUmVwbHlUbyBoZWFkZXIuIik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgbG9nLmVycm9yKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIGZhaWwoIiBBbiBFeGNlcHRpb24gaGFzIG9jY3VyZWQgIiArIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNZXNzYWdlV2l0aE9taXR0ZWRUbygpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9wdGlvbnMgb3B0aW9ucyA9IHRlc3RNZXNzYWdlV2l0aE9taXR0ZWRIZWFkZXJzKCJub1RvIik7Ci0gICAgICAgICAgICBFbmRwb2ludFJlZmVyZW5jZSBlcHIgPSBvcHRpb25zLmdldFRvKCk7Ci0gICAgICAgICAgICBTdHJpbmcgYWRkcmVzcyA9IGVwci5nZXRBZGRyZXNzKCk7Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiVGhlIGFkZHJlc3Mgb2YgdGhlIFRvIGVuZHBvaW50IHJlZmVyZW5jZSBpcyBub3QgdGhlIGFub255bW91cyBVUkkuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzaW5nQ29uc3RhbnRzLkZpbmFsLldTQV9BTk9OWU1PVVNfVVJMLCBhZGRyZXNzKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoQXhpc0ZhdWx0IGFmKSB7Ci0gICAgICAgICAgICBhZi5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIGxvZy5lcnJvcihhZi5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgZmFpbCgiQW4gdW5leHBlY3RlZCBBeGlzRmF1bHQgd2FzIHRocm93biBkdWUgdG8gYSBtaXNzaW5nIFRvIGhlYWRlci4iKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICBsb2cuZXJyb3IoZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgZmFpbCgiIEFuIEV4Y2VwdGlvbiBoYXMgb2NjdXJlZCAiICsgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdERpZmZlcmVudFNvYXBBY3Rpb25Qcm9jZXNzaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyB0ZXN0ZmlsZSA9ICJ2YWxpZC1tZXNzYWdlcy8iICsgdmVyc2lvbkRpcmVjdG9yeSArICIvc29hcG1lc3NhZ2UueG1sIjsKLSAgICAgICAgTWVzc2FnZUNvbnRleHQgbWMgPSBuZXcgTWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgbWMuc2V0Q29uZmlndXJhdGlvbkNvbnRleHQoQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5LmNyZWF0ZUVtcHR5Q29uZmlndXJhdGlvbkNvbnRleHQoKSk7Ci0gICAgICAgIG1jLnNldFNlcnZlclNpZGUodHJ1ZSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtYy5zZXRTb2FwQWN0aW9uKCJodHRwOi8vd3MuYXBhY2hlLm9yZy90ZXN0cy9kaWZmZXJlbnRBY3Rpb24iKTsKLSAgICAgICAgICAgIGJhc2ljRXh0cmFjdEFkZHJlc3NpbmdJbmZvcm1hdGlvbkZyb21IZWFkZXJzKHRlc3RmaWxlLCBtYyk7Ci0gICAgICAgICAgICBmYWlsKCJBbiBBeGlzRmF1bHQgc2hvdWxkIGhhdmUgYmVlbiB0aHJvd24gZHVlIHRvIHRoZSBzb2FwYWN0aW9uIGJlaW5nIGRpZmZlcmVudCB0byB0aGUgd3MtYSBhY3Rpb24uIik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEF4aXNGYXVsdCBhZikgewotICAgICAgICAgICAgLy9UZXN0IHBhc3NlZC4KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTYW1lU29hcEFjdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgdGVzdGZpbGUgPSAidmFsaWQtbWVzc2FnZXMvIiArIHZlcnNpb25EaXJlY3RvcnkgKyAiL3NvYXBtZXNzYWdlLnhtbCI7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1jID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIG1jLnNldENvbmZpZ3VyYXRpb25Db250ZXh0KENvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeS5jcmVhdGVFbXB0eUNvbmZpZ3VyYXRpb25Db250ZXh0KCkpOwotICAgICAgICBtYy5zZXRTZXJ2ZXJTaWRlKHRydWUpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbWMuc2V0U29hcEFjdGlvbigiaHR0cDovL3dzLmFwYWNoZS5vcmcvdGVzdHMvYWN0aW9uIik7Ci0gICAgICAgICAgICBiYXNpY0V4dHJhY3RBZGRyZXNzaW5nSW5mb3JtYXRpb25Gcm9tSGVhZGVycyh0ZXN0ZmlsZSwgbWMpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChBeGlzRmF1bHQgYWYpIHsKLSAgICAgICAgICAgIGFmLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgbG9nLmVycm9yKGFmLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICBmYWlsKCJBbiB1bmV4cGVjdGVkIEF4aXNGYXVsdCB3YXMgdGhyb3duIHdoaWxlIHRlc3Rpbmcgd2l0aCBhIHNvYXBhY3Rpb24gYW5kIHdzLWEgYWN0aW9uIHRoYXQgYXJlIHRoZSBzYW1lLiIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEVtcHR5U29hcEFjdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgdGVzdGZpbGUgPSAidmFsaWQtbWVzc2FnZXMvIiArIHZlcnNpb25EaXJlY3RvcnkgKyAiL3NvYXBtZXNzYWdlLnhtbCI7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1jID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIG1jLnNldENvbmZpZ3VyYXRpb25Db250ZXh0KENvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeS5jcmVhdGVFbXB0eUNvbmZpZ3VyYXRpb25Db250ZXh0KCkpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbWMuc2V0U29hcEFjdGlvbigiIik7Ci0gICAgICAgICAgICBiYXNpY0V4dHJhY3RBZGRyZXNzaW5nSW5mb3JtYXRpb25Gcm9tSGVhZGVycyh0ZXN0ZmlsZSwgbWMpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChBeGlzRmF1bHQgYWYpIHsKLSAgICAgICAgICAgIGFmLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgbG9nLmVycm9yKGFmLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICBmYWlsKCJBbiB1bmV4cGVjdGVkIEF4aXNGYXVsdCB3YXMgdGhyb3duIHdoaWxlIHRlc3Rpbmcgd2l0aCBhbiBlbXB0eSBzb2FwYWN0aW9uLiIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE51bGxTb2FwQWN0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyB0ZXN0ZmlsZSA9ICJ2YWxpZC1tZXNzYWdlcy8iICsgdmVyc2lvbkRpcmVjdG9yeSArICIvc29hcG1lc3NhZ2UueG1sIjsKLSAgICAgICAgTWVzc2FnZUNvbnRleHQgbWMgPSBuZXcgTWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgbWMuc2V0Q29uZmlndXJhdGlvbkNvbnRleHQoQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5LmNyZWF0ZUVtcHR5Q29uZmlndXJhdGlvbkNvbnRleHQoKSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtYy5zZXRTb2FwQWN0aW9uKG51bGwpOwotICAgICAgICAgICAgYmFzaWNFeHRyYWN0QWRkcmVzc2luZ0luZm9ybWF0aW9uRnJvbUhlYWRlcnModGVzdGZpbGUsIG1jKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoQXhpc0ZhdWx0IGFmKSB7Ci0gICAgICAgICAgICBhZi5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIGxvZy5lcnJvcihhZi5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgZmFpbCgiQW4gdW5leHBlY3RlZCBBeGlzRmF1bHQgd2FzIHRocm93biB3aGlsZSB0ZXN0aW5nIHdpdGggYSBudWxsIHNvYXBhY3Rpb24uIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYXNzZXJ0RVBSSGFzQ29ycmVjdE1ldGFkYXRhKEVuZHBvaW50UmVmZXJlbmNlIGVwcikgewotICAgICAgICBBcnJheUxpc3QgbWV0YWRhdGEgPSBlcHIuZ2V0TWV0YURhdGEoKTsKLSAgICAgICAgaWYgKG1ldGFkYXRhICE9IG51bGwpIHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBtZCA9IChPTUVsZW1lbnQpbWV0YWRhdGEuZ2V0KDApOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG1kLmdldFFOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFFOYW1lKCJodHRwOi8vd3MuYXBhY2hlLm9yZy9uYW1lc3BhY2VzL2F4aXMyIiwgIk1ldGFFeHQiKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMobWQuZ2V0VGV4dCgpLCAiMTIzNDU2Nzg5Iik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMobWQuZ2V0QXR0cmlidXRlVmFsdWUoCi0gICAgICAgICAgICAgICAgICAgIG5ldyBRTmFtZSgiaHR0cDovL3dzLmFwYWNoZS5vcmcvbmFtZXNwYWNlcy9heGlzMiIsICJBdHRyRXh0IikpLCAiMTIzNDU2Nzg5Iik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmYWlsKCJObyBNZXRhZGF0YSBmb3VuZCBpbiBFUFIiKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkZHJlc3NpbmcvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2hhbmRsZXJzL2FkZHJlc3NpbmcvQWRkcmVzc2luZ0luRmF1bHRIYW5kbGVyVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRkcmVzc2luZy90ZXN0L29yZy9hcGFjaGUvYXhpczIvaGFuZGxlcnMvYWRkcmVzc2luZy9BZGRyZXNzaW5nSW5GYXVsdEhhbmRsZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjZjU2YTQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRkcmVzc2luZy90ZXN0L29yZy9hcGFjaGUvYXhpczIvaGFuZGxlcnMvYWRkcmVzc2luZy9BZGRyZXNzaW5nSW5GYXVsdEhhbmRsZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuaGFuZGxlcnMuYWRkcmVzc2luZzsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUDEyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLmltcGwuYnVpbGRlci5TdEFYU09BUE1vZGVsQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuQWRkcmVzc2luZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmhhbmRsZXJzLnV0aWwuVGVzdFV0aWw7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1wdWJsaWMgY2xhc3MgQWRkcmVzc2luZ0luRmF1bHRIYW5kbGVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIFRlc3RVdGlsIHRlc3RVdGlsID0gbmV3IFRlc3RVdGlsKCk7Ci0KLSAgICAvKiogQHBhcmFtIHRlc3ROYW1lICAqLwotICAgIHB1YmxpYyBBZGRyZXNzaW5nSW5GYXVsdEhhbmRsZXJUZXN0KFN0cmluZyB0ZXN0TmFtZSkgewotICAgICAgICBzdXBlcih0ZXN0TmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEludmFsaWRBZGRyZXNzaW5nSGVhZGVyV3NhVG9TT0FQMTEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgQXhpc0ZhdWx0IGFmID0gZ2V0RmF1bHRGb3JUZXN0KCJJbnZhbGlkQWRkcmVzc2luZ0hlYWRlciIsIHRydWUpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGFmKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJXcm9uZyBmYXVsdCBjb2RlISIsCi0gICAgICAgICAgICAgICAgICAgICBBZGRyZXNzaW5nQ29uc3RhbnRzLkZpbmFsLlFOQU1FX0lOVkFMSURfSEVBREVSLAotICAgICAgICAgICAgICAgICAgICAgYWYuZ2V0RmF1bHRDb2RlKCkpOwotICAgICAgICBPTUVsZW1lbnQgcHJvYkhlYWRlckRldGFpbCA9IGFmLmdldEZhdWx0RGV0YWlsRWxlbWVudCgpLmdldEZpcnN0Q2hpbGRXaXRoTmFtZSgKLSAgICAgICAgICAgICAgICBBZGRyZXNzaW5nQ29uc3RhbnRzLkZpbmFsLlFOQU1FX1BST0JMRU1fSEVBREVSKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChwcm9iSGVhZGVyRGV0YWlsKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEFkZHJlc3NpbmdDb25zdGFudHMuRmluYWwuUU5BTUVfV1NBX1RPLAotICAgICAgICAgICAgICAgICAgICAgcHJvYkhlYWRlckRldGFpbC5nZXRUZXh0QXNRTmFtZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWlzc2luZ0FjdGlvblNPQVAxMSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBBeGlzRmF1bHQgYWYgPSBnZXRGYXVsdEZvclRlc3QoIk1lc3NhZ2VBZGRyZXNzaW5nSGVhZGVyUmVxdWlyZWQiLCB0cnVlKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChhZik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEludmFsaWRBZGRyZXNzaW5nSGVhZGVyV3NhVG9TT0FQMTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgQXhpc0ZhdWx0IGFmID0gZ2V0RmF1bHRGb3JUZXN0KCJJbnZhbGlkQWRkcmVzc2luZ0hlYWRlciIsIGZhbHNlKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChhZik7Ci0gICAgICAgIGFzc2VydEVxdWFscygiV3JvbmcgZmF1bHQgY29kZSIsIFNPQVAxMkNvbnN0YW50cy5RTkFNRV9TRU5ERVJfRkFVTFRDT0RFLCBhZi5nZXRGYXVsdENvZGUoKSk7Ci0gICAgICAgIExpc3Qgc3ViQ29kZXMgPSBhZi5nZXRGYXVsdFN1YkNvZGVzKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc3ViQ29kZXMpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgc3ViQ29kZXMuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJXcm9uZyBmYXVsdCBzdWJjb2RlIiwKLSAgICAgICAgICAgICAgICAgICAgIG5ldyBRTmFtZShBZGRyZXNzaW5nQ29uc3RhbnRzLkZpbmFsLldTQV9OQU1FU1BBQ0UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzc2luZ0NvbnN0YW50cy5GaW5hbC5GQVVMVF9JTlZBTElEX0hFQURFUiksCi0gICAgICAgICAgICAgICAgICAgICBzdWJDb2Rlcy5nZXQoMCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNaXNzaW5nQWN0aW9uU09BUDEyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEF4aXNGYXVsdCBhZiA9IGdldEZhdWx0Rm9yVGVzdCgiTWVzc2FnZUFkZHJlc3NpbmdIZWFkZXJSZXF1aXJlZCIsIGZhbHNlKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChhZik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBBeGlzRmF1bHQgZ2V0RmF1bHRGb3JUZXN0KFN0cmluZyB0ZXN0TmFtZSwgYm9vbGVhbiBpc1NPQVAxMSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyB0ZXN0ZmlsZSA9Ci0gICAgICAgICAgICAgICAgImZhdWx0LW1lc3NhZ2VzLyIgKyAoaXNTT0FQMTEgPyAic29hcDExIiA6ICJzb2FwMTIiKSArICIvIiArIHRlc3ROYW1lICsgIi54bWwiOwotICAgICAgICBTdEFYU09BUE1vZGVsQnVpbGRlciBvbUJ1aWxkZXIgPSB0ZXN0VXRpbC5nZXRPTUJ1aWxkZXIodGVzdGZpbGUpOwotICAgICAgICBTT0FQRW52ZWxvcGUgZW52ZWxvcGUgPSAoKFNPQVBFbnZlbG9wZSlvbUJ1aWxkZXIuZ2V0RG9jdW1lbnRFbGVtZW50KCkpOwotICAgICAgICBNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0ID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIG1zZ0NvbnRleHQuc2V0Q29uZmlndXJhdGlvbkNvbnRleHQoCi0gICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5LmNyZWF0ZUVtcHR5Q29uZmlndXJhdGlvbkNvbnRleHQoKSk7Ci0gICAgICAgIG1zZ0NvbnRleHQuc2V0RW52ZWxvcGUoZW52ZWxvcGUpOwotICAgICAgICBBZGRyZXNzaW5nSW5IYW5kbGVyIGFmaWggPSBuZXcgQWRkcmVzc2luZ0luSGFuZGxlcigpOwotICAgICAgICBhZmloLmludm9rZShtc2dDb250ZXh0KTsKLSAgICAgICAgQWRkcmVzc2luZ0luRmF1bHRIYW5kbGVyIGFpZmggPSBuZXcgQWRkcmVzc2luZ0luRmF1bHRIYW5kbGVyKCk7Ci0gICAgICAgIGFpZmguaW52b2tlKG1zZ0NvbnRleHQpOwotCi0gICAgICAgIHJldHVybiAoQXhpc0ZhdWx0KW1zZ0NvbnRleHQuZ2V0UHJvcGVydHkoQ29uc3RhbnRzLklOQk9VTkRfRkFVTFRfT1ZFUlJJREUpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvYWRkcmVzc2luZy90ZXN0L29yZy9hcGFjaGUvYXhpczIvaGFuZGxlcnMvYWRkcmVzc2luZy9BZGRyZXNzaW5nSW5IYW5kbGVyVGVzdEJhc2UuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkZHJlc3NpbmcvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2hhbmRsZXJzL2FkZHJlc3NpbmcvQWRkcmVzc2luZ0luSGFuZGxlclRlc3RCYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0NGU4YWEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvYWRkcmVzc2luZy90ZXN0L29yZy9hcGFjaGUvYXhpczIvaGFuZGxlcnMvYWRkcmVzc2luZy9BZGRyZXNzaW5nSW5IYW5kbGVyVGVzdEJhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuaGFuZGxlcnMuYWRkcmVzc2luZzsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQXR0cmlidXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5Sb2xlUGxheWVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLmltcGwuYnVpbGRlci5TdEFYU09BUE1vZGVsQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuQWRkcmVzc2luZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLlJlbGF0ZXNUbzsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5PcHRpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmhhbmRsZXJzLnV0aWwuVGVzdFV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBZGRyZXNzaW5nSW5IYW5kbGVyVGVzdEJhc2UgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEFkZHJlc3NpbmdJbkhhbmRsZXJUZXN0QmFzZS5jbGFzcyk7Ci0gICAgQWRkcmVzc2luZ0luSGFuZGxlciBpbkhhbmRsZXI7Ci0gICAgU3RyaW5nIGFkZHJlc3NpbmdOYW1lc3BhY2U7Ci0gICAgVGVzdFV0aWwgdGVzdFV0aWwgPSBuZXcgVGVzdFV0aWwoKTsKLSAgICBTdHJpbmcgdGVzdEZpbGVOYW1lID0gInNvYXBtZXNzYWdlLnhtbCI7Ci0KLSAgICBTdHJpbmcgdmVyc2lvbkRpcmVjdG9yeTsKLQotICAgIHByaXZhdGUgU3RyaW5nIGFjdGlvbiA9ICJodHRwOi8vd3MuYXBhY2hlLm9yZy90ZXN0cy9hY3Rpb24iOwotICAgIHByaXZhdGUgU3RyaW5nIG1lc3NhZ2VJRCA9ICJ1dWlkOjkyMEM1MTkwLTBCOEYtMTFEOS04Q0VELUYyMkVERUVCRjdFNSI7Ci0gICAgU3RyaW5nIGZyb21BZGRyZXNzOwotICAgIFN0cmluZyBzZWNvbmRSZWxhdGlvbnNoaXBUeXBlOwotICAgIHByaXZhdGUgU3RyaW5nIGZhdWx0QWRkcmVzcyA9ICJodHRwOi8vZXhhbXBsZS5jb20vZmFicmlrYW0vZmF1bHQiOwotICAgIHByaXZhdGUgU3RyaW5nIHJlcGx5QWRkcmVzcyA9ICJodHRwOi8vZXhhbXBsZS5jb20vZmFicmlrYW0vYWNjdCI7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgdG9BZGRyZXNzID0gImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MS9heGlzL3NlcnZpY2VzL0JhbmtQb3J0IjsKLQotICAgIC8qKiBAcGFyYW0gdGVzdE5hbWUgICovCi0gICAgcHVibGljIEFkZHJlc3NpbmdJbkhhbmRsZXJUZXN0QmFzZShTdHJpbmcgdGVzdE5hbWUpIHsKLSAgICAgICAgc3VwZXIodGVzdE5hbWUpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGJhc2ljRXh0cmFjdEFkZHJlc3NpbmdJbmZvcm1hdGlvbkZyb21IZWFkZXJzKFN0cmluZyB0ZXN0TWVzc2FnZVBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUNvbnRleHQgbWMpCi0gICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RBWFNPQVBNb2RlbEJ1aWxkZXIgb21CdWlsZGVyID0gdGVzdFV0aWwuZ2V0T01CdWlsZGVyKHRlc3RNZXNzYWdlUGF0aCk7Ci0gICAgICAgIFNPQVBFbnZlbG9wZSBlbnZlbG9wZSA9IChTT0FQRW52ZWxvcGUpb21CdWlsZGVyLmdldERvY3VtZW50RWxlbWVudCgpOwotICAgICAgICBtYy5zZXRFbnZlbG9wZShlbnZlbG9wZSk7Ci0gICAgICAgIGluSGFuZGxlci5pbnZva2UobWMpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBPcHRpb25zIGV4dHJhY3RBZGRyZXNzaW5nSW5mb3JtYXRpb25Gcm9tSGVhZGVycyhSb2xlUGxheWVyIHJvbGVQbGF5ZXIpCi0gICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHRlc3RmaWxlID0gInZhbGlkLW1lc3NhZ2VzLyIgKyB2ZXJzaW9uRGlyZWN0b3J5ICsgIi8iICsgdGVzdEZpbGVOYW1lOwotCi0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1jID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIGZpbmFsIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbnRleHQgPQotICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeS5jcmVhdGVFbXB0eUNvbmZpZ3VyYXRpb25Db250ZXh0KCk7Ci0gICAgICAgIG1jLnNldENvbmZpZ3VyYXRpb25Db250ZXh0KGNvbnRleHQpOwotICAgICAgICBpZiAocm9sZVBsYXllciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtYy5nZXRDb25maWd1cmF0aW9uQ29udGV4dCgpLmdldEF4aXNDb25maWd1cmF0aW9uKCkKLSAgICAgICAgICAgICAgICAgICAgLmFkZFBhcmFtZXRlcihDb25zdGFudHMuU09BUF9ST0xFX1BMQVlFUl9QQVJBTUVURVIsIHJvbGVQbGF5ZXIpOwotICAgICAgICB9Ci0gICAgICAgIGJhc2ljRXh0cmFjdEFkZHJlc3NpbmdJbmZvcm1hdGlvbkZyb21IZWFkZXJzKHRlc3RmaWxlLCBtYyk7Ci0KLSAgICAgICAgT3B0aW9ucyBvcHRpb25zID0gbWMuZ2V0T3B0aW9ucygpOwotCi0gICAgICAgIGlmIChvcHRpb25zID09IG51bGwpIHsKLSAgICAgICAgICAgIGZhaWwoIkFkZHJlc3NpbmcgSW5mb3JtYXRpb24gSGVhZGVycyBoYXZlIG5vdCBiZWVuIHJldHJpZXZlZCBwcm9wZXJseSIpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydEVxdWFscygiYWN0aW9uIGhlYWRlciBpcyBub3QgY29ycmVjdCIsIGFjdGlvbiwgb3B0aW9ucy5nZXRBY3Rpb24oKSk7Ci0gICAgICAgIGFzc2VydEFjdGlvbkhhc0V4dGVuc2liaWxpdHlBdHRyaWJ1dGUobWMpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIm1lc3NhZ2UgaWQgaGVhZGVyIGlzIG5vdCBjb3JyZWN0IiwKLSAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZ2V0TWVzc2FnZUlkKCkudHJpbSgpLAotICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUlELnRyaW0oKSk7Ci0gICAgICAgIGFzc2VydE1lc3NhZ2VJREhhc0V4dGVuc2liaWxpdHlBdHRyaWJ1dGUobWMpOwotCi0gICAgICAgIGFzc2VydEZ1bGxGcm9tRVBSKG9wdGlvbnMuZ2V0RnJvbSgpKTsKLSAgICAgICAgYXNzZXJ0RnVsbEZhdWx0RVBSKG9wdGlvbnMuZ2V0RmF1bHRUbygpKTsKLSAgICAgICAgYXNzZXJ0RnVsbFJlcGx5VG9FUFIob3B0aW9ucy5nZXRSZXBseVRvKCkpOwotCi0gICAgICAgIGFzc2VydFJlbGF0aW9uc2hpcHMob3B0aW9ucyk7Ci0KLSAgICAgICAgcmV0dXJuIG9wdGlvbnM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RFeHRyYWN0QWRkcmVzc2luZ0luZm9ybWF0aW9uRnJvbUhlYWRlcnNJbnZhbGlkQ2FyZGluYWxpdHkoU3RyaW5nIGhlYWRlck5hbWUpIHsKLSAgICAgICAgU3RyaW5nIHRlc3RmaWxlID0gImludmFsaWQtY2FyZGluYWxpdHktbWVzc2FnZXMvIiArIHZlcnNpb25EaXJlY3RvcnkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAiL2ludmFsaWRDYXJkaW5hbGl0eSIgKyBoZWFkZXJOYW1lICsgIk1lc3NhZ2UueG1sIjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE1lc3NhZ2VDb250ZXh0IG1jID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgICAgICBtYy5zZXRDb25maWd1cmF0aW9uQ29udGV4dCgKLSAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5LmNyZWF0ZUVtcHR5Q29uZmlndXJhdGlvbkNvbnRleHQoKSk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJhc2ljRXh0cmFjdEFkZHJlc3NpbmdJbmZvcm1hdGlvbkZyb21IZWFkZXJzKHRlc3RmaWxlLCBtYyk7Ci0gICAgICAgICAgICAgICAgZmFpbCgiQW4gQXhpc0ZhdWx0IHNob3VsZCBoYXZlIGJlZW4gdGhyb3duIGR1ZSB0byAyIHdzYToiICsgaGVhZGVyTmFtZSArCi0gICAgICAgICAgICAgICAgICAgICAiIGhlYWRlcnMuIik7Ci0gICAgICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgYWYpIHsKLSAgICAgICAgICAgICAgICBpZiAoaGVhZGVyTmFtZS5lcXVhbHMoQWRkcmVzc2luZ0NvbnN0YW50cy5XU0FfUkVQTFlfVE8pKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydE51bGwoIk5vIFJlcGx5VG8gc2hvdWxkIGJlIHNldCBvbiB0aGUgTWVzc2FnZUNvbnRleHQiLCBtYy5nZXRSZXBseVRvKCkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydFJlcGx5VG9FUFIobWMuZ2V0UmVwbHlUbygpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoaGVhZGVyTmFtZS5lcXVhbHMoQWRkcmVzc2luZ0NvbnN0YW50cy5XU0FfRkFVTFRfVE8pKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydE51bGwoIk5vIEZhdWx0VG8gc2hvdWxkIGJlIHNldCBvbiB0aGUgTWVzc2FnZUNvbnRleHQiLCBtYy5nZXRGYXVsdFRvKCkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydEZhdWx0RVBSKG1jLmdldEZhdWx0VG8oKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGhlYWRlck5hbWUuZXF1YWxzKEFkZHJlc3NpbmdDb25zdGFudHMuV1NBX0FDVElPTikpIHsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0TnVsbCgiTm8gQWN0aW9uIHNob3VsZCBiZSBzZXQgb24gdGhlIE1lc3NhZ2VDb250ZXh0IiwgbWMuZ2V0V1NBQWN0aW9uKCkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygiV1NBQWN0aW9uIHByb3BlcnR5IGlzIG5vdCBjb3JyZWN0IiwgbWMuZ2V0V1NBQWN0aW9uKCksIGFjdGlvbik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGhlYWRlck5hbWUuZXF1YWxzKEFkZHJlc3NpbmdDb25zdGFudHMuV1NBX01FU1NBR0VfSUQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydE51bGwoIk5vIE1lc3NhZ2VJRCBzaG91bGQgYmUgc2V0IG9uIHRoZSBNZXNzYWdlQ29udGV4dCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWMuZ2V0TWVzc2FnZUlEKCkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygiTWVzc2FnZUlEIHByb3BlcnR5IGlzIG5vdCBjb3JyZWN0IiwgbWMuZ2V0TWVzc2FnZUlEKCkudHJpbSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUlELnRyaW0oKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGhlYWRlck5hbWUuZXF1YWxzKEFkZHJlc3NpbmdDb25zdGFudHMuV1NBX0ZST00pKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydE51bGwoIk5vIEZyb20gc2hvdWxkIGJlIHNldCBvbiB0aGUgTWVzc2FnZUNvbnRleHQiLCBtYy5nZXRGcm9tKCkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydEZyb21FUFIobWMuZ2V0RnJvbSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoaGVhZGVyTmFtZS5lcXVhbHMoQWRkcmVzc2luZ0NvbnN0YW50cy5XU0FfVE8pKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydE51bGwoIk5vIFRvIHNob3VsZCBiZSBzZXQgb24gdGhlIE1lc3NhZ2VDb250ZXh0IiwgbWMuZ2V0VG8oKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VG9FUFIobWMuZ2V0VG8oKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIGxvZy5pbmZvKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIGZhaWwoIiBBbiBFeGNlcHRpb24gaGFzIG9jY3VyZWQgIiArIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBPcHRpb25zIHRlc3RNZXNzYWdlV2l0aE9taXR0ZWRIZWFkZXJzKFN0cmluZyB0ZXN0TmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyB0ZXN0ZmlsZSA9Ci0gICAgICAgICAgICAgICAgIm9taXR0ZWQtaGVhZGVyLW1lc3NhZ2VzLyIgKyB2ZXJzaW9uRGlyZWN0b3J5ICsgIi8iICsgdGVzdE5hbWUgKyAiTWVzc2FnZS54bWwiOwotCi0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1jID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNjID0gQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5LmNyZWF0ZUVtcHR5Q29uZmlndXJhdGlvbkNvbnRleHQoKTsKLSAgICAgICAgbWMuc2V0Q29uZmlndXJhdGlvbkNvbnRleHQoY2MpOwotICAgICAgICBiYXNpY0V4dHJhY3RBZGRyZXNzaW5nSW5mb3JtYXRpb25Gcm9tSGVhZGVycyh0ZXN0ZmlsZSwgbWMpOwotCi0gICAgICAgIHJldHVybiBtYy5nZXRPcHRpb25zKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEV4dHJhY3RBZGRyZXNzaW5nSW5mb3JtYXRpb25Gcm9tSGVhZGVyc0ludmFsaWRDYXJkaW5hbGl0eVJlcGx5VG8oKSB7Ci0gICAgICAgIHRlc3RFeHRyYWN0QWRkcmVzc2luZ0luZm9ybWF0aW9uRnJvbUhlYWRlcnNJbnZhbGlkQ2FyZGluYWxpdHkoCi0gICAgICAgICAgICAgICAgQWRkcmVzc2luZ0NvbnN0YW50cy5XU0FfUkVQTFlfVE8pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFeHRyYWN0QWRkcmVzc2luZ0luZm9ybWF0aW9uRnJvbUhlYWRlcnNJbnZhbGlkQ2FyZGluYWxpdHlGYXVsdFRvKCkgewotICAgICAgICB0ZXN0RXh0cmFjdEFkZHJlc3NpbmdJbmZvcm1hdGlvbkZyb21IZWFkZXJzSW52YWxpZENhcmRpbmFsaXR5KAotICAgICAgICAgICAgICAgIEFkZHJlc3NpbmdDb25zdGFudHMuV1NBX0ZBVUxUX1RPKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXh0cmFjdEFkZHJlc3NpbmdJbmZvcm1hdGlvbkZyb21IZWFkZXJzSW52YWxpZENhcmRpbmFsaXR5QWN0aW9uKCkgewotICAgICAgICB0ZXN0RXh0cmFjdEFkZHJlc3NpbmdJbmZvcm1hdGlvbkZyb21IZWFkZXJzSW52YWxpZENhcmRpbmFsaXR5KAotICAgICAgICAgICAgICAgIEFkZHJlc3NpbmdDb25zdGFudHMuV1NBX0FDVElPTik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEV4dHJhY3RBZGRyZXNzaW5nSW5mb3JtYXRpb25Gcm9tSGVhZGVyc0ludmFsaWRDYXJkaW5hbGl0eU1lc3NhZ2VJRCgpIHsKLSAgICAgICAgdGVzdEV4dHJhY3RBZGRyZXNzaW5nSW5mb3JtYXRpb25Gcm9tSGVhZGVyc0ludmFsaWRDYXJkaW5hbGl0eSgKLSAgICAgICAgICAgICAgICBBZGRyZXNzaW5nQ29uc3RhbnRzLldTQV9NRVNTQUdFX0lEKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXh0cmFjdEFkZHJlc3NpbmdJbmZvcm1hdGlvbkZyb21IZWFkZXJzSW52YWxpZENhcmRpbmFsaXR5RnJvbSgpIHsKLSAgICAgICAgdGVzdEV4dHJhY3RBZGRyZXNzaW5nSW5mb3JtYXRpb25Gcm9tSGVhZGVyc0ludmFsaWRDYXJkaW5hbGl0eShBZGRyZXNzaW5nQ29uc3RhbnRzLldTQV9GUk9NKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXh0cmFjdEFkZHJlc3NpbmdJbmZvcm1hdGlvbkZyb21IZWFkZXJzSW52YWxpZENhcmRpbmFsaXR5VG8oKSB7Ci0gICAgICAgIHRlc3RFeHRyYWN0QWRkcmVzc2luZ0luZm9ybWF0aW9uRnJvbUhlYWRlcnNJbnZhbGlkQ2FyZGluYWxpdHkoQWRkcmVzc2luZ0NvbnN0YW50cy5XU0FfVE8pOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhc3NlcnRGcm9tRVBSKEVuZHBvaW50UmVmZXJlbmNlIGZyb21FUFIpIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJBZGRyZXNzIGluIEZyb20gRVBSIGlzIG5vdCB2YWxpZCIsCi0gICAgICAgICAgICAgICAgICAgICBmcm9tRVBSLmdldEFkZHJlc3MoKS50cmltKCksCi0gICAgICAgICAgICAgICAgICAgICBmcm9tQWRkcmVzcy50cmltKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhc3NlcnRGYXVsdEVQUihFbmRwb2ludFJlZmVyZW5jZSBmYXVsdEVQUikgewotICAgICAgICBhc3NlcnRFcXVhbHMoIkFkZHJlc3MgaW4gRmF1bHRUbyBFUFIgaXMgbm90IHZhbGlkIiwKLSAgICAgICAgICAgICAgICAgICAgIGZhdWx0RVBSLmdldEFkZHJlc3MoKS50cmltKCksCi0gICAgICAgICAgICAgICAgICAgICBmYXVsdEFkZHJlc3MudHJpbSgpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYXNzZXJ0UmVwbHlUb0VQUihFbmRwb2ludFJlZmVyZW5jZSByZXBseUVQUikgewotICAgICAgICBhc3NlcnRFcXVhbHMoIkFkZHJlc3MgaW4gUmVwbHl0VG8gRVBSIGlzIG5vdCB2YWxpZCIsCi0gICAgICAgICAgICAgICAgICAgICByZXBseUVQUi5nZXRBZGRyZXNzKCkudHJpbSgpLAotICAgICAgICAgICAgICAgICAgICAgcmVwbHlBZGRyZXNzLnRyaW0oKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFzc2VydFRvRVBSKEVuZHBvaW50UmVmZXJlbmNlIHRvRVBSKSB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbih0b0VQUik7Ci0gICAgICAgIGFzc2VydEVxdWFscygiQWRkcmVzcyBpbiBUbyBFUFIgaXMgbm90IHZhbGlkIiwKLSAgICAgICAgICAgICAgICAgICAgIHRvRVBSLmdldEFkZHJlc3MoKS50cmltKCksCi0gICAgICAgICAgICAgICAgICAgICB0b0FkZHJlc3MudHJpbSgpKTsKLSAgICAgICAgYXNzZXJ0RVBSQWRkcmVzc0hhc0V4dGVuc2liaWxpdHlBdHRyaWJ1dGUodG9FUFIpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhc3NlcnRGdWxsRnJvbUVQUihFbmRwb2ludFJlZmVyZW5jZSBmcm9tRVBSKSB7Ci0gICAgICAgIGFzc2VydEVxdWFscygiQWRkcmVzcyBpbiBGcm9tIEVQUiBpcyBub3QgdmFsaWQiLAotICAgICAgICAgICAgICAgICAgICAgZnJvbUVQUi5nZXRBZGRyZXNzKCkudHJpbSgpLAotICAgICAgICAgICAgICAgICAgICAgZnJvbUFkZHJlc3MudHJpbSgpKTsKLSAgICAgICAgYXNzZXJ0RVBSSGFzRXh0ZW5zaWJpbGl0eUF0dHJpYnV0ZShmcm9tRVBSKTsKLSAgICAgICAgYXNzZXJ0RVBSSGFzQ29ycmVjdFJlZmVyZW5jZVBhcmFtZXRlcnMoZnJvbUVQUik7Ci0gICAgICAgIGFzc2VydEVQUkhhc0NvcnJlY3RFeHRlbnNpYmlsaXR5RWxlbWVudHMoZnJvbUVQUik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFzc2VydEZ1bGxGYXVsdEVQUihFbmRwb2ludFJlZmVyZW5jZSBmYXVsdEVQUikgewotICAgICAgICBhc3NlcnRFcXVhbHMoIkFkZHJlc3MgaW4gRmF1bHRUbyBFUFIgaXMgbm90IHZhbGlkIiwKLSAgICAgICAgICAgICAgICAgICAgIGZhdWx0RVBSLmdldEFkZHJlc3MoKS50cmltKCksCi0gICAgICAgICAgICAgICAgICAgICBmYXVsdEFkZHJlc3MudHJpbSgpKTsKLSAgICAgICAgYXNzZXJ0RVBSSGFzRXh0ZW5zaWJpbGl0eUF0dHJpYnV0ZShmYXVsdEVQUik7Ci0gICAgICAgIGFzc2VydEVQUkhhc0NvcnJlY3RSZWZlcmVuY2VQYXJhbWV0ZXJzKGZhdWx0RVBSKTsKLSAgICAgICAgYXNzZXJ0RVBSSGFzQ29ycmVjdEV4dGVuc2liaWxpdHlFbGVtZW50cyhmYXVsdEVQUik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFzc2VydEZ1bGxSZXBseVRvRVBSKEVuZHBvaW50UmVmZXJlbmNlIHJlcGx5RVBSKSB7Ci0gICAgICAgIGFzc2VydEVxdWFscygiQWRkcmVzcyBpbiBSZXBseXRUbyBFUFIgaXMgbm90IHZhbGlkIiwKLSAgICAgICAgICAgICAgICAgICAgIHJlcGx5RVBSLmdldEFkZHJlc3MoKS50cmltKCksCi0gICAgICAgICAgICAgICAgICAgICByZXBseUFkZHJlc3MudHJpbSgpKTsKLSAgICAgICAgYXNzZXJ0RVBSSGFzRXh0ZW5zaWJpbGl0eUF0dHJpYnV0ZShyZXBseUVQUik7Ci0gICAgICAgIGFzc2VydEVQUkhhc0NvcnJlY3RSZWZlcmVuY2VQYXJhbWV0ZXJzKHJlcGx5RVBSKTsKLSAgICAgICAgYXNzZXJ0RVBSSGFzQ29ycmVjdEV4dGVuc2liaWxpdHlFbGVtZW50cyhyZXBseUVQUik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFzc2VydEVQUkhhc0NvcnJlY3RSZWZlcmVuY2VQYXJhbWV0ZXJzKEVuZHBvaW50UmVmZXJlbmNlIGVwcikgewotICAgICAgICAvLzx3c2E6UmVmZXJlbmNlUGFyYW1ldGVycz4KLSAgICAgICAgLy8gIDxmYWJyaWthbTpDdXN0b21lcktleT4xMjM0NTY3ODk8L2ZhYnJpa2FtOkN1c3RvbWVyS2V5PgotICAgICAgICAvLyAgPGZhYnJpa2FtOlNob3BwaW5nQ2FydD5BQkNERUZHPC9mYWJyaWthbTpTaG9wcGluZ0NhcnQ+Ci0gICAgICAgIC8vPC93c2E6UmVmZXJlbmNlUGFyYW1ldGVycz4KLSAgICAgICAgTWFwIHJlZmVyZW5jZVBhcmFtZXRlcnMgPSBlcHIuZ2V0QWxsUmVmZXJlbmNlUGFyYW1ldGVycygpOwotICAgICAgICBpZiAocmVmZXJlbmNlUGFyYW1ldGVycyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgcmVmcGFybTEgPSAoT01FbGVtZW50KXJlZmVyZW5jZVBhcmFtZXRlcnMKLSAgICAgICAgICAgICAgICAgICAgLmdldChuZXcgUU5hbWUoImh0dHA6Ly9leGFtcGxlLmNvbS9mYWJyaWthbSIsICJDdXN0b21lcktleSIpKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwocmVmcGFybTEpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJSZWZlcmVuY2VQYXJhbWV0ZXIgdmFsdWUgaW5jb3JyZWN0LiIsIHJlZnBhcm0xLmdldFRleHQoKSwgIjEyMzQ1Njc4OSIpOwotCi0gICAgICAgICAgICBPTUVsZW1lbnQgcmVmcGFybTIgPSAoT01FbGVtZW50KXJlZmVyZW5jZVBhcmFtZXRlcnMKLSAgICAgICAgICAgICAgICAgICAgLmdldChuZXcgUU5hbWUoImh0dHA6Ly9leGFtcGxlLmNvbS9mYWJyaWthbSIsICJTaG9wcGluZ0NhcnQiKSk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHJlZnBhcm0yKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiUmVmZXJlbmNlUGFyYW1ldGVyIHZhbHVlIGluY29ycmVjdC4iLCByZWZwYXJtMi5nZXRUZXh0KCksICJBQkNERUZHIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmYWlsKCJObyBSZWZlcmVuY2VQYXJhbWV0ZXJzIGZvdW5kIGluIEVQUiIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFzc2VydEFjdGlvbkhhc0V4dGVuc2liaWxpdHlBdHRyaWJ1dGUoTWVzc2FnZUNvbnRleHQgbWMpIHsKLSAgICAgICAgYm9vbGVhbiBhdHRyaWJ1dGVGb3VuZCA9IGZhbHNlOwotICAgICAgICBBcnJheUxpc3QgYXR0cmlidXRlcyA9IChBcnJheUxpc3QpbWMuZ2V0UHJvcGVydHkoQWRkcmVzc2luZ0NvbnN0YW50cy5BQ1RJT05fQVRUUklCVVRFUyk7Ci0gICAgICAgIGlmIChhdHRyaWJ1dGVzICE9IG51bGwpIHsKLSAgICAgICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSBhdHRyaWJ1dGVzLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBPTUF0dHJpYnV0ZSBvYSA9IChPTUF0dHJpYnV0ZSlpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBpZiAob2EuZ2V0TG9jYWxOYW1lKCkuZXF1YWxzKCJBdHRyRXh0IikpIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlRm91bmQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkF0dHJpYnV0ZSB2YWx1ZSBpbmNvcnJlY3RseSBkZXNlcmlhbGlzZWQiLCBvYS5nZXRBdHRyaWJ1dGVWYWx1ZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjEyMzQ1Njc4OSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBhc3NlcnRUcnVlKCJFeHRlbnNpYmlsaXR5IGF0dHJpYnV0ZSBub3QgZm91bmQgb24gQWN0aW9uIiwgYXR0cmlidXRlRm91bmQpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhc3NlcnRNZXNzYWdlSURIYXNFeHRlbnNpYmlsaXR5QXR0cmlidXRlKE1lc3NhZ2VDb250ZXh0IG1jKSB7Ci0gICAgICAgIGJvb2xlYW4gYXR0cmlidXRlRm91bmQgPSBmYWxzZTsKLSAgICAgICAgQXJyYXlMaXN0IGF0dHJpYnV0ZXMgPSAoQXJyYXlMaXN0KW1jLmdldFByb3BlcnR5KEFkZHJlc3NpbmdDb25zdGFudHMuTUVTU0FHRUlEX0FUVFJJQlVURVMpOwotICAgICAgICBpZiAoYXR0cmlidXRlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBJdGVyYXRvciBpdGVyID0gYXR0cmlidXRlcy5pdGVyYXRvcigpOwotICAgICAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgT01BdHRyaWJ1dGUgb2EgPSAoT01BdHRyaWJ1dGUpaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKG9hLmdldExvY2FsTmFtZSgpLmVxdWFscygiQXR0ckV4dCIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZUZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJBdHRyaWJ1dGUgdmFsdWUgaW5jb3JyZWN0bHkgZGVzZXJpYWxpc2VkIiwgb2EuZ2V0QXR0cmlidXRlVmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIxMjM0NTY3ODkiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiRXh0ZW5zaWJpbGl0eSBhdHRyaWJ1dGUgbm90IGZvdW5kIG9uIE1lc3NhZ2VJRCIsIGF0dHJpYnV0ZUZvdW5kKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYXNzZXJ0UmVsYXRlc1RvSGFzRXh0ZW5zaWJpbGl0eUF0dHJpYnV0ZShSZWxhdGVzVG8gcnQpIHsKLSAgICAgICAgYm9vbGVhbiBhdHRyaWJ1dGVGb3VuZCA9IGZhbHNlOwotICAgICAgICBBcnJheUxpc3QgYXR0cmlidXRlcyA9IHJ0LmdldEV4dGVuc2liaWxpdHlBdHRyaWJ1dGVzKCk7Ci0gICAgICAgIGlmIChhdHRyaWJ1dGVzICE9IG51bGwpIHsKLSAgICAgICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSBhdHRyaWJ1dGVzLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBPTUF0dHJpYnV0ZSBvYSA9IChPTUF0dHJpYnV0ZSlpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBpZiAob2EuZ2V0TG9jYWxOYW1lKCkuZXF1YWxzKCJBdHRyRXh0IikpIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlRm91bmQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkF0dHJpYnV0ZSB2YWx1ZSBpbmNvcnJlY3RseSBkZXNlcmlhbGlzZWQiLCBvYS5nZXRBdHRyaWJ1dGVWYWx1ZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjEyMzQ1Njc4OSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBhc3NlcnRUcnVlKCJFeHRlbnNpYmlsaXR5IGF0dHJpYnV0ZSBub3QgZm91bmQgb24gUmVsYXRlc1RvIiwgYXR0cmlidXRlRm91bmQpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhc3NlcnRFUFJBZGRyZXNzSGFzRXh0ZW5zaWJpbGl0eUF0dHJpYnV0ZShFbmRwb2ludFJlZmVyZW5jZSBlcHIpIHsKLSAgICAgICAgYm9vbGVhbiBhdHRyaWJ1dGVGb3VuZCA9IGZhbHNlOwotICAgICAgICBBcnJheUxpc3QgYXR0cmlidXRlcyA9IGVwci5nZXRBZGRyZXNzQXR0cmlidXRlcygpOwotICAgICAgICBpZiAoYXR0cmlidXRlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBJdGVyYXRvciBpdGVyID0gYXR0cmlidXRlcy5pdGVyYXRvcigpOwotICAgICAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgT01BdHRyaWJ1dGUgb2EgPSAoT01BdHRyaWJ1dGUpaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKG9hLmdldExvY2FsTmFtZSgpLmVxdWFscygiQXR0ckV4dCIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZUZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJBdHRyaWJ1dGUgdmFsdWUgaW5jb3JyZWN0bHkgZGVzZXJpYWxpc2VkIiwgb2EuZ2V0QXR0cmlidXRlVmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIxMjM0NTY3ODkiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiRXh0ZW5zaWJpbGl0eSBhdHRyaWJ1dGUgbm90IGZvdW5kIG9uIEVQUiBBZGRyZXNzIiwgYXR0cmlidXRlRm91bmQpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhc3NlcnRFUFJIYXNFeHRlbnNpYmlsaXR5QXR0cmlidXRlKEVuZHBvaW50UmVmZXJlbmNlIGVwcikgewotICAgICAgICBib29sZWFuIGF0dHJpYnV0ZUZvdW5kID0gZmFsc2U7Ci0gICAgICAgIEFycmF5TGlzdCBhdHRyaWJ1dGVzID0gZXByLmdldEF0dHJpYnV0ZXMoKTsKLSAgICAgICAgaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgSXRlcmF0b3IgaXRlciA9IGF0dHJpYnV0ZXMuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIE9NQXR0cmlidXRlIG9hID0gKE9NQXR0cmlidXRlKWl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgIGlmIChvYS5nZXRMb2NhbE5hbWUoKS5lcXVhbHMoIkF0dHJFeHQiKSkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVGb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygiQXR0cmlidXRlIHZhbHVlIGluY29ycmVjdGx5IGRlc2VyaWFsaXNlZCIsIG9hLmdldEF0dHJpYnV0ZVZhbHVlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMTIzNDU2Nzg5Iik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoIkV4dGVuc2liaWxpdHkgYXR0cmlidXRlIG5vdCBmb3VuZCBvbiBFUFIiLCBhdHRyaWJ1dGVGb3VuZCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFzc2VydEVQUkhhc0NvcnJlY3RFeHRlbnNpYmlsaXR5RWxlbWVudHMoRW5kcG9pbnRSZWZlcmVuY2UgZXByKSB7Ci0gICAgICAgIEFycmF5TGlzdCBlZWxlbWVudHMgPSBlcHIuZ2V0RXh0ZW5zaWJsZUVsZW1lbnRzKCk7Ci0gICAgICAgIGlmIChlZWxlbWVudHMgIT0gbnVsbCkgewotICAgICAgICAgICAgT01FbGVtZW50IGVlID0gKE9NRWxlbWVudCllZWxlbWVudHMuZ2V0KDApOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGVlLmdldFFOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFFOYW1lKCJodHRwOi8vd3MuYXBhY2hlLm9yZy9uYW1lc3BhY2VzL2F4aXMyIiwgIkVQUkV4dCIpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhlZS5nZXRUZXh0KCksICIxMjM0NTY3ODkiKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhlZS5nZXRBdHRyaWJ1dGVWYWx1ZSgKLSAgICAgICAgICAgICAgICAgICAgbmV3IFFOYW1lKCJodHRwOi8vd3MuYXBhY2hlLm9yZy9uYW1lc3BhY2VzL2F4aXMyIiwgIkF0dHJFeHQiKSksICIxMjM0NTY3ODkiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZhaWwoIk5vIEV4dGVuc2liaWxpdHkgRWxlbWVudHMgZm91bmQgaW4gRVBSIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYXNzZXJ0UmVsYXRpb25zaGlwcyhPcHRpb25zIG9wdGlvbnMpIHsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChvcHRpb25zLmdldFJlbGF0ZXNUbygpKTsKLSAgICAgICAgYXNzZXJ0UmVsYXRlc1RvSGFzRXh0ZW5zaWJpbGl0eUF0dHJpYnV0ZShvcHRpb25zLmdldFJlbGF0ZXNUbygpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG9wdGlvbnMuZ2V0UmVsYXRlc1RvKCkuZ2V0VmFsdWUoKSwgImh0dHA6Ly9zb21lLnByZXZpb3VzLm1lc3NhZ2UiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG9wdGlvbnMuZ2V0UmVsYXRlc1RvKHNlY29uZFJlbGF0aW9uc2hpcFR5cGUpLmdldFZhbHVlKCksCi0gICAgICAgICAgICAgICAgICAgICAiaHR0cDovL2lkZW50aWZpZXIub2Yub3RoZXIubWVzc2FnZS8iKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9oYW5kbGVycy9hZGRyZXNzaW5nL0FkZHJlc3NpbmdPdXRIYW5kbGVyVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvYWRkcmVzc2luZy90ZXN0L29yZy9hcGFjaGUvYXhpczIvaGFuZGxlcnMvYWRkcmVzc2luZy9BZGRyZXNzaW5nT3V0SGFuZGxlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTU3YTlhNi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9oYW5kbGVycy9hZGRyZXNzaW5nL0FkZHJlc3NpbmdPdXRIYW5kbGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5oYW5kbGVycy5hZGRyZXNzaW5nOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5sbG9tLnV0aWwuWE1MQ29tcGFyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEhlYWRlckJsb2NrOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5pbXBsLmJ1aWxkZXIuU3RBWFNPQVBNb2RlbEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkFkZHJlc3NpbmdDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5SZWxhdGVzVG87Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaGFuZGxlcnMudXRpbC5UZXN0VXRpbDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBBZGRyZXNzaW5nT3V0SGFuZGxlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSBpbXBsZW1lbnRzIEFkZHJlc3NpbmdDb25zdGFudHMgewotICAgIHByaXZhdGUgQWRkcmVzc2luZ091dEhhbmRsZXIgb3V0SGFuZGxlcjsKLSAgICBwcml2YXRlIE1lc3NhZ2VDb250ZXh0IG1zZ0N0eHQ7Ci0gICAgcHJpdmF0ZSBUZXN0VXRpbCB0ZXN0VXRpbDsKLQotICAgIHB1YmxpYyBBZGRyZXNzaW5nT3V0SGFuZGxlclRlc3QoU3RyaW5nIHRlc3ROYW1lKSB7Ci0gICAgICAgIHN1cGVyKHRlc3ROYW1lKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgICAgICBvdXRIYW5kbGVyID0gbmV3IEFkZHJlc3NpbmdPdXRIYW5kbGVyKCk7Ci0gICAgICAgIHRlc3RVdGlsID0gbmV3IFRlc3RVdGlsKCk7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkVG9TT0FQSGVhZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEVuZHBvaW50UmVmZXJlbmNlIHJlcGx5VG8gPSBuZXcgRW5kcG9pbnRSZWZlcmVuY2UoCi0gICAgICAgICAgICAgICAgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDgvYWRkcmVzc2luZy9yb2xlL2Fub255bW91cyIpOwotICAgICAgICBFbmRwb2ludFJlZmVyZW5jZSBlcHIgPSBuZXcgRW5kcG9pbnRSZWZlcmVuY2UoImh0dHA6Ly93d3cudG8ub3JnL3NlcnZpY2UvIik7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1OyBpKyspIHsKLSAgICAgICAgICAgIGVwci5hZGRSZWZlcmVuY2VQYXJhbWV0ZXIoCi0gICAgICAgICAgICAgICAgICAgIG5ldyBRTmFtZShTdWJtaXNzaW9uLldTQV9OQU1FU1BBQ0UsICJSZWZlcmVuY2UiICsgaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3NpbmdDb25zdGFudHMuV1NBX0RFRkFVTFRfUFJFRklYKSwKLSAgICAgICAgICAgICAgICAgICAgIlZhbHVlICIgKyBpICogMTAwKTsKLQotICAgICAgICB9Ci0KLQotICAgICAgICBTT0FQRmFjdG9yeSBmYWN0b3J5ID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDExRmFjdG9yeSgpOwotICAgICAgICBTT0FQRW52ZWxvcGUgZGVmYXVsdEVudmVsb3BlID0gZmFjdG9yeS5nZXREZWZhdWx0RW52ZWxvcGUoKTsKLQotICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDdHggPQotICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeS5jcmVhdGVFbXB0eUNvbmZpZ3VyYXRpb25Db250ZXh0KCk7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1zZ0N0eHQgPSBjb25maWdDdHguY3JlYXRlTWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgbXNnQ3R4dC5zZXRQcm9wZXJ0eShXU19BRERSRVNTSU5HX1ZFUlNJT04sIFN1Ym1pc3Npb24uV1NBX05BTUVTUEFDRSk7Ci0gICAgICAgIG1zZ0N0eHQuc2V0VG8oZXByKTsKLSAgICAgICAgbXNnQ3R4dC5zZXRSZXBseVRvKHJlcGx5VG8pOwotICAgICAgICBtc2dDdHh0LnNldEVudmVsb3BlKGRlZmF1bHRFbnZlbG9wZSk7Ci0gICAgICAgIG1zZ0N0eHQuc2V0V1NBQWN0aW9uKCJodHRwOi8vd3d3LmFjdGlvbnMub3JnL2FjdGlvbiIpOwotICAgICAgICBtc2dDdHh0LnNldE1lc3NhZ2VJRCgidXJuOnRlc3Q6MTIzIik7Ci0KLSAgICAgICAgT01BdHRyaWJ1dGUgZXh0QXR0ciA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpLmNyZWF0ZU9NQXR0cmlidXRlKCJBdHRyRXh0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NQWJzdHJhY3RGYWN0b3J5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRPTUZhY3RvcnkoKS5jcmVhdGVPTU5hbWVzcGFjZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly93cy5hcGFjaGUub3JnL25hbWVzcGFjZXMvYXhpczIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXhpczIiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIxMjM0NTY3ODkiKTsKLSAgICAgICAgQXJyYXlMaXN0IGFsID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBhbC5hZGQoZXh0QXR0cik7Ci0KLSAgICAgICAgbXNnQ3R4dC5zZXRQcm9wZXJ0eShBZGRyZXNzaW5nQ29uc3RhbnRzLkFDVElPTl9BVFRSSUJVVEVTLCBhbCk7Ci0gICAgICAgIG1zZ0N0eHQuc2V0UHJvcGVydHkoQWRkcmVzc2luZ0NvbnN0YW50cy5NRVNTQUdFSURfQVRUUklCVVRFUywgYWwpOwotCi0gICAgICAgIG91dEhhbmRsZXIuaW52b2tlKG1zZ0N0eHQpOwotCi0gICAgICAgIFN0QVhTT0FQTW9kZWxCdWlsZGVyIG9tQnVpbGRlciA9IHRlc3RVdGlsLmdldE9NQnVpbGRlcigiZXByVGVzdC54bWwiKTsKLQotICAgICAgICBYTUxDb21wYXJhdG9yIHhtbENvbXBhcmF0b3IgPSBuZXcgWE1MQ29tcGFyYXRvcigpOwotCi0gICAgICAgIGFzc2VydFRydWUoCi0gICAgICAgICAgICAgICAgeG1sQ29tcGFyYXRvci5jb21wYXJlKG9tQnVpbGRlci5nZXREb2N1bWVudEVsZW1lbnQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdEVudmVsb3BlKSk7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SGVhZGVyQ3JlYXRpb25Gcm9tTXNnQ3R4dEluZm9ybWF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNmZ0N0eCA9Ci0gICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5LmNyZWF0ZUVtcHR5Q29uZmlndXJhdGlvbkNvbnRleHQoKTsKLSAgICAgICAgbXNnQ3R4dCA9IGNmZ0N0eC5jcmVhdGVNZXNzYWdlQ29udGV4dCgpOwotCi0gICAgICAgIEVuZHBvaW50UmVmZXJlbmNlIGVwciA9IG5ldyBFbmRwb2ludFJlZmVyZW5jZSgiaHR0cDovL3d3dy5mcm9tLm9yZy9zZXJ2aWNlLyIpOwotICAgICAgICBlcHIuYWRkUmVmZXJlbmNlUGFyYW1ldGVyKG5ldyBRTmFtZSgiUmVmZXJlbmNlMiIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWYWx1ZSAyMDAiKTsKLSAgICAgICAgbXNnQ3R4dC5zZXRGcm9tKGVwcik7Ci0KLSAgICAgICAgZXByID0gbmV3IEVuZHBvaW50UmVmZXJlbmNlKCJodHRwOi8vd3d3LnRvLm9yZy9zZXJ2aWNlLyIpOwotICAgICAgICBlcHIuYWRkUmVmZXJlbmNlUGFyYW1ldGVyKAotICAgICAgICAgICAgICAgIG5ldyBRTmFtZSgiaHR0cDovL3JlZmVyZW5jZS5vcmciLCAiUmVmZXJlbmNlNCIsICJteVJlZiIpLAotICAgICAgICAgICAgICAgICJWYWx1ZSA0MDAiKTsKLSAgICAgICAgZXByLmFkZFJlZmVyZW5jZVBhcmFtZXRlcigKLSAgICAgICAgICAgICAgICBuZXcgUU5hbWUoImh0dHA6Ly9yZWZlcmVuY2Uub3JnIiwgIlJlZmVyZW5jZTMiLCAibXlSZWYiKSwKLSAgICAgICAgICAgICAgICAiVmFsdWUgMzAwIik7Ci0KLSAgICAgICAgbXNnQ3R4dC5zZXRUbyhlcHIpOwotICAgICAgICBtc2dDdHh0LnNldFByb3BlcnR5KFdTX0FERFJFU1NJTkdfVkVSU0lPTiwgU3VibWlzc2lvbi5XU0FfTkFNRVNQQUNFKTsKLQotICAgICAgICBlcHIgPSBuZXcgRW5kcG9pbnRSZWZlcmVuY2UoImh0dHA6Ly93d3cucmVwbHlUby5vcmcvc2VydmljZS8iKTsKLSAgICAgICAgbXNnQ3R4dC5zZXRSZXBseVRvKGVwcik7Ci0KLSAgICAgICAgbXNnQ3R4dC5zZXRNZXNzYWdlSUQoIjEyMzQ1Ni03ODkwIik7Ci0gICAgICAgIG1zZ0N0eHQuc2V0V1NBQWN0aW9uKCJodHRwOi8vd3d3LmFjdGlvbnMub3JnL2FjdGlvbiIpOwotCi0gICAgICAgIG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5SZWxhdGVzVG8gcmVsYXRlc1RvID0gbmV3IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5SZWxhdGVzVG8oCi0gICAgICAgICAgICAgICAgImh0dHA6Ly93d3cucmVsYXRlc1RvLm9yZy9zZXJ2aWNlLyIsICJUZXN0UmVsYXRpb24iKTsKLSAgICAgICAgbXNnQ3R4dC5hZGRSZWxhdGVzVG8ocmVsYXRlc1RvKTsKLQotICAgICAgICBtc2dDdHh0LnNldEVudmVsb3BlKAotICAgICAgICAgICAgICAgIE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMUZhY3RvcnkoKS5nZXREZWZhdWx0RW52ZWxvcGUoKSk7Ci0gICAgICAgIG91dEhhbmRsZXIuaW52b2tlKG1zZ0N0eHQpOwotCi0gICAgICAgIFhNTENvbXBhcmF0b3IgeG1sQ29tcGFyYXRvciA9IG5ldyBYTUxDb21wYXJhdG9yKCk7Ci0gICAgICAgIGFzc2VydFRydWUoCi0gICAgICAgICAgICAgICAgeG1sQ29tcGFyYXRvci5jb21wYXJlKG1zZ0N0eHQuZ2V0RW52ZWxvcGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdFV0aWwuZ2V0T01CdWlsZGVyKCJPdXRIYW5kbGVyVGVzdC54bWwiKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXREb2N1bWVudEVsZW1lbnQoKSkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNdXN0VW5kZXJzdGFuZFN1cHBvcnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHQgY2ZnQ3R4ID0KLSAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkuY3JlYXRlRW1wdHlDb25maWd1cmF0aW9uQ29udGV4dCgpOwotICAgICAgICBtc2dDdHh0ID0gY2ZnQ3R4LmNyZWF0ZU1lc3NhZ2VDb250ZXh0KCk7Ci0KLSAgICAgICAgbXNnQ3R4dC5zZXRQcm9wZXJ0eShBZGRyZXNzaW5nQ29uc3RhbnRzLkFERF9NVVNUX1VOREVSU1RBTkRfVE9fQUREUkVTU0lOR19IRUFERVJTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvb2xlYW4uVFJVRSk7Ci0KLSAgICAgICAgRW5kcG9pbnRSZWZlcmVuY2UgZXByID0gbmV3IEVuZHBvaW50UmVmZXJlbmNlKCJodHRwOi8vd3d3LmZyb20ub3JnL3NlcnZpY2UvIik7Ci0gICAgICAgIGVwci5hZGRSZWZlcmVuY2VQYXJhbWV0ZXIobmV3IFFOYW1lKCJSZWZlcmVuY2UyIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZhbHVlIDIwMCIpOwotICAgICAgICBtc2dDdHh0LnNldEZyb20oZXByKTsKLQotICAgICAgICBlcHIgPSBuZXcgRW5kcG9pbnRSZWZlcmVuY2UoImh0dHA6Ly93d3cudG8ub3JnL3NlcnZpY2UvIik7Ci0gICAgICAgIGVwci5hZGRSZWZlcmVuY2VQYXJhbWV0ZXIoCi0gICAgICAgICAgICAgICAgbmV3IFFOYW1lKCJodHRwOi8vcmVmZXJlbmNlLm9yZyIsICJSZWZlcmVuY2U0IiwgIm15UmVmIiksCi0gICAgICAgICAgICAgICAgIlZhbHVlIDQwMCIpOwotICAgICAgICBlcHIuYWRkUmVmZXJlbmNlUGFyYW1ldGVyKAotICAgICAgICAgICAgICAgIG5ldyBRTmFtZSgiaHR0cDovL3JlZmVyZW5jZS5vcmciLCAiUmVmZXJlbmNlMyIsICJteVJlZiIpLAotICAgICAgICAgICAgICAgICJWYWx1ZSAzMDAiKTsKLQotICAgICAgICBtc2dDdHh0LnNldFRvKGVwcik7Ci0gICAgICAgIG1zZ0N0eHQuc2V0UHJvcGVydHkoV1NfQUREUkVTU0lOR19WRVJTSU9OLCBTdWJtaXNzaW9uLldTQV9OQU1FU1BBQ0UpOwotCi0gICAgICAgIGVwciA9IG5ldyBFbmRwb2ludFJlZmVyZW5jZSgiaHR0cDovL3d3dy5yZXBseVRvLm9yZy9zZXJ2aWNlLyIpOwotICAgICAgICBtc2dDdHh0LnNldFJlcGx5VG8oZXByKTsKLQotICAgICAgICBtc2dDdHh0LnNldE1lc3NhZ2VJRCgiMTIzNDU2LTc4OTAiKTsKLSAgICAgICAgbXNnQ3R4dC5zZXRXU0FBY3Rpb24oImh0dHA6Ly93d3cuYWN0aW9ucy5vcmcvYWN0aW9uIik7Ci0KLSAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLlJlbGF0ZXNUbyByZWxhdGVzVG8gPSBuZXcgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLlJlbGF0ZXNUbygKLSAgICAgICAgICAgICAgICAiaHR0cDovL3d3dy5yZWxhdGVzVG8ub3JnL3NlcnZpY2UvIiwgIlRlc3RSZWxhdGlvbiIpOwotICAgICAgICBtc2dDdHh0LmFkZFJlbGF0ZXNUbyhyZWxhdGVzVG8pOwotCi0gICAgICAgIG1zZ0N0eHQuc2V0RW52ZWxvcGUoCi0gICAgICAgICAgICAgICAgT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDExRmFjdG9yeSgpLmdldERlZmF1bHRFbnZlbG9wZSgpKTsKLSAgICAgICAgb3V0SGFuZGxlci5pbnZva2UobXNnQ3R4dCk7Ci0KLSAgICAgICAgWE1MQ29tcGFyYXRvciB4bWxDb21wYXJhdG9yID0gbmV3IFhNTENvbXBhcmF0b3IoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgKLSAgICAgICAgICAgICAgICB4bWxDb21wYXJhdG9yLmNvbXBhcmUobXNnQ3R4dC5nZXRFbnZlbG9wZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0VXRpbC5nZXRPTUJ1aWxkZXIoIm11c3RVbmRlcnN0YW5kVGVzdC54bWwiKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXREb2N1bWVudEVsZW1lbnQoKSkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTT0FQUm9sZVN1cHBvcnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHQgY2ZnQ3R4ID0KLSAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkuY3JlYXRlRW1wdHlDb25maWd1cmF0aW9uQ29udGV4dCgpOwotICAgICAgICBtc2dDdHh0ID0gY2ZnQ3R4LmNyZWF0ZU1lc3NhZ2VDb250ZXh0KCk7Ci0KLSAgICAgICAgbXNnQ3R4dC5zZXRQcm9wZXJ0eShBZGRyZXNzaW5nQ29uc3RhbnRzLlNPQVBfUk9MRV9GT1JfQUREUkVTU0lOR19IRUFERVJTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1cm46dGVzdDpyb2xlIik7Ci0KLSAgICAgICAgRW5kcG9pbnRSZWZlcmVuY2UgZXByID0gbmV3IEVuZHBvaW50UmVmZXJlbmNlKCJodHRwOi8vd3d3LmZyb20ub3JnL3NlcnZpY2UvIik7Ci0gICAgICAgIGVwci5hZGRSZWZlcmVuY2VQYXJhbWV0ZXIobmV3IFFOYW1lKCJSZWZlcmVuY2UyIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZhbHVlIDIwMCIpOwotICAgICAgICBtc2dDdHh0LnNldEZyb20oZXByKTsKLQotICAgICAgICBlcHIgPSBuZXcgRW5kcG9pbnRSZWZlcmVuY2UoImh0dHA6Ly93d3cudG8ub3JnL3NlcnZpY2UvIik7Ci0gICAgICAgIGVwci5hZGRSZWZlcmVuY2VQYXJhbWV0ZXIoCi0gICAgICAgICAgICAgICAgbmV3IFFOYW1lKCJodHRwOi8vcmVmZXJlbmNlLm9yZyIsICJSZWZlcmVuY2U0IiwgIm15UmVmIiksCi0gICAgICAgICAgICAgICAgIlZhbHVlIDQwMCIpOwotICAgICAgICBlcHIuYWRkUmVmZXJlbmNlUGFyYW1ldGVyKAotICAgICAgICAgICAgICAgIG5ldyBRTmFtZSgiaHR0cDovL3JlZmVyZW5jZS5vcmciLCAiUmVmZXJlbmNlMyIsICJteVJlZiIpLAotICAgICAgICAgICAgICAgICJWYWx1ZSAzMDAiKTsKLQotICAgICAgICBtc2dDdHh0LnNldFRvKGVwcik7Ci0gICAgICAgIG1zZ0N0eHQuc2V0UHJvcGVydHkoV1NfQUREUkVTU0lOR19WRVJTSU9OLCBTdWJtaXNzaW9uLldTQV9OQU1FU1BBQ0UpOwotCi0gICAgICAgIGVwciA9IG5ldyBFbmRwb2ludFJlZmVyZW5jZSgiaHR0cDovL3d3dy5yZXBseVRvLm9yZy9zZXJ2aWNlLyIpOwotICAgICAgICBtc2dDdHh0LnNldFJlcGx5VG8oZXByKTsKLQotICAgICAgICBtc2dDdHh0LnNldE1lc3NhZ2VJRCgiMTIzNDU2LTc4OTAiKTsKLSAgICAgICAgbXNnQ3R4dC5zZXRXU0FBY3Rpb24oImh0dHA6Ly93d3cuYWN0aW9ucy5vcmcvYWN0aW9uIik7Ci0KLSAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLlJlbGF0ZXNUbyByZWxhdGVzVG8gPSBuZXcgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLlJlbGF0ZXNUbygKLSAgICAgICAgICAgICAgICAiaHR0cDovL3d3dy5yZWxhdGVzVG8ub3JnL3NlcnZpY2UvIiwgIlRlc3RSZWxhdGlvbiIpOwotICAgICAgICBtc2dDdHh0LmFkZFJlbGF0ZXNUbyhyZWxhdGVzVG8pOwotCi0gICAgICAgIG1zZ0N0eHQuc2V0RW52ZWxvcGUoCi0gICAgICAgICAgICAgICAgT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDExRmFjdG9yeSgpLmdldERlZmF1bHRFbnZlbG9wZSgpKTsKLSAgICAgICAgb3V0SGFuZGxlci5pbnZva2UobXNnQ3R4dCk7Ci0KLSAgICAgICAgWE1MQ29tcGFyYXRvciB4bWxDb21wYXJhdG9yID0gbmV3IFhNTENvbXBhcmF0b3IoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgKLSAgICAgICAgICAgICAgICB4bWxDb21wYXJhdG9yLmNvbXBhcmUobXNnQ3R4dC5nZXRFbnZlbG9wZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0VXRpbC5nZXRPTUJ1aWxkZXIoInNvYXAxMXJvbGVUZXN0LnhtbCIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldERvY3VtZW50RWxlbWVudCgpKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNPQVAxMlJvbGVTdXBwb3J0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNmZ0N0eCA9Ci0gICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5LmNyZWF0ZUVtcHR5Q29uZmlndXJhdGlvbkNvbnRleHQoKTsKLSAgICAgICAgbXNnQ3R4dCA9IGNmZ0N0eC5jcmVhdGVNZXNzYWdlQ29udGV4dCgpOwotCi0gICAgICAgIG1zZ0N0eHQuc2V0UHJvcGVydHkoQWRkcmVzc2luZ0NvbnN0YW50cy5TT0FQX1JPTEVfRk9SX0FERFJFU1NJTkdfSEVBREVSUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXJuOnRlc3Q6cm9sZSIpOwotCi0gICAgICAgIEVuZHBvaW50UmVmZXJlbmNlIGVwciA9IG5ldyBFbmRwb2ludFJlZmVyZW5jZSgiaHR0cDovL3d3dy5mcm9tLm9yZy9zZXJ2aWNlLyIpOwotICAgICAgICBlcHIuYWRkUmVmZXJlbmNlUGFyYW1ldGVyKG5ldyBRTmFtZSgiUmVmZXJlbmNlMiIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWYWx1ZSAyMDAiKTsKLSAgICAgICAgbXNnQ3R4dC5zZXRGcm9tKGVwcik7Ci0KLSAgICAgICAgZXByID0gbmV3IEVuZHBvaW50UmVmZXJlbmNlKCJodHRwOi8vd3d3LnRvLm9yZy9zZXJ2aWNlLyIpOwotICAgICAgICBlcHIuYWRkUmVmZXJlbmNlUGFyYW1ldGVyKAotICAgICAgICAgICAgICAgIG5ldyBRTmFtZSgiaHR0cDovL3JlZmVyZW5jZS5vcmciLCAiUmVmZXJlbmNlNCIsICJteVJlZiIpLAotICAgICAgICAgICAgICAgICJWYWx1ZSA0MDAiKTsKLSAgICAgICAgZXByLmFkZFJlZmVyZW5jZVBhcmFtZXRlcigKLSAgICAgICAgICAgICAgICBuZXcgUU5hbWUoImh0dHA6Ly9yZWZlcmVuY2Uub3JnIiwgIlJlZmVyZW5jZTMiLCAibXlSZWYiKSwKLSAgICAgICAgICAgICAgICAiVmFsdWUgMzAwIik7Ci0KLSAgICAgICAgbXNnQ3R4dC5zZXRUbyhlcHIpOwotICAgICAgICBtc2dDdHh0LnNldFByb3BlcnR5KFdTX0FERFJFU1NJTkdfVkVSU0lPTiwgU3VibWlzc2lvbi5XU0FfTkFNRVNQQUNFKTsKLQotICAgICAgICBlcHIgPSBuZXcgRW5kcG9pbnRSZWZlcmVuY2UoImh0dHA6Ly93d3cucmVwbHlUby5vcmcvc2VydmljZS8iKTsKLSAgICAgICAgbXNnQ3R4dC5zZXRSZXBseVRvKGVwcik7Ci0KLSAgICAgICAgbXNnQ3R4dC5zZXRNZXNzYWdlSUQoIjEyMzQ1Ni03ODkwIik7Ci0gICAgICAgIG1zZ0N0eHQuc2V0V1NBQWN0aW9uKCJodHRwOi8vd3d3LmFjdGlvbnMub3JnL2FjdGlvbiIpOwotCi0gICAgICAgIG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5SZWxhdGVzVG8gcmVsYXRlc1RvID0gbmV3IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5SZWxhdGVzVG8oCi0gICAgICAgICAgICAgICAgImh0dHA6Ly93d3cucmVsYXRlc1RvLm9yZy9zZXJ2aWNlLyIsICJUZXN0UmVsYXRpb24iKTsKLSAgICAgICAgbXNnQ3R4dC5hZGRSZWxhdGVzVG8ocmVsYXRlc1RvKTsKLQotICAgICAgICBtc2dDdHh0LnNldEVudmVsb3BlKAotICAgICAgICAgICAgICAgIE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMkZhY3RvcnkoKS5nZXREZWZhdWx0RW52ZWxvcGUoKSk7Ci0gICAgICAgIG91dEhhbmRsZXIuaW52b2tlKG1zZ0N0eHQpOwotCi0gICAgICAgIFhNTENvbXBhcmF0b3IgeG1sQ29tcGFyYXRvciA9IG5ldyBYTUxDb21wYXJhdG9yKCk7Ci0gICAgICAgIGFzc2VydFRydWUoCi0gICAgICAgICAgICAgICAgeG1sQ29tcGFyYXRvci5jb21wYXJlKG1zZ0N0eHQuZ2V0RW52ZWxvcGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdFV0aWwuZ2V0T01CdWlsZGVyKCJzb2FwMTJyb2xlVGVzdC54bWwiKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXREb2N1bWVudEVsZW1lbnQoKSkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3REdXBsaWNhdGVIZWFkZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgLy8gdGhpcyB3aWxsIGNoZWNrIHdoZXRoZXIgd2UgY2FuIGFkZCB0byBlcHIsIGlmIHRoZXJlIGlzIG9uZSBhbHJlYWR5LgotICAgICAgICBFbmRwb2ludFJlZmVyZW5jZSBlcHJPbmUgPSBuZXcgRW5kcG9pbnRSZWZlcmVuY2UoImh0dHA6Ly93aGF0ZXZlci5vcmciKTsKLSAgICAgICAgRW5kcG9pbnRSZWZlcmVuY2UgZHVwbGljYXRlRXByID0gbmV3IEVuZHBvaW50UmVmZXJlbmNlKCJodHRwOi8vd2hhdGV2ZXIuZHVwbGljYXRlLm9yZyIpOwotICAgICAgICBSZWxhdGVzVG8gcmVwbHkgPSBuZXcgUmVsYXRlc1RvKCJ1cm46aWQiKTsKLSAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHQgY2ZnQ3R4ID0KLSAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkuY3JlYXRlRW1wdHlDb25maWd1cmF0aW9uQ29udGV4dCgpOwotICAgICAgICBtc2dDdHh0ID0gY2ZnQ3R4LmNyZWF0ZU1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIFNPQVBGYWN0b3J5IGZhY3RvcnkgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTFGYWN0b3J5KCk7Ci0gICAgICAgIFNPQVBFbnZlbG9wZSBkZWZhdWx0RW52ZWxvcGUgPSBmYWN0b3J5LmdldERlZmF1bHRFbnZlbG9wZSgpOwotICAgICAgICBtc2dDdHh0LnNldEVudmVsb3BlKGRlZmF1bHRFbnZlbG9wZSk7Ci0KLSAgICAgICAgbXNnQ3R4dC5hZGRSZWxhdGVzVG8ocmVwbHkpOwotICAgICAgICBtc2dDdHh0LnNldFRvKGVwck9uZSk7Ci0gICAgICAgIG1zZ0N0eHQuc2V0V1NBQWN0aW9uKCJodHRwOi8vd3d3LmFjdGlvbnMub3JnL2FjdGlvbiIpOwotICAgICAgICBvdXRIYW5kbGVyLmludm9rZShtc2dDdHh0KTsKLQotICAgICAgICAvLyBub3cgdGhlIHNvYXAgbWVzc2FnZSB3aXRoaW4gdGhlIG1zZ0N0eHQgbXVzdCBoYXZlIGEgdG8gaGVhZGVyLgotICAgICAgICAvLyBsZXRzIGludm9rZSB0d2ljZSBhbmQgc2VlCi0gICAgICAgIG1zZ0N0eHQuc2V0VG8oZHVwbGljYXRlRXByKTsKLSAgICAgICAgb3V0SGFuZGxlci5pbnZva2UobXNnQ3R4dCk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJodHRwOi8vd2hhdGV2ZXIub3JnIiwgZGVmYXVsdEVudmVsb3BlLmdldEhlYWRlcigpCi0gICAgICAgICAgICAgICAgLmdldEZpcnN0Q2hpbGRXaXRoTmFtZShGaW5hbC5RTkFNRV9XU0FfVE8pLmdldFRleHQoKSk7Ci0gICAgICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0KLSAgICAgICAgICAgICAgICBkZWZhdWx0RW52ZWxvcGUuZ2V0SGVhZGVyKCkuZ2V0Q2hpbGRyZW5XaXRoTmFtZShGaW5hbC5RTkFNRV9XU0FfUkVMQVRFU19UTyk7Ci0gICAgICAgIGludCBpID0gMDsKLSAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgaSsrOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydEVxdWFscygiUmVwbHkgc2hvdWxkIGJlIGFkZGVkIHR3aWNlLiIsIDIsIGkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3REdXBsaWNhdGVIZWFkZXJzV2l0aE92ZXJyaWRpbmdPbigpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIC8vIHRoaXMgd2lsbCBjaGVjayB3aGV0aGVyIHdlIGNhbiBhZGQgdG8gZXByLCBpZiB0aGVyZSBpcyBvbmUgYWxyZWFkeS4KLSAgICAgICAgRW5kcG9pbnRSZWZlcmVuY2UgZXByT25lID0gbmV3IEVuZHBvaW50UmVmZXJlbmNlKCJodHRwOi8vd2hhdGV2ZXIub3JnIik7Ci0gICAgICAgIFJlbGF0ZXNUbyBjdXN0b20gPSBuZXcgUmVsYXRlc1RvKCJ1cm46aWQiLCAiY3VzdG9tUmVsYXRpb25zaGlwIik7Ci0gICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNmZ0N0eCA9Ci0gICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5LmNyZWF0ZUVtcHR5Q29uZmlndXJhdGlvbkNvbnRleHQoKTsKLSAgICAgICAgbXNnQ3R4dCA9IGNmZ0N0eC5jcmVhdGVNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBTT0FQRmFjdG9yeSBmYWN0b3J5ID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDExRmFjdG9yeSgpOwotICAgICAgICBTT0FQRW52ZWxvcGUgZGVmYXVsdEVudmVsb3BlID0gZmFjdG9yeS5nZXREZWZhdWx0RW52ZWxvcGUoKTsKLSAgICAgICAgT01OYW1lc3BhY2UgYWRkcmVzc2luZ05hbWVzcGFjZSA9Ci0gICAgICAgICAgICAgICAgZmFjdG9yeS5jcmVhdGVPTU5hbWVzcGFjZShGaW5hbC5XU0FfTkFNRVNQQUNFLCBXU0FfREVGQVVMVF9QUkVGSVgpOwotICAgICAgICBTT0FQSGVhZGVyQmxvY2sgc29hcEhlYWRlckJsb2NrID0KLSAgICAgICAgICAgICAgICBkZWZhdWx0RW52ZWxvcGUuZ2V0SGVhZGVyKCkuYWRkSGVhZGVyQmxvY2soV1NBX1RPLCBhZGRyZXNzaW5nTmFtZXNwYWNlKTsKLSAgICAgICAgc29hcEhlYWRlckJsb2NrLnNldFRleHQoImh0dHA6Ly9vbGRFUFIub3JnIik7Ci0gICAgICAgIHNvYXBIZWFkZXJCbG9jayA9Ci0gICAgICAgICAgICAgICAgZGVmYXVsdEVudmVsb3BlLmdldEhlYWRlcigpLmFkZEhlYWRlckJsb2NrKFdTQV9SRUxBVEVTX1RPLCBhZGRyZXNzaW5nTmFtZXNwYWNlKTsKLSAgICAgICAgc29hcEhlYWRlckJsb2NrLnNldFRleHQoInVybjppZCIpOwotICAgICAgICBzb2FwSGVhZGVyQmxvY2sgPQotICAgICAgICAgICAgICAgIGRlZmF1bHRFbnZlbG9wZS5nZXRIZWFkZXIoKS5hZGRIZWFkZXJCbG9jayhXU0FfUkVMQVRFU19UTywgYWRkcmVzc2luZ05hbWVzcGFjZSk7Ci0gICAgICAgIHNvYXBIZWFkZXJCbG9jay5zZXRUZXh0KCJ1cm46aWQiKTsKLSAgICAgICAgc29hcEhlYWRlckJsb2NrCi0gICAgICAgICAgICAgICAgLmFkZEF0dHJpYnV0ZShXU0FfUkVMQVRFU19UT19SRUxBVElPTlNISVBfVFlQRSwgY3VzdG9tLmdldFJlbGF0aW9uc2hpcFR5cGUoKSwgbnVsbCk7Ci0gICAgICAgIG1zZ0N0eHQuc2V0RW52ZWxvcGUoZGVmYXVsdEVudmVsb3BlKTsKLQotICAgICAgICBtc2dDdHh0LnNldFByb3BlcnR5KFJFUExBQ0VfQUREUkVTU0lOR19IRUFERVJTLCBCb29sZWFuLlRSVUUpOwotICAgICAgICBtc2dDdHh0LmFkZFJlbGF0ZXNUbyhjdXN0b20pOwotICAgICAgICBtc2dDdHh0LnNldFRvKGVwck9uZSk7Ci0gICAgICAgIG1zZ0N0eHQuc2V0V1NBQWN0aW9uKCJodHRwOi8vd3d3LmFjdGlvbnMub3JnL2FjdGlvbiIpOwotICAgICAgICBvdXRIYW5kbGVyLmludm9rZShtc2dDdHh0KTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly93aGF0ZXZlci5vcmciLCBkZWZhdWx0RW52ZWxvcGUuZ2V0SGVhZGVyKCkKLSAgICAgICAgICAgICAgICAuZ2V0Rmlyc3RDaGlsZFdpdGhOYW1lKEZpbmFsLlFOQU1FX1dTQV9UTykuZ2V0VGV4dCgpKTsKLSAgICAgICAgSXRlcmF0b3IgaXRlcmF0b3IgPQotICAgICAgICAgICAgICAgIGRlZmF1bHRFbnZlbG9wZS5nZXRIZWFkZXIoKS5nZXRDaGlsZHJlbldpdGhOYW1lKEZpbmFsLlFOQU1FX1dTQV9SRUxBVEVTX1RPKTsKLSAgICAgICAgaW50IGkgPSAwOwotICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICBpKys7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJDdXN0b20gc2hvdWxkIHJlcGxhY2UgcmVwbHkuIiwgMSwgaSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdER1cGxpY2F0ZUhlYWRlcnNXaXRoT3ZlcnJpZGluZ09mZigpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIC8vIHRoaXMgd2lsbCBjaGVjayB3aGV0aGVyIHdlIGNhbiBhZGQgdG8gZXByLCBpZiB0aGVyZSBpcyBvbmUgYWxyZWFkeS4KLSAgICAgICAgRW5kcG9pbnRSZWZlcmVuY2UgZXByT25lID0gbmV3IEVuZHBvaW50UmVmZXJlbmNlKCJodHRwOi8vd2hhdGV2ZXIub3JnIik7Ci0gICAgICAgIFJlbGF0ZXNUbyBjdXN0b20gPSBuZXcgUmVsYXRlc1RvKCJ1cm46aWQiLCAiY3VzdG9tUmVsYXRpb25zaGlwIik7Ci0gICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNmZ0N0eCA9Ci0gICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5LmNyZWF0ZUVtcHR5Q29uZmlndXJhdGlvbkNvbnRleHQoKTsKLSAgICAgICAgbXNnQ3R4dCA9IGNmZ0N0eC5jcmVhdGVNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBTT0FQRmFjdG9yeSBmYWN0b3J5ID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDExRmFjdG9yeSgpOwotICAgICAgICBTT0FQRW52ZWxvcGUgZGVmYXVsdEVudmVsb3BlID0gZmFjdG9yeS5nZXREZWZhdWx0RW52ZWxvcGUoKTsKLSAgICAgICAgT01OYW1lc3BhY2UgYWRkcmVzc2luZ05hbWVzcGFjZSA9Ci0gICAgICAgICAgICAgICAgZmFjdG9yeS5jcmVhdGVPTU5hbWVzcGFjZShGaW5hbC5XU0FfTkFNRVNQQUNFLCBXU0FfREVGQVVMVF9QUkVGSVgpOwotICAgICAgICBTT0FQSGVhZGVyQmxvY2sgc29hcEhlYWRlckJsb2NrID0KLSAgICAgICAgICAgICAgICBkZWZhdWx0RW52ZWxvcGUuZ2V0SGVhZGVyKCkuYWRkSGVhZGVyQmxvY2soV1NBX1RPLCBhZGRyZXNzaW5nTmFtZXNwYWNlKTsKLSAgICAgICAgc29hcEhlYWRlckJsb2NrLnNldFRleHQoImh0dHA6Ly9vbGRFUFIub3JnIik7Ci0gICAgICAgIHNvYXBIZWFkZXJCbG9jayA9Ci0gICAgICAgICAgICAgICAgZGVmYXVsdEVudmVsb3BlLmdldEhlYWRlcigpLmFkZEhlYWRlckJsb2NrKFdTQV9SRUxBVEVTX1RPLCBhZGRyZXNzaW5nTmFtZXNwYWNlKTsKLSAgICAgICAgc29hcEhlYWRlckJsb2NrLnNldFRleHQoInVybjppZCIpOwotICAgICAgICBtc2dDdHh0LnNldEVudmVsb3BlKGRlZmF1bHRFbnZlbG9wZSk7Ci0KLSAgICAgICAgbXNnQ3R4dC5zZXRQcm9wZXJ0eShSRVBMQUNFX0FERFJFU1NJTkdfSEVBREVSUywgQm9vbGVhbi5GQUxTRSk7Ci0gICAgICAgIG1zZ0N0eHQuYWRkUmVsYXRlc1RvKGN1c3RvbSk7Ci0gICAgICAgIG1zZ0N0eHQuc2V0VG8oZXByT25lKTsKLSAgICAgICAgbXNnQ3R4dC5zZXRXU0FBY3Rpb24oImh0dHA6Ly93d3cuYWN0aW9ucy5vcmcvYWN0aW9uIik7Ci0gICAgICAgIG91dEhhbmRsZXIuaW52b2tlKG1zZ0N0eHQpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygiaHR0cDovL29sZEVQUi5vcmciLCBkZWZhdWx0RW52ZWxvcGUuZ2V0SGVhZGVyKCkKLSAgICAgICAgICAgICAgICAuZ2V0Rmlyc3RDaGlsZFdpdGhOYW1lKEZpbmFsLlFOQU1FX1dTQV9UTykuZ2V0VGV4dCgpKTsKLSAgICAgICAgSXRlcmF0b3IgaXRlcmF0b3IgPQotICAgICAgICAgICAgICAgIGRlZmF1bHRFbnZlbG9wZS5nZXRIZWFkZXIoKS5nZXRDaGlsZHJlbldpdGhOYW1lKEZpbmFsLlFOQU1FX1dTQV9SRUxBVEVTX1RPKTsKLSAgICAgICAgaW50IGkgPSAwOwotICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICBpKys7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJCb3RoIHJlcGx5IGFuZCBjdXN0b20gc2hvdWxkIGJlIGZvdW5kLiIsIDIsIGkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkZHJlc3NpbmcvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2hhbmRsZXJzL2FkZHJlc3NpbmcvQWRkcmVzc2luZ1N1Ym1pc3Npb25JbkhhbmRsZXJUZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9oYW5kbGVycy9hZGRyZXNzaW5nL0FkZHJlc3NpbmdTdWJtaXNzaW9uSW5IYW5kbGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2Q2MTkxLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkZHJlc3NpbmcvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2hhbmRsZXJzL2FkZHJlc3NpbmcvQWRkcmVzc2luZ1N1Ym1pc3Npb25JbkhhbmRsZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmhhbmRsZXJzLmFkZHJlc3Npbmc7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuUm9sZVBsYXllcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuQWRkcmVzc2luZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuT3B0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBBZGRyZXNzaW5nU3VibWlzc2lvbkluSGFuZGxlclRlc3QgZXh0ZW5kcyBBZGRyZXNzaW5nSW5IYW5kbGVyVGVzdEJhc2UgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEFkZHJlc3NpbmdTdWJtaXNzaW9uSW5IYW5kbGVyVGVzdC5jbGFzcyk7Ci0KLSAgICAvKiogQHBhcmFtIHRlc3ROYW1lICAqLwotICAgIHB1YmxpYyBBZGRyZXNzaW5nU3VibWlzc2lvbkluSGFuZGxlclRlc3QoU3RyaW5nIHRlc3ROYW1lKSB7Ci0gICAgICAgIHN1cGVyKHRlc3ROYW1lKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgICAgICBpbkhhbmRsZXIgPSBuZXcgQWRkcmVzc2luZ0luSGFuZGxlcigpOwotICAgICAgICBhZGRyZXNzaW5nTmFtZXNwYWNlID0gQWRkcmVzc2luZ0NvbnN0YW50cy5TdWJtaXNzaW9uLldTQV9OQU1FU1BBQ0U7Ci0gICAgICAgIHZlcnNpb25EaXJlY3RvcnkgPSAic3VibWlzc2lvbiI7Ci0gICAgICAgIGZyb21BZGRyZXNzID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDgvYWRkcmVzc2luZy9yb2xlL2Fub255bW91cyI7Ci0gICAgICAgIHNlY29uZFJlbGF0aW9uc2hpcFR5cGUgPSAiYXhpczI6c29tZS5jdXN0b20ucmVsYXRpb25zaGlwIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXh0cmFjdEFkZHJlc3NpbmdJbmZvcm1hdGlvbkZyb21IZWFkZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE9wdGlvbnMgb3B0aW9ucyA9IGV4dHJhY3RBZGRyZXNzaW5nSW5mb3JtYXRpb25Gcm9tSGVhZGVycyhudWxsKTsKLQotICAgICAgICBhc3NlcnROb3ROdWxsKG9wdGlvbnMpOwotICAgICAgICBhc3NlcnROb3ROdWxsKG9wdGlvbnMuZ2V0VG8oKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEV4dHJhY3RBZGRyZXNzaW5nSW5mb3JtYXRpb25Gcm9tSGVhZGVyc0N1c3RvbVJvbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdGVzdEZpbGVOYW1lID0gInNvYXBtZXNzYWdlLmN1c3RvbXJvbGUueG1sIjsKLSAgICAgICAgZXh0cmFjdEFkZHJlc3NpbmdJbmZvcm1hdGlvbkZyb21IZWFkZXJzKG5ldyBSb2xlUGxheWVyKCkgewotICAgICAgICAgICAgcHVibGljIExpc3QgZ2V0Um9sZXMoKSB7Ci0gICAgICAgICAgICAgICAgQXJyYXlMaXN0IGFsID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgIGFsLmFkZCgiaHR0cDovL215L2N1c3RvbS9yb2xlIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGFsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1VsdGltYXRlRGVzdGluYXRpb24oKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWVzc2FnZVdpdGhPbWl0dGVkQWN0aW9uKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgdGVzdE1lc3NhZ2VXaXRoT21pdHRlZEhlYWRlcnMoIm5vQWN0aW9uIik7Ci0gICAgICAgICAgICBmYWlsKCJBbiBBeGlzRmF1bHQgc2hvdWxkIGhhdmUgYmVlbiB0aHJvd24gZHVlIHRvIGEgbWlzc2luZyBBY3Rpb24gaGVhZGVyLiIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChBeGlzRmF1bHQgYWYpIHsKLSAgICAgICAgICAgIC8vdGVzdCBwYXNzZWQKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICBsb2cuZXJyb3IoZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgZmFpbCgiIEFuIEV4Y2VwdGlvbiBoYXMgb2NjdXJlZCAiICsgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE1lc3NhZ2VXaXRoT21pdHRlZEZhdWx0VG8oKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPcHRpb25zIG9wdGlvbnMgPSB0ZXN0TWVzc2FnZVdpdGhPbWl0dGVkSGVhZGVycygibm9GYXVsdFRvIik7Ci0gICAgICAgICAgICBFbmRwb2ludFJlZmVyZW5jZSBlcHIgPSBvcHRpb25zLmdldEZhdWx0VG8oKTsKLQotICAgICAgICAgICAgYXNzZXJ0TnVsbCgiVGhlIEZhdWx0VG8gZW5kcG9pbnQgcmVmZXJlbmNlIGlzIG5vdCBudWxsLiIsIGVwcik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEF4aXNGYXVsdCBhZikgewotICAgICAgICAgICAgYWYucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICBsb2cuZXJyb3IoYWYuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIGZhaWwoIkFuIHVuZXhwZWN0ZWQgQXhpc0ZhdWx0IHdhcyB0aHJvd24gZHVlIHRvIGEgbWlzc2luZyBGYXVsdFRvIGhlYWRlci4iKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICBsb2cuZXJyb3IoZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgZmFpbCgiIEFuIEV4Y2VwdGlvbiBoYXMgb2NjdXJlZCAiICsgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE1lc3NhZ2VXaXRoT21pdHRlZEZyb20oKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPcHRpb25zIG9wdGlvbnMgPSB0ZXN0TWVzc2FnZVdpdGhPbWl0dGVkSGVhZGVycygibm9Gcm9tIik7Ci0gICAgICAgICAgICBFbmRwb2ludFJlZmVyZW5jZSBlcHIgPSBvcHRpb25zLmdldEZyb20oKTsKLQotICAgICAgICAgICAgYXNzZXJ0TnVsbCgiVGhlIEZyb20gZW5kcG9pbnQgcmVmZXJlbmNlIGlzIG5vdCBudWxsLiIsIGVwcik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEF4aXNGYXVsdCBhZikgewotICAgICAgICAgICAgYWYucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICBsb2cuZXJyb3IoYWYuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIGZhaWwoIkFuIHVuZXhwZWN0ZWQgQXhpc0ZhdWx0IHdhcyB0aHJvd24gZHVlIHRvIGEgbWlzc2luZyBGcm9tIGhlYWRlci4iKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICBsb2cuZXJyb3IoZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgZmFpbCgiIEFuIEV4Y2VwdGlvbiBoYXMgb2NjdXJlZCAiICsgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE1lc3NhZ2VXaXRoT21pdHRlZE1lc3NhZ2VJRCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHRlc3RNZXNzYWdlV2l0aE9taXR0ZWRIZWFkZXJzKCJub01lc3NhZ2VJRCIpOwotICAgICAgICAgICAgZmFpbCgiQW4gQXhpc0ZhdWx0IHNob3VsZCBoYXZlIGJlZW4gdGhyb3duIGR1ZSB0byBhIG1pc3NpbmcgTWVzc2FnZUlEIGhlYWRlci4iKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoQXhpc0ZhdWx0IGFmKSB7Ci0gICAgICAgICAgICAvL3Rlc3QgcGFzc2VkCi0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgbG9nLmVycm9yKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIGZhaWwoIiBBbiBFeGNlcHRpb24gaGFzIG9jY3VyZWQgIiArIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNZXNzYWdlV2l0aE9taXR0ZWRNZXNzYWdlSURSZXBseVRvQW5kRmF1bHRUbygpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9wdGlvbnMgb3B0aW9ucyA9IHRlc3RNZXNzYWdlV2l0aE9taXR0ZWRIZWFkZXJzKCJub01lc3NhZ2VJRE5vUmVwbHlUb05vRmF1bHRUbyIpOwotICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2VJRCA9IG9wdGlvbnMuZ2V0TWVzc2FnZUlkKCk7Ci0KLSAgICAgICAgICAgIGFzc2VydE51bGwoIlRoZSBtZXNzYWdlIGlkIGlzIG5vdCBudWxsLiIsIG1lc3NhZ2VJRCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEF4aXNGYXVsdCBhZikgewotICAgICAgICAgICAgYWYucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICBsb2cuZXJyb3IoYWYuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIGZhaWwoIkFuIHVuZXhwZWN0ZWQgQXhpc0ZhdWx0IHdhcyB0aHJvd24gZHVlIHRvIG1pc3NpbmcgTWVzc2FnZUlELCBSZXBseVRvLCBhbmQgRmF1bHRUbyBoZWFkZXJzLiIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIGxvZy5lcnJvcihlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICBmYWlsKCIgQW4gRXhjZXB0aW9uIGhhcyBvY2N1cmVkICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWVzc2FnZVdpdGhPbWl0dGVkUmVwbHlUbygpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9wdGlvbnMgb3B0aW9ucyA9IHRlc3RNZXNzYWdlV2l0aE9taXR0ZWRIZWFkZXJzKCJub1JlcGx5VG8iKTsKLSAgICAgICAgICAgIEVuZHBvaW50UmVmZXJlbmNlIGVwciA9IG9wdGlvbnMuZ2V0UmVwbHlUbygpOwotICAgICAgICAgICAgU3RyaW5nIGFkZHJlc3MgPSBlcHIuZ2V0QWRkcmVzcygpOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlRoZSBhZGRyZXNzIG9mIHRoZSBSZXBseVRvIGVuZHBvaW50IHJlZmVyZW5jZSBpcyBub3QgdGhlIG5vbmUgVVJJLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzc2luZ0NvbnN0YW50cy5GaW5hbC5XU0FfTk9ORV9VUkksIGFkZHJlc3MpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChBeGlzRmF1bHQgYWYpIHsKLSAgICAgICAgICAgIGFmLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgbG9nLmVycm9yKGFmLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICBmYWlsKCJBbiB1bmV4cGVjdGVkIEF4aXNGYXVsdCB3YXMgdGhyb3duIGR1ZSB0byBhIG1pc3NpbmcgUmVwbHlUbyBoZWFkZXIuIik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgbG9nLmVycm9yKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIGZhaWwoIiBBbiBFeGNlcHRpb24gaGFzIG9jY3VyZWQgIiArIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNZXNzYWdlV2l0aE9taXR0ZWRUbygpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHRlc3RNZXNzYWdlV2l0aE9taXR0ZWRIZWFkZXJzKCJub1RvIik7Ci0gICAgICAgICAgICBmYWlsKCJBbiBBeGlzRmF1bHQgc2hvdWxkIGhhdmUgYmVlbiB0aHJvd24gZHVlIHRvIGEgbWlzc2luZyBUbyBoZWFkZXIuIik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEF4aXNGYXVsdCBhZikgewotICAgICAgICAgICAgLy90ZXN0IHBhc3NlZAotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIGxvZy5lcnJvcihlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICBmYWlsKCIgQW4gRXhjZXB0aW9uIGhhcyBvY2N1cmVkICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9oYW5kbGVycy9hZGRyZXNzaW5nL0FkZHJlc3NpbmdWYWxpZGF0aW9uSGFuZGxlclRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkZHJlc3NpbmcvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2hhbmRsZXJzL2FkZHJlc3NpbmcvQWRkcmVzc2luZ1ZhbGlkYXRpb25IYW5kbGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTdmODFmLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkZHJlc3NpbmcvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2hhbmRsZXJzL2FkZHJlc3NpbmcvQWRkcmVzc2luZ1ZhbGlkYXRpb25IYW5kbGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5oYW5kbGVycy5hZGRyZXNzaW5nOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5pbXBsLmJ1aWxkZXIuU3RBWFNPQVBNb2RlbEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkFkZHJlc3NpbmdDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5Jbk9ubHlBeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uSW5PdXRBeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaGFuZGxlcnMudXRpbC5UZXN0VXRpbDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLXB1YmxpYyBjbGFzcyBBZGRyZXNzaW5nVmFsaWRhdGlvbkhhbmRsZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgaW1wbGVtZW50cyBBZGRyZXNzaW5nQ29uc3RhbnRzIHsKLSAgICBBZGRyZXNzaW5nSW5IYW5kbGVyIGluSGFuZGxlciA9IG5ldyBBZGRyZXNzaW5nSW5IYW5kbGVyKCk7Ci0gICAgQWRkcmVzc2luZ1ZhbGlkYXRpb25IYW5kbGVyIHZhbGlkYXRpb25IYW5kbGVyID0gbmV3IEFkZHJlc3NpbmdWYWxpZGF0aW9uSGFuZGxlcigpOwotICAgIFN0cmluZyBhZGRyZXNzaW5nTmFtZXNwYWNlID0gQWRkcmVzc2luZ0NvbnN0YW50cy5GaW5hbC5XU0FfTkFNRVNQQUNFOwotICAgIFN0cmluZyB2ZXJzaW9uRGlyZWN0b3J5ID0gImZpbmFsIjsKLSAgICBUZXN0VXRpbCB0ZXN0VXRpbCA9IG5ldyBUZXN0VXRpbCgpOwotCi0gICAgcHJvdGVjdGVkIE1lc3NhZ2VDb250ZXh0IHRlc3RNZXNzYWdlV2l0aE9taXR0ZWRIZWFkZXJzKFN0cmluZyB0ZXN0TmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiB0ZXN0QWRkcmVzc2luZ01lc3NhZ2UoIm9taXR0ZWQtaGVhZGVyLW1lc3NhZ2VzIiwgdGVzdE5hbWUgKyAiTWVzc2FnZS54bWwiKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgTWVzc2FnZUNvbnRleHQgdGVzdEFkZHJlc3NpbmdNZXNzYWdlKFN0cmluZyBkaXJlY3RvcnksIFN0cmluZyB0ZXN0TmFtZSkKLSAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgdGVzdGZpbGUgPSBkaXJlY3RvcnkgKyAiLyIgKyB2ZXJzaW9uRGlyZWN0b3J5ICsgIi8iICsgdGVzdE5hbWU7Ci0KLSAgICAgICAgTWVzc2FnZUNvbnRleHQgbWMgPSBuZXcgTWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgbWMuc2V0Q29uZmlndXJhdGlvbkNvbnRleHQoQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5LmNyZWF0ZUVtcHR5Q29uZmlndXJhdGlvbkNvbnRleHQoKSk7Ci0gICAgICAgIFN0QVhTT0FQTW9kZWxCdWlsZGVyIG9tQnVpbGRlciA9IHRlc3RVdGlsLmdldE9NQnVpbGRlcih0ZXN0ZmlsZSk7Ci0gICAgICAgIG1jLnNldEVudmVsb3BlKG9tQnVpbGRlci5nZXRTT0FQRW52ZWxvcGUoKSk7Ci0KLSAgICAgICAgaW5IYW5kbGVyLmludm9rZShtYyk7Ci0KLSAgICAgICAgcmV0dXJuIG1jOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNZXNzYWdlV2l0aE9taXR0ZWRNZXNzYWdlSURJbk91dE1FUCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCA9IHRlc3RNZXNzYWdlV2l0aE9taXR0ZWRIZWFkZXJzKCJub01lc3NhZ2VJRCIpOwotICAgICAgICBTdHJpbmcgbWVzc2FnZUlEID0gbWVzc2FnZUNvbnRleHQuZ2V0T3B0aW9ucygpLmdldE1lc3NhZ2VJZCgpOwotCi0gICAgICAgIGFzc2VydE51bGwoIlRoZSBtZXNzYWdlIGlkIGlzIG5vdCBudWxsLiIsIG1lc3NhZ2VJRCk7Ci0KLSAgICAgICAgQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uID0gbmV3IEluT3V0QXhpc09wZXJhdGlvbigpOwotICAgICAgICBtZXNzYWdlQ29udGV4dC5zZXRBeGlzT3BlcmF0aW9uKGF4aXNPcGVyYXRpb24pOwotICAgICAgICBBeGlzU2VydmljZSBheGlzU2VydmljZSA9IG5ldyBBeGlzU2VydmljZSgpOwotICAgICAgICBtZXNzYWdlQ29udGV4dC5zZXRBeGlzU2VydmljZShheGlzU2VydmljZSk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHZhbGlkYXRpb25IYW5kbGVyLmludm9rZShtZXNzYWdlQ29udGV4dCk7Ci0gICAgICAgICAgICBmYWlsKCJBbiBBeGlzRmF1bHQgc2hvdWxkIGhhdmUgYmVlbiB0aHJvd24gZHVlIHRvIHRoZSBhYnNlbmNlIG9mIGEgbWVzc2FnZSBpZC4iKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoQXhpc0ZhdWx0IGFmKSB7Ci0gICAgICAgICAgICAvL1Rlc3QgcGFzc2VkLgotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE1lc3NhZ2VXaXRoT21pdHRlZE1lc3NhZ2VJREluT25seU1FUCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCA9IHRlc3RNZXNzYWdlV2l0aE9taXR0ZWRIZWFkZXJzKCJub01lc3NhZ2VJRCIpOwotICAgICAgICBTdHJpbmcgbWVzc2FnZUlEID0gbWVzc2FnZUNvbnRleHQuZ2V0T3B0aW9ucygpLmdldE1lc3NhZ2VJZCgpOwotCi0gICAgICAgIGFzc2VydE51bGwoIlRoZSBtZXNzYWdlIGlkIGlzIG5vdCBudWxsLiIsIG1lc3NhZ2VJRCk7Ci0KLSAgICAgICAgQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uID0gbmV3IEluT25seUF4aXNPcGVyYXRpb24oKTsKLSAgICAgICAgbWVzc2FnZUNvbnRleHQuc2V0QXhpc09wZXJhdGlvbihheGlzT3BlcmF0aW9uKTsKLSAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UgPSBuZXcgQXhpc1NlcnZpY2UoKTsKLSAgICAgICAgbWVzc2FnZUNvbnRleHQuc2V0QXhpc1NlcnZpY2UoYXhpc1NlcnZpY2UpOwotICAgICAgICB2YWxpZGF0aW9uSGFuZGxlci5pbnZva2UobWVzc2FnZUNvbnRleHQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNZXNzYWdlV2l0aE1lc3NhZ2VJREluT3V0TUVQKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0ID0gdGVzdE1lc3NhZ2VXaXRoT21pdHRlZEhlYWRlcnMoIm5vRnJvbSIpOwotICAgICAgICBTdHJpbmcgbWVzc2FnZUlEID0gbWVzc2FnZUNvbnRleHQuZ2V0T3B0aW9ucygpLmdldE1lc3NhZ2VJZCgpOwotCi0gICAgICAgIGFzc2VydE5vdE51bGwoIlRoZSBtZXNzYWdlIGlkIGlzIG51bGwuIiwgbWVzc2FnZUlEKTsKLQotICAgICAgICBBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb24gPSBuZXcgSW5PdXRBeGlzT3BlcmF0aW9uKCk7Ci0gICAgICAgIG1lc3NhZ2VDb250ZXh0LnNldEF4aXNPcGVyYXRpb24oYXhpc09wZXJhdGlvbik7Ci0gICAgICAgIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlID0gbmV3IEF4aXNTZXJ2aWNlKCk7Ci0gICAgICAgIG1lc3NhZ2VDb250ZXh0LnNldEF4aXNTZXJ2aWNlKGF4aXNTZXJ2aWNlKTsKLSAgICAgICAgdmFsaWRhdGlvbkhhbmRsZXIuaW52b2tlKG1lc3NhZ2VDb250ZXh0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW5PdXRNZXNzYWdlV2l0aE9taXR0ZWRNZXNzYWdlSUQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQgPSB0ZXN0TWVzc2FnZVdpdGhPbWl0dGVkSGVhZGVycygibm9NZXNzYWdlSUQiKTsKLSAgICAgICAgU3RyaW5nIG1lc3NhZ2VJRCA9IG1lc3NhZ2VDb250ZXh0LmdldE9wdGlvbnMoKS5nZXRNZXNzYWdlSWQoKTsKLQotICAgICAgICBhc3NlcnROdWxsKCJUaGUgbWVzc2FnZSBpZCBpcyBub3QgbnVsbC4iLCBtZXNzYWdlSUQpOwotCi0gICAgICAgIEF4aXNPcGVyYXRpb24gYXhpc09wZXJhdGlvbiA9IG5ldyBJbk91dEF4aXNPcGVyYXRpb24oKTsKLSAgICAgICAgbWVzc2FnZUNvbnRleHQuc2V0QXhpc09wZXJhdGlvbihheGlzT3BlcmF0aW9uKTsKLSAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UgPSBuZXcgQXhpc1NlcnZpY2UoKTsKLSAgICAgICAgbWVzc2FnZUNvbnRleHQuc2V0QXhpc1NlcnZpY2UoYXhpc1NlcnZpY2UpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB2YWxpZGF0aW9uSGFuZGxlci5pbnZva2UobWVzc2FnZUNvbnRleHQpOwotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgYXhpc0ZhdWx0KSB7Ci0gICAgICAgICAgICAvLyBDb25maXJtIHRoaXMgaXMgdGhlIGNvcnJlY3QgZmF1bHQKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiV3JvbmcgZmF1bHQgY29kZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFFOYW1lKEZpbmFsLldTQV9OQU1FU1BBQ0UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbmFsLkZBVUxUX0FERFJFU1NJTkdfSEVBREVSX1JFUVVJUkVEKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBheGlzRmF1bHQuZ2V0RmF1bHRDb2RlKCkpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGZhaWwoIlZhbGlkYXRlZCBtZXNzYWdlIHdpdGggbWlzc2luZyBtZXNzYWdlIElEISIpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2FkZHJlc3NpbmcvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2hhbmRsZXJzL3V0aWwvVGVzdFV0aWwuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2FkZHJlc3NpbmcvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2hhbmRsZXJzL3V0aWwvVGVzdFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFhNThiNS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9oYW5kbGVycy91dGlsL1Rlc3RVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuaGFuZGxlcnMudXRpbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5TdEFYVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLmltcGwuYnVpbGRlci5TdEFYU09BUE1vZGVsQnVpbGRlcjsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVSZWFkZXI7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0VXRpbCB7Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJTl9GSUxFX05BTUUgPSAic29hcG1lc3NhZ2UueG1sIjsKLSAgICBwcm90ZWN0ZWQgU3RBWFNPQVBNb2RlbEJ1aWxkZXIgYnVpbGRlcjsKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHRlc3RSZXNvdXJjZURpciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiYmFzZWRpciIsICIuIikgKyAiLyIgKyAidGVzdC1yZXNvdXJjZXMiOwotCi0KLSAgICBwdWJsaWMgU3RBWFNPQVBNb2RlbEJ1aWxkZXIgZ2V0T01CdWlsZGVyKFN0cmluZyBmaWxlTmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICgiIi5lcXVhbHMoZmlsZU5hbWUpIHx8IGZpbGVOYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIGZpbGVOYW1lID0gSU5fRklMRV9OQU1FOwotICAgICAgICB9Ci0gICAgICAgIFhNTFN0cmVhbVJlYWRlciBwYXJzZXIgPSBTdEFYVXRpbHMKLSAgICAgICAgICAgICAgICAuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGVSZWFkZXIoZ2V0VGVzdFJlc291cmNlRmlsZShmaWxlTmFtZSkpKTsKLSAgICAgICAgYnVpbGRlciA9IG5ldyBTdEFYU09BUE1vZGVsQnVpbGRlcihwYXJzZXIsIG51bGwpOwotICAgICAgICByZXR1cm4gYnVpbGRlcjsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgRmlsZSBnZXRUZXN0UmVzb3VyY2VGaWxlKFN0cmluZyByZWxhdGl2ZVBhdGgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBGaWxlKHRlc3RSZXNvdXJjZURpciwgcmVsYXRpdmVQYXRoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9jbHVzdGVyaW5nL3BvbS54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9jbHVzdGVyaW5nL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwZTJhOWUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvY2x1c3RlcmluZy9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIKLSAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItcGFyZW50PC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4xLjUuMTwvdmVyc2lvbj4KLSAgICAgICAgPHJlbGF0aXZlUGF0aD4uLi9wYXJlbnQvcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgotICAgIDwvcGFyZW50PgotICAgIDxhcnRpZmFjdElkPmF4aXMyLWNsdXN0ZXJpbmc8L2FydGlmYWN0SWQ+Ci0gICAgPG5hbWU+QXBhY2hlIEF4aXMyIC0gQ2x1c3RlcmluZzwvbmFtZT4KLSAgICA8ZGVzY3JpcHRpb24+QXhpczIgQ2x1c3RlcmluZyBtb2R1bGU8L2Rlc2NyaXB0aW9uPgotICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLWtlcm5lbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7dmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItdHJhbnNwb3J0LWh0dHA8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3ZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLXRyYW5zcG9ydC1sb2NhbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7dmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLnRvbWNhdDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnRyaWJlczwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUudG9tY2F0PC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+anVsaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgIDwvZGVwZW5kZW5jaWVzPgotICAgIDxidWlsZD4KLSAgICAgICAgPHNvdXJjZURpcmVjdG9yeT5zcmM8L3NvdXJjZURpcmVjdG9yeT4KLSAgICAgICAgPHRlc3RTb3VyY2VEaXJlY3Rvcnk+dGVzdDwvdGVzdFNvdXJjZURpcmVjdG9yeT4KLSAgICAgICAgPHJlc291cmNlcz4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PmNvbmY8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqLyoucHJvcGVydGllczwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1ZGVzPgotICAgICAgICAgICAgICAgIDxmaWx0ZXJpbmc+ZmFsc2U8L2ZpbHRlcmluZz4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmM8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqLyouamF2YTwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1ZGVzPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5Pi4uLy4uPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5OT1RJQ0UudHh0PC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5MSUNFTlNFLnR4dDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgICAgIDxmaWx0ZXJpbmc+ZmFsc2U8L2ZpbHRlcmluZz4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgIDwvcmVzb3VyY2VzPgotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8c2tpcD5mYWxzZTwvc2tpcD4KLSAgICAgICAgICAgICAgICAgICAgPHN5c3RlbVByb3BlcnRpZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+bWF2ZW4udGVzdC5oYWx0YWZ0ZXJmYWlsdXJlPC9uYW1lPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2YWx1ZT5mYWxzZTwvdmFsdWU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3Byb3BlcnR5PgotICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnJ1bi5jbHVzdGVyaW5nLnRlc3RzPC9uYW1lPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2YWx1ZT4ke3J1bi5jbHVzdGVyaW5nLnRlc3RzfTwvdmFsdWU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3Byb3BlcnR5PgotICAgICAgICAgICAgICAgICAgICA8L3N5c3RlbVByb3BlcnRpZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqL1VwZGF0ZVN0YXRlVGVzdC5qYXZhPC9leGNsdWRlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovQ29uZmlndXJhdGlvbk1hbmFnZXJUZXN0LmphdmE8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLypUZXN0LmphdmE8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgIDwvcGx1Z2lucz4KLSAgICA8L2J1aWxkPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL0NsdXN0ZXJpbmdVdGlscy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL0NsdXN0ZXJpbmdVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmNhNjE1Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2NsdXN0ZXJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9DbHVzdGVyaW5nVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC5EZXBsb3ltZW50RW5naW5lOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2VHcm91cDsKLQotaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5SYW5kb207Ci0KLS8qKgotICogIEEgVXRpbGl0eSBmb3IgaGFuZGxpbmcgc29tZSBvZiB0aGUgZnVuY3Rpb25zIG5lZWRlZCBieSB0aGUgY2x1c3RlcmluZyBpbXBsZW1lbnRhdGlvbgotICovCi1wdWJsaWMgY2xhc3MgQ2x1c3RlcmluZ1V0aWxzIHsKLQotICAgIC8qKgotICAgICAqIExvYWQgYSBTZXJ2aWNlR3JvdXAgaGF2aW5nIG5hbWUgPGNvZGU+c2VydmljZUdyb3VwTmFtZTwvY29kZT4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzZXJ2aWNlR3JvdXBOYW1lCi0gICAgICogQHBhcmFtIGNvbmZpZ0N0eAotICAgICAqIEBwYXJhbSB0ZW1wRGlyZWN0b3J5Ci0gICAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9hZFNlcnZpY2VHcm91cChTdHJpbmcgc2VydmljZUdyb3VwTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRlbXBEaXJlY3RvcnkpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIXNlcnZpY2VHcm91cE5hbWUuZW5kc1dpdGgoIi5hYXIiKSkgewotICAgICAgICAgICAgc2VydmljZUdyb3VwTmFtZSArPSAiLmFhciI7Ci0gICAgICAgIH0KLSAgICAgICAgRmlsZSBzZXJ2aWNlQXJjaGl2ZTsKLSAgICAgICAgU3RyaW5nIGF4aXMyUmVwbyA9IFN5c3RlbS5nZXRQcm9wZXJ0eShDb25zdGFudHMuQVhJUzJfUkVQTyk7Ci0gICAgICAgIGlmIChpc1VSTChheGlzMlJlcG8pKSB7Ci0gICAgICAgICAgICBEYXRhSGFuZGxlciBkaCA9IG5ldyBEYXRhSGFuZGxlcihuZXcgVVJMKGF4aXMyUmVwbyArICJzZXJ2aWNlcy8iICsgc2VydmljZUdyb3VwTmFtZSkpOwotICAgICAgICAgICAgU3RyaW5nIHRlbXBEaXIgPQotICAgICAgICAgICAgICAgICAgICB0ZW1wRGlyZWN0b3J5ICsgRmlsZS5zZXBhcmF0b3IgKwotICAgICAgICAgICAgICAgICAgICAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyBuZXcgUmFuZG9tKCkubmV4dERvdWJsZSgpKTsKLSAgICAgICAgICAgIG5ldyBGaWxlKHRlbXBEaXIpLm1rZGlycygpOwotICAgICAgICAgICAgc2VydmljZUFyY2hpdmUgPSBuZXcgRmlsZSh0ZW1wRGlyICsgRmlsZS5zZXBhcmF0b3IgKyBzZXJ2aWNlR3JvdXBOYW1lKTsKLSAgICAgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oc2VydmljZUFyY2hpdmUpOwotICAgICAgICAgICAgZGgud3JpdGVUbyhvdXQpOwotICAgICAgICAgICAgb3V0LmNsb3NlKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzZXJ2aWNlQXJjaGl2ZSA9IG5ldyBGaWxlKGF4aXMyUmVwbyArIEZpbGUuc2VwYXJhdG9yICsgInNlcnZpY2VzIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUuc2VwYXJhdG9yICsgc2VydmljZUdyb3VwTmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoIXNlcnZpY2VBcmNoaXZlLmV4aXN0cygpKXsKLSAgICAgICAgICAgIHRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oIkZpbGUgIiArIHNlcnZpY2VBcmNoaXZlICsgIiBub3QgZm91bmQiKTsKLSAgICAgICAgfQotICAgICAgICBBeGlzU2VydmljZUdyb3VwIGFzR3JvdXAgPQotICAgICAgICAgICAgICAgIERlcGxveW1lbnRFbmdpbmUubG9hZFNlcnZpY2VHcm91cChzZXJ2aWNlQXJjaGl2ZSwgY29uZmlnQ3R4KTsKLSAgICAgICAgY29uZmlnQ3R4LmdldEF4aXNDb25maWd1cmF0aW9uKCkuYWRkU2VydmljZUdyb3VwKGFzR3JvdXApOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNVUkwoU3RyaW5nIGxvY2F0aW9uKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBuZXcgVVJMKGxvY2F0aW9uKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL0RlZmF1bHRMb2FkQmFsYW5jZUV2ZW50SGFuZGxlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL0RlZmF1bHRMb2FkQmFsYW5jZUV2ZW50SGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDU1ZGJhLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2NsdXN0ZXJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9EZWZhdWx0TG9hZEJhbGFuY2VFdmVudEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gKiBDb3B5cmlnaHQgMjAwNCwyMDA1IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgICAgICAgICAgICAgCi0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICAgICAgICAgICAgCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlICAgICAgICAgCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAgICAgICAgICAgCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gICAgCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kICAgICAgICAgCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOwotaW1wb3J0IGphdmEubmV0LkluZXRTb2NrZXRBZGRyZXNzOwotaW1wb3J0IGphdmEubmV0LlNvY2tldDsKLWltcG9ydCBqYXZhLm5ldC5Tb2NrZXRBZGRyZXNzOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIExvYWRCYWxhbmNlRXZlbnRIYW5kbGVyfQotICovCi1wdWJsaWMgY2xhc3MgRGVmYXVsdExvYWRCYWxhbmNlRXZlbnRIYW5kbGVyIGltcGxlbWVudHMgTG9hZEJhbGFuY2VFdmVudEhhbmRsZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKERlZmF1bHRMb2FkQmFsYW5jZUV2ZW50SGFuZGxlci5jbGFzcyk7Ci0gICAgcHJpdmF0ZSBMaXN0PE1lbWJlcj4gbWVtYmVycyA9IG5ldyBBcnJheUxpc3Q8TWVtYmVyPigpOwotCi0gICAgcHVibGljIHZvaWQgYXBwbGljYXRpb25NZW1iZXJBZGRlZChNZW1iZXIgbWVtYmVyKSB7Ci0gICAgICAgIFRocmVhZCB0aCA9IG5ldyBUaHJlYWQobmV3IE1lbWJlckFkZGVyKG1lbWJlcikpOwotICAgICAgICB0aC5zZXRQcmlvcml0eShUaHJlYWQuTUFYX1BSSU9SSVRZKTsKLSAgICAgICAgdGguc3RhcnQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhcHBsaWNhdGlvbk1lbWJlclJlbW92ZWQoTWVtYmVyIG1lbWJlcikgewotICAgICAgICBsb2cuaW5mbygiQXBwbGljYXRpb24gbWVtYmVyICIgKyBtZW1iZXIgKyAiIGxlZnQgY2x1c3Rlci4iKTsKLSAgICAgICAgbWVtYmVycy5yZW1vdmUobWVtYmVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxNZW1iZXI+IGdldE1lbWJlcnMoKSB7Ci0gICAgICAgIHJldHVybiBtZW1iZXJzOwotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgTWVtYmVyQWRkZXIgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBNZW1iZXIgbWVtYmVyOwotCi0gICAgICAgIHByaXZhdGUgTWVtYmVyQWRkZXIoTWVtYmVyIG1lbWJlcikgewotICAgICAgICAgICAgdGhpcy5tZW1iZXIgPSBtZW1iZXI7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICBpZiAobWVtYmVycy5jb250YWlucyhtZW1iZXIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGNhbkNvbm5lY3QobWVtYmVyKSkgewotICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMDApOyAgIC8vIFNsZWVwIGZvciBzb21ldGltZSB0byBhbGxvdyBjb21wbGV0ZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgbm9kZQotICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCFtZW1iZXJzLmNvbnRhaW5zKG1lbWJlcikpIHsKLSAgICAgICAgICAgICAgICAgICAgbWVtYmVycy5hZGQobWVtYmVyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbG9nLmluZm8oIkFwcGxpY2F0aW9uIG1lbWJlciAiICsgbWVtYmVyICsgIiBqb2luZWQgYXBwbGljYXRpb24gY2x1c3RlciIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIkNvdWxkIG5vdCBhZGQgYXBwbGljYXRpb24gbWVtYmVyICIgKyBtZW1iZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEJlZm9yZSBhZGRpbmcgYSBtZW1iZXIsIHdlIHdpbGwgdHJ5IHRvIHZlcmlmeSB3aGV0aGVyIHdlIGNhbiBjb25uZWN0IHRvIGl0Ci0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBtZW1iZXIgVGhlIG1lbWJlciB3aG9zZSBjb25uZWN0dml0eSBuZWVkcyB0byBiZSB2ZXJpZmllZAotICAgICAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBtZW1iZXIgY2FuIGJlIGNvbnRhY3RlZDsgZmFsc2UsIG90aGVyd2lzZS4KLSAgICAgICAgICovCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBjYW5Db25uZWN0KE1lbWJlciBtZW1iZXIpIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiVHJ5aW5nIHRvIGNvbm5lY3QgdG8gbWVtYmVyICIgKyBtZW1iZXIgKyAiLi4uIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKGludCByZXRyaWVzID0gMzA7IHJldHJpZXMgPiAwOyByZXRyaWVzLS0pIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBJbmV0QWRkcmVzcyBhZGRyID0gSW5ldEFkZHJlc3MuZ2V0QnlOYW1lKG1lbWJlci5nZXRIb3N0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGh0dHBQb3J0ID0gbWVtYmVyLmdldEh0dHBQb3J0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJIVFRQIFBvcnQ9IiArIGh0dHBQb3J0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoaHR0cFBvcnQgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNvY2tldEFkZHJlc3MgaHR0cFNvY2thZGRyID0gbmV3IEluZXRTb2NrZXRBZGRyZXNzKGFkZHIsIGh0dHBQb3J0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTb2NrZXQoKS5jb25uZWN0KGh0dHBTb2NrYWRkciwgMTAwMDApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGludCBodHRwc1BvcnQgPSBtZW1iZXIuZ2V0SHR0cHNQb3J0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJIVFRQUyBQb3J0PSIgKyBodHRwc1BvcnQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChodHRwc1BvcnQgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNvY2tldEFkZHJlc3MgaHR0cHNTb2NrYWRkciA9IG5ldyBJbmV0U29ja2V0QWRkcmVzcyhhZGRyLCBodHRwc1BvcnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFNvY2tldCgpLmNvbm5lY3QoaHR0cHNTb2NrYWRkciwgMTAwMDApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIiIsIGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPSBlLmdldE1lc3NhZ2UoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1zZy5pbmRleE9mKCJDb25uZWN0aW9uIHJlZnVzZWQiKSA9PSAtMSAmJiBtc2cuaW5kZXhPZigiY29ubmVjdCB0aW1lZCBvdXQiKSA9PSAtMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKCJDYW5ub3QgY29ubmVjdCB0byBtZW1iZXIgIiArIG1lbWJlciwgZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWdub3JlZCkgewotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL01lbWJlcnNoaXBMaXN0ZW5lckltcGwuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2NsdXN0ZXJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9NZW1iZXJzaGlwTGlzdGVuZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyZDg3NGUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL01lbWJlcnNoaXBMaXN0ZW5lckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqIENvcHlyaWdodCAyMDA0LDIwMDUgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAgICAgICAgICAgICAKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gICAgICAgICAgICAKLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgICAgICAgICAKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsICAgICAgICAgICAKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgICAKLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgICAgICAgICAKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmc7Ci0KLS8qKgotICoKLSAqLwotcHVibGljIGNsYXNzIE1lbWJlcnNoaXBMaXN0ZW5lckltcGwgaW1wbGVtZW50cyBNZW1iZXJzaGlwTGlzdGVuZXJ7Ci0gICAgcHVibGljIHZvaWQgbWVtYmVyQWRkZWQoTWVtYmVyIG1lbWJlciwgYm9vbGVhbiBpc0xvY2FsTWVtYmVyQ29vcmRpbmF0b3IpIHsKLSAgICAgICAgLy9UT0RPOiBNZXRob2QgaW1wbGVtZW50YXRpb24KLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG1lbWJlckRpc2FwcGVhcmVkKE1lbWJlciBtZW1iZXIsIGJvb2xlYW4gaXNMb2NhbE1lbWJlckNvb3JkaW5hdG9yKSB7Ci0gICAgICAgIC8vVE9ETzogTWV0aG9kIGltcGxlbWVudGF0aW9uCi0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvTWVtYmVyc2hpcFNjaGVtZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL01lbWJlcnNoaXBTY2hlbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRkMmQ2Yy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvTWVtYmVyc2hpcFNjaGVtZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICogQ29weXJpZ2h0IDIwMDQsMjAwNSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7ICAgICAgICAgICAgIAotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgICAgICAgICAgIAotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAgICAgICAgIAotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgICAgICAgICAgIAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICAgIAotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAgICAgICAgIAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZzsKLQotLyoqCi0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIGEgbWVtYmVyc2hpcCBzY2hlbWUgc3VjaCBhcyAibXVsdGljYXN0IGJhc2VkIiBvciAid2VsbC1rbm93biBhZGRyZXNzIChXS0EpCi0gKiBiYXNlZCIgc2NoZW1lcy4gVGhpcyBpcyBkaXJlY3RseSByZWxhdGVkIHRvIHRoZSBtZW1iZXJzaGlwIGRpc2NvdmVyeSBtZWNoYW5pc20uCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWVtYmVyc2hpcFNjaGVtZSB7Ci0KLSAgICAvKioKLSAgICAgKiBJbml0aWFsaXplIHRoaXMgbWVtYmVyc2hpcCBzY2hlbWUKLSAgICAgKgotICAgICAqIEB0aHJvd3MgQ2x1c3RlcmluZ0ZhdWx0IElmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBpbml0aWFsaXppbmcKLSAgICAgKi8KLSAgICB2b2lkIGluaXQoKSB0aHJvd3MgQ2x1c3RlcmluZ0ZhdWx0OwotCi0gICAgLyoqCi0gICAgICogSk9JTiB0aGUgZ3JvdXAKLSAgICAgKgotICAgICAqIEB0aHJvd3MgQ2x1c3RlcmluZ0ZhdWx0IElmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBqb2luaW5nIHRoZSBncm91cAotICAgICAqLwotICAgIHZvaWQgam9pbkdyb3VwKCkgdGhyb3dzIENsdXN0ZXJpbmdGYXVsdDsKLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL2NvbmZpZ3VyYXRpb24vQ29uZmlndXJhdGlvbkNsdXN0ZXJpbmdDb21tYW5kRmFjdG9yeS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL2NvbmZpZ3VyYXRpb24vQ29uZmlndXJhdGlvbkNsdXN0ZXJpbmdDb21tYW5kRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWVmYmJiLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2NsdXN0ZXJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9jb25maWd1cmF0aW9uL0NvbmZpZ3VyYXRpb25DbHVzdGVyaW5nQ29tbWFuZEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLmNvbmZpZ3VyYXRpb247Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBDb25maWd1cmF0aW9uQ2x1c3RlcmluZ0NvbW1hbmRGYWN0b3J5IHsKLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2NsdXN0ZXJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9jb25maWd1cmF0aW9uL0RlZmF1bHRDb25maWd1cmF0aW9uTWFuYWdlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL2NvbmZpZ3VyYXRpb24vRGVmYXVsdENvbmZpZ3VyYXRpb25NYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3ZGQxYmEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL2NvbmZpZ3VyYXRpb24vRGVmYXVsdENvbmZpZ3VyYXRpb25NYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuY29uZmlndXJhdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5DbHVzdGVyaW5nRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLk1lc3NhZ2VTZW5kZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLmNvbmZpZ3VyYXRpb24uY29tbWFuZHMuQXBwbHlTZXJ2aWNlUG9saWN5Q29tbWFuZDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuY29uZmlndXJhdGlvbi5jb21tYW5kcy5Db21taXRDb21tYW5kOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5jb25maWd1cmF0aW9uLmNvbW1hbmRzLkV4Y2VwdGlvbkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLmNvbmZpZ3VyYXRpb24uY29tbWFuZHMuTG9hZFNlcnZpY2VHcm91cHNDb21tYW5kOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5jb25maWd1cmF0aW9uLmNvbW1hbmRzLlByZXBhcmVDb21tYW5kOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5jb25maWd1cmF0aW9uLmNvbW1hbmRzLlJlbG9hZENvbmZpZ3VyYXRpb25Db21tYW5kOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5jb25maWd1cmF0aW9uLmNvbW1hbmRzLlJvbGxiYWNrQ29tbWFuZDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuY29uZmlndXJhdGlvbi5jb21tYW5kcy5VbmxvYWRTZXJ2aWNlR3JvdXBzQ29tbWFuZDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5QYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1wdWJsaWMgY2xhc3MgRGVmYXVsdENvbmZpZ3VyYXRpb25NYW5hZ2VyIGltcGxlbWVudHMgQ29uZmlndXJhdGlvbk1hbmFnZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhEZWZhdWx0Q29uZmlndXJhdGlvbk1hbmFnZXIuY2xhc3MpOwotCi0gICAgcHJpdmF0ZSBDb25maWd1cmF0aW9uTWFuYWdlckxpc3RlbmVyIGxpc3RlbmVyOwotICAgIHByaXZhdGUgTWVzc2FnZVNlbmRlciBzZW5kZXI7Ci0gICAgcHJpdmF0ZSBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWd1cmF0aW9uQ29udGV4dDsKLSAgICBwcml2YXRlIE1hcCBwYXJhbWV0ZXJzID0gbmV3IEhhc2hNYXAoKTsKLQotICAgIHB1YmxpYyBEZWZhdWx0Q29uZmlndXJhdGlvbk1hbmFnZXIoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q29uZmlndXJhdGlvbk1hbmFnZXJMaXN0ZW5lcihDb25maWd1cmF0aW9uTWFuYWdlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgIGlmIChjb25maWd1cmF0aW9uQ29udGV4dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBsaXN0ZW5lci5zZXRDb25maWd1cmF0aW9uQ29udGV4dChjb25maWd1cmF0aW9uQ29udGV4dCk7Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy5saXN0ZW5lciA9IGxpc3RlbmVyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFwcGx5UG9saWN5KFN0cmluZyBzZXJ2aWNlR3JvdXBOYW1lLCBTdHJpbmcgcG9saWN5KSB0aHJvd3MgQ2x1c3RlcmluZ0ZhdWx0IHsKLSAgICAgICAgbG9nLmRlYnVnKCJFbnRlcjogRGVmYXVsdENvbmZpZ3VyYXRpb25NYW5hZ2VyOjphcHBseVBvbGljeSIpOwotCi0gICAgICAgIEFwcGx5U2VydmljZVBvbGljeUNvbW1hbmQgY29tbWFuZCA9IG5ldyBBcHBseVNlcnZpY2VQb2xpY3lDb21tYW5kKCk7Ci0gICAgICAgIGNvbW1hbmQuc2V0U2VydmljZU5hbWUoc2VydmljZUdyb3VwTmFtZSk7Ci0gICAgICAgIGNvbW1hbmQuc2V0UG9saWN5KHBvbGljeSk7Ci0gICAgICAgIHNlbmQoY29tbWFuZCk7Ci0KLSAgICAgICAgbG9nLmRlYnVnKCJFeGl0OiBEZWZhdWx0Q29uZmlndXJhdGlvbk1hbmFnZXI6OmFwcGx5UG9saWN5Iik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY29tbWl0KCkgdGhyb3dzIENsdXN0ZXJpbmdGYXVsdCB7Ci0gICAgICAgIENvbW1pdENvbW1hbmQgY29tbWFuZCA9IG5ldyBDb21taXRDb21tYW5kKCk7Ci0gICAgICAgIHNlbmQoY29tbWFuZCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZXhjZXB0aW9uT2NjdXJyZWQoVGhyb3dhYmxlIHRocm93YWJsZSkgdGhyb3dzIENsdXN0ZXJpbmdGYXVsdCB7Ci0gICAgICAgIHNlbmRlci5zZW5kVG9Hcm91cChuZXcgRXhjZXB0aW9uQ29tbWFuZCh0aHJvd2FibGUpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBsb2FkU2VydmljZUdyb3VwcyhTdHJpbmdbXSBzZXJ2aWNlR3JvdXBOYW1lcykgdGhyb3dzIENsdXN0ZXJpbmdGYXVsdCB7Ci0KLSAgICAgICAgbG9nLmRlYnVnKCJFbnRlcjogRGVmYXVsdENvbmZpZ3VyYXRpb25NYW5hZ2VyOjpsb2FkU2VydmljZUdyb3VwcyIpOwotCi0gICAgICAgIExvYWRTZXJ2aWNlR3JvdXBzQ29tbWFuZCBjb21tYW5kID0gbmV3IExvYWRTZXJ2aWNlR3JvdXBzQ29tbWFuZCgpOwotICAgICAgICBjb21tYW5kLnNldFNlcnZpY2VHcm91cE5hbWVzKHNlcnZpY2VHcm91cE5hbWVzKTsKLSAgICAgICAgc2VuZChjb21tYW5kKTsKLQotICAgICAgICBsb2cuZGVidWcoIkV4aXQ6IERlZmF1bHRDb25maWd1cmF0aW9uTWFuYWdlcjo6bG9hZFNlcnZpY2VHcm91cHMiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcmVwYXJlKCkgdGhyb3dzIENsdXN0ZXJpbmdGYXVsdCB7Ci0KLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIkVudGVyOiBEZWZhdWx0Q29uZmlndXJhdGlvbk1hbmFnZXI6OnByZXBhcmUiKTsKLSAgICAgICAgfQotCi0gICAgICAgIFByZXBhcmVDb21tYW5kIGNvbW1hbmQgPSBuZXcgUHJlcGFyZUNvbW1hbmQoKTsKLSAgICAgICAgc2VuZChjb21tYW5kKTsKLQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiRXhpdDogRGVmYXVsdENvbmZpZ3VyYXRpb25NYW5hZ2VyOjpwcmVwYXJlIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZWxvYWRDb25maWd1cmF0aW9uKCkgdGhyb3dzIENsdXN0ZXJpbmdGYXVsdCB7Ci0KLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIkVudGVyOiBEZWZhdWx0Q29uZmlndXJhdGlvbk1hbmFnZXI6OnJlbG9hZENvbmZpZ3VyYXRpb24iKTsKLSAgICAgICAgfQotCi0gICAgICAgIFJlbG9hZENvbmZpZ3VyYXRpb25Db21tYW5kIGNvbW1hbmQgPSBuZXcgUmVsb2FkQ29uZmlndXJhdGlvbkNvbW1hbmQoKTsKLSAgICAgICAgc2VuZChjb21tYW5kKTsKLQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiRXhpdDogRGVmYXVsdENvbmZpZ3VyYXRpb25NYW5hZ2VyOjpyZWxvYWRDb25maWd1cmF0aW9uIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByb2xsYmFjaygpIHRocm93cyBDbHVzdGVyaW5nRmF1bHQgewotCi0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJFbnRlcjogRGVmYXVsdENvbmZpZ3VyYXRpb25NYW5hZ2VyOjpyb2xsYmFjayIpOwotICAgICAgICB9Ci0KLSAgICAgICAgUm9sbGJhY2tDb21tYW5kIGNvbW1hbmQgPSBuZXcgUm9sbGJhY2tDb21tYW5kKCk7Ci0gICAgICAgIHNlbmQoY29tbWFuZCk7Ci0KLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIkV4aXQ6IERlZmF1bHRDb25maWd1cmF0aW9uTWFuYWdlcjo6cm9sbGJhY2siKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHVubG9hZFNlcnZpY2VHcm91cHMoU3RyaW5nW10gc2VydmljZUdyb3VwTmFtZXMpIHRocm93cyBDbHVzdGVyaW5nRmF1bHQgewotCi0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJFbnRlcjogRGVmYXVsdENvbmZpZ3VyYXRpb25NYW5hZ2VyOjp1bmxvYWRTZXJ2aWNlR3JvdXBzIik7Ci0gICAgICAgIH0KLQotICAgICAgICBVbmxvYWRTZXJ2aWNlR3JvdXBzQ29tbWFuZCBjb21tYW5kID0gbmV3IFVubG9hZFNlcnZpY2VHcm91cHNDb21tYW5kKCk7Ci0gICAgICAgIGNvbW1hbmQuc2V0U2VydmljZUdyb3VwTmFtZXMoc2VydmljZUdyb3VwTmFtZXMpOwotICAgICAgICBzZW5kKGNvbW1hbmQpOwotCi0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJFeGl0OiBEZWZhdWx0Q29uZmlndXJhdGlvbk1hbmFnZXI6OnVubG9hZFNlcnZpY2VHcm91cHMiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNlbmQoVGhyb3dhYmxlIHRocm93YWJsZSkgdGhyb3dzIENsdXN0ZXJpbmdGYXVsdCB7Ci0gICAgICAgIHNlbmRlci5zZW5kVG9Hcm91cChuZXcgRXhjZXB0aW9uQ29tbWFuZCh0aHJvd2FibGUpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZW5kKENvbmZpZ3VyYXRpb25DbHVzdGVyaW5nQ29tbWFuZCBjb21tYW5kKSB0aHJvd3MgQ2x1c3RlcmluZ0ZhdWx0IHsKLSAgICAgICAgc2VuZGVyLnNlbmRUb0dyb3VwKGNvbW1hbmQpOwotCi0gICAgICAgIC8vIE5lZWQgdG8gc2VuZCB0aGUgbWVzc2FnZSB0byBzZWxmIHRvbwotICAgICAgICBzZW5kZXIuc2VuZFRvU2VsZihjb21tYW5kKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTZW5kZXIoTWVzc2FnZVNlbmRlciBzZW5kZXIpIHsKLSAgICAgICAgdGhpcy5zZW5kZXIgPSBzZW5kZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJvY2VzcyhDb25maWd1cmF0aW9uQ2x1c3RlcmluZ0NvbW1hbmQgY29tbWFuZCkgdGhyb3dzIENsdXN0ZXJpbmdGYXVsdCB7Ci0KLSAgICAgICAgc3dpdGNoIChjb21tYW5kLmdldENvbW1hbmRUeXBlKCkpIHsKLSAgICAgICAgICAgIGNhc2UgQ29uZmlndXJhdGlvbkNsdXN0ZXJpbmdDb21tYW5kLlJFTE9BRF9DT05GSUdVUkFUSU9OOgotICAgICAgICAgICAgICAgIGxpc3RlbmVyLmNvbmZpZ3VyYXRpb25SZWxvYWRlZChjb21tYW5kKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQ29uZmlndXJhdGlvbkNsdXN0ZXJpbmdDb21tYW5kLkxPQURfU0VSVklDRV9HUk9VUFM6Ci0gICAgICAgICAgICAgICAgbGlzdGVuZXIuc2VydmljZUdyb3Vwc0xvYWRlZChjb21tYW5kKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQ29uZmlndXJhdGlvbkNsdXN0ZXJpbmdDb21tYW5kLlVOTE9BRF9TRVJWSUNFX0dST1VQUzoKLSAgICAgICAgICAgICAgICBsaXN0ZW5lci5zZXJ2aWNlR3JvdXBzVW5sb2FkZWQoY29tbWFuZCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIENvbmZpZ3VyYXRpb25DbHVzdGVyaW5nQ29tbWFuZC5BUFBMWV9TRVJWSUNFX1BPTElDWToKLSAgICAgICAgICAgICAgICBsaXN0ZW5lci5wb2xpY3lBcHBsaWVkKGNvbW1hbmQpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBDb25maWd1cmF0aW9uQ2x1c3RlcmluZ0NvbW1hbmQuUFJFUEFSRToKLSAgICAgICAgICAgICAgICBsaXN0ZW5lci5wcmVwYXJlQ2FsbGVkKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIENvbmZpZ3VyYXRpb25DbHVzdGVyaW5nQ29tbWFuZC5DT01NSVQ6Ci0gICAgICAgICAgICAgICAgbGlzdGVuZXIuY29tbWl0Q2FsbGVkKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIENvbmZpZ3VyYXRpb25DbHVzdGVyaW5nQ29tbWFuZC5ST0xMQkFDSzoKLSAgICAgICAgICAgICAgICBsaXN0ZW5lci5yb2xsYmFja0NhbGxlZCgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBDb25maWd1cmF0aW9uQ2x1c3RlcmluZ0NvbW1hbmQuRVhDRVBUSU9OOgotICAgICAgICAgICAgICAgIGxpc3RlbmVyLmhhbmRsZUV4Y2VwdGlvbigoKEV4Y2VwdGlvbkNvbW1hbmQpIGNvbW1hbmQpLmdldEV4Y2VwdGlvbigpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENsdXN0ZXJpbmdGYXVsdCgiSW52YWxpZCBDb25maWd1cmF0aW9uQ2x1c3RlcmluZ0NvbW1hbmQgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENvbmZpZ3VyYXRpb25Db250ZXh0KENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ3VyYXRpb25Db250ZXh0KSB7Ci0gICAgICAgIHRoaXMuY29uZmlndXJhdGlvbkNvbnRleHQgPSBjb25maWd1cmF0aW9uQ29udGV4dDsKLSAgICAgICAgaWYgKGxpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGxpc3RlbmVyLnNldENvbmZpZ3VyYXRpb25Db250ZXh0KGNvbmZpZ3VyYXRpb25Db250ZXh0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFBhcmFtZXRlcihQYXJhbWV0ZXIgcGFyYW0pIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBwYXJhbWV0ZXJzLnB1dChwYXJhbS5nZXROYW1lKCksIHBhcmFtKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVQYXJhbWV0ZXIoUGFyYW1ldGVyIHBhcmFtKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgcGFyYW1ldGVycy5yZW1vdmUocGFyYW0uZ2V0TmFtZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUGFyYW1ldGVyIGdldFBhcmFtZXRlcihTdHJpbmcgbmFtZSkgewotICAgICAgICByZXR1cm4gKFBhcmFtZXRlcikgcGFyYW1ldGVycy5nZXQobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIEFycmF5TGlzdCBnZXRQYXJhbWV0ZXJzKCkgewotICAgICAgICBBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gcGFyYW1ldGVycy5rZXlTZXQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIGxpc3QuYWRkKHBhcmFtZXRlcnMuZ2V0KGl0ZXIubmV4dCgpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGxpc3Q7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNQYXJhbWV0ZXJMb2NrZWQoU3RyaW5nIHBhcmFtZXRlck5hbWUpIHsKLSAgICAgICAgcmV0dXJuIGdldFBhcmFtZXRlcihwYXJhbWV0ZXJOYW1lKS5pc0xvY2tlZCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRlc2VyaWFsaXplUGFyYW1ldGVycyhPTUVsZW1lbnQgcGFyYW1ldGVyRWxlbWVudCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2NsdXN0ZXJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9jb25maWd1cmF0aW9uL0RlZmF1bHRDb25maWd1cmF0aW9uTWFuYWdlckxpc3RlbmVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvY29uZmlndXJhdGlvbi9EZWZhdWx0Q29uZmlndXJhdGlvbk1hbmFnZXJMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjk4MDA2Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2NsdXN0ZXJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9jb25maWd1cmF0aW9uL0RlZmF1bHRDb25maWd1cmF0aW9uTWFuYWdlckxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgRGVmYXVsdENvbmZpZ3VyYXRpb25NYW5hZ2VyTGlzdGVuZXIgaW1wbGVtZW50cyBDb25maWd1cmF0aW9uTWFuYWdlckxpc3RlbmVyewotICAgIHB1YmxpYyB2b2lkIHNlcnZpY2VHcm91cHNMb2FkZWQoQ29uZmlndXJhdGlvbkNsdXN0ZXJpbmdDb21tYW5kIGNvbW1hbmQpIHsKLSAgICAgICAgLy9UT0RPOiBNZXRob2QgaW1wbGVtZW50YXRpb24KLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNlcnZpY2VHcm91cHNVbmxvYWRlZChDb25maWd1cmF0aW9uQ2x1c3RlcmluZ0NvbW1hbmQgY29tbWFuZCkgewotICAgICAgICAvL1RPRE86IE1ldGhvZCBpbXBsZW1lbnRhdGlvbgotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcG9saWN5QXBwbGllZChDb25maWd1cmF0aW9uQ2x1c3RlcmluZ0NvbW1hbmQgY29tbWFuZCkgewotICAgICAgICAvL1RPRE86IE1ldGhvZCBpbXBsZW1lbnRhdGlvbgotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY29uZmlndXJhdGlvblJlbG9hZGVkKENvbmZpZ3VyYXRpb25DbHVzdGVyaW5nQ29tbWFuZCBjb21tYW5kKSB7Ci0gICAgICAgIC8vVE9ETzogTWV0aG9kIGltcGxlbWVudGF0aW9uCi0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcmVwYXJlQ2FsbGVkKCkgewotICAgICAgICAvL1RPRE86IE1ldGhvZCBpbXBsZW1lbnRhdGlvbgotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcm9sbGJhY2tDYWxsZWQoKSB7Ci0gICAgICAgIC8vVE9ETzogTWV0aG9kIGltcGxlbWVudGF0aW9uCi0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjb21taXRDYWxsZWQoKSB7Ci0gICAgICAgIC8vVE9ETzogTWV0aG9kIGltcGxlbWVudGF0aW9uCi0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBoYW5kbGVFeGNlcHRpb24oVGhyb3dhYmxlIHRocm93YWJsZSkgewotICAgICAgICAvL1RPRE86IE1ldGhvZCBpbXBsZW1lbnRhdGlvbgotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q29uZmlndXJhdGlvbkNvbnRleHQoQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlndXJhdGlvbkNvbnRleHQpIHsKLSAgICAgICAgLy9UT0RPOiBNZXRob2QgaW1wbGVtZW50YXRpb24KLQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2NsdXN0ZXJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9jb25maWd1cmF0aW9uL2NvbW1hbmRzL0FwcGx5U2VydmljZVBvbGljeUNvbW1hbmQuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2NsdXN0ZXJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9jb25maWd1cmF0aW9uL2NvbW1hbmRzL0FwcGx5U2VydmljZVBvbGljeUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA4MzEzNi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvY29uZmlndXJhdGlvbi9jb21tYW5kcy9BcHBseVNlcnZpY2VQb2xpY3lDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5jb25maWd1cmF0aW9uLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkNsdXN0ZXJpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEFwcGx5U2VydmljZVBvbGljeUNvbW1hbmQgZXh0ZW5kcyBDb25maWd1cmF0aW9uQ2x1c3RlcmluZ0NvbW1hbmQgewotCi0gICAgcHJpdmF0ZSBTdHJpbmcgcG9saWN5OwotICAgIHByaXZhdGUgU3RyaW5nIHNlcnZpY2VOYW1lOwotCi0gICAgcHVibGljIHZvaWQgcHJvY2VzcyhDb25maWd1cmF0aW9uQ29udGV4dCBjb25maUN0eCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vVE9ETzogaW1wbAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByZXBhcmUoQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ29udGV4dCkgewotICAgICAgICAvL1RPRE86IGltcGwKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjb21taXQoQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vVE9ETzogaW1wbAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJvbGxiYWNrKENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvL1RPRE86IGltcGwKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gIkFQUExZX1NFUlZJQ0VfUE9MSUNZX0VWRU5UIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldENvbW1hbmRUeXBlKCkgewotICAgICAgICByZXR1cm4gQVBQTFlfU0VSVklDRV9QT0xJQ1k7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UG9saWN5KFN0cmluZyBwb2xpY3kpIHsKLSAgICAgICAgdGhpcy5wb2xpY3kgPSBwb2xpY3k7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2VydmljZU5hbWUoU3RyaW5nIHNlcnZpY2VOYW1lKSB7Ci0gICAgICAgIHRoaXMuc2VydmljZU5hbWUgPSBzZXJ2aWNlTmFtZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvY29uZmlndXJhdGlvbi9jb21tYW5kcy9Db21taXRDb21tYW5kLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvY29uZmlndXJhdGlvbi9jb21tYW5kcy9Db21taXRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2YTc1M2UuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL2NvbmZpZ3VyYXRpb24vY29tbWFuZHMvQ29tbWl0Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuY29uZmlndXJhdGlvbi5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25DbHVzdGVyaW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21taXRDb21tYW5kIGV4dGVuZHMgQ29uZmlndXJhdGlvbkNsdXN0ZXJpbmdDb21tYW5kIHsKLSAgICBwdWJsaWMgaW50IGdldENvbW1hbmRUeXBlKCkgewotICAgICAgICByZXR1cm4gQ09NTUlUOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3MoQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIE5vdGhpbmcgdG8gaW1wbGVtZW50Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJlcGFyZShDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0KSB7Ci0gICAgICAgIC8vIE5vdGhpbmcgdG8gaW1wbGVtZW50Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY29tbWl0KENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBOb3RoaW5nIHRvIGltcGxlbWVudAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJvbGxiYWNrKENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBOb3RoaW5nIHRvIGltcGxlbWVudAotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiAiQ29tbWl0Q29tbWFuZCI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL2NvbmZpZ3VyYXRpb24vY29tbWFuZHMvRXhjZXB0aW9uQ29tbWFuZC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL2NvbmZpZ3VyYXRpb24vY29tbWFuZHMvRXhjZXB0aW9uQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTNkMGE2Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2NsdXN0ZXJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9jb25maWd1cmF0aW9uL2NvbW1hbmRzL0V4Y2VwdGlvbkNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLmNvbmZpZ3VyYXRpb24uY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uQ2x1c3RlcmluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgRXhjZXB0aW9uQ29tbWFuZCBleHRlbmRzIENvbmZpZ3VyYXRpb25DbHVzdGVyaW5nQ29tbWFuZCB7Ci0gICAgcHJpdmF0ZSBUaHJvd2FibGUgZXhjZXB0aW9uOwotCi0gICAgcHVibGljIEV4Y2VwdGlvbkNvbW1hbmQoVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotICAgICAgICB0aGlzLmV4Y2VwdGlvbiA9IGV4Y2VwdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldENvbW1hbmRUeXBlKCkgewotICAgICAgICByZXR1cm4gQ29uZmlndXJhdGlvbkNsdXN0ZXJpbmdDb21tYW5kLkVYQ0VQVElPTjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVGhyb3dhYmxlIGdldEV4Y2VwdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIGV4Y2VwdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRFeGNlcHRpb24oVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotICAgICAgICB0aGlzLmV4Y2VwdGlvbiA9IGV4Y2VwdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzKENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBOb3RoaW5nIHRvIGltcGxlbWVudAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByZXBhcmUoQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ29udGV4dCkgewotICAgICAgICAvLyBOb3RoaW5nIHRvIGltcGxlbWVudAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNvbW1pdChDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gTm90aGluZyB0byBpbXBsZW1lbnQKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByb2xsYmFjayhDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gTm90aGluZyB0byBpbXBsZW1lbnQKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gIkV4Y2VwdGlvbkNvbW1hbmRbIitleGNlcHRpb24uZ2V0Q2xhc3MoKSsiXTogXCIiICsgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSArICJcIiI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL2NvbmZpZ3VyYXRpb24vY29tbWFuZHMvTG9hZFNlcnZpY2VHcm91cHNDb21tYW5kLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvY29uZmlndXJhdGlvbi9jb21tYW5kcy9Mb2FkU2VydmljZUdyb3Vwc0NvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzI5NDVhMy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvY29uZmlndXJhdGlvbi9jb21tYW5kcy9Mb2FkU2VydmljZUdyb3Vwc0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLmNvbmZpZ3VyYXRpb24uY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uQ2x1c3RlcmluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgTG9hZFNlcnZpY2VHcm91cHNDb21tYW5kIGV4dGVuZHMgQ29uZmlndXJhdGlvbkNsdXN0ZXJpbmdDb21tYW5kIHsKLSAgICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlR3JvdXBOYW1lcyhTdHJpbmdbXSBzZXJ2aWNlR3JvdXBOYW1lcykgewotICAgICAgICB0aGlzLnNlcnZpY2VHcm91cE5hbWVzID0gc2VydmljZUdyb3VwTmFtZXM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmdbXSBzZXJ2aWNlR3JvdXBOYW1lczsKLQotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3MoQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlDdHgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvL1RPRE86IGltcGwKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcmVwYXJlKENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQpIHsKLSAgICAgICAgLy9UT0RPOiBpbXBsCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY29tbWl0KENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvL1RPRE86IGltcGwKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByb2xsYmFjayhDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy9UT0RPOiBpbXBsCi0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuICJMT0FEX1NFUlZJQ0VfR1JPVVBTX0VWRU5UIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldENvbW1hbmRUeXBlKCkgewotICAgICAgICByZXR1cm4gTE9BRF9TRVJWSUNFX0dST1VQUzsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvY29uZmlndXJhdGlvbi9jb21tYW5kcy9QcmVwYXJlQ29tbWFuZC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL2NvbmZpZ3VyYXRpb24vY29tbWFuZHMvUHJlcGFyZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRkODYyZi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvY29uZmlndXJhdGlvbi9jb21tYW5kcy9QcmVwYXJlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuY29uZmlndXJhdGlvbi5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25DbHVzdGVyaW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBQcmVwYXJlQ29tbWFuZCBleHRlbmRzIENvbmZpZ3VyYXRpb25DbHVzdGVyaW5nQ29tbWFuZCB7Ci0gICAgcHVibGljIGludCBnZXRDb21tYW5kVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIFBSRVBBUkU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJvY2VzcyhDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gTm90aGluZyB0byBpbXBsZW1lbnQKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcmVwYXJlKENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQpIHsKLSAgICAgICAgLy8gTm90aGluZyB0byBpbXBsZW1lbnQKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjb21taXQoQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIE5vdGhpbmcgdG8gaW1wbGVtZW50Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcm9sbGJhY2soQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIE5vdGhpbmcgdG8gaW1wbGVtZW50Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuICJQcmVwYXJlQ29tbWFuZCI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL2NvbmZpZ3VyYXRpb24vY29tbWFuZHMvUmVsb2FkQ29uZmlndXJhdGlvbkNvbW1hbmQuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2NsdXN0ZXJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9jb25maWd1cmF0aW9uL2NvbW1hbmRzL1JlbG9hZENvbmZpZ3VyYXRpb25Db21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4NjUzZmEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL2NvbmZpZ3VyYXRpb24vY29tbWFuZHMvUmVsb2FkQ29uZmlndXJhdGlvbkNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLmNvbmZpZ3VyYXRpb24uY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uQ2x1c3RlcmluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUmVsb2FkQ29uZmlndXJhdGlvbkNvbW1hbmQgZXh0ZW5kcyBDb25maWd1cmF0aW9uQ2x1c3RlcmluZ0NvbW1hbmQgewotCi0gICAgcHVibGljIHZvaWQgcHJvY2VzcyhDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDdHgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvL1RPRE86IGltcGwKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcmVwYXJlKENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0N0eCkgewotICAgICAgICAvL1RPRE86IGltcGwKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjb21taXQoQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vVE9ETzogaW1wbAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJvbGxiYWNrKENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvL1RPRE86IGltcGwKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gIkxPQURfQ09ORklHVVJBVElPTl9FVkVOVCI7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRDb21tYW5kVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIFJFTE9BRF9DT05GSUdVUkFUSU9OOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2NsdXN0ZXJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9jb25maWd1cmF0aW9uL2NvbW1hbmRzL1JvbGxiYWNrQ29tbWFuZC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL2NvbmZpZ3VyYXRpb24vY29tbWFuZHMvUm9sbGJhY2tDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2OGMzOWQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL2NvbmZpZ3VyYXRpb24vY29tbWFuZHMvUm9sbGJhY2tDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5jb25maWd1cmF0aW9uLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkNsdXN0ZXJpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFJvbGxiYWNrQ29tbWFuZCBleHRlbmRzIENvbmZpZ3VyYXRpb25DbHVzdGVyaW5nQ29tbWFuZCB7Ci0gICAgcHVibGljIGludCBnZXRDb21tYW5kVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIFJPTExCQUNLOwotICAgIH0KLQotICAgICBwdWJsaWMgdm9pZCBwcm9jZXNzKENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBOb3RoaW5nIHRvIGltcGxlbWVudAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByZXBhcmUoQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ29udGV4dCkgewotICAgICAgICAvLyBOb3RoaW5nIHRvIGltcGxlbWVudAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNvbW1pdChDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gTm90aGluZyB0byBpbXBsZW1lbnQKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByb2xsYmFjayhDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gTm90aGluZyB0byBpbXBsZW1lbnQKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gIlJvbGxiYWNrQ29tbWFuZCI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL2NvbmZpZ3VyYXRpb24vY29tbWFuZHMvVW5sb2FkU2VydmljZUdyb3Vwc0NvbW1hbmQuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2NsdXN0ZXJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9jb25maWd1cmF0aW9uL2NvbW1hbmRzL1VubG9hZFNlcnZpY2VHcm91cHNDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3N2Q2ZmUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL2NvbmZpZ3VyYXRpb24vY29tbWFuZHMvVW5sb2FkU2VydmljZUdyb3Vwc0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLmNvbmZpZ3VyYXRpb24uY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uQ2x1c3RlcmluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgVW5sb2FkU2VydmljZUdyb3Vwc0NvbW1hbmQgZXh0ZW5kcyBDb25maWd1cmF0aW9uQ2x1c3RlcmluZ0NvbW1hbmQgewotCi0gICAgcHJpdmF0ZSBTdHJpbmdbXSBzZXJ2aWNlR3JvdXBOYW1lczsKLQotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3MoQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlDdHgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvL1RPRE86IGltcGwKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcmVwYXJlKENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQpIHsKLSAgICAgICAgLy9UT0RPOiBpbXBsCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY29tbWl0KENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvL1RPRE86IGltcGwKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByb2xsYmFjayhDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy9UT0RPOiBpbXBsCi0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuICJVTkxPQURfU0VSVklDRV9HUk9VUFNfRVZFTlQiOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0Q29tbWFuZFR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBVTkxPQURfU0VSVklDRV9HUk9VUFM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2VydmljZUdyb3VwTmFtZXMoU3RyaW5nW10gc2VydmljZUdyb3VwTmFtZXMpIHsKLSAgICAgICAgdGhpcy5zZXJ2aWNlR3JvdXBOYW1lcyA9IHNlcnZpY2VHcm91cE5hbWVzOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2NsdXN0ZXJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9jb250ZXh0L0NsdXN0ZXJpbmdDb250ZXh0TGlzdGVuZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2NsdXN0ZXJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9jb250ZXh0L0NsdXN0ZXJpbmdDb250ZXh0TGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjU3YjQ5MC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvY29udGV4dC9DbHVzdGVyaW5nQ29udGV4dExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLkNsdXN0ZXJpbmdGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuTWVzc2FnZVNlbmRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQWJzdHJhY3RDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db250ZXh0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBDbHVzdGVyaW5nQ29udGV4dExpc3RlbmVyIGltcGxlbWVudHMgQ29udGV4dExpc3RlbmVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coQ2x1c3RlcmluZ0NvbnRleHRMaXN0ZW5lci5jbGFzcyk7Ci0KLSAgICBwcml2YXRlIE1lc3NhZ2VTZW5kZXIgc2VuZGVyOwotCi0gICAgcHVibGljIENsdXN0ZXJpbmdDb250ZXh0TGlzdGVuZXIoTWVzc2FnZVNlbmRlciBzZW5kZXIpIHsKLSAgICAgICAgdGhpcy5zZW5kZXIgPSBzZW5kZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY29udGV4dENyZWF0ZWQoQWJzdHJhY3RDb250ZXh0IGNvbnRleHQpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjb250ZXh0UmVtb3ZlZChBYnN0cmFjdENvbnRleHQgY29udGV4dCkgewotICAgICAgICBDb250ZXh0Q2x1c3RlcmluZ0NvbW1hbmQgY29tbWFuZCA9Ci0gICAgICAgICAgICAgICAgQ29udGV4dENsdXN0ZXJpbmdDb21tYW5kRmFjdG9yeS5nZXRSZW1vdmVDb21tYW5kKGNvbnRleHQpOwotICAgICAgICBpZihjb21tYW5kICE9IG51bGwpewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBzZW5kZXIuc2VuZFRvR3JvdXAoY29tbWFuZCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChDbHVzdGVyaW5nRmF1bHQgZSkgewotICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiQ2Fubm90IHNlbmQgY29udGV4dCByZW1vdmVkIG1lc3NhZ2UgdG8gY2x1c3RlciIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL2NvbnRleHQvQ29udGV4dENsdXN0ZXJpbmdDb21tYW5kRmFjdG9yeS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL2NvbnRleHQvQ29udGV4dENsdXN0ZXJpbmdDb21tYW5kRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOGE2ODE1Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2NsdXN0ZXJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9jb250ZXh0L0NvbnRleHRDbHVzdGVyaW5nQ29tbWFuZEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLkNsdXN0ZXJpbmdGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuY29udGV4dC5jb21tYW5kcy5Db250ZXh0Q2x1c3RlcmluZ0NvbW1hbmRDb2xsZWN0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5jb250ZXh0LmNvbW1hbmRzLkRlbGV0ZVNlcnZpY2VHcm91cENvbnRleHRDb21tYW5kOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5jb250ZXh0LmNvbW1hbmRzLlVwZGF0ZUNvbmZpZ3VyYXRpb25Db250ZXh0Q29tbWFuZDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuY29udGV4dC5jb21tYW5kcy5VcGRhdGVDb250ZXh0Q29tbWFuZDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuY29udGV4dC5jb21tYW5kcy5VcGRhdGVTZXJ2aWNlQ29udGV4dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLmNvbnRleHQuY29tbWFuZHMuVXBkYXRlU2VydmljZUdyb3VwQ29udGV4dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkFic3RyYWN0Q29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LlByb3BlcnR5RGlmZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuU2VydmljZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LlNlcnZpY2VHcm91cENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LkRlcGxveW1lbnRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBDb250ZXh0Q2x1c3RlcmluZ0NvbW1hbmRGYWN0b3J5IHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhDb250ZXh0Q2x1c3RlcmluZ0NvbW1hbmRGYWN0b3J5LmNsYXNzKTsKLQotICAgIHB1YmxpYyBzdGF0aWMgQ29udGV4dENsdXN0ZXJpbmdDb21tYW5kQ29sbGVjdGlvbgotICAgIGdldENvbW1hbmRDb2xsZWN0aW9uKEFic3RyYWN0Q29udGV4dFtdIGNvbnRleHRzLAotICAgICAgICAgICAgICAgICAgICAgICAgIE1hcCBleGNsdWRlZFJlcGxpY2F0aW9uUGF0dGVybnMpIHsKLQotICAgICAgICBBcnJheUxpc3Q8Q29udGV4dENsdXN0ZXJpbmdDb21tYW5kPiBjb21tYW5kcyA9IG5ldyBBcnJheUxpc3Q8Q29udGV4dENsdXN0ZXJpbmdDb21tYW5kPihjb250ZXh0cy5sZW5ndGgpOwotICAgICAgICBDb250ZXh0Q2x1c3RlcmluZ0NvbW1hbmRDb2xsZWN0aW9uIGNvbGxlY3Rpb24gPQotICAgICAgICAgICAgICAgIG5ldyBDb250ZXh0Q2x1c3RlcmluZ0NvbW1hbmRDb2xsZWN0aW9uKGNvbW1hbmRzKTsKLSAgICAgICAgZm9yIChBYnN0cmFjdENvbnRleHQgY29udGV4dCA6IGNvbnRleHRzKSB7Ci0gICAgICAgICAgICBDb250ZXh0Q2x1c3RlcmluZ0NvbW1hbmQgY21kID0gZ2V0VXBkYXRlQ29tbWFuZChjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjbHVkZWRSZXBsaWNhdGlvblBhdHRlcm5zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOwotICAgICAgICAgICAgaWYgKGNtZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY29tbWFuZHMuYWRkKGNtZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGNvbnRleHQgICAgICAgICAgICAgICAgICBUaGUgY29udGV4dAotICAgICAqIEBwYXJhbSBleGNsdWRlZFByb3BlcnR5UGF0dGVybnMgVGhlIHByb3BlcnR5IHBhdHRlcm5zIHRvIGJlIGV4Y2x1ZGVkCi0gICAgICogQHBhcmFtIGluY2x1ZGVBbGxQcm9wZXJ0aWVzICAgICBUcnVlIC0gSW5jbHVkZSBhbGwgcHJvcGVydGllcywKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZhbHNlIC0gSW5jbHVkZSBvbmx5IHByb3BlcnR5IGRpZmZlcmVuY2VzCi0gICAgICogQHJldHVybiBDb250ZXh0Q2x1c3RlcmluZ0NvbW1hbmQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIENvbnRleHRDbHVzdGVyaW5nQ29tbWFuZCBnZXRVcGRhdGVDb21tYW5kKEFic3RyYWN0Q29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwIGV4Y2x1ZGVkUHJvcGVydHlQYXR0ZXJucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaW5jbHVkZUFsbFByb3BlcnRpZXMpIHsKLQotICAgICAgICBVcGRhdGVDb250ZXh0Q29tbWFuZCBjbWQgPSB0b1VwZGF0ZUNvbnRleHRDb21tYW5kKGNvbnRleHQpOwotICAgICAgICBpZiAoY21kICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZpbGxQcm9wZXJ0aWVzKGNtZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBleGNsdWRlZFByb3BlcnR5UGF0dGVybnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlQWxsUHJvcGVydGllcyk7Ci0gICAgICAgICAgICBpZiAoY21kLmlzUHJvcGVydGllc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBjbWQgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjbWQ7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgc3RhdGljIENvbnRleHRDbHVzdGVyaW5nQ29tbWFuZCBnZXRVcGRhdGVDb21tYW5kKEFic3RyYWN0Q29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gcHJvcGVydHlOYW1lcykKLSAgICAgICAgICAgIHRocm93cyBDbHVzdGVyaW5nRmF1bHQgewotCi0gICAgICAgIFVwZGF0ZUNvbnRleHRDb21tYW5kIGNtZCA9IHRvVXBkYXRlQ29udGV4dENvbW1hbmQoY29udGV4dCk7Ci0gICAgICAgIGlmIChjbWQgIT0gbnVsbCkgewotICAgICAgICAgICAgZmlsbFByb3BlcnRpZXMoY21kLCBjb250ZXh0LCBwcm9wZXJ0eU5hbWVzKTsKLSAgICAgICAgICAgIGlmIChjbWQuaXNQcm9wZXJ0aWVzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIGNtZCA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNtZDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBVcGRhdGVDb250ZXh0Q29tbWFuZCB0b1VwZGF0ZUNvbnRleHRDb21tYW5kKEFic3RyYWN0Q29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIFVwZGF0ZUNvbnRleHRDb21tYW5kIGNtZCA9IG51bGw7Ci0gICAgICAgIGlmIChjb250ZXh0IGluc3RhbmNlb2YgQ29uZmlndXJhdGlvbkNvbnRleHQpIHsKLSAgICAgICAgICAgIGNtZCA9IG5ldyBVcGRhdGVDb25maWd1cmF0aW9uQ29udGV4dENvbW1hbmQoKTsKLSAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0IGluc3RhbmNlb2YgU2VydmljZUdyb3VwQ29udGV4dCkgewotICAgICAgICAgICAgU2VydmljZUdyb3VwQ29udGV4dCBzZ0N0eCA9IChTZXJ2aWNlR3JvdXBDb250ZXh0KSBjb250ZXh0OwotICAgICAgICAgICAgY21kID0gbmV3IFVwZGF0ZVNlcnZpY2VHcm91cENvbnRleHRDb21tYW5kKCk7Ci0gICAgICAgICAgICBVcGRhdGVTZXJ2aWNlR3JvdXBDb250ZXh0Q29tbWFuZCB1cGRhdGVTZ0NtZCA9IChVcGRhdGVTZXJ2aWNlR3JvdXBDb250ZXh0Q29tbWFuZCkgY21kOwotICAgICAgICAgICAgdXBkYXRlU2dDbWQuc2V0U2VydmljZUdyb3VwTmFtZShzZ0N0eC5nZXREZXNjcmlwdGlvbigpLmdldFNlcnZpY2VHcm91cE5hbWUoKSk7Ci0gICAgICAgICAgICB1cGRhdGVTZ0NtZC5zZXRTZXJ2aWNlR3JvdXBDb250ZXh0SWQoc2dDdHguZ2V0SWQoKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoY29udGV4dCBpbnN0YW5jZW9mIFNlcnZpY2VDb250ZXh0KSB7Ci0gICAgICAgICAgICBTZXJ2aWNlQ29udGV4dCBzZXJ2aWNlQ3R4ID0gKFNlcnZpY2VDb250ZXh0KSBjb250ZXh0OwotICAgICAgICAgICAgY21kID0gbmV3IFVwZGF0ZVNlcnZpY2VDb250ZXh0Q29tbWFuZCgpOwotICAgICAgICAgICAgVXBkYXRlU2VydmljZUNvbnRleHRDb21tYW5kIHVwZGF0ZVNlcnZpY2VDbWQgPSAoVXBkYXRlU2VydmljZUNvbnRleHRDb21tYW5kKSBjbWQ7Ci0gICAgICAgICAgICBTdHJpbmcgc2dOYW1lID0KLSAgICAgICAgICAgICAgICAgICAgc2VydmljZUN0eC5nZXRTZXJ2aWNlR3JvdXBDb250ZXh0KCkuZ2V0RGVzY3JpcHRpb24oKS5nZXRTZXJ2aWNlR3JvdXBOYW1lKCk7Ci0gICAgICAgICAgICB1cGRhdGVTZXJ2aWNlQ21kLnNldFNlcnZpY2VHcm91cE5hbWUoc2dOYW1lKTsKLSAgICAgICAgICAgIHVwZGF0ZVNlcnZpY2VDbWQuc2V0U2VydmljZUdyb3VwQ29udGV4dElkKHNlcnZpY2VDdHguZ2V0U2VydmljZUdyb3VwQ29udGV4dCgpLmdldElkKCkpOwotICAgICAgICAgICAgdXBkYXRlU2VydmljZUNtZC5zZXRTZXJ2aWNlTmFtZShzZXJ2aWNlQ3R4LmdldEF4aXNTZXJ2aWNlKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY21kOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSB1cGRhdGVDbWQgICAgICAgICAgICAgICAgVGhlIGNvbW1hbmQKLSAgICAgKiBAcGFyYW0gY29udGV4dCAgICAgICAgICAgICAgICAgIFRoZSBjb250ZXh0Ci0gICAgICogQHBhcmFtIGV4Y2x1ZGVkUHJvcGVydHlQYXR0ZXJucyBUaGUgcHJvcGVydHkgcGF0dGVybnMgdG8gYmUgZXhjbHVkZWQgZnJvbSByZXBsaWNhdGlvbgotICAgICAqIEBwYXJhbSBpbmNsdWRlQWxsUHJvcGVydGllcyAgICAgVHJ1ZSAtIEluY2x1ZGUgYWxsIHByb3BlcnRpZXMsCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGYWxzZSAtIEluY2x1ZGUgb25seSBwcm9wZXJ0eSBkaWZmZXJlbmNlcwotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZmlsbFByb3BlcnRpZXMoVXBkYXRlQ29udGV4dENvbW1hbmQgdXBkYXRlQ21kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWJzdHJhY3RDb250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXAgZXhjbHVkZWRQcm9wZXJ0eVBhdHRlcm5zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpbmNsdWRlQWxsUHJvcGVydGllcykgewotICAgICAgICBpZiAoIWluY2x1ZGVBbGxQcm9wZXJ0aWVzKSB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGNvbnRleHQpIHsKLSAgICAgICAgICAgICAgICBNYXAgZGlmZnMgPSBjb250ZXh0LmdldFByb3BlcnR5RGlmZmVyZW5jZXMoKTsKLSAgICAgICAgICAgICAgICBmb3IgKE9iamVjdCBvIDogZGlmZnMua2V5U2V0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9IChTdHJpbmcpIG87Ci0gICAgICAgICAgICAgICAgICAgIFByb3BlcnR5RGlmZmVyZW5jZSBkaWZmID0gKFByb3BlcnR5RGlmZmVyZW5jZSkgZGlmZnMuZ2V0KGtleSk7Ci0gICAgICAgICAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IGRpZmYuZ2V0VmFsdWUoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBTZXJpYWxpemFibGUpIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gTmV4dCBjaGVjayB3aGV0aGVyIGl0IG1hdGNoZXMgYW4gZXhjbHVkZWQgcGF0dGVybgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0V4Y2x1ZGVkKGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmdldENsYXNzKCkuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2x1ZGVkUHJvcGVydHlQYXR0ZXJucykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJzZW5kaW5nIHByb3BlcnR5ID0iICsga2V5ICsgIi0iICsgdmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVDbWQuYWRkUHJvcGVydHkoZGlmZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGNvbnRleHQpIHsKLSAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb250ZXh0LmdldFByb3BlcnR5TmFtZXMoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gY29udGV4dC5nZXRQcm9wZXJ0eU5vblJlcGxpY2FibGUoa2V5KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU2VyaWFsaXphYmxlKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5leHQgY2hlY2sgd2hldGhlciBpdCBtYXRjaGVzIGFuIGV4Y2x1ZGVkIHBhdHRlcm4KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNFeGNsdWRlZChrZXksIGNvbnRleHQuZ2V0Q2xhc3MoKS5nZXROYW1lKCksIGV4Y2x1ZGVkUHJvcGVydHlQYXR0ZXJucykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJzZW5kaW5nIHByb3BlcnR5ID0iICsga2V5ICsgIi0iICsgdmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eURpZmZlcmVuY2UgZGlmZiA9IG5ldyBQcm9wZXJ0eURpZmZlcmVuY2Uoa2V5LCB2YWx1ZSwgZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUNtZC5hZGRQcm9wZXJ0eShkaWZmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZmlsbFByb3BlcnRpZXMoVXBkYXRlQ29udGV4dENvbW1hbmQgdXBkYXRlQ21kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWJzdHJhY3RDb250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSBwcm9wZXJ0eU5hbWVzKSB0aHJvd3MgQ2x1c3RlcmluZ0ZhdWx0IHsKLSAgICAgICAgTWFwIGRpZmZzID0gY29udGV4dC5nZXRQcm9wZXJ0eURpZmZlcmVuY2VzKCk7Ci0gICAgICAgIGZvciAoU3RyaW5nIGtleSA6IHByb3BlcnR5TmFtZXMpIHsKLSAgICAgICAgICAgIE9iamVjdCBwcm9wID0gY29udGV4dC5nZXRQcm9wZXJ0eU5vblJlcGxpY2FibGUoa2V5KTsKLQotICAgICAgICAgICAgLy8gRmlyc3QgY2hlY2sgd2hldGhlciBpdCBpcyBzZXJpYWxpemFibGUKLSAgICAgICAgICAgIGlmIChwcm9wIGluc3RhbmNlb2YgU2VyaWFsaXphYmxlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1Zygic2VuZGluZyBwcm9wZXJ0eSA9IiArIGtleSArICItIiArIHByb3ApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBQcm9wZXJ0eURpZmZlcmVuY2UgZGlmZiA9IChQcm9wZXJ0eURpZmZlcmVuY2UpIGRpZmZzLmdldChrZXkpOwotICAgICAgICAgICAgICAgIGlmIChkaWZmICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZGlmZi5zZXRWYWx1ZShwcm9wKTsKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlQ21kLmFkZFByb3BlcnR5KGRpZmYpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgZGlmZj8KLSAgICAgICAgICAgICAgICAgICAgZGlmZnMucmVtb3ZlKGtleSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbXNnID0KLSAgICAgICAgICAgICAgICAgICAgICAgICJUcnlpbmcgdG8gcmVwbGljYXRlIG5vbi1zZXJpYWxpemFibGUgcHJvcGVydHkgIiArIGtleSArCi0gICAgICAgICAgICAgICAgICAgICAgICAiIGluIGNvbnRleHQgIiArIGNvbnRleHQ7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENsdXN0ZXJpbmdGYXVsdChtc2cpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0V4Y2x1ZGVkKFN0cmluZyBwcm9wZXJ0eU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjdHhDbGFzc05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcCBleGNsdWRlZFByb3BlcnR5UGF0dGVybnMpIHsKLQotICAgICAgICAvLyBDaGVjayBpbiB0aGUgZXhjbHVkZXMgbGlzdCBzcGVjaWZpYyB0byB0aGUgY29udGV4dAotICAgICAgICBMaXN0IHNwZWNpZmljRXhjbHVkZXMgPQotICAgICAgICAgICAgICAgIChMaXN0KSBleGNsdWRlZFByb3BlcnR5UGF0dGVybnMuZ2V0KGN0eENsYXNzTmFtZSk7Ci0gICAgICAgIGJvb2xlYW4gaXNFeGNsdWRlZCA9IGZhbHNlOwotICAgICAgICBpZiAoc3BlY2lmaWNFeGNsdWRlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpc0V4Y2x1ZGVkID0gaXNFeGNsdWRlZChzcGVjaWZpY0V4Y2x1ZGVzLCBwcm9wZXJ0eU5hbWUpOwotICAgICAgICB9Ci0gICAgICAgIGlmICghaXNFeGNsdWRlZCkgewotICAgICAgICAgICAgLy8gY2hlY2sgaW4gdGhlIGRlZmF1bHQgZXhjbHVkZXMKLSAgICAgICAgICAgIExpc3QgZGVmYXVsdEV4Y2x1ZGVzID0KLSAgICAgICAgICAgICAgICAgICAgKExpc3QpIGV4Y2x1ZGVkUHJvcGVydHlQYXR0ZXJucy5nZXQoRGVwbG95bWVudENvbnN0YW50cy5UQUdfREVGQVVMVFMpOwotICAgICAgICAgICAgaWYgKGRlZmF1bHRFeGNsdWRlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaXNFeGNsdWRlZCA9IGlzRXhjbHVkZWQoZGVmYXVsdEV4Y2x1ZGVzLCBwcm9wZXJ0eU5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpc0V4Y2x1ZGVkOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNFeGNsdWRlZChMaXN0IGxpc3QsIFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLSAgICAgICAgZm9yIChPYmplY3QgYUxpc3QgOiBsaXN0KSB7Ci0gICAgICAgICAgICBTdHJpbmcgcGF0dGVybiA9IChTdHJpbmcpIGFMaXN0OwotICAgICAgICAgICAgaWYgKHBhdHRlcm4uc3RhcnRzV2l0aCgiKiIpKSB7Ci0gICAgICAgICAgICAgICAgcGF0dGVybiA9IHBhdHRlcm4ucmVwbGFjZUFsbCgiXFwqIiwgIiIpOwotICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eU5hbWUuZW5kc1dpdGgocGF0dGVybikpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChwYXR0ZXJuLmVuZHNXaXRoKCIqIikpIHsKLSAgICAgICAgICAgICAgICBwYXR0ZXJuID0gcGF0dGVybi5yZXBsYWNlQWxsKCJcXCoiLCAiIik7Ci0gICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5TmFtZS5zdGFydHNXaXRoKHBhdHRlcm4pKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAocGF0dGVybi5lcXVhbHMocHJvcGVydHlOYW1lKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIENvbnRleHRDbHVzdGVyaW5nQ29tbWFuZCBnZXRSZW1vdmVDb21tYW5kKEFic3RyYWN0Q29udGV4dCBhYnN0cmFjdENvbnRleHQpIHsKLSAgICAgICAgaWYgKGFic3RyYWN0Q29udGV4dCBpbnN0YW5jZW9mIFNlcnZpY2VHcm91cENvbnRleHQpIHsKLSAgICAgICAgICAgIFNlcnZpY2VHcm91cENvbnRleHQgc2dDdHggPSAoU2VydmljZUdyb3VwQ29udGV4dCkgYWJzdHJhY3RDb250ZXh0OwotICAgICAgICAgICAgRGVsZXRlU2VydmljZUdyb3VwQ29udGV4dENvbW1hbmQgY21kID0gbmV3IERlbGV0ZVNlcnZpY2VHcm91cENvbnRleHRDb21tYW5kKCk7Ci0gICAgICAgICAgICBjbWQuc2V0U2VydmljZUdyb3VwQ29udGV4dElkKHNnQ3R4LmdldElkKCkpOwotCi0gICAgICAgICAgICByZXR1cm4gY21kOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2NsdXN0ZXJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9jb250ZXh0L0RlZmF1bHRDb250ZXh0TWFuYWdlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL2NvbnRleHQvRGVmYXVsdENvbnRleHRNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyMDljMDEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL2NvbnRleHQvRGVmYXVsdENvbnRleHRNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuY29udGV4dDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5DbHVzdGVyaW5nRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLmNvbnRleHQuY29tbWFuZHMuQ29udGV4dENsdXN0ZXJpbmdDb21tYW5kQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcudHJpYmVzLkNoYW5uZWxTZW5kZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkFic3RyYWN0Q29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LlNlcnZpY2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5TZXJ2aWNlR3JvdXBDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1wdWJsaWMgY2xhc3MgRGVmYXVsdENvbnRleHRNYW5hZ2VyIGltcGxlbWVudHMgQ29udGV4dE1hbmFnZXIgewotCi0gICAgcHJpdmF0ZSBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0OwotICAgIHByaXZhdGUgQ29udGV4dE1hbmFnZXJMaXN0ZW5lciBsaXN0ZW5lcjsKLQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgUGFyYW1ldGVyPiBwYXJhbWV0ZXJzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBQYXJhbWV0ZXI+KCk7Ci0KLSAgICBwcml2YXRlIENoYW5uZWxTZW5kZXIgc2VuZGVyOwotCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBMaXN0PiBleGNsdWRlZFJlcGxpY2F0aW9uUGF0dGVybnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIExpc3Q+KCk7Ci0KLSAgICAvL1RPRE86IFRyeSBob3cgdG8gdXNlIGFuIGludGVyZmFjZQotICAgIHB1YmxpYyB2b2lkIHNldFNlbmRlcihDaGFubmVsU2VuZGVyIHNlbmRlcikgewotICAgICAgICB0aGlzLnNlbmRlciA9IHNlbmRlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRGVmYXVsdENvbnRleHRNYW5hZ2VyKCkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUNvbnRleHQoQWJzdHJhY3RDb250ZXh0IGNvbnRleHQpIHRocm93cyBDbHVzdGVyaW5nRmF1bHQgewotICAgICAgICBDb250ZXh0Q2x1c3RlcmluZ0NvbW1hbmQgY21kID0KLSAgICAgICAgICAgICAgICBDb250ZXh0Q2x1c3RlcmluZ0NvbW1hbmRGYWN0b3J5LmdldFVwZGF0ZUNvbW1hbmQoY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjbHVkZWRSZXBsaWNhdGlvblBhdHRlcm5zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7Ci0gICAgICAgIGlmIChjbWQgIT0gbnVsbCkgewotICAgICAgICAgICAgc2VuZGVyLnNlbmRUb0dyb3VwKGNtZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB1cGRhdGVDb250ZXh0KEFic3RyYWN0Q29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSBwcm9wZXJ0eU5hbWVzKSB0aHJvd3MgQ2x1c3RlcmluZ0ZhdWx0IHsKLSAgICAgICAgQ29udGV4dENsdXN0ZXJpbmdDb21tYW5kIGNtZCA9Ci0gICAgICAgICAgICAgICAgQ29udGV4dENsdXN0ZXJpbmdDb21tYW5kRmFjdG9yeS5nZXRVcGRhdGVDb21tYW5kKGNvbnRleHQsIHByb3BlcnR5TmFtZXMpOwotICAgICAgICBpZiAoY21kICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNlbmRlci5zZW5kVG9Hcm91cChjbWQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdXBkYXRlQ29udGV4dHMoQWJzdHJhY3RDb250ZXh0W10gY29udGV4dHMpIHRocm93cyBDbHVzdGVyaW5nRmF1bHQgewotICAgICAgICBDb250ZXh0Q2x1c3RlcmluZ0NvbW1hbmRDb2xsZWN0aW9uIGNtZCA9Ci0gICAgICAgICAgICAgICAgQ29udGV4dENsdXN0ZXJpbmdDb21tYW5kRmFjdG9yeS5nZXRDb21tYW5kQ29sbGVjdGlvbihjb250ZXh0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2x1ZGVkUmVwbGljYXRpb25QYXR0ZXJucyk7Ci0gICAgICAgIHNlbmRlci5zZW5kVG9Hcm91cChjbWQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZUNvbnRleHQoQWJzdHJhY3RDb250ZXh0IGNvbnRleHQpIHRocm93cyBDbHVzdGVyaW5nRmF1bHQgewotICAgICAgICBDb250ZXh0Q2x1c3RlcmluZ0NvbW1hbmQgY21kID0gQ29udGV4dENsdXN0ZXJpbmdDb21tYW5kRmFjdG9yeS5nZXRSZW1vdmVDb21tYW5kKGNvbnRleHQpOwotICAgICAgICBzZW5kZXIuc2VuZFRvR3JvdXAoY21kKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0NvbnRleHRDbHVzdGVyYWJsZShBYnN0cmFjdENvbnRleHQgY29udGV4dCkgewotICAgICAgICByZXR1cm4gKGNvbnRleHQgaW5zdGFuY2VvZiBDb25maWd1cmF0aW9uQ29udGV4dCkgfHwKLSAgICAgICAgICAgICAgIChjb250ZXh0IGluc3RhbmNlb2YgU2VydmljZUNvbnRleHQpIHx8Ci0gICAgICAgICAgICAgICAoY29udGV4dCBpbnN0YW5jZW9mIFNlcnZpY2VHcm91cENvbnRleHQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENvbnRleHRNYW5hZ2VyTGlzdGVuZXIoQ29udGV4dE1hbmFnZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICB0aGlzLmxpc3RlbmVyID0gbGlzdGVuZXI7Ci0gICAgICAgIGlmIChjb25maWdDb250ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRoaXMubGlzdGVuZXIuc2V0Q29uZmlndXJhdGlvbkNvbnRleHQoY29uZmlnQ29udGV4dCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb25maWd1cmF0aW9uQ29udGV4dChDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWd1cmF0aW9uQ29udGV4dCkgewotICAgICAgICB0aGlzLmNvbmZpZ0NvbnRleHQgPSBjb25maWd1cmF0aW9uQ29udGV4dDsKLSAgICAgICAgaWYgKGxpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGxpc3RlbmVyLnNldENvbmZpZ3VyYXRpb25Db250ZXh0KGNvbmZpZ0NvbnRleHQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UmVwbGljYXRpb25FeGNsdWRlUGF0dGVybnMoU3RyaW5nIGNvbnRleHRUeXBlLCBMaXN0IHBhdHRlcm5zKSB7Ci0gICAgICAgIGV4Y2x1ZGVkUmVwbGljYXRpb25QYXR0ZXJucy5wdXQoY29udGV4dFR5cGUsIHBhdHRlcm5zKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWFwIGdldFJlcGxpY2F0aW9uRXhjbHVkZVBhdHRlcm5zKCkgewotICAgICAgICByZXR1cm4gZXhjbHVkZWRSZXBsaWNhdGlvblBhdHRlcm5zOwotICAgIH0KLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTWV0aG9kcyBmcm9tIFBhcmFtZXRlckluY2x1ZGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHB1YmxpYyB2b2lkIGFkZFBhcmFtZXRlcihQYXJhbWV0ZXIgcGFyYW0pIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBwYXJhbWV0ZXJzLnB1dChwYXJhbS5nZXROYW1lKCksIHBhcmFtKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVQYXJhbWV0ZXIoUGFyYW1ldGVyIHBhcmFtKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgcGFyYW1ldGVycy5yZW1vdmUocGFyYW0uZ2V0TmFtZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUGFyYW1ldGVyIGdldFBhcmFtZXRlcihTdHJpbmcgbmFtZSkgewotICAgICAgICByZXR1cm4gcGFyYW1ldGVycy5nZXQobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIEFycmF5TGlzdCBnZXRQYXJhbWV0ZXJzKCkgewotICAgICAgICBBcnJheUxpc3Q8UGFyYW1ldGVyPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxQYXJhbWV0ZXI+KCk7Ci0gICAgICAgIGZvciAoU3RyaW5nIG1zZyA6IHBhcmFtZXRlcnMua2V5U2V0KCkpIHsKLSAgICAgICAgICAgIGxpc3QuYWRkKHBhcmFtZXRlcnMuZ2V0KG1zZykpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBsaXN0OwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzUGFyYW1ldGVyTG9ja2VkKFN0cmluZyBwYXJhbWV0ZXJOYW1lKSB7Ci0gICAgICAgIHJldHVybiBnZXRQYXJhbWV0ZXIocGFyYW1ldGVyTmFtZSkuaXNMb2NrZWQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkZXNlcmlhbGl6ZVBhcmFtZXRlcnMoT01FbGVtZW50IHBhcmFtZXRlckVsZW1lbnQpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9Ci0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvY29udGV4dC9EZWZhdWx0Q29udGV4dE1hbmFnZXJMaXN0ZW5lci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL2NvbnRleHQvRGVmYXVsdENvbnRleHRNYW5hZ2VyTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTcxZGU5MC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvY29udGV4dC9EZWZhdWx0Q29udGV4dE1hbmFnZXJMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuY29udGV4dDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5DbHVzdGVyaW5nRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotCi1wdWJsaWMgY2xhc3MgRGVmYXVsdENvbnRleHRNYW5hZ2VyTGlzdGVuZXIgaW1wbGVtZW50cyBDb250ZXh0TWFuYWdlckxpc3RlbmVyIHsKLQotICAgIHByaXZhdGUgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlndXJhdGlvbkNvbnRleHQ7Ci0KLSAgICBwdWJsaWMgdm9pZCBjb250ZXh0VXBkYXRlZChDb250ZXh0Q2x1c3RlcmluZ0NvbW1hbmQgbWVzc2FnZSkgdGhyb3dzIENsdXN0ZXJpbmdGYXVsdCB7Ci0gICAgICAgIG1lc3NhZ2UuZXhlY3V0ZShjb25maWd1cmF0aW9uQ29udGV4dCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q29uZmlndXJhdGlvbkNvbnRleHQoQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlndXJhdGlvbkNvbnRleHQpIHsKLSAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uQ29udGV4dCA9IGNvbmZpZ3VyYXRpb25Db250ZXh0OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2NsdXN0ZXJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9jb250ZXh0L1Byb3BlcnR5VXBkYXRlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL2NvbnRleHQvUHJvcGVydHlVcGRhdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiZGYzM2YuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL2NvbnRleHQvUHJvcGVydHlVcGRhdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkFic3RyYWN0Q29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuUHJvcGVydHlEaWZmZXJlbmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eVVwZGF0ZXIgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhQcm9wZXJ0eVVwZGF0ZXIuY2xhc3MpOwotCi0gICAgcHJpdmF0ZSBNYXAgcHJvcGVydGllczsKLQotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZVByb3BlcnRpZXMoQWJzdHJhY3RDb250ZXh0IGFic3RyYWN0Q29udGV4dCkgewotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiVXBkYXRpbmcgcHJvcHMgaW4gIiArIGFic3RyYWN0Q29udGV4dCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGFic3RyYWN0Q29udGV4dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwcm9wZXJ0aWVzLmtleVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBQcm9wZXJ0eURpZmZlcmVuY2UgcHJvcERpZmYgPQotICAgICAgICAgICAgICAgICAgICAgICAgKFByb3BlcnR5RGlmZmVyZW5jZSkgcHJvcGVydGllcy5nZXQoa2V5KTsKLSAgICAgICAgICAgICAgICBpZiAocHJvcERpZmYuaXNSZW1vdmVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgYWJzdHJhY3RDb250ZXh0LnJlbW92ZVByb3BlcnR5Tm9uUmVwbGljYWJsZShrZXkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7ICAvLyBpdCBpcyB1cGRhdGVkL2FkZGVkCi0gICAgICAgICAgICAgICAgICAgIGFic3RyYWN0Q29udGV4dC5zZXROb25SZXBsaWNhYmxlUHJvcGVydHkoa2V5LCBwcm9wRGlmZi5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkFkZGVkIHByb3A9IiArIGtleSArICIsIHZhbHVlPSIgKyBwcm9wRGlmZi5nZXRWYWx1ZSgpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHRvIGNvbnRleHQgIiArIGFic3RyYWN0Q29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRDb250ZXh0UHJvcGVydHkoUHJvcGVydHlEaWZmZXJlbmNlIGRpZmYpIHsKLSAgICAgICAgcHJvcGVydGllcy5wdXQoZGlmZi5nZXRLZXkoKSwgZGlmZik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydGllcyhNYXAgcHJvcGVydGllcykgewotICAgICAgICB0aGlzLnByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzOwotICAgIH0KLQotICAgIHB1YmxpYyBNYXAgZ2V0UHJvcGVydGllcygpIHsKLSAgICAgICAgcmV0dXJuIHByb3BlcnRpZXM7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL2NvbnRleHQvY29tbWFuZHMvQ29udGV4dENsdXN0ZXJpbmdDb21tYW5kQ29sbGVjdGlvbi5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL2NvbnRleHQvY29tbWFuZHMvQ29udGV4dENsdXN0ZXJpbmdDb21tYW5kQ29sbGVjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODlhY2NjLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2NsdXN0ZXJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9jb250ZXh0L2NvbW1hbmRzL0NvbnRleHRDbHVzdGVyaW5nQ29tbWFuZENvbGxlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLmNvbnRleHQuY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuQ2x1c3RlcmluZ0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5jb250ZXh0LkNvbnRleHRDbHVzdGVyaW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQ29udGV4dENsdXN0ZXJpbmdDb21tYW5kQ29sbGVjdGlvbiBleHRlbmRzIENvbnRleHRDbHVzdGVyaW5nQ29tbWFuZCB7Ci0KLSAgICBwcml2YXRlIEFycmF5TGlzdCBjb21tYW5kczsKLQotICAgIHB1YmxpYyBDb250ZXh0Q2x1c3RlcmluZ0NvbW1hbmRDb2xsZWN0aW9uKEFycmF5TGlzdCBjb21tYW5kcykgewotICAgICAgICB0aGlzLmNvbW1hbmRzID0gY29tbWFuZHM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZShDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0KSB0aHJvd3MgQ2x1c3RlcmluZ0ZhdWx0IHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb21tYW5kcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgQ29udGV4dENsdXN0ZXJpbmdDb21tYW5kIGNtZCA9IChDb250ZXh0Q2x1c3RlcmluZ0NvbW1hbmQpIGNvbW1hbmRzLmdldChpKTsKLSAgICAgICAgICAgIGlmIChjbWQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNtZC5leGVjdXRlKGNvbmZpZ0NvbnRleHQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuICJDb250ZXh0Q2x1c3RlcmluZ0NvbW1hbmRDb2xsZWN0aW9uIjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvY29udGV4dC9jb21tYW5kcy9EZWxldGVTZXJ2aWNlQ29udGV4dENvbW1hbmQuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2NsdXN0ZXJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9jb250ZXh0L2NvbW1hbmRzL0RlbGV0ZVNlcnZpY2VDb250ZXh0Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMGNjZGIxLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2NsdXN0ZXJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9jb250ZXh0L2NvbW1hbmRzL0RlbGV0ZVNlcnZpY2VDb250ZXh0Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuY29udGV4dC5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5DbHVzdGVyaW5nRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLmNvbnRleHQuQ29udGV4dENsdXN0ZXJpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIERlbGV0ZVNlcnZpY2VDb250ZXh0Q29tbWFuZCBleHRlbmRzIENvbnRleHRDbHVzdGVyaW5nQ29tbWFuZCB7Ci0gICAgcHJvdGVjdGVkIFN0cmluZyBzZXJ2aWNlR3JvdXBOYW1lOwotICAgIHByb3RlY3RlZCBTdHJpbmcgc2VydmljZUdyb3VwQ29udGV4dElkOwotICAgIHByb3RlY3RlZCBTdHJpbmcgc2VydmljZU5hbWU7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlR3JvdXBOYW1lKFN0cmluZyBzZXJ2aWNlR3JvdXBOYW1lKSB7Ci0gICAgICAgIHRoaXMuc2VydmljZUdyb3VwTmFtZSA9IHNlcnZpY2VHcm91cE5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2VydmljZU5hbWUoU3RyaW5nIHNlcnZpY2VOYW1lKSB7Ci0gICAgICAgIHRoaXMuc2VydmljZU5hbWUgPSBzZXJ2aWNlTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlR3JvdXBDb250ZXh0SWQoU3RyaW5nIHNlcnZpY2VHcm91cENvbnRleHRJZCkgewotICAgICAgICB0aGlzLnNlcnZpY2VHcm91cENvbnRleHRJZCA9IHNlcnZpY2VHcm91cENvbnRleHRJZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ3VyYXRpb25Db250ZXh0KSB0aHJvd3MgQ2x1c3RlcmluZ0ZhdWx0IHsKLSAgICAgICAgLy8gVE9ETzogSW1wbGVtZW50YXRpb24KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvY29udGV4dC9jb21tYW5kcy9EZWxldGVTZXJ2aWNlR3JvdXBDb250ZXh0Q29tbWFuZC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL2NvbnRleHQvY29tbWFuZHMvRGVsZXRlU2VydmljZUdyb3VwQ29udGV4dENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdjM2Q1NS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvY29udGV4dC9jb21tYW5kcy9EZWxldGVTZXJ2aWNlR3JvdXBDb250ZXh0Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuY29udGV4dC5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5DbHVzdGVyaW5nRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLmNvbnRleHQuQ29udGV4dENsdXN0ZXJpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLQotLyoqCi0gKgotICovCi1wdWJsaWMgY2xhc3MgRGVsZXRlU2VydmljZUdyb3VwQ29udGV4dENvbW1hbmQgZXh0ZW5kcyBDb250ZXh0Q2x1c3RlcmluZ0NvbW1hbmQgewotICAgIHByaXZhdGUgU3RyaW5nIHNlcnZpY2VHcm91cENvbnRleHRJZDsKLQotICAgIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VHcm91cENvbnRleHRJZChTdHJpbmcgc2VydmljZUdyb3VwQ29udGV4dElkKSB7Ci0gICAgICAgIHRoaXMuc2VydmljZUdyb3VwQ29udGV4dElkID0gc2VydmljZUdyb3VwQ29udGV4dElkOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlndXJhdGlvbkNvbnRleHQpIHRocm93cyBDbHVzdGVyaW5nRmF1bHQgewotICAgICAgICBjb25maWd1cmF0aW9uQ29udGV4dC5yZW1vdmVTZXJ2aWNlR3JvdXBDb250ZXh0KHNlcnZpY2VHcm91cENvbnRleHRJZCk7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2NsdXN0ZXJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9jb250ZXh0L2NvbW1hbmRzL1VwZGF0ZUNvbmZpZ3VyYXRpb25Db250ZXh0Q29tbWFuZC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL2NvbnRleHQvY29tbWFuZHMvVXBkYXRlQ29uZmlndXJhdGlvbkNvbnRleHRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1NjIzZTUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL2NvbnRleHQvY29tbWFuZHMvVXBkYXRlQ29uZmlndXJhdGlvbkNvbnRleHRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5jb250ZXh0LmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLkNsdXN0ZXJpbmdGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBVcGRhdGVDb25maWd1cmF0aW9uQ29udGV4dENvbW1hbmQgZXh0ZW5kcyBVcGRhdGVDb250ZXh0Q29tbWFuZCB7Ci0KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ3VyYXRpb25Db250ZXh0KSB0aHJvd3MgQ2x1c3RlcmluZ0ZhdWx0IHsKLSAgICAgICAgcHJvcGVydHlVcGRhdGVyLnVwZGF0ZVByb3BlcnRpZXMoY29uZmlndXJhdGlvbkNvbnRleHQpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiAiVXBkYXRlQ29uZmlndXJhdGlvbkNvbnRleHRDb21tYW5kIjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvY29udGV4dC9jb21tYW5kcy9VcGRhdGVDb250ZXh0Q29tbWFuZC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL2NvbnRleHQvY29tbWFuZHMvVXBkYXRlQ29udGV4dENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI4NmIzMS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvY29udGV4dC9jb21tYW5kcy9VcGRhdGVDb250ZXh0Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuY29udGV4dC5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5jb250ZXh0LkNvbnRleHRDbHVzdGVyaW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuY29udGV4dC5Qcm9wZXJ0eVVwZGF0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LlByb3BlcnR5RGlmZmVyZW5jZTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVXBkYXRlQ29udGV4dENvbW1hbmQgZXh0ZW5kcyBDb250ZXh0Q2x1c3RlcmluZ0NvbW1hbmQgewotCi0gICAgcHJvdGVjdGVkIFByb3BlcnR5VXBkYXRlciBwcm9wZXJ0eVVwZGF0ZXIgPSBuZXcgUHJvcGVydHlVcGRhdGVyKCk7Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Byb3BlcnRpZXNFbXB0eSgpIHsKLSAgICAgICAgaWYgKHByb3BlcnR5VXBkYXRlci5nZXRQcm9wZXJ0aWVzKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgcHJvcGVydHlVcGRhdGVyLnNldFByb3BlcnRpZXMobmV3IEhhc2hNYXAoKSk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcHJvcGVydHlVcGRhdGVyLmdldFByb3BlcnRpZXMoKS5pc0VtcHR5KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkUHJvcGVydHkoUHJvcGVydHlEaWZmZXJlbmNlIGRpZmYpIHsKLSAgICAgICAgaWYgKHByb3BlcnR5VXBkYXRlci5nZXRQcm9wZXJ0aWVzKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgcHJvcGVydHlVcGRhdGVyLnNldFByb3BlcnRpZXMobmV3IEhhc2hNYXAoKSk7Ci0gICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIHByb3BlcnR5VXBkYXRlci5hZGRDb250ZXh0UHJvcGVydHkoZGlmZik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL2NvbnRleHQvY29tbWFuZHMvVXBkYXRlU2VydmljZUNvbnRleHRDb21tYW5kLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvY29udGV4dC9jb21tYW5kcy9VcGRhdGVTZXJ2aWNlQ29udGV4dENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFjNGYxMy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvY29udGV4dC9jb21tYW5kcy9VcGRhdGVTZXJ2aWNlQ29udGV4dENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5jb250ZXh0LmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLkNsdXN0ZXJpbmdGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LlNlcnZpY2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5TZXJ2aWNlR3JvdXBDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZUdyb3VwOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgVXBkYXRlU2VydmljZUNvbnRleHRDb21tYW5kIGV4dGVuZHMgVXBkYXRlQ29udGV4dENvbW1hbmQgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFVwZGF0ZVNlcnZpY2VDb250ZXh0Q29tbWFuZC5jbGFzcyk7Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHNlcnZpY2VHcm91cE5hbWU7Ci0gICAgcHJvdGVjdGVkIFN0cmluZyBzZXJ2aWNlR3JvdXBDb250ZXh0SWQ7Ci0gICAgcHJvdGVjdGVkIFN0cmluZyBzZXJ2aWNlTmFtZTsKLQotICAgIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VHcm91cE5hbWUoU3RyaW5nIHNlcnZpY2VHcm91cE5hbWUpIHsKLSAgICAgICAgdGhpcy5zZXJ2aWNlR3JvdXBOYW1lID0gc2VydmljZUdyb3VwTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlTmFtZShTdHJpbmcgc2VydmljZU5hbWUpIHsKLSAgICAgICAgdGhpcy5zZXJ2aWNlTmFtZSA9IHNlcnZpY2VOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VHcm91cENvbnRleHRJZChTdHJpbmcgc2VydmljZUdyb3VwQ29udGV4dElkKSB7Ci0gICAgICAgIHRoaXMuc2VydmljZUdyb3VwQ29udGV4dElkID0gc2VydmljZUdyb3VwQ29udGV4dElkOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlndXJhdGlvbkNvbnRleHQpIHRocm93cyBDbHVzdGVyaW5nRmF1bHQgewotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiVXBkYXRpbmcgc2VydmljZSBjb250ZXh0IHByb3BlcnRpZXMuLi4iKTsKLSAgICAgICAgfQotICAgICAgICBTZXJ2aWNlR3JvdXBDb250ZXh0IHNnQ3R4ID0KLSAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uQ29udGV4dC5nZXRTZXJ2aWNlR3JvdXBDb250ZXh0KHNlcnZpY2VHcm91cENvbnRleHRJZCk7Ci0gICAgICAgIGlmIChzZ0N0eCAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb25Db250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCkuZ2V0U2VydmljZShzZXJ2aWNlTmFtZSk7Ci0gICAgICAgICAgICAgICAgU2VydmljZUNvbnRleHQgc2VydmljZUNvbnRleHQgPSBzZ0N0eC5nZXRTZXJ2aWNlQ29udGV4dChheGlzU2VydmljZSk7Ci0gICAgICAgICAgICAgICAgcHJvcGVydHlVcGRhdGVyLnVwZGF0ZVByb3BlcnRpZXMoc2VydmljZUNvbnRleHQpOwotICAgICAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ2x1c3RlcmluZ0ZhdWx0KGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc2dDdHggPSBjb25maWd1cmF0aW9uQ29udGV4dC5nZXRTZXJ2aWNlR3JvdXBDb250ZXh0KHNlcnZpY2VHcm91cENvbnRleHRJZCk7Ci0gICAgICAgICAgICBBeGlzU2VydmljZSBheGlzU2VydmljZTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYXhpc1NlcnZpY2UgPSBjb25maWd1cmF0aW9uQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpLmdldFNlcnZpY2Uoc2VydmljZU5hbWUpOwotICAgICAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGF4aXNGYXVsdCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbHVzdGVyaW5nRmF1bHQoYXhpc0ZhdWx0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFN0cmluZyBzY29wZSA9IGF4aXNTZXJ2aWNlLmdldFNjb3BlKCk7Ci0gICAgICAgICAgICBpZiAoc2dDdHggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIEF4aXNTZXJ2aWNlR3JvdXAgc2VydmljZUdyb3VwID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb25Db250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCkuZ2V0U2VydmljZUdyb3VwKHNlcnZpY2VHcm91cE5hbWUpOwotICAgICAgICAgICAgICAgIGlmKHNlcnZpY2VHcm91cCA9PSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzZ0N0eCA9IG5ldyBTZXJ2aWNlR3JvdXBDb250ZXh0KGNvbmZpZ3VyYXRpb25Db250ZXh0LCBzZXJ2aWNlR3JvdXApOwotICAgICAgICAgICAgICAgIHNnQ3R4LnNldElkKHNlcnZpY2VHcm91cENvbnRleHRJZCk7Ci0gICAgICAgICAgICAgICAgaWYgKHNjb3BlLmVxdWFscyhDb25zdGFudHMuU0NPUEVfQVBQTElDQVRJT04pKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb25Db250ZXh0LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZFNlcnZpY2VHcm91cENvbnRleHRJbnRvQXBwbGljYXRpb25TY29wZVRhYmxlKHNnQ3R4KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNjb3BlLmVxdWFscyhDb25zdGFudHMuU0NPUEVfU09BUF9TRVNTSU9OKSkgewotICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uQ29udGV4dC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRTZXJ2aWNlR3JvdXBDb250ZXh0SW50b1NvYXBTZXNzaW9uVGFibGUoc2dDdHgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgU2VydmljZUNvbnRleHQgc2VydmljZUNvbnRleHQgPSBzZ0N0eC5nZXRTZXJ2aWNlQ29udGV4dChheGlzU2VydmljZSk7Ci0gICAgICAgICAgICAgICAgcHJvcGVydHlVcGRhdGVyLnVwZGF0ZVByb3BlcnRpZXMoc2VydmljZUNvbnRleHQpOwotICAgICAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGF4aXNGYXVsdCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbHVzdGVyaW5nRmF1bHQoYXhpc0ZhdWx0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiAiVXBkYXRlU2VydmljZUNvbnRleHRDb21tYW5kIjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvY29udGV4dC9jb21tYW5kcy9VcGRhdGVTZXJ2aWNlR3JvdXBDb250ZXh0Q29tbWFuZC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL2NvbnRleHQvY29tbWFuZHMvVXBkYXRlU2VydmljZUdyb3VwQ29udGV4dENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdjODk1Ni4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvY29udGV4dC9jb21tYW5kcy9VcGRhdGVTZXJ2aWNlR3JvdXBDb250ZXh0Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuY29udGV4dC5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5DbHVzdGVyaW5nRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5TZXJ2aWNlR3JvdXBDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2VHcm91cDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFVwZGF0ZVNlcnZpY2VHcm91cENvbnRleHRDb21tYW5kIGV4dGVuZHMgVXBkYXRlQ29udGV4dENvbW1hbmQgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFVwZGF0ZVNlcnZpY2VHcm91cENvbnRleHRDb21tYW5kLmNsYXNzKTsKLQotICAgIHByb3RlY3RlZCBTdHJpbmcgc2VydmljZUdyb3VwTmFtZTsKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHNlcnZpY2VHcm91cENvbnRleHRJZDsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmljZUdyb3VwTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHNlcnZpY2VHcm91cE5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2VydmljZUdyb3VwTmFtZShTdHJpbmcgc2VydmljZUdyb3VwTmFtZSkgewotICAgICAgICB0aGlzLnNlcnZpY2VHcm91cE5hbWUgPSBzZXJ2aWNlR3JvdXBOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmljZUdyb3VwQ29udGV4dElkKCkgewotICAgICAgICByZXR1cm4gc2VydmljZUdyb3VwQ29udGV4dElkOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VHcm91cENvbnRleHRJZChTdHJpbmcgc2VydmljZUdyb3VwQ29udGV4dElkKSB7Ci0gICAgICAgIHRoaXMuc2VydmljZUdyb3VwQ29udGV4dElkID0gc2VydmljZUdyb3VwQ29udGV4dElkOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ29udGV4dCkgdGhyb3dzIENsdXN0ZXJpbmdGYXVsdCB7Ci0gICAgICAgIFNlcnZpY2VHcm91cENvbnRleHQgc2dDdHggPQotICAgICAgICAgICAgICAgIGNvbmZpZ0NvbnRleHQuZ2V0U2VydmljZUdyb3VwQ29udGV4dChzZXJ2aWNlR3JvdXBDb250ZXh0SWQpOwotCi0gICAgICAgIC8vIElmIHRoZSBTZXJ2aWNlR3JvdXBDb250ZXh0IGlzIG5vdCBmb3VuZCwgY3JlYXRlIGl0Ci0gICAgICAgIGlmIChzZ0N0eCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBBeGlzU2VydmljZUdyb3VwIGF4aXNTZXJ2aWNlR3JvdXAgPQotICAgICAgICAgICAgICAgICAgICBjb25maWdDb250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCkuZ2V0U2VydmljZUdyb3VwKHNlcnZpY2VHcm91cE5hbWUpOwotICAgICAgICAgICAgaWYoYXhpc1NlcnZpY2VHcm91cCA9PSBudWxsKXsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZ0N0eCA9IG5ldyBTZXJ2aWNlR3JvdXBDb250ZXh0KGNvbmZpZ0NvbnRleHQsIGF4aXNTZXJ2aWNlR3JvdXApOwotICAgICAgICAgICAgc2dDdHguc2V0SWQoc2VydmljZUdyb3VwQ29udGV4dElkKTsKLSAgICAgICAgICAgIGNvbmZpZ0NvbnRleHQuYWRkU2VydmljZUdyb3VwQ29udGV4dEludG9Tb2FwU2Vzc2lvblRhYmxlKHNnQ3R4KTsgIC8vIFRPRE86IENoZWNrIHRoaXMKLSAgICAgICAgfQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiR29ubmEgdXBkYXRlIFNHIHByb3AgaW4gIiArIHNlcnZpY2VHcm91cENvbnRleHRJZCArICI9PT0iICsgc2dDdHgpOwotICAgICAgICB9Ci0gICAgICAgIHByb3BlcnR5VXBkYXRlci51cGRhdGVQcm9wZXJ0aWVzKHNnQ3R4KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gIlVwZGF0ZVNlcnZpY2VHcm91cENvbnRleHRDb21tYW5kIjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvY29udHJvbC9Db250cm9sQ29tbWFuZC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL2NvbnRyb2wvQ29udHJvbENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThlMWUyZi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvY29udHJvbC9Db250cm9sQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuY29udHJvbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5DbHVzdGVyaW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuQ2x1c3RlcmluZ0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLQotLyoqCi0gKiBSZXByZXNlbnRzIGEgQ29udHJvbCBjb21tYW5kIHNlbnQgZnJvbSBvbmUgTm9kZSB0byBhbm90aGVyCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb250cm9sQ29tbWFuZCBleHRlbmRzIENsdXN0ZXJpbmdDb21tYW5kIHsKLQotICAgIC8qKgotICAgICAqIEV4ZWN1dGUgdGhpcyBjb21tYW5kCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29uZmlndXJhdGlvbkNvbnRleHQKLSAgICAgKiBAdGhyb3dzIENsdXN0ZXJpbmdGYXVsdAotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGV4ZWN1dGUoQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlndXJhdGlvbkNvbnRleHQpIHRocm93cyBDbHVzdGVyaW5nRmF1bHQ7Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvY29udHJvbC9HZXRDb25maWd1cmF0aW9uQ29tbWFuZC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL2NvbnRyb2wvR2V0Q29uZmlndXJhdGlvbkNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzliODMwOC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvY29udHJvbC9HZXRDb25maWd1cmF0aW9uQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuY29udHJvbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5DbHVzdGVyaW5nRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc01vZHVsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2VHcm91cDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzQ29uZmlndXJhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBHZXRDb25maWd1cmF0aW9uQ29tbWFuZCBleHRlbmRzIENvbnRyb2xDb21tYW5kIHsKLQotICAgIHByaXZhdGUgU3RyaW5nW10gc2VydmljZUdyb3VwTmFtZXM7Ci0KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0N0eCkgdGhyb3dzIENsdXN0ZXJpbmdGYXVsdCB7Ci0KLSAgICAgICAgTGlzdCBzZXJ2aWNlR3JvdXBOYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZyA9IGNvbmZpZ0N0eC5nZXRBeGlzQ29uZmlndXJhdGlvbigpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBheGlzQ29uZmlnLmdldFNlcnZpY2VHcm91cHMoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBBeGlzU2VydmljZUdyb3VwIHNlcnZpY2VHcm91cCA9IChBeGlzU2VydmljZUdyb3VwKSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIGJvb2xlYW4gZXhjbHVkZVNHID0gZmFsc2U7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIHNlcnZpY2VJdGVyID0gc2VydmljZUdyb3VwLmdldFNlcnZpY2VzKCk7IHNlcnZpY2VJdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICBBeGlzU2VydmljZSBzZXJ2aWNlID0gKEF4aXNTZXJ2aWNlKSBzZXJ2aWNlSXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKHNlcnZpY2UuZ2V0UGFyYW1ldGVyKEF4aXNNb2R1bGUuTU9EVUxFX1NFUlZJQ0UpICE9IG51bGwgfHwKLSAgICAgICAgICAgICAgICAgICAgc2VydmljZS5pc0NsaWVudFNpZGUoKSkgeyAvLyBObyBuZWVkIHRvIHNlbmQgc2VydmljZXMgZGVwbG95ZWQgdGhyb3VnaCBtb2R1bGVzIG9yIGNsaWVudCBzaWRlIHNlcnZpY2VzCi0gICAgICAgICAgICAgICAgICAgIGV4Y2x1ZGVTRyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy9UT0RPOiBFeGNsdWRlIGFsbCBzZXJ2aWNlcyBsb2FkZWQgZnJvbSBtb2R1bGVzLiBIb3cgdG8gaGFuZGxlIGRhdGEgc2VydmljZXMgZXRjLj8KLSAgICAgICAgICAgIGlmICghZXhjbHVkZVNHKSB7Ci0gICAgICAgICAgICAgICAgc2VydmljZUdyb3VwTmFtZXMuYWRkKHNlcnZpY2VHcm91cC5nZXRTZXJ2aWNlR3JvdXBOYW1lKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHRoaXMuc2VydmljZUdyb3VwTmFtZXMgPQotICAgICAgICAgICAgICAgIChTdHJpbmdbXSkgc2VydmljZUdyb3VwTmFtZXMudG9BcnJheShuZXcgU3RyaW5nW3NlcnZpY2VHcm91cE5hbWVzLnNpemUoKV0pOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRTZXJ2aWNlR3JvdXBOYW1lcygpIHsKLSAgICAgICAgcmV0dXJuIHNlcnZpY2VHcm91cE5hbWVzOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiAiR2V0Q29uZmlndXJhdGlvbkNvbW1hbmQiOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2NsdXN0ZXJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9jb250cm9sL0dldENvbmZpZ3VyYXRpb25SZXNwb25zZUNvbW1hbmQuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2NsdXN0ZXJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9jb250cm9sL0dldENvbmZpZ3VyYXRpb25SZXNwb25zZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y2MjEwMC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvY29udHJvbC9HZXRDb25maWd1cmF0aW9uUmVzcG9uc2VDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuY29udHJvbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5DbHVzdGVyaW5nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5DbHVzdGVyaW5nRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLkNsdXN0ZXJpbmdVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzTW9kdWxlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZUdyb3VwOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi0vKioKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBHZXRDb25maWd1cmF0aW9uUmVzcG9uc2VDb21tYW5kIGV4dGVuZHMgQ29udHJvbENvbW1hbmQgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEdldENvbmZpZ3VyYXRpb25SZXNwb25zZUNvbW1hbmQuY2xhc3MpOwotCi0gICAgcHJpdmF0ZSBTdHJpbmdbXSBzZXJ2aWNlR3JvdXBzOwotCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZShDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0KSB0aHJvd3MgQ2x1c3RlcmluZ0ZhdWx0IHsKLSAgICAgICAgQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZyA9IGNvbmZpZ0NvbnRleHQuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKTsKLQotICAgICAgICAvLyBSdW4gdGhpcyBjb2RlIG9ubHkgaWYgdGhpcyBub2RlIGlzIG5vdCBhbHJlYWR5IGluaXRpYWxpemVkCi0gICAgICAgIGlmIChjb25maWdDb250ZXh0LgotICAgICAgICAgICAgICAgIGdldFByb3BlcnR5Tm9uUmVwbGljYWJsZShDbHVzdGVyaW5nQ29uc3RhbnRzLlJFQ0RfQ09ORklHX0lOSVRfTVNHKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBsb2cuaW5mbygiUmVjZWl2ZWQgY29uZmlndXJhdGlvbiBpbml0aWFsaXphdGlvbiBtZXNzYWdlIik7Ci0gICAgICAgICAgICBjb25maWdDb250ZXh0LgotICAgICAgICAgICAgICAgIHNldE5vblJlcGxpY2FibGVQcm9wZXJ0eShDbHVzdGVyaW5nQ29uc3RhbnRzLlJFQ0RfQ09ORklHX0lOSVRfTVNHLCAidHJ1ZSIpOwotICAgICAgICAgICAgaWYgKHNlcnZpY2VHcm91cHMgIT0gbnVsbCkgewotCi0gICAgICAgICAgICAgICAgLy8gTG9hZCBhbGwgdGhlIHNlcnZpY2UgZ3JvdXBzIHRoYXQgYXJlIHNlbnQgYnkgdGhlIG5laWdoYm91cgotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VydmljZUdyb3Vwcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2VydmljZUdyb3VwID0gc2VydmljZUdyb3Vwc1tpXTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGF4aXNDb25maWcuZ2V0U2VydmljZUdyb3VwKHNlcnZpY2VHcm91cCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy9Mb2FkIHRoZSBzZXJ2aWNlIGdyb3VwCi0gICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsdXN0ZXJpbmdVdGlscy5sb2FkU2VydmljZUdyb3VwKHNlcnZpY2VHcm91cCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWdDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5nZXRQcm9wZXJ0eSgiYXhpczIud29yay5kaXIiKSk7IC8vVE9ETzogSW50cm9kdWNlIGEgY29uc3RhbnQuIHdvcmsgZGlyIGlzIGEgdGVtcCBkaXIuCi0gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gaWdub3JlZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ2x1c3RlcmluZ0ZhdWx0KGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy9UT0RPOiBXZSBzdXBwb3J0IG9ubHkgQUFSIGZpbGVzIGZvciBub3cKLQotICAgICAgICAgICAgICAgIC8vIFVubG9hZCBhbGwgc2VydmljZSBncm91cHMgd2hpY2ggd2VyZSBub3Qgc2VudCBieSB0aGUgbmVpZ2hib3VyLAotICAgICAgICAgICAgICAgIC8vIGJ1dCBoYXZlIGJlZW4gY3VycmVudGx5IGxvYWRlZAotICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGF4aXNDb25maWcuZ2V0U2VydmljZUdyb3VwcygpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICAgICAgQXhpc1NlcnZpY2VHcm91cCBzZXJ2aWNlR3JvdXAgPSAoQXhpc1NlcnZpY2VHcm91cCkgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZm91bmRTZXJ2aWNlR3JvdXAgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXJ2aWNlR3JvdXBzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2VydmljZUdyb3VwTmFtZSA9IHNlcnZpY2VHcm91cHNbaV07Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VydmljZUdyb3VwLmdldFNlcnZpY2VHcm91cE5hbWUoKS5lcXVhbHMoc2VydmljZUdyb3VwTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZFNlcnZpY2VHcm91cCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZFNlcnZpY2VHcm91cCkgewotICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBtdXN0VW5sb2FkU2VydmljZUdyb3VwID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFZlcmlmeSB0aGF0IHRoaXMgc2VydmljZSB3YXMgbm90IGxvYWRlZCBmcm9tIHdpdGhpbiBhIG1vZHVsZQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgc28sIHdlIG11c3Qgbm90IHVubG9hZCBzdWNoIGEgc2VydmljZQotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBzZXJ2aWNlSXRlciA9IHNlcnZpY2VHcm91cC5nZXRTZXJ2aWNlcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlSXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSA9IChBeGlzU2VydmljZSkgc2VydmljZUl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXJ2aWNlLmlzQ2xpZW50U2lkZSgpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UuZ2V0UGFyYW1ldGVyKEF4aXNNb2R1bGUuTU9EVUxFX1NFUlZJQ0UpICE9IG51bGwpIHsgLy8gRG8gbm90IHVubG9hZCBzZXJ2aWNlIGdyb3VwcyBjb250YWluaW5nIGNsaWVudCBzaWRlIHNlcnZpY2VzIG9yIG9uZXMgZGVwbG95ZWQgZnJvbSB3aXRoaW4gbW9kdWxlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXN0VW5sb2FkU2VydmljZUdyb3VwID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtdXN0VW5sb2FkU2VydmljZUdyb3VwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpc0NvbmZpZy5yZW1vdmVTZXJ2aWNlR3JvdXAoc2VydmljZUdyb3VwLmdldFNlcnZpY2VHcm91cE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENsdXN0ZXJpbmdGYXVsdChlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlR3JvdXBzKFN0cmluZ1tdIHNlcnZpY2VHcm91cHMpIHsKLSAgICAgICAgdGhpcy5zZXJ2aWNlR3JvdXBzID0gc2VydmljZUdyb3VwczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gIkdldENvbmZpZ3VyYXRpb25SZXNwb25zZUNvbW1hbmQiOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2NsdXN0ZXJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9jb250cm9sL0dldFN0YXRlQ29tbWFuZC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL2NvbnRyb2wvR2V0U3RhdGVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwYTdhOTguLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL2NvbnRyb2wvR2V0U3RhdGVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5jb250cm9sOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLkNsdXN0ZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5DbHVzdGVyaW5nRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLmNvbnRleHQuQ29udGV4dENsdXN0ZXJpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5jb250ZXh0LkNvbnRleHRDbHVzdGVyaW5nQ29tbWFuZEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLmNvbnRleHQuQ29udGV4dE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5TZXJ2aWNlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuU2VydmljZUdyb3VwQ29udGV4dDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBHZXRTdGF0ZUNvbW1hbmQgZXh0ZW5kcyBDb250cm9sQ29tbWFuZCB7Ci0KLSAgICBwcml2YXRlIENvbnRleHRDbHVzdGVyaW5nQ29tbWFuZFtdIGNvbW1hbmRzOwotCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZShDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDdHgpIHRocm93cyBDbHVzdGVyaW5nRmF1bHQgewotICAgICAgICBDbHVzdGVyTWFuYWdlciBjbHVzdGVyTWFuYWdlciA9IGNvbmZpZ0N0eC5nZXRBeGlzQ29uZmlndXJhdGlvbigpLmdldENsdXN0ZXJNYW5hZ2VyKCk7Ci0gICAgICAgIGlmKGNsdXN0ZXJNYW5hZ2VyID09IG51bGwpewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIENvbnRleHRNYW5hZ2VyIGNvbnRleHRNYW5hZ2VyID0gY2x1c3Rlck1hbmFnZXIuZ2V0Q29udGV4dE1hbmFnZXIoKTsKLSAgICAgICAgaWYgKGNvbnRleHRNYW5hZ2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgIE1hcCBleGNsdWRlZFByb3BQYXR0ZXJucyA9IGNvbnRleHRNYW5hZ2VyLmdldFJlcGxpY2F0aW9uRXhjbHVkZVBhdHRlcm5zKCk7Ci0gICAgICAgICAgICBMaXN0PENvbnRleHRDbHVzdGVyaW5nQ29tbWFuZD4gY21kTGlzdCA9IG5ldyBBcnJheUxpc3Q8Q29udGV4dENsdXN0ZXJpbmdDb21tYW5kPigpOwotCi0gICAgICAgICAgICAvLyBBZGQgdGhlIHNlcnZpY2UgZ3JvdXAgY29udGV4dHMsIHNlcnZpY2UgY29udGV4dHMgJiB0aGVpciByZXNwZWN0aXZlIHByb3BlcnRpZXMKLSAgICAgICAgICAgIFN0cmluZ1tdIHNnQ3R4SURzID0gY29uZmlnQ3R4LmdldFNlcnZpY2VHcm91cENvbnRleHRJRHMoKTsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIHNnQ3R4SUQgOiBzZ0N0eElEcykgewotICAgICAgICAgICAgICAgIFNlcnZpY2VHcm91cENvbnRleHQgc2dDdHggPSBjb25maWdDdHguZ2V0U2VydmljZUdyb3VwQ29udGV4dChzZ0N0eElEKTsKLSAgICAgICAgICAgICAgICBDb250ZXh0Q2x1c3RlcmluZ0NvbW1hbmQgdXBkYXRlU2VydmljZUdyb3VwQ3R4Q21kID0KLSAgICAgICAgICAgICAgICAgICAgICAgIENvbnRleHRDbHVzdGVyaW5nQ29tbWFuZEZhY3RvcnkuZ2V0VXBkYXRlQ29tbWFuZChzZ0N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNsdWRlZFByb3BQYXR0ZXJucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKLSAgICAgICAgICAgICAgICBpZiAodXBkYXRlU2VydmljZUdyb3VwQ3R4Q21kICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY21kTGlzdC5hZGQodXBkYXRlU2VydmljZUdyb3VwQ3R4Q21kKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHNnQ3R4LmdldFNlcnZpY2VDb250ZXh0cygpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyMiA9IHNnQ3R4LmdldFNlcnZpY2VDb250ZXh0cygpOyBpdGVyMi5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlQ29udGV4dCBzZXJ2aWNlQ3R4ID0gKFNlcnZpY2VDb250ZXh0KSBpdGVyMi5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0Q2x1c3RlcmluZ0NvbW1hbmQgdXBkYXRlU2VydmljZUN0eENtZCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRleHRDbHVzdGVyaW5nQ29tbWFuZEZhY3RvcnkuZ2V0VXBkYXRlQ29tbWFuZChzZXJ2aWNlQ3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjbHVkZWRQcm9wUGF0dGVybnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1cGRhdGVTZXJ2aWNlQ3R4Q21kICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWRMaXN0LmFkZCh1cGRhdGVTZXJ2aWNlQ3R4Q21kKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQ29udGV4dENsdXN0ZXJpbmdDb21tYW5kIHVwZGF0ZUNtZCA9Ci0gICAgICAgICAgICAgICAgICAgIENvbnRleHRDbHVzdGVyaW5nQ29tbWFuZEZhY3RvcnkuZ2V0VXBkYXRlQ29tbWFuZChjb25maWdDdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNsdWRlZFByb3BQYXR0ZXJucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOwotICAgICAgICAgICAgaWYgKHVwZGF0ZUNtZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY21kTGlzdC5hZGQodXBkYXRlQ21kKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghY21kTGlzdC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBjb21tYW5kcyA9IGNtZExpc3QudG9BcnJheShuZXcgQ29udGV4dENsdXN0ZXJpbmdDb21tYW5kW2NtZExpc3Quc2l6ZSgpXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29udGV4dENsdXN0ZXJpbmdDb21tYW5kW10gZ2V0Q29tbWFuZHMoKSB7Ci0gICAgICAgIHJldHVybiBjb21tYW5kczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gIkdldFN0YXRlQ29tbWFuZCI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL2NvbnRyb2wvR2V0U3RhdGVSZXNwb25zZUNvbW1hbmQuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2NsdXN0ZXJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9jb250cm9sL0dldFN0YXRlUmVzcG9uc2VDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxY2QzMDIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL2NvbnRyb2wvR2V0U3RhdGVSZXNwb25zZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLmNvbnRyb2w7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuQ2x1c3RlcmluZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuQ2x1c3RlcmluZ0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5jb250ZXh0LkNvbnRleHRDbHVzdGVyaW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBHZXRTdGF0ZVJlc3BvbnNlQ29tbWFuZCBleHRlbmRzIENvbnRyb2xDb21tYW5kIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhHZXRTdGF0ZVJlc3BvbnNlQ29tbWFuZC5jbGFzcyk7Ci0KLSAgICBwcml2YXRlIENvbnRleHRDbHVzdGVyaW5nQ29tbWFuZFtdIGNvbW1hbmRzOwotCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZShDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0KSB0aHJvd3MgQ2x1c3RlcmluZ0ZhdWx0IHsKLSAgICAgICAgbG9nLmluZm8oIlJlY2VpdmVkIHN0YXRlIGluaXRpYWxpemF0aW9uIG1lc3NhZ2UiKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFJ1biB0aGlzIGNvZGUgb25seSBpZiB0aGlzIG5vZGUgaXMgbm90IGFscmVhZHkgaW5pdGlhbGl6ZWQKLSAgICAgICAgaWYgKGNvbmZpZ0NvbnRleHQuCi0gICAgICAgICAgICAgICAgZ2V0UHJvcGVydHlOb25SZXBsaWNhYmxlKENsdXN0ZXJpbmdDb25zdGFudHMuUkVDRF9TVEFURV9JTklUX01TRykgPT0gbnVsbCkgewotICAgICAgICAgICAgY29uZmlnQ29udGV4dC4KLSAgICAgICAgICAgICAgICBzZXROb25SZXBsaWNhYmxlUHJvcGVydHkoQ2x1c3RlcmluZ0NvbnN0YW50cy5SRUNEX1NUQVRFX0lOSVRfTVNHLCAidHJ1ZSIpOwotLy8gICAgICAgICAgICBsb2cuaW5mbygiUmVjZWl2ZWQgc3RhdGUgaW5pdGlhbGl6YXRpb24gbWVzc2FnZSIpOwotICAgICAgICAgICAgaWYgKGNvbW1hbmRzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbW1hbmRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbW1hbmRzW2ldLmV4ZWN1dGUoY29uZmlnQ29udGV4dCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q29tbWFuZHMoQ29udGV4dENsdXN0ZXJpbmdDb21tYW5kW10gY29tbWFuZHMpIHsKLSAgICAgICAgdGhpcy5jb21tYW5kcyA9IGNvbW1hbmRzOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiAiR2V0U3RhdGVSZXNwb25zZUNvbW1hbmQiOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2NsdXN0ZXJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9jb250cm9sL3drYS9Kb2luR3JvdXBDb21tYW5kLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvY29udHJvbC93a2EvSm9pbkdyb3VwQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWNlNThiLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2NsdXN0ZXJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9jb250cm9sL3drYS9Kb2luR3JvdXBDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gKiBDb3B5cmlnaHQgMjAwNCwyMDA1IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgICAgICAgICAgICAgCi0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICAgICAgICAgICAgCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlICAgICAgICAgCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAgICAgICAgICAgCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gICAgCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kICAgICAgICAgCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLmNvbnRyb2wud2thOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLkNsdXN0ZXJpbmdGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuY29udHJvbC5Db250cm9sQ29tbWFuZDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgbWVzc2FnZSBhIG1lbWJlciB3aWxsIHNlbmQgdG8gYW5vdGhlciBtZW1iZXIgd2hlbiBpdCBpbnRlbmRzIHRvIGpvaW4gYSBncm91cC4KLSAqIFRoaXMgaXMgdXNlZCB3aXRoIFdLQSBiYXNlZCBtZW1iZXJzaGlwCi0gKi8KLXB1YmxpYyBjbGFzcyBKb2luR3JvdXBDb21tYW5kIGV4dGVuZHMgQ29udHJvbENvbW1hbmQgewotCi0gICAgcHJpdmF0ZSBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coSm9pbkdyb3VwQ29tbWFuZC5jbGFzcyk7Ci0KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ3VyYXRpb25Db250ZXh0KSB0aHJvd3MgQ2x1c3RlcmluZ0ZhdWx0IHsKLSAgICAgICAgbG9nLmluZm8oIkpPSU4gcmVxdWVzdCByZWNlaXZlZCIpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2NsdXN0ZXJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9jb250cm9sL3drYS9NZW1iZXJKb2luZWRDb21tYW5kLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvY29udHJvbC93a2EvTWVtYmVySm9pbmVkQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMmJlNjc3Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2NsdXN0ZXJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9jb250cm9sL3drYS9NZW1iZXJKb2luZWRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gKiBDb3B5cmlnaHQgMjAwNCwyMDA1IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgICAgICAgICAgICAgCi0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICAgICAgICAgICAgCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlICAgICAgICAgCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAgICAgICAgICAgCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gICAgCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kICAgICAgICAgCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLmNvbnRyb2wud2thOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLkNsdXN0ZXJpbmdGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuY29udHJvbC5Db250cm9sQ29tbWFuZDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcudHJpYmVzLk1lbWJlcnNoaXBNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5NZW1iZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIG5vdGlmaWNhdGlvbiBtZXNzYWdlIGEgbWVtYmVyIHdpbGwgc2VuZCB0byBhbGwgb3RoZXJzIGluIHRoZSBncm91cCBhZnRlciBpdCBoYXMKLSAqIGpvaW5lZCB0aGUgZ3JvdXAuIFdoZW4gdGhlIG90aGVyIG1lbWJlcnMgcmVjZWl2ZWQgdGhpcyBtZXNzYWdlLCB0aGV5IHdpbGwgYWRkIHRoZSBuZXdseSBqb2luZWQKLSAqIG1lbWJlciB0byB0aGVpciBtZW1iZXIgbGlzdAotICovCi1wdWJsaWMgY2xhc3MgTWVtYmVySm9pbmVkQ29tbWFuZCBleHRlbmRzIENvbnRyb2xDb21tYW5kIHsKLQotICAgIHByaXZhdGUgTWVtYmVyIG1lbWJlcjsKLSAgICBwcml2YXRlIE1lbWJlcnNoaXBNYW5hZ2VyIG1lbWJlcnNoaXBNYW5hZ2VyOwotCi0gICAgcHVibGljIHZvaWQgc2V0TWVtYmVyc2hpcE1hbmFnZXIoTWVtYmVyc2hpcE1hbmFnZXIgbWVtYmVyc2hpcE1hbmFnZXIpIHsKLSAgICAgICAgdGhpcy5tZW1iZXJzaGlwTWFuYWdlciA9IG1lbWJlcnNoaXBNYW5hZ2VyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE1lbWJlcihNZW1iZXIgbWVtYmVyKSB7Ci0gICAgICAgIHRoaXMubWVtYmVyID0gbWVtYmVyOwotICAgIH0KLQotICAgIHB1YmxpYyBNZW1iZXIgZ2V0TWVtYmVyKCkgewotICAgICAgICByZXR1cm4gbWVtYmVyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlndXJhdGlvbkNvbnRleHQpIHRocm93cyBDbHVzdGVyaW5nRmF1bHQgewotICAgICAgICBNZW1iZXIgbG9jYWxNZW1iZXIgPSBtZW1iZXJzaGlwTWFuYWdlci5nZXRMb2NhbE1lbWJlcigpOwotICAgICAgICBpZiAobG9jYWxNZW1iZXIgPT0gbnVsbCB8fCAhKEFycmF5cy5lcXVhbHMobG9jYWxNZW1iZXIuZ2V0SG9zdCgpLCBtZW1iZXIuZ2V0SG9zdCgpKSAmJgotICAgICAgICAgICAgICBsb2NhbE1lbWJlci5nZXRQb3J0KCkgPT0gbWVtYmVyLmdldFBvcnQoKSkpIHsKLSAgICAgICAgICAgIG1lbWJlcnNoaXBNYW5hZ2VyLm1lbWJlckFkZGVkKG1lbWJlcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gIk1lbWJlckpvaW5lZENvbW1hbmQ6ICIgKyBtZW1iZXI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL2NvbnRyb2wvd2thL01lbWJlckxpc3RDb21tYW5kLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvY29udHJvbC93a2EvTWVtYmVyTGlzdENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQzMzZlMS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvY29udHJvbC93a2EvTWVtYmVyTGlzdENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqIENvcHlyaWdodCAyMDA0LDIwMDUgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAgICAgICAgICAgICAKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gICAgICAgICAgICAKLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgICAgICAgICAKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsICAgICAgICAgICAKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgICAKLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgICAgICAgICAKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuY29udHJvbC53a2E7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuQ2x1c3RlcmluZ0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5jb250cm9sLkNvbnRyb2xDb21tYW5kOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy50cmliZXMuTWVtYmVyc2hpcE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLnRyaWJlcy5UcmliZXNVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5NZW1iZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi0vKioKLSAqIFdoZW4gYSBuZXcgbWVtYmVyIHdpc2hlcyB0byBqb2luIGEgZ3JvdXAsIGl0IHdpbGwgc2VuZCBhIHtAbGluayBKb2luR3JvdXBDb21tYW5kfSBtZXNzYWdlIHRvCi0gKiBhIGtub3duIG1lbWJlci4gVGhlbiB0aGlzIGtub3duIG1lbWJlciB3aWxsIHJlc3BvbmQgd2l0aCB0aGlzIE1lbWJlckxpc3RDb21tYW5kIG1lc3NhZ2UuCi0gKiBUaGlzIG1lc3NhZ2Ugd2lsbCBjb250YWluIGEgbGlzdCBvZiBhbGwgY3VycmVudCBtZW1iZXJzLgotICovCi1wdWJsaWMgY2xhc3MgTWVtYmVyTGlzdENvbW1hbmQgZXh0ZW5kcyBDb250cm9sQ29tbWFuZCB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coTWVtYmVyTGlzdENvbW1hbmQuY2xhc3MpOwotCi0gICAgcHJpdmF0ZSBNZW1iZXJbXSBtZW1iZXJzOwotICAgIHByaXZhdGUgTWVtYmVyc2hpcE1hbmFnZXIgbWVtYmVyc2hpcE1hbmFnZXI7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRNZW1iZXJzaGlwTWFuYWdlcihNZW1iZXJzaGlwTWFuYWdlciBtZW1iZXJzaGlwTWFuYWdlcikgewotICAgICAgICB0aGlzLm1lbWJlcnNoaXBNYW5hZ2VyID0gbWVtYmVyc2hpcE1hbmFnZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TWVtYmVycyhNZW1iZXJbXSBtZW1iZXJzKSB7Ci0gICAgICAgIHRoaXMubWVtYmVycyA9IG1lbWJlcnM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZShDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWd1cmF0aW9uQ29udGV4dCkgdGhyb3dzIENsdXN0ZXJpbmdGYXVsdCB7Ci0gICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKXsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiTWVtYmVyc2hpcE1hbmFnZXIjZG9tYWluOiAiICsgbmV3IFN0cmluZyhtZW1iZXJzaGlwTWFuYWdlci5nZXREb21haW4oKSkpOwotICAgICAgICB9Ci0gICAgICAgIE1lbWJlciBsb2NhbE1lbWJlciA9IG1lbWJlcnNoaXBNYW5hZ2VyLmdldExvY2FsTWVtYmVyKCk7Ci0gICAgICAgIGZvciAoTWVtYmVyIG1lbWJlciA6IG1lbWJlcnMpIHsKLSAgICAgICAgICAgIGFkZE1lbWJlcihsb2NhbE1lbWJlciwgbWVtYmVyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGRNZW1iZXIoTWVtYmVyIGxvY2FsTWVtYmVyLCBNZW1iZXIgbWVtYmVyKSB7Ci0gICAgICAgIGxvZy5pbmZvKCJUcnlpbmcgdG8gYWRkIG1lbWJlciAiICsgVHJpYmVzVXRpbC5nZXROYW1lKG1lbWJlcikgKyAiLi4uIik7Ci0gICAgICAgIGlmIChsb2NhbE1lbWJlciA9PSBudWxsIHx8Ci0gICAgICAgICAgICAoIShBcnJheXMuZXF1YWxzKGxvY2FsTWVtYmVyLmdldEhvc3QoKSwgbWVtYmVyLmdldEhvc3QoKSkgJiYKLSAgICAgICAgICAgICAgbG9jYWxNZW1iZXIuZ2V0UG9ydCgpID09IG1lbWJlci5nZXRQb3J0KCkpKSkgewotICAgICAgICAgICAgbG9nLmluZm8oIkFkZGVkIG1lbWJlciAiICsgVHJpYmVzVXRpbC5nZXROYW1lKG1lbWJlcikpOwotICAgICAgICAgICAgbWVtYmVyc2hpcE1hbmFnZXIubWVtYmVyQWRkZWQobWVtYmVyKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2NsdXN0ZXJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9jb250cm9sL3drYS9ScGNNZW1iZXJzaGlwUmVxdWVzdEhhbmRsZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2NsdXN0ZXJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9jb250cm9sL3drYS9ScGNNZW1iZXJzaGlwUmVxdWVzdEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDZhNGFmZC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvY29udHJvbC93a2EvUnBjTWVtYmVyc2hpcFJlcXVlc3RIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuY29udHJvbC53a2E7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuQ2x1c3RlcmluZ0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5NZW1iZXJzaGlwU2NoZW1lOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy50cmliZXMuTWVtYmVyc2hpcE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLnRyaWJlcy5UcmliZXNVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy50cmliZXMuV2thQmFzZWRNZW1iZXJzaGlwU2NoZW1lOwotaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLk1lbWJlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5SZW1vdGVQcm9jZXNzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLmdyb3VwLlJwY0NhbGxiYWNrOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci0KLS8qKgotICogSGFuZGxlcyBSUEMgbWVtYmVyc2hpcCByZXF1ZXN0cyBmcm9tIG1lbWJlcnMuIFRoaXMgaXMgdXNlZCBvbmx5IGluIGNvbmp1bmN0aW9uIHdpdGggV0tBIGJhc2VkCi0gKiBtZW1iZXJzaGlwIG1hbWFuZ2VtZW50Ci0gKi8KLXB1YmxpYyBjbGFzcyBScGNNZW1iZXJzaGlwUmVxdWVzdEhhbmRsZXIgaW1wbGVtZW50cyBScGNDYWxsYmFjayB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coUnBjTWVtYmVyc2hpcFJlcXVlc3RIYW5kbGVyLmNsYXNzKTsKLSAgICBwcml2YXRlIE1lbWJlcnNoaXBNYW5hZ2VyIG1lbWJlcnNoaXBNYW5hZ2VyOwotICAgIHByaXZhdGUgV2thQmFzZWRNZW1iZXJzaGlwU2NoZW1lIG1lbWJlcnNoaXBTY2hlbWU7Ci0KLSAgICBwdWJsaWMgUnBjTWVtYmVyc2hpcFJlcXVlc3RIYW5kbGVyKE1lbWJlcnNoaXBNYW5hZ2VyIG1lbWJlcnNoaXBNYW5hZ2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2thQmFzZWRNZW1iZXJzaGlwU2NoZW1lIG1lbWJlcnNoaXBTY2hlbWUpIHsKLSAgICAgICAgdGhpcy5tZW1iZXJzaGlwTWFuYWdlciA9IG1lbWJlcnNoaXBNYW5hZ2VyOwotICAgICAgICB0aGlzLm1lbWJlcnNoaXBTY2hlbWUgPSBtZW1iZXJzaGlwU2NoZW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTZXJpYWxpemFibGUgcmVwbHlSZXF1ZXN0KFNlcmlhbGl6YWJsZSBtc2csIE1lbWJlciBzZW5kZXIpIHsKLSAgICAgICAgU3RyaW5nIGRvbWFpbiA9IG5ldyBTdHJpbmcoc2VuZGVyLmdldERvbWFpbigpKTsKLQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiTWVtYmVyc2hpcCByZXF1ZXN0IHJlY2VpdmVkIGJ5IFJwY01lbWJlcnNoaXBSZXF1ZXN0SGFuZGxlciBmb3IgZG9tYWluICIgKwotICAgICAgICAgICAgICAgICAgICAgIGRvbWFpbik7Ci0gICAgICAgICAgICBsb2cuZGVidWcoImxvY2FsIGRvbWFpbjogIiArIG5ldyBTdHJpbmcobWVtYmVyc2hpcE1hbmFnZXIuZ2V0RG9tYWluKCkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtc2cgaW5zdGFuY2VvZiBKb2luR3JvdXBDb21tYW5kKSB7Ci0gICAgICAgICAgICBsb2cuaW5mbygiUmVjZWl2ZWQgSk9JTiBtZXNzYWdlIGZyb20gIiArIFRyaWJlc1V0aWwuZ2V0TmFtZShzZW5kZXIpKTsKLSAgICAgICAgICAgIG1lbWJlcnNoaXBNYW5hZ2VyLm1lbWJlckFkZGVkKHNlbmRlcik7Ci0KLSAgICAgICAgICAgIC8vIGRvIHNvbWV0aGluZyBzcGVjaWZpYyBmb3IgdGhlIG1lbWJlcnNoaXAgc2NoZW1lCi0gICAgICAgICAgICBtZW1iZXJzaGlwU2NoZW1lLnByb2Nlc3NKb2luKHNlbmRlcik7Ci0KLSAgICAgICAgICAgIC8vIFJldHVybiB0aGUgbGlzdCBvZiBjdXJyZW50IG1lbWJlcnMgdG8gdGhlIGNhbGxlcgotICAgICAgICAgICAgTWVtYmVyTGlzdENvbW1hbmQgbWVtTGlzdENtZCA9IG5ldyBNZW1iZXJMaXN0Q29tbWFuZCgpOwotICAgICAgICAgICAgbWVtTGlzdENtZC5zZXRNZW1iZXJzKG1lbWJlcnNoaXBNYW5hZ2VyLmdldE1lbWJlcnMoKSk7Ci0gICAgICAgICAgICBpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSl7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJTZW50IE1FTUJFUl9MSVNUIHRvICIgKyBUcmliZXNVdGlsLmdldE5hbWUoc2VuZGVyKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbWVtTGlzdENtZDsKLSAgICAgICAgfSBlbHNlIGlmIChtc2cgaW5zdGFuY2VvZiBNZW1iZXJKb2luZWRDb21tYW5kKSB7Ci0gICAgICAgICAgICBsb2cuaW5mbygiUmVjZWl2ZWQgTUVNQkVSX0pPSU5FRCBtZXNzYWdlIGZyb20gIiArIFRyaWJlc1V0aWwuZ2V0TmFtZShzZW5kZXIpKTsKLSAgICAgICAgICAgIE1lbWJlckpvaW5lZENvbW1hbmQgY29tbWFuZCA9IChNZW1iZXJKb2luZWRDb21tYW5kKSBtc2c7Ci0gICAgICAgICAgICBpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSl7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKGNvbW1hbmQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGNvbW1hbmQuc2V0TWVtYmVyc2hpcE1hbmFnZXIobWVtYmVyc2hpcE1hbmFnZXIpOwotICAgICAgICAgICAgICAgIGNvbW1hbmQuZXhlY3V0ZShudWxsKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKENsdXN0ZXJpbmdGYXVsdCBlKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGVyck1zZyA9ICJDYW5ub3QgaGFuZGxlIE1FTUJFUl9KT0lORUQgbm90aWZpY2F0aW9uIjsKLSAgICAgICAgICAgICAgICBsb2cuZXJyb3IoZXJyTXNnLCBlKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmVtb3RlUHJvY2Vzc0V4Y2VwdGlvbihlcnJNc2csIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKG1zZyBpbnN0YW5jZW9mIE1lbWJlckxpc3RDb21tYW5kKSB7Ci0gICAgICAgICAgICB0cnkgeyAgICAgICAgICAgICAgICAgICAgLy9UT0RPOiBXaGF0IGlmIHdlIHJlY2VpdmUgbW9yZSB0aGFuIG9uZSBtZW1iZXIgbGlzdCBtZXNzYWdlPwotICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJSZWNlaXZlZCBNRU1CRVJfTElTVCBtZXNzYWdlIGZyb20gIiArIFRyaWJlc1V0aWwuZ2V0TmFtZShzZW5kZXIpKTsKLSAgICAgICAgICAgICAgICBNZW1iZXJMaXN0Q29tbWFuZCBjb21tYW5kID0gKE1lbWJlckxpc3RDb21tYW5kKSBtc2c7Ci0gICAgICAgICAgICAgICAgY29tbWFuZC5zZXRNZW1iZXJzaGlwTWFuYWdlcihtZW1iZXJzaGlwTWFuYWdlcik7Ci0gICAgICAgICAgICAgICAgY29tbWFuZC5leGVjdXRlKG51bGwpOwotCi0gICAgICAgICAgICAgICAgcmV0dXJuICJQcm9jZXNzZWQgTUVNQkVSX0xJU1QgbWVzc2FnZSI7Ci0gICAgICAgICAgICAgICAgLy9UT0RPIFNlbmQgTUVNQkVSX0pPSU5FRCBtZXNzYWdlcyB0byBhbGwgbm9kZXMKLSAgICAgICAgICAgIH0gY2F0Y2ggKENsdXN0ZXJpbmdGYXVsdCBlKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGVyck1zZyA9ICJDYW5ub3QgaGFuZGxlIE1FTUJFUl9MSVNUIG1lc3NhZ2UgZnJvbSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJpYmVzVXRpbC5nZXROYW1lKHNlbmRlcik7Ci0gICAgICAgICAgICAgICAgbG9nLmVycm9yKGVyck1zZywgZSk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJlbW90ZVByb2Nlc3NFeGNlcHRpb24oZXJyTXNnLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBsZWZ0T3ZlcihTZXJpYWxpemFibGUgbXNnLCBNZW1iZXIgbWVtYmVyKSB7Ci0gICAgICAgIC8vVE9ETzogTWV0aG9kIGltcGxlbWVudGF0aW9uCi0KLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL3RyaWJlcy9BcHBsaWNhdGlvbk1vZGUuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2NsdXN0ZXJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy90cmliZXMvQXBwbGljYXRpb25Nb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlZTYyOTQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL3RyaWJlcy9BcHBsaWNhdGlvbk1vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqIENvcHlyaWdodCAyMDA0LDIwMDUgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAgICAgICAgICAgICAKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gICAgICAgICAgICAKLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgICAgICAgICAKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsICAgICAgICAgICAKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgICAKLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgICAgICAgICAKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcudHJpYmVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuQ2hhbm5lbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5NZW1iZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuZ3JvdXAuaW50ZXJjZXB0b3JzLkRvbWFpbkZpbHRlckludGVyY2VwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotLyoqCi0gKiAgUmVwcmVzZW50cyBhIG1lbWJlciBydW5uaW5nIGluIGFwcGxpY2F0aW9uIG1vZGUKLSAqLwotcHVibGljIGNsYXNzIEFwcGxpY2F0aW9uTW9kZSBpbXBsZW1lbnRzIE9wZXJhdGlvbk1vZGUgewotCi0gICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhMb2FkQmFsYW5jZXJNb2RlLmNsYXNzKTsKLQotICAgIHByaXZhdGUgYnl0ZVtdIGxvYWRCYWxhbmNlckRvbWFpbjsKLSAgICBwcml2YXRlIE1lbWJlcnNoaXBNYW5hZ2VyIG1lbWJlcnNoaXBNYW5hZ2VyOwotCi0gICAgcHVibGljIEFwcGxpY2F0aW9uTW9kZShieXRlW10gbG9hZEJhbGFuY2VyRG9tYWluLCBNZW1iZXJzaGlwTWFuYWdlciBtZW1iZXJzaGlwTWFuYWdlcikgewotICAgICAgICB0aGlzLmxvYWRCYWxhbmNlckRvbWFpbiA9IGxvYWRCYWxhbmNlckRvbWFpbjsKLSAgICAgICAgdGhpcy5tZW1iZXJzaGlwTWFuYWdlciA9IG1lbWJlcnNoaXBNYW5hZ2VyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZEludGVyY2VwdG9ycyhDaGFubmVsIGNoYW5uZWwpIHsKLSAgICAgICAgRG9tYWluRmlsdGVySW50ZXJjZXB0b3IgZGZpID0gbmV3IERvbWFpbkZpbHRlckludGVyY2VwdG9yKCk7Ci0gICAgICAgIGRmaS5zZXRPcHRpb25GbGFnKFRyaWJlc0NvbnN0YW50cy5NRU1CRVJTSElQX01TR19PUFRJT04pOwotICAgICAgICBkZmkuc2V0RG9tYWluKGxvYWRCYWxhbmNlckRvbWFpbik7Ci0gICAgICAgIGNoYW5uZWwuYWRkSW50ZXJjZXB0b3IoZGZpKTsKLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIkFkZGVkIERvbWFpbiBGaWx0ZXIgSW50ZXJjZXB0b3IiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGluaXQoQ2hhbm5lbCBjaGFubmVsKSB7Ci0gICAgICAgIC8vIE5vdGhpbmcgdG8gYmUgZG9uZQotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PE1lbWJlcnNoaXBNYW5hZ2VyPiBnZXRNZW1iZXJzaGlwTWFuYWdlcnMoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgQXJyYXlMaXN0PE1lbWJlcnNoaXBNYW5hZ2VyPigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG5vdGlmeU1lbWJlckpvaW4oZmluYWwgTWVtYmVyIG1lbWJlcikgewotICAgICAgICBUaHJlYWQgdGggPSBuZXcgVGhyZWFkKCl7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgbWVtYmVyc2hpcE1hbmFnZXIuc2VuZE1lbWJlckpvaW5lZFRvQWxsKG1lbWJlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIHRoLnN0YXJ0KCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL3RyaWJlcy9BdE1vc3RPbmNlSW50ZXJjZXB0b3IuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2NsdXN0ZXJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy90cmliZXMvQXRNb3N0T25jZUludGVyY2VwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhMzAzNjEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL3RyaWJlcy9BdE1vc3RPbmNlSW50ZXJjZXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy50cmliZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5DaGFubmVsTWVzc2FnZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5ncm91cC5DaGFubmVsSW50ZXJjZXB0b3JCYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIE1lc3NhZ2UgaW50ZXJlY2VwdG9yIGZvciBoYW5kbGluZyBhdC1tb3N0LW9uY2UgbWVzc2FnZSBwcm9jZXNzaW5nIHNlbWFudGljcwotICovCi1wdWJsaWMgY2xhc3MgQXRNb3N0T25jZUludGVyY2VwdG9yIGV4dGVuZHMgQ2hhbm5lbEludGVyY2VwdG9yQmFzZSB7ICAgICAgICAgIAotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEF0TW9zdE9uY2VJbnRlcmNlcHRvci5jbGFzcyk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPENoYW5uZWxNZXNzYWdlLCBMb25nPiByZWNlaXZlZE1lc3NhZ2VzID0KLSAgICAgICAgICAgIG5ldyBIYXNoTWFwPENoYW5uZWxNZXNzYWdlLCBMb25nPigpOwotCi0gICAgLyoqCi0gICAgICogVGhlIHRpbWUgYSBtZXNzYWdlIGxpdmVzIGluIHRoZSByZWNlaXZlZE1lc3NhZ2VzIE1hcAotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUSU1FT1VUID0gNSAqIDYwICogMTAwMDsKLQotICAgIHB1YmxpYyBBdE1vc3RPbmNlSW50ZXJjZXB0b3IoKSB7Ci0gICAgICAgIFRocmVhZCBjbGVhbnVwVGhyZWFkID0gbmV3IFRocmVhZChuZXcgTWVzc2FnZUNsZWFudXBUYXNrKCkpOwotICAgICAgICBjbGVhbnVwVGhyZWFkLnNldFByaW9yaXR5KFRocmVhZC5NSU5fUFJJT1JJVFkpOwotICAgICAgICBjbGVhbnVwVGhyZWFkLnN0YXJ0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbWVzc2FnZVJlY2VpdmVkKENoYW5uZWxNZXNzYWdlIG1zZykgewotICAgICAgICBpZiAob2tUb1Byb2Nlc3MobXNnLmdldE9wdGlvbnMoKSkpIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAocmVjZWl2ZWRNZXNzYWdlcykgewotICAgICAgICAgICAgICAgIGlmIChyZWNlaXZlZE1lc3NhZ2VzLmdldChtc2cpID09IG51bGwpIHsgIC8vIElmIGl0IGlzIGEgbmV3IG1lc3NhZ2UsIGtlZXAgdHJhY2sgb2YgaXQKLSAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZWRNZXNzYWdlcy5wdXQobXNnLCBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHN1cGVyLm1lc3NhZ2VSZWNlaXZlZChtc2cpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7ICAvLyBJZiBpdCBpcyBhIGR1cGxpY2F0ZSBtZXNzYWdlLCBkaXNjYXJkIGl0LiBpLmUuIGRvbnQgY2FsbCBzdXBlci5tZXNzYWdlUmVjZWl2ZWQKLSAgICAgICAgICAgICAgICAgICAgbG9nLmluZm8oIkR1cGxpY2F0ZSBtZXNzYWdlIHJlY2VpdmVkIGZyb20gIiArIFRyaWJlc1V0aWwuZ2V0TmFtZShtc2cuZ2V0QWRkcmVzcygpKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3VwZXIubWVzc2FnZVJlY2VpdmVkKG1zZyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIE1lc3NhZ2VDbGVhbnVwVGFzayBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKLQotICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeyAvLyBUaGlzIHRhc2sgc2hvdWxkIG5ldmVyIHRlcm1pbmF0ZQotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcChUSU1FT1VUKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIExpc3Q8Q2hhbm5lbE1lc3NhZ2U+IHRvQmVSZW1vdmVkID0gbmV3IEFycmF5TGlzdDxDaGFubmVsTWVzc2FnZT4oKTsKLSAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnlpZWxkKCk7Ci0gICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAocmVjZWl2ZWRNZXNzYWdlcykgewotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChDaGFubmVsTWVzc2FnZSBtc2cgOiByZWNlaXZlZE1lc3NhZ2VzLmtleVNldCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBhcnJpdmFsVGltZSA9IHJlY2VpdmVkTWVzc2FnZXMuZ2V0KG1zZyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gYXJyaXZhbFRpbWUgPj0gVElNRU9VVCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b0JlUmVtb3ZlZC5hZGQobXNnKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRvQmVSZW1vdmVkLnNpemUoKSA+IDEwMDAwKSB7IC8vIERvIG5vdCBhbGxvdyB0aGlzIHRocmVhZCB0byBydW4gZm9yIHRvbyBsb25nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoQ2hhbm5lbE1lc3NhZ2UgbXNnIDogdG9CZVJlbW92ZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZlZE1lc3NhZ2VzLnJlbW92ZShtc2cpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkNsZWFuZWQgdXAgbWVzc2FnZSAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIkV4Y2VwdGlvbiBvY2N1cnJlZCB3aGlsZSB0cnlpbmcgdG8gY2xlYW51cCBtZXNzYWdlcyIsIGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2NsdXN0ZXJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy90cmliZXMvQXhpczJDb29yZGluYXRvci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL3RyaWJlcy9BeGlzMkNvb3JkaW5hdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwNTg0Y2IuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL3RyaWJlcy9BeGlzMkNvb3JkaW5hdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gKiBDb3B5cmlnaHQgMjAwNCwyMDA1IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgICAgICAgICAgICAgCi0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICAgICAgICAgICAgCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlICAgICAgICAgCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAgICAgICAgICAgCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gICAgCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kICAgICAgICAgCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLnRyaWJlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLk1lbWJlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5ncm91cC5pbnRlcmNlcHRvcnMuTm9uQmxvY2tpbmdDb29yZGluYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuTWVtYmVyc2hpcExpc3RlbmVyOwotCi0vKioKLSAqIFRoZSBub24tYmxvY2tpbmcgY29vcmRpbmF0b3IgaW50ZXJjZXB0b3IKLSAqLwotcHVibGljIGNsYXNzIEF4aXMyQ29vcmRpbmF0b3IgZXh0ZW5kcyBOb25CbG9ja2luZ0Nvb3JkaW5hdG9yIHsKLQotICAgIHByaXZhdGUgTWVtYmVyc2hpcExpc3RlbmVyIG1lbWJlcnNoaXBMaXN0ZW5lcjsKLQotICAgIHB1YmxpYyBBeGlzMkNvb3JkaW5hdG9yKE1lbWJlcnNoaXBMaXN0ZW5lciBtZW1iZXJzaGlwTGlzdGVuZXIpIHsKLSAgICAgICAgdGhpcy5tZW1iZXJzaGlwTGlzdGVuZXIgPSBtZW1iZXJzaGlwTGlzdGVuZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbWVtYmVyQWRkZWQoTWVtYmVyIG1lbWJlcikgewotICAgICAgICBzdXBlci5tZW1iZXJBZGRlZChtZW1iZXIpOwotICAgICAgICBpZiAobWVtYmVyc2hpcExpc3RlbmVyICE9IG51bGwgJiYKLSAgICAgICAgICAgIFRyaWJlc1V0aWwuYXJlSW5TYW1lRG9tYWluKGdldExvY2FsTWVtYmVyKHRydWUpLCBtZW1iZXIpKSB7Ci0gICAgICAgICAgICBtZW1iZXJzaGlwTGlzdGVuZXIubWVtYmVyQWRkZWQoVHJpYmVzVXRpbC50b0F4aXMyTWVtYmVyKG1lbWJlciksIGlzQ29vcmRpbmF0b3IoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBtZW1iZXJEaXNhcHBlYXJlZChNZW1iZXIgbWVtYmVyKSB7Ci0gICAgICAgIHN1cGVyLm1lbWJlckRpc2FwcGVhcmVkKG1lbWJlcik7Ci0gICAgICAgIGlmKCFUcmliZXNVdGlsLmFyZUluU2FtZURvbWFpbihnZXRMb2NhbE1lbWJlcih0cnVlKSwgbWVtYmVyKSl7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlzQ29vcmRpbmF0b3IoKSkgewotICAgICAgICAgICAgaWYgKFRyaWJlc1V0aWwudG9BeGlzMk1lbWJlcihtZW1iZXIpLmlzQWN0aXZlKCkpIHsKLQotICAgICAgICAgICAgICAgIC8vIElmIHRoZSBsb2NhbCBtZW1iZXIgaXMgUEFTU0lWRSwgd2UgdHJ5IHRvIGFjdGl2YXRlIGl0Ci0gICAgICAgICAgICAgICAgaWYgKCFUcmliZXNVdGlsLnRvQXhpczJNZW1iZXIoZ2V0TG9jYWxNZW1iZXIodHJ1ZSkpLmlzQWN0aXZlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy9UT0RPOiBBQ1RJVkFURSBsb2NhbCBtZW1iZXIKLQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIE1lbWJlcltdIG1lbWJlcnMgPSBnZXRNZW1iZXJzKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoTWVtYmVyIGFNZW1iZXIgOiBtZW1iZXJzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIVRyaWJlc1V0aWwudG9BeGlzMk1lbWJlcihtZW1iZXIpLmlzQWN0aXZlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBTZW5kIEFDVElWQVRFIG1lc3NhZ2UgdG8gdGhpcyBwYXNzaXZlIG1lbWJlcgotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvL1RPRE8gSWYgYSBQQVNTSVZFIG1lbWJlciBkaXNhcHBlYXJlZCwgd2UgbWF5IG5lZWQgdG8gc3RhcnR1cCBhbm90aGVyCi0gICAgICAgICAgICAgICAgLy8gcGFzc2l2ZSBub2RlCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1lbWJlcnNoaXBMaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtZW1iZXJzaGlwTGlzdGVuZXIubWVtYmVyRGlzYXBwZWFyZWQoVHJpYmVzVXRpbC50b0F4aXMyTWVtYmVyKG1lbWJlciksIGlzQ29vcmRpbmF0b3IoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvdHJpYmVzL0NoYW5uZWxMaXN0ZW5lci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL3RyaWJlcy9DaGFubmVsTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk3NjQ4Ni4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvdHJpYmVzL0NoYW5uZWxMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLnRyaWJlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5DbHVzdGVyaW5nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5DbHVzdGVyaW5nRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkNsdXN0ZXJpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5jb25maWd1cmF0aW9uLkRlZmF1bHRDb25maWd1cmF0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuY29udGV4dC5Db250ZXh0Q2x1c3RlcmluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLmNvbnRleHQuRGVmYXVsdENvbnRleHRNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNNb2R1bGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZUdyb3VwOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLkJ5dGVNZXNzYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLk1lbWJlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5SZW1vdGVQcm9jZXNzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLmdyb3VwLlJwY01lc3NhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuaW8uWEJ5dGVCdWZmZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGNsYXNzIENoYW5uZWxMaXN0ZW5lciBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLkNoYW5uZWxMaXN0ZW5lciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKENoYW5uZWxMaXN0ZW5lci5jbGFzcyk7Ci0KLSAgICBwcml2YXRlIERlZmF1bHRDb250ZXh0TWFuYWdlciBjb250ZXh0TWFuYWdlcjsKLSAgICBwcml2YXRlIERlZmF1bHRDb25maWd1cmF0aW9uTWFuYWdlciBjb25maWd1cmF0aW9uTWFuYWdlcjsKLQotICAgIHByaXZhdGUgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlndXJhdGlvbkNvbnRleHQ7Ci0KLSAgICBwdWJsaWMgQ2hhbm5lbExpc3RlbmVyKENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ3VyYXRpb25Db250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdENvbmZpZ3VyYXRpb25NYW5hZ2VyIGNvbmZpZ3VyYXRpb25NYW5hZ2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdENvbnRleHRNYW5hZ2VyIGNvbnRleHRNYW5hZ2VyKSB7Ci0gICAgICAgIHRoaXMuY29uZmlndXJhdGlvbk1hbmFnZXIgPSBjb25maWd1cmF0aW9uTWFuYWdlcjsKLSAgICAgICAgdGhpcy5jb250ZXh0TWFuYWdlciA9IGNvbnRleHRNYW5hZ2VyOwotICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb25Db250ZXh0ID0gY29uZmlndXJhdGlvbkNvbnRleHQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q29udGV4dE1hbmFnZXIoRGVmYXVsdENvbnRleHRNYW5hZ2VyIGNvbnRleHRNYW5hZ2VyKSB7Ci0gICAgICAgIHRoaXMuY29udGV4dE1hbmFnZXIgPSBjb250ZXh0TWFuYWdlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb25maWd1cmF0aW9uTWFuYWdlcihEZWZhdWx0Q29uZmlndXJhdGlvbk1hbmFnZXIgY29uZmlndXJhdGlvbk1hbmFnZXIpIHsKLSAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uTWFuYWdlciA9IGNvbmZpZ3VyYXRpb25NYW5hZ2VyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENvbmZpZ3VyYXRpb25Db250ZXh0KENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ3VyYXRpb25Db250ZXh0KSB7Ci0gICAgICAgIHRoaXMuY29uZmlndXJhdGlvbkNvbnRleHQgPSBjb25maWd1cmF0aW9uQ29udGV4dDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbnZva2VkIGJ5IHRoZSBjaGFubmVsIHRvIGRldGVybWluZSBpZiB0aGUgbGlzdGVuZXIgd2lsbCBwcm9jZXNzIHRoaXMgbWVzc2FnZSBvciBub3QuCi0gICAgICogQHBhcmFtIG1zZyBTZXJpYWxpemFibGUKLSAgICAgKiBAcGFyYW0gc2VuZGVyIE1lbWJlcgotICAgICAqIEByZXR1cm4gYm9vbGVhbgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGFjY2VwdChTZXJpYWxpemFibGUgbXNnLCBNZW1iZXIgc2VuZGVyKSB7Ci0gICAgICAgIHJldHVybiAhKG1zZyBpbnN0YW5jZW9mIFJwY01lc3NhZ2UpOyAgLy8gUnBjTWVzc2FnZXMgIHdpbGwgbm90IGJlIGhhbmRsZWQgYnkgdGhpcyBsaXN0ZW5lcgotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlY2VpdmUgYSBtZXNzYWdlIGZyb20gdGhlIGNoYW5uZWwKLSAgICAgKiBAcGFyYW0gbXNnIFNlcmlhbGl6YWJsZQotICAgICAqIEBwYXJhbSBzZW5kZXIgLSB0aGUgc291cmNlIG9mIHRoZSBtZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgbWVzc2FnZVJlY2VpdmVkKFNlcmlhbGl6YWJsZSBtc2csIE1lbWJlciBzZW5kZXIpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEF4aXNDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpOwotICAgICAgICAgICAgTGlzdDxDbGFzc0xvYWRlcj4gY2xhc3NMb2FkZXJzID0gbmV3IEFycmF5TGlzdDxDbGFzc0xvYWRlcj4oKTsKLSAgICAgICAgICAgIGNsYXNzTG9hZGVycy5hZGQoY29uZmlndXJhdGlvbi5nZXRTeXN0ZW1DbGFzc0xvYWRlcigpKTsKLSAgICAgICAgICAgIGNsYXNzTG9hZGVycy5hZGQoZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpKTsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGNvbmZpZ3VyYXRpb24uZ2V0U2VydmljZUdyb3VwcygpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICBBeGlzU2VydmljZUdyb3VwIGdyb3VwID0gKEF4aXNTZXJ2aWNlR3JvdXApIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgIGNsYXNzTG9hZGVycy5hZGQoZ3JvdXAuZ2V0U2VydmljZUdyb3VwQ2xhc3NMb2FkZXIoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IoT2JqZWN0IG9iajogY29uZmlndXJhdGlvbi5nZXRNb2R1bGVzKCkudmFsdWVzKCkpeyAgICAKLSAgICAgICAgICAgICAgICBBeGlzTW9kdWxlIG1vZHVsZSA9IChBeGlzTW9kdWxlKSBvYmo7Ci0gICAgICAgICAgICAgICAgY2xhc3NMb2FkZXJzLmFkZChtb2R1bGUuZ2V0TW9kdWxlQ2xhc3NMb2FkZXIoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBieXRlW10gbWVzc2FnZSA9ICgoQnl0ZU1lc3NhZ2UpIG1zZykuZ2V0TWVzc2FnZSgpOwotICAgICAgICAgICAgbXNnID0gWEJ5dGVCdWZmZXIuZGVzZXJpYWxpemUobWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTG9hZGVycy50b0FycmF5KG5ldyBDbGFzc0xvYWRlcltjbGFzc0xvYWRlcnMuc2l6ZSgpXSkpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgU3RyaW5nIGVyck1zZyA9ICJDYW5ub3QgZGVzZXJpYWxpemUgcmVjZWl2ZWQgbWVzc2FnZSI7Ci0gICAgICAgICAgICBsb2cuZXJyb3IoZXJyTXNnLCBlKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBSZW1vdGVQcm9jZXNzRXhjZXB0aW9uKGVyck1zZywgZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBJZiB0aGUgc3lzdGVtIGhhcyBub3Qgc3RpbGwgYmVlbiBpbnRpYWxpemVkLCByZWplY3QgYWxsIGluY29taW5nIG1lc3NhZ2VzLCBleGNlcHQgdGhlCi0gICAgICAgIC8vIEdldFN0YXRlUmVzcG9uc2VDb21tYW5kIG1lc3NhZ2UKLSAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb25Db250ZXh0LgotICAgICAgICAgICAgICAgIGdldFByb3BlcnR5Tm9uUmVwbGljYWJsZShDbHVzdGVyaW5nQ29uc3RhbnRzLkNMVVNURVJfSU5JVElBTElaRUQpID09IG51bGwpIHsKLSAgICAgICAgICAgIGxvZy53YXJuKCJSZWNlaXZlZCBtZXNzYWdlICIgKyBtc2cgKwotICAgICAgICAgICAgICAgICAgICAgIiBiZWZvcmUgY2x1c3RlciBpbml0aWFsaXphdGlvbiBoYXMgYmVlbiBjb21wbGV0ZWQgZnJvbSAiICsKLSAgICAgICAgICAgICAgICAgICAgIFRyaWJlc1V0aWwuZ2V0TmFtZShzZW5kZXIpKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiUmVjZWl2ZWQgbWVzc2FnZSAiICsgbXNnICsgIiBmcm9tICIgKyBUcmliZXNVdGlsLmdldE5hbWUoc2VuZGVyKSk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcHJvY2Vzc01lc3NhZ2UobXNnKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIFN0cmluZyBlcnJNc2cgPSAiQ2Fubm90IHByb2Nlc3MgcmVjZWl2ZWQgbWVzc2FnZSI7Ci0gICAgICAgICAgICBsb2cuZXJyb3IoZXJyTXNnLCBlKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBSZW1vdGVQcm9jZXNzRXhjZXB0aW9uKGVyck1zZywgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc01lc3NhZ2UoU2VyaWFsaXphYmxlIG1zZykgdGhyb3dzIENsdXN0ZXJpbmdGYXVsdCB7Ci0gICAgICAgIGlmIChtc2cgaW5zdGFuY2VvZiBDb250ZXh0Q2x1c3RlcmluZ0NvbW1hbmQgJiYgY29udGV4dE1hbmFnZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgQ29udGV4dENsdXN0ZXJpbmdDb21tYW5kIGN0eENtZCA9IChDb250ZXh0Q2x1c3RlcmluZ0NvbW1hbmQpIG1zZzsKLSAgICAgICAgICAgIGN0eENtZC5leGVjdXRlKGNvbmZpZ3VyYXRpb25Db250ZXh0KTsKLSAgICAgICAgfSBlbHNlIGlmIChtc2cgaW5zdGFuY2VvZiBDb25maWd1cmF0aW9uQ2x1c3RlcmluZ0NvbW1hbmQgJiYgY29uZmlndXJhdGlvbk1hbmFnZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgY29uZmlndXJhdGlvbk1hbmFnZXIucHJvY2VzcygoQ29uZmlndXJhdGlvbkNsdXN0ZXJpbmdDb21tYW5kKSBtc2cpOwotICAgICAgICB9IAotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2NsdXN0ZXJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy90cmliZXMvQ2hhbm5lbFNlbmRlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL3RyaWJlcy9DaGFubmVsU2VuZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4MjE1ZjguLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL3RyaWJlcy9DaGFubmVsU2VuZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcudHJpYmVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLkNsdXN0ZXJpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5DbHVzdGVyaW5nRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLk1lc3NhZ2VTZW5kZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuQnl0ZU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuQ2hhbm5lbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5DaGFubmVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLk1lbWJlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5Ob3RTZXJpYWxpemFibGVFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW07Ci0KLXB1YmxpYyBjbGFzcyBDaGFubmVsU2VuZGVyIGltcGxlbWVudHMgTWVzc2FnZVNlbmRlciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coQ2hhbm5lbFNlbmRlci5jbGFzcyk7Ci0gICAgcHJpdmF0ZSBDaGFubmVsIGNoYW5uZWw7Ci0gICAgcHJpdmF0ZSBib29sZWFuIHN5bmNocm9uaXplQWxsTWVtYmVyczsKLSAgICBwcml2YXRlIE1lbWJlcnNoaXBNYW5hZ2VyIG1lbWJlcnNoaXBNYW5hZ2VyOwotCi0gICAgcHVibGljIENoYW5uZWxTZW5kZXIoQ2hhbm5lbCBjaGFubmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgIE1lbWJlcnNoaXBNYW5hZ2VyIG1lbWJlcnNoaXBNYW5hZ2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc3luY2hyb25pemVBbGxNZW1iZXJzKSB7Ci0gICAgICAgIHRoaXMuY2hhbm5lbCA9IGNoYW5uZWw7Ci0gICAgICAgIHRoaXMubWVtYmVyc2hpcE1hbmFnZXIgPSBtZW1iZXJzaGlwTWFuYWdlcjsKLSAgICAgICAgdGhpcy5zeW5jaHJvbml6ZUFsbE1lbWJlcnMgPSBzeW5jaHJvbml6ZUFsbE1lbWJlcnM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2VuZFRvR3JvdXAoQ2x1c3RlcmluZ0NvbW1hbmQgbXNnKSB0aHJvd3MgQ2x1c3RlcmluZ0ZhdWx0IHsKLSAgICAgICAgaWYgKGNoYW5uZWwgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIE1lbWJlcltdIG1lbWJlcnMgPSBtZW1iZXJzaGlwTWFuYWdlci5nZXRNZW1iZXJzKCk7Ci0KLSAgICAgICAgLy8gS2VlcCByZXRyeWluZywgc2luY2UgYXQgdGhlIHBvaW50IG9mIHRyeWluZyB0byBzZW5kIHRoZSBtc2csIGEgbWVtYmVyIG1heSBsZWF2ZSB0aGUgZ3JvdXAKLSAgICAgICAgLy8gY2F1c2luZyBhIHZpZXcgY2hhbmdlLiBBbGwgbm9kZXMgaW4gYSB2aWV3IHNob3VsZCBnZXQgdGhlIG1zZwotICAgICAgICBpZiAobWVtYmVycy5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGlmIChzeW5jaHJvbml6ZUFsbE1lbWJlcnMpIHsKLSAgICAgICAgICAgICAgICAgICAgY2hhbm5lbC5zZW5kKG1lbWJlcnMsIHRvQnl0ZU1lc3NhZ2UobXNnKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYW5uZWwuU0VORF9PUFRJT05TX1VTRV9BQ0sgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbm5lbC5TRU5EX09QVElPTlNfU1lOQ0hST05JWkVEX0FDSyB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmliZXNDb25zdGFudHMuTVNHX09SREVSX09QVElPTiB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmliZXNDb25zdGFudHMuQVRfTU9TVF9PTkNFX09QVElPTik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgY2hhbm5lbC5zZW5kKG1lbWJlcnMsIHRvQnl0ZU1lc3NhZ2UobXNnKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYW5uZWwuU0VORF9PUFRJT05TX0FTWU5DSFJPTk9VUyB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmliZXNDb25zdGFudHMuTVNHX09SREVSX09QVElPTiB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmliZXNDb25zdGFudHMuQVRfTU9TVF9PTkNFX09QVElPTik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlNlbnQgIiArIG1zZyArICIgdG8gZ3JvdXAiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChOb3RTZXJpYWxpemFibGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gIkNvdWxkIG5vdCBzZW5kIGNvbW1hbmQgbWVzc2FnZSAiICsgbXNnICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgdG8gZ3JvdXAgc2luY2UgaXQgaXMgbm90IHNlcmlhbGl6YWJsZS4iOwotICAgICAgICAgICAgICAgIGxvZy5lcnJvcihtZXNzYWdlLCBlKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ2x1c3RlcmluZ0ZhdWx0KG1lc3NhZ2UsIGUpOwotICAgICAgICAgICAgfSBjYXRjaCAoQ2hhbm5lbEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmVycm9yKCJDb3VsZCBub3Qgc2VuZCBtZXNzYWdlIHRvIHNvbWUgbWVtYmVycyIsIGUpOwotICAgICAgICAgICAgICAgIENoYW5uZWxFeGNlcHRpb24uRmF1bHR5TWVtYmVyW10gZmF1bHR5TWVtYmVycyA9IGUuZ2V0RmF1bHR5TWVtYmVycygpOwotICAgICAgICAgICAgICAgIGZvciAoQ2hhbm5lbEV4Y2VwdGlvbi5GYXVsdHlNZW1iZXIgZmF1bHR5TWVtYmVyIDogZmF1bHR5TWVtYmVycykgewotICAgICAgICAgICAgICAgICAgICBNZW1iZXIgbWVtYmVyID0gZmF1bHR5TWVtYmVyLmdldE1lbWJlcigpOwotICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIk1lbWJlciAiICsgVHJpYmVzVXRpbC5nZXROYW1lKG1lbWJlcikgKyAiIGlzIGZhdWx0eSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYXVsdHlNZW1iZXIuZ2V0Q2F1c2UoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9ICJFcnJvciBzZW5kaW5nIGNvbW1hbmQgbWVzc2FnZSA6ICIgKyBtc2cgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi4gUmVhc29uICIgKyBlLmdldE1lc3NhZ2UoKTsKLSAgICAgICAgICAgICAgICBsb2cud2FybihtZXNzYWdlLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgQnl0ZU1lc3NhZ2UgdG9CeXRlTWVzc2FnZShDbHVzdGVyaW5nQ29tbWFuZCBtc2cpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBib3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgIE9iamVjdE91dHB1dFN0cmVhbSBvdXQgPSBuZXcgT2JqZWN0T3V0cHV0U3RyZWFtKGJvcyk7Ci0gICAgICAgIG91dC53cml0ZU9iamVjdChtc2cpOwotICAgICAgICBvdXQuZmx1c2goKTsKLSAgICAgICAgb3V0LmNsb3NlKCk7Ci0gICAgICAgIHJldHVybiBuZXcgQnl0ZU1lc3NhZ2UoYm9zLnRvQnl0ZUFycmF5KCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNlbmRUb1NlbGYoQ2x1c3RlcmluZ0NvbW1hbmQgbXNnKSB0aHJvd3MgQ2x1c3RlcmluZ0ZhdWx0IHsKLSAgICAgICAgaWYgKGNoYW5uZWwgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjaGFubmVsLnNlbmQobmV3IE1lbWJlcltde2NoYW5uZWwuZ2V0TG9jYWxNZW1iZXIodHJ1ZSl9LAotICAgICAgICAgICAgICAgICAgICAgICAgIHRvQnl0ZU1lc3NhZ2UobXNnKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBDaGFubmVsLlNFTkRfT1BUSU9OU19VU0VfQUNLKTsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiU2VudCAiICsgbXNnICsgIiB0byBzZWxmIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ2x1c3RlcmluZ0ZhdWx0KGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2VuZFRvTWVtYmVyKENsdXN0ZXJpbmdDb21tYW5kIGNtZCwgTWVtYmVyIG1lbWJlcikgdGhyb3dzIENsdXN0ZXJpbmdGYXVsdCB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAobWVtYmVyLmlzUmVhZHkoKSkgewotICAgICAgICAgICAgICAgIGNoYW5uZWwuc2VuZChuZXcgTWVtYmVyW117bWVtYmVyfSwgdG9CeXRlTWVzc2FnZShjbWQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFubmVsLlNFTkRfT1BUSU9OU19VU0VfQUNLIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbm5lbC5TRU5EX09QVElPTlNfU1lOQ0hST05JWkVEX0FDSyB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyaWJlc0NvbnN0YW50cy5NU0dfT1JERVJfT1BUSU9OIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJpYmVzQ29uc3RhbnRzLkFUX01PU1RfT05DRV9PUFRJT04pOwotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlNlbnQgIiArIGNtZCArICIgdG8gIiArIFRyaWJlc1V0aWwuZ2V0TmFtZShtZW1iZXIpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKE5vdFNlcmlhbGl6YWJsZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9ICJDb3VsZCBub3Qgc2VuZCBjb21tYW5kIG1lc3NhZ2UgdG8gIiArIFRyaWJlc1V0aWwuZ2V0TmFtZShtZW1iZXIpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBzaW5jZSBpdCBpcyBub3Qgc2VyaWFsaXphYmxlLiI7Ci0gICAgICAgICAgICBsb2cuZXJyb3IobWVzc2FnZSwgZSk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ2x1c3RlcmluZ0ZhdWx0KG1lc3NhZ2UsIGUpOwotICAgICAgICB9IGNhdGNoIChDaGFubmVsRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGxvZy5lcnJvcigiQ291bGQgbm90IHNlbmQgbWVzc2FnZSB0byAiICsgVHJpYmVzVXRpbC5nZXROYW1lKG1lbWJlcikpOwotICAgICAgICAgICAgQ2hhbm5lbEV4Y2VwdGlvbi5GYXVsdHlNZW1iZXJbXSBmYXVsdHlNZW1iZXJzID0gZS5nZXRGYXVsdHlNZW1iZXJzKCk7Ci0gICAgICAgICAgICBsb2cuZXJyb3IoIk1lbWJlciAiICsgVHJpYmVzVXRpbC5nZXROYW1lKG1lbWJlcikgKyAiIGlzIGZhdWx0eSIsCi0gICAgICAgICAgICAgICAgICAgICAgZmF1bHR5TWVtYmVyc1swXS5nZXRDYXVzZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gIkNvdWxkIG5vdCBzZW5kIG1lc3NhZ2UgdG8gIiArIFRyaWJlc1V0aWwuZ2V0TmFtZShtZW1iZXIpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi4gUmVhc29uICIgKyBlLmdldE1lc3NhZ2UoKTsKLSAgICAgICAgICAgIGxvZy53YXJuKG1lc3NhZ2UsIGUpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL3RyaWJlcy9Mb2FkQmFsYW5jZXJJbnRlcmNlcHRvci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL3RyaWJlcy9Mb2FkQmFsYW5jZXJJbnRlcmNlcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzQ2YTNlLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2NsdXN0ZXJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy90cmliZXMvTG9hZEJhbGFuY2VySW50ZXJjZXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqIENvcHlyaWdodCAyMDA0LDIwMDUgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAgICAgICAgICAgICAKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gICAgICAgICAgICAKLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgICAgICAgICAKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsICAgICAgICAgICAKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgICAKLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgICAgICAgICAKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcudHJpYmVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuQ2hhbm5lbE1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuZ3JvdXAuQ2hhbm5lbEludGVyY2VwdG9yQmFzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5tZW1iZXJzaGlwLk1lbWJlcnNoaXA7Ci0KLS8qKgotICogVGhpcyBpbnRlcmNlcHRvciBpcyB1c2VkIHdoZW4gdGhpcyBtZW1iZXIgaXMgcGFydCBvZiBhIGxvYWQgYmFsYW5jZXIgY2x1c3Rlci4KLSAqIFRoaXMgbG9hZCBiYWxhbmNlciBpcyByZXNwb25zaWJsZSBmb3IgbG9hZCBiYWxhbmNpbmcgYWNyb3NzIGFwcGxpY2F0aW9ucyBkZXBsb3llZCBpbgotICogYW5vdGhlciBncm91cC4KLSAqLwotcHVibGljIGNsYXNzIExvYWRCYWxhbmNlckludGVyY2VwdG9yIGV4dGVuZHMgQ2hhbm5lbEludGVyY2VwdG9yQmFzZSB7Ci0KLSAgICAvKioKLSAgICAgKiBSZXByZXNlbnRzIHRoZSBsb2FkIGJhbGFuY2VyIGdyb3VwCi0gICAgICovCi0gICAgcHJvdGVjdGVkIE1lbWJlcnNoaXAgbG9hZEJhbGFuY2VyTWVtYmVyc2hpcCA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBSZXByZXNlbnRzIHRoZSBsb2FkIGJhbGFuY2VyIGdyb3VwCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJ5dGVbXSBsb2FkQmFsYW5jZXJEb21haW4gPSBuZXcgYnl0ZVswXTsKLQotICAgIHB1YmxpYyBMb2FkQmFsYW5jZXJJbnRlcmNlcHRvcihieXRlW10gbG9hZEJhbGFuY2VyRG9tYWluKSB7Ci0gICAgICAgIHRoaXMubG9hZEJhbGFuY2VyRG9tYWluID0gbG9hZEJhbGFuY2VyRG9tYWluOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG1lc3NhZ2VSZWNlaXZlZChDaGFubmVsTWVzc2FnZSBtc2cpIHsKLSAgICAgICAgLy8gSWdub3JlIGFsbCBtZXNzYWdlcyB3aGljaCBhcmUgbm90IGludGVuZGVkIGZvciB0aGUgbG9hZCBiYWxhbmNlciBncm91cCBvciB3aGljaCBhcmUgbm90Ci0gICAgICAgIC8vIG1lbWJlcnNoaXAgbWVzc2FnZXMKLSAgICAgICAgaWYgKG9rVG9Qcm9jZXNzKG1zZy5nZXRPcHRpb25zKCkpIHx8Ci0gICAgICAgICAgICBUcmliZXNVdGlsLmlzSW5Eb21haW4obXNnLmdldEFkZHJlc3MoKSwgbG9hZEJhbGFuY2VyRG9tYWluKSkgewotICAgICAgICAgICAgc3VwZXIubWVzc2FnZVJlY2VpdmVkKG1zZyk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvdHJpYmVzL0xvYWRCYWxhbmNlck1vZGUuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2NsdXN0ZXJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy90cmliZXMvTG9hZEJhbGFuY2VyTW9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGViZTVjLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2NsdXN0ZXJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy90cmliZXMvTG9hZEJhbGFuY2VyTW9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqIENvcHlyaWdodCAyMDA0LDIwMDUgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAgICAgICAgICAgICAKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gICAgICAgICAgICAKLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgICAgICAgICAKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsICAgICAgICAgICAKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgICAKLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgICAgICAgICAKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcudHJpYmVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLkxvYWRCYWxhbmNlRXZlbnRIYW5kbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5jb250cm9sLndrYS5NZW1iZXJKb2luZWRDb21tYW5kOwotaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLkNoYW5uZWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuQ2hhbm5lbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5NZW1iZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuTWVtYmVyc2hpcExpc3RlbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLlJlbW90ZVByb2Nlc3NFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuZ3JvdXAuUnBjQ2hhbm5lbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBSZXByZXNlbnRzIGEgbWVtYmVyIHJ1bm5pbmcgaW4gbG9hZCBiYWxhbmNlIG1vZGUKLSAqLwotcHVibGljIGNsYXNzIExvYWRCYWxhbmNlck1vZGUgaW1wbGVtZW50cyBPcGVyYXRpb25Nb2RlIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhMb2FkQmFsYW5jZXJNb2RlLmNsYXNzKTsKLQotICAgIHByaXZhdGUgYnl0ZVtdIGxvYWRCYWxhbmNlckRvbWFpbjsKLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIExvYWRCYWxhbmNlRXZlbnRIYW5kbGVyPiBsYkV2ZW50SGFuZGxlcnM7Ci0gICAgcHJpdmF0ZSBMaXN0PE1lbWJlcnNoaXBNYW5hZ2VyPiBtZW1iZXJzaGlwTWFuYWdlcnMgPSBuZXcgQXJyYXlMaXN0PE1lbWJlcnNoaXBNYW5hZ2VyPigpOwotICAgIHByaXZhdGUgTWVtYmVyc2hpcE1hbmFnZXIgcHJpbWFyeU1lbWJlcnNoaXBNYW5hZ2VyOwotCi0gICAgcHVibGljIExvYWRCYWxhbmNlck1vZGUoYnl0ZVtdIGxvYWRCYWxhbmNlckRvbWFpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBMb2FkQmFsYW5jZUV2ZW50SGFuZGxlcj4gbGJFdmVudEhhbmRsZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lbWJlcnNoaXBNYW5hZ2VyIHByaW1hcnlNZW1iZXJzaGlwTWFuYWdlcikgewotICAgICAgICB0aGlzLmxvYWRCYWxhbmNlckRvbWFpbiA9IGxvYWRCYWxhbmNlckRvbWFpbjsKLSAgICAgICAgdGhpcy5sYkV2ZW50SGFuZGxlcnMgPSBsYkV2ZW50SGFuZGxlcnM7Ci0gICAgICAgIHRoaXMucHJpbWFyeU1lbWJlcnNoaXBNYW5hZ2VyID0gcHJpbWFyeU1lbWJlcnNoaXBNYW5hZ2VyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZEludGVyY2VwdG9ycyhDaGFubmVsIGNoYW5uZWwpIHsKLSAgICAgICAgTG9hZEJhbGFuY2VySW50ZXJjZXB0b3IgbGJJbnRlcmNlcHRvciA9Ci0gICAgICAgICAgICAgICAgbmV3IExvYWRCYWxhbmNlckludGVyY2VwdG9yKGxvYWRCYWxhbmNlckRvbWFpbik7Ci0gICAgICAgIGxiSW50ZXJjZXB0b3Iuc2V0T3B0aW9uRmxhZyhUcmliZXNDb25zdGFudHMuTUVNQkVSU0hJUF9NU0dfT1BUSU9OKTsKLSAgICAgICAgY2hhbm5lbC5hZGRJbnRlcmNlcHRvcihsYkludGVyY2VwdG9yKTsKLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIkFkZGVkIExvYWQgQmFsYW5jZXIgSW50ZXJjZXB0b3IiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGluaXQoQ2hhbm5lbCBjaGFubmVsKSB7Ci0gICAgICAgIC8vIEhhdmUgbXVsdGlwbGUgUlBDIGNoYW5uZWxzIHdpdGggbXVsdGlwbGUgUlBDIHJlcXVlc3QgaGFuZGxlcnMgZm9yIGVhY2ggZG9tYWluCi0gICAgICAgIC8vIFRoaXMgaXMgbmVlZGVkIG9ubHkgd2hlbiB0aGlzIG1lbWJlciBpcyBydW5uaW5nIGFzIGEgbG9hZCBiYWxhbmNlcgotICAgICAgICBmb3IgKE9iamVjdCBvIDogbGJFdmVudEhhbmRsZXJzLmtleVNldCgpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgZG9tYWluID0gKFN0cmluZykgbzsKLSAgICAgICAgICAgIGZpbmFsIE1lbWJlcnNoaXBNYW5hZ2VyIG1lbWJlcnNoaXBNYW5hZ2VyID0gbmV3IE1lbWJlcnNoaXBNYW5hZ2VyKCk7Ci0gICAgICAgICAgICBtZW1iZXJzaGlwTWFuYWdlci5zZXREb21haW4oZG9tYWluLmdldEJ5dGVzKCkpOwotICAgICAgICAgICAgbWVtYmVyc2hpcE1hbmFnZXIuc2V0TG9hZEJhbGFuY2VFdmVudEhhbmRsZXIobGJFdmVudEhhbmRsZXJzLmdldChkb21haW4pKTsKLQotICAgICAgICAgICAgTWVtYmVyc2hpcExpc3RlbmVyIG1lbWJlcnNoaXBMaXN0ZW5lciA9IG5ldyBNZW1iZXJzaGlwTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgbWVtYmVyQWRkZWQob3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuTWVtYmVyIG1lbWJlcikgewotICAgICAgICAgICAgICAgICAgICBtZW1iZXJzaGlwTWFuYWdlci5tZW1iZXJBZGRlZChtZW1iZXIpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1lbWJlckRpc2FwcGVhcmVkKG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLk1lbWJlciBtZW1iZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgbWVtYmVyc2hpcE1hbmFnZXIubWVtYmVyRGlzYXBwZWFyZWQobWVtYmVyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotICAgICAgICAgICAgY2hhbm5lbC5hZGRNZW1iZXJzaGlwTGlzdGVuZXIobWVtYmVyc2hpcExpc3RlbmVyKTsKLSAgICAgICAgICAgIG1lbWJlcnNoaXBNYW5hZ2Vycy5hZGQobWVtYmVyc2hpcE1hbmFnZXIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8TWVtYmVyc2hpcE1hbmFnZXI+IGdldE1lbWJlcnNoaXBNYW5hZ2VycygpIHsKLSAgICAgICAgcmV0dXJuIG1lbWJlcnNoaXBNYW5hZ2VyczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBub3RpZnlNZW1iZXJKb2luKGZpbmFsIE1lbWJlciBtZW1iZXIpIHsKLQotICAgICAgICBpZiAoVHJpYmVzVXRpbC5pc0luRG9tYWluKG1lbWJlciwgbG9hZEJhbGFuY2VyRG9tYWluKSkgeyAgLy8gQSBwZWVyIGxvYWQgYmFsYW5jZXIgaGFzIGpvaW5lZAotCi0gICAgICAgICAgICAvLyBOb3RpZnkgYWxsIG1lbWJlcnMgaW4gdGhlIExCIGdyb3VwCi0gICAgICAgICAgICBwcmltYXJ5TWVtYmVyc2hpcE1hbmFnZXIuc2VuZE1lbWJlckpvaW5lZFRvQWxsKG1lbWJlcik7Ci0KLSAgICAgICAgICAgIC8vIFNlbmQgdGhlIE1FTUJFUl9MSVNUUyBvZiBhbGwgdGhlIGdyb3VwcyB0byB0aGUgdGhlIG5ldyBMQiBtZW1iZXIKLSAgICAgICAgICAgIGZvciAoTWVtYmVyc2hpcE1hbmFnZXIgbWFuYWdlciA6IG1lbWJlcnNoaXBNYW5hZ2VycykgewotICAgICAgICAgICAgICAgIG1hbmFnZXIuc2VuZE1lbWJlckxpc3QobWVtYmVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsgLy8gQW4gYXBwbGljYXRpb24gbWVtYmVyIGhhcyBqb2luZWQuCi0KLSAgICAgICAgICAgIC8vIE5lZWQgdG8gbm90aWZ5IGFsbCBtZW1iZXJzIGluIHRoZSBncm91cCBvZiB0aGUgbmV3IGFwcCBtZW1iZXIKLSAgICAgICAgICAgIFRocmVhZCB0aCA9IG5ldyBUaHJlYWQoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICBmb3IgKE1lbWJlcnNoaXBNYW5hZ2VyIG1hbmFnZXIgOiBtZW1iZXJzaGlwTWFuYWdlcnMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChUcmliZXNVdGlsLmlzSW5Eb21haW4obWVtYmVyLCBtYW5hZ2VyLmdldERvbWFpbigpKSkgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2VuZCBNRU1CRVJfSk9JTkVEIHRvIHRoZSBncm91cCBvZiB0aGUgbmV3IG1lbWJlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZXIuc2VuZE1lbWJlckpvaW5lZFRvQWxsKG1lbWJlcik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTZW5kIE1FTUJFUl9KT0lORUQgdG8gdGhlIGxvYWQgYmFsYW5jZXIgZ3JvdXAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kTWVtYmVySm9pbmVkVG9Mb2FkQmFsYW5jZXJHcm91cChtYW5hZ2VyLmdldFJwY01lbWJlcnNoaXBDaGFubmVsKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtYmVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIFNlbmQgTUVNQkVSX0pPSU5FRCB0byB0aGUgbG9hZCBiYWxhbmNlciBncm91cAotICAgICAgICAgICAgICAgICAqIEBwYXJhbSBycGNDaGFubmVsIFRoZSBScGNDaGFubmVsIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG1lbWJlcidzIGdyb3VwCi0gICAgICAgICAgICAgICAgICogQHBhcmFtIG1lbWJlciAgVGhlIG1lbWJlciB3aG8gam9pbmVkCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIHNlbmRNZW1iZXJKb2luZWRUb0xvYWRCYWxhbmNlckdyb3VwKFJwY0NoYW5uZWwgcnBjQ2hhbm5lbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVtYmVyIG1lbWJlcikgewotICAgICAgICAgICAgICAgICAgICBNZW1iZXJKb2luZWRDb21tYW5kIGNtZCA9IG5ldyBNZW1iZXJKb2luZWRDb21tYW5kKCk7Ci0gICAgICAgICAgICAgICAgICAgIGNtZC5zZXRNZW1iZXIobWVtYmVyKTsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJwY0NoYW5uZWwuc2VuZChwcmltYXJ5TWVtYmVyc2hpcE1hbmFnZXIuZ2V0TWVtYmVycygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBScGNDaGFubmVsLkFMTF9SRVBMWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFubmVsLlNFTkRfT1BUSU9OU19BU1lOQ0hST05PVVMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwMDApOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChDaGFubmVsRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBlcnJNc2cgPSAiQ291bGQgbm90IHNlbmQgTUVNQkVSX0pPSU5FRFsiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmliZXNVdGlsLmdldE5hbWUobWVtYmVyKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl0gdG8gYWxsIGxvYWQgYmFsYW5jZXIgbWVtYmVycyAiOwotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKGVyck1zZywgZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmVtb3RlUHJvY2Vzc0V4Y2VwdGlvbihlcnJNc2csIGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLSAgICAgICAgICAgIHRoLnN0YXJ0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvdHJpYmVzL01lbWJlcnNoaXBNYW5hZ2VyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvdHJpYmVzL01lbWJlcnNoaXBNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0YTQ2MWYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL3RyaWJlcy9NZW1iZXJzaGlwTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLnRyaWJlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5DbHVzdGVyaW5nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5Mb2FkQmFsYW5jZUV2ZW50SGFuZGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuY29udHJvbC53a2EuTWVtYmVySm9pbmVkQ29tbWFuZDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuY29udHJvbC53a2EuTWVtYmVyTGlzdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLkNoYW5uZWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuTWVtYmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLlJlbW90ZVByb2Nlc3NFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuZ3JvdXAuUmVzcG9uc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuZ3JvdXAuUnBjQ2hhbm5lbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5ncm91cC5pbnRlcmNlcHRvcnMuU3RhdGljTWVtYmVyc2hpcEludGVyY2VwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLm1lbWJlcnNoaXAuTWVtYmVySW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKLQotLyoqCi0gKiBSZXNwb25zaWJsZSBmb3IgbWFuYWdpbmcgdGhlIG1lbWJlcnNoaXAuIEhhbmRsZXMgbWVtYmVyc2hpcCBjaGFuZ2VzLgotICovCi1wdWJsaWMgY2xhc3MgTWVtYmVyc2hpcE1hbmFnZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKE1lbWJlcnNoaXBNYW5hZ2VyLmNsYXNzKTsKLQotICAgIHByaXZhdGUgUnBjQ2hhbm5lbCBycGNNZW1iZXJzaGlwQ2hhbm5lbDsKLSAgICBwcml2YXRlIFN0YXRpY01lbWJlcnNoaXBJbnRlcmNlcHRvciBzdGF0aWNNZW1iZXJzaGlwSW50ZXJjZXB0b3I7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZG9tYWluIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG1lbWJlcnNoaXAgaGFuZGxlZCBieSB0aGlzIE1lbWJlcnNoaXBNYW5hZ2VyCi0gICAgICovCi0gICAgcHJpdmF0ZSBieXRlW10gZG9tYWluOwotICAgIHByaXZhdGUgTG9hZEJhbGFuY2VFdmVudEhhbmRsZXIgbG9hZEJhbGFuY2VFdmVudEhhbmRsZXI7Ci0gICAgcHJpdmF0ZSBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0OwotCi0gICAgcHVibGljIE1lbWJlcnNoaXBNYW5hZ2VyKENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQpIHsKLSAgICAgICAgdGhpcy5jb25maWdDb250ZXh0ID0gY29uZmlnQ29udGV4dDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWVtYmVyc2hpcE1hbmFnZXIoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UnBjTWVtYmVyc2hpcENoYW5uZWwoUnBjQ2hhbm5lbCBycGNNZW1iZXJzaGlwQ2hhbm5lbCkgewotICAgICAgICB0aGlzLnJwY01lbWJlcnNoaXBDaGFubmVsID0gcnBjTWVtYmVyc2hpcENoYW5uZWw7Ci0gICAgfQotCi0gICAgcHVibGljIFJwY0NoYW5uZWwgZ2V0UnBjTWVtYmVyc2hpcENoYW5uZWwoKSB7Ci0gICAgICAgIHJldHVybiBycGNNZW1iZXJzaGlwQ2hhbm5lbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTdGF0aWNNZW1iZXJzaGlwSW50ZXJjZXB0b3IoCi0gICAgICAgICAgICBTdGF0aWNNZW1iZXJzaGlwSW50ZXJjZXB0b3Igc3RhdGljTWVtYmVyc2hpcEludGVyY2VwdG9yKSB7Ci0gICAgICAgIHRoaXMuc3RhdGljTWVtYmVyc2hpcEludGVyY2VwdG9yID0gc3RhdGljTWVtYmVyc2hpcEludGVyY2VwdG9yOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldExvYWRCYWxhbmNlRXZlbnRIYW5kbGVyKExvYWRCYWxhbmNlRXZlbnRIYW5kbGVyIGxvYWRCYWxhbmNlRXZlbnRIYW5kbGVyKSB7Ci0gICAgICAgIHRoaXMubG9hZEJhbGFuY2VFdmVudEhhbmRsZXIgPSBsb2FkQmFsYW5jZUV2ZW50SGFuZGxlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREb21haW4oYnl0ZVtdIGRvbWFpbikgewotICAgICAgICB0aGlzLmRvbWFpbiA9IGRvbWFpbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYnl0ZVtdIGdldERvbWFpbigpIHsKLSAgICAgICAgcmV0dXJuIGRvbWFpbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMaXN0IG9mIGN1cnJlbnQgbWVtYmVycyBpbiB0aGUgY2x1c3Rlci4gT25seSB0aGUgbWVtYmVycyB3aG8gYXJlIGFsaXZlIHdpbGwgYmUgaW4gdGhpcwotICAgICAqIGxpc3QKLSAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIExpc3Q8TWVtYmVyPiBtZW1iZXJzID0gbmV3IEFycmF5TGlzdDxNZW1iZXI+KCk7Ci0KLSAgICAvKioKLSAgICAgKiBMaXN0IG9mIFdlbGwtS25vd24gbWVtYmVycy4gVGhlc2UgbWVtYmVycyBtYXkgb3IgbWF5IG5vdCBiZSBhbGl2ZSBhdCBhIGdpdmVuIG1vbWVudC4KLSAgICAgKi8KLSAgICBwcml2YXRlIExpc3Q8TWVtYmVyPiB3a2FNZW1iZXJzID0gbmV3IEFycmF5TGlzdDxNZW1iZXI+KCk7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbWVtYmVyIHJlcHJlc2VudGluZyB0aGlzIG5vZGUKLSAgICAgKi8KLSAgICBwcml2YXRlIE1lbWJlciBsb2NhbE1lbWJlcjsKLQotICAgIHB1YmxpYyBNZW1iZXIgZ2V0TG9jYWxNZW1iZXIoKSB7Ci0gICAgICAgIHJldHVybiBsb2NhbE1lbWJlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRMb2NhbE1lbWJlcihNZW1iZXIgbG9jYWxNZW1iZXIpIHsKLSAgICAgICAgdGhpcy5sb2NhbE1lbWJlciA9IGxvY2FsTWVtYmVyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFdlbGxLbm93bk1lbWJlcihNZW1iZXIgd2thTWVtYmVyKSB7Ci0gICAgICAgIHdrYU1lbWJlcnMuYWRkKHdrYU1lbWJlcik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlV2VsbEtub3duTWVtYmVyKE1lbWJlciB3a2FNZW1iZXIpIHsKLSAgICAgICAgd2thTWVtYmVycy5yZW1vdmUod2thTWVtYmVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBIG5ldyBtZW1iZXIgaXMgYWRkZWQKLSAgICAgKgotICAgICAqIEBwYXJhbSBtZW1iZXIgVGhlIG5ldyBtZW1iZXIgdGhhdCBqb2luZWQgdGhlIGNsdXN0ZXIKLSAgICAgKiBAcmV0dXJuIHRydWUgIElmIHRoZSBtZW1iZXIgd2FzIGFkZGVkIHRvIHRoZSA8Y29kZT5tZW1iZXJzPC9jb2RlPiBhcnJheTsgZmFsc2UsIG90aGVyd2lzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gbWVtYmVyQWRkZWQoTWVtYmVyIG1lbWJlcikgewotCi0gICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKXsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygibWVtYmVycy5jb250YWlucyhtZW1iZXIpID0iICsgbWVtYmVycy5jb250YWlucyhtZW1iZXIpICk7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIklzIGluIG15IGRvbWFpbjogIiArIFRyaWJlc1V0aWwuaXNJbkRvbWFpbihtZW1iZXIsIGRvbWFpbikpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSWYgdGhpcyBtZW1iZXIgYWxyZWFkeSBleGlzdHMgb3IgaWYgdGhlIG1lbWJlciBiZWxvbmdzIHRvIGFub3RoZXIgZG9tYWluLAotICAgICAgICAvLyB0aGVyZSBpcyBubyBuZWVkIHRvIGFkZCBpdAotICAgICAgICBpZiAobWVtYmVycy5jb250YWlucyhtZW1iZXIpIHx8ICFUcmliZXNVdGlsLmlzSW5Eb21haW4obWVtYmVyLCBkb21haW4pKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc3RhdGljTWVtYmVyc2hpcEludGVyY2VwdG9yICE9IG51bGwpIHsgLy8gdGhpcyBpbnRlcmNlcHRvciBpcyBudWxsIHdoZW4gbXVsdGljYXN0IGJhc2VkIHNjaGVtZSBpcyB1c2VkCi0gICAgICAgICAgICBzdGF0aWNNZW1iZXJzaGlwSW50ZXJjZXB0b3IuYWRkU3RhdGljTWVtYmVyKG1lbWJlcik7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkFkZGVkIHN0YXRpYyBtZW1iZXIgIiArIFRyaWJlc1V0aWwuZ2V0TmFtZShtZW1iZXIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gc2hvdWxkQWRkTWVtYmVyID0gbG9jYWxNZW1iZXIgPT0gbnVsbCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyaWJlc1V0aWwuYXJlSW5TYW1lRG9tYWluKGxvY2FsTWVtYmVyLCBtZW1iZXIpOwotCi0gICAgICAgIC8vIElmIHRoaXMgbWVtYmVyIGlzIGEgbG9hZCBiYWxhbmNlciwgbm90aWZ5IHRoZSByZXNwZWN0aXZlIGxvYWQgYmFsYW5jZSBldmVudCBoYW5kbGVyPwotICAgICAgICBpZiAobG9hZEJhbGFuY2VFdmVudEhhbmRsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbG9nLmluZm8oIkFwcGxpY2F0aW9uIG1lbWJlciAiICsgVHJpYmVzVXRpbC5nZXROYW1lKG1lbWJlcikgKyAiIGpvaW5lZCBncm91cCAiICsKLSAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmcobWVtYmVyLmdldERvbWFpbigpKSk7Ci0gICAgICAgICAgICBsb2FkQmFsYW5jZUV2ZW50SGFuZGxlci5hcHBsaWNhdGlvbk1lbWJlckFkZGVkKFRyaWJlc1V0aWwudG9BeGlzMk1lbWJlcihtZW1iZXIpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzaG91bGRBZGRNZW1iZXIpIHsKLSAgICAgICAgICAgIGlmIChycGNNZW1iZXJzaGlwQ2hhbm5lbCAhPSBudWxsICYmIGlzTG9jYWxNZW1iZXJJbml0aWFsaXplZCgpICYmCi0gICAgICAgICAgICAgICAgd2thTWVtYmVycy5jb250YWlucyhtZW1iZXIpKSB7IC8vIGlmIGl0IGlzIGEgd2VsbC1rbm93biBtZW1iZXIKLQotICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJBIFdLQSBtZW1iZXIgIiArIFRyaWJlc1V0aWwuZ2V0TmFtZShtZW1iZXIpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAiIGp1c3Qgam9pbmVkIHRoZSBncm91cC4gU2VuZGluZyBNRU1CRVJfTElTVCBtZXNzYWdlLiIpOwotICAgICAgICAgICAgICAgIC8vIHNlbmQgdGhlIG1lbWJlciBsaXN0IHRvIGl0Ci0gICAgICAgICAgICAgICAgTWVtYmVyTGlzdENvbW1hbmQgbWVtTGlzdENtZDsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBtZW1MaXN0Q21kID0gbmV3IE1lbWJlckxpc3RDb21tYW5kKCk7Ci0gICAgICAgICAgICAgICAgICAgIExpc3Q8TWVtYmVyPiBtZW1iZXJzID0gbmV3IEFycmF5TGlzdDxNZW1iZXI+KHRoaXMubWVtYmVycyk7Ci0gICAgICAgICAgICAgICAgICAgIG1lbWJlcnMuYWRkKGxvY2FsTWVtYmVyKTsgLy8gTmVlZCB0byBzZXQgdGhlIGxvY2FsIG1lbWJlciB0b28KLSAgICAgICAgICAgICAgICAgICAgbWVtTGlzdENtZC5zZXRNZW1iZXJzKG1lbWJlcnMudG9BcnJheShuZXcgTWVtYmVyW21lbWJlcnMuc2l6ZSgpXSkpOwotCi0gICAgICAgICAgICAgICAgICAgIFJlc3BvbnNlW10gcmVzcG9uc2VzID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBycGNNZW1iZXJzaGlwQ2hhbm5lbC5zZW5kKG5ldyBNZW1iZXJbXXttZW1iZXJ9LCBtZW1MaXN0Q21kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUnBjQ2hhbm5lbC5BTExfUkVQTFksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFubmVsLlNFTkRfT1BUSU9OU19BU1lOQ0hST05PVVMgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJpYmVzQ29uc3RhbnRzLk1FTUJFUlNISVBfTVNHX09QVElPTiwgMTAwMDApOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIE9uY2UgYSByZXNwb25zZSBpcyByZWNlaXZlZCBmcm9tIHRoZSBXS0EgbWVtYmVyIHRvIHRoZSBNRU1CRVJfTElTVCBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAvLyBpZiBpdCBkb2VzIG5vdCBiZWxvbmcgdG8gdGhpcyBkb21haW4sIHNpbXBseSByZW1vdmUgaXQgZnJvbSB0aGUgbWVtYmVycwotICAgICAgICAgICAgICAgICAgICBpZihyZXNwb25zZXMgIT0gbnVsbCAmJiByZXNwb25zZXMubGVuZ3RoID4gMCAmJiByZXNwb25zZXNbMF0gIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNZW1iZXIgc291cmNlID0gcmVzcG9uc2VzWzBdLmdldFNvdXJjZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIVRyaWJlc1V0aWwuYXJlSW5TYW1lRG9tYWluKHNvdXJjZSwgbWVtYmVyKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYobG9nLmlzRGVidWdFbmFibGVkKCkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIldLQSBNZW1iZXIgIiArIFRyaWJlc1V0aWwuZ2V0TmFtZShzb3VyY2UpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZG9lcyBub3QgYmVsb25nIHRvIGxvY2FsIGRvbWFpbiAiICsgbmV3IFN0cmluZyhkb21haW4pKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi4gSGVuY2UgcmVtb3ZpbmcgaXQgZnJvbSB0aGUgbGlzdC4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtYmVycy5yZW1vdmUobWVtYmVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZXJyTXNnID0gIkNvdWxkIG5vdCBzZW5kIE1FTUJFUl9MSVNUIHRvIHdlbGwta25vd24gbWVtYmVyICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJpYmVzVXRpbC5nZXROYW1lKG1lbWJlcik7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcihlcnJNc2csIGUpOwotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmVtb3RlUHJvY2Vzc0V4Y2VwdGlvbihlcnJNc2csIGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1lbWJlcnMuYWRkKG1lbWJlcik7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkFkZGVkIGdyb3VwIG1lbWJlciAiICsgVHJpYmVzVXRpbC5nZXROYW1lKG1lbWJlcikgKyAiIHRvIGRvbWFpbiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZyhtZW1iZXIuZ2V0RG9tYWluKCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW5kIHRoZSBsaXN0IG9mIG1lbWJlcnMgdG8gdGhlIDxjb2RlPm1lbWJlcjwvY29kZT4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtZW1iZXIgVGhlIG1lbWJlciB0byB3aG9tIHRoZSBtZW1iZXIgbGlzdCBoYXMgdG8gYmUgc2VudAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNlbmRNZW1iZXJMaXN0KE1lbWJlciBtZW1iZXIpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE1lbWJlckxpc3RDb21tYW5kIG1lbUxpc3RDbWQgPSBuZXcgTWVtYmVyTGlzdENvbW1hbmQoKTsKLSAgICAgICAgICAgIExpc3Q8TWVtYmVyPiBtZW1iZXJzID0gbmV3IEFycmF5TGlzdDxNZW1iZXI+KHRoaXMubWVtYmVycyk7Ci0gICAgICAgICAgICBtZW1MaXN0Q21kLnNldE1lbWJlcnMobWVtYmVycy50b0FycmF5KG5ldyBNZW1iZXJbbWVtYmVycy5zaXplKCldKSk7Ci0gICAgICAgICAgICBycGNNZW1iZXJzaGlwQ2hhbm5lbC5zZW5kKG5ldyBNZW1iZXJbXXttZW1iZXJ9LCBtZW1MaXN0Q21kLCBScGNDaGFubmVsLkFMTF9SRVBMWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbm5lbC5TRU5EX09QVElPTlNfQVNZTkNIUk9OT1VTIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJpYmVzQ29uc3RhbnRzLk1FTUJFUlNISVBfTVNHX09QVElPTiwgMTAwMDApOwotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJTZW50IE1FTUJFUl9MSVNUIHRvICIgKyBUcmliZXNVdGlsLmdldE5hbWUobWVtYmVyKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBTdHJpbmcgZXJyTXNnID0gIkNvdWxkIG5vdCBzZW5kIE1FTUJFUl9MSVNUIHRvIG1lbWJlciAiICsgVHJpYmVzVXRpbC5nZXROYW1lKG1lbWJlcik7Ci0gICAgICAgICAgICBsb2cuZXJyb3IoZXJyTXNnLCBlKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBSZW1vdGVQcm9jZXNzRXhjZXB0aW9uKGVyck1zZywgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbmZvcm0gYWxsIG1lbWJlcnMgdGhhdCBhIHBhcnRpY3VsYXIgbWVtYmVyIGp1c3Qgam9pbmVkCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVtYmVyIFRoZSBtZW1iZXIgd2hvIGp1c3Qgam9pbmVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2VuZE1lbWJlckpvaW5lZFRvQWxsKE1lbWJlciBtZW1iZXIpIHsKLSAgICAgICAgdHJ5IHsKLQotICAgICAgICAgICAgTWVtYmVySm9pbmVkQ29tbWFuZCBjbWQgPSBuZXcgTWVtYmVySm9pbmVkQ29tbWFuZCgpOwotICAgICAgICAgICAgY21kLnNldE1lbWJlcihtZW1iZXIpOwotICAgICAgICAgICAgQXJyYXlMaXN0PE1lbWJlcj4gbWVtYmVyc1RvU2VuZCA9IChBcnJheUxpc3Q8TWVtYmVyPikgKCgoQXJyYXlMaXN0KSBtZW1iZXJzKS5jbG9uZSgpKTsKLSAgICAgICAgICAgIG1lbWJlcnNUb1NlbmQucmVtb3ZlKG1lbWJlcik7IC8vIERvIG5vdCBzZW5kIE1FTUJFUl9KT0lORUQgdG8gdGhlIG5ldyBtZW1iZXIgd2hvIGp1c3Qgam9pbmVkCi0KLSAgICAgICAgICAgIGlmIChtZW1iZXJzVG9TZW5kLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBycGNNZW1iZXJzaGlwQ2hhbm5lbC5zZW5kKG1lbWJlcnNUb1NlbmQudG9BcnJheShuZXcgTWVtYmVyW21lbWJlcnNUb1NlbmQuc2l6ZSgpXSksIGNtZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJwY0NoYW5uZWwuQUxMX1JFUExZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbm5lbC5TRU5EX09QVElPTlNfQVNZTkNIUk9OT1VTIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyaWJlc0NvbnN0YW50cy5NRU1CRVJTSElQX01TR19PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAwMCk7Ci0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiU2VudCBNRU1CRVJfSk9JTkVEWyIgKyBUcmliZXNVdGlsLmdldE5hbWUobWVtYmVyKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXSB0byBhbGwgbWVtYmVycyBpbiBkb21haW4gIiArIG5ldyBTdHJpbmcoZG9tYWluKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgU3RyaW5nIGVyck1zZyA9ICJDb3VsZCBub3Qgc2VuZCBNRU1CRVJfSk9JTkVEWyIgKyBUcmliZXNVdGlsLmdldE5hbWUobWVtYmVyKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIl0gdG8gYWxsIG1lbWJlcnMgIjsKLSAgICAgICAgICAgIGxvZy5lcnJvcihlcnJNc2csIGUpOwotICAgICAgICAgICAgdGhyb3cgbmV3IFJlbW90ZVByb2Nlc3NFeGNlcHRpb24oZXJyTXNnLCBlKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIGJvb2xlYW4gaXNMb2NhbE1lbWJlckluaXRpYWxpemVkKCkgewotICAgICAgICBpZiAoY29uZmlnQ29udGV4dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgT2JqZWN0IGNsdXN0ZXJJbml0aWFsaXplZCA9Ci0gICAgICAgICAgICAgICAgY29uZmlnQ29udGV4dC5nZXRQcm9wZXJ0eU5vblJlcGxpY2FibGUoQ2x1c3RlcmluZ0NvbnN0YW50cy5DTFVTVEVSX0lOSVRJQUxJWkVEKTsKLSAgICAgICAgcmV0dXJuIGNsdXN0ZXJJbml0aWFsaXplZCAhPSBudWxsICYmIGNsdXN0ZXJJbml0aWFsaXplZC5lcXVhbHMoInRydWUiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBIG1lbWJlciBkaXNhcHBlYXJlZAotICAgICAqCi0gICAgICogQHBhcmFtIG1lbWJlciBUaGUgbWVtYmVyIHRoYXQgbGVmdCB0aGUgY2x1c3RlcgotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBtZW1iZXJEaXNhcHBlYXJlZChNZW1iZXIgbWVtYmVyKSB7Ci0gICAgICAgIG1lbWJlcnMucmVtb3ZlKG1lbWJlcik7Ci0KLSAgICAgICAgLy8gSXMgdGhpcyBhbiBhcHBsaWNhdGlvbiBkb21haW4gbWVtYmVyPwotICAgICAgICBpZiAobG9hZEJhbGFuY2VFdmVudEhhbmRsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbG9hZEJhbGFuY2VFdmVudEhhbmRsZXIuYXBwbGljYXRpb25NZW1iZXJSZW1vdmVkKFRyaWJlc1V0aWwudG9BeGlzMk1lbWJlcihtZW1iZXIpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgbGlzdCBvZiBjdXJyZW50IG1lbWJlcnMKLSAgICAgKgotICAgICAqIEByZXR1cm4gbGlzdCBvZiBjdXJyZW50IG1lbWJlcnMKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIE1lbWJlcltdIGdldE1lbWJlcnMoKSB7Ci0gICAgICAgIHJldHVybiBtZW1iZXJzLnRvQXJyYXkobmV3IE1lbWJlclttZW1iZXJzLnNpemUoKV0pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgbWVtYmVyIHRoYXQgaGFzIGJlZW4gYWxpdmUgZm9yIHRoZSBsb25nZXN0IHRpbWUKLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIG1lbWJlciB0aGF0IGhhcyBiZWVuIGFsaXZlIGZvciB0aGUgbG9uZ2VzdCB0aW1lCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBNZW1iZXIgZ2V0TG9uZ2VzdExpdmluZ01lbWJlcigpIHsKLSAgICAgICAgTWVtYmVyIGxvbmdlc3RMaXZpbmdNZW1iZXIgPSBudWxsOwotICAgICAgICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBNZW1iZXIgbWVtYmVyMCA9IG1lbWJlcnMuZ2V0KDApOwotICAgICAgICAgICAgbG9uZyBsb25nZXN0QWxpdmVUaW1lID0gbWVtYmVyMC5nZXRNZW1iZXJBbGl2ZVRpbWUoKTsKLSAgICAgICAgICAgIGxvbmdlc3RMaXZpbmdNZW1iZXIgPSBtZW1iZXIwOwotICAgICAgICAgICAgZm9yIChNZW1iZXIgbWVtYmVyIDogbWVtYmVycykgewotICAgICAgICAgICAgICAgIGlmIChsb25nZXN0QWxpdmVUaW1lIDwgbWVtYmVyLmdldE1lbWJlckFsaXZlVGltZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvbmdlc3RBbGl2ZVRpbWUgPSBtZW1iZXIuZ2V0TWVtYmVyQWxpdmVUaW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIGxvbmdlc3RMaXZpbmdNZW1iZXIgPSBtZW1iZXI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBsb25nZXN0TGl2aW5nTWVtYmVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBhIHJhbmRvbSBtZW1iZXIgZnJvbSB0aGUgbGlzdCBvZiBjdXJyZW50IG1lbWJlcnMKLSAgICAgKgotICAgICAqIEByZXR1cm4gQSByYW5kb20gbWVtYmVyIGZyb20gdGhlIGxpc3Qgb2YgY3VycmVudCBtZW1iZXJzCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBNZW1iZXIgZ2V0UmFuZG9tTWVtYmVyKCkgewotICAgICAgICBpZiAobWVtYmVycy5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IG1lbWJlckluZGV4ID0gbmV3IFJhbmRvbSgpLm5leHRJbnQobWVtYmVycy5zaXplKCkpOwotICAgICAgICByZXR1cm4gbWVtYmVycy5nZXQobWVtYmVySW5kZXgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrIHdoZXRoZXIgdGhlcmUgYXJlIGFueSBtZW1iZXJzCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlcmUgYXJlIG90aGVyIG1lbWJlcnMsIGZhbHNlIG90aGVyd2lzZQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGhhc01lbWJlcnMoKSB7Ci0gICAgICAgIHJldHVybiBtZW1iZXJzLnNpemUoKSA+IDA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGEgbWVtYmVyCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVtYmVyIFRoZSBtZW1iZXIgdG8gYmUgZm91bmQKLSAgICAgKiBAcmV0dXJuIFRoZSBtZW1iZXIsIGlmIGl0IGlzIGZvdW5kCi0gICAgICovCi0gICAgcHVibGljIE1lbWJlciBnZXRNZW1iZXIoTWVtYmVyIG1lbWJlcikgewotICAgICAgICBpZiAoaGFzTWVtYmVycygpKSB7Ci0gICAgICAgICAgICBNZW1iZXJJbXBsIHJlc3VsdCA9IG51bGw7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMubWVtYmVycy5zaXplKCkgJiYgcmVzdWx0ID09IG51bGw7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChtZW1iZXJzLmdldChpKS5lcXVhbHMobWVtYmVyKSkgewotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAoTWVtYmVySW1wbCkgbWVtYmVycy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvdHJpYmVzL011bHRpY2FzdEJhc2VkTWVtYmVyc2hpcFNjaGVtZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL3RyaWJlcy9NdWx0aWNhc3RCYXNlZE1lbWJlcnNoaXBTY2hlbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTgyNjJlMC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvdHJpYmVzL011bHRpY2FzdEJhc2VkTWVtYmVyc2hpcFNjaGVtZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAxICswLDAgQEAKLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqIENvcHlyaWdodCAyMDA0LDIwMDUgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAgICAgICAgICAgICAKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gICAgICAgICAgICAKLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgICAgICAgICAKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsICAgICAgICAgICAKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgICAKLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgICAgICAgICAKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcudHJpYmVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLkNsdXN0ZXJpbmdDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLkNsdXN0ZXJpbmdGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuTWVtYmVyc2hpcFNjaGVtZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuTWVtYmVyc2hpcExpc3RlbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5NYW5hZ2VkQ2hhbm5lbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5DaGFubmVsSW50ZXJjZXB0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuZ3JvdXAuaW50ZXJjZXB0b3JzLk9yZGVySW50ZXJjZXB0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuZ3JvdXAuaW50ZXJjZXB0b3JzLlRjcEZhaWx1cmVEZXRlY3RvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5ncm91cC5pbnRlcmNlcHRvcnMuTm9uQmxvY2tpbmdDb29yZGluYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy50cmFuc3BvcnQuUmVjZWl2ZXJCYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YS5uZXQuU29ja2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci0KLS8qKgotICogSW1wbGVtZW50YXRpb24gb2YgdGhlIG11bHRpY2FzdCBiYXNlZCBtZW1iZXJzaGlwIHNjaGVtZS4gSW4gdGhpcyBzY2hlbWUsIG1lbWJlcnNoaXAgaXMgZGlzY292ZXJlZAotICogdXNpbmcgbXVsdGljYXN0cwotICovCi1wdWJsaWMgY2xhc3MgTXVsdGljYXN0QmFzZWRNZW1iZXJzaGlwU2NoZW1lIGltcGxlbWVudHMgTWVtYmVyc2hpcFNjaGVtZSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coTXVsdGljYXN0QmFzZWRNZW1iZXJzaGlwU2NoZW1lLmNsYXNzKTsKLQotICAgIC8qKgotICAgICAqIFRoZSBUcmliZXMgY2hhbm5lbAotICAgICAqLwotICAgIHByaXZhdGUgTWFuYWdlZENoYW5uZWwgY2hhbm5lbDsKLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIFBhcmFtZXRlcj4gcGFyYW1ldGVyczsKLQotICAgIC8qKgotICAgICAqIFRoZSBkb21haW4gdG8gd2hpY2ggdGhpcyBub2RlIGJlbG9uZ3MgdG8KLSAgICAgKi8KLSAgICBwcml2YXRlIGJ5dGVbXSBkb21haW47Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbW9kZSBpbiB3aGljaCB0aGlzIG1lbWJlciBvcGVyYXRlcyBzdWNoIGFzICJsb2FkQmFsYW5jZSIgb3IgImFwcGxpY2F0aW9uIgotICAgICAqLwotICAgIHByaXZhdGUgT3BlcmF0aW9uTW9kZSBtb2RlOwotCi0gICAgLy8gICAgcHJpdmF0ZSBNZW1iZXJzaGlwTGlzdGVuZXIgbWVtYmVyc2hpcExpc3RlbmVyOwotICAgIHByaXZhdGUgYm9vbGVhbiBhdG1vc3RPbmNlTWVzc2FnZVNlbWFudGljczsKLSAgICBwcml2YXRlIGJvb2xlYW4gcHJlc2VydmVyTXNnT3JkZXI7Ci0KLSAgICBwdWJsaWMgTXVsdGljYXN0QmFzZWRNZW1iZXJzaGlwU2NoZW1lKE1hbmFnZWRDaGFubmVsIGNoYW5uZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYXRpb25Nb2RlIG1vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBQYXJhbWV0ZXI+IHBhcmFtZXRlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gZG9tYWluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBhdG1vc3RPbmNlTWVzc2FnZVNlbWFudGljcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gcHJlc2VydmVyTXNnT3JkZXIpIHsKLSAgICAgICAgdGhpcy5jaGFubmVsID0gY2hhbm5lbDsKLSAgICAgICAgdGhpcy5tb2RlID0gbW9kZTsKLSAgICAgICAgdGhpcy5wYXJhbWV0ZXJzID0gcGFyYW1ldGVyczsKLSAgICAgICAgdGhpcy5kb21haW4gPSBkb21haW47Ci0gICAgICAgIHRoaXMuYXRtb3N0T25jZU1lc3NhZ2VTZW1hbnRpY3MgPSBhdG1vc3RPbmNlTWVzc2FnZVNlbWFudGljczsKLSAgICAgICAgdGhpcy5wcmVzZXJ2ZXJNc2dPcmRlciA9IHByZXNlcnZlck1zZ09yZGVyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGluaXQoKSB0aHJvd3MgQ2x1c3RlcmluZ0ZhdWx0IHsKLSAgICAgICAgYWRkSW50ZXJjZXB0b3JzKCk7Ci0gICAgICAgIGNvbmZpZ3VyZU11bHRpY2FzdFBhcmFtZXRlcnMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBqb2luR3JvdXAoKSB0aHJvd3MgQ2x1c3RlcmluZ0ZhdWx0IHsKLSAgICAgICAgLy8gTm90aGluZyB0byBkbwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjb25maWd1cmVNdWx0aWNhc3RQYXJhbWV0ZXJzKCkgdGhyb3dzIENsdXN0ZXJpbmdGYXVsdCB7Ci0gICAgICAgIFByb3BlcnRpZXMgbWNhc3RQcm9wcyA9IGNoYW5uZWwuZ2V0TWVtYmVyc2hpcFNlcnZpY2UoKS5nZXRQcm9wZXJ0aWVzKCk7Ci0gICAgICAgIFBhcmFtZXRlciBtY2FzdEFkZHJlc3MgPSBnZXRQYXJhbWV0ZXIoVHJpYmVzQ29uc3RhbnRzLk1DQVNUX0FERFJFU1MpOwotICAgICAgICBpZiAobWNhc3RBZGRyZXNzICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1jYXN0UHJvcHMuc2V0UHJvcGVydHkoVHJpYmVzQ29uc3RhbnRzLk1DQVNUX0FERFJFU1MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU3RyaW5nKSBtY2FzdEFkZHJlc3MuZ2V0VmFsdWUoKSkudHJpbSgpKTsKLSAgICAgICAgfQotICAgICAgICBQYXJhbWV0ZXIgbWNhc3RCaW5kQWRkcmVzcyA9IGdldFBhcmFtZXRlcihUcmliZXNDb25zdGFudHMuTUNBU1RfQklORF9BRERSRVNTKTsKLSAgICAgICAgaWYgKG1jYXN0QmluZEFkZHJlc3MgIT0gbnVsbCkgewotICAgICAgICAgICAgbWNhc3RQcm9wcy5zZXRQcm9wZXJ0eShUcmliZXNDb25zdGFudHMuTUNBU1RfQklORF9BRERSRVNTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFN0cmluZykgbWNhc3RCaW5kQWRkcmVzcy5nZXRWYWx1ZSgpKS50cmltKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgUGFyYW1ldGVyIG1jYXN0UG9ydCA9IGdldFBhcmFtZXRlcihUcmliZXNDb25zdGFudHMuTUNBU1RfUE9SVCk7Ci0gICAgICAgIGlmIChtY2FzdFBvcnQgIT0gbnVsbCkgewotICAgICAgICAgICAgbWNhc3RQcm9wcy5zZXRQcm9wZXJ0eShUcmliZXNDb25zdGFudHMuTUNBU1RfUE9SVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTdHJpbmcpIG1jYXN0UG9ydC5nZXRWYWx1ZSgpKS50cmltKCkpOwotICAgICAgICB9Ci0gICAgICAgIFBhcmFtZXRlciBtY2FzdEZyZXF1ZW5jeSA9IGdldFBhcmFtZXRlcihUcmliZXNDb25zdGFudHMuTUNBU1RfRlJFUVVFTkNZKTsKLSAgICAgICAgaWYgKG1jYXN0RnJlcXVlbmN5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1jYXN0UHJvcHMuc2V0UHJvcGVydHkoVHJpYmVzQ29uc3RhbnRzLk1DQVNUX0ZSRVFVRU5DWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTdHJpbmcpIG1jYXN0RnJlcXVlbmN5LmdldFZhbHVlKCkpLnRyaW0oKSk7Ci0gICAgICAgIH0KLSAgICAgICAgUGFyYW1ldGVyIG1jYXN0TWVtYmVyRHJvcFRpbWUgPSBnZXRQYXJhbWV0ZXIoVHJpYmVzQ29uc3RhbnRzLk1FTUJFUl9EUk9QX1RJTUUpOwotICAgICAgICBpZiAobWNhc3RNZW1iZXJEcm9wVGltZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtY2FzdFByb3BzLnNldFByb3BlcnR5KFRyaWJlc0NvbnN0YW50cy5NRU1CRVJfRFJPUF9USU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFN0cmluZykgbWNhc3RNZW1iZXJEcm9wVGltZS5nZXRWYWx1ZSgpKS50cmltKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gU2V0IHRoZSBJUCBhZGRyZXNzIHRoYXQgd2lsbCBiZSBhZHZlcnRpc2VkIGJ5IHRoaXMgbm9kZQotICAgICAgICBSZWNlaXZlckJhc2UgcmVjZWl2ZXIgPSAoUmVjZWl2ZXJCYXNlKSBjaGFubmVsLmdldENoYW5uZWxSZWNlaXZlcigpOwotICAgICAgICBQYXJhbWV0ZXIgdGNwTGlzdGVuSG9zdCA9IGdldFBhcmFtZXRlcihUcmliZXNDb25zdGFudHMuTE9DQUxfTUVNQkVSX0hPU1QpOwotICAgICAgICBpZiAodGNwTGlzdGVuSG9zdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgaG9zdCA9ICgoU3RyaW5nKSB0Y3BMaXN0ZW5Ib3N0LmdldFZhbHVlKCkpLnRyaW0oKTsKLSAgICAgICAgICAgIG1jYXN0UHJvcHMuc2V0UHJvcGVydHkoVHJpYmVzQ29uc3RhbnRzLlRDUF9MSVNURU5fSE9TVCwgaG9zdCk7Ci0gICAgICAgICAgICBtY2FzdFByb3BzLnNldFByb3BlcnR5KFRyaWJlc0NvbnN0YW50cy5CSU5EX0FERFJFU1MsIGhvc3QpOwotICAgICAgICAgICAgcmVjZWl2ZXIuc2V0QWRkcmVzcyhob3N0KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFN0cmluZyBob3N0OwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBob3N0ID0gVXRpbHMuZ2V0SXBBZGRyZXNzKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChTb2NrZXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiQ291bGQgbm90IGdldCBsb2NhbCBJUCBhZGRyZXNzIjsKLSAgICAgICAgICAgICAgICBsb2cuZXJyb3IobXNnLCBlKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ2x1c3RlcmluZ0ZhdWx0KG1zZywgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtY2FzdFByb3BzLnNldFByb3BlcnR5KFRyaWJlc0NvbnN0YW50cy5UQ1BfTElTVEVOX0hPU1QsIGhvc3QpOwotICAgICAgICAgICAgbWNhc3RQcm9wcy5zZXRQcm9wZXJ0eShUcmliZXNDb25zdGFudHMuQklORF9BRERSRVNTLCBob3N0KTsKLSAgICAgICAgICAgIHJlY2VpdmVyLnNldEFkZHJlc3MoaG9zdCk7Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nIGxvY2FsSVAgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoQ2x1c3RlcmluZ0NvbnN0YW50cy5MT0NBTF9JUF9BRERSRVNTKTsKLSAgICAgICAgaWYgKGxvY2FsSVAgIT0gbnVsbCkgewotICAgICAgICAgICAgcmVjZWl2ZXIuc2V0QWRkcmVzcyhsb2NhbElQKTsKLSAgICAgICAgfQotCi0gICAgICAgIFBhcmFtZXRlciB0Y3BMaXN0ZW5Qb3J0ID0gZ2V0UGFyYW1ldGVyKFRyaWJlc0NvbnN0YW50cy5MT0NBTF9NRU1CRVJfUE9SVCk7Ci0gICAgICAgIGlmICh0Y3BMaXN0ZW5Qb3J0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyBwb3J0ID0gKChTdHJpbmcpIHRjcExpc3RlblBvcnQuZ2V0VmFsdWUoKSkudHJpbSgpOwotICAgICAgICAgICAgbWNhc3RQcm9wcy5zZXRQcm9wZXJ0eShUcmliZXNDb25zdGFudHMuVENQX0xJU1RFTl9QT1JULCBwb3J0KTsKLSAgICAgICAgICAgIHJlY2VpdmVyLnNldFBvcnQoSW50ZWdlci5wYXJzZUludChwb3J0KSk7Ci0gICAgICAgIH0KLQotICAgICAgICBtY2FzdFByb3BzLnNldFByb3BlcnR5KFRyaWJlc0NvbnN0YW50cy5NQ0FTVF9DTFVTVEVSX0RPTUFJTiwgbmV3IFN0cmluZyhkb21haW4pKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgQ2hhbm5lbEludGVyY2VwdG9ycy4gVGhlIG9yZGVyIG9mIHRoZSBpbnRlcmNlcHRvcnMgdGhhdCBhcmUgYWRkZWQgd2lsbCBkZXBlbmQgb24gdGhlCi0gICAgICogbWVtYmVyc2hpcCBtYW5hZ2VtZW50IHNjaGVtZQotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBhZGRJbnRlcmNlcHRvcnMoKSB7Ci0KLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIkFkZGluZyBJbnRlcmNlcHRvcnMuLi4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEFkZCBhIHJlbGlhYmxlIGZhaWx1cmUgZGV0ZWN0b3IKLSAgICAgICAgVGNwRmFpbHVyZURldGVjdG9yIHRjcEZhaWx1cmVEZXRlY3RvciA9IG5ldyBUY3BGYWlsdXJlRGV0ZWN0b3IoKTsKLSAgICAgICAgdGNwRmFpbHVyZURldGVjdG9yLnNldENvbm5lY3RUaW1lb3V0KDMwMDAwKTsKLSAgICAgICAgY2hhbm5lbC5hZGRJbnRlcmNlcHRvcih0Y3BGYWlsdXJlRGV0ZWN0b3IpOwotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiQWRkZWQgVENQIEZhaWx1cmUgRGV0ZWN0b3IiKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEFkZCB0aGUgTm9uQmxvY2tpbmdDb29yZGluYXRvci4KLS8vICAgICAgICBjaGFubmVsLmFkZEludGVyY2VwdG9yKG5ldyBBeGlzMkNvb3JkaW5hdG9yKG1lbWJlcnNoaXBMaXN0ZW5lcikpOwotCi0gICAgICAgIGNoYW5uZWwuZ2V0TWVtYmVyc2hpcFNlcnZpY2UoKS5zZXREb21haW4oZG9tYWluKTsKLSAgICAgICAgbW9kZS5hZGRJbnRlcmNlcHRvcnMoY2hhbm5lbCk7Ci0KLSAgICAgICAgaWYgKGF0bW9zdE9uY2VNZXNzYWdlU2VtYW50aWNzKSB7Ci0gICAgICAgICAgICAvLyBBZGQgYSBBdE1vc3RPbmNlSW50ZXJjZXB0b3IgdG8gc3VwcG9ydCBhdC1tb3N0LW9uY2UgbWVzc2FnZSBwcm9jZXNzaW5nIHNlbWFudGljcwotICAgICAgICAgICAgQXRNb3N0T25jZUludGVyY2VwdG9yIGF0TW9zdE9uY2VJbnRlcmNlcHRvciA9IG5ldyBBdE1vc3RPbmNlSW50ZXJjZXB0b3IoKTsKLSAgICAgICAgICAgIGF0TW9zdE9uY2VJbnRlcmNlcHRvci5zZXRPcHRpb25GbGFnKFRyaWJlc0NvbnN0YW50cy5BVF9NT1NUX09OQ0VfT1BUSU9OKTsKLSAgICAgICAgICAgIGNoYW5uZWwuYWRkSW50ZXJjZXB0b3IoYXRNb3N0T25jZUludGVyY2VwdG9yKTsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQWRkZWQgQXQtbW9zdC1vbmNlIEludGVyY2VwdG9yIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocHJlc2VydmVyTXNnT3JkZXIpIHsKLSAgICAgICAgICAgIC8vIEFkZCB0aGUgT3JkZXJJbnRlcmNlcHRvciB0byBwcmVzZXJ2ZSBzZW5kZXIgb3JkZXJpbmcKLSAgICAgICAgICAgIE9yZGVySW50ZXJjZXB0b3Igb3JkZXJJbnRlcmNlcHRvciA9IG5ldyBPcmRlckludGVyY2VwdG9yKCk7Ci0gICAgICAgICAgICBvcmRlckludGVyY2VwdG9yLnNldE9wdGlvbkZsYWcoVHJpYmVzQ29uc3RhbnRzLk1TR19PUkRFUl9PUFRJT04pOwotICAgICAgICAgICAgY2hhbm5lbC5hZGRJbnRlcmNlcHRvcihvcmRlckludGVyY2VwdG9yKTsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQWRkZWQgTWVzc2FnZSBPcmRlciBJbnRlcmNlcHRvciIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFBhcmFtZXRlciBnZXRQYXJhbWV0ZXIoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgcmV0dXJuIHBhcmFtZXRlcnMuZ2V0KG5hbWUpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2NsdXN0ZXJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy90cmliZXMvT3BlcmF0aW9uTW9kZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL3RyaWJlcy9PcGVyYXRpb25Nb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3NzI3YWUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL3RyaWJlcy9PcGVyYXRpb25Nb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gKiBDb3B5cmlnaHQgMjAwNCwyMDA1IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgICAgICAgICAgICAgCi0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICAgICAgICAgICAgCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlICAgICAgICAgCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAgICAgICAgICAgCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gICAgCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kICAgICAgICAgCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLnRyaWJlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLkNoYW5uZWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuTWVtYmVyOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogVGhlIG1vZGUgaW4gd2hpY2ggdGhpcyBtZW1iZXIgaXMgb3BlcmF0aW5nIHN1Y2ggYSBsb2FkQmFsYW5jZSBvciBhcHBsaWNhdGlvbgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9wZXJhdGlvbk1vZGUgewotCi0gICAgLyoqCi0gICAgICogQWRkIGNoYW5uZWwgaW50ZXJlY3B0b3JzCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2hhbm5lbCBUaGUgQ2hhbm5lbCB0byB3aGljaCBpbnRlcmNlcHRvcnMgbmVlZCB0byBiZSBhZGRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZEludGVyY2VwdG9ycyhDaGFubmVsIGNoYW5uZWwpOwotCi0gICAgLyoqCi0gICAgICogSW5pdGlhbGl6ZSB0aGlzIG1vZGUKLSAgICAgKgotICAgICAqIEBwYXJhbSBjaGFubmVsIFRoZSBjaGFubmVsIHJlbGF0ZWQgdG8gdGhpcyBtZW1iZXIKLSAgICAgKi8KLSAgICB2b2lkIGluaXQoQ2hhbm5lbCBjaGFubmVsKTsKLQotICAgIC8qKgotICAgICAqIEdldCBhbGwgdGhlIG1lbWJlcnNoaXAgbWFuYWdlcnMgYXNzb2NpYXRlZCB3aXRoIGEgcGFydGljdWxhciBtb2RlCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIG1lbWJlcnNoaXAgbWFuYWdlcnMgYXNzb2NpYXRlZCB3aXRoIGEgcGFydGljdWxhciBtb2RlCi0gICAgICovCi0gICAgTGlzdDxNZW1iZXJzaGlwTWFuYWdlcj4gZ2V0TWVtYmVyc2hpcE1hbmFnZXJzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBOb3RpZnkgdG8gdGhlIHJlbGV2YW50IHBhcnRpZXMgdGhhdCBhIG1lbWJlciA8Y29kZT5tZW1iZXI8L2NvZGU+IGpvaW5lZAotICAgICAqCi0gICAgICogQHBhcmFtIG1lbWJlciBUaGUgbWVtYmVyIHRvIHdob20gdGhpcyBtZW1iZXIgbGlzdHMgaGF2ZSB0byBiZSBzZW50Ci0gICAgICovCi0gICAgdm9pZCBub3RpZnlNZW1iZXJKb2luKE1lbWJlciBtZW1iZXIpOwotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL3RyaWJlcy9ScGNJbml0aWFsaXphdGlvblJlcXVlc3RIYW5kbGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvdHJpYmVzL1JwY0luaXRpYWxpemF0aW9uUmVxdWVzdEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ3ZDc4Ny4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvdHJpYmVzL1JwY0luaXRpYWxpemF0aW9uUmVxdWVzdEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy50cmliZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuQ2x1c3RlcmluZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuQ2x1c3RlcmluZ0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5jb250cm9sLkdldENvbmZpZ3VyYXRpb25Db21tYW5kOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5jb250cm9sLkdldENvbmZpZ3VyYXRpb25SZXNwb25zZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLmNvbnRyb2wuR2V0U3RhdGVDb21tYW5kOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5jb250cm9sLkdldFN0YXRlUmVzcG9uc2VDb21tYW5kOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5NZW1iZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuUmVtb3RlUHJvY2Vzc0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5ncm91cC5ScGNDYWxsYmFjazsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotCi0vKioKLSAqIEhhbmRsZXMgUlBDIGluaXRpYWxpemF0aW9uIHJlcXVlc3RzIGZyb20gbWVtYmVycwotICovCi1wdWJsaWMgY2xhc3MgUnBjSW5pdGlhbGl6YXRpb25SZXF1ZXN0SGFuZGxlciBpbXBsZW1lbnRzIFJwY0NhbGxiYWNrIHsKLQotICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhScGNJbml0aWFsaXphdGlvblJlcXVlc3RIYW5kbGVyLmNsYXNzKTsKLSAgICBwcml2YXRlIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ3VyYXRpb25Db250ZXh0OwotCi0gICAgcHVibGljIFJwY0luaXRpYWxpemF0aW9uUmVxdWVzdEhhbmRsZXIoQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlndXJhdGlvbkNvbnRleHQpIHsKLSAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uQ29udGV4dCA9IGNvbmZpZ3VyYXRpb25Db250ZXh0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENvbmZpZ3VyYXRpb25Db250ZXh0KENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ3VyYXRpb25Db250ZXh0KSB7Ci0gICAgICAgIHRoaXMuY29uZmlndXJhdGlvbkNvbnRleHQgPSBjb25maWd1cmF0aW9uQ29udGV4dDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2VyaWFsaXphYmxlIHJlcGx5UmVxdWVzdChTZXJpYWxpemFibGUgbXNnLCBNZW1iZXIgaW52b2tlcikgewotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiSW5pdGlhbGl6YXRpb24gcmVxdWVzdCByZWNlaXZlZCBieSBScGNJbml0aWFsaXphdGlvblJlcXVlc3RIYW5kbGVyIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1zZyBpbnN0YW5jZW9mIEdldFN0YXRlQ29tbWFuZCkgewotICAgICAgICAgICAgLy8gSWYgYSBHZXRTdGF0ZVJlcXVlc3QgaXMgcmVjZWl2ZWQgYnkgYSBub2RlIHdoaWNoIGhhcyBub3QgeWV0IGluaXRpYWxpemVkCi0gICAgICAgICAgICAvLyB0aGlzIG5vZGUgY2Fubm90IHNlbmQgYSByZXNwb25zZSB0byB0aGUgc3RhdGUgcmVxdWVzdGVyLiBTbyB3ZSBzaW1wbHkgcmV0dXJuLgotICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb25Db250ZXh0LgotICAgICAgICAgICAgICAgICAgICBnZXRQcm9wZXJ0eU5vblJlcGxpY2FibGUoQ2x1c3RlcmluZ0NvbnN0YW50cy5DTFVTVEVSX0lOSVRJQUxJWkVEKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJSZWNlaXZlZCAiICsgbXNnICsgIiBpbml0aWFsaXphdGlvbiByZXF1ZXN0IG1lc3NhZ2UgZnJvbSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICBUcmliZXNVdGlsLmdldE5hbWUoaW52b2tlcikpOwotICAgICAgICAgICAgICAgIEdldFN0YXRlQ29tbWFuZCBjb21tYW5kID0gKEdldFN0YXRlQ29tbWFuZCkgbXNnOwotICAgICAgICAgICAgICAgIGNvbW1hbmQuZXhlY3V0ZShjb25maWd1cmF0aW9uQ29udGV4dCk7Ci0gICAgICAgICAgICAgICAgR2V0U3RhdGVSZXNwb25zZUNvbW1hbmQgZ2V0U3RhdGVSZXNwQ21kID0gbmV3IEdldFN0YXRlUmVzcG9uc2VDb21tYW5kKCk7Ci0gICAgICAgICAgICAgICAgZ2V0U3RhdGVSZXNwQ21kLnNldENvbW1hbmRzKGNvbW1hbmQuZ2V0Q29tbWFuZHMoKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldFN0YXRlUmVzcENtZDsKLSAgICAgICAgICAgIH0gY2F0Y2ggKENsdXN0ZXJpbmdGYXVsdCBlKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGVyck1zZyA9ICJDYW5ub3QgaGFuZGxlIGluaXRpYWxpemF0aW9uIHJlcXVlc3QiOwotICAgICAgICAgICAgICAgIGxvZy5lcnJvcihlcnJNc2csIGUpOwotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSZW1vdGVQcm9jZXNzRXhjZXB0aW9uKGVyck1zZywgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAobXNnIGluc3RhbmNlb2YgR2V0Q29uZmlndXJhdGlvbkNvbW1hbmQpIHsKLSAgICAgICAgICAgIC8vIElmIGEgR2V0Q29uZmlndXJhdGlvbkNvbW1hbmQgaXMgcmVjZWl2ZWQgYnkgYSBub2RlIHdoaWNoIGhhcyBub3QgeWV0IGluaXRpYWxpemVkCi0gICAgICAgICAgICAvLyB0aGlzIG5vZGUgY2Fubm90IHNlbmQgYSByZXNwb25zZSB0byB0aGUgc3RhdGUgcmVxdWVzdGVyLiBTbyB3ZSBzaW1wbHkgcmV0dXJuLgotICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb25Db250ZXh0LgotICAgICAgICAgICAgICAgICAgICBnZXRQcm9wZXJ0eU5vblJlcGxpY2FibGUoQ2x1c3RlcmluZ0NvbnN0YW50cy5DTFVTVEVSX0lOSVRJQUxJWkVEKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJSZWNlaXZlZCAiICsgbXNnICsgIiBpbml0aWFsaXphdGlvbiByZXF1ZXN0IG1lc3NhZ2UgZnJvbSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICBUcmliZXNVdGlsLmdldE5hbWUoaW52b2tlcikpOwotICAgICAgICAgICAgICAgIEdldENvbmZpZ3VyYXRpb25Db21tYW5kIGNvbW1hbmQgPSAoR2V0Q29uZmlndXJhdGlvbkNvbW1hbmQpIG1zZzsKLSAgICAgICAgICAgICAgICBjb21tYW5kLmV4ZWN1dGUoY29uZmlndXJhdGlvbkNvbnRleHQpOwotICAgICAgICAgICAgICAgIEdldENvbmZpZ3VyYXRpb25SZXNwb25zZUNvbW1hbmQKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldENvbmZpZ1Jlc3BDbWQgPSBuZXcgR2V0Q29uZmlndXJhdGlvblJlc3BvbnNlQ29tbWFuZCgpOwotICAgICAgICAgICAgICAgIGdldENvbmZpZ1Jlc3BDbWQuc2V0U2VydmljZUdyb3Vwcyhjb21tYW5kLmdldFNlcnZpY2VHcm91cE5hbWVzKCkpOwotICAgICAgICAgICAgICAgIHJldHVybiBnZXRDb25maWdSZXNwQ21kOwotICAgICAgICAgICAgfSBjYXRjaCAoQ2x1c3RlcmluZ0ZhdWx0IGUpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZXJyTXNnID0gIkNhbm5vdCBoYW5kbGUgaW5pdGlhbGl6YXRpb24gcmVxdWVzdCI7Ci0gICAgICAgICAgICAgICAgbG9nLmVycm9yKGVyck1zZywgZSk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJlbW90ZVByb2Nlc3NFeGNlcHRpb24oZXJyTXNnLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSAKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbGVmdE92ZXIoU2VyaWFsaXphYmxlIG1zZywgTWVtYmVyIG1lbWJlcikgewotICAgICAgICAvL1RPRE86IE1ldGhvZCBpbXBsZW1lbnRhdGlvbgotCi0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2NsdXN0ZXJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy90cmliZXMvVHJpYmVzQ2x1c3Rlck1hbmFnZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2NsdXN0ZXJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy90cmliZXMvVHJpYmVzQ2x1c3Rlck1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjlkNjJhYy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvdHJpYmVzL1RyaWJlc0NsdXN0ZXJNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MjcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcudHJpYmVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuQ2x1c3Rlck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLkNsdXN0ZXJpbmdDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLkNsdXN0ZXJpbmdGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuTG9hZEJhbGFuY2VFdmVudEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLk1lbWJlcnNoaXBMaXN0ZW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuTWVtYmVyc2hpcFNjaGVtZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuUmVxdWVzdEJsb2NraW5nSGFuZGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuY29uZmlndXJhdGlvbi5EZWZhdWx0Q29uZmlndXJhdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLmNvbnRleHQuQ2x1c3RlcmluZ0NvbnRleHRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuY29udGV4dC5Db250ZXh0TWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuY29udGV4dC5EZWZhdWx0Q29udGV4dE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLmNvbnRyb2wuQ29udHJvbENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLmNvbnRyb2wuR2V0Q29uZmlndXJhdGlvbkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLmNvbnRyb2wuR2V0U3RhdGVDb21tYW5kOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkhhbmRsZXJEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlBoYXNlUnVsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlRyYW5zcG9ydEluRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0NvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuRGlzcGF0Y2hQaGFzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5QaGFzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5DaGFubmVsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLkNoYW5uZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuTWFuYWdlZENoYW5uZWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuTWVtYmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLmdyb3VwLkdyb3VwQ2hhbm5lbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5ncm91cC5SZXNwb25zZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5ncm91cC5ScGNDaGFubmVsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLnRyYW5zcG9ydC5NdWx0aVBvaW50U2VuZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLnRyYW5zcG9ydC5SZXBsaWNhdGlvblRyYW5zbWl0dGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogVGhlIG1haW4gQ2x1c3Rlck1hbmFnZXIgY2xhc3MgZm9yIHRoZSBUcmliZXMgYmFzZWQgY2x1c3RlcmluZyBpbXBsZW1lbnRhdGlvbgotICovCi1wdWJsaWMgY2xhc3MgVHJpYmVzQ2x1c3Rlck1hbmFnZXIgaW1wbGVtZW50cyBDbHVzdGVyTWFuYWdlciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coVHJpYmVzQ2x1c3Rlck1hbmFnZXIuY2xhc3MpOwotCi0gICAgcHJpdmF0ZSBEZWZhdWx0Q29uZmlndXJhdGlvbk1hbmFnZXIgY29uZmlndXJhdGlvbk1hbmFnZXI7Ci0gICAgcHJpdmF0ZSBEZWZhdWx0Q29udGV4dE1hbmFnZXIgY29udGV4dE1hbmFnZXI7Ci0KLSAgICBwcml2YXRlIEhhc2hNYXA8U3RyaW5nLCBQYXJhbWV0ZXI+IHBhcmFtZXRlcnM7Ci0gICAgcHJpdmF0ZSBNYW5hZ2VkQ2hhbm5lbCBjaGFubmVsOwotICAgIHByaXZhdGUgUnBjQ2hhbm5lbCBycGNJbml0Q2hhbm5lbDsKLSAgICBwcml2YXRlIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ3VyYXRpb25Db250ZXh0OwotICAgIHByaXZhdGUgQ2hhbm5lbExpc3RlbmVyIGNoYW5uZWxMaXN0ZW5lcjsKLSAgICBwcml2YXRlIENoYW5uZWxTZW5kZXIgY2hhbm5lbFNlbmRlcjsKLSAgICBwcml2YXRlIE1lbWJlcnNoaXBNYW5hZ2VyIHByaW1hcnlNZW1iZXJzaGlwTWFuYWdlcjsKLSAgICBwcml2YXRlIFJwY0luaXRpYWxpemF0aW9uUmVxdWVzdEhhbmRsZXIgcnBjSW5pdFJlcXVlc3RIYW5kbGVyOwotICAgIHByaXZhdGUgTWVtYmVyc2hpcFNjaGVtZSBtZW1iZXJzaGlwU2NoZW1lOwotCi0gICAgLyoqCi0gICAgICogVGhlIG1vZGUgaW4gd2hpY2ggdGhpcyBtZW1iZXIgb3BlcmF0ZXMgc3VjaCBhcyAibG9hZEJhbGFuY2UiIG9yICJhcHBsaWNhdGlvbiIKLSAgICAgKi8KLSAgICBwcml2YXRlIE9wZXJhdGlvbk1vZGUgbW9kZTsKLQotICAgIC8qKgotICAgICAqIFN0YXRpYyBtZW1iZXJzCi0gICAgICovCi0gICAgcHJpdmF0ZSBMaXN0PG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5NZW1iZXI+IG1lbWJlcnM7Ci0KLSAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIExvYWRCYWxhbmNlRXZlbnRIYW5kbGVyPiBsYkV2ZW50SGFuZGxlcnMgPQotICAgICAgICAgICAgbmV3IEhhc2hNYXA8U3RyaW5nLCBMb2FkQmFsYW5jZUV2ZW50SGFuZGxlcj4oKTsKLSAgICBwcml2YXRlIGJvb2xlYW4gbG9hZEJhbGFuY2VNb2RlOwotCi0gICAgcHVibGljIFRyaWJlc0NsdXN0ZXJNYW5hZ2VyKCkgewotICAgICAgICBwYXJhbWV0ZXJzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBQYXJhbWV0ZXI+KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TWVtYmVycyhMaXN0PG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5NZW1iZXI+IG1lbWJlcnMpIHsKLSAgICAgICAgdGhpcy5tZW1iZXJzID0gbWVtYmVyczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuTWVtYmVyPiBnZXRNZW1iZXJzKCkgewotICAgICAgICByZXR1cm4gbWVtYmVyczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRMb2FkQmFsYW5jZUV2ZW50SGFuZGxlcihMb2FkQmFsYW5jZUV2ZW50SGFuZGxlciBldmVudEhhbmRsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGFwcGxpY2F0aW9uRG9tYWluKSB7Ci0gICAgICAgIGxvZy5pbmZvKCJMb2FkIGJhbGFuY2luZyBmb3IgYXBwbGljYXRpb24gZG9tYWluICIgKyBhcHBsaWNhdGlvbkRvbWFpbiArCi0gICAgICAgICAgICAgICAgICIgdXNpbmcgZXZlbnQgaGFuZGxlciAiICsgZXZlbnRIYW5kbGVyLmdldENsYXNzKCkpOwotICAgICAgICBsYkV2ZW50SGFuZGxlcnMucHV0KGFwcGxpY2F0aW9uRG9tYWluLCBldmVudEhhbmRsZXIpOwotICAgICAgICBsb2FkQmFsYW5jZU1vZGUgPSB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBMb2FkQmFsYW5jZUV2ZW50SGFuZGxlciBnZXRMb2FkQmFsYW5jZUV2ZW50SGFuZGxlcihTdHJpbmcgYXBwbGljYXRpb25Eb21haW4pIHsKLSAgICAgICAgcmV0dXJuIGxiRXZlbnRIYW5kbGVycy5nZXQoYXBwbGljYXRpb25Eb21haW4pOwotICAgIH0KLQotICAgIHB1YmxpYyBTZXQ8U3RyaW5nPiBnZXREb21haW5zKCkgewotICAgICAgICByZXR1cm4gbGJFdmVudEhhbmRsZXJzLmtleVNldCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBDb250ZXh0TWFuYWdlciBnZXRDb250ZXh0TWFuYWdlcigpIHsKLSAgICAgICAgcmV0dXJuIGNvbnRleHRNYW5hZ2VyOwotICAgIH0KLQotICAgIHB1YmxpYyBDb25maWd1cmF0aW9uTWFuYWdlciBnZXRDb25maWd1cmF0aW9uTWFuYWdlcigpIHsKLSAgICAgICAgcmV0dXJuIGNvbmZpZ3VyYXRpb25NYW5hZ2VyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluaXRpYWxpemUgdGhlIGNsdXN0ZXIuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIENsdXN0ZXJpbmdGYXVsdCBJZiBpbml0aWFsaXphdGlvbiBmYWlscwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGluaXQoKSB0aHJvd3MgQ2x1c3RlcmluZ0ZhdWx0IHsKLSAgICAgICAgbG9nLmluZm8oIkluaXRpYWxpemluZyBjbHVzdGVyLi4uIik7Ci0gICAgICAgIGFkZFJlcXVlc3RCbG9ja2luZ0hhbmRsZXJUb0luRmxvd3MoKTsKLSAgICAgICAgcHJpbWFyeU1lbWJlcnNoaXBNYW5hZ2VyID0gbmV3IE1lbWJlcnNoaXBNYW5hZ2VyKGNvbmZpZ3VyYXRpb25Db250ZXh0KTsKLQotICAgICAgICBjaGFubmVsID0gbmV3IEdyb3VwQ2hhbm5lbCgpOwotICAgICAgICBjaGFubmVsU2VuZGVyID0gbmV3IENoYW5uZWxTZW5kZXIoY2hhbm5lbCwgcHJpbWFyeU1lbWJlcnNoaXBNYW5hZ2VyLCBzeW5jaHJvbml6ZUFsbE1lbWJlcnMoKSk7Ci0gICAgICAgIGNoYW5uZWxMaXN0ZW5lciA9Ci0gICAgICAgICAgICAgICAgbmV3IENoYW5uZWxMaXN0ZW5lcihjb25maWd1cmF0aW9uQ29udGV4dCwgY29uZmlndXJhdGlvbk1hbmFnZXIsIGNvbnRleHRNYW5hZ2VyKTsKLSAgICAgICAgY2hhbm5lbC5hZGRDaGFubmVsTGlzdGVuZXIoY2hhbm5lbExpc3RlbmVyKTsKLQotICAgICAgICBieXRlW10gZG9tYWluID0gZ2V0Q2x1c3RlckRvbWFpbigpOwotICAgICAgICBsb2cuaW5mbygiQ2x1c3RlciBkb21haW46ICIgKyBuZXcgU3RyaW5nKGRvbWFpbikpOwotICAgICAgICBwcmltYXJ5TWVtYmVyc2hpcE1hbmFnZXIuc2V0RG9tYWluKGRvbWFpbik7Ci0KLSAgICAgICAgLy8gUnBjQ2hhbm5lbCBpcyBhIENoYW5uZWxMaXN0ZW5lci4gV2hlbiB0aGUgcmVwbHkgdG8gYSBwYXJ0aWN1bGFyIHJlcXVlc3QgY29tZXMgYmFjaywgaXQKLSAgICAgICAgLy8gcGlja3MgaXQgdXAuIEVhY2ggUlBDIGlzIGdpdmVuIGEgVVVJRCwgaGVuY2UgY2FuIGNvcnJlbGF0ZSB0aGUgcmVxdWVzdC1yZXNwb25zZSBwYWlyCi0gICAgICAgIHJwY0luaXRSZXF1ZXN0SGFuZGxlciA9IG5ldyBScGNJbml0aWFsaXphdGlvblJlcXVlc3RIYW5kbGVyKGNvbmZpZ3VyYXRpb25Db250ZXh0KTsKLSAgICAgICAgcnBjSW5pdENoYW5uZWwgPQotICAgICAgICAgICAgICAgIG5ldyBScGNDaGFubmVsKFRyaWJlc1V0aWwuZ2V0UnBjSW5pdENoYW5uZWxJZChkb21haW4pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwsIHJwY0luaXRSZXF1ZXN0SGFuZGxlcik7Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJDcmVhdGVkIFJQQyBDaGFubmVsIGZvciBkb21haW4gIiArIG5ldyBTdHJpbmcoZG9tYWluKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBzZXRNYXhpbXVtUmV0cmllcygpOwotICAgICAgICBjb25maWd1cmVNb2RlKGRvbWFpbik7Ci0gICAgICAgIGNvbmZpZ3VyZU1lbWJlcnNoaXBTY2hlbWUoZG9tYWluLCBtb2RlLmdldE1lbWJlcnNoaXBNYW5hZ2VycygpKTsKLSAgICAgICAgc2V0TWVtYmVySW5mbygpOwotCi0gICAgICAgIFRyaWJlc01lbWJlcnNoaXBMaXN0ZW5lciBtZW1iZXJzaGlwTGlzdGVuZXIgPSBuZXcgVHJpYmVzTWVtYmVyc2hpcExpc3RlbmVyKHByaW1hcnlNZW1iZXJzaGlwTWFuYWdlcik7Ci0gICAgICAgIGNoYW5uZWwuYWRkTWVtYmVyc2hpcExpc3RlbmVyKG1lbWJlcnNoaXBMaXN0ZW5lcik7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjaGFubmVsLnN0YXJ0KENoYW5uZWwuREVGQVVMVCk7IC8vIEF0IHRoaXMgcG9pbnQsIHRoaXMgbWVtYmVyIGpvaW5zIHRoZSBncm91cAotICAgICAgICAgICAgU3RyaW5nIGxvY2FsSG9zdCA9IFRyaWJlc1V0aWwuZ2V0TG9jYWxIb3N0KGNoYW5uZWwpOwotICAgICAgICAgICAgaWYgKGxvY2FsSG9zdC5zdGFydHNXaXRoKCIxMjcuMC4iKSkgewotICAgICAgICAgICAgICAgIGNoYW5uZWwuc3RvcChDaGFubmVsLkRFRkFVTFQpOwotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbHVzdGVyaW5nRmF1bHQoIkNhbm5vdCBqb2luIGNsdXN0ZXIgdXNpbmcgSVAgIiArIGxvY2FsSG9zdCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLiBQbGVhc2Ugc2V0IGFuIElQIGFkZHJlc3Mgb3RoZXIgdGhhbiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsSG9zdCArICIgaW4gdGhlIGF4aXMyLnhtbCBmaWxlIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKENoYW5uZWxFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJFcnJvciBzdGFydGluZyBUcmliZXMgY2hhbm5lbCI7Ci0gICAgICAgICAgICBsb2cuZXJyb3IobXNnLCBlKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbHVzdGVyaW5nRmF1bHQobXNnLCBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGxvZy5pbmZvKCJMb2NhbCBNZW1iZXIgIiArIFRyaWJlc1V0aWwuZ2V0TG9jYWxIb3N0KGNoYW5uZWwpKTsKLSAgICAgICAgVHJpYmVzVXRpbC5wcmludE1lbWJlcnMocHJpbWFyeU1lbWJlcnNoaXBNYW5hZ2VyKTsKLQotICAgICAgICBtZW1iZXJzaGlwU2NoZW1lLmpvaW5Hcm91cCgpOwotCi0gICAgICAgIC8vIElmIGNvbmZpZ3VyYXRpb24gbWFuYWdlbWVudCBpcyBlbmFibGVkLCBnZXQgdGhlIGxhdGVzdCBjb25maWcgZnJvbSBhIG5laWdoYm91cgotICAgICAgICBpZiAoY29uZmlndXJhdGlvbk1hbmFnZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgY29uZmlndXJhdGlvbk1hbmFnZXIuc2V0U2VuZGVyKGNoYW5uZWxTZW5kZXIpOwotICAgICAgICAgICAgaW5pdGlhbGl6ZVN5c3RlbShuZXcgR2V0Q29uZmlndXJhdGlvbkNvbW1hbmQoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBJZiBjb250ZXh0IHJlcGxpY2F0aW9uIGlzIGVuYWJsZWQsIGdldCB0aGUgbGF0ZXN0IHN0YXRlIGZyb20gYSBuZWlnaGJvdXIKLSAgICAgICAgaWYgKGNvbnRleHRNYW5hZ2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNvbnRleHRNYW5hZ2VyLnNldFNlbmRlcihjaGFubmVsU2VuZGVyKTsKLSAgICAgICAgICAgIGNoYW5uZWxMaXN0ZW5lci5zZXRDb250ZXh0TWFuYWdlcihjb250ZXh0TWFuYWdlcik7Ci0gICAgICAgICAgICBpbml0aWFsaXplU3lzdGVtKG5ldyBHZXRTdGF0ZUNvbW1hbmQoKSk7Ci0gICAgICAgICAgICBDbHVzdGVyaW5nQ29udGV4dExpc3RlbmVyIGNvbnRleHRMaXN0ZW5lciA9IG5ldyBDbHVzdGVyaW5nQ29udGV4dExpc3RlbmVyKGNoYW5uZWxTZW5kZXIpOwotICAgICAgICAgICAgY29uZmlndXJhdGlvbkNvbnRleHQuYWRkQ29udGV4dExpc3RlbmVyKGNvbnRleHRMaXN0ZW5lcik7Ci0gICAgICAgIH0KLQotICAgICAgICBjb25maWd1cmF0aW9uQ29udGV4dC4KLSAgICAgICAgICAgICAgICBzZXROb25SZXBsaWNhYmxlUHJvcGVydHkoQ2x1c3RlcmluZ0NvbnN0YW50cy5DTFVTVEVSX0lOSVRJQUxJWkVELCAidHJ1ZSIpOwotICAgICAgICBsb2cuaW5mbygiQ2x1c3RlciBpbml0aWFsaXphdGlvbiBjb21wbGV0ZWQuIik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNldE1lbWJlckluZm8oKSB0aHJvd3MgQ2x1c3RlcmluZ0ZhdWx0IHsKLSAgICAgICAgUHJvcGVydGllcyBtZW1iZXJJbmZvID0gbmV3IFByb3BlcnRpZXMoKTsKLSAgICAgICAgQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZyA9IGNvbmZpZ3VyYXRpb25Db250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgIFRyYW5zcG9ydEluRGVzY3JpcHRpb24gaHR0cFRyYW5zcG9ydCA9IGF4aXNDb25maWcuZ2V0VHJhbnNwb3J0SW4oImh0dHAiKTsKLSAgICAgICAgaWYgKGh0dHBUcmFuc3BvcnQgIT0gbnVsbCkgewotICAgICAgICAgICAgUGFyYW1ldGVyIHBvcnQgPSBodHRwVHJhbnNwb3J0LmdldFBhcmFtZXRlcigicG9ydCIpOwotICAgICAgICAgICAgaWYgKHBvcnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1lbWJlckluZm8ucHV0KCJodHRwUG9ydCIsIHBvcnQuZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgVHJhbnNwb3J0SW5EZXNjcmlwdGlvbiBodHRwc1RyYW5zcG9ydCA9IGF4aXNDb25maWcuZ2V0VHJhbnNwb3J0SW4oImh0dHBzIik7Ci0gICAgICAgIGlmIChodHRwc1RyYW5zcG9ydCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBQYXJhbWV0ZXIgcG9ydCA9IGh0dHBzVHJhbnNwb3J0LmdldFBhcmFtZXRlcigicG9ydCIpOwotICAgICAgICAgICAgaWYgKHBvcnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1lbWJlckluZm8ucHV0KCJodHRwc1BvcnQiLCBwb3J0LmdldFZhbHVlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIFBhcmFtZXRlciBpc0FjdGl2ZVBhcmFtID0gZ2V0UGFyYW1ldGVyKENsdXN0ZXJpbmdDb25zdGFudHMuUGFyYW1ldGVycy5JU19BQ1RJVkUpOwotICAgICAgICBpZiAoaXNBY3RpdmVQYXJhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtZW1iZXJJbmZvLnNldFByb3BlcnR5KENsdXN0ZXJpbmdDb25zdGFudHMuUGFyYW1ldGVycy5JU19BQ1RJVkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTdHJpbmcpIGlzQWN0aXZlUGFyYW0uZ2V0VmFsdWUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBtZW1iZXJJbmZvLnNldFByb3BlcnR5KCJob3N0TmFtZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJpYmVzVXRpbC5nZXRMb2NhbEhvc3QoZ2V0UGFyYW1ldGVyKFRyaWJlc0NvbnN0YW50cy5MT0NBTF9NRU1CRVJfSE9TVCkpKTsKLQotICAgICAgICBQYXJhbWV0ZXIgcHJvcHNQYXJhbSA9IGdldFBhcmFtZXRlcigicHJvcGVydGllcyIpOwotICAgICAgICBpZihwcm9wc1BhcmFtICE9IG51bGwpewotICAgICAgICAgICAgT01FbGVtZW50IHBhcmFtRWxlID0gcHJvcHNQYXJhbS5nZXRQYXJhbWV0ZXJFbGVtZW50KCk7Ci0gICAgICAgICAgICBmb3IoSXRlcmF0b3IgaXRlciA9IHBhcmFtRWxlLmdldENoaWxkcmVuV2l0aExvY2FsTmFtZSgicHJvcGVydHkiKTsgaXRlci5oYXNOZXh0KCk7KXsKLSAgICAgICAgICAgICAgICBPTUVsZW1lbnQgcHJvcEVsZSA9IChPTUVsZW1lbnQpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgIE9NQXR0cmlidXRlIG5hbWVBdHRyaWIgPSBwcm9wRWxlLmdldEF0dHJpYnV0ZShuZXcgUU5hbWUoIm5hbWUiKSk7Ci0gICAgICAgICAgICAgICAgaWYobmFtZUF0dHJpYiAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgT01BdHRyaWJ1dGUgdmFsdWVBdHRyaWIgPSBwcm9wRWxlLmdldEF0dHJpYnV0ZShuZXcgUU5hbWUoInZhbHVlIikpOwotICAgICAgICAgICAgICAgICAgICBpZiAgKHZhbHVlQXR0cmliICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhdHRyaWJWYWwgPSB2YWx1ZUF0dHJpYi5nZXRBdHRyaWJ1dGVWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmliVmFsID0gcmVwbGFjZVByb3BlcnR5KGF0dHJpYlZhbCwgbWVtYmVySW5mbyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZW1iZXJJbmZvLnNldFByb3BlcnR5KG5hbWVBdHRyaWIuZ2V0QXR0cmlidXRlVmFsdWUoKSwgYXR0cmliVmFsKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIG1lbWJlckluZm8ucmVtb3ZlKCJob3N0TmFtZSIpOyAvLyB0aGlzIHdhcyBuZWVkZWQgb25seSB0byBwb3B1bGF0ZSBvdGhlciBwcm9wZXJ0aWVzLiBObyBuZWVkIHRvIHNlbmQgaXQuCi0KLSAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtZW1iZXJJbmZvLnN0b3JlKGJvdXQsICIiKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJDYW5ub3Qgc3RvcmUgbWVtYmVyIHRyYW5zcG9ydCBwcm9wZXJ0aWVzIGluIHRoZSBCeXRlQXJyYXlPdXRwdXRTdHJlYW0iOwotICAgICAgICAgICAgbG9nLmVycm9yKG1zZywgZSk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ2x1c3RlcmluZ0ZhdWx0KG1zZywgZSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2hhbm5lbC5nZXRNZW1iZXJzaGlwU2VydmljZSgpLnNldFBheWxvYWQoYm91dC50b0J5dGVBcnJheSgpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgcmVwbGFjZVByb3BlcnR5KFN0cmluZyB0ZXh0LCBQcm9wZXJ0aWVzIHByb3BzKSB7Ci0gICAgICAgIGludCBpbmRleE9mU3RhcnRpbmdDaGFycyA9IC0xOwotICAgICAgICBpbnQgaW5kZXhPZkNsb3NpbmdCcmFjZTsKLQotICAgICAgICAvLyBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbiBkZWFscyB3aXRoIHByb3BlcnRpZXMuCi0gICAgICAgIC8vIFByb3BlcnRpZXMgYXJlIHNwZWNpZmllZCBhcyAke3N5c3RlbS5wcm9wZXJ0eX0sCi0gICAgICAgIC8vIGFuZCBhcmUgYXNzdW1lZCB0byBiZSBTeXN0ZW0gcHJvcGVydGllcwotICAgICAgICB3aGlsZSAoaW5kZXhPZlN0YXJ0aW5nQ2hhcnMgPCB0ZXh0LmluZGV4T2YoIiR7IikgJiYKLSAgICAgICAgICAgICAgIChpbmRleE9mU3RhcnRpbmdDaGFycyA9IHRleHQuaW5kZXhPZigiJHsiKSkgIT0gLTEgJiYKLSAgICAgICAgICAgIChpbmRleE9mQ2xvc2luZ0JyYWNlID0gdGV4dC5pbmRleE9mKCJ9IikpICE9IC0xKSB7IC8vIElzIGEgcHJvcGVydHkgdXNlZD8KLSAgICAgICAgICAgIFN0cmluZyBzeXNQcm9wID0gdGV4dC5zdWJzdHJpbmcoaW5kZXhPZlN0YXJ0aW5nQ2hhcnMgKyAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleE9mQ2xvc2luZ0JyYWNlKTsKLSAgICAgICAgICAgIFN0cmluZyBwcm9wVmFsdWUgPSBwcm9wcy5nZXRQcm9wZXJ0eShzeXNQcm9wKTsKLSAgICAgICAgICAgIGlmIChwcm9wVmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRleHQgPSB0ZXh0LnN1YnN0cmluZygwLCBpbmRleE9mU3RhcnRpbmdDaGFycykgKyBwcm9wVmFsdWUgKwotICAgICAgICAgICAgICAgICAgICAgICB0ZXh0LnN1YnN0cmluZyhpbmRleE9mQ2xvc2luZ0JyYWNlICsgMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRleHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBtZW1iZXJzaGlwIHNjaGVtZSBhcHBsaWNhYmxlIHRvIHRoaXMgY2x1c3RlcgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgbWVtYmVyc2hpcCBzY2hlbWUuIE9ubHkgIndrYSIgJiAibXVsdGljYXN0IiBhcmUgdmFsaWQgcmV0dXJuIHZhbHVlcy4KLSAgICAgKiBAdGhyb3dzIENsdXN0ZXJpbmdGYXVsdCBJZiB0aGUgbWVtYmVyc2hpcFNjaGVtZSBzcGVjaWZpZWQgaW4gdGhlIGF4aXMyLnhtbCBmaWxlIGlzIGludmFsaWQKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBnZXRNZW1iZXJzaGlwU2NoZW1lKCkgdGhyb3dzIENsdXN0ZXJpbmdGYXVsdCB7Ci0gICAgICAgIFBhcmFtZXRlciBtZW1iZXJzaGlwU2NoZW1lUGFyYW0gPQotICAgICAgICAgICAgICAgIGdldFBhcmFtZXRlcihDbHVzdGVyaW5nQ29uc3RhbnRzLlBhcmFtZXRlcnMuTUVNQkVSU0hJUF9TQ0hFTUUpOwotICAgICAgICBTdHJpbmcgbWJyU2NoZW1lID0gQ2x1c3RlcmluZ0NvbnN0YW50cy5NZW1iZXJzaGlwU2NoZW1lLk1VTFRJQ0FTVF9CQVNFRDsKLSAgICAgICAgaWYgKG1lbWJlcnNoaXBTY2hlbWVQYXJhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtYnJTY2hlbWUgPSAoKFN0cmluZykgbWVtYmVyc2hpcFNjaGVtZVBhcmFtLmdldFZhbHVlKCkpLnRyaW0oKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIW1iclNjaGVtZS5lcXVhbHMoQ2x1c3RlcmluZ0NvbnN0YW50cy5NZW1iZXJzaGlwU2NoZW1lLk1VTFRJQ0FTVF9CQVNFRCkgJiYKLSAgICAgICAgICAgICFtYnJTY2hlbWUuZXF1YWxzKENsdXN0ZXJpbmdDb25zdGFudHMuTWVtYmVyc2hpcFNjaGVtZS5XS0FfQkFTRUQpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbXNnID0gIkludmFsaWQgbWVtYmVyc2hpcCBzY2hlbWUgJyIgKyBtYnJTY2hlbWUgKyAiJy4gU3VwcG9ydGVkIHNjaGVtZXMgYXJlICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIENsdXN0ZXJpbmdDb25zdGFudHMuTWVtYmVyc2hpcFNjaGVtZS5NVUxUSUNBU1RfQkFTRUQgKyAiICYgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgQ2x1c3RlcmluZ0NvbnN0YW50cy5NZW1iZXJzaGlwU2NoZW1lLldLQV9CQVNFRDsKLSAgICAgICAgICAgIGxvZy5lcnJvcihtc2cpOwotICAgICAgICAgICAgdGhyb3cgbmV3IENsdXN0ZXJpbmdGYXVsdChtc2cpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtYnJTY2hlbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBjbHVzdGVyaW5nIGRvbWFpbiB0byB3aGljaCB0aGlzIG5vZGUgYmVsb25ncyB0bwotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgY2x1c3RlcmluZyBkb21haW4gdG8gd2hpY2ggdGhpcyBub2RlIGJlbG9uZ3MgdG8KLSAgICAgKi8KLSAgICBwcml2YXRlIGJ5dGVbXSBnZXRDbHVzdGVyRG9tYWluKCkgewotICAgICAgICBQYXJhbWV0ZXIgZG9tYWluUGFyYW0gPSBnZXRQYXJhbWV0ZXIoQ2x1c3RlcmluZ0NvbnN0YW50cy5QYXJhbWV0ZXJzLkRPTUFJTik7Ci0gICAgICAgIGJ5dGVbXSBkb21haW47Ci0gICAgICAgIGlmIChkb21haW5QYXJhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBkb21haW4gPSAoKFN0cmluZykgZG9tYWluUGFyYW0uZ2V0VmFsdWUoKSkuZ2V0Qnl0ZXMoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGRvbWFpbiA9IENsdXN0ZXJpbmdDb25zdGFudHMuREVGQVVMVF9ET01BSU4uZ2V0Qnl0ZXMoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZG9tYWluOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgbWF4aW11bSBudW1iZXIgb2YgcmV0cmllcywgaWYgbWVzc2FnZSBzZW5kaW5nIHRvIGEgcGFydGljdWxhciBub2RlIGZhaWxzCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHNldE1heGltdW1SZXRyaWVzKCkgewotICAgICAgICBQYXJhbWV0ZXIgbWF4UmV0cmllc1BhcmFtID0gZ2V0UGFyYW1ldGVyKFRyaWJlc0NvbnN0YW50cy5NQVhfUkVUUklFUyk7Ci0gICAgICAgIGludCBtYXhSZXRyaWVzID0gMTA7Ci0gICAgICAgIGlmIChtYXhSZXRyaWVzUGFyYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgbWF4UmV0cmllcyA9IEludGVnZXIucGFyc2VJbnQoKFN0cmluZykgbWF4UmV0cmllc1BhcmFtLmdldFZhbHVlKCkpOwotICAgICAgICB9Ci0gICAgICAgIFJlcGxpY2F0aW9uVHJhbnNtaXR0ZXIgcmVwbGljYXRpb25UcmFuc21pdHRlciA9Ci0gICAgICAgICAgICAgICAgKFJlcGxpY2F0aW9uVHJhbnNtaXR0ZXIpIGNoYW5uZWwuZ2V0Q2hhbm5lbFNlbmRlcigpOwotICAgICAgICBNdWx0aVBvaW50U2VuZGVyIG11bHRpUG9pbnRTZW5kZXIgPSByZXBsaWNhdGlvblRyYW5zbWl0dGVyLmdldFRyYW5zcG9ydCgpOwotICAgICAgICBtdWx0aVBvaW50U2VuZGVyLnNldE1heFJldHJ5QXR0ZW1wdHMobWF4UmV0cmllcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQSBSZXF1ZXN0QmxvY2tpbmdIYW5kbGVyLCB3aGljaCBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZgotICAgICAqIHtAbGluayBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5IYW5kbGVyfSBpcyBhZGRlZCB0byB0aGUgSW5GbG93ICYgSW5GYXVsdEZsb3cuIFRoaXMgaGFuZGxlcgotICAgICAqIGlzIHVzZWQgZm9yIHJlamVjdGluZyBXZWIgc2VydmljZSByZXF1ZXN0cyB1bnRpbCB0aGlzIG5vZGUgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuIFRoaXMgaGFuZGxlcgotICAgICAqIGNhbiBhbHNvIGJlIHVzZWQgZm9yIHJlamVjdGluZyByZXF1ZXN0cyB3aGVuIHRoaXMgbm9kZSBpcyByZWluaXRpYWxpemluZyBvciBpcyBpbiBhbgotICAgICAqIGluY29uc2lzdGVudCBzdGF0ZSAod2hpY2ggY2FuIGhhcHBlbiB3aGVuIGEgY29uZmlndXJhdGlvbiBjaGFuZ2UgaXMgdGFraW5nIHBsYWNlKS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYWRkUmVxdWVzdEJsb2NraW5nSGFuZGxlclRvSW5GbG93cygpIHsKLSAgICAgICAgQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZyA9IGNvbmZpZ3VyYXRpb25Db250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgIGZvciAoT2JqZWN0IG8gOiBheGlzQ29uZmlnLmdldEluRmxvd1BoYXNlcygpKSB7Ci0gICAgICAgICAgICBQaGFzZSBwaGFzZSA9IChQaGFzZSkgbzsKLSAgICAgICAgICAgIGlmIChwaGFzZSBpbnN0YW5jZW9mIERpc3BhdGNoUGhhc2UpIHsKLSAgICAgICAgICAgICAgICBSZXF1ZXN0QmxvY2tpbmdIYW5kbGVyIHJlcXVlc3RCbG9ja2luZ0hhbmRsZXIgPSBuZXcgUmVxdWVzdEJsb2NraW5nSGFuZGxlcigpOwotICAgICAgICAgICAgICAgIGlmICghcGhhc2UuZ2V0SGFuZGxlcnMoKS5jb250YWlucyhyZXF1ZXN0QmxvY2tpbmdIYW5kbGVyKSkgewotICAgICAgICAgICAgICAgICAgICBQaGFzZVJ1bGUgcnVsZSA9IG5ldyBQaGFzZVJ1bGUoIkRpc3BhdGNoIik7Ci0gICAgICAgICAgICAgICAgICAgIHJ1bGUuc2V0QWZ0ZXIoIlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciIpOwotICAgICAgICAgICAgICAgICAgICBydWxlLnNldEJlZm9yZSgiSW5zdGFuY2VEaXNwYXRjaGVyIik7Ci0gICAgICAgICAgICAgICAgICAgIEhhbmRsZXJEZXNjcmlwdGlvbiBoYW5kbGVyRGVzYyA9IHJlcXVlc3RCbG9ja2luZ0hhbmRsZXIuZ2V0SGFuZGxlckRlc2MoKTsKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlckRlc2Muc2V0SGFuZGxlcihyZXF1ZXN0QmxvY2tpbmdIYW5kbGVyKTsKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlckRlc2Muc2V0TmFtZShDbHVzdGVyaW5nQ29uc3RhbnRzLlJFUVVFU1RfQkxPQ0tJTkdfSEFORExFUik7Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZXJEZXNjLnNldFJ1bGVzKHJ1bGUpOwotICAgICAgICAgICAgICAgICAgICBwaGFzZS5hZGRIYW5kbGVyKHJlcXVlc3RCbG9ja2luZ0hhbmRsZXIpOwotCi0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQWRkZWQgIiArIENsdXN0ZXJpbmdDb25zdGFudHMuUkVRVUVTVF9CTE9DS0lOR19IQU5ETEVSICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgYmV0d2VlbiBTT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIgJiBJbnN0YW5jZURpc3BhdGNoZXIgdG8gSW5GbG93Iik7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmb3IgKE9iamVjdCBvIDogYXhpc0NvbmZpZy5nZXRJbkZhdWx0Rmxvd1BoYXNlcygpKSB7Ci0gICAgICAgICAgICBQaGFzZSBwaGFzZSA9IChQaGFzZSkgbzsKLSAgICAgICAgICAgIGlmIChwaGFzZSBpbnN0YW5jZW9mIERpc3BhdGNoUGhhc2UpIHsKLSAgICAgICAgICAgICAgICBSZXF1ZXN0QmxvY2tpbmdIYW5kbGVyIHJlcXVlc3RCbG9ja2luZ0hhbmRsZXIgPSBuZXcgUmVxdWVzdEJsb2NraW5nSGFuZGxlcigpOwotICAgICAgICAgICAgICAgIGlmICghcGhhc2UuZ2V0SGFuZGxlcnMoKS5jb250YWlucyhyZXF1ZXN0QmxvY2tpbmdIYW5kbGVyKSkgewotICAgICAgICAgICAgICAgICAgICBQaGFzZVJ1bGUgcnVsZSA9IG5ldyBQaGFzZVJ1bGUoIkRpc3BhdGNoIik7Ci0gICAgICAgICAgICAgICAgICAgIHJ1bGUuc2V0QWZ0ZXIoIlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciIpOwotICAgICAgICAgICAgICAgICAgICBydWxlLnNldEJlZm9yZSgiSW5zdGFuY2VEaXNwYXRjaGVyIik7Ci0gICAgICAgICAgICAgICAgICAgIEhhbmRsZXJEZXNjcmlwdGlvbiBoYW5kbGVyRGVzYyA9IHJlcXVlc3RCbG9ja2luZ0hhbmRsZXIuZ2V0SGFuZGxlckRlc2MoKTsKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlckRlc2Muc2V0SGFuZGxlcihyZXF1ZXN0QmxvY2tpbmdIYW5kbGVyKTsKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlckRlc2Muc2V0TmFtZShDbHVzdGVyaW5nQ29uc3RhbnRzLlJFUVVFU1RfQkxPQ0tJTkdfSEFORExFUik7Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZXJEZXNjLnNldFJ1bGVzKHJ1bGUpOwotICAgICAgICAgICAgICAgICAgICBwaGFzZS5hZGRIYW5kbGVyKHJlcXVlc3RCbG9ja2luZ0hhbmRsZXIpOwotCi0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQWRkZWQgIiArIENsdXN0ZXJpbmdDb25zdGFudHMuUkVRVUVTVF9CTE9DS0lOR19IQU5ETEVSICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgYmV0d2VlbiBTT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIgJiBJbnN0YW5jZURpc3BhdGNoZXIgdG8gSW5GYXVsdEZsb3ciKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNvbmZpZ3VyZU1vZGUoYnl0ZVtdIGRvbWFpbikgewotICAgICAgICBpZiAobG9hZEJhbGFuY2VNb2RlKSB7Ci0gICAgICAgICAgICBtb2RlID0gbmV3IExvYWRCYWxhbmNlck1vZGUoZG9tYWluLCBsYkV2ZW50SGFuZGxlcnMsIHByaW1hcnlNZW1iZXJzaGlwTWFuYWdlcik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtb2RlID0gbmV3IEFwcGxpY2F0aW9uTW9kZShkb21haW4sIHByaW1hcnlNZW1iZXJzaGlwTWFuYWdlcik7Ci0gICAgICAgIH0KLSAgICAgICAgbW9kZS5pbml0KGNoYW5uZWwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhhbmRsZSBzcGVjaWZpYyBjb25maWd1cmF0aW9ucyByZWxhdGVkIHRvIGRpZmZlcmVudCBtZW1iZXJzaGlwIG1hbmFnZW1lbnQgc2NoZW1lcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBsb2NhbERvbWFpbiAgICAgICAgVGhlIGNsdXN0ZXJpbmcgbG9hZEJhbGFuY2VyRG9tYWluIHRvIHdoaWNoIHRoaXMgbWVtYmVyIGJlbG9uZ3MgdG8KLSAgICAgKiBAcGFyYW0gbWVtYmVyc2hpcE1hbmFnZXJzIE1lbWJlcnNoaXBNYW5hZ2VycyBmb3IgZGlmZmVyZW50IGRvbWFpbnMKLSAgICAgKiBAdGhyb3dzIENsdXN0ZXJpbmdGYXVsdCBJZiB0aGUgbWVtYmVyc2hpcCBzY2hlbWUgaXMgaW52YWxpZCwgb3IgaWYgYW4gZXJyb3Igb2NjdXJzCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgY29uZmlndXJpbmcgbWVtYmVyc2hpcCBzY2hlbWUKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY29uZmlndXJlTWVtYmVyc2hpcFNjaGVtZShieXRlW10gbG9jYWxEb21haW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxNZW1iZXJzaGlwTWFuYWdlcj4gbWVtYmVyc2hpcE1hbmFnZXJzKQotICAgICAgICAgICAgdGhyb3dzIENsdXN0ZXJpbmdGYXVsdCB7Ci0gICAgICAgIE1lbWJlcnNoaXBMaXN0ZW5lciBtZW1iZXJzaGlwTGlzdGVuZXI7Ci0gICAgICAgIFBhcmFtZXRlciBwYXJhbWV0ZXIgPSBnZXRQYXJhbWV0ZXIoQ2x1c3RlcmluZ0NvbnN0YW50cy5QYXJhbWV0ZXJzLk1FTUJFUlNISVBfTElTVEVORVIpOwotICAgICAgICBpZiAocGFyYW1ldGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBwYXJhbUVsZSA9IHBhcmFtZXRlci5nZXRQYXJhbWV0ZXJFbGVtZW50KCk7Ci0gICAgICAgICAgICBTdHJpbmcgY2xhenogPQotICAgICAgICAgICAgICAgICAgICBwYXJhbUVsZS5nZXRGaXJzdENoaWxkV2l0aE5hbWUobmV3IFFOYW1lKCJjbGFzcyIpKS5nZXRUZXh0KCkudHJpbSgpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtZW1iZXJzaGlwTGlzdGVuZXIgPSAoTWVtYmVyc2hpcExpc3RlbmVyKSBDbGFzcy5mb3JOYW1lKGNsYXp6KS5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbXNnID0gIkNhbm5vdCBpbnN0YW50aWF0ZSBNZW1iZXJzaGlwTGlzdGVuZXIgIiArIGNsYXp6OwotICAgICAgICAgICAgICAgIGxvZy5lcnJvcihtc2csIGUpOwotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbHVzdGVyaW5nRmF1bHQobXNnLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE9NRWxlbWVudCBwcm9wc0VsZSA9IHBhcmFtRWxlLmdldEZpcnN0Q2hpbGRXaXRoTmFtZShuZXcgUU5hbWUoInByb3BlcnRpZXMiKSk7Ci0gICAgICAgICAgICBpZiAocHJvcHNFbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHByb3BzRWxlLmdldENoaWxkRWxlbWVudHMoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgICAgIE9NRWxlbWVudCBwcm9wRWxlID0gKE9NRWxlbWVudCkgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIE9NQXR0cmlidXRlIG5hbWVBdHRyaWIgPSBwcm9wRWxlLmdldEF0dHJpYnV0ZShuZXcgUU5hbWUoIm5hbWUiKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lQXR0cmliICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gbmFtZUF0dHJpYi5nZXRBdHRyaWJ1dGVWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2V0SW5zdGFuY2VQcm9wZXJ0eShuYW1lLCBwcm9wRWxlLmdldFRleHQoKS50cmltKCksIG1lbWJlcnNoaXBMaXN0ZW5lcik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgc2NoZW1lID0gZ2V0TWVtYmVyc2hpcFNjaGVtZSgpOwotICAgICAgICBsb2cuaW5mbygiVXNpbmcgIiArIHNjaGVtZSArICIgYmFzZWQgbWVtYmVyc2hpcCBtYW5hZ2VtZW50IHNjaGVtZSIpOwotICAgICAgICBpZiAoc2NoZW1lLmVxdWFscyhDbHVzdGVyaW5nQ29uc3RhbnRzLk1lbWJlcnNoaXBTY2hlbWUuV0tBX0JBU0VEKSkgewotICAgICAgICAgICAgbWVtYmVyc2hpcFNjaGVtZSA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBXa2FCYXNlZE1lbWJlcnNoaXBTY2hlbWUoY2hhbm5lbCwgbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1iZXJzaGlwTWFuYWdlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWFyeU1lbWJlcnNoaXBNYW5hZ2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMsIGxvY2FsRG9tYWluLCBtZW1iZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEJvb2xlYW5QYXJhbShDbHVzdGVyaW5nQ29uc3RhbnRzLlBhcmFtZXRlcnMuQVRNT1NUX09OQ0VfTVNHX1NFTUFOVElDUyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Qm9vbGVhblBhcmFtKENsdXN0ZXJpbmdDb25zdGFudHMuUGFyYW1ldGVycy5QUkVTRVJWRV9NU0dfT1JERVIpKTsKLSAgICAgICAgfSBlbHNlIGlmIChzY2hlbWUuZXF1YWxzKENsdXN0ZXJpbmdDb25zdGFudHMuTWVtYmVyc2hpcFNjaGVtZS5NVUxUSUNBU1RfQkFTRUQpKSB7Ci0gICAgICAgICAgICBtZW1iZXJzaGlwU2NoZW1lID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IE11bHRpY2FzdEJhc2VkTWVtYmVyc2hpcFNjaGVtZShjaGFubmVsLCBtb2RlLCBwYXJhbWV0ZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsRG9tYWluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEJvb2xlYW5QYXJhbShDbHVzdGVyaW5nQ29uc3RhbnRzLlBhcmFtZXRlcnMuQVRNT1NUX09OQ0VfTVNHX1NFTUFOVElDUyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Qm9vbGVhblBhcmFtKENsdXN0ZXJpbmdDb25zdGFudHMuUGFyYW1ldGVycy5QUkVTRVJWRV9NU0dfT1JERVIpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiSW52YWxpZCBtZW1iZXJzaGlwIHNjaGVtZSAnIiArIHNjaGVtZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgIicuIFN1cHBvcnRlZCBzY2hlbWVzIGFyZSBtdWx0aWNhc3QgJiB3a2EiOwotICAgICAgICAgICAgbG9nLmVycm9yKG1zZyk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ2x1c3RlcmluZ0ZhdWx0KG1zZyk7Ci0gICAgICAgIH0KLSAgICAgICAgbWVtYmVyc2hpcFNjaGVtZS5pbml0KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGdldEJvb2xlYW5QYXJhbShTdHJpbmcgbmFtZSkgewotICAgICAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotICAgICAgICBQYXJhbWV0ZXIgcGFyYW1ldGVyID0gZ2V0UGFyYW1ldGVyKG5hbWUpOwotICAgICAgICBpZiAocGFyYW1ldGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IHBhcmFtZXRlci5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBCb29sZWFuLnZhbHVlT2YoKChTdHJpbmcpIHZhbHVlKS50cmltKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmluZCBhbmQgaW52b2tlIHRoZSBzZXR0ZXIgbWV0aG9kIHdpdGggdGhlIG5hbWUgb2YgZm9ybSBzZXRYWFggcGFzc2luZyBpbiB0aGUgdmFsdWUgZ2l2ZW4KLSAgICAgKiBvbiB0aGUgUE9KTyBvYmplY3QKLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIG5hbWUgb2YgdGhlIHNldHRlciBmaWVsZAotICAgICAqIEBwYXJhbSB2YWwgIHZhbHVlIHRvIGJlIHNldAotICAgICAqIEBwYXJhbSBvYmogIFBPSk8gaW5zdGFuY2UKLSAgICAgKiBAdGhyb3dzIENsdXN0ZXJpbmdGYXVsdCBJZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgc2V0dGluZyB0aGUgcHJvcGVydHkKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2V0SW5zdGFuY2VQcm9wZXJ0eShTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbCwgT2JqZWN0IG9iaikgdGhyb3dzIENsdXN0ZXJpbmdGYXVsdCB7Ci0KLSAgICAgICAgU3RyaW5nIG1OYW1lID0gInNldCIgKyBDaGFyYWN0ZXIudG9VcHBlckNhc2UobmFtZS5jaGFyQXQoMCkpICsgbmFtZS5zdWJzdHJpbmcoMSk7Ci0gICAgICAgIE1ldGhvZCBtZXRob2Q7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBNZXRob2RbXSBtZXRob2RzID0gb2JqLmdldENsYXNzKCkuZ2V0TWV0aG9kcygpOwotICAgICAgICAgICAgYm9vbGVhbiBpbnZva2VkID0gZmFsc2U7Ci0gICAgICAgICAgICBmb3IgKE1ldGhvZCBtZXRob2QxIDogbWV0aG9kcykgewotICAgICAgICAgICAgICAgIGlmIChtTmFtZS5lcXVhbHMobWV0aG9kMS5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIENsYXNzW10gcGFyYW1zID0gbWV0aG9kMS5nZXRQYXJhbWV0ZXJUeXBlcygpOwotICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1zLmxlbmd0aCAhPSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVFeGNlcHRpb24oIkRpZCBub3QgZmluZCBhIHNldHRlciBtZXRob2QgbmFtZWQgOiAiICsgbU5hbWUgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoKSB0aGF0IHRha2VzIGEgc2luZ2xlIFN0cmluZywgaW50LCBsb25nLCBmbG9hdCwgZG91YmxlICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvciBib29sZWFuIHBhcmFtZXRlciIpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbCBpbnN0YW5jZW9mIFN0cmluZykgewotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gKFN0cmluZykgdmFsOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtc1swXS5lcXVhbHMoU3RyaW5nLmNsYXNzKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZCA9IG9iai5nZXRDbGFzcygpLmdldE1ldGhvZChtTmFtZSwgU3RyaW5nLmNsYXNzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QuaW52b2tlKG9iaiwgbmV3IFN0cmluZ1tde3ZhbHVlfSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhcmFtc1swXS5lcXVhbHMoaW50LmNsYXNzKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZCA9IG9iai5nZXRDbGFzcygpLmdldE1ldGhvZChtTmFtZSwgaW50LmNsYXNzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QuaW52b2tlKG9iaiwgbmV3IEludGVnZXJbXXtuZXcgSW50ZWdlcih2YWx1ZSl9KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyYW1zWzBdLmVxdWFscyhsb25nLmNsYXNzKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZCA9IG9iai5nZXRDbGFzcygpLmdldE1ldGhvZChtTmFtZSwgbG9uZy5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kLmludm9rZShvYmosIG5ldyBMb25nW117bmV3IExvbmcodmFsdWUpfSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhcmFtc1swXS5lcXVhbHMoZmxvYXQuY2xhc3MpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gb2JqLmdldENsYXNzKCkuZ2V0TWV0aG9kKG1OYW1lLCBmbG9hdC5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kLmludm9rZShvYmosIG5ldyBGbG9hdFtde25ldyBGbG9hdCh2YWx1ZSl9KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyYW1zWzBdLmVxdWFscyhkb3VibGUuY2xhc3MpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gb2JqLmdldENsYXNzKCkuZ2V0TWV0aG9kKG1OYW1lLCBkb3VibGUuY2xhc3MpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZC5pbnZva2Uob2JqLCBuZXcgRG91YmxlW117bmV3IERvdWJsZSh2YWx1ZSl9KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyYW1zWzBdLmVxdWFscyhib29sZWFuLmNsYXNzKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZCA9IG9iai5nZXRDbGFzcygpLmdldE1ldGhvZChtTmFtZSwgYm9vbGVhbi5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kLmludm9rZShvYmosIG5ldyBCb29sZWFuW117Qm9vbGVhbi52YWx1ZU9mKHZhbHVlKX0pOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVFeGNlcHRpb24oIkRpZCBub3QgZmluZCBhIHNldHRlciBtZXRob2QgbmFtZWQgOiAiICsgbU5hbWUgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKCkgdGhhdCB0YWtlcyBhIHNpbmdsZSBTdHJpbmcsIGludCwgbG9uZywgZmxvYXQsIGRvdWJsZSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yIGJvb2xlYW4gcGFyYW1ldGVyIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1zWzBdLmVxdWFscyhPTUVsZW1lbnQuY2xhc3MpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gb2JqLmdldENsYXNzKCkuZ2V0TWV0aG9kKG1OYW1lLCBPTUVsZW1lbnQuY2xhc3MpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZC5pbnZva2Uob2JqLCBuZXcgT01FbGVtZW50W117KE9NRWxlbWVudCkgdmFsfSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaW52b2tlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIWludm9rZWQpIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVFeGNlcHRpb24oIkRpZCBub3QgZmluZCBhIHNldHRlciBtZXRob2QgbmFtZWQgOiAiICsgbU5hbWUgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKCkgdGhhdCB0YWtlcyBhIHNpbmdsZSBTdHJpbmcsIGludCwgbG9uZywgZmxvYXQsIGRvdWJsZSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yIGJvb2xlYW4gcGFyYW1ldGVyIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGhhbmRsZUV4Y2VwdGlvbigiRXJyb3IgaW52b2tpbmcgc2V0dGVyIG1ldGhvZCBuYW1lZCA6ICIgKyBtTmFtZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIigpIHRoYXQgdGFrZXMgYSBzaW5nbGUgU3RyaW5nLCBpbnQsIGxvbmcsIGZsb2F0LCBkb3VibGUgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yIGJvb2xlYW4gcGFyYW1ldGVyIiwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlRXhjZXB0aW9uKFN0cmluZyBtc2csIEV4Y2VwdGlvbiBlKSB0aHJvd3MgQ2x1c3RlcmluZ0ZhdWx0IHsKLSAgICAgICAgbG9nLmVycm9yKG1zZywgZSk7Ci0gICAgICAgIHRocm93IG5ldyBDbHVzdGVyaW5nRmF1bHQobXNnLCBlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlRXhjZXB0aW9uKFN0cmluZyBtc2cpIHRocm93cyBDbHVzdGVyaW5nRmF1bHQgewotICAgICAgICBsb2cuZXJyb3IobXNnKTsKLSAgICAgICAgdGhyb3cgbmV3IENsdXN0ZXJpbmdGYXVsdChtc2cpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBzb21lIGluZm9ybWF0aW9uIGZyb20gYSBuZWlnaGJvdXIuIFRoaXMgaW5mb3JtYXRpb24gd2lsbCBiZSB1c2VkIGJ5IHRoaXMgbm9kZSB0bwotICAgICAqIGluaXRpYWxpemUgaXRzZWxmCi0gICAgICogPHAvPgotICAgICAqIHJwY0NoYW5uZWwgaXMgVGhlIHV0aWxpdHkgZm9yIHNlbmRpbmcgUlBDIHN0eWxlIG1lc3NhZ2VzIHRvIHRoZSBjaGFubmVsCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29tbWFuZCBUaGUgY29udHJvbCBjb21tYW5kIHRvIHNlbmQKLSAgICAgKiBAdGhyb3dzIENsdXN0ZXJpbmdGYXVsdCBJZiBpbml0aWFsaXphdGlvbiBjb2RlIGZhaWxlZCBvbiB0aGlzIG5vZGUKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVN5c3RlbShDb250cm9sQ29tbWFuZCBjb21tYW5kKSB0aHJvd3MgQ2x1c3RlcmluZ0ZhdWx0IHsKLSAgICAgICAgLy8gSWYgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIG1lbWJlciBpbiB0aGUgY2x1c3RlciwKLSAgICAgICAgLy8gIGdldCB0aGUgY3VycmVudCBpbml0aWFsaXphdGlvbiBpbmZvIGZyb20gYSBtZW1iZXIKLSAgICAgICAgaW50IG51bWJlck9mVHJpZXMgPSAwOyAvLyBEb24ndCBrZWVwIG9uIHRyeWluZyBpbmRlZmluaXRlbHkKLQotICAgICAgICAvLyBLZWVwIHRyYWNrIG9mIG1lbWJlcnMgdG8gd2hvbSB3ZSBhbHJlYWR5IHNlbnQgYW4gaW5pdGlhbGl6YXRpb24gY29tbWFuZAotICAgICAgICAvLyBEbyBub3Qgc2VuZCBhbm90aGVyIHJlcXVlc3QgdG8gdGhlc2UgbWVtYmVycwotICAgICAgICBMaXN0PFN0cmluZz4gc2VudE1lbWJlcnNMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIHNlbnRNZW1iZXJzTGlzdC5hZGQoVHJpYmVzVXRpbC5nZXRMb2NhbEhvc3QoY2hhbm5lbCkpOwotICAgICAgICBNZW1iZXJbXSBtZW1iZXJzID0gcHJpbWFyeU1lbWJlcnNoaXBNYW5hZ2VyLmdldE1lbWJlcnMoKTsKLSAgICAgICAgaWYgKG1lbWJlcnMubGVuZ3RoID09IDApIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHdoaWxlIChtZW1iZXJzLmxlbmd0aCA+IDAgJiYgbnVtYmVyT2ZUcmllcyA8IDUpIHsKLSAgICAgICAgICAgIE1lbWJlciBtZW1iZXIgPSAobnVtYmVyT2ZUcmllcyA9PSAwKSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWFyeU1lbWJlcnNoaXBNYW5hZ2VyLmdldExvbmdlc3RMaXZpbmdNZW1iZXIoKSA6IC8vIEZpcnN0IHRyeSB0byBnZXQgZnJvbSB0aGUgbG9uZ2VzdCBtZW1iZXIgYWxpdmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmltYXJ5TWVtYmVyc2hpcE1hbmFnZXIuZ2V0UmFuZG9tTWVtYmVyKCk7IC8vIEVsc2UgZ2V0IGZyb20gYSByYW5kb20gbWVtYmVyCi0gICAgICAgICAgICBTdHJpbmcgbWVtYmVySG9zdCA9IFRyaWJlc1V0aWwuZ2V0TmFtZShtZW1iZXIpOwotICAgICAgICAgICAgbG9nLmluZm8oIlRyeWluZyB0byBzZW5kIGludGlhbGl6YXRpb24gcmVxdWVzdCB0byAiICsgbWVtYmVySG9zdCk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGlmICghc2VudE1lbWJlcnNMaXN0LmNvbnRhaW5zKG1lbWJlckhvc3QpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFJlc3BvbnNlW10gcmVzcG9uc2VzOwotLy8gICAgICAgICAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VzID0gcnBjSW5pdENoYW5uZWwuc2VuZChuZXcgTWVtYmVyW117bWVtYmVyfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJwY0NoYW5uZWwuRklSU1RfUkVQTFksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbm5lbC5TRU5EX09QVElPTlNfQVNZTkNIUk9OT1VTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMDAwKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlcy5sZW5ndGggPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoNTAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGlnbm9yZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBJZiB3ZSBkbyBub3QgZ2V0IGEgcmVzcG9uc2Ugd2l0aGluIHNvbWUgdGltZSwgdHJ5IHRvIHJlY292ZXIgZnJvbSB0aGlzIGZhdWx0Ci0vLyAgICAgICAgICAgICAgICAgICAgfQotLy8gICAgICAgICAgICAgICAgICAgIHdoaWxlIChyZXNwb25zZXMubGVuZ3RoID09IDAgfHwgcmVzcG9uc2VzWzBdID09IG51bGwgfHwgcmVzcG9uc2VzWzBdLmdldE1lc3NhZ2UoKSA9PSBudWxsKTsgICAgLy8gVE9ETzogIyMjIyBXZSB3aWxsIG5lZWQgdG8gY2hlY2sgdGhpcwotICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2VzLmxlbmd0aCAhPSAwICYmIHJlc3BvbnNlc1swXSAhPSBudWxsICYmIHJlc3BvbnNlc1swXS5nZXRNZXNzYWdlKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgKChDb250cm9sQ29tbWFuZCkgcmVzcG9uc2VzWzBdLmdldE1lc3NhZ2UoKSkuZXhlY3V0ZShjb25maWd1cmF0aW9uQ29udGV4dCk7IC8vIERvIHRoZSBpbml0aWFsaXphdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiQ2Fubm90IGdldCBpbml0aWFsaXphdGlvbiBpbmZvcm1hdGlvbiBmcm9tICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1iZXJIb3N0ICsgIi4gV2lsbCByZXRyeSBpbiAyIHNlY3MuIiwgZSk7Ci0gICAgICAgICAgICAgICAgc2VudE1lbWJlcnNMaXN0LmFkZChtZW1iZXJIb3N0KTsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMjAwMCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWdub3JlZCkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkludGVycnVwdGVkIiwgaWdub3JlZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgbnVtYmVyT2ZUcmllcysrOwotICAgICAgICAgICAgbWVtYmVycyA9IHByaW1hcnlNZW1iZXJzaGlwTWFuYWdlci5nZXRNZW1iZXJzKCk7Ci0gICAgICAgICAgICBpZiAobnVtYmVyT2ZUcmllcyA+PSBtZW1iZXJzLmxlbmd0aCkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q29uZmlndXJhdGlvbk1hbmFnZXIoQ29uZmlndXJhdGlvbk1hbmFnZXIgY29uZmlndXJhdGlvbk1hbmFnZXIpIHsKLSAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uTWFuYWdlciA9IChEZWZhdWx0Q29uZmlndXJhdGlvbk1hbmFnZXIpIGNvbmZpZ3VyYXRpb25NYW5hZ2VyOwotICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb25NYW5hZ2VyLnNldFNlbmRlcihjaGFubmVsU2VuZGVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb250ZXh0TWFuYWdlcihDb250ZXh0TWFuYWdlciBjb250ZXh0TWFuYWdlcikgewotICAgICAgICB0aGlzLmNvbnRleHRNYW5hZ2VyID0gKERlZmF1bHRDb250ZXh0TWFuYWdlcikgY29udGV4dE1hbmFnZXI7Ci0gICAgICAgIHRoaXMuY29udGV4dE1hbmFnZXIuc2V0U2VuZGVyKGNoYW5uZWxTZW5kZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFBhcmFtZXRlcihQYXJhbWV0ZXIgcGFyYW0pIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBwYXJhbWV0ZXJzLnB1dChwYXJhbS5nZXROYW1lKCksIHBhcmFtKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkZXNlcmlhbGl6ZVBhcmFtZXRlcnMoT01FbGVtZW50IHBhcmFtZXRlckVsZW1lbnQpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUGFyYW1ldGVyIGdldFBhcmFtZXRlcihTdHJpbmcgbmFtZSkgewotICAgICAgICByZXR1cm4gcGFyYW1ldGVycy5nZXQobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIEFycmF5TGlzdCBnZXRQYXJhbWV0ZXJzKCkgewotICAgICAgICBBcnJheUxpc3Q8UGFyYW1ldGVyPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxQYXJhbWV0ZXI+KCk7Ci0gICAgICAgIGZvciAoU3RyaW5nIG1zZyA6IHBhcmFtZXRlcnMua2V5U2V0KCkpIHsKLSAgICAgICAgICAgIGxpc3QuYWRkKHBhcmFtZXRlcnMuZ2V0KG1zZykpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBsaXN0OwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzUGFyYW1ldGVyTG9ja2VkKFN0cmluZyBwYXJhbWV0ZXJOYW1lKSB7Ci0gICAgICAgIFBhcmFtZXRlciBwYXJhbWV0ZXIgPSBwYXJhbWV0ZXJzLmdldChwYXJhbWV0ZXJOYW1lKTsKLSAgICAgICAgcmV0dXJuIHBhcmFtZXRlciAhPSBudWxsICYmIHBhcmFtZXRlci5pc0xvY2tlZCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVBhcmFtZXRlcihQYXJhbWV0ZXIgcGFyYW0pIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBwYXJhbWV0ZXJzLnJlbW92ZShwYXJhbS5nZXROYW1lKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNodXRkb3duIHRoZSBjbHVzdGVyLiBUaGlzIG1lbWJlciB3aWxsIGxlYXZlIHRoZSBjbHVzdGVyIHdoZW4gdGhpcyBtZXRob2QgaXMgY2FsbGVkLgotICAgICAqCi0gICAgICogQHRocm93cyBDbHVzdGVyaW5nRmF1bHQgSWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIHNodXR0aW5nIGRvd24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzaHV0ZG93bigpIHRocm93cyBDbHVzdGVyaW5nRmF1bHQgewotICAgICAgICBsb2cuZGVidWcoIkVudGVyOiBUcmliZXNDbHVzdGVyTWFuYWdlcjo6c2h1dGRvd24iKTsKLSAgICAgICAgaWYgKGNoYW5uZWwgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBjaGFubmVsLnJlbW92ZUNoYW5uZWxMaXN0ZW5lcihycGNJbml0Q2hhbm5lbCk7Ci0gICAgICAgICAgICAgICAgY2hhbm5lbC5yZW1vdmVDaGFubmVsTGlzdGVuZXIoY2hhbm5lbExpc3RlbmVyKTsKLSAgICAgICAgICAgICAgICBjaGFubmVsLnN0b3AoQ2hhbm5lbC5ERUZBVUxUKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKENoYW5uZWxFeGNlcHRpb24gZSkgewotCi0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiRXhpdDogVHJpYmVzQ2x1c3Rlck1hbmFnZXI6OnNodXRkb3duIik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENsdXN0ZXJpbmdGYXVsdChlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBsb2cuZGVidWcoIkV4aXQ6IFRyaWJlc0NsdXN0ZXJNYW5hZ2VyOjpzaHV0ZG93biIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENvbmZpZ3VyYXRpb25Db250ZXh0KENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ3VyYXRpb25Db250ZXh0KSB7Ci0gICAgICAgIHRoaXMuY29uZmlndXJhdGlvbkNvbnRleHQgPSBjb25maWd1cmF0aW9uQ29udGV4dDsKLSAgICAgICAgaWYgKHJwY0luaXRSZXF1ZXN0SGFuZGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBycGNJbml0UmVxdWVzdEhhbmRsZXIuc2V0Q29uZmlndXJhdGlvbkNvbnRleHQoY29uZmlndXJhdGlvbkNvbnRleHQpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjaGFubmVsTGlzdGVuZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgY2hhbm5lbExpc3RlbmVyLnNldENvbmZpZ3VyYXRpb25Db250ZXh0KGNvbmZpZ3VyYXRpb25Db250ZXh0KTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY29uZmlndXJhdGlvbk1hbmFnZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgY29uZmlndXJhdGlvbk1hbmFnZXIuc2V0Q29uZmlndXJhdGlvbkNvbnRleHQoY29uZmlndXJhdGlvbkNvbnRleHQpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjb250ZXh0TWFuYWdlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjb250ZXh0TWFuYWdlci5zZXRDb25maWd1cmF0aW9uQ29udGV4dChjb25maWd1cmF0aW9uQ29udGV4dCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgdG8gY2hlY2sgd2hldGhlciBhbGwgbWVtYmVycyBpbiB0aGUgY2x1c3RlciBoYXZlIHRvIGJlIGtlcHQgaW4gc3luYyBhdCBhbGwgdGltZXMuCi0gICAgICogVHlwaWNhbGx5LCB0aGlzIHdpbGwgcmVxdWlyZSBlYWNoIG1lbWJlciBpbiB0aGUgY2x1c3RlciB0byBBQ0tub3dsZWRnZSByZWNlaXB0IG9mIGEKLSAgICAgKiBwYXJ0aWN1bGFyIG1lc3NhZ2UsIHdoaWNoIG1heSBoYXZlIGEgc2lnbmlmaWNhbnQgcGVyZm9ybWFuY2UgaGl0LgotICAgICAqCi0gICAgICogQHJldHVybiB0cnVlIC0gaWYgYWxsIG1lbWJlcnMgaW4gdGhlIGNsdXN0ZXIgc2hvdWxkIGJlIGtlcHQgaW4gc3luYyBhdCBhbGwgdGltZXMsIGZhbHNlCi0gICAgICogICAgICAgICBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBzeW5jaHJvbml6ZUFsbE1lbWJlcnMoKSB7Ci0gICAgICAgIFBhcmFtZXRlciBzeW5jQWxsUGFyYW0gPSBnZXRQYXJhbWV0ZXIoQ2x1c3RlcmluZ0NvbnN0YW50cy5QYXJhbWV0ZXJzLlNZTkNIUk9OSVpFX0FMTF9NRU1CRVJTKTsKLSAgICAgICAgcmV0dXJuIHN5bmNBbGxQYXJhbSA9PSBudWxsIHx8IEJvb2xlYW4ucGFyc2VCb29sZWFuKChTdHJpbmcpIHN5bmNBbGxQYXJhbS5nZXRWYWx1ZSgpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvdHJpYmVzL1RyaWJlc0NvbnN0YW50cy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL3RyaWJlcy9UcmliZXNDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI4MjZlOS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvdHJpYmVzL1RyaWJlc0NvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICogQ29weXJpZ2h0IDIwMDQsMjAwNSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7ICAgICAgICAgICAgIAotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgICAgICAgICAgIAotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAgICAgICAgIAotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgICAgICAgICAgIAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICAgIAotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAgICAgICAgIAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy50cmliZXM7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBob2xkcyB0aGUgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIHdoaWNoIGFyZSBzcGVjaWZpYyB0byBUcmliZXMKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFRyaWJlc0NvbnN0YW50cyB7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgSUQgb2YgdGhlIFJQQyBpbml0aWFsaXphdGlvbiBtZXNzYWdlIGNoYW5uZWwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSUENfSU5JVF9DSEFOTkVMID0gInJwYy5pbml0LmNoYW5uZWwiOwotCi0gICAgLyoqCi0gICAgICogVGhlIElEIG9mIHRoZSBSUEMgbWVtYmVyc2hpcCBtZXNzYWdlIGNoYW5uZWwuIFRoaXMgY2hhbm5lbCBpcyBvbmx5IHVzZWQgd2hlbiBXS0EKLSAgICAgKiBtZW1iZXJzaGlwIGRpc2NvdmVyeSBtZWNoYW5pc20gaXMgdXNlZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJQQ19NRU1CRVJTSElQX0NIQU5ORUwgPSAicnBjLm1lbWJlcnNoaXAuY2hhbm5lbCI7Ci0KLSAgICAvLyBNZXNzYWdlIHNlbmRpbmcgYW5kIHJlY2VpdmluZyBvcHRpb25zCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX09SREVSX09QVElPTiA9IDUxMjsKLQotICAgIC8vIE9wdGlvbiB0aGF0IGluZGljYXRlcyB0aGF0IGEgbWVzc2FnZSBpcyByZWxhdGVkIHRvIG1lbWJlcnNoaXAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNRU1CRVJTSElQX01TR19PUFRJT04gPSAxMDI0OwotCi0gICAgLy8gT3B0aW9uIHRoYXQgaW5kaWNhdGVzIHRoYXQgYSBtZXNzYWdlIHNob3VsZCBiZSBwcm9jZXNzZWQgYXQtbW9zdCBvbmNlCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVRfTU9TVF9PTkNFX09QVElPTiA9IDIwNDg7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGVbXSBSUENfQ0hBTk5FTF9JRCA9ICJheGlzMi5ycGMuY2hhbm5lbCIuZ2V0Qnl0ZXMoKTsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPQ0FMX01FTUJFUl9IT1NUID0gImxvY2FsTWVtYmVySG9zdCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9DQUxfTUVNQkVSX1BPUlQgPSAibG9jYWxNZW1iZXJQb3J0IjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1DQVNUX0FERFJFU1MgPSAibWNhc3RBZGRyZXNzIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQ0FTVF9CSU5EX0FERFJFU1MgPSAibXVsdGljYXN0QmluZEFkZHJlc3MiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1DQVNUX1BPUlQgPSAibWNhc3RQb3J0IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQ0FTVF9GUkVRVUVOQ1kgPSAibWNhc3RGcmVxdWVuY3kiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FTUJFUl9EUk9QX1RJTUUgPSAibWVtYmVyRHJvcFRpbWUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1DQVNUX0NMVVNURVJfRE9NQUlOID0gIm1jYXN0Q2x1c3RlckRvbWFpbiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVENQX0xJU1RFTl9IT1NUID0gInRjcExpc3Rlbkhvc3QiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJJTkRfQUREUkVTUyA9ICJiaW5kQWRkcmVzcyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVENQX0xJU1RFTl9QT1JUID0gInRjcExpc3RlblBvcnQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BWF9SRVRSSUVTID0gIm1heFJldHJpZXMiOwotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL3RyaWJlcy9UcmliZXNNZW1iZXJzaGlwTGlzdGVuZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2NsdXN0ZXJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy90cmliZXMvVHJpYmVzTWVtYmVyc2hpcExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwNjA1M2UuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL3RyaWJlcy9UcmliZXNNZW1iZXJzaGlwTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLnRyaWJlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLk1lbWJlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5NZW1iZXJzaGlwTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLS8qKgotICogTWVtYmVyc2hpcCBjaGFuZ2VzIGFyZSBub3RpZmllZCB1c2luZyB0aGlzIGNsYXNzCi0gKi8KLXB1YmxpYyBjbGFzcyBUcmliZXNNZW1iZXJzaGlwTGlzdGVuZXIgaW1wbGVtZW50cyBNZW1iZXJzaGlwTGlzdGVuZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFRyaWJlc01lbWJlcnNoaXBMaXN0ZW5lci5jbGFzcyk7Ci0gICAgcHJpdmF0ZSBNZW1iZXJzaGlwTWFuYWdlciBtZW1iZXJzaGlwTWFuYWdlcjsKLQotICAgIHB1YmxpYyBUcmliZXNNZW1iZXJzaGlwTGlzdGVuZXIoTWVtYmVyc2hpcE1hbmFnZXIgbWVtYmVyc2hpcE1hbmFnZXIpIHsKLSAgICAgICAgdGhpcy5tZW1iZXJzaGlwTWFuYWdlciA9IG1lbWJlcnNoaXBNYW5hZ2VyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG1lbWJlckFkZGVkKE1lbWJlciBtZW1iZXIpIHsKLSAgICAgICAgaWYgKG1lbWJlcnNoaXBNYW5hZ2VyLm1lbWJlckFkZGVkKG1lbWJlcikpIHsKLSAgICAgICAgICAgIGxvZy5pbmZvKCJOZXcgbWVtYmVyICIgKyBUcmliZXNVdGlsLmdldE5hbWUobWVtYmVyKSArICIgam9pbmVkIGNsdXN0ZXIuIik7Ci0gICAgICAgICAgICAvKmlmIChUcmliZXNVdGlsLnRvQXhpczJNZW1iZXIobWVtYmVyKS5pc0FjdGl2ZSgpKSB7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgfSovCi0gICAgICAgIH0KLSAgICAgICAgLy8gICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiKysrKysrIElTIENPT1JEPSIrVHJpYmVzQ2x1c3Rlck1hbmFnZXIubmJjLmlzQ29vcmRpbmF0b3IoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbWVtYmVyRGlzYXBwZWFyZWQoTWVtYmVyIG1lbWJlcikgewotICAgICAgICBsb2cuaW5mbygiTWVtYmVyICIgKyBUcmliZXNVdGlsLmdldE5hbWUobWVtYmVyKSArICIgbGVmdCBjbHVzdGVyIik7Ci0gICAgICAgIG1lbWJlcnNoaXBNYW5hZ2VyLm1lbWJlckRpc2FwcGVhcmVkKG1lbWJlcik7Ci0KLS8vICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIisrKysrKyBJUyBDT09SRD0iK1RyaWJlc0NsdXN0ZXJNYW5hZ2VyLm5iYy5pc0Nvb3JkaW5hdG9yKCkpOwotICAgICAgICAKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvdHJpYmVzL1RyaWJlc1V0aWwuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2NsdXN0ZXJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy90cmliZXMvVHJpYmVzVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWRmZGRiLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2NsdXN0ZXJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy90cmliZXMvVHJpYmVzVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLnRyaWJlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLkNoYW5uZWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuTWVtYmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLnV0aWwuQXJyYXlzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5DbHVzdGVyaW5nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5VdGlsczsKLQotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5Tb2NrZXRFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBUcmliZXNVdGlsIHsKLQotICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhUcmliZXNVdGlsLmNsYXNzKTsKLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwcmludE1lbWJlcnMoTWVtYmVyc2hpcE1hbmFnZXIgbWVtYmVyc2hpcE1hbmFnZXIpIHsKLSAgICAgICAgTWVtYmVyW10gbWVtYmVycyA9IG1lbWJlcnNoaXBNYW5hZ2VyLmdldE1lbWJlcnMoKTsKLSAgICAgICAgaWYgKG1lbWJlcnMgIT0gbnVsbCkgewotICAgICAgICAgICAgaW50IGxlbmd0aCA9IG1lbWJlcnMubGVuZ3RoOwotICAgICAgICAgICAgaWYgKGxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgICAgICBsb2cuaW5mbygiTWVtYmVycyBvZiBjdXJyZW50IGNsdXN0ZXIiKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJNZW1iZXIiICsgKGkgKyAxKSArICIgIiArIGdldE5hbWUobWVtYmVyc1tpXSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbG9nLmluZm8oIk5vIG1lbWJlcnMgaW4gY3VycmVudCBjbHVzdGVyIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXROYW1lKE1lbWJlciBtZW1iZXIpIHsKLSAgICAgICAgcmV0dXJuIGdldEhvc3QobWVtYmVyKSArICI6IiArIG1lbWJlci5nZXRQb3J0KCkgKyAiKCIgKyBuZXcgU3RyaW5nKG1lbWJlci5nZXREb21haW4oKSkgKyAiKSI7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0SG9zdChNZW1iZXIgbWVtYmVyKSB7Ci0gICAgICAgIGJ5dGVbXSBob3N0Qnl0ZXMgPSBtZW1iZXIuZ2V0SG9zdCgpOwotICAgICAgICBTdHJpbmdCdWZmZXIgaG9zdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgaWYgKGhvc3RCeXRlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGhvc3RCeXRlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGludCBob3N0Qnl0ZSA9IGhvc3RCeXRlc1tpXSA+PSAwID8gKGludCkgaG9zdEJ5dGVzW2ldIDogKGludCkgaG9zdEJ5dGVzW2ldICsgMjU2OwotICAgICAgICAgICAgICAgIGhvc3QuYXBwZW5kKGhvc3RCeXRlKTsKLSAgICAgICAgICAgICAgICBpZiAoaSA8IGhvc3RCeXRlcy5sZW5ndGggLSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIGhvc3QuYXBwZW5kKCIuIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBob3N0LnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TG9jYWxIb3N0KENoYW5uZWwgY2hhbm5lbCkgewotICAgICAgICByZXR1cm4gZ2V0TmFtZShjaGFubmVsLmdldExvY2FsTWVtYmVyKHRydWUpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRMb2NhbEhvc3QoUGFyYW1ldGVyIHRjcExpc3Rlbkhvc3QpewotICAgICAgICBTdHJpbmcgaG9zdCA9IG51bGw7Ci0gICAgICAgIGlmICh0Y3BMaXN0ZW5Ib3N0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGhvc3QgPSAoKFN0cmluZykgdGNwTGlzdGVuSG9zdC5nZXRWYWx1ZSgpKS50cmltKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGhvc3QgPSBVdGlscy5nZXRJcEFkZHJlc3MoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFNvY2tldEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJDb3VsZCBub3QgZ2V0IGxvY2FsIElQIGFkZHJlc3MiOwotICAgICAgICAgICAgICAgIGxvZy5lcnJvcihtc2csIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChTeXN0ZW0uZ2V0UHJvcGVydHkoQ2x1c3RlcmluZ0NvbnN0YW50cy5MT0NBTF9JUF9BRERSRVNTKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBob3N0ID0gU3lzdGVtLmdldFByb3BlcnR5KENsdXN0ZXJpbmdDb25zdGFudHMuTE9DQUxfSVBfQUREUkVTUyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGhvc3Q7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBieXRlW10gZ2V0UnBjTWVtYmVyc2hpcENoYW5uZWxJZChieXRlW10gZG9tYWluKSB7Ci0gICAgICAgIHJldHVybiAobmV3IFN0cmluZyhkb21haW4pICsgIjoiICsgVHJpYmVzQ29uc3RhbnRzLlJQQ19NRU1CRVJTSElQX0NIQU5ORUwpLmdldEJ5dGVzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBieXRlW10gZ2V0UnBjSW5pdENoYW5uZWxJZChieXRlW10gZG9tYWluKSB7Ci0gICAgICAgIHJldHVybiAobmV3IFN0cmluZyhkb21haW4pICsgIjoiICsgVHJpYmVzQ29uc3RhbnRzLlJQQ19JTklUX0NIQU5ORUwpLmdldEJ5dGVzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzSW5Eb21haW4oTWVtYmVyIG1lbWJlciwgYnl0ZVtdIGRvbWFpbikgewotICAgICAgICByZXR1cm4gQXJyYXlzLmVxdWFscyhkb21haW4sIG1lbWJlci5nZXREb21haW4oKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGFyZUluU2FtZURvbWFpbihNZW1iZXIgbWVtYmVyMSwgTWVtYmVyIG1lbWJlcjIpIHsKLSAgICAgICAgcmV0dXJuIEFycmF5cy5lcXVhbHMobWVtYmVyMS5nZXREb21haW4oKSwgbWVtYmVyMi5nZXREb21haW4oKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuTWVtYmVyIHRvQXhpczJNZW1iZXIoTWVtYmVyIG1lbWJlcikgewotICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuTWVtYmVyIGF4aXMyTWVtYmVyID0KLSAgICAgICAgICAgICAgICBuZXcgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLk1lbWJlcihUcmliZXNVdGlsLmdldEhvc3QobWVtYmVyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1iZXIuZ2V0UG9ydCgpKTsKLSAgICAgICAgUHJvcGVydGllcyBwcm9wcyA9IGdldFByb3BlcnRpZXMobWVtYmVyLmdldFBheWxvYWQoKSk7Ci0KLSAgICAgICAgU3RyaW5nIGh0dHBQb3J0ID0gcHJvcHMuZ2V0UHJvcGVydHkoImh0dHBQb3J0Iik7Ci0gICAgICAgIGlmIChodHRwUG9ydCAhPSBudWxsICYmIGh0dHBQb3J0LnRyaW0oKS5sZW5ndGgoKSAhPSAwKSB7Ci0gICAgICAgICAgICBheGlzMk1lbWJlci5zZXRIdHRwUG9ydChJbnRlZ2VyLnBhcnNlSW50KGh0dHBQb3J0KSk7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgaHR0cHNQb3J0ID0gcHJvcHMuZ2V0UHJvcGVydHkoImh0dHBzUG9ydCIpOwotICAgICAgICBpZiAoaHR0cHNQb3J0ICE9IG51bGwgJiYgaHR0cHNQb3J0LnRyaW0oKS5sZW5ndGgoKSAhPSAwKSB7Ci0gICAgICAgICAgICBheGlzMk1lbWJlci5zZXRIdHRwc1BvcnQoSW50ZWdlci5wYXJzZUludChodHRwc1BvcnQpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBpc0FjdGl2ZSA9IHByb3BzLmdldFByb3BlcnR5KENsdXN0ZXJpbmdDb25zdGFudHMuUGFyYW1ldGVycy5JU19BQ1RJVkUpOwotICAgICAgICBpZiAoaXNBY3RpdmUgIT0gbnVsbCAmJiBpc0FjdGl2ZS50cmltKCkubGVuZ3RoKCkgIT0gMCkgewotICAgICAgICAgICAgYXhpczJNZW1iZXIuc2V0QWN0aXZlKEJvb2xlYW4udmFsdWVPZihpc0FjdGl2ZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgYXhpczJNZW1iZXIuc2V0RG9tYWluKG5ldyBTdHJpbmcobWVtYmVyLmdldERvbWFpbigpKSk7Ci0gICAgICAgIGF4aXMyTWVtYmVyLnNldFByb3BlcnRpZXMocHJvcHMpOwotICAgICAgICByZXR1cm4gYXhpczJNZW1iZXI7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgUHJvcGVydGllcyBnZXRQcm9wZXJ0aWVzKGJ5dGVbXSBwYXlsb2FkKSB7Ci0gICAgICAgIFByb3BlcnRpZXMgcHJvcHMgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmluID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHBheWxvYWQpOwotICAgICAgICAgICAgcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOwotICAgICAgICAgICAgcHJvcHMubG9hZChiaW4pOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpZ25vcmVkKSB7Ci0gICAgICAgICAgICAvLyBUaGlzIGVycm9yIHdpbGwgbmV2ZXIgb2NjdXIKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcHJvcHM7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2NsdXN0ZXJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy90cmliZXMvV2thQmFzZWRNZW1iZXJzaGlwU2NoZW1lLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvdHJpYmVzL1drYUJhc2VkTWVtYmVyc2hpcFNjaGVtZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjQ0NWY4Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2NsdXN0ZXJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy90cmliZXMvV2thQmFzZWRNZW1iZXJzaGlwU2NoZW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTIgKzAsMCBAQAotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICogQ29weXJpZ2h0IDIwMDQsMjAwNSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7ICAgICAgICAgICAgIAotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgICAgICAgICAgIAotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAgICAgICAgIAotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgICAgICAgICAgIAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICAgIAotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAgICAgICAgIAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy50cmliZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuQ2x1c3RlcmluZ0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5NZW1iZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLk1lbWJlcnNoaXBTY2hlbWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLk1lbWJlcnNoaXBMaXN0ZW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuY29udHJvbC53a2EuSm9pbkdyb3VwQ29tbWFuZDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuY29udHJvbC53a2EuTWVtYmVyTGlzdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLmNvbnRyb2wud2thLlJwY01lbWJlcnNoaXBSZXF1ZXN0SGFuZGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuQ2hhbm5lbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5NYW5hZ2VkQ2hhbm5lbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5ncm91cC5SZXNwb25zZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5ncm91cC5ScGNDaGFubmVsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLmdyb3VwLmludGVyY2VwdG9ycy5PcmRlckludGVyY2VwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLmdyb3VwLmludGVyY2VwdG9ycy5TdGF0aWNNZW1iZXJzaGlwSW50ZXJjZXB0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuZ3JvdXAuaW50ZXJjZXB0b3JzLlRjcEZhaWx1cmVEZXRlY3RvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5ncm91cC5pbnRlcmNlcHRvcnMuVGNwUGluZ0ludGVyY2VwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLm1lbWJlcnNoaXAuU3RhdGljTWVtYmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLnRyYW5zcG9ydC5SZWNlaXZlckJhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOwotaW1wb3J0IGphdmEubmV0LkluZXRTb2NrZXRBZGRyZXNzOwotaW1wb3J0IGphdmEubmV0LlNlcnZlclNvY2tldDsKLWltcG9ydCBqYXZhLm5ldC5Tb2NrZXQ7Ci1pbXBvcnQgamF2YS5uZXQuU29ja2V0QWRkcmVzczsKLWltcG9ydCBqYXZhLm5ldC5Tb2NrZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBXS0Eod2VsbC1rbm93biBhZGRyZXNzKSBiYXNlZCBtZW1iZXJzaGlwIHNjaGVtZS4gSW4gdGhpcyBzY2hlbWUsCi0gKiBtZW1iZXJzaGlwIGlzIGRpc2NvdmVyZWQgdXNpbmcgYSBmZXcgd2VsbC1rbm93biBtZW1iZXJzICh3aG8gcnVuIGF0IHdlbGwta25vd24gSVAgYWRkcmVzc2VzKQotICovCi1wdWJsaWMgY2xhc3MgV2thQmFzZWRNZW1iZXJzaGlwU2NoZW1lIGltcGxlbWVudHMgTWVtYmVyc2hpcFNjaGVtZSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coV2thQmFzZWRNZW1iZXJzaGlwU2NoZW1lLmNsYXNzKTsKLQotICAgIC8qKgotICAgICAqIFRoZSBUcmliZXMgY2hhbm5lbAotICAgICAqLwotICAgIHByaXZhdGUgTWFuYWdlZENoYW5uZWwgY2hhbm5lbDsKLSAgICBwcml2YXRlIE1lbWJlcnNoaXBNYW5hZ2VyIHByaW1hcnlNZW1iZXJzaGlwTWFuYWdlcjsKLSAgICBwcml2YXRlIExpc3Q8TWVtYmVyc2hpcE1hbmFnZXI+IGFwcGxpY2F0aW9uRG9tYWluTWVtYmVyc2hpcE1hbmFnZXJzOwotICAgIHByaXZhdGUgU3RhdGljTWVtYmVyc2hpcEludGVyY2VwdG9yIHN0YXRpY01lbWJlcnNoaXBJbnRlcmNlcHRvcjsKLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIFBhcmFtZXRlcj4gcGFyYW1ldGVyczsKLQotICAgIC8qKgotICAgICAqIFRoZSBsb2FkQmFsYW5jZXJEb21haW4gdG8gd2hpY2ggdGhlIG1lbWJlcnMgYmVsb25nIHRvCi0gICAgICovCi0gICAgcHJpdmF0ZSBieXRlW10gbG9jYWxEb21haW47Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgc3RhdGljKHdlbGwta25vd24pIG1lbWJlcnMKLSAgICAgKi8KLSAgICBwcml2YXRlIExpc3Q8TWVtYmVyPiBtZW1iZXJzOwotCi0gICAgLyoqCi0gICAgICogVGhlIG1vZGUgaW4gd2hpY2ggdGhpcyBtZW1iZXIgb3BlcmF0ZXMgc3VjaCBhcyAibG9hZEJhbGFuY2UiIG9yICJhcHBsaWNhdGlvbiIKLSAgICAgKi8KLSAgICBwcml2YXRlIE9wZXJhdGlvbk1vZGUgbW9kZTsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBhdG1vc3RPbmNlTWVzc2FnZVNlbWFudGljczsKLSAgICBwcml2YXRlIGJvb2xlYW4gcHJlc2VydmVyTXNnT3JkZXI7Ci0KLSAgICBwdWJsaWMgV2thQmFzZWRNZW1iZXJzaGlwU2NoZW1lKE1hbmFnZWRDaGFubmVsIGNoYW5uZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYXRpb25Nb2RlIG1vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PE1lbWJlcnNoaXBNYW5hZ2VyPiBhcHBsaWNhdGlvbkRvbWFpbk1lbWJlcnNoaXBNYW5hZ2VycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lbWJlcnNoaXBNYW5hZ2VyIHByaW1hcnlNZW1iZXJzaGlwTWFuYWdlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIFBhcmFtZXRlcj4gcGFyYW1ldGVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBkb21haW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PE1lbWJlcj4gbWVtYmVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gYXRtb3N0T25jZU1lc3NhZ2VTZW1hbnRpY3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHByZXNlcnZlck1zZ09yZGVyKSB7Ci0gICAgICAgIHRoaXMuY2hhbm5lbCA9IGNoYW5uZWw7Ci0gICAgICAgIHRoaXMubW9kZSA9IG1vZGU7Ci0gICAgICAgIHRoaXMuYXBwbGljYXRpb25Eb21haW5NZW1iZXJzaGlwTWFuYWdlcnMgPSBhcHBsaWNhdGlvbkRvbWFpbk1lbWJlcnNoaXBNYW5hZ2VyczsKLSAgICAgICAgdGhpcy5wcmltYXJ5TWVtYmVyc2hpcE1hbmFnZXIgPSBwcmltYXJ5TWVtYmVyc2hpcE1hbmFnZXI7Ci0gICAgICAgIHRoaXMucGFyYW1ldGVycyA9IHBhcmFtZXRlcnM7Ci0gICAgICAgIHRoaXMubG9jYWxEb21haW4gPSBkb21haW47Ci0gICAgICAgIHRoaXMubWVtYmVycyA9IG1lbWJlcnM7Ci0gICAgICAgIHRoaXMuYXRtb3N0T25jZU1lc3NhZ2VTZW1hbnRpY3MgPSBhdG1vc3RPbmNlTWVzc2FnZVNlbWFudGljczsKLSAgICAgICAgdGhpcy5wcmVzZXJ2ZXJNc2dPcmRlciA9IHByZXNlcnZlck1zZ09yZGVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbmZpZ3VyZSB0aGUgbWVtYmVyc2hpcCByZWxhdGVkIHRvIHRoZSBXS0EgYmFzZWQgc2NoZW1lCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5DbHVzdGVyaW5nRmF1bHQKLSAgICAgKiAgICAgICAgICBJZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgY29uZmlndXJpbmcgdGhpcyBzY2hlbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbml0KCkgdGhyb3dzIENsdXN0ZXJpbmdGYXVsdCB7Ci0gICAgICAgIGFkZEludGVyY2VwdG9ycygpOwotICAgICAgICBjb25maWd1cmVTdGF0aWNNZW1iZXJzaGlwKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNvbmZpZ3VyZVN0YXRpY01lbWJlcnNoaXAoKSB0aHJvd3MgQ2x1c3RlcmluZ0ZhdWx0IHsKLSAgICAgICAgY2hhbm5lbC5zZXRNZW1iZXJzaGlwU2VydmljZShuZXcgV2thTWVtYmVyc2hpcFNlcnZpY2UocHJpbWFyeU1lbWJlcnNoaXBNYW5hZ2VyKSk7Ci0gICAgICAgIFN0YXRpY01lbWJlciBsb2NhbE1lbWJlciA9IG5ldyBTdGF0aWNNZW1iZXIoKTsKLSAgICAgICAgcHJpbWFyeU1lbWJlcnNoaXBNYW5hZ2VyLnNldExvY2FsTWVtYmVyKGxvY2FsTWVtYmVyKTsKLSAgICAgICAgUmVjZWl2ZXJCYXNlIHJlY2VpdmVyID0gKFJlY2VpdmVyQmFzZSkgY2hhbm5lbC5nZXRDaGFubmVsUmVjZWl2ZXIoKTsKLQotICAgICAgICAvLyAtLS0tLS0tLS0tLS0gU1RBUlQ6IENvbmZpZ3VyZSBhbmQgYWRkIHRoZSBsb2NhbCBtZW1iZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIFBhcmFtZXRlciBsb2NhbEhvc3QgPSBnZXRQYXJhbWV0ZXIoVHJpYmVzQ29uc3RhbnRzLkxPQ0FMX01FTUJFUl9IT1NUKTsKLSAgICAgICAgU3RyaW5nIGhvc3Q7Ci0gICAgICAgIGlmIChsb2NhbEhvc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgaG9zdCA9ICgoU3RyaW5nKSBsb2NhbEhvc3QuZ2V0VmFsdWUoKSkudHJpbSgpOwotICAgICAgICB9IGVsc2UgeyAvLyBJbiBjYXNlcyB3aGVyZSB0aGUgbG9jYWxob3N0IG5lZWRzIHRvIGJlIGF1dG9tYXRpY2FsbHkgZmlndXJlZCBvdXQKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgaG9zdCA9IFV0aWxzLmdldElwQWRkcmVzcygpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNvY2tldEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiQ291bGQgbm90IGdldCBsb2NhbCBJUCBhZGRyZXNzIjsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKG1zZywgZSk7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbHVzdGVyaW5nRmF1bHQobXNnLCBlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiQ291bGQgbm90IGdldCB0aGUgbG9jYWxob3N0IG5hbWUiOwotICAgICAgICAgICAgICAgIGxvZy5lcnJvcihtc2csIGUpOwotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbHVzdGVyaW5nRmF1bHQobXNnLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZWNlaXZlci5zZXRBZGRyZXNzKGhvc3QpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbG9jYWxNZW1iZXIuc2V0SG9zdG5hbWUoaG9zdCk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiQ291bGQgbm90IHNldCB0aGUgbG9jYWwgbWVtYmVyJ3MgbmFtZSI7Ci0gICAgICAgICAgICBsb2cuZXJyb3IobXNnLCBlKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbHVzdGVyaW5nRmF1bHQobXNnLCBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIFBhcmFtZXRlciBsb2NhbFBvcnQgPSBnZXRQYXJhbWV0ZXIoVHJpYmVzQ29uc3RhbnRzLkxPQ0FMX01FTUJFUl9QT1JUKTsKLSAgICAgICAgaW50IHBvcnQ7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAobG9jYWxQb3J0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBwb3J0ID0gSW50ZWdlci5wYXJzZUludCgoKFN0cmluZykgbG9jYWxQb3J0LmdldFZhbHVlKCkpLnRyaW0oKSk7Ci0gICAgICAgICAgICAgICAgcG9ydCA9IGdldExvY2FsUG9ydChuZXcgU2VydmVyU29ja2V0KCksIGxvY2FsTWVtYmVyLmdldEhvc3RuYW1lKCksIHBvcnQsIDQwMDAsIDEwMCk7Ci0gICAgICAgICAgICB9IGVsc2UgeyAvLyBJbiBjYXNlcyB3aGVyZSB0aGUgbG9jYWxwb3J0IG5lZWRzIHRvIGJlIGF1dG9tYXRpY2FsbHkgZmlndXJlZCBvdXQKLSAgICAgICAgICAgICAgICBwb3J0ID0gZ2V0TG9jYWxQb3J0KG5ldyBTZXJ2ZXJTb2NrZXQoKSwgbG9jYWxNZW1iZXIuZ2V0SG9zdG5hbWUoKSwgLTEsIDQwMDAsIDEwMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIFN0cmluZyBtc2cgPQotICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IGFsbG9jYXRlIHRoZSBzcGVjaWZpZWQgcG9ydCBvciBhIHBvcnQgaW4gdGhlIHJhbmdlIDQwMDAtNDEwMCAiICsKLSAgICAgICAgICAgICAgICAgICAgImZvciBsb2NhbCBob3N0ICIgKyBsb2NhbE1lbWJlci5nZXRIb3N0bmFtZSgpICsKLSAgICAgICAgICAgICAgICAgICAgIi4gQ2hlY2sgd2hldGhlciB0aGUgSVAgYWRkcmVzcyBzcGVjaWZpZWQgb3IgaW5mZXJyZWQgZm9yIHRoZSBsb2NhbCAiICsKLSAgICAgICAgICAgICAgICAgICAgIm1lbWJlciBpcyBjb3JyZWN0LiI7Ci0gICAgICAgICAgICBsb2cuZXJyb3IobXNnLCBlKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbHVzdGVyaW5nRmF1bHQobXNnLCBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGJ5dGVbXSBwYXlsb2FkID0gInBpbmciLmdldEJ5dGVzKCk7Ci0gICAgICAgIGxvY2FsTWVtYmVyLnNldFBheWxvYWQocGF5bG9hZCk7Ci0gICAgICAgIHJlY2VpdmVyLnNldFBvcnQocG9ydCk7Ci0gICAgICAgIGxvY2FsTWVtYmVyLnNldFBvcnQocG9ydCk7Ci0gICAgICAgIGxvY2FsTWVtYmVyLnNldERvbWFpbihsb2NhbERvbWFpbik7Ci0gICAgICAgIHN0YXRpY01lbWJlcnNoaXBJbnRlcmNlcHRvci5zZXRMb2NhbE1lbWJlcihsb2NhbE1lbWJlcik7Ci0KLSAgICAgICAgLy8gLS0tLS0tLS0tLS0tIEVORDogQ29uZmlndXJlIGFuZCBhZGQgdGhlIGxvY2FsIG1lbWJlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICAvLyAtLS0tLS0tLS0tLS0gU1RBUlQ6IEFkZCBvdGhlciBtZW1iZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICBmb3IgKE1lbWJlciBtZW1iZXIgOiBtZW1iZXJzKSB7Ci0gICAgICAgICAgICBTdGF0aWNNZW1iZXIgdHJpYmVzTWVtYmVyOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICB0cmliZXNNZW1iZXIgPSBuZXcgU3RhdGljTWVtYmVyKG1lbWJlci5nZXRIb3N0TmFtZSgpLCBtZW1iZXIuZ2V0UG9ydCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgcGF5bG9hZCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJDb3VsZCBub3QgYWRkIHN0YXRpYyBtZW1iZXIgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWJlci5nZXRIb3N0TmFtZSgpICsgIjoiICsgbWVtYmVyLmdldFBvcnQoKTsKLSAgICAgICAgICAgICAgICBsb2cuZXJyb3IobXNnLCBlKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ2x1c3RlcmluZ0ZhdWx0KG1zZywgZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIERvIG5vdCBhZGQgdGhlIGxvY2FsIG1lbWJlciB0byB0aGUgbGlzdCBvZiBtZW1iZXJzCi0gICAgICAgICAgICBpZiAoIShBcnJheXMuZXF1YWxzKGxvY2FsTWVtYmVyLmdldEhvc3QoKSwgdHJpYmVzTWVtYmVyLmdldEhvc3QoKSkgJiYKLSAgICAgICAgICAgICAgICAgIGxvY2FsTWVtYmVyLmdldFBvcnQoKSA9PSB0cmliZXNNZW1iZXIuZ2V0UG9ydCgpKSkgewotICAgICAgICAgICAgICAgIHRyaWJlc01lbWJlci5zZXREb21haW4obG9jYWxEb21haW4pOwotCi0gICAgICAgICAgICAgICAgLy8gV2Ugd2lsbCBhZGQgdGhlIG1lbWJlciBldmVuIGlmIGl0IGlzIG9mZmxpbmUgYXQgdGhpcyBtb21lbnQuIFdoZW4gdGhlCi0gICAgICAgICAgICAgICAgLy8gbWVtYmVyIGNvbWVzIG9ubGluZSwgaXQgd2lsbCBiZSBkZXRlY3RlZCBieSB0aGUgR01TCi0gICAgICAgICAgICAgICAgc3RhdGljTWVtYmVyc2hpcEludGVyY2VwdG9yLmFkZFN0YXRpY01lbWJlcih0cmliZXNNZW1iZXIpOwotICAgICAgICAgICAgICAgIHByaW1hcnlNZW1iZXJzaGlwTWFuYWdlci5hZGRXZWxsS25vd25NZW1iZXIodHJpYmVzTWVtYmVyKTsKLSAgICAgICAgICAgICAgICBpZiAoY2FuQ29ubmVjdChtZW1iZXIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByaW1hcnlNZW1iZXJzaGlwTWFuYWdlci5tZW1iZXJBZGRlZCh0cmliZXNNZW1iZXIpOwotICAgICAgICAgICAgICAgICAgICBsb2cuaW5mbygiQWRkZWQgc3RhdGljIG1lbWJlciAiICsgVHJpYmVzVXRpbC5nZXROYW1lKHRyaWJlc01lbWJlcikpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJDb3VsZCBub3QgY29ubmVjdCB0byBtZW1iZXIgIiArIFRyaWJlc1V0aWwuZ2V0TmFtZSh0cmliZXNNZW1iZXIpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBCZWZvcmUgYWRkaW5nIGEgc3RhdGljIG1lbWJlciwgd2Ugd2lsbCB0cnkgdG8gdmVyaWZ5IHdoZXRoZXIgd2UgY2FuIGNvbm5lY3QgdG8gaXQKLSAgICAgKgotICAgICAqIEBwYXJhbSBtZW1iZXIgVGhlIG1lbWJlciB3aG9zZSBjb25uZWN0dml0eSBuZWVkcyB0byBiZSB2ZXJpZmllZAotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIG1lbWJlciBjYW4gYmUgY29udGFjdGVkOyBmYWxzZSwgb3RoZXJ3aXNlLgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBjYW5Db25uZWN0KG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5NZW1iZXIgbWVtYmVyKSB7Ci0gICAgICAgIGZvciAoaW50IHJldHJpZXMgPSA1OyByZXRyaWVzID4gMDsgcmV0cmllcy0tKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIEluZXRBZGRyZXNzIGFkZHIgPSBJbmV0QWRkcmVzcy5nZXRCeU5hbWUobWVtYmVyLmdldEhvc3ROYW1lKCkpOwotICAgICAgICAgICAgICAgIFNvY2tldEFkZHJlc3Mgc29ja2FkZHIgPSBuZXcgSW5ldFNvY2tldEFkZHJlc3MoYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWJlci5nZXRQb3J0KCkpOwotICAgICAgICAgICAgICAgIG5ldyBTb2NrZXQoKS5jb25uZWN0KHNvY2thZGRyLCA1MDApOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPSBlLmdldE1lc3NhZ2UoKTsKLSAgICAgICAgICAgICAgICBpZiAobXNnLmluZGV4T2YoIkNvbm5lY3Rpb24gcmVmdXNlZCIpID09IC0xICYmIG1zZy5pbmRleE9mKCJjb25uZWN0IHRpbWVkIG91dCIpID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiQ2Fubm90IGNvbm5lY3QgdG8gbWVtYmVyICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtYmVyLmdldEhvc3ROYW1lKCkgKyAiOiIgKyBtZW1iZXIuZ2V0UG9ydCgpLCBlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBpbnQgZ2V0TG9jYWxQb3J0KFNlcnZlclNvY2tldCBzb2NrZXQsIFN0cmluZyBob3N0bmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcHJlZmVycmVkUG9ydCwgaW50IHBvcnRzdGFydCwgaW50IHJldHJpZXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChwcmVmZXJyZWRQb3J0ICE9IC0xKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHJldHVybiBnZXRMb2NhbFBvcnQoc29ja2V0LCBob3N0bmFtZSwgcHJlZmVycmVkUG9ydCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpZ25vcmVkKSB7Ci0gICAgICAgICAgICAgICAgLy8gRmFsbCB0aHJvdWdoIGFuZCB0cnkgYSBkZWZhdWx0IHBvcnQKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBJbmV0U29ja2V0QWRkcmVzcyBhZGRyID0gbnVsbDsKLSAgICAgICAgaWYgKHJldHJpZXMgPiAwKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHJldHVybiBnZXRMb2NhbFBvcnQoc29ja2V0LCBob3N0bmFtZSwgcG9ydHN0YXJ0KTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIHgpIHsKLSAgICAgICAgICAgICAgICByZXRyaWVzLS07Ci0gICAgICAgICAgICAgICAgaWYgKHJldHJpZXMgPD0gMCkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIlVuYWJsZSB0byBiaW5kIHNlcnZlciBzb2NrZXQgdG86IiArIGFkZHIgKyAiIHRocm93aW5nIGVycm9yLiIpOwotICAgICAgICAgICAgICAgICAgICB0aHJvdyB4OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwb3J0c3RhcnQrKzsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoNTApOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGlnbm9yZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWdub3JlZC5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZ2V0TG9jYWxQb3J0KHNvY2tldCwgaG9zdG5hbWUsIHBvcnRzdGFydCwgcmV0cmllcywgLTEpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwb3J0c3RhcnQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgZ2V0TG9jYWxQb3J0KFNlcnZlclNvY2tldCBzb2NrZXQsIFN0cmluZyBob3N0bmFtZSwgaW50IHBvcnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIEluZXRTb2NrZXRBZGRyZXNzIGFkZHI7Ci0gICAgICAgIGFkZHIgPSBuZXcgSW5ldFNvY2tldEFkZHJlc3MoaG9zdG5hbWUsIHBvcnQpOwotICAgICAgICBzb2NrZXQuYmluZChhZGRyKTsKLSAgICAgICAgbG9nLmluZm8oIlJlY2VpdmVyIFNlcnZlciBTb2NrZXQgYm91bmQgdG86IiArIGFkZHIpOwotICAgICAgICBzb2NrZXQuc2V0U29UaW1lb3V0KDUpOwotICAgICAgICBzb2NrZXQuY2xvc2UoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDApOwotICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZ25vcmVkKSB7Ci0gICAgICAgICAgICBpZ25vcmVkLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwb3J0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZCBDaGFubmVsSW50ZXJjZXB0b3JzLiBUaGUgb3JkZXIgb2YgdGhlIGludGVyY2VwdG9ycyB0aGF0IGFyZSBhZGRlZCB3aWxsIGRlcGVuZCBvbiB0aGUKLSAgICAgKiBtZW1iZXJzaGlwIG1hbmFnZW1lbnQgc2NoZW1lCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGFkZEludGVyY2VwdG9ycygpIHsKLQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiQWRkaW5nIEludGVyY2VwdG9ycy4uLiIpOwotICAgICAgICB9Ci0gICAgICAgIFRjcFBpbmdJbnRlcmNlcHRvciB0Y3BQaW5nSW50ZXJjZXB0b3IgPSBuZXcgVGNwUGluZ0ludGVyY2VwdG9yKCk7Ci0gICAgICAgIHRjcFBpbmdJbnRlcmNlcHRvci5zZXRJbnRlcnZhbCgxMDApOwotICAgICAgICBjaGFubmVsLmFkZEludGVyY2VwdG9yKHRjcFBpbmdJbnRlcmNlcHRvcik7Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJBZGRlZCBUQ1AgUGluZyBJbnRlcmNlcHRvciIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQWRkIGEgcmVsaWFibGUgZmFpbHVyZSBkZXRlY3RvcgotICAgICAgICBUY3BGYWlsdXJlRGV0ZWN0b3IgdGNwRmFpbHVyZURldGVjdG9yID0gbmV3IFRjcEZhaWx1cmVEZXRlY3RvcigpOwotLy8gICAgICAgIHRjcEZhaWx1cmVEZXRlY3Rvci5zZXRQcmV2aW91cyhkZmkpOyAvL1RPRE86IGNoZWNrIHRoaXMKLSAgICAgICAgdGNwRmFpbHVyZURldGVjdG9yLnNldFJlYWRUZXN0VGltZW91dCgxMjAwMDApOwotICAgICAgICB0Y3BGYWlsdXJlRGV0ZWN0b3Iuc2V0Q29ubmVjdFRpbWVvdXQoNjAwMDApOwotICAgICAgICBjaGFubmVsLmFkZEludGVyY2VwdG9yKHRjcEZhaWx1cmVEZXRlY3Rvcik7Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJBZGRlZCBUQ1AgRmFpbHVyZSBEZXRlY3RvciIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQWRkIHRoZSBOb25CbG9ja2luZ0Nvb3JkaW5hdG9yLgotLy8gICAgICAgIGNoYW5uZWwuYWRkSW50ZXJjZXB0b3IobmV3IEF4aXMyQ29vcmRpbmF0b3IobWVtYmVyc2hpcExpc3RlbmVyKSk7Ci0KLSAgICAgICAgc3RhdGljTWVtYmVyc2hpcEludGVyY2VwdG9yID0gbmV3IFN0YXRpY01lbWJlcnNoaXBJbnRlcmNlcHRvcigpOwotICAgICAgICBzdGF0aWNNZW1iZXJzaGlwSW50ZXJjZXB0b3Iuc2V0TG9jYWxNZW1iZXIocHJpbWFyeU1lbWJlcnNoaXBNYW5hZ2VyLmdldExvY2FsTWVtYmVyKCkpOwotICAgICAgICBwcmltYXJ5TWVtYmVyc2hpcE1hbmFnZXIuc2V0U3RhdGljTWVtYmVyc2hpcEludGVyY2VwdG9yKHN0YXRpY01lbWJlcnNoaXBJbnRlcmNlcHRvcik7Ci0gICAgICAgIGNoYW5uZWwuYWRkSW50ZXJjZXB0b3Ioc3RhdGljTWVtYmVyc2hpcEludGVyY2VwdG9yKTsKLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIkFkZGVkIFN0YXRpYyBNZW1iZXJzaGlwIEludGVyY2VwdG9yIik7Ci0gICAgICAgIH0KLQotICAgICAgICBjaGFubmVsLmdldE1lbWJlcnNoaXBTZXJ2aWNlKCkuc2V0RG9tYWluKGxvY2FsRG9tYWluKTsKLSAgICAgICAgbW9kZS5hZGRJbnRlcmNlcHRvcnMoY2hhbm5lbCk7Ci0KLSAgICAgICAgaWYgKGF0bW9zdE9uY2VNZXNzYWdlU2VtYW50aWNzKSB7Ci0gICAgICAgICAgICAvLyBBZGQgYSBBdE1vc3RPbmNlSW50ZXJjZXB0b3IgdG8gc3VwcG9ydCBhdC1tb3N0LW9uY2UgbWVzc2FnZSBwcm9jZXNzaW5nIHNlbWFudGljcwotICAgICAgICAgICAgQXRNb3N0T25jZUludGVyY2VwdG9yIGF0TW9zdE9uY2VJbnRlcmNlcHRvciA9IG5ldyBBdE1vc3RPbmNlSW50ZXJjZXB0b3IoKTsKLSAgICAgICAgICAgIGF0TW9zdE9uY2VJbnRlcmNlcHRvci5zZXRPcHRpb25GbGFnKFRyaWJlc0NvbnN0YW50cy5BVF9NT1NUX09OQ0VfT1BUSU9OKTsKLSAgICAgICAgICAgIGNoYW5uZWwuYWRkSW50ZXJjZXB0b3IoYXRNb3N0T25jZUludGVyY2VwdG9yKTsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQWRkZWQgQXQtbW9zdC1vbmNlIEludGVyY2VwdG9yIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocHJlc2VydmVyTXNnT3JkZXIpIHsKLSAgICAgICAgICAgIC8vIEFkZCB0aGUgT3JkZXJJbnRlcmNlcHRvciB0byBwcmVzZXJ2ZSBzZW5kZXIgb3JkZXJpbmcKLSAgICAgICAgICAgIE9yZGVySW50ZXJjZXB0b3Igb3JkZXJJbnRlcmNlcHRvciA9IG5ldyBPcmRlckludGVyY2VwdG9yKCk7Ci0gICAgICAgICAgICBvcmRlckludGVyY2VwdG9yLnNldE9wdGlvbkZsYWcoVHJpYmVzQ29uc3RhbnRzLk1TR19PUkRFUl9PUFRJT04pOwotICAgICAgICAgICAgY2hhbm5lbC5hZGRJbnRlcmNlcHRvcihvcmRlckludGVyY2VwdG9yKTsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQWRkZWQgTWVzc2FnZSBPcmRlciBJbnRlcmNlcHRvciIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSk9JTiB0aGUgZ3JvdXAgYW5kIGdldCB0aGUgbWVtYmVyIGxpc3QKLSAgICAgKgotICAgICAqIEB0aHJvd3MgQ2x1c3RlcmluZ0ZhdWx0IElmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBqb2luaW5nIHRoZSBncm91cAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGpvaW5Hcm91cCgpIHRocm93cyBDbHVzdGVyaW5nRmF1bHQgewotCi0gICAgICAgIC8vIEhhdmUgbXVsdGlwbGUgUlBDIGNoYW5uZWxzIHdpdGggbXVsdGlwbGUgUlBDIHJlcXVlc3QgaGFuZGxlcnMgZm9yIGVhY2ggbG9jYWxEb21haW4KLSAgICAgICAgLy8gVGhpcyBpcyBuZWVkZWQgb25seSB3aGVuIHRoaXMgbWVtYmVyIGlzIHJ1bm5pbmcgYXMgYSBsb2FkIGJhbGFuY2VyCi0gICAgICAgIGZvciAoTWVtYmVyc2hpcE1hbmFnZXIgYXBwRG9tYWluTWVtYmVyc2hpcE1hbmFnZXIgOiBhcHBsaWNhdGlvbkRvbWFpbk1lbWJlcnNoaXBNYW5hZ2VycykgewotICAgICAgICAgICAgYXBwRG9tYWluTWVtYmVyc2hpcE1hbmFnZXIuc2V0U3RhdGljTWVtYmVyc2hpcEludGVyY2VwdG9yKHN0YXRpY01lbWJlcnNoaXBJbnRlcmNlcHRvcik7Ci0KLSAgICAgICAgICAgIC8vIENyZWF0ZSBhbiBScGNDaGFubmVsIGZvciBlYWNoIGxvY2FsRG9tYWluCi0gICAgICAgICAgICBTdHJpbmcgZG9tYWluID0gbmV3IFN0cmluZyhhcHBEb21haW5NZW1iZXJzaGlwTWFuYWdlci5nZXREb21haW4oKSk7Ci0gICAgICAgICAgICBScGNDaGFubmVsIHJwY01lbWJlcnNoaXBDaGFubmVsID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IFJwY0NoYW5uZWwoVHJpYmVzVXRpbC5nZXRScGNNZW1iZXJzaGlwQ2hhbm5lbElkKGFwcERvbWFpbk1lbWJlcnNoaXBNYW5hZ2VyLmdldERvbWFpbigpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFJwY01lbWJlcnNoaXBSZXF1ZXN0SGFuZGxlcihhcHBEb21haW5NZW1iZXJzaGlwTWFuYWdlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzKSk7Ci0gICAgICAgICAgICBhcHBEb21haW5NZW1iZXJzaGlwTWFuYWdlci5zZXRScGNNZW1iZXJzaGlwQ2hhbm5lbChycGNNZW1iZXJzaGlwQ2hhbm5lbCk7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkNyZWF0ZWQgUlBDIE1lbWJlcnNoaXAgQ2hhbm5lbCBmb3IgYXBwbGljYXRpb24gZG9tYWluICIgKyBkb21haW4pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQ3JlYXRlIGEgTWVtYmVyc2hpcCBjaGFubmVsIGZvciBoYW5kbGluZyBtZW1iZXJzaGlwIHJlcXVlc3RzCi0gICAgICAgIFJwY0NoYW5uZWwgcnBjTWVtYmVyc2hpcENoYW5uZWwgPQotICAgICAgICAgICAgICAgIG5ldyBScGNDaGFubmVsKFRyaWJlc1V0aWwuZ2V0UnBjTWVtYmVyc2hpcENoYW5uZWxJZChsb2NhbERvbWFpbiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbCwgbmV3IFJwY01lbWJlcnNoaXBSZXF1ZXN0SGFuZGxlcihwcmltYXJ5TWVtYmVyc2hpcE1hbmFnZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzKSk7Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJDcmVhdGVkIHByaW1hcnkgbWVtYmVyc2hpcCBjaGFubmVsICIgKyBuZXcgU3RyaW5nKGxvY2FsRG9tYWluKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcHJpbWFyeU1lbWJlcnNoaXBNYW5hZ2VyLnNldFJwY01lbWJlcnNoaXBDaGFubmVsKHJwY01lbWJlcnNoaXBDaGFubmVsKTsKLQotICAgICAgICAvLyBTZW5kIEpPSU4gbWVzc2FnZSB0byBhIFdLQSBtZW1iZXIKLSAgICAgICAgaWYgKHByaW1hcnlNZW1iZXJzaGlwTWFuYWdlci5nZXRNZW1iZXJzKCkubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgbG9nLmluZm8oIlNlbmRpbmcgSk9JTiBtZXNzYWdlIHRvIFdLQSBtZW1iZXJzLi4uIik7Ci0gICAgICAgICAgICBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5NZW1iZXJbXSB3a2FNZW1iZXJzID0gcHJpbWFyeU1lbWJlcnNoaXBNYW5hZ2VyLmdldE1lbWJlcnMoKTsgLy8gVGhlIHdlbGwta25vd24gbWVtYmVycwotICAgICAgICAgICAgLyp0cnkgewotICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgzMDAwKTsgLy8gV2FpdCBmb3Igc29tZXRpbWUgc28gdGhhdCB0aGUgV0tBIG1lbWJlcnMgY2FuIHJlY2VpdmUgdGhlIE1FTUJFUl9MSVNUIG1lc3NhZ2UsIGlmIHRoZXkgaGF2ZSBqdXN0IGpvaW5lZCB0aGUgZ3JvdXAKLSAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGlnbm9yZWQpIHsKLSAgICAgICAgICAgIH0qLyAgIC8vVE9ETzogIyMjIyBOZWVkIHRvIGRvdWJsZSBjaGVjayB3aGV0aGVyIHRoaXMgc2xlZXAgaXMgbmVjZXNzYXJ5Ci0gICAgICAgICAgICBSZXNwb25zZVtdIHJlc3BvbnNlcyA9IG51bGw7Ci0gICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VzID0gcnBjTWVtYmVyc2hpcENoYW5uZWwuc2VuZCh3a2FNZW1iZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBKb2luR3JvdXBDb21tYW5kKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUnBjQ2hhbm5lbC5BTExfUkVQTFksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbm5lbC5TRU5EX09QVElPTlNfQVNZTkNIUk9OT1VTIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmliZXNDb25zdGFudHMuTUVNQkVSU0hJUF9NU0dfT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMDAwKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlcy5sZW5ndGggPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJObyByZXNwb25zZXMgcmVjZWl2ZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDUwMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZ25vcmVkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbXNnID0gIkVycm9yIG9jY3VycmVkIHdoaWxlIHRyeWluZyB0byBzZW5kIEpPSU4gcmVxdWVzdCB0byBXS0EgbWVtYmVycyI7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcihtc2csIGUpOwotICAgICAgICAgICAgICAgICAgICB3a2FNZW1iZXJzID0gcHJpbWFyeU1lbWJlcnNoaXBNYW5hZ2VyLmdldE1lbWJlcnMoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHdrYU1lbWJlcnMubGVuZ3RoID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKCJUaGVyZSBhcmUgbm8gd2VsbC1rbm93biBtZW1iZXJzIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIFRPRE86IElmIHdlIGRvIG5vdCBnZXQgYSByZXNwb25zZSB3aXRoaW4gc29tZSB0aW1lLCB0cnkgdG8gcmVjb3ZlciBmcm9tIHRoaXMgZmF1bHQKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHdoaWxlIChyZXNwb25zZXMgPT0gbnVsbCB8fCByZXNwb25zZXMubGVuZ3RoID09IDApOyAgLy8gV2FpdCB1bnRpbCB3ZSd2ZSByZWNlaXZlZCBhdCBsZWFzdCBvbmUgcmVzcG9uc2UKLQotICAgICAgICAgICAgZm9yIChSZXNwb25zZSByZXNwb25zZSA6IHJlc3BvbnNlcykgewotICAgICAgICAgICAgICAgIE1lbWJlckxpc3RDb21tYW5kIGNvbW1hbmQgPSAoTWVtYmVyTGlzdENvbW1hbmQpIHJlc3BvbnNlLmdldE1lc3NhZ2UoKTsKLSAgICAgICAgICAgICAgICBjb21tYW5kLnNldE1lbWJlcnNoaXBNYW5hZ2VyKHByaW1hcnlNZW1iZXJzaGlwTWFuYWdlcik7Ci0gICAgICAgICAgICAgICAgY29tbWFuZC5leGVjdXRlKG51bGwpOyAvLyBTZXQgdGhlIGxpc3Qgb2YgY3VycmVudCBtZW1iZXJzCi0KLSAgICAgICAgICAgICAgICAvLyBJZiB0aGUgV0tBIG1lbWJlciBpcyBub3QgcGFydCBvZiB0aGlzIGdyb3VwLCByZW1vdmUgaXQKLSAgICAgICAgICAgICAgICBpZiAoIVRyaWJlc1V0aWwuYXJlSW5TYW1lRG9tYWluKHJlc3BvbnNlLmdldFNvdXJjZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWFyeU1lbWJlcnNoaXBNYW5hZ2VyLmdldExvY2FsTWVtYmVyKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByaW1hcnlNZW1iZXJzaGlwTWFuYWdlci5tZW1iZXJEaXNhcHBlYXJlZChyZXNwb25zZS5nZXRTb3VyY2UoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJSZW1vdmVkIG1lbWJlciAiICsgVHJpYmVzVXRpbC5nZXROYW1lKHJlc3BvbnNlLmdldFNvdXJjZSgpKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBzaW5jZSBpdCBkb2VzIG5vdCBiZWxvbmcgdG8gdGhlIGxvY2FsIGRvbWFpbiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nKHByaW1hcnlNZW1iZXJzaGlwTWFuYWdlci5nZXRMb2NhbE1lbWJlcigpLmdldERvbWFpbigpKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXaGVuIGEgSk9JTiBtZXNzYWdlIGlzIHJlY2VpdmVkIGZyb20gc29tZSBvdGhlciBtZW1iZXIsIGl0IGlzIG5vdGlmaWVkIHVzaW5nIHRoaXMgbWV0aG9kLAotICAgICAqIHNvIHRoYXQgbWVtYmVyc2hpcCBzY2hlbWUgc3BlY2lmaWMgcHJvY2Vzc2luZyBjYW4gYmUgY2FycmllZCBvdXQKLSAgICAgKgotICAgICAqIEBwYXJhbSBtZW1iZXIgVGhlIG1lbWJlciB3aG8ganVzdCBqb2luZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzSm9pbihvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5NZW1iZXIgbWVtYmVyKSB7Ci0gICAgICAgIG1vZGUubm90aWZ5TWVtYmVySm9pbihtZW1iZXIpOwotICAgIH0KLQotCi0gICAgcHVibGljIFBhcmFtZXRlciBnZXRQYXJhbWV0ZXIoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgcmV0dXJuIHBhcmFtZXRlcnMuZ2V0KG5hbWUpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2NsdXN0ZXJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy90cmliZXMvV2thTWVtYmVyc2hpcFNlcnZpY2UuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2NsdXN0ZXJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy90cmliZXMvV2thTWVtYmVyc2hpcFNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZmNTkxMy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvdHJpYmVzL1drYU1lbWJlcnNoaXBTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICogQ29weXJpZ2h0IDIwMDQsMjAwNSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7ICAgICAgICAgICAgIAotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgICAgICAgICAgIAotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAgICAgICAgIAotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgICAgICAgICAgIAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICAgIAotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAgICAgICAgIAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy50cmliZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5NZW1iZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuTWVtYmVyc2hpcExpc3RlbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLk1lbWJlcnNoaXBTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLm1lbWJlcnNoaXAuU3RhdGljTWVtYmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLnV0aWwuVVVJREdlbmVyYXRvcjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgTWVtYmVyc2hpcFNlcnZpY2Ugd2hpY2ggbWFuYWdlcyBncm91cCBtZW1iZXJzaGlwIGJhc2VkIG9uIGEgV2VsbC1Lbm93biBBZGRyZXNzaW5nIChXS0EpCi0gKiBzY2hlbWUuCi0gKi8KLXB1YmxpYyBjbGFzcyBXa2FNZW1iZXJzaGlwU2VydmljZSBpbXBsZW1lbnRzIE1lbWJlcnNoaXBTZXJ2aWNlIHsKLQotICAgIHByaXZhdGUgTWVtYmVyc2hpcE1hbmFnZXIgbWVtYmVyc2hpcE1hbmFnZXI7Ci0KLQotICAgIC8qKgotICAgICAqIFRoZSBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyBwcm9wZXJ0aWVzCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0KLSAgICBwcm90ZWN0ZWQgYnl0ZVtdIHBheWxvYWQ7Ci0KLSAgICBwcm90ZWN0ZWQgYnl0ZVtdIGRvbWFpbjsKLSAgICBwcml2YXRlIE1lbWJlcnNoaXBMaXN0ZW5lciBtZW1iZXJzaGlwTGlzdGVuZXI7Ci0KLSAgICBwdWJsaWMgV2thTWVtYmVyc2hpcFNlcnZpY2UoTWVtYmVyc2hpcE1hbmFnZXIgbWVtYmVyc2hpcE1hbmFnZXIpIHsKLSAgICAgICAgdGhpcy5tZW1iZXJzaGlwTWFuYWdlciA9IG1lbWJlcnNoaXBNYW5hZ2VyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnRpZXMoUHJvcGVydGllcyBwcm9wZXJ0aWVzKSB7Ci0gICAgICAgIHRoaXMucHJvcGVydGllcyA9IHByb3BlcnRpZXM7Ci0gICAgfQotCi0gICAgcHVibGljIFByb3BlcnRpZXMgZ2V0UHJvcGVydGllcygpIHsKLSAgICAgICAgcmV0dXJuIHByb3BlcnRpZXM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RhcnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gTm90aGluZyB0byBkbyBoZXJlCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RhcnQoaW50IGkpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBOb3RoaW5nIHRvIGRvIGhlcmUKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdG9wKGludCBpKSB7Ci0gICAgICAgIC8vIE5vdGhpbmcgdG8gZG8gaGVyZQotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGhhc01lbWJlcnMoKSB7Ci0gICAgICAgIHJldHVybiBtZW1iZXJzaGlwTWFuYWdlci5oYXNNZW1iZXJzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIE1lbWJlciBnZXRNZW1iZXIoTWVtYmVyIG1lbWJlcikgewotICAgICAgICByZXR1cm4gbWVtYmVyc2hpcE1hbmFnZXIuZ2V0TWVtYmVyKG1lbWJlcik7Ci0gICAgfQotCi0gICAgcHVibGljIE1lbWJlcltdIGdldE1lbWJlcnMoKSB7Ci0gICAgICAgIHJldHVybiBtZW1iZXJzaGlwTWFuYWdlci5nZXRNZW1iZXJzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIE1lbWJlciBnZXRMb2NhbE1lbWJlcihib29sZWFuIGIpIHsKLSAgICAgICAgcmV0dXJuIG1lbWJlcnNoaXBNYW5hZ2VyLmdldExvY2FsTWVtYmVyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZ1tdIGdldE1lbWJlcnNCeU5hbWUoKSB7Ci0gICAgICAgIE1lbWJlcltdIGN1cnJlbnRNZW1iZXJzID0gZ2V0TWVtYmVycygpOwotICAgICAgICBTdHJpbmdbXSBtZW1iZXJuYW1lczsKLSAgICAgICAgaWYgKGN1cnJlbnRNZW1iZXJzICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1lbWJlcm5hbWVzID0gbmV3IFN0cmluZ1tjdXJyZW50TWVtYmVycy5sZW5ndGhdOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjdXJyZW50TWVtYmVycy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIG1lbWJlcm5hbWVzW2ldID0gY3VycmVudE1lbWJlcnNbaV0udG9TdHJpbmcoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1lbWJlcm5hbWVzID0gbmV3IFN0cmluZ1swXTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbWVtYmVybmFtZXM7Ci0gICAgfQotCi0gICAgcHVibGljIE1lbWJlciBmaW5kTWVtYmVyQnlOYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIE1lbWJlcltdIGN1cnJlbnRNZW1iZXJzID0gZ2V0TWVtYmVycygpOwotICAgICAgICBmb3IgKE1lbWJlciBjdXJyZW50TWVtYmVyIDogY3VycmVudE1lbWJlcnMpIHsKLSAgICAgICAgICAgIGlmIChuYW1lLmVxdWFscyhjdXJyZW50TWVtYmVyLnRvU3RyaW5nKCkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRNZW1iZXI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TG9jYWxNZW1iZXJQcm9wZXJ0aWVzKFN0cmluZyBsaXN0ZW5Ib3N0LCBpbnQgbGlzdGVuUG9ydCkgewotICAgICAgICBwcm9wZXJ0aWVzLnNldFByb3BlcnR5KCJ0Y3BMaXN0ZW5Ib3N0IiwgbGlzdGVuSG9zdCk7Ci0gICAgICAgIHByb3BlcnRpZXMuc2V0UHJvcGVydHkoInRjcExpc3RlblBvcnQiLCBTdHJpbmcudmFsdWVPZihsaXN0ZW5Qb3J0KSk7Ci0gICAgICAgIFN0YXRpY01lbWJlciBsb2NhbE1lbWJlciA9IChTdGF0aWNNZW1iZXIpIG1lbWJlcnNoaXBNYW5hZ2VyLmdldExvY2FsTWVtYmVyKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAobG9jYWxNZW1iZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGxvY2FsTWVtYmVyLnNldEhvc3RuYW1lKGxpc3Rlbkhvc3QpOwotICAgICAgICAgICAgICAgIGxvY2FsTWVtYmVyLnNldFBvcnQobGlzdGVuUG9ydCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGxvY2FsTWVtYmVyID0gbmV3IFN0YXRpY01lbWJlcihsaXN0ZW5Ib3N0LCBsaXN0ZW5Qb3J0LCAwKTsKLSAgICAgICAgICAgICAgICBsb2NhbE1lbWJlci5zZXRVbmlxdWVJZChVVUlER2VuZXJhdG9yLnJhbmRvbVVVSUQodHJ1ZSkpOwotICAgICAgICAgICAgICAgIGxvY2FsTWVtYmVyLnNldFBheWxvYWQocGF5bG9hZCk7Ci0gICAgICAgICAgICAgICAgbG9jYWxNZW1iZXIuc2V0RG9tYWluKGRvbWFpbik7Ci0gICAgICAgICAgICAgICAgbWVtYmVyc2hpcE1hbmFnZXIuc2V0TG9jYWxNZW1iZXIobG9jYWxNZW1iZXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbG9jYWxNZW1iZXIuZ2V0RGF0YSh0cnVlLCB0cnVlKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24geCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbih4KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE1lbWJlcnNoaXBMaXN0ZW5lcihNZW1iZXJzaGlwTGlzdGVuZXIgbWVtYmVyc2hpcExpc3RlbmVyKSB7Ci0gICAgICAgIHRoaXMubWVtYmVyc2hpcExpc3RlbmVyID0gbWVtYmVyc2hpcExpc3RlbmVyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZU1lbWJlcnNoaXBMaXN0ZW5lcigpIHsKLSAgICAgICAgdGhpcy5tZW1iZXJzaGlwTGlzdGVuZXIgPSBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBheWxvYWQoYnl0ZVtdIHBheWxvYWQpIHsKLSAgICAgICAgdGhpcy5wYXlsb2FkID0gcGF5bG9hZDsKLSAgICAgICAgKChTdGF0aWNNZW1iZXIpIG1lbWJlcnNoaXBNYW5hZ2VyLmdldExvY2FsTWVtYmVyKCkpLnNldFBheWxvYWQocGF5bG9hZCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RG9tYWluKGJ5dGVbXSBkb21haW4pIHsKLSAgICAgICAgdGhpcy5kb21haW4gPSBkb21haW47Ci0gICAgICAgICgoU3RhdGljTWVtYmVyKSBtZW1iZXJzaGlwTWFuYWdlci5nZXRMb2NhbE1lbWJlcigpKS5zZXREb21haW4oZG9tYWluKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9jbHVzdGVyaW5nL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL0NsdXN0ZXJNYW5hZ2VyVGVzdENhc2UuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2NsdXN0ZXJpbmcvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvQ2x1c3Rlck1hbmFnZXJUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjdkNGEzLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2NsdXN0ZXJpbmcvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvQ2x1c3Rlck1hbmFnZXJUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25NYW5hZ2VyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLmNvbmZpZ3VyYXRpb24uRGVmYXVsdENvbmZpZ3VyYXRpb25NYW5hZ2VyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLmNvbmZpZ3VyYXRpb24uVGVzdENvbmZpZ3VyYXRpb25NYW5hZ2VyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLmNvbnRleHQuRGVmYXVsdENvbnRleHRNYW5hZ2VyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlR3JvdXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0NvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLlV0aWxzOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ2x1c3Rlck1hbmFnZXJUZXN0Q2FzZSBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHByb3RlY3RlZCBDbHVzdGVyTWFuYWdlciBjbHVzdGVyTWFuYWdlcjEgPSBudWxsOwotICAgIHByb3RlY3RlZCBDbHVzdGVyTWFuYWdlciBjbHVzdGVyTWFuYWdlcjIgPSBudWxsOwotICAgIHByb3RlY3RlZCBBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlndXJhdGlvbjEgPSBudWxsOwotICAgIHByb3RlY3RlZCBBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlndXJhdGlvbjIgPSBudWxsOwotICAgIHByb3RlY3RlZCBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWd1cmF0aW9uQ29udGV4dDEgPSBudWxsOwotICAgIHByb3RlY3RlZCBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWd1cmF0aW9uQ29udGV4dDIgPSBudWxsOwotICAgIHByb3RlY3RlZCBDb25maWd1cmF0aW9uTWFuYWdlckxpc3RlbmVyIGNvbmZpZ01hbmFnZXJMaXN0ZW5lcjE7Ci0gICAgcHJvdGVjdGVkIENvbmZpZ3VyYXRpb25NYW5hZ2VyTGlzdGVuZXIgY29uZmlnTWFuYWdlckxpc3RlbmVyMjsKLSAgICBwcm90ZWN0ZWQgQXhpc1NlcnZpY2VHcm91cCBzZXJ2aWNlR3JvdXAxID0gbnVsbDsKLSAgICBwcm90ZWN0ZWQgQXhpc1NlcnZpY2VHcm91cCBzZXJ2aWNlR3JvdXAyID0gbnVsbDsKLSAgICBwcm90ZWN0ZWQgQXhpc1NlcnZpY2Ugc2VydmljZTEgPSBudWxsOwotICAgIHByb3RlY3RlZCBBeGlzU2VydmljZSBzZXJ2aWNlMiA9IG51bGw7Ci0gICAgcHJvdGVjdGVkIFN0cmluZyBzZXJ2aWNlTmFtZSA9ICJ0ZXN0U2VydmljZSI7Ci0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgQ2x1c3Rlck1hbmFnZXIgZ2V0Q2x1c3Rlck1hbmFnZXIoQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ3R4KTsKLQotICAgIHByb3RlY3RlZCBib29sZWFuIHNraXBDaGFubmVsVGVzdHMgPSBmYWxzZTsKLSAgICBwcm90ZWN0ZWQgVGVzdENvbmZpZ3VyYXRpb25NYW5hZ2VyTGlzdGVuZXIgY29uZmlndXJhdGlvbk1hbmFnZXJMaXN0ZW5lcjsKLSAgICBwcm90ZWN0ZWQgRGVmYXVsdENvbnRleHRNYW5hZ2VyTGlzdGVuZXIgY29udGV4dE1hbmFnZXJMaXN0ZW5lcjsKLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgVGhyZWFkLnNsZWVwKDMwMDApOwotCi0gICAgICAgIGNvbmZpZ3VyYXRpb25Db250ZXh0MSA9IENvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeS5jcmVhdGVEZWZhdWx0Q29uZmlndXJhdGlvbkNvbnRleHQoKTsKLSAgICAgICAgY29uZmlndXJhdGlvbkNvbnRleHQyID0gQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5LmNyZWF0ZURlZmF1bHRDb25maWd1cmF0aW9uQ29udGV4dCgpOwotCi0gICAgICAgIGNsdXN0ZXJNYW5hZ2VyMSA9IGdldENsdXN0ZXJNYW5hZ2VyKGNvbmZpZ3VyYXRpb25Db250ZXh0MSk7Ci0gICAgICAgIGNsdXN0ZXJNYW5hZ2VyMiA9IGdldENsdXN0ZXJNYW5hZ2VyKGNvbmZpZ3VyYXRpb25Db250ZXh0Mik7Ci0KLSAgICAgICAgY2x1c3Rlck1hbmFnZXIxLmdldENvbnRleHRNYW5hZ2VyKCkuc2V0Q29uZmlndXJhdGlvbkNvbnRleHQoY29uZmlndXJhdGlvbkNvbnRleHQxKTsKLSAgICAgICAgY2x1c3Rlck1hbmFnZXIyLmdldENvbnRleHRNYW5hZ2VyKCkuc2V0Q29uZmlndXJhdGlvbkNvbnRleHQoY29uZmlndXJhdGlvbkNvbnRleHQyKTsKLQotICAgICAgICBjbHVzdGVyTWFuYWdlcjEuZ2V0Q29uZmlndXJhdGlvbk1hbmFnZXIoKS5zZXRDb25maWd1cmF0aW9uQ29udGV4dChjb25maWd1cmF0aW9uQ29udGV4dDEpOwotICAgICAgICBjbHVzdGVyTWFuYWdlcjIuZ2V0Q29uZmlndXJhdGlvbk1hbmFnZXIoKS5zZXRDb25maWd1cmF0aW9uQ29udGV4dChjb25maWd1cmF0aW9uQ29udGV4dDIpOwotCi0gICAgICAgIGNvbmZpZ01hbmFnZXJMaXN0ZW5lcjEgPSBuZXcgRGVmYXVsdENvbmZpZ3VyYXRpb25NYW5hZ2VyTGlzdGVuZXIoKTsKLSAgICAgICAgY2x1c3Rlck1hbmFnZXIxLmdldENvbmZpZ3VyYXRpb25NYW5hZ2VyKCkuc2V0Q29uZmlndXJhdGlvbk1hbmFnZXJMaXN0ZW5lcihjb25maWdNYW5hZ2VyTGlzdGVuZXIxKTsKLSAgICAgICAgY29uZmlnTWFuYWdlckxpc3RlbmVyMiA9IG5ldyBEZWZhdWx0Q29uZmlndXJhdGlvbk1hbmFnZXJMaXN0ZW5lcigpOwotICAgICAgICBjbHVzdGVyTWFuYWdlcjIuZ2V0Q29uZmlndXJhdGlvbk1hbmFnZXIoKS5zZXRDb25maWd1cmF0aW9uTWFuYWdlckxpc3RlbmVyKGNvbmZpZ01hbmFnZXJMaXN0ZW5lcjIpOwotCi0gICAgICAgIC8vZ2l2aW5nIGJvdGggTm9kZXMgdGhlIHNhbWUgZGVwbG95bWVudCBjb25maWd1cmF0aW9uCi0gICAgICAgIGF4aXNDb25maWd1cmF0aW9uMSA9IGNvbmZpZ3VyYXRpb25Db250ZXh0MS5nZXRBeGlzQ29uZmlndXJhdGlvbigpOwotICAgICAgICBzZXJ2aWNlR3JvdXAxID0gbmV3IEF4aXNTZXJ2aWNlR3JvdXAoYXhpc0NvbmZpZ3VyYXRpb24xKTsKLSAgICAgICAgc2VydmljZTEgPSBuZXcgQXhpc1NlcnZpY2Uoc2VydmljZU5hbWUpOwotICAgICAgICBzZXJ2aWNlR3JvdXAxLmFkZFNlcnZpY2Uoc2VydmljZTEpOwotICAgICAgICBheGlzQ29uZmlndXJhdGlvbjEuYWRkU2VydmljZUdyb3VwKHNlcnZpY2VHcm91cDEpOwotCi0gICAgICAgIGF4aXNDb25maWd1cmF0aW9uMiA9IGNvbmZpZ3VyYXRpb25Db250ZXh0Mi5nZXRBeGlzQ29uZmlndXJhdGlvbigpOwotICAgICAgICBzZXJ2aWNlR3JvdXAyID0gbmV3IEF4aXNTZXJ2aWNlR3JvdXAoYXhpc0NvbmZpZ3VyYXRpb24yKTsKLSAgICAgICAgc2VydmljZTIgPSBuZXcgQXhpc1NlcnZpY2Uoc2VydmljZU5hbWUpOwotICAgICAgICBzZXJ2aWNlR3JvdXAyLmFkZFNlcnZpY2Uoc2VydmljZTIpOwotICAgICAgICBheGlzQ29uZmlndXJhdGlvbjIuYWRkU2VydmljZUdyb3VwKHNlcnZpY2VHcm91cDIpOwotCi0gICAgICAgIC8vSW5pdGlhdGluZyBDbHVzdGVyTWFuYWdlcnMKLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KENsdXN0ZXJpbmdDb25zdGFudHMuTE9DQUxfSVBfQUREUkVTUywgVXRpbHMuZ2V0SXBBZGRyZXNzKCkpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY2x1c3Rlck1hbmFnZXIxLmluaXQoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ2x1c3Rlck1hbmFnZXItMSBzdWNjZXNzZnVsbHkgaW5pdGlhbGl6ZWQiKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKioqIFBMRUFTRSBJR05PUkUgVEhFIGphdmEubmV0LkNvbm5lY3RFeGNlcHRpb24gU1RBQ0tUUkFDRVMuIFRISVMgSVMgRVhQRUNURUQgKioqIik7Ci0gICAgICAgICAgICBjbHVzdGVyTWFuYWdlcjIuaW5pdCgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDbHVzdGVyTWFuYWdlci0yIHN1Y2Nlc3NmdWxseSBpbml0aWFsaXplZCIpOwotICAgICAgICB9IGNhdGNoIChDbHVzdGVyaW5nRmF1bHQgZSkgewotICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPQotICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IGluaXRpYWxpemUgQ2x1c3Rlck1hbmFnZXJzLiBQbGVhc2UgY2hlY2sgdGhlIG5ldHdvcmsgY29ubmVjdGlvbiI7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4obWVzc2FnZSArICI6ICIgKyBlKTsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICBza2lwQ2hhbm5lbFRlc3RzID0gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnRlYXJEb3duKCk7Ci0gICAgICAgIGNsdXN0ZXJNYW5hZ2VyMS5zaHV0ZG93bigpOwotICAgICAgICBjbHVzdGVyTWFuYWdlcjIuc2h1dGRvd24oKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2NsdXN0ZXJpbmcvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvQ29udGV4dFJlcGxpY2F0aW9uVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvY2x1c3RlcmluZy90ZXN0L29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9Db250ZXh0UmVwbGljYXRpb25UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5MmIwOTAuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvY2x1c3RlcmluZy90ZXN0L29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9Db250ZXh0UmVwbGljYXRpb25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NjEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmc7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS51dGlsLlVVSURHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLlV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5jb25maWd1cmF0aW9uLkRlZmF1bHRDb25maWd1cmF0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuY29uZmlndXJhdGlvbi5EZWZhdWx0Q29uZmlndXJhdGlvbk1hbmFnZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuY29udGV4dC5Db250ZXh0TWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuY29udGV4dC5EZWZhdWx0Q29udGV4dE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLmNvbnRleHQuRGVmYXVsdENvbnRleHRNYW5hZ2VyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLnRyaWJlcy5UcmliZXNDbHVzdGVyTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuU2VydmljZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LlNlcnZpY2VHcm91cENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlR3JvdXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5QYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0NvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LkRhdGFncmFtUGFja2V0OwotaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOwotaW1wb3J0IGphdmEubmV0LkluZXRTb2NrZXRBZGRyZXNzOwotaW1wb3J0IGphdmEubmV0Lk11bHRpY2FzdFNvY2tldDsKLWltcG9ydCBqYXZhLm5ldC5TZXJ2ZXJTb2NrZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBUZXN0cyB0aGUgcmVwbGljYXRpb24gb2YgcHJvcGVydGllcyBwbGFjZWQgdGhlIENvbmZpZ3VyYXRpb25Db250ZXh0LCBTZXJ2aWNlR3JvdXBDb250ZXh0ICYKLSAqIFNlcnZpY2VDb250ZXh0Ci0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZXh0UmVwbGljYXRpb25UZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfU0VSVklDRV9OQU1FID0gInRlc3RTZXJ2aWNlIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhcmFtZXRlciBkb21haW5QYXJhbSA9Ci0gICAgICAgICAgICBuZXcgUGFyYW1ldGVyKENsdXN0ZXJpbmdDb25zdGFudHMuUGFyYW1ldGVycy5ET01BSU4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJheGlzMi5kb21haW4uIiArIFVVSURHZW5lcmF0b3IuZ2V0VVVJRCgpKTsKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLSBDbHVzdGVyLTEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHJpdmF0ZSBDbHVzdGVyTWFuYWdlciBjbHVzdGVyTWFuYWdlcjE7Ci0gICAgcHJpdmF0ZSBDb250ZXh0TWFuYWdlciBjdHhNYW4xOwotICAgIHByaXZhdGUgQ29uZmlndXJhdGlvbk1hbmFnZXIgY29uZmlnTWFuMTsKLSAgICBwcml2YXRlIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ3VyYXRpb25Db250ZXh0MTsKLSAgICBwcml2YXRlIEF4aXNTZXJ2aWNlR3JvdXAgc2VydmljZUdyb3VwMTsKLSAgICBwcml2YXRlIEF4aXNTZXJ2aWNlIHNlcnZpY2UxOwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0gQ2x1c3Rlci0yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHByaXZhdGUgQ2x1c3Rlck1hbmFnZXIgY2x1c3Rlck1hbmFnZXIyOwotICAgIHByaXZhdGUgQ29udGV4dE1hbmFnZXIgY3R4TWFuMjsKLSAgICBwcml2YXRlIENvbmZpZ3VyYXRpb25NYW5hZ2VyIGNvbmZpZ01hbjI7Ci0gICAgcHJpdmF0ZSBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWd1cmF0aW9uQ29udGV4dDI7Ci0gICAgcHJpdmF0ZSBBeGlzU2VydmljZUdyb3VwIHNlcnZpY2VHcm91cDI7Ci0gICAgcHJpdmF0ZSBBeGlzU2VydmljZSBzZXJ2aWNlMjsKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjYW5SdW5UZXN0czsKLQotICAgIHByaXZhdGUgaW50IGdldFBvcnQoaW50IHBvcnRTdGFydCwgaW50IHJldHJpZXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIEluZXRTb2NrZXRBZGRyZXNzIGFkZHIgPSBudWxsOwotICAgICAgICBTZXJ2ZXJTb2NrZXQgc29ja2V0ID0gbmV3IFNlcnZlclNvY2tldCgpOwotICAgICAgICBpbnQgcG9ydCA9IC0xOwotICAgICAgICB3aGlsZSAocmV0cmllcyA+IDApIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYWRkciA9IG5ldyBJbmV0U29ja2V0QWRkcmVzcyhJbmV0QWRkcmVzcy5nZXRCeU5hbWUoSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCkuZ2V0SG9zdEFkZHJlc3MoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0U3RhcnQpOwotICAgICAgICAgICAgICAgIHNvY2tldC5iaW5kKGFkZHIpOwotICAgICAgICAgICAgICAgIHBvcnQgPSBwb3J0U3RhcnQ7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDYW4gYmluZCBTZXJ2ZXIgU29ja2V0IHRvOiIgKyBhZGRyKTsKLSAgICAgICAgICAgICAgICBzb2NrZXQuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIHgpIHsKLSAgICAgICAgICAgICAgICByZXRyaWVzLS07Ci0gICAgICAgICAgICAgICAgaWYgKHJldHJpZXMgPD0gMCkgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlVuYWJsZSB0byBiaW5kIHNlcnZlciBzb2NrZXQgdG86IiArIGFkZHIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiB0aHJvd2luZyBlcnJvci4iKTsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgeDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcG9ydFN0YXJ0Kys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHBvcnQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNhblJ1blRlc3RzKCkgewotICAgICAgICBpZihTeXN0ZW0uZ2V0UHJvcGVydHkoInJ1bi5jbHVzdGVyaW5nLnRlc3RzIiwgImZhbHNlIikuZXF1YWxzKCJmYWxzZSIpKXsKLSAgICAgICAgICAgIGNhblJ1blRlc3RzID0gZmFsc2U7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBXaGljaCBwb3J0IHNob3VsZCB3ZSBsaXN0ZW4gdG8KLSAgICAgICAgZmluYWwgaW50IHBvcnQ7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBwb3J0ID0gZ2V0UG9ydCg0MDAwLCAxMDAwKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIGNhblJ1blRlc3RzID0gZmFsc2U7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBXaGljaCBhZGRyZXNzCi0gICAgICAgIGZpbmFsIFN0cmluZyBncm91cCA9ICIyMjUuNC41LjYiOwotCi0gICAgICAgIFRocmVhZCByZWNlaXZlciA9IG5ldyBUaHJlYWQoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgTXVsdGljYXN0U29ja2V0IHMgPSBuZXcgTXVsdGljYXN0U29ja2V0KHBvcnQpOwotICAgICAgICAgICAgICAgICAgICBzLmpvaW5Hcm91cChJbmV0QWRkcmVzcy5nZXRCeU5hbWUoZ3JvdXApKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBEYXRhZ3JhbVBhY2tldCBhbmQgZG8gYSByZWNlaXZlCi0gICAgICAgICAgICAgICAgICAgIGJ5dGUgYnVmW10gPSBuZXcgYnl0ZVsxMDI0XTsKLSAgICAgICAgICAgICAgICAgICAgRGF0YWdyYW1QYWNrZXQgcGFjayA9IG5ldyBEYXRhZ3JhbVBhY2tldChidWYsIGJ1Zi5sZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICBzLnJlY2VpdmUocGFjayk7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUmVjZWl2ZWQgZGF0YSBmcm9tOiAiICsgcGFjay5nZXRBZGRyZXNzKCkudG9TdHJpbmcoKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiOiIgKyBwYWNrLmdldFBvcnQoKSArICIgd2l0aCBsZW5ndGg6ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFjay5nZXRMZW5ndGgoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHMubGVhdmVHcm91cChJbmV0QWRkcmVzcy5nZXRCeU5hbWUoZ3JvdXApKTsKLSAgICAgICAgICAgICAgICAgICAgcy5jbG9zZSgpOwotICAgICAgICAgICAgICAgICAgICBjYW5SdW5UZXN0cyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgY2FuUnVuVGVzdHMgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIHJlY2VpdmVyLnN0YXJ0KCk7Ci0KLSAgICAgICAgVGhyZWFkIHNlbmRlciA9IG5ldyBUaHJlYWQoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgTXVsdGljYXN0U29ja2V0IHMgPSBuZXcgTXVsdGljYXN0U29ja2V0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGJ5dGUgYnVmW10gPSBuZXcgYnl0ZVsxMF07Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYnVmLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBidWZbaV0gPSAoYnl0ZSkgaTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBEYXRhZ3JhbVBhY2tldCBwYWNrID0gbmV3IERhdGFncmFtUGFja2V0KGJ1ZiwgYnVmLmxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmV0QWRkcmVzcy5nZXRCeU5hbWUoZ3JvdXApLCBwb3J0KTsKLSAgICAgICAgICAgICAgICAgICAgcy5zZXRUaW1lVG9MaXZlKDIpOwotICAgICAgICAgICAgICAgICAgICBzLnNlbmQocGFjayk7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU2VudCB0ZXN0IGRhdGEiKTsKLSAgICAgICAgICAgICAgICAgICAgcy5jbG9zZSgpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGNhblJ1blRlc3RzID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICBzZW5kZXIuc3RhcnQoKTsKLQotICAgICAgICAvLyBKb2luIHRoZSByZWNlaXZlciB1bnRpbCB3ZSBjYW4gdmVyaWZ5IHdoZXRoZXIgbXVsdGljYXN0aW5nIGNhbiBiZSBkb25lCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZWNlaXZlci5qb2luKDEwMDAwKTsKLSAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgbmV3IENvbnRleHRSZXBsaWNhdGlvblRlc3QoKS5jYW5SdW5UZXN0cygpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGNhblJ1blRlc3RzKCk7Ci0gICAgICAgIGlmICghY2FuUnVuVGVzdHMpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiW1dBUk5JTkddIEFib3J0aW5nIGNsdXN0ZXJpbmcgdGVzdHMiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eShDbHVzdGVyaW5nQ29uc3RhbnRzLkxPQ0FMX0lQX0FERFJFU1MsIFV0aWxzLmdldElwQWRkcmVzcygpKTsKLQotICAgICAgICAvLyBGaXJzdCBjbHVzdGVyCi0gICAgICAgIGNvbmZpZ3VyYXRpb25Db250ZXh0MSA9Ci0gICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5LmNyZWF0ZURlZmF1bHRDb25maWd1cmF0aW9uQ29udGV4dCgpOwotICAgICAgICBzZXJ2aWNlR3JvdXAxID0gY3JlYXRlQXhpc1NlcnZpY2VHcm91cChjb25maWd1cmF0aW9uQ29udGV4dDEpOwotICAgICAgICBzZXJ2aWNlMSA9IGNyZWF0ZUF4aXNTZXJ2aWNlKHNlcnZpY2VHcm91cDEpOwotICAgICAgICBjdHhNYW4xID0gZ2V0Q29udGV4dE1hbmFnZXIoKTsKLSAgICAgICAgY29uZmlnTWFuMSA9IGdldENvbmZpZ3VyYXRpb25NYW5hZ2VyKCk7Ci0gICAgICAgIGNsdXN0ZXJNYW5hZ2VyMSA9IGdldENsdXN0ZXJNYW5hZ2VyKGNvbmZpZ3VyYXRpb25Db250ZXh0MSwgY3R4TWFuMSwgY29uZmlnTWFuMSk7Ci0gICAgICAgIGNsdXN0ZXJNYW5hZ2VyMS5hZGRQYXJhbWV0ZXIoZG9tYWluUGFyYW0pOwotICAgICAgICBjbHVzdGVyTWFuYWdlcjEuaW5pdCgpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0gQ2x1c3Rlck1hbmFnZXItMSBzdWNjZXNzZnVsbHkgaW5pdGlhbGl6ZWQgLS0tLS0tLS0tLS0iKTsKLQotICAgICAgICAvLyBTZWNvbmQgY2x1c3RlcgotICAgICAgICBjb25maWd1cmF0aW9uQ29udGV4dDIgPQotICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeS5jcmVhdGVEZWZhdWx0Q29uZmlndXJhdGlvbkNvbnRleHQoKTsKLSAgICAgICAgc2VydmljZUdyb3VwMiA9IGNyZWF0ZUF4aXNTZXJ2aWNlR3JvdXAoY29uZmlndXJhdGlvbkNvbnRleHQyKTsKLSAgICAgICAgc2VydmljZTIgPSBjcmVhdGVBeGlzU2VydmljZShzZXJ2aWNlR3JvdXAyKTsKLSAgICAgICAgY3R4TWFuMiA9IGdldENvbnRleHRNYW5hZ2VyKCk7Ci0gICAgICAgIGNvbmZpZ01hbjIgPSBnZXRDb25maWd1cmF0aW9uTWFuYWdlcigpOwotICAgICAgICBjbHVzdGVyTWFuYWdlcjIgPSBnZXRDbHVzdGVyTWFuYWdlcihjb25maWd1cmF0aW9uQ29udGV4dDIsIGN0eE1hbjIsIGNvbmZpZ01hbjIpOwotICAgICAgICBjbHVzdGVyTWFuYWdlcjIuYWRkUGFyYW1ldGVyKGRvbWFpblBhcmFtKTsKLSAgICAgICAgY2x1c3Rlck1hbmFnZXIyLmluaXQoKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tLS0tIENsdXN0ZXJNYW5hZ2VyLTIgc3VjY2Vzc2Z1bGx5IGluaXRpYWxpemVkIC0tLS0tLS0tLS0tIik7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIENsdXN0ZXJNYW5hZ2VyIGdldENsdXN0ZXJNYW5hZ2VyKENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGV4dE1hbmFnZXIgY29udGV4dE1hbmFnZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb25NYW5hZ2VyIGNvbmZpZ01hbmFnZXIpCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgQ2x1c3Rlck1hbmFnZXIgY2x1c3Rlck1hbmFnZXIgPSBuZXcgVHJpYmVzQ2x1c3Rlck1hbmFnZXIoKTsKLSAgICAgICAgY29uZmlnQ3R4LmdldEF4aXNDb25maWd1cmF0aW9uKCkuc2V0Q2x1c3Rlck1hbmFnZXIoY2x1c3Rlck1hbmFnZXIpOwotCi0gICAgICAgIGNvbmZpZ01hbmFnZXIuCi0gICAgICAgICAgICAgICAgc2V0Q29uZmlndXJhdGlvbk1hbmFnZXJMaXN0ZW5lcihuZXcgRGVmYXVsdENvbmZpZ3VyYXRpb25NYW5hZ2VyTGlzdGVuZXIoKSk7Ci0gICAgICAgIGNsdXN0ZXJNYW5hZ2VyLnNldENvbmZpZ3VyYXRpb25NYW5hZ2VyKGNvbmZpZ01hbmFnZXIpOwotCi0gICAgICAgIGNvbnRleHRNYW5hZ2VyLnNldENvbnRleHRNYW5hZ2VyTGlzdGVuZXIobmV3IERlZmF1bHRDb250ZXh0TWFuYWdlckxpc3RlbmVyKCkpOwotICAgICAgICBjbHVzdGVyTWFuYWdlci5zZXRDb250ZXh0TWFuYWdlcihjb250ZXh0TWFuYWdlcik7Ci0KLSAgICAgICAgY2x1c3Rlck1hbmFnZXIuc2V0Q29uZmlndXJhdGlvbkNvbnRleHQoY29uZmlnQ3R4KTsKLQotICAgICAgICByZXR1cm4gY2x1c3Rlck1hbmFnZXI7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIEF4aXNTZXJ2aWNlR3JvdXAgY3JlYXRlQXhpc1NlcnZpY2VHcm91cChDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDdHgpCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZyA9IGNvbmZpZ0N0eC5nZXRBeGlzQ29uZmlndXJhdGlvbigpOwotICAgICAgICBBeGlzU2VydmljZUdyb3VwIHNlcnZpY2VHcm91cCA9IG5ldyBBeGlzU2VydmljZUdyb3VwKGF4aXNDb25maWcpOwotICAgICAgICBheGlzQ29uZmlnLmFkZFNlcnZpY2VHcm91cChzZXJ2aWNlR3JvdXApOwotICAgICAgICByZXR1cm4gc2VydmljZUdyb3VwOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBBeGlzU2VydmljZSBjcmVhdGVBeGlzU2VydmljZShBeGlzU2VydmljZUdyb3VwIHNlcnZpY2VHcm91cCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgQXhpc1NlcnZpY2UoVEVTVF9TRVJWSUNFX05BTUUpOwotICAgICAgICBzZXJ2aWNlR3JvdXAuYWRkU2VydmljZShzZXJ2aWNlKTsKLSAgICAgICAgcmV0dXJuIHNlcnZpY2U7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIENvbnRleHRNYW5hZ2VyIGdldENvbnRleHRNYW5hZ2VyKCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIENvbnRleHRNYW5hZ2VyIGNvbnRleHRNYW5hZ2VyID0gbmV3IERlZmF1bHRDb250ZXh0TWFuYWdlcigpOwotICAgICAgICBjb250ZXh0TWFuYWdlci5zZXRDb250ZXh0TWFuYWdlckxpc3RlbmVyKG5ldyBEZWZhdWx0Q29udGV4dE1hbmFnZXJMaXN0ZW5lcigpKTsKLSAgICAgICAgcmV0dXJuIGNvbnRleHRNYW5hZ2VyOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBDb25maWd1cmF0aW9uTWFuYWdlciBnZXRDb25maWd1cmF0aW9uTWFuYWdlcigpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBDb25maWd1cmF0aW9uTWFuYWdlciBjb250ZXh0TWFuYWdlciA9IG5ldyBEZWZhdWx0Q29uZmlndXJhdGlvbk1hbmFnZXIoKTsKLSAgICAgICAgY29udGV4dE1hbmFnZXIuc2V0Q29uZmlndXJhdGlvbk1hbmFnZXJMaXN0ZW5lcihuZXcgRGVmYXVsdENvbmZpZ3VyYXRpb25NYW5hZ2VyTGlzdGVuZXIoKSk7Ci0gICAgICAgIHJldHVybiBjb250ZXh0TWFuYWdlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0UHJvcGVydHlJbkNvbmZpZ3VyYXRpb25Db250ZXh0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghY2FuUnVuVGVzdHMpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBrZXkxID0gImNvbmZpZ0N0eEtleSI7Ci0gICAgICAgICAgICBTdHJpbmcgdmFsMSA9ICJjb25maWdDdHhWYWwxIjsKLSAgICAgICAgICAgIGNvbmZpZ3VyYXRpb25Db250ZXh0MS5zZXRQcm9wZXJ0eShrZXkxLCB2YWwxKTsKLSAgICAgICAgICAgIGN0eE1hbjEudXBkYXRlQ29udGV4dChjb25maWd1cmF0aW9uQ29udGV4dDEpOwotICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gKFN0cmluZykgY29uZmlndXJhdGlvbkNvbnRleHQyLmdldFByb3BlcnR5KGtleTEpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbDEsIHZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBrZXkyID0gImNvbmZpZ0N0eEtleTIiOwotICAgICAgICAgICAgU3RyaW5nIHZhbDIgPSAiY29uZmlnQ3R4VmFsMSI7Ci0gICAgICAgICAgICBjb25maWd1cmF0aW9uQ29udGV4dDIuc2V0UHJvcGVydHkoa2V5MiwgdmFsMik7Ci0gICAgICAgICAgICBjdHhNYW4yLnVwZGF0ZUNvbnRleHQoY29uZmlndXJhdGlvbkNvbnRleHQyKTsKLSAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsKLSAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IChTdHJpbmcpIGNvbmZpZ3VyYXRpb25Db250ZXh0MS5nZXRQcm9wZXJ0eShrZXkyKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyh2YWwyLCB2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlUHJvcGVydHlGcm9tQ29uZmlndXJhdGlvbkNvbnRleHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFjYW5SdW5UZXN0cykgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGtleTEgPSAiY29uZmlnQ3R4S2V5IjsKLSAgICAgICAgU3RyaW5nIHZhbDEgPSAiY29uZmlnQ3R4VmFsMSI7Ci0KLSAgICAgICAgLy8gRmlyc3Qgc2V0IHRoZSBwcm9wZXJ0eSBvbiBhIGNsdXN0ZXIgMSBhbmQgcmVwbGljYXRlIGl0Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGNvbmZpZ3VyYXRpb25Db250ZXh0MS5zZXRQcm9wZXJ0eShrZXkxLCB2YWwxKTsKLSAgICAgICAgICAgIGN0eE1hbjEudXBkYXRlQ29udGV4dChjb25maWd1cmF0aW9uQ29udGV4dDEpOwotICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gKFN0cmluZykgY29uZmlndXJhdGlvbkNvbnRleHQyLmdldFByb3BlcnR5KGtleTEpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbDEsIHZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIE5leHQgcmVtb3ZlIHRoaXMgcHJvcGVydHkgZnJvbSBjbHVzdGVyIDIsIHJlcGxpY2F0ZSBpdCwgYW5kIGNoZWNrIHRoYXQgaXQgaXMgdW5hdmFpbGFibGUgaW4gY2x1c3RlciAxCi0gICAgICAgIGNvbmZpZ3VyYXRpb25Db250ZXh0Mi5yZW1vdmVQcm9wZXJ0eShrZXkxKTsKLSAgICAgICAgY3R4TWFuMi51cGRhdGVDb250ZXh0KGNvbmZpZ3VyYXRpb25Db250ZXh0Mik7Ci0gICAgICAgIFN0cmluZyB2YWx1ZSA9IChTdHJpbmcpIGNvbmZpZ3VyYXRpb25Db250ZXh0MS5nZXRQcm9wZXJ0eShrZXkxKTsKLSAgICAgICAgYXNzZXJ0TnVsbChjb25maWd1cmF0aW9uQ29udGV4dDIuZ2V0UHJvcGVydHkoa2V5MSkpOwotICAgICAgICBhc3NlcnROdWxsKHZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0UHJvcGVydHlJblNlcnZpY2VHcm91cENvbnRleHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFjYW5SdW5UZXN0cykgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgU2VydmljZUdyb3VwQ29udGV4dCBzZXJ2aWNlR3JvdXBDb250ZXh0MSA9Ci0gICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbkNvbnRleHQxLmNyZWF0ZVNlcnZpY2VHcm91cENvbnRleHQoc2VydmljZUdyb3VwMSk7Ci0gICAgICAgIHNlcnZpY2VHcm91cENvbnRleHQxLnNldElkKFRFU1RfU0VSVklDRV9OQU1FKTsKLSAgICAgICAgY29uZmlndXJhdGlvbkNvbnRleHQxLmFkZFNlcnZpY2VHcm91cENvbnRleHRJbnRvQXBwbGljYXRpb25TY29wZVRhYmxlKHNlcnZpY2VHcm91cENvbnRleHQxKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlR3JvdXBDb250ZXh0MSk7Ci0KLSAgICAgICAgU2VydmljZUdyb3VwQ29udGV4dCBzZXJ2aWNlR3JvdXBDb250ZXh0MiA9Ci0gICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbkNvbnRleHQyLmNyZWF0ZVNlcnZpY2VHcm91cENvbnRleHQoc2VydmljZUdyb3VwMik7Ci0gICAgICAgIHNlcnZpY2VHcm91cENvbnRleHQyLnNldElkKFRFU1RfU0VSVklDRV9OQU1FKTsKLSAgICAgICAgY29uZmlndXJhdGlvbkNvbnRleHQyLmFkZFNlcnZpY2VHcm91cENvbnRleHRJbnRvQXBwbGljYXRpb25TY29wZVRhYmxlKHNlcnZpY2VHcm91cENvbnRleHQyKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlR3JvdXBDb250ZXh0Mik7Ci0KLSAgICAgICAgU3RyaW5nIGtleTEgPSAic2dDdHhLZXkiOwotICAgICAgICBTdHJpbmcgdmFsMSA9ICJzZ0N0eFZhbDEiOwotICAgICAgICBzZXJ2aWNlR3JvdXBDb250ZXh0MS5zZXRQcm9wZXJ0eShrZXkxLCB2YWwxKTsKLSAgICAgICAgY3R4TWFuMS51cGRhdGVDb250ZXh0KHNlcnZpY2VHcm91cENvbnRleHQxKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbDEsIHNlcnZpY2VHcm91cENvbnRleHQyLmdldFByb3BlcnR5KGtleTEpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlUHJvcGVydHlGcm9tU2VydmljZUdyb3VwQ29udGV4dCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIWNhblJ1blRlc3RzKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBBZGQgdGhlIHByb3BlcnR5Ci0gICAgICAgIFNlcnZpY2VHcm91cENvbnRleHQgc2VydmljZUdyb3VwQ29udGV4dDEgPQotICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb25Db250ZXh0MS5jcmVhdGVTZXJ2aWNlR3JvdXBDb250ZXh0KHNlcnZpY2VHcm91cDEpOwotICAgICAgICBzZXJ2aWNlR3JvdXBDb250ZXh0MS5zZXRJZChURVNUX1NFUlZJQ0VfTkFNRSk7Ci0gICAgICAgIGNvbmZpZ3VyYXRpb25Db250ZXh0MS5hZGRTZXJ2aWNlR3JvdXBDb250ZXh0SW50b0FwcGxpY2F0aW9uU2NvcGVUYWJsZShzZXJ2aWNlR3JvdXBDb250ZXh0MSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZUdyb3VwQ29udGV4dDEpOwotCi0gICAgICAgIFNlcnZpY2VHcm91cENvbnRleHQgc2VydmljZUdyb3VwQ29udGV4dDIgPQotICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb25Db250ZXh0Mi5jcmVhdGVTZXJ2aWNlR3JvdXBDb250ZXh0KHNlcnZpY2VHcm91cDIpOwotICAgICAgICBzZXJ2aWNlR3JvdXBDb250ZXh0Mi5zZXRJZChURVNUX1NFUlZJQ0VfTkFNRSk7Ci0gICAgICAgIGNvbmZpZ3VyYXRpb25Db250ZXh0Mi5hZGRTZXJ2aWNlR3JvdXBDb250ZXh0SW50b0FwcGxpY2F0aW9uU2NvcGVUYWJsZShzZXJ2aWNlR3JvdXBDb250ZXh0Mik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZUdyb3VwQ29udGV4dDIpOwotCi0gICAgICAgIFN0cmluZyBrZXkxID0gInNnQ3R4S2V5IjsKLSAgICAgICAgU3RyaW5nIHZhbDEgPSAic2dDdHhWYWwxIjsKLSAgICAgICAgc2VydmljZUdyb3VwQ29udGV4dDEuc2V0UHJvcGVydHkoa2V5MSwgdmFsMSk7Ci0gICAgICAgIGN0eE1hbjEudXBkYXRlQ29udGV4dChzZXJ2aWNlR3JvdXBDb250ZXh0MSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyh2YWwxLCBzZXJ2aWNlR3JvdXBDb250ZXh0Mi5nZXRQcm9wZXJ0eShrZXkxKSk7Ci0KLSAgICAgICAgLy8gUmVtb3ZlIHRoZSBwcm9wZXJ0eQotICAgICAgICBzZXJ2aWNlR3JvdXBDb250ZXh0Mi5yZW1vdmVQcm9wZXJ0eShrZXkxKTsKLSAgICAgICAgYXNzZXJ0TnVsbChzZXJ2aWNlR3JvdXBDb250ZXh0Mi5nZXRQcm9wZXJ0eShrZXkxKSk7Ci0gICAgICAgIGN0eE1hbjIudXBkYXRlQ29udGV4dChzZXJ2aWNlR3JvdXBDb250ZXh0Mik7Ci0gICAgICAgIGFzc2VydE51bGwoc2VydmljZUdyb3VwQ29udGV4dDEuZ2V0UHJvcGVydHkoa2V5MSkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRQcm9wZXJ0eUluU2VydmljZUdyb3VwQ29udGV4dDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFjYW5SdW5UZXN0cykgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIHNnY0lEID0gVVVJREdlbmVyYXRvci5nZXRVVUlEKCk7Ci0KLSAgICAgICAgU2VydmljZUdyb3VwQ29udGV4dCBzZXJ2aWNlR3JvdXBDb250ZXh0MSA9Ci0gICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbkNvbnRleHQxLmNyZWF0ZVNlcnZpY2VHcm91cENvbnRleHQoc2VydmljZUdyb3VwMSk7Ci0gICAgICAgIHNlcnZpY2VHcm91cENvbnRleHQxLnNldElkKHNnY0lEKTsKLSAgICAgICAgY29uZmlndXJhdGlvbkNvbnRleHQxLmFkZFNlcnZpY2VHcm91cENvbnRleHRJbnRvU29hcFNlc3Npb25UYWJsZShzZXJ2aWNlR3JvdXBDb250ZXh0MSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZUdyb3VwQ29udGV4dDEpOwotCi0gICAgICAgIFNlcnZpY2VHcm91cENvbnRleHQgc2VydmljZUdyb3VwQ29udGV4dDIgPQotICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb25Db250ZXh0Mi5jcmVhdGVTZXJ2aWNlR3JvdXBDb250ZXh0KHNlcnZpY2VHcm91cDIpOwotICAgICAgICBzZXJ2aWNlR3JvdXBDb250ZXh0Mi5zZXRJZChzZ2NJRCk7Ci0gICAgICAgIGNvbmZpZ3VyYXRpb25Db250ZXh0Mi5hZGRTZXJ2aWNlR3JvdXBDb250ZXh0SW50b1NvYXBTZXNzaW9uVGFibGUoc2VydmljZUdyb3VwQ29udGV4dDIpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2VHcm91cENvbnRleHQyKTsKLQotICAgICAgICBTdHJpbmcga2V5MSA9ICJzZ0N0eEtleSI7Ci0gICAgICAgIFN0cmluZyB2YWwxID0gInNnQ3R4VmFsMSI7Ci0gICAgICAgIHNlcnZpY2VHcm91cENvbnRleHQxLnNldFByb3BlcnR5KGtleTEsIHZhbDEpOwotICAgICAgICBjdHhNYW4xLnVwZGF0ZUNvbnRleHQoc2VydmljZUdyb3VwQ29udGV4dDEpOwotCi0gICAgICAgIGFzc2VydEVxdWFscyh2YWwxLCBzZXJ2aWNlR3JvdXBDb250ZXh0Mi5nZXRQcm9wZXJ0eShrZXkxKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFJlbW92ZVByb3BlcnR5RnJvbVNlcnZpY2VHcm91cENvbnRleHQyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghY2FuUnVuVGVzdHMpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEFkZCB0aGUgcHJvcGVydHkKLSAgICAgICAgU3RyaW5nIHNnY0lEID0gVVVJREdlbmVyYXRvci5nZXRVVUlEKCk7Ci0KLSAgICAgICAgU2VydmljZUdyb3VwQ29udGV4dCBzZXJ2aWNlR3JvdXBDb250ZXh0MSA9Ci0gICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbkNvbnRleHQxLmNyZWF0ZVNlcnZpY2VHcm91cENvbnRleHQoc2VydmljZUdyb3VwMSk7Ci0gICAgICAgIHNlcnZpY2VHcm91cENvbnRleHQxLnNldElkKHNnY0lEKTsKLSAgICAgICAgY29uZmlndXJhdGlvbkNvbnRleHQxLmFkZFNlcnZpY2VHcm91cENvbnRleHRJbnRvU29hcFNlc3Npb25UYWJsZShzZXJ2aWNlR3JvdXBDb250ZXh0MSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZUdyb3VwQ29udGV4dDEpOwotCi0gICAgICAgIFNlcnZpY2VHcm91cENvbnRleHQgc2VydmljZUdyb3VwQ29udGV4dDIgPQotICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb25Db250ZXh0Mi5jcmVhdGVTZXJ2aWNlR3JvdXBDb250ZXh0KHNlcnZpY2VHcm91cDIpOwotICAgICAgICBzZXJ2aWNlR3JvdXBDb250ZXh0Mi5zZXRJZChzZ2NJRCk7Ci0gICAgICAgIGNvbmZpZ3VyYXRpb25Db250ZXh0Mi5hZGRTZXJ2aWNlR3JvdXBDb250ZXh0SW50b1NvYXBTZXNzaW9uVGFibGUoc2VydmljZUdyb3VwQ29udGV4dDIpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2VHcm91cENvbnRleHQyKTsKLQotICAgICAgICBTdHJpbmcga2V5MSA9ICJzZ0N0eEtleSI7Ci0gICAgICAgIFN0cmluZyB2YWwxID0gInNnQ3R4VmFsMSI7Ci0gICAgICAgIHNlcnZpY2VHcm91cENvbnRleHQxLnNldFByb3BlcnR5KGtleTEsIHZhbDEpOwotICAgICAgICBjdHhNYW4xLnVwZGF0ZUNvbnRleHQoc2VydmljZUdyb3VwQ29udGV4dDEpOwotCi0gICAgICAgIGFzc2VydEVxdWFscyh2YWwxLCBzZXJ2aWNlR3JvdXBDb250ZXh0Mi5nZXRQcm9wZXJ0eShrZXkxKSk7Ci0KLSAgICAgICAgLy8gUmVtb3ZlIHRoZSBwcm9wZXJ0eQotICAgICAgICBzZXJ2aWNlR3JvdXBDb250ZXh0Mi5yZW1vdmVQcm9wZXJ0eShrZXkxKTsKLSAgICAgICAgYXNzZXJ0TnVsbChzZXJ2aWNlR3JvdXBDb250ZXh0Mi5nZXRQcm9wZXJ0eShrZXkxKSk7Ci0gICAgICAgIGN0eE1hbjIudXBkYXRlQ29udGV4dChzZXJ2aWNlR3JvdXBDb250ZXh0Mik7Ci0gICAgICAgIGFzc2VydE51bGwoc2VydmljZUdyb3VwQ29udGV4dDEuZ2V0UHJvcGVydHkoa2V5MSkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRQcm9wZXJ0eUluU2VydmljZUNvbnRleHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFjYW5SdW5UZXN0cykgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgU2VydmljZUdyb3VwQ29udGV4dCBzZXJ2aWNlR3JvdXBDb250ZXh0MSA9Ci0gICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbkNvbnRleHQxLmNyZWF0ZVNlcnZpY2VHcm91cENvbnRleHQoc2VydmljZUdyb3VwMSk7Ci0gICAgICAgIHNlcnZpY2VHcm91cENvbnRleHQxLnNldElkKFRFU1RfU0VSVklDRV9OQU1FKTsKLSAgICAgICAgU2VydmljZUNvbnRleHQgc2VydmljZUNvbnRleHQxID0gc2VydmljZUdyb3VwQ29udGV4dDEuZ2V0U2VydmljZUNvbnRleHQoc2VydmljZTEpOwotICAgICAgICBjb25maWd1cmF0aW9uQ29udGV4dDEuYWRkU2VydmljZUdyb3VwQ29udGV4dEludG9BcHBsaWNhdGlvblNjb3BlVGFibGUoc2VydmljZUdyb3VwQ29udGV4dDEpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2VHcm91cENvbnRleHQxKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlQ29udGV4dDEpOwotCi0gICAgICAgIFNlcnZpY2VHcm91cENvbnRleHQgc2VydmljZUdyb3VwQ29udGV4dDIgPQotICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb25Db250ZXh0Mi5jcmVhdGVTZXJ2aWNlR3JvdXBDb250ZXh0KHNlcnZpY2VHcm91cDIpOwotICAgICAgICBzZXJ2aWNlR3JvdXBDb250ZXh0Mi5zZXRJZChURVNUX1NFUlZJQ0VfTkFNRSk7Ci0gICAgICAgIFNlcnZpY2VDb250ZXh0IHNlcnZpY2VDb250ZXh0MiA9IHNlcnZpY2VHcm91cENvbnRleHQyLmdldFNlcnZpY2VDb250ZXh0KHNlcnZpY2UyKTsKLSAgICAgICAgY29uZmlndXJhdGlvbkNvbnRleHQyLmFkZFNlcnZpY2VHcm91cENvbnRleHRJbnRvQXBwbGljYXRpb25TY29wZVRhYmxlKHNlcnZpY2VHcm91cENvbnRleHQyKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlR3JvdXBDb250ZXh0Mik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZUNvbnRleHQyKTsKLQotICAgICAgICBTdHJpbmcga2V5MSA9ICJzZ0N0eEtleSI7Ci0gICAgICAgIFN0cmluZyB2YWwxID0gInNnQ3R4VmFsMSI7Ci0gICAgICAgIHNlcnZpY2VDb250ZXh0MS5zZXRQcm9wZXJ0eShrZXkxLCB2YWwxKTsKLSAgICAgICAgY3R4TWFuMS51cGRhdGVDb250ZXh0KHNlcnZpY2VDb250ZXh0MSk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbDEsIHNlcnZpY2VDb250ZXh0Mi5nZXRQcm9wZXJ0eShrZXkxKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNldFByb3BlcnR5SW5TZXJ2aWNlQ29udGV4dDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFjYW5SdW5UZXN0cykgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgU2VydmljZUdyb3VwQ29udGV4dCBzZXJ2aWNlR3JvdXBDb250ZXh0MSA9Ci0gICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbkNvbnRleHQxLmNyZWF0ZVNlcnZpY2VHcm91cENvbnRleHQoc2VydmljZUdyb3VwMSk7Ci0gICAgICAgIHNlcnZpY2VHcm91cENvbnRleHQxLnNldElkKFRFU1RfU0VSVklDRV9OQU1FKTsKLSAgICAgICAgU2VydmljZUNvbnRleHQgc2VydmljZUNvbnRleHQxID0gc2VydmljZUdyb3VwQ29udGV4dDEuZ2V0U2VydmljZUNvbnRleHQoc2VydmljZTEpOwotICAgICAgICBjb25maWd1cmF0aW9uQ29udGV4dDEuYWRkU2VydmljZUdyb3VwQ29udGV4dEludG9Tb2FwU2Vzc2lvblRhYmxlKHNlcnZpY2VHcm91cENvbnRleHQxKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlR3JvdXBDb250ZXh0MSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZUNvbnRleHQxKTsKLQotICAgICAgICBTZXJ2aWNlR3JvdXBDb250ZXh0IHNlcnZpY2VHcm91cENvbnRleHQyID0KLSAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uQ29udGV4dDIuY3JlYXRlU2VydmljZUdyb3VwQ29udGV4dChzZXJ2aWNlR3JvdXAyKTsKLSAgICAgICAgc2VydmljZUdyb3VwQ29udGV4dDIuc2V0SWQoVEVTVF9TRVJWSUNFX05BTUUpOwotICAgICAgICBTZXJ2aWNlQ29udGV4dCBzZXJ2aWNlQ29udGV4dDIgPSBzZXJ2aWNlR3JvdXBDb250ZXh0Mi5nZXRTZXJ2aWNlQ29udGV4dChzZXJ2aWNlMik7Ci0gICAgICAgIGNvbmZpZ3VyYXRpb25Db250ZXh0Mi5hZGRTZXJ2aWNlR3JvdXBDb250ZXh0SW50b1NvYXBTZXNzaW9uVGFibGUoc2VydmljZUdyb3VwQ29udGV4dDIpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2VHcm91cENvbnRleHQyKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlQ29udGV4dDIpOwotCi0gICAgICAgIFN0cmluZyBrZXkxID0gInNnQ3R4S2V5IjsKLSAgICAgICAgU3RyaW5nIHZhbDEgPSAic2dDdHhWYWwxIjsKLSAgICAgICAgc2VydmljZUNvbnRleHQxLnNldFByb3BlcnR5KGtleTEsIHZhbDEpOwotICAgICAgICBjdHhNYW4xLnVwZGF0ZUNvbnRleHQoc2VydmljZUNvbnRleHQxKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHModmFsMSwgc2VydmljZUNvbnRleHQyLmdldFByb3BlcnR5KGtleTEpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlUHJvcGVydHlGcm9tU2VydmljZUNvbnRleHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFjYW5SdW5UZXN0cykgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQWRkIHRoZSBwcm9wZXJ0eQotICAgICAgICBTZXJ2aWNlR3JvdXBDb250ZXh0IHNlcnZpY2VHcm91cENvbnRleHQxID0KLSAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uQ29udGV4dDEuY3JlYXRlU2VydmljZUdyb3VwQ29udGV4dChzZXJ2aWNlR3JvdXAxKTsKLSAgICAgICAgc2VydmljZUdyb3VwQ29udGV4dDEuc2V0SWQoVEVTVF9TRVJWSUNFX05BTUUpOwotICAgICAgICBTZXJ2aWNlQ29udGV4dCBzZXJ2aWNlQ29udGV4dDEgPSBzZXJ2aWNlR3JvdXBDb250ZXh0MS5nZXRTZXJ2aWNlQ29udGV4dChzZXJ2aWNlMSk7Ci0gICAgICAgIGNvbmZpZ3VyYXRpb25Db250ZXh0MS5hZGRTZXJ2aWNlR3JvdXBDb250ZXh0SW50b0FwcGxpY2F0aW9uU2NvcGVUYWJsZShzZXJ2aWNlR3JvdXBDb250ZXh0MSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZUdyb3VwQ29udGV4dDEpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2VDb250ZXh0MSk7Ci0KLSAgICAgICAgU2VydmljZUdyb3VwQ29udGV4dCBzZXJ2aWNlR3JvdXBDb250ZXh0MiA9Ci0gICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbkNvbnRleHQyLmNyZWF0ZVNlcnZpY2VHcm91cENvbnRleHQoc2VydmljZUdyb3VwMik7Ci0gICAgICAgIHNlcnZpY2VHcm91cENvbnRleHQyLnNldElkKFRFU1RfU0VSVklDRV9OQU1FKTsKLSAgICAgICAgU2VydmljZUNvbnRleHQgc2VydmljZUNvbnRleHQyID0gc2VydmljZUdyb3VwQ29udGV4dDIuZ2V0U2VydmljZUNvbnRleHQoc2VydmljZTIpOwotICAgICAgICBjb25maWd1cmF0aW9uQ29udGV4dDIuYWRkU2VydmljZUdyb3VwQ29udGV4dEludG9BcHBsaWNhdGlvblNjb3BlVGFibGUoc2VydmljZUdyb3VwQ29udGV4dDIpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2VHcm91cENvbnRleHQyKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlQ29udGV4dDIpOwotCi0gICAgICAgIFN0cmluZyBrZXkxID0gInNnQ3R4S2V5IjsKLSAgICAgICAgU3RyaW5nIHZhbDEgPSAic2dDdHhWYWwxIjsKLSAgICAgICAgc2VydmljZUNvbnRleHQxLnNldFByb3BlcnR5KGtleTEsIHZhbDEpOwotICAgICAgICBjdHhNYW4xLnVwZGF0ZUNvbnRleHQoc2VydmljZUNvbnRleHQxKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHModmFsMSwgc2VydmljZUNvbnRleHQyLmdldFByb3BlcnR5KGtleTEpKTsKLQotICAgICAgICAvLyBSZW1vdmUgdGhlIHByb3BlcnR5Ci0gICAgICAgIHNlcnZpY2VDb250ZXh0Mi5yZW1vdmVQcm9wZXJ0eShrZXkxKTsKLSAgICAgICAgYXNzZXJ0TnVsbChzZXJ2aWNlQ29udGV4dDIuZ2V0UHJvcGVydHkoa2V5MSkpOwotICAgICAgICBjdHhNYW4yLnVwZGF0ZUNvbnRleHQoc2VydmljZUNvbnRleHQyKTsKLSAgICAgICAgYXNzZXJ0TnVsbChzZXJ2aWNlQ29udGV4dDEuZ2V0UHJvcGVydHkoa2V5MSkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZW1vdmVQcm9wZXJ0eUZyb21TZXJ2aWNlQ29udGV4dDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFjYW5SdW5UZXN0cykgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQWRkIHRoZSBwcm9wZXJ0eQotICAgICAgICBTZXJ2aWNlR3JvdXBDb250ZXh0IHNlcnZpY2VHcm91cENvbnRleHQxID0KLSAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uQ29udGV4dDEuY3JlYXRlU2VydmljZUdyb3VwQ29udGV4dChzZXJ2aWNlR3JvdXAxKTsKLSAgICAgICAgc2VydmljZUdyb3VwQ29udGV4dDEuc2V0SWQoVEVTVF9TRVJWSUNFX05BTUUpOwotICAgICAgICBTZXJ2aWNlQ29udGV4dCBzZXJ2aWNlQ29udGV4dDEgPSBzZXJ2aWNlR3JvdXBDb250ZXh0MS5nZXRTZXJ2aWNlQ29udGV4dChzZXJ2aWNlMSk7Ci0gICAgICAgIGNvbmZpZ3VyYXRpb25Db250ZXh0MS5hZGRTZXJ2aWNlR3JvdXBDb250ZXh0SW50b1NvYXBTZXNzaW9uVGFibGUoc2VydmljZUdyb3VwQ29udGV4dDEpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2VHcm91cENvbnRleHQxKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlQ29udGV4dDEpOwotCi0gICAgICAgIFNlcnZpY2VHcm91cENvbnRleHQgc2VydmljZUdyb3VwQ29udGV4dDIgPQotICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb25Db250ZXh0Mi5jcmVhdGVTZXJ2aWNlR3JvdXBDb250ZXh0KHNlcnZpY2VHcm91cDIpOwotICAgICAgICBzZXJ2aWNlR3JvdXBDb250ZXh0Mi5zZXRJZChURVNUX1NFUlZJQ0VfTkFNRSk7Ci0gICAgICAgIFNlcnZpY2VDb250ZXh0IHNlcnZpY2VDb250ZXh0MiA9IHNlcnZpY2VHcm91cENvbnRleHQyLmdldFNlcnZpY2VDb250ZXh0KHNlcnZpY2UyKTsKLSAgICAgICAgY29uZmlndXJhdGlvbkNvbnRleHQyLmFkZFNlcnZpY2VHcm91cENvbnRleHRJbnRvU29hcFNlc3Npb25UYWJsZShzZXJ2aWNlR3JvdXBDb250ZXh0Mik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZUdyb3VwQ29udGV4dDIpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2VDb250ZXh0Mik7Ci0KLSAgICAgICAgU3RyaW5nIGtleTEgPSAic2dDdHhLZXkiOwotICAgICAgICBTdHJpbmcgdmFsMSA9ICJzZ0N0eFZhbDEiOwotICAgICAgICBzZXJ2aWNlQ29udGV4dDEuc2V0UHJvcGVydHkoa2V5MSwgdmFsMSk7Ci0gICAgICAgIGN0eE1hbjEudXBkYXRlQ29udGV4dChzZXJ2aWNlQ29udGV4dDEpOwotCi0gICAgICAgIGFzc2VydEVxdWFscyh2YWwxLCBzZXJ2aWNlQ29udGV4dDIuZ2V0UHJvcGVydHkoa2V5MSkpOwotCi0gICAgICAgIC8vIFJlbW92ZSB0aGUgcHJvcGVydHkKLSAgICAgICAgc2VydmljZUNvbnRleHQyLnJlbW92ZVByb3BlcnR5KGtleTEpOwotICAgICAgICBhc3NlcnROdWxsKHNlcnZpY2VDb250ZXh0Mi5nZXRQcm9wZXJ0eShrZXkxKSk7Ci0gICAgICAgIGN0eE1hbjIudXBkYXRlQ29udGV4dChzZXJ2aWNlQ29udGV4dDIpOwotICAgICAgICBhc3NlcnROdWxsKHNlcnZpY2VDb250ZXh0MS5nZXRQcm9wZXJ0eShrZXkxKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFJlcGxpY2F0aW9uRXhjbHVzaW9uMCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIWNhblJ1blRlc3RzKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcga2V5MSA9ICJsb2NhbF9jb25maWdDdHhLZXkiOwotICAgICAgICBTdHJpbmcgdmFsMSA9ICJjb25maWdDdHhWYWwxIjsKLSAgICAgICAgY29uZmlndXJhdGlvbkNvbnRleHQxLnNldFByb3BlcnR5KGtleTEsIHZhbDEpOwotICAgICAgICBMaXN0PFN0cmluZz4gZXhjbHVzaW9uUGF0dGVybnMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgZXhjbHVzaW9uUGF0dGVybnMuYWRkKCIqIik7IC8vIEV4Y2x1ZGUgYWxsIHByb3BlcnRpZXMKLSAgICAgICAgY3R4TWFuMS5zZXRSZXBsaWNhdGlvbkV4Y2x1ZGVQYXR0ZXJucygiZGVmYXVsdHMiLCBleGNsdXNpb25QYXR0ZXJucyk7Ci0gICAgICAgIGN0eE1hbjEudXBkYXRlQ29udGV4dChjb25maWd1cmF0aW9uQ29udGV4dDEpOwotCi0gICAgICAgIFN0cmluZyB2YWx1ZSA9IChTdHJpbmcpIGNvbmZpZ3VyYXRpb25Db250ZXh0Mi5nZXRQcm9wZXJ0eShrZXkxKTsKLSAgICAgICAgYXNzZXJ0TnVsbCh2YWx1ZSk7IC8vIFRoZSBwcm9wZXJ0eSBzaG91bGQgbm90IGhhdmUgZ290dGVuIHJlcGxpY2F0ZWQKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVwbGljYXRpb25FeGNsdXNpb24xKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghY2FuUnVuVGVzdHMpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBrZXkxID0gImxvY2FsX2NvbmZpZ0N0eEtleSI7Ci0gICAgICAgIFN0cmluZyB2YWwxID0gImNvbmZpZ0N0eFZhbDEiOwotICAgICAgICBjb25maWd1cmF0aW9uQ29udGV4dDEuc2V0UHJvcGVydHkoa2V5MSwgdmFsMSk7Ci0gICAgICAgIExpc3Q8U3RyaW5nPiBleGNsdXNpb25QYXR0ZXJucyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICBleGNsdXNpb25QYXR0ZXJucy5hZGQoImxvY2FsXyoiKTsKLSAgICAgICAgY3R4TWFuMS5zZXRSZXBsaWNhdGlvbkV4Y2x1ZGVQYXR0ZXJucygiZGVmYXVsdHMiLCBleGNsdXNpb25QYXR0ZXJucyk7Ci0gICAgICAgIGN0eE1hbjEudXBkYXRlQ29udGV4dChjb25maWd1cmF0aW9uQ29udGV4dDEpOwotCi0gICAgICAgIFN0cmluZyB2YWx1ZSA9IChTdHJpbmcpIGNvbmZpZ3VyYXRpb25Db250ZXh0Mi5nZXRQcm9wZXJ0eShrZXkxKTsKLSAgICAgICAgYXNzZXJ0TnVsbCh2YWx1ZSk7IC8vIFRoZSBwcm9wZXJ0eSBzaG91bGQgbm90IGhhdmUgZ290dGVuIHJlcGxpY2F0ZWQKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVwbGljYXRpb25FeGNsdXNpb24yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghY2FuUnVuVGVzdHMpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBrZXkxID0gImxvY2FsX2NvbmZpZ0N0eEtleSI7Ci0gICAgICAgIFN0cmluZyB2YWwxID0gImNvbmZpZ0N0eFZhbDEiOwotICAgICAgICBjb25maWd1cmF0aW9uQ29udGV4dDEuc2V0UHJvcGVydHkoa2V5MSwgdmFsMSk7Ci0gICAgICAgIExpc3Q8U3RyaW5nPiBleGNsdXNpb25QYXR0ZXJucyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICBleGNsdXNpb25QYXR0ZXJucy5hZGQoImxvY2FsXyoiKTsKLSAgICAgICAgY3R4TWFuMS5zZXRSZXBsaWNhdGlvbkV4Y2x1ZGVQYXR0ZXJucygib3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNsdXNpb25QYXR0ZXJucyk7Ci0gICAgICAgIGN0eE1hbjEudXBkYXRlQ29udGV4dChjb25maWd1cmF0aW9uQ29udGV4dDEpOwotCi0gICAgICAgIFN0cmluZyB2YWx1ZSA9IChTdHJpbmcpIGNvbmZpZ3VyYXRpb25Db250ZXh0Mi5nZXRQcm9wZXJ0eShrZXkxKTsKLSAgICAgICAgYXNzZXJ0TnVsbCh2YWx1ZSk7IC8vIFRoZSBwcm9wZXJ0eSBzaG91bGQgbm90IGhhdmUgZ290dGVuIHJlcGxpY2F0ZWQKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVwbGljYXRpb25FeGNsdXNpb24zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghY2FuUnVuVGVzdHMpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBrZXkxID0gImxvY2FsMV9jb25maWdDdHhLZXkiOwotICAgICAgICBTdHJpbmcgdmFsMSA9ICJjb25maWdDdHhWYWwxIjsKLSAgICAgICAgY29uZmlndXJhdGlvbkNvbnRleHQxLnNldFByb3BlcnR5KGtleTEsIHZhbDEpOwotCi0gICAgICAgIFN0cmluZyBrZXkyID0gImxvY2FsMl9jb25maWdDdHhLZXkiOwotICAgICAgICBTdHJpbmcgdmFsMiA9ICJjb25maWdDdHhWYWwyIjsKLSAgICAgICAgY29uZmlndXJhdGlvbkNvbnRleHQxLnNldFByb3BlcnR5KGtleTIsIHZhbDIpOwotCi0gICAgICAgIFN0cmluZyBrZXkzID0gImxvY2FsM19jb25maWdDdHhLZXkiOwotICAgICAgICBTdHJpbmcgdmFsMyA9ICJjb25maWdDdHhWYWwzIjsKLSAgICAgICAgY29uZmlndXJhdGlvbkNvbnRleHQxLnNldFByb3BlcnR5KGtleTMsIHZhbDMpOwotCi0gICAgICAgIExpc3Q8U3RyaW5nPiBleGNsdXNpb25QYXR0ZXJuczEgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgZXhjbHVzaW9uUGF0dGVybnMxLmFkZCgibG9jYWwxXyoiKTsKLSAgICAgICAgTGlzdDxTdHJpbmc+IGV4Y2x1c2lvblBhdHRlcm5zMiA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICBleGNsdXNpb25QYXR0ZXJuczIuYWRkKCJsb2NhbDJfKiIpOwotICAgICAgICBjdHhNYW4xLnNldFJlcGxpY2F0aW9uRXhjbHVkZVBhdHRlcm5zKCJvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2x1c2lvblBhdHRlcm5zMSk7Ci0gICAgICAgIGN0eE1hbjEuc2V0UmVwbGljYXRpb25FeGNsdWRlUGF0dGVybnMoImRlZmF1bHRzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNsdXNpb25QYXR0ZXJuczIpOwotICAgICAgICBjdHhNYW4xLnVwZGF0ZUNvbnRleHQoY29uZmlndXJhdGlvbkNvbnRleHQxKTsKLQotICAgICAgICBTdHJpbmcgdmFsdWUxID0gKFN0cmluZykgY29uZmlndXJhdGlvbkNvbnRleHQyLmdldFByb3BlcnR5KGtleTEpOwotICAgICAgICBhc3NlcnROdWxsKHZhbHVlMSk7IC8vIFRoZSBwcm9wZXJ0eSBzaG91bGQgbm90IGhhdmUgZ290dGVuIHJlcGxpY2F0ZWQKLSAgICAgICAgU3RyaW5nIHZhbHVlMiA9IChTdHJpbmcpIGNvbmZpZ3VyYXRpb25Db250ZXh0Mi5nZXRQcm9wZXJ0eShrZXkyKTsKLSAgICAgICAgYXNzZXJ0TnVsbCh2YWx1ZTIpOyAvLyBUaGUgcHJvcGVydHkgc2hvdWxkIG5vdCBoYXZlIGdvdHRlbiByZXBsaWNhdGVkCi0gICAgICAgIFN0cmluZyB2YWx1ZTMgPSAoU3RyaW5nKSBjb25maWd1cmF0aW9uQ29udGV4dDIuZ2V0UHJvcGVydHkoa2V5Myk7Ci0gICAgICAgIGFzc2VydEVxdWFscyh2YWwzLCB2YWx1ZTMpOyAvLyBUaGUgcHJvcGVydHkgc2hvdWxkIGhhdmUgZ290dGVuIHJlcGxpY2F0ZWQKLQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnRlYXJEb3duKCk7Ci0gICAgICAgIGlmIChjbHVzdGVyTWFuYWdlcjEgIT0gbnVsbCkgewotICAgICAgICAgICAgY2x1c3Rlck1hbmFnZXIxLnNodXRkb3duKCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLSBDTHVzdGVyLTEgc2h1dGRvd24gY29tcGxldGUgLS0tLS0tIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNsdXN0ZXJNYW5hZ2VyMiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjbHVzdGVyTWFuYWdlcjIuc2h1dGRvd24oKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tIENMdXN0ZXItMiBzaHV0ZG93biBjb21wbGV0ZSAtLS0tLS0iKTsKLSAgICAgICAgfQotLy8gICAgICAgIE1lbWJlcnNoaXBNYW5hZ2VyLnJlbW92ZUFsbE1lbWJlcnMoKTsKLSAgICAgICAgVGhyZWFkLnNsZWVwKDUwMCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvY2x1c3RlcmluZy90ZXN0L29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9PYmplY3RTZXJpYWxpemF0aW9uVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvY2x1c3RlcmluZy90ZXN0L29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9PYmplY3RTZXJpYWxpemF0aW9uVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmQ1OGUwLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2NsdXN0ZXJpbmcvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvT2JqZWN0U2VyaWFsaXphdGlvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW07Ci0KLS8qKgotICoKLSAqLwotcHVibGljIGNsYXNzIE9iamVjdFNlcmlhbGl6YXRpb25UZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6YXRpb24oKSB0aHJvd3MgSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICBUZXN0RE8gdGVzdERPID0gbmV3IFRlc3RETygibmFtZSIsICJ2YWx1ZSIpOwotICAgICAgICBUZXN0RE8gdGVzdERPMiA9IChUZXN0RE8pIGNvcHkodGVzdERPKTsKLQotICAgICAgICBhc3NlcnROb3ROdWxsKHRlc3RETzIpOwotICAgICAgICBhc3NlcnRGYWxzZSh0ZXN0RE8uZXF1YWxzKHRlc3RETzIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHRlc3RETy5nZXROYW1lKCksIHRlc3RETzIuZ2V0TmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHRlc3RETy5nZXRWYWx1ZSgpLCB0ZXN0RE8yLmdldFZhbHVlKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBjb3B5IG9mIHRoZSBvYmplY3QsIG9yIG51bGwgaWYgdGhlIG9iamVjdCBjYW5ub3QKLSAgICAgKiBiZSBzZXJpYWxpemVkLgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgY29weShPYmplY3Qgb3JpZykgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAgICAgT2JqZWN0IG9iaiA9IG51bGw7Ci0gICAgICAgIC8vIFdyaXRlIHRoZSBvYmplY3Qgb3V0IHRvIGEgYnl0ZSBhcnJheQotICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYm9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICBPYmplY3RPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IE9iamVjdE91dHB1dFN0cmVhbShib3MpOwotICAgICAgICBvdXQud3JpdGVPYmplY3Qob3JpZyk7Ci0gICAgICAgIG91dC5mbHVzaCgpOwotICAgICAgICBvdXQuY2xvc2UoKTsKLQotICAgICAgICAvLyBNYWtlIGFuIGlucHV0IHN0cmVhbSBmcm9tIHRoZSBieXRlIGFycmF5IGFuZCByZWFkCi0gICAgICAgIC8vIGEgY29weSBvZiB0aGUgb2JqZWN0IGJhY2sgaW4uCi0gICAgICAgIE9iamVjdElucHV0U3RyZWFtIGluID0gbmV3IE9iamVjdElucHV0U3RyZWFtKAotICAgICAgICAgICAgICAgIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShib3MudG9CeXRlQXJyYXkoKSkpOwotICAgICAgICBvYmogPSBpbi5yZWFkT2JqZWN0KCk7Ci0gICAgICAgIHJldHVybiBvYmo7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvY2x1c3RlcmluZy90ZXN0L29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9UZXN0RE8uamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2NsdXN0ZXJpbmcvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvVGVzdERPLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3Y2MwNzEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvY2x1c3RlcmluZy90ZXN0L29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9UZXN0RE8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci0KLS8qKgotICoKLSAqLwotcHVibGljIGNsYXNzIFRlc3RETyBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLSAgICBwcml2YXRlIFN0cmluZyB2YWx1ZTsKLQotICAgIHB1YmxpYyBUZXN0RE8oU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgewotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgewotICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvY2x1c3RlcmluZy90ZXN0L29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9jb25maWd1cmF0aW9uL0NvbmZpZ3VyYXRpb25NYW5hZ2VyVGVzdENhc2UuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2NsdXN0ZXJpbmcvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvY29uZmlndXJhdGlvbi9Db25maWd1cmF0aW9uTWFuYWdlclRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlMmY0ZjQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvY2x1c3RlcmluZy90ZXN0L29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9jb25maWd1cmF0aW9uL0NvbmZpZ3VyYXRpb25NYW5hZ2VyVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLkNsdXN0ZXJNYW5hZ2VyVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLkNsdXN0ZXJpbmdGYXVsdDsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb25maWd1cmF0aW9uTWFuYWdlclRlc3RDYXNlIGV4dGVuZHMgQ2x1c3Rlck1hbmFnZXJUZXN0Q2FzZSB7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TG9hZFNlcnZpY2VHcm91cCgpIHRocm93cyBDbHVzdGVyaW5nRmF1bHQgewotCi0gICAgICAgIFN0cmluZyBzZXJ2aWNlR3JvdXBOYW1lID0gInRlc3RTZXJ2aWNlIjsKLSAgICAgICAgY2x1c3Rlck1hbmFnZXIxLmdldENvbmZpZ3VyYXRpb25NYW5hZ2VyKCkubG9hZFNlcnZpY2VHcm91cHMobmV3IFN0cmluZ1tde3NlcnZpY2VHcm91cE5hbWV9KTsKLQotICAgICAgICAvKnRyeSB7Ci0gICAgICAgICAgICBUaHJlYWQuc2xlZXAoMzAwMCk7Ci0gICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBMaXN0IGV2ZW50TGlzdCA9IGNvbmZpZ3VyYXRpb25NYW5hZ2VyTGlzdGVuZXIyLmdldEV2ZW50TGlzdCgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGV2ZW50TGlzdCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhldmVudExpc3Quc2l6ZSgpLCAxKTsKLSAgICAgICAgQ29uZmlndXJhdGlvbkV2ZW50IGV2ZW50ID0gKENvbmZpZ3VyYXRpb25FdmVudCkgZXZlbnRMaXN0LmdldCgwKTsKLQotICAgICAgICBhc3NlcnROb3ROdWxsKGV2ZW50KTsKLQotICAgICAgICBTdHJpbmdbXSBzZXJ2aWNlR3JvdXBOYW1lcyA9IGV2ZW50LmdldFNlcnZpY2VHcm91cE5hbWVzKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZUdyb3VwTmFtZXMpOwotICAgICAgICBhc3NlcnRFcXVhbHMoc2VydmljZUdyb3VwTmFtZXNbMF0sIHNlcnZpY2VHcm91cE5hbWUpOyovCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFVubG9hZFNlcnZpY2VHcm91cCgpIHRocm93cyBDbHVzdGVyaW5nRmF1bHQgewotCi0gICAgICAgIFN0cmluZyBzZXJ2aWNlR3JvdXBOYW1lID0gInRlc3RTZXJ2aWNlIjsKLSAgICAgICAgY2x1c3Rlck1hbmFnZXIxLmdldENvbmZpZ3VyYXRpb25NYW5hZ2VyKCkudW5sb2FkU2VydmljZUdyb3VwcyhuZXcgU3RyaW5nW117c2VydmljZUdyb3VwTmFtZX0pOwotCi0gICAgICAgIC8qdHJ5IHsKLSAgICAgICAgICAgIFRocmVhZC5zbGVlcCgzMDAwKTsKLSAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotCi0gICAgICAgIExpc3QgZXZlbnRMaXN0ID0gY29uZmlndXJhdGlvbk1hbmFnZXJMaXN0ZW5lcjIuZ2V0RXZlbnRMaXN0KCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZXZlbnRMaXN0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGV2ZW50TGlzdC5zaXplKCksIDEpOwotICAgICAgICBDb25maWd1cmF0aW9uRXZlbnQgZXZlbnQgPSAoQ29uZmlndXJhdGlvbkV2ZW50KSBldmVudExpc3QuZ2V0KDApOwotCi0gICAgICAgIGFzc2VydE5vdE51bGwoZXZlbnQpOwotCi0gICAgICAgIFN0cmluZ1tdIHNlcnZpY2VHcm91cE5hbWVzID0gZXZlbnQuZ2V0U2VydmljZUdyb3VwTmFtZXMoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlR3JvdXBOYW1lcyk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhzZXJ2aWNlR3JvdXBOYW1lc1swXSwgc2VydmljZUdyb3VwTmFtZSk7Ki8KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwbHlQb2xpY3koKSB0aHJvd3MgQ2x1c3RlcmluZ0ZhdWx0LCBYTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgIFN0cmluZyBzZXJ2aWNlR3JvdXBOYW1lID0gInRlc3RTZXJ2aWNlIjsKLSAgICAgICAgY2x1c3Rlck1hbmFnZXIxLmdldENvbmZpZ3VyYXRpb25NYW5hZ2VyKCkubG9hZFNlcnZpY2VHcm91cHMobmV3IFN0cmluZ1tde3NlcnZpY2VHcm91cE5hbWV9KTsKLSAgICAgICAgU3RyaW5nIHBvbGljeUlEID0gInBvbGljeTEiOwotCi0gICAgICAgIC8qdHJ5IHsKLSAgICAgICAgICAgIFRocmVhZC5zbGVlcCgzMDAwKTsKLSAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotCi0gICAgICAgIFBvbGljeSBwb2xpY3kgPSBuZXcgUG9saWN5KCk7Ci0gICAgICAgIHBvbGljeS5zZXRJZChwb2xpY3lJRCk7Ci0KLSAgICAgICAgU3RyaW5nV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICAgICAgWE1MU3RyZWFtV3JpdGVyIHhtbFN0cmVhbVdyaXRlciA9IFhNTE91dHB1dEZhY3RvcnkubmV3SW5zdGFuY2UoKQotICAgICAgICAgICAgICAgIC5jcmVhdGVYTUxTdHJlYW1Xcml0ZXIod3JpdGVyKTsKLQotICAgICAgICBwb2xpY3kuc2VyaWFsaXplKHhtbFN0cmVhbVdyaXRlcik7Ci0gICAgICAgIHhtbFN0cmVhbVdyaXRlci5mbHVzaCgpOwotCi0gICAgICAgIGNsdXN0ZXJNYW5hZ2VyMS5nZXRDb25maWd1cmF0aW9uTWFuYWdlcigpLmFwcGx5UG9saWN5KHNlcnZpY2VHcm91cE5hbWUsIHdyaXRlci50b1N0cmluZygpKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDMwMDApOwotICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgTGlzdCBldmVudExpc3QgPSBjb25maWd1cmF0aW9uTWFuYWdlckxpc3RlbmVyMi5nZXRFdmVudExpc3QoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChldmVudExpc3QpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZXZlbnRMaXN0LnNpemUoKSwgMik7Ci0gICAgICAgIENvbmZpZ3VyYXRpb25FdmVudCBldmVudCA9IChDb25maWd1cmF0aW9uRXZlbnQpIGV2ZW50TGlzdC5nZXQoMSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZXZlbnQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZXZlbnQuZ2V0U2VydmljZU5hbWUoKSwgc2VydmljZU5hbWUpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGV2ZW50LmdldFBvbGljeSgpKTsqLwotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFByZXBhcmUoKSB0aHJvd3MgQ2x1c3RlcmluZ0ZhdWx0IHsKLQotICAgICAgICBTdHJpbmcgc2VydmljZUdyb3VwTmFtZSA9ICJ0ZXN0U2VydmljZSI7Ci0gICAgICAgIGNsdXN0ZXJNYW5hZ2VyMS5nZXRDb25maWd1cmF0aW9uTWFuYWdlcigpLnByZXBhcmUoKTsKLQotICAgICAgICAvKnRyeSB7Ci0gICAgICAgICAgICBUaHJlYWQuc2xlZXAoMzAwMCk7Ci0gICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBMaXN0IGV2ZW50TGlzdCA9IGNvbmZpZ3VyYXRpb25NYW5hZ2VyTGlzdGVuZXIyLmdldEV2ZW50TGlzdCgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGV2ZW50TGlzdCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhldmVudExpc3Quc2l6ZSgpLCAxKTsKLSAgICAgICAgQ29uZmlndXJhdGlvbkV2ZW50IGV2ZW50ID0gKENvbmZpZ3VyYXRpb25FdmVudCkgZXZlbnRMaXN0LmdldCgwKTsKLQotICAgICAgICBhc3NlcnROb3ROdWxsKGV2ZW50KTsqLwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDb21taXQoKSB0aHJvd3MgQ2x1c3RlcmluZ0ZhdWx0IHsKLQotICAgICAgICBTdHJpbmcgc2VydmljZUdyb3VwTmFtZSA9ICJ0ZXN0U2VydmljZSI7Ci0gICAgICAgIGNsdXN0ZXJNYW5hZ2VyMS5nZXRDb25maWd1cmF0aW9uTWFuYWdlcigpLmNvbW1pdCgpOwotCi0gICAgICAgIC8qdHJ5IHsKLSAgICAgICAgICAgVGhyZWFkLnNsZWVwKDMwMDApOwotICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgTGlzdCBldmVudExpc3QgPSBjb25maWd1cmF0aW9uTWFuYWdlckxpc3RlbmVyMi5nZXRFdmVudExpc3QoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChldmVudExpc3QpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZXZlbnRMaXN0LnNpemUoKSwgMSk7Ci0gICAgICAgIENvbmZpZ3VyYXRpb25FdmVudCBldmVudCA9IChDb25maWd1cmF0aW9uRXZlbnQpIGV2ZW50TGlzdC5nZXQoMCk7Ci0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChldmVudCk7Ki8KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Um9sbGJhY2soKSB0aHJvd3MgQ2x1c3RlcmluZ0ZhdWx0IHsKLQotICAgICAgICBTdHJpbmcgc2VydmljZUdyb3VwTmFtZSA9ICJ0ZXN0U2VydmljZSI7Ci0gICAgICAgIGNsdXN0ZXJNYW5hZ2VyMS5nZXRDb25maWd1cmF0aW9uTWFuYWdlcigpLnJvbGxiYWNrKCk7Ci0KLSAgICAgICAgLyp0cnkgewotICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDMwMDApOwotICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgTGlzdCBldmVudExpc3QgPSBjb25maWd1cmF0aW9uTWFuYWdlckxpc3RlbmVyMi5nZXRFdmVudExpc3QoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChldmVudExpc3QpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZXZlbnRMaXN0LnNpemUoKSwgMSk7Ci0gICAgICAgIENvbmZpZ3VyYXRpb25FdmVudCBldmVudCA9IChDb25maWd1cmF0aW9uRXZlbnQpIGV2ZW50TGlzdC5nZXQoMCk7Ci0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChldmVudCk7Ki8KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVsb2FkQ29uZmlndXJhdGlvbigpIHRocm93cyBDbHVzdGVyaW5nRmF1bHQgewotCi0gICAgICAgIFN0cmluZyBzZXJ2aWNlR3JvdXBOYW1lID0gInRlc3RTZXJ2aWNlIjsKLSAgICAgICAgY2x1c3Rlck1hbmFnZXIxLmdldENvbmZpZ3VyYXRpb25NYW5hZ2VyKCkucmVsb2FkQ29uZmlndXJhdGlvbigpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBUaHJlYWQuc2xlZXAoMzAwMCk7Ci0gICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKkxpc3QgZXZlbnRMaXN0ID0gY29uZmlndXJhdGlvbk1hbmFnZXJMaXN0ZW5lcjIuZ2V0RXZlbnRMaXN0KCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZXZlbnRMaXN0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGV2ZW50TGlzdC5zaXplKCksIDEpOwotICAgICAgICBDb25maWd1cmF0aW9uRXZlbnQgZXZlbnQgPSAoQ29uZmlndXJhdGlvbkV2ZW50KSBldmVudExpc3QuZ2V0KDApOwotCi0gICAgICAgIGFzc2VydE5vdE51bGwoZXZlbnQpOyovCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9jbHVzdGVyaW5nL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL2NvbmZpZ3VyYXRpb24vVGVzdENvbmZpZ3VyYXRpb25NYW5hZ2VyTGlzdGVuZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2NsdXN0ZXJpbmcvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvY29uZmlndXJhdGlvbi9UZXN0Q29uZmlndXJhdGlvbk1hbmFnZXJMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDkwNmY1Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2NsdXN0ZXJpbmcvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvY29uZmlndXJhdGlvbi9UZXN0Q29uZmlndXJhdGlvbk1hbmFnZXJMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuY29uZmlndXJhdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0Q29uZmlndXJhdGlvbk1hbmFnZXJMaXN0ZW5lciBpbXBsZW1lbnRzIENvbmZpZ3VyYXRpb25NYW5hZ2VyTGlzdGVuZXIgewotCi0gICAgcHJpdmF0ZSBBcnJheUxpc3QgY29tbWFuZExpc3Q7Ci0gICAgcHJpdmF0ZSBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWd1cmF0aW9uQ29udGV4dDsKLQotICAgIHB1YmxpYyBUZXN0Q29uZmlndXJhdGlvbk1hbmFnZXJMaXN0ZW5lcigpIHsKLSAgICAgICAgY29tbWFuZExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2VydmljZUdyb3Vwc0xvYWRlZChDb25maWd1cmF0aW9uQ2x1c3RlcmluZ0NvbW1hbmQgY29tbWFuZCkgewotICAgICAgICAvL1RPRE86IE1ldGhvZCBpbXBsZW1lbnRhdGlvbgotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2VydmljZUdyb3Vwc1VubG9hZGVkKENvbmZpZ3VyYXRpb25DbHVzdGVyaW5nQ29tbWFuZCBjb21tYW5kKSB7Ci0gICAgICAgIC8vVE9ETzogTWV0aG9kIGltcGxlbWVudGF0aW9uCi0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwb2xpY3lBcHBsaWVkKENvbmZpZ3VyYXRpb25DbHVzdGVyaW5nQ29tbWFuZCBjb21tYW5kKSB7Ci0gICAgICAgIC8vVE9ETzogTWV0aG9kIGltcGxlbWVudGF0aW9uCi0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjb25maWd1cmF0aW9uUmVsb2FkZWQoQ29uZmlndXJhdGlvbkNsdXN0ZXJpbmdDb21tYW5kIGNvbW1hbmQpIHsKLSAgICAgICAgLy9UT0RPOiBNZXRob2QgaW1wbGVtZW50YXRpb24KLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByZXBhcmVDYWxsZWQoKSB7Ci0gICAgICAgIC8vVE9ETzogTWV0aG9kIGltcGxlbWVudGF0aW9uCi0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByb2xsYmFja0NhbGxlZCgpIHsKLSAgICAgICAgLy9UT0RPOiBNZXRob2QgaW1wbGVtZW50YXRpb24KLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNvbW1pdENhbGxlZCgpIHsKLSAgICAgICAgLy9UT0RPOiBNZXRob2QgaW1wbGVtZW50YXRpb24KLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV4Y2VwdGlvbihUaHJvd2FibGUgdGhyb3dhYmxlKSB7Ci0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb25maWd1cmF0aW9uQ29udGV4dChDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWd1cmF0aW9uQ29udGV4dCkgewotICAgICAgICAvL1RPRE86IE1ldGhvZCBpbXBsZW1lbnRhdGlvbgotCi0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2NsdXN0ZXJpbmcvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvdHJpYmVzL0NvbmZpZ3VyYXRpb25NYW5hZ2VyVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvY2x1c3RlcmluZy90ZXN0L29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy90cmliZXMvQ29uZmlndXJhdGlvbk1hbmFnZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhODQxYzAuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvY2x1c3RlcmluZy90ZXN0L29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy90cmliZXMvQ29uZmlndXJhdGlvbk1hbmFnZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy50cmliZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuQ2x1c3Rlck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLmNvbmZpZ3VyYXRpb24uRGVmYXVsdENvbmZpZ3VyYXRpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5jb25maWd1cmF0aW9uLkRlZmF1bHRDb25maWd1cmF0aW9uTWFuYWdlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5jb250ZXh0LkRlZmF1bHRDb250ZXh0TWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuY29udGV4dC5EZWZhdWx0Q29udGV4dE1hbmFnZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uTWFuYWdlclRlc3QgZXh0ZW5kcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uTWFuYWdlclRlc3RDYXNlIHsKLQotICAgIHByb3RlY3RlZCBDbHVzdGVyTWFuYWdlciBnZXRDbHVzdGVyTWFuYWdlcihDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDdHgpIHsKLSAgICAgICAgVHJpYmVzQ2x1c3Rlck1hbmFnZXIgdHJpYmVzQ2x1c3Rlck1hbmFnZXIgPSBuZXcgVHJpYmVzQ2x1c3Rlck1hbmFnZXIoKTsKLSAgICAgICAgdHJpYmVzQ2x1c3Rlck1hbmFnZXIuc2V0Q29uZmlndXJhdGlvbkNvbnRleHQoY29uZmlnQ3R4KTsKLSAgICAgICAgRGVmYXVsdENvbmZpZ3VyYXRpb25NYW5hZ2VyIGNvbmZpZ3VyYXRpb25NYW5hZ2VyID0gbmV3IERlZmF1bHRDb25maWd1cmF0aW9uTWFuYWdlcigpOwotICAgICAgICBjb25maWd1cmF0aW9uTWFuYWdlci4KLSAgICAgICAgICAgICAgICBzZXRDb25maWd1cmF0aW9uTWFuYWdlckxpc3RlbmVyKG5ldyBEZWZhdWx0Q29uZmlndXJhdGlvbk1hbmFnZXJMaXN0ZW5lcigpKTsKLSAgICAgICAgdHJpYmVzQ2x1c3Rlck1hbmFnZXIuc2V0Q29uZmlndXJhdGlvbk1hbmFnZXIoY29uZmlndXJhdGlvbk1hbmFnZXIpOwotICAgICAgICBEZWZhdWx0Q29udGV4dE1hbmFnZXIgY29udGV4dE1hbmFnZXIgPSBuZXcgRGVmYXVsdENvbnRleHRNYW5hZ2VyKCk7Ci0gICAgICAgIGNvbnRleHRNYW5hZ2VyLnNldENvbnRleHRNYW5hZ2VyTGlzdGVuZXIobmV3IERlZmF1bHRDb250ZXh0TWFuYWdlckxpc3RlbmVyKCkpOwotICAgICAgICB0cmliZXNDbHVzdGVyTWFuYWdlci5zZXRDb250ZXh0TWFuYWdlcihjb250ZXh0TWFuYWdlcik7Ci0gICAgICAgIHJldHVybiB0cmliZXNDbHVzdGVyTWFuYWdlcjsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2NsdXN0ZXJpbmcvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvdHJpYmVzL011bHRpY2FzdFJlY2VpdmVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9jbHVzdGVyaW5nL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL3RyaWJlcy9NdWx0aWNhc3RSZWNlaXZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTAwMmNkLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2NsdXN0ZXJpbmcvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvdHJpYmVzL011bHRpY2FzdFJlY2VpdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gKiBDb3B5cmlnaHQgMjAwNCwyMDA1IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgICAgICAgICAgICAgCi0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICAgICAgICAgICAgCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlICAgICAgICAgCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAgICAgICAgICAgCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gICAgCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kICAgICAgICAgCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLnRyaWJlczsKLQotaW1wb3J0IGphdmEubmV0LkRhdGFncmFtUGFja2V0OwotaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOwotaW1wb3J0IGphdmEubmV0Lk11bHRpY2FzdFNvY2tldDsKLQotLyoqCi0gKgotICovCi1wdWJsaWMgY2xhc3MgTXVsdGljYXN0UmVjZWl2ZXIgewotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgaXAgPSAiMjI4LjEuMi4zIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBwb3J0ID0gNDU2Nzg7Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICBNdWx0aWNhc3RTb2NrZXQgbXNvY2tldCA9IG5ldyBNdWx0aWNhc3RTb2NrZXQocG9ydCk7Ci0gICAgICAgIEluZXRBZGRyZXNzIGdyb3VwID0gSW5ldEFkZHJlc3MuZ2V0QnlOYW1lKGlwKTsKLSAgICAgICAgbXNvY2tldC5qb2luR3JvdXAoZ3JvdXApOwotCi0gICAgICAgIGJ5dGVbXSBpbmJ1ZiA9IG5ldyBieXRlWzEwMjRdOwotICAgICAgICBEYXRhZ3JhbVBhY2tldCBwYWNrZXQgPSBuZXcgRGF0YWdyYW1QYWNrZXQoaW5idWYsIGluYnVmLmxlbmd0aCk7Ci0KLSAgICAgICAgLy8gV2FpdCBmb3IgcGFja2V0Ci0gICAgICAgIG1zb2NrZXQucmVjZWl2ZShwYWNrZXQpOwotCi0gICAgICAgIC8vIERhdGEgaXMgbm93IGluIGluYnVmCi0gICAgICAgIGludCBudW1CeXRlc1JlY2VpdmVkID0gcGFja2V0LmdldExlbmd0aCgpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlJlY2Q6ICIgKyBuZXcgU3RyaW5nKGluYnVmLCAwLCBudW1CeXRlc1JlY2VpdmVkKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvY2x1c3RlcmluZy90ZXN0L29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy90cmliZXMvTXVsdGljYXN0U2VuZGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9jbHVzdGVyaW5nL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL3RyaWJlcy9NdWx0aWNhc3RTZW5kZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDVhZTQzMC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9jbHVzdGVyaW5nL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL3RyaWJlcy9NdWx0aWNhc3RTZW5kZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqIENvcHlyaWdodCAyMDA0LDIwMDUgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAgICAgICAgICAgICAKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gICAgICAgICAgICAKLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgICAgICAgICAKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsICAgICAgICAgICAKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgICAKLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgICAgICAgICAKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcudHJpYmVzOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5EYXRhZ3JhbVBhY2tldDsKLWltcG9ydCBqYXZhLm5ldC5EYXRhZ3JhbVNvY2tldDsKLWltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKLWltcG9ydCBqYXZhLm5ldC5Tb2NrZXRFeGNlcHRpb247Ci0KLS8qKgotICoKLSAqLwotcHVibGljIGNsYXNzIE11bHRpY2FzdFNlbmRlciB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgaXAgPSAiMjI4LjEuMi4zIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBwb3J0ID0gNDU2Nzg7Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICAvLyBNdWx0aWNhc3Qgc2VuZAotICAgICAgICBieXRlW10gb3V0YnVmID0gIkhlbGxvIHdvcmxkIi5nZXRCeXRlcygpOwotCi0KLSAgICAgICAgRGF0YWdyYW1Tb2NrZXQgc29ja2V0ID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNvY2tldCA9IG5ldyBEYXRhZ3JhbVNvY2tldCgpOwotICAgICAgICAgICAgSW5ldEFkZHJlc3MgZ3JvdXBBZGRyID0gSW5ldEFkZHJlc3MuZ2V0QnlOYW1lKGlwKTsKLSAgICAgICAgICAgIERhdGFncmFtUGFja2V0IHBhY2tldCA9IG5ldyBEYXRhZ3JhbVBhY2tldChvdXRidWYsIG91dGJ1Zi5sZW5ndGgsIGdyb3VwQWRkciwgcG9ydCk7Ci0gICAgICAgICAgICBzb2NrZXQuc2VuZChwYWNrZXQpOwotICAgICAgICB9IGNhdGNoIChTb2NrZXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChzb2NrZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHNvY2tldC5jbG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU2VudCIpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vYnVpbGQtd3NkbHMueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9idWlsZC13c2Rscy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3MDQ3YjguLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9idWlsZC13c2Rscy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi0NCi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08cHJvamVjdCBuYW1lPSJpdGVzdCIgYmFzZWRpcj0iLiI+DQotDQotCTx0YXJnZXQgbmFtZT0id3NkbC1jb2RlZ2VuIiB1bmxlc3M9InRlc3Quc2tpcCI+DQotCQk8IS0tIFNldCBhIHByb3BlcnR5IHRoYXQgY2FuIGJlIHBpY2tlZCB1cCBmcm9tIHRoZSBhbnQgYnVpbGQueG1sJ3MgLS0+DQotDQotCQk8cHJvcGVydHkgbmFtZT0ibWF2ZW4uanVuaXQuanZtYXJncyIgdmFsdWU9IiIgLz4NCi0JCTxwYXRoIGlkPSJtYXZlbi5kZXBlbmRlbmN5LmNsYXNzcGF0aCI+DQotCQkJPHBhdGggcmVmaWQ9Im1hdmVuLmNvbXBpbGUuY2xhc3NwYXRoIiAvPg0KLQkJPC9wYXRoPg0KLQkJPCEtLSBjb21waWxpbmcgc29tZSBjdXN0b20gd3NkbCBmaWxlcyAtLT4NCi0JCTxwcm9wZXJ0eSBuYW1lPSJ3c2RsLnNvdXJjZS5kaXIiIHZhbHVlPSJ0ZXN0LXJlc291cmNlcy93c2RscyIgLz4NCi0JCTxwcm9wZXJ0eSBuYW1lPSJ3c2RsLm91dHB1dC5iYXNlLmRpciIgdmFsdWU9InRhcmdldC93c2RscyIgLz4NCi0JCTwhLS0gbWFrZSB0aGUgZGlycyAtLT4NCi0JCTxta2RpciBkaXI9IiR7d3NkbC5vdXRwdXQuYmFzZS5kaXJ9IiAvPg0KLQ0KLQkJPGVjaG8+Q29tcGlsaW5nIFZlcnNpb24ud3NkbDwvZWNobz4NCi0gICAgPGRlbGV0ZSBkaXI9IiR7d3NkbC5vdXRwdXQuYmFzZS5kaXJ9L3ZlcnNpb24iLz4NCi0JCTxta2RpciBkaXI9IiR7d3NkbC5vdXRwdXQuYmFzZS5kaXJ9L3ZlcnNpb24iIC8+DQotICAgIDxta2RpciBkaXI9InRhcmdldC90ZXN0LWNsYXNzZXMiLz4NCi0NCi0JCTxqYXZhIGZvcms9InllcyIgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmF4aXMyLndzZGwuV1NETDJKYXZhIiBmYWlsb25lcnJvcj0ieWVzIj4NCi0JCQk8Y2xhc3NwYXRoIHJlZmlkPSJtYXZlbi50ZXN0LmNsYXNzcGF0aCIgLz4NCi0JCQk8Y2xhc3NwYXRoIGxvY2F0aW9uPSIke2NvbXBpbGVkLmNsYXNzZXMuZGlyfSIgLz4NCi0JCQk8YXJnIGxpbmU9Ii1hcCAtbyAke3dzZGwub3V0cHV0LmJhc2UuZGlyfS92ZXJzaW9uIC1kIG5vbmUgLXMgLXUgLXVyaSB0ZXN0LXJlc291cmNlcy93c2Rscy9WZXJzaW9uLndzZGwiIC8+DQotCQk8L2phdmE+DQotCQk8amF2YWMgZm9yaz0ieWVzIiBkZXN0ZGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzIiBkZWJ1Zz0ib24iPg0KLQkJCTxjbGFzc3BhdGggcmVmaWQ9Im1hdmVuLnRlc3QuY2xhc3NwYXRoIiAvPg0KLQkJCTxjbGFzc3BhdGggbG9jYXRpb249IiR7Y29tcGlsZWQuY2xhc3Nlcy5kaXJ9IiAvPg0KLQkJCTxzcmMgcGF0aD0iJHt3c2RsLm91dHB1dC5iYXNlLmRpcn0vdmVyc2lvbiIgLz4NCi0JCTwvamF2YWM+DQotICA8L3RhcmdldD4NCi08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9vdGhlci9NYXBwaW5nRmlsZS54c2QgYi92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL290aGVyL01hcHBpbmdGaWxlLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNlMjZhNC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL290aGVyL01hcHBpbmdGaWxlLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTwhLS0gZWRpdGVkIHdpdGggWE1MU3B5IHYyMDA2IHNwMiBVIChodHRwOi8vd3d3LmFsdG92YS5jb20pIGJ5IEFqaXRoIEhhcnNoYW5hIFJhbmFiYWh1IChXM0MpIC0tPgotPHhzOnNjaGVtYSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiPgotCTx4czplbGVtZW50IG5hbWU9Im1hcHBpbmdzIj4KLQkJPHhzOmFubm90YXRpb24+Ci0JCQk8eHM6ZG9jdW1lbnRhdGlvbj5NYXBwaW5ncyByb290PC94czpkb2N1bWVudGF0aW9uPgotCQk8L3hzOmFubm90YXRpb24+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJtYXBwaW5nIiB0eXBlPSJtYXBwaW5nVHlwZSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9ImRiZiIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJtYXBwaW5nVHlwZSI+Ci0JCTx4czphbm5vdGF0aW9uPgotCQkJPHhzOmRvY3VtZW50YXRpb24+RGVzY3JpcHRpb24gb2YgdGhlIG1hcHBpbmcgPC94czpkb2N1bWVudGF0aW9uPgotCQk8L3hzOmFubm90YXRpb24+Ci0JCTx4czpzZXF1ZW5jZT4KLQkJCTx4czplbGVtZW50IG5hbWU9InFuYW1lIj4KLQkJCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQkJCTx4czpzaW1wbGVDb250ZW50PgotCQkJCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJCQkJCTx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZXNwYWNlIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0ib3B0aW9uYWwiIGRlZmF1bHQ9IiIvPgotCQkJCQkJPC94czpleHRlbnNpb24+Ci0JCQkJCTwveHM6c2ltcGxlQ29udGVudD4KLQkJCQk8L3hzOmNvbXBsZXhUeXBlPgotCQkJPC94czplbGVtZW50PgotCQkJPHhzOmVsZW1lbnQgbmFtZT0idmFsdWUiIHR5cGU9InhzOnN0cmluZyIvPgotCQk8L3hzOnNlcXVlbmNlPgotCTwveHM6Y29tcGxleFR5cGU+Ci08L3hzOnNjaGVtYT4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vb3RoZXIvYmVhbkdlbmVyYXRpb25TY2hlbWEueHNkIGIvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9vdGhlci9iZWFuR2VuZXJhdGlvblNjaGVtYS54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0ZDU1MTYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9vdGhlci9iZWFuR2VuZXJhdGlvblNjaGVtYS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08IS0tIGVkaXRlZCB3aXRoIFhNTFNweSB2MjAwNSByZWwuIDMgVSAoaHR0cDovL3d3dy5hbHRvdmEuY29tKSBieSBBaml0aCBIYXJzaGFuYSBSYW5hYmFodSAoV1NPMi9EZXZlbG9wbWVudCkgLS0+Ci08eHM6c2NoZW1hIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCI+Ci0KLSAgICAgPHhzOmVsZW1lbnQgbmFtZT0iYmVhbnMiPgotCQk8eHM6YW5ub3RhdGlvbj4KLQkJCTx4czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCByZXByZXNlbnRzIHRoZSBYTUwgZG9jdWVtZW50IHN0cnVjdHVyZSBqYXZhIGJlYW4gd3JpdGVyIGdlbmVyYXRlcyBmb3IKLSAgICAgICAgICAgICAgICBhIG11bHRpcGxlIGNsYXNzZXMKLSAgICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJPC94czphbm5vdGF0aW9uPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJiZWFuIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9Im9yaWdpbmFsTmFtZSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9InBhY2thZ2UiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0iYmVhbiI+Ci0JCTx4czphbm5vdGF0aW9uPgotCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IHJlcHJlc2VudHMgdGhlIFhNTCBkb2N1ZW1lbnQgc3RydWN0dXJlIGphdmEgYmVhbiB3cml0ZXIgZ2VuZXJhdGVzIGZvcgotICAgICAgICAgICAgICAgIGEgc2luZ2xlIGNsYXNzCi0gICAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0JCTwveHM6YW5ub3RhdGlvbj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJwcm9wZXJ0eVR5cGUiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0ib3JpZ2luYWxOYW1lIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0icGFja2FnZSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9Im5zdXJpIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0ibnNwcmVmaXgiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0ib3B0aW9uYWwiIGZpeGVkPSJ5ZXMiLz4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0iZXh0ZW5zaW9uIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0ib3B0aW9uYWwiLz4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0iYW5vbiIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9Im9wdGlvbmFsIiBmaXhlZD0ieWVzIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9InVud3JhcHBlZCIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9Im9wdGlvbmFsIiBmaXhlZD0ieWVzIi8+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJwcm9wZXJ0eVR5cGUiPgotCQk8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotCQk8eHM6YXR0cmlidXRlIG5hbWU9ImphdmFuYW1lIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJzaG9ydHR5cGVuYW1lIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJvdXJzIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0ib3B0aW9uYWwiIGZpeGVkPSJ5ZXMiLz4KLQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJhbnkiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJvcHRpb25hbCIgZml4ZWQ9InllcyIvPgotCQk8eHM6YXR0cmlidXRlIG5hbWU9ImFycmF5IiB0eXBlPSJ4czpzdHJpbmciIHVzZT0ib3B0aW9uYWwiIGZpeGVkPSJ5ZXMiLz4KLQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJhbnlBdHQiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJvcHRpb25hbCIgZml4ZWQ9InllcyIvPgotCQk8eHM6YXR0cmlidXRlIG5hbWU9InVuYm91bmQiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJvcHRpb25hbCIgZml4ZWQ9InllcyIvPgotCQk8eHM6YXR0cmlidXRlIG5hbWU9Im1pbk9jY3VycyIgdHlwZT0ieHM6bG9uZyIgdXNlPSJvcHRpb25hbCIvPgotCQk8eHM6YXR0cmlidXRlIG5hbWU9Im1heE9jY3VycyIgdHlwZT0ieHM6bG9uZyIgdXNlPSJvcHRpb25hbCIvPgotCTwveHM6Y29tcGxleFR5cGU+Ci08L3hzOnNjaGVtYT4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vcG9tLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjAxNmJkZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNzkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+MS41LjE8L3ZlcnNpb24+Ci0gICAgICAgIDxyZWxhdGl2ZVBhdGg+Li4vcGFyZW50L3BvbS54bWw8L3JlbGF0aXZlUGF0aD4KLSAgICA8L3BhcmVudD4KLSAgICA8YXJ0aWZhY3RJZD5heGlzMi1jb2RlZ2VuPC9hcnRpZmFjdElkPgotICAgIDxuYW1lPkFwYWNoZSBBeGlzMiAtIENvZGUgR2VuZXJhdGlvbjwvbmFtZT4KLSAgICA8ZGVzY3JpcHRpb24+QXhpczIgQ29kZSBHZW5lcmF0aW9uIG1vZHVsZTwvZGVzY3JpcHRpb24+Ci0gICAgPGRlcGVuZGVuY2llcz4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgPGdyb3VwSWQ+JHtwcm9qZWN0Lmdyb3VwSWR9PC9ncm91cElkPgotICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLWtlcm5lbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICA8Z3JvdXBJZD4ke3Byb2plY3QuZ3JvdXBJZH08L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLWFkYjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgIDxncm91cElkPiR7cHJvamVjdC5ncm91cElkfTwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItdHJhbnNwb3J0LWxvY2FsPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KLSAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICA8Z3JvdXBJZD4ke3Byb2plY3QuZ3JvdXBJZH08L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLXRyYW5zcG9ydC1odHRwPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KLSAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8L2RlcGVuZGVuY2llcz4KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxzb3VyY2VEaXJlY3Rvcnk+c3JjPC9zb3VyY2VEaXJlY3Rvcnk+Ci0gICAgICAgIDx0ZXN0U291cmNlRGlyZWN0b3J5PnRlc3Q8L3Rlc3RTb3VyY2VEaXJlY3Rvcnk+Ci0gICAgICAgIDxyZXNvdXJjZXM+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5jb25mPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi8qLnByb3BlcnRpZXM8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9leGNsdWRlcz4KLSAgICAgICAgICAgICAgICA8ZmlsdGVyaW5nPmZhbHNlPC9maWx0ZXJpbmc+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi8qLmphdmE8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9leGNsdWRlcz4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT4uLi8uLjwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+Tk9USUNFLnR4dDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+TElDRU5TRS50eHQ8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgICAgICA8ZmlsdGVyaW5nPmZhbHNlPC9maWx0ZXJpbmc+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICA8L3Jlc291cmNlcz4KLSAgICAgICAgPHRlc3RSZXNvdXJjZXM+Ci0gICAgICAgICAgICA8dGVzdFJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+dGVzdDwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKi54c2w8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgIDwvdGVzdFJlc291cmNlPgotICAgICAgICAgICAgPHRlc3RSZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5Pi4uL2FkYi1jb2RlZ2VuL3NyYzwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKi54c2w8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgIDwvdGVzdFJlc291cmNlPgotICAgICAgICAgICAgPHRlc3RSZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5Pi4uL3htbGJlYW5zL3NyYzwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKi54c2w8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgIDwvdGVzdFJlc291cmNlPgotICAgICAgICAgICAgPHRlc3RSZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5Pi4uL2pheGJyaS9zcmM8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLyoueHNsPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICA8L3Rlc3RSZXNvdXJjZT4KLSAgICAgICAgICAgIDx0ZXN0UmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT4uLi9qaWJ4L3NyYzwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKi54c2w8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgIDwvdGVzdFJlc291cmNlPgotICAgICAgICA8L3Rlc3RSZXNvdXJjZXM+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KLSAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICA8c2tpcD5mYWxzZTwvc2tpcD4KLSAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLypUZXN0LmphdmE8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPC9wbHVnaW4+Ci0KLSAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFudHJ1bi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICA8aWQ+Z2VuZXJhdGUtdGVzdC1zb3VyY2VzPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgPHBoYXNlPmdlbmVyYXRlLXRlc3Qtc291cmNlczwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgIDx0YXNrcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gU2V0IGEgcHJvcGVydHkgdGhhdCBjYW4gYmUgcGlja2VkIHVwIGZyb20gdGhlIGFudCBidWlsZC54bWwncyAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJtYXZlbi5jbGFzcy5wYXRoIiByZWZpZD0ibWF2ZW4udGVzdC5jbGFzc3BhdGgiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlY2hvPkJ1aWxkaW5nIFdTRExzLi4uPC9lY2hvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImF4aXMyLmhvbWUiIHZhbHVlPSIke2Jhc2VkaXJ9Ly4uL3RhcmdldCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im1hdmVuLmp1bml0Lmp2bWFyZ3MiIHZhbHVlPSIiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGlkPSJtYXZlbi5kZXBlbmRlbmN5LmNsYXNzcGF0aCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIHJlZmlkPSJtYXZlbi5jb21waWxlLmNsYXNzcGF0aCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgotICAgICAgICAgICAgICAgICAgICAgICAgPGFudCBhbnRmaWxlPSJidWlsZC13c2Rscy54bWwiIGluaGVyaXRhbGw9InRydWUiIGluaGVyaXRyZWZzPSJ0cnVlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXI9Ii4iIHRhcmdldD0id3NkbC1jb2RlZ2VuIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgPC90YXNrcz4KLSAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgPGdvYWw+cnVuPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICA8aWQ+cHJvY2Vzcy1yZXNvdXJjZXM8L2lkPgotICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cHJvY2Vzcy1yZXNvdXJjZXM8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICA8dGFza3M+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8dHN0YW1wPgotICAgICAgICAgICAgICAgICAgICAgICAgICA8Zm9ybWF0IHByb3BlcnR5PSJidWlsZC50aW1lIiBwYXR0ZXJuPSJNTU0gZGQsIHl5eXkgKGhoOm1tOnNzIHopIiBsb2NhbGU9ImVuIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3RzdGFtcD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb3B5IHRvRGlyPSIke2Jhc2VkaXJ9L3RhcmdldC9jbGFzc2VzLyIgb3ZlcndyaXRlPSJ0cnVlIiBmaWx0ZXJpbmc9Im9uIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke2Jhc2VkaXJ9L3NyYy8iIGluY2x1ZGVzPSIqKi8qLnhzbCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsdGVyc2V0IGJlZ2ludG9rZW49IiMiIGVuZHRva2VuPSIjIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsdGVyIHRva2VuPSJheGlzVmVyc2lvbiIgdmFsdWU9IiR7dmVyc2lvbn0iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsdGVyIHRva2VuPSJ0b2RheSIgdmFsdWU9IiBCdWlsdCBvbiA6ICR7YnVpbGQudGltZX0iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWx0ZXJzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvcHk+Ci0gICAgICAgICAgICAgICAgICAgICAgPC90YXNrcz4KLSAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgPGdvYWw+cnVuPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgIDwvcGx1Z2lucz4KLSAgICA8L2J1aWxkPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL1dTREwyQy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL1dTREwyQy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzNhMjlmLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9XU0RMMkMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi53c2RsOwotCi1wdWJsaWMgY2xhc3MgV1NETDJDIHsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nW10gY2FyZ3MgPSBuZXcgU3RyaW5nW2FyZ3MubGVuZ3RoICsgMl07Ci0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYXJncywgMCwgY2FyZ3MsIDAsIGFyZ3MubGVuZ3RoKTsKLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJvcmcuYXBhY2hlLmFkYi5wcm9wZXJ0aWVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICIvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvYy1zY2hlbWEtY29tcGlsZS5wcm9wZXJ0aWVzIik7Ci0gICAgICAgIGNhcmdzW2FyZ3MubGVuZ3RoXSA9ICItbCI7Ci0gICAgICAgIGNhcmdzW2FyZ3MubGVuZ3RoICsgMV0gPSAiYyI7Ci0KLSAgICAgICAgV1NETDJDb2RlLm1haW4oY2FyZ3MpOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvV1NETDJDb2RlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvV1NETDJDb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlMjFmMDQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL1dTREwyQ29kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLndzZGw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLkNvbW1hbmRMaW5lT3B0aW9uUGFyc2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLkNvZGVHZW5lcmF0aW9uRW5naW5lOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5pMThuLkNvZGVnZW5NZXNzYWdlczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwudXRpbC5XU0RMMkphdmFPcHRpb25zVmFsaWRhdG9yOwotCi1wdWJsaWMgY2xhc3MgV1NETDJDb2RlIHsKLQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIENvbW1hbmRMaW5lT3B0aW9uUGFyc2VyIGNvbW1hbmRMaW5lT3B0aW9uUGFyc2VyID0gbmV3IENvbW1hbmRMaW5lT3B0aW9uUGFyc2VyKAotICAgICAgICAgICAgICAgIGFyZ3MpOwotICAgICAgICBpZiAoaXNPcHRpb25zVmFsaWQoY29tbWFuZExpbmVPcHRpb25QYXJzZXIpKXsKLSAgICAgICAgICAgIG5ldyBDb2RlR2VuZXJhdGlvbkVuZ2luZShjb21tYW5kTGluZU9wdGlvblBhcnNlcikuZ2VuZXJhdGUoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHByaW50VXNhZ2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcHJpbnRVc2FnZSgpIHsKLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oQ29kZWdlbk1lc3NhZ2VzLmdldE1lc3NhZ2UoIndzZGwyY29kZS5hcmciKSk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihDb2RlZ2VuTWVzc2FnZXMuZ2V0TWVzc2FnZSgid3NkbDJjb2RlLmFyZzEiKSk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAyOyBpIDw9IDQ5OyBpKyspIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAiICsgQ29kZWdlbk1lc3NhZ2VzLmdldE1lc3NhZ2UoIndzZGwyY29kZS5hcmciICsgaSkpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzT3B0aW9uc1ZhbGlkKENvbW1hbmRMaW5lT3B0aW9uUGFyc2VyIHBhcnNlcikgewotICAgICAgICBib29sZWFuIGlzVmFsaWQgPSB0cnVlOwotICAgICAgICBpZiAocGFyc2VyLmdldEludmFsaWRPcHRpb25zKG5ldyBXU0RMMkphdmFPcHRpb25zVmFsaWRhdG9yKCkpLnNpemUoKSA+IDApewotICAgICAgICAgICAgaXNWYWxpZCA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChudWxsID09IHBhcnNlci5nZXRBbGxPcHRpb25zKCkuZ2V0KAotICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLldTRExfTE9DQVRJT05fVVJJX09QVElPTikpewotICAgICAgICAgICAgaXNWYWxpZCA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpc1ZhbGlkOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL1dTREwySmF2YS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL1dTREwySmF2YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDBjMTkyLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9XU0RMMkphdmEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi53c2RsOwotCi1wdWJsaWMgY2xhc3MgV1NETDJKYXZhIHsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgV1NETDJDb2RlLm1haW4oYXJncyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vQ29kZUdlbkNvbmZpZ3VyYXRpb24uamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL0NvZGVHZW5Db25maWd1cmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhMTQ5NjYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vQ29kZUdlbkNvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLlVSTFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuZGF0YWJpbmRpbmcuVHlwZU1hcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwudXRpbC5Db25maWdQcm9wZXJ0eUZpbGVMb2FkZXI7Ci0KLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLXB1YmxpYyBjbGFzcyBDb2RlR2VuQ29uZmlndXJhdGlvbiBpbXBsZW1lbnRzIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzIHsKLQotICAgIC8qKiBBeGlzIFNlcnZpY2VzIHJlZmVyZW5jZSAqLwotICAgIHByaXZhdGUgTGlzdCBheGlzU2VydmljZXM7Ci0KLSAgICAvKiogQXhpcyBzZXJ2aWNlIHRvIHVzZSAqLwotICAgIHByaXZhdGUgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2U7Ci0KLSAgICAvKiogQmFzZSBVUkkgKi8KLSAgICBwcml2YXRlIFN0cmluZyBiYXNlVVJJOwotICAgIC8qKiBwYXRoIHRvIHRoZSByZXBvc2l0b3J5IC0gdXNlZCBmb3IgZXZhbHVhdGluZyBwb2xpY3kgKi8KLSAgICBwcml2YXRlIFN0cmluZyByZXBvc2l0b3J5UGF0aDsKLSAgICAvKiogTWFwcGluZyBmaWxlIGluY2x1ZGluZyB0aGUgcW5hbWUgdG8gdHlwZSBtYXAgKi8KLSAgICBwcml2YXRlIEZpbGUgdHlwZU1hcHBpbmdGaWxlOwotCi0gICAgLyoqIGtlZXBzIHRoZSBXU0RMIHZlcnNpb24gIC0gZGVmYXVsdCBpcyAxLjEgKi8KLSAgICBwcml2YXRlIFN0cmluZyBXU0RMVmVyc2lvbiA9IFdTREwySmF2YUNvbnN0YW50cy5XU0RMX1ZFUlNJT05fMTsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0V1NETFZlcnNpb24oKSB7Ci0gICAgICAgIHJldHVybiBXU0RMVmVyc2lvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRXU0RMVmVyc2lvbihTdHJpbmcgV1NETFZlcnNpb24pIHsKLSAgICAgICAgdGhpcy5XU0RMVmVyc2lvbiA9IFdTRExWZXJzaW9uOwotICAgIH0KLQotICAgIHB1YmxpYyBGaWxlIGdldFR5cGVNYXBwaW5nRmlsZSgpIHsKLSAgICAgICAgcmV0dXJuIHR5cGVNYXBwaW5nRmlsZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRUeXBlTWFwcGluZ0ZpbGUoRmlsZSB0eXBlTWFwcGluZ0ZpbGUpIHsKLSAgICAgICAgdGhpcy50eXBlTWFwcGluZ0ZpbGUgPSB0eXBlTWFwcGluZ0ZpbGU7Ci0gICAgfQotCi0gICAgLyoqIEEgbWFwIHRvIGtlZXAgdGhlIGN1c3RvbSBuYW1lc3BhY2UgYW5kIHBhY2thZ2UgbmFtZSBtYXBwaW5ncyAqLwotICAgIHByaXZhdGUgTWFwIHVyaTJQYWNrYWdlTmFtZU1hcDsKLQotCi0gICAgcHVibGljIE1hcCBnZXRVcmkyUGFja2FnZU5hbWVNYXAoKSB7Ci0gICAgICAgIHJldHVybiB1cmkyUGFja2FnZU5hbWVNYXA7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VXJpMlBhY2thZ2VOYW1lTWFwKE1hcCB1cmkyUGFja2FnZU5hbWVNYXApIHsKLSAgICAgICAgaWYgKHRoaXMudXJpMlBhY2thZ2VOYW1lTWFwID09IG51bGwpIHsKLSAgICAgICAgICAgIHRoaXMudXJpMlBhY2thZ2VOYW1lTWFwID0gdXJpMlBhY2thZ2VOYW1lTWFwOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhpcy51cmkyUGFja2FnZU5hbWVNYXAucHV0QWxsKHVyaTJQYWNrYWdlTmFtZU1hcCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiogRnVsbCBwYXRoIGFuZCBuYW1lIG9mIFhNTEJlYW5zIHhzZGNvbmZpZyBmaWxlIHRvIHVzZSAqLwotICAgIHByaXZhdGUgU3RyaW5nIHhzZENvbmZpZ0ZpbGUgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgeHNkY29uZmlnIGZpbGUgdG8gdXNlIGZvciBYTUxCZWFucyBkYXRhIGJpbmRpbmcuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIEZ1bGwgcGF0aCBhbmQgbmFtZSBvZiBYTUxCZWFucyB4c2Rjb25maWcgZmlsZSB0byB1c2UKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0WHNkQ29uZmlnRmlsZSgpIHsKLSAgICAgICAgcmV0dXJuIHhzZENvbmZpZ0ZpbGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgeHNkY29uZmlnIGZpbGUgdG8gdXNlIGZvciBYTUxCZWFucyBkYXRhIGJpbmRpbmcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0geHNkQ29uZmlnRmlsZSBGdWxsIHBhdGggYW5kIG5hbWUgb2YgWE1MQmVhbnMgeHNkY29uZmlnIGZpbGUgdG8gdXNlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRYc2RDb25maWdGaWxlKFN0cmluZyB4c2RDb25maWdGaWxlKSB7Ci0gICAgICAgIHRoaXMueHNkQ29uZmlnRmlsZSA9IHhzZENvbmZpZ0ZpbGU7Ci0gICAgfQotCi0gICAgLyoqIFNheXMgd2hldGhlciB0byBmbGF0dGVuIHRoZSBmaWxlcyBvciBwdXQgdGhlbSBpbiBzcGVjaWZpYyBmb2xkZXJzICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGZsYXR0ZW5GaWxlcyA9IGZhbHNlOwotCi0gICAgcHVibGljIGJvb2xlYW4gaXNGbGF0dGVuRmlsZXMoKSB7Ci0gICAgICAgIHJldHVybiBmbGF0dGVuRmlsZXM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RmxhdHRlbkZpbGVzKGJvb2xlYW4gZmxhdHRlbkZpbGVzKSB7Ci0gICAgICAgIHRoaXMuZmxhdHRlbkZpbGVzID0gZmxhdHRlbkZpbGVzOwotICAgIH0KLQotICAgIC8qKiBGb2xkZXIgbmFtZSBmb3IgdGhlIHJlc291cmNlIGZpbGVzICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgcmVzb3VyY2VMb2NhdGlvbiA9IENvbmZpZ1Byb3BlcnR5RmlsZUxvYWRlci5nZXRSZXNvdXJjZUZvbGRlck5hbWUoKTsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVzb3VyY2VMb2NhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIHJlc291cmNlTG9jYXRpb247Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UmVzb3VyY2VMb2NhdGlvbihTdHJpbmcgcmVzb3VyY2VMb2NhdGlvbikgewotICAgICAgICB0aGlzLnJlc291cmNlTG9jYXRpb24gPSByZXNvdXJjZUxvY2F0aW9uOwotICAgIH0KLQotICAgIC8qKiBGb2xkZXIgbmFtZSBmb3IgdGhlIHNvdXJjZSBmaWxlcyAqLwotICAgIHByaXZhdGUgU3RyaW5nIHNvdXJjZUxvY2F0aW9uID0gQ29uZmlnUHJvcGVydHlGaWxlTG9hZGVyLmdldFNyY0ZvbGRlck5hbWUoKTsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U291cmNlTG9jYXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBzb3VyY2VMb2NhdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTb3VyY2VMb2NhdGlvbihTdHJpbmcgc291cmNlTG9jYXRpb24pIHsKLSAgICAgICAgdGhpcy5zb3VyY2VMb2NhdGlvbiA9IHNvdXJjZUxvY2F0aW9uOwotICAgIH0KLQotICAgIC8qKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHBhcmFtZXRlcnMgYXJlIHdyYXBwZWQgb3IgdW53cmFwcGVkIHRydWUgYnkgZGVmYXVsdCAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBwYXJhbWV0ZXJzV3JhcHBlZCA9IHRydWU7Ci0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzUGFyYW1ldGVyc1dyYXBwZWQoKSB7Ci0gICAgICAgIHJldHVybiBwYXJhbWV0ZXJzV3JhcHBlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJhbWV0ZXJzV3JhcHBlZChib29sZWFuIHBhcmFtZXRlcnNXcmFwcGVkKSB7Ci0gICAgICAgIHRoaXMucGFyYW1ldGVyc1dyYXBwZWQgPSBwYXJhbWV0ZXJzV3JhcHBlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEJhc2VVUkkoKSB7Ci0gICAgICAgIHJldHVybiBiYXNlVVJJOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEJhc2VVUkkoU3RyaW5nIGJhc2VVUkkpIHsKLSAgICAgICAgdGhpcy5iYXNlVVJJID0gYmFzZVVSSTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWFwIGdldENvbmZpZ3VyYXRpb25Qcm9wZXJ0aWVzKCkgewotICAgICAgICByZXR1cm4gY29uZmlndXJhdGlvblByb3BlcnRpZXM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q29uZmlndXJhdGlvblByb3BlcnRpZXMoTWFwIGNvbmZpZ3VyYXRpb25Qcm9wZXJ0aWVzKSB7Ci0gICAgICAgIHRoaXMuY29uZmlndXJhdGlvblByb3BlcnRpZXMgPSBjb25maWd1cmF0aW9uUHJvcGVydGllczsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyB2b2lkIHNldE91dHB1dExhbmd1YWdlKFN0cmluZyBvdXRwdXRMYW5ndWFnZSkgewotICAgICAgICB0aGlzLm91dHB1dExhbmd1YWdlID0gb3V0cHV0TGFuZ3VhZ2U7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QWR2YW5jZWRDb2RlR2VuRW5hYmxlZChib29sZWFuIGFkdmFuY2VkQ29kZUdlbkVuYWJsZWQpIHsKLSAgICAgICAgdGhpcy5hZHZhbmNlZENvZGVHZW5FbmFibGVkID0gYWR2YW5jZWRDb2RlR2VuRW5hYmxlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRBc3luY09uKGJvb2xlYW4gYXN5bmNPbikgewotICAgICAgICB0aGlzLmFzeW5jT24gPSBhc3luY09uOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFN5bmNPbihib29sZWFuIHN5bmNPbikgewotICAgICAgICB0aGlzLnN5bmNPbiA9IHN5bmNPbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTZXJ2ZXJTaWRlKGJvb2xlYW4gc2VydmVyU2lkZSkgewotICAgICAgICB0aGlzLnNlcnZlclNpZGUgPSBzZXJ2ZXJTaWRlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEdlbmVyYXRlRGVwbG95ZW1lbnREZXNjcmlwdG9yKGJvb2xlYW4gZ2VuZXJhdGVEZXBsb3llbWVudERlc2NyaXB0b3IpIHsKLSAgICAgICAgdGhpcy5nZW5lcmF0ZURlcGxveWVtZW50RGVzY3JpcHRvciA9IGdlbmVyYXRlRGVwbG95ZW1lbnREZXNjcmlwdG9yOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFdyaXRlVGVzdENhc2UoYm9vbGVhbiB3cml0ZVRlc3RDYXNlKSB7Ci0gICAgICAgIHRoaXMud3JpdGVUZXN0Q2FzZSA9IHdyaXRlVGVzdENhc2U7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0T3V0cHV0TG9jYXRpb24oRmlsZSBvdXRwdXRMb2NhdGlvbikgewotICAgICAgICB0aGlzLm91dHB1dExvY2F0aW9uID0gb3V0cHV0TG9jYXRpb247Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBGaWxlIG91dHB1dExvY2F0aW9uOwotCi0gICAgLy9nZXQgdGhlIGRlZmF1bHRzIGZvciB0aGVzZSBmcm9tIHRoZSBwcm9wZXJ0eSBmaWxlCi0gICAgcHJpdmF0ZSBTdHJpbmcgb3V0cHV0TGFuZ3VhZ2UgPSBDb25maWdQcm9wZXJ0eUZpbGVMb2FkZXIuZ2V0RGVmYXVsdExhbmd1YWdlKCk7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgZGF0YWJpbmRpbmdUeXBlID0gQ29uZmlnUHJvcGVydHlGaWxlTG9hZGVyLmdldERlZmF1bHREQkZyYW1ld29ya05hbWUoKTsKLSAgICBwcml2YXRlIGJvb2xlYW4gYWR2YW5jZWRDb2RlR2VuRW5hYmxlZCA9IGZhbHNlOwotCi0KLSAgICBwcml2YXRlIGJvb2xlYW4gYXN5bmNPbiA9IHRydWU7Ci0gICAgcHJpdmF0ZSBib29sZWFuIHN5bmNPbiA9IHRydWU7Ci0gICAgcHJpdmF0ZSBib29sZWFuIHNlcnZlclNpZGUgPSBmYWxzZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gZ2VuZXJhdGVEZXBsb3llbWVudERlc2NyaXB0b3IgPSB0cnVlOwotICAgIHByaXZhdGUgYm9vbGVhbiB3cml0ZVRlc3RDYXNlID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBib29sZWFuIHNraXBNZXNzYWdlUmVjZWl2ZXIgPSBmYWxzZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gc2tpcFdyaXRlV1NETHMgPSBmYWxzZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gc2tpcEJ1aWxkWE1MID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBib29sZWFuIHNldG91dHB1dFNvdXJjZUxvY2F0aW9uID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgcGFja2FnZU5hbWUgPSBVUkxQcm9jZXNzb3IuREVGQVVMVF9QQUNLQUdFOwotCi0gICAgLy8gRGVmYXVsdCBwYWNrQ2xhc3NlcyBpcyB0cnVlLCB3aGljaCBtZWFucyB0aGUgY2xhc3NlcyBnZW5lcmF0ZWQKLSAgICAvLyBieSBkZWZhdWx0IGFyZSB3cmFwcGVkLiBUaGUgZWZmZWN0IG9mIHRoaXMgc2V0dGluZyB3aWxsIGJlIGNvbnRyb2xsZWQKLSAgICAvLyB0byBzb21lIGV4dGVudCwgYnkgdGhlIG90aGVyIHNldHRpbmdzIGFzIHdlbGwuCi0gICAgcHJpdmF0ZSBib29sZWFuIHBhY2tDbGFzc2VzID0gdHJ1ZTsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBnZW5lcmF0ZUFsbCA9IGZhbHNlOwotCi0gICAgLy91c2VyIHNlbGVjdGVkIHBvcnRuYW1lCi0gICAgcHJpdmF0ZSBTdHJpbmcgcG9ydE5hbWU7Ci0gICAgLy91c2VyIHNlbGVjdGVkIHNlcnZpY2VuYW1lCi0gICAgcHJpdmF0ZSBTdHJpbmcgc2VydmljZU5hbWU7Ci0KLSAgICAvL29wdGlvbiB0byBnZW5lcmF0ZSBzZXJ2ZXIgc2lkZSBpbnRlcmZhY2Ugb3Igbm90Ci0gICAgcHJpdmF0ZSBib29sZWFuIHNlcnZlclNpZGVJbnRlcmZhY2UgPSBmYWxzZTsKLQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNTZXJ2ZXJTaWRlSW50ZXJmYWNlKCkgewotICAgICAgICByZXR1cm4gc2VydmVyU2lkZUludGVyZmFjZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTZXJ2ZXJTaWRlSW50ZXJmYWNlKGJvb2xlYW4gc2VydmVyU2lkZUludGVyZmFjZSkgewotICAgICAgICB0aGlzLnNlcnZlclNpZGVJbnRlcmZhY2UgPSBzZXJ2ZXJTaWRlSW50ZXJmYWNlOwotICAgIH0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1NldG91dHB1dFNvdXJjZUxvY2F0aW9uKCl7Ci0gICAgICByZXR1cm4gIHNldG91dHB1dFNvdXJjZUxvY2F0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UG9ydE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBwb3J0TmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQb3J0TmFtZShTdHJpbmcgcG9ydE5hbWUpIHsKLSAgICAgICAgdGhpcy5wb3J0TmFtZSA9IHBvcnROYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmljZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBzZXJ2aWNlTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlTmFtZShTdHJpbmcgc2VydmljZU5hbWUpIHsKLSAgICAgICAgdGhpcy5zZXJ2aWNlTmFtZSA9IHNlcnZpY2VOYW1lOwotICAgIH0KLQotICAgIC8qKiBBIGhhc2htYXAgdG8gaGFuZyB0aGUgcHJvcGVydHkgb2JqZWN0cyAqLwotICAgIHByaXZhdGUgTWFwIHBvbGljeU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICAvKgotICAgICogQSBoYXNobWFwIG9mIHByb3BlcnRpZXMgdGhhdCBtYXkgYmUgcG9wdWxhdGVkIG9uIHRoZSB3YXkuIGV4dGVuc2lvbnMgY2FuIHBvcHVsYXRlIGl0Ci0gICAgKiBUaGlzIGNhbiBiZSB1c2VkIHRvIGtlZXAgbm9uIHNwZWNpZmljIGluZm9ybWF0aW9uCi0gICAgKi8KLSAgICBwcml2YXRlIE1hcCBjb25maWd1cmF0aW9uUHJvcGVydGllcyA9IG5ldyBIYXNoTWFwKCk7Ci0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzR2VuZXJhdGVBbGwoKSB7Ci0gICAgICAgIHJldHVybiBnZW5lcmF0ZUFsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZUFsbChib29sZWFuIGdlbmVyYXRlQWxsKSB7Ci0gICAgICAgIHRoaXMuZ2VuZXJhdGVBbGwgPSBnZW5lcmF0ZUFsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB3cmFwIGNsYXNzZXMgZmxhZy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gUmV0dXJucyB0cnVlIGlmIGl0IGlzIGEgd3JhcCBjbGFzcywgZWxzZSByZXR1cm5zIGZhbHNlLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzUGFja0NsYXNzZXMoKSB7Ci0gICAgICAgIHJldHVybiBwYWNrQ2xhc3NlczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB3cmFwIGNsYXNzZXMgZmxhZy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYWNrQ2xhc3NlcwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFBhY2tDbGFzc2VzKGJvb2xlYW4gcGFja0NsYXNzZXMpIHsKLSAgICAgICAgdGhpcy5wYWNrQ2xhc3NlcyA9IHBhY2tDbGFzc2VzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHBvbGljeSBtYXAuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgTWFwLgotICAgICAqLwotICAgIHB1YmxpYyBNYXAgZ2V0UG9saWN5TWFwKCkgewotICAgICAgICByZXR1cm4gcG9saWN5TWFwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHBvbGljeSBtYXAuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcG9saWN5TWFwCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UG9saWN5TWFwKE1hcCBwb2xpY3lNYXApIHsKLSAgICAgICAgdGhpcy5wb2xpY3lNYXAgPSBwb2xpY3lNYXA7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBQdXRzIGEgcHJvcGVydHkgaW50byB0aGUgY29uZmlndXJhdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXkKLSAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwdXRQcm9wZXJ0eShPYmplY3Qga2V5LCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgY29uZmlndXJhdGlvblByb3BlcnRpZXMucHV0KGtleSwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHByb3BlcnR5IGZyb20gdGhlIGNvbmZpZ3VyYXRpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5Ci0gICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBwcm9wZXJ0eSBhcyBPYmplY3QuCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShPYmplY3Qga2V5KSB7Ci0gICAgICAgIHJldHVybiBjb25maWd1cmF0aW9uUHJvcGVydGllcy5nZXQoa2V5KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGFsbCBwcm9wZXJ0eSBvYmplY3RzLgotICAgICAqCi0gICAgICogQHJldHVybiBSZXR1cm5zIE1hcCBvZiBhbGwgcHJvcGVydGllcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWFwIGdldFByb3BlcnRpZXMoKSB7Ci0gICAgICAgIHJldHVybiBjb25maWd1cmF0aW9uUHJvcGVydGllczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFR5cGVNYXBwZXIgdHlwZU1hcHBlcjsKLQotCi0gICAgLyoqIEByZXR1cm4gUmV0dXJucyBUeXBlTWFwcGVyLiAqLwotICAgIHB1YmxpYyBUeXBlTWFwcGVyIGdldFR5cGVNYXBwZXIoKSB7Ci0gICAgICAgIHJldHVybiB0eXBlTWFwcGVyOwotICAgIH0KLQotICAgIC8qKiBAcGFyYW0gdHlwZU1hcHBlciAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUeXBlTWFwcGVyKFR5cGVNYXBwZXIgdHlwZU1hcHBlcikgewotICAgICAgICB0aGlzLnR5cGVNYXBwZXIgPSB0eXBlTWFwcGVyOwotICAgIH0KLQotICAgIC8qKiBAcmV0dXJuIFJldHVybnMgU3RyaW5nLiAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGF0YWJpbmRpbmdUeXBlKCkgewotICAgICAgICByZXR1cm4gZGF0YWJpbmRpbmdUeXBlOwotICAgIH0KLQotICAgIC8qKiBAcGFyYW0gZGF0YWJpbmRpbmdUeXBlICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERhdGFiaW5kaW5nVHlwZShTdHJpbmcgZGF0YWJpbmRpbmdUeXBlKSB7Ci0gICAgICAgIHRoaXMuZGF0YWJpbmRpbmdUeXBlID0gZGF0YWJpbmRpbmdUeXBlOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgZm9yIHRoZSBjb25maWd1cmF0aW9uLiBJdCBwb3B1bGF0ZXMgdGhlIHZhbHVlcyB1c2luZyB0aGUgb3B0aW9ucyBtYXAuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb3B0aW9uTWFwCi0gICAgICovCi0gICAgcHVibGljIENvZGVHZW5Db25maWd1cmF0aW9uKE1hcCBvcHRpb25NYXApIHsKLSAgICAgICAgQ29kZWdlbkNvbmZpZ0xvYWRlci5sb2FkQ29uZmlnKHRoaXMsIG9wdGlvbk1hcCk7Ci0gICAgICAgIHRoaXMuYXhpc1NlcnZpY2VzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICB0aGlzLm91dHB1dFhtbEZpbGVOYW1lc0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgfQotCi0KLSAgICAvKiogQHJldHVybiBSZXR1cm5zIHRoZSBvdXRwdXRMb2NhdGlvbi4gKi8KLSAgICBwdWJsaWMgRmlsZSBnZXRPdXRwdXRMb2NhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIG91dHB1dExvY2F0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0T3V0cHV0TGFuZ3VhZ2UoKSB7Ci0gICAgICAgIHJldHVybiBvdXRwdXRMYW5ndWFnZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0FkdmFuY2VkQ29kZUdlbkVuYWJsZWQoKSB7Ci0gICAgICAgIHJldHVybiBhZHZhbmNlZENvZGVHZW5FbmFibGVkOwotICAgIH0KLQotCi0gICAgLyoqIEByZXR1cm4gUmV0dXJucyB0aGUgcGFja2FnZU5hbWUuICovCi0gICAgcHVibGljIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHBhY2thZ2VOYW1lOwotICAgIH0KLQotICAgIC8qKiBAcGFyYW0gcGFja2FnZU5hbWUgVGhlIHBhY2thZ2VOYW1lIHRvIHNldC4gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQYWNrYWdlTmFtZShTdHJpbmcgcGFja2FnZU5hbWUpIHsKLSAgICAgICAgdGhpcy5wYWNrYWdlTmFtZSA9IHBhY2thZ2VOYW1lOwotICAgIH0KLQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNBc3luY09uKCkgewotICAgICAgICByZXR1cm4gYXN5bmNPbjsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzU3luY09uKCkgewotICAgICAgICByZXR1cm4gc3luY09uOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzU2VydmVyU2lkZSgpIHsKLSAgICAgICAgcmV0dXJuIHNlcnZlclNpZGU7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNHZW5lcmF0ZURlcGxveWVtZW50RGVzY3JpcHRvcigpIHsKLSAgICAgICAgcmV0dXJuIGdlbmVyYXRlRGVwbG95ZW1lbnREZXNjcmlwdG9yOwotICAgIH0KLQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNTa2lwQnVpbGRYTUwoKSB7Ci0gICAgICAgIHJldHVybiBza2lwQnVpbGRYTUw7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2tpcEJ1aWxkWE1MKGJvb2xlYW4gc2tpcEJ1aWxkWE1MKSB7Ci0gICAgICAgIHRoaXMuc2tpcEJ1aWxkWE1MID0gc2tpcEJ1aWxkWE1MOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzV3JpdGVUZXN0Q2FzZSgpIHsKLSAgICAgICAgcmV0dXJuIHdyaXRlVGVzdENhc2U7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNTa2lwV3JpdGVXU0RMcygpIHsKLSAgICAgICAgcmV0dXJuIHNraXBXcml0ZVdTRExzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFNraXBXcml0ZVdTRExzKGJvb2xlYW4gd3JpdGVXcml0ZVdTRExzKSB7Ci0gICAgICAgIHRoaXMuc2tpcFdyaXRlV1NETHMgPSB3cml0ZVdyaXRlV1NETHM7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNTa2lwTWVzc2FnZVJlY2VpdmVyKCkgewotICAgICAgICByZXR1cm4gc2tpcE1lc3NhZ2VSZWNlaXZlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTa2lwTWVzc2FnZVJlY2VpdmVyKGJvb2xlYW4gc2tpcE1lc3NhZ2VSZWNlaXZlcikgewotICAgICAgICB0aGlzLnNraXBNZXNzYWdlUmVjZWl2ZXIgPSBza2lwTWVzc2FnZVJlY2VpdmVyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFJlcG9zaXRvcnlQYXRoKFN0cmluZyByZXBvc2l0b3J5UGF0aCkgewotICAgICAgICB0aGlzLnJlcG9zaXRvcnlQYXRoID0gcmVwb3NpdG9yeVBhdGg7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRSZXBvc2l0b3J5UGF0aCgpIHsKLSAgICAgICAgcmV0dXJuIHJlcG9zaXRvcnlQYXRoOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0IGdldEF4aXNTZXJ2aWNlcygpIHsKLSAgICAgICAgcmV0dXJuIGF4aXNTZXJ2aWNlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRBeGlzU2VydmljZXMoTGlzdCBheGlzU2VydmljZXMpIHsKLSAgICAgICAgdGhpcy5heGlzU2VydmljZXMgPSBheGlzU2VydmljZXM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkQXhpc1NlcnZpY2UoQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UpIHsKLSAgICAgICAgdGhpcy5heGlzU2VydmljZXMuYWRkKGF4aXNTZXJ2aWNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXhpc1NlcnZpY2UgZ2V0QXhpc1NlcnZpY2UoKSB7Ci0gICAgICAgIC8vIHJldHVybiB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgYXhpcyBzZXJ2aWNlcwotICAgICAgICBpZiAoYXhpc1NlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGF4aXNTZXJ2aWNlOwotICAgICAgICB9IGVsc2UgaWYgKChheGlzU2VydmljZXMgIT0gbnVsbCkgJiYgKGF4aXNTZXJ2aWNlcy5zaXplKCkgPiAwKSkgewotICAgICAgICAgICAgcmV0dXJuIChBeGlzU2VydmljZSlheGlzU2VydmljZXMuZ2V0KDApOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRBeGlzU2VydmljZShBeGlzU2VydmljZSBheGlzU2VydmljZSkgewotICAgICAgICB0aGlzLmF4aXNTZXJ2aWNlID0gYXhpc1NlcnZpY2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBmbGFnIGRldGVybWluZXMgd2hldGhlciB0aGUgZ2VuZXJhdGVkIGNsYXNzZXMgYXJlIGV4cGVjdGVkIHRvIGJlIGJhY2t3b3JkIGNvbXBhdGlibGUKLSAgICAgKiB3aXRoIEF4aXMgMS54Ci0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGJhY2t3b3JkQ29tcGF0aWJpbGl0eU1vZGUgPSBmYWxzZTsKLQotICAgIHB1YmxpYyBib29sZWFuIGlzQmFja3dvcmRDb21wYXRpYmlsaXR5TW9kZSgpIHsKLSAgICAgICAgcmV0dXJuIGJhY2t3b3JkQ29tcGF0aWJpbGl0eU1vZGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QmFja3dvcmRDb21wYXRpYmlsaXR5TW9kZShib29sZWFuIGJhY2t3b3JkQ29tcGF0aWJpbGl0eU1vZGUpIHsKLSAgICAgICAgdGhpcy5iYWNrd29yZENvbXBhdGliaWxpdHlNb2RlID0gYmFja3dvcmRDb21wYXRpYmlsaXR5TW9kZTsKLSAgICB9Ci0KLSAgICAvKiogU2hvdWxkIHdlIHN1cHByZXNzIG5hbWVzcGFjZSBwcmVmaXhlcyAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBzdXBwcmVzc1ByZWZpeGVzTW9kZSA9IGZhbHNlOwotCi0gICAgcHVibGljIGJvb2xlYW4gaXNTdXBwcmVzc1ByZWZpeGVzTW9kZSgpIHsKLSAgICAgICAgcmV0dXJuIHN1cHByZXNzUHJlZml4ZXNNb2RlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFN1cHByZXNzUHJlZml4ZXNNb2RlKGJvb2xlYW4gc3VwcHJlc3NQcmVmaXhlc01vZGUpIHsKLSAgICAgICAgdGhpcy5zdXBwcmVzc1ByZWZpeGVzTW9kZSA9IHN1cHByZXNzUHJlZml4ZXNNb2RlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0TmFtZXNwYWNlKCkgewotICAgICAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0gbnVsbDsKLSAgICAgICAgaWYgKCh0aGlzLmF4aXNTZXJ2aWNlcyAhPSBudWxsKSAmJiAodGhpcy5heGlzU2VydmljZXMuc2l6ZSgpID4gMCkpIHsKLSAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZSA9ICgoQXhpc1NlcnZpY2UpdGhpcy5heGlzU2VydmljZXMuZ2V0KDApKS5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGFyZ2V0TmFtZXNwYWNlOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0IGdldFNjaGVtYUxpc3RGb3JBbGxTZXJ2aWNlcygpIHsKLSAgICAgICAgTGlzdCBzY2hlbWFzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBBeGlzU2VydmljZSBheGlzU2VydmljZTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gdGhpcy5heGlzU2VydmljZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBheGlzU2VydmljZSA9IChBeGlzU2VydmljZSlpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIHNjaGVtYXMuYWRkQWxsKGF4aXNTZXJ2aWNlLmdldFNjaGVtYSgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc2NoZW1hczsKLSAgICB9Ci0KLSAgICAvKioga2VlcCB0aGlzIHdzZGwgZGVmaW5pdGlvbiB0byB3cml0ZSB0aGUgd3NkbCBmaWxlIGxhdGVyICovCi0gICAgcHJpdmF0ZSBEZWZpbml0aW9uIHdzZGxEZWZpbml0aW9uOwotCi0gICAgcHVibGljIERlZmluaXRpb24gZ2V0V3NkbERlZmluaXRpb24oKSB7Ci0gICAgICAgIHJldHVybiB3c2RsRGVmaW5pdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRXc2RsRGVmaW5pdGlvbihEZWZpbml0aW9uIHdzZGxEZWZpbml0aW9uKSB7Ci0gICAgICAgIHRoaXMud3NkbERlZmluaXRpb24gPSB3c2RsRGVmaW5pdGlvbjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNBbGxQb3J0czsKLSAgICBwcml2YXRlIGJvb2xlYW4gaXNPdmVycmlkZTsKLSAgICAKLQotICAgIHB1YmxpYyBib29sZWFuIGlzQWxsUG9ydHMoKSB7Ci0gICAgICAgIHJldHVybiBpc0FsbFBvcnRzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEFsbFBvcnRzKGJvb2xlYW4gYWxsUG9ydHMpIHsKLSAgICAgICAgaXNBbGxQb3J0cyA9IGFsbFBvcnRzOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzT3ZlcnJpZGUoKSB7Ci0gICAgICAgIHJldHVybiBpc092ZXJyaWRlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE92ZXJyaWRlKGJvb2xlYW4gb3ZlcnJpZGUpIHsKLSAgICAgICAgaXNPdmVycmlkZSA9IG92ZXJyaWRlOwotICAgIH0KLQotICAgIC8vIHRoaXMgaXMgdXNlZCB0byBrZWVwIHRoZSBnZW5lcmF0ZWQgeG1sIGZpbGUgbGlzdCB0byBwcmV0dHkgcHJpbnQuCi0gICAgcHJpdmF0ZSBMaXN0IG91dHB1dFhtbEZpbGVOYW1lc0xpc3Q7Ci0KLSAgICBwdWJsaWMgTGlzdCBnZXRPdXRwdXRYbWxGaWxlTmFtZXNMaXN0KCkgewotICAgICAgICByZXR1cm4gb3V0cHV0WG1sRmlsZU5hbWVzTGlzdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRPdXRwdXRYbWxGaWxlTmFtZXNMaXN0KExpc3Qgb3V0cHV0WG1sRmlsZU5hbWVzTGlzdCkgewotICAgICAgICB0aGlzLm91dHB1dFhtbEZpbGVOYW1lc0xpc3QgPSBvdXRwdXRYbWxGaWxlTmFtZXNMaXN0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFhtbEZpbGVOYW1lKFN0cmluZyBmaWxlTmFtZSl7Ci0gICAgICAgdGhpcy5vdXRwdXRYbWxGaWxlTmFtZXNMaXN0LmFkZChmaWxlTmFtZSk7Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIHNldG91dHB1dFNvdXJjZUxvY2F0aW9uKGJvb2xlYW4gc2V0b3V0cHV0c291cmNlbG9jYXRpb24pCi0gICAgewotICAgICAgICBzZXRvdXRwdXRTb3VyY2VMb2NhdGlvbiA9IHRydWU7Ci0gICAgICAgIAotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGV4Y2x1ZGVQcm9wZXJ0aWVzOwotCi0gICAgcHVibGljIFN0cmluZyBnZXRFeGNsdWRlUHJvcGVydGllcygpIHsKLSAgICAgICAgcmV0dXJuIGV4Y2x1ZGVQcm9wZXJ0aWVzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEV4Y2x1ZGVQcm9wZXJ0aWVzKFN0cmluZyBleGNsdWRlUHJvcGVydGllcykgewotICAgICAgICB0aGlzLmV4Y2x1ZGVQcm9wZXJ0aWVzID0gZXhjbHVkZVByb3BlcnRpZXM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgc2tlbHRvbkludGVyZmFjZU5hbWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgc2tlbHRvbkNsYXNzTmFtZTsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2tlbHRvbkludGVyZmFjZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBza2VsdG9uSW50ZXJmYWNlTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTa2VsdG9uSW50ZXJmYWNlTmFtZShTdHJpbmcgc2tlbHRvbkludGVyZmFjZU5hbWUpIHsKLSAgICAgICAgdGhpcy5za2VsdG9uSW50ZXJmYWNlTmFtZSA9IHNrZWx0b25JbnRlcmZhY2VOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2tlbHRvbkNsYXNzTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHNrZWx0b25DbGFzc05hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2tlbHRvbkNsYXNzTmFtZShTdHJpbmcgc2tlbHRvbkNsYXNzTmFtZSkgewotICAgICAgICB0aGlzLnNrZWx0b25DbGFzc05hbWUgPSBza2VsdG9uQ2xhc3NOYW1lOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBvdmVycmlkZUFic29sdXRlQWRkcmVzczsKLQotICAgIHB1YmxpYyBib29sZWFuIGlzT3ZlcnJpZGVBYnNvbHV0ZUFkZHJlc3MoKSB7Ci0gICAgICAgIHJldHVybiBvdmVycmlkZUFic29sdXRlQWRkcmVzczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRPdmVycmlkZUFic29sdXRlQWRkcmVzcyhib29sZWFuIG92ZXJyaWRlQWJzb2x1dGVBZGRyZXNzKSB7Ci0gICAgICAgIHRoaXMub3ZlcnJpZGVBYnNvbHV0ZUFkZHJlc3MgPSBvdmVycmlkZUFic29sdXRlQWRkcmVzczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBleGNlcHRpb25CYXNlQ2xhc3NOYW1lOwotCi0gICAgcHVibGljIFN0cmluZyBnZXRFeGNlcHRpb25CYXNlQ2xhc3NOYW1lKCkgewotICAgICAgICByZXR1cm4gZXhjZXB0aW9uQmFzZUNsYXNzTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRFeGNlcHRpb25CYXNlQ2xhc3NOYW1lKFN0cmluZyBleGNlcHRpb25CYXNlQ2xhc3NOYW1lKSB7Ci0gICAgICAgIHRoaXMuZXhjZXB0aW9uQmFzZUNsYXNzTmFtZSA9IGV4Y2VwdGlvbkJhc2VDbGFzc05hbWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzVXNlT3BlcmF0aW9uTmFtZTsKLQotICAgIHB1YmxpYyBib29sZWFuIGlzVXNlT3BlcmF0aW9uTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGlzVXNlT3BlcmF0aW9uTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRVc2VPcGVyYXRpb25OYW1lKGJvb2xlYW4gdXNlT3BlcmF0aW9uTmFtZSkgewotICAgICAgICBpc1VzZU9wZXJhdGlvbk5hbWUgPSB1c2VPcGVyYXRpb25OYW1lOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL0NvZGVHZW5lcmF0aW9uRW5naW5lLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi9Db2RlR2VuZXJhdGlvbkVuZ2luZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWRiZGZkLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL0NvZGVHZW5lcmF0aW9uRW5naW5lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uV1NETDExVG9BbGxBeGlzU2VydmljZXNCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uV1NETDExVG9BeGlzU2VydmljZUJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5XU0RMMjBUb0FsbEF4aXNTZXJ2aWNlc0J1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5XU0RMMjBUb0F4aXNTZXJ2aWNlQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuQ29tbWFuZExpbmVPcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLkNvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5Db21tYW5kTGluZU9wdGlvblBhcnNlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5lbWl0dGVyLkVtaXR0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4uZXh0ZW5zaW9uLkNvZGVHZW5FeHRlbnNpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLmRhdGFiaW5kaW5nLlR5cGVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLmkxOG4uQ29kZWdlbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC51dGlsLkNvbmZpZ1Byb3BlcnR5RmlsZUxvYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLldTRExFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5mYWN0b3J5LldTRExGYWN0b3J5OwotaW1wb3J0IGphdmF4LndzZGwueG1sLldTRExSZWFkZXI7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1wdWJsaWMgY2xhc3MgQ29kZUdlbmVyYXRpb25FbmdpbmUgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKENvZGVHZW5lcmF0aW9uRW5naW5lLmNsYXNzKTsKLQotICAgIC8qKiBBcnJheSBMaXN0IGZvciBwcmUtZXh0ZW5zaW9ucy4gRXh0ZW5zaW9ucyB0aGF0IHJ1biBiZWZvcmUgdGhlIGVtaXR0ZXIgKi8KLSAgICBwcml2YXRlIExpc3QgcHJlRXh0ZW5zaW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAvKiogQXJyYXkgTGlzdCBmb3IgcG9zdC1leHRlbnNpb25zLiBFeHRlbnNpb25zIHRoYXQgcnVuIGFmdGVyIHRoZSBjb2RlZ2VucyAqLwotICAgIHByaXZhdGUgTGlzdCBwb3N0RXh0ZW5zaW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgIC8qKiBDb2RlZ2VuIGNvbmZpZ3VyYXRpb24gIHJlZmVyZW5jZSAqLwotICAgIHByaXZhdGUgQ29kZUdlbkNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbjsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBjb25maWd1cmF0aW9uCi0gICAgICogQHRocm93cyBDb2RlR2VuZXJhdGlvbkV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBDb2RlR2VuZXJhdGlvbkVuZ2luZShDb2RlR2VuQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB0aHJvd3MgQ29kZUdlbmVyYXRpb25FeGNlcHRpb24gewotICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uOwotICAgICAgICBsb2FkRXh0ZW5zaW9ucygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBwYXJzZXIKLSAgICAgKiBAdGhyb3dzIENvZGVHZW5lcmF0aW9uRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIENvZGVHZW5lcmF0aW9uRW5naW5lKENvbW1hbmRMaW5lT3B0aW9uUGFyc2VyIHBhcnNlcikgdGhyb3dzIENvZGVHZW5lcmF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgTWFwIGFsbE9wdGlvbnMgPSBwYXJzZXIuZ2V0QWxsT3B0aW9ucygpOwotICAgICAgICBTdHJpbmcgd3NkbFVyaTsKLSAgICAgICAgdHJ5IHsKLQotICAgICAgICAgICAgQ29tbWFuZExpbmVPcHRpb24gb3B0aW9uID0KLSAgICAgICAgICAgICAgICAgICAgKENvbW1hbmRMaW5lT3B0aW9uKWFsbE9wdGlvbnMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0KENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5XU0RMX0xPQ0FUSU9OX1VSSV9PUFRJT04pOwotICAgICAgICAgICAgd3NkbFVyaSA9IG9wdGlvbi5nZXRPcHRpb25WYWx1ZSgpOwotICAgICAgICAgICAgY29uZmlndXJhdGlvbiA9IG5ldyBDb2RlR2VuQ29uZmlndXJhdGlvbihhbGxPcHRpb25zKTsKLQotCi0gICAgICAgICAgICBpZiAoQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLldTRExfVkVSU0lPTl8yLgotICAgICAgICAgICAgICAgICAgICBlcXVhbHMoY29uZmlndXJhdGlvbi5nZXRXU0RMVmVyc2lvbigpKSkgewotCi0gICAgICAgICAgICAgICAgV1NETDIwVG9BeGlzU2VydmljZUJ1aWxkZXIgYnVpbGRlcjsKLQotICAgICAgICAgICAgICAgIC8vIGppYnggY3VycmVudGx5IGRvZXMgbm90IHN1cHBvcnQgbXVsdGlzZXJ2aWNlCi0gICAgICAgICAgICAgICAgaWYgKChjb25maWd1cmF0aW9uLmdldFNlcnZpY2VOYW1lKCkgIT0gbnVsbCkgfHwgKGNvbmZpZ3VyYXRpb24uZ2V0RGF0YWJpbmRpbmdUeXBlKCkuZXF1YWxzKCJqaWJ4IikpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSBuZXcgV1NETDIwVG9BeGlzU2VydmljZUJ1aWxkZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NkbFVyaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uLmdldFNlcnZpY2VOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbi5nZXRQb3J0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24uaXNBbGxQb3J0cygpKTsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5zZXRDb2RlZ2VuKHRydWUpOwotICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uLmFkZEF4aXNTZXJ2aWNlKGJ1aWxkZXIucG9wdWxhdGVTZXJ2aWNlKCkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSBuZXcgV1NETDIwVG9BbGxBeGlzU2VydmljZXNCdWlsZGVyKHdzZGxVcmksIGNvbmZpZ3VyYXRpb24uZ2V0UG9ydE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuc2V0Q29kZWdlbih0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5zZXRBbGxQb3J0cyhjb25maWd1cmF0aW9uLmlzQWxsUG9ydHMoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24uc2V0QXhpc1NlcnZpY2VzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoV1NETDIwVG9BbGxBeGlzU2VydmljZXNCdWlsZGVyKWJ1aWxkZXIpLnBvcHVsYXRlQWxsU2VydmljZXMoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vSXQnbGwgYmUgV1NETCAxLjEKLSAgICAgICAgICAgICAgICBEZWZpbml0aW9uIHdzZGw0akRlZiA9IHJlYWRJblRoZVdTRExGaWxlKHdzZGxVcmkpOwotCi0gICAgICAgICAgICAgICAgLy8gd2Ugc2F2ZSB0aGUgb3JpZ2luYWwgd3NkbCBkZWZpbml0aW9uIHRvIHdyaXRlIGl0IHRvIHRoZSByZXNvdXJjZSBmb2xkZXIgbGF0ZXIKLSAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIHJlcXVpcmVkIG9ubHkgaWYgaXQgaGFzIGltcG9ydHMKLSAgICAgICAgICAgICAgICBNYXAgaW1wb3J0cyA9IHdzZGw0akRlZi5nZXRJbXBvcnRzKCk7Ci0gICAgICAgICAgICAgICAgaWYgKChpbXBvcnRzICE9IG51bGwpICYmIChpbXBvcnRzLnNpemUoKSA+IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24uc2V0V3NkbERlZmluaXRpb24ocmVhZEluVGhlV1NETEZpbGUod3NkbFVyaSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24uc2V0V3NkbERlZmluaXRpb24od3NkbDRqRGVmKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyB3ZSBnZW5lcmF0ZSB0aGUgY29kZSBmb3Igb25lIHNlcnZpY2UgYW5kIG9uZSBwb3J0IGlmIHRoZQotICAgICAgICAgICAgICAgIC8vIHVzZXIgaGFzIHNwZWNpZmllZCB0aGVtLgotICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSBnZW5lcmF0ZSB0aGUgY29kZSBmb3IgZXZlcnkgc2VydmljZS4KLSAgICAgICAgICAgICAgICAvLyBUT0RPOiBmaW5kIG91dCBhIHBlcm1hbmFudCBzb2x1dGlvbiBmb3IgdGhpcy4KLSAgICAgICAgICAgICAgICBRTmFtZSBzZXJ2aWNlUW5hbWUgPSBudWxsOwotCi0gICAgICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24uZ2V0U2VydmljZU5hbWUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNlcnZpY2VRbmFtZSA9IG5ldyBRTmFtZSh3c2RsNGpEZWYuZ2V0VGFyZ2V0TmFtZXNwYWNlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uLmdldFNlcnZpY2VOYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIFdTREwxMVRvQXhpc1NlcnZpY2VCdWlsZGVyIGJ1aWxkZXI7Ci0gICAgICAgICAgICAgICAgLy8gamlieCBjdXJyZW50bHkgZG9lcyBub3Qgc3VwcG9ydCBtdWx0aXNlcnZpY2UKLSAgICAgICAgICAgICAgICBpZiAoKHNlcnZpY2VRbmFtZSAhPSBudWxsKSB8fCAoY29uZmlndXJhdGlvbi5nZXREYXRhYmluZGluZ1R5cGUoKS5lcXVhbHMoImppYngiKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlciA9IG5ldyBXU0RMMTFUb0F4aXNTZXJ2aWNlQnVpbGRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c2RsNGpEZWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZVFuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24uZ2V0UG9ydE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uLmlzQWxsUG9ydHMoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuc2V0Q29kZWdlbih0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbi5hZGRBeGlzU2VydmljZShidWlsZGVyLnBvcHVsYXRlU2VydmljZSgpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyID0gbmV3IFdTREwxMVRvQWxsQXhpc1NlcnZpY2VzQnVpbGRlcih3c2RsNGpEZWYsIGNvbmZpZ3VyYXRpb24uZ2V0UG9ydE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuc2V0Q29kZWdlbih0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5zZXRBbGxQb3J0cyhjb25maWd1cmF0aW9uLmlzQWxsUG9ydHMoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24uc2V0QXhpc1NlcnZpY2VzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoV1NETDExVG9BbGxBeGlzU2VydmljZXNCdWlsZGVyKWJ1aWxkZXIpLnBvcHVsYXRlQWxsU2VydmljZXMoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgY29uZmlndXJhdGlvbi5zZXRCYXNlVVJJKGdldEJhc2VVUkkod3NkbFVyaSkpOwotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgYXhpc0ZhdWx0KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ29kZUdlbmVyYXRpb25FeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIENvZGVnZW5NZXNzYWdlcy5nZXRNZXNzYWdlKCJlbmdpbmUud3NkbFBhcnNpbmdFeGNlcHRpb24iKSwgYXhpc0ZhdWx0KTsKLSAgICAgICAgfSBjYXRjaCAoV1NETEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ29kZUdlbmVyYXRpb25FeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIENvZGVnZW5NZXNzYWdlcy5nZXRNZXNzYWdlKCJlbmdpbmUud3NkbFBhcnNpbmdFeGNlcHRpb24iKSwgZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ29kZUdlbmVyYXRpb25FeGNlcHRpb24oICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBDb2RlZ2VuTWVzc2FnZXMuZ2V0TWVzc2FnZSgiZW5naW5lLndzZGxQYXJzaW5nRXhjZXB0aW9uIiksIGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgbG9hZEV4dGVuc2lvbnMoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMb2FkcyB0aGUgcmVsZXZhbnQgcHJlRXh0ZW5zaW9ucwotICAgICAqCi0gICAgICogQHRocm93cyBDb2RlR2VuZXJhdGlvbkV4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBsb2FkRXh0ZW5zaW9ucygpIHRocm93cyBDb2RlR2VuZXJhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vbG9hZCBwcmUgZXh0ZW5zaW9ucwotICAgICAgICBTdHJpbmdbXSBleHRlbnNpb25zID0gQ29uZmlnUHJvcGVydHlGaWxlTG9hZGVyLmdldEV4dGVuc2lvbkNsYXNzTmFtZXMoKTsKLSAgICAgICAgaWYgKGV4dGVuc2lvbnMgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgLy9sb2FkIHRoZSBFeHRlbnNpb24gY2xhc3MKLSAgICAgICAgICAgICAgICBhZGRQcmVFeHRlbnNpb24oKENvZGVHZW5FeHRlbnNpb24pZ2V0T2JqZWN0RnJvbUNsYXNzTmFtZShleHRlbnNpb25zW2ldLnRyaW0oKSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy9sb2FkIHBvc3QgZXh0ZW5zaW9ucwotICAgICAgICBTdHJpbmdbXSBwb3N0RXh0ZW5zaW9ucyA9IENvbmZpZ1Byb3BlcnR5RmlsZUxvYWRlci5nZXRQb3N0RXh0ZW5zaW9uQ2xhc3NOYW1lcygpOwotICAgICAgICBpZiAocG9zdEV4dGVuc2lvbnMgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwb3N0RXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIC8vbG9hZCB0aGUgRXh0ZW5zaW9uIGNsYXNzCi0gICAgICAgICAgICAgICAgYWRkUG9zdEV4dGVuc2lvbigKLSAgICAgICAgICAgICAgICAgICAgICAgIChDb2RlR2VuRXh0ZW5zaW9uKWdldE9iamVjdEZyb21DbGFzc05hbWUocG9zdEV4dGVuc2lvbnNbaV0udHJpbSgpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSBnaXZlbiBleHRlbnNpb24gdG8gdGhlIGxpc3QKLSAgICAgKgotICAgICAqIEBwYXJhbSBleHQKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYWRkUHJlRXh0ZW5zaW9uKENvZGVHZW5FeHRlbnNpb24gZXh0KSB7Ci0gICAgICAgIGlmIChleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgcHJlRXh0ZW5zaW9ucy5hZGQoZXh0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSBnaXZlbiBleHRlbnNpb24gdG8gdGhlIGxpc3QKLSAgICAgKgotICAgICAqIEBwYXJhbSBleHQKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYWRkUG9zdEV4dGVuc2lvbihDb2RlR2VuRXh0ZW5zaW9uIGV4dCkgewotICAgICAgICBpZiAoZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHBvc3RFeHRlbnNpb25zLmFkZChleHQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2VuZXJhdGUgdGhlIGNvZGUhIQotICAgICAqCi0gICAgICogQHRocm93cyBDb2RlR2VuZXJhdGlvbkV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGdlbmVyYXRlKCkgdGhyb3dzIENvZGVHZW5lcmF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vZW5nYWdlIHRoZSBwcmUtZXh0ZW5zaW9ucwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcmVFeHRlbnNpb25zLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgKChDb2RlR2VuRXh0ZW5zaW9uKXByZUV4dGVuc2lvbnMuZ2V0KGkpKS5lbmdhZ2UoY29uZmlndXJhdGlvbik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEVtaXR0ZXIgZW1pdHRlcjsKLQotCi0gICAgICAgICAgICBUeXBlTWFwcGVyIG1hcHBlciA9IGNvbmZpZ3VyYXRpb24uZ2V0VHlwZU1hcHBlcigpOwotICAgICAgICAgICAgaWYgKG1hcHBlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gdGhpcyBjaGVjayBpcyByZWR1bmRhbnQgaGVyZS4gVGhlIGRlZmF1bHQgZGF0YWJpbmRpbmcgZXh0ZW5zaW9uIHNob3VsZAotICAgICAgICAgICAgICAgIC8vIGhhdmUgYWxyZWFkeSBmaWd1cmVkIHRoaXMgb3V0IGFuZCB0aHJvd24gYW4gZXJyb3IgbWVzc2FnZS4gSG93ZXZlciBpbiBjYXNlIHRoZQotICAgICAgICAgICAgICAgIC8vIHVzZXJzIGRlY2lkZXMgdG8gbWVzcyB3aXRoIHRoZSBjb25maWcgaXQgaXMgc2FmZSB0byBrZWVwIHRoaXMgY2hlY2sgaW4gb3JkZXIgdG8gdGhyb3cKLSAgICAgICAgICAgICAgICAvLyBhIG1lYW5pbmdmdWwgZXJyb3IgbWVzc2FnZQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb2RlR2VuZXJhdGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgIENvZGVnZW5NZXNzYWdlcy5nZXRNZXNzYWdlKCJlbmdpbmUubm9Qcm9wZXJEYXRhYmluZGluZ0V4Y2VwdGlvbiIpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy9GaW5kIGFuZCBpbnZva2UgdGhlIGVtaXR0ZXIgYnkgcmVmbGVjdGlvbgotICAgICAgICAgICAgTWFwIGVtaXR0ZXJNYXAgPSBDb25maWdQcm9wZXJ0eUZpbGVMb2FkZXIuZ2V0TGFuZ3VhZ2VFbWl0dGVyTWFwKCk7Ci0gICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gKFN0cmluZyllbWl0dGVyTWFwLmdldChjb25maWd1cmF0aW9uLmdldE91dHB1dExhbmd1YWdlKCkpOwotICAgICAgICAgICAgaWYgKGNsYXNzTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZW1pdHRlciA9IChFbWl0dGVyKWdldE9iamVjdEZyb21DbGFzc05hbWUoY2xhc3NOYW1lKTsKLSAgICAgICAgICAgICAgICBlbWl0dGVyLnNldENvZGVHZW5Db25maWd1cmF0aW9uKGNvbmZpZ3VyYXRpb24pOwotICAgICAgICAgICAgICAgIGVtaXR0ZXIuc2V0TWFwcGVyKG1hcHBlcik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oQ29kZWdlbk1lc3NhZ2VzLmdldE1lc3NhZ2UoImVuZ2luZS5lbWl0dGVyTWlzc2luZyIpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy9pbnZva2UgdGhlIG5lY2Vzc2FyeSBtZXRob2RzIGluIHRoZSBlbWl0dGVyCi0gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbi5pc1NlcnZlclNpZGUoKSkgewotICAgICAgICAgICAgICAgIGVtaXR0ZXIuZW1pdFNrZWxldG9uKCk7Ci0gICAgICAgICAgICAgICAgLy8gaWYgdGhlIHVzZXJzIHdhbnQgYm90aCBjbGllbnQgYW5kIHNlcnZlciwgaXQgd291bGQgYmUgaW4gdGhlCi0gICAgICAgICAgICAgICAgLy8gZ2VuZXJhdGUgYWxsIG9wdGlvbgotICAgICAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uLmlzR2VuZXJhdGVBbGwoKSkgewotICAgICAgICAgICAgICAgICAgICBlbWl0dGVyLmVtaXRTdHViKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBlbWl0dGVyLmVtaXRTdHViKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vZW5nYWdlIHRoZSBwb3N0LWV4dGVuc2lvbnMKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcG9zdEV4dGVuc2lvbnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAoKENvZGVHZW5FeHRlbnNpb24pcG9zdEV4dGVuc2lvbnMuZ2V0KGkpKS5lbmdhZ2UoY29uZmlndXJhdGlvbik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDb2RlR2VuZXJhdGlvbkV4Y2VwdGlvbihDb2RlZ2VuTWVzc2FnZXMuZ2V0TWVzc2FnZSgiZW5naW5lLndyb25nRW1pdHRlciIpLCBlKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDb2RlR2VuZXJhdGlvbkV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotCi0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFJlYWQgdGhlIFdTREwgZmlsZQotICAgICAqCi0gICAgICogQHBhcmFtIHVyaQotICAgICAqIEB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBEZWZpbml0aW9uIHJlYWRJblRoZVdTRExGaWxlKGZpbmFsIFN0cmluZyB1cmkpIHRocm93cyBXU0RMRXhjZXB0aW9uIHsKLQotICAgICAgICBXU0RMUmVhZGVyIHJlYWRlciA9IFdTRExGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3V1NETFJlYWRlcigpOwotICAgICAgICByZWFkZXIuc2V0RmVhdHVyZSgiamF2YXgud3NkbC5pbXBvcnREb2N1bWVudHMiLCB0cnVlKTsKLSAgICAgICAgcmV0dXJuIHJlYWRlci5yZWFkV1NETCh1cmkpOwotICAgICAgICAKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIGdldHMgYSBvYmplY3QgZnJvbSB0aGUgY2xhc3MKLSAgICAgKgotICAgICAqIEBwYXJhbSBjbGFzc05hbWUKLSAgICAgKi8KLSAgICBwcml2YXRlIE9iamVjdCBnZXRPYmplY3RGcm9tQ2xhc3NOYW1lKFN0cmluZyBjbGFzc05hbWUpIHRocm93cyBDb2RlR2VuZXJhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBDbGFzcyBleHRlbnNpb25DbGFzcyA9IGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKS5sb2FkQ2xhc3MoY2xhc3NOYW1lKTsKLSAgICAgICAgICAgIHJldHVybiBleHRlbnNpb25DbGFzcy5uZXdJbnN0YW5jZSgpOwotICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIFRPRE8gUkVWSUVXIEZPUiBKQVZBIDYKLSAgICAgICAgICAgIC8vIEluIEphdmEgNSwgaWYgeW91IHBhc3NlZCBhbiBhcnJheSBzdHJpbmcgc3VjaCBhcyAiW0xjb20ubXlwYWNrYWdlLk15Q2xhc3M7IiB0bwotICAgICAgICAgICAgLy8gbG9hZENsYXNzLCB0aGUgY2xhc3Mgd291bGQgaW5kZWVkIGJlIGxvYWRlZC4gIAotICAgICAgICAgICAgLy8gSW4gSkRLNiwgYSBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGlzIHRocm93bi4gCi0gICAgICAgICAgICAvLyBUaGUgd29yay1hcm91bmQgaXMgdG8gdXNlIGNvZGUgQ2xhc3MuZm9yTmFtZSBpbnN0ZWFkLgotICAgICAgICAgICAgLy8gRXhhbXBsZToKLSAgICAgICAgICAgIC8vIHRyeSB7Ci0gICAgICAgICAgICAvLyAgICAgICBjbGFzc0xvYWRlci5sb2FkQ2xhc3MobmFtZSk7Ci0gICAgICAgICAgICAvLyAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyAgICAgICBDbGFzcy5mb3JOYW1lKG5hbWUsIGZhbHNlLCBsb2FkZXIpOwotICAgICAgICAgICAgLy8gIH0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhDb2RlZ2VuTWVzc2FnZXMuZ2V0TWVzc2FnZSgiZW5naW5lLmV4dGVuc2lvbkxvYWRQcm9ibGVtIiksIGUpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENvZGVHZW5lcmF0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICBDb2RlZ2VuTWVzc2FnZXMuZ2V0TWVzc2FnZSgiZW5naW5lLmV4dGVuc2lvbkluc3RhbnRpYXRpb25Qcm9ibGVtIiksIGUpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDb2RlR2VuZXJhdGlvbkV4Y2VwdGlvbihDb2RlZ2VuTWVzc2FnZXMuZ2V0TWVzc2FnZSgiZW5naW5lLmlsbGVnYWxFeHRlbnNpb24iKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlKTsKLSAgICAgICAgfSBjYXRjaCAoTm9DbGFzc0RlZkZvdW5kRXJyb3IgZSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKENvZGVnZW5NZXNzYWdlcy5nZXRNZXNzYWdlKCJlbmdpbmUuZXh0ZW5zaW9uTG9hZFByb2JsZW0iKSwgZSk7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDb2RlR2VuZXJhdGlvbkV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogY2FsY3VsYXRlcyB0aGUgYmFzZSBVUkkgTmVlZHMgaW1wcm92ZW1lbnQgYnV0IHdvcmtzIGZpbmUgZm9yIG5vdyA7KQotICAgICAqCi0gICAgICogQHBhcmFtIGN1cnJlbnRVUkkKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBnZXRCYXNlVVJJKFN0cmluZyBjdXJyZW50VVJJKSB0aHJvd3MgVVJJU3ludGF4RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGN1cnJlbnRVUkkpOwotICAgICAgICBpZiAoZmlsZS5leGlzdHMoKSkgewotICAgICAgICAgICAgcmV0dXJuIGZpbGUuZ2V0Q2Fub25pY2FsRmlsZSgpLmdldFBhcmVudEZpbGUoKS50b1VSSSgpLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nIHVyaUZyYWdtZW50ID0gY3VycmVudFVSSS5zdWJzdHJpbmcoMCwgY3VycmVudFVSSS5sYXN0SW5kZXhPZigiLyIpKTsKLSAgICAgICAgcmV0dXJuIHVyaUZyYWdtZW50ICsgKHVyaUZyYWdtZW50LmVuZHNXaXRoKCIvIikgPyAiIiA6ICIvIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogY2FsY3VsYXRlcyB0aGUgVVJJCi0gICAgICogbmVlZHMgaW1wcm92ZW1lbnQKLSAgICAgKgotICAgICAqIEBwYXJhbSBjdXJyZW50VVJJCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0VVJJKFN0cmluZyBjdXJyZW50VVJJKSB0aHJvd3MgVVJJU3ludGF4RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0KLSAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoY3VycmVudFVSSSk7Ci0gICAgICAgIGlmIChmaWxlLmV4aXN0cygpKXsKLSAgICAgICAgICAgIHJldHVybiBmaWxlLmdldENhbm9uaWNhbEZpbGUoKS50b1VSSSgpLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gY3VycmVudFVSSTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHVibGljIENvZGVHZW5Db25maWd1cmF0aW9uIGdldENvbmZpZ3VyYXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBjb25maWd1cmF0aW9uOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL0NvZGVHZW5lcmF0aW9uRXhjZXB0aW9uLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi9Db2RlR2VuZXJhdGlvbkV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOGQwY2NhLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL0NvZGVHZW5lcmF0aW9uRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuOwotCi1wdWJsaWMgY2xhc3MgQ29kZUdlbmVyYXRpb25FeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNzc2MzE0MDA3NTE2Njg4Njc5NUw7Ci0KLSAgICBwdWJsaWMgQ29kZUdlbmVyYXRpb25FeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSk7Ci0gICAgfQotCi0gICAgcHVibGljIENvZGVHZW5lcmF0aW9uRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgdGhyb3dhYmxlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UsIHRocm93YWJsZSk7Ci0gICAgfQotCi0gICAgcHVibGljIENvZGVHZW5lcmF0aW9uRXhjZXB0aW9uKFRocm93YWJsZSB0aHJvd2FibGUpIHsKLSAgICAgICAgc3VwZXIodGhyb3dhYmxlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi9Db2RlZ2VuQ29uZmlnTG9hZGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi9Db2RlZ2VuQ29uZmlnTG9hZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1ODZiNjguLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vQ29kZWdlbkNvbmZpZ0xvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW47Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuQ29tbWFuZExpbmVPcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLkNvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLmV4dGVuc2lvbi5YTUxCZWFuc0V4dGVuc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuaTE4bi5Db2RlZ2VuTWVzc2FnZXM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLQotY2xhc3MgQ29kZWdlbkNvbmZpZ0xvYWRlciBpbXBsZW1lbnRzIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2FkQ29uZmlnKENvZGVHZW5Db25maWd1cmF0aW9uIGNvbmZpZywgTWFwIG9wdGlvbk1hcCkgewotICAgICAgICBTdHJpbmcgb3V0cHV0TG9jYXRpb24gPSAiLiI7IC8vZGVmYXVsdCBvdXRwdXQgZGlyZWN0b3J5IGlzIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5Ci0gICAgICAgIENvbW1hbmRMaW5lT3B0aW9uIGNvbW1hbmRMaW5lT3B0aW9uID0gbG9hZE9wdGlvbihXU0RMMkphdmFDb25zdGFudHMuT1VUUFVUX0xPQ0FUSU9OX09QVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdTREwySmF2YUNvbnN0YW50cy5PVVRQVVRfTE9DQVRJT05fT1BUSU9OX0xPTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25NYXApOwotICAgICAgICAKLSAgICAgICAgaWYgKGNvbW1hbmRMaW5lT3B0aW9uICE9IG51bGwpIHsKLSAgICAgICAgLy9zZXQgaXNvdXRwdXRTb3VyY2VMb2NhdGlvbiB0cnVlIHdoZW4gdXNlciBzcGVjaWZ5IGFuIG91dHB1dCBzb3VyY2UgbG9jYXRpb24KLSAgICAgICAgICAgIGNvbmZpZy5zZXRvdXRwdXRTb3VyY2VMb2NhdGlvbih0cnVlKTsKLSAgICAgICAgICAgIG91dHB1dExvY2F0aW9uID0gY29tbWFuZExpbmVPcHRpb24uZ2V0T3B0aW9uVmFsdWUoKTsKLSAgICAgICAgfQotICAgICAgICBGaWxlIG91dHB1dExvY2F0aW9uRmlsZSA9IG5ldyBGaWxlKG91dHB1dExvY2F0aW9uKTsKLSAgICAgICAgY29uZmlnLnNldE91dHB1dExvY2F0aW9uKG91dHB1dExvY2F0aW9uRmlsZSk7Ci0KLSAgICAgICAgLy9jaGVjayBhbmQgY3JlYXRlIHRoZSBkaXJlY3RvcmllcwotICAgICAgICBpZiAob3V0cHV0TG9jYXRpb25GaWxlLmV4aXN0cygpKSB7Ly8kTk9OLVNFQy0yCi0gICAgICAgICAgICBpZiAob3V0cHV0TG9jYXRpb25GaWxlLmlzRmlsZSgpKSB7Ly8kTk9OLVNFQy0yCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICBDb2RlZ2VuTWVzc2FnZXMuZ2V0TWVzc2FnZSgib3B0aW9ucy5ub3RBRGlyZWN0b3J5RXhjZXB0aW9uIikpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgb3V0cHV0TG9jYXRpb25GaWxlLm1rZGlycygpOy8vJE5PTi1TRUMtMgotICAgICAgICB9Ci0KLSAgICAgICAgY29uZmlnLnNldFNlcnZlclNpZGUobG9hZE9wdGlvbihXU0RMMkphdmFDb25zdGFudHMuU0VSVkVSX1NJREVfQ09ERV9PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NETDJKYXZhQ29uc3RhbnRzLlNFUlZFUl9TSURFX0NPREVfT1BUSU9OX0xPTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uTWFwKSAhPSBudWxsKTsKLSAgICAgICAgY29uZmlnLnNldEdlbmVyYXRlRGVwbG95ZW1lbnREZXNjcmlwdG9yKAotICAgICAgICAgICAgICAgIGxvYWRPcHRpb24oV1NETDJKYXZhQ29uc3RhbnRzLkdFTkVSQVRFX1NFUlZJQ0VfREVTQ1JJUFRJT05fT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NETDJKYXZhQ29uc3RhbnRzLkdFTkVSQVRFX1NFUlZJQ0VfREVTQ1JJUFRJT05fT1BUSU9OX0xPTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25NYXApICE9Ci0gICAgICAgICAgICAgICAgICAgICAgICBudWxsKTsKLSAgICAgICAgY29uZmlnLnNldFdyaXRlVGVzdENhc2UobG9hZE9wdGlvbihXU0RMMkphdmFDb25zdGFudHMuR0VORVJBVEVfVEVTVF9DQVNFX09QVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU0RMMkphdmFDb25zdGFudHMuR0VORVJBVEVfVEVTVF9DQVNFX09QVElPTl9MT05HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbk1hcCkgIT0gbnVsbCk7Ci0gICAgICAgIGNvbmZpZy5zZXRTa2lwV3JpdGVXU0RMcyhsb2FkT3B0aW9uKG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NETDJKYXZhQ29uc3RhbnRzLk5PX1dTRExTX09QVElPTl9MT05HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbk1hcCkgIT0gbnVsbCk7Ci0gICAgICAgIGNvbmZpZy5zZXRTa2lwTWVzc2FnZVJlY2VpdmVyKGxvYWRPcHRpb24obnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU0RMMkphdmFDb25zdGFudHMuTk9fTUVTU0FHRV9SRUNFSVZFUl9PUFRJT05fTE9ORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25NYXApICE9IG51bGwpOwotICAgICAgICBjb25maWcuc2V0U2tpcEJ1aWxkWE1MKGxvYWRPcHRpb24obnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU0RMMkphdmFDb25zdGFudHMuTk9fQlVJTERfWE1MX09QVElPTl9MT05HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbk1hcCkgIT0gbnVsbCk7Ci0KLSAgICAgICAgYm9vbGVhbiBhc3luY0ZsYWdQcmVzZW50ID0KLSAgICAgICAgICAgICAgICAobG9hZE9wdGlvbihXU0RMMkphdmFDb25zdGFudHMuQ09ERUdFTl9BU1lOQ19PTkxZX09QVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU0RMMkphdmFDb25zdGFudHMuQ09ERUdFTl9BU1lOQ19PTkxZX09QVElPTl9MT05HLCBvcHRpb25NYXApICE9IG51bGwpOwotICAgICAgICBib29sZWFuIHN5bmNGbGFnUHJlc2VudCA9Ci0gICAgICAgICAgICAgICAgKGxvYWRPcHRpb24oV1NETDJKYXZhQ29uc3RhbnRzLkNPREVHRU5fU1lOQ19PTkxZX09QVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU0RMMkphdmFDb25zdGFudHMuQ09ERUdFTl9TWU5DX09OTFlfT1BUSU9OX0xPTkcsIG9wdGlvbk1hcCkgIT0gbnVsbCk7Ci0gICAgICAgIGlmIChhc3luY0ZsYWdQcmVzZW50ICYmICFzeW5jRmxhZ1ByZXNlbnQpIHsKLSAgICAgICAgICAgIGNvbmZpZy5zZXRBc3luY09uKHRydWUpOwotICAgICAgICAgICAgY29uZmlnLnNldFN5bmNPbihmYWxzZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHN5bmNGbGFnUHJlc2VudCAmJiAhYXN5bmNGbGFnUHJlc2VudCkgewotICAgICAgICAgICAgY29uZmlnLnNldEFzeW5jT24oZmFsc2UpOwotICAgICAgICAgICAgY29uZmlnLnNldFN5bmNPbih0cnVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGNvbW1hbmRMaW5lT3B0aW9uID0gbG9hZE9wdGlvbihXU0RMMkphdmFDb25zdGFudHMuUEFDS0FHRV9PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU0RMMkphdmFDb25zdGFudHMuUEFDS0FHRV9PUFRJT05fTE9ORywgb3B0aW9uTWFwKTsKLSAgICAgICAgaWYgKGNvbW1hbmRMaW5lT3B0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNvbmZpZy5zZXRQYWNrYWdlTmFtZShjb21tYW5kTGluZU9wdGlvbi5nZXRPcHRpb25WYWx1ZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGNvbW1hbmRMaW5lT3B0aW9uID0gbG9hZE9wdGlvbihXU0RMMkphdmFDb25zdGFudHMuU1RVQl9MQU5HVUFHRV9PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU0RMMkphdmFDb25zdGFudHMuU1RVQl9MQU5HVUFHRV9PUFRJT05fTE9ORywgb3B0aW9uTWFwKTsKLSAgICAgICAgaWYgKGNvbW1hbmRMaW5lT3B0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNvbmZpZy5zZXRPdXRwdXRMYW5ndWFnZShjb21tYW5kTGluZU9wdGlvbi5nZXRPcHRpb25WYWx1ZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGNvbW1hbmRMaW5lT3B0aW9uID0gbG9hZE9wdGlvbihXU0RMMkphdmFDb25zdGFudHMuREFUQV9CSU5ESU5HX1RZUEVfT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NETDJKYXZhQ29uc3RhbnRzLkRBVEFfQklORElOR19UWVBFX09QVElPTl9MT05HLCBvcHRpb25NYXApOwotICAgICAgICBpZiAoY29tbWFuZExpbmVPcHRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgY29uZmlnLnNldERhdGFiaW5kaW5nVHlwZShjb21tYW5kTGluZU9wdGlvbi5nZXRPcHRpb25WYWx1ZSgpKTsKLSAgICAgICAgfQotCi0KLSAgICAgICAgY29tbWFuZExpbmVPcHRpb24gPSBsb2FkT3B0aW9uKFdTREwySmF2YUNvbnN0YW50cy5VTlBBQ0tfQ0xBU1NFU19PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU0RMMkphdmFDb25zdGFudHMuVU5QQUNLX0NMQVNTRVNfT1BUSU9OX0xPTkcsIG9wdGlvbk1hcCk7Ci0gICAgICAgIGlmIChjb21tYW5kTGluZU9wdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjb25maWcuc2V0UGFja0NsYXNzZXMoZmFsc2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gc291cmNlIGZvbGRlcgotICAgICAgICBjb21tYW5kTGluZU9wdGlvbiA9IGxvYWRPcHRpb24oV1NETDJKYXZhQ29uc3RhbnRzLlNPVVJDRV9GT0xERVJfTkFNRV9PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU0RMMkphdmFDb25zdGFudHMuU09VUkNFX0ZPTERFUl9OQU1FX09QVElPTl9MT05HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uTWFwKTsKLSAgICAgICAgaWYgKGNvbW1hbmRMaW5lT3B0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNvbmZpZy5zZXRTb3VyY2VMb2NhdGlvbihjb21tYW5kTGluZU9wdGlvbi5nZXRPcHRpb25WYWx1ZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHJlc291cmNlIGZvbGRlcgotICAgICAgICBjb21tYW5kTGluZU9wdGlvbiA9IGxvYWRPcHRpb24oV1NETDJKYXZhQ29uc3RhbnRzLlJFU09VUkNFX0ZPTERFUl9PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU0RMMkphdmFDb25zdGFudHMuUkVTT1VSQ0VfRk9MREVSX09QVElPTl9MT05HLCBvcHRpb25NYXApOwotICAgICAgICBpZiAoY29tbWFuZExpbmVPcHRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgY29uZmlnLnNldFJlc291cmNlTG9jYXRpb24oY29tbWFuZExpbmVPcHRpb24uZ2V0T3B0aW9uVmFsdWUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBjb21tYW5kTGluZU9wdGlvbiA9IGxvYWRPcHRpb24oV1NETDJKYXZhQ29uc3RhbnRzLlBPUlRfTkFNRV9PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU0RMMkphdmFDb25zdGFudHMuUE9SVF9OQU1FX09QVElPTl9MT05HLCBvcHRpb25NYXApOwotICAgICAgICBjb25maWcuc2V0UG9ydE5hbWUoY29tbWFuZExpbmVPcHRpb24gIT0gbnVsbCA/IGNvbW1hbmRMaW5lT3B0aW9uLmdldE9wdGlvblZhbHVlKCkgOiBudWxsKTsKLQotICAgICAgICBjb21tYW5kTGluZU9wdGlvbiA9IGxvYWRPcHRpb24oV1NETDJKYXZhQ29uc3RhbnRzLlNFUlZJQ0VfTkFNRV9PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU0RMMkphdmFDb25zdGFudHMuU0VSVklDRV9OQU1FX09QVElPTl9MT05HLCBvcHRpb25NYXApOwotICAgICAgICBjb25maWcuc2V0U2VydmljZU5hbWUoCi0gICAgICAgICAgICAgICAgY29tbWFuZExpbmVPcHRpb24gIT0gbnVsbCA/IGNvbW1hbmRMaW5lT3B0aW9uLmdldE9wdGlvblZhbHVlKCkgOiBudWxsKTsKLQotICAgICAgICBjb21tYW5kTGluZU9wdGlvbiA9IGxvYWRPcHRpb24oV1NETDJKYXZhQ29uc3RhbnRzLlJFUE9TSVRPUllfUEFUSF9PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU0RMMkphdmFDb25zdGFudHMuUkVQT1NJVE9SWV9QQVRIX09QVElPTl9MT05HLCBvcHRpb25NYXApOwotICAgICAgICBjb25maWcuc2V0UmVwb3NpdG9yeVBhdGgoCi0gICAgICAgICAgICAgICAgY29tbWFuZExpbmVPcHRpb24gIT0gbnVsbCA/IGNvbW1hbmRMaW5lT3B0aW9uLmdldE9wdGlvblZhbHVlKCkgOiBudWxsKTsKLQotICAgICAgICBjb25maWcuc2V0U2VydmVyU2lkZUludGVyZmFjZShsb2FkT3B0aW9uKFdTREwySmF2YUNvbnN0YW50cy5TRVJWRVJfU0lERV9JTlRFUkZBQ0VfT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdTREwySmF2YUNvbnN0YW50cy5TRVJWRVJfU0lERV9JTlRFUkZBQ0VfT1BUSU9OX0xPTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uTWFwKSAhPSBudWxsKTsKLQotICAgICAgICBjb25maWcuc2V0R2VuZXJhdGVBbGwobG9hZE9wdGlvbihXU0RMMkphdmFDb25zdGFudHMuR0VORVJBVEVfQUxMX09QVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NETDJKYXZhQ29uc3RhbnRzLkdFTkVSQVRFX0FMTF9PUFRJT05fTE9ORywgb3B0aW9uTWFwKSAhPSBudWxsKTsKLQotICAgICAgICBjb25maWcuc2V0VXNlT3BlcmF0aW9uTmFtZShsb2FkT3B0aW9uKFdTREwySmF2YUNvbnN0YW50cy5VU0VfT1BFUkFUSU9OX05BTUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NETDJKYXZhQ29uc3RhbnRzLlVTRV9PUEVSQVRJT05fTkFNRV9MT05HLCBvcHRpb25NYXApICE9IG51bGwpOwotCi0gICAgICAgIC8vcG9wdWxhdGUgdGhlIGV4dGVybmFsIG1hcHBpbmcKLSAgICAgICAgY29tbWFuZExpbmVPcHRpb24gPSBsb2FkT3B0aW9uKAotICAgICAgICAgICAgICAgIFdTREwySmF2YUNvbnN0YW50cy5FWFRFUk5BTF9NQVBQSU5HX09QVElPTiwKLSAgICAgICAgICAgICAgICBXU0RMMkphdmFDb25zdGFudHMuRVhURVJOQUxfTUFQUElOR19PUFRJT05fTE9ORywKLSAgICAgICAgICAgICAgICBvcHRpb25NYXApOwotICAgICAgICBpZiAoY29tbWFuZExpbmVPcHRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBjb25maWcuc2V0VHlwZU1hcHBpbmdGaWxlKG5ldyBGaWxlKGNvbW1hbmRMaW5lT3B0aW9uLmdldE9wdGlvblZhbHVlKCkpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICBDb2RlZ2VuTWVzc2FnZXMuZ2V0TWVzc2FnZSgib3B0aW9ucy5ub21hcHBpbmdGaWxlIiksIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gbG9hZCB0aGUgbmFtZXNwYWNlIHRvIHBhY2thZ2UgbGlzdAotICAgICAgICBjb21tYW5kTGluZU9wdGlvbiA9IGxvYWRPcHRpb24oCi0gICAgICAgICAgICAgICAgV1NETDJKYXZhQ29uc3RhbnRzLk5BTUVfU1BBQ0VfVE9fUEFDS0FHRV9PUFRJT04sCi0gICAgICAgICAgICAgICAgV1NETDJKYXZhQ29uc3RhbnRzLk5BTUVfU1BBQ0VfVE9fUEFDS0FHRV9PUFRJT05fTE9ORywKLSAgICAgICAgICAgICAgICBvcHRpb25NYXApOwotICAgICAgICBpZiAoY29tbWFuZExpbmVPcHRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgLy90aGUgc3ludGF4IGZvciB0aGUgdmFsdWUgb2YgdGhlIG5hbWVzcGFjZXMgYW5kIHBhY2thZ2VzIGlzCi0gICAgICAgICAgICAvL3RvIGJlIGEgY29tbWEgc2VwZXJhdGVkIGxpc3Qgd2l0aCB1cmk9cGFja2FnZW5hbWUsdXJpPXBhY2thZ2VuYW1lLi4uCi0gICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBjb21tYW5kTGluZU9wdGlvbi5nZXRPcHRpb25WYWx1ZSgpOwotICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBUcnkgdHJlYXRpbmcgdGhlIHZhbHVlcyBhcyBhIG5hbWU9dmFsdWUgcGFpciBzZXBhcmF0ZWQgYnkgY29tbWEncwotICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5pbmRleE9mKCc9JykgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlcGFpcnNbXSA9IHZhbHVlLnNwbGl0KCIsIik7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZXBhaXJzLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vcHV0IHRoZW0gaW4gdGhlIGhhc2ggbWFwCi0gICAgICAgICAgICAgICAgICAgICAgICBIYXNoTWFwIG1hcCA9IG5ldyBIYXNoTWFwKHZhbHVlcGFpcnMubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVwYWlycy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZXNbXSA9IHZhbHVlcGFpcnNbaV0uc3BsaXQoIj0iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWVzLmxlbmd0aCA9PSAyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcC5wdXQodmFsdWVzWzBdLCB2YWx1ZXNbMV0pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5zZXRVcmkyUGFja2FnZU5hbWVNYXAobWFwKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRyeSBsb2FkaW5nIHRoZSBwcm9wZXJ0aWVzIGZyb20gdGhlIGZpbGUgc3BlY2lmaWVkCi0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0aWVzIHAgPSBuZXcgUHJvcGVydGllcygpOy8vJE5PTi1TRUMtMwotICAgICAgICAgICAgICAgICAgICAgICAgcC5sb2FkKG5ldyBGaWxlSW5wdXRTdHJlYW0odmFsdWUpKTsvLyROT04tU0VDLTIvLyROT04tU0VDLTMKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5zZXRVcmkyUGFja2FnZU5hbWVNYXAocCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlZ2VuTWVzc2FnZXMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TWVzc2FnZSgib3B0aW9ucy5ub0ZpbGUiLCB2YWx1ZSksIGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgY29tbWFuZExpbmVPcHRpb24gPQotICAgICAgICAgICAgICAgIGxvYWRPcHRpb24oV1NETDJKYXZhQ29uc3RhbnRzLlVOV1JBUF9QQVJBTUVURVJTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NETDJKYXZhQ29uc3RhbnRzLlVOV1JBUF9QQVJBTUVURVJTX0xPTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25NYXApOwotICAgICAgICBpZiAoY29tbWFuZExpbmVPcHRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgY29uZmlnLnNldFBhcmFtZXRlcnNXcmFwcGVkKGZhbHNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGNvbW1hbmRMaW5lT3B0aW9uID0KLSAgICAgICAgICAgICAgICBsb2FkT3B0aW9uKFdTREwySmF2YUNvbnN0YW50cy5XU0RMX1ZFUlNJT05fT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NETDJKYXZhQ29uc3RhbnRzLldTRExfVkVSU0lPTl9PUFRJT05fTE9ORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbk1hcCk7Ci0gICAgICAgIGlmIChjb21tYW5kTGluZU9wdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgb3B0aW9uVmFsdWUgPSBjb21tYW5kTGluZU9wdGlvbi5nZXRPcHRpb25WYWx1ZSgpOwotCi0gICAgICAgICAgICBpZiAoV1NETDJKYXZhQ29uc3RhbnRzLldTRExfVkVSU0lPTl8yLmVxdWFscyhvcHRpb25WYWx1ZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgV1NETDJKYXZhQ29uc3RhbnRzLldTRExfVkVSU0lPTl8yX09QVElPTkFMLmVxdWFscyhvcHRpb25WYWx1ZSkpIHsKLSAgICAgICAgICAgICAgICAvL3VzZXJzIGNhbiBzYXkgZWl0aGVyIDIuMCBvciAyIC0gd2UgIGp1c3Qgc2V0IGl0IHRvIHRoZSBjb25zdGFudAotICAgICAgICAgICAgICAgIGNvbmZpZy5zZXRXU0RMVmVyc2lvbihXU0RMMkphdmFDb25zdGFudHMuV1NETF9WRVJTSU9OXzIpOwotICAgICAgICAgICAgfSAvL2lnbm9yZSB0aGUgb3RoZXIgY2FzZXMgLSB0aGV5J2xsIGJlIHRha2VuIGFzIDEuMQotCi0gICAgICAgIH0KLQotICAgICAgICBjb25maWcKLSAgICAgICAgICAgICAgICAuc2V0RmxhdHRlbkZpbGVzKGxvYWRPcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICBXU0RMMkphdmFDb25zdGFudHMuRkxBVFRFTl9GSUxFU19PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICBXU0RMMkphdmFDb25zdGFudHMuRkxBVFRFTl9GSUxFU19PUFRJT05fTE9ORywgb3B0aW9uTWFwKSAhPSBudWxsKTsKLQotICAgICAgICBjb21tYW5kTGluZU9wdGlvbiA9IGxvYWRPcHRpb24oCi0gICAgICAgICAgICAgICAgV1NETDJKYXZhQ29uc3RhbnRzLkJBQ0tXT1JEX0NPTVBBVElCSUxJVFlfT1BUSU9OLAotICAgICAgICAgICAgICAgIFdTREwySmF2YUNvbnN0YW50cy5CQUNLV09SRF9DT01QQVRJQklMSVRZX09QVElPTl9MT05HLAotICAgICAgICAgICAgICAgIG9wdGlvbk1hcCk7Ci0gICAgICAgIGlmIChjb21tYW5kTGluZU9wdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjb25maWcuc2V0QmFja3dvcmRDb21wYXRpYmlsaXR5TW9kZSh0cnVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGNvbW1hbmRMaW5lT3B0aW9uID0gbG9hZE9wdGlvbigKLSAgICAgICAgICAgICAgICBXU0RMMkphdmFDb25zdGFudHMuU1VQUFJFU1NfUFJFRklYRVNfT1BUSU9OLAotICAgICAgICAgICAgICAgIFdTREwySmF2YUNvbnN0YW50cy5TVVBQUkVTU19QUkVGSVhFU19PUFRJT05fTE9ORywKLSAgICAgICAgICAgICAgICBvcHRpb25NYXApOwotICAgICAgICBpZiAoY29tbWFuZExpbmVPcHRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgY29uZmlnLnNldFN1cHByZXNzUHJlZml4ZXNNb2RlKHRydWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgY29tbWFuZExpbmVPcHRpb24gPSBsb2FkT3B0aW9uKFhNTEJlYW5zRXh0ZW5zaW9uLlhTRENPTkZJR19PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxCZWFuc0V4dGVuc2lvbi5YU0RDT05GSUdfT1BUSU9OX0xPTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25NYXApOwotICAgICAgICBpZiAoY29tbWFuZExpbmVPcHRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgY29uZmlnLmdldFByb3BlcnRpZXMoKS5wdXQoWE1MQmVhbnNFeHRlbnNpb24uWFNEQ09ORklHX09QVElPTiwgCi0gICAgICAgICAgICAgICAgICAgIGNvbW1hbmRMaW5lT3B0aW9uLmdldE9wdGlvblZhbHVlKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy9zZXR0aW5nIGh0dHAgcHJveHkgaG9zdCBhbmQgaHR0cCBwcm94eSBwb3J0Ci0gICAgICAgIGNvbW1hbmRMaW5lT3B0aW9uID0gbG9hZE9wdGlvbihudWxsLCBXU0RMMkphdmFDb25zdGFudHMuSFRUUF9QUk9YWV9IT1NUX09QVElPTl9MT05HLCBvcHRpb25NYXApOwotICAgICAgICBpZiAoY29tbWFuZExpbmVPcHRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJodHRwLnByb3h5SG9zdCIsIGNvbW1hbmRMaW5lT3B0aW9uLmdldE9wdGlvblZhbHVlKCkpOy8vJE5PTi1TRUMtMgotICAgICAgICB9Ci0KLSAgICAgICAgY29tbWFuZExpbmVPcHRpb24gPSBsb2FkT3B0aW9uKG51bGwsIFdTREwySmF2YUNvbnN0YW50cy5IVFRQX1BST1hZX1BPUlRfT1BUSU9OX0xPTkcsIG9wdGlvbk1hcCk7Ci0gICAgICAgIGlmIChjb21tYW5kTGluZU9wdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImh0dHAucHJveHlQb3J0IiwgY29tbWFuZExpbmVPcHRpb24uZ2V0T3B0aW9uVmFsdWUoKSk7Ly8kTk9OLVNFQy0yCi0gICAgICAgIH0KLQotICAgICAgICBjb21tYW5kTGluZU9wdGlvbiA9IGxvYWRPcHRpb24oV1NETDJKYXZhQ29uc3RhbnRzLkVYQ0xVREVfUEFLQUdFU19PUFRJT04sCi0gICAgICAgICAgICAgICAgV1NETDJKYXZhQ29uc3RhbnRzLkVYQ0xVREVfUEFLQUdFU19PUFRJT05fTE9ORywgb3B0aW9uTWFwKTsKLSAgICAgICAgaWYgKGNvbW1hbmRMaW5lT3B0aW9uICE9IG51bGwpewotICAgICAgICAgICAgY29uZmlnLnNldEV4Y2x1ZGVQcm9wZXJ0aWVzKGNvbW1hbmRMaW5lT3B0aW9uLmdldE9wdGlvblZhbHVlKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgY29tbWFuZExpbmVPcHRpb24gPSBsb2FkT3B0aW9uKFdTREwySmF2YUNvbnN0YW50cy5TS0VMVE9OX0lOVEVSRkFDRV9OQU1FX09QVElPTiwKLSAgICAgICAgICAgICAgICBXU0RMMkphdmFDb25zdGFudHMuU0tFTFRPTl9JTlRFUkZBQ0VfTkFNRV9PUFRJT05fTE9ORywgb3B0aW9uTWFwKTsKLSAgICAgICAgaWYgKGNvbW1hbmRMaW5lT3B0aW9uICE9IG51bGwpewotICAgICAgICAgICAgY29uZmlnLnNldFNrZWx0b25JbnRlcmZhY2VOYW1lKGNvbW1hbmRMaW5lT3B0aW9uLmdldE9wdGlvblZhbHVlKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgY29tbWFuZExpbmVPcHRpb24gPSBsb2FkT3B0aW9uKFdTREwySmF2YUNvbnN0YW50cy5TS0VMVE9OX0NMQVNTX05BTUVfT1BUSU9OLAotICAgICAgICAgICAgICAgIFdTREwySmF2YUNvbnN0YW50cy5TS0VMVE9OX0NMQVNTX05BTUVfT1BUSU9OX0xPTkcsIG9wdGlvbk1hcCk7Ci0gICAgICAgIGlmIChjb21tYW5kTGluZU9wdGlvbiAhPSBudWxsKXsKLSAgICAgICAgICAgIGNvbmZpZy5zZXRTa2VsdG9uQ2xhc3NOYW1lKGNvbW1hbmRMaW5lT3B0aW9uLmdldE9wdGlvblZhbHVlKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgY29tbWFuZExpbmVPcHRpb24gPSBsb2FkT3B0aW9uKFdTREwySmF2YUNvbnN0YW50cy5FWENFUFRJT05fQkFTRV9DTEFTU19PUFRJT04sCi0gICAgICAgICAgICAgICAgV1NETDJKYXZhQ29uc3RhbnRzLkVYQ0VQVElPTl9CQVNFX0NMQVNTX09QVElPTl9MT05HLCBvcHRpb25NYXApOwotICAgICAgICBpZiAoY29tbWFuZExpbmVPcHRpb24gIT0gbnVsbCl7Ci0gICAgICAgICAgICBjb25maWcuc2V0RXhjZXB0aW9uQmFzZUNsYXNzTmFtZShjb21tYW5kTGluZU9wdGlvbi5nZXRPcHRpb25WYWx1ZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHNldHRpbmcgdGhlIG92ZXJyaWQgYW5kIGFsbCBwb3J0cyBvcHRpb25zCi0gICAgICAgIGNvbmZpZy5zZXRBbGxQb3J0cyhsb2FkT3B0aW9uKFdTREwySmF2YUNvbnN0YW50cy5BbGxfUE9SVFNfT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU0RMMkphdmFDb25zdGFudHMuQWxsX1BPUlRTX09QVElPTl9MT05HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25NYXApICE9IG51bGwpOwotCi0gICAgICAgIGNvbmZpZy5zZXRPdmVycmlkZShsb2FkT3B0aW9uKFdTREwySmF2YUNvbnN0YW50cy5PVkVSUklERV9PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdTREwySmF2YUNvbnN0YW50cy5PVkVSUklERV9PUFRJT05fTE9ORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uTWFwKSAhPSBudWxsKTsKLQotICAgICAgICBjb25maWcuc2V0T3ZlcnJpZGVBYnNvbHV0ZUFkZHJlc3MobG9hZE9wdGlvbihXU0RMMkphdmFDb25zdGFudHMuT1ZFUlJJREVfQUJTT0xVVEVfQUREUkVTU19PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdTREwySmF2YUNvbnN0YW50cy5PVkVSUklERV9BQlNPTFVURV9BRERSRVNTX09QVElPTl9MT05HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25NYXApICE9IG51bGwpOwotCi0gICAgICAgIC8vIGxvb3AgdGhyb3VnaCB0aGUgbWFwIGFuZCBmaW5kIHBhcmFtZXRlcnMgaGF2aW5nIHRoZSBleHRyYSBwcmVmaXguCi0gICAgICAgIC8vcHV0IHRoZW0gaW4gdGhlIHByb3BlcnR5IG1hcAotICAgICAgICBJdGVyYXRvciBrZXlJdGVyYXRvciA9IG9wdGlvbk1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoa2V5SXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBPYmplY3Qga2V5ID0ga2V5SXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgQ29tbWFuZExpbmVPcHRpb24gb3B0aW9uID0gKENvbW1hbmRMaW5lT3B0aW9uKW9wdGlvbk1hcC5nZXQoa2V5KTsKLSAgICAgICAgICAgIGlmIChrZXkudG9TdHJpbmcoKS5zdGFydHNXaXRoKFdTREwySmF2YUNvbnN0YW50cy5FWFRSQV9PUFRJT05UWVBFX1BSRUZJWCkpIHsKLSAgICAgICAgICAgICAgICAvL2FkZCB0aGlzIHRvIHRoZSBwcm9wZXJ0eSBtYXAKLSAgICAgICAgICAgICAgICBjb25maWcuZ2V0UHJvcGVydGllcygpLnB1dChrZXkudG9TdHJpbmcoKS5yZXBsYWNlRmlyc3QoCi0gICAgICAgICAgICAgICAgICAgICAgICBXU0RMMkphdmFDb25zdGFudHMuRVhUUkFfT1BUSU9OVFlQRV9QUkVGSVgsICIiKSwgb3B0aW9uLmdldE9wdGlvblZhbHVlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIENvbW1hbmRMaW5lT3B0aW9uIGxvYWRPcHRpb24oU3RyaW5nIHNob3J0T3B0aW9uLCBTdHJpbmcgbG9uZ09wdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcCBvcHRpb25zKSB7Ci0gICAgICAgIC8vc2hvcnQgb3B0aW9uIGdldHMgcHJlY2VkZW5jZQotICAgICAgICBDb21tYW5kTGluZU9wdGlvbiBvcHRpb24gPSBudWxsOwotICAgICAgICBpZiAobG9uZ09wdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBvcHRpb24gPSAoQ29tbWFuZExpbmVPcHRpb24pb3B0aW9ucy5nZXQobG9uZ09wdGlvbik7Ci0gICAgICAgICAgICBpZiAob3B0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gb3B0aW9uOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChzaG9ydE9wdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBvcHRpb24gPSAoQ29tbWFuZExpbmVPcHRpb24pb3B0aW9ucy5nZXQoc2hvcnRPcHRpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG9wdGlvbjsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL2NvZGVnZW4tY29uZmlnLnByb3BlcnRpZXMgYi92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi9jb2RlZ2VuLWNvbmZpZy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzg3ZjUwLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL2NvZGVnZW4tY29uZmlnLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotIwotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjICAgY29kZSBnZW5lcmF0b3IgcHJvcGVydHkgZmlsZSAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEV4dGVuc2lvbnMgLSBUaGUgZXh0ZW5zaW9uIGNsYXNzIG5hbWVzIGFyZSBjb21tYSBzZXBhcmF0ZWQKLSMgYW5kIHRoZXNlIGV4dGVuc2lvbnMgd2lsbCBydW4gYmVmb3JlIHRoZSBtYWluIGVtaXR0ZXIKLSMgdGhlc2UgYXJlIGxvYWRlZCBpbiB0aGVpciBsZXhpY2FsIG9yZGVyCi0jIE5vdGUgdGhlIGxhc3QgZXh0ZW5zaW9uIC0gSXQgaW5jbHVkZXMgYSBjaGVjayB0byBmaWd1cmUgb3V0IHdoZXRoZXIgcHJvcGVyIGRhdGFiaW5kaW5nIGhhcyB0YWtlbiBwbGFjZQotIyBUaGlzIGV4dGVuc2lvbiBzaG91bGQgYXBwZWFyIEFGVEVSIGFsbCB0aGUgZGF0YWJpbmRpbmcgZXh0ZW5zaW9ucyBpbm9yZGVyIHRvIGZ1bmN0aW9uIHByb3Blcmx5Ci1jb2RlZ2VuLmV4dGVuc2lvbj1vcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5leHRlbnNpb24uUGFja2FnZUZpbmRlcixcCi1vcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5leHRlbnNpb24uSkFYV1NXYXBwZXJFeHRlbnNpb24sXAotICBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5leHRlbnNpb24uU2NoZW1hVW53cmFwcGVyRXh0ZW5zaW9uLFwKLSAgb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4uZXh0ZW5zaW9uLlhNTEJlYW5zRXh0ZW5zaW9uLCBcCi0gIG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLmV4dGVuc2lvbi5TaW1wbGVEQkV4dGVuc2lvbiwgXAotICBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5leHRlbnNpb24uSmlCWEV4dGVuc2lvbiwgXAotICBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5leHRlbnNpb24uSkFYQlJJRXh0ZW5zaW9uLCBcCi0gIG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLmV4dGVuc2lvbi5UeXBlTWFwcGVyRXh0ZW5zaW9uLCBcCi0gIG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLmV4dGVuc2lvbi5EZWZhdWx0RGF0YWJpbmRpbmdFeHRlbnNpb24sIFwKLSAgb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4uZXh0ZW5zaW9uLlBvbGljeUV2YWx1YXRvcgotI2V4dGVuc2lvbnMgdGhhdCB3b3JrIGFmdGVyIHRoZSBtYWluIGVtaXR0ZXIuIFRoZXNlIHdpbGwgaW5jbHVkZSBmdW5jdGlvbmFsaXR5IHN1Y2ggYXMKLSNmb3JtYXR0ZXJzCi1wb3N0LmNvZGVnZW4uZXh0ZW5zaW9uPW9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLmV4dGVuc2lvbi5KYXZhUHJldHR5UHJpbnRlckV4dGVuc2lvbiwgXAotICBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5leHRlbnNpb24uWE1MUHJldHR5UHJpbnRlckV4dGVuc2lvbiwgXAotICBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5leHRlbnNpb24uV1NETFByZXR0eVByaW50ZXJFeHRlbnNpb24sIFwKLSAgb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4uZXh0ZW5zaW9uLkV4Y2x1ZGVQYWNrYWdlRXh0ZW5zaW9uCi0KLSNjb2RlZ2VuLmV4dGVuc2lvbj1vcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5leHRlbnNpb24uQXhpc0JpbmRpbmdCdWlsZGVyLG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLmV4dGVuc2lvbi5XU0RMVmFsaWRhdG9yRXh0ZW5zaW9uLG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLmV4dGVuc2lvbi5QYWNrYWdlRmluZGVyLG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLmV4dGVuc2lvbi5TaW1wbGVEQkV4dGVuc2lvbgotIyBUaGUgdGhpcmQgcGFydHkgc2NoZW1hcyB0byBiZSBsb2FkZWQuIGUuZy4gVGhlIFhtaW1lIGV4dGVuc2lvbgotIyBOb3RlIC0gdGhlc2Ugd2lsbCBiZSBsb2FkZWQgZnJvbSB0aGUgb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4uc2NoZW1hIHBhY2thZ2UuCi0jIHNvIHdoYXRldmVyIHRoZSB0aGlyZCBwYXJ0eSBzY2hlbWEncyB0aGF0IGFyZSBsaXN0ZWQgaGVyZSBzaG91bGQgYmUgcHJlc2VudCB0aGVyZQotI2NvZGVnZW4udGhpcmRwYXJ0eS5zY2hlbWE9Ci1jb2RlZ2VuLnRoaXJkcGFydHkuc2NoZW1hPXhtaW1lLnhzZCxzb2FwLWVuYy54c2QKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvZGVnZW4gZGF0YSBiaW5kaW5nIGZyYW1ld29ya3MgYW5kIHRoZWlyIHJlbGF0ZWQgaW5mb3JtYXRpb24KLSMgVGhlIG5hbWVzIG9mIHRoZSBjb2RlZ2VuZXJhdGlvbiBmcmFtZXdvcmtzIGluIGxleGljYWwgb3JkZXIKLSMgdGhlc2UgYXJlIHRoZSBuYW1lcyB0aGF0IHNob3VsZCBiZSBwYXNzZWQgb250byB0aGUgdG9vbCBhcyBhcmd1bWVudHMgYXMgd2VsbAotY29kZWdlbi5kYXRhYmluZGluZy5mcmFtZXdvcmtzPWFkYix4bWxiZWFucyxqaWJ4LGpheGJyaSxub25lCi0jIHRoaXMgcHJvcGVydHkga2VlcHMgdGhlIG5hbWVzIG9mIHRoZSBkYXRhYmluZGluZyBmcmFtZXdvcmtzIHdoaWNoIHN1cHBvcnQKLSMgdW53cmFwcGluZyAKLWNvZGVnZW4uZGF0YWJpbmRpbmcudW53cmFwLnN1cHBvcnRlZD1hZGIseG1sYmVhbnMsamlieCxqYXhicmkKLSMgdGhpcyBwcm9wZXJ0eSBrZWVwcyB0aGUgbmFtZXMgb2YgdGhlIGRhdGFiaW5kaW5nIGZyYW1ld29ya3MgdGhhdCBoYW5kbGUgdW53cmFwcGluZwotIyBkaXJlY3RseSAocmF0aGVyIHRoYW4gYnkgdXNpbmcgdGhlIHVud3JhcHBlciBleHRlbnNpb24pCi1jb2RlZ2VuLmRhdGFiaW5kaW5nLnVud3JhcC5kaXJlY3Q9amlieAotIyB0aGUgcmVsYXRlZCBleHRlbnNpb25zIGZvciB0aGUgc3BlY2lmaWVkIGRhdGEgYmluZGluZyBmcmFtZXdvcmtzIGFib3ZlCi0jIE5vdGUgLSAgdGhlc2UgYXJlIGluIHRoZSBsZXhpY2FsIG9yZGVyIG9mIHRoZSBmcmFtZXdvcmsgbmFtZXMuIFRoZXJlIGlzIGFuIGltcGxpY2l0IGFzc3VtcHRpb24KLSMgdGhhdCBhIGdpdmVuIGRhdGFiaW5kaW5nIGZyYW1ld29yayB3aWxsIGJlIHByb2Nlc3NlZCBvbmx5IGJ5IG9uZSBleHRlbnNpb24KLWNvZGVnZW4uZGF0YWJpbmRpbmcuZXh0ZW5zaW9ucz1vcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5leHRlbnNpb24uU2ltcGxlREJFeHRlbnNpb24sb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4uZXh0ZW5zaW9uLlhNTEJlYW5zRXh0ZW5zaW9uLG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLmV4dGVuc2lvbi5KaUJYRXh0ZW5zaW9uLG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLmV4dGVuc2lvbi5KQVhCUklFeHRlbnNpb24sb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4uZXh0ZW5zaW9uLkRlZmF1bHREYXRhYmluZGluZ0V4dGVuc2lvbgotIyB0aGUgZGVmYXVsdCBkYXRhIGJpbmRpbmcgZnJhbWV3b3JrIG5hbWUKLWNvZGVnZW4uZGF0YWJpbmRpbmcuZnJhbWV3b3Jrcy5kZWZhdWx0PWFkYgotIyB0aGUgZGF0YWJpbmRpbmcgdGVtcGxhdGVzIC0KLWNvZGVnZW4uZGF0YWJpbmRpbmcuYWRiLnN1cHBvcnRlci50ZW1wbGF0ZT0vb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvdGVtcGxhdGUvQURCRGF0YWJpbmRpbmdUZW1wbGF0ZS54c2wKLWNvZGVnZW4uZGF0YWJpbmRpbmcueG1sYmVhbnMuc3VwcG9ydGVyLnRlbXBsYXRlPS9vcmcvYXBhY2hlL2F4aXMyL3htbGJlYW5zL3RlbXBsYXRlL1htbGJlYW5zRGF0YWJpbmRpbmdUZW1wbGF0ZS54c2wKLWNvZGVnZW4uZGF0YWJpbmRpbmcuamlieC5zdXBwb3J0ZXIudGVtcGxhdGU9L29yZy9hcGFjaGUvYXhpczIvamlieC90ZW1wbGF0ZS9KaWJYRGF0YWJpbmRpbmdUZW1wbGF0ZS54c2wKLWNvZGVnZW4uZGF0YWJpbmRpbmcuamF4YnJpLnN1cHBvcnRlci50ZW1wbGF0ZT0vb3JnL2FwYWNoZS9heGlzMi9qYXhicmkvdGVtcGxhdGUvSmF4YlJJRGF0YWJpbmRpbmdUZW1wbGF0ZS54c2wKLWNvZGVnZW4uZGF0YWJpbmRpbmcubm9uZS5zdXBwb3J0ZXIudGVtcGxhdGU9L29yZy9hcGFjaGUvYXhpczIvd3NkbC90ZW1wbGF0ZS9qYXZhL05vbmVEYXRhYmluZGluZ1RlbXBsYXRlLnhzbAotCi1jb2RlZ2VuLmRhdGFiaW5kaW5nLnRlc3RvYmplY3QudGVtcGxhdGU9L29yZy9hcGFjaGUvYXhpczIvd3NkbC90ZW1wbGF0ZS9qYXZhL1Rlc3RPYmplY3RDcmVhdGlvblRlbXBsYXRlLnhzbAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgTGFuZ3VhZ2UgdHlwZXMgLSB0aGVzZSBhcmUgdGhlIGxhbmd1YWdlIHR5cGVzIHRoYXQgdGhlIGNvZGUgZ2VuZXJhdG9yIHVuZGVyc3RhbmRzLiBBZ2FpbiB0aGlzIGlzIHRoZSBuYW1lIG9mIHRoZQotIyBsYW5ndWFnZSB0aGF0IHNob3VsZCBiZSBwYXNzZWQgZnJvbSB0aGUgdG9vbCBhcyB3ZWxsCi0jCi1jb2RlZ2VuLmxhbmd1YWdlcz1qYXZhLGMsamF4LXdzCi0jIEVtaXR0ZXIgY2xhc3MgaXMgdGhlICBtYWpvciBjb2RlIGdlbmVyYXRvciBjbGFzcyB0aGF0IHNob3VsZCBiZSBjaGFuZ2VkIGFjY29yZGluZyB0byB0aGUgbGFuZ3VhZ2UuCi0jIFRoZSBlbWlpdGVycyBuZWVkIHRvIGltcGxlbWVudCB0aGUgb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4uZW1pdHRlci5FbWl0dGVyIGludGVyZmFjZQotIyBOb3RlIC0gVGhlIGVtaXR0ZXJzIHNob3VsZCBhcHBlYXIgaW4gdGhlIGxleGljYWwgb3JkZXIgb2YgdGhlIGxhbmd1YWdlcy4gU28gdGhlIGxhbmd1YWdlIGphdmEgaW4gdGhlIGFib3ZlCi0jIGxpc3QgY29ycmVzcG9uZHMgdG8gdGhlIG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLmVtaXR0ZXIuSmF2YUVtaXR0ZXIKLWNvZGVnZW4uZW1pdHRlcnM9b3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4uZW1pdHRlci5BeGlzU2VydmljZUJhc2VkTXVsdGlMYW5ndWFnZUVtaXR0ZXIsb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4uZW1pdHRlci5DRW1pdHRlcixvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5lbWl0dGVyLmpheHdzLkpBWFdTMjBFbWl0dGVyCi0jIERlZmF1bHQgbGFuZ3VhZ2UsIHRoaXMgaXMgdGhlIGRlZmF1bHQgbGFuZ3VhZ2UgdGhhdCB3b3VsZCBiZSBwaWNrZWQgd2hlbiBubyBsYW5ndWFnZSBpcyBzcGVjaWZpZWQuIGl0IHNob3VsZCBiZQotIyBvbmUgb2YgdGhlIGxhbmd1YWdlcyBzcGVjaWZpZWQgYWJvdmUKLWNvZGVnZW4ubGFuZ3VhZ2VzLmRlZmF1bHQ9amF2YQotIyBEZWZhdWx0IHNvdXJjZSBmb2xkZXIgbmFtZQotY29kZWdlbi5nZW5lcmFsLnNyYy5uYW1lPXNyYwotIyBEZWZhdWx0IHJlc291cmNlIGZvbGRlciBuYW1lCi1jb2RlZ2VuLmdlbmVyYWwucmVzb3VyY2UubmFtZT1yZXNvdXJjZXMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICBMYW5ndWFnZSBzcGVjaWZpYyBzZWN0aW9uICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgVGhlIGxhbmd1YWdlIHNwZWNpZmljIHNlY3Rpb24gaGFzIGEgc3BlY2lhbCBjdXN0b20gc3R5bGUuIFRoZSBsYW5ndWFnZSBuYW1lIGNvbWVzIGZpcnN0IGFuZCBzZXBhcmF0ZWQgZnJvbSB0aGUgcGVyaW9kCi0jIGEgdW5pcXVlIG5hbWUuIFRoZXNlIHBhcmFtZXRlcnMgd2lsbCBiZSBpbmNsdWRlZCBpbiBhIGhhc2htYXAgdGhhdCBpcyB3aWxsIGJlIHN0b3JlZCBpbiBhbm90aGVyIGhhc2ggbWFwIHdpdGggdGhlCi0jIGxhbmd1YWdlIGFzIHRoZSBrZXkKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBKYXZhIHNlY3Rpb24gIC0gVGVtcGxhdGVzLgotIyBUaGUgZm9ybWF0IG9mIHRoZSB0ZW1wbGF0ZXMgaXMgPHdyaXRlci1jbGFzcy1uYW1lPiw8dGVtcGxhdGUtbmFtZT4KLSMgTm90ZSB0aGlzIHNlY3Rpb24gaXMgc3BlY2lmaWMgdG8gdGhlIGVtaXR0ZXIgbG9naWMuIE9uZSBjYW4gaGF2ZSBhbnl0aGluZyBoZXJlIQotamF2YS5pbnRlcmZhY2UudGVtcGxhdGU9b3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4ud3JpdGVyLkludGVyZmFjZVdyaXRlciwvb3JnL2FwYWNoZS9heGlzMi93c2RsL3RlbXBsYXRlL2phdmEvSW50ZXJmYWNlVGVtcGxhdGUueHNsCi1qYXZhLmludGVyZmFjZS5pbXBsLnRlbXBsYXRlPW9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLndyaXRlci5JbnRlcmZhY2VJbXBsZW1lbnRhdGlvbldyaXRlciwvb3JnL2FwYWNoZS9heGlzMi93c2RsL3RlbXBsYXRlL2phdmEvSW50ZXJmYWNlSW1wbGVtZW50YXRpb25UZW1wbGF0ZS54c2wKLWphdmEuYmVhbi50ZW1wbGF0ZT1vcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi53cml0ZXIuQmVhbldyaXRlciwvb3JnL2FwYWNoZS9heGlzMi93c2RsL3RlbXBsYXRlL2phdmEvQmVhblRlbXBsYXRlLnhzbAotamF2YS5jYWxsYmFjay50ZW1wbGF0ZT1vcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi53cml0ZXIuQ2FsbGJhY2tIYW5kbGVyV3JpdGVyLC9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdGVtcGxhdGUvamF2YS9DYWxsYmFja0hhbmRsZXJUZW1wbGF0ZS54c2wKLWphdmEuZXhjZXB0aW9uLnRlbXBsYXRlPW9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLndyaXRlci5FeGNlcHRpb25Xcml0ZXIsL29yZy9hcGFjaGUvYXhpczIvd3NkbC90ZW1wbGF0ZS9qYXZhL0V4Y2VwdGlvblRlbXBsYXRlLnhzbAotamF2YS5za2VsZXRvbi50ZW1wbGF0ZT1vcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi53cml0ZXIuU2tlbGV0b25Xcml0ZXIsL29yZy9hcGFjaGUvYXhpczIvd3NkbC90ZW1wbGF0ZS9qYXZhL1NrZWxldG9uVGVtcGxhdGUueHNsCi1qYXZhLnNrZWxldG9uLmludGVyZmFjZS50ZW1wbGF0ZT1vcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi53cml0ZXIuU2tlbGV0b25JbnRlcmZhY2VXcml0ZXIsL29yZy9hcGFjaGUvYXhpczIvd3NkbC90ZW1wbGF0ZS9qYXZhL1NrZWxldG9uSW50ZXJmYWNlVGVtcGxhdGUueHNsCi1qYXZhLnRlc3RjbGFzcy50ZW1wbGF0ZT1vcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi53cml0ZXIuVGVzdENsYXNzV3JpdGVyLC9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdGVtcGxhdGUvamF2YS9UZXN0Q2xhc3NUZW1wbGF0ZS54c2wKLWphdmEuc2VydmljZS50ZW1wbGF0ZT1vcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi53cml0ZXIuU2VydmljZVhNTFdyaXRlciwvb3JnL2FwYWNoZS9heGlzMi93c2RsL3RlbXBsYXRlL2dlbmVyYWwvU2VydmljZVhNTFRlbXBsYXRlLnhzbAotamF2YS5tZXNzYWdlLnJlY2VpdmVyLnRlbXBsYXRlPW9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLndyaXRlci5NZXNzYWdlUmVjZWl2ZXJXcml0ZXIsL29yZy9hcGFjaGUvYXhpczIvd3NkbC90ZW1wbGF0ZS9qYXZhL01lc3NhZ2VSZWNlaXZlclRlbXBsYXRlLnhzbAotIwotamF2YS5hbnRidWlsZC54bWxiZWFucy50ZW1wbGF0ZT1vcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi53cml0ZXIuQW50QnVpbGRXcml0ZXIsL29yZy9hcGFjaGUvYXhpczIvd3NkbC90ZW1wbGF0ZS9nZW5lcmFsL3htbGJlYW5zQW50QnVpbGRUZW1wbGF0ZS54c2wKLWphdmEuYW50YnVpbGQuamlieC50ZW1wbGF0ZT1vcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi53cml0ZXIuQW50QnVpbGRXcml0ZXIsL29yZy9hcGFjaGUvYXhpczIvd3NkbC90ZW1wbGF0ZS9nZW5lcmFsL2ppYnhBbnRCdWlsZFRlbXBsYXRlLnhzbAotamF2YS5hbnRidWlsZC5qYXhicmkudGVtcGxhdGU9b3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4ud3JpdGVyLkFudEJ1aWxkV3JpdGVyLC9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdGVtcGxhdGUvZ2VuZXJhbC9qYXhicmlBbnRCdWlsZFRlbXBsYXRlLnhzbAotamF2YS5hbnRidWlsZC5hZGIudGVtcGxhdGU9b3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4ud3JpdGVyLkFudEJ1aWxkV3JpdGVyLC9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdGVtcGxhdGUvZ2VuZXJhbC9hZGJBbnRCdWlsZFRlbXBsYXRlLnhzbAotamF2YS5hbnRidWlsZC5ub25lLnRlbXBsYXRlPW9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLndyaXRlci5BbnRCdWlsZFdyaXRlciwvb3JnL2FwYWNoZS9heGlzMi93c2RsL3RlbXBsYXRlL2dlbmVyYWwvZGVmYXVsdEFudEJ1aWxkVGVtcGxhdGUueHNsCi0jIGZpbGUgZXh0ZW5zaW9uIGZvciBnZW5lcmF0ZWQgZmlsZXMgZnJvbSB0aGlzIGxhbmd1YWdlCi1qYXZhLmZpbGVuYW1lLmV4dGVuc2lvbj1qYXZhCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQyBzZWN0aW9uICAtIFRlbXBsYXRlcy4KLSMgVGhlIGZvcm1hdCBvZiB0aGUgdGVtcGxhdGVzIGlzIDx3cml0ZXItY2xhc3MtbmFtZT4sPHRlbXBsYXRlLW5hbWU+Ci0jIE5vdGUgdGhpcyBzZWN0aW9uIGlzIHNwZWNpZmljIHRvIHRoZSBlbWl0dGVyIGxvZ2ljLiBPbmUgY2FuIGhhdmUgYW55dGhpbmcgaGVyZSEKLQotYy5pbnRlcmZhY2UuaGVhZGVyLnRlbXBsYXRlPW9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLndyaXRlci5DU3R1YkhlYWRlcldyaXRlciwvb3JnL2FwYWNoZS9heGlzMi93c2RsL3RlbXBsYXRlL2MvU3R1YkhlYWRlclRlbXBsYXRlLnhzbAotYy5pbnRlcmZhY2UuaW1wbC50ZW1wbGF0ZT1vcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi53cml0ZXIuQ1N0dWJTb3VyY2VXcml0ZXIsL29yZy9hcGFjaGUvYXhpczIvd3NkbC90ZW1wbGF0ZS9jL1N0dWJTb3VyY2VUZW1wbGF0ZS54c2wKLWMuc2tlbGV0b24uaGVhZGVyLnRlbXBsYXRlPW9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLndyaXRlci5DU2tlbEhlYWRlcldyaXRlciwvb3JnL2FwYWNoZS9heGlzMi93c2RsL3RlbXBsYXRlL2MvU2tlbEhlYWRlclRlbXBsYXRlLnhzbAotYy5za2VsZXRvbi5pbXBsLnRlbXBsYXRlPW9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLndyaXRlci5DU2tlbFNvdXJjZVdyaXRlciwvb3JnL2FwYWNoZS9heGlzMi93c2RsL3RlbXBsYXRlL2MvU2tlbFNvdXJjZVRlbXBsYXRlLnhzbAotYy5zdmNfc2tlbGV0b24udGVtcGxhdGU9b3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4ud3JpdGVyLkNTdmNTa2VsZXRvbldyaXRlciwvb3JnL2FwYWNoZS9heGlzMi93c2RsL3RlbXBsYXRlL2MvU2VydmljZVNrZWxldG9uLnhzbAotYy5zZXJ2aWNlLnRlbXBsYXRlPW9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLndyaXRlci5DU2VydmljZVhNTFdyaXRlciwvb3JnL2FwYWNoZS9heGlzMi93c2RsL3RlbXBsYXRlL2MvU2VydmljZVhNTFRlbXBsYXRlLnhzbAotYy5idWlsZC50ZW1wbGF0ZT1vcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi53cml0ZXIuQ0J1aWxkU2NyaXB0V3JpdGVyLC9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdGVtcGxhdGUvYy9CdWlsZFNjcmlwdFRlbXBsYXRlLnhzbAotIyBmaWxlIGV4dGVuc2lvbiBmb3IgZ2VuZXJhdGVkIHNvdXJjZSBmaWxlcyBmcm9tIHRoaXMgbGFuZ3VhZ2UKLWMuZmlsZW5hbWUuZXh0ZW5zaW9uPWMKLQotamF4LXdzLmV4Y2VwdGlvbi50ZW1wbGF0ZT1vcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi53cml0ZXIuRXhjZXB0aW9uV3JpdGVyLC9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdGVtcGxhdGUvamF2YS9KYXh3c0V4Y2VwdGlvblRlbXBsYXRlLnhzbAotamF4LXdzLmludGVyZmFjZS5pbXBsLnRlbXBsYXRlPW9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLndyaXRlci5JbnRlcmZhY2VJbXBsZW1lbnRhdGlvbldyaXRlciwvb3JnL2FwYWNoZS9heGlzMi93c2RsL3RlbXBsYXRlL2phdmEvSmF4d3NTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VJbXBsVGVtcGxhdGUueHNsCi1qYXgtd3Muc2tlbGV0b24udGVtcGxhdGU9b3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4ud3JpdGVyLlNrZWxldG9uV3JpdGVyLC9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdGVtcGxhdGUvamF2YS9KYXh3c1NlcnZpY2VDbGFzc1RlbXBsYXRlLnhzbAotamF4LXdzLnNrZWxldG9uLmludGVyZmFjZS50ZW1wbGF0ZT1vcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi53cml0ZXIuU2tlbGV0b25JbnRlcmZhY2VXcml0ZXIsL29yZy9hcGFjaGUvYXhpczIvd3NkbC90ZW1wbGF0ZS9qYXZhL0pheHdzU2VydmljZUVuZHBvaW50SW50ZXJmYWNlVGVtcGxhdGUueHNsCi1qYXgtd3MudGVzdGNsYXNzLnRlbXBsYXRlPW9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLndyaXRlci5UZXN0Q2xhc3NXcml0ZXIsL29yZy9hcGFjaGUvYXhpczIvd3NkbC90ZW1wbGF0ZS9qYXZhL1Rlc3RDbGFzc1RlbXBsYXRlLnhzbAotamF4LXdzLnNlcnZpY2UudGVtcGxhdGU9b3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4ud3JpdGVyLlNlcnZpY2VYTUxXcml0ZXIsL29yZy9hcGFjaGUvYXhpczIvd3NkbC90ZW1wbGF0ZS9qYXZhL0pheHdzU2VydmljZVhNTFRlbXBsYXRlLnhzbAotamF4LXdzLmFudGJ1aWxkLmpheGJyaS50ZW1wbGF0ZT1vcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi53cml0ZXIuQW50QnVpbGRXcml0ZXIsL29yZy9hcGFjaGUvYXhpczIvd3NkbC90ZW1wbGF0ZS9nZW5lcmFsL2pheGJyaUFudEJ1aWxkVGVtcGxhdGUueHNsCi1qYXgtd3MuYW50YnVpbGQubm9uZS50ZW1wbGF0ZT1vcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi53cml0ZXIuQW50QnVpbGRXcml0ZXIsL29yZy9hcGFjaGUvYXhpczIvd3NkbC90ZW1wbGF0ZS9nZW5lcmFsL2RlZmF1bHRBbnRCdWlsZFRlbXBsYXRlLnhzbAotIyBmaWxlIGV4dGVuc2lvbiBmb3IgZ2VuZXJhdGVkIGZpbGVzIGZyb20gdGhpcyBsYW5ndWFnZQotamF4LXdzLmZpbGVuYW1lLmV4dGVuc2lvbj1qYXZhCi0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL2VtaXR0ZXIvQXhpc1NlcnZpY2VCYXNlZE11bHRpTGFuZ3VhZ2VFbWl0dGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi9lbWl0dGVyL0F4aXNTZXJ2aWNlQmFzZWRNdWx0aUxhbmd1YWdlRW1pdHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZmI3MzAwLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL2VtaXR0ZXIvQXhpc1NlcnZpY2VCYXNlZE11bHRpTGFuZ3VhZ2VFbWl0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDM2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4uZW1pdHRlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5BZGRyZXNzaW5nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc0JpbmRpbmc7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzQmluZGluZ01lc3NhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzQmluZGluZ09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNFbmRwb2ludDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNNZXNzYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uV1NETDIwRGVmYXVsdFZhbHVlSG9sZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uV1NETDJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLkNvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5KYXZhVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLlBvbGljeVV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLlV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5YU0xUVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLkhUVFBIZWFkZXJNZXNzYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5TT0FQSGVhZGVyTWVzc2FnZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuU09BUE1vZHVsZU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLldTRExVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLkNvZGVHZW5Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLkNvZGVHZW5lcmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLndyaXRlci5BbnRCdWlsZFdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi53cml0ZXIuQ2FsbGJhY2tIYW5kbGVyV3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLndyaXRlci5FeGNlcHRpb25Xcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4ud3JpdGVyLkZpbGVXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4ud3JpdGVyLkludGVyZmFjZUltcGxlbWVudGF0aW9uV3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLndyaXRlci5JbnRlcmZhY2VXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4ud3JpdGVyLk1lc3NhZ2VSZWNlaXZlcldyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi53cml0ZXIuU2NoZW1hV3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLndyaXRlci5TZXJ2aWNlWE1MV3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLndyaXRlci5Ta2VsZXRvbkludGVyZmFjZVdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi53cml0ZXIuU2tlbGV0b25Xcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4ud3JpdGVyLlRlc3RDbGFzc1dyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi53cml0ZXIuV1NETDExV3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLndyaXRlci5XU0RMMjBXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLmRhdGFiaW5kaW5nLlR5cGVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLnV0aWwuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC51dGlsLk1lc3NhZ2VQYXJ0SW5mb3JtYXRpb25Ib2xkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLnV0aWwuVHlwZVRlc3RlclV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLnV0aWwuWFNMVEluY2x1ZGVSZXNvbHZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm5lZXRoaS5Qb2xpY3k7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWE7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLk91dHB1dEtleXM7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlVSSVJlc29sdmVyOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKLQotCi1wdWJsaWMgY2xhc3MgQXhpc1NlcnZpY2VCYXNlZE11bHRpTGFuZ3VhZ2VFbWl0dGVyIGltcGxlbWVudHMgRW1pdHRlciB7Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDQUxMX0JBQ0tfSEFORExFUl9TVUZGSVggPSAiQ2FsbGJhY2tIYW5kbGVyIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTVFVCX1NVRkZJWCA9ICJTdHViIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1NVRkZJWCA9ICJUZXN0IjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTS0VMRVRPTl9DTEFTU19TVUZGSVggPSAiU2tlbGV0b24iOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNLRUxFVE9OX0NMQVNTX1NVRkZJWF9CQUNLID0gIkltcGwiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNLRUxFVE9OX0lOVEVSRkFDRV9TVUZGSVggPSAiU2tlbGV0b25JbnRlcmZhY2UiOwotICAgIC8vIGtlZXAgYSBzZXBlcmF0ZSB2YXJpYWJsZSBmb3IgIFNLRUxFVE9OX0lOVEVSRkFDRV9TVUZGSVhfQkFDSyBhbHRob3VnaCBpdCBpcwotICAgIC8vICIiIHRvIGFjY29tYWRhdGUgYW55IGZ1dHVyZSBjaGFuZ2VzIGVhc2lseS4KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTS0VMRVRPTl9JTlRFUkZBQ0VfU1VGRklYX0JBQ0sgPSAiIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTVFVCX0lOVEVSRkFDRV9TVUZGSVhfQkFDSyA9ICJTdHViIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBNRVNTQUdFX1JFQ0VJVkVSX1NVRkZJWCA9ICJNZXNzYWdlUmVjZWl2ZXIiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEFCSU5ESU5HX1NVUFBPUlRFUl9OQU1FX1NVRkZJWCA9ICJEYXRhYmluZGluZ1N1cHBvcnRlciI7Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIE1hcCBtZXBUb0NsYXNzTWFwOwotICAgIHByb3RlY3RlZCBzdGF0aWMgTWFwIG1lcFRvU3VmZml4TWFwOwotCi0gICAgcHJvdGVjdGVkIEF4aXNCaW5kaW5nIGF4aXNCaW5kaW5nOwotICAgIHByb3RlY3RlZCBBeGlzRW5kcG9pbnQgYXhpc0VuZHBvaW50OwotCi0gICAgcHJvdGVjdGVkIGludCB1bmlxdWVGYXVsdE5hbWVDb3VudGVyID0gMDsKLSAgICAvKioKLSAgICAgKiBGaWVsZCBjb25zdHJ1Y3Rvck1hcAotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgSGFzaE1hcCBjb25zdHJ1Y3Rvck1hcCA9IG5ldyBIYXNoTWFwKDUwKTsKLQotICAgIC8vfi0tLSBzdGF0aWMgaW5pdGlhbGl6ZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgc3RhdGljIHsKLQotICAgICAgICAvLyBUeXBlIG1hcHMgdG8gYSB2YWxpZCBpbml0aWFsaXphdGlvbiB2YWx1ZSBmb3IgdGhhdCB0eXBlCi0gICAgICAgIC8vIFR5cGUgdmFyID0gbmV3IFR5cGUoYXJnKQotICAgICAgICAvLyBXaGVyZSAiVHlwZSIgaXMgdGhlIGtleSBhbmQgIm5ldyBUeXBlKGFyZykiIGlzIHRoZSBzdHJpbmcgc3RvcmVkCi0gICAgICAgIC8vIFVzZWQgaW4gZW1pdHRpbmcgdGVzdCBjYXNlcyBhbmQgc2VydmVyIHNrZWxldG9ucy4KLSAgICAgICAgY29uc3RydWN0b3JNYXAucHV0KCJpbnQiLCAiMCIpOwotICAgICAgICBjb25zdHJ1Y3Rvck1hcC5wdXQoImZsb2F0IiwgIjAiKTsKLSAgICAgICAgY29uc3RydWN0b3JNYXAucHV0KCJib29sZWFuIiwgInRydWUiKTsKLSAgICAgICAgY29uc3RydWN0b3JNYXAucHV0KCJkb3VibGUiLCAiMCIpOwotICAgICAgICBjb25zdHJ1Y3Rvck1hcC5wdXQoImJ5dGUiLCAiKGJ5dGUpMCIpOwotICAgICAgICBjb25zdHJ1Y3Rvck1hcC5wdXQoInNob3J0IiwgIihzaG9ydCkwIik7Ci0gICAgICAgIGNvbnN0cnVjdG9yTWFwLnB1dCgibG9uZyIsICIwIik7Ci0gICAgICAgIGNvbnN0cnVjdG9yTWFwLnB1dCgiamF2YS5sYW5nLkJvb2xlYW4iLCAibmV3IGphdmEubGFuZy5Cb29sZWFuKGZhbHNlKSIpOwotICAgICAgICBjb25zdHJ1Y3Rvck1hcC5wdXQoImphdmEubGFuZy5CeXRlIiwgIm5ldyBqYXZhLmxhbmcuQnl0ZSgoYnl0ZSkwKSIpOwotICAgICAgICBjb25zdHJ1Y3Rvck1hcC5wdXQoImphdmEubGFuZy5Eb3VibGUiLCAibmV3IGphdmEubGFuZy5Eb3VibGUoMCkiKTsKLSAgICAgICAgY29uc3RydWN0b3JNYXAucHV0KCJqYXZhLmxhbmcuRmxvYXQiLCAibmV3IGphdmEubGFuZy5GbG9hdCgwKSIpOwotICAgICAgICBjb25zdHJ1Y3Rvck1hcC5wdXQoImphdmEubGFuZy5JbnRlZ2VyIiwgIm5ldyBqYXZhLmxhbmcuSW50ZWdlcigwKSIpOwotICAgICAgICBjb25zdHJ1Y3Rvck1hcC5wdXQoImphdmEubGFuZy5Mb25nIiwgIm5ldyBqYXZhLmxhbmcuTG9uZygwKSIpOwotICAgICAgICBjb25zdHJ1Y3Rvck1hcC5wdXQoImphdmEubGFuZy5TaG9ydCIsICJuZXcgamF2YS5sYW5nLlNob3J0KChzaG9ydCkwKSIpOwotICAgICAgICBjb25zdHJ1Y3Rvck1hcC5wdXQoImphdmEubWF0aC5CaWdEZWNpbWFsIiwgIm5ldyBqYXZhLm1hdGguQmlnRGVjaW1hbCgwKSIpOwotICAgICAgICBjb25zdHJ1Y3Rvck1hcC5wdXQoImphdmEubWF0aC5CaWdJbnRlZ2VyIiwgIm5ldyBqYXZhLm1hdGguQmlnSW50ZWdlcihcIjBcIikiKTsKLSAgICAgICAgY29uc3RydWN0b3JNYXAucHV0KCJqYXZhLmxhbmcuT2JqZWN0IiwgIm5ldyBqYXZhLmxhbmcuU3RyaW5nKCkiKTsKLSAgICAgICAgY29uc3RydWN0b3JNYXAucHV0KCJieXRlW10iLCAibmV3IGJ5dGVbMF0iKTsKLSAgICAgICAgY29uc3RydWN0b3JNYXAucHV0KCJqYXZhLnV0aWwuQ2FsZW5kYXIiLCAiamF2YS51dGlsLkNhbGVuZGFyLmdldEluc3RhbmNlKCkiKTsKLSAgICAgICAgY29uc3RydWN0b3JNYXAucHV0KCJqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIiwKLSAgICAgICAgICAgICAgICAibmV3IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUoXCJodHRwOi8vZm9vXCIsIFwiYmFyXCIpIik7Ci0KLSAgICAgICAgLy9wb3B1bGF0ZSB0aGUgTUVQIC0+IGNsYXNzIG1hcAotICAgICAgICBtZXBUb0NsYXNzTWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgbWVwVG9DbGFzc01hcC5wdXQoV1NETDJDb25zdGFudHMuTUVQX1VSSV9JTl9PTkxZLAotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5BYnN0cmFjdEluTWVzc2FnZVJlY2VpdmVyIik7Ci0gICAgICAgIG1lcFRvQ2xhc3NNYXAucHV0KFdTREwyQ29uc3RhbnRzLk1FUF9VUklfUk9CVVNUX0lOX09OTFksCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLkFic3RyYWN0TWVzc2FnZVJlY2VpdmVyIik7Ci0gICAgICAgIG1lcFRvQ2xhc3NNYXAucHV0KFdTREwyQ29uc3RhbnRzLk1FUF9VUklfSU5fT1VULAotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5BYnN0cmFjdEluT3V0TWVzc2FnZVJlY2VpdmVyIik7Ci0KLSAgICAgICAgLy9wb3B1bGF0ZSB0aGUgTUVQIC0+IHN1ZmZpeCBtYXAKLSAgICAgICAgbWVwVG9TdWZmaXhNYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICBtZXBUb1N1ZmZpeE1hcC5wdXQoV1NETENvbnN0YW50cy5XU0RMMjBfMjAwNF9Db25zdGFudHMuTUVQX1VSSV9JTl9PTkxZLAotICAgICAgICAgICAgICAgIE1FU1NBR0VfUkVDRUlWRVJfU1VGRklYICsgIkluT25seSIpOwotICAgICAgICBtZXBUb1N1ZmZpeE1hcC5wdXQoV1NETENvbnN0YW50cy5XU0RMMjBfMjAwNkNvbnN0YW50cy5NRVBfVVJJX0lOX09OTFksCi0gICAgICAgICAgICAgICAgTUVTU0FHRV9SRUNFSVZFUl9TVUZGSVggKyAiSW5Pbmx5Iik7Ci0gICAgICAgIG1lcFRvU3VmZml4TWFwLnB1dChXU0RMMkNvbnN0YW50cy5NRVBfVVJJX0lOX09OTFksCi0gICAgICAgICAgICAgICAgTUVTU0FHRV9SRUNFSVZFUl9TVUZGSVggKyAiSW5Pbmx5Iik7Ci0gICAgICAgIG1lcFRvU3VmZml4TWFwLnB1dChXU0RMQ29uc3RhbnRzLldTREwyMF8yMDA0X0NvbnN0YW50cy5NRVBfVVJJX1JPQlVTVF9JTl9PTkxZLAotICAgICAgICAgICAgICAgIE1FU1NBR0VfUkVDRUlWRVJfU1VGRklYICsgIlJvYnVzdEluT25seSIpOwotICAgICAgICBtZXBUb1N1ZmZpeE1hcC5wdXQoV1NETENvbnN0YW50cy5XU0RMMjBfMjAwNkNvbnN0YW50cy5NRVBfVVJJX1JPQlVTVF9JTl9PTkxZLAotICAgICAgICAgICAgICAgIE1FU1NBR0VfUkVDRUlWRVJfU1VGRklYICsgIlJvYnVzdEluT25seSIpOwotICAgICAgICBtZXBUb1N1ZmZpeE1hcC5wdXQoV1NETDJDb25zdGFudHMuTUVQX1VSSV9ST0JVU1RfSU5fT05MWSwKLSAgICAgICAgICAgICAgICBNRVNTQUdFX1JFQ0VJVkVSX1NVRkZJWCArICJSb2J1c3RJbk9ubHkiKTsKLSAgICAgICAgbWVwVG9TdWZmaXhNYXAucHV0KFdTRExDb25zdGFudHMuV1NETDIwXzIwMDRfQ29uc3RhbnRzLk1FUF9VUklfSU5fT1VULAotICAgICAgICAgICAgICAgIE1FU1NBR0VfUkVDRUlWRVJfU1VGRklYICsgIkluT3V0Iik7Ci0gICAgICAgIG1lcFRvU3VmZml4TWFwLnB1dChXU0RMQ29uc3RhbnRzLldTREwyMF8yMDA2Q29uc3RhbnRzLk1FUF9VUklfSU5fT1VULAotICAgICAgICAgICAgICAgIE1FU1NBR0VfUkVDRUlWRVJfU1VGRklYICsgIkluT3V0Iik7Ci0gICAgICAgIG1lcFRvU3VmZml4TWFwLnB1dChXU0RMMkNvbnN0YW50cy5NRVBfVVJJX0lOX09VVCwKLSAgICAgICAgICAgICAgICBNRVNTQUdFX1JFQ0VJVkVSX1NVRkZJWCArICJJbk91dCIpOwotICAgICAgICAvL3JlZ2lzdGVyIHRoZSBvdGhlciB0eXBlcyBhcyBuZWNlc3NhcnkKLSAgICB9Ci0KLSAgICAvL34tLS0gZmllbGRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhBeGlzU2VydmljZUJhc2VkTXVsdGlMYW5ndWFnZUVtaXR0ZXIuY2xhc3MpOwotICAgIHByb3RlY3RlZCBVUklSZXNvbHZlciByZXNvbHZlcjsKLQotICAgIC8vIHRoaXMgaXMgdXNlZCB0byBrZWVwIHRoZSBjdXJyZW50IHNlcnZpY2UgaW5mb0hvbGRlcgotICAgIHByb3RlY3RlZCBNYXAgaW5mb0hvbGRlcjsKLSAgICAvLyB0aGlzIGlzIHVzZWQgdG8ga2VlcCBpbmZvSG9sZGVycyBmb3IgYWxsIHNlcnZpY2VzCi0gICAgcHJvdGVjdGVkIE1hcCBhbGxTZXJ2aWNlSW5mb0hvbGRlcjsKLQotICAgIHByb3RlY3RlZCBDb2RlR2VuQ29uZmlndXJhdGlvbiBjb2RlR2VuQ29uZmlndXJhdGlvbjsKLQotICAgIHByb3RlY3RlZCBUeXBlTWFwcGVyIG1hcHBlcjsKLQotICAgIHByb3RlY3RlZCBBeGlzU2VydmljZSBheGlzU2VydmljZTsKLQotICAgIHByb3RlY3RlZCBMaXN0IGF4aXNTZXJ2aWNlczsKLQotICAgIC8vYSBtYXAgdG8ga2VlcCB0aGUgZmF1bHQgY2xhc3NOYW1lcwotICAgIHByb3RlY3RlZCBNYXAgZnVsbHlRdWFsaWZpZWRGYXVsdENsYXNzTmFtZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgcHJvdGVjdGVkIE1hcCBmYXVsdENsYXNzTmFtZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgcHJvdGVjdGVkIE1hcCBmYXVsdEVsZW1lbnRRTmFtZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICBwcm90ZWN0ZWQgTWFwIGluc3RhbnRpYXRhYmxlTWVzc2FnZUNsYXNzTmFtZXMgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9TUkNfRElSX05BTUUgPSAidGVzdCI7Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiB1c2VIb2xkZXJDbGFzc19qYXh3cyA9IGZhbHNlOwotICAgIHByb3RlY3RlZCBib29sZWFuIHdyYXBwZWRfamF4d3MgPSBmYWxzZTsKLQotCi0gICAgLyoqCi0gICAgICogZGVmYXVsdCBjb25zdHJ1Y3RvciAtIGJ1aWxkcwotICAgICAqLwotICAgIHB1YmxpYyBBeGlzU2VydmljZUJhc2VkTXVsdGlMYW5ndWFnZUVtaXR0ZXIoKSB7Ci0gICAgICAgIGluZm9Ib2xkZXIgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICBhbGxTZXJ2aWNlSW5mb0hvbGRlciA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgcmVsZXZhbnQgY29kZWdlbiBjb25maWd1cmF0aW9uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29uZmlndXJhdGlvbgotICAgICAqIEBzZWUgRW1pdHRlciNzZXRDb2RlR2VuQ29uZmlndXJhdGlvbihvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5Db2RlR2VuQ29uZmlndXJhdGlvbikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDb2RlR2VuQ29uZmlndXJhdGlvbihDb2RlR2VuQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB7Ci0gICAgICAgIHRoaXMuY29kZUdlbkNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uOwotICAgICAgICB0aGlzLmF4aXNTZXJ2aWNlcyA9IGNvZGVHZW5Db25maWd1cmF0aW9uLmdldEF4aXNTZXJ2aWNlcygpOwotICAgICAgICB0aGlzLmF4aXNTZXJ2aWNlID0gY29kZUdlbkNvbmZpZ3VyYXRpb24uZ2V0QXhpc1NlcnZpY2UoKTsKLSAgICAgICAgdGhpcy5heGlzRW5kcG9pbnQgPSBheGlzU2VydmljZS5nZXRFbmRwb2ludChheGlzU2VydmljZS5nZXRFbmRwb2ludE5hbWUoKSk7Ci0gICAgICAgIHRoaXMuYXhpc0JpbmRpbmcgPSBheGlzRW5kcG9pbnQuZ2V0QmluZGluZygpOwotICAgICAgICByZXNvbHZlciA9IG5ldyBYU0xUSW5jbHVkZVJlc29sdmVyKGNvZGVHZW5Db25maWd1cmF0aW9uKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB0eXBlIG1hcHBlcgotICAgICAqCi0gICAgICogQHBhcmFtIG1hcHBlcgotICAgICAqIEBzZWUgRW1pdHRlciNzZXRNYXBwZXIob3JnLmFwYWNoZS5heGlzMi53c2RsLmRhdGFiaW5kaW5nLlR5cGVNYXBwZXIpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TWFwcGVyKFR5cGVNYXBwZXIgbWFwcGVyKSB7Ci0gICAgICAgIHRoaXMubWFwcGVyID0gbWFwcGVyOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBPYmplY3QgZ2V0QmluZGluZ1Byb3BlcnR5RnJvbU9wZXJhdGlvbihTdHJpbmcgbmFtZSwgUU5hbWUgcU5hbWUpIHsKLQotICAgICAgICAvLyBHZXQgdGhlIGNvcnJlY3QgQXhpc0JpbmRpbmdPcGVyYXRpb24gY29yZXNwb25kaW5nIHRvIHRoZSBBeGlzT3BlcmF0aW9uCi0gICAgICAgIEF4aXNCaW5kaW5nT3BlcmF0aW9uIGF4aXNCaW5kaW5nT3BlcmF0aW9uID0gbnVsbDsKLSAgICAgICAgaWYgKGF4aXNCaW5kaW5nICE9IG51bGwpIHsKLSAgICAgICAgICAgIGF4aXNCaW5kaW5nT3BlcmF0aW9uID0gKEF4aXNCaW5kaW5nT3BlcmF0aW9uKSBheGlzQmluZGluZy5nZXRDaGlsZChxTmFtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBPYmplY3QgcHJvcGVydHkgPSBudWxsOwotCi0gICAgICAgIGlmIChheGlzQmluZGluZ09wZXJhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwcm9wZXJ0eSA9IGF4aXNCaW5kaW5nT3BlcmF0aW9uLmdldFByb3BlcnR5KG5hbWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKChwcm9wZXJ0eSA9PSBudWxsKSAmJiAoYXhpc0JpbmRpbmcgIT0gbnVsbCkpIHsKLSAgICAgICAgICAgIHByb3BlcnR5ID0gYXhpc0JpbmRpbmcuZ2V0UHJvcGVydHkobmFtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocHJvcGVydHkgPT0gbnVsbCkgewotICAgICAgICAgICAgcHJvcGVydHkgPSBXU0RMMjBEZWZhdWx0VmFsdWVIb2xkZXIuZ2V0RGVmYXVsdFZhbHVlKG5hbWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHByb3BlcnR5OwotICAgIH0KLQotICAgIHByb3RlY3RlZCBQb2xpY3kgZ2V0QmluZGluZ1BvbGljeUZyb21NZXNzYWdlKEF4aXNCaW5kaW5nT3BlcmF0aW9uIGF4aXNCaW5kaW5nT3BlcmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBrZXkpIHsKLSAgICAgICAgQXhpc0JpbmRpbmdNZXNzYWdlIGF4aXNCaW5kaW5nTWVzc2FnZSA9IG51bGw7Ci0KLSAgICAgICAgaWYgKGF4aXNCaW5kaW5nT3BlcmF0aW9uICE9IG51bGwpIHsKLQotICAgICAgICAgICAgYXhpc0JpbmRpbmdNZXNzYWdlID0gKEF4aXNCaW5kaW5nTWVzc2FnZSkgYXhpc0JpbmRpbmdPcGVyYXRpb24uZ2V0Q2hpbGQoa2V5KTsKLSAgICAgICAgICAgIGlmIChheGlzQmluZGluZ01lc3NhZ2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBheGlzQmluZGluZ01lc3NhZ2UuZ2V0RWZmZWN0aXZlUG9saWN5KCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCl7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcihleC5nZXRNZXNzYWdlKCksIGV4KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIE9iamVjdCBnZXRCaW5kaW5nUHJvcGVydHlGcm9tTWVzc2FnZShTdHJpbmcgbmFtZSwgUU5hbWUgcU5hbWUsIFN0cmluZyBrZXkpIHsKLQotICAgICAgICBPYmplY3QgcHJvcGVydHkgPSBudWxsOwotICAgICAgICAvLyBHZXQgdGhlIGNvcnJlY3QgQXhpc0JpbmRpbmdPcGVyYXRpb24gY29yZXNwb25kaW5nIHRvIHRoZSBBeGlzT3BlcmF0aW9uCi0gICAgICAgIEF4aXNCaW5kaW5nT3BlcmF0aW9uIGF4aXNCaW5kaW5nT3BlcmF0aW9uID0gbnVsbDsKLSAgICAgICAgaWYgKGF4aXNCaW5kaW5nICE9IG51bGwpIHsKLSAgICAgICAgICAgIGF4aXNCaW5kaW5nT3BlcmF0aW9uID0gKEF4aXNCaW5kaW5nT3BlcmF0aW9uKSBheGlzQmluZGluZy5nZXRDaGlsZChxTmFtZSk7Ci0KLSAgICAgICAgfQotCi0gICAgICAgIEF4aXNCaW5kaW5nTWVzc2FnZSBheGlzQmluZGluZ01lc3NhZ2UgPSBudWxsOwotICAgICAgICBpZiAoYXhpc0JpbmRpbmdPcGVyYXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgYXhpc0JpbmRpbmdNZXNzYWdlID0gKEF4aXNCaW5kaW5nTWVzc2FnZSkgYXhpc0JpbmRpbmdPcGVyYXRpb24uZ2V0Q2hpbGQoa2V5KTsKLSAgICAgICAgICAgIGlmIChheGlzQmluZGluZ01lc3NhZ2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHByb3BlcnR5ID0gYXhpc0JpbmRpbmdNZXNzYWdlLmdldFByb3BlcnR5KG5hbWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocHJvcGVydHkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHByb3BlcnR5ID0gYXhpc0JpbmRpbmdPcGVyYXRpb24uZ2V0UHJvcGVydHkobmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotCi0gICAgICAgIGlmICgocHJvcGVydHkgPT0gbnVsbCkgJiYgKGF4aXNCaW5kaW5nICE9IG51bGwpKSB7Ci0gICAgICAgICAgICBwcm9wZXJ0eSA9IGF4aXNCaW5kaW5nLmdldFByb3BlcnR5KG5hbWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHByb3BlcnR5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHByb3BlcnR5ID0gV1NETDIwRGVmYXVsdFZhbHVlSG9sZGVyLmdldERlZmF1bHRWYWx1ZShuYW1lKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBwcm9wZXJ0eTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGdldEJpbmRpbmdQcm9wZXJ0eUZyb21NZXNzYWdlRmF1bHQoU3RyaW5nIG5hbWUsIFFOYW1lIHFOYW1lLCBTdHJpbmcga2V5KSB7Ci0KLSAgICAgICAgT2JqZWN0IHByb3BlcnR5ID0gbnVsbDsKLSAgICAgICAgLy8gR2V0IHRoZSBjb3JyZWN0IEF4aXNCaW5kaW5nT3BlcmF0aW9uIGNvcmVzcG9uZGluZyB0byB0aGUgQXhpc09wZXJhdGlvbgotICAgICAgICBBeGlzQmluZGluZ09wZXJhdGlvbiBheGlzQmluZGluZ09wZXJhdGlvbiA9Ci0gICAgICAgICAgICAgICAgKEF4aXNCaW5kaW5nT3BlcmF0aW9uKSBheGlzQmluZGluZy5nZXRDaGlsZChxTmFtZSk7Ci0KLSAgICAgICAgQXhpc0JpbmRpbmdNZXNzYWdlIGF4aXNCaW5kaW5nTWVzc2FnZUZhdWx0ID0gbnVsbDsKLSAgICAgICAgQXhpc0JpbmRpbmdNZXNzYWdlIGF4aXNCaW5kaW5nRmF1bHQgPSBudWxsOwotICAgICAgICBpZiAoYXhpc0JpbmRpbmdPcGVyYXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgYXhpc0JpbmRpbmdNZXNzYWdlRmF1bHQgPSAoQXhpc0JpbmRpbmdNZXNzYWdlKSBheGlzQmluZGluZ09wZXJhdGlvbi5nZXRGYXVsdChrZXkpOwotCi0gICAgICAgICAgICBpZiAoYXhpc0JpbmRpbmdNZXNzYWdlRmF1bHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHByb3BlcnR5ID0gYXhpc0JpbmRpbmdNZXNzYWdlRmF1bHQuZ2V0UHJvcGVydHkobmFtZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChwcm9wZXJ0eSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYXhpc0JpbmRpbmdGYXVsdCA9IGF4aXNCaW5kaW5nLmdldEZhdWx0KGtleSk7Ci0gICAgICAgICAgICAgICAgcHJvcGVydHkgPSBheGlzQmluZGluZ0ZhdWx0LmdldFByb3BlcnR5KG5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHByb3BlcnR5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHByb3BlcnR5ID0gV1NETDIwRGVmYXVsdFZhbHVlSG9sZGVyLmdldERlZmF1bHRWYWx1ZShuYW1lKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBwcm9wZXJ0eTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFVwZGF0ZSBtYXBwZXIgZm9yIHRoZSBzdHViCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlTWFwcGVyRm9yU3R1YigpIHsKLSAgICAgICAgdXBkYXRlTWFwcGVyQ2xhc3NuYW1lcyhnZXRGdWxseVF1YWxpZmllZFN0dWJOYW1lKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGZ1bGx5IHF1YWxpZmllZCBTdHViIG5hbWUgcmV1c2VkIGluIG1hbnkgbWV0aG9kcwotICAgICAqCi0gICAgICogQHJldHVybiBjbGFzc25hbWUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkU3R1Yk5hbWUoKSB7Ci0gICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9IGNvZGVHZW5Db25maWd1cmF0aW9uLmdldFBhY2thZ2VOYW1lKCk7Ci0gICAgICAgIFN0cmluZyBsb2NhbFBhcnQgPSBudWxsOwotICAgICAgICBpZiAodGhpcy5heGlzU2VydmljZS5nZXRFbmRwb2ludHMoKS5zaXplKCkgPiAxKSB7Ci0gICAgICAgICAgICBsb2NhbFBhcnQgPSBtYWtlSmF2YUNsYXNzTmFtZShheGlzU2VydmljZS5nZXROYW1lKCkgKyBheGlzU2VydmljZS5nZXRFbmRwb2ludE5hbWUoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBsb2NhbFBhcnQgPSBtYWtlSmF2YUNsYXNzTmFtZShheGlzU2VydmljZS5nZXROYW1lKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwYWNrYWdlTmFtZSArICIuIiArIGxvY2FsUGFydCArIFNUVUJfU1VGRklYOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHJlc3RzIHRoZSBmYXVsdCBuYW1lIG1hcHMKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCByZXNldEZhdWx0TmFtZXMoKSB7Ci0gICAgICAgIGZ1bGx5UXVhbGlmaWVkRmF1bHRDbGFzc05hbWVNYXAuY2xlYXIoKTsKLSAgICAgICAgZmF1bHRDbGFzc05hbWVNYXAuY2xlYXIoKTsKLSAgICAgICAgZmF1bHRFbGVtZW50UU5hbWVNYXAuY2xlYXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQb3B1bGF0ZSBhIG1hcCBvZiBmYXVsdCBjbGFzcyBuYW1lcwotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGdlbmVyYXRlQW5kUG9wdWxhdGVGYXVsdE5hbWVzKCkgewotICAgICAgICAvL2xvb3AgdGhyb3VnaCBhbmQgZmluZCB0aGUgZmF1bHRzCi0gICAgICAgIEl0ZXJhdG9yIG9wZXJhdGlvbnMgPSBheGlzU2VydmljZS5nZXRPcGVyYXRpb25zKCk7Ci0gICAgICAgIEF4aXNPcGVyYXRpb24gb3BlcmF0aW9uOwotICAgICAgICBBeGlzTWVzc2FnZSBmYXVsdE1lc3NhZ2U7Ci0gICAgICAgIHdoaWxlIChvcGVyYXRpb25zLmhhc05leHQoKSkgewotICAgICAgICAgICAgb3BlcmF0aW9uID0gKEF4aXNPcGVyYXRpb24pIG9wZXJhdGlvbnMubmV4dCgpOwotICAgICAgICAgICAgQXJyYXlMaXN0IGZhdWx0TWVzc2FnZXMgPSBvcGVyYXRpb24uZ2V0RmF1bHRNZXNzYWdlcygpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmYXVsdE1lc3NhZ2VzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgZmF1bHRNZXNzYWdlID0gKEF4aXNNZXNzYWdlKSBmYXVsdE1lc3NhZ2VzLmdldChpKTsKLSAgICAgICAgICAgICAgICAvL21ha2UgYSB1bmlxdWUgbmFtZSBhbmQgcHV0IHRoYXQgaW4gdGhlIGhhc2htYXAKLSAgICAgICAgICAgICAgICBpZiAoIWZ1bGx5UXVhbGlmaWVkRmF1bHRDbGFzc05hbWVNYXAuCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250YWluc0tleShmYXVsdE1lc3NhZ2UuZ2V0TmFtZSgpKSkgewotICAgICAgICAgICAgICAgICAgICAvL21ha2UgYSBuYW1lCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBtYWtlSmF2YUNsYXNzTmFtZShmYXVsdE1lc3NhZ2UuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgUU5hbWUgZmF1bHRRTmFtZSA9IG5ldyBRTmFtZShjb2RlR2VuQ29uZmlndXJhdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKSwgZmF1bHRNZXNzYWdlLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm1hcHBlci5nZXRRTmFtZVRvTWFwcGluZ09iamVjdChmYXVsdFFOYW1lKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBpLmUgd2UgYWxyZWFkeSBoYXZlIGFuIGVudHJ5Ci0gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSBtYWtlSmF2YUNsYXNzTmFtZShjbGFzc05hbWUgKyAiRXhjZXB0aW9uIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGZ1bGx5UXVhbGlmaWVkRmF1bHRDbGFzc05hbWVNYXAuY29udGFpbnNWYWx1ZShjbGFzc05hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSBtYWtlSmF2YUNsYXNzTmFtZShjbGFzc05hbWUgKyAodW5pcXVlRmF1bHROYW1lQ291bnRlcisrKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBmdWxseVF1YWxpZmllZEZhdWx0Q2xhc3NOYW1lTWFwLnB1dCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYXVsdE1lc3NhZ2UuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIC8vd2UndmUgdG8ga2VlcCB0cmFjayBvZiB0aGUgZmF1bHQgYmFzZSBuYW1lcyBzZXBlcmF0ZWx5Ci0gICAgICAgICAgICAgICAgICAgIGZhdWx0Q2xhc3NOYW1lTWFwLnB1dChmYXVsdE1lc3NhZ2UuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgZmF1bHRFbGVtZW50UU5hbWVNYXAucHV0KGZhdWx0TWVzc2FnZS5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmF1bHRNZXNzYWdlLmdldEVsZW1lbnRRTmFtZSgpKTsKLQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRW1pdHMgdGhlIHN0dWJjb2RlIHdpdGggYmluZGluZ3MuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIENvZGVHZW5lcmF0aW9uRXhjZXB0aW9uCi0gICAgICogQHNlZSBFbWl0dGVyI2VtaXRTdHViKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBlbWl0U3R1YigpIHRocm93cyBDb2RlR2VuZXJhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0KLSAgICAgICAgICAgIC8vZmlyc3Qga2VlcCBhIHNlcGVyYXRlIGNvcHkgb2YgdGhlIG9yaWdpbmFsIG1hcCB0byB1c2UgaW4KLSAgICAgICAgICAgIC8vIGV2ZXJ5IGl0ZXJhdGlvbgotICAgICAgICAgICAgLy8gZm9yIGV2ZXJ5IGl0ZXJhdGlvbiAgcU5hbWUyTmFtZU1hcCBpcyBjaGFuZ2VkIGluIHVwZGF0ZU1hcHBlckZvclN0dWIKLSAgICAgICAgICAgIC8vIG1ldGhvZCBpZiBpbiB0aGUgcGFja2luZyBtb2RlCi0gICAgICAgICAgICBNYXAgb3JpZ2luYWxUeXBlTWFwID0gZ2V0TmV3Q29weShtYXBwZXIuZ2V0QWxsTWFwcGVkTmFtZXMoKSk7Ci0KLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgYXhpc1NlcnZpY2VzSXRlciA9IHRoaXMuYXhpc1NlcnZpY2VzLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlc0l0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIHRoaXMuYXhpc1NlcnZpY2UgPSAoQXhpc1NlcnZpY2UpIGF4aXNTZXJ2aWNlc0l0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgIC8vd2UgaGF2ZSB0byBnZW5lcmF0ZSB0aGUgY29kZSBmb3IgZWFjaCBiaW5pbmRpbmcKLSAgICAgICAgICAgICAgICAvL2ZvciB0aGUgbW9tZW50IGxldHMgZ2VucmF0ZSB0aGUgc3R1YiBuYW1lIHdpdGggdGhlIHNlcnZpY2UgbmFtZSBhbmQgZW5kIHBvaW50IG5hbWUKLSAgICAgICAgICAgICAgICB0aGlzLmF4aXNCaW5kaW5nID0gYXhpc1NlcnZpY2UuZ2V0RW5kcG9pbnQoYXhpc1NlcnZpY2UuZ2V0RW5kcG9pbnROYW1lKCkpLmdldEJpbmRpbmcoKTsKLQotICAgICAgICAgICAgICAgIGlmICghY29kZUdlbkNvbmZpZ3VyYXRpb24uaXNQYWNrQ2xhc3NlcygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIHRoZSBjYWxsIGJhY2sgaGFuZGxlcnMKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVDYWxsQmFja0hhbmRsZXJzKCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgTWFwIGVuZHBvaW50cyA9IHRoaXMuYXhpc1NlcnZpY2UuZ2V0RW5kcG9pbnRzKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBlbmRQb2ludHNJdGVyID0gZW5kcG9pbnRzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgICBlbmRQb2ludHNJdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gc2V0IHRoZSBlbmQgcG9pbnQgZGV0YWlscy4KLSAgICAgICAgICAgICAgICAgICAgdGhpcy5heGlzRW5kcG9pbnQgPSAoQXhpc0VuZHBvaW50KSBlbmRQb2ludHNJdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5heGlzQmluZGluZyA9IHRoaXMuYXhpc0VuZHBvaW50LmdldEJpbmRpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgYXhpc1NlcnZpY2Uuc2V0RW5kcG9pbnROYW1lKHRoaXMuYXhpc0VuZHBvaW50LmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlLnNldEJpbmRpbmdOYW1lKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXhpc0VuZHBvaW50LmdldEJpbmRpbmcoKS5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIHNlZSB0aGUgY29tbWVudCBhdCB1cGRhdGVNYXBwZXJDbGFzc25hbWVzIGZvciBkZXRhaWxzIGFuZCByZWFzb25zIGZvcgotICAgICAgICAgICAgICAgICAgICAvLyBjYWxsaW5nIHRoaXMgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgIGlmIChtYXBwZXIuaXNPYmplY3RNYXBwaW5nUHJlc2VudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbml0aWFsaXplIHRoZSBtYXAgdG8gb3JpZ2luYWwgb25lCi0gICAgICAgICAgICAgICAgICAgICAgICBjb3B5TWFwKG9yaWdpbmFsVHlwZU1hcCwgbWFwcGVyLmdldEFsbE1hcHBlZE5hbWVzKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlTWFwcGVyRm9yU3R1YigpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgY29weVRvRmF1bHRNYXAoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8vZ2VuZXJhdGUgYW5kIHBvcHVsYXRlIHRoZSBmYXVsdCBuYW1lcyBiZWZvcmUgaGFuZC4gV2UgbmVlZCB0aGF0IGZvcgotICAgICAgICAgICAgICAgICAgICAvL3RoZSBzbW9vdGggb3ByYXRpb24gb2YgdGhlIHRoaW5nCi0gICAgICAgICAgICAgICAgICAgIC8vZmlyc3QgcmVzZXQgdGhlIGZhdWx0IG5hbWVzIGFuZCByZWNyZWF0ZSBpdAotICAgICAgICAgICAgICAgICAgICByZXNldEZhdWx0TmFtZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVBbmRQb3B1bGF0ZUZhdWx0TmFtZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlRmF1bHRQYWNrYWdlRm9yU3R1YigpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIHRoZSBpbnRlZmFjZQotICAgICAgICAgICAgICAgICAgICAvLyBmZWVkIHRoZSBiaW5kaW5nIGluZm9ybWF0aW9uIGFsc28KLSAgICAgICAgICAgICAgICAgICAgLy8gbm90ZSB0aGF0IHdlIGRvIG5vdCBjcmVhdGUgdGhpcyBpbnRlcmZhY2UgaWYgdGhlIHVzZXIgc3dpdGNoZWQgb24gdGhlIHdyYXAgY2xhc3NlcyBtb2RlCi0gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaW50ZXJmYWNlIGFsc28gZGVwZW5kcyBvbiB0aGUgYmluZGluZwotICAgICAgICAgICAgICAgICAgICBpZiAoIWNvZGVHZW5Db25maWd1cmF0aW9uLmlzUGFja0NsYXNzZXMoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVJbnRlcmZhY2UoZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGVHZW5Db25maWd1cmF0aW9uLmlzUGFja0NsYXNzZXMoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgdGhlIGNhbGwgYmFjayBoYW5kbGVycwotICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVDYWxsQmFja0hhbmRsZXJzKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZSB0aGUgRXhjZXB0aW9ucwotICAgICAgICAgICAgICAgICAgICB3cml0ZUV4Y2VwdGlvbnMoKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZSBpbnRlcmZhY2UgaW1wbGVtZW50YXRpb25zCi0gICAgICAgICAgICAgICAgICAgIHdyaXRlSW50ZXJmYWNlSW1wbGVtZW50YXRpb24oKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZSB0aGUgdGVzdCBjbGFzc2VzCi0gICAgICAgICAgICAgICAgICAgIHdyaXRlVGVzdENsYXNzZXMoKTsKLQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBzYXZlIGJhY2sgdHlwZSBtYXAKLSAgICAgICAgICAgIGlmICh0aGlzLm1hcHBlci5pc09iamVjdE1hcHBpbmdQcmVzZW50KCkpIHsKLSAgICAgICAgICAgICAgICBjb3B5TWFwKG9yaWdpbmFsVHlwZU1hcCwgdGhpcy5tYXBwZXIuZ2V0QWxsTWFwcGVkTmFtZXMoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghY29kZUdlbkNvbmZpZ3VyYXRpb24uaXNTa2lwQnVpbGRYTUwoKSkgewotICAgICAgICAgICAgICAgIC8vIHdyaXRlIGFuIGFudCBidWlsZCBmaWxlCi0gICAgICAgICAgICAgICAgLy8gTm90ZSB0aGF0IGFudCBidWlsZCBpcyBnZW5lcmF0ZWQgb25seSBvbmNlCi0gICAgICAgICAgICAgICAgLy8gYW5kIHRoYXQgaGFzIHRvIGhhcHBlbiBoZXJlIG9ubHkgaWYgdGhlCi0gICAgICAgICAgICAgICAgLy8gY2xpZW50IHNpZGUgY29kZSBpcyByZXF1aXJlZAotICAgICAgICAgICAgICAgIGlmICghY29kZUdlbkNvbmZpZ3VyYXRpb24uaXNHZW5lcmF0ZUFsbCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vb3VyIGxvZ2ljIGZvciB0aGUgYnVpbGQgeG1sIGlzIHRoYXQgaXQgd2lsbAotICAgICAgICAgICAgICAgICAgICAvL29ubHkgYmUgd3JpdHRlbiB3aGVuIG5vdCBmbGF0dGVuZWQKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFjb2RlR2VuQ29uZmlndXJhdGlvbi5pc0ZsYXR0ZW5GaWxlcygpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUFudEJ1aWxkKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKENvZGVHZW5lcmF0aW9uRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICB0aHJvdyBjZTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDb2RlR2VuZXJhdGlvbkV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBNYXAgZ2V0TmV3Q29weShNYXAgY29weUZvcm1NYXApIHsKLSAgICAgICAgTWFwIGNvcHlUb01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIE9iamVjdCBrZXk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGNvcHlGb3JtTWFwLmtleVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAga2V5ID0gaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBjb3B5VG9NYXAucHV0KGtleSwgY29weUZvcm1NYXAuZ2V0KGtleSkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjb3B5VG9NYXA7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY29weU1hcChNYXAgY29weUZvcm1NYXAsIE1hcCBjb3B5VG9NYXApIHsKLSAgICAgICAgT2JqZWN0IGtleTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gY29weUZvcm1NYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBrZXkgPSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIGNvcHlUb01hcC5wdXQoa2V5LCBjb3B5Rm9ybU1hcC5nZXQoa2V5KSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFdyaXRlcyB0aGUgQW50IGJ1aWxkLgotICAgICAqCi0gICAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCB3cml0ZUFudEJ1aWxkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgLy8gV3JpdGUgdGhlIHNlcnZpY2UgeG1sIGluIGEgZm9sZGVyIHdpdGggdGhlCi0gICAgICAgIERvY3VtZW50IHNrZWxldG9uTW9kZWwgPSBjcmVhdGVET01Eb2N1bWVudEZvckFudEJ1aWxkKCk7Ci0gICAgICAgIGRlYnVnTG9nRG9jdW1lbnQoIkRvY3VtZW50IGZvciBhbnQgYnVpbGQ6Iiwgc2tlbGV0b25Nb2RlbCk7Ci0gICAgICAgIEFudEJ1aWxkV3JpdGVyIGFudEJ1aWxkV3JpdGVyID0gbmV3IEFudEJ1aWxkV3JpdGVyKGNvZGVHZW5Db25maWd1cmF0aW9uLmdldE91dHB1dExvY2F0aW9uKCksCi0gICAgICAgICAgICAgICAgY29kZUdlbkNvbmZpZ3VyYXRpb24uZ2V0T3V0cHV0TGFuZ3VhZ2UoKSk7Ci0KLSAgICAgICAgYW50QnVpbGRXcml0ZXIuc2V0RGF0YWJpbmRpbmdGcmFtZXdvcmsoY29kZUdlbkNvbmZpZ3VyYXRpb24uZ2V0RGF0YWJpbmRpbmdUeXBlKCkpOwotICAgICAgICBhbnRCdWlsZFdyaXRlci5zZXRPdmVycmlkZShjb2RlR2VuQ29uZmlndXJhdGlvbi5pc092ZXJyaWRlKCkpOwotICAgICAgICB3cml0ZUZpbGUoc2tlbGV0b25Nb2RlbCwgYW50QnVpbGRXcml0ZXIpOwotICAgICAgICBjb2RlR2VuQ29uZmlndXJhdGlvbi5hZGRYbWxGaWxlTmFtZShhbnRCdWlsZFdyaXRlci5nZXRPdXRwdXRGaWxlKCkuZ2V0QWJzb2x1dGVQYXRoKCkpOy8vJE5PTi1TRUMtMwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIERPTSB0cmVlIGZvciB0aGUgQW50IGJ1aWxkLiBVc2VzIHRoZSBpbnRlcmZhY2UuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIERvY3VtZW50IGNyZWF0ZURPTURvY3VtZW50Rm9yQW50QnVpbGQoKSB7Ci0gICAgICAgIERvY3VtZW50IGRvYyA9IGdldEVtcHR5RG9jdW1lbnQoKTsKLSAgICAgICAgRWxlbWVudCByb290RWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50KCJhbnQiKTsKLSAgICAgICAgU3RyaW5nIHNlcnZpY2VOYW1lID0gbWFrZUphdmFDbGFzc05hbWUoYXhpc1NlcnZpY2UuZ2V0TmFtZSgpKTsKLSAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gY29kZUdlbkNvbmZpZ3VyYXRpb24uZ2V0UGFja2FnZU5hbWUoKTsKLSAgICAgICAgU3RyaW5nW10gZG90U2VwYXJhdGVkVmFsdWVzID0gcGFja2FnZU5hbWUuc3BsaXQoIlxcLiIpOwotCi0gICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJwYWNrYWdlIiwgZG90U2VwYXJhdGVkVmFsdWVzWzBdLCByb290RWxlbWVudCk7Ci0gICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJuYW1lIiwgc2VydmljZU5hbWUsIHJvb3RFbGVtZW50KTsKLSAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgInNlcnZpY2VuYW1lIiwgc2VydmljZU5hbWUsIHJvb3RFbGVtZW50KTsKLSAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgInNyYyIsIGNvZGVHZW5Db25maWd1cmF0aW9uLmdldFNvdXJjZUxvY2F0aW9uKCksIHJvb3RFbGVtZW50KTsKLSAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgInJlc291cmNlIiwgY29kZUdlbkNvbmZpZ3VyYXRpb24uZ2V0UmVzb3VyY2VMb2NhdGlvbigpLCByb290RWxlbWVudCk7Ci0KLSAgICAgICAgaWYgKGNvZGVHZW5Db25maWd1cmF0aW9uLmdldEF4aXNTZXJ2aWNlcygpLnNpemUoKSA+IDEpewotICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgImFydGlmYWN0bmFtZSIsICJTZXJ2aWNlcyIsIHJvb3RFbGVtZW50KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJhcnRpZmFjdG5hbWUiLCB0aGlzLmF4aXNTZXJ2aWNlLmdldE5hbWUoKSAsIHJvb3RFbGVtZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghY29kZUdlbkNvbmZpZ3VyYXRpb24uaXNXcml0ZVRlc3RDYXNlKCkpIHsKLSAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJ0ZXN0T21pdCIsICJ0cnVlIiwgcm9vdEVsZW1lbnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNvZGVHZW5Db25maWd1cmF0aW9uLmlzU2VydmVyU2lkZSgpKSB7Ci0gICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLAotICAgICAgICAgICAgICAgICAgICAiaXNzZXJ2ZXJzaWRlIiwKLSAgICAgICAgICAgICAgICAgICAgInllcyIsCi0gICAgICAgICAgICAgICAgICAgIHJvb3RFbGVtZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIGRvYy5hcHBlbmRDaGlsZChyb290RWxlbWVudCk7Ci0KLSAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihET00yV3JpdGVyLm5vZGVUb1N0cmluZyhyb290RWxlbWVudCkpOwotICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgICAgICByZXR1cm4gZG9jOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdyaXRlIHRoZSB0ZXN0IGNsYXNzZXMKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCB3cml0ZVRlc3RDbGFzc2VzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChjb2RlR2VuQ29uZmlndXJhdGlvbi5pc1dyaXRlVGVzdENhc2UoKSkgewotICAgICAgICAgICAgRG9jdW1lbnQgY2xhc3NNb2RlbCA9IGNyZWF0ZURPTURvY3VtZW50Rm9yVGVzdENhc2UoKTsKLSAgICAgICAgICAgIGRlYnVnTG9nRG9jdW1lbnQoIkRvY3VtZW50IGZvciB0ZXN0IGNhc2U6IiwgY2xhc3NNb2RlbCk7Ci0gICAgICAgICAgICBUZXN0Q2xhc3NXcml0ZXIgY2FsbGJhY2tXcml0ZXIgPQotICAgICAgICAgICAgICAgICAgICBuZXcgVGVzdENsYXNzV3JpdGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVHZW5Db25maWd1cmF0aW9uLmlzRmxhdHRlbkZpbGVzKCkgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0T3V0cHV0RGlyZWN0b3J5KGNvZGVHZW5Db25maWd1cmF0aW9uLmdldE91dHB1dExvY2F0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwpIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE91dHB1dERpcmVjdG9yeShjb2RlR2VuQ29uZmlndXJhdGlvbi5nZXRPdXRwdXRMb2NhdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURVNUX1NSQ19ESVJfTkFNRSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZUdlbkNvbmZpZ3VyYXRpb24uZ2V0T3V0cHV0TGFuZ3VhZ2UoKSk7Ci0gICAgICAgICAgICBjYWxsYmFja1dyaXRlci5zZXRPdmVycmlkZShjb2RlR2VuQ29uZmlndXJhdGlvbi5pc092ZXJyaWRlKCkpOwotICAgICAgICAgICAgd3JpdGVGaWxlKGNsYXNzTW9kZWwsIGNhbGxiYWNrV3JpdGVyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIFhNTCBNb2RlbCBmb3IgdGhlIHRlc3QgY2FzZQotICAgICAqCi0gICAgICogQHJldHVybiBET00gZG9jdW1lbnQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRG9jdW1lbnQgY3JlYXRlRE9NRG9jdW1lbnRGb3JUZXN0Q2FzZSgpIHsKLSAgICAgICAgU3RyaW5nIGNvcmVDbGFzc05hbWUgPSBtYWtlSmF2YUNsYXNzTmFtZShheGlzU2VydmljZS5nZXROYW1lKCkpOwotICAgICAgICBEb2N1bWVudCBkb2MgPSBnZXRFbXB0eURvY3VtZW50KCk7Ci0gICAgICAgIEVsZW1lbnQgcm9vdEVsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudCgiY2xhc3MiKTsKLQotICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAicGFja2FnZSIsIGNvZGVHZW5Db25maWd1cmF0aW9uLmdldFBhY2thZ2VOYW1lKCksIHJvb3RFbGVtZW50KTsKLSAgICAgICAgaWYgKHRoaXMuYXhpc1NlcnZpY2UuZ2V0RW5kcG9pbnRzKCkuc2l6ZSgpID4gMSkgewotICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgIm5hbWUiLAotICAgICAgICAgICAgICAgICAgICBtYWtlSmF2YUNsYXNzTmFtZShheGlzU2VydmljZS5nZXROYW1lKCkgKyBheGlzU2VydmljZS5nZXRFbmRwb2ludE5hbWUoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIFRFU1RfU1VGRklYLCByb290RWxlbWVudCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAibmFtZSIsIG1ha2VKYXZhQ2xhc3NOYW1lKGF4aXNTZXJ2aWNlLmdldE5hbWUoKSkKLSAgICAgICAgICAgICAgICAgICAgKyBURVNUX1NVRkZJWCwgcm9vdEVsZW1lbnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy90b2RvIGlzIHRoaXMgcmlnaHQgPz8/Ci0gICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJuYW1lc3BhY2UiLCBheGlzU2VydmljZS5nZXRUYXJnZXROYW1lc3BhY2UoKSwgcm9vdEVsZW1lbnQpOwotICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAiaW50ZXJmYWNlTmFtZSIsIGNvcmVDbGFzc05hbWUsIHJvb3RFbGVtZW50KTsKLSAgICAgICAgaWYgKGNvZGVHZW5Db25maWd1cmF0aW9uLmlzUGFja0NsYXNzZXMoKSkgewotICAgICAgICAgICAgaWYgKHRoaXMuYXhpc1NlcnZpY2UuZ2V0RW5kcG9pbnRzKCkuc2l6ZSgpID4gMSkgewotICAgICAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJjYWxsYmFja25hbWUiLCBtYWtlSmF2YUNsYXNzTmFtZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlLmdldE5hbWUoKSArIGF4aXNTZXJ2aWNlLmdldEVuZHBvaW50TmFtZSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgKyBDQUxMX0JBQ0tfSEFORExFUl9TVUZGSVgsIHJvb3RFbGVtZW50KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgImNhbGxiYWNrbmFtZSIsIG1ha2VKYXZhQ2xhc3NOYW1lKGF4aXNTZXJ2aWNlLmdldE5hbWUoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICsgQ0FMTF9CQUNLX0hBTkRMRVJfU1VGRklYLCByb290RWxlbWVudCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJjYWxsYmFja25hbWUiLCBjb3JlQ2xhc3NOYW1lICsgQ0FMTF9CQUNLX0hBTkRMRVJfU1VGRklYLAotICAgICAgICAgICAgICAgICAgICByb290RWxlbWVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHRoaXMuY29kZUdlbkNvbmZpZ3VyYXRpb24uaXNCYWNrd29yZENvbXBhdGliaWxpdHlNb2RlKCkpIHsKLSAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJzdHVibmFtZSIsCi0gICAgICAgICAgICAgICAgICAgIG1ha2VKYXZhQ2xhc3NOYW1lKGF4aXNTZXJ2aWNlLmdldEJpbmRpbmdOYW1lKCkpICsgU1RVQl9TVUZGSVgsCi0gICAgICAgICAgICAgICAgICAgIHJvb3RFbGVtZW50KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmICh0aGlzLmF4aXNTZXJ2aWNlLmdldEVuZHBvaW50cygpLnNpemUoKSA+IDEpIHsKLSAgICAgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAic3R1Ym5hbWUiLCBtYWtlSmF2YUNsYXNzTmFtZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlLmdldE5hbWUoKSArIGF4aXNTZXJ2aWNlLmdldEVuZHBvaW50TmFtZSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgKyBTVFVCX1NVRkZJWCwgcm9vdEVsZW1lbnQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAic3R1Ym5hbWUiLCBtYWtlSmF2YUNsYXNzTmFtZShheGlzU2VydmljZS5nZXROYW1lKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICArIFNUVUJfU1VGRklYLCByb290RWxlbWVudCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0gICAgICAgIC8vYWRkIGJhY2t3b3JkY29tcGF0aWJpbGl0eSBhdHRyaWJ1dGUKLSAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgImlzYmFja2NvbXBhdGlibGUiLAotICAgICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKGNvZGVHZW5Db25maWd1cmF0aW9uLmlzQmFja3dvcmRDb21wYXRpYmlsaXR5TW9kZSgpKSwKLSAgICAgICAgICAgICAgICByb290RWxlbWVudCk7Ci0KLSAgICAgICAgZmlsbFN5bmNBdHRyaWJ1dGVzKGRvYywgcm9vdEVsZW1lbnQpOwotICAgICAgICBsb2FkT3BlcmF0aW9ucyhkb2MsIHJvb3RFbGVtZW50LCBudWxsKTsKLQotICAgICAgICAvLyBhZGQgdGhlIGRhdGFiaW5kIHN1cHBvcnRlcnMuIE5vdyB0aGUgZGF0YWJpbmQgc3VwcG9ydGVycyBhcmUgY29tcGxldGx5IGNvbnRhaW5lZCBpbnNpZGUKLSAgICAgICAgLy8gdGhlIHN0dWJzIGltcGxlbWVudGF0aW9uIGFuZCBub3QgdmlzaWJsZSBvdXRzaWRlCi0gICAgICAgIHJvb3RFbGVtZW50LmFwcGVuZENoaWxkKGNyZWF0ZURPTUVsZW1lbnRmb3JEYXRhYmluZGVycyhkb2MsIGZhbHNlKSk7Ci0gICAgICAgIGRvYy5hcHBlbmRDaGlsZChyb290RWxlbWVudCk7Ci0gICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oRE9NMldyaXRlci5ub2RlVG9TdHJpbmcocm9vdEVsZW1lbnQpKTsKLSAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSAgICAgICAgcmV0dXJuIGRvYzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZXMgdGhlIGltcGxlbWVudGF0aW9ucy4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgd3JpdGVJbnRlcmZhY2VJbXBsZW1lbnRhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIC8vIGZpcnN0IGNoZWNrIGZvciB0aGUgcG9saWNpZXMgaW4gdGhpcyBzZXJ2aWNlIGFuZCB3cml0ZSB0aGVtCi0gICAgICAgIERvY3VtZW50IGludGVyZmFjZUltcGxNb2RlbCA9IGNyZWF0ZURPTURvY3VtZW50Rm9ySW50ZXJmYWNlSW1wbGVtZW50YXRpb24oKTsKLSAgICAgICAgZGVidWdMb2dEb2N1bWVudCgiRG9jdW1lbnQgZm9yIGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbjoiLCBpbnRlcmZhY2VJbXBsTW9kZWwpOwotICAgICAgICBJbnRlcmZhY2VJbXBsZW1lbnRhdGlvbldyaXRlciB3cml0ZXIgPQotICAgICAgICAgICAgICAgIG5ldyBJbnRlcmZhY2VJbXBsZW1lbnRhdGlvbldyaXRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVHZW5Db25maWd1cmF0aW9uLmlzRmxhdHRlbkZpbGVzKCkgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRPdXRwdXREaXJlY3RvcnkoY29kZUdlbkNvbmZpZ3VyYXRpb24uZ2V0T3V0cHV0TG9jYXRpb24oKSwgbnVsbCkgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRPdXRwdXREaXJlY3RvcnkoY29kZUdlbkNvbmZpZ3VyYXRpb24uZ2V0T3V0cHV0TG9jYXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlR2VuQ29uZmlndXJhdGlvbi5nZXRTb3VyY2VMb2NhdGlvbigpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVHZW5Db25maWd1cmF0aW9uLmdldE91dHB1dExhbmd1YWdlKCkpOwotCi0gICAgICAgIHdyaXRlci5zZXRPdmVycmlkZShjb2RlR2VuQ29uZmlndXJhdGlvbi5pc092ZXJyaWRlKCkpOwotICAgICAgICB3cml0ZUZpbGUoaW50ZXJmYWNlSW1wbE1vZGVsLCB3cml0ZXIpOwotCi0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBET00gdHJlZSBmb3IgaW1wbGVtZW50YXRpb25zLgotICAgICAqLwotICAgIHByb3RlY3RlZCBEb2N1bWVudCBjcmVhdGVET01Eb2N1bWVudEZvckludGVyZmFjZUltcGxlbWVudGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gY29kZUdlbkNvbmZpZ3VyYXRpb24uZ2V0UGFja2FnZU5hbWUoKTsKLSAgICAgICAgU3RyaW5nIGxvY2FsUGFydCA9IG1ha2VKYXZhQ2xhc3NOYW1lKGF4aXNTZXJ2aWNlLmdldE5hbWUoKSk7Ci0gICAgICAgIFN0cmluZyBzdHViTmFtZSA9IG1ha2VKYXZhQ2xhc3NOYW1lKGF4aXNTZXJ2aWNlLmdldE5hbWUoKSArIGF4aXNTZXJ2aWNlLmdldEVuZHBvaW50TmFtZSgpKSArCi0gICAgICAgICAgICAgICAgU1RVQl9TVUZGSVg7Ci0gICAgICAgIERvY3VtZW50IGRvYyA9IGdldEVtcHR5RG9jdW1lbnQoKTsKLSAgICAgICAgRWxlbWVudCByb290RWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50KCJjbGFzcyIpOwotCi0gICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJwYWNrYWdlIiwgcGFja2FnZU5hbWUsIHJvb3RFbGVtZW50KTsKLQotICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAic2VydmljZW5hbWUiLCBsb2NhbFBhcnQsIHJvb3RFbGVtZW50KTsKLSAgICAgICAgLy9UaGUgdGFyZ2V0IG5lbWVzcGFjZSBpcyBhZGRlZCBhcyB0aGUgbmFtZXNwYWNlIGZvciB0aGlzIHNlcnZpY2UKLSAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgIm5hbWVzcGFjZSIsIGF4aXNTZXJ2aWNlLmdldFRhcmdldE5hbWVzcGFjZSgpLCByb290RWxlbWVudCk7Ci0gICAgICAgIGlmICh0aGlzLmNvZGVHZW5Db25maWd1cmF0aW9uLmlzQmFja3dvcmRDb21wYXRpYmlsaXR5TW9kZSgpKSB7Ci0gICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAiaW50ZXJmYWNlTmFtZSIsCi0gICAgICAgICAgICAgICAgICAgIG1ha2VKYXZhQ2xhc3NOYW1lKGF4aXNTZXJ2aWNlLmdldEVuZHBvaW50TmFtZSgpKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RVQl9JTlRFUkZBQ0VfU1VGRklYX0JBQ0ssCi0gICAgICAgICAgICAgICAgICAgIHJvb3RFbGVtZW50KTsKLSAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJuYW1lIiwgbWFrZUphdmFDbGFzc05hbWUoYXhpc1NlcnZpY2UuZ2V0QmluZGluZ05hbWUoKSkgKyBTVFVCX1NVRkZJWCwKLSAgICAgICAgICAgICAgICAgICAgcm9vdEVsZW1lbnQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKHRoaXMuYXhpc1NlcnZpY2UuZ2V0RW5kcG9pbnRzKCkuc2l6ZSgpID4gMSkgewotICAgICAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJpbnRlcmZhY2VOYW1lIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VKYXZhQ2xhc3NOYW1lKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzU2VydmljZS5nZXROYW1lKCkgKyBheGlzU2VydmljZS5nZXRFbmRwb2ludE5hbWUoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICByb290RWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgIm5hbWUiLCBzdHViTmFtZSwgcm9vdEVsZW1lbnQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAiaW50ZXJmYWNlTmFtZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBtYWtlSmF2YUNsYXNzTmFtZShheGlzU2VydmljZS5nZXROYW1lKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgcm9vdEVsZW1lbnQpOwotICAgICAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJuYW1lIiwgbWFrZUphdmFDbGFzc05hbWUoYXhpc1NlcnZpY2UuZ2V0TmFtZSgpKSArIFNUVUJfU1VGRklYLAotICAgICAgICAgICAgICAgICAgICAgICAgcm9vdEVsZW1lbnQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotICAgICAgICBpZiAoY29kZUdlbkNvbmZpZ3VyYXRpb24uaXNQYWNrQ2xhc3NlcygpKSB7Ci0gICAgICAgICAgICBpZiAodGhpcy5heGlzU2VydmljZS5nZXRFbmRwb2ludHMoKS5zaXplKCkgPiAxKSB7Ci0gICAgICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgImNhbGxiYWNrbmFtZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBtYWtlSmF2YUNsYXNzTmFtZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpc1NlcnZpY2UuZ2V0TmFtZSgpICsgYXhpc1NlcnZpY2UuZ2V0RW5kcG9pbnROYW1lKCkpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTF9CQUNLX0hBTkRMRVJfU1VGRklYLCByb290RWxlbWVudCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJjYWxsYmFja25hbWUiLAotICAgICAgICAgICAgICAgICAgICAgICAgbWFrZUphdmFDbGFzc05hbWUoYXhpc1NlcnZpY2UuZ2V0TmFtZSgpKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTExfQkFDS19IQU5ETEVSX1NVRkZJWCwgcm9vdEVsZW1lbnQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAiY2FsbGJhY2tuYW1lIiwgbG9jYWxQYXJ0ICsgQ0FMTF9CQUNLX0hBTkRMRVJfU1VGRklYLCByb290RWxlbWVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgLy9hZGQgYmFja3dvcmRjb21wYXRpYmlsaXR5IGF0dHJpYnV0ZQotICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAiaXNiYWNrY29tcGF0aWJsZSIsCi0gICAgICAgICAgICAgICAgU3RyaW5nLnZhbHVlT2YoY29kZUdlbkNvbmZpZ3VyYXRpb24uaXNCYWNrd29yZENvbXBhdGliaWxpdHlNb2RlKCkpLAotICAgICAgICAgICAgICAgIHJvb3RFbGVtZW50KTsKLQotICAgICAgICAvLyBhZGQgdGhlIHdyYXAgY2xhc3NlcyBmbGFnCi0gICAgICAgIGlmIChjb2RlR2VuQ29uZmlndXJhdGlvbi5pc1BhY2tDbGFzc2VzKCkpIHsKLSAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJ3cmFwcGVkIiwgInllcyIsIHJvb3RFbGVtZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGFkZCBTT0FQIHZlcnNpb24KLSAgICAgICAgYWRkU29hcFZlcnNpb24oZG9jLCByb290RWxlbWVudCk7Ci0KLSAgICAgICAgLy8gYWRkIHRoZSBlbmQgcG9pbnQKLSAgICAgICAgYWRkRW5kcG9pbnQoZG9jLCByb290RWxlbWVudCk7Ci0KLSAgICAgICAgLy8gc2V0IHRoZSBzeW5jL2FzeW5jIGF0dHJpYnV0ZXMKLSAgICAgICAgZmlsbFN5bmNBdHRyaWJ1dGVzKGRvYywgcm9vdEVsZW1lbnQpOwotCi0gICAgICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSAgICAgICAgLy8gdGhpcyBibG9jayBvZiBjb2RlIHNwZWNpZmljYWxseSBhcHBsaWVzIHRvIHRoZSBpbnRlZ3JhdGlvbiBvZiBkYXRhYmluZGluZyBjb2RlIGludG8gdGhlCi0gICAgICAgIC8vIGdlbmVyYXRlZCBjbGFzc2VzIHRpZ2h0bHkgKHByb2JhYmx5IGFzIGlubmVyIGNsYXNzZXMpCi0gICAgICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSAgICAgICAgLy8gY2hlY2sgZm9yIHRoZSBzcGVjaWFsIG1vZGVscyBpbiB0aGUgbWFwcGVyIGFuZCBpZiB0aGV5IGFyZSBwcmVzZW50IHByb2Nlc3MgdGhlbQotICAgICAgICBpZiAobWFwcGVyLmlzT2JqZWN0TWFwcGluZ1ByZXNlbnQoKSkgewotCi0gICAgICAgICAgICAvLyBhZGQgYW4gYXR0cmlidXRlIHRvIHRoZSByb290IGVsZW1lbnQgc2hvd2luZyB0aGF0IHRoZSB3cml0aW5nIGhhcyBiZWVuIHNraXBwZWQKLSAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJza2lwLXdyaXRlIiwgInllcyIsIHJvb3RFbGVtZW50KTsKLQotICAgICAgICAgICAgLy8gcHJvY2VzcyB0aGUgbWFwcGVyIG9iamVjdHMKLSAgICAgICAgICAgIHByb2Nlc3NNb2RlbE9iamVjdHMobWFwcGVyLmdldEFsbE1hcHBlZE9iamVjdHMoKSwgcm9vdEVsZW1lbnQsIGRvYyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotICAgICAgICAvLyBsb2FkIHRoZSBvcGVyYXRpb25zCi0gICAgICAgIGxvYWRPcGVyYXRpb25zKGRvYywgcm9vdEVsZW1lbnQsIG51bGwpOwotCi0gICAgICAgIC8vIGFkZCB0aGUgZGF0YWJpbmQgc3VwcG9ydGVycy4gTm93IHRoZSBkYXRhYmluZCBzdXBwb3J0ZXJzIGFyZSBjb21wbGV0bHkgY29udGFpbmVkIGluc2lkZQotICAgICAgICAvLyB0aGUgc3R1YnMgaW1wbGVtZW50YXRpb24gYW5kIG5vdCB2aXNpYmxlIG91dHNpZGUKLSAgICAgICAgcm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQoY3JlYXRlRE9NRWxlbWVudGZvckRhdGFiaW5kZXJzKGRvYywgZmFsc2UpKTsKLQotICAgICAgICBPYmplY3QgbW9kdWxlQ29kZWdlblBvbGljeUV4dGVuc2lvbkVsZW1lbnQ7Ci0KLSAgICAgICAgLy9pZiBzb21lIGV4dGVuc2lvbiBoYXMgYWRkZWQgdGhlIHN0dWIgbWV0aG9kcyBwcm9wZXJ0eSwgYWRkIHRoZW0gdG8gdGhlCi0gICAgICAgIC8vbWFpbiBkb2N1bWVudAotICAgICAgICBpZiAoKG1vZHVsZUNvZGVnZW5Qb2xpY3lFeHRlbnNpb25FbGVtZW50ID0KLSAgICAgICAgICAgICAgICBjb2RlR2VuQ29uZmlndXJhdGlvbi5nZXRQcm9wZXJ0eSgibW9kdWxlLWNvZGVnZW4tcG9saWN5LWV4dGVuc2lvbnMiKSkgIT0gbnVsbCkgewotICAgICAgICAgICAgcm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQoCi0gICAgICAgICAgICAgICAgICAgIGRvYy5pbXBvcnROb2RlKChFbGVtZW50KSBtb2R1bGVDb2RlZ2VuUG9saWN5RXh0ZW5zaW9uRWxlbWVudCwgdHJ1ZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy9hZGQgYW5vdGhlciBlbGVtZW50IHRvIGhhdmUgdGhlIHVuaXF1ZSBsaXN0IG9mIGZhdWx0cwotICAgICAgICByb290RWxlbWVudC5hcHBlbmRDaGlsZChnZXRVbmlxdWVMaXN0b2ZGYXVsdHMoZG9jKSk7Ci0KLQotICAgICAgICBkb2MuYXBwZW5kQ2hpbGQocm9vdEVsZW1lbnQpOwotCi0gICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oRE9NMldyaXRlci5ub2RlVG9TdHJpbmcocm9vdEVsZW1lbnQpKTsKLSAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgICAgIHJldHVybiBkb2M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQSB1dGlsIG1ldGhvZCB0aGF0IHJldHVybnMgYSB1bmlxdWUgbGlzdCBvZiBmYXVsdHMKLSAgICAgKgotICAgICAqIEBwYXJhbSBkb2MKLSAgICAgKiBAcmV0dXJuIERPTSBlbGVtZW50Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIEVsZW1lbnQgZ2V0VW5pcXVlTGlzdG9mRmF1bHRzKERvY3VtZW50IGRvYykgewotICAgICAgICBFbGVtZW50IHJvb3RFbGVtZW50ID0gZG9jLmNyZWF0ZUVsZW1lbnQoImZhdWx0LWxpc3QiKTsKLSAgICAgICAgRWxlbWVudCBmYXVsdEVsZW1lbnQ7Ci0gICAgICAgIFN0cmluZyBrZXk7Ci0gICAgICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gZnVsbHlRdWFsaWZpZWRGYXVsdENsYXNzTmFtZU1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBmYXVsdEVsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudCgiZmF1bHQiKTsKLSAgICAgICAgICAgIGtleSA9IChTdHJpbmcpIGl0ZXJhdG9yLm5leHQoKTsKLQotICAgICAgICAgICAgLy9hcyBmb3IgdGhlIG5hbWUgb2YgYSBmYXVsdCwgd2UgZ2VuZXJhdGUgYW4gZXhjZXB0aW9uCi0gICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAibmFtZSIsCi0gICAgICAgICAgICAgICAgICAgIChTdHJpbmcpIGZ1bGx5UXVhbGlmaWVkRmF1bHRDbGFzc05hbWVNYXAuZ2V0KGtleSksCi0gICAgICAgICAgICAgICAgICAgIGZhdWx0RWxlbWVudCk7Ci0gICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAic2hvcnROYW1lIiwKLSAgICAgICAgICAgICAgICAgICAgKFN0cmluZykgZmF1bHRDbGFzc05hbWVNYXAuZ2V0KGtleSksCi0gICAgICAgICAgICAgICAgICAgIGZhdWx0RWxlbWVudCk7Ci0KLSAgICAgICAgICAgIC8vdGhlIHR5cGUgcmVwcmVzZW50cyB0aGUgdHlwZSB0aGF0IHdpbGwgYmUgd3JhcHBlZCBieSB0aGlzCi0gICAgICAgICAgICAvL25hbWUKLSAgICAgICAgICAgIFN0cmluZyB0eXBlTWFwcGluZyA9Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMubWFwcGVyLmdldFR5cGVNYXBwaW5nTmFtZSgoUU5hbWUpIGZhdWx0RWxlbWVudFFOYW1lTWFwLmdldChrZXkpKTsKLSAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJ0eXBlIiwgKHR5cGVNYXBwaW5nID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgID8gIiIKLSAgICAgICAgICAgICAgICAgICAgOiB0eXBlTWFwcGluZywgZmF1bHRFbGVtZW50KTsKLSAgICAgICAgICAgIFN0cmluZyBhdHRyaWJWYWx1ZSA9IChTdHJpbmcpIGluc3RhbnRpYXRhYmxlTWVzc2FnZUNsYXNzTmFtZXMuCi0gICAgICAgICAgICAgICAgICAgIGdldChrZXkpOwotCi0gICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAiaW5zdGFudGlhdGFibGVUeXBlIiwKLSAgICAgICAgICAgICAgICAgICAgYXR0cmliVmFsdWUgPT0gbnVsbCA/ICIiIDogYXR0cmliVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgIGZhdWx0RWxlbWVudCk7Ci0KLSAgICAgICAgICAgIC8vIGFkZCBhbiBleHRyYSBhdHRyaWJ1dGUgdG8gc2F5IHdoZXRoZXIgdGhlIHR5cGUgbWFwcGluZyBpcwotICAgICAgICAgICAgLy8gdGhlIGRlZmF1bHQKLSAgICAgICAgICAgIGlmIChtYXBwZXIuZ2V0RGVmYXVsdE1hcHBpbmdOYW1lKCkuZXF1YWxzKHR5cGVNYXBwaW5nKSkgewotICAgICAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJkZWZhdWx0IiwgInllcyIsIGZhdWx0RWxlbWVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAidmFsdWUiLCBnZXRQYXJhbUluaXRpYWxpemVyKHR5cGVNYXBwaW5nKSwKLSAgICAgICAgICAgICAgICAgICAgZmF1bHRFbGVtZW50KTsKLQotCi0gICAgICAgICAgICByb290RWxlbWVudC5hcHBlbmRDaGlsZChmYXVsdEVsZW1lbnQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByb290RWxlbWVudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBhZGQgdGhlIHFOYW1lcyBvZiB0aGUgb3BlcmF0aW9uIGZhdWx0IG1lc3NhZ2UgbmFtZXMgdG8gZmF1bHRNZXNzYWdlcyBNZXAKLSAgICAgKgotICAgICAqIEBwYXJhbSBvcGVyYXRpb25GYXVsdE1lc3NhZ2VzCi0gICAgICogQHBhcmFtIGZhdWx0TWVzc2FnZXNUb01lcAotICAgICAqLwotCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkRmF1bHRNZXNzYWdlcyhMaXN0IG9wZXJhdGlvbkZhdWx0TWVzc2FnZXMsIFNldCBmYXVsdE1lc3NhZ2VzVG9NZXApIHsKLQotICAgICAgICBBeGlzTWVzc2FnZSBmYXVsdE1lc3NhZ2U7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IG9wZXJhdGlvbkZhdWx0TWVzc2FnZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBmYXVsdE1lc3NhZ2UgPSAoQXhpc01lc3NhZ2UpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgZmF1bHRNZXNzYWdlc1RvTWVwLmFkZChmYXVsdE1lc3NhZ2UuZ2V0TmFtZSgpKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQSB1dGlsIG1ldGhvZCB0aGF0IHJldHVybnMgYSB1bmlxdWUgbGlzdCBvZiBmYXVsdHMgZm9yIGEgZ2l2ZW4gbWVwCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZG9jCi0gICAgICogQHJldHVybiBET00gZWxlbWVudAotICAgICAqLwotICAgIHByb3RlY3RlZCBFbGVtZW50IGdldFVuaXF1ZUxpc3RvZkZhdWx0c29mTWVwKERvY3VtZW50IGRvYywgU3RyaW5nIG1lcCkgewotCi0gICAgICAgIC8vICBsaXN0IHRvIGtlZXAgZmF1bHQgbWVzc2FnZSBxbmFtZXMgZm9yIHRoaXMgbWVwCi0gICAgICAgIFNldCBmYXVsdExpc3RGb3JNZXAgPSBuZXcgSGFzaFNldCgpOwotCi0gICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSB0aGlzLmF4aXNTZXJ2aWNlLmdldE9wZXJhdGlvbnMoKTsKLSAgICAgICAgQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uOwotCi0gICAgICAgIGZvciAoOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIGF4aXNPcGVyYXRpb24gPSAoQXhpc09wZXJhdGlvbikgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAobWVwID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBhZGQgdGhlIGZhdWx0IG1lc3NhZ2VzCi0gICAgICAgICAgICAgICAgYWRkRmF1bHRNZXNzYWdlcyhheGlzT3BlcmF0aW9uLmdldEZhdWx0TWVzc2FnZXMoKSwgZmF1bHRMaXN0Rm9yTWVwKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1lcC5lcXVhbHMoYXhpc09wZXJhdGlvbi5nZXRNZXNzYWdlRXhjaGFuZ2VQYXR0ZXJuKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGFkZCB0aGUgZmF1bHQgbWVzc2FnZXMKLSAgICAgICAgICAgICAgICAgICAgYWRkRmF1bHRNZXNzYWdlcyhheGlzT3BlcmF0aW9uLmdldEZhdWx0TWVzc2FnZXMoKSwgZmF1bHRMaXN0Rm9yTWVwKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBFbGVtZW50IHJvb3RFbGVtZW50ID0gZG9jLmNyZWF0ZUVsZW1lbnQoImZhdWx0LWxpc3QiKTsKLSAgICAgICAgRWxlbWVudCBmYXVsdEVsZW1lbnQ7Ci0gICAgICAgIFN0cmluZyBrZXk7Ci0gICAgICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gZmF1bHRMaXN0Rm9yTWVwLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIGZhdWx0RWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50KCJmYXVsdCIpOwotICAgICAgICAgICAga2V5ID0gKFN0cmluZykgaXRlcmF0b3IubmV4dCgpOwotCi0gICAgICAgICAgICAvL2FzIGZvciB0aGUgbmFtZSBvZiBhIGZhdWx0LCB3ZSBnZW5lcmF0ZSBhbiBleGNlcHRpb24KLSAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJuYW1lIiwKLSAgICAgICAgICAgICAgICAgICAgKFN0cmluZykgZnVsbHlRdWFsaWZpZWRGYXVsdENsYXNzTmFtZU1hcC5nZXQoa2V5KSwKLSAgICAgICAgICAgICAgICAgICAgZmF1bHRFbGVtZW50KTsKLSAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJzaG9ydE5hbWUiLAotICAgICAgICAgICAgICAgICAgICAoU3RyaW5nKSBmYXVsdENsYXNzTmFtZU1hcC5nZXQoa2V5KSwKLSAgICAgICAgICAgICAgICAgICAgZmF1bHRFbGVtZW50KTsKLQotICAgICAgICAgICAgLy90aGUgdHlwZSByZXByZXNlbnRzIHRoZSB0eXBlIHRoYXQgd2lsbCBiZSB3cmFwcGVkIGJ5IHRoaXMKLSAgICAgICAgICAgIC8vbmFtZQotICAgICAgICAgICAgU3RyaW5nIHR5cGVNYXBwaW5nID0KLSAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXBwZXIuZ2V0VHlwZU1hcHBpbmdOYW1lKChRTmFtZSkgZmF1bHRFbGVtZW50UU5hbWVNYXAuZ2V0KGtleSkpOwotICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgInR5cGUiLCAodHlwZU1hcHBpbmcgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgPyAiIgotICAgICAgICAgICAgICAgICAgICA6IHR5cGVNYXBwaW5nLCBmYXVsdEVsZW1lbnQpOwotICAgICAgICAgICAgU3RyaW5nIGF0dHJpYlZhbHVlID0gKFN0cmluZykgaW5zdGFudGlhdGFibGVNZXNzYWdlQ2xhc3NOYW1lcy4KLSAgICAgICAgICAgICAgICAgICAgZ2V0KGtleSk7Ci0KLSAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJpbnN0YW50aWF0YWJsZVR5cGUiLAotICAgICAgICAgICAgICAgICAgICBhdHRyaWJWYWx1ZSA9PSBudWxsID8gIiIgOiBhdHRyaWJWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgZmF1bHRFbGVtZW50KTsKLQotICAgICAgICAgICAgU3RyaW5nIGV4Y2VwdGlvbk5hbWUgPSAoKFFOYW1lKSBmYXVsdEVsZW1lbnRRTmFtZU1hcC5nZXQoa2V5KSkuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAibG9jYWxuYW1lIiwKLSAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uTmFtZSA9PSBudWxsID8gIiIgOiBleGNlcHRpb25OYW1lLAotICAgICAgICAgICAgICAgICAgICBmYXVsdEVsZW1lbnQpOwotCi0gICAgICAgICAgICAvLyBhZGQgYW4gZXh0cmEgYXR0cmlidXRlIHRvIHNheSB3aGV0aGVyIHRoZSB0eXBlIG1hcHBpbmcgaXMKLSAgICAgICAgICAgIC8vIHRoZSBkZWZhdWx0Ci0gICAgICAgICAgICBpZiAobWFwcGVyLmdldERlZmF1bHRNYXBwaW5nTmFtZSgpLmVxdWFscyh0eXBlTWFwcGluZykpIHsKLSAgICAgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAiZGVmYXVsdCIsICJ5ZXMiLCBmYXVsdEVsZW1lbnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgInZhbHVlIiwgZ2V0UGFyYW1Jbml0aWFsaXplcih0eXBlTWFwcGluZyksCi0gICAgICAgICAgICAgICAgICAgIGZhdWx0RWxlbWVudCk7Ci0KLQotICAgICAgICAgICAgcm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQoZmF1bHRFbGVtZW50KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcm9vdEVsZW1lbnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyB0aGUgZW5kcG9pbnQgdG8gdGhlIGRvY3VtZW50LgotICAgICAqCi0gICAgICogQHBhcmFtIGRvYwotICAgICAqIEBwYXJhbSByb290RWxlbWVudAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGFkZEVuZHBvaW50KERvY3VtZW50IGRvYywgRWxlbWVudCByb290RWxlbWVudCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgRWxlbWVudCBlbmRwb2ludEVsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudCgiZW5kcG9pbnQiKTsKLQotICAgICAgICBTdHJpbmcgZW5kcG9pbnQgPSB0aGlzLmF4aXNFbmRwb2ludC5nZXRFbmRwb2ludFVSTCgpOwotICAgICAgICBUZXh0IHRleHQgPSBkb2MuY3JlYXRlVGV4dE5vZGUoKGVuZHBvaW50ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgPyBlbmRwb2ludAotICAgICAgICAgICAgICAgIDogIiIpOwotCi0gICAgICAgIGVuZHBvaW50RWxlbWVudC5hcHBlbmRDaGlsZCh0ZXh0KTsKLSAgICAgICAgcm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQoZW5kcG9pbnRFbGVtZW50KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMb29rcyBmb3IgdGhlIFNPQVBWZXJzaW9uIGFuZCBhZGRzIGl0LgotICAgICAqCi0gICAgICogQHBhcmFtIGRvYwotICAgICAqIEBwYXJhbSByb290RWxlbWVudAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGFkZFNvYXBWZXJzaW9uKERvY3VtZW50IGRvYywgRWxlbWVudCByb290RWxlbWVudCkgewotICAgICAgICAvLyBsb29wIHRocm91Z2ggdGhlIGV4dGVuc2liaWxpdHkgZWxlbWVudHMgdG8gZ2V0IHRvIHRoZSBiaW5kaW5ncyBlbGVtZW50Ci0gICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJzb2FwLXZlcnNpb24iLAotICAgICAgICAgICAgICAgIChTdHJpbmcpIGF4aXNCaW5kaW5nLmdldFByb3BlcnR5KFdTREwyQ29uc3RhbnRzLkFUVFJfV1NPQVBfVkVSU0lPTiksCi0gICAgICAgICAgICAgICAgcm9vdEVsZW1lbnQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdyaXRlcyB0aGUgZXhjZXB0aW9ucy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCB3cml0ZUV4Y2VwdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgRWxlbWVudCBmYXVsdEVsZW1lbnQ7Ci0gICAgICAgIFN0cmluZyBrZXk7Ci0gICAgICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gZnVsbHlRdWFsaWZpZWRGYXVsdENsYXNzTmFtZU1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBEb2N1bWVudCBkb2MgPSBnZXRFbXB0eURvY3VtZW50KCk7Ci0KLSAgICAgICAgICAgIGZhdWx0RWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50KCJmYXVsdCIpOwotCi0gICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAicGFja2FnZSIsIGNvZGVHZW5Db25maWd1cmF0aW9uLmdldFBhY2thZ2VOYW1lKCksIGZhdWx0RWxlbWVudCk7Ci0KLSAgICAgICAgICAgIGtleSA9IChTdHJpbmcpIGl0ZXJhdG9yLm5leHQoKTsKLQotICAgICAgICAgICAgLy9hcyBmb3IgdGhlIG5hbWUgb2YgYSBmYXVsdCwgd2UgZ2VuZXJhdGUgYW4gZXhjZXB0aW9uCi0gICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAibmFtZSIsCi0gICAgICAgICAgICAgICAgICAgIChTdHJpbmcpIGZhdWx0Q2xhc3NOYW1lTWFwLmdldChrZXkpLAotICAgICAgICAgICAgICAgICAgICBmYXVsdEVsZW1lbnQpOwotICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgInNob3J0TmFtZSIsCi0gICAgICAgICAgICAgICAgICAgIChTdHJpbmcpIGZhdWx0Q2xhc3NOYW1lTWFwLmdldChrZXkpLAotICAgICAgICAgICAgICAgICAgICBmYXVsdEVsZW1lbnQpOwotCi0gICAgICAgICAgICAvL2FkZGVkIHRoZSBiYXNlIGV4Y2VwdGlvbiBjbGFzcyBuYW1lCi0gICAgICAgICAgICBpZiAodGhpcy5jb2RlR2VuQ29uZmlndXJhdGlvbi5nZXRFeGNlcHRpb25CYXNlQ2xhc3NOYW1lKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJleGNlcHRpb25CYXNlQ2xhc3MiLAotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb2RlR2VuQ29uZmlndXJhdGlvbi5nZXRFeGNlcHRpb25CYXNlQ2xhc3NOYW1lKCksIGZhdWx0RWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgYWRkQ29uc3RydWN0b3JEZXRhaWxzKGRvYywgZmF1bHRFbGVtZW50LCB0aGlzLmNvZGVHZW5Db25maWd1cmF0aW9uLmdldEV4Y2VwdGlvbkJhc2VDbGFzc05hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKCJDYW4gbm90IGxvYWQgdGhlIEV4Y2VwdGlvbiBiYXNlIGNsYXNzIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAiZXhjZXB0aW9uQmFzZUNsYXNzIiwgRXhjZXB0aW9uLmNsYXNzLmdldE5hbWUoKSwgZmF1bHRFbGVtZW50KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy90aGUgdHlwZSByZXByZXNlbnRzIHRoZSB0eXBlIHRoYXQgd2lsbCBiZSB3cmFwcGVkIGJ5IHRoaXMKLSAgICAgICAgICAgIC8vbmFtZQotICAgICAgICAgICAgU3RyaW5nIHR5cGVNYXBwaW5nID0KLSAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXBwZXIuZ2V0VHlwZU1hcHBpbmdOYW1lKChRTmFtZSkgZmF1bHRFbGVtZW50UU5hbWVNYXAuZ2V0KGtleSkpOwotICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgInR5cGUiLCAodHlwZU1hcHBpbmcgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgPyAiIgotICAgICAgICAgICAgICAgICAgICA6IHR5cGVNYXBwaW5nLCBmYXVsdEVsZW1lbnQpOwotICAgICAgICAgICAgU3RyaW5nIGF0dHJpYlZhbHVlID0gKFN0cmluZykgaW5zdGFudGlhdGFibGVNZXNzYWdlQ2xhc3NOYW1lcy4KLSAgICAgICAgICAgICAgICAgICAgZ2V0KGtleSk7Ci0gICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAiaW5zdGFudGlhdGFibGVUeXBlIiwKLSAgICAgICAgICAgICAgICAgICAgYXR0cmliVmFsdWUgPT0gbnVsbCA/ICIiIDogYXR0cmliVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgIGZhdWx0RWxlbWVudCk7Ci0KLSAgICAgICAgICAgIC8vIGFkZCBhbiBleHRyYSBhdHRyaWJ1dGUgdG8gc2F5IHdoZXRoZXIgdGhlIHR5cGUgbWFwcGluZyBpcwotICAgICAgICAgICAgLy8gdGhlIGRlZmF1bHQKLSAgICAgICAgICAgIGlmIChtYXBwZXIuZ2V0RGVmYXVsdE1hcHBpbmdOYW1lKCkuZXF1YWxzKHR5cGVNYXBwaW5nKSkgewotICAgICAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJkZWZhdWx0IiwgInllcyIsIGZhdWx0RWxlbWVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAidmFsdWUiLCBnZXRQYXJhbUluaXRpYWxpemVyKHR5cGVNYXBwaW5nKSwKLSAgICAgICAgICAgICAgICAgICAgZmF1bHRFbGVtZW50KTsKLSAgICAgICAgICAgIEV4Y2VwdGlvbldyaXRlciBleGNlcHRpb25Xcml0ZXIgPQotICAgICAgICAgICAgICAgICAgICBuZXcgRXhjZXB0aW9uV3JpdGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVHZW5Db25maWd1cmF0aW9uLmlzRmxhdHRlbkZpbGVzKCkgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0T3V0cHV0RGlyZWN0b3J5KGNvZGVHZW5Db25maWd1cmF0aW9uLmdldE91dHB1dExvY2F0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwpIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE91dHB1dERpcmVjdG9yeShjb2RlR2VuQ29uZmlndXJhdGlvbi5nZXRPdXRwdXRMb2NhdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlR2VuQ29uZmlndXJhdGlvbi5nZXRTb3VyY2VMb2NhdGlvbigpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlR2VuQ29uZmlndXJhdGlvbi5nZXRPdXRwdXRMYW5ndWFnZSgpKTsKLQotICAgICAgICAgICAgZG9jLmFwcGVuZENoaWxkKGZhdWx0RWxlbWVudCk7Ci0gICAgICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihET00yV3JpdGVyLm5vZGVUb1N0cmluZyhkb2MpKTsKLSAgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgICAgICAgICAgZXhjZXB0aW9uV3JpdGVyLnNldE92ZXJyaWRlKGNvZGVHZW5Db25maWd1cmF0aW9uLmlzT3ZlcnJpZGUoKSk7Ci0gICAgICAgICAgICB3cml0ZUZpbGUoZG9jLCBleGNlcHRpb25Xcml0ZXIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZENvbnN0cnVjdG9yRGV0YWlscyhEb2N1bWVudCBkb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50IGZhdWx0RWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBleGNlcHRpb25DbGFzc05hbWUpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgQ2xhc3MgZXhjZXB0aW9uQ2xhc3MgPSBDbGFzcy5mb3JOYW1lKGV4Y2VwdGlvbkNsYXNzTmFtZSk7Ci0gICAgICAgIENvbnN0cnVjdG9yW10gY29uc3RydWN0b3JzID0gIGV4Y2VwdGlvbkNsYXNzLmdldENvbnN0cnVjdG9ycygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbnN0cnVjdG9ycy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgRWxlbWVudCBjb25zdHJ1Y3RvckVsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudCgiY29uc3RydWN0b3IiKTsKLSAgICAgICAgICAgIGZhdWx0RWxlbWVudC5hcHBlbmRDaGlsZChjb25zdHJ1Y3RvckVsZW1lbnQpOwotICAgICAgICAgICAgQ2xhc3NbXSBwYXJhbWV0ZXJzID0gY29uc3RydWN0b3JzW2ldLmdldFBhcmFtZXRlclR5cGVzKCk7Ci0gICAgICAgICAgICBMaXN0IGV4aXN0aW5nUGFyYW1OYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgcGFyYW1ldGVycy5sZW5ndGg7IGorKyl7Ci0gICAgICAgICAgICAgICAgRWxlbWVudCBwYXJhbWV0ZXJFbGVtZW50ID0gZG9jLmNyZWF0ZUVsZW1lbnQoInBhcmFtIik7Ci0gICAgICAgICAgICAgICAgY29uc3RydWN0b3JFbGVtZW50LmFwcGVuZENoaWxkKHBhcmFtZXRlckVsZW1lbnQpOwotICAgICAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldFR5cGVOYW1lKHBhcmFtZXRlcnNbal0pLCBwYXJhbWV0ZXJFbGVtZW50KTsKLSAgICAgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAibmFtZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRQYXJhbWV0ZXJOYW1lKHBhcmFtZXRlcnNbal0sIGV4aXN0aW5nUGFyYW1OYW1lcyksIHBhcmFtZXRlckVsZW1lbnQpOwotCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRQYXJhbWV0ZXJOYW1lKENsYXNzIHR5cGUsIExpc3QgZXhpc3RpbmdQYXJhbU5hbWVzKSB7Ci0gICAgICAgIFN0cmluZyBwYXJhbU5hbWUgPSBudWxsOwotICAgICAgICBpZiAodHlwZS5pc0FycmF5KCkpIHsKLSAgICAgICAgICAgIHBhcmFtTmFtZSA9IGdldFBhcmFtZXRlck5hbWUodHlwZS5nZXRDb21wb25lbnRUeXBlKCksIGV4aXN0aW5nUGFyYW1OYW1lcyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gdHlwZS5nZXROYW1lKCk7Ci0gICAgICAgICAgICBpZiAoY2xhc3NOYW1lLmxhc3RJbmRleE9mKCIuIikgPiAwKSB7Ci0gICAgICAgICAgICAgICAgY2xhc3NOYW1lID0gY2xhc3NOYW1lLnN1YnN0cmluZyhjbGFzc05hbWUubGFzdEluZGV4T2YoIi4iKSArIDEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcGFyYW1OYW1lID0gSmF2YVV0aWxzLnhtbE5hbWVUb0phdmFJZGVudGlmaWVyKGNsYXNzTmFtZSk7Ci0gICAgICAgICAgICBpZiAoZXhpc3RpbmdQYXJhbU5hbWVzLmNvbnRhaW5zKHBhcmFtTmFtZSkpewotICAgICAgICAgICAgICAgcGFyYW1OYW1lID0gcGFyYW1OYW1lICsgZXhpc3RpbmdQYXJhbU5hbWVzLnNpemUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGV4aXN0aW5nUGFyYW1OYW1lcy5hZGQocGFyYW1OYW1lKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcGFyYW1OYW1lOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldFR5cGVOYW1lKENsYXNzIHR5cGUpewotICAgICAgICBTdHJpbmcgdHlwZU5hbWUgPSBudWxsOwotICAgICAgICBpZiAodHlwZS5pc0FycmF5KCkpewotICAgICAgICAgICAgdHlwZU5hbWUgPSBnZXRUeXBlTmFtZSh0eXBlLmdldENvbXBvbmVudFR5cGUoKSkgKyAiW10iOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdHlwZU5hbWUgPSB0eXBlLmdldE5hbWUoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHlwZU5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2VuZXJhdGVzIHRoZSBtb2RlbCBmb3IgdGhlIGNhbGxiYWNrcy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRG9jdW1lbnQgY3JlYXRlRE9NRG9jdW1lbnRGb3JFeGNlcHRpb24oKSB7Ci0gICAgICAgIERvY3VtZW50IGRvYyA9IGdldEVtcHR5RG9jdW1lbnQoKTsKLSAgICAgICAgRWxlbWVudCByb290RWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50KCJjYWxsYmFjayIpOwotCi0gICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJwYWNrYWdlIiwgY29kZUdlbkNvbmZpZ3VyYXRpb24uZ2V0UGFja2FnZU5hbWUoKSwgcm9vdEVsZW1lbnQpOwotICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAibmFtZSIsCi0gICAgICAgICAgICAgICAgbWFrZUphdmFDbGFzc05hbWUoYXhpc1NlcnZpY2UuZ2V0TmFtZSgpKSArIENBTExfQkFDS19IQU5ETEVSX1NVRkZJWCwKLSAgICAgICAgICAgICAgICByb290RWxlbWVudCk7Ci0KLSAgICAgICAgLy8gVE9ETyBKQVhSUEMgbWFwcGluZyBzdXBwb3J0IHNob3VsZCBiZSBjb25zaWRlcmVkIGhlcmUgPz8KLSAgICAgICAgdGhpcy5sb2FkT3BlcmF0aW9ucyhkb2MsIHJvb3RFbGVtZW50LCBudWxsKTsKLQotICAgICAgICBkb2MuYXBwZW5kQ2hpbGQocm9vdEVsZW1lbnQpOwotICAgICAgICByZXR1cm4gZG9jOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogV3JpdGVzIHRoZSBjYWxsYmFjayBoYW5kbGVycy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCB3cml0ZUNhbGxCYWNrSGFuZGxlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGNvZGVHZW5Db25maWd1cmF0aW9uLmlzQXN5bmNPbigpKSB7Ci0gICAgICAgICAgICBEb2N1bWVudCBpbnRlcmZhY2VNb2RlbCA9IGNyZWF0ZURPTURvY3VtZW50Rm9yQ2FsbGJhY2tIYW5kbGVyKCk7Ci0gICAgICAgICAgICBkZWJ1Z0xvZ0RvY3VtZW50KCJEb2N1bWVudCBmb3IgY2FsbGJhY2sgaGFuZGxlcjoiLCBpbnRlcmZhY2VNb2RlbCk7Ci0gICAgICAgICAgICBDYWxsYmFja0hhbmRsZXJXcml0ZXIgY2FsbGJhY2tXcml0ZXIgPQotICAgICAgICAgICAgICAgICAgICBuZXcgQ2FsbGJhY2tIYW5kbGVyV3JpdGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVHZW5Db25maWd1cmF0aW9uLmlzRmxhdHRlbkZpbGVzKCkgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0T3V0cHV0RGlyZWN0b3J5KGNvZGVHZW5Db25maWd1cmF0aW9uLmdldE91dHB1dExvY2F0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwpIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE91dHB1dERpcmVjdG9yeShjb2RlR2VuQ29uZmlndXJhdGlvbi5nZXRPdXRwdXRMb2NhdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlR2VuQ29uZmlndXJhdGlvbi5nZXRTb3VyY2VMb2NhdGlvbigpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlR2VuQ29uZmlndXJhdGlvbi5nZXRPdXRwdXRMYW5ndWFnZSgpKTsKLSAgICAgICAgICAgIGNhbGxiYWNrV3JpdGVyLnNldE92ZXJyaWRlKGNvZGVHZW5Db25maWd1cmF0aW9uLmlzT3ZlcnJpZGUoKSk7Ci0gICAgICAgICAgICB3cml0ZUZpbGUoaW50ZXJmYWNlTW9kZWwsIGNhbGxiYWNrV3JpdGVyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdlbmVyYXRlcyB0aGUgbW9kZWwgZm9yIHRoZSBjYWxsYmFja3MuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIERvY3VtZW50IGNyZWF0ZURPTURvY3VtZW50Rm9yQ2FsbGJhY2tIYW5kbGVyKCkgewotICAgICAgICBEb2N1bWVudCBkb2MgPSBnZXRFbXB0eURvY3VtZW50KCk7Ci0gICAgICAgIEVsZW1lbnQgcm9vdEVsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudCgiY2FsbGJhY2siKTsKLQotICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAicGFja2FnZSIsIGNvZGVHZW5Db25maWd1cmF0aW9uLmdldFBhY2thZ2VOYW1lKCksIHJvb3RFbGVtZW50KTsKLSAgICAgICAgaWYgKGNvZGVHZW5Db25maWd1cmF0aW9uLmlzUGFja0NsYXNzZXMoKSAmJiB0aGlzLmF4aXNTZXJ2aWNlLmdldEVuZHBvaW50cygpLnNpemUoKSA+IDEpIHsKLSAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJuYW1lIiwKLSAgICAgICAgICAgICAgICAgICAgbWFrZUphdmFDbGFzc05hbWUoYXhpc1NlcnZpY2UuZ2V0TmFtZSgpICsgYXhpc1NlcnZpY2UuZ2V0RW5kcG9pbnROYW1lKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBDQUxMX0JBQ0tfSEFORExFUl9TVUZGSVgsIHJvb3RFbGVtZW50KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJuYW1lIiwKLSAgICAgICAgICAgICAgICAgICAgbWFrZUphdmFDbGFzc05hbWUoYXhpc1NlcnZpY2UuZ2V0TmFtZSgpKSArIENBTExfQkFDS19IQU5ETEVSX1NVRkZJWCwKLSAgICAgICAgICAgICAgICAgICAgcm9vdEVsZW1lbnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVE9ETyBKQVhSUEMgbWFwcGluZyBzdXBwb3J0IHNob3VsZCBiZSBjb25zaWRlcmVkIGhlcmUgPz8KLSAgICAgICAgdGhpcy5sb2FkT3BlcmF0aW9ucyhkb2MsIHJvb3RFbGVtZW50LCBudWxsKTsKLQotICAgICAgICBkb2MuYXBwZW5kQ2hpbGQocm9vdEVsZW1lbnQpOwotICAgICAgICByZXR1cm4gZG9jOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdyaXRlcyB0aGUgaW50ZXJmYWNlcy4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgd3JpdGVJbnRlcmZhY2UoYm9vbGVhbiB3cml0ZURhdGFiaW5kZXJzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgRG9jdW1lbnQgaW50ZXJmYWNlTW9kZWwgPSBjcmVhdGVET01Eb2N1bWVudEZvckludGVyZmFjZSh3cml0ZURhdGFiaW5kZXJzKTsKLSAgICAgICAgZGVidWdMb2dEb2N1bWVudCgiRG9jdW1lbnQgZm9yIGludGVyZmFjZToiLCBpbnRlcmZhY2VNb2RlbCk7Ci0gICAgICAgIEludGVyZmFjZVdyaXRlciBpbnRlcmZhY2VXcml0ZXIgPQotICAgICAgICAgICAgICAgIG5ldyBJbnRlcmZhY2VXcml0ZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlR2VuQ29uZmlndXJhdGlvbi5pc0ZsYXR0ZW5GaWxlcygpID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0T3V0cHV0RGlyZWN0b3J5KGNvZGVHZW5Db25maWd1cmF0aW9uLmdldE91dHB1dExvY2F0aW9uKCksIG51bGwpIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0T3V0cHV0RGlyZWN0b3J5KGNvZGVHZW5Db25maWd1cmF0aW9uLmdldE91dHB1dExvY2F0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZUdlbkNvbmZpZ3VyYXRpb24uZ2V0U291cmNlTG9jYXRpb24oKSksCi0gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvZGVHZW5Db25maWd1cmF0aW9uLmdldE91dHB1dExhbmd1YWdlKCkpOwotICAgICAgICBpbnRlcmZhY2VXcml0ZXIuc2V0T3ZlcnJpZGUoY29kZUdlbkNvbmZpZ3VyYXRpb24uaXNPdmVycmlkZSgpKTsKLSAgICAgICAgd3JpdGVGaWxlKGludGVyZmFjZU1vZGVsLCBpbnRlcmZhY2VXcml0ZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIERPTSB0cmVlIGZvciB0aGUgaW50ZXJmYWNlIGNyZWF0aW9uLiBVc2VzIHRoZSBpbnRlcmZhY2UuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIERvY3VtZW50IGNyZWF0ZURPTURvY3VtZW50Rm9ySW50ZXJmYWNlKGJvb2xlYW4gd3JpdGVEYXRhYmluZGVycykgewotICAgICAgICBEb2N1bWVudCBkb2MgPSBnZXRFbXB0eURvY3VtZW50KCk7Ci0gICAgICAgIEVsZW1lbnQgcm9vdEVsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudCgiaW50ZXJmYWNlIik7Ci0gICAgICAgIFN0cmluZyBsb2NhbFBhcnQgPSBudWxsOwotICAgICAgICBpZiAodGhpcy5jb2RlR2VuQ29uZmlndXJhdGlvbi5pc0JhY2t3b3JkQ29tcGF0aWJpbGl0eU1vZGUoKSkgewotICAgICAgICAgICAgbG9jYWxQYXJ0ID0KLSAgICAgICAgICAgICAgICAgICAgbWFrZUphdmFDbGFzc05hbWUoYXhpc1NlcnZpY2UuZ2V0RW5kcG9pbnROYW1lKCkgKyBTVFVCX0lOVEVSRkFDRV9TVUZGSVhfQkFDSyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAodGhpcy5heGlzU2VydmljZS5nZXRFbmRwb2ludHMoKS5zaXplKCkgPiAxKSB7Ci0gICAgICAgICAgICAgICAgbG9jYWxQYXJ0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VKYXZhQ2xhc3NOYW1lKGF4aXNTZXJ2aWNlLmdldE5hbWUoKSArIGF4aXNTZXJ2aWNlLmdldEVuZHBvaW50TmFtZSgpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbG9jYWxQYXJ0ID0gbWFrZUphdmFDbGFzc05hbWUoYXhpc1NlcnZpY2UuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJwYWNrYWdlIiwgY29kZUdlbkNvbmZpZ3VyYXRpb24uZ2V0UGFja2FnZU5hbWUoKSwgcm9vdEVsZW1lbnQpOwotICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAibmFtZSIsIGxvY2FsUGFydCwgcm9vdEVsZW1lbnQpOwotCi0gICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJjYWxsYmFja25hbWUiLAotICAgICAgICAgICAgICAgIG1ha2VKYXZhQ2xhc3NOYW1lKGF4aXNTZXJ2aWNlLmdldE5hbWUoKSkgKyBDQUxMX0JBQ0tfSEFORExFUl9TVUZGSVgsCi0gICAgICAgICAgICAgICAgcm9vdEVsZW1lbnQpOwotCi0gICAgICAgIC8vYWRkIGJhY2t3b3JkY29tcGF0aWJpbGl0eSBhdHRyaWJ1dGUKLSAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgImlzYmFja2NvbXBhdGlibGUiLAotICAgICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKGNvZGVHZW5Db25maWd1cmF0aW9uLmlzQmFja3dvcmRDb21wYXRpYmlsaXR5TW9kZSgpKSwKLSAgICAgICAgICAgICAgICByb290RWxlbWVudCk7Ci0gICAgICAgIGZpbGxTeW5jQXR0cmlidXRlcyhkb2MsIHJvb3RFbGVtZW50KTsKLSAgICAgICAgbG9hZE9wZXJhdGlvbnMoZG9jLCByb290RWxlbWVudCwgbnVsbCk7Ci0KLSAgICAgICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotICAgICAgICAvLyB0aGlzIGJsb2NrIG9mIGNvZGUgc3BlY2lmaWNhbGx5IGFwcGxpZXMgdG8gdGhlIGludGVncmF0aW9uIG9mIGRhdGFiaW5kaW5nIGNvZGUgaW50byB0aGUKLSAgICAgICAgLy8gZ2VuZXJhdGVkIGNsYXNzZXMgdGlnaHRseSAocHJvYmFibHkgYXMgaW5uZXIgY2xhc3NlcykKLSAgICAgICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotICAgICAgICAvLyBjaGVjayBmb3IgdGhlIHNwZWNpYWwgbW9kZWxzIGluIHRoZSBtYXBwZXIgYW5kIGlmIHRoZXkgYXJlIHByZXNlbnQgcHJvY2VzcyB0aGVtCi0gICAgICAgIGlmICh3cml0ZURhdGFiaW5kZXJzKSB7Ci0gICAgICAgICAgICBpZiAobWFwcGVyLmlzT2JqZWN0TWFwcGluZ1ByZXNlbnQoKSkgewotCi0gICAgICAgICAgICAgICAgLy8gYWRkIGFuIGF0dHJpYnV0ZSB0byB0aGUgcm9vdCBlbGVtZW50IHNob3dpbmcgdGhhdCB0aGUgd3JpdGluZyBoYXMgYmVlbiBza2lwcGVkCi0gICAgICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgInNraXAtd3JpdGUiLCAieWVzIiwgcm9vdEVsZW1lbnQpOwotCi0gICAgICAgICAgICAgICAgLy8gcHJvY2VzcyB0aGUgbWFwcGVyIG9iamVjdHMKLSAgICAgICAgICAgICAgICBwcm9jZXNzTW9kZWxPYmplY3RzKG1hcHBlci5nZXRBbGxNYXBwZWRPYmplY3RzKCksIHJvb3RFbGVtZW50LCBkb2MpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0gICAgICAgIGRvYy5hcHBlbmRDaGlsZChyb290RWxlbWVudCk7Ci0KLSAgICAgICAgcmV0dXJuIGRvYzsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFVwZGF0ZSBtYXBwZXIgZm9yIG1lc3NhZ2UgcmVjZWl2ZXIKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVNYXBwZXJGb3JNZXNzYWdlUmVjZWl2ZXIoKSB7Ci0gICAgICAgIHVwZGF0ZU1hcHBlckNsYXNzbmFtZXMoZ2V0RnVsbHlRdWFsaWZpZWRNZXNzYWdlUmVjZWl2ZXJOYW1lKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gZnVsbHkgcXVhbGlmaWVkIE1SIG5hbWUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkTWVzc2FnZVJlY2VpdmVyTmFtZSgpIHsKLSAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gY29kZUdlbkNvbmZpZ3VyYXRpb24uZ2V0UGFja2FnZU5hbWUoKTsKLSAgICAgICAgU3RyaW5nIGxvY2FsUGFydCA9IG1ha2VKYXZhQ2xhc3NOYW1lKGF4aXNTZXJ2aWNlLmdldE5hbWUoKSk7Ci0gICAgICAgIHJldHVybiBwYWNrYWdlTmFtZSArICIuIiArIGxvY2FsUGFydCArIE1FU1NBR0VfUkVDRUlWRVJfU1VGRklYOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gZnVsbHkgcXVhbGlmaWVkIHNrZWxldG9uIG5hbWUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkU2tlbGV0b25OYW1lKCkgewotICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSBjb2RlR2VuQ29uZmlndXJhdGlvbi5nZXRQYWNrYWdlTmFtZSgpOwotICAgICAgICBTdHJpbmcgbG9jYWxQYXJ0ID0gbWFrZUphdmFDbGFzc05hbWUoYXhpc1NlcnZpY2UuZ2V0TmFtZSgpKTsKLSAgICAgICAgU3RyaW5nIHNrZWx0b25OYW1lOwotICAgICAgICBpZiAodGhpcy5jb2RlR2VuQ29uZmlndXJhdGlvbi5pc0JhY2t3b3JkQ29tcGF0aWJpbGl0eU1vZGUoKSkgewotICAgICAgICAgICAgc2tlbHRvbk5hbWUgPSBwYWNrYWdlTmFtZSArICIuIiArIG1ha2VKYXZhQ2xhc3NOYW1lKGF4aXNTZXJ2aWNlLmdldEJpbmRpbmdOYW1lKCkpICsKLSAgICAgICAgICAgICAgICAgICAgU0tFTEVUT05fQ0xBU1NfU1VGRklYX0JBQ0s7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBza2VsdG9uTmFtZSA9IHBhY2thZ2VOYW1lICsgIi4iICsgbG9jYWxQYXJ0ICsgU0tFTEVUT05fQ0xBU1NfU1VGRklYOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBza2VsdG9uTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIGZ1bGx5IHF1YWxpZmllZCBza2VsZXRvbiBpbnRlcmZhY2UgbmFtZQotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWRTa2VsZXRvbkludGVyZmFjZU5hbWUoKSB7Ci0gICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9IGNvZGVHZW5Db25maWd1cmF0aW9uLmdldFBhY2thZ2VOYW1lKCk7Ci0gICAgICAgIFN0cmluZyBsb2NhbFBhcnQgPSBtYWtlSmF2YUNsYXNzTmFtZShheGlzU2VydmljZS5nZXROYW1lKCkpOwotICAgICAgICBTdHJpbmcgc2tlbHRvbkludGVyZmFjZU5hbWU7Ci0gICAgICAgIGlmICh0aGlzLmNvZGVHZW5Db25maWd1cmF0aW9uLmlzQmFja3dvcmRDb21wYXRpYmlsaXR5TW9kZSgpKSB7Ci0gICAgICAgICAgICBza2VsdG9uSW50ZXJmYWNlTmFtZSA9IHBhY2thZ2VOYW1lICsgIi4iICsKLSAgICAgICAgICAgICAgICAgICAgbWFrZUphdmFDbGFzc05hbWUoYXhpc1NlcnZpY2UuZ2V0RW5kcG9pbnROYW1lKCkpICsKLSAgICAgICAgICAgICAgICAgICAgU0tFTEVUT05fSU5URVJGQUNFX1NVRkZJWF9CQUNLOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc2tlbHRvbkludGVyZmFjZU5hbWUgPSBwYWNrYWdlTmFtZSArICIuIiArIGxvY2FsUGFydCArIFNLRUxFVE9OX0lOVEVSRkFDRV9TVUZGSVg7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNrZWx0b25JbnRlcmZhY2VOYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEVtaXRzIHRoZSBza2VsZXRvbgotICAgICAqCi0gICAgICogQHRocm93cyBDb2RlR2VuZXJhdGlvbkV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGVtaXRTa2VsZXRvbigpIHRocm93cyBDb2RlR2VuZXJhdGlvbkV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgdHJ5IHsKLQotICAgICAgICAgICAgYWxsU2VydmljZUluZm9Ib2xkZXIgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICAgICAgTWFwIG9yaWdpbmFsTWFwID0gZ2V0TmV3Q29weSh0aGlzLm1hcHBlci5nZXRBbGxNYXBwZWROYW1lcygpKTsKLSAgICAgICAgICAgIC8vIHdlIGFyZSBnb2luZyB0byBnZW5lcmF0ZSBmb2xsb3dpbmcgZmlsZXMgc2VwZXJhdGVseSBwZXIgc2VydmljZQotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBheGlzU2VydmljZXNJdGVyID0gdGhpcy5heGlzU2VydmljZXMuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICAgYXhpc1NlcnZpY2VzSXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgLy8gY3JlYXRlIGEgbmV3IGhhc2ggbWFwIGZvciBlYWNoIHNlcnZpY2UKLSAgICAgICAgICAgICAgICB0aGlzLmluZm9Ib2xkZXIgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICAgICAgICAgIHRoaXMuYXhpc1NlcnZpY2UgPSAoQXhpc1NlcnZpY2UpIGF4aXNTZXJ2aWNlc0l0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgIHRoaXMuYXhpc0JpbmRpbmcgPQotICAgICAgICAgICAgICAgICAgICAgICAgYXhpc1NlcnZpY2UuZ2V0RW5kcG9pbnQoYXhpc1NlcnZpY2UuZ2V0RW5kcG9pbnROYW1lKCkpLmdldEJpbmRpbmcoKTsKLQotICAgICAgICAgICAgICAgIC8vIHNlZSB0aGUgY29tbWVudCBhdCB1cGRhdGVNYXBwZXJDbGFzc25hbWVzIGZvciBkZXRhaWxzIGFuZCByZWFzb25zIGZvcgotICAgICAgICAgICAgICAgIC8vIGNhbGxpbmcgdGhpcyBtZXRob2QKLSAgICAgICAgICAgICAgICBpZiAobWFwcGVyLmlzT2JqZWN0TWFwcGluZ1ByZXNlbnQoKSkgewotICAgICAgICAgICAgICAgICAgICBjb3B5TWFwKG9yaWdpbmFsTWFwLCB0aGlzLm1hcHBlci5nZXRBbGxNYXBwZWROYW1lcygpKTsKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlTWFwcGVyRm9yTWVzc2FnZVJlY2VpdmVyKCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgY29weVRvRmF1bHRNYXAoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvL2hhbmRsZSBmYXVsdHMKLSAgICAgICAgICAgICAgICBnZW5lcmF0ZUFuZFBvcHVsYXRlRmF1bHROYW1lcygpOwotCi0gICAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgICAgICBpZiAoY29kZUdlbkNvbmZpZ3VyYXRpb24uaXNTZXJ2ZXJTaWRlSW50ZXJmYWNlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy93cml0ZSBza2VsZXRvbkludGVyZmFjZQotICAgICAgICAgICAgICAgICAgICB3cml0ZVNrZWxldG9uSW50ZXJmYWNlKCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gd3JpdGUgc2tlbGV0b24gb25seSBpZiB0aGUgdXNlZCBoYXMKLSAgICAgICAgICAgICAgICAvLyBhc2tlZCBmb3IgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBpbiB0aGUgaW50ZXJmYWNlIG1vZGUKLSAgICAgICAgICAgICAgICAvLyBlbHNlIHdyaXRlIGl0IGFueXdheSA6KQotICAgICAgICAgICAgICAgIGlmIChjb2RlR2VuQ29uZmlndXJhdGlvbi5pc1NlcnZlclNpZGVJbnRlcmZhY2UoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoY29kZUdlbkNvbmZpZ3VyYXRpb24uaXNHZW5lcmF0ZURlcGxveWVtZW50RGVzY3JpcHRvcigpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3cml0ZVNrZWxldG9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB3cml0ZVNrZWxldG9uKCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKCFjb2RlR2VuQ29uZmlndXJhdGlvbi5pc1NraXBNZXNzYWdlUmVjZWl2ZXIoKSkgewotICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZSBhIE1lc3NhZ2VSZWNlaXZlciBmb3IgdGhpcyBwYXJ0aWN1bGFyIHNlcnZpY2UuCi0gICAgICAgICAgICAgICAgICAgIHdyaXRlTWVzc2FnZVJlY2VpdmVyKCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gd3JpdGUgdGhlIEV4Y2VwdGlvbnMKLSAgICAgICAgICAgICAgICB3cml0ZUV4Y2VwdGlvbnMoKTsKLQotICAgICAgICAgICAgICAgIGlmICghY29kZUdlbkNvbmZpZ3VyYXRpb24uaXNTa2lwV3JpdGVXU0RMcygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vZm9yIHRoZSBzZXJ2ZXIgc2lkZSBjb2RlZ2VuCi0gICAgICAgICAgICAgICAgICAgIC8vd2UgbmVlZCB0byBzZXJpYWxpemUgdGhlIFdTREwncwotICAgICAgICAgICAgICAgICAgICB3cml0ZVdTRExGaWxlcygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBzYXZlIHRoZSBpbmZvIGhvbGRlciB3aXRoIHRoZSBzZXJ2aWNlCi0gICAgICAgICAgICAgICAgYWxsU2VydmljZUluZm9Ib2xkZXIucHV0KHRoaXMuYXhpc1NlcnZpY2UuZ2V0TmFtZSgpLHRoaXMuaW5mb0hvbGRlcik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHNhdmUgYmFjayB0eXBlIG1hcAotICAgICAgICAgICAgaWYgKHRoaXMubWFwcGVyLmlzT2JqZWN0TWFwcGluZ1ByZXNlbnQoKSkgewotICAgICAgICAgICAgICAgIGNvcHlNYXAob3JpZ2luYWxNYXAsIHRoaXMubWFwcGVyLmdldEFsbE1hcHBlZE5hbWVzKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyB3cml0ZSBzZXJ2aWNlIHhtbAotICAgICAgICAgICAgLy8gaWYgYXNrZWQKLSAgICAgICAgICAgIGlmIChjb2RlR2VuQ29uZmlndXJhdGlvbi5pc0dlbmVyYXRlRGVwbG95ZW1lbnREZXNjcmlwdG9yKCkpIHsKLSAgICAgICAgICAgICAgICB3cml0ZVNlcnZpY2VYbWwoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFjb2RlR2VuQ29uZmlndXJhdGlvbi5pc1NraXBCdWlsZFhNTCgpKSB7Ci0gICAgICAgICAgICAgICAgLy93cml0ZSB0aGUgYW50IGJ1aWxkCi0gICAgICAgICAgICAgICAgLy93ZSBza2lwIHRoaXMgZm9yIHRoZSBmbGF0dGVuZWQgY2FzZQotICAgICAgICAgICAgICAgIGlmICghY29kZUdlbkNvbmZpZ3VyYXRpb24uaXNGbGF0dGVuRmlsZXMoKSkgewotICAgICAgICAgICAgICAgICAgICB3cml0ZUFudEJ1aWxkKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0KLSAgICAgICAgfSBjYXRjaCAoQ29kZUdlbmVyYXRpb25FeGNlcHRpb24gY2dFeHApIHsKLSAgICAgICAgICAgIHRocm93IGNnRXhwOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENvZGVHZW5lcmF0aW9uRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV3JpdGUgb3V0IHRoZSBXU0RMIGZpbGVzIChhbmQgdGhlIHNjaGVtYXMpIHdyaXRpbmcgdGhlIFdTREwgKGFuZCBzY2hlbWFzKSBpcyBzb21ld2hhdCBzcGVjaWFsCi0gICAgICogc28gd2UgY2Fubm90IGZvbGxvdyB0aGUgdXN1YWwgcGF0dGVybiBvZiB1c2luZyB0aGUgY2xhc3Mgd3JpdGVyCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgd3JpdGVXU0RMRmlsZXMoKSB7Ci0KLSAgICAgICAgLy9maXJzdCBtb2RpZnkgdGhlIHNjaGVtYSBuYW1lcyAoYW5kIGxvY2F0aW9ucykgc28gdGhhdAotICAgICAgICAvL3RoZXkgaGF2ZSB1bmlxdWUgKGZsYXR0ZW5lZCkgbmFtZXMgYW5kIHRoZSBzY2hlbWEgbG9jYXRpb25zCi0gICAgICAgIC8vYXJlIGFkanVzdGVkIHRvIHN1aXQgaXQKLSAgICAgICAgYXhpc1NlcnZpY2Uuc2V0Q3VzdG9tU2NoZW1hTmFtZVByZWZpeCgiIik7Ly9wcmVmaXggd2l0aCBub3RoaW5nCi0gICAgICAgIGF4aXNTZXJ2aWNlLnNldEN1c3RvbVNjaGVtYU5hbWVTdWZmaXgoIi54c2QiKTsvL3N1ZmZpeCB3aXRoIC54c2QgLSB0aGUgZmlsZSBuYW1lIGV4dGVuc2lvbgotICAgICAgICAvL2ZvcmNlIHRoZSBtYXBwaW5ncyB0byBiZSByZWNvbnN0cnVjdGVkCi0gICAgICAgIGF4aXNTZXJ2aWNlLnNldFNjaGVtYUxvY2F0aW9uc0FkanVzdGVkKGZhbHNlKTsKLSAgICAgICAgLy93aGVuIGdlbmVyYXRpbmcgdGhlIGNvZGUgd2Ugc2hvdWxkIGNvcHkgYWxsIHRoZSBzY2hlbWFzIHRvCi0gICAgICAgIC8vIHJlc291cmNlIGZvbGRlci4KLSAgICAgICAgTWFwIGNoYW5nZWRNYXAgPSBheGlzU2VydmljZS5wb3B1bGF0ZVNjaGVtYU1hcHBpbmdzKHRoaXMuY29kZUdlbkNvbmZpZ3VyYXRpb24uaXNPdmVycmlkZUFic29sdXRlQWRkcmVzcygpKTsKLQotICAgICAgICAvLyBhZGQgdGhlc2UgdHdvIGF0dHJpYnV0ZSB0byB1c2UgdGhlIHVzZXIgZGVmaW5lZCB3c2RsIHRvIHVzZS4KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGF4aXNTZXJ2aWNlLmFkZFBhcmFtZXRlcihuZXcgUGFyYW1ldGVyKCJ1c2VPcmlnaW5hbHdzZGwiLCAidHJ1ZSIpKTsKLSAgICAgICAgICAgIGF4aXNTZXJ2aWNlLmFkZFBhcmFtZXRlcihuZXcgUGFyYW1ldGVyKCJtb2RpZnlVc2VyV1NETFBvcnRBZGRyZXNzIiwgImZhbHNlIikpOwotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgYXhpc0ZhdWx0KSB7Ci0gICAgICAgICAgICAvLyB0aGVyZSBpcyBubyB3YXkgdG8gZ2V0IHRoaXMgZXhjcGV0aW9uIHdoaWxlIGluIGNvZGVnZW5lcmF0aW9uCi0gICAgICAgIH0KLQotICAgICAgICAvL25vdyBnZXQgdGhlIHNjaGVtYSBsaXN0IGFuZCB3cml0ZSBpdCBvdXQKLSAgICAgICAgU2NoZW1hV3JpdGVyIHNjaGVtYVdyaXRlciA9IG5ldyBTY2hlbWFXcml0ZXIoCi0gICAgICAgICAgICAgICAgY29kZUdlbkNvbmZpZ3VyYXRpb24uaXNGbGF0dGVuRmlsZXMoKSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICBnZXRPdXRwdXREaXJlY3RvcnkoY29kZUdlbkNvbmZpZ3VyYXRpb24uZ2V0T3V0cHV0TG9jYXRpb24oKSwgbnVsbCkgOgotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0T3V0cHV0RGlyZWN0b3J5KGNvZGVHZW5Db25maWd1cmF0aW9uLmdldE91dHB1dExvY2F0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVHZW5Db25maWd1cmF0aW9uLmdldFJlc291cmNlTG9jYXRpb24oKSkpOwotCi0gICAgICAgIC8vIGZpcnN0IHdyaXRlIGFsbCB0aGUgc2NobWFzLgotICAgICAgICAvLyB0aGVuIHVzZSB0aGUgY2hhbmdlZE1hcCBnb3QgYWJvdmUgdG8gYWRqdXN0IHRoZSBuYW1lcy4KLSAgICAgICAgTWFwIHNjaGVtYU1hcHBpbmdzID0gYXhpc1NlcnZpY2UuZ2V0U2NoZW1hTWFwcGluZ1RhYmxlKCk7Ci0gICAgICAgIEl0ZXJhdG9yIGtleXMgPSBzY2hlbWFNYXBwaW5ncy5rZXlTZXQoKS5pdGVyYXRvcigpOwotICAgICAgICBTdHJpbmcga2V5ID0gbnVsbDsKLSAgICAgICAgd2hpbGUgKGtleXMuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBrZXkgPSAoU3RyaW5nKSBrZXlzLm5leHQoKTsKLSAgICAgICAgICAgIGlmICgha2V5LnN0YXJ0c1dpdGgoImh0dHAiKSl7Ci0gICAgICAgICAgICAgICBzY2hlbWFXcml0ZXIud3JpdGVTY2hlbWEoKFhtbFNjaGVtYSkgc2NoZW1hTWFwcGluZ3MuZ2V0KGtleSksIGtleSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvL3N3aXRjaCBiZXR3ZWVuIHRoZSBjb3JyZWN0IHdyaXRlcgotICAgICAgICBpZiAoQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLldTRExfVkVSU0lPTl8yLgotICAgICAgICAgICAgICAgIGVxdWFscyhjb2RlR2VuQ29uZmlndXJhdGlvbi5nZXRXU0RMVmVyc2lvbigpKSkgewotICAgICAgICAgICAgLy8gV29kZW4gY2Fubm90IHNlcmlhbGl6ZSB0aGUgV1NETCBhcyB5ZXQsIHNvIGxldHMgc2VyaWFsaXplIHRoZSBheGlzU2VydmljZSBmb3Igbm93LgotCi0gICAgICAgICAgICBXU0RMMjBXcml0ZXIgd3NkbDIwV3JpdGVyID0gbmV3IFdTREwyMFdyaXRlcigKLSAgICAgICAgICAgICAgICAgICAgY29kZUdlbkNvbmZpZ3VyYXRpb24uaXNGbGF0dGVuRmlsZXMoKSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0T3V0cHV0RGlyZWN0b3J5KGNvZGVHZW5Db25maWd1cmF0aW9uLmdldE91dHB1dExvY2F0aW9uKCksIG51bGwpIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRPdXRwdXREaXJlY3RvcnkoY29kZUdlbkNvbmZpZ3VyYXRpb24uZ2V0T3V0cHV0TG9jYXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVHZW5Db25maWd1cmF0aW9uLmdldFJlc291cmNlTG9jYXRpb24oKSkpOwotICAgICAgICAgICAgd3NkbDIwV3JpdGVyLndyaXRlV1NETChheGlzU2VydmljZSk7Ci0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIGhlcmUgd2UgYXJlIGdvaW5nIHRvIHdyaXRlIHRoZSB3c2RsIGFuZCBpdHMgaW1wb3J0cwotICAgICAgICAgICAgLy8gd2l0aCBvdXQgdXNpbmcgdGhlIGF4aXMgc2VydmljZS4KLQotICAgICAgICAgICAgV1NETDExV3JpdGVyIHdzZGwxMVdyaXRlciA9IG5ldyBXU0RMMTFXcml0ZXIoCi0gICAgICAgICAgICAgICAgICAgIGNvZGVHZW5Db25maWd1cmF0aW9uLmlzRmxhdHRlbkZpbGVzKCkgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE91dHB1dERpcmVjdG9yeShjb2RlR2VuQ29uZmlndXJhdGlvbi5nZXRPdXRwdXRMb2NhdGlvbigpLCBudWxsKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0T3V0cHV0RGlyZWN0b3J5KGNvZGVHZW5Db25maWd1cmF0aW9uLmdldE91dHB1dExvY2F0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlR2VuQ29uZmlndXJhdGlvbi5nZXRSZXNvdXJjZUxvY2F0aW9uKCkpKTsKLSAgICAgICAgICAgIHdzZGwxMVdyaXRlci53cml0ZVdTREwoYXhpc1NlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgIGNvZGVHZW5Db25maWd1cmF0aW9uLmdldFdzZGxEZWZpbml0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgIGNoYW5nZWRNYXApOwotCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVdGlsaXR5IG1ldGhvZCB0byBjb3B5IHRoZSBmYXVsdHMgdG8gdGhlIGNvcnJlY3QgbWFwCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgY29weVRvRmF1bHRNYXAoKSB7Ci0gICAgICAgIE1hcCBjbGFzc05hbWVNYXAgPSBtYXBwZXIuZ2V0QWxsTWFwcGVkTmFtZXMoKTsKLSAgICAgICAgSXRlcmF0b3Iga2V5cyA9IGNsYXNzTmFtZU1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoa2V5cy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIE9iamVjdCBrZXkgPSBrZXlzLm5leHQoKTsKLSAgICAgICAgICAgIGluc3RhbnRpYXRhYmxlTWVzc2FnZUNsYXNzTmFtZXMucHV0KGtleSwKLSAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lTWFwLmdldChrZXkpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoYW5nZSB0aGUgZmF1bHQgY2xhc3NuYW1lcyB0byBnbyB3aXRoIHRoZSBwYWNrYWdlIGFuZCBzdHViCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlRmF1bHRQYWNrYWdlRm9yU3R1YigpIHsKLSAgICAgICAgSXRlcmF0b3IgZmF1bHRDbGFzc05hbWVLZXlzID0gZnVsbHlRdWFsaWZpZWRGYXVsdENsYXNzTmFtZU1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoZmF1bHRDbGFzc05hbWVLZXlzLmhhc05leHQoKSkgewotICAgICAgICAgICAgT2JqZWN0IGtleSA9IGZhdWx0Q2xhc3NOYW1lS2V5cy5uZXh0KCk7Ci0gICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gKFN0cmluZykgZnVsbHlRdWFsaWZpZWRGYXVsdENsYXNzTmFtZU1hcC5nZXQoa2V5KTsKLSAgICAgICAgICAgIC8vYXBwZW5kIHRoZSBza2VsdG9uIG5hbWUKLSAgICAgICAgICAgIFN0cmluZyBmdWxseVF1YWxpZmllZFN0dWJOYW1lID0gZ2V0RnVsbHlRdWFsaWZpZWRTdHViTmFtZSgpOwotICAgICAgICAgICAgZnVsbHlRdWFsaWZpZWRGYXVsdENsYXNzTmFtZU1hcC5wdXQoa2V5LCBjb2RlR2VuQ29uZmlndXJhdGlvbi5nZXRQYWNrYWdlTmFtZSgpICsgIi4iCi0gICAgICAgICAgICAgICAgICAgICsgY2xhc3NOYW1lKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdyaXRlcyB0aGUgbWVzc2FnZSByZWNlaXZlcgotICAgICAqCi0gICAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCB3cml0ZU1lc3NhZ2VSZWNlaXZlcigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvL2xvb3AgdGhyb3VnaCB0aGUgbWVwcyBhbmQgZ2VuZXJhdGUgY29kZSBmb3IgZWFjaCBtZXAKLSAgICAgICAgSXRlcmF0b3IgaXQgPSBtZXBUb0NsYXNzTWFwLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIFN0cmluZyBtZXAgPSAoU3RyaW5nKSBpdC5uZXh0KCk7Ci0gICAgICAgICAgICBEb2N1bWVudCBjbGFzc01vZGVsID0gY3JlYXRlRG9jdW1lbnRGb3JNZXNzYWdlUmVjZWl2ZXIoCi0gICAgICAgICAgICAgICAgICAgIG1lcCwKLSAgICAgICAgICAgICAgICAgICAgY29kZUdlbkNvbmZpZ3VyYXRpb24uaXNTZXJ2ZXJTaWRlSW50ZXJmYWNlKCkpOwotICAgICAgICAgICAgZGVidWdMb2dEb2N1bWVudCgiRG9jdW1lbnQgZm9yIG1lc3NhZ2UgcmVjZWl2ZXIgKG1lcD0iICsgbWVwICsKLSAgICAgICAgICAgICAgICAgICAgIik6IiwgY2xhc3NNb2RlbCk7Ci0gICAgICAgICAgICAvL3dyaXRlIHRoZSBjbGFzcyBvbmx5IGlmIGFueSBtZXRob2RzIGFyZSBmb3VuZAotICAgICAgICAgICAgaWYgKEJvb2xlYW4uVFJVRS5lcXVhbHMoaW5mb0hvbGRlci5nZXQobWVwKSkpIHsKLSAgICAgICAgICAgICAgICBNZXNzYWdlUmVjZWl2ZXJXcml0ZXIgd3JpdGVyID0KLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBNZXNzYWdlUmVjZWl2ZXJXcml0ZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVHZW5Db25maWd1cmF0aW9uLmlzRmxhdHRlbkZpbGVzKCkgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE91dHB1dERpcmVjdG9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVHZW5Db25maWd1cmF0aW9uLmdldE91dHB1dExvY2F0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0T3V0cHV0RGlyZWN0b3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZUdlbkNvbmZpZ3VyYXRpb24uZ2V0T3V0cHV0TG9jYXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVHZW5Db25maWd1cmF0aW9uLmdldFNvdXJjZUxvY2F0aW9uKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlR2VuQ29uZmlndXJhdGlvbi5nZXRPdXRwdXRMYW5ndWFnZSgpKTsKLSAgICAgICAgICAgICAgICB3cml0ZXIuc2V0T3ZlcnJpZGUoY29kZUdlbkNvbmZpZ3VyYXRpb24uaXNPdmVycmlkZSgpKTsKLSAgICAgICAgICAgICAgICB3cml0ZUZpbGUoY2xhc3NNb2RlbCwgd3JpdGVyKTsKLQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgWE1MIG1vZGVsIGZvciB0aGUgbWVzc2FnZSByZWNlaXZlcgotICAgICAqCi0gICAgICogQHBhcmFtIG1lcAotICAgICAqIEBwYXJhbSBpc1NlcnZlclNpZGVJbnRlcmZhY2UKLSAgICAgKiBAcmV0dXJuIERPTSBEb2N1bWVudAotICAgICAqLwotICAgIHByb3RlY3RlZCBEb2N1bWVudCBjcmVhdGVEb2N1bWVudEZvck1lc3NhZ2VSZWNlaXZlcihTdHJpbmcgbWVwLCBib29sZWFuIGlzU2VydmVyU2lkZUludGVyZmFjZSkgewotCi0gICAgICAgIERvY3VtZW50IGRvYyA9IGdldEVtcHR5RG9jdW1lbnQoKTsKLSAgICAgICAgRWxlbWVudCByb290RWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50KCJpbnRlcmZhY2UiKTsKLQotICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAicGFja2FnZSIsIGNvZGVHZW5Db25maWd1cmF0aW9uLmdldFBhY2thZ2VOYW1lKCksIHJvb3RFbGVtZW50KTsKLQotICAgICAgICBTdHJpbmcgbG9jYWxQYXJ0ID0gbWFrZUphdmFDbGFzc05hbWUoYXhpc1NlcnZpY2UuZ2V0TmFtZSgpKTsKLQotICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAibmFtZSIsIGxvY2FsUGFydCArIG1lcFRvU3VmZml4TWFwLmdldChtZXApLCByb290RWxlbWVudCk7Ci0KLSAgICAgICAgLy8gaGVyZSBzZXQgdGhlIGlzTG93ZXJDYXNlTWV0aG9kTmFtZSB2YXJpYWJsZSB0byBoYXZlIHRoZSBuZWdhdGl2ZSBvbiB1c2VPcGVyYXRpb25OYW1lIHRvCi0gICAgICAgIC8vIG1ha2UgaXQgZWFzaWVyIHRvIGhhbmRsZSBpbiBNZXNzYWdlIHJlY2VpdmVyIHRlbXBsYXRlLgotICAgICAgICBpZiAoIXRoaXMuY29kZUdlbkNvbmZpZ3VyYXRpb24uaXNVc2VPcGVyYXRpb25OYW1lKCkpIHsKLSAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJpc0xvd2VyQ2FzZU1ldGhvZE5hbWUiLCAidHJ1ZSIsIHJvb3RFbGVtZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vYWRkIGJhY2t3b3JkY29tcGF0aWJpbGl0eSBhdHRyaWJ1dGUKLSAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgImlzYmFja2NvbXBhdGlibGUiLAotICAgICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKGNvZGVHZW5Db25maWd1cmF0aW9uLmlzQmFja3dvcmRDb21wYXRpYmlsaXR5TW9kZSgpKSwKLSAgICAgICAgICAgICAgICByb290RWxlbWVudCk7Ci0KLSAgICAgICAgaWYgKHRoaXMuY29kZUdlbkNvbmZpZ3VyYXRpb24uaXNCYWNrd29yZENvbXBhdGliaWxpdHlNb2RlKCkpIHsKLSAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJza2VsZXRvbm5hbWUiLAotICAgICAgICAgICAgICAgICAgICBtYWtlSmF2YUNsYXNzTmFtZShheGlzU2VydmljZS5nZXRCaW5kaW5nTmFtZSgpKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU0tFTEVUT05fQ0xBU1NfU1VGRklYX0JBQ0ssCi0gICAgICAgICAgICAgICAgICAgIHJvb3RFbGVtZW50KTsKLSAgICAgICAgICAgIGlmIChpc1NlcnZlclNpZGVJbnRlcmZhY2UpIHsKLSAgICAgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAic2tlbGV0b25JbnRlcmZhY2VOYW1lIiwgbWFrZUphdmFDbGFzc05hbWUoCi0gICAgICAgICAgICAgICAgICAgICAgICBheGlzU2VydmljZS5nZXRFbmRwb2ludE5hbWUoKSkgKyBTS0VMRVRPTl9JTlRFUkZBQ0VfU1VGRklYX0JBQ0ssCi0gICAgICAgICAgICAgICAgICAgICAgICByb290RWxlbWVudCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJza2VsZXRvbkludGVyZmFjZU5hbWUiLCBtYWtlSmF2YUNsYXNzTmFtZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlLmdldEJpbmRpbmdOYW1lKCkpICsgU0tFTEVUT05fQ0xBU1NfU1VGRklYX0JBQ0ssCi0gICAgICAgICAgICAgICAgICAgICAgICByb290RWxlbWVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAodGhpcy5jb2RlR2VuQ29uZmlndXJhdGlvbi5nZXRTa2VsdG9uQ2xhc3NOYW1lKCkgIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgInNrZWxldG9ubmFtZSIsIHRoaXMuY29kZUdlbkNvbmZpZ3VyYXRpb24uZ2V0U2tlbHRvbkNsYXNzTmFtZSgpLCByb290RWxlbWVudCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJza2VsZXRvbm5hbWUiLCBsb2NhbFBhcnQgKyBTS0VMRVRPTl9DTEFTU19TVUZGSVgsIHJvb3RFbGVtZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChpc1NlcnZlclNpZGVJbnRlcmZhY2UpIHsKLSAgICAgICAgICAgICAgICBpZiAodGhpcy5jb2RlR2VuQ29uZmlndXJhdGlvbi5nZXRTa2VsdG9uSW50ZXJmYWNlTmFtZSgpICE9IG51bGwpewotICAgICAgICAgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAic2tlbGV0b25JbnRlcmZhY2VOYW1lIiwgdGhpcy5jb2RlR2VuQ29uZmlndXJhdGlvbi5nZXRTa2VsdG9uSW50ZXJmYWNlTmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgcm9vdEVsZW1lbnQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJza2VsZXRvbkludGVyZmFjZU5hbWUiLCBsb2NhbFBhcnQgKyBTS0VMRVRPTl9JTlRFUkZBQ0VfU1VGRklYLAotICAgICAgICAgICAgICAgICAgICAgICAgcm9vdEVsZW1lbnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKHRoaXMuY29kZUdlbkNvbmZpZ3VyYXRpb24uZ2V0U2tlbHRvbkNsYXNzTmFtZSgpICE9IG51bGwpewotICAgICAgICAgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAic2tlbGV0b25JbnRlcmZhY2VOYW1lIiwgdGhpcy5jb2RlR2VuQ29uZmlndXJhdGlvbi5nZXRTa2VsdG9uQ2xhc3NOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICByb290RWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgInNrZWxldG9uSW50ZXJmYWNlTmFtZSIsIGxvY2FsUGFydCArIFNLRUxFVE9OX0NMQVNTX1NVRkZJWCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RFbGVtZW50KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAiYmFzZXJlY2VpdmVyIiwgKFN0cmluZykgbWVwVG9DbGFzc01hcC5nZXQobWVwKSwgcm9vdEVsZW1lbnQpOwotCi0gICAgICAgIGZpbGxTeW5jQXR0cmlidXRlcyhkb2MsIHJvb3RFbGVtZW50KTsKLQotICAgICAgICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0gICAgICAgIC8vIHRoaXMgYmxvY2sgb2YgY29kZSBzcGVjaWZpY2FsbHkgYXBwbGllcyB0byB0aGUgaW50ZWdyYXRpb24gb2YgZGF0YWJpbmRpbmcgY29kZSBpbnRvIHRoZQotICAgICAgICAvLyBnZW5lcmF0ZWQgY2xhc3NlcyB0aWdodGx5IChwcm9iYWJseSBhcyBpbm5lciBjbGFzc2VzKQotICAgICAgICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0gICAgICAgIC8vIGNoZWNrIGZvciB0aGUgc3BlY2lhbCBtb2RlbHMgaW4gdGhlIG1hcHBlciBhbmQgaWYgdGhleSBhcmUgcHJlc2VudCBwcm9jZXNzIHRoZW0KLSAgICAgICAgaWYgKG1hcHBlci5pc09iamVjdE1hcHBpbmdQcmVzZW50KCkpIHsKLSAgICAgICAgICAgIC8vIGFkZCBhbiBhdHRyaWJ1dGUgdG8gdGhlIHJvb3QgZWxlbWVudCBzaG93aW5nIHRoYXQgdGhlIHdyaXRpbmcgaGFzIGJlZW4gc2tpcHBlZAotICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgInNraXAtd3JpdGUiLCAieWVzIiwgcm9vdEVsZW1lbnQpOwotICAgICAgICAgICAgLy8gcHJvY2VzcyB0aGUgbWFwcGVyIG9iamVjdHMKLSAgICAgICAgICAgIHByb2Nlc3NNb2RlbE9iamVjdHMobWFwcGVyLmdldEFsbE1hcHBlZE9iamVjdHMoKSwgcm9vdEVsZW1lbnQsIGRvYyk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSAgICAgICAgYm9vbGVhbiBpc09wc0ZvdW5kID0gbG9hZE9wZXJhdGlvbnMoZG9jLCByb290RWxlbWVudCwgbWVwKTsKLSAgICAgICAgLy9wdXQgdGhlIHJlc3VsdCBpbiB0aGUgcHJvcGVydHkgbWFwCi0gICAgICAgIGluZm9Ib2xkZXIucHV0KG1lcCwgaXNPcHNGb3VuZCA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0UpOwotICAgICAgICAvL2NyZWF0ZSB0aGUgZGF0YWJpbmRlciBlbGVtZW50IHdpdGggc2VydmVyc2lkZSBhcyB0cnVlCi0gICAgICAgIHJvb3RFbGVtZW50LmFwcGVuZENoaWxkKGNyZWF0ZURPTUVsZW1lbnRmb3JEYXRhYmluZGVycyhkb2MsIHRydWUpKTsKLQotICAgICAgICAvL2F0dGFjaCBhIGxpc3Qgb2YgZmF1bHRzCi0gICAgICAgIHJvb3RFbGVtZW50LmFwcGVuZENoaWxkKGdldFVuaXF1ZUxpc3RvZkZhdWx0c29mTWVwKGRvYywgbWVwKSk7Ci0KLSAgICAgICAgZG9jLmFwcGVuZENoaWxkKHJvb3RFbGVtZW50KTsKLQotICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKERPTTJXcml0ZXIubm9kZVRvU3RyaW5nKHJvb3RFbGVtZW50KSk7Ci0gICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0gICAgICAgIHJldHVybiBkb2M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogY3JlYXRlIGEgZG9tIGVsZW1lbnQgZm9yIGRhdGFiaW5kZXJzLiBUaGlzIGlzIGNhbGxlZCBieSBvdGhlcgotICAgICAqCi0gICAgICogQHBhcmFtIGRvYwotICAgICAqLwotICAgIHByb3RlY3RlZCBFbGVtZW50IGNyZWF0ZURPTUVsZW1lbnRmb3JEYXRhYmluZGVycyhEb2N1bWVudCBkb2MsIGJvb2xlYW4gaXNTZXJ2ZXJzaWRlKSB7Ci0KLSAgICAgICAgLy8gRmlyc3QgSXRlcmF0ZSB0aHJvdWdoIHRoZSBvcGVyYXRpb25zIGFuZCBmaW5kIHRoZSByZWxldmFudCBmcm9tT00gYW5kIHRvT00gbWV0aG9kcyB0byBiZSBnZW5lcmF0ZWQKLSAgICAgICAgQXJyYXlMaXN0IHBhcmFtZXRlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uID0gbnVsbDsKLSAgICAgICAgQXhpc0JpbmRpbmdPcGVyYXRpb24gYXhpc0JpbmRpbmdPcGVyYXRpb24gPSBudWxsOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGJpbmRpbmdPcGVyYXRpb25zSXRlciA9IHRoaXMuYXhpc0JpbmRpbmcuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgICAgICAgICBiaW5kaW5nT3BlcmF0aW9uc0l0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgYXhpc0JpbmRpbmdPcGVyYXRpb24gPSAoQXhpc0JpbmRpbmdPcGVyYXRpb24pIGJpbmRpbmdPcGVyYXRpb25zSXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBheGlzT3BlcmF0aW9uID0gYXhpc0JpbmRpbmdPcGVyYXRpb24uZ2V0QXhpc09wZXJhdGlvbigpOwotCi0gICAgICAgICAgICAvLyBBZGQgdGhlIHBhcmFtZXRlcnMgdG8gYSBtYXAgd2l0aCB0aGVpciB0eXBlIGFzIHRoZSBrZXkKLSAgICAgICAgICAgIC8vIHRoaXMgc3RlcCBpcyBuZWVkZWQgdG8gcmVtb3ZlIHJlcGV0aXRpb25zCi0KLSAgICAgICAgICAgIC8vIHByb2Nlc3MgdGhlIGlucHV0IHBhcmFtZXRlcnMKLSAgICAgICAgICAgIFN0cmluZyBNRVAgPSBheGlzT3BlcmF0aW9uLmdldE1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4oKTsKLSAgICAgICAgICAgIGlmIChXU0RMVXRpbC5pc0lucHV0UHJlc2VudEZvck1FUChNRVApKSB7Ci0gICAgICAgICAgICAgICAgRWxlbWVudFtdIGlucHV0UGFyYW1FbGVtZW50ID0gZ2V0SW5wdXRQYXJhbUVsZW1lbnQoZG9jLCBheGlzT3BlcmF0aW9uKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGlucHV0UGFyYW1FbGVtZW50Lmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vYWRkIGFuIGF0dHJpYnV0ZSB0byB0aGUgcGFyYW1ldGVyIHNheWluZyB0aGF0IHRoaXMgaXMgYW4KLSAgICAgICAgICAgICAgICAgICAgLy9pbnB1dAotICAgICAgICAgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAiZGlyZWN0aW9uIiwgImluIiwgaW5wdXRQYXJhbUVsZW1lbnRbaV0pOwotICAgICAgICAgICAgICAgICAgICAvL2FkZCB0aGUgc2hvcnQgdHlwZSBuYW1lCi0gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMuYWRkKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0UGFyYW1FbGVtZW50W2ldKTsKLQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIHByb2Nlc3Mgb3V0cHV0IHBhcmFtZXRlcnMKLSAgICAgICAgICAgIGlmIChXU0RMVXRpbC5pc091dHB1dFByZXNlbnRGb3JNRVAoTUVQKSkgewotICAgICAgICAgICAgICAgIEVsZW1lbnQgb3V0cHV0UGFyYW1FbGVtZW50ID0gZ2V0T3V0cHV0UGFyYW1FbGVtZW50KGRvYywgYXhpc09wZXJhdGlvbik7Ci0gICAgICAgICAgICAgICAgaWYgKG91dHB1dFBhcmFtRWxlbWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vc2V0IHRoZSBkaXJlY3Rpb24gYXMgb3V0Ci0gICAgICAgICAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJkaXJlY3Rpb24iLCAib3V0Iiwgb3V0cHV0UGFyYW1FbGVtZW50KTsKLSAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycy5hZGQob3V0cHV0UGFyYW1FbGVtZW50KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vcHJvY2VzcyBmYXVsdHMKLSAgICAgICAgICAgIEVsZW1lbnRbXSBmYXVsdFBhcmFtRWxlbWVudHMgPSBnZXRGYXVsdFBhcmFtRWxlbWVudHMoZG9jLCBheGlzT3BlcmF0aW9uKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmF1bHRQYXJhbUVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgLy9zZXQgdGhlIGRpcmVjdGlvbiBhcyBvdXQgLSBhbGwgZmF1bHRzIGFyZSBvdXQgbWVzc2FnZXMgPwotICAgICAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJkaXJlY3Rpb24iLCAib3V0IiwgZmF1bHRQYXJhbUVsZW1lbnRzW2ldKTsKLSAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLmFkZChmYXVsdFBhcmFtRWxlbWVudHNbaV0pOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBwcm9jZXNzIHRoZSBoZWFkZXIgcGFyYW1ldGVycwotICAgICAgICAgICAgRWxlbWVudCBuZXdDaGlsZDsKLSAgICAgICAgICAgIExpc3QgaGVhZGVyUGFyYW1ldGVyUU5hbWVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgYWRkSGVhZGVyT3BlcmF0aW9ucyhoZWFkZXJQYXJhbWV0ZXJRTmFtZUxpc3QsIGF4aXNCaW5kaW5nT3BlcmF0aW9uLCB0cnVlKTsKLSAgICAgICAgICAgIExpc3QgcGFyYW1ldGVyRWxlbWVudExpc3QgPSBnZXRQYXJhbWV0ZXJFbGVtZW50TGlzdChkb2MsIGhlYWRlclBhcmFtZXRlclFOYW1lTGlzdCwKLSAgICAgICAgICAgICAgICAgICAgV1NETENvbnN0YW50cy5TT0FQX0hFQURFUik7Ci0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1ldGVyRWxlbWVudExpc3Quc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBuZXdDaGlsZCA9IChFbGVtZW50KSBwYXJhbWV0ZXJFbGVtZW50TGlzdC5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgcGFyYW1ldGVycy5hZGQobmV3Q2hpbGQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBoZWFkZXJQYXJhbWV0ZXJRTmFtZUxpc3QuY2xlYXIoKTsKLSAgICAgICAgICAgIHBhcmFtZXRlckVsZW1lbnRMaXN0LmNsZWFyKCk7Ci0gICAgICAgICAgICBhZGRIZWFkZXJPcGVyYXRpb25zKGhlYWRlclBhcmFtZXRlclFOYW1lTGlzdCwgYXhpc0JpbmRpbmdPcGVyYXRpb24sIGZhbHNlKTsKLSAgICAgICAgICAgIHBhcmFtZXRlckVsZW1lbnRMaXN0ID0gZ2V0UGFyYW1ldGVyRWxlbWVudExpc3QoZG9jLCBoZWFkZXJQYXJhbWV0ZXJRTmFtZUxpc3QsCi0gICAgICAgICAgICAgICAgICAgIFdTRExDb25zdGFudHMuU09BUF9IRUFERVIpOwotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtZXRlckVsZW1lbnRMaXN0LnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbmV3Q2hpbGQgPSAoRWxlbWVudCkgcGFyYW1ldGVyRWxlbWVudExpc3QuZ2V0KGkpOwotICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMuYWRkKG5ld0NoaWxkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEVsZW1lbnQgcm9vdEVsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudCgiZGF0YWJpbmRlcnMiKTsKLSAgICAgICAgLy9hZGQgdGhlIGRiIHR5cGUgYXR0cmlidXRlICAtIHRoZSBuYW1lIG9mIHRoZSBkYXRhYmluZGluZyB0eXBlCi0gICAgICAgIC8vdGhpcyB3aWxsIGJlIHVzZWQgdG8gc2VsZWN0IHRoZSBjb3JyZWN0IHRlbXBsYXRlCi0gICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJkYnR5cGUiLCBjb2RlR2VuQ29uZmlndXJhdGlvbi5nZXREYXRhYmluZGluZ1R5cGUoKSwgcm9vdEVsZW1lbnQpOwotICAgICAgICAvL2FkZCB0aGUgd3JhcHBlZCBmbGFnIHN0YXRlIC0gdGhpcyBpcyB1c2VkIGJ5IEppQlgsIGJ1dCBtYXkgYmUgdXNlZnVsCi0gICAgICAgIC8vZm9yIG90aGVyIGZyYW1ld29ya3MgaW4gdGhlIGZ1dHVyZQotICAgICAgICBTdHJpbmcgd3JhcGZsYWcgPSBCb29sZWFuLnRvU3RyaW5nKGNvZGVHZW5Db25maWd1cmF0aW9uLmlzUGFyYW1ldGVyc1dyYXBwZWQoKSk7Ci0gICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJ3cmFwcGVkIiwgd3JhcGZsYWcsIHJvb3RFbGVtZW50KTsKLQotICAgICAgICAvL2F0IHRoaXMgcG9pbnQgd2UgbWF5IG5lZWQgdG8gY2FwdHVyZSB0aGUgZXh0cmEgcGFyYW1ldGVycyBwYXNzZXMgdG8gdGhlCi0gICAgICAgIC8vcGFydGljdWxhciBkYXRhYmluZGluZyBmcmFtZXdvcmsKLSAgICAgICAgLy90aGVzZSBwYXJhbWV0ZXJzIHNob3d1cCBpbiB0aGUgcHJvcGVydHkgbWFwIHdpdGggU3RyaW5nIGtleXMsIGFuZCB3ZQotICAgICAgICAvL2NhbiBqdXN0IGNvcHkgdGhlc2UgaXRlbXMgYXMgYXR0cmlidXRlcyBvZiB0aGUgPGV4dHJhPiBlbGVtZW50LgotICAgICAgICBFbGVtZW50IGV4dHJhRWxlbWVudCA9IGFkZEVsZW1lbnQoZG9jLCAiZXh0cmEiLCBudWxsLCByb290RWxlbWVudCk7Ci0gICAgICAgIE1hcCBwcm9wZXJ0aWVzTWFwID0gY29kZUdlbkNvbmZpZ3VyYXRpb24uZ2V0UHJvcGVydGllcygpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gcHJvcGVydGllc01hcC5rZXlTZXQoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBPYmplY3Qga2V5ID0gaXQubmV4dCgpOwotICAgICAgICAgICAgaWYgKGtleSBpbnN0YW5jZW9mIFN0cmluZykgewotICAgICAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IHByb3BlcnRpZXNNYXAuZ2V0KGtleSk7Ci0gICAgICAgICAgICAgICAgLy9pZiB0aGUgdmFsdWUgaXMgbnVsbCBzZXQgaXQgdG8gZW1wdHkgc3RyaW5nCi0gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHZhbHVlID0gIiI7Ci0gICAgICAgICAgICAgICAgLy9hZGQga2V5PSJ2YWx1ZSIgYXR0cmlidXRlIHRvIGVsZW1lbnQgaWZmIHZhbHVlIGEgc3RyaW5nCi0gICAgICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsIChTdHJpbmcpIGtleSwgKFN0cmluZykgdmFsdWUsIGV4dHJhRWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy9hZGQgdGhlIHNlcnZlciBzaWRlIGF0dHJpYnV0ZS4gdGhpcyBoZWxwcyB0aGUgZGF0YWJpbmRpbmcgdGVtcGxhdGUKLSAgICAgICAgLy90byBkZXRlcm1pbmUgdGhlIG1ldGhvZHMgdG8gZ2VuZXJhdGUKLSAgICAgICAgaWYgKGlzU2VydmVyc2lkZSkgewotICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgImlzc2VydmVyc2lkZSIsICJ5ZXMiLCByb290RWxlbWVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gYWRkIHRoZSBuYW1lcyBvZiB0aGUgZWxlbWVudHMgdGhhdCBoYXZlIGJhc2UgNjQgY29udGVudAotICAgICAgICAvLyBpZiB0aGUgYmFzZTY0IG5hbWUgbGlzdCBpcyBtaXNzaW5nIHRoZW4gdGhpcyB3aG9sZSBzdGVwIGlzIHNraXBwZWQKLSAgICAgICAgcm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQoZ2V0QmFzZTY0RWxlbWVudHMoZG9jKSk7Ci0KLSAgICAgICAgLy9hZGQgdGhlIG1ldGhvZCBuYW1lcwotICAgICAgICByb290RWxlbWVudC5hcHBlbmRDaGlsZChnZXRPcE5hbWVzKGRvYykpOwotCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBwYXJhbWV0ZXJzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIHJvb3RFbGVtZW50LmFwcGVuZENoaWxkKChFbGVtZW50KSBpdGVyYXRvci5uZXh0KCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZmluaXNoIHdpdGggYW55IGV4dHJhIGluZm9ybWF0aW9uIGZyb20gc2VydmljZSBhbmQgb3BlcmF0aW9ucwotICAgICAgICBQYXJhbWV0ZXIgZGV0YWlscyA9IGF4aXNTZXJ2aWNlLmdldFBhcmFtZXRlcihDb25zdGFudHMuREFUQUJJTkRJTkdfU0VSVklDRV9ERVRBSUxTKTsKLSAgICAgICAgaWYgKGRldGFpbHMgIT0gbnVsbCkgewotICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gZGV0YWlscy5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRWxlbWVudCkgewotICAgICAgICAgICAgICAgIHJvb3RFbGVtZW50LmFwcGVuZENoaWxkKGRvYy5pbXBvcnROb2RlKChFbGVtZW50KSB2YWx1ZSwgdHJ1ZSkpOwotICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIExpc3QpIHsKLSAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKExpc3QpIHZhbHVlKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICAgICAgcm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQoZG9jLmltcG9ydE5vZGUoKEVsZW1lbnQpIGl0ZXIubmV4dCgpLCB0cnVlKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgYXhpc09wZXJhdGlvbiA9IG51bGw7Ci0gICAgICAgIGZvciAoSXRlcmF0b3Igb3BlcmF0aW9uc0l0ZXJhdG9yID0gYXhpc1NlcnZpY2UuZ2V0T3BlcmF0aW9ucygpOwotICAgICAgICAgICAgIG9wZXJhdGlvbnNJdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgYXhpc09wZXJhdGlvbiA9IChBeGlzT3BlcmF0aW9uKSBvcGVyYXRpb25zSXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgZGV0YWlscyA9IGF4aXNPcGVyYXRpb24uZ2V0UGFyYW1ldGVyKENvbnN0YW50cy5EQVRBQklORElOR19PUEVSQVRJT05fREVUQUlMUyk7Ci0gICAgICAgICAgICBpZiAoZGV0YWlscyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQoZG9jLmltcG9ydE5vZGUoKEVsZW1lbnQpIGRldGFpbHMuZ2V0VmFsdWUoKSwgdHJ1ZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImRhdGFiaW5kaW5nIHJvb3QgZWxlbWVudCAiICsgRE9NMldyaXRlci5ub2RlVG9TdHJpbmcocm9vdEVsZW1lbnQpKTsKLSAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSAgICAgICAgcmV0dXJuIHJvb3RFbGVtZW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHNldCB0aGUgc2hvcnQgdHlwZSBhcyBpdCBpcyBpbiB0aGUgZGF0YSBiaW5kaW5nCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGFyYW1FbGVtZW50Ci0gICAgICogQHBhcmFtIHhtbE5hbWUKLSAgICAgKi8KLQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkU2hvcnRUeXBlKEVsZW1lbnQgcGFyYW1FbGVtZW50LCBTdHJpbmcgeG1sTmFtZSkgewotCi0gICAgICAgIGlmICh4bWxOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyBqYXZhTmFtZTsKLSAgICAgICAgICAgIGlmIChKYXZhVXRpbHMuaXNKYXZhS2V5d29yZCh4bWxOYW1lKSkgewotICAgICAgICAgICAgICAgIGphdmFOYW1lID0gSmF2YVV0aWxzLm1ha2VOb25KYXZhS2V5d29yZCh4bWxOYW1lKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgamF2YU5hbWUgPSBKYXZhVXRpbHMuY2FwaXRhbGl6ZUZpcnN0Q2hhcihKYXZhVXRpbHMKLSAgICAgICAgICAgICAgICAgICAgICAgIC54bWxOYW1lVG9KYXZhKHhtbE5hbWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShwYXJhbUVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpLAotICAgICAgICAgICAgICAgICAgICAic2hvcnR0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgamF2YU5hbWUsCi0gICAgICAgICAgICAgICAgICAgIHBhcmFtRWxlbWVudCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBhZGRBdHRyaWJ1dGUocGFyYW1FbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKSwKLSAgICAgICAgICAgICAgICAgICAgInNob3J0dHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICIiLAotICAgICAgICAgICAgICAgICAgICBwYXJhbUVsZW1lbnQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhbiBlbGVtZW50IHJlcHJlc2VudGluZyB0aGUgb3BlcmF0aW9uIG5hbWVzCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZG9jCi0gICAgICogQHJldHVybiBSZXR1cm5zIEVsZW1lbnQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEVsZW1lbnQgZ2V0T3BOYW1lcyhEb2N1bWVudCBkb2MpIHsKLSAgICAgICAgRWxlbWVudCByb290ID0gZG9jLmNyZWF0ZUVsZW1lbnQoIm9wbmFtZXMiKTsKLSAgICAgICAgRWxlbWVudCBlbHQ7Ci0KLQotICAgICAgICBmb3IgKEl0ZXJhdG9yIG9wZXJhdGlvbnNJdGVyYXRvciA9IGF4aXNTZXJ2aWNlLmdldE9wZXJhdGlvbnMoKTsKLSAgICAgICAgICAgICBvcGVyYXRpb25zSXRlcmF0b3IuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uID0gKEF4aXNPcGVyYXRpb24pIG9wZXJhdGlvbnNJdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICBlbHQgPSBkb2MuY3JlYXRlRWxlbWVudCgibmFtZSIpOwotICAgICAgICAgICAgU3RyaW5nIGxvY2FsUGFydCA9IGF4aXNPcGVyYXRpb24uZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgZWx0LmFwcGVuZENoaWxkKGRvYy5jcmVhdGVUZXh0Tm9kZShKYXZhVXRpbHMueG1sTmFtZVRvSmF2YShsb2NhbFBhcnQpKSk7Ci0KLSAgICAgICAgICAgIC8vd2hhdCBuZWVkcyB0byBiZSBwdXQgaGVyZSBhcyB0aGUgb3BlcnRhdGlvbiBuYW1lc3BhY2UgaXMgYWN0dWFsbHkgdGhlCi0gICAgICAgICAgICAvL3RyYWdldCBuYW1lc3BhY2Ugb2YgdGhlIHNlcnZpY2UKLSAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJvcG5zdXJpIiwgYXhpc1NlcnZpY2UuZ2V0VGFyZ2V0TmFtZXNwYWNlKCksIGVsdCk7Ci0gICAgICAgICAgICByb290LmFwcGVuZENoaWxkKGVsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcm9vdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBiYXNlNjQgdHlwZXMuIElmIG5vdCBhdmFpbGFibGUgdGhpcyB3aWxsIGJlIGVtcHR5ISEhCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZG9jCi0gICAgICogQHJldHVybiBSZXR1cm5zIEVsZW1lbnQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEVsZW1lbnQgZ2V0QmFzZTY0RWxlbWVudHMoRG9jdW1lbnQgZG9jKSB7Ci0gICAgICAgIEVsZW1lbnQgcm9vdCA9IGRvYy5jcmVhdGVFbGVtZW50KCJiYXNlNjRFbGVtZW50cyIpOwotICAgICAgICBFbGVtZW50IGVsdDsKLSAgICAgICAgUU5hbWUgcW5hbWU7Ci0KLSAgICAgICAgLy8gdGhpcyBpcyBhIGxpc3Qgb2YgUU5hbWVzCi0gICAgICAgIExpc3QgbGlzdCA9IChMaXN0KSBjb2RlR2VuQ29uZmlndXJhdGlvbi5nZXRQcm9wZXJ0aWVzKCkuZ2V0KENvbnN0YW50cy5CQVNFXzY0X1BST1BFUlRZX0tFWSk7Ci0KLSAgICAgICAgaWYgKChsaXN0ICE9IG51bGwpICYmICFsaXN0LmlzRW1wdHkoKSkgewotICAgICAgICAgICAgaW50IGNvdW50ID0gbGlzdC5zaXplKCk7Ci0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgIHFuYW1lID0gKFFOYW1lKSBsaXN0LmdldChpKTsKLSAgICAgICAgICAgICAgICBlbHQgPSBkb2MuY3JlYXRlRWxlbWVudCgibmFtZSIpOwotICAgICAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJucy11cmwiLCBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKSwgZWx0KTsKLSAgICAgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAibG9jYWxOYW1lIiwgcW5hbWUuZ2V0TG9jYWxQYXJ0KCksIGVsdCk7Ci0gICAgICAgICAgICAgICAgcm9vdC5hcHBlbmRDaGlsZChlbHQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJvb3Q7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIG9iamVjdE1hcHBpbmdzCi0gICAgICogQHBhcmFtIHJvb3QKLSAgICAgKiBAcGFyYW0gZG9jCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc01vZGVsT2JqZWN0cyhNYXAgb2JqZWN0TWFwcGluZ3MsIEVsZW1lbnQgcm9vdCwgRG9jdW1lbnQgZG9jKSB7Ci0gICAgICAgIEl0ZXJhdG9yIG9iamVjdEl0ZXJhdG9yID0gb2JqZWN0TWFwcGluZ3MudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQotICAgICAgICB3aGlsZSAob2JqZWN0SXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBPYmplY3QgbyA9IG9iamVjdEl0ZXJhdG9yLm5leHQoKTsKLQotICAgICAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBEb2N1bWVudCkgewotICAgICAgICAgICAgICAgIC8vd2UgY2Fubm90IGhhdmUgYW4gZW1wdHkgZG9jdW1lbnQKLSAgICAgICAgICAgICAgICByb290LmFwcGVuZENoaWxkKGRvYy5pbXBvcnROb2RlKCgoRG9jdW1lbnQpIG8pLmdldERvY3VtZW50RWxlbWVudCgpLCB0cnVlKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotCi0gICAgICAgICAgICAgICAgLy8gb29wcyB3ZSBoYXZlIG5vIGlkZWEgaG93IHRvIGRvIHRoaXMsIGlmIHRoZSBtb2RlbCBwcm92aWRlZCBpcyBub3QgYSBET00gZG9jdW1lbnQKLSAgICAgICAgICAgICAgICAvLyB3ZSBhcmUgZG9uZS4gd2UgbWlnaHQgYXMgd2VsbCBza2lwICBpdCBoZXJlCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB3ZSBuZWVkIHRvIG1vZGlmeSB0aGUgbWFwcGVyJ3MgY2xhc3MgbmFtZSBsaXN0LiBUaGUgaXNzdWUgaGVyZSBpcyB0aGF0IGluIHRoaXMgY2FzZSB3ZSBkbyBub3QKLSAgICAgKiBleHBlY3QgdGhlIGZ1bGx5IHF1bGlmaWVkIGNsYXNzIG5hbWVzIHRvIGJlIHByZXNlbnQgaW4gdGhlIGNsYXNzIG5hbWVzIGxpc3QgZHVlIHRvIHRoZSBzaW1wbGUKLSAgICAgKiByZWFzb24gdGhhdCB0aGV5J3ZlIG5vdCBiZWVuIHdyaXR0ZW4geWV0ISBIZW5jZSB0aGUgbWFwcGVycyBjbGFzcyBuYW1lIGxpc3QgbmVlZHMgdG8gYmUKLSAgICAgKiB1cGRhdGVkIHRvIHN1aXQgdGhlIGV4cGVjdGVkIHBhY2thZ2UgdG8gYmUgd3JpdHRlbiBpbiB0aGlzIGNhc2Ugd2UgbW9kaWZ5IHRoZSBwYWNrYWdlIG5hbWUgdG8KLSAgICAgKiBoYXZlIHRoZSBjbGFzcyBhIGlubmVyIGNsYXNzIG9mIHRoZSBzdHViLCBpbnRlcmZhY2Ugb3IgdGhlIG1lc3NhZ2UgcmVjZWl2ZXIgZGVwZW5kaW5nIG9uIHRoZQotICAgICAqIHN0eWxlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlTWFwcGVyQ2xhc3NuYW1lcyhTdHJpbmcgZnVsbHlRdWxpZmllZEluY2x1ZGluZ0NsYXNzTmFtZVByZWZpeCkgewotICAgICAgICBNYXAgY2xhc3NOYW1lTWFwID0gbWFwcGVyLmdldEFsbE1hcHBlZE5hbWVzKCk7Ci0gICAgICAgIEl0ZXJhdG9yIGtleXMgPSBjbGFzc05hbWVNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQotICAgICAgICB3aGlsZSAoa2V5cy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIE9iamVjdCBrZXkgPSBrZXlzLm5leHQoKTsKLSAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSAoU3RyaW5nKSBjbGFzc05hbWVNYXAuZ2V0KGtleSk7Ci0KLSAgICAgICAgICAgIFN0cmluZyByZWFsQ2xhc3NOYW1lID0gY2xhc3NOYW1lOwotICAgICAgICAgICAgaWYgKGNsYXNzTmFtZS5lbmRzV2l0aCgiW10iKSl7Ci0gICAgICAgICAgICAgICByZWFsQ2xhc3NOYW1lID0gcmVhbENsYXNzTmFtZS5zdWJzdHJpbmcoMCxyZWFsQ2xhc3NOYW1lLmluZGV4T2YoIltdIikpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy90aGlzIGlzIGEgZ2VuZXJhdGVkIGNsYXNzIG5hbWUgLSB1cGRhdGUgdGhlIG5hbWUKLSAgICAgICAgICAgIGlmICghVHlwZVRlc3RlclV0aWwuaGFzUGFja2FnZShyZWFsQ2xhc3NOYW1lKSAmJiAhVHlwZVRlc3RlclV0aWwuaXNQcmltaXRpdmUocmVhbENsYXNzTmFtZSkpIHsKLSAgICAgICAgICAgICAgICBjbGFzc05hbWVNYXAucHV0KGtleSwgZnVsbHlRdWxpZmllZEluY2x1ZGluZ0NsYXNzTmFtZVByZWZpeCArICIuIiArIGNsYXNzTmFtZSk7Ci0gICAgICAgICAgICAgICAgaW5zdGFudGlhdGFibGVNZXNzYWdlQ2xhc3NOYW1lcy5wdXQoa2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgZnVsbHlRdWxpZmllZEluY2x1ZGluZ0NsYXNzTmFtZVByZWZpeCArICIkIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vdGhpcyBpcyBhIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIC0ganVzdCBsZWF2ZSBpdCBhcyBpdCBpcwotICAgICAgICAgICAgICAgIGNsYXNzTmFtZU1hcC5wdXQoa2V5LCBjbGFzc05hbWUpOwotICAgICAgICAgICAgICAgIGluc3RhbnRpYXRhYmxlTWVzc2FnZUNsYXNzTmFtZXMucHV0KGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZSB0aGUgc2VydmljZSBYTUwKLSAgICAgKgotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgd3JpdGVTZXJ2aWNlWG1sKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgLy8gV3JpdGUgdGhlIHNlcnZpY2UgeG1sIGluIGEgZm9sZGVyIHdpdGggdGhlCi0gICAgICAgIERvY3VtZW50IHNlcnZpY2VYTUxNb2RlbCA9IGNyZWF0ZURPTURvY3VtZW50Rm9yU2VydmljZVhNTCgpOwotICAgICAgICBkZWJ1Z0xvZ0RvY3VtZW50KCJEb2N1bWVudCBmb3Igc2VydmljZSBYTUw6Iiwgc2VydmljZVhNTE1vZGVsKTsKLSAgICAgICAgRmlsZVdyaXRlciBzZXJ2aWNlWG1sV3JpdGVyID0KLSAgICAgICAgICAgICAgICBuZXcgU2VydmljZVhNTFdyaXRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVHZW5Db25maWd1cmF0aW9uLmlzRmxhdHRlbkZpbGVzKCkgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRPdXRwdXREaXJlY3RvcnkoY29kZUdlbkNvbmZpZ3VyYXRpb24uZ2V0T3V0cHV0TG9jYXRpb24oKSwgbnVsbCkgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRPdXRwdXREaXJlY3RvcnkoY29kZUdlbkNvbmZpZ3VyYXRpb24uZ2V0T3V0cHV0TG9jYXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlR2VuQ29uZmlndXJhdGlvbi5nZXRSZXNvdXJjZUxvY2F0aW9uKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb2RlR2VuQ29uZmlndXJhdGlvbi5nZXRPdXRwdXRMYW5ndWFnZSgpKTsKLSAgICAgICAgc2VydmljZVhtbFdyaXRlci5zZXRPdmVycmlkZShjb2RlR2VuQ29uZmlndXJhdGlvbi5pc092ZXJyaWRlKCkpOwotICAgICAgICB3cml0ZUZpbGUoc2VydmljZVhNTE1vZGVsLCBzZXJ2aWNlWG1sV3JpdGVyKTsKLSAgICAgICAgY29kZUdlbkNvbmZpZ3VyYXRpb24uYWRkWG1sRmlsZU5hbWUoc2VydmljZVhtbFdyaXRlci5nZXRPdXRwdXRGaWxlKCkuZ2V0QWJzb2x1dGVQYXRoKCkpOy8vJE5PTi1TRUMtMwotCi0gICAgfQotCi0gICAgcHJvdGVjdGVkIERvY3VtZW50IGNyZWF0ZURPTURvY3VtZW50Rm9yU2VydmljZVhNTCgpIHsKLSAgICAgICAgRG9jdW1lbnQgZG9jID0gZ2V0RW1wdHlEb2N1bWVudCgpOwotICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIHNlcnZpY2VOYW1lID0gbnVsbDsKLQotICAgICAgICBFbGVtZW50IHJvb3RFbGVtZW50ID0gZG9jLmNyZWF0ZUVsZW1lbnQoImludGVyZmFjZXMiKTsKLSAgICAgICAgZG9jLmFwcGVuZENoaWxkKHJvb3RFbGVtZW50KTsKLQotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0aGlzLmF4aXNTZXJ2aWNlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIHRoaXMuYXhpc1NlcnZpY2UgPSAoQXhpc1NlcnZpY2UpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgdGhpcy5heGlzQmluZGluZyA9IGF4aXNTZXJ2aWNlLmdldEVuZHBvaW50KGF4aXNTZXJ2aWNlLmdldEVuZHBvaW50TmFtZSgpKS5nZXRCaW5kaW5nKCk7Ci0gICAgICAgICAgICBzZXJ2aWNlTmFtZSA9IGF4aXNTZXJ2aWNlLmdldE5hbWUoKTsKLSAgICAgICAgICAgIGlmICh0aGlzLmNvZGVHZW5Db25maWd1cmF0aW9uLmlzQmFja3dvcmRDb21wYXRpYmlsaXR5TW9kZSgpKSB7Ci0gICAgICAgICAgICAgICAgY2xhc3NOYW1lID0gbWFrZUphdmFDbGFzc05hbWUoYXhpc1NlcnZpY2UuZ2V0QmluZGluZ05hbWUoKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGNsYXNzTmFtZSA9IG1ha2VKYXZhQ2xhc3NOYW1lKHNlcnZpY2VOYW1lKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQoZ2V0U2VydmljZUVsZW1lbnQoc2VydmljZU5hbWUsIGNsYXNzTmFtZSwgZG9jKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZG9jOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEEgcmVzdXNhYmxlIG1ldGhvZCB0byByZXR1cm4gdGhlIHNlcnZpY2UgZWxlbWVudCBmb3IgY3JlYXRpbmcgdGhlIHNlcnZpY2UgeG1sCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2VydmljZU5hbWUKLSAgICAgKiBAcGFyYW0gY2xhc3NOYW1lCi0gICAgICogQHBhcmFtIGRvYwotICAgICAqIEByZXR1cm4gRE9NIEVsZW1lbnQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRWxlbWVudCBnZXRTZXJ2aWNlRWxlbWVudChTdHJpbmcgc2VydmljZU5hbWUsIFN0cmluZyBjbGFzc05hbWUsIERvY3VtZW50IGRvYykgewotCi0gICAgICAgIGlmIChhbGxTZXJ2aWNlSW5mb0hvbGRlci5nZXQoc2VydmljZU5hbWUpICE9IG51bGwpewotICAgICAgICAgICAgdGhpcy5pbmZvSG9sZGVyID0gKE1hcCkgYWxsU2VydmljZUluZm9Ib2xkZXIuZ2V0KHNlcnZpY2VOYW1lKTsKLSAgICAgICAgfQotICAgICAgICBFbGVtZW50IHJvb3RFbGVtZW50ID0gZG9jLmNyZWF0ZUVsZW1lbnQoImludGVyZmFjZSIpOwotCi0gICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJwYWNrYWdlIiwgIiIsIHJvb3RFbGVtZW50KTsKLSAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgImNsYXNzcGFja2FnZSIsIGNvZGVHZW5Db25maWd1cmF0aW9uLmdldFBhY2thZ2VOYW1lKCksIHJvb3RFbGVtZW50KTsKLSAgICAgICAgaWYgKHRoaXMuY29kZUdlbkNvbmZpZ3VyYXRpb24uZ2V0U2tlbHRvbkNsYXNzTmFtZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJuYW1lIiwgdGhpcy5jb2RlR2VuQ29uZmlndXJhdGlvbi5nZXRTa2VsdG9uQ2xhc3NOYW1lKCksIHJvb3RFbGVtZW50KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmICh0aGlzLmNvZGVHZW5Db25maWd1cmF0aW9uLmlzQmFja3dvcmRDb21wYXRpYmlsaXR5TW9kZSgpKSB7Ci0gICAgICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgIm5hbWUiLCBjbGFzc05hbWUgKyBTS0VMRVRPTl9DTEFTU19TVUZGSVhfQkFDSywgcm9vdEVsZW1lbnQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAibmFtZSIsIGNsYXNzTmFtZSArIFNLRUxFVE9OX0NMQVNTX1NVRkZJWCwgcm9vdEVsZW1lbnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFjb2RlR2VuQ29uZmlndXJhdGlvbi5pc1dyaXRlVGVzdENhc2UoKSkgewotICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgInRlc3RPbWl0IiwgInRydWUiLCByb290RWxlbWVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgInNlcnZpY2VuYW1lIiwgc2VydmljZU5hbWUsIHJvb3RFbGVtZW50KTsKLQotICAgICAgICBJdGVyYXRvciBpdCA9IG1lcFRvQ2xhc3NNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgT2JqZWN0IGtleSA9IGl0Lm5leHQoKTsKLQotICAgICAgICAgICAgaWYgKEJvb2xlYW4uVFJVRS5lcXVhbHMoaW5mb0hvbGRlci5nZXQoa2V5KSkpIHsKLSAgICAgICAgICAgICAgICBFbGVtZW50IGVsdCA9IGFkZEVsZW1lbnQoZG9jLCAibWVzc2FnZXJlY2VpdmVyIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VKYXZhQ2xhc3NOYW1lKHNlcnZpY2VOYW1lKSArIG1lcFRvU3VmZml4TWFwLmdldChrZXkpLAotICAgICAgICAgICAgICAgICAgICAgICAgcm9vdEVsZW1lbnQpOwotICAgICAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJtZXBVUkkiLCBrZXkudG9TdHJpbmcoKSwgZWx0KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLSAgICAgICAgbG9hZE9wZXJhdGlvbnMoZG9jLCByb290RWxlbWVudCwgbnVsbCk7Ci0KLSAgICAgICAgcmV0dXJuIHJvb3RFbGVtZW50OwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHdyaXRlU2tlbGV0b24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgRG9jdW1lbnQgc2tlbGV0b25Nb2RlbCA9Ci0gICAgICAgICAgICAgICAgY3JlYXRlRE9NRG9jdW1lbnRGb3JTa2VsZXRvbihjb2RlR2VuQ29uZmlndXJhdGlvbi5pc1NlcnZlclNpZGVJbnRlcmZhY2UoKSk7Ci0gICAgICAgIGRlYnVnTG9nRG9jdW1lbnQoIkRvY3VtZW50IGZvciBza2VsZXRvbjoiLCBza2VsZXRvbk1vZGVsKTsKLSAgICAgICAgRmlsZVdyaXRlciBza2VsZXRvbldyaXRlciA9IG5ldyBTa2VsZXRvbldyaXRlcigKLSAgICAgICAgICAgICAgICBjb2RlR2VuQ29uZmlndXJhdGlvbi5pc0ZsYXR0ZW5GaWxlcygpID8KLSAgICAgICAgICAgICAgICAgICAgICAgIGdldE91dHB1dERpcmVjdG9yeShjb2RlR2VuQ29uZmlndXJhdGlvbi5nZXRPdXRwdXRMb2NhdGlvbigpLCBudWxsKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICBnZXRPdXRwdXREaXJlY3RvcnkoY29kZUdlbkNvbmZpZ3VyYXRpb24uZ2V0T3V0cHV0TG9jYXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZUdlbkNvbmZpZ3VyYXRpb24uZ2V0U291cmNlTG9jYXRpb24oKSkKLSAgICAgICAgICAgICAgICAsIHRoaXMuY29kZUdlbkNvbmZpZ3VyYXRpb24uZ2V0T3V0cHV0TGFuZ3VhZ2UoKSk7Ci0gICAgICAgIHNrZWxldG9uV3JpdGVyLnNldE92ZXJyaWRlKGNvZGVHZW5Db25maWd1cmF0aW9uLmlzT3ZlcnJpZGUoKSk7Ci0gICAgICAgIHdyaXRlRmlsZShza2VsZXRvbk1vZGVsLCBza2VsZXRvbldyaXRlcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV3JpdGUgdGhlIHNrZWxldG9uSW50ZXJmYWNlCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHdyaXRlU2tlbGV0b25JbnRlcmZhY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgRG9jdW1lbnQgc2tlbGV0b25Nb2RlbCA9IGNyZWF0ZURPTURvY3VtZW50Rm9yU2tlbGV0b25JbnRlcmZhY2UoKTsKLSAgICAgICAgZGVidWdMb2dEb2N1bWVudCgiRG9jdW1lbnQgZm9yIHNrZWxldG9uIEludGVyZmFjZToiLCBza2VsZXRvbk1vZGVsKTsKLSAgICAgICAgRmlsZVdyaXRlciBza2VsZXRvbkludGVyZmFjZVdyaXRlciA9IG5ldyBTa2VsZXRvbkludGVyZmFjZVdyaXRlcigKLSAgICAgICAgICAgICAgICBjb2RlR2VuQ29uZmlndXJhdGlvbi5pc0ZsYXR0ZW5GaWxlcygpID8KLSAgICAgICAgICAgICAgICAgICAgICAgIGdldE91dHB1dERpcmVjdG9yeShjb2RlR2VuQ29uZmlndXJhdGlvbi5nZXRPdXRwdXRMb2NhdGlvbigpLCBudWxsKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICBnZXRPdXRwdXREaXJlY3RvcnkoY29kZUdlbkNvbmZpZ3VyYXRpb24uZ2V0T3V0cHV0TG9jYXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZUdlbkNvbmZpZ3VyYXRpb24uZ2V0U291cmNlTG9jYXRpb24oKSkKLSAgICAgICAgICAgICAgICAsIHRoaXMuY29kZUdlbkNvbmZpZ3VyYXRpb24uZ2V0T3V0cHV0TGFuZ3VhZ2UoKSk7Ci0gICAgICAgIHNrZWxldG9uSW50ZXJmYWNlV3JpdGVyLnNldE92ZXJyaWRlKGNvZGVHZW5Db25maWd1cmF0aW9uLmlzT3ZlcnJpZGUoKSk7Ci0gICAgICAgIHdyaXRlRmlsZShza2VsZXRvbk1vZGVsLCBza2VsZXRvbkludGVyZmFjZVdyaXRlcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgWE1MTW9kZWwgZm9yIHRoZSBza2VsZXRvbgotICAgICAqCi0gICAgICogQHBhcmFtIGlzU2tlbGV0b25JbnRlcmZhY2UKLSAgICAgKiBAcmV0dXJuIERPTSBEb2N1bWVudAotICAgICAqLwotICAgIHByb3RlY3RlZCBEb2N1bWVudCBjcmVhdGVET01Eb2N1bWVudEZvclNrZWxldG9uKGJvb2xlYW4gaXNTa2VsZXRvbkludGVyZmFjZSkgewotICAgICAgICBEb2N1bWVudCBkb2MgPSBnZXRFbXB0eURvY3VtZW50KCk7Ci0gICAgICAgIEVsZW1lbnQgcm9vdEVsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudCgiaW50ZXJmYWNlIik7Ci0KLSAgICAgICAgU3RyaW5nIHNlcnZpY2VOYW1lID0gbWFrZUphdmFDbGFzc05hbWUoYXhpc1NlcnZpY2UuZ2V0TmFtZSgpKTsKLSAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgInBhY2thZ2UiLCBjb2RlR2VuQ29uZmlndXJhdGlvbi5nZXRQYWNrYWdlTmFtZSgpLCByb290RWxlbWVudCk7Ci0gICAgICAgIGlmICh0aGlzLmNvZGVHZW5Db25maWd1cmF0aW9uLmlzQmFja3dvcmRDb21wYXRpYmlsaXR5TW9kZSgpKSB7Ci0gICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAibmFtZSIsCi0gICAgICAgICAgICAgICAgICAgIG1ha2VKYXZhQ2xhc3NOYW1lKGF4aXNTZXJ2aWNlLmdldEJpbmRpbmdOYW1lKCkpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTS0VMRVRPTl9DTEFTU19TVUZGSVhfQkFDSywKLSAgICAgICAgICAgICAgICAgICAgcm9vdEVsZW1lbnQpOwotICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY29kZUdlbkNvbmZpZ3VyYXRpb24uZ2V0U2tlbHRvbkNsYXNzTmFtZSgpICE9IG51bGwpewotICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgIm5hbWUiLCB0aGlzLmNvZGVHZW5Db25maWd1cmF0aW9uLmdldFNrZWx0b25DbGFzc05hbWUoKSwgcm9vdEVsZW1lbnQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgIm5hbWUiLCBzZXJ2aWNlTmFtZSArIFNLRUxFVE9OX0NMQVNTX1NVRkZJWCwgcm9vdEVsZW1lbnQpOwotICAgICAgICB9Ci0gICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJjYWxsYmFja25hbWUiLCBzZXJ2aWNlTmFtZSArIENBTExfQkFDS19IQU5ETEVSX1NVRkZJWCwKLSAgICAgICAgICAgICAgICByb290RWxlbWVudCk7Ci0gICAgICAgIC8vYWRkIGJhY2t3b3JkY29tcGF0aWJpbGl0eSBhdHRyaWJ1dGUKLSAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgImlzYmFja2NvbXBhdGlibGUiLAotICAgICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKGNvZGVHZW5Db25maWd1cmF0aW9uLmlzQmFja3dvcmRDb21wYXRpYmlsaXR5TW9kZSgpKSwKLSAgICAgICAgICAgICAgICByb290RWxlbWVudCk7Ci0gICAgICAgIGlmIChpc1NrZWxldG9uSW50ZXJmYWNlKSB7Ci0gICAgICAgICAgICBpZiAodGhpcy5jb2RlR2VuQ29uZmlndXJhdGlvbi5pc0JhY2t3b3JkQ29tcGF0aWJpbGl0eU1vZGUoKSkgewotICAgICAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJza2VsZXRvbkludGVyZmFjZU5hbWUiLCBtYWtlSmF2YUNsYXNzTmFtZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlLmdldEVuZHBvaW50TmFtZSgpKSArIFNLRUxFVE9OX0lOVEVSRkFDRV9TVUZGSVhfQkFDSywKLSAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RFbGVtZW50KTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb2RlR2VuQ29uZmlndXJhdGlvbi5nZXRTa2VsdG9uSW50ZXJmYWNlTmFtZSgpICE9IG51bGwpewotICAgICAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJza2VsZXRvbkludGVyZmFjZU5hbWUiLCB0aGlzLmNvZGVHZW5Db25maWd1cmF0aW9uLmdldFNrZWx0b25JbnRlcmZhY2VOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICByb290RWxlbWVudCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJza2VsZXRvbkludGVyZmFjZU5hbWUiLCBzZXJ2aWNlTmFtZSArIFNLRUxFVE9OX0lOVEVSRkFDRV9TVUZGSVgsCi0gICAgICAgICAgICAgICAgICAgICAgICByb290RWxlbWVudCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgICBmaWxsU3luY0F0dHJpYnV0ZXMoZG9jLCByb290RWxlbWVudCk7Ci0gICAgICAgIGxvYWRPcGVyYXRpb25zKGRvYywgcm9vdEVsZW1lbnQsIG51bGwpOwotCi0gICAgICAgIC8vYXR0YWNoIGEgbGlzdCBvZiBmYXVsdHMKLSAgICAgICAgcm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQoZ2V0VW5pcXVlTGlzdG9mRmF1bHRzKGRvYykpOwotCi0gICAgICAgIGRvYy5hcHBlbmRDaGlsZChyb290RWxlbWVudCk7Ci0KLSAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihET00yV3JpdGVyLm5vZGVUb1N0cmluZyhyb290RWxlbWVudCkpOwotICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAgICAgcmV0dXJuIGRvYzsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIFhNTCBtb2RlbCBmb3IgdGhlIHNrZWxldG9uIGludGVyZmFjZQotICAgICAqCi0gICAgICogQHJldHVybiBET00gRG9jdW1lbnQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRG9jdW1lbnQgY3JlYXRlRE9NRG9jdW1lbnRGb3JTa2VsZXRvbkludGVyZmFjZSgpIHsKLSAgICAgICAgRG9jdW1lbnQgZG9jID0gZ2V0RW1wdHlEb2N1bWVudCgpOwotICAgICAgICBFbGVtZW50IHJvb3RFbGVtZW50ID0gZG9jLmNyZWF0ZUVsZW1lbnQoImludGVyZmFjZSIpOwotCi0gICAgICAgIFN0cmluZyBzZXJ2aWNlTmFtZSA9IG1ha2VKYXZhQ2xhc3NOYW1lKGF4aXNTZXJ2aWNlLmdldE5hbWUoKSk7Ci0gICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJwYWNrYWdlIiwgY29kZUdlbkNvbmZpZ3VyYXRpb24uZ2V0UGFja2FnZU5hbWUoKSwgcm9vdEVsZW1lbnQpOwotICAgICAgICBpZiAodGhpcy5jb2RlR2VuQ29uZmlndXJhdGlvbi5pc0JhY2t3b3JkQ29tcGF0aWJpbGl0eU1vZGUoKSkgewotICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgIm5hbWUiLCBtYWtlSmF2YUNsYXNzTmFtZShheGlzU2VydmljZS5nZXRFbmRwb2ludE5hbWUoKSkgKwotICAgICAgICAgICAgICAgICAgICBTS0VMRVRPTl9JTlRFUkZBQ0VfU1VGRklYX0JBQ0ssIHJvb3RFbGVtZW50KTsKLSAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvZGVHZW5Db25maWd1cmF0aW9uLmdldFNrZWx0b25JbnRlcmZhY2VOYW1lKCkgIT0gbnVsbCl7Ci0gICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAibmFtZSIsIHRoaXMuY29kZUdlbkNvbmZpZ3VyYXRpb24uZ2V0U2tlbHRvbkludGVyZmFjZU5hbWUoKSAsIHJvb3RFbGVtZW50KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJuYW1lIiwgc2VydmljZU5hbWUgKyBTS0VMRVRPTl9JTlRFUkZBQ0VfU1VGRklYLCByb290RWxlbWVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAiY2FsbGJhY2tuYW1lIiwgc2VydmljZU5hbWUgKyBDQUxMX0JBQ0tfSEFORExFUl9TVUZGSVgsCi0gICAgICAgICAgICAgICAgcm9vdEVsZW1lbnQpOwotCi0gICAgICAgIC8vYWRkIGJhY2t3b3JkY29tcGF0aWJpbGl0eSBhdHRyaWJ1dGUKLSAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgImlzYmFja2NvbXBhdGlibGUiLAotICAgICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKGNvZGVHZW5Db25maWd1cmF0aW9uLmlzQmFja3dvcmRDb21wYXRpYmlsaXR5TW9kZSgpKSwKLSAgICAgICAgICAgICAgICByb290RWxlbWVudCk7Ci0KLSAgICAgICAgZmlsbFN5bmNBdHRyaWJ1dGVzKGRvYywgcm9vdEVsZW1lbnQpOwotICAgICAgICBsb2FkT3BlcmF0aW9ucyhkb2MsIHJvb3RFbGVtZW50LCBudWxsKTsKLQotICAgICAgICAvL2F0dGFjaCBhIGxpc3Qgb2YgZmF1bHRzCi0gICAgICAgIHJvb3RFbGVtZW50LmFwcGVuZENoaWxkKGdldFVuaXF1ZUxpc3RvZkZhdWx0cyhkb2MpKTsKLQotICAgICAgICBkb2MuYXBwZW5kQ2hpbGQocm9vdEVsZW1lbnQpOwotICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKERPTTJXcml0ZXIubm9kZVRvU3RyaW5nKHJvb3RFbGVtZW50KSk7Ci0gICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgICAgICByZXR1cm4gZG9jOwotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogTG9hZHMgdGhlIG9wZXJhdGlvbnMKLSAgICAgKgotICAgICAqIEBwYXJhbSBkb2MKLSAgICAgKiBAcGFyYW0gcm9vdEVsZW1lbnQKLSAgICAgKiBAcGFyYW0gbWVwCi0gICAgICogQHJldHVybiBib29sZWFuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gbG9hZE9wZXJhdGlvbnMoRG9jdW1lbnQgZG9jLCBFbGVtZW50IHJvb3RFbGVtZW50LCBTdHJpbmcgbWVwKSB7Ci0gICAgICAgIEVsZW1lbnQgbWV0aG9kRWxlbWVudDsKLSAgICAgICAgU3RyaW5nIHNlcnZpY2VOYW1lID0gbWFrZUphdmFDbGFzc05hbWUoYXhpc1NlcnZpY2UuZ2V0TmFtZSgpKTsKLQotICAgICAgICBJdGVyYXRvciBiaW5kaW5nT3BlcmF0aW9ucyA9IHRoaXMuYXhpc0JpbmRpbmcuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgICAgYm9vbGVhbiBvcHNGb3VuZCA9IGZhbHNlOwotICAgICAgICBBeGlzQmluZGluZ09wZXJhdGlvbiBheGlzQmluZGluZ09wZXJhdGlvbiA9IG51bGw7Ci0gICAgICAgIEF4aXNPcGVyYXRpb24gYXhpc09wZXJhdGlvbiA9IG51bGw7Ci0gICAgICAgIHdoaWxlIChiaW5kaW5nT3BlcmF0aW9ucy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIGF4aXNCaW5kaW5nT3BlcmF0aW9uID0gKEF4aXNCaW5kaW5nT3BlcmF0aW9uKSBiaW5kaW5nT3BlcmF0aW9ucy5uZXh0KCk7Ci0gICAgICAgICAgICBheGlzT3BlcmF0aW9uID0gYXhpc0JpbmRpbmdPcGVyYXRpb24uZ2V0QXhpc09wZXJhdGlvbigpOwotICAgICAgICAgICAgLy8gcG9wdWxhdGUgaW5mbyBob2xkZXIgd2l0aCBtZXAgaW5mb3JtYXRpb24uIFRoaXMgd2lsbCB1c2VkIGluIGRldGVybWluaW5nIHdoaWNoCi0gICAgICAgICAgICAvLyBtZXNzYWdlIHJlY2VpdmVyIHRvIHVzZSwgZXRjLiwKLQotCi0gICAgICAgICAgICBTdHJpbmcgbWVzc2FnZUV4Y2hhbmdlUGF0dGVybiA9IGF4aXNPcGVyYXRpb24uZ2V0TWVzc2FnZUV4Y2hhbmdlUGF0dGVybigpOwotICAgICAgICAgICAgaWYgKGluZm9Ib2xkZXIuZ2V0KG1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4pID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpbmZvSG9sZGVyLnB1dChtZXNzYWdlRXhjaGFuZ2VQYXR0ZXJuLCBCb29sZWFuLlRSVUUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobWVwID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBvcHNGb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgbWV0aG9kRWxlbWVudCA9IGdlbmVyYXRlTWV0aG9kRWxlbWVudChkb2MsIHNlcnZpY2VOYW1lLCBheGlzQmluZGluZ09wZXJhdGlvbik7Ci0gICAgICAgICAgICAgICAgcm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQobWV0aG9kRWxlbWVudCk7Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy9tZXAgaXMgcHJlc2VudCAtIHdlIG1vdmUgYWhlYWQgb25seSBpZiB0aGUgZ2l2ZW4gbWVwIG1hdGNoZXMgdGhlIG1lcCBvZiB0aGlzIG9wZXJhdGlvbgotCi0gICAgICAgICAgICAgICAgaWYgKG1lcC5lcXVhbHMoYXhpc09wZXJhdGlvbi5nZXRNZXNzYWdlRXhjaGFuZ2VQYXR0ZXJuKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vYXQgdGhpcyBwb2ludCB3ZSBrbm93IGl0J3MgdHJ1ZQotICAgICAgICAgICAgICAgICAgICBvcHNGb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIG1ldGhvZEVsZW1lbnQgPSBnZW5lcmF0ZU1ldGhvZEVsZW1lbnQoZG9jLCBzZXJ2aWNlTmFtZSwgYXhpc0JpbmRpbmdPcGVyYXRpb24pOwotICAgICAgICAgICAgICAgICAgICByb290RWxlbWVudC5hcHBlbmRDaGlsZChtZXRob2RFbGVtZW50KTsKLSAgICAgICAgICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG9wc0ZvdW5kOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbW1vbiBjb2RlIHRvIGdlbmVyYXRlIGEgPG1ldGhvZD4gZWxlbWVudCBmcm9tIGFuIG9wZXJhdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBkb2MKLSAgICAgKiBAcGFyYW0gZW5kcG9pbnROYW1lCi0gICAgICogQHBhcmFtIGJpbmRpbmdPcGVyYXRpb24KLSAgICAgKiBAcmV0dXJuIGdlbmVyYXRlZCBlbGVtZW50Ci0gICAgICogQHRocm93cyBET01FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRWxlbWVudCBnZW5lcmF0ZU1ldGhvZEVsZW1lbnQoRG9jdW1lbnQgZG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZW5kcG9pbnROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBeGlzQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLSAgICAgICAgQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uID0gYmluZGluZ09wZXJhdGlvbi5nZXRBeGlzT3BlcmF0aW9uKCk7Ci0gICAgICAgIEVsZW1lbnQgbWV0aG9kRWxlbWVudDsKLSAgICAgICAgTGlzdCBzb2FwSGVhZGVySW5wdXRQYXJhbWV0ZXJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBMaXN0IHNvYXBIZWFkZXJPdXRwdXRQYXJhbWV0ZXJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBtZXRob2RFbGVtZW50ID0gZG9jLmNyZWF0ZUVsZW1lbnQoIm1ldGhvZCIpOwotICAgICAgICBTdHJpbmcgbG9jYWxQYXJ0ID0gYXhpc09wZXJhdGlvbi5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCk7Ci0KLSAgICAgICAgaWYgKHRoaXMuY29kZUdlbkNvbmZpZ3VyYXRpb24uaXNVc2VPcGVyYXRpb25OYW1lKCkpIHsKLSAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJuYW1lIiwgSmF2YVV0aWxzLnhtbE5hbWVUb0phdmEobG9jYWxQYXJ0KSwgbWV0aG9kRWxlbWVudCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAibmFtZSIsIEphdmFVdGlscy54bWxOYW1lVG9KYXZhSWRlbnRpZmllcihsb2NhbFBhcnQpLCBtZXRob2RFbGVtZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJvcmlnaW5hbE5hbWUiLCBsb2NhbFBhcnQsIG1ldGhvZEVsZW1lbnQpOwotICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAibmFtZXNwYWNlIiwgYXhpc09wZXJhdGlvbi5nZXROYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCksIG1ldGhvZEVsZW1lbnQpOwotICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAic3R5bGUiLCAoU3RyaW5nKSBnZXRCaW5kaW5nUHJvcGVydHlGcm9tT3BlcmF0aW9uKAotICAgICAgICAgICAgICAgIFdTRExDb25zdGFudHMuV1NETF8xXzFfU1RZTEUsIGF4aXNPcGVyYXRpb24uZ2V0TmFtZSgpKSwgbWV0aG9kRWxlbWVudCk7Ci0KLSAgICAgICAgLy8gYWRkIGRvY3VtZW50YXRpb24gZm9yIHRoaXMgb3BlcmF0aW9uCi0gICAgICAgIFN0cmluZyBjb21tZW50ID0gIiI7Ci0gICAgICAgIGlmIChheGlzT3BlcmF0aW9uLmdldERvY3VtZW50YXRpb24oKSAhPSBudWxsKXsKLSAgICAgICAgICAgIGNvbW1lbnQgPSBheGlzT3BlcmF0aW9uLmdldERvY3VtZW50YXRpb24oKS50cmltKCk7Ci0gICAgICAgIH0KLSAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgImNvbW1lbnQiLCBjb21tZW50LCBtZXRob2RFbGVtZW50KTsKLQotICAgICAgICBTdHJpbmcgbWVzc2FnZUV4Y2hhbmdlUGF0dGVybiA9IGF4aXNPcGVyYXRpb24uZ2V0TWVzc2FnZUV4Y2hhbmdlUGF0dGVybigpOwotCi0gICAgICAgIC8vSmF4d3MgU3BlY2lmaWMKLSAgICAgICAgaWYoImpheC13cyIuZXF1YWxzKGNvZGVHZW5Db25maWd1cmF0aW9uLmdldE91dHB1dExhbmd1YWdlKCkpKXsKLSAgICAgICAgICAgIGJvb2xlYW4gd3JhcHBlZCA9IGZhbHNlOwotICAgICAgICAgICAgaWYgKFdTRExVdGlsLmlzSW5wdXRQcmVzZW50Rm9yTUVQKG1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4pKSB7Ci0gICAgICAgICAgICAgICAgQXhpc01lc3NhZ2UgbXNnID0gYXhpc09wZXJhdGlvbi5nZXRNZXNzYWdlKFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9JTl9WQUxVRSk7Ci0gICAgICAgICAgICAgICAgaWYobXNnLmdldFBhcmFtZXRlcihDb25zdGFudHMuVU5XUkFQUEVEX0tFWSkgIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgIHdyYXBwZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJwYXJhbWV0ZXJzdHlsZSIsICh3cmFwcGVkKT8iV1JBUFBQRUQiOiJCQVJFIiwgbWV0aG9kRWxlbWVudCk7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJkYnN1cHBvcnRuYW1lIiwKLSAgICAgICAgICAgICAgICBlbmRwb2ludE5hbWUgKyBsb2NhbFBhcnQgKyBEQVRBQklORElOR19TVVBQT1JURVJfTkFNRV9TVUZGSVgsCi0gICAgICAgICAgICAgICAgbWV0aG9kRWxlbWVudCk7Ci0gICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJtZXAiLCBVdGlscy5nZXRBeGlzU3BlY2lmTUVQQ29uc3RhbnQobWVzc2FnZUV4Y2hhbmdlUGF0dGVybikgKyAiIiwKLSAgICAgICAgICAgICAgICBtZXRob2RFbGVtZW50KTsKLSAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgIm1lcFVSSSIsIG1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4sIG1ldGhvZEVsZW1lbnQpOwotICAgICAgICBQYXJhbWV0ZXIgd3NkbDJTdHlsZVBhcmFtZXRlciA9IGF4aXNPcGVyYXRpb24uZ2V0UGFyYW1ldGVyKFdTREwyQ29uc3RhbnRzLk9QRVJBVElPTl9TVFlMRSk7Ci0gICAgICAgIGlmICh3c2RsMlN0eWxlUGFyYW1ldGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIHByb3ZpZGUgV1NETDIgc3R5bGVzIHRvIGFsbG93IHRlbXBsYXRlcyB0byB0YWtlIGFkdmFudGFnZSBvZiB0aGVtLCBpZiBkZXNpcmVkCi0gICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAid3NkbDJTdHlsZXMiLCBhcnJheVRvU3RyaW5nKChVUklbXSl3c2RsMlN0eWxlUGFyYW1ldGVyLmdldFZhbHVlKCkpLCBtZXRob2RFbGVtZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNoZWNrIGZvciB0aGlzIG9wZXJhdGlvbiB0byBiZSBoYW5kbGVkIGRpcmVjdGx5IGJ5IGRhdGFiaW5kaW5nIGNvZGUgZ2VuZXJhdGlvbgotICAgICAgICBQYXJhbWV0ZXIgZGJtZXRobmFtZSA9IGF4aXNPcGVyYXRpb24uZ2V0UGFyYW1ldGVyKENvbnN0YW50cy5EQVRBQklORElOR19HRU5FUkFURURfUkVDRUlWRVIpOwotICAgICAgICBpZiAoZGJtZXRobmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAidXNlZGJtZXRob2QiLCAoU3RyaW5nKSBkYm1ldGhuYW1lLmdldFZhbHVlKCksIG1ldGhvZEVsZW1lbnQpOwotICAgICAgICB9Ci0gICAgICAgIFBhcmFtZXRlciBkYmdlbmltcGwgPQotICAgICAgICAgICAgICAgIGF4aXNPcGVyYXRpb24uZ2V0UGFyYW1ldGVyKENvbnN0YW50cy5EQVRBQklORElOR19HRU5FUkFURURfSU1QTEVNRU5UQVRJT04pOwotICAgICAgICBpZiAoZGJnZW5pbXBsICE9IG51bGwgJiYgQm9vbGVhbi5UUlVFLmVxdWFscyhkYmdlbmltcGwuZ2V0VmFsdWUoKSkpIHsKLSAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJ1c2RiaW1wbCIsICJ0cnVlIiwgbWV0aG9kRWxlbWVudCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAidXNkYmltcGwiLCAiZmFsc2UiLCBtZXRob2RFbGVtZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIGFkZFNPQVBBY3Rpb24oZG9jLCBtZXRob2RFbGVtZW50LCBiaW5kaW5nT3BlcmF0aW9uLmdldE5hbWUoKSk7Ci0gICAgICAgIGFkZE91dHB1dEFuZEZhdWx0QWN0aW9ucyhkb2MsIG1ldGhvZEVsZW1lbnQsIGF4aXNPcGVyYXRpb24pOwotICAgICAgICBhZGRIZWFkZXJPcGVyYXRpb25zKHNvYXBIZWFkZXJJbnB1dFBhcmFtZXRlckxpc3QsIGJpbmRpbmdPcGVyYXRpb24sIHRydWUpOwotLy8gICAgICAgIGFkZEhlYWRlck9wZXJhdGlvbnMoc29hcEhlYWRlck91dHB1dFBhcmFtZXRlckxpc3QsIGF4aXNPcGVyYXRpb24sIGZhbHNlKTsKLQotCi0gICAgICAgIGlmIChXU0RMVXRpbC5pc0lucHV0UHJlc2VudEZvck1FUChtZXNzYWdlRXhjaGFuZ2VQYXR0ZXJuKSkgewotICAgICAgICAgICAgaWYoImpheC13cyIuZXF1YWxzKGNvZGVHZW5Db25maWd1cmF0aW9uLmdldE91dHB1dExhbmd1YWdlKCkpKXsKLSAgICAgICAgICAgICAgICB1c2VIb2xkZXJDbGFzc19qYXh3cyA9IGZhbHNlOwotICAgICAgICAgICAgICAgIEF4aXNNZXNzYWdlIGluTWVzc2FnZSA9IGF4aXNPcGVyYXRpb24uZ2V0TWVzc2FnZShXU0RMQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfSU5fVkFMVUUpOwotICAgICAgICAgICAgICAgIGlmIChXU0RMVXRpbC5pc091dHB1dFByZXNlbnRGb3JNRVAobWVzc2FnZUV4Y2hhbmdlUGF0dGVybikpIHsKLSAgICAgICAgICAgICAgICAgICAgQXhpc01lc3NhZ2Ugb3V0TWVzc2FnZSA9IGF4aXNPcGVyYXRpb24uZ2V0TWVzc2FnZShXU0RMQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfT1VUX1ZBTFVFKTsKLSAgICAgICAgICAgICAgICAgICAgaWYoaW5NZXNzYWdlLmdldE5hbWUoKS5lcXVhbHMob3V0TWVzc2FnZS5nZXROYW1lKCkpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluL291dCBtZXNzYWdlCi0gICAgICAgICAgICAgICAgICAgICAgICB1c2VIb2xkZXJDbGFzc19qYXh3cyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAidXNlaG9sZGVyIiwgInRydWUiLCBtZXRob2RFbGVtZW50KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1ldGhvZEVsZW1lbnQuYXBwZW5kQ2hpbGQoZ2V0SW5wdXRFbGVtZW50KGRvYywKLSAgICAgICAgICAgICAgICAgICAgYmluZGluZ09wZXJhdGlvbiwgc29hcEhlYWRlcklucHV0UGFyYW1ldGVyTGlzdCkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChXU0RMVXRpbC5pc091dHB1dFByZXNlbnRGb3JNRVAobWVzc2FnZUV4Y2hhbmdlUGF0dGVybikpIHsKLSAgICAgICAgICAgIG1ldGhvZEVsZW1lbnQuYXBwZW5kQ2hpbGQoZ2V0T3V0cHV0RWxlbWVudChkb2MsCi0gICAgICAgICAgICAgICAgICAgIGJpbmRpbmdPcGVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgIHNvYXBIZWFkZXJPdXRwdXRQYXJhbWV0ZXJMaXN0KSk7Ci0gICAgICAgIH0KLSAgICAgICAgbWV0aG9kRWxlbWVudC5hcHBlbmRDaGlsZChnZXRGYXVsdEVsZW1lbnQoZG9jLAotICAgICAgICAgICAgICAgIGF4aXNPcGVyYXRpb24pKTsKLQotICAgICAgICBzZXRUcmFuc2ZlckNvZGluZyhheGlzT3BlcmF0aW9uLCBtZXRob2RFbGVtZW50LCBkb2MpOwotCi0gICAgICAgIFN0cmluZyBwcm9wZXJ0eSA9IChTdHJpbmcpIGdldEJpbmRpbmdQcm9wZXJ0eUZyb21PcGVyYXRpb24oCi0gICAgICAgICAgICAgICAgV1NETDJDb25zdGFudHMuQVRUUl9XSFRUUF9RVUVSWV9QQVJBTUVURVJfU0VQQVJBVE9SLAotICAgICAgICAgICAgICAgIGF4aXNPcGVyYXRpb24uZ2V0TmFtZSgpKTsKLSAgICAgICAgaWYgKHByb3BlcnR5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1ldGhvZEVsZW1lbnQuYXBwZW5kQ2hpbGQoZ2VuZXJhdGVPcHRpb25QYXJhbUNvbXBvbmVudChkb2MsCi0gICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLldTREwyQ29uc3RhbnRzLkFUVFJfV0hUVFBfUVVFUllfUEFSQU1FVEVSX1NFUEFSQVRPUiIsCi0gICAgICAgICAgICAgICAgICAgICJcIiIgKyBwcm9wZXJ0eSArICJcIiIpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3BlcnR5ID0gKFN0cmluZykgZ2V0QmluZGluZ1Byb3BlcnR5RnJvbU9wZXJhdGlvbigKLSAgICAgICAgICAgICAgICBXU0RMMkNvbnN0YW50cy5BVFRSX1dIVFRQX0xPQ0FUSU9OLAotICAgICAgICAgICAgICAgIGF4aXNPcGVyYXRpb24uZ2V0TmFtZSgpKTsKLSAgICAgICAgaWYgKHByb3BlcnR5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1ldGhvZEVsZW1lbnQuYXBwZW5kQ2hpbGQoZ2VuZXJhdGVPcHRpb25QYXJhbUNvbXBvbmVudChkb2MsCi0gICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLldTREwyQ29uc3RhbnRzLkFUVFJfV0hUVFBfTE9DQVRJT04iLAotICAgICAgICAgICAgICAgICAgICAiXCIiICsgcHJvcGVydHkgKyAiXCIiKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgbWVwID0gKFN0cmluZykgZ2V0QmluZGluZ1Byb3BlcnR5RnJvbU9wZXJhdGlvbihXU0RMMkNvbnN0YW50cy5BVFRSX1dTT0FQX01FUCwKLSAgICAgICAgICAgICAgICBheGlzT3BlcmF0aW9uLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgU3RyaW5nIGJpbmRpbmdUeXBlID0gbnVsbDsKLSAgICAgICAgaWYgKGF4aXNCaW5kaW5nICE9IG51bGwpIHsKLSAgICAgICAgICAgIGJpbmRpbmdUeXBlID0gYXhpc0JpbmRpbmcuZ2V0VHlwZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKFdTREwyQ29uc3RhbnRzLlVSSV9XU09BUF9NRVAuZXF1YWxzSWdub3JlQ2FzZShtZXApKSB7Ci0gICAgICAgICAgICBtZXRob2RFbGVtZW50LmFwcGVuZENoaWxkKGdlbmVyYXRlT3B0aW9uUGFyYW1Db21wb25lbnQoZG9jLAotICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHMuQ29uZmlndXJhdGlvbi5FTkFCTEVfUkVTVCIsCi0gICAgICAgICAgICAgICAgICAgICJ0cnVlIikpOwotICAgICAgICAgICAgbWV0aG9kRWxlbWVudC5hcHBlbmRDaGlsZChnZW5lcmF0ZU9wdGlvblBhcmFtQ29tcG9uZW50KGRvYywKLSAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uSFRUUF9NRVRIT0QiLAotICAgICAgICAgICAgICAgICAgICAiXCIiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50cy5Db25maWd1cmF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuSFRUUF9NRVRIT0RfR0VUICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIiKSk7Ci0gICAgICAgICAgICBtZXRob2RFbGVtZW50LmFwcGVuZENoaWxkKGdlbmVyYXRlT3B0aW9uUGFyYW1Db21wb25lbnQoZG9jLAotICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHMuQ29uZmlndXJhdGlvbi5DT05URU5UX1RZUEUiLAotICAgICAgICAgICAgICAgICAgICAiXCIiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkhUVFBDb25zdGFudHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5NRURJQV9UWVBFX1hfV1dXX0ZPUk0gKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIiIpKTsKLSAgICAgICAgICAgIG1ldGhvZEVsZW1lbnQuYXBwZW5kQ2hpbGQoZ2VuZXJhdGVPcHRpb25QYXJhbUNvbXBvbmVudChkb2MsCi0gICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50cy5Db25maWd1cmF0aW9uLk1FU1NBR0VfVFlQRSIsCi0gICAgICAgICAgICAgICAgICAgICJcIiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuSFRUUENvbnN0YW50cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLk1FRElBX1RZUEVfWF9XV1dfRk9STSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiIikpOwotICAgICAgICAgICAgbWV0aG9kRWxlbWVudC5hcHBlbmRDaGlsZChnZW5lcmF0ZU9wdGlvblBhcmFtQ29tcG9uZW50KGRvYywKLSAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uU09BUF9SRVNQT05TRV9NRVAiLAotICAgICAgICAgICAgICAgICAgICAidHJ1ZSIpKTsKLSAgICAgICAgfSBlbHNlIGlmIChiaW5kaW5nVHlwZSAhPSBudWxsICYmIGJpbmRpbmdUeXBlLmVxdWFscyhXU0RMMkNvbnN0YW50cy5VUklfV1NETDJfSFRUUCkpIHsKLQotICAgICAgICAgICAgbWV0aG9kRWxlbWVudC5hcHBlbmRDaGlsZChnZW5lcmF0ZU9wdGlvblBhcmFtQ29tcG9uZW50KGRvYywKLSAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uRU5BQkxFX1JFU1QiLAotICAgICAgICAgICAgICAgICAgICAidHJ1ZSIpKTsKLQotICAgICAgICAgICAgcHJvcGVydHkgPSAoU3RyaW5nKSBnZXRCaW5kaW5nUHJvcGVydHlGcm9tT3BlcmF0aW9uKFdTREwyQ29uc3RhbnRzLkFUVFJfV0hUVFBfTUVUSE9ELAotICAgICAgICAgICAgICAgICAgICBheGlzT3BlcmF0aW9uLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICBpZiAocHJvcGVydHkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1ldGhvZEVsZW1lbnQuYXBwZW5kQ2hpbGQoZ2VuZXJhdGVPcHRpb25QYXJhbUNvbXBvbmVudChkb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHMuQ29uZmlndXJhdGlvbi5IVFRQX01FVEhPRCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiXCIiICsgcHJvcGVydHkgKyAiXCIiKSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFXU0RMMkNvbnN0YW50cy5VUklfV1NPQVBfTUVQLmVxdWFsc0lnbm9yZUNhc2UobWVwKSkgewotICAgICAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIG5vIFdIVFRQX01FVEhPRCBkZWZpbmVkIHRoZW4gd2UgYmV0dGVyIGNvbXB1dGUgdGhlIGRlZmF1bHQgdmFsdWUgd2hpY2ggaXMgZ2V0IGlmIHRoZSBvcGVyYXRpb24KLSAgICAgICAgICAgICAgICAvLyBpcyB3c2RseDpzYWZlIG9yIHBvc3Qgb3RoZXJ3aXNlCi0gICAgICAgICAgICAgICAgUGFyYW1ldGVyIHNhZmUgPSBheGlzT3BlcmF0aW9uLmdldFBhcmFtZXRlcihXU0RMMkNvbnN0YW50cy5BVFRSX1dTRExYX1NBRkUpOwotICAgICAgICAgICAgICAgIGlmIChzYWZlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCgoQm9vbGVhbikgc2FmZS5nZXRWYWx1ZSgpKS5ib29sZWFuVmFsdWUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kRWxlbWVudC5hcHBlbmRDaGlsZChnZW5lcmF0ZU9wdGlvblBhcmFtQ29tcG9uZW50KGRvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uSFRUUF9NRVRIT0QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50cy5Db25maWd1cmF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuSFRUUF9NRVRIT0RfR0VUICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIiKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RFbGVtZW50LmFwcGVuZENoaWxkKGdlbmVyYXRlT3B0aW9uUGFyYW1Db21wb25lbnQoZG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHMuQ29uZmlndXJhdGlvbi5IVFRQX01FVEhPRCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5IVFRQX01FVEhPRF9QT1NUICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIiKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEJvb2xlYW4gdmFsdWUgPSAoQm9vbGVhbikgZ2V0QmluZGluZ1Byb3BlcnR5RnJvbU9wZXJhdGlvbigKLSAgICAgICAgICAgICAgICAgICAgV1NETDJDb25zdGFudHMuQVRUUl9XSFRUUF9JR05PUkVfVU5DSVRFRCwKLSAgICAgICAgICAgICAgICAgICAgYXhpc09wZXJhdGlvbi5nZXROYW1lKCkpOwotICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtZXRob2RFbGVtZW50LmFwcGVuZENoaWxkKGdlbmVyYXRlT3B0aW9uUGFyYW1Db21wb25lbnQoZG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uV1NETDJDb25zdGFudHMuQVRUUl9XSFRUUF9JR05PUkVfVU5DSVRFRCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiXCIiICsgdmFsdWUuYm9vbGVhblZhbHVlKCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIiKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHByb3BlcnR5ID0gKFN0cmluZykgZ2V0QmluZGluZ1Byb3BlcnR5RnJvbU9wZXJhdGlvbihXU0RMMkNvbnN0YW50cy5BVFRSX1dIVFRQX0NPREUsCi0gICAgICAgICAgICAgICAgICAgIGF4aXNPcGVyYXRpb24uZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIGlmIChwcm9wZXJ0eSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbWV0aG9kRWxlbWVudC5hcHBlbmRDaGlsZChnZW5lcmF0ZU9wdGlvblBhcmFtQ29tcG9uZW50KGRvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLldTREwyQ29uc3RhbnRzLkFUVFJfV0hUVFBfQ09ERSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiXCIiICsgcHJvcGVydHkgKyAiXCIiKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHByb3BlcnR5ID0gKFN0cmluZykgZ2V0QmluZGluZ1Byb3BlcnR5RnJvbU9wZXJhdGlvbigKLSAgICAgICAgICAgICAgICAgICAgV1NETDJDb25zdGFudHMuQVRUUl9XSFRUUF9JTlBVVF9TRVJJQUxJWkFUSU9OLAotICAgICAgICAgICAgICAgICAgICBheGlzT3BlcmF0aW9uLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICBpZiAocHJvcGVydHkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1ldGhvZEVsZW1lbnQuYXBwZW5kQ2hpbGQoZ2VuZXJhdGVPcHRpb25QYXJhbUNvbXBvbmVudChkb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHMuQ29uZmlndXJhdGlvbi5DT05URU5UX1RZUEUiLAotICAgICAgICAgICAgICAgICAgICAgICAgIlwiIiArIHByb3BlcnR5ICsgIlwiIikpOwotICAgICAgICAgICAgICAgIG1ldGhvZEVsZW1lbnQuYXBwZW5kQ2hpbGQoZ2VuZXJhdGVPcHRpb25QYXJhbUNvbXBvbmVudChkb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHMuQ29uZmlndXJhdGlvbi5NRVNTQUdFX1RZUEUiLAotICAgICAgICAgICAgICAgICAgICAgICAgIlwiIiArIHByb3BlcnR5ICsgIlwiIikpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1ldGhvZEVsZW1lbnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb25zIG9mIHRoZSBhcnJheSBlbGVtZW50cy4KLSAgICAgKiBAcGFyYW0gYXJyYXkgdGhlIGFycmF5IHRvIGJlIHByb2Nlc3NlZAotICAgICAqIEByZXR1cm4gdGhlIGVtcHR5IHN0cmluZyAiIiBpZiBhcnJheSBpcyBudWxsIG9yIGVtcHR5LCB0aGUgYXJyYXkgZWxlbWVudCBpZiBzaXplIGlzIDEsCi0gICAgICogb3IgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCB3aGVuIHNpemUgPiAxLgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGFycmF5VG9TdHJpbmcoT2JqZWN0W10gYXJyYXkpIHsKLSAgICAgICAgaWYgKGFycmF5ID09IG51bGwgfHwgYXJyYXkubGVuZ3RoID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiAiIjsKLSAgICAgICAgfQotICAgICAgICBpbnQgc2l6ZSA9IGFycmF5Lmxlbmd0aDsKLSAgICAgICAgaWYgKHNpemUgPT0gMSkgewotICAgICAgICAgICAgcmV0dXJuIFN0cmluZy52YWx1ZU9mKGFycmF5WzBdKTsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihTdHJpbmcudmFsdWVPZihhcnJheVswXSkpOwotICAgICAgICBmb3IgKGludCBpPTE7IGk8c2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKCIsIik7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKFN0cmluZy52YWx1ZU9mKGFycmF5W2ldKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgdHJhbnNmZXIgY29kaW5nIHByb3BlcnR5IG9mIHRoZSBpbnB1dCBtZXNzYWdlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYXhpc09wZXJhdGlvbgotICAgICAqIEBwYXJhbSBtZXRob2RFbGVtZW50Ci0gICAgICogQHBhcmFtIGRvYwotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzZXRUcmFuc2ZlckNvZGluZyhBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb24sIEVsZW1lbnQgbWV0aG9kRWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRG9jdW1lbnQgZG9jKSB7Ci0gICAgICAgIC8vIEFkZCBhIG9wdGlvblBhcmFtIGVsZW1lbnQgd2hpY2ggaG9sZHMgdGhlIHZhbHVlIG9mIHRyYW5zZmVyQ29kaW5nCi0gICAgICAgIFN0cmluZyB0cmFuc2ZlckNvZGluZyA9Ci0gICAgICAgICAgICAgICAgKFN0cmluZykgZ2V0QmluZGluZ1Byb3BlcnR5RnJvbU1lc3NhZ2UoV1NETDJDb25zdGFudHMuQVRUUl9XSFRUUF9DT05URU5UX0VOQ09ESU5HLAotICAgICAgICAgICAgICAgICAgICAgICAgYXhpc09wZXJhdGlvbi5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBXU0RMQ29uc3RhbnRzLldTRExfTUVTU0FHRV9ESVJFQ1RJT05fSU4pOwotICAgICAgICBpZiAoISIiLmVxdWFscyh0cmFuc2ZlckNvZGluZykpIHsKLSAgICAgICAgICAgIGlmICgiZ3ppcCIuZXF1YWxzKHRyYW5zZmVyQ29kaW5nKSB8fCAiY29tcHJlc3MiLmVxdWFscyh0cmFuc2ZlckNvZGluZykpIHsKLSAgICAgICAgICAgICAgICBtZXRob2RFbGVtZW50LmFwcGVuZENoaWxkKGdlbmVyYXRlT3B0aW9uUGFyYW1Db21wb25lbnQoZG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuSFRUUENvbnN0YW50cy5NQ19HWklQX1JFUVVFU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgInRydWUiKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGh0dHAgaGVhZGVyIHByb3BlcnRpZXMgbmVlZGVkIGZvciB0aGUgc3R1YgotICAgICAqCi0gICAgICogQHBhcmFtIGF4aXNPcGVyYXRpb24KLSAgICAgKiBAcGFyYW0gbWV0aG9kRWxlbWVudAotICAgICAqIEBwYXJhbSBkb2MKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2V0SHR0cEhlYWRlck9wdGlvbnMoQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uLCBFbGVtZW50IG1ldGhvZEVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERvY3VtZW50IGRvYykgewotICAgICAgICAvLyBBZGQgYSBvcHRpb25QYXJhbSBlbGVtZW50cyBoZXJlCi0KLSAgICB9Ci0KLSAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAvLyAgICAgICAgICAgICAgICAgICBVdGlsIE1ldGhvZHMKLSAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAgIHByb3RlY3RlZCBEb2N1bWVudCBnZXRFbXB0eURvY3VtZW50KCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgRG9jdW1lbnRCdWlsZGVyIGRvY3VtZW50QnVpbGRlciA9Ci0gICAgICAgICAgICAgICAgICAgIERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKLSAgICAgICAgICAgIHJldHVybiBkb2N1bWVudEJ1aWxkZXIubmV3RG9jdW1lbnQoKTsKLSAgICAgICAgfSBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSB3b3JkCi0gICAgICogQHJldHVybiBSZXR1cm5zIGNoYXJhY3RlciByZW1vdmVkIHN0cmluZy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIG1ha2VKYXZhQ2xhc3NOYW1lKFN0cmluZyB3b3JkKSB7Ci0gICAgICAgIGlmIChKYXZhVXRpbHMuaXNKYXZhS2V5d29yZCh3b3JkKSkgewotICAgICAgICAgICAgcmV0dXJuIEphdmFVdGlscy5tYWtlTm9uSmF2YUtleXdvcmQod29yZCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gSmF2YVV0aWxzLmNhcGl0YWxpemVGaXJzdENoYXIoSmF2YVV0aWxzLnhtbE5hbWVUb0phdmEod29yZCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXRpbGl0eSBtZXRob2QgdG8gYWRkIGFuIGF0dHJpYnV0ZSB0byBhIGdpdmVuIGVsZW1lbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZG9jdW1lbnQKLSAgICAgKiBAcGFyYW0gQXR0cmliTmFtZQotICAgICAqIEBwYXJhbSBhdHRyaWJWYWx1ZQotICAgICAqIEBwYXJhbSBlbGVtZW50Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkQXR0cmlidXRlKERvY3VtZW50IGRvY3VtZW50LCBTdHJpbmcgQXR0cmliTmFtZSwgU3RyaW5nIGF0dHJpYlZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50IGVsZW1lbnQpIHsKLSAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShkb2N1bWVudCwgQXR0cmliTmFtZSwgYXR0cmliVmFsdWUsIGVsZW1lbnQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBkb2MKLSAgICAgKiBAcGFyYW0gcm9vdEVsZW1lbnQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBmaWxsU3luY0F0dHJpYnV0ZXMoRG9jdW1lbnQgZG9jLCBFbGVtZW50IHJvb3RFbGVtZW50KSB7Ci0gICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJpc0FzeW5jIiwgdGhpcy5jb2RlR2VuQ29uZmlndXJhdGlvbi5pc0FzeW5jT24oKQotICAgICAgICAgICAgICAgID8gIjEiCi0gICAgICAgICAgICAgICAgOiAiMCIsIHJvb3RFbGVtZW50KTsKLSAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgImlzU3luYyIsIHRoaXMuY29kZUdlbkNvbmZpZ3VyYXRpb24uaXNTeW5jT24oKQotICAgICAgICAgICAgICAgID8gIjEiCi0gICAgICAgICAgICAgICAgOiAiMCIsIHJvb3RFbGVtZW50KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBkZWJ1Z2dpbmcgbWV0aG9kIC0gd3JpdGUgdGhlIG91dHB1dCB0byB0aGUgZGVidWdnZXIKLSAgICAgKgotICAgICAqIEBwYXJhbSBkZXNjcmlwdGlvbgotICAgICAqIEBwYXJhbSBkb2MKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBkZWJ1Z0xvZ0RvY3VtZW50KFN0cmluZyBkZXNjcmlwdGlvbiwgRG9jdW1lbnQgZG9jKSB7Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBET01Tb3VyY2Ugc291cmNlID0gbmV3IERPTVNvdXJjZShkb2MpOwotICAgICAgICAgICAgICAgIFN0cmluZ1dyaXRlciBzd3JpdGUgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgICAgICAgICAgICAgc3dyaXRlLndyaXRlKGRlc2NyaXB0aW9uKTsKLSAgICAgICAgICAgICAgICBzd3JpdGUud3JpdGUoIlxuIik7Ci0gICAgICAgICAgICAgICAgVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3VHJhbnNmb3JtZXIoKTsKLSAgICAgICAgICAgICAgICB0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eSgib21pdC14bWwtZGVjbGFyYXRpb24iLCAieWVzIik7Ci0gICAgICAgICAgICAgICAgdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5JTkRFTlQsICJ5ZXMiKTsKLSAgICAgICAgICAgICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0oc291cmNlLCBuZXcgU3RyZWFtUmVzdWx0KHN3cml0ZSkpOwotCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKHN3cml0ZS50b1N0cmluZygpKTsKLQotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgb3V0cHV0IGRpcmVjdG9yeSBmb3Igc291cmNlIGZpbGVzLgotICAgICAqCi0gICAgICogQHBhcmFtIG91dHB1dERpcgotICAgICAqIEByZXR1cm4gUmV0dXJucyBGaWxlLgotICAgICAqLwotICAgIHByb3RlY3RlZCBGaWxlIGdldE91dHB1dERpcmVjdG9yeShGaWxlIG91dHB1dERpciwgU3RyaW5nIGRpcjIpIHsKLSAgICAgICAgaWYgKGRpcjIgIT0gbnVsbCAmJiAhIiIuZXF1YWxzKGRpcjIpKSB7Ci0gICAgICAgICAgICBvdXRwdXREaXIgPSBuZXcgRmlsZShvdXRwdXREaXIsIGRpcjIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFvdXRwdXREaXIuZXhpc3RzKCkpIHsvLyROT04tU0VDLTMKLSAgICAgICAgICAgIG91dHB1dERpci5ta2RpcnMoKTsvLyROT04tU0VDLTIKLSAgICAgICAgfQotCi0KLSAgICAgICAgcmV0dXJuIG91dHB1dERpcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBIHJlc3VzYWJsZSBtZXRob2QgZm9yIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBpbnRlcmZhY2UgYW5kIGltcGxlbWVudGF0aW9uIHdyaXRpbmcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbW9kZWwKLSAgICAgKiBAcGFyYW0gd3JpdGVyCi0gICAgICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCB3cml0ZUZpbGUoRG9jdW1lbnQgbW9kZWwsIEZpbGVXcml0ZXIgd3JpdGVyKSB0aHJvd3MgSU9FeGNlcHRpb24sIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHdyaXRlci5sb2FkVGVtcGxhdGUoKTsKLQotICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSBtb2RlbC5nZXREb2N1bWVudEVsZW1lbnQoKS5nZXRBdHRyaWJ1dGUoInBhY2thZ2UiKTsKLSAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IG1vZGVsLmdldERvY3VtZW50RWxlbWVudCgpLmdldEF0dHJpYnV0ZSgibmFtZSIpOwotCi0gICAgICAgIHdyaXRlci5jcmVhdGVPdXRGaWxlKHBhY2thZ2VOYW1lLCBjbGFzc05hbWUpOwotCi0gICAgICAgIC8vIHVzZSB0aGUgZ2xvYmFsIHJlc29sdmVyCi0gICAgICAgIHdyaXRlci5wYXJzZShtb2RlbCwgcmVzb2x2ZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgdGhlIHNvYXAgYWN0aW9uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZG9jCi0gICAgICogQHBhcmFtIHJvb3RFbGVtZW50Ci0gICAgICogQHBhcmFtIHFOYW1lCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkU09BUEFjdGlvbihEb2N1bWVudCBkb2MsIEVsZW1lbnQgcm9vdEVsZW1lbnQsIFFOYW1lIHFOYW1lKSB7Ci0gICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJzb2FwYWN0aW9uIiwKLSAgICAgICAgICAgICAgICAoU3RyaW5nKSBnZXRCaW5kaW5nUHJvcGVydHlGcm9tT3BlcmF0aW9uKFdTREwyQ29uc3RhbnRzLkFUVFJfV1NPQVBfQUNUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgcU5hbWUpLAotICAgICAgICAgICAgICAgIHJvb3RFbGVtZW50KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIHRoZSBvdXRwdXQgYW5kIGZhdWx0IGFjdGlvbnMKLSAgICAgKgotICAgICAqIEBwYXJhbSBkb2MKLSAgICAgKiBAcGFyYW0gbWV0aG9kRWxlbWVudAotICAgICAqIEBwYXJhbSBvcGVyYXRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYWRkT3V0cHV0QW5kRmF1bHRBY3Rpb25zKERvY3VtZW50IGRvYywgRWxlbWVudCBtZXRob2RFbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXhpc09wZXJhdGlvbiBvcGVyYXRpb24pIHsKLSAgICAgICAgU3RyaW5nIG91dHB1dEFjdGlvbiA9IG9wZXJhdGlvbi5nZXRPdXRwdXRBY3Rpb24oKTsKLSAgICAgICAgaWYgKG91dHB1dEFjdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBFbGVtZW50IG91dHB1dEFjdGlvbkVsdCA9Ci0gICAgICAgICAgICAgICAgICAgIGRvYy5jcmVhdGVFbGVtZW50KG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzLk9VVFBVVF9BQ1RJT05fTUFQUElORyk7Ci0gICAgICAgICAgICBvdXRwdXRBY3Rpb25FbHQuc2V0QXR0cmlidXRlKEFkZHJlc3NpbmdDb25zdGFudHMuV1NBX0FDVElPTiwgb3V0cHV0QWN0aW9uKTsKLSAgICAgICAgICAgIG1ldGhvZEVsZW1lbnQuYXBwZW5kQ2hpbGQob3V0cHV0QWN0aW9uRWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZ1tdIGZhdWx0QWN0aW9uTmFtZXMgPSBvcGVyYXRpb24uZ2V0RmF1bHRBY3Rpb25OYW1lcygpOwotICAgICAgICBpZiAoZmF1bHRBY3Rpb25OYW1lcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZhdWx0QWN0aW9uTmFtZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBFbGVtZW50IGZhdWx0QWN0aW9uRWx0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRvYy5jcmVhdGVFbGVtZW50KG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzLkZBVUxUX0FDVElPTl9NQVBQSU5HKTsKLSAgICAgICAgICAgICAgICBmYXVsdEFjdGlvbkVsdC5zZXRBdHRyaWJ1dGUob3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHMuRkFVTFRfQUNUSU9OX05BTUUsCi0gICAgICAgICAgICAgICAgICAgICAgICBmYXVsdEFjdGlvbk5hbWVzW2ldKTsKLSAgICAgICAgICAgICAgICBmYXVsdEFjdGlvbkVsdC5zZXRBdHRyaWJ1dGUoQWRkcmVzc2luZ0NvbnN0YW50cy5XU0FfQUNUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uLmdldEZhdWx0QWN0aW9uKGZhdWx0QWN0aW9uTmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICBtZXRob2RFbGVtZW50LmFwcGVuZENoaWxkKGZhdWx0QWN0aW9uRWx0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIHBvcHVsYXRlIHRoZSBoZWFkZXIgcGFyYW1ldGVycwotICAgICAqCi0gICAgICogQHBhcmFtIHNvYXBIZWFkZXJQYXJhbWV0ZXJRTmFtZUxpc3QKLSAgICAgKiBAcGFyYW0gYmluZGluZ09wZXJhdGlvbgotICAgICAqIEBwYXJhbSBpbnB1dAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGFkZEhlYWRlck9wZXJhdGlvbnMoTGlzdCBzb2FwSGVhZGVyUGFyYW1ldGVyUU5hbWVMaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXhpc0JpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaW5wdXQpIHsKLQotICAgICAgICBBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb24gPSBiaW5kaW5nT3BlcmF0aW9uLmdldEF4aXNPcGVyYXRpb24oKTsKLSAgICAgICAgQXJyYXlMaXN0IGhlYWRlcnBhcmFtTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgU3RyaW5nIE1FUCA9IGF4aXNPcGVyYXRpb24uZ2V0TWVzc2FnZUV4Y2hhbmdlUGF0dGVybigpOwotICAgICAgICBpZiAoaW5wdXQpIHsKLSAgICAgICAgICAgIGlmIChXU0RMVXRpbC5pc0lucHV0UHJlc2VudEZvck1FUChNRVApKSB7Ci0KLSAgICAgICAgICAgICAgICBoZWFkZXJwYXJhbUxpc3QgPSAoQXJyYXlMaXN0KSBnZXRCaW5kaW5nUHJvcGVydHlGcm9tTWVzc2FnZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIFdTREwyQ29uc3RhbnRzLkFUVFJfV1NPQVBfSEVBREVSLCBiaW5kaW5nT3BlcmF0aW9uLmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9JTl9WQUxVRSk7Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChXU0RMVXRpbC5pc091dHB1dFByZXNlbnRGb3JNRVAoTUVQKSkgewotICAgICAgICAgICAgICAgIGhlYWRlcnBhcmFtTGlzdCA9IChBcnJheUxpc3QpIGdldEJpbmRpbmdQcm9wZXJ0eUZyb21NZXNzYWdlKAotICAgICAgICAgICAgICAgICAgICAgICAgV1NETDJDb25zdGFudHMuQVRUUl9XU09BUF9IRUFERVIsIGJpbmRpbmdPcGVyYXRpb24uZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgV1NETENvbnN0YW50cy5NRVNTQUdFX0xBQkVMX09VVF9WQUxVRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGhlYWRlcnBhcmFtTGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gaGVhZGVycGFyYW1MaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICBTT0FQSGVhZGVyTWVzc2FnZSBoZWFkZXIgPSAoU09BUEhlYWRlck1lc3NhZ2UpIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgICAgICBzb2FwSGVhZGVyUGFyYW1ldGVyUU5hbWVMaXN0LmFkZChoZWFkZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBwb3B1bGF0ZSB0aGUgaGVhZGVyIHBhcmFtZXRlcnMgdG8gZmF1bHRzCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc29hcEhlYWRlclBhcmFtZXRlclFOYW1lTGlzdAotICAgICAqIEBwYXJhbSBheGlzT3BlcmF0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkSGVhZGVyT3BlcmF0aW9uc1RvRmF1bHQoTGlzdCBzb2FwSGVhZGVyUGFyYW1ldGVyUU5hbWVMaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF4aXNPcGVyYXRpb24gYXhpc09wZXJhdGlvbikgewotICAgICAgICBBcnJheUxpc3QgaGVhZGVycGFyYW1MaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBBcnJheUxpc3QgZmF1bHRNZXNzYWdlcyA9IGF4aXNPcGVyYXRpb24uZ2V0RmF1bHRNZXNzYWdlcygpOwotICAgICAgICBJdGVyYXRvciBpdGVyID0gZmF1bHRNZXNzYWdlcy5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIEF4aXNNZXNzYWdlIGF4aXNGYXVsdE1lc3NhZ2UgPSAoQXhpc01lc3NhZ2UpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgaGVhZGVycGFyYW1MaXN0LmFkZEFsbCgoQXJyYXlMaXN0KSBnZXRCaW5kaW5nUHJvcGVydHlGcm9tTWVzc2FnZUZhdWx0KAotICAgICAgICAgICAgICAgICAgICBXU0RMMkNvbnN0YW50cy5BVFRSX1dTT0FQX0hFQURFUiwgYXhpc09wZXJhdGlvbi5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgIGF4aXNGYXVsdE1lc3NhZ2UuZ2V0TmFtZSgpKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaGVhZGVycGFyYW1MaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBoZWFkZXJwYXJhbUxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIFNPQVBIZWFkZXJNZXNzYWdlIGhlYWRlciA9IChTT0FQSGVhZGVyTWVzc2FnZSkgaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgIHNvYXBIZWFkZXJQYXJhbWV0ZXJRTmFtZUxpc3QuYWRkKGhlYWRlci5nZXRFbGVtZW50KCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGlucHV0IGVsZW1lbnQKLSAgICAgKgotICAgICAqIEBwYXJhbSBkb2MKLSAgICAgKiBAcGFyYW0gYmluZGluZ09wZXJhdGlvbgotICAgICAqIEBwYXJhbSBoZWFkZXJQYXJhbWV0ZXJRTmFtZUxpc3QKLSAgICAgKiBAcmV0dXJuIERPTSBlbGVtZW50Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIEVsZW1lbnQgZ2V0SW5wdXRFbGVtZW50KERvY3VtZW50IGRvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXhpc0JpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdCBoZWFkZXJQYXJhbWV0ZXJRTmFtZUxpc3QpIHsKLSAgICAgICAgQXhpc09wZXJhdGlvbiBvcGVyYXRpb24gPSBiaW5kaW5nT3BlcmF0aW9uLmdldEF4aXNPcGVyYXRpb24oKTsKLSAgICAgICAgRWxlbWVudCBpbnB1dEVsdCA9IGRvYy5jcmVhdGVFbGVtZW50KCJpbnB1dCIpOwotICAgICAgICBTdHJpbmcgbWVwID0gb3BlcmF0aW9uLmdldE1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4oKTsKLQotICAgICAgICBpZiAoV1NETFV0aWwuaXNJbnB1dFByZXNlbnRGb3JNRVAobWVwKSkgewotCi0gICAgICAgICAgICBFbGVtZW50W10gcGFyYW0gPSBnZXRJbnB1dFBhcmFtRWxlbWVudChkb2MsIG9wZXJhdGlvbik7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaW5wdXRFbHQuYXBwZW5kQ2hpbGQocGFyYW1baV0pOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBMaXN0IHBhcmFtZXRlckVsZW1lbnRMaXN0ID0gZ2V0UGFyYW1ldGVyRWxlbWVudExpc3QoZG9jLCBoZWFkZXJQYXJhbWV0ZXJRTmFtZUxpc3QsCi0gICAgICAgICAgICAgICAgICAgIFdTRExDb25zdGFudHMuU09BUF9IRUFERVIpOwotICAgICAgICAgICAgcGFyYW1ldGVyRWxlbWVudExpc3QuYWRkQWxsKGdldFBhcmFtZXRlckVsZW1lbnRMaXN0Rm9ySHR0cEhlYWRlcihkb2MsCi0gICAgICAgICAgICAgICAgICAgIChBcnJheUxpc3QpIGdldEJpbmRpbmdQcm9wZXJ0eUZyb21NZXNzYWdlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdTREwyQ29uc3RhbnRzLkFUVFJfV0hUVFBfSEVBREVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbi5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NETENvbnN0YW50cy5XU0RMX01FU1NBR0VfRElSRUNUSU9OX0lOKSwKLSAgICAgICAgICAgICAgICAgICAgV1NETENvbnN0YW50cy5IVFRQX0hFQURFUikpOwotICAgICAgICAgICAgcGFyYW1ldGVyRWxlbWVudExpc3QuYWRkQWxsKGdldFBhcmFtZXRlckVsZW1lbnRMaXN0Rm9yU09BUE1vZHVsZXMoZG9jLAotICAgICAgICAgICAgICAgICAgICAoQXJyYXlMaXN0KSBnZXRCaW5kaW5nUHJvcGVydHlGcm9tTWVzc2FnZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU0RMMkNvbnN0YW50cy5BVFRSX1dTT0FQX01PRFVMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24uZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdTRExDb25zdGFudHMuV1NETF9NRVNTQUdFX0RJUkVDVElPTl9JTikpKTsKLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbWV0ZXJFbGVtZW50TGlzdC5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIGlucHV0RWx0LmFwcGVuZENoaWxkKChFbGVtZW50KSBwYXJhbWV0ZXJFbGVtZW50TGlzdC5nZXQoaSkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKgotICAgICAgICAgICAgKiBTZXR0aW5nIHRoZSBlZmZlY3RpdmUgcG9saWN5IG9mIGlucHV0IG1lc3NhZ2UKLSAgICAgICAgICAgICovCi0gICAgICAgICAgICBQb2xpY3kgcG9saWN5ID0gZ2V0QmluZGluZ1BvbGljeUZyb21NZXNzYWdlKGJpbmRpbmdPcGVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgIFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9JTl9WQUxVRSk7Ci0KLSAgICAgICAgICAgIGlmIChwb2xpY3kgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJwb2xpY3kiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvbGljeVV0aWwuZ2V0U2FmZVN0cmluZyhQb2xpY3lVdGlsLnBvbGljeUNvbXBvbmVudFRvU3RyaW5nKHBvbGljeSkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0RWx0KTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImNhbid0IHNlcmlhbGl6ZSB0aGUgcG9saWN5IC4uIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlucHV0RWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgZmF1bHQgZWxlbWVudCAtIE5vIGhlYWRlciBmYXVsdHMgYXJlIHN1cHBvcnRlZAotICAgICAqCi0gICAgICogQHBhcmFtIGRvYwotICAgICAqIEBwYXJhbSBvcGVyYXRpb24KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRWxlbWVudCBnZXRGYXVsdEVsZW1lbnQoRG9jdW1lbnQgZG9jLCBBeGlzT3BlcmF0aW9uIG9wZXJhdGlvbikgewotICAgICAgICBFbGVtZW50IGZhdWx0RWx0ID0gZG9jLmNyZWF0ZUVsZW1lbnQoImZhdWx0Iik7Ci0gICAgICAgIEVsZW1lbnRbXSBwYXJhbSA9IGdldEZhdWx0UGFyYW1FbGVtZW50cyhkb2MsIG9wZXJhdGlvbik7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbS5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgZmF1bHRFbHQuYXBwZW5kQ2hpbGQocGFyYW1baV0pOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhdWx0RWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZpbmRzIHRoZSBvdXRwdXQgZWxlbWVudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBkb2MKLSAgICAgKiBAcGFyYW0gYmluZGluZ09wZXJhdGlvbgotICAgICAqIEBwYXJhbSBoZWFkZXJQYXJhbWV0ZXJRTmFtZUxpc3QKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRWxlbWVudCBnZXRPdXRwdXRFbGVtZW50KERvY3VtZW50IGRvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF4aXNCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0IGhlYWRlclBhcmFtZXRlclFOYW1lTGlzdCkgewotICAgICAgICBBeGlzT3BlcmF0aW9uIG9wZXJhdGlvbiA9IGJpbmRpbmdPcGVyYXRpb24uZ2V0QXhpc09wZXJhdGlvbigpOwotICAgICAgICBFbGVtZW50IG91dHB1dEVsdCA9IGRvYy5jcmVhdGVFbGVtZW50KCJvdXRwdXQiKTsKLSAgICAgICAgU3RyaW5nIG1lcCA9IG9wZXJhdGlvbi5nZXRNZXNzYWdlRXhjaGFuZ2VQYXR0ZXJuKCk7Ci0KLQotICAgICAgICBpZiAoV1NETFV0aWwuaXNPdXRwdXRQcmVzZW50Rm9yTUVQKG1lcCkpIHsKLQotICAgICAgICAgICAgRWxlbWVudCBwYXJhbSA9IGdldE91dHB1dFBhcmFtRWxlbWVudChkb2MsIG9wZXJhdGlvbik7Ci0KLSAgICAgICAgICAgIGlmIChwYXJhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgb3V0cHV0RWx0LmFwcGVuZENoaWxkKHBhcmFtKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgTGlzdCBvdXRwdXRFbGVtZW50TGlzdCA9IGdldFBhcmFtZXRlckVsZW1lbnRMaXN0KGRvYywgaGVhZGVyUGFyYW1ldGVyUU5hbWVMaXN0LAotICAgICAgICAgICAgICAgICAgICBXU0RMQ29uc3RhbnRzLlNPQVBfSEVBREVSKTsKLSAgICAgICAgICAgIG91dHB1dEVsZW1lbnRMaXN0LmFkZEFsbChnZXRQYXJhbWV0ZXJFbGVtZW50TGlzdEZvckh0dHBIZWFkZXIoZG9jLAotICAgICAgICAgICAgICAgICAgICAoQXJyYXlMaXN0KSBnZXRCaW5kaW5nUHJvcGVydHlGcm9tTWVzc2FnZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU0RMMkNvbnN0YW50cy5BVFRSX1dIVFRQX0hFQURFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24uZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdTRExDb25zdGFudHMuV1NETF9NRVNTQUdFX0RJUkVDVElPTl9PVVQpLAotICAgICAgICAgICAgICAgICAgICBXU0RMQ29uc3RhbnRzLkhUVFBfSEVBREVSKSk7Ci0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgb3V0cHV0RWxlbWVudExpc3Quc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBvdXRwdXRFbHQuYXBwZW5kQ2hpbGQoKEVsZW1lbnQpIG91dHB1dEVsZW1lbnRMaXN0LmdldChpKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAqIFNldHRpbmcgdGhlIGVmZmVjdGl2ZSBwb2xpY3kgZm9yIHRoZSBvdXRwdXQgbWVzc2FnZS4KLSAgICAgICAgICAgICovCi0gICAgICAgICAgICBQb2xpY3kgcG9saWN5ID0gZ2V0QmluZGluZ1BvbGljeUZyb21NZXNzYWdlKGJpbmRpbmdPcGVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgIFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9PVVRfVkFMVUUpOwotCi0gICAgICAgICAgICBpZiAocG9saWN5ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAicG9saWN5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb2xpY3lVdGlsLmdldFNhZmVTdHJpbmcoUG9saWN5VXRpbC5wb2xpY3lDb21wb25lbnRUb1N0cmluZyhwb2xpY3kpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRFbHQpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiY2FuJ3Qgc2VyaWFsaXplIHRoZSBwb2xpY3kgLi4iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG91dHB1dEVsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gZG9jCi0gICAgICogQHBhcmFtIG9wZXJhdGlvbgotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgcGFyYW1ldGVyIGVsZW1lbnQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEVsZW1lbnRbXSBnZXRGYXVsdFBhcmFtRWxlbWVudHMoRG9jdW1lbnQgZG9jLCBBeGlzT3BlcmF0aW9uIG9wZXJhdGlvbikgewotICAgICAgICBBcnJheUxpc3QgcGFyYW1zID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBBcnJheUxpc3QgZmF1bHRNZXNzYWdlcyA9IG9wZXJhdGlvbi5nZXRGYXVsdE1lc3NhZ2VzKCk7Ci0KLSAgICAgICAgaWYgKGZhdWx0TWVzc2FnZXMgIT0gbnVsbCAmJiAhZmF1bHRNZXNzYWdlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIEVsZW1lbnQgcGFyYW1FbGVtZW50OwotICAgICAgICAgICAgQXhpc01lc3NhZ2UgbXNnOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmYXVsdE1lc3NhZ2VzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgcGFyYW1FbGVtZW50ID0gZG9jLmNyZWF0ZUVsZW1lbnQoInBhcmFtIik7Ci0gICAgICAgICAgICAgICAgbXNnID0gKEF4aXNNZXNzYWdlKSBmYXVsdE1lc3NhZ2VzLmdldChpKTsKLQotICAgICAgICAgICAgICAgIGlmIChtc2cuZ2V0RWxlbWVudFFOYW1lKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRWxlbWVudCBRTmFtZSBpcyBudWxsIGZvciAiICsgbXNnLmdldE5hbWUoKSArICIhIik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy9hcyBmb3IgdGhlIG5hbWUgb2YgYSBmYXVsdCwgd2UgZ2VuZXJhdGUgYW4gZXhjZXB0aW9uCi0gICAgICAgICAgICAgICAgU3RyaW5nIGZhdWx0Q29tbWVudCA9ICIiOwotICAgICAgICAgICAgICAgIGlmIChtc2cuZ2V0RG9jdW1lbnRhdGlvbigpICE9IG51bGwpewotICAgICAgICAgICAgICAgICAgICBmYXVsdENvbW1lbnQgPSBtc2cuZ2V0RG9jdW1lbnRhdGlvbigpLnRyaW0oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgImNvbW1lbnQiLCBmYXVsdENvbW1lbnQsIHBhcmFtRWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgIm5hbWUiLAotICAgICAgICAgICAgICAgICAgICAgICAgKFN0cmluZykgZnVsbHlRdWFsaWZpZWRGYXVsdENsYXNzTmFtZU1hcC5nZXQobXNnLmdldE5hbWUoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbUVsZW1lbnQpOwotICAgICAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJzaG9ydE5hbWUiLAotICAgICAgICAgICAgICAgICAgICAgICAgKFN0cmluZykgZmF1bHRDbGFzc05hbWVNYXAuZ2V0KG1zZy5nZXROYW1lKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1FbGVtZW50KTsKLQotICAgICAgICAgICAgICAgIC8vIGF0dGFjaCB0aGUgbmFtZXNwYWNlIGFuZCB0aGUgbG9jYWxOYW1lCi0gICAgICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgIm5hbWVzcGFjZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBtc2cuZ2V0RWxlbWVudFFOYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbUVsZW1lbnQpOwotICAgICAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJsb2NhbG5hbWUiLAotICAgICAgICAgICAgICAgICAgICAgICAgbXNnLmdldEVsZW1lbnRRTmFtZSgpLmdldExvY2FsUGFydCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1FbGVtZW50KTsKLQotICAgICAgICAgICAgICAgIGlmIChtc2cuZ2V0RWxlbWVudFFOYW1lKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBFbGVtZW50IHFOYW1lRWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50KCJxbmFtZSIpOwotICAgICAgICAgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAibnN1cmkiLCBtc2cuZ2V0RWxlbWVudFFOYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCksIHFOYW1lRWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJsb2NhbG5hbWUiLCBtc2cuZ2V0RWxlbWVudFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCksIHFOYW1lRWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmFtRWxlbWVudC5hcHBlbmRDaGlsZChxTmFtZUVsZW1lbnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvL3RoZSB0eXBlIHJlcHJlc2VudHMgdGhlIHR5cGUgdGhhdCB3aWxsIGJlIHdyYXBwZWQgYnkgdGhpcwotICAgICAgICAgICAgICAgIC8vbmFtZQotICAgICAgICAgICAgICAgIFN0cmluZyB0eXBlTWFwcGluZyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1hcHBlci5nZXRUeXBlTWFwcGluZ05hbWUobXNnLmdldEVsZW1lbnRRTmFtZSgpKTsKLSAgICAgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAidHlwZSIsICh0eXBlTWFwcGluZyA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgPyAiIgotICAgICAgICAgICAgICAgICAgICAgICAgOiB0eXBlTWFwcGluZywgcGFyYW1FbGVtZW50KTsKLQotICAgICAgICAgICAgICAgIC8vYWRkIHRoZSBzaG9ydCBuYW1lCi0gICAgICAgICAgICAgICAgYWRkU2hvcnRUeXBlKHBhcmFtRWxlbWVudCwgKG1zZy5nZXRFbGVtZW50UU5hbWUoKSA9PSBudWxsKSA/IG51bGwgOgotICAgICAgICAgICAgICAgICAgICAgICAgbXNnLmdldEVsZW1lbnRRTmFtZSgpLmdldExvY2FsUGFydCgpKTsKLQotICAgICAgICAgICAgICAgIFN0cmluZyBhdHRyaWJWYWx1ZSA9IChTdHJpbmcpIGluc3RhbnRpYXRhYmxlTWVzc2FnZUNsYXNzTmFtZXMuCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXQobXNnLmdldEVsZW1lbnRRTmFtZSgpKTsKLSAgICAgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAiaW5zdGFudGlhdGFibGVUeXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYlZhbHVlID09IG51bGwgPyAiIiA6IGF0dHJpYlZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1FbGVtZW50KTsKLQotICAgICAgICAgICAgICAgIC8vIGFkZCBhbiBleHRyYSBhdHRyaWJ1dGUgdG8gc2F5IHdoZXRoZXIgdGhlIHR5cGUgbWFwcGluZyBpcwotICAgICAgICAgICAgICAgIC8vIHRoZSBkZWZhdWx0Ci0gICAgICAgICAgICAgICAgaWYgKG1hcHBlci5nZXREZWZhdWx0TWFwcGluZ05hbWUoKS5lcXVhbHModHlwZU1hcHBpbmcpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJkZWZhdWx0IiwgInllcyIsIHBhcmFtRWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJ2YWx1ZSIsIGdldFBhcmFtSW5pdGlhbGl6ZXIodHlwZU1hcHBpbmcpLAotICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1FbGVtZW50KTsKLQotICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSBtc2cuZ2V0RXh0ZW5zaWJpbGl0eUF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBwcm9jZXNzIGV4dGVuc2liaWxpdHkgYXR0cmlidXRlcwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwYXJhbXMuYWRkKHBhcmFtRWxlbWVudCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiAoRWxlbWVudFtdKSBwYXJhbXMudG9BcnJheShuZXcgRWxlbWVudFtwYXJhbXMuc2l6ZSgpXSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEVsZW1lbnRbXXt9Oy8vcmV0dXJuIGVtcHR5IGFycmF5Ci0gICAgICAgIH0KLQotCi0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gZG9jCi0gICAgICogQHBhcmFtIG9wZXJhdGlvbgotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgcGFyYW1ldGVyIGVsZW1lbnQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEVsZW1lbnRbXSBnZXRJbnB1dFBhcmFtRWxlbWVudChEb2N1bWVudCBkb2MsIEF4aXNPcGVyYXRpb24gb3BlcmF0aW9uKSB7Ci0KLSAgICAgICAgQXhpc01lc3NhZ2UgaW5wdXRNZXNzYWdlID0gb3BlcmF0aW9uLmdldE1lc3NhZ2UoV1NETENvbnN0YW50cy5NRVNTQUdFX0xBQkVMX0lOX1ZBTFVFKTsKLSAgICAgICAgTGlzdCBwYXJhbUVsZW1lbnRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBpZiAoaW5wdXRNZXNzYWdlICE9IG51bGwpIHsKLQotICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgIHdyYXBwZWQgY29tcG9uZW50IC0gYWRkIHRoZSB0eXBlIG1hcHBpbmcKLSAgICAgICAgICAgIEVsZW1lbnQgbWFpblBhcmFtZXRlciA9IGdlbmVyYXRlUGFyYW1Db21wb25lbnQoZG9jLAotICAgICAgICAgICAgICAgICAgICB0aGlzLm1hcHBlci5nZXRQYXJhbWV0ZXJOYW1lKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0TWVzc2FnZS5nZXRFbGVtZW50UU5hbWUoKSksCi0gICAgICAgICAgICAgICAgICAgIHRoaXMubWFwcGVyLmdldFR5cGVNYXBwaW5nTmFtZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dE1lc3NhZ2UuZ2V0RWxlbWVudFFOYW1lKCkpLAotICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24uZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICBpbnB1dE1lc3NhZ2UuZ2V0RWxlbWVudFFOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgIGlucHV0TWVzc2FnZS5nZXRQYXJ0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICBmYWxzZSxmYWxzZQotICAgICAgICAgICAgKTsKLQotICAgICAgICAgICAgcGFyYW1FbGVtZW50TGlzdC5hZGQobWFpblBhcmFtZXRlcik7Ci0KLSAgICAgICAgICAgIC8vaWYgdGhlIHVud3JhcHBpbmcgb3IgYmFja1dvcmRDb21wYXRpYmlsaXR5IGZsYWcgaXMgb24gdGhlbiB3ZSBoYXZlIHRvCi0gICAgICAgICAgICAvL3B1dCB0aGUgZWxlbWVudCBjb21wbGV4IHR5cGUgaWYgaXQgZXhpdHMKLSAgICAgICAgICAgIGlmICh0aGlzLmNvZGVHZW5Db25maWd1cmF0aW9uLmlzQmFja3dvcmRDb21wYXRpYmlsaXR5TW9kZSgpIHx8Ci0gICAgICAgICAgICAgICAgICAgICF0aGlzLmNvZGVHZW5Db25maWd1cmF0aW9uLmlzUGFyYW1ldGVyc1dyYXBwZWQoKSkgewotICAgICAgICAgICAgICAgIGlmIChpbnB1dE1lc3NhZ2UuZ2V0UGFyYW1ldGVyKENvbnN0YW50cy5DT01QTEVYX1RZUEUpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgUGFyYW1ldGVyIHBhcmFtZXRlciA9IGlucHV0TWVzc2FnZS5nZXRQYXJhbWV0ZXIoQ29uc3RhbnRzLkNPTVBMRVhfVFlQRSk7Ci0gICAgICAgICAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJjb21wbGV4dHlwZSIsIChTdHJpbmcpIHBhcmFtZXRlci5nZXRWYWx1ZSgpLCBtYWluUGFyYW1ldGVyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vYWRkZWQgdGhlIHVud2FwcGFyYW1ldGVycyBhdHRyaWJ1dGUgdGhpcyBpcyB1c2UgZnVsbCB0byB1bndyYXAgaWYgcGFyYW1lcnRlcnMgYXJlCi0gICAgICAgICAgICAvL3plcm8KLSAgICAgICAgICAgIGlmICghdGhpcy5jb2RlR2VuQ29uZmlndXJhdGlvbi5pc1BhcmFtZXRlcnNXcmFwcGVkKCkpewotICAgICAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJ1bndyYXBwUGFyYW1ldGVycyIsICJ0cnVlIiwgbWFpblBhcmFtZXRlcik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHRoaXMgbWVzc2FnZSBoYXMgYmVlbiB1bndyYXBwZWQgLSBmaW5kIHRoZSBjb3JyZWN0IHJlZmVyZW5jZXMgb2YgdGhlCi0gICAgICAgICAgICAvLyB0aGUgbWVzc2FnZSBieSBsb29raW5nIGF0IHRoZSB1bndyYXBwZWQgZGV0YWlscyBvYmplY3QgYW5kIGF0dGFjaCB0aGUKLSAgICAgICAgICAgIC8vIG5lZWRlZCBwYXJhbWV0ZXJzIGluc2lkZSBtYWluIHBhcmFtZXRlciBlbGVtZW50Ci0gICAgICAgICAgICBpZiAoaW5wdXRNZXNzYWdlLmdldFBhcmFtZXRlcihDb25zdGFudHMuVU5XUkFQUEVEX0tFWSkgIT0gbnVsbCkgewotCi0gICAgICAgICAgICAgICAgLy93ZSBoYXZlIHRoaXMgdW53cmFwcGVkIGVhcmxpZXIuIGdldCB0aGUgaW5mbyBob2xkZXIKLSAgICAgICAgICAgICAgICAvL2FuZCB0aGVuIGxvb2sgYXQgdGhlIHBhcmFtZXRlcnMKLSAgICAgICAgICAgICAgICBQYXJhbWV0ZXIgZGV0YWlsc1BhcmFtZXRlciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dE1lc3NhZ2UuZ2V0UGFyYW1ldGVyKENvbnN0YW50cy5VTldSQVBQRURfREVUQUlMUyk7Ci0gICAgICAgICAgICAgICAgTWVzc2FnZVBhcnRJbmZvcm1hdGlvbkhvbGRlciBpbmZvSG9sZGVyID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChNZXNzYWdlUGFydEluZm9ybWF0aW9uSG9sZGVyKSBkZXRhaWxzUGFyYW1ldGVyLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgTGlzdCBwYXJ0c0xpc3QgPSBpbmZvSG9sZGVyLmdldFBhcnRzTGlzdCgpOwotICAgICAgICAgICAgICAgIHdyYXBwZWRfamF4d3MgPSB0cnVlOwotICAgICAgICAgICAgICAgIC8vcG9wdWxhdGUgdGhlIHBhcnRzIGxpc3QgLSB0aGlzIGxpc3QgaXMgbmVlZGVkIHRvIGdlbmVyYXRlIG11bHRpcGxlCi0gICAgICAgICAgICAgICAgLy9wYXJhbWV0ZXJzIGluIHRoZSBzaWduYXR1cmVzCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJ0c0xpc3Quc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgUU5hbWUgcU5hbWUgPSAoUU5hbWUpIHBhcnRzTGlzdC5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgIG1haW5QYXJhbWV0ZXIuYXBwZW5kQ2hpbGQoZ2VuZXJhdGVQYXJhbUNvbXBvbmVudChkb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXBwZXIuZ2V0UGFyYW1ldGVyTmFtZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFOYW1lKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1hcHBlci5nZXRUeXBlTWFwcGluZ05hbWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxTmFtZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uLmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBxTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBxTmFtZS5nZXRMb2NhbFBhcnQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGhpcy5tYXBwZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRUeXBlTWFwcGluZ1N0YXR1cygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcU5hbWUpICE9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuQVJSQVlfVFlQRS5lcXVhbHMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1hcHBlci5nZXRUeXBlTWFwcGluZ1N0YXR1cygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcU5hbWUpKSkKLSAgICAgICAgICAgICAgICAgICAgKTsKLSAgICAgICAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAgfQotCi0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAoRWxlbWVudFtdKSBwYXJhbUVsZW1lbnRMaXN0LnRvQXJyYXkoCi0gICAgICAgICAgICAgICAgbmV3IEVsZW1lbnRbcGFyYW1FbGVtZW50TGlzdC5zaXplKCldKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBIGNvbnZlbmllbnQgbWV0aG9kIGZvciB0aGUgZ2VuZXJhdGluZyB0aGUgcGFyYW1ldGVyIGVsZW1lbnQKLSAgICAgKgotICAgICAqIEBwYXJhbSBkb2MKLSAgICAgKiBAcGFyYW0gcGFyYW1OYW1lCi0gICAgICogQHBhcmFtIHBhcmFtVHlwZQotICAgICAqIEByZXR1cm4gRE9NIEVsZW1lbnQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRWxlbWVudCBnZW5lcmF0ZVBhcmFtQ29tcG9uZW50KERvY3VtZW50IGRvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXJhbU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGFyYW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUU5hbWUgb3BlcmF0aW9uTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFOYW1lIHBhcmFtUU5hbWUpIHsKLSAgICAgICAgcmV0dXJuIGdlbmVyYXRlUGFyYW1Db21wb25lbnQoZG9jLCBwYXJhbU5hbWUsIHBhcmFtVHlwZSwgb3BlcmF0aW9uTmFtZSwgcGFyYW1RTmFtZSwgbnVsbCwKLSAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEEgY29udmVuaWVudCBtZXRob2QgZm9yIHRoZSBnZW5lcmF0aW5nIHRoZSBwYXJhbWV0ZXIgZWxlbWVudAotICAgICAqCi0gICAgICogQHBhcmFtIGRvYwotICAgICAqIEBwYXJhbSBwYXJhbU5hbWUKLSAgICAgKiBAcGFyYW0gcGFyYW1UeXBlCi0gICAgICogQHJldHVybiBET00gRWxlbWVudAotICAgICAqLwotICAgIHByb3RlY3RlZCBFbGVtZW50IGdlbmVyYXRlUGFyYW1Db21wb25lbnQoRG9jdW1lbnQgZG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhcmFtTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXJhbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRTmFtZSBwYXJhbVFOYW1lKSB7Ci0gICAgICAgIHJldHVybiBnZW5lcmF0ZVBhcmFtQ29tcG9uZW50KGRvYywgcGFyYW1OYW1lLCBwYXJhbVR5cGUsIG51bGwsIHBhcmFtUU5hbWUsIG51bGwsIGZhbHNlLAotICAgICAgICAgICAgICAgIGZhbHNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBIGNvbnZlbmllbnQgbWV0aG9kIGZvciB0aGUgZ2VuZXJhdGluZyBvcHRpb25QYXJhbSBjb21wb25lbnRzCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZG9jCi0gICAgICogQHBhcmFtIG5hbWUKLSAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKiBAcmV0dXJuIEVsZW1lbnQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRWxlbWVudCBnZW5lcmF0ZU9wdGlvblBhcmFtQ29tcG9uZW50KERvY3VtZW50IGRvYywgU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgewotCi0gICAgICAgIEVsZW1lbnQgb3B0aW9uUGFyYW1FbGVtZW50ID0gZG9jLmNyZWF0ZUVsZW1lbnQoIm9wdGlvblBhcmFtIik7Ci0gICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJuYW1lIiwgbmFtZSwgb3B0aW9uUGFyYW1FbGVtZW50KTsKLSAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgInZhbHVlIiwgdmFsdWUsIG9wdGlvblBhcmFtRWxlbWVudCk7Ci0gICAgICAgIHJldHVybiBvcHRpb25QYXJhbUVsZW1lbnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQSBjb252ZW5pZW50IG1ldGhvZCBmb3IgdGhlIGdlbmVyYXRpbmcgdGhlIHBhcmFtZXRlciBlbGVtZW50Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gZG9jCi0gICAgICogQHBhcmFtIHBhcmFtTmFtZQotICAgICAqIEBwYXJhbSBwYXJhbVR5cGUKLSAgICAgKiBAcGFyYW0gb3BOYW1lCi0gICAgICogQHBhcmFtIHBhcmFtTmFtZQotICAgICAqLwotICAgIHByb3RlY3RlZCBFbGVtZW50IGdlbmVyYXRlUGFyYW1Db21wb25lbnQoRG9jdW1lbnQgZG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhcmFtTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXJhbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRTmFtZSBvcE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRTmFtZSBwYXJhbVFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhcnROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc1ByaW1pdGl2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNBcnJheSkgewotICAgICAgICBFbGVtZW50IHBhcmFtRWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50KCJwYXJhbSIpOwotICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAibmFtZSIsCi0gICAgICAgICAgICAgICAgcGFyYW1OYW1lLCBwYXJhbUVsZW1lbnQpOwotCi0gICAgICAgIGlmIChjb2RlR2VuQ29uZmlndXJhdGlvbi5nZXRPdXRwdXRMYW5ndWFnZSgpLmVxdWFscygiamF4LXdzIikgJiYgdXNlSG9sZGVyQ2xhc3NfamF4d3MpIHsKLSAgICAgICAgICAgIENsYXNzIHByaW1pdGl2ZSA9IEphdmFVdGlscy5nZXRXcmFwcGVyQ2xhc3MocGFyYW1UeXBlKTsKLSAgICAgICAgICAgIGlmKHByaW1pdGl2ZSAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICBwYXJhbVR5cGUgPSBwcmltaXRpdmUuZ2V0TmFtZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgInR5cGUiLAotICAgICAgICAgICAgICAgIChwYXJhbVR5cGUgPT0gbnVsbCkgPyAiIiA6IHBhcmFtVHlwZSwKLSAgICAgICAgICAgICAgICBwYXJhbUVsZW1lbnQpOwotCi0gICAgICAgIC8vYWRkcyB0aGUgc2hvcnQgdHlwZQotICAgICAgICBhZGRTaG9ydFR5cGUocGFyYW1FbGVtZW50LCAocGFyYW1RTmFtZSA9PSBudWxsKSA/IG51bGwgOiBwYXJhbVFOYW1lLmdldExvY2FsUGFydCgpKTsKLQotICAgICAgICAvLyBhZGQgYW4gZXh0cmEgYXR0cmlidXRlIHRvIHNheSB3aGV0aGVyIHRoZSB0eXBlIG1hcHBpbmcgaXMgdGhlIGRlZmF1bHQKLSAgICAgICAgaWYgKG1hcHBlci5nZXREZWZhdWx0TWFwcGluZ05hbWUoKS5lcXVhbHMocGFyYW1UeXBlKSkgewotICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgImRlZmF1bHQiLCAieWVzIiwgcGFyYW1FbGVtZW50KTsKLSAgICAgICAgfQotICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAidmFsdWUiLCBnZXRQYXJhbUluaXRpYWxpemVyKHBhcmFtVHlwZSksIHBhcmFtRWxlbWVudCk7Ci0gICAgICAgIC8vIGFkZCB0aGlzIGFzIGEgYm9keSBwYXJhbWV0ZXIKLSAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgImxvY2F0aW9uIiwgImJvZHkiLCBwYXJhbUVsZW1lbnQpOwotCi0gICAgICAgIC8vaWYgdGhlIG9wTmFtZSBhbmQgcGFydE5hbWUgYXJlIHByZXNlbnQgLCBhZGQgdGhlbQotICAgICAgICBpZiAob3BOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyBsb2NhbFBhcnQgPSBvcE5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAib3BuYW1lIiwgSmF2YVV0aWxzLnhtbE5hbWVUb0phdmEobG9jYWxQYXJ0KSwgcGFyYW1FbGVtZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwYXJhbVFOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIEVsZW1lbnQgcU5hbWVFbGVtZW50ID0gZG9jLmNyZWF0ZUVsZW1lbnQoInFuYW1lIik7Ci0gICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAibnN1cmkiLCBwYXJhbVFOYW1lLmdldE5hbWVzcGFjZVVSSSgpLCBxTmFtZUVsZW1lbnQpOwotICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgImxvY2FsbmFtZSIsIHBhcmFtUU5hbWUuZ2V0TG9jYWxQYXJ0KCksIHFOYW1lRWxlbWVudCk7Ci0gICAgICAgICAgICBwYXJhbUVsZW1lbnQuYXBwZW5kQ2hpbGQocU5hbWVFbGVtZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwYXJ0TmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgamF2YU5hbWUgPSBudWxsOwotICAgICAgICAgICAgaWYgKEphdmFVdGlscy5pc0phdmFLZXl3b3JkKHBhcnROYW1lKSkgewotICAgICAgICAgICAgICAgIGphdmFOYW1lID0gSmF2YVV0aWxzLm1ha2VOb25KYXZhS2V5d29yZChwYXJ0TmFtZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChjb2RlR2VuQ29uZmlndXJhdGlvbi5nZXRPdXRwdXRMYW5ndWFnZSgpLmVxdWFscygiamF4LXdzIikpIHsKLSAgICAgICAgICAgICAgICAgICAgamF2YU5hbWUgPSBKYXZhVXRpbHMueG1sTmFtZVRvSmF2YUlkZW50aWZpZXIoSmF2YVV0aWxzLnhtbE5hbWVUb0phdmEocGFydE5hbWUpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBqYXZhTmFtZSA9IEphdmFVdGlscy5jYXBpdGFsaXplRmlyc3RDaGFyKEphdmFVdGlscy54bWxOYW1lVG9KYXZhKHBhcnROYW1lKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgInBhcnRuYW1lIiwgamF2YU5hbWUsIHBhcmFtRWxlbWVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaXNQcmltaXRpdmUpIHsKLSAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJwcmltaXRpdmUiLCAieWVzIiwgcGFyYW1FbGVtZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpc0FycmF5KSB7Ci0gICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAiYXJyYXkiLCAieWVzIiwgcGFyYW1FbGVtZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBwYXJhbUVsZW1lbnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGRvYwotICAgICAqIEBwYXJhbSBvcGVyYXRpb24KLSAgICAgKiBAcmV0dXJuIFJldHVybnMgRWxlbWVudC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRWxlbWVudCAgIGdldE91dHB1dFBhcmFtRWxlbWVudChEb2N1bWVudCBkb2MsIEF4aXNPcGVyYXRpb24gb3BlcmF0aW9uKSB7Ci0gICAgICAgIEVsZW1lbnQgcGFyYW1FbGVtZW50ID0gZG9jLmNyZWF0ZUVsZW1lbnQoInBhcmFtIik7Ci0gICAgICAgIEF4aXNNZXNzYWdlIG91dHB1dE1lc3NhZ2UgPSBvcGVyYXRpb24uZ2V0TWVzc2FnZShXU0RMQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfT1VUX1ZBTFVFKTsKLSAgICAgICAgU3RyaW5nIHR5cGVNYXBwaW5nU3RyOwotICAgICAgICBTdHJpbmcgcGFyYW1ldGVyTmFtZTsKLQotICAgICAgICBpZiAob3V0cHV0TWVzc2FnZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwYXJhbWV0ZXJOYW1lID0gdGhpcy5tYXBwZXIuZ2V0UGFyYW1ldGVyTmFtZShvdXRwdXRNZXNzYWdlLmdldEVsZW1lbnRRTmFtZSgpKTsKLSAgICAgICAgICAgIFN0cmluZyB0eXBlTWFwcGluZyA9IHRoaXMubWFwcGVyLmdldFR5cGVNYXBwaW5nTmFtZShvdXRwdXRNZXNzYWdlLmdldEVsZW1lbnRRTmFtZSgpKTsKLSAgICAgICAgICAgIHR5cGVNYXBwaW5nU3RyID0gKHR5cGVNYXBwaW5nID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgID8gIiIKLSAgICAgICAgICAgICAgICAgICAgOiB0eXBlTWFwcGluZzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHBhcmFtZXRlck5hbWUgPSAiIjsKLSAgICAgICAgICAgIHR5cGVNYXBwaW5nU3RyID0gIiI7Ci0gICAgICAgIH0KLQotICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAibmFtZSIsIHBhcmFtZXRlck5hbWUsIHBhcmFtRWxlbWVudCk7Ci0gICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJ0eXBlIiwgdHlwZU1hcHBpbmdTdHIsIHBhcmFtRWxlbWVudCk7Ci0KLSAgICAgICAgLy9hZGRzIHRoZSBzaG9ydCB0eXBlCi0gICAgICAgIGFkZFNob3J0VHlwZShwYXJhbUVsZW1lbnQsCi0gICAgICAgICAgICAgICAgKG91dHB1dE1lc3NhZ2UuZ2V0RWxlbWVudFFOYW1lKCkgPT0gbnVsbCkgPyBudWxsIDoKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dE1lc3NhZ2UuZ2V0RWxlbWVudFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpOwotCi0gICAgICAgIC8vIGFkZCBhbiBleHRyYSBhdHRyaWJ1dGUgdG8gc2F5IHdoZXRoZXIgdGhlIHR5cGUgbWFwcGluZyBpcyB0aGUgZGVmYXVsdAotICAgICAgICBpZiAobWFwcGVyLmdldERlZmF1bHRNYXBwaW5nTmFtZSgpLmVxdWFscyh0eXBlTWFwcGluZ1N0cikpIHsKLSAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJkZWZhdWx0IiwgInllcyIsIHBhcmFtRWxlbWVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBhZGQgdGhpcyBhcyBhIGJvZHkgcGFyYW1ldGVyCi0gICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJsb2NhdGlvbiIsICJib2R5IiwgcGFyYW1FbGVtZW50KTsKLSAgICAgICAgU3RyaW5nIGxvY2FsUGFydCA9IG9wZXJhdGlvbi5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJvcG5hbWUiLCBKYXZhVXRpbHMueG1sTmFtZVRvSmF2YShsb2NhbFBhcnQpLCBwYXJhbUVsZW1lbnQpOwotCi0gICAgICAgIC8vaWYgdGhlIHVud3JhcHBpbmcgb3IgYmFja1dvcmRDb21wYXRpYmlsaXR5IGZsYWcgaXMgb24gdGhlbiB3ZSBoYXZlIHRvCi0gICAgICAgIC8vcHV0IHRoZSBlbGVtZW50IGNvbXBsZXggdHlwZSBpZiBpdCBleGl0cwotICAgICAgICBpZiAodGhpcy5jb2RlR2VuQ29uZmlndXJhdGlvbi5pc0JhY2t3b3JkQ29tcGF0aWJpbGl0eU1vZGUoKSB8fAotICAgICAgICAgICAgICAgICF0aGlzLmNvZGVHZW5Db25maWd1cmF0aW9uLmlzUGFyYW1ldGVyc1dyYXBwZWQoKSkgewotICAgICAgICAgICAgaWYgKG91dHB1dE1lc3NhZ2UuZ2V0UGFyYW1ldGVyKENvbnN0YW50cy5DT01QTEVYX1RZUEUpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBQYXJhbWV0ZXIgcGFyYW1ldGVyID0gb3V0cHV0TWVzc2FnZS5nZXRQYXJhbWV0ZXIoQ29uc3RhbnRzLkNPTVBMRVhfVFlQRSk7Ci0gICAgICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgImNvbXBsZXh0eXBlIiwgKFN0cmluZykgcGFyYW1ldGVyLmdldFZhbHVlKCksIHBhcmFtRWxlbWVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nIHBhcnROYW1lID0gb3V0cHV0TWVzc2FnZS5nZXRQYXJ0TmFtZSgpOwotICAgICAgICBpZiAocGFydE5hbWUgIT0gbnVsbCAmJiBjb2RlR2VuQ29uZmlndXJhdGlvbi5nZXRPdXRwdXRMYW5ndWFnZSgpLmVxdWFscygiamF4LXdzIikpIHsKLSAgICAgICAgICAgIFN0cmluZyBqYXZhTmFtZSA9IG51bGw7Ci0gICAgICAgICAgICBpZiAoSmF2YVV0aWxzLmlzSmF2YUtleXdvcmQocGFydE5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgamF2YU5hbWUgPSBKYXZhVXRpbHMubWFrZU5vbkphdmFLZXl3b3JkKHBhcnROYW1lKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgamF2YU5hbWUgPSBKYXZhVXRpbHMueG1sTmFtZVRvSmF2YUlkZW50aWZpZXIoSmF2YVV0aWxzLnhtbE5hbWVUb0phdmEocGFydE5hbWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJwYXJ0bmFtZSIsIGphdmFOYW1lLCBwYXJhbUVsZW1lbnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gdGhpcyBtZXNzYWdlIGhhcyBiZWVuIHVud3JhcHBlZCAtIGZpbmQgdGhlIGNvcnJlY3QgcmVmZXJlbmNlcyBvZiB0aGUKLSAgICAgICAgLy8gdGhlIG1lc3NhZ2UgYnkgbG9va2luZyBhdCB0aGUgdW53cmFwcGVkIGRldGFpbHMgb2JqZWN0IGFuZCBhdHRhY2ggdGhlCi0gICAgICAgIC8vIG5lZWRlZCBwYXJhbWV0ZXJzIGluc2lkZSBtYWluIHBhcmFtZXRlciBlbGVtZW50Ci0gICAgICAgIGlmIChvdXRwdXRNZXNzYWdlLmdldFBhcmFtZXRlcihDb25zdGFudHMuVU5XUkFQUEVEX0tFWSkgIT0gbnVsbCkgewotCi0gICAgICAgICAgICAvL3dlIGhhdmUgdGhpcyB1bndyYXBwZWQgZWFybGllci4gZ2V0IHRoZSBpbmZvIGhvbGRlcgotICAgICAgICAgICAgLy9hbmQgdGhlbiBsb29rIGF0IHRoZSBwYXJhbWV0ZXJzCi0gICAgICAgICAgICBQYXJhbWV0ZXIgZGV0YWlsc1BhcmFtZXRlciA9Ci0gICAgICAgICAgICAgICAgICAgIG91dHB1dE1lc3NhZ2UuZ2V0UGFyYW1ldGVyKENvbnN0YW50cy5VTldSQVBQRURfREVUQUlMUyk7Ci0gICAgICAgICAgICBNZXNzYWdlUGFydEluZm9ybWF0aW9uSG9sZGVyIGluZm9Ib2xkZXIgPQotICAgICAgICAgICAgICAgICAgICAoTWVzc2FnZVBhcnRJbmZvcm1hdGlvbkhvbGRlcikgZGV0YWlsc1BhcmFtZXRlci5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgTGlzdCBwYXJ0c0xpc3QgPSBpbmZvSG9sZGVyLmdldFBhcnRzTGlzdCgpOwotCi0gICAgICAgICAgICAvL3BvcHVsYXRlIHRoZSBwYXJ0cyBsaXN0IC0gdGhpcyBsaXN0IGlzIG5lZWRlZCB0byBnZW5lcmF0ZSBtdWx0aXBsZQotICAgICAgICAgICAgLy9wYXJhbWV0ZXJzIGluIHRoZSBzaWduYXR1cmVzCi0gICAgICAgICAgICAvLyBpbiBvdXQgcHV0IHBhcmFtcyB3ZSBvbmx5IGludGVyc3RlZCBpZiB0aGVyZSBpcyBvbmx5IG9uZSBwYXJhbWV0ZXIKLSAgICAgICAgICAgIC8vIG90aGVyd2lzZSB3ZSBjYW4gbm90IHVud3JhcCBpdC4KLSAgICAgICAgICAgIC8vIHRoaXMgbG9naWMgaGFuZGxlcyBhdCB0aGUgdGVtcGxhdGUgbGV2ZWwKLSAgICAgICAgICAgICBRTmFtZSBxTmFtZSA9IG51bGw7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwYXJ0c0xpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgcU5hbWUgPSAoUU5hbWUpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgIHBhcmFtRWxlbWVudC5hcHBlbmRDaGlsZChnZW5lcmF0ZVBhcmFtQ29tcG9uZW50KGRvYywKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWFwcGVyLmdldFBhcmFtZXRlck5hbWUocU5hbWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXBwZXIuZ2V0VHlwZU1hcHBpbmdOYW1lKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxTmFtZSksCi0gICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24uZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgcU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBxTmFtZS5nZXRMb2NhbFBhcnQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzLm1hcHBlci5nZXRUeXBlTWFwcGluZ1N0YXR1cygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcU5hbWUpICE9IG51bGwpLAotICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLkFSUkFZX1RZUEUuZXF1YWxzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1hcHBlci5nZXRUeXBlTWFwcGluZ1N0YXR1cygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxTmFtZSkpKQotICAgICAgICAgICAgICAgICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0gICAgICAgIFFOYW1lIHBhcmFtUU5hbWUgPSBvdXRwdXRNZXNzYWdlLmdldEVsZW1lbnRRTmFtZSgpOwotICAgICAgICBpZiAocGFyYW1RTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBFbGVtZW50IHFOYW1lRWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50KCJxbmFtZSIpOwotICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgIm5zdXJpIiwgcGFyYW1RTmFtZS5nZXROYW1lc3BhY2VVUkkoKSwgcU5hbWVFbGVtZW50KTsKLSAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJsb2NhbG5hbWUiLCBwYXJhbVFOYW1lLmdldExvY2FsUGFydCgpLCBxTmFtZUVsZW1lbnQpOwotICAgICAgICAgICAgcGFyYW1FbGVtZW50LmFwcGVuZENoaWxkKHFOYW1lRWxlbWVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcGFyYW1FbGVtZW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBwYXJhbVR5cGUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFBhcmFtSW5pdGlhbGl6ZXIoU3RyaW5nIHBhcmFtVHlwZSkgewotCi0gICAgICAgIC8vIExvb2sgdXAgcGFyYW1UeXBlIGluIHRoZSB0YWJsZQotICAgICAgICBTdHJpbmcgb3V0ID0gKFN0cmluZykgY29uc3RydWN0b3JNYXAuZ2V0KHBhcmFtVHlwZSk7Ci0KLSAgICAgICAgaWYgKG91dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBvdXQgPSAibnVsbCI7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gb3V0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBkb2MKLSAgICAgKiBAcGFyYW0gcGFyYW1ldGVycwotICAgICAqIEBwYXJhbSBsb2NhdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCBMaXN0IGdldFBhcmFtZXRlckVsZW1lbnRMaXN0KERvY3VtZW50IGRvYywgTGlzdCBwYXJhbWV0ZXJzLCBTdHJpbmcgbG9jYXRpb24pIHsKLSAgICAgICAgTGlzdCBwYXJhbWV0ZXJFbGVtZW50TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgICAgICBpZiAoKHBhcmFtZXRlcnMgIT0gbnVsbCkgJiYgIXBhcmFtZXRlcnMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBpbnQgY291bnQgPSBwYXJhbWV0ZXJzLnNpemUoKTsKLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgRWxlbWVudCBwYXJhbSA9IGRvYy5jcmVhdGVFbGVtZW50KCJwYXJhbSIpOwotICAgICAgICAgICAgICAgIFNPQVBIZWFkZXJNZXNzYWdlIGhlYWRlciA9IChTT0FQSGVhZGVyTWVzc2FnZSkgcGFyYW1ldGVycy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgUU5hbWUgbmFtZSA9IGhlYWRlci5nZXRFbGVtZW50KCk7Ci0KLSAgICAgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAibmFtZSIsIHRoaXMubWFwcGVyLmdldFBhcmFtZXRlck5hbWUobmFtZSksIHBhcmFtKTsKLQotICAgICAgICAgICAgICAgIFN0cmluZyB0eXBlTWFwcGluZyA9IHRoaXMubWFwcGVyLmdldFR5cGVNYXBwaW5nTmFtZShuYW1lKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdHlwZU1hcHBpbmdTdHIgPSAodHlwZU1hcHBpbmcgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgID8gIiIKLSAgICAgICAgICAgICAgICAgICAgICAgIDogdHlwZU1hcHBpbmc7Ci0KLSAgICAgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAidHlwZSIsIHR5cGVNYXBwaW5nU3RyLCBwYXJhbSk7Ci0gICAgICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgImxvY2F0aW9uIiwgbG9jYXRpb24sIHBhcmFtKTsKLSAgICAgICAgICAgICAgICBpZiAoaGVhZGVyLmlzTXVzdFVuZGVyc3RhbmQoKSkgewotICAgICAgICAgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAibXVzdFVuZGVyc3RhbmQiLCAidHJ1ZSIsIHBhcmFtKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgcU5hbWVFbGVtZW50ID0gZG9jLmNyZWF0ZUVsZW1lbnQoInFuYW1lIik7Ci0gICAgICAgICAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJuc3VyaSIsIG5hbWUuZ2V0TmFtZXNwYWNlVVJJKCksIHFOYW1lRWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJsb2NhbG5hbWUiLCBuYW1lLmdldExvY2FsUGFydCgpLCBxTmFtZUVsZW1lbnQpOwotICAgICAgICAgICAgICAgICAgICBwYXJhbS5hcHBlbmRDaGlsZChxTmFtZUVsZW1lbnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwYXJhbWV0ZXJFbGVtZW50TGlzdC5hZGQocGFyYW0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwYXJhbWV0ZXJFbGVtZW50TGlzdDsKLSAgICB9Ci0KLQotICAgIHByb3RlY3RlZCBMaXN0IGdldFBhcmFtZXRlckVsZW1lbnRMaXN0Rm9ySHR0cEhlYWRlcihEb2N1bWVudCBkb2MsIExpc3QgcGFyYW1ldGVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxvY2F0aW9uKSB7Ci0KLQotICAgICAgICBMaXN0IHBhcmFtZXRlckVsZW1lbnRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgICAgIGlmICgocGFyYW1ldGVycyAhPSBudWxsKSAmJiAhcGFyYW1ldGVycy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGludCBjb3VudCA9IHBhcmFtZXRlcnMuc2l6ZSgpOwotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICBFbGVtZW50IHBhcmFtID0gZG9jLmNyZWF0ZUVsZW1lbnQoInBhcmFtIik7Ci0gICAgICAgICAgICAgICAgSFRUUEhlYWRlck1lc3NhZ2UgaHR0cEhlYWRlck1lc3NhZ2UgPSAoSFRUUEhlYWRlck1lc3NhZ2UpIHBhcmFtZXRlcnMuZ2V0KGkpOwotICAgICAgICAgICAgICAgIFFOYW1lIHFOYW1lID0gaHR0cEhlYWRlck1lc3NhZ2UuZ2V0cU5hbWUoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGh0dHBIZWFkZXJNZXNzYWdlLmdldE5hbWUoKTsKLQotICAgICAgICAgICAgICAgIC8vIHVzZSBuYW1lIGFzIHRoZSBuYW1lIGF0dHJpYnV0ZSBvZiB0aGUgcGFyYW1ldGVyCi0gICAgICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgIm5hbWUiLCBKYXZhVXRpbHMueG1sTmFtZVRvSmF2YUlkZW50aWZpZXIobmFtZSksIHBhcmFtKTsKLSAgICAgICAgICAgICAgICAvLyBoZWFkZXIgbmFtZSBpcyB0byBzZXQgdGhlIGhlYWRlciB2YWx1ZQotICAgICAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJoZWFkZXJuYW1lIiwgbmFtZSwgcGFyYW0pOwotCi0gICAgICAgICAgICAgICAgU3RyaW5nIHR5cGVNYXBwaW5nID0gdGhpcy5tYXBwZXIuZ2V0VHlwZU1hcHBpbmdOYW1lKHFOYW1lKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdHlwZU1hcHBpbmdTdHIgPSAodHlwZU1hcHBpbmcgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgID8gIiIKLSAgICAgICAgICAgICAgICAgICAgICAgIDogdHlwZU1hcHBpbmc7Ci0KLSAgICAgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAidHlwZSIsIHR5cGVNYXBwaW5nU3RyLCBwYXJhbSk7Ci0gICAgICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgImxvY2F0aW9uIiwgbG9jYXRpb24sIHBhcmFtKTsKLSAgICAgICAgICAgICAgICBwYXJhbWV0ZXJFbGVtZW50TGlzdC5hZGQocGFyYW0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHBhcmFtZXRlckVsZW1lbnRMaXN0OwotICAgIH0KLQotICAgIHByb3RlY3RlZCBMaXN0IGdldFBhcmFtZXRlckVsZW1lbnRMaXN0Rm9yU09BUE1vZHVsZXMoRG9jdW1lbnQgZG9jLCBMaXN0IHBhcmFtZXRlcnMpIHsKLQotICAgICAgICBMaXN0IHBhcmFtZXRlckVsZW1lbnRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgICAgIGlmICgocGFyYW1ldGVycyAhPSBudWxsKSAmJiAhcGFyYW1ldGVycy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGludCBjb3VudCA9IHBhcmFtZXRlcnMuc2l6ZSgpOwotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICBFbGVtZW50IHBhcmFtID0gZG9jLmNyZWF0ZUVsZW1lbnQoInBhcmFtIik7Ci0gICAgICAgICAgICAgICAgU09BUE1vZHVsZU1lc3NhZ2Ugc29hcE1vZHVsZU1lc3NhZ2UgPSAoU09BUE1vZHVsZU1lc3NhZ2UpIHBhcmFtZXRlcnMuZ2V0KGkpOwotCi0gICAgICAgICAgICAgICAgLy8gaGVhZGVyIG5hbWUgaXMgdG8gc2V0IHRoZSBoZWFkZXIgdmFsdWUKLSAgICAgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAidXJpIiwgc29hcE1vZHVsZU1lc3NhZ2UuZ2V0VXJpKCksIHBhcmFtKTsKLQotICAgICAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJsb2NhdGlvbiIsICJ3c29hcF9tb2R1bGUiLCBwYXJhbSk7Ci0gICAgICAgICAgICAgICAgcGFyYW1ldGVyRWxlbWVudExpc3QuYWRkKHBhcmFtKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBwYXJhbWV0ZXJFbGVtZW50TGlzdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVdGlsaXR5IG1ldGhvZCB0byBhZGQgYW4gYXR0cmlidXRlIHRvIGEgZ2l2ZW4gZWxlbWVudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBkb2N1bWVudAotICAgICAqIEBwYXJhbSBlbHROYW1lCi0gICAgICogQHBhcmFtIGVsdFZhbHVlCi0gICAgICogQHBhcmFtIGVsZW1lbnQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRWxlbWVudCBhZGRFbGVtZW50KERvY3VtZW50IGRvY3VtZW50LCBTdHJpbmcgZWx0TmFtZSwgU3RyaW5nIGVsdFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWxlbWVudCBlbGVtZW50KSB7Ci0gICAgICAgIEVsZW1lbnQgZWx0ID0gWFNMVFV0aWxzLmFkZENoaWxkRWxlbWVudChkb2N1bWVudCwgZWx0TmFtZSwgZWxlbWVudCk7Ci0gICAgICAgIGlmIChlbHRWYWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBlbHQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoZWx0VmFsdWUpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZWx0OwotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi9lbWl0dGVyL0NFbWl0dGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi9lbWl0dGVyL0NFbWl0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1OGQxZDMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vZW1pdHRlci9DRW1pdHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4uZW1pdHRlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc0JpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzTWVzc2FnZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5Qb2xpY3lJbmNsdWRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5KYXZhVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLlBvbGljeVV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLlV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5IVFRQSGVhZGVyTWVzc2FnZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuV1NETENvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuV1NETFV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5XU0RMMkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuU09BUEhlYWRlck1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4uQ29kZUdlbkNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4uQ29kZUdlbmVyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4ud3JpdGVyLkNCdWlsZFNjcmlwdFdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi53cml0ZXIuQ1NlcnZpY2VYTUxXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4ud3JpdGVyLkNTa2VsSGVhZGVyV3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLndyaXRlci5DU2tlbFNvdXJjZVdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi53cml0ZXIuQ1N0dWJIZWFkZXJXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4ud3JpdGVyLkNTdHViU291cmNlV3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLndyaXRlci5DU3ZjU2tlbGV0b25Xcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4ud3JpdGVyLkZpbGVXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLmRhdGFiaW5kaW5nLkNVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm5lZXRoaS5Qb2xpY3k7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgY29tLmlibS53c2RsLnV0aWwueG1sLkRPTTJXcml0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBDRW1pdHRlciBleHRlbmRzIEF4aXNTZXJ2aWNlQmFzZWRNdWx0aUxhbmd1YWdlRW1pdHRlciB7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ19TVFVCX1BSRUZJWCA9ICJheGlzMl9zdHViXyI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ19TS0VMX1BSRUZJWCA9ICJheGlzMl9za2VsXyI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ19TVkNfU0tFTF9QUkVGSVggPSAiYXhpczJfc3ZjX3NrZWxfIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDX1NUVUJfU1VGRklYID0gIiI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ19TS0VMX1NVRkZJWCA9ICIiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENfU1ZDX1NLRUxfU1VGRklYID0gIiI7Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBX0RFRkFVTFRfVFlQRSA9ICJvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ19ERUZBVUxUX1RZUEUgPSAiYXhpb21fbm9kZV90KiI7Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDX09VUl9UWVBFX1BSRUZJWCA9ICJheGlzMl8iOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENfT1VSX1RZUEVfU1VGRklYID0gIl90KiI7Ci0KLSAgICAvKioKLSAgICAgKiBFbWl0IHRoZSBzdHViCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIENvZGVHZW5lcmF0aW9uRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZW1pdFN0dWIoKSB0aHJvd3MgQ29kZUdlbmVyYXRpb25FeGNlcHRpb24gewotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyB3cml0ZSBpbnRlcmZhY2UgaW1wbGVtZW50YXRpb25zCi0gICAgICAgICAgICB3cml0ZUNTdHViKCk7Ci0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vbG9nIHRoZSBlcnJvciBoZXJlCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0KLQotICAgIC8qKgotICAgICAqIEVtaXQgdGhlIHNrZWx0b25zCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIENvZGVHZW5lcmF0aW9uRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZW1pdFNrZWxldG9uKCkgdGhyb3dzIENvZGVHZW5lcmF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIHdyaXRlIHNrZWxldG9uCi0gICAgICAgICAgICB3cml0ZUNTa2VsKCk7Ci0KLSAgICAgICAgICAgIC8vIHdyaXRlIGEgU2VydmljZSBTa2VsZXRvbiBmb3IgdGhpcyBwYXJ0aWN1bGFyIHNlcnZpY2UuCi0gICAgICAgICAgICB3cml0ZUNTZXJ2aWNlU2tlbGV0b24oKTsKLSAgICAgICAgICAgIC8vY3JlYXRlIHRoZSBidWlsZCBzY3JpcHQKLSAgICAgICAgICAgIGVtaXRCdWlsZFNjcmlwdCgpOwotCi0gICAgICAgICAgICB3cml0ZVNlcnZpY2VYbWwoKTsKLSAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAvKioKLSAgICAgKiBFbWl0IHRoZSBidWlsZCBzY3JpcHQKLSAgICAgKgotICAgICAqIEB0aHJvd3MgQ29kZUdlbmVyYXRpb25FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBlbWl0QnVpbGRTY3JpcHQoKSB0aHJvd3MgQ29kZUdlbmVyYXRpb25FeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAJd3JpdGVCdWlsZFNjcmlwdCgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogV3JpdGVzIHRoZSBTdHViLgotICAgICAqCi0gICAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCB3cml0ZUNTdHViKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgLy8gZmlyc3QgY2hlY2sgZm9yIHRoZSBwb2xpY2llcyBpbiB0aGlzIHNlcnZpY2UgYW5kIHdyaXRlIHRoZW0KLSAgICAgICAgRG9jdW1lbnQgaW50ZXJmYWNlSW1wbE1vZGVsID0gY3JlYXRlRE9NRG9jdW1lbnRGb3JJbnRlcmZhY2VJbXBsZW1lbnRhdGlvbigpOwotCi0gICAgICAgIENTdHViSGVhZGVyV3JpdGVyIHdyaXRlckhTdHViID0KLSAgICAgICAgICAgICAgICBuZXcgQ1N0dWJIZWFkZXJXcml0ZXIoZ2V0T3V0cHV0RGlyZWN0b3J5KGNvZGVHZW5Db25maWd1cmF0aW9uLmdldE91dHB1dExvY2F0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlR2VuQ29uZmlndXJhdGlvbi5nZXRTb3VyY2VMb2NhdGlvbigpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZUdlbkNvbmZpZ3VyYXRpb24uZ2V0T3V0cHV0TGFuZ3VhZ2UoKSk7Ci0KLSAgICAgICAgd3JpdGVGaWxlKGludGVyZmFjZUltcGxNb2RlbCwgd3JpdGVySFN0dWIpOwotICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICBDU3R1YlNvdXJjZVdyaXRlciB3cml0ZXJDU3R1YiA9Ci0gICAgICAgICAgICAgICAgbmV3IENTdHViU291cmNlV3JpdGVyKGdldE91dHB1dERpcmVjdG9yeShjb2RlR2VuQ29uZmlndXJhdGlvbi5nZXRPdXRwdXRMb2NhdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZUdlbkNvbmZpZ3VyYXRpb24uZ2V0U291cmNlTG9jYXRpb24oKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVHZW5Db25maWd1cmF0aW9uLmdldE91dHB1dExhbmd1YWdlKCkpOwotCi0gICAgICAgIHdyaXRlRmlsZShpbnRlcmZhY2VJbXBsTW9kZWwsIHdyaXRlckNTdHViKTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogV3JpdGVzIHRoZSBTa2VsLgotICAgICAqCi0gICAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCB3cml0ZUNTa2VsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgRG9jdW1lbnQgc2tlbGV0b25Nb2RlbCA9Ci0gICAgICAgICAgICAgICAgY3JlYXRlRE9NRG9jdW1lbnRGb3JTa2VsZXRvbihjb2RlR2VuQ29uZmlndXJhdGlvbi5pc1NlcnZlclNpZGVJbnRlcmZhY2UoKSk7Ci0KLQotICAgICAgICBDU2tlbEhlYWRlcldyaXRlciBza2VsZXRvbldyaXRlciA9IG5ldyBDU2tlbEhlYWRlcldyaXRlcigKLSAgICAgICAgICAgICAgICBnZXRPdXRwdXREaXJlY3RvcnkodGhpcy5jb2RlR2VuQ29uZmlndXJhdGlvbi5nZXRPdXRwdXRMb2NhdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlR2VuQ29uZmlndXJhdGlvbi5nZXRTb3VyY2VMb2NhdGlvbigpKSwKLSAgICAgICAgICAgICAgICB0aGlzLmNvZGVHZW5Db25maWd1cmF0aW9uLmdldE91dHB1dExhbmd1YWdlKCkpOwotCi0gICAgICAgIHdyaXRlRmlsZShza2VsZXRvbk1vZGVsLCBza2VsZXRvbldyaXRlcik7Ci0KLSAgICAgICAgQ1NrZWxTb3VyY2VXcml0ZXIgc2tlbGV0b25Xcml0ZXJTdHViID0gbmV3IENTa2VsU291cmNlV3JpdGVyKAotICAgICAgICAgICAgICAgIGdldE91dHB1dERpcmVjdG9yeSh0aGlzLmNvZGVHZW5Db25maWd1cmF0aW9uLmdldE91dHB1dExvY2F0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVHZW5Db25maWd1cmF0aW9uLmdldFNvdXJjZUxvY2F0aW9uKCkpLAotICAgICAgICAgICAgICAgIHRoaXMuY29kZUdlbkNvbmZpZ3VyYXRpb24uZ2V0T3V0cHV0TGFuZ3VhZ2UoKSk7Ci0KLSAgICAgICAgd3JpdGVGaWxlKHNrZWxldG9uTW9kZWwsIHNrZWxldG9uV3JpdGVyU3R1Yik7Ci0gICAgfQotCi0gICAgLyoqIEB0aHJvd3MgRXhjZXB0aW9uICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHdyaXRlQ1NlcnZpY2VTa2VsZXRvbigpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIERvY3VtZW50IHNrZWxldG9uTW9kZWwgPSBjcmVhdGVET01Eb2N1bWVudEZvclNlcnZpY2VTa2VsZXRvblhNTCgpOwotICAgICAgICBDU3ZjU2tlbGV0b25Xcml0ZXIgd3JpdGVyID0KLSAgICAgICAgICAgICAgICBuZXcgQ1N2Y1NrZWxldG9uV3JpdGVyKGdldE91dHB1dERpcmVjdG9yeShjb2RlR2VuQ29uZmlndXJhdGlvbi5nZXRPdXRwdXRMb2NhdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVHZW5Db25maWd1cmF0aW9uLmdldFNvdXJjZUxvY2F0aW9uKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZUdlbkNvbmZpZ3VyYXRpb24uZ2V0T3V0cHV0TGFuZ3VhZ2UoKSk7Ci0KLSAgICAgICAgd3JpdGVGaWxlKHNrZWxldG9uTW9kZWwsIHdyaXRlcik7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZSB0aGUgQnVpbGQgU2NyaXB0Ci0gICAgICoKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotCi0gICAgcHJvdGVjdGVkIHZvaWQgd3JpdGVCdWlsZFNjcmlwdCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAodGhpcy5jb2RlR2VuQ29uZmlndXJhdGlvbi5pc0dlbmVyYXRlRGVwbG95ZW1lbnREZXNjcmlwdG9yKCkpIHsKLQotICAgICAgICAgICAgLy8gV3JpdGUgdGhlIHNlcnZpY2UgeG1sIGluIGEgZm9sZGVyIHdpdGggdGhlCi0gICAgICAgICAgICBEb2N1bWVudCBidWlsZFhNTE1vZGVsID0gY3JlYXRlRE9NRG9jdW1lbnRGb3JCdWlsZFNjcmlwdCh0aGlzLmNvZGVHZW5Db25maWd1cmF0aW9uKTsKLSAgICAgICAgICAgIEZpbGVXcml0ZXIgYnVpbGRYbWxXcml0ZXIgPQotICAgICAgICAgICAgICAgICAgICBuZXcgQ0J1aWxkU2NyaXB0V3JpdGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE91dHB1dERpcmVjdG9yeSh0aGlzLmNvZGVHZW5Db25maWd1cmF0aW9uLmdldE91dHB1dExvY2F0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVHZW5Db25maWd1cmF0aW9uLmdldFNvdXJjZUxvY2F0aW9uKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29kZUdlbkNvbmZpZ3VyYXRpb24uZ2V0T3V0cHV0TGFuZ3VhZ2UoKSk7Ci0KLSAgICAgICAgICAgIHdyaXRlRmlsZShidWlsZFhNTE1vZGVsLCBidWlsZFhtbFdyaXRlcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB3cml0ZVNlcnZpY2VYbWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHRoaXMuY29kZUdlbkNvbmZpZ3VyYXRpb24uaXNHZW5lcmF0ZURlcGxveWVtZW50RGVzY3JpcHRvcigpKSB7Ci0KLSAgICAgICAgICAgIC8vIFdyaXRlIHRoZSBzZXJ2aWNlIHhtbCBpbiBhIGZvbGRlciB3aXRoIHRoZQotICAgICAgICAgICAgRG9jdW1lbnQgc2VydmljZVhNTE1vZGVsID0gY3JlYXRlRE9NRG9jdW1lbnRGb3JTZXJ2aWNlWE1MKCk7Ci0gICAgICAgICAgICBGaWxlV3JpdGVyIHNlcnZpY2VYbWxXcml0ZXIgPQotICAgICAgICAgICAgICAgICAgICBuZXcgQ1NlcnZpY2VYTUxXcml0ZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0T3V0cHV0RGlyZWN0b3J5KHRoaXMuY29kZUdlbkNvbmZpZ3VyYXRpb24uZ2V0T3V0cHV0TG9jYXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZUdlbkNvbmZpZ3VyYXRpb24uZ2V0UmVzb3VyY2VMb2NhdGlvbigpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvZGVHZW5Db25maWd1cmF0aW9uLmdldE91dHB1dExhbmd1YWdlKCkpOwotCi0gICAgICAgICAgICB3cml0ZUZpbGUoc2VydmljZVhNTE1vZGVsLCBzZXJ2aWNlWG1sV3JpdGVyKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAvKiogQ3JlYXRlcyB0aGUgRE9NIHRyZWUgZm9yIGltcGxlbWVudGF0aW9ucy4gKi8KLSAgICBwcm90ZWN0ZWQgRG9jdW1lbnQgY3JlYXRlRE9NRG9jdW1lbnRGb3JJbnRlcmZhY2VJbXBsZW1lbnRhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIFN0cmluZyBzZXJ2aWNlTmFtZSA9IGF4aXNTZXJ2aWNlLmdldE5hbWUoKTsKLSAgICAgICAgU3RyaW5nIHNlcnZpY2VUbnMgPSBheGlzU2VydmljZS5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICAgICAgU3RyaW5nIHNlcnZpY2VDTmFtZSA9IG1ha2VDQ2xhc3NOYW1lKGF4aXNTZXJ2aWNlLmdldE5hbWUoKSk7Ci0gICAgICAgIFN0cmluZyBzdHViTmFtZSA9IENfU1RVQl9QUkVGSVggKyBzZXJ2aWNlQ05hbWUgKyBDX1NUVUJfU1VGRklYOwotICAgICAgICBEb2N1bWVudCBkb2MgPSBnZXRFbXB0eURvY3VtZW50KCk7Ci0gICAgICAgIEVsZW1lbnQgcm9vdEVsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudCgiY2xhc3MiKTsKLQotICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAibmFtZSIsIHN0dWJOYW1lLCByb290RWxlbWVudCk7Ci0gICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJwcmVmaXgiLCBzdHViTmFtZSwgcm9vdEVsZW1lbnQpOyAvL3ByZWZpeCB0byBiZSB1c2VkIGJ5IHRoZSBmdW5jdGlvbnMKLSAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgInFuYW1lIiwgc2VydmljZU5hbWUgKyAifCIgKyBzZXJ2aWNlVG5zLCByb290RWxlbWVudCk7Ci0gICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJzZXJ2aWNlbmFtZSIsIHNlcnZpY2VDTmFtZSwgcm9vdEVsZW1lbnQpOwotICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAicGFja2FnZSIsICIiLCByb290RWxlbWVudCk7Ci0KLSAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgIm5hbWVzcGFjZSIsIHNlcnZpY2VUbnMsIHJvb3RFbGVtZW50KTsKLSAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgImludGVyZmFjZU5hbWUiLCBzZXJ2aWNlQ05hbWUsIHJvb3RFbGVtZW50KTsKLQotICAgICAgICAvKiBUaGUgZm9sbG93aW5nIGJsb2NrIG9mIGNvZGUgaXMgc2FtZSBhcyBmb3IgdGhlCi0gICAgICAgICAqIEF4aXNTZXJ2aWNlQmFzZWRNdWx0aUxhbmd1YWdlRW1pdHRlciBjcmVhdGVET01Eb2N1bWVudEZvckludGVyZmFjZUltcGxlbWVudGF0aW9uKCkKLSAgICAgICAgICovCi0gICAgICAgIC8vIGFkZCB0aGUgd3JhcCBjbGFzc2VzIGZsYWcKLSAgICAgICAgaWYgKGNvZGVHZW5Db25maWd1cmF0aW9uLmlzUGFja0NsYXNzZXMoKSkgewotICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgIndyYXBwZWQiLCAieWVzIiwgcm9vdEVsZW1lbnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gYWRkIFNPQVAgdmVyc2lvbgotICAgICAgICBhZGRTb2FwVmVyc2lvbihkb2MsIHJvb3RFbGVtZW50KTsKLQotICAgICAgICAvLyBhZGQgdGhlIGVuZCBwb2ludAotICAgICAgICBhZGRFbmRwb2ludChkb2MsIHJvb3RFbGVtZW50KTsKLQotICAgICAgICAvLyBzZXQgdGhlIHN5bmMvYXN5bmMgYXR0cmlidXRlcwotICAgICAgICBmaWxsU3luY0F0dHJpYnV0ZXMoZG9jLCByb290RWxlbWVudCk7Ci0KLSAgICAgICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotICAgICAgICAvLyB0aGlzIGJsb2NrIG9mIGNvZGUgc3BlY2lmaWNhbGx5IGFwcGxpZXMgdG8gdGhlIGludGVncmF0aW9uIG9mIGRhdGFiaW5kaW5nIGNvZGUgaW50byB0aGUKLSAgICAgICAgLy8gZ2VuZXJhdGVkIGNsYXNzZXMgdGlnaHRseSAocHJvYmFibHkgYXMgaW5uZXIgY2xhc3NlcykKLSAgICAgICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotICAgICAgICAvLyBjaGVjayBmb3IgdGhlIHNwZWNpYWwgbW9kZWxzIGluIHRoZSBtYXBwZXIgYW5kIGlmIHRoZXkgYXJlIHByZXNlbnQgcHJvY2VzcyB0aGVtCi0gICAgICAgIGlmIChtYXBwZXIuaXNPYmplY3RNYXBwaW5nUHJlc2VudCgpKSB7Ci0KLSAgICAgICAgICAgIC8vIGFkZCBhbiBhdHRyaWJ1dGUgdG8gdGhlIHJvb3QgZWxlbWVudCBzaG93aW5nIHRoYXQgdGhlIHdyaXRpbmcgaGFzIGJlZW4gc2tpcHBlZAotICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgInNraXAtd3JpdGUiLCAieWVzIiwgcm9vdEVsZW1lbnQpOwotCi0gICAgICAgICAgICAvLyBwcm9jZXNzIHRoZSBtYXBwZXIgb2JqZWN0cwotICAgICAgICAgICAgcHJvY2Vzc01vZGVsT2JqZWN0cyhtYXBwZXIuZ2V0QWxsTWFwcGVkT2JqZWN0cygpLCByb290RWxlbWVudCwgZG9jKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0gICAgICAgIC8vIGxvYWQgdGhlIG9wZXJhdGlvbnMKLSAgICAgICAgbG9hZE9wZXJhdGlvbnMoZG9jLCByb290RWxlbWVudCwgbnVsbCk7Ci0KLSAgICAgICAgLy8gYWRkIHRoZSBkYXRhYmluZCBzdXBwb3J0ZXJzLiBOb3cgdGhlIGRhdGFiaW5kIHN1cHBvcnRlcnMgYXJlIGNvbXBsZXRseSBjb250YWluZWQgaW5zaWRlCi0gICAgICAgIC8vIHRoZSBzdHVicyBpbXBsZW1lbnRhdGlvbiBhbmQgbm90IHZpc2libGUgb3V0c2lkZQotICAgICAgICByb290RWxlbWVudC5hcHBlbmRDaGlsZChjcmVhdGVET01FbGVtZW50Zm9yRGF0YWJpbmRlcnMoZG9jLCBmYWxzZSkpOwotCi0gICAgICAgIE9iamVjdCBzdHViTWV0aG9kczsKLQotICAgICAgICAvL2lmIHNvbWUgZXh0ZW5zaW9uIGhhcyBhZGRlZCB0aGUgc3R1YiBtZXRob2RzIHByb3BlcnR5LCBhZGQgdGhlbSB0byB0aGUKLSAgICAgICAgLy9tYWluIGRvY3VtZW50Ci0gICAgICAgIGlmICgoc3R1Yk1ldGhvZHMgPSBjb2RlR2VuQ29uZmlndXJhdGlvbi5nZXRQcm9wZXJ0eSgic3R1Yk1ldGhvZHMiKSkgIT0gbnVsbCkgewotICAgICAgICAgICAgcm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQoZG9jLmltcG9ydE5vZGUoKEVsZW1lbnQpc3R1Yk1ldGhvZHMsIHRydWUpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vYWRkIGFub3RoZXIgZWxlbWVudCB0byBoYXZlIHRoZSB1bmlxdWUgbGlzdCBvZiBmYXVsdHMKLSAgICAgICAgcm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQoZ2V0VW5pcXVlTGlzdG9mRmF1bHRzKGRvYykpOwotCi0gICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbihET00yV3JpdGVyLm5vZGVUb1N0cmluZyhyb290RWxlbWVudCkpOwotICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0KLSAgICAgICAgZG9jLmFwcGVuZENoaWxkKHJvb3RFbGVtZW50KTsKLSAgICAgICAgcmV0dXJuIGRvYzsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgRG9jdW1lbnQgY3JlYXRlRE9NRG9jdW1lbnRGb3JTa2VsZXRvbihib29sZWFuIGlzU2tlbGV0b25JbnRlcmZhY2UpIHsKLSAgICAgICAgRG9jdW1lbnQgZG9jID0gZ2V0RW1wdHlEb2N1bWVudCgpOwotICAgICAgICBFbGVtZW50IHJvb3RFbGVtZW50ID0gZG9jLmNyZWF0ZUVsZW1lbnQoImludGVyZmFjZSIpOwotCi0gICAgICAgIFN0cmluZyBzZXJ2aWNlQ05hbWUgPSBtYWtlQ0NsYXNzTmFtZShheGlzU2VydmljZS5nZXROYW1lKCkpOwotICAgICAgICBTdHJpbmcgc2tlbE5hbWUgPSBDX1NLRUxfUFJFRklYICsgc2VydmljZUNOYW1lICsgQ19TS0VMX1NVRkZJWDsKLQotICAgICAgICAvLyBvbmx5IHRoZSBuYW1lIGlzIHVzZWQKLSAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgIm5hbWUiLCBza2VsTmFtZSwgcm9vdEVsZW1lbnQpOwotICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAicGFja2FnZSIsICIiLCByb290RWxlbWVudCk7Ci0gICAgICAgIFN0cmluZyBzZXJ2aWNlTmFtZSA9IGF4aXNTZXJ2aWNlLmdldE5hbWUoKTsKLSAgICAgICAgU3RyaW5nIHNlcnZpY2VUbnMgPSBheGlzU2VydmljZS5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgInByZWZpeCIsIHNrZWxOYW1lLCByb290RWxlbWVudCk7IC8vcHJlZml4IHRvIGJlIHVzZWQgYnkgdGhlIGZ1bmN0aW9ucwotICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAicW5hbWUiLCBzZXJ2aWNlTmFtZSArICJ8IiArIHNlcnZpY2VUbnMsIHJvb3RFbGVtZW50KTsKLQotCi0gICAgICAgIGZpbGxTeW5jQXR0cmlidXRlcyhkb2MsIHJvb3RFbGVtZW50KTsKLSAgICAgICAgbG9hZE9wZXJhdGlvbnMoZG9jLCByb290RWxlbWVudCwgbnVsbCk7Ci0KLSAgICAgICAgLy9hdHRhY2ggYSBsaXN0IG9mIGZhdWx0cwotICAgICAgICByb290RWxlbWVudC5hcHBlbmRDaGlsZChnZXRVbmlxdWVMaXN0b2ZGYXVsdHMoZG9jKSk7Ci0KLSAgICAgICAgZG9jLmFwcGVuZENoaWxkKHJvb3RFbGVtZW50KTsKLSAgICAgICAgcmV0dXJuIGRvYzsKLQotICAgIH0KLQotICAgIHByb3RlY3RlZCBEb2N1bWVudCBjcmVhdGVET01Eb2N1bWVudEZvclNlcnZpY2VTa2VsZXRvblhNTCgpIHsKLSAgICAgICAgRG9jdW1lbnQgZG9jID0gZ2V0RW1wdHlEb2N1bWVudCgpOwotICAgICAgICBFbGVtZW50IHJvb3RFbGVtZW50ID0gZG9jLmNyZWF0ZUVsZW1lbnQoImludGVyZmFjZSIpOwotCi0gICAgICAgIFN0cmluZyBsb2NhbFBhcnQgPSBtYWtlQ0NsYXNzTmFtZShheGlzU2VydmljZS5nZXROYW1lKCkpOwotICAgICAgICBTdHJpbmcgc3ZjU2tlbE5hbWUgPSBDX1NWQ19TS0VMX1BSRUZJWCArIGxvY2FsUGFydCArIENfU1ZDX1NLRUxfU1VGRklYOwotICAgICAgICBTdHJpbmcgc2tlbE5hbWUgPSBDX1NLRUxfUFJFRklYICsgbG9jYWxQYXJ0ICsgQ19TS0VMX1NVRkZJWDsKLQotICAgICAgICAvLyBvbmx5IHRoZSBuYW1lIGlzIHVzZWQKLSAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgIm5hbWUiLCBzdmNTa2VsTmFtZSwgcm9vdEVsZW1lbnQpOwotICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAicHJlZml4Iiwgc3ZjU2tlbE5hbWUsIHJvb3RFbGVtZW50KTsgLy9wcmVmaXggdG8gYmUgdXNlZCBieSB0aGUgZnVuY3Rpb25zCi0gICAgICAgIFN0cmluZyBzZXJ2aWNlTmFtZSA9IGF4aXNTZXJ2aWNlLmdldE5hbWUoKTsKLSAgICAgICAgU3RyaW5nIHNlcnZpY2VUbnMgPSBheGlzU2VydmljZS5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgInFuYW1lIiwgc2VydmljZU5hbWUgKyAifCIgKyBzZXJ2aWNlVG5zLCByb290RWxlbWVudCk7Ci0KLSAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgInN2Y25hbWUiLCBza2VsTmFtZSwgcm9vdEVsZW1lbnQpOwotICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAic3Zjb3BfcHJlZml4Iiwgc2tlbE5hbWUsIHJvb3RFbGVtZW50KTsKLSAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgInBhY2thZ2UiLCAiIiwgcm9vdEVsZW1lbnQpOwotCi0gICAgICAgIGZpbGxTeW5jQXR0cmlidXRlcyhkb2MsIHJvb3RFbGVtZW50KTsKLSAgICAgICAgbG9hZE9wZXJhdGlvbnMoZG9jLCByb290RWxlbWVudCwgbnVsbCk7Ci0KLSAgICAgICAgLy8gYWRkIFNPQVAgdmVyc2lvbgotICAgICAgICBhZGRTb2FwVmVyc2lvbihkb2MsIHJvb3RFbGVtZW50KTsKLQotICAgICAgICAvL2F0dGFjaCBhIGxpc3Qgb2YgZmF1bHRzCi0gICAgICAgIHJvb3RFbGVtZW50LmFwcGVuZENoaWxkKGdldFVuaXF1ZUxpc3RvZkZhdWx0cyhkb2MpKTsKLQotICAgICAgICBkb2MuYXBwZW5kQ2hpbGQocm9vdEVsZW1lbnQpOwotICAgICAgICByZXR1cm4gZG9jOwotCi0gICAgfQotCi0gICAgcHJvdGVjdGVkIERvY3VtZW50IGNyZWF0ZURPTURvY3VtZW50Rm9yQnVpbGRTY3JpcHQoQ29kZUdlbkNvbmZpZ3VyYXRpb24gY29kZWdlbikgewotICAgIAkgRG9jdW1lbnQgZG9jID0gZ2V0RW1wdHlEb2N1bWVudCgpOwotICAgICAgICAgRWxlbWVudCByb290RWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50KCJpbnRlcmZhY2UiKTsKLQotICAgICAgICAgU3RyaW5nIHNlcnZpY2VDTmFtZSA9IG1ha2VDQ2xhc3NOYW1lKGF4aXNTZXJ2aWNlLmdldE5hbWUoKSk7Ci0gICAgICAgIC8vIFN0cmluZyBza2VsTmFtZSA9IENfU0tFTF9QUkVGSVggKyBzZXJ2aWNlQ05hbWUgKyBDX1NLRUxfU1VGRklYOwotICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywic2VydmljZW5hbWUiLHNlcnZpY2VDTmFtZSxyb290RWxlbWVudCk7Ci0gICAgICAgIC8vaWYgdXNlciBzcGVjaWZ5IGEgbG9jYXRpb24gZm9yIHRoZSBzb3VyY2UKLSAgICAgICAgIGlmKGNvZGVnZW4uaXNTZXRvdXRwdXRTb3VyY2VMb2NhdGlvbigpKXsKLSAgICAgICAgICAgICBTdHJpbmcgb3V0cHV0TG9jYXRpb24gPSBjb2RlZ2VuLmdldE91dHB1dExvY2F0aW9uKCkuZ2V0UGF0aCgpOwotICAgICAgICAgICAgIFN0cmluZyAgdGFyZ2V0c291cmNlTG9jYXRpb24gPSBjb2RlZ2VuLmdldFNvdXJjZUxvY2F0aW9uKCk7Ci0gICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywib3B0aW9uIiwiMSIscm9vdEVsZW1lbnQpOwotICAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsIm91dHB1dGxvY2F0aW9uIixvdXRwdXRMb2NhdGlvbixyb290RWxlbWVudCk7Ci0gICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywidGFyZ2V0c291cmNlbG9jYXRpb24iLHRhcmdldHNvdXJjZUxvY2F0aW9uLHJvb3RFbGVtZW50KTsKLSAgICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgewotICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywib3B0aW9uIiwiMCIscm9vdEVsZW1lbnQpOwotICAgICAgICAgfQotICAgICAgICBmaWxsU3luY0F0dHJpYnV0ZXMoZG9jLCByb290RWxlbWVudCk7Ci0gICAgICAgICBsb2FkT3BlcmF0aW9ucyhkb2MsIHJvb3RFbGVtZW50LCBudWxsKTsKLSAgICAgICAgIC8vIGFkZCBTT0FQIHZlcnNpb24KLSAgICAgICAgIGFkZFNvYXBWZXJzaW9uKGRvYywgcm9vdEVsZW1lbnQpOwotICAgICAgICAgCi0gICAgICAgICAvL2F0dGFjaCBhIGxpc3Qgb2YgZmF1bHRzCi0gICAgICAgICByb290RWxlbWVudC5hcHBlbmRDaGlsZChnZXRVbmlxdWVMaXN0b2ZGYXVsdHMoZG9jKSk7Ci0KLSAgICAgICAgIGRvYy5hcHBlbmRDaGlsZChyb290RWxlbWVudCk7Ci0gICAgICAgICByZXR1cm4gZG9jOwotCi0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEBwYXJhbSB3b3JkCi0gICAgICogQHJldHVybiBSZXR1cm5zIGNoYXJhY3RlciByZW1vdmVkIHN0cmluZy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIG1ha2VDQ2xhc3NOYW1lKFN0cmluZyB3b3JkKSB7Ci0gICAgICAgIC8vY3VycmVudGx5IGF2b2lkIG9ubHkgamF2YSBrZXkgd29yZHMgYW5kIHNlcnZpY2UgbmFtZXMgd2l0aCAnLicgY2hhcmFjdGVycwotCi0gICAgICAgIGlmIChDVXRpbHMuaXNDS2V5d29yZCh3b3JkKSkgewotICAgICAgICAgICAgcmV0dXJuIENVdGlscy5tYWtlTm9uQ0tleXdvcmQod29yZCk7Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nIG91dFdvcmQgPSB3b3JkLnJlcGxhY2UoJy4nLCAnXycpOwotICAgICAgICByZXR1cm4gb3V0V29yZC5yZXBsYWNlKCctJywgJ18nKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIExvYWRzIHRoZSBvcGVyYXRpb25zCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZG9jCi0gICAgICogQHBhcmFtIHJvb3RFbGVtZW50Ci0gICAgICogQHBhcmFtIG1lcAotICAgICAqIEByZXR1cm4gb3BlcmF0aW9ucyBmb3VuZAotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGxvYWRPcGVyYXRpb25zKERvY3VtZW50IGRvYywgRWxlbWVudCByb290RWxlbWVudCwgU3RyaW5nIG1lcCkgewotICAgICAgICBFbGVtZW50IG1ldGhvZEVsZW1lbnQ7Ci0gICAgICAgIFN0cmluZyBwb3J0VHlwZU5hbWUgPSBtYWtlQ0NsYXNzTmFtZShheGlzU2VydmljZS5nZXROYW1lKCkpOwotCi0gICAgICAgIEl0ZXJhdG9yIGJpbmRpbmdPcGVyYXRpb25zID0gdGhpcy5heGlzQmluZGluZy5nZXRDaGlsZHJlbigpOwotICAgICAgICBib29sZWFuIG9wc0ZvdW5kID0gZmFsc2U7Ci0gICAgICAgIEF4aXNPcGVyYXRpb24gYXhpc09wZXJhdGlvbiA9IG51bGw7Ci0gICAgICAgIEF4aXNCaW5kaW5nT3BlcmF0aW9uIGF4aXNCaW5kaW5nT3BlcmF0aW9uID0gbnVsbDsKLQotICAgICAgICB3aGlsZSAoYmluZGluZ09wZXJhdGlvbnMuaGFzTmV4dCgpKSB7Ci0KLSAgICAgICAgICAgIGF4aXNCaW5kaW5nT3BlcmF0aW9uID0gKEF4aXNCaW5kaW5nT3BlcmF0aW9uKSBiaW5kaW5nT3BlcmF0aW9ucy5uZXh0KCk7Ci0gICAgICAgICAgICBheGlzT3BlcmF0aW9uID0gYXhpc0JpbmRpbmdPcGVyYXRpb24uZ2V0QXhpc09wZXJhdGlvbigpOwotCi0gICAgICAgICAgICAvLyBwb3B1bGF0ZSBpbmZvIGhvbGRlciB3aXRoIG1lcCBpbmZvcm1hdGlvbi4gVGhpcyB3aWxsIHVzZWQgaW4gZGV0ZXJtaW5pbmcgd2hpY2gKLSAgICAgICAgICAgIC8vIG1lc3NhZ2UgcmVjZWl2ZXIgdG8gdXNlLCBldGMuLAotCi0gICAgICAgICAgICBTdHJpbmcgbWVzc2FnZUV4Y2hhbmdlUGF0dGVybiA9IGF4aXNPcGVyYXRpb24uZ2V0TWVzc2FnZUV4Y2hhbmdlUGF0dGVybigpOwotICAgICAgICAgICAgaWYgKGluZm9Ib2xkZXIuZ2V0KG1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4pID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpbmZvSG9sZGVyLnB1dChtZXNzYWdlRXhjaGFuZ2VQYXR0ZXJuLCBCb29sZWFuLlRSVUUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobWVwID09IG51bGwpIHsKLQotICAgICAgICAgICAgICAgIG9wc0ZvdW5kID0gdHJ1ZTsKLQotICAgICAgICAgICAgICAgIExpc3Qgc29hcEhlYWRlcklucHV0UGFyYW1ldGVyTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICBMaXN0IHNvYXBIZWFkZXJPdXRwdXRQYXJhbWV0ZXJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgICAgICAgICAgICAgbWV0aG9kRWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50KCJtZXRob2QiKTsKLQotICAgICAgICAgICAgICAgIFN0cmluZyBsb2NhbFBhcnQgPSBheGlzT3BlcmF0aW9uLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgb3BDTmFtZSA9IG1ha2VDQ2xhc3NOYW1lKGxvY2FsUGFydCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG9wTlMgPSBheGlzT3BlcmF0aW9uLmdldE5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKTsKLQotICAgICAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJuYW1lIiwgb3BDTmFtZSwgbWV0aG9kRWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgImxvY2FscGFydCIsIGxvY2FsUGFydCwgbWV0aG9kRWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgInFuYW1lIiwgbG9jYWxQYXJ0ICsgInwiICsgb3BOUywgbWV0aG9kRWxlbWVudCk7Ci0KLSAgICAgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAibmFtZXNwYWNlIiwgb3BOUywgbWV0aG9kRWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHN0eWxlID0gYXhpc09wZXJhdGlvbi5nZXRTdHlsZSgpOwotICAgICAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJzdHlsZSIsIHN0eWxlLCBtZXRob2RFbGVtZW50KTsKLSAgICAgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAiZGJzdXBwb3J0bmFtZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnRUeXBlTmFtZSArIGxvY2FsUGFydCArIERBVEFCSU5ESU5HX1NVUFBPUlRFUl9OQU1FX1NVRkZJWCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kRWxlbWVudCk7Ci0KLQotICAgICAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJtZXAiLCBVdGlscy5nZXRBeGlzU3BlY2lmTUVQQ29uc3RhbnQoCi0gICAgICAgICAgICAgICAgICAgICAgICBheGlzT3BlcmF0aW9uLmdldE1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4oKSkgKyAiIiwgbWV0aG9kRWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgIm1lcFVSSSIsIGF4aXNPcGVyYXRpb24uZ2V0TWVzc2FnZUV4Y2hhbmdlUGF0dGVybigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RFbGVtZW50KTsKLQotCi0gICAgICAgICAgICAgICAgYWRkU09BUEFjdGlvbihkb2MsIG1ldGhvZEVsZW1lbnQsIGF4aXNCaW5kaW5nT3BlcmF0aW9uLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgLy9hZGQgaGVhZGVyIG9wcyBmb3IgaW5wdXQKLSAgICAgICAgICAgICAgICBhZGRIZWFkZXJPcGVyYXRpb25zKHNvYXBIZWFkZXJJbnB1dFBhcmFtZXRlckxpc3QsIGF4aXNCaW5kaW5nT3BlcmF0aW9uLCB0cnVlKTsKLSAgICAgICAgICAgICAgICAvL2FkZCBoZWFkZXIgb3BzIGZvciBvdXRwdXQKLSAgICAgICAgICAgICAgICBhZGRIZWFkZXJPcGVyYXRpb25zKHNvYXBIZWFkZXJPdXRwdXRQYXJhbWV0ZXJMaXN0LCBheGlzQmluZGluZ09wZXJhdGlvbiwgZmFsc2UpOwotCi0gICAgICAgICAgICAgICAgUG9saWN5SW5jbHVkZSBwb2xpY3lJbmNsdWRlID0gYXhpc09wZXJhdGlvbi5nZXRQb2xpY3lJbmNsdWRlKCk7Ci0gICAgICAgICAgICAgICAgUG9saWN5IHBvbGljeSA9IHBvbGljeUluY2x1ZGUuZ2V0UG9saWN5KCk7Ci0gICAgICAgICAgICAgICAgaWYgKHBvbGljeSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAicG9saWN5IiwgUG9saWN5VXRpbC5wb2xpY3lDb21wb25lbnRUb1N0cmluZyhwb2xpY3kpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEVsZW1lbnQpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJjYW4ndCBzZXJpYWxpemUgdGhlIHBvbGljeSB0byBhIFN0cmluZyAiLCBleCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBtZXRob2RFbGVtZW50LmFwcGVuZENoaWxkKAotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0SW5wdXRFbGVtZW50KGRvYywgYXhpc0JpbmRpbmdPcGVyYXRpb24sIHNvYXBIZWFkZXJJbnB1dFBhcmFtZXRlckxpc3QpKTsKLSAgICAgICAgICAgICAgICBtZXRob2RFbGVtZW50LmFwcGVuZENoaWxkKAotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0T3V0cHV0RWxlbWVudChkb2MsIGF4aXNCaW5kaW5nT3BlcmF0aW9uLCBzb2FwSGVhZGVyT3V0cHV0UGFyYW1ldGVyTGlzdCkpOwotICAgICAgICAgICAgICAgIG1ldGhvZEVsZW1lbnQuYXBwZW5kQ2hpbGQoZ2V0RmF1bHRFbGVtZW50KGRvYywgYXhpc09wZXJhdGlvbikpOwotCi0gICAgICAgICAgICAgICAgcm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQobWV0aG9kRWxlbWVudCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vbWVwIGlzIHByZXNlbnQgLSB3ZSBtb3ZlIGFoZWFkIG9ubHkgaWYgdGhlIGdpdmVuIG1lcCBtYXRjaGVzIHRoZSBtZXAgb2YgdGhpcyBvcGVyYXRpb24KLQotICAgICAgICAgICAgICAgIGlmIChtZXAuZXF1YWxzKGF4aXNPcGVyYXRpb24uZ2V0TWVzc2FnZUV4Y2hhbmdlUGF0dGVybigpKSkgewotICAgICAgICAgICAgICAgICAgICAvL2F0IHRoaXMgcG9pbnQgd2Uga25vdyBpdCdzIHRydWUKLSAgICAgICAgICAgICAgICAgICAgb3BzRm91bmQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBMaXN0IHNvYXBIZWFkZXJJbnB1dFBhcmFtZXRlckxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgICAgIExpc3Qgc29hcEhlYWRlck91dHB1dFBhcmFtZXRlckxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgICAgIExpc3Qgc29hcEhlYWRlckZhdWx0UGFyYW1ldGVyTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICAgICAgbWV0aG9kRWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50KCJtZXRob2QiKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxvY2FsUGFydCA9IGF4aXNPcGVyYXRpb24uZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgb3BDTmFtZSA9IG1ha2VDQ2xhc3NOYW1lKGxvY2FsUGFydCk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBvcE5TID0gYXhpc09wZXJhdGlvbi5nZXROYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgIm5hbWUiLCBvcENOYW1lLCBtZXRob2RFbGVtZW50KTsKLSAgICAgICAgICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgImxvY2FscGFydCIsIGxvY2FsUGFydCwgbWV0aG9kRWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJxbmFtZSIsIGxvY2FsUGFydCArICJ8IiArIG9wTlMsIG1ldGhvZEVsZW1lbnQpOwotCi0gICAgICAgICAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJuYW1lc3BhY2UiLCBheGlzT3BlcmF0aW9uLmdldE5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEVsZW1lbnQpOwotICAgICAgICAgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAic3R5bGUiLCBheGlzT3BlcmF0aW9uLmdldFN0eWxlKCksIG1ldGhvZEVsZW1lbnQpOwotICAgICAgICAgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAiZGJzdXBwb3J0bmFtZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0VHlwZU5hbWUgKyBsb2NhbFBhcnQgKyBEQVRBQklORElOR19TVVBQT1JURVJfTkFNRV9TVUZGSVgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RFbGVtZW50KTsKLQotICAgICAgICAgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAibWVwIiwgVXRpbHMuZ2V0QXhpc1NwZWNpZk1FUENvbnN0YW50KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNPcGVyYXRpb24uZ2V0TWVzc2FnZUV4Y2hhbmdlUGF0dGVybigpKSArICIiLCBtZXRob2RFbGVtZW50KTsKLSAgICAgICAgICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgIm1lcFVSSSIsIGF4aXNPcGVyYXRpb24uZ2V0TWVzc2FnZUV4Y2hhbmdlUGF0dGVybigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kRWxlbWVudCk7Ci0KLQotICAgICAgICAgICAgICAgICAgICBhZGRTT0FQQWN0aW9uKGRvYywgbWV0aG9kRWxlbWVudCwgYXhpc0JpbmRpbmdPcGVyYXRpb24uZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkSGVhZGVyT3BlcmF0aW9ucyhzb2FwSGVhZGVySW5wdXRQYXJhbWV0ZXJMaXN0LCBheGlzQmluZGluZ09wZXJhdGlvbiwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGFkZEhlYWRlck9wZXJhdGlvbnMoc29hcEhlYWRlck91dHB1dFBhcmFtZXRlckxpc3QsIGF4aXNCaW5kaW5nT3BlcmF0aW9uLCBmYWxzZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgICogU2V0dGluZyB0aGUgcG9saWN5IG9mIHRoZSBvcGVyYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgICAgICAgICAgUG9saWN5IHBvbGljeSA9IGF4aXNPcGVyYXRpb24uZ2V0UG9saWN5SW5jbHVkZSgpLmdldFBvbGljeSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAocG9saWN5ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgInBvbGljeSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvbGljeVV0aWwucG9saWN5Q29tcG9uZW50VG9TdHJpbmcocG9saWN5KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kRWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiY2FuJ3Qgc2VyaWFsaXplIHRoZSBwb2xpY3kgdG8gYSBTdHJpbmciLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0KLSAgICAgICAgICAgICAgICAgICAgbWV0aG9kRWxlbWVudC5hcHBlbmRDaGlsZChnZXRJbnB1dEVsZW1lbnQoZG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzQmluZGluZ09wZXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29hcEhlYWRlcklucHV0UGFyYW1ldGVyTGlzdCkpOwotICAgICAgICAgICAgICAgICAgICBtZXRob2RFbGVtZW50LmFwcGVuZENoaWxkKGdldE91dHB1dEVsZW1lbnQoZG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpc0JpbmRpbmdPcGVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2FwSGVhZGVyT3V0cHV0UGFyYW1ldGVyTGlzdCkpOwotICAgICAgICAgICAgICAgICAgICBtZXRob2RFbGVtZW50LmFwcGVuZENoaWxkKGdldEZhdWx0RWxlbWVudChkb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNPcGVyYXRpb24pKTsKLSAgICAgICAgICAgICAgICAgICAgcm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQobWV0aG9kRWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG9wc0ZvdW5kOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQSBjb252ZW5pZW50IG1ldGhvZCBmb3IgdGhlIGdlbmVyYXRpbmcgdGhlIHBhcmFtZXRlciBlbGVtZW50Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gZG9jCi0gICAgICogQHBhcmFtIHBhcmFtTmFtZQotICAgICAqIEBwYXJhbSBwYXJhbVR5cGUKLSAgICAgKiBAcGFyYW0gb3BOYW1lCi0gICAgICogQHBhcmFtIHBhcmFtTmFtZQotICAgICAqLwotICAgIHByb3RlY3RlZCBFbGVtZW50IGdlbmVyYXRlUGFyYW1Db21wb25lbnQoRG9jdW1lbnQgZG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhcmFtTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXJhbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRTmFtZSBvcE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGFydE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzUHJpbWl0aXZlKSB7Ci0KLSAgICAgICAgRWxlbWVudCBwYXJhbUVsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudCgicGFyYW0iKTsKLSAgICAgICAgLy9yZXR1cm4gcGFyYW1FbGVtZW50Oy8qCi0gICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJuYW1lIiwKLSAgICAgICAgICAgICAgICAgICAgIHBhcmFtTmFtZSwgcGFyYW1FbGVtZW50KTsKLQotICAgICAgICBTdHJpbmcgdHlwZU1hcHBpbmdTdHIgPSAocGFyYW1UeXBlID09IG51bGwpCi0gICAgICAgICAgICAgICAgPyAiIgotICAgICAgICAgICAgICAgIDogcGFyYW1UeXBlOwotCi0KLSAgICAgICAgaWYgKEpBVkFfREVGQVVMVF9UWVBFLmVxdWFscyh0eXBlTWFwcGluZ1N0cikpIHsKLSAgICAgICAgICAgIHR5cGVNYXBwaW5nU3RyID0gQ19ERUZBVUxUX1RZUEU7Ci0gICAgICAgIH0KLQotICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAidHlwZSIsIHR5cGVNYXBwaW5nU3RyLCBwYXJhbUVsZW1lbnQpOwotICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAiY2Fwcy10eXBlIiwgdHlwZU1hcHBpbmdTdHIudG9VcHBlckNhc2UoKSwgcGFyYW1FbGVtZW50KTsKLQotICAgICAgICAvL2FkZHMgdGhlIHNob3J0IHR5cGUKLSAgICAgICAgYWRkU2hvcnRUeXBlKHBhcmFtRWxlbWVudCwgcGFyYW1UeXBlKTsKLQotICAgICAgICAvLyBhZGQgYW4gZXh0cmEgYXR0cmlidXRlIHRvIHNheSB3aGV0aGVyIHRoZSB0eXBlIG1hcHBpbmcgaXMgdGhlIGRlZmF1bHQKLSAgICAgICAgaWYgKG1hcHBlci5nZXREZWZhdWx0TWFwcGluZ05hbWUoKS5lcXVhbHMocGFyYW1UeXBlKSkgewotICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgImRlZmF1bHQiLCAieWVzIiwgcGFyYW1FbGVtZW50KTsKLSAgICAgICAgfQotICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAidmFsdWUiLCBnZXRQYXJhbUluaXRpYWxpemVyKHBhcmFtVHlwZSksIHBhcmFtRWxlbWVudCk7Ci0gICAgICAgIC8vIGFkZCB0aGlzIGFzIGEgYm9keSBwYXJhbWV0ZXIKLSAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgImxvY2F0aW9uIiwgImJvZHkiLCBwYXJhbUVsZW1lbnQpOwotCi0gICAgICAgIC8vaWYgdGhlIG9wTmFtZSBhbmQgcGFydE5hbWUgYXJlIHByZXNlbnQgLCBhZGQgdGhlbQotICAgICAgICBpZiAob3BOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJvcG5hbWUiLCBvcE5hbWUuZ2V0TG9jYWxQYXJ0KCksIHBhcmFtRWxlbWVudCk7Ci0KLSAgICAgICAgfQotICAgICAgICBpZiAocGFydE5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgInBhcnRuYW1lIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBKYXZhVXRpbHMuY2FwaXRhbGl6ZUZpcnN0Q2hhcihwYXJ0TmFtZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1FbGVtZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpc1ByaW1pdGl2ZSkgewotICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgInByaW1pdGl2ZSIsICJ5ZXMiLCBwYXJhbUVsZW1lbnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gdGhlIG5ldyB0cmljayB0byBpZGVudGlmeSBhZGIgdHlwZXMKLSAgICAgICAgYm9vbGVhbiBpc091cnMgPSB0cnVlOwotCi0gICAgICAgIGlmICh0eXBlTWFwcGluZ1N0ci5sZW5ndGgoKSAhPSAwICYmICF0eXBlTWFwcGluZ1N0ci5lcXVhbHMoInZvaWQiKSAmJgotICAgICAgICAgICAgICAgICF0eXBlTWFwcGluZ1N0ci5lcXVhbHMoQ19ERUZBVUxUX1RZUEUpKSB7Ci0gICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAib3VycyIsICJ5ZXMiLCBwYXJhbUVsZW1lbnQpOwotICAgICAgICAgICAgaXNPdXJzID0gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlzT3VycyA9IGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGlzT3VycykgewotICAgICAgICAgICAgdHlwZU1hcHBpbmdTdHIgPSBDX09VUl9UWVBFX1BSRUZJWCArIHR5cGVNYXBwaW5nU3RyICsgQ19PVVJfVFlQRV9TVUZGSVg7Ci0gICAgICAgIH0KLQotICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAiYXhpczItdHlwZSIsIHR5cGVNYXBwaW5nU3RyLCBwYXJhbUVsZW1lbnQpOwotICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAiYXhpczItY2Fwcy10eXBlIiwgdHlwZU1hcHBpbmdTdHIudG9VcHBlckNhc2UoKSwgcGFyYW1FbGVtZW50KTsKLQotICAgICAgICByZXR1cm4gcGFyYW1FbGVtZW50OyAgLy8qLwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBkb2MKLSAgICAgKiBAcGFyYW0gb3BlcmF0aW9uCi0gICAgICogQHBhcmFtIHBhcmFtCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkQ1NwZWNpZmNBdHRyaWJ1dGVzKERvY3VtZW50IGRvYywgQXhpc09wZXJhdGlvbiBvcGVyYXRpb24sIEVsZW1lbnQgcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlVHlwZSkgewotICAgICAgICBTdHJpbmcgdHlwZU1hcHBpbmdTdHI7Ci0gICAgICAgIEF4aXNNZXNzYWdlIG1lc3NhZ2U7Ci0KLSAgICAgICAgaWYgKG1lc3NhZ2VUeXBlLmVxdWFscyhXU0RMQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfSU5fVkFMVUUpKQotICAgICAgICAgICAgbWVzc2FnZSA9IG9wZXJhdGlvbi5nZXRNZXNzYWdlKFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9JTl9WQUxVRSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIG1lc3NhZ2UgPSBvcGVyYXRpb24uZ2V0TWVzc2FnZShXU0RMQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfT1VUX1ZBTFVFKTsKLQotICAgICAgICBRTmFtZSB0eXBlTWFwcGluZyA9IG1lc3NhZ2UuZ2V0RWxlbWVudFFOYW1lKCk7Ci0KLSAgICAgICAgU3RyaW5nIHBhcmFtVHlwZSA9IHRoaXMubWFwcGVyLmdldFR5cGVNYXBwaW5nTmFtZShtZXNzYWdlLmdldEVsZW1lbnRRTmFtZSgpKTsKLSAgICAgICAgaWYgKGRvYyA9PSBudWxsIHx8IHBhcmFtVHlwZSA9PSBudWxsIHx8IHBhcmFtID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtZXNzYWdlICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyB0eXBlID0gdGhpcy5tYXBwZXIuZ2V0VHlwZU1hcHBpbmdOYW1lKG1lc3NhZ2UuZ2V0RWxlbWVudFFOYW1lKCkpOwotICAgICAgICAgICAgdHlwZU1hcHBpbmdTdHIgPSAodHlwZSA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICA/ICIiCi0gICAgICAgICAgICAgICAgICAgIDogdHlwZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHR5cGVNYXBwaW5nU3RyID0gIiI7Ci0gICAgICAgIH0KLQotICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAiY2Fwcy10eXBlIiwgcGFyYW1UeXBlLnRvVXBwZXJDYXNlKCksIHBhcmFtKTsKLQotICAgICAgICBpZiAoIXBhcmFtVHlwZS5lcXVhbHMoIiIpICYmICFwYXJhbVR5cGUuZXF1YWxzKCJ2b2lkIikgJiYKLSAgICAgICAgICAgICAgICAhdHlwZU1hcHBpbmdTdHIuZXF1YWxzKENfREVGQVVMVF9UWVBFKSAmJiB0eXBlTWFwcGluZ1N0ci5jb250YWlucygiYWRiXyIpKSB7Ci0gICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAib3VycyIsICJ5ZXMiLCBwYXJhbSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gZG9jCi0gICAgICogQHBhcmFtIG9wZXJhdGlvbgotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgcGFyYW1ldGVyIGVsZW1lbnQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEVsZW1lbnRbXSBnZXRJbnB1dFBhcmFtRWxlbWVudChEb2N1bWVudCBkb2MsIEF4aXNPcGVyYXRpb24gb3BlcmF0aW9uKSB7Ci0gICAgICAgIEVsZW1lbnRbXSBwYXJhbSA9IHN1cGVyLmdldElucHV0UGFyYW1FbGVtZW50KGRvYywgb3BlcmF0aW9uKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbS5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgYWRkQ1NwZWNpZmNBdHRyaWJ1dGVzKGRvYywgb3BlcmF0aW9uLCBwYXJhbVtpXSwgV1NETENvbnN0YW50cy5NRVNTQUdFX0xBQkVMX0lOX1ZBTFVFKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBwYXJhbTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gZG9jCi0gICAgICogQHBhcmFtIG9wZXJhdGlvbgotICAgICAqIEByZXR1cm4gUmV0dXJucyBFbGVtZW50LgotICAgICAqLwotICAgIHByb3RlY3RlZCBFbGVtZW50IGdldE91dHB1dFBhcmFtRWxlbWVudChEb2N1bWVudCBkb2MsIEF4aXNPcGVyYXRpb24gb3BlcmF0aW9uKSB7Ci0gICAgICAgIEVsZW1lbnQgcGFyYW0gPSBzdXBlci5nZXRPdXRwdXRQYXJhbUVsZW1lbnQoZG9jLCBvcGVyYXRpb24pOwotICAgICAgICBhZGRDU3BlY2lmY0F0dHJpYnV0ZXMoZG9jLCBvcGVyYXRpb24sIHBhcmFtLCBXU0RMQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfT1VUX1ZBTFVFKTsKLQotICAgICAgICByZXR1cm4gcGFyYW07Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgb3V0cHV0IGRpcmVjdG9yeSBmb3Igc291cmNlIGZpbGVzLgotICAgICAqCi0gICAgICogQHBhcmFtIG91dHB1dERpcgotICAgICAqIEByZXR1cm4gUmV0dXJucyBGaWxlLgotICAgICAqLwotICAgIHByb3RlY3RlZCBGaWxlIGdldE91dHB1dERpcmVjdG9yeShGaWxlIG91dHB1dERpciwgU3RyaW5nIGRpcjIpIHsKLSAgICAgICAgaWYgKGRpcjIgIT0gbnVsbCAmJiAhIiIuZXF1YWxzKGRpcjIpKSB7Ci0gICAgICAgICAgICBpZiAob3V0cHV0RGlyLmdldE5hbWUoKS5lcXVhbHMoIi4iKSkgewotICAgICAgICAgICAgICAgIG91dHB1dERpciA9IG5ldyBGaWxlKG91dHB1dERpciwgZGlyMik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIW91dHB1dERpci5leGlzdHMoKSkgewotICAgICAgICAgICAgb3V0cHV0RGlyLm1rZGlycygpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG91dHB1dERpcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gZG9jCi0gICAgICogQHBhcmFtIHBhcmFtZXRlcnMKLSAgICAgKiBAcGFyYW0gbG9jYXRpb24KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTGlzdCBnZXRQYXJhbWV0ZXJFbGVtZW50TGlzdChEb2N1bWVudCBkb2MsIExpc3QgcGFyYW1ldGVycywgU3RyaW5nIGxvY2F0aW9uKSB7Ci0gICAgICAgIExpc3QgcGFyYW1ldGVyRWxlbWVudExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgaWYgKChwYXJhbWV0ZXJzICE9IG51bGwpICYmICFwYXJhbWV0ZXJzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgaW50IGNvdW50ID0gcGFyYW1ldGVycy5zaXplKCk7Ci0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgIEVsZW1lbnQgcGFyYW0gPSBkb2MuY3JlYXRlRWxlbWVudCgicGFyYW0iKTsKLSAgICAgICAgICAgICAgICBTT0FQSGVhZGVyTWVzc2FnZSBoZWFkZXIgPSAoU09BUEhlYWRlck1lc3NhZ2UpIHBhcmFtZXRlcnMuZ2V0KGkpOwotICAgICAgICAgICAgICAgIFFOYW1lIG5hbWUgPSBoZWFkZXIuZ2V0RWxlbWVudCgpOwotCi0gICAgICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgIm5hbWUiLCB0aGlzLm1hcHBlci5nZXRQYXJhbWV0ZXJOYW1lKG5hbWUpLCBwYXJhbSk7Ci0KLSAgICAgICAgICAgICAgICBTdHJpbmcgdHlwZU1hcHBpbmcgPSB0aGlzLm1hcHBlci5nZXRUeXBlTWFwcGluZ05hbWUobmFtZSk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHR5cGVNYXBwaW5nU3RyID0gKHR5cGVNYXBwaW5nID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICA/ICIiCi0gICAgICAgICAgICAgICAgICAgICAgICA6IHR5cGVNYXBwaW5nOwotCi0gICAgICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgInR5cGUiLCB0eXBlTWFwcGluZ1N0ciwgcGFyYW0pOwotICAgICAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJsb2NhdGlvbiIsIGxvY2F0aW9uLCBwYXJhbSk7Ci0gICAgICAgICAgICAgICAgaWYgKGhlYWRlci5pc011c3RVbmRlcnN0YW5kKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgIm11c3RVbmRlcnN0YW5kIiwgInRydWUiLCBwYXJhbSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBFbGVtZW50IHFOYW1lRWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50KCJxbmFtZSIpOwotICAgICAgICAgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAibnN1cmkiLCBuYW1lLmdldE5hbWVzcGFjZVVSSSgpLCBxTmFtZUVsZW1lbnQpOwotICAgICAgICAgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAibG9jYWxuYW1lIiwgbmFtZS5nZXRMb2NhbFBhcnQoKSwgcU5hbWVFbGVtZW50KTsKLSAgICAgICAgICAgICAgICAgICAgcGFyYW0uYXBwZW5kQ2hpbGQocU5hbWVFbGVtZW50KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcGFyYW1ldGVyRWxlbWVudExpc3QuYWRkKHBhcmFtKTsKLQotICAgICAgICAgICAgICAgIC8vIHRoZSBuZXcgdHJpY2sgdG8gaWRlbnRpZnkgYWRiIHR5cGVzCi0gICAgICAgICAgICAgICAgYm9vbGVhbiBpc091cnMgPSB0cnVlOwotCi0gICAgICAgICAgICAgICAgaWYgKHR5cGVNYXBwaW5nU3RyLmxlbmd0aCgpICE9IDAgJiYgIXR5cGVNYXBwaW5nU3RyLmVxdWFscygidm9pZCIpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAhdHlwZU1hcHBpbmdTdHIuZXF1YWxzKENfREVGQVVMVF9UWVBFKSkgewotICAgICAgICAgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAib3VycyIsICJ5ZXMiLCBwYXJhbSk7Ci0gICAgICAgICAgICAgICAgICAgIGlzT3VycyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaXNPdXJzID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGlzT3VycykgewotICAgICAgICAgICAgICAgICAgICB0eXBlTWFwcGluZ1N0ciA9IENfT1VSX1RZUEVfUFJFRklYICsgdHlwZU1hcHBpbmdTdHIgKyBDX09VUl9UWVBFX1NVRkZJWDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAiYXhpczItdHlwZSIsIHR5cGVNYXBwaW5nU3RyLCBwYXJhbSk7Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcGFyYW1ldGVyRWxlbWVudExpc3Q7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmluZHMgdGhlIG91dHB1dCBlbGVtZW50LgotICAgICAqCi0gICAgICogQHBhcmFtIGRvYwotICAgICAqIEBwYXJhbSBiaW5kaW5nT3BlcmF0aW9uCi0gICAgICogQHBhcmFtIGhlYWRlclBhcmFtZXRlclFOYW1lTGlzdAotICAgICAqLwotICAgIHByb3RlY3RlZCBFbGVtZW50IGdldE91dHB1dEVsZW1lbnQoRG9jdW1lbnQgZG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXhpc0JpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3QgaGVhZGVyUGFyYW1ldGVyUU5hbWVMaXN0KSB7Ci0gICAgICAgIEF4aXNPcGVyYXRpb24gb3BlcmF0aW9uID0gYmluZGluZ09wZXJhdGlvbi5nZXRBeGlzT3BlcmF0aW9uKCk7Ci0gICAgICAgIEVsZW1lbnQgb3V0cHV0RWx0ID0gZG9jLmNyZWF0ZUVsZW1lbnQoIm91dHB1dCIpOwotICAgICAgICBTdHJpbmcgbWVwID0gb3BlcmF0aW9uLmdldE1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4oKTsKLQotCi0gICAgICAgIGlmIChXU0RMVXRpbC5pc091dHB1dFByZXNlbnRGb3JNRVAobWVwKSkgewotCi0gICAgICAgICAgICBFbGVtZW50IHBhcmFtID0gZ2V0T3V0cHV0UGFyYW1FbGVtZW50KGRvYywgb3BlcmF0aW9uKTsKLQotICAgICAgICAgICAgaWYgKHBhcmFtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBvdXRwdXRFbHQuYXBwZW5kQ2hpbGQocGFyYW0pOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBMaXN0IG91dHB1dEVsZW1lbnRMaXN0ID0gZ2V0UGFyYW1ldGVyRWxlbWVudExpc3QoZG9jLCBoZWFkZXJQYXJhbWV0ZXJRTmFtZUxpc3QsCi0gICAgICAgICAgICAgICAgICAgIFdTRExDb25zdGFudHMuU09BUF9IRUFERVIpOwotICAgICAgICAgICAgb3V0cHV0RWxlbWVudExpc3QuYWRkQWxsKGdldFBhcmFtZXRlckVsZW1lbnRMaXN0Rm9ySHR0cEhlYWRlcihkb2MsCi0gICAgICAgICAgICAgICAgICAgIChBcnJheUxpc3QpIGdldEJpbmRpbmdQcm9wZXJ0eUZyb21NZXNzYWdlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdTREwyQ29uc3RhbnRzLkFUVFJfV0hUVFBfSEVBREVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbi5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NETENvbnN0YW50cy5XU0RMX01FU1NBR0VfRElSRUNUSU9OX09VVCksCi0gICAgICAgICAgICAgICAgICAgIFdTRExDb25zdGFudHMuSFRUUF9IRUFERVIpKTsKLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvdXRwdXRFbGVtZW50TGlzdC5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIG91dHB1dEVsdC5hcHBlbmRDaGlsZCgoRWxlbWVudCkgb3V0cHV0RWxlbWVudExpc3QuZ2V0KGkpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICogU2V0dGluZyB0aGUgZWZmZWN0aXZlIHBvbGljeSBmb3IgdGhlIG91dHB1dCBtZXNzYWdlLgotICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIFBvbGljeSBwb2xpY3kgPSBnZXRCaW5kaW5nUG9saWN5RnJvbU1lc3NhZ2UoYmluZGluZ09wZXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgV1NETENvbnN0YW50cy5XU0RMX01FU1NBR0VfRElSRUNUSU9OX09VVCk7Ci0KLSAgICAgICAgICAgIGlmIChwb2xpY3kgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJwb2xpY3kiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvbGljeVV0aWwuZ2V0U2FmZVN0cmluZyhQb2xpY3lVdGlsLnBvbGljeUNvbXBvbmVudFRvU3RyaW5nKHBvbGljeSkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dEVsdCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJjYW4ndCBzZXJpYWxpemUgdGhlIHBvbGljeSAuLiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gb3V0cHV0RWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgaW5wdXQgZWxlbWVudAotICAgICAqCi0gICAgICogQHBhcmFtIGRvYwotICAgICAqIEBwYXJhbSBiaW5kaW5nT3BlcmF0aW9uCi0gICAgICogQHBhcmFtIGhlYWRlclBhcmFtZXRlclFOYW1lTGlzdAotICAgICAqIEByZXR1cm4gRE9NIGVsZW1lbnQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRWxlbWVudCBnZXRJbnB1dEVsZW1lbnQoRG9jdW1lbnQgZG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBeGlzQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0IGhlYWRlclBhcmFtZXRlclFOYW1lTGlzdCkgewotICAgICAgICBBeGlzT3BlcmF0aW9uIG9wZXJhdGlvbiA9IGJpbmRpbmdPcGVyYXRpb24uZ2V0QXhpc09wZXJhdGlvbigpOwotICAgICAgICBFbGVtZW50IGlucHV0RWx0ID0gZG9jLmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7Ci0gICAgICAgIFN0cmluZyBtZXAgPSBvcGVyYXRpb24uZ2V0TWVzc2FnZUV4Y2hhbmdlUGF0dGVybigpOwotCi0gICAgICAgIGlmIChXU0RMVXRpbC5pc0lucHV0UHJlc2VudEZvck1FUChtZXApKSB7Ci0KLSAgICAgICAgICAgIEVsZW1lbnRbXSBwYXJhbSA9IGdldElucHV0UGFyYW1FbGVtZW50KGRvYywgb3BlcmF0aW9uKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW0ubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpbnB1dEVsdC5hcHBlbmRDaGlsZChwYXJhbVtpXSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIExpc3QgcGFyYW1ldGVyRWxlbWVudExpc3QgPSBnZXRQYXJhbWV0ZXJFbGVtZW50TGlzdChkb2MsIGhlYWRlclBhcmFtZXRlclFOYW1lTGlzdCwKLSAgICAgICAgICAgICAgICAgICAgV1NETENvbnN0YW50cy5TT0FQX0hFQURFUik7Ci0gICAgICAgICAgICBwYXJhbWV0ZXJFbGVtZW50TGlzdC5hZGRBbGwoZ2V0UGFyYW1ldGVyRWxlbWVudExpc3RGb3JIdHRwSGVhZGVyKGRvYywKLSAgICAgICAgICAgICAgICAgICAgKEFycmF5TGlzdCkgZ2V0QmluZGluZ1Byb3BlcnR5RnJvbU1lc3NhZ2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NETDJDb25zdGFudHMuQVRUUl9XSFRUUF9IRUFERVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uLmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU0RMQ29uc3RhbnRzLldTRExfTUVTU0FHRV9ESVJFQ1RJT05fSU4pLAotICAgICAgICAgICAgICAgICAgICBXU0RMQ29uc3RhbnRzLkhUVFBfSEVBREVSKSk7Ci0gICAgICAgICAgICBwYXJhbWV0ZXJFbGVtZW50TGlzdC5hZGRBbGwoZ2V0UGFyYW1ldGVyRWxlbWVudExpc3RGb3JTT0FQTW9kdWxlcyhkb2MsCi0gICAgICAgICAgICAgICAgICAgIChBcnJheUxpc3QpIGdldEJpbmRpbmdQcm9wZXJ0eUZyb21NZXNzYWdlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdTREwyQ29uc3RhbnRzLkFUVFJfV1NPQVBfTU9EVUxFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbi5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NETENvbnN0YW50cy5XU0RMX01FU1NBR0VfRElSRUNUSU9OX0lOKSkpOwotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtZXRlckVsZW1lbnRMaXN0LnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaW5wdXRFbHQuYXBwZW5kQ2hpbGQoKEVsZW1lbnQpIHBhcmFtZXRlckVsZW1lbnRMaXN0LmdldChpKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAqIFNldHRpbmcgdGhlIGVmZmVjdGl2ZSBwb2xpY3kgb2YgaW5wdXQgbWVzc2FnZQotICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIFBvbGljeSBwb2xpY3kgPSBnZXRCaW5kaW5nUG9saWN5RnJvbU1lc3NhZ2UoYmluZGluZ09wZXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgV1NETENvbnN0YW50cy5XU0RMX01FU1NBR0VfRElSRUNUSU9OX0lOKTsKLQotICAgICAgICAgICAgaWYgKHBvbGljeSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgInBvbGljeSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9saWN5VXRpbC5nZXRTYWZlU3RyaW5nKFBvbGljeVV0aWwucG9saWN5Q29tcG9uZW50VG9TdHJpbmcocG9saWN5KSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRFbHQpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiY2FuJ3Qgc2VyaWFsaXplIHRoZSBwb2xpY3kgLi4iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaW5wdXRFbHQ7Ci0gICAgfQotCi19Ci0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL2VtaXR0ZXIvRW1pdHRlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vZW1pdHRlci9FbWl0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiZmZhMjYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vZW1pdHRlci9FbWl0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLmVtaXR0ZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5Db2RlR2VuQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5Db2RlR2VuZXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuZGF0YWJpbmRpbmcuVHlwZU1hcHBlcjsKLQotcHVibGljIGludGVyZmFjZSBFbWl0dGVyIHsKLQotICAgIHB1YmxpYyB2b2lkIHNldENvZGVHZW5Db25maWd1cmF0aW9uKENvZGVHZW5Db25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pOwotCi0gICAgcHVibGljIHZvaWQgc2V0TWFwcGVyKFR5cGVNYXBwZXIgbWFwcGVyKTsKLQotICAgIHB1YmxpYyB2b2lkIGVtaXRTdHViKCkgdGhyb3dzIENvZGVHZW5lcmF0aW9uRXhjZXB0aW9uOwotCi0gICAgcHVibGljIHZvaWQgZW1pdFNrZWxldG9uKCkgdGhyb3dzIENvZGVHZW5lcmF0aW9uRXhjZXB0aW9uOwotCi0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL2VtaXR0ZXIvSmF2YUVtaXR0ZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL2VtaXR0ZXIvSmF2YUVtaXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFlZGUxYy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi9lbWl0dGVyL0phdmFFbWl0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLmVtaXR0ZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5Db2RlR2VuQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuZGF0YWJpbmRpbmcuRGVmYXVsdFR5cGVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLmRhdGFiaW5kaW5nLlR5cGVNYXBwZXI7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhRW1pdHRlciBleHRlbmRzIEF4aXNTZXJ2aWNlQmFzZWRNdWx0aUxhbmd1YWdlRW1pdHRlciB7Ci0KLSAgICBwdWJsaWMgSmF2YUVtaXR0ZXIoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyoqIEBwYXJhbSBjb25maWd1cmF0aW9uICAqLwotICAgIHB1YmxpYyBKYXZhRW1pdHRlcihDb2RlR2VuQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIHRoaXMuY29kZUdlbkNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uOwotICAgICAgICB0aGlzLm1hcHBlciA9IG5ldyBEZWZhdWx0VHlwZU1hcHBlcigpOwotCi0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gY29uZmlndXJhdGlvbgotICAgICAqIEBwYXJhbSBtYXBwZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgSmF2YUVtaXR0ZXIoQ29kZUdlbkNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiwgVHlwZU1hcHBlciBtYXBwZXIpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgdGhpcy5jb2RlR2VuQ29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb247Ci0gICAgICAgIHRoaXMubWFwcGVyID0gbWFwcGVyOwotCi0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL2VtaXR0ZXIvamF4d3MvQW5ub3RhdGlvbkVsZW1lbnRCdWlsZGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi9lbWl0dGVyL2pheHdzL0Fubm90YXRpb25FbGVtZW50QnVpbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmUwNDdmLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL2VtaXR0ZXIvamF4d3MvQW5ub3RhdGlvbkVsZW1lbnRCdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5lbWl0dGVyLmpheHdzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLlhTTFRVdGlsczsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgQW5ub3RhdGlvbkVsZW1lbnRCdWlsZGVyIHsKLQotICAgIHN0YXRpYyBFbGVtZW50IGJ1aWxkV2ViU2VydmljZUFubm90YXRpb25FbGVtZW50KFN0cmluZyBuYW1lLCBTdHJpbmcgdGFyZ2V0TlMsIFN0cmluZyB3c2RsTG9jYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRG9jdW1lbnQgZG9jKSB7Ci0KLSAgICAgICAgRWxlbWVudCBhbm5vdGF0aW9uRWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50KCJhbm5vdGF0aW9uIik7Ci0gICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUoZG9jLCAibmFtZSIsICJqYXZheC5qd3MuV2ViU2VydmljZSIsIGFubm90YXRpb25FbGVtZW50KTsKLQotICAgICAgICBFbGVtZW50IHBhcmFtRWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50KCJwYXJhbSIpOwotICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKGRvYywgInR5cGUiLCAibmFtZSIsIHBhcmFtRWxlbWVudCk7Ci0gICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUoZG9jLCAidmFsdWUiLCBuYW1lLCBwYXJhbUVsZW1lbnQpOwotICAgICAgICBhbm5vdGF0aW9uRWxlbWVudC5hcHBlbmRDaGlsZChwYXJhbUVsZW1lbnQpOwotCi0gICAgICAgIHBhcmFtRWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50KCJwYXJhbSIpOwotICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKGRvYywgInR5cGUiLCAidGFyZ2V0TmFtZXNwYWNlIiwgcGFyYW1FbGVtZW50KTsKLSAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShkb2MsICJ2YWx1ZSIsIHRhcmdldE5TLCBwYXJhbUVsZW1lbnQpOwotICAgICAgICBhbm5vdGF0aW9uRWxlbWVudC5hcHBlbmRDaGlsZChwYXJhbUVsZW1lbnQpOwotCi0gICAgICAgIHJldHVybiBhbm5vdGF0aW9uRWxlbWVudDsKLSAgICB9Ci0KLSAgICBzdGF0aWMgRWxlbWVudCBidWlsZFdlYlNlcnZpY2VBbm5vdGF0aW9uRWxlbWVudChTdHJpbmcgZW5kcG9pbnRJbnRlcmZhY2UsIERvY3VtZW50IGRvYykgewotCi0gICAgICAgIEVsZW1lbnQgYW5ub3RhdGlvbkVsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudCgiYW5ub3RhdGlvbiIpOwotICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKGRvYywgIm5hbWUiLCAiamF2YXguandzLldlYlNlcnZpY2UiLCBhbm5vdGF0aW9uRWxlbWVudCk7Ci0KLSAgICAgICAgRWxlbWVudCBwYXJhbUVsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudCgicGFyYW0iKTsKLSAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShkb2MsICJ0eXBlIiwgImVuZHBvaW50SW50ZXJmYWNlIiwgcGFyYW1FbGVtZW50KTsKLSAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShkb2MsICJ2YWx1ZSIsIGVuZHBvaW50SW50ZXJmYWNlLCBwYXJhbUVsZW1lbnQpOwotICAgICAgICBhbm5vdGF0aW9uRWxlbWVudC5hcHBlbmRDaGlsZChwYXJhbUVsZW1lbnQpOwotCi0gICAgICAgIHJldHVybiBhbm5vdGF0aW9uRWxlbWVudDsKLSAgICB9Ci0KLSAgICBzdGF0aWMgRWxlbWVudCBidWlsZFdlYkZhdWx0QW5ub3RhdGlvbkVsZW1lbnQoU3RyaW5nIG5hbWUsIFN0cmluZyB0YXJnZXROUywgRG9jdW1lbnQgZG9jKSB7Ci0gICAgICAgIEVsZW1lbnQgYW5ub3RhdGlvbkVsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudCgiYW5ub3RhdGlvbiIpOwotICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKGRvYywgIm5hbWUiLCAiamF2YXgueG1sLndzLldlYkZhdWx0IiwgYW5ub3RhdGlvbkVsZW1lbnQpOwotCi0gICAgICAgIEVsZW1lbnQgcGFyYW1FbGVtZW50ID0gZG9jLmNyZWF0ZUVsZW1lbnQoInBhcmFtIik7Ci0gICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUoZG9jLCAidHlwZSIsICJuYW1lIiwgcGFyYW1FbGVtZW50KTsKLSAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShkb2MsICJ2YWx1ZSIsIG5hbWUsIHBhcmFtRWxlbWVudCk7Ci0gICAgICAgIGFubm90YXRpb25FbGVtZW50LmFwcGVuZENoaWxkKHBhcmFtRWxlbWVudCk7Ci0KLSAgICAgICAgcGFyYW1FbGVtZW50ID0gZG9jLmNyZWF0ZUVsZW1lbnQoInBhcmFtIik7Ci0gICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUoZG9jLCAidHlwZSIsICJ0YXJnZXROYW1lc3BhY2UiLCBwYXJhbUVsZW1lbnQpOwotICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKGRvYywgInZhbHVlIiwgdGFyZ2V0TlMsIHBhcmFtRWxlbWVudCk7Ci0gICAgICAgIGFubm90YXRpb25FbGVtZW50LmFwcGVuZENoaWxkKHBhcmFtRWxlbWVudCk7Ci0KLSAgICAgICAgcmV0dXJuIGFubm90YXRpb25FbGVtZW50OwotICAgIH0KLQotICAgIHN0YXRpYyBFbGVtZW50IGJ1aWxkV2ViU2VydmljZUNsaWVudEFubm90YXRpb25FbGVtZW50KFN0cmluZyBuYW1lLCBTdHJpbmcgdGFyZ2V0TlMsIFN0cmluZyB3c2RsTG9jYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRG9jdW1lbnQgZG9jKSB7Ci0KLSAgICAgICAgRWxlbWVudCBhbm5vdGF0aW9uRWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50KCJhbm5vdGF0aW9uIik7Ci0gICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUoZG9jLCAibmFtZSIsICJqYXZheC54bWwud3MuV2ViU2VydmljZUNsaWVudCIsIGFubm90YXRpb25FbGVtZW50KTsKLQotICAgICAgICBFbGVtZW50IHBhcmFtRWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50KCJwYXJhbSIpOwotICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKGRvYywgInR5cGUiLCAibmFtZSIsIHBhcmFtRWxlbWVudCk7Ci0gICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUoZG9jLCAidmFsdWUiLCBuYW1lLCBwYXJhbUVsZW1lbnQpOwotICAgICAgICBhbm5vdGF0aW9uRWxlbWVudC5hcHBlbmRDaGlsZChwYXJhbUVsZW1lbnQpOwotCi0gICAgICAgIHBhcmFtRWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50KCJwYXJhbSIpOwotICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKGRvYywgInR5cGUiLCAidGFyZ2V0TmFtZXNwYWNlIiwgcGFyYW1FbGVtZW50KTsKLSAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShkb2MsICJ2YWx1ZSIsIHRhcmdldE5TLCBwYXJhbUVsZW1lbnQpOwotICAgICAgICBhbm5vdGF0aW9uRWxlbWVudC5hcHBlbmRDaGlsZChwYXJhbUVsZW1lbnQpOwotCi0gICAgICAgIHBhcmFtRWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50KCJwYXJhbSIpOwotICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKGRvYywgInR5cGUiLCAid3NkbExvY2F0aW9uIiwgcGFyYW1FbGVtZW50KTsKLSAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShkb2MsICJ2YWx1ZSIsIHdzZGxMb2NhdGlvbiwgcGFyYW1FbGVtZW50KTsKLSAgICAgICAgYW5ub3RhdGlvbkVsZW1lbnQuYXBwZW5kQ2hpbGQocGFyYW1FbGVtZW50KTsKLQotICAgICAgICByZXR1cm4gYW5ub3RhdGlvbkVsZW1lbnQ7Ci0gICAgfQotCi0gICAgc3RhdGljIEVsZW1lbnQgYnVpbGRXZWJFbmRQb2ludEFubm90YXRpb25FbGVtZW50KFN0cmluZyBuYW1lLCBEb2N1bWVudCBkb2MpIHsKLSAgICAgICAgRWxlbWVudCBhbm5vdGF0aW9uRWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50KCJhbm5vdGF0aW9uIik7Ci0gICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUoZG9jLCAibmFtZSIsICJqYXZheC54bWwud3MuV2ViRW5kcG9pbnQiLCBhbm5vdGF0aW9uRWxlbWVudCk7Ci0KLSAgICAgICAgRWxlbWVudCBwYXJhbUVsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudCgicGFyYW0iKTsKLSAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShkb2MsICJ0eXBlIiwgIm5hbWUiLCBwYXJhbUVsZW1lbnQpOwotICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKGRvYywgInZhbHVlIiwgbmFtZSwgcGFyYW1FbGVtZW50KTsKLSAgICAgICAgYW5ub3RhdGlvbkVsZW1lbnQuYXBwZW5kQ2hpbGQocGFyYW1FbGVtZW50KTsKLQotICAgICAgICByZXR1cm4gYW5ub3RhdGlvbkVsZW1lbnQ7Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi9lbWl0dGVyL2pheHdzL0pBWFdTMjBFbWl0dGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi9lbWl0dGVyL2pheHdzL0pBWFdTMjBFbWl0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwOWI4MGEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vZW1pdHRlci9qYXh3cy9KQVhXUzIwRW1pdHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4uZW1pdHRlci5qYXh3czsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uV1NETDJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgSkFYV1MyMEVtaXR0ZXIgZXh0ZW5kcyBKQVhXU0VtaXR0ZXIgewotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgWE1MIG1vZGVsIGZvciB0aGUgU2VydmljZSBFbmRwb2ludCBpbnRlcmZhY2UKLSAgICAgKgotICAgICAqIEByZXR1cm4gRE9NIERvY3VtZW50Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIERvY3VtZW50IGNyZWF0ZURPTURvY3VtZW50Rm9yU0VJKCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIERvY3VtZW50IGRvYyA9IGdldEVtcHR5RG9jdW1lbnQoKTsKLSAgICAgICAgRWxlbWVudCByb290RWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50KCJqYXZhQ29uc3RydWN0Iik7Ci0KLSAgICAgICAgRWxlbWVudCBpbXBvcnRMaXN0ID0gZG9jLmNyZWF0ZUVsZW1lbnQoImltcG9ydExpc3QiKTsKLSAgICAgICAgcm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQoaW1wb3J0TGlzdCk7Ci0KLSAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gY29kZUdlbkNvbmZpZ3VyYXRpb24uZ2V0UGFja2FnZU5hbWUoKTsKLSAgICAgICAgU3RyaW5nIHRhcmdldE5TID0gY29kZUdlbkNvbmZpZ3VyYXRpb24uZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgIFN0cmluZyBwb3J0VHlwZU5hbWUgPSAoU3RyaW5nKSBheGlzU2VydmljZS5nZXRQYXJhbWV0ZXJWYWx1ZShXU0RMMkNvbnN0YW50cy5JTlRFUkZBQ0VfTE9DQUxfTkFNRSk7Ci0gICAgICAgIHBvcnRUeXBlTmFtZSA9IHJlc29sdmVOYW1lQ29sbGlzaW9uKHBvcnRUeXBlTmFtZSwgcGFja2FnZU5hbWUsIFRZUEVfU1VGRklYKTsKLSAgICAgICAgdGhpcy5heGlzU2VydmljZS5hZGRQYXJhbWV0ZXIoSkFYV1NfUE9SVF9UWVBFX05BTUUsIHBvcnRUeXBlTmFtZSk7Ci0KLSAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgInBhY2thZ2UiLCBwYWNrYWdlTmFtZSwgcm9vdEVsZW1lbnQpOwotICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAidGFyZ2V0TmFtZXNwYWNlIiwgdGFyZ2V0TlMsIHJvb3RFbGVtZW50KTsKLSAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgIm5hbWUiLCBwb3J0VHlwZU5hbWUsIHJvb3RFbGVtZW50KTsKLQotICAgICAgICBFbGVtZW50IGFubm90YXRpb25FbGVtZW50ID0gQW5ub3RhdGlvbkVsZW1lbnRCdWlsZGVyLmJ1aWxkV2ViU2VydmljZUFubm90YXRpb25FbGVtZW50KHBvcnRUeXBlTmFtZSwgdGFyZ2V0TlMsCi0gICAgICAgICAgICAgICAgIiIsIGRvYyk7Ci0gICAgICAgIHJvb3RFbGVtZW50LmFwcGVuZENoaWxkKGFubm90YXRpb25FbGVtZW50KTsKLQotICAgICAgICBsb2FkT3BlcmF0aW9ucyhkb2MsIHJvb3RFbGVtZW50LCBudWxsKTsKLQotICAgICAgICAvL2F0dGFjaCBhIGxpc3Qgb2YgZmF1bHRzCi0gICAgICAgIHJvb3RFbGVtZW50LmFwcGVuZENoaWxkKGdldFVuaXF1ZUxpc3RvZkZhdWx0cyhkb2MpKTsKLSAgICAgICAgZG9jLmFwcGVuZENoaWxkKHJvb3RFbGVtZW50KTsKLSAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihET00yV3JpdGVyLm5vZGVUb1N0cmluZyhyb290RWxlbWVudCkpOwotICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAgICAgcmV0dXJuIGRvYzsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIFhNTCBtb2RlbCBmb3IgdGhlIFNlcnZpY2UgRW5kcG9pbnQgaW50ZXJmYWNlCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIERPTSBEb2N1bWVudAotICAgICAqLwotICAgIHByb3RlY3RlZCBEb2N1bWVudCBjcmVhdGVET01Eb2N1bWVudEZvclNFSUltcGwoKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgRG9jdW1lbnQgZG9jID0gZ2V0RW1wdHlEb2N1bWVudCgpOwotICAgICAgICBFbGVtZW50IHJvb3RFbGVtZW50ID0gZG9jLmNyZWF0ZUVsZW1lbnQoImphdmFDb25zdHJ1Y3QiKTsKLQotICAgICAgICAvL0VsZW1lbnQgaW1wb3J0TGlzdCA9IGRvYy5jcmVhdGVFbGVtZW50KCJpbXBvcnRMaXN0Iik7Ci0gICAgICAgIC8vcm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQoaW1wb3J0TGlzdCk7Ci0KLSAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gY29kZUdlbkNvbmZpZ3VyYXRpb24uZ2V0UGFja2FnZU5hbWUoKTsKLSAgICAgICAgU3RyaW5nIHRhcmdldE5TID0gY29kZUdlbkNvbmZpZ3VyYXRpb24uZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgIFN0cmluZyBwb3J0VHlwZU5hbWUgPSAoU3RyaW5nKSBheGlzU2VydmljZS5nZXRQYXJhbWV0ZXJWYWx1ZShXU0RMMkNvbnN0YW50cy5JTlRFUkZBQ0VfTE9DQUxfTkFNRSk7Ci0gICAgICAgIHBvcnRUeXBlTmFtZSA9IHJlc29sdmVOYW1lQ29sbGlzaW9uKHBvcnRUeXBlTmFtZSwgcGFja2FnZU5hbWUsIFRZUEVfU1VGRklYKTsKLSAgICAgICAgdGhpcy5heGlzU2VydmljZS5hZGRQYXJhbWV0ZXIoSkFYV1NfUE9SVF9UWVBFX05BTUUsIHBvcnRUeXBlTmFtZSk7Ci0KLSAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgInBhY2thZ2UiLCBwYWNrYWdlTmFtZSwgcm9vdEVsZW1lbnQpOwotICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAidGFyZ2V0TmFtZXNwYWNlIiwgdGFyZ2V0TlMsIHJvb3RFbGVtZW50KTsKLSAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgIm5hbWUiLCBheGlzU2VydmljZS5nZXRQYXJhbWV0ZXIoSkFYV1NfUE9SVF9UWVBFX05BTUUpLmdldFZhbHVlKCkgKyBKQVhXU19JTVBMX1NVRkZJWCwKLSAgICAgICAgICAgICAgICByb290RWxlbWVudCk7Ci0KLSAgICAgICAgRWxlbWVudCBhbm5vdGF0aW9uRWxlbWVudCA9IEFubm90YXRpb25FbGVtZW50QnVpbGRlci5idWlsZFdlYlNlcnZpY2VBbm5vdGF0aW9uRWxlbWVudCgKLSAgICAgICAgICAgICAgIHBhY2thZ2VOYW1lICsiLiIgK2F4aXNTZXJ2aWNlLmdldFBhcmFtZXRlcihKQVhXU19QT1JUX1RZUEVfTkFNRSkuZ2V0VmFsdWUoKSwgZG9jKTsKLSAgICAgICAgcm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQoYW5ub3RhdGlvbkVsZW1lbnQpOwotCi0gICAgICAgIGxvYWRPcGVyYXRpb25zKGRvYywgcm9vdEVsZW1lbnQsIG51bGwpOwotCi0gICAgICAgIC8vYXR0YWNoIGEgbGlzdCBvZiBmYXVsdHMKLSAgICAgICAgcm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQoZ2V0VW5pcXVlTGlzdG9mRmF1bHRzKGRvYykpOwotICAgICAgICBkb2MuYXBwZW5kQ2hpbGQocm9vdEVsZW1lbnQpOwotICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKERPTTJXcml0ZXIubm9kZVRvU3RyaW5nKHJvb3RFbGVtZW50KSk7Ci0gICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgICAgICByZXR1cm4gZG9jOwotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgWE1MIG1vZGVsIGZvciB0aGUgU2VydmljZSBDbGFzcwotICAgICAqCi0gICAgICogQHJldHVybiBET00gRG9jdW1lbnQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRG9jdW1lbnQgY3JlYXRlRE9NRG9jdW1lbnRGb3JTZXJ2aWNlQ2xhc3MoKSB7Ci0gICAgICAgIERvY3VtZW50IGRvYyA9IGdldEVtcHR5RG9jdW1lbnQoKTsKLSAgICAgICAgRWxlbWVudCByb290RWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50KCJqYXZhQ29uc3RydWN0Iik7Ci0KLSAgICAgICAgRWxlbWVudCBpbXBvcnRMaXN0ID0gZG9jLmNyZWF0ZUVsZW1lbnQoImltcG9ydExpc3QiKTsKLSAgICAgICAgcm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQoaW1wb3J0TGlzdCk7Ci0KLSAgICAgICAgU3RyaW5nIHNlcnZpY2VOYW1lID0gYXhpc1NlcnZpY2UuZ2V0TmFtZSgpOwotICAgICAgICBTdHJpbmcgY2FwaXRhbGl6ZWRTZXJ2aWNlTmFtZSA9IHNlcnZpY2VOYW1lLnRvVXBwZXJDYXNlKCk7Ci0gICAgICAgIFN0cmluZyB3c2RsTG9jYXRpb24gPSAiTmVlZHMgdG8gYmUgZml4ZWQiOwotICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSBjb2RlR2VuQ29uZmlndXJhdGlvbi5nZXRQYWNrYWdlTmFtZSgpOwotICAgICAgICBTdHJpbmcgdGFyZ2V0TlMgPSBjb2RlR2VuQ29uZmlndXJhdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLQotICAgICAgICBzZXJ2aWNlTmFtZSA9IHJlc29sdmVOYW1lQ29sbGlzaW9uKHNlcnZpY2VOYW1lLCBwYWNrYWdlTmFtZSwgVFlQRV9TVUZGSVgpOwotCi0gICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJwYWNrYWdlIiwgcGFja2FnZU5hbWUsIHJvb3RFbGVtZW50KTsKLSAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgInRhcmdldE5hbWVzcGFjZSIsIHRhcmdldE5TLCByb290RWxlbWVudCk7Ci0gICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJuYW1lIiwgc2VydmljZU5hbWUsIHJvb3RFbGVtZW50KTsKLSAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgIndzZGxMb2NhdGlvbiIsIHdzZGxMb2NhdGlvbiwgcm9vdEVsZW1lbnQpOwotICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAiY2FwaXRhbGl6ZWRTZXJ2aWNlTmFtZSIsIGNhcGl0YWxpemVkU2VydmljZU5hbWUsIHJvb3RFbGVtZW50KTsKLQotICAgICAgICBFbGVtZW50IGFubm90YXRpb25FbGVtZW50ID0gQW5ub3RhdGlvbkVsZW1lbnRCdWlsZGVyLmJ1aWxkV2ViU2VydmljZUNsaWVudEFubm90YXRpb25FbGVtZW50KHNlcnZpY2VOYW1lLAotICAgICAgICAgICAgICAgIHRhcmdldE5TLCB3c2RsTG9jYXRpb24sIGRvYyk7Ci0gICAgICAgIHJvb3RFbGVtZW50LmFwcGVuZENoaWxkKGFubm90YXRpb25FbGVtZW50KTsKLQotICAgICAgICAvL0J1aWxkaW5nIHBvcnRUeXBlIEVsZW1lbnRzIC0tIHRoaW5rIG9mIGEgc3VpdGFibGUgc29sdXRpb24KLSAgICAgICAgZm9yIChJdGVyYXRvciBwb3J0SXRlcmF0b3IgPSBheGlzU2VydmljZS5nZXRFbmRwb2ludHMoKS5rZXlTZXQoKS5pdGVyYXRvcigpOyBwb3J0SXRlcmF0b3IuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgU3RyaW5nIHBvcnROYW1lID0gKFN0cmluZykgcG9ydEl0ZXJhdG9yLm5leHQoKTsKLQotICAgICAgICAgICAgRWxlbWVudCBwb3J0RWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50KCJwb3J0Iik7Ci0gICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAicG9ydE5hbWUiLCBwb3J0TmFtZSwgcG9ydEVsZW1lbnQpOwotICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgInBvcnRUeXBlTmFtZSIsIChTdHJpbmcpIHRoaXMuYXhpc1NlcnZpY2UuZ2V0UGFyYW1ldGVyKEpBWFdTX1BPUlRfVFlQRV9OQU1FKS5nZXRWYWx1ZSgpLAotICAgICAgICAgICAgICAgICAgICBwb3J0RWxlbWVudCk7Ci0KLSAgICAgICAgICAgIEVsZW1lbnQgZW5kUG9pbnRBbm5vRWxlbWVudCA9IEFubm90YXRpb25FbGVtZW50QnVpbGRlci5idWlsZFdlYkVuZFBvaW50QW5ub3RhdGlvbkVsZW1lbnQocG9ydE5hbWUsIGRvYyk7Ci0gICAgICAgICAgICBwb3J0RWxlbWVudC5hcHBlbmRDaGlsZChlbmRQb2ludEFubm9FbGVtZW50KTsKLQotICAgICAgICAgICAgcm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQocG9ydEVsZW1lbnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy9hdHRhY2ggYSBsaXN0IG9mIGZhdWx0cwotICAgICAgICByb290RWxlbWVudC5hcHBlbmRDaGlsZChnZXRVbmlxdWVMaXN0b2ZGYXVsdHMoZG9jKSk7Ci0gICAgICAgIGRvYy5hcHBlbmRDaGlsZChyb290RWxlbWVudCk7Ci0gICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oRE9NMldyaXRlci5ub2RlVG9TdHJpbmcocm9vdEVsZW1lbnQpKTsKLSAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgICAgIHJldHVybiBkb2M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgWE1MIG1vZGVsIGZvciBhIEV4Y2VwdGlvbiBDbGFzcwotICAgICAqCi0gICAgICogQHBhcmFtIGtleSBTdHJpbmcKLSAgICAgKiBAcmV0dXJuIERPTSBEb2N1bWVudAotICAgICAqLwotICAgIHByb3RlY3RlZCBEb2N1bWVudCBjcmVhdGVET01Eb2N1bWVudEZvckV4Y2VwdGlvbihTdHJpbmcga2V5KSB7Ci0gICAgICAgIERvY3VtZW50IGRvYyA9IGdldEVtcHR5RG9jdW1lbnQoKTsKLSAgICAgICAgRWxlbWVudCBmYXVsdEVsZW1lbnQ7Ci0KLSAgICAgICAgZmF1bHRFbGVtZW50ID0gZG9jLmNyZWF0ZUVsZW1lbnQoImphdmFDb25zdHJ1Y3QiKTsKLSAgICAgICAgRWxlbWVudCBpbXBvcnRMaXN0ID0gZG9jLmNyZWF0ZUVsZW1lbnQoImltcG9ydExpc3QiKTsKLSAgICAgICAgZmF1bHRFbGVtZW50LmFwcGVuZENoaWxkKGltcG9ydExpc3QpOwotCi0gICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9IGNvZGVHZW5Db25maWd1cmF0aW9uLmdldFBhY2thZ2VOYW1lKCk7Ci0gICAgICAgIFN0cmluZyB0YXJnZXROUyA9IGNvZGVHZW5Db25maWd1cmF0aW9uLmdldFRhcmdldE5hbWVzcGFjZSgpOwotCi0gICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJwYWNrYWdlIiwgcGFja2FnZU5hbWUsIGZhdWx0RWxlbWVudCk7Ci0gICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJ0YXJnZXROYW1lc3BhY2UiLCB0YXJnZXROUywgZmF1bHRFbGVtZW50KTsKLQotICAgICAgICBTdHJpbmcgZXhjZXB0aW9uQ2xhc3NOYW1lID0gKFN0cmluZykgZmF1bHRDbGFzc05hbWVNYXAuZ2V0KGtleSk7Ci0gICAgICAgIFN0cmluZyByZXNvbHZlZEV4cENsYXNzID0gcmVzb2x2ZU5hbWVDb2xsaXNpb24oZXhjZXB0aW9uQ2xhc3NOYW1lLCBwYWNrYWdlTmFtZSwgRVhDRVBUSU9OX1NVRkZJWCk7Ci0KLSAgICAgICAgaWYgKCFyZXNvbHZlZEV4cENsYXNzLmVxdWFscyhleGNlcHRpb25DbGFzc05hbWUpKQotICAgICAgICAgICAgZmF1bHRDbGFzc05hbWVNYXAucHV0KGtleSwgcmVzb2x2ZWRFeHBDbGFzcyk7Ci0KLSAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgIm5hbWUiLCByZXNvbHZlZEV4cENsYXNzLCBmYXVsdEVsZW1lbnQpOwotCi0gICAgICAgIFN0cmluZyB0eXBlTWFwcGluZyA9Ci0gICAgICAgICAgICAgICAgdGhpcy5tYXBwZXIuZ2V0VHlwZU1hcHBpbmdOYW1lKChRTmFtZSkgZmF1bHRFbGVtZW50UU5hbWVNYXAuZ2V0KGtleSkpOwotICAgICAgICBTdHJpbmcgc2hvcnRUeXBlID0gZXh0cmF0Q2xhc3NOYW1lKHR5cGVNYXBwaW5nKTsKLQotICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAidHlwZSIsICh0eXBlTWFwcGluZyA9PSBudWxsKQotICAgICAgICAgICAgICAgID8gIiIKLSAgICAgICAgICAgICAgICA6IHR5cGVNYXBwaW5nLCBmYXVsdEVsZW1lbnQpOwotCi0gICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJzaG9ydFR5cGUiLCAoc2hvcnRUeXBlID09IG51bGwpCi0gICAgICAgICAgICAgICAgPyAiIgotICAgICAgICAgICAgICAgIDogc2hvcnRUeXBlLCBmYXVsdEVsZW1lbnQpOwotCi0gICAgICAgIEVsZW1lbnQgaW1wb3J0RWxlbWVudDsKLSAgICAgICAgaW1wb3J0RWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50KCJpbXBvcnQiKTsKLSAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgInZhbHVlIiwgdHlwZU1hcHBpbmcsIGltcG9ydEVsZW1lbnQpOwotICAgICAgICBpbXBvcnRMaXN0LmFwcGVuZENoaWxkKGltcG9ydEVsZW1lbnQpOwotCi0gICAgICAgIGlmIChtYXBwZXIuZ2V0RGVmYXVsdE1hcHBpbmdOYW1lKCkuZXF1YWxzKHR5cGVNYXBwaW5nKSkgewotICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgImRlZmF1bHQiLCAieWVzIiwgZmF1bHRFbGVtZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJ2YWx1ZSIsIGdldFBhcmFtSW5pdGlhbGl6ZXIodHlwZU1hcHBpbmcpLAotICAgICAgICAgICAgICAgIGZhdWx0RWxlbWVudCk7Ci0KLSAgICAgICAgRWxlbWVudCBhbm5vdGF0aW9uRWxlbWVudCA9IEFubm90YXRpb25FbGVtZW50QnVpbGRlci5idWlsZFdlYkZhdWx0QW5ub3RhdGlvbkVsZW1lbnQodHlwZU1hcHBpbmcsCi0gICAgICAgICAgICAgICAgY29kZUdlbkNvbmZpZ3VyYXRpb24uZ2V0VGFyZ2V0TmFtZXNwYWNlKCksIGRvYyk7Ci0gICAgICAgIGZhdWx0RWxlbWVudC5hcHBlbmRDaGlsZChhbm5vdGF0aW9uRWxlbWVudCk7Ci0gICAgICAgIGRvYy5hcHBlbmRDaGlsZChmYXVsdEVsZW1lbnQpOwotICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKERPTTJXcml0ZXIubm9kZVRvU3RyaW5nKGZhdWx0RWxlbWVudCkpOwotICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAgICAgcmV0dXJuIGRvYzsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vZW1pdHRlci9qYXh3cy9KQVhXU0VtaXR0ZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL2VtaXR0ZXIvamF4d3MvSkFYV1NFbWl0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkOWM0NTYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vZW1pdHRlci9qYXh3cy9KQVhXU0VtaXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLmVtaXR0ZXIuamF4d3M7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLkNvZGVHZW5Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLkNvZGVHZW5lcmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLmVtaXR0ZXIuQXhpc1NlcnZpY2VCYXNlZE11bHRpTGFuZ3VhZ2VFbWl0dGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLndyaXRlci5FeGNlcHRpb25Xcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4ud3JpdGVyLkZpbGVXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4ud3JpdGVyLkludGVyZmFjZUltcGxlbWVudGF0aW9uV3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLndyaXRlci5Ta2VsZXRvbkludGVyZmFjZVdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi53cml0ZXIuU2tlbGV0b25Xcml0ZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSkFYV1NFbWl0dGVyIGV4dGVuZHMgQXhpc1NlcnZpY2VCYXNlZE11bHRpTGFuZ3VhZ2VFbWl0dGVyIHsKLQotICAgIHByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIFRZUEVfU1VGRklYID0gIlR5cGUiOwotICAgIHByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIFNFUlZJQ0VfU1VGRklYID0gIlNlcnZpY2UiOwotICAgIHByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIEVYQ0VQVElPTl9TVUZGSVggPSAiRXhjZXB0aW9uIjsKLSAgICBwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBKQVhXU19QT1JUX1RZUEVfTkFNRSA9ICJKYXh3c1BvcnRUeXBlTmFtZSI7Ci0gICAgcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgSkFYV1NfSU1QTF9TVUZGSVggPSAiSW1wbCI7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb2RlR2VuQ29uZmlndXJhdGlvbihDb2RlR2VuQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB7Ci0gICAgICAgIHN1cGVyLnNldENvZGVHZW5Db25maWd1cmF0aW9uKGNvbmZpZ3VyYXRpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVtaXRTa2VsZXRvbigpIHRocm93cyBDb2RlR2VuZXJhdGlvbkV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgdHJ5IHsKLQotICAgICAgICAgICAgTWFwIG9yaWdpbmFsTWFwID0gZ2V0TmV3Q29weSh0aGlzLm1hcHBlci5nZXRBbGxNYXBwZWROYW1lcygpKTsKLSAgICAgICAgICAgIC8vIHdlIGFyZSBnb2luZyB0byBnZW5lcmF0ZSBmb2xsb3dpbmcgZmlsZXMgc2VwZXJhdGVseSBwZXIgc2VydmljZQotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBheGlzU2VydmljZXNJdGVyID0gdGhpcy5heGlzU2VydmljZXMuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICAgYXhpc1NlcnZpY2VzSXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5heGlzU2VydmljZSA9IChBeGlzU2VydmljZSkgYXhpc1NlcnZpY2VzSXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgdGhpcy5heGlzQmluZGluZyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBheGlzU2VydmljZS5nZXRFbmRwb2ludChheGlzU2VydmljZS5nZXRFbmRwb2ludE5hbWUoKSkuZ2V0QmluZGluZygpOwotCi0gICAgICAgICAgICAgICAgLy8gc2VlIHRoZSBjb21tZW50IGF0IHVwZGF0ZU1hcHBlckNsYXNzbmFtZXMgZm9yIGRldGFpbHMgYW5kIHJlYXNvbnMgZm9yCi0gICAgICAgICAgICAgICAgLy8gY2FsbGluZyB0aGlzIG1ldGhvZAotICAgICAgICAgICAgICAgIGlmIChtYXBwZXIuaXNPYmplY3RNYXBwaW5nUHJlc2VudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvcHlNYXAob3JpZ2luYWxNYXAsIHRoaXMubWFwcGVyLmdldEFsbE1hcHBlZE5hbWVzKCkpOwotICAgICAgICAgICAgICAgICAgICB1cGRhdGVNYXBwZXJGb3JNZXNzYWdlUmVjZWl2ZXIoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBjb3B5VG9GYXVsdE1hcCgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vaGFuZGxlIGZhdWx0cwotICAgICAgICAgICAgICAgIGdlbmVyYXRlQW5kUG9wdWxhdGVGYXVsdE5hbWVzKCk7Ci0KLSAgICAgICAgICAgICAgICAvL3dyaXRlIHRoZSBFeGNlcHRpb25zCi0gICAgICAgICAgICAgICAgd3JpdGVFeGNlcHRpb25zKCk7Ci0KLSAgICAgICAgICAgICAgICAvL3dyaXRlIHRoZSBTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZQotICAgICAgICAgICAgICAgIHdyaXRlU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCk7Ci0KLSAgICAgICAgICAgICAgICAvL3dyaXRlIHRoZSBTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZQotICAgICAgICAgICAgICAgIHdyaXRlU2VydmljZUVuZHBvaW50SW50ZXJmYWNlSW1wbCgpOwotCi0gICAgICAgICAgICAgICAgLy93cml0ZSB0aGUgU2VydmljZSBDbGFzcwotICAgICAgICAgICAgICAgIHdyaXRlU2VydmljZUNsYXNzKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHNhdmUgYmFjayB0eXBlIG1hcAotICAgICAgICAgICAgaWYgKHRoaXMubWFwcGVyLmlzT2JqZWN0TWFwcGluZ1ByZXNlbnQoKSkgewotICAgICAgICAgICAgICAgIGNvcHlNYXAob3JpZ2luYWxNYXAsIHRoaXMubWFwcGVyLmdldEFsbE1hcHBlZE5hbWVzKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyB3cml0ZSBzZXJ2aWNlIHhtbAotICAgICAgICAgICAgLy8gaWYgYXNrZWQKLSAgICAgICAgICAgIGlmIChjb2RlR2VuQ29uZmlndXJhdGlvbi5pc0dlbmVyYXRlRGVwbG95ZW1lbnREZXNjcmlwdG9yKCkpIHsKLSAgICAgICAgICAgICAgICB3cml0ZVNlcnZpY2VYbWwoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy93cml0ZSB0aGUgYW50IGJ1aWxkCi0gICAgICAgICAgICAvL3dlIHNraXAgdGhpcyBmb3IgdGhlIGZsYXR0ZW5lZCBjYXNlCi0gICAgICAgICAgICBpZiAoIWNvZGVHZW5Db25maWd1cmF0aW9uLmlzRmxhdHRlbkZpbGVzKCkpIHsKLSAgICAgICAgICAgICAgICB3cml0ZUFudEJ1aWxkKCk7Ci0gICAgICAgICAgICB9Ci0KLQotICAgICAgICB9IGNhdGNoIChDb2RlR2VuZXJhdGlvbkV4Y2VwdGlvbiBjZ0V4cCkgewotICAgICAgICAgICAgdGhyb3cgY2dFeHA7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ29kZUdlbmVyYXRpb25FeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZSB0aGUgc2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2UKLSAgICAgKgotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgd3JpdGVTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICBEb2N1bWVudCBza2VsZXRvbk1vZGVsID0gY3JlYXRlRE9NRG9jdW1lbnRGb3JTRUkoKTsKLSAgICAgICAgZGVidWdMb2dEb2N1bWVudCgiRG9jdW1lbnQgZm9yIFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlOiIsIHNrZWxldG9uTW9kZWwpOwotICAgICAgICBGaWxlV3JpdGVyIHNrZWxldG9uSW50ZXJmYWNlV3JpdGVyID0gbmV3IFNrZWxldG9uSW50ZXJmYWNlV3JpdGVyKAotICAgICAgICAgICAgICAgIGNvZGVHZW5Db25maWd1cmF0aW9uLmlzRmxhdHRlbkZpbGVzKCkgPwotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0T3V0cHV0RGlyZWN0b3J5KGNvZGVHZW5Db25maWd1cmF0aW9uLmdldE91dHB1dExvY2F0aW9uKCksIG51bGwpIDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldE91dHB1dERpcmVjdG9yeShjb2RlR2VuQ29uZmlndXJhdGlvbi5nZXRPdXRwdXRMb2NhdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlR2VuQ29uZmlndXJhdGlvbi5nZXRTb3VyY2VMb2NhdGlvbigpKQotICAgICAgICAgICAgICAgICwgdGhpcy5jb2RlR2VuQ29uZmlndXJhdGlvbi5nZXRPdXRwdXRMYW5ndWFnZSgpKTsKLQotICAgICAgICB3cml0ZUZpbGUoc2tlbGV0b25Nb2RlbCwgc2tlbGV0b25JbnRlcmZhY2VXcml0ZXIpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHdyaXRlU2VydmljZUVuZHBvaW50SW50ZXJmYWNlSW1wbCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBEb2N1bWVudCBza2VsZXRvbk1vZGVsID0gY3JlYXRlRE9NRG9jdW1lbnRGb3JTRUlJbXBsKCk7Ci0gICAgICAgIGRlYnVnTG9nRG9jdW1lbnQoIkRvY3VtZW50IGZvciBTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZToiLCBza2VsZXRvbk1vZGVsKTsKLSAgICAgICAgRmlsZVdyaXRlciBpbnRlcmZhY2VJbXBsZW1lbnRhdGlvbldyaXRlciA9IG5ldyBJbnRlcmZhY2VJbXBsZW1lbnRhdGlvbldyaXRlcigKLSAgICAgICAgICAgICAgICBjb2RlR2VuQ29uZmlndXJhdGlvbi5pc0ZsYXR0ZW5GaWxlcygpID8KLSAgICAgICAgICAgICAgICAgICAgICAgIGdldE91dHB1dERpcmVjdG9yeShjb2RlR2VuQ29uZmlndXJhdGlvbi5nZXRPdXRwdXRMb2NhdGlvbigpLCBudWxsKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICBnZXRPdXRwdXREaXJlY3RvcnkoY29kZUdlbkNvbmZpZ3VyYXRpb24uZ2V0T3V0cHV0TG9jYXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZUdlbkNvbmZpZ3VyYXRpb24uZ2V0U291cmNlTG9jYXRpb24oKSkKLSAgICAgICAgICAgICAgICAsIHRoaXMuY29kZUdlbkNvbmZpZ3VyYXRpb24uZ2V0T3V0cHV0TGFuZ3VhZ2UoKSk7Ci0KLSAgICAgICAgd3JpdGVGaWxlKHNrZWxldG9uTW9kZWwsIGludGVyZmFjZUltcGxlbWVudGF0aW9uV3JpdGVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZXMgdGhlIGV4Y2VwdGlvbiBjYWxzc2VzLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHdyaXRlRXhjZXB0aW9ucygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcga2V5OwotICAgICAgICBJdGVyYXRvciBpdGVyYXRvciA9IGZ1bGx5UXVhbGlmaWVkRmF1bHRDbGFzc05hbWVNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAga2V5ID0gKFN0cmluZykgaXRlcmF0b3IubmV4dCgpOwotCi0KLSAgICAgICAgICAgIERvY3VtZW50IHNrZWxldG9uTW9kZWwgPSBjcmVhdGVET01Eb2N1bWVudEZvckV4Y2VwdGlvbihrZXkpOwotICAgICAgICAgICAgZGVidWdMb2dEb2N1bWVudCgiRG9jdW1lbnQgZm9yIEV4Y2VwdGlvbiBDbGFzczoiLCBza2VsZXRvbk1vZGVsKTsKLSAgICAgICAgICAgIEV4Y2VwdGlvbldyaXRlciBleGNlcHRpb25Xcml0ZXIgPQotICAgICAgICAgICAgICAgICAgICBuZXcgRXhjZXB0aW9uV3JpdGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVHZW5Db25maWd1cmF0aW9uLmlzRmxhdHRlbkZpbGVzKCkgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0T3V0cHV0RGlyZWN0b3J5KGNvZGVHZW5Db25maWd1cmF0aW9uLmdldE91dHB1dExvY2F0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwpIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE91dHB1dERpcmVjdG9yeShjb2RlR2VuQ29uZmlndXJhdGlvbi5nZXRPdXRwdXRMb2NhdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlR2VuQ29uZmlndXJhdGlvbi5nZXRTb3VyY2VMb2NhdGlvbigpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlR2VuQ29uZmlndXJhdGlvbi5nZXRPdXRwdXRMYW5ndWFnZSgpKTsKLQotICAgICAgICAgICAgd3JpdGVGaWxlKHNrZWxldG9uTW9kZWwsIGV4Y2VwdGlvbldyaXRlcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZSB0aGUgc2VydmljZSBjbGFzcwotICAgICAqCi0gICAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCB3cml0ZVNlcnZpY2VDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBEb2N1bWVudCBza2VsZXRvbk1vZGVsID0gY3JlYXRlRE9NRG9jdW1lbnRGb3JTZXJ2aWNlQ2xhc3MoKTsKLSAgICAgICAgZGVidWdMb2dEb2N1bWVudCgiRG9jdW1lbnQgZm9yIFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlOiIsIHNrZWxldG9uTW9kZWwpOwotICAgICAgICBGaWxlV3JpdGVyIHNrZWxldG9uSW50ZXJmYWNlV3JpdGVyID0gbmV3IFNrZWxldG9uV3JpdGVyKAotICAgICAgICAgICAgICAgIGNvZGVHZW5Db25maWd1cmF0aW9uLmlzRmxhdHRlbkZpbGVzKCkgPwotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0T3V0cHV0RGlyZWN0b3J5KGNvZGVHZW5Db25maWd1cmF0aW9uLmdldE91dHB1dExvY2F0aW9uKCksIG51bGwpIDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldE91dHB1dERpcmVjdG9yeShjb2RlR2VuQ29uZmlndXJhdGlvbi5nZXRPdXRwdXRMb2NhdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlR2VuQ29uZmlndXJhdGlvbi5nZXRTb3VyY2VMb2NhdGlvbigpKQotICAgICAgICAgICAgICAgICwgdGhpcy5jb2RlR2VuQ29uZmlndXJhdGlvbi5nZXRPdXRwdXRMYW5ndWFnZSgpKTsKLQotICAgICAgICB3cml0ZUZpbGUoc2tlbGV0b25Nb2RlbCwgc2tlbGV0b25JbnRlcmZhY2VXcml0ZXIpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBEb2N1bWVudCBjcmVhdGVET01Eb2N1bWVudEZvclNlcnZpY2VYTUwoKSB7Ci0gICAgICAgIERvY3VtZW50IGRvYyA9IGdldEVtcHR5RG9jdW1lbnQoKTsKLSAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IG51bGw7Ci0gICAgICAgIFN0cmluZyBzZXJ2aWNlTmFtZSA9IG51bGw7Ci0gICAgICAgIEVsZW1lbnQgcm9vdEVsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudCgiaW50ZXJmYWNlcyIpOwotICAgICAgICBkb2MuYXBwZW5kQ2hpbGQocm9vdEVsZW1lbnQpOwotCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHRoaXMuYXhpc1NlcnZpY2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgdGhpcy5heGlzU2VydmljZSA9IChBeGlzU2VydmljZSkgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICB0aGlzLmF4aXNCaW5kaW5nID0gYXhpc1NlcnZpY2UuZ2V0RW5kcG9pbnQoYXhpc1NlcnZpY2UuZ2V0RW5kcG9pbnROYW1lKCkpLmdldEJpbmRpbmcoKTsKLSAgICAgICAgICAgIHNlcnZpY2VOYW1lID0gYXhpc1NlcnZpY2UuZ2V0TmFtZSgpOwotICAgICAgICAgICAgY2xhc3NOYW1lID0gKFN0cmluZylheGlzU2VydmljZS5nZXRQYXJhbWV0ZXIoSkFYV1NfUE9SVF9UWVBFX05BTUUpLmdldFZhbHVlKCkgKyBKQVhXU19JTVBMX1NVRkZJWDsKLSAgICAgICAgICAgIHJvb3RFbGVtZW50LmFwcGVuZENoaWxkKGdldFNlcnZpY2VFbGVtZW50KHNlcnZpY2VOYW1lLCBjbGFzc05hbWUsIGRvYykpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGRvYzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBYTUwgbW9kZWwgZm9yIHRoZSBTZXJ2aWNlIEVuZHBvaW50IGludGVyZmFjZQotICAgICAqCi0gICAgICogQHJldHVybiBET00gRG9jdW1lbnQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgRG9jdW1lbnQgY3JlYXRlRE9NRG9jdW1lbnRGb3JTRUkoKSB0aHJvd3MgQXhpc0ZhdWx0OwotCi0gICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIFhNTCBtb2RlbCBmb3IgdGhlIFNlcnZpY2UgRW5kcG9pbnQgaW50ZXJmYWNlIEltcGxlbWVudGF0aW9uIGNsYXNzCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIERPTSBEb2N1bWVudAotICAgICAqLwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBEb2N1bWVudCBjcmVhdGVET01Eb2N1bWVudEZvclNFSUltcGwoKSB0aHJvd3MgQXhpc0ZhdWx0OwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgWE1MIG1vZGVsIGZvciB0aGUgU2VydmljZSBDbGFzcwotICAgICAqCi0gICAgICogQHJldHVybiBET00gRG9jdW1lbnQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgRG9jdW1lbnQgY3JlYXRlRE9NRG9jdW1lbnRGb3JTZXJ2aWNlQ2xhc3MoKTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIFhNTCBtb2RlbCBmb3IgYSBFeGNlcHRpb24gQ2xhc3MKLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXkgU3RyaW5nCi0gICAgICogQHJldHVybiBET00gRG9jdW1lbnQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgRG9jdW1lbnQgY3JlYXRlRE9NRG9jdW1lbnRGb3JFeGNlcHRpb24oU3RyaW5nIGtleSk7Ci0KLSAgICAvKioKLSAgICAgKiBBIHJlc3VzYWJsZSBtZXRob2QgdG8gcmV0dXJuIHRoZSBzZXJ2aWNlIGVsZW1lbnQgZm9yIGNyZWF0aW5nIHRoZSBzZXJ2aWNlIHhtbAotICAgICAqCi0gICAgICogQHBhcmFtIHNlcnZpY2VOYW1lCi0gICAgICogQHBhcmFtIGNsYXNzTmFtZQotICAgICAqIEBwYXJhbSBkb2MKLSAgICAgKiBAcmV0dXJuIERPTSBFbGVtZW50Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIEVsZW1lbnQgZ2V0U2VydmljZUVsZW1lbnQoU3RyaW5nIHNlcnZpY2VOYW1lLCBTdHJpbmcgY2xhc3NOYW1lLCBEb2N1bWVudCBkb2MpIHsKLQotICAgICAgICBpZiAoYWxsU2VydmljZUluZm9Ib2xkZXIuZ2V0KHNlcnZpY2VOYW1lKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aGlzLmluZm9Ib2xkZXIgPSAoTWFwKSBhbGxTZXJ2aWNlSW5mb0hvbGRlci5nZXQoc2VydmljZU5hbWUpOwotICAgICAgICB9Ci0gICAgICAgIEVsZW1lbnQgcm9vdEVsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudCgiaW50ZXJmYWNlIik7Ci0KLSAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgInBhY2thZ2UiLCAiIiwgcm9vdEVsZW1lbnQpOwotICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAiY2xhc3NwYWNrYWdlIiwgY29kZUdlbkNvbmZpZ3VyYXRpb24uZ2V0UGFja2FnZU5hbWUoKSwgcm9vdEVsZW1lbnQpOwotICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAibmFtZSIsIGNsYXNzTmFtZSwgcm9vdEVsZW1lbnQpOwotCi0gICAgICAgIGlmICghY29kZUdlbkNvbmZpZ3VyYXRpb24uaXNXcml0ZVRlc3RDYXNlKCkpIHsKLSAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJ0ZXN0T21pdCIsICJ0cnVlIiwgcm9vdEVsZW1lbnQpOwotICAgICAgICB9Ci0gICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJzZXJ2aWNlbmFtZSIsIHNlcnZpY2VOYW1lLCByb290RWxlbWVudCk7Ci0KLSAgICAgICAgSXRlcmF0b3IgaXQgPSBtZXBUb0NsYXNzTWFwLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIE9iamVjdCBrZXkgPSBpdC5uZXh0KCk7Ci0KLSAgICAgICAgICAgIGlmIChCb29sZWFuLlRSVUUuZXF1YWxzKGluZm9Ib2xkZXIuZ2V0KGtleSkpKSB7Ci0gICAgICAgICAgICAgICAgRWxlbWVudCBlbHQgPSBhZGRFbGVtZW50KGRvYywgIm1lc3NhZ2VyZWNlaXZlciIsCi0gICAgICAgICAgICAgICAgICAgICAgICBtYWtlSmF2YUNsYXNzTmFtZShzZXJ2aWNlTmFtZSkgKyBtZXBUb1N1ZmZpeE1hcC5nZXQoa2V5KSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RFbGVtZW50KTsKLSAgICAgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAibWVwVVJJIiwga2V5LnRvU3RyaW5nKCksIGVsdCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0gICAgICAgIGxvYWRPcGVyYXRpb25zKGRvYywgcm9vdEVsZW1lbnQsIG51bGwpOwotCi0gICAgICAgIHJldHVybiByb290RWxlbWVudDsKLSAgICB9Ci0KLSAgICAvL1V0aWwgbWV0aG9kcwotICAgIHB1YmxpYyBTdHJpbmcgZXh0cmF0Q2xhc3NOYW1lKFN0cmluZyBmdWxseVF1YWxpZmllZE5hbWUpIHsKLSAgICAgICAgaWYgKGZ1bGx5UXVhbGlmaWVkTmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gZnVsbHlRdWFsaWZpZWROYW1lLnN1YnN0cmluZyhmdWxseVF1YWxpZmllZE5hbWUubGFzdEluZGV4T2YoJy4nKSwKLSAgICAgICAgICAgICAgICBmdWxseVF1YWxpZmllZE5hbWUubGVuZ3RoKCkpOwotCi0gICAgICAgIGlmIChjbGFzc05hbWUuY2hhckF0KDApID09ICcuJykgewotICAgICAgICAgICAgcmV0dXJuIGNsYXNzTmFtZS5zdWJzdHJpbmcoMSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gY2xhc3NOYW1lOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWROYW1lKFN0cmluZyBjbGFzc05hbWUsIFN0cmluZyBwYWNrYWdlTmFtZSkgewotLy8gICAgICAgIGNsYXNzTmFtZSA9IG1ha2VKYXZhQ2xhc3NOYW1lKGNsYXNzTmFtZSk7Ci0gICAgICAgIHJldHVybiBwYWNrYWdlTmFtZSArICIuIiArIGNsYXNzTmFtZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHJlc29sdmVOYW1lQ29sbGlzaW9uKFN0cmluZyBjbGFzc05hbWUsIFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIHN1ZmZpeCkgewotICAgICAgICBjbGFzc05hbWUgPSBtYWtlSmF2YUNsYXNzTmFtZShjbGFzc05hbWUpOwotICAgICAgICBTdHJpbmcgZnVsbFF1YWxpZmllZE5hbWUgPSBnZXRGdWxseVF1YWxpZmllZE5hbWUoY2xhc3NOYW1lLCBwYWNrYWdlTmFtZSk7Ci0gICAgICAgIE1hcCBtYXAgPSBtYXBwZXIuZ2V0QWxsTWFwcGVkTmFtZXMoKTsKLSAgICAgICAgaWYgKG1hcC5jb250YWluc1ZhbHVlKGZ1bGxRdWFsaWZpZWROYW1lKSkgewotICAgICAgICAgICAgcmV0dXJuIGNsYXNzTmFtZSArIHN1ZmZpeDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY2xhc3NOYW1lOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL2V4dGVuc2lvbi9BYnN0cmFjdENvZGVHZW5lcmF0aW9uRXh0ZW5zaW9uLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi9leHRlbnNpb24vQWJzdHJhY3RDb2RlR2VuZXJhdGlvbkV4dGVuc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjhiYTAyLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL2V4dGVuc2lvbi9BYnN0cmFjdENvZGVHZW5lcmF0aW9uRXh0ZW5zaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLmV4dGVuc2lvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RDb2RlR2VuZXJhdGlvbkV4dGVuc2lvbiBpbXBsZW1lbnRzIENvZGVHZW5FeHRlbnNpb24gewotCi0gICAgcHJvdGVjdGVkIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyh0aGlzLmdldENsYXNzKCkpOwotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi9leHRlbnNpb24vQWJzdHJhY3REQlByb2Nlc3NpbmdFeHRlbnNpb24uamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL2V4dGVuc2lvbi9BYnN0cmFjdERCUHJvY2Vzc2luZ0V4dGVuc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjNlMGRkLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL2V4dGVuc2lvbi9BYnN0cmFjdERCUHJvY2Vzc2luZ0V4dGVuc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5leHRlbnNpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwudXRpbC5Db25maWdQcm9wZXJ0eUZpbGVMb2FkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3REQlByb2Nlc3NpbmdFeHRlbnNpb24gZXh0ZW5kcyBBYnN0cmFjdENvZGVHZW5lcmF0aW9uRXh0ZW5zaW9uIHsKLQotICAgIC8qKgotICAgICAqIE1ldGhvZCB0byB0ZXN0IHdoZXRoZXIgdGhlIHBhc3NlZCBpbiBmcmFtZXdvcmsgbmFtZSBpcyByZWxldmFudCB0byB0aGlzIGV4dGVuc2lvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBkYkZyYW1ld29ya05hbWUKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgYm9vbGVhbi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiB0ZXN0RmFsbFRocm91Z2goU3RyaW5nIGRiRnJhbWV3b3JrTmFtZSkgewotICAgICAgICBNYXAgZXh0ZW5zaW9uc01hcCA9IENvbmZpZ1Byb3BlcnR5RmlsZUxvYWRlci5nZXREYXRhYmluZGluZ0ZyYW1ld29ya05hbWVUb0V4dGVuc2lvbk1hcCgpOwotICAgICAgICBTdHJpbmcgbWFwcGVkRXh0ZW5zaW9uID0gZXh0ZW5zaW9uc01hcC5nZXQoZGJGcmFtZXdvcmtOYW1lKSAhPSBudWxsID8KLSAgICAgICAgICAgICAgICBleHRlbnNpb25zTWFwLmdldChkYkZyYW1ld29ya05hbWUpLnRvU3RyaW5nKCkgOiAiIjsKLSAgICAgICAgcmV0dXJuICEoZ2V0Q2xhc3MoKS5nZXROYW1lKCkuZXF1YWxzKG1hcHBlZEV4dGVuc2lvbikpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vZXh0ZW5zaW9uL0Fic3RyYWN0UHJldHR5UHJpbnRlckV4dGVuc2lvbi5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vZXh0ZW5zaW9uL0Fic3RyYWN0UHJldHR5UHJpbnRlckV4dGVuc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzc1MGY3Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL2V4dGVuc2lvbi9BYnN0cmFjdFByZXR0eVByaW50ZXJFeHRlbnNpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4uZXh0ZW5zaW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4uQ29kZUdlbkNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4uQ29kZUdlbmVyYXRpb25FeGNlcHRpb247Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RQcmV0dHlQcmludGVyRXh0ZW5zaW9uIGV4dGVuZHMgQWJzdHJhY3RDb2RlR2VuZXJhdGlvbkV4dGVuc2lvbiB7Ci0gICAgLyoqIElmIHRoZSBleHRlbnNpb24gZm9yIHByb3BlcnR5IGZpbGUgY2hhbmdlcyBpdCBtaWdodCBlZmZlY3QgdGhpcyBhcyB3ZWxsICEhISAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZmlsZUV4dGVuc2lvbiA9ICIiOwotCi0gICAgcHVibGljIHZvaWQgZW5nYWdlKENvZGVHZW5Db25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHRocm93cyBDb2RlR2VuZXJhdGlvbkV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgLy9yZWN1cnNlIHRocm91Z2ggdGhlIG91dHB1dCBmaWxlcyBhbmQgcHJldHRpZnkgdGhlbQotICAgICAgICBGaWxlIG91dHB1dEZvbGRlciA9IGNvbmZpZ3VyYXRpb24uZ2V0T3V0cHV0TG9jYXRpb24oKTsKLSAgICAgICAgcHJldHRpZnkob3V0cHV0Rm9sZGVyLGNvbmZpZ3VyYXRpb24pOwotCi0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWN1cnNpdmUgcHJvY2VkdXJlIHRvIHByZXR0aWZ5IHRoZSBmaWxlcwotICAgICAqCi0gICAgICogQHBhcmFtIGZpbGUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcmV0dGlmeShGaWxlIGZpbGUsIENvZGVHZW5Db25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHsKLQotICAgICAgICBMaXN0IHhtbEZpbGVMaXN0ID0gY29uZmlndXJhdGlvbi5nZXRPdXRwdXRYbWxGaWxlTmFtZXNMaXN0KCk7Ci0gICAgICAgIFN0cmluZyBmaWxlTmFtZSA9IG51bGw7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHhtbEZpbGVMaXN0Lml0ZXJhdG9yKCk7aXRlci5oYXNOZXh0KCk7KXsKLSAgICAgICAgICAgIGZpbGVOYW1lID0gKFN0cmluZykgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBwcmV0dGlmeUZpbGUobmV3IEZpbGUoZmlsZU5hbWUpKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW1wbGVtZW50IHRoaXMgdG8gY2FsbCB0aGUgcHJvcGVyIHByZXR0eSBwcmludGVycwotICAgICAqCi0gICAgICogQHBhcmFtIGZpbGUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBwcmV0dGlmeUZpbGUoRmlsZSBmaWxlKTsKLQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi9leHRlbnNpb24vQ29kZUdlbkV4dGVuc2lvbi5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vZXh0ZW5zaW9uL0NvZGVHZW5FeHRlbnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE2MzEyMC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi9leHRlbnNpb24vQ29kZUdlbkV4dGVuc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5leHRlbnNpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5Db2RlR2VuQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5Db2RlR2VuZXJhdGlvbkV4Y2VwdGlvbjsKLQotcHVibGljIGludGVyZmFjZSBDb2RlR2VuRXh0ZW5zaW9uIHsKLQotICAgIHB1YmxpYyB2b2lkIGVuZ2FnZShDb2RlR2VuQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB0aHJvd3MgQ29kZUdlbmVyYXRpb25FeGNlcHRpb247Ci0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vZXh0ZW5zaW9uL0RlZmF1bHREYXRhYmluZGluZ0V4dGVuc2lvbi5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vZXh0ZW5zaW9uL0RlZmF1bHREYXRhYmluZGluZ0V4dGVuc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2NjNTEzLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL2V4dGVuc2lvbi9EZWZhdWx0RGF0YWJpbmRpbmdFeHRlbnNpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4uZXh0ZW5zaW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4uQ29kZUdlbkNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4uQ29kZUdlbmVyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLmRhdGFiaW5kaW5nLkNEZWZhdWx0VHlwZU1hcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuZGF0YWJpbmRpbmcuRGVmYXVsdFR5cGVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLmRhdGFiaW5kaW5nLlR5cGVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLmkxOG4uQ29kZWdlbk1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgRGVmYXVsdERhdGFiaW5kaW5nRXh0ZW5zaW9uIGV4dGVuZHMgQWJzdHJhY3REQlByb2Nlc3NpbmdFeHRlbnNpb24gewotCi0KLSAgICBwdWJsaWMgdm9pZCBlbmdhZ2UoQ29kZUdlbkNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgdGhyb3dzIENvZGVHZW5lcmF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgVHlwZU1hcHBlciBtYXBwZXIgPSBjb25maWd1cmF0aW9uLmdldFR5cGVNYXBwZXIoKTsKLSAgICAgICAgaWYgKHRlc3RGYWxsVGhyb3VnaChjb25maWd1cmF0aW9uLmdldERhdGFiaW5kaW5nVHlwZSgpKSkgewotICAgICAgICAgICAgLy9pZiBpdCdzIGZhbGwgdGhyb3VnaCBmb3IgdGhlIGRlZmF1bHQgZGF0YWJpbmRpbmcgZXh0ZW5zaW9uIGFuZCBhIG1hcHBlciBoYXMKLSAgICAgICAgICAgIC8vbm90IHlldCBiZWluZyBzZXQsIHRoZW4gdGhlcmUncyBhIHByb2JsZW0uCi0gICAgICAgICAgICAvL0hlbmNlIGNoZWNrIHRoZSBtYXBwZXIgc3RhdHVzIGhlcmUKLQotICAgICAgICAgICAgaWYgKG1hcHBlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy90aGlzIHNob3VsZG4ndCBoYXBwZW4KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29kZUdlbmVyYXRpb25FeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICBDb2RlZ2VuTWVzc2FnZXMuZ2V0TWVzc2FnZSgiZXh0ZW5zaW9uLm5vUHJvcGVyRGF0YWJpbmRpbmciKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgLy90aGUgbWFwcGVyIGhhcyBub3QgYmVlbiBwb3B1bGF0ZWQgeWV0LiBzaW5jZSB0aGlzIGV4dGVuc2lvbiBpcwotICAgICAgICAvL3JlZ2lzdGVyZWQgZm9yIC1kIG5vbmUsIHdlIGhhdmUgdG8gZ2VuZXJhdGUgYSBuZXcgdHlwZSBtYXBwZXIKLSAgICAgICAgLy90aGF0IHNlcnZlcyBvbmx5IHRoZSBkZWZhdWx0IHR5cGVzCi0gICAgICAgIGlmIChtYXBwZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24uZ2V0T3V0cHV0TGFuZ3VhZ2UoKSAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgICAgICFjb25maWd1cmF0aW9uLmdldE91dHB1dExhbmd1YWdlKCkudHJpbSgpLmVxdWFscygiIikgJiYKLSAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbi5nZXRPdXRwdXRMYW5ndWFnZSgpLnRvTG93ZXJDYXNlKCkuZXF1YWxzKCJjIikpIHsKLSAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uLnNldFR5cGVNYXBwZXIobmV3IENEZWZhdWx0VHlwZU1hcHBlcigpKTsKLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uLnNldFR5cGVNYXBwZXIobmV3IERlZmF1bHRUeXBlTWFwcGVyKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi9leHRlbnNpb24vRXhjbHVkZVBhY2thZ2VFeHRlbnNpb24uamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL2V4dGVuc2lvbi9FeGNsdWRlUGFja2FnZUV4dGVuc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDg1OGI2Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL2V4dGVuc2lvbi9FeGNsdWRlUGFja2FnZUV4dGVuc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5leHRlbnNpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5Db2RlR2VuQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5Db2RlR2VuZXJhdGlvbkV4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotLyoqCi0gKiB0aGlzIGV4dGVuc2lvbiBkZWxldGVzIHRoZSBwYWNrYWdlcyBzZXBjaWZpZXMgYnkgdGhlIHVzZXIgZnJvbSB0aGUKLSAqIGdlbmVyYXRlZCBjb2RlLgotICogdGhpcyBmZWF0dXJlIGlzIHZlcnkgaW1wb3J0YW50IHRvIHJlbW92ZSBzb21lIGNvbW1vbmx5IGdlbmVyYXRlZCBjbGFzc2VzLgotICovCi0KLXB1YmxpYyBjbGFzcyBFeGNsdWRlUGFja2FnZUV4dGVuc2lvbiBleHRlbmRzIEFic3RyYWN0Q29kZUdlbmVyYXRpb25FeHRlbnNpb24gewotCi0KLSAgICBwdWJsaWMgdm9pZCBlbmdhZ2UoQ29kZUdlbkNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgdGhyb3dzIENvZGVHZW5lcmF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIGV4Y2x1ZGVQYWNrYWdlc1N0cmluZyA9IGNvbmZpZ3VyYXRpb24uZ2V0RXhjbHVkZVByb3BlcnRpZXMoKTsKLSAgICAgICAgaWYgKChleGNsdWRlUGFja2FnZXNTdHJpbmcgIT0gbnVsbCkgJiYgKGV4Y2x1ZGVQYWNrYWdlc1N0cmluZy50cmltKCkubGVuZ3RoKCkgPiAwKSkgewotICAgICAgICAgICAgU3RyaW5nW10gZXhjbHVkZVBhY2thZ2VzID0gZXhjbHVkZVBhY2thZ2VzU3RyaW5nLnNwbGl0KCIsIik7Ci0gICAgICAgICAgICBGaWxlIG91dFB1dEZpbGVMb2NhdGlvbiA9IG51bGw7Ci0gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbi5pc0ZsYXR0ZW5GaWxlcygpKSB7Ci0gICAgICAgICAgICAgICAgb3V0UHV0RmlsZUxvY2F0aW9uID0gZ2V0T3V0cHV0RGlyZWN0b3J5KGNvbmZpZ3VyYXRpb24uZ2V0T3V0cHV0TG9jYXRpb24oKSwgbnVsbCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG91dFB1dEZpbGVMb2NhdGlvbiA9IGdldE91dHB1dERpcmVjdG9yeShjb25maWd1cmF0aW9uLmdldE91dHB1dExvY2F0aW9uKCksIGNvbmZpZ3VyYXRpb24uZ2V0U291cmNlTG9jYXRpb24oKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTdHJpbmcgZXhjbHVlUGFja2FnZSA9IG51bGw7Ci0gICAgICAgICAgICBGaWxlIHRlbXBGaWxlID0gbnVsbDsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXhjbHVkZVBhY2thZ2VzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgdGVtcEZpbGUgPSBvdXRQdXRGaWxlTG9jYXRpb247Ci0gICAgICAgICAgICAgICAgU3RyaW5nW10gZGlyZWN0b3JpZXMgPSBleGNsdWRlUGFja2FnZXNbaV0uc3BsaXQoIlxcLiIpOwotICAgICAgICAgICAgICAgIGludCBqID0gMDsKLSAgICAgICAgICAgICAgICBmb3IgKDsgaiA8IGRpcmVjdG9yaWVzLmxlbmd0aDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRlbXBGaWxlID0gbmV3IEZpbGUodGVtcEZpbGUsIGRpcmVjdG9yaWVzW2pdKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCF0ZW1wRmlsZS5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGogPT0gZGlyZWN0b3JpZXMubGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgbWVhbnMgdGhpcyBsb29wIGhhcyBnb25lIHRvIGVuZCBhbmQgYSBkaXJlY3RvcnkKLSAgICAgICAgICAgICAgICAgICAgLy8gZXhpc3RzIGF0IHRoZSBlbmQKLSAgICAgICAgICAgICAgICAgICAgZGVsZXRlRGlyZWN0b3J5KHRlbXBGaWxlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIHByaXZhdGUgdm9pZCBkZWxldGVEaXJlY3RvcnkoRmlsZSBkaXJlY3RvcnkpIHsKLSAgICAgICAgRmlsZVtdIGNoaWxkcmVuID0gZGlyZWN0b3J5Lmxpc3RGaWxlcygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoY2hpbGRyZW5baV0uaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgICAgIGRlbGV0ZURpcmVjdG9yeShjaGlsZHJlbltpXSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGNoaWxkcmVuW2ldLmRlbGV0ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIGRlbGV0ZSB0aGlzIGRpcmVjdG9yeQotICAgICAgICBkaXJlY3RvcnkuZGVsZXRlKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBGaWxlIGdldE91dHB1dERpcmVjdG9yeShGaWxlIG91dHB1dERpciwgU3RyaW5nIGRpcjIpIHsKLSAgICAgICAgaWYgKGRpcjIgIT0gbnVsbCAmJiAhIiIuZXF1YWxzKGRpcjIpKSB7Ci0gICAgICAgICAgICBvdXRwdXREaXIgPSBuZXcgRmlsZShvdXRwdXREaXIsIGRpcjIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFvdXRwdXREaXIuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIG91dHB1dERpci5ta2RpcnMoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBvdXRwdXREaXI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vZXh0ZW5zaW9uL0pBWEJSSUV4dGVuc2lvbi5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vZXh0ZW5zaW9uL0pBWEJSSUV4dGVuc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTljYWI0Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL2V4dGVuc2lvbi9KQVhCUklFeHRlbnNpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLmV4dGVuc2lvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4uQ29kZUdlbkNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLmRhdGFiaW5kaW5nLlR5cGVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLmkxOG4uQ29kZWdlbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC51dGlsLkNvbmZpZ1Byb3BlcnR5RmlsZUxvYWRlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGNsYXNzIEpBWEJSSUV4dGVuc2lvbiBleHRlbmRzIEFic3RyYWN0REJQcm9jZXNzaW5nRXh0ZW5zaW9uIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNDSEVNQV9GT0xERVIgPSAic2NoZW1hcyI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBNQVBQSU5HUyA9ICJtYXBwaW5ncyI7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgTUFQUElORyA9ICJtYXBwaW5nIjsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBNRVNTQUdFID0gIm1lc3NhZ2UiOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkFfTkFNRSA9ICJqYXZhY2xhc3MiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUElOR19GT0xERVIgPSAiTWFwcGluZyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUEVSX0ZJTEVfTkFNRSA9ICJtYXBwZXIiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNDSEVNQV9QQVRIID0gIi9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi9zY2hlbWEvIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBWEJfUklfQVBJX0NMQVNTID0gImphdmF4LnhtbC5iaW5kLkpBWEJDb250ZXh0IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVhCX1JJX0lNUExfQ0xBU1MgPSAiY29tLnN1bi54bWwuYmluZC5VdGlsIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVhCX1JJX1hKQ19DTEFTUyA9ICJjb20uc3VuLnRvb2xzLnhqYy5hcGkuWEpDIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBWEJfUklfVVRJTElUWV9DTEFTUyA9Ci0gICAgICAgICAgICAib3JnLmFwYWNoZS5heGlzMi5qYXhicmkuQ29kZUdlbmVyYXRpb25VdGlsaXR5IjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBWEJfUklfUFJPQ0VTU19NRVRIT0QgPSAicHJvY2Vzc1NjaGVtYXMiOwotCi0KLSAgICBwdWJsaWMgdm9pZCBlbmdhZ2UoQ29kZUdlbkNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgewotCi0gICAgICAgIC8vdGVzdCB0aGUgZGF0YWJpbmRpbmcgdHlwZS4gSWYgbm90IGp1c3QgZmFsbCB0aHJvdWdoCi0gICAgICAgIGlmICh0ZXN0RmFsbFRocm91Z2goY29uZmlndXJhdGlvbi5nZXREYXRhYmluZGluZ1R5cGUoKSkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0KLSAgICAgICAgICAgIC8vIHRyeSBkdW1teSBsb2FkIG9mIGZyYW1ld29yayBjbGFzc2VzIGZpcnN0IHRvIGNoZWNrIG1pc3NpbmcgamFycwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBDbGFzc0xvYWRlciBjbCA9IGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKTsKLSAgICAgICAgICAgICAgICBjbC5sb2FkQ2xhc3MoSkFYQl9SSV9BUElfQ0xBU1MpOwotICAgICAgICAgICAgICAgIGNsLmxvYWRDbGFzcyhKQVhCX1JJX0lNUExfQ0xBU1MpOwotICAgICAgICAgICAgICAgIGNsLmxvYWRDbGFzcyhKQVhCX1JJX1hKQ19DTEFTUyk7Ci0gICAgICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiSkFYLUIgUkkgSkFScyBub3Qgb24gY2xhc3NwYXRoIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGxvYWQgdGhlIGFjdHVhbCB1dGlsaXR5IGNsYXNzCi0gICAgICAgICAgICBDbGFzcyBjbGF6eiA9IG51bGw7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGNsYXp6ID0gSkFYQlJJRXh0ZW5zaW9uLmNsYXNzLmdldENsYXNzTG9hZGVyKCkubG9hZENsYXNzKEpBWEJfUklfVVRJTElUWV9DTEFTUyk7Ci0gICAgICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiSkFYLUIgUkkgYmluZGluZyBleHRlbnNpb24gbm90IGluIGNsYXNzcGF0aCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBpbnZva2UgdXRpbGl0eSBjbGFzcyBtZXRob2QgZm9yIGFjdHVhbCBwcm9jZXNzaW5nCi0gICAgICAgICAgICBNZXRob2QgbWV0aG9kID0gY2xhenouZ2V0TWV0aG9kKEpBWEJfUklfUFJPQ0VTU19NRVRIT0QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdIHsgTGlzdC5jbGFzcywgRWxlbWVudFtdLmNsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVHZW5Db25maWd1cmF0aW9uLmNsYXNzIH0pOwotICAgICAgICAgICAgTGlzdCBzY2hlbWFzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgTGlzdCBheGlzU2VydmljZXMgPSBjb25maWd1cmF0aW9uLmdldEF4aXNTZXJ2aWNlcygpOwotICAgICAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UgPSBudWxsOwotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gYXhpc1NlcnZpY2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlID0gKEF4aXNTZXJ2aWNlKWl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgIHNjaGVtYXMuYWRkQWxsKGF4aXNTZXJ2aWNlLmdldFNjaGVtYSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEVsZW1lbnRbXSBhZGRpdGlvbmFsU2NoZW1hcyA9IGxvYWRBZGRpdGlvbmFsU2NoZW1hcygpOwotICAgICAgICAgICAgVHlwZU1hcHBlciBtYXBwZXIgPSAoVHlwZU1hcHBlciltZXRob2QuaW52b2tlKG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsgc2NoZW1hcywgYWRkaXRpb25hbFNjaGVtYXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uIH0pOwotCi0gICAgICAgICAgICAvLyBzZXQgdGhlIHR5cGUgbWFwcGVyIHRvIHRoZSBjb25maWcKLSAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24uc2V0VHlwZU1hcHBlcihtYXBwZXIpOwotCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbillOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBMb2FkaW5nIHRoZSBleHRlcm5hbCBzY2hlbWFzLgotICAgICAqCi0gICAgICogQHJldHVybiBlbGVtZW50IGFycmF5IGNvbnNpc3Rpbmcgb2YgdGhlIHRoZSBET00gZWxlbWVudCBvYmplY3RzIHRoYXQgcmVwcmVzZW50IHNjaGVtYXMKLSAgICAgKi8KLSAgICBwcml2YXRlIEVsZW1lbnRbXSBsb2FkQWRkaXRpb25hbFNjaGVtYXMoKSB7Ci0gICAgICAgIC8vbG9hZCBhZGRpdGlvbmFsIHNjaGVtYXMKLSAgICAgICAgU3RyaW5nW10gc2NoZW1hTmFtZXMgPSBDb25maWdQcm9wZXJ0eUZpbGVMb2FkZXIuZ2V0VGhpcmRQYXJ0eVNjaGVtYU5hbWVzKCk7Ci0gICAgICAgIEVsZW1lbnRbXSBzY2hlbWFFbGVtZW50czsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgQXJyYXlMaXN0IGFkZGl0aW9uYWxTY2hlbWFFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgIERvY3VtZW50QnVpbGRlciBkb2N1bWVudEJ1aWxkZXIgPSBnZXROYW1lc3BhY2VBd2FyZURvY3VtZW50QnVpbGRlcigpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzY2hlbWFOYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIC8vdGhlIGxvY2F0aW9uIGZvciB0aGUgdGhpcmQgcGFydHkgc2NoZW1hO3MgaXMgaGFyZGNvZGVkCi0gICAgICAgICAgICAgICAgaWYgKCEiIi5lcXVhbHMoc2NoZW1hTmFtZXNbaV0udHJpbSgpKSkgewotICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBzY2hlbWFTdHJlYW0gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKFNDSEVNQV9QQVRIICsgc2NoZW1hTmFtZXNbaV0pOwotICAgICAgICAgICAgICAgICAgICBEb2N1bWVudCBkb2MgPSBkb2N1bWVudEJ1aWxkZXIucGFyc2Uoc2NoZW1hU3RyZWFtKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkaXRpb25hbFNjaGVtYUVsZW1lbnRzLmFkZChkb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy9DcmVhdGUgdGhlIFNjaGVtYSBlbGVtZW50IGFycmF5Ci0gICAgICAgICAgICBzY2hlbWFFbGVtZW50cyA9IG5ldyBFbGVtZW50W2FkZGl0aW9uYWxTY2hlbWFFbGVtZW50cy5zaXplKCldOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhZGRpdGlvbmFsU2NoZW1hRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBzY2hlbWFFbGVtZW50c1tpXSA9IChFbGVtZW50KWFkZGl0aW9uYWxTY2hlbWFFbGVtZW50cy5nZXQoaSk7Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICBDb2RlZ2VuTWVzc2FnZXMuZ2V0TWVzc2FnZSgiZXh0ZW5zaW9uLmFkZGl0aW9uYWxTY2hlbWFGYWlsdXJlIiksIGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHNjaGVtYUVsZW1lbnRzOwotICAgIH0KLQotICAgIHByaXZhdGUgRG9jdW1lbnRCdWlsZGVyIGdldE5hbWVzcGFjZUF3YXJlRG9jdW1lbnRCdWlsZGVyKCkgdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gewotICAgICAgICBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGRvY3VtZW50QnVpbGRlckZhY3RvcnkgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIGRvY3VtZW50QnVpbGRlckZhY3Rvcnkuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7Ci0gICAgICAgIHJldHVybiBkb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpOwotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vZXh0ZW5zaW9uL0pBWFdTV2FwcGVyRXh0ZW5zaW9uLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi9leHRlbnNpb24vSkFYV1NXYXBwZXJFeHRlbnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y3MTczZC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi9leHRlbnNpb24vSkFYV1NXYXBwZXJFeHRlbnNpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLmV4dGVuc2lvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc01lc3NhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5QYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLldTRExVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLkNvZGVHZW5Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLkNvZGVHZW5lcmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC51dGlsLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwudXRpbC5NZXNzYWdlUGFydEluZm9ybWF0aW9uSG9sZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hOwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hQ29tcGxleFR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFFbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hSW1wb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hSW5jbHVkZTsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYU9iamVjdENvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFQYXJ0aWNsZTsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYVNlcXVlbmNlOwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hVHlwZTsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBKQVhXU1dhcHBlckV4dGVuc2lvbiBleHRlbmRzIEFic3RyYWN0Q29kZUdlbmVyYXRpb25FeHRlbnNpb24gewotICAgIHByaXZhdGUgQ29kZUdlbkNvbmZpZ3VyYXRpb24gY29kZUdlbkNvbmZpZ3VyYXRpb247Ci0KLSAgICBwdWJsaWMgdm9pZCBlbmdhZ2UoQ29kZUdlbkNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgdGhyb3dzIENvZGVHZW5lcmF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5jb2RlR2VuQ29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb247Ci0gICAgICAgIGlmICghY29kZUdlbkNvbmZpZ3VyYXRpb24uaXNQYXJhbWV0ZXJzV3JhcHBlZCgpICYmIGNvZGVHZW5Db25maWd1cmF0aW9uLmdldE91dHB1dExhbmd1YWdlKCkuZXF1YWxzKCJqYXgtd3MiKSkgewotCi0gICAgICAgICAgICAvL3dhbGsgdGhlIHNjaGVtYSBhbmQgZmluZCB0aGUgdG9wIGxldmVsIGVsZW1lbnRzCi0gICAgICAgICAgICBMaXN0IHNlcnZpY2VzID0gY29uZmlndXJhdGlvbi5nZXRBeGlzU2VydmljZXMoKTsKLSAgICAgICAgICAgIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlOwotCi0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIHNlcnZpY2VzSXRlciA9IHNlcnZpY2VzLml0ZXJhdG9yKCk7IHNlcnZpY2VzSXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgYXhpc1NlcnZpY2UgPSAoQXhpc1NlcnZpY2UpIHNlcnZpY2VzSXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBvcGVyYXRpb25zID0gYXhpc1NlcnZpY2UuZ2V0T3BlcmF0aW9ucygpOwotICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9ucy5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgICAgIEF4aXNPcGVyYXRpb24gb3AgPSAoQXhpc09wZXJhdGlvbikgb3BlcmF0aW9ucy5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gd3JhcHBhYmxlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgLy9nZXQgdGhlIGlucHV0IHBhcmFtZXRlciBkZXRhaWxzIHRvIHVud3JhcCB0aGUgcmVxdWVzdHMKLSAgICAgICAgICAgICAgICAgICAgaWYgKFdTRExVdGlsLmlzSW5wdXRQcmVzZW50Rm9yTUVQKG9wLmdldE1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4oKSkpIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgQXhpc01lc3NhZ2UgbWVzc2FnZSA9IG9wLmdldE1lc3NhZ2UoV1NETENvbnN0YW50cy5NRVNTQUdFX0xBQkVMX0lOX1ZBTFVFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFhtbFNjaGVtYUVsZW1lbnQgc2NoZW1hRWxlbWVudCA9IG1lc3NhZ2UuZ2V0U2NoZW1hRWxlbWVudCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG9wTmFtZSA9ICgoQXhpc09wZXJhdGlvbikgbWVzc2FnZS5nZXRQYXJlbnQoKSkuZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIXNjaGVtYUVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhvcE5hbWUpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBwYWJsZSA9IHdhbGtTY2hlbWEob3AuZ2V0TWVzc2FnZShXU0RMQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfSU5fVkFMVUUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU0RMQ29uc3RhbnRzLklOUFVUX1BBUlRfUU5BTUVfU1VGRklYKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvL2dldCB0aGUgb3V0IHB1dCBwYXJhbWV0ZXIgZGV0YWlscyBhcyB3ZWxsIHRvIHVud3JhcCB0aGUgcmVzcG9uc2VzCi0gICAgICAgICAgICAgICAgICAgIGlmIChXU0RMVXRpbC5pc091dHB1dFByZXNlbnRGb3JNRVAob3AuZ2V0TWVzc2FnZUV4Y2hhbmdlUGF0dGVybigpKSAmJiB3cmFwcGFibGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdhbGtTY2hlbWEob3AuZ2V0TWVzc2FnZShXU0RMQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfT1VUX1ZBTFVFKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NETENvbnN0YW50cy5PVVRQVVRfUEFSVF9RTkFNRV9TVUZGSVgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gd2Fsa1NjaGVtYShBeGlzTWVzc2FnZSBtZXNzYWdlLCBTdHJpbmcgcW5hbWVTdWZmaXgpIHRocm93cyBDb2RlR2VuZXJhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vbm90aGluZyB0byB1bndyYXAKLSAgICAgICAgaWYgKG1lc3NhZ2UuZ2V0U2NoZW1hRWxlbWVudCgpID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIExpc3QgcGFydE5hbWVMaXN0ID0gbmV3IExpbmtlZExpc3QoKTsKLQotICAgICAgICBYbWxTY2hlbWFFbGVtZW50IHNjaGVtYUVsZW1lbnQgPSBtZXNzYWdlLmdldFNjaGVtYUVsZW1lbnQoKTsKLS8vICAgICAgICBTdHJpbmcgb3BOYW1lID0gKChBeGlzT3BlcmF0aW9uKSBtZXNzYWdlLmdldFBhcmVudCgpKS5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCk7Ci0vLyAgICAgICAgaWYoIXNjaGVtYUVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhvcE5hbWUpKQotLy8gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgWG1sU2NoZW1hVHlwZSBzY2hlbWFUeXBlID0gc2NoZW1hRWxlbWVudC5nZXRTY2hlbWFUeXBlKCk7Ci0gICAgICAgIFFOYW1lIHNjaGVtYVR5cGVRbmFtZSA9IHNjaGVtYUVsZW1lbnQuZ2V0U2NoZW1hVHlwZU5hbWUoKTsKLQotICAgICAgICBpZiAoc2NoZW1hVHlwZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoc2NoZW1hVHlwZVFuYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBmaW5kIHRoZSBzY2hlbWEgdHlwZSBmcm9tIGFsbCB0aGUgc2NoZW1hcwotICAgICAgICAgICAgICAgIC8vIG5vdyB3ZSBuZWVkIHRvIGdldCB0aGUgc2NoZW1hIG9mIHRoZSBleHRlbnNpb24gdHlwZSBmcm9tIHRoZSBwYXJlbnQgc2NoZW1hLiBGb3IgdGhhdCBsZXQncyBmaXJzdCByZXRyaWV2ZQotICAgICAgICAgICAgICAgIC8vIHRoZSBwYXJlbnQgc2NoZW1hCi0gICAgICAgICAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UgPSAoQXhpc1NlcnZpY2UpIG1lc3NhZ2UuZ2V0UGFyZW50KCkuZ2V0UGFyZW50KCk7Ci0gICAgICAgICAgICAgICAgQXJyYXlMaXN0IHNjaGVtYXNMaXN0ID0gYXhpc1NlcnZpY2UuZ2V0U2NoZW1hKCk7Ci0KLSAgICAgICAgICAgICAgICBYbWxTY2hlbWEgc2NoZW1hID0gbnVsbDsKLSAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzY2hlbWFzTGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICAgICAgc2NoZW1hID0gKFhtbFNjaGVtYSkgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIHNjaGVtYVR5cGUgPSBnZXRTY2hlbWFUeXBlKHNjaGVtYSwgc2NoZW1hVHlwZVFuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNjaGVtYVR5cGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc2NoZW1hVHlwZSBpbnN0YW5jZW9mIFhtbFNjaGVtYUNvbXBsZXhUeXBlKSB7Ci0gICAgICAgICAgICBpZighaGFuZGxlQWxsQ2FzZXNPZkNvbXBsZXhUeXBlcyhzY2hlbWFUeXBlLAotICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICBwYXJ0TmFtZUxpc3QsCi0gICAgICAgICAgICAgICAgICAgIHFuYW1lU3VmZml4KSl7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLS8vICAgICAgICBlbHNlIGlmICgoc2NoZW1hVHlwZSBpbnN0YW5jZW9mIFhtbFNjaGVtYVNpbXBsZVR5cGUpIHx8Ci0vLyAgICAgICAgICAgICAgICAoKHNjaGVtYVR5cGVRbmFtZSAhPSBudWxsKSAmJiAoc2NoZW1hVHlwZVFuYW1lLmVxdWFscyhuZXcgUU5hbWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiwgImFueVR5cGUiKSkpKSkgewotLy8gICAgICAgICAgICBRTmFtZSBvcE5hbWUgPSAoKEF4aXNPcGVyYXRpb24pIG1lc3NhZ2UuZ2V0UGFyZW50KCkpLmdldE5hbWUoKTsKLS8vICAgICAgICAgICAgcGFydE5hbWVMaXN0LmFkZChXU0RMVXRpbC5nZXRQYXJ0UU5hbWUob3BOYW1lLmdldExvY2FsUGFydCgpLAotLy8gICAgICAgICAgICAgICAgICAgIHFuYW1lU3VmZml4LAotLy8gICAgICAgICAgICAgICAgICAgIHNjaGVtYUVsZW1lbnQuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKSkpOwotLy8gICAgICAgIH0gZWxzZSBpZiAoc2NoZW1hVHlwZSA9PSBudWxsKSB7Ci0vLyAgICAgICAgICAgIHRocm93IG5ldyBDb2RlR2VuZXJhdGlvbkV4Y2VwdGlvbigiQ2FuIG5vdCBkZXRlcm1pbmUgdGhlIHNjaGVtYSB0eXBlIGZvciB0aGUgIgotLy8gICAgICAgICAgICAgICAgICAgICsgc2NoZW1hRWxlbWVudC5nZXROYW1lKCkpOwotLy8gICAgICAgIH0gZWxzZSB7Ci0vLyAgICAgICAgICAgIC8vd2UndmUgbm8gaWRlYSBob3cgdG8gdW53cmFwIGEgbm9uIGNvbXBsZXhUeXBlISEhISEhCi0vLyAgICAgICAgICAgIHRocm93IG5ldyBDb2RlR2VuZXJhdGlvbkV4Y2VwdGlvbigKLS8vICAgICAgICAgICAgICAgICAgICBDb2RlZ2VuTWVzc2FnZXMuZ2V0TWVzc2FnZSgiZXh0ZW5zaW9uLnVuc3VwcG9ydGVkU2NoZW1hRm9ybWF0IiwKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYVR5cGUuZ2V0TmFtZSgpLCAiY29tcGxleFR5cGUiKSk7Ci0vLyAgICAgICAgfQotCi0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vc2V0IGluIHRoZSBheGlzIG1lc3NhZ2UgdGhhdCB0aGUgdW53cmFwcGluZyB3YXMgc3VjY2VzcwotICAgICAgICAgICAgbWVzc2FnZS5hZGRQYXJhbWV0ZXIoZ2V0UGFyYW1ldGVyKAotICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuVU5XUkFQUEVEX0tFWSwKLSAgICAgICAgICAgICAgICAgICAgQm9vbGVhbi5UUlVFKSk7Ci0KLSAgICAgICAgICAgIC8vIGF0dGFjaCB0aGUgb3BOYW1lIGFuZCB0aGUgcGFydHMgbmFtZSBsaXN0IGludG8gdGhlCi0gICAgICAgICAgICAvLyBheGlzIG1lc3NhZ2UgYnkgdXNpbmcgdGhlIGhvbGRlcgotICAgICAgICAgICAgTWVzc2FnZVBhcnRJbmZvcm1hdGlvbkhvbGRlciBpbmZvSG9sZGVyID0gbmV3IE1lc3NhZ2VQYXJ0SW5mb3JtYXRpb25Ib2xkZXIoKTsKLSAgICAgICAgICAgIGluZm9Ib2xkZXIuc2V0T3BlcmF0aW9uTmFtZSgoKEF4aXNPcGVyYXRpb24pIG1lc3NhZ2UuZ2V0UGFyZW50KCkpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICBpbmZvSG9sZGVyLnNldFBhcnRzTGlzdChwYXJ0TmFtZUxpc3QpOwotCi0gICAgICAgICAgICAvL2F0dGFjaCBpdCB0byB0aGUgcGFyYW1ldGVycwotICAgICAgICAgICAgbWVzc2FnZS5hZGRQYXJhbWV0ZXIoCi0gICAgICAgICAgICAgICAgICAgIGdldFBhcmFtZXRlcihDb25zdGFudHMuVU5XUkFQUEVEX0RFVEFJTFMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb0hvbGRlcikpOwotCi0gICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBheGlzRmF1bHQpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDb2RlR2VuZXJhdGlvbkV4Y2VwdGlvbihheGlzRmF1bHQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdlbmVyYXRlIGEgcGFyYW1ldGVzIG9iamVjdAotICAgICAqCi0gICAgICogQHBhcmFtIGtleQotICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqLwotICAgIHByaXZhdGUgUGFyYW1ldGVyIGdldFBhcmFtZXRlcihTdHJpbmcga2V5LCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgUGFyYW1ldGVyIG15UGFyYW1ldGVyID0gbmV3IFBhcmFtZXRlcigpOwotICAgICAgICBteVBhcmFtZXRlci5zZXROYW1lKGtleSk7Ci0gICAgICAgIG15UGFyYW1ldGVyLnNldFZhbHVlKHZhbHVlKTsKLSAgICAgICAgcmV0dXJuIG15UGFyYW1ldGVyOwotICAgIH0KLQotICAgIHByaXZhdGUgWG1sU2NoZW1hVHlwZSBnZXRTY2hlbWFUeXBlKFhtbFNjaGVtYSBzY2hlbWEsIFFOYW1lIHR5cGVOYW1lKSB7Ci0gICAgICAgIFhtbFNjaGVtYVR5cGUgeG1sU2NoZW1hVHlwZSA9IG51bGw7Ci0gICAgICAgIGlmIChzY2hlbWEgIT0gbnVsbCkgewotICAgICAgICAgICAgeG1sU2NoZW1hVHlwZSA9IHNjaGVtYS5nZXRUeXBlQnlOYW1lKHR5cGVOYW1lKTsKLSAgICAgICAgICAgIGlmICh4bWxTY2hlbWFUeXBlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyB0cnkgdG8gZmluZCBpbiBhbiBpbXBvcnQgb3IgYW4gaW5jbHVkZQotICAgICAgICAgICAgICAgIFhtbFNjaGVtYU9iamVjdENvbGxlY3Rpb24gaW5jbHVkZXMgPSBzY2hlbWEuZ2V0SW5jbHVkZXMoKTsKLSAgICAgICAgICAgICAgICBpZiAoaW5jbHVkZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBJdGVyYXRvciBpbmNsdWRlc0l0ZXIgPSBpbmNsdWRlcy5nZXRJdGVyYXRvcigpOwotICAgICAgICAgICAgICAgICAgICBPYmplY3Qgb2JqZWN0ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGluY2x1ZGVzSXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdCA9IGluY2x1ZGVzSXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgWG1sU2NoZW1hSW1wb3J0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgWG1sU2NoZW1hIHNjaGVtYTEgPSAoKFhtbFNjaGVtYUltcG9ydCkgb2JqZWN0KS5nZXRTY2hlbWEoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxTY2hlbWFUeXBlID0gZ2V0U2NoZW1hVHlwZShzY2hlbWExLCB0eXBlTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgWG1sU2NoZW1hSW5jbHVkZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhtbFNjaGVtYSBzY2hlbWExID0gKChYbWxTY2hlbWFJbmNsdWRlKSBvYmplY3QpLmdldFNjaGVtYSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFNjaGVtYVR5cGUgPSBnZXRTY2hlbWFUeXBlKHNjaGVtYTEsIHR5cGVOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh4bWxTY2hlbWFUeXBlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4geG1sU2NoZW1hVHlwZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaGFuZGxlQWxsQ2FzZXNPZkNvbXBsZXhUeXBlcyhYbWxTY2hlbWFUeXBlIHNjaGVtYVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXhpc01lc3NhZ2UgbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0IHBhcnROYW1lTGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcW5hbWVTdWZmaXgpIHRocm93cyBDb2RlR2VuZXJhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIGlmIGEgY29tcGxleCB0eXBlIG5hbWUgZXhpdHMgZm9yIGEgZWxlbWVudCB0aGVuCi0gICAgICAgIC8vIHdlIGtlZXAgdGhhdCBjb21wbGV4IHR5cGUgdG8gc3VwcG9ydCB1bndyYXBwaW5nCi0gICAgICAgIGlmIChzY2hlbWFUeXBlIGluc3RhbmNlb2YgWG1sU2NoZW1hQ29tcGxleFR5cGUpIHsKLSAgICAgICAgICAgIFhtbFNjaGVtYUNvbXBsZXhUeXBlIGNtcGx4VHlwZSA9IChYbWxTY2hlbWFDb21wbGV4VHlwZSkgc2NoZW1hVHlwZTsKLQotICAgICAgICAgICAgWG1sU2NoZW1hT2JqZWN0Q29sbGVjdGlvbiB4bWxPYmplY3RDb2xsZWN0aW9uID0gY21wbHhUeXBlLmdldEF0dHJpYnV0ZXMoKTsKLSAgICAgICAgICAgIGlmICh4bWxPYmplY3RDb2xsZWN0aW9uLmdldENvdW50KCkgIT0gMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgICAgIGlmIChjbXBseFR5cGUuZ2V0Q29udGVudE1vZGVsKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChjbXBseFR5cGUuZ2V0UGFydGljbGUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm9jZXNzWE1MU2NoZW1hU2VxdWVuY2UoY21wbHhUeXBlLmdldFBhcnRpY2xlKCksIG1lc3NhZ2UsIHBhcnROYW1lTGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBxbmFtZVN1ZmZpeCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBub3cgbGV0cyBoYW5kbGUgY2FzZSB3aXRoIGV4dGVuc2lvbnMKLSAgICAgICAgICAgICAgICByZXR1cm4gcHJvY2Vzc0NvbXBsZXhDb250ZW50TW9kZWwoY21wbHhUeXBlLCBtZXNzYWdlLCBwYXJ0TmFtZUxpc3QsIHFuYW1lU3VmZml4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIGhhbmRsZSBhdHRyaWJ1dGVzIGhlcmUKLSAgICAgICAgICAgIC8vIHByb2Nlc3NBdHRyaWJ1dGVzKGNtcGx4VHlwZSwgbWVzc2FnZSwgcGFydE5hbWVMaXN0LCBxbmFtZVN1ZmZpeCk7Ci0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIHByb2Nlc3NDb21wbGV4Q29udGVudE1vZGVsKFhtbFNjaGVtYUNvbXBsZXhUeXBlIGNtcGx4VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXhpc01lc3NhZ2UgbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdCBwYXJ0TmFtZUxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBxbmFtZVN1ZmZpeCkgdGhyb3dzIENvZGVHZW5lcmF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgLy9UT0RPIGltcGxlbWVudCB0aGlzIG1ldGhvZAotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIHByb2Nlc3NYTUxTY2hlbWFTZXF1ZW5jZShYbWxTY2hlbWFQYXJ0aWNsZSBzY2hlbWFQYXJ0aWNsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF4aXNNZXNzYWdlIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0IHBhcnROYW1lTGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBxbmFtZVN1ZmZpeCkgdGhyb3dzIENvZGVHZW5lcmF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHNjaGVtYVBhcnRpY2xlIGluc3RhbmNlb2YgWG1sU2NoZW1hU2VxdWVuY2UpIHsKLSAgICAgICAgICAgIC8vIGdldCB0aGUgbmFtZSBvZiB0aGUgb3BlcmF0aW9uIG5hbWUgYW5kIG5hbWVzcGFjZSwKLSAgICAgICAgICAgIC8vIHBhcnQgbmFtZSBhbmQgaGFuZyB0aGVtIHNvbWV3aGVyZSA/IFRoZSBpZGVhbCBwbGFjZQotICAgICAgICAgICAgLy8gd291bGQgYmUgdGhlIHByb3BlcnR5IGJhZyBpbiB0aGUgY29kZWdlbiBjb25maWchCi0gICAgICAgICAgICBRTmFtZSBvcE5hbWUgPSAoKEF4aXNPcGVyYXRpb24pIG1lc3NhZ2UuZ2V0UGFyZW50KCkpLmdldE5hbWUoKTsKLQotICAgICAgICAgICAgWG1sU2NoZW1hU2VxdWVuY2Ugc2VxdWVuY2UgPSAoWG1sU2NoZW1hU2VxdWVuY2UpIHNjaGVtYVBhcnRpY2xlOwotICAgICAgICAgICAgWG1sU2NoZW1hT2JqZWN0Q29sbGVjdGlvbiBpdGVtcyA9IHNlcXVlbmNlLmdldEl0ZW1zKCk7Ci0KLSAgICAgICAgICAgIC8vIGlmIHRoaXMgaXMgYW4gZW1wdHkgc2VxdWVuY2UsIHJldHVybgotICAgICAgICAgICAgaWYgKGl0ZW1zLmdldENvdW50KCkgPT0gMCkgewotLypiZSBjYXJlZnVsbCAqLwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gaXRlbXMuZ2V0SXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IGl0ZW0gPSBpLm5leHQoKTsKLSAgICAgICAgICAgICAgICAvLyBnZXQgZWFjaCBhbmQgZXZlcnkgZWxlbWVudCBpbiB0aGUgc2VxdWVuY2UgYW5kCi0gICAgICAgICAgICAgICAgLy8gdHJhdmVyc2UgdGhyb3VnaCB0aGVtCi0gICAgICAgICAgICAgICAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBYbWxTY2hlbWFFbGVtZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vYWRkIHRoZSBlbGVtZW50IG5hbWUgdG8gdGhlIHBhcnQgbmFtZSBsaXN0Ci0gICAgICAgICAgICAgICAgICAgIFhtbFNjaGVtYUVsZW1lbnQgeG1sU2NoZW1hRWxlbWVudCA9IChYbWxTY2hlbWFFbGVtZW50KSBpdGVtOwotLy8gICAgICAgICAgICAgICAgICAgIGlmKHhtbFNjaGVtYUVsZW1lbnQuaXNOaWxsYWJsZSgpKXsKLS8vICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotLy8gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgWG1sU2NoZW1hVHlwZSBzY2hlbWFUeXBlID0geG1sU2NoZW1hRWxlbWVudC5nZXRTY2hlbWFUeXBlKCk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXJ0TmFtZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh4bWxTY2hlbWFFbGVtZW50LmdldFJlZk5hbWUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYXJ0TmFtZSA9IHhtbFNjaGVtYUVsZW1lbnQuZ2V0UmVmTmFtZSgpLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgcGFydE5hbWUgPSB4bWxTY2hlbWFFbGVtZW50LmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8vICBwYXJ0IG5hbWVzIGFyZSBub3QgdW5pcXVlIGFjcm9zcyBtZXNzYWdlcy4gSGVuY2UKLSAgICAgICAgICAgICAgICAgICAgLy8gIHdlIG5lZWQgc29tZSB3YXkgb2YgbWFraW5nIHRoZSBwYXJ0IG5hbWUgYSB1bmlxdWUKLSAgICAgICAgICAgICAgICAgICAgLy8gIG9uZSAoZHVlIHRvIHRoZSBmYWN0IHRoYXQgdGhlIHR5cGUgbWFwcGVyCi0gICAgICAgICAgICAgICAgICAgIC8vICBpcyBhIGdsb2JhbCBsaXN0IG9mIHR5cGVzKS4KLSAgICAgICAgICAgICAgICAgICAgLy8gIFRoZSBzZWVtaW5nbHkgYmVzdCB3YXkgdG8gZG8gdGhhdCBpcyB0bwotICAgICAgICAgICAgICAgICAgICAvLyAgc3BlY2lmeSBhIG5hbWVzcGFjZSBmb3IgdGhlIHBhcnQgUU5hbWUgcmVmZXJlbmNlIHdoaWNoCi0gICAgICAgICAgICAgICAgICAgIC8vICBpcyBzdG9yZWQgaW4gdGhlICBsaXN0LiBUaGlzIHBhcnQgcW5hbWUgaXMKLSAgICAgICAgICAgICAgICAgICAgLy8gIHRlbXBvcmFyeSBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIHdpdGggaXQncwotICAgICAgICAgICAgICAgICAgICAvLyAgbmFtZXNwYWNlIFVSSSAod2hpY2ggaGFwcGVuZWQgdG8gYmUgdGhlIG9wZXJhdGlvbiBuYW1lKQotICAgICAgICAgICAgICAgICAgICAvLyAgd2l0aCBfaW5wdXQgYXR0YWNoZWQgdG8gaXQKLQotICAgICAgICAgICAgICAgICAgICBwYXJ0TmFtZUxpc3QuYWRkKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdTRExVdGlsLmdldFBhcnRRTmFtZShvcE5hbWUuZ2V0TG9jYWxQYXJ0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxbmFtZVN1ZmZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnROYW1lKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHBhcnRpY2xlIGNvbnRhaW5zIGFueXRoaW5nIG90aGVyIHRoYW4KLSAgICAgICAgICAgICAgICAgICAgLy8gYSBYTUxTY2hlbWFFbGVtZW50IHRoZW4gd2UgYXJlIG5vdCBpbiBhIHBvc2l0aW9uCi0gICAgICAgICAgICAgICAgICAgIC8vIHRvIHVud3JhcCBpdAotLy8gICAgICAgICAgICAgICAgfQotLy8gICAgICAgICAgICAgICAgZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFhtbFNjaGVtYUFueSkgewotLy8KLS8vICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGlzIGlzIGFuIGluc3RhbmNlIG9mIHhzOmFueSwgdGhlbiB0aGVyZSBpcyBubyBwYXJ0IG5hbWUgZm9yIGl0LiBVc2luZyBBTllfRUxFTUVOVF9GSUVMRF9OQU1FCi0vLyAgICAgICAgICAgICAgICAgICAgLy8gZm9yIGl0IGZvciBub3cKLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgLy93ZSBoYXZlIHRvIGhhbmRsZSBib3RoIG1heG9jY3VycyAxIGFuZCBtYXhvY2N1cnMgPiAxIHNpdHVhdGlvbgotLy8gICAgICAgICAgICAgICAgICAgIFhtbFNjaGVtYUFueSB4bWxTY2hlbWFBbnkgPSAoWG1sU2NoZW1hQW55KSBpdGVtOwotLy8KLS8vICAgICAgICAgICAgICAgICAgICBwYXJ0TmFtZUxpc3QuYWRkKAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NETFV0aWwuZ2V0UGFydFFOYW1lKG9wTmFtZS5nZXRMb2NhbFBhcnQoKSwKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcW5hbWVTdWZmaXgsCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5BTllfRUxFTUVOVF9GSUVMRF9OQU1FKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLS8vICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29kZUdlbmVyYXRpb25FeGNlcHRpb24oCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlZ2VuTWVzc2FnZXMuZ2V0TWVzc2FnZSgiZXh0ZW5zaW9uLnVuc3VwcG9ydGVkU2NoZW1hRm9ybWF0IiwKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVua25vd24gdHlwZSIsICJFbGVtZW50IikpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAvL3dlIGRvIG5vdCBrbm93IGhvdyB0byBkZWFsIHdpdGggb3RoZXIgcGFydGljbGVzCi0gICAgICAgICAgICAvL3N1Y2ggYXMgeHM6YWxsIG9yIHhzOmNob2ljZS4gVXN1YWxseSBvY2N1cnMgd2hlbgotICAgICAgICAgICAgLy9wYXNzZWQgd2l0aCB0aGUgdXNlciBidWlsdCBXU0RMIHdoZXJlIHRoZSBzdHlsZQotICAgICAgICAgICAgLy9pcyBkb2N1bWVudC4KLS8vICAgICAgICB9IGVsc2UgaWYgKHNjaGVtYVBhcnRpY2xlIGluc3RhbmNlb2YgWG1sU2NoZW1hQ2hvaWNlKSB7Ci0vLyAgICAgICAgICAgIHRocm93IG5ldyBDb2RlR2VuZXJhdGlvbkV4Y2VwdGlvbigKLS8vICAgICAgICAgICAgICAgICAgICBDb2RlZ2VuTWVzc2FnZXMuZ2V0TWVzc2FnZSgiZXh0ZW5zaW9uLnVuc3VwcG9ydGVkU2NoZW1hRm9ybWF0IiwKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjaG9pY2UiLCAic2VxdWVuY2UiKSk7Ci0vLwotLy8gICAgICAgIH0gZWxzZSBpZiAoc2NoZW1hUGFydGljbGUgaW5zdGFuY2VvZiBYbWxTY2hlbWFBbGwpIHsKLS8vICAgICAgICAgICAgdGhyb3cgbmV3IENvZGVHZW5lcmF0aW9uRXhjZXB0aW9uKAotLy8gICAgICAgICAgICAgICAgICAgIENvZGVnZW5NZXNzYWdlcy5nZXRNZXNzYWdlKCJleHRlbnNpb24udW5zdXBwb3J0ZWRTY2hlbWFGb3JtYXQiLAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgImFsbCIsICJzZXF1ZW5jZSIpKTsKLSAgICAgICAgfSBlbHNlIHsKLS8vICAgICAgICAgICAgdGhyb3cgbmV3IENvZGVHZW5lcmF0aW9uRXhjZXB0aW9uKAotLy8gICAgICAgICAgICAgICAgICAgIENvZGVnZW5NZXNzYWdlcy5nZXRNZXNzYWdlKCJleHRlbnNpb24udW5zdXBwb3J0ZWRTY2hlbWFGb3JtYXQiLAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgInVua25vd24iLCAic2VxdWVuY2UiKSk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL2V4dGVuc2lvbi9KYXZhUHJldHR5UHJpbnRlckV4dGVuc2lvbi5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vZXh0ZW5zaW9uL0phdmFQcmV0dHlQcmludGVyRXh0ZW5zaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiYmE4NTAuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vZXh0ZW5zaW9uL0phdmFQcmV0dHlQcmludGVyRXh0ZW5zaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLmV4dGVuc2lvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5QcmV0dHlQcmludGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLkNvZGVHZW5Db25maWd1cmF0aW9uOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1wdWJsaWMgY2xhc3MgSmF2YVByZXR0eVByaW50ZXJFeHRlbnNpb24gZXh0ZW5kcyBBYnN0cmFjdFByZXR0eVByaW50ZXJFeHRlbnNpb24gewotCi0KLSAgICBwdWJsaWMgSmF2YVByZXR0eVByaW50ZXJFeHRlbnNpb24oKSB7Ci0gICAgICAgIC8qCi0gICAgICAgICogSWYgdGhlIGV4dGVuc2lvbiBmb3IgcHJvcGVydHkgZmlsZSBjaGFuZ2VzIGl0IG1pZ2h0IGVmZmVjdCB0aGlzIGFzCi0gICAgICAgICogd2VsbCAhISEKLSAgICAgICAgKi8KLSAgICAgICAgZmlsZUV4dGVuc2lvbiA9ICIuamF2YSI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVjdXJzaXZlIHByb2NlZHVyZSB0byBwcmV0dGlmeSB0aGUgZmlsZXMKLSAgICAgKgotICAgICAqIEBwYXJhbSBmaWxlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJldHRpZnkoRmlsZSBmaWxlLCBDb2RlR2VuQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB7Ci0gICAgICAgIGlmIChmaWxlLmlzRmlsZSgpICYmCi0gICAgICAgICAgICAgICAgZmlsZS5leGlzdHMoKSAmJgotICAgICAgICAgICAgICAgIGZpbGUuZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoZmlsZUV4dGVuc2lvbikpIHsKLSAgICAgICAgICAgIHByZXR0aWZ5RmlsZShmaWxlKTsKLSAgICAgICAgfSBlbHNlIGlmIChmaWxlLmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgIEZpbGVbXSBjaGlsZEZpbGVzID0gZmlsZS5saXN0RmlsZXMoKTsKLSAgICAgICAgICAgIGlmIChjaGlsZEZpbGVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkRmlsZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgcHJldHRpZnkoY2hpbGRGaWxlc1tpXSwgY29uZmlndXJhdGlvbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogT3ZlcnJpZGRlbiB0byBjYWxsIHRoZSBqYXZhIHByZXR0eSBwcmludGVyCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZmlsZQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHByZXR0aWZ5RmlsZShGaWxlIGZpbGUpIHsKLSAgICAgICAgLy8gU3BlY2lhbCBjYXNlIGpheGJyaSBnZW5lcmF0ZWQgcGFja2FnZS1pbmZvLmphdmEgCi0gICAgICAgIC8vIGFzIGphbG9weSBjb3JydXB0cyB0aGUgcGFja2FnZSBsZXZlbCBhbm5vdGF0aW9ucwotICAgICAgICBpZiAoZmlsZS5nZXROYW1lKCkuZXF1YWxzKCJwYWNrYWdlLWluZm8uamF2YSIpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgUHJldHR5UHJpbnRlci5wcmV0dGlmeShmaWxlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi9leHRlbnNpb24vSmlCWEV4dGVuc2lvbi5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vZXh0ZW5zaW9uL0ppQlhFeHRlbnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE2MDdmMy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi9leHRlbnNpb24vSmlCWEV4dGVuc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5leHRlbnNpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5Db2RlR2VuQ29uZmlndXJhdGlvbjsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotCi0vKioKLSAqIENvZGUgZ2VuZXJhdGlvbiBkYXRhIGJpbmRpbmcgZXh0ZW5zaW9uIGZvciBKaUJYIHN1cHBvcnQuIEppQlggY3VycmVudGx5IHJlcXVpcmVzIGEgcHJlZGVmaW5lZAotICogYmluZGluZyBkZWZpbml0aW9uIHRvIGJlIHN1cHBsaWVkIGluIG9yZGVyIHRvIGJlIHVzZWQgd2l0aCBBeGlzMi4KLSAqLwotcHVibGljIGNsYXNzIEppQlhFeHRlbnNpb24gZXh0ZW5kcyBBYnN0cmFjdERCUHJvY2Vzc2luZ0V4dGVuc2lvbiB7Ci0KLSAgICAvKiogTmFtZSBvZiAiZXh0cmEiIG9wdGlvbiB1c2VkIHRvIHN1cHBseSBiaW5kaW5nIGRlZmluaXRpb24gcGF0aC4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCSU5ESU5HX1BBVEhfT1BUSU9OID0gImJpbmRpbmdmaWxlIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSklCWF9NT0RFTF9DTEFTUyA9Ci0gICAgICAgICAgICAib3JnLmppYnguYmluZGluZy5tb2RlbC5CaW5kaW5nRWxlbWVudCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpJQlhfVVRJTElUWV9DTEFTUyA9Ci0gICAgICAgICAgICAib3JnLmFwYWNoZS5heGlzMi5qaWJ4LkNvZGVHZW5lcmF0aW9uVXRpbGl0eSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpJQlhfVVRJTElUWV9NRVRIT0QgPSAiZW5nYWdlIjsKLQotICAgIHB1YmxpYyB2b2lkIGVuZ2FnZShDb2RlR2VuQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB7Ci0KLSAgICAgICAgLy8ganVzdCByZXR1cm4gaWYgSmlCWCBiaW5kaW5nIG5vdCBhY3RpdmUKLSAgICAgICAgaWYgKHRlc3RGYWxsVGhyb3VnaChjb25maWd1cmF0aW9uLmdldERhdGFiaW5kaW5nVHlwZSgpKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY2hlY2sgdGhlIEppQlggYmluZGluZyBkZWZpbml0aW9uIGZpbGUgc3BlY2lmaWVkCi0gICAgICAgIFN0cmluZyBwYXRoID0gKFN0cmluZyljb25maWd1cmF0aW9uLmdldFByb3BlcnRpZXMoKS5nZXQoQklORElOR19QQVRIX09QVElPTik7Ci0gICAgICAgIHRyeSB7Ci0KLSAgICAgICAgICAgIC8vIHRyeSBkdW1teSBsb2FkIG9mIGZyYW1ld29yayBjbGFzcyBmaXJzdCB0byBjaGVjayBtaXNzaW5nIGphcnMKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpLmxvYWRDbGFzcyhKSUJYX01PREVMX0NMQVNTKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJKaUJYIGZyYW1ld29yayBqYXJzIG5vdCBpbiBjbGFzc3BhdGgiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gbG9hZCB0aGUgYWN0dWFsIHV0aWxpdHkgY2xhc3MKLSAgICAgICAgICAgIENsYXNzIGNsYXp6OwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBjbGF6eiA9IEppQlhFeHRlbnNpb24uY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKS5sb2FkQ2xhc3MoSklCWF9VVElMSVRZX0NMQVNTKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJKaUJYIGJpbmRpbmcgZXh0ZW5zaW9uIG5vdCBpbiBjbGFzc3BhdGgiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gY3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBjbGFzcwotICAgICAgICAgICAgT2JqZWN0IGluc3QgPSBudWxsOwotICAgICAgICAgICAgQ29uc3RydWN0b3IgY29uc3RydWN0b3IgPQotICAgICAgICAgICAgICAgICAgICBjbGF6ei5nZXRDb25zdHJ1Y3RvcihuZXcgQ2xhc3NbXSB7IENvZGVHZW5Db25maWd1cmF0aW9uLmNsYXNzIH0pOwotICAgICAgICAgICAgaW5zdCA9IGNvbnN0cnVjdG9yLm5ld0luc3RhbmNlKG5ldyBPYmplY3RbXSB7IGNvbmZpZ3VyYXRpb24gfSk7Ci0KLSAgICAgICAgICAgIC8vIGludm9rZSB1dGlsaXR5IGNsYXNzIG1ldGhvZCBmb3IgYWN0dWFsIHByb2Nlc3NpbmcKLSAgICAgICAgICAgIE1ldGhvZCBtZXRob2QgPSBjbGF6ei5nZXRNZXRob2QoSklCWF9VVElMSVRZX01FVEhPRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzW10geyBTdHJpbmcuY2xhc3MgfSk7Ci0gICAgICAgICAgICBtZXRob2QuaW52b2tlKGluc3QsIG5ldyBPYmplY3RbXSB7IHBhdGggfSk7Ci0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGUuZ2V0Q2F1c2UoKSBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pZS5nZXRDYXVzZSgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi9leHRlbnNpb24vTW9kdWxlUG9saWN5RXh0ZW5zaW9uLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi9leHRlbnNpb24vTW9kdWxlUG9saWN5RXh0ZW5zaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3YTljNWUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vZXh0ZW5zaW9uL01vZHVsZVBvbGljeUV4dGVuc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5leHRlbnNpb247Ci0KLQotcHVibGljIGludGVyZmFjZSBNb2R1bGVQb2xpY3lFeHRlbnNpb24gewotCi0gICAgcHVibGljIFBvbGljeUV4dGVuc2lvbiBnZXRQb2xpY3lFeHRlbnNpb24oKTsKLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vZXh0ZW5zaW9uL1BhY2thZ2VGaW5kZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL2V4dGVuc2lvbi9QYWNrYWdlRmluZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0ODkyMTcuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vZXh0ZW5zaW9uL1BhY2thZ2VGaW5kZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4uZXh0ZW5zaW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLlVSTFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5Db2RlR2VuQ29uZmlndXJhdGlvbjsKLQotcHVibGljIGNsYXNzIFBhY2thZ2VGaW5kZXIgZXh0ZW5kcyBBYnN0cmFjdENvZGVHZW5lcmF0aW9uRXh0ZW5zaW9uIHsKLQotCi0gICAgcHVibGljIHZvaWQgZW5nYWdlKENvZGVHZW5Db25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHsKLSAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gY29uZmlndXJhdGlvbi5nZXRQYWNrYWdlTmFtZSgpOwotICAgICAgICBpZiAocGFja2FnZU5hbWUgPT0gbnVsbCB8fCBVUkxQcm9jZXNzb3IuREVGQVVMVF9QQUNLQUdFLmVxdWFscyhwYWNrYWdlTmFtZSkpIHsKLQotICAgICAgICAgICAgLy91c2UgdGhlIHRhcmdldCBuYW1lc3BhY2UgZnJvbSB0aGUgYXhpcyBzZXJ2aWNlIHRvIGZvcm0gYSBwYWNrYWdlIG5hbWUKLSAgICAgICAgICAgIC8vIHNpbmNlIGFsbCB0aGUgc2VydmljZXMgYXJlIGluIHNhbWUgbmFtZSBzcGFjZQotICAgICAgICAgICAgU3RyaW5nIHRhcmdldE5hbWVTcGFjZSA9IGNvbmZpZ3VyYXRpb24uZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0KLSAgICAgICAgICAgIC8vIGlmIHRoaXMgdGFyZ2V0IG5hbWUgc3BhY2UgZXhpc3RzIGluIHRoZSBuczJwIHRoZW4gd2UgaGF2ZSB0byBnZXQgdGhhdCBwYWNrYWdlCi0gICAgICAgICAgICBpZiAoKGNvbmZpZ3VyYXRpb24uZ2V0VXJpMlBhY2thZ2VOYW1lTWFwKCkgIT0gbnVsbCkgJiYKLSAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbi5nZXRVcmkyUGFja2FnZU5hbWVNYXAoKS5jb250YWluc0tleSh0YXJnZXROYW1lU3BhY2UudHJpbSgpKSkgewotICAgICAgICAgICAgICAgIHBhY2thZ2VOYW1lID0gKFN0cmluZyljb25maWd1cmF0aW9uLmdldFVyaTJQYWNrYWdlTmFtZU1hcCgpLmdldCh0YXJnZXROYW1lU3BhY2UpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBpLmUuIHVzZXIgaGF2ZSBub3QgZ2l2ZW4gYW55IG5zMnAgaW5mb3JtYXRpb24gZm9yIHRoaXMgbmFtZSBzcGFjZQotICAgICAgICAgICAgICAgIHBhY2thZ2VOYW1lID0gVVJMUHJvY2Vzc29yLm1ha2VQYWNrYWdlTmFtZShjb25maWd1cmF0aW9uLmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgICAgICAgICBpZiAocGFja2FnZU5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwYWNrYWdlTmFtZSA9IHBhY2thZ2VOYW1lLnRvTG93ZXJDYXNlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotICAgICAgICBpZiAoKHBhY2thZ2VOYW1lID09IG51bGwpIHx8ICIiLmVxdWFscyhwYWNrYWdlTmFtZSkpIHsKLSAgICAgICAgICAgIHBhY2thZ2VOYW1lID0gVVJMUHJvY2Vzc29yLkRFRkFVTFRfUEFDS0FHRTsKLSAgICAgICAgfQotCi0gICAgICAgIGNvbmZpZ3VyYXRpb24uc2V0UGFja2FnZU5hbWUocGFja2FnZU5hbWUpOwotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi9leHRlbnNpb24vUG9saWN5RXZhbHVhdG9yLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi9leHRlbnNpb24vUG9saWN5RXZhbHVhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkYzMxNDUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vZXh0ZW5zaW9uL1BvbGljeUV2YWx1YXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4uZXh0ZW5zaW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzTW9kdWxlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUG9saWN5SW5jbHVkZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLm1vZHVsZXMuTW9kdWxlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLkNvZGVHZW5Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubmVldGhpLkFzc2VydGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm5lZXRoaS5Qb2xpY3k7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1wdWJsaWMgY2xhc3MgUG9saWN5RXZhbHVhdG9yIGltcGxlbWVudHMgQ29kZUdlbkV4dGVuc2lvbiB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coUG9saWN5RXZhbHVhdG9yLmNsYXNzKTsKLSAgICAKLSAgICBwcml2YXRlIENvZGVHZW5Db25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb247Ci0KLSAgICAvKioKLSAgICAgKiBJbml0IG1ldGhvZCB0byBpbml0aWFsaXphdGlvbgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbmZpZ3VyYXRpb24KLSAgICAgKiBAcGFyYW0gbmFtZXNwYWNlMkV4dHNNYXAKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgaW5pdChDb2RlR2VuQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uLCBNYXAgbmFtZXNwYWNlMkV4dHNNYXApIHsKLSAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvbjsKLQotICAgICAgICAvLyBhZGRpbmcgZGVmYXVsdCBQb2xpY3lFeHRlbnNpb25zCi0gICAgICAgIG5hbWVzcGFjZTJFeHRzTWFwCi0gICAgICAgICAgICAgICAgLnB1dCgiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOS9wb2xpY3kvb3B0aW1pemVkbWltZXNlcmlhbGl6YXRpb24iLAotICAgICAgICAgICAgICAgICAgICAgbmV3IE1UT01Qb2xpY3lFeHRlbnNpb24oY29uZmlndXJhdGlvbikpOwotICAgICAgICBuYW1lc3BhY2UyRXh0c01hcC5wdXQoImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDkvcG9saWN5L2VuY29kaW5nIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBFbmNvZGVQb2xpY3lFeHRlbnNpb24oKSk7Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgcmVwb3NpdG9yeSA9IGNvbmZpZ3VyYXRpb24uZ2V0UmVwb3NpdG9yeVBhdGgoKTsKLQotICAgICAgICBpZiAocmVwb3NpdG9yeSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotCi0gICAgICAgIHRyeSB7Ci0KLSAgICAgICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ3VyYXRpb25DdHggPSBDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkKLSAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZUNvbmZpZ3VyYXRpb25Db250ZXh0RnJvbUZpbGVTeXN0ZW0ocmVwb3NpdG9yeSwgbnVsbCk7Ci0gICAgICAgICAgICBBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb25DdHgKLSAgICAgICAgICAgICAgICAgICAgLmdldEF4aXNDb25maWd1cmF0aW9uKCk7Ci0KLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBheGlzQ29uZmlndXJhdGlvbi5nZXRNb2R1bGVzKCkudmFsdWVzKCkKLSAgICAgICAgICAgICAgICAgICAgLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQotICAgICAgICAgICAgICAgIEF4aXNNb2R1bGUgYXhpc01vZHVsZSA9IChBeGlzTW9kdWxlKWl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmdbXSBuYW1lc3BhY2VzID0gYXhpc01vZHVsZS5nZXRTdXBwb3J0ZWRQb2xpY3lOYW1lc3BhY2VzKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIE1vZHVsZSBtb2R1bGUgPSBheGlzTW9kdWxlLmdldE1vZHVsZSgpOwotICAgICAgICAgICAgICAgIGlmICghKG1vZHVsZSBpbnN0YW5jZW9mIE1vZHVsZVBvbGljeUV4dGVuc2lvbikpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgUG9saWN5RXh0ZW5zaW9uIGV4dCA9ICgoTW9kdWxlUG9saWN5RXh0ZW5zaW9uKW1vZHVsZSkuZ2V0UG9saWN5RXh0ZW5zaW9uKCk7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5hbWVzcGFjZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlMkV4dHNNYXAucHV0KG5hbWVzcGFjZXNbaV0sIGV4dCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBsb2cuZXJyb3IoImNhbm5vdCBjcmVhdGUgcmVwb3NpdG9yeSA6IHBvbGljeSB3aWxsIG5vdCBiZSBzdXBwb3J0ZWQiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVuZ2FnZShDb2RlR2VuQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB7Ci0KLSAgICAgICAgTWFwIG5hbWVzcGFjZTJFeHRNYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICAvL2luaXRpYWxpemUKLSAgICAgICAgaW5pdChjb25maWd1cmF0aW9uLCBuYW1lc3BhY2UyRXh0TWFwKTsKLQotICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IGdldEVtcHR5RG9jdW1lbnQoKTsKLSAgICAgICAgRWxlbWVudCByb290RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm1vZHVsZS1jb2RlZ2VuLXBvbGljeS1leHRlbnNpb25zIik7Ci0KLSAgICAgICAgQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uOwotICAgICAgICBRTmFtZSBvcE5hbWU7Ci0gICAgICAgIFBvbGljeUluY2x1ZGUgcG9saWN5SW5jbHVkZTsKLSAgICAgICAgUG9saWN5IHBvbGljeTsKLQotICAgICAgICBMaXN0IGF4aXNTZXJ2aWNlcyA9IGNvbmZpZ3VyYXRpb24uZ2V0QXhpc1NlcnZpY2VzKCk7Ci0gICAgICAgIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIHNlcnZpY2VzSXRlciA9IGF4aXNTZXJ2aWNlcy5pdGVyYXRvcigpOyBzZXJ2aWNlc0l0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgYXhpc1NlcnZpY2UgPSAoQXhpc1NlcnZpY2Upc2VydmljZXNJdGVyLm5leHQoKTsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBheGlzU2VydmljZS5nZXRPcGVyYXRpb25zKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICBheGlzT3BlcmF0aW9uID0gKEF4aXNPcGVyYXRpb24paXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgIG9wTmFtZSA9IGF4aXNPcGVyYXRpb24uZ2V0TmFtZSgpOwotCi0gICAgICAgICAgICAgICAgcG9saWN5SW5jbHVkZSA9IGF4aXNPcGVyYXRpb24uZ2V0UG9saWN5SW5jbHVkZSgpOwotICAgICAgICAgICAgICAgIHBvbGljeSA9IHBvbGljeUluY2x1ZGUuZ2V0RWZmZWN0aXZlUG9saWN5KCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocG9saWN5ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc1BvbGljaWVzKGRvY3VtZW50LCByb290RWxlbWVudCwgcG9saWN5LCBvcE5hbWUsIG5hbWVzcGFjZTJFeHRNYXApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIFRPRE86IHRoaW5rIGFib3V0IHRoaXMgaG93IGNhbiB3ZSBzdXBwb3J0IHRoaXMKLSAgICAgICAgY29uZmlndXJhdGlvbi5wdXRQcm9wZXJ0eSgibW9kdWxlLWNvZGVnZW4tcG9saWN5LWV4dGVuc2lvbnMiLCByb290RWxlbWVudCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJvY2VzcyBwb2xpY2llcwotICAgICAqCi0gICAgICogQHBhcmFtIGRvY3VtZW50Ci0gICAgICogQHBhcmFtIHJvb3RFbGVtZW50Ci0gICAgICogQHBhcmFtIHBvbGljeQotICAgICAqIEBwYXJhbSBvcE5hbWUKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc1BvbGljaWVzKERvY3VtZW50IGRvY3VtZW50LCBFbGVtZW50IHJvb3RFbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9saWN5IHBvbGljeSwgUU5hbWUgb3BOYW1lLCBNYXAgbnMyRXh0cykgewotCi0gICAgICAgIEhhc2hNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLQotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gcG9saWN5LmdldEFsdGVybmF0aXZlcygpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0KLSAgICAgICAgICAgIFN0cmluZyB0YXJnZXROYW1lc2FwY2UgPSBudWxsOwotICAgICAgICAgICAgQXNzZXJ0aW9uIGFzc2VydGlvbjsKLSAgICAgICAgICAgIExpc3QgYXNzZXJ0aW9uTGlzdDsKLQotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBhc3NlcnRpb25zID0gKChMaXN0KWl0ZXJhdG9yLm5leHQoKSkuaXRlcmF0b3IoKTsgYXNzZXJ0aW9ucy5oYXNOZXh0KCk7KSB7Ci0KLSAgICAgICAgICAgICAgICBhc3NlcnRpb24gPSAoQXNzZXJ0aW9uKWFzc2VydGlvbnMubmV4dCgpOwotICAgICAgICAgICAgICAgIHRhcmdldE5hbWVzYXBjZSA9IGFzc2VydGlvbi5nZXROYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoKGFzc2VydGlvbkxpc3QgPSAoTGlzdCltYXAuZ2V0KHRhcmdldE5hbWVzYXBjZSkpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0aW9uTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICAgICAgbWFwLnB1dCh0YXJnZXROYW1lc2FwY2UsIGFzc2VydGlvbkxpc3QpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGFzc2VydGlvbkxpc3QuYWRkKGFzc2VydGlvbnMpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBoZXJlIHdlIHBpY2sgdGhlIGZpcnN0IHBvbGljeSBhbHRlcm5hdGl2ZSBhbmQgaWdub3IgdGhlIHJlc3QKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IG1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0gKFN0cmluZylpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICBQb2xpY3lFeHRlbnNpb24gcG9saWN5RXh0ZW5zaW9uID0gKFBvbGljeUV4dGVuc2lvbiluczJFeHRzLmdldCh0YXJnZXROYW1lc3BhY2UpOwotCi0gICAgICAgICAgICBpZiAocG9saWN5RXh0ZW5zaW9uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBsb2cud2FybigiY2Fubm90IGZpbmQgYSBQb2xpY3lFeHRlbnNpb24gdG8gcHJvY2VzcyAiICsgdGFyZ2V0TmFtZXNwYWNlICsgInR5cGUgYXNzZXJ0aW9ucyIpOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwb2xpY3lFeHRlbnNpb24uaW5pdChjb25maWd1cmF0aW9uKTsKLSAgICAgICAgICAgIHBvbGljeUV4dGVuc2lvbi5hZGRNZXRob2RzVG9TdHViKGRvY3VtZW50LCByb290RWxlbWVudCwgb3BOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExpc3QpbWFwLmdldCh0YXJnZXROYW1lc3BhY2UpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgRG9jdW1lbnQgZ2V0RW1wdHlEb2N1bWVudCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIERvY3VtZW50QnVpbGRlciBkb2N1bWVudEJ1aWxkZXIgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Ci0gICAgICAgICAgICAgICAgICAgIC5uZXdJbnN0YW5jZSgpLm5ld0RvY3VtZW50QnVpbGRlcigpOwotCi0gICAgICAgICAgICByZXR1cm4gZG9jdW1lbnRCdWlsZGVyLm5ld0RvY3VtZW50KCk7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBjbGFzcyBNVE9NUG9saWN5RXh0ZW5zaW9uIGltcGxlbWVudHMgUG9saWN5RXh0ZW5zaW9uIHsKLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gc2V0T25jZSA9IGZhbHNlOwotICAgICAgICBwcml2YXRlIENvZGVHZW5Db25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb247Ci0KLSAgICAgICAgcHVibGljIHZvaWQgaW5pdChDb2RlR2VuQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBNVE9NUG9saWN5RXh0ZW5zaW9uKENvZGVHZW5Db25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHsKLSAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb247Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBhZGRNZXRob2RzVG9TdHViKERvY3VtZW50IGRvY3VtZW50LCBFbGVtZW50IGVsZW1lbnQsIFFOYW1lIG9wZXJhdGlvbk5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdCBhc3NlcnRpb25zKSB7Ci0KLSAgICAgICAgICAgIC8vIEZJWE1FCi0KLS8vICAgICAgICAgICAgaWYgKCFzZXRPbmNlKSB7Ci0vLyAgICAgICAgICAgICAgICAgT2JqZWN0IHBsYWluQmFzZTY0UHJvcGVydHlNYXAgPSBjb25maWd1cmF0aW9uLmdldFByb3BlcnR5KENvbnN0YW50cy5QTEFJTl9CQVNFXzY0X1BST1BFUlRZX0tFWSk7Ci0vLyAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbi5wdXRQcm9wZXJ0eShDb25zdGFudHMuQkFTRV82NF9QUk9QRVJUWV9LRVksIHBsYWluQmFzZTY0UHJvcGVydHlNYXApOwotLy8KLS8vICAgICAgICAgICAgICAgICBzZXRPbmNlID0gdHJ1ZTsKLS8vICAgICAgICAgICAgfQotLy8KLS8vICAgICAgICAgICAgRWxlbWVudCBvcHRpbWl6ZUNvbnRlbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJvcHRpbWl6ZUNvbnRlbnQiKTsKLS8vICAgICAgICAgICAgRWxlbWVudCBvcE5hbWVFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgib3BOYW1lIik7Ci0vLwotLy8gICAgICAgICAgICBvcE5hbWVFbGVtZW50LnNldEF0dHJpYnV0ZSgibnMtdXJsIiwgb3BlcmF0aW9uTmFtZS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0vLyAgICAgICAgICAgIG9wTmFtZUVsZW1lbnQuc2V0QXR0cmlidXRlKCJsb2NhbE5hbWUiLCBvcGVyYXRpb25OYW1lLmdldExvY2FsUGFydCgpKTsKLS8vCi0vLyAgICAgICAgICAgIG9wdGltaXplQ29udGVudC5hcHBlbmRDaGlsZChvcE5hbWVFbGVtZW50KTsKLS8vCi0vLyAgICAgICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQob3B0aW1pemVDb250ZW50KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGNsYXNzIEVuY29kZVBvbGljeUV4dGVuc2lvbiBpbXBsZW1lbnRzIFBvbGljeUV4dGVuc2lvbiB7Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgdm9pZCBpbml0KENvZGVHZW5Db25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIHZvaWQgYWRkTWV0aG9kc1RvU3R1YihEb2N1bWVudCBkb2N1bWVudCwgRWxlbWVudCBlbGVtZW50LCBRTmFtZSBvcGVyYXRpb25OYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3QgYXNzZXJ0aW9ucykgewotICAgICAgICAgICAgLy8gVE9ETyBpbXBsZW1lbnQgZW5jb2RpbmcKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL2V4dGVuc2lvbi9Qb2xpY3lFeHRlbnNpb24uamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL2V4dGVuc2lvbi9Qb2xpY3lFeHRlbnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjhkMzVjYy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi9leHRlbnNpb24vUG9saWN5RXh0ZW5zaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLmV4dGVuc2lvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLkNvZGVHZW5Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1wdWJsaWMgaW50ZXJmYWNlIFBvbGljeUV4dGVuc2lvbiB7Ci0gICAgCi0gICAgcHVibGljIHZvaWQgaW5pdChDb2RlR2VuQ29uZmlndXJhdGlvbiBjb2RlR2VuQ29uZmlndXJhdGlvbik7Ci0gICAgCi0gICAgcHVibGljIHZvaWQgYWRkTWV0aG9kc1RvU3R1YihEb2N1bWVudCBkb2N1bWVudCwgRWxlbWVudCBlbGVtZW50LCBRTmFtZSBtZXRob2ROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdCBhc3NlcnRpb25zKTsKLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vZXh0ZW5zaW9uL1NjaGVtYVVud3JhcHBlckV4dGVuc2lvbi5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vZXh0ZW5zaW9uL1NjaGVtYVVud3JhcHBlckV4dGVuc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDQ5YmE2Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL2V4dGVuc2lvbi9TY2hlbWFVbndyYXBwZXJFeHRlbnNpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLmV4dGVuc2lvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc01lc3NhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5QYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLldTRExVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLkNvZGVHZW5Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLkNvZGVHZW5lcmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5pMThuLkNvZGVnZW5NZXNzYWdlczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwudXRpbC5Db25maWdQcm9wZXJ0eUZpbGVMb2FkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLnV0aWwuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC51dGlsLk1lc3NhZ2VQYXJ0SW5mb3JtYXRpb25Ib2xkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWE7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFBbGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFBbnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFDaG9pY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFDb21wbGV4Q29udGVudDsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYUNvbXBsZXhDb250ZW50RXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hQ29tcGxleFR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFDb250ZW50OwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hQ29udGVudE1vZGVsOwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYUltcG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYUluY2x1ZGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFPYmplY3RDb2xsZWN0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hUGFydGljbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFTZXF1ZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYVNpbXBsZVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFUeXBlOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBUaGlzIGV4dGVuc2lvbiBpbnZva2VzIHRoZSBzY2hlbWEgdW53cmFwcGVyIGRlcGVuZGluZyBvbiB0aGUgdXNlcnMgc2V0dGluZy4gaXQgaXMgZGVzaXJhYmxlIHRvCi0gKiBwdXQgdGhpcyBleHRlbnNpb24gYmVmb3JlIG90aGVyIGV4dGVuc2lvbnMgc2luY2UgZXh0bnNpb25zIHN1Y2ggYXMgdGhlIGRhdGFiaW5kaW5nIGV4dGVuc2lvbiBtYXkKLSAqIHdlbGwgZGVwZW5kIG9uIHRoZSBzY2hlbWEgYmVpbmcgdW53cmFwcGVkIHByZXZpb3VzbHkuIEZvciBhIGNvbXBsZXRlIHVud3JhcCB0aGUgZm9sbG93aW5nIGZvcm1hdAotICogb2YgdGhlIHNjaGVtYSBpcyBleHBlY3RlZCAmbHQ7IGVsZW1lbnQgJmd0OyAmbHQ7IGNvbXBsZXhUeXBlICZndDsgJmx0OyBzZXF1ZW5jZSAmZ3Q7ICZsdDsgZWxlbWVudAotICogLyZndDsgJmx0OyAvc2VxdWVuY2UgJmd0OyAmbHQ7IC9jb21wbGV4VHlwZSAmZ3Q7ICZsdDsgL2VsZW1lbnQgJmd0OwotICogPHAvPgotICogV2hlbiBhbiB1bndyYXBwZWQgV1NETCBpcyBlbmNvdW50ZXJlZCBBeGlzMiBnZW5lcmF0ZXMgYSB3cmFwcGVyIHNjaGVtYSBhbmQgdGhhdCB3cmFwcGVyIHNjaGVtYQotICogaGFzIHRoZSBhYm92ZSBtZW50aW9uZWQgZm9ybWF0LiBUaGlzIHVud3JhcHBpbmcgYWxnb3JpdGhtIHdpbGwgd29yayBvbiBhIHB1cmUgZG9jL2xpdCBXU0RMIGlmIGl0Ci0gKiBoYXMgdGhlIGFib3ZlIG1lbnRpb25lZCBmb3JtYXQgb25seQotICovCi1wdWJsaWMgY2xhc3MgU2NoZW1hVW53cmFwcGVyRXh0ZW5zaW9uIGV4dGVuZHMgQWJzdHJhY3RDb2RlR2VuZXJhdGlvbkV4dGVuc2lvbiB7Ci0KLSAgICBwcml2YXRlIENvZGVHZW5Db25maWd1cmF0aW9uIGNvZGVHZW5Db25maWd1cmF0aW9uOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGNvbmZpZ3VyYXRpb24KLSAgICAgKiBAdGhyb3dzIENvZGVHZW5lcmF0aW9uRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZW5nYWdlKENvZGVHZW5Db25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHRocm93cyBDb2RlR2VuZXJhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMuY29kZUdlbkNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uOwotCi0gICAgICAgIGlmICghY29uZmlndXJhdGlvbi5pc1BhcmFtZXRlcnNXcmFwcGVkKCkgJiYgIWNvZGVHZW5Db25maWd1cmF0aW9uLmdldE91dHB1dExhbmd1YWdlKCkuZXF1YWxzKCJqYXgtd3MiKSkgewotCi0gICAgICAgICAgICAvLyBBIGNoZWNrIHRvIGF2b2lkIG5hc3R5IHN1cnByaXNlcyAtIFNpbmNlIHVud3JhcHBpbmcgaXMgbm90Ci0gICAgICAgICAgICAvLyBzdXBwb3J0ZWQgYnkgYWxsIGZyYW1ld29ya3MsIHdlIGNoZWNrIHRoZSBmcmFtZXdvcmsgbmFtZSB0byBiZQotICAgICAgICAgICAgLy8gY29tcGF0aWJsZQotICAgICAgICAgICAgaWYgKCFDb25maWdQcm9wZXJ0eUZpbGVMb2FkZXIuZ2V0VW53cmFwU3VwcG9ydGVkRnJhbWV3b3JrTmFtZXMoKS4KLSAgICAgICAgICAgICAgICAgICAgY29udGFpbnMoY29uZmlndXJhdGlvbi5nZXREYXRhYmluZGluZ1R5cGUoKSkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29kZUdlbmVyYXRpb25FeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICBDb2RlZ2VuTWVzc2FnZXMuZ2V0TWVzc2FnZSgiZXh0ZW5zaW9uLnVuc3VwcG9ydGVkZm9ydW53cmFwcGluZyIpKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIUNvbmZpZ1Byb3BlcnR5RmlsZUxvYWRlci5nZXRVbndyYXBEaXJlY3RGcmFtZXdvcmtOYW1lcygpLgotICAgICAgICAgICAgICAgICAgICBjb250YWlucyhjb25maWd1cmF0aW9uLmdldERhdGFiaW5kaW5nVHlwZSgpKSkgewotCi0gICAgICAgICAgICAgICAgLy93YWxrIHRoZSBzY2hlbWEgYW5kIGZpbmQgdGhlIHRvcCBsZXZlbCBlbGVtZW50cwotICAgICAgICAgICAgICAgIExpc3Qgc2VydmljZXMgPSBjb25maWd1cmF0aW9uLmdldEF4aXNTZXJ2aWNlcygpOwotICAgICAgICAgICAgICAgIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlOwotCi0gICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBzZXJ2aWNlc0l0ZXIgPSBzZXJ2aWNlcy5pdGVyYXRvcigpOyBzZXJ2aWNlc0l0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgICAgICBheGlzU2VydmljZSA9IChBeGlzU2VydmljZSkgc2VydmljZXNJdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBvcGVyYXRpb25zID0gYXhpc1NlcnZpY2UuZ2V0T3BlcmF0aW9ucygpOwotICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbnMuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgICAgICAgICAgQXhpc09wZXJhdGlvbiBvcCA9IChBeGlzT3BlcmF0aW9uKSBvcGVyYXRpb25zLm5leHQoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFdTRExVdGlsLmlzSW5wdXRQcmVzZW50Rm9yTUVQKG9wLmdldE1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4oKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWxrU2NoZW1hKG9wLmdldE1lc3NhZ2UoV1NETENvbnN0YW50cy5NRVNTQUdFX0xBQkVMX0lOX1ZBTFVFKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdTRExDb25zdGFudHMuSU5QVVRfUEFSVF9RTkFNRV9TVUZGSVgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBvdXQgcHV0IHBhcmFtZXRlciBkZXRhaWxzIGFzIHdlbGwgdG8gdW53cmFwIHRoZSByZXNwb25zZXMKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vVE9ETzogc3VwcG9ydCB4bWxiZWFucwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24uZ2V0RGF0YWJpbmRpbmdUeXBlKCkuZXF1YWxzKCJhZGIiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChXU0RMVXRpbC5pc091dHB1dFByZXNlbnRGb3JNRVAob3AuZ2V0TWVzc2FnZUV4Y2hhbmdlUGF0dGVybigpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWxrU2NoZW1hKG9wLmdldE1lc3NhZ2UoV1NETENvbnN0YW50cy5NRVNTQUdFX0xBQkVMX09VVF9WQUxVRSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NETENvbnN0YW50cy5PVVRQVVRfUEFSVF9RTkFNRV9TVUZGSVgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIHdhbGsgdGhlIGdpdmVuIHNjaGVtYSBlbGVtZW50IEZvciBhIHN1Y2Nlc3NmdWwgdW53cmFwcGluZyB0aGUgZWxlbWVudCBzaG91bGQgaGF2ZSB0aGUKLSAgICAgKiBmb2xsb3dpbmcgc3RydWN0dXJlICZsdDsgZWxlbWVudCAmZ3Q7ICZsdDsgY29tcGxleFR5cGUgJmd0OyAmbHQ7IHNlcXVlbmNlICZndDsgJmx0OyBlbGVtZW50Ci0gICAgICogLyZndDsgJmx0OyAvc2VxdWVuY2UgJmd0OyAmbHQ7IC9jb21wbGV4VHlwZSAmZ3Q7ICZsdDsgL2VsZW1lbnQgJmd0OwotICAgICAqLwotCi0gICAgcHVibGljIHZvaWQgd2Fsa1NjaGVtYShBeGlzTWVzc2FnZSBtZXNzYWdlLCBTdHJpbmcgcW5hbWVTdWZmaXgpCi0gICAgICAgICAgICB0aHJvd3MgQ29kZUdlbmVyYXRpb25FeGNlcHRpb24gewotICAgICAgICAvL25vdGhpbmcgdG8gdW53cmFwCi0gICAgICAgIGlmIChtZXNzYWdlLmdldFNjaGVtYUVsZW1lbnQoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotCi0gICAgICAgIExpc3QgcGFydE5hbWVMaXN0ID0gbmV3IExpbmtlZExpc3QoKTsKLQotICAgICAgICBYbWxTY2hlbWFFbGVtZW50IHNjaGVtYUVsZW1lbnQgPSBtZXNzYWdlLmdldFNjaGVtYUVsZW1lbnQoKTsKLSAgICAgICAgWG1sU2NoZW1hVHlwZSBzY2hlbWFUeXBlID0gc2NoZW1hRWxlbWVudC5nZXRTY2hlbWFUeXBlKCk7Ci0gICAgICAgIFFOYW1lIHNjaGVtYVR5cGVRbmFtZSA9IHNjaGVtYUVsZW1lbnQuZ2V0U2NoZW1hVHlwZU5hbWUoKTsKLSAgICAgICAgaWYgKHNjaGVtYVR5cGUgPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKHNjaGVtYVR5cGVRbmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gZmluZCB0aGUgc2NoZW1hIHR5cGUgZnJvbSBhbGwgdGhlIHNjaGVtYXMKLSAgICAgICAgICAgICAgICAvLyBub3cgd2UgbmVlZCB0byBnZXQgdGhlIHNjaGVtYSBvZiB0aGUgZXh0ZW5zaW9uIHR5cGUgZnJvbSB0aGUgcGFyZW50IHNjaGVtYS4gRm9yIHRoYXQgbGV0J3MgZmlyc3QgcmV0cmlldmUKLSAgICAgICAgICAgICAgICAvLyB0aGUgcGFyZW50IHNjaGVtYQotICAgICAgICAgICAgICAgIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlID0gbWVzc2FnZS5nZXRBeGlzT3BlcmF0aW9uKCkuZ2V0QXhpc1NlcnZpY2UoKTsKLSAgICAgICAgICAgICAgICBBcnJheUxpc3Qgc2NoZW1hc0xpc3QgPSBheGlzU2VydmljZS5nZXRTY2hlbWEoKTsKLQotICAgICAgICAgICAgICAgIFhtbFNjaGVtYSBzY2hlbWEgPSBudWxsOwotICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHNjaGVtYXNMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgICAgICBzY2hlbWEgPSAoWG1sU2NoZW1hKSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgc2NoZW1hVHlwZSA9IGdldFNjaGVtYVR5cGUoc2NoZW1hLCBzY2hlbWFUeXBlUW5hbWUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoc2NoZW1hVHlwZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzY2hlbWFUeXBlIGluc3RhbmNlb2YgWG1sU2NoZW1hQ29tcGxleFR5cGUpIHsKLSAgICAgICAgICAgIGhhbmRsZUFsbENhc2VzT2ZDb21wbGV4VHlwZXMoc2NoZW1hVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgcGFydE5hbWVMaXN0LAotICAgICAgICAgICAgICAgICAgICBxbmFtZVN1ZmZpeCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoKHNjaGVtYVR5cGUgaW5zdGFuY2VvZiBYbWxTY2hlbWFTaW1wbGVUeXBlKSB8fAotICAgICAgICAgICAgICAgKChzY2hlbWFUeXBlUW5hbWUgIT0gbnVsbCkgJiYgKHNjaGVtYVR5cGVRbmFtZS5lcXVhbHMobmV3IFFOYW1lKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIsICJhbnlUeXBlIikpKSkgKSB7Ci0gICAgICAgICAgICBRTmFtZSBvcE5hbWUgPSBtZXNzYWdlLmdldEF4aXNPcGVyYXRpb24oKS5nZXROYW1lKCk7Ci0gICAgICAgICAgICBwYXJ0TmFtZUxpc3QuYWRkKFdTRExVdGlsLmdldFBhcnRRTmFtZShvcE5hbWUuZ2V0TG9jYWxQYXJ0KCksCi0gICAgICAgICAgICAgICAgICAgIHFuYW1lU3VmZml4LAotICAgICAgICAgICAgICAgICAgICBzY2hlbWFFbGVtZW50LmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpKTsKLSAgICAgICAgfSBlbHNlIGlmIChzY2hlbWFUeXBlID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDb2RlR2VuZXJhdGlvbkV4Y2VwdGlvbigiQ2FuIG5vdCBkZXRlcm1pbmUgdGhlIHNjaGVtYSB0eXBlIGZvciB0aGUgIgotICAgICAgICAgICAgICAgICAgICArIHNjaGVtYUVsZW1lbnQuZ2V0TmFtZSgpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vd2UndmUgbm8gaWRlYSBob3cgdG8gdW53cmFwIGEgbm9uIGNvbXBsZXhUeXBlISEhISEhCi0gICAgICAgICAgICB0aHJvdyBuZXcgQ29kZUdlbmVyYXRpb25FeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIENvZGVnZW5NZXNzYWdlcy5nZXRNZXNzYWdlKCJleHRlbnNpb24udW5zdXBwb3J0ZWRTY2hlbWFGb3JtYXQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYVR5cGUuZ2V0TmFtZSgpLCAiY29tcGxleFR5cGUiKSk7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvL3NldCBpbiB0aGUgYXhpcyBtZXNzYWdlIHRoYXQgdGhlIHVud3JhcHBpbmcgd2FzIHN1Y2Nlc3MKLSAgICAgICAgICAgIG1lc3NhZ2UuYWRkUGFyYW1ldGVyKGdldFBhcmFtZXRlcigKLSAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLlVOV1JBUFBFRF9LRVksCi0gICAgICAgICAgICAgICAgICAgIEJvb2xlYW4uVFJVRSkpOwotCi0gICAgICAgICAgICAvLyBhdHRhY2ggdGhlIG9wTmFtZSBhbmQgdGhlIHBhcnRzIG5hbWUgbGlzdCBpbnRvIHRoZQotICAgICAgICAgICAgLy8gYXhpcyBtZXNzYWdlIGJ5IHVzaW5nIHRoZSBob2xkZXIKLSAgICAgICAgICAgIE1lc3NhZ2VQYXJ0SW5mb3JtYXRpb25Ib2xkZXIgaW5mb0hvbGRlciA9IG5ldyBNZXNzYWdlUGFydEluZm9ybWF0aW9uSG9sZGVyKCk7Ci0gICAgICAgICAgICBpbmZvSG9sZGVyLnNldE9wZXJhdGlvbk5hbWUobWVzc2FnZS5nZXRBeGlzT3BlcmF0aW9uKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIGluZm9Ib2xkZXIuc2V0UGFydHNMaXN0KHBhcnROYW1lTGlzdCk7Ci0KLSAgICAgICAgICAgIC8vYXR0YWNoIGl0IHRvIHRoZSBwYXJhbWV0ZXJzCi0gICAgICAgICAgICBtZXNzYWdlLmFkZFBhcmFtZXRlcigKLSAgICAgICAgICAgICAgICAgICAgZ2V0UGFyYW1ldGVyKENvbnN0YW50cy5VTldSQVBQRURfREVUQUlMUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvSG9sZGVyKSk7Ci0KLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGF4aXNGYXVsdCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENvZGVHZW5lcmF0aW9uRXhjZXB0aW9uKGF4aXNGYXVsdCk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBoYW5kbGVBbGxDYXNlc09mQ29tcGxleFR5cGVzKFhtbFNjaGVtYVR5cGUgc2NoZW1hVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBeGlzTWVzc2FnZSBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3QgcGFydE5hbWVMaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBxbmFtZVN1ZmZpeCkgdGhyb3dzIENvZGVHZW5lcmF0aW9uRXhjZXB0aW9uIHsKLQotICAgICAgICAvLyBpZiBhIGNvbXBsZXggdHlwZSBuYW1lIGV4aXRzIGZvciBhIGVsZW1lbnQgdGhlbgotICAgICAgICAvLyB3ZSBrZWVwIHRoYXQgY29tcGxleCB0eXBlIHRvIHN1cHBvcnQgdW53cmFwcGluZwotICAgICAgICBpZiAoc2NoZW1hVHlwZSBpbnN0YW5jZW9mIFhtbFNjaGVtYUNvbXBsZXhUeXBlKSB7Ci0gICAgICAgICAgICBYbWxTY2hlbWFDb21wbGV4VHlwZSBjbXBseFR5cGUgPSAoWG1sU2NoZW1hQ29tcGxleFR5cGUpIHNjaGVtYVR5cGU7Ci0gICAgICAgICAgICBpZiAoY21wbHhUeXBlLmdldENvbnRlbnRNb2RlbCgpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoY21wbHhUeXBlLmdldFBhcnRpY2xlKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcm9jZXNzWE1MU2NoZW1hU2VxdWVuY2UoY21wbHhUeXBlLmdldFBhcnRpY2xlKCksIG1lc3NhZ2UsIHBhcnROYW1lTGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBxbmFtZVN1ZmZpeCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBub3cgbGV0cyBoYW5kbGUgY2FzZSB3aXRoIGV4dGVuc2lvbnMKLSAgICAgICAgICAgICAgICBwcm9jZXNzQ29tcGxleENvbnRlbnRNb2RlbChjbXBseFR5cGUsIG1lc3NhZ2UsIHBhcnROYW1lTGlzdCwgcW5hbWVTdWZmaXgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gaGFuZGxlIGF0dHJpYnV0ZXMgaGVyZQotICAgICAgICAgICAgcHJvY2Vzc0F0dHJpYnV0ZXMoY21wbHhUeXBlLCBtZXNzYWdlLCBwYXJ0TmFtZUxpc3QsIHFuYW1lU3VmZml4KTsKLQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NBdHRyaWJ1dGVzKFhtbFNjaGVtYUNvbXBsZXhUeXBlIGNvbXBsZXhUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBeGlzTWVzc2FnZSBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0IHBhcnROYW1lTGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHFuYW1lU3VmZml4KSB7Ci0gICAgICAgIFFOYW1lIG9wTmFtZSA9IG1lc3NhZ2UuZ2V0QXhpc09wZXJhdGlvbigpLmdldE5hbWUoKTsKLSAgICAgICAgWG1sU2NoZW1hT2JqZWN0Q29sbGVjdGlvbiB4bWxPYmplY3RDb2xsZWN0aW9uID0gY29tcGxleFR5cGUuZ2V0QXR0cmlidXRlcygpOwotICAgICAgICBYbWxTY2hlbWFPYmplY3QgaXRlbTsKLSAgICAgICAgWG1sU2NoZW1hQXR0cmlidXRlIHhtbFNjaGVtYUF0dHJpYnV0ZTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0geG1sT2JqZWN0Q29sbGVjdGlvbi5nZXRJdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIGl0ZW0gPSAoWG1sU2NoZW1hT2JqZWN0KSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIGlmIChpdGVtIGluc3RhbmNlb2YgWG1sU2NoZW1hQXR0cmlidXRlKSB7Ci0gICAgICAgICAgICAgICAgeG1sU2NoZW1hQXR0cmlidXRlID0gKFhtbFNjaGVtYUF0dHJpYnV0ZSkgaXRlbTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcGFydE5hbWUgPSB4bWxTY2hlbWFBdHRyaWJ1dGUuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgIHBhcnROYW1lTGlzdC5hZGQoCi0gICAgICAgICAgICAgICAgICAgICAgICBXU0RMVXRpbC5nZXRQYXJ0UU5hbWUob3BOYW1lLmdldExvY2FsUGFydCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxbmFtZVN1ZmZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydE5hbWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NDb21wbGV4Q29udGVudE1vZGVsKFhtbFNjaGVtYUNvbXBsZXhUeXBlIGNtcGx4VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXhpc01lc3NhZ2UgbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdCBwYXJ0TmFtZUxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBxbmFtZVN1ZmZpeCkgdGhyb3dzIENvZGVHZW5lcmF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgWG1sU2NoZW1hQ29udGVudE1vZGVsIGNvbnRlbnRNb2RlbCA9IGNtcGx4VHlwZS5nZXRDb250ZW50TW9kZWwoKTsKLSAgICAgICAgaWYgKGNvbnRlbnRNb2RlbCBpbnN0YW5jZW9mIFhtbFNjaGVtYUNvbXBsZXhDb250ZW50KSB7Ci0gICAgICAgICAgICBYbWxTY2hlbWFDb21wbGV4Q29udGVudCB4bWxTY2hlbWFDb21wbGV4Q29udGVudCA9IChYbWxTY2hlbWFDb21wbGV4Q29udGVudCkgY29udGVudE1vZGVsOwotICAgICAgICAgICAgWG1sU2NoZW1hQ29udGVudCBjb250ZW50ID0geG1sU2NoZW1hQ29tcGxleENvbnRlbnQuZ2V0Q29udGVudCgpOwotICAgICAgICAgICAgaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBYbWxTY2hlbWFDb21wbGV4Q29udGVudEV4dGVuc2lvbikgewotICAgICAgICAgICAgICAgIFhtbFNjaGVtYUNvbXBsZXhDb250ZW50RXh0ZW5zaW9uIHNjaGVtYUV4dGVuc2lvbiA9IChYbWxTY2hlbWFDb21wbGV4Q29udGVudEV4dGVuc2lvbikgY29udGVudDsKLQotICAgICAgICAgICAgICAgIC8vIHByb2Nlc3MgcGFydGljbGVzIGluc2lkZSB0aGlzIGV4dGVuc2lvbiwgaWYgYW55Ci0gICAgICAgICAgICAgICAgaWYgKHNjaGVtYUV4dGVuc2lvbi5nZXRQYXJ0aWNsZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc1hNTFNjaGVtYVNlcXVlbmNlKHNjaGVtYUV4dGVuc2lvbi5nZXRQYXJ0aWNsZSgpLCBtZXNzYWdlLCBwYXJ0TmFtZUxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcW5hbWVTdWZmaXgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIG5vdyB3ZSBuZWVkIHRvIGdldCB0aGUgc2NoZW1hIG9mIHRoZSBleHRlbnNpb24gdHlwZSBmcm9tIHRoZSBwYXJlbnQgc2NoZW1hLiBGb3IgdGhhdCBsZXQncyBmaXJzdCByZXRyaWV2ZQotICAgICAgICAgICAgICAgIC8vIHRoZSBwYXJlbnQgc2NoZW1hCi0gICAgICAgICAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UgPSBtZXNzYWdlLmdldEF4aXNPcGVyYXRpb24oKS5nZXRBeGlzU2VydmljZSgpOwotICAgICAgICAgICAgICAgIEFycmF5TGlzdCBzY2hlbWFzTGlzdCA9IGF4aXNTZXJ2aWNlLmdldFNjaGVtYSgpOwotCi0gICAgICAgICAgICAgICAgWG1sU2NoZW1hIHBhcmVudFNjaGVtYSA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICBYbWxTY2hlbWEgc2NoZW1hID0gbnVsbDsKLSAgICAgICAgICAgICAgICBYbWxTY2hlbWFUeXBlIGV4dGVuc2lvblNjaGVtYVR5cGUgPSBudWxsOwotICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHNjaGVtYXNMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgICAgICBzY2hlbWEgPSAoWG1sU2NoZW1hKSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uU2NoZW1hVHlwZSA9IGdldFNjaGVtYVR5cGUoc2NoZW1hLCBzY2hlbWFFeHRlbnNpb24uZ2V0QmFzZVR5cGVOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZXh0ZW5zaW9uU2NoZW1hVHlwZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIG9rIG5vdyB3ZSBnb3QgdGhlIHBhcmVudCBzY2hlbWEuIE5vdyBsZXQncyBnZXQgdGhlIGV4dGVuc2lvbidzIHNjaGVtYSB0eXBlCi0KLSAgICAgICAgICAgICAgICBoYW5kbGVBbGxDYXNlc09mQ29tcGxleFR5cGVzKGV4dGVuc2lvblNjaGVtYVR5cGUsIG1lc3NhZ2UsIHBhcnROYW1lTGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHFuYW1lU3VmZml4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgWG1sU2NoZW1hVHlwZSBnZXRTY2hlbWFUeXBlKFhtbFNjaGVtYSBzY2hlbWEsIFFOYW1lIHR5cGVOYW1lKSB7Ci0gICAgICAgIFhtbFNjaGVtYVR5cGUgeG1sU2NoZW1hVHlwZSA9IG51bGw7Ci0gICAgICAgIGlmIChzY2hlbWEgIT0gbnVsbCkgewotICAgICAgICAgICAgeG1sU2NoZW1hVHlwZSA9IHNjaGVtYS5nZXRUeXBlQnlOYW1lKHR5cGVOYW1lKTsKLSAgICAgICAgICAgIGlmICh4bWxTY2hlbWFUeXBlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyB0cnkgdG8gZmluZCBpbiBhbiBpbXBvcnQgb3IgYW4gaW5jbHVkZQotICAgICAgICAgICAgICAgIFhtbFNjaGVtYU9iamVjdENvbGxlY3Rpb24gaW5jbHVkZXMgPSBzY2hlbWEuZ2V0SW5jbHVkZXMoKTsKLSAgICAgICAgICAgICAgICBpZiAoaW5jbHVkZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBJdGVyYXRvciBpbmNsdWRlc0l0ZXIgPSBpbmNsdWRlcy5nZXRJdGVyYXRvcigpOwotICAgICAgICAgICAgICAgICAgICBPYmplY3Qgb2JqZWN0ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGluY2x1ZGVzSXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdCA9IGluY2x1ZGVzSXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgWG1sU2NoZW1hSW1wb3J0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgWG1sU2NoZW1hIHNjaGVtYTEgPSAoKFhtbFNjaGVtYUltcG9ydCkgb2JqZWN0KS5nZXRTY2hlbWEoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxTY2hlbWFUeXBlID0gZ2V0U2NoZW1hVHlwZShzY2hlbWExLCB0eXBlTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgWG1sU2NoZW1hSW5jbHVkZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhtbFNjaGVtYSBzY2hlbWExID0gKChYbWxTY2hlbWFJbmNsdWRlKSBvYmplY3QpLmdldFNjaGVtYSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFNjaGVtYVR5cGUgPSBnZXRTY2hlbWFUeXBlKHNjaGVtYTEsIHR5cGVOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh4bWxTY2hlbWFUeXBlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4geG1sU2NoZW1hVHlwZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc1hNTFNjaGVtYVNlcXVlbmNlKFhtbFNjaGVtYVBhcnRpY2xlIHNjaGVtYVBhcnRpY2xlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXhpc01lc3NhZ2UgbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3QgcGFydE5hbWVMaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHFuYW1lU3VmZml4KSB0aHJvd3MgQ29kZUdlbmVyYXRpb25FeGNlcHRpb24gewotICAgICAgICBpZiAoc2NoZW1hUGFydGljbGUgaW5zdGFuY2VvZiBYbWxTY2hlbWFTZXF1ZW5jZSkgewotICAgICAgICAgICAgLy8gZ2V0IHRoZSBuYW1lIG9mIHRoZSBvcGVyYXRpb24gbmFtZSBhbmQgbmFtZXNwYWNlLAotICAgICAgICAgICAgLy8gcGFydCBuYW1lIGFuZCBoYW5nIHRoZW0gc29tZXdoZXJlID8gVGhlIGlkZWFsIHBsYWNlCi0gICAgICAgICAgICAvLyB3b3VsZCBiZSB0aGUgcHJvcGVydHkgYmFnIGluIHRoZSBjb2RlZ2VuIGNvbmZpZyEKLSAgICAgICAgICAgIFFOYW1lIG9wTmFtZSA9IG1lc3NhZ2UuZ2V0QXhpc09wZXJhdGlvbigpLmdldE5hbWUoKTsKLQotICAgICAgICAgICAgWG1sU2NoZW1hU2VxdWVuY2Ugc2VxdWVuY2UgPSAoWG1sU2NoZW1hU2VxdWVuY2UpIHNjaGVtYVBhcnRpY2xlOwotICAgICAgICAgICAgWG1sU2NoZW1hT2JqZWN0Q29sbGVjdGlvbiBpdGVtcyA9IHNlcXVlbmNlLmdldEl0ZW1zKCk7Ci0KLSAgICAgICAgICAgIC8vIGlmIHRoaXMgaXMgYW4gZW1wdHkgc2VxdWVuY2UsIHJldHVybgotICAgICAgICAgICAgaWYgKGl0ZW1zLmdldENvdW50KCkgPT0gMCkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGl0ZW1zLmdldEl0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIE9iamVjdCBpdGVtID0gaS5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgLy8gZ2V0IGVhY2ggYW5kIGV2ZXJ5IGVsZW1lbnQgaW4gdGhlIHNlcXVlbmNlIGFuZAotICAgICAgICAgICAgICAgIC8vIHRyYXZlcnNlIHRocm91Z2ggdGhlbQotICAgICAgICAgICAgICAgIGlmIChpdGVtIGluc3RhbmNlb2YgWG1sU2NoZW1hRWxlbWVudCkgewotICAgICAgICAgICAgICAgICAgICAvL2FkZCB0aGUgZWxlbWVudCBuYW1lIHRvIHRoZSBwYXJ0IG5hbWUgbGlzdAotICAgICAgICAgICAgICAgICAgICBYbWxTY2hlbWFFbGVtZW50IHhtbFNjaGVtYUVsZW1lbnQgPSAoWG1sU2NoZW1hRWxlbWVudCkgaXRlbTsKLSAgICAgICAgICAgICAgICAgICAgWG1sU2NoZW1hVHlwZSBzY2hlbWFUeXBlID0geG1sU2NoZW1hRWxlbWVudC5nZXRTY2hlbWFUeXBlKCk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXJ0TmFtZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh4bWxTY2hlbWFFbGVtZW50LmdldFJlZk5hbWUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYXJ0TmFtZSA9IHhtbFNjaGVtYUVsZW1lbnQuZ2V0UmVmTmFtZSgpLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgcGFydE5hbWUgPSB4bWxTY2hlbWFFbGVtZW50LmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8vICBwYXJ0IG5hbWVzIGFyZSBub3QgdW5pcXVlIGFjcm9zcyBtZXNzYWdlcy4gSGVuY2UKLSAgICAgICAgICAgICAgICAgICAgLy8gIHdlIG5lZWQgc29tZSB3YXkgb2YgbWFraW5nIHRoZSBwYXJ0IG5hbWUgYSB1bmlxdWUKLSAgICAgICAgICAgICAgICAgICAgLy8gIG9uZSAoZHVlIHRvIHRoZSBmYWN0IHRoYXQgdGhlIHR5cGUgbWFwcGVyCi0gICAgICAgICAgICAgICAgICAgIC8vICBpcyBhIGdsb2JhbCBsaXN0IG9mIHR5cGVzKS4KLSAgICAgICAgICAgICAgICAgICAgLy8gIFRoZSBzZWVtaW5nbHkgYmVzdCB3YXkgdG8gZG8gdGhhdCBpcyB0bwotICAgICAgICAgICAgICAgICAgICAvLyAgc3BlY2lmeSBhIG5hbWVzcGFjZSBmb3IgdGhlIHBhcnQgUU5hbWUgcmVmZXJlbmNlIHdoaWNoCi0gICAgICAgICAgICAgICAgICAgIC8vICBpcyBzdG9yZWQgaW4gdGhlICBsaXN0LiBUaGlzIHBhcnQgcW5hbWUgaXMKLSAgICAgICAgICAgICAgICAgICAgLy8gIHRlbXBvcmFyeSBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIHdpdGggaXQncwotICAgICAgICAgICAgICAgICAgICAvLyAgbmFtZXNwYWNlIFVSSSAod2hpY2ggaGFwcGVuZWQgdG8gYmUgdGhlIG9wZXJhdGlvbiBuYW1lKQotICAgICAgICAgICAgICAgICAgICAvLyAgd2l0aCBfaW5wdXQgYXR0YWNoZWQgdG8gaXQKLQotCi0gICAgICAgICAgICAgICAgICAgIHBhcnROYW1lTGlzdC5hZGQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NETFV0aWwuZ2V0UGFydFFOYW1lKG9wTmFtZS5nZXRMb2NhbFBhcnQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFuYW1lU3VmZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydE5hbWUpKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgcGFydGljbGUgY29udGFpbnMgYW55dGhpbmcgb3RoZXIgdGhhbgotICAgICAgICAgICAgICAgICAgICAvLyBhIFhNTFNjaGVtYUVsZW1lbnQgdGhlbiB3ZSBhcmUgbm90IGluIGEgcG9zaXRpb24KLSAgICAgICAgICAgICAgICAgICAgLy8gdG8gdW53cmFwIGl0Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgWG1sU2NoZW1hQW55KSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhpcyBpcyBhbiBpbnN0YW5jZSBvZiB4czphbnksIHRoZW4gdGhlcmUgaXMgbm8gcGFydCBuYW1lIGZvciBpdC4gVXNpbmcgQU5ZX0VMRU1FTlRfRklFTERfTkFNRQotICAgICAgICAgICAgICAgICAgICAvLyBmb3IgaXQgZm9yIG5vdwotCi0gICAgICAgICAgICAgICAgICAgIC8vd2UgaGF2ZSB0byBoYW5kbGUgYm90aCBtYXhvY2N1cnMgMSBhbmQgbWF4b2NjdXJzID4gMSBzaXR1YXRpb24KLSAgICAgICAgICAgICAgICAgICAgWG1sU2NoZW1hQW55IHhtbFNjaGVtYUFueSA9IChYbWxTY2hlbWFBbnkpIGl0ZW07Ci0KLSAgICAgICAgICAgICAgICAgICAgcGFydE5hbWVMaXN0LmFkZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU0RMVXRpbC5nZXRQYXJ0UU5hbWUob3BOYW1lLmdldExvY2FsUGFydCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcW5hbWVTdWZmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuQU5ZX0VMRU1FTlRfRklFTERfTkFNRSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb2RlR2VuZXJhdGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlZ2VuTWVzc2FnZXMuZ2V0TWVzc2FnZSgiZXh0ZW5zaW9uLnVuc3VwcG9ydGVkU2NoZW1hRm9ybWF0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmtub3duIHR5cGUiLCAiRWxlbWVudCIpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vd2UgZG8gbm90IGtub3cgaG93IHRvIGRlYWwgd2l0aCBvdGhlciBwYXJ0aWNsZXMKLSAgICAgICAgICAgIC8vc3VjaCBhcyB4czphbGwgb3IgeHM6Y2hvaWNlLiBVc3VhbGx5IG9jY3VycyB3aGVuCi0gICAgICAgICAgICAvL3Bhc3NlZCB3aXRoIHRoZSB1c2VyIGJ1aWx0IFdTREwgd2hlcmUgdGhlIHN0eWxlCi0gICAgICAgICAgICAvL2lzIGRvY3VtZW50LgotICAgICAgICB9IGVsc2UgaWYgKHNjaGVtYVBhcnRpY2xlIGluc3RhbmNlb2YgWG1sU2NoZW1hQ2hvaWNlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ29kZUdlbmVyYXRpb25FeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIENvZGVnZW5NZXNzYWdlcy5nZXRNZXNzYWdlKCJleHRlbnNpb24udW5zdXBwb3J0ZWRTY2hlbWFGb3JtYXQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjaG9pY2UiLCAic2VxdWVuY2UiKSk7Ci0KLSAgICAgICAgfSBlbHNlIGlmIChzY2hlbWFQYXJ0aWNsZSBpbnN0YW5jZW9mIFhtbFNjaGVtYUFsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENvZGVHZW5lcmF0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICBDb2RlZ2VuTWVzc2FnZXMuZ2V0TWVzc2FnZSgiZXh0ZW5zaW9uLnVuc3VwcG9ydGVkU2NoZW1hRm9ybWF0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWxsIiwgInNlcXVlbmNlIikpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IENvZGVHZW5lcmF0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICBDb2RlZ2VuTWVzc2FnZXMuZ2V0TWVzc2FnZSgiZXh0ZW5zaW9uLnVuc3VwcG9ydGVkU2NoZW1hRm9ybWF0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5rbm93biIsICJzZXF1ZW5jZSIpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdlbmVyYXRlIGEgcGFyYW1ldGVzIG9iamVjdAotICAgICAqCi0gICAgICogQHBhcmFtIGtleQotICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqLwotICAgIHByaXZhdGUgUGFyYW1ldGVyIGdldFBhcmFtZXRlcihTdHJpbmcga2V5LCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgUGFyYW1ldGVyIG15UGFyYW1ldGVyID0gbmV3IFBhcmFtZXRlcigpOwotICAgICAgICBteVBhcmFtZXRlci5zZXROYW1lKGtleSk7Ci0gICAgICAgIG15UGFyYW1ldGVyLnNldFZhbHVlKHZhbHVlKTsKLSAgICAgICAgcmV0dXJuIG15UGFyYW1ldGVyOwotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi9leHRlbnNpb24vU2ltcGxlREJFeHRlbnNpb24uamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL2V4dGVuc2lvbi9TaW1wbGVEQkV4dGVuc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NGM5M2JkLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL2V4dGVuc2lvbi9TaW1wbGVEQkV4dGVuc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5leHRlbnNpb247Ci0KLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLkNvZGVHZW5Db25maWd1cmF0aW9uOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotCi0vKiogRXh0ZW5zaW9uIGZvciBzaW1wbGUgZGF0YSBiaW5kaW5nLiAqLwotcHVibGljIGNsYXNzIFNpbXBsZURCRXh0ZW5zaW9uIGV4dGVuZHMgQWJzdHJhY3REQlByb2Nlc3NpbmdFeHRlbnNpb24gewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFEQl9JTlZPS0VfQ0xBU1NfTkFNRSA9Ci0gICAgICAgICAgICAib3JnLmFwYWNoZS5heGlzMi5zY2hlbWEuRXh0ZW5zaW9uVXRpbGl0eSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOVk9LRV9NRVRIT0RfTkFNRSA9Ci0gICAgICAgICAgICAiaW52b2tlIjsKLQotICAgIC8qKgotICAgICAqIAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGVuZ2FnZShDb2RlR2VuQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB7Ci0gICAgICAgIC8vdGVzdCB0aGUgZGF0YWJpbmRpbmcgdHlwZS4gSWYgbm90IGp1c3QgZmFsbCB0aHJvdWdoCi0gICAgICAgIGlmICh0ZXN0RmFsbFRocm91Z2goY29uZmlndXJhdGlvbi5nZXREYXRhYmluZGluZ1R5cGUoKSkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy9pbnZva2UgdGhlIGFkYiBjb2RlZ2VuIGJ5IHJlZmxlY3Rpb24KLSAgICAgICAgICAgIENsYXNzIGFkYkdlbmVyYXRvckNsYXNzID0gQ2xhc3MuCi0gICAgICAgICAgICAgICAgICAgIGZvck5hbWUoQURCX0lOVk9LRV9DTEFTU19OQU1FKTsKLSAgICAgICAgICAgIE1ldGhvZCBpbnZva2VNZXRob2QgPSBhZGJHZW5lcmF0b3JDbGFzcy5nZXRNZXRob2QoCi0gICAgICAgICAgICAgICAgICAgIElOVk9LRV9NRVRIT0RfTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzW10geyBDb2RlR2VuQ29uZmlndXJhdGlvbi5jbGFzcyB9KTsKLSAgICAgICAgICAgIGludm9rZU1ldGhvZC5pbnZva2UobnVsbCwgbmV3IE9iamVjdFtdIHsgY29uZmlndXJhdGlvbiB9KTsKLQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vZXh0ZW5zaW9uL1R5cGVNYXBwZXJFeHRlbnNpb24uamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL2V4dGVuc2lvbi9UeXBlTWFwcGVyRXh0ZW5zaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzN2IxYmQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vZXh0ZW5zaW9uL1R5cGVNYXBwZXJFeHRlbnNpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLmV4dGVuc2lvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLkNvZGVHZW5Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLkNvZGVHZW5lcmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5kYXRhYmluZGluZy5EZWZhdWx0VHlwZU1hcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuZGF0YWJpbmRpbmcuVHlwZU1hcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuZGF0YWJpbmRpbmcuQ1R5cGVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLmkxOG4uQ29kZWdlbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7Ci0KLS8qKgotICogVGhlIHB1cnBvc2Ugb2YgdGhpcyBleHRlbnNpb24gaXMgdG8gcG9wdWxhdGUgdGhlIHR5cGUgbWFwcGVyIGZyb20gdGhlIHR5cGUgbWFwcGluZyBmaWxlLiBUaGUKLSAqIGZvcm1hdCBvZiB0aGUgdHlwZSBtYXBwaW5nIGZpbGUgaXMgYXMgZm9sbG93cyA8bWFwcGluZ3MgZGJmPSJhZGIiPiA8bWFwcGluZz4gPHFuYW1lCi0gKiBuYW1lc3BhY2U9Im5zIiBwcmVmaXg9InAxIj5sb2NhbE5hbWU8L3FuYW1lPiA8dmFsdWU+dHlwZTwvdmFsdWU+IDwvbWFwcGluZz4gPC9tYXBwaW5ncz4KLSAqIDxwLz4KLSAqIEluIGFueSBjYXNlIGl0IGlzIGJlc3QgdGhhdCB0aGUgdHlwZSBtYXBwZXIgZXh0ZW5zaW9uIGJlIGFmdGVyIGFsbCB0aGUgZGF0YWJpbmRpbmcgZXh0ZW5zaW9ucwotICovCi0KLXB1YmxpYyBjbGFzcyBUeXBlTWFwcGVyRXh0ZW5zaW9uIGltcGxlbWVudHMgQ29kZUdlbkV4dGVuc2lvbiB7Ci0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQSU5HX0VMRU1FTlRfTkFNRSA9ICJtYXBwaW5nIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRVNQQUNFX0FUVFJJQlVURV9OQU1FID0gIm5hbWVzcGFjZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFFOQU1FX0VMRU1FTlRfTkFNRSA9ICJxbmFtZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX0VMRU1FTlRfTkFNRSA9ICJ2YWx1ZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERCX0ZSQU1FV09SS19BVFRSSUJVVEVfTkFNRSA9ICJkYmYiOwotCi0KLSAgICAvKiogQHRocm93cyBDb2RlR2VuZXJhdGlvbkV4Y2VwdGlvbiAgKi8KLSAgICBwdWJsaWMgdm9pZCBlbmdhZ2UoQ29kZUdlbkNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgdGhyb3dzIENvZGVHZW5lcmF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24uZ2V0VHlwZU1hcHBpbmdGaWxlKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgLy9hIHR5cGUgbWFwcGluZyBpcyBwcmVzZW50LiB0cnkgYnVpbGRpbmcgdGhlCi0gICAgICAgICAgICAvL21hcHBpbmcgZnJvbSBpdAotCi0gICAgICAgICAgICAvLyBpZiB0aGUgY29uZmlndXJhdGlvbiBhbHJlYWR5IGhhcyBhIG1hcHBpbmcgdGhlbiB0YWtlIGl0Ci0gICAgICAgICAgICAvLyB0aGUgZXh0ZXJuYWwgbWFwcGluZ3Mgd2lsbCBvdmVycmlkZSB0aGUgY3VycmVudGx5IGF2YWlsYWJsZQotICAgICAgICAgICAgLy8gbWFwcGluZ3MKLSAgICAgICAgICAgIFR5cGVNYXBwZXIgbWFwcGVyID0gY29uZmlndXJhdGlvbi5nZXRUeXBlTWFwcGVyKCk7Ci0gICAgICAgICAgICAvLyB0aGVyZSBpcyBubyBtYXBwZXIgcHJlc2VudCAtIHNvIGp1c3QgY3JlYXRlIGEgbmV3IG9uZQotICAgICAgICAgICAgaWYgKG1hcHBlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24uZ2V0T3V0cHV0TGFuZ3VhZ2UoKSAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgICAgICFjb25maWd1cmF0aW9uLmdldE91dHB1dExhbmd1YWdlKCkudHJpbSgpLmVxdWFscygiIikgJiYKLSAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbi5nZXRPdXRwdXRMYW5ndWFnZSgpLnRvTG93ZXJDYXNlKCkuZXF1YWxzKCJjIikpIHsKLSAgICAgICAgICAgICAgICAgICAgbWFwcGVyID0gbmV3IENUeXBlTWFwcGVyKCk7Ci0gICAgCi0gICAgICAgICAgICAgICAgfSAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1hcHBlciA9IG5ldyBEZWZhdWx0VHlwZU1hcHBlcigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy9yZWFkIHRoZSBmaWxlIGFzIGEgRE9NCi0gICAgICAgICAgICBEb2N1bWVudCBtYXBwaW5nRG9jdW1lbnQgPSBidWlsZERvY3VtZW50KGNvbmZpZ3VyYXRpb24pOwotICAgICAgICAgICAgRWxlbWVudCByb290TWFwcGluZ3NFbGVtZW50ID0gbWFwcGluZ0RvY3VtZW50LmdldERvY3VtZW50RWxlbWVudCgpOwotCi0gICAgICAgICAgICAvL292ZXJyaWRlIHRoZSBkYXRhYmluZGluZyBmcmFtZXdvcmsgbmFtZS4gSWYgYSBtYXBwaW5nIGZpbGUgaXMKLSAgICAgICAgICAgIC8vcHJlc2VudCB0aGVuIHRoZSBkYXRhYmluZGluZyBmcmFtZXdvcmsgbmFtZSB3aWxsIGJlIG92ZXJyaWRkZW4KLSAgICAgICAgICAgIC8vaWYgcHJlc2VudC4gSWYgYSB1c2VyIHdhbnRzIHRvIG1peCB0eXBlcyB0aGVuIGl0IG11c3QgYmUKLSAgICAgICAgICAgIC8vZnJvbSB0aGUgc2FtZSBkYXRhYmluZGluZyBmcmFtZXdvcmshCi0KLSAgICAgICAgICAgIC8vZmlyc3QgZG8gYSBzYW5pdHkgY2hlY2sgdG8gc2VlIHdoZXRoZXIgdGhlIHVzZXIgaXMgdHJ5aW5nIHRvCi0gICAgICAgICAgICAvL21peCBkYXRhYmluZGluZyB0eXBlcyEKLQotICAgICAgICAgICAgU3RyaW5nIGRhdGFiaW5kaW5nTmFtZSA9IHJvb3RNYXBwaW5nc0VsZW1lbnQuCi0gICAgICAgICAgICAgICAgICAgIGdldEF0dHJpYnV0ZShEQl9GUkFNRVdPUktfQVRUUklCVVRFX05BTUUpOwotICAgICAgICAgICAgaWYgKCFkYXRhYmluZGluZ05hbWUuZXF1YWxzKGNvbmZpZ3VyYXRpb24uZ2V0RGF0YWJpbmRpbmdUeXBlKCkpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvZGVHZW5lcmF0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgQ29kZWdlbk1lc3NhZ2VzLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRNZXNzYWdlKCJleHRlbnNpb24uZGF0YWJpbmRpbmdNaXNtYXRjaCIpCi0gICAgICAgICAgICAgICAgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24uCi0gICAgICAgICAgICAgICAgICAgIHNldERhdGFiaW5kaW5nVHlwZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhYmluZGluZ05hbWUpOwotCi0KLSAgICAgICAgICAgIE5vZGVMaXN0IG1hcHBpbmdMaXN0ID0gcm9vdE1hcHBpbmdzRWxlbWVudC4KLSAgICAgICAgICAgICAgICAgICAgZ2V0RWxlbWVudHNCeVRhZ05hbWUoTUFQUElOR19FTEVNRU5UX05BTUUpOwotICAgICAgICAgICAgaW50IGxlbmd0aCA9IG1hcHBpbmdMaXN0LmdldExlbmd0aCgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIEVsZW1lbnQgbWFwcGluZ05vZGUgPSAoRWxlbWVudCltYXBwaW5nTGlzdC5pdGVtKGkpOwotICAgICAgICAgICAgICAgIC8vd2Uga25vdyB0aGlzIGlzIG9ubHkgb25lIC0gaWYgdGhlcmUgYXJlIG11bHRpcGxlIHRoZW4KLSAgICAgICAgICAgICAgICAvL2l0IGlzIGludmFsaWQKLSAgICAgICAgICAgICAgICBFbGVtZW50IHFOYW1lQ2hpbGQgPQotICAgICAgICAgICAgICAgICAgICAgICAgKEVsZW1lbnQpbWFwcGluZ05vZGUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEVsZW1lbnRzQnlUYWdOYW1lKFFOQU1FX0VMRU1FTlRfTkFNRSkuaXRlbSgwKTsKLSAgICAgICAgICAgICAgICBFbGVtZW50IHZhbHVlQ2hpbGQgPQotICAgICAgICAgICAgICAgICAgICAgICAgKEVsZW1lbnQpbWFwcGluZ05vZGUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEVsZW1lbnRzQnlUYWdOYW1lKFZBTFVFX0VMRU1FTlRfTkFNRSkuaXRlbSgwKTsKLSAgICAgICAgICAgICAgICAvL2dlbmVyYXRlIGEgUW5hbWUgYW5kIGFkZCB0byB0aGUgdHlwZSBtYXBwaW5nCi0gICAgICAgICAgICAgICAgbWFwcGVyLmFkZFR5cGVNYXBwaW5nTmFtZShuZXcgUU5hbWUoCi0gICAgICAgICAgICAgICAgICAgICAgICBxTmFtZUNoaWxkLmdldEF0dHJpYnV0ZShOQU1FU1BBQ0VfQVRUUklCVVRFX05BTUUpLAotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VGV4dEZyb21FbGVtZW50KHFOYW1lQ2hpbGQpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFRleHRGcm9tRWxlbWVudCh2YWx1ZUNoaWxkKSk7Ci0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy9zZXQgdGhlIHR5cGUgbWFwcGVyIHRvIHRoZSBjb25maWd1cnRpb24KLSAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24uc2V0VHlwZU1hcHBlcihtYXBwZXIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQnVpbGQgYSBkb20gZG9jdW1lbnQgZnJvbSB0aGUgbWFwcGluZyBmaWxlCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIENvZGVHZW5lcmF0aW9uRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSBEb2N1bWVudCBidWlsZERvY3VtZW50KENvZGVHZW5Db25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pCi0gICAgICAgICAgICB0aHJvd3MgQ29kZUdlbmVyYXRpb25FeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBkb2N1bWVudEJ1aWxkZXJGYWN0b3J5Ci0gICAgICAgICAgICAgICAgICAgID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgZG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKLSAgICAgICAgICAgIERvY3VtZW50QnVpbGRlciBkb2N1bWVudEJ1aWxkZXIgPQotICAgICAgICAgICAgICAgICAgICBkb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpOwotICAgICAgICAgICAgcmV0dXJuIGRvY3VtZW50QnVpbGRlci5wYXJzZShjb25maWd1cmF0aW9uLmdldFR5cGVNYXBwaW5nRmlsZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDb2RlR2VuZXJhdGlvbkV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHN0cmluZyBjb250ZW50IGZyb20gYW4gZWxlbWVudC4gcmV0dXJucyBudWxsIGlmIHRoZXJlIGFyZSBubyB0ZXN0IG5vZGVzIGZvdW5kCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZWx0Ci0gICAgICogQHJldHVybiB0ZXh0IGNvdGVudCBvZiB0aGUgZWxlbWVudAotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGdldFRleHRGcm9tRWxlbWVudChFbGVtZW50IGVsdCkgewotICAgICAgICBOb2RlTGlzdCBjaGlsZHJlbiA9IGVsdC5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgICAgIFN0cmluZyByZXR1cm5TdHJpbmcgPSBudWxsOwotICAgICAgICBpbnQgbGVuZ3RoID0gY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIE5vZGUgbm9kZSA9IGNoaWxkcmVuLml0ZW0oaSk7Ci0gICAgICAgICAgICBpZiAoTm9kZS5URVhUX05PREUgPT0gbm9kZS5nZXROb2RlVHlwZSgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuU3RyaW5nID0gKHJldHVyblN0cmluZyA9PSBudWxsID8gIiIgOiByZXR1cm5TdHJpbmcpICsgbm9kZS5nZXROb2RlVmFsdWUoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJldHVyblN0cmluZzsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi9leHRlbnNpb24vV1NETFByZXR0eVByaW50ZXJFeHRlbnNpb24uamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL2V4dGVuc2lvbi9XU0RMUHJldHR5UHJpbnRlckV4dGVuc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDc1ZDcwLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL2V4dGVuc2lvbi9XU0RMUHJldHR5UHJpbnRlckV4dGVuc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5leHRlbnNpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuWE1MUHJldHR5UHJpbnRlcjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotcHVibGljIGNsYXNzIFdTRExQcmV0dHlQcmludGVyRXh0ZW5zaW9uIGV4dGVuZHMgQWJzdHJhY3RQcmV0dHlQcmludGVyRXh0ZW5zaW9uIHsKLQotICAgIHB1YmxpYyBXU0RMUHJldHR5UHJpbnRlckV4dGVuc2lvbigpIHsKLSAgICAgICAgZmlsZUV4dGVuc2lvbiA9ICIud3NkbCI7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJldHRpZnlGaWxlKEZpbGUgZmlsZSkgewotICAgICAgICBYTUxQcmV0dHlQcmludGVyLnByZXR0aWZ5KGZpbGUpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL2V4dGVuc2lvbi9XU0RMVmFsaWRhdG9yRXh0ZW5zaW9uLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi9leHRlbnNpb24vV1NETFZhbGlkYXRvckV4dGVuc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwY2I1M2Y0Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL2V4dGVuc2lvbi9XU0RMVmFsaWRhdG9yRXh0ZW5zaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLmV4dGVuc2lvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLkNvZGVHZW5Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLkNvZGVHZW5lcmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5pMThuLkNvZGVnZW5NZXNzYWdlczsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1wdWJsaWMgY2xhc3MgV1NETFZhbGlkYXRvckV4dGVuc2lvbiBleHRlbmRzIEFic3RyYWN0Q29kZUdlbmVyYXRpb25FeHRlbnNpb24gewotCi0gICAgcHVibGljIHZvaWQgZW5nYWdlKENvZGVHZW5Db25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHRocm93cyBDb2RlR2VuZXJhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vV1NETERlc2NyaXB0aW9uIHdvbSA9IHRoaXMuY29uZmlndXJhdGlvbi5nZXRXb20oKTsKLSAgICAgICAgTGlzdCBzY2hlbWFMaXN0ID0gY29uZmlndXJhdGlvbi5nZXRTY2hlbWFMaXN0Rm9yQWxsU2VydmljZXMoKTsKLSAgICAgICAgaWYgKHNjaGVtYUxpc3QgPT0gbnVsbCB8fCBzY2hlbWFMaXN0LmlzRW1wdHkoKSkgewotICAgICAgICAgICAgLy90aGVyZSBhcmUgbm8gdHlwZXMgdG8gYmUgY29uc2lkZXJlZAotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzY2hlbWFMaXN0LnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBYbWxTY2hlbWEgcyA9IChYbWxTY2hlbWEpc2NoZW1hTGlzdC5nZXQoaSk7Ci0gICAgICAgICAgICBpZiAocy5nZXRJbmNsdWRlcygpLmdldENvdW50KCkgIT0gMCkgewotICAgICAgICAgICAgICAgIC8vdGhlcmUgYXJlIHNvbWUgaW5jbHVkZWQgLSBub3cgc2VlIHdoZXRoZXIgdGhlcmUgYXJlIGFueQotICAgICAgICAgICAgICAgIC8vZWxlbWVudHMgb3IgdHlwZXMgZGVjbGFyZWQhCi0gICAgICAgICAgICAgICAgaWYgKHMuZ2V0RWxlbWVudHMoKS5nZXRDb3VudCgpID09IDAgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIHMuZ2V0U2NoZW1hVHlwZXMoKS5nZXRDb3VudCgpID09IDAgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIHMuZ2V0R3JvdXBzKCkuZ2V0Q291bnQoKSA9PSAwICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBzLmdldFRhcmdldE5hbWVzcGFjZSgpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlcmUncyBubyB0YXJnZXROYW1lc3BhY2UgdGhlcmUncyBwcm9iYWJseSBubyBuYW1lLCBidXQgdHJ5IGl0IGFueXdheQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29kZUdlbmVyYXRpb25FeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZWdlbk1lc3NhZ2VzLmdldE1lc3NhZ2UoImV4dGVuc2lvbi5pbnZhbGlkV1NETCIsIHMudG9TdHJpbmcoKSkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL2V4dGVuc2lvbi9YTUxCZWFuc0V4dGVuc2lvbi5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vZXh0ZW5zaW9uL1hNTEJlYW5zRXh0ZW5zaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2N2E2ZjIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vZXh0ZW5zaW9uL1hNTEJlYW5zRXh0ZW5zaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5leHRlbnNpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5Db21tYW5kTGluZU9wdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5Db2RlR2VuQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5zY2hlbWEuQXhpc1NlcnZpY2VUb3BFbGVtZW50U2NoZW1hR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5kYXRhYmluZGluZy5UeXBlTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5pMThuLkNvZGVnZW5NZXNzYWdlczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwudXRpbC5Db25maWdQcm9wZXJ0eUZpbGVMb2FkZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLQotcHVibGljIGNsYXNzIFhNTEJlYW5zRXh0ZW5zaW9uIGV4dGVuZHMgQWJzdHJhY3REQlByb2Nlc3NpbmdFeHRlbnNpb24gewotICAgIC8qKiBOYW1lIG9mICJleHRyYSIgb3B0aW9uIHVzZWQgdG8gc3VwcGx5IHBhY2thZ2UgbmFtZSBmb3IgeHNiIGZpbGVzLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVTWVNURU1OQU1FX09QVElPTiA9ICJ0eXBlc3lzdGVtbmFtZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NIRU1BX0ZPTERFUiA9ICJzY2hlbWFzIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RDT05GSUdfT1BUSU9OID0gInhjIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RDT05GSUdfT1BUSU9OX0xPTkcgPSAieHNkY29uZmlnIjsKLQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgTUFQUElOR1MgPSAibWFwcGluZ3MiOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE1BUFBJTkcgPSAibWFwcGluZyI7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgTUVTU0FHRSA9ICJtZXNzYWdlIjsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBX05BTUUgPSAiamF2YWNsYXNzIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBJTkdfRk9MREVSID0gIk1hcHBpbmciOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBFUl9GSUxFX05BTUUgPSAibWFwcGVyIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQ0hFTUFfUEFUSCA9ICIvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vc2NoZW1hLyI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxCRUFOU19DT05GSUdfQ0xBU1MgPQotICAgICAgICAgICAgIm9yZy5hcGFjaGUueG1sYmVhbnMuQmluZGluZ0NvbmZpZyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MQkVBTlNfVVRJTElUWV9DTEFTUyA9Ci0gICAgICAgICAgICAib3JnLmFwYWNoZS5heGlzMi54bWxiZWFucy5Db2RlR2VuZXJhdGlvblV0aWxpdHkiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTEJFQU5TX1BST0NFU1NfTUVUSE9EID0gInByb2Nlc3NTY2hlbWFzIjsKLQotICAgIGJvb2xlYW4gZGVidWcgPSBmYWxzZTsKLQotICAgIHB1YmxpYyB2b2lkIGVuZ2FnZShDb2RlR2VuQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB7Ci0KLSAgICAgICAgLy90ZXN0IHRoZSBkYXRhYmluZGluZyB0eXBlLiBJZiBub3QganVzdCBmYWxsIHRocm91Z2gKLSAgICAgICAgaWYgKHRlc3RGYWxsVGhyb3VnaChjb25maWd1cmF0aW9uLmdldERhdGFiaW5kaW5nVHlwZSgpKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY2hlY2sgdGhlIEppQlggYmluZGluZyBkZWZpbml0aW9uIGZpbGUgc3BlY2lmaWVkCi0gICAgICAgIFN0cmluZyB0eXBlU3lzdGVtTmFtZSA9IChTdHJpbmcpY29uZmlndXJhdGlvbi5nZXRQcm9wZXJ0aWVzKCkuZ2V0KFRZUEVTWVNURU1OQU1FX09QVElPTik7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIHRyeSBkdW1teSBsb2FkIG9mIGZyYW1ld29yayBjbGFzcyBmaXJzdCB0byBjaGVjayBtaXNzaW5nIGphcnMKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpLmxvYWRDbGFzcyhYTUxCRUFOU19DT05GSUdfQ0xBU1MpOwotICAgICAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlhNTEJlYW5zIGZyYW1ld29yayBqYXJzIG5vdCBpbiBjbGFzc3BhdGgiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gbG9hZCB0aGUgYWN0dWFsIHV0aWxpdHkgY2xhc3MKLSAgICAgICAgICAgIENsYXNzIGNsYXp6ID0gbnVsbDsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgY2xhenogPSBnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkubG9hZENsYXNzKFhNTEJFQU5TX1VUSUxJVFlfQ0xBU1MpOwotICAgICAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlhNTEJlYW5zIGJpbmRpbmcgZXh0ZW5zaW9uIG5vdCBpbiBjbGFzc3BhdGgiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gaW52b2tlIHV0aWxpdHkgY2xhc3MgbWV0aG9kIGZvciBhY3R1YWwgcHJvY2Vzc2luZwotICAgICAgICAgICAgTWV0aG9kIG1ldGhvZCA9IGNsYXp6LmdldE1ldGhvZChYTUxCRUFOU19QUk9DRVNTX01FVEhPRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzW10geyBMaXN0LmNsYXNzLCBFbGVtZW50W10uY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZUdlbkNvbmZpZ3VyYXRpb24uY2xhc3MsIFN0cmluZy5jbGFzcyB9KTsKLSAgICAgICAgICAgIExpc3Qgc2NoZW1hcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgIExpc3QgYXhpc1NlcnZpY2VzID0gY29uZmlndXJhdGlvbi5nZXRBeGlzU2VydmljZXMoKTsKLSAgICAgICAgICAgIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlID0gbnVsbDsKLSAgICAgICAgICAgIEF4aXNTZXJ2aWNlVG9wRWxlbWVudFNjaGVtYUdlbmVyYXRvciBzY2hlbWFHZW5lcmF0b3IgPSBudWxsOwotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gYXhpc1NlcnZpY2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlID0gKEF4aXNTZXJ2aWNlKWl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uLmdldFByb3BlcnRpZXMoKS5jb250YWluc0tleSgKLSAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLkV4dGVuc2lvbkFyZ3VtZW50cy5XSVRIT1VUX0RBVEFCSU5EX0NPREUpKXsKLSAgICAgICAgICAgICAgICAgICAgLy8gdXNlIHRoZSBkdW1teSBjb2RlCi0gICAgICAgICAgICAgICAgICAgIHNjaGVtYUdlbmVyYXRvciA9IG5ldyBBeGlzU2VydmljZVRvcEVsZW1lbnRTY2hlbWFHZW5lcmF0b3IoYXhpc1NlcnZpY2UpOwotICAgICAgICAgICAgICAgICAgICBzY2hlbWFzLmFkZEFsbChzY2hlbWFHZW5lcmF0b3IuZ2V0RHVtbXlTY2hlbWFMaXN0KCkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHNjaGVtYXMuYWRkQWxsKGF4aXNTZXJ2aWNlLmdldFNjaGVtYSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgRWxlbWVudFtdIGFkZGl0aW9uYWxTY2hlbWFzID0gbG9hZEFkZGl0aW9uYWxTY2hlbWFzKCk7Ci0gICAgICAgICAgICBUeXBlTWFwcGVyIG1hcHBlciA9IChUeXBlTWFwcGVyKW1ldGhvZC5pbnZva2UobnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10geyBzY2hlbWFzLCBhZGRpdGlvbmFsU2NoZW1hcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24sIHR5cGVTeXN0ZW1OYW1lIH0pOwotCi0gICAgICAgICAgICAvLyBzZXQgdGhlIHR5cGUgbWFwcGVyIHRvIHRoZSBjb25maWcKLSAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24uc2V0VHlwZU1hcHBlcihtYXBwZXIpOwotCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbillOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIExvYWRpbmcgdGhlIGV4dGVybmFsIHNjaGVtYXMuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGVsZW1lbnQgYXJyYXkgY29uc2lzdGluZyBvZiB0aGUgdGhlIERPTSBlbGVtZW50IG9iamVjdHMgdGhhdCByZXByZXNlbnQgc2NoZW1hcwotICAgICAqLwotICAgIHByaXZhdGUgRWxlbWVudFtdIGxvYWRBZGRpdGlvbmFsU2NoZW1hcygpIHsKLSAgICAgICAgLy9sb2FkIGFkZGl0aW9uYWwgc2NoZW1hcwotICAgICAgICBTdHJpbmdbXSBzY2hlbWFOYW1lcyA9IENvbmZpZ1Byb3BlcnR5RmlsZUxvYWRlci5nZXRUaGlyZFBhcnR5U2NoZW1hTmFtZXMoKTsKLSAgICAgICAgRWxlbWVudFtdIHNjaGVtYUVsZW1lbnRzOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBBcnJheUxpc3QgYWRkaXRpb25hbFNjaGVtYUVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgRG9jdW1lbnRCdWlsZGVyIGRvY3VtZW50QnVpbGRlciA9IGdldE5hbWVzcGFjZUF3YXJlRG9jdW1lbnRCdWlsZGVyKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNjaGVtYU5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgLy90aGUgbG9jYXRpb24gZm9yIHRoZSB0aGlyZCBwYXJ0eSBzY2hlbWE7cyBpcyBoYXJkY29kZWQKLSAgICAgICAgICAgICAgICBpZiAoISIiLmVxdWFscyhzY2hlbWFOYW1lc1tpXS50cmltKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIHNjaGVtYVN0cmVhbSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRDbGFzcygpLmdldFJlc291cmNlQXNTdHJlYW0oU0NIRU1BX1BBVEggKyBzY2hlbWFOYW1lc1tpXSk7Ci0gICAgICAgICAgICAgICAgICAgIERvY3VtZW50IGRvYyA9IGRvY3VtZW50QnVpbGRlci5wYXJzZShzY2hlbWFTdHJlYW0pOwotICAgICAgICAgICAgICAgICAgICBhZGRpdGlvbmFsU2NoZW1hRWxlbWVudHMuYWRkKGRvYy5nZXREb2N1bWVudEVsZW1lbnQoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvL0NyZWF0ZSB0aGUgU2NoZW1hIGVsZW1lbnQgYXJyYXkKLSAgICAgICAgICAgIHNjaGVtYUVsZW1lbnRzID0gbmV3IEVsZW1lbnRbYWRkaXRpb25hbFNjaGVtYUVsZW1lbnRzLnNpemUoKV07Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFkZGl0aW9uYWxTY2hlbWFFbGVtZW50cy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIHNjaGVtYUVsZW1lbnRzW2ldID0gKEVsZW1lbnQpYWRkaXRpb25hbFNjaGVtYUVsZW1lbnRzLmdldChpKTsKLQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIENvZGVnZW5NZXNzYWdlcy5nZXRNZXNzYWdlKCJleHRlbnNpb24uYWRkaXRpb25hbFNjaGVtYUZhaWx1cmUiKSwgZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc2NoZW1hRWxlbWVudHM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBEb2N1bWVudEJ1aWxkZXIgZ2V0TmFtZXNwYWNlQXdhcmVEb2N1bWVudEJ1aWxkZXIoKSB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZG9jdW1lbnRCdWlsZGVyRmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgZG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKLSAgICAgICAgcmV0dXJuIGRvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vZXh0ZW5zaW9uL1hNTFByZXR0eVByaW50ZXJFeHRlbnNpb24uamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL2V4dGVuc2lvbi9YTUxQcmV0dHlQcmludGVyRXh0ZW5zaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5MmYwMjUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vZXh0ZW5zaW9uL1hNTFByZXR0eVByaW50ZXJFeHRlbnNpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4uZXh0ZW5zaW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLlhNTFByZXR0eVByaW50ZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLXB1YmxpYyBjbGFzcyBYTUxQcmV0dHlQcmludGVyRXh0ZW5zaW9uIGV4dGVuZHMgQWJzdHJhY3RQcmV0dHlQcmludGVyRXh0ZW5zaW9uIHsKLQotCi0gICAgcHVibGljIFhNTFByZXR0eVByaW50ZXJFeHRlbnNpb24oKSB7Ci0gICAgICAgIGZpbGVFeHRlbnNpb24gPSAiLnhtbCI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogY2FsbHMgdGhlIHhtbCBwcmV0dHkgcHJpbnRlcnMKLSAgICAgKgotICAgICAqIEBwYXJhbSBmaWxlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJldHRpZnlGaWxlKEZpbGUgZmlsZSkgewotICAgICAgICBYTUxQcmV0dHlQcmludGVyLnByZXR0aWZ5KGZpbGUpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vc2NoZW1hL0F4aXNTZXJ2aWNlVG9wRWxlbWVudFNjaGVtYUdlbmVyYXRvci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vc2NoZW1hL0F4aXNTZXJ2aWNlVG9wRWxlbWVudFNjaGVtYUdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDg4Yjk3Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL3NjaGVtYS9BeGlzU2VydmljZVRvcEVsZW1lbnRTY2hlbWFHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLnNjaGVtYTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc01lc3NhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5uYW1lc3BhY2UuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5TT0FQSGVhZGVyTWVzc2FnZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5zY2hlbWEuZXhjZXB0aW9uLkR1bW15U2NoZW1hR2VuZXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYUNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFFbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hSW1wb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hSW5jbHVkZTsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYU9iamVjdENvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogdGhpcyBjbGFzcyBpcyB1c2VkIHRvIGdlbmVyYXRlIGR1bW15IHNjaGVtYSB3aXRoIG9ubHkgdG9wIGxldmVsCi0gKiBlbGVtZW50cyB0byBzdXBwb3J0IHhtbGJlYW5zCi0gKi8KLXB1YmxpYyBjbGFzcyBBeGlzU2VydmljZVRvcEVsZW1lbnRTY2hlbWFHZW5lcmF0b3IgewotCi0gICAgcHJpdmF0ZSBBeGlzU2VydmljZSBheGlzU2VydmljZTsKLQotICAgIHB1YmxpYyBBeGlzU2VydmljZVRvcEVsZW1lbnRTY2hlbWFHZW5lcmF0b3IoQXhpc1NlcnZpY2Ugc2VydmljZSkgewotICAgICAgICB0aGlzLmF4aXNTZXJ2aWNlID0gc2VydmljZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdCBnZXREdW1teVNjaGVtYUxpc3QoKSB0aHJvd3MgRHVtbXlTY2hlbWFHZW5lcmF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgU2V0IHRvcEVsZW1lbnRzID0gZ2V0VG9wRWxlbWVudHMoKTsKLSAgICAgICAgTWFwIHNjaGVtYU1hcCA9IGdldFNjaGVtYU1hcCh0b3BFbGVtZW50cyk7Ci0gICAgICAgIHJldHVybiBnZXRYbWxTY2hlbWFMaXN0KHNjaGVtYU1hcCk7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3QgZ2V0WG1sU2NoZW1hTGlzdChNYXAgc2NoZW1hTWFwKSB0aHJvd3MgRHVtbXlTY2hlbWFHZW5lcmF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgTGlzdCB4bWxTY2hlbWFMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgICAgIC8vIGNyZWF0ZXMgdGhlIGJ1aWxkZXIgZmFjdG9yeQotICAgICAgICBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGRvY3VtZW50QnVpbGRlckZhY3RvcnkgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIGRvY3VtZW50QnVpbGRlckZhY3Rvcnkuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBEb2N1bWVudEJ1aWxkZXIgZG9jdW1lbnRCdWlsZGVyID0gZG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKLSAgICAgICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gZG9jdW1lbnRCdWlsZGVyLm5ld0RvY3VtZW50KCk7Ci0KLSAgICAgICAgICAgIFhtbFNjaGVtYSB4bWxTY2hlbWE7Ci0gICAgICAgICAgICBFbGVtZW50IGVsZW1lbnQ7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzY2hlbWFNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgeG1sU2NoZW1hID0gKFhtbFNjaGVtYSkgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgZWxlbWVudCA9IHhtbFNjaGVtYS5nZXRTY2hlbWFFbGVtZW50KGRvY3VtZW50KTsKLSAgICAgICAgICAgICAgICBYbWxTY2hlbWFDb2xsZWN0aW9uIHhtbFNjaGVtYUNvbGxlY3Rpb24gPSBuZXcgWG1sU2NoZW1hQ29sbGVjdGlvbigpOwotICAgICAgICAgICAgICAgIHhtbFNjaGVtYUxpc3QuYWRkKHhtbFNjaGVtYUNvbGxlY3Rpb24ucmVhZChlbGVtZW50KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IER1bW15U2NoZW1hR2VuZXJhdGlvbkV4Y2VwdGlvbigiQ2FuIG5vdCBidWlsZCB0aGUgZG9tIHRyZWUiLCBlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4geG1sU2NoZW1hTGlzdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWFwIGdldFNjaGVtYU1hcChTZXQgdG9wRWxlbWVudHMpIHsKLSAgICAgICAgTWFwIHNjaGVtYU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIFRvcEVsZW1lbnQgdG9wRWxlbWVudDsKLSAgICAgICAgWG1sU2NoZW1hIHhtbFNjaGVtYTsKLSAgICAgICAgWG1sRWxlbWVudCB4bWxFbGVtZW50OwotICAgICAgICBOYW1lc3BhY2VQcmVmaXggbmFtZXNwYWNlUHJlZml4ID0gbmV3IE5hbWVzcGFjZVByZWZpeCgpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0b3BFbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIHRvcEVsZW1lbnQgPSAoVG9wRWxlbWVudCkgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICB4bWxTY2hlbWEgPSBnZXRYbWxTY2hlbWFGb3JOYW1lc3BhY2UodG9wRWxlbWVudC5nZXRFbGVtZW50UU5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKSwgc2NoZW1hTWFwKTsKLSAgICAgICAgICAgIGlmICgheG1sU2NoZW1hLmlzRWxlbWVudEV4aXN0cyh0b3BFbGVtZW50LmdldEVsZW1lbnRRTmFtZSgpLmdldExvY2FsUGFydCgpKSkgewotICAgICAgICAgICAgICAgIGlmICh0b3BFbGVtZW50LmdldFR5cGVRTmFtZSgpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgLy9pLmUgdGhpcyBlbGVtZW50IGlzIGFuIGFubm9ueW1vdXMgY29tcGxleCBlbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgIC8vIHRoZW4gd2UgY2FuIGFkZCB0aGlzIGVsZW1lbnQgd2l0aCBvdXQgYW55IHByb2JsZW0KLSAgICAgICAgICAgICAgICAgICAgeG1sU2NoZW1hLmFkZEVsZW1lbnQoZ2V0WG1sRWxlbWVudCh0b3BFbGVtZW50KSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0b3BFbGVtZW50LmdldFR5cGVRTmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpLmVxdWFscyhDb25zdGFudHMuVVJJXzIwMDFfU0NIRU1BX1hTRCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBlbGVtZW50IGhhcyBhIHN0YW5kYXJkIHNjaGVtYSB0eXBlIHRoZW4gd2UgZG8gbm90IGhhdmUgdG8gd2FycnkgYWJvdXQgdGhlIHR5cGUKLSAgICAgICAgICAgICAgICAgICAgeG1sU2NoZW1hLmFkZEVsZW1lbnQoZ2V0WG1sRWxlbWVudCh0b3BFbGVtZW50KSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gdGhlbiB3ZSBoYXZlIGFuIGVsZW1lbnQgd2l0aCBhIGNvbXBsZXggdHlwZS4KLSAgICAgICAgICAgICAgICAgICAgLy8gZmlyc3QgY3JlYXRlcyB0aGUgY29tcGxleCB0eXBlIGlmIGl0IGlzIG5vdGUgZXhpc3RzCi0gICAgICAgICAgICAgICAgICAgIFhtbFNjaGVtYSBjb21wbGV4RWxlbWVudFNjaGVtYSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0WG1sU2NoZW1hRm9yTmFtZXNwYWNlKHRvcEVsZW1lbnQuZ2V0VHlwZVFOYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCksIHNjaGVtYU1hcCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghY29tcGxleEVsZW1lbnRTY2hlbWEuaXNDb21wbGV4VHlwZUV4aXN0cyh0b3BFbGVtZW50LmdldFR5cGVRTmFtZSgpLmdldExvY2FsUGFydCgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgWG1sQ29tcGxleFR5cGUgeG1sQ29tcGxleFR5cGUgPSBuZXcgWG1sQ29tcGxleFR5cGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbENvbXBsZXhUeXBlLnNldE5hbWUodG9wRWxlbWVudC5nZXRUeXBlUU5hbWUoKS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4bWxDb21wbGV4VHlwZS5zZXROYW1lc3BhY2UodG9wRWxlbWVudC5nZXRUeXBlUU5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV4RWxlbWVudFNjaGVtYS5hZGRDb21wbGV4VHlwZSh4bWxDb21wbGV4VHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvLyBhZGRpbmcgdGhlIG5hbWVzYXBjZSBpZiBub3QgZXhpc3RzLgotICAgICAgICAgICAgICAgICAgICBpZiAoIXhtbFNjaGVtYS5nZXROYW1lc3BhY2VzUHJlZml4TWFwKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29udGFpbnNLZXkodG9wRWxlbWVudC5nZXRUeXBlUU5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbFNjaGVtYS5nZXROYW1lc3BhY2VzUHJlZml4TWFwKCkucHV0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3BFbGVtZW50LmdldFR5cGVRTmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VQcmVmaXguZ2V0TmV4dE5hbWVzcGFjZVByZWZpeCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFhtbEltcG9ydCB4bWxJbXBvcnQgPSBuZXcgWG1sSW1wb3J0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4bWxJbXBvcnQuc2V0VGFyZ2V0TmFtZXNwYWNlKHRvcEVsZW1lbnQuZ2V0VHlwZVFOYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgeG1sU2NoZW1hLmFkZEltcG9ydCh4bWxJbXBvcnQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gZmluYWxseSBhZGQgdGhlIG5hbWVzcGFjZQotICAgICAgICAgICAgICAgICAgICB4bWxTY2hlbWEuYWRkRWxlbWVudChnZXRYbWxFbGVtZW50KHRvcEVsZW1lbnQpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNjaGVtYU1hcDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFhtbEVsZW1lbnQgZ2V0WG1sRWxlbWVudChUb3BFbGVtZW50IHRvcEVsZW1lbnQpIHsKLSAgICAgICAgWG1sRWxlbWVudCB4bWxFbGVtZW50ID0gbmV3IFhtbEVsZW1lbnQoKTsKLSAgICAgICAgeG1sRWxlbWVudC5zZXROYW1lKHRvcEVsZW1lbnQuZ2V0RWxlbWVudFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICB4bWxFbGVtZW50LnNldE5hbWVzcGFjZSh0b3BFbGVtZW50LmdldEVsZW1lbnRRTmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICAgICAgeG1sRWxlbWVudC5zZXRUeXBlKHRvcEVsZW1lbnQuZ2V0VHlwZVFOYW1lKCkpOwotICAgICAgICByZXR1cm4geG1sRWxlbWVudDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFhtbFNjaGVtYSBnZXRYbWxTY2hlbWFGb3JOYW1lc3BhY2UoU3RyaW5nIHRhcmdldE5hbWVzcGFjZSwgTWFwIHNjaGVtYU1hcCkgewotICAgICAgICBpZiAoIXNjaGVtYU1hcC5jb250YWluc0tleSh0YXJnZXROYW1lc3BhY2UpKSB7Ci0gICAgICAgICAgICBYbWxTY2hlbWEgeG1sU2NoZW1hID0gbmV3IFhtbFNjaGVtYSh0YXJnZXROYW1lc3BhY2UpOwotICAgICAgICAgICAgc2NoZW1hTWFwLnB1dCh0YXJnZXROYW1lc3BhY2UsIHhtbFNjaGVtYSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIChYbWxTY2hlbWEpIHNjaGVtYU1hcC5nZXQodGFyZ2V0TmFtZXNwYWNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2V0IGdldFRvcEVsZW1lbnRzKCkgewotCi0gICAgICAgIFNldCB0b3BTY2hlbWFFbGVtZW50cyA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgICAgIEF4aXNPcGVyYXRpb24gYXhpc09wZXJhdGlvbjsKLSAgICAgICAgQXhpc01lc3NhZ2UgYXhpc01lc3NhZ2U7Ci0gICAgICAgIFRvcEVsZW1lbnQgdG9wRWxlbWVudDsKLSAgICAgICAgWG1sU2NoZW1hRWxlbWVudCB4bWxTY2hlbWFFbGVtZW50OwotICAgICAgICBTT0FQSGVhZGVyTWVzc2FnZSBzb2FwSGVhZGVyTWVzc2FnZTsKLQotICAgICAgICBmb3IgKEl0ZXJhdG9yIG9wZXJhdGlvbkl0ZXIgPSBheGlzU2VydmljZS5nZXRPcGVyYXRpb25zKCk7IG9wZXJhdGlvbkl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgYXhpc09wZXJhdGlvbiA9IChBeGlzT3BlcmF0aW9uKSBvcGVyYXRpb25JdGVyLm5leHQoKTsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgbWVzc2FnZUl0ZXIgPSBheGlzT3BlcmF0aW9uLmdldE1lc3NhZ2VzKCk7IG1lc3NhZ2VJdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICBheGlzTWVzc2FnZSA9IChBeGlzTWVzc2FnZSkgbWVzc2FnZUl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgIGlmIChheGlzTWVzc2FnZS5nZXRFbGVtZW50UU5hbWUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRvcEVsZW1lbnQgPSBuZXcgVG9wRWxlbWVudChheGlzTWVzc2FnZS5nZXRFbGVtZW50UU5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFNjaGVtYUVsZW1lbnQgPSBheGlzTWVzc2FnZS5nZXRTY2hlbWFFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIHRvcEVsZW1lbnQuc2V0VHlwZVFOYW1lKHhtbFNjaGVtYUVsZW1lbnQuZ2V0U2NoZW1hVHlwZU5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHRvcFNjaGVtYUVsZW1lbnRzLmFkZCh0b3BFbGVtZW50KTsKLSAgICAgICAgICAgICAgICAgICAgLy8gYWRkaW5nIGhlYWRlciBtZXNzYWdlcwotICAgICAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIHNvYXBIZWFkZXJJdGVyID0gYXhpc01lc3NhZ2UuZ2V0U29hcEhlYWRlcnMoKS5pdGVyYXRvcigpOyBzb2FwSGVhZGVySXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzb2FwSGVhZGVyTWVzc2FnZSA9IChTT0FQSGVhZGVyTWVzc2FnZSkgc29hcEhlYWRlckl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgdG9wRWxlbWVudCA9IG5ldyBUb3BFbGVtZW50KHNvYXBIZWFkZXJNZXNzYWdlLmdldEVsZW1lbnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0b3BTY2hlbWFFbGVtZW50cy5hZGQodG9wRWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4bWxTY2hlbWFFbGVtZW50ID0gZ2V0U2NoZW1hRWxlbWVudChzb2FwSGVhZGVyTWVzc2FnZS5nZXRFbGVtZW50KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgdG9wRWxlbWVudC5zZXRUeXBlUU5hbWUoeG1sU2NoZW1hRWxlbWVudC5nZXRTY2hlbWFUeXBlTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRvcFNjaGVtYUVsZW1lbnRzLmFkZCh0b3BFbGVtZW50KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBmYXVsdE1lc3NhZ2VzSXRlciA9IGF4aXNPcGVyYXRpb24uZ2V0RmF1bHRNZXNzYWdlcygpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgIGZhdWx0TWVzc2FnZXNJdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICBheGlzTWVzc2FnZSA9IChBeGlzTWVzc2FnZSkgZmF1bHRNZXNzYWdlc0l0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgIHRvcEVsZW1lbnQgPSBuZXcgVG9wRWxlbWVudChheGlzTWVzc2FnZS5nZXRFbGVtZW50UU5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgeG1sU2NoZW1hRWxlbWVudCA9IGF4aXNNZXNzYWdlLmdldFNjaGVtYUVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICB0b3BFbGVtZW50LnNldFR5cGVRTmFtZSh4bWxTY2hlbWFFbGVtZW50LmdldFNjaGVtYVR5cGVOYW1lKCkpOwotICAgICAgICAgICAgICAgIHRvcFNjaGVtYUVsZW1lbnRzLmFkZCh0b3BFbGVtZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdG9wU2NoZW1hRWxlbWVudHM7Ci0gICAgfQotCi0gICAgcHVibGljIFhtbFNjaGVtYUVsZW1lbnQgZ2V0U2NoZW1hRWxlbWVudChRTmFtZSBlbGVtZW50UU5hbWUpIHsKLSAgICAgICAgWG1sU2NoZW1hRWxlbWVudCB4bWxTY2hlbWFFbGVtZW50ID0gbnVsbDsKLSAgICAgICAgQXJyYXlMaXN0IHNjaGVtYXMgPSB0aGlzLmF4aXNTZXJ2aWNlLmdldFNjaGVtYSgpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIHNjaGVtYUl0ZXIgPSBzY2hlbWFzLml0ZXJhdG9yKCk7IHNjaGVtYUl0ZXIuaGFzTmV4dCgpOyl7Ci0gICAgICAgICAgICB4bWxTY2hlbWFFbGVtZW50ID0gZ2V0U2NoZW1hRWxlbWVudCgKLSAgICAgICAgICAgICAgICAgICAgKG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hKXNjaGVtYUl0ZXIubmV4dCgpLGVsZW1lbnRRTmFtZSk7Ci0gICAgICAgICAgICBpZiAoeG1sU2NoZW1hRWxlbWVudCAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4geG1sU2NoZW1hRWxlbWVudDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFhtbFNjaGVtYUVsZW1lbnQgZ2V0U2NoZW1hRWxlbWVudChvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYSBzY2hlbWEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUU5hbWUgZWxlbWVudFFOYW1lKSB7Ci0gICAgICAgIFhtbFNjaGVtYUVsZW1lbnQgeG1sU2NoZW1hRWxlbWVudCA9IG51bGw7Ci0gICAgICAgIGlmIChzY2hlbWEgIT0gbnVsbCkgewotICAgICAgICAgICAgeG1sU2NoZW1hRWxlbWVudCA9IHNjaGVtYS5nZXRFbGVtZW50QnlOYW1lKGVsZW1lbnRRTmFtZSk7Ci0gICAgICAgICAgICBpZiAoeG1sU2NoZW1hRWxlbWVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gdHJ5IHRvIGZpbmQgaW4gYW4gaW1wb3J0IG9yIGFuIGluY2x1ZGUKLSAgICAgICAgICAgICAgICBYbWxTY2hlbWFPYmplY3RDb2xsZWN0aW9uIGluY2x1ZGVzID0gc2NoZW1hLmdldEluY2x1ZGVzKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGluY2x1ZGVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3IgaW5jbHVkZXNJdGVyID0gaW5jbHVkZXMuZ2V0SXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICAgICAgT2JqZWN0IG9iamVjdDsKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGluY2x1ZGVzSXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdCA9IGluY2x1ZGVzSXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgWG1sU2NoZW1hSW1wb3J0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWEgc2NoZW1hMSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFhtbFNjaGVtYUltcG9ydCkgb2JqZWN0KS5nZXRTY2hlbWEoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxTY2hlbWFFbGVtZW50ID0gZ2V0U2NoZW1hRWxlbWVudChzY2hlbWExLGVsZW1lbnRRTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgWG1sU2NoZW1hSW5jbHVkZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hIHNjaGVtYTEgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChYbWxTY2hlbWFJbmNsdWRlKSBvYmplY3QpLmdldFNjaGVtYSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFNjaGVtYUVsZW1lbnQgPSBnZXRTY2hlbWFFbGVtZW50KHNjaGVtYTEsZWxlbWVudFFOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh4bWxTY2hlbWFFbGVtZW50ICE9IG51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB4bWxTY2hlbWFFbGVtZW50OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL3NjaGVtYS9OYW1lc3BhY2VQcmVmaXguamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL3NjaGVtYS9OYW1lc3BhY2VQcmVmaXguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU3YWM3MS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi9zY2hlbWEvTmFtZXNwYWNlUHJlZml4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLnNjaGVtYTsKLQotLyoqCi0gKiBwcm92aWRlIG5hbWVzYXBjZSBwcmVmaXhlcwotICovCi1wdWJsaWMgY2xhc3MgTmFtZXNwYWNlUHJlZml4IHsKLQotICAgIHByaXZhdGUgaW50IGkgPSAwOwotCi0gICAgcHVibGljIFN0cmluZyBnZXROZXh0TmFtZXNwYWNlUHJlZml4KCl7Ci0gICAgICAgIHJldHVybiAibnMiICsgaSsrOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL3NjaGVtYS9Ub3BFbGVtZW50LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi9zY2hlbWEvVG9wRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzZiZTQzLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL3NjaGVtYS9Ub3BFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLnNjaGVtYTsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLS8qKgotICogdGhpcyBjbGFzcyBpcyB1c2VkIHRvIHJlcHJlc2VudCB0aGUgdG9wIGVsZW1lbnQKLSAqIGRldGFpbHMgb2YgdGhlIHNjaGVtYQotICovCi1wdWJsaWMgY2xhc3MgVG9wRWxlbWVudCB7Ci0KLSAgICBwcml2YXRlIFFOYW1lIGVsZW1lbnRRTmFtZTsKLSAgICBwcml2YXRlIFFOYW1lIHR5cGVRTmFtZTsKLQotICAgIHB1YmxpYyBUb3BFbGVtZW50KCkgewotICAgIH0KLQotICAgIHB1YmxpYyBUb3BFbGVtZW50KFFOYW1lIGVsZW1lbnRRTmFtZSkgewotICAgICAgICB0aGlzLmVsZW1lbnRRTmFtZSA9IGVsZW1lbnRRTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUU5hbWUgZ2V0RWxlbWVudFFOYW1lKCkgewotICAgICAgICByZXR1cm4gZWxlbWVudFFOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEVsZW1lbnRRTmFtZShRTmFtZSBlbGVtZW50UU5hbWUpIHsKLSAgICAgICAgdGhpcy5lbGVtZW50UU5hbWUgPSBlbGVtZW50UU5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFFOYW1lIGdldFR5cGVRTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHR5cGVRTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRUeXBlUU5hbWUoUU5hbWUgdHlwZVFOYW1lKSB7Ci0gICAgICAgIHRoaXMudHlwZVFOYW1lID0gdHlwZVFOYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHRvcCBlbGVtZW50cyBzaG91bGQgaGF2ZSBhIHVuaXF1ZSBuYW1lCi0gICAgICogQHBhcmFtIG9iagotICAgICAqIEByZXR1cm4gd2hldGhlciB0d28gb2JqZWN0cyBhcmUgZXF1YWwgb3Igbm90Ci0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLSAgICAgICAgYm9vbGVhbiBpc0VxdWFsID0gZmFsc2U7Ci0gICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBUb3BFbGVtZW50KXsKLSAgICAgICAgICAgIGlzRXF1YWwgPSAoKFRvcEVsZW1lbnQpb2JqKS5nZXRFbGVtZW50UU5hbWUoKS5lcXVhbHModGhpcy5lbGVtZW50UU5hbWUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpc0VxdWFsOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL3NjaGVtYS9YbWxDb21wbGV4VHlwZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vc2NoZW1hL1htbENvbXBsZXhUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0ZTJiYzMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vc2NoZW1hL1htbENvbXBsZXhUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLnNjaGVtYTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIubmFtZXNwYWNlLkNvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0vKioKLSAqIHRoaXMgY2xhc3MgcmVwcmVzZW50cyBhbiB4bWwgY29tcGxleCB0eXBlCi0gKgotICovCi1wdWJsaWMgY2xhc3MgWG1sQ29tcGxleFR5cGUgewotCi0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZXNwYWNlOwotICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZSgpIHsKLSAgICAgICAgcmV0dXJuIG5hbWVzcGFjZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lc3BhY2UoU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICB0aGlzLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRWxlbWVudCBnZXRTY2hlbWFFbGVtZW50KERvY3VtZW50IGRvY3VtZW50KXsKLSAgICAgICAgRWxlbWVudCBjb21wbGV4RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhDb25zdGFudHMuVVJJXzIwMDFfU0NIRU1BX1hTRCwieHNkOmNvbXBsZXhUeXBlIik7Ci0gICAgICAgIGNvbXBsZXhFbGVtZW50LnNldFByZWZpeCgieHNkIik7Ci0gICAgICAgIGNvbXBsZXhFbGVtZW50LnNldEF0dHJpYnV0ZSgibmFtZSIsIHRoaXMubmFtZSk7Ci0KLSAgICAgICAgRWxlbWVudCBzZXF1ZW5jZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoQ29uc3RhbnRzLlVSSV8yMDAxX1NDSEVNQV9YU0QsICJ4c2Q6c2VxdWVuY2UiKTsKLSAgICAgICAgc2VxdWVuY2VFbGVtZW50LnNldFByZWZpeCgieHNkIik7Ci0KLSAgICAgICAgY29tcGxleEVsZW1lbnQuYXBwZW5kQ2hpbGQoc2VxdWVuY2VFbGVtZW50KTsKLSAgICAgICAgcmV0dXJuIGNvbXBsZXhFbGVtZW50OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL3NjaGVtYS9YbWxFbGVtZW50LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi9zY2hlbWEvWG1sRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2MwMDRmLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL3NjaGVtYS9YbWxFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLnNjaGVtYTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIubmFtZXNwYWNlLkNvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIHRoaXMgY2xhc3MgcmVwcmVzZW50cyBhbiB4bWwgZWxlbWVudAotICovCi1wdWJsaWMgY2xhc3MgWG1sRWxlbWVudCB7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBuYW1lc3BhY2U7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLSAgICBwcml2YXRlIFFOYW1lIHR5cGU7Ci0KLSAgICBwdWJsaWMgRWxlbWVudCBnZXRTY2hlbWFFbGVtZW50KERvY3VtZW50IGRvY3VtZW50LCBNYXAgbmFtZXNwYWNlUHJlZml4TWFwKSB7Ci0gICAgICAgIEVsZW1lbnQgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhDb25zdGFudHMuVVJJXzIwMDFfU0NIRU1BX1hTRCwgInhzZDplbGVtZW50Iik7Ci0gICAgICAgIGVsZW1lbnQuc2V0UHJlZml4KCJ4c2QiKTsKLSAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoIm5hbWUiLCB0aGlzLm5hbWUpOwotICAgICAgICBpZiAodGhpcy50eXBlID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIHRoaXMgaXMgYW4gYW5ubmltb3VzIGNvbXBsZXggdHlwZSBlbGVtZW50Ci0gICAgICAgICAgICBFbGVtZW50IGNvbXBsZXh0VHlwZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoQ29uc3RhbnRzLlVSSV8yMDAxX1NDSEVNQV9YU0QsICJ4c2Q6Y29tcGxleFR5cGUiKTsKLSAgICAgICAgICAgIGNvbXBsZXh0VHlwZUVsZW1lbnQuc2V0UHJlZml4KCJ4c2QiKTsKLQotICAgICAgICAgICAgRWxlbWVudCBzZXF1ZW5jZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoQ29uc3RhbnRzLlVSSV8yMDAxX1NDSEVNQV9YU0QsICJ4c2Q6c2VxdWVuY2UiKTsKLSAgICAgICAgICAgIHNlcXVlbmNlRWxlbWVudC5zZXRQcmVmaXgoInhzZCIpOwotCi0gICAgICAgICAgICBjb21wbGV4dFR5cGVFbGVtZW50LmFwcGVuZENoaWxkKHNlcXVlbmNlRWxlbWVudCk7Ci0gICAgICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxkKGNvbXBsZXh0VHlwZUVsZW1lbnQpOwotICAgICAgICB9IGVsc2UgaWYgKENvbnN0YW50cy5VUklfMjAwMV9TQ0hFTUFfWFNELmVxdWFscyh0aGlzLnR5cGUuZ2V0TmFtZXNwYWNlVVJJKCkpKSB7Ci0gICAgICAgICAgICAvLyB0aGlzIGlzIGEgc3RhbmRhcmQgdHlwZQotICAgICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoInR5cGUiLCAieHNkOiIgKyB0aGlzLnR5cGUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gdGhpcyBlbGVtZW50IHBvaW50cyB0byBhbiBjb21wbGV4IHR5cGUKLSAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSAoU3RyaW5nKSBuYW1lc3BhY2VQcmVmaXhNYXAuZ2V0KHRoaXMudHlwZS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgidHlwZSIsIHByZWZpeCArICI6IiArIHRoaXMudHlwZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVsZW1lbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2UoKSB7Ci0gICAgICAgIHJldHVybiBuYW1lc3BhY2U7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZXNwYWNlKFN0cmluZyBuYW1lc3BhY2UpIHsKLSAgICAgICAgdGhpcy5uYW1lc3BhY2UgPSBuYW1lc3BhY2U7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFFOYW1lIGdldFR5cGUoKSB7Ci0gICAgICAgIHJldHVybiB0eXBlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFR5cGUoUU5hbWUgdHlwZSkgewotICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL3NjaGVtYS9YbWxJbXBvcnQuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL3NjaGVtYS9YbWxJbXBvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNkODFhZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi9zY2hlbWEvWG1sSW1wb3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLnNjaGVtYTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIubmFtZXNwYWNlLkNvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0vKioKLSAqIHRoaXMgY2xhc3MgcmVwcmVzZW50cyBhbiB4bWwgc2NoZW1hIGltcG9ydAotICovCi1wdWJsaWMgY2xhc3MgWG1sSW1wb3J0IHsKLQotICAgIHByaXZhdGUgU3RyaW5nIHRhcmdldE5hbWVzcGFjZTsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0TmFtZXNwYWNlKCkgewotICAgICAgICByZXR1cm4gdGFyZ2V0TmFtZXNwYWNlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFRhcmdldE5hbWVzcGFjZShTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlKSB7Ci0gICAgICAgIHRoaXMudGFyZ2V0TmFtZXNwYWNlID0gdGFyZ2V0TmFtZXNwYWNlOwotICAgIH0KLQotICAgIHB1YmxpYyBFbGVtZW50IGdldFhtbFNjaGVtYUVsZW1lbnQoRG9jdW1lbnQgZG9jdW1lbnQpewotCi0gICAgICAgIEVsZW1lbnQgaW1wb3J0RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhDb25zdGFudHMuVVJJXzIwMDFfU0NIRU1BX1hTRCwieHNkOmltcG9ydCIpOwotICAgICAgICBpbXBvcnRFbGVtZW50LnNldFByZWZpeCgieHNkIik7Ci0gICAgICAgIGltcG9ydEVsZW1lbnQuc2V0QXR0cmlidXRlKCJuYW1lc3BhY2UiLHRoaXMudGFyZ2V0TmFtZXNwYWNlKTsKLSAgICAgICAgcmV0dXJuIGltcG9ydEVsZW1lbnQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vc2NoZW1hL1htbFNjaGVtYS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vc2NoZW1hL1htbFNjaGVtYS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Y2RjNGM5Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL3NjaGVtYS9YbWxTY2hlbWEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLnNjaGVtYTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIubmFtZXNwYWNlLkNvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogdGhpcyBjbGFzcyByZXByZXNlbnRzIGFuZCBzY2hlbWEgb2JqZWN0LgotICogaXQgaXMgYXNzdW1lZCB0aGF0IHdlIGNvbnNpZGVyIHRoZSB4c2Qgc2NoZW1hYQotICogYXMgdGhlIGRlZnVhbHQgbmFtZSBzcGFjZS4KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxTY2hlbWEgewotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MTlNfTkFNRVNQQUNFX1VSSSA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3htbG5zLyI7Ci0KLSAgICBwcml2YXRlIE1hcCBuYW1lc3BhY2VzUHJlZml4TWFwOwotICAgIHByaXZhdGUgTWFwIGltcG9ydHM7Ci0gICAgcHJpdmF0ZSBNYXAgZWxlbWVudHM7Ci0gICAgcHJpdmF0ZSBNYXAgY29tcGxleFR5cGVzOwotICAgIHByaXZhdGUgU3RyaW5nIHRhcmdldE5hbWVzcGFjZTsKLQotICAgIHB1YmxpYyBYbWxTY2hlbWEoKSB7Ci0gICAgICAgIHRoaXMubmFtZXNwYWNlc1ByZWZpeE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIHRoaXMuaW1wb3J0cyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIHRoaXMuZWxlbWVudHMgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICB0aGlzLmNvbXBsZXhUeXBlcyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFhtbFNjaGVtYShTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlKSB7Ci0gICAgICAgIHRoaXMoKTsKLSAgICAgICAgdGhpcy50YXJnZXROYW1lc3BhY2UgPSB0YXJnZXROYW1lc3BhY2U7Ci0gICAgICAgIC8vIGFkZCB0aGUgdGFyZ2V0IG5hbWVzcGFjZSB0byBuYW1lc3BhY2UgcHJpZml4IG1hcAotICAgICAgICB0aGlzLm5hbWVzcGFjZXNQcmVmaXhNYXAucHV0KHRoaXMudGFyZ2V0TmFtZXNwYWNlLCJ0bnMiKTsKLSAgICAgICAgdGhpcy5uYW1lc3BhY2VzUHJlZml4TWFwLnB1dChDb25zdGFudHMuVVJJXzIwMDFfU0NIRU1BX1hTRCwieHNkIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkTmFtZXNwYWNlKFN0cmluZyBuYW1lc3BhY2UsU3RyaW5nIHByZWZpeCl7Ci0gICAgICAgIHRoaXMubmFtZXNwYWNlc1ByZWZpeE1hcC5wdXQobmFtZXNwYWNlLHByZWZpeCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkSW1wb3J0KFhtbEltcG9ydCB4bWxJbXBvcnQpewotICAgICAgIHRoaXMuaW1wb3J0cy5wdXQoeG1sSW1wb3J0LmdldFRhcmdldE5hbWVzcGFjZSgpLHhtbEltcG9ydCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNFeGlzdHMoWG1sSW1wb3J0IHhtbEltcG9ydCl7Ci0gICAgICAgIHJldHVybiB0aGlzLmltcG9ydHMuY29udGFpbnNLZXkoeG1sSW1wb3J0LmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRFbGVtZW50KFhtbEVsZW1lbnQgeG1sRWxlbWVudCl7Ci0gICAgICAgIHRoaXMuZWxlbWVudHMucHV0KHhtbEVsZW1lbnQuZ2V0TmFtZSgpLHhtbEVsZW1lbnQpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRXhpc3RzKFhtbEVsZW1lbnQgeG1sRWxlbWVudCl7Ci0gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnRzLmNvbnRhaW5zS2V5KHhtbEVsZW1lbnQuZ2V0TmFtZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VsZW1lbnRFeGlzdHMoU3RyaW5nIG5hbWUpewotICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50cy5jb250YWluc0tleShuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRDb21wbGV4VHlwZShYbWxDb21wbGV4VHlwZSB4bWxDb21wbGV4VHlwZSl7Ci0gICAgICAgIHRoaXMuY29tcGxleFR5cGVzLnB1dCh4bWxDb21wbGV4VHlwZS5nZXROYW1lKCkseG1sQ29tcGxleFR5cGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRXhpc3RzKFhtbENvbXBsZXhUeXBlIHhtbENvbXBsZXhUeXBlKXsKLSAgICAgICAgcmV0dXJuIHRoaXMuY29tcGxleFR5cGVzLmNvbnRhaW5zS2V5KHhtbENvbXBsZXhUeXBlLmdldE5hbWUoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNDb21wbGV4VHlwZUV4aXN0cyhTdHJpbmcgbmFtZUNvbXBsZXhUeXBlKXsKLSAgICAgICAgcmV0dXJuIHRoaXMuY29tcGxleFR5cGVzLmNvbnRhaW5zS2V5KG5hbWVDb21wbGV4VHlwZSk7Ci0gICAgfQotCi0gICAgcHVibGljIEVsZW1lbnQgZ2V0U2NoZW1hRWxlbWVudChEb2N1bWVudCBkb2N1bWVudCl7Ci0gICAgICAgIEVsZW1lbnQgc2NoZW1hRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhDb25zdGFudHMuVVJJXzIwMDFfU0NIRU1BX1hTRCwieHNkOnNjaGVtYSIpOwotICAgICAgICBzY2hlbWFFbGVtZW50LnNldFByZWZpeCgieHNkIik7Ci0KLSAgICAgICAgLy8gc2V0IHRhcmdldCBuYW1lc2FwY2UKLSAgICAgICAgc2NoZW1hRWxlbWVudC5zZXRBdHRyaWJ1dGUoInRhcmdldE5hbWVzcGFjZSIsIHRoaXMudGFyZ2V0TmFtZXNwYWNlKTsKLQotICAgICAgICAvLyByZWdpc3RlciBuYW1lc2FwY2UgcHJlZml4ZXMKLSAgICAgICAgU3RyaW5nIG5hbWVzcGFjZTsKLSAgICAgICAgU3RyaW5nIHByZWZpeDsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gdGhpcy5uYW1lc3BhY2VzUHJlZml4TWFwLmtleVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOyl7Ci0gICAgICAgICAgICBuYW1lc3BhY2UgPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIHByZWZpeCA9IChTdHJpbmcpIHRoaXMubmFtZXNwYWNlc1ByZWZpeE1hcC5nZXQobmFtZXNwYWNlKTsKLSAgICAgICAgICAgIHNjaGVtYUVsZW1lbnQuc2V0QXR0cmlidXRlTlMoWE1MTlNfTkFNRVNQQUNFX1VSSSwieG1sbnM6IiArIHByZWZpeCxuYW1lc3BhY2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gYWRkaW5nIGltcG9ydHMKLSAgICAgICAgWG1sSW1wb3J0IHhtbEltcG9ydDsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gdGhpcy5pbXBvcnRzLnZhbHVlcygpLml0ZXJhdG9yKCk7aXRlci5oYXNOZXh0KCk7KXsKLSAgICAgICAgICAgIHhtbEltcG9ydCA9IChYbWxJbXBvcnQpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgc2NoZW1hRWxlbWVudC5hcHBlbmRDaGlsZCh4bWxJbXBvcnQuZ2V0WG1sU2NoZW1hRWxlbWVudChkb2N1bWVudCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gYWRkaW5nIGVsZW1lbnRzCi0gICAgICAgIFhtbEVsZW1lbnQgeG1sRWxlbWVudDsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gdGhpcy5lbGVtZW50cy52YWx1ZXMoKS5pdGVyYXRvcigpO2l0ZXIuaGFzTmV4dCgpOyl7Ci0gICAgICAgICAgICB4bWxFbGVtZW50ID0gKFhtbEVsZW1lbnQpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgc2NoZW1hRWxlbWVudC5hcHBlbmRDaGlsZCh4bWxFbGVtZW50LmdldFNjaGVtYUVsZW1lbnQoZG9jdW1lbnQsIHRoaXMubmFtZXNwYWNlc1ByZWZpeE1hcCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gYWRkaW5nIGNvbXBsZXggdHlwZXMKLSAgICAgICAgWG1sQ29tcGxleFR5cGUgeG1sQ29tcGxleFR5cGU7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHRoaXMuY29tcGxleFR5cGVzLnZhbHVlcygpLml0ZXJhdG9yKCk7aXRlci5oYXNOZXh0KCk7KXsKLSAgICAgICAgICAgIHhtbENvbXBsZXhUeXBlID0gKFhtbENvbXBsZXhUeXBlKSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIHNjaGVtYUVsZW1lbnQuYXBwZW5kQ2hpbGQoeG1sQ29tcGxleFR5cGUuZ2V0U2NoZW1hRWxlbWVudChkb2N1bWVudCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzY2hlbWFFbGVtZW50OwotICAgIH0KLQotICAgIHB1YmxpYyBNYXAgZ2V0TmFtZXNwYWNlc1ByZWZpeE1hcCgpIHsKLSAgICAgICAgcmV0dXJuIG5hbWVzcGFjZXNQcmVmaXhNYXA7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZXNwYWNlc1ByZWZpeE1hcChNYXAgbmFtZXNwYWNlc1ByZWZpeE1hcCkgewotICAgICAgICB0aGlzLm5hbWVzcGFjZXNQcmVmaXhNYXAgPSBuYW1lc3BhY2VzUHJlZml4TWFwOwotICAgIH0KLQotICAgIHB1YmxpYyBNYXAgZ2V0SW1wb3J0cygpIHsKLSAgICAgICAgcmV0dXJuIGltcG9ydHM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SW1wb3J0cyhNYXAgaW1wb3J0cykgewotICAgICAgICB0aGlzLmltcG9ydHMgPSBpbXBvcnRzOwotICAgIH0KLQotICAgIHB1YmxpYyBNYXAgZ2V0RWxlbWVudHMoKSB7Ci0gICAgICAgIHJldHVybiBlbGVtZW50czsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRFbGVtZW50cyhNYXAgZWxlbWVudHMpIHsKLSAgICAgICAgdGhpcy5lbGVtZW50cyA9IGVsZW1lbnRzOwotICAgIH0KLQotICAgIHB1YmxpYyBNYXAgZ2V0Q29tcGxleFR5cGVzKCkgewotICAgICAgICByZXR1cm4gY29tcGxleFR5cGVzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENvbXBsZXhUeXBlcyhNYXAgY29tcGxleFR5cGVzKSB7Ci0gICAgICAgIHRoaXMuY29tcGxleFR5cGVzID0gY29tcGxleFR5cGVzOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0TmFtZXNwYWNlKCkgewotICAgICAgICByZXR1cm4gdGFyZ2V0TmFtZXNwYWNlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFRhcmdldE5hbWVzcGFjZShTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlKSB7Ci0gICAgICAgIHRoaXMudGFyZ2V0TmFtZXNwYWNlID0gdGFyZ2V0TmFtZXNwYWNlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vc2NoZW1hL2V4Y2VwdGlvbi9EdW1teVNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb24uamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL3NjaGVtYS9leGNlcHRpb24vRHVtbXlTY2hlbWFHZW5lcmF0aW9uRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5N2YwYTkuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vc2NoZW1hL2V4Y2VwdGlvbi9EdW1teVNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4uc2NoZW1hLmV4Y2VwdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgRHVtbXlTY2hlbWFHZW5lcmF0aW9uRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKLSAgICAKLSAgICBwdWJsaWMgRHVtbXlTY2hlbWFHZW5lcmF0aW9uRXhjZXB0aW9uKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBEdW1teVNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSk7Ci0gICAgfQotCi0gICAgcHVibGljIER1bW15U2NoZW1hR2VuZXJhdGlvbkV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGNhdXNlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UsIGNhdXNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRHVtbXlTY2hlbWFHZW5lcmF0aW9uRXhjZXB0aW9uKFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICBzdXBlcihjYXVzZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vc2NoZW1hL3NvYXAtZW5jLnhzZCBiL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL3NjaGVtYS9zb2FwLWVuYy54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkY2E2MjcuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vc2NoZW1hL3NvYXAtZW5jLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDU2MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCcgPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08IS0tIFNjaGVtYSBmb3IgdGhlIFNPQVAvMS4xIGVuY29kaW5nCi0KLVRoaXMgc2NoZW1hIGhhcyBiZWVuIHByb2R1Y2VkIHVzaW5nIFczQydzIFNPQVAgVmVyc2lvbiAxLjIgc2NoZW1hCi1mb3VuZCBhdDoKLQotICAgICBodHRwOi8vd3d3LnczLm9yZy8yMDAxLzA2L3NvYXAtZW5jb2RpbmcKLQotICAgICBDb3B5cmlnaHQgMjAwMSBNYXJ0aW4gR3VkZ2luLCBEZXZlbG9wbWVudG9yLgotCSBodHRwOi8vd3d3LmRldmVsb3AuY28udWsKLQotQ2hhbmdlcyBtYWRlIGFyZSB0aGUgZm9sbG93aW5nOgotLSByZXZlcnRlZCBuYW1lc3BhY2UgdG8gaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8KLS0gcmV2ZXJ0ZWQgcm9vdCB0byBvbmx5IGFsbG93IDAgYW5kIDEgYXMgbGV4aWNhbCB2YWx1ZXMKLQotCi0gICAgIE9yaWdpbmFsIGNvcHlyaWdodDoKLQotQ29weXJpZ2h0IDIwMDEgVzNDIChNYXNzYWNodXNldHRzIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LAotSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCBlbiBBdXRvbWF0aXF1ZSwKLUtlaW8gVW5pdmVyc2l0eSkuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi1odHRwOi8vd3d3LnczLm9yZy9Db25zb3J0aXVtL0xlZ2FsLwotCi0gICAgIFRoaXMgZG9jdW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIFczQyBTb2Z0d2FyZSBMaWNlbnNlIFsxXSBhcwotICAgICBkZXNjcmliZWQgaW4gdGhlIEZBUSBbMl0uCi0KLVsxXWh0dHA6Ly93d3cudzMub3JnL0NvbnNvcnRpdW0vTGVnYWwvY29weXJpZ2h0LXNvZnR3YXJlLTE5OTgwNzIwCi1bMl1odHRwOi8vd3d3LnczLm9yZy9Db25zb3J0aXVtL0xlZ2FsL0lQUi1GQVEtMjAwMDA2MjAuaHRtbCNEVEQKLS0tPgotPHhzOnNjaGVtYSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgICAgIHhtbG5zOnRucz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iCi0gICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIgPgotCi0gPHhzOmF0dHJpYnV0ZSBuYW1lPSJyb290IiBkZWZhdWx0PSIwIiA+Ci0gICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgPHhzOmRvY3VtZW50YXRpb24+Ci0JICAgJ3Jvb3QnIGNhbiBiZSB1c2VkIHRvIGRpc3Rpbmd1aXNoIHNlcmlhbGl6YXRpb24gcm9vdHMgZnJvbQotICAgICAgIG90aGVyIGVsZW1lbnRzIHRoYXQgYXJlIHByZXNlbnQgaW4gYSBzZXJpYWxpemF0aW9uIGJ1dCBhcmUKLSAgICAgICBub3Qgcm9vdHMgb2YgYSBzZXJpYWxpemVkIHZhbHVlIGdyYXBoCi0JIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgIDwveHM6YW5ub3RhdGlvbj4KLSAgIDx4czpzaW1wbGVUeXBlPgotICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0neHM6Ym9vbGVhbic+Ci0JICAgPHhzOnBhdHRlcm4gdmFsdWU9JzB8MScgLz4KLQkgPC94czpyZXN0cmljdGlvbj4KLSAgIDwveHM6c2ltcGxlVHlwZT4KLSA8L3hzOmF0dHJpYnV0ZT4KLQotICA8eHM6YXR0cmlidXRlR3JvdXAgbmFtZT0iY29tbW9uQXR0cmlidXRlcyIgPgotICAgIDx4czphbm5vdGF0aW9uPgotCSAgPHhzOmRvY3VtZW50YXRpb24+Ci0JICAgIEF0dHJpYnV0ZXMgY29tbW9uIHRvIGFsbCBlbGVtZW50cyB0aGF0IGZ1bmN0aW9uIGFzCi0gICAgICAgIGFjY2Vzc29ycyBvciByZXByZXNlbnQgaW5kZXBlbmRlbnQgKG11bHRpLXJlZikgdmFsdWVzLgotICAgICAgICBUaGUgaHJlZiBhdHRyaWJ1dGUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBpbiBhIG1hbm5lcgotICAgICAgICBsaWtlIENPTlJFRi4gIFRoYXQgaXMsIHRoZSBlbGVtZW50IGNvbnRlbnQgc2hvdWxkIGJlCi0gICAgICAgIGVtcHR5IGlmZiB0aGUgaHJlZiBhdHRyaWJ1dGUgYXBwZWFycwotCSAgPC94czpkb2N1bWVudGF0aW9uPgotCTwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4czpJRCIgLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImhyZWYiIHR5cGU9InhzOmFueVVSSSIgLz4KLSAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIC8+Ci0gIDwveHM6YXR0cmlidXRlR3JvdXA+Ci0KLSAgPCEtLSBHbG9iYWwgQXR0cmlidXRlcy4gIFRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyBhcmUgaW50ZW5kZWQKLSAgICAgICB0byBiZSB1c2FibGUgdmlhIHF1YWxpZmllZCBhdHRyaWJ1dGUgbmFtZXMgb24gYW55IGNvbXBsZXgKLSAgICAgICB0eXBlIHJlZmVyZW5jaW5nIHRoZW0uIC0tPgotCi0gIDwhLS0gQXJyYXkgYXR0cmlidXRlcy4gTmVlZGVkIHRvIGdpdmUgdGhlIHR5cGUgYW5kIGRpbWVuc2lvbnMKLSAgICAgICBvZiBhbiBhcnJheSdzIGNvbnRlbnRzLCBhbmQgdGhlIG9mZnNldCBmb3IKLSAgICAgICBwYXJ0aWFsbHktdHJhbnNtaXR0ZWQgYXJyYXlzLiAtLT4KLQotICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJhcnJheUNvb3JkaW5hdGUiID4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIiAvPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJhcnJheVR5cGUiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJvZmZzZXQiIHR5cGU9InRuczphcnJheUNvb3JkaW5hdGUiIC8+Ci0KLSAgPHhzOmF0dHJpYnV0ZUdyb3VwIG5hbWU9ImFycmF5QXR0cmlidXRlcyIgPgotICAgIDx4czphdHRyaWJ1dGUgcmVmPSJ0bnM6YXJyYXlUeXBlIiAvPgotICAgIDx4czphdHRyaWJ1dGUgcmVmPSJ0bnM6b2Zmc2V0IiAvPgotICA8L3hzOmF0dHJpYnV0ZUdyb3VwPgotCi0gIDx4czphdHRyaWJ1dGUgbmFtZT0icG9zaXRpb24iIHR5cGU9InRuczphcnJheUNvb3JkaW5hdGUiIC8+Ci0KLSAgPHhzOmF0dHJpYnV0ZUdyb3VwIG5hbWU9ImFycmF5TWVtYmVyQXR0cmlidXRlcyIgPgotICAgIDx4czphdHRyaWJ1dGUgcmVmPSJ0bnM6cG9zaXRpb24iIC8+Ci0gIDwveHM6YXR0cmlidXRlR3JvdXA+Ci0KLSAgPHhzOmdyb3VwIG5hbWU9IkFycmF5IiA+Ci0gICAgPHhzOnNlcXVlbmNlPgotICAgICAgPHhzOmFueSBuYW1lc3BhY2U9IiMjYW55IiBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIiBwcm9jZXNzQ29udGVudHM9ImxheCIgLz4KLQk8L3hzOnNlcXVlbmNlPgotICA8L3hzOmdyb3VwPgotCi0gIDx4czplbGVtZW50IG5hbWU9IkFycmF5IiB0eXBlPSJ0bnM6QXJyYXkiIC8+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJBcnJheSIgPgotICAgIDx4czphbm5vdGF0aW9uPgotCSAgPHhzOmRvY3VtZW50YXRpb24+Ci0JICdBcnJheScgaXMgYSBjb21wbGV4IHR5cGUgZm9yIGFjY2Vzc29ycyBpZGVudGlmaWVkIGJ5IHBvc2l0aW9uCi0JICA8L3hzOmRvY3VtZW50YXRpb24+Ci0JPC94czphbm5vdGF0aW9uPgotICAgIDx4czpncm91cCByZWY9InRuczpBcnJheSIgbWluT2NjdXJzPSIwIiAvPgotICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczphcnJheUF0dHJpYnV0ZXMiIC8+Ci0gICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiIC8+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAnU3RydWN0JyBpcyBhIGNvbXBsZXggdHlwZSBmb3IgYWNjZXNzb3JzIGlkZW50aWZpZWQgYnkKLSAgICAgICBuYW1lLiBDb25zdHJhaW50OiBObyBlbGVtZW50IG1heSBiZSBoYXZlIHRoZSBzYW1lIG5hbWUgYXMKLSAgICAgICBhbnkgb3RoZXIsIG5vciBtYXkgYW55IGVsZW1lbnQgaGF2ZSBhIG1heE9jY3VycyA+IDEuIC0tPgotCi0gIDx4czplbGVtZW50IG5hbWU9IlN0cnVjdCIgdHlwZT0idG5zOlN0cnVjdCIgLz4KLQotICA8eHM6Z3JvdXAgbmFtZT0iU3RydWN0IiA+Ci0gICAgPHhzOnNlcXVlbmNlPgotICAgICAgPHhzOmFueSBuYW1lc3BhY2U9IiMjYW55IiBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIiBwcm9jZXNzQ29udGVudHM9ImxheCIgLz4KLQk8L3hzOnNlcXVlbmNlPgotICA8L3hzOmdyb3VwPgotCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJTdHJ1Y3QiID4KLSAgICA8eHM6Z3JvdXAgcmVmPSJ0bnM6U3RydWN0IiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiLz4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8IS0tICdCYXNlNjQnIGNhbiBiZSB1c2VkIHRvIHNlcmlhbGl6ZUFuZENvbnN1bWUgYmluYXJ5IGRhdGEgdXNpbmcgYmFzZTY0Ci0gICAgICAgZW5jb2RpbmcgYXMgZGVmaW5lZCBpbiBSRkMyMDQ1IGJ1dCB3aXRob3V0IHRoZSBNSU1FIGxpbmUKLSAgICAgICBsZW5ndGggbGltaXRhdGlvbi4gLS0+Ci0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iYmFzZTY0IiA+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmJhc2U2NEJpbmFyeSIgLz4KLSAgPC94czpzaW1wbGVUeXBlPgotCi0gPCEtLSBFbGVtZW50IGRlY2xhcmF0aW9ucyBjb3JyZXNwb25kaW5nIHRvIGVhY2ggb2YgdGhlIHNpbXBsZQotICAgICAgdHlwZXMgaW4gdGhlIFhNTCBTY2hlbWFzIFNwZWNpZmljYXRpb24uIC0tPgotCi0gIDx4czplbGVtZW50IG5hbWU9ImR1cmF0aW9uIiB0eXBlPSJ0bnM6ZHVyYXRpb24iIC8+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJkdXJhdGlvbiIgPgotICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpkdXJhdGlvbiIgPgotICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJkYXRlVGltZSIgdHlwZT0idG5zOmRhdGVUaW1lIiAvPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iZGF0ZVRpbWUiID4KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6ZGF0ZVRpbWUiID4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLQotCi0gIDx4czplbGVtZW50IG5hbWU9Ik5PVEFUSU9OIiB0eXBlPSJ0bnM6Tk9UQVRJT04iIC8+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJOT1RBVElPTiIgPgotICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpRTmFtZSIgPgotICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotCi0gIDx4czplbGVtZW50IG5hbWU9InRpbWUiIHR5cGU9InRuczp0aW1lIiAvPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0idGltZSIgPgotICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czp0aW1lIiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9ImRhdGUiIHR5cGU9InRuczpkYXRlIiAvPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iZGF0ZSIgPgotICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpkYXRlIiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9ImdZZWFyTW9udGgiIHR5cGU9InRuczpnWWVhck1vbnRoIiAvPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iZ1llYXJNb250aCIgPgotICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpnWWVhck1vbnRoIiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9ImdZZWFyIiB0eXBlPSJ0bnM6Z1llYXIiIC8+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJnWWVhciIgPgotICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpnWWVhciIgPgotICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJnTW9udGhEYXkiIHR5cGU9InRuczpnTW9udGhEYXkiIC8+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJnTW9udGhEYXkiID4KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6Z01vbnRoRGF5IiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9ImdEYXkiIHR5cGU9InRuczpnRGF5IiAvPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iZ0RheSIgPgotICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpnRGF5IiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9ImdNb250aCIgdHlwZT0idG5zOmdNb250aCIgLz4KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImdNb250aCIgPgotICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpnTW9udGgiID4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0iYm9vbGVhbiIgdHlwZT0idG5zOmJvb2xlYW4iIC8+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJib29sZWFuIiA+Ci0gICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmJvb2xlYW4iID4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0iYmFzZTY0QmluYXJ5IiB0eXBlPSJ0bnM6YmFzZTY0QmluYXJ5IiAvPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iYmFzZTY0QmluYXJ5IiA+Ci0gICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmJhc2U2NEJpbmFyeSIgPgotICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJoZXhCaW5hcnkiIHR5cGU9InRuczpoZXhCaW5hcnkiIC8+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJoZXhCaW5hcnkiID4KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpoZXhCaW5hcnkiID4KLSAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIgLz4KLSAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9ImZsb2F0IiB0eXBlPSJ0bnM6ZmxvYXQiIC8+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJmbG9hdCIgPgotICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpmbG9hdCIgPgotICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJkb3VibGUiIHR5cGU9InRuczpkb3VibGUiIC8+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJkb3VibGUiID4KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6ZG91YmxlIiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9ImFueVVSSSIgdHlwZT0idG5zOmFueVVSSSIgLz4KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImFueVVSSSIgPgotICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czphbnlVUkkiID4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0iUU5hbWUiIHR5cGU9InRuczpRTmFtZSIgLz4KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IlFOYW1lIiA+Ci0gICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOlFOYW1lIiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0KLSAgPHhzOmVsZW1lbnQgbmFtZT0ic3RyaW5nIiB0eXBlPSJ0bnM6c3RyaW5nIiAvPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0ic3RyaW5nIiA+Ci0gICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOnN0cmluZyIgPgotICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJub3JtYWxpemVkU3RyaW5nIgotICAgICAgICAgICAgICB0eXBlPSJ0bnM6bm9ybWFsaXplZFN0cmluZyIgLz4KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Im5vcm1hbGl6ZWRTdHJpbmciID4KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6bm9ybWFsaXplZFN0cmluZyIgPgotICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJ0b2tlbiIgdHlwZT0idG5zOnRva2VuIiAvPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0idG9rZW4iID4KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6dG9rZW4iID4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0ibGFuZ3VhZ2UiIHR5cGU9InRuczpsYW5ndWFnZSIgLz4KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Imxhbmd1YWdlIiA+Ci0gICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmxhbmd1YWdlIiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9Ik5hbWUiIHR5cGU9InRuczpOYW1lIiAvPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iTmFtZSIgPgotICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpOYW1lIiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9Ik5NVE9LRU4iIHR5cGU9InRuczpOTVRPS0VOIiAvPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iTk1UT0tFTiIgPgotICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpOTVRPS0VOIiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9Ik5DTmFtZSIgdHlwZT0idG5zOk5DTmFtZSIgLz4KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Ik5DTmFtZSIgPgotICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpOQ05hbWUiID4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0iTk1UT0tFTlMiIHR5cGU9InRuczpOTVRPS0VOUyIgLz4KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Ik5NVE9LRU5TIiA+Ci0gICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOk5NVE9LRU5TIiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9IklEIiB0eXBlPSJ0bnM6SUQiIC8+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJJRCIgPgotICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpJRCIgPgotICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJJRFJFRiIgdHlwZT0idG5zOklEUkVGIiAvPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iSURSRUYiID4KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6SURSRUYiID4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0iRU5USVRZIiB0eXBlPSJ0bnM6RU5USVRZIiAvPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iRU5USVRZIiA+Ci0gICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOkVOVElUWSIgPgotICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJJRFJFRlMiIHR5cGU9InRuczpJRFJFRlMiIC8+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJJRFJFRlMiID4KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6SURSRUZTIiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9IkVOVElUSUVTIiB0eXBlPSJ0bnM6RU5USVRJRVMiIC8+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJFTlRJVElFUyIgPgotICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpFTlRJVElFUyIgPgotICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJkZWNpbWFsIiB0eXBlPSJ0bnM6ZGVjaW1hbCIgLz4KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImRlY2ltYWwiID4KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6ZGVjaW1hbCIgPgotICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJpbnRlZ2VyIiB0eXBlPSJ0bnM6aW50ZWdlciIgLz4KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImludGVnZXIiID4KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6aW50ZWdlciIgPgotICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJub25Qb3NpdGl2ZUludGVnZXIiCi0gICAgICAgICAgICAgIHR5cGU9InRuczpub25Qb3NpdGl2ZUludGVnZXIiIC8+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJub25Qb3NpdGl2ZUludGVnZXIiID4KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6bm9uUG9zaXRpdmVJbnRlZ2VyIiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9Im5lZ2F0aXZlSW50ZWdlciIgdHlwZT0idG5zOm5lZ2F0aXZlSW50ZWdlciIvPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0ibmVnYXRpdmVJbnRlZ2VyIiA+Ci0gICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOm5lZ2F0aXZlSW50ZWdlciIgPgotICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJsb25nIiB0eXBlPSJ0bnM6bG9uZyIgLz4KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImxvbmciID4KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6bG9uZyIgPgotICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJpbnQiIHR5cGU9InRuczppbnQiIC8+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJpbnQiID4KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6aW50IiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9InNob3J0IiB0eXBlPSJ0bnM6c2hvcnQiIC8+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJzaG9ydCIgPgotICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpzaG9ydCIgPgotICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJieXRlIiB0eXBlPSJ0bnM6Ynl0ZSIgLz4KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImJ5dGUiID4KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6Ynl0ZSIgPgotICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJub25OZWdhdGl2ZUludGVnZXIiCi0gICAgICAgICAgICAgIHR5cGU9InRuczpub25OZWdhdGl2ZUludGVnZXIiIC8+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJub25OZWdhdGl2ZUludGVnZXIiID4KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6bm9uTmVnYXRpdmVJbnRlZ2VyIiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9InVuc2lnbmVkTG9uZyIgdHlwZT0idG5zOnVuc2lnbmVkTG9uZyIgLz4KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InVuc2lnbmVkTG9uZyIgPgotICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czp1bnNpZ25lZExvbmciID4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0idW5zaWduZWRJbnQiIHR5cGU9InRuczp1bnNpZ25lZEludCIgLz4KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InVuc2lnbmVkSW50IiA+Ci0gICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOnVuc2lnbmVkSW50IiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9InVuc2lnbmVkU2hvcnQiIHR5cGU9InRuczp1bnNpZ25lZFNob3J0IiAvPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0idW5zaWduZWRTaG9ydCIgPgotICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czp1bnNpZ25lZFNob3J0IiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9InVuc2lnbmVkQnl0ZSIgdHlwZT0idG5zOnVuc2lnbmVkQnl0ZSIgLz4KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InVuc2lnbmVkQnl0ZSIgPgotICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czp1bnNpZ25lZEJ5dGUiID4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0icG9zaXRpdmVJbnRlZ2VyIiB0eXBlPSJ0bnM6cG9zaXRpdmVJbnRlZ2VyIi8+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJwb3NpdGl2ZUludGVnZXIiID4KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6cG9zaXRpdmVJbnRlZ2VyIiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9ImFueVR5cGUiIC8+Ci08L3hzOnNjaGVtYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi9zY2hlbWEveG1pbWUueHNkIGIvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vc2NoZW1hL3htaW1lLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWUzMmQzNy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi9zY2hlbWEveG1pbWUueHNkCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08eHM6c2NoZW1hIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgICAgeG1sbnM6dG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA2L3htbG1pbWUiCi0gICAgICAgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy53My5vcmcvMjAwNC8wNi94bWxtaW1lIiA+Ci0gPHhzOmF0dHJpYnV0ZSBuYW1lPSJjb250ZW50VHlwZSIgPgotICAgIDx4czpzaW1wbGVUeXBlPgotICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyIgPgotICAgICAgICA8eHM6cGF0dGVybiB2YWx1ZT0iKHRleHR8YXBwbGljYXRpb258aW1hZ2V8YXVkaW98dmlkZW98bW9kZWx8eC1bLS5hLXowLTldKykvW2EtejAtOV1bLS4rYS16MC05XSsoO1xzPy4rPS4rKSoiIC8+Ci0gICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgIDwveHM6c2ltcGxlVHlwZT4KLTwveHM6YXR0cmlidXRlPgotPHhzOmVsZW1lbnQgbmFtZT0iZXhwZWN0ZWRNZWRpYVR5cGUiID4KLSAgICA8eHM6c2ltcGxlVHlwZT4KLSAgICAgIDx4czpsaXN0IGl0ZW1UeXBlPSJ0bnM6ZXhwZWN0ZWRNZWRpYVR5cGVJdGVtIiAvPgotICAgIDwveHM6c2ltcGxlVHlwZT4KLTwveHM6ZWxlbWVudD4KLTx4czpzaW1wbGVUeXBlIG5hbWU9ImV4cGVjdGVkTWVkaWFUeXBlSXRlbSIgPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciID4KLSAgICAgICAgPHhzOnBhdHRlcm4gdmFsdWU9Iih0ZXh0fGFwcGxpY2F0aW9ufGltYWdlfGF1ZGlvfHZpZGVvfG1vZGVsfHgtWy0uYS16MC05XSspLygoW2EtejAtOV1bLS4rYS16MC05XSspfFwqKSIgLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotPC94czpzaW1wbGVUeXBlPgotPC94czpzY2hlbWE+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vd3JpdGVyL0FudEJ1aWxkV3JpdGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi93cml0ZXIvQW50QnVpbGRXcml0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTUwMzBkNy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi93cml0ZXIvQW50QnVpbGRXcml0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLndyaXRlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5YU0xUVGVtcGxhdGVQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLnV0aWwuQ29uZmlnUHJvcGVydHlGaWxlTG9hZGVyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5VUklSZXNvbHZlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1wdWJsaWMgY2xhc3MgQW50QnVpbGRXcml0ZXIgZXh0ZW5kcyBGaWxlV3JpdGVyIHsKLQotICAgIHByaXZhdGUgU3RyaW5nIGRhdGFiaW5kaW5nRnJhbWV3b3JrID0gQ29uZmlnUHJvcGVydHlGaWxlTG9hZGVyLmdldERlZmF1bHREQkZyYW1ld29ya05hbWUoKTsKLQotICAgIHB1YmxpYyBBbnRCdWlsZFdyaXRlcihTdHJpbmcgb3V0cHV0RmlsZUxvY2F0aW9uKSB7Ci0gICAgICAgIHRoaXMub3V0cHV0RmlsZUxvY2F0aW9uID0gbmV3IEZpbGUob3V0cHV0RmlsZUxvY2F0aW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQW50QnVpbGRXcml0ZXIoRmlsZSBvdXRwdXRGaWxlTG9jYXRpb24sIFN0cmluZyBsYW5ndWFnZSkgewotICAgICAgICB0aGlzLm91dHB1dEZpbGVMb2NhdGlvbiA9IG91dHB1dEZpbGVMb2NhdGlvbjsKLSAgICAgICAgdGhpcy5sYW5ndWFnZSA9IGxhbmd1YWdlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERhdGFiaW5kaW5nRnJhbWV3b3JrKFN0cmluZyBkYXRhYmluZGluZ0ZyYW1ld29yaykgewotICAgICAgICB0aGlzLmRhdGFiaW5kaW5nRnJhbWV3b3JrID0gZGF0YWJpbmRpbmdGcmFtZXdvcms7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY3JlYXRlT3V0RmlsZShTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyBmaWxlTmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIG91dHB1dEZpbGUgPSBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuRmlsZVdyaXRlci5jcmVhdGVDbGFzc0ZpbGUob3V0cHV0RmlsZUxvY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJ1aWxkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi54bWwiKTsKLSAgICAgICAgLy9zZXQgdGhlIGV4aXN0aW5nIGZsYWcKLSAgICAgICAgZmlsZUV4aXN0cyA9IG91dHB1dEZpbGUuZXhpc3RzKCk7Ci0gICAgICAgIGlmICghZmlsZUV4aXN0cykgewotICAgICAgICAgICAgdGhpcy5zdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbShvdXRwdXRGaWxlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vb3ZlcnJpZGRlbiB0byBnZXQgdGhlIGNvcnJlY3QgYmVoYXZpb3IKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGZpbmRUZW1wbGF0ZShNYXAgbGFuZ3VhZ2VTcGVjaWZpY1Byb3BlcnR5TWFwKSB7Ci0gICAgICAgIFN0cmluZyBvd25DbGF6ek5hbWUgPSB0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpOwotICAgICAgICBTdHJpbmcga2V5OwotICAgICAgICBTdHJpbmcgcHJvcGVydHlWYWx1ZTsKLSAgICAgICAgU3RyaW5nIHRlbXBsYXRlTmFtZSA9IG51bGw7Ci0gICAgICAgIEl0ZXJhdG9yIGtleXMgPSBsYW5ndWFnZVNwZWNpZmljUHJvcGVydHlNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQotCi0gICAgICAgIHdoaWxlIChrZXlzLmhhc05leHQoKSkgewotICAgICAgICAgICAgLy9jaGVjayBmb3IgdGVtcGxhdGUgZW50cmllcwotICAgICAgICAgICAga2V5ID0ga2V5cy5uZXh0KCkudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIGlmIChrZXkuZW5kc1dpdGgoVEVNUExBVEVfU1VGRklYKSkgewotICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoZSBjbGFzcyBuYW1lIGlzIHRoZXJlCi0gICAgICAgICAgICAgICAgcHJvcGVydHlWYWx1ZSA9IGxhbmd1YWdlU3BlY2lmaWNQcm9wZXJ0eU1hcC5nZXQoa2V5KS50b1N0cmluZygpOwotICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eVZhbHVlLnN0YXJ0c1dpdGgob3duQ2xhenpOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoa2V5LmluZGV4T2YoZGF0YWJpbmRpbmdGcmFtZXdvcmspICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZU5hbWUgPSBwcm9wZXJ0eVZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zdWJzdHJpbmcocHJvcGVydHlWYWx1ZS5pbmRleE9mKFNFUEFSQVRPUl9TVFJJTkcpICsgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRlbXBsYXRlTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZXMgdGhlIG91dHB1dCBmaWxlLgotICAgICAqCi0gICAgICogQHBhcmFtIGRvYwotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcGFyc2UoRG9jdW1lbnQgZG9jLCBVUklSZXNvbHZlciByZXNvbHZlcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghZmlsZUV4aXN0cykgewotICAgICAgICAgICAgWFNMVFRlbXBsYXRlUHJvY2Vzc29yLnBhcnNlKHRoaXMuc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnhzbHRTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZXIpOwotICAgICAgICAgICAgdGhpcy5zdHJlYW0uZmx1c2goKTsKLSAgICAgICAgICAgIHRoaXMuc3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi93cml0ZXIvQ0J1aWxkU2NyaXB0V3JpdGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi93cml0ZXIvQ0J1aWxkU2NyaXB0V3JpdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5MzkxNmUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vd3JpdGVyL0NCdWlsZFNjcmlwdFdyaXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi53cml0ZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotCi1wdWJsaWMgY2xhc3MgQ0J1aWxkU2NyaXB0V3JpdGVyIGV4dGVuZHMgRmlsZVdyaXRlciB7Ci0KLSAgICAgICBwdWJsaWMgQ0J1aWxkU2NyaXB0V3JpdGVyKEZpbGUgb3V0cHV0RmlsZUxvY2F0aW9uLFN0cmluZyBsYW5ndWFnZSkgewotICAgICAgICB0aGlzLm91dHB1dEZpbGVMb2NhdGlvbiA9IG91dHB1dEZpbGVMb2NhdGlvbjsKLSAgICAgICAgICAgdGhpcy5sYW5ndWFnZSA9IGxhbmd1YWdlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZU91dEZpbGUoU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgZmlsZU5hbWUpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBvdXRwdXRGaWxlID0gb3JnLmFwYWNoZS5heGlzMi51dGlsLkZpbGVXcml0ZXIuY3JlYXRlQ2xhc3NGaWxlKG91dHB1dEZpbGVMb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJ1aWxkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIuc2giKTsKLSAgICAgICAgLy9zZXQgdGhlIGV4aXN0aW5nIGZsYWcKLSAgICAgICAgZmlsZUV4aXN0cyA9IG91dHB1dEZpbGUuZXhpc3RzKCk7Ci0gICAgICAgIGlmICghZmlsZUV4aXN0cykgewotICAgICAgICAgICAgdGhpcy5zdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbShvdXRwdXRGaWxlKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL3dyaXRlci9DU2VydmljZVhNTFdyaXRlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vd3JpdGVyL0NTZXJ2aWNlWE1MV3JpdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5YjA3OWEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vd3JpdGVyL0NTZXJ2aWNlWE1MV3JpdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLndyaXRlcjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci0KLXB1YmxpYyBjbGFzcyBDU2VydmljZVhNTFdyaXRlciBleHRlbmRzIEZpbGVXcml0ZXIgewotCi0KLSAgICBwdWJsaWMgQ1NlcnZpY2VYTUxXcml0ZXIoU3RyaW5nIG91dHB1dEZpbGVMb2NhdGlvbikgewotICAgICAgICB0aGlzLm91dHB1dEZpbGVMb2NhdGlvbiA9IG5ldyBGaWxlKG91dHB1dEZpbGVMb2NhdGlvbik7Ci0gICAgfQotCi0gICAgcHVibGljIENTZXJ2aWNlWE1MV3JpdGVyKEZpbGUgb3V0cHV0RmlsZUxvY2F0aW9uLCBTdHJpbmcgbGFuZ3VhZ2UpIHsKLSAgICAgICAgdGhpcy5vdXRwdXRGaWxlTG9jYXRpb24gPSBvdXRwdXRGaWxlTG9jYXRpb247Ci0gICAgICAgIHRoaXMubGFuZ3VhZ2UgPSBsYW5ndWFnZTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZU91dEZpbGUoU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgZmlsZU5hbWUpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBvdXRwdXRGaWxlID0gb3JnLmFwYWNoZS5heGlzMi51dGlsLkZpbGVXcml0ZXIuY3JlYXRlQ2xhc3NGaWxlKG91dHB1dEZpbGVMb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNlcnZpY2VzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIueG1sIik7Ci0gICAgICAgIC8vc2V0IHRoZSBleGlzdGluZyBmbGFnCi0gICAgICAgIGZpbGVFeGlzdHMgPSBvdXRwdXRGaWxlLmV4aXN0cygpOwotICAgICAgICBpZiAoIWZpbGVFeGlzdHMpIHsKLSAgICAgICAgICAgIHRoaXMuc3RyZWFtID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0ob3V0cHV0RmlsZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi93cml0ZXIvQ1NrZWxIZWFkZXJXcml0ZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL3dyaXRlci9DU2tlbEhlYWRlcldyaXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTk0NDNjLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL3dyaXRlci9DU2tlbEhlYWRlcldyaXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi53cml0ZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLQotcHVibGljIGNsYXNzIENTa2VsSGVhZGVyV3JpdGVyIGV4dGVuZHMgQ1N0dWJIZWFkZXJXcml0ZXIgewotCi0gICAgcHVibGljIENTa2VsSGVhZGVyV3JpdGVyKFN0cmluZyBvdXRwdXRGaWxlTG9jYXRpb24pIHsKLSAgICAgICAgc3VwZXIob3V0cHV0RmlsZUxvY2F0aW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ1NrZWxIZWFkZXJXcml0ZXIoRmlsZSBvdXRwdXRGaWxlTG9jYXRpb24sIFN0cmluZyBsYW5ndWFnZSkgewotICAgICAgICBzdXBlcihvdXRwdXRGaWxlTG9jYXRpb24sIGxhbmd1YWdlKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL3dyaXRlci9DU2tlbFNvdXJjZVdyaXRlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vd3JpdGVyL0NTa2VsU291cmNlV3JpdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhYWVmYmQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vd3JpdGVyL0NTa2VsU291cmNlV3JpdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLndyaXRlcjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotcHVibGljIGNsYXNzIENTa2VsU291cmNlV3JpdGVyIGV4dGVuZHMgQ1N0dWJTb3VyY2VXcml0ZXIgewotCi0gICAgcHVibGljIENTa2VsU291cmNlV3JpdGVyKFN0cmluZyBvdXRwdXRGaWxlTG9jYXRpb24pIHsKLSAgICAgICAgc3VwZXIob3V0cHV0RmlsZUxvY2F0aW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ1NrZWxTb3VyY2VXcml0ZXIoRmlsZSBvdXRwdXRGaWxlTG9jYXRpb24sIFN0cmluZyBsYW5ndWFnZSkgewotICAgICAgICBzdXBlcihvdXRwdXRGaWxlTG9jYXRpb24sIGxhbmd1YWdlKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL3dyaXRlci9DU3R1YkhlYWRlcldyaXRlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vd3JpdGVyL0NTdHViSGVhZGVyV3JpdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzNTMyYTAuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vd3JpdGVyL0NTdHViSGVhZGVyV3JpdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLndyaXRlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5YU0xUVGVtcGxhdGVQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlVSSVJlc29sdmVyOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci0KLXB1YmxpYyBjbGFzcyBDU3R1YkhlYWRlcldyaXRlciBleHRlbmRzIEZpbGVXcml0ZXIgewotCi0gICAgcHVibGljIENTdHViSGVhZGVyV3JpdGVyKFN0cmluZyBvdXRwdXRGaWxlTG9jYXRpb24pIHsKLSAgICAgICAgdGhpcy5vdXRwdXRGaWxlTG9jYXRpb24gPSBuZXcgRmlsZShvdXRwdXRGaWxlTG9jYXRpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyBDU3R1YkhlYWRlcldyaXRlcihGaWxlIG91dHB1dEZpbGVMb2NhdGlvbiwgU3RyaW5nIGxhbmd1YWdlKSB7Ci0gICAgICAgIHRoaXMub3V0cHV0RmlsZUxvY2F0aW9uID0gb3V0cHV0RmlsZUxvY2F0aW9uOwotICAgICAgICB0aGlzLmxhbmd1YWdlID0gbGFuZ3VhZ2U7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY3JlYXRlT3V0RmlsZShTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyBmaWxlTmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIG91dHB1dEZpbGUgPSBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuRmlsZVdyaXRlci5jcmVhdGVDbGFzc0ZpbGUob3V0cHV0RmlsZUxvY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIuaCIpOwotICAgICAgICAvL3NldCB0aGUgZXhpc3RpbmcgZmxhZwotICAgICAgICBmaWxlRXhpc3RzID0gb3V0cHV0RmlsZS5leGlzdHMoKTsKLSAgICAgICAgaWYgKCFmaWxlRXhpc3RzKSB7Ci0gICAgICAgICAgICB0aGlzLnN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKG91dHB1dEZpbGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV3JpdGVzIHRoZSBvdXRwdXQgZmlsZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBkb2MKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHBhcnNlKERvY3VtZW50IGRvYywgVVJJUmVzb2x2ZXIgcmVzb2x2ZXIpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIWZpbGVFeGlzdHMpIHsKLSAgICAgICAgICAgIFhTTFRUZW1wbGF0ZVByb2Nlc3Nvci5wYXJzZSh0aGlzLnN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy54c2x0U3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVyKTsKLSAgICAgICAgICAgIHRoaXMuc3RyZWFtLndyaXRlKCdcbicpOwotICAgICAgICAgICAgdGhpcy5zdHJlYW0ud3JpdGUoJ1xuJyk7Ci0gICAgICAgICAgICB0aGlzLnN0cmVhbS5mbHVzaCgpOwotICAgICAgICAgICAgdGhpcy5zdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL3dyaXRlci9DU3R1YlNvdXJjZVdyaXRlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vd3JpdGVyL0NTdHViU291cmNlV3JpdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmZTdmMmEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vd3JpdGVyL0NTdHViU291cmNlV3JpdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLndyaXRlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5YU0xUVGVtcGxhdGVQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlVSSVJlc29sdmVyOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci0KLXB1YmxpYyBjbGFzcyBDU3R1YlNvdXJjZVdyaXRlciBleHRlbmRzIEZpbGVXcml0ZXIgewotCi0gICAgcHVibGljIENTdHViU291cmNlV3JpdGVyKFN0cmluZyBvdXRwdXRGaWxlTG9jYXRpb24pIHsKLSAgICAgICAgdGhpcy5vdXRwdXRGaWxlTG9jYXRpb24gPSBuZXcgRmlsZShvdXRwdXRGaWxlTG9jYXRpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyBDU3R1YlNvdXJjZVdyaXRlcihGaWxlIG91dHB1dEZpbGVMb2NhdGlvbiwgU3RyaW5nIGxhbmd1YWdlKSB7Ci0gICAgICAgIHRoaXMub3V0cHV0RmlsZUxvY2F0aW9uID0gb3V0cHV0RmlsZUxvY2F0aW9uOwotICAgICAgICB0aGlzLmxhbmd1YWdlID0gbGFuZ3VhZ2U7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY3JlYXRlT3V0RmlsZShTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyBmaWxlTmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIG91dHB1dEZpbGUgPSBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuRmlsZVdyaXRlci5jcmVhdGVDbGFzc0ZpbGUob3V0cHV0RmlsZUxvY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEZpbGVFeHRlbnNpb25Gb3JMYW5ndWFnZShsYW5ndWFnZSkpOwotICAgICAgICAvL3NldCB0aGUgZXhpc3RpbmcgZmxhZwotICAgICAgICBmaWxlRXhpc3RzID0gb3V0cHV0RmlsZS5leGlzdHMoKTsKLSAgICAgICAgaWYgKCFmaWxlRXhpc3RzKSB7Ci0gICAgICAgICAgICB0aGlzLnN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKG91dHB1dEZpbGUpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZXMgdGhlIG91dHB1dCBmaWxlLgotICAgICAqCi0gICAgICogQHBhcmFtIGRvYwotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcGFyc2UoRG9jdW1lbnQgZG9jLCBVUklSZXNvbHZlciByZXNvbHZlcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghZmlsZUV4aXN0cykgewotICAgICAgICAgICAgWFNMVFRlbXBsYXRlUHJvY2Vzc29yLnBhcnNlKHRoaXMuc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnhzbHRTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZXIpOwotICAgICAgICAgICAgdGhpcy5zdHJlYW0ud3JpdGUoJ1xuJyk7Ci0gICAgICAgICAgICB0aGlzLnN0cmVhbS53cml0ZSgnXG4nKTsKLSAgICAgICAgICAgIHRoaXMuc3RyZWFtLmZsdXNoKCk7Ci0gICAgICAgICAgICB0aGlzLnN0cmVhbS5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vd3JpdGVyL0NTdmNTa2VsZXRvbldyaXRlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vd3JpdGVyL0NTdmNTa2VsZXRvbldyaXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjkzNzAxLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL3dyaXRlci9DU3ZjU2tlbGV0b25Xcml0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4ud3JpdGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLlhTTFRUZW1wbGF0ZVByb2Nlc3NvcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVVJJUmVzb2x2ZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLQotcHVibGljIGNsYXNzIENTdmNTa2VsZXRvbldyaXRlciBleHRlbmRzIEZpbGVXcml0ZXIgewotCi0gICAgcHVibGljIENTdmNTa2VsZXRvbldyaXRlcihTdHJpbmcgb3V0cHV0RmlsZUxvY2F0aW9uKSB7Ci0gICAgICAgIHRoaXMub3V0cHV0RmlsZUxvY2F0aW9uID0gbmV3IEZpbGUob3V0cHV0RmlsZUxvY2F0aW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ1N2Y1NrZWxldG9uV3JpdGVyKEZpbGUgb3V0cHV0RmlsZUxvY2F0aW9uLCBTdHJpbmcgbGFuZ3VhZ2UpIHsKLSAgICAgICAgdGhpcy5vdXRwdXRGaWxlTG9jYXRpb24gPSBvdXRwdXRGaWxlTG9jYXRpb247Ci0gICAgICAgIHRoaXMubGFuZ3VhZ2UgPSBsYW5ndWFnZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVPdXRGaWxlKFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIGZpbGVOYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgb3V0cHV0RmlsZSA9IG9yZy5hcGFjaGUuYXhpczIudXRpbC5GaWxlV3JpdGVyLmNyZWF0ZUNsYXNzRmlsZShvdXRwdXRGaWxlTG9jYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RmlsZUV4dGVuc2lvbkZvckxhbmd1YWdlKGxhbmd1YWdlKSk7Ci0gICAgICAgIC8vc2V0IHRoZSBleGlzdGluZyBmbGFnCi0gICAgICAgIGZpbGVFeGlzdHMgPSBvdXRwdXRGaWxlLmV4aXN0cygpOwotICAgICAgICBpZiAoIWZpbGVFeGlzdHMpIHsKLSAgICAgICAgICAgIHRoaXMuc3RyZWFtID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0ob3V0cHV0RmlsZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZXMgdGhlIG91dHB1dCBmaWxlLgotICAgICAqCi0gICAgICogQHBhcmFtIGRvYwotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcGFyc2UoRG9jdW1lbnQgZG9jLCBVUklSZXNvbHZlciByZXNvbHZlcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghZmlsZUV4aXN0cykgewotICAgICAgICAgICAgWFNMVFRlbXBsYXRlUHJvY2Vzc29yLnBhcnNlKHRoaXMuc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnhzbHRTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZXIpOwotICAgICAgICAgICAgdGhpcy5zdHJlYW0ud3JpdGUoJ1xuJyk7Ci0gICAgICAgICAgICB0aGlzLnN0cmVhbS53cml0ZSgnXG4nKTsKLSAgICAgICAgICAgIHRoaXMuc3RyZWFtLmZsdXNoKCk7Ci0gICAgICAgICAgICB0aGlzLnN0cmVhbS5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi93cml0ZXIvQ2FsbGJhY2tIYW5kbGVyV3JpdGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi93cml0ZXIvQ2FsbGJhY2tIYW5kbGVyV3JpdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjY2JjZWEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vd3JpdGVyL0NhbGxiYWNrSGFuZGxlcldyaXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi53cml0ZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLXB1YmxpYyBjbGFzcyBDYWxsYmFja0hhbmRsZXJXcml0ZXIgZXh0ZW5kcyBGaWxlV3JpdGVyIHsKLQotICAgIHB1YmxpYyBDYWxsYmFja0hhbmRsZXJXcml0ZXIoU3RyaW5nIG91dHB1dEZpbGVMb2NhdGlvbikgewotICAgICAgICB0aGlzLm91dHB1dEZpbGVMb2NhdGlvbiA9IG5ldyBGaWxlKG91dHB1dEZpbGVMb2NhdGlvbik7Ci0gICAgfQotCi0gICAgcHVibGljIENhbGxiYWNrSGFuZGxlcldyaXRlcihGaWxlIG91dHB1dEZpbGVMb2NhdGlvbiwgU3RyaW5nIGxhbmd1YWdlKSB7Ci0gICAgICAgIHRoaXMub3V0cHV0RmlsZUxvY2F0aW9uID0gb3V0cHV0RmlsZUxvY2F0aW9uOwotICAgICAgICB0aGlzLmxhbmd1YWdlID0gbGFuZ3VhZ2U7Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL3dyaXRlci9FeGNlcHRpb25Xcml0ZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL3dyaXRlci9FeGNlcHRpb25Xcml0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQzOGUyNC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi93cml0ZXIvRXhjZXB0aW9uV3JpdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLndyaXRlcjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotcHVibGljIGNsYXNzIEV4Y2VwdGlvbldyaXRlciBleHRlbmRzIEZpbGVXcml0ZXIgewotCi0gICAgcHVibGljIEV4Y2VwdGlvbldyaXRlcihTdHJpbmcgb3V0cHV0RmlsZUxvY2F0aW9uKSB7Ci0gICAgICAgIHRoaXMub3V0cHV0RmlsZUxvY2F0aW9uID0gbmV3IEZpbGUob3V0cHV0RmlsZUxvY2F0aW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRXhjZXB0aW9uV3JpdGVyKEZpbGUgb3V0cHV0RmlsZUxvY2F0aW9uLCBTdHJpbmcgbGFuZ3VhZ2UpIHsKLSAgICAgICAgdGhpcy5vdXRwdXRGaWxlTG9jYXRpb24gPSBvdXRwdXRGaWxlTG9jYXRpb247Ci0gICAgICAgIHRoaXMubGFuZ3VhZ2UgPSBsYW5ndWFnZTsKLSAgICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vd3JpdGVyL0ZpbGVXcml0ZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL3dyaXRlci9GaWxlV3JpdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzZjdhYjQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vd3JpdGVyL0ZpbGVXcml0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLndyaXRlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaTE4bi5NZXNzYWdlczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuWFNMVFRlbXBsYXRlUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLkNvZGVHZW5lcmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5pMThuLkNvZGVnZW5NZXNzYWdlczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwudXRpbC5Db25maWdQcm9wZXJ0eUZpbGVMb2FkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlVSSVJlc29sdmVyOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEZpbGVXcml0ZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEZpbGVXcml0ZXIuY2xhc3MpOwotCi0gICAgcHJvdGVjdGVkIEZpbGUgb3V0cHV0RmlsZUxvY2F0aW9uID0gbnVsbDsKLSAgICBwcm90ZWN0ZWQgRmlsZSBvdXRwdXRGaWxlID0gbnVsbDsKLSAgICBwcm90ZWN0ZWQgRmlsZU91dHB1dFN0cmVhbSBzdHJlYW0gPSBudWxsOwotICAgIHByb3RlY3RlZCBJbnB1dFN0cmVhbSB4c2x0U3RyZWFtID0gbnVsbDsKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGxhbmd1YWdlID0gQ29uZmlnUHJvcGVydHlGaWxlTG9hZGVyLmdldERlZmF1bHRMYW5ndWFnZSgpOyAvL2RlZmF1bHQgd291bGQgamF2YQotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVNUExBVEVfU1VGRklYID0gIi50ZW1wbGF0ZSI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1NVRkZJWCA9ICIuZXh0ZW5zaW9uIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTRVBBUkFUT1JfU1RSSU5HID0gIiwiOwotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZmlsZUV4aXN0cyA9IGZhbHNlOy8vYSBmbGFnIHNheWluZyB0aGUgZmlsZSBpcyBleGlzdGluZwotICAgIHByb3RlY3RlZCBib29sZWFuIGlzT3ZlcnJpZGUgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGxhbmd1YWdlLgotICAgICAqCi0gICAgICogQHBhcmFtIGxhbmd1YWdlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TGFuZ3VhZ2UoU3RyaW5nIGxhbmd1YWdlKSB7Ci0gICAgICAgIHRoaXMubGFuZ3VhZ2UgPSBsYW5ndWFnZTsKLSAgICB9Ci0KLSAgICAvKiogTG9hZHMgdGhlIHRlbXBsYXRlLiAqLwotICAgIHB1YmxpYyB2b2lkIGxvYWRUZW1wbGF0ZSgpIHRocm93cyBDb2RlR2VuZXJhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIHRoZSBkZWZhdWx0IGJlaGF2aW9yIGZvciB0aGUgY2xhc3Mgd3JpdGVycyBpcyB0byB1c2UgdGhlIHByb3BlcnR5IG1hcCBmcm9tIHRoZSBsYW5ndWdlIHNwZWNpZmljIHR5cGVzCi0gICAgICAgIC8vIFRoZSBwcm9wZXJ0aWVzIGFyZSBhcnJhbmdlZCBpbiB0aGUgZm9sbG93aW5nIG9yZGVyCi0gICAgICAgIC8vIDxsYW5nLW5hbWU+LiogLnRlbXBsYXRlPTx3cml0ZS1jbGFzcz4sPHRlbXBsYXRlLW5hbWU+Ci0KLSAgICAgICAgLy9maXJzdCBnZXQgdGhlIGxhbmd1YWdlIHNwZWNpZmljIHByb3BlcnR5IG1hcAotICAgICAgICBDbGFzcyBjbGF6eiA9IHRoaXMuZ2V0Q2xhc3MoKTsKLSAgICAgICAgTWFwIGxhbmd1YWdlU3BlY2lmaWNQcm9wZXJ0eU1hcCA9Ci0gICAgICAgICAgICAgICAgKE1hcClDb25maWdQcm9wZXJ0eUZpbGVMb2FkZXIuZ2V0TGFuZ3VhZ2VTcGVjaWZpY1Byb3BlcnRpZXNNYXAoKS5nZXQodGhpcy5sYW5ndWFnZSk7Ci0gICAgICAgIGlmIChsYW5ndWFnZVNwZWNpZmljUHJvcGVydHlNYXAgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENvZGVHZW5lcmF0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICBDb2RlZ2VuTWVzc2FnZXMuZ2V0TWVzc2FnZSgid3JpdGVyLm5vTGFuZ1Byb3BlcnRpZXNFeHRlbnNpb24iKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgdGVtcGxhdGVOYW1lID0gZmluZFRlbXBsYXRlKGxhbmd1YWdlU3BlY2lmaWNQcm9wZXJ0eU1hcCk7Ci0gICAgICAgIGlmICh0ZW1wbGF0ZU5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgdGhpcy54c2x0U3RyZWFtID0gY2xhenouZ2V0UmVzb3VyY2VBc1N0cmVhbSh0ZW1wbGF0ZU5hbWUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IENvZGVHZW5lcmF0aW9uRXhjZXB0aW9uKENvZGVnZW5NZXNzYWdlcy5nZXRNZXNzYWdlKCJ3cml0ZXIudGVtcGxhdGVNaXNzaW5nIikpOwotICAgICAgICB9Ci0KLQotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZmluZFRlbXBsYXRlKE1hcCBsYW5ndWFnZVNwZWNpZmljUHJvcGVydHlNYXApIHsKLSAgICAgICAgLy9zZWFyY2ggdGhyb3VnaCB0aGUgcHJvcHJ0eSBuYW1lcyB0byBmaW5kIHRoZSB0ZW1wbGF0ZSByZWxldmFudCB0byB0aGlzIGNsYXNzCi0KLSAgICAgICAgU3RyaW5nIG93bkNsYXp6TmFtZSA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0gICAgICAgIFN0cmluZyBrZXk7Ci0gICAgICAgIFN0cmluZyBwcm9wZXJ0eVZhbHVlOwotICAgICAgICBTdHJpbmcgdGVtcGxhdGVOYW1lID0gbnVsbDsKLSAgICAgICAgSXRlcmF0b3Iga2V5cyA9IGxhbmd1YWdlU3BlY2lmaWNQcm9wZXJ0eU1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOwotCi0gICAgICAgIHdoaWxlIChrZXlzLmhhc05leHQoKSkgewotICAgICAgICAgICAgLy9jaGVjayBmb3IgdGVtcGxhdGUgZW50cmllcwotICAgICAgICAgICAga2V5ID0ga2V5cy5uZXh0KCkudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIGlmIChrZXkuZW5kc1dpdGgoVEVNUExBVEVfU1VGRklYKSkgewotICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoZSBjbGFzcyBuYW1lIGlzIHRoZXJlCi0gICAgICAgICAgICAgICAgcHJvcGVydHlWYWx1ZSA9IGxhbmd1YWdlU3BlY2lmaWNQcm9wZXJ0eU1hcC5nZXQoa2V5KS50b1N0cmluZygpOwotICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eVZhbHVlLnN0YXJ0c1dpdGgob3duQ2xhenpOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICAvL2JpbmdvISB3ZSBmb3VuZCB0aGUgcmlnaHQgdGVtcGxhdGUKLSAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVOYW1lID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVZhbHVlLnN1YnN0cmluZyhwcm9wZXJ0eVZhbHVlLmluZGV4T2YoU0VQQVJBVE9SX1NUUklORykgKyAxKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRlbXBsYXRlTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBvdXRwdXQgZmlsZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYWNrYWdlTmFtZQotICAgICAqIEBwYXJhbSBmaWxlTmFtZQotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY3JlYXRlT3V0RmlsZShTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyBmaWxlTmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIG91dHB1dEZpbGUgPSBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuRmlsZVdyaXRlci5jcmVhdGVDbGFzc0ZpbGUob3V0cHV0RmlsZUxvY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEZpbGVFeHRlbnNpb25Gb3JMYW5ndWFnZShsYW5ndWFnZSkpOwotICAgICAgICAvL3NldCB0aGUgZXhpc3RpbmcgZmxhZwotICAgICAgICBpZiAodGhpcy5pc092ZXJyaWRlKSB7Ci0gICAgICAgICAgICB0aGlzLnN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKG91dHB1dEZpbGUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZmlsZUV4aXN0cyA9IG91dHB1dEZpbGUuZXhpc3RzKCk7Ci0gICAgICAgICAgICBpZiAoIWZpbGVFeGlzdHMpIHsKLSAgICAgICAgICAgICAgICB0aGlzLnN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKG91dHB1dEZpbGUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBsb2cuaW5mbyhNZXNzYWdlcy5nZXRNZXNzYWdlKCJmaWxlRXhpc3RzTm9PdmVyd3JpdGUiLCBvdXRwdXRGaWxlLnRvU3RyaW5nKCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmluZHMgdGhlIGZpbGUgbmFtZSBleHRlbnNpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbGFuZ3VhZ2UKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGZpbGUgZXh0ZW5zaW9uLgotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RmlsZUV4dGVuc2lvbkZvckxhbmd1YWdlKFN0cmluZyBsYW5ndWFnZSkgewotICAgICAgICBNYXAgbGFuZ3VhZ2VTcGVjaWZpY1Byb3BlcnR5TWFwID0KLSAgICAgICAgICAgICAgICAoTWFwKUNvbmZpZ1Byb3BlcnR5RmlsZUxvYWRlci5nZXRMYW5ndWFnZVNwZWNpZmljUHJvcGVydGllc01hcCgpLmdldCh0aGlzLmxhbmd1YWdlKTsKLSAgICAgICAgSXRlcmF0b3Iga2V5cyA9IGxhbmd1YWdlU3BlY2lmaWNQcm9wZXJ0eU1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOwotICAgICAgICBTdHJpbmcga2V5OwotICAgICAgICBTdHJpbmcgZXh0ZW5zaW9uID0gbnVsbDsKLSAgICAgICAgd2hpbGUgKGtleXMuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAvL2NoZWNrIGZvciB0ZW1wbGF0ZSBlbnRyaWVzCi0gICAgICAgICAgICBrZXkgPSBrZXlzLm5leHQoKS50b1N0cmluZygpOwotICAgICAgICAgICAgaWYgKGtleS5lbmRzV2l0aChFWFRFTlNJT05fU1VGRklYKSkgewotICAgICAgICAgICAgICAgIGV4dGVuc2lvbiA9IGxhbmd1YWdlU3BlY2lmaWNQcm9wZXJ0eU1hcC5nZXQoa2V5KS50b1N0cmluZygpOwotICAgICAgICAgICAgICAgIC8vYWRkIGEgLiB0byB0aGUgZnJvbnQKLSAgICAgICAgICAgICAgICBleHRlbnNpb24gPSAiLiIgKyBleHRlbnNpb247Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZXh0ZW5zaW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdyaXRlcyB0aGUgb3V0cHV0IGZpbGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZG9jCi0gICAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwYXJzZShEb2N1bWVudCBkb2MsIFVSSVJlc29sdmVyIHJlc29sdmVyKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFmaWxlRXhpc3RzKSB7Ci0gICAgICAgICAgICBYU0xUVGVtcGxhdGVQcm9jZXNzb3IucGFyc2UodGhpcy5zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMueHNsdFN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlcik7Ci0gICAgICAgICAgICB0aGlzLnN0cmVhbS5mbHVzaCgpOwotICAgICAgICAgICAgdGhpcy5zdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzT3ZlcnJpZGUoKSB7Ci0gICAgICAgIHJldHVybiBpc092ZXJyaWRlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE92ZXJyaWRlKGJvb2xlYW4gb3ZlcnJpZGUpIHsKLSAgICAgICAgaXNPdmVycmlkZSA9IG92ZXJyaWRlOwotICAgIH0KLQotICAgIHB1YmxpYyBGaWxlIGdldE91dHB1dEZpbGUoKSB7Ci0gICAgICAgIHJldHVybiBvdXRwdXRGaWxlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE91dHB1dEZpbGUoRmlsZSBvdXRwdXRGaWxlKSB7Ci0gICAgICAgIHRoaXMub3V0cHV0RmlsZSA9IG91dHB1dEZpbGU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vd3JpdGVyL0ludGVyZmFjZUltcGxlbWVudGF0aW9uV3JpdGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi93cml0ZXIvSW50ZXJmYWNlSW1wbGVtZW50YXRpb25Xcml0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdkMTczZC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi93cml0ZXIvSW50ZXJmYWNlSW1wbGVtZW50YXRpb25Xcml0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4ud3JpdGVyOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1wdWJsaWMgY2xhc3MgSW50ZXJmYWNlSW1wbGVtZW50YXRpb25Xcml0ZXIgZXh0ZW5kcyBGaWxlV3JpdGVyIHsKLSAgICBwdWJsaWMgSW50ZXJmYWNlSW1wbGVtZW50YXRpb25Xcml0ZXIoU3RyaW5nIG91dHB1dEZpbGVMb2NhdGlvbikgewotICAgICAgICB0aGlzLm91dHB1dEZpbGVMb2NhdGlvbiA9IG5ldyBGaWxlKG91dHB1dEZpbGVMb2NhdGlvbik7Ci0gICAgfQotCi0gICAgcHVibGljIEludGVyZmFjZUltcGxlbWVudGF0aW9uV3JpdGVyKEZpbGUgb3V0cHV0RmlsZUxvY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGFuZ3VhZ2UpIHsKLSAgICAgICAgdGhpcy5vdXRwdXRGaWxlTG9jYXRpb24gPSBvdXRwdXRGaWxlTG9jYXRpb247Ci0gICAgICAgIHRoaXMubGFuZ3VhZ2UgPSBsYW5ndWFnZTsKLSAgICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vd3JpdGVyL0ludGVyZmFjZVdyaXRlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vd3JpdGVyL0ludGVyZmFjZVdyaXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTk5ZWQyLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL3dyaXRlci9JbnRlcmZhY2VXcml0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4ud3JpdGVyOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1wdWJsaWMgY2xhc3MgSW50ZXJmYWNlV3JpdGVyIGV4dGVuZHMgRmlsZVdyaXRlciB7Ci0KLQotICAgIHB1YmxpYyBJbnRlcmZhY2VXcml0ZXIoU3RyaW5nIG91dHB1dEZpbGVMb2NhdGlvbikgewotICAgICAgICB0aGlzLm91dHB1dEZpbGVMb2NhdGlvbiA9IG5ldyBGaWxlKG91dHB1dEZpbGVMb2NhdGlvbik7Ci0gICAgfQotCi0gICAgcHVibGljIEludGVyZmFjZVdyaXRlcihGaWxlIG91dHB1dEZpbGVMb2NhdGlvbiwgU3RyaW5nIGxhbmd1YWdlKSB7Ci0gICAgICAgIHRoaXMub3V0cHV0RmlsZUxvY2F0aW9uID0gb3V0cHV0RmlsZUxvY2F0aW9uOwotICAgICAgICB0aGlzLmxhbmd1YWdlID0gbGFuZ3VhZ2U7Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL3dyaXRlci9NZXNzYWdlUmVjZWl2ZXJXcml0ZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL3dyaXRlci9NZXNzYWdlUmVjZWl2ZXJXcml0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTIxNzI5MS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi93cml0ZXIvTWVzc2FnZVJlY2VpdmVyV3JpdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLndyaXRlcjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotcHVibGljIGNsYXNzIE1lc3NhZ2VSZWNlaXZlcldyaXRlciBleHRlbmRzIEZpbGVXcml0ZXIgewotCi0gICAgcHVibGljIE1lc3NhZ2VSZWNlaXZlcldyaXRlcihTdHJpbmcgb3V0cHV0RmlsZUxvY2F0aW9uKSB7Ci0gICAgICAgIHRoaXMub3V0cHV0RmlsZUxvY2F0aW9uID0gbmV3IEZpbGUob3V0cHV0RmlsZUxvY2F0aW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWVzc2FnZVJlY2VpdmVyV3JpdGVyKEZpbGUgb3V0cHV0RmlsZUxvY2F0aW9uLCBTdHJpbmcgbGFuZ3VhZ2UpIHsKLSAgICAgICAgdGhpcy5vdXRwdXRGaWxlTG9jYXRpb24gPSBvdXRwdXRGaWxlTG9jYXRpb247Ci0gICAgICAgIHRoaXMubGFuZ3VhZ2UgPSBsYW5ndWFnZTsKLSAgICB9Ci0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL3dyaXRlci9Qb2xpY3lGaWxlV3JpdGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi93cml0ZXIvUG9saWN5RmlsZVdyaXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTJlOTgzLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL3dyaXRlci9Qb2xpY3lGaWxlV3JpdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLndyaXRlcjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci0KLXB1YmxpYyBjbGFzcyBQb2xpY3lGaWxlV3JpdGVyIGV4dGVuZHMgRmlsZVdyaXRlciB7Ci0KLSAgICBwdWJsaWMgUG9saWN5RmlsZVdyaXRlcihGaWxlIG91dHB1dEZpbGVMb2NhdGlvbikgewotICAgICAgICB0aGlzLm91dHB1dEZpbGVMb2NhdGlvbiA9IG91dHB1dEZpbGVMb2NhdGlvbjsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZU91dEZpbGUoU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgZmlsZU5hbWUpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBGaWxlIG91dHB1dEZpbGUgPSBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuRmlsZVdyaXRlci5jcmVhdGVDbGFzc0ZpbGUob3V0cHV0RmlsZUxvY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIueG1sIik7Ci0gICAgICAgIC8vc2V0IHRoZSBleGlzdGluZyBmbGFnCi0gICAgICAgIGZpbGVFeGlzdHMgPSBvdXRwdXRGaWxlLmV4aXN0cygpOwotICAgICAgICBpZiAoIWZpbGVFeGlzdHMpIHsKLSAgICAgICAgICAgIHRoaXMuc3RyZWFtID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0ob3V0cHV0RmlsZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL3dyaXRlci9TY2hlbWFXcml0ZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL3dyaXRlci9TY2hlbWFXcml0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE3NjFhOS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi93cml0ZXIvU2NoZW1hV3JpdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLndyaXRlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5GaWxlV3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5YTUxQcmV0dHlQcmludGVyOwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hOwotCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5PdXRwdXRLZXlzOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqIEEgY29udmVuaWVudCBjbGFzcyB0byB3cml0ZSBvdXQgdGhlIHNjaGVtYXMgaW50byBhIGZpbGUgaW4gdGhlIG91dHB1dCBsb2NhdGlvbiAqLwotcHVibGljIGNsYXNzIFNjaGVtYVdyaXRlciB7Ci0KLSAgICBwcml2YXRlIEZpbGUgYmFzZUZvbGRlciA9IG51bGw7Ci0KLSAgICBwdWJsaWMgU2NoZW1hV3JpdGVyKEZpbGUgYmFzZUZvbGRlcikgewotICAgICAgICB0aGlzLmJhc2VGb2xkZXIgPSBiYXNlRm9sZGVyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlU2NoZW1hKFhtbFNjaGVtYSBzY2hlbWEsIFN0cmluZyBzY2hlbWFGaWxlTmFtZSkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKHNjaGVtYSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy9jcmVhdGUgYSBvdXRwdXQgZmlsZQotICAgICAgICAgICAgICAgIEZpbGUgb3V0cHV0RmlsZSA9IEZpbGVXcml0ZXIuY3JlYXRlQ2xhc3NGaWxlKGJhc2VGb2xkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWFGaWxlTmFtZS5zdWJzdHJpbmcoMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hRmlsZU5hbWUubGFzdEluZGV4T2YoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi4iKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi54c2QiKTsKLSAgICAgICAgICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKG91dHB1dEZpbGUpOwotCi0gICAgICAgICAgICAgICAgLy9zZXQgdGhlIG9wdGlvbnMgZm9yIHRoZSBzY2hlbWFzCi0gICAgICAgICAgICAgICAgc2NoZW1hLndyaXRlKGZvcyxnZXREZWZhdWx0T3B0aW9uTWFwKCkpOwotICAgICAgICAgICAgICAgIGZvcy5mbHVzaCgpOwotICAgICAgICAgICAgICAgIGZvcy5jbG9zZSgpOwotICAgICAgICAgICAgICAgIFhNTFByZXR0eVByaW50ZXIucHJldHRpZnkob3V0cHV0RmlsZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiU2NoZW1hIHdyaXRpbmcgZmFpbGVkISIsIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBNYXAgZ2V0RGVmYXVsdE9wdGlvbk1hcCgpewotICAgICAgICBNYXAgb3B0aW9ucyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIG9wdGlvbnMucHV0KE91dHB1dEtleXMuT01JVF9YTUxfREVDTEFSQVRJT04sIm5vIik7Ci0gICAgICAgIG9wdGlvbnMucHV0KE91dHB1dEtleXMuSU5ERU5ULCJ5ZXMiKTsKLQotICAgICAgICByZXR1cm4gb3B0aW9uczsKLSAgICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vd3JpdGVyL1NlcnZpY2VYTUxXcml0ZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL3dyaXRlci9TZXJ2aWNlWE1MV3JpdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4MmY4ZWYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vd3JpdGVyL1NlcnZpY2VYTUxXcml0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4ud3JpdGVyOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLQotcHVibGljIGNsYXNzIFNlcnZpY2VYTUxXcml0ZXIgZXh0ZW5kcyBGaWxlV3JpdGVyIHsKLQotCi0gICAgcHVibGljIFNlcnZpY2VYTUxXcml0ZXIoU3RyaW5nIG91dHB1dEZpbGVMb2NhdGlvbikgewotICAgICAgICB0aGlzLm91dHB1dEZpbGVMb2NhdGlvbiA9IG5ldyBGaWxlKG91dHB1dEZpbGVMb2NhdGlvbik7Ci0gICAgfQotCi0gICAgcHVibGljIFNlcnZpY2VYTUxXcml0ZXIoRmlsZSBvdXRwdXRGaWxlTG9jYXRpb24sIFN0cmluZyBsYW5ndWFnZSkgewotICAgICAgICB0aGlzLm91dHB1dEZpbGVMb2NhdGlvbiA9IG91dHB1dEZpbGVMb2NhdGlvbjsKLSAgICAgICAgdGhpcy5sYW5ndWFnZSA9IGxhbmd1YWdlOwotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgY3JlYXRlT3V0RmlsZShTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyBmaWxlTmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIG91dHB1dEZpbGUgPSBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuRmlsZVdyaXRlci5jcmVhdGVDbGFzc0ZpbGUob3V0cHV0RmlsZUxvY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNlcnZpY2VzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi54bWwiKTsKLSAgICAgICAgLy9zZXQgdGhlIGV4aXN0aW5nIGZsYWcKLSAgICAgICAgZmlsZUV4aXN0cyA9IG91dHB1dEZpbGUuZXhpc3RzKCk7Ci0gICAgICAgIGlmICghZmlsZUV4aXN0cyB8fCB0aGlzLmlzT3ZlcnJpZGUpIHsKLSAgICAgICAgICAgIHRoaXMuc3RyZWFtID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0ob3V0cHV0RmlsZSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgfQotfQotCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi93cml0ZXIvU2tlbGV0b25JbnRlcmZhY2VXcml0ZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL3dyaXRlci9Ta2VsZXRvbkludGVyZmFjZVdyaXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjVhZTdiLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL3dyaXRlci9Ta2VsZXRvbkludGVyZmFjZVdyaXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi53cml0ZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLXB1YmxpYyBjbGFzcyBTa2VsZXRvbkludGVyZmFjZVdyaXRlciBleHRlbmRzIEZpbGVXcml0ZXIgewotCi0KLSAgICBwdWJsaWMgU2tlbGV0b25JbnRlcmZhY2VXcml0ZXIoU3RyaW5nIG91dHB1dEZpbGVMb2NhdGlvbikgewotICAgICAgICB0aGlzLm91dHB1dEZpbGVMb2NhdGlvbiA9IG5ldyBGaWxlKG91dHB1dEZpbGVMb2NhdGlvbik7Ci0gICAgfQotCi0gICAgcHVibGljIFNrZWxldG9uSW50ZXJmYWNlV3JpdGVyKEZpbGUgb3V0cHV0RmlsZUxvY2F0aW9uLCBTdHJpbmcgbGFuZ3VhZ2UpIHsKLSAgICAgICAgdGhpcy5vdXRwdXRGaWxlTG9jYXRpb24gPSBvdXRwdXRGaWxlTG9jYXRpb247Ci0gICAgICAgIHRoaXMubGFuZ3VhZ2UgPSBsYW5ndWFnZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL3dyaXRlci9Ta2VsZXRvbldyaXRlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vd3JpdGVyL1NrZWxldG9uV3JpdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5ZmVkZjMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vd3JpdGVyL1NrZWxldG9uV3JpdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLndyaXRlcjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotcHVibGljIGNsYXNzIFNrZWxldG9uV3JpdGVyIGV4dGVuZHMgRmlsZVdyaXRlciB7Ci0KLQotICAgIHB1YmxpYyBTa2VsZXRvbldyaXRlcihTdHJpbmcgb3V0cHV0RmlsZUxvY2F0aW9uKSB7Ci0gICAgICAgIHRoaXMub3V0cHV0RmlsZUxvY2F0aW9uID0gbmV3IEZpbGUob3V0cHV0RmlsZUxvY2F0aW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2tlbGV0b25Xcml0ZXIoRmlsZSBvdXRwdXRGaWxlTG9jYXRpb24sIFN0cmluZyBsYW5ndWFnZSkgewotICAgICAgICB0aGlzLm91dHB1dEZpbGVMb2NhdGlvbiA9IG91dHB1dEZpbGVMb2NhdGlvbjsKLSAgICAgICAgdGhpcy5sYW5ndWFnZSA9IGxhbmd1YWdlOwotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi93cml0ZXIvVGVzdENsYXNzV3JpdGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi93cml0ZXIvVGVzdENsYXNzV3JpdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhN2ExM2MuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vd3JpdGVyL1Rlc3RDbGFzc1dyaXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi53cml0ZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0Q2xhc3NXcml0ZXIgZXh0ZW5kcyBGaWxlV3JpdGVyIHsKLQotICAgIHB1YmxpYyBUZXN0Q2xhc3NXcml0ZXIoU3RyaW5nIG91dHB1dEZpbGVMb2NhdGlvbikgewotICAgICAgICB0aGlzLm91dHB1dEZpbGVMb2NhdGlvbiA9IG5ldyBGaWxlKG91dHB1dEZpbGVMb2NhdGlvbik7Ci0gICAgfQotCi0gICAgcHVibGljIFRlc3RDbGFzc1dyaXRlcihGaWxlIG91dHB1dEZpbGVMb2NhdGlvbiwgU3RyaW5nIGxhbmd1YWdlKSB7Ci0gICAgICAgIHRoaXMub3V0cHV0RmlsZUxvY2F0aW9uID0gb3V0cHV0RmlsZUxvY2F0aW9uOwotICAgICAgICB0aGlzLmxhbmd1YWdlID0gbGFuZ3VhZ2U7Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL3dyaXRlci9XU0RMMTFXcml0ZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL3dyaXRlci9XU0RMMTFXcml0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI1ZWE0MC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi93cml0ZXIvV1NETDExV3JpdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi53cml0ZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5GaWxlV3JpdGVyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5JbXBvcnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5TZXJ2aWNlOwotaW1wb3J0IGphdmF4LndzZGwuVHlwZXM7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNjaGVtYS5TY2hlbWE7Ci1pbXBvcnQgamF2YXgud3NkbC5mYWN0b3J5LldTRExGYWN0b3J5OwotaW1wb3J0IGphdmF4LndzZGwueG1sLldTRExXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLXB1YmxpYyBjbGFzcyBXU0RMMTFXcml0ZXIgewotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1QT1JUX1RBRyA9ICJpbXBvcnQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOQ0xVREVfVEFHID0gImluY2x1ZGUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNDSEVNQV9MT0NBVElPTiA9ICJzY2hlbWFMb2NhdGlvbiI7Ci0KLSAgICBwcml2YXRlIEZpbGUgYmFzZUZvbGRlciA9IG51bGw7Ci0gICAgcHJpdmF0ZSBpbnQgY291bnQ7Ci0KLQotICAgIHB1YmxpYyBXU0RMMTFXcml0ZXIoRmlsZSBiYXNlRm9sZGVyKSB7Ci0gICAgICAgIHRoaXMuYmFzZUZvbGRlciA9IGJhc2VGb2xkZXI7Ci0gICAgICAgIHRoaXMuY291bnQgPSAwOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlV1NETChBeGlzU2VydmljZSBheGlzU2VydmljZSkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKGF4aXNTZXJ2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvL2NyZWF0ZSBhIG91dHB1dCBmaWxlCi0gICAgICAgICAgICAgICAgRmlsZSBvdXRwdXRGaWxlID0gRmlsZVdyaXRlci5jcmVhdGVDbGFzc0ZpbGUoYmFzZUZvbGRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlLmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLndzZGwiKTsKLSAgICAgICAgICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKG91dHB1dEZpbGUpOwotICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlLnByaW50V1NETChmb3MpOwotICAgICAgICAgICAgICAgIGZvcy5mbHVzaCgpOwotICAgICAgICAgICAgICAgIGZvcy5jbG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIldTREwgd3JpdGluZyBmYWlsZWQhIiwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZVdTREwoQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UsIERlZmluaXRpb24gZGVmaW5pdGlvbiwgTWFwIGNoYW5nZWRNYXApIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChheGlzU2VydmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTWFwIGJhc2VVUkl3c2RsTmFtZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgICAgICAgICAgLy8gYWRkIHRoZSBpbml0aWFsIGRlZmluaXRpb24gdG8gdGhlIG1hcAotICAgICAgICAgICAgICAgIGJhc2VVUkl3c2RsTmFtZU1hcC5wdXQoZGVmaW5pdGlvbi5nZXREb2N1bWVudEJhc2VVUkkoKSxheGlzU2VydmljZS5nZXROYW1lKCkgKyAiLndzZGwiKTsKLSAgICAgICAgICAgICAgICB3cml0ZVdTREwoZGVmaW5pdGlvbiwgYXhpc1NlcnZpY2UuZ2V0TmFtZSgpICsgIi53c2RsIiwgY2hhbmdlZE1hcCwgYmFzZVVSSXdzZGxOYW1lTWFwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJXU0RMIHdyaXRpbmcgZmFpbGVkISIsIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHdyaXRlV1NETChEZWZpbml0aW9uIGRlZmluaXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZmlsZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBNYXAgY2hhbmdlZE1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcCBiYXNlVVJJd3NkbE5hbWVNYXApIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBmaXJzdCBwcm9jZXNzIHRoZSBpbXBvcnRzIGFuZCBzYXZlIHRoZW0uCi0gICAgICAgIE1hcCBpbXBvcnRzID0gZGVmaW5pdGlvbi5nZXRJbXBvcnRzKCk7Ci0gICAgICAgIGlmIChpbXBvcnRzICE9IG51bGwgJiYgKGltcG9ydHMuc2l6ZSgpID4gMCkpIHsKLSAgICAgICAgICAgIFZlY3RvciBpbXBvcnRzVmVjdG9yID0gbnVsbDsKLSAgICAgICAgICAgIEltcG9ydCB3c2RsSW1wb3J0ID0gbnVsbDsKLSAgICAgICAgICAgIFN0cmluZyB3c2RsTmFtZSA9IG51bGw7Ci0gICAgICAgICAgICBTdHJpbmcgd3NkbExvY2F0aW9uID0gbnVsbDsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaW1wcm90c1ZlY3Rvckl0ZXIgPSBpbXBvcnRzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgIGltcHJvdHNWZWN0b3JJdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICBpbXBvcnRzVmVjdG9yID0gKFZlY3RvcilpbXByb3RzVmVjdG9ySXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpbXBvcnRzSXRlciA9IGltcG9ydHNWZWN0b3IuaXRlcmF0b3IoKTsgaW1wb3J0c0l0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgICAgICB3c2RsSW1wb3J0ID0gKEltcG9ydClpbXBvcnRzSXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIHdzZGxMb2NhdGlvbiA9IHdzZGxJbXBvcnQuZ2V0RGVmaW5pdGlvbigpLmdldERvY3VtZW50QmFzZVVSSSgpOwotICAgICAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHRvIHByb2Nlc3MgdGhpcyB3c2RsIGZpbGUgb25seSBpZiBpdCBoYXMgbm90IGJlZW4gcHJvY2Vzc2VkIGVhcmxpZXIKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFiYXNlVVJJd3NkbE5hbWVNYXAuY29udGFpbnNLZXkod3NkbExvY2F0aW9uKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgd3NkbE5hbWUgPSB3c2RsTG9jYXRpb24uc3Vic3RyaW5nKHdzZGxMb2NhdGlvbi5sYXN0SW5kZXhPZignLycpICsgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXdzZGxOYW1lLmVuZHNXaXRoKCIud3NkbCIpICYmICF3c2RsTmFtZS5lbmRzV2l0aCgiLnhzZCIpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgc2VlbXMgdG8gYmUgYW4gb25saW5lIHdzZGwgc28gd2UgZ2VuZXJhdGUgYSBkdW1teSBuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAod3NkbE5hbWUuaW5kZXhPZigieHNkIikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NkbE5hbWUgPSAieHNkIiArIGNvdW50KysgKyAiLnhzZCI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzZGxOYW1lID0gIndzZGwiICsgY291bnQrKyArICIud3NkbCI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vdHJpbSB0aGUgd3NkbCBwYXJ0Ci0gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoYmFzZVVSSXdzZGxOYW1lTWFwLmNvbnRhaW5zVmFsdWUod3NkbE5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW1wb3J0IGZpbGUgbmFtZSBjYW4gZWl0aGVyIGJlIHhzZCBvciB3c2RsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZpbGVOYW1lUGFydCA9IHdzZGxOYW1lLnN1YnN0cmluZygwLHdzZGxOYW1lLmxhc3RJbmRleE9mKCIuIikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBleHRlbnNpb24gPSB3c2RsTmFtZS5zdWJzdHJpbmcod3NkbE5hbWUubGFzdEluZGV4T2YoIi4iKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NkbE5hbWUgPSBmaWxlTmFtZVBhcnQgKyBjb3VudCsrICsgZXh0ZW5zaW9uOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYmFzZVVSSXdzZGxOYW1lTWFwLnB1dCh3c2RsTG9jYXRpb24sIHdzZGxOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIERlZmluaXRpb24gaW5uZXJEZWZpbml0aW9uID0gd3NkbEltcG9ydC5nZXREZWZpbml0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3cml0ZVdTREwoaW5uZXJEZWZpbml0aW9uLCB3c2RsTmFtZSwgY2hhbmdlZE1hcCwgYmFzZVVSSXdzZGxOYW1lTWFwKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHdzZGxJbXBvcnQuc2V0TG9jYXRpb25VUkkoKFN0cmluZyliYXNlVVJJd3NkbE5hbWVNYXAuZ2V0KHdzZGxMb2NhdGlvbikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBjaGFuZ2UgdGhlIGxvY2F0aW9ucyBvbiB0aGUgaW1wb3J0ZWQgc2NoZW1hcwotICAgICAgICBhZGp1c3RXU0RMU2NoZW1hTG9jYXRpb25zKGRlZmluaXRpb24sIGNoYW5nZWRNYXApOwotICAgICAgICAvLyBmaW5hbGx5IHNhdmUgdGhlIGZpbGUKLSAgICAgICAgV1NETFdyaXRlciB3c2RsV3JpdGVyID0gV1NETEZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdXU0RMV3JpdGVyKCk7Ci0gICAgICAgIEZpbGUgb3V0cHV0RmlsZSA9IEZpbGVXcml0ZXIuY3JlYXRlQ2xhc3NGaWxlKGJhc2VGb2xkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIGZpbGVOYW1lLCBudWxsKTsKLSAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShvdXRwdXRGaWxlKTsKLQotICAgICAgICAvLyB3ZSBoYXZlIGEgY2F0Y2ggaGVyZQotICAgICAgICAvLyBpZiB0aGVyZSBhcmUgbXVsdGltcGxlIHNlcnZpY2VzIGluIHRoZSBkZWZpbml0aW9uIG9iamVjdAotICAgICAgICAvLyB3ZSBoYXZlIHRvIHdyaXRlIG9ubHkgdGhlIHJlbGF2ZW50IHNlcnZpY2UuCi0KLQotICAgICAgICBpZiAoZGVmaW5pdGlvbi5nZXRTZXJ2aWNlcygpLnNpemUoKSA+IDEpewotICAgICAgICAgICBMaXN0IHJlbW92ZWRTZXJ2aWNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgTGlzdCBzZXJ2aWNlc0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgICAgTWFwIHNlcnZpY2VzID0gZGVmaW5pdGlvbi5nZXRTZXJ2aWNlcygpOwotICAgICAgICAgICAvLyBwb3B1bGF0ZSB0aGUgc2VydmljZXMgbGlzdAotICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzZXJ2aWNlcy52YWx1ZXMoKS5pdGVyYXRvcigpO2l0ZXIuaGFzTmV4dCgpOyl7Ci0gICAgICAgICAgICAgICBzZXJ2aWNlc0xpc3QuYWRkKGl0ZXIubmV4dCgpKTsKLSAgICAgICAgICAgfQotICAgICAgICAgICBTZXJ2aWNlIHNlcnZpY2U7Ci0gICAgICAgICAgIFN0cmluZyBzZXJ2aWNlTmFtZUZyb21GaWxlTmFtZSA9IGZpbGVOYW1lOwotICAgICAgICAgICBpZiAoZmlsZU5hbWUuaW5kZXhPZigiLndzZGwiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICBzZXJ2aWNlTmFtZUZyb21GaWxlTmFtZSA9IGZpbGVOYW1lLnN1YnN0cmluZygwLGZpbGVOYW1lLmxhc3RJbmRleE9mKCIud3NkbCIpKTsKLSAgICAgICAgICAgfQotCi0gICAgICAgICAgIGlmIChmaWxlTmFtZS5pbmRleE9mKCIueHNkIikgPiAtMSl7Ci0gICAgICAgICAgICAgICBzZXJ2aWNlTmFtZUZyb21GaWxlTmFtZSA9IGZpbGVOYW1lLnN1YnN0cmluZygwLGZpbGVOYW1lLmxhc3RJbmRleE9mKCIueHNkIikpOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHNlcnZpY2VzTGlzdC5pdGVyYXRvcigpO2l0ZXIuaGFzTmV4dCgpOyl7Ci0gICAgICAgICAgICAgICBzZXJ2aWNlID0gKFNlcnZpY2UpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgaWYgKCFzZXJ2aWNlLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCkuZXF1YWxzKHNlcnZpY2VOYW1lRnJvbUZpbGVOYW1lKSl7Ci0gICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbi5yZW1vdmVTZXJ2aWNlKHNlcnZpY2UuZ2V0UU5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgcmVtb3ZlZFNlcnZpY2VzLmFkZChzZXJ2aWNlKTsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgfQotCi0gICAgICAgICAgIC8vbm93IHdlIGhhdmUgb25seSB0aGUgcmVxdWlyZWQgc2VydmljZSBzbyB3cml0ZSBpdAotICAgICAgICAgICB3c2RsV3JpdGVyLndyaXRlV1NETChkZWZpbml0aW9uLCBvdXQpOwotCi0gICAgICAgICAgIC8vIGFnYWluIGFkZCB0aGUgcmVtb3ZlZCBzZXJ2aWNlcwotICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZW1vdmVkU2VydmljZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KXsKLSAgICAgICAgICAgICAgIHNlcnZpY2UgPSAoU2VydmljZSkgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICBkZWZpbml0aW9uLmFkZFNlcnZpY2Uoc2VydmljZSk7Ci0gICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgLy8gbm8gcHJvYmxlbSBwcm9jZWVkIG5vcm1hbHkKLSAgICAgICAgICAgd3NkbFdyaXRlci53cml0ZVdTREwoZGVmaW5pdGlvbiwgb3V0KTsKLSAgICAgICAgfQotICAgICAgICBvdXQuZmx1c2goKTsKLSAgICAgICAgb3V0LmNsb3NlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQGRlcHJlY2F0ZWQgIHBsZWFzZSB1c2UgYWRqdXN0V1NETFNjaGVtYUxvY2F0aW9ucwotICAgICAqIEBwYXJhbSBkZWZpbml0aW9uCi0gICAgICogQHBhcmFtIGNoYW5nZWRTY2hlbWFMb2NhdGlvbnMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGp1c3RXU0RMU2NoZW1hTG9jYXRpbnMoRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBNYXAgY2hhbmdlZFNjaGVtYUxvY2F0aW9ucykgewotICAgICAgICBhZGp1c3RXU0RMU2NoZW1hTG9jYXRpb25zKGRlZmluaXRpb24sIGNoYW5nZWRTY2hlbWFMb2NhdGlvbnMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGFkanVzdCB0aGUgc2NoZW1hIGxvY2F0aW9ucyBpbiB0aGUgb3JpZ2luYWwgd3NkbAotICAgICAqCi0gICAgICogQHBhcmFtIGRlZmluaXRpb24KLSAgICAgKiBAcGFyYW0gY2hhbmdlZFNjaGVtYUxvY2F0aW9ucwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkanVzdFdTRExTY2hlbWFMb2NhdGlvbnMoRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBNYXAgY2hhbmdlZFNjaGVtYUxvY2F0aW9ucykgewotICAgICAgICBUeXBlcyB3c2RsVHlwZXMgPSBkZWZpbml0aW9uLmdldFR5cGVzKCk7Ci0gICAgICAgIGlmICh3c2RsVHlwZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgTGlzdCBleHRlbnNpYmlsaXR5RWxlbWVudHMgPSB3c2RsVHlwZXMuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgICAgICAgICBPYmplY3QgY3VycmVudE9iamVjdDsKLSAgICAgICAgICAgIFNjaGVtYSBzY2hlbWE7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBleHRlbnNpYmlsaXR5RWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgY3VycmVudE9iamVjdCA9IGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgIGlmIChjdXJyZW50T2JqZWN0IGluc3RhbmNlb2YgU2NoZW1hKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNjaGVtYSA9IChTY2hlbWEpY3VycmVudE9iamVjdDsKLSAgICAgICAgICAgICAgICAgICAgY2hhbmdlTG9jYXRpb25zKHNjaGVtYS5nZXRFbGVtZW50KCksIGNoYW5nZWRTY2hlbWFMb2NhdGlvbnMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjaGFuZ2VMb2NhdGlvbnMoRWxlbWVudCBlbGVtZW50LCBNYXAgY2hhbmdlZFNjaGVtYUxvY2F0aW9ucykgewotICAgICAgICBOb2RlTGlzdCBub2RlTGlzdCA9IGVsZW1lbnQuZ2V0Q2hpbGROb2RlcygpOwotICAgICAgICBTdHJpbmcgdGFnTmFtZTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBub2RlTGlzdC5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAgICAgICB0YWdOYW1lID0gbm9kZUxpc3QuaXRlbShpKS5nZXRMb2NhbE5hbWUoKTsKLSAgICAgICAgICAgIGlmIChJTVBPUlRfVEFHLmVxdWFscyh0YWdOYW1lKSB8fCBJTkNMVURFX1RBRy5lcXVhbHModGFnTmFtZSkpIHsKLSAgICAgICAgICAgICAgICBwcm9jZXNzSW1wb3J0KG5vZGVMaXN0Lml0ZW0oaSksIGNoYW5nZWRTY2hlbWFMb2NhdGlvbnMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NJbXBvcnQoTm9kZSBpbXBvcnROb2RlLCBNYXAgY2hhbmdlZFNjaGVtYUxvY2F0aW9ucykgewotICAgICAgICBOYW1lZE5vZGVNYXAgbm9kZU1hcCA9IGltcG9ydE5vZGUuZ2V0QXR0cmlidXRlcygpOwotICAgICAgICBOb2RlIGF0dHJpYnV0ZTsKLSAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZVZhbHVlOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5vZGVNYXAuZ2V0TGVuZ3RoKCk7IGkrKykgewotICAgICAgICAgICAgYXR0cmlidXRlID0gbm9kZU1hcC5pdGVtKGkpOwotICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZS5nZXROb2RlTmFtZSgpLmVxdWFscygic2NoZW1hTG9jYXRpb24iKSkgewotICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gYXR0cmlidXRlLmdldE5vZGVWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGlmIChjaGFuZ2VkU2NoZW1hTG9jYXRpb25zLmdldChhdHRyaWJ1dGVWYWx1ZSkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUuc2V0Tm9kZVZhbHVlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTdHJpbmcpY2hhbmdlZFNjaGVtYUxvY2F0aW9ucy5nZXQoYXR0cmlidXRlVmFsdWUpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vd3JpdGVyL1dTREwyMFdyaXRlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vd3JpdGVyL1dTREwyMFdyaXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMWQ5NDcxLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL3dyaXRlci9XU0RMMjBXcml0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4ud3JpdGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuRmlsZVdyaXRlcjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci0KLXB1YmxpYyBjbGFzcyBXU0RMMjBXcml0ZXIgewotICAgIHByaXZhdGUgRmlsZSBiYXNlRm9sZGVyID0gbnVsbDsKLQotCi0gICAgcHVibGljIFdTREwyMFdyaXRlcihGaWxlIGJhc2VGb2xkZXIpIHsKLSAgICAgICAgdGhpcy5iYXNlRm9sZGVyID0gYmFzZUZvbGRlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZVdTREwoQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChheGlzU2VydmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy9jcmVhdGUgYSBvdXRwdXQgZmlsZQotICAgICAgICAgICAgICAgIEZpbGUgb3V0cHV0RmlsZSA9IEZpbGVXcml0ZXIuY3JlYXRlQ2xhc3NGaWxlKGJhc2VGb2xkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzU2VydmljZS5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi53c2RsIik7Ci0gICAgICAgICAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShvdXRwdXRGaWxlKTsKLSAgICAgICAgICAgICAgICBheGlzU2VydmljZS5wcmludFdTREwyKGZvcyk7Ci0gICAgICAgICAgICAgICAgZm9zLmZsdXNoKCk7Ci0gICAgICAgICAgICAgICAgZm9zLmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiV1NETCB3cml0aW5nIGZhaWxlZCEiLCBlKTsKLSAgICAgICAgfQotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvZGF0YWJpbmRpbmcvQ0RlZmF1bHRUeXBlTWFwcGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvZGF0YWJpbmRpbmcvQ0RlZmF1bHRUeXBlTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGVmNzNlYTMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2RhdGFiaW5kaW5nL0NEZWZhdWx0VHlwZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLndzZGwuZGF0YWJpbmRpbmc7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1wdWJsaWMgY2xhc3MgQ0RlZmF1bHRUeXBlTWFwcGVyIGV4dGVuZHMgVHlwZU1hcHBpbmdBZGFwdGVyIHsKLSAgICBwcml2YXRlIFN0cmluZyBkZWZhdWx0U3RydWN0TmFtZSA9ICJheGlvbV9ub2RlX3QqIjsKLQotICAgIHB1YmxpYyBDRGVmYXVsdFR5cGVNYXBwZXIoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdHlwZSBtYXBwaW5nIG5hbWUuIGFsd2F5cyByZXR1cm5zIHRoZSBkZWZhdWx0IG1hcHBpbmcKLSAgICAgKgotICAgICAqIEBzZWUgVHlwZU1hcHBlciNnZXRUeXBlTWFwcGluZ05hbWUoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGVNYXBwaW5nTmFtZShRTmFtZSBxbmFtZSkgewotCi0gICAgICAgIGlmICgocW5hbWUgIT0gbnVsbCkpIHsKLSAgICAgICAgICAgIHJldHVybiBkZWZhdWx0U3RydWN0TmFtZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvZGF0YWJpbmRpbmcvQ1R5cGVNYXBwZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9kYXRhYmluZGluZy9DVHlwZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNmFlZTE0Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9kYXRhYmluZGluZy9DVHlwZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLndzZGwuZGF0YWJpbmRpbmc7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLm5hbWVzcGFjZS5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLmkxOG4uQ29kZWdlbk1lc3NhZ2VzOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotcHVibGljIGNsYXNzIENUeXBlTWFwcGVyIGV4dGVuZHMgVHlwZU1hcHBpbmdBZGFwdGVyIHsKLQotICAgIHByaXZhdGUgU3RyaW5nIGRlZmF1bHRTdHJ1Y3ROYW1lID0gImF4aW9tX25vZGVfdCoiOwotCi0gICAgcHVibGljIENUeXBlTWFwcGVyKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZU1hcHBpbmdOYW1lKFFOYW1lIHFuYW1lKSB7Ci0KLSAgICAgICAgaWYgKChxbmFtZSAhPSBudWxsKSkgewotICAgICAgICAgICAgT2JqZWN0IG8gPSBxTmFtZTJOYW1lTWFwLmdldChxbmFtZSk7Ci0gICAgICAgICAgICBpZiAobyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChTdHJpbmcpbzsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoQ29uc3RhbnRzLlhTRF9BTllUWVBFLmVxdWFscyhxbmFtZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLlhTRF9BTlkuZXF1YWxzKHFuYW1lKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBkZWZhdWx0U3RydWN0TmFtZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVubWF0Y2hlZFR5cGVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICBDb2RlZ2VuTWVzc2FnZXMuZ2V0TWVzc2FnZSgiZGF0YWJpbmRpbmcudHlwZW1hcHBlci50eXBldW5tYXRjaGVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFuYW1lLmdldExvY2FsUGFydCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpCi0gICAgICAgICAgICAgICAgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXREZWZhdWx0TWFwcGluZ05hbWUoKSB7Ci0gICAgICAgIHJldHVybiBkZWZhdWx0U3RydWN0TmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0TWFwcGluZ05hbWUoU3RyaW5nIGRlZmF1bHRNYXBwaW5nKSB7Ci0gICAgICAgIHRoaXMuZGVmYXVsdFN0cnVjdE5hbWUgPSBkZWZhdWx0TWFwcGluZzsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9kYXRhYmluZGluZy9DVXRpbHMuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9kYXRhYmluZGluZy9DVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTAyNDQ5Mi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvZGF0YWJpbmRpbmcvQ1V0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIud3NkbC5kYXRhYmluZGluZzsKLQotaW1wb3J0IGphdmEudGV4dC5Db2xsYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci0KLXB1YmxpYyBjbGFzcyBDVXRpbHMgewotCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBrZXl3b3Jkc1tdID0KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgLy8gYy8gYysrIGtleXdvcmRzCi0gICAgICAgICAgICAgICAgICAgICJhc20iLCAiYXV0byIsICJib29sIiwgImJyZWFrIiwgImJyZWFrIiwgImNhc2UiLCAiY2F0Y2giLCAiY2hhciIsICJjbGFzcyIsICJjb25zdCIsICJjb25zdF9jYXN0IiwKLSAgICAgICAgICAgICAgICAgICAgImNvbnRpbnVlIiwgImRlZmF1bHQiLCAiZGVsZXRlIiwgImRvIiwgImRvdWJsZSIsICJkeW5hbWljX2Nhc3QiLCAiZWxzZSIsICJlbnVtIiwgImV4cGxpY2l0IiwKLSAgICAgICAgICAgICAgICAgICAgImV4cG9ydCIsICJleHRlcm4iLCAiZmFsc2UiLCAiZmxvYXQiLCAiZm9yIiwgImZyaWVuZCIsICJnb3RvIiwgImlmIiwgImlubGluZSIsICJpbnQiLCAibG9uZyIsCi0gICAgICAgICAgICAgICAgICAgICJtdXRhYmxlIiwgIm5hbWVzcGFjZSIsICJuZXciLCAib3BlcmF0b3IiLCAicHJpdmF0ZSIsICJwcm90ZWN0ZWQiLCAicHVibGljIiwgInJlZ2lzdGVyIiwKLSAgICAgICAgICAgICAgICAgICAgInJlaW50ZXJwcmV0X2Nhc3QiLCAicmV0dXJuIiwgInNob3J0IiwgInNpZ25lZCIsICJzaXplb2YiLCAic3RhdGljIiwgInN0YXRpY19jYXN0IiwgInN0cnVjdCIsCi0gICAgICAgICAgICAgICAgICAgICJzd2l0Y2giLCAidGVtcGxhdGUiLCAidGhpcyIsICJ0aHJvdyIsICJ0cnVlIiwgInRyeSIsICJ0eXBlZGVmIiwgInR5cGVpZCIsICJ0eXBlbmFtZSIsICJ1bmlvbiIsCi0gICAgICAgICAgICAgICAgICAgICJ1bnNpZ25lZCIsICJ1c2luZyIsICJ2aXJ0dWFsIiwgInZvaWQiLCAidm9sYXRpbGUiLCAid2NoYXJfdCIsICJ3aGlsZSIsCi0KLSAgICAgICAgICAgICAgICAgICAgLy9taWNyb3NvZnQgYysrIGtleXdvcmRzIHJlZmVyZW5jZTogaHR0cDovL21zZG4yLm1pY3Jvc29mdC5jb20vZW4tVVMvbGlicmFyeS8yZTZhNGF0OShWUy44MCkuYXNweAotICAgICAgICAgICAgICAgICAgICAiX19hYnN0cmFjdCIsICJhYnN0cmFjdCIsICJfX2FsaWdub2YgT3BlcmF0b3IiLCAiYXJyYXkiLCAiX19hc20iLCAiX19hc3N1bWUiLCAiX19iYXNlZCIsICJib29sIiwKLSAgICAgICAgICAgICAgICAgICAgIl9fYm94IiwgImJyZWFrIiwgImNhc2UiLCAiY2F0Y2giLCAiX19jZGVjbCIsICJjaGFyIiwgImNsYXNzIiwgImNvbnN0IiwgImNvbnN0X2Nhc3QiLCAiY29udGludWUiLAotICAgICAgICAgICAgICAgICAgICAiX19kZWNsc3BlYyIsICJkZWZhdWx0IiwgIl9fZGVsZWdhdGUiLCAiZGVsZWdhdGUiLCAiZGVsZXRlIiwgImRlcHJlY2F0ZWQiLCAiZGxsZXhwb3J0IiwgImRsbGltcG9ydCIsCi0gICAgICAgICAgICAgICAgICAgICJkbyIsICJkb3VibGUiLCAiZHluYW1pY19jYXN0IiwgImVsc2UiLCAiZW51bSIsICJlbnVtIGNsYXNzIiwgImVudW0gc3RydWN0IiwgImV2ZW50IiwgIl9fZXZlbnQiLAotICAgICAgICAgICAgICAgICAgICAiX19leGNlcHQiLCAiZXhwbGljaXQiLCAiZXh0ZXJuIiwgImZhbHNlIiwgIl9fZmFzdGNhbGwiLCAiX19maW5hbGx5IiwgImZpbmFsbHkiLCAiZmxvYXQiLCAiZm9yIiwKLSAgICAgICAgICAgICAgICAgICAgImZvciBlYWNoIiwgImluIiwgIl9fZm9yY2VpbmxpbmUiLCAiZnJpZW5kIiwgImZyaWVuZF9hcyIsICJfX2djIiwgImdjbmV3IiwgImdlbmVyaWMiLCAiZ290byIsCi0gICAgICAgICAgICAgICAgICAgICJfX2hvb2siLCAiX19pZGVudGlmaWVyIiwgImlmIiwgIl9faWZfZXhpc3RzIiwgIl9faWZfbm90X2V4aXN0cyIsICJpbml0b25seSIsICJfX2lubGluZSIsICJpbmxpbmUiLAotICAgICAgICAgICAgICAgICAgICAiaW50IiwgIl9faW50OCIsICJfX2ludDE2IiwgIl9faW50MzIiLCAiX19pbnQ2NCIsICJfX2ludGVyZmFjZSIsICJpbnRlcmZhY2UgY2xhc3MiLAotICAgICAgICAgICAgICAgICAgICAiaW50ZXJmYWNlIHN0cnVjdCIsICJpbnRlcmlvcl9wdHIiLCAiX19sZWF2ZSIsICJsaXRlcmFsIiwgImxvbmciLCAiX19tNjQiLCAiX19tMTI4IiwgIl9fbTEyOGQiLAotICAgICAgICAgICAgICAgICAgICAiX19tMTI4aSIsICJfX211bHRpcGxlX2luaGVyaXRhbmNlIiwgIm11dGFibGUiLCAibmFrZWQiLCAibmFtZXNwYWNlIiwgIm5ldyIsICJuZXciLCAiX19ub2djIiwKLSAgICAgICAgICAgICAgICAgICAgIm5vaW5saW5lIiwgIl9fbm9vcCIsICJub3JldHVybiIsICJub3Rocm93IiwgIm5vdnRhYmxlIiwgIm51bGxwdHIiLCAib3BlcmF0b3IiLCAiX19waW4iLCAicHJpdmF0ZSIsCi0gICAgICAgICAgICAgICAgICAgICJfX3Byb3BlcnR5IiwgInByb3BlcnR5IiwgInByb3BlcnR5IiwgInByb3RlY3RlZCIsICJwdWJsaWMiLCAiX19yYWlzZSIsICJyZWYgc3RydWN0IiwgInJlZiBjbGFzcyIsCi0gICAgICAgICAgICAgICAgICAgICJyZWdpc3RlciIsICJyZWludGVycHJldF9jYXN0IiwgInJldHVybiIsICJzYWZlY2FzdCIsICJfX3NlYWxlZCIsICJzZWFsZWQiLCAic2VsZWN0YW55IiwgInNob3J0IiwKLSAgICAgICAgICAgICAgICAgICAgInNpZ25lZCIsICJfX3NpbmdsZV9pbmhlcml0YW5jZSIsICJzaXplb2YiLCAic3RhdGljIiwgInN0YXRpY19jYXN0IiwgIl9fc3RkY2FsbCIsICJzdHJ1Y3QiLAotICAgICAgICAgICAgICAgICAgICAiX19zdXBlciIsICJzd2l0Y2giLCAidGVtcGxhdGUiLCAidGhpcyIsICJ0aHJlYWQiLCAidGhyb3ciLCAidHJ1ZSIsICJ0cnkiLCAiX190cnkvX19leGNlcHQiLAotICAgICAgICAgICAgICAgICAgICAiX190cnkvX19maW5hbGx5IiwgIl9fdHJ5X2Nhc3QiLCAidHlwZWRlZiIsICJ0eXBlaWQiLCAidHlwZWlkIiwgInR5cGVuYW1lIiwgIl9fdW5hbGlnbmVkIiwKLSAgICAgICAgICAgICAgICAgICAgIl9fdW5ob29rIiwgInVuaW9uIiwgInVuc2lnbmVkIiwgInVzaW5nIGRlY2xhcmF0aW9uIiwgInVzaW5nIGRpcmVjdGl2ZSIsICJ1dWlkIiwgIl9fdXVpZG9mIiwKLSAgICAgICAgICAgICAgICAgICAgInZhbHVlIHN0cnVjdCIsICJ2YWx1ZSBjbGFzcyIsICJfX3ZhbHVlIiwgInZpcnR1YWwiLCAiX192aXJ0dWFsX2luaGVyaXRhbmNlIiwgInZvaWQiLCAidm9sYXRpbGUiLAotICAgICAgICAgICAgICAgICAgICAiX193NjQiLCAiX193Y2hhcl90IiwgIndjaGFyX3QiLCAid2hpbGUiLAotICAgICAgICAgICAgfTsKLQotICAgIC8qKiBDb2xsYXRvciBmb3IgY29tcGFyaW5nIHRoZSBzdHJpbmdzICovCi0gICAgc3RhdGljIGZpbmFsIENvbGxhdG9yIGVuZ2xpc2hDb2xsYXRvciA9IENvbGxhdG9yLmdldEluc3RhbmNlKExvY2FsZS5FTkdMSVNIKTsKLQotICAgIC8qKiBVc2UgdGhpcyBjaGFyYWN0ZXIgYXMgc3VmZml4ICovCi0gICAgc3RhdGljIGZpbmFsIGNoYXIga2V5d29yZFByZWZpeCA9ICdfJzsKLQotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIGlmIHRoZSBpbnB1dCBzdHJpbmcgaXMgYSB2YWxpZCBDIGtleXdvcmQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgYm9vbGVhbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNDS2V5d29yZChTdHJpbmcga2V5d29yZCkgewotICAgICAgICByZXR1cm4gKEFycmF5cy5iaW5hcnlTZWFyY2goa2V5d29yZHMsIGtleXdvcmQsIGVuZ2xpc2hDb2xsYXRvcikgPj0gMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVHVybnMgYSBDIGtleXdvcmQgc3RyaW5nIGludG8gYSBub24tQyBrZXl3b3JkIHN0cmluZy4gIChSaWdodCBub3cgdGhpcyBzaW1wbHkgbWVhbnMgYXBwZW5kaW5nCi0gICAgICogYW4gdW5kZXJzY29yZS4pCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgbWFrZU5vbkNLZXl3b3JkKFN0cmluZyBrZXl3b3JkKSB7Ci0gICAgICAgIHJldHVybiBrZXl3b3JkUHJlZml4ICsga2V5d29yZCA7Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9kYXRhYmluZGluZy9EZWZhdWx0VHlwZU1hcHBlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2RhdGFiaW5kaW5nL0RlZmF1bHRUeXBlTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjN2NmZDguLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2RhdGFiaW5kaW5nL0RlZmF1bHRUeXBlTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi53c2RsLmRhdGFiaW5kaW5nOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotLyoqIFRoZSBkZWZhdWx0IHR5cGUgbWFwcGVyLiBUaGlzIHR5cGUgbWFwcGVyIGhhcyBubyBkZWZhdWx0IGNvbmZpZ3VyYXRpb25zICovCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFR5cGVNYXBwZXIgZXh0ZW5kcyBUeXBlTWFwcGluZ0FkYXB0ZXIgewotCi0gICAgcHVibGljIERlZmF1bHRUeXBlTWFwcGVyKCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHR5cGUgbWFwcGluZyBuYW1lLiBhbHdheXMgcmV0dXJucyB0aGUgZGVmYXVsdCBtYXBwaW5nCi0gICAgICoKLSAgICAgKiBAc2VlIFR5cGVNYXBwZXIjZ2V0VHlwZU1hcHBpbmdOYW1lKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRUeXBlTWFwcGluZ05hbWUoUU5hbWUgcW5hbWUpIHsKLQotICAgICAgICBpZiAoKHFuYW1lICE9IG51bGwpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZGVmYXVsdENsYXNzTmFtZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvZGF0YWJpbmRpbmcvSmF2YVR5cGVNYXBwZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9kYXRhYmluZGluZy9KYXZhVHlwZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTVmMThiLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9kYXRhYmluZGluZy9KYXZhVHlwZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLndzZGwuZGF0YWJpbmRpbmc7Ci0KLQotLyoqCi0gKiBUaGUgamF2YSB0eXBlIG1hcHBlciBjYW4gZG8gd2l0aG91dCBhbnkgZGVmYXVsdCBjb25maWd1cmF0aW9uIEhvd2V2ZXIgaWYgYW55IHN1Y2ggZGVmYXVsdCB0eXBlCi0gKiBtYXBwaW5ncyBhcmUgbmVlZGVkLCB0aGV5IGNhbiBiZSBwdXQgaW5zaWRlIHRoZSBjb25zdHJ1Y3RvcgotICovCi1wdWJsaWMgY2xhc3MgSmF2YVR5cGVNYXBwZXIgZXh0ZW5kcyBUeXBlTWFwcGluZ0FkYXB0ZXIgewotCi0gICAgcHVibGljIEphdmFUeXBlTWFwcGVyKCkgewotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvZGF0YWJpbmRpbmcvVHlwZU1hcHBlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2RhdGFiaW5kaW5nL1R5cGVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRmMWIwNi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvZGF0YWJpbmRpbmcvVHlwZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi53c2RsLmRhdGFiaW5kaW5nOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1wdWJsaWMgaW50ZXJmYWNlIFR5cGVNYXBwZXIgewotCi0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIG1hcHBpbmcgaXMgdGhlIG9iamVjdCB0eXBlIG9yIHRoZSBub3JtYWwgY2xhc3MgbmFtZSB0eXBlCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgYm9vbGVhbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc09iamVjdE1hcHBpbmdQcmVzZW50KCk7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB0eXBlIG1hcHBpbmcgY2xhc3MgbmFtZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBxbmFtZSBuYW1lIG9mIHRoZSBYTUwgZWxlbWVudCB0byBiZSBtYXBwZWQKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgYSBzdHJpbmcgdGhhdCByZXByZXNlbnRzIHRoZSBwYXJ0aWN1bGFyIHR5cGUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRUeXBlTWFwcGluZ05hbWUoUU5hbWUgcW5hbWUpOwotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdHlwZSBtYXBwaW5nIE9iamVjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBxbmFtZSBuYW1lIG9mIHRoZSBYTUwgZWxlbWVudCB0byBiZSBtYXBwZWQKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgYW4gT2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgcGFydGljdWxhciBjbGFzcyBpbiBhIHByZSBzcGVjaWZpZWQgZm9ybS4gSXQKLSAgICAgKiAgICAgICAgIGNhbiBiZSBhIHNwZWNpZmljIGZvcm1hdCB0byB0aGUgZGF0YWJpbmRpbmcgZnJhbWV3b3JrIHVzZWQuIFRoaXMgYWxsb3dzIHRpZ2h0Ci0gICAgICogICAgICAgICBpbnRlZ3JhdGlvbnMgd2l0aCB0aGUgZGF0YWJpbmRpbmcgZnJhbWV3b3JrLCBhbGxvd2luZyB0aGUgZW1pdHRlciB0byB3cml0ZSB0aGUKLSAgICAgKiAgICAgICAgIGRhdGFiaW5kaW5nIGNsYXNzZXMgaW4gaXRzIG93biB3YXkuCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRUeXBlTWFwcGluZ09iamVjdChRTmFtZSBxbmFtZSk7Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldFFOYW1lVG9NYXBwaW5nT2JqZWN0KFFOYW1lIHFuYW1lKTsKLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHBhcmFtZXRlciBuYW1lLgotICAgICAqCi0gICAgICogQHBhcmFtIHFuYW1lIG5hbWUgb2YgdGhlIFhNTCBlbGVtZW50IHRvIGdldCBhIHBhcmFtZXRlcgotICAgICAqIEByZXR1cm4gUmV0dXJucyBhIHVuaXF1ZSBwYXJhbWV0ZXIgbmFtZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhcmFtZXRlck5hbWUoUU5hbWUgcW5hbWUpOwotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIHR5cGUgbWFwcGluZyBuYW1lIHRvIHRoZSB0eXBlIG1hcHBlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBxbmFtZQotICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqIEBzZWUgI2dldFR5cGVNYXBwaW5nTmFtZShqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZFR5cGVNYXBwaW5nTmFtZShRTmFtZSBxbmFtZSwgU3RyaW5nIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIEFkZHMgYSB0eXBlIG1hcHBpbmcgb2JqZWN0IHRvIHRoZSB0eXBlIG1hcHBlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBxbmFtZSB0aGUgeG1sIFFuYW1lIHRoYXQgdGhpcyB0eXBlIHJlZmVycyB0bwotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgdHlwZSBtYXBwaW5nIG9iamVjdAotICAgICAqIEBzZWUgI2dldFR5cGVNYXBwaW5nT2JqZWN0KGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkVHlwZU1hcHBpbmdPYmplY3QoUU5hbWUgcW5hbWUsIE9iamVjdCB2YWx1ZSk7Ci0KLSAgICAvKiogQHJldHVybiBSZXR1cm5zIGEgbWFwIGNvbnRhaW5pbmcgYWxsIHR5cGUgbWFwcGluZyBuYW1lcyBpLmUuIFFuYW1lIHRvICBjbGFzc25hbWUgKi8KLSAgICBwdWJsaWMgTWFwIGdldEFsbE1hcHBlZE5hbWVzKCk7Ci0KLSAgICAvKiogQHJldHVybiBSZXR1cm5zIGEgbWFwIGNvbnRhaW5pbmcgYWxsIHR5cGUgbWFwcGluZyBtb2RlbCBvYmplY3RzIGkuZS4gUW5hbWUgdG8gbW9kZWwgb2JqZWN0cyAqLwotICAgIHB1YmxpYyBNYXAgZ2V0QWxsTWFwcGVkT2JqZWN0cygpOwotCi0gICAgLyoqIEByZXR1cm4gdGhlIGRlZmF1bHQgbWFwcGluZyBuYW1lIGZvciB0aGlzIHR5cGUgbWFwcGVyICovCi0gICAgcHVibGljIFN0cmluZyBnZXREZWZhdWx0TWFwcGluZ05hbWUoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGRlZmF1bHQgdHlwZSBtYXBwaW5nIC0gdGhlIGRhdGFiaW5kZXJzIG1heSBjaGFuZ2UgdGhlIGRlZmF1bHQgbWFwcGluZyB0byBzdWl0IHRoZWlyCi0gICAgICogZGVmYXVsdCBtYXBwaW5nCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZGVmYXVsdE1hcHBpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0TWFwcGluZ05hbWUoU3RyaW5nIGRlZmF1bHRNYXBwaW5nKTsKLQotCi0gICAgLyoqCi0gICAgICogQWxsb3dzIHRoZSBzdG9yYWdlIG9mIGEgc3RhdHVzIG9iamVjdCB3aXRoIGEgbWFwcGluZyB0byB0aGUgcW5hbWUuIFRoaXMgbWF5IGJlIHVzZWQgdG8gc3RvcmUKLSAgICAgKiBjZXJ0YWluIHN0YXR1cyBpbmZvcm1hdGlvbiB0aGF0IHdpbGwgYmUgdXNlZCBieSBkaWZmZXJlbnQgdHlwZSBtYXBwZXJzLiBBIGdpdmVuIHR5cGUgbWFwcGVyCi0gICAgICogbWF5IGNob29zZSBub3QgdG8gaW1wbGVtZW50IHRoaXMhCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcW5hbWUKLSAgICAgKiBAcGFyYW0gc3RhdHVzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkVHlwZU1hcHBpbmdTdGF0dXMoUU5hbWUgcU5hbWUsIE9iamVjdCBzdGF0dXMpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcmVsZXZhbnQgc3RhdHVzIG9iamVjdCBnaXZlbiB0aGUgcU5hbWUgb2YgdGhlIHhtbCBlbGVtZW50Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gcU5hbWUKLSAgICAgKiBAcmV0dXJuIHRoZSBzdGF0dXMgb2JqZWN0Ci0gICAgICogQHNlZSAjYWRkVHlwZU1hcHBpbmdTdGF0dXMoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSwgT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0VHlwZU1hcHBpbmdTdGF0dXMoUU5hbWUgcU5hbWUpOwotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2RhdGFiaW5kaW5nL1R5cGVNYXBwaW5nQWRhcHRlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2RhdGFiaW5kaW5nL1R5cGVNYXBwaW5nQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDNlMWQyLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9kYXRhYmluZGluZy9UeXBlTWFwcGluZ0FkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIud3NkbC5kYXRhYmluZGluZzsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIubmFtZXNwYWNlLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuSmF2YVV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5pMThuLkNvZGVnZW5NZXNzYWdlczsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVHlwZU1hcHBpbmdBZGFwdGVyIGltcGxlbWVudHMgVHlwZU1hcHBlciB7Ci0KLSAgICAvKioKLSAgICAgKiBEZWZhdWx0IGNsYXNzIG5hbWUgaXMgdGhlIE9NRWxlbWVudCBvciB0aGUgZGVmYXVsdCBjYXNlIEhvd2V2ZXIgdGhlIGV4dGVuc2lvbnMgY2FuIG92ZXJyaWRlCi0gICAgICogdGhlIGRlZmF1bHQgY2xhc3MgdG8gc3VpdCB0aGUgZGF0YWJpbmRpbmcgZnJhbWV3b3JrIQotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdENsYXNzTmFtZSA9IE9NRWxlbWVudC5jbGFzcy5nZXROYW1lKCk7Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RfU0NIRU1BX1VSTCA9IENvbnN0YW50cy5VUklfMjAwMV9TQ0hFTUFfWFNEOwotCi0gICAgLy9oYXNobWFwIHRoYXQgY29udGFpbnMgdGhlIHR5cGUgbWFwcGluZyBuYW1lcwotICAgIHByb3RlY3RlZCBIYXNoTWFwIHFOYW1lMk5hbWVNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgLy9oYXNobWFwIHRoYXQgY29udGFpbnMgdGhlIHR5cGUgbWFwcGluZyBvYmplY3RzCi0gICAgcHJvdGVjdGVkIEhhc2hNYXAgcU5hbWUyT2JqZWN0TWFwID0gbmV3IEhhc2hNYXAoKTsKLQotICAgIC8vaGFzaG1hcCBmb3Iga2VlcGluZyB0aGUgc3RhdHVzIG9iamVjdHMuCi0gICAgcHJvdGVjdGVkIEhhc2hNYXAgcU5hbWUyU3RhdHVzTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotICAgIC8vY291bnRlciB2YXJpYWJsZSB0byBnZW5lcmF0ZSB1bmlxdWUgcGFyYW1ldGVyIElEJ3MKLSAgICBwcm90ZWN0ZWQgaW50IGNvdW50ZXIgPSAwOwotCi0gICAgLy8gdGhpcyBpcyB0byBrZWVwIGdlbmVyYXRlZCBwYXJhbWV0ZXIgbmFtZXMKLSAgICBwcm90ZWN0ZWQgTGlzdCBwYXJhbWV0ZXJOYW1lTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgIHByb3RlY3RlZCBib29sZWFuIGlzT2JqZWN0ID0gZmFsc2U7Ci0KLSAgICAvL1VwcGVyIGxpbWl0IGZvciB0aGUgcGFyYW1ldGUgY291bnQKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBVUFBFUl9QQVJBTV9MSU1JVCA9IDEwMDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNRVRFUl9OQU1FX1NVRkZJWCA9ICJwYXJhbSI7Ci0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHR5cGUgbWFwcGluZyBuYW1lLiBJZiB0eXBlIG1hcHBpbmcgaXMgbm90IGZvdW5kLCByZXR1cm5zIGRlZmF1bHQuCi0gICAgICoKLSAgICAgKiBAc2VlIFR5cGVNYXBwZXIjZ2V0VHlwZU1hcHBpbmdOYW1lKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRUeXBlTWFwcGluZ05hbWUoUU5hbWUgcW5hbWUpIHsKLQotICAgICAgICBpZiAoKHFuYW1lICE9IG51bGwpKSB7Ci0gICAgICAgICAgICBPYmplY3QgbyA9IHFOYW1lMk5hbWVNYXAuZ2V0KHFuYW1lKTsKLSAgICAgICAgICAgIGlmIChvICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKFN0cmluZylvOwotICAgICAgICAgICAgfSBlbHNlIGlmIChDb25zdGFudHMuWFNEX0FOWVRZUEUuZXF1YWxzKHFuYW1lKSB8fAotICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuWFNEX0FOWS5lcXVhbHMocW5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRDbGFzc05hbWU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKENvbnN0YW50cy5YU0RfU1RSSU5HLmVxdWFscyhxbmFtZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nLmNsYXNzLmdldE5hbWUoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVubWF0Y2hlZFR5cGVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICBDb2RlZ2VuTWVzc2FnZXMuZ2V0TWVzc2FnZSgiZGF0YWJpbmRpbmcudHlwZW1hcHBlci50eXBldW5tYXRjaGVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFuYW1lLmdldExvY2FsUGFydCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpCi0gICAgICAgICAgICAgICAgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLQotICAgIH0KLQotICAgIC8qKiBAc2VlIFR5cGVNYXBwZXIjZ2V0UGFyYW1ldGVyTmFtZShqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lKSAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFyYW1ldGVyTmFtZShRTmFtZSBxbmFtZSkgewotICAgICAgICBpZiAoY291bnRlciA9PSBVUFBFUl9QQVJBTV9MSU1JVCkgewotICAgICAgICAgICAgY291bnRlciA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKChxbmFtZSAhPSBudWxsKSAmJiAocW5hbWUuZ2V0TG9jYWxQYXJ0KCkubGVuZ3RoKCkgIT0gMCkpIHsKLSAgICAgICAgICAgIFN0cmluZyBwYXJhbU5hbWUgPSBKYXZhVXRpbHMueG1sTmFtZVRvSmF2YUlkZW50aWZpZXIocW5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotCi0gICAgICAgICAgICBpZiAocGFyYW1ldGVyTmFtZUxpc3QuY29udGFpbnMocGFyYW1OYW1lKSkgewotICAgICAgICAgICAgICAgIHBhcmFtTmFtZSA9IHBhcmFtTmFtZSArIGNvdW50ZXIrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBhcmFtZXRlck5hbWVMaXN0LmFkZChwYXJhbU5hbWUpOwotICAgICAgICAgICAgcmV0dXJuIHBhcmFtTmFtZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBQQVJBTUVURVJfTkFNRV9TVUZGSVggKyBjb3VudGVyKys7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiogQHNlZSBUeXBlTWFwcGVyI2FkZFR5cGVNYXBwaW5nTmFtZShqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lLFN0cmluZykgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRUeXBlTWFwcGluZ05hbWUoUU5hbWUgcW5hbWUsIFN0cmluZyB2YWx1ZSkgewotICAgICAgICBxTmFtZTJOYW1lTWFwLnB1dChxbmFtZSwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBxbmFtZQotICAgICAqIEByZXR1cm4gUmV0dXJucyBvYmplY3QgcmVwcmVzZW50aW5nIGEgc3BlY2lmaWMgZm9ybSBvZiB0aGUgWFNEIGNvbXBpbGF0aW9uLgotICAgICAqIEBzZWUgVHlwZU1hcHBlciNnZXRUeXBlTWFwcGluZ09iamVjdChqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lKQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0VHlwZU1hcHBpbmdPYmplY3QoUU5hbWUgcW5hbWUpIHsKLSAgICAgICAgcmV0dXJuIHFOYW1lMk9iamVjdE1hcC5nZXQocW5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHJldHVybiB0aGUgY2xhc3MgbmFtZSBmb3IgdGhpcyBRTmFtZQotICAgICAqIEBwYXJhbSBxbmFtZQotICAgICAqIEByZXR1cm4gcmV0dXJuIGNsYXNzIG5hbWVzCi0gICAgICovCi0KLSAgICBwdWJsaWMgT2JqZWN0IGdldFFOYW1lVG9NYXBwaW5nT2JqZWN0KFFOYW1lIHFuYW1lKXsKLSAgICAgICAgcmV0dXJuIHFOYW1lMk5hbWVNYXAuZ2V0KHFuYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gcW5hbWUKLSAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKiBAc2VlIFR5cGVNYXBwZXIjYWRkVHlwZU1hcHBpbmdPYmplY3QoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSwgT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZFR5cGVNYXBwaW5nT2JqZWN0KFFOYW1lIHFuYW1lLCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgaXNPYmplY3QgPSB0cnVlOwotICAgICAgICBxTmFtZTJPYmplY3RNYXAucHV0KHFuYW1lLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBSZXR1cm5zIGJvb2xlYW4uCi0gICAgICogQHNlZSBUeXBlTWFwcGVyI2lzT2JqZWN0TWFwcGluZ1ByZXNlbnQoKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzT2JqZWN0TWFwcGluZ1ByZXNlbnQoKSB7Ci0gICAgICAgIHJldHVybiBpc09iamVjdDsKLSAgICB9Ci0KLSAgICAvKiogQHNlZSBUeXBlTWFwcGVyI2dldEFsbE1hcHBlZE5hbWVzKCkgKi8KLSAgICBwdWJsaWMgTWFwIGdldEFsbE1hcHBlZE5hbWVzKCkgewotICAgICAgICByZXR1cm4gcU5hbWUyTmFtZU1hcDsKLSAgICB9Ci0KLSAgICAvKiogQHNlZSBUeXBlTWFwcGVyI2dldEFsbE1hcHBlZE9iamVjdHMoKSAqLwotICAgIHB1YmxpYyBNYXAgZ2V0QWxsTWFwcGVkT2JqZWN0cygpIHsKLSAgICAgICAgcmV0dXJuIHFOYW1lMk9iamVjdE1hcDsKLSAgICB9Ci0KLSAgICAvKiogQHNlZSBUeXBlTWFwcGVyI2dldERlZmF1bHRNYXBwaW5nTmFtZSgpICovCi0gICAgcHVibGljIFN0cmluZyBnZXREZWZhdWx0TWFwcGluZ05hbWUoKSB7Ci0gICAgICAgIHJldHVybiBkZWZhdWx0Q2xhc3NOYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBkZWZhdWx0TWFwcGluZwotICAgICAqIEBzZWUgVHlwZU1hcHBlciNzZXREZWZhdWx0TWFwcGluZ05hbWUoU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHRNYXBwaW5nTmFtZShTdHJpbmcgZGVmYXVsdE1hcHBpbmcpIHsKLSAgICAgICAgdGhpcy5kZWZhdWx0Q2xhc3NOYW1lID0gZGVmYXVsdE1hcHBpbmc7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHFOYW1lCi0gICAgICogQHBhcmFtIHN0YXR1cwotICAgICAqIEBzZWUgVHlwZU1hcHBlciNhZGRUeXBlTWFwcGluZ1N0YXR1cyhqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lLCBPYmplY3QpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkVHlwZU1hcHBpbmdTdGF0dXMoUU5hbWUgcU5hbWUsIE9iamVjdCBzdGF0dXMpIHsKLSAgICAgICAgdGhpcy5xTmFtZTJTdGF0dXNNYXAucHV0KHFOYW1lLCBzdGF0dXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBxTmFtZQotICAgICAqIEBzZWUgVHlwZU1hcHBlciNnZXRUeXBlTWFwcGluZ1N0YXR1cyhqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lKQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0VHlwZU1hcHBpbmdTdGF0dXMoUU5hbWUgcU5hbWUpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucU5hbWUyU3RhdHVzTWFwLmdldChxTmFtZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2RhdGFiaW5kaW5nL1VubWF0Y2hlZFR5cGVFeGNlcHRpb24uamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9kYXRhYmluZGluZy9Vbm1hdGNoZWRUeXBlRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiMjcxZmMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2RhdGFiaW5kaW5nL1VubWF0Y2hlZFR5cGVFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi53c2RsLmRhdGFiaW5kaW5nOwotCi0vKiogQSBzaW1wbGUgZXhjZXB0aW9uIHRoYXQgd2lsbCBiZSB0aHJvd24gaWYgYSB0eXBlIGlzIG5vdCBtYXRjaGVkISAqLwotcHVibGljIGNsYXNzIFVubWF0Y2hlZFR5cGVFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKLQotICAgIHB1YmxpYyBVbm1hdGNoZWRUeXBlRXhjZXB0aW9uKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBVbm1hdGNoZWRUeXBlRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBVbm1hdGNoZWRUeXBlRXhjZXB0aW9uKFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICBzdXBlcihjYXVzZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFVubWF0Y2hlZFR5cGVFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlLCBjYXVzZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2kxOG4vQ29kZWdlbk1lc3NhZ2VzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvaTE4bi9Db2RlZ2VuTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDM1NGEwNi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvaTE4bi9Db2RlZ2VuTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIud3NkbC5pMThuOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pMThuLk1lc3NhZ2VCdW5kbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pMThuLk1lc3NhZ2VzQ29uc3RhbnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotLyoqCi0gKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuaTE4bi5NZXNzYWdlcyBUaGUgaW1wbGVtZW50YXRpb24gaXMgdGhlIHNhbWUgYnV0IGp1c3QgdGhpc0NsYXNzIHN0YXRpYwotICogICAgICByZWZlcmVuY2UgaGFzIENvZGVnZW5NZXNzYWdlcy5jbGFzcwotICovCi1wdWJsaWMgY2xhc3MgQ29kZWdlbk1lc3NhZ2VzIHsKLQotICAgIC8vT25seSB0aGlzIGNoYW5nZXMgZnJvbSB0aGUgb3JpZ2luYWwgY2xhc3MKLSAgICBwcml2YXRlIHN0YXRpYyBDbGFzcyB0aGlzQ2xhc3MgPSBDb2RlZ2VuTWVzc2FnZXMuY2xhc3M7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgcHJvamVjdE5hbWUgPSBNZXNzYWdlc0NvbnN0YW50cy5wcm9qZWN0TmFtZTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyByZXNvdXJjZU5hbWUgPSBNZXNzYWdlc0NvbnN0YW50cy5yZXNvdXJjZU5hbWU7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9jYWxlIGxvY2FsZSA9IE1lc3NhZ2VzQ29uc3RhbnRzLmxvY2FsZTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBwYWNrYWdlTmFtZSA9IGdldFBhY2thZ2UodGhpc0NsYXNzLmdldE5hbWUoKSk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIgPSB0aGlzQ2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFJlc291cmNlQnVuZGxlIHBhcmVudCA9Ci0gICAgICAgICAgICAoTWVzc2FnZXNDb25zdGFudHMucm9vdFBhY2thZ2VOYW1lLmVxdWFscyhwYWNrYWdlTmFtZSkpCi0gICAgICAgICAgICAgICAgICAgID8gbnVsbAotICAgICAgICAgICAgICAgICAgICA6IE1lc3NhZ2VzQ29uc3RhbnRzLnJvb3RCdW5kbGU7Ci0KLQotICAgIC8qKiAqKiBOTyBORUVEIFRPIENIQU5HRSBBTllUSElORyBCRUxPVyAqKioqICovCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNZXNzYWdlQnVuZGxlIG1lc3NhZ2VCdW5kbGUgPQotICAgICAgICAgICAgbmV3IE1lc3NhZ2VCdW5kbGUocHJvamVjdE5hbWUsIHBhY2thZ2VOYW1lLCByZXNvdXJjZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbGUsIGNsYXNzTG9hZGVyLCBwYXJlbnQpOwotCi0gICAgLyoqCi0gICAgICogR2V0cyBhIG1lc3NhZ2UgZnJvbSByZXNvdXJjZS5wcm9wZXJ0aWVzIGZyb20gdGhlIHBhY2thZ2Ugb2YgdGhlIGdpdmVuIG9iamVjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXkgVGhlIHJlc291cmNlIGtleQotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgZm9ybWF0dGVkIG1lc3NhZ2UuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZShTdHJpbmcga2V5KQotICAgICAgICAgICAgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBtZXNzYWdlQnVuZGxlLmdldE1lc3NhZ2Uoa2V5KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGEgbWVzc2FnZSBmcm9tIHJlc291cmNlLnByb3BlcnRpZXMgZnJvbSB0aGUgcGFja2FnZSBvZiB0aGUgZ2l2ZW4gb2JqZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIGtleSAgVGhlIHJlc291cmNlIGtleQotICAgICAqIEBwYXJhbSBhcmcwIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7MH0KLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGZvcm1hdHRlZCBtZXNzYWdlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIGtleSwgU3RyaW5nIGFyZzApCi0gICAgICAgICAgICB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG1lc3NhZ2VCdW5kbGUuZ2V0TWVzc2FnZShrZXksIGFyZzApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgYSBtZXNzYWdlIGZyb20gcmVzb3VyY2UucHJvcGVydGllcyBmcm9tIHRoZSBwYWNrYWdlIG9mIHRoZSBnaXZlbiBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5ICBUaGUgcmVzb3VyY2Uga2V5Ci0gICAgICogQHBhcmFtIGFyZzAgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHswfQotICAgICAqIEBwYXJhbSBhcmcxIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7MX0KLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGZvcm1hdHRlZCBtZXNzYWdlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIGtleSwgU3RyaW5nIGFyZzAsIFN0cmluZyBhcmcxKQotICAgICAgICAgICAgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBtZXNzYWdlQnVuZGxlLmdldE1lc3NhZ2Uoa2V5LCBhcmcwLCBhcmcxKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGEgbWVzc2FnZSBmcm9tIHJlc291cmNlLnByb3BlcnRpZXMgZnJvbSB0aGUgcGFja2FnZSBvZiB0aGUgZ2l2ZW4gb2JqZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIGtleSAgVGhlIHJlc291cmNlIGtleQotICAgICAqIEBwYXJhbSBhcmcwIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7MH0KLSAgICAgKiBAcGFyYW0gYXJnMSBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezF9Ci0gICAgICogQHBhcmFtIGFyZzIgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHsyfQotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgZm9ybWF0dGVkIG1lc3NhZ2UuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZShTdHJpbmcga2V5LCBTdHJpbmcgYXJnMCwgU3RyaW5nIGFyZzEsIFN0cmluZyBhcmcyKQotICAgICAgICAgICAgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBtZXNzYWdlQnVuZGxlLmdldE1lc3NhZ2Uoa2V5LCBhcmcwLCBhcmcxLCBhcmcyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGEgbWVzc2FnZSBmcm9tIHJlc291cmNlLnByb3BlcnRpZXMgZnJvbSB0aGUgcGFja2FnZSBvZiB0aGUgZ2l2ZW4gb2JqZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIGtleSAgVGhlIHJlc291cmNlIGtleQotICAgICAqIEBwYXJhbSBhcmcwIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7MH0KLSAgICAgKiBAcGFyYW0gYXJnMSBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezF9Ci0gICAgICogQHBhcmFtIGFyZzIgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHsyfQotICAgICAqIEBwYXJhbSBhcmczIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7M30KLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGZvcm1hdHRlZCBtZXNzYWdlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIGtleSwgU3RyaW5nIGFyZzAsIFN0cmluZyBhcmcxLCBTdHJpbmcgYXJnMiwgU3RyaW5nIGFyZzMpCi0gICAgICAgICAgICB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG1lc3NhZ2VCdW5kbGUuZ2V0TWVzc2FnZShrZXksIGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgYSBtZXNzYWdlIGZyb20gcmVzb3VyY2UucHJvcGVydGllcyBmcm9tIHRoZSBwYWNrYWdlIG9mIHRoZSBnaXZlbiBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5ICBUaGUgcmVzb3VyY2Uga2V5Ci0gICAgICogQHBhcmFtIGFyZzAgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHswfQotICAgICAqIEBwYXJhbSBhcmcxIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7MX0KLSAgICAgKiBAcGFyYW0gYXJnMiBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezJ9Ci0gICAgICogQHBhcmFtIGFyZzMgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHszfQotICAgICAqIEBwYXJhbSBhcmc0IFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7NH0KLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGZvcm1hdHRlZCBtZXNzYWdlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIGtleSwgU3RyaW5nIGFyZzAsIFN0cmluZyBhcmcxLCBTdHJpbmcgYXJnMiwgU3RyaW5nIGFyZzMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYXJnNCkKLSAgICAgICAgICAgIHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbWVzc2FnZUJ1bmRsZS5nZXRNZXNzYWdlKGtleSwgYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhIG1lc3NhZ2UgZnJvbSByZXNvdXJjZS5wcm9wZXJ0aWVzIGZyb20gdGhlIHBhY2thZ2Ugb2YgdGhlIGdpdmVuIG9iamVjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXkgIFRoZSByZXNvdXJjZSBrZXkKLSAgICAgKiBAcGFyYW0gYXJncyBBbiBhcnJheSBvZiBvYmplY3RzIHRvIHBsYWNlIGluIGNvcnJlc3BvbmRpbmcgdmFyaWFibGVzCi0gICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBmb3JtYXR0ZWQgbWVzc2FnZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBrZXksIFN0cmluZ1tdIGFyZ3MpCi0gICAgICAgICAgICB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG1lc3NhZ2VCdW5kbGUuZ2V0TWVzc2FnZShrZXksIGFyZ3MpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgZ2V0UmVzb3VyY2VCdW5kbGUoKSB7Ci0gICAgICAgIHJldHVybiBtZXNzYWdlQnVuZGxlLmdldFJlc291cmNlQnVuZGxlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBNZXNzYWdlQnVuZGxlIGdldE1lc3NhZ2VCdW5kbGUoKSB7Ci0gICAgICAgIHJldHVybiBtZXNzYWdlQnVuZGxlOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRQYWNrYWdlKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHJldHVybiBuYW1lLnN1YnN0cmluZygwLCBuYW1lLmxhc3RJbmRleE9mKCcuJykpLmludGVybigpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2kxOG4vcmVzb3VyY2UucHJvcGVydGllcyBiL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9pMThuL3Jlc291cmNlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkNzQwZDguLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2kxOG4vcmVzb3VyY2UucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2MiArMCwwIEBACi0jCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLQotIyBUcmFuc2xhdGlvbiBpbnN0cnVjdGlvbnMuCi0jIDEuICBFYWNoIG1lc3NhZ2UgbGluZSBpcyBvZiB0aGUgZm9ybSBrZXk9dmFsdWUuCi0jICAgICBUcmFuc2xhdGUgdGhlIHZhbHVlLCBETyBOT1QgdHJhbnNsYXRlIHRoZSBrZXkuCi0jIDIuICBUaGUgbWVzc2FnZXMgbWF5IGNvbnRhaW4gYXJndW1lbnRzIHRoYXQgd2lsbCBiZSBmaWxsZWQgaW4KLSMgICAgIGJ5IHRoZSBydW50aW1lLiAgVGhlc2UgYXJlIG9mIHRoZSBmb3JtOiB7MH0sIHsxfSwgZXRjLgotIyAgICAgVGhlc2UgbXVzdCBhcHBlYXIgYXMgaXMgaW4gdGhlIG1lc3NhZ2UsIHRob3VnaCB0aGUgb3JkZXIKLSMgICAgIG1heSBiZSBjaGFuZ2VkIHRvIHN1cHBvcnQgcHJvcGVyIGxhbmd1YWdlIHN5bnRheC4KLSMgMy4gIElmIGEgc2luZ2xlIHF1b3RlIGNoYXJhY3RlciBpcyB0byBhcHBlYXIgaW4gdGhlIHJlc3VsdGluZwotIyAgICAgbWVzc2FnZSwgaXQgbXVzdCBhcHBlYXIgaW4gdGhpcyBmaWxlIGFzIHR3byBjb25zZWN1dGl2ZQotIyAgICAgc2luZ2xlIHF1b3RlIGNoYXJhY3RlcnMuCi0jIDQuICBMaW5lcyBiZWdpbm5pbmcgd2l0aCAiIyIgKGxpa2UgdGhpcyBvbmUpIGFyZSBjb21tZW50IGxpbmVzCi0jICAgICBhbmQgbWF5IGNvbnRhaW4gdHJhbnNsYXRpb24gaW5zdHJ1Y3Rpb25zLiAgVGhleSBuZWVkIG5vdCBiZQotIyAgICAgdHJhbnNsYXRlZCB1bmxlc3MgeW91ciB0cmFuc2xhdGVkIGZpbGUsIHJhdGhlciB0aGFuIHRoaXMgZmlsZSwKLSMgICAgIHdpbGwgc2VydmUgYXMgYSBiYXNlIGZvciBvdGhlciB0cmFuc2xhdG9ycy4KLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyBXU0RMMkNvZGUgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXdzZGwyY29kZS5hcmc9VXNhZ2U6IFdTREwySmF2YSBbb3B0aW9uc10gLXVyaSA8dXJsIG9yIHBhdGg+IDogQSB1cmwgb3IgcGF0aCB0byBhIFdTREwKLXdzZGwyY29kZS5hcmcxPVxud2hlcmUgW29wdGlvbnNdIGluY2x1ZGU6Ci13c2RsMmNvZGUuYXJnMj0gIC1vIDxwYXRoPiAgICAgICAgICAgICAgICBTcGVjaWZ5IGEgZGlyZWN0b3J5IHBhdGggZm9yIHRoZSBnZW5lcmF0ZWQgY29kZS4KLXdzZGwyY29kZS5hcmczPSAgLWEgICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRlIGFzeW5jIHN0eWxlIGNvZGUgb25seSAoRGVmYXVsdDogb2ZmKS4KLXdzZGwyY29kZS5hcmc0PSAgLXMgICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRlIHN5bmMgc3R5bGUgY29kZSBvbmx5IChEZWZhdWx0OiBvZmYpLiBUYWtlcyBwcmVjZWRlbmNlIG92ZXIgLWEuCi13c2RsMmNvZGUuYXJnNT0gIC1wIDxwa2cxPiAgICAgICAgICAgICAgICBTcGVjaWZ5IGEgY3VzdG9tIHBhY2thZ2UgbmFtZSBmb3IgdGhlIGdlbmVyYXRlZCBjb2RlLgotd3NkbDJjb2RlLmFyZzY9ICAtbCA8bGFuZ3VhZ2U+ICAgICAgICAgICAgVmFsaWQgbGFuZ3VhZ2VzIGFyZSBqYXZhIGFuZCBjIChEZWZhdWx0OiBqYXZhKS4KLXdzZGwyY29kZS5hcmc3PSAgLXQgICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRlIGEgdGVzdCBjYXNlIGZvciB0aGUgZ2VuZXJhdGVkIGNvZGUuCi13c2RsMmNvZGUuYXJnOD0gIC1zcyAgICAgICAgICAgICAgICAgICAgICBHZW5lcmF0ZSBzZXJ2ZXIgc2lkZSBjb2RlIChpLmUuIHNrZWxldG9ucykgKERlZmF1bHQ6IG9mZikuCi13c2RsMmNvZGUuYXJnOT0gIC1zZCAgICAgICAgICAgICAgICAgICAgICBHZW5lcmF0ZSBzZXJ2aWNlIGRlc2NyaXB0b3IgKGkuZS4gc2VydmljZXMueG1sKS4gKERlZmF1bHQ6IG9mZikuIFZhbGlkIHdpdGggLXNzLgotd3NkbDJjb2RlLmFyZzEwPSAgLWQgPGRhdGFiaW5kaW5nPiAgICAgICAgIFZhbGlkIGRhdGFiaW5kaW5nKHMpIGFyZSBhZGIsIHhtbGJlYW5zLCBqaWJ4IGFuZCBqYXhicmkgKERlZmF1bHQ6IGFkYikuCi13c2RsMmNvZGUuYXJnMTE9ICAtZyAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJhdGVzIGFsbCB0aGUgY2xhc3Nlcy4gVmFsaWQgb25seSB3aXRoIC1zcy4KLXdzZGwyY29kZS5hcmcxMj0gIC1wbiA8cG9ydF9uYW1lPiAgICAgICAgICBDaG9vc2UgYSBzcGVjaWZpYyBwb3J0IHdoZW4gdGhlcmUgYXJlIG11bHRpcGxlIHBvcnRzIGluIHRoZSB3c2RsLgotd3NkbDJjb2RlLmFyZzEzPSAgLXNuIDxzZXJ2aWNlX25hbWU+ICAgICAgIENob29zZSBhIHNwZWNpZmljIHNlcnZpY2Ugd2hlbiB0aGVyZSBhcmUgbXVsdGlwbGUgc2VydmljZXMgaW4gdGhlIHdzZGwuCi13c2RsMmNvZGUuYXJnMTQ9ICAtdSAgICAgICAgICAgICAgICAgICAgICAgVW5wYWNrcyB0aGUgZGF0YWJpbmRpbmcgY2xhc3Nlcwotd3NkbDJjb2RlLmFyZzE1PSAgLXIgPHBhdGg+ICAgICAgICAgICAgICAgIFNwZWNpZnkgYSByZXBvc2l0b3J5IGFnYWluc3Qgd2hpY2ggY29kZSBpcyBnZW5lcmF0ZWQuCi13c2RsMmNvZGUuYXJnMTY9ICAtbnMycCBuczE9cGtnMSxuczI9cGtnMiAgU3BlY2lmeSBhIGN1c3RvbSBwYWNrYWdlIG5hbWUgZm9yIGVhY2ggbmFtZXNwYWNlIHNwZWNpZmllZCBpbiB0aGUgd3NkbCdzIHNjaGVtYS4KLXdzZGwyY29kZS5hcmcxNz0gIC1zc2kgICAgICAgICAgICAgICAgICAgICBHZW5lcmF0ZSBhbiBpbnRlcmZhY2UgZm9yIHRoZSBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIChEZWZhdWx0OiBvZmYpLgotd3NkbDJjb2RlLmFyZzE4PSAgLXd2IDx2ZXJzaW9uPiAgICAgICAgICAgIFdTREwgVmVyc2lvbi4gVmFsaWQgT3B0aW9ucyA6IDIsIDIuMCwgMS4xCi13c2RsMmNvZGUuYXJnMTk9ICAtUyA8cGF0aD4gICAgICAgICAgICAgICAgU3BlY2lmeSBhIGRpcmVjdG9yeSBwYXRoIGZvciBnZW5lcmF0ZWQgc291cmNlCi13c2RsMmNvZGUuYXJnMjA9ICAtUiA8cGF0aD4gICAgICAgICAgICAgICAgU3BlY2lmeSBhIGRpcmVjdG9yeSBwYXRoIGZvciBnZW5lcmF0ZWQgcmVzb3VyY2VzCi13c2RsMmNvZGUuYXJnMjE9ICAtZW0gPGZpbGUgcGF0aD4gICAgICAgICAgU3BlY2lmeSBhbiBleHRlcm5hbCBtYXBwaW5nIGZpbGUKLXdzZGwyY29kZS5hcmcyMj0gIC1mICAgICAgICAgICAgICAgICAgICAgICBGbGF0dGVucyB0aGUgZ2VuZXJhdGVkIGZpbGVzCi13c2RsMmNvZGUuYXJnMjM9ICAtdXcgICAgICAgICAgICAgICAgICAgICAgU3dpdGNoIG9uIHVuLXdyYXBwaW5nLgotd3NkbDJjb2RlLmFyZzI0PSAgLXhzZGNvbmZpZyA8ZmlsZSBwYXRoPiAgIFVzZSBYTUxCZWFucyAueHNkY29uZmlnIGZpbGUuIFZhbGlkIG9ubHkgd2l0aCAtZCB4bWxiZWFucy4KLXdzZGwyY29kZS5hcmcyNT0gIC1hcCAgICAgICAgICAgICAgICAgICAgICBHZW5lcmF0ZSBjb2RlIGZvciBhbGwgcG9ydHMKLXdzZGwyY29kZS5hcmcyNj0gIC1vciAgICAgICAgICAgICAgICAgICAgICBPdmVyd3JpdGUgdGhlIGV4aXN0aW5nIGNsYXNzZXMKLXdzZGwyY29kZS5hcmcyNz0gIC1iICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmF0ZSBBeGlzIDEueCBiYWNrd2FyZCBjb21wYXRpYmxlIGNvZGUuCi13c2RsMmNvZGUuYXJnMjg9ICAtc3AgICAgICAgICAgICAgICAgICAgICAgU3VwcHJlc3MgbmFtZXNwYWNlIHByZWZpeGVzIChPcHRpbXphdGlvbiB0aGF0IHJlZHVjZXMgc2l6ZSBvZiBzb2FwIHJlcXVlc3QvcmVzcG9uc2UpCi13c2RsMmNvZGUuYXJnMjk9ICAtRTxrZXk+IDx2YWx1ZT4gICAgICAgICAgRXh0cmEgY29uZmlndXJhdGlvbiBvcHRpb25zIHNwZWNpZmljIHRvIGNlcnRhaW4gZGF0YWJpbmRpbmdzLiBFeGFtcGxlczoKLXdzZGwyY29kZS5hcmczMD0gICAgICAgICAgICAgICAgICAgICAgICAgICBcdFx0XHQgICAtRWJpbmRpbmdmaWxlIDxwYXRoPiAgICAgICAgICAgICAgICAgICAoZm9yIGppYngpIC0gc3BlY2lmeSB0aGUgZmlsZSBwYXRoIGZvciB0aGUgYmluZGluZyBmaWxlCi13c2RsMmNvZGUuYXJnMzE9ICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcdFx0ICAgLUV0eXBlc3lzdGVtbmFtZSA8bXlfdHlwZV9zeXN0ZW1fbmFtZT4gKGZvciB4bWxiZWFucykgLSBvdmVycmlkZSB0aGUgcmFuZG9tbHkgZ2VuZXJhdGVkIHR5cGUgc3lzdGVtIG5hbWUKLXdzZGwyY29kZS5hcmczMj0gICAgICAgICAgICAgICAgICAgICAgICAgICBcdFx0XHQgICAtRWphdmF2ZXJzaW9uIDEuNSAgICAgICAgICAgICAgICAgICAgICAoZm9yIHhtbGJlYW5zKSAtIGdlbmVyYXRlcyBKYXZhIDEuNSBjb2RlICh0eXBlZCBsaXN0cyBpbnN0ZWFkIG9mIGFycmF5cykgCi13c2RsMmNvZGUuYXJnMzM9ICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcdFx0ICAgLUVtcCA8cGFja2FnZSBuYW1lPiAoZm9yIEFEQikgLSBleHRlbnNpb24gbWFwcGVyIHBhY2thZ2UgbmFtZQotd3NkbDJjb2RlLmFyZzM0PSAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XHRcdCAgIC1Fb3N2IChmb3IgQURCKSAtIHR1cm4gb2ZmIHN0cmljdCB2YWxpZGF0aW9uLgotd3NkbDJjb2RlLmFyZzM1PSAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XHRcdCAgIC1Fd2RjIChmb3IgeG1sYmVhbnMpIC0gR2VuZXJhdGUgY29kZSB3aXRoIGEgZHVtbXkgc2NoZW1hLiBpZiBzb21lb25lIHVzZSB0aGlzIG9wdGlvbgotd3NkbDJjb2RlLmFyZzM2PSAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XHRcdCAgICAgIHRoZXkgaGF2ZSB0byBnZW5lcmF0ZSB0aGUgeG1sYmVhbnMgY29kZSBzZXBlcmF0ZWx5IHdpdGggdGhlIHNjb21wIGNvbW1hbmQgY29tZXMgd2l0aCB0aGUKLXdzZGwyY29kZS5hcmczNz0gICAgICAgICAgICAgICAgICAgICAgICAgICBcdFx0XHQgICAgICB4bWxiZWFucyBkaXN0cmlidXRpb24gYW5kIHJlcGxhY2UgdGhlIEF4aXMyIGdlbmVyYXRlZCBjbGFzc2VzIHdpdGggY29ycmVjdCBjbGFzc2VzCi13c2RsMmNvZGUuYXJnMzg9ICAtLW5vQnVpbGRYTUwgICAgICAgICAgICAgRG9uJ3QgZ2VuZXJhdGUgdGhlIGJ1aWxkLnhtbCBpbiB0aGUgb3V0cHV0IGRpcmVjdG9yeQotd3NkbDJjb2RlLmFyZzM5PSAgLS1ub1dTREwgICAgICAgICAgICAgICAgIERvbid0IGdlbmVyYXRlIFdTREwncyBpbiB0aGUgcmVzb3VyY2VzIGRpcmVjdG9yeQotd3NkbDJjb2RlLmFyZzQwPSAgLS1ub01lc3NhZ2VSZWNlaXZlciAgICAgIERvbid0IGdlbmVyYXRlIGEgTWVzc2FnZVJlY2VpdmVyIGluIHRoZSBnZW5lcmF0ZWQgc291cmNlcwotd3NkbDJjb2RlLmFyZzQxPSAgLS1odHRwLXByb3h5LWhvc3QgPGhvc3Q+IFByb3h5IGhvc3QgYWRkcmVzcyBpZiB5b3UgYXJlIGJlaGluZCBhIGZpcmV3YWxsCi13c2RsMmNvZGUuYXJnNDI9ICAtLWh0dHAtcHJveHktcG9ydCA8cG9ydD4gUHJveHkgcG9ydCBhZGRyZXNzIGlmIHlvdSBhcmUgYmVoaW5kIGEgZmlyZXdhbGwKLXdzZGwyY29kZS5hcmc0Mz0gIC1lcCA8cGFja2FnZS1uYW1lLWxpc3Q+ICBFeGNsdWRlIHBhY2thZ2VzIC0gdGhlc2UgcGFja2FnZXMgYXJlIGRlbGV0ZWQgYWZ0ZXIgY29kZSBnZW5lcmF0aW9uCi13c2RsMmNvZGUuYXJnNDQ9ICAtc2luIDxpbnRlcmZhY2UtbmFtZT4gICAgU2tlbGV0b24gaW50ZXJmYWNlIG5hbWUgLSB1c2VkIHRvIHNwZWNpZnkgYSBuYW1lIGZvciBza2VsZXRvbiBpbnRlcmZhY2Ugb3RoZXIgdGhhbiB0aGUgZGVmYXVsdCBvbmUgCi13c2RsMmNvZGUuYXJnNDU9ICAtc2NuIDxjbGFzcy1uYW1lPiAgICAgICAgU2tlbGV0b24gY2xhc3MgbmFtZSAtIHVzZWQgdG8gc3BlY2lmeSBhIG5hbWUgZm9yIHNrZWxldG9uIGNsYXNzIG90aGVyIHRoYW4gdGhlIGRlZmF1bHQgb25lCi13c2RsMmNvZGUuYXJnNDY9ICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcdFx0ICAgLUViaW5kaW5nRmlsZU5hbWUgPHBhdGg+ICAgICAgICAgICAgICAgKGZvciBqYXhicmkpIC0gc3BlY2lmeSB0aGUgZmlsZSBwYXRoIGZvciB0aGUgZXBpc29kZSBmaWxlCi13c2RsMmNvZGUuYXJnNDc9ICAtb2FhIDxvdmVycmlkZS1hYnNvbHV0ZS1hZGRyZXNzPiAgLWNoYW5nZSB0aGUgYWJzb2x1dGUgaHR0cCBhZGRyZXNzZXMgdG8gbG9jYWwgZmlsZSBhZGRyZXNzZXMgZ2VuZXJhdGVkIGJ5IHdzZGwyamF2YSB0b29sCi13c2RsMmNvZGUuYXJnNDg9ICAtZWJjIDxleGNlcHRpb24tYmFzZS1jbGFzcz4gIC1nZW5lcmF0ZWQgRXhjZXB0aW9ucyBhcmUgaW5oZXJpdGVkIGZyb20gdGhpcyBleGNlcHRpb24gcmF0aGVyIHRoYW4gdGhlIGphdmEubGFuZy5FeGNlcHRpb24gY2xhc3MKLXdzZGwyY29kZS5hcmc0OT0gIC11b24gPHVzZS1vcGVyYXRpb24tbmFtZT4gIC1ieSBkZWZhdWx0IHRoZSBmaXJzdCBsZXR0ZXIgb2YgdGhlIGdlbmVyYXRlZCBtZXRob2QgbmFtZSBjaGFuZ2VlZCB0byBsb3dlcmNhc2UuIFRoaXMgb3B0aW9uIHN0b3BzIHRoYXQgYW5kIG1ha2UgaXQgc2FtZSBhcyBvcGVyYXRpb24gbmFtZQotCi0jIyMjIyMjIyMjIyMjIyMjIyMgcHJvcCBmaWxlIGxvYWRlciAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXByb3BmaWxlbG9hZC5mcmFtZXdvcmtNaXNtYXRjaD1OdW1iZXIgb2YgZnJhbWV3b3JrcyBhbmQgZXh0ZW5zaW9uIG5hbWVzIGRvIG5vdCBtYXRjaCEKLXByb3BmaWxlbG9hZC51bmtub3duRnJhbWV3b3JrPVVua25vd24gZnJhbWV3b3JrIHNwZWNpZmllZCBmb3IgZGVmYXVsdCEKLXByb3BmaWxlbG9hZC5lbWl0dGVyTWlzc2luZz1ObyBlbWl0dGVycyBmb3VuZCEKLXByb3BmaWxlbG9hZC51bmtub3duRGVmYXVsdExhbmc9VW5rbm93biBMYW5ndWFnZSBzcGVjaWZpZWQgZm9yIGRlZmF1bHQhCi1wcm9wZmlsZWxvYWQuZ2VuZXJhbEV4Y2VwdGlvbj1FeGNlcHRpb24gd2hpbGUgbG9hZGluZyB0aGUgcHJvcGVydHkgZmlsZQotCi0jIyMjIyMjIyMjIyMjIyMjIyAgdGVtcGxhdGUgcmVzb2x2ZXIgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1yZXNvbHZlci50ZW1wbGF0ZU5vdEZvdW5kPXswfSB0ZW1wbGF0ZSBub3QgZm91bmQhCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMgQ29kZWdlbiBlbmdpbmUgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWVuZ2luZS53c2RsUGFyc2luZ0V4Y2VwdGlvbj1FcnJvciBwYXJzaW5nIFdTREwKLWVuZ2luZS5pbnZhbGlkV3NkbExvY2F0aW9uPUludmFsaWQgV1NETCBMb2NhdGlvbgotZW5naW5lLm5vUHJvcGVyRGF0YWJpbmRpbmdFeGNlcHRpb249VW5hYmxlIHRvIHVzZSBzcGVjaWZpZWQgZGF0YWJpbmRpbmchCi1lbmdpbmUuZW1pdHRlck1pc3Npbmc9RW1pdHRlciBjbGFzcyBub3QgZm91bmQhCi1lbmdpbmUud3JvbmdFbWl0dGVyPU5vbiBlbWl0dGVyIGNsYXNzIGZvdW5kIQotZW5naW5lLmV4dGVuc2lvbkxvYWRQcm9ibGVtPUV4dGVuc2lvbiBjbGFzcyBsb2FkaW5nIHByb2JsZW0KLWVuZ2luZS5leHRlbnNpb25JbnN0YW50aWF0aW9uUHJvYmxlbT1FeHRlbnNpb24gY2xhc3MgaW5zdGFudGlhdGlvbiBwcm9ibGVtCi1lbmdpbmUuaWxsZWdhbEV4dGVuc2lvbj1JbGxlZ2FsIGV4dGVuc2lvbiEKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyBPcHRpb25zICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1vcHRpb25zLm5vdEFEaXJlY3RvcnlFeGNlcHRpb249VGhlIHNwZWNpZmllZCBvdXRwdXQgbG9jYXRpb24gaXMgbm90IGEgZGlyZWN0b3J5IQotb3B0aW9ucy5ub21hcHBpbmdGaWxlPVVuYWJsZSB0byBsb2FkIG1hcHBpbmcgZmlsZSEKLW9wdGlvbnMubm9GaWxlPVRoZSBzcGVjaWZpZWQgb3V0cHV0IGxvY2F0aW9uIGlzIG5vdCBhIGRpcmVjdG9yeSEKLQotd3JpdGVyLm5vTGFuZ1Byb3BlcnRpZXNFeHRlbnNpb249Tm8gbGFuZ3VhZ2Ugc3BlY2lmaWMgcHJvcGVydGllcyEhIQotd3JpdGVyLnRlbXBsYXRlTWlzc2luZz10ZW1wbGF0ZSBmb3IgdGhpcyB3cml0ZXIgaXMgbm90IGZvdW5kIQotCi1leHRlbnNpb24uYmluZGluZ01pc3Npbmc9YmluZGluZ3MgYXJlIG5vdCBwcmVzZW50IGluIHRoZSBvcmlnaW5hbCBkb2N1bWVudAotZXh0ZW5zaW9uLm5vUHJvcGVyRGF0YWJpbmRpbmc9Tm8gcHJvcGVyIGRhdGFiaW5kaW5nIGhhcyB0YWtlbiBwbGFjZQotZXh0ZW5zaW9uLmludmFsaWRXU0RMPUludmFsaWQgV1NETDogVGhlIFdTREwgVHlwZXMgU2NoZW1hIGRvZXMgbm90IGRlZmluZSBhIHRhcmdldE5hbWVzcGFjZSBpbiB7MH0KLWV4dGVuc2lvbi5hZGRpdGlvbmFsU2NoZW1hRmFpbHVyZT1BZGRpdGlvbmFsIHNjaGVtYSBsb2FkaW5nIGZhaWxlZCEhCi1leHRlbnNpb24uZW5jb2RlZE5vdFN1cHBvcnRlZD1UaGUgdXNlICdlbmNvZGVkJyBpcyBub3Qgc3VwcG9ydGVkIQotZXh0ZW5zaW9uLmRhdGFiaW5kaW5nTWlzbWF0Y2g9VGhlIHNwZWNpZmllZCBkYXRhYmluZGluZyBmcmFtZXdvcmtzIGRvIG5vdCBtYXRjaCEKLWV4dGVuc2lvbi51bmhhbmRsZWRTY2hlbWFDb25zdHJ1Y3Q9VW5oYW5kbGVkIHNjaGVtYSBjb25zdHJ1Y3QhCi1leHRlbnNpb24udW5zdXBwb3J0ZWRmb3J1bndyYXBwaW5nPVVuc3VwcG9ydGVkIGZyYW1ld29yayBmb3IgdW53cmFwcGluZyEKLWV4dGVuc2lvbi51bnN1cHBvcnRlZFNjaGVtYUZvcm1hdD1VbnN1cHBvcnRlZCBTY2hlbWEgZm9ybWF0IGZvciB1bndyYXBwaW5nISBmb3VuZCB7MH0gYnV0IGV4cGVjdGVkIHsxfQotCi1lbWl0dGVyLnVua25vd25TdHlsZT1Vbmtub3duIGNvZGUgZ2VuZXJhdGlvbiBzdHlsZSB7MH0KLWVtaXR0ZXIuY2Fubm90RmluZEJpbmRpbmc9Q2Fubm90IGZpbmQgYSBiaW5kaW5nISEKLWVtaXR0ZXIubG9nRW50cnlJbnRlcmZhY2UxPUludGVyZmFjZSBtb2RlIGlzIHNlbGVjdGVkLlRoZSBmb2xsb3dpbmcgaXRlbXMgd2lsbCBub3QgYmUgZ2VuZXJhdGVkCi1lbWl0dGVyLmxvZ0VudHJ5SW50ZXJmYWNlMj0xLiBNZXNzYWdlIFJlY2VpdmVyCi1lbWl0dGVyLmxvZ0VudHJ5SW50ZXJmYWNlMz0yLiBTdHViCi1lbWl0dGVyLmxvZ0VudHJ5SW50ZXJmYWNlND0zLiBDYWxsYmFja0hhbmRsZXIKLWVtaXR0ZXIubG9nRW50cnlJbnRlcmZhY2U1PTQuIFRlc3QgQ2xhc3NlcwotZW1pdHRlci5sb2dFbnRyeUludGVyZmFjZTY9NS4gRGF0YWJpbmRpbmcgU3VwcG9ydGVycwotZW1pdHRlci5jb3JlY2xhc3NOYW1lRXJyb3I9Q2Fubm90IGZvcm0gdGhlIGNvcmUgY2xhc3MgbmFtZQotZW1pdHRlci5zZXJ2aWNlTm90Rm91bmRFcnJvcj1zcGVjaWZpZWQgc2VydmljZSB7MH0gbm90IGZvdW5kCi1lbWl0dGVyLmVuZHBvaW50Tm90Rm91bmRFcnJvcj1zcGVjaWZpZWQgZW5kIHBvaW50IHswfSBub3QgZm91bmQKLWVtaXR0ZXIubm9FbmRwb2ludHNGb3VuZEVycm9yPWVuZHBvaW50cyBub3QgZm91bmQKLWVtaXR0ZXIud2FybmluZ011bHRpcGxlU2VydmljZXM9V2FybmluZyAtIE11bHRpcGxlIHNlcnZpY2VzIGZvdW5kIC0gcGlja2luZyB0aGUgZmlyc3Qgc2VydmljZSEKLWVtaXR0ZXIud2FybmluZ011bHRpcGxlRW5kcG9pbnRzPVdhcm5pbmcgLSBNdWx0aXBsZSBlbmRwb2ludHMgZm91bmQgLSBwaWNraW5nIHRoZSBmaXJzdCBlbmRwb2ludCEKLWVtaXR0ZXIuc3dpdGNoaW5nTWVzc2FnZXM9V2FybmluZyAtTm8gc2VydmljZXMgZm91bmQgLSBzd2l0Y2hlZCB0byB0aGUgaW50ZXJmYWNlIG1vZGUhCi1lbWl0dGVyLndhcm5pbmdNdWx0aXBsZVBvcnR0eXBlcz1XYXJuaW5nIC0gRm91bmQgbXVsdGlwbGUgcG9ydHR5cGVzIC0gcGlja2luZyB0aGUgZmlyc3QKLQotIyBUeXBlIG1hcHBlcnMKLWRhdGFiaW5kaW5nLnR5cGVtYXBwZXIudHlwZXVubWF0Y2hlZD1ObyB0eXBlIHdhcyBtYXBwZWQgdG8gdGhlIG5hbWUgezB9IHdpdGggbmFtZXNwYWNlIHsxfQotZGF0YWJpbmRpbmcudHlwZW1hcHBlci50eXBldW5tYXRjaGVkLm51bGw9Tm8gdHlwZSBjYW4gYmUgbWF0Y2hlZCB0byBhIG51bGwgUU5hbWUhCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyBqYXZhMldTREwKLWphdmEyd3NkbC5hcmcxPVVzYWdlIGphdmEyd3NkbCAtY24gPGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lPiA6IGNsYXNzIGZpbGUgbmFtZQotamF2YTJ3c2RsLmFyZzI9LW8gPG91dHB1dCBMb2NhdGlvbj4gOiBvdXRwdXQgZmlsZSBsb2NhdGlvbgotamF2YTJ3c2RsLmFyZzM9LWNwIDxjbGFzcyBwYXRoIHVyaT4gOiBsaXN0IG9mIGNsYXNzcGF0aCBlbnRyaWVzIC0gKHVybHMpCi1qYXZhMndzZGwuYXJnND0tdG4gPHRhcmdldCBuYW1lc3BhY2U+IDogdGFyZ2V0IG5hbWVzcGFjZQotamF2YTJ3c2RsLmFyZzU9LXRwIDx0YXJnZXQgbmFtZXNwYWNlIHByZWZpeD4gOiB0YXJnZXQgbmFtZXNwYWNlIHByZWZpeAotamF2YTJ3c2RsLmFyZzY9LXN0biA8c2NoZW1hIHRhcmdldCBuYW1lc3BhY2U+IDogdGFyZ2V0IG5hbWVzcGFjZSBmb3Igc2NoZW1hCi1qYXZhMndzZGwuYXJnNz0tc3RwIDxzY2hlbWEgdGFyZ2V0IG5hbWVzcGFjZSBwcmVmaXg+IDogdGFyZ2V0IG5hbWVzcGFjZSBwcmVmaXggZm9yIHNjaGVtYQotamF2YTJ3c2RsLmFyZzg9LXNuIDxzZXJ2aWNlIG5hbWU+IDogc2VydmljZSBuYW1lCi1qYXZhMndzZGwuYXJnOT0tb2YgPG91dHB1dCBmaWxlIG5hbWU+IDogb3V0cHV0IGZpbGUgbmFtZSBmb3IgdGhlIFdTREwKLQotamF2YTJ3c2RsLmdlbmVyYWxFcnJvcj1BbiBlcnJvciBvY2N1cmVkIHdoaWxlIGdlbmVyYXRpbmcgY29kZQotamF2YTJ3c2RsLm5vdEFGb2xkZXI9VGhlIHNwZWNpdmllZCBsb2NhdGlvbiB7MH0gaXMgbm90IGEgZm9sZGVyCi1qYXZhMndzZGwuY2xhc3NJc011c3Q9Y2xhc3MgbmFtZSBtdXN0IGJlIHByZXNlbnQhCi0KLQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL3RlbXBsYXRlL2MvQnVpbGRTY3JpcHRUZW1wbGF0ZS54c2wgYi92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdGVtcGxhdGUvYy9CdWlsZFNjcmlwdFRlbXBsYXRlLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDMzZjgwMy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdGVtcGxhdGUvYy9CdWlsZFNjcmlwdFRlbXBsYXRlLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iPgotPHhzbDpvdXRwdXQgbWV0aG9kPSJ0ZXh0Ii8+Ci08eHNsOnRlbXBsYXRlIG1hdGNoPSJpbnRlcmZhY2UiPgotCi08eHNsOnZhcmlhYmxlIG5hbWU9InNlcnZpY2VuYW1lIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHNlcnZpY2VuYW1lIi8+PC94c2w6dmFyaWFibGU+Ci08eHNsOnZhcmlhYmxlIG5hbWU9Im9wdGlvbiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBvcHRpb24iLz48L3hzbDp2YXJpYWJsZT4KLTx4c2w6dmFyaWFibGUgbmFtZT0ib3V0cHV0bG9jYXRpb24iPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAb3V0cHV0bG9jYXRpb24iLz48L3hzbDp2YXJpYWJsZT4KLTx4c2w6dmFyaWFibGUgbmFtZT0idGFyZ2V0c291cmNlbG9jYXRpb24iPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdGFyZ2V0c291cmNlbG9jYXRpb24iLz48L3hzbDp2YXJpYWJsZT4KLTx4c2w6Y2hvb3NlPgotPHhzbDp3aGVuIHRlc3Q9IiRvcHRpb24gPSAxIj4KLWdjYyAtZyAtc2hhcmVkIC1vbGliPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzZXJ2aWNlbmFtZSIvPi5zbyAtSSAkQVhJUzJDX0hPTUUvaW5jbHVkZS9heGlzMi0xLjUuMC8gLUk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRhcmdldHNvdXJjZWxvY2F0aW9uIi8+IC1MJEFYSVMyQ19IT01FL2xpYiBcCi0gICAgLWxheHV0aWwgXAotICAgIC1sYXhpczJfYXhpb20gXAotICAgIC1sYXhpczJfZW5naW5lIFwKLSAgICAtbGF4aXMyX3BhcnNlciBcCi0gICAgLWxwdGhyZWFkIFwKLSAgICAtbGF4aXMyX2h0dHBfc2VuZGVyIFwKLSAgICAtbGF4aXMyX2h0dHBfcmVjZWl2ZXIgXAotICAgIC1sZ3V0aHRoaWxhIFwKLSAgICAqLmMgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0YXJnZXRzb3VyY2Vsb2NhdGlvbiIvPi8qLmMKLTwveHNsOndoZW4+Ci08eHNsOm90aGVyd2lzZT4KLWdjYyAtZyAtc2hhcmVkIC1vbGliPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzZXJ2aWNlbmFtZSIvPi5zbyAtSSAkQVhJUzJDX0hPTUUvaW5jbHVkZS9heGlzMi0xLjUuMC8gIC1MJEFYSVMyQ19IT01FL2xpYiBcCi0gICAgLWxheHV0aWwgXAotICAgIC1sYXhpczJfYXhpb20gXAotICAgIC1sYXhpczJfZW5naW5lIFwKLSAgICAtbGF4aXMyX3BhcnNlciBcCi0gICAgLWxwdGhyZWFkIFwKLSAgICAtbGF4aXMyX2h0dHBfc2VuZGVyIFwKLSAgICAtbGF4aXMyX2h0dHBfcmVjZWl2ZXIgXAotICAgIC1sZ3V0aHRoaWxhIFwKLSAgICAqLmMgCi08L3hzbDpvdGhlcndpc2U+Ci08L3hzbDpjaG9vc2U+Ci08L3hzbDp0ZW1wbGF0ZT4KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdGVtcGxhdGUvYy9TZXJ2aWNlU2tlbGV0b24ueHNsIGIvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL3RlbXBsYXRlL2MvU2VydmljZVNrZWxldG9uLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI4MGYxNy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdGVtcGxhdGUvYy9TZXJ2aWNlU2tlbGV0b24ueHNsCisrKyAvZGV2L251bGwKQEAgLTEsNzM5ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iPgotICAgIDx4c2w6b3V0cHV0IG1ldGhvZD0idGV4dCIvPgotCi0gICAgICA8IS0tVGVtcGxhdGUgZm9yIGluIG91dCBtZXNzYWdlIHJlY2VpdmVyIC0tPgotICAgICAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iL2ludGVyZmFjZSI+Ci0gICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ic2tlbGV0b25uYW1lIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJxbmFtZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBxbmFtZSIvPjwveHNsOnZhcmlhYmxlPgotICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im1ldGhvZC1wcmVmaXgiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAcHJlZml4Ii8+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ic3Zjb3AtcHJlZml4Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHN2Y29wX3ByZWZpeCIvPjwveHNsOnZhcmlhYmxlPgotICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InN2Y25hbWUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAc3ZjbmFtZSIvPjwveHNsOnZhcmlhYmxlPgotICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InNlcnZpY2VuYW1lIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHN2Y25hbWUiLz48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJzb2FwVmVyc2lvbiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBzb2FwLXZlcnNpb24iLz48L3hzbDp2YXJpYWJsZT4KLQotICAgICAgICAvKioKLSAgICAgICAgICogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+LmMKLSAgICAgICAgICoKLSAgICAgICAgICogVGhpcyBmaWxlIHdhcyBhdXRvLWdlbmVyYXRlZCBmcm9tIFdTREwgZm9yICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHFuYW1lIi8+IiBzZXJ2aWNlCi0gICAgICAgICAqIGJ5IHRoZSBBcGFjaGUgQXhpczIgdmVyc2lvbjogI2F4aXNWZXJzaW9uIyAjdG9kYXkjCi0gICAgICAgICAqICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHNrZWxldG9ubmFtZSIvPgotICAgICAgICAgKi8KLQotICAgICAgICAjaW5jbHVkZSAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzdmNvcC1wcmVmaXgiLz4uaCIKLSAgICAgICAgI2luY2x1ZGUgJmx0O2F4aXMyX3N2Y19za2VsZXRvbi5oJmd0OwotICAgICAgICAjaW5jbHVkZSAmbHQ7c3RkaW8uaCZndDsKLSAgICAgICAgI2luY2x1ZGUgJmx0O2F4aXMyX3N2Yy5oJmd0OwotCi0gICAgICAgICNpZmRlZiBfX2NwbHVzcGx1cwotICAgICAgICBleHRlcm4gIkMiIHsKLSAgICAgICAgI2VuZGlmCi0gICAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAgKiBmdW5jdGlvbnMgcHJvdG90eXBlcwotICAgICAgICAgKi8KLQotICAgICAgICAvKiBPbiBmYXVsdCwgaGFuZGxlIHRoZSBmYXVsdCAqLwotICAgICAgICBheGlvbV9ub2RlX3QqIEFYSVMyX0NBTEwKLSAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtZXRob2QtcHJlZml4Ii8+X29uX2ZhdWx0KGF4aXMyX3N2Y19za2VsZXRvbl90ICpzdmNfc2tlbGV0b24sCi0gICAgICAgICAgICAgICAgICBjb25zdCBheHV0aWxfZW52X3QgKmVudiwgYXhpb21fbm9kZV90ICpub2RlKTsKLQotICAgICAgICAvKiBGcmVlIHRoZSBzZXJ2aWNlICovCi0gICAgICAgIGludCBBWElTMl9DQUxMCi0gICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbWV0aG9kLXByZWZpeCIvPl9mcmVlKGF4aXMyX3N2Y19za2VsZXRvbl90ICpzdmNfc2tlbGV0b24sCi0gICAgICAgICAgICAgICAgICBjb25zdCBheHV0aWxfZW52X3QgKmVudik7Ci0KLSAgICAgICAgLyogVGhpcyBtZXRob2QgaW52b2tlcyB0aGUgcmlnaHQgc2VydmljZSBtZXRob2QgKi8KLSAgICAgICAgYXhpb21fbm9kZV90KiBBWElTMl9DQUxMCi0gICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbWV0aG9kLXByZWZpeCIvPl9pbnZva2UoYXhpczJfc3ZjX3NrZWxldG9uX3QgKnN2Y19za2VsZXRvbiwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgYXh1dGlsX2Vudl90ICplbnYsCi0gICAgICAgICAgICAgICAgICAgIGF4aW9tX25vZGVfdCAqbm9kZSwKLSAgICAgICAgICAgICAgICAgICAgYXhpczJfbXNnX2N0eF90ICptc2dfY3R4KTsKLQotICAgICAgICAvKiBJbml0aWFsaXppbmcgdGhlIGVudmlyb25tZW50ICAqLwotICAgICAgICBpbnQgQVhJUzJfQ0FMTAotICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1ldGhvZC1wcmVmaXgiLz5faW5pdChheGlzMl9zdmNfc2tlbGV0b25fdCAqc3ZjX3NrZWxldG9uLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXh1dGlsX2Vudl90ICplbnYpOwotCi0gICAgICAgIC8qIENyZWF0ZSB0aGUgc2VydmljZSAgKi8KLSAgICAgICAgYXhpczJfc3ZjX3NrZWxldG9uX3QqIEFYSVMyX0NBTEwKLSAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtZXRob2QtcHJlZml4Ii8+X2NyZWF0ZShjb25zdCBheHV0aWxfZW52X3QgKmVudik7Ci0KLSAgICAgICAgc3RhdGljIGNvbnN0IGF4aXMyX3N2Y19za2VsZXRvbl9vcHNfdCA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHNrZWxldG9ubmFtZSIvPl9zdmNfc2tlbGV0b25fb3BzX3ZhciA9IHsKLSAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbWV0aG9kLXByZWZpeCIvPl9pbml0LAotICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtZXRob2QtcHJlZml4Ii8+X2ludm9rZSwKLSAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbWV0aG9kLXByZWZpeCIvPl9vbl9mYXVsdCwKLSAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbWV0aG9kLXByZWZpeCIvPl9mcmVlCi0gICAgICAgIH07Ci0KLQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBGb2xsb3dpbmcgYmxvY2sgZGlzdGluZ3Vpc2ggdGhlIGV4cG9zZWQgcGFydCBvZiB0aGUgZGxsLgotICAgICAgICAgKiBjcmVhdGUgdGhlIGluc3RhbmNlCi0gICAgICAgICAqLwotCi0gICAgICAgIEFYSVMyX0VYVEVSTiBpbnQKLSAgICAgICAgYXhpczJfZ2V0X2luc3RhbmNlKHN0cnVjdCBheGlzMl9zdmNfc2tlbGV0b24gKippbnN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBheHV0aWxfZW52X3QgKmVudik7Ci0KLSAgICAgICAgQVhJUzJfRVhURVJOIGludCAKLSAgICAgICAgYXhpczJfcmVtb3ZlX2luc3RhbmNlKGF4aXMyX3N2Y19za2VsZXRvbl90ICppbnN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBheHV0aWxfZW52X3QgKmVudik7Ci0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAgKiBmdW5jdGlvbiB0byBmcmVlIGFueSBzb2FwIGlucHV0IGhlYWRlcnMKLSAgICAgICAgICAqLwotICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Im1ldGhvZCI+Ci0KLSAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdzb2FwX2hlYWRlciddIj4KLSAgICAgICAgICAgICB2b2lkCi0gICAgICAgICAgICAgYXhpczJfc2tlbF9vcF88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHNlcnZpY2VuYW1lIi8+Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPl9mcmVlX2lucHV0X2hlYWRlcnMoY29uc3QgYXh1dGlsX2Vudl90ICplbnYsIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJpbnB1dC9wYXJhbVtAbG9jYXRpb249J3NvYXBfaGVhZGVyJ10iPjx4c2w6aWYgdGVzdD0icG9zaXRpb24oKSE9MSI+LDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImlucHV0dHlwZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW5wdXR0eXBlIi8+PHhzbDp0ZXh0PiBfPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+KTsKLSAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJvdXRwdXQvcGFyYW1bQGxvY2F0aW9uPSdzb2FwX2hlYWRlciddIj4KLSAgICAgICAgICAgICB2b2lkCi0gICAgICAgICAgICAgYXhpczJfc2tlbF9vcF88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHNlcnZpY2VuYW1lIi8+Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPl9mcmVlX291dHB1dF9oZWFkZXJzKGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52LCA8eHNsOmZvci1lYWNoIHNlbGVjdD0ib3V0cHV0L3BhcmFtW0Bsb2NhdGlvbj0nc29hcF9oZWFkZXInXSI+PHhzbDppZiB0ZXN0PSJwb3NpdGlvbigpIT0xIj4sPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ib3V0cHV0dHlwZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkb3V0cHV0dHlwZSIvPjx4c2w6dGV4dD4gXzwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPik7Ci0gICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0KLQotICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Im1ldGhvZC9vdXRwdXQvcGFyYW1bQGxvY2F0aW9uPSdzb2FwX2hlYWRlciddIj4KLSAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0icG9zaXRpb24oKT0xIj4KLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBDcmVhdGUgdGhlIHJlc3BvbnNlIHNvYXAgZW52ZWxvcGUgd2hlbiBvdXRwdXQgaGVhZGVycyBhcmUgdG8gYmUgc2V0Li4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgYXhpb21fc29hcF9lbnZlbG9wZV90KiBBWElTMl9DQUxMCi0gICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1ldGhvZC1wcmVmaXgiLz5fY3JlYXRlX3Jlc3BvbnNlX2VudmVsb3BlKGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMyX21zZ19jdHhfdCAqaW5fbXNnX2N0eCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpczJfbXNnX2N0eF90ICptc2dfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aW9tX25vZGVfdCAqYm9keV9jb250ZW50X25vZGUpOwotICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLQotCi0gICAgICAgICNpZmRlZiBfX2NwbHVzcGx1cwotICAgICAgICB9Ci0gICAgICAgICNlbmRpZgotCi0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEltcGxlbWVudGF0aW9ucyBmb3IgdGhlIGZ1bmN0aW9ucwotICAgICAgICAgKi8KLQotCWF4aXMyX3N2Y19za2VsZXRvbl90KiBBWElTMl9DQUxMCi0JPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtZXRob2QtcHJlZml4Ii8+X2NyZWF0ZShjb25zdCBheHV0aWxfZW52X3QgKmVudikKLQl7Ci0JICAgIGF4aXMyX3N2Y19za2VsZXRvbl90ICpzdmNfc2tlbGV0b24gPSBOVUxMOwotICAgICAgICAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBzdHJ1Y3RzICovCi0gICAgICAgIHN2Y19za2VsZXRvbiA9IChheGlzMl9zdmNfc2tlbGV0b25fdCAqKUFYSVMyX01BTExPQyhlbnYtPmFsbG9jYXRvciwKLSAgICAgICAgICAgIHNpemVvZihheGlzMl9zdmNfc2tlbGV0b25fdCkpOwotCi0gICAgICAgIHN2Y19za2VsZXRvbi0+b3BzID0gJmFtcDs8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHNrZWxldG9ubmFtZSIvPl9zdmNfc2tlbGV0b25fb3BzX3ZhcjsKLQotCi0JICAgIHJldHVybiBzdmNfc2tlbGV0b247Ci0JfQotCi0KLQlpbnQgQVhJUzJfQ0FMTAotCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbWV0aG9kLXByZWZpeCIvPl9pbml0KGF4aXMyX3N2Y19za2VsZXRvbl90ICpzdmNfc2tlbGV0b24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXh1dGlsX2Vudl90ICplbnYpCi0JewotCSAgICAvKiBBbnkgaW5pdGlhbGl6YXRpb24gc3R1ZmYgb2YgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzdmNuYW1lIi8+IGdvZXMgaGVyZSAqLwotCSAgICByZXR1cm4gQVhJUzJfU1VDQ0VTUzsKLQl9Ci0KLQlpbnQgQVhJUzJfQ0FMTAotCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbWV0aG9kLXByZWZpeCIvPl9mcmVlKGF4aXMyX3N2Y19za2VsZXRvbl90ICpzdmNfc2tlbGV0b24sCi0JCQkJIGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52KQotCXsKLQotICAgICAgICAvKiBGcmVlIHRoZSBzZXJ2aWNlIHNrZWxldG9uICovCi0gICAgICAgIGlmIChzdmNfc2tlbGV0b24pCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFYSVMyX0ZSRUUoZW52LT5hbGxvY2F0b3IsIHN2Y19za2VsZXRvbik7Ci0gICAgICAgICAgICBzdmNfc2tlbGV0b24gPSBOVUxMOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIEFYSVMyX1NVQ0NFU1M7Ci0JfQotCi0KLQotICAgICAvKioKLSAgICAgICogZnVuY3Rpb24gdG8gZnJlZSBhbnkgc29hcCBpbnB1dCBoZWFkZXJzCi0gICAgICAqLwotICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0ibWV0aG9kIj4KLSAgICAgICAgPHhzbDppZiB0ZXN0PSJpbnB1dC9wYXJhbVtAbG9jYXRpb249J3NvYXBfaGVhZGVyJ10iPgotICAgICAgICAgdm9pZAotICAgICAgICAgYXhpczJfc2tlbF9vcF88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHNlcnZpY2VuYW1lIi8+Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPl9mcmVlX2lucHV0X2hlYWRlcnMoY29uc3QgYXh1dGlsX2Vudl90ICplbnYsIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJpbnB1dC9wYXJhbVtAbG9jYXRpb249J3NvYXBfaGVhZGVyJ10iPjx4c2w6aWYgdGVzdD0icG9zaXRpb24oKSE9MSI+LDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaW5wdXR0eXBlIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGlucHV0dHlwZSIvPjx4c2w6dGV4dD4gXzwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+KQotICAgICAgICAgewotICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImlucHV0L3BhcmFtW0Bsb2NhdGlvbj0nc29hcF9oZWFkZXInXSI+Ci0gICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImhlYWRlcl92YXIiPjx4c2w6dGV4dD5fPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAb3VycyI+Ci0gICAgICAgICAgICAgICAgICAgIGlmKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaGVhZGVyX3ZhciIvPikKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1iZWZvcmUoQHR5cGUsICdfdConKSIvPl9mcmVlKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaGVhZGVyX3ZhciIvPiwgZW52KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgIC8qIHdlIGRvbid0IGhhdmUgYW55dGhpbmcgdG8gZnJlZSBvbiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGhlYWRlcl92YXIiLz4gKi8KLSAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICAgICAgIH0KLSAgICAgICAgPC94c2w6aWY+Ci0gICAgIDwveHNsOmZvci1lYWNoPgotCi0KLQotICAgICAvKioKLSAgICAgICogZnVuY3Rpb24gdG8gZnJlZSBhbnkgc29hcCBvdXRwdXQgaGVhZGVycwotICAgICAgKi8KLSAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Im1ldGhvZCI+Ci0gICAgICAgIDx4c2w6aWYgdGVzdD0ib3V0cHV0L3BhcmFtW0Bsb2NhdGlvbj0nc29hcF9oZWFkZXInXSI+Ci0gICAgICAgICB2b2lkCi0gICAgICAgICBheGlzMl9za2VsX29wXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc2VydmljZW5hbWUiLz5fPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+X2ZyZWVfb3V0cHV0X2hlYWRlcnMoY29uc3QgYXh1dGlsX2Vudl90ICplbnYsIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJvdXRwdXQvcGFyYW1bQGxvY2F0aW9uPSdzb2FwX2hlYWRlciddIj48eHNsOmlmIHRlc3Q9InBvc2l0aW9uKCkhPTEiPiw8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im91dHB1dHR5cGUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPjwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkb3V0cHV0dHlwZSIvPjx4c2w6dGV4dD4gXzwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+KQotICAgICAgICAgewotICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Im91dHB1dC9wYXJhbVtAbG9jYXRpb249J3NvYXBfaGVhZGVyJ10iPgotICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJoZWFkZXJfdmFyIj48eHNsOnRleHQ+XzwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQG91cnMiPgotICAgICAgICAgICAgICAgICAgICBpZig8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGhlYWRlcl92YXIiLz4pCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzdWJzdHJpbmctYmVmb3JlKEB0eXBlLCAnX3QqJykiLz5fZnJlZSg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGhlYWRlcl92YXIiLz4sIGVudik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPiAKLSAgICAgICAgICAgICAgICAgICAgLyogd2UgZG9uJ3QgaGF2ZSBhbnl0aGluZyB0byBmcmVlIG9uIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaGVhZGVyX3ZhciIvPiAqLwotICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPgotICAgICAgICAgfQotICAgICAgICA8L3hzbDppZj4KLSAgICAgPC94c2w6Zm9yLWVhY2g+Ci0KLSAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Im1ldGhvZC9vdXRwdXQvcGFyYW1bQGxvY2F0aW9uPSdzb2FwX2hlYWRlciddIj4KLSAgICAgICA8eHNsOmlmIHRlc3Q9InBvc2l0aW9uKCk9MSI+Ci0JLyoKLQkgKiBDcmVhdGUgdGhlIHJlc3BvbnNlIHNvYXAgZW52ZWxvcGUgd2hlbiBvdXRwdXQgaGVhZGVycyBhcmUgdG8gYmUgc2V0Li4KLQkgKi8KLQlheGlvbV9zb2FwX2VudmVsb3BlX3QqIEFYSVMyX0NBTEwKLQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1ldGhvZC1wcmVmaXgiLz5fY3JlYXRlX3Jlc3BvbnNlX2VudmVsb3BlKGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzMl9tc2dfY3R4X3QgKmluX21zZ19jdHgsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzMl9tc2dfY3R4X3QgKm1zZ19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aW9tX25vZGVfdCAqYm9keV9jb250ZW50X25vZGUpCi0gICAgewotICAgICAgICBjb25zdCBheGlzMl9jaGFyX3QgKnNvYXBfbnMgPSBBWElPTV9TT0FQMTJfU09BUF9FTlZFTE9QRV9OQU1FU1BBQ0VfVVJJOwotICAgICAgICBpbnQgc29hcF92ZXJzaW9uID0gQVhJT01fU09BUDEyOwotICAgICAgICBheGlvbV9uYW1lc3BhY2VfdCAqZW52X25zID0gTlVMTDsKLSAgICAgICAgYXhpb21fc29hcF9lbnZlbG9wZV90ICpkZWZhdWx0X2VudmVsb3BlID0gTlVMTDsKLSAgICAgICAgYXhpb21fc29hcF9oZWFkZXJfdCAqb3V0X2hlYWRlciA9IE5VTEw7Ci0gICAgICAgIGF4aW9tX3NvYXBfYm9keV90ICpvdXRfYm9keSA9IE5VTEw7Ci0gICAgICAgIGF4aW9tX25vZGVfdCAqb3V0X25vZGUgPSBOVUxMOwotICAgICAgICAKLSAgICAgICAgaWYgKGluX21zZ19jdHggJmFtcDsmYW1wOyBheGlzMl9tc2dfY3R4X2dldF9pc19zb2FwXzExKGluX21zZ19jdHgsIGVudikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNvYXBfbnMgPSBBWElPTV9TT0FQMTFfU09BUF9FTlZFTE9QRV9OQU1FU1BBQ0VfVVJJOyAvKiBkZWZhdWx0IGlzIDEuMiAqLwotICAgICAgICAgICAgc29hcF92ZXJzaW9uID0gQVhJT01fU09BUDExOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogY3JlYXRlIHRoZSBzb2FwIGVudmVsb3BlIGhlcmUgKi8KLSAgICAgICAgZW52X25zID0gYXhpb21fbmFtZXNwYWNlX2NyZWF0ZShlbnYsIHNvYXBfbnMsICJzb2FwZW52Iik7Ci0gICAgICAgIGlmICghZW52X25zKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIGRlZmF1bHRfZW52ZWxvcGUgPSBheGlvbV9zb2FwX2VudmVsb3BlX2NyZWF0ZShlbnYsIGVudl9ucyk7Ci0KLSAgICAgICAgaWYgKCFkZWZhdWx0X2VudmVsb3BlKQotICAgICAgICB7Ci0gICAgICAgICAgICBheGlvbV9uYW1lc3BhY2VfZnJlZShlbnZfbnMsIGVudik7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIG91dF9oZWFkZXIgPSBheGlvbV9zb2FwX2hlYWRlcl9jcmVhdGVfd2l0aF9wYXJlbnQoZW52LCBkZWZhdWx0X2VudmVsb3BlKTsKLSAgICAgICAgaWYgKCFvdXRfaGVhZGVyKQotICAgICAgICB7Ci0gICAgICAgICAgICBheGlvbV9zb2FwX2VudmVsb3BlX2ZyZWUoZGVmYXVsdF9lbnZlbG9wZSwgZW52KTsKLSAgICAgICAgICAgIGF4aW9tX25hbWVzcGFjZV9mcmVlKGVudl9ucywgZW52KTsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0KLSAgICAgICAgb3V0X2JvZHkgPSBheGlvbV9zb2FwX2JvZHlfY3JlYXRlX3dpdGhfcGFyZW50KGVudiwgZGVmYXVsdF9lbnZlbG9wZSk7Ci0gICAgICAgIGlmICghb3V0X2JvZHkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGF4aW9tX3NvYXBfYm9keV9mcmVlKG91dF9ib2R5LCBlbnYpOwotICAgICAgICAgICAgYXhpb21fc29hcF9lbnZlbG9wZV9mcmVlKGRlZmF1bHRfZW52ZWxvcGUsIGVudik7Ci0gICAgICAgICAgICBheGlvbV9uYW1lc3BhY2VfZnJlZShlbnZfbnMsIGVudik7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIG91dF9ub2RlID0gYXhpb21fc29hcF9ib2R5X2dldF9iYXNlX25vZGUob3V0X2JvZHksIGVudik7Ci0gICAgICAgIGlmICghb3V0X25vZGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGF4aW9tX3NvYXBfYm9keV9mcmVlKG91dF9ib2R5LCBlbnYpOwotICAgICAgICAgICAgYXhpb21fc29hcF9lbnZlbG9wZV9mcmVlKGRlZmF1bHRfZW52ZWxvcGUsIGVudik7Ci0gICAgICAgICAgICBheGlvbV9uYW1lc3BhY2VfZnJlZShlbnZfbnMsIGVudik7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotIAotICAgICAgICBpZiAoYm9keV9jb250ZW50X25vZGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGF4aW9tX25vZGVfYWRkX2NoaWxkKG91dF9ub2RlLCBlbnYsIGJvZHlfY29udGVudF9ub2RlKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYoYXhpczJfbXNnX2N0eF9zZXRfc29hcF9lbnZlbG9wZShtc2dfY3R4LCBlbnYsIGRlZmF1bHRfZW52ZWxvcGUpID09IEFYSVMyX0ZBSUxVUkUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGF4aW9tX3NvYXBfYm9keV9mcmVlKG91dF9ib2R5LCBlbnYpOwotICAgICAgICAgICAgYXhpb21fc29hcF9lbnZlbG9wZV9mcmVlKGRlZmF1bHRfZW52ZWxvcGUsIGVudik7Ci0gICAgICAgICAgICBheGlvbV9uYW1lc3BhY2VfZnJlZShlbnZfbnMsIGVudik7Ci0gICAgICAgICAgICBpZiAoYm9keV9jb250ZW50X25vZGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXhpb21fbm9kZV9mcmVlX3RyZWUoYm9keV9jb250ZW50X25vZGUsIGVudik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZGVmYXVsdF9lbnZlbG9wZTsKLSAgICB9Ci0gICAgICAgIDwveHNsOmlmPgotICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0KLQotCi0KLQkvKgotCSAqIFRoaXMgbWV0aG9kIGludm9rZXMgdGhlIHJpZ2h0IHNlcnZpY2UgbWV0aG9kCi0JICovCi0JYXhpb21fbm9kZV90KiBBWElTMl9DQUxMCi0JPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtZXRob2QtcHJlZml4Ii8+X2ludm9rZShheGlzMl9zdmNfc2tlbGV0b25fdCAqc3ZjX3NrZWxldG9uLAotCQkJCWNvbnN0IGF4dXRpbF9lbnZfdCAqZW52LAotCQkJCWF4aW9tX25vZGVfdCAqY29udGVudF9ub2RlLAotCQkJCWF4aXMyX21zZ19jdHhfdCAqbXNnX2N0eCkKLQl7Ci0gICAgICAgICAvKiBkZXBlbmRpbmcgb24gdGhlIGZ1bmN0aW9uIG5hbWUgaW52b2tlIHRoZQotICAgICAgICAgICogY29ycmVzcG9uZGluZyAgbWV0aG9kCi0gICAgICAgICAgKi8KLQotICAgICAgICAgIGF4aXMyX29wX2N0eF90ICpvcGVyYXRpb25fY3R4ID0gTlVMTDsKLSAgICAgICAgICBheGlzMl9vcF90ICpvcGVyYXRpb24gPSBOVUxMOwotICAgICAgICAgIGF4dXRpbF9xbmFtZV90ICpvcF9xbmFtZSA9IE5VTEw7Ci0gICAgICAgICAgYXhpczJfY2hhcl90ICpvcF9uYW1lID0gTlVMTDsKLSAgICAgICAgICBheGlzMl9tc2dfY3R4X3QgKmluX21zZ19jdHggPSBOVUxMOwotICAgICAgICAgIAotICAgICAgICAgIGF4aW9tX3NvYXBfZW52ZWxvcGVfdCAqcmVxX3NvYXBfZW52ID0gTlVMTDsKLSAgICAgICAgICBheGlvbV9zb2FwX2hlYWRlcl90ICpyZXFfc29hcF9oZWFkZXIgPSBOVUxMOwotICAgICAgICAgIGF4aW9tX3NvYXBfZW52ZWxvcGVfdCAqcmVzX3NvYXBfZW52ID0gTlVMTDsKLSAgICAgICAgICBheGlvbV9zb2FwX2hlYWRlcl90ICpyZXNfc29hcF9oZWFkZXIgPSBOVUxMOwotCi0gICAgICAgICAgYXhpb21fbm9kZV90ICpyZXRfbm9kZSA9IE5VTEw7Ci0gICAgICAgICAgYXhpb21fbm9kZV90ICppbnB1dF9oZWFkZXIgPSBOVUxMOwotICAgICAgICAgIGF4aW9tX25vZGVfdCAqb3V0cHV0X2hlYWRlciA9IE5VTEw7Ci0gICAgICAgICAgYXhpb21fbm9kZV90ICpoZWFkZXJfYmFzZV9ub2RlID0gTlVMTDsKLQotICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJtZXRob2QiPgotICAgICAgICAgICAgPHhzbDp0ZXh0PgotICAgICAgICAgICAgPC94c2w6dGV4dD4KLSAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icG9zaXRpb24iPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJwb3NpdGlvbigpIi8+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im91dHB1dHR5cGUiPgotICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0ibm90KG91dHB1dC9wYXJhbS9AdHlwZSkiPmF4aXMyX3N0YXR1c190PC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0ib3V0cHV0L3BhcmFtL0B0eXBlIj48L3hzbDp2YWx1ZS1vZj48L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgIDwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvdXRwdXR0eXBlIi8+IHJldF92YWw8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBvc2l0aW9uIi8+OwotICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJpbnB1dC9wYXJhbS9AdHlwZSE9JyciPgotICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iaW5wdXQvcGFyYW0vQHR5cGUiLz4gaW5wdXRfdmFsPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwb3NpdGlvbiIvPjsKLSAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImlucHV0L3BhcmFtW0Bsb2NhdGlvbj0nc29hcF9oZWFkZXInXSI+Ci0gICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+PHhzbDp0ZXh0PiBfPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBvc2l0aW9uIi8+ID0gTlVMTDsKLSAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPgotICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Im91dHB1dC9wYXJhbVtAbG9jYXRpb249J3NvYXBfaGVhZGVyJ10iPgotICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPjx4c2w6dGV4dD4gXzwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwb3NpdGlvbiIvPiA9IE5VTEw7Ci0gICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLQotICAgICAgICAgIG9wZXJhdGlvbl9jdHggPSBheGlzMl9tc2dfY3R4X2dldF9vcF9jdHgobXNnX2N0eCwgZW52KTsKLSAgICAgICAgICBvcGVyYXRpb24gPSBheGlzMl9vcF9jdHhfZ2V0X29wKG9wZXJhdGlvbl9jdHgsIGVudik7Ci0gICAgICAgICAgb3BfcW5hbWUgPSAoYXh1dGlsX3FuYW1lX3QgKilheGlzMl9vcF9nZXRfcW5hbWUob3BlcmF0aW9uLCBlbnYpOwotICAgICAgICAgIG9wX25hbWUgPSBheHV0aWxfcW5hbWVfZ2V0X2xvY2FscGFydChvcF9xbmFtZSwgZW52KTsKLQotICAgICAgICAgIGlmIChvcF9uYW1lKQotICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJtZXRob2QvaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdzb2FwX2hlYWRlciddIj4KLSAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9InBvc2l0aW9uKCk9MSI+Ci0gICAgICAgICAgICAgICAgaWYob3BlcmF0aW9uX2N0eCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgaW5fbXNnX2N0eCA9IGF4aXMyX29wX2N0eF9nZXRfbXNnX2N0eChvcGVyYXRpb25fY3R4LCBlbnYsIEFYSVMyX1dTRExfTUVTU0FHRV9MQUJFTF9JTik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmKGluX21zZ19jdHgpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXFfc29hcF9lbnYgPSBheGlzMl9tc2dfY3R4X2dldF9zb2FwX2VudmVsb3BlKGluX21zZ19jdHgsIGVudik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmKCFyZXFfc29hcF9lbnYpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBBWElTMl9MT0dfRVJST1IoIGVudi0+bG9nLCBBWElTMl9MT0dfU0ksICJyZXF1ZXN0IGV2ZWxvcGUgaXMgTlVMTCIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmVxX3NvYXBfaGVhZGVyID0gYXhpb21fc29hcF9lbnZlbG9wZV9nZXRfaGVhZGVyKHJlcV9zb2FwX2VudiwgZW52KTsKLQotICAgICAgICAgICAgICAgIGlmKHJlcV9zb2FwX2hlYWRlcikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGhlYWRlcl9iYXNlX25vZGUgPSBheGlvbV9zb2FwX2hlYWRlcl9nZXRfYmFzZV9ub2RlKHJlcV9zb2FwX2hlYWRlciwgZW52KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPgotCi0KLSAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJtZXRob2QiPgotICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icG9zaXRpb24iPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJwb3NpdGlvbigpIi8+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJuYW1lIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im1ldGhvZC1uYW1lIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im1ldGhvZC1ucyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lc3BhY2UiLz4gPC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJvdXRwdXRDYXBzVHlwZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im91dHB1dC9wYXJhbS9AY2Fwcy10eXBlIi8+IDwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ib3V0cHV0dHlwZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im91dHB1dC9wYXJhbS9AdHlwZSIvPjwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaW5wdXR0eXBlIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iaW5wdXQvcGFyYW0vQHR5cGUiLz48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImlzVW53cmFwUGFyYW1ldGVycyIgc2VsZWN0PSJpbnB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknIGFuZCBAdHlwZSE9JyddL0B1bndyYXBwUGFyYW1ldGVycyIvPgotCi0gICAgICAgICAgICAgICAgaWYgKCBheHV0aWxfc3RyY21wKG9wX25hbWUsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxvY2FscGFydCIvPiIpID09IDAgKQotICAgICAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9ImlucHV0L3BhcmFtL0B0eXBlIT0nJyI+Ci0gICAgICAgICAgICAgICAgICAgIGlucHV0X3ZhbDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcG9zaXRpb24iLz4gPSA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJpbnB1dC9wYXJhbS9Ab3VycyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3Vic3RyaW5nLWJlZm9yZShpbnB1dC9wYXJhbS9AdHlwZSwgJ190KicpIi8+X2NyZWF0ZSggZW52KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBBWElTMl9GQUlMVVJFID09IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzdWJzdHJpbmctYmVmb3JlKGlucHV0L3BhcmFtL0B0eXBlLCAnX3QqJykiLz5fZGVzZXJpYWxpemUoaW5wdXRfdmFsPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwb3NpdGlvbiIvPiwgZW52LCAmYW1wO2NvbnRlbnRfbm9kZSwgTlVMTCwgQVhJUzJfRkFMU0UpKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzdWJzdHJpbmctYmVmb3JlKGlucHV0L3BhcmFtL0B0eXBlLCAnX3QqJykiLz5fZnJlZShpbnB1dF92YWw8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBvc2l0aW9uIi8+LCBlbnYpOwotICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFYSVMyX0VSUk9SX1NFVChlbnYtPmVycm9yLCBBWElTMl9FUlJPUl9EQVRBX0VMRU1FTlRfSVNfTlVMTCwgQVhJUzJfRkFJTFVSRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQVhJUzJfTE9HX0VSUk9SKCBlbnYtPmxvZywgQVhJUzJfTE9HX1NJLCAiTlVMTCByZXR1cm50ZWQgZnJvbSB0aGUgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1iZWZvcmUoaW5wdXQvcGFyYW0vQHR5cGUsICdfdConKSIvPl9kZXNlcmlhbGl6ZTogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGlzIHNob3VsZCBiZSBkdWUgdG8gYW4gaW52YWxpZCBYTUwiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT5jb250ZW50X25vZGU7PC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLQotICAgICAgICAgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdzb2FwX2hlYWRlciddIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJwb3NpdGlvbigpPTEiPgotICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRfaGVhZGVyID0gYXhpb21fbm9kZV9nZXRfZmlyc3RfY2hpbGQoaGVhZGVyX2Jhc2Vfbm9kZSwgZW52KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUoaW5wdXRfaGVhZGVyICZhbXA7JmFtcDsgYXhpb21fbm9kZV9nZXRfbm9kZV90eXBlKGlucHV0X2hlYWRlciwgZW52KSAhPSBBWElPTV9FTEVNRU5UKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0X2hlYWRlciA9IGF4aW9tX25vZGVfZ2V0X25leHRfc2libGluZyhpbnB1dF9oZWFkZXIsIGVudik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRfaGVhZGVyID0gYXhpb21fbm9kZV9nZXRfbmV4dF9zaWJsaW5nKGlucHV0X2hlYWRlciwgZW52KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUoaW5wdXRfaGVhZGVyICZhbXA7JmFtcDsgYXhpb21fbm9kZV9nZXRfbm9kZV90eXBlKGlucHV0X2hlYWRlciwgZW52KSAhPSBBWElPTV9FTEVNRU5UKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0X2hlYWRlciA9IGF4aW9tX25vZGVfZ2V0X25leHRfc2libGluZyhpbnB1dF9oZWFkZXIsIGVudik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotCi0gICAgICAgICAgICAgICAgICAgIDwhLS0gaGVyZSB0aGUgcG9zaXRpb24gbWVhbiB0aGUgbnVtYmVyIG9mIHRoZSBtZXRob2QgLS0+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaGVhZGVyX3ZhciI+PHhzbDp0ZXh0Pl88L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcG9zaXRpb24iLz48L3hzbDp2YXJpYWJsZT4KLQotICAgICAgICAgICAgICAgICAgICBpZiggTlVMTCA9PSBpbnB1dF9oZWFkZXIpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFYSVMyX0xPR19FUlJPUiggZW52LT5sb2csIEFYSVMyX0xPR19TSSwgIlJlc3BvbnNlIGhlYWRlciA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4gaXMgTlVMTCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJAb3VycyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiB5b3UgY2FuJ3QgaGF2ZSBhIHJlc3BvbnNlIGhlYWRlciBOVUxMLCBqdXN0IGZyZWUgdGhpbmdzIGFuZCBleGl0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICBheGlzMl9za2VsX29wXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc2VydmljZW5hbWUiLz5fPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtZXRob2QtbmFtZSIvPl9mcmVlX2lucHV0X2hlYWRlcnMoZW52LCA8eHNsOmZvci1lYWNoIHNlbGVjdD0iLi4vLi4vaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdzb2FwX2hlYWRlciddIj48eHNsOmlmIHRlc3Q9InBvc2l0aW9uKCkhPTEiPiw8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp0ZXh0Pl88L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcG9zaXRpb24iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzdWJzdHJpbmctYmVmb3JlKCRpbnB1dHR5cGUsICdfdConKSIvPl9mcmVlKGlucHV0X3ZhbDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcG9zaXRpb24iLz4sIGVudik7Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBvdXJzIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaGVhZGVyX3ZhciIvPiA9IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzdWJzdHJpbmctYmVmb3JlKEB0eXBlLCAnX3QqJykiLz5fY3JlYXRlKGVudik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzdWJzdHJpbmctYmVmb3JlKEB0eXBlLCAnX3QqJykiLz5fZGVzZXJpYWxpemUoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRoZWFkZXJfdmFyIi8+LCBlbnYsICZhbXA7aW5wdXRfaGVhZGVyLCBOVUxMLCBBWElTMl9GQUxTRSApID09IEFYSVMyX0ZBSUxVUkUpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRoZWFkZXJfdmFyIi8+ICE9IE5VTEwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3Vic3RyaW5nLWJlZm9yZShAdHlwZSwgJ190KicpIi8+X2ZyZWUoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRoZWFkZXJfdmFyIi8+LCBlbnYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBWElTMl9MT0dfRVJST1IoIGVudi0+bG9nLCBBWElTMl9MT0dfU0ksICJOVUxMIHJldHVybnRlZCBmcm9tIHRoZSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3Vic3RyaW5nLWJlZm9yZShAdHlwZSwgJ190KicpIi8+X2Rlc2VyaWFsaXplOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGlzIHNob3VsZCBiZSBkdWUgdG8gYW4gaW52YWxpZCBpbnB1dCBoZWFkZXIiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzMl9za2VsX29wXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc2VydmljZW5hbWUiLz5fPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtZXRob2QtbmFtZSIvPl9mcmVlX2lucHV0X2hlYWRlcnMoZW52LCA8eHNsOmZvci1lYWNoIHNlbGVjdD0iLi4vLi4vaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdzb2FwX2hlYWRlciddIj48eHNsOmlmIHRlc3Q9InBvc2l0aW9uKCkhPTEiPiw8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnRleHQ+XzwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwb3NpdGlvbiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3Vic3RyaW5nLWJlZm9yZSgkaW5wdXR0eXBlLCAnX3QqJykiLz5fZnJlZShpbnB1dF92YWw8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBvc2l0aW9uIi8+LCBlbnYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJoZWFkZXJfdmFyIi8+ID0gaW5wdXRfaGVhZGVyOwotICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLQotICAgICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLQotCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGlzVW53cmFwUGFyYW1ldGVycyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImlucHV0cGFyYW1fdmFsdWVzIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9ImlucHV0L3BhcmFtL0Bjb21wbGV4dHlwZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iaW5wdXQvcGFyYW0vcGFyYW1bQHR5cGUhPScnXSI+LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3Vic3RyaW5nLWJlZm9yZSguLi9AY29tcGxleHR5cGUsICdfdConKSIvPl9nZXRfcHJvcGVydHk8eHNsOnZhbHVlLW9mIHNlbGVjdD0icG9zaXRpb24oKSIvPigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzdWJzdHJpbmctYmVmb3JlKCRpbnB1dHR5cGUsICdfdConKSIvPl9nZXRfcHJvcGVydHkxKGlucHV0X3ZhbDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcG9zaXRpb24iLz48eHNsOnRleHQ+LCBlbnYpPC94c2w6dGV4dD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dGV4dD4sIGVudik8L3hzbDp0ZXh0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImlucHV0L3BhcmFtL3BhcmFtW0B0eXBlIT0nJ10iPiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1iZWZvcmUoJGlucHV0dHlwZSwgJ190KicpIi8+X2dldF9wcm9wZXJ0eTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJwb3NpdGlvbigpIi8+KGlucHV0X3ZhbDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcG9zaXRpb24iLz48eHNsOnRleHQ+LCBlbnYpPC94c2w6dGV4dD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im91dHB1dHBhcmFtX3R5cGVzIiBzZWxlY3Q9Im91dHB1dC9wYXJhbS9wYXJhbS9AdHlwZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvdXRwdXRwYXJhbV90eXBlcyIvPiByZXRfdW53cmFwcGVkID0gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzdmNvcC1wcmVmaXgiLz5fPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtZXRob2QtbmFtZSIvPjx4c2w6dGV4dD4oZW52PC94c2w6dGV4dD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW5wdXRwYXJhbV92YWx1ZXMiLz48eHNsOmZvci1lYWNoIHNlbGVjdD0ib3V0cHV0L3BhcmFtW0Bsb2NhdGlvbj0nc29hcF9oZWFkZXInXSI+LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dGV4dD4mYW1wO188L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcG9zaXRpb24iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJvdXRwdXQvcGFyYW0vQGNvbXBsZXh0eXBlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldF92YWw8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBvc2l0aW9uIi8+ID0gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1iZWZvcmUob3V0cHV0L3BhcmFtL0B0eXBlLCAnX3QqJykiLz5fY3JlYXRlX3dpdGhfdmFsdWVzKGVudiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzdWJzdHJpbmctYmVmb3JlKG91dHB1dC9wYXJhbS9AY29tcGxleHR5cGUsICdfdConKSIvPl9jcmVhdGVfd2l0aF92YWx1ZXMoZW52LCByZXRfdW53cmFwcGVkKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0X3ZhbDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcG9zaXRpb24iLz4gPSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3Vic3RyaW5nLWJlZm9yZShvdXRwdXQvcGFyYW0vQHR5cGUsICdfdConKSIvPl9jcmVhdGVfd2l0aF92YWx1ZXMoZW52LCByZXRfdW53cmFwcGVkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImlucHV0cGFyYW1fdmFsdWVzIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iaW5wdXQvcGFyYW0vQHR5cGUhPScnIj4sPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJpbnB1dC9wYXJhbS9AdHlwZSE9JyciPmlucHV0X3ZhbDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcG9zaXRpb24iLz48L3hzbDppZj48eHNsOmZvci1lYWNoIHNlbGVjdD0iaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdzb2FwX2hlYWRlciddIj4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp0ZXh0Pl88L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcG9zaXRpb24iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXRfdmFsPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwb3NpdGlvbiIvPiA9ICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHN2Y29wLXByZWZpeCIvPl88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1ldGhvZC1uYW1lIi8+PHhzbDp0ZXh0PihlbnY8L3hzbDp0ZXh0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbnB1dHBhcmFtX3ZhbHVlcyIvPjx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJvdXRwdXQvcGFyYW1bQGxvY2F0aW9uPSdzb2FwX2hlYWRlciddIj4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp0ZXh0PiZhbXA7XzwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwb3NpdGlvbiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+KTsKLSAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0ib3V0cHV0L3BhcmFtL0B0eXBlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICggTlVMTCA9PSByZXRfdmFsPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwb3NpdGlvbiIvPiApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQVhJUzJfRVJST1JfU0VUKGVudi0+ZXJyb3IsIEFYSVMyX0VSUk9SX0RBVEFfRUxFTUVOVF9JU19OVUxMLCBBWElTMl9GQUlMVVJFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBWElTMl9MT0dfRVJST1IoZW52LT5sb2csIEFYSVMyX0xPR19TSSwgIk5VTEwgcmV0dXJudGVkIGZyb20gdGhlIGJ1c2luZXNzIGxvZ2ljIGZyb20gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtZXRob2QtbmFtZSIvPiAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9ImlucHV0L3BhcmFtL0BvdXJzIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1iZWZvcmUoaW5wdXQvcGFyYW0vQHR5cGUsICdfdConKSIvPl9mcmVlKGlucHV0X3ZhbDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcG9zaXRpb24iLz4sIGVudik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJpbnB1dC9wYXJhbS9AbG9jYXRpb249J3NvYXBfaGVhZGVyJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMyX3NrZWxfb3BfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzZXJ2aWNlbmFtZSIvPl88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1ldGhvZC1uYW1lIi8+X2ZyZWVfaW5wdXRfaGVhZGVycyhlbnYsIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJpbnB1dC9wYXJhbVtAbG9jYXRpb249J3NvYXBfaGVhZGVyJ10iPjx4c2w6aWYgdGVzdD0icG9zaXRpb24oKSE9MSI+LDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp0ZXh0Pl88L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcG9zaXRpb24iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJvdXRwdXQvcGFyYW0vQGxvY2F0aW9uPSdzb2FwX2hlYWRlciciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzMl9za2VsX29wXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc2VydmljZW5hbWUiLz5fPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtZXRob2QtbmFtZSIvPl9mcmVlX291dHB1dF9oZWFkZXJzKGVudiwgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Im91dHB1dC9wYXJhbVtAbG9jYXRpb249J3NvYXBfaGVhZGVyJ10iPjx4c2w6aWYgdGVzdD0icG9zaXRpb24oKSE9MSI+LDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp0ZXh0PiBfPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBvc2l0aW9uIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOyAKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldF9ub2RlID0gPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0ib3V0cHV0L3BhcmFtL0BvdXJzIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1iZWZvcmUoJG91dHB1dHR5cGUsICdfdConKSIvPl9zZXJpYWxpemUocmV0X3ZhbDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcG9zaXRpb24iLz4sIGVudiwgTlVMTCwgTlVMTCwgQVhJUzJfVFJVRSwgTlVMTCwgTlVMTCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzdWJzdHJpbmctYmVmb3JlKCRvdXRwdXR0eXBlLCAnX3QqJykiLz5fZnJlZShyZXRfdmFsPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwb3NpdGlvbiIvPiwgZW52KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJpbnB1dC9wYXJhbS9AdHlwZSE9JyciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1iZWZvcmUoaW5wdXQvcGFyYW0vQHR5cGUsICdfdConKSIvPl9mcmVlKGlucHV0X3ZhbDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcG9zaXRpb24iLz4sIGVudik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPnJldF92YWw8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBvc2l0aW9uIi8+OzwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0ib3V0cHV0L3BhcmFtW0Bsb2NhdGlvbj0nc29hcF9oZWFkZXInXSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXNfc29hcF9lbnYgPSBheGlzMl9tc2dfY3R4X2dldF9yZXNwb25zZV9zb2FwX2VudmVsb3BlKG1zZ19jdHgsIGVudik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZighcmVzX3NvYXBfZW52KQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc19zb2FwX2VudiA9IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbWV0aG9kLXByZWZpeCIvPl9jcmVhdGVfcmVzcG9uc2VfZW52ZWxvcGUoZW52LCBpbl9tc2dfY3R4LCBtc2dfY3R4LCByZXRfbm9kZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZighcmVzX3NvYXBfZW52KQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFYSVMyX0xPR19FUlJPUiggZW52LT5sb2csIEFYSVMyX0xPR19TSSwgInJlc3BvbnNlIGV2ZWxvcGUgaXMgTlVMTCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iaW5wdXQvcGFyYW0vQGxvY2F0aW9uPSdzb2FwX2hlYWRlciciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMyX3NrZWxfb3BfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzZXJ2aWNlbmFtZSIvPl88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1ldGhvZC1uYW1lIi8+X2ZyZWVfaW5wdXRfaGVhZGVycyhlbnYsIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJpbnB1dC9wYXJhbVtAbG9jYXRpb249J3NvYXBfaGVhZGVyJ10iPjx4c2w6aWYgdGVzdD0icG9zaXRpb24oKSE9MSI+LDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp0ZXh0PiBfPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBvc2l0aW9uIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0ib3V0cHV0L3BhcmFtL0Bsb2NhdGlvbj0nc29hcF9oZWFkZXInIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpczJfc2tlbF9vcF88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHNlcnZpY2VuYW1lIi8+Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbWV0aG9kLW5hbWUiLz5fZnJlZV9vdXRwdXRfaGVhZGVycyhlbnYsIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJvdXRwdXQvcGFyYW1bQGxvY2F0aW9uPSdzb2FwX2hlYWRlciddIj48eHNsOmlmIHRlc3Q9InBvc2l0aW9uKCkhPTEiPiw8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dGV4dD4gXzwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwb3NpdGlvbiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc19zb2FwX2hlYWRlciA9IGF4aW9tX3NvYXBfZW52ZWxvcGVfZ2V0X2hlYWRlcihyZXNfc29hcF9lbnYsIGVudik7Ci0gCi0gICAgICAgICAgICAgICAgICAgICAgICBpZihyZXNfc29hcF9oZWFkZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyX2Jhc2Vfbm9kZSA9IGF4aW9tX3NvYXBfaGVhZGVyX2dldF9iYXNlX25vZGUocmVzX3NvYXBfaGVhZGVyLCBlbnYpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFoZWFkZXJfYmFzZV9ub2RlKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iaW5wdXQvcGFyYW0vQGxvY2F0aW9uPSdzb2FwX2hlYWRlciciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMyX3NrZWxfb3BfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzZXJ2aWNlbmFtZSIvPl88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1ldGhvZC1uYW1lIi8+X2ZyZWVfaW5wdXRfaGVhZGVycyhlbnYsIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJpbnB1dC9wYXJhbVtAbG9jYXRpb249J3NvYXBfaGVhZGVyJ10iPjx4c2w6aWYgdGVzdD0icG9zaXRpb24oKSE9MSI+LDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp0ZXh0PiBfPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBvc2l0aW9uIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0ib3V0cHV0L3BhcmFtL0Bsb2NhdGlvbj0nc29hcF9oZWFkZXInIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpczJfc2tlbF9vcF88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHNlcnZpY2VuYW1lIi8+Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbWV0aG9kLW5hbWUiLz5fZnJlZV9vdXRwdXRfaGVhZGVycyhlbnYsIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJvdXRwdXQvcGFyYW1bQGxvY2F0aW9uPSdzb2FwX2hlYWRlciddIj48eHNsOmlmIHRlc3Q9InBvc2l0aW9uKCkhPTEiPiw8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dGV4dD4gXzwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwb3NpdGlvbiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBWElTMl9MT0dfRVJST1IoIGVudi0+bG9nLCBBWElTMl9MT0dfU0ksICJSZXF1aXJlZCByZXNwb25zZSBoZWFkZXIgaXMgTlVMTCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGFkZGluZyBvdXRwdXQgaGVhZGVycyAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJvdXRwdXQvcGFyYW1bQGxvY2F0aW9uPSdzb2FwX2hlYWRlciddIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQG91cnMiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9oZWFkZXIgPSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3Vic3RyaW5nLWJlZm9yZShAdHlwZSwgJ190KicpIi8+X3NlcmlhbGl6ZShfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwb3NpdGlvbiIvPiwgZW52LCBOVUxMLCBOVUxMLCBBWElTMl9UUlVFLCBOVUxMLCBOVUxMKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9oZWFkZXIgPSBfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpb21fbm9kZV9hZGRfY2hpbGQoaGVhZGVyX2Jhc2Vfbm9kZSwgZW52LCBvdXRwdXRfaGVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPgotCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9ImlucHV0L3BhcmFtL0Bsb2NhdGlvbj0nc29hcF9oZWFkZXInIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMyX3NrZWxfb3BfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzZXJ2aWNlbmFtZSIvPl88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1ldGhvZC1uYW1lIi8+X2ZyZWVfaW5wdXRfaGVhZGVycyhlbnYsIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJpbnB1dC9wYXJhbVtAbG9jYXRpb249J3NvYXBfaGVhZGVyJ10iPjx4c2w6aWYgdGVzdD0icG9zaXRpb24oKSE9MSI+LDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnRleHQ+IF88L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcG9zaXRpb24iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJvdXRwdXQvcGFyYW0vQGxvY2F0aW9uPSdzb2FwX2hlYWRlciciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMyX3NrZWxfb3BfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzZXJ2aWNlbmFtZSIvPl88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1ldGhvZC1uYW1lIi8+X2ZyZWVfb3V0cHV0X2hlYWRlcnMoZW52LCA8eHNsOmZvci1lYWNoIHNlbGVjdD0ib3V0cHV0L3BhcmFtW0Bsb2NhdGlvbj0nc29hcF9oZWFkZXInXSI+PHhzbDppZiB0ZXN0PSJwb3NpdGlvbigpIT0xIj4sPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dGV4dD4gXzwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwb3NpdGlvbiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4pOwotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXRfbm9kZTsKLSAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiggQVhJUzJfRkFJTFVSRSA9PSByZXRfdmFsPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwb3NpdGlvbiIvPiApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQVhJUzJfTE9HX0VSUk9SKGVudi0+bG9nLCBBWElTMl9MT0dfU0ksICJOVUxMIHJldHVybnRlZCBmcm9tIHRoZSBidXNpbmVzcyBsb2dpYyBmcm9tIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbWV0aG9kLW5hbWUiLz4gIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9ImlucHV0L3BhcmFtL0B0eXBlIT0nJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3Vic3RyaW5nLWJlZm9yZShpbnB1dC9wYXJhbS9AdHlwZSwgJ190KicpIi8+X2ZyZWUoaW5wdXRfdmFsPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwb3NpdGlvbiIvPiwgZW52KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJpbnB1dC9wYXJhbS9AbG9jYXRpb249J3NvYXBfaGVhZGVyJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICBheGlzMl9za2VsX29wXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc2VydmljZW5hbWUiLz5fPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtZXRob2QtbmFtZSIvPl9mcmVlX2lucHV0X2hlYWRlcnMoZW52LCA8eHNsOmZvci1lYWNoIHNlbGVjdD0iaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdzb2FwX2hlYWRlciddIj48eHNsOmlmIHRlc3Q9InBvc2l0aW9uKCkhPTEiPiw8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp0ZXh0PiBfPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0icG9zaXRpb24oKSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4pOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogc2luY2UgdGhpcyBoYXMgbm8gb3V0cHV0IHBhcmFtcyBpdCBqdXN0IHJldHVybnMgTlVMTCAqLyAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iJG91dHB1dHR5cGU9JyciPnJldHVybiBOVUxMOzwveHNsOmlmPgotCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPgotICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgIEFYSVMyX0xPR19FUlJPUihlbnYtPmxvZywgQVhJUzJfTE9HX1NJLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRza2VsZXRvbm5hbWUiLz4gc2VydmljZSBFUlJPUjogaW52YWxpZCBPTSBwYXJhbWV0ZXJzIGluIHJlcXVlc3RcbiIpOwotICAgICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIGF4aW9tX25vZGVfdCogQVhJUzJfQ0FMTAotICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbWV0aG9kLXByZWZpeCIvPl9vbl9mYXVsdChheGlzMl9zdmNfc2tlbGV0b25fdCAqc3ZjX3NrZWxldG9uLAotICAgICAgICAgICAgICAgICAgY29uc3QgYXh1dGlsX2Vudl90ICplbnYsIGF4aW9tX25vZGVfdCAqbm9kZSkKLQl7Ci0JCWF4aW9tX25vZGVfdCAqZXJyb3Jfbm9kZSA9IE5VTEw7Ci0JCWF4aW9tX2VsZW1lbnRfdCAqZXJyb3JfZWxlID0gTlVMTDsKLQkJZXJyb3JfZWxlID0gYXhpb21fZWxlbWVudF9jcmVhdGUoZW52LCBub2RlLCAiZmF1bHQiLCBOVUxMLAotICAgIAkJCQkJJmFtcDtlcnJvcl9ub2RlKTsKLQkJYXhpb21fZWxlbWVudF9zZXRfdGV4dChlcnJvcl9lbGUsIGVudiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcW5hbWUiLz4gZmFpbGVkIiwKLSAgICAJCQkJCWVycm9yX25vZGUpOwotCQlyZXR1cm4gZXJyb3Jfbm9kZTsKLQl9Ci0KLQotCS8qKgotCSAqIEZvbGxvd2luZyBibG9jayBkaXN0aW5ndWlzaCB0aGUgZXhwb3NlZCBwYXJ0IG9mIHRoZSBkbGwuCi0gCSAqLwotCi0gICAgQVhJUzJfRVhURVJOIGludAotICAgIGF4aXMyX2dldF9pbnN0YW5jZShzdHJ1Y3QgYXhpczJfc3ZjX3NrZWxldG9uICoqaW5zdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBheHV0aWxfZW52X3QgKmVudikKLQl7Ci0JCSppbnN0ID0gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtZXRob2QtcHJlZml4Ii8+X2NyZWF0ZShlbnYpOwotCi0gICAgICAgIGlmKCEoKmluc3QpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gQVhJUzJfRkFJTFVSRTsKLSAgICAgICAgfQotCi0gIAkJcmV0dXJuIEFYSVMyX1NVQ0NFU1M7Ci0JfQotCi0JQVhJUzJfRVhURVJOIGludCAKLSAgICBheGlzMl9yZW1vdmVfaW5zdGFuY2UoYXhpczJfc3ZjX3NrZWxldG9uX3QgKmluc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXh1dGlsX2Vudl90ICplbnYpCi0JewotICAgICAgICBheGlzMl9zdGF0dXNfdCBzdGF0dXMgPSBBWElTMl9GQUlMVVJFOwotICAgICAgIAlpZiAoaW5zdCkKLSAgICAgICAgewotICAgICAgICAgICAgc3RhdHVzID0gQVhJUzJfU1ZDX1NLRUxFVE9OX0ZSRUUoaW5zdCwgZW52KTsKLSAgICAgICAgfQotICAgIAlyZXR1cm4gc3RhdHVzOwotCX0KLQotCi0gICAgPC94c2w6dGVtcGxhdGU+Ci0KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdGVtcGxhdGUvYy9TZXJ2aWNlWE1MVGVtcGxhdGUueHNsIGIvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL3RlbXBsYXRlL2MvU2VydmljZVhNTFRlbXBsYXRlLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYyN2Y1YS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdGVtcGxhdGUvYy9TZXJ2aWNlWE1MVGVtcGxhdGUueHNsCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIiB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSI+Ci0gICAgPHhzbDpvdXRwdXQgbWV0aG9kPSJ4bWwiIGluZGVudD0ieWVzIiBvbWl0LXhtbC1kZWNsYXJhdGlvbj0ieWVzIi8+Ci0KLSAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvIj4KLSAgICAgICAgPHhzbDpjb21tZW50PiBUaGlzIGZpbGUgd2FzIGF1dG8tZ2VuZXJhdGVkIGZyb20gV1NETCA8L3hzbDpjb21tZW50PgotICAgICAgICA8eHNsOmNvbW1lbnQ+IGJ5IHRoZSBBcGFjaGUgQXhpczIgdmVyc2lvbjogI2F4aXNWZXJzaW9uIyAjdG9kYXkjIDwveHNsOmNvbW1lbnQ+Ci0gICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4KLSAgICA8L3hzbDp0ZW1wbGF0ZT4KLQotICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImludGVyZmFjZSI+Ci0gICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ic2VydmljZW5hbWUiPgotICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRyYW5zbGF0ZShAc2VydmljZW5hbWUsJzouLScsJ19fXycpIi8+Ci0gICAgICAgIDwveHNsOnZhcmlhYmxlPgotCi0gICAgICAgIDxzZXJ2aWNlPgotICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0ibmFtZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzZXJ2aWNlbmFtZSIvPjwveHNsOmF0dHJpYnV0ZT4KLQotICAgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJTZXJ2aWNlQ2xhc3MiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzZXJ2aWNlbmFtZSIvPgotICAgICAgICAgICAgPC9wYXJhbWV0ZXI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAc2VydmljZW5hbWUiLz4gU2VydmljZQotICAgICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJtZXRob2QiPgotCQkJCTxvcGVyYXRpb24+Ci0JCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9Im5hbWUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbG9jYWxwYXJ0Ii8+PC94c2w6YXR0cmlidXRlPgotICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJtZXAiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbWVwVVJJIi8+PC94c2w6YXR0cmlidXRlPgotICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJAc29hcGFjdGlvbiI+Ci0gICAgICAgICAgICAgIDxwYXJhbWV0ZXI+Ci0gICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0ibmFtZSI+PHhzbDp0ZXh0PndzYW1hcHBpbmc8L3hzbDp0ZXh0PjwveHNsOmF0dHJpYnV0ZT4KLSAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHNvYXBhY3Rpb24iLz4KLSAgICAgICAgICAgICAgPC9wYXJhbWV0ZXI+Ci0gICAgICAgICAgICA8L3hzbDppZj4KLQkJCQk8L29wZXJhdGlvbj4KLQkJCTwveHNsOmZvci1lYWNoPgotICAgICAgICA8L3NlcnZpY2U+Ci0gICAgPC94c2w6dGVtcGxhdGU+Ci08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL3RlbXBsYXRlL2MvU2tlbEhlYWRlclRlbXBsYXRlLnhzbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC90ZW1wbGF0ZS9jL1NrZWxIZWFkZXJUZW1wbGF0ZS54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhZDUzMmIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL3RlbXBsYXRlL2MvU2tlbEhlYWRlclRlbXBsYXRlLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIj4KLSAgICA8eHNsOm91dHB1dCBtZXRob2Q9InRleHQiLz4KLSAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvaW50ZXJmYWNlIj4KLSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InN2Y19uYW1lIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48L3hzbDp2YXJpYWJsZT4KLSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im1ldGhvZC1wcmVmaXgiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAcHJlZml4Ii8+PC94c2w6dmFyaWFibGU+Ci0gICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJxbmFtZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBxbmFtZSIvPjwveHNsOnZhcmlhYmxlPgotCi0gICAgLyoqCi0gICAgICogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+LmgKLSAgICAgKgotICAgICAqIFRoaXMgZmlsZSB3YXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBXU0RMIGZvciAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRxbmFtZSIvPiIgc2VydmljZQotICAgICAqIGJ5IHRoZSBBcGFjaGUgQXhpczIvQyB2ZXJzaW9uOiAjYXhpc1ZlcnNpb24jICN0b2RheSMKLSAgICAgKiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4gQXhpczIvQyBza2VsZXRvbiBmb3IgdGhlIGF4aXNTZXJ2aWNlLSBIZWFkZXIgZmlsZQotICAgICAqLwotCi0KLQkjaW5jbHVkZSAmbHQ7YXhpczJfc3ZjX3NrZWxldG9uLmgmZ3Q7Ci0JI2luY2x1ZGUgJmx0O2F4dXRpbF9sb2dfZGVmYXVsdC5oJmd0OwotCSNpbmNsdWRlICZsdDtheHV0aWxfZXJyb3JfZGVmYXVsdC5oJmd0OwotCSNpbmNsdWRlICZsdDtheGlvbV90ZXh0LmgmZ3Q7Ci0JI2luY2x1ZGUgJmx0O2F4aW9tX25vZGUuaCZndDsKLQkjaW5jbHVkZSAmbHQ7YXhpb21fZWxlbWVudC5oJmd0OwotICAgICNpbmNsdWRlICZsdDtzdGRpby5oJmd0OwotCi0KLSAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJtZXRob2QiPgotICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJpbnB1dC9wYXJhbVtAdHlwZSE9JycgYW5kIEBvdXJzXSI+Ci0gICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaW5wdXR0eXBlIiBzZWxlY3Q9InN1YnN0cmluZy1iZWZvcmUoQHR5cGUsICdfdConKSIvPgotICAgICAjaW5jbHVkZSAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbnB1dHR5cGUiLz4uaCIKLSAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0ib3V0cHV0L3BhcmFtW0B0eXBlIT0nJyBhbmQgQG91cnNdIj4KLSAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJvdXRwdXR0eXBlIiBzZWxlY3Q9InN1YnN0cmluZy1iZWZvcmUoQHR5cGUsICdfdConKSIvPgotICAgICAjaW5jbHVkZSAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvdXRwdXR0eXBlIi8+LmgiCi0gICAgPC94c2w6Zm9yLWVhY2g+Ci0gICA8L3hzbDpmb3ItZWFjaD4KLQotCSNpZmRlZiBfX2NwbHVzcGx1cwotCWV4dGVybiAiQyIgewotCSNlbmRpZgotCi0gICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJtZXRob2QiPgotICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJvdXRwdXRvdXJzIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0ib3V0cHV0L3BhcmFtL0BvdXJzIj48L3hzbDp2YWx1ZS1vZj48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaXNVbndyYXBQYXJhbWV0ZXJzIiBzZWxlY3Q9ImlucHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keScgYW5kIEB0eXBlIT0nJ10vQHVud3JhcHBQYXJhbWV0ZXJzIi8+Ci0gICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im91dHB1dHR5cGUiPgotICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRpc1Vud3JhcFBhcmFtZXRlcnMiPgotICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ib3V0cHV0L3BhcmFtL3BhcmFtL0B0eXBlIi8+Ci0gICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0ib3V0cHV0L3BhcmFtL0B0eXBlIj48L3hzbDp2YWx1ZS1vZj48L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICA8L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iY291bnQiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJjb3VudChvdXRwdXQvcGFyYW0pIi8+PC94c2w6dmFyaWFibGU+Ci0KLQkJIDwhLS0gcmVnYXJkbGVzcyBvZiB0aGUgc3luYyBvciBhc3luYyBzdGF0dXMsIHRoZSBnZW5lcmF0ZWQgbWV0aG9kIHNpZ25hdHVyZSB3b3VsZCBiZSBqdXN0IGEgdXN1YWwKLQkgICAgICAgICAgIGMgZnVuY3Rpb24tLT4KLSAgICAgICAgLyoqCi0gICAgICAgICAqIGF1dG8gZ2VuZXJhdGVkIGZ1bmN0aW9uIGRlY2xhcmF0aW9uCi0gICAgICAgICAqIGZvciAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBxbmFtZSIvPiIgb3BlcmF0aW9uLgotICAgICAgICAgKiBAcGFyYW0gZW52IGVudmlyb25tZW50ICggbWFuZGF0b3J5KTx4c2w6aWYgdGVzdD0ibm90KCRpc1Vud3JhcFBhcmFtZXRlcnMpIj48eHNsOmZvci1lYWNoIHNlbGVjdD0iaW5wdXQvcGFyYW1bQHR5cGUhPScnXSI+PHhzbDp0ZXh0PgotICAgICAgICAgPC94c2w6dGV4dD4qIEBwYXJhbSBfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+IG9mIHRoZSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz48L3hzbDpmb3ItZWFjaD48L3hzbDppZj4KLSAgICAgICAgIDx4c2w6aWYgdGVzdD0iJGlzVW53cmFwUGFyYW1ldGVycyI+PHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImlucHV0L3BhcmFtL3BhcmFtW0B0eXBlIT0nJ10iPjx4c2w6dGV4dD4KLSAgICAgICAgIDwveHNsOnRleHQ+KiBAcGFyYW0gXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPiBvZiB0aGUgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+PC94c2w6Zm9yLWVhY2g+PC94c2w6aWY+Ci0gICAgICAgICAqPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Im91dHB1dC9wYXJhbVtAbG9jYXRpb249J3NvYXBfaGVhZGVyJ10iPjx4c2w6dGV4dD4KLSAgICAgICAgIDwveHNsOnRleHQ+KiBAcGFyYW0gZHBfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+IC0gb3V0cHV0IGhlYWRlcjwveHNsOmZvci1lYWNoPgotICAgICAgICAgKiBAcmV0dXJuIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkb3V0cHV0dHlwZSIvPjx4c2w6dGV4dD4KLSAgICAgICAgICovCi0gICAgICAgIDwveHNsOnRleHQ+Ci0KLSAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJpbnB1dHBhcmFtcyI+Ci0gICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkaXNVbndyYXBQYXJhbWV0ZXJzIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJpbnB1dC9wYXJhbS9wYXJhbVtAdHlwZSE9JyddIj4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+PHhzbDp0ZXh0PiBfPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPgotICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImlucHV0L3BhcmFtW0B0eXBlIT0nJ10iPiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz48eHNsOnRleHQ+IF88L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgIDwveHNsOnZhcmlhYmxlPgotCi0gICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG91dHB1dHR5cGU9JyciPmF4aXMyX3N0YXR1c190IDwveHNsOndoZW4+Ci0gICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkb3V0cHV0dHlwZSE9JyciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkb3V0cHV0dHlwZSIvPjwveHNsOndoZW4+Ci0gICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgPHhzbDp0ZXh0PiA8L3hzbDp0ZXh0PgotICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1ldGhvZC1wcmVmaXgiLz5fPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PHhzbDp0ZXh0Pihjb25zdCBheHV0aWxfZW52X3QgKmVudjwveHNsOnRleHQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGlucHV0cGFyYW1zIi8+PHhzbDpmb3ItZWFjaCBzZWxlY3Q9Im91dHB1dC9wYXJhbVtAbG9jYXRpb249J3NvYXBfaGVhZGVyJ10iPiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJvdXRwdXR0eXBlIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz48eHNsOmlmIHRlc3Q9IkBvdXJzIj4qPC94c2w6aWY+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkb3V0cHV0dHlwZSIvPjx4c2w6dGV4dD4gZHBfPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48eHNsOnRleHQ+IC8qIG91dHB1dCBoZWFkZXIgZG91YmxlIHB0ciovPC94c2w6dGV4dD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPiApOwotICAgICA8L3hzbDpmb3ItZWFjaD4KLQotCSNpZmRlZiBfX2NwbHVzcGx1cwotCX0KLQkjZW5kaWYKLSAgICA8L3hzbDp0ZW1wbGF0ZT4KLSA8L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL3RlbXBsYXRlL2MvU2tlbFNvdXJjZVRlbXBsYXRlLnhzbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC90ZW1wbGF0ZS9jL1NrZWxTb3VyY2VUZW1wbGF0ZS54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjNzgwODguLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL3RlbXBsYXRlL2MvU2tlbFNvdXJjZVRlbXBsYXRlLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iPgotICAgIDx4c2w6b3V0cHV0IG1ldGhvZD0idGV4dCIvPgotICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii9pbnRlcmZhY2UiPgotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ic3ZjX25hbWUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwveHNsOnZhcmlhYmxlPgotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ibWV0aG9kLXByZWZpeCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBwcmVmaXgiLz48L3hzbDp2YXJpYWJsZT4KLSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InFuYW1lIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHFuYW1lIi8+PC94c2w6dmFyaWFibGU+Ci0KLSAgICAvKioKLSAgICAgKiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4uYwotICAgICAqCi0gICAgICogVGhpcyBmaWxlIHdhcyBhdXRvLWdlbmVyYXRlZCBmcm9tIFdTREwgZm9yICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHFuYW1lIi8+IiBzZXJ2aWNlCi0gICAgICogYnkgdGhlIEFwYWNoZSBBeGlzMi9DIHZlcnNpb246ICNheGlzVmVyc2lvbiMgI3RvZGF5IwotICAgICAqIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPiBBeGlzMi9DIHNrZWxldG9uIGZvciB0aGUgYXhpc1NlcnZpY2UKLSAgICAgKi8KLQotICAgICAjaW5jbHVkZSAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+LmgiCi0KLSAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Im1ldGhvZCI+Ci0gICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im91dHB1dG91cnMiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJvdXRwdXQvcGFyYW0vQG91cnMiPjwveHNsOnZhbHVlLW9mPjwveHNsOnZhcmlhYmxlPgotICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJjb3VudCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImNvdW50KG91dHB1dC9wYXJhbSkiLz48L3hzbDp2YXJpYWJsZT4KLQotICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJpc1Vud3JhcFBhcmFtZXRlcnMiIHNlbGVjdD0iaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdib2R5JyBhbmQgQHR5cGUhPScnXS9AdW53cmFwcFBhcmFtZXRlcnMiLz4KLSAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ib3V0cHV0dHlwZSI+Ci0gICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGlzVW53cmFwUGFyYW1ldGVycyI+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJvdXRwdXQvcGFyYW0vcGFyYW0vQHR5cGUiLz4KLSAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJvdXRwdXQvcGFyYW0vQHR5cGUiPjwveHNsOnZhbHVlLW9mPjwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgIDwveHNsOnZhcmlhYmxlPgotCi0JCSA8IS0tIHJlZ2FyZGxlc3Mgb2YgdGhlIHN5bmMgb3IgYXN5bmMgc3RhdHVzLCB0aGUgZ2VuZXJhdGVkIG1ldGhvZCBzaWduYXR1cmUgd291bGQgYmUganVzdCBhIHVzdWFsCi0JICAgICAgICAgICBjIGZ1bmN0aW9uLS0+Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBhdXRvIGdlbmVyYXRlZCBmdW5jdGlvbiBkZWZpbml0aW9uIHNpZ25hdHVyZQotICAgICAgICAgKiBmb3IgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAcW5hbWUiLz4iIG9wZXJhdGlvbi4KLSAgICAgICAgICogQHBhcmFtIGVudiBlbnZpcm9ubWVudCAoIG1hbmRhdG9yeSk8eHNsOmlmIHRlc3Q9Im5vdCgkaXNVbndyYXBQYXJhbWV0ZXJzKSI+PHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImlucHV0L3BhcmFtW0B0eXBlIT0nJ10iPjx4c2w6dGV4dD4KLSAgICAgICAgIDwveHNsOnRleHQ+KiBAcGFyYW0gXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPiBvZiB0aGUgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+PC94c2w6Zm9yLWVhY2g+PC94c2w6aWY+Ci0gICAgICAgICA8eHNsOmlmIHRlc3Q9IiRpc1Vud3JhcFBhcmFtZXRlcnMiPjx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJpbnB1dC9wYXJhbS9wYXJhbVtAdHlwZSE9JyddIj48eHNsOnRleHQ+Ci0gICAgICAgICA8L3hzbDp0ZXh0PiogQHBhcmFtIF88eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4gb2YgdGhlIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPjwveHNsOmZvci1lYWNoPjwveHNsOmlmPgotICAgICAgICAgKjx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJvdXRwdXQvcGFyYW1bQGxvY2F0aW9uPSdzb2FwX2hlYWRlciddIj48eHNsOnRleHQ+Ci0gICAgICAgICA8L3hzbDp0ZXh0PiogQHBhcmFtIGRwXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPiAtIG91dHB1dCBoZWFkZXI8L3hzbDpmb3ItZWFjaD4KLSAgICAgICAgICogQHJldHVybiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG91dHB1dHR5cGUiLz48eHNsOnRleHQ+Ci0gICAgICAgICAqLwotICAgICAgICA8L3hzbDp0ZXh0PgotICAgICAgICAgCi0gICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaW5wdXRwYXJhbXMiPgotICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGlzVW53cmFwUGFyYW1ldGVycyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iaW5wdXQvcGFyYW0vcGFyYW1bQHR5cGUhPScnXSI+LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPjx4c2w6dGV4dD4gXzwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJpbnB1dC9wYXJhbVtAdHlwZSE9JyddIj4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+PHhzbDp0ZXh0PiBfPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPgotICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICA8L3hzbDp2YXJpYWJsZT4KLQotICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRvdXRwdXR0eXBlPScnIj5heGlzMl9zdGF0dXNfdCA8L3hzbDp3aGVuPgotICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG91dHB1dHR5cGUhPScnIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG91dHB1dHR5cGUiLz48L3hzbDp3aGVuPgotICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgIDx4c2w6dGV4dD4gPC94c2w6dGV4dD4KLSAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtZXRob2QtcHJlZml4Ii8+Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjx4c2w6dGV4dD4oY29uc3QgYXh1dGlsX2Vudl90ICplbnY8L3hzbDp0ZXh0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbnB1dHBhcmFtcyIvPjx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJvdXRwdXQvcGFyYW1bQGxvY2F0aW9uPSdzb2FwX2hlYWRlciddIj4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ib3V0cHV0dHlwZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+PHhzbDppZiB0ZXN0PSJAb3VycyI+KjwveHNsOmlmPjwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG91dHB1dHR5cGUiLz48eHNsOnRleHQ+IGRwXzwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PHhzbDp0ZXh0PiAvKiBvdXRwdXQgaGVhZGVyIGRvdWJsZSBwdHIqLzwveHNsOnRleHQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4gKQotICAgICAgICB7Ci0gICAgICAgICAgLyogVE9ETyBmaWxsIHRoaXMgd2l0aCB0aGUgbmVjZXNzYXJ5IGJ1c2luZXNzIGxvZ2ljICovCi0gICAgICAgICAgPHhzbDppZiB0ZXN0PSIkb3V0cHV0dHlwZSE9JyciPnJldHVybiAoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvdXRwdXR0eXBlIi8+KU5VTEw7PC94c2w6aWY+Ci0gICAgICAgICAgPHhzbDppZiB0ZXN0PSIkb3V0cHV0dHlwZT0nJyI+cmV0dXJuIEFYSVMyX1NVQ0NFU1M7PC94c2w6aWY+Ci0gICAgICAgIH0KLSAgICAgPC94c2w6Zm9yLWVhY2g+Ci0KLSAgICA8L3hzbDp0ZW1wbGF0ZT4KLSA8L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL3RlbXBsYXRlL2MvU3R1YkhlYWRlclRlbXBsYXRlLnhzbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC90ZW1wbGF0ZS9jL1N0dWJIZWFkZXJUZW1wbGF0ZS54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNzZmN2EuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL3RlbXBsYXRlL2MvU3R1YkhlYWRlclRlbXBsYXRlLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDI0NSArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIj4KLSAgICA8eHNsOm91dHB1dCBtZXRob2Q9InRleHQiLz4KLQotCi0gICAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iL2NsYXNzIj4KLSAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJpbnRlcmZhY2VOYW1lIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGludGVyZmFjZU5hbWUiLz48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJjYWxsYmFja25hbWUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAY2FsbGJhY2tuYW1lIi8+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaXNTeW5jIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGlzU3luYyIvPjwveHNsOnZhcmlhYmxlPgotICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImlzQXN5bmMiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAaXNBc3luYyIvPjwveHNsOnZhcmlhYmxlPgotICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InNvYXBWZXJzaW9uIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHNvYXAtdmVyc2lvbiIvPjwveHNsOnZhcmlhYmxlPgotICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im1ldGhvZC1wcmVmaXgiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAcHJlZml4Ii8+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icW5hbWUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAcW5hbWUiLz48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJzZXJ2aWNlbmFtZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBzZXJ2aWNlbmFtZSIvPjwveHNsOnZhcmlhYmxlPgotCi0gICAgICAgIC8qKgotICAgICAgICAqIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPi5oCi0gICAgICAgICoKLSAgICAgICAgKiBUaGlzIGZpbGUgd2FzIGF1dG8tZ2VuZXJhdGVkIGZyb20gV1NETCBmb3IgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcW5hbWUiLz4iIHNlcnZpY2UKLSAgICAgICAgKiBieSB0aGUgQXBhY2hlIEF4aXMyL0phdmEgdmVyc2lvbjogI2F4aXNWZXJzaW9uIyAjdG9kYXkjCi0gICAgICAgICovCi0KLSAgICAgICAgI2luY2x1ZGUgJmx0O3N0ZGlvLmgmZ3Q7Ci0gICAgICAgICNpbmNsdWRlICZsdDtheGlvbS5oJmd0OwotICAgICAgICAjaW5jbHVkZSAmbHQ7YXh1dGlsX3V0aWxzLmgmZ3Q7Ci0gICAgICAgICNpbmNsdWRlICZsdDtheGlvbV9zb2FwLmgmZ3Q7Ci0gICAgICAgICNpbmNsdWRlICZsdDtheGlzMl9jbGllbnQuaCZndDsKLSAgICAgICAgI2luY2x1ZGUgJmx0O2F4aXMyX3N0dWIuaCZndDsKLQotICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJtZXRob2QiPgotICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iaW5wdXQvcGFyYW1bQHR5cGUhPScnIGFuZCBAb3VycyBdIj4KLSAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaW5wdXR0eXBlIiBzZWxlY3Q9InN1YnN0cmluZy1iZWZvcmUoQHR5cGUsICdfdConKSIvPgotICAgICAgICAgI2luY2x1ZGUgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW5wdXR0eXBlIi8+LmgiCi0gICAgICAgIDwveHNsOmZvci1lYWNoPgotICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0ib3V0cHV0L3BhcmFtW0B0eXBlIT0nJyBhbmQgQG91cnMgXSI+Ci0gICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im91dHB1dHR5cGUiIHNlbGVjdD0ic3Vic3RyaW5nLWJlZm9yZShAdHlwZSwgJ190KicpIi8+Ci0gICAgICAgICAjaW5jbHVkZSAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvdXRwdXR0eXBlIi8+LmgiCi0gICAgICAgIDwveHNsOmZvci1lYWNoPgotICAgICAgIDwveHNsOmZvci1lYWNoPgotCi0JI2lmZGVmIF9fY3BsdXNwbHVzCi0JZXh0ZXJuICJDIiB7Ci0JI2VuZGlmCi0KLSAgICAgICAgLyoqKioqKioqKioqKioqKioqIGZ1bmN0aW9uIHByb3RvdHlwZXMgLSBmb3IgaGVhZGVyIGZpbGUgKioqKioqKioqKioqKi8KLSAgICAgICAgLyoqCi0gICAgICAgICAqIGF4aXMyX3N0dWJfY3JlYXRlXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc2VydmljZW5hbWUiLz4KLSAgICAgICAgICogQ3JlYXRlIGFuZCByZXR1cm4gdGhlIHN0dWIgd2l0aCBzZXJ2aWNlcyBwb3B1bGF0ZWQKLSAgICAgICAgICogQHBhcmFtIGVudiBFbnZpcm9ubWVudCAoIG1hbmRhdG9yeSkKLSAgICAgICAgICogQHBhcmFtIGNsaWVudF9ob21lIEF4aXMyL0MgaG9tZSAoIG1hbmRhdG9yeSApCi0gICAgICAgICAqIEBwYXJhbSBlbmRwb2ludF91cmkgU2VydmljZSBlbmRwb2ludCB1cmkoIG9wdGlvbmFsICkgLSBpZiBOVUxMIGRlZmF1bHQgcGlja2VkIGZyb20gV1NETCB1c2VkCi0gICAgICAgICAqIEByZXR1cm4gTmV3bHkgY3JlYXRlZCBzdHViIG9iamVjdAotICAgICAgICAgKi8KLSAgICAgICAgYXhpczJfc3R1Yl90KiBBWElTMl9DQUxMCi0gICAgICAgIGF4aXMyX3N0dWJfY3JlYXRlXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc2VydmljZW5hbWUiLz4oY29uc3QgYXh1dGlsX2Vudl90ICplbnYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXhpczJfY2hhcl90ICpjbGllbnRfaG9tZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBheGlzMl9jaGFyX3QgKmVuZHBvaW50X3VyaSk7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBheGlzMl9zdHViX3BvcHVsYXRlX3NlcnZpY2VzX2Zvcl88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHNlcnZpY2VuYW1lIi8+Ci0gICAgICAgICAqIHBvcHVsYXRlIHRoZSBzdmMgaW4gc3R1YiB3aXRoIHRoZSBzZXJ2aWNlIGFuZCBvcGVyYXRpb25zCi0gICAgICAgICAqIEBwYXJhbSBzdHViIFRoZSBzdHViCi0gICAgICAgICAqIEBwYXJhbSBlbnYgZW52aXJvbm1lbnQgKCBtYW5kYXRvcnkpCi0gICAgICAgICAqLwotICAgICAgICB2b2lkIEFYSVMyX0NBTEwgCi0gICAgICAgIGF4aXMyX3N0dWJfcG9wdWxhdGVfc2VydmljZXNfZm9yXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc2VydmljZW5hbWUiLz4oIGF4aXMyX3N0dWJfdCAqc3R1YiwgY29uc3QgYXh1dGlsX2Vudl90ICplbnYpOwotICAgICAgICAvKioKLSAgICAgICAgICogYXhpczJfc3R1Yl9nZXRfZW5kcG9pbnRfdXJpX29mXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc2VydmljZW5hbWUiLz4KLSAgICAgICAgICogUmV0dXJuIHRoZSBlbmRwb2ludCBVUkkgcGlja2VkIGZyb20gV1NETAotICAgICAgICAgKiBAcGFyYW0gZW52IGVudmlyb25tZW50ICggbWFuZGF0b3J5KQotICAgICAgICAgKiBAcmV0dXJuIFRoZSBlbmRwb2ludCBwaWNrZWQgZnJvbSBXU0RMCi0gICAgICAgICAqLwotICAgICAgICBheGlzMl9jaGFyX3QqIEFYSVMyX0NBTEwKLSAgICAgICAgYXhpczJfc3R1Yl9nZXRfZW5kcG9pbnRfdXJpX29mXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc2VydmljZW5hbWUiLz4oY29uc3QgYXh1dGlsX2Vudl90ICplbnYpOwotCi0gICAgICAgIDx4c2w6aWYgdGVzdD0iJGlzU3luYz0nMSciPgotICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0ibWV0aG9kIj4KLSAgICAgICAgICA8eHNsOmlmIHRlc3Q9IkBtZXA9JzEwJyBvciBAbWVwPScxMiciPgotICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJvdXRwdXRvdXJzIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0ib3V0cHV0L3BhcmFtL0BvdXJzIj48L3hzbDp2YWx1ZS1vZj48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaXNVbndyYXBQYXJhbWV0ZXJzIiBzZWxlY3Q9ImlucHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keScgYW5kIEB0eXBlIT0nJ10vQHVud3JhcHBQYXJhbWV0ZXJzIi8+Ci0gICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im91dHB1dHR5cGUiPgotICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGlzVW53cmFwUGFyYW1ldGVycyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ib3V0cHV0L3BhcmFtL3BhcmFtL0B0eXBlIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJvdXRwdXQvcGFyYW0vQHR5cGUiPjwveHNsOnZhbHVlLW9mPjwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICA8L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgZnVuY3Rpb24gZGVjbGFyYXRpb24KLSAgICAgICAgICAgICAqIGZvciAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBxbmFtZSIvPiIgb3BlcmF0aW9uLgotICAgICAgICAgICAgICogQHBhcmFtIHN0dWIgVGhlIHN0dWIgKGF4aXMyX3N0dWJfdCkKLSAgICAgICAgICAgICAqIEBwYXJhbSBlbnYgZW52aXJvbm1lbnQgKCBtYW5kYXRvcnkpPHhzbDppZiB0ZXN0PSJub3QoJGlzVW53cmFwUGFyYW1ldGVycykiPjx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJpbnB1dC9wYXJhbVtAdHlwZSE9JyddIj48eHNsOnRleHQ+Ci0gICAgICAgICAgICAgPC94c2w6dGV4dD4qIEBwYXJhbSBfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+IG9mIHRoZSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz48L3hzbDpmb3ItZWFjaD48L3hzbDppZj4KLSAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IiRpc1Vud3JhcFBhcmFtZXRlcnMiPjx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJpbnB1dC9wYXJhbS9wYXJhbVtAdHlwZSE9JyddIj48eHNsOnRleHQ+Ci0gICAgICAgICAgICAgPC94c2w6dGV4dD4qIEBwYXJhbSBfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+IG9mIHRoZSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz48L3hzbDpmb3ItZWFjaD48L3hzbDppZj4KLSAgICAgICAgICAgICAqPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Im91dHB1dC9wYXJhbVtAbG9jYXRpb249J3NvYXBfaGVhZGVyJ10iPjx4c2w6dGV4dD4KLSAgICAgICAgICAgICA8L3hzbDp0ZXh0PiogQHBhcmFtIGRwXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPiAtIG91dHB1dCBoZWFkZXI8L3hzbDpmb3ItZWFjaD4KLSAgICAgICAgICAgICAqIEByZXR1cm4gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvdXRwdXR0eXBlIi8+Ci0gICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJpbnB1dHBhcmFtcyI+Ci0gICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRpc1Vud3JhcFBhcmFtZXRlcnMiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJpbnB1dC9wYXJhbS9wYXJhbVtAdHlwZSE9JyddIj4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPjx4c2w6dGV4dD4gXzwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iaW5wdXQvcGFyYW1bQHR5cGUhPScnXSI+LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz48eHNsOnRleHQ+IF88L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPgotICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICA8L3hzbDp2YXJpYWJsZT4KLQotICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG91dHB1dHR5cGU9JyciPmF4aXMyX3N0YXR1c190IEFYSVMyX0NBTEw8L3hzbDp3aGVuPgotICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRvdXRwdXR0eXBlIT0nJyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvdXRwdXR0eXBlIi8+IEFYSVMyX0NBTEw8L3hzbDp3aGVuPgotICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgPHhzbDp0ZXh0PiA8L3hzbDp0ZXh0PgotICAgICAgICAgICAgYXhpczJfc3R1Yl9vcF88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHNlcnZpY2VuYW1lIi8+Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjx4c2w6dGV4dD4oIGF4aXMyX3N0dWJfdCAqc3R1YiwgY29uc3QgYXh1dGlsX2Vudl90ICplbnY8L3hzbDp0ZXh0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW5wdXRwYXJhbXMiLz48eHNsOmZvci1lYWNoIHNlbGVjdD0ib3V0cHV0L3BhcmFtW0Bsb2NhdGlvbj0nc29hcF9oZWFkZXInXSI+LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im91dHB1dHR5cGUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPjx4c2w6aWYgdGVzdD0iQG91cnMiPio8L3hzbDppZj48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvdXRwdXR0eXBlIi8+PHhzbDp0ZXh0PiBkcF88L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjx4c2w6dGV4dD4gLyogb3V0cHV0IGhlYWRlciBkb3VibGUgcHRyKi88L3hzbDp0ZXh0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPik7Ci0gICAgICAgICAgPC94c2w6aWY+Ci0gICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgPC94c2w6aWY+ICA8IS0tY2xvc2UgZm9yICB0ZXN0PSIkaXNTeW5jPScxJy0tPgotCi0gICAgPCEtLSBBc3luYyBtZXRob2QgcHJvdG90eXBlIGdlbmVyYXRpb24gLS0+Ci0gICAgPHhzbDppZiB0ZXN0PSIkaXNBc3luYz0nMSciPgotICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJtZXRob2QiPgotICAgICAgICAKLSAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJtZXAiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbWVwIi8+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaXNVbndyYXBQYXJhbWV0ZXJzIiBzZWxlY3Q9ImlucHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keScgYW5kIEB0eXBlIT0nJ10vQHVud3JhcHBQYXJhbWV0ZXJzIi8+Ci0gICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ib3V0cHV0dHlwZSI+Ci0gICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGlzVW53cmFwUGFyYW1ldGVycyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im91dHB1dC9wYXJhbS9wYXJhbS9AdHlwZSIvPgotICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im91dHB1dC9wYXJhbS9AdHlwZSI+PC94c2w6dmFsdWUtb2Y+PC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICA8L3hzbDp2YXJpYWJsZT4KLQotICAgICAgICA8eHNsOmlmIHRlc3Q9IiRtZXA9JzEyJyI+Ci0KLSAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJpbnB1dHBhcmFtcyI+Ci0gICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkaXNVbndyYXBQYXJhbWV0ZXJzIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iaW5wdXQvcGFyYW0vcGFyYW1bQHR5cGUhPScnXSI+LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz48eHNsOnRleHQ+IF88L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPgotICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJpbnB1dC9wYXJhbVtAdHlwZSE9JyddIj4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPjx4c2w6dGV4dD4gXzwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgIDwveHNsOnZhcmlhYmxlPgotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBmdW5jdGlvbiBmb3IgYXN5bmNocm9ub3VzIGludm9jYXRpb25zCi0gICAgICAgICAqIGZvciAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBxbmFtZSIvPjx4c2w6dGV4dD4iIG9wZXJhdGlvbi4KLSAgICAgICAgICogQHBhcmFtIHN0dWIgVGhlIHN0dWIKLSAgICAgICAgICogQHBhcmFtIGVudiBlbnZpcm9ubWVudCAoIG1hbmRhdG9yeSk8L3hzbDp0ZXh0PgotICAgICAgICAgPCEtLSAgc2VsZWN0IG9ubHkgdGhlIGJvZHkgcGFyYW1ldGVycyAgLS0+Ci0gICAgICAgICA8eHNsOmlmIHRlc3Q9Im5vdCgkaXNVbndyYXBQYXJhbWV0ZXJzKSI+PHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImlucHV0L3BhcmFtW0B0eXBlIT0nJ10iPjx4c2w6dGV4dD4KLSAgICAgICAgICogQHBhcmFtIF88L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPiBvZiB0aGUgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+PC94c2w6Zm9yLWVhY2g+PC94c2w6aWY+Ci0gICAgICAgICA8eHNsOmlmIHRlc3Q9IiRpc1Vud3JhcFBhcmFtZXRlcnMiPjx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJpbnB1dC9wYXJhbS9wYXJhbVtAdHlwZSE9JyddIj48eHNsOnRleHQ+Ci0gICAgICAgICAqIEBwYXJhbSBfPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4gb2YgdGhlIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPjwveHNsOmZvci1lYWNoPjwveHNsOmlmPgotICAgICAgICAgKiBAcGFyYW0gdXNlcl9kYXRhIHVzZXIgZGF0YSB0byBiZSBhY2Nlc3NlZCBieSB0aGUgY2FsbGJhY2tzCi0gICAgICAgICAqIEBwYXJhbSBvbl9jb21wbGV0ZSBjYWxsYmFjayB0byBoYW5kbGUgb24gY29tcGxldGUKLSAgICAgICAgICogQHBhcmFtIG9uX2Vycm9yIGNhbGxiYWNrIHRvIGhhbmRsZSBvbiBlcnJvcgotICAgICAgICAgKi8KLQotCi0gICAgICAgIHZvaWQgQVhJUzJfQ0FMTAotICAgICAgICBheGlzMl9zdHViX3N0YXJ0X29wXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc2VydmljZW5hbWUiLz5fPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+KCBheGlzMl9zdHViX3QgKnN0dWIsIGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbnB1dHBhcmFtcyIvPiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzMl9zdGF0dXNfdCAoIEFYSVMyX0NBTEwgKm9uX2NvbXBsZXRlICkgKGNvbnN0IGF4dXRpbF9lbnZfdCAqLCA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG91dHB1dHR5cGUiLz48eHNsOnRleHQ+IF88L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJvdXRwdXQvcGFyYW0vQG5hbWUiLz48eHNsOmZvci1lYWNoIHNlbGVjdD0ib3V0cHV0L3BhcmFtW0Bsb2NhdGlvbj0nc29hcF9oZWFkZXInXSI+LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJoZWFkZXJfb3V0cHV0dHlwZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGhlYWRlcl9vdXRwdXR0eXBlIi8+PHhzbDp0ZXh0PiBfPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPiwgdm9pZCAqZGF0YSkgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzMl9zdGF0dXNfdCAoIEFYSVMyX0NBTEwgKm9uX2Vycm9yICkgKGNvbnN0IGF4dXRpbF9lbnZfdCAqLCBpbnQgZXhjZXB0aW9uLCB2b2lkICpkYXRhKSApOwotCi0gICAgICAgIDwveHNsOmlmPiAgPCEtLWNsb3NlIGZvciAgdGVzdD0iJG1lcD0naHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC93c2RsL2luLW91dCciLS0+Ci0gICAgICAgIDwveHNsOmZvci1lYWNoPgotICAgICAgICA8L3hzbDppZj4gIDwhLS1jbG9zZSBmb3IgIHRlc3Q9IiRpc0FzeW5jPScxJy0tPgotCi0gICAgIDx4c2w6aWYgdGVzdD0ibWV0aG9kL2lucHV0L3BhcmFtW0Bsb2NhdGlvbj0nc29hcF9oZWFkZXInXSI+Ci0gICAgICAvKioKLSAgICAgICAqIGZ1bmN0aW9uIHRvIGZyZWUgYW55IHNvYXAgaW5wdXQgaGVhZGVycyAKLSAgICAgICAqIEBwYXJhbSBlbnYgZW52aXJvbm1lbnQgKCBtYW5kYXRvcnkpCi0gICAgICAgKi8KLSAgICAgPC94c2w6aWY+Ci0gICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJtZXRob2QiPgotICAgICAgICA8eHNsOmlmIHRlc3Q9ImlucHV0L3BhcmFtW0Bsb2NhdGlvbj0nc29hcF9oZWFkZXInXSI+Ci0gICAgICAgICB2b2lkIEFYSVMyX0NBTEwKLSAgICAgICAgIGF4aXMyX3N0dWJfb3BfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzZXJ2aWNlbmFtZSIvPl88eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz5fZnJlZV9pbnB1dF9oZWFkZXJzKGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52LCA8eHNsOmZvci1lYWNoIHNlbGVjdD0iaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdzb2FwX2hlYWRlciddIj48eHNsOmlmIHRlc3Q9InBvc2l0aW9uKCkhPTEiPiw8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImlucHV0dHlwZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbnB1dHR5cGUiLz48eHNsOnRleHQ+IF88L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPik7Ci0gICAgICAgIDwveHNsOmlmPgotICAgIDwveHNsOmZvci1lYWNoPgotCi0gICAgIDx4c2w6aWYgdGVzdD0ibWV0aG9kL291dHB1dC9wYXJhbVtAbG9jYXRpb249J3NvYXBfaGVhZGVyJ10iPgotICAgICAgLyoqCi0gICAgICAgKiBmdW5jdGlvbiB0byBmcmVlIGFueSBzb2FwIG91dHB1dCBoZWFkZXJzIAotICAgICAgICogQHBhcmFtIGVudiBlbnZpcm9ubWVudCAoIG1hbmRhdG9yeSkKLSAgICAgICAqLwotICAgICA8L3hzbDppZj4KLSAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Im1ldGhvZCI+Ci0gICAgICAgIDx4c2w6aWYgdGVzdD0ib3V0cHV0L3BhcmFtW0Bsb2NhdGlvbj0nc29hcF9oZWFkZXInXSI+Ci0gICAgICAgICB2b2lkIEFYSVMyX0NBTEwKLSAgICAgICAgIGF4aXMyX3N0dWJfb3BfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzZXJ2aWNlbmFtZSIvPl88eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz5fZnJlZV9vdXRwdXRfaGVhZGVycyhjb25zdCBheHV0aWxfZW52X3QgKmVudiwgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Im91dHB1dC9wYXJhbVtAbG9jYXRpb249J3NvYXBfaGVhZGVyJ10iPjx4c2w6aWYgdGVzdD0icG9zaXRpb24oKSE9MSI+LDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ib3V0cHV0dHlwZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvdXRwdXR0eXBlIi8+PHhzbDp0ZXh0PiBfPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4pOwotICAgICAgICA8L3hzbDppZj4KLSAgICA8L3hzbDpmb3ItZWFjaD4KLQotCSNpZmRlZiBfX2NwbHVzcGx1cwotCX0KLQkjZW5kaWYKLSAgIDwveHNsOnRlbXBsYXRlPgotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC90ZW1wbGF0ZS9jL1N0dWJTb3VyY2VUZW1wbGF0ZS54c2wgYi92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdGVtcGxhdGUvYy9TdHViU291cmNlVGVtcGxhdGUueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjc3YTkxLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC90ZW1wbGF0ZS9jL1N0dWJTb3VyY2VUZW1wbGF0ZS54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwxMTc3ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iPgotICAgIDx4c2w6b3V0cHV0IG1ldGhvZD0idGV4dCIvPgotCi0gICAgCi0gICAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iL2NsYXNzIj4KLSAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaW50ZXJmYWNlTmFtZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBpbnRlcmZhY2VOYW1lIi8+PC94c2w6dmFyaWFibGU+Ci0gICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InBhY2thZ2UiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAcGFja2FnZSIvPjwveHNsOnZhcmlhYmxlPgotICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJpc1N5bmMiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAaXNTeW5jIi8+PC94c2w6dmFyaWFibGU+Ci0gICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImlzQXN5bmMiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAaXNBc3luYyIvPjwveHNsOnZhcmlhYmxlPgotICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJzb2FwVmVyc2lvbiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBzb2FwLXZlcnNpb24iLz48L3hzbDp2YXJpYWJsZT4KLSAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iY2FsbGJhY2tuYW1lIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGNhbGxiYWNrbmFtZSIvPjwveHNsOnZhcmlhYmxlPgotICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJtZXRob2QtcHJlZml4Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHByZWZpeCIvPjwveHNsOnZhcmlhYmxlPiA8IS0tIFRoaXMgaXMgbm8gbG9uZ2VyIHVzaW5nIC0tPgotICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJxbmFtZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBxbmFtZSIvPjwveHNsOnZhcmlhYmxlPgotICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJzZXJ2aWNlbmFtZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBzZXJ2aWNlbmFtZSIvPjwveHNsOnZhcmlhYmxlPgotCi0gICAgICAvKioKLSAgICAgICAqIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPi5jCi0gICAgICAgKgotICAgICAgICogVGhpcyBmaWxlIHdhcyBhdXRvLWdlbmVyYXRlZCBmcm9tIFdTREwgZm9yICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHFuYW1lIi8+IiBzZXJ2aWNlCi0gICAgICAgKiBieSB0aGUgQXBhY2hlIEF4aXMyL0phdmEgdmVyc2lvbjogI2F4aXNWZXJzaW9uIyAjdG9kYXkjCi0gICAgICAgKi8KLQotICAgICAgI2luY2x1ZGUgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPi5oIgotICAgICAgI2luY2x1ZGUgJmx0O2F4aXMyX21zZy5oJmd0OwotICAgICAgI2luY2x1ZGUgJmx0O2F4aXMyX3BvbGljeV9pbmNsdWRlLmgmZ3Q7Ci0gICAgICAjaW5jbHVkZSAmbHQ7bmVldGhpX2VuZ2luZS5oJmd0OwotCi0KLSAgICAgIC8qKgotICAgICAgICogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+IEMgaW1wbGVtZW50YXRpb24KLSAgICAgICAqLwotCi0gICAgICBheGlzMl9zdHViX3QqIEFYSVMyX0NBTEwKLSAgICAgIGF4aXMyX3N0dWJfY3JlYXRlXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc2VydmljZW5hbWUiLz4oY29uc3QgYXh1dGlsX2Vudl90ICplbnYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF4aXMyX2NoYXJfdCAqY2xpZW50X2hvbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF4aXMyX2NoYXJfdCAqZW5kcG9pbnRfdXJpKQotICAgICAgewotICAgICAgICAgYXhpczJfc3R1Yl90ICpzdHViID0gTlVMTDsKLSAgICAgICAgIGF4aXMyX2VuZHBvaW50X3JlZl90ICplbmRwb2ludF9yZWYgPSBOVUxMOwotICAgICAgICAgQVhJUzJfRlVOQ19QQVJBTV9DSEVDSyAoY2xpZW50X2hvbWUsIGVudiwgTlVMTCkKLQotICAgICAgICAgaWYgKE5VTEwgPT0gZW5kcG9pbnRfdXJpKQotICAgICAgICAgewotICAgICAgICAgICAgZW5kcG9pbnRfdXJpID0gYXhpczJfc3R1Yl9nZXRfZW5kcG9pbnRfdXJpX29mXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc2VydmljZW5hbWUiLz4oZW52KTsKLSAgICAgICAgIH0KLQotICAgICAgICAgZW5kcG9pbnRfcmVmID0gYXhpczJfZW5kcG9pbnRfcmVmX2NyZWF0ZShlbnYsIGVuZHBvaW50X3VyaSk7Ci0KLSAgICAgICAgIHN0dWIgPSBheGlzMl9zdHViX2NyZWF0ZV93aXRoX2VuZHBvaW50X3JlZl9hbmRfY2xpZW50X2hvbWUgKGVudiwgZW5kcG9pbnRfcmVmLCBjbGllbnRfaG9tZSk7Ci0KLSAgICAgICAgIGlmIChOVUxMID09IHN0dWIpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBpZihOVUxMICE9IGVuZHBvaW50X3JlZikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBheGlzMl9lbmRwb2ludF9yZWZfZnJlZShlbmRwb2ludF9yZWYsIGVudik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgIH0KLQotCi0gICAgICAgICBheGlzMl9zdHViX3BvcHVsYXRlX3NlcnZpY2VzX2Zvcl88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHNlcnZpY2VuYW1lIi8+KHN0dWIsIGVudik7Ci0gICAgICAgICByZXR1cm4gc3R1YjsKLSAgICAgIH0KLQotCi0gICAgICB2b2lkIEFYSVMyX0NBTEwKLSAgICAgIGF4aXMyX3N0dWJfcG9wdWxhdGVfc2VydmljZXNfZm9yXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc2VydmljZW5hbWUiLz4oYXhpczJfc3R1Yl90ICpzdHViLCBjb25zdCBheHV0aWxfZW52X3QgKmVudikKLSAgICAgIHsKLSAgICAgICAgIGF4aXMyX3N2Y19jbGllbnRfdCAqc3ZjX2NsaWVudCA9IE5VTEw7Ci0gICAgICAgICBheHV0aWxfcW5hbWVfdCAqc3ZjX3FuYW1lID0gIE5VTEw7Ci0gICAgICAgICBheHV0aWxfcW5hbWVfdCAqb3BfcW5hbWUgPSAgTlVMTDsKLSAgICAgICAgIGF4aXMyX3N2Y190ICpzdmMgPSBOVUxMOwotICAgICAgICAgYXhpczJfb3BfdCAqb3AgPSBOVUxMOwotICAgICAgICAgYXhpczJfb3BfdCAqYW5ub25fb3AgPSBOVUxMOwotICAgICAgICAgYXhpczJfbXNnX3QgKm1zZ19vdXQgPSBOVUxMOwotICAgICAgICAgYXhpczJfbXNnX3QgKm1zZ19pbiA9IE5VTEw7Ci0gICAgICAgICBheGlzMl9tc2dfdCAqbXNnX291dF9mYXVsdCA9IE5VTEw7Ci0gICAgICAgICBheGlzMl9tc2dfdCAqbXNnX2luX2ZhdWx0ID0gTlVMTDsKLSAgICAgICAgIGF4aXMyX3BvbGljeV9pbmNsdWRlX3QgKnBvbGljeV9pbmNsdWRlID0gTlVMTDsKLQotICAgICAgICAgYXhpczJfZGVzY190ICpkZXNjID0gTlVMTDsKLSAgICAgICAgIGF4aW9tX25vZGVfdCAqcG9saWN5X25vZGUgPSBOVUxMOwotICAgICAgICAgYXhpb21fZWxlbWVudF90ICpwb2xpY3lfcm9vdF9lbGUgPSBOVUxMOwotICAgICAgICAgbmVldGhpX3BvbGljeV90ICpuZWV0aGlfcG9saWN5ID0gTlVMTDsKLSAgICAgICAgIGF4aXMyX3N0YXR1c190IHN0YXR1czsKLQotICAgICAgICAgLyogTW9kaWZ5aW5nIHRoZSBTZXJ2aWNlICovCi0gICAgICAgICBzdmNfY2xpZW50ID0gYXhpczJfc3R1Yl9nZXRfc3ZjX2NsaWVudCAoc3R1YiwgZW52ICk7Ci0gICAgICAgICBzdmMgPSAoYXhpczJfc3ZjX3QqKWF4aXMyX3N2Y19jbGllbnRfZ2V0X3N2Yyggc3ZjX2NsaWVudCwgZW52ICk7Ci0KLSAgICAgICAgIGFubm9uX29wID0gYXhpczJfc3ZjX2dldF9vcF93aXRoX25hbWUoc3ZjLCBlbnYsIEFYSVMyX0FOT05fT1VUX0lOX09QKTsKLSAgICAgICAgIG1zZ19vdXQgPSBheGlzMl9vcF9nZXRfbXNnKGFubm9uX29wLCBlbnYsIEFYSVMyX01TR19PVVQpOwotICAgICAgICAgbXNnX2luID0gYXhpczJfb3BfZ2V0X21zZyhhbm5vbl9vcCwgZW52LCBBWElTMl9NU0dfSU4pOwotICAgICAgICAgbXNnX291dF9mYXVsdCA9IGF4aXMyX29wX2dldF9tc2coYW5ub25fb3AsIGVudiwgQVhJUzJfTVNHX09VVF9GQVVMVCk7Ci0gICAgICAgICBtc2dfaW5fZmF1bHQgPSBheGlzMl9vcF9nZXRfbXNnKGFubm9uX29wLCBlbnYsIEFYSVMyX01TR19JTl9GQVVMVCk7Ci0KLSAgICAgICAgIHN2Y19xbmFtZSA9IGF4dXRpbF9xbmFtZV9jcmVhdGUoZW52LCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHNlcnZpY2VuYW1lIi8+IiAsTlVMTCwgTlVMTCk7Ci0gICAgICAgICBheGlzMl9zdmNfc2V0X3FuYW1lIChzdmMsIGVudiwgc3ZjX3FuYW1lKTsKLQkJIGF4dXRpbF9xbmFtZV9mcmVlKHN2Y19xbmFtZSxlbnYpOwotCi0gICAgICAgICAvKiBjcmVhdGluZyB0aGUgb3BlcmF0aW9ucyovCi0KLSAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJtZXRob2QiPgotICAgICAgICAgICBvcF9xbmFtZSA9IGF4dXRpbF9xbmFtZV9jcmVhdGUoZW52LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsb2NhbHBhcnQiLz4iICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZXNwYWNlIi8+IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7Ci0gICAgICAgICAgIG9wID0gYXhpczJfb3BfY3JlYXRlX3dpdGhfcW5hbWUoZW52LCBvcF9xbmFtZSk7Ci0gICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAbWVwPScxMCciPgotICAgICAgICAgICAgICAgYXhpczJfb3Bfc2V0X21zZ19leGNoYW5nZV9wYXR0ZXJuKG9wLCBlbnYsIEFYSVMyX01FUF9VUklfT1VUX09OTFkpOwotICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICBheGlzMl9vcF9zZXRfbXNnX2V4Y2hhbmdlX3BhdHRlcm4ob3AsIGVudiwgQVhJUzJfTUVQX1VSSV9PVVRfSU4pOwotICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICBheGlzMl9tc2dfaW5jcmVtZW50X3JlZihtc2dfb3V0LCBlbnYpOwotICAgICAgICAgICBheGlzMl9tc2dfaW5jcmVtZW50X3JlZihtc2dfaW4sIGVudik7Ci0gICAgICAgICAgIGF4aXMyX21zZ19pbmNyZW1lbnRfcmVmKG1zZ19vdXRfZmF1bHQsIGVudik7Ci0gICAgICAgICAgIGF4aXMyX21zZ19pbmNyZW1lbnRfcmVmKG1zZ19pbl9mYXVsdCwgZW52KTsKLSAgICAgICAgICAgYXhpczJfb3BfYWRkX21zZyhvcCwgZW52LCBBWElTMl9NU0dfT1VULCBtc2dfb3V0KTsKLSAgICAgICAgICAgYXhpczJfb3BfYWRkX21zZyhvcCwgZW52LCBBWElTMl9NU0dfSU4sIG1zZ19pbik7Ci0gICAgICAgICAgIGF4aXMyX29wX2FkZF9tc2cob3AsIGVudiwgQVhJUzJfTVNHX09VVF9GQVVMVCwgbXNnX291dF9mYXVsdCk7Ci0gICAgICAgICAgIGF4aXMyX29wX2FkZF9tc2cob3AsIGVudiwgQVhJUzJfTVNHX0lOX0ZBVUxULCBtc2dfaW5fZmF1bHQpOwotICAgICAgIAotICAgICAgICAgICA8eHNsOmlmIHRlc3Q9ImlucHV0L0Bwb2xpY3kiPgotICAgICAgICAgICAvKiBhZGRpbmcgdGhlIGlucHV0IHBvbGljaWVzICovCi0KLSAgICAgICAgICAgcG9saWN5X25vZGUgPSBheGlvbV9ub2RlX2NyZWF0ZV9mcm9tX2J1ZmZlcihlbnYsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iaW5wdXQvQHBvbGljeSIvPiIpOwotICAgICAgICAgICBwb2xpY3lfcm9vdF9lbGUgPSAoYXhpb21fZWxlbWVudF90ICopIGF4aW9tX25vZGVfZ2V0X2RhdGFfZWxlbWVudCAocG9saWN5X25vZGUsIGVudik7Ci0KLSAgICAgICAgICAgbmVldGhpX3BvbGljeSA9IG5lZXRoaV9lbmdpbmVfZ2V0X3BvbGljeSAoZW52LCBwb2xpY3lfbm9kZSwgcG9saWN5X3Jvb3RfZWxlKTsKLSAgICAgICAgICAgc3RhdHVzID0gYXhpczJfc3ZjX2NsaWVudF9zZXRfcG9saWN5KHN2Y19jbGllbnQsIGVudiwgbmVldGhpX3BvbGljeSk7Ci0KLSAgICAgICAgICAgaWYoc3RhdHVzID09IEFYSVMyX0ZBSUxVUkUpCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBBWElTMl9FUlJPUl9TRVQoZW52LT5lcnJvciwgQVhJUzJfRVJST1JfSU5WQUxJRF9OVUxMX1BBUkFNLCBBWElTMl9GQUlMVVJFKTsKLSAgICAgICAgICAgICAgICBBWElTMl9MT0dfRVJST1IoZW52LT5sb2csIEFYSVMyX0xPR19TSSwgIm5lZXRoaSBwb2xpY3kgc2V0dGluZyBmYWlsZWQiKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgIH0KLQotICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgYXhpczJfc3ZjX2FkZF9vcChzdmMsIGVudiwgb3ApOwotICAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgICB9Ci0KLSAgICAgIC8qKgotICAgICAgICpyZXR1cm4gZW5kIHBvaW50IHBpY2tlZCBmcm9tIHdzZGwKLSAgICAgICAqLwotICAgICAgYXhpczJfY2hhcl90KiBBWElTMl9DQUxMCi0gICAgICBheGlzMl9zdHViX2dldF9lbmRwb2ludF91cmlfb2ZfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzZXJ2aWNlbmFtZSIvPiggY29uc3QgYXh1dGlsX2Vudl90ICplbnYgKQotICAgICAgewotICAgICAgICBheGlzMl9jaGFyX3QgKmVuZHBvaW50X3VyaSA9IE5VTEw7Ci0gICAgICAgIC8qIHNldCB0aGUgYWRkcmVzcyBmcm9tIGhlcmUgKi8KLSAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImVuZHBvaW50Ij4KLSAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJwb3NpdGlvbigpPTEiPgotICAgICAgICAgICAgICBlbmRwb2ludF91cmkgPSAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4iLz4iOwotICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICAgICAgcmV0dXJuIGVuZHBvaW50X3VyaTsKLSAgICAgIH0KLQotCi0gIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJtZXRob2QiPgotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ib3V0cHV0b3VycyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im91dHB1dC9wYXJhbS9Ab3VycyI+PC94c2w6dmFsdWUtb2Y+PC94c2w6dmFyaWFibGU+Ci0gICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJpc1Vud3JhcFBhcmFtZXRlcnMiIHNlbGVjdD0iaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdib2R5JyBhbmQgQHR5cGUhPScnXS9AdW53cmFwcFBhcmFtZXRlcnMiLz4KLSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im91dHB1dHR5cGUiPgotICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkaXNVbndyYXBQYXJhbWV0ZXJzIj4KLSAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im91dHB1dC9wYXJhbS9wYXJhbS9AdHlwZSIvPgotICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJvdXRwdXQvcGFyYW0vQHR5cGUiPjwveHNsOnZhbHVlLW9mPjwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgIDwveHNsOnZhcmlhYmxlPgotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iY2Fwcy1vdXRwdXR0eXBlIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0ib3V0cHV0L3BhcmFtL0BjYXBzLXR5cGUiPjwveHNsOnZhbHVlLW9mPjwveHNsOnZhcmlhYmxlPgotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ic3R5bGUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAc3R5bGUiPjwveHNsOnZhbHVlLW9mPjwveHNsOnZhcmlhYmxlPgotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ic29hcEFjdGlvbiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBzb2FwYWN0aW9uIj48L3hzbDp2YWx1ZS1vZj48L3hzbDp2YXJpYWJsZT4KLSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im1lcCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBtZXAiLz48L3hzbDp2YXJpYWJsZT4KLQotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ibWV0aG9kLW5hbWUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwveHNsOnZhcmlhYmxlPgotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ibWV0aG9kLW5zIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWVzcGFjZSIvPiA8L3hzbDp2YXJpYWJsZT4KLQotICAgIDwhLS0gQ29kZSBnZW5lcmF0aW9uIGZvciB0aGUgaW4tb3V0IG1lcCAtLT4KLSAgICA8eHNsOmlmIHRlc3Q9IiRtZXA9JzEyJyI+Ci0gICAgICA8eHNsOmlmIHRlc3Q9IiRpc1N5bmM9JzEnIj4KLSAgICAgICAgIC8qKgotICAgICAgICAgICogYXV0byBnZW5lcmF0ZWQgbWV0aG9kIHNpZ25hdHVyZQotICAgICAgICAgICogZm9yICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHFuYW1lIi8+IiBvcGVyYXRpb24uCi0gICAgICAgICAgKiBAcGFyYW0gc3R1YiBUaGUgc3R1YiAoYXhpczJfc3R1Yl90KQotICAgICAgICAgICogQHBhcmFtIGVudiBlbnZpcm9ubWVudCAoIG1hbmRhdG9yeSk8eHNsOmlmIHRlc3Q9Im5vdCgkaXNVbndyYXBQYXJhbWV0ZXJzKSI+PHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImlucHV0L3BhcmFtW0B0eXBlIT0nJ10iPjx4c2w6dGV4dD4KLSAgICAgICAgICA8L3hzbDp0ZXh0PiogQHBhcmFtIF88eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4gb2YgdGhlIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPjwveHNsOmZvci1lYWNoPjwveHNsOmlmPgotICAgICAgICAgIDx4c2w6aWYgdGVzdD0iJGlzVW53cmFwUGFyYW1ldGVycyI+PHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImlucHV0L3BhcmFtL3BhcmFtW0B0eXBlIT0nJ10iPjx4c2w6dGV4dD4KLSAgICAgICAgICA8L3hzbDp0ZXh0PiogQHBhcmFtIF88eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4gb2YgdGhlIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPjwveHNsOmZvci1lYWNoPjwveHNsOmlmPgotICAgICAgICAgICo8eHNsOmZvci1lYWNoIHNlbGVjdD0ib3V0cHV0L3BhcmFtW0Bsb2NhdGlvbj0nc29hcF9oZWFkZXInXSI+PHhzbDp0ZXh0PgotICAgICAgICAgIDwveHNsOnRleHQ+KiBAcGFyYW0gZHBfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+IC0gb3V0cHV0IGhlYWRlcjwveHNsOmZvci1lYWNoPgotICAgICAgICAgICogQHJldHVybiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG91dHB1dHR5cGUiLz4KLSAgICAgICAgICAqLwotCi0gICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImlucHV0cGFyYW1zIj4KLSAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGlzVW53cmFwUGFyYW1ldGVycyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImlucHV0L3BhcmFtL3BhcmFtW0B0eXBlIT0nJ10iPiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+PHhzbDp0ZXh0PiBfPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJpbnB1dC9wYXJhbVtAdHlwZSE9JyddIj4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPjx4c2w6dGV4dD4gXzwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgIDwveHNsOnZhcmlhYmxlPgotCi0gICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkb3V0cHV0dHlwZT0nJyI+dm9pZCBBWElTMl9DQUxMPC94c2w6d2hlbj4gPCEtLXRoaXMgY2FzZSBpcyB1bmV4cGVjdGVkLS0+Ci0gICAgICAgICA8eHNsOm90aGVyd2lzZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG91dHB1dHR5cGUiLz4gQVhJUzJfQ0FMTDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgIDx4c2w6dGV4dD4gPC94c2w6dGV4dD4KLSAgICAgICAgIGF4aXMyX3N0dWJfb3BfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzZXJ2aWNlbmFtZSIvPl88eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48eHNsOnRleHQ+KCBheGlzMl9zdHViX3QgKnN0dWIsIGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52PC94c2w6dGV4dD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGlucHV0cGFyYW1zIi8+PHhzbDpmb3ItZWFjaCBzZWxlY3Q9Im91dHB1dC9wYXJhbVtAbG9jYXRpb249J3NvYXBfaGVhZGVyJ10iPiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im91dHB1dHR5cGUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPjx4c2w6aWYgdGVzdD0iQG91cnMiPio8L3hzbDppZj48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG91dHB1dHR5cGUiLz48eHNsOnRleHQ+IGRwXzwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PHhzbDp0ZXh0PiAvKiBvdXRwdXQgaGVhZGVyIGRvdWJsZSBwdHIqLzwveHNsOnRleHQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+KQotICAgICAgICAgewotICAgICAgICAgICAgYXhpczJfc3ZjX2NsaWVudF90ICpzdmNfY2xpZW50ID0gTlVMTDsKLSAgICAgICAgICAgIGF4aXMyX29wdGlvbnNfdCAqb3B0aW9ucyA9IE5VTEw7Ci0gICAgICAgICAgICBheGlvbV9ub2RlX3QgKnJldF9ub2RlID0gTlVMTDsKLQotICAgICAgICAgICAgY29uc3QgYXhpczJfY2hhcl90ICpzb2FwX2FjdGlvbiA9IE5VTEw7Ci0gICAgICAgICAgICBheHV0aWxfcW5hbWVfdCAqb3BfcW5hbWUgPSAgTlVMTDsKLSAgICAgICAgICAgIGF4aW9tX25vZGVfdCAqcGF5bG9hZCA9IE5VTEw7Ci0gICAgICAgICAgICBheGlzMl9ib29sX3QgaXNfc29hcF9hY3Rfc2V0ID0gQVhJUzJfVFJVRTsKLSAgICAgICAgICAgIGF4dXRpbF9zdHJpbmdfdCAqc29hcF9hY3QgPSBOVUxMOwotCi0gICAgICAgICAgICA8eHNsOmlmIHRlc3Q9Im91dHB1dC9wYXJhbS9Ab3VycyI+Ci0gICAgICAgICAgIAkgICAgPCEtLSB0aGlzIG1lYW5zIGRhdGEgYmluZGluZyBpcyBlbmFibGUgLS0+Ci0gICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im91dHB1dC9wYXJhbS9AdHlwZSIvPiByZXRfdmFsOwotICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICA8eHNsOmlmIHRlc3Q9ImlucHV0L3BhcmFtW0Bsb2NhdGlvbj0nc29hcF9oZWFkZXInXSI+Ci0gICAgICAgICAgICAgICAgYXhpb21fbm9kZV90ICppbnB1dF9oZWFkZXIgPSBOVUxMOwotICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICA8eHNsOmlmIHRlc3Q9Im91dHB1dC9wYXJhbVtAbG9jYXRpb249J3NvYXBfaGVhZGVyJ10iPgotICAgICAgICAgICAgICAgIGF4aXMyX29wX2NsaWVudF90ICpvcF9jbGllbnQgPSBOVUxMOwotICAgICAgICAgICAgICAgIGNvbnN0IGF4aXMyX21zZ19jdHhfdCAqbXNnX2N0eCA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgYXhpb21fc29hcF9lbnZlbG9wZV90ICpyZXNfc29hcF9lbnYgPSBOVUxMOwotICAgICAgICAgICAgICAgIGF4aW9tX3NvYXBfaGVhZGVyX3QgKnJlc19zb2FwX2hlYWRlciA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgYXhpb21fbm9kZV90ICpoZWFkZXJfYmFzZV9ub2RlID0gTlVMTDsKLSAgICAgICAgICAgICAgICBheGlvbV9ub2RlX3QgKm91dHB1dF9oZWFkZXIgPSBOVUxMOwotICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0ib3V0cHV0L3BhcmFtW0Bsb2NhdGlvbj0nc29hcF9oZWFkZXInXSI+Ci0gICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+PHhzbDp0ZXh0PiBfPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4gPSBOVUxMOwotICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0KLSAgICAgICAgICAgIDwhLS0gZm9yIHNlcnZpY2UgY2xpZW50IHRoZSAxc3QgaW5wdXQgcGFyYW0gaXMgdGhlIHBheWxvYWQgLS0+Ci0gICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImZpcnN0UGFyYW0iIHNlbGVjdD0iaW5wdXQvcGFyYW1bMV0iLz4KLQotCi0gICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IiRmaXJzdFBhcmFtL0B0eXBlIT0nJyI+Ci0gICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGZpcnN0UGFyYW0vQG91cnMiPgotICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gZ2VuZXJhdGUgZm9yIHVud3JhcHBlZCBtb2RlIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRpc1Vud3JhcFBhcmFtZXRlcnMiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9IndyYXBwZXJfYWRiX29iaiI+d3JhcHBlcl9hZGJfb2JqPC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRmaXJzdFBhcmFtL0B0eXBlIi8+PHhzbDp0ZXh0PiA8L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkd3JhcHBlcl9hZGJfb2JqIi8+ID0gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1iZWZvcmUoJGZpcnN0UGFyYW0vQHR5cGUsICdfdConKSIvPjx4c2w6dGV4dD5fY3JlYXRlX3dpdGhfdmFsdWVzKGVudjwveHNsOnRleHQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9ImlucHV0L3BhcmFtL0Bjb21wbGV4dHlwZSI+LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1iZWZvcmUoaW5wdXQvcGFyYW0vQGNvbXBsZXh0eXBlLCAnX3QqJykiLz48eHNsOnRleHQ+X2NyZWF0ZV93aXRoX3ZhbHVlcyhlbnY8L3hzbDp0ZXh0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+PHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRmaXJzdFBhcmFtL3BhcmFtW0B0eXBlIT0nJ10iPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dGV4dD4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXzwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPjx4c2w6aWYgdGVzdD0iaW5wdXQvcGFyYW0vQGNvbXBsZXh0eXBlIj4pPC94c2w6aWY+KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQgPSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3Vic3RyaW5nLWJlZm9yZSgkZmlyc3RQYXJhbS9AdHlwZSwgJ190KicpIi8+X3NlcmlhbGl6ZSg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHdyYXBwZXJfYWRiX29iaiIvPiwgZW52LCBOVUxMLCBOVUxMLCBBWElTMl9UUlVFLCBOVUxMLCBOVUxMKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQgPSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3Vic3RyaW5nLWJlZm9yZSgkZmlyc3RQYXJhbS9AdHlwZSwgJ190KicpIi8+X3NlcmlhbGl6ZShfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRmaXJzdFBhcmFtL0BuYW1lIi8+LCBlbnYsIE5VTEwsIE5VTEwsIEFYSVMyX1RSVUUsIE5VTEwsIE5VTEwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZCA9IF88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGZpcnN0UGFyYW0vQG5hbWUiLz47Ci0gICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICBzdmNfY2xpZW50ID0gYXhpczJfc3R1Yl9nZXRfc3ZjX2NsaWVudChzdHViLCBlbnYgKTsKLSAgICAgICAgICAgIDwhLS0gaGFuZGxpbmcgaGVhZGVyIHBhcmFtcyAtLT4KLSAgICAgICAgICAgCi0gICAgICAgICAgICA8IS0tIGFkZGluZyBpbnB1dCBoZWFkZXJzIC0tPgotICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImlucHV0L3BhcmFtW0Bsb2NhdGlvbj0nc29hcF9oZWFkZXInXSI+Ci0gICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBvdXJzIj4KLSAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgIDwhLS0gZ2VuZXJhdGUgZm9yIHVud3JhcHBlZCBtb2RlIC0tPgotICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkaXNVbndyYXBQYXJhbWV0ZXJzIj4KLSAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9IndyYXBwZXJfYWRiX29iaiI+d3JhcHBlcl9hZGJfb2JqPC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0id3JhcHBlcl90eXBlIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz48L3hzbDp2YXJpYWJsZT4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR3cmFwcGVyX3R5cGUiLz48eHNsOnRleHQ+IDwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR3cmFwcGVyX2FkYl9vYmoiLz4gPSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3Vic3RyaW5nLWJlZm9yZSgkd3JhcHBlcl90eXBlLCAnX3QqJykiLz48eHNsOnRleHQ+X2NyZWF0ZV93aXRoX3ZhbHVlcyhlbnY8L3hzbDp0ZXh0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IkBjb21wbGV4dHlwZSI+LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3Vic3RyaW5nLWJlZm9yZShAY29tcGxleHR5cGUsICdfdConKSIvPjx4c2w6dGV4dD5fY3JlYXRlX3dpdGhfdmFsdWVzKGVudjwveHNsOnRleHQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj48eHNsOmZvci1lYWNoIHNlbGVjdD0icGFyYW1bQHR5cGUhPScnXSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dGV4dD4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF88L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+PHhzbDppZiB0ZXN0PSJAY29tcGxleHR5cGUiPik8L3hzbDppZj4pOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0X2hlYWRlciA9IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzdWJzdHJpbmctYmVmb3JlKCR3cmFwcGVyX3R5cGUsICdfdConKSIvPl9zZXJpYWxpemUoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR3cmFwcGVyX2FkYl9vYmoiLz4sIGVudiwgTlVMTCwgTlVMTCwgQVhJUzJfVFJVRSwgTlVMTCwgTlVMTCk7Ci0gICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dF9oZWFkZXIgPSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3Vic3RyaW5nLWJlZm9yZShAdHlwZSwgJ190KicpIi8+X3NlcmlhbGl6ZShfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+LCBlbnYsIE5VTEwsIE5VTEwsIEFYSVMyX1RSVUUsIE5VTEwsIE5VTEwpOwotICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgIGlucHV0X2hlYWRlciA9IF88eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz47Ci0gICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICBheGlzMl9zdmNfY2xpZW50X2FkZF9oZWFkZXIoc3ZjX2NsaWVudCwgZW52LCBpbnB1dF9oZWFkZXIpOwotICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0KLSAgICAgICAgICAgIG9wdGlvbnMgPSBheGlzMl9zdHViX2dldF9vcHRpb25zKCBzdHViLCBlbnYpOwotICAgICAgICAgICAgaWYgKE5VTEwgPT0gb3B0aW9ucykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBBWElTMl9FUlJPUl9TRVQoZW52LT5lcnJvciwgQVhJUzJfRVJST1JfSU5WQUxJRF9OVUxMX1BBUkFNLCBBWElTMl9GQUlMVVJFKTsKLSAgICAgICAgICAgICAgICBBWElTMl9MT0dfRVJST1IoZW52LT5sb2csIEFYSVMyX0xPR19TSSwgIm9wdGlvbnMgaXMgbnVsbCBpbiBzdHViIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG91dHB1dHR5cGUiLz4pTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNvYXBfYWN0ID0gYXhpczJfb3B0aW9uc19nZXRfc29hcF9hY3Rpb24oIG9wdGlvbnMsIGVudiApOwotICAgICAgICAgICAgaWYgKE5VTEwgPT0gc29hcF9hY3QpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlzX3NvYXBfYWN0X3NldCA9IEFYSVMyX0ZBTFNFOwotICAgICAgICAgICAgICBzb2FwX2FjdGlvbiA9ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHNvYXBBY3Rpb24iLz4iOwotICAgICAgICAgICAgICBzb2FwX2FjdCA9IGF4dXRpbF9zdHJpbmdfY3JlYXRlKGVudiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc29hcEFjdGlvbiIvPiIpOwotICAgICAgICAgICAgICBheGlzMl9vcHRpb25zX3NldF9zb2FwX2FjdGlvbihvcHRpb25zLCBlbnYsIHNvYXBfYWN0KTsgICAgCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkc29hcFZlcnNpb249J2h0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZSciPgotICAgICAgICAgICAgYXhpczJfb3B0aW9uc19zZXRfc29hcF92ZXJzaW9uKG9wdGlvbnMsIGVudiwgQVhJT01fU09BUDEyKTsKLSAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgYXhpczJfb3B0aW9uc19zZXRfc29hcF92ZXJzaW9uKG9wdGlvbnMsIGVudiwgQVhJT01fU09BUDExKTsKLSAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICByZXRfbm9kZSA9ICBheGlzMl9zdmNfY2xpZW50X3NlbmRfcmVjZWl2ZV93aXRoX29wX3FuYW1lKCBzdmNfY2xpZW50LCBlbnYsIG9wX3FuYW1lLCBwYXlsb2FkKTsKLSAKLSAgICAgICAgICAgIGlmICghaXNfc29hcF9hY3Rfc2V0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IiRzdHlsZT0nZG9jJyI+Ci0gICAgICAgICAgICAgIGF4aXMyX29wdGlvbnNfc2V0X3NvYXBfYWN0aW9uKG9wdGlvbnMsIGVudiwgTlVMTCk7ICAgIAotICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgYXhpczJfb3B0aW9uc19zZXRfYWN0aW9uKCBvcHRpb25zLCBlbnYsIE5VTEwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoc29hcF9hY3QpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGF4dXRpbF9zdHJpbmdfZnJlZShzb2FwX2FjdCwgZW52KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgPCEtLSBleHRyYWN0IG91dCB0aGUgaGVhZGVycyBhdCB0aGlzIHBvaW50IC0tPgotICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJvdXRwdXQvcGFyYW1bQGxvY2F0aW9uPSdzb2FwX2hlYWRlciddIj4KLSAgICAgICAgICAgICAgICBvcF9jbGllbnQgPSBheGlzMl9zdmNfY2xpZW50X2dldF9vcF9jbGllbnQoc3ZjX2NsaWVudCwgZW52KTsKLSAgICAgICAgICAgICAgICBpZighb3BfY2xpZW50KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQVhJUzJfTE9HX0VSUk9SKCBlbnYtPmxvZywgQVhJUzJfTE9HX1NJLCAib3AgY2xpZW50IGlzIE5VTEwiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG91dHB1dHR5cGUiLz4pTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbXNnX2N0eCA9IGF4aXMyX29wX2NsaWVudF9nZXRfbXNnX2N0eChvcF9jbGllbnQsIGVudiwgQVhJUzJfV1NETF9NRVNTQUdFX0xBQkVMX09VVCk7Ci0gICAgICAgICAgICAgICAgaWYoIW1zZ19jdHgpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBBWElTMl9MT0dfRVJST1IoIGVudi0+bG9nLCBBWElTMl9MT0dfU0ksICJyZXNwb25zZSBtc2cgY3R4IGlzIE5VTEwiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG91dHB1dHR5cGUiLz4pTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmVzX3NvYXBfZW52ID0gYXhpczJfbXNnX2N0eF9nZXRfcmVzcG9uc2Vfc29hcF9lbnZlbG9wZShtc2dfY3R4LCBlbnYpOwotICAgICAgICAgICAgICAgIGlmKCFyZXNfc29hcF9lbnYpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBBWElTMl9MT0dfRVJST1IoIGVudi0+bG9nLCBBWElTMl9MT0dfU0ksICJyZXNwb25zZSBldmVsb3BlIGlzIE5VTEwiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG91dHB1dHR5cGUiLz4pTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmVzX3NvYXBfaGVhZGVyID0gYXhpb21fc29hcF9lbnZlbG9wZV9nZXRfaGVhZGVyKHJlc19zb2FwX2VudiwgZW52KTsKLQotICAgICAgICAgICAgICAgIGlmKHJlc19zb2FwX2hlYWRlcikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGhlYWRlcl9iYXNlX25vZGUgPSBheGlvbV9zb2FwX2hlYWRlcl9nZXRfYmFzZV9ub2RlKHJlc19zb2FwX2hlYWRlciwgZW52KTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZighaGVhZGVyX2Jhc2Vfbm9kZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEFYSVMyX0xPR19FUlJPUiggZW52LT5sb2csIEFYSVMyX0xPR19TSSwgIlJlcXVpcmVkIHJlc3BvbnNlIGhlYWRlciBpcyBOVUxMIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJvdXRwdXQvcGFyYW1bQGxvY2F0aW9uPSdzb2FwX2hlYWRlciddIj4KLSAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0icG9zaXRpb24oKT0xIj4KLSAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2hlYWRlciA9IGF4aW9tX25vZGVfZ2V0X2ZpcnN0X2NoaWxkKGhlYWRlcl9iYXNlX25vZGUsIGVudik7Ci0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUob3V0cHV0X2hlYWRlciAmYW1wOyZhbXA7IGF4aW9tX25vZGVfZ2V0X25vZGVfdHlwZShvdXRwdXRfaGVhZGVyLCBlbnYpICE9IEFYSU9NX0VMRU1FTlQpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9oZWFkZXIgPSBheGlvbV9ub2RlX2dldF9uZXh0X3NpYmxpbmcob3V0cHV0X2hlYWRlciwgZW52KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgIG91dHB1dF9oZWFkZXIgPSBheGlvbV9ub2RlX2dldF9uZXh0X3NpYmxpbmcob3V0cHV0X2hlYWRlciwgZW52KTsKLQotICAgICAgICAgICAgICAgICAgICB3aGlsZShvdXRwdXRfaGVhZGVyICZhbXA7JmFtcDsgYXhpb21fbm9kZV9nZXRfbm9kZV90eXBlKG91dHB1dF9oZWFkZXIsIGVudikgIT0gQVhJT01fRUxFTUVOVCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2hlYWRlciA9IGF4aW9tX25vZGVfZ2V0X25leHRfc2libGluZyhvdXRwdXRfaGVhZGVyLCBlbnYpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLQotICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaGVhZGVyX3ZhciI+PHhzbDp0ZXh0Pl88L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwveHNsOnZhcmlhYmxlPgotCi0gICAgICAgICAgICAgICAgaWYoIE5VTEwgPT0gb3V0cHV0X2hlYWRlcikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEFYSVMyX0xPR19FUlJPUiggZW52LT5sb2csIEFYSVMyX0xPR19TSSwgIlJlc3BvbnNlIGhlYWRlciA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4gaXMgTlVMTCIpOwotICAgICAgICAgICAgICAgICAgICAvKiB5b3UgY2FuJ3QgaGF2ZSBhIHJlc3BvbnNlIGhlYWRlciBOVUxMLCBqdXN0IGZyZWUgdGhpbmdzIGFuZCBleGl0ICovCi0gICAgICAgICAgICAgICAgICAgIGF4aXMyX3N0dWJfb3BfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzZXJ2aWNlbmFtZSIvPl88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1ldGhvZC1uYW1lIi8+X2ZyZWVfb3V0cHV0X2hlYWRlcnMoZW52LCA8eHNsOmZvci1lYWNoIHNlbGVjdD0iLi4vLi4vb3V0cHV0L3BhcmFtW0Bsb2NhdGlvbj0nc29hcF9oZWFkZXInXSI+PHhzbDppZiB0ZXN0PSJwb3NpdGlvbigpIT0xIj4sPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp0ZXh0PiBfPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4pOwotICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRvdXRwdXR0eXBlPScnIj4KLSAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvdXRwdXR0eXBlIi8+KU5VTEw7Ci0gICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKiB5b3UgY2FuIGhhdmUgdGhlc2UgcGFyYW1ldGVycyBOVUxMLCB0byBhdm9pZCBkZXNlcmlhbGl6aW5nIHRoZW0gKi8KLSAgICAgICAgICAgICAgICBpZihkcF88eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4pCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAb3VycyI+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaGVhZGVyX3ZhciIvPiA9IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzdWJzdHJpbmctYmVmb3JlKEB0eXBlLCAnX3QqJykiLz5fY3JlYXRlKGVudik7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1iZWZvcmUoQHR5cGUsICdfdConKSIvPl9kZXNlcmlhbGl6ZSg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGhlYWRlcl92YXIiLz4sIGVudiwgJmFtcDtvdXRwdXRfaGVhZGVyLCBOVUxMLCBBWElTMl9GQUxTRSApID09IEFYSVMyX0ZBSUxVUkUpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gdGhpcyB0b28gd2lsbCBiZSBmcmVlZCBmcm9tIHRoZSBfZnJlZV9vdXRwdXRfaGVhZGVycyAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaGVhZGVyX3ZhciIvPiAhPSBOVUxMKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzdWJzdHJpbmctYmVmb3JlKEB0eXBlLCAnX3QqJykiLz5fZnJlZSg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGhlYWRlcl92YXIiLz4sIGVudik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9LS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBBWElTMl9MT0dfRVJST1IoIGVudi0+bG9nLCBBWElTMl9MT0dfU0ksICJOVUxMIHJldHVybnRlZCBmcm9tIHRoZSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz5fZGVzZXJpYWxpemU6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhpcyBzaG91bGQgYmUgZHVlIHRvIGFuIGludmFsaWQgb3V0cHV0IGhlYWRlciIpOwotICAgICAgICAgICAgICAgICAgICAgICAgYXhpczJfc3R1Yl9vcF88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHNlcnZpY2VuYW1lIi8+Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbWV0aG9kLW5hbWUiLz5fZnJlZV9vdXRwdXRfaGVhZGVycyhlbnYsIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIuLi8uLi9vdXRwdXQvcGFyYW1bQGxvY2F0aW9uPSdzb2FwX2hlYWRlciddIj48eHNsOmlmIHRlc3Q9InBvc2l0aW9uKCkhPTEiPiw8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp0ZXh0PiBfPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRvdXRwdXR0eXBlPScnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkb3V0cHV0dHlwZSIvPilOVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPiA9IGlucHV0X2hlYWRlcjsKLSAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAqZHBfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+ID0gXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICA8IS0tIGp1c3QgaGFuZGxlIG5leHQgdHlwZS0tPgotICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPgotICAgICAgICAgICAgPC94c2w6aWY+Ci0KLSAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkb3V0cHV0dHlwZT0nJyI+Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJvdXRwdXQvcGFyYW0vQG91cnMiPgotICAgICAgICAgICAgICAgICAgICBpZiAoIE5VTEwgPT0gcmV0X25vZGUgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkb3V0cHV0dHlwZSIvPilOVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldF92YWwgPSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3Vic3RyaW5nLWJlZm9yZShvdXRwdXQvcGFyYW0vQHR5cGUsICdfdConKSIvPl9jcmVhdGUoZW52KTsKLQotICAgICAgICAgICAgICAgICAgICBpZig8eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3Vic3RyaW5nLWJlZm9yZShvdXRwdXQvcGFyYW0vQHR5cGUsICdfdConKSIvPl9kZXNlcmlhbGl6ZShyZXRfdmFsLCBlbnYsICZhbXA7cmV0X25vZGUsIE5VTEwsIEFYSVMyX0ZBTFNFICkgPT0gQVhJUzJfRkFJTFVSRSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYocmV0X3ZhbCAhPSBOVUxMKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzdWJzdHJpbmctYmVmb3JlKG91dHB1dC9wYXJhbS9AdHlwZSwgJ190KicpIi8+X2ZyZWUocmV0X3ZhbCwgZW52KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgQVhJUzJfTE9HX0VSUk9SKCBlbnYtPmxvZywgQVhJUzJfTE9HX1NJLCAiTlVMTCByZXR1cm50ZWQgZnJvbSB0aGUgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1iZWZvcmUob3V0cHV0L3BhcmFtL0B0eXBlLCAnX3QqJykiLz5fZGVzZXJpYWxpemU6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhpcyBzaG91bGQgYmUgZHVlIHRvIGFuIGludmFsaWQgWE1MIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkb3V0cHV0dHlwZSIvPilOVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBnZW5lcmF0ZSBmb3IgdW53cmFwcGVkIG1vZGUgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkaXNVbndyYXBQYXJhbWV0ZXJzIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gPHhzbDppZiB0ZXN0PSJvdXRwdXQvcGFyYW0vQGNvbXBsZXh0eXBlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzdWJzdHJpbmctYmVmb3JlKG91dHB1dC9wYXJhbS9AY29tcGxleHR5cGUsICdfdConKSIvPl9mcmVlX3BvcHBpbmdfdmFsdWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj48eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3Vic3RyaW5nLWJlZm9yZShvdXRwdXQvcGFyYW0vQHR5cGUsICdfdConKSIvPl9mcmVlX3BvcHBpbmdfdmFsdWUocmV0X3ZhbCwgZW52KTx4c2w6aWYgdGVzdD0ib3V0cHV0L3BhcmFtL0Bjb21wbGV4dHlwZSI+LCBlbnYpPC94c2w6aWY+OwotICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKLSAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLQotICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXRfbm9kZTsKLSAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgIH0KLSAgICAgICAgPC94c2w6aWY+ICA8IS0tY2xvc2UgZm9yICB0ZXN0PSIkaXNTeW5jPScxJy0tPgotICAgICAgIDwveHNsOmlmPiA8IS0tIGNsb3NlIGZvciAgdGVzdD0iJG1lcD0naHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC93c2RsL2luLW91dCcgLS0+Ci0KLSAgPC94c2w6Zm9yLWVhY2g+Ci0KLSAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Im1ldGhvZCI+Ci0gICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJvdXRwdXRvdXJzIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0ib3V0cHV0L3BhcmFtL0BvdXJzIj48L3hzbDp2YWx1ZS1vZj48L3hzbDp2YXJpYWJsZT4KLSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImlzVW53cmFwUGFyYW1ldGVycyIgc2VsZWN0PSJpbnB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknIGFuZCBAdHlwZSE9JyddL0B1bndyYXBwUGFyYW1ldGVycyIvPgotCi0gICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJvdXRwdXR0eXBlIj4KLSAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGlzVW53cmFwUGFyYW1ldGVycyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ib3V0cHV0L3BhcmFtL3BhcmFtL0B0eXBlIi8+Ci0gICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im91dHB1dC9wYXJhbS9AdHlwZSI+PC94c2w6dmFsdWUtb2Y+PC94c2w6b3RoZXJ3aXNlPgotICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgPC94c2w6dmFyaWFibGU+Ci0KLSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImlucHV0cGFyYW1zIj4KLSAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkaXNVbndyYXBQYXJhbWV0ZXJzIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJpbnB1dC9wYXJhbS9wYXJhbVtAdHlwZSE9JyddIj4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+PHhzbDp0ZXh0PiBfPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPgotICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJpbnB1dC9wYXJhbVtAdHlwZSE9JyddIj4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+PHhzbDp0ZXh0PiBfPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPgotICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgIDwveHNsOmNob29zZT4KLSAgICA8L3hzbDp2YXJpYWJsZT4KLQotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iY2Fwcy1vdXRwdXR0eXBlIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0ib3V0cHV0L3BhcmFtL0BjYXBzLXR5cGUiPjwveHNsOnZhbHVlLW9mPjwveHNsOnZhcmlhYmxlPgotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ic3R5bGUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAc3R5bGUiPjwveHNsOnZhbHVlLW9mPjwveHNsOnZhcmlhYmxlPgotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ic29hcEFjdGlvbiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBzb2FwYWN0aW9uIj48L3hzbDp2YWx1ZS1vZj48L3hzbDp2YXJpYWJsZT4KLSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im1lcCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBtZXAiLz48L3hzbDp2YXJpYWJsZT4KLQotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ibWV0aG9kLW5hbWUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwveHNsOnZhcmlhYmxlPgotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ibWV0aG9kLW5zIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWVzcGFjZSIvPiA8L3hzbDp2YXJpYWJsZT4KLQotCi0gICAgIDx4c2w6aWYgdGVzdD0iJG1lcD0nMTInIj4KLSAgICAgICAgPCEtLSBBc3luYyBtZXRob2QgZ2VuZXJhdGlvbiAtLT4KLSAgICAgICAgPHhzbDppZiB0ZXN0PSIkaXNBc3luYz0nMSciPgotCi0gICAgICAgIHN0cnVjdCBheGlzMl9zdHViXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc2VydmljZW5hbWUiLz5fPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+X2NhbGxiYWNrX2RhdGEKLSAgICAgICAgeyAgIAotICAgICAgICAgICAgdm9pZCAqZGF0YTsKLSAgICAgICAgICAgIGF4aXMyX3N0YXR1c190ICggQVhJUzJfQ0FMTCAqb25fY29tcGxldGUgKSAoY29uc3QgYXh1dGlsX2Vudl90ICosIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkb3V0cHV0dHlwZSIvPjx4c2w6dGV4dD4gXzwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im91dHB1dC9wYXJhbS9AbmFtZSIvPjx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJvdXRwdXQvcGFyYW1bQGxvY2F0aW9uPSdzb2FwX2hlYWRlciddIj4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImhlYWRlcl9vdXRwdXR0eXBlIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaGVhZGVyX291dHB1dHR5cGUiLz48eHNsOnRleHQ+IDwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4sIHZvaWQgKmRhdGEpOwotICAgICAgICAgICAgYXhpczJfc3RhdHVzX3QgKCBBWElTMl9DQUxMICpvbl9lcnJvciApIChjb25zdCBheHV0aWxfZW52X3QgKiwgaW50IGV4Y2VwdGlvbiwgdm9pZCAqZGF0YSk7Ci0gICAgICAgIH07Ci0KLSAgICAgICAgc3RhdGljIGF4aXMyX3N0YXR1c190IEFYSVMyX0NBTEwgYXhpczJfc3R1Yl9vbl9lcnJvcl88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHNlcnZpY2VuYW1lIi8+Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPihheGlzMl9jYWxsYmFja190ICpjYWxsYmFjaywgY29uc3QgYXh1dGlsX2Vudl90ICplbnYsIGludCBleGNlcHRpb24pCi0gICAgICAgIHsKLSAgICAgICAgICAgIGF4aXMyX3N0YXR1c190ICggQVhJUzJfQ0FMTCAqb25fZXJyb3IgKSAoY29uc3QgYXh1dGlsX2Vudl90ICosIGludCwgdm9pZCAqZGF0YSk7Ci0gICAgICAgICAgICBzdHJ1Y3QgYXhpczJfc3R1Yl88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHNlcnZpY2VuYW1lIi8+Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPl9jYWxsYmFja19kYXRhKiBjYWxsYmFja19kYXRhID0gTlVMTDsKLSAgICAgICAgICAgIHZvaWQgKnVzZXJfZGF0YSA9IE5VTEw7Ci0KLSAgICAgICAgICAgIGF4aXMyX3N0YXR1c190IHN0YXR1czsKLSAgICAgICAgCi0gICAgICAgICAgICBjYWxsYmFja19kYXRhID0gKHN0cnVjdCBheGlzMl9zdHViXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc2VydmljZW5hbWUiLz5fPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+X2NhbGxiYWNrX2RhdGEqKWF4aXMyX2NhbGxiYWNrX2dldF9kYXRhKGNhbGxiYWNrKTsKLSAgICAgICAgCi0gICAgICAgICAgICB1c2VyX2RhdGEgPSBjYWxsYmFja19kYXRhLT5kYXRhOwotICAgICAgICAgICAgb25fZXJyb3IgPSBjYWxsYmFja19kYXRhLT5vbl9lcnJvcjsKLSAgICAgICAgCi0gICAgICAgICAgICBzdGF0dXMgPSBvbl9lcnJvcihlbnYsIGV4Y2VwdGlvbiwgdXNlcl9kYXRhKTsKLQotICAgICAgICAgICAgaWYoY2FsbGJhY2tfZGF0YSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBBWElTMl9GUkVFKGVudi0+YWxsb2NhdG9yLCBjYWxsYmFja19kYXRhKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgIH0gCi0KLSAgICAgICAgYXhpczJfc3RhdHVzX3QgQVhJUzJfQ0FMTCBheGlzMl9zdHViX29uX2NvbXBsZXRlXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc2VydmljZW5hbWUiLz5fPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+KGF4aXMyX2NhbGxiYWNrX3QgKmNhbGxiYWNrLCBjb25zdCBheHV0aWxfZW52X3QgKmVudikKLSAgICAgICAgewotICAgICAgICAgICAgYXhpczJfc3RhdHVzX3QgKCBBWElTMl9DQUxMICpvbl9jb21wbGV0ZSApIChjb25zdCBheHV0aWxfZW52X3QgKiwgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvdXRwdXR0eXBlIi8+PHhzbDp0ZXh0PiBfPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0ib3V0cHV0L3BhcmFtL0BuYW1lIi8+PHhzbDpmb3ItZWFjaCBzZWxlY3Q9Im91dHB1dC9wYXJhbVtAbG9jYXRpb249J3NvYXBfaGVhZGVyJ10iPiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaGVhZGVyX291dHB1dHR5cGUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPjwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRoZWFkZXJfb3V0cHV0dHlwZSIvPjx4c2w6dGV4dD4gPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPiwgdm9pZCAqZGF0YSk7Ci0gICAgICAgICAgICBzdHJ1Y3QgYXhpczJfc3R1Yl88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHNlcnZpY2VuYW1lIi8+Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPl9jYWxsYmFja19kYXRhKiBjYWxsYmFja19kYXRhID0gTlVMTDsKLSAgICAgICAgICAgIHZvaWQgKnVzZXJfZGF0YSA9IE5VTEw7Ci0gICAgICAgICAgICBheGlzMl9zdGF0dXNfdCBzdGF0dXMgPSBBWElTMl9TVUNDRVNTOwotIAotICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJvdXRwdXQvcGFyYW0vQG91cnMiPgotICAgICAgICAgICAJICAgIDwhLS0gdGhpcyBtZWFucyBkYXRhIGJpbmRpbmcgaXMgZW5hYmxlIC0tPgotICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJvdXRwdXQvcGFyYW0vQHR5cGUiLz4gcmV0X3ZhbDsKLSAgICAgICAgICAgIDwveHNsOmlmPgotCi0gICAgICAgICAgICBheGlvbV9ub2RlX3QgKnJldF9ub2RlID0gTlVMTDsKLSAgICAgICAgICAgIGF4aW9tX3NvYXBfZW52ZWxvcGVfdCAqc29hcF9lbnZlbG9wZSA9IE5VTEw7Ci0KLSAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0ib3V0cHV0L3BhcmFtW0Bsb2NhdGlvbj0nc29hcF9oZWFkZXInXSI+Ci0gICAgICAgICAgICAgICAgYXhpb21fc29hcF9oZWFkZXJfdCAqcmVzX3NvYXBfaGVhZGVyID0gTlVMTDsKLSAgICAgICAgICAgICAgICBheGlvbV9ub2RlX3QgKmhlYWRlcl9iYXNlX25vZGUgPSBOVUxMOwotICAgICAgICAgICAgICAgIGF4aW9tX25vZGVfdCAqb3V0cHV0X2hlYWRlciA9IE5VTEw7Ci0gICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJvdXRwdXQvcGFyYW1bQGxvY2F0aW9uPSdzb2FwX2hlYWRlciddIj4KLSAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz48eHNsOnRleHQ+IF88L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPiA9IE5VTEw7Ci0gICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLQotICAgICAgICAgICAgY2FsbGJhY2tfZGF0YSA9IChzdHJ1Y3QgYXhpczJfc3R1Yl88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHNlcnZpY2VuYW1lIi8+Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPl9jYWxsYmFja19kYXRhKilheGlzMl9jYWxsYmFja19nZXRfZGF0YShjYWxsYmFjayk7Ci0KLSAgICAgICAgICAgIHNvYXBfZW52ZWxvcGUgPSBheGlzMl9jYWxsYmFja19nZXRfZW52ZWxvcGUoY2FsbGJhY2ssIGVudik7Ci0gICAgICAgICAgICBpZihzb2FwX2VudmVsb3BlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGF4aW9tX3NvYXBfYm9keV90ICpzb2FwX2JvZHk7Ci0gICAgICAgICAgICAgICAgc29hcF9ib2R5ID0gYXhpb21fc29hcF9lbnZlbG9wZV9nZXRfYm9keShzb2FwX2VudmVsb3BlLCBlbnYpOwotICAgICAgICAgICAgICAgIGlmKHNvYXBfYm9keSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGF4aW9tX25vZGVfdCAqYm9keV9ub2RlID0gYXhpb21fc29hcF9ib2R5X2dldF9iYXNlX25vZGUoc29hcF9ib2R5LCBlbnYpOwotICAgICAgICAgICAgICAgICAgICBpZihib2R5X25vZGUpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldF9ub2RlID0gYXhpb21fbm9kZV9nZXRfZmlyc3RfY2hpbGQoYm9keV9ub2RlLCBlbnYpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIDwhLS0gZXh0cmFjdCBvdXQgdGhlIGhlYWRlcnMgYXQgdGhpcyBwb2ludCAtLT4KLSAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9Im91dHB1dC9wYXJhbVtAbG9jYXRpb249J3NvYXBfaGVhZGVyJ10iPgotICAgICAgICAgICAgICAgICAgICByZXNfc29hcF9oZWFkZXIgPSBheGlvbV9zb2FwX2VudmVsb3BlX2dldF9oZWFkZXIoc29hcF9lbnZlbG9wZSwgZW52KTsKLQotICAgICAgICAgICAgICAgICAgICBpZihyZXNfc29hcF9oZWFkZXIpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcl9iYXNlX25vZGUgPSBheGlvbV9zb2FwX2hlYWRlcl9nZXRfYmFzZV9ub2RlKHJlc19zb2FwX2hlYWRlciwgZW52KTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmKCFoZWFkZXJfYmFzZV9ub2RlKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBWElTMl9MT0dfRVJST1IoIGVudi0+bG9nLCBBWElTMl9MT0dfU0ksICJSZXF1aXJlZCByZXNwb25zZSBoZWFkZXIgaXMgTlVMTCIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmKGhlYWRlcl9iYXNlX25vZGUpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Im91dHB1dC9wYXJhbVtAbG9jYXRpb249J3NvYXBfaGVhZGVyJ10iPgotICAgICAgICAgICAgICAgICAgICBpZihzdGF0dXMgPT0gQVhJUzJfU1VDQ0VTUykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9InBvc2l0aW9uKCk9MSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfaGVhZGVyID0gYXhpb21fbm9kZV9nZXRfZmlyc3RfY2hpbGQoaGVhZGVyX2Jhc2Vfbm9kZSwgZW52KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUob3V0cHV0X2hlYWRlciAmYW1wOyZhbXA7IGF4aW9tX25vZGVfZ2V0X25vZGVfdHlwZShvdXRwdXRfaGVhZGVyLCBlbnYpICE9IEFYSU9NX0VMRU1FTlQpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2hlYWRlciA9IGF4aW9tX25vZGVfZ2V0X25leHRfc2libGluZyhvdXRwdXRfaGVhZGVyLCBlbnYpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9oZWFkZXIgPSBheGlvbV9ub2RlX2dldF9uZXh0X3NpYmxpbmcob3V0cHV0X2hlYWRlciwgZW52KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUob3V0cHV0X2hlYWRlciAmYW1wOyZhbXA7IGF4aW9tX25vZGVfZ2V0X25vZGVfdHlwZShvdXRwdXRfaGVhZGVyLCBlbnYpICE9IEFYSU9NX0VMRU1FTlQpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2hlYWRlciA9IGF4aW9tX25vZGVfZ2V0X25leHRfc2libGluZyhvdXRwdXRfaGVhZGVyLCBlbnYpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLQotICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImhlYWRlcl92YXIiPjx4c2w6dGV4dD5fPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48L3hzbDp2YXJpYWJsZT4KLQotICAgICAgICAgICAgICAgICAgICBpZiggTlVMTCA9PSBvdXRwdXRfaGVhZGVyKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBWElTMl9MT0dfRVJST1IoIGVudi0+bG9nLCBBWElTMl9MT0dfU0ksICJSZXNwb25zZSBoZWFkZXIgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+IGlzIE5VTEwiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIHlvdSBjYW4ndCBoYXZlIGEgcmVzcG9uc2UgaGVhZGVyIE5VTEwsIGp1c3QgZnJlZSB0aGluZ3MgYW5kIGV4aXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMyX3N0dWJfb3BfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzZXJ2aWNlbmFtZSIvPl88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1ldGhvZC1uYW1lIi8+X2ZyZWVfb3V0cHV0X2hlYWRlcnMoZW52LCA8eHNsOmZvci1lYWNoIHNlbGVjdD0iLi4vLi4vb3V0cHV0L3BhcmFtW0Bsb2NhdGlvbj0nc29hcF9oZWFkZXInXSI+PHhzbDppZiB0ZXN0PSJwb3NpdGlvbigpIT0xIj4sPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dGV4dD4gXzwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBBWElTMl9GQUlMVVJFOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBvdXJzIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaGVhZGVyX3ZhciIvPiA9IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzdWJzdHJpbmctYmVmb3JlKEB0eXBlLCAnX3QqJykiLz5fY3JlYXRlKGVudik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzdWJzdHJpbmctYmVmb3JlKEB0eXBlLCAnX3QqJykiLz5fZGVzZXJpYWxpemUoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRoZWFkZXJfdmFyIi8+LCBlbnYsICZhbXA7b3V0cHV0X2hlYWRlciwgTlVMTCwgQVhJUzJfRkFMU0UgKSA9PSBBWElTMl9GQUlMVVJFKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gdGhpcyB0b28gd2lsbCBiZSBmcmVlZCBmcm9tIHRoZSBfZnJlZV9vdXRwdXRfaGVhZGVycyBmdW5jdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaGVhZGVyX3ZhciIvPiAhPSBOVUxMKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1iZWZvcmUoQHR5cGUsICdfdConKSIvPl9mcmVlKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaGVhZGVyX3ZhciIvPiwgZW52KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQVhJUzJfTE9HX0VSUk9SKCBlbnYtPmxvZywgQVhJUzJfTE9HX1NJLCAiTlVMTCByZXR1cm50ZWQgZnJvbSB0aGUgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+X2Rlc2VyaWFsaXplOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGlzIHNob3VsZCBiZSBkdWUgdG8gYW4gaW52YWxpZCBvdXRwdXQgaGVhZGVyIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpczJfc3R1Yl9vcF88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHNlcnZpY2VuYW1lIi8+Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbWV0aG9kLW5hbWUiLz5fZnJlZV9vdXRwdXRfaGVhZGVycyhlbnYsIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIuLi8uLi9vdXRwdXQvcGFyYW1bQGxvY2F0aW9uPSdzb2FwX2hlYWRlciddIj48eHNsOmlmIHRlc3Q9InBvc2l0aW9uKCkhPTEiPiw8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dGV4dD4gXzwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEFYSVMyX0ZBSUxVUkU7ICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICBfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+ID0gb3V0cHV0X2hlYWRlcjsKLSAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4gPCEtLSBmb3IgZWFjaCBvdXRwdXQgaGVhZGVyIHBhcmFtIC0tPgotCi0gICAgICAgICAgICAgICAgICAgIDwhLS0gZnJlZSB0aGVtIGlmIGFueXRoaW5nIGdvZXMgd3JvbmcgLS0+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJvdXRwdXQvcGFyYW1bQGxvY2F0aW9uPSdzb2FwX2hlYWRlciddIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKHN0YXR1cyA9PSBBWElTMl9GQUlMVVJFKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dGV4dD5fPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4gPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB1c2VyX2RhdGEgPSBjYWxsYmFja19kYXRhLT5kYXRhOwotICAgICAgICAgICAgb25fY29tcGxldGUgPSBjYWxsYmFja19kYXRhLT5vbl9jb21wbGV0ZTsKLQotICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9Im91dHB1dC9wYXJhbS9Ab3VycyI+Ci0gICAgICAgICAgICAgICAgICAgIGlmKHJldF9ub2RlICE9IE5VTEwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldF92YWwgPSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3Vic3RyaW5nLWJlZm9yZShvdXRwdXQvcGFyYW0vQHR5cGUsICdfdConKSIvPl9jcmVhdGUoZW52KTsKLSAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpZig8eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3Vic3RyaW5nLWJlZm9yZShvdXRwdXQvcGFyYW0vQHR5cGUsICdfdConKSIvPl9kZXNlcmlhbGl6ZShyZXRfdmFsLCBlbnYsICZhbXA7cmV0X25vZGUsIE5VTEwsIEFYSVMyX0ZBTFNFICkgPT0gQVhJUzJfRkFJTFVSRSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBWElTMl9MT0dfRVJST1IoIGVudi0+bG9nLCBBWElTMl9MT0dfU0ksICJOVUxMIHJldHVybnRlZCBmcm9tIHRoZSBMZW5kUmVzcG9uc2VfZGVzZXJpYWxpemU6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoaXMgc2hvdWxkIGJlIGR1ZSB0byBhbiBpbnZhbGlkIFhNTCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzdWJzdHJpbmctYmVmb3JlKG91dHB1dC9wYXJhbS9AdHlwZSwgJ190KicpIi8+X2ZyZWUocmV0X3ZhbCwgZW52KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRfdmFsID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICByZXRfdmFsID0gTlVMTDsgCi0gICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gZ2VuZXJhdGUgZm9yIHVud3JhcHBlZCBtb2RlIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkaXNVbndyYXBQYXJhbWV0ZXJzIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICBpZihyZXRfdmFsID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBvbl9jb21wbGV0ZShlbnYsICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0ib3V0cHV0L3BhcmFtL3BhcmFtL0B0eXBlIi8+KU5VTEw8eHNsOmZvci1lYWNoIHNlbGVjdD0ib3V0cHV0L3BhcmFtW0Bsb2NhdGlvbj0nc29hcF9oZWFkZXInXSI+LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnRleHQ+XzwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPiwgdXNlcl9kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gb25fY29tcGxldGUoZW52LCA8eHNsOmlmIHRlc3Q9Im91dHB1dC9wYXJhbS9AY29tcGxleHR5cGUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3Vic3RyaW5nLWJlZm9yZShvdXRwdXQvcGFyYW0vQGNvbXBsZXh0eXBlLCAnX3QqJykiLz5fZnJlZV9wb3BwaW5nX3ZhbHVlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj48eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3Vic3RyaW5nLWJlZm9yZShvdXRwdXQvcGFyYW0vQHR5cGUsICdfdConKSIvPl9mcmVlX3BvcHBpbmdfdmFsdWUocmV0X3ZhbCwgZW52KTx4c2w6aWYgdGVzdD0ib3V0cHV0L3BhcmFtL0Bjb21wbGV4dHlwZSI+LCBlbnYpPC94c2w6aWY+PHhzbDpmb3ItZWFjaCBzZWxlY3Q9Im91dHB1dC9wYXJhbVtAbG9jYXRpb249J3NvYXBfaGVhZGVyJ10iPiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp0ZXh0Pl88L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4sIHVzZXJfZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gb25fY29tcGxldGUoZW52LCByZXRfdmFsPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Im91dHB1dC9wYXJhbVtAbG9jYXRpb249J3NvYXBfaGVhZGVyJ10iPiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp0ZXh0Pl88L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4sIHVzZXJfZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBvbl9jb21wbGV0ZShlbnYsIHJldF9ub2RlPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Im91dHB1dC9wYXJhbVtAbG9jYXRpb249J3NvYXBfaGVhZGVyJ10iPiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnRleHQ+XzwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+LCB1c2VyX2RhdGEpOwotICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAKLSAgICAgICAgICAgIGlmKGNhbGxiYWNrX2RhdGEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQVhJUzJfRlJFRShlbnYtPmFsbG9jYXRvciwgY2FsbGJhY2tfZGF0YSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAgKiBhdXRvIGdlbmVyYXRlZCBtZXRob2Qgc2lnbmF0dXJlIGZvciBhc3luY2hyb25vdXMgaW52b2NhdGlvbnMKLSAgICAgICAgICAqIGZvciAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBxbmFtZSIvPjx4c2w6dGV4dD4iIG9wZXJhdGlvbi4KLSAgICAgICAgICAqIEBwYXJhbSBzdHViIFRoZSBzdHViCi0gICAgICAgICAgKiBAcGFyYW0gZW52IGVudmlyb25tZW50ICggbWFuZGF0b3J5KTwveHNsOnRleHQ+Ci0gICAgICAgICAgPCEtLSAgc2VsZWN0IG9ubHkgdGhlIGJvZHkgcGFyYW1ldGVycyAgLS0+Ci0gICAgICAgICAgPHhzbDppZiB0ZXN0PSJub3QoJGlzVW53cmFwUGFyYW1ldGVycykiPjx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJpbnB1dC9wYXJhbVtAdHlwZSE9JyddIj48eHNsOnRleHQ+Ci0gICAgICAgICAgKiBAcGFyYW0gXzwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+IG9mIHRoZSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz48L3hzbDpmb3ItZWFjaD48L3hzbDppZj4KLSAgICAgICAgICA8eHNsOmlmIHRlc3Q9IiRpc1Vud3JhcFBhcmFtZXRlcnMiPjx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJpbnB1dC9wYXJhbS9wYXJhbVtAdHlwZSE9JyddIj48eHNsOnRleHQ+Ci0gICAgICAgICAgKiBAcGFyYW0gXzwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+IG9mIHRoZSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz48L3hzbDpmb3ItZWFjaD48L3hzbDppZj4KLSAgICAgICAgICAqIEBwYXJhbSB1c2VyX2RhdGEgdXNlciBkYXRhIHRvIGJlIGFjY2Vzc2VkIGJ5IHRoZSBjYWxsYmFja3MKLSAgICAgICAgICAqIEBwYXJhbSBvbl9jb21wbGV0ZSBjYWxsYmFjayB0byBoYW5kbGUgb24gY29tcGxldGUKLSAgICAgICAgICAqIEBwYXJhbSBvbl9lcnJvciBjYWxsYmFjayB0byBoYW5kbGUgb24gZXJyb3IKLSAgICAgICAgICAqLwotCi0gICAgICAgICB2b2lkIEFYSVMyX0NBTEwKLSAgICAgICAgIGF4aXMyX3N0dWJfc3RhcnRfb3BfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzZXJ2aWNlbmFtZSIvPl88eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4oIGF4aXMyX3N0dWJfdCAqc3R1YiwgY29uc3QgYXh1dGlsX2Vudl90ICplbnY8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGlucHV0cGFyYW1zIi8+LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMyX3N0YXR1c190ICggQVhJUzJfQ0FMTCAqb25fY29tcGxldGUgKSAoY29uc3QgYXh1dGlsX2Vudl90ICosIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkb3V0cHV0dHlwZSIvPjx4c2w6dGV4dD4gXzwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im91dHB1dC9wYXJhbS9AbmFtZSIvPjx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJvdXRwdXQvcGFyYW1bQGxvY2F0aW9uPSdzb2FwX2hlYWRlciddIj4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImhlYWRlcl9vdXRwdXR0eXBlIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaGVhZGVyX291dHB1dHR5cGUiLz48eHNsOnRleHQ+IDwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4sIHZvaWQgKmRhdGEpICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpczJfc3RhdHVzX3QgKCBBWElTMl9DQUxMICpvbl9lcnJvciApIChjb25zdCBheHV0aWxfZW52X3QgKiwgaW50IGV4Y2VwdGlvbiwgdm9pZCAqZGF0YSkgKQotICAgICAgICAgewotCi0gICAgICAgICAgICBheGlzMl9jYWxsYmFja190ICpjYWxsYmFjayA9IE5VTEw7Ci0KLSAgICAgICAgICAgIGF4aXMyX3N2Y19jbGllbnRfdCAqc3ZjX2NsaWVudCA9IE5VTEw7Ci0gICAgICAgICAgICBheGlzMl9vcHRpb25zX3QgKm9wdGlvbnMgPSBOVUxMOwotCi0gICAgICAgICAgICBjb25zdCBheGlzMl9jaGFyX3QgKnNvYXBfYWN0aW9uID0gTlVMTDsKLSAgICAgICAgICAgIGF4aW9tX25vZGVfdCAqcGF5bG9hZCA9IE5VTEw7Ci0KLSAgICAgICAgICAgIGF4aXMyX2Jvb2xfdCBpc19zb2FwX2FjdF9zZXQgPSBBWElTMl9UUlVFOwotICAgICAgICAgICAgYXh1dGlsX3N0cmluZ190ICpzb2FwX2FjdCA9IE5VTEw7Ci0KLSAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdzb2FwX2hlYWRlciddIj4KLSAgICAgICAgICAgICAgICBheGlvbV9ub2RlX3QgKmlucHV0X2hlYWRlciA9IE5VTEw7Ci0gICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgc3RydWN0IGF4aXMyX3N0dWJfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzZXJ2aWNlbmFtZSIvPl88eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz5fY2FsbGJhY2tfZGF0YSAqY2FsbGJhY2tfZGF0YTsKLQotICAgICAgICAgICAgY2FsbGJhY2tfZGF0YSA9IChzdHJ1Y3QgYXhpczJfc3R1Yl88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHNlcnZpY2VuYW1lIi8+Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPl9jYWxsYmFja19kYXRhKikgQVhJUzJfTUFMTE9DKGVudi0+YWxsb2NhdG9yLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3QgYXhpczJfc3R1Yl88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHNlcnZpY2VuYW1lIi8+Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPl9jYWxsYmFja19kYXRhKSk7Ci0gICAgICAgICAgICBpZihOVUxMID09IGNhbGxiYWNrX2RhdGEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQVhJUzJfRVJST1JfU0VUKGVudi0+ZXJyb3IsIEFYSVMyX0VSUk9SX05PX01FTU9SWSwgQVhJUzJfRkFJTFVSRSk7Ci0gICAgICAgICAgICAgICAgQVhJUzJfTE9HX0VSUk9SKCBlbnYtPmxvZywgQVhJUzJfTE9HX1NJLCAiQ2FuIG5vdCBhbGxvY2F0ZSBtZW1lb3J5IGZvciB0aGUgY2FsbGJhY2sgZGF0YSBzdHJ1Y3R1cmVzIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgPCEtLSBmb3Igc2VydmljZSBjbGllbnQgY3VycmVudGx5IHN1cHBwb3J0ZWQgb25seSAxIGlucHV0IHBhcmFtIC0tPgotCi0gICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImZpcnN0UGFyYW0iIHNlbGVjdD0iaW5wdXQvcGFyYW1bMV0iLz4KLQotCi0gICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IiRmaXJzdFBhcmFtL0B0eXBlIT0nJyI+Ci0gICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGZpcnN0UGFyYW0vQG91cnMiPgotICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gZ2VuZXJhdGUgZm9yIHVud3JhcHBlZCBtb2RlIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRpc1Vud3JhcFBhcmFtZXRlcnMiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9IndyYXBwZXJfYWRiX29iaiI+d3JhcHBlcl9hZGJfb2JqPC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRmaXJzdFBhcmFtL0B0eXBlIi8+PHhzbDp0ZXh0PiA8L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkd3JhcHBlcl9hZGJfb2JqIi8+PHhzbDp0ZXh0PiA9IDwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1iZWZvcmUoJGZpcnN0UGFyYW0vQHR5cGUsICdfdConKSIvPjx4c2w6dGV4dD5fY3JlYXRlX3dpdGhfdmFsdWVzKGVudjwveHNsOnRleHQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9ImlucHV0L3BhcmFtL0Bjb21wbGV4dHlwZSI+LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1iZWZvcmUoaW5wdXQvcGFyYW0vQGNvbXBsZXh0eXBlLCAnX3QqJykiLz48eHNsOnRleHQ+X2NyZWF0ZV93aXRoX3ZhbHVlcyhlbnY8L3hzbDp0ZXh0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+PHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRmaXJzdFBhcmFtL3BhcmFtW0B0eXBlIT0nJ10iPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp0ZXh0PiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF88L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPjx4c2w6aWYgdGVzdD0iaW5wdXQvcGFyYW0vQGNvbXBsZXh0eXBlIj4pPC94c2w6aWY+KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZCA9IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzdWJzdHJpbmctYmVmb3JlKCRmaXJzdFBhcmFtL0B0eXBlLCAnX3QqJykiLz5fc2VyaWFsaXplKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkd3JhcHBlcl9hZGJfb2JqIi8+LCBlbnYsIE5VTEwsIE5VTEwsIEFYSVMyX1RSVUUsIE5VTEwsIE5VTEwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZCA9IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzdWJzdHJpbmctYmVmb3JlKCRmaXJzdFBhcmFtL0B0eXBlLCAnX3QqJykiLz5fc2VyaWFsaXplKF88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGZpcnN0UGFyYW0vQG5hbWUiLz4sIGVudiwgTlVMTCwgTlVMTCwgQVhJUzJfVFJVRSwgTlVMTCwgTlVMTCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkID0gXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZmlyc3RQYXJhbS9AbmFtZSIvPjsKLSAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICA8L3hzbDppZj4KLQotCi0gICAgICAgICAgICBzdmNfY2xpZW50ID0gYXhpczJfc3R1Yl9nZXRfc3ZjX2NsaWVudChzdHViLCBlbnYgKTsKLSAgICAgICAgICAgIDwhLS0gaGFuZGxpbmcgaGVhZGVyIHBhcmFtcyAtLT4KLSAgICAgICAgICAgCi0gICAgICAgICAgICA8IS0tIGFkZGluZyBpbnB1dCBoZWFkZXJzIC0tPgotICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImlucHV0L3BhcmFtW0Bsb2NhdGlvbj0nc29hcF9oZWFkZXInXSI+Ci0gICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBvdXJzIj4KLSAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgIDwhLS0gZ2VuZXJhdGUgZm9yIHVud3JhcHBlZCBtb2RlIC0tPgotICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkaXNVbndyYXBQYXJhbWV0ZXJzIj4KLSAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9IndyYXBwZXJfYWRiX29iaiI+d3JhcHBlcl9hZGJfb2JqPC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0id3JhcHBlcl90eXBlIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz48L3hzbDp2YXJpYWJsZT4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR3cmFwcGVyX3R5cGUiLz48eHNsOnRleHQ+IDwveHNsOnRleHQ+IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkd3JhcHBlcl9hZGJfb2JqIi8+ID0gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1iZWZvcmUoJHdyYXBwZXJfdHlwZSwgJ190KicpIi8+PHhzbDp0ZXh0Pl9jcmVhdGVfd2l0aF92YWx1ZXMoZW52PC94c2w6dGV4dD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iQGNvbXBsZXh0eXBlIj4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3Vic3RyaW5nLWJlZm9yZShAY29tcGxleHR5cGUsICdfdConKSIvPjx4c2w6dGV4dD5fY3JlYXRlX3dpdGhfdmFsdWVzKGVudjwveHNsOnRleHQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj48eHNsOmZvci1lYWNoIHNlbGVjdD0icGFyYW1bQHR5cGUhPScnXSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dGV4dD4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF88L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+PHhzbDppZiB0ZXN0PSJAY29tcGxleHR5cGUiPik8L3hzbDppZj4pOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0X2hlYWRlciA9IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzdWJzdHJpbmctYmVmb3JlKCR3cmFwcGVyX3R5cGUsICdfdConKSIvPl9zZXJpYWxpemUoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR3cmFwcGVyX2FkYl9vYmoiLz4sIGVudiwgTlVMTCwgTlVMTCwgQVhJUzJfVFJVRSwgTlVMTCwgTlVMTCk7Ci0gICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dF9oZWFkZXIgPSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3Vic3RyaW5nLWJlZm9yZShAdHlwZSwgJ190KicpIi8+X3NlcmlhbGl6ZShfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+LCBlbnYsIE5VTEwsIE5VTEwsIEFYSVMyX1RSVUUsIE5VTEwsIE5VTEwpOwotICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgIGlucHV0X2hlYWRlciA9IF88eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz47Ci0gICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICBheGlzMl9zdmNfY2xpZW50X2FkZF9oZWFkZXIoc3ZjX2NsaWVudCwgZW52LCBpbnB1dF9oZWFkZXIpOwotICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0KLSAgICAgICAgICAgIG9wdGlvbnMgPSBheGlzMl9zdHViX2dldF9vcHRpb25zKCBzdHViLCBlbnYpOwotICAgICAgICAgICAgaWYgKE5VTEwgPT0gb3B0aW9ucykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgQVhJUzJfRVJST1JfU0VUKGVudi0+ZXJyb3IsIEFYSVMyX0VSUk9SX0lOVkFMSURfTlVMTF9QQVJBTSwgQVhJUzJfRkFJTFVSRSk7Ci0gICAgICAgICAgICAgIEFYSVMyX0xPR19FUlJPUiggZW52LT5sb2csIEFYSVMyX0xPR19TSSwgIm9wdGlvbnMgaXMgbnVsbCBpbiBzdHViIik7Ci0gICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc29hcF9hY3QgPWF4aXMyX29wdGlvbnNfZ2V0X3NvYXBfYWN0aW9uIChvcHRpb25zLCBlbnYpOwotICAgICAgICAgICAgaWYgKE5VTEwgPT0gc29hcF9hY3QpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlzX3NvYXBfYWN0X3NldCA9IEFYSVMyX0ZBTFNFOwotICAgICAgICAgICAgICBzb2FwX2FjdGlvbiA9ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHNvYXBBY3Rpb24iLz4iOwotICAgICAgICAgICAgICBzb2FwX2FjdCA9IGF4dXRpbF9zdHJpbmdfY3JlYXRlKGVudiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc29hcEFjdGlvbiIvPiIpOwotICAgICAgICAgICAgICBheGlzMl9vcHRpb25zX3NldF9zb2FwX2FjdGlvbihvcHRpb25zLCBlbnYsIHNvYXBfYWN0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkc29hcFZlcnNpb249J2h0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZSciPgotICAgICAgICAgICAgYXhpczJfb3B0aW9uc19zZXRfc29hcF92ZXJzaW9uKG9wdGlvbnMsIGVudiwgQVhJT01fU09BUDEyKTsKLSAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgYXhpczJfb3B0aW9uc19zZXRfc29hcF92ZXJzaW9uKG9wdGlvbnMsIGVudiwgQVhJT01fU09BUDExKTsKLSAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0KLSAgICAgICAgICAgIGNhbGxiYWNrID0gYXhpczJfY2FsbGJhY2tfY3JlYXRlKGVudik7Ci0gICAgICAgICAgICAvKiBTZXQgb3VyIG9uX2NvbXBsZXRlIGZ1Y250aW9uIHBvaW50ZXIgdG8gdGhlIGNhbGxiYWNrIG9iamVjdCAqLwotICAgICAgICAgICAgYXhpczJfY2FsbGJhY2tfc2V0X29uX2NvbXBsZXRlKGNhbGxiYWNrLCBheGlzMl9zdHViX29uX2NvbXBsZXRlXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc2VydmljZW5hbWUiLz5fPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+KTsKLSAgICAgICAgICAgIC8qIFNldCBvdXIgb25fZXJyb3IgZnVuY3Rpb24gcG9pbnRlciB0byB0aGUgY2FsbGJhY2sgb2JqZWN0ICovCi0gICAgICAgICAgICBheGlzMl9jYWxsYmFja19zZXRfb25fZXJyb3IoY2FsbGJhY2ssIGF4aXMyX3N0dWJfb25fZXJyb3JfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzZXJ2aWNlbmFtZSIvPl88eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4pOwotCi0gICAgICAgICAgICBjYWxsYmFja19kYXRhLT4gZGF0YSA9IHVzZXJfZGF0YTsKLSAgICAgICAgICAgIGNhbGxiYWNrX2RhdGEtPiBvbl9jb21wbGV0ZSA9IG9uX2NvbXBsZXRlOwotICAgICAgICAgICAgY2FsbGJhY2tfZGF0YS0+IG9uX2Vycm9yID0gb25fZXJyb3I7Ci0KLSAgICAgICAgICAgIGF4aXMyX2NhbGxiYWNrX3NldF9kYXRhKGNhbGxiYWNrLCAodm9pZCopY2FsbGJhY2tfZGF0YSk7Ci0KLSAgICAgICAgICAgIC8qIFNlbmQgcmVxdWVzdCAqLwotICAgICAgICAgICAgYXhpczJfc3ZjX2NsaWVudF9zZW5kX3JlY2VpdmVfbm9uX2Jsb2NraW5nKHN2Y19jbGllbnQsIGVudiwgcGF5bG9hZCwgY2FsbGJhY2spOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoIWlzX3NvYXBfYWN0X3NldCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSIkc3R5bGU9J2RvYyciPgotICAgICAgICAgICAgICBheGlzMl9vcHRpb25zX3NldF9zb2FwX2FjdGlvbihvcHRpb25zLCBlbnYsIE5VTEwpOwotICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgYXhpczJfb3B0aW9uc19zZXRfYWN0aW9uKG9wdGlvbnMsIGVudiwgTlVMTCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIDwveHNsOmlmPiAgPCEtLWNsb3NlIGZvciAgdGVzdD0iJGlzQVN5bmM9JzEnLS0+Ci0gICAgICAgPCEtLSBFbmQgb2YgaW4tb3V0IG1lcCAtLT4KLSAgICAgICA8L3hzbDppZj4gPCEtLSBjbG9zZSBmb3IgIHRlc3Q9IiRtZXA9J2h0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgvd3NkbC9pbi1vdXQnIC0tPgotCi0gICAgICAgPHhzbDppZiB0ZXN0PSIkbWVwPScxMCciPgotICAgICAgICAgLyoqCi0gICAgICAgICAgKiBhdXRvIGdlbmVyYXRlZCBtZXRob2Qgc2lnbmF0dXJlIGZvciBpbiBvbmx5IG1lcCBpbnZvY2F0aW9ucwotICAgICAgICAgICogZm9yICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHFuYW1lIi8+IiBvcGVyYXRpb24uCi0gICAgICAgICAgKiBAcGFyYW0gc3R1YiBUaGUgc3R1YiAoYXhpczJfc3R1Yl90KQotICAgICAgICAgICogQHBhcmFtIGVudiBlbnZpcm9ubWVudCAoIG1hbmRhdG9yeSk8eHNsOmlmIHRlc3Q9Im5vdCgkaXNVbndyYXBQYXJhbWV0ZXJzKSI+PHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImlucHV0L3BhcmFtW0B0eXBlIT0nJ10iPjx4c2w6dGV4dD4KLSAgICAgICAgICA8L3hzbDp0ZXh0PiogQHBhcmFtIF88eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4gb2YgdGhlIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPjwveHNsOmZvci1lYWNoPjwveHNsOmlmPgotICAgICAgICAgIDx4c2w6aWYgdGVzdD0iJGlzVW53cmFwUGFyYW1ldGVycyI+PHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImlucHV0L3BhcmFtL3BhcmFtW0B0eXBlIT0nJ10iPjx4c2w6dGV4dD4KLSAgICAgICAgICA8L3hzbDp0ZXh0PiogQHBhcmFtIF88eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4gb2YgdGhlIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPjwveHNsOmZvci1lYWNoPjwveHNsOmlmPgotICAgICAgICAgICo8eHNsOmZvci1lYWNoIHNlbGVjdD0ib3V0cHV0L3BhcmFtW0Bsb2NhdGlvbj0nc29hcF9oZWFkZXInXSI+PHhzbDp0ZXh0PgotICAgICAgICAgIDwveHNsOnRleHQ+KiBAcGFyYW0gZHBfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+IC0gb3V0cHV0IGhlYWRlcjwveHNsOmZvci1lYWNoPgotICAgICAgICAgICogQHJldHVybiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG91dHB1dHR5cGUiLz4KLSAgICAgICAgICAqLwotICAgICAgICAgYXhpczJfc3RhdHVzX3QgQVhJUzJfQ0FMTAotICAgICAgICAgYXhpczJfc3R1Yl9vcF88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHNlcnZpY2VuYW1lIi8+Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjx4c2w6dGV4dD4oIGF4aXMyX3N0dWJfdCAqc3R1YiwgY29uc3QgYXh1dGlsX2Vudl90ICplbnY8L3hzbDp0ZXh0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW5wdXRwYXJhbXMiLz4pCi0gICAgICAgICB7Ci0gICAgICAgICAgICBheGlzMl9zdGF0dXNfdCBzdGF0dXM7Ci0KLSAgICAgICAgICAgIGF4aXMyX3N2Y19jbGllbnRfdCAqc3ZjX2NsaWVudCA9IE5VTEw7Ci0gICAgICAgICAgICBheGlzMl9vcHRpb25zX3QgKm9wdGlvbnMgPSBOVUxMOwotCi0gICAgICAgICAgICBjb25zdCBheGlzMl9jaGFyX3QgKnNvYXBfYWN0aW9uID0gTlVMTDsKLSAgICAgICAgICAgIGF4dXRpbF9xbmFtZV90ICpvcF9xbmFtZSA9ICBOVUxMOwotICAgICAgICAgICAgYXhpb21fbm9kZV90ICpwYXlsb2FkID0gTlVMTDsKLQotICAgICAgICAgICAgYXh1dGlsX3N0cmluZ190ICpzb2FwX2FjdCA9IE5VTEw7Ci0gICAgICAgICAgICA8eHNsOmlmIHRlc3Q9ImlucHV0L3BhcmFtW0Bsb2NhdGlvbj0nc29hcF9oZWFkZXInXSI+Ci0gICAgICAgICAgICAgICAgYXhpb21fbm9kZV90ICppbnB1dF9oZWFkZXIgPSBOVUxMOwotICAgICAgICAgICAgPC94c2w6aWY+Ci0KLSAgICAgICAgICAgIDwhLS0gZm9yIHNlcnZpY2UgY2xpZW50IGN1cnJlbnRseSBzdXBwcG9ydGVkIG9ubHkgMSBpbnB1dCBwYXJhbSAtLT4KLSAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iZmlyc3RQYXJhbSIgc2VsZWN0PSJpbnB1dC9wYXJhbVsxXSIvPgotCi0KLSAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iJGZpcnN0UGFyYW0vQHR5cGUhPScnIj4KLSAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkZmlyc3RQYXJhbS9Ab3VycyI+Ci0gICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBnZW5lcmF0ZSBmb3IgdW53cmFwcGVkIG1vZGUgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGlzVW53cmFwUGFyYW1ldGVycyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0id3JhcHBlcl9hZGJfb2JqIj53cmFwcGVyX2FkYl9vYmo8L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3Vic3RyaW5nLWJlZm9yZSgkZmlyc3RQYXJhbS9AdHlwZSwgJ190KicpIi8+X3QgKiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHdyYXBwZXJfYWRiX29iaiIvPiA9IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzdWJzdHJpbmctYmVmb3JlKCRmaXJzdFBhcmFtL0B0eXBlLCAnX3QqJykiLz48eHNsOnRleHQ+X2NyZWF0ZV93aXRoX3ZhbHVlcyhlbnY8L3hzbDp0ZXh0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJpbnB1dC9wYXJhbS9AY29tcGxleHR5cGUiPiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzdWJzdHJpbmctYmVmb3JlKGlucHV0L3BhcmFtL0Bjb21wbGV4dHlwZSwgJ190KicpIi8+PHhzbDp0ZXh0Pl9jcmVhdGVfd2l0aF92YWx1ZXMoZW52PC94c2w6dGV4dD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPjx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkZmlyc3RQYXJhbS9wYXJhbVtAdHlwZSE9JyddIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dGV4dD4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD48eHNsOmlmIHRlc3Q9ImlucHV0L3BhcmFtL0Bjb21wbGV4dHlwZSI+KTwveHNsOmlmPik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQgPSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3Vic3RyaW5nLWJlZm9yZSgkZmlyc3RQYXJhbS9AdHlwZSwgJ190KicpIi8+X3NlcmlhbGl6ZSg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHdyYXBwZXJfYWRiX29iaiIvPiwgZW52LCBOVUxMLCBOVUxMLCBBWElTMl9UUlVFLCBOVUxMLCBOVUxMKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQgPSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3Vic3RyaW5nLWJlZm9yZSgkZmlyc3RQYXJhbS9AdHlwZSwgJ190KicpIi8+X3NlcmlhbGl6ZShfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRmaXJzdFBhcmFtL0BuYW1lIi8+LCBlbnYsIE5VTEwsIE5VTEwsIEFYSVMyX1RSVUUsIE5VTEwsIE5VTEwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZCA9IF88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGZpcnN0UGFyYW0vQG5hbWUiLz47Ci0gICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgPC94c2w6aWY+Ci0KLQotICAgICAgICAgICAgc3ZjX2NsaWVudCA9IGF4aXMyX3N0dWJfZ2V0X3N2Y19jbGllbnQoc3R1YiwgZW52ICk7Ci0gICAgICAgICAgICA8IS0tIGhhbmRsaW5nIGhlYWRlciBwYXJhbXMgLS0+Ci0gICAgICAgICAgIAotICAgICAgICAgICAgPCEtLSBhZGRpbmcgaW5wdXQgaGVhZGVycyAtLT4KLSAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJpbnB1dC9wYXJhbVtAbG9jYXRpb249J3NvYXBfaGVhZGVyJ10iPgotICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAb3VycyI+Ci0gICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICA8IS0tIGdlbmVyYXRlIGZvciB1bndyYXBwZWQgbW9kZSAtLT4KLSAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGlzVW53cmFwUGFyYW1ldGVycyI+Ci0gICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJ3cmFwcGVyX2FkYl9vYmoiPndyYXBwZXJfYWRiX29iajwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9IndyYXBwZXJfdHlwZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+PC94c2w6dmFyaWFibGU+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkd3JhcHBlcl90eXBlIi8+IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkd3JhcHBlcl9hZGJfb2JqIi8+ID0gIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzdWJzdHJpbmctYmVmb3JlKCR3cmFwcGVyX3R5cGUsICdfdConKSIvPjx4c2w6dGV4dD5fY3JlYXRlX3dpdGhfdmFsdWVzKGVudjwveHNsOnRleHQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iQGNvbXBsZXh0eXBlIj4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzdWJzdHJpbmctYmVmb3JlKEBjb21wbGV4dHlwZSwgJ190KicpIi8+PHhzbDp0ZXh0Pl9jcmVhdGVfd2l0aF92YWx1ZXMoZW52PC94c2w6dGV4dD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+PHhzbDpmb3ItZWFjaCBzZWxlY3Q9InBhcmFtW0B0eXBlIT0nJ10iPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnRleHQ+LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPjx4c2w6aWYgdGVzdD0iQGNvbXBsZXh0eXBlIj4pPC94c2w6aWY+KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dF9oZWFkZXIgPSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3Vic3RyaW5nLWJlZm9yZSgkd3JhcHBlcl90eXBlLCAnX3QqJykiLz5fc2VyaWFsaXplKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkd3JhcHBlcl9hZGJfb2JqIi8+LCBlbnYsIE5VTEwsIE5VTEwsIEFYSVMyX1RSVUUsIE5VTEwsIE5VTEwpOwotICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRfaGVhZGVyID0gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1iZWZvcmUoQHR5cGUsICdfdConKSIvPl9zZXJpYWxpemUoXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPiwgZW52LCBOVUxMLCBOVUxMLCBBWElTMl9UUlVFLCBOVUxMLCBOVUxMKTsKLSAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICBpbnB1dF9oZWFkZXIgPSBfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+OwotICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgYXhpczJfc3ZjX2NsaWVudF9hZGRfaGVhZGVyKHN2Y19jbGllbnQsIGVudiwgaW5wdXRfaGVhZGVyKTsKLSAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPgotCi0KLSAgICAgICAgICAgIG9wdGlvbnMgPSBheGlzMl9zdHViX2dldF9vcHRpb25zKCBzdHViLCBlbnYpOwotICAgICAgICAgICAgaWYgKCBOVUxMID09IG9wdGlvbnMgKQotICAgICAgICAgICAgeyAKLSAgICAgICAgICAgICAgQVhJUzJfRVJST1JfU0VUKGVudi0+ZXJyb3IsIEFYSVMyX0VSUk9SX0lOVkFMSURfTlVMTF9QQVJBTSwgQVhJUzJfRkFJTFVSRSk7Ci0gICAgICAgICAgICAgIEFYSVMyX0xPR19FUlJPUihlbnYtPmxvZywgQVhJUzJfTE9HX1NJLCAib3B0aW9ucyBpcyBudWxsIGluIHN0dWIiKTsKLSAgICAgICAgICAgICAgcmV0dXJuIEFYSVMyX0ZBSUxVUkU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdmNfY2xpZW50ID0gYXhpczJfc3R1Yl9nZXRfc3ZjX2NsaWVudCAoc3R1YiwgZW52ICk7Ci0gICAgICAgICAgICBzb2FwX2FjdCA9IGF4aXMyX29wdGlvbnNfZ2V0X3NvYXBfYWN0aW9uICggb3B0aW9ucywgZW52ICk7Ci0gICAgICAgICAgICBpZiAoIE5VTEwgPT0gc29hcF9hY3QgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBzb2FwX2FjdGlvbiA9ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHNvYXBBY3Rpb24iLz4iOwotICAgICAgICAgICAgICBzb2FwX2FjdCA9IGF4dXRpbF9zdHJpbmdfY3JlYXRlKGVudiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc29hcEFjdGlvbiIvPiIpOwotICAgICAgICAgICAgICBheGlzMl9vcHRpb25zX3NldF9zb2FwX2FjdGlvbihvcHRpb25zLCBlbnYsIHNvYXBfYWN0KTsgICAgCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJHNvYXBWZXJzaW9uPSdodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUnIj4KLSAgICAgICAgICAgIGF4aXMyX29wdGlvbnNfc2V0X3NvYXBfdmVyc2lvbihvcHRpb25zLCBlbnYsIEFYSU9NX1NPQVAxMiApOwotICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICBheGlzMl9vcHRpb25zX3NldF9zb2FwX3ZlcnNpb24ob3B0aW9ucywgZW52LCBBWElPTV9TT0FQMTEgKTsKLSAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICBvcF9xbmFtZSA9IGF4dXRpbF9xbmFtZV9jcmVhdGUoZW52LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxvY2FscGFydCIvPiIgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWVzcGFjZSIvPiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7Ci0gICAgICAgICAgICBzdGF0dXMgPSAgYXhpczJfc3ZjX2NsaWVudF9zZW5kX3JvYnVzdF93aXRoX29wX3FuYW1lKCBzdmNfY2xpZW50LCBlbnYsIG9wX3FuYW1lLCBwYXlsb2FkKTsKLSAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0KLSAgICAgICAgfQotICAgICAgIDwveHNsOmlmPiA8IS0tIGNsb3NlIGZvciAgdGVzdD0iJG1lcD0naHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC93c2RsL2luLW9ubHknIC0tPgotICAgICA8L3hzbDpmb3ItZWFjaD4gICA8IS0tIGNsb3NlIG9mIGZvci1lYWNoIHNlbGVjdCA9ICJtZXRob2QiIC0tPgotCi0KLSAgICA8eHNsOmlmIHRlc3Q9Im1ldGhvZC9pbnB1dC9wYXJhbVtAbG9jYXRpb249J3NvYXBfaGVhZGVyJ10iPgotICAgICAvKioKLSAgICAgICogZnVuY3Rpb24gdG8gZnJlZSBhbnkgc29hcCBpbnB1dCBoZWFkZXJzIAotICAgICAgKi8KLSAgICA8L3hzbDppZj4KLSAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Im1ldGhvZCI+Ci0gICAgICAgIDx4c2w6aWYgdGVzdD0iaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdzb2FwX2hlYWRlciddIj4KLSAgICAgICAgIHZvaWQgQVhJUzJfQ0FMTAotICAgICAgICAgYXhpczJfc3R1Yl9vcF88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHNlcnZpY2VuYW1lIi8+Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPl9mcmVlX2lucHV0X2hlYWRlcnMoY29uc3QgYXh1dGlsX2Vudl90ICplbnYsIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJpbnB1dC9wYXJhbVtAbG9jYXRpb249J3NvYXBfaGVhZGVyJ10iPjx4c2w6aWYgdGVzdD0icG9zaXRpb24oKSE9MSI+LDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaW5wdXR0eXBlIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGlucHV0dHlwZSIvPjx4c2w6dGV4dD4gXzwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+KQotICAgICAgICAgewotICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImlucHV0L3BhcmFtW0Bsb2NhdGlvbj0nc29hcF9oZWFkZXInXSI+Ci0gICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImhlYWRlcl92YXIiPjx4c2w6dGV4dD5fPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAb3VycyI+Ci0gICAgICAgICAgICAgICAgICAgIGlmKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaGVhZGVyX3ZhciIvPikKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1iZWZvcmUoQHR5cGUsICdfdConKSIvPl9mcmVlKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaGVhZGVyX3ZhciIvPiwgZW52KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgIC8qIHdlIGRvbid0IGhhdmUgYW55dGhpbmcgdG8gZnJlZSBvbiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGhlYWRlcl92YXIiLz4gKi8KLSAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICAgICAgIH0KLSAgICAgICAgPC94c2w6aWY+Ci0gICAgIDwveHNsOmZvci1lYWNoPgotCi0KLSAgICA8eHNsOmlmIHRlc3Q9Im1ldGhvZC9vdXRwdXQvcGFyYW1bQGxvY2F0aW9uPSdzb2FwX2hlYWRlciddIj4KLSAgICAgLyoqCi0gICAgICAqIGZ1bmN0aW9uIHRvIGZyZWUgYW55IHNvYXAgb3V0cHV0IGhlYWRlcnMgCi0gICAgICAqLwotICAgIDwveHNsOmlmPgotICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0ibWV0aG9kIj4KLSAgICAgICAgPHhzbDppZiB0ZXN0PSJvdXRwdXQvcGFyYW1bQGxvY2F0aW9uPSdzb2FwX2hlYWRlciddIj4KLSAgICAgICAgIHZvaWQgQVhJUzJfQ0FMTAotICAgICAgICAgYXhpczJfc3R1Yl9vcF88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHNlcnZpY2VuYW1lIi8+Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPl9mcmVlX291dHB1dF9oZWFkZXJzKGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52LCA8eHNsOmZvci1lYWNoIHNlbGVjdD0ib3V0cHV0L3BhcmFtW0Bsb2NhdGlvbj0nc29hcF9oZWFkZXInXSI+PHhzbDppZiB0ZXN0PSJwb3NpdGlvbigpIT0xIj4sPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJvdXRwdXR0eXBlIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG91dHB1dHR5cGUiLz48eHNsOnRleHQ+IF88L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPikKLSAgICAgICAgIHsKLSAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJvdXRwdXQvcGFyYW1bQGxvY2F0aW9uPSdzb2FwX2hlYWRlciddIj4KLSAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaGVhZGVyX3ZhciI+PHhzbDp0ZXh0Pl88L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBvdXJzIj4KLSAgICAgICAgICAgICAgICAgICAgaWYoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRoZWFkZXJfdmFyIi8+KQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3Vic3RyaW5nLWJlZm9yZShAdHlwZSwgJ190KicpIi8+X2ZyZWUoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRoZWFkZXJfdmFyIi8+LCBlbnYpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgLyogd2UgZG9uJ3QgaGF2ZSBhbnl0aGluZyB0byBmcmVlIG9uIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaGVhZGVyX3ZhciIvPiAqLwotICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPgotICAgICAgICAgfQotICAgICAgICA8L3hzbDppZj4KLSAgICAgPC94c2w6Zm9yLWVhY2g+Ci0KLSAgIDwveHNsOnRlbXBsYXRlPgotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC90ZW1wbGF0ZS9jL3BhY2thZ2UuaHRtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC90ZW1wbGF0ZS9jL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRmMjkzMC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdGVtcGxhdGUvYy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxodG1sPgotPGJvZHk+Ci1UaGlzIHBhY2thZ2UgaXMgYSAibm9uIGNsYXNzIGNvbnRhaW5pbmciIG9uZSB0aGF0IGhhcyB0aGUgeHNsIHRlbXBsYXRlcyBmb3IgdGhlIGMgY2xhc3MgZ2VuZXJhdGlvbgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdGVtcGxhdGUvZ2VuZXJhbC9TZXJ2aWNlWE1MVGVtcGxhdGUueHNsIGIvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL3RlbXBsYXRlL2dlbmVyYWwvU2VydmljZVhNTFRlbXBsYXRlLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTgxMDE4Yi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdGVtcGxhdGUvZ2VuZXJhbC9TZXJ2aWNlWE1MVGVtcGxhdGUueHNsCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iPg0KLSAgICA8eHNsOm91dHB1dCBtZXRob2Q9InhtbCIgaW5kZW50PSJ5ZXMiIG9taXQteG1sLWRlY2xhcmF0aW9uPSJ5ZXMiLz4NCi0NCi0gICAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLyI+DQotICAgICAgICA8eHNsOmNvbW1lbnQ+IFRoaXMgZmlsZSB3YXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBXU0RMIDwveHNsOmNvbW1lbnQ+DQotICAgICAgICA8eHNsOmNvbW1lbnQ+IGJ5IHRoZSBBcGFjaGUgQXhpczIgdmVyc2lvbjogI2F4aXNWZXJzaW9uIyAjdG9kYXkjIDwveHNsOmNvbW1lbnQ+DQotICAgICAgICA8c2VydmljZUdyb3VwPg0KLSAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4NCi0gICAgICAgIDwvc2VydmljZUdyb3VwPg0KLSAgICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gICAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iaW50ZXJmYWNlcy9pbnRlcmZhY2UiPg0KLSAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJwYWNrYWdlIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGNsYXNzcGFja2FnZSIvPjwveHNsOnZhcmlhYmxlPg0KLQ0KLSAgICAgICAgPHNlcnZpY2U+DQotICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0ibmFtZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBzZXJ2aWNlbmFtZSIvPjwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8bWVzc2FnZVJlY2VpdmVycz4NCi0gICAgICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Im1lc3NhZ2VyZWNlaXZlciI+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9Ii4iPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxtZXNzYWdlUmVjZWl2ZXI+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9Im1lcCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBtZXBVUkkiLz48L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRwYWNrYWdlPScnIj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4iLz48L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcGFja2FnZSIvPi48eHNsOnZhbHVlLW9mIHNlbGVjdD0iLiIvPjwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvbWVzc2FnZVJlY2VpdmVyPg0KLSAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+DQotICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPg0KLSAgICAgICAgICAgICA8L21lc3NhZ2VSZWNlaXZlcnM+DQotDQotICAgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJTZXJ2aWNlQ2xhc3MiPg0KLSAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkcGFja2FnZT0nJyI+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+DQotICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwYWNrYWdlIi8+Ljx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPg0KLSAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+DQotICAgICAgICAgICAgPC9wYXJhbWV0ZXI+DQotICAgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJ1c2VPcmlnaW5hbHdzZGwiPnRydWU8L3BhcmFtZXRlcj4NCi0gICAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9Im1vZGlmeVVzZXJXU0RMUG9ydEFkZHJlc3MiPnRydWU8L3BhcmFtZXRlcj4NCi0gICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0ibWV0aG9kIj4NCi0JCQkJPG9wZXJhdGlvbj4NCi0JCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9Im5hbWUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAb3JpZ2luYWxOYW1lIi8+PC94c2w6YXR0cmlidXRlPg0KLQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ibWVwIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG1lcFVSSSIvPjwveHNsOmF0dHJpYnV0ZT4NCi0JCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9Im5hbWVzcGFjZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lc3BhY2UiLz48L3hzbDphdHRyaWJ1dGU+DQotCQkJCQk8YWN0aW9uTWFwcGluZz4NCi0JCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHNvYXBhY3Rpb24iLz4NCi0JCQkJCTwvYWN0aW9uTWFwcGluZz4NCi0JCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJvdXRwdXRBY3Rpb25NYXBwaW5nIj4NCi0JCQkJCTxvdXRwdXRBY3Rpb25NYXBwaW5nPg0KLQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAQWN0aW9uIi8+DQotCQkJCQk8L291dHB1dEFjdGlvbk1hcHBpbmc+DQotCQkJCQk8L3hzbDpmb3ItZWFjaD4NCi0JCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJmYXVsdEFjdGlvbk1hcHBpbmciPg0KLQkJCQkJPGZhdWx0QWN0aW9uTWFwcGluZz4NCi0JCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJmYXVsdE5hbWUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAZmF1bHROYW1lIi8+PC94c2w6YXR0cmlidXRlPg0KLQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAQWN0aW9uIi8+DQotCQkJCQk8L2ZhdWx0QWN0aW9uTWFwcGluZz4NCi0JCQkJCTwveHNsOmZvci1lYWNoPg0KLQkJCQk8L29wZXJhdGlvbj4NCi0JCQk8L3hzbDpmb3ItZWFjaD4NCi0gICAgICAgIDwvc2VydmljZT4NCi0gICAgPC94c2w6dGVtcGxhdGU+DQotPC94c2w6c3R5bGVzaGVldD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdGVtcGxhdGUvZ2VuZXJhbC9hZGJBbnRCdWlsZFRlbXBsYXRlLnhzbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC90ZW1wbGF0ZS9nZW5lcmFsL2FkYkFudEJ1aWxkVGVtcGxhdGUueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDBjZjM2Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC90ZW1wbGF0ZS9nZW5lcmFsL2FkYkFudEJ1aWxkVGVtcGxhdGUueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMjY5ICswLDAgQEAKLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIj4NCi0gICAgPHhzbDpvdXRwdXQgbWV0aG9kPSJ4bWwiIGluZGVudD0ieWVzIiBvbWl0LXhtbC1kZWNsYXJhdGlvbj0ieWVzIi8+DQotICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii9hbnQiPg0KLSAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJwYWNrYWdlIiBzZWxlY3Q9IkBwYWNrYWdlIi8+DQotICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InNyYyIgc2VsZWN0PSJAc3JjIi8+DQotICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InJlc291cmNlIiBzZWxlY3Q9IkByZXNvdXJjZSIvPg0KLQ0KLSAgICAgICAgPHByb2plY3QgYmFzZWRpcj0iLiI+DQotICAgICAgICAgICAgPHhzbDpjaG9vc2U+DQotICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAaXNzZXJ2ZXJzaWRlIj4NCi0gICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZGVmYXVsdCI+amFyLnNlcnZlcjwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgPC94c2w6d2hlbj4NCi0gICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJkZWZhdWx0Ij5qYXIuY2xpZW50PC94c2w6YXR0cmlidXRlPiANCi0gICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPg0KLSAgICAgICAgICAgIDwveHNsOmNob29zZT4NCi0NCi0gICAgICAgICAgICA8eHNsOmNvbW1lbnQ+QXV0byBnZW5lcmF0ZWQgYW50IGJ1aWxkIGZpbGU8L3hzbDpjb21tZW50Pg0KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBlbnZpcm9ubWVudD0iZW52Ii8+DQotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImF4aXMyLmhvbWUiPg0KLSAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSI+JHtlbnYuQVhJUzJfSE9NRX08L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgPC9wcm9wZXJ0eT4NCi0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0icHJvamVjdC5iYXNlLmRpciI+DQotICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InZhbHVlIj4uPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgIDwvcHJvcGVydHk+DQotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im1hdmVuLmNsYXNzLnBhdGgiPg0KLSAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSI+PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgIDwvcHJvcGVydHk+DQotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im5hbWUiPg0KLSAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBhcnRpZmFjdG5hbWUiLz48L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgPC9wcm9wZXJ0eT4NCi0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ic3JjIj4NCi0gICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiPiR7cHJvamVjdC5iYXNlLmRpcn0vPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzcmMiLz48L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgPC9wcm9wZXJ0eT4NCi0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idGVzdCI+DQotICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InZhbHVlIj4ke3Byb2plY3QuYmFzZS5kaXJ9L3Rlc3Q8L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgPC9wcm9wZXJ0eT4NCi0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iYnVpbGQiPg0KLSAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSI+JHtwcm9qZWN0LmJhc2UuZGlyfS9idWlsZDwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8L3Byb3BlcnR5Pg0KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjbGFzc2VzIj4NCi0gICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiPiR7YnVpbGR9L2NsYXNzZXM8L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgPC9wcm9wZXJ0eT4NCi0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ibGliIj4NCi0gICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiPiR7YnVpbGR9L2xpYjwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8L3Byb3BlcnR5Pg0KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXNvdXJjZXMiPg0KLSAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSI+JHtwcm9qZWN0LmJhc2UuZGlyfS88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlc291cmNlIi8+PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgIDwvcHJvcGVydHk+DQotDQotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImphcnMub2siIHZhbHVlPSIiPjwvcHJvcGVydHk+DQotDQotICAgICAgICAgICAgPHBhdGggaWQ9ImF4aXMyLmNsYXNzLnBhdGgiPg0KLSAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQ+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJwYXRoIj4ke2phdmEuY2xhc3MucGF0aH08L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgIDwvcGF0aGVsZW1lbnQ+DQotICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudD4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InBhdGgiPiR7bWF2ZW4uY2xhc3MucGF0aH08L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgIDwvcGF0aGVsZW1lbnQ+DQotICAgICAgICAgICAgICAgIDxmaWxlc2V0Pg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZGlyIj4ke2F4aXMyLmhvbWV9PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0ibmFtZSI+bGliLyouamFyPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgPC9pbmNsdWRlPg0KLSAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+DQotICAgICAgICAgICAgPC9wYXRoPg0KLQ0KLSAgICAgICAgICAgIDx0YXJnZXQgbmFtZT0iaW5pdCI+DQotICAgICAgICAgICAgICAgIDxta2Rpcj4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImRpciI+JHtidWlsZH08L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgIDwvbWtkaXI+DQotICAgICAgICAgICAgICAgIDxta2Rpcj4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImRpciI+JHtjbGFzc2VzfTwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgPC9ta2Rpcj4NCi0gICAgICAgICAgICAgICAgPG1rZGlyPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZGlyIj4ke2xpYn08L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgIDwvbWtkaXI+DQotICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0ibm90KEB0ZXN0T21pdCkiPg0KLSAgICAgICAgICAgICAgICAgICAgPG1rZGlyPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImRpciI+JHt0ZXN0fTwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgIDwvbWtkaXI+DQotICAgICAgICAgICAgICAgIDwveHNsOmlmPg0KLSAgICAgICAgICAgIDwvdGFyZ2V0Pg0KLQ0KLSAgICAgICAgICAgIDx0YXJnZXQgbmFtZT0icHJlLmNvbXBpbGUudGVzdCIgZGVwZW5kcz0iaW5pdCI+DQotICAgICAgICAgICAgICAgIDx4c2w6Y29tbWVudD5UZXN0IHRoZSBjbGFzc3BhdGggZm9yIHRoZSBhdmFpbGFiaWxpdHkgb2YgbmVjZXNhcnkgY2xhc3NlczwveHNsOmNvbW1lbnQ+DQotDQotICAgICAgICAgICAgICAgIDxhdmFpbGFibGUgY2xhc3NuYW1lPSJqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciIgcHJvcGVydHk9InN0YXguYXZhaWxhYmxlIiBjbGFzc3BhdGhyZWY9ImF4aXMyLmNsYXNzLnBhdGgiLz4NCi0gICAgICAgICAgICAgICAgPGF2YWlsYWJsZSBjbGFzc25hbWU9Im9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNFbmdpbmUiIHByb3BlcnR5PSJheGlzMi5hdmFpbGFibGUiIGNsYXNzcGF0aHJlZj0iYXhpczIuY2xhc3MucGF0aCIvPg0KLSAgICAgICAgICAgICAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJqYXJzLm9rIj4NCi0gICAgICAgICAgICAgICAgICAgIDxhbmQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGlzc2V0IHByb3BlcnR5PSJzdGF4LmF2YWlsYWJsZSIvPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpc3NldCBwcm9wZXJ0eT0iYXhpczIuYXZhaWxhYmxlIi8+DQotICAgICAgICAgICAgICAgICAgICA8L2FuZD4NCi0gICAgICAgICAgICAgICAgPC9jb25kaXRpb24+DQotDQotICAgICAgICAgICAgICAgIDx4c2w6Y29tbWVudD5QcmludCBvdXQgdGhlIGF2YWlsYWJpbGl0aWVzPC94c2w6Y29tbWVudD4NCi0gICAgICAgICAgICAgICAgPGVjaG8+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJtZXNzYWdlIj5TdGF4IEF2YWlsYWJpbGl0eT0gJHtzdGF4LmF2YWlsYWJsZX08L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgIDwvZWNobz4NCi0gICAgICAgICAgICAgICAgPGVjaG8+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJtZXNzYWdlIj5BeGlzMiBBdmFpbGFiaWxpdHk9ICR7YXhpczIuYXZhaWxhYmxlfTwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgPC9lY2hvPg0KLQ0KLSAgICAgICAgICAgIDwvdGFyZ2V0Pg0KLQ0KLSAgICAgICAgICAgIDx0YXJnZXQgbmFtZT0iY29tcGlsZS5zcmMiIGRlcGVuZHM9InByZS5jb21waWxlLnRlc3QiPg0KLSAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJpZiI+amFycy5vazwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgPGphdmFjIGZvcms9InRydWUiIG1lbW9yeUluaXRpYWxTaXplPSIyNTZtIiBtZW1vcnlNYXhpbXVtU2l6ZT0iMjU2bSIgZGVidWc9Im9uIj4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImRlc3RkaXIiPiR7Y2xhc3Nlc308L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJzcmNkaXIiPiR7c3JjfTwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgIDxjbGFzc3BhdGg+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0icmVmaWQiPmF4aXMyLmNsYXNzLnBhdGg8L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICA8L2NsYXNzcGF0aD4NCi0gICAgICAgICAgICAgICAgPC9qYXZhYz4NCi0gICAgICAgICAgICA8L3RhcmdldD4NCi0NCi0gICAgICAgICAgICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUudGVzdCIgZGVwZW5kcz0iY29tcGlsZS5zcmMiPg0KLSAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJpZiI+amFycy5vazwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgPGphdmFjIGZvcms9InRydWUiIG1lbW9yeUluaXRpYWxTaXplPSIyNTZtIiBtZW1vcnlNYXhpbXVtU2l6ZT0iMjU2bSIgZGVidWc9Im9uIj4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImRlc3RkaXIiPiR7Y2xhc3Nlc308L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICA8c3JjPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InBhdGgiPiR7dGVzdH08L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICA8L3NyYz4NCi0gICAgICAgICAgICAgICAgICAgIDxjbGFzc3BhdGg+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0icmVmaWQiPmF4aXMyLmNsYXNzLnBhdGg8L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICA8L2NsYXNzcGF0aD4NCi0gICAgICAgICAgICAgICAgPC9qYXZhYz4NCi0gICAgICAgICAgICA8L3RhcmdldD4NCi0NCi0gICAgICAgICAgICA8dGFyZ2V0IG5hbWU9ImVjaG8uY2xhc3NwYXRoLnByb2JsZW0iIGRlcGVuZHM9InByZS5jb21waWxlLnRlc3QiPg0KLSAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ1bmxlc3MiPmphcnMub2s8L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgIDxlY2hvIG1lc3NhZ2U9IlRoZSBjbGFzcyBwYXRoIGlzIG5vdCBzZXQgcmlnaHQhDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBsZWFzZSBtYWtlIHN1cmUgdGhlIGZvbGxvd2luZyBjbGFzc2VzIGFyZSBpbiB0aGUgY2xhc3NwYXRoDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuIFhtbEJlYW5zDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuIFN0YXgNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMy4gQXhpczINCi0gICAgICAgICAgICAgICAgIj48L2VjaG8+DQotICAgICAgICAgICAgPC90YXJnZXQ+DQotICAgICAgICAgICAgPHRhcmdldCBuYW1lPSJqYXIuYWxsIiBkZXBlbmRzPSJqYXIuc2VydmVyLCBqYXIuY2xpZW50Ij4NCi0gICAgICAgICAgICA8L3RhcmdldD4NCi0gICAgICAgICAgICA8dGFyZ2V0IG5hbWU9Imphci5zZXJ2ZXIiIGRlcGVuZHM9ImNvbXBpbGUuc3JjLGVjaG8uY2xhc3NwYXRoLnByb2JsZW0iPg0KLSAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJpZiI+amFycy5vazwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgPGNvcHk+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ0b0RpciI+JHtjbGFzc2VzfS9NRVRBLUlORjwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImZhaWxvbmVycm9yIj5mYWxzZTwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0Pg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImRpciI+JHtyZXNvdXJjZXN9PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPjx4c2w6YXR0cmlidXRlIG5hbWU9Im5hbWUiPioueG1sPC94c2w6YXR0cmlidXRlPjwvaW5jbHVkZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT48eHNsOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIj4qLndzZGw8L3hzbDphdHRyaWJ1dGU+PC9pbmNsdWRlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPjx4c2w6YXR0cmlidXRlIG5hbWU9Im5hbWUiPioueHNkPC94c2w6YXR0cmlidXRlPjwvaW5jbHVkZT4NCi0gICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4NCi0gICAgICAgICAgICAgICAgPC9jb3B5Pg0KLSAgICAgICAgICAgICAgICA8amFyPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZGVzdGZpbGUiPiR7bGlifS8ke25hbWV9LmFhcjwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0Pg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImV4Y2x1ZGVzIj4qKi9UZXN0LmNsYXNzPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImRpciI+JHtjbGFzc2VzfTwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4NCi0gICAgICAgICAgICAgICAgPC9qYXI+DQotICAgICAgICAgICAgPC90YXJnZXQ+DQotDQotICAgICAgICAgICAgPCEtLSBzZWxlY3QgYmV0d2VlbiB0aGUgLS0+DQotDQotICAgICAgICAgICAgPHRhcmdldCBuYW1lPSJqYXIuY2xpZW50IiBpZj0iamFycy5vayI+DQotICAgICAgICAgICAgICAgICA8IS0tc2V0IHRoZSBjb3JyZWN0IGRlcGVuZHMgdGFyZ2V0LS0+DQotICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkB0ZXN0T21pdCI+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZGVwZW5kcyI+Y29tcGlsZS5zcmM8L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZGVwZW5kcyI+Y29tcGlsZS50ZXN0PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPg0KLSAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+DQotICAgICAgICAgICAgICAgIDxqYXI+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJkZXN0ZmlsZSI+JHtsaWJ9LyR7bmFtZX0tdGVzdC1jbGllbnQuamFyPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZGlyIj4ke2NsYXNzZXN9PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPjx4c2w6YXR0cmlidXRlIG5hbWU9Im5hbWUiPioqL01FVEEtSU5GLyouKjwveHNsOmF0dHJpYnV0ZT48L2V4Y2x1ZGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+PHhzbDphdHRyaWJ1dGUgbmFtZT0ibmFtZSI+KiovbGliLyouKjwveHNsOmF0dHJpYnV0ZT48L2V4Y2x1ZGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+PHhzbDphdHRyaWJ1dGUgbmFtZT0ibmFtZSI+KiovKk1lc3NhZ2VSZWNlaXZlci5jbGFzczwveHNsOmF0dHJpYnV0ZT48L2V4Y2x1ZGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+PHhzbDphdHRyaWJ1dGUgbmFtZT0ibmFtZSI+KiovKlNrZWxldG9uLmNsYXNzPC94c2w6YXR0cmlidXRlPjwvZXhjbHVkZT4NCi0gICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4NCi0gICAgICAgICAgICAgICAgPC9qYXI+DQotICAgICAgICAgICAgPC90YXJnZXQ+DQotDQotDQotDQotDQotICAgICAgICAgICAgPHRhcmdldCBuYW1lPSJtYWtlLnJlcG8iIGRlcGVuZHM9Imphci5zZXJ2ZXIiIGlmPSJqYXJzLm9rIj4NCi0gICAgICAgICAgICAgICAgPG1rZGlyPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZGlyIj4ke2J1aWxkfS9yZXBvLzwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgPC9ta2Rpcj4NCi0gICAgICAgICAgICAgICAgPG1rZGlyPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZGlyIj4ke2J1aWxkfS9yZXBvL3NlcnZpY2VzPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICA8L21rZGlyPg0KLSAgICAgICAgICAgICAgICA8Y29weT4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImZpbGUiPiR7YnVpbGR9L2xpYi8ke25hbWV9LmFhcjwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InRvRGlyIj4ke2J1aWxkfS9yZXBvL3NlcnZpY2VzLzwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgPC9jb3B5Pg0KLSAgICAgICAgICAgIDwvdGFyZ2V0Pg0KLSAgICAgICAgICAgIDx0YXJnZXQgbmFtZT0ic3RhcnQuc2VydmVyIiBkZXBlbmRzPSJtYWtlLnJlcG8iIGlmPSJqYXJzLm9rIj4NCi0gICAgICAgICAgICAgICAgPGphdmEgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLlNpbXBsZUhUVFBTZXJ2ZXIiIGZvcms9InRydWUiPg0KLSAgICAgICAgICAgICAgICAgICAgPGFyZz4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSI+JHtidWlsZH0vcmVwbzwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgIDwvYXJnPg0KLSAgICAgICAgICAgICAgICAgICAgPGNsYXNzcGF0aD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJyZWZpZCI+YXhpczIuY2xhc3MucGF0aDwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgIDwvY2xhc3NwYXRoPg0KLSAgICAgICAgICAgICAgICA8L2phdmE+DQotICAgICAgICAgICAgPC90YXJnZXQ+DQotICAgICAgICAgICAgPHRhcmdldCBuYW1lPSJydW4udGVzdCIgZGVwZW5kcz0iY29tcGlsZS50ZXN0IiBpZj0iamFycy5vayI+DQotICAgICAgICAgICAgICAgIDxwYXRoIGlkPSJ0ZXN0LmNsYXNzLnBhdGgiPg0KLSAgICAgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50Pg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImxvY2F0aW9uIj4ke2xpYn0vJHtuYW1lfS10ZXN0LWNsaWVudC5qYXI8L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICA8L3BhdGhlbGVtZW50Pg0KLSAgICAgICAgICAgICAgICAgICAgPHBhdGg+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0icmVmaWQiPmF4aXMyLmNsYXNzLnBhdGg8L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICA8L3BhdGg+DQotICAgICAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0ibG9jYXRpb24iPiR7Y2xhc3Nlc308L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICA8L3BhdGhlbGVtZW50Pg0KLSAgICAgICAgICAgICAgICA8L3BhdGg+DQotICAgICAgICAgICAgICAgIDxta2Rpcj4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImRpciI+JHtidWlsZH0vdGVzdC1yZXBvcnRzLzwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgPC9ta2Rpcj4NCi0gICAgICAgICAgICAgICAgPGp1bml0IHByaW50c3VtbWFyeT0ieWVzIiBoYWx0b25mYWlsdXJlPSJ5ZXMiPg0KLSAgICAgICAgICAgICAgICAgICAgPGNsYXNzcGF0aD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJyZWZpZCI+dGVzdC5jbGFzcy5wYXRoPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgPC9jbGFzc3BhdGg+DQotICAgICAgICAgICAgICAgICAgICA8Zm9ybWF0dGVyIHR5cGU9InBsYWluIi8+DQotICAgICAgICAgICAgICAgICAgICA8YmF0Y2h0ZXN0IGZvcms9InllcyI+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0idG9EaXIiPiR7YnVpbGR9L3Rlc3QtcmVwb3J0cy88L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImRpciI+JHt0ZXN0fTwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIj4qKi8qVGVzdCouamF2YTwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9pbmNsdWRlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4NCi0gICAgICAgICAgICAgICAgICAgIDwvYmF0Y2h0ZXN0Pg0KLSAgICAgICAgICAgICAgICA8L2p1bml0Pg0KLSAgICAgICAgICAgIDwvdGFyZ2V0Pg0KLSAgICAgICAgICAgIDx0YXJnZXQgbmFtZT0iY2xlYW4iPg0KLSAgICAgICAgICAgICAgICA8ZGVsZXRlPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZGlyIj4ke2J1aWxkfTwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgPC9kZWxldGU+DQotICAgICAgICAgICAgPC90YXJnZXQ+DQotICAgICAgICA8L3Byb2plY3Q+DQotICAgIDwveHNsOnRlbXBsYXRlPg0KLTwveHNsOnN0eWxlc2hlZXQ+DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL3RlbXBsYXRlL2dlbmVyYWwvZGVmYXVsdEFudEJ1aWxkVGVtcGxhdGUueHNsIGIvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL3RlbXBsYXRlL2dlbmVyYWwvZGVmYXVsdEFudEJ1aWxkVGVtcGxhdGUueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OWMxYWMxLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC90ZW1wbGF0ZS9nZW5lcmFsL2RlZmF1bHRBbnRCdWlsZFRlbXBsYXRlLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDIxOCArMCwwIEBACi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIiB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSI+DQotICAgIDx4c2w6b3V0cHV0IG1ldGhvZD0ieG1sIiBpbmRlbnQ9InllcyIgb21pdC14bWwtZGVjbGFyYXRpb249InllcyIvPg0KLSAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvYW50Ij4NCi0gICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icGFja2FnZSIgc2VsZWN0PSJAcGFja2FnZSIvPg0KLSAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJzcmMiIHNlbGVjdD0iQHNyYyIvPg0KLSAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJyZXNvdXJjZSIgc2VsZWN0PSJAcmVzb3VyY2UiLz4NCi0NCi0gICAgICAgIDxwcm9qZWN0IGJhc2VkaXI9Ii4iPg0KLSAgICAgICAgICAgICA8eHNsOmNob29zZT4NCi0gICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBpc3NlcnZlcnNpZGUiPg0KLSAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJkZWZhdWx0Ij5qYXIuc2VydmVyPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPg0KLSAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImRlZmF1bHQiPmphci5jbGllbnQ8L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4NCi0gICAgICAgICAgICA8L3hzbDpjaG9vc2U+DQotDQotICAgICAgICAgICAgPHhzbDpjb21tZW50PkF1dG8gZ2VuZXJhdGVkIGFudCBidWlsZCBmaWxlPC94c2w6Y29tbWVudD4NCi0gICAgICAgICAgICA8cHJvcGVydHkgZW52aXJvbm1lbnQ9ImVudiIvPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJheGlzMi5ob21lIj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiPiR7ZW52LkFYSVMyX0hPTUV9PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+DQotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InByb2plY3QuYmFzZS5kaXIiPg0KLSAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSI+LjwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8L3Byb3BlcnR5Pg0KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzcmMiPg0KLSAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSI+JHtwcm9qZWN0LmJhc2UuZGlyfS88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHNyYyIvPjwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8L3Byb3BlcnR5Pg0KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0Ij4NCi0gICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiPiR7cHJvamVjdC5iYXNlLmRpcn0vdGVzdDwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8L3Byb3BlcnR5Pg0KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZCI+DQotICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InZhbHVlIj4ke3Byb2plY3QuYmFzZS5kaXJ9L2J1aWxkPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgIDwvcHJvcGVydHk+DQotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImNsYXNzZXMiPg0KLSAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSI+JHtidWlsZH0vY2xhc3NlczwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8L3Byb3BlcnR5Pg0KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJsaWIiPg0KLSAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSI+JHtidWlsZH0vbGliPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgIDwvcHJvcGVydHk+DQotICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXNvdXJjZXMiPg0KLSAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSI+JHtwcm9qZWN0LmJhc2UuZGlyfS88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlc291cmNlIi8+PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgIDwvcHJvcGVydHk+DQotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im5hbWUiPg0KLSAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBhcnRpZmFjdG5hbWUiLz48L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgPC9wcm9wZXJ0eT4NCi0NCi0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iamFycy5vayIgdmFsdWU9IiI+PC9wcm9wZXJ0eT4NCi0NCi0gICAgICAgICAgICA8cGF0aCBpZD0iYXhpczIuY2xhc3MucGF0aCI+DQotICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudD4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InBhdGgiPiR7amF2YS5jbGFzcy5wYXRofTwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgPC9wYXRoZWxlbWVudD4NCi0gICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50Pg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0icGF0aCI+JHttYXZlbi5jbGFzcy5wYXRofTwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgPC9wYXRoZWxlbWVudD4NCi0gICAgICAgICAgICAgICAgPGZpbGVzZXQ+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJkaXIiPiR7YXhpczIuaG9tZX08L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIj5saWIvKi5qYXI8L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICA8L2luY2x1ZGU+DQotICAgICAgICAgICAgICAgIDwvZmlsZXNldD4NCi0gICAgICAgICAgICA8L3BhdGg+DQotDQotICAgICAgICAgICAgPHRhcmdldCBuYW1lPSJpbml0Ij4NCi0gICAgICAgICAgICAgICAgPG1rZGlyPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZGlyIj4ke2J1aWxkfTwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgPC9ta2Rpcj4NCi0gICAgICAgICAgICAgICAgPG1rZGlyPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZGlyIj4ke2NsYXNzZXN9PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICA8L21rZGlyPg0KLSAgICAgICAgICAgICAgICA8bWtkaXI+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJkaXIiPiR7bGlifTwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgPC9ta2Rpcj4NCi0gICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJub3QoQHRlc3RPbWl0KSI+DQotICAgICAgICAgICAgICAgICAgICA8bWtkaXI+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZGlyIj4ke3Rlc3R9PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgPC9ta2Rpcj4NCi0gICAgICAgICAgICAgICAgPC94c2w6aWY+DQotICAgICAgICAgICAgPC90YXJnZXQ+DQotDQotICAgICAgICAgICAgPHRhcmdldCBuYW1lPSJwcmUuY29tcGlsZS50ZXN0IiBkZXBlbmRzPSJpbml0Ij4NCi0gICAgICAgICAgICAgICAgPHhzbDpjb21tZW50PlRlc3QgdGhlIGNsYXNzcGF0aCBmb3IgdGhlIGF2YWlsYWJpbGl0eSBvZiBuZWNlc2FyeSBjbGFzc2VzPC94c2w6Y29tbWVudD4NCi0NCi0gICAgICAgICAgICAgICAgPGF2YWlsYWJsZSBjbGFzc25hbWU9ImphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIiBwcm9wZXJ0eT0ic3RheC5hdmFpbGFibGUiLz4NCi0gICAgICAgICAgICAgICAgPGF2YWlsYWJsZSBjbGFzc25hbWU9Im9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNFbmdpbmUiIHByb3BlcnR5PSJheGlzMi5hdmFpbGFibGUiLz4NCi0gICAgICAgICAgICAgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0iamFycy5vayIgPg0KLSAgICAgICAgICAgICAgICAgICAgPGFuZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8aXNzZXQgcHJvcGVydHk9InN0YXguYXZhaWxhYmxlIi8+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGlzc2V0IHByb3BlcnR5PSJheGlzMi5hdmFpbGFibGUiLz4NCi0gICAgICAgICAgICAgICAgICAgIDwvYW5kPg0KLSAgICAgICAgICAgICAgICA8L2NvbmRpdGlvbj4NCi0NCi0gICAgICAgICAgICAgICAgPHhzbDpjb21tZW50PlByaW50IG91dCB0aGUgYXZhaWxhYmlsaXRpZXM8L3hzbDpjb21tZW50Pg0KLSAgICAgICAgICAgICAgICA8ZWNobz4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9Im1lc3NhZ2UiPlN0YXggQXZhaWxhYmlsaXR5PSAke3N0YXguYXZhaWxhYmxlfTwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgPC9lY2hvPg0KLSAgICAgICAgICAgICAgICA8ZWNobz4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9Im1lc3NhZ2UiPkF4aXMyIEF2YWlsYWJpbGl0eT0gJHtheGlzMi5hdmFpbGFibGV9PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICA8L2VjaG8+DQotDQotICAgICAgICAgICAgPC90YXJnZXQ+DQotDQotICAgICAgICAgICAgPHRhcmdldCBuYW1lPSJjb21waWxlLnNyYyIgZGVwZW5kcz0iZWNoby5jbGFzc3BhdGgucHJvYmxlbSI+DQotICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImlmIj5qYXJzLm9rPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICA8amF2YWMgZm9yaz0idHJ1ZSIgbWVtb3J5SW5pdGlhbFNpemU9IjI1Nm0iIG1lbW9yeU1heGltdW1TaXplPSIyNTZtIiBkZWJ1Zz0ib24iPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZGVzdGRpciI+JHtjbGFzc2VzfTwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InNyY2RpciI+JHtzcmN9PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgPGNsYXNzcGF0aD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJyZWZpZCI+YXhpczIuY2xhc3MucGF0aDwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgIDwvY2xhc3NwYXRoPg0KLSAgICAgICAgICAgICAgICA8L2phdmFjPg0KLSAgICAgICAgICAgIDwvdGFyZ2V0Pg0KLQ0KLSAgICAgICAgICAgIDx0YXJnZXQgbmFtZT0iY29tcGlsZS50ZXN0IiBkZXBlbmRzPSJjb21waWxlLnNyYyI+DQotICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImlmIj5qYXJzLm9rPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICA8amF2YWMgZm9yaz0idHJ1ZSIgbWVtb3J5SW5pdGlhbFNpemU9IjI1Nm0iIG1lbW9yeU1heGltdW1TaXplPSIyNTZtIiBkZWJ1Zz0ib24iPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZGVzdGRpciI+JHtjbGFzc2VzfTwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InNyY2RpciI+JHt0ZXN0fTwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgIDxjbGFzc3BhdGg+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0icmVmaWQiPmF4aXMyLmNsYXNzLnBhdGg8L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICA8L2NsYXNzcGF0aD4NCi0gICAgICAgICAgICAgICAgPC9qYXZhYz4NCi0gICAgICAgICAgICA8L3RhcmdldD4NCi0NCi0gICAgICAgICAgICA8dGFyZ2V0IG5hbWU9ImVjaG8uY2xhc3NwYXRoLnByb2JsZW0iIGRlcGVuZHM9InByZS5jb21waWxlLnRlc3QiPg0KLSAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ1bmxlc3MiPmphcnMub2s8L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgIDxlY2hvIG1lc3NhZ2U9IlRoZSBjbGFzcyBwYXRoIGlzIG5vdCBzZXQgcmlnaHQhDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBsZWFzZSBtYWtlIHN1cmUgdGhlIGZvbGxvd2luZyBjbGFzc2VzIGFyZSBpbiB0aGUgY2xhc3NwYXRoDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuIFN0YXgNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi4gQXhpczINCi0gICAgICAgICAgICAgICAgIj48L2VjaG8+DQotICAgICAgICAgICAgPC90YXJnZXQ+DQotDQotDQotICAgICAgICAgICAgPHRhcmdldCBuYW1lPSJqYXIuY2xpZW50IiAgaWY9ImphcnMub2siPg0KLSAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQHRlc3RPbWl0Ij4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJkZXBlbmRzIj5jb21waWxlLnNyYzwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJkZXBlbmRzIj5jb21waWxlLnRlc3Q8L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+DQotICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4NCi0gICAgICAgICAgICAgICAgPGphcj4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImRlc3RmaWxlIj4ke2xpYn0vJHtuYW1lfS1jbGllbnQuamFyPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZGlyIj4ke2NsYXNzZXN9PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIj4qKi9NRVRBLUlORi8qLio8L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgPC9leGNsdWRlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIj4qKi9saWIvKi4qPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhjbHVkZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0ibmFtZSI+KiovKk1lc3NhZ2VSZWNlaXZlci5jbGFzczwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L2V4Y2x1ZGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9Im5hbWUiPioqLypTa2VsZXRvbi5jbGFzczwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L2V4Y2x1ZGU+DQotICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+DQotICAgICAgICAgICAgICAgIDwvamFyPg0KLSAgICAgICAgICAgIDwvdGFyZ2V0Pg0KLQ0KLQ0KLQ0KLQ0KLQ0KLSAgICAgICAgICAgIDx0YXJnZXQgbmFtZT0iamFyLnNlcnZlciIgZGVwZW5kcz0iY29tcGlsZS5zcmMsZWNoby5jbGFzc3BhdGgucHJvYmxlbSI+DQotICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImlmIj5qYXJzLm9rPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICA8Y29weT4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InRvRGlyIj4ke2NsYXNzZXN9L01FVEEtSU5GPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZmFpbG9uZXJyb3IiPmZhbHNlPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZGlyIj4ke3Jlc291cmNlc308L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9Im5hbWUiPioueG1sPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvaW5jbHVkZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0ibmFtZSI+Ki53c2RsPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvaW5jbHVkZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0ibmFtZSI+Ki54c2Q8L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgPC9pbmNsdWRlPg0KLSAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0Pg0KLSAgICAgICAgICAgICAgICA8L2NvcHk+DQotICAgICAgICAgICAgICAgIDxqYXI+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJkZXN0ZmlsZSI+JHtsaWJ9LyR7bmFtZX0uYWFyPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZXhjbHVkZXMiPioqL1Rlc3QuY2xhc3M8L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZGlyIj4ke2NsYXNzZXN9PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0Pg0KLSAgICAgICAgICAgICAgICA8L2phcj4NCi0gICAgICAgICAgICA8L3RhcmdldD4NCi0NCi0gICAgICAgICAgICA8dGFyZ2V0IG5hbWU9Imphci5hbGwiIGRlcGVuZHM9Imphci5zZXJ2ZXIsamFyLmNsaWVudCIvPg0KLSAgICAgICAgPC9wcm9qZWN0Pg0KLSAgICA8L3hzbDp0ZW1wbGF0ZT4NCi08L3hzbDpzdHlsZXNoZWV0Pg0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC90ZW1wbGF0ZS9nZW5lcmFsL2pheGJyaUFudEJ1aWxkVGVtcGxhdGUueHNsIGIvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL3RlbXBsYXRlL2dlbmVyYWwvamF4YnJpQW50QnVpbGRUZW1wbGF0ZS54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhMTA5ZmQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL3RlbXBsYXRlL2dlbmVyYWwvamF4YnJpQW50QnVpbGRUZW1wbGF0ZS54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwyNzUgKzAsMCBAQAotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iPg0KLSAgICA8eHNsOm91dHB1dCBtZXRob2Q9InhtbCIgaW5kZW50PSJ5ZXMiIG9taXQteG1sLWRlY2xhcmF0aW9uPSJ5ZXMiLz4NCi0gICAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iL2FudCI+DQotICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InBhY2thZ2UiIHNlbGVjdD0iQHBhY2thZ2UiLz4NCi0gICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ic3JjIiBzZWxlY3Q9IkBzcmMiLz4NCi0gICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icmVzb3VyY2UiIHNlbGVjdD0iQHJlc291cmNlIi8+DQotDQotICAgICAgICA8cHJvamVjdCBiYXNlZGlyPSIuIj4NCi0gICAgICAgICAgICAgPHhzbDpjaG9vc2U+DQotICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAaXNzZXJ2ZXJzaWRlIj4NCi0gICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZGVmYXVsdCI+amFyLnNlcnZlcjwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgPC94c2w6d2hlbj4NCi0gICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJkZWZhdWx0Ij5qYXIuY2xpZW50PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+DQotICAgICAgICAgICAgPC94c2w6Y2hvb3NlPg0KLSAgICAgICAgICAgIDx4c2w6Y29tbWVudD5BdXRvIGdlbmVyYXRlZCBhbnQgYnVpbGQgZmlsZTwveHNsOmNvbW1lbnQ+DQotICAgICAgICAgICAgPHByb3BlcnR5IGVudmlyb25tZW50PSJlbnYiLz4NCi0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iYXhpczIuaG9tZSI+DQotICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InZhbHVlIj4ke2Vudi5BWElTMl9IT01FfTwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8L3Byb3BlcnR5Pg0KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwcm9qZWN0LmJhc2UuZGlyIj4NCi0gICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiPi48L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgPC9wcm9wZXJ0eT4NCi0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ibWF2ZW4uY2xhc3MucGF0aCI+DQotICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InZhbHVlIj48L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgPC9wcm9wZXJ0eT4NCi0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ibmFtZSI+DQotICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InZhbHVlIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHNlcnZpY2VuYW1lIi8+PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgIDwvcHJvcGVydHk+DQotICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzcmMiPg0KLSAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSI+JHtwcm9qZWN0LmJhc2UuZGlyfS88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHNyYyIvPjwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8L3Byb3BlcnR5Pg0KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0Ij4NCi0gICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiPiR7cHJvamVjdC5iYXNlLmRpcn0vdGVzdDwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8L3Byb3BlcnR5Pg0KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZCI+DQotICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InZhbHVlIj4ke3Byb2plY3QuYmFzZS5kaXJ9L2J1aWxkPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgIDwvcHJvcGVydHk+DQotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImNsYXNzZXMiPg0KLSAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSI+JHtidWlsZH0vY2xhc3NlczwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8L3Byb3BlcnR5Pg0KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJsaWIiPg0KLSAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSI+JHtidWlsZH0vbGliPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgIDwvcHJvcGVydHk+DQotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InJlc291cmNlcyI+DQotICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InZhbHVlIj4ke3Byb2plY3QuYmFzZS5kaXJ9Lzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVzb3VyY2UiLz48L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgPC9wcm9wZXJ0eT4NCi0NCi0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ieGJlYW5zLnBhY2thZ2VkLmphci5uYW1lIiB2YWx1ZT0iWEJlYW5zLXBhY2thZ2VkLmphciI+PC9wcm9wZXJ0eT4NCi0NCi0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iamFycy5vayIgdmFsdWU9IiI+PC9wcm9wZXJ0eT4NCi0NCi0gICAgICAgICAgICA8cGF0aCBpZD0iYXhpczIuY2xhc3MucGF0aCI+DQotICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudD4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InBhdGgiPiR7amF2YS5jbGFzcy5wYXRofTwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgPC9wYXRoZWxlbWVudD4NCi0gICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50Pg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0icGF0aCI+JHttYXZlbi5jbGFzcy5wYXRofTwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgPC9wYXRoZWxlbWVudD4NCi0gICAgICAgICAgICAgICAgPGZpbGVzZXQ+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJkaXIiPiR7YXhpczIuaG9tZX08L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIj5saWIvKi5qYXI8L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICA8L2luY2x1ZGU+DQotICAgICAgICAgICAgICAgIDwvZmlsZXNldD4NCi0gICAgICAgICAgICA8L3BhdGg+DQotDQotICAgICAgICAgICAgPHRhcmdldCBuYW1lPSJpbml0Ij4NCi0gICAgICAgICAgICAgICAgPG1rZGlyPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZGlyIj4ke2J1aWxkfTwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgPC9ta2Rpcj4NCi0gICAgICAgICAgICAgICAgPG1rZGlyPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZGlyIj4ke2NsYXNzZXN9PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICA8L21rZGlyPg0KLSAgICAgICAgICAgICAgICA8bWtkaXI+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJkaXIiPiR7bGlifTwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgPC9ta2Rpcj4NCi0gICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJub3QoQHRlc3RPbWl0KSI+DQotICAgICAgICAgICAgICAgICAgICA8bWtkaXI+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZGlyIj4ke3Rlc3R9PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgPC9ta2Rpcj4NCi0gICAgICAgICAgICAgICAgPC94c2w6aWY+DQotDQotICAgICAgICAgICAgPC90YXJnZXQ+DQotDQotICAgICAgICAgICAgPHRhcmdldCBuYW1lPSJwcmUuY29tcGlsZS50ZXN0IiBkZXBlbmRzPSJpbml0Ij4NCi0gICAgICAgICAgICAgICAgPHhzbDpjb21tZW50PlRlc3QgdGhlIGNsYXNzcGF0aCBmb3IgdGhlIGF2YWlsYWJpbGl0eSBvZiBuZWNlc2FyeSBjbGFzc2VzPC94c2w6Y29tbWVudD4NCi0gICAgICAgICAgICAgICAgPGF2YWlsYWJsZSBjbGFzc25hbWU9ImNvbS5zdW4udG9vbHMueGpjLmFwaS5YSkMiIHByb3BlcnR5PSJqYXhicmkuYXZhaWxhYmxlIiBjbGFzc3BhdGhyZWY9ImF4aXMyLmNsYXNzLnBhdGgiLz4NCi0gICAgICAgICAgICAgICAgPGF2YWlsYWJsZSBjbGFzc25hbWU9ImphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIiBwcm9wZXJ0eT0ic3RheC5hdmFpbGFibGUiIGNsYXNzcGF0aHJlZj0iYXhpczIuY2xhc3MucGF0aCIvPg0KLSAgICAgICAgICAgICAgICA8YXZhaWxhYmxlIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0VuZ2luZSIgcHJvcGVydHk9ImF4aXMyLmF2YWlsYWJsZSIgY2xhc3NwYXRocmVmPSJheGlzMi5jbGFzcy5wYXRoIi8+DQotICAgICAgICAgICAgICAgIDxjb25kaXRpb24gcHJvcGVydHk9ImphcnMub2siID4NCi0gICAgICAgICAgICAgICAgICAgIDxhbmQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGlzc2V0IHByb3BlcnR5PSJqYXhicmkuYXZhaWxhYmxlIi8+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGlzc2V0IHByb3BlcnR5PSJzdGF4LmF2YWlsYWJsZSIvPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpc3NldCBwcm9wZXJ0eT0iYXhpczIuYXZhaWxhYmxlIi8+DQotICAgICAgICAgICAgICAgICAgICA8L2FuZD4NCi0gICAgICAgICAgICAgICAgPC9jb25kaXRpb24+DQotDQotICAgICAgICAgICAgICAgIDx4c2w6Y29tbWVudD5QcmludCBvdXQgdGhlIGF2YWlsYWJpbGl0aWVzPC94c2w6Y29tbWVudD4NCi0gICAgICAgICAgICAgICAgPGVjaG8+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJtZXNzYWdlIj5KQVgtQiBSSSBBdmFpbGFiaWxpdHkgPSAke2pheGJyaS5hdmFpbGFibGV9PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICA8L2VjaG8+DQotICAgICAgICAgICAgICAgIDxlY2hvPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0ibWVzc2FnZSI+U3RheCBBdmFpbGFiaWxpdHk9ICR7c3RheC5hdmFpbGFibGV9PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICA8L2VjaG8+DQotICAgICAgICAgICAgICAgIDxlY2hvPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0ibWVzc2FnZSI+QXhpczIgQXZhaWxhYmlsaXR5PSAke2F4aXMyLmF2YWlsYWJsZX08L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgIDwvZWNobz4NCi0NCi0gICAgICAgICAgICA8L3RhcmdldD4NCi0NCi0gICAgICAgICAgICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUuc3JjIiBkZXBlbmRzPSJwcmUuY29tcGlsZS50ZXN0IiA+DQotICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImlmIj5qYXJzLm9rPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICA8amF2YWMgZm9yaz0idHJ1ZSIgbWVtb3J5SW5pdGlhbFNpemU9IjI1Nm0iIG1lbW9yeU1heGltdW1TaXplPSIyNTZtIiBkZWJ1Zz0ib24iPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZGVzdGRpciI+JHtjbGFzc2VzfTwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InNyY2RpciI+JHtzcmN9PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgPGNsYXNzcGF0aD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJyZWZpZCI+YXhpczIuY2xhc3MucGF0aDwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgIDwvY2xhc3NwYXRoPg0KLSAgICAgICAgICAgICAgICA8L2phdmFjPg0KLSAgICAgICAgICAgIDwvdGFyZ2V0Pg0KLQ0KLQ0KLSAgICAgICAgICAgIDx0YXJnZXQgbmFtZT0iY29tcGlsZS50ZXN0IiBkZXBlbmRzPSJjb21waWxlLnNyYyI+DQotICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImlmIj5qYXJzLm9rPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICA8amF2YWMgZm9yaz0idHJ1ZSIgbWVtb3J5SW5pdGlhbFNpemU9IjI1Nm0iIG1lbW9yeU1heGltdW1TaXplPSIyNTZtIiBkZWJ1Zz0ib24iPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZGVzdGRpciI+JHtjbGFzc2VzfTwveHNsOmF0dHJpYnV0ZT4NCi0NCi0gICAgICAgICAgICAgICAgICAgIDxzcmM+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0icGF0aCI+JHt0ZXN0fTwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgIDwvc3JjPg0KLQ0KLSAgICAgICAgICAgICAgICAgICAgPGNsYXNzcGF0aD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJyZWZpZCI+YXhpczIuY2xhc3MucGF0aDwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgIDwvY2xhc3NwYXRoPg0KLQ0KLSAgICAgICAgICAgICAgICAgICAgPCEtLSB0b2RvIC0tPg0KLQ0KLSAgICAgICAgICAgICAgICA8L2phdmFjPg0KLSAgICAgICAgICAgIDwvdGFyZ2V0Pg0KLQ0KLSAgICAgICAgICAgIDx0YXJnZXQgbmFtZT0iZWNoby5jbGFzc3BhdGgucHJvYmxlbSIgZGVwZW5kcz0icHJlLmNvbXBpbGUudGVzdCI+DQotICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InVubGVzcyI+amFycy5vazwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgPGVjaG8gbWVzc2FnZT0iVGhlIGNsYXNzIHBhdGggaXMgbm90IHNldCByaWdodCENCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGxlYXNlIG1ha2Ugc3VyZSB0aGUgZm9sbG93aW5nIGNsYXNzZXMgYXJlIGluIHRoZSBjbGFzc3BhdGgNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4gWG1sQmVhbnMNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi4gU3RheA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLiBBeGlzMg0KLSAgICAgICAgICAgICAgICAiPjwvZWNobz4NCi0gICAgICAgICAgICA8L3RhcmdldD4NCi0gICAgICAgICAgICA8dGFyZ2V0IG5hbWU9Imphci5hbGwiIGRlcGVuZHM9Imphci5zZXJ2ZXIsIGphci5jbGllbnQiPg0KLSAgICAgICAgICAgIDwvdGFyZ2V0Pg0KLSAgICAgICAgICAgIDx0YXJnZXQgbmFtZT0iamFyLnNlcnZlciIgZGVwZW5kcz0iY29tcGlsZS5zcmMsZWNoby5jbGFzc3BhdGgucHJvYmxlbSI+DQotICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImlmIj5qYXJzLm9rPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICA8Y29weT4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InRvRGlyIj4ke2NsYXNzZXN9L01FVEEtSU5GPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZmFpbG9uZXJyb3IiPmZhbHNlPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZGlyIj4ke3Jlc291cmNlc308L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+PHhzbDphdHRyaWJ1dGUgbmFtZT0ibmFtZSI+Ki54bWw8L3hzbDphdHRyaWJ1dGU+PC9pbmNsdWRlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPjx4c2w6YXR0cmlidXRlIG5hbWU9Im5hbWUiPioud3NkbDwveHNsOmF0dHJpYnV0ZT48L2luY2x1ZGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+PHhzbDphdHRyaWJ1dGUgbmFtZT0ibmFtZSI+Kiovc2NoZW1hb3JnX2FwYWNoZV94bWxiZWFuLyoqPC94c2w6YXR0cmlidXRlPjwvZXhjbHVkZT4NCi0gICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4NCi0gICAgICAgICAgICAgICAgPC9jb3B5Pg0KLSAgICAgICAgICAgICAgICA8amFyPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZGVzdGZpbGUiPiR7bGlifS8ke25hbWV9LmFhcjwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0Pg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImV4Y2x1ZGVzIj4qKi9UZXN0LmNsYXNzPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImRpciI+JHtjbGFzc2VzfTwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4NCi0gICAgICAgICAgICAgICAgPC9qYXI+DQotICAgICAgICAgICAgPC90YXJnZXQ+DQotDQotICAgICAgICAgICAgPHRhcmdldCBuYW1lPSJqYXIuY2xpZW50IiBpZj0iamFycy5vayI+DQotICAgICAgICAgICAgICAgIDwhLS1zZXQgdGhlIGNvcnJlY3QgZGVwZW5kcyB0YXJnZXQtLT4NCi0gICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQHRlc3RPbWl0Ij4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJkZXBlbmRzIj5jb21waWxlLnNyYzwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJkZXBlbmRzIj5jb21waWxlLnRlc3Q8L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+DQotICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4NCi0NCi0gICAgICAgICAgICAgICAgPGphcj4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImRlc3RmaWxlIj4ke2xpYn0vJHtuYW1lfS10ZXN0LWNsaWVudC5qYXI8L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJkaXIiPiR7Y2xhc3Nlc308L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+PHhzbDphdHRyaWJ1dGUgbmFtZT0ibmFtZSI+KiovTUVUQS1JTkYvKi4qPC94c2w6YXR0cmlidXRlPjwvZXhjbHVkZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT48eHNsOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIj4qKi9saWIvKi4qPC94c2w6YXR0cmlidXRlPjwvZXhjbHVkZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT48eHNsOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIj4qKi8qTWVzc2FnZVJlY2VpdmVyLmNsYXNzPC94c2w6YXR0cmlidXRlPjwvZXhjbHVkZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT48eHNsOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIj4qKi8qU2tlbGV0b24uY2xhc3M8L3hzbDphdHRyaWJ1dGU+PC9leGNsdWRlPg0KLQ0KLSAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0Pg0KLSAgICAgICAgICAgICAgICA8L2phcj4NCi0gICAgICAgICAgICA8L3RhcmdldD4NCi0NCi0gICAgICAgICAgICA8dGFyZ2V0IG5hbWU9Im1ha2UucmVwbyIgZGVwZW5kcz0iamFyLnNlcnZlciIgaWY9ImphcnMub2siPg0KLSAgICAgICAgICAgICAgICA8bWtkaXI+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJkaXIiPiR7YnVpbGR9L3JlcG8vPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICA8L21rZGlyPg0KLSAgICAgICAgICAgICAgICA8bWtkaXI+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJkaXIiPiR7YnVpbGR9L3JlcG8vc2VydmljZXM8L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgIDwvbWtkaXI+DQotICAgICAgICAgICAgICAgIDxjb3B5Pg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZmlsZSI+JHtidWlsZH0vbGliLyR7bmFtZX0uYWFyPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0idG9EaXIiPiR7YnVpbGR9L3JlcG8vc2VydmljZXMvPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICA8L2NvcHk+DQotICAgICAgICAgICAgPC90YXJnZXQ+DQotICAgICAgICAgICAgPHRhcmdldCBuYW1lPSJzdGFydC5zZXJ2ZXIiIGRlcGVuZHM9Im1ha2UucmVwbyIgaWY9ImphcnMub2siPg0KLSAgICAgICAgICAgICAgICA8amF2YSBjbGFzc25hbWU9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuU2ltcGxlSFRUUFNlcnZlciIgZm9yaz0idHJ1ZSI+DQotICAgICAgICAgICAgICAgICAgICA8YXJnPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InZhbHVlIj4ke2J1aWxkfS9yZXBvPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgPC9hcmc+DQotICAgICAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InJlZmlkIj5heGlzMi5jbGFzcy5wYXRoPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgPC9jbGFzc3BhdGg+DQotICAgICAgICAgICAgICAgIDwvamF2YT4NCi0gICAgICAgICAgICA8L3RhcmdldD4NCi0gICAgICAgICAgICA8dGFyZ2V0IG5hbWU9InJ1bi50ZXN0IiBkZXBlbmRzPSJqYXIuY2xpZW50IiBpZj0iamFycy5vayI+DQotICAgICAgICAgICAgICAgIDxwYXRoIGlkPSJ0ZXN0LmNsYXNzLnBhdGgiPg0KLSAgICAgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50Pg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImxvY2F0aW9uIj4ke2xpYn0vJHtuYW1lfS10ZXN0LWNsaWVudC5qYXI8L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICA8L3BhdGhlbGVtZW50Pg0KLSAgICAgICAgICAgICAgICAgICAgPHBhdGg+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0icmVmaWQiPmF4aXMyLmNsYXNzLnBhdGg8L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICA8L3BhdGg+DQotICAgICAgICAgICAgICAgIDwvcGF0aD4NCi0gICAgICAgICAgICAgICAgPG1rZGlyPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZGlyIj4ke2J1aWxkfS90ZXN0LXJlcG9ydHMvPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICA8L21rZGlyPg0KLSAgICAgICAgICAgICAgICA8anVuaXQgcHJpbnRzdW1tYXJ5PSJ5ZXMiIGhhbHRvbmZhaWx1cmU9InllcyI+DQotICAgICAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InJlZmlkIj50ZXN0LmNsYXNzLnBhdGg8L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICA8L2NsYXNzcGF0aD4NCi0gICAgICAgICAgICAgICAgICAgIDxmb3JtYXR0ZXIgdHlwZT0icGxhaW4iLz4NCi0gICAgICAgICAgICAgICAgICAgIDxiYXRjaHRlc3QgZm9yaz0ieWVzIj4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ0b0RpciI+JHtidWlsZH0vdGVzdC1yZXBvcnRzLzwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldD4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZGlyIj4ke3Rlc3R9PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9Im5hbWUiPioqLypUZXN0Ki5qYXZhPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2luY2x1ZGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0Pg0KLSAgICAgICAgICAgICAgICAgICAgPC9iYXRjaHRlc3Q+DQotICAgICAgICAgICAgICAgIDwvanVuaXQ+DQotICAgICAgICAgICAgPC90YXJnZXQ+DQotICAgICAgICAgICAgPHRhcmdldCBuYW1lPSJjbGVhbiI+DQotICAgICAgICAgICAgICAgIDxkZWxldGU+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJkaXIiPiR7YnVpbGR9PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICA8L2RlbGV0ZT4NCi0gICAgICAgICAgICA8L3RhcmdldD4NCi0gICAgICAgIDwvcHJvamVjdD4NCi0gICAgPC94c2w6dGVtcGxhdGU+DQotPC94c2w6c3R5bGVzaGVldD4NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdGVtcGxhdGUvZ2VuZXJhbC9qYXhtZUFudEJ1aWxkVGVtcGxhdGUueHNsIGIvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL3RlbXBsYXRlL2dlbmVyYWwvamF4bWVBbnRCdWlsZFRlbXBsYXRlLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA0ZjA3MC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdGVtcGxhdGUvZ2VuZXJhbC9qYXhtZUFudEJ1aWxkVGVtcGxhdGUueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMjc4ICswLDAgQEAKLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIj4NCi0gICAgPHhzbDpvdXRwdXQgbWV0aG9kPSJ4bWwiIGluZGVudD0ieWVzIiBvbWl0LXhtbC1kZWNsYXJhdGlvbj0ieWVzIi8+DQotICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii9hbnQiPg0KLSAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJwYWNrYWdlIiBzZWxlY3Q9IkBwYWNrYWdlIi8+DQotICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InNyYyIgc2VsZWN0PSJAc3JjIi8+DQotICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InJlc291cmNlIiBzZWxlY3Q9IkByZXNvdXJjZSIvPg0KLQ0KLSAgICAgICAgPHByb2plY3QgYmFzZWRpcj0iLiI+DQotICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPg0KLSAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQGlzc2VydmVyc2lkZSI+DQotICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImRlZmF1bHQiPmphci5zZXJ2ZXI8L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgIDwveHNsOndoZW4+DQotICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZGVmYXVsdCI+amFyLmNsaWVudDwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPg0KLSAgICAgICAgICAgIDwveHNsOmNob29zZT4NCi0gICAgICAgICAgICANCi0gICAgICAgICAgICA8eHNsOmNvbW1lbnQ+QXV0byBnZW5lcmF0ZWQgYW50IGJ1aWxkIGZpbGU8L3hzbDpjb21tZW50Pg0KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBlbnZpcm9ubWVudD0iZW52Ii8+DQotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImF4aXMyLmhvbWUiPg0KLSAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSI+JHtlbnYuQVhJUzJfSE9NRX08L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgPC9wcm9wZXJ0eT4NCi0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0icHJvamVjdC5iYXNlLmRpciI+DQotICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InZhbHVlIj4uPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgIDwvcHJvcGVydHk+DQotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im1hdmVuLmNsYXNzLnBhdGgiPg0KLSAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSI+PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgIDwvcHJvcGVydHk+DQotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im5hbWUiPg0KLSAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBhcnRpZmFjdG5hbWUiLz48L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgPC9wcm9wZXJ0eT4NCi0gICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InNyYyI+DQotICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InZhbHVlIj4ke3Byb2plY3QuYmFzZS5kaXJ9Lzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc3JjIi8+PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgIDwvcHJvcGVydHk+DQotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InRlc3QiPg0KLSAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSI+JHtwcm9qZWN0LmJhc2UuZGlyfS90ZXN0PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgIDwvcHJvcGVydHk+DQotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkIj4NCi0gICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiPiR7cHJvamVjdC5iYXNlLmRpcn0vYnVpbGQ8L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgPC9wcm9wZXJ0eT4NCi0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iY2xhc3NlcyI+DQotICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InZhbHVlIj4ke2J1aWxkfS9jbGFzc2VzPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgIDwvcHJvcGVydHk+DQotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImxpYiI+DQotICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InZhbHVlIj4ke2J1aWxkfS9saWI8L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgPC9wcm9wZXJ0eT4NCi0gICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXNvdXJjZXMiPg0KLSAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSI+JHtwcm9qZWN0LmJhc2UuZGlyfS88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlc291cmNlIi8+PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgIDwvcHJvcGVydHk+DQotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InhiZWFucy5wYWNrYWdlZC5qYXIubmFtZSIgdmFsdWU9IlhCZWFucy1wYWNrYWdlZC5qYXIiPjwvcHJvcGVydHk+DQotDQotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImphcnMub2siIHZhbHVlPSIiPjwvcHJvcGVydHk+DQotDQotICAgICAgICAgICAgPHBhdGggaWQ9ImF4aXMyLmNsYXNzLnBhdGgiPg0KLSAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQ+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJwYXRoIj4ke2phdmEuY2xhc3MucGF0aH08L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgIDwvcGF0aGVsZW1lbnQ+DQotICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudD4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InBhdGgiPiR7bWF2ZW4uY2xhc3MucGF0aH08L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgIDwvcGF0aGVsZW1lbnQ+DQotICAgICAgICAgICAgICAgIDxmaWxlc2V0Pg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZGlyIj4ke2F4aXMyLmhvbWV9PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0ibmFtZSI+bGliLyouamFyPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgPC9pbmNsdWRlPg0KLSAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+DQotICAgICAgICAgICAgPC9wYXRoPg0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIDx0YXJnZXQgbmFtZT0iaW5pdCI+DQotICAgICAgICAgICAgICAgIDxta2Rpcj4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImRpciI+JHtidWlsZH08L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgIDwvbWtkaXI+DQotICAgICAgICAgICAgICAgIDxta2Rpcj4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImRpciI+JHtjbGFzc2VzfTwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgPC9ta2Rpcj4NCi0gICAgICAgICAgICAgICAgPG1rZGlyPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZGlyIj4ke2xpYn08L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgIDwvbWtkaXI+DQotICAgICAgICAgICAgPC90YXJnZXQ+DQotDQotICAgICAgICAgICAgPHRhcmdldCBuYW1lPSJqYXIueGJlYW5zIj4NCi0gICAgICAgICAgICAgICAgPCEtLSBqYXIgdGhlICBYTUxiZWFucyBzdHVmZiB0byB0aGUgbGliIGZvbGRlci0tPg0KLSAgICAgICAgICAgICAgICA8amFyPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iYmFzZWRpciI+JHtyZXNvdXJjZXN9PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZGVzdGZpbGUiPiR7bGlifS8ke3hiZWFucy5wYWNrYWdlZC5qYXIubmFtZX08L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJleGNsdWRlcyI+Kiovc2VydmljZXMueG1sLCAqKi8qLnhzZDwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgPC9qYXI+DQotICAgICAgICAgICAgPC90YXJnZXQ+DQotDQotICAgICAgICAgICAgPHRhcmdldCBuYW1lPSJwcmUuY29tcGlsZS50ZXN0IiBkZXBlbmRzPSJpbml0LCBqYXIueGJlYW5zIj4NCi0gICAgICAgICAgICAgICAgPHhzbDpjb21tZW50PlRlc3QgdGhlIGNsYXNzcGF0aCBmb3IgdGhlIGF2YWlsYWJpbGl0eSBvZiBuZWNlc2FyeSBjbGFzc2VzPC94c2w6Y29tbWVudD4NCi0gICAgICAgICAgICAgICAgPGF2YWlsYWJsZSBjbGFzc25hbWU9Im9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0IiBwcm9wZXJ0eT0ieGJlYW5zLmF2YWlsYWJsZSIgY2xhc3NwYXRocmVmPSJheGlzMi5jbGFzcy5wYXRoIi8+DQotICAgICAgICAgICAgICAgIDxhdmFpbGFibGUgY2xhc3NuYW1lPSJqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciIgcHJvcGVydHk9InN0YXguYXZhaWxhYmxlIiBjbGFzc3BhdGhyZWY9ImF4aXMyLmNsYXNzLnBhdGgiLz4NCi0gICAgICAgICAgICAgICAgPGF2YWlsYWJsZSBjbGFzc25hbWU9Im9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNFbmdpbmUiIHByb3BlcnR5PSJheGlzMi5hdmFpbGFibGUiIGNsYXNzcGF0aHJlZj0iYXhpczIuY2xhc3MucGF0aCIvPg0KLSAgICAgICAgICAgICAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJqYXJzLm9rIiA+DQotICAgICAgICAgICAgICAgICAgICA8YW5kPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpc3NldCBwcm9wZXJ0eT0ieGJlYW5zLmF2YWlsYWJsZSIvPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpc3NldCBwcm9wZXJ0eT0ic3RheC5hdmFpbGFibGUiLz4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8aXNzZXQgcHJvcGVydHk9ImF4aXMyLmF2YWlsYWJsZSIvPg0KLSAgICAgICAgICAgICAgICAgICAgPC9hbmQ+DQotICAgICAgICAgICAgICAgIDwvY29uZGl0aW9uPg0KLQ0KLSAgICAgICAgICAgICAgICA8eHNsOmNvbW1lbnQ+UHJpbnQgb3V0IHRoZSBhdmFpbGFiaWxpdGllczwveHNsOmNvbW1lbnQ+DQotICAgICAgICAgICAgICAgIDxlY2hvPg0KLSAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9Im1lc3NhZ2UiPlhtbEJlYW5zIEF2YWlsYWJpbGl0eSA9ICR7eGJlYW5zLmF2YWlsYWJsZX08L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgIDwvZWNobz4NCi0gICAgICAgICAgICAgICAgPGVjaG8+DQotICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0ibWVzc2FnZSI+U3RheCBBdmFpbGFiaWxpdHk9ICR7c3RheC5hdmFpbGFibGV9PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICA8L2VjaG8+DQotICAgICAgICAgICAgICAgIDxlY2hvPg0KLSAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9Im1lc3NhZ2UiPkF4aXMyIEF2YWlsYWJpbGl0eT0gJHtheGlzMi5hdmFpbGFibGV9PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICA8L2VjaG8+DQotDQotICAgICAgICAgICAgPC90YXJnZXQ+DQotDQotICAgICAgICAgICAgPHRhcmdldCBuYW1lPSJjb21waWxlLmFsbCIgZGVwZW5kcz0icHJlLmNvbXBpbGUudGVzdCI+DQotICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImlmIj5qYXJzLm9rPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICA8amF2YWMgZm9yaz0idHJ1ZSIgbWVtb3J5SW5pdGlhbFNpemU9IjI1Nm0iIG1lbW9yeU1heGltdW1TaXplPSIyNTZtIiBkZWJ1Zz0ib24iPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZGVzdGRpciI+JHtjbGFzc2VzfTwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InNyY2RpciI+JHtzcmN9PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgPGNsYXNzcGF0aD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJsb2NhdGlvbiI+JHtsaWJ9LyR7eGJlYW5zLnBhY2thZ2VkLmphci5uYW1lfTwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgIDwvY2xhc3NwYXRoPg0KLSAgICAgICAgICAgICAgICAgICAgPGNsYXNzcGF0aD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJyZWZpZCI+YXhpczIuY2xhc3MucGF0aDwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgIDwvY2xhc3NwYXRoPg0KLSAgICAgICAgICAgICAgICA8L2phdmFjPg0KLSAgICAgICAgICAgIDwvdGFyZ2V0Pg0KLSAgICAgICAgICAgIDx0YXJnZXQgbmFtZT0iY29tcGlsZS50ZXN0IiBkZXBlbmRzPSJwcmUuY29tcGlsZS50ZXN0Ij4NCi0gICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iaWYiPmphcnMub2s8L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgIDxqYXZhYyBmb3JrPSJ0cnVlIiBtZW1vcnlJbml0aWFsU2l6ZT0iMjU2bSIgbWVtb3J5TWF4aW11bVNpemU9IjI1Nm0iIGRlYnVnPSJvbiI+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJkZXN0ZGlyIj4ke2NsYXNzZXN9PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgPHNyYz4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJwYXRoIj4ke3NyY308L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICA8L3NyYz4NCi0gICAgICAgICAgICAgICAgICAgIDxzcmM+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0icGF0aCI+JHt0ZXN0fTwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgIDwvc3JjPg0KLSAgICAgICAgICAgICAgICAgICAgPGNsYXNzcGF0aD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJsb2NhdGlvbiI+JHtsaWJ9LyR7eGJlYW5zLnBhY2thZ2VkLmphci5uYW1lfTwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgIDwvY2xhc3NwYXRoPg0KLSAgICAgICAgICAgICAgICAgICAgPGNsYXNzcGF0aD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJyZWZpZCI+YXhpczIuY2xhc3MucGF0aDwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgIDwvY2xhc3NwYXRoPg0KLSAgICAgICAgICAgICAgICA8L2phdmFjPg0KLSAgICAgICAgICAgIDwvdGFyZ2V0Pg0KLQ0KLSAgICAgICAgICAgIDx0YXJnZXQgbmFtZT0iZWNoby5jbGFzc3BhdGgucHJvYmxlbSIgZGVwZW5kcz0icHJlLmNvbXBpbGUudGVzdCI+DQotICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InVubGVzcyI+amFycy5vazwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgPGVjaG8gbWVzc2FnZT0iVGhlIGNsYXNzIHBhdGggaXMgbm90IHNldCByaWdodCENCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGxlYXNlIG1ha2Ugc3VyZSB0aGUgZm9sbG93aW5nIGNsYXNzZXMgYXJlIGluIHRoZSBjbGFzc3BhdGgNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4gWG1sQmVhbnMNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi4gU3RheA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLiBBeGlzMg0KLSAgICAgICAgICAgICAgICAiPjwvZWNobz4NCi0gICAgICAgICAgICA8L3RhcmdldD4NCi0gICAgICAgICAgICA8dGFyZ2V0IG5hbWU9Imphci5hbGwiIGRlcGVuZHM9Imphci5zZXJ2ZXIsIGphci5jbGllbnQiPg0KLSAgICAgICAgICAgIDwvdGFyZ2V0Pg0KLSAgICAgICAgICAgIDx0YXJnZXQgbmFtZT0iamFyLnNlcnZlciIgZGVwZW5kcz0iY29tcGlsZS5hbGwsZWNoby5jbGFzc3BhdGgucHJvYmxlbSI+DQotICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImlmIj5qYXJzLm9rPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICA8Y29weT4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InRvRGlyIj4ke2NsYXNzZXN9L01FVEEtSU5GPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZmFpbG9uZXJyb3IiPmZhbHNlPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZGlyIj4ke3Jlc291cmNlc308L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+PHhzbDphdHRyaWJ1dGUgbmFtZT0ibmFtZSI+Ki54bWw8L3hzbDphdHRyaWJ1dGU+PC9pbmNsdWRlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPjx4c2w6YXR0cmlidXRlIG5hbWU9Im5hbWUiPioud3NkbDwveHNsOmF0dHJpYnV0ZT48L2luY2x1ZGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+PHhzbDphdHRyaWJ1dGUgbmFtZT0ibmFtZSI+Ki54c2Q8L3hzbDphdHRyaWJ1dGU+PC9pbmNsdWRlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPjx4c2w6YXR0cmlidXRlIG5hbWU9Im5hbWUiPioqL3NjaGVtYW9yZ19hcGFjaGVfeG1sYmVhbi8qKjwveHNsOmF0dHJpYnV0ZT48L2V4Y2x1ZGU+DQotICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+DQotICAgICAgICAgICAgICAgIDwvY29weT4NCi0gICAgICAgICAgICAgICAgPGNvcHk+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJmaWxlIj4ke2xpYn0vJHt4YmVhbnMucGFja2FnZWQuamFyLm5hbWV9PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0idG9EaXIiPiR7Y2xhc3Nlc30vbGliPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICA8L2NvcHk+DQotICAgICAgICAgICAgICAgIDxqYXI+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJkZXN0ZmlsZSI+JHtsaWJ9LyR7bmFtZX0uYWFyPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZXhjbHVkZXMiPioqL1Rlc3QuY2xhc3M8L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZGlyIj4ke2NsYXNzZXN9PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0Pg0KLSAgICAgICAgICAgICAgICA8L2phcj4NCi0gICAgICAgICAgICA8L3RhcmdldD4NCi0gICAgICAgICAgICA8dGFyZ2V0IG5hbWU9Imphci5jbGllbnQiIGRlcGVuZHM9ImNvbXBpbGUudGVzdCIgaWY9ImphcnMub2siPg0KLSAgICAgICAgICAgICAgICA8amFyPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZGVzdGZpbGUiPiR7bGlifS8ke25hbWV9LXRlc3QtY2xpZW50LmphcjwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0Pg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImRpciI+JHtjbGFzc2VzfTwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT48eHNsOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIj4qKi9NRVRBLUlORi8qLio8L3hzbDphdHRyaWJ1dGU+PC9leGNsdWRlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPjx4c2w6YXR0cmlidXRlIG5hbWU9Im5hbWUiPioqL2xpYi8qLio8L3hzbDphdHRyaWJ1dGU+PC9leGNsdWRlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPjx4c2w6YXR0cmlidXRlIG5hbWU9Im5hbWUiPioqLypNZXNzYWdlUmVjZWl2ZXIuY2xhc3M8L3hzbDphdHRyaWJ1dGU+PC9leGNsdWRlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPjx4c2w6YXR0cmlidXRlIG5hbWU9Im5hbWUiPioqLypTa2VsZXRvbi5jbGFzczwveHNsOmF0dHJpYnV0ZT48L2V4Y2x1ZGU+DQotICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+DQotICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJkaXIiPiR7cmVzb3VyY2VzfTwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT48eHNsOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIj4qKi8qLndzZGw8L3hzbDphdHRyaWJ1dGU+PC9leGNsdWRlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPjx4c2w6YXR0cmlidXRlIG5hbWU9Im5hbWUiPioqLyoueHNkPC94c2w6YXR0cmlidXRlPjwvZXhjbHVkZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT48eHNsOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIj4qKi8qLnhtbDwveHNsOmF0dHJpYnV0ZT48L2V4Y2x1ZGU+DQotICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+DQotICAgICAgICAgICAgICAgIDwvamFyPg0KLSAgICAgICAgICAgIDwvdGFyZ2V0Pg0KLSAgICAgICAgICAgIDx0YXJnZXQgbmFtZT0ibWFrZS5yZXBvIiBkZXBlbmRzPSJqYXIuc2VydmVyIiBpZj0iamFycy5vayI+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+DQotICAgICAgICAgICAgICAgICAgICA8L2JhdGNodGVzdD4JCQkNCi0gICAgICAgICAgICAgICAgPC9qdW5pdD4NCi0gICAgICAgICAgICA8L3RhcmdldD4NCi0gICAgICAgICAgICA8dGFyZ2V0IG5hbWU9ImNsZWFuIj4NCi0gICAgICAgICAgICAgIDxkZWxldGU+DQotICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImRpciI+JHtidWlsZH08L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICA8L2RlbGV0ZT4NCi0gICAgICAgICAgICA8L3RhcmdldD4NCi0gICAgICAgIDwvcHJvamVjdD4NCi0gICAgPC94c2w6dGVtcGxhdGU+DQotPC94c2w6c3R5bGVzaGVldD4NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdGVtcGxhdGUvZ2VuZXJhbC9qaWJ4QW50QnVpbGRUZW1wbGF0ZS54c2wgYi92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdGVtcGxhdGUvZ2VuZXJhbC9qaWJ4QW50QnVpbGRUZW1wbGF0ZS54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmZTRmOWIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL3RlbXBsYXRlL2dlbmVyYWwvamlieEFudEJ1aWxkVGVtcGxhdGUueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMjcxICswLDAgQEAKLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIj4NCi0gICAgPHhzbDpvdXRwdXQgbWV0aG9kPSJ4bWwiIGluZGVudD0ieWVzIiBvbWl0LXhtbC1kZWNsYXJhdGlvbj0ieWVzIi8+DQotICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii9hbnQiPg0KLSAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJwYWNrYWdlIiBzZWxlY3Q9IkBwYWNrYWdlIi8+DQotICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InNyYyIgc2VsZWN0PSJAc3JjIi8+DQotICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InJlc291cmNlIiBzZWxlY3Q9IkByZXNvdXJjZSIvPg0KLQ0KLSAgICAgICAgPHByb2plY3QgYmFzZWRpcj0iLiI+DQotICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPg0KLSAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQGlzc2VydmVyc2lkZSI+DQotICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImRlZmF1bHQiPmphci5zZXJ2ZXI8L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgIDwveHNsOndoZW4+DQotICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZGVmYXVsdCI+amFyLmNsaWVudDwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPg0KLSAgICAgICAgICAgIDwveHNsOmNob29zZT4NCi0gICAgICAgICAgICANCi0gICAgICAgICAgICA8eHNsOmNvbW1lbnQ+QXV0byBnZW5lcmF0ZWQgYW50IGJ1aWxkIGZpbGU8L3hzbDpjb21tZW50Pg0KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBlbnZpcm9ubWVudD0iZW52Ii8+DQotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImF4aXMyLmhvbWUiPg0KLSAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSI+JHtlbnYuQVhJUzJfSE9NRX08L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgPC9wcm9wZXJ0eT4NCi0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0icHJvamVjdC5iYXNlLmRpciI+DQotICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InZhbHVlIj4uPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgIDwvcHJvcGVydHk+DQotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im1hdmVuLmNsYXNzLnBhdGgiPg0KLSAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSI+PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgIDwvcHJvcGVydHk+DQotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im5hbWUiPg0KLSAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBhcnRpZmFjdG5hbWUiLz48L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgPC9wcm9wZXJ0eT4NCi0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ic3JjIj4NCi0gICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiPiR7cHJvamVjdC5iYXNlLmRpcn0vPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzcmMiLz48L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgPC9wcm9wZXJ0eT4NCi0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idGVzdCI+DQotICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InZhbHVlIj4ke3Byb2plY3QuYmFzZS5kaXJ9L3Rlc3Q8L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgPC9wcm9wZXJ0eT4NCi0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iYnVpbGQiPg0KLSAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSI+JHtwcm9qZWN0LmJhc2UuZGlyfS9idWlsZDwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8L3Byb3BlcnR5Pg0KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjbGFzc2VzIj4NCi0gICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiPiR7YnVpbGR9L2NsYXNzZXM8L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgPC9wcm9wZXJ0eT4NCi0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ibGliIj4NCi0gICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiPiR7YnVpbGR9L2xpYjwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8L3Byb3BlcnR5Pg0KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXNvdXJjZXMiPg0KLSAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSI+JHtwcm9qZWN0LmJhc2UuZGlyfS88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlc291cmNlIi8+PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgIDwvcHJvcGVydHk+DQotDQotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImphcnMub2siIHZhbHVlPSIiPjwvcHJvcGVydHk+DQotDQotICAgICAgICAgICAgPHBhdGggaWQ9ImF4aXMyLmNsYXNzLnBhdGgiPg0KLSAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQ+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJwYXRoIj4ke2phdmEuY2xhc3MucGF0aH08L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgIDwvcGF0aGVsZW1lbnQ+DQotICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudD4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InBhdGgiPiR7bWF2ZW4uY2xhc3MucGF0aH08L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgIDwvcGF0aGVsZW1lbnQ+DQotICAgICAgICAgICAgICAgIDxmaWxlc2V0Pg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZGlyIj4ke2F4aXMyLmhvbWV9PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0ibmFtZSI+bGliLyouamFyPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgPC9pbmNsdWRlPg0KLSAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+DQotICAgICAgICAgICAgPC9wYXRoPg0KLQ0KLSAgICAgICAgICAgIDx0YXJnZXQgbmFtZT0iaW5pdCI+DQotICAgICAgICAgICAgICAgIDxta2Rpcj4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImRpciI+JHtidWlsZH08L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgIDwvbWtkaXI+DQotICAgICAgICAgICAgICAgIDxta2Rpcj4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImRpciI+JHtjbGFzc2VzfTwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgPC9ta2Rpcj4NCi0gICAgICAgICAgICAgICAgPG1rZGlyPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZGlyIj4ke2xpYn08L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgIDwvbWtkaXI+DQotICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0ibm90KEB0ZXN0T21pdCkiPg0KLSAgICAgICAgICAgICAgICAgICAgPG1rZGlyPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImRpciI+JHt0ZXN0fTwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgIDwvbWtkaXI+DQotICAgICAgICAgICAgICAgIDwveHNsOmlmPg0KLSAgICAgICAgICAgIDwvdGFyZ2V0Pg0KLQ0KLSAgICAgICAgICAgIDx0YXJnZXQgbmFtZT0icHJlLmNvbXBpbGUudGVzdCIgZGVwZW5kcz0iaW5pdCI+DQotICAgICAgICAgICAgICAgIDx4c2w6Y29tbWVudD5UZXN0IHRoZSBjbGFzc3BhdGggZm9yIHRoZSBhdmFpbGFiaWxpdHkgb2YgbmVjZXNhcnkgY2xhc3NlczwveHNsOmNvbW1lbnQ+DQotDQotICAgICAgICAgICAgICAgIDxhdmFpbGFibGUgY2xhc3NuYW1lPSJqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciIgcHJvcGVydHk9InN0YXguYXZhaWxhYmxlIiBjbGFzc3BhdGhyZWY9ImF4aXMyLmNsYXNzLnBhdGgiLz4NCi0gICAgICAgICAgICAgICAgPGF2YWlsYWJsZSBjbGFzc25hbWU9Im9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNFbmdpbmUiIHByb3BlcnR5PSJheGlzMi5hdmFpbGFibGUiIGNsYXNzcGF0aHJlZj0iYXhpczIuY2xhc3MucGF0aCIvPg0KLSAgICAgICAgICAgICAgICA8YXZhaWxhYmxlIGNsYXNzbmFtZT0ib3JnLmppYngucnVudGltZS5CaW5kaW5nRGlyZWN0b3J5IiBwcm9wZXJ0eT0iamlieC5hdmFpbGFibGUiIGNsYXNzcGF0aHJlZj0iYXhpczIuY2xhc3MucGF0aCIvPg0KLSAgICAgICAgICAgICAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJqYXJzLm9rIj4NCi0gICAgICAgICAgICAgICAgICAgIDxhbmQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGlzc2V0IHByb3BlcnR5PSJzdGF4LmF2YWlsYWJsZSIvPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpc3NldCBwcm9wZXJ0eT0iYXhpczIuYXZhaWxhYmxlIi8+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGlzc2V0IHByb3BlcnR5PSJqaWJ4LmF2YWlsYWJsZSIvPg0KLSAgICAgICAgICAgICAgICAgICAgPC9hbmQ+DQotICAgICAgICAgICAgICAgIDwvY29uZGl0aW9uPg0KLQ0KLSAgICAgICAgICAgICAgICA8eHNsOmNvbW1lbnQ+UHJpbnQgb3V0IHRoZSBhdmFpbGFiaWxpdGllczwveHNsOmNvbW1lbnQ+DQotICAgICAgICAgICAgICAgIDxlY2hvPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0ibWVzc2FnZSI+U3RheCBBdmFpbGFiaWxpdHk9ICR7c3RheC5hdmFpbGFibGV9PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICA8L2VjaG8+DQotICAgICAgICAgICAgICAgIDxlY2hvPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0ibWVzc2FnZSI+QXhpczIgQXZhaWxhYmlsaXR5PSAke2F4aXMyLmF2YWlsYWJsZX08L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgIDwvZWNobz4NCi0gICAgICAgICAgICAgICAgPGVjaG8+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJtZXNzYWdlIj5KaUJYIEF2YWlsYWJpbGl0eT0gJHtqaWJ4LmF2YWlsYWJsZX08L3hzbDphdHRyaWJ1dGU+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+DQotICAgICAgICAgICAgICAgIDwvamFyPg0KLSAgICAgICAgICAgIDwvdGFyZ2V0Pg0KLQ0KLSAgICAgICAgICAgIDx0YXJnZXQgbmFtZT0ibWFrZS5yZXBvIiBkZXBlbmRzPSJqYXIuc2VydmVyIiBpZj0iamFycy5vayI+DQotICAgICAgICAgICAgICAgIDxta2Rpcj4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImRpciI+JHtidWlsZH0vcmVwby88L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgIDwvbWtkaXI+DQotICAgICAgICAgICAgICAgIDxta2Rpcj4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImRpciI+JHtidWlsZH0vcmVwby9zZXJ2aWNlczwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgPC9ta2Rpcj4NCi0gICAgICAgICAgICAgICAgPGNvcHk+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJmaWxlIj4ke2J1aWxkfS9saWIvJHtuYW1lfS5hYXI8L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ0b0RpciI+JHtidWlsZH0vcmVwby9zZXJ2aWNlcy88L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgIDwvY29weT4NCi0gICAgICAgICAgICA8L3RhcmdldD4NCi0gICAgICAgICAgICA8dGFyZ2V0IG5hbWU9InN0YXJ0LnNlcnZlciIgZGVwZW5kcz0ibWFrZS5yZXBvIiBpZj0iamFycy5vayI+DQotICAgICAgICAgICAgICAgIDxqYXZhIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5TaW1wbGVIVFRQU2VydmVyIiBmb3JrPSJ0cnVlIj4NCi0gICAgICAgICAgICAgICAgICAgIDxhcmc+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiPiR7YnVpbGR9L3JlcG88L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICA8L2FyZz4NCi0gICAgICAgICAgICAgICAgICAgIDxjbGFzc3BhdGg+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0icmVmaWQiPmF4aXMyLmNsYXNzLnBhdGg8L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICA8L2NsYXNzcGF0aD4NCi0gICAgICAgICAgICAgICAgPC9qYXZhPg0KLSAgICAgICAgICAgIDwvdGFyZ2V0Pg0KLSAgICAgICAgICAgIDx0YXJnZXQgbmFtZT0icnVuLnRlc3QiIGRlcGVuZHM9ImNvbXBpbGUudGVzdCIgaWY9ImphcnMub2siPg0KLSAgICAgICAgICAgICAgICA8cGF0aCBpZD0idGVzdC5jbGFzcy5wYXRoIj4NCi0gICAgICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJsb2NhdGlvbiI+JHtsaWJ9LyR7bmFtZX0tdGVzdC1jbGllbnQuamFyPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgPC9wYXRoZWxlbWVudD4NCi0gICAgICAgICAgICAgICAgICAgIDxwYXRoPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InJlZmlkIj5heGlzMi5jbGFzcy5wYXRoPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgPC9wYXRoPg0KLSAgICAgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50Pg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImxvY2F0aW9uIj4ke2NsYXNzZXN9PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgPC9wYXRoZWxlbWVudD4NCi0gICAgICAgICAgICAgICAgPC9wYXRoPg0KLSAgICAgICAgICAgICAgICA8bWtkaXI+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJkaXIiPiR7YnVpbGR9L3Rlc3QtcmVwb3J0cy88L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgIDwvbWtkaXI+DQotICAgICAgICAgICAgICAgIDxqdW5pdCBwcmludHN1bW1hcnk9InllcyIgaGFsdG9uZmFpbHVyZT0ieWVzIj4NCi0gICAgICAgICAgICAgICAgICAgIDxjbGFzc3BhdGg+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0icmVmaWQiPnRlc3QuY2xhc3MucGF0aDwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgIDwvY2xhc3NwYXRoPg0KLSAgICAgICAgICAgICAgICAgICAgPGZvcm1hdHRlciB0eXBlPSJwbGFpbiIvPg0KLSAgICAgICAgICAgICAgICAgICAgPGJhdGNodGVzdCBmb3JrPSJ5ZXMiPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InRvRGlyIj4ke2J1aWxkfS90ZXN0LXJlcG9ydHMvPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0Pg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJkaXIiPiR7dGVzdH08L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0ibmFtZSI+KiovKlRlc3QqLmphdmE8L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaW5jbHVkZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+DQotICAgICAgICAgICAgICAgICAgICA8L2JhdGNodGVzdD4NCi0gICAgICAgICAgICAgICAgPC9qdW5pdD4NCi0gICAgICAgICAgICA8L3RhcmdldD4NCi0gICAgICAgICAgICA8dGFyZ2V0IG5hbWU9ImNsZWFuIj4NCi0gICAgICAgICAgICAgICAgPGRlbGV0ZT4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImRpciI+JHtidWlsZH08L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgIDwvZGVsZXRlPg0KLSAgICAgICAgICAgIDwvdGFyZ2V0Pg0KLSAgICAgICAgPC9wcm9qZWN0Pg0KLSAgICA8L3hzbDp0ZW1wbGF0ZT4NCi08L3hzbDpzdHlsZXNoZWV0Pg0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC90ZW1wbGF0ZS9nZW5lcmFsL3htbGJlYW5zQW50QnVpbGRUZW1wbGF0ZS54c2wgYi92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdGVtcGxhdGUvZ2VuZXJhbC94bWxiZWFuc0FudEJ1aWxkVGVtcGxhdGUueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTM1YzlkLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC90ZW1wbGF0ZS9nZW5lcmFsL3htbGJlYW5zQW50QnVpbGRUZW1wbGF0ZS54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwzMDMgKzAsMCBAQAotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iPg0KLSAgICA8eHNsOm91dHB1dCBtZXRob2Q9InhtbCIgaW5kZW50PSJ5ZXMiIG9taXQteG1sLWRlY2xhcmF0aW9uPSJ5ZXMiLz4NCi0gICAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iL2FudCI+DQotDQotICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InBhY2thZ2UiIHNlbGVjdD0iQHBhY2thZ2UiLz4NCi0gICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ic3JjIiBzZWxlY3Q9IkBzcmMiLz4NCi0gICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icmVzb3VyY2UiIHNlbGVjdD0iQHJlc291cmNlIi8+DQotDQotICAgICAgICA8cHJvamVjdCBiYXNlZGlyPSIuIj4NCi0gICAgICAgICAgICAgPHhzbDpjaG9vc2U+DQotICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAaXNzZXJ2ZXJzaWRlIj4NCi0gICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZGVmYXVsdCI+amFyLnNlcnZlcjwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgPC94c2w6d2hlbj4NCi0gICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJkZWZhdWx0Ij5qYXIuY2xpZW50PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+DQotICAgICAgICAgICAgPC94c2w6Y2hvb3NlPg0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIDx4c2w6Y29tbWVudD5BdXRvIGdlbmVyYXRlZCBhbnQgYnVpbGQgZmlsZTwveHNsOmNvbW1lbnQ+DQotICAgICAgICAgICAgPHByb3BlcnR5IGVudmlyb25tZW50PSJlbnYiLz4NCi0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iYXhpczIuaG9tZSI+DQotICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InZhbHVlIj4ke2Vudi5BWElTMl9IT01FfTwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8L3Byb3BlcnR5Pg0KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwcm9qZWN0LmJhc2UuZGlyIj4NCi0gICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiPi48L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgPC9wcm9wZXJ0eT4NCi0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ibWF2ZW4uY2xhc3MucGF0aCI+DQotICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InZhbHVlIj48L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgPC9wcm9wZXJ0eT4NCi0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ibmFtZSI+DQotICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InZhbHVlIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGFydGlmYWN0bmFtZSIvPjwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8L3Byb3BlcnR5Pg0KLSAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ic3JjIj4NCi0gICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiPiR7cHJvamVjdC5iYXNlLmRpcn0vPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzcmMiLz48L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgPC9wcm9wZXJ0eT4NCi0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idGVzdCI+DQotICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InZhbHVlIj4ke3Byb2plY3QuYmFzZS5kaXJ9L3Rlc3Q8L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgPC9wcm9wZXJ0eT4NCi0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iYnVpbGQiPg0KLSAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSI+JHtwcm9qZWN0LmJhc2UuZGlyfS9idWlsZDwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8L3Byb3BlcnR5Pg0KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjbGFzc2VzIj4NCi0gICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiPiR7YnVpbGR9L2NsYXNzZXM8L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgPC9wcm9wZXJ0eT4NCi0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ibGliIj4NCi0gICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiPiR7YnVpbGR9L2xpYjwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8L3Byb3BlcnR5Pg0KLSAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXNvdXJjZXMiPg0KLSAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSI+JHtwcm9qZWN0LmJhc2UuZGlyfS88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlc291cmNlIi8+PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgIDwvcHJvcGVydHk+DQotDQotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InhiZWFucy5wYWNrYWdlZC5qYXIubmFtZSIgdmFsdWU9IlhCZWFucy1wYWNrYWdlZC5qYXIiPjwvcHJvcGVydHk+DQotDQotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImphcnMub2siIHZhbHVlPSIiPjwvcHJvcGVydHk+DQotDQotICAgICAgICAgICAgPHBhdGggaWQ9ImF4aXMyLmNsYXNzLnBhdGgiPg0KLSAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQ+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJwYXRoIj4ke2phdmEuY2xhc3MucGF0aH08L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgIDwvcGF0aGVsZW1lbnQ+DQotICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudD4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InBhdGgiPiR7bWF2ZW4uY2xhc3MucGF0aH08L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgIDwvcGF0aGVsZW1lbnQ+DQotICAgICAgICAgICAgICAgIDxmaWxlc2V0Pg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZGlyIj4ke2F4aXMyLmhvbWV9PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0ibmFtZSI+bGliLyouamFyPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgPC9pbmNsdWRlPg0KLSAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+DQotICAgICAgICAgICAgPC9wYXRoPg0KLQ0KLSAgICAgICAgICAgIDx0YXJnZXQgbmFtZT0iaW5pdCI+DQotICAgICAgICAgICAgICAgIDxta2Rpcj4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImRpciI+JHtidWlsZH08L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgIDwvbWtkaXI+DQotICAgICAgICAgICAgICAgIDxta2Rpcj4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImRpciI+JHtjbGFzc2VzfTwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgPC9ta2Rpcj4NCi0gICAgICAgICAgICAgICAgPG1rZGlyPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZGlyIj4ke2xpYn08L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgIDwvbWtkaXI+DQotICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0ibm90KEB0ZXN0T21pdCkiPg0KLSAgICAgICAgICAgICAgICAgICAgPG1rZGlyPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImRpciI+JHt0ZXN0fTwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgIDwvbWtkaXI+DQotICAgICAgICAgICAgICAgIDwveHNsOmlmPg0KLQ0KLSAgICAgICAgICAgIDwvdGFyZ2V0Pg0KLQ0KLSAgICAgICAgICAgIDx0YXJnZXQgbmFtZT0iamFyLnhiZWFucyI+DQotICAgICAgICAgICAgICAgIDwhLS0gamFyIHRoZSAgWE1MYmVhbnMgc3R1ZmYgdG8gdGhlIGxpYiBmb2xkZXItLT4NCi0gICAgICAgICAgICAgICAgPGphcj4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImJhc2VkaXIiPiR7cmVzb3VyY2VzfTwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImRlc3RmaWxlIj4ke2xpYn0vJHt4YmVhbnMucGFja2FnZWQuamFyLm5hbWV9PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZXhjbHVkZXMiPioqL3NlcnZpY2VzLnhtbCwgKiovKi54c2Q8L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgIDwvamFyPg0KLSAgICAgICAgICAgIDwvdGFyZ2V0Pg0KLQ0KLSAgICAgICAgICAgIDx0YXJnZXQgbmFtZT0icHJlLmNvbXBpbGUudGVzdCIgZGVwZW5kcz0iaW5pdCwgamFyLnhiZWFucyI+DQotICAgICAgICAgICAgICAgIDx4c2w6Y29tbWVudD5UZXN0IHRoZSBjbGFzc3BhdGggZm9yIHRoZSBhdmFpbGFiaWxpdHkgb2YgbmVjZXNhcnkgY2xhc3NlczwveHNsOmNvbW1lbnQ+DQotICAgICAgICAgICAgICAgIDxhdmFpbGFibGUgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdCIgcHJvcGVydHk9InhiZWFucy5hdmFpbGFibGUiIGNsYXNzcGF0aHJlZj0iYXhpczIuY2xhc3MucGF0aCIvPg0KLSAgICAgICAgICAgICAgICA8YXZhaWxhYmxlIGNsYXNzbmFtZT0iamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIiIHByb3BlcnR5PSJzdGF4LmF2YWlsYWJsZSIgY2xhc3NwYXRocmVmPSJheGlzMi5jbGFzcy5wYXRoIi8+DQotICAgICAgICAgICAgICAgIDxhdmFpbGFibGUgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzRW5naW5lIiBwcm9wZXJ0eT0iYXhpczIuYXZhaWxhYmxlIiBjbGFzc3BhdGhyZWY9ImF4aXMyLmNsYXNzLnBhdGgiLz4NCi0gICAgICAgICAgICAgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0iamFycy5vayIgPg0KLSAgICAgICAgICAgICAgICAgICAgPGFuZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8aXNzZXQgcHJvcGVydHk9InhiZWFucy5hdmFpbGFibGUiLz4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8aXNzZXQgcHJvcGVydHk9InN0YXguYXZhaWxhYmxlIi8+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGlzc2V0IHByb3BlcnR5PSJheGlzMi5hdmFpbGFibGUiLz4NCi0gICAgICAgICAgICAgICAgICAgIDwvYW5kPg0KLSAgICAgICAgICAgICAgICA8L2NvbmRpdGlvbj4NCi0NCi0gICAgICAgICAgICAgICAgPHhzbDpjb21tZW50PlByaW50IG91dCB0aGUgYXZhaWxhYmlsaXRpZXM8L3hzbDpjb21tZW50Pg0KLSAgICAgICAgICAgICAgICA8ZWNobz4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9Im1lc3NhZ2UiPlhtbEJlYW5zIEF2YWlsYWJpbGl0eSA9ICR7eGJlYW5zLmF2YWlsYWJsZX08L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgIDwvZWNobz4NCi0gICAgICAgICAgICAgICAgPGVjaG8+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJtZXNzYWdlIj5TdGF4IEF2YWlsYWJpbGl0eT0gJHtzdGF4LmF2YWlsYWJsZX08L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgIDwvZWNobz4NCi0gICAgICAgICAgICAgICAgPGVjaG8+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJtZXNzYWdlIj5BeGlzMiBBdmFpbGFiaWxpdHk9ICR7YXhpczIuYXZhaWxhYmxlfTwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgPC9lY2hvPg0KLQ0KLSAgICAgICAgICAgIDwvdGFyZ2V0Pg0KLQ0KLSAgICAgICAgICAgIDx0YXJnZXQgbmFtZT0iY29tcGlsZS5zcmMiIGRlcGVuZHM9InByZS5jb21waWxlLnRlc3QiID4NCi0gICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iaWYiPmphcnMub2s8L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgIDxqYXZhYyBmb3JrPSJ0cnVlIiBtZW1vcnlJbml0aWFsU2l6ZT0iMjU2bSIgbWVtb3J5TWF4aW11bVNpemU9IjI1Nm0iIGRlYnVnPSJvbiI+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJkZXN0ZGlyIj4ke2NsYXNzZXN9PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0ic3JjZGlyIj4ke3NyY308L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImxvY2F0aW9uIj4ke2xpYn0vJHt4YmVhbnMucGFja2FnZWQuamFyLm5hbWV9PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgPC9jbGFzc3BhdGg+DQotICAgICAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InJlZmlkIj5heGlzMi5jbGFzcy5wYXRoPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgPC9jbGFzc3BhdGg+DQotICAgICAgICAgICAgICAgIDwvamF2YWM+DQotICAgICAgICAgICAgPC90YXJnZXQ+DQotDQotDQotICAgICAgICAgICAgPHRhcmdldCBuYW1lPSJjb21waWxlLnRlc3QiIGRlcGVuZHM9ImNvbXBpbGUuc3JjIj4NCi0gICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iaWYiPmphcnMub2s8L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgIDxqYXZhYyBmb3JrPSJ0cnVlIiBtZW1vcnlJbml0aWFsU2l6ZT0iMjU2bSIgbWVtb3J5TWF4aW11bVNpemU9IjI1Nm0iIGRlYnVnPSJvbiI+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJkZXN0ZGlyIj4ke2NsYXNzZXN9PC94c2w6YXR0cmlidXRlPg0KLQ0KLSAgICAgICAgICAgICAgICAgICAgPHNyYz4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJwYXRoIj4ke3Rlc3R9PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgPC9zcmM+DQotDQotICAgICAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImxvY2F0aW9uIj4ke2xpYn0vJHt4YmVhbnMucGFja2FnZWQuamFyLm5hbWV9PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgPC9jbGFzc3BhdGg+DQotICAgICAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InJlZmlkIj5heGlzMi5jbGFzcy5wYXRoPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgPC9jbGFzc3BhdGg+DQotDQotICAgICAgICAgICAgICAgICAgICA8IS0tIHRvZG8gLS0+DQotDQotICAgICAgICAgICAgICAgIDwvamF2YWM+DQotICAgICAgICAgICAgPC90YXJnZXQ+DQotDQotICAgICAgICAgICAgPHRhcmdldCBuYW1lPSJlY2hvLmNsYXNzcGF0aC5wcm9ibGVtIiBkZXBlbmRzPSJwcmUuY29tcGlsZS50ZXN0Ij4NCi0gICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0idW5sZXNzIj5qYXJzLm9rPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICA8ZWNobyBtZXNzYWdlPSJUaGUgY2xhc3MgcGF0aCBpcyBub3Qgc2V0IHJpZ2h0IQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQbGVhc2UgbWFrZSBzdXJlIHRoZSBmb2xsb3dpbmcgY2xhc3NlcyBhcmUgaW4gdGhlIGNsYXNzcGF0aA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLiBYbWxCZWFucw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLiBTdGF4DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuIEF4aXMyDQotICAgICAgICAgICAgICAgICI+PC9lY2hvPg0KLSAgICAgICAgICAgIDwvdGFyZ2V0Pg0KLSAgICAgICAgICAgIDx0YXJnZXQgbmFtZT0iamFyLmFsbCIgZGVwZW5kcz0iamFyLnNlcnZlciwgamFyLmNsaWVudCI+DQotICAgICAgICAgICAgPC90YXJnZXQ+DQotICAgICAgICAgICAgPHRhcmdldCBuYW1lPSJqYXIuc2VydmVyIiBkZXBlbmRzPSJjb21waWxlLnNyYyxlY2hvLmNsYXNzcGF0aC5wcm9ibGVtIj4NCi0gICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iaWYiPmphcnMub2s8L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgIDxjb3B5Pg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0idG9EaXIiPiR7Y2xhc3Nlc30vTUVUQS1JTkY8L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJmYWlsb25lcnJvciI+ZmFsc2U8L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJkaXIiPiR7cmVzb3VyY2VzfTwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT48eHNsOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIj4qLnhtbDwveHNsOmF0dHJpYnV0ZT48L2luY2x1ZGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+PHhzbDphdHRyaWJ1dGUgbmFtZT0ibmFtZSI+Ki53c2RsPC94c2w6YXR0cmlidXRlPjwvaW5jbHVkZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT48eHNsOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIj4qLnhzZDwveHNsOmF0dHJpYnV0ZT48L2luY2x1ZGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+PHhzbDphdHRyaWJ1dGUgbmFtZT0ibmFtZSI+Kiovc2NoZW1hb3JnX2FwYWNoZV94bWxiZWFuLyoqPC94c2w6YXR0cmlidXRlPjwvZXhjbHVkZT4NCi0gICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4NCi0gICAgICAgICAgICAgICAgPC9jb3B5Pg0KLSAgICAgICAgICAgICAgICA8Y29weT4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImZpbGUiPiR7bGlifS8ke3hiZWFucy5wYWNrYWdlZC5qYXIubmFtZX08L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ0b0RpciI+JHtjbGFzc2VzfS9saWI8L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgIDwvY29weT4NCi0gICAgICAgICAgICAgICAgPGphcj4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImRlc3RmaWxlIj4ke2xpYn0vJHtuYW1lfS5hYXI8L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJleGNsdWRlcyI+KiovVGVzdC5jbGFzczwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJkaXIiPiR7Y2xhc3Nlc308L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+DQotICAgICAgICAgICAgICAgIDwvamFyPg0KLSAgICAgICAgICAgIDwvdGFyZ2V0Pg0KLQ0KLSAgICAgICAgICAgIDx0YXJnZXQgbmFtZT0iamFyLmNsaWVudCIgaWY9ImphcnMub2siPg0KLSAgICAgICAgICAgICAgICA8IS0tc2V0IHRoZSBjb3JyZWN0IGRlcGVuZHMgdGFyZ2V0LS0+DQotICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkB0ZXN0T21pdCI+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZGVwZW5kcyI+Y29tcGlsZS5zcmM8L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZGVwZW5kcyI+Y29tcGlsZS50ZXN0PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPg0KLSAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+DQotDQotICAgICAgICAgICAgICAgIDxqYXI+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJkZXN0ZmlsZSI+JHtsaWJ9LyR7bmFtZX0tdGVzdC1jbGllbnQuamFyPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZGlyIj4ke2NsYXNzZXN9PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPjx4c2w6YXR0cmlidXRlIG5hbWU9Im5hbWUiPioqL01FVEEtSU5GLyouKjwveHNsOmF0dHJpYnV0ZT48L2V4Y2x1ZGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+PHhzbDphdHRyaWJ1dGUgbmFtZT0ibmFtZSI+KiovbGliLyouKjwveHNsOmF0dHJpYnV0ZT48L2V4Y2x1ZGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+PHhzbDphdHRyaWJ1dGUgbmFtZT0ibmFtZSI+KiovKk1lc3NhZ2VSZWNlaXZlci5jbGFzczwveHNsOmF0dHJpYnV0ZT48L2V4Y2x1ZGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+PHhzbDphdHRyaWJ1dGUgbmFtZT0ibmFtZSI+KiovKlNrZWxldG9uLmNsYXNzPC94c2w6YXR0cmlidXRlPjwvZXhjbHVkZT4NCi0NCi0gICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4NCi0gICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0Pg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImRpciI+JHtyZXNvdXJjZXN9PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPjx4c2w6YXR0cmlidXRlIG5hbWU9Im5hbWUiPioqLyoud3NkbDwveHNsOmF0dHJpYnV0ZT48L2V4Y2x1ZGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+PHhzbDphdHRyaWJ1dGUgbmFtZT0ibmFtZSI+KiovKi54c2Q8L3hzbDphdHRyaWJ1dGU+PC9leGNsdWRlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPjx4c2w6YXR0cmlidXRlIG5hbWU9Im5hbWUiPioqLyoueG1sPC94c2w6YXR0cmlidXRlPjwvZXhjbHVkZT4NCi0gICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4NCi0gICAgICAgICAgICAgICAgPC9qYXI+DQotICAgICAgICAgICAgPC90YXJnZXQ+DQotDQotICAgICAgICAgICAgPHRhcmdldCBuYW1lPSJtYWtlLnJlcG8iIGRlcGVuZHM9Imphci5zZXJ2ZXIiIGlmPSJqYXJzLm9rIj4NCi0gICAgICAgICAgICAgICAgPG1rZGlyPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZGlyIj4ke2J1aWxkfS9yZXBvLzwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgPC9ta2Rpcj4NCi0gICAgICAgICAgICAgICAgPG1rZGlyPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZGlyIj4ke2J1aWxkfS9yZXBvL3NlcnZpY2VzPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICA8L21rZGlyPg0KLSAgICAgICAgICAgICAgICA8Y29weT4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImZpbGUiPiR7YnVpbGR9L2xpYi8ke25hbWV9LmFhcjwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InRvRGlyIj4ke2J1aWxkfS9yZXBvL3NlcnZpY2VzLzwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgPC9jb3B5Pg0KLSAgICAgICAgICAgIDwvdGFyZ2V0Pg0KLSAgICAgICAgICAgIDx0YXJnZXQgbmFtZT0ic3RhcnQuc2VydmVyIiBkZXBlbmRzPSJtYWtlLnJlcG8iIGlmPSJqYXJzLm9rIj4NCi0gICAgICAgICAgICAgICAgPGphdmEgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLlNpbXBsZUhUVFBTZXJ2ZXIiIGZvcms9InRydWUiPg0KLSAgICAgICAgICAgICAgICAgICAgPGFyZz4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSI+JHtidWlsZH0vcmVwbzwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgIDwvYXJnPg0KLSAgICAgICAgICAgICAgICAgICAgPGNsYXNzcGF0aD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJyZWZpZCI+YXhpczIuY2xhc3MucGF0aDwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgIDwvY2xhc3NwYXRoPg0KLSAgICAgICAgICAgICAgICA8L2phdmE+DQotICAgICAgICAgICAgPC90YXJnZXQ+DQotICAgICAgICAgICAgPHRhcmdldCBuYW1lPSJydW4udGVzdCIgZGVwZW5kcz0iamFyLmNsaWVudCIgaWY9ImphcnMub2siPg0KLSAgICAgICAgICAgICAgICA8cGF0aCBpZD0idGVzdC5jbGFzcy5wYXRoIj4NCi0gICAgICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJsb2NhdGlvbiI+JHtsaWJ9LyR7bmFtZX0tdGVzdC1jbGllbnQuamFyPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgPC9wYXRoZWxlbWVudD4NCi0gICAgICAgICAgICAgICAgICAgIDxwYXRoPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InJlZmlkIj5heGlzMi5jbGFzcy5wYXRoPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgPC9wYXRoPg0KLSAgICAgICAgICAgICAgICA8L3BhdGg+DQotICAgICAgICAgICAgICAgIDxta2Rpcj4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImRpciI+JHtidWlsZH0vdGVzdC1yZXBvcnRzLzwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgPC9ta2Rpcj4NCi0gICAgICAgICAgICAgICAgPGp1bml0IHByaW50c3VtbWFyeT0ieWVzIiBoYWx0b25mYWlsdXJlPSJ5ZXMiPg0KLSAgICAgICAgICAgICAgICAgICAgPGNsYXNzcGF0aD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJyZWZpZCI+dGVzdC5jbGFzcy5wYXRoPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgPC9jbGFzc3BhdGg+DQotICAgICAgICAgICAgICAgICAgICA8Zm9ybWF0dGVyIHR5cGU9InBsYWluIi8+DQotICAgICAgICAgICAgICAgICAgICA8YmF0Y2h0ZXN0IGZvcms9InllcyI+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0idG9EaXIiPiR7YnVpbGR9L3Rlc3QtcmVwb3J0cy88L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImRpciI+JHt0ZXN0fTwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIj4qKi8qVGVzdCouamF2YTwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9pbmNsdWRlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4NCi0gICAgICAgICAgICAgICAgICAgIDwvYmF0Y2h0ZXN0Pg0KLSAgICAgICAgICAgICAgICA8L2p1bml0Pg0KLSAgICAgICAgICAgIDwvdGFyZ2V0Pg0KLSAgICAgICAgICAgIDx0YXJnZXQgbmFtZT0iY2xlYW4iPg0KLSAgICAgICAgICAgICAgICA8ZGVsZXRlPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZGlyIj4ke2J1aWxkfTwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgPC9kZWxldGU+DQotICAgICAgICAgICAgPC90YXJnZXQ+DQotICAgICAgICA8L3Byb2plY3Q+DQotICAgIDwveHNsOnRlbXBsYXRlPg0KLTwveHNsOnN0eWxlc2hlZXQ+DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL3RlbXBsYXRlL2phdmEvQ2FsbGJhY2tIYW5kbGVyVGVtcGxhdGUueHNsIGIvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL3RlbXBsYXRlL2phdmEvQ2FsbGJhY2tIYW5kbGVyVGVtcGxhdGUueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWNlMzZiLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC90ZW1wbGF0ZS9qYXZhL0NhbGxiYWNrSGFuZGxlclRlbXBsYXRlLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIj4KLSAgICA8eHNsOm91dHB1dCBtZXRob2Q9InRleHQiLz4KLSAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvY2FsbGJhY2siPgotLyoqCi0gKiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4uamF2YQotICoKLSAqIFRoaXMgZmlsZSB3YXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBXU0RMCi0gKiBieSB0aGUgQXBhY2hlIEF4aXMyIHZlcnNpb246ICNheGlzVmVyc2lvbiMgI3RvZGF5IwotICovCi0KLSAgICBwYWNrYWdlIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAcGFja2FnZSIvPjsKLQotICAgIC8qKgotICAgICAqICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4gQ2FsbGJhY2sgY2xhc3MsIFVzZXJzIGNhbiBleHRlbmQgdGhpcyBjbGFzcyBhbmQgaW1wbGVtZW50Ci0gICAgICogIHRoZWlyIG93biByZWNlaXZlUmVzdWx0IGFuZCByZWNlaXZlRXJyb3IgbWV0aG9kcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+ewotCi0KLQotICAgIHByb3RlY3RlZCBPYmplY3QgY2xpZW50RGF0YTsKLQotICAgIC8qKgotICAgICogVXNlciBjYW4gcGFzcyBpbiBhbnkgb2JqZWN0IHRoYXQgbmVlZHMgdG8gYmUgYWNjZXNzZWQgb25jZSB0aGUgTm9uQmxvY2tpbmcKLSAgICAqIFdlYiBzZXJ2aWNlIGNhbGwgaXMgZmluaXNoZWQgYW5kIGFwcHJvcHJpYXRlIG1ldGhvZCBvZiB0aGlzIENhbGxCYWNrIGlzIGNhbGxlZC4KLSAgICAqIEBwYXJhbSBjbGllbnREYXRhIE9iamVjdCBtZWNoYW5pc20gYnkgd2hpY2ggdGhlIHVzZXIgY2FuIHBhc3MgaW4gdXNlciBkYXRhCi0gICAgKiB0aGF0IHdpbGwgYmUgYXZpbGFibGUgYXQgdGhlIHRpbWUgdGhpcyBjYWxsYmFjayBpcyBjYWxsZWQuCi0gICAgKi8KLSAgICBwdWJsaWMgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+KE9iamVjdCBjbGllbnREYXRhKXsKLSAgICAgICAgdGhpcy5jbGllbnREYXRhID0gY2xpZW50RGF0YTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFBsZWFzZSB1c2UgdGhpcyBjb25zdHJ1Y3RvciBpZiB5b3UgZG9uJ3Qgd2FudCB0byBzZXQgYW55IGNsaWVudERhdGEKLSAgICAqLwotICAgIHB1YmxpYyA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4oKXsKLSAgICAgICAgdGhpcy5jbGllbnREYXRhID0gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGNsaWVudCBkYXRhCi0gICAgICovCi0KLSAgICAgcHVibGljIE9iamVjdCBnZXRDbGllbnREYXRhKCkgewotICAgICAgICByZXR1cm4gY2xpZW50RGF0YTsKLSAgICAgfQotCi0gICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJtZXRob2QiPgotICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJvdXRQYXJhbVR5cGUiIHNlbGVjdD0ib3V0cHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keSddL0B0eXBlIj48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ib3V0UGFyYW1OYW1lIiBzZWxlY3Q9Im91dHB1dC9wYXJhbS9AbmFtZSI+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im91dFBhcmFtQ29tcGxleFR5cGUiIHNlbGVjdD0ib3V0cHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keSddL0Bjb21wbGV4dHlwZSI+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im91dFBhcmFtQ291bnQiIHNlbGVjdD0iY291bnQob3V0cHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keSddL3BhcmFtKSI+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im1lcCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBtZXAiLz48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaXNVbndyYXBQYXJhbWV0ZXJzIiBzZWxlY3Q9ImlucHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keScgYW5kIEB0eXBlIT0nJ10vQHVud3JhcHBQYXJhbWV0ZXJzIi8+Ci0gICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICA8IS0tIENvZGUgZ2VuZXJhdGlvbiBmb3IgaW4tb3V0IG9ubHkuIE5lZWQgdG8gY29uc2lkZXIgdGhlIG90aGVyIG1lcHMgYWxzbwotICAgICAgICAgICAgICAgICAgICBUaGV5IHNob3VsZCBiZSBwYXJ0cyBvZiB0aGlzIHhzbDpjaG9vc2UgbG9vcCAtLT4KLSAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG1lcD0nMTInIj4KLSAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIGF1dG8gZ2VuZXJhdGVkIEF4aXMyIGNhbGwgYmFjayBtZXRob2QgZm9yIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPiBtZXRob2QKLSAgICAgICAgICAgICogb3ZlcnJpZGUgdGhpcyBtZXRob2QgZm9yIGhhbmRsaW5nIG5vcm1hbCByZXNwb25zZSBmcm9tIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPiBvcGVyYXRpb24KLSAgICAgICAgICAgICovCi0gICAgICAgICAgIHB1YmxpYyB2b2lkIHJlY2VpdmVSZXN1bHQ8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4oCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRvdXRQYXJhbUNvdW50PTEiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ib3V0cHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keSddL3BhcmFtL0B0eXBlIi8+PHhzbDp0ZXh0PiA8L3hzbDp0ZXh0PnJlc3VsdAotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJzdHJpbmctbGVuZ3RoKG5vcm1hbGl6ZS1zcGFjZSgkb3V0UGFyYW1Db21wbGV4VHlwZSkpID4gMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvdXRQYXJhbUNvbXBsZXhUeXBlIi8+PHhzbDp0ZXh0PiA8L3hzbDp0ZXh0PnJlc3VsdAotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIoJG91dFBhcmFtQ291bnQ9MCkgYW5kICgkaXNVbndyYXBQYXJhbWV0ZXJzKSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9InN0cmluZy1sZW5ndGgobm9ybWFsaXplLXNwYWNlKCRvdXRQYXJhbVR5cGUpKSA+IDAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkb3V0UGFyYW1UeXBlIi8+PHhzbDp0ZXh0PiA8L3hzbDp0ZXh0PnJlc3VsdAotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPikgewotICAgICAgICAgICB9Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBhdXRvIGdlbmVyYXRlZCBBeGlzMiBFcnJvciBoYW5kbGVyCi0gICAgICAgICAgICogb3ZlcnJpZGUgdGhpcyBtZXRob2QgZm9yIGhhbmRsaW5nIGVycm9yIHJlc3BvbnNlIGZyb20gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+IG9wZXJhdGlvbgotICAgICAgICAgICAqLwotICAgICAgICAgICAgcHVibGljIHZvaWQgcmVjZWl2ZUVycm9yPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+KGphdmEubGFuZy5FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAvLyBObyBtZXRob2RzIGdlbmVyYXRlZCBmb3IgbWVwcyBvdGhlciB0aGFuIGluLW91dAotICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgIDwveHNsOmNob29zZT4KLQotCi0gICAgICAgIDwveHNsOmZvci1lYWNoPgotCi0KLSAgICB9Ci0gICAgPC94c2w6dGVtcGxhdGU+Ci08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL3RlbXBsYXRlL2phdmEvRXhjZXB0aW9uVGVtcGxhdGUueHNsIGIvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL3RlbXBsYXRlL2phdmEvRXhjZXB0aW9uVGVtcGxhdGUueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2JiNDhmLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC90ZW1wbGF0ZS9qYXZhL0V4Y2VwdGlvblRlbXBsYXRlLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIj4NCi0gICAgPHhzbDpvdXRwdXQgbWV0aG9kPSJ0ZXh0Ii8+DQotICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii9mYXVsdCI+DQotLyoqDQotICogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+LmphdmENCi0gKg0KLSAqIFRoaXMgZmlsZSB3YXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBXU0RMDQotICogYnkgdGhlIEFwYWNoZSBBeGlzMiB2ZXJzaW9uOiAjYXhpc1ZlcnNpb24jICN0b2RheSMNCi0gKi8NCi0NCi1wYWNrYWdlIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAcGFja2FnZSIvPjsNCi0NCi1wdWJsaWMgY2xhc3MgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBzaG9ydE5hbWUiLz4gZXh0ZW5kcyA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGV4Y2VwdGlvbkJhc2VDbGFzcyIvPnsNCi0gICAgDQotICAgIHByaXZhdGUgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+IGZhdWx0TWVzc2FnZTsNCi0NCi0gICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJjbGFzc1Nob3J0TmFtZSIgc2VsZWN0PSJAc2hvcnROYW1lIi8+DQotICAgIDx4c2w6aWYgdGVzdD0iY291bnQoY29uc3RydWN0b3IpID4gMCI+DQotICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iY29uc3RydWN0b3IiPg0KLSAgICAgICAgICAgICBwdWJsaWMgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjbGFzc1Nob3J0TmFtZSIvPig8eHNsOmZvci1lYWNoIHNlbGVjdD0icGFyYW0iPjx4c2w6aWYgdGVzdD0icG9zaXRpb24oKSA+IDEiPiw8L3hzbDppZj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz48eHNsOnRleHQ+IDwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PC94c2w6Zm9yLWVhY2g+KSB7DQotICAgICAgICAgICAgICAgIHN1cGVyKDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJwYXJhbSI+PHhzbDppZiB0ZXN0PSJwb3NpdGlvbigpID4gMSI+LDwveHNsOmlmPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwveHNsOmZvci1lYWNoPik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgPC94c2w6Zm9yLWVhY2g+DQotICAgIDwveHNsOmlmPg0KLSAgICA8eHNsOmlmIHRlc3Q9ImNvdW50KGNvbnN0cnVjdG9yKSA9IDAiPg0KLSAgICAgICAgcHVibGljIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAc2hvcnROYW1lIi8+KCkgew0KLSAgICAgICAgICAgIHN1cGVyKCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHNob3J0TmFtZSIvPiIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAc2hvcnROYW1lIi8+KGphdmEubGFuZy5TdHJpbmcgcykgew0KLSAgICAgICAgICAgc3VwZXIocyk7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBzaG9ydE5hbWUiLz4oamF2YS5sYW5nLlN0cmluZyBzLCBqYXZhLmxhbmcuVGhyb3dhYmxlIGV4KSB7DQotICAgICAgICAgIHN1cGVyKHMsIGV4KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHNob3J0TmFtZSIvPihqYXZhLmxhbmcuVGhyb3dhYmxlIGNhdXNlKSB7DQotICAgICAgICAgICAgc3VwZXIoY2F1c2UpOw0KLSAgICAgICAgfQ0KLSAgICA8L3hzbDppZj4NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RmF1bHRNZXNzYWdlKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPiBtc2cpew0KLSAgICAgICBmYXVsdE1lc3NhZ2UgPSBtc2c7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz4gZ2V0RmF1bHRNZXNzYWdlKCl7DQotICAgICAgIHJldHVybiBmYXVsdE1lc3NhZ2U7DQotICAgIH0NCi19DQotICAgIDwveHNsOnRlbXBsYXRlPg0KLTwveHNsOnN0eWxlc2hlZXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL3RlbXBsYXRlL2phdmEvSW50ZXJmYWNlSW1wbGVtZW50YXRpb25UZW1wbGF0ZS54c2wgYi92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdGVtcGxhdGUvamF2YS9JbnRlcmZhY2VJbXBsZW1lbnRhdGlvblRlbXBsYXRlLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc3N2E1Ni4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdGVtcGxhdGUvamF2YS9JbnRlcmZhY2VJbXBsZW1lbnRhdGlvblRlbXBsYXRlLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDExNjAgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIiB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSI+Ci0gICAgPHhzbDpvdXRwdXQgbWV0aG9kPSJ0ZXh0Ii8+Ci0KLSAgICA8IS0tIGltcG9ydCB0aGUgZGF0YWJpbmRpbmcgdGVtcGxhdGUtLT4KLSAgICA8eHNsOmluY2x1ZGUgaHJlZj0iZGF0YWJpbmRzdXBwb3J0ZXIiLz4KLSAgICA8IS0tIGltcG9ydCB0aGUgb3RoZXIgdGVtcGxhdGVzIGZvciBkYXRhYmluZGluZwotICAgICAgICAgTm90ZSAgLSAgdGhlc2UgbmFtZXMgd291bGQgYmUgaGFuZGxlZCBieSBhIHNwZWNpYWwKLSAgICAgICAgIFVSSSByZXNvbHZlciBkdXJpbmcgdGhlIHhzbHQgdHJhbnNmb3JtYXRpb25zCi0gICAgIC0tPgotICAgIDx4c2w6aW5jbHVkZSBocmVmPSJleHRlcm5hbFRlbXBsYXRlIi8+Ci0gICAgCi0gICAgCi0gICAgPHhzbDppbmNsdWRlIGhyZWY9InBvbGljeUV4dGVuc2lvblRlbXBsYXRlIi8+Ci0KLSAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvY2xhc3MiPgotICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImludGVyZmFjZU5hbWUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAaW50ZXJmYWNlTmFtZSIvPjwveHNsOnZhcmlhYmxlPgotICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InBhY2thZ2UiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAcGFja2FnZSIvPjwveHNsOnZhcmlhYmxlPgotICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImNhbGxiYWNrbmFtZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBjYWxsYmFja25hbWUiLz48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJpc1N5bmMiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAaXNTeW5jIi8+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaXNBc3luYyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBpc0FzeW5jIi8+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ic29hcFZlcnNpb24iPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAc29hcC12ZXJzaW9uIi8+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaXNiYWNrY29tcGF0aWJsZSIgc2VsZWN0PSJAaXNiYWNrY29tcGF0aWJsZSIvPgotLyoqCi0gKiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4uamF2YQotICoKLSAqIFRoaXMgZmlsZSB3YXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBXU0RMCi0gKiBieSB0aGUgQXBhY2hlIEF4aXMyIHZlcnNpb246ICNheGlzVmVyc2lvbiMgI3RvZGF5IwotICovCi0gICAgICAgIHBhY2thZ2UgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwYWNrYWdlIi8+OwotCi0gICAgICAgIDwhLS0gUHV0IHRoZSBNVE9NIGVuYWJsZSBmbGFnIC0tPgotCi0gICAgICAgIC8qCi0gICAgICAgICogIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPiBqYXZhIGltcGxlbWVudGF0aW9uCi0gICAgICAgICovCi0KLSAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJmdWxseVF1YWxpZmllZENsYXNzTmFtZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwYWNrYWdlIi8+Ljx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwveHNsOnZhcmlhYmxlPgotICAgICAgICBwdWJsaWMgY2xhc3MgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+IGV4dGVuZHMgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuU3R1YgotICAgICAgICA8eHNsOmlmIHRlc3Q9Im5vdChAd3JhcHBlZCkiPmltcGxlbWVudHMgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbnRlcmZhY2VOYW1lIi8+PC94c2w6aWY+ewotICAgICAgICBwcm90ZWN0ZWQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uW10gX29wZXJhdGlvbnM7Ci0KLSAgICAgICAgLy9oYXNobWFwcyB0byBrZWVwIHRoZSBmYXVsdCBtYXBwaW5nCi0gICAgICAgIHByaXZhdGUgamF2YS51dGlsLkhhc2hNYXAgZmF1bHRFeGNlcHRpb25OYW1lTWFwID0gbmV3IGphdmEudXRpbC5IYXNoTWFwKCk7Ci0gICAgICAgIHByaXZhdGUgamF2YS51dGlsLkhhc2hNYXAgZmF1bHRFeGNlcHRpb25DbGFzc05hbWVNYXAgPSBuZXcgamF2YS51dGlsLkhhc2hNYXAoKTsKLSAgICAgICAgcHJpdmF0ZSBqYXZhLnV0aWwuSGFzaE1hcCBmYXVsdE1lc3NhZ2VNYXAgPSBuZXcgamF2YS51dGlsLkhhc2hNYXAoKTsKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBpbnQgY291bnRlciA9IDA7Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgc3luY2hyb25pemVkIGphdmEubGFuZy5TdHJpbmcgZ2V0VW5pcXVlU3VmZml4KCl7Ci0gICAgICAgICAgICAvLyByZXNldCB0aGUgY291bnRlciBpZiBpdCBpcyBncmVhdGVyIHRoYW4gOTk5OTkKLSAgICAgICAgICAgIGlmIChjb3VudGVyID4gOTk5OTkpewotICAgICAgICAgICAgICAgIGNvdW50ZXIgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY291bnRlciA9IGNvdW50ZXIgKyAxOyAKLSAgICAgICAgICAgIHJldHVybiBqYXZhLmxhbmcuTG9uZy50b1N0cmluZyhTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSkgKyAiXyIgKyBjb3VudGVyOwotICAgICAgICB9Ci0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgcG9wdWxhdGVBeGlzU2VydmljZSgpIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdCB7Ci0KLSAgICAgLy9jcmVhdGluZyB0aGUgU2VydmljZSB3aXRoIGEgdW5pcXVlIG5hbWUKLSAgICAgX3NlcnZpY2UgPSBuZXcgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZSgiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBzZXJ2aWNlbmFtZSIvPiIgKyBnZXRVbmlxdWVTdWZmaXgoKSk7Ci0gICAgIGFkZEFub255bW91c09wZXJhdGlvbnMoKTsKLQotICAgICAgICAvL2NyZWF0aW5nIHRoZSBvcGVyYXRpb25zCi0gICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbiBfX29wZXJhdGlvbjsKLQotICAgICAgICBfb3BlcmF0aW9ucyA9IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb25bPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImNvdW50KG1ldGhvZCkiLz5dOwotICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0ibWV0aG9kIj4KLSAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAbWVwPScxMCciPgotICAgICAgICAgICAgICAgICAgICBfX29wZXJhdGlvbiA9IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLk91dE9ubHlBeGlzT3BlcmF0aW9uKCk7Ci0gICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQG1lcD0nMTEnIj4KLSAgICAgICAgICAgICAgICAgICAgX19vcGVyYXRpb24gPSBuZXcgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5Sb2J1c3RPdXRPbmx5QXhpc09wZXJhdGlvbigpOwotICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgX19vcGVyYXRpb24gPSBuZXcgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5PdXRJbkF4aXNPcGVyYXRpb24oKTsKLSAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0KLSAgICAgICAgICAgIF9fb3BlcmF0aW9uLnNldE5hbWUobmV3IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUoIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZXNwYWNlIi8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPiIpKTsKLQkgICAgX3NlcnZpY2UuYWRkT3BlcmF0aW9uKF9fb3BlcmF0aW9uKTsKLQkgICAgCi0KLQkgICAgPHhzbDppZiB0ZXN0PSJpbnB1dC9AcG9saWN5Ij4KLQkgICAgKF9fb3BlcmF0aW9uKS5nZXRNZXNzYWdlKG9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfT1VUX1ZBTFVFKS5nZXRQb2xpY3lTdWJqZWN0KCkuYXR0YWNoUG9saWN5KGdldFBvbGljeSgiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImlucHV0L0Bwb2xpY3kiLz4iKSk7Ci0JICAgIDwveHNsOmlmPgotCSAgICAKLQkgICAgPHhzbDppZiB0ZXN0PSJvdXRwdXQvQHBvbGljeSI+Ci0JICAgIChfX29wZXJhdGlvbikuZ2V0TWVzc2FnZShvcmcuYXBhY2hlLmF4aXMyLndzZGwuV1NETENvbnN0YW50cy5NRVNTQUdFX0xBQkVMX0lOX1ZBTFVFKS5nZXRQb2xpY3lTdWJqZWN0KCkuYXR0YWNoUG9saWN5KGdldFBvbGljeSgiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im91dHB1dC9AcG9saWN5Ii8+IikpOwotCSAgICA8L3hzbDppZj4KLQkgICAgCi0gICAgICAgICAgICBfb3BlcmF0aW9uc1s8eHNsOnZhbHVlLW9mIHNlbGVjdD0icG9zaXRpb24oKS0xIi8+XT1fX29wZXJhdGlvbjsKLSAgICAgICAgICAgIAotICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICAgICAgfQotCi0gICAgLy9wb3B1bGF0ZXMgdGhlIGZhdWx0cwotICAgIHByaXZhdGUgdm9pZCBwb3B1bGF0ZUZhdWx0cygpewotICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Im1ldGhvZCI+Ci0gICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJmYXVsdC9wYXJhbSI+Ci0gICAgICAgICAgICAgIGZhdWx0RXhjZXB0aW9uTmFtZU1hcC5wdXQoIG5ldyBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lKCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWVzcGFjZSIvPiIsIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbG9jYWxuYW1lIi8+IiksIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPiIpOwotICAgICAgICAgICAgICBmYXVsdEV4Y2VwdGlvbkNsYXNzTmFtZU1hcC5wdXQobmV3IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUoIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZXNwYWNlIi8+IiwiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsb2NhbG5hbWUiLz4iKSwiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+Iik7Ci0gICAgICAgICAgICAgIGZhdWx0TWVzc2FnZU1hcC5wdXQoIG5ldyBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lKCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWVzcGFjZSIvPiIsIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbG9jYWxuYW1lIi8+IiksIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAaW5zdGFudGlhdGFibGVUeXBlIi8+Iik7Ci0gICAgICAgICAgIDwveHNsOmZvci1lYWNoPgotICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLQotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICAqQ29uc3RydWN0b3IgdGhhdCB0YWtlcyBpbiBhIGNvbmZpZ0NvbnRleHQKLSAgICAgICovCi0KLSAgICBwdWJsaWMgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+KG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dCBjb25maWd1cmF0aW9uQ29udGV4dCwKLSAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHRhcmdldEVuZHBvaW50KQotICAgICAgIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdCB7Ci0gICAgICAgICB0aGlzKGNvbmZpZ3VyYXRpb25Db250ZXh0LHRhcmdldEVuZHBvaW50LGZhbHNlKTsKLSAgIH0KLQotCi0gICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciB0aGF0IHRha2VzIGluIGEgY29uZmlnQ29udGV4dCAgYW5kIHVzZXNlcGVyYXRlIGxpc3RuZXIKLSAgICAgKi8KLSAgIHB1YmxpYyA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4ob3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ3VyYXRpb25Db250ZXh0LAotICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHRhcmdldEVuZHBvaW50LCBib29sZWFuIHVzZVNlcGFyYXRlTGlzdGVuZXIpCi0gICAgICAgIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdCB7Ci0gICAgICAgICAvL1RvIHBvcHVsYXRlIEF4aXNTZXJ2aWNlCi0gICAgICAgICBwb3B1bGF0ZUF4aXNTZXJ2aWNlKCk7Ci0gICAgICAgICBwb3B1bGF0ZUZhdWx0cygpOwotCi0gICAgICAgIF9zZXJ2aWNlQ2xpZW50ID0gbmV3IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50LlNlcnZpY2VDbGllbnQoY29uZmlndXJhdGlvbkNvbnRleHQsX3NlcnZpY2UpOwotICAgICAgICA8eHNsOmlmIHRlc3Q9Ii8vQHBvbGljeSI+Ci0gICAgICAgIF9zZXJ2aWNlLmFwcGx5UG9saWN5KCk7Ci0gICAgICAgIDwveHNsOmlmPgotCQotICAgICAgICBfc2VydmljZUNsaWVudC5nZXRPcHRpb25zKCkuc2V0VG8obmV3IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZSgKLSAgICAgICAgICAgICAgICB0YXJnZXRFbmRwb2ludCkpOwotICAgICAgICBfc2VydmljZUNsaWVudC5nZXRPcHRpb25zKCkuc2V0VXNlU2VwYXJhdGVMaXN0ZW5lcih1c2VTZXBhcmF0ZUxpc3RlbmVyKTsKLSAgICAgICAgPHhzbDppZiB0ZXN0PSJzdGFydHMtd2l0aCgkc29hcFZlcnNpb24sJ2h0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZScpIj4KLSAgICAgICAgICAgIC8vU2V0IHRoZSBzb2FwIHZlcnNpb24KLSAgICAgICAgICAgIF9zZXJ2aWNlQ2xpZW50LmdldE9wdGlvbnMoKS5zZXRTb2FwVmVyc2lvblVSSShvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUDEyQ29uc3RhbnRzLlNPQVBfRU5WRUxPUEVfTkFNRVNQQUNFX1VSSSk7Ci0gICAgICAgIDwveHNsOmlmPgotICAgIAotICAgIH0KLQotICAgIC8qKgotICAgICAqIERlZmF1bHQgQ29uc3RydWN0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+KG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dCBjb25maWd1cmF0aW9uQ29udGV4dCkgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0IHsKLSAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImVuZHBvaW50Ij4KLSAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJwb3NpdGlvbigpPTEiPgotICAgICAgICAgICAgICAgICAgICB0aGlzKGNvbmZpZ3VyYXRpb25Db250ZXh0LCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iLiIvPiIgKTsKLSAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAvL3RoaXMoY29uZmlndXJhdGlvbkNvbnRleHQsIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuIi8+IiApOwotICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGVmYXVsdCBDb25zdHJ1Y3RvcgotICAgICAqLwotICAgIHB1YmxpYyA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4oKSB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQgewotICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iZW5kcG9pbnQiPgotICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9InBvc2l0aW9uKCk9MSI+Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMoIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuIi8+IiApOwotICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgIC8vdGhpcygiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4iLz4iICk7Ci0gICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciB0YWtpbmcgdGhlIHRhcmdldCBlbmRwb2ludAotICAgICAqLwotICAgIHB1YmxpYyA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4oamF2YS5sYW5nLlN0cmluZyB0YXJnZXRFbmRwb2ludCkgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0IHsKLSAgICAgICAgdGhpcyhudWxsLHRhcmdldEVuZHBvaW50KTsKLSAgICB9Ci0KLQotCi0gICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJtZXRob2QiPgotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgPCEtLSBJZiB1c2VkYm1ldGhvZCBhdHRyaWJ1dGUgcHJlc2VudCwgZ2l2ZXMgbmFtZSBvZiBtZXRob2QgdG8gY2FsbCBmb3IgaW1wbGVtZW50YXRpb24gLS0+Ci0gICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJ1c2VkYmltcGwiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdXNkYmltcGwiLz48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICA8eHNsOmlmIHRlc3Q9IiR1c2VkYmltcGwhPSd0cnVlJyI+Ci0gICAgICAgICAgCi0gICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im91dHB1dHR5cGUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJvdXRwdXQvcGFyYW1bQGxvY2F0aW9uPSdib2R5J10vQHR5cGUiLz48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ib3V0cHV0Y29tcGxleHR5cGUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJvdXRwdXQvcGFyYW1bQGxvY2F0aW9uPSdib2R5J10vQGNvbXBsZXh0eXBlIi8+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im91dHB1dG9wbmFtZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im91dHB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknXS9Ab3BuYW1lIi8+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InN0eWxlIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHN0eWxlIj48L3hzbDp2YWx1ZS1vZj48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ic29hcEFjdGlvbiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBzb2FwYWN0aW9uIj48L3hzbDp2YWx1ZS1vZj48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ibWVwIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG1lcCIvPjwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJvdXRwdXRwYXJhbWNvdW50Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iY291bnQob3V0cHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keSddL3BhcmFtKSIvPjwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJvdXRwdXRwYXJhbXNob3J0dHlwZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im91dHB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknXS9Ac2hvcnR0eXBlIi8+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im91dHB1dHBhcmFtcGFydG5hbWUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJvdXRwdXQvcGFyYW1bQGxvY2F0aW9uPSdib2R5J10vcGFyYW0vQHBhcnRuYW1lIi8+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImlzVW53cmFwUGFyYW1ldGVycyIgc2VsZWN0PSJpbnB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknIGFuZCBAdHlwZSE9JyddL0B1bndyYXBwUGFyYW1ldGVycyIvPgotICAgICAgICA8IS0tIE1UT00gLS0+Ci0gICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ibWV0aG9kLW5hbWUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwveHNsOnZhcmlhYmxlPgotICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im1ldGhvZC1ucyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lc3BhY2UiLz4gPC94c2w6dmFyaWFibGU+Ci0gICAgICAgIDwhLS0gTVRPTSAtLT4KLQotICAgICAgICAgICAgPCEtLSBDb2RlIGdlbmVyYXRpb24gZm9yIHRoZSBpbi1vdXQgbWVwIC0tPgotICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSIkbWVwPScxMiciPiAgPCEtLSBUaGVzZSBjb25zdGFudHMgY2FuIGJlIGZvdW5kIGluIG9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMQ29uc3RhbnRzIC0tPgotICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iJGlzU3luYz0nMSciPgotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgbWV0aG9kIHNpZ25hdHVyZQotICAgICAgICAgICAgICAgICAgICAgKiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGNvbW1lbnQiLz4KLSAgICAgICAgICAgICAgICAgICAgICogQHNlZSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBhY2thZ2UiLz4uPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbnRlcmZhY2VOYW1lIi8+Izx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPgotICAgICAgICAgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iaW5wdXQvcGFyYW1bQHR5cGUhPScnXSI+Ci0gICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiPjwveHNsOnZhbHVlLW9mPjx4c2w6dGV4dD4KLSAgICAgICAgICAgICAgICAgICAgPC94c2w6dGV4dD48L3hzbDpmb3ItZWFjaD4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImZhdWx0L3BhcmFtW0B0eXBlIT0nJ10iPgotICAgICAgICAgICAgICAgICAgICAgKiBAdGhyb3dzIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPiA6IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAY29tbWVudCIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGlmIC1iIGZsYWcgaXMgb24gdGhlbiB3ZSBoYXZlIHRvIHVud3JhcCB0aGUgcmVxdWVzdCBhbmQgcmVzcG9uc2UgbWVzc2FnZXMuIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRpc2JhY2tjb21wYXRpYmxlID0gJ3RydWUnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgPHhzbDpjaG9vc2U+PHhzbDp3aGVuIHRlc3Q9IiRvdXRwdXR0eXBlPScnIj52b2lkPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0ic3RyaW5nLWxlbmd0aChub3JtYWxpemUtc3BhY2UoJG91dHB1dGNvbXBsZXh0eXBlKSkgPiAwIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG91dHB1dGNvbXBsZXh0eXBlIi8+PC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG91dHB1dHR5cGUiLz48L3hzbDpvdGhlcndpc2U+PC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dGV4dD4gPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4oCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImlucHV0Y291bnQiIHNlbGVjdD0iY291bnQoaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdib2R5JyBhbmQgQHR5cGUhPScnXSkiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRpbnB1dGNvdW50PTEiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJpbnB1dENvbXBsZXhUeXBlIiBzZWxlY3Q9ImlucHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keScgYW5kIEB0eXBlIT0nJ10vQGNvbXBsZXh0eXBlIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0ic3RyaW5nLWxlbmd0aChub3JtYWxpemUtc3BhY2UoJGlucHV0Q29tcGxleFR5cGUpKSA+IDAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW5wdXRDb21wbGV4VHlwZSIvPjx4c2w6dGV4dD4gPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdib2R5JyBhbmQgQHR5cGUhPScnXS9AbmFtZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJpbnB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknIGFuZCBAdHlwZSE9JyddL0B0eXBlIi8+PHhzbDp0ZXh0PiA8L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJpbnB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknIGFuZCBAdHlwZSE9JyddL0BuYW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT48IS0tIEp1c3QgbGVhdmUgaXQgLSBub3RoaW5nIHdlIGNhbiBkbyBoZXJlIC0tPjwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IiRpbnB1dGNvdW50PTEgYW5kIGlucHV0L3BhcmFtW25vdChAbG9jYXRpb249J2JvZHknKSBhbmQgQHR5cGUhPScnXSI+LDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJpbnB1dC9wYXJhbVtub3QoQGxvY2F0aW9uPSdib2R5JykgYW5kIEB0eXBlIT0nJ10iPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9InBvc2l0aW9uKCk+MSI+LDwveHNsOmlmPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPjx4c2w6dGV4dD4gPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4pCi0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkb3V0cHV0dHlwZT0nJyI+dm9pZDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRvdXRwdXRwYXJhbWNvdW50PTEiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJvdXRwdXQvcGFyYW1bQGxvY2F0aW9uPSdib2R5J10vcGFyYW0vQHR5cGUiLz48L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJzdHJpbmctbGVuZ3RoKG5vcm1hbGl6ZS1zcGFjZSgkb3V0cHV0Y29tcGxleHR5cGUpKSA+IDAiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkb3V0cHV0Y29tcGxleHR5cGUiLz48L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIoJG91dHB1dHBhcmFtY291bnQ9MCkgYW5kICgkaXNVbndyYXBQYXJhbWV0ZXJzKSI+dm9pZDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvdXRwdXR0eXBlIi8+PC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnRleHQ+IDwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+KAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJpbnB1dGNvdW50IiBzZWxlY3Q9ImNvdW50KGlucHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keScgYW5kIEB0eXBlIT0nJ10pIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJpbnB1dFBhcmFtQ291bnQiIHNlbGVjdD0iY291bnQoaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdib2R5JyBhbmQgQHR5cGUhPScnXS9wYXJhbSkiLz4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGlucHV0Y291bnQ9MSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEV2ZW4gd2hlbiB0aGUgcGFyYW1ldGVycyBhcmUgMSB3ZSBoYXZlIHRvIHNlZSB3aGV0aGVyIHdlIGhhdmUgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlZCBwYXJhbWV0ZXJzIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRpc1Vud3JhcFBhcmFtZXRlcnMiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJpbnB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknIGFuZCBAdHlwZSE9JyddL3BhcmFtIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0icG9zaXRpb24oKT4xIj4sPC94c2w6aWY+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+PHhzbDp0ZXh0PiA8L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdib2R5JyBhbmQgQHR5cGUhPScnXS9AdHlwZSIvPjx4c2w6dGV4dD4gPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdib2R5JyBhbmQgQHR5cGUhPScnXS9AbmFtZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+PCEtLSBKdXN0IGxlYXZlIGl0IC0gbm90aGluZyB3ZSBjYW4gZG8gaGVyZSAtLT48L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSIoJGlucHV0Y291bnQ9MSBhbmQgaW5wdXQvcGFyYW1bbm90KEBsb2NhdGlvbj0nYm9keScpIGFuZCBAdHlwZSE9JyddKSBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90KCRpc1Vud3JhcFBhcmFtZXRlcnMgYW5kICRpbnB1dFBhcmFtQ291bnQ9MCkiPiw8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iaW5wdXQvcGFyYW1bbm90KEBsb2NhdGlvbj0nYm9keScpIGFuZCBAdHlwZSE9JyddIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJwb3NpdGlvbigpPjEiPiw8L3hzbDppZj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz48eHNsOnRleHQ+IDwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+KQotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0KLSAgICAgICAgICAgICAgICAgICAgdGhyb3dzIGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbgotICAgICAgICAgICAgICAgICAgICA8IS0tYWRkIHRoZSBmYXVsdHMtLT4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImZhdWx0L3BhcmFtW0B0eXBlIT0nJ10iPgotICAgICAgICAgICAgICAgICAgICAgICAgLDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD57Ci0gICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dCBfbWVzc2FnZUNvbnRleHQgPSBudWxsOwotICAgICAgICAgICAgICB0cnl7Ci0gICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5PcGVyYXRpb25DbGllbnQgX29wZXJhdGlvbkNsaWVudCA9IF9zZXJ2aWNlQ2xpZW50LmNyZWF0ZUNsaWVudChfb3BlcmF0aW9uc1s8eHNsOnZhbHVlLW9mIHNlbGVjdD0icG9zaXRpb24oKS0xIi8+XS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICBfb3BlcmF0aW9uQ2xpZW50LmdldE9wdGlvbnMoKS5zZXRBY3Rpb24oIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc29hcEFjdGlvbiIvPiIpOwotICAgICAgICAgICAgICBfb3BlcmF0aW9uQ2xpZW50LmdldE9wdGlvbnMoKS5zZXRFeGNlcHRpb25Ub0JlVGhyb3duT25TT0FQRmF1bHQodHJ1ZSk7Ci0KLSAgICAgICAgICAgICAgPCEtLSBhZGQgdGhlIG90aGVyIHBhcmFtZXRlciBvcHRpb25zIHRvIG9wZXJhdGlvbmFsIGNsaWVudCAtLT4KLSAgICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Im9wdGlvblBhcmFtIj4KLSAgICAgICAgICAgICAgICAgIGFkZFByb3BlcnR5VG9PcGVyYXRpb25DbGllbnQoX29wZXJhdGlvbkNsaWVudCw8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4sPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB2YWx1ZSIvPik7Ci0gICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPgotCi0gICAgICAgICAgICAgIC8vIGNyZWF0ZSBhIG1lc3NhZ2UgY29udGV4dAotICAgICAgICAgICAgICBfbWVzc2FnZUNvbnRleHQgPSBuZXcgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0KCk7Ci0KLSAgICAgICAgICAgICAgPCEtLXRvZG8gaWYgdGhlIHN0dWIgd2FzIGdlbmVyYXRlZCB3aXRoIHVud3JhcHBpbmcsIHdyYXAgYWxsIHBhcmFtZXRlcnMgaW50byBhIHNpbmdsZSBlbGVtZW50LS0+Ci0KLSAgICAgICAgICAgICAgLy8gY3JlYXRlIFNPQVAgZW52ZWxvcGUgd2l0aCB0aGF0IHBheWxvYWQKLSAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZSBlbnYgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImNvdW50IiBzZWxlY3Q9ImNvdW50KGlucHV0L3BhcmFtW0B0eXBlIT0nJ10pIi8+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSB0ZXN0IHRoZSBudW1iZXIgb2YgaW5wdXQgcGFyYW1ldGVycwotICAgICAgICAgICAgICAgICAgICAgICAgSWYgdGhlIG51bWJlciBvZiBwYXJhbWV0ZXIgaXMgbW9yZSB0aGVuIGp1c3QgcnVuIHRoZSBub3JtYWwgdGVzdC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRjb3VudCAmZ3Q7IDAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIHN0eWxlIGJlaW5nIGRvY2xpdCBvciBycGMgZG9lcyBub3QgbWF0dGVyIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJHN0eWxlPSdycGMnIG9yICRzdHlsZT0nZG9jdW1lbnQnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaW5wdXRjb3VudCIgc2VsZWN0PSJjb3VudChpbnB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknIGFuZCBAdHlwZSE9JyddKSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRpbnB1dGNvdW50PTEiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEV2ZW4gd2hlbiB0aGUgcGFyYW1ldGVycyBhcmUgMSB3ZSBoYXZlIHRvIHNlZSB3aGV0aGVyIHdlIGhhdmUgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVkIHBhcmFtZXRlcnMgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gdW53cmFwcGluZyB0YWtlcyBwbGFjZSBvbmx5IGlmIHRoZSBiYWNrIHdvcmQgY29tcGF0aWJsaXR5IGlzIG9mZi4gaWYgLWIgb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW4gd2UgZG8gbm90IHVud3JhcHAgYW5kIG9ubHkgcmVtb3ZlIHRoZSB0b3AgZWxlbWVudCAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImlucHV0RWxlbWVudFR5cGUiIHNlbGVjdD0iaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdib2R5JyBhbmQgQHR5cGUhPScnXS9AdHlwZSI+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJpbnB1dEVsZW1lbnRDb21wbGV4VHlwZSIgc2VsZWN0PSJpbnB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknIGFuZCBAdHlwZSE9JyddL0Bjb21wbGV4dHlwZSI+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJvcE5hbWUiIHNlbGVjdD0iaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdib2R5JyBhbmQgQHR5cGUhPScnXS9Ab3BuYW1lIj48L3hzbDp2YXJpYWJsZT4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIoKCRpc2JhY2tjb21wYXRpYmxlPSd0cnVlJykgYW5kIChzdHJpbmctbGVuZ3RoKG5vcm1hbGl6ZS1zcGFjZSgkaW5wdXRFbGVtZW50Q29tcGxleFR5cGUpKSA+IDApKSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gdGhlcmUgYXJlIG5vIHVud3JhcHBlZCBwYXJhbWV0ZXJzIC0gZ28gYWhlYWQgYW5kIHVzZSB0aGUgbm9ybWFsIHdyYXBwZWQgY29kZWdlbi0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudiA9IHRvRW52ZWxvcGUoZ2V0RmFjdG9yeShfb3BlcmF0aW9uQ2xpZW50LmdldE9wdGlvbnMoKS5nZXRTb2FwVmVyc2lvblVSSSgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvcE5hbWUiLz4oPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImlucHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keScgYW5kIEB0eXBlIT0nJ10vQG5hbWUiLz4pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGltaXplQ29udGVudChuZXcgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSgiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtZXRob2QtbnMiLz4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1ldGhvZC1uYW1lIi8+IikpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iKCRpc1Vud3JhcFBhcmFtZXRlcnMpIGFuZCBub3QoJGlzYmFja2NvbXBhdGlibGU9J3RydWUnKSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbnB1dEVsZW1lbnRUeXBlIi8+PHhzbDp0ZXh0PiA8L3hzbDp0ZXh0PmR1bW15V3JhcHBlZFR5cGUgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudiA9IHRvRW52ZWxvcGUoZ2V0RmFjdG9yeShfb3BlcmF0aW9uQ2xpZW50LmdldE9wdGlvbnMoKS5nZXRTb2FwVmVyc2lvblVSSSgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdib2R5JyBhbmQgQHR5cGUhPScnXS9wYXJhbSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD5kdW1teVdyYXBwZWRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGltaXplQ29udGVudChuZXcgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSgiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtZXRob2QtbnMiLz4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1ldGhvZC1uYW1lIi8+IikpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIHRoZXJlIGFyZSBubyB1bndyYXBwZWQgcGFyYW1ldGVycyAtIGdvIGFoZWFkIGFuZCB1c2UgdGhlIG5vcm1hbCB3cmFwcGVkIGNvZGVnZW4tLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnYgPSB0b0VudmVsb3BlKGdldEZhY3RvcnkoX29wZXJhdGlvbkNsaWVudC5nZXRPcHRpb25zKCkuZ2V0U29hcFZlcnNpb25VUkkoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImlucHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keScgYW5kIEB0eXBlIT0nJ10vQG5hbWUiLz4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW1pemVDb250ZW50KG5ldyBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lKCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1ldGhvZC1ucyIvPiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbWV0aG9kLW5hbWUiLz4iKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnYgPSB0b0VudmVsb3BlKGdldEZhY3RvcnkoX29wZXJhdGlvbkNsaWVudC5nZXRPcHRpb25zKCkuZ2V0U29hcFZlcnNpb25VUkkoKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9ImNvdW50KGlucHV0L3BhcmFtW0Bsb2NhdGlvbj0nc29hcF9oZWFkZXInXSkgJmd0OyAwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52LmJ1aWxkKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJpbnB1dC9wYXJhbVtAbG9jYXRpb249J3NvYXBfaGVhZGVyJ10iPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkZCB0aGUgY2hpbGRyZW4gb25seSBpZiB0aGUgcGFyYW1ldGVyIGlzIG5vdCBudWxsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPiE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBtdXN0VW5kZXJzdGFuZCA9ICd0cnVlJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgb21FbGVtZW50PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+ID0gdG9PTSg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4sIG9wdGltaXplQ29udGVudChuZXcgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSgiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtZXRob2QtbnMiLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtZXRob2QtbmFtZSIvPiIpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkSGVhZGVyKG9tRWxlbWVudDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPixlbnYsdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgb21FbGVtZW50PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+ID0gdG9PTSg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4sIG9wdGltaXplQ29udGVudChuZXcgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSgiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtZXRob2QtbnMiLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtZXRob2QtbmFtZSIvPiIpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkSGVhZGVyKG9tRWxlbWVudDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPixlbnYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJpbnB1dC9wYXJhbVtAbG9jYXRpb249J2h0dHBfaGVhZGVyJ10iPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkZCB0aGUgY2hpbGRyZW4gb25seSBpZiB0aGUgcGFyYW1ldGVyIGlzIG5vdCBudWxsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPiE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZEh0dHBIZWFkZXIoX21lc3NhZ2VDb250ZXh0LCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGhlYWRlcm5hbWUiLz4iLDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9Vbmtub3duIHN0eWxlIGRldGVjdGVkICEhIE5vIGNvZGUgaXMgZ2VuZXJhdGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBObyBpbnB1dCBwYXJhbWV0ZXJzIHByZXNlbnQuIFNvIGdlbmVyYXRlIGFzc3VtaW5nIG5vIGlucHV0IHBhcmFtZXRlcnMtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJHN0eWxlPSdycGMnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vU3R5bGUgaXMgdGFrZW4gdG8gYmUgInJwYyIuIE5vIGlucHV0IHBhcmFtZXRlcnMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmFjdG9yeSBmYWN0b3J5ID0gZ2V0RmFjdG9yeShfb3BlcmF0aW9uQ2xpZW50LmdldE9wdGlvbnMoKS5nZXRTb2FwVmVyc2lvblVSSSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudiA9IGZhY3RvcnkuZ2V0RGVmYXVsdEVudmVsb3BlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnYuZ2V0Qm9keSgpLmFkZENoaWxkKGZhY3RvcnkuY3JlYXRlT01FbGVtZW50KCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1ldGhvZC1uYW1lIi8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbWV0aG9kLW5zIi8+IiwgIiIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRzdHlsZT0nZG9jdW1lbnQnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vU3R5bGUgaXMgdGFrZW4gdG8gYmUgImRvY3VtZW50Ii4gTm8gaW5wdXQgcGFyYW1ldGVycwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWNjb3JkaW5nIHRvIHRoZSBXUy1CYXNpYyBwcm9maWxlIGluIHRoaXMgY2FzZSB3ZSBoYXZlIHRvIHNlbmQgYW4gZW1wdHkgc29hcCBtZXNzYWdlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhY3RvcnkgZmFjdG9yeSA9IGdldEZhY3RvcnkoX29wZXJhdGlvbkNsaWVudC5nZXRPcHRpb25zKCkuZ2V0U29hcFZlcnNpb25VUkkoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnYgPSBmYWN0b3J5LmdldERlZmF1bHRFbnZlbG9wZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1Vua25vd24gc3R5bGUgZGV0ZWN0ZWQgISEgTm8gY29kZSBpcyBnZW5lcmF0ZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAvL2FkZGluZyBTT0FQIHNvYXBfaGVhZGVycwotICAgICAgICAgX3NlcnZpY2VDbGllbnQuYWRkSGVhZGVyc1RvRW52ZWxvcGUoZW52KTsKLSAgICAgICAgLy8gc2V0IHRoZSBtZXNzYWdlIGNvbnRleHQgd2l0aCB0aGF0IHNvYXAgZW52ZWxvcGUKLSAgICAgICAgX21lc3NhZ2VDb250ZXh0LnNldEVudmVsb3BlKGVudik7Ci0KLSAgICAgICAgLy8gYWRkIHRoZSBtZXNzYWdlIGNvbnR4dCB0byB0aGUgb3BlcmF0aW9uIGNsaWVudAotICAgICAgICBfb3BlcmF0aW9uQ2xpZW50LmFkZE1lc3NhZ2VDb250ZXh0KF9tZXNzYWdlQ29udGV4dCk7Ci0KLSAgICAgICAgLy9leGVjdXRlIHRoZSBvcGVyYXRpb24gY2xpZW50Ci0gICAgICAgIF9vcGVyYXRpb25DbGllbnQuZXhlY3V0ZSh0cnVlKTsKLQotICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG91dHB1dHR5cGU9JyciPgotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dCBfcmV0dXJuTWVzc2FnZUNvbnRleHQgPSBfb3BlcmF0aW9uQ2xpZW50LmdldE1lc3NhZ2VDb250ZXh0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfSU5fVkFMVUUpOwotICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGUgX3JldHVybkVudiA9IF9yZXR1cm5NZXNzYWdlQ29udGV4dC5nZXRFbnZlbG9wZSgpOwotICAgICAgICAgICAgICAgIDwhLS0gdG9kbyBuZWVkIHRvIGNoYW5nZSB0aGlzIHRvIGNhdGVyIGZvciB1bndyYXBwZWQgbWVzc2FnZXMgKG11bHRpcGxlIHBhcnRzKSAtLT4KLSAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRzdHlsZT0nZG9jdW1lbnQnIG9yICRzdHlsZT0ncnBjJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG91dHB1dHR5cGU9J2J5dGUnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRvQnl0ZShfcmV0dXJuRW52LmdldEJvZHkoKS5nZXRGaXJzdEVsZW1lbnQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RW52ZWxvcGVOYW1lc3BhY2VzKF9yZXR1cm5FbnYpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkb3V0cHV0dHlwZT0nY2hhciciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9DaGFyKF9yZXR1cm5FbnYuZ2V0Qm9keSgpLmdldEZpcnN0RWxlbWVudCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRFbnZlbG9wZU5hbWVzcGFjZXMoX3JldHVybkVudikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRvdXRwdXR0eXBlPSdkb3VibGUnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRvRG91YmxlKF9yZXR1cm5FbnYuZ2V0Qm9keSgpLmdldEZpcnN0RWxlbWVudCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRFbnZlbG9wZU5hbWVzcGFjZXMoX3JldHVybkVudikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRvdXRwdXR0eXBlPSdmbG9hdCciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9GbG9hdChfcmV0dXJuRW52LmdldEJvZHkoKS5nZXRGaXJzdEVsZW1lbnQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RW52ZWxvcGVOYW1lc3BhY2VzKF9yZXR1cm5FbnYpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkb3V0cHV0dHlwZT0naW50JyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0b0ludChfcmV0dXJuRW52LmdldEJvZHkoKS5nZXRGaXJzdEVsZW1lbnQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RW52ZWxvcGVOYW1lc3BhY2VzKF9yZXR1cm5FbnYpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkb3V0cHV0dHlwZT0nbG9uZyciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9Mb25nKF9yZXR1cm5FbnYuZ2V0Qm9keSgpLmdldEZpcnN0RWxlbWVudCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRFbnZlbG9wZU5hbWVzcGFjZXMoX3JldHVybkVudikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRvdXRwdXR0eXBlPSdzaG9ydCciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9TaG9ydChfcmV0dXJuRW52LmdldEJvZHkoKS5nZXRGaXJzdEVsZW1lbnQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RW52ZWxvcGVOYW1lc3BhY2VzKF9yZXR1cm5FbnYpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkb3V0cHV0dHlwZT0nYm9vbGVhbiciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9Cb29sZWFuKF9yZXR1cm5FbnYuZ2V0Qm9keSgpLmdldEZpcnN0RWxlbWVudCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRFbnZlbG9wZU5hbWVzcGFjZXMoX3JldHVybkVudikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuT2JqZWN0IG9iamVjdCA9IGZyb21PTSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9yZXR1cm5FbnYuZ2V0Qm9keSgpLmdldEZpcnN0RWxlbWVudCgpICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkb3V0cHV0dHlwZSIvPi5jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRFbnZlbG9wZU5hbWVzcGFjZXMoX3JldHVybkVudikpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkb3V0cHV0cGFyYW1jb3VudD0xIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvdXRwdXRwYXJhbXNob3J0dHlwZSIvPjx4c2w6dmFsdWUtb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Q9IiRvdXRwdXRwYXJhbXBhcnRuYW1lIi8+KCg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG91dHB1dHR5cGUiLz4pb2JqZWN0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSB0aGlzIGNvdmVycyBib3RoIGJhY2sgY29tcGF0aWJpbGl0eSBhbmQgbm9ybWFsIHVud3JhcHBpbmcgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIoc3RyaW5nLWxlbmd0aChub3JtYWxpemUtc3BhY2UoJG91dHB1dGNvbXBsZXh0eXBlKSkgPiAwKSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkb3V0cHV0b3BuYW1lIi8+KCg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG91dHB1dHR5cGUiLz4pb2JqZWN0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9Iigkb3V0cHV0cGFyYW1jb3VudD0wKSBhbmQgKCRpc1Vud3JhcFBhcmFtZXRlcnMpIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvdXRwdXR0eXBlIi8+KW9iamVjdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgIC8vVW5rbm93biBzdHlsZSBkZXRlY3RlZCAhISBObyBjb2RlIGlzIGdlbmVyYXRlZAotICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICB9Y2F0Y2gob3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQgZil7Ci0KLSAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IGZhdWx0RWx0ID0gZi5nZXREZXRhaWwoKTsKLSAgICAgICAgICAgIGlmIChmYXVsdEVsdCE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgaWYgKGZhdWx0RXhjZXB0aW9uTmFtZU1hcC5jb250YWluc0tleShmYXVsdEVsdC5nZXRRTmFtZSgpKSl7Ci0gICAgICAgICAgICAgICAgICAgIC8vbWFrZSB0aGUgZmF1bHQgYnkgcmVmbGVjdGlvbgotICAgICAgICAgICAgICAgICAgICB0cnl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGV4Y2VwdGlvbkNsYXNzTmFtZSA9IChqYXZhLmxhbmcuU3RyaW5nKWZhdWx0RXhjZXB0aW9uQ2xhc3NOYW1lTWFwLmdldChmYXVsdEVsdC5nZXRRTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5DbGFzcyBleGNlcHRpb25DbGFzcyA9IGphdmEubGFuZy5DbGFzcy5mb3JOYW1lKGV4Y2VwdGlvbkNsYXNzTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuRXhjZXB0aW9uIGV4PQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoamF2YS5sYW5nLkV4Y2VwdGlvbikgZXhjZXB0aW9uQ2xhc3MubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vbWVzc2FnZSBjbGFzcwotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBtZXNzYWdlQ2xhc3NOYW1lID0gKGphdmEubGFuZy5TdHJpbmcpZmF1bHRNZXNzYWdlTWFwLmdldChmYXVsdEVsdC5nZXRRTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5DbGFzcyBtZXNzYWdlQ2xhc3MgPSBqYXZhLmxhbmcuQ2xhc3MuZm9yTmFtZShtZXNzYWdlQ2xhc3NOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5PYmplY3QgbWVzc2FnZU9iamVjdCA9IGZyb21PTShmYXVsdEVsdCxtZXNzYWdlQ2xhc3MsbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QgbSA9IGV4Y2VwdGlvbkNsYXNzLmdldE1ldGhvZCgic2V0RmF1bHRNZXNzYWdlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGphdmEubGFuZy5DbGFzc1tde21lc3NhZ2VDbGFzc30pOwotICAgICAgICAgICAgICAgICAgICAgICAgbS5pbnZva2UoZXgsbmV3IGphdmEubGFuZy5PYmplY3RbXXttZXNzYWdlT2JqZWN0fSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iZmF1bHQvcGFyYW0iPgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4IGluc3RhbmNlb2YgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+KXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPilleDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPgotCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uKGV4LmdldE1lc3NhZ2UoKSwgZXgpOwotICAgICAgICAgICAgICAgICAgICB9Y2F0Y2goamF2YS5sYW5nLkNsYXNzQ2FzdEV4Y2VwdGlvbiBlKXsKLSAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgY2Fubm90IGludGFudGlhdGUgdGhlIGNsYXNzIC0gdGhyb3cgdGhlIG9yaWdpbmFsIEF4aXMgZmF1bHQKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGY7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGphdmEubGFuZy5DbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGNhbm5vdCBpbnRhbnRpYXRlIHRoZSBjbGFzcyAtIHRocm93IHRoZSBvcmlnaW5hbCBBeGlzIGZhdWx0Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBmOwotICAgICAgICAgICAgICAgICAgICB9Y2F0Y2ggKGphdmEubGFuZy5Ob1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgY2Fubm90IGludGFudGlhdGUgdGhlIGNsYXNzIC0gdGhyb3cgdGhlIG9yaWdpbmFsIEF4aXMgZmF1bHQKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGY7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgY2Fubm90IGludGFudGlhdGUgdGhlIGNsYXNzIC0gdGhyb3cgdGhlIG9yaWdpbmFsIEF4aXMgZmF1bHQKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGY7Ci0gICAgICAgICAgICAgICAgICAgIH0gIGNhdGNoIChqYXZhLmxhbmcuSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBjYW5ub3QgaW50YW50aWF0ZSB0aGUgY2xhc3MgLSB0aHJvdyB0aGUgb3JpZ2luYWwgQXhpcyBmYXVsdAotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZjsKLSAgICAgICAgICAgICAgICAgICAgfSAgIGNhdGNoIChqYXZhLmxhbmcuSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBjYW5ub3QgaW50YW50aWF0ZSB0aGUgY2xhc3MgLSB0aHJvdyB0aGUgb3JpZ2luYWwgQXhpcyBmYXVsdAotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH1lbHNlewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBmOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH1lbHNlewotICAgICAgICAgICAgICAgIHRocm93IGY7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIF9tZXNzYWdlQ29udGV4dC5nZXRUcmFuc3BvcnRPdXQoKS5nZXRTZW5kZXIoKS5jbGVhbnVwKF9tZXNzYWdlQ29udGV4dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgPCEtLSBBc3luYyBtZXRob2QgZ2VuZXJhdGlvbiAtLT4KLSAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iJGlzQXN5bmM9JzEnIj4KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIG1ldGhvZCBzaWduYXR1cmUgZm9yIEFzeW5jaHJvbm91cyBJbnZvY2F0aW9ucwotICAgICAgICAgICAgICAgICogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBjb21tZW50Ii8+Ci0gICAgICAgICAgICAgICAgKiBAc2VlIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcGFja2FnZSIvPi48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGludGVyZmFjZU5hbWUiLz4jc3RhcnQ8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4KLSAgICAgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iaW5wdXQvcGFyYW1bQHR5cGUhPScnXSI+Ci0gICAgICAgICAgICAgICAgICAgICogQHBhcmFtIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSI+PC94c2w6dmFsdWUtb2Y+PHhzbDp0ZXh0PgotICAgICAgICAgICAgICAgIDwveHNsOnRleHQ+PC94c2w6Zm9yLWVhY2g+Ci0gICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBwdWJsaWMgIHZvaWQgc3RhcnQ8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4oCi0KLSAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJpbnB1dGNvdW50IiBzZWxlY3Q9ImNvdW50KGlucHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keScgYW5kIEB0eXBlIT0nJ10pIi8+Ci0gICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaW5wdXRXcmFwcGVkQ291bnQiIHNlbGVjdD0iY291bnQoaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdib2R5JyBhbmQgQHR5cGUhPScnXS9wYXJhbSkiLz4KLQotICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkaW5wdXRjb3VudD0xIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEV2ZW4gd2hlbiB0aGUgcGFyYW1ldGVycyBhcmUgMSB3ZSBoYXZlIHRvIHNlZSB3aGV0aGVyIHdlIGhhdmUgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBwZWQgcGFyYW1ldGVycyAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRpc1Vud3JhcFBhcmFtZXRlcnMiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdib2R5JyBhbmQgQHR5cGUhPScnXS9wYXJhbSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJwb3NpdGlvbigpPjEiPiw8L3hzbDppZj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz48eHNsOnRleHQ+IDwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdib2R5JyBhbmQgQHR5cGUhPScnXS9AdHlwZSIvPjx4c2w6dGV4dD4gPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdib2R5JyBhbmQgQHR5cGUhPScnXS9AbmFtZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPjwhLS0gSnVzdCBsZWF2ZSBpdCAtIG5vdGhpbmcgd2UgY2FuIGRvIGhlcmUgLS0+PC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iKCRpbnB1dGNvdW50PTEpIGFuZCBub3QoJGlzVW53cmFwUGFyYW1ldGVycyBhbmQgJGlucHV0V3JhcHBlZENvdW50PTApIj4sPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJpbnB1dC9wYXJhbVtub3QoQGxvY2F0aW9uPSdib2R5JykgYW5kIEB0eXBlIT0nJ10iPgotICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz48eHNsOnRleHQ+IDwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+LAotICAgICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLQotICAgICAgICAgICAgICAgICAgZmluYWwgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwYWNrYWdlIi8+Ljx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY2FsbGJhY2tuYW1lIi8+IGNhbGxiYWNrKQotCi0gICAgICAgICAgICAgICAgdGhyb3dzIGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbnsKLQotICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5PcGVyYXRpb25DbGllbnQgX29wZXJhdGlvbkNsaWVudCA9IF9zZXJ2aWNlQ2xpZW50LmNyZWF0ZUNsaWVudChfb3BlcmF0aW9uc1s8eHNsOnZhbHVlLW9mIHNlbGVjdD0icG9zaXRpb24oKS0xIi8+XS5nZXROYW1lKCkpOwotICAgICAgICAgICAgIF9vcGVyYXRpb25DbGllbnQuZ2V0T3B0aW9ucygpLnNldEFjdGlvbigiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzb2FwQWN0aW9uIi8+Iik7Ci0gICAgICAgICAgICAgX29wZXJhdGlvbkNsaWVudC5nZXRPcHRpb25zKCkuc2V0RXhjZXB0aW9uVG9CZVRocm93bk9uU09BUEZhdWx0KHRydWUpOwotCi0gICAgICAgICAgICAgIDwhLS0gYWRkIHRoZSBvdGhlciBwYXJhbWV0ZXIgb3B0aW9ucyB0byBvcGVyYXRpb25hbCBjbGllbnQgLS0+Ci0gICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJvcHRpb25QYXJhbSI+Ci0gICAgICAgICAgICAgICAgICBhZGRQcm9wZXJ0eVRvT3BlcmF0aW9uQ2xpZW50KF9vcGVyYXRpb25DbGllbnQsPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+LDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdmFsdWUiLz4pOwotICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLQotCi0gICAgICAgICAgICAgIC8vIGNyZWF0ZSBTT0FQIGVudmVsb3BlIHdpdGggdGhhdCBwYXlsb2FkCi0gICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGUgZW52PW51bGw7Ci0gICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dCBfbWVzc2FnZUNvbnRleHQgPSBuZXcgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJjb3VudCIgc2VsZWN0PSJjb3VudChpbnB1dC9wYXJhbVtAdHlwZSE9JyddKSIvPgotICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gdGVzdCB0aGUgbnVtYmVyIG9mIGlucHV0IHBhcmFtZXRlcnMKLSAgICAgICAgICAgICAgICAgICAgICAgIElmIHRoZSBudW1iZXIgb2YgcGFyYW1ldGVyIGlzIG1vcmUgdGhlbiBqdXN0IHJ1biB0aGUgbm9ybWFsIHRlc3QtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkY291bnQgJmd0OyAwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRzdHlsZT0nZG9jdW1lbnQnIG9yICRzdHlsZT0ncnBjJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1N0eWxlIGlzIERvYy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaW5wdXRjb3VudCIgc2VsZWN0PSJjb3VudChpbnB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknIGFuZCBAdHlwZSE9JyddKSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRpbnB1dGNvdW50PTEiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEV2ZW4gd2hlbiB0aGUgcGFyYW1ldGVycyBhcmUgMSB3ZSBoYXZlIHRvIHNlZSB3aGV0aGVyIHdlIGhhdmUgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVkIHBhcmFtZXRlcnMgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaW5wdXRFbGVtZW50VHlwZSIgc2VsZWN0PSJpbnB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknIGFuZCBAdHlwZSE9JyddL0B0eXBlIj48L3hzbDp2YXJpYWJsZT4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkaXNVbndyYXBQYXJhbWV0ZXJzIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGlucHV0RWxlbWVudFR5cGUiLz48eHNsOnRleHQ+IDwveHNsOnRleHQ+ZHVtbXlXcmFwcGVkVHlwZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52ID0gdG9FbnZlbG9wZShnZXRGYWN0b3J5KF9vcGVyYXRpb25DbGllbnQuZ2V0T3B0aW9ucygpLmdldFNvYXBWZXJzaW9uVVJJKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJpbnB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknIGFuZCBAdHlwZSE9JyddL3BhcmFtIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPiBkdW1teVdyYXBwZWRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGltaXplQ29udGVudChuZXcgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSgiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtZXRob2QtbnMiLz4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1ldGhvZC1uYW1lIi8+IikpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIHRoZXJlIGFyZSBubyB1bndyYXBwZWQgcGFyYW1ldGVycyAtIGdvIGFoZWFkIGFuZCB1c2UgdGhlIG5vcm1hbCB3cmFwcGVkIGNvZGVnZW4tLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnYgPSB0b0VudmVsb3BlKGdldEZhY3RvcnkoX29wZXJhdGlvbkNsaWVudC5nZXRPcHRpb25zKCkuZ2V0U29hcFZlcnNpb25VUkkoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImlucHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keScgYW5kIEB0eXBlIT0nJ10vQG5hbWUiLz4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW1pemVDb250ZW50KG5ldyBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lKCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1ldGhvZC1ucyIvPiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbWV0aG9kLW5hbWUiLz4iKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnYgPSB0b0VudmVsb3BlKGdldEZhY3RvcnkoX29wZXJhdGlvbkNsaWVudC5nZXRPcHRpb25zKCkuZ2V0U29hcFZlcnNpb25VUkkoKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImlucHV0L3BhcmFtW0Bsb2NhdGlvbj0nc29hcF9oZWFkZXInXSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkZCB0aGUgc29hcF9oZWFkZXJzIG9ubHkgaWYgdGhleSBhcmUgbm90IG51bGwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+IT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAbXVzdFVuZGVyc3RhbmQgPSAndHJ1ZSciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IG9tRWxlbWVudDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPiA9IHRvT00oPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+LCBvcHRpbWl6ZUNvbnRlbnQobmV3IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUoIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbWV0aG9kLW5zIi8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbWV0aG9kLW5hbWUiLz4iKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZEhlYWRlcihvbUVsZW1lbnQ8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4sZW52LHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IG9tRWxlbWVudDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPiA9IHRvT00oPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+LCBvcHRpbWl6ZUNvbnRlbnQobmV3IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUoIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbWV0aG9kLW5zIi8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbWV0aG9kLW5hbWUiLz4iKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZEhlYWRlcihvbUVsZW1lbnQ8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4sZW52KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJpbnB1dC9wYXJhbVtAbG9jYXRpb249J2h0dHBfaGVhZGVyJ10iPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkZCB0aGUgY2hpbGRyZW4gb25seSBpZiB0aGUgcGFyYW1ldGVyIGlzIG5vdCBudWxsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPiE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZEh0dHBIZWFkZXIoX21lc3NhZ2VDb250ZXh0LCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGhlYWRlcm5hbWUiLz4iLDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9Vbmtub3duIHN0eWxlIGRldGVjdGVkICEhIE5vIGNvZGUgaXMgZ2VuZXJhdGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBObyBpbnB1dCBwYXJhbWV0ZXJzIHByZXNlbnQuIFNvIGdlbmVyYXRlIGFzc3VtaW5nIG5vIGlucHV0IHBhcmFtZXRlcnMtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJHN0eWxlPSdycGMnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vU3R5bGUgaXMgRG9jLiBObyBpbnB1dCBwYXJhbWV0ZXJzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhY3RvcnkgZmFjdG9yeSA9IGdldEZhY3RvcnkoX29wZXJhdGlvbkNsaWVudC5nZXRPcHRpb25zKCkuZ2V0U29hcFZlcnNpb25VUkkoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnYgPSBmYWN0b3J5LmdldERlZmF1bHRFbnZlbG9wZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52LmdldEJvZHkoKS5hZGRDaGlsZChmYWN0b3J5LmNyZWF0ZU9NRWxlbWVudCgiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtZXRob2QtbmFtZSIvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1ldGhvZC1ucyIvPiIsICIiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkc3R5bGU9J2RvY3VtZW50JyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1N0eWxlIGlzIHRha2VuIHRvIGJlICJkb2N1bWVudCIuIE5vIGlucHV0IHBhcmFtZXRlcnMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFjY29yZGluZyB0byB0aGUgV1MtQmFzaWMgcHJvZmlsZSBpbiB0aGlzIGNhc2Ugd2UgaGF2ZSB0byBzZW5kIGFuIGVtcHR5IHNvYXAgbWVzc2FnZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYWN0b3J5IGZhY3RvcnkgPSBnZXRGYWN0b3J5KF9vcGVyYXRpb25DbGllbnQuZ2V0T3B0aW9ucygpLmdldFNvYXBWZXJzaW9uVVJJKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52ID0gZmFjdG9yeS5nZXREZWZhdWx0RW52ZWxvcGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1Vua25vd24gc3R5bGUgZGV0ZWN0ZWQgISEgTm8gY29kZSBpcyBnZW5lcmF0ZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAvLyBhZGRpbmcgU09BUCBzb2FwX2hlYWRlcnMKLSAgICAgICAgIF9zZXJ2aWNlQ2xpZW50LmFkZEhlYWRlcnNUb0VudmVsb3BlKGVudik7Ci0gICAgICAgIC8vIGNyZWF0ZSBtZXNzYWdlIGNvbnRleHQgd2l0aCB0aGF0IHNvYXAgZW52ZWxvcGUKLSAgICAgICAgX21lc3NhZ2VDb250ZXh0LnNldEVudmVsb3BlKGVudik7Ci0KLSAgICAgICAgLy8gYWRkIHRoZSBtZXNzYWdlIGNvbnRleHQgdG8gdGhlIG9wZXJhdGlvbiBjbGllbnQKLSAgICAgICAgX29wZXJhdGlvbkNsaWVudC5hZGRNZXNzYWdlQ29udGV4dChfbWVzc2FnZUNvbnRleHQpOwotCi0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG91dHB1dHR5cGU9JyciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdGhpbmcgdG8gcGFzcyBhcyB0aGUgY2FsbGJhY2shISEKLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIF9vcGVyYXRpb25DbGllbnQuc2V0Q2FsbGJhY2sobmV3IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50LmFzeW5jLkF4aXNDYWxsYmFjaygpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbk1lc3NhZ2Uob3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0IHJlc3VsdENvbnRleHQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlIHJlc3VsdEVudiA9IHJlc3VsdENvbnRleHQuZ2V0RW52ZWxvcGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG91dHB1dHR5cGU9J2J5dGUnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5yZWNlaXZlUmVzdWx0PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+KHRvQnl0ZShyZXN1bHRFbnYuZ2V0Qm9keSgpLmdldEZpcnN0RWxlbWVudCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEVudmVsb3BlTmFtZXNwYWNlcyhyZXN1bHRFbnYpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRvdXRwdXR0eXBlPSdjaGFyJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sucmVjZWl2ZVJlc3VsdDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPih0b0NoYXIocmVzdWx0RW52LmdldEJvZHkoKS5nZXRGaXJzdEVsZW1lbnQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRFbnZlbG9wZU5hbWVzcGFjZXMocmVzdWx0RW52KSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkb3V0cHV0dHlwZT0nZG91YmxlJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sucmVjZWl2ZVJlc3VsdDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPih0b0RvdWJsZShyZXN1bHRFbnYuZ2V0Qm9keSgpLmdldEZpcnN0RWxlbWVudCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEVudmVsb3BlTmFtZXNwYWNlcyhyZXN1bHRFbnYpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRvdXRwdXR0eXBlPSdmbG9hdCciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLnJlY2VpdmVSZXN1bHQ8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4odG9GbG9hdChyZXN1bHRFbnYuZ2V0Qm9keSgpLmdldEZpcnN0RWxlbWVudCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEVudmVsb3BlTmFtZXNwYWNlcyhyZXN1bHRFbnYpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRvdXRwdXR0eXBlPSdpbnQnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5yZWNlaXZlUmVzdWx0PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+KHRvSW50KHJlc3VsdEVudi5nZXRCb2R5KCkuZ2V0Rmlyc3RFbGVtZW50KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RW52ZWxvcGVOYW1lc3BhY2VzKHJlc3VsdEVudikpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG91dHB1dHR5cGU9J2xvbmcnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5yZWNlaXZlUmVzdWx0PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+KHRvTG9uZyhyZXN1bHRFbnYuZ2V0Qm9keSgpLmdldEZpcnN0RWxlbWVudCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEVudmVsb3BlTmFtZXNwYWNlcyhyZXN1bHRFbnYpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRvdXRwdXR0eXBlPSdzaG9ydCciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLnJlY2VpdmVSZXN1bHQ8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4odG9TaG9ydChyZXN1bHRFbnYuZ2V0Qm9keSgpLmdldEZpcnN0RWxlbWVudCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEVudmVsb3BlTmFtZXNwYWNlcyhyZXN1bHRFbnYpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRvdXRwdXR0eXBlPSdib29sZWFuJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sucmVjZWl2ZVJlc3VsdDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPih0b0Jvb2xlYW4ocmVzdWx0RW52LmdldEJvZHkoKS5nZXRGaXJzdEVsZW1lbnQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRFbnZlbG9wZU5hbWVzcGFjZXMocmVzdWx0RW52KSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5PYmplY3Qgb2JqZWN0ID0gZnJvbU9NKHJlc3VsdEVudi5nZXRCb2R5KCkuZ2V0Rmlyc3RFbGVtZW50KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvdXRwdXR0eXBlIi8+LmNsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEVudmVsb3BlTmFtZXNwYWNlcyhyZXN1bHRFbnYpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5yZWNlaXZlUmVzdWx0PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+KDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkb3V0cHV0dHlwZT0nJyI+KTs8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkb3V0cHV0cGFyYW1jb3VudD0xIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvdXRwdXRwYXJhbXNob3J0dHlwZSIvPjx4c2w6dmFsdWUtb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Q9IiRvdXRwdXRwYXJhbXBhcnRuYW1lIi8+KCg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG91dHB1dHR5cGUiLz4pb2JqZWN0KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0ic3RyaW5nLWxlbmd0aChub3JtYWxpemUtc3BhY2UoJG91dHB1dGNvbXBsZXh0eXBlKSkgPiAwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkb3V0cHV0Y29tcGxleHR5cGUiLz4pb2JqZWN0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIoJG91dHB1dHBhcmFtY291bnQ9MCkgYW5kICgkaXNVbndyYXBQYXJhbWV0ZXJzKSI+KTs8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG91dHB1dHR5cGUiLz4pb2JqZWN0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdCBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLnJlY2VpdmVFcnJvcjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPihlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25FcnJvcihqYXZhLmxhbmcuRXhjZXB0aW9uIGVycm9yKSB7Ci0JCQkJCQkJCWlmIChlcnJvciBpbnN0YW5jZW9mIG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0KSB7Ci0JCQkJCQkJCQlvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdCBmID0gKG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0KSBlcnJvcjsKLQkJCQkJCQkJCW9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IGZhdWx0RWx0ID0gZi5nZXREZXRhaWwoKTsKLQkJCQkJCQkJCWlmIChmYXVsdEVsdCE9bnVsbCl7Ci0JCQkJCQkJCQkJaWYgKGZhdWx0RXhjZXB0aW9uTmFtZU1hcC5jb250YWluc0tleShmYXVsdEVsdC5nZXRRTmFtZSgpKSl7Ci0JCQkJCQkJCQkJCS8vbWFrZSB0aGUgZmF1bHQgYnkgcmVmbGVjdGlvbgotCQkJCQkJCQkJCQl0cnl7Ci0JCQkJCQkJCQkJCQkJamF2YS5sYW5nLlN0cmluZyBleGNlcHRpb25DbGFzc05hbWUgPSAoamF2YS5sYW5nLlN0cmluZylmYXVsdEV4Y2VwdGlvbkNsYXNzTmFtZU1hcC5nZXQoZmF1bHRFbHQuZ2V0UU5hbWUoKSk7Ci0JCQkJCQkJCQkJCQkJamF2YS5sYW5nLkNsYXNzIGV4Y2VwdGlvbkNsYXNzID0gamF2YS5sYW5nLkNsYXNzLmZvck5hbWUoZXhjZXB0aW9uQ2xhc3NOYW1lKTsKLQkJCQkJCQkJCQkJCQlqYXZhLmxhbmcuRXhjZXB0aW9uIGV4PQotCQkJCQkJCQkJCQkJCQkoamF2YS5sYW5nLkV4Y2VwdGlvbikgZXhjZXB0aW9uQ2xhc3MubmV3SW5zdGFuY2UoKTsKLQkJCQkJCQkJCQkJCQkvL21lc3NhZ2UgY2xhc3MKLQkJCQkJCQkJCQkJCQlqYXZhLmxhbmcuU3RyaW5nIG1lc3NhZ2VDbGFzc05hbWUgPSAoamF2YS5sYW5nLlN0cmluZylmYXVsdE1lc3NhZ2VNYXAuZ2V0KGZhdWx0RWx0LmdldFFOYW1lKCkpOwotCQkJCQkJCQkJCQkJCQlqYXZhLmxhbmcuQ2xhc3MgbWVzc2FnZUNsYXNzID0gamF2YS5sYW5nLkNsYXNzLmZvck5hbWUobWVzc2FnZUNsYXNzTmFtZSk7Ci0JCQkJCQkJCQkJCQkJamF2YS5sYW5nLk9iamVjdCBtZXNzYWdlT2JqZWN0ID0gZnJvbU9NKGZhdWx0RWx0LG1lc3NhZ2VDbGFzcyxudWxsKTsKLQkJCQkJCQkJCQkJCQlqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QgbSA9IGV4Y2VwdGlvbkNsYXNzLmdldE1ldGhvZCgic2V0RmF1bHRNZXNzYWdlIiwKLQkJCQkJCQkJCQkJCQkJCW5ldyBqYXZhLmxhbmcuQ2xhc3NbXXttZXNzYWdlQ2xhc3N9KTsKLQkJCQkJCQkJCQkJCQltLmludm9rZShleCxuZXcgamF2YS5sYW5nLk9iamVjdFtde21lc3NhZ2VPYmplY3R9KTsKLQkJCQkJCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iZmF1bHQvcGFyYW0iPgotCQkJCQkJCQkJCQkJCWlmIChleCBpbnN0YW5jZW9mIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPil7Ci0JCQkJCQkJCQkJCQkJCWNhbGxiYWNrLnJlY2VpdmVFcnJvcjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbWV0aG9kLW5hbWUiLz4oKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPilleCk7Ci0JCQkJCQkJCQkJCSAgICAgICAgICAgIHJldHVybjsKLQkJCQkJCQkJCQkgICAgICAgICAgICB9Ci0JCQkJCQkJCQkJICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQotCQkJCQkJCQkJCSAgICAgICAgICAgIGNhbGxiYWNrLnJlY2VpdmVFcnJvcjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPihuZXcgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uKGV4LmdldE1lc3NhZ2UoKSwgZXgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaChqYXZhLmxhbmcuQ2xhc3NDYXN0RXhjZXB0aW9uIGUpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgY2Fubm90IGludGFudGlhdGUgdGhlIGNsYXNzIC0gdGhyb3cgdGhlIG9yaWdpbmFsIEF4aXMgZmF1bHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLnJlY2VpdmVFcnJvcjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPihmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoamF2YS5sYW5nLkNsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgY2Fubm90IGludGFudGlhdGUgdGhlIGNsYXNzIC0gdGhyb3cgdGhlIG9yaWdpbmFsIEF4aXMgZmF1bHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLnJlY2VpdmVFcnJvcjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPihmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoamF2YS5sYW5nLk5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBjYW5ub3QgaW50YW50aWF0ZSB0aGUgY2xhc3MgLSB0aHJvdyB0aGUgb3JpZ2luYWwgQXhpcyBmYXVsdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sucmVjZWl2ZUVycm9yPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+KGYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGNhbm5vdCBpbnRhbnRpYXRlIHRoZSBjbGFzcyAtIHRocm93IHRoZSBvcmlnaW5hbCBBeGlzIGZhdWx0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5yZWNlaXZlRXJyb3I8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4oZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGphdmEubGFuZy5JbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGNhbm5vdCBpbnRhbnRpYXRlIHRoZSBjbGFzcyAtIHRocm93IHRoZSBvcmlnaW5hbCBBeGlzIGZhdWx0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5yZWNlaXZlRXJyb3I8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4oZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGphdmEubGFuZy5JbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGNhbm5vdCBpbnRhbnRpYXRlIHRoZSBjbGFzcyAtIHRocm93IHRoZSBvcmlnaW5hbCBBeGlzIGZhdWx0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5yZWNlaXZlRXJyb3I8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4oZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0IGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGNhbm5vdCBpbnRhbnRpYXRlIHRoZSBjbGFzcyAtIHRocm93IHRoZSBvcmlnaW5hbCBBeGlzIGZhdWx0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5yZWNlaXZlRXJyb3I8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4oZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQkJCQkJCQkJCSAgICB9IGVsc2UgewotCQkJCQkJCQkJCSAgICBjYWxsYmFjay5yZWNlaXZlRXJyb3I8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4oZik7Ci0JCQkJCQkJCQkgICAgfQotCQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCSAgICBjYWxsYmFjay5yZWNlaXZlRXJyb3I8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4oZik7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCSAgICBjYWxsYmFjay5yZWNlaXZlRXJyb3I8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4oZXJyb3IpOwotCQkJCQkJCQl9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25GYXVsdChvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQgZmF1bHRDb250ZXh0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0IGZhdWx0ID0gb3JnLmFwYWNoZS5heGlzMi51dGlsLlV0aWxzLmdldEluYm91bmRGYXVsdEZyb21NZXNzYWdlQ29udGV4dChmYXVsdENvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkVycm9yKGZhdWx0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNvbXBsZXRlKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX21lc3NhZ2VDb250ZXh0LmdldFRyYW5zcG9ydE91dCgpLmdldFNlbmRlcigpLmNsZWFudXAoX21lc3NhZ2VDb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAob3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQgYXhpc0ZhdWx0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5yZWNlaXZlRXJyb3I8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4oYXhpc0ZhdWx0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotCi0gICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi51dGlsLkNhbGxiYWNrUmVjZWl2ZXIgX2NhbGxiYWNrUmVjZWl2ZXIgPSBudWxsOwotICAgICAgICBpZiAoIF9vcGVyYXRpb25zWzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJwb3NpdGlvbigpLTEiLz5dLmdldE1lc3NhZ2VSZWNlaXZlcigpPT1udWxsICZhbXA7JmFtcDsgIF9vcGVyYXRpb25DbGllbnQuZ2V0T3B0aW9ucygpLmlzVXNlU2VwYXJhdGVMaXN0ZW5lcigpKSB7Ci0gICAgICAgICAgIF9jYWxsYmFja1JlY2VpdmVyID0gbmV3IG9yZy5hcGFjaGUuYXhpczIudXRpbC5DYWxsYmFja1JlY2VpdmVyKCk7Ci0gICAgICAgICAgX29wZXJhdGlvbnNbPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InBvc2l0aW9uKCktMSIvPl0uc2V0TWVzc2FnZVJlY2VpdmVyKAotICAgICAgICAgICAgICAgICAgICBfY2FsbGJhY2tSZWNlaXZlcik7Ci0gICAgICAgIH0KLQotICAgICAgICAgICAvL2V4ZWN1dGUgdGhlIG9wZXJhdGlvbiBjbGllbnQKLSAgICAgICAgICAgX29wZXJhdGlvbkNsaWVudC5leGVjdXRlKGZhbHNlKTsKLQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgPCEtLSBFbmQgb2YgaW4tb3V0IG1lcCAtLT4KLSAgICAgICAgICAgIDwveHNsOmlmPgotCi0KLQotCi0gICAgICAgICAgICA8IS0tIFN0YXJ0IG9mIGluIG9ubHkgbWVwLS0+Ci0gICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IiRtZXA9JzEwJyBvciAkbWVwPScxMSciPiA8IS0tIFRoZXNlIGNvbnN0YW50cyBjYW4gYmUgZm91bmQgaW4gb3JnLmFwYWNoZS5heGlzMi53c2RsLldTRExDb25zdGFudHMgLS0+Ci0gICAgICAgICAgICAgICAgPCEtLSBmb3IgdGhlIGluIG9ubHkgbWVwIHRoZXJlIGlzIG5vIG5vdGlvbiBvZiBzeW5jIG9yIGFzeW5jLiBBbmQgdGhlcmUgaXMgbm8gcmV0dXJuIHR5cGUgYWxzbyAtLT4KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgbWV0aG9kIHNpZ25hdHVyZQotICAgICAgICAgICAgICAgICAgKiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGNvbW1lbnQiLz4KLSAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSIkbWVwPScxMSciPgotICAgICAgICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJmYXVsdC9wYXJhbVtAdHlwZSE9JyddIj4KLSAgICAgICAgICAgICAgICAgICAgICogQHRocm93cyA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4gOiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGNvbW1lbnQiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgPHhzbDp0ZXh0PiA8L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPigKLSAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJpbnB1dGNvdW50IiBzZWxlY3Q9ImNvdW50KGlucHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keScgYW5kIEB0eXBlIT0nJ10pIi8+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRpbnB1dGNvdW50PTEiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRXZlbiB3aGVuIHRoZSBwYXJhbWV0ZXJzIGFyZSAxIHdlIGhhdmUgdG8gc2VlIHdoZXRoZXIgd2UgaGF2ZSB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlZCBwYXJhbWV0ZXJzIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGlzVW53cmFwUGFyYW1ldGVycyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJpbnB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknIGFuZCBAdHlwZSE9JyddL3BhcmFtIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9InBvc2l0aW9uKCk+MSI+LDwveHNsOmlmPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPjx4c2w6dGV4dD4gPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJpbnB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknIGFuZCBAdHlwZSE9JyddL0B0eXBlIi8+PHhzbDp0ZXh0PiA8L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJpbnB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknIGFuZCBAdHlwZSE9JyddL0BuYW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+PCEtLSBKdXN0IGxlYXZlIGl0IC0gbm90aGluZyB3ZSBjYW4gZG8gaGVyZSAtLT48L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLQotICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iJGlucHV0Y291bnQ9MSBhbmQgaW5wdXQvcGFyYW1bbm90KEBsb2NhdGlvbj0nYm9keScpIGFuZCBAdHlwZSE9JyddIj4sPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJpbnB1dC9wYXJhbVtub3QoQGxvY2F0aW9uPSdib2R5JykgYW5kIEB0eXBlIT0nJ10iPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJwb3NpdGlvbigpPjEiPiw8L3hzbDppZj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz48eHNsOnRleHQ+IDwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPgotCi0gICAgICAgICAgICAgICAgKSB0aHJvd3MgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uCi0gICAgICAgICAgICAgICAgPCEtLWFkZCB0aGUgZmF1bHRzLS0+Ci0gICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSIkbWVwPScxMSciPgotICAgICAgICAgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iZmF1bHQvcGFyYW1bQHR5cGUhPScnXSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAsPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPgotICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQgX21lc3NhZ2VDb250ZXh0ID0gbnVsbDsKLQotICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iJG1lcD0nMTEnIj50cnkgezwveHNsOmlmPgotICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuY2xpZW50Lk9wZXJhdGlvbkNsaWVudCBfb3BlcmF0aW9uQ2xpZW50ID0gX3NlcnZpY2VDbGllbnQuY3JlYXRlQ2xpZW50KF9vcGVyYXRpb25zWzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJwb3NpdGlvbigpLTEiLz5dLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgX29wZXJhdGlvbkNsaWVudC5nZXRPcHRpb25zKCkuc2V0QWN0aW9uKCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHNvYXBBY3Rpb24iLz4iKTsKLSAgICAgICAgICAgICAgICBfb3BlcmF0aW9uQ2xpZW50LmdldE9wdGlvbnMoKS5zZXRFeGNlcHRpb25Ub0JlVGhyb3duT25TT0FQRmF1bHQodHJ1ZSk7Ci0KLSAgICAgICAgICAgICAgICA8IS0tIGFkZCB0aGUgb3RoZXIgcGFyYW1ldGVyIG9wdGlvbnMgdG8gb3BlcmF0aW9uYWwgY2xpZW50IC0tPgotICAgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0ib3B0aW9uUGFyYW0iPgotICAgICAgICAgICAgICAgICAgYWRkUHJvcGVydHlUb09wZXJhdGlvbkNsaWVudChfb3BlcmF0aW9uQ2xpZW50LDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPiw8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHZhbHVlIi8+KTsKLSAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0KLSAgICAgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iaW5wdXQvcGFyYW1bQEFjdGlvbiE9JyddIj5fb3BlcmF0aW9uQ2xpZW50LmdldE9wdGlvbnMoKS5zZXRBY3Rpb24oIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAQWN0aW9uIi8+Iik7PC94c2w6Zm9yLWVhY2g+Ci0gICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZSBlbnYgPSBudWxsOwotICAgICAgICAgICAgICAgICBfbWVzc2FnZUNvbnRleHQgPSBuZXcgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImNvdW50IiBzZWxlY3Q9ImNvdW50KGlucHV0L3BhcmFtW0B0eXBlIT0nJ10pIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIHRlc3QgdGhlIG51bWJlciBvZiBpbnB1dCBwYXJhbWV0ZXJzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgdGhlIG51bWJlciBvZiBwYXJhbWV0ZXIgaXMgbW9yZSB0aGVuIGp1c3QgcnVuIHRoZSBub3JtYWwgdGVzdC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkY291bnQgJmd0OyAwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIHN0eWxlIGJlaW5nIGRvY2xpdCBvciBycGMgZG9lcyBub3QgbWF0dGVyIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRzdHlsZT0ncnBjJyBvciAkc3R5bGU9J2RvY3VtZW50JyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9TdHlsZSBpcyBEb2MuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJpbnB1dGNvdW50IiBzZWxlY3Q9ImNvdW50KGlucHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keScgYW5kIEB0eXBlIT0nJ10pIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkaW5wdXRjb3VudD0xIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRXZlbiB3aGVuIHRoZSBwYXJhbWV0ZXJzIGFyZSAxIHdlIGhhdmUgdG8gc2VlIHdoZXRoZXIgd2UgaGF2ZSB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVkIHBhcmFtZXRlcnMgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImlucHV0RWxlbWVudFR5cGUiIHNlbGVjdD0iaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdib2R5JyBhbmQgQHR5cGUhPScnXS9AdHlwZSI+PC94c2w6dmFyaWFibGU+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkaXNVbndyYXBQYXJhbWV0ZXJzIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbnB1dEVsZW1lbnRUeXBlIi8+PHhzbDp0ZXh0PiA8L3hzbDp0ZXh0PmR1bW15V3JhcHBlZFR5cGUgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnYgPSB0b0VudmVsb3BlKGdldEZhY3RvcnkoX29wZXJhdGlvbkNsaWVudC5nZXRPcHRpb25zKCkuZ2V0U29hcFZlcnNpb25VUkkoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJpbnB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknIGFuZCBAdHlwZSE9JyddL3BhcmFtIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+ZHVtbXlXcmFwcGVkVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW1pemVDb250ZW50KG5ldyBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lKCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1ldGhvZC1ucyIvPiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1ldGhvZC1uYW1lIi8+IikpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIHRoZXJlIGFyZSBubyB1bndyYXBwZWQgcGFyYW1ldGVycyAtIGdvIGFoZWFkIGFuZCB1c2UgdGhlIG5vcm1hbCB3cmFwcGVkIGNvZGVnZW4tLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52ID0gdG9FbnZlbG9wZShnZXRGYWN0b3J5KF9vcGVyYXRpb25DbGllbnQuZ2V0T3B0aW9ucygpLmdldFNvYXBWZXJzaW9uVVJJKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdib2R5JyBhbmQgQHR5cGUhPScnXS9AbmFtZSIvPiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW1pemVDb250ZW50KG5ldyBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lKCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1ldGhvZC1ucyIvPiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1ldGhvZC1uYW1lIi8+IikpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnYgPSB0b0VudmVsb3BlKGdldEZhY3RvcnkoX29wZXJhdGlvbkNsaWVudC5nZXRPcHRpb25zKCkuZ2V0U29hcFZlcnNpb25VUkkoKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJpbnB1dC9wYXJhbVtAbG9jYXRpb249J3NvYXBfaGVhZGVyJ10iPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGQgdGhlIGNoaWxkcmVuIG9ubHkgaWYgdGhlIHBhcmFtZXRlciBpcyBub3QgbnVsbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+IT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAbXVzdFVuZGVyc3RhbmQgPSAndHJ1ZSciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCBvbUVsZW1lbnQ8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4gPSB0b09NKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPiwgb3B0aW1pemVDb250ZW50KG5ldyBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lKCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1ldGhvZC1ucyIvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1ldGhvZC1uYW1lIi8+IikpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkSGVhZGVyKG9tRWxlbWVudDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPixlbnYsdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgb21FbGVtZW50PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+ID0gdG9PTSg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4sIG9wdGltaXplQ29udGVudChuZXcgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSgiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtZXRob2QtbnMiLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtZXRob2QtbmFtZSIvPiIpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZEhlYWRlcihvbUVsZW1lbnQ8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4sZW52KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImlucHV0L3BhcmFtW0Bsb2NhdGlvbj0naHR0cF9oZWFkZXInXSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkZCB0aGUgY2hpbGRyZW4gb25seSBpZiB0aGUgcGFyYW1ldGVyIGlzIG5vdCBudWxsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4hPW51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkSHR0cEhlYWRlcihfbWVzc2FnZUNvbnRleHQsIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAaGVhZGVybmFtZSIvPiIsPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vVW5rbm93biBzdHlsZSBkZXRlY3RlZCAhISBObyBjb2RlIGlzIGdlbmVyYXRlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIE5vIGlucHV0IHBhcmFtZXRlcnMgcHJlc2VudC4gU28gZ2VuZXJhdGUgYXNzdW1pbmcgbm8gaW5wdXQgcGFyYW1ldGVycy0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkc3R5bGU9J3JwYyciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vU3R5bGUgaXMgdGFrZW4gdG8gYmUgImRvY3VtZW50Ii4gTm8gaW5wdXQgcGFyYW1ldGVycwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmFjdG9yeSBmYWN0b3J5ID0gZ2V0RmFjdG9yeShfb3BlcmF0aW9uQ2xpZW50LmdldE9wdGlvbnMoKS5nZXRTb2FwVmVyc2lvblVSSSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnYgPSBmYWN0b3J5LmdldERlZmF1bHRFbnZlbG9wZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudi5nZXRCb2R5KCkuYWRkQ2hpbGQoZmFjdG9yeS5jcmVhdGVPTUVsZW1lbnQoIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbWV0aG9kLW5hbWUiLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtZXRob2QtbnMiLz4iLCAiIikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkc3R5bGU9J2RvY3VtZW50JyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9TdHlsZSBpcyB0YWtlbiB0byBiZSAiZG9jdW1lbnQiLiBObyBpbnB1dCBwYXJhbWV0ZXJzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWNjb3JkaW5nIHRvIHRoZSBXUy1CYXNpYyBwcm9maWxlIGluIHRoaXMgY2FzZSB3ZSBoYXZlIHRvIHNlbmQgYW4gZW1wdHkgc29hcCBtZXNzYWdlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYWN0b3J5IGZhY3RvcnkgPSBnZXRGYWN0b3J5KF9vcGVyYXRpb25DbGllbnQuZ2V0T3B0aW9ucygpLmdldFNvYXBWZXJzaW9uVVJJKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudiA9IGZhY3RvcnkuZ2V0RGVmYXVsdEVudmVsb3BlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vVW5rbm93biBzdHlsZSBkZXRlY3RlZCAhISBObyBjb2RlIGlzIGdlbmVyYXRlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotCi0gICAgICAgICAgICAgIC8vYWRkaW5nIFNPQVAgc29hcF9oZWFkZXJzCi0gICAgICAgICBfc2VydmljZUNsaWVudC5hZGRIZWFkZXJzVG9FbnZlbG9wZShlbnYpOwotICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBtZXNzYWdlIGNvbnRleHQgd2l0aCB0aGF0IHNvYXAgZW52ZWxvcGUKLQotICAgICAgICAgICAgX21lc3NhZ2VDb250ZXh0LnNldEVudmVsb3BlKGVudik7Ci0KLSAgICAgICAgICAgIC8vIGFkZCB0aGUgbWVzc2FnZSBjb250eHQgdG8gdGhlIG9wZXJhdGlvbiBjbGllbnQKLSAgICAgICAgICAgIF9vcGVyYXRpb25DbGllbnQuYWRkTWVzc2FnZUNvbnRleHQoX21lc3NhZ2VDb250ZXh0KTsKLQotICAgICAgICAgICAgIF9vcGVyYXRpb25DbGllbnQuZXhlY3V0ZSh0cnVlKTsKLQotICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IiRtZXA9JzExJyI+Ci0gICAgICAgICAgICAgICB9Y2F0Y2gob3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQgZil7Ci0gICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCBmYXVsdEVsdCA9IGYuZ2V0RGV0YWlsKCk7Ci0gICAgICAgICAgICAgICAgICBpZiAoZmF1bHRFbHQhPW51bGwpewotICAgICAgICAgICAgICAgICAgICAgIGlmIChmYXVsdEV4Y2VwdGlvbk5hbWVNYXAuY29udGFpbnNLZXkoZmF1bHRFbHQuZ2V0UU5hbWUoKSkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAvL21ha2UgdGhlIGZhdWx0IGJ5IHJlZmxlY3Rpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5ewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBleGNlcHRpb25DbGFzc05hbWUgPSAoamF2YS5sYW5nLlN0cmluZylmYXVsdEV4Y2VwdGlvbkNsYXNzTmFtZU1hcC5nZXQoZmF1bHRFbHQuZ2V0UU5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuQ2xhc3MgZXhjZXB0aW9uQ2xhc3MgPSBqYXZhLmxhbmcuQ2xhc3MuZm9yTmFtZShleGNlcHRpb25DbGFzc05hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLkV4Y2VwdGlvbiBleD0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGphdmEubGFuZy5FeGNlcHRpb24pIGV4Y2VwdGlvbkNsYXNzLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL21lc3NhZ2UgY2xhc3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbWVzc2FnZUNsYXNzTmFtZSA9IChqYXZhLmxhbmcuU3RyaW5nKWZhdWx0TWVzc2FnZU1hcC5nZXQoZmF1bHRFbHQuZ2V0UU5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuQ2xhc3MgbWVzc2FnZUNsYXNzID0gamF2YS5sYW5nLkNsYXNzLmZvck5hbWUobWVzc2FnZUNsYXNzTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuT2JqZWN0IG1lc3NhZ2VPYmplY3QgPSBmcm9tT00oZmF1bHRFbHQsbWVzc2FnZUNsYXNzLG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIG0gPSBleGNlcHRpb25DbGFzcy5nZXRNZXRob2QoInNldEZhdWx0TWVzc2FnZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBqYXZhLmxhbmcuQ2xhc3NbXXttZXNzYWdlQ2xhc3N9KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0uaW52b2tlKGV4LG5ldyBqYXZhLmxhbmcuT2JqZWN0W117bWVzc2FnZU9iamVjdH0pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImZhdWx0L3BhcmFtIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleCBpbnN0YW5jZW9mIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPil7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93ICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4pZXg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbihleC5nZXRNZXNzYWdlKCksIGV4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgfWNhdGNoKGphdmEubGFuZy5DbGFzc0Nhc3RFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGNhbm5vdCBpbnRhbnRpYXRlIHRoZSBjbGFzcyAtIHRocm93IHRoZSBvcmlnaW5hbCBBeGlzIGZhdWx0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBmOwotICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChqYXZhLmxhbmcuQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBjYW5ub3QgaW50YW50aWF0ZSB0aGUgY2xhc3MgLSB0aHJvdyB0aGUgb3JpZ2luYWwgQXhpcyBmYXVsdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgfWNhdGNoIChqYXZhLmxhbmcuTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGNhbm5vdCBpbnRhbnRpYXRlIHRoZSBjbGFzcyAtIHRocm93IHRoZSBvcmlnaW5hbCBBeGlzIGZhdWx0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBmOwotICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGNhbm5vdCBpbnRhbnRpYXRlIHRoZSBjbGFzcyAtIHRocm93IHRoZSBvcmlnaW5hbCBBeGlzIGZhdWx0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBmOwotICAgICAgICAgICAgICAgICAgICAgICAgICB9ICBjYXRjaCAoamF2YS5sYW5nLklsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgY2Fubm90IGludGFudGlhdGUgdGhlIGNsYXNzIC0gdGhyb3cgdGhlIG9yaWdpbmFsIEF4aXMgZmF1bHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIH0gICBjYXRjaCAoamF2YS5sYW5nLkluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgY2Fubm90IGludGFudGlhdGUgdGhlIGNsYXNzIC0gdGhyb3cgdGhlIG9yaWdpbmFsIEF4aXMgZmF1bHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZjsKLSAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBmOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIF9tZXNzYWdlQ29udGV4dC5nZXRUcmFuc3BvcnRPdXQoKS5nZXRTZW5kZXIoKS5jbGVhbnVwKF9tZXNzYWdlQ29udGV4dCk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgIDx4c2w6aWYgdGVzdD0ibm90KCRtZXA9JzExJykiPgotICAgICAgICAgICAgICBfbWVzc2FnZUNvbnRleHQuZ2V0VHJhbnNwb3J0T3V0KCkuZ2V0U2VuZGVyKCkuY2xlYW51cChfbWVzc2FnZUNvbnRleHQpOyAKLSAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICB9Ci0gICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0KLQotICAgICAgIC8qKgotICAgICAgICAqICBBIHV0aWxpdHkgbWV0aG9kIHRoYXQgY29waWVzIHRoZSBuYW1lcGFjZXMgZnJvbSB0aGUgU09BUEVudmVsb3BlCi0gICAgICAgICovCi0gICAgICAgcHJpdmF0ZSBqYXZhLnV0aWwuTWFwIGdldEVudmVsb3BlTmFtZXNwYWNlcyhvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlIGVudil7Ci0gICAgICAgIGphdmEudXRpbC5NYXAgcmV0dXJuTWFwID0gbmV3IGphdmEudXRpbC5IYXNoTWFwKCk7Ci0gICAgICAgIGphdmEudXRpbC5JdGVyYXRvciBuYW1lc3BhY2VJdGVyYXRvciA9IGVudi5nZXRBbGxEZWNsYXJlZE5hbWVzcGFjZXMoKTsKLSAgICAgICAgd2hpbGUgKG5hbWVzcGFjZUl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5hbWVzcGFjZSBucyA9IChvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTmFtZXNwYWNlKSBuYW1lc3BhY2VJdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICByZXR1cm5NYXAucHV0KG5zLmdldFByZWZpeCgpLG5zLmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICAgICAgfQotICAgICAgIHJldHVybiByZXR1cm5NYXA7Ci0gICAgfQotCi0gICAgPHhzbDppZiB0ZXN0PSIvL0Bwb2xpY3kiPgotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIAotICAgIHByaXZhdGUgc3RhdGljIG9yZy5hcGFjaGUubmVldGhpLlBvbGljeSBnZXRQb2xpY3kgKGphdmEubGFuZy5TdHJpbmcgcG9saWN5U3RyaW5nKSB7Ci0gICAgCWphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmFpcyA9IG5ldyBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtKHBvbGljeVN0cmluZy5nZXRCeXRlcygpKTsKLSAgICAJcmV0dXJuIG9yZy5hcGFjaGUubmVldGhpLlBvbGljeUVuZ2luZS5nZXRQb2xpY3koYmFpcyk7Ci0gICAgfQotICAgIAotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgIDwveHNsOmlmPgotICAgIAotICAgIHByaXZhdGUgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZVtdIG9wTmFtZUFycmF5ID0gbnVsbDsKLSAgICBwcml2YXRlIGJvb2xlYW4gb3B0aW1pemVDb250ZW50KGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgb3BOYW1lKSB7Ci0gICAgICAgIDx4c2w6aWYgdGVzdD0ic3R1Yk1ldGhvZHMiPgotICAgICAgICAgICAgc2V0T3BOYW1lQXJyYXkoKTsKLSAgICAgICAgPC94c2w6aWY+Ci0KLSAgICAgICAgaWYgKG9wTmFtZUFycmF5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSAmbHQ7IG9wTmFtZUFycmF5Lmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAob3BOYW1lLmVxdWFscyhvcE5hbWVBcnJheVtpXSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsgICAKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgICAvLzx4c2w6YXBwbHktdGVtcGxhdGVzPjx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjb250ZXh0Ij5pbnRlcmZhY2UtaW1wbGVtZW50YXRpb248L3hzbDp3aXRoLXBhcmFtPjwveHNsOmFwcGx5LXRlbXBsYXRlcz4KLSAgIH0KLSAgIDwveHNsOnRlbXBsYXRlPgotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC90ZW1wbGF0ZS9qYXZhL0ludGVyZmFjZVRlbXBsYXRlLnhzbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC90ZW1wbGF0ZS9qYXZhL0ludGVyZmFjZVRlbXBsYXRlLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWY0MzkyMS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdGVtcGxhdGUvamF2YS9JbnRlcmZhY2VUZW1wbGF0ZS54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwyNDUgKzAsMCBAQAotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iPg0KLSAgICA8eHNsOm91dHB1dCBtZXRob2Q9InRleHQiLz4NCi0NCi0gICAgIDwhLS0gaW1wb3J0IHRoZSBkYXRhYmluZGluZyB0ZW1wbGF0ZS0tPg0KLSAgICA8eHNsOmluY2x1ZGUgaHJlZj0iZGF0YWJpbmRzdXBwb3J0ZXIiLz4NCi0gICAgPCEtLSBpbXBvcnQgdGhlIG90aGVyIHRlbXBsYXRlcyBmb3IgZGF0YWJpbmRpbmcNCi0gICAgICAgICBOb3RlICAtICB0aGVzZSBuYW1lcyB3b3VsZCBiZSBoYW5kbGVkIGJ5IGEgc3BlY2lhbA0KLSAgICAgICAgIFVSSSByZXNvbHZlciBkdXJpbmcgdGhlIHhzbHQgdHJhbnNmb3JtYXRpb25zDQotICAgICAtLT4NCi0gICAgPHhzbDppbmNsdWRlIGhyZWY9ImV4dGVybmFsVGVtcGxhdGUiLz4NCi0NCi0NCi0gICAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iL2ludGVyZmFjZSI+DQotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaXNTeW5jIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGlzU3luYyIvPjwveHNsOnZhcmlhYmxlPg0KLSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImlzQXN5bmMiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAaXNBc3luYyIvPjwveHNsOnZhcmlhYmxlPg0KLSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImNhbGxiYWNrbmFtZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBjYWxsYmFja25hbWUiLz48L3hzbDp2YXJpYWJsZT4NCi0gICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJwYWNrYWdlIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHBhY2thZ2UiLz48L3hzbDp2YXJpYWJsZT4NCi0gICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJpc2JhY2tjb21wYXRpYmxlIiBzZWxlY3Q9IkBpc2JhY2tjb21wYXRpYmxlIi8+DQotDQotLyoqDQotICogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+LmphdmENCi0gKg0KLSAqIFRoaXMgZmlsZSB3YXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBXU0RMDQotICogYnkgdGhlIEFwYWNoZSBBeGlzMiB2ZXJzaW9uOiAjYXhpc1ZlcnNpb24jICN0b2RheSMNCi0gKi8NCi0NCi0gICAgcGFja2FnZSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBhY2thZ2UiLz47DQotDQotICAgIC8qDQotICAgICAqICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4gamF2YSBpbnRlcmZhY2UNCi0gICAgICovDQotDQotICAgIHB1YmxpYyBpbnRlcmZhY2UgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIj48L3hzbDp2YWx1ZS1vZj4gew0KLSAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0ibWV0aG9kIj4NCi0gICAgICAgICAgICA8IS0tIENvZGUgZm9yIGluLW91dCBtZXAgLS0+DQotICAgICAgICAgPHhzbDppZiB0ZXN0PSJAbWVwPScxMiciPg0KLSAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ib3V0cHV0dHlwZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im91dHB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknXS9AdHlwZSI+PC94c2w6dmFsdWUtb2Y+PC94c2w6dmFyaWFibGU+DQotICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJvdXRwdXRjb21wbGV4dHlwZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im91dHB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknXS9AY29tcGxleHR5cGUiPjwveHNsOnZhbHVlLW9mPjwveHNsOnZhcmlhYmxlPg0KLSAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ib3V0cHV0cGFyYW1jb3VudCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImNvdW50KG91dHB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknXS9wYXJhbSkiPjwveHNsOnZhbHVlLW9mPjwveHNsOnZhcmlhYmxlPg0KLSAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaXNVbndyYXBQYXJhbWV0ZXJzIiBzZWxlY3Q9ImlucHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keScgYW5kIEB0eXBlIT0nJ10vQHVud3JhcHBQYXJhbWV0ZXJzIi8+DQotDQotICAgICAgICA8IS0tIHN0YXJ0IG9mIHRoZSBzeW5jIGJsb2NrIC0tPg0KLSAgICAgICAgIDx4c2w6aWYgdGVzdD0iJGlzU3luYz0nMSciPg0KLQ0KLSAgICAgICAgLyoqDQotICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgbWV0aG9kIHNpZ25hdHVyZQ0KLSAgICAgICAgICAqIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAY29tbWVudCIvPg0KLSAgICAgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iaW5wdXQvcGFyYW1bQHR5cGUhPScnXSI+DQotICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiPjwveHNsOnZhbHVlLW9mPjx4c2w6dGV4dD4NCi0gICAgICAgICAgICAgICAgPC94c2w6dGV4dD48L3hzbDpmb3ItZWFjaD4NCi0gICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImZhdWx0L3BhcmFtW0B0eXBlIT0nJ10iPg0KLSAgICAgICAgICAgICAqIEB0aHJvd3MgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+IDogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBjb21tZW50Ii8+DQotICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPg0KLSAgICAgICAgICovDQotDQotICAgICAgICAgPHhzbDpjaG9vc2U+DQotICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkaXNiYWNrY29tcGF0aWJsZT0ndHJ1ZSciPg0KLSAgICAgICAgICAgICAgICAgICAgcHVibGljIDx4c2w6Y2hvb3NlPjx4c2w6d2hlbiB0ZXN0PSIkb3V0cHV0dHlwZT0nJyI+dm9pZDwveHNsOndoZW4+DQotICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJzdHJpbmctbGVuZ3RoKG5vcm1hbGl6ZS1zcGFjZSgkb3V0cHV0Y29tcGxleHR5cGUpKSA+IDAiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkb3V0cHV0Y29tcGxleHR5cGUiLz48L3hzbDp3aGVuPg0KLSAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG91dHB1dHR5cGUiLz48L3hzbDpvdGhlcndpc2U+PC94c2w6Y2hvb3NlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dGV4dD4gPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4oDQotDQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJpbnB1dGNvdW50IiBzZWxlY3Q9ImNvdW50KGlucHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keScgYW5kIEB0eXBlIT0nJ10pIi8+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkaW5wdXRjb3VudD0xIj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaW5wdXRDb21wbGV4VHlwZSIgc2VsZWN0PSJpbnB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknIGFuZCBAdHlwZSE9JyddL0Bjb21wbGV4dHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9InN0cmluZy1sZW5ndGgobm9ybWFsaXplLXNwYWNlKCRpbnB1dENvbXBsZXhUeXBlKSkgPiAwIj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGlucHV0Q29tcGxleFR5cGUiLz48eHNsOnRleHQ+IDwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImlucHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keScgYW5kIEB0eXBlIT0nJ10vQG5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdib2R5JyBhbmQgQHR5cGUhPScnXS9AdHlwZSIvPjx4c2w6dGV4dD4gPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdib2R5JyBhbmQgQHR5cGUhPScnXS9AbmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+PCEtLSBKdXN0IGxlYXZlIGl0IC0gbm90aGluZyB3ZSBjYW4gZG8gaGVyZSAtLT48L3hzbDpvdGhlcndpc2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPg0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iJGlucHV0Y291bnQ9MSBhbmQgaW5wdXQvcGFyYW1bbm90KEBsb2NhdGlvbj0nYm9keScpIGFuZCBAdHlwZSE9JyddIj4sPC94c2w6aWY+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImlucHV0L3BhcmFtW25vdChAbG9jYXRpb249J2JvZHknKSBhbmQgQHR5cGUhPScnXSI+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9InBvc2l0aW9uKCk+MSI+LDwveHNsOmlmPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPjx4c2w6dGV4dD4gPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4pDQotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbg0KLSAgICAgICAgICAgICA8L3hzbDp3aGVuPg0KLSAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4NCi0gICAgICAgICAgICAgICAgICAgICBwdWJsaWMgPHhzbDpjaG9vc2U+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG91dHB1dHR5cGU9JyciPnZvaWQ8L3hzbDp3aGVuPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRvdXRwdXRwYXJhbWNvdW50PTEiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJvdXRwdXQvcGFyYW1bQGxvY2F0aW9uPSdib2R5J10vcGFyYW0vQHR5cGUiLz48L3hzbDp3aGVuPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9InN0cmluZy1sZW5ndGgobm9ybWFsaXplLXNwYWNlKCRvdXRwdXRjb21wbGV4dHlwZSkpID4gMCI+PHhzbDp2YWx1ZS1vZg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Q9IiRvdXRwdXRjb21wbGV4dHlwZSIvPjwveHNsOndoZW4+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iKCRvdXRwdXRwYXJhbWNvdW50PTApIGFuZCAoJGlzVW53cmFwUGFyYW1ldGVycykiPnZvaWQ8L3hzbDp3aGVuPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvdXRwdXR0eXBlIi8+PC94c2w6b3RoZXJ3aXNlPg0KLSAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dGV4dD4gPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4oDQotDQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJpbnB1dGNvdW50IiBzZWxlY3Q9ImNvdW50KGlucHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keScgYW5kIEB0eXBlIT0nJ10pIi8+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkaW5wdXRjb3VudD0xIj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRXZlbiB3aGVuIHRoZSBwYXJhbWV0ZXJzIGFyZSAxIHdlIGhhdmUgdG8gc2VlIHdoZXRoZXIgd2UgaGF2ZSB0aGUNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVkIHBhcmFtZXRlcnMgLS0+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGlzVW53cmFwUGFyYW1ldGVycyI+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImlucHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keScgYW5kIEB0eXBlIT0nJ10vcGFyYW0iPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJwb3NpdGlvbigpPjEiPiw8L3hzbDppZj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz48eHNsOnRleHQ+IDwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImlucHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keScgYW5kIEB0eXBlIT0nJ10vQHR5cGUiLz48eHNsOnRleHQ+IDwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImlucHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keScgYW5kIEB0eXBlIT0nJ10vQG5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPjwhLS0gSnVzdCBsZWF2ZSBpdCAtIG5vdGhpbmcgd2UgY2FuIGRvIGhlcmUgLS0+PC94c2w6b3RoZXJ3aXNlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4NCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IiRpbnB1dGNvdW50PTEgYW5kIGlucHV0L3BhcmFtW25vdChAbG9jYXRpb249J2JvZHknKSBhbmQgQHR5cGUhPScnXSI+LDwveHNsOmlmPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJpbnB1dC9wYXJhbVtub3QoQGxvY2F0aW9uPSdib2R5JykgYW5kIEB0eXBlIT0nJ10iPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJwb3NpdGlvbigpPjEiPiw8L3hzbDppZj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz48eHNsOnRleHQ+IDwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+DQotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+KQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24NCi0gICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPg0KLSAgICAgICAgIDwveHNsOmNob29zZT4NCi0NCi0gICAgICAgICAgPCEtLWFkZCB0aGUgZmF1bHRzLS0+DQotICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJmYXVsdC9wYXJhbVtAdHlwZSE9JyddIj4NCi0gICAgICAgICAgLDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD47DQotDQotICAgICAgICA8L3hzbDppZj4NCi0NCi0gICAgICAgPCEtLSBzdGFydCBvZiB0aGUgYXN5bmMgYmxvY2sgLS0+DQotICAgICAgICA8eHNsOmlmIHRlc3Q9IiRpc0FzeW5jPScxJyI+DQotICAgICAgICAgLyoqDQotICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBtZXRob2Qgc2lnbmF0dXJlIGZvciBBc3luY2hyb25vdXMgSW52b2NhdGlvbnMNCi0gICAgICAgICAgICAqIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAY29tbWVudCIvPg0KLSAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJpbnB1dC9wYXJhbVtAdHlwZSE9JyddIj4NCi0gICAgICAgICAgICAgICAgKiBAcGFyYW0gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIj48L3hzbDp2YWx1ZS1vZj48eHNsOnRleHQ+DQotICAgICAgICAgICAgPC94c2w6dGV4dD48L3hzbDpmb3ItZWFjaD4NCi0gICAgICAgICAgKi8NCi0gICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+KA0KLQ0KLSAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaW5wdXRjb3VudCIgc2VsZWN0PSJjb3VudChpbnB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknIGFuZCBAdHlwZSE9JyddKSIvPg0KLSAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaW5wdXRXcmFwcGVkQ291bnQiIHNlbGVjdD0iY291bnQoaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdib2R5JyBhbmQgQHR5cGUhPScnXS9wYXJhbSkiLz4NCi0gICAgICAgICAgICA8eHNsOmNob29zZT4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkaW5wdXRjb3VudD0xIj4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEV2ZW4gd2hlbiB0aGUgcGFyYW1ldGVycyBhcmUgMSB3ZSBoYXZlIHRvIHNlZSB3aGV0aGVyIHdlIGhhdmUgdGhlDQotICAgICAgICAgICAgICAgICAgICAgIHdyYXBwZWQgcGFyYW1ldGVycyAtLT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImlzVW53cmFwUGFyYW1ldGVycyIgc2VsZWN0PSJpbnB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknIGFuZCBAdHlwZSE9JyddL0B1bndyYXBwUGFyYW1ldGVycyIvPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGlzVW53cmFwUGFyYW1ldGVycyI+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJpbnB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknIGFuZCBAdHlwZSE9JyddL3BhcmFtIj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9InBvc2l0aW9uKCk+MSI+LDwveHNsOmlmPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPjx4c2w6dGV4dD4gPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPg0KLSAgICAgICAgICAgPC94c2w6d2hlbj4NCi0gICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImlucHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keScgYW5kIEB0eXBlIT0nJ10vQHR5cGUiLz48eHNsOnRleHQ+IDwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImlucHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keScgYW5kIEB0eXBlIT0nJ10vQG5hbWUiLz4NCi0gICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4NCi0gICAgICAgICA8L3hzbDpjaG9vc2U+DQotICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+PCEtLSBKdXN0IGxlYXZlIGl0IC0gbm90aGluZyB3ZSBjYW4gZG8gaGVyZSAtLT48L3hzbDpvdGhlcndpc2U+DQotICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4NCi0gICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSIoJGlucHV0Y291bnQ9MSkgYW5kIG5vdCgkaXNVbndyYXBQYXJhbWV0ZXJzIGFuZCAkaW5wdXRXcmFwcGVkQ291bnQ9MCkiPiw8L3hzbDppZj4NCi0gICAgICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImlucHV0L3BhcmFtW25vdChAbG9jYXRpb249J2JvZHknKSBhbmQgQHR5cGUhPScnXSI+DQotICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPjx4c2w6dGV4dD4gPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4sDQotICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPg0KLQ0KLSAgICAgICAgICAgIGZpbmFsIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcGFja2FnZSIvPi48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGNhbGxiYWNrbmFtZSIvPiBjYWxsYmFjaykNCi0NCi0gICAgICAgICAgICB0aHJvd3MgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uOw0KLQ0KLSAgICAgPC94c2w6aWY+DQotICAgICA8L3hzbDppZj4NCi0gICAgICAgIDwhLS0gQ29kZSBmb3IgaW4tb25seSBtZXAgLS0+DQotICAgICAgIDx4c2w6aWYgdGVzdD0iQG1lcD0nMTAnIG9yIEBtZXA9JzExJyI+DQotICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ibWVwIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG1lcCIvPjwveHNsOnZhcmlhYmxlPg0KLSAgICAgICAvKioNCi0gICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIG1ldGhvZCBzaWduYXR1cmUgZm9yIEFzeW5jaHJvbm91cyBJbnZvY2F0aW9ucw0KLSAgICAgICAgICogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBjb21tZW50Ii8+DQotICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IiRtZXA9JzExJyI+DQotICAgICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImZhdWx0L3BhcmFtW0B0eXBlIT0nJ10iPg0KLSAgICAgICAgICAgICAgICAgKiBAdGhyb3dzIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPiA6IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAY29tbWVudCIvPg0KLSAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPg0KLSAgICAgICAgICAgPC94c2w6aWY+DQotICAgICAgICAgKi8NCi0gICAgICAgIHB1YmxpYyB2b2lkIDx4c2w6dGV4dD4gPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4oDQotICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJpbnB1dGNvdW50IiBzZWxlY3Q9ImNvdW50KGlucHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keScgYW5kIEB0eXBlIT0nJ10pIi8+DQotICAgICAgICAgPHhzbDpjaG9vc2U+DQotICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkaW5wdXRjb3VudD0xIj4NCi0gICAgICAgICAgICAgICAgICAgIDwhLS0gRXZlbiB3aGVuIHRoZSBwYXJhbWV0ZXJzIGFyZSAxIHdlIGhhdmUgdG8gc2VlIHdoZXRoZXIgd2UgaGF2ZSB0aGUNCi0gICAgICAgICAgICAgICAgICB3cmFwcGVkIHBhcmFtZXRlcnMgLS0+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImlzVW53cmFwUGFyYW1ldGVycyIgc2VsZWN0PSJpbnB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknIGFuZCBAdHlwZSE9JyddL0B1bndyYXBwUGFyYW1ldGVycyIvPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRpc1Vud3JhcFBhcmFtZXRlcnMiPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJpbnB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknIGFuZCBAdHlwZSE9JyddL3BhcmFtIj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0icG9zaXRpb24oKT4xIj4sPC94c2w6aWY+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+PHhzbDp0ZXh0PiA8L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPg0KLSAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPg0KLSAgICAgICAgICAgPC94c2w6d2hlbj4NCi0gICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdib2R5JyBhbmQgQHR5cGUhPScnXS9AdHlwZSIvPjx4c2w6dGV4dD4gPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdib2R5JyBhbmQgQHR5cGUhPScnXS9AbmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4NCi0gICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4NCi0gICAgICAgICAgICAgICAgPC94c2w6d2hlbj4NCi0gICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+PCEtLSBKdXN0IGxlYXZlIGl0IC0gbm90aGluZyB3ZSBjYW4gZG8gaGVyZSAtLT48L3hzbDpvdGhlcndpc2U+DQotICAgICAgICAgICAgPC94c2w6Y2hvb3NlPg0KLQ0KLSAgICAgICAgICAgPHhzbDppZiB0ZXN0PSIkaW5wdXRjb3VudD0xIGFuZCBpbnB1dC9wYXJhbVtub3QoQGxvY2F0aW9uPSdib2R5JykgYW5kIEB0eXBlIT0nJ10iPiw8L3hzbDppZj4NCi0gICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iaW5wdXQvcGFyYW1bbm90KEBsb2NhdGlvbj0nYm9keScpIGFuZCBAdHlwZSE9JyddIj4NCi0gICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJwb3NpdGlvbigpPjEiPiw8L3hzbDppZj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz48eHNsOnRleHQ+IDwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+DQotICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+DQotDQotICAgICAgICApIHRocm93cyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24NCi0gICAgICAgIDwhLS1hZGQgdGhlIGZhdWx0cy0tPg0KLSAgICAgICAgPHhzbDppZiB0ZXN0PSIkbWVwPScxMSciPg0KLSAgICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJmYXVsdC9wYXJhbVtAdHlwZSE9JyddIj4NCi0gICAgICAgICAgICAgICAsPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+DQotICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+DQotICAgICAgICA8L3hzbDppZj47DQotDQotICAgICAgICA8L3hzbDppZj4NCi0NCi0gICAgICA8L3hzbDpmb3ItZWFjaD4NCi0NCi0gICAgICAgPCEtLSBBcHBseSBvdGhlciB0ZW1wbGF0ZXMgLS0+IA0KLSAgICAgICAvLzx4c2w6YXBwbHktdGVtcGxhdGVzLz4NCi0gICAgICAgfQ0KLSAgICA8L3hzbDp0ZW1wbGF0ZT4NCi0gICA8L3hzbDpzdHlsZXNoZWV0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC90ZW1wbGF0ZS9qYXZhL0pheHdzRXhjZXB0aW9uVGVtcGxhdGUueHNsIGIvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL3RlbXBsYXRlL2phdmEvSmF4d3NFeGNlcHRpb25UZW1wbGF0ZS54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4NDdhN2EuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL3RlbXBsYXRlL2phdmEvSmF4d3NFeGNlcHRpb25UZW1wbGF0ZS54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIgotICAgICAgICAgICAgICAgIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIj4KLSAgICA8eHNsOm91dHB1dCBtZXRob2Q9InRleHQiLz4KLQotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0idGFyZ2V0TnMiIHNlbGVjdD0iL2phdmFDb25zdHJ1Y3QvQHRhcmdldE5hbWVzcGFjZSIvPgotCi0gICAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iamF2YUNvbnN0cnVjdCI+cGFja2FnZSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHBhY2thZ2UiLz47Ci08eHNsOmZvci1lYWNoIHNlbGVjdD0iaW1wb3J0TGlzdC9pbXBvcnQiPgotaW1wb3J0IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdmFsdWUiLz47PC94c2w6Zm9yLWVhY2g+Ci08eHNsOnRleHQ+Ci08L3hzbDp0ZXh0PgotLyoqCi0gKiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4uamF2YQotICoKLSAqIFRoaXMgY2xhc3Mgd2FzIGF1dG8tZ2VuZXJhdGVkIGZyb20gV1NETC4KLSAqIEFwYWNoZSBBeGlzMiB2ZXJzaW9uOiAjYXhpc1ZlcnNpb24jICN0b2RheSMKLSAqCi0gKi8KLTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJhbm5vdGF0aW9uIj4KLSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImFubm9wYXJhbWNvdW50IiBzZWxlY3Q9ImNvdW50KHBhcmFtKSIvPgotQDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPig8eHNsOmZvci1lYWNoIHNlbGVjdD0icGFyYW0iPgotICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkYW5ub3BhcmFtY291bnQgPSBwb3NpdGlvbigpIj4KLSAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz4KLSAgICAgICAgICAgICAgICA8eHNsOnRleHQ+PTwveHNsOnRleHQ+Ijx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdmFsdWUiLz4iPC94c2w6d2hlbj4KLSAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPgotICAgICAgICAgICAgICAgIDx4c2w6dGV4dD49PC94c2w6dGV4dD4iPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB2YWx1ZSIvPiIsPHhzbDp0ZXh0PiA8L3hzbDp0ZXh0PgotICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgPC94c2w6Zm9yLWVhY2g+KTwveHNsOmZvci1lYWNoPgotcHVibGljIGNsYXNzIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPiBleHRlbmRzIEV4Y2VwdGlvbnsKLQotICAgIC8qKgotICAgICAqIEphdmEgdHlwZSB0aGF0IGdvZXMgYXMgc29hcGVudjpGYXVsdCBkZXRhaWwgZWxlbWVudC4KLSAgICAgKi8KLSAgICBwcml2YXRlIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAc2hvcnRUeXBlIi8+IGZhdWx0SW5mbzsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBmYXVsdEluZm8KLSAgICAgKiBAcGFyYW0gbWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4oU3RyaW5nIG1lc3NhZ2UsIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAc2hvcnRUeXBlIi8+IGZhdWx0SW5mbykgewotICAgICAgICBzdXBlcihtZXNzYWdlKTsKLSAgICAgICAgdGhpcy5mYXVsdEluZm8gPSBmYXVsdEluZm87Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGZhdWx0SW5mbwotICAgICAqIEBwYXJhbSBtZXNzYWdlCi0gICAgICogQHBhcmFtIGNhdXNlCi0gICAgICovCi0gICAgcHVibGljIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPihTdHJpbmcgbWVzc2FnZSwgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBzaG9ydFR5cGUiLz4gZmF1bHRJbmZvLCBUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpOwotICAgICAgICB0aGlzLmZhdWx0SW5mbyA9IGZhdWx0SW5mbzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuCi0gICAgICogICByZXR1cm5zIGZhdWx0IGJlYW46IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAc2hvcnRUeXBlIi8+Ci0gICAgICovCi0gICAgcHVibGljIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAc2hvcnRUeXBlIi8+IGdldEZhdWx0SW5mbygpIHsKLSAgICAgICAgcmV0dXJuIGZhdWx0SW5mbzsKLSAgICB9Ci19Ci0gICAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgIDwhLS0gPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ibWV0aG9kIj4KLSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im91dHBhcmFtY291bnQiIHNlbGVjdD0iY291bnQob3V0cHV0L3BhcmFtKSIvPgotICAgIEBqYXZheC5qd3MuV2ViTWV0aG9kCi0gICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkb3V0cGFyYW1jb3VudCA9IDAiPkBqYXZheC5qd3MuT25ld2F5PC94c2w6d2hlbj4KLSAgICAgICAgPHhzbDpvdGhlcndpc2U+QGphdmF4Lmp3cy5XZWJSZXN1bHQodGFyZ2V0TmFtZXNwYWNlID0gIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdGFyZ2V0TnMiLz4iKTwveHNsOm90aGVyd2lzZT4KLSAgICA8L3hzbDpjaG9vc2U+Ci0gICAgcHVibGljIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkb3V0cGFyYW1jb3VudCA9IDAiPnZvaWQgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0ib3V0cHV0L3BhcmFtL0B0eXBlIi8+PHhzbDp0ZXh0PiA8L3hzbDp0ZXh0PjwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPig8eHNsOnZhcmlhYmxlIG5hbWU9ImlucGFyYW1jb3VudCIgc2VsZWN0PSJjb3VudChpbnB1dC9wYXJhbSkiLz4KLSAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iaW5wdXQvcGFyYW0iPgotICAgICAgICBAamF2YXguandzLldlYlBhcmFtKG5hbWUgPSAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+IiwgdGFyZ2V0TmFtZXNwYWNlID0gIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdGFyZ2V0TnMiLz4iKQotICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkaW5wYXJhbWNvdW50ID0gcG9zaXRpb24oKSI+Ci0gICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+Ci0gICAgICAgICAgICAgICAgPHhzbDp0ZXh0PiA8L3hzbDp0ZXh0PgotICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPgotICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPgotICAgICAgICAgICAgICAgIDx4c2w6dGV4dD4gPC94c2w6dGV4dD4KLSAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4sPHhzbDp0ZXh0PiA8L3hzbDp0ZXh0PgotICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgPC94c2w6Zm9yLWVhY2g+KS0tPjwhLS08eHNsOmZvci1lYWNoIHNlbGVjdD0iZmF1bHQvcGFyYW1bQHR5cGUhPScnXSI+Ci0gICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9InBvc2l0aW9uKCk9MSI+Ci0gICAgICAgIHRocm93cyA8L3hzbDppZj4KLSAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0icG9zaXRpb24oKT4xIj4sPC94c2w6aWY+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+Ci0gICAgICAgICAgIDwveHNsOmZvci1lYWNoPi0tPjwhLS07Ci0gICAgPC94c2w6dGVtcGxhdGU+LS0+Ci0KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdGVtcGxhdGUvamF2YS9KYXh3c1NlcnZpY2VDbGFzc1RlbXBsYXRlLnhzbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC90ZW1wbGF0ZS9qYXZhL0pheHdzU2VydmljZUNsYXNzVGVtcGxhdGUueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWUzYjU1Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC90ZW1wbGF0ZS9qYXZhL0pheHdzU2VydmljZUNsYXNzVGVtcGxhdGUueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIKLSAgICAgICAgICAgICAgICB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSI+Ci0gICAgPHhzbDpvdXRwdXQgbWV0aG9kPSJ0ZXh0Ii8+Ci0KLSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InRhcmdldE5zIiBzZWxlY3Q9Ii9qYXZhQ29uc3RydWN0L0B0YXJnZXROYW1lc3BhY2UiLz4KLSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InNlcnZpY2VOYW1lIiBzZWxlY3Q9Ii9qYXZhQ29uc3RydWN0L0BuYW1lIi8+Ci0gICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJjYXBpdGFsaXplZFNlcnZpY2VOYW1lIiBzZWxlY3Q9Ii9qYXZhQ29uc3RydWN0L0BjYXBpdGFsaXplZFNlcnZpY2VOYW1lIi8+Ci0gICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJ3c2RsTG9jYXRpb24iIHNlbGVjdD0iL2phdmFDb25zdHJ1Y3QvQHdzZGxMb2NhdGlvbiIvPgotCi0gICAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iamF2YUNvbnN0cnVjdCI+cGFja2FnZSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHBhY2thZ2UiLz47Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7PCEtLTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJpbXBvcnRMaXN0L2ltcG9ydCI+LS0+Ci08IS0taW1wb3J0IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdmFsdWUiLz47PC94c2w6Zm9yLWVhY2g+LS0+Ci0vKioKLSAqIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPi5qYXZhCi0gKgotICogVGhpcyBjbGFzcyB3YXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBXU0RMLgotICogQXBhY2hlIEF4aXMyIHZlcnNpb246ICNheGlzVmVyc2lvbiMgI3RvZGF5IwotICoKLSAqLwotPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImFubm90YXRpb24iPgotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iYW5ub3BhcmFtY291bnQiIHNlbGVjdD0iY291bnQocGFyYW0pIi8+Ci1APHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+KDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJwYXJhbSI+Ci0gICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRhbm5vcGFyYW1jb3VudCA9IHBvc2l0aW9uKCkiPgotICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPgotICAgICAgICAgICAgICAgIDx4c2w6dGV4dD49PC94c2w6dGV4dD4iPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB2YWx1ZSIvPiI8L3hzbDp3aGVuPgotICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+Ci0gICAgICAgICAgICAgICAgPHhzbDp0ZXh0Pj08L3hzbDp0ZXh0PiI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHZhbHVlIi8+Iiw8eHNsOnRleHQ+IDwveHNsOnRleHQ+Ci0gICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgIDwveHNsOmNob29zZT4KLSAgICA8L3hzbDpmb3ItZWFjaD4pPC94c2w6Zm9yLWVhY2g+Ci1wdWJsaWMgY2xhc3MgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzZXJ2aWNlTmFtZSIvPiBleHRlbmRzIFNlcnZpY2UgewotCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBVUkwgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjYXBpdGFsaXplZFNlcnZpY2VOYW1lIi8+X1dTRExfTE9DQVRJT047Ci0KLSAgICBzdGF0aWMgewotICAgICAgICBVUkwgdXJsID0gbnVsbDsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgdXJsID0gbmV3IFVSTCgiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR3c2RsTG9jYXRpb24iLz4iKTsKLSAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjYXBpdGFsaXplZFNlcnZpY2VOYW1lIi8+X1dTRExfTE9DQVRJT04gPSB1cmw7Ci0gICAgfQotCi0gICAgcHVibGljIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc2VydmljZU5hbWUiLz4oKSB7Ci0gICAgICAgIHN1cGVyKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY2FwaXRhbGl6ZWRTZXJ2aWNlTmFtZSIvPl9XU0RMX0xPQ0FUSU9OLAotICAgICAgICAgICAgbmV3IFFOYW1lKCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRhcmdldE5zIi8+IiwiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzZXJ2aWNlTmFtZSIvPiIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzZXJ2aWNlTmFtZSIvPihVUkwgd3NkbExvY2F0aW9uLCBRTmFtZSBzZXJ2aWNlTmFtZSkgewotICAgICAgICBzdXBlcih3c2RsTG9jYXRpb24sIHNlcnZpY2VOYW1lKTsKLSAgICB9Ci0gICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Ii9qYXZhQ29uc3RydWN0L3BvcnQiPgotICAgIC8qKgotICAgICAqIEByZXR1cm4KLSAgICAgKiAgIHJldHVybnMgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBwb3J0VHlwZU5hbWUiLz4KLSAgICAgKi88eHNsOmZvci1lYWNoIHNlbGVjdD0iYW5ub3RhdGlvbiI+Ci0gICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJhbm5vcGFyYW1jb3VudCIgc2VsZWN0PSJjb3VudChwYXJhbSkiLz4KLSAgICBAPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+KDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJwYXJhbSI+Ci0gICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRhbm5vcGFyYW1jb3VudCA9IHBvc2l0aW9uKCkiPgotICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPgotICAgICAgICAgICAgICAgIDx4c2w6dGV4dD49PC94c2w6dGV4dD4iPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB2YWx1ZSIvPiI8L3hzbDp3aGVuPgotICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+Ci0gICAgICAgICAgICAgICAgPHhzbDp0ZXh0Pj08L3hzbDp0ZXh0PiI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHZhbHVlIi8+Iiw8eHNsOnRleHQ+IDwveHNsOnRleHQ+Ci0gICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgIDwveHNsOmNob29zZT4KLSAgICA8L3hzbDpmb3ItZWFjaD4pPC94c2w6Zm9yLWVhY2g+Ci0gICAgcHVibGljIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAcG9ydFR5cGVOYW1lIi8+IGdldDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAcG9ydE5hbWUiLz4oKSB7Ci0gICAgICAgIHJldHVybiAoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBwb3J0VHlwZU5hbWUiLz4pc3VwZXIuZ2V0UG9ydChuZXcgUU5hbWUoIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdGFyZ2V0TnMiLz4iLCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHBvcnROYW1lIi8+IiksCi0gICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBwb3J0VHlwZU5hbWUiLz4uY2xhc3MpOwotICAgIH08L3hzbDpmb3ItZWFjaD4gICAgICAgIAotfQotICAgIDwveHNsOnRlbXBsYXRlPgotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC90ZW1wbGF0ZS9qYXZhL0pheHdzU2VydmljZUVuZHBvaW50SW50ZXJmYWNlSW1wbFRlbXBsYXRlLnhzbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC90ZW1wbGF0ZS9qYXZhL0pheHdzU2VydmljZUVuZHBvaW50SW50ZXJmYWNlSW1wbFRlbXBsYXRlLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM3ODI3Zi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdGVtcGxhdGUvamF2YS9KYXh3c1NlcnZpY2VFbmRwb2ludEludGVyZmFjZUltcGxUZW1wbGF0ZS54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIgotICAgICAgICAgICAgICAgIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIj4KLSAgICA8eHNsOm91dHB1dCBtZXRob2Q9InRleHQiLz4KLSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InRhcmdldE5zIiBzZWxlY3Q9Ii9qYXZhQ29uc3RydWN0L0B0YXJnZXROYW1lc3BhY2UiLz4KLSAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJqYXZhQ29uc3RydWN0Ij5wYWNrYWdlIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAcGFja2FnZSIvPjsKLQotLyoqCi0gKiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4uamF2YQotICoKLSAqIFRoaXMgY2xhc3Mgd2FzIGF1dG8tZ2VuZXJhdGVkIGZyb20gV1NETC4KLSAqIEFwYWNoZSBBeGlzMiB2ZXJzaW9uOiAjYXhpc1ZlcnNpb24jICN0b2RheSMKLSAqLwotPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImFubm90YXRpb24iPgotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iYW5ub3BhcmFtY291bnQiIHNlbGVjdD0iY291bnQocGFyYW0pIi8+Ci1APHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+KDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJwYXJhbSI+Ci0gICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRhbm5vcGFyYW1jb3VudCA9IHBvc2l0aW9uKCkiPgotICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPgotICAgICAgICAgICAgICAgIDx4c2w6dGV4dD4gPSA8L3hzbDp0ZXh0PiI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHZhbHVlIi8+IjwveHNsOndoZW4+Ci0gICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz4KLSAgICAgICAgICAgICAgICA8eHNsOnRleHQ+ID0gPC94c2w6dGV4dD4iPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB2YWx1ZSIvPiIsPHhzbDp0ZXh0PiA8L3hzbDp0ZXh0PgotICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgPC94c2w6Zm9yLWVhY2g+KTwveHNsOmZvci1lYWNoPgotcHVibGljIGNsYXNzIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPiB7Ci08eHNsOmFwcGx5LXRlbXBsYXRlcy8+Ci19Ci0gICAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJtZXRob2QiPgotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ib3V0cGFyYW1jb3VudCIgc2VsZWN0PSJjb3VudChvdXRwdXQvcGFyYW0pIi8+Ci0gICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJwYXJhbWV0ZXJzdHlsZSIgc2VsZWN0PSJAcGFyYW1ldGVyc3R5bGUiLz4KLSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InVzZWhvbGRlciIgc2VsZWN0PSJAdXNlaG9sZGVyIi8+Ci0gICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJzdHlsZSIgc2VsZWN0PSJAc3R5bGUiLz4KLSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImlucHV0V3JhcHBlZENvdW50IiBzZWxlY3Q9ImNvdW50KGlucHV0L3BhcmFtL3BhcmFtKSIvPgotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaW5wYXJhbWNvdW50IiBzZWxlY3Q9ImNvdW50KGlucHV0L3BhcmFtKSIvPgotICAgIC8qKjx4c2w6Y2hvb3NlPjx4c2w6d2hlbiB0ZXN0PSIkaW5wdXRXcmFwcGVkQ291bnQgJmd0OyAwIj48eHNsOmZvci1lYWNoIHNlbGVjdD0iaW5wdXQvcGFyYW0vcGFyYW0iPgotICAgICAqIEBwYXJhbSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48L3hzbDpmb3ItZWFjaD48eHNsOmlmIHRlc3Q9IiRvdXRwYXJhbWNvdW50ICE9IDAiPgotICAgICAqIEByZXR1cm4gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im91dHB1dC9wYXJhbS9Ac2hvcnR0eXBlIi8+PC94c2w6aWY+PHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImZhdWx0L3BhcmFtW0B0eXBlIT0nJ10iPgotICAgICAqIEB0aHJvd3MgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PC94c2w6Zm9yLWVhY2g+PC94c2w6d2hlbj48eHNsOm90aGVyd2lzZT48eHNsOmZvci1lYWNoIHNlbGVjdD0iaW5wdXQvcGFyYW0iPgotICAgICAqIEBwYXJhbSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48L3hzbDpmb3ItZWFjaD48eHNsOmlmIHRlc3Q9IiRvdXRwYXJhbWNvdW50ICE9IDAiPgotICAgICAqIEByZXR1cm4gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im91dHB1dC9wYXJhbS9Ac2hvcnR0eXBlIi8+PC94c2w6aWY+PHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImZhdWx0L3BhcmFtW0B0eXBlIT0nJ10iPgotICAgICAqIEB0aHJvd3MgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PC94c2w6Zm9yLWVhY2g+PC94c2w6b3RoZXJ3aXNlPiA8L3hzbDpjaG9vc2U+Ci0gICAgICovCi0gICAgcHVibGljIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkb3V0cGFyYW1jb3VudCA9IDAiPnZvaWQgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJHVzZWhvbGRlciA9ICd0cnVlJyI+dm9pZCA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJvdXRwdXQvcGFyYW0vQHR5cGUiLz48eHNsOnRleHQ+IDwveHNsOnRleHQ+PC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+KDx4c2w6Y2hvb3NlPgotICAgICAgICA8eHNsOndoZW4gdGVzdD0iJHVzZWhvbGRlciA9ICd0cnVlJyI+Ci0gICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImlucHV0L3BhcmFtIj4KLSAgICAgICAgQGphdmF4Lmp3cy5XZWJQYXJhbShuYW1lID0gIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPiIsIHRhcmdldE5hbWVzcGFjZSA9ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRhcmdldE5zIi8+IiwgbW9kZSA9IGphdmF4Lmp3cy5XZWJQYXJhbS5Nb2RlLklOT1VUPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRwYXJhbWV0ZXJzdHlsZSA9ICdCQVJFJyI+LCBwYXJ0TmFtZSA9ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHBhcnRuYW1lIi8+IjwveHNsOndoZW4+PC94c2w6Y2hvb3NlPikKLSAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGlucGFyYW1jb3VudCA9IHBvc2l0aW9uKCkiPmphdmF4LnhtbC53cy5Ib2xkZXImbHQ7PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+Ci0gICAgICAgICAgICAgICAgPHhzbDp0ZXh0PiZndDsgPC94c2w6dGV4dD4KLSAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4KLSAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICA8eHNsOm90aGVyd2lzZT5qYXZheC54bWwud3MuSG9sZGVyJmx0Ozx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPgotICAgICAgICAgICAgICAgIDx4c2w6dGV4dD4mZ3Q7IDwveHNsOnRleHQ+Ci0gICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+LDx4c2w6dGV4dD4gPC94c2w6dGV4dD4KLSAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgIDwveHNsOmZvci1lYWNoPjwveHNsOndoZW4+Ci0gICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkaW5wdXRXcmFwcGVkQ291bnQgJmd0OyAwIj4KLSAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJpbnB1dC9wYXJhbS9wYXJhbSI+Ci0gICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRpbnB1dFdyYXBwZWRDb3VudCA9IHBvc2l0aW9uKCkiPgotICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPgotICAgICAgICAgICAgICAgIDx4c2w6dGV4dD4gPC94c2w6dGV4dD4KLSAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4KLSAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz4KLSAgICAgICAgICAgICAgICA8eHNsOnRleHQ+IDwveHNsOnRleHQ+Ci0gICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+LDx4c2w6dGV4dD4gPC94c2w6dGV4dD4KLSAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgIDx4c2w6b3RoZXJ3aXNlPjx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJpbnB1dC9wYXJhbSI+Ci0gICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRpbnBhcmFtY291bnQgPSBwb3NpdGlvbigpIj4KLSAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz4KLSAgICAgICAgICAgICAgICA8eHNsOnRleHQ+IDwveHNsOnRleHQ+Ci0gICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+Ci0gICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+Ci0gICAgICAgICAgICAgICAgPHhzbDp0ZXh0PiA8L3hzbDp0ZXh0PgotICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPiw8eHNsOnRleHQ+IDwveHNsOnRleHQ+Ci0gICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgIDwveHNsOmNob29zZT4KLSAgICA8L3hzbDpmb3ItZWFjaD48L3hzbDpvdGhlcndpc2U+Ci0gICAgPC94c2w6Y2hvb3NlPik8eHNsOmZvci1lYWNoIHNlbGVjdD0iZmF1bHQvcGFyYW1bQHR5cGUhPScnXSI+Ci0gICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9InBvc2l0aW9uKCk9MSI+Ci0gICAgICAgICAgICB0aHJvd3MgPC94c2w6aWY+Ci0gICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9InBvc2l0aW9uKCk+MSI+LDwveHNsOmlmPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAc2hvcnROYW1lIi8+Ci0gICAgICAgICAgIDwveHNsOmZvci1lYWNoPiB7Ci0gICAgICAgIC8vVE9ETyA6IGZpbGwgdGhpcyB3aXRoIHRoZSBuZWNlc3NhcnkgYnVzaW5lc3MgbG9naWMKLSAgICAgICAgdGhyb3cgbmV3IGphdmEubGFuZy5VbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiUGxlYXNlIGltcGxlbWVudCAiICsgdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKQotICAgICAgICAgICAgICAgICsgIiMiICsgdGhpcy5nZXRDbGFzcygpLmdldEVuY2xvc2luZ01ldGhvZCgpLmdldE5hbWUoKSk7Ci0gICAgfQotICAgIDwveHNsOnRlbXBsYXRlPgotCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL3RlbXBsYXRlL2phdmEvSmF4d3NTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VUZW1wbGF0ZS54c2wgYi92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdGVtcGxhdGUvamF2YS9KYXh3c1NlcnZpY2VFbmRwb2ludEludGVyZmFjZVRlbXBsYXRlLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDZlZDhjMS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdGVtcGxhdGUvamF2YS9KYXh3c1NlcnZpY2VFbmRwb2ludEludGVyZmFjZVRlbXBsYXRlLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCi0gICAgICAgICAgICAgICAgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iPgotICAgIDx4c2w6b3V0cHV0IG1ldGhvZD0idGV4dCIvPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJ0YXJnZXROcyIgc2VsZWN0PSIvamF2YUNvbnN0cnVjdC9AdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iamF2YUNvbnN0cnVjdCI+cGFja2FnZSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHBhY2thZ2UiLz47Ci08eHNsOmZvci1lYWNoIHNlbGVjdD0iaW1wb3J0TGlzdC9pbXBvcnQiPgotaW1wb3J0IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdmFsdWUiLz47PC94c2w6Zm9yLWVhY2g+Ci08eHNsOnRleHQ+Ci08L3hzbDp0ZXh0PgotLyoqCi0gKiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4uamF2YQotICoKLSAqIFRoaXMgY2xhc3Mgd2FzIGF1dG8tZ2VuZXJhdGVkIGZyb20gV1NETC4KLSAqIEFwYWNoZSBBeGlzMiB2ZXJzaW9uOiAjYXhpc1ZlcnNpb24jICN0b2RheSMKLSAqLwotPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImFubm90YXRpb24iPgotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iYW5ub3BhcmFtY291bnQiIHNlbGVjdD0iY291bnQocGFyYW0pIi8+Ci1APHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+KDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJwYXJhbSI+Ci0gICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRhbm5vcGFyYW1jb3VudCA9IHBvc2l0aW9uKCkiPgotICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPgotICAgICAgICAgICAgICAgIDx4c2w6dGV4dD4gPSA8L3hzbDp0ZXh0PiI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHZhbHVlIi8+IjwveHNsOndoZW4+Ci0gICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz4KLSAgICAgICAgICAgICAgICA8eHNsOnRleHQ+ID0gPC94c2w6dGV4dD4iPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB2YWx1ZSIvPiIsPHhzbDp0ZXh0PiA8L3hzbDp0ZXh0PgotICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgPC94c2w6Zm9yLWVhY2g+KTwveHNsOmZvci1lYWNoPgotcHVibGljIGludGVyZmFjZSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4gewotPHhzbDphcHBseS10ZW1wbGF0ZXMvPgotfQotICAgIDwveHNsOnRlbXBsYXRlPgotCi0gICAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ibWV0aG9kIj4KLSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im91dHBhcmFtY291bnQiIHNlbGVjdD0iY291bnQob3V0cHV0L3BhcmFtKSIvPgotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icGFyYW1ldGVyc3R5bGUiIHNlbGVjdD0iQHBhcmFtZXRlcnN0eWxlIi8+Ci0gICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJ1c2Vob2xkZXIiIHNlbGVjdD0iQHVzZWhvbGRlciIvPgotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ic3R5bGUiIHNlbGVjdD0iQHN0eWxlIi8+Ci0gICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJpbnB1dFdyYXBwZWRDb3VudCIgc2VsZWN0PSJjb3VudChpbnB1dC9wYXJhbS9wYXJhbSkiLz4KLSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImlucGFyYW1jb3VudCIgc2VsZWN0PSJjb3VudChpbnB1dC9wYXJhbSkiLz4KLSAgICAvKio8eHNsOmNob29zZT48eHNsOndoZW4gdGVzdD0iJGlucHV0V3JhcHBlZENvdW50ICZndDsgMCI+PHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImlucHV0L3BhcmFtL3BhcmFtIj4KLSAgICAgKiBAcGFyYW0gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PC94c2w6Zm9yLWVhY2g+PHhzbDppZiB0ZXN0PSIkb3V0cGFyYW1jb3VudCAhPSAwIj4KLSAgICAgKiBAcmV0dXJuIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJvdXRwdXQvcGFyYW0vQHNob3J0dHlwZSIvPjwveHNsOmlmPjx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJmYXVsdC9wYXJhbVtAdHlwZSE9JyddIj4KLSAgICAgKiBAdGhyb3dzIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwveHNsOmZvci1lYWNoPjwveHNsOndoZW4+PHhzbDpvdGhlcndpc2U+PHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImlucHV0L3BhcmFtIj4KLSAgICAgKiBAcGFyYW0gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PC94c2w6Zm9yLWVhY2g+PHhzbDppZiB0ZXN0PSIkb3V0cGFyYW1jb3VudCAhPSAwIj4KLSAgICAgKiBAcmV0dXJuIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJvdXRwdXQvcGFyYW0vQHNob3J0dHlwZSIvPjwveHNsOmlmPjx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJmYXVsdC9wYXJhbVtAdHlwZSE9JyddIj4KLSAgICAgKiBAdGhyb3dzIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAc2hvcnROYW1lIi8+PC94c2w6Zm9yLWVhY2g+PC94c2w6b3RoZXJ3aXNlPiA8L3hzbDpjaG9vc2U+Ci0gICAgICovCi0gICAgQGphdmF4Lmp3cy5XZWJNZXRob2Q8eHNsOmNob29zZT4KLSAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRvdXRwYXJhbWNvdW50ID0gMCI+PHhzbDp0ZXh0PgotICAgIDwveHNsOnRleHQ+QGphdmF4Lmp3cy5PbmV3YXk8L3hzbDp3aGVuPgotICAgICAgICA8eHNsOndoZW4gdGVzdD0iJHVzZWhvbGRlciA9ICd0cnVlJyI+PC94c2w6d2hlbj4KLSAgICAgICAgPHhzbDpvdGhlcndpc2U+PHhzbDp0ZXh0PgotICAgIDwveHNsOnRleHQ+QGphdmF4Lmp3cy5XZWJSZXN1bHQodGFyZ2V0TmFtZXNwYWNlID0gIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdGFyZ2V0TnMiLz4iPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRwYXJhbWV0ZXJzdHlsZSA9ICdCQVJFJyI+LCBwYXJ0TmFtZSA9ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0ib3V0cHV0L3BhcmFtL0BwYXJ0bmFtZSIvPiI8L3hzbDp3aGVuPjwveHNsOmNob29zZT4pPC94c2w6b3RoZXJ3aXNlPgotICAgIDwveHNsOmNob29zZT4KLSAgICA8eHNsOmNob29zZT4KLSAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRpbnB1dFdyYXBwZWRDb3VudCA9IDAiPgotICAgIEBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZyhwYXJhbWV0ZXJTdHlsZSA9IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlBhcmFtZXRlclN0eWxlLkJBUkUpPC94c2w6d2hlbj4KLSAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgQGphdmF4LnhtbC53cy5SZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImlucHV0L3BhcmFtL0BuYW1lIi8+IiwgdGFyZ2V0TmFtZXNwYWNlID0gIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdGFyZ2V0TnMiLz4iLCBjbGFzc05hbWUgPSAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImlucHV0L3BhcmFtL0B0eXBlIi8+Iik8eHNsOmlmIHRlc3Q9IiRvdXRwYXJhbWNvdW50ICE9IDAiPgotICAgIEBqYXZheC54bWwud3MuUmVzcG9uc2VXcmFwcGVyKGxvY2FsTmFtZSA9ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0ib3V0cHV0L3BhcmFtL0BuYW1lIi8+IiwgdGFyZ2V0TmFtZXNwYWNlID0gIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdGFyZ2V0TnMiLz4iLCBjbGFzc05hbWUgPSAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im91dHB1dC9wYXJhbS9AdHlwZSIvPiIpPC94c2w6aWY+Ci0gICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICA8L3hzbDpjaG9vc2U+Ci0gICAgcHVibGljIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkb3V0cGFyYW1jb3VudCA9IDAiPnZvaWQgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJHVzZWhvbGRlciA9ICd0cnVlJyI+dm9pZCA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkaW5wdXRXcmFwcGVkQ291bnQgIT0gMCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im91dHB1dC9wYXJhbS9wYXJhbS9AdHlwZSIvPjx4c2w6dGV4dD4gPC94c2w6dGV4dD48L3hzbDp3aGVuPiAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJvdXRwdXQvcGFyYW0vQHR5cGUiLz48eHNsOnRleHQ+IDwveHNsOnRleHQ+PC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+KDx4c2w6Y2hvb3NlPgotICAgICAgICA8eHNsOndoZW4gdGVzdD0iJHVzZWhvbGRlciA9ICd0cnVlJyI+Ci0gICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkaW5wdXRXcmFwcGVkQ291bnQgPSAwIj4KLSAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImlucHV0L3BhcmFtIj4KLSAgICAgICAgICAgIEBqYXZheC5qd3MuV2ViUGFyYW0obmFtZSA9ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4iLCB0YXJnZXROYW1lc3BhY2UgPSAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0YXJnZXROcyIvPiIsIG1vZGUgPSBqYXZheC5qd3MuV2ViUGFyYW0uTW9kZS5JTk9VVDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkcGFyYW1ldGVyc3R5bGUgPSAnQkFSRSciPiwgcGFydE5hbWUgPSAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBwYXJ0bmFtZSIvPiI8L3hzbDp3aGVuPjwveHNsOmNob29zZT4pPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGlucGFyYW1jb3VudCA9IHBvc2l0aW9uKCkiPgotICAgICAgICAgICAgamF2YXgueG1sLndzLkhvbGRlciZsdDs8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz4KLSAgICAgICAgICAgICAgICA8eHNsOnRleHQ+Jmd0OyA8L3hzbDp0ZXh0PgotICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPgotICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgamF2YXgueG1sLndzLkhvbGRlciZsdDs8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz4KLSAgICAgICAgICAgICAgICA8eHNsOnRleHQ+Jmd0OyA8L3hzbDp0ZXh0PgotICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPiw8eHNsOnRleHQ+IDwveHNsOnRleHQ+Ci0gICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iaW5wdXQvcGFyYW0vcGFyYW0iPgotICAgICAgICAgICAgQGphdmF4Lmp3cy5XZWJQYXJhbShuYW1lID0gIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPiIsIHRhcmdldE5hbWVzcGFjZSA9ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRhcmdldE5zIi8+IiwgbW9kZSA9IGphdmF4Lmp3cy5XZWJQYXJhbS5Nb2RlLklOT1VUPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRwYXJhbWV0ZXJzdHlsZSA9ICdCQVJFJyI+LCBwYXJ0TmFtZSA9ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHBhcnRuYW1lIi8+IjwveHNsOndoZW4+PC94c2w6Y2hvb3NlPik8eHNsOmNob29zZT4KLSAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkaW5wdXRXcmFwcGVkQ291bnQgPSBwb3NpdGlvbigpIj4KLSAgICAgICAgICAgIGphdmF4LnhtbC53cy5Ib2xkZXImbHQ7PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+Ci0gICAgICAgICAgICAgICAgPHhzbDp0ZXh0PiZndDsgPC94c2w6dGV4dD4KLSAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4KLSAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgIGphdmF4LnhtbC53cy5Ib2xkZXImbHQ7PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+Ci0gICAgICAgICAgICAgICAgPHhzbDp0ZXh0PiZndDsgPC94c2w6dGV4dD4KLSAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4sPHhzbDp0ZXh0PiA8L3hzbDp0ZXh0PgotICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgIDwveHNsOmZvci1lYWNoPgotICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgPC94c2w6Y2hvb3NlPgotICAgPC94c2w6d2hlbj4KLSAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRpbnB1dFdyYXBwZWRDb3VudCAmZ3Q7IDAiPgotICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImlucHV0L3BhcmFtL3BhcmFtIj4KLSAgICAgICAgICAgIEBqYXZheC5qd3MuV2ViUGFyYW0obmFtZSA9ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4iLCB0YXJnZXROYW1lc3BhY2UgPSAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0YXJnZXROcyIvPiI8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJHBhcmFtZXRlcnN0eWxlID0gJ0JBUkUnIj4sIHBhcnROYW1lID0gIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAcGFydG5hbWUiLz4iPC94c2w6d2hlbj48L3hzbDpjaG9vc2U+KQotICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRpbnB1dFdyYXBwZWRDb3VudCA9IHBvc2l0aW9uKCkiPgotICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp0ZXh0PiA8L3hzbDp0ZXh0PgotICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4KLSAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp0ZXh0PiA8L3hzbDp0ZXh0PgotICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4sPHhzbDp0ZXh0PiA8L3hzbDp0ZXh0PgotICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPgotICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICA8eHNsOm90aGVyd2lzZT48eHNsOmZvci1lYWNoIHNlbGVjdD0iaW5wdXQvcGFyYW0iPgotICAgICAgICAgICAgQGphdmF4Lmp3cy5XZWJQYXJhbShuYW1lID0gIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPiIsIHRhcmdldE5hbWVzcGFjZSA9ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRhcmdldE5zIi8+Ijx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkcGFyYW1ldGVyc3R5bGUgPSAnQkFSRSciPiwgcGFydE5hbWUgPSAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBwYXJ0bmFtZSIvPiI8L3hzbDp3aGVuPjwveHNsOmNob29zZT4pCi0gICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGlucGFyYW1jb3VudCA9IHBvc2l0aW9uKCkiPgotICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp0ZXh0PiA8L3hzbDp0ZXh0PgotICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4KLSAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp0ZXh0PiA8L3hzbDp0ZXh0PgotICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4sPHhzbDp0ZXh0PiA8L3hzbDp0ZXh0PgotICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICA8L3hzbDpmb3ItZWFjaD48L3hzbDpvdGhlcndpc2U+Ci0gICAgPC94c2w6Y2hvb3NlPik8eHNsOmZvci1lYWNoIHNlbGVjdD0iZmF1bHQvcGFyYW1bQHR5cGUhPScnXSI+Ci0gICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9InBvc2l0aW9uKCk9MSI+Ci0gICAgICAgICAgICB0aHJvd3MgPC94c2w6aWY+Ci0gICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9InBvc2l0aW9uKCk+MSI+LDwveHNsOmlmPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAc2hvcnROYW1lIi8+Ci0gICAgICAgICAgIDwveHNsOmZvci1lYWNoPjsKLSAgICA8L3hzbDp0ZW1wbGF0ZT4KLQotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC90ZW1wbGF0ZS9qYXZhL0pheHdzU2VydmljZVhNTFRlbXBsYXRlLnhzbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC90ZW1wbGF0ZS9qYXZhL0pheHdzU2VydmljZVhNTFRlbXBsYXRlLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JmOGZlYS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdGVtcGxhdGUvamF2YS9KYXh3c1NlcnZpY2VYTUxUZW1wbGF0ZS54c2wKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIj4KLSAgICA8eHNsOm91dHB1dCBtZXRob2Q9InhtbCIgaW5kZW50PSJ5ZXMiIG9taXQteG1sLWRlY2xhcmF0aW9uPSJ5ZXMiLz4KLQotICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8iPgotICAgICAgICA8eHNsOmNvbW1lbnQ+IFRoaXMgZmlsZSB3YXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBXU0RMIDwveHNsOmNvbW1lbnQ+Ci0gICAgICAgIDx4c2w6Y29tbWVudD4gQXBhY2hlIEF4aXMyIHZlcnNpb246ICNheGlzVmVyc2lvbiMgI3RvZGF5IyA8L3hzbDpjb21tZW50PgotICAgICAgICA8c2VydmljZUdyb3VwPgotICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPgotICAgICAgICA8L3NlcnZpY2VHcm91cD4KLSAgICA8L3hzbDp0ZW1wbGF0ZT4KLQotICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImludGVyZmFjZXMvaW50ZXJmYWNlIj4KLSAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJwYWNrYWdlIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGNsYXNzcGFja2FnZSIvPjwveHNsOnZhcmlhYmxlPgotCi0gICAgICAgIDxzZXJ2aWNlPgotICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0ibmFtZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBzZXJ2aWNlbmFtZSIvPjwveHNsOmF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxtZXNzYWdlUmVjZWl2ZXJzPgotICAgICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJtZXNzYWdlcmVjZWl2ZXIiPgotICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9Ii4iPgotICAgICAgICAgICAgICAgICAgICAgICAgPG1lc3NhZ2VSZWNlaXZlcj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJtZXAiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbWVwVVJJIi8+PC94c2w6YXR0cmlidXRlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImNsYXNzIj5vcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNlcnZlci5KQVhXU01lc3NhZ2VSZWNlaXZlcjwveHNsOmF0dHJpYnV0ZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvbWVzc2FnZVJlY2VpdmVyPgotICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICAgICAgICAgICA8L21lc3NhZ2VSZWNlaXZlcnM+Ci0gICAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9IlNlcnZpY2VDbGFzcyI+Ci0gICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkcGFja2FnZT0nJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBhY2thZ2UiLz4uPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICA8L3BhcmFtZXRlcj4KLSAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJtZXRob2QiPgotCQkJCTxvcGVyYXRpb24+Ci0JCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9Im5hbWUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ibWVwIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG1lcFVSSSIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCQkJPGFjdGlvbk1hcHBpbmc+Ci0JCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHNvYXBhY3Rpb24iLz4KLQkJCQkJPC9hY3Rpb25NYXBwaW5nPgotCQkJCTwvb3BlcmF0aW9uPgotCQkJPC94c2w6Zm9yLWVhY2g+Ci0gICAgICAgIDwvc2VydmljZT4KLSAgICA8L3hzbDp0ZW1wbGF0ZT4KLTwveHNsOnN0eWxlc2hlZXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL3RlbXBsYXRlL2phdmEvTWVzc2FnZVJlY2VpdmVyVGVtcGxhdGUueHNsIGIvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL3RlbXBsYXRlL2phdmEvTWVzc2FnZVJlY2VpdmVyVGVtcGxhdGUueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDg5NGNjLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC90ZW1wbGF0ZS9qYXZhL01lc3NhZ2VSZWNlaXZlclRlbXBsYXRlLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDY1MiArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIj4KLSAgICA8eHNsOm91dHB1dCBtZXRob2Q9InRleHQiLz4KLQotICAgIDwhLS0gaW5jbHVkZSB0aGUgZGF0YWJpbmQgc3VwcG9ydGVycyAgLS0+Ci0gICAgPHhzbDppbmNsdWRlIGhyZWY9ImRhdGFiaW5kc3VwcG9ydGVyIi8+Ci0gICAgPCEtLSBpbXBvcnQgdGhlIG90aGVyIHRlbXBsYXRlcyBmb3IgZGF0YWJpbmRpbmcKLSAgICAgICAgICAgTm90ZSAgLSAgdGhlc2UgbmFtZXMgd291bGQgYmUgaGFuZGxlZCBieSBhIHNwZWNpYWwKLSAgICAgICAgICAgVVJJIHJlc29sdmVyIGR1cmluZyB0aGUgeHNsdCB0cmFuc2Zvcm1hdGlvbnMKLSAgICAgICAtLT4KLSAgICA8eHNsOmluY2x1ZGUgaHJlZj0iZXh0ZXJuYWxUZW1wbGF0ZSIvPgotCi0KLSAgICA8IS0tVGVtcGxhdGUgZm9yIGluIG91dCBtZXNzYWdlIHJlY2VpdmVyIC0tPgotICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii9pbnRlcmZhY2VbQGJhc2VyZWNlaXZlcj0nb3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuQWJzdHJhY3RJbk91dE1lc3NhZ2VSZWNlaXZlciddIj4KLQotICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InNrZWxldG9ubmFtZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBza2VsZXRvbkludGVyZmFjZU5hbWUiLz48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJpc2JhY2tjb21wYXRpYmxlIiBzZWxlY3Q9IkBpc2JhY2tjb21wYXRpYmxlIi8+Ci0vKioKLSAqIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPi5qYXZhCi0gKgotICogVGhpcyBmaWxlIHdhcyBhdXRvLWdlbmVyYXRlZCBmcm9tIFdTREwKLSAqIGJ5IHRoZSBBcGFjaGUgQXhpczIgdmVyc2lvbjogI2F4aXNWZXJzaW9uIyAjdG9kYXkjCi0gKi8KLSAgICAgICAgcGFja2FnZSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHBhY2thZ2UiLz47Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPiBtZXNzYWdlIHJlY2VpdmVyCi0gICAgICAgICovCi0KLSAgICAgICAgcHVibGljIGNsYXNzIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPiBleHRlbmRzIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAYmFzZXJlY2VpdmVyIi8+ewotCi0KLSAgICAgICAgcHVibGljIHZvaWQgaW52b2tlQnVzaW5lc3NMb2dpYyhvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCwgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0IG5ld01zZ0NvbnRleHQpCi0gICAgICAgIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdHsKLQotICAgICAgICB0cnkgewotCi0gICAgICAgIC8vIGdldCB0aGUgaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIHRoZSBXZWIgU2VydmljZQotICAgICAgICBPYmplY3Qgb2JqID0gZ2V0VGhlSW1wbGVtZW50YXRpb25PYmplY3QobXNnQ29udGV4dCk7Ci0KLSAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRza2VsZXRvbm5hbWUiLz4gc2tlbCA9ICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHNrZWxldG9ubmFtZSIvPilvYmo7Ci0gICAgICAgIC8vT3V0IEVudmVsb3AKLSAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZSBlbnZlbG9wZSA9IG51bGw7Ci0gICAgICAgIC8vRmluZCB0aGUgYXhpc09wZXJhdGlvbiB0aGF0IGhhcyBiZWVuIHNldCBieSB0aGUgRGlzcGF0Y2ggcGhhc2UuCi0gICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbiBvcCA9IG1zZ0NvbnRleHQuZ2V0T3BlcmF0aW9uQ29udGV4dCgpLmdldEF4aXNPcGVyYXRpb24oKTsKLSAgICAgICAgaWYgKG9wID09IG51bGwpIHsKLSAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0KCJPcGVyYXRpb24gaXMgbm90IGxvY2F0ZWQsIGlmIHRoaXMgaXMgZG9jbGl0IHN0eWxlIHRoZSBTT0FQLUFDVElPTiBzaG91bGQgc3BlY2lmaWVkIHZpYSB0aGUgU09BUCBBY3Rpb24gdG8gdXNlIHRoZSBSYXdYTUxQcm92aWRlciIpOwotICAgICAgICB9Ci0KLSAgICAgICAgamF2YS5sYW5nLlN0cmluZyBtZXRob2ROYW1lOwotICAgICAgICBpZigob3AuZ2V0TmFtZSgpICE9IG51bGwpICZhbXA7JmFtcDsgKChtZXRob2ROYW1lID0gb3JnLmFwYWNoZS5heGlzMi51dGlsLkphdmFVdGlscy54bWxOYW1lVG9KYXZhPHhzbDppZiB0ZXN0PSJAaXNMb3dlckNhc2VNZXRob2ROYW1lIj5JZGVudGlmaWVyPC94c2w6aWY+KG9wLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKSkpICE9IG51bGwpKXsKLQotICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0ibWV0aG9kIj4KLSAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0icG9zaXRpb24oKSA+IDEiPn0gZWxzZSA8L3hzbDppZj4KLQotICAgICAgICAgICAgaWYoIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPiIuZXF1YWxzKG1ldGhvZE5hbWUpKXsKLSAgICAgICAgICAgICAgICA8IS0tIElmIHVzZWRibWV0aG9kIGF0dHJpYnV0ZSBwcmVzZW50LCBnaXZlcyBuYW1lIG9mIG1ldGhvZCB0byBjYWxsIGZvciBpbXBsZW1lbnRhdGlvbiAtLT4KLSAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InVzZWRibWV0aG9kIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHVzZWRibWV0aG9kIi8+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJzdHJpbmctbGVuZ3RoKG5vcm1hbGl6ZS1zcGFjZSgkdXNlZGJtZXRob2QpKT0wIj4KLQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJuYW1lc3BhY2UiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZXNwYWNlIi8+PC94c2w6dmFyaWFibGU+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ibmFtZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InN0eWxlIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHN0eWxlIi8+PC94c2w6dmFyaWFibGU+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icmV0dXJudHlwZSIgc2VsZWN0PSJvdXRwdXQvcGFyYW1bQGxvY2F0aW9uPSdib2R5J10vQHR5cGUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icmV0dXJudmFyaWFibGUiIHNlbGVjdD0ib3V0cHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keSddL0BuYW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InJldHVybmNvbXBsZXh0eXBlIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0ib3V0cHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keSddL0Bjb21wbGV4dHlwZSIvPjwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJyZXR1cm5wYXJhbWNvdW50Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iY291bnQob3V0cHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keSddL3BhcmFtKSIvPjwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJyZXR1cm5zaG9ydHR5cGUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJvdXRwdXQvcGFyYW1bQGxvY2F0aW9uPSdib2R5J10vQHNob3J0dHlwZSIvPjwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJyZXR1cm5wYXJ0bmFtZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im91dHB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknXS9wYXJhbS9AcGFydG5hbWUiLz48L3hzbDp2YXJpYWJsZT4KLQotCQkJCQkJPHhzbDpjaG9vc2U+Ci0JICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRyZXR1cm50eXBlID0gJ2J5dGUnIG9yICRyZXR1cm50eXBlID0gJ3Nob3J0JyBvciAkcmV0dXJudHlwZSA9ICdpbnQnIG9yICRyZXR1cm50eXBlID0gJ2xvbmcnIG9yICRyZXR1cm50eXBlID0gJ2Zsb2F0JyBvciAkcmV0dXJudHlwZSA9ICdkb3VibGUnIj4KLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZXR1cm50eXBlIi8+Ci0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dGV4dD4gPC94c2w6dGV4dD4KLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZXR1cm52YXJpYWJsZSIvPiA9IDA7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4JCi0JICAgICAgICAgICAgICAgICAgICAgICAgCi0JICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRyZXR1cm50eXBlID0gJ2Jvb2xlYW4nIj4KLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZXR1cm50eXBlIi8+Ci0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dGV4dD4gPC94c2w6dGV4dD4KLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZXR1cm52YXJpYWJsZSIvPiA9IGZhbHNlOwotCSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+CSAgICAgICAgICAgICAgICAgICAgICAgIAkJCQkJCi0KLQkgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJHJldHVybnR5cGUgPSAnY2hhciciPgotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJldHVybnR5cGUiLz4KLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp0ZXh0PiA8L3hzbDp0ZXh0PgotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJldHVybnZhcmlhYmxlIi8+ID0gJ1x1MDAwMCc7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4JCi0JICAgICAgICAgICAgICAgICAgICAgICAgCQkJCQkJCi0JICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9InN0cmluZy1sZW5ndGgobm9ybWFsaXplLXNwYWNlKCRyZXR1cm50eXBlKSkgJmd0OyAwIj4KLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZXR1cm50eXBlIi8+Ci0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dGV4dD4gPC94c2w6dGV4dD4KLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZXR1cm52YXJpYWJsZSIvPiA9IG51bGw7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLQkJCQkJCQotCQkJCQkJPC94c2w6Y2hvb3NlPgotCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFdlIHJlYWxseSBkb24ndCBuZWVkIHRvIG1ha2UgYSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlc2UtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJHN0eWxlPSdkb2N1bWVudCcgb3IgJHN0eWxlPSdycGMnIj4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImlucHV0Y291bnQiIHNlbGVjdD0iY291bnQoaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdib2R5JyBhbmQgQHR5cGUhPScnXSkiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJpbnB1dHR5cGUiIHNlbGVjdD0iaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdib2R5JyBhbmQgQHR5cGUhPScnXS9AdHlwZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImlucHV0Q29tcGxleFR5cGUiIHNlbGVjdD0iaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdib2R5JyBhbmQgQHR5cGUhPScnXS9AY29tcGxleHR5cGUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJvcGVyYXRpb25OYW1lIiBzZWxlY3Q9ImlucHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keScgYW5kIEB0eXBlIT0nJ10vQG9wbmFtZSIvPgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRpc2JhY2tjb21wYXRpYmxlID0gJ3RydWUnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRpbnB1dGNvdW50PTEiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGlucHV0dHlwZSIvPiB3cmFwcGVkUGFyYW0gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbnB1dHR5cGUiLz4pZnJvbU9NKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2dDb250ZXh0LmdldEVudmVsb3BlKCkuZ2V0Qm9keSgpLmdldEZpcnN0RWxlbWVudCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGlucHV0dHlwZSIvPi5jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RW52ZWxvcGVOYW1lc3BhY2VzKG1zZ0NvbnRleHQuZ2V0RW52ZWxvcGUoKSkpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0ic3RyaW5nLWxlbmd0aChub3JtYWxpemUtc3BhY2UoJHJldHVybnR5cGUpKSA+IDAiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmV0dXJudmFyaWFibGUiLz4gPTwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIoc3RyaW5nLWxlbmd0aChub3JtYWxpemUtc3BhY2UoJGlucHV0Q29tcGxleFR5cGUpKSA+IDApIGFuZCAoc3RyaW5nLWxlbmd0aChub3JtYWxpemUtc3BhY2UoJHJldHVybmNvbXBsZXh0eXBlKSkgPiAwKSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkb3BlcmF0aW9uTmFtZSIvPihza2VsLjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG9wZXJhdGlvbk5hbWUiLz4od3JhcHBlZFBhcmFtKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIoc3RyaW5nLWxlbmd0aChub3JtYWxpemUtc3BhY2UoJGlucHV0Q29tcGxleFR5cGUpKSA+IDApICBhbmQgKHN0cmluZy1sZW5ndGgobm9ybWFsaXplLXNwYWNlKCRyZXR1cm5jb21wbGV4dHlwZSkpICZsdDsgMSkiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNrZWwuPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkb3BlcmF0aW9uTmFtZSIvPih3cmFwcGVkUGFyYW0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iKHN0cmluZy1sZW5ndGgobm9ybWFsaXplLXNwYWNlKCRpbnB1dENvbXBsZXhUeXBlKSkgJmx0OyAxKSAgYW5kIChzdHJpbmctbGVuZ3RoKG5vcm1hbGl6ZS1zcGFjZSgkcmV0dXJuY29tcGxleHR5cGUpKSA+IDApIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvcGVyYXRpb25OYW1lIi8+KHNrZWwuPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+KHdyYXBwZWRQYXJhbSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2VsLjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPih3cmFwcGVkUGFyYW0pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0ic3RyaW5nLWxlbmd0aChub3JtYWxpemUtc3BhY2UoJHJldHVybnR5cGUpKSAmZ3Q7IDAiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmV0dXJudmFyaWFibGUiLz4gPTwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJzdHJpbmctbGVuZ3RoKG5vcm1hbGl6ZS1zcGFjZSgkcmV0dXJuY29tcGxleHR5cGUpKSA+IDAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyYXA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG9wZXJhdGlvbk5hbWUiLz4oc2tlbC48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4oKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tlbC48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRpbnB1dGNvdW50PTEiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW5wdXR0eXBlIi8+IHdyYXBwZWRQYXJhbSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW5wdXR0eXBlIi8+KWZyb21PTSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZ0NvbnRleHQuZ2V0RW52ZWxvcGUoKS5nZXRCb2R5KCkuZ2V0Rmlyc3RFbGVtZW50KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGlucHV0dHlwZSIvPi5jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEVudmVsb3BlTmFtZXNwYWNlcyhtc2dDb250ZXh0LmdldEVudmVsb3BlKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRXZlbiB3aGVuIHRoZSBwYXJhbWV0ZXJzIGFyZSAxIHdlIGhhdmUgdG8gc2VlIHdoZXRoZXIgd2UgaGF2ZSB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVkIHBhcmFtZXRlcnMgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaXNVbndyYXBQYXJhbWV0ZXJzIiBzZWxlY3Q9ImlucHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keScgYW5kIEB0eXBlIT0nJ10vQHVud3JhcHBQYXJhbWV0ZXJzIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0ic3RyaW5nLWxlbmd0aChub3JtYWxpemUtc3BhY2UoJHJldHVybnR5cGUpKSAmZ3Q7IDAiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmV0dXJudmFyaWFibGUiLz4gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBzZXQgdGhlIHJlc3BvbnNlIHdyYXBwZXJzIGlmIHVud3JhcHBpbmcgb24gLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJHJldHVybnBhcmFtY291bnQ9MSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyYXA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJldHVybnNob3J0dHlwZSIvPjx4c2w6dmFsdWUtb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdD0iJHJldHVybnBhcnRuYW1lIi8+KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9InN0cmluZy1sZW5ndGgobm9ybWFsaXplLXNwYWNlKCRyZXR1cm5jb21wbGV4dHlwZSkpICZndDsgMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyYXA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG9wZXJhdGlvbk5hbWUiLz4oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iKCRyZXR1cm5wYXJhbWNvdW50PTApIGFuZCAoJGlzVW53cmFwUGFyYW1ldGVycykiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvcGVyYXRpb25OYW1lIi8+KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIoJGlzVW53cmFwUGFyYW1ldGVycykiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGdlbmVyYXRlIHRoZSByZWZlcmVuY2VzLiB0aGUgZ2V0dGVycyBuZWVkIHRvIGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZWQgYnkgdGhlIGRhdGFiaW5kaW5nLS0+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSB3cmFwIGl0IGlmIGl0IGluIHVud2FycGluZyBtb2RlIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNrZWwuPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImlucHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keScgYW5kIEB0eXBlIT0nJ10vcGFyYW0iPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0icG9zaXRpb24oKSAmZ3Q7IDEiPiw8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHBhcnRuYW1lIi8+KHdyYXBwZWRQYXJhbSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tlbC48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4od3JhcHBlZFBhcmFtKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0ic3RyaW5nLWxlbmd0aChub3JtYWxpemUtc3BhY2UoJHJldHVybnR5cGUpKSAmZ3Q7IDAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IigkcmV0dXJucGFyYW1jb3VudD0xKSBvciAoc3RyaW5nLWxlbmd0aChub3JtYWxpemUtc3BhY2UoJHJldHVybmNvbXBsZXh0eXBlKSkgJmd0OyAwKSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJzdHJpbmctbGVuZ3RoKG5vcm1hbGl6ZS1zcGFjZSgkcmV0dXJudHlwZSkpICZndDsgMCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZXR1cm52YXJpYWJsZSIvPiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkcmV0dXJucGFyYW1jb3VudD0xIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmV0dXJuc2hvcnR0eXBlIi8+PHhzbDp2YWx1ZS1vZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0PSIkcmV0dXJucGFydG5hbWUiLz4oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0ic3RyaW5nLWxlbmd0aChub3JtYWxpemUtc3BhY2UoJHJldHVybmNvbXBsZXh0eXBlKSkgJmd0OyAwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkb3BlcmF0aW9uTmFtZSIvPigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNrZWwuPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+KCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0ic3RyaW5nLWxlbmd0aChub3JtYWxpemUtc3BhY2UoJHJldHVybnR5cGUpKSAmZ3Q7IDAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IigkcmV0dXJucGFyYW1jb3VudD0xKSBvciAoc3RyaW5nLWxlbmd0aChub3JtYWxpemUtc3BhY2UoJHJldHVybmNvbXBsZXh0eXBlKSkgJmd0OyAwKSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0ic3RyaW5nLWxlbmd0aChub3JtYWxpemUtc3BhY2UoJHJldHVybnR5cGUpKSAmZ3Q7IDAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudmVsb3BlID0gdG9FbnZlbG9wZShnZXRTT0FQRmFjdG9yeShtc2dDb250ZXh0KSwgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZXR1cm52YXJpYWJsZSIvPiwgZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudmVsb3BlID0gZ2V0U09BUEZhY3RvcnkobXNnQ29udGV4dCkuZ2V0RGVmYXVsdEVudmVsb3BlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vVW5rbm93biBzdHlsZSEhIE5vIGNvZGUgaXMgZ2VuZXJhdGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlVua25vd24gU3R5bGUiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbnZlbG9wZSA9IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdXNlZGJtZXRob2QiLz4obXNnQ29udGV4dC5nZXRFbnZlbG9wZSgpLmdldEJvZHkoKS5nZXRGaXJzdEVsZW1lbnQoKSwgc2tlbCwgZ2V0U09BUEZhY3RvcnkobXNnQ29udGV4dCkpOwotICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0KLSAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0KLSAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgICAgIDx4c2w6aWYgdGVzdD0ibWV0aG9kIj4KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbigibWV0aG9kIG5vdCBmb3VuZCIpOwotICAgICAgICAgICAgfQotICAgICAgICA8L3hzbDppZj4KLQotICAgICAgICBuZXdNc2dDb250ZXh0LnNldEVudmVsb3BlKGVudmVsb3BlKTsKLSAgICAgICAgfQotICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iZmF1bHQtbGlzdC9mYXVsdCI+Ci0gICAgICAgICAgICA8eHNsOmlmIHRlc3Q9InBvc2l0aW9uKCk9MSI+fTwveHNsOmlmPiBjYXRjaCAoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+IGUpIHsKLQotICAgICAgICAgICAgbXNnQ29udGV4dC5zZXRQcm9wZXJ0eShvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50cy5GQVVMVF9OQU1FLCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxvY2FsbmFtZSIvPiIpOwotICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQgZiA9IGNyZWF0ZUF4aXNGYXVsdChlKTsKLSAgICAgICAgICAgIGlmIChlLmdldEZhdWx0TWVzc2FnZSgpICE9IG51bGwpewotICAgICAgICAgICAgICAgIGYuc2V0RGV0YWlsKHRvT00oZS5nZXRGYXVsdE1lc3NhZ2UoKSxmYWxzZSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhyb3cgZjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgICAgIDwhLS0gcHV0IHRoZSBleHRyYSBicmFja2V0LS0+Ci0gICAgICAgIDx4c2w6aWYgdGVzdD0iY291bnQoZmF1bHQtbGlzdC9mYXVsdCk9MCI+fTwveHNsOmlmPgotICAgICAgICBjYXRjaCAoamF2YS5sYW5nLkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIHRocm93IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKTsKLSAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIDwhLS0gQ2FsbCB0ZW1wbGF0ZXMgcmVjdXJzaXZlbHktLT4KLSAgICAgICAgLy88eHNsOmFwcGx5LXRlbXBsYXRlcz48eHNsOndpdGgtcGFyYW0gbmFtZT0iY29udGV4dCI+bWVzc2FnZS1yZWNlaXZlcjwveHNsOndpdGgtcGFyYW0+PC94c2w6YXBwbHktdGVtcGxhdGVzPgotCi0gICAgICAgIC8qKgotICAgICAgICAqICBBIHV0aWxpdHkgbWV0aG9kIHRoYXQgY29waWVzIHRoZSBuYW1lcGFjZXMgZnJvbSB0aGUgU09BUEVudmVsb3BlCi0gICAgICAgICovCi0gICAgICAgIHByaXZhdGUgamF2YS51dGlsLk1hcCBnZXRFbnZlbG9wZU5hbWVzcGFjZXMob3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZSBlbnYpewotICAgICAgICBqYXZhLnV0aWwuTWFwIHJldHVybk1hcCA9IG5ldyBqYXZhLnV0aWwuSGFzaE1hcCgpOwotICAgICAgICBqYXZhLnV0aWwuSXRlcmF0b3IgbmFtZXNwYWNlSXRlcmF0b3IgPSBlbnYuZ2V0QWxsRGVjbGFyZWROYW1lc3BhY2VzKCk7Ci0gICAgICAgIHdoaWxlIChuYW1lc3BhY2VJdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5hbWVzcGFjZSBucyA9IChvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTmFtZXNwYWNlKSBuYW1lc3BhY2VJdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgIHJldHVybk1hcC5wdXQobnMuZ2V0UHJlZml4KCksbnMuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXR1cm5NYXA7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0IGNyZWF0ZUF4aXNGYXVsdChqYXZhLmxhbmcuRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQgZjsKLSAgICAgICAgVGhyb3dhYmxlIGNhdXNlID0gZS5nZXRDYXVzZSgpOwotICAgICAgICBpZiAoY2F1c2UgIT0gbnVsbCkgewotICAgICAgICAgICAgZiA9IG5ldyBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdChlLmdldE1lc3NhZ2UoKSwgY2F1c2UpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZiA9IG5ldyBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdChlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZjsKLSAgICB9Ci0KLSAgICAgICAgfS8vZW5kIG9mIGNsYXNzCi0gICAgPC94c2w6dGVtcGxhdGU+Ci0gICAgPCEtLSBlbmQgb2YgdGVtcGxhdGUgZm9yIGluLW91dCBtZXNzYWdlIHJlY2VpdmVyIC0tPgotCi0gICAgPCEtLSBzdGFydCBvZiBpbi1vbmx5IC0tPgotICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii9pbnRlcmZhY2VbQGJhc2VyZWNlaXZlcj0nb3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuQWJzdHJhY3RJbk1lc3NhZ2VSZWNlaXZlciddIj4KLSAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJza2VsZXRvbm5hbWUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAc2tlbGV0b25JbnRlcmZhY2VOYW1lIi8+PC94c2w6dmFyaWFibGU+Ci0KLS8qKgotICogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+LmphdmEKLSAqCi0gKiBUaGlzIGZpbGUgd2FzIGF1dG8tZ2VuZXJhdGVkIGZyb20gV1NETAotICogYnkgdGhlIEFwYWNoZSBBeGlzMiB2ZXJzaW9uOiAjYXhpc1ZlcnNpb24jICN0b2RheSMKLSAqLwotICAgICAgICBwYWNrYWdlIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAcGFja2FnZSIvPjsKLQotICAgICAgICAvKioKLSAgICAgICAgKiAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+IG1lc3NhZ2UgcmVjZWl2ZXIKLSAgICAgICAgKi8KLQotICAgICAgICBwdWJsaWMgY2xhc3MgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+IGV4dGVuZHMgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBiYXNlcmVjZWl2ZXIiLz57Ci0KLSAgICAgICAgcHVibGljIHZvaWQgaW52b2tlQnVzaW5lc3NMb2dpYyhvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQgaW5NZXNzYWdlKSB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHR7Ci0KLSAgICAgICAgdHJ5IHsKLQotICAgICAgICAvLyBnZXQgdGhlIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciB0aGUgV2ViIFNlcnZpY2UKLSAgICAgICAgT2JqZWN0IG9iaiA9IGdldFRoZUltcGxlbWVudGF0aW9uT2JqZWN0KGluTWVzc2FnZSk7Ci0KLSAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRza2VsZXRvbm5hbWUiLz4gc2tlbCA9ICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHNrZWxldG9ubmFtZSIvPilvYmo7Ci0gICAgICAgIC8vT3V0IEVudmVsb3AKLSAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZSBlbnZlbG9wZSA9IG51bGw7Ci0gICAgICAgIC8vRmluZCB0aGUgYXhpc09wZXJhdGlvbiB0aGF0IGhhcyBiZWVuIHNldCBieSB0aGUgRGlzcGF0Y2ggcGhhc2UuCi0gICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbiBvcCA9IGluTWVzc2FnZS5nZXRPcGVyYXRpb25Db250ZXh0KCkuZ2V0QXhpc09wZXJhdGlvbigpOwotICAgICAgICBpZiAob3AgPT0gbnVsbCkgewotICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQoIk9wZXJhdGlvbiBpcyBub3QgbG9jYXRlZCwgaWYgdGhpcyBpcyBkb2NsaXQgc3R5bGUgdGhlIFNPQVAtQUNUSU9OIHNob3VsZCBzcGVjaWZpZWQgdmlhIHRoZSBTT0FQIEFjdGlvbiB0byB1c2UgdGhlIFJhd1hNTFByb3ZpZGVyIik7Ci0gICAgICAgIH0KLQotICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG1ldGhvZE5hbWU7Ci0gICAgICAgIGlmKChvcC5nZXROYW1lKCkgIT0gbnVsbCkgJmFtcDsmYW1wOyAoKG1ldGhvZE5hbWUgPSBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuSmF2YVV0aWxzLnhtbE5hbWVUb0phdmE8eHNsOmlmIHRlc3Q9IkBpc0xvd2VyQ2FzZU1ldGhvZE5hbWUiPklkZW50aWZpZXI8L3hzbDppZj4ob3AuZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpKSkgIT0gbnVsbCkpewotCi0gICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJtZXRob2QiPgotCi0gICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InN0eWxlIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHN0eWxlIi8+PC94c2w6dmFyaWFibGU+Ci0KLSAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0icG9zaXRpb24oKSA+IDEiPn0gZWxzZSA8L3hzbDppZj4KLSAgICAgICAgICAgIGlmKCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4iLmVxdWFscyhtZXRob2ROYW1lKSl7Ci0gICAgICAgICAgICA8IS0tIElmIHVzZWRibWV0aG9kIGF0dHJpYnV0ZSBwcmVzZW50LCBnaXZlcyBuYW1lIG9mIG1ldGhvZCB0byBjYWxsIGZvciBpbXBsZW1lbnRhdGlvbiAtLT4KLSAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0idXNlZGJtZXRob2QiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdXNlZGJtZXRob2QiLz48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJzdHJpbmctbGVuZ3RoKG5vcm1hbGl6ZS1zcGFjZSgkdXNlZGJtZXRob2QpKT0wIj4KLQotICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gc3R5bGUgZG9lcyBub3QgbWF0dGVyIHNpbmNlIHdlIGNyZWF0ZSB0aGUgbWVzc2FnZSBmb3JtYXRzIGNvcnJlY3RseSAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkc3R5bGU9J3JwYycgb3IgJHN0eWxlPSdkb2N1bWVudCciPgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJwYXJhbUNvdW50IiBzZWxlY3Q9ImNvdW50KGlucHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keScgYW5kIEB0eXBlIT0nJ10pIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJpc1Vud3JhcFBhcmFtZXRlcnMiIHNlbGVjdD0iaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdib2R5JyBhbmQgQHR5cGUhPScnXS9AdW53cmFwcFBhcmFtZXRlcnMiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRwYXJhbUNvdW50ID0xIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJpbnB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknIGFuZCBAdHlwZSE9JyddL0B0eXBlIi8+IHdyYXBwZWRQYXJhbSA9ICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdib2R5JyBhbmQgQHR5cGUhPScnXS9AdHlwZSIvPilmcm9tT00oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluTWVzc2FnZS5nZXRFbnZlbG9wZSgpLmdldEJvZHkoKS5nZXRGaXJzdEVsZW1lbnQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImlucHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keScgYW5kIEB0eXBlIT0nJ10vQHR5cGUiLz4uY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEVudmVsb3BlTmFtZXNwYWNlcyhpbk1lc3NhZ2UuZ2V0RW52ZWxvcGUoKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIoJGlzVW53cmFwUGFyYW1ldGVycykiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gZ2VuZXJhdGUgdGhlIHJlZmVyZW5jZXMuIHRoZSBnZXR0ZXJzIG5lZWQgdG8gYmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVkIGJ5IHRoZSBkYXRhYmluZGluZy0tPgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSB3cmFwIGl0IGlmIGl0IGluIHVud2FycGluZyBtb2RlIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tlbC48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJpbnB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknIGFuZCBAdHlwZSE9JyddL3BhcmFtIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0icG9zaXRpb24oKSAmZ3Q7IDEiPiw8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAcGFydG5hbWUiLz4od3JhcHBlZFBhcmFtKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2VsLjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPih3cmFwcGVkUGFyYW0pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tlbC48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vVW5rbm93biBzdHlsZSEhIE5vIGNvZGUgaXMgZ2VuZXJhdGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEubGFuZy5VbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiVW5rbm93biBTdHlsZSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0KLSAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotCi0gICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdXNlZGJtZXRob2QiLz4oaW5NZXNzYWdlLmdldEVudmVsb3BlKCkuZ2V0Qm9keSgpLmdldEZpcnN0RWxlbWVudCgpLCBza2VsLCBudWxsKTsKLSAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0KLSAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgICAgICAgICA8eHNsOmlmIHRlc3Q9Im1ldGhvZCI+Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbigibWV0aG9kIG5vdCBmb3VuZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIDwveHNsOmlmPgotCi0gICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoamF2YS5sYW5nLkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIHRocm93IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKTsKLSAgICAgICAgfQotICAgICAgICB9Ci0KLQotICAgICAgICA8IS0tIENhbGwgdGVtcGxhdGVzIHJlY3Vyc2l2ZWx5LS0+Ci0gICAgICAgIC8vPHhzbDphcHBseS10ZW1wbGF0ZXM+PHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNvbnRleHQiPm1lc3NhZ2UtcmVjZWl2ZXI8L3hzbDp3aXRoLXBhcmFtPjwveHNsOmFwcGx5LXRlbXBsYXRlcz4KLQotCi0KLSAgICAgICAgLyoqCi0gICAgICAgICogIEEgdXRpbGl0eSBtZXRob2QgdGhhdCBjb3BpZXMgdGhlIG5hbWVwYWNlcyBmcm9tIHRoZSBTT0FQRW52ZWxvcGUKLSAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSBqYXZhLnV0aWwuTWFwIGdldEVudmVsb3BlTmFtZXNwYWNlcyhvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlIGVudil7Ci0gICAgICAgIGphdmEudXRpbC5NYXAgcmV0dXJuTWFwID0gbmV3IGphdmEudXRpbC5IYXNoTWFwKCk7Ci0gICAgICAgIGphdmEudXRpbC5JdGVyYXRvciBuYW1lc3BhY2VJdGVyYXRvciA9IGVudi5nZXRBbGxEZWNsYXJlZE5hbWVzcGFjZXMoKTsKLSAgICAgICAgd2hpbGUgKG5hbWVzcGFjZUl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTmFtZXNwYWNlIG5zID0gKG9yZy5hcGFjaGUuYXhpb20ub20uT01OYW1lc3BhY2UpIG5hbWVzcGFjZUl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgcmV0dXJuTWFwLnB1dChucy5nZXRQcmVmaXgoKSxucy5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldHVybk1hcDsKLSAgICAgICAgfQotCi0KLQotICAgICAgICB9Ly9lbmQgb2YgY2xhc3MKLQotICAgIDwveHNsOnRlbXBsYXRlPgotCi0gICAgPCEtLVRlbXBsYXRlIGZvciByb2J1c3QgaW4gbWVzc2FnZSByZWNlaXZlciAtLT4KLSAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvaW50ZXJmYWNlW0BiYXNlcmVjZWl2ZXI9J29yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLkFic3RyYWN0TWVzc2FnZVJlY2VpdmVyJ10iPgotCi0gICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ic2tlbGV0b25uYW1lIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHNrZWxldG9uSW50ZXJmYWNlTmFtZSIvPjwveHNsOnZhcmlhYmxlPgotICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImlzYmFja2NvbXBhdGlibGUiIHNlbGVjdD0iQGlzYmFja2NvbXBhdGlibGUiLz4KLQotLyoqCi0gKiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4uamF2YQotICoKLSAqIFRoaXMgZmlsZSB3YXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBXU0RMCi0gKiBieSB0aGUgQXBhY2hlIEF4aXMyIHZlcnNpb246ICNheGlzVmVyc2lvbiMgI3RvZGF5IwotICovCi0gICAgICAgIHBhY2thZ2UgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBwYWNrYWdlIi8+OwotCi0gICAgICAgIC8qKgotICAgICAgICAqICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4gbWVzc2FnZSByZWNlaXZlcgotICAgICAgICAqLwotCi0gICAgICAgIHB1YmxpYyBjbGFzcyA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4gZXh0ZW5kcyA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGJhc2VyZWNlaXZlciIvPnsKLQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGludm9rZUJ1c2luZXNzTG9naWMob3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpCi0gICAgICAgIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdHsKLQotICAgICAgICB0cnkgewotCi0gICAgICAgIC8vIGdldCB0aGUgaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIHRoZSBXZWIgU2VydmljZQotICAgICAgICBPYmplY3Qgb2JqID0gZ2V0VGhlSW1wbGVtZW50YXRpb25PYmplY3QobXNnQ29udGV4dCk7Ci0KLSAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRza2VsZXRvbm5hbWUiLz4gc2tlbCA9ICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHNrZWxldG9ubmFtZSIvPilvYmo7Ci0gICAgICAgIC8vT3V0IEVudmVsb3AKLSAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZSBlbnZlbG9wZSA9IG51bGw7Ci0gICAgICAgIC8vRmluZCB0aGUgYXhpc09wZXJhdGlvbiB0aGF0IGhhcyBiZWVuIHNldCBieSB0aGUgRGlzcGF0Y2ggcGhhc2UuCi0gICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbiBvcCA9IG1zZ0NvbnRleHQuZ2V0T3BlcmF0aW9uQ29udGV4dCgpLmdldEF4aXNPcGVyYXRpb24oKTsKLSAgICAgICAgaWYgKG9wID09IG51bGwpIHsKLSAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0KCJPcGVyYXRpb24gaXMgbm90IGxvY2F0ZWQsIGlmIHRoaXMgaXMgZG9jbGl0IHN0eWxlIHRoZSBTT0FQLUFDVElPTiBzaG91bGQgc3BlY2lmaWVkIHZpYSB0aGUgU09BUCBBY3Rpb24gdG8gdXNlIHRoZSBSYXdYTUxQcm92aWRlciIpOwotICAgICAgICB9Ci0KLSAgICAgICAgamF2YS5sYW5nLlN0cmluZyBtZXRob2ROYW1lOwotICAgICAgICBpZigob3AuZ2V0TmFtZSgpICE9IG51bGwpICZhbXA7JmFtcDsgKChtZXRob2ROYW1lID0gb3JnLmFwYWNoZS5heGlzMi51dGlsLkphdmFVdGlscy54bWxOYW1lVG9KYXZhPHhzbDppZiB0ZXN0PSJAaXNMb3dlckNhc2VNZXRob2ROYW1lIj5JZGVudGlmaWVyPC94c2w6aWY+KG9wLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKSkpICE9IG51bGwpKXsKLQotICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0ibWV0aG9kIj4KLSAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0icG9zaXRpb24oKSA+IDEiPn0gZWxzZSA8L3hzbDppZj4KLSAgICAgICAgICAgIGlmKCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4iLmVxdWFscyhtZXRob2ROYW1lKSl7Ci0gICAgICAgICAgICA8IS0tIElmIHVzZWRibWV0aG9kIGF0dHJpYnV0ZSBwcmVzZW50LCBnaXZlcyBuYW1lIG9mIG1ldGhvZCB0byBjYWxsIGZvciBpbXBsZW1lbnRhdGlvbiAtLT4KLSAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0idXNlZGJtZXRob2QiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdXNlZGJtZXRob2QiLz48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJzdHJpbmctbGVuZ3RoKG5vcm1hbGl6ZS1zcGFjZSgkdXNlZGJtZXRob2QpKT0wIj4KLQotICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InN0eWxlIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHN0eWxlIi8+PC94c2w6dmFyaWFibGU+Ci0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFdlIHJlYWxseSBkb24ndCBuZWVkIHRvIG1ha2UgYSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlc2UtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkc3R5bGU9J2RvY3VtZW50JyBvciAkc3R5bGU9J3JwYyciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZG9jIHN0eWxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJpbnB1dGNvdW50IiBzZWxlY3Q9ImNvdW50KGlucHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keScgYW5kIEB0eXBlIT0nJ10pIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJpbnB1dHR5cGUiIHNlbGVjdD0iaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdib2R5JyBhbmQgQHR5cGUhPScnXS9AdHlwZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ib3BlcmF0aW9uTmFtZSIgc2VsZWN0PSJpbnB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknIGFuZCBAdHlwZSE9JyddL0BvcG5hbWUiLz4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGlzYmFja2NvbXBhdGlibGUgPSAndHJ1ZSciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkaW5wdXRjb3VudD0xIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW5wdXR0eXBlIi8+IHdyYXBwZWRQYXJhbSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbnB1dHR5cGUiLz4pZnJvbU9NKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2dDb250ZXh0LmdldEVudmVsb3BlKCkuZ2V0Qm9keSgpLmdldEZpcnN0RWxlbWVudCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGlucHV0dHlwZSIvPi5jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RW52ZWxvcGVOYW1lc3BhY2VzKG1zZ0NvbnRleHQuZ2V0RW52ZWxvcGUoKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEV2ZW4gd2hlbiB0aGUgcGFyYW1ldGVycyBhcmUgMSB3ZSBoYXZlIHRvIHNlZSB3aGV0aGVyIHdlIGhhdmUgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVkIHBhcmFtZXRlcnMgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJpbnB1dENvbXBsZXhUeXBlIiBzZWxlY3Q9ImNvdW50KGlucHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keScgYW5kIEB0eXBlIT0nJ10vcGFyYW0pIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJvcGVyYXRpb25OYW1lIiBzZWxlY3Q9ImlucHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keScgYW5kIEB0eXBlIT0nJ10vQG9wbmFtZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJzdHJpbmctbGVuZ3RoKG5vcm1hbGl6ZS1zcGFjZSgkaW5wdXRDb21wbGV4VHlwZSkpID4gMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2VsLjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvcGVyYXRpb25OYW1lIi8+KHdyYXBwZWRQYXJhbSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2VsLjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPih3cmFwcGVkUGFyYW0pIDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2VsLjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRpbnB1dGNvdW50PTEiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbnB1dHR5cGUiLz4gd3JhcHBlZFBhcmFtID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGlucHV0dHlwZSIvPilmcm9tT00oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZ0NvbnRleHQuZ2V0RW52ZWxvcGUoKS5nZXRCb2R5KCkuZ2V0Rmlyc3RFbGVtZW50KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW5wdXR0eXBlIi8+LmNsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRFbnZlbG9wZU5hbWVzcGFjZXMobXNnQ29udGV4dC5nZXRFbnZlbG9wZSgpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRXZlbiB3aGVuIHRoZSBwYXJhbWV0ZXJzIGFyZSAxIHdlIGhhdmUgdG8gc2VlIHdoZXRoZXIgd2UgaGF2ZSB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBwZWQgcGFyYW1ldGVycyAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImlzVW53cmFwUGFyYW1ldGVycyIgc2VsZWN0PSJpbnB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknIGFuZCBAdHlwZSE9JyddL0B1bndyYXBwUGFyYW1ldGVycyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkaXNVbndyYXBQYXJhbWV0ZXJzIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tlbC48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImlucHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keScgYW5kIEB0eXBlIT0nJ10vcGFyYW0iPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9InBvc2l0aW9uKCkgJmd0OyAxIj4sPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAcGFydG5hbWUiLz4od3JhcHBlZFBhcmFtKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2VsLjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPih3cmFwcGVkUGFyYW0pIDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2VsLjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZlbG9wZSA9IGdldFNPQVBGYWN0b3J5KG1zZ0NvbnRleHQpLmdldERlZmF1bHRFbnZlbG9wZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9Vbmtub3duIHN0eWxlISEgTm8gY29kZSBpcyBnZW5lcmF0ZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5sYW5nLlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJVbmtub3duIFN0eWxlIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotCi0gICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgIGVudmVsb3BlID0gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR1c2VkYm1ldGhvZCIvPihtc2dDb250ZXh0LmdldEVudmVsb3BlKCkuZ2V0Qm9keSgpLmdldEZpcnN0RWxlbWVudCgpLCBza2VsLCBnZXRTT0FQRmFjdG9yeShtc2dDb250ZXh0KSk7Ci0gICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotCi0gICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgIDwveHNsOmZvci1lYWNoPgotICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0ibWV0aG9kIj4KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uKCJtZXRob2Qgbm90IGZvdW5kIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgPC94c2w6aWY+Ci0KLSAgICAgICAgfQotICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iZmF1bHQtbGlzdC9mYXVsdCI+Ci0gICAgICAgICAgICA8eHNsOmlmIHRlc3Q9InBvc2l0aW9uKCk9MSI+fTwveHNsOmlmPiBjYXRjaCAoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+IGUpIHsKLSAgICAgICAgICAgIG1zZ0NvbnRleHQuc2V0UHJvcGVydHkob3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHMuRkFVTFRfTkFNRSwiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsb2NhbG5hbWUiLz4iKTsKLSAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0IGYgPSBjcmVhdGVBeGlzRmF1bHQoZSk7Ci0gICAgICAgICAgICBpZiAoZS5nZXRGYXVsdE1lc3NhZ2UoKSAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICBmLnNldERldGFpbCh0b09NKGUuZ2V0RmF1bHRNZXNzYWdlKCksZmFsc2UpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRocm93IGY7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIDwveHNsOmZvci1lYWNoPgotICAgICAgICA8IS0tIHB1dCB0aGUgZXh0cmEgYnJhY2tldC0tPgotICAgICAgICA8eHNsOmlmIHRlc3Q9ImNvdW50KGZhdWx0LWxpc3QvZmF1bHQpPTAiPn08L3hzbDppZj4KLSAgICAgICAgY2F0Y2ggKGphdmEubGFuZy5FeGNlcHRpb24gZSkgewotICAgICAgICB0aHJvdyBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdC5tYWtlRmF1bHQoZSk7Ci0gICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICA8IS0tIENhbGwgdGVtcGxhdGVzIHJlY3Vyc2l2ZWx5LS0+Ci0gICAgICAgIC8vPHhzbDphcHBseS10ZW1wbGF0ZXM+PHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNvbnRleHQiPm1lc3NhZ2UtcmVjZWl2ZXI8L3hzbDp3aXRoLXBhcmFtPjwveHNsOmFwcGx5LXRlbXBsYXRlcz4KLQotICAgICAgICAvKioKLSAgICAgICAgKiAgQSB1dGlsaXR5IG1ldGhvZCB0aGF0IGNvcGllcyB0aGUgbmFtZXBhY2VzIGZyb20gdGhlIFNPQVBFbnZlbG9wZQotICAgICAgICAqLwotICAgICAgICBwcml2YXRlIGphdmEudXRpbC5NYXAgZ2V0RW52ZWxvcGVOYW1lc3BhY2VzKG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGUgZW52KXsKLSAgICAgICAgamF2YS51dGlsLk1hcCByZXR1cm5NYXAgPSBuZXcgamF2YS51dGlsLkhhc2hNYXAoKTsKLSAgICAgICAgamF2YS51dGlsLkl0ZXJhdG9yIG5hbWVzcGFjZUl0ZXJhdG9yID0gZW52LmdldEFsbERlY2xhcmVkTmFtZXNwYWNlcygpOwotICAgICAgICB3aGlsZSAobmFtZXNwYWNlSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01OYW1lc3BhY2UgbnMgPSAob3JnLmFwYWNoZS5heGlvbS5vbS5PTU5hbWVzcGFjZSkgbmFtZXNwYWNlSXRlcmF0b3IubmV4dCgpOwotICAgICAgICByZXR1cm5NYXAucHV0KG5zLmdldFByZWZpeCgpLG5zLmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0dXJuTWFwOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdCBjcmVhdGVBeGlzRmF1bHQoamF2YS5sYW5nLkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0IGY7Ci0gICAgICAgIFRocm93YWJsZSBjYXVzZSA9IGUuZ2V0Q2F1c2UoKTsKLSAgICAgICAgaWYgKGNhdXNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGYgPSBuZXcgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQoZS5nZXRNZXNzYWdlKCksIGNhdXNlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGYgPSBuZXcgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQoZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGY7Ci0gICAgfQotCi0gICAgICAgIH0vL2VuZCBvZiBjbGFzcwotICAgIDwveHNsOnRlbXBsYXRlPgotICAgIDwhLS0gZW5kIG9mIHRlbXBsYXRlIGZvciByb2J1c3QgaW4gbWVzc2FnZSByZWNlaXZlciAtLT4KLQotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC90ZW1wbGF0ZS9qYXZhL05vbmVEYXRhYmluZGluZ1RlbXBsYXRlLnhzbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC90ZW1wbGF0ZS9qYXZhL05vbmVEYXRhYmluZGluZ1RlbXBsYXRlLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjgwYjkwYy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdGVtcGxhdGUvamF2YS9Ob25lRGF0YWJpbmRpbmdUZW1wbGF0ZS54c2wKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIj4KLSAgICA8eHNsOm91dHB1dCBtZXRob2Q9InRleHQiLz4KLQotCi0gICAgPCEtLSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgIC0tPgotICAgIDwhLS0gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAgIG5vbmUgdGVtcGxhdGUhISEgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgIC0tPgotICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImRhdGFiaW5kZXJzW0BkYnR5cGU9J25vbmUnXSI+Ci0gICAgICAgIHByaXZhdGUgIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IGZyb21PTSgKLSAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgcGFyYW0sCi0gICAgICAgIGphdmEubGFuZy5DbGFzcyB0eXBlLAotICAgICAgICBqYXZhLnV0aWwuTWFwIGV4dHJhTmFtZXNwYWNlcykgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0IHsKLSAgICAgICAgcmV0dXJuIHBhcmFtOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgIHRvT00ob3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgcGFyYW0sIGJvb2xlYW4gb3B0aW1pemVDb250ZW50KSB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQgewotICAgICAgICByZXR1cm4gcGFyYW07Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGUgdG9FbnZlbG9wZShvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhY3RvcnkgZmFjdG9yeSwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgcGFyYW0sIGJvb2xlYW4gb3B0aW1pemVDb250ZW50KQotICAgICAgICB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQgewotICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlIGVudmVsb3BlID0gZmFjdG9yeS5nZXREZWZhdWx0RW52ZWxvcGUoKTsKLSAgICAgICAgZW52ZWxvcGUuZ2V0Qm9keSgpLmFkZENoaWxkKHBhcmFtKTsKLSAgICAgICAgcmV0dXJuIGVudmVsb3BlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogIGdldCB0aGUgZGVmYXVsdCBlbnZlbG9wZQotICAgICAgICAqLwotICAgICAgICBwcml2YXRlIG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGUgdG9FbnZlbG9wZShvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhY3RvcnkgZmFjdG9yeSkKLSAgICAgICAgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0IHsKLSAgICAgICAgcmV0dXJuIGZhY3RvcnkuZ2V0RGVmYXVsdEVudmVsb3BlKCk7Ci0gICAgICAgIH0KLQotICAgIDwveHNsOnRlbXBsYXRlPgotCi08L3hzbDpzdHlsZXNoZWV0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC90ZW1wbGF0ZS9qYXZhL1BvbGljeUV4dGVuc2lvblRlbXBsYXRlLnhzbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC90ZW1wbGF0ZS9qYXZhL1BvbGljeUV4dGVuc2lvblRlbXBsYXRlLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNhZjc1ZC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdGVtcGxhdGUvamF2YS9Qb2xpY3lFeHRlbnNpb25UZW1wbGF0ZS54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIj4KLQotICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Im1vZHVsZS1jb2RlZ2VuLXBvbGljeS1leHRlbnNpb25zIj4KLSAgICAgICAgCi0gICAgICAgIDx4c2w6aWYgdGVzdD0iLy9jcmVhdGVTZXF1ZW5jZSI+Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBTdGFydHMgYSByZWxpYWJlbCBtZXNzYWdlIHNlcXVlbmNlCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBzdGFydFNlcXVlbmNlKCkgewotICAgICAgICAgICAgX2dldFNlcnZpY2VDbGllbnQoKS5nZXRPcHRpb25zKCkuc2V0UHJvcGVydHkoIlNUQVJUX1JNX1NFUVVFTkNFIiwgInRydWUiKTsgICAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgCi0gICAgICAgIDx4c2w6aWYgdGVzdD0iLy9zZXRMYXN0TWVzc2FnZSI+Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBNYXJrcyB0aGUgbGFzdCBtZXNzYWdlIGZvciB0aGUgc2VxdWVuY2UKLSAgICAgICAgICovCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXRMYXN0TWVzc2FnZSgpIHsKLSAgICAgICAgICAgICBfZ2V0U2VydmljZUNsaWVudCgpLmdldE9wdGlvbnMoKS5zZXRQcm9wZXJ0eSgiU2FuZGVzaGEyQ2xpZW50QVBJUHJvcGVydHlXU1JNTGFzdE1lc3NhZ2UiLCAidHJ1ZSIpOwotICAgICAgICAgfQotICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgCi0gICAgICAgIDx4c2w6aWYgdGVzdD0iLy9lbmRTZXF1ZW5jZSI+Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBUZXJtaW5hdGVzIHRoZSByZWxpYWJlbCBtZXNzYWdlIHNlcXVlbmNlCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBlbmRTZXF1ZW5jZSgpIHsKLSAgICAgICAgICAgIF9nZXRTZXJ2aWNlQ2xpZW50KCkuZ2V0T3B0aW9ucygpLnNldFByb3BlcnR5KCJFTkRfUk1fU0VRVUVOQ0UiLCAidHJ1ZSIpOwotICAgICAgICB9Ci0gICAgICAgIDwveHNsOmlmPgotICAgICAgICAKLSAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJvcHRpbWl6ZWQiPgotICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii8vb3B0aW1pemVDb250ZW50Ii8+Ci0gICAgICAgIDwveHNsOnZhcmlhYmxlPgotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDx4c2w6aWYgdGVzdD0iLy9zZWN1cml0eS1jb2RlZ2VuLXBvbGljeS1leHRlbnNpb25zL3VzZXJuYW1ldG9rZW4tYWN0aW9uIj4KLSAgICAvLyBhdXRvIGdlbmVucmF0ZWQgc3R1YiBtZXRob2RzIAotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldFVzZXJuYW1lKGphdmEubGFuZy5TdHJpbmcgdXNlcm5hbWUpIHsKLSAgICAgICAgX3NlcnZpY2VDbGllbnQuZ2V0T3B0aW9ucygpLnNldFByb3BlcnR5KG9yZy5hcGFjaGUud3Muc2VjdXJpdHkuaGFuZGxlci5XU0hhbmRsZXJDb25zdGFudHMuVVNFUiwgdXNlcm5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBhc3N3b3JkKGphdmEubGFuZy5TdHJpbmcgcGFzc3dvcmQpIHsKLSAgICAgICAgX1VUQ2FsbGJhY2sgcHdDYWxsYmFjayA9IG5ldyBfVVRDYWxsYmFjaygpOwotICAgICAgICBwd0NhbGxiYWNrLnNldFBhc3N3b3JkKHBhc3N3b3JkKTsKLSAgICBfc2VydmljZUNsaWVudAotICAgICAgICAgICAgICAgIC5nZXRPcHRpb25zKCkKLSAgICAgICAgICAgICAgICAuc2V0UHJvcGVydHkoCi0gICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLndzLnNlY3VyaXR5LmhhbmRsZXIuV1NIYW5kbGVyQ29uc3RhbnRzLlBBU1NXT1JEX1RZUEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAiUGFzc3dvcmRUZXh0Iik7Ci0gICAgICAgIF9zZXJ2aWNlQ2xpZW50Ci0gICAgICAgICAgICAgICAgLmdldE9wdGlvbnMoKQotICAgICAgICAgICAgICAgIC5zZXRQcm9wZXJ0eSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUud3Muc2VjdXJpdHkuaGFuZGxlci5XU0hhbmRsZXJDb25zdGFudHMuUFdfQ0FMTEJBQ0tfUkVGLAotICAgICAgICAgICAgICAgICAgICAgICAgcHdDYWxsYmFjayk7ICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgX1VUQ2FsbGJhY2sgaW1wbGVtZW50cwotICAgICAgICAgICAgamF2YXguc2VjdXJpdHkuYXV0aC5jYWxsYmFjay5DYWxsYmFja0hhbmRsZXIgewotCi0gICAgICAgIHByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBwYXNzd29yZDsKLQotICAgICAgICBwdWJsaWMgX1VUQ2FsbGJhY2soKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZChqYXZhLmxhbmcuU3RyaW5nIHBhc3N3b3JkKSB7Ci0gICAgICAgICAgICB0aGlzLnBhc3N3b3JkID0gcGFzc3dvcmQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGUoamF2YXguc2VjdXJpdHkuYXV0aC5jYWxsYmFjay5DYWxsYmFja1tdIGNhbGxiYWNrcykKLQotICAgICAgICB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiwKLSAgICAgICAgICAgICAgICBqYXZheC5zZWN1cml0eS5hdXRoLmNhbGxiYWNrLlVuc3VwcG9ydGVkQ2FsbGJhY2tFeGNlcHRpb24gewotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSAmbHQ7IGNhbGxiYWNrcy5sZW5ndGg7IGkrKykgewotCi0gICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrc1tpXSBpbnN0YW5jZW9mIG9yZy5hcGFjaGUud3Muc2VjdXJpdHkuV1NQYXNzd29yZENhbGxiYWNrKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS53cy5zZWN1cml0eS5XU1Bhc3N3b3JkQ2FsbGJhY2sgcGMgPSAob3JnLmFwYWNoZS53cy5zZWN1cml0eS5XU1Bhc3N3b3JkQ2FsbGJhY2spIGNhbGxiYWNrc1tpXTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAocGMuZ2V0SWRlbnRpZmVyKCkuZXF1YWxzKGdldFVzZXJuYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYy5zZXRQYXNzd29yZChwYXNzd29yZCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBjLnNldFBhc3N3b3JkKHBhc3N3b3JkKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgamF2YXguc2VjdXJpdHkuYXV0aC5jYWxsYmFjay5VbnN1cHBvcnRlZENhbGxiYWNrRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrc1tpXSwgIlVucmVjb2duaXplZCBDYWxsYmFjayIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBnZXRVc2VybmFtZSgpIHsKLSAgICAgICAgICAgIHJldHVybiAoU3RyaW5nKSBfc2VydmljZUNsaWVudC5nZXRPcHRpb25zKCkuZ2V0UHJvcGVydHkoCi0gICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUud3Muc2VjdXJpdHkuaGFuZGxlci5XU0hhbmRsZXJDb25zdGFudHMuVVNFUik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgICAgIDwveHNsOmlmPgotICAgICAgICAKLQotICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkb3B0aW1pemVkIj4KLSAgICAgICAgICAgIHByaXZhdGUgdm9pZCBzZXRPcE5hbWVBcnJheSgpewotICAgICAgICAgICAgb3BOYW1lQXJyYXkgPSBuZXcgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZVtdIHsKLSAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJvcHRpbWl6ZUNvbnRlbnQvb3BOYW1lIj4KLSAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9InBvc2l0aW9uKCk+MSI+LAotICAgICAgICAgICAgICAgIDwveHNsOmlmPm5ldyBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lKCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5zLXVybCIvPiIsIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbG9jYWxOYW1lIi8+IikKLSAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPgotICAgICAgICAgICAgfTsKLSAgICAgICAgICAgfQotICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICBwcml2YXRlIHZvaWQgc2V0T3BOYW1lQXJyYXkoKXsKLSAgICAgICAgICAgIG9wTmFtZUFycmF5ID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgPC94c2w6dGVtcGxhdGU+Ci08L3hzbDpzdHlsZXNoZWV0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC90ZW1wbGF0ZS9qYXZhL1NrZWxldG9uSW50ZXJmYWNlVGVtcGxhdGUueHNsIGIvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL3RlbXBsYXRlL2phdmEvU2tlbGV0b25JbnRlcmZhY2VUZW1wbGF0ZS54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxNDMwM2MuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL3RlbXBsYXRlL2phdmEvU2tlbGV0b25JbnRlcmZhY2VUZW1wbGF0ZS54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iPg0KLSAgICA8eHNsOm91dHB1dCBtZXRob2Q9InRleHQiLz4NCi0gICAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iL2ludGVyZmFjZSI+DQotLyoqDQotICogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+LmphdmENCi0gKg0KLSAqIFRoaXMgZmlsZSB3YXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBXU0RMDQotICogYnkgdGhlIEFwYWNoZSBBeGlzMiB2ZXJzaW9uOiAjYXhpc1ZlcnNpb24jICN0b2RheSMNCi0gKi8NCi0gICAgcGFja2FnZSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHBhY2thZ2UiLz47DQotICAgIC8qKg0KLSAgICAgKiAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+IGphdmEgc2tlbGV0b24gaW50ZXJmYWNlIGZvciB0aGUgYXhpc1NlcnZpY2UNCi0gICAgICovDQotICAgIHB1YmxpYyBpbnRlcmZhY2UgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIj48L3hzbDp2YWx1ZS1vZj4gew0KLSAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJpc2JhY2tjb21wYXRpYmxlIiBzZWxlY3Q9IkBpc2JhY2tjb21wYXRpYmxlIi8+DQotICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0ibWV0aG9kIj4NCi0gICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImNvdW50Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iY291bnQob3V0cHV0L3BhcmFtKSIvPjwveHNsOnZhcmlhYmxlPg0KLSAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ib3V0cHV0dHlwZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im91dHB1dC9wYXJhbS9AdHlwZSIvPjwveHNsOnZhcmlhYmxlPg0KLSAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ib3V0cHV0Y29tcGxleHR5cGUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJvdXRwdXQvcGFyYW0vQGNvbXBsZXh0eXBlIi8+PC94c2w6dmFyaWFibGU+DQotICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJvdXRwdXRwYXJhbWNvdW50Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iY291bnQob3V0cHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keSddL3BhcmFtKSIvPjwveHNsOnZhcmlhYmxlPg0KLSAgICAgICAgIDwhLS0gcmVnYXJkbGVzcyBvZiB0aGUgc3luYyBvciBhc3luYyBzdGF0dXMsIHRoZSBnZW5lcmF0ZWQgbWV0aG9kIHNpZ25hdHVyZSB3b3VsZCBiZSBqdXN0IGEgdXN1YWwNCi0gICAgICAgICAgICAgICBqYXZhIG1ldGhvZCAtLT4NCi0gICAgICAgIC8qKg0KLSAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgbWV0aG9kIHNpZ25hdHVyZQ0KLSAgICAgICAgICogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBjb21tZW50Ii8+DQotICAgICAgICAgDQotICAgICAgICAgPHhzbDpjaG9vc2U+DQotICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRpc2JhY2tjb21wYXRpYmxlID0gJ3RydWUnIj4NCi0gICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJpbnB1dGNvdW50IiBzZWxlY3Q9ImNvdW50KGlucHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keScgYW5kIEB0eXBlIT0nJ10pIi8+DQotICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRpbnB1dGNvdW50PTEiPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gc2hvdWxkIHByb3ZpZGUgdGhlIGludGVyIGNvbXBsZXggdHlwZSB0byBtZXRob2Qgc2lnbmF0dXJlIGlmIGlzIGF2YWlsYWJsZSAtLT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImlucHV0Q29tcGxleFR5cGUiIHNlbGVjdD0iaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdib2R5JyBhbmQgQHR5cGUhPScnXS9AY29tcGxleHR5cGUiLz4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9InN0cmluZy1sZW5ndGgobm9ybWFsaXplLXNwYWNlKCRpbnB1dENvbXBsZXhUeXBlKSkgPiAwIj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW08eHNsOnRleHQ+IDwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImlucHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keScgYW5kIEB0eXBlIT0nJ10vQG5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtPHhzbDp0ZXh0PiA8L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJpbnB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknIGFuZCBAdHlwZSE9JyddL0BuYW1lIi8+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+DQotICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPg0KLSAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+DQotICAgICAgICAgICAgPC94c2w6d2hlbj4NCi0gICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4NCi0gICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImlucHV0Y291bnQiIHNlbGVjdD0iY291bnQoaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdib2R5JyBhbmQgQHR5cGUhPScnXSkiLz4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkaW5wdXRjb3VudD0xIj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBFdmVuIHdoZW4gdGhlIHBhcmFtZXRlcnMgYXJlIDEgd2UgaGF2ZSB0byBzZWUgd2hldGhlciB3ZSBoYXZlIHRoZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlZCBwYXJhbWV0ZXJzIC0tPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImlzVW53cmFwUGFyYW1ldGVycyIgc2VsZWN0PSJpbnB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknIGFuZCBAdHlwZSE9JyddL0B1bndyYXBwUGFyYW1ldGVycyIvPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkaXNVbndyYXBQYXJhbWV0ZXJzIj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJpbnB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknIGFuZCBAdHlwZSE9JyddL3BhcmFtIj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW08eHNsOnRleHQ+IDwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW08eHNsOnRleHQ+IDwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImlucHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keScgYW5kIEB0eXBlIT0nJ10vQG5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+DQotICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+DQotICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPg0KLSAgICAgICAgPC94c2w6Y2hvb3NlPg0KLSAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJmYXVsdC9wYXJhbVtAdHlwZSE9JyddIj4NCi0gICAgICAgICAgICAgKiBAdGhyb3dzIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPiA6IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAY29tbWVudCIvPg0KLSAgICAgICAgIDwveHNsOmZvci1lYWNoPg0KLSAgICAgICAgICovDQotDQotICAgICAgICA8eHNsOmNob29zZT4NCi0gICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGlzYmFja2NvbXBhdGlibGUgPSAndHJ1ZSciPg0KLSAgICAgICAgICAgICAgICBwdWJsaWMgPHhzbDpjaG9vc2U+PHhzbDp3aGVuIHRlc3Q9IiRjb3VudD0wIG9yICRvdXRwdXR0eXBlPScnIj52b2lkPC94c2w6d2hlbj4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJzdHJpbmctbGVuZ3RoKG5vcm1hbGl6ZS1zcGFjZSgkb3V0cHV0Y29tcGxleHR5cGUpKSA+IDAiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkb3V0cHV0Y29tcGxleHR5cGUiLz48L3hzbDp3aGVuPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRvdXRwdXR0eXBlIT0nJyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvdXRwdXR0eXBlIi8+PC94c2w6d2hlbj4NCi0gICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPjx4c2w6dGV4dD4gPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4NCi0gICAgICAgICAgICAgICAgKA0KLSAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaW5wdXRjb3VudCIgc2VsZWN0PSJjb3VudChpbnB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknIGFuZCBAdHlwZSE9JyddKSIvPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGlucHV0Y291bnQ9MSI+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIHNob3VsZCBwcm92aWRlIHRoZSBpbnRlciBjb21wbGV4IHR5cGUgdG8gbWV0aG9kIHNpZ25hdHVyZSBpZiBpcyBhdmFpbGFibGUgLS0+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImlucHV0Q29tcGxleFR5cGUiIHNlbGVjdD0iaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdib2R5JyBhbmQgQHR5cGUhPScnXS9AY29tcGxleHR5cGUiLz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJzdHJpbmctbGVuZ3RoKG5vcm1hbGl6ZS1zcGFjZSgkaW5wdXRDb21wbGV4VHlwZSkpID4gMCI+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbnB1dENvbXBsZXhUeXBlIi8+PHhzbDp0ZXh0PiA8L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJpbnB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknIGFuZCBAdHlwZSE9JyddL0BuYW1lIi8+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImlucHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keScgYW5kIEB0eXBlIT0nJ10vQHR5cGUiLz48eHNsOnRleHQ+IDwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImlucHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keScgYW5kIEB0eXBlIT0nJ10vQG5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPjwhLS0gSnVzdCBsZWF2ZSBpdCAtIG5vdGhpbmcgd2UgY2FuIGRvIGhlcmUgLS0+PC94c2w6b3RoZXJ3aXNlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4NCi0gICAgICAgICAgICAgICAgICkNCi0gICAgICAgICAgICA8L3hzbDp3aGVuPg0KLSAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPg0KLSAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImlzVW53cmFwUGFyYW1ldGVycyIgc2VsZWN0PSJpbnB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknIGFuZCBAdHlwZSE9JyddL0B1bndyYXBwUGFyYW1ldGVycyIvPg0KLSAgICAgICAgICAgICAgICBwdWJsaWMgPHhzbDpjaG9vc2U+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGNvdW50PTAgb3IgJG91dHB1dHR5cGU9JyciPnZvaWQ8L3hzbDp3aGVuPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRvdXRwdXRwYXJhbWNvdW50PTEiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJvdXRwdXQvcGFyYW1bQGxvY2F0aW9uPSdib2R5J10vcGFyYW0vQHR5cGUiLz48L3hzbDp3aGVuPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9InN0cmluZy1sZW5ndGgobm9ybWFsaXplLXNwYWNlKCRvdXRwdXRjb21wbGV4dHlwZSkpID4gMCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvdXRwdXRjb21wbGV4dHlwZSIvPjwveHNsOndoZW4+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iKCRvdXRwdXRwYXJhbWNvdW50PTApIGFuZCAoJGlzVW53cmFwUGFyYW1ldGVycykiPnZvaWQ8L3hzbDp3aGVuPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvdXRwdXR0eXBlIi8+PC94c2w6b3RoZXJ3aXNlPjwveHNsOmNob29zZT4NCi0gICAgICAgICAgICAgICAgPHhzbDp0ZXh0PiA8L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPg0KLSAgICAgICAgICAgICAgICAoDQotICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJpbnB1dGNvdW50IiBzZWxlY3Q9ImNvdW50KGlucHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keScgYW5kIEB0eXBlIT0nJ10pIi8+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGlucHV0Y291bnQ9MSI+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRXZlbiB3aGVuIHRoZSBwYXJhbWV0ZXJzIGFyZSAxIHdlIGhhdmUgdG8gc2VlIHdoZXRoZXIgd2UgaGF2ZSB0aGUNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBwZWQgcGFyYW1ldGVycyAtLT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJpc1Vud3JhcFBhcmFtZXRlcnMiIHNlbGVjdD0iaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdib2R5JyBhbmQgQHR5cGUhPScnXS9AdW53cmFwcFBhcmFtZXRlcnMiLz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGlzVW53cmFwUGFyYW1ldGVycyI+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdib2R5JyBhbmQgQHR5cGUhPScnXS9wYXJhbSI+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0icG9zaXRpb24oKT4xIj4sPC94c2w6aWY+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+PHhzbDp0ZXh0PiA8L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJpbnB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknIGFuZCBAdHlwZSE9JyddL0B0eXBlIi8+PHhzbDp0ZXh0PiA8L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJpbnB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknIGFuZCBAdHlwZSE9JyddL0BuYW1lIi8+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPjwhLS0gSnVzdCBsZWF2ZSBpdCAtIG5vdGhpbmcgd2UgY2FuIGRvIGhlcmUgLS0+PC94c2w6b3RoZXJ3aXNlPg0KLSAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPg0KLSAgICAgICAgICAgICAgICAgKQ0KLSAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4NCi0gICAgICAgIDwveHNsOmNob29zZT4NCi0gICAgICAgICA8IS0tYWRkIHRoZSBmYXVsdHMtLT4NCi0gICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJmYXVsdC9wYXJhbVtAdHlwZSE9JyddIj4NCi0gICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9InBvc2l0aW9uKCk9MSI+dGhyb3dzIDwveHNsOmlmPg0KLSAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0icG9zaXRpb24oKT4xIj4sPC94c2w6aWY+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+DQotICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD47DQotICAgICAgICA8L3hzbDpmb3ItZWFjaD4NCi0gICAgICAgICB9DQotICAgIDwveHNsOnRlbXBsYXRlPg0KLSA8L3hzbDpzdHlsZXNoZWV0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC90ZW1wbGF0ZS9qYXZhL1NrZWxldG9uVGVtcGxhdGUueHNsIGIvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL3RlbXBsYXRlL2phdmEvU2tlbGV0b25UZW1wbGF0ZS54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkYTc0ZWQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL3RlbXBsYXRlL2phdmEvU2tlbGV0b25UZW1wbGF0ZS54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwxNjAgKzAsMCBAQAotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iPg0KLSAgICA8eHNsOm91dHB1dCBtZXRob2Q9InRleHQiLz4NCi0gICAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iL2ludGVyZmFjZSI+DQotLyoqDQotICogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+LmphdmENCi0gKg0KLSAqIFRoaXMgZmlsZSB3YXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBXU0RMDQotICogYnkgdGhlIEFwYWNoZSBBeGlzMiB2ZXJzaW9uOiAjYXhpc1ZlcnNpb24jICN0b2RheSMNCi0gKi8NCi0gICAgcGFja2FnZSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHBhY2thZ2UiLz47DQotICAgIC8qKg0KLSAgICAgKiAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+IGphdmEgc2tlbGV0b24gZm9yIHRoZSBheGlzU2VydmljZQ0KLSAgICAgKi8NCi0gICAgcHVibGljIGNsYXNzIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSI+PC94c2w6dmFsdWUtb2Y+DQotICAgICAgICA8eHNsOmlmIHRlc3Q9IkBza2VsZXRvbkludGVyZmFjZU5hbWUiPiBpbXBsZW1lbnRzIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAc2tlbGV0b25JbnRlcmZhY2VOYW1lIi8+PC94c2w6aWY+ew0KLSAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJpc2JhY2tjb21wYXRpYmxlIiBzZWxlY3Q9IkBpc2JhY2tjb21wYXRpYmxlIi8+DQotICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0ibWV0aG9kIj4NCi0gICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImNvdW50Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iY291bnQob3V0cHV0L3BhcmFtKSIvPjwveHNsOnZhcmlhYmxlPg0KLSAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ib3V0cHV0dHlwZSIgc2VsZWN0PSJvdXRwdXQvcGFyYW0vQHR5cGUiLz4NCi0gICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im91dHB1dGNvbXBsZXh0eXBlIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0ib3V0cHV0L3BhcmFtL0Bjb21wbGV4dHlwZSIvPjwveHNsOnZhcmlhYmxlPg0KLSAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ib3V0cHV0cGFyYW1jb3VudCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImNvdW50KG91dHB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknXS9wYXJhbSkiLz48L3hzbDp2YXJpYWJsZT4NCi0gICAgICAgICA8IS0tIHJlZ2FyZGxlc3Mgb2YgdGhlIHN5bmMgb3IgYXN5bmMgc3RhdHVzLCB0aGUgZ2VuZXJhdGVkIG1ldGhvZCBzaWduYXR1cmUgd291bGQgYmUganVzdCBhIHVzdWFsDQotICAgICAgICAgICAgICAgamF2YSBtZXRob2QgLS0+DQotICAgICAgICAvKioNCi0gICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIG1ldGhvZCBzaWduYXR1cmUNCi0gICAgICAgICAqIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAY29tbWVudCIvPg0KLSAgICAgICAgIDwhLS0gIHNlbGVjdCBvbmx5IHRoZSBib2R5IHBhcmFtZXRlcnMgIC0tPg0KLSAgICAgICAgIDx4c2w6Y2hvb3NlPg0KLSAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkaXNiYWNrY29tcGF0aWJsZSA9ICd0cnVlJyI+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImlucHV0Y291bnQiIHNlbGVjdD0iY291bnQoaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdib2R5JyBhbmQgQHR5cGUhPScnXSkiLz4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkaW5wdXRjb3VudD0xIj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBFdmVuIHdoZW4gdGhlIHBhcmFtZXRlcnMgYXJlIDEgd2UgaGF2ZSB0byBzZWUgd2hldGhlciB3ZSBoYXZlIHRoZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBwZWQgcGFyYW1ldGVycyAtLT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJpbnB1dENvbXBsZXhUeXBlIiBzZWxlY3Q9ImlucHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keScgYW5kIEB0eXBlIT0nJ10vQGNvbXBsZXh0eXBlIi8+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9InN0cmluZy1sZW5ndGgobm9ybWFsaXplLXNwYWNlKCRpbnB1dENvbXBsZXhUeXBlKSkgPiAwIj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtPHhzbDp0ZXh0PiA8L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJpbnB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknIGFuZCBAdHlwZSE9JyddL0BuYW1lIi8+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW08eHNsOnRleHQ+IDwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImlucHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keScgYW5kIEB0eXBlIT0nJ10vQG5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+DQotICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+DQotICAgICAgICAgICAgICA8L3hzbDp3aGVuPg0KLSAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPg0KLSAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaW5wdXRjb3VudCIgc2VsZWN0PSJjb3VudChpbnB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknIGFuZCBAdHlwZSE9JyddKSIvPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRpbnB1dGNvdW50PTEiPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEV2ZW4gd2hlbiB0aGUgcGFyYW1ldGVycyBhcmUgMSB3ZSBoYXZlIHRvIHNlZSB3aGV0aGVyIHdlIGhhdmUgdGhlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlZCBwYXJhbWV0ZXJzIC0tPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImlzVW53cmFwUGFyYW1ldGVycyIgc2VsZWN0PSJpbnB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknIGFuZCBAdHlwZSE9JyddL0B1bndyYXBwUGFyYW1ldGVycyIvPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkaXNVbndyYXBQYXJhbWV0ZXJzIj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJpbnB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknIGFuZCBAdHlwZSE9JyddL3BhcmFtIj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW08eHNsOnRleHQ+IDwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtPHhzbDp0ZXh0PiA8L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJpbnB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknIGFuZCBAdHlwZSE9JyddL0BuYW1lIi8+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPg0KLSAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPg0KLSAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4NCi0gICAgICAgIDwveHNsOmNob29zZT4NCi0gICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iZmF1bHQvcGFyYW1bQHR5cGUhPScnXSI+DQotICAgICAgICAgICAgICogQHRocm93cyA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4gOiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGNvbW1lbnQiLz4NCi0gICAgICAgICA8L3hzbDpmb3ItZWFjaD4NCi0gICAgICAgICAqLw0KLSAgICAgICAgPHhzbDpjaG9vc2U+DQotICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRpc2JhY2tjb21wYXRpYmxlID0gJ3RydWUnIj4NCi0gICAgICAgICAgICAgICAgICBwdWJsaWMgIDx4c2w6Y2hvb3NlPjx4c2w6d2hlbiB0ZXN0PSIkY291bnQ9MCBvciAkb3V0cHV0dHlwZT0nJyI+dm9pZDwveHNsOndoZW4+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0ic3RyaW5nLWxlbmd0aChub3JtYWxpemUtc3BhY2UoJG91dHB1dGNvbXBsZXh0eXBlKSkgPiAwIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG91dHB1dGNvbXBsZXh0eXBlIi8+PC94c2w6d2hlbj4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkb3V0cHV0dHlwZSE9JyciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkb3V0cHV0dHlwZSIvPjwveHNsOndoZW4+DQotICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+PHhzbDp0ZXh0PiA8L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgICgNCi0gICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImlucHV0Y291bnQiIHNlbGVjdD0iY291bnQoaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdib2R5JyBhbmQgQHR5cGUhPScnXSkiLz4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRpbnB1dGNvdW50PTEiPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBFdmVuIHdoZW4gdGhlIHBhcmFtZXRlcnMgYXJlIDEgd2UgaGF2ZSB0byBzZWUgd2hldGhlciB3ZSBoYXZlIHRoZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVkIHBhcmFtZXRlcnMgLS0+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImlucHV0Q29tcGxleFR5cGUiIHNlbGVjdD0iaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdib2R5JyBhbmQgQHR5cGUhPScnXS9AY29tcGxleHR5cGUiLz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJzdHJpbmctbGVuZ3RoKG5vcm1hbGl6ZS1zcGFjZSgkaW5wdXRDb21wbGV4VHlwZSkpID4gMCI+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbnB1dENvbXBsZXhUeXBlIi8+PHhzbDp0ZXh0PiA8L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJpbnB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknIGFuZCBAdHlwZSE9JyddL0BuYW1lIi8+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImlucHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keScgYW5kIEB0eXBlIT0nJ10vQHR5cGUiLz48eHNsOnRleHQ+IDwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImlucHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keScgYW5kIEB0eXBlIT0nJ10vQG5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPjwhLS0gSnVzdCBsZWF2ZSBpdCAtIG5vdGhpbmcgd2UgY2FuIGRvIGhlcmUgLS0+PC94c2w6b3RoZXJ3aXNlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4NCi0gICAgICAgICAgICAgICAgICApDQotICAgICAgICAgICAgPC94c2w6d2hlbj4NCi0gICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4NCi0gICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaXNVbndyYXBQYXJhbWV0ZXJzIiBzZWxlY3Q9ImlucHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keScgYW5kIEB0eXBlIT0nJ10vQHVud3JhcHBQYXJhbWV0ZXJzIi8+DQotICAgICAgICAgICAgICAgICBwdWJsaWMgPHhzbDpjaG9vc2U+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGNvdW50PTAgb3IgJG91dHB1dHR5cGU9JyciPnZvaWQ8L3hzbDp3aGVuPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRvdXRwdXRwYXJhbWNvdW50PTEiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJvdXRwdXQvcGFyYW1bQGxvY2F0aW9uPSdib2R5J10vcGFyYW0vQHR5cGUiLz48L3hzbDp3aGVuPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9InN0cmluZy1sZW5ndGgobm9ybWFsaXplLXNwYWNlKCRvdXRwdXRjb21wbGV4dHlwZSkpID4gMCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvdXRwdXRjb21wbGV4dHlwZSIvPjwveHNsOndoZW4+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iKCRvdXRwdXRwYXJhbWNvdW50PTApIGFuZCAoJGlzVW53cmFwUGFyYW1ldGVycykiPnZvaWQ8L3hzbDp3aGVuPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvdXRwdXR0eXBlIi8+PC94c2w6b3RoZXJ3aXNlPjwveHNsOmNob29zZT4NCi0gICAgICAgICAgICAgICAgPHhzbDp0ZXh0PiA8L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgICgNCi0gICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImlucHV0Y291bnQiIHNlbGVjdD0iY291bnQoaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdib2R5JyBhbmQgQHR5cGUhPScnXSkiLz4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRpbnB1dGNvdW50PTEiPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBFdmVuIHdoZW4gdGhlIHBhcmFtZXRlcnMgYXJlIDEgd2UgaGF2ZSB0byBzZWUgd2hldGhlciB3ZSBoYXZlIHRoZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVkIHBhcmFtZXRlcnMgLS0+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImlzVW53cmFwUGFyYW1ldGVycyIgc2VsZWN0PSJpbnB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknIGFuZCBAdHlwZSE9JyddL0B1bndyYXBwUGFyYW1ldGVycyIvPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRpc1Vud3JhcFBhcmFtZXRlcnMiPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJpbnB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknIGFuZCBAdHlwZSE9JyddL3BhcmFtIj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0icG9zaXRpb24oKT4xIj4sPC94c2w6aWY+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+PHhzbDp0ZXh0PiA8L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdib2R5JyBhbmQgQHR5cGUhPScnXS9AdHlwZSIvPjx4c2w6dGV4dD4gPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdib2R5JyBhbmQgQHR5cGUhPScnXS9AbmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+PCEtLSBKdXN0IGxlYXZlIGl0IC0gbm90aGluZyB3ZSBjYW4gZG8gaGVyZSAtLT48L3hzbDpvdGhlcndpc2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPg0KLSAgICAgICAgICAgICAgICAgICkNCi0gICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+DQotICAgICAgICA8L3hzbDpjaG9vc2U+DQotICAgICAgICAgPCEtLWFkZCB0aGUgZmF1bHRzLS0+DQotICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iZmF1bHQvcGFyYW1bQHR5cGUhPScnXSI+DQotICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJwb3NpdGlvbigpPTEiPnRocm93cyA8L3hzbDppZj4NCi0gICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9InBvc2l0aW9uKCk+MSI+LDwveHNsOmlmPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPg0KLSAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+ew0KLSAgICAgICAgICAgICAgICAvL1RPRE8gOiBmaWxsIHRoaXMgd2l0aCB0aGUgbmVjZXNzYXJ5IGJ1c2luZXNzIGxvZ2ljDQotICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0ic3RyaW5nLWxlbmd0aChub3JtYWxpemUtc3BhY2UoJG91dHB1dHR5cGUpKSAmZ3Q7IDAiPnRocm93IG5ldyAgamF2YS5sYW5nLlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJQbGVhc2UgaW1wbGVtZW50ICIgKyB0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiM8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4iKTs8L3hzbDppZj4NCi0gICAgICAgIH0NCi0gICAgIDwveHNsOmZvci1lYWNoPg0KLSAgICB9DQotICAgIDwveHNsOnRlbXBsYXRlPg0KLSA8L3hzbDpzdHlsZXNoZWV0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC90ZW1wbGF0ZS9qYXZhL1Rlc3RDbGFzc1RlbXBsYXRlLnhzbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC90ZW1wbGF0ZS9qYXZhL1Rlc3RDbGFzc1RlbXBsYXRlLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTJkY2U5OS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdGVtcGxhdGUvamF2YS9UZXN0Q2xhc3NUZW1wbGF0ZS54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwyNzQgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIiB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSI+Ci0gICAgPHhzbDpvdXRwdXQgbWV0aG9kPSJ0ZXh0Ii8+Ci0gICAgPCEtLSBJbmNsZHVlIHRoZSB0ZXN0IG9iamVjdCBjcmVhdGlvbiB0ZW1wbGF0ZSAgLS0+Ci0gICAgPHhzbDppbmNsdWRlIGhyZWY9InRlc3RPYmplY3QiLz4KLQotICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii9jbGFzcyI+Ci0gICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJpbnRlcmZhY2VOYW1lIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGludGVyZmFjZU5hbWUiLz48L3hzbDp2YXJpYWJsZT4KLSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InBhY2thZ2UiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAcGFja2FnZSIvPjwveHNsOnZhcmlhYmxlPgotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iY2FsbGJhY2tuYW1lIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGNhbGxiYWNrbmFtZSIvPjwveHNsOnZhcmlhYmxlPgotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ic3R1Ym5hbWUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAc3R1Ym5hbWUiLz48L3hzbDp2YXJpYWJsZT4KLSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImlzU3luYyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBpc1N5bmMiLz48L3hzbDp2YXJpYWJsZT4KLSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImlzQXN5bmMiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAaXNBc3luYyIvPjwveHNsOnZhcmlhYmxlPgotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaXNiYWNrY29tcGF0aWJsZSIgc2VsZWN0PSJAaXNiYWNrY29tcGF0aWJsZSIvPgotCi0vKioKLSAqIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPi5qYXZhCi0gKgotICogVGhpcyBmaWxlIHdhcyBhdXRvLWdlbmVyYXRlZCBmcm9tIFdTREwKLSAqIGJ5IHRoZSBBcGFjaGUgQXhpczIgdmVyc2lvbjogI2F4aXNWZXJzaW9uIyAjdG9kYXkjCi0gKi8KLSAgICBwYWNrYWdlIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcGFja2FnZSIvPjsKLQotICAgIC8qCi0gICAgICogIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPiBKdW5pdCB0ZXN0IGNhc2UKLSAgICAqLwotCi0gICAgcHVibGljIGNsYXNzIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPiBleHRlbmRzIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZXsKLQotICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0ibWV0aG9kIj4KLSAgICAgICAgIDx4c2w6aWYgdGVzdD0iQG1lcD0nMTInIj4KLQotICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ib3V0cHV0dHlwZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im91dHB1dC9wYXJhbS9AdHlwZSI+PC94c2w6dmFsdWUtb2Y+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJvdXRQYXJhbVR5cGUiIHNlbGVjdD0ib3V0cHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keSddL0B0eXBlIj48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im91dFBhcmFtQ29tcGxleFR5cGUiIHNlbGVjdD0ib3V0cHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keSddL0Bjb21wbGV4dHlwZSI+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJvdXRQYXJhbUNvdW50IiBzZWxlY3Q9ImNvdW50KG91dHB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknXS9wYXJhbSkiPjwveHNsOnZhcmlhYmxlPgotCi0gICAgICAgIDx4c2w6aWYgdGVzdD0iJGlzU3luYz0nMSciPgotICAgICAgICAvKioKLSAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgdGVzdCBtZXRob2QKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyAgdm9pZCB0ZXN0PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+KCkgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb257Ci0KLSAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwYWNrYWdlIi8+Ljx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc3R1Ym5hbWUiLz4gc3R1YiA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBhY2thZ2UiLz4uPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzdHVibmFtZSIvPigpOy8vdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gc2hvdWxkIHBvaW50IHRvIHRoZSByaWdodCBlbmRwb2ludAotCi0gICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJjb3VudChpbnB1dC9wYXJhbSk+MCI+Ci0gICAgICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImlucHV0L3BhcmFtW0B0eXBlIT0nJ10iPgotICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz48eHNsOnRleHQ+IDwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PHhzbDp0ZXh0Pj0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6dGV4dD4oPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+KWdldFRlc3RPYmplY3QoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+LmNsYXNzKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyA6IEZpbGwgaW4gdGhlIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPiBoZXJlCi0gICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkb3V0cHV0dHlwZT0nJyI+Ci0gICAgICAgICAgICAgICAgICAgIDwhLS0gZm9yIG5vdyB0aGluayB0aGVyZSBpcyBvbmx5IG9uZSBpbnB1dCBlbGVtZW50IC0tPgotICAgICAgICAgICAgICAgICAgICAvL1RoZXJlIGlzIG5vIG91dHB1dCB0byBiZSB0ZXN0ZWQhCi0gICAgICAgICAgICAgICAgICAgIHN0dWIuPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+KAotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImlucHV0L3BhcmFtW0B0eXBlIT0nJ10iPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im9wbmFtZSIgc2VsZWN0PSJAb3BuYW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icGFyYW1uYW1lIiBzZWxlY3Q9IkBuYW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iY29tcGxleFR5cGUiIHNlbGVjdD0iQGNvbXBsZXh0eXBlIi8+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJwYXJhbWNvdW50IiBzZWxlY3Q9ImNvdW50KHBhcmFtW0B0eXBlIT0nJyBhbmQgQG9wbmFtZT0kb3BuYW1lXSkiLz4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIoJGlzYmFja2NvbXBhdGlibGU9J3RydWUnKSBhbmQgc3RyaW5nLWxlbmd0aChub3JtYWxpemUtc3BhY2UoJGNvbXBsZXhUeXBlKSkgPiAwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iQHR5cGUhPScnIj48eHNsOmlmIHRlc3Q9InBvc2l0aW9uKCk+MSI+LDwveHNsOmlmPmdldDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAb3BuYW1lIi8+KDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPik8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iKCRwYXJhbWNvdW50ID4gMCkgYW5kIG5vdCgkaXNiYWNrY29tcGF0aWJsZT0ndHJ1ZScpIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9InBhcmFtW0B0eXBlIT0nJyBhbmQgQG9wbmFtZT0kb3BuYW1lXSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0icG9zaXRpb24oKT4xIj4sPC94c2w6aWY+Z2V0PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBwYXJ0bmFtZSIvPig8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBhcmFtbmFtZSIvPikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJAdHlwZSE9JyciPjx4c2w6aWYgdGVzdD0icG9zaXRpb24oKT4xIj4sPC94c2w6aWY+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPik7Ci0gICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChzdHViLjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPigKLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJpbnB1dC9wYXJhbVtAdHlwZSE9JyddIj4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im9wbmFtZSIgc2VsZWN0PSJAb3BuYW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icGFyYW1uYW1lIiBzZWxlY3Q9IkBuYW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iY29tcGxleFR5cGUiIHNlbGVjdD0iQGNvbXBsZXh0eXBlIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icGFyYW1jb3VudCIgc2VsZWN0PSJjb3VudChwYXJhbVtAdHlwZSE9JycgYW5kIEBvcG5hbWU9JG9wbmFtZV0pIi8+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iKCRpc2JhY2tjb21wYXRpYmxlPSd0cnVlJykgYW5kIHN0cmluZy1sZW5ndGgobm9ybWFsaXplLXNwYWNlKCRjb21wbGV4VHlwZSkpID4gMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IkB0eXBlIT0nJyI+PHhzbDppZiB0ZXN0PSJwb3NpdGlvbigpPjEiPiw8L3hzbDppZj5nZXQ8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG9wbmFtZSIvPig8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4pPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IigkcGFyYW1jb3VudCA+IDApIGFuZCBub3QoJGlzYmFja2NvbXBhdGlibGU9J3RydWUnKSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJwYXJhbVtAdHlwZSE9JycgYW5kIEBvcG5hbWU9JG9wbmFtZV0iPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9InBvc2l0aW9uKCk+MSI+LDwveHNsOmlmPmdldDx4c2w6dmFsdWUtb2YgIHNlbGVjdD0iQHBhcnRuYW1lIi8+KDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcGFyYW1uYW1lIi8+KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IkB0eXBlIT0nJyI+PHhzbDppZiB0ZXN0PSJwb3NpdGlvbigpPjEiPiw8L3hzbDppZj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGlmIHRoZSBpbnB1dC9wYXJhbSBlbGVtZW50IGNvbnRhaW4gYW55IGF0dHJpYnV0ZXMgdGhlbiB3ZSBoYXZlIHRvIHVud3JhcCB0aGVtLS0+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPikpOwotICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRvdXRwdXR0eXBlPScnIj4KLSAgICAgICAgICAgICAgICAgICAgLy9UaGVyZSBpcyBubyBvdXRwdXQgdG8gYmUgdGVzdGVkIQotICAgICAgICAgICAgICAgICAgICBzdHViLjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPigpOwotICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChzdHViLjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPigpKTsKLSAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0KLQotCi0gICAgICAgIH0KLSAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgIDx4c2w6aWYgdGVzdD0iJGlzQXN5bmM9JzEnIj4KLSAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0idGVtcENhbGxiYWNrTmFtZSI+dGVtcENhbGxiYWNrPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImdlbmVyYXRlLWlkKCkiLz48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgIC8qKgotICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCB0ZXN0IG1ldGhvZAotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljICB2b2lkIHRlc3RTdGFydDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPigpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uewotICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwYWNrYWdlIi8+Ljx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc3R1Ym5hbWUiLz4gc3R1YiA9IG5ldyA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBhY2thZ2UiLz4uPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzdHVibmFtZSIvPigpOwotICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJjb3VudChpbnB1dC9wYXJhbSk+MCI+Ci0gICAgICAgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iaW5wdXQvcGFyYW1bQHR5cGUhPScnXSI+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPjx4c2w6dGV4dD4gPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48eHNsOnRleHQ+PQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp0ZXh0Pig8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz4pZ2V0VGVzdE9iamVjdCg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz4uY2xhc3MpOwotICAgICAgICAgICAgICAgICAgICAvLyBUT0RPIDogRmlsbCBpbiB0aGUgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+IGhlcmUKLSAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLQotICAgICAgICAgICAgICAgIHN0dWIuc3RhcnQ8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4oCi0gICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImlucHV0L3BhcmFtW0B0eXBlIT0nJ10iPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im9wbmFtZSIgc2VsZWN0PSJAb3BuYW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icGFyYW1uYW1lIiBzZWxlY3Q9IkBuYW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icGFyYW1jb3VudCIgc2VsZWN0PSJjb3VudChwYXJhbVtAdHlwZSE9JycgYW5kIEBvcG5hbWU9JG9wbmFtZV0pIi8+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJHBhcmFtY291bnQgPiAwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9InBhcmFtW0B0eXBlIT0nJyBhbmQgQG9wbmFtZT0kb3BuYW1lXSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJwb3NpdGlvbigpPjEiPiw8L3hzbDppZj5nZXQ8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHBhcnRuYW1lIi8+KDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcGFyYW1uYW1lIi8+KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IkB0eXBlIT0nJyI+PHhzbDppZiB0ZXN0PSJwb3NpdGlvbigpPjEiPiw8L3hzbDppZj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9ImNvdW50KGlucHV0L3BhcmFtW0B0eXBlIT0nJ10pID4gMCI+LDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICBuZXcgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0ZW1wQ2FsbGJhY2tOYW1lIi8+KCkKLSAgICAgICAgICAgICAgICApOwotICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICBzdHViLnN0YXJ0PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+KAotICAgICAgICAgICAgICAgICAgICBuZXcgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0ZW1wQ2FsbGJhY2tOYW1lIi8+KCkKLSAgICAgICAgICAgICAgICApOwotICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgIDwveHNsOmNob29zZT4KLQotCi0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGNsYXNzIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdGVtcENhbGxiYWNrTmFtZSIvPiAgZXh0ZW5kcyA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBhY2thZ2UiLz4uPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjYWxsYmFja25hbWUiLz57Ci0gICAgICAgICAgICBwdWJsaWMgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0ZW1wQ2FsbGJhY2tOYW1lIi8+KCl7IHN1cGVyKG51bGwpO30KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgcmVjZWl2ZVJlc3VsdDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPigKLSAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG91dFBhcmFtQ291bnQ9MSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ib3V0cHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keSddL3BhcmFtL0B0eXBlIi8+PHhzbDp0ZXh0PiA8L3hzbDp0ZXh0PnJlc3VsdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9InN0cmluZy1sZW5ndGgobm9ybWFsaXplLXNwYWNlKCRvdXRQYXJhbUNvbXBsZXhUeXBlKSkgPiAwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvdXRQYXJhbUNvbXBsZXhUeXBlIi8+PHhzbDp0ZXh0PiA8L3hzbDp0ZXh0PnJlc3VsdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9InN0cmluZy1sZW5ndGgobm9ybWFsaXplLXNwYWNlKCRvdXRQYXJhbVR5cGUpKSA+IDAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG91dFBhcmFtVHlwZSIvPjx4c2w6dGV4dD4gPC94c2w6dGV4dD5yZXN1bHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPikgewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCByZWNlaXZlRXJyb3I8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4oamF2YS5sYW5nLkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgIDwveHNsOmlmPgotICAgICAgPCEtLSBlbmQgb2YgaW4tb3V0IG1lcCAtLT4KLSAgICAgIDwveHNsOmlmPgotICAgICAgPCEtLSBzdGFydCBvZiBpbi1vbmx5IG1lcC0tPgotICAgICAgPHhzbDppZiB0ZXN0PSJAbWVwPScxMCcgb3IgQG1lcD0nMTEnIj4KLSAgICAgICAgICAvKioKLSAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIHRlc3QgbWV0aG9kCi0gICAgICAgICAgKi8KLSAgICAgICAgICBwdWJsaWMgIHZvaWQgdGVzdDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPigpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uewotCi0gICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwYWNrYWdlIi8+Ljx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc3R1Ym5hbWUiLz4gc3R1YiA9Ci0gICAgICAgICAgbmV3IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcGFja2FnZSIvPi48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHN0dWJuYW1lIi8+KCk7Ly90aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBzaG91bGQgcG9pbnQgdG8gdGhlIHJpZ2h0IGVuZHBvaW50Ci0gICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJjb3VudChpbnB1dC9wYXJhbSk+MCI+Ci0gICAgICAgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iaW5wdXQvcGFyYW1bQHR5cGUhPScnXSI+Ci0gICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+PHhzbDp0ZXh0PiA8L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjx4c2w6dGV4dD49Ci0gICAgICAgICAgICAgICAgICA8L3hzbDp0ZXh0Pig8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz4pZ2V0VGVzdE9iamVjdCg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz4uY2xhc3MpOwotICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE8gOiBGaWxsIGluIHRoZSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4gaGVyZQotICAgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0KLSAgICAgICAgICAgICAgICAgIC8vVGhlcmUgaXMgbm8gb3V0cHV0IHRvIGJlIHRlc3RlZCEKLSAgICAgICAgICAgICAgICAgIHN0dWIuPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+KAotICAgICAgICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImlucHV0L3BhcmFtW0B0eXBlIT0nJ10iPgotICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ib3BuYW1lIiBzZWxlY3Q9IkBvcG5hbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJwYXJhbW5hbWUiIHNlbGVjdD0iQG5hbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJwYXJhbWNvdW50IiBzZWxlY3Q9ImNvdW50KHBhcmFtW0B0eXBlIT0nJyBhbmQgQG9wbmFtZT0kb3BuYW1lXSkiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJzaG9ydHR5cGUiIHNlbGVjdD0iQHNob3J0dHlwZSIvPgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRwYXJhbWNvdW50ID4gMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJwYXJhbVtAdHlwZSE9JycgYW5kIEBvcG5hbWU9JG9wbmFtZV0iPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9InBvc2l0aW9uKCk+MSI+LDwveHNsOmlmPmdldDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAcGFydG5hbWUiLz4oPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwYXJhbW5hbWUiLz4pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iQHR5cGUhPScnIj48eHNsOmlmIHRlc3Q9InBvc2l0aW9uKCk+MSI+LDwveHNsOmlmPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4pOwotCi0gICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotCi0KLSAgICAgICAgICAgICAgICAgIC8vVGhlcmUgaXMgbm8gb3V0cHV0IHRvIGJlIHRlc3RlZCEKLSAgICAgICAgICAgICAgICAgIHN0dWIuPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+KCk7Ci0KLQotICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgIH0KLSAgICAgIDwveHNsOmlmPgotCi0gICAgIDwveHNsOmZvci1lYWNoPgotCi0gICAgICAgPCEtLSBnZW5lcmF0ZSB0aGUgdGVzdCBvYmplY3QgLS0+Ci0gICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4KLQotICAgIH0KLSAgICA8L3hzbDp0ZW1wbGF0ZT4KLQotIDwveHNsOnN0eWxlc2hlZXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL3RlbXBsYXRlL2phdmEvVGVzdE9iamVjdENyZWF0aW9uVGVtcGxhdGUueHNsIGIvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL3RlbXBsYXRlL2phdmEvVGVzdE9iamVjdENyZWF0aW9uVGVtcGxhdGUueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGJjY2QyLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC90ZW1wbGF0ZS9qYXZhL1Rlc3RPYmplY3RDcmVhdGlvblRlbXBsYXRlLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDE3NiArMCwwIEBACi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIiB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSI+DQotICAgIDx4c2w6b3V0cHV0IG1ldGhvZD0idGV4dCIvPg0KLSAgICA8eHNsOmtleSBuYW1lPSJwYXJhbXNJbiIgbWF0Y2g9Ii8vZGF0YWJpbmRlcnMvcGFyYW1bQGRpcmVjdGlvbj0naW4nXSIgdXNlPSJAdHlwZSIvPg0KLSAgICA8eHNsOmtleSBuYW1lPSJpbm5lclBhcmFtcyIgbWF0Y2g9Ii8vZGF0YWJpbmRlcnMvcGFyYW1bQGRpcmVjdGlvbj0naW4nXS9wYXJhbSIgdXNlPSJAcGFydG5hbWUiLz4NCi0NCi0gICAgPCEtLSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgIC0tPg0KLSAgICA8IS0tICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgICB4bWxiZWFucyB0ZW1wbGF0ZSAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAgLS0+DQotICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImRhdGFiaW5kZXJzW0BkYnR5cGU9J3htbGJlYW5zJ10iPg0KLSAgICAgICAgLy9DcmVhdGUgdGhlIGRlc2lyZWQgWG1sT2JqZWN0IGFuZCBwcm92aWRlIGl0IGFzIHRoZSB0ZXN0IG9iamVjdA0KLSAgICAgICAgcHVibGljICBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdCBnZXRUZXN0T2JqZWN0KGphdmEubGFuZy5DbGFzcyB0eXBlKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbnsNCi0gICAgICAgIGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCBjcmVhdG9yTWV0aG9kID0gbnVsbDsNCi0gICAgICAgICAgICAgICAgaWYgKG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0LmNsYXNzLmlzQXNzaWduYWJsZUZyb20odHlwZSkpew0KLSAgICAgICAgICAgICAgICAgICAgQ2xhc3NbXSBkZWNsYXJlZENsYXNzZXMgPSB0eXBlLmdldERlY2xhcmVkQ2xhc3NlcygpOw0KLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgJmx0OyBkZWNsYXJlZENsYXNzZXMubGVuZ3RoOyBpKyspIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyBkZWNsYXJlZENsYXNzID0gZGVjbGFyZWRDbGFzc2VzW2ldOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWNsYXJlZENsYXNzLmdldE5hbWUoKS5lbmRzV2l0aCgiJEZhY3RvcnkiKSl7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0b3JNZXRob2QgPSBkZWNsYXJlZENsYXNzLmdldE1ldGhvZCgibmV3SW5zdGFuY2UiLG51bGwpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgaWYgKGNyZWF0b3JNZXRob2QhPW51bGwpew0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICAob3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3QpY3JlYXRvck1ldGhvZC5pbnZva2UobnVsbCxudWxsKTsNCi0gICAgICAgICAgICAgICAgfWVsc2V7DQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5sYW5nLkV4Y2VwdGlvbigiQ3JlYXRvciBub3QgZm91bmQhIik7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0ib3BuYW1lcy9uYW1lIj4NCi0NCi0gICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im9wbmFtZSIgc2VsZWN0PSIuIi8+DQotDQotICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9ImNvdW50KC4uLy4uL3BhcmFtW0B0eXBlIT0nJyBhbmQgQGRpcmVjdGlvbj0naW4nIGFuZCBAb3BuYW1lPSRvcG5hbWVdKT0xIj4NCi0gICAgICAgICAgICAgICAgICAgIDwhLS0gZ2VuZXJhdGUgdGhlIGdldCBtZXRob2RzIC0tPg0KLSAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImlucHV0RWxlbWVudCIgc2VsZWN0PSIuLi8uLi9wYXJhbVtAdHlwZSE9JycgYW5kIEBkaXJlY3Rpb249J2luJyBhbmQgQG9wbmFtZT0kb3BuYW1lXSI+PC94c2w6dmFyaWFibGU+DQotICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaW5wdXRFbGVtZW50VHlwZSIgc2VsZWN0PSIuLi8uLi9wYXJhbVtAdHlwZSE9JycgYW5kIEBkaXJlY3Rpb249J2luJyBhbmQgQG9wbmFtZT0kb3BuYW1lXS9AdHlwZSI+PC94c2w6dmFyaWFibGU+DQotICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaW5wdXRFbGVtZW50U2hvcnRUeXBlIiBzZWxlY3Q9Ii4uLy4uL3BhcmFtW0B0eXBlIT0nJyBhbmQgQGRpcmVjdGlvbj0naW4nIGFuZCBAb3BuYW1lPSRvcG5hbWVdL0BzaG9ydHR5cGUiPjwveHNsOnZhcmlhYmxlPg0KLQ0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Ii4uLy4uL3BhcmFtW0B0eXBlIT0nJyBhbmQgQGRpcmVjdGlvbj0naW4nIGFuZCBAb3BuYW1lPSRvcG5hbWVdL3BhcmFtIj4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InBhcmFtRWxlbWVudCIgc2VsZWN0PSIuIj48L3hzbDp2YXJpYWJsZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InBhcnROYW1lIiBzZWxlY3Q9IkBwYXJ0bmFtZSI+PC94c2w6dmFyaWFibGU+DQotDQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSIoZ2VuZXJhdGUtaWQoJHBhcmFtRWxlbWVudCkgPSBnZW5lcmF0ZS1pZChrZXkoJ2lubmVyUGFyYW1zJywgJHBhcnROYW1lKVsxXSkpIG9yDQotICAgICAgICAgICAgICAgICAgICAgICAgKGdlbmVyYXRlLWlkKCRpbnB1dEVsZW1lbnQpID0gZ2VuZXJhdGUtaWQoa2V5KCdwYXJhbXNJbicsICRpbnB1dEVsZW1lbnRUeXBlKVsxXSkpIj4NCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz4gZ2V0PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBwYXJ0bmFtZSIvPigNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4uL0B0eXBlIi8+IHdyYXBwZWRUeXBlKXsNCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSB0aGVyZSBpcyBub3QgZGlmZmVyZW5jZSBiZXR3ZWUgaGF2aW5nIGEgc2VwZXJhdGUgY29tcGxleCB0eXBlIGFuZCB0aGUNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlubGluZSBjb21wbGV4IHR5cGUgaW1wbGVtZW50YXRpb24gLS0+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAYXJyYXkiPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gd3JhcHBlZFR5cGUuZ2V0PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1iZWZvcmUoJGlucHV0RWxlbWVudFNob3J0VHlwZSwnRG9jdW1lbnQnKSIvPigpLnhnZXQ8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBhcnROYW1lIi8+QXJyYXkoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gd3JhcHBlZFR5cGUuZ2V0PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1iZWZvcmUoJGlucHV0RWxlbWVudFNob3J0VHlwZSwnRG9jdW1lbnQnKSIvPigpLnhnZXQ8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBhcnROYW1lIi8+KCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+DQotICAgICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4NCi0gICAgICAgICAgICAgICAgPC94c2w6aWY+DQotICAgICAgICA8L3hzbDpmb3ItZWFjaD4NCi0NCi0gICAgPC94c2w6dGVtcGxhdGU+DQotICAgIDwhLS0gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICAtLT4NCi0gICAgPCEtLSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICAgQURCIHRlbXBsYXRlICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgIC0tPg0KLSAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJkYXRhYmluZGVyc1tAZGJ0eXBlPSdhZGInXSI+DQotICAgICAgICAvL0NyZWF0ZSBhbiBBREJCZWFuIGFuZCBwcm92aWRlIGl0IGFzIHRoZSB0ZXN0IG9iamVjdA0KLSAgICAgICAgcHVibGljIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCQmVhbiBnZXRUZXN0T2JqZWN0KGphdmEubGFuZy5DbGFzcyB0eXBlKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbnsNCi0gICAgICAgICAgIHJldHVybiAob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJCZWFuKSB0eXBlLm5ld0luc3RhbmNlKCk7DQotICAgICAgICB9DQotDQotICAgICAgICA8IS0tIGdlbmVyYXRlIHRoZSBnZXR0ZXIgbWV0aG9kcyBmb3IgZWFjaCBkYXRhYmluZGVycyBpZiBpdCBpcyBpbiB1d3dyYXBwZWQgbW9kZSAtLT4NCi0gICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJvcG5hbWVzL25hbWUiPg0KLSAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ib3BuYW1lIiBzZWxlY3Q9Ii4iLz4NCi0NCi0gICAgICAgICAgICA8eHNsOmlmIHRlc3Q9ImNvdW50KC4uLy4uL3BhcmFtW0B0eXBlIT0nJyBhbmQgQGRpcmVjdGlvbj0naW4nIGFuZCBAb3BuYW1lPSRvcG5hbWVdKT0xIj4NCi0gICAgICAgICAgICAgICAgICAgIDwhLS0gZ2VuZXJhdGUgdGhlIGdldCBtZXRob2RzIC0tPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJpbnB1dEVsZW1lbnQiIHNlbGVjdD0iLi4vLi4vcGFyYW1bQHR5cGUhPScnIGFuZCBAZGlyZWN0aW9uPSdpbicgYW5kIEBvcG5hbWU9JG9wbmFtZV0iPjwveHNsOnZhcmlhYmxlPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJpbnB1dEVsZW1lbnRUeXBlIiBzZWxlY3Q9Ii4uLy4uL3BhcmFtW0B0eXBlIT0nJyBhbmQgQGRpcmVjdGlvbj0naW4nIGFuZCBAb3BuYW1lPSRvcG5hbWVdL0B0eXBlIj48L3hzbDp2YXJpYWJsZT4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaW5wdXRFbGVtZW50U2hvcnRUeXBlIiBzZWxlY3Q9Ii4uLy4uL3BhcmFtW0B0eXBlIT0nJyBhbmQgQGRpcmVjdGlvbj0naW4nIGFuZCBAb3BuYW1lPSRvcG5hbWVdL0BzaG9ydHR5cGUiPjwveHNsOnZhcmlhYmxlPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJpbnB1dEVsZW1lbnRDb21wbGV4VHlwZSIgc2VsZWN0PSIuLi8uLi9wYXJhbVtAdHlwZSE9JycgYW5kIEBkaXJlY3Rpb249J2luJyBhbmQgQG9wbmFtZT0kb3BuYW1lXS9AY29tcGxleHR5cGUiPjwveHNsOnZhcmlhYmxlPg0KLQ0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Ii4uLy4uL3BhcmFtW0B0eXBlIT0nJyBhbmQgQGRpcmVjdGlvbj0naW4nIGFuZCBAb3BuYW1lPSRvcG5hbWVdL3BhcmFtIj4NCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InBhcmFtRWxlbWVudCIgc2VsZWN0PSIuIj48L3hzbDp2YXJpYWJsZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InBhcnROYW1lIiBzZWxlY3Q9IkBwYXJ0bmFtZSI+PC94c2w6dmFyaWFibGU+DQotDQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSIoZ2VuZXJhdGUtaWQoJHBhcmFtRWxlbWVudCkgPSBnZW5lcmF0ZS1pZChrZXkoJ2lubmVyUGFyYW1zJywgJHBhcnROYW1lKVsxXSkpIG9yDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnZW5lcmF0ZS1pZCgkaW5wdXRFbGVtZW50KSA9IGdlbmVyYXRlLWlkKGtleSgncGFyYW1zSW4nLCAkaW5wdXRFbGVtZW50VHlwZSlbMV0pKSI+DQotDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+IGdldDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAcGFydG5hbWUiLz4oDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuLi9AdHlwZSIvPiB3cmFwcGVkVHlwZSl7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLTx4c2w6d2hlbiB0ZXN0PSIkaW5wdXRFbGVtZW50Q29tcGxleFR5cGUgIT0gJyciPi0tPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9InN0cmluZy1sZW5ndGgobm9ybWFsaXplLXNwYWNlKCRpbnB1dEVsZW1lbnRDb21wbGV4VHlwZSkpID4gMCI+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdyYXBwZWRUeXBlLmdldDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW5wdXRFbGVtZW50U2hvcnRUeXBlIi8+KCkuZ2V0PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBwYXJ0bmFtZSIvPigpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB3cmFwcGVkVHlwZS5nZXQ8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHBhcnRuYW1lIi8+KCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4NCi0gICAgICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPg0KLSAgICAgICAgICAgICAgICAgICAgPCEtLSB0byBzdXBwb3J0IGZvciBiYWNrd29yZCBjb21wYXRpYmxpdHkgd2UgaGF2ZSB0byBhZGQgYW5kIHdyYXBwIG1ldGhvZC0tPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJnZW5lcmF0ZS1pZCgkaW5wdXRFbGVtZW50KSA9IGdlbmVyYXRlLWlkKGtleSgncGFyYW1zSW4nLCAkaW5wdXRFbGVtZW50VHlwZSlbMV0pIj4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9InN0cmluZy1sZW5ndGgobm9ybWFsaXplLXNwYWNlKCRpbnB1dEVsZW1lbnRDb21wbGV4VHlwZSkpID4gMCI+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbnB1dEVsZW1lbnRDb21wbGV4VHlwZSIvPiBnZXQ8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG9wbmFtZSIvPigNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbnB1dEVsZW1lbnRUeXBlIi8+IHdyYXBwZWRUeXBlKXsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB3cmFwcGVkVHlwZS5nZXQ8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGlucHV0RWxlbWVudFNob3J0VHlwZSIvPigpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbnB1dEVsZW1lbnRUeXBlIi8+IHdyYXA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG9wbmFtZSIvPigNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbnB1dEVsZW1lbnRDb21wbGV4VHlwZSIvPiBpbm5lclR5cGUpew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbnB1dEVsZW1lbnRUeXBlIi8+IHdyYXBwZWRFbGVtZW50ID0gbmV3IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW5wdXRFbGVtZW50VHlwZSIvPigpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlZEVsZW1lbnQuc2V0PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbnB1dEVsZW1lbnRTaG9ydFR5cGUiLz4oaW5uZXJUeXBlKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB3cmFwcGVkRWxlbWVudDsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPg0KLSAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+DQotICAgICAgICAgICAgICAgIDwveHNsOmlmPg0KLSAgICAgICAgPC94c2w6Zm9yLWVhY2g+DQotDQotICAgIDwveHNsOnRlbXBsYXRlPg0KLSAgICA8IS0tICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAgLS0+DQotICAgIDwhLS0gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAgIGppYnggdGVtcGxhdGUgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgIC0tPg0KLSAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJkYXRhYmluZGVyc1tAZGJ0eXBlPSdqaWJ4J10iPg0KLSAgICAgICAgLy8gY3JlYXRlIHRoZSBkZXNpcmVkIG9iamVjdCBhbmQgcHJvdmlkZSBpdCBhcyB0aGUgdGVzdCBvYmplY3QNCi0gICAgICAgIHB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGdldFRlc3RPYmplY3QoamF2YS5sYW5nLkNsYXNzIHR5cGUpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uIHsNCi0gICAgICAgICAgICByZXR1cm4gdHlwZS5uZXdJbnN0YW5jZSgpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICA8L3hzbDp0ZW1wbGF0ZT4NCi0gICAgPCEtLSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgIC0tPg0KLSAgICA8IS0tICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgICBKYXhicmkgdGVtcGxhdGUgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAgLS0+DQotICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImRhdGFiaW5kZXJzW0BkYnR5cGU9J2pheGJyaSddIj4NCi0gICAgICAgIC8vQ3JlYXRlIGFuIG9iamVjdCBhbmQgcHJvdmlkZSBpdCBhcyB0aGUgdGVzdCBvYmplY3QNCi0gICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0VGVzdE9iamVjdChqYXZhLmxhbmcuQ2xhc3MgdHlwZSkgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb257DQotICAgICAgICAgICByZXR1cm4gdHlwZS5uZXdJbnN0YW5jZSgpOw0KLSAgICAgICAgfQ0KLSAgICA8L3hzbDp0ZW1wbGF0ZT4NCi0gICAgPCEtLSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgIC0tPg0KLSAgICA8IS0tICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgICBub25lIHRlbXBsYXRlISEhICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAgLS0+DQotICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImRhdGFiaW5kZXJzW0BkYnR5cGU9J25vbmUnXSI+DQotICAgICAgICAvL0NyZWF0ZSBhbiBPTUVsZW1lbnQgYW5kIHByb3ZpZGUgaXQgYXMgdGhlIHRlc3Qgb2JqZWN0DQotICAgICAgICBwdWJsaWMgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgZ2V0VGVzdE9iamVjdChqYXZhLmxhbmcuT2JqZWN0IGR1bW15KXsNCi0gICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnkgPSBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpOw0KLSAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5hbWVzcGFjZSBkZWZOYW1lc3BhY2UgPSBmYWN0b3J5LmNyZWF0ZU9NTmFtZXNwYWNlKCIiLG51bGwpOw0KLSAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCkuY3JlYXRlT01FbGVtZW50KCJ0ZXN0IixkZWZOYW1lc3BhY2UpOw0KLSAgICAgICAgfQ0KLSAgICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi08L3hzbDpzdHlsZXNoZWV0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC90ZW1wbGF0ZS9qYXZhL3BhY2thZ2UuaHRtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC90ZW1wbGF0ZS9qYXZhL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjJiOTBjMS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdGVtcGxhdGUvamF2YS9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08aHRtbD4NCi08Ym9keT4NCi1UaGlzIHBhY2thZ2UgaXMgYSAibm9uIGNsYXNzIGNvbnRhaW5pbmciIG9uZSB0aGF0IGhhcyB0aGUgeHNsIHRlbXBsYXRlcyBmb3IgdGhlIEphdmEgY2xhc3MgZ2VuZXJhdGlvbg0KLQ0KLTwvYm9keT4NCi08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL3V0aWwvQ29uZmlnUHJvcGVydHlGaWxlTG9hZGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdXRpbC9Db25maWdQcm9wZXJ0eUZpbGVMb2FkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTViMGE2ZC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdXRpbC9Db25maWdQcm9wZXJ0eUZpbGVMb2FkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIud3NkbC51dGlsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLmkxOG4uQ29kZWdlbk1lc3NhZ2VzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLQotLyoqIExvYWRzIHRoZSBwcm9wZXJ0aWVzIGZyb20gdGhlIGNvbmZpZyBwcm9wZXJ0aWVzLiAqLwotcHVibGljIGNsYXNzIENvbmZpZ1Byb3BlcnR5RmlsZUxvYWRlciB7Ci0KLQotICAgIHByaXZhdGUgc3RhdGljIE1hcCBkYlN1cHBvcnRlclRlbXBsYXRlTmFtZU1hcDsKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgdGVzdE9iamVjdFRlbXBsYXRlTmFtZTsKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgc3JjRm9sZGVyTmFtZTsKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgcmVzb3VyY2VGb2xkZXJOYW1lOwotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZ1tdIGV4dGVuc2lvbkNsYXNzTmFtZXM7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gcG9zdEV4dGVuc2lvbkNsYXNzTmFtZXM7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gdGhpcmRQYXJ0eVNjaGVtYU5hbWVzOwotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZ1tdIGxhbmd1YWdlVHlwZXM7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gZGF0YWJpbmRpbmdGcmFtZXdvcmtOYW1lczsKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSB1bndyYXBTdXBwb2VydGVkZGF0YWJpbmRpbmdGcmFtZXdvcmtOYW1lczsKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSB1bndyYXBEaXJlY3RkYXRhYmluZGluZ0ZyYW1ld29ya05hbWVzOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTWFwIGxhbmd1YWdlRW1pdHRlck1hcDsKLSAgICBwcml2YXRlIHN0YXRpYyBNYXAgbGFuZ3VhZ2VTcGVjaWZpY1Byb3BlcnRpZXNNYXA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgTWFwIGRhdGFiaW5kaW5nRnJhbWV3b3JrTmFtZVRvRXh0ZW5zaW9uTWFwOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGRlZmF1bHRMYW5ndWFnZTsKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZGVmYXVsdERCRnJhbWV3b3JrTmFtZTsKLQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPREVfR0VOX0tFWV9QUkVGSVggPSAiY29kZWdlbi5leHRlbnNpb24iOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQT1NUX0NPREVfR0VOX0tFWV9QUkVGSVggPSAicG9zdC5jb2RlZ2VuLmV4dGVuc2lvbiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRISVJEX1BBUlRZX1NDSEVNQV9LRVlfUFJFRklYID0gImNvZGVnZW4udGhpcmRwYXJ0eS5zY2hlbWEiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMQU5HVUFHRV9UWVBFX0tFWV9QUkVGSVggPSAiY29kZWdlbi5sYW5ndWFnZXMiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0xBTkdVQUdFX1RZUEVfS0VZID0gImNvZGVnZW4ubGFuZ3VhZ2VzLmRlZmF1bHQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTUlUVEVSX0NMQVNTX0tFWSA9ICJjb2RlZ2VuLmVtaXR0ZXJzIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFUQV9CSU5ESU5HX0ZSQU1FV09SS19OQU1FX0tFWSA9ICJjb2RlZ2VuLmRhdGFiaW5kaW5nLmZyYW1ld29ya3MiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRBX0JJTkRJTkdfVU5XUkFQX1NVUFBPUlRFRF9GUkFNRVdPUktfTkFNRV9LRVkgPQotICAgICAgICAgICAgImNvZGVnZW4uZGF0YWJpbmRpbmcudW53cmFwLnN1cHBvcnRlZCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEFfQklORElOR19VTldSQVBfRElSRUNUX0ZSQU1FV09SS19OQU1FX0tFWSA9Ci0gICAgICAgICAgICAiY29kZWdlbi5kYXRhYmluZGluZy51bndyYXAuZGlyZWN0IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFUQV9CSU5ESU5HX0ZSQU1FV09SS19ERUZBVUxUX05BTUVfS0VZID0KLSAgICAgICAgICAgICJjb2RlZ2VuLmRhdGFiaW5kaW5nLmZyYW1ld29ya3MuZGVmYXVsdCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEFfQklORElOR19GUkFNRVdPUktfRVhURU5TSU9OX05BTUVfS0VZID0KLSAgICAgICAgICAgICJjb2RlZ2VuLmRhdGFiaW5kaW5nLmV4dGVuc2lvbnMiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRBX0JJTkRJTkdfVEVNUExBVEVfTkFNRV9LRVlfUFJFRklYID0gImNvZGVnZW4uZGF0YWJpbmRpbmcuIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFUQV9CSU5ESU5HX1RFTVBMQVRFX05BTUVfS0VZX1NVRkZJWCA9ICJ0ZW1wbGF0ZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEFfQklORElOR19URVNUX09CSkVDVF9URU1QTEFURV9OQU1FX0tFWSA9Ci0gICAgICAgICAgICAiY29kZWdlbi5kYXRhYmluZGluZy50ZXN0b2JqZWN0LnRlbXBsYXRlIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09VUkNFX0ZPTERFUl9OQU1FX0tFWSA9ICJjb2RlZ2VuLmdlbmVyYWwuc3JjLm5hbWUiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNPVVJDRV9GT0xERVJfTkFNRV9LRVkgPSAiY29kZWdlbi5nZW5lcmFsLnJlc291cmNlLm5hbWUiOwotCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0NPREVHRU5fQ09ORklHX1BST1BFUlRJRVMgPQotICAgICAgICAgICAgIi9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi9jb2RlZ2VuLWNvbmZpZy5wcm9wZXJ0aWVzIjsKLQotICAgIC8qIE5vdGUgLSBTaG91bGQgYmUgYSBub24gcmVndWxhciBleHByZXNzaW9uIGNoYXJhY3Rlci4gSWYgbm90IGl0IHNob3VsZCBiZSBwcm9wZXJseSBlc2NhcGVkICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUEFSQVRPUl9DSEFSID0gIiwiOwotCi0gICAgLyoqCi0gICAgICogTG9hZHMgYSBzdHJlYW0gZnJvbSB0aGUgZ2l2ZW4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwcm9wZXJ0aWVzUmVmZXJlbmNlCi0gICAgICogQHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBJbnB1dFN0cmVhbSBnZXRTdHJlYW0oU3RyaW5nIHByb3BlcnRpZXNSZWZlcmVuY2UpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICBJbnB1dFN0cmVhbSBzdHJlYW0gPQotICAgICAgICAgICAgICAgIENvbmZpZ1Byb3BlcnR5RmlsZUxvYWRlci5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtKHByb3BlcnRpZXNSZWZlcmVuY2UpOwotICAgICAgICBpZiAoc3RyZWFtID09IG51bGwpIHsKLSAgICAgICAgICAgIFVSTCB1cmwgPSBDb25maWdQcm9wZXJ0eUZpbGVMb2FkZXIuY2xhc3MuZ2V0UmVzb3VyY2UocHJvcGVydGllc1JlZmVyZW5jZSk7Ci0gICAgICAgICAgICBzdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKHVybC50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RyZWFtOwotICAgIH0KLQotICAgIHN0YXRpYyB7Ci0gICAgICAgIGxvYWRBbGxQcm9wZXJ0aWVzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlbG9hZCgpIHsKLSAgICAgICAgcmVzZXQoKTsKLSAgICAgICAgbG9hZEFsbFByb3BlcnRpZXMoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHJlc2V0KCkgewotICAgICAgICBkYlN1cHBvcnRlclRlbXBsYXRlTmFtZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIHRlc3RPYmplY3RUZW1wbGF0ZU5hbWUgPSBudWxsOwotICAgICAgICBleHRlbnNpb25DbGFzc05hbWVzID0gbnVsbDsKLSAgICAgICAgdGhpcmRQYXJ0eVNjaGVtYU5hbWVzID0gbnVsbDsKLSAgICAgICAgbGFuZ3VhZ2VUeXBlcyA9IG51bGw7Ci0gICAgICAgIGRhdGFiaW5kaW5nRnJhbWV3b3JrTmFtZXMgPSBudWxsOwotICAgICAgICBsYW5ndWFnZUVtaXR0ZXJNYXAgPSBudWxsOwotICAgICAgICBsYW5ndWFnZVNwZWNpZmljUHJvcGVydGllc01hcCA9IG51bGw7Ci0gICAgICAgIGRhdGFiaW5kaW5nRnJhbWV3b3JrTmFtZVRvRXh0ZW5zaW9uTWFwID0gbnVsbDsKLSAgICAgICAgZGVmYXVsdExhbmd1YWdlID0gbnVsbDsKLSAgICAgICAgZGVmYXVsdERCRnJhbWV3b3JrTmFtZSA9IG51bGw7Ci0gICAgICAgIHNyY0ZvbGRlck5hbWUgPSBudWxsOwotICAgICAgICByZXNvdXJjZUZvbGRlck5hbWUgPSBudWxsOwotCi0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBsb2FkQWxsUHJvcGVydGllcygpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vbG9vayBmb3IgdGhlIHN5c3RlbSBwcm9wZXJ0eSAib3JnLmFwYWNoZS5heGlzMi5jb2RlZ2VuLmNvbmZpZyIgdG8gZm9yIGEgcHJvcGVydHkKLSAgICAgICAgICAgIC8vZW50cnkgcmVmZXJpbmcgdG8gdGhlIGNvbmZpZyBwcm9wZXJ0aWVzCi0gICAgICAgICAgICBTdHJpbmcgcHJvcGVydHkgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9yZy5hcGFjaGUuYXhpczIuY29kZWdlbi5jb25maWciKTsKLSAgICAgICAgICAgIElucHV0U3RyZWFtIHN0cmVhbTsKLQotICAgICAgICAgICAgaWYgKHByb3BlcnR5ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzdHJlYW0gPSBnZXRTdHJlYW0ocHJvcGVydHkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzdHJlYW0gPSBnZXRTdHJlYW0oREVGQVVMVF9DT0RFR0VOX0NPTkZJR19QUk9QRVJUSUVTKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHN0cmVhbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICBDb2RlZ2VuTWVzc2FnZXMuZ2V0TWVzc2FnZSgicHJvcGZpbGVsb2FkLmdlbmVyYWxFeGNlcHRpb24iKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFByb3BlcnRpZXMgcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOwotICAgICAgICAgICAgcHJvcHMubG9hZChzdHJlYW0pOwotCi0gICAgICAgICAgICAvL2NyZWF0ZSBhIG5ldyBtYXAgZm9yIHRoZSBsYW5nIHNwZWNpZmljIHByb3BlcnRpZXMKLSAgICAgICAgICAgIGxhbmd1YWdlU3BlY2lmaWNQcm9wZXJ0aWVzTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotICAgICAgICAgICAgLy9jcmVhdGUgYSBuZXcgbWFwIGZvciB0aGUgZGF0YWJpbmRpbmcgZnJhbWV3b3JrcyBhbmQgdGhlaXIgZXh0ZW5zaW9ucwotICAgICAgICAgICAgZGF0YWJpbmRpbmdGcmFtZXdvcmtOYW1lVG9FeHRlbnNpb25NYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgICAgICAgICAvL2xvYWQgdGhlIGV4dGVuc2lvbiBjbGFzcyBuYW1lcwotICAgICAgICAgICAgU3RyaW5nIHRlbXBTdHJpbmcgPSBwcm9wcy5nZXRQcm9wZXJ0eShDT0RFX0dFTl9LRVlfUFJFRklYKTsKLSAgICAgICAgICAgIGlmICh0ZW1wU3RyaW5nICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBleHRlbnNpb25DbGFzc05hbWVzID0gdGVtcFN0cmluZy5zcGxpdChTRVBBUkFUT1JfQ0hBUik7Ci0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy9sb2FkIHRoZSBwb3N0IGV4dGVuc2lvbiBjbGFzcyBuYW1lcwotICAgICAgICAgICAgdGVtcFN0cmluZyA9IHByb3BzLmdldFByb3BlcnR5KFBPU1RfQ09ERV9HRU5fS0VZX1BSRUZJWCk7Ci0gICAgICAgICAgICBpZiAodGVtcFN0cmluZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcG9zdEV4dGVuc2lvbkNsYXNzTmFtZXMgPSB0ZW1wU3RyaW5nLnNwbGl0KFNFUEFSQVRPUl9DSEFSKTsKLQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy9sb2FkIHRoZSBkYXRhIGJpbmRpbmcgZnJhbWV3b3JrIG5hbWVzCi0gICAgICAgICAgICB0ZW1wU3RyaW5nID0gcHJvcHMuZ2V0UHJvcGVydHkoREFUQV9CSU5ESU5HX0ZSQU1FV09SS19OQU1FX0tFWSk7Ci0gICAgICAgICAgICBpZiAodGVtcFN0cmluZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZGF0YWJpbmRpbmdGcmFtZXdvcmtOYW1lcyA9IHRlbXBTdHJpbmcuc3BsaXQoU0VQQVJBVE9SX0NIQVIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvL2xvYWQgdGhlIHVud3JhcCBzdXBwb3J0ZWQgZGF0YSBiaW5kaW5nIGZyYW1ld29yayBuYW1lcwotICAgICAgICAgICAgdGVtcFN0cmluZyA9IHByb3BzLmdldFByb3BlcnR5KERBVEFfQklORElOR19VTldSQVBfU1VQUE9SVEVEX0ZSQU1FV09SS19OQU1FX0tFWSk7Ci0gICAgICAgICAgICBpZiAodGVtcFN0cmluZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdW53cmFwU3VwcG9lcnRlZGRhdGFiaW5kaW5nRnJhbWV3b3JrTmFtZXMgPSB0ZW1wU3RyaW5nLnNwbGl0KFNFUEFSQVRPUl9DSEFSKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy9sb2FkIHRoZSB1bndyYXAgc3VwcG9ydGVkIGRhdGEgYmluZGluZyBmcmFtZXdvcmsgbmFtZXMKLSAgICAgICAgICAgIHRlbXBTdHJpbmcgPSBwcm9wcy5nZXRQcm9wZXJ0eShEQVRBX0JJTkRJTkdfVU5XUkFQX0RJUkVDVF9GUkFNRVdPUktfTkFNRV9LRVkpOwotICAgICAgICAgICAgaWYgKHRlbXBTdHJpbmcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHVud3JhcERpcmVjdGRhdGFiaW5kaW5nRnJhbWV3b3JrTmFtZXMgPSB0ZW1wU3RyaW5nLnNwbGl0KFNFUEFSQVRPUl9DSEFSKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy9sb2FkIHRoZSBzb3VyY2UgZm9sZGVyCi0gICAgICAgICAgICB0ZW1wU3RyaW5nID0gcHJvcHMuZ2V0UHJvcGVydHkoU09VUkNFX0ZPTERFUl9OQU1FX0tFWSk7Ci0gICAgICAgICAgICBpZiAodGVtcFN0cmluZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc3JjRm9sZGVyTmFtZSA9IHRlbXBTdHJpbmc7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vbG9hZCB0aGUgcmVzb3VyY2UgZm9sZGVyIG5hbWUKLSAgICAgICAgICAgIHRlbXBTdHJpbmcgPSBwcm9wcy5nZXRQcm9wZXJ0eShSRVNPVVJDRV9GT0xERVJfTkFNRV9LRVkpOwotICAgICAgICAgICAgaWYgKHRlbXBTdHJpbmcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJlc291cmNlRm9sZGVyTmFtZSA9IHRlbXBTdHJpbmc7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vcG9wdWxhdGUgdGhlIGRhdGEgYmluZGluZyBmcmFtZXdvcmsgbmFtZSB0byBleHRlbnNpb24gbmFtZSBtYXAKLSAgICAgICAgICAgIHRlbXBTdHJpbmcgPSBwcm9wcy5nZXRQcm9wZXJ0eShEQVRBX0JJTkRJTkdfRlJBTUVXT1JLX0VYVEVOU0lPTl9OQU1FX0tFWSk7Ci0gICAgICAgICAgICBpZiAodGVtcFN0cmluZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nW10gZnJhbWV3b3JrRXh0ZW5zaW9uTmFtZXMgPSB0ZW1wU3RyaW5nLnNwbGl0KFNFUEFSQVRPUl9DSEFSKTsKLQotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhbWV3b3JrRXh0ZW5zaW9uTmFtZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFiaW5kaW5nRnJhbWV3b3JrTmFtZVRvRXh0ZW5zaW9uTWFwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wdXQoZGF0YWJpbmRpbmdGcmFtZXdvcmtOYW1lc1tpXSwgZnJhbWV3b3JrRXh0ZW5zaW9uTmFtZXNbaV0pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlZ2VuTWVzc2FnZXMuZ2V0TWVzc2FnZSgicHJvcGZpbGVsb2FkLmZyYW1ld29ya01pc21hdGNoIikpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvL2xvYWQgdGhlIGRlZmF1bHQgZnJhbWV3b3JrIG5hbWUKLSAgICAgICAgICAgIHRlbXBTdHJpbmcgPSBwcm9wcy5nZXRQcm9wZXJ0eShEQVRBX0JJTkRJTkdfRlJBTUVXT1JLX0RFRkFVTFRfTkFNRV9LRVkpOwotCi0gICAgICAgICAgICBpZiAodGVtcFN0cmluZyA9PSBudWxsIHx8Ci0gICAgICAgICAgICAgICAgICAgICFkYXRhYmluZGluZ0ZyYW1ld29ya05hbWVUb0V4dGVuc2lvbk1hcC5jb250YWluc0tleSh0ZW1wU3RyaW5nKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oQ29kZWdlbk1lc3NhZ2VzLmdldE1lc3NhZ2UoInByb3BmaWxlbG9hZC51bmtub3duRnJhbWV3b3JrIikpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGVmYXVsdERCRnJhbWV3b3JrTmFtZSA9IHRlbXBTdHJpbmc7Ci0gICAgICAgICAgICAvL2xvYWQgdGhlIHRoaXJkIHBhcnR5IHNjaGVtYSBuYW1lcwotICAgICAgICAgICAgdGVtcFN0cmluZyA9IHByb3BzLmdldFByb3BlcnR5KFRISVJEX1BBUlRZX1NDSEVNQV9LRVlfUFJFRklYKTsKLSAgICAgICAgICAgIGlmICh0ZW1wU3RyaW5nICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aGlyZFBhcnR5U2NoZW1hTmFtZXMgPSB0ZW1wU3RyaW5nLnNwbGl0KFNFUEFSQVRPUl9DSEFSKTsKLQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvL3BvcHVsYXRlIHRoZSBkYiBzdXBwb3J0ZXIgdGVtcGxhdGUgbmFtZXMuCi0gICAgICAgICAgICBkYlN1cHBvcnRlclRlbXBsYXRlTmFtZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgICAgICBTdHJpbmcga2V5OwotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBhbGxQcm9wZXJ0aWVzID0gcHJvcHMua2V5U2V0KCkuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICAgYWxsUHJvcGVydGllcy5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAga2V5ID0gKFN0cmluZylhbGxQcm9wZXJ0aWVzLm5leHQoKTsKLSAgICAgICAgICAgICAgICBpZiAoa2V5LnN0YXJ0c1dpdGgoREFUQV9CSU5ESU5HX1RFTVBMQVRFX05BTUVfS0VZX1BSRUZJWCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIGtleS5lbmRzV2l0aChEQVRBX0JJTkRJTkdfVEVNUExBVEVfTkFNRV9LRVlfU1VGRklYKSkgewotICAgICAgICAgICAgICAgICAgICBkYlN1cHBvcnRlclRlbXBsYXRlTmFtZU1hcC5wdXQoa2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcHMuZ2V0UHJvcGVydHkoa2V5KSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRlc3RPYmplY3RUZW1wbGF0ZU5hbWUgPSBwcm9wcy5nZXRQcm9wZXJ0eShEQVRBX0JJTkRJTkdfVEVTVF9PQkpFQ1RfVEVNUExBVEVfTkFNRV9LRVkpOwotCi0gICAgICAgICAgICAvL2xvYWQgdGhlIGxhbmd1YWdlIG5hbWVzCi0gICAgICAgICAgICB0ZW1wU3RyaW5nID0gcHJvcHMuZ2V0UHJvcGVydHkoTEFOR1VBR0VfVFlQRV9LRVlfUFJFRklYKTsKLSAgICAgICAgICAgIGlmICh0ZW1wU3RyaW5nICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBsYW5ndWFnZVR5cGVzID0gdGVtcFN0cmluZy5zcGxpdChTRVBBUkFUT1JfQ0hBUik7Ci0KLSAgICAgICAgICAgICAgICAvL2xvYWQgdGhlIGxhbmd1YWdlIGVtaXR0ZXIgbWFwCi0gICAgICAgICAgICAgICAgdGVtcFN0cmluZyA9IHByb3BzLmdldFByb3BlcnR5KEVNSVRURVJfQ0xBU1NfS0VZKTsKLSAgICAgICAgICAgICAgICBpZiAodGVtcFN0cmluZyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oQ29kZWdlbk1lc3NhZ2VzLmdldE1lc3NhZ2UoInByb3BmaWxlbG9hZC5lbWl0dGVyTWlzc2luZyIpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSB0ZW1wQ2xhc3NOYW1lcyA9IHRlbXBTdHJpbmcuc3BsaXQoU0VQQVJBVE9SX0NIQVIpOwotICAgICAgICAgICAgICAgICAgICAvL3BvcHVsYXRlIHRoZSBtYXAKLSAgICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2VFbWl0dGVyTWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0ZW1wQ2xhc3NOYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2VFbWl0dGVyTWFwLnB1dChsYW5ndWFnZVR5cGVzW2ldLCB0ZW1wQ2xhc3NOYW1lc1tpXSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gbG9hZCB0aGUgZGVmYXVsdCBsYW5ndWFnZQotICAgICAgICAgICAgdGVtcFN0cmluZyA9IHByb3BzLmdldFByb3BlcnR5KERFRkFVTFRfTEFOR1VBR0VfVFlQRV9LRVkpOwotICAgICAgICAgICAgaWYgKG51bGwgPT0gdGVtcFN0cmluZyB8fCAhbGFuZ3VhZ2VFbWl0dGVyTWFwLmNvbnRhaW5zS2V5KHRlbXBTdHJpbmcpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbihDb2RlZ2VuTWVzc2FnZXMuZ2V0TWVzc2FnZSgicHJvcGZpbGVsb2FkLnVua25vd25EZWZhdWx0TGFuZyIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRlZmF1bHRMYW5ndWFnZSA9IHRlbXBTdHJpbmc7Ci0KLSAgICAgICAgICAgIC8vIHJ1biB0aHJvdWdoIHRoZSBsYW5ndWFnZSBzcGVjaWZpYyBwcm9wZXJ0aWVzIGFuZCBwb3B1bGF0ZSB0aGUKLSAgICAgICAgICAgIC8vIGxhbmd1YWdlIHNwZWNpZmljIHByb3BlcnR5IG1hcAotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIFN0cmluZyBsYW5ndWFnZVR5cGU7Ci0gICAgICAgICAgICBTdHJpbmcgdGVtcGtleTsKLSAgICAgICAgICAgIEhhc2hNYXAgbGFuZ1NwZWNpZmljTWFwOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsYW5ndWFnZVR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbGFuZ3VhZ2VUeXBlID0gbGFuZ3VhZ2VUeXBlc1tpXTsKLSAgICAgICAgICAgICAgICBsYW5nU3BlY2lmaWNNYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICAgICAgICAgIEVudW1lcmF0aW9uIGtleUVudW0gPSBwcm9wcy5rZXlzKCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGtleUVudW0uaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgdGVtcGtleSA9IGtleUVudW0ubmV4dEVsZW1lbnQoKS50b1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgICBpZiAodGVtcGtleS5zdGFydHNXaXRoKGxhbmd1YWdlVHlwZSArICIuIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxhbmdTcGVjaWZpY01hcC5wdXQodGVtcGtleSwgcHJvcHMuZ2V0KHRlbXBrZXkpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvL25vdyBhZGQgdGhpcyB0byB0aGUgbGFuZyBzcGVjaWZpYyBwcm9wZXJ0aWVzIG1hcAotICAgICAgICAgICAgICAgIGxhbmd1YWdlU3BlY2lmaWNQcm9wZXJ0aWVzTWFwLnB1dChsYW5ndWFnZVR5cGUsIGxhbmdTcGVjaWZpY01hcCk7Ci0gICAgICAgICAgICB9Ci0KLQotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKENvZGVnZW5NZXNzYWdlcy5nZXRNZXNzYWdlKCJwcm9wZmlsZWxvYWQuZ2VuZXJhbEV4Y2VwdGlvbiIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiogQHJldHVybiB0aGUgc291cmNlIGZvbGRlciBuYW1lICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VGb2xkZXJOYW1lKCkgewotICAgICAgICByZXR1cm4gcmVzb3VyY2VGb2xkZXJOYW1lOwotICAgIH0KLQotCi0gICAgLyoqIEByZXR1cm4gdGhlIHJlc291cmNlIGZvbGRlciBuYW1lICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3JjRm9sZGVyTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHNyY0ZvbGRlck5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdGVzdCBvYmplY3Qgc3VwcG9ydCB0ZW1wbGF0ZS4gVGhpcyBpcyB1c2VkIGluIHRoZSBnZW5lcmF0ZWQgdGVzdCBjbGFzcy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gUmV0dXJucyBTdHJpbmcuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VGVzdE9iamVjdFRlbXBsYXRlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHRlc3RPYmplY3RUZW1wbGF0ZU5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgZGF0YWJpbmRlciB0ZW1wbGF0ZSBuYW1lcy4gVGhpcyBpcyB0aGUgdGVtcGxhdGUgdGhhdCBoYXMgdGhlIGxvZ2ljIGZvciBjcmVhdGluZyB0aGUKLSAgICAgKiBkYXRhYmluZCBzdXBwb3J0ZXJzLgotICAgICAqCi0gICAgICogQHJldHVybiBSZXR1cm5zIFN0cmluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE1hcCBnZXREYlN1cHBvcnRlclRlbXBsYXRlc01hcCgpIHsKLSAgICAgICAgcmV0dXJuIGRiU3VwcG9ydGVyVGVtcGxhdGVOYW1lTWFwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGV4dGVuc2lvbiBjbGFzcyBuYW1lcy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gUmV0dXJucyBTdHJpbmdbXS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldEV4dGVuc2lvbkNsYXNzTmFtZXMoKSB7Ci0gICAgICAgIHJldHVybiBleHRlbnNpb25DbGFzc05hbWVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGdldCB0aGUgcG9zdCBleHRlbnNpb24gY2xhc3MgbmFtZXMKLSAgICAgKgotICAgICAqIEByZXR1cm4gUmV0dXJucyBTdHJpbmdbXS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldFBvc3RFeHRlbnNpb25DbGFzc05hbWVzKCkgewotICAgICAgICByZXR1cm4gcG9zdEV4dGVuc2lvbkNsYXNzTmFtZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdGhpcmQgcGFydHkgc2NoZW1hIG5hbWVzIGxpc3QuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgU3RyaW5nW10uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRUaGlyZFBhcnR5U2NoZW1hTmFtZXMoKSB7Ci0gICAgICAgIHJldHVybiB0aGlyZFBhcnR5U2NoZW1hTmFtZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbGFuZ3VhZ2UgdHlwZSBuYW1lcy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gUmV0dXJucyBTdHJpbmdbXS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldExhbmd1YWdlVHlwZXMoKSB7Ci0gICAgICAgIHJldHVybiBsYW5ndWFnZVR5cGVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGVtaXR0ZXIgbmFtZXMgbWFwIGtleXMgd2l0aCB0aGUgbGFuZ3VhZ2UgbmFtZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gUmV0dXJucyBNYXAuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBNYXAgZ2V0TGFuZ3VhZ2VFbWl0dGVyTWFwKCkgewotICAgICAgICByZXR1cm4gbGFuZ3VhZ2VFbWl0dGVyTWFwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgbGlzdCBvZiB1bndyYXAgc3VwcG9ydGVkIGRhdGEgYmluZGluZyBmcmFtZXdvcmtzCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGxpc3QKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIExpc3QgZ2V0VW53cmFwU3VwcG9ydGVkRnJhbWV3b3JrTmFtZXMoKSB7Ci0gICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KHVud3JhcFN1cHBvZXJ0ZWRkYXRhYmluZGluZ0ZyYW1ld29ya05hbWVzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGxpc3Qgb2YgZGF0YSBiaW5kaW5nIGZyYW1ld29ya3MgdGhhdCBoYW5kbGUgdW53cmFwcGluZyBkaXJlY3RseS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gbmFtZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIExpc3QgZ2V0VW53cmFwRGlyZWN0RnJhbWV3b3JrTmFtZXMoKSB7Ci0gICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KHVud3JhcERpcmVjdGRhdGFiaW5kaW5nRnJhbWV3b3JrTmFtZXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGRlZmF1bHQgbGFuZ3VhZ2UgbmFtZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gUmV0dXJucyBTdHJpbmcuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGVmYXVsdExhbmd1YWdlKCkgewotICAgICAgICByZXR1cm4gZGVmYXVsdExhbmd1YWdlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGxhbmd1YWdlIHNwZWNpZmljIHByb3BlcnRpZXMuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgTWFwLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTWFwIGdldExhbmd1YWdlU3BlY2lmaWNQcm9wZXJ0aWVzTWFwKCkgewotICAgICAgICByZXR1cm4gbGFuZ3VhZ2VTcGVjaWZpY1Byb3BlcnRpZXNNYXA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgZGF0YWJpbmRpbmcgZnJhbWV3b3JrIG5hbWVzLgotICAgICAqCi0gICAgICogQHJldHVybiBSZXR1cm5zIFN0cmluZ1tdLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0RGF0YWJpbmRpbmdGcmFtZXdvcmtOYW1lcygpIHsKLSAgICAgICAgcmV0dXJuIGRhdGFiaW5kaW5nRnJhbWV3b3JrTmFtZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgZXh0ZW5zaW9ucyBtYXAgZm9yIHRoZSBkYXRhYmluZGluZyBmcmFtZXdvcmtzLiBUaGUgZW50cmllcyBhcmUga2V5cyBieSB0aGUgZnJhbWV3b3JrCi0gICAgICogbmFtZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gUmV0dXJucyBNYXAuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBNYXAgZ2V0RGF0YWJpbmRpbmdGcmFtZXdvcmtOYW1lVG9FeHRlbnNpb25NYXAoKSB7Ci0gICAgICAgIHJldHVybiBkYXRhYmluZGluZ0ZyYW1ld29ya05hbWVUb0V4dGVuc2lvbk1hcDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBkZWZhdWx0IERCIGZyYW13b3JrIG5hbWUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgU3RyaW5nLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERlZmF1bHREQkZyYW1ld29ya05hbWUoKSB7Ci0gICAgICAgIHJldHVybiBkZWZhdWx0REJGcmFtZXdvcmtOYW1lOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC91dGlsL0NvbnN0YW50cy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL3V0aWwvQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2MGM3YWMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL3V0aWwvQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIud3NkbC51dGlsOwotCi1wdWJsaWMgaW50ZXJmYWNlIENvbnN0YW50cyB7Ci0KLSAgICBTdHJpbmcgQkFTRV82NF9QUk9QRVJUWV9LRVkgPSAiYmFzZTY0bWFwIjsKLSAgICBTdHJpbmcgUExBSU5fQkFTRV82NF9QUk9QRVJUWV9LRVkgPSAicGxhaW5iYXNlNjRtYXAiOwotCi0gICAgU3RyaW5nIEVYVEVSTkFMX1RFTVBMQVRFX1BST1BFUlRZX0tFWSA9ICJleHRlcm5hbFRlbXBsYXRlIjsKLSAgICBTdHJpbmcgWFNMVF9JTkNMVURFX0RBVEFCSU5EX1NVUFBPUlRFUl9IUkVGX0tFWSA9ICJkYXRhYmluZHN1cHBvcnRlciI7Ci0gICAgU3RyaW5nIFhTTFRfSU5DTFVERV9URVNUX09CSkVDVF9IUkVGX0tFWSA9ICJ0ZXN0T2JqZWN0IjsKLSAgICBTdHJpbmcgVU5XUkFQUEVEX0tFWSA9ICJVbldyYXBwZWQiOwotICAgIFN0cmluZyBVTldSQVBQRURfREVUQUlMUyA9ICJVbldyYXBwZWRfZGV0YWlscyI7Ci0KLSAgICBTdHJpbmcgQ09NUExFWF9UWVBFID0gImNvbXBsZXhUeXBlIjsKLSAgICBTdHJpbmcgQVJSQVlfVFlQRSA9ICJhcnJheVR5cGUiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQU5ZX0VMRU1FTlRfRklFTERfTkFNRSA9ICJleHRyYUVsZW1lbnQiOwotCi0gICAgLyoqCi0gICAgICogUHJvcGVydHkgZm9yIG1lc3NhZ2UgcmVjZWl2ZXIgb3BlcmF0aW9uIG1ldGhvZCBoYW5kbGVkIGJ5IGRhdGFiaW5kaW5nIGNvZGUgZ2VuZXJhdGlvbi4gVGhpcwotICAgICAqIGlzIGFuIG9wdGlvbmFsIHBhcmFtZXRlciBmb3IgYW4ge0BsaW5rIG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbn0uIElmCi0gICAgICogcHJlc2VudCwgdGhlIHZhbHVlIGlzIHRoZSBuYW1lIG9mIGEgbWV0aG9kIHRvIGJlIGdlbmVyYXRlZCBieSB0aGUgZGF0YWJpbmRpbmcgY29kZSBnZW5lcmF0aW9uCi0gICAgICogYW5kIGNhbGxlZCBieSB0aGUgbWVzc2FnZSByZWNlaXZlciBjb2RlIGdlbmVyYXRpb24gaW4gb3JkZXIgdG8gcHJvY2VzcyB0aGUgT01FbGVtZW50IGFuZAotICAgICAqIGludm9rZSB0aGUgc2VydmljZSBtZXRob2QuCi0gICAgICovCi0gICAgU3RyaW5nIERBVEFCSU5ESU5HX0dFTkVSQVRFRF9SRUNFSVZFUiA9ICJkYXRhYmluZGluZy1nZW5lcmF0ZWQtcmVjZWl2ZXIiOwotCi0gICAgLyoqCi0gICAgICogUHJvcGVydHkgZm9yIGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbiBtZXRob2QgaGFuZGxlZCBieSBkYXRhYmluZGluZyBjb2RlIGdlbmVyYXRpb24uIFRoaXMgaXMKLSAgICAgKiBhbiBvcHRpb25hbCBwYXJhbWV0ZXIgZm9yIGFuIHtAbGluayBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb259LiBJZiBwcmVzZW50LAotICAgICAqIHRoZSB2YWx1ZSBpcyBhIDxjb2RlPkJvb2xlYW48L2NvZGU+IGZsYWcgdG8gaW5kaWNhdGUgdGhhdCB0aGUgbWV0aG9kIGNvcnJlc3BvbmRpbmcgdG8gdGhhdAotICAgICAqIG9wZXJhdGlvbiB3aWxsIGJlIGdlbmVyYXRlZCBieSB0aGUgZGF0YSBiaW5kaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLSAgICAgKi8KLSAgICBTdHJpbmcgREFUQUJJTkRJTkdfR0VORVJBVEVEX0lNUExFTUVOVEFUSU9OID0gImRhdGFiaW5kaW5nLWdlbmVyYXRlZC1pbXBsZW1lbnRhdGlvbiI7Ci0KLSAgICAvKioKLSAgICAgKiBQcm9wZXJ0eSBmb3IgZGV0YWlscyB0byBiZSBwYXNzZWQgaW5zaWRlIHRoZSAmbHQ7ZGF0YWJpbmRlcnM+IGVsZW1lbnQuIFRoaXMgaXMgYW4gb3B0aW9uYWwKLSAgICAgKiBwYXJhbWV0ZXIgZm9yIGFuIHtAbGluayBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb259LiBJZiBwcmVzZW50LCB0aGUgdmFsdWUgaXMKLSAgICAgKiBhIERPTSBlbGVtZW50IHRvIGJlIGFwcGVuZGVkIHRvIHRoZSAmbHQ7ZGF0YWJpbmRlcnM+IGNvbnRlbnQuCi0gICAgICovCi0gICAgU3RyaW5nIERBVEFCSU5ESU5HX09QRVJBVElPTl9ERVRBSUxTID0gImRhdGFiaW5kaW5nLW9wZXJhdGlvbi1kZXRhaWxzIjsKLQotICAgIC8qKgotICAgICAqIFByb3BlcnR5IGZvciBkZXRhaWxzIHRvIGJlIHBhc3NlZCBpbnNpZGUgdGhlICZsdDtkYXRhYmluZGVycz4gZWxlbWVudC4gVGhpcyBpcyBhbiBvcHRpb25hbAotICAgICAqIHBhcmFtZXRlciBmb3IgYW4ge0BsaW5rIG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2V9LiBJZiBwcmVzZW50LCB0aGUgdmFsdWUgaXMgYQotICAgICAqIERPTSBlbGVtZW50IHRvIGJlIGFwcGVuZGVkIHRvIHRoZSAmbHQ7ZGF0YWJpbmRlcnM+IGNvbnRlbnQuCi0gICAgICovCi0gICAgU3RyaW5nIERBVEFCSU5ESU5HX1NFUlZJQ0VfREVUQUlMUyA9ICJkYXRhYmluZGluZy1zZXJ2aWNlLWRldGFpbHMiOwotCi0KLSAgICBwdWJsaWMgaW50ZXJmYWNlIENvZGVnZW5TdHlsZSB7Ci0gICAgICAgIGZpbmFsIGludCBBVVRPTUFUSUMgPSAwOwotICAgICAgICBmaW5hbCBpbnQgSU5URVJGQUNFID0gMTsKLSAgICAgICAgc3RhdGljIGZpbmFsIGludCBCSU5ESU5HID0gMjsKLSAgICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL3V0aWwvTWVzc2FnZVBhcnRJbmZvcm1hdGlvbkhvbGRlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL3V0aWwvTWVzc2FnZVBhcnRJbmZvcm1hdGlvbkhvbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYWViYmY4Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC91dGlsL01lc3NhZ2VQYXJ0SW5mb3JtYXRpb25Ib2xkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi53c2RsLnV0aWw7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBhY3RzIGFzIHRoZSBob2xkZXIgZm9yIHRoZSBpbmZvcm1hdGlvbiB0aGF0IGlzIHJlcXVpcmVkIHRvIGJlIGF0dGFjaGVkIHRvIHRoZQotICogQXhpc01lc3NhZ2UgZHVyaW5nIHVud3JhcHBpbmcKLSAqLwotcHVibGljIGNsYXNzIE1lc3NhZ2VQYXJ0SW5mb3JtYXRpb25Ib2xkZXIgewotCi0gICAgcHJpdmF0ZSBRTmFtZSBvcGVyYXRpb25OYW1lOwotICAgIHByaXZhdGUgTGlzdCBwYXJ0c0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICBwdWJsaWMgUU5hbWUgZ2V0T3BlcmF0aW9uTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG9wZXJhdGlvbk5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0T3BlcmF0aW9uTmFtZShRTmFtZSBvcGVyYXRpb25OYW1lKSB7Ci0gICAgICAgIHRoaXMub3BlcmF0aW9uTmFtZSA9IG9wZXJhdGlvbk5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3QgZ2V0UGFydHNMaXN0KCkgewotICAgICAgICByZXR1cm4gcGFydHNMaXN0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBhcnRzTGlzdChMaXN0IHBhcnRzTGlzdCkgewotICAgICAgICB0aGlzLnBhcnRzTGlzdCA9IHBhcnRzTGlzdDsKLSAgICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL3V0aWwvVHlwZVRlc3RlclV0aWwuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC91dGlsL1R5cGVUZXN0ZXJVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5NWMyNDkuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL3V0aWwvVHlwZVRlc3RlclV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi53c2RsLnV0aWw7Ci0KLXB1YmxpYyBjbGFzcyBUeXBlVGVzdGVyVXRpbCB7Ci0KLSAgICAvKioKLSAgICAgKiBDaGVjayB3aGV0aGVyIGEgZ2l2ZW4gY2xhc3NuYW1lIGlzIHByaW1pdGl2ZXMKLSAgICAgKgotICAgICAqIEBwYXJhbSBjbGFzc05hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNQcmltaXRpdmUoU3RyaW5nIGNsYXNzTmFtZSkgewotCi0gICAgICAgIHJldHVybiAiaW50Ii5lcXVhbHMoY2xhc3NOYW1lKSB8fAotICAgICAgICAgICAgICAgICJmbG9hdCIuZXF1YWxzKGNsYXNzTmFtZSkgfHwKLSAgICAgICAgICAgICAgICAiYm9vbGVhbiIuZXF1YWxzKGNsYXNzTmFtZSkgfHwKLSAgICAgICAgICAgICAgICAiZG91YmxlIi5lcXVhbHMoY2xhc3NOYW1lKSB8fAotICAgICAgICAgICAgICAgICJieXRlIi5lcXVhbHMoY2xhc3NOYW1lKSB8fAotICAgICAgICAgICAgICAgICJzaG9ydCIuZXF1YWxzKGNsYXNzTmFtZSkgfHwKLSAgICAgICAgICAgICAgICAibG9uZyIuZXF1YWxzKGNsYXNzTmFtZSk7Ci0KLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHdoZXRoZXIgdGhlIGdpdmVuIGNsYXNzbmFtZSBoYXMgYSBwYWNrYWdlIHRoZSBjdXJyZW50IGxvZ2ljIGlzIHNpbXBsZSB3aGVyZSB3ZSBsb29rCi0gICAgICogZm9yIGEgJy4nIGluc2lkZSB0aGUgY2xhc3NuYW1lIHN0cmluZwotICAgICAqCi0gICAgICogQHBhcmFtIGNsYXNzTmFtZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNQYWNrYWdlKFN0cmluZyBjbGFzc05hbWUpIHsKLSAgICAgICAgcmV0dXJuIChjbGFzc05hbWUuaW5kZXhPZignLicpICE9IC0xKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdXRpbC9XU0RMMkphdmFPcHRpb25zVmFsaWRhdG9yLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdXRpbC9XU0RMMkphdmFPcHRpb25zVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhNjhkNGEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL3V0aWwvV1NETDJKYXZhT3B0aW9uc1ZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi53c2RsLnV0aWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuQ29tbWFuZExpbmVPcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLkNvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5PcHRpb25zVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLmV4dGVuc2lvbi5YTUxCZWFuc0V4dGVuc2lvbjsKLQotcHVibGljIGNsYXNzIFdTREwySmF2YU9wdGlvbnNWYWxpZGF0b3IgaW1wbGVtZW50cyBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cywgT3B0aW9uc1ZhbGlkYXRvciB7Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0ludmFsaWQoQ29tbWFuZExpbmVPcHRpb24gb3B0aW9uKSB7Ci0KLSAgICAgICAgYm9vbGVhbiBpbnZhbGlkOwotICAgICAgICBTdHJpbmcgb3B0aW9uVHlwZSA9IG9wdGlvbi5nZXRPcHRpb25UeXBlKCk7Ci0KLSAgICAgICAgaWYgKG9wdGlvblR5cGUuc3RhcnRzV2l0aChXU0RMMkphdmFDb25zdGFudHMuRVhUUkFfT1BUSU9OVFlQRV9QUkVGSVgpKSB7Ci0gICAgICAgICAgICBpbnZhbGlkID0gZmFsc2U7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpbnZhbGlkID0gIShXU0RMMkphdmFDb25zdGFudHMuQWxsX1BPUlRTX09QVElPTi5lcXVhbHNJZ25vcmVDYXNlKG9wdGlvblR5cGUpIHx8Ci0gICAgICAgICAgICAgICAgICAgIFdTREwySmF2YUNvbnN0YW50cy5BbGxfUE9SVFNfT1BUSU9OX0xPTkcuZXF1YWxzSWdub3JlQ2FzZShvcHRpb25UeXBlKSB8fAotICAgICAgICAgICAgICAgICAgICBXU0RMMkphdmFDb25zdGFudHMuQkFDS1dPUkRfQ09NUEFUSUJJTElUWV9PUFRJT04uZXF1YWxzSWdub3JlQ2FzZShvcHRpb25UeXBlKSB8fAotICAgICAgICAgICAgICAgICAgICBXU0RMMkphdmFDb25zdGFudHMuQkFDS1dPUkRfQ09NUEFUSUJJTElUWV9PUFRJT05fTE9ORy5lcXVhbHNJZ25vcmVDYXNlKG9wdGlvblR5cGUpIHx8Ci0gICAgICAgICAgICAgICAgICAgIFdTREwySmF2YUNvbnN0YW50cy5DT0RFR0VOX0FTWU5DX09OTFlfT1BUSU9OLmVxdWFsc0lnbm9yZUNhc2Uob3B0aW9uVHlwZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgV1NETDJKYXZhQ29uc3RhbnRzLkNPREVHRU5fQVNZTkNfT05MWV9PUFRJT05fTE9ORy5lcXVhbHNJZ25vcmVDYXNlKG9wdGlvblR5cGUpIHx8Ci0gICAgICAgICAgICAgICAgICAgIFdTREwySmF2YUNvbnN0YW50cy5DT0RFR0VOX1NZTkNfT05MWV9PUFRJT04uZXF1YWxzSWdub3JlQ2FzZShvcHRpb25UeXBlKSB8fAotICAgICAgICAgICAgICAgICAgICBXU0RMMkphdmFDb25zdGFudHMuQ09ERUdFTl9TWU5DX09OTFlfT1BUSU9OX0xPTkcuZXF1YWxzSWdub3JlQ2FzZShvcHRpb25UeXBlKSB8fAotICAgICAgICAgICAgICAgICAgICBXU0RMMkphdmFDb25zdGFudHMuREFUQV9CSU5ESU5HX1RZUEVfT1BUSU9OLmVxdWFsc0lnbm9yZUNhc2Uob3B0aW9uVHlwZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgV1NETDJKYXZhQ29uc3RhbnRzLkRBVEFfQklORElOR19UWVBFX09QVElPTl9MT05HLmVxdWFsc0lnbm9yZUNhc2Uob3B0aW9uVHlwZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgV1NETDJKYXZhQ29uc3RhbnRzLkVYVEVSTkFMX01BUFBJTkdfT1BUSU9OLmVxdWFsc0lnbm9yZUNhc2Uob3B0aW9uVHlwZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgV1NETDJKYXZhQ29uc3RhbnRzLkVYVEVSTkFMX01BUFBJTkdfT1BUSU9OX0xPTkcuZXF1YWxzSWdub3JlQ2FzZShvcHRpb25UeXBlKSB8fAotICAgICAgICAgICAgICAgICAgICBXU0RMMkphdmFDb25zdGFudHMuRkxBVFRFTl9GSUxFU19PUFRJT04uZXF1YWxzSWdub3JlQ2FzZShvcHRpb25UeXBlKSB8fAotICAgICAgICAgICAgICAgICAgICBXU0RMMkphdmFDb25zdGFudHMuRkxBVFRFTl9GSUxFU19PUFRJT05fTE9ORy5lcXVhbHNJZ25vcmVDYXNlKG9wdGlvblR5cGUpIHx8Ci0gICAgICAgICAgICAgICAgICAgIFdTREwySmF2YUNvbnN0YW50cy5HRU5FUkFURV9BTExfT1BUSU9OLmVxdWFsc0lnbm9yZUNhc2Uob3B0aW9uVHlwZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgV1NETDJKYXZhQ29uc3RhbnRzLkdFTkVSQVRFX0FMTF9PUFRJT05fTE9ORy5lcXVhbHNJZ25vcmVDYXNlKG9wdGlvblR5cGUpIHx8Ci0gICAgICAgICAgICAgICAgICAgIFdTREwySmF2YUNvbnN0YW50cy5HRU5FUkFURV9TRVJWSUNFX0RFU0NSSVBUSU9OX09QVElPTi5lcXVhbHNJZ25vcmVDYXNlKG9wdGlvblR5cGUpIHx8Ci0gICAgICAgICAgICAgICAgICAgIFdTREwySmF2YUNvbnN0YW50cy5HRU5FUkFURV9TRVJWSUNFX0RFU0NSSVBUSU9OX09QVElPTl9MT05HLmVxdWFsc0lnbm9yZUNhc2Uob3B0aW9uVHlwZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgV1NETDJKYXZhQ29uc3RhbnRzLkdFTkVSQVRFX1RFU1RfQ0FTRV9PUFRJT04uZXF1YWxzSWdub3JlQ2FzZShvcHRpb25UeXBlKSB8fAotICAgICAgICAgICAgICAgICAgICBXU0RMMkphdmFDb25zdGFudHMuR0VORVJBVEVfVEVTVF9DQVNFX09QVElPTl9MT05HLmVxdWFsc0lnbm9yZUNhc2Uob3B0aW9uVHlwZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgV1NETDJKYXZhQ29uc3RhbnRzLk5BTUVfU1BBQ0VfVE9fUEFDS0FHRV9PUFRJT04uZXF1YWxzSWdub3JlQ2FzZShvcHRpb25UeXBlKSB8fAotICAgICAgICAgICAgICAgICAgICBXU0RMMkphdmFDb25zdGFudHMuTkFNRV9TUEFDRV9UT19QQUNLQUdFX09QVElPTl9MT05HLmVxdWFsc0lnbm9yZUNhc2Uob3B0aW9uVHlwZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgV1NETDJKYXZhQ29uc3RhbnRzLk5PX0JVSUxEX1hNTF9PUFRJT05fTE9ORy5lcXVhbHNJZ25vcmVDYXNlKG9wdGlvblR5cGUpIHx8Ci0gICAgICAgICAgICAgICAgICAgIFdTREwySmF2YUNvbnN0YW50cy5OT19NRVNTQUdFX1JFQ0VJVkVSX09QVElPTl9MT05HLmVxdWFsc0lnbm9yZUNhc2Uob3B0aW9uVHlwZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgV1NETDJKYXZhQ29uc3RhbnRzLk5PX1dTRExTX09QVElPTl9MT05HLmVxdWFsc0lnbm9yZUNhc2Uob3B0aW9uVHlwZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgV1NETDJKYXZhQ29uc3RhbnRzLk9VVFBVVF9MT0NBVElPTl9PUFRJT04uZXF1YWxzSWdub3JlQ2FzZShvcHRpb25UeXBlKSB8fAotICAgICAgICAgICAgICAgICAgICBXU0RMMkphdmFDb25zdGFudHMuT1VUUFVUX0xPQ0FUSU9OX09QVElPTl9MT05HLmVxdWFsc0lnbm9yZUNhc2Uob3B0aW9uVHlwZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgV1NETDJKYXZhQ29uc3RhbnRzLk9WRVJSSURFX09QVElPTi5lcXVhbHNJZ25vcmVDYXNlKG9wdGlvblR5cGUpIHx8Ci0gICAgICAgICAgICAgICAgICAgIFdTREwySmF2YUNvbnN0YW50cy5PVkVSUklERV9PUFRJT05fTE9ORy5lcXVhbHNJZ25vcmVDYXNlKG9wdGlvblR5cGUpIHx8Ci0gICAgICAgICAgICAgICAgICAgIFdTREwySmF2YUNvbnN0YW50cy5FWENFUFRJT05fQkFTRV9DTEFTU19PUFRJT04uZXF1YWxzSWdub3JlQ2FzZShvcHRpb25UeXBlKSB8fAotICAgICAgICAgICAgICAgICAgICBXU0RMMkphdmFDb25zdGFudHMuRVhDRVBUSU9OX0JBU0VfQ0xBU1NfT1BUSU9OX0xPTkcuZXF1YWxzSWdub3JlQ2FzZShvcHRpb25UeXBlKSB8fAotICAgICAgICAgICAgICAgICAgICBXU0RMMkphdmFDb25zdGFudHMuT1ZFUlJJREVfQUJTT0xVVEVfQUREUkVTU19PUFRJT04uZXF1YWxzSWdub3JlQ2FzZShvcHRpb25UeXBlKSB8fAotICAgICAgICAgICAgICAgICAgICBXU0RMMkphdmFDb25zdGFudHMuT1ZFUlJJREVfQUJTT0xVVEVfQUREUkVTU19PUFRJT05fTE9ORy5lcXVhbHNJZ25vcmVDYXNlKG9wdGlvblR5cGUpIHx8Ci0gICAgICAgICAgICAgICAgICAgIFdTREwySmF2YUNvbnN0YW50cy5QQUNLQUdFX09QVElPTi5lcXVhbHNJZ25vcmVDYXNlKG9wdGlvblR5cGUpIHx8Ci0gICAgICAgICAgICAgICAgICAgIFdTREwySmF2YUNvbnN0YW50cy5QQUNLQUdFX09QVElPTl9MT05HLmVxdWFsc0lnbm9yZUNhc2Uob3B0aW9uVHlwZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgV1NETDJKYXZhQ29uc3RhbnRzLlBPUlRfTkFNRV9PUFRJT04uZXF1YWxzSWdub3JlQ2FzZShvcHRpb25UeXBlKSB8fAotICAgICAgICAgICAgICAgICAgICBXU0RMMkphdmFDb25zdGFudHMuUE9SVF9OQU1FX09QVElPTl9MT05HLmVxdWFsc0lnbm9yZUNhc2Uob3B0aW9uVHlwZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgV1NETDJKYXZhQ29uc3RhbnRzLlJFUE9TSVRPUllfUEFUSF9PUFRJT04uZXF1YWxzSWdub3JlQ2FzZShvcHRpb25UeXBlKSB8fAotICAgICAgICAgICAgICAgICAgICBXU0RMMkphdmFDb25zdGFudHMuUkVQT1NJVE9SWV9QQVRIX09QVElPTl9MT05HLmVxdWFsc0lnbm9yZUNhc2Uob3B0aW9uVHlwZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgV1NETDJKYXZhQ29uc3RhbnRzLlJFU09VUkNFX0ZPTERFUl9PUFRJT04uZXF1YWxzSWdub3JlQ2FzZShvcHRpb25UeXBlKSB8fAotICAgICAgICAgICAgICAgICAgICBXU0RMMkphdmFDb25zdGFudHMuUkVTT1VSQ0VfRk9MREVSX09QVElPTl9MT05HLmVxdWFsc0lnbm9yZUNhc2Uob3B0aW9uVHlwZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgV1NETDJKYXZhQ29uc3RhbnRzLlNFUlZFUl9TSURFX0NPREVfT1BUSU9OLmVxdWFsc0lnbm9yZUNhc2Uob3B0aW9uVHlwZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgV1NETDJKYXZhQ29uc3RhbnRzLlNFUlZFUl9TSURFX0NPREVfT1BUSU9OX0xPTkcuZXF1YWxzSWdub3JlQ2FzZShvcHRpb25UeXBlKSB8fAotICAgICAgICAgICAgICAgICAgICBXU0RMMkphdmFDb25zdGFudHMuU0VSVkVSX1NJREVfSU5URVJGQUNFX09QVElPTi5lcXVhbHNJZ25vcmVDYXNlKG9wdGlvblR5cGUpIHx8Ci0gICAgICAgICAgICAgICAgICAgIFdTREwySmF2YUNvbnN0YW50cy5TRVJWRVJfU0lERV9JTlRFUkZBQ0VfT1BUSU9OX0xPTkcuZXF1YWxzSWdub3JlQ2FzZShvcHRpb25UeXBlKSB8fAotICAgICAgICAgICAgICAgICAgICBXU0RMMkphdmFDb25zdGFudHMuU0VSVklDRV9OQU1FX09QVElPTi5lcXVhbHNJZ25vcmVDYXNlKG9wdGlvblR5cGUpIHx8Ci0gICAgICAgICAgICAgICAgICAgIFdTREwySmF2YUNvbnN0YW50cy5TRVJWSUNFX05BTUVfT1BUSU9OX0xPTkcuZXF1YWxzSWdub3JlQ2FzZShvcHRpb25UeXBlKSB8fAotICAgICAgICAgICAgICAgICAgICBXU0RMMkphdmFDb25zdGFudHMuU09VUkNFX0ZPTERFUl9OQU1FX09QVElPTi5lcXVhbHNJZ25vcmVDYXNlKG9wdGlvblR5cGUpIHx8Ci0gICAgICAgICAgICAgICAgICAgIFdTREwySmF2YUNvbnN0YW50cy5TT1VSQ0VfRk9MREVSX05BTUVfT1BUSU9OX0xPTkcuZXF1YWxzSWdub3JlQ2FzZShvcHRpb25UeXBlKSB8fAotICAgICAgICAgICAgICAgICAgICBXU0RMMkphdmFDb25zdGFudHMuU1RVQl9MQU5HVUFHRV9PUFRJT04uZXF1YWxzSWdub3JlQ2FzZShvcHRpb25UeXBlKSB8fAotICAgICAgICAgICAgICAgICAgICBXU0RMMkphdmFDb25zdGFudHMuU1RVQl9MQU5HVUFHRV9PUFRJT05fTE9ORy5lcXVhbHNJZ25vcmVDYXNlKG9wdGlvblR5cGUpIHx8Ci0gICAgICAgICAgICAgICAgICAgIFdTREwySmF2YUNvbnN0YW50cy5TVVBQUkVTU19QUkVGSVhFU19PUFRJT04uZXF1YWxzSWdub3JlQ2FzZShvcHRpb25UeXBlKSB8fAotICAgICAgICAgICAgICAgICAgICBXU0RMMkphdmFDb25zdGFudHMuU1VQUFJFU1NfUFJFRklYRVNfT1BUSU9OX0xPTkcuZXF1YWxzSWdub3JlQ2FzZShvcHRpb25UeXBlKSB8fAotICAgICAgICAgICAgICAgICAgICBXU0RMMkphdmFDb25zdGFudHMuVU5QQUNLX0NMQVNTRVNfT1BUSU9OLmVxdWFsc0lnbm9yZUNhc2Uob3B0aW9uVHlwZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgV1NETDJKYXZhQ29uc3RhbnRzLlVOUEFDS19DTEFTU0VTX09QVElPTl9MT05HLmVxdWFsc0lnbm9yZUNhc2Uob3B0aW9uVHlwZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgV1NETDJKYXZhQ29uc3RhbnRzLlVOV1JBUF9QQVJBTUVURVJTLmVxdWFsc0lnbm9yZUNhc2Uob3B0aW9uVHlwZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgV1NETDJKYXZhQ29uc3RhbnRzLlVOV1JBUF9QQVJBTUVURVJTX0xPTkcuZXF1YWxzSWdub3JlQ2FzZShvcHRpb25UeXBlKSB8fAotICAgICAgICAgICAgICAgICAgICBXU0RMMkphdmFDb25zdGFudHMuV1NETF9MT0NBVElPTl9VUklfT1BUSU9OLmVxdWFsc0lnbm9yZUNhc2Uob3B0aW9uVHlwZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgV1NETDJKYXZhQ29uc3RhbnRzLldTRExfVkVSU0lPTl9PUFRJT04uZXF1YWxzSWdub3JlQ2FzZShvcHRpb25UeXBlKSB8fAotICAgICAgICAgICAgICAgICAgICBXU0RMMkphdmFDb25zdGFudHMuV1NETF9WRVJTSU9OX09QVElPTl9MT05HLmVxdWFsc0lnbm9yZUNhc2Uob3B0aW9uVHlwZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgV1NETDJKYXZhQ29uc3RhbnRzLkhUVFBfUFJPWFlfSE9TVF9PUFRJT05fTE9ORy5lcXVhbHNJZ25vcmVDYXNlKG9wdGlvblR5cGUpIHx8Ci0gICAgICAgICAgICAgICAgICAgIFdTREwySmF2YUNvbnN0YW50cy5IVFRQX1BST1hZX1BPUlRfT1BUSU9OX0xPTkcuZXF1YWxzSWdub3JlQ2FzZShvcHRpb25UeXBlKSB8fAotICAgICAgICAgICAgICAgICAgICBXU0RMMkphdmFDb25zdGFudHMuRVhDTFVERV9QQUtBR0VTX09QVElPTi5lcXVhbHNJZ25vcmVDYXNlKG9wdGlvblR5cGUpIHx8Ci0gICAgICAgICAgICAgICAgICAgIFdTREwySmF2YUNvbnN0YW50cy5FWENMVURFX1BBS0FHRVNfT1BUSU9OX0xPTkcuZXF1YWxzSWdub3JlQ2FzZShvcHRpb25UeXBlKSB8fAotICAgICAgICAgICAgICAgICAgICBXU0RMMkphdmFDb25zdGFudHMuU0tFTFRPTl9JTlRFUkZBQ0VfTkFNRV9PUFRJT04uZXF1YWxzSWdub3JlQ2FzZShvcHRpb25UeXBlKSB8fAotICAgICAgICAgICAgICAgICAgICBXU0RMMkphdmFDb25zdGFudHMuU0tFTFRPTl9JTlRFUkZBQ0VfTkFNRV9PUFRJT05fTE9ORy5lcXVhbHNJZ25vcmVDYXNlKG9wdGlvblR5cGUpIHx8Ci0gICAgICAgICAgICAgICAgICAgIFdTREwySmF2YUNvbnN0YW50cy5TS0VMVE9OX0NMQVNTX05BTUVfT1BUSU9OLmVxdWFsc0lnbm9yZUNhc2Uob3B0aW9uVHlwZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgV1NETDJKYXZhQ29uc3RhbnRzLlNLRUxUT05fQ0xBU1NfTkFNRV9PUFRJT05fTE9ORy5lcXVhbHNJZ25vcmVDYXNlKG9wdGlvblR5cGUpIHx8Ci0gICAgICAgICAgICAgICAgICAgIFdTREwySmF2YUNvbnN0YW50cy5VU0VfT1BFUkFUSU9OX05BTUUuZXF1YWxzSWdub3JlQ2FzZShvcHRpb25UeXBlKSB8fAotICAgICAgICAgICAgICAgICAgICBXU0RMMkphdmFDb25zdGFudHMuVVNFX09QRVJBVElPTl9OQU1FX0xPTkcuZXF1YWxzSWdub3JlQ2FzZShvcHRpb25UeXBlKSB8fAotICAgICAgICAgICAgICAgICAgICBYTUxCZWFuc0V4dGVuc2lvbi5YU0RDT05GSUdfT1BUSU9OLmVxdWFsc0lnbm9yZUNhc2Uob3B0aW9uVHlwZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgWE1MQmVhbnNFeHRlbnNpb24uWFNEQ09ORklHX09QVElPTl9MT05HLmVxdWFsc0lnbm9yZUNhc2Uob3B0aW9uVHlwZSkKLSAgICAgICAgICAgICk7Ci0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBpbnZhbGlkOwotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdXRpbC9YU0xUSW5jbHVkZVJlc29sdmVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdXRpbC9YU0xUSW5jbHVkZVJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5YTQ0N2MuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL3V0aWwvWFNMVEluY2x1ZGVSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi53c2RsLnV0aWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5Db2RlR2VuQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuaTE4bi5Db2RlZ2VuTWVzc2FnZXM7Ci0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVVJJUmVzb2x2ZXI7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtU291cmNlOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotcHVibGljIGNsYXNzIFhTTFRJbmNsdWRlUmVzb2x2ZXIgaW1wbGVtZW50cyBVUklSZXNvbHZlciwgQ29uc3RhbnRzIHsKLQotICAgIHByaXZhdGUgQ29kZUdlbkNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVNUFRZX1RFTVBMQVRFID0gIjx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPVwiMS4wXCIgeG1sbnM6eHNsPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtXCIvPiI7Ci0KLSAgICBwdWJsaWMgWFNMVEluY2x1ZGVSZXNvbHZlcigpIHsKLSAgICB9Ci0KLSAgICAvKiogQHBhcmFtIGNvbmZpZyAgKi8KLSAgICBwdWJsaWMgWFNMVEluY2x1ZGVSZXNvbHZlcihDb2RlR2VuQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLSAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uID0gY29uZmlnOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogUmVzb2x2ZXMgYSBnaXZlbiBocmVmIGFuZCBiYXNlIGNvbWJpbmF0aW9uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaHJlZgotICAgICAqIEBwYXJhbSBiYXNlCi0gICAgICogQHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBTb3VyY2UgcmVzb2x2ZShTdHJpbmcgaHJlZiwgU3RyaW5nIGJhc2UpIHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyB0ZW1wbGF0ZU5hbWU7Ci0gICAgICAgIE1hcCBleHRlcm5hbFByb3BlcnR5TWFwID0gY29uZmlndXJhdGlvbi5nZXRQcm9wZXJ0aWVzKCk7Ci0KLSAgICAgICAgSW5wdXRTdHJlYW0gc3VwcG9ydGVyVGVtcGxhdGVTdHJlYW07Ci0gICAgICAgIGlmIChYU0xUX0lOQ0xVREVfREFUQUJJTkRfU1VQUE9SVEVSX0hSRUZfS0VZLmVxdWFscyhocmVmKSkgewotICAgICAgICAgICAgLy91c2UgdGhlIGxhbmd1YWdlIG5hbWUgZnJvbSB0aGUgY29uZmlndXJhdGlvbiB0byBzZWFyY2ggdGhlIGtleQotICAgICAgICAgICAgLy9vdXIgc2VhcmNoIG9ubHkgY29uc2lzdHMgb2YgbG9va2luZyBmb3IgdGhlIGRhdGEgYmluZGluZyBuYW1lCi0gICAgICAgICAgICAvL2luIHRoZSBrZXkKLSAgICAgICAgICAgIE1hcCBkYlN1cHBvcnRlck1hcCA9IENvbmZpZ1Byb3BlcnR5RmlsZUxvYWRlci5nZXREYlN1cHBvcnRlclRlbXBsYXRlc01hcCgpOwotICAgICAgICAgICAgU3RyaW5nIGtleTsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3Iga2V5cyA9IGRiU3VwcG9ydGVyTWFwLmtleVNldCgpLml0ZXJhdG9yKCk7IGtleXMuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIGtleSA9IChTdHJpbmcpa2V5cy5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKGtleS5pbmRleE9mKGNvbmZpZ3VyYXRpb24uZ2V0RGF0YWJpbmRpbmdUeXBlKCkpICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRTb3VyY2VGcm9tVGVtcGxhdGVOYW1lKChTdHJpbmcpZGJTdXBwb3J0ZXJNYXAuZ2V0KGtleSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChYU0xUX0lOQ0xVREVfVEVTVF9PQkpFQ1RfSFJFRl9LRVkuZXF1YWxzKChocmVmKSkpIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRTb3VyY2VGcm9tVGVtcGxhdGVOYW1lKENvbmZpZ1Byb3BlcnR5RmlsZUxvYWRlci5nZXRUZXN0T2JqZWN0VGVtcGxhdGVOYW1lKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGV4dGVybmFsUHJvcGVydHlNYXAuZ2V0KGhyZWYpICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRlbXBsYXRlTmFtZSA9IGV4dGVybmFsUHJvcGVydHlNYXAuZ2V0KGhyZWYpLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICBpZiAodGVtcGxhdGVOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzdXBwb3J0ZXJUZW1wbGF0ZVN0cmVhbSA9IGdldENsYXNzKCkuZ2V0UmVzb3VyY2VBc1N0cmVhbSh0ZW1wbGF0ZU5hbWUpOwotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3RyZWFtU291cmNlKHN1cHBvcnRlclRlbXBsYXRlU3RyZWFtKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmICgoaHJlZiAhPSBudWxsKSAmJiAoIWhyZWYuZXF1YWxzKCJleHRlcm5hbFRlbXBsYXRlIikpKXsKLSAgICAgICAgICAgIFNvdXJjZSBzb3VyY2UgPSBnZXRTb3VyY2VGcm9tVGVtcGxhdGVOYW1lKGhyZWYpOwotICAgICAgICAgICAgaWYgKChzb3VyY2UgIT0gbnVsbCkgJiYgKChTdHJlYW1Tb3VyY2Upc291cmNlKS5nZXRJbnB1dFN0cmVhbSgpICE9IG51bGwpewotICAgICAgICAgICAgICAgIHJldHVybiBzb3VyY2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZ2V0RW1wdHlTb3VyY2UoKTsKLSAgICAgICAgfQotICAgICAgICAvL2lmIG5vdGhpbmcgY291bGQgYmUgZm91bmQgcmV0dXJuIGFuIGVtcHR5IHNvdXJjZQotICAgICAgICByZXR1cm4gZ2V0RW1wdHlTb3VyY2UoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBsb2FkIHRoZSB0ZW1wbGF0ZSBmcm9tIGEgZ2l2ZW4gcmVzb3VyY2UgcGF0aAotICAgICAqCi0gICAgICogQHBhcmFtIHRlbXBsYXRlTmFtZQotICAgICAqIEByZXR1cm4gdGhlIGxvYWRlZCB0cmFuc2Zvcm0gc291cmNlCi0gICAgICogQHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgU291cmNlIGdldFNvdXJjZUZyb21UZW1wbGF0ZU5hbWUoU3RyaW5nIHRlbXBsYXRlTmFtZSkgdGhyb3dzIFRyYW5zZm9ybWVyRXhjZXB0aW9uIHsKLSAgICAgICAgSW5wdXRTdHJlYW0gc3VwcG9ydGVyVGVtcGxhdGVTdHJlYW07Ci0gICAgICAgIGlmICh0ZW1wbGF0ZU5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgc3VwcG9ydGVyVGVtcGxhdGVTdHJlYW0gPSBnZXRDbGFzcygpLmdldFJlc291cmNlQXNTdHJlYW0odGVtcGxhdGVOYW1lKTsKLSAgICAgICAgICAgIHJldHVybiBuZXcgU3RyZWFtU291cmNlKHN1cHBvcnRlclRlbXBsYXRlU3RyZWFtKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBUcmFuc2Zvcm1lckV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgQ29kZWdlbk1lc3NhZ2VzLmdldE1lc3NhZ2UoInJlc29sdmVyLnRlbXBsYXRlTm90Rm91bmQiLCB0ZW1wbGF0ZU5hbWUpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIHJldHVybnMgYW4gZW1wdHkgc291cmNlCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHN0cmVhbSBzb3VyY2UKLSAgICAgKi8KLSAgICBwcml2YXRlIFNvdXJjZSBnZXRFbXB0eVNvdXJjZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTdHJlYW1Tb3VyY2UobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKEVNUFRZX1RFTVBMQVRFLmdldEJ5dGVzKCkpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3NjaGVtYXMvc2NoZW1hLTEueHNkIGIvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi90ZXN0LXJlc291cmNlcy9zY2hlbWFzL3NjaGVtYS0xLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDIxZTU3MS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3NjaGVtYXMvc2NoZW1hLTEueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08IS0tCi0gICAgQWRkUmVxdWVzdCBpcyBhIGNvbXBsZXggdHlwZQotLS0+Ci0KLTx4czpzY2hlbWEgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIiBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKLSAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3MuYXBhY2hlLm9yZy9zY2hlbWFzL2F4aXMyIiB4bWxucz0iaHR0cDovL3dzLmFwYWNoZS5vcmcvc2NoZW1hcy9heGlzMiIKLSAgICAgICAgICAgeG1sbnM6bnM9Imh0dHA6Ly93cy5hcGFjaGUub3JnL3NjaGVtYXMvYXhpczIiIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0iQWRkUmVxdWVzdCI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtYXhPY2N1cnM9IjEiIG1pbk9jY3Vycz0iMSIgbmFtZT0iUGFyYW1ldGVyT25lIiB0eXBlPSJ4czppbnQiLz4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtYXhPY2N1cnM9IjEiIG1pbk9jY3Vycz0iMSIgbmFtZT0iUGFyYW1ldGVyVHdvIiB0eXBlPSJ4czpzdHJpbmciLz4KLSAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotPC94czpzY2hlbWE+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi90ZXN0LXJlc291cmNlcy9zY2hlbWFzL3NjaGVtYS0yLnhzZCBiL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vdGVzdC1yZXNvdXJjZXMvc2NoZW1hcy9zY2hlbWEtMi54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1NmQ0YjguLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi90ZXN0LXJlc291cmNlcy9zY2hlbWFzL3NjaGVtYS0yLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPCEtLQotICAgIDEuIEFkZFJlcXVlc3QgaXMgb2YgQWRkUmVxdWVzdFR5cGUKLSAgICAyLiBBZGRSZXF1ZXN0VHlwZSBoYXMgYSBzZXF1ZW5jZQotLS0+Ci0KLTx4czpzY2hlbWEgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIiBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKLSAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3MuYXBhY2hlLm9yZy9zY2hlbWFzL2F4aXMyIiB4bWxucz0iaHR0cDovL3dzLmFwYWNoZS5vcmcvc2NoZW1hcy9heGlzMiIKLSAgICAgICAgICAgeG1sbnM6bnM9Imh0dHA6Ly93cy5hcGFjaGUub3JnL3NjaGVtYXMvYXhpczIiIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0iQWRkUmVxdWVzdCIgdHlwZT0iQWRkUmVxdWVzdFR5cGUiLz4KLSAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iQWRkUmVxdWVzdFR5cGUiPgotICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBtYXhPY2N1cnM9IjEiIG1pbk9jY3Vycz0iMSIgbmFtZT0iUGFyYW1ldGVyT25lIiB0eXBlPSJ4czppbnQiLz4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG1heE9jY3Vycz0iMSIgbWluT2NjdXJzPSIxIiBuYW1lPSJQYXJhbWV0ZXJUd28iIHR5cGU9InhzOnN0cmluZyIvPgotICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgIDwveHM6Y29tcGxleFR5cGU+Ci08L3hzOnNjaGVtYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3NjaGVtYXMvc2NoZW1hLTMueHNkIGIvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi90ZXN0LXJlc291cmNlcy9zY2hlbWFzL3NjaGVtYS0zLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjJhNGRiYy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3NjaGVtYXMvc2NoZW1hLTMueHNkCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTwhLS0KLSAgICAgMS4gQWRkUmVxdWVzdCBpcyBvZiBBZGRSZXF1ZXN0VHlwZQotICAgICAyLiBBZGRSZXF1ZXN0VHlwZSBleHRlbmRzIGZyb20gQWJzdHJhY3RQYXJhbWV0ZXJUeXBlCi0gICAgIDMuIEFic3RyYWN0UGFyYW1ldGVyVHlwZSBoYXMgcHJpbWl0aXZlIHR5cGVzIG9ubHkKLSAtLT4KLQotPHhzOnNjaGVtYSBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotICAgICAgICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93cy5hcGFjaGUub3JnL3NjaGVtYXMvYXhpczIiIHhtbG5zPSJodHRwOi8vd3MuYXBhY2hlLm9yZy9zY2hlbWFzL2F4aXMyIgotICAgICAgICAgICB4bWxuczpucz0iaHR0cDovL3dzLmFwYWNoZS5vcmcvc2NoZW1hcy9heGlzMiIgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJBZGRSZXF1ZXN0IiB0eXBlPSJBZGRSZXF1ZXN0VHlwZSIvPgotICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJBZGRSZXF1ZXN0VHlwZSI+Ci0gICAgICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ibnM6QWJzdHJhY3RQYXJhbWV0ZXJUeXBlIj4KLSAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2UvPgotICAgICAgICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8eHM6Y29tcGxleFR5cGUgYWJzdHJhY3Q9InRydWUiIG5hbWU9IkFic3RyYWN0UGFyYW1ldGVyVHlwZSI+Ci0gICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG1heE9jY3Vycz0iMSIgbWluT2NjdXJzPSIxIiBuYW1lPSJQYXJhbWV0ZXJPbmUiIHR5cGU9InhzOmludCIvPgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWF4T2NjdXJzPSIxIiBtaW5PY2N1cnM9IjEiIG5hbWU9IlBhcmFtZXRlclR3byIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0gICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLTwveHM6c2NoZW1hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vdGVzdC1yZXNvdXJjZXMvc2NoZW1hcy9zY2hlbWEtNC54c2QgYi92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3NjaGVtYXMvc2NoZW1hLTQueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjJkMmU3Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vdGVzdC1yZXNvdXJjZXMvc2NoZW1hcy9zY2hlbWEtNC54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTwhLS0KLSAgICAxLiBBZGRSZXF1ZXN0IGlzIG9mIEFkZFJlcXVlc3RUeXBlCi0gICAgMi4gQWRkUmVxdWVzdFR5cGUgZXh0ZW5kcyBmcm9tIEFic3RyYWN0UGFyYW1ldGVyVHlwZSBhbmQgaXQgQWRkUmVxdWVzdFR5cGUgaGFzIG1vcmUgc3R1ZmYgZGVmaW5lZCBpbiBhIHNlcXVlbmNlLCBpbgotICAgIGFkZGl0aW9uIHRvIHRoZSBleHRlbnNpb24uCi0gICAgMy4gQWJzdHJhY3RQYXJhbWV0ZXJUeXBlIGhhcyBwcmltaXRpdmUgdHlwZXMgb25seQotLS0+Ci0KLTx4czpzY2hlbWEgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIiBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKLSAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3MuYXBhY2hlLm9yZy9zY2hlbWFzL2F4aXMyIiB4bWxucz0iaHR0cDovL3dzLmFwYWNoZS5vcmcvc2NoZW1hcy9heGlzMiIKLSAgICAgICAgICAgeG1sbnM6bnM9Imh0dHA6Ly93cy5hcGFjaGUub3JnL3NjaGVtYXMvYXhpczIiIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0iQWRkUmVxdWVzdCIgdHlwZT0iQWRkUmVxdWVzdFR5cGUiLz4KLSAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iQWRkUmVxdWVzdFR5cGUiPgotICAgICAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9Im5zOkFic3RyYWN0UGFyYW1ldGVyVHlwZSI+Ci0gICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtYXhPY2N1cnM9IjEiIG1pbk9jY3Vycz0iMSIgbmFtZT0iUGFyYW1ldGVyVGhyZWUiIHR5cGU9InhzOmludCIvPgotICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtYXhPY2N1cnM9IjEiIG1pbk9jY3Vycz0iMSIgbmFtZT0iUGFyYW1ldGVyRm91ciIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPHhzOmNvbXBsZXhUeXBlIGFic3RyYWN0PSJ0cnVlIiBuYW1lPSJBYnN0cmFjdFBhcmFtZXRlclR5cGUiPgotICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBtYXhPY2N1cnM9IjEiIG1pbk9jY3Vycz0iMSIgbmFtZT0iUGFyYW1ldGVyT25lIiB0eXBlPSJ4czppbnQiLz4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG1heE9jY3Vycz0iMSIgbWluT2NjdXJzPSIxIiBuYW1lPSJQYXJhbWV0ZXJUd28iIHR5cGU9InhzOnN0cmluZyIvPgotICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgIDwveHM6Y29tcGxleFR5cGU+Ci08L3hzOnNjaGVtYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3dzZGxzL1ZlcnNpb24ud3NkbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vdGVzdC1yZXNvdXJjZXMvd3NkbHMvVmVyc2lvbi53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjU0ZWNiLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vdGVzdC1yZXNvdXJjZXMvd3NkbHMvVmVyc2lvbi53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTx3c2RsOmRlZmluaXRpb25zIHhtbG5zOm1pbWU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvbWltZS8iDQotICAgICAgICAgICAgICAgICAgeG1sbnM6bnMwPSJodHRwOi8vYXhpc3ZlcnNpb24uc2FtcGxlL3hzZCINCi0gICAgICAgICAgICAgICAgICB4bWxuczpzb2FwMTI9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcDEyLyINCi0gICAgICAgICAgICAgICAgICB4bWxuczpodHRwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL2h0dHAvIg0KLSAgICAgICAgICAgICAgICAgIHhtbG5zOm5zMT0iaHR0cDovL29yZy5hcGFjaGUuYXhpczIveHNkIg0KLSAgICAgICAgICAgICAgICAgIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSINCi0gICAgICAgICAgICAgICAgICB4bWxuczp3c2F3PSJodHRwOi8vd3d3LnczLm9yZy8yMDA2LzA1L2FkZHJlc3Npbmcvd3NkbCINCi0gICAgICAgICAgICAgICAgICB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIg0KLSAgICAgICAgICAgICAgICAgIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIg0KLSAgICAgICAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2F4aXN2ZXJzaW9uLnNhbXBsZS94c2QiPg0KLSAgPHdzZGw6dHlwZXM+DQotICAgIDx4czpzY2hlbWEgeG1sbnM6bnM9Imh0dHA6Ly9heGlzdmVyc2lvbi5zYW1wbGUveHNkIiBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0icXVhbGlmaWVkIg0KLSAgICAgICAgICAgICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2F4aXN2ZXJzaW9uLnNhbXBsZS94c2QiPg0KLSAgICAgIDx4czplbGVtZW50IG5hbWU9IkV4Y2VwdGlvbkZhdWx0Ij4NCi0gICAgICAgIDx4czpjb21wbGV4VHlwZT4NCi0gICAgICAgICAgPHhzOnNlcXVlbmNlPg0KLSAgICAgICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRXhjZXB0aW9uIiBuaWxsYWJsZT0idHJ1ZSINCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4czphbnlUeXBlIi8+DQotICAgICAgICAgIDwveHM6c2VxdWVuY2U+DQotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPg0KLSAgICAgIDwveHM6ZWxlbWVudD4NCi0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJnZXRWZXJzaW9uUmVzcG9uc2UiPg0KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPg0KLSAgICAgICAgICA8eHM6c2VxdWVuY2U+DQotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZXR1cm4iIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4czpzdHJpbmciLz4NCi0gICAgICAgICAgPC94czpzZXF1ZW5jZT4NCi0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+DQotICAgICAgPC94czplbGVtZW50Pg0KLSAgICA8L3hzOnNjaGVtYT4NCi0gIDwvd3NkbDp0eXBlcz4NCi0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0iZ2V0VmVyc2lvblJlcXVlc3QiLz4NCi0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0iZ2V0VmVyc2lvblJlc3BvbnNlIj4NCi0gICAgPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJuczA6Z2V0VmVyc2lvblJlc3BvbnNlIi8+DQotICA8L3dzZGw6bWVzc2FnZT4NCi0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0iZ2V0VmVyc2lvbkZhdWx0Ij4NCi0gICAgPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJuczA6RXhjZXB0aW9uRmF1bHQiLz4NCi0gIDwvd3NkbDptZXNzYWdlPg0KLSAgPHdzZGw6cG9ydFR5cGUgbmFtZT0iVmVyc2lvblBvcnRUeXBlIj4NCi0gICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImdldFZlcnNpb24iPg0KLSAgICAgIDx3c2RsOmlucHV0IG1lc3NhZ2U9Im5zMDpnZXRWZXJzaW9uUmVxdWVzdCIgd3NhdzpBY3Rpb249InVybjpnZXRWZXJzaW9uIi8+DQotICAgICAgPHdzZGw6b3V0cHV0IG1lc3NhZ2U9Im5zMDpnZXRWZXJzaW9uUmVzcG9uc2UiIHdzYXc6QWN0aW9uPSJ1cm46Z2V0VmVyc2lvblJlc3BvbnNlIi8+DQotICAgICAgPHdzZGw6ZmF1bHQgbWVzc2FnZT0ibnMwOmdldFZlcnNpb25GYXVsdCIgbmFtZT0iZ2V0VmVyc2lvbkZhdWx0Ig0KLSAgICAgICAgICAgICAgICAgIHdzYXc6QWN0aW9uPSJ1cm46Z2V0VmVyc2lvbkZhdWx0Ii8+DQotICAgIDwvd3NkbDpvcGVyYXRpb24+DQotDQotICAgIDwhLS0gVGhpcyBzaG91bGQgdHVybiBpbnRvICJmb29CYXIoKSIgLS0+DQotICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJmb28tYmFyIj4NCi0gICAgICA8d3NkbDppbnB1dCBtZXNzYWdlPSJnZXRWZXJzaW9uUmVxdWVzdCIvPg0KLSAgICA8L3dzZGw6b3BlcmF0aW9uPg0KLQ0KLSAgICA8IS0tIFRoaXMgc2hvdWxkIHR1cm4gaW50byAiZm9vQmFSMigpIiAtLT4NCi0gICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9IkZvby1iYS5yMiI+DQotICAgICAgPHdzZGw6aW5wdXQgbWVzc2FnZT0iZ2V0VmVyc2lvblJlcXVlc3QiLz4NCi0gICAgPC93c2RsOm9wZXJhdGlvbj4NCi0NCi0gIDwvd3NkbDpwb3J0VHlwZT4NCi0gIDx3c2RsOmJpbmRpbmcgbmFtZT0iVmVyc2lvblNPQVAxMUJpbmRpbmciIHR5cGU9Im5zMDpWZXJzaW9uUG9ydFR5cGUiPg0KLSAgICA8c29hcDpiaW5kaW5nIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIiBzdHlsZT0iZG9jdW1lbnQiLz4NCi0gICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImdldFZlcnNpb24iPg0KLSAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46Z2V0VmVyc2lvbiIgc3R5bGU9ImRvY3VtZW50Ii8+DQotICAgICAgPHdzZGw6aW5wdXQ+DQotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgIDwvd3NkbDppbnB1dD4NCi0gICAgICA8d3NkbDpvdXRwdXQ+DQotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgIDwvd3NkbDpvdXRwdXQ+DQotICAgICAgPHdzZGw6ZmF1bHQgbmFtZT0iZ2V0VmVyc2lvbkZhdWx0Ij4NCi0gICAgICAgIDxzb2FwOmZhdWx0IHVzZT0ibGl0ZXJhbCIgbmFtZT0iZ2V0VmVyc2lvbkZhdWx0Ii8+DQotICAgICAgPC93c2RsOmZhdWx0Pg0KLSAgICA8L3dzZGw6b3BlcmF0aW9uPg0KLSAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iZm9vLWJhciI+DQotICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjpmb28tYmFyIiBzdHlsZT0iZG9jdW1lbnQiLz4NCi0gICAgICA8d3NkbDppbnB1dD4NCi0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgPC93c2RsOmlucHV0Pg0KLSAgICA8L3dzZGw6b3BlcmF0aW9uPg0KLSAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iRm9vLWJhLnIyIj4NCi0gICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOmZvby1iYXIiIHN0eWxlPSJkb2N1bWVudCIvPg0KLSAgICAgIDx3c2RsOmlucHV0Pg0KLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4NCi0gICAgICA8L3dzZGw6aW5wdXQ+DQotICAgIDwvd3NkbDpvcGVyYXRpb24+DQotDQotICA8L3dzZGw6YmluZGluZz4NCi0gIDx3c2RsOnNlcnZpY2UgbmFtZT0iVmVyc2lvbiI+DQotICAgIDx3c2RsOnBvcnQgbmFtZT0iVmVyc2lvblNPQVAxMXBvcnRfaHR0cCIgYmluZGluZz0ibnMwOlZlcnNpb25TT0FQMTFCaW5kaW5nIj4NCi0gICAgICA8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vMTI3LjAuMC4xOjgwMDAvYXhpczIvc2VydmljZXMvVmVyc2lvbiIvPg0KLSAgICA8L3dzZGw6cG9ydD4NCi0gIDwvd3NkbDpzZXJ2aWNlPg0KLTwvd3NkbDpkZWZpbml0aW9ucz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3htbHMvTXVsdGlEaW1BcnJheS54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3htbHMvTXVsdGlEaW1BcnJheS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0ZTBiZDguLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi90ZXN0LXJlc291cmNlcy94bWxzL011bHRpRGltQXJyYXkueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08d3JhcHBlcj4KLSAgICA8aXRlbT4KLSAgICAgICAgPGlubmVyPm9uZTwvaW5uZXI+Ci0gICAgICAgIDxpbm5lcj50d288L2lubmVyPgotICAgIDwvaXRlbT4KLSAgICA8aXRlbT4KLSAgICAgICAgPGlubmVyPjE8L2lubmVyPgotICAgICAgICA8aW5uZXI+MjwvaW5uZXI+Ci0gICAgICAgIDxpbm5lcj4zPC9pbm5lcj4KLSAgICA8L2l0ZW0+Ci08L3dyYXBwZXI+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi90ZXN0LXJlc291cmNlcy94bWxzL2F4aXMyLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vdGVzdC1yZXNvdXJjZXMveG1scy9heGlzMi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjZmRjZDQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi90ZXN0LXJlc291cmNlcy94bWxzL2F4aXMyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGF4aXNjb25maWcgbmFtZT0iQXhpc0phdmEyLjAiPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIFBhcmFtZXRlcnMgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iZW5hYmxlTVRPTSI+ZmFsc2U8L3BhcmFtZXRlcj4KLQotICAgIDxwYXJhbWV0ZXIgbmFtZT0idXNlck5hbWUiPmFkbWluPC9wYXJhbWV0ZXI+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJwYXNzd29yZCI+YXhpczI8L3BhcmFtZXRlcj4KLQotICAgIDxwYXJhbWV0ZXIgbmFtZT0ic2VyYWxpemVMb2NhdGlvbiI+LjwvcGFyYW1ldGVyPgotCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gTWVzc2FnZSBSZWNlaXZlcnMgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gVGhpcyBpcyB0aGUgRGVhZnVsdCBNZXNzYWdlIFJlY2VpdmVyIGZvciB0aGUgUmVxdWVzdCBSZXNwb25zZSBzdHlsZSBPcGVyYXRpb25zIC0tPgotICAgIDxtZXNzYWdlUmVjZWl2ZXIgbWVwPSJJTk9VVCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLlJhd1hNTElOT3V0TWVzc2FnZVJlY2VpdmVyIi8+Ci0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBUcmFuc3BvcnQgT3V0cyAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0KLSAgICA8dHJhbnNwb3J0U2VuZGVyIG5hbWU9ImxvY2FsIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQubG9jYWwuTG9jYWxUcmFuc3BvcnRTZW5kZXIiLz4KLQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIFBoYXNlcyAgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDxwaGFzZU9yZGVyIHR5cGU9IkluRmxvdyI+Ci0gICAgICAgIDwhLS0gIFN5c3RlbSBwcmUgZGVmaW5lZCBwaGFzZXMgICAgICAgLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJUcmFuc3BvcnRJbiIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iUHJlRGlzcGF0Y2giLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9IkRpc3BhdGNoIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuRGlzcGF0Y2hQaGFzZSI+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJBZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciIvPgotCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJSZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciIvPgotCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciIvPgotCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiLz4KLSAgICAgICAgPC9waGFzZT4KLSAgICAgICAgPCEtLSAgU3lzdGVtIHByZSBkZWZpbmVkIHBoYXNlcyAgICAgICAtLT4KLSAgICAgICAgPCEtLSAgIEFmdGVyIFBvc3RkaXNwYXRjaCBwaGFzZSBtb2R1bGUgYXV0aG9yIG9yIG9yIHNlcnZpY2UgYXV0aG9yIGNhbiBhZGQgYW55IHBoYXNlIGhlIHdhbnQgICAgICAtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9InVzZXJwaGFzZTEiLz4KLSAgICA8L3BoYXNlT3JkZXI+Ci0gICAgPHBoYXNlT3JkZXIgdHlwZT0iT3V0RmxvdyI+Ci0gICAgICAgIDwhLS0gICAgICB1c2VyIGNhbiBhZGQgaGlzIG93biBwaGFzZXMgdG8gdGhpcyBhcmVhICAtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9InVzZXJwaGFzZTEiLz4KLSAgICAgICAgPCEtLXN5c3RlbSBwcmVkZWZpbmVkIHBoYXNlLS0+Ci0gICAgICAgIDwhLS10aGVzZSBwaGFzZSB3aWxsIHJ1biBpcnJlc3BlY3RpdmUgb2YgdGhlIHNlcnZpY2UtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlBvbGljeURldGVybWluYXRpb24iLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik1lc3NhZ2VPdXQiLz4KLSAgICA8L3BoYXNlT3JkZXI+Ci0gICAgPHBoYXNlT3JkZXIgdHlwZT0iSW5GYXVsdEZsb3ciPgotICAgICAgICA8IS0tICAgICAgdXNlciBjYW4gYWRkIGhpcyBvd24gcGhhc2VzIHRvIHRoaXMgYXJlYSAgLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJ1c2VycGhhc2UxIi8+Ci0gICAgPC9waGFzZU9yZGVyPgotICAgIDxwaGFzZU9yZGVyIHR5cGU9Ik91dEZhdWx0RmxvdyI+Ci0gICAgICAgIDwhLS0gICAgICB1c2VyIGNhbiBhZGQgaGlzIG93biBwaGFzZXMgdG8gdGhpcyBhcmVhICAtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9InVzZXJwaGFzZTEiLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlBvbGljeURldGVybWluYXRpb24iLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik1lc3NhZ2VPdXQiLz4KLSAgICA8L3BoYXNlT3JkZXI+Ci08L2F4aXNjb25maWc+Ci0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvV1NETFNlcnZpY2VCdWlsZGVyVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvd3NkbC9XU0RMU2VydmljZUJ1aWxkZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2YThkNzUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvd3NkbC9XU0RMU2VydmljZUJ1aWxkZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIud3NkbDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uV1NETDExVG9BeGlzU2VydmljZUJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuTGlzdGVuZXJNYW5hZ2VyOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLQotcHVibGljIGNsYXNzIFdTRExTZXJ2aWNlQnVpbGRlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwcml2YXRlIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQ7Ci0gICAgTGlzdGVuZXJNYW5hZ2VyIGxtOwotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgY29uZmlnQ29udGV4dCA9Ci0gICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5LmNyZWF0ZUNvbmZpZ3VyYXRpb25Db250ZXh0RnJvbUZpbGVTeXN0ZW0obnVsbCwgbnVsbCk7Ci0gICAgICAgIGxtID0gbmV3IExpc3RlbmVyTWFuYWdlcigpOwotICAgICAgICBsbS5pbml0KGNvbmZpZ0NvbnRleHQpOwotICAgICAgICBsbS5zdGFydCgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIGNvbmZpZ0NvbnRleHQudGVybWluYXRlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFdTRExDbGllbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgRmlsZSB0ZXN0UmVzb3VyY2VGaWxlID0gbmV3IEZpbGUoInRhcmdldC90ZXN0LWNsYXNzZXMiKTsKLSAgICAgICAgRmlsZSBvdXRMb2NhdGlvbiA9IG5ldyBGaWxlKCJ0YXJnZXQvdGVzdC1yZXNvdXJjZXMiKTsKLSAgICAgICAgb3V0TG9jYXRpb24ubWtkaXJzKCk7Ci0gICAgICAgIGlmICh0ZXN0UmVzb3VyY2VGaWxlLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICBGaWxlIGZpbGVzIFtdID0gdGVzdFJlc291cmNlRmlsZS5saXN0RmlsZXMoKTsKLSAgICAgICAgICAgIGZvciAoRmlsZSBmaWxlMSA6IGZpbGVzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGZpbGUxLmlzRmlsZSgpICYmIGZpbGUxLmdldE5hbWUoKS5lbmRzV2l0aCgiLndzZGwiKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZTEuZ2V0TmFtZSgpLmVxdWFscygicGluZy1tb2RpZmllZC53c2RsIikgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUxLmdldE5hbWUoKS5lcXVhbHMoInBpbmctdW5ib3VuZC53c2RsIikgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUxLmdldE5hbWUoKS5lcXVhbHMoIndzYXQud3NkbCIpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaWxlMS5nZXROYW1lKCkuZXF1YWxzKCJuby1zZXJ2aWNlLndzZGwiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFdTREwxMVRvQXhpc1NlcnZpY2VCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgV1NETDExVG9BeGlzU2VydmljZUJ1aWxkZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZTEpLCBudWxsLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2UgPSBidWlsZGVyLnBvcHVsYXRlU2VydmljZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUZXN0aW5mIGZpbGU6ICIgKyBmaWxlMS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpLmFkZFNlcnZpY2Uoc2VydmljZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBPdXRwdXRTdHJlYW0gb3V0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGVPdXRwdXRTdHJlYW0obmV3IEZpbGUob3V0TG9jYXRpb24sIGZpbGUxLmdldE5hbWUoKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZS5wcmludFdTREwob3V0LCAiaHR0cDovL2dvb2dsZS5jb20vYXhpczIvc2VydmljZXMiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dC5mbHVzaCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgb3V0LmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb25maWdDb250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCkucmVtb3ZlU2VydmljZShzZXJ2aWNlLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIGluIFdTREwgOiAiICsgZmlsZTEuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi9YTUwySmF2YU1hcHBpbmdUZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vWE1MMkphdmFNYXBwaW5nVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDc2NjcxLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi9YTUwySmF2YU1hcHBpbmdUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKg0KLSAqIENvcHlyaWdodCAoYykgMjAwNywgV1NPMiBJbmMuIChodHRwOi8vd3d3LndzbzIub3JnKSBBbGwgUmlnaHRzIFJlc2VydmVkLg0KLSAqDQotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQotDQotcHVibGljIGNsYXNzIFhNTDJKYXZhTWFwcGluZ1Rlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7DQotICAgIHB1YmxpYyB2b2lkIHRlc3RWZXJzaW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBDbGFzcyBpZmFjZSA9IENsYXNzLmZvck5hbWUoInNhbXBsZS5heGlzdmVyc2lvbi54c2QuVmVyc2lvbiIpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChpZmFjZS5nZXRNZXRob2QoImdldFZlcnNpb24iKSk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKGlmYWNlLmdldE1ldGhvZCgiZm9vQmFyIikpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChpZmFjZS5nZXRNZXRob2QoImZvb0JhUjIiKSk7DQotICAgICAgICBib29sZWFuIGNhdWdodEV4Y2VwdGlvbiA9IGZhbHNlOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBpZmFjZS5nZXRNZXRob2QoImZvb2JhcjIiKTsNCi0gICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgY2F1Z2h0RXhjZXB0aW9uID0gdHJ1ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIGFzc2VydFRydWUoIkRpZG4ndCBjYXRjaCBleHBlY3RlZCBFeGNlcHRpb24hIiwgY2F1Z2h0RXhjZXB0aW9uKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vZXh0ZW5zaW9uL1NjaGVtYVVud3JhcHBlckV4dGVuc2lvblRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi9leHRlbnNpb24vU2NoZW1hVW53cmFwcGVyRXh0ZW5zaW9uVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjhhNWQ5Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi9leHRlbnNpb24vU2NoZW1hVW53cmFwcGVyRXh0ZW5zaW9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4uZXh0ZW5zaW9uOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc01lc3NhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5Jbk91dEF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5QYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLldTRExVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLkNvZGVHZW5lcmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC51dGlsLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwudXRpbC5NZXNzYWdlUGFydEluZm9ybWF0aW9uSG9sZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hOwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hQ29sbGVjdGlvbjsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtU291cmNlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBTY2hlbWFVbndyYXBwZXJFeHRlbnNpb25UZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHJpdmF0ZSBBeGlzTWVzc2FnZSBheGlzTWVzc2FnZTsKLSAgICBwcml2YXRlIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNRVRFUl9PTkUgPSAiUGFyYW1ldGVyT25lIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1FVEVSX1RXTyA9ICJQYXJhbWV0ZXJUd28iOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTUVURVJfVEhSRUUgPSAiUGFyYW1ldGVyVGhyZWUiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTUVURVJfRk9VUiA9ICJQYXJhbWV0ZXJGb3VyIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUREX09QRVJBVElPTiA9ICJBZGQiOwotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uID0gbmV3IEluT3V0QXhpc09wZXJhdGlvbihuZXcgUU5hbWUoQUREX09QRVJBVElPTikpOwotICAgICAgICBheGlzTWVzc2FnZSA9IG5ldyBBeGlzTWVzc2FnZSgpOwotICAgICAgICBheGlzTWVzc2FnZS5zZXROYW1lKCJBZGRSZXF1ZXN0Iik7Ci0gICAgICAgIGF4aXNNZXNzYWdlLnNldEVsZW1lbnRRTmFtZShuZXcgUU5hbWUoImh0dHA6Ly93cy5hcGFjaGUub3JnL3NjaGVtYXMvYXhpczIiLCAiQWRkUmVxdWVzdCIpKTsKLSAgICAgICAgYXhpc09wZXJhdGlvbi5hZGRNZXNzYWdlKGF4aXNNZXNzYWdlLCBXU0RMQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfSU5fVkFMVUUpOwotICAgICAgICBheGlzTWVzc2FnZS5zZXRQYXJlbnQoYXhpc09wZXJhdGlvbik7Ci0KLSAgICAgICAgYXhpc1NlcnZpY2UgPSBuZXcgQXhpc1NlcnZpY2UoIkR1bW15U2VydmljZSIpOwotICAgICAgICBheGlzU2VydmljZS5hZGRPcGVyYXRpb24oYXhpc09wZXJhdGlvbik7Ci0gICAgICAgIGF4aXNPcGVyYXRpb24uc2V0UGFyZW50KGF4aXNTZXJ2aWNlKTsKLSAgICB9Ci0KLSAgICAvKiogVGhpcyByZWZlcnMgdG8gdGhlIHNjaGVtYS0xLnhzZCB3aGljaCBoYXMgYW4gQWRkUmVxdWVzdCBlbGVtZW50IHdoaWNoIGlzIG9mIGNvbXBsZXggdHlwZSAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RTY2VuYXJpb09uZSgpIHsKLSAgICAgICAgU3RyaW5nIHNjaGVtYUxvY2F0aW9uID0gInRlc3QtcmVzb3VyY2VzL3NjaGVtYXMvc2NoZW1hLTEueHNkIjsKLQotICAgICAgICBjcmVhdGVBbmRXYWxrU2NoZW1hKHNjaGVtYUxvY2F0aW9uKTsKLQotICAgICAgICBhc3NlcnRUcnVlKGF4aXNNZXNzYWdlLmdldFBhcmFtZXRlcihDb25zdGFudHMuVU5XUkFQUEVEX0tFWSkuZ2V0VmFsdWUoKSA9PSBCb29sZWFuLlRSVUUpOwotCi0gICAgICAgIFBhcmFtZXRlciBwYXJhbWV0ZXIgPSBheGlzTWVzc2FnZS5nZXRQYXJhbWV0ZXIoQ29uc3RhbnRzLlVOV1JBUFBFRF9ERVRBSUxTKTsKLSAgICAgICAgTWVzc2FnZVBhcnRJbmZvcm1hdGlvbkhvbGRlciBtZXNzYWdlUGFydEluZm9ybWF0aW9uSG9sZGVyID0KLSAgICAgICAgICAgICAgICAoTWVzc2FnZVBhcnRJbmZvcm1hdGlvbkhvbGRlcilwYXJhbWV0ZXIuZ2V0VmFsdWUoKTsKLSAgICAgICAgTGlzdCBwYXJ0c0xpc3QgPSBtZXNzYWdlUGFydEluZm9ybWF0aW9uSG9sZGVyLmdldFBhcnRzTGlzdCgpOwotCi0gICAgICAgIGFzc2VydFRydWUocGFydHNMaXN0LmNvbnRhaW5zKFdTRExVdGlsLmdldFBhcnRRTmFtZShBRERfT1BFUkFUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NETENvbnN0YW50cy5JTlBVVF9QQVJUX1FOQU1FX1NVRkZJWCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBUkFNRVRFUl9PTkUpKSk7Ci0gICAgICAgIGFzc2VydFRydWUocGFydHNMaXN0LmNvbnRhaW5zKFdTRExVdGlsLmdldFBhcnRRTmFtZShBRERfT1BFUkFUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NETENvbnN0YW50cy5JTlBVVF9QQVJUX1FOQU1FX1NVRkZJWCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBUkFNRVRFUl9UV08pKSk7Ci0gICAgICAgIGFzc2VydFRydWUocGFydHNMaXN0LnNpemUoKSA9PSAyKTsKLQotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyByZWZlcnMgdG8gdGhlIHNjaGVtYS0yLnhzZCB3aGljaCBoYXMgYW4gQWRkUmVxdWVzdCBlbGVtZW50IHdoaWNoIGlzIG9mIEFkZFJlcXVlc3RUeXBlLgotICAgICAqIEFkZFJlcXVlc3RUeXBlIGlzIGEgY29tcGxleCB0eXBlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFNjZW5hcmlvVHdvKCkgewotICAgICAgICBTdHJpbmcgc2NoZW1hTG9jYXRpb24gPSAidGVzdC1yZXNvdXJjZXMvc2NoZW1hcy9zY2hlbWEtMi54c2QiOwotCi0gICAgICAgIGNyZWF0ZUFuZFdhbGtTY2hlbWEoc2NoZW1hTG9jYXRpb24pOwotCi0gICAgICAgIGFzc2VydFRydWUoYXhpc01lc3NhZ2UuZ2V0UGFyYW1ldGVyKENvbnN0YW50cy5VTldSQVBQRURfS0VZKS5nZXRWYWx1ZSgpID09IEJvb2xlYW4uVFJVRSk7Ci0KLSAgICAgICAgUGFyYW1ldGVyIHBhcmFtZXRlciA9IGF4aXNNZXNzYWdlLmdldFBhcmFtZXRlcihDb25zdGFudHMuVU5XUkFQUEVEX0RFVEFJTFMpOwotICAgICAgICBNZXNzYWdlUGFydEluZm9ybWF0aW9uSG9sZGVyIG1lc3NhZ2VQYXJ0SW5mb3JtYXRpb25Ib2xkZXIgPQotICAgICAgICAgICAgICAgIChNZXNzYWdlUGFydEluZm9ybWF0aW9uSG9sZGVyKXBhcmFtZXRlci5nZXRWYWx1ZSgpOwotICAgICAgICBMaXN0IHBhcnRzTGlzdCA9IG1lc3NhZ2VQYXJ0SW5mb3JtYXRpb25Ib2xkZXIuZ2V0UGFydHNMaXN0KCk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZShwYXJ0c0xpc3QuY29udGFpbnMoV1NETFV0aWwuZ2V0UGFydFFOYW1lKEFERF9PUEVSQVRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU0RMQ29uc3RhbnRzLklOUFVUX1BBUlRfUU5BTUVfU1VGRklYLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFSQU1FVEVSX09ORSkpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShwYXJ0c0xpc3QuY29udGFpbnMoV1NETFV0aWwuZ2V0UGFydFFOYW1lKEFERF9PUEVSQVRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU0RMQ29uc3RhbnRzLklOUFVUX1BBUlRfUU5BTUVfU1VGRklYLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFSQU1FVEVSX1RXTykpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShwYXJ0c0xpc3Quc2l6ZSgpID09IDIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDEuIEFkZFJlcXVlc3QgaXMgb2YgQWRkUmVxdWVzdFR5cGUgMi4gQWRkUmVxdWVzdFR5cGUgZXh0ZW5kcyBmcm9tIEFic3RyYWN0UGFyYW1ldGVyVHlwZSAzLgotICAgICAqIEFic3RyYWN0UGFyYW1ldGVyVHlwZSBoYXMgcHJpbWl0aXZlIHR5cGVzIG9ubHkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2NlbmFyaW9UaHJlZSgpIHsKLSAgICAgICAgU3RyaW5nIHNjaGVtYUxvY2F0aW9uID0gInRlc3QtcmVzb3VyY2VzL3NjaGVtYXMvc2NoZW1hLTMueHNkIjsKLQotICAgICAgICBjcmVhdGVBbmRXYWxrU2NoZW1hKHNjaGVtYUxvY2F0aW9uKTsKLQotICAgICAgICBhc3NlcnRUcnVlKGF4aXNNZXNzYWdlLmdldFBhcmFtZXRlcihDb25zdGFudHMuVU5XUkFQUEVEX0tFWSkuZ2V0VmFsdWUoKSA9PSBCb29sZWFuLlRSVUUpOwotCi0gICAgICAgIFBhcmFtZXRlciBwYXJhbWV0ZXIgPSBheGlzTWVzc2FnZS5nZXRQYXJhbWV0ZXIoQ29uc3RhbnRzLlVOV1JBUFBFRF9ERVRBSUxTKTsKLSAgICAgICAgTWVzc2FnZVBhcnRJbmZvcm1hdGlvbkhvbGRlciBtZXNzYWdlUGFydEluZm9ybWF0aW9uSG9sZGVyID0KLSAgICAgICAgICAgICAgICAoTWVzc2FnZVBhcnRJbmZvcm1hdGlvbkhvbGRlcilwYXJhbWV0ZXIuZ2V0VmFsdWUoKTsKLSAgICAgICAgTGlzdCBwYXJ0c0xpc3QgPSBtZXNzYWdlUGFydEluZm9ybWF0aW9uSG9sZGVyLmdldFBhcnRzTGlzdCgpOwotCi0gICAgICAgIGFzc2VydFRydWUocGFydHNMaXN0LmNvbnRhaW5zKFdTRExVdGlsLmdldFBhcnRRTmFtZShBRERfT1BFUkFUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NETENvbnN0YW50cy5JTlBVVF9QQVJUX1FOQU1FX1NVRkZJWCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBUkFNRVRFUl9PTkUpKSk7Ci0gICAgICAgIGFzc2VydFRydWUocGFydHNMaXN0LmNvbnRhaW5zKFdTRExVdGlsLmdldFBhcnRRTmFtZShBRERfT1BFUkFUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NETENvbnN0YW50cy5JTlBVVF9QQVJUX1FOQU1FX1NVRkZJWCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBUkFNRVRFUl9UV08pKSk7Ci0gICAgICAgIGFzc2VydFRydWUocGFydHNMaXN0LnNpemUoKSA9PSAyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAxLiBBZGRSZXF1ZXN0IGlzIG9mIEFkZFJlcXVlc3RUeXBlIDIuIEFkZFJlcXVlc3RUeXBlIGV4dGVuZHMgZnJvbSBBYnN0cmFjdFBhcmFtZXRlclR5cGUgYW5kCi0gICAgICogaXQgQWRkUmVxdWVzdFR5cGUgaGFzIG1vcmUgc3R1ZmYgZGVmaW5lZCBpbiBhIHNlcXVlbmNlLCBpbiBhZGRpdGlvbiB0byB0aGUgZXh0ZW5zaW9uLiAzLgotICAgICAqIEFic3RyYWN0UGFyYW1ldGVyVHlwZSBoYXMgcHJpbWl0aXZlIHR5cGVzIG9ubHkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2NlbmFyaW9Gb3VyKCkgewotICAgICAgICBTdHJpbmcgc2NoZW1hTG9jYXRpb24gPSAidGVzdC1yZXNvdXJjZXMvc2NoZW1hcy9zY2hlbWEtNC54c2QiOwotCi0gICAgICAgIGNyZWF0ZUFuZFdhbGtTY2hlbWEoc2NoZW1hTG9jYXRpb24pOwotCi0gICAgICAgIGFzc2VydFRydWUoYXhpc01lc3NhZ2UuZ2V0UGFyYW1ldGVyKENvbnN0YW50cy5VTldSQVBQRURfS0VZKS5nZXRWYWx1ZSgpID09IEJvb2xlYW4uVFJVRSk7Ci0KLSAgICAgICAgUGFyYW1ldGVyIHBhcmFtZXRlciA9IGF4aXNNZXNzYWdlLmdldFBhcmFtZXRlcihDb25zdGFudHMuVU5XUkFQUEVEX0RFVEFJTFMpOwotICAgICAgICBNZXNzYWdlUGFydEluZm9ybWF0aW9uSG9sZGVyIG1lc3NhZ2VQYXJ0SW5mb3JtYXRpb25Ib2xkZXIgPQotICAgICAgICAgICAgICAgIChNZXNzYWdlUGFydEluZm9ybWF0aW9uSG9sZGVyKXBhcmFtZXRlci5nZXRWYWx1ZSgpOwotICAgICAgICBMaXN0IHBhcnRzTGlzdCA9IG1lc3NhZ2VQYXJ0SW5mb3JtYXRpb25Ib2xkZXIuZ2V0UGFydHNMaXN0KCk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZShwYXJ0c0xpc3QuY29udGFpbnMoV1NETFV0aWwuZ2V0UGFydFFOYW1lKEFERF9PUEVSQVRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU0RMQ29uc3RhbnRzLklOUFVUX1BBUlRfUU5BTUVfU1VGRklYLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFSQU1FVEVSX09ORSkpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShwYXJ0c0xpc3QuY29udGFpbnMoV1NETFV0aWwuZ2V0UGFydFFOYW1lKEFERF9PUEVSQVRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU0RMQ29uc3RhbnRzLklOUFVUX1BBUlRfUU5BTUVfU1VGRklYLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFSQU1FVEVSX1RXTykpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShwYXJ0c0xpc3QuY29udGFpbnMoV1NETFV0aWwuZ2V0UGFydFFOYW1lKEFERF9PUEVSQVRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU0RMQ29uc3RhbnRzLklOUFVUX1BBUlRfUU5BTUVfU1VGRklYLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFSQU1FVEVSX1RIUkVFKSkpOwotICAgICAgICBhc3NlcnRUcnVlKHBhcnRzTGlzdC5jb250YWlucyhXU0RMVXRpbC5nZXRQYXJ0UU5hbWUoQUREX09QRVJBVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdTRExDb25zdGFudHMuSU5QVVRfUEFSVF9RTkFNRV9TVUZGSVgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQVJBTUVURVJfRk9VUikpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShwYXJ0c0xpc3Quc2l6ZSgpID09IDQpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVBbmRXYWxrU2NoZW1hKFN0cmluZyBzY2hlbWFMb2NhdGlvbikgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgWG1sU2NoZW1hIHhtbFNjaGVtYSA9IGxvYWRTY2hlbWEoc2NoZW1hTG9jYXRpb24pOwotICAgICAgICAgICAgYXhpc1NlcnZpY2UuYWRkU2NoZW1hKHhtbFNjaGVtYSk7Ci0gICAgICAgICAgICBTY2hlbWFVbndyYXBwZXJFeHRlbnNpb24gZXh0ZW5zaW9uID0gbmV3IFNjaGVtYVVud3JhcHBlckV4dGVuc2lvbigpOwotICAgICAgICAgICAgZXh0ZW5zaW9uLndhbGtTY2hlbWEoYXhpc01lc3NhZ2UsIFdTRExDb25zdGFudHMuSU5QVVRfUEFSVF9RTkFNRV9TVUZGSVgpOwotICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbChzY2hlbWFMb2NhdGlvbiArICIgZmlsZSBjYW4gbm90IGJlIGZvdW5kIik7Ci0gICAgICAgIH0gY2F0Y2ggKENvZGVHZW5lcmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBYbWxTY2hlbWEgbG9hZFNjaGVtYShTdHJpbmcgc2NoZW1hTG9jYXRpb24pIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oc2NoZW1hTG9jYXRpb24pOwotICAgICAgICBYbWxTY2hlbWFDb2xsZWN0aW9uIHNjaGVtYUNvbCA9IG5ldyBYbWxTY2hlbWFDb2xsZWN0aW9uKCk7Ci0gICAgICAgIHJldHVybiBzY2hlbWFDb2wucmVhZChuZXcgU3RyZWFtU291cmNlKGlzKSwgbnVsbCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL3NjaGVtYS9BeGlzU2VydmljZVRvcEVsZW1lbnRTY2hlbWFHZW5lcmF0b3JUZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vc2NoZW1hL0F4aXNTZXJ2aWNlVG9wRWxlbWVudFNjaGVtYUdlbmVyYXRvclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjY3ODljMy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vc2NoZW1hL0F4aXNTZXJ2aWNlVG9wRWxlbWVudFNjaGVtYUdlbmVyYXRvclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4uc2NoZW1hOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIubmFtZXNwYWNlLkNvbnN0YW50czsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0KLXB1YmxpYyBjbGFzcyBBeGlzU2VydmljZVRvcEVsZW1lbnRTY2hlbWFHZW5lcmF0b3JUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHVibGljIHZvaWQgdGVzdFNjaGVtYUdlbmVyYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICBBeGlzU2VydmljZVRvcEVsZW1lbnRTY2hlbWFHZW5lcmF0b3Igc2NoZW1hR2VuZXJhdG9yID0gbmV3IEF4aXNTZXJ2aWNlVG9wRWxlbWVudFNjaGVtYUdlbmVyYXRvcihudWxsKTsKLQotICAgICAgICBTZXQgdG9wRWxlbWVudHMgPSBuZXcgSGFzaFNldCgpOwotCi0gICAgICAgIFRvcEVsZW1lbnQgdG9wRWxlbWVudDsKLQotICAgICAgICB0b3BFbGVtZW50ID0gbmV3IFRvcEVsZW1lbnQobmV3IFFOYW1lKCJodHRwOi8vdGVzdC5jb20iLCJ0ZXN0RWxlbWVudDEiKSk7Ci0gICAgICAgIHRvcEVsZW1lbnRzLmFkZCh0b3BFbGVtZW50KTsKLSAgICAgICAgdG9wRWxlbWVudCA9IG5ldyBUb3BFbGVtZW50KG5ldyBRTmFtZSgiaHR0cDovL3Rlc3QxLmNvbSIsInRlc3RFbGVtZW50MiIpKTsKLSAgICAgICAgdG9wRWxlbWVudHMuYWRkKHRvcEVsZW1lbnQpOwotICAgICAgICB0b3BFbGVtZW50ID0gbmV3IFRvcEVsZW1lbnQobmV3IFFOYW1lKCJodHRwOi8vdGVzdDEuY29tIiwidGVzdEVsZW1lbnQzIikpOwotICAgICAgICB0b3BFbGVtZW50LnNldFR5cGVRTmFtZShuZXcgUU5hbWUoQ29uc3RhbnRzLlVSSV8yMDAxX1NDSEVNQV9YU0QsInN0cmluZyIpKTsKLSAgICAgICAgdG9wRWxlbWVudHMuYWRkKHRvcEVsZW1lbnQpOwotCi0gICAgICAgIHRvcEVsZW1lbnQgPSBuZXcgVG9wRWxlbWVudChuZXcgUU5hbWUoImh0dHA6Ly90ZXN0MS5jb20iLCJ0ZXN0RWxlbWVudDQiKSk7Ci0gICAgICAgIHRvcEVsZW1lbnQuc2V0VHlwZVFOYW1lKG5ldyBRTmFtZSgiaHR0cDovL3Rlc3QxLmNvbSIsInRlc3RDb21wbGV4VHlwZTEiKSk7Ci0gICAgICAgIHRvcEVsZW1lbnRzLmFkZCh0b3BFbGVtZW50KTsKLQotICAgICAgICB0b3BFbGVtZW50ID0gbmV3IFRvcEVsZW1lbnQobmV3IFFOYW1lKCJodHRwOi8vdGVzdDEuY29tIiwidGVzdEVsZW1lbnQ1IikpOwotICAgICAgICB0b3BFbGVtZW50LnNldFR5cGVRTmFtZShuZXcgUU5hbWUoImh0dHA6Ly90ZXN0LmNvbSIsInRlc3RDb21wbGV4VHlwZTIiKSk7Ci0gICAgICAgIHRvcEVsZW1lbnRzLmFkZCh0b3BFbGVtZW50KTsKLQotICAgICAgICB0b3BFbGVtZW50ID0gbmV3IFRvcEVsZW1lbnQobmV3IFFOYW1lKCJodHRwOi8vdGVzdC5jb20iLCJ0ZXN0RWxlbWVudDYiKSk7Ci0gICAgICAgIHRvcEVsZW1lbnQuc2V0VHlwZVFOYW1lKG5ldyBRTmFtZSgiaHR0cDovL3Rlc3QyLmNvbSIsInRlc3RDb21wbGV4VHlwZTIiKSk7Ci0gICAgICAgIHRvcEVsZW1lbnRzLmFkZCh0b3BFbGVtZW50KTsKLQotICAgICAgICBNYXAgc2NoZW1hTWFwID0gc2NoZW1hR2VuZXJhdG9yLmdldFNjaGVtYU1hcCh0b3BFbGVtZW50cyk7Ci0gICAgICAgIHNjaGVtYUdlbmVyYXRvci5nZXRYbWxTY2hlbWFMaXN0KHNjaGVtYU1hcCk7Ci0KLS8vICAgICAgICBMaXN0IHhtbFNjaGVtYUxpc3QgPSBzY2hlbWFHZW5lcmF0b3IuZ2V0WG1sU2NoZW1hTGlzdChzY2hlbWFNYXApOwotLy8gICAgICAgIGZvciAoT2JqZWN0IGFYbWxTY2hlbWFMaXN0IDogeG1sU2NoZW1hTGlzdCkgewotLy8gICAgICAgICAgICAoKG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hKWFYbWxTY2hlbWFMaXN0KS53cml0ZShTeXN0ZW0ub3V0KTsKLS8vICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvY29yYmEvcG9tLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2NvcmJhL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1ODRiNWIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvY29yYmEvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjEuNS4xPC92ZXJzaW9uPgotICAgICAgICA8cmVsYXRpdmVQYXRoPi4uL3BhcmVudC9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+Ci0gICAgPC9wYXJlbnQ+Ci0gICAgPGFydGlmYWN0SWQ+YXhpczItY29yYmE8L2FydGlmYWN0SWQ+Ci0gICAgPG5hbWU+QXBhY2hlIEF4aXMyIC0gQ09SQkE8L25hbWU+Ci0gICAgPGRlc2NyaXB0aW9uPkF4aXMyIENPUkJBIG1vZHVsZTwvZGVzY3JpcHRpb24+Ci0gICAgPGRlcGVuZGVuY2llcz4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5hbnRscjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmFudGxyPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHthbnRsci52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1rZXJuZWw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3ZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLWFkYjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7dmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItbWV0YWRhdGE8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3ZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1sb2dnaW5nPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1sb2dnaW5nPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPC9kZXBlbmRlbmNpZXM+Ci0gICAgPGJ1aWxkPgotICAgICAgICA8c291cmNlRGlyZWN0b3J5PnNyYzwvc291cmNlRGlyZWN0b3J5PgotICAgICAgICA8dGVzdFNvdXJjZURpcmVjdG9yeT50ZXN0PC90ZXN0U291cmNlRGlyZWN0b3J5PgotICAgICAgICA8cmVzb3VyY2VzPgotICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+Li4vLi48L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPk5PVElDRS50eHQ8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPkxJQ0VOU0UudHh0PC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgPGZpbHRlcmluZz5mYWxzZTwvZmlsdGVyaW5nPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgPC9yZXNvdXJjZXM+Ci0gICAgICAgIDx0ZXN0UmVzb3VyY2VzPgotICAgICAgICAgICAgPHRlc3RSZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnRlc3QtcmVzb3VyY2VzPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICA8L3Rlc3RSZXNvdXJjZT4KLSAgICAgICAgPC90ZXN0UmVzb3VyY2VzPgotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8c2tpcD5mYWxzZTwvc2tpcD4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvYnVpbGQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9kZXBsb3llci9Db3JiYUNvbnN0YW50cy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvZGVwbG95ZXIvQ29yYmFDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM0YmY5OC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9kZXBsb3llci9Db3JiYUNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5kZXBsb3llcjsNCi0NCi1wdWJsaWMgaW50ZXJmYWNlIENvcmJhQ29uc3RhbnRzIHsNCi0gICAgLy8gQ29uc3RhbnRzIGZvciBTZXJ2aWNlIEREIFhNTA0KLSAgICBTdHJpbmcgSURMX0ZJTEUgPSAiaWRsRmlsZSI7DQotDQotICAgIC8vIFRvIHVzZSBhIGN1c3RvbSBPUkINCi0gICAgU3RyaW5nIE9SQl9DTEFTUyA9ICJvcmJDbGFzcyI7DQotICAgIFN0cmluZyBPUkJfU0lOR0xFVE9OX0NMQVNTID0gIm9yYlNpbmdsZXRvbkNsYXNzIjsNCi0NCi0gICAgLy8gT25lIG9mIHRoZSBmb2xsb3dpbmcgaXMgcmVxdWlyZWQgdG8gbG9jYXRlIHRoZSBDT1JCQSBzZXJ2aWNlDQotICAgIFN0cmluZyBOQU1JTkdfU0VSVklDRV9VUkwgPSAibmFtaW5nU2VydmljZVVybCI7DQotICAgIFN0cmluZyBJT1JfRklMRV9QQVRIID0gImlvckZpbGVQYXRoIjsNCi0gICAgU3RyaW5nIElPUl9TVFJJTkcgPSAiaW9yU3RyaW5nIjsNCi0NCi0gICAgLy8gUmVxdWlyZWQgb25seSBpZiBuYW1pbmdTZXJ2aWNlVXJsIGlzIHByb3ZpZGVkIA0KLSAgICBTdHJpbmcgT0JKRUNUX05BTUUgPSAib2JqZWN0TmFtZSI7DQotDQotICAgIC8vIE5hbWUgb2YgdGhlIENPUkJBIGludGVyZmFjZQ0KLSAgICBTdHJpbmcgSU5URVJGQUNFX05BTUUgPSAiaW50ZXJmYWNlTmFtZSI7DQotDQotICAgIC8vIENvbnN0YW50cyBmb3IgcHJvY2Vzc2luZyB0aGUgY29yYmEgd2ViIHNlcnZpY2VzDQotICAgIFN0cmluZyBPUkJfTElURVJBTCA9ICJvcmIiOw0KLSAgICBTdHJpbmcgSURMX0xJVEVSQUwgPSAiaWRsIjsNCi0gICAgU3RyaW5nIFJFVFVSTl9XUkFQUEVSID0gInJldHVybiI7DQotICAgIFN0cmluZyBWT0lEID0gInZvaWQiOw0KLSAgICBTdHJpbmcgUkVTUE9OU0UgPSAiUmVzcG9uc2UiOw0KLSAgICBTdHJpbmcgRkFVTFQgPSAiRmF1bHQiOw0KLSAgICBTdHJpbmcgQVJSQVlfSVRFTSA9ICJpdGVtIjsNCi0gICAgU3RyaW5nIE9SR19PTUdfQ09SQkFfT1JCQ0xBU1MgPSAib3JnLm9tZy5DT1JCQS5PUkJDbGFzcyI7DQotICAgIFN0cmluZyBERUZBVUxSX09SQl9DTEFTUyA9ICJvcmcuYXBhY2hlLnlva28ub3JiLkNPUkJBLk9SQiI7DQotICAgIFN0cmluZyBPUkdfT01HX0NPUkJBX09SQlNJTkdMRVRPTl9DTEFTUyA9ICJvcmcub21nLkNPUkJBLk9SQlNpbmdsZXRvbkNsYXNzIjsNCi0gICAgU3RyaW5nIERFRkFVTFRfT1JCU0lOR0xFVE9OX0NMQVNTID0gIm9yZy5hcGFjaGUueW9rby5vcmIuQ09SQkEuT1JCU2luZ2xldG9uIjsNCi0NCi0gICAgU3RyaW5nIE5BTUVfU1BBQ0VfUFJFRklYID0gImF4MiI7IC8vIGF4aXMyIG5hbWUgc3BhY2UNCi0gICAgU3RyaW5nIEhUVFAgPSAiaHR0cDovLyI7DQotICAgIGNoYXIgUEFDS0FHRV9DTEFTU19ERUxJTUlURVIgPSAnLic7DQotICAgIFN0cmluZyBTQ0hFTUFfTkFNRVNQQUNFX0VYVE4gPSAiL3hzZCI7DQotICAgIFN0cmluZyBERUZBVUxUX1NDSEVNQV9OQU1FU1BBQ0VfUFJFRklYID0gInhzIjsNCi0gICAgU3RyaW5nIFVSSV8yMDAxX1NDSEVNQV9YU0QgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiOw0KLSAgICBTdHJpbmcgRk9STV9ERUZBVUxUX1VOUVVBTElGSUVEID0gInVucXVhbGlmaWVkIjsNCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvZGVwbG95ZXIvQ29yYmFEZXBsb3llci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvZGVwbG95ZXIvQ29yYmFEZXBsb3llci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzBiY2FmLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL2RlcGxveWVyL0NvcmJhRGVwbG95ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwNyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmRlcGxveWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQXR0cmlidXRlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5BZGRyZXNzaW5nSGVscGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLnR5cGVzLkRhdGFUeXBlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC50eXBlcy5FeGNlcHRpb25UeXBlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC50eXBlcy5JREw7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLnR5cGVzLkludGVyZmFjZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5pZGwudHlwZXMuT3BlcmF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLnJlY2VpdmVycy5Db3JiYVV0aWw7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC5EZXBsb3llcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LkRlcGxveW1lbnRDb25zdGFudHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC5EZXBsb3ltZW50RW5naW5lOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQuRGVwbG95bWVudEVycm9yTXNnczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LkRlcGxveW1lbnRFeGNlcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC5EZXNjcmlwdGlvbkJ1aWxkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC5yZXBvc2l0b3J5LnV0aWwuRGVwbG95bWVudEZpbGVEYXRhOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQudXRpbC5QaGFzZXNJbmZvOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQudXRpbC5VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzTWVzc2FnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb25GYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlR3JvdXA7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlBhcmFtZXRlckluY2x1ZGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uamF2YTJ3c2RsLkphdmEyV1NETENvbnN0YW50czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5qYXZhMndzZGwuVHlwZVRhYmxlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzQ29uZmlndXJhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuTWVzc2FnZVJlY2VpdmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmkxOG4uTWVzc2FnZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5Mb2FkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMQ29uc3RhbnRzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEudXRpbHMuTmFtZXNwYWNlTWFwOw0KLWltcG9ydCBvcmcub21nLkNPUkJBXzJfMy5PUkI7DQotDQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLmlvLkZpbGU7DQotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7DQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLXB1YmxpYyBjbGFzcyBDb3JiYURlcGxveWVyIGltcGxlbWVudHMgRGVwbG95ZXIsIERlcGxveW1lbnRDb25zdGFudHMsIENvcmJhQ29uc3RhbnRzIHsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKENvcmJhRGVwbG95ZXIuY2xhc3MpOw0KLSAgICBwcml2YXRlIEF4aXNDb25maWd1cmF0aW9uIGF4aXNDb25maWc7DQotICAgIHByaXZhdGUgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ3R4Ow0KLQ0KLSAgICBwdWJsaWMgdm9pZCBpbml0KENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0N0eCkgew0KLSAgICAgICAgdGhpcy5jb25maWdDdHggPSBjb25maWdDdHg7DQotICAgICAgICB0aGlzLmF4aXNDb25maWcgPSB0aGlzLmNvbmZpZ0N0eC5nZXRBeGlzQ29uZmlndXJhdGlvbigpOw0KLSAgICAgICAgLyp0cnkgew0KLSAgICAgICAgICAgIFN5c3RlbS5pbi5yZWFkKCk7DQotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7DQotDQotICAgICAgICB9Ki8NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBkZXBsb3koRGVwbG95bWVudEZpbGVEYXRhIGRlcGxveW1lbnRGaWxlRGF0YSkgdGhyb3dzIERlcGxveW1lbnRFeGNlcHRpb24gew0KLSAgICAgICAgU3RyaW5nIG5hbWUgPSBudWxsOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBkZXBsb3ltZW50RmlsZURhdGEuc2V0Q2xhc3NMb2FkZXIoYXhpc0NvbmZpZy5nZXRTZXJ2aWNlQ2xhc3NMb2FkZXIoKSk7DQotICAgICAgICAgICAgQXhpc1NlcnZpY2VHcm91cCBzZXJ2aWNlR3JvdXAgPSBuZXcgQXhpc1NlcnZpY2VHcm91cChheGlzQ29uZmlnKTsNCi0gICAgICAgICAgICBzZXJ2aWNlR3JvdXAuc2V0U2VydmljZUdyb3VwQ2xhc3NMb2FkZXIoZGVwbG95bWVudEZpbGVEYXRhLmdldENsYXNzTG9hZGVyKCkpOw0KLSAgICAgICAgICAgIEFycmF5TGlzdCBzZXJ2aWNlTGlzdCA9IHByb2Nlc3NTZXJ2aWNlKGRlcGxveW1lbnRGaWxlRGF0YSwgc2VydmljZUdyb3VwLCBjb25maWdDdHgpOw0KLSAgICAgICAgICAgIERlcGxveW1lbnRFbmdpbmUuYWRkU2VydmljZUdyb3VwKHNlcnZpY2VHcm91cCwgc2VydmljZUxpc3QsIGRlcGxveW1lbnRGaWxlRGF0YS5nZXRGaWxlKCkudG9VUkwoKSwgZGVwbG95bWVudEZpbGVEYXRhLCBheGlzQ29uZmlnKTsNCi0gICAgICAgICAgICBuYW1lID0gZGVwbG95bWVudEZpbGVEYXRhLmdldE5hbWUoKTsNCi0gICAgICAgICAgICBsb2cuaW5mbygiRGVwbG95aW5nICIgKyBuYW1lKTsNCi0gICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBheGlzRmF1bHQpIHsNCi0gICAgICAgICAgICBsb2cuZXJyb3IoIkVycm9yIHdoaWxlIGRlcGxveWluZyAiICsgbmFtZSwgYXhpc0ZhdWx0KTsNCi0gICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgbG9nLmVycm9yKCJFcnJvciB3aGlsZSBkZXBsb3lpbmcgIiArIG5hbWUsIGUpOw0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBsb2cuZXJyb3IoIkVycm9yIHdoaWxlIGRlcGxveWluZyAiICsgbmFtZSwgZSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBBcnJheUxpc3QgcHJvY2Vzc1NlcnZpY2UoRGVwbG95bWVudEZpbGVEYXRhIGRlcGxveW1lbnRGaWxlRGF0YSwgQXhpc1NlcnZpY2VHcm91cCBzZXJ2aWNlR3JvdXAsIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0N0eCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBTdHJpbmcgZmlsZW5hbWUgPSBkZXBsb3ltZW50RmlsZURhdGEuZ2V0QWJzb2x1dGVQYXRoKCk7DQotICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShmaWxlbmFtZSk7DQotICAgICAgICBzZXJ2aWNlR3JvdXAuc2V0U2VydmljZUdyb3VwTmFtZShkZXBsb3ltZW50RmlsZURhdGEuZ2V0TmFtZSgpKTsNCi0gICAgICAgIFN0cmluZyBzZXJ2aWNlTmFtZSA9IERlc2NyaXB0aW9uQnVpbGRlci5nZXRTaG9ydEZpbGVOYW1lKGRlcGxveW1lbnRGaWxlRGF0YS5nZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UgPSBuZXcgQXhpc1NlcnZpY2UoKTsNCi0gICAgICAgIGF4aXNTZXJ2aWNlLnNldE5hbWUoc2VydmljZU5hbWUpOw0KLSAgICAgICAgYXhpc1NlcnZpY2Uuc2V0UGFyZW50KHNlcnZpY2VHcm91cCk7DQotICAgICAgICBheGlzU2VydmljZS5zZXRDbGFzc0xvYWRlcihkZXBsb3ltZW50RmlsZURhdGEuZ2V0Q2xhc3NMb2FkZXIoKSk7DQotDQotICAgICAgICBJbnB1dFN0cmVhbSBpbiA9IG51bGw7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKTsNCi0gICAgICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBEZXNjcmlwdGlvbkJ1aWxkZXIoaW4sIGNvbmZpZ0N0eCk7DQotICAgICAgICAgICAgT01FbGVtZW50IHJvb3RFbGVtZW50ID0gYnVpbGRlci5idWlsZE9NKCk7DQotICAgICAgICAgICAgU3RyaW5nIGVsZW1lbnROYW1lID0gcm9vdEVsZW1lbnQuZ2V0TG9jYWxOYW1lKCk7DQotICAgICAgICAgICAgaWYgKFRBR19TRVJWSUNFLmVxdWFscyhlbGVtZW50TmFtZSkpIHsNCi0gICAgICAgICAgICAgICAgcG9wdWxhdGVTZXJ2aWNlKGF4aXNTZXJ2aWNlLCByb290RWxlbWVudCwgZmlsZS5nZXRQYXJlbnQoKSk7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiSW52YWxpZCAiICsgZGVwbG95bWVudEZpbGVEYXRhLmdldEFic29sdXRlUGF0aCgpICsgIiBmb3VuZCIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgNCi0gICAgICAgICAgICAgICAgICAgIERlcGxveW1lbnRFcnJvck1zZ3MuRklMRV9OT1RfRk9VTkQsIGUuZ2V0TWVzc2FnZSgpKSk7DQotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoDQotICAgICAgICAgICAgICAgICAgICBEZXBsb3ltZW50RXJyb3JNc2dzLlhNTF9TVFJFQU1fRVhDRVBUSU9OLCBlLmdldE1lc3NhZ2UoKSkpOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgICBpZiAoaW4gIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICB0cnkgew0KLSAgICAgICAgICAgICAgICAgICAgaW4uY2xvc2UoKTsNCi0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgICAgICAgICAgbG9nLmluZm8oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiZXJyb3JpbmlucHV0c3RyZWFtY2xvc2UiKSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICBBcnJheUxpc3Qgc2VydmljZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7DQotICAgICAgICBzZXJ2aWNlTGlzdC5hZGQoYXhpc1NlcnZpY2UpOw0KLSAgICAgICAgcmV0dXJuIHNlcnZpY2VMaXN0Ow0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBwb3B1bGF0ZVNlcnZpY2UoQXhpc1NlcnZpY2Ugc2VydmljZSwgT01FbGVtZW50IHNlcnZpY2VfZWxlbWVudCwgU3RyaW5nIGRpcmVjdG9yeSkNCi0gICAgICAgICAgICB0aHJvd3MgRGVwbG95bWVudEV4Y2VwdGlvbiB7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIC8vIFByb2Nlc3Npbmcgc2VydmljZSBsZXZlbCBwYXJhbWV0ZXJzDQotICAgICAgICAgICAgSXRlcmF0b3IgaXRyID0gc2VydmljZV9lbGVtZW50LmdldENoaWxkcmVuV2l0aE5hbWUobmV3IFFOYW1lKFRBR19QQVJBTUVURVIpKTsNCi0gICAgICAgICAgICBwcm9jZXNzUGFyYW1ldGVycyhpdHIsIHNlcnZpY2UsIHNlcnZpY2UuZ2V0UGFyZW50KCkpOw0KLQ0KLSAgICAgICAgICAgIC8vIHByb2Nlc3Mgc2VydmljZSBkZXNjcmlwdGlvbg0KLSAgICAgICAgICAgIE9NRWxlbWVudCBkZXNjcmlwdGlvbkVsZW1lbnQgPSBzZXJ2aWNlX2VsZW1lbnQuZ2V0Rmlyc3RDaGlsZFdpdGhOYW1lKG5ldyBRTmFtZShUQUdfREVTQ1JJUFRJT04pKTsNCi0gICAgICAgICAgICBpZiAoZGVzY3JpcHRpb25FbGVtZW50ICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgT01FbGVtZW50IGRlc2NyaXB0aW9uVmFsdWUgPSBkZXNjcmlwdGlvbkVsZW1lbnQuZ2V0Rmlyc3RFbGVtZW50KCk7DQotICAgICAgICAgICAgICAgIGlmIChkZXNjcmlwdGlvblZhbHVlICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZ1dyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7DQotICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvblZhbHVlLmJ1aWxkKCk7DQotICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvblZhbHVlLnNlcmlhbGl6ZSh3cml0ZXIpOw0KLSAgICAgICAgICAgICAgICAgICAgd3JpdGVyLmZsdXNoKCk7DQotICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLnNldERvY3VtZW50YXRpb24od3JpdGVyLnRvU3RyaW5nKCkpOw0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgc2VydmljZS5zZXREb2N1bWVudGF0aW9uKGRlc2NyaXB0aW9uRWxlbWVudC5nZXRUZXh0KCkpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgT01BdHRyaWJ1dGUgc2VydmljZU5hbWVhdHQgPSBzZXJ2aWNlX2VsZW1lbnQuZ2V0QXR0cmlidXRlKG5ldyBRTmFtZShBVFRSSUJVVEVfTkFNRSkpOw0KLQ0KLSAgICAgICAgICAgICAgICBpZiAoc2VydmljZU5hbWVhdHQgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCEiIi5lcXVhbHMoc2VydmljZU5hbWVhdHQuZ2V0QXR0cmlidXRlVmFsdWUoKS50cmltKCkpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZS5zZXREb2N1bWVudGF0aW9uKHNlcnZpY2VOYW1lYXR0LmdldEF0dHJpYnV0ZVZhbHVlKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIE9NQXR0cmlidXRlIHNlcnZpY2VOYW1lYXR0ID0gc2VydmljZV9lbGVtZW50LmdldEF0dHJpYnV0ZShuZXcgUU5hbWUoQVRUUklCVVRFX05BTUUpKTsNCi0NCi0gICAgICAgICAgICAvLyBJZiB0aGUgc2VydmljZSBuYW1lIGlzIGV4cGxpY2l0bHkgc3BlY2lmaWVkIGluIHRoZSBzZXJ2aWNlcy54bWwNCi0gICAgICAgICAgICAvLyB0aGVuIHVzZSB0aGF0IGFzIHRoZSBzZXJ2aWNlIG5hbWUNCi0gICAgICAgICAgICBpZiAoc2VydmljZU5hbWVhdHQgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICBpZiAoISIiLmVxdWFscyhzZXJ2aWNlTmFtZWF0dC5nZXRBdHRyaWJ1dGVWYWx1ZSgpLnRyaW0oKSkpIHsNCi0gICAgICAgICAgICAgICAgICAgIHNlcnZpY2Uuc2V0TmFtZShzZXJ2aWNlTmFtZWF0dC5nZXRBdHRyaWJ1dGVWYWx1ZSgpKTsNCi0gICAgICAgICAgICAgICAgICAgIC8vIFRvIGJlIG9uIHRoZSBzYWZlIHNpZGUNCi0gICAgICAgICAgICAgICAgICAgIGlmIChzZXJ2aWNlLmdldERvY3VtZW50YXRpb24oKSA9PSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZS5zZXREb2N1bWVudGF0aW9uKHNlcnZpY2VOYW1lYXR0LmdldEF0dHJpYnV0ZVZhbHVlKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIC8vIFByb2Nlc3MgV1MtQWRkcmVzc2luZyBmbGFnIGF0dHJpYnV0ZQ0KLSAgICAgICAgICAgIE9NQXR0cmlidXRlIGFkZHJlc3NpbmdSZXF1aXJlZGF0dCA9IHNlcnZpY2VfZWxlbWVudC5nZXRBdHRyaWJ1dGUobmV3IFFOYW1lKA0KLSAgICAgICAgICAgICAgICAgICAgQVRUUklCVVRFX1dTQUREUkVTU0lORykpOw0KLSAgICAgICAgICAgIGlmIChhZGRyZXNzaW5nUmVxdWlyZWRhdHQgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICBTdHJpbmcgYWRkcmVzc2luZ1JlcXVpcmVkU3RyaW5nID0gYWRkcmVzc2luZ1JlcXVpcmVkYXR0LmdldEF0dHJpYnV0ZVZhbHVlKCk7DQotICAgICAgICAgICAgICAgIEFkZHJlc3NpbmdIZWxwZXIuc2V0QWRkcmVzc2luZ1JlcXVpcmVtZW50UGFyZW1ldGVyVmFsdWUoc2VydmljZSwgYWRkcmVzc2luZ1JlcXVpcmVkU3RyaW5nKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgLy8gU2V0dGluZyBzZXJ2aWNlIHRhcmdldCBuYW1lc3BhY2UgaWYgYW55DQotICAgICAgICAgICAgT01BdHRyaWJ1dGUgdGFyZ2V0TmFtZVNwYWNlID0gc2VydmljZV9lbGVtZW50LmdldEF0dHJpYnV0ZShuZXcgUU5hbWUoVEFSR0VUX05BTUVfU1BBQ0UpKTsNCi0gICAgICAgICAgICBpZiAodGFyZ2V0TmFtZVNwYWNlICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgU3RyaW5nIG5hbWVTcGVjZVZhbGUgPSB0YXJnZXROYW1lU3BhY2UuZ2V0QXR0cmlidXRlVmFsdWUoKTsNCi0gICAgICAgICAgICAgICAgaWYgKG5hbWVTcGVjZVZhbGUgIT0gbnVsbCAmJiAhIiIuZXF1YWxzKG5hbWVTcGVjZVZhbGUpKSB7DQotICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLnNldFRhcmdldE5hbWVzcGFjZShuYW1lU3BlY2VWYWxlKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIGlmIChzZXJ2aWNlLmdldFRhcmdldE5hbWVzcGFjZSgpID09IG51bGwgfHwgIiIuZXF1YWxzKHNlcnZpY2UuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpKSB7DQotICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLnNldFRhcmdldE5hbWVzcGFjZShKYXZhMldTRExDb25zdGFudHMuREVGQVVMVF9UQVJHRVRfTkFNRVNQQUNFKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAvLyBTZXR0aW5nIHNjaGVtYSBuYW1lc3BlY2UgaWYgYW55DQotICAgICAgICAgICAgT01FbGVtZW50IHNjaGVtYUVsZW1lbnQgPSBzZXJ2aWNlX2VsZW1lbnQuZ2V0Rmlyc3RDaGlsZFdpdGhOYW1lKG5ldyBRTmFtZShTQ0hFTUEpKTsNCi0gICAgICAgICAgICBpZiAoc2NoZW1hRWxlbWVudCAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgIE9NQXR0cmlidXRlIHNjaGVtYU5hbWVTcGFjZSA9IHNjaGVtYUVsZW1lbnQuZ2V0QXR0cmlidXRlKG5ldyBRTmFtZShTQ0hFTUFfTkFNRV9TUEFDRSkpOw0KLSAgICAgICAgICAgICAgICBpZiAoc2NoZW1hTmFtZVNwYWNlICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lU3BlY2VWYWxlID0gc2NoZW1hTmFtZVNwYWNlLmdldEF0dHJpYnV0ZVZhbHVlKCk7DQotICAgICAgICAgICAgICAgICAgICBpZiAobmFtZVNwZWNlVmFsZSAhPSBudWxsICYmICEiIi5lcXVhbHMobmFtZVNwZWNlVmFsZSkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLnNldFNjaGVtYVRhcmdldE5hbWVzcGFjZShuYW1lU3BlY2VWYWxlKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBPTUF0dHJpYnV0ZSBlbGVtZW50Rm9ybURlZmF1bHQgPSBzY2hlbWFFbGVtZW50LmdldEF0dHJpYnV0ZShuZXcgUU5hbWUoDQotICAgICAgICAgICAgICAgICAgICAgICAgU0NIRU1BX0VMRU1FTlRfUVVBTElGSUVEKSk7DQotICAgICAgICAgICAgICAgIGlmIChlbGVtZW50Rm9ybURlZmF1bHQgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gZWxlbWVudEZvcm1EZWZhdWx0LmdldEF0dHJpYnV0ZVZhbHVlKCk7DQotICAgICAgICAgICAgICAgICAgICBpZiAoInRydWUiLmVxdWFscyh2YWx1ZSkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLnNldEVsZW1lbnRGb3JtRGVmYXVsdCh0cnVlKTsNCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoImZhbHNlIi5lcXVhbHModmFsdWUpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZS5zZXRFbGVtZW50Rm9ybURlZmF1bHQoZmFsc2UpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIC8vIFJlbW92aW5nIGV4Y2x1ZGUgb3BlcmF0aW9ucw0KLSAgICAgICAgICAgIE9NRWxlbWVudCBleGNsdWRlT3BlcmF0aW9ucyA9IHNlcnZpY2VfZWxlbWVudC5nZXRGaXJzdENoaWxkV2l0aE5hbWUobmV3IFFOYW1lKFRBR19FWENMVURFX09QRVJBVElPTlMpKTsNCi0gICAgICAgICAgICBBcnJheUxpc3QgZXhjbHVkZW9wcyA9IG51bGw7DQotICAgICAgICAgICAgaWYgKGV4Y2x1ZGVPcGVyYXRpb25zICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgZXhjbHVkZW9wcyA9IG5ldyBBcnJheUxpc3QoKTsNCi0gICAgICAgICAgICAgICAgSXRlcmF0b3IgZXhjbHVkZU9wX2l0ciA9IGV4Y2x1ZGVPcGVyYXRpb25zLmdldENoaWxkcmVuV2l0aE5hbWUobmV3IFFOYW1lKFRBR19PUEVSQVRJT04pKTsNCi0gICAgICAgICAgICAgICAgd2hpbGUgKGV4Y2x1ZGVPcF9pdHIuaGFzTmV4dCgpKSB7DQotICAgICAgICAgICAgICAgICAgICBPTUVsZW1lbnQgb3BOYW1lID0gKE9NRWxlbWVudCkgZXhjbHVkZU9wX2l0ci5uZXh0KCk7DQotICAgICAgICAgICAgICAgICAgICBleGNsdWRlb3BzLmFkZChvcE5hbWUuZ2V0VGV4dCgpLnRyaW0oKSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYgKGV4Y2x1ZGVvcHMgPT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICBleGNsdWRlb3BzID0gbmV3IEFycmF5TGlzdCgpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAvLyBwcm9jZXNzaW5nIHNlcnZpY2Utd2lkZSBtb2R1bGVzIHdoaWNoIHJlcXVpcmVkIHRvIGVuZ2FnZSBnbG9iYWxseQ0KLSAgICAgICAgICAgIEl0ZXJhdG9yIG1vZHVsZVJlZnMgPSBzZXJ2aWNlX2VsZW1lbnQuZ2V0Q2hpbGRyZW5XaXRoTmFtZShuZXcgUU5hbWUoVEFHX01PRFVMRSkpOw0KLSAgICAgICAgICAgIHdoaWxlIChtb2R1bGVSZWZzLmhhc05leHQoKSkgew0KLSAgICAgICAgICAgICAgICBPTUVsZW1lbnQgbW9kdWxlcmVmID0gKE9NRWxlbWVudCkgbW9kdWxlUmVmcy5uZXh0KCk7DQotICAgICAgICAgICAgICAgIE9NQXR0cmlidXRlIG1vZHVsZVJlZkF0dHJpYnV0ZSA9IG1vZHVsZXJlZi5nZXRBdHRyaWJ1dGUobmV3IFFOYW1lKFRBR19SRUZFUkVOQ0UpKTsNCi0gICAgICAgICAgICAgICAgU3RyaW5nIHJlZk5hbWUgPSBtb2R1bGVSZWZBdHRyaWJ1dGUuZ2V0QXR0cmlidXRlVmFsdWUoKTsNCi0gICAgICAgICAgICAgICAgYXhpc0NvbmZpZy5hZGRHbG9iYWxNb2R1bGVSZWYocmVmTmFtZSk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIE9NRWxlbWVudCBtZXNzYWdlUmVjZWl2ZXIgPSBzZXJ2aWNlX2VsZW1lbnQuZ2V0Rmlyc3RDaGlsZFdpdGhOYW1lKA0KLSAgICAgICAgICAgICAgICAgICAgbmV3IFFOYW1lKFRBR19NRVNTQUdFX1JFQ0VJVkVSUykpOw0KLSAgICAgICAgICAgIENsYXNzTG9hZGVyIGxvYWRlciA9IHNlcnZpY2UuZ2V0Q2xhc3NMb2FkZXIoKTsNCi0NCi0gICAgICAgICAgICAvLyBTZXQgZGVmYXVsdCBtZXNzYWdlIHJlY2lldmVycw0KLSAgICAgICAgICAgIHNlcnZpY2UuYWRkTWVzc2FnZVJlY2VpdmVyKCJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaW4tb25seSIsDQotICAgICAgICAgICAgICAgICAgICBsb2FkTWVzc2FnZVJlY2VpdmVyKGxvYWRlciwgIm9yZy5hcGFjaGUuYXhpczIuY29yYmEucmVjZWl2ZXJzLkNvcmJhSW5Pbmx5TWVzc2FnZVJlY2VpdmVyIikpOw0KLSAgICAgICAgICAgIHNlcnZpY2UuYWRkTWVzc2FnZVJlY2VpdmVyKCJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvcm9idXN0LWluLW9ubHkiLA0KLSAgICAgICAgICAgICAgICAgICAgbG9hZE1lc3NhZ2VSZWNlaXZlcihsb2FkZXIsICJvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLnJlY2VpdmVycy5Db3JiYUluT25seU1lc3NhZ2VSZWNlaXZlciIpKTsNCi0gICAgICAgICAgICBzZXJ2aWNlLmFkZE1lc3NhZ2VSZWNlaXZlcigiaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC93c2RsL2luLW91dCIsDQotICAgICAgICAgICAgICAgICAgICBsb2FkTWVzc2FnZVJlY2VpdmVyKGxvYWRlciwgIm9yZy5hcGFjaGUuYXhpczIuY29yYmEucmVjZWl2ZXJzLkNvcmJhTWVzc2FnZVJlY2VpdmVyIikpOw0KLSAgICAgICAgICAgIHNlcnZpY2UuYWRkTWVzc2FnZVJlY2VpdmVyKCJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaW4tb3B0LW91dCIsDQotICAgICAgICAgICAgICAgICAgICBsb2FkTWVzc2FnZVJlY2VpdmVyKGxvYWRlciwgIm9yZy5hcGFjaGUuYXhpczIuY29yYmEucmVjZWl2ZXJzLkNvcmJhSW5PdXRBc3luY01lc3NhZ2VSZWNlaXZlciIpKTsNCi0NCi0gICAgICAgICAgICBpZiAobWVzc2FnZVJlY2VpdmVyICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgSGFzaE1hcCBtcnMgPSBwcm9jZXNzTWVzc2FnZVJlY2VpdmVycyhsb2FkZXIsIG1lc3NhZ2VSZWNlaXZlcik7DQotICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGtleXMgPSBtcnMua2V5U2V0KCkuaXRlcmF0b3IoKTsNCi0gICAgICAgICAgICAgICAgd2hpbGUgKGtleXMuaGFzTmV4dCgpKSB7DQotICAgICAgICAgICAgICAgICAgICBTdHJpbmcga2V5ID0gKFN0cmluZykga2V5cy5uZXh0KCk7DQotICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLmFkZE1lc3NhZ2VSZWNlaXZlcihrZXksIChNZXNzYWdlUmVjZWl2ZXIpIG1ycy5nZXQoa2V5KSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gcHJvY2Vzc2luZyB0cmFuc3BvcnRzDQotICAgICAgICAgICAgT01FbGVtZW50IHRyYW5zcG9ydHMgPSBzZXJ2aWNlX2VsZW1lbnQuZ2V0Rmlyc3RDaGlsZFdpdGhOYW1lKG5ldyBRTmFtZShUQUdfVFJBTlNQT1JUUykpOw0KLSAgICAgICAgICAgIGlmICh0cmFuc3BvcnRzICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgSXRlcmF0b3IgdHJhbnNwb3J0X2l0ciA9IHRyYW5zcG9ydHMuZ2V0Q2hpbGRyZW5XaXRoTmFtZShuZXcgUU5hbWUoVEFHX1RSQU5TUE9SVCkpOw0KLSAgICAgICAgICAgICAgICBBcnJheUxpc3QgdHJzID0gbmV3IEFycmF5TGlzdCgpOw0KLSAgICAgICAgICAgICAgICB3aGlsZSAodHJhbnNwb3J0X2l0ci5oYXNOZXh0KCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIE9NRWxlbWVudCB0cnNFbGUgPSAoT01FbGVtZW50KSB0cmFuc3BvcnRfaXRyLm5leHQoKTsNCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyB0YXJuc3BvcnROYW1lID0gdHJzRWxlLmdldFRleHQoKS50cmltKCk7DQotICAgICAgICAgICAgICAgICAgICB0cnMuYWRkKHRhcm5zcG9ydE5hbWUpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHNlcnZpY2Uuc2V0RXhwb3NlZFRyYW5zcG9ydHModHJzKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgLy8gcHJvY2Vzc2luZyBvcGVyYXRpb25zDQotICAgICAgICAgICAgcHJvY2Vzc09wZXJhdGlvbnMoc2VydmljZSwgYXhpc0NvbmZpZywgZXhjbHVkZW9wcywgbnVsbCwgZGlyZWN0b3J5KTsNCi0gICAgICAgICAgICBJdGVyYXRvciBvcGVyYXRpb25zSXRlcmF0b3IgPSBzZXJ2aWNlLmdldE9wZXJhdGlvbnMoKTsNCi0gICAgICAgICAgICB3aGlsZSAob3BlcmF0aW9uc0l0ZXJhdG9yLmhhc05leHQoKSkgew0KLSAgICAgICAgICAgICAgICBBeGlzT3BlcmF0aW9uIG9wZXJhdGlvbkRlc2MgPSAoQXhpc09wZXJhdGlvbikgb3BlcmF0aW9uc0l0ZXJhdG9yLm5leHQoKTsNCi0gICAgICAgICAgICAgICAgQXJyYXlMaXN0IHdzYW1hcHBpbmdzID0gb3BlcmF0aW9uRGVzYy5nZXRXU0FNYXBwaW5nTGlzdCgpOw0KLSAgICAgICAgICAgICAgICBpZiAod3NhbWFwcGluZ3MgPT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgaWYgKHNlcnZpY2UuZ2V0T3BlcmF0aW9uKG9wZXJhdGlvbkRlc2MuZ2V0TmFtZSgpKSA9PSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLmFkZE9wZXJhdGlvbihvcGVyYXRpb25EZXNjKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHdzYW1hcHBpbmdzLnNpemUoKTsgaisrKSB7DQotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbWFwcGluZyA9IChTdHJpbmcpIHdzYW1hcHBpbmdzLmdldChqKTsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChtYXBwaW5nLmxlbmd0aCgpID4gMCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UubWFwQWN0aW9uVG9PcGVyYXRpb24obWFwcGluZywgb3BlcmF0aW9uRGVzYyk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleGNsdWRlb3BzLnNpemUoKTsgaSsrKSB7DQotICAgICAgICAgICAgICAgIFN0cmluZyBvcE5hbWUgPSAoU3RyaW5nKSBleGNsdWRlb3BzLmdldChpKTsNCi0gICAgICAgICAgICAgICAgc2VydmljZS5yZW1vdmVPcGVyYXRpb24obmV3IFFOYW1lKG9wTmFtZSkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oZSk7DQotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgYXhpc0ZhdWx0KSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgNCi0gICAgICAgICAgICAgICAgICAgIERlcGxveW1lbnRFcnJvck1zZ3MuT1BFUkFUSU9OX1BST0NFU1NfRVJST1IsIGF4aXNGYXVsdC5nZXRNZXNzYWdlKCkpLCBheGlzRmF1bHQpOw0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEV4Y2VwdGlvbihlKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgSGFzaE1hcCBwcm9jZXNzTWVzc2FnZVJlY2VpdmVycyhDbGFzc0xvYWRlciBsb2FkZXIsIE9NRWxlbWVudCBlbGVtZW50KSB0aHJvd3MgRGVwbG95bWVudEV4Y2VwdGlvbiB7DQotICAgICAgICBIYXNoTWFwIG1lcHMgPSBuZXcgSGFzaE1hcCgpOw0KLSAgICAgICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBlbGVtZW50LmdldENoaWxkcmVuV2l0aE5hbWUobmV3IFFOYW1lKFRBR19NRVNTQUdFX1JFQ0VJVkVSKSk7DQotICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7DQotICAgICAgICAgICAgT01FbGVtZW50IHJlY2VpdmVyRWxlbWVudCA9IChPTUVsZW1lbnQpIGl0ZXJhdG9yLm5leHQoKTsNCi0gICAgICAgICAgICBPTUF0dHJpYnV0ZSByZWNlaXZlck5hbWUgPSByZWNlaXZlckVsZW1lbnQuZ2V0QXR0cmlidXRlKG5ldyBRTmFtZShUQUdfQ0xBU1NfTkFNRSkpOw0KLSAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSByZWNlaXZlck5hbWUuZ2V0QXR0cmlidXRlVmFsdWUoKTsNCi0gICAgICAgICAgICBNZXNzYWdlUmVjZWl2ZXIgcmVjZWl2ZXIgPSBsb2FkTWVzc2FnZVJlY2VpdmVyKGxvYWRlciwgY2xhc3NOYW1lKTsNCi0gICAgICAgICAgICBPTUF0dHJpYnV0ZSBtZXBBdHQgPSByZWNlaXZlckVsZW1lbnQuZ2V0QXR0cmlidXRlKG5ldyBRTmFtZShUQUdfTUVQKSk7DQotICAgICAgICAgICAgbWVwcy5wdXQobWVwQXR0LmdldEF0dHJpYnV0ZVZhbHVlKCksIHJlY2VpdmVyKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBtZXBzOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBNZXNzYWdlUmVjZWl2ZXIgbG9hZE1lc3NhZ2VSZWNlaXZlcihDbGFzc0xvYWRlciBsb2FkZXIsIFN0cmluZyBjbGFzc05hbWUpIHRocm93cyBEZXBsb3ltZW50RXhjZXB0aW9uIHsNCi0gICAgICAgIE1lc3NhZ2VSZWNlaXZlciByZWNlaXZlciA9IG51bGw7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIENsYXNzIG1lc3NhZ2VSZWNlaXZlcjsNCi0gICAgICAgICAgICBpZiAoKGNsYXNzTmFtZSAhPSBudWxsKSAmJiAhIiIuZXF1YWxzKGNsYXNzTmFtZSkpIHsNCi0gICAgICAgICAgICAgICAgbWVzc2FnZVJlY2VpdmVyID0gTG9hZGVyLmxvYWRDbGFzcyhsb2FkZXIsIGNsYXNzTmFtZSk7DQotICAgICAgICAgICAgICAgIHJlY2VpdmVyID0gKE1lc3NhZ2VSZWNlaXZlcikgbWVzc2FnZVJlY2VpdmVyLm5ld0luc3RhbmNlKCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24ob3JnLmFwYWNoZS5heGlzMi5pMThuLk1lc3NhZ2VzLmdldE1lc3NhZ2UoDQotICAgICAgICAgICAgICAgICAgICBEZXBsb3ltZW50RXJyb3JNc2dzLkVSUk9SX0lOX0xPQURJTkdfTUVTU0FHRV9SRUNFSVZFUiwNCi0gICAgICAgICAgICAgICAgICAgICJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIiwgY2xhc3NOYW1lKSwgZSk7DQotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEV4Y2VwdGlvbihvcmcuYXBhY2hlLmF4aXMyLmkxOG4uTWVzc2FnZXMuZ2V0TWVzc2FnZSgNCi0gICAgICAgICAgICAgICAgICAgIERlcGxveW1lbnRFcnJvck1zZ3MuRVJST1JfSU5fTE9BRElOR19NRVNTQUdFX1JFQ0VJVkVSLA0KLSAgICAgICAgICAgICAgICAgICAgIklsbGVnYWxBY2Nlc3NFeGNlcHRpb24iLCBjbGFzc05hbWUpLCBlKTsNCi0gICAgICAgIH0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKG9yZy5hcGFjaGUuYXhpczIuaTE4bi5NZXNzYWdlcy5nZXRNZXNzYWdlKA0KLSAgICAgICAgICAgICAgICAgICAgRGVwbG95bWVudEVycm9yTXNncy5FUlJPUl9JTl9MT0FESU5HX01FU1NBR0VfUkVDRUlWRVIsDQotICAgICAgICAgICAgICAgICAgICAiSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiIsIGNsYXNzTmFtZSksIGUpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlY2VpdmVyOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzUGFyYW1ldGVycyhJdGVyYXRvciBwYXJhbWV0ZXJzLCBQYXJhbWV0ZXJJbmNsdWRlIHBhcmFtZXRlckluY2x1ZGUsDQotICAgICAgICAgICAgUGFyYW1ldGVySW5jbHVkZSBwYXJlbnQpIHRocm93cyBEZXBsb3ltZW50RXhjZXB0aW9uIHsNCi0gICAgICAgIHdoaWxlIChwYXJhbWV0ZXJzLmhhc05leHQoKSkgew0KLSAgICAgICAgICAgIC8vIHRoaXMgaXMgdG8gY2hlY2sgd2hldGhlciBzb21lIG9uZSBoYXMgbG9ja2VkIHRoZSBwYXJtZXRlciBhdCB0aGUNCi0gICAgICAgICAgICAvLyB0b3AgbGV2ZWwNCi0gICAgICAgICAgICBPTUVsZW1lbnQgcGFyYW1ldGVyRWxlbWVudCA9IChPTUVsZW1lbnQpIHBhcmFtZXRlcnMubmV4dCgpOw0KLSAgICAgICAgICAgIFBhcmFtZXRlciBwYXJhbWV0ZXIgPSBuZXcgUGFyYW1ldGVyKCk7DQotICAgICAgICAgICAgLy8gc2V0dGluZyBwYXJhbWV0ZXJFbGVtZW50DQotICAgICAgICAgICAgcGFyYW1ldGVyLnNldFBhcmFtZXRlckVsZW1lbnQocGFyYW1ldGVyRWxlbWVudCk7DQotICAgICAgICAgICAgLy8gc2V0dGluZyBwYXJhbWV0ZXIgTmFtZQ0KLSAgICAgICAgICAgIE9NQXR0cmlidXRlIHBhcmFtTmFtZSA9IHBhcmFtZXRlckVsZW1lbnQuZ2V0QXR0cmlidXRlKG5ldyBRTmFtZShBVFRSSUJVVEVfTkFNRSkpOw0KLSAgICAgICAgICAgIGlmIChwYXJhbU5hbWUgPT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKA0KLSAgICAgICAgICAgICAgICAgICAgICAgIERlcGxveW1lbnRFcnJvck1zZ3MuQkFEX1BBUkFNRVRFUl9BUkdVTUVOVCwgcGFyYW1ldGVyRWxlbWVudC50b1N0cmluZygpKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHBhcmFtZXRlci5zZXROYW1lKHBhcmFtTmFtZS5nZXRBdHRyaWJ1dGVWYWx1ZSgpKTsNCi0gICAgICAgICAgICAvLyBzZXR0aW5nIHBhcmFtZXRlciBWYWx1ZSAodGhlIGNoaWxkIGVsZW1lbnQgb2YgdGhlIHBhcmFtZXRlcikNCi0gICAgICAgICAgICBPTUVsZW1lbnQgcGFyYW1WYWx1ZSA9IHBhcmFtZXRlckVsZW1lbnQuZ2V0Rmlyc3RFbGVtZW50KCk7DQotICAgICAgICAgICAgaWYgKHBhcmFtVmFsdWUgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICBwYXJhbWV0ZXIuc2V0VmFsdWUocGFyYW1ldGVyRWxlbWVudCk7DQotICAgICAgICAgICAgICAgIHBhcmFtZXRlci5zZXRQYXJhbWV0ZXJUeXBlKFBhcmFtZXRlci5PTV9QQVJBTUVURVIpOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIFN0cmluZyBwYXJhdGV4dFZhbHVlID0gcGFyYW1ldGVyRWxlbWVudC5nZXRUZXh0KCk7DQotDQotICAgICAgICAgICAgICAgIHBhcmFtZXRlci5zZXRWYWx1ZShwYXJhdGV4dFZhbHVlKTsNCi0gICAgICAgICAgICAgICAgcGFyYW1ldGVyLnNldFBhcmFtZXRlclR5cGUoUGFyYW1ldGVyLlRFWFRfUEFSQU1FVEVSKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgLy8gc2V0dGluZyBsb2NraW5nIGF0dHJpYnV0ZQ0KLSAgICAgICAgICAgIE9NQXR0cmlidXRlIHBhcmFtTG9ja2VkID0gcGFyYW1ldGVyRWxlbWVudC5nZXRBdHRyaWJ1dGUobmV3IFFOYW1lKEFUVFJJQlVURV9MT0NLRUQpKTsNCi0gICAgICAgICAgICBQYXJhbWV0ZXIgcGFyZW50UGFyYW0gPSBudWxsOw0KLSAgICAgICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICBwYXJlbnRQYXJhbSA9IHBhcmVudC5nZXRQYXJhbWV0ZXIocGFyYW1ldGVyLmdldE5hbWUoKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmIChwYXJhbUxvY2tlZCAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgIFN0cmluZyBsb2NrZWRWYWx1ZSA9IHBhcmFtTG9ja2VkLmdldEF0dHJpYnV0ZVZhbHVlKCk7DQotICAgICAgICAgICAgICAgIGlmIChCT09MRUFOX1RSVUUuZXF1YWxzKGxvY2tlZFZhbHVlKSkgew0KLSAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHBhcmFtZXRlciBpcyBsb2NrZWQgYXQgc29tZSBsZXZlbCBwYXJhbWV0ZXIgdmFsdWUNCi0gICAgICAgICAgICAgICAgICAgIC8vIHJlcGxhY2UgYnkgdGhhdA0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChwYXJlbnQgIT0gbnVsbCkgJiYgcGFyZW50LmlzUGFyYW1ldGVyTG9ja2VkKHBhcmFtZXRlci5nZXROYW1lKCkpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlcGxveW1lbnRFcnJvck1zZ3MuQ09ORklHX05PVF9GT1VORCwgcGFyYW1ldGVyLmdldE5hbWUoKSkpOw0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIuc2V0TG9ja2VkKHRydWUpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyLnNldExvY2tlZChmYWxzZSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICAgICAgaWYgKHBhcmVudCAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoKHBhcmVudFBhcmFtID09IG51bGwpIHx8ICFwYXJlbnQuaXNQYXJhbWV0ZXJMb2NrZWQocGFyYW1ldGVyLmdldE5hbWUoKSkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJJbmNsdWRlLmFkZFBhcmFtZXRlcihwYXJhbWV0ZXIpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVySW5jbHVkZS5hZGRQYXJhbWV0ZXIocGFyYW1ldGVyKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBheGlzRmF1bHQpIHsNCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oYXhpc0ZhdWx0KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NPcGVyYXRpb25zKEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlnLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheUxpc3QgZXhjbHVkZU9wZXJhdGlvbnMsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5TGlzdCBub25ScGNNZXRob2RzLCBTdHJpbmcgZGlyTmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBPUkIgb3JiID0gQ29yYmFVdGlsLmdldE9SQihheGlzU2VydmljZSk7DQotICAgICAgICBJREwgaWRsID0gQ29yYmFVdGlsLmdldElETChheGlzU2VydmljZSwgb3JiLCBkaXJOYW1lKTsNCi0NCi0gICAgICAgIFBhcmFtZXRlciBvcmJQYXJhbSA9IG5ldyBQYXJhbWV0ZXIoT1JCX0xJVEVSQUwsIG9yYik7DQotICAgICAgICBQYXJhbWV0ZXIgaWRsUGFyYW0gPSBuZXcgUGFyYW1ldGVyKElETF9MSVRFUkFMLCBpZGwpOw0KLSAgICAgICAgYXhpc1NlcnZpY2UuYWRkUGFyYW1ldGVyKG9yYlBhcmFtKTsNCi0gICAgICAgIGF4aXNTZXJ2aWNlLmFkZFBhcmFtZXRlcihpZGxQYXJhbSk7DQotDQotICAgICAgICAvLyBhZGRpbmcgbmFtZSBzcGFjZXMNCi0gICAgICAgIE5hbWVzcGFjZU1hcCBtYXAgPSBuZXcgTmFtZXNwYWNlTWFwKCk7DQotICAgICAgICBtYXAucHV0KEphdmEyV1NETENvbnN0YW50cy5BWElTMl9OQU1FU1BBQ0VfUFJFRklYLCBKYXZhMldTRExDb25zdGFudHMuQVhJUzJfWFNEKTsNCi0gICAgICAgIG1hcC5wdXQoSmF2YTJXU0RMQ29uc3RhbnRzLkRFRkFVTFRfU0NIRU1BX05BTUVTUEFDRV9QUkVGSVgsIEphdmEyV1NETENvbnN0YW50cy5VUklfMjAwMV9TQ0hFTUFfWFNEKTsNCi0gICAgICAgIGF4aXNTZXJ2aWNlLnNldE5hbWVzcGFjZU1hcChtYXApOw0KLQ0KLSAgICAgICAgUGFyYW1ldGVyIGludGVyZmFjZU5hbWVQYXJhbSA9IGF4aXNTZXJ2aWNlLmdldFBhcmFtZXRlcihJTlRFUkZBQ0VfTkFNRSk7DQotICAgICAgICBTdHJpbmcgaW50ZXJmYWNlTmFtZSA9IChTdHJpbmcpICgoaW50ZXJmYWNlTmFtZVBhcmFtPT1udWxsKSA/IG51bGwgOiBpbnRlcmZhY2VOYW1lUGFyYW0uZ2V0VmFsdWUoKSk7DQotICAgICAgICBTY2hlbWFHZW5lcmF0b3Igc2NoZW1hR2VuZXJhdG9yID0gbmV3IFNjaGVtYUdlbmVyYXRvcihpZGwsIGludGVyZmFjZU5hbWUsDQotICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlLmdldFNjaGVtYVRhcmdldE5hbWVzcGFjZSgpLA0KLSAgICAgICAgICAgICAgICBheGlzU2VydmljZS5nZXRTY2hlbWFUYXJnZXROYW1lc3BhY2VQcmVmaXgoKSk7DQotICAgICAgICBzY2hlbWFHZW5lcmF0b3Iuc2V0RXhjbHVkZU1ldGhvZHMoZXhjbHVkZU9wZXJhdGlvbnMpOw0KLSAgICAgICAgc2NoZW1hR2VuZXJhdG9yLnNldE5vblJwY01ldGhvZHMobm9uUnBjTWV0aG9kcyk7DQotICAgICAgICBpZiAoIWF4aXNTZXJ2aWNlLmlzRWxlbWVudEZvcm1EZWZhdWx0KCkpIHsNCi0gICAgICAgICAgICBzY2hlbWFHZW5lcmF0b3Iuc2V0RWxlbWVudEZvcm1EZWZhdWx0KEphdmEyV1NETENvbnN0YW50cy5GT1JNX0RFRkFVTFRfVU5RVUFMSUZJRUQpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgLy8gcGFja2FnZSB0byBuYW1lc3BhY2UgbWFwDQotICAgICAgICBzY2hlbWFHZW5lcmF0b3Iuc2V0UGtnMm5zbWFwKGF4aXNTZXJ2aWNlLmdldFAybk1hcCgpKTsNCi0gICAgICAgIENvbGxlY3Rpb24gc2NoZW1hcyA9IHNjaGVtYUdlbmVyYXRvci5nZW5lcmF0ZVNjaGVtYSgpOw0KLSAgICAgICAgYXhpc1NlcnZpY2UuYWRkU2NoZW1hKHNjaGVtYXMpOw0KLSAgICAgICAgYXhpc1NlcnZpY2Uuc2V0U2NoZW1hVGFyZ2V0TmFtZXNwYWNlKHNjaGVtYUdlbmVyYXRvci5nZXRTY2hlbWFUYXJnZXROYW1lU3BhY2UoKSk7DQotICAgICAgICBheGlzU2VydmljZS5zZXRUeXBlVGFibGUoc2NoZW1hR2VuZXJhdG9yLmdldFR5cGVUYWJsZSgpKTsNCi0gICAgICAgIGlmIChKYXZhMldTRExDb25zdGFudHMuREVGQVVMVF9UQVJHRVRfTkFNRVNQQUNFLmVxdWFscygNCi0gICAgICAgICAgICAgICAgYXhpc1NlcnZpY2UuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpKSB7DQotICAgICAgICAgICAgYXhpc1NlcnZpY2Uuc2V0VGFyZ2V0TmFtZXNwYWNlKHNjaGVtYUdlbmVyYXRvci5nZXRUYXJnZXROYW1lc3BhY2UoKSk7DQotICAgICAgICB9DQotDQotICAgICAgICBJbnRlcmZhY2UgaW50ZiA9IChJbnRlcmZhY2UpIGlkbC5nZXRJbnRlcmZhY2VzKCkuZ2V0KGludGVyZmFjZU5hbWUpOw0KLSAgICAgICAgT3BlcmF0aW9uW10gb3BlcmF0aW9ucyA9IGludGYuZ2V0T3BlcmF0aW9ucygpOw0KLQ0KLSAgICAgICAgVHlwZVRhYmxlIHRhYmxlID0gc2NoZW1hR2VuZXJhdG9yLmdldFR5cGVUYWJsZSgpOw0KLSAgICAgICAgUGhhc2VzSW5mbyBwaW5mbyA9IGF4aXNDb25maWcuZ2V0UGhhc2VzSW5mbygpOw0KLQ0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvcGVyYXRpb25zLmxlbmd0aDsgaSsrKSB7DQotICAgICAgICAgICAgT3BlcmF0aW9uIGNvcmJhT3BlcmF0aW9uID0gb3BlcmF0aW9uc1tpXTsNCi0gICAgICAgICAgICBTdHJpbmcgb3BOYW1lID0gY29yYmFPcGVyYXRpb24uZ2V0TmFtZSgpOw0KLSAgICAgICAgICAgIGlmIChleGNsdWRlT3BlcmF0aW9ucyAhPSBudWxsICYmIGV4Y2x1ZGVPcGVyYXRpb25zLmNvbnRhaW5zKG9wTmFtZSkpIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIEF4aXNPcGVyYXRpb24gb3BlcmF0aW9uID0gYXhpc1NlcnZpY2UuZ2V0T3BlcmF0aW9uKG5ldyBRTmFtZShvcE5hbWUpKTsNCi0gICAgICAgICAgICAvLyBpZiB0aGUgb3BlcmF0aW9uIHRoZXJlIGluIHNlcnZpY2VzLnhtbCB0aGVuIHRyeSB0byBzZXQgaXQgc2NoZW1hIGVsZW1lbnQgbmFtZQ0KLSAgICAgICAgICAgIGlmIChvcGVyYXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICBBeGlzTWVzc2FnZSBpbk1lc3NhZ2UgPSBvcGVyYXRpb24uZ2V0TWVzc2FnZSgNCi0gICAgICAgICAgICAgICAgICAgICAgICBXU0RMQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfSU5fVkFMVUUpOw0KLSAgICAgICAgICAgICAgICBpZiAoaW5NZXNzYWdlICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgICAgIGluTWVzc2FnZS5zZXROYW1lKG9wTmFtZSArIEphdmEyV1NETENvbnN0YW50cy5NRVNTQUdFX1NVRkZJWCk7DQotICAgICAgICAgICAgICAgICAgICBRTmFtZSBjb21wbGV4U2NoZW1hVHlwZSA9IHRhYmxlLmdldENvbXBsZXhTY2hlbWFUeXBlKG9wTmFtZSk7DQotICAgICAgICAgICAgICAgICAgICBpbk1lc3NhZ2Uuc2V0RWxlbWVudFFOYW1lKGNvbXBsZXhTY2hlbWFUeXBlKTsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChjb21wbGV4U2NoZW1hVHlwZSAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgYXhpc1NlcnZpY2UuYWRkTWVzc2FnZUVsZW1lbnRRTmFtZVRvT3BlcmF0aW9uTWFwcGluZyhjb21wbGV4U2NoZW1hVHlwZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbik7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgRGF0YVR5cGUgcmV0dXJuVHlwZSA9IGNvcmJhT3BlcmF0aW9uLmdldFJldHVyblR5cGUoKTsNCi0gICAgICAgICAgICAgICAgaWYgKHJldHVyblR5cGUgIT0gbnVsbCAmJiAhQ29yYmFVdGlsLmdldFF1YWxpZmllZE5hbWUocmV0dXJuVHlwZSkuZXF1YWxzKFZPSUQpKSB7DQotICAgICAgICAgICAgICAgICAgICBBeGlzTWVzc2FnZSBvdXRNZXNzYWdlID0gb3BlcmF0aW9uLmdldE1lc3NhZ2UoV1NETENvbnN0YW50cy5NRVNTQUdFX0xBQkVMX09VVF9WQUxVRSk7DQotICAgICAgICAgICAgICAgICAgICBRTmFtZSBxTmFtZWZvcnRoZVR5cGUgPSB0YWJsZS5nZXRRTmFtZWZvcnRoZVR5cGUob3BOYW1lICsgUkVTUE9OU0UpOw0KLSAgICAgICAgICAgICAgICAgICAgb3V0TWVzc2FnZS5zZXRFbGVtZW50UU5hbWUocU5hbWVmb3J0aGVUeXBlKTsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChxTmFtZWZvcnRoZVR5cGUgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlLmFkZE1lc3NhZ2VFbGVtZW50UU5hbWVUb09wZXJhdGlvbk1hcHBpbmcocU5hbWVmb3J0aGVUeXBlLCBvcGVyYXRpb24pOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgb3V0TWVzc2FnZS5zZXROYW1lKG9wTmFtZSArIFJFU1BPTlNFKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBpZiAoY29yYmFPcGVyYXRpb24uaGFzUmFpc2VzKCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIExpc3QgZXh0eXBlcyA9IGNvcmJhT3BlcmF0aW9uLmdldFJhaXNlcygpOw0KLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBleHR5cGVzLnNpemUoKTsgaisrKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgQXhpc01lc3NhZ2UgZmF1bHRNZXNzYWdlID0gbmV3IEF4aXNNZXNzYWdlKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgRXhjZXB0aW9uVHlwZSBleHR5cGUgPSAoRXhjZXB0aW9uVHlwZSkgZXh0eXBlcy5nZXQoaik7DQotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGV4bmFtZSA9IGV4dHlwZS5nZXROYW1lKCkgOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKGV4dHlwZXMuc2l6ZSgpPjEpew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYXVsdE1lc3NhZ2Uuc2V0TmFtZShvcE5hbWUgKyBGQVVMVCArIGopOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZXsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmF1bHRNZXNzYWdlLnNldE5hbWUob3BOYW1lICsgRkFVTFQpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBmYXVsdE1lc3NhZ2Uuc2V0RWxlbWVudFFOYW1lKA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUuZ2V0Q29tcGxleFNjaGVtYVR5cGUoZXhuYW1lICsgRkFVTFQpKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24uc2V0RmF1bHRNZXNzYWdlcyhmYXVsdE1lc3NhZ2UpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgb3BlcmF0aW9uID0gZ2V0QXhpc09wZXJhdGlvbmZvckNvcmJhT3BlcmF0aW9uKGNvcmJhT3BlcmF0aW9uLCB0YWJsZSk7DQotICAgICAgICAgICAgICAgIE1lc3NhZ2VSZWNlaXZlciBtciA9IGF4aXNTZXJ2aWNlLmdldE1lc3NhZ2VSZWNlaXZlcigNCi0gICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24uZ2V0TWVzc2FnZUV4Y2hhbmdlUGF0dGVybigpKTsNCi0gICAgICAgICAgICAgICAgaWYgKG1yICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbi5zZXRNZXNzYWdlUmVjZWl2ZXIobXIpOw0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgbXIgPSBheGlzQ29uZmlnLmdldE1lc3NhZ2VSZWNlaXZlcihvcGVyYXRpb24uZ2V0TWVzc2FnZUV4Y2hhbmdlUGF0dGVybigpKTsNCi0gICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbi5zZXRNZXNzYWdlUmVjZWl2ZXIobXIpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHBpbmZvLnNldE9wZXJhdGlvblBoYXNlcyhvcGVyYXRpb24pOw0KLSAgICAgICAgICAgICAgICBheGlzU2VydmljZS5hZGRPcGVyYXRpb24ob3BlcmF0aW9uKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYgKG9wZXJhdGlvbi5nZXRJbnB1dEFjdGlvbigpID09IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgb3BlcmF0aW9uLnNldFNvYXBBY3Rpb24oInVybjoiICsgb3BOYW1lKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBBeGlzT3BlcmF0aW9uIGdldEF4aXNPcGVyYXRpb25mb3JDb3JiYU9wZXJhdGlvbihPcGVyYXRpb24gY29yYmFPcGVyYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZVRhYmxlIHRhYmxlKSB0aHJvd3MgQXhpc0ZhdWx0IHsNCi0gICAgICAgIEF4aXNPcGVyYXRpb24gb3BlcmF0aW9uOw0KLSAgICAgICAgU3RyaW5nIG9wTmFtZSA9IGNvcmJhT3BlcmF0aW9uLmdldE5hbWUoKTsNCi0gICAgICAgIERhdGFUeXBlIHJldHVyblR5cGUgPSBjb3JiYU9wZXJhdGlvbi5nZXRSZXR1cm5UeXBlKCk7DQotICAgICAgICBpZiAocmV0dXJuVHlwZSA9PSBudWxsIHx8IENvcmJhVXRpbC5nZXRRdWFsaWZpZWROYW1lKHJldHVyblR5cGUpLmVxdWFscyhWT0lEKSkgew0KLSAgICAgICAgICAgIGlmIChjb3JiYU9wZXJhdGlvbi5oYXNSYWlzZXMoKSkgew0KLSAgICAgICAgICAgICAgICBvcGVyYXRpb24gPSBBeGlzT3BlcmF0aW9uRmFjdG9yeS5nZXRBeGlzT3BlcmF0aW9uKFdTRExDb25zdGFudHMuTUVQX0NPTlNUQU5UX0lOX09VVCk7DQotICAgICAgICAgICAgICAgIEF4aXNNZXNzYWdlIG91dE1lc3NhZ2UgPSBvcGVyYXRpb24uZ2V0TWVzc2FnZSgNCi0gICAgICAgICAgICAgICAgICAgICAgICBXU0RMQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfT1VUX1ZBTFVFKTsNCi0gICAgICAgICAgICAgICAgb3V0TWVzc2FnZS5zZXRFbGVtZW50UU5hbWUodGFibGUuZ2V0UU5hbWVmb3J0aGVUeXBlKG9wTmFtZSArIFJFU1BPTlNFKSk7DQotICAgICAgICAgICAgICAgIG91dE1lc3NhZ2Uuc2V0TmFtZShvcE5hbWUgKyBSRVNQT05TRSk7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgb3BlcmF0aW9uID0gQXhpc09wZXJhdGlvbkZhY3RvcnkuZ2V0QXhpc09wZXJhdGlvbihXU0RMQ29uc3RhbnRzLk1FUF9DT05TVEFOVF9JTl9PTkxZKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIG9wZXJhdGlvbiA9IEF4aXNPcGVyYXRpb25GYWN0b3J5LmdldEF4aXNPcGVyYXRpb24oV1NETENvbnN0YW50cy5NRVBfQ09OU1RBTlRfSU5fT1VUKTsNCi0gICAgICAgICAgICBBeGlzTWVzc2FnZSBvdXRNZXNzYWdlID0gb3BlcmF0aW9uLmdldE1lc3NhZ2UoDQotICAgICAgICAgICAgICAgICAgICBXU0RMQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfT1VUX1ZBTFVFKTsNCi0gICAgICAgICAgICBvdXRNZXNzYWdlLnNldEVsZW1lbnRRTmFtZSh0YWJsZS5nZXRRTmFtZWZvcnRoZVR5cGUob3BOYW1lICsgUkVTUE9OU0UpKTsNCi0gICAgICAgICAgICBvdXRNZXNzYWdlLnNldE5hbWUob3BOYW1lICsgUkVTUE9OU0UpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKGNvcmJhT3BlcmF0aW9uLmhhc1JhaXNlcygpKSB7DQotICAgICAgICAgICAgTGlzdCBleHR5cGVzID0gY29yYmFPcGVyYXRpb24uZ2V0UmFpc2VzKCk7DQotICAgICAgICAgICAgZm9yIChpbnQgaj0gMCA7IGogPCBleHR5cGVzLnNpemUoKSA7IGorKykgew0KLSAgICAgICAgICAgICAgICBBeGlzTWVzc2FnZSBmYXVsdE1lc3NhZ2UgPSBuZXcgQXhpc01lc3NhZ2UoKTsNCi0gICAgICAgICAgICAgICAgRXhjZXB0aW9uVHlwZSBleHR5cGUgPSAoRXhjZXB0aW9uVHlwZSkgZXh0eXBlcy5nZXQoaik7DQotICAgICAgICAgICAgICAgIFN0cmluZyBleG5hbWUgPSBleHR5cGUuZ2V0TmFtZSgpIDsNCi0gICAgICAgICAgICAgICAgaWYoZXh0eXBlcy5zaXplKCkgPjEpew0KLSAgICAgICAgICAgICAgICAgICAgZmF1bHRNZXNzYWdlLnNldE5hbWUob3BOYW1lICsgRkFVTFQgKyBqKTsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgIGZhdWx0TWVzc2FnZS5zZXROYW1lKG9wTmFtZSArIEZBVUxUKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBmYXVsdE1lc3NhZ2Uuc2V0RWxlbWVudFFOYW1lKA0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlLmdldENvbXBsZXhTY2hlbWFUeXBlKGV4bmFtZSArIEZBVUxUKSk7DQotICAgICAgICAgICAgICAgIG9wZXJhdGlvbi5zZXRGYXVsdE1lc3NhZ2VzKGZhdWx0TWVzc2FnZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgb3BlcmF0aW9uLnNldE5hbWUobmV3IFFOYW1lKG9wTmFtZSkpOw0KLSAgICAgICAgQXhpc01lc3NhZ2UgaW5NZXNzYWdlID0gb3BlcmF0aW9uLmdldE1lc3NhZ2UoV1NETENvbnN0YW50cy5NRVNTQUdFX0xBQkVMX0lOX1ZBTFVFKTsNCi0gICAgICAgIGlmIChpbk1lc3NhZ2UgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIGluTWVzc2FnZS5zZXRFbGVtZW50UU5hbWUodGFibGUuZ2V0Q29tcGxleFNjaGVtYVR5cGUob3BOYW1lKSk7DQotICAgICAgICAgICAgaW5NZXNzYWdlLnNldE5hbWUob3BOYW1lICsgSmF2YTJXU0RMQ29uc3RhbnRzLk1FU1NBR0VfU1VGRklYKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBvcGVyYXRpb247DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RGlyZWN0b3J5KFN0cmluZyBkaXJlY3RvcnkpIHsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRFeHRlbnNpb24oU3RyaW5nIGV4dGVuc2lvbikgew0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHVuRGVwbG95KFN0cmluZyBmaWxlTmFtZSkgdGhyb3dzIERlcGxveW1lbnRFeGNlcHRpb24gew0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBmaWxlTmFtZSA9IFV0aWxzLmdldFNob3J0RmlsZU5hbWUoZmlsZU5hbWUpOw0KLSAgICAgICAgICAgIGF4aXNDb25maWcucmVtb3ZlU2VydmljZUdyb3VwKGZpbGVOYW1lKTsNCi0gICAgICAgICAgICBsb2cuaW5mbyhNZXNzYWdlcy5nZXRNZXNzYWdlKERlcGxveW1lbnRFcnJvck1zZ3MuU0VSVklDRV9SRU1PVkVELCBmaWxlTmFtZSkpOw0KLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGF4aXNGYXVsdCkgew0KLSAgICAgICAgICAgIGF4aXNDb25maWcucmVtb3ZlRmF1bHR5U2VydmljZShmaWxlTmFtZSk7DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvZGVwbG95ZXIvU2NoZW1hR2VuZXJhdG9yLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9kZXBsb3llci9TY2hlbWFHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM0YzQ0My4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9kZXBsb3llci9TY2hlbWFHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczOCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmRlcGxveWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmV4Y2VwdGlvbnMuU2NoZW1hR2VuZXJhdG9yRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC50eXBlcy5BYnN0cmFjdENvbGxlY3Rpb25UeXBlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC50eXBlcy5BcnJheVR5cGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLnR5cGVzLkNvbXBvc2l0ZURhdGFUeXBlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC50eXBlcy5EYXRhVHlwZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5pZGwudHlwZXMuRW51bVR5cGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLnR5cGVzLkV4Y2VwdGlvblR5cGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLnR5cGVzLklETDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5pZGwudHlwZXMuSW50ZXJmYWNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC50eXBlcy5NZW1iZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLnR5cGVzLk9wZXJhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5pZGwudHlwZXMuUHJpbWl0aXZlRGF0YVR5cGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLnR5cGVzLlR5cGVkZWY7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLnR5cGVzLlVuaW9uVHlwZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5yZWNlaXZlcnMuQ29yYmFVdGlsOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLmphdmEyd3NkbC5EZWZhdWx0TmFtZXNwYWNlR2VuZXJhdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLmphdmEyd3NkbC5KYXZhMldTRExDb25zdGFudHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uamF2YTJ3c2RsLk5hbWVzcGFjZUdlbmVyYXRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5qYXZhMndzZGwuVHlwZVRhYmxlOw0KLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYTsNCi1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFDaG9pY2U7DQotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hQ29sbGVjdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFDb21wbGV4VHlwZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFFbGVtZW50Ow0KLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYUVudW1lcmF0aW9uRmFjZXQ7DQotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hRm9ybTsNCi1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFJbXBvcnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hT2JqZWN0Q29sbGVjdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFTZXF1ZW5jZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFTaW1wbGVUeXBlOw0KLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYVNpbXBsZVR5cGVSZXN0cmljdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS51dGlscy5OYW1lc3BhY2VNYXA7DQotDQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotcHVibGljIGNsYXNzIFNjaGVtYUdlbmVyYXRvciBpbXBsZW1lbnRzIENvcmJhQ29uc3RhbnRzIHsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IHByZWZpeENvdW50ID0gMTsNCi0gICAgcHJvdGVjdGVkIE1hcCB0YXJnZXROYW1lc3BhY2VQcmVmaXhNYXAgPSBuZXcgSGFzaHRhYmxlKCk7DQotICAgIHByb3RlY3RlZCBNYXAgc2NoZW1hTWFwID0gbmV3IEhhc2h0YWJsZSgpOw0KLSAgICBwcm90ZWN0ZWQgWG1sU2NoZW1hQ29sbGVjdGlvbiB4bWxTY2hlbWFDb2xsZWN0aW9uID0gbmV3IFhtbFNjaGVtYUNvbGxlY3Rpb24oKTsNCi0gICAgcHJpdmF0ZSBJREwgaWRsOw0KLSAgICBwcml2YXRlIFN0cmluZyBpbnRlcmZhY2VOYW1lOw0KLSAgICBwcml2YXRlIFR5cGVUYWJsZSB0eXBlVGFibGUgPSBuZXcgVHlwZVRhYmxlKCk7DQotICAgIHByaXZhdGUgU3RyaW5nIHNjaGVtYVRhcmdldE5hbWVTcGFjZTsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgc2NoZW1hX25hbWVzcGFjZV9wcmVmaXg7DQotICAgIHByaXZhdGUgU3RyaW5nIGF0dHJGb3JtRGVmYXVsdCA9IG51bGw7DQotICAgIHByaXZhdGUgU3RyaW5nIGVsZW1lbnRGb3JtRGVmYXVsdCA9IG51bGw7DQotICAgIHByaXZhdGUgQXJyYXlMaXN0IGV4Y2x1ZGVNZXRob2RzID0gbmV3IEFycmF5TGlzdCgpOw0KLSAgICBwcml2YXRlIEFycmF5TGlzdCBleHRyYUNsYXNzZXMgPSBudWxsOw0KLSAgICBwcml2YXRlIGJvb2xlYW4gdXNlV1NETFR5cGVzTmFtZXNwYWNlID0gZmFsc2U7DQotICAgIHByaXZhdGUgTWFwIHBrZzJuc21hcCA9IG51bGw7DQotICAgIHByaXZhdGUgTmFtZXNwYWNlR2VuZXJhdG9yIG5zR2VuID0gbnVsbDsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0gbnVsbDsNCi0gICAgcHJpdmF0ZSBBcnJheUxpc3Qgbm9uUnBjTWV0aG9kcyA9IG5ldyBBcnJheUxpc3QoKTsNCi0NCi0gICAgcHVibGljIE5hbWVzcGFjZUdlbmVyYXRvciBnZXROc0dlbigpIHRocm93cyBTY2hlbWFHZW5lcmF0b3JFeGNlcHRpb24gew0KLSAgICAgICAgaWYgKCBuc0dlbiA9PSBudWxsICkgew0KLSAgICAgICAgICAgIG5zR2VuID0gbmV3IERlZmF1bHROYW1lc3BhY2VHZW5lcmF0b3IoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBuc0dlbjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXROc0dlbihOYW1lc3BhY2VHZW5lcmF0b3IgbnNHZW4pIHsNCi0gICAgICAgIHRoaXMubnNHZW4gPSBuc0dlbjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU2NoZW1hR2VuZXJhdG9yKElETCBpZGwsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGludGVyZmFjZU5hbWUsIFN0cmluZyBzY2hlbWF0YXJnZXROYW1lc3BhY2UsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNjaGVtYXRhcmdldE5hbWVzcGFjZVByZWZpeCkNCi0gICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIHRoaXMuaWRsID0gaWRsOw0KLSAgICAgICAgdGhpcy5pbnRlcmZhY2VOYW1lID0gaW50ZXJmYWNlTmFtZTsNCi0NCi0gICAgICAgIFN0cmluZ0J1ZmZlciBzdHJpbmdCdWZmZXIgPSBuYW1lc3BhY2VGcm9tTW9kdWxlTmFtZShpbnRlcmZhY2VOYW1lLCBnZXROc0dlbigpKTsNCi0gICAgICAgIGlmIChzdHJpbmdCdWZmZXIubGVuZ3RoKCkgPT0gMCkgew0KLSAgICAgICAgICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoSmF2YTJXU0RMQ29uc3RhbnRzLkRFRkFVTFRfVEFSR0VUX05BTUVTUEFDRSk7DQotICAgICAgICB9DQotICAgICAgICB0aGlzLnRhcmdldE5hbWVzcGFjZSA9IHN0cmluZ0J1ZmZlci50b1N0cmluZygpOw0KLQ0KLSAgICAgICAgaWYgKHNjaGVtYXRhcmdldE5hbWVzcGFjZSAhPSBudWxsDQotICAgICAgICAgICAgICAgICYmIHNjaGVtYXRhcmdldE5hbWVzcGFjZS50cmltKCkubGVuZ3RoKCkgIT0gMCkgew0KLSAgICAgICAgICAgIHRoaXMuc2NoZW1hVGFyZ2V0TmFtZVNwYWNlID0gc2NoZW1hdGFyZ2V0TmFtZXNwYWNlOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBzdHJpbmdCdWZmZXIgPSBuYW1lc3BhY2VGcm9tTW9kdWxlTmFtZShpbnRlcmZhY2VOYW1lLCBnZXROc0dlbigpKTsNCi0gICAgICAgICAgICBpZiAoc3RyaW5nQnVmZmVyLmxlbmd0aCgpID09IDApIHsNCi0gICAgICAgICAgICAgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChKYXZhMldTRExDb25zdGFudHMuREVGQVVMVF9UQVJHRVRfTkFNRVNQQUNFKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChTQ0hFTUFfTkFNRVNQQUNFX0VYVE4pOw0KLSAgICAgICAgICAgIHRoaXMuc2NoZW1hVGFyZ2V0TmFtZVNwYWNlID0gc3RyaW5nQnVmZmVyLnRvU3RyaW5nKCk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoc2NoZW1hdGFyZ2V0TmFtZXNwYWNlUHJlZml4ICE9IG51bGwNCi0gICAgICAgICAgICAgICAgJiYgc2NoZW1hdGFyZ2V0TmFtZXNwYWNlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSAhPSAwKSB7DQotICAgICAgICAgICAgdGhpcy5zY2hlbWFfbmFtZXNwYWNlX3ByZWZpeCA9IHNjaGVtYXRhcmdldE5hbWVzcGFjZVByZWZpeDsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgdGhpcy5zY2hlbWFfbmFtZXNwYWNlX3ByZWZpeCA9IEphdmEyV1NETENvbnN0YW50cy5TQ0hFTUFfTkFNRVNQQUNFX1BSRklYOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZ0J1ZmZlciBuYW1lc3BhY2VGcm9tTW9kdWxlTmFtZShTdHJpbmcgaW50ZXJmYWNlTmFtZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWVzcGFjZUdlbmVyYXRvciBuc0dlbikgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBTdHJpbmcgbW9kdWxlTmFtZSA9IG51bGw7DQotICAgICAgICBpZiAoaW50ZXJmYWNlTmFtZSAhPSBudWxsKSB7DQotICAgICAgICAgICAgaW50IGkgPSBpbnRlcmZhY2VOYW1lLmxhc3RJbmRleE9mKCI6OiIpOw0KLSAgICAgICAgICAgIGlmIChpID4gMCkNCi0gICAgICAgICAgICAgICAgbW9kdWxlTmFtZSA9IGludGVyZmFjZU5hbWUuc3Vic3RyaW5nKDAsIGkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKG1vZHVsZU5hbWU9PW51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ0J1ZmZlcigpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICByZXR1cm4gbnNHZW4ubmFtZXNwYWNlRnJvbVBhY2thZ2VOYW1lKG1vZHVsZU5hbWUpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBHZW5lcmF0ZXMgc2NoZW1hIGZvciBhbGwgdGhlIHBhcmFtZXRlcnMgaW4gbWV0aG9kLiBGaXJzdCBnZW5lcmF0ZXMgc2NoZW1hIGZvciBhbGwgZGlmZmVyZW50DQotICAgICAqIHBhcmFtZXRlciB0eXBlIGFuZCBsYXRlciByZWZlcnMgdG8gdGhlbS4NCi0gICAgICoNCi0gICAgICogQHJldHVybiBSZXR1cm5zIFhtbFNjaGVtYS4NCi0gICAgICogQHRocm93cyBTY2hlbWFHZW5lcmF0b3JFeGNlcHRpb24gaWYgZmFpbGVkDQotICAgICAqLw0KLSAgICBwdWJsaWMgQ29sbGVjdGlvbiBnZW5lcmF0ZVNjaGVtYSgpIHRocm93cyBTY2hlbWFHZW5lcmF0b3JFeGNlcHRpb24gew0KLSAgICAgICAgTWFwIGludGVyZmFjZXMgPSBpZGwuZ2V0SW50ZXJmYWNlcygpOw0KLQ0KLSAgICAgICAgaWYgKGludGVyZmFjZXM9PW51bGwpDQotICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVtYUdlbmVyYXRvckV4Y2VwdGlvbigiTm8gaW50ZXJmYWNlcyBkZWZpbmVkIik7DQotDQotICAgICAgICBpZiAoaW50ZXJmYWNlTmFtZT09bnVsbCkNCi0gICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hR2VuZXJhdG9yRXhjZXB0aW9uKCJJbnRlcmZhY2UgbmFtZSByZXF1aXJlZCIpOw0KLQ0KLSAgICAgICAgSW50ZXJmYWNlIGludGYgPSAoSW50ZXJmYWNlKSBpbnRlcmZhY2VzLmdldChpbnRlcmZhY2VOYW1lKTsNCi0gICAgICAgIC8qKg0KLSAgICAgICAgICogU2NoZW1hIGdlbmVydGFpb24gZG9uZSBpbiB0d28gc3RhZ2UgMS4gTG9hZCBhbGwgdGhlIG1ldGhvZHMgYW5kDQotICAgICAgICAgKiBjcmVhdGUgdHlwZSBmb3IgbWV0aG9kcyBwYXJhbWV0ZXJzIChpZiB0aGUgcGFyYW1ldGVycyBhcmUgQmVhbnMNCi0gICAgICAgICAqIHRoZW4gaXQgd2lsbCBjcmVhdGUgQ29tcGxleCB0eXBlcyBmb3IgdGhvc2UgLCBhbmQgaWYgdGhlDQotICAgICAgICAgKiBwYXJhbWV0ZXJzIGFyZSBzaW1wbGUgdHlwZSB3aGljaCBkZWNyaWJlIGluIFNpbXBsZVR5cGVUYWJsZQ0KLSAgICAgICAgICogbm90aGluZyB3aWxsIGhhcHBlbikgMi4gSW4gdGhlIG5leHQgc3RhZ2UgZm9yIGFsbCB0aGUgbWV0aG9kcw0KLSAgICAgICAgICogbWVzc2FnZXMgYW5kIHBvcnQgdHlwZXMgd2lsbCBiZSBjcmV0ZWF0ZWQNCi0gICAgICAgICAqLw0KLQ0KLSAgICAgICAgaWYgKGludGY9PW51bGwpDQotICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVtYUdlbmVyYXRvckV4Y2VwdGlvbigiSW50ZXJmYWNlICIgKyBpbnRlcmZhY2VOYW1lICsgIiBkb2VzIG5vdCBleGlzdHMiKTsNCi0gICAgICAgIE9wZXJhdGlvbltdIG9wZXJhdGlvbnMgPSBpbnRmLmdldE9wZXJhdGlvbnMoKTsNCi0NCi0gICAgICAgIC8vIHNpbmNlIHdlIGRvIG5vdCBzdXBwb3J0IG92ZXJsb2FkDQotICAgICAgICBIYXNoTWFwIHVuaXF1ZU1ldGhvZHMgPSBuZXcgSGFzaE1hcCgpOw0KLSAgICAgICAgWG1sU2NoZW1hQ29tcGxleFR5cGUgbWV0aG9kU2NoZW1hVHlwZTsNCi0gICAgICAgIFhtbFNjaGVtYVNlcXVlbmNlIHNlcXVlbmNlID0gbnVsbDsNCi0gICAgICAgIExpc3QgcHJvY2Vzc2VkRXhzID0gbmV3IEFycmF5TGlzdCgpOw0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvcGVyYXRpb25zLmxlbmd0aDsgaSsrKSB7DQotICAgICAgICAgICAgT3BlcmF0aW9uIG9wZXJhdGlvbiA9IG9wZXJhdGlvbnNbaV07DQotICAgICAgICAgICAgU3RyaW5nIG9wZXJhdGlvbk5hbWUgPSBvcGVyYXRpb24uZ2V0TmFtZSgpOw0KLSAgICAgICAgICAgIGlmIChleGNsdWRlTWV0aG9kcy5jb250YWlucyhvcGVyYXRpb25OYW1lKSkgew0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgaWYgKHVuaXF1ZU1ldGhvZHMuZ2V0KG9wZXJhdGlvbk5hbWUpICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVtYUdlbmVyYXRvckV4Y2VwdGlvbigNCi0gICAgICAgICAgICAgICAgICAgICAgICAiIFNvcnJ5IHdlIGRvbid0IHN1cHBvcnQgbWV0aG9kcyBvdmVybG9hZGluZyAhISEhICIpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBpZiAob3BlcmF0aW9uLmhhc1JhaXNlcygpKSB7DQotICAgICAgICAgICAgICAgIExpc3QgZXh0eXBlcyA9IG9wZXJhdGlvbi5nZXRSYWlzZXMoKTsNCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBleHR5cGVzLnNpemUoKTsgaisrKSB7DQotICAgICAgICAgICAgICAgICAgICBFeGNlcHRpb25UeXBlIGV4dHlwZSA9IChFeGNlcHRpb25UeXBlKSBleHR5cGVzLmdldChqKTsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChwcm9jZXNzZWRFeHMuY29udGFpbnMoZXh0eXBlLmdldE5hbWUoKSkpDQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgICAgICBwcm9jZXNzZWRFeHMuYWRkKGV4dHlwZS5nZXROYW1lKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgbWV0aG9kU2NoZW1hVHlwZSA9IGNyZWF0ZVNjaGVtYVR5cGVGb3JNZXRob2RQYXJ0KGV4dHlwZS5nZXROYW1lKCkrICJGYXVsdCIpOw0KLSAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2UgPSBuZXcgWG1sU2NoZW1hU2VxdWVuY2UoKTsNCi0gICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlU2NoZW1hRm9yVHlwZShzZXF1ZW5jZSwgZXh0eXBlLCBleHR5cGUuZ2V0TmFtZSgpKTsNCi0gICAgICAgICAgICAgICAgICAgIG1ldGhvZFNjaGVtYVR5cGUuc2V0UGFydGljbGUoc2VxdWVuY2UpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHVuaXF1ZU1ldGhvZHMucHV0KG9wZXJhdGlvbk5hbWUsIG9wZXJhdGlvbik7DQotICAgICAgICAgICAgLy9jcmVhdGUgdGhlIHNjaGVtYSB0eXBlIGZvciB0aGUgbWV0aG9kIHdyYXBwZXINCi0gICAgICAgICAgICBMaXN0IHBhcmFzID0gb3BlcmF0aW9uLmdldFBhcmFtcygpOw0KLSAgICAgICAgICAgIGlmIChwYXJhcyAhPSBudWxsICYmIHBhcmFzLnNpemUoKSA+IDApIHsNCi0gICAgICAgICAgICAgICAgc2VxdWVuY2UgPSBuZXcgWG1sU2NoZW1hU2VxdWVuY2UoKTsNCi0gICAgICAgICAgICAgICAgbWV0aG9kU2NoZW1hVHlwZSA9IGNyZWF0ZVNjaGVtYVR5cGVGb3JNZXRob2RQYXJ0KG9wZXJhdGlvbk5hbWUpOw0KLSAgICAgICAgICAgICAgICBtZXRob2RTY2hlbWFUeXBlLnNldFBhcnRpY2xlKHNlcXVlbmNlKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgTGlzdCBvdXRwYXJhcyA9IG51bGw7DQotICAgICAgICAgICAgaWYgKHBhcmFzICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBwYXJhcy5zaXplKCk7IGorKykgew0KLSAgICAgICAgICAgICAgICAgICAgTWVtYmVyIHBhcmFtID0gKE1lbWJlcikgcGFyYXMuZ2V0KGopOw0KLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhcmFtZXRlck5hbWUgPSBwYXJhbS5nZXROYW1lKCk7DQotICAgICAgICAgICAgICAgICAgICBEYXRhVHlwZSBwYXJhVHlwZSA9IHBhcmFtLmdldERhdGFUeXBlKCk7DQotICAgICAgICAgICAgICAgICAgICBpZiAoTWVtYmVyLk1PREVfSU5PVVQuZXF1YWxzKHBhcmFtLmdldE1vZGUoKSkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3V0cGFyYXM9PW51bGwpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHBhcmFzID0gbmV3IEFycmF5TGlzdCgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHBhcmFzLmFkZChwYXJhbSk7DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKE1lbWJlci5NT0RFX09VVC5lcXVhbHMocGFyYW0uZ2V0TW9kZSgpKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvdXRwYXJhcz09bnVsbCkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cGFyYXMgPSBuZXcgQXJyYXlMaXN0KCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cGFyYXMuYWRkKHBhcmFtKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGlmKG5vblJwY01ldGhvZHMuY29udGFpbnMob3BlcmF0aW9uTmFtZSkpew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlU2NoZW1hRm9yVHlwZShzZXF1ZW5jZSwgbnVsbCwgb3BlcmF0aW9uTmFtZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlU2NoZW1hRm9yVHlwZShzZXF1ZW5jZSwgcGFyYVR5cGUsIHBhcmFtZXRlck5hbWUpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIERhdGFUeXBlIHJldHVyblR5cGUgPSBvcGVyYXRpb24uZ2V0UmV0dXJuVHlwZSgpOw0KLQ0KLSAgICAgICAgICAgIGlmICgocmV0dXJuVHlwZSAhPSBudWxsICYmICFDb3JiYVV0aWwuZ2V0UXVhbGlmaWVkTmFtZShyZXR1cm5UeXBlKS5lcXVhbHMoVk9JRCkpIHx8IG91dHBhcmFzIT1udWxsKSB7DQotICAgICAgICAgICAgICAgIG1ldGhvZFNjaGVtYVR5cGUgPSBjcmVhdGVTY2hlbWFUeXBlRm9yTWV0aG9kUGFydChvcGVyYXRpb25OYW1lICsgUkVTUE9OU0UpOw0KLSAgICAgICAgICAgICAgICBzZXF1ZW5jZSA9IG5ldyBYbWxTY2hlbWFTZXF1ZW5jZSgpOw0KLSAgICAgICAgICAgICAgICBtZXRob2RTY2hlbWFUeXBlLnNldFBhcnRpY2xlKHNlcXVlbmNlKTsNCi0NCi0gICAgICAgICAgICAgICAgaWYgKHJldHVyblR5cGUgIT0gbnVsbCAmJiAhQ29yYmFVdGlsLmdldFF1YWxpZmllZE5hbWUocmV0dXJuVHlwZSkuZXF1YWxzKFZPSUQpKSB7DQotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmV0dXJuTmFtZSA9InJldHVybiI7DQotICAgICAgICAgICAgICAgICAgICBpZihub25ScGNNZXRob2RzLmNvbnRhaW5zKG9wZXJhdGlvbk5hbWUpKXsNCi0gICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZVNjaGVtYUZvclR5cGUoc2VxdWVuY2UsIG51bGwsIHJldHVybk5hbWUpOw0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZVNjaGVtYUZvclR5cGUoc2VxdWVuY2UsIHJldHVyblR5cGUsIHJldHVybk5hbWUpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIGlmIChvdXRwYXJhcyAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG91dHBhcmFzLnNpemUoKTsgaisrKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgTWVtYmVyIHBhcmFtID0gKE1lbWJlcikgb3V0cGFyYXMuZ2V0KGopOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXJhbWV0ZXJOYW1lID0gcGFyYW0uZ2V0TmFtZSgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIERhdGFUeXBlIHBhcmFUeXBlID0gcGFyYW0uZ2V0RGF0YVR5cGUoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZihub25ScGNNZXRob2RzLmNvbnRhaW5zKG9wZXJhdGlvbk5hbWUpKXsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVTY2hlbWFGb3JUeXBlKHNlcXVlbmNlLCBudWxsLCBvcGVyYXRpb25OYW1lKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVTY2hlbWFGb3JUeXBlKHNlcXVlbmNlLCBwYXJhVHlwZSwgcGFyYW1ldGVyTmFtZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgfQ0KLSAgICAgICAgLyp9IGVsc2Ugew0KLSAgICAgICAgLy9nZW5lcmF0ZSB0aGUgc2NoZW1hIHR5cGUgZm9yIGV4dHJhIGNsYXNzZXMNCi0gICAgICAgIGV4dHJhU2NoZW1hVHlwZU5hbWUgPSB0eXBlVGFibGUuZ2V0U2ltcGxlU2NoZW1hVHlwZU5hbWUoZ2V0UXVhbGlmaWVkTmFtZShqY2xhc3MpKTsNCi0gICAgICAgIGlmIChleHRyYVNjaGVtYVR5cGVOYW1lID09IG51bGwpIHsNCi0gICAgICAgICAgICBnZW5lcmF0ZVNjaGVtYShqY2xhc3MpOw0KLSAgICAgICAgfSovDQotICAgICAgICByZXR1cm4gc2NoZW1hTWFwLnZhbHVlcygpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBKQU0gY29udmVydCBmaXJzdCBuYW1lIG9mIGFuIGF0dHJpYnV0ZSBpbnRvIFVwcGVyQ2FzZSBhcyBhbiBleGFtcGxlIGlmIHRoZXJlIGlzIGEgaW5zdGFuY2UNCi0gICAgICogdmFyaWFibGUgY2FsbGVkIGZvbyBpbiBhIGJlYW4gLCB0aGVuIEphbSBnaXZlIHRoYXQgYXMgRm9vIHNvIHRoaXMgbWV0aG9kIGlzIHRvIGNvcnJlY3QgdGhhdA0KLSAgICAgKiBlcnJvcg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gd3JvbmdOYW1lIHdyb25nIG5hbWUNCi0gICAgICogQHJldHVybiB0aGUgcmlnaHQgbmFtZSwgdXNpbmcgZW5nbGlzaCBhcyB0aGUgbG9jYWxlIGZvciBjYXNlIGNvbnZlcnNpb24NCi0gICAgICovDQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldENvcnJlY3ROYW1lKFN0cmluZyB3cm9uZ05hbWUpIHsNCi0gICAgICAgIGlmICh3cm9uZ05hbWUubGVuZ3RoKCkgPiAxKSB7DQotICAgICAgICAgICAgcmV0dXJuIHdyb25nTmFtZS5zdWJzdHJpbmcoMCwgMSkudG9Mb3dlckNhc2UoTG9jYWxlLkVOR0xJU0gpDQotICAgICAgICAgICAgICAgICAgICArIHdyb25nTmFtZS5zdWJzdHJpbmcoMSwgd3JvbmdOYW1lLmxlbmd0aCgpKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgcmV0dXJuIHdyb25nTmFtZS5zdWJzdHJpbmcoMCwgMSkudG9Mb3dlckNhc2UoTG9jYWxlLkVOR0xJU0gpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBHZW5lcmF0ZSBzY2hlbWEgY29uc3RydWN0IGZvciBnaXZlbiB0eXBlDQotICAgICAqDQotICAgICAqIEBwYXJhbSBkYXRhVHlwZSBvYmplY3QNCi0gICAgICogQHJldHVybiBRbmFtZQ0KLSAgICAgKiBAdGhyb3dzIFNjaGVtYUdlbmVyYXRvckV4Y2VwdGlvbiBpZiBmYWlscw0KLSAgICAgKi8NCi0gICAgLy9wcml2YXRlIFFOYW1lIGdlbmVyYXRlU2NoZW1hKEpDbGFzcyBkYXRhVHlwZSkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgIHByaXZhdGUgUU5hbWUgZ2VuZXJhdGVTY2hlbWEoQ29tcG9zaXRlRGF0YVR5cGUgZGF0YVR5cGUpIHRocm93cyBTY2hlbWFHZW5lcmF0b3JFeGNlcHRpb24gew0KLSAgICAgICAgU3RyaW5nIG5hbWUgPSBDb3JiYVV0aWwuZ2V0UXVhbGlmaWVkTmFtZShkYXRhVHlwZSk7DQotICAgICAgICBRTmFtZSBzY2hlbWFUeXBlTmFtZSA9IHR5cGVUYWJsZS5nZXRDb21wbGV4U2NoZW1hVHlwZShuYW1lKTsNCi0gICAgICAgIGlmIChzY2hlbWFUeXBlTmFtZSA9PSBudWxsKSB7DQotICAgICAgICAgICAgU3RyaW5nIHNpbXBsZU5hbWUgPSAgZ2V0U2ltcGxlTmFtZShkYXRhVHlwZSk7DQotDQotICAgICAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gZ2V0TW9kdWxlTmFtZShkYXRhVHlwZSk7DQotICAgICAgICAgICAgU3RyaW5nIHRhcmdldE5hbWVTcGFjZSA9IHJlc29sdmVTY2hlbWFOYW1lc3BhY2UocGFja2FnZU5hbWUpOw0KLQ0KLSAgICAgICAgICAgIFhtbFNjaGVtYSB4bWxTY2hlbWEgPSBnZXRYbWxTY2hlbWEodGFyZ2V0TmFtZVNwYWNlKTsNCi0gICAgICAgICAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlUHJlZml4ID0gKFN0cmluZykgdGFyZ2V0TmFtZXNwYWNlUHJlZml4TWFwLmdldCh0YXJnZXROYW1lU3BhY2UpOw0KLSAgICAgICAgICAgIHNjaGVtYVR5cGVOYW1lID0gbmV3IFFOYW1lKHRhcmdldE5hbWVTcGFjZSwgc2ltcGxlTmFtZSwgdGFyZ2V0TmFtZXNwYWNlUHJlZml4KTsNCi0NCi0gICAgICAgICAgICBpZiAoZGF0YVR5cGUgaW5zdGFuY2VvZiBFbnVtVHlwZSkgew0KLSAgICAgICAgICAgICAgICBYbWxTY2hlbWFTaW1wbGVUeXBlIHNpbXBsZVR5cGUgPSBuZXcgWG1sU2NoZW1hU2ltcGxlVHlwZSh4bWxTY2hlbWEpOw0KLSAgICAgICAgICAgICAgICBYbWxTY2hlbWFTaW1wbGVUeXBlUmVzdHJpY3Rpb24gcmVzdHJpY3Rpb24gPSBuZXcgWG1sU2NoZW1hU2ltcGxlVHlwZVJlc3RyaWN0aW9uKCk7DQotICAgICAgICAgICAgICAgIHJlc3RyaWN0aW9uLnNldEJhc2VUeXBlTmFtZSh0eXBlVGFibGUuZ2V0U2ltcGxlU2NoZW1hVHlwZU5hbWUoImphdmEubGFuZy5TdHJpbmciKSk7DQotICAgICAgICAgICAgICAgIHNpbXBsZVR5cGUuc2V0Q29udGVudChyZXN0cmljdGlvbik7DQotICAgICAgICAgICAgICAgIHNpbXBsZVR5cGUuc2V0TmFtZShzaW1wbGVOYW1lKTsNCi0NCi0gICAgICAgICAgICAgICAgWG1sU2NoZW1hT2JqZWN0Q29sbGVjdGlvbiBmYWNldHMgPSByZXN0cmljdGlvbi5nZXRGYWNldHMoKTsNCi0gICAgICAgICAgICAgICAgRW51bVR5cGUgZW51bVR5cGUgPSAoRW51bVR5cGUpIGRhdGFUeXBlOw0KLSAgICAgICAgICAgICAgICBMaXN0IGVudW1NZW1iZXJzID0gZW51bVR5cGUuZ2V0RW51bU1lbWJlcnMoKTsNCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbnVtTWVtYmVycy5zaXplKCk7IGkrKykgew0KLSAgICAgICAgICAgICAgICAgICAgZmFjZXRzLmFkZChuZXcgWG1sU2NoZW1hRW51bWVyYXRpb25GYWNldChlbnVtTWVtYmVycy5nZXQoaSksIGZhbHNlKSk7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgWG1sU2NoZW1hRWxlbWVudCBlbHRPdXRlciA9IG5ldyBYbWxTY2hlbWFFbGVtZW50KCk7DQotICAgICAgICAgICAgICAgIGVsdE91dGVyLnNldE5hbWUoc2ltcGxlTmFtZSk7DQotICAgICAgICAgICAgICAgIGVsdE91dGVyLnNldFFOYW1lKHNjaGVtYVR5cGVOYW1lKTsNCi0NCi0gICAgICAgICAgICAgICAgeG1sU2NoZW1hLmdldEl0ZW1zKCkuYWRkKGVsdE91dGVyKTsNCi0gICAgICAgICAgICAgICAgeG1sU2NoZW1hLmdldEVsZW1lbnRzKCkuYWRkKHNjaGVtYVR5cGVOYW1lLCBlbHRPdXRlcik7DQotICAgICAgICAgICAgICAgIGVsdE91dGVyLnNldFNjaGVtYVR5cGVOYW1lKHNpbXBsZVR5cGUuZ2V0UU5hbWUoKSk7DQotDQotICAgICAgICAgICAgICAgIHhtbFNjaGVtYS5nZXRJdGVtcygpLmFkZChzaW1wbGVUeXBlKTsNCi0gICAgICAgICAgICAgICAgeG1sU2NoZW1hLmdldFNjaGVtYVR5cGVzKCkuYWRkKHNjaGVtYVR5cGVOYW1lLCBzaW1wbGVUeXBlKTsNCi0NCi0gICAgICAgICAgICAgICAgLy8gYWRkaW5nIHRoaXMgdHlwZSB0byB0aGUgdGFibGUNCi0gICAgICAgICAgICAgICAgdHlwZVRhYmxlLmFkZENvbXBsZXhTY2hlbWEobmFtZSwgZWx0T3V0ZXIuZ2V0UU5hbWUoKSk7DQotICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRhVHlwZSBpbnN0YW5jZW9mIFVuaW9uVHlwZSkgew0KLSAgICAgICAgICAgICAgICBYbWxTY2hlbWFDb21wbGV4VHlwZSBjb21wbGV4VHlwZSA9IG5ldyBYbWxTY2hlbWFDb21wbGV4VHlwZSh4bWxTY2hlbWEpOw0KLSAgICAgICAgICAgICAgICBYbWxTY2hlbWFDaG9pY2UgY2hvaWNlID0gbmV3IFhtbFNjaGVtYUNob2ljZSgpOw0KLSAgICAgICAgICAgICAgICBYbWxTY2hlbWFPYmplY3RDb2xsZWN0aW9uIGl0ZW1zID0gY2hvaWNlLmdldEl0ZW1zKCk7DQotDQotICAgICAgICAgICAgICAgIFVuaW9uVHlwZSB1bmlvblR5cGUgPSAoVW5pb25UeXBlKSBkYXRhVHlwZTsNCi0gICAgICAgICAgICAgICAgTWVtYmVyW10gbWVtYmVycyA9IHVuaW9uVHlwZS5nZXRNZW1iZXJzKCk7DQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVtYmVycy5sZW5ndGg7IGkrKykgew0KLSAgICAgICAgICAgICAgICAgICAgaXRlbXMuYWRkKGdlbmVyYXRlU2NoZW1hZm9yRmllbGRzYW5kUHJvcGVydGllcyh4bWxTY2hlbWEsIG1lbWJlcnNbaV0uZ2V0RGF0YVR5cGUoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtYmVyc1tpXS5nZXROYW1lKCksIHRydWUpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBjb21wbGV4VHlwZS5zZXRQYXJ0aWNsZShjaG9pY2UpOw0KLSAgICAgICAgICAgICAgICBjb21wbGV4VHlwZS5zZXROYW1lKHNpbXBsZU5hbWUpOw0KLQ0KLSAgICAgICAgICAgICAgICBYbWxTY2hlbWFFbGVtZW50IGVsdE91dGVyID0gbmV3IFhtbFNjaGVtYUVsZW1lbnQoKTsNCi0gICAgICAgICAgICAgICAgZWx0T3V0ZXIuc2V0TmFtZShzaW1wbGVOYW1lKTsNCi0gICAgICAgICAgICAgICAgZWx0T3V0ZXIuc2V0UU5hbWUoc2NoZW1hVHlwZU5hbWUpOw0KLQ0KLSAgICAgICAgICAgICAgICB4bWxTY2hlbWEuZ2V0SXRlbXMoKS5hZGQoZWx0T3V0ZXIpOw0KLSAgICAgICAgICAgICAgICB4bWxTY2hlbWEuZ2V0RWxlbWVudHMoKS5hZGQoc2NoZW1hVHlwZU5hbWUsIGVsdE91dGVyKTsNCi0gICAgICAgICAgICAgICAgZWx0T3V0ZXIuc2V0U2NoZW1hVHlwZU5hbWUoY29tcGxleFR5cGUuZ2V0UU5hbWUoKSk7DQotICAgICAgICAgICAgICAgIHhtbFNjaGVtYS5nZXRJdGVtcygpLmFkZChjb21wbGV4VHlwZSk7DQotICAgICAgICAgICAgICAgIHhtbFNjaGVtYS5nZXRTY2hlbWFUeXBlcygpLmFkZChzY2hlbWFUeXBlTmFtZSwgY29tcGxleFR5cGUpOw0KLQ0KLSAgICAgICAgICAgICAgICB0eXBlVGFibGUuYWRkQ29tcGxleFNjaGVtYShuYW1lLCBlbHRPdXRlci5nZXRRTmFtZSgpKTsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBYbWxTY2hlbWFDb21wbGV4VHlwZSBjb21wbGV4VHlwZSA9IG5ldyBYbWxTY2hlbWFDb21wbGV4VHlwZSh4bWxTY2hlbWEpOw0KLSAgICAgICAgICAgICAgICBYbWxTY2hlbWFTZXF1ZW5jZSBzZXF1ZW5jZSA9IG5ldyBYbWxTY2hlbWFTZXF1ZW5jZSgpOw0KLSAgICAgICAgICAgICAgICBYbWxTY2hlbWFFbGVtZW50IGVsdE91dGVyID0gbmV3IFhtbFNjaGVtYUVsZW1lbnQoKTsNCi0gICAgICAgICAgICAgICAgZWx0T3V0ZXIuc2V0TmFtZShzaW1wbGVOYW1lKTsNCi0gICAgICAgICAgICAgICAgZWx0T3V0ZXIuc2V0UU5hbWUoc2NoZW1hVHlwZU5hbWUpOw0KLSAgICAgICAgICAgICAgICBjb21wbGV4VHlwZS5zZXRQYXJ0aWNsZShzZXF1ZW5jZSk7DQotICAgICAgICAgICAgICAgIGNvbXBsZXhUeXBlLnNldE5hbWUoc2ltcGxlTmFtZSk7DQotDQotICAgICAgICAgICAgICAgIHhtbFNjaGVtYS5nZXRJdGVtcygpLmFkZChlbHRPdXRlcik7DQotICAgICAgICAgICAgICAgIHhtbFNjaGVtYS5nZXRFbGVtZW50cygpLmFkZChzY2hlbWFUeXBlTmFtZSwgZWx0T3V0ZXIpOw0KLSAgICAgICAgICAgICAgICBlbHRPdXRlci5zZXRTY2hlbWFUeXBlTmFtZShjb21wbGV4VHlwZS5nZXRRTmFtZSgpKTsNCi0NCi0gICAgICAgICAgICAgICAgeG1sU2NoZW1hLmdldEl0ZW1zKCkuYWRkKGNvbXBsZXhUeXBlKTsNCi0gICAgICAgICAgICAgICAgeG1sU2NoZW1hLmdldFNjaGVtYVR5cGVzKCkuYWRkKHNjaGVtYVR5cGVOYW1lLCBjb21wbGV4VHlwZSk7DQotDQotICAgICAgICAgICAgICAgIC8vIGFkZGluZyB0aGlzIHR5cGUgdG8gdGhlIHRhYmxlDQotICAgICAgICAgICAgICAgIHR5cGVUYWJsZS5hZGRDb21wbGV4U2NoZW1hKG5hbWUsIGVsdE91dGVyLmdldFFOYW1lKCkpOw0KLSAgICAgICAgICAgICAgICBpZiAoZGF0YVR5cGUgaW5zdGFuY2VvZiBUeXBlZGVmKSB7DQotICAgICAgICAgICAgICAgICAgICBUeXBlZGVmIHR5cGVkZWYgPSAoVHlwZWRlZikgZGF0YVR5cGU7DQotICAgICAgICAgICAgICAgICAgICBEYXRhVHlwZSBhbGlhc1R5cGUgPSB0eXBlZGVmLmdldERhdGFUeXBlKCk7DQotICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZS5nZXRJdGVtcygpLmFkZChnZW5lcmF0ZVNjaGVtYWZvckZpZWxkc2FuZFByb3BlcnRpZXMoeG1sU2NoZW1hLCBhbGlhc1R5cGUsICJpdGVtIiwgZmFsc2UpKTsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgIC8vU2V0IHByb3BlcnRpZXNOYW1lcyA9IG5ldyBIYXNoU2V0KCkgOw0KLSAgICAgICAgICAgICAgICAgICAgTWVtYmVyW10gbWVtYmVycyA9IGRhdGFUeXBlLmdldE1lbWJlcnMoKTsNCi0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVtYmVycy5sZW5ndGg7IGkrKykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIE1lbWJlciBtZW1iZXIgPSBtZW1iZXJzW2ldOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwcm9wZXJ0eU5hbWUgPSBtZW1iZXIuZ2V0TmFtZSgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIERhdGFUeXBlIHByb3BlcnR5VHlwZSA9IG1lbWJlci5nZXREYXRhVHlwZSgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vU3RyaW5nIHByb3BuYW1lID0gZ2V0Q29ycmVjdE5hbWUocHJvcGVydHkuZ2V0U2ltcGxlTmFtZSgpKSA7DQotICAgICAgICAgICAgICAgICAgICAgICAgLy9wcm9wZXJ0aWVzTmFtZXMuYWRkKHByb3BlcnR5TmFtZSkgOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlLmdldEl0ZW1zKCkuYWRkKGdlbmVyYXRlU2NoZW1hZm9yRmllbGRzYW5kUHJvcGVydGllcyh4bWxTY2hlbWEsIHByb3BlcnR5VHlwZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5TmFtZSwgZmFsc2UpKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBzY2hlbWFUeXBlTmFtZTsNCi0gICAgfQ0KLQ0KLQ0KLSAgICAvLyBtb3ZlZCBjb2RlIGNvbW1vbiB0byBGaWVsZHMgJiBwcm9wZXJ0aWVzIG91dCBvZiBhYm92ZSBtZXRob2QNCi0gICAgcHJpdmF0ZSBYbWxTY2hlbWFFbGVtZW50IGdlbmVyYXRlU2NoZW1hZm9yRmllbGRzYW5kUHJvcGVydGllcyhYbWxTY2hlbWEgeG1sU2NoZW1hLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGFUeXBlIHR5cGUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUsIGJvb2xlYW4gZm9yY2VOb3ROaWxsYWJsZSkgdGhyb3dzIFNjaGVtYUdlbmVyYXRvckV4Y2VwdGlvbiB7DQotICAgICAgICBib29sZWFuIGlzQXJyeVR5cGUgPSBmYWxzZTsNCi0gICAgICAgIGxvbmcgbWF4T2NjdXJzID0gMDsNCi0gICAgICAgIGxvbmcgbWluT2NjdXJzID0gMDsNCi0gICAgICAgIGlmICh0eXBlIGluc3RhbmNlb2YgQWJzdHJhY3RDb2xsZWN0aW9uVHlwZSkgew0KLSAgICAgICAgICAgIEFic3RyYWN0Q29sbGVjdGlvblR5cGUgY29sbGVjdGlvblR5cGUgPSAoQWJzdHJhY3RDb2xsZWN0aW9uVHlwZSkgdHlwZTsNCi0gICAgICAgICAgICB0eXBlID0gY29sbGVjdGlvblR5cGUuZ2V0RGF0YVR5cGUoKTsNCi0gICAgICAgICAgICBpc0FycnlUeXBlID0gdHJ1ZTsNCi0gICAgICAgICAgICBpbnQgZWxlbWVudENvdW50ID0gY29sbGVjdGlvblR5cGUuZ2V0RWxlbWVudENvdW50KCk7DQotICAgICAgICAgICAgaWYgKGNvbGxlY3Rpb25UeXBlLmlzQXJyYXkoKSkgew0KLSAgICAgICAgICAgICAgICBtaW5PY2N1cnMgPSBtYXhPY2N1cnMgPSBlbGVtZW50Q291bnQ7DQotICAgICAgICAgICAgfSBlbHNlIGlmIChjb2xsZWN0aW9uVHlwZS5pc1NlcXVlbmNlKCkpIHsNCi0gICAgICAgICAgICAgICAgbWluT2NjdXJzID0gMDsNCi0gICAgICAgICAgICAgICAgbWF4T2NjdXJzID0gKGVsZW1lbnRDb3VudCA9PSAwKSA/IExvbmcuTUFYX1ZBTFVFIDogZWxlbWVudENvdW50Ow0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZiAodHlwZSBpbnN0YW5jZW9mIEFic3RyYWN0Q29sbGVjdGlvblR5cGUpIHsNCi0gICAgICAgICAgICAgICAgQWJzdHJhY3RDb2xsZWN0aW9uVHlwZSBjaGlsZCA9IChBYnN0cmFjdENvbGxlY3Rpb25UeXBlKSB0eXBlOw0KLSAgICAgICAgICAgICAgICBUeXBlZGVmIHR5cGVkZWYgPSBuZXcgVHlwZWRlZigpOw0KLSAgICAgICAgICAgICAgICB0eXBlZGVmLnNldERhdGFUeXBlKHR5cGUpOw0KLSAgICAgICAgICAgICAgICB0eXBlZGVmLnNldE1vZHVsZShjaGlsZC5nZXRFbGVtZW50TW9kdWxlKCkpOw0KLSAgICAgICAgICAgICAgICB0eXBlZGVmLnNldE5hbWUoIl8iICsgKGNoaWxkLmdldERlcHRoKCkgLSAxKSArICJfIiArIGNoaWxkLmdldEVsZW1lbnROYW1lKCkpOw0KLSAgICAgICAgICAgICAgICB0eXBlID0gdHlwZWRlZjsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICBTdHJpbmcgcHJvcGVydHlUeXBlTmFtZSA9IENvcmJhVXRpbC5nZXRRdWFsaWZpZWROYW1lKHR5cGUpOw0KLQ0KLSAgICAgICAgaWYoaXNBcnJ5VHlwZSYmImJ5dGUiLmVxdWFscyhwcm9wZXJ0eVR5cGVOYW1lKSl7DQotICAgICAgICAgICAgcHJvcGVydHlUeXBlTmFtZSA9ICJiYXNlNjRCaW5hcnkiOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgWG1sU2NoZW1hRWxlbWVudCBlbHQxID0gbmV3IFhtbFNjaGVtYUVsZW1lbnQoKTsNCi0gICAgICAgIGVsdDEuc2V0TmFtZShuYW1lKTsNCi0NCi0gICAgICAgIGlmIChpc0FycnlUeXBlICYmICghcHJvcGVydHlUeXBlTmFtZS5lcXVhbHMoImJhc2U2NEJpbmFyeSIpKSl7DQotICAgICAgICAgICAgZWx0MS5zZXRNYXhPY2N1cnMobWF4T2NjdXJzKTsNCi0gICAgICAgICAgICBlbHQxLnNldE1pbk9jY3VycyhtaW5PY2N1cnMpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYoaXNOaWxsYWJsZSh0eXBlKSAmJiAhZm9yY2VOb3ROaWxsYWJsZSkNCi0gICAgICAgICAgICBlbHQxLnNldE5pbGxhYmxlKHRydWUpIDsNCi0NCi0gICAgICAgIGlmICh0eXBlVGFibGUuaXNTaW1wbGVUeXBlKHByb3BlcnR5VHlwZU5hbWUpKSB7DQotICAgICAgICAgICAgZWx0MS5zZXRTY2hlbWFUeXBlTmFtZSh0eXBlVGFibGUuZ2V0U2ltcGxlU2NoZW1hVHlwZU5hbWUocHJvcGVydHlUeXBlTmFtZSkpOw0KLQ0KLSAgICAgICAgfSBlbHNlIGlmICh0eXBlIGluc3RhbmNlb2YgQ29tcG9zaXRlRGF0YVR5cGUpIHsNCi0gICAgICAgICAgICBnZW5lcmF0ZVNjaGVtYSgoQ29tcG9zaXRlRGF0YVR5cGUpIHR5cGUpOw0KLSAgICAgICAgICAgIGVsdDEuc2V0U2NoZW1hVHlwZU5hbWUodHlwZVRhYmxlLmdldENvbXBsZXhTY2hlbWFUeXBlKHByb3BlcnR5VHlwZU5hbWUpKTsNCi0NCi0gICAgICAgICAgICBpZiAoISgoTmFtZXNwYWNlTWFwKSB4bWxTY2hlbWEuZ2V0TmFtZXNwYWNlQ29udGV4dCgpKS52YWx1ZXMoKS4NCi0gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5zKHR5cGVUYWJsZS5nZXRDb21wbGV4U2NoZW1hVHlwZShwcm9wZXJ0eVR5cGVOYW1lKS5nZXROYW1lc3BhY2VVUkkoKSkpIHsNCi0gICAgICAgICAgICAgICAgWG1sU2NoZW1hSW1wb3J0IGltcG9ydEVsZW1lbnQgPSBuZXcgWG1sU2NoZW1hSW1wb3J0KCk7DQotICAgICAgICAgICAgICAgIGltcG9ydEVsZW1lbnQuc2V0TmFtZXNwYWNlKA0KLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVUYWJsZS5nZXRDb21wbGV4U2NoZW1hVHlwZShwcm9wZXJ0eVR5cGVOYW1lKS5nZXROYW1lc3BhY2VVUkkoKSk7DQotICAgICAgICAgICAgICAgIHhtbFNjaGVtYS5nZXRJdGVtcygpLmFkZChpbXBvcnRFbGVtZW50KTsNCi0gICAgICAgICAgICAgICAgKChOYW1lc3BhY2VNYXApIHhtbFNjaGVtYS5nZXROYW1lc3BhY2VDb250ZXh0KCkpLg0KLSAgICAgICAgICAgICAgICAgICAgICAgIHB1dChnZW5lcmF0ZVByZWZpeCgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZVRhYmxlLmdldENvbXBsZXhTY2hlbWFUeXBlKHByb3BlcnR5VHlwZU5hbWUpLmdldE5hbWVzcGFjZVVSSSgpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFHZW5lcmF0b3JFeGNlcHRpb24oIlVuc3VwcG9ydGVkIHR5cGU6IiArIHR5cGUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGVsdDE7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzTmlsbGFibGUoRGF0YVR5cGUgdHlwZSkgew0KLSAgICAgICAgaWYgKHR5cGUgaW5zdGFuY2VvZiBDb21wb3NpdGVEYXRhVHlwZSkgew0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgfSBlbHNlIGlmICh0eXBlIGluc3RhbmNlb2YgUHJpbWl0aXZlRGF0YVR5cGUpIHsNCi0gICAgICAgICAgICBQcmltaXRpdmVEYXRhVHlwZSBwcmltaXRpdmVEYXRhVHlwZSA9IChQcmltaXRpdmVEYXRhVHlwZSkgdHlwZTsNCi0gICAgICAgICAgICBpZiAocHJpbWl0aXZlRGF0YVR5cGUuZ2V0VHlwZU5hbWUoKS5lcXVhbHMoImphdmEubGFuZy5TdHJpbmciKSkNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgIH0NCi0NCi0NCi0gICAgcHJpdmF0ZSBRTmFtZSBnZW5lcmF0ZVNjaGVtYUZvclR5cGUoWG1sU2NoZW1hU2VxdWVuY2Ugc2VxdWVuY2UsIERhdGFUeXBlIHR5cGUsIFN0cmluZyBwYXJ0TmFtZSkNCi0gICAgICAgICAgICB0aHJvd3MgU2NoZW1hR2VuZXJhdG9yRXhjZXB0aW9uIHsNCi0NCi0gICAgICAgIGJvb2xlYW4gaXNBcnJheVR5cGUgPSBmYWxzZTsNCi0gICAgICAgIGlmKHR5cGUhPW51bGwpew0KLSAgICAgICAgICAgIGlzQXJyYXlUeXBlID0gKHR5cGUgaW5zdGFuY2VvZiBBcnJheVR5cGUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKGlzQXJyYXlUeXBlKSB7DQotICAgICAgICAgICAgQXJyYXlUeXBlIGFycmF5VHlwZSA9IChBcnJheVR5cGUpIHR5cGU7DQotICAgICAgICAgICAgdHlwZSA9IGFycmF5VHlwZS5nZXREYXRhVHlwZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgU3RyaW5nIGNsYXNzVHlwZU5hbWU7DQotICAgICAgICBpZih0eXBlPT1udWxsKXsNCi0gICAgICAgICAgICBjbGFzc1R5cGVOYW1lID0gImphdmEubGFuZy5PYmplY3QiOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBjbGFzc1R5cGVOYW1lID0gQ29yYmFVdGlsLmdldFF1YWxpZmllZE5hbWUodHlwZSk7DQotICAgICAgICB9DQotICAgICAgICBpZiAoaXNBcnJheVR5cGUgJiYgImJ5dGUiLmVxdWFscyhjbGFzc1R5cGVOYW1lKSkgew0KLSAgICAgICAgICAgIGNsYXNzVHlwZU5hbWUgPSAiYmFzZTY0QmluYXJ5IjsNCi0gICAgICAgICAgICBpc0FycmF5VHlwZSA9IGZhbHNlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYoImphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXIiLmVxdWFscyhjbGFzc1R5cGVOYW1lKSl7DQotICAgICAgICAgICAgY2xhc3NUeXBlTmFtZSA9ICJiYXNlNjRCaW5hcnkiOw0KLSAgICAgICAgfQ0KLSAgICAgICAgUU5hbWUgc2NoZW1hVHlwZU5hbWUgPSB0eXBlVGFibGUuZ2V0U2ltcGxlU2NoZW1hVHlwZU5hbWUoY2xhc3NUeXBlTmFtZSk7DQotICAgICAgICBpZiAoc2NoZW1hVHlwZU5hbWUgPT0gbnVsbCAmJiB0eXBlIGluc3RhbmNlb2YgQ29tcG9zaXRlRGF0YVR5cGUpIHsNCi0gICAgICAgICAgICBzY2hlbWFUeXBlTmFtZSA9IGdlbmVyYXRlU2NoZW1hKChDb21wb3NpdGVEYXRhVHlwZSkgdHlwZSk7DQotICAgICAgICAgICAgYWRkQ29udGVudFRvTWV0aG9kU2NoZW1hVHlwZShzZXF1ZW5jZSwNCi0gICAgICAgICAgICAgICAgICAgIHNjaGVtYVR5cGVOYW1lLA0KLSAgICAgICAgICAgICAgICAgICAgcGFydE5hbWUsDQotICAgICAgICAgICAgICAgICAgICBpc0FycmF5VHlwZSk7DQotICAgICAgICAgICAgU3RyaW5nIHNjaGVtYU5hbWVzcGFjZTsNCi0gICAgICAgICAgICBzY2hlbWFOYW1lc3BhY2UgPSByZXNvbHZlU2NoZW1hTmFtZXNwYWNlKGdldE1vZHVsZU5hbWUodHlwZSkpOw0KLSAgICAgICAgICAgIGFkZEltcG9ydChnZXRYbWxTY2hlbWEoc2NoZW1hTmFtZXNwYWNlKSwgc2NoZW1hVHlwZU5hbWUpOw0KLQ0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBhZGRDb250ZW50VG9NZXRob2RTY2hlbWFUeXBlKHNlcXVlbmNlLA0KLSAgICAgICAgICAgICAgICAgICAgc2NoZW1hVHlwZU5hbWUsDQotICAgICAgICAgICAgICAgICAgICBwYXJ0TmFtZSwNCi0gICAgICAgICAgICAgICAgICAgIGlzQXJyYXlUeXBlKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBzY2hlbWFUeXBlTmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgYWRkQ29udGVudFRvTWV0aG9kU2NoZW1hVHlwZShYbWxTY2hlbWFTZXF1ZW5jZSBzZXF1ZW5jZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUU5hbWUgc2NoZW1hVHlwZU5hbWUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXJhTmFtZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0FycmF5KSB7DQotICAgICAgICBYbWxTY2hlbWFFbGVtZW50IGVsdDEgPSBuZXcgWG1sU2NoZW1hRWxlbWVudCgpOw0KLSAgICAgICAgZWx0MS5zZXROYW1lKHBhcmFOYW1lKTsNCi0gICAgICAgIGVsdDEuc2V0U2NoZW1hVHlwZU5hbWUoc2NoZW1hVHlwZU5hbWUpOw0KLSAgICAgICAgc2VxdWVuY2UuZ2V0SXRlbXMoKS5hZGQoZWx0MSk7DQotDQotICAgICAgICBpZiAoaXNBcnJheSkgew0KLSAgICAgICAgICAgIGVsdDEuc2V0TWF4T2NjdXJzKExvbmcuTUFYX1ZBTFVFKTsNCi0gICAgICAgICAgICBlbHQxLnNldE1pbk9jY3VycygxKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsdDEuc2V0TmlsbGFibGUodHJ1ZSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBYbWxTY2hlbWFDb21wbGV4VHlwZSBjcmVhdGVTY2hlbWFUeXBlRm9yTWV0aG9kUGFydChTdHJpbmcgbG9jYWxQYXJ0TmFtZSkgew0KLSAgICAgICAgWG1sU2NoZW1hIHhtbFNjaGVtYSA9IGdldFhtbFNjaGVtYShzY2hlbWFUYXJnZXROYW1lU3BhY2UpOw0KLSAgICAgICAgUU5hbWUgZWxlbWVudE5hbWUgPQ0KLSAgICAgICAgICAgICAgICBuZXcgUU5hbWUodGhpcy5zY2hlbWFUYXJnZXROYW1lU3BhY2UsIGxvY2FsUGFydE5hbWUsIHRoaXMuc2NoZW1hX25hbWVzcGFjZV9wcmVmaXgpOw0KLSAgICAgICAgWG1sU2NoZW1hQ29tcGxleFR5cGUgY29tcGxleFR5cGUgPSBuZXcgWG1sU2NoZW1hQ29tcGxleFR5cGUoeG1sU2NoZW1hKTsNCi0NCi0gICAgICAgIFhtbFNjaGVtYUVsZW1lbnQgZ2xvYmFsRWxlbWVudCA9IG5ldyBYbWxTY2hlbWFFbGVtZW50KCk7DQotICAgICAgICBnbG9iYWxFbGVtZW50LnNldFNjaGVtYVR5cGUoY29tcGxleFR5cGUpOw0KLSAgICAgICAgZ2xvYmFsRWxlbWVudC5zZXROYW1lKGxvY2FsUGFydE5hbWUpOw0KLSAgICAgICAgZ2xvYmFsRWxlbWVudC5zZXRRTmFtZShlbGVtZW50TmFtZSk7DQotICAgICAgICB4bWxTY2hlbWEuZ2V0SXRlbXMoKS5hZGQoZ2xvYmFsRWxlbWVudCk7DQotICAgICAgICB4bWxTY2hlbWEuZ2V0RWxlbWVudHMoKS5hZGQoZWxlbWVudE5hbWUsIGdsb2JhbEVsZW1lbnQpOw0KLQ0KLSAgICAgICAgdHlwZVRhYmxlLmFkZENvbXBsZXhTY2hlbWEobG9jYWxQYXJ0TmFtZSwgZWxlbWVudE5hbWUpOw0KLQ0KLSAgICAgICAgcmV0dXJuIGNvbXBsZXhUeXBlOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgWG1sU2NoZW1hIGdldFhtbFNjaGVtYShTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlKSB7DQotICAgICAgICBYbWxTY2hlbWEgeG1sU2NoZW1hOw0KLQ0KLSAgICAgICAgaWYgKCh4bWxTY2hlbWEgPSAoWG1sU2NoZW1hKSBzY2hlbWFNYXAuZ2V0KHRhcmdldE5hbWVzcGFjZSkpID09IG51bGwpIHsNCi0gICAgICAgICAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlUHJlZml4Ow0KLQ0KLSAgICAgICAgICAgIGlmICggdGFyZ2V0TmFtZXNwYWNlLmVxdWFscyhzY2hlbWFUYXJnZXROYW1lU3BhY2UpICYmDQotICAgICAgICAgICAgICAgICAgICBzY2hlbWFfbmFtZXNwYWNlX3ByZWZpeCAhPSBudWxsICkgew0KLSAgICAgICAgICAgICAgICB0YXJnZXROYW1lc3BhY2VQcmVmaXggPSBzY2hlbWFfbmFtZXNwYWNlX3ByZWZpeDsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICB0YXJnZXROYW1lc3BhY2VQcmVmaXggPSBnZW5lcmF0ZVByZWZpeCgpOw0KLSAgICAgICAgICAgIH0NCi0NCi0NCi0gICAgICAgICAgICB4bWxTY2hlbWEgPSBuZXcgWG1sU2NoZW1hKHRhcmdldE5hbWVzcGFjZSwgeG1sU2NoZW1hQ29sbGVjdGlvbik7DQotICAgICAgICAgICAgeG1sU2NoZW1hLnNldEF0dHJpYnV0ZUZvcm1EZWZhdWx0KGdldEF0dHJGb3JtRGVmYXVsdFNldHRpbmcoKSk7DQotICAgICAgICAgICAgeG1sU2NoZW1hLnNldEVsZW1lbnRGb3JtRGVmYXVsdChnZXRFbGVtZW50Rm9ybURlZmF1bHRTZXR0aW5nKCkpOw0KLQ0KLQ0KLSAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZVByZWZpeE1hcC5wdXQodGFyZ2V0TmFtZXNwYWNlLCB0YXJnZXROYW1lc3BhY2VQcmVmaXgpOw0KLSAgICAgICAgICAgIHNjaGVtYU1hcC5wdXQodGFyZ2V0TmFtZXNwYWNlLCB4bWxTY2hlbWEpOw0KLQ0KLSAgICAgICAgICAgIE5hbWVzcGFjZU1hcCBwcmVmaXhtYXAgPSBuZXcgTmFtZXNwYWNlTWFwKCk7DQotICAgICAgICAgICAgcHJlZml4bWFwLnB1dChERUZBVUxUX1NDSEVNQV9OQU1FU1BBQ0VfUFJFRklYLCBVUklfMjAwMV9TQ0hFTUFfWFNEKTsNCi0gICAgICAgICAgICBwcmVmaXhtYXAucHV0KHRhcmdldE5hbWVzcGFjZVByZWZpeCwgdGFyZ2V0TmFtZXNwYWNlKTsNCi0gICAgICAgICAgICB4bWxTY2hlbWEuc2V0TmFtZXNwYWNlQ29udGV4dChwcmVmaXhtYXApOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHhtbFNjaGVtYTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgVHlwZVRhYmxlIGdldFR5cGVUYWJsZSgpIHsNCi0gICAgICAgIHJldHVybiB0eXBlVGFibGU7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2VuZXJhdGVQcmVmaXgoKSB7DQotICAgICAgICByZXR1cm4gTkFNRV9TUEFDRV9QUkVGSVggKyBwcmVmaXhDb3VudCsrOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldEV4Y2x1ZGVNZXRob2RzKEFycmF5TGlzdCBleGNsdWRlTWV0aG9kcykgew0KLSAgICAgICAgaWYgKGV4Y2x1ZGVNZXRob2RzID09IG51bGwpIGV4Y2x1ZGVNZXRob2RzID0gbmV3IEFycmF5TGlzdCgpOw0KLSAgICAgICAgdGhpcy5leGNsdWRlTWV0aG9kcyA9IGV4Y2x1ZGVNZXRob2RzOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2NoZW1hVGFyZ2V0TmFtZVNwYWNlKCkgew0KLSAgICAgICAgcmV0dXJuIHNjaGVtYVRhcmdldE5hbWVTcGFjZTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgYWRkSW1wb3J0KFhtbFNjaGVtYSB4bWxTY2hlbWEsIFFOYW1lIHNjaGVtYVR5cGVOYW1lKSB7DQotICAgICAgICBpZiAoISgoTmFtZXNwYWNlTWFwKSB4bWxTY2hlbWEuZ2V0TmFtZXNwYWNlQ29udGV4dCgpKS52YWx1ZXMoKS4NCi0gICAgICAgICAgICAgICAgY29udGFpbnMoc2NoZW1hVHlwZU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpKSB7DQotICAgICAgICAgICAgWG1sU2NoZW1hSW1wb3J0IGltcG9ydEVsZW1lbnQgPSBuZXcgWG1sU2NoZW1hSW1wb3J0KCk7DQotICAgICAgICAgICAgaW1wb3J0RWxlbWVudC5zZXROYW1lc3BhY2Uoc2NoZW1hVHlwZU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpOw0KLSAgICAgICAgICAgIHhtbFNjaGVtYS5nZXRJdGVtcygpLmFkZChpbXBvcnRFbGVtZW50KTsNCi0gICAgICAgICAgICAoKE5hbWVzcGFjZU1hcCkgeG1sU2NoZW1hLmdldE5hbWVzcGFjZUNvbnRleHQoKSkuDQotICAgICAgICAgICAgICAgICAgICBwdXQoZ2VuZXJhdGVQcmVmaXgoKSwgc2NoZW1hVHlwZU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0ckZvcm1EZWZhdWx0KCkgew0KLSAgICAgICAgcmV0dXJuIGF0dHJGb3JtRGVmYXVsdDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRBdHRyRm9ybURlZmF1bHQoU3RyaW5nIGF0dHJGb3JtRGVmYXVsdCkgew0KLSAgICAgICAgdGhpcy5hdHRyRm9ybURlZmF1bHQgPSBhdHRyRm9ybURlZmF1bHQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRFbGVtZW50Rm9ybURlZmF1bHQoKSB7DQotICAgICAgICByZXR1cm4gZWxlbWVudEZvcm1EZWZhdWx0Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldEVsZW1lbnRGb3JtRGVmYXVsdChTdHJpbmcgZWxlbWVudEZvcm1EZWZhdWx0KSB7DQotICAgICAgICB0aGlzLmVsZW1lbnRGb3JtRGVmYXVsdCA9IGVsZW1lbnRGb3JtRGVmYXVsdDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFhtbFNjaGVtYUZvcm0gZ2V0QXR0ckZvcm1EZWZhdWx0U2V0dGluZygpIHsNCi0gICAgICAgIGlmIChGT1JNX0RFRkFVTFRfVU5RVUFMSUZJRUQuZXF1YWxzKGdldEF0dHJGb3JtRGVmYXVsdCgpKSkgew0KLSAgICAgICAgICAgIHJldHVybiBuZXcgWG1sU2NoZW1hRm9ybShYbWxTY2hlbWFGb3JtLlVOUVVBTElGSUVEKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxTY2hlbWFGb3JtKFhtbFNjaGVtYUZvcm0uUVVBTElGSUVEKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFhtbFNjaGVtYUZvcm0gZ2V0RWxlbWVudEZvcm1EZWZhdWx0U2V0dGluZygpIHsNCi0gICAgICAgIGlmIChGT1JNX0RFRkFVTFRfVU5RVUFMSUZJRUQuZXF1YWxzKGdldEVsZW1lbnRGb3JtRGVmYXVsdCgpKSkgew0KLSAgICAgICAgICAgIHJldHVybiBuZXcgWG1sU2NoZW1hRm9ybShYbWxTY2hlbWFGb3JtLlVOUVVBTElGSUVEKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxTY2hlbWFGb3JtKFhtbFNjaGVtYUZvcm0uUVVBTElGSUVEKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQXJyYXlMaXN0IGdldEV4dHJhQ2xhc3NlcygpIHsNCi0gICAgICAgIGlmIChleHRyYUNsYXNzZXMgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIGV4dHJhQ2xhc3NlcyA9IG5ldyBBcnJheUxpc3QoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBleHRyYUNsYXNzZXM7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RXh0cmFDbGFzc2VzKEFycmF5TGlzdCBleHRyYUNsYXNzZXMpIHsNCi0gICAgICAgIHRoaXMuZXh0cmFDbGFzc2VzID0gZXh0cmFDbGFzc2VzOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIHJlc29sdmVTY2hlbWFOYW1lc3BhY2UoU3RyaW5nIHBhY2thZ2VOYW1lKSB0aHJvd3MgU2NoZW1hR2VuZXJhdG9yRXhjZXB0aW9uIHsNCi0gICAgICAgIGlmICh1c2VXU0RMVHlwZXNOYW1lc3BhY2UpIHsNCi0gICAgICAgICAgICByZXR1cm4gKFN0cmluZykgcGtnMm5zbWFwLmdldCgiYWxsIik7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGlmIChwa2cybnNtYXAgIT0gbnVsbCAmJiAhcGtnMm5zbWFwLmlzRW1wdHkoKSkgew0KLSAgICAgICAgICAgICAgICAvL2lmIHR5cGVzIHNob3VsZCBnbyBpbnRvIG5hbWVzcGFjZXMgdGhhdCBhcmUgbWFwcGVkIGFnYWluc3QgdGhlIHBhY2thZ2UgbmFtZSBmb3IgdGhlIHR5cGUNCi0gICAgICAgICAgICAgICAgaWYgKHBrZzJuc21hcC5nZXQocGFja2FnZU5hbWUpICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgICAgIC8vcmV0dXJuIHRoYXQgbWFwcGluZw0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChTdHJpbmcpIHBrZzJuc21hcC5nZXQocGFja2FnZU5hbWUpOw0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldE5zR2VuKCkuc2NoZW1hTmFtZXNwYWNlRnJvbVBhY2thZ2VOYW1lKHBhY2thZ2VOYW1lKS50b1N0cmluZygpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgLy8gaWYgIHBrZzJuc21hcCBpcyBudWxsIGFuZCBpZiBub3QgZGVmYXVsdCBzY2hlbWEgbnMgZm91bmQgZm9yIHRoZSBjdXN0b20gYmVhbg0KLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0TnNHZW4oKS5zY2hlbWFOYW1lc3BhY2VGcm9tUGFja2FnZU5hbWUocGFja2FnZU5hbWUpLnRvU3RyaW5nKCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzVXNlV1NETFR5cGVzTmFtZXNwYWNlKCkgew0KLSAgICAgICAgcmV0dXJuIHVzZVdTRExUeXBlc05hbWVzcGFjZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRVc2VXU0RMVHlwZXNOYW1lc3BhY2UoYm9vbGVhbiB1c2VXU0RMVHlwZXNOYW1lc3BhY2UpIHsNCi0gICAgICAgIHRoaXMudXNlV1NETFR5cGVzTmFtZXNwYWNlID0gdXNlV1NETFR5cGVzTmFtZXNwYWNlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBNYXAgZ2V0UGtnMm5zbWFwKCkgew0KLSAgICAgICAgcmV0dXJuIHBrZzJuc21hcDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRQa2cybnNtYXAoTWFwIHBrZzJuc21hcCkgew0KLSAgICAgICAgdGhpcy5wa2cybnNtYXAgPSBwa2cybnNtYXA7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRUYXJnZXROYW1lc3BhY2UoKSB7DQotICAgICAgICByZXR1cm4gdGFyZ2V0TmFtZXNwYWNlOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0U2ltcGxlTmFtZShEYXRhVHlwZSB0eXBlKXsNCi0gICAgICAgIGlmICh0eXBlIGluc3RhbmNlb2YgQ29tcG9zaXRlRGF0YVR5cGUpIHsNCi0gICAgICAgICAgICBDb21wb3NpdGVEYXRhVHlwZSBjb21wb3NpdGVUeXBlID0gKENvbXBvc2l0ZURhdGFUeXBlKSB0eXBlOw0KLSAgICAgICAgICAgIHJldHVybiBjb21wb3NpdGVUeXBlLmdldE5hbWUoKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgcmV0dXJuIENvcmJhVXRpbC5nZXRRdWFsaWZpZWROYW1lKHR5cGUpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE5vblJwY01ldGhvZHMoQXJyYXlMaXN0IG5vblJwY01ldGhvZHMpIHsNCi0gICAgICAgIGlmKG5vblJwY01ldGhvZHMhPW51bGwpew0KLSAgICAgICAgICAgIHRoaXMubm9uUnBjTWV0aG9kcyA9IG5vblJwY01ldGhvZHM7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0TW9kdWxlTmFtZShEYXRhVHlwZSB0eXBlKSB7DQotICAgICAgICBpZiAodHlwZSBpbnN0YW5jZW9mIENvbXBvc2l0ZURhdGFUeXBlKSB7DQotICAgICAgICAgICAgQ29tcG9zaXRlRGF0YVR5cGUgY29tcG9zaXRlVHlwZSA9IChDb21wb3NpdGVEYXRhVHlwZSkgdHlwZTsNCi0gICAgICAgICAgICBTdHJpbmcgbW9kdWxlID0gY29tcG9zaXRlVHlwZS5nZXRNb2R1bGUoKTsNCi0gICAgICAgICAgICBtb2R1bGUgPSBtb2R1bGUucmVwbGFjZUFsbCgiOjoiLCAiLiIpOw0KLSAgICAgICAgICAgIGlmIChtb2R1bGUuZW5kc1dpdGgoIi4iKSkgew0KLSAgICAgICAgICAgICAgICBtb2R1bGUgPSBtb2R1bGUuc3Vic3RyaW5nKDAsIG1vZHVsZS5sZW5ndGgoKSAtIDEpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gbW9kdWxlOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICByZXR1cm4gIiI7DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvZXhjZXB0aW9ucy9Db3JiYUV4Y2VwdGlvbi5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvZXhjZXB0aW9ucy9Db3JiYUV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTcwMzJmLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL2V4Y2VwdGlvbnMvQ29yYmFFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY29yYmEuZXhjZXB0aW9uczsNCi0NCi1wdWJsaWMgY2xhc3MgQ29yYmFFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gew0KLSAgICBwdWJsaWMgQ29yYmFFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgew0KLSAgICAgICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBDb3JiYUV4Y2VwdGlvbigpIHsNCi0gICAgICAgIHN1cGVyKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIENvcmJhRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7DQotICAgICAgICBzdXBlcihtZXNzYWdlKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQ29yYmFFeGNlcHRpb24oVGhyb3dhYmxlIGNhdXNlKSB7DQotICAgICAgICBzdXBlcihjYXVzZSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvZXhjZXB0aW9ucy9Db3JiYUludm9jYXRpb25FeGNlcHRpb24uamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL2V4Y2VwdGlvbnMvQ29yYmFJbnZvY2F0aW9uRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhNzAzNWEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvZXhjZXB0aW9ucy9Db3JiYUludm9jYXRpb25FeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY29yYmEuZXhjZXB0aW9uczsNCi0NCi1wdWJsaWMgY2xhc3MgQ29yYmFJbnZvY2F0aW9uRXhjZXB0aW9uIGV4dGVuZHMgQ29yYmFFeGNlcHRpb24gew0KLSAgICBwdWJsaWMgQ29yYmFJbnZvY2F0aW9uRXhjZXB0aW9uKCkgew0KLQkgICAgc3VwZXIoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQ29yYmFJbnZvY2F0aW9uRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7DQotICAgICAgICBzdXBlcihtZXNzYWdlKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQ29yYmFJbnZvY2F0aW9uRXhjZXB0aW9uKFRocm93YWJsZSBjYXVzZSkgew0KLSAgICAgICAgc3VwZXIoY2F1c2UpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBDb3JiYUludm9jYXRpb25FeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgew0KLSAgICAgICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL2V4Y2VwdGlvbnMvSURMUHJvY2Vzc29yRXhjZXB0aW9uLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9leGNlcHRpb25zL0lETFByb2Nlc3NvckV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTk4ZDUwLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL2V4Y2VwdGlvbnMvSURMUHJvY2Vzc29yRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmV4Y2VwdGlvbnM7DQotDQotcHVibGljIGNsYXNzIElETFByb2Nlc3NvckV4Y2VwdGlvbiBleHRlbmRzIENvcmJhRXhjZXB0aW9uIHsNCi0gICAgcHVibGljIElETFByb2Nlc3NvckV4Y2VwdGlvbigpIHsNCi0JICAgIHN1cGVyKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIElETFByb2Nlc3NvckV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgew0KLSAgICAgICAgc3VwZXIobWVzc2FnZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIElETFByb2Nlc3NvckV4Y2VwdGlvbihUaHJvd2FibGUgY2F1c2UpIHsNCi0gICAgICAgIHN1cGVyKGNhdXNlKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgSURMUHJvY2Vzc29yRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsNCi0gICAgICAgIHN1cGVyKG1lc3NhZ2UsIGNhdXNlKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9leGNlcHRpb25zL0ludmFsaWRJRExFeGNlcHRpb24uamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL2V4Y2VwdGlvbnMvSW52YWxpZElETEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGE2NjUwLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL2V4Y2VwdGlvbnMvSW52YWxpZElETEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmV4Y2VwdGlvbnM7Ci0KLXB1YmxpYyBjbGFzcyBJbnZhbGlkSURMRXhjZXB0aW9uIGV4dGVuZHMgQ29yYmFFeGNlcHRpb24gewotICAgIHB1YmxpYyBJbnZhbGlkSURMRXhjZXB0aW9uKCkgewotCSAgICBzdXBlcigpOwotICAgIH0KLQotICAgIHB1YmxpYyBJbnZhbGlkSURMRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBJbnZhbGlkSURMRXhjZXB0aW9uKFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICBzdXBlcihjYXVzZSk7Ci0gICAgfQotCi0gICAgcHVibGljIEludmFsaWRJRExFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlLCBjYXVzZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvZXhjZXB0aW9ucy9QcmVQcm9jZXNzb3JFeGNlcHRpb24uamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL2V4Y2VwdGlvbnMvUHJlUHJvY2Vzc29yRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxYTE4YTguLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvZXhjZXB0aW9ucy9QcmVQcm9jZXNzb3JFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5leGNlcHRpb25zOwotCi1wdWJsaWMgY2xhc3MgUHJlUHJvY2Vzc29yRXhjZXB0aW9uIGV4dGVuZHMgQ29yYmFFeGNlcHRpb24gewotCi0gICAgcHVibGljIFByZVByb2Nlc3NvckV4Y2VwdGlvbihTdHJpbmcgc3RyaW5nLCBFeGNlcHRpb24gZSkgewotICAgICAgICBzdXBlcihzdHJpbmcsIGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBQcmVQcm9jZXNzb3JFeGNlcHRpb24oU3RyaW5nIHN0cmluZykgewotICAgICAgICBzdXBlcihzdHJpbmcpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvZXhjZXB0aW9ucy9TY2hlbWFHZW5lcmF0b3JFeGNlcHRpb24uamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL2V4Y2VwdGlvbnMvU2NoZW1hR2VuZXJhdG9yRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjYTkxNjEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvZXhjZXB0aW9ucy9TY2hlbWFHZW5lcmF0b3JFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY29yYmEuZXhjZXB0aW9uczsNCi0NCi1wdWJsaWMgY2xhc3MgU2NoZW1hR2VuZXJhdG9yRXhjZXB0aW9uIGV4dGVuZHMgQ29yYmFFeGNlcHRpb24gew0KLSAgICBwdWJsaWMgU2NoZW1hR2VuZXJhdG9yRXhjZXB0aW9uKCkgew0KLQkgICAgc3VwZXIoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU2NoZW1hR2VuZXJhdG9yRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7DQotICAgICAgICBzdXBlcihtZXNzYWdlKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU2NoZW1hR2VuZXJhdG9yRXhjZXB0aW9uKFRocm93YWJsZSBjYXVzZSkgew0KLSAgICAgICAgc3VwZXIoY2F1c2UpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTY2hlbWFHZW5lcmF0b3JFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgew0KLSAgICAgICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL2lkbC9JRExQcm9jZXNzb3IuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL2lkbC9JRExQcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGNlOTIyYy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9pZGwvSURMUHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbDsNCi0NCi1pbXBvcnQgYW50bHIuY29sbGVjdGlvbnMuQVNUOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmV4Y2VwdGlvbnMuSURMUHJvY2Vzc29yRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC5wYXJzZXIuSURMTGV4ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLnBhcnNlci5JRExQYXJzZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLnBhcnNlci5JRExWaXNpdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC50eXBlcy5JREw7DQotDQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07DQotDQotcHVibGljIGNsYXNzIElETFByb2Nlc3NvciB7DQotDQotICAgIHByb3RlY3RlZCBJbnB1dFN0cmVhbSBzdHJlYW07DQotDQotICAgIHB1YmxpYyBJRExQcm9jZXNzb3IoSW5wdXRTdHJlYW0gc3RyZWFtKSB7DQotICAgICAgICB0aGlzLnN0cmVhbSA9IHN0cmVhbTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgSURMIHByb2Nlc3MoKSB0aHJvd3MgSURMUHJvY2Vzc29yRXhjZXB0aW9uIHsNCi0gICAgICAgIElETCBpZGw7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIElETFBhcnNlciBwYXJzZXIgPSBuZXcgSURMUGFyc2VyKG5ldyBJRExMZXhlcihzdHJlYW0pKTsNCi0gICAgICAgICAgICBwYXJzZXIuc3BlY2lmaWNhdGlvbigpOw0KLSAgICAgICAgICAgIEFTVCBpZGxUcmVlID0gcGFyc2VyLmdldEFTVCgpOw0KLQ0KLSAgICAgICAgICAgIC8vIG5ldyBEdW1wQVNUVmlzaXRvcigpLnZpc2l0KGlkbFRyZWUpOyAvLyBwcmludCB0aGUgQVNUIHN0cnVjdHVyZQ0KLQ0KLSAgICAgICAgICAgIElETFZpc2l0b3IgdmlzaXRvciA9IG5ldyBJRExWaXNpdG9yKCk7DQotICAgICAgICAgICAgdmlzaXRvci52aXNpdChpZGxUcmVlKTsNCi0gICAgICAgICAgICBpZGwgPSB2aXNpdG9yLmdldElETCgpOw0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IElETFByb2Nlc3NvckV4Y2VwdGlvbihleC5nZXRNZXNzYWdlKCksIGV4KTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBpZGw7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvaWRsL1ByZVByb2Nlc3NvcklucHV0U3RyZWFtLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9pZGwvUHJlUHJvY2Vzc29ySW5wdXRTdHJlYW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ViMjJkMy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9pZGwvUHJlUHJvY2Vzc29ySW5wdXRTdHJlYW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5leGNlcHRpb25zLlByZVByb2Nlc3NvckV4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkxpbmVOdW1iZXJSZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlN0YWNrOwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcElucHV0U3RyZWFtOwotCi1wdWJsaWMgY2xhc3MgUHJlUHJvY2Vzc29ySW5wdXRTdHJlYW0gZXh0ZW5kcyBJbnB1dFN0cmVhbSB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGludCBNQVhfREVQVEggPSA5OTsKLQotICAgIHByb3RlY3RlZCBTdHJpbmdbXSB1c2VySW5jbHVkZVBhdGhzOwotICAgIHByb3RlY3RlZCBTdHJpbmdbXSBzeXN0ZW1JbmNsdWRlUGF0aHM7Ci0gICAgcHJvdGVjdGVkIFN0cmluZyBjdXJyZW50RmlsZTsKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHBhcmVudFBhdGg7Ci0gICAgcHJvdGVjdGVkIFN0cmluZ0J1ZmZlciBpZGxDb250ZW50OwotICAgIHByb3RlY3RlZCBpbnQgY29udGVudExlbmd0aDsKLSAgICBwcm90ZWN0ZWQgaW50IGxhc3RSZWFkID0gMDsKLQotICAgIHB1YmxpYyBQcmVQcm9jZXNzb3JJbnB1dFN0cmVhbShTdHJpbmcgcGFyZW50UGF0aCwgU3RyaW5nIGlkbEZpbGVuYW1lKQotICAgICAgICAgICAgdGhyb3dzIFByZVByb2Nlc3NvckV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMocGFyZW50UGF0aCwgaWRsRmlsZW5hbWUsIG5ldyBTdHJpbmdbXSB7fSwgbmV3IFN0cmluZ1tdIHt9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJlUHJvY2Vzc29ySW5wdXRTdHJlYW0oU3RyaW5nIHBhcmVudFBhdGgsIFN0cmluZyBpZGxGaWxlbmFtZSwKLSAgICAgICAgICAgIFN0cmluZ1tdIHVzZXJJbmNsdWRlUGF0aHMsIFN0cmluZ1tdIHN5c3RlbUluY2x1ZGVQYXRocykKLSAgICAgICAgICAgIHRocm93cyBQcmVQcm9jZXNzb3JFeGNlcHRpb24gewotICAgICAgICB0aGlzLnVzZXJJbmNsdWRlUGF0aHMgPSB1c2VySW5jbHVkZVBhdGhzOwotICAgICAgICB0aGlzLnN5c3RlbUluY2x1ZGVQYXRocyA9IHN5c3RlbUluY2x1ZGVQYXRoczsKLSAgICAgICAgdGhpcy5wYXJlbnRQYXRoID0gcGFyZW50UGF0aDsKLSAgICAgICAgdGhpcy5jdXJyZW50RmlsZSA9IHBhcmVudFBhdGggKyBGaWxlLnNlcGFyYXRvciArIGlkbEZpbGVuYW1lOwotICAgICAgICBJbnB1dFN0cmVhbSBpZGxTdHJlYW0gPSBnZXRJbnB1dFN0cmVhbShwYXJlbnRQYXRoLCBpZGxGaWxlbmFtZSk7Ci0gICAgICAgIGlmIChpZGxGaWxlbmFtZSA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IFByZVByb2Nlc3NvckV4Y2VwdGlvbigiQ2Fubm90IGZpbmQgdGhlIGZpbGUgIgotICAgICAgICAgICAgICAgICAgICArIHBhcmVudFBhdGggKyBGaWxlLnNlcGFyYXRvciArIGlkbEZpbGVuYW1lKTsKLQotICAgICAgICBpZGxDb250ZW50ID0gcmVhZElkbChpZGxTdHJlYW0sIDApOwotICAgICAgICBjb250ZW50TGVuZ3RoID0gaWRsQ29udGVudC5sZW5ndGgoKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nQnVmZmVyIHJlYWRJZGwoSW5wdXRTdHJlYW0gaWRsU3RyZWFtLCBpbnQgZGVwdGgpCi0gICAgICAgICAgICB0aHJvd3MgUHJlUHJvY2Vzc29yRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgTGluZU51bWJlclJlYWRlciBsaW5lTnVtYmVyUmVhZGVyID0gbmV3IExpbmVOdW1iZXJSZWFkZXIoCi0gICAgICAgICAgICAgICAgbmV3IElucHV0U3RyZWFtUmVhZGVyKGlkbFN0cmVhbSkpOwotICAgICAgICBsaW5lTnVtYmVyUmVhZGVyLnNldExpbmVOdW1iZXIoMSk7Ci0gICAgICAgIFN0cmluZyBsaW5lOwotICAgICAgICBNYXAgZGVmcyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIFN0YWNrIGlmZGVmVmFsdWUgPSBuZXcgU3RhY2soKTsKLSAgICAgICAgYm9vbGVhbiB2YWxpZExpbmUgPSB0cnVlOwotICAgICAgICBib29sZWFuIGVsc2VOb3RWYWxpZCA9IGZhbHNlOwotICAgICAgICBTdHJpbmcgbGFzdExpbmUgPSBudWxsOwotICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBsaW5lID0gbGluZU51bWJlclJlYWRlci5yZWFkTGluZSgpOwotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBQcmVQcm9jZXNzb3JFeGNlcHRpb24oIkVycm9yIHdoaWxlIHJlYWRpbmcgbmV4dCBsaW5lIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBnZXRMaW5lTm9TdHJpbmcobGluZU51bWJlclJlYWRlciksIGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGxpbmUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfSBlbHNlIGlmIChsaW5lLnN0YXJ0c1dpdGgoIiMiKSkgewotICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lLnRyaW0oKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGxhc3RMaW5lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBsaW5lID0gbGFzdExpbmUgKyAiICIgKyBsaW5lOwotICAgICAgICAgICAgICAgIGxhc3RMaW5lID0gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFpZmRlZlZhbHVlLmVtcHR5KCkKLSAgICAgICAgICAgICAgICAgICAgJiYgISgoQm9vbGVhbikgaWZkZWZWYWx1ZS5wZWVrKCkpLmJvb2xlYW5WYWx1ZSgpCi0gICAgICAgICAgICAgICAgICAgICYmICFsaW5lLnN0YXJ0c1dpdGgoIiMiKSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfSBlbHNlIGlmIChsaW5lLnN0YXJ0c1dpdGgoIiMiKSAmJiBsaW5lLmVuZHNXaXRoKCJcXCIpKSB7Ci0gICAgICAgICAgICAgICAgbGFzdExpbmUgPSBsaW5lLnN1YnN0cmluZygwLCBsaW5lLmxhc3RJbmRleE9mKCJcXCIpKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobGluZS5zdGFydHNXaXRoKCIjaW5jbHVkZSIpICYmIHZhbGlkTGluZSkgewotICAgICAgICAgICAgICAgIGlmIChkZXB0aCA8IE1BWF9ERVBUSCkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaW5jID0gbGluZS5yZXBsYWNlQWxsKCIjaW5jbHVkZSIsICIiKS50cmltKCk7Ci0gICAgICAgICAgICAgICAgICAgIGFkZENvbW1lbnQoYnVmZmVyLCBsaW5lKTsKLSAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gaW5jaXMgPSByZXNvbHZlSW5jbHVkZShpbmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TGluZU5vU3RyaW5nKGxpbmVOdW1iZXJSZWFkZXIpKTsKLSAgICAgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChyZWFkSWRsKGluY2lzLCBkZXB0aCArIDEpKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkQ29tbWVudChidWZmZXIsICJlbmQgb2YgIiArIGxpbmUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBQcmVQcm9jZXNzb3JFeGNlcHRpb24oIk1vcmUgdGhhbiAiICsgTUFYX0RFUFRICi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIG5lc3RlZCAjaW5jbHVkZXMgYXJlIG5vdCBhbGxvd2VkIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZ2V0TGluZU5vU3RyaW5nKGxpbmVOdW1iZXJSZWFkZXIpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGxpbmUuc3RhcnRzV2l0aCgiI2RlZmluZSIpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGRlZiA9IGxpbmUucmVwbGFjZUFsbCgiI2RlZmluZSIsICIiKS50cmltKCk7Ci0gICAgICAgICAgICAgICAgZGVmID0gZGVmLnJlcGxhY2VBbGwoIlwiIiwgIiIpOwotICAgICAgICAgICAgICAgIFN0cmluZ1Rva2VuaXplciB0b2sgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGRlZiwgIiAiKTsKLSAgICAgICAgICAgICAgICBpZiAodG9rLmNvdW50VG9rZW5zKCkgPT0gMSkgewotICAgICAgICAgICAgICAgICAgICBkZWYgPSB0b2submV4dFRva2VuKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkZWZzLmNvbnRhaW5zS2V5KGRlZikpCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUHJlUHJvY2Vzc29yRXhjZXB0aW9uKCJWYXJpYWJsZSAiICsgZGVmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBpcyBhbHJlYWR5IGRlZmluZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZ2V0TGluZU5vU3RyaW5nKGxpbmVOdW1iZXJSZWFkZXIpKTsKLSAgICAgICAgICAgICAgICAgICAgZGVmcy5wdXQoZGVmLCBudWxsKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRvay5jb3VudFRva2VucygpID09IDIpIHsKLSAgICAgICAgICAgICAgICAgICAgZGVmcy5wdXQodG9rLm5leHRUb2tlbigpLCB0b2submV4dFRva2VuKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBhZGRDb21tZW50KGJ1ZmZlciwgbGluZSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGxpbmUuc3RhcnRzV2l0aCgiI3VuZGVmIikpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZGVmID0gbGluZS5yZXBsYWNlQWxsKCIjdW5kZWYiLCAiIikudHJpbSgpOwotICAgICAgICAgICAgICAgIGRlZiA9IGRlZi5yZXBsYWNlQWxsKCJcIiIsICIiKTsKLSAgICAgICAgICAgICAgICBpZiAoZGVmcy5jb250YWluc0tleShkZWYpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlZnMucmVtb3ZlKGRlZik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFByZVByb2Nlc3NvckV4Y2VwdGlvbigiVW5kaWZpbmVkIHZhcmlhYmxlICIgKyBkZWYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGdldExpbmVOb1N0cmluZyhsaW5lTnVtYmVyUmVhZGVyKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGFkZENvbW1lbnQoYnVmZmVyLCBsaW5lKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobGluZS5zdGFydHNXaXRoKCIjaWZkZWYiKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBkZWYgPSBsaW5lLnJlcGxhY2VBbGwoIiNpZmRlZiIsICIiKS50cmltKCk7Ci0gICAgICAgICAgICAgICAgZGVmID0gZGVmLnJlcGxhY2VBbGwoIlwiIiwgIiIpOwotICAgICAgICAgICAgICAgIGlmIChkZWZzLmNvbnRhaW5zS2V5KGRlZikpIHsKLSAgICAgICAgICAgICAgICAgICAgaWZkZWZWYWx1ZS5wdXNoKEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdmFsaWRMaW5lID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGlmZGVmVmFsdWUucHVzaChCb29sZWFuLkZBTFNFKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZU5vdFZhbGlkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgYWRkQ29tbWVudChidWZmZXIsIGxpbmUpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChsaW5lLnN0YXJ0c1dpdGgoIiNpZm5kZWYiKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBkZWYgPSBsaW5lLnJlcGxhY2VBbGwoIiNpZm5kZWYiLCAiIikudHJpbSgpOwotICAgICAgICAgICAgICAgIGRlZiA9IGRlZi5yZXBsYWNlQWxsKCJcIiIsICIiKTsKLSAgICAgICAgICAgICAgICBpZiAoZGVmcy5jb250YWluc0tleShkZWYpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHZhbGlkTGluZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBpZmRlZlZhbHVlLnB1c2goQm9vbGVhbi5GQUxTRSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWZkZWZWYWx1ZS5wdXNoKEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2VOb3RWYWxpZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGFkZENvbW1lbnQoYnVmZmVyLCBsaW5lKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobGluZS5zdGFydHNXaXRoKCIjZWxzZSIpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGVsc2VOb3RWYWxpZCkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFByZVByb2Nlc3NvckV4Y2VwdGlvbigiSW52YWxpZCAjZWxzZSBwcmVwcm9jZXNzb3IgZGlyZWN0aXZlIiArIGdldExpbmVOb1N0cmluZyhsaW5lTnVtYmVyUmVhZGVyKSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIGludmVydCBsYXN0IGVsZW1lbnQKLSAgICAgICAgICAgICAgICBib29sZWFuIGxhc3R2YWwgPSAoKEJvb2xlYW4pIGlmZGVmVmFsdWUucGVlaygpKS5ib29sZWFuVmFsdWUoKTsKLSAgICAgICAgICAgICAgICBpZmRlZlZhbHVlLnNldEVsZW1lbnRBdChuZXcgQm9vbGVhbighbGFzdHZhbCksIGlmZGVmVmFsdWUuc2l6ZSgpIC0gMSk7Ci0gICAgICAgICAgICAgICAgdmFsaWRMaW5lID0gaXNBbGxUcnVlKGlmZGVmVmFsdWUpOwotICAgICAgICAgICAgICAgIGVsc2VOb3RWYWxpZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYWRkQ29tbWVudChidWZmZXIsIGxpbmUpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChsaW5lLnN0YXJ0c1dpdGgoIiNlbmRpZiIpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGlmZGVmVmFsdWUuZW1wdHkoKSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFByZVByb2Nlc3NvckV4Y2VwdGlvbigiSW52YWxpZCAjZW5kaWYgcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZSIgKyBnZXRMaW5lTm9TdHJpbmcobGluZU51bWJlclJlYWRlcikpOwotICAgICAgICAgICAgICAgIGlmZGVmVmFsdWUucG9wKCk7Ci0gICAgICAgICAgICAgICAgdmFsaWRMaW5lID0gaXNBbGxUcnVlKGlmZGVmVmFsdWUpOwotICAgICAgICAgICAgICAgIGVsc2VOb3RWYWxpZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGFkZENvbW1lbnQoYnVmZmVyLCBsaW5lKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobGluZS5zdGFydHNXaXRoKCIjIikpIHsKLSAgICAgICAgICAgICAgICAvLyBUT0RPOiBsb2cKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0Ci0gICAgICAgICAgICAgICAgICAgICAgICAucHJpbnRsbigiSWdub3JpbmcgdW5zdXBwb3J0ZWQgcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbGluZSArIGdldExpbmVOb1N0cmluZyhsaW5lTnVtYmVyUmVhZGVyKSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHZhbGlkTGluZSkgewotICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQobGluZSk7Ci0gICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgnXG4nKTsKLSAgICAgICAgICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4obGluZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIWlmZGVmVmFsdWUuZW1wdHkoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFByZVByb2Nlc3NvckV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIk9uZSBvciBtb3JlICNpZmRlZi8jaWZuZGVmIHByZXByb2Nlc3NvciBkaXJlY3RpdmVzIGFyZSBub3QgcHJvcGVybHkgY2xvc2VkIiArIGdldExpbmVOb1N0cmluZyhsaW5lTnVtYmVyUmVhZGVyKSk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgbGluZU51bWJlclJlYWRlci5jbG9zZSgpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBidWZmZXI7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIElucHV0U3RyZWFtIHJlc29sdmVJbmNsdWRlKFN0cmluZyBpbmNsdWRlLCBTdHJpbmcgbGluZU5vU3RyaW5nKQotICAgICAgICAgICAgdGhyb3dzIFByZVByb2Nlc3NvckV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBGaWxlIGluY0ZpbGU7Ci0gICAgICAgICAgICBpZiAoaW5jbHVkZS5zdGFydHNXaXRoKCJcIiIpICYmIGluY2x1ZGUuc3RhcnRzV2l0aCgiXCIiKSkgewotICAgICAgICAgICAgICAgIGluY2x1ZGUgPSBpbmNsdWRlLnJlcGxhY2VBbGwoIlwiIiwgIiIpOwotICAgICAgICAgICAgICAgIGluY0ZpbGUgPSBuZXcgRmlsZShpbmNsdWRlKTsKLSAgICAgICAgICAgICAgICBpZiAoaW5jRmlsZS5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgICAgICBjdXJyZW50RmlsZSA9IGluY0ZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRmlsZUlucHV0U3RyZWFtKGluY0ZpbGUpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIHN0cmVhbSA9IGdldElucHV0U3RyZWFtKHBhcmVudFBhdGgsIGluY2x1ZGUpOwotICAgICAgICAgICAgICAgIGlmIChzdHJlYW0gIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0cmVhbTsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdXNlckluY2x1ZGVQYXRocy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAodXNlckluY2x1ZGVQYXRoc1tpXS5lbmRzV2l0aChGaWxlLnNlcGFyYXRvcikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluY0ZpbGUgPSBuZXcgRmlsZSh1c2VySW5jbHVkZVBhdGhzW2ldICsgaW5jbHVkZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbmNGaWxlID0gbmV3IEZpbGUodXNlckluY2x1ZGVQYXRoc1tpXSArIEZpbGUuc2VwYXJhdG9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgaW5jbHVkZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGluY0ZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRGaWxlID0gaW5jRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRmlsZUlucHV0U3RyZWFtKGluY0ZpbGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFByZVByb2Nlc3NvckV4Y2VwdGlvbigiVW5hYmxlIHRvIHJlc29sdmUgaW5jbHVkZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICArIGluY2x1ZGUgKyBsaW5lTm9TdHJpbmcpOwotCi0gICAgICAgICAgICB9IGVsc2UgaWYgKGluY2x1ZGUuc3RhcnRzV2l0aCgiPCIpICYmIGluY2x1ZGUuc3RhcnRzV2l0aCgiPiIpKSB7Ci0gICAgICAgICAgICAgICAgaW5jbHVkZSA9IGluY2x1ZGUucmVwbGFjZUFsbCgiPCIsICIiKTsKLSAgICAgICAgICAgICAgICBpbmNsdWRlID0gaW5jbHVkZS5yZXBsYWNlQWxsKCI+IiwgIiIpOwotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzeXN0ZW1JbmNsdWRlUGF0aHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHN5c3RlbUluY2x1ZGVQYXRoc1tpXS5lbmRzV2l0aChGaWxlLnNlcGFyYXRvcikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluY0ZpbGUgPSBuZXcgRmlsZShzeXN0ZW1JbmNsdWRlUGF0aHNbaV0gKyBpbmNsdWRlKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluY0ZpbGUgPSBuZXcgRmlsZShzeXN0ZW1JbmNsdWRlUGF0aHNbaV0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBGaWxlLnNlcGFyYXRvciArIGluY2x1ZGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpbmNGaWxlLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50RmlsZSA9IGluY0ZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEZpbGVJbnB1dFN0cmVhbShpbmNGaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUHJlUHJvY2Vzc29yRXhjZXB0aW9uKCJVbmFibGUgdG8gcmVzb2x2ZSBpbmNsdWRlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgaW5jbHVkZSArIGxpbmVOb1N0cmluZyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBQcmVQcm9jZXNzb3JFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAiSW5jbHVkZSBuYW1lIG11c3QgYmUgZW5jbG9zZWQgaW4gJzwgPicgb3IgJ1wiIFwiJyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBsaW5lTm9TdHJpbmcpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFByZVByb2Nlc3NvckV4Y2VwdGlvbigiVW5hYmxlIHRvIHJlc29sdmUgaW5jbHVkZSAiCi0gICAgICAgICAgICAgICAgICAgICsgaW5jbHVkZSArIGxpbmVOb1N0cmluZywgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oU3RyaW5nIHBhcmVudCwgU3RyaW5nIGZpbGVuYW1lKQotICAgICAgICAgICAgdGhyb3dzIFByZVByb2Nlc3NvckV4Y2VwdGlvbiB7Ci0gICAgICAgIEZpbGUgcGFyZW50RmlsZSA9IG5ldyBGaWxlKHBhcmVudCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAocGFyZW50RmlsZS5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBGaWxlSW5wdXRTdHJlYW0ocGFyZW50ICsgRmlsZS5zZXBhcmF0b3IgKyBmaWxlbmFtZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFppcElucHV0U3RyZWFtIHppbiA9IG5ldyBaaXBJbnB1dFN0cmVhbShuZXcgRmlsZUlucHV0U3RyZWFtKAotICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50RmlsZSkpOwotICAgICAgICAgICAgICAgIFppcEVudHJ5IGVudHJ5OwotICAgICAgICAgICAgICAgIHdoaWxlICgoZW50cnkgPSB6aW4uZ2V0TmV4dEVudHJ5KCkpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5LmdldE5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKGZpbGVuYW1lKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHppbjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFByZVByb2Nlc3NvckV4Y2VwdGlvbigiVW5hYmxlIHRvIHByZS1wcm9jZXNzIGZpbGUgIiArIHBhcmVudAotICAgICAgICAgICAgICAgICAgICArIEZpbGUuc2VwYXJhdG9yICsgZmlsZW5hbWUsIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzQWxsVHJ1ZShTdGFjayBzdGFjaykgewotICAgICAgICBpZiAoc3RhY2suZW1wdHkoKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gc3RhY2suaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIEJvb2xlYW4gdmFsdWUgPSAoQm9vbGVhbikgaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgIGlmICghdmFsdWUuYm9vbGVhblZhbHVlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZENvbW1lbnQoU3RyaW5nQnVmZmVyIGJ1ZmZlciwgU3RyaW5nIGxpbmUpIHsKLSAgICAgICAgYnVmZmVyLmFwcGVuZCgiLyogIik7Ci0gICAgICAgIGJ1ZmZlci5hcHBlbmQobGluZSk7Ci0gICAgICAgIGJ1ZmZlci5hcHBlbmQoIiAqL1xuIik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0TGluZU5vU3RyaW5nKExpbmVOdW1iZXJSZWFkZXIgbGluZU51bWJlclJlYWRlcikgewotICAgICAgICBpZiAobGluZU51bWJlclJlYWRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnQgbGluZU5vID0gbGluZU51bWJlclJlYWRlci5nZXRMaW5lTnVtYmVyKCk7Ci0gICAgICAgICAgICBpZiAobGluZU5vID4gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiAiIChmaWxlOiIgKyBjdXJyZW50RmlsZSArICIsIGxpbmU6IiArIChsaW5lTm8gLSAxKSArICIpIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gIiI7Ci0gICAgfQotCi0gICAgcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIChjb250ZW50TGVuZ3RoID4gbGFzdFJlYWQpID8gaWRsQ29udGVudC5jaGFyQXQobGFzdFJlYWQrKykgOiAtMTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9pZGwvcGFyc2VyL0lETExleGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9pZGwvcGFyc2VyL0lETExleGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwOWYzYTUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvaWRsL3BhcnNlci9JRExMZXhlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk2MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotLy8gJEFOVExSIDIuNy42ICgyMDA1LTEyLTIyKTogIm9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLmciIC0+ICJJRExMZXhlci5qYXZhIiQNCi0NCi0gIHBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5pZGwucGFyc2VyOw0KLQ0KLWltcG9ydCBhbnRsci5BTlRMUkhhc2hTdHJpbmc7DQotaW1wb3J0IGFudGxyLkJ5dGVCdWZmZXI7DQotaW1wb3J0IGFudGxyLkNoYXJCdWZmZXI7DQotaW1wb3J0IGFudGxyLkNoYXJTdHJlYW1FeGNlcHRpb247DQotaW1wb3J0IGFudGxyLkNoYXJTdHJlYW1JT0V4Y2VwdGlvbjsNCi1pbXBvcnQgYW50bHIuSW5wdXRCdWZmZXI7DQotaW1wb3J0IGFudGxyLkxleGVyU2hhcmVkSW5wdXRTdGF0ZTsNCi1pbXBvcnQgYW50bHIuTm9WaWFibGVBbHRGb3JDaGFyRXhjZXB0aW9uOw0KLWltcG9ydCBhbnRsci5SZWNvZ25pdGlvbkV4Y2VwdGlvbjsNCi1pbXBvcnQgYW50bHIuVG9rZW47DQotaW1wb3J0IGFudGxyLlRva2VuU3RyZWFtOw0KLWltcG9ydCBhbnRsci5Ub2tlblN0cmVhbUV4Y2VwdGlvbjsNCi1pbXBvcnQgYW50bHIuVG9rZW5TdHJlYW1JT0V4Y2VwdGlvbjsNCi1pbXBvcnQgYW50bHIuVG9rZW5TdHJlYW1SZWNvZ25pdGlvbkV4Y2VwdGlvbjsNCi1pbXBvcnQgYW50bHIuY29sbGVjdGlvbnMuaW1wbC5CaXRTZXQ7DQotDQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07DQotaW1wb3J0IGphdmEuaW8uUmVhZGVyOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOw0KLQ0KLXB1YmxpYyBjbGFzcyBJRExMZXhlciBleHRlbmRzIGFudGxyLkNoYXJTY2FubmVyIGltcGxlbWVudHMgSURMVG9rZW5UeXBlcywgVG9rZW5TdHJlYW0NCi0gew0KLXB1YmxpYyBJRExMZXhlcihJbnB1dFN0cmVhbSBpbikgew0KLQl0aGlzKG5ldyBCeXRlQnVmZmVyKGluKSk7DQotfQ0KLXB1YmxpYyBJRExMZXhlcihSZWFkZXIgaW4pIHsNCi0JdGhpcyhuZXcgQ2hhckJ1ZmZlcihpbikpOw0KLX0NCi1wdWJsaWMgSURMTGV4ZXIoSW5wdXRCdWZmZXIgaWIpIHsNCi0JdGhpcyhuZXcgTGV4ZXJTaGFyZWRJbnB1dFN0YXRlKGliKSk7DQotfQ0KLXB1YmxpYyBJRExMZXhlcihMZXhlclNoYXJlZElucHV0U3RhdGUgc3RhdGUpIHsNCi0Jc3VwZXIoc3RhdGUpOw0KLQljYXNlU2Vuc2l0aXZlTGl0ZXJhbHMgPSB0cnVlOw0KLQlzZXRDYXNlU2Vuc2l0aXZlKHRydWUpOw0KLQlsaXRlcmFscyA9IG5ldyBIYXNodGFibGUoKTsNCi0JbGl0ZXJhbHMucHV0KG5ldyBBTlRMUkhhc2hTdHJpbmcoInN3aXRjaCIsIHRoaXMpLCBuZXcgSW50ZWdlcig1NykpOw0KLQlsaXRlcmFscy5wdXQobmV3IEFOVExSSGFzaFN0cmluZygidHlwZXByZWZpeCIsIHRoaXMpLCBuZXcgSW50ZWdlcig3OSkpOw0KLQlsaXRlcmFscy5wdXQobmV3IEFOVExSSGFzaFN0cmluZygiY2FzZSIsIHRoaXMpLCBuZXcgSW50ZWdlcig1OCkpOw0KLQlsaXRlcmFscy5wdXQobmV3IEFOVExSSGFzaFN0cmluZygiZmluZGVyIiwgdGhpcyksIG5ldyBJbnRlZ2VyKDk0KSk7DQotCWxpdGVyYWxzLnB1dChuZXcgQU5UTFJIYXNoU3RyaW5nKCJtYW5hZ2VzIiwgdGhpcyksIG5ldyBJbnRlZ2VyKDkyKSk7DQotCWxpdGVyYWxzLnB1dChuZXcgQU5UTFJIYXNoU3RyaW5nKCJpbnRlcmZhY2UiLCB0aGlzKSwgbmV3IEludGVnZXIoNykpOw0KLQlsaXRlcmFscy5wdXQobmV3IEFOVExSSGFzaFN0cmluZygicHJvdmlkZXMiLCB0aGlzKSwgbmV3IEludGVnZXIoODUpKTsNCi0JbGl0ZXJhbHMucHV0KG5ldyBBTlRMUkhhc2hTdHJpbmcoImV4Y2VwdGlvbiIsIHRoaXMpLCBuZXcgSW50ZWdlcig2OCkpOw0KLQlsaXRlcmFscy5wdXQobmV3IEFOVExSSGFzaFN0cmluZygicHJpbWFyeWtleSIsIHRoaXMpLCBuZXcgSW50ZWdlcig5MykpOw0KLQlsaXRlcmFscy5wdXQobmV3IEFOVExSSGFzaFN0cmluZygic2VxdWVuY2UiLCB0aGlzKSwgbmV3IEludGVnZXIoNjEpKTsNCi0JbGl0ZXJhbHMucHV0KG5ldyBBTlRMUkhhc2hTdHJpbmcoInVzZXMiLCB0aGlzKSwgbmV3IEludGVnZXIoODYpKTsNCi0JbGl0ZXJhbHMucHV0KG5ldyBBTlRMUkhhc2hTdHJpbmcoImNvbnN1bWVzIiwgdGhpcyksIG5ldyBJbnRlZ2VyKDkwKSk7DQotCWxpdGVyYWxzLnB1dChuZXcgQU5UTFJIYXNoU3RyaW5nKCJ2b2lkIiwgdGhpcyksIG5ldyBJbnRlZ2VyKDcwKSk7DQotCWxpdGVyYWxzLnB1dChuZXcgQU5UTFJIYXNoU3RyaW5nKCJmYWN0b3J5IiwgdGhpcyksIG5ldyBJbnRlZ2VyKDIzKSk7DQotCWxpdGVyYWxzLnB1dChuZXcgQU5UTFJIYXNoU3RyaW5nKCJpbXBvcnQiLCB0aGlzKSwgbmV3IEludGVnZXIoNzcpKTsNCi0JbGl0ZXJhbHMucHV0KG5ldyBBTlRMUkhhc2hTdHJpbmcoImZsb2F0IiwgdGhpcyksIG5ldyBJbnRlZ2VyKDQ0KSk7DQotCWxpdGVyYWxzLnB1dChuZXcgQU5UTFJIYXNoU3RyaW5nKCJwdWJsaXNoZXMiLCB0aGlzKSwgbmV3IEludGVnZXIoODkpKTsNCi0JbGl0ZXJhbHMucHV0KG5ldyBBTlRMUkhhc2hTdHJpbmcoInByaXZhdGUiLCB0aGlzKSwgbmV3IEludGVnZXIoMjIpKTsNCi0JbGl0ZXJhbHMucHV0KG5ldyBBTlRMUkhhc2hTdHJpbmcoImJvb2xlYW4iLCB0aGlzKSwgbmV3IEludGVnZXIoNTEpKTsNCi0JbGl0ZXJhbHMucHV0KG5ldyBBTlRMUkhhc2hTdHJpbmcoInN0cmluZyIsIHRoaXMpLCBuZXcgSW50ZWdlcig2NCkpOw0KLQlsaXRlcmFscy5wdXQobmV3IEFOVExSSGFzaFN0cmluZygiZ2V0cmFpc2VzIiwgdGhpcyksIG5ldyBJbnRlZ2VyKDgyKSk7DQotCWxpdGVyYWxzLnB1dChuZXcgQU5UTFJIYXNoU3RyaW5nKCJlbWl0cyIsIHRoaXMpLCBuZXcgSW50ZWdlcig4OCkpOw0KLQlsaXRlcmFscy5wdXQobmV3IEFOVExSSGFzaFN0cmluZygiY3VzdG9tIiwgdGhpcyksIG5ldyBJbnRlZ2VyKDgpKTsNCi0JbGl0ZXJhbHMucHV0KG5ldyBBTlRMUkhhc2hTdHJpbmcoImNvbXBvbmVudCIsIHRoaXMpLCBuZXcgSW50ZWdlcig4NCkpOw0KLQlsaXRlcmFscy5wdXQobmV3IEFOVExSSGFzaFN0cmluZygiY29udGV4dCIsIHRoaXMpLCBuZXcgSW50ZWdlcig3NCkpOw0KLQlsaXRlcmFscy5wdXQobmV3IEFOVExSSGFzaFN0cmluZygib2N0ZXQiLCB0aGlzKSwgbmV3IEludGVnZXIoNTIpKTsNCi0JbGl0ZXJhbHMucHV0KG5ldyBBTlRMUkhhc2hTdHJpbmcoIm9uZXdheSIsIHRoaXMpLCBuZXcgSW50ZWdlcig2OSkpOw0KLQlsaXRlcmFscy5wdXQobmV3IEFOVExSSGFzaFN0cmluZygibG9uZyIsIHRoaXMpLCBuZXcgSW50ZWdlcig0NikpOw0KLQlsaXRlcmFscy5wdXQobmV3IEFOVExSSGFzaFN0cmluZygiVmFsdWVCYXNlIiwgdGhpcyksIG5ldyBJbnRlZ2VyKDc2KSk7DQotCWxpdGVyYWxzLnB1dChuZXcgQU5UTFJIYXNoU3RyaW5nKCJpbiIsIHRoaXMpLCBuZXcgSW50ZWdlcigyNikpOw0KLQlsaXRlcmFscy5wdXQobmV3IEFOVExSSGFzaFN0cmluZygidHJ1bmNhdGFibGUiLCB0aGlzKSwgbmV3IEludGVnZXIoMTkpKTsNCi0JbGl0ZXJhbHMucHV0KG5ldyBBTlRMUkhhc2hTdHJpbmcoIkZBTFNFIiwgdGhpcyksIG5ldyBJbnRlZ2VyKDQxKSk7DQotCWxpdGVyYWxzLnB1dChuZXcgQU5UTFJIYXNoU3RyaW5nKCJyZWFkb25seSIsIHRoaXMpLCBuZXcgSW50ZWdlcig4MCkpOw0KLQlsaXRlcmFscy5wdXQobmV3IEFOVExSSGFzaFN0cmluZygidHlwZWRlZiIsIHRoaXMpLCBuZXcgSW50ZWdlcig0MikpOw0KLQlsaXRlcmFscy5wdXQobmV3IEFOVExSSGFzaFN0cmluZygic3VwcG9ydHMiLCB0aGlzKSwgbmV3IEludGVnZXIoMjApKTsNCi0JbGl0ZXJhbHMucHV0KG5ldyBBTlRMUkhhc2hTdHJpbmcoInNob3J0IiwgdGhpcyksIG5ldyBJbnRlZ2VyKDQ3KSk7DQotCWxpdGVyYWxzLnB1dChuZXcgQU5UTFJIYXNoU3RyaW5nKCJUUlVFIiwgdGhpcyksIG5ldyBJbnRlZ2VyKDQwKSk7DQotCWxpdGVyYWxzLnB1dChuZXcgQU5UTFJIYXNoU3RyaW5nKCJmaXhlZCIsIHRoaXMpLCBuZXcgSW50ZWdlcig3NSkpOw0KLQlsaXRlcmFscy5wdXQobmV3IEFOVExSSGFzaFN0cmluZygiT2JqZWN0IiwgdGhpcyksIG5ldyBJbnRlZ2VyKDU0KSk7DQotCWxpdGVyYWxzLnB1dChuZXcgQU5UTFJIYXNoU3RyaW5nKCJlbnVtIiwgdGhpcyksIG5ldyBJbnRlZ2VyKDYwKSk7DQotCWxpdGVyYWxzLnB1dChuZXcgQU5UTFJIYXNoU3RyaW5nKCJob21lIiwgdGhpcyksIG5ldyBJbnRlZ2VyKDkxKSk7DQotCWxpdGVyYWxzLnB1dChuZXcgQU5UTFJIYXNoU3RyaW5nKCJtdWx0aXBsZSIsIHRoaXMpLCBuZXcgSW50ZWdlcig4NykpOw0KLQlsaXRlcmFscy5wdXQobmV3IEFOVExSSGFzaFN0cmluZygiYXR0cmlidXRlIiwgdGhpcyksIG5ldyBJbnRlZ2VyKDgxKSk7DQotCWxpdGVyYWxzLnB1dChuZXcgQU5UTFJIYXNoU3RyaW5nKCJjaGFyIiwgdGhpcyksIG5ldyBJbnRlZ2VyKDQ5KSk7DQotCWxpdGVyYWxzLnB1dChuZXcgQU5UTFJIYXNoU3RyaW5nKCJ1bmlvbiIsIHRoaXMpLCBuZXcgSW50ZWdlcig1NikpOw0KLQlsaXRlcmFscy5wdXQobmV3IEFOVExSSGFzaFN0cmluZygibG9jYWwiLCB0aGlzKSwgbmV3IEludGVnZXIoNikpOw0KLQlsaXRlcmFscy5wdXQobmV3IEFOVExSSGFzaFN0cmluZygiY29uc3QiLCB0aGlzKSwgbmV3IEludGVnZXIoMjcpKTsNCi0JbGl0ZXJhbHMucHV0KG5ldyBBTlRMUkhhc2hTdHJpbmcoInNldHJhaXNlcyIsIHRoaXMpLCBuZXcgSW50ZWdlcig4MykpOw0KLQlsaXRlcmFscy5wdXQobmV3IEFOVExSSGFzaFN0cmluZygiYWJzdHJhY3QiLCB0aGlzKSwgbmV3IEludGVnZXIoNSkpOw0KLQlsaXRlcmFscy5wdXQobmV3IEFOVExSSGFzaFN0cmluZygidmFsdWV0eXBlIiwgdGhpcyksIG5ldyBJbnRlZ2VyKDkpKTsNCi0JbGl0ZXJhbHMucHV0KG5ldyBBTlRMUkhhc2hTdHJpbmcoImlub3V0IiwgdGhpcyksIG5ldyBJbnRlZ2VyKDcyKSk7DQotCWxpdGVyYWxzLnB1dChuZXcgQU5UTFJIYXNoU3RyaW5nKCJyYWlzZXMiLCB0aGlzKSwgbmV3IEludGVnZXIoNzMpKTsNCi0JbGl0ZXJhbHMucHV0KG5ldyBBTlRMUkhhc2hTdHJpbmcoIm91dCIsIHRoaXMpLCBuZXcgSW50ZWdlcig3MSkpOw0KLQlsaXRlcmFscy5wdXQobmV3IEFOVExSSGFzaFN0cmluZygidHlwZWlkIiwgdGhpcyksIG5ldyBJbnRlZ2VyKDc4KSk7DQotCWxpdGVyYWxzLnB1dChuZXcgQU5UTFJIYXNoU3RyaW5nKCJ3Y2hhciIsIHRoaXMpLCBuZXcgSW50ZWdlcig1MCkpOw0KLQlsaXRlcmFscy5wdXQobmV3IEFOVExSSGFzaFN0cmluZygiYW55IiwgdGhpcyksIG5ldyBJbnRlZ2VyKDUzKSk7DQotCWxpdGVyYWxzLnB1dChuZXcgQU5UTFJIYXNoU3RyaW5nKCJkb3VibGUiLCB0aGlzKSwgbmV3IEludGVnZXIoNDUpKTsNCi0JbGl0ZXJhbHMucHV0KG5ldyBBTlRMUkhhc2hTdHJpbmcoImRlZmF1bHQiLCB0aGlzKSwgbmV3IEludGVnZXIoNTkpKTsNCi0JbGl0ZXJhbHMucHV0KG5ldyBBTlRMUkhhc2hTdHJpbmcoImV2ZW50dHlwZSIsIHRoaXMpLCBuZXcgSW50ZWdlcigxMCkpOw0KLQlsaXRlcmFscy5wdXQobmV3IEFOVExSSGFzaFN0cmluZygid3N0cmluZyIsIHRoaXMpLCBuZXcgSW50ZWdlcig2NSkpOw0KLQlsaXRlcmFscy5wdXQobmV3IEFOVExSSGFzaFN0cmluZygidW5zaWduZWQiLCB0aGlzKSwgbmV3IEludGVnZXIoNDgpKTsNCi0JbGl0ZXJhbHMucHV0KG5ldyBBTlRMUkhhc2hTdHJpbmcoInN0cnVjdCIsIHRoaXMpLCBuZXcgSW50ZWdlcig1NSkpOw0KLQlsaXRlcmFscy5wdXQobmV3IEFOVExSSGFzaFN0cmluZygicHVibGljIiwgdGhpcyksIG5ldyBJbnRlZ2VyKDIxKSk7DQotCWxpdGVyYWxzLnB1dChuZXcgQU5UTFJIYXNoU3RyaW5nKCJtb2R1bGUiLCB0aGlzKSwgbmV3IEludGVnZXIoMTEpKTsNCi0JbGl0ZXJhbHMucHV0KG5ldyBBTlRMUkhhc2hTdHJpbmcoIm5hdGl2ZSIsIHRoaXMpLCBuZXcgSW50ZWdlcig0MykpOw0KLX0NCi0NCi1wdWJsaWMgVG9rZW4gbmV4dFRva2VuKCkgdGhyb3dzIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JVG9rZW4gdGhlUmV0VG9rZW49bnVsbDsNCi10cnlBZ2FpbjoNCi0JZm9yICg7Oykgew0KLQkJVG9rZW4gX3Rva2VuID0gbnVsbDsNCi0JCWludCBfdHR5cGUgPSBUb2tlbi5JTlZBTElEX1RZUEU7DQotCQlyZXNldFRleHQoKTsNCi0JCXRyeSB7ICAgLy8gZm9yIGNoYXIgc3RyZWFtIGVycm9yIGhhbmRsaW5nDQotCQkJdHJ5IHsgICAvLyBmb3IgbGV4aWNhbCBlcnJvciBoYW5kbGluZw0KLQkJCQlzd2l0Y2ggKCBMQSgxKSkgew0KLQkJCQljYXNlICc7JzoNCi0JCQkJew0KLQkJCQkJbVNFTUkodHJ1ZSk7DQotCQkJCQl0aGVSZXRUb2tlbj1fcmV0dXJuVG9rZW47DQotCQkJCQlicmVhazsNCi0JCQkJfQ0KLQkJCQljYXNlICc/JzoNCi0JCQkJew0KLQkJCQkJbVFVRVNUSU9OKHRydWUpOw0KLQkJCQkJdGhlUmV0VG9rZW49X3JldHVyblRva2VuOw0KLQkJCQkJYnJlYWs7DQotCQkJCX0NCi0JCQkJY2FzZSAnKCc6DQotCQkJCXsNCi0JCQkJCW1MUEFSRU4odHJ1ZSk7DQotCQkJCQl0aGVSZXRUb2tlbj1fcmV0dXJuVG9rZW47DQotCQkJCQlicmVhazsNCi0JCQkJfQ0KLQkJCQljYXNlICcpJzoNCi0JCQkJew0KLQkJCQkJbVJQQVJFTih0cnVlKTsNCi0JCQkJCXRoZVJldFRva2VuPV9yZXR1cm5Ub2tlbjsNCi0JCQkJCWJyZWFrOw0KLQkJCQl9DQotCQkJCWNhc2UgJ1snOg0KLQkJCQl7DQotCQkJCQltTEJSQUNLKHRydWUpOw0KLQkJCQkJdGhlUmV0VG9rZW49X3JldHVyblRva2VuOw0KLQkJCQkJYnJlYWs7DQotCQkJCX0NCi0JCQkJY2FzZSAnXSc6DQotCQkJCXsNCi0JCQkJCW1SQlJBQ0sodHJ1ZSk7DQotCQkJCQl0aGVSZXRUb2tlbj1fcmV0dXJuVG9rZW47DQotCQkJCQlicmVhazsNCi0JCQkJfQ0KLQkJCQljYXNlICd7JzoNCi0JCQkJew0KLQkJCQkJbUxDVVJMWSh0cnVlKTsNCi0JCQkJCXRoZVJldFRva2VuPV9yZXR1cm5Ub2tlbjsNCi0JCQkJCWJyZWFrOw0KLQkJCQl9DQotCQkJCWNhc2UgJ30nOg0KLQkJCQl7DQotCQkJCQltUkNVUkxZKHRydWUpOw0KLQkJCQkJdGhlUmV0VG9rZW49X3JldHVyblRva2VuOw0KLQkJCQkJYnJlYWs7DQotCQkJCX0NCi0JCQkJY2FzZSAnfCc6DQotCQkJCXsNCi0JCQkJCW1PUih0cnVlKTsNCi0JCQkJCXRoZVJldFRva2VuPV9yZXR1cm5Ub2tlbjsNCi0JCQkJCWJyZWFrOw0KLQkJCQl9DQotCQkJCWNhc2UgJ14nOg0KLQkJCQl7DQotCQkJCQltWE9SKHRydWUpOw0KLQkJCQkJdGhlUmV0VG9rZW49X3JldHVyblRva2VuOw0KLQkJCQkJYnJlYWs7DQotCQkJCX0NCi0JCQkJY2FzZSAnJic6DQotCQkJCXsNCi0JCQkJCW1BTkQodHJ1ZSk7DQotCQkJCQl0aGVSZXRUb2tlbj1fcmV0dXJuVG9rZW47DQotCQkJCQlicmVhazsNCi0JCQkJfQ0KLQkJCQljYXNlICcsJzoNCi0JCQkJew0KLQkJCQkJbUNPTU1BKHRydWUpOw0KLQkJCQkJdGhlUmV0VG9rZW49X3JldHVyblRva2VuOw0KLQkJCQkJYnJlYWs7DQotCQkJCX0NCi0JCQkJY2FzZSAnPSc6DQotCQkJCXsNCi0JCQkJCW1BU1NJR04odHJ1ZSk7DQotCQkJCQl0aGVSZXRUb2tlbj1fcmV0dXJuVG9rZW47DQotCQkJCQlicmVhazsNCi0JCQkJfQ0KLQkJCQljYXNlICchJzoNCi0JCQkJew0KLQkJCQkJbU5PVCh0cnVlKTsNCi0JCQkJCXRoZVJldFRva2VuPV9yZXR1cm5Ub2tlbjsNCi0JCQkJCWJyZWFrOw0KLQkJCQl9DQotCQkJCWNhc2UgJysnOg0KLQkJCQl7DQotCQkJCQltUExVUyh0cnVlKTsNCi0JCQkJCXRoZVJldFRva2VuPV9yZXR1cm5Ub2tlbjsNCi0JCQkJCWJyZWFrOw0KLQkJCQl9DQotCQkJCWNhc2UgJy0nOg0KLQkJCQl7DQotCQkJCQltTUlOVVModHJ1ZSk7DQotCQkJCQl0aGVSZXRUb2tlbj1fcmV0dXJuVG9rZW47DQotCQkJCQlicmVhazsNCi0JCQkJfQ0KLQkJCQljYXNlICd+JzoNCi0JCQkJew0KLQkJCQkJbVRJTERFKHRydWUpOw0KLQkJCQkJdGhlUmV0VG9rZW49X3JldHVyblRva2VuOw0KLQkJCQkJYnJlYWs7DQotCQkJCX0NCi0JCQkJY2FzZSAnKic6DQotCQkJCXsNCi0JCQkJCW1TVEFSKHRydWUpOw0KLQkJCQkJdGhlUmV0VG9rZW49X3JldHVyblRva2VuOw0KLQkJCQkJYnJlYWs7DQotCQkJCX0NCi0JCQkJY2FzZSAnJSc6DQotCQkJCXsNCi0JCQkJCW1NT0QodHJ1ZSk7DQotCQkJCQl0aGVSZXRUb2tlbj1fcmV0dXJuVG9rZW47DQotCQkJCQlicmVhazsNCi0JCQkJfQ0KLQkJCQljYXNlICdcdCc6ICBjYXNlICdcbic6ICBjYXNlICdccic6ICBjYXNlICcgJzoNCi0JCQkJew0KLQkJCQkJbVdTKHRydWUpOw0KLQkJCQkJdGhlUmV0VG9rZW49X3JldHVyblRva2VuOw0KLQkJCQkJYnJlYWs7DQotCQkJCX0NCi0JCQkJY2FzZSAnIyc6DQotCQkJCXsNCi0JCQkJCW1QUkVQUk9DX0RJUkVDVElWRSh0cnVlKTsNCi0JCQkJCXRoZVJldFRva2VuPV9yZXR1cm5Ub2tlbjsNCi0JCQkJCWJyZWFrOw0KLQkJCQl9DQotCQkJCWNhc2UgJ1wnJzoNCi0JCQkJew0KLQkJCQkJbUNIQVJfTElURVJBTCh0cnVlKTsNCi0JCQkJCXRoZVJldFRva2VuPV9yZXR1cm5Ub2tlbjsNCi0JCQkJCWJyZWFrOw0KLQkJCQl9DQotCQkJCWNhc2UgJyInOg0KLQkJCQl7DQotCQkJCQltU1RSSU5HX0xJVEVSQUwodHJ1ZSk7DQotCQkJCQl0aGVSZXRUb2tlbj1fcmV0dXJuVG9rZW47DQotCQkJCQlicmVhazsNCi0JCQkJfQ0KLQkJCQljYXNlICcxJzogIGNhc2UgJzInOiAgY2FzZSAnMyc6ICBjYXNlICc0JzoNCi0JCQkJY2FzZSAnNSc6ICBjYXNlICc2JzogIGNhc2UgJzcnOiAgY2FzZSAnOCc6DQotCQkJCWNhc2UgJzknOg0KLQkJCQl7DQotCQkJCQltSU5UKHRydWUpOw0KLQkJCQkJdGhlUmV0VG9rZW49X3JldHVyblRva2VuOw0KLQkJCQkJYnJlYWs7DQotCQkJCX0NCi0JCQkJY2FzZSAnXyc6DQotCQkJCXsNCi0JCQkJCW1FU0NBUEVEX0lERU5UKHRydWUpOw0KLQkJCQkJdGhlUmV0VG9rZW49X3JldHVyblRva2VuOw0KLQkJCQkJYnJlYWs7DQotCQkJCX0NCi0JCQkJZGVmYXVsdDoNCi0JCQkJCWlmICgoTEEoMSk9PSc8JykgJiYgKExBKDIpPT0nPCcpKSB7DQotCQkJCQkJbUxTSElGVCh0cnVlKTsNCi0JCQkJCQl0aGVSZXRUb2tlbj1fcmV0dXJuVG9rZW47DQotCQkJCQl9DQotCQkJCQllbHNlIGlmICgoTEEoMSk9PSc+JykgJiYgKExBKDIpPT0nPicpKSB7DQotCQkJCQkJbVJTSElGVCh0cnVlKTsNCi0JCQkJCQl0aGVSZXRUb2tlbj1fcmV0dXJuVG9rZW47DQotCQkJCQl9DQotCQkJCQllbHNlIGlmICgoTEEoMSk9PSc6JykgJiYgKExBKDIpPT0nOicpKSB7DQotCQkJCQkJbVNDT1BFT1AodHJ1ZSk7DQotCQkJCQkJdGhlUmV0VG9rZW49X3JldHVyblRva2VuOw0KLQkJCQkJfQ0KLQkJCQkJZWxzZSBpZiAoKExBKDEpPT0nLycpICYmIChMQSgyKT09Jy8nKSkgew0KLQkJCQkJCW1TTF9DT01NRU5UKHRydWUpOw0KLQkJCQkJCXRoZVJldFRva2VuPV9yZXR1cm5Ub2tlbjsNCi0JCQkJCX0NCi0JCQkJCWVsc2UgaWYgKChMQSgxKT09Jy8nKSAmJiAoTEEoMik9PScqJykpIHsNCi0JCQkJCQltTUxfQ09NTUVOVCh0cnVlKTsNCi0JCQkJCQl0aGVSZXRUb2tlbj1fcmV0dXJuVG9rZW47DQotCQkJCQl9DQotCQkJCQllbHNlIGlmICgoTEEoMSk9PSdMJykgJiYgKExBKDIpPT0nXCcnKSkgew0KLQkJCQkJCW1XSURFX0NIQVJfTElURVJBTCh0cnVlKTsNCi0JCQkJCQl0aGVSZXRUb2tlbj1fcmV0dXJuVG9rZW47DQotCQkJCQl9DQotCQkJCQllbHNlIGlmICgoTEEoMSk9PSdMJykgJiYgKExBKDIpPT0nIicpKSB7DQotCQkJCQkJbVdJREVfU1RSSU5HX0xJVEVSQUwodHJ1ZSk7DQotCQkJCQkJdGhlUmV0VG9rZW49X3JldHVyblRva2VuOw0KLQkJCQkJfQ0KLQkJCQkJZWxzZSBpZiAoKExBKDEpPT0nMCcpICYmIChMQSgyKT09J1gnfHxMQSgyKT09J3gnKSkgew0KLQkJCQkJCW1IRVgodHJ1ZSk7DQotCQkJCQkJdGhlUmV0VG9rZW49X3JldHVyblRva2VuOw0KLQkJCQkJfQ0KLQkJCQkJZWxzZSBpZiAoKExBKDEpPT0nLicpICYmICgoTEEoMikgPj0gJzAnICYmIExBKDIpIDw9ICc5JykpKSB7DQotCQkJCQkJbUZMT0FUKHRydWUpOw0KLQkJCQkJCXRoZVJldFRva2VuPV9yZXR1cm5Ub2tlbjsNCi0JCQkJCX0NCi0JCQkJCWVsc2UgaWYgKChMQSgxKT09JzonKSAmJiAodHJ1ZSkpIHsNCi0JCQkJCQltQ09MT04odHJ1ZSk7DQotCQkJCQkJdGhlUmV0VG9rZW49X3JldHVyblRva2VuOw0KLQkJCQkJfQ0KLQkJCQkJZWxzZSBpZiAoKExBKDEpPT0nLicpICYmICh0cnVlKSkgew0KLQkJCQkJCW1ET1QodHJ1ZSk7DQotCQkJCQkJdGhlUmV0VG9rZW49X3JldHVyblRva2VuOw0KLQkJCQkJfQ0KLQkJCQkJZWxzZSBpZiAoKExBKDEpPT0nPCcpICYmICh0cnVlKSkgew0KLQkJCQkJCW1MVCh0cnVlKTsNCi0JCQkJCQl0aGVSZXRUb2tlbj1fcmV0dXJuVG9rZW47DQotCQkJCQl9DQotCQkJCQllbHNlIGlmICgoTEEoMSk9PSc+JykgJiYgKHRydWUpKSB7DQotCQkJCQkJbUdUKHRydWUpOw0KLQkJCQkJCXRoZVJldFRva2VuPV9yZXR1cm5Ub2tlbjsNCi0JCQkJCX0NCi0JCQkJCWVsc2UgaWYgKChMQSgxKT09Jy8nKSAmJiAodHJ1ZSkpIHsNCi0JCQkJCQltRElWKHRydWUpOw0KLQkJCQkJCXRoZVJldFRva2VuPV9yZXR1cm5Ub2tlbjsNCi0JCQkJCX0NCi0JCQkJCWVsc2UgaWYgKChMQSgxKT09JzAnKSAmJiAodHJ1ZSkpIHsNCi0JCQkJCQltT0NUQUwodHJ1ZSk7DQotCQkJCQkJdGhlUmV0VG9rZW49X3JldHVyblRva2VuOw0KLQkJCQkJfQ0KLQkJCQkJZWxzZSBpZiAoKF90b2tlblNldF8wLm1lbWJlcihMQSgxKSkpICYmICh0cnVlKSkgew0KLQkJCQkJCW1JREVOVCh0cnVlKTsNCi0JCQkJCQl0aGVSZXRUb2tlbj1fcmV0dXJuVG9rZW47DQotCQkJCQl9DQotCQkJCWVsc2Ugew0KLQkJCQkJaWYgKExBKDEpPT1FT0ZfQ0hBUikge3Vwb25FT0YoKTsgX3JldHVyblRva2VuID0gbWFrZVRva2VuKFRva2VuLkVPRl9UWVBFKTt9DQotCQkJCWVsc2Uge3Rocm93IG5ldyBOb1ZpYWJsZUFsdEZvckNoYXJFeGNlcHRpb24oKGNoYXIpTEEoMSksIGdldEZpbGVuYW1lKCksIGdldExpbmUoKSwgZ2V0Q29sdW1uKCkpO30NCi0JCQkJfQ0KLQkJCQl9DQotCQkJCWlmICggX3JldHVyblRva2VuPT1udWxsICkgY29udGludWUgdHJ5QWdhaW47IC8vIGZvdW5kIFNLSVAgdG9rZW4NCi0JCQkJX3R0eXBlID0gX3JldHVyblRva2VuLmdldFR5cGUoKTsNCi0JCQkJX3R0eXBlID0gdGVzdExpdGVyYWxzVGFibGUoX3R0eXBlKTsNCi0JCQkJX3JldHVyblRva2VuLnNldFR5cGUoX3R0eXBlKTsNCi0JCQkJcmV0dXJuIF9yZXR1cm5Ub2tlbjsNCi0JCQl9DQotCQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGUpIHsNCi0JCQkJdGhyb3cgbmV3IFRva2VuU3RyZWFtUmVjb2duaXRpb25FeGNlcHRpb24oZSk7DQotCQkJfQ0KLQkJfQ0KLQkJY2F0Y2ggKENoYXJTdHJlYW1FeGNlcHRpb24gY3NlKSB7DQotCQkJaWYgKCBjc2UgaW5zdGFuY2VvZiBDaGFyU3RyZWFtSU9FeGNlcHRpb24gKSB7DQotCQkJCXRocm93IG5ldyBUb2tlblN0cmVhbUlPRXhjZXB0aW9uKCgoQ2hhclN0cmVhbUlPRXhjZXB0aW9uKWNzZSkuaW8pOw0KLQkJCX0NCi0JCQllbHNlIHsNCi0JCQkJdGhyb3cgbmV3IFRva2VuU3RyZWFtRXhjZXB0aW9uKGNzZS5nZXRNZXNzYWdlKCkpOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLX0NCi0NCi0JcHVibGljIGZpbmFsIHZvaWQgbVNFTUkoYm9vbGVhbiBfY3JlYXRlVG9rZW4pIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgQ2hhclN0cmVhbUV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJaW50IF90dHlwZTsgVG9rZW4gX3Rva2VuPW51bGw7IGludCBfYmVnaW49dGV4dC5sZW5ndGgoKTsNCi0JCV90dHlwZSA9IFNFTUk7DQotCQlpbnQgX3NhdmVJbmRleDsNCi0JCQ0KLQkJbWF0Y2goJzsnKTsNCi0JCWlmICggX2NyZWF0ZVRva2VuICYmIF90b2tlbj09bnVsbCAmJiBfdHR5cGUhPVRva2VuLlNLSVAgKSB7DQotCQkJX3Rva2VuID0gbWFrZVRva2VuKF90dHlwZSk7DQotCQkJX3Rva2VuLnNldFRleHQobmV3IFN0cmluZyh0ZXh0LmdldEJ1ZmZlcigpLCBfYmVnaW4sIHRleHQubGVuZ3RoKCktX2JlZ2luKSk7DQotCQl9DQotCQlfcmV0dXJuVG9rZW4gPSBfdG9rZW47DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIG1RVUVTVElPTihib29sZWFuIF9jcmVhdGVUb2tlbikgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBDaGFyU3RyZWFtRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQlpbnQgX3R0eXBlOyBUb2tlbiBfdG9rZW49bnVsbDsgaW50IF9iZWdpbj10ZXh0Lmxlbmd0aCgpOw0KLQkJX3R0eXBlID0gUVVFU1RJT047DQotCQlpbnQgX3NhdmVJbmRleDsNCi0JCQ0KLQkJbWF0Y2goJz8nKTsNCi0JCWlmICggX2NyZWF0ZVRva2VuICYmIF90b2tlbj09bnVsbCAmJiBfdHR5cGUhPVRva2VuLlNLSVAgKSB7DQotCQkJX3Rva2VuID0gbWFrZVRva2VuKF90dHlwZSk7DQotCQkJX3Rva2VuLnNldFRleHQobmV3IFN0cmluZyh0ZXh0LmdldEJ1ZmZlcigpLCBfYmVnaW4sIHRleHQubGVuZ3RoKCktX2JlZ2luKSk7DQotCQl9DQotCQlfcmV0dXJuVG9rZW4gPSBfdG9rZW47DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIG1MUEFSRU4oYm9vbGVhbiBfY3JlYXRlVG9rZW4pIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgQ2hhclN0cmVhbUV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJaW50IF90dHlwZTsgVG9rZW4gX3Rva2VuPW51bGw7IGludCBfYmVnaW49dGV4dC5sZW5ndGgoKTsNCi0JCV90dHlwZSA9IExQQVJFTjsNCi0JCWludCBfc2F2ZUluZGV4Ow0KLQkJDQotCQltYXRjaCgnKCcpOw0KLQkJaWYgKCBfY3JlYXRlVG9rZW4gJiYgX3Rva2VuPT1udWxsICYmIF90dHlwZSE9VG9rZW4uU0tJUCApIHsNCi0JCQlfdG9rZW4gPSBtYWtlVG9rZW4oX3R0eXBlKTsNCi0JCQlfdG9rZW4uc2V0VGV4dChuZXcgU3RyaW5nKHRleHQuZ2V0QnVmZmVyKCksIF9iZWdpbiwgdGV4dC5sZW5ndGgoKS1fYmVnaW4pKTsNCi0JCX0NCi0JCV9yZXR1cm5Ub2tlbiA9IF90b2tlbjsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgbVJQQVJFTihib29sZWFuIF9jcmVhdGVUb2tlbikgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBDaGFyU3RyZWFtRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQlpbnQgX3R0eXBlOyBUb2tlbiBfdG9rZW49bnVsbDsgaW50IF9iZWdpbj10ZXh0Lmxlbmd0aCgpOw0KLQkJX3R0eXBlID0gUlBBUkVOOw0KLQkJaW50IF9zYXZlSW5kZXg7DQotCQkNCi0JCW1hdGNoKCcpJyk7DQotCQlpZiAoIF9jcmVhdGVUb2tlbiAmJiBfdG9rZW49PW51bGwgJiYgX3R0eXBlIT1Ub2tlbi5TS0lQICkgew0KLQkJCV90b2tlbiA9IG1ha2VUb2tlbihfdHR5cGUpOw0KLQkJCV90b2tlbi5zZXRUZXh0KG5ldyBTdHJpbmcodGV4dC5nZXRCdWZmZXIoKSwgX2JlZ2luLCB0ZXh0Lmxlbmd0aCgpLV9iZWdpbikpOw0KLQkJfQ0KLQkJX3JldHVyblRva2VuID0gX3Rva2VuOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBtTEJSQUNLKGJvb2xlYW4gX2NyZWF0ZVRva2VuKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIENoYXJTdHJlYW1FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCWludCBfdHR5cGU7IFRva2VuIF90b2tlbj1udWxsOyBpbnQgX2JlZ2luPXRleHQubGVuZ3RoKCk7DQotCQlfdHR5cGUgPSBMQlJBQ0s7DQotCQlpbnQgX3NhdmVJbmRleDsNCi0JCQ0KLQkJbWF0Y2goJ1snKTsNCi0JCWlmICggX2NyZWF0ZVRva2VuICYmIF90b2tlbj09bnVsbCAmJiBfdHR5cGUhPVRva2VuLlNLSVAgKSB7DQotCQkJX3Rva2VuID0gbWFrZVRva2VuKF90dHlwZSk7DQotCQkJX3Rva2VuLnNldFRleHQobmV3IFN0cmluZyh0ZXh0LmdldEJ1ZmZlcigpLCBfYmVnaW4sIHRleHQubGVuZ3RoKCktX2JlZ2luKSk7DQotCQl9DQotCQlfcmV0dXJuVG9rZW4gPSBfdG9rZW47DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIG1SQlJBQ0soYm9vbGVhbiBfY3JlYXRlVG9rZW4pIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgQ2hhclN0cmVhbUV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJaW50IF90dHlwZTsgVG9rZW4gX3Rva2VuPW51bGw7IGludCBfYmVnaW49dGV4dC5sZW5ndGgoKTsNCi0JCV90dHlwZSA9IFJCUkFDSzsNCi0JCWludCBfc2F2ZUluZGV4Ow0KLQkJDQotCQltYXRjaCgnXScpOw0KLQkJaWYgKCBfY3JlYXRlVG9rZW4gJiYgX3Rva2VuPT1udWxsICYmIF90dHlwZSE9VG9rZW4uU0tJUCApIHsNCi0JCQlfdG9rZW4gPSBtYWtlVG9rZW4oX3R0eXBlKTsNCi0JCQlfdG9rZW4uc2V0VGV4dChuZXcgU3RyaW5nKHRleHQuZ2V0QnVmZmVyKCksIF9iZWdpbiwgdGV4dC5sZW5ndGgoKS1fYmVnaW4pKTsNCi0JCX0NCi0JCV9yZXR1cm5Ub2tlbiA9IF90b2tlbjsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgbUxDVVJMWShib29sZWFuIF9jcmVhdGVUb2tlbikgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBDaGFyU3RyZWFtRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQlpbnQgX3R0eXBlOyBUb2tlbiBfdG9rZW49bnVsbDsgaW50IF9iZWdpbj10ZXh0Lmxlbmd0aCgpOw0KLQkJX3R0eXBlID0gTENVUkxZOw0KLQkJaW50IF9zYXZlSW5kZXg7DQotCQkNCi0JCW1hdGNoKCd7Jyk7DQotCQlpZiAoIF9jcmVhdGVUb2tlbiAmJiBfdG9rZW49PW51bGwgJiYgX3R0eXBlIT1Ub2tlbi5TS0lQICkgew0KLQkJCV90b2tlbiA9IG1ha2VUb2tlbihfdHR5cGUpOw0KLQkJCV90b2tlbi5zZXRUZXh0KG5ldyBTdHJpbmcodGV4dC5nZXRCdWZmZXIoKSwgX2JlZ2luLCB0ZXh0Lmxlbmd0aCgpLV9iZWdpbikpOw0KLQkJfQ0KLQkJX3JldHVyblRva2VuID0gX3Rva2VuOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBtUkNVUkxZKGJvb2xlYW4gX2NyZWF0ZVRva2VuKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIENoYXJTdHJlYW1FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCWludCBfdHR5cGU7IFRva2VuIF90b2tlbj1udWxsOyBpbnQgX2JlZ2luPXRleHQubGVuZ3RoKCk7DQotCQlfdHR5cGUgPSBSQ1VSTFk7DQotCQlpbnQgX3NhdmVJbmRleDsNCi0JCQ0KLQkJbWF0Y2goJ30nKTsNCi0JCWlmICggX2NyZWF0ZVRva2VuICYmIF90b2tlbj09bnVsbCAmJiBfdHR5cGUhPVRva2VuLlNLSVAgKSB7DQotCQkJX3Rva2VuID0gbWFrZVRva2VuKF90dHlwZSk7DQotCQkJX3Rva2VuLnNldFRleHQobmV3IFN0cmluZyh0ZXh0LmdldEJ1ZmZlcigpLCBfYmVnaW4sIHRleHQubGVuZ3RoKCktX2JlZ2luKSk7DQotCQl9DQotCQlfcmV0dXJuVG9rZW4gPSBfdG9rZW47DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIG1PUihib29sZWFuIF9jcmVhdGVUb2tlbikgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBDaGFyU3RyZWFtRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQlpbnQgX3R0eXBlOyBUb2tlbiBfdG9rZW49bnVsbDsgaW50IF9iZWdpbj10ZXh0Lmxlbmd0aCgpOw0KLQkJX3R0eXBlID0gT1I7DQotCQlpbnQgX3NhdmVJbmRleDsNCi0JCQ0KLQkJbWF0Y2goJ3wnKTsNCi0JCWlmICggX2NyZWF0ZVRva2VuICYmIF90b2tlbj09bnVsbCAmJiBfdHR5cGUhPVRva2VuLlNLSVAgKSB7DQotCQkJX3Rva2VuID0gbWFrZVRva2VuKF90dHlwZSk7DQotCQkJX3Rva2VuLnNldFRleHQobmV3IFN0cmluZyh0ZXh0LmdldEJ1ZmZlcigpLCBfYmVnaW4sIHRleHQubGVuZ3RoKCktX2JlZ2luKSk7DQotCQl9DQotCQlfcmV0dXJuVG9rZW4gPSBfdG9rZW47DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIG1YT1IoYm9vbGVhbiBfY3JlYXRlVG9rZW4pIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgQ2hhclN0cmVhbUV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJaW50IF90dHlwZTsgVG9rZW4gX3Rva2VuPW51bGw7IGludCBfYmVnaW49dGV4dC5sZW5ndGgoKTsNCi0JCV90dHlwZSA9IFhPUjsNCi0JCWludCBfc2F2ZUluZGV4Ow0KLQkJDQotCQltYXRjaCgnXicpOw0KLQkJaWYgKCBfY3JlYXRlVG9rZW4gJiYgX3Rva2VuPT1udWxsICYmIF90dHlwZSE9VG9rZW4uU0tJUCApIHsNCi0JCQlfdG9rZW4gPSBtYWtlVG9rZW4oX3R0eXBlKTsNCi0JCQlfdG9rZW4uc2V0VGV4dChuZXcgU3RyaW5nKHRleHQuZ2V0QnVmZmVyKCksIF9iZWdpbiwgdGV4dC5sZW5ndGgoKS1fYmVnaW4pKTsNCi0JCX0NCi0JCV9yZXR1cm5Ub2tlbiA9IF90b2tlbjsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgbUFORChib29sZWFuIF9jcmVhdGVUb2tlbikgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBDaGFyU3RyZWFtRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQlpbnQgX3R0eXBlOyBUb2tlbiBfdG9rZW49bnVsbDsgaW50IF9iZWdpbj10ZXh0Lmxlbmd0aCgpOw0KLQkJX3R0eXBlID0gQU5EOw0KLQkJaW50IF9zYXZlSW5kZXg7DQotCQkNCi0JCW1hdGNoKCcmJyk7DQotCQlpZiAoIF9jcmVhdGVUb2tlbiAmJiBfdG9rZW49PW51bGwgJiYgX3R0eXBlIT1Ub2tlbi5TS0lQICkgew0KLQkJCV90b2tlbiA9IG1ha2VUb2tlbihfdHR5cGUpOw0KLQkJCV90b2tlbi5zZXRUZXh0KG5ldyBTdHJpbmcodGV4dC5nZXRCdWZmZXIoKSwgX2JlZ2luLCB0ZXh0Lmxlbmd0aCgpLV9iZWdpbikpOw0KLQkJfQ0KLQkJX3JldHVyblRva2VuID0gX3Rva2VuOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBtQ09MT04oYm9vbGVhbiBfY3JlYXRlVG9rZW4pIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgQ2hhclN0cmVhbUV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJaW50IF90dHlwZTsgVG9rZW4gX3Rva2VuPW51bGw7IGludCBfYmVnaW49dGV4dC5sZW5ndGgoKTsNCi0JCV90dHlwZSA9IENPTE9OOw0KLQkJaW50IF9zYXZlSW5kZXg7DQotCQkNCi0JCW1hdGNoKCc6Jyk7DQotCQlpZiAoIF9jcmVhdGVUb2tlbiAmJiBfdG9rZW49PW51bGwgJiYgX3R0eXBlIT1Ub2tlbi5TS0lQICkgew0KLQkJCV90b2tlbiA9IG1ha2VUb2tlbihfdHR5cGUpOw0KLQkJCV90b2tlbi5zZXRUZXh0KG5ldyBTdHJpbmcodGV4dC5nZXRCdWZmZXIoKSwgX2JlZ2luLCB0ZXh0Lmxlbmd0aCgpLV9iZWdpbikpOw0KLQkJfQ0KLQkJX3JldHVyblRva2VuID0gX3Rva2VuOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBtQ09NTUEoYm9vbGVhbiBfY3JlYXRlVG9rZW4pIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgQ2hhclN0cmVhbUV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJaW50IF90dHlwZTsgVG9rZW4gX3Rva2VuPW51bGw7IGludCBfYmVnaW49dGV4dC5sZW5ndGgoKTsNCi0JCV90dHlwZSA9IENPTU1BOw0KLQkJaW50IF9zYXZlSW5kZXg7DQotCQkNCi0JCW1hdGNoKCcsJyk7DQotCQlpZiAoIF9jcmVhdGVUb2tlbiAmJiBfdG9rZW49PW51bGwgJiYgX3R0eXBlIT1Ub2tlbi5TS0lQICkgew0KLQkJCV90b2tlbiA9IG1ha2VUb2tlbihfdHR5cGUpOw0KLQkJCV90b2tlbi5zZXRUZXh0KG5ldyBTdHJpbmcodGV4dC5nZXRCdWZmZXIoKSwgX2JlZ2luLCB0ZXh0Lmxlbmd0aCgpLV9iZWdpbikpOw0KLQkJfQ0KLQkJX3JldHVyblRva2VuID0gX3Rva2VuOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBtRE9UKGJvb2xlYW4gX2NyZWF0ZVRva2VuKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIENoYXJTdHJlYW1FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCWludCBfdHR5cGU7IFRva2VuIF90b2tlbj1udWxsOyBpbnQgX2JlZ2luPXRleHQubGVuZ3RoKCk7DQotCQlfdHR5cGUgPSBET1Q7DQotCQlpbnQgX3NhdmVJbmRleDsNCi0JCQ0KLQkJbWF0Y2goJy4nKTsNCi0JCWlmICggX2NyZWF0ZVRva2VuICYmIF90b2tlbj09bnVsbCAmJiBfdHR5cGUhPVRva2VuLlNLSVAgKSB7DQotCQkJX3Rva2VuID0gbWFrZVRva2VuKF90dHlwZSk7DQotCQkJX3Rva2VuLnNldFRleHQobmV3IFN0cmluZyh0ZXh0LmdldEJ1ZmZlcigpLCBfYmVnaW4sIHRleHQubGVuZ3RoKCktX2JlZ2luKSk7DQotCQl9DQotCQlfcmV0dXJuVG9rZW4gPSBfdG9rZW47DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIG1BU1NJR04oYm9vbGVhbiBfY3JlYXRlVG9rZW4pIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgQ2hhclN0cmVhbUV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJaW50IF90dHlwZTsgVG9rZW4gX3Rva2VuPW51bGw7IGludCBfYmVnaW49dGV4dC5sZW5ndGgoKTsNCi0JCV90dHlwZSA9IEFTU0lHTjsNCi0JCWludCBfc2F2ZUluZGV4Ow0KLQkJDQotCQltYXRjaCgnPScpOw0KLQkJaWYgKCBfY3JlYXRlVG9rZW4gJiYgX3Rva2VuPT1udWxsICYmIF90dHlwZSE9VG9rZW4uU0tJUCApIHsNCi0JCQlfdG9rZW4gPSBtYWtlVG9rZW4oX3R0eXBlKTsNCi0JCQlfdG9rZW4uc2V0VGV4dChuZXcgU3RyaW5nKHRleHQuZ2V0QnVmZmVyKCksIF9iZWdpbiwgdGV4dC5sZW5ndGgoKS1fYmVnaW4pKTsNCi0JCX0NCi0JCV9yZXR1cm5Ub2tlbiA9IF90b2tlbjsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgbU5PVChib29sZWFuIF9jcmVhdGVUb2tlbikgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBDaGFyU3RyZWFtRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQlpbnQgX3R0eXBlOyBUb2tlbiBfdG9rZW49bnVsbDsgaW50IF9iZWdpbj10ZXh0Lmxlbmd0aCgpOw0KLQkJX3R0eXBlID0gTk9UOw0KLQkJaW50IF9zYXZlSW5kZXg7DQotCQkNCi0JCW1hdGNoKCchJyk7DQotCQlpZiAoIF9jcmVhdGVUb2tlbiAmJiBfdG9rZW49PW51bGwgJiYgX3R0eXBlIT1Ub2tlbi5TS0lQICkgew0KLQkJCV90b2tlbiA9IG1ha2VUb2tlbihfdHR5cGUpOw0KLQkJCV90b2tlbi5zZXRUZXh0KG5ldyBTdHJpbmcodGV4dC5nZXRCdWZmZXIoKSwgX2JlZ2luLCB0ZXh0Lmxlbmd0aCgpLV9iZWdpbikpOw0KLQkJfQ0KLQkJX3JldHVyblRva2VuID0gX3Rva2VuOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBtTFQoYm9vbGVhbiBfY3JlYXRlVG9rZW4pIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgQ2hhclN0cmVhbUV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJaW50IF90dHlwZTsgVG9rZW4gX3Rva2VuPW51bGw7IGludCBfYmVnaW49dGV4dC5sZW5ndGgoKTsNCi0JCV90dHlwZSA9IExUOw0KLQkJaW50IF9zYXZlSW5kZXg7DQotCQkNCi0JCW1hdGNoKCc8Jyk7DQotCQlpZiAoIF9jcmVhdGVUb2tlbiAmJiBfdG9rZW49PW51bGwgJiYgX3R0eXBlIT1Ub2tlbi5TS0lQICkgew0KLQkJCV90b2tlbiA9IG1ha2VUb2tlbihfdHR5cGUpOw0KLQkJCV90b2tlbi5zZXRUZXh0KG5ldyBTdHJpbmcodGV4dC5nZXRCdWZmZXIoKSwgX2JlZ2luLCB0ZXh0Lmxlbmd0aCgpLV9iZWdpbikpOw0KLQkJfQ0KLQkJX3JldHVyblRva2VuID0gX3Rva2VuOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBtTFNISUZUKGJvb2xlYW4gX2NyZWF0ZVRva2VuKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIENoYXJTdHJlYW1FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCWludCBfdHR5cGU7IFRva2VuIF90b2tlbj1udWxsOyBpbnQgX2JlZ2luPXRleHQubGVuZ3RoKCk7DQotCQlfdHR5cGUgPSBMU0hJRlQ7DQotCQlpbnQgX3NhdmVJbmRleDsNCi0JCQ0KLQkJbWF0Y2goIjw8Iik7DQotCQlpZiAoIF9jcmVhdGVUb2tlbiAmJiBfdG9rZW49PW51bGwgJiYgX3R0eXBlIT1Ub2tlbi5TS0lQICkgew0KLQkJCV90b2tlbiA9IG1ha2VUb2tlbihfdHR5cGUpOw0KLQkJCV90b2tlbi5zZXRUZXh0KG5ldyBTdHJpbmcodGV4dC5nZXRCdWZmZXIoKSwgX2JlZ2luLCB0ZXh0Lmxlbmd0aCgpLV9iZWdpbikpOw0KLQkJfQ0KLQkJX3JldHVyblRva2VuID0gX3Rva2VuOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBtR1QoYm9vbGVhbiBfY3JlYXRlVG9rZW4pIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgQ2hhclN0cmVhbUV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJaW50IF90dHlwZTsgVG9rZW4gX3Rva2VuPW51bGw7IGludCBfYmVnaW49dGV4dC5sZW5ndGgoKTsNCi0JCV90dHlwZSA9IEdUOw0KLQkJaW50IF9zYXZlSW5kZXg7DQotCQkNCi0JCW1hdGNoKCc+Jyk7DQotCQlpZiAoIF9jcmVhdGVUb2tlbiAmJiBfdG9rZW49PW51bGwgJiYgX3R0eXBlIT1Ub2tlbi5TS0lQICkgew0KLQkJCV90b2tlbiA9IG1ha2VUb2tlbihfdHR5cGUpOw0KLQkJCV90b2tlbi5zZXRUZXh0KG5ldyBTdHJpbmcodGV4dC5nZXRCdWZmZXIoKSwgX2JlZ2luLCB0ZXh0Lmxlbmd0aCgpLV9iZWdpbikpOw0KLQkJfQ0KLQkJX3JldHVyblRva2VuID0gX3Rva2VuOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBtUlNISUZUKGJvb2xlYW4gX2NyZWF0ZVRva2VuKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIENoYXJTdHJlYW1FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCWludCBfdHR5cGU7IFRva2VuIF90b2tlbj1udWxsOyBpbnQgX2JlZ2luPXRleHQubGVuZ3RoKCk7DQotCQlfdHR5cGUgPSBSU0hJRlQ7DQotCQlpbnQgX3NhdmVJbmRleDsNCi0JCQ0KLQkJbWF0Y2goIj4+Iik7DQotCQlpZiAoIF9jcmVhdGVUb2tlbiAmJiBfdG9rZW49PW51bGwgJiYgX3R0eXBlIT1Ub2tlbi5TS0lQICkgew0KLQkJCV90b2tlbiA9IG1ha2VUb2tlbihfdHR5cGUpOw0KLQkJCV90b2tlbi5zZXRUZXh0KG5ldyBTdHJpbmcodGV4dC5nZXRCdWZmZXIoKSwgX2JlZ2luLCB0ZXh0Lmxlbmd0aCgpLV9iZWdpbikpOw0KLQkJfQ0KLQkJX3JldHVyblRva2VuID0gX3Rva2VuOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBtRElWKGJvb2xlYW4gX2NyZWF0ZVRva2VuKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIENoYXJTdHJlYW1FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCWludCBfdHR5cGU7IFRva2VuIF90b2tlbj1udWxsOyBpbnQgX2JlZ2luPXRleHQubGVuZ3RoKCk7DQotCQlfdHR5cGUgPSBESVY7DQotCQlpbnQgX3NhdmVJbmRleDsNCi0JCQ0KLQkJbWF0Y2goJy8nKTsNCi0JCWlmICggX2NyZWF0ZVRva2VuICYmIF90b2tlbj09bnVsbCAmJiBfdHR5cGUhPVRva2VuLlNLSVAgKSB7DQotCQkJX3Rva2VuID0gbWFrZVRva2VuKF90dHlwZSk7DQotCQkJX3Rva2VuLnNldFRleHQobmV3IFN0cmluZyh0ZXh0LmdldEJ1ZmZlcigpLCBfYmVnaW4sIHRleHQubGVuZ3RoKCktX2JlZ2luKSk7DQotCQl9DQotCQlfcmV0dXJuVG9rZW4gPSBfdG9rZW47DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIG1QTFVTKGJvb2xlYW4gX2NyZWF0ZVRva2VuKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIENoYXJTdHJlYW1FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCWludCBfdHR5cGU7IFRva2VuIF90b2tlbj1udWxsOyBpbnQgX2JlZ2luPXRleHQubGVuZ3RoKCk7DQotCQlfdHR5cGUgPSBQTFVTOw0KLQkJaW50IF9zYXZlSW5kZXg7DQotCQkNCi0JCW1hdGNoKCcrJyk7DQotCQlpZiAoIF9jcmVhdGVUb2tlbiAmJiBfdG9rZW49PW51bGwgJiYgX3R0eXBlIT1Ub2tlbi5TS0lQICkgew0KLQkJCV90b2tlbiA9IG1ha2VUb2tlbihfdHR5cGUpOw0KLQkJCV90b2tlbi5zZXRUZXh0KG5ldyBTdHJpbmcodGV4dC5nZXRCdWZmZXIoKSwgX2JlZ2luLCB0ZXh0Lmxlbmd0aCgpLV9iZWdpbikpOw0KLQkJfQ0KLQkJX3JldHVyblRva2VuID0gX3Rva2VuOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBtTUlOVVMoYm9vbGVhbiBfY3JlYXRlVG9rZW4pIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgQ2hhclN0cmVhbUV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJaW50IF90dHlwZTsgVG9rZW4gX3Rva2VuPW51bGw7IGludCBfYmVnaW49dGV4dC5sZW5ndGgoKTsNCi0JCV90dHlwZSA9IE1JTlVTOw0KLQkJaW50IF9zYXZlSW5kZXg7DQotCQkNCi0JCW1hdGNoKCctJyk7DQotCQlpZiAoIF9jcmVhdGVUb2tlbiAmJiBfdG9rZW49PW51bGwgJiYgX3R0eXBlIT1Ub2tlbi5TS0lQICkgew0KLQkJCV90b2tlbiA9IG1ha2VUb2tlbihfdHR5cGUpOw0KLQkJCV90b2tlbi5zZXRUZXh0KG5ldyBTdHJpbmcodGV4dC5nZXRCdWZmZXIoKSwgX2JlZ2luLCB0ZXh0Lmxlbmd0aCgpLV9iZWdpbikpOw0KLQkJfQ0KLQkJX3JldHVyblRva2VuID0gX3Rva2VuOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBtVElMREUoYm9vbGVhbiBfY3JlYXRlVG9rZW4pIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgQ2hhclN0cmVhbUV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJaW50IF90dHlwZTsgVG9rZW4gX3Rva2VuPW51bGw7IGludCBfYmVnaW49dGV4dC5sZW5ndGgoKTsNCi0JCV90dHlwZSA9IFRJTERFOw0KLQkJaW50IF9zYXZlSW5kZXg7DQotCQkNCi0JCW1hdGNoKCd+Jyk7DQotCQlpZiAoIF9jcmVhdGVUb2tlbiAmJiBfdG9rZW49PW51bGwgJiYgX3R0eXBlIT1Ub2tlbi5TS0lQICkgew0KLQkJCV90b2tlbiA9IG1ha2VUb2tlbihfdHR5cGUpOw0KLQkJCV90b2tlbi5zZXRUZXh0KG5ldyBTdHJpbmcodGV4dC5nZXRCdWZmZXIoKSwgX2JlZ2luLCB0ZXh0Lmxlbmd0aCgpLV9iZWdpbikpOw0KLQkJfQ0KLQkJX3JldHVyblRva2VuID0gX3Rva2VuOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBtU1RBUihib29sZWFuIF9jcmVhdGVUb2tlbikgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBDaGFyU3RyZWFtRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQlpbnQgX3R0eXBlOyBUb2tlbiBfdG9rZW49bnVsbDsgaW50IF9iZWdpbj10ZXh0Lmxlbmd0aCgpOw0KLQkJX3R0eXBlID0gU1RBUjsNCi0JCWludCBfc2F2ZUluZGV4Ow0KLQkJDQotCQltYXRjaCgnKicpOw0KLQkJaWYgKCBfY3JlYXRlVG9rZW4gJiYgX3Rva2VuPT1udWxsICYmIF90dHlwZSE9VG9rZW4uU0tJUCApIHsNCi0JCQlfdG9rZW4gPSBtYWtlVG9rZW4oX3R0eXBlKTsNCi0JCQlfdG9rZW4uc2V0VGV4dChuZXcgU3RyaW5nKHRleHQuZ2V0QnVmZmVyKCksIF9iZWdpbiwgdGV4dC5sZW5ndGgoKS1fYmVnaW4pKTsNCi0JCX0NCi0JCV9yZXR1cm5Ub2tlbiA9IF90b2tlbjsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgbU1PRChib29sZWFuIF9jcmVhdGVUb2tlbikgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBDaGFyU3RyZWFtRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQlpbnQgX3R0eXBlOyBUb2tlbiBfdG9rZW49bnVsbDsgaW50IF9iZWdpbj10ZXh0Lmxlbmd0aCgpOw0KLQkJX3R0eXBlID0gTU9EOw0KLQkJaW50IF9zYXZlSW5kZXg7DQotCQkNCi0JCW1hdGNoKCclJyk7DQotCQlpZiAoIF9jcmVhdGVUb2tlbiAmJiBfdG9rZW49PW51bGwgJiYgX3R0eXBlIT1Ub2tlbi5TS0lQICkgew0KLQkJCV90b2tlbiA9IG1ha2VUb2tlbihfdHR5cGUpOw0KLQkJCV90b2tlbi5zZXRUZXh0KG5ldyBTdHJpbmcodGV4dC5nZXRCdWZmZXIoKSwgX2JlZ2luLCB0ZXh0Lmxlbmd0aCgpLV9iZWdpbikpOw0KLQkJfQ0KLQkJX3JldHVyblRva2VuID0gX3Rva2VuOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBtU0NPUEVPUChib29sZWFuIF9jcmVhdGVUb2tlbikgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBDaGFyU3RyZWFtRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQlpbnQgX3R0eXBlOyBUb2tlbiBfdG9rZW49bnVsbDsgaW50IF9iZWdpbj10ZXh0Lmxlbmd0aCgpOw0KLQkJX3R0eXBlID0gU0NPUEVPUDsNCi0JCWludCBfc2F2ZUluZGV4Ow0KLQkJDQotCQltYXRjaCgiOjoiKTsNCi0JCWlmICggX2NyZWF0ZVRva2VuICYmIF90b2tlbj09bnVsbCAmJiBfdHR5cGUhPVRva2VuLlNLSVAgKSB7DQotCQkJX3Rva2VuID0gbWFrZVRva2VuKF90dHlwZSk7DQotCQkJX3Rva2VuLnNldFRleHQobmV3IFN0cmluZyh0ZXh0LmdldEJ1ZmZlcigpLCBfYmVnaW4sIHRleHQubGVuZ3RoKCktX2JlZ2luKSk7DQotCQl9DQotCQlfcmV0dXJuVG9rZW4gPSBfdG9rZW47DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIG1XUyhib29sZWFuIF9jcmVhdGVUb2tlbikgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBDaGFyU3RyZWFtRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQlpbnQgX3R0eXBlOyBUb2tlbiBfdG9rZW49bnVsbDsgaW50IF9iZWdpbj10ZXh0Lmxlbmd0aCgpOw0KLQkJX3R0eXBlID0gV1M7DQotCQlpbnQgX3NhdmVJbmRleDsNCi0JCQ0KLQkJew0KLQkJc3dpdGNoICggTEEoMSkpIHsNCi0JCWNhc2UgJyAnOg0KLQkJew0KLQkJCW1hdGNoKCcgJyk7DQotCQkJYnJlYWs7DQotCQl9DQotCQljYXNlICdcdCc6DQotCQl7DQotCQkJbWF0Y2goJ1x0Jyk7DQotCQkJYnJlYWs7DQotCQl9DQotCQljYXNlICdcbic6DQotCQl7DQotCQkJbWF0Y2goJ1xuJyk7DQotCQkJbmV3bGluZSgpOw0KLQkJCWJyZWFrOw0KLQkJfQ0KLQkJY2FzZSAnXHInOg0KLQkJew0KLQkJCW1hdGNoKCdccicpOw0KLQkJCWJyZWFrOw0KLQkJfQ0KLQkJZGVmYXVsdDoNCi0JCXsNCi0JCQl0aHJvdyBuZXcgTm9WaWFibGVBbHRGb3JDaGFyRXhjZXB0aW9uKChjaGFyKUxBKDEpLCBnZXRGaWxlbmFtZSgpLCBnZXRMaW5lKCksIGdldENvbHVtbigpKTsNCi0JCX0NCi0JCX0NCi0JCX0NCi0JCV90dHlwZSA9IFRva2VuLlNLSVA7DQotCQlpZiAoIF9jcmVhdGVUb2tlbiAmJiBfdG9rZW49PW51bGwgJiYgX3R0eXBlIT1Ub2tlbi5TS0lQICkgew0KLQkJCV90b2tlbiA9IG1ha2VUb2tlbihfdHR5cGUpOw0KLQkJCV90b2tlbi5zZXRUZXh0KG5ldyBTdHJpbmcodGV4dC5nZXRCdWZmZXIoKSwgX2JlZ2luLCB0ZXh0Lmxlbmd0aCgpLV9iZWdpbikpOw0KLQkJfQ0KLQkJX3JldHVyblRva2VuID0gX3Rva2VuOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBtUFJFUFJPQ19ESVJFQ1RJVkUoYm9vbGVhbiBfY3JlYXRlVG9rZW4pIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgQ2hhclN0cmVhbUV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJaW50IF90dHlwZTsgVG9rZW4gX3Rva2VuPW51bGw7IGludCBfYmVnaW49dGV4dC5sZW5ndGgoKTsNCi0JCV90dHlwZSA9IFBSRVBST0NfRElSRUNUSVZFOw0KLQkJaW50IF9zYXZlSW5kZXg7DQotCQkNCi0JCV9zYXZlSW5kZXg9dGV4dC5sZW5ndGgoKTsNCi0JCW1hdGNoKCcjJyk7DQotCQl0ZXh0LnNldExlbmd0aChfc2F2ZUluZGV4KTsNCi0JCXsNCi0JCV9sb29wMzIyOg0KLQkJZG8gew0KLQkJCWlmICgoX3Rva2VuU2V0XzEubWVtYmVyKExBKDEpKSkpIHsNCi0JCQkJbWF0Y2hOb3QoJ1xuJyk7DQotCQkJfQ0KLQkJCWVsc2Ugew0KLQkJCQlicmVhayBfbG9vcDMyMjsNCi0JCQl9DQotCQkJDQotCQl9IHdoaWxlICh0cnVlKTsNCi0JCX0NCi0JCV9zYXZlSW5kZXg9dGV4dC5sZW5ndGgoKTsNCi0JCW1hdGNoKCdcbicpOw0KLQkJdGV4dC5zZXRMZW5ndGgoX3NhdmVJbmRleCk7DQotCQlpZiAoIF9jcmVhdGVUb2tlbiAmJiBfdG9rZW49PW51bGwgJiYgX3R0eXBlIT1Ub2tlbi5TS0lQICkgew0KLQkJCV90b2tlbiA9IG1ha2VUb2tlbihfdHR5cGUpOw0KLQkJCV90b2tlbi5zZXRUZXh0KG5ldyBTdHJpbmcodGV4dC5nZXRCdWZmZXIoKSwgX2JlZ2luLCB0ZXh0Lmxlbmd0aCgpLV9iZWdpbikpOw0KLQkJfQ0KLQkJX3JldHVyblRva2VuID0gX3Rva2VuOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBtU0xfQ09NTUVOVChib29sZWFuIF9jcmVhdGVUb2tlbikgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBDaGFyU3RyZWFtRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQlpbnQgX3R0eXBlOyBUb2tlbiBfdG9rZW49bnVsbDsgaW50IF9iZWdpbj10ZXh0Lmxlbmd0aCgpOw0KLQkJX3R0eXBlID0gU0xfQ09NTUVOVDsNCi0JCWludCBfc2F2ZUluZGV4Ow0KLQkJDQotCQlfc2F2ZUluZGV4PXRleHQubGVuZ3RoKCk7DQotCQltYXRjaCgiLy8iKTsNCi0JCXRleHQuc2V0TGVuZ3RoKF9zYXZlSW5kZXgpOw0KLQkJew0KLQkJX2xvb3AzMjU6DQotCQlkbyB7DQotCQkJaWYgKChfdG9rZW5TZXRfMS5tZW1iZXIoTEEoMSkpKSkgew0KLQkJCQltYXRjaE5vdCgnXG4nKTsNCi0JCQl9DQotCQkJZWxzZSB7DQotCQkJCWJyZWFrIF9sb29wMzI1Ow0KLQkJCX0NCi0JCQkNCi0JCX0gd2hpbGUgKHRydWUpOw0KLQkJfQ0KLQkJbWF0Y2goJ1xuJyk7DQotCQlfdHR5cGUgPSBUb2tlbi5TS0lQOyBuZXdsaW5lKCk7DQotCQlpZiAoIF9jcmVhdGVUb2tlbiAmJiBfdG9rZW49PW51bGwgJiYgX3R0eXBlIT1Ub2tlbi5TS0lQICkgew0KLQkJCV90b2tlbiA9IG1ha2VUb2tlbihfdHR5cGUpOw0KLQkJCV90b2tlbi5zZXRUZXh0KG5ldyBTdHJpbmcodGV4dC5nZXRCdWZmZXIoKSwgX2JlZ2luLCB0ZXh0Lmxlbmd0aCgpLV9iZWdpbikpOw0KLQkJfQ0KLQkJX3JldHVyblRva2VuID0gX3Rva2VuOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBtTUxfQ09NTUVOVChib29sZWFuIF9jcmVhdGVUb2tlbikgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBDaGFyU3RyZWFtRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQlpbnQgX3R0eXBlOyBUb2tlbiBfdG9rZW49bnVsbDsgaW50IF9iZWdpbj10ZXh0Lmxlbmd0aCgpOw0KLQkJX3R0eXBlID0gTUxfQ09NTUVOVDsNCi0JCWludCBfc2F2ZUluZGV4Ow0KLQkJDQotCQlfc2F2ZUluZGV4PXRleHQubGVuZ3RoKCk7DQotCQltYXRjaCgiLyoiKTsNCi0JCXRleHQuc2V0TGVuZ3RoKF9zYXZlSW5kZXgpOw0KLQkJew0KLQkJX2xvb3AzMzM6DQotCQlkbyB7DQotCQkJaWYgKChMQSgxKT09JyonKSAmJiAoX3Rva2VuU2V0XzIubWVtYmVyKExBKDIpKSkpIHsNCi0JCQkJew0KLQkJCQlpbnQgX2NudDMyOT0wOw0KLQkJCQlfbG9vcDMyOToNCi0JCQkJZG8gew0KLQkJCQkJaWYgKChMQSgxKT09JyonKSkgew0KLQkJCQkJCW1hdGNoKCcqJyk7DQotCQkJCQl9DQotCQkJCQllbHNlIHsNCi0JCQkJCQlpZiAoIF9jbnQzMjk+PTEgKSB7IGJyZWFrIF9sb29wMzI5OyB9IGVsc2Uge3Rocm93IG5ldyBOb1ZpYWJsZUFsdEZvckNoYXJFeGNlcHRpb24oKGNoYXIpTEEoMSksIGdldEZpbGVuYW1lKCksIGdldExpbmUoKSwgZ2V0Q29sdW1uKCkpO30NCi0JCQkJCX0NCi0JCQkJCQ0KLQkJCQkJX2NudDMyOSsrOw0KLQkJCQl9IHdoaWxlICh0cnVlKTsNCi0JCQkJfQ0KLQkJCQl7DQotCQkJCWlmICgoTEEoMSk9PSdcbicpKSB7DQotCQkJCQltYXRjaCgnXG4nKTsNCi0JCQkJCW5ld2xpbmUoKTsNCi0JCQkJfQ0KLQkJCQllbHNlIGlmICgoX3Rva2VuU2V0XzMubWVtYmVyKExBKDEpKSkpIHsNCi0JCQkJCXsNCi0JCQkJCW1hdGNoKF90b2tlblNldF8zKTsNCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCQllbHNlIHsNCi0JCQkJCXRocm93IG5ldyBOb1ZpYWJsZUFsdEZvckNoYXJFeGNlcHRpb24oKGNoYXIpTEEoMSksIGdldEZpbGVuYW1lKCksIGdldExpbmUoKSwgZ2V0Q29sdW1uKCkpOw0KLQkJCQl9DQotCQkJCQ0KLQkJCQl9DQotCQkJfQ0KLQkJCWVsc2UgaWYgKChMQSgxKT09J1xuJykpIHsNCi0JCQkJbWF0Y2goJ1xuJyk7DQotCQkJCW5ld2xpbmUoKTsNCi0JCQl9DQotCQkJZWxzZSBpZiAoKF90b2tlblNldF80Lm1lbWJlcihMQSgxKSkpKSB7DQotCQkJCXsNCi0JCQkJbWF0Y2goX3Rva2VuU2V0XzQpOw0KLQkJCQl9DQotCQkJfQ0KLQkJCWVsc2Ugew0KLQkJCQlicmVhayBfbG9vcDMzMzsNCi0JCQl9DQotCQkJDQotCQl9IHdoaWxlICh0cnVlKTsNCi0JCX0NCi0JCV9zYXZlSW5kZXg9dGV4dC5sZW5ndGgoKTsNCi0JCW1hdGNoKCIqLyIpOw0KLQkJdGV4dC5zZXRMZW5ndGgoX3NhdmVJbmRleCk7DQotCQlfdHR5cGUgPSBUb2tlbi5TS0lQOw0KLQkJaWYgKCBfY3JlYXRlVG9rZW4gJiYgX3Rva2VuPT1udWxsICYmIF90dHlwZSE9VG9rZW4uU0tJUCApIHsNCi0JCQlfdG9rZW4gPSBtYWtlVG9rZW4oX3R0eXBlKTsNCi0JCQlfdG9rZW4uc2V0VGV4dChuZXcgU3RyaW5nKHRleHQuZ2V0QnVmZmVyKCksIF9iZWdpbiwgdGV4dC5sZW5ndGgoKS1fYmVnaW4pKTsNCi0JCX0NCi0JCV9yZXR1cm5Ub2tlbiA9IF90b2tlbjsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgbUNIQVJfTElURVJBTChib29sZWFuIF9jcmVhdGVUb2tlbikgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBDaGFyU3RyZWFtRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQlpbnQgX3R0eXBlOyBUb2tlbiBfdG9rZW49bnVsbDsgaW50IF9iZWdpbj10ZXh0Lmxlbmd0aCgpOw0KLQkJX3R0eXBlID0gQ0hBUl9MSVRFUkFMOw0KLQkJaW50IF9zYXZlSW5kZXg7DQotCQkNCi0JCV9zYXZlSW5kZXg9dGV4dC5sZW5ndGgoKTsNCi0JCW1hdGNoKCdcJycpOw0KLQkJdGV4dC5zZXRMZW5ndGgoX3NhdmVJbmRleCk7DQotCQl7DQotCQlpZiAoKExBKDEpPT0nXFwnKSkgew0KLQkJCW1FU0MoZmFsc2UpOw0KLQkJfQ0KLQkJZWxzZSBpZiAoKF90b2tlblNldF81Lm1lbWJlcihMQSgxKSkpKSB7DQotCQkJbWF0Y2hOb3QoJ1wnJyk7DQotCQl9DQotCQllbHNlIHsNCi0JCQl0aHJvdyBuZXcgTm9WaWFibGVBbHRGb3JDaGFyRXhjZXB0aW9uKChjaGFyKUxBKDEpLCBnZXRGaWxlbmFtZSgpLCBnZXRMaW5lKCksIGdldENvbHVtbigpKTsNCi0JCX0NCi0JCQ0KLQkJfQ0KLQkJX3NhdmVJbmRleD10ZXh0Lmxlbmd0aCgpOw0KLQkJbWF0Y2goJ1wnJyk7DQotCQl0ZXh0LnNldExlbmd0aChfc2F2ZUluZGV4KTsNCi0JCWlmICggX2NyZWF0ZVRva2VuICYmIF90b2tlbj09bnVsbCAmJiBfdHR5cGUhPVRva2VuLlNLSVAgKSB7DQotCQkJX3Rva2VuID0gbWFrZVRva2VuKF90dHlwZSk7DQotCQkJX3Rva2VuLnNldFRleHQobmV3IFN0cmluZyh0ZXh0LmdldEJ1ZmZlcigpLCBfYmVnaW4sIHRleHQubGVuZ3RoKCktX2JlZ2luKSk7DQotCQl9DQotCQlfcmV0dXJuVG9rZW4gPSBfdG9rZW47DQotCX0NCi0JDQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIG1FU0MoYm9vbGVhbiBfY3JlYXRlVG9rZW4pIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgQ2hhclN0cmVhbUV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJaW50IF90dHlwZTsgVG9rZW4gX3Rva2VuPW51bGw7IGludCBfYmVnaW49dGV4dC5sZW5ndGgoKTsNCi0JCV90dHlwZSA9IEVTQzsNCi0JCWludCBfc2F2ZUluZGV4Ow0KLQkJDQotCQlfc2F2ZUluZGV4PXRleHQubGVuZ3RoKCk7DQotCQltYXRjaCgnXFwnKTsNCi0JCXRleHQuc2V0TGVuZ3RoKF9zYXZlSW5kZXgpOw0KLQkJew0KLQkJc3dpdGNoICggTEEoMSkpIHsNCi0JCWNhc2UgJ24nOg0KLQkJew0KLQkJCW1hdGNoKCduJyk7DQotCQkJdGV4dC5zZXRMZW5ndGgoX2JlZ2luKTsgdGV4dC5hcHBlbmQoIlxuIik7DQotCQkJYnJlYWs7DQotCQl9DQotCQljYXNlICd0JzoNCi0JCXsNCi0JCQltYXRjaCgndCcpOw0KLQkJCXRleHQuc2V0TGVuZ3RoKF9iZWdpbik7IHRleHQuYXBwZW5kKCJcdCIpOw0KLQkJCWJyZWFrOw0KLQkJfQ0KLQkJY2FzZSAndic6DQotCQl7DQotCQkJbWF0Y2goJ3YnKTsNCi0JCQl0ZXh0LnNldExlbmd0aChfYmVnaW4pOyB0ZXh0LmFwcGVuZCgiXDAxMyIpOw0KLQkJCWJyZWFrOw0KLQkJfQ0KLQkJY2FzZSAnYic6DQotCQl7DQotCQkJbWF0Y2goJ2InKTsNCi0JCQl0ZXh0LnNldExlbmd0aChfYmVnaW4pOyB0ZXh0LmFwcGVuZCgiXGIiKTsNCi0JCQlicmVhazsNCi0JCX0NCi0JCWNhc2UgJ3InOg0KLQkJew0KLQkJCW1hdGNoKCdyJyk7DQotCQkJdGV4dC5zZXRMZW5ndGgoX2JlZ2luKTsgdGV4dC5hcHBlbmQoIlxyIik7DQotCQkJYnJlYWs7DQotCQl9DQotCQljYXNlICdmJzoNCi0JCXsNCi0JCQltYXRjaCgnZicpOw0KLQkJCXRleHQuc2V0TGVuZ3RoKF9iZWdpbik7IHRleHQuYXBwZW5kKCJcciIpOw0KLQkJCWJyZWFrOw0KLQkJfQ0KLQkJY2FzZSAnYSc6DQotCQl7DQotCQkJbWF0Y2goJ2EnKTsNCi0JCQl0ZXh0LnNldExlbmd0aChfYmVnaW4pOyB0ZXh0LmFwcGVuZCgiXDAwNyIpOw0KLQkJCWJyZWFrOw0KLQkJfQ0KLQkJY2FzZSAnXFwnOg0KLQkJew0KLQkJCW1hdGNoKCdcXCcpOw0KLQkJCXRleHQuc2V0TGVuZ3RoKF9iZWdpbik7IHRleHQuYXBwZW5kKCJcXCIpOw0KLQkJCWJyZWFrOw0KLQkJfQ0KLQkJY2FzZSAnPyc6DQotCQl7DQotCQkJbWF0Y2goJz8nKTsNCi0JCQl0ZXh0LnNldExlbmd0aChfYmVnaW4pOyB0ZXh0LmFwcGVuZCgiPyIpOw0KLQkJCWJyZWFrOw0KLQkJfQ0KLQkJY2FzZSAnXCcnOg0KLQkJew0KLQkJCW1hdGNoKCdcJycpOw0KLQkJCXRleHQuc2V0TGVuZ3RoKF9iZWdpbik7IHRleHQuYXBwZW5kKCInIik7DQotCQkJYnJlYWs7DQotCQl9DQotCQljYXNlICciJzoNCi0JCXsNCi0JCQltYXRjaCgnIicpOw0KLQkJCXRleHQuc2V0TGVuZ3RoKF9iZWdpbik7IHRleHQuYXBwZW5kKCJcIiIpOw0KLQkJCWJyZWFrOw0KLQkJfQ0KLQkJY2FzZSAnMCc6ICBjYXNlICcxJzogIGNhc2UgJzInOiAgY2FzZSAnMyc6DQotCQljYXNlICc0JzogIGNhc2UgJzUnOiAgY2FzZSAnNic6ICBjYXNlICc3JzoNCi0JCXsNCi0JCQltT0NURElHSVQoZmFsc2UpOw0KLQkJCXsNCi0JCQlpZiAoKChMQSgxKSA+PSAnMCcgJiYgTEEoMSkgPD0gJzcnKSkgJiYgKChMQSgyKSA+PSAnXHUwMDAwJyAmJiBMQSgyKSA8PSAnXHVmZmZlJykpICYmICh0cnVlKSAmJiAodHJ1ZSkpIHsNCi0JCQkJbU9DVERJR0lUKGZhbHNlKTsNCi0JCQkJew0KLQkJCQlpZiAoKChMQSgxKSA+PSAnMCcgJiYgTEEoMSkgPD0gJzcnKSkgJiYgKChMQSgyKSA+PSAnXHUwMDAwJyAmJiBMQSgyKSA8PSAnXHVmZmZlJykpICYmICh0cnVlKSAmJiAodHJ1ZSkpIHsNCi0JCQkJCW1PQ1RESUdJVChmYWxzZSk7DQotCQkJCX0NCi0JCQkJZWxzZSBpZiAoKChMQSgxKSA+PSAnXHUwMDAwJyAmJiBMQSgxKSA8PSAnXHVmZmZlJykpICYmICh0cnVlKSAmJiAodHJ1ZSkgJiYgKHRydWUpKSB7DQotCQkJCX0NCi0JCQkJZWxzZSB7DQotCQkJCQl0aHJvdyBuZXcgTm9WaWFibGVBbHRGb3JDaGFyRXhjZXB0aW9uKChjaGFyKUxBKDEpLCBnZXRGaWxlbmFtZSgpLCBnZXRMaW5lKCksIGdldENvbHVtbigpKTsNCi0JCQkJfQ0KLQkJCQkNCi0JCQkJfQ0KLQkJCX0NCi0JCQllbHNlIGlmICgoKExBKDEpID49ICdcdTAwMDAnICYmIExBKDEpIDw9ICdcdWZmZmUnKSkgJiYgKHRydWUpICYmICh0cnVlKSAmJiAodHJ1ZSkpIHsNCi0JCQl9DQotCQkJZWxzZSB7DQotCQkJCXRocm93IG5ldyBOb1ZpYWJsZUFsdEZvckNoYXJFeGNlcHRpb24oKGNoYXIpTEEoMSksIGdldEZpbGVuYW1lKCksIGdldExpbmUoKSwgZ2V0Q29sdW1uKCkpOw0KLQkJCX0NCi0JCQkNCi0JCQl9DQotCQkJY2hhciByZWFsYyA9IChjaGFyKSBJbnRlZ2VyLnZhbHVlT2YobmV3IFN0cmluZyh0ZXh0LmdldEJ1ZmZlcigpLF9iZWdpbix0ZXh0Lmxlbmd0aCgpLV9iZWdpbiksIDgpLmludFZhbHVlKCk7IHRleHQuc2V0TGVuZ3RoKF9iZWdpbik7IHRleHQuYXBwZW5kKHJlYWxjKTsNCi0JCQlicmVhazsNCi0JCX0NCi0JCWNhc2UgJ3gnOg0KLQkJew0KLQkJCV9zYXZlSW5kZXg9dGV4dC5sZW5ndGgoKTsNCi0JCQltYXRjaCgneCcpOw0KLQkJCXRleHQuc2V0TGVuZ3RoKF9zYXZlSW5kZXgpOw0KLQkJCW1IRVhESUdJVChmYWxzZSk7DQotCQkJew0KLQkJCWlmICgoX3Rva2VuU2V0XzYubWVtYmVyKExBKDEpKSkgJiYgKChMQSgyKSA+PSAnXHUwMDAwJyAmJiBMQSgyKSA8PSAnXHVmZmZlJykpICYmICh0cnVlKSAmJiAodHJ1ZSkpIHsNCi0JCQkJbUhFWERJR0lUKGZhbHNlKTsNCi0JCQl9DQotCQkJZWxzZSBpZiAoKChMQSgxKSA+PSAnXHUwMDAwJyAmJiBMQSgxKSA8PSAnXHVmZmZlJykpICYmICh0cnVlKSAmJiAodHJ1ZSkgJiYgKHRydWUpKSB7DQotCQkJfQ0KLQkJCWVsc2Ugew0KLQkJCQl0aHJvdyBuZXcgTm9WaWFibGVBbHRGb3JDaGFyRXhjZXB0aW9uKChjaGFyKUxBKDEpLCBnZXRGaWxlbmFtZSgpLCBnZXRMaW5lKCksIGdldENvbHVtbigpKTsNCi0JCQl9DQotCQkJDQotCQkJfQ0KLQkJCWNoYXIgcmVhbGMgPSAoY2hhcikgSW50ZWdlci52YWx1ZU9mKG5ldyBTdHJpbmcodGV4dC5nZXRCdWZmZXIoKSxfYmVnaW4sdGV4dC5sZW5ndGgoKS1fYmVnaW4pLCAxNikuaW50VmFsdWUoKTsgdGV4dC5zZXRMZW5ndGgoX2JlZ2luKTsgdGV4dC5hcHBlbmQocmVhbGMpOw0KLQkJCWJyZWFrOw0KLQkJfQ0KLQkJY2FzZSAndSc6DQotCQl7DQotCQkJX3NhdmVJbmRleD10ZXh0Lmxlbmd0aCgpOw0KLQkJCW1hdGNoKCd1Jyk7DQotCQkJdGV4dC5zZXRMZW5ndGgoX3NhdmVJbmRleCk7DQotCQkJbUhFWERJR0lUKGZhbHNlKTsNCi0JCQl7DQotCQkJaWYgKChfdG9rZW5TZXRfNi5tZW1iZXIoTEEoMSkpKSAmJiAoKExBKDIpID49ICdcdTAwMDAnICYmIExBKDIpIDw9ICdcdWZmZmUnKSkgJiYgKHRydWUpICYmICh0cnVlKSkgew0KLQkJCQltSEVYRElHSVQoZmFsc2UpOw0KLQkJCQl7DQotCQkJCWlmICgoX3Rva2VuU2V0XzYubWVtYmVyKExBKDEpKSkgJiYgKChMQSgyKSA+PSAnXHUwMDAwJyAmJiBMQSgyKSA8PSAnXHVmZmZlJykpICYmICh0cnVlKSAmJiAodHJ1ZSkpIHsNCi0JCQkJCW1IRVhESUdJVChmYWxzZSk7DQotCQkJCQl7DQotCQkJCQlpZiAoKF90b2tlblNldF82Lm1lbWJlcihMQSgxKSkpICYmICgoTEEoMikgPj0gJ1x1MDAwMCcgJiYgTEEoMikgPD0gJ1x1ZmZmZScpKSAmJiAodHJ1ZSkgJiYgKHRydWUpKSB7DQotCQkJCQkJbUhFWERJR0lUKGZhbHNlKTsNCi0JCQkJCX0NCi0JCQkJCWVsc2UgaWYgKCgoTEEoMSkgPj0gJ1x1MDAwMCcgJiYgTEEoMSkgPD0gJ1x1ZmZmZScpKSAmJiAodHJ1ZSkgJiYgKHRydWUpICYmICh0cnVlKSkgew0KLQkJCQkJfQ0KLQkJCQkJZWxzZSB7DQotCQkJCQkJdGhyb3cgbmV3IE5vVmlhYmxlQWx0Rm9yQ2hhckV4Y2VwdGlvbigoY2hhcilMQSgxKSwgZ2V0RmlsZW5hbWUoKSwgZ2V0TGluZSgpLCBnZXRDb2x1bW4oKSk7DQotCQkJCQl9DQotCQkJCQkNCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCQllbHNlIGlmICgoKExBKDEpID49ICdcdTAwMDAnICYmIExBKDEpIDw9ICdcdWZmZmUnKSkgJiYgKHRydWUpICYmICh0cnVlKSAmJiAodHJ1ZSkpIHsNCi0JCQkJfQ0KLQkJCQllbHNlIHsNCi0JCQkJCXRocm93IG5ldyBOb1ZpYWJsZUFsdEZvckNoYXJFeGNlcHRpb24oKGNoYXIpTEEoMSksIGdldEZpbGVuYW1lKCksIGdldExpbmUoKSwgZ2V0Q29sdW1uKCkpOw0KLQkJCQl9DQotCQkJCQ0KLQkJCQl9DQotCQkJfQ0KLQkJCWVsc2UgaWYgKCgoTEEoMSkgPj0gJ1x1MDAwMCcgJiYgTEEoMSkgPD0gJ1x1ZmZmZScpKSAmJiAodHJ1ZSkgJiYgKHRydWUpICYmICh0cnVlKSkgew0KLQkJCX0NCi0JCQllbHNlIHsNCi0JCQkJdGhyb3cgbmV3IE5vVmlhYmxlQWx0Rm9yQ2hhckV4Y2VwdGlvbigoY2hhcilMQSgxKSwgZ2V0RmlsZW5hbWUoKSwgZ2V0TGluZSgpLCBnZXRDb2x1bW4oKSk7DQotCQkJfQ0KLQkJCQ0KLQkJCX0NCi0JCQljaGFyIHJlYWxjID0gKGNoYXIpIEludGVnZXIudmFsdWVPZihuZXcgU3RyaW5nKHRleHQuZ2V0QnVmZmVyKCksX2JlZ2luLHRleHQubGVuZ3RoKCktX2JlZ2luKSwgMTYpLmludFZhbHVlKCk7IHRleHQuc2V0TGVuZ3RoKF9iZWdpbik7IHRleHQuYXBwZW5kKHJlYWxjKTsNCi0JCQlicmVhazsNCi0JCX0NCi0JCWRlZmF1bHQ6DQotCQl7DQotCQkJdGhyb3cgbmV3IE5vVmlhYmxlQWx0Rm9yQ2hhckV4Y2VwdGlvbigoY2hhcilMQSgxKSwgZ2V0RmlsZW5hbWUoKSwgZ2V0TGluZSgpLCBnZXRDb2x1bW4oKSk7DQotCQl9DQotCQl9DQotCQl9DQotCQlpZiAoIF9jcmVhdGVUb2tlbiAmJiBfdG9rZW49PW51bGwgJiYgX3R0eXBlIT1Ub2tlbi5TS0lQICkgew0KLQkJCV90b2tlbiA9IG1ha2VUb2tlbihfdHR5cGUpOw0KLQkJCV90b2tlbi5zZXRUZXh0KG5ldyBTdHJpbmcodGV4dC5nZXRCdWZmZXIoKSwgX2JlZ2luLCB0ZXh0Lmxlbmd0aCgpLV9iZWdpbikpOw0KLQkJfQ0KLQkJX3JldHVyblRva2VuID0gX3Rva2VuOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBtV0lERV9DSEFSX0xJVEVSQUwoYm9vbGVhbiBfY3JlYXRlVG9rZW4pIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgQ2hhclN0cmVhbUV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJaW50IF90dHlwZTsgVG9rZW4gX3Rva2VuPW51bGw7IGludCBfYmVnaW49dGV4dC5sZW5ndGgoKTsNCi0JCV90dHlwZSA9IFdJREVfQ0hBUl9MSVRFUkFMOw0KLQkJaW50IF9zYXZlSW5kZXg7DQotCQkNCi0JCV9zYXZlSW5kZXg9dGV4dC5sZW5ndGgoKTsNCi0JCW1hdGNoKCdMJyk7DQotCQl0ZXh0LnNldExlbmd0aChfc2F2ZUluZGV4KTsNCi0JCW1DSEFSX0xJVEVSQUwoZmFsc2UpOw0KLQkJaWYgKCBfY3JlYXRlVG9rZW4gJiYgX3Rva2VuPT1udWxsICYmIF90dHlwZSE9VG9rZW4uU0tJUCApIHsNCi0JCQlfdG9rZW4gPSBtYWtlVG9rZW4oX3R0eXBlKTsNCi0JCQlfdG9rZW4uc2V0VGV4dChuZXcgU3RyaW5nKHRleHQuZ2V0QnVmZmVyKCksIF9iZWdpbiwgdGV4dC5sZW5ndGgoKS1fYmVnaW4pKTsNCi0JCX0NCi0JCV9yZXR1cm5Ub2tlbiA9IF90b2tlbjsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgbVNUUklOR19MSVRFUkFMKGJvb2xlYW4gX2NyZWF0ZVRva2VuKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIENoYXJTdHJlYW1FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCWludCBfdHR5cGU7IFRva2VuIF90b2tlbj1udWxsOyBpbnQgX2JlZ2luPXRleHQubGVuZ3RoKCk7DQotCQlfdHR5cGUgPSBTVFJJTkdfTElURVJBTDsNCi0JCWludCBfc2F2ZUluZGV4Ow0KLQkJDQotCQlfc2F2ZUluZGV4PXRleHQubGVuZ3RoKCk7DQotCQltYXRjaCgnIicpOw0KLQkJdGV4dC5zZXRMZW5ndGgoX3NhdmVJbmRleCk7DQotCQl7DQotCQlfbG9vcDMzOToNCi0JCWRvIHsNCi0JCQlpZiAoKExBKDEpPT0nXFwnKSkgew0KLQkJCQltRVNDKGZhbHNlKTsNCi0JCQl9DQotCQkJZWxzZSBpZiAoKF90b2tlblNldF83Lm1lbWJlcihMQSgxKSkpKSB7DQotCQkJCW1hdGNoTm90KCciJyk7DQotCQkJfQ0KLQkJCWVsc2Ugew0KLQkJCQlicmVhayBfbG9vcDMzOTsNCi0JCQl9DQotCQkJDQotCQl9IHdoaWxlICh0cnVlKTsNCi0JCX0NCi0JCV9zYXZlSW5kZXg9dGV4dC5sZW5ndGgoKTsNCi0JCW1hdGNoKCciJyk7DQotCQl0ZXh0LnNldExlbmd0aChfc2F2ZUluZGV4KTsNCi0JCWlmICggX2NyZWF0ZVRva2VuICYmIF90b2tlbj09bnVsbCAmJiBfdHR5cGUhPVRva2VuLlNLSVAgKSB7DQotCQkJX3Rva2VuID0gbWFrZVRva2VuKF90dHlwZSk7DQotCQkJX3Rva2VuLnNldFRleHQobmV3IFN0cmluZyh0ZXh0LmdldEJ1ZmZlcigpLCBfYmVnaW4sIHRleHQubGVuZ3RoKCktX2JlZ2luKSk7DQotCQl9DQotCQlfcmV0dXJuVG9rZW4gPSBfdG9rZW47DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIG1XSURFX1NUUklOR19MSVRFUkFMKGJvb2xlYW4gX2NyZWF0ZVRva2VuKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIENoYXJTdHJlYW1FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCWludCBfdHR5cGU7IFRva2VuIF90b2tlbj1udWxsOyBpbnQgX2JlZ2luPXRleHQubGVuZ3RoKCk7DQotCQlfdHR5cGUgPSBXSURFX1NUUklOR19MSVRFUkFMOw0KLQkJaW50IF9zYXZlSW5kZXg7DQotCQkNCi0JCV9zYXZlSW5kZXg9dGV4dC5sZW5ndGgoKTsNCi0JCW1hdGNoKCdMJyk7DQotCQl0ZXh0LnNldExlbmd0aChfc2F2ZUluZGV4KTsNCi0JCW1TVFJJTkdfTElURVJBTChmYWxzZSk7DQotCQlpZiAoIF9jcmVhdGVUb2tlbiAmJiBfdG9rZW49PW51bGwgJiYgX3R0eXBlIT1Ub2tlbi5TS0lQICkgew0KLQkJCV90b2tlbiA9IG1ha2VUb2tlbihfdHR5cGUpOw0KLQkJCV90b2tlbi5zZXRUZXh0KG5ldyBTdHJpbmcodGV4dC5nZXRCdWZmZXIoKSwgX2JlZ2luLCB0ZXh0Lmxlbmd0aCgpLV9iZWdpbikpOw0KLQkJfQ0KLQkJX3JldHVyblRva2VuID0gX3Rva2VuOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBtT0NURElHSVQoYm9vbGVhbiBfY3JlYXRlVG9rZW4pIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgQ2hhclN0cmVhbUV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJaW50IF90dHlwZTsgVG9rZW4gX3Rva2VuPW51bGw7IGludCBfYmVnaW49dGV4dC5sZW5ndGgoKTsNCi0JCV90dHlwZSA9IE9DVERJR0lUOw0KLQkJaW50IF9zYXZlSW5kZXg7DQotCQkNCi0JCW1hdGNoUmFuZ2UoJzAnLCc3Jyk7DQotCQlpZiAoIF9jcmVhdGVUb2tlbiAmJiBfdG9rZW49PW51bGwgJiYgX3R0eXBlIT1Ub2tlbi5TS0lQICkgew0KLQkJCV90b2tlbiA9IG1ha2VUb2tlbihfdHR5cGUpOw0KLQkJCV90b2tlbi5zZXRUZXh0KG5ldyBTdHJpbmcodGV4dC5nZXRCdWZmZXIoKSwgX2JlZ2luLCB0ZXh0Lmxlbmd0aCgpLV9iZWdpbikpOw0KLQkJfQ0KLQkJX3JldHVyblRva2VuID0gX3Rva2VuOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBtSEVYRElHSVQoYm9vbGVhbiBfY3JlYXRlVG9rZW4pIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgQ2hhclN0cmVhbUV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJaW50IF90dHlwZTsgVG9rZW4gX3Rva2VuPW51bGw7IGludCBfYmVnaW49dGV4dC5sZW5ndGgoKTsNCi0JCV90dHlwZSA9IEhFWERJR0lUOw0KLQkJaW50IF9zYXZlSW5kZXg7DQotCQkNCi0JCXsNCi0JCXN3aXRjaCAoIExBKDEpKSB7DQotCQljYXNlICcwJzogIGNhc2UgJzEnOiAgY2FzZSAnMic6ICBjYXNlICczJzoNCi0JCWNhc2UgJzQnOiAgY2FzZSAnNSc6ICBjYXNlICc2JzogIGNhc2UgJzcnOg0KLQkJY2FzZSAnOCc6ICBjYXNlICc5JzoNCi0JCXsNCi0JCQltYXRjaFJhbmdlKCcwJywnOScpOw0KLQkJCWJyZWFrOw0KLQkJfQ0KLQkJY2FzZSAnYSc6ICBjYXNlICdiJzogIGNhc2UgJ2MnOiAgY2FzZSAnZCc6DQotCQljYXNlICdlJzogIGNhc2UgJ2YnOg0KLQkJew0KLQkJCW1hdGNoUmFuZ2UoJ2EnLCdmJyk7DQotCQkJYnJlYWs7DQotCQl9DQotCQljYXNlICdBJzogIGNhc2UgJ0InOiAgY2FzZSAnQyc6ICBjYXNlICdEJzoNCi0JCWNhc2UgJ0UnOiAgY2FzZSAnRic6DQotCQl7DQotCQkJbWF0Y2hSYW5nZSgnQScsJ0YnKTsNCi0JCQlicmVhazsNCi0JCX0NCi0JCWRlZmF1bHQ6DQotCQl7DQotCQkJdGhyb3cgbmV3IE5vVmlhYmxlQWx0Rm9yQ2hhckV4Y2VwdGlvbigoY2hhcilMQSgxKSwgZ2V0RmlsZW5hbWUoKSwgZ2V0TGluZSgpLCBnZXRDb2x1bW4oKSk7DQotCQl9DQotCQl9DQotCQl9DQotCQlpZiAoIF9jcmVhdGVUb2tlbiAmJiBfdG9rZW49PW51bGwgJiYgX3R0eXBlIT1Ub2tlbi5TS0lQICkgew0KLQkJCV90b2tlbiA9IG1ha2VUb2tlbihfdHR5cGUpOw0KLQkJCV90b2tlbi5zZXRUZXh0KG5ldyBTdHJpbmcodGV4dC5nZXRCdWZmZXIoKSwgX2JlZ2luLCB0ZXh0Lmxlbmd0aCgpLV9iZWdpbikpOw0KLQkJfQ0KLQkJX3JldHVyblRva2VuID0gX3Rva2VuOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBtVk9DQUIoYm9vbGVhbiBfY3JlYXRlVG9rZW4pIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgQ2hhclN0cmVhbUV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJaW50IF90dHlwZTsgVG9rZW4gX3Rva2VuPW51bGw7IGludCBfYmVnaW49dGV4dC5sZW5ndGgoKTsNCi0JCV90dHlwZSA9IFZPQ0FCOw0KLQkJaW50IF9zYXZlSW5kZXg7DQotCQkNCi0JCW1hdGNoUmFuZ2UoJ1wzJywnXDM3NycpOw0KLQkJaWYgKCBfY3JlYXRlVG9rZW4gJiYgX3Rva2VuPT1udWxsICYmIF90dHlwZSE9VG9rZW4uU0tJUCApIHsNCi0JCQlfdG9rZW4gPSBtYWtlVG9rZW4oX3R0eXBlKTsNCi0JCQlfdG9rZW4uc2V0VGV4dChuZXcgU3RyaW5nKHRleHQuZ2V0QnVmZmVyKCksIF9iZWdpbiwgdGV4dC5sZW5ndGgoKS1fYmVnaW4pKTsNCi0JCX0NCi0JCV9yZXR1cm5Ub2tlbiA9IF90b2tlbjsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgbURJR0lUKGJvb2xlYW4gX2NyZWF0ZVRva2VuKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIENoYXJTdHJlYW1FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCWludCBfdHR5cGU7IFRva2VuIF90b2tlbj1udWxsOyBpbnQgX2JlZ2luPXRleHQubGVuZ3RoKCk7DQotCQlfdHR5cGUgPSBESUdJVDsNCi0JCWludCBfc2F2ZUluZGV4Ow0KLQkJDQotCQltYXRjaFJhbmdlKCcwJywnOScpOw0KLQkJaWYgKCBfY3JlYXRlVG9rZW4gJiYgX3Rva2VuPT1udWxsICYmIF90dHlwZSE9VG9rZW4uU0tJUCApIHsNCi0JCQlfdG9rZW4gPSBtYWtlVG9rZW4oX3R0eXBlKTsNCi0JCQlfdG9rZW4uc2V0VGV4dChuZXcgU3RyaW5nKHRleHQuZ2V0QnVmZmVyKCksIF9iZWdpbiwgdGV4dC5sZW5ndGgoKS1fYmVnaW4pKTsNCi0JCX0NCi0JCV9yZXR1cm5Ub2tlbiA9IF90b2tlbjsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgbU5PTlpFUk9ESUdJVChib29sZWFuIF9jcmVhdGVUb2tlbikgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBDaGFyU3RyZWFtRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQlpbnQgX3R0eXBlOyBUb2tlbiBfdG9rZW49bnVsbDsgaW50IF9iZWdpbj10ZXh0Lmxlbmd0aCgpOw0KLQkJX3R0eXBlID0gTk9OWkVST0RJR0lUOw0KLQkJaW50IF9zYXZlSW5kZXg7DQotCQkNCi0JCW1hdGNoUmFuZ2UoJzEnLCc5Jyk7DQotCQlpZiAoIF9jcmVhdGVUb2tlbiAmJiBfdG9rZW49PW51bGwgJiYgX3R0eXBlIT1Ub2tlbi5TS0lQICkgew0KLQkJCV90b2tlbiA9IG1ha2VUb2tlbihfdHR5cGUpOw0KLQkJCV90b2tlbi5zZXRUZXh0KG5ldyBTdHJpbmcodGV4dC5nZXRCdWZmZXIoKSwgX2JlZ2luLCB0ZXh0Lmxlbmd0aCgpLV9iZWdpbikpOw0KLQkJfQ0KLQkJX3JldHVyblRva2VuID0gX3Rva2VuOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBtSEVYKGJvb2xlYW4gX2NyZWF0ZVRva2VuKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIENoYXJTdHJlYW1FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCWludCBfdHR5cGU7IFRva2VuIF90b2tlbj1udWxsOyBpbnQgX2JlZ2luPXRleHQubGVuZ3RoKCk7DQotCQlfdHR5cGUgPSBIRVg7DQotCQlpbnQgX3NhdmVJbmRleDsNCi0JCQ0KLQkJew0KLQkJaWYgKChMQSgxKT09JzAnKSAmJiAoTEEoMik9PSd4JykpIHsNCi0JCQltYXRjaCgiMHgiKTsNCi0JCX0NCi0JCWVsc2UgaWYgKChMQSgxKT09JzAnKSAmJiAoTEEoMik9PSdYJykpIHsNCi0JCQltYXRjaCgiMFgiKTsNCi0JCX0NCi0JCWVsc2Ugew0KLQkJCXRocm93IG5ldyBOb1ZpYWJsZUFsdEZvckNoYXJFeGNlcHRpb24oKGNoYXIpTEEoMSksIGdldEZpbGVuYW1lKCksIGdldExpbmUoKSwgZ2V0Q29sdW1uKCkpOw0KLQkJfQ0KLQkJDQotCQl9DQotCQl7DQotCQlpbnQgX2NudDM1OD0wOw0KLQkJX2xvb3AzNTg6DQotCQlkbyB7DQotCQkJaWYgKChfdG9rZW5TZXRfNi5tZW1iZXIoTEEoMSkpKSkgew0KLQkJCQltSEVYRElHSVQoZmFsc2UpOw0KLQkJCX0NCi0JCQllbHNlIHsNCi0JCQkJaWYgKCBfY250MzU4Pj0xICkgeyBicmVhayBfbG9vcDM1ODsgfSBlbHNlIHt0aHJvdyBuZXcgTm9WaWFibGVBbHRGb3JDaGFyRXhjZXB0aW9uKChjaGFyKUxBKDEpLCBnZXRGaWxlbmFtZSgpLCBnZXRMaW5lKCksIGdldENvbHVtbigpKTt9DQotCQkJfQ0KLQkJCQ0KLQkJCV9jbnQzNTgrKzsNCi0JCX0gd2hpbGUgKHRydWUpOw0KLQkJfQ0KLQkJaWYgKCBfY3JlYXRlVG9rZW4gJiYgX3Rva2VuPT1udWxsICYmIF90dHlwZSE9VG9rZW4uU0tJUCApIHsNCi0JCQlfdG9rZW4gPSBtYWtlVG9rZW4oX3R0eXBlKTsNCi0JCQlfdG9rZW4uc2V0VGV4dChuZXcgU3RyaW5nKHRleHQuZ2V0QnVmZmVyKCksIF9iZWdpbiwgdGV4dC5sZW5ndGgoKS1fYmVnaW4pKTsNCi0JCX0NCi0JCV9yZXR1cm5Ub2tlbiA9IF90b2tlbjsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgbUlOVChib29sZWFuIF9jcmVhdGVUb2tlbikgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBDaGFyU3RyZWFtRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQlpbnQgX3R0eXBlOyBUb2tlbiBfdG9rZW49bnVsbDsgaW50IF9iZWdpbj10ZXh0Lmxlbmd0aCgpOw0KLQkJX3R0eXBlID0gSU5UOw0KLQkJaW50IF9zYXZlSW5kZXg7DQotCQkNCi0JCW1OT05aRVJPRElHSVQoZmFsc2UpOw0KLQkJew0KLQkJX2xvb3AzNjE6DQotCQlkbyB7DQotCQkJaWYgKCgoTEEoMSkgPj0gJzAnICYmIExBKDEpIDw9ICc5JykpKSB7DQotCQkJCW1ESUdJVChmYWxzZSk7DQotCQkJfQ0KLQkJCWVsc2Ugew0KLQkJCQlicmVhayBfbG9vcDM2MTsNCi0JCQl9DQotCQkJDQotCQl9IHdoaWxlICh0cnVlKTsNCi0JCX0NCi0JCXsNCi0JCXN3aXRjaCAoIExBKDEpKSB7DQotCQljYXNlICcuJzoNCi0JCXsNCi0JCQltYXRjaCgnLicpOw0KLQkJCXsNCi0JCQlfbG9vcDM2NDoNCi0JCQlkbyB7DQotCQkJCWlmICgoKExBKDEpID49ICcwJyAmJiBMQSgxKSA8PSAnOScpKSkgew0KLQkJCQkJbURJR0lUKGZhbHNlKTsNCi0JCQkJfQ0KLQkJCQllbHNlIHsNCi0JCQkJCWJyZWFrIF9sb29wMzY0Ow0KLQkJCQl9DQotCQkJCQ0KLQkJCX0gd2hpbGUgKHRydWUpOw0KLQkJCX0NCi0JCQl7DQotCQkJc3dpdGNoICggTEEoMSkpIHsNCi0JCQljYXNlICdFJzogIGNhc2UgJ2UnOg0KLQkJCXsNCi0JCQkJew0KLQkJCQl7DQotCQkJCXN3aXRjaCAoIExBKDEpKSB7DQotCQkJCWNhc2UgJ2UnOg0KLQkJCQl7DQotCQkJCQltYXRjaCgnZScpOw0KLQkJCQkJYnJlYWs7DQotCQkJCX0NCi0JCQkJY2FzZSAnRSc6DQotCQkJCXsNCi0JCQkJCW1hdGNoKCdFJyk7DQotCQkJCQlicmVhazsNCi0JCQkJfQ0KLQkJCQlkZWZhdWx0Og0KLQkJCQl7DQotCQkJCQl0aHJvdyBuZXcgTm9WaWFibGVBbHRGb3JDaGFyRXhjZXB0aW9uKChjaGFyKUxBKDEpLCBnZXRGaWxlbmFtZSgpLCBnZXRMaW5lKCksIGdldENvbHVtbigpKTsNCi0JCQkJfQ0KLQkJCQl9DQotCQkJCX0NCi0JCQkJew0KLQkJCQlzd2l0Y2ggKCBMQSgxKSkgew0KLQkJCQljYXNlICcrJzoNCi0JCQkJew0KLQkJCQkJbWF0Y2goJysnKTsNCi0JCQkJCWJyZWFrOw0KLQkJCQl9DQotCQkJCWNhc2UgJy0nOg0KLQkJCQl7DQotCQkJCQltYXRjaCgnLScpOw0KLQkJCQkJYnJlYWs7DQotCQkJCX0NCi0JCQkJY2FzZSAnMCc6ICBjYXNlICcxJzogIGNhc2UgJzInOiAgY2FzZSAnMyc6DQotCQkJCWNhc2UgJzQnOiAgY2FzZSAnNSc6ICBjYXNlICc2JzogIGNhc2UgJzcnOg0KLQkJCQljYXNlICc4JzogIGNhc2UgJzknOg0KLQkJCQl7DQotCQkJCQlicmVhazsNCi0JCQkJfQ0KLQkJCQlkZWZhdWx0Og0KLQkJCQl7DQotCQkJCQl0aHJvdyBuZXcgTm9WaWFibGVBbHRGb3JDaGFyRXhjZXB0aW9uKChjaGFyKUxBKDEpLCBnZXRGaWxlbmFtZSgpLCBnZXRMaW5lKCksIGdldENvbHVtbigpKTsNCi0JCQkJfQ0KLQkJCQl9DQotCQkJCX0NCi0JCQkJew0KLQkJCQlpbnQgX2NudDM3MD0wOw0KLQkJCQlfbG9vcDM3MDoNCi0JCQkJZG8gew0KLQkJCQkJaWYgKCgoTEEoMSkgPj0gJzAnICYmIExBKDEpIDw9ICc5JykpKSB7DQotCQkJCQkJbURJR0lUKGZhbHNlKTsNCi0JCQkJCX0NCi0JCQkJCWVsc2Ugew0KLQkJCQkJCWlmICggX2NudDM3MD49MSApIHsgYnJlYWsgX2xvb3AzNzA7IH0gZWxzZSB7dGhyb3cgbmV3IE5vVmlhYmxlQWx0Rm9yQ2hhckV4Y2VwdGlvbigoY2hhcilMQSgxKSwgZ2V0RmlsZW5hbWUoKSwgZ2V0TGluZSgpLCBnZXRDb2x1bW4oKSk7fQ0KLQkJCQkJfQ0KLQkJCQkJDQotCQkJCQlfY250MzcwKys7DQotCQkJCX0gd2hpbGUgKHRydWUpOw0KLQkJCQl9DQotCQkJCX0NCi0JCQkJX3R0eXBlID0gRkxPQVQ7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlICdEJzogIGNhc2UgJ2QnOg0KLQkJCXsNCi0JCQkJew0KLQkJCQlzd2l0Y2ggKCBMQSgxKSkgew0KLQkJCQljYXNlICdkJzoNCi0JCQkJew0KLQkJCQkJbWF0Y2goJ2QnKTsNCi0JCQkJCWJyZWFrOw0KLQkJCQl9DQotCQkJCWNhc2UgJ0QnOg0KLQkJCQl7DQotCQkJCQltYXRjaCgnRCcpOw0KLQkJCQkJYnJlYWs7DQotCQkJCX0NCi0JCQkJZGVmYXVsdDoNCi0JCQkJew0KLQkJCQkJdGhyb3cgbmV3IE5vVmlhYmxlQWx0Rm9yQ2hhckV4Y2VwdGlvbigoY2hhcilMQSgxKSwgZ2V0RmlsZW5hbWUoKSwgZ2V0TGluZSgpLCBnZXRDb2x1bW4oKSk7DQotCQkJCX0NCi0JCQkJfQ0KLQkJCQl9DQotCQkJCV90dHlwZSA9IEZJWEVEOw0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJZGVmYXVsdDoNCi0JCQkJew0KLQkJCQkJX3R0eXBlID0gRkxPQVQ7DQotCQkJCX0NCi0JCQl9DQotCQkJfQ0KLQkJCWJyZWFrOw0KLQkJfQ0KLQkJY2FzZSAnRSc6ICBjYXNlICdlJzoNCi0JCXsNCi0JCQl7DQotCQkJc3dpdGNoICggTEEoMSkpIHsNCi0JCQljYXNlICdlJzoNCi0JCQl7DQotCQkJCW1hdGNoKCdlJyk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlICdFJzoNCi0JCQl7DQotCQkJCW1hdGNoKCdFJyk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQlkZWZhdWx0Og0KLQkJCXsNCi0JCQkJdGhyb3cgbmV3IE5vVmlhYmxlQWx0Rm9yQ2hhckV4Y2VwdGlvbigoY2hhcilMQSgxKSwgZ2V0RmlsZW5hbWUoKSwgZ2V0TGluZSgpLCBnZXRDb2x1bW4oKSk7DQotCQkJfQ0KLQkJCX0NCi0JCQl9DQotCQkJew0KLQkJCXN3aXRjaCAoIExBKDEpKSB7DQotCQkJY2FzZSAnKyc6DQotCQkJew0KLQkJCQltYXRjaCgnKycpOw0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJY2FzZSAnLSc6DQotCQkJew0KLQkJCQltYXRjaCgnLScpOw0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJY2FzZSAnMCc6ICBjYXNlICcxJzogIGNhc2UgJzInOiAgY2FzZSAnMyc6DQotCQkJY2FzZSAnNCc6ICBjYXNlICc1JzogIGNhc2UgJzYnOiAgY2FzZSAnNyc6DQotCQkJY2FzZSAnOCc6ICBjYXNlICc5JzoNCi0JCQl7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQlkZWZhdWx0Og0KLQkJCXsNCi0JCQkJdGhyb3cgbmV3IE5vVmlhYmxlQWx0Rm9yQ2hhckV4Y2VwdGlvbigoY2hhcilMQSgxKSwgZ2V0RmlsZW5hbWUoKSwgZ2V0TGluZSgpLCBnZXRDb2x1bW4oKSk7DQotCQkJfQ0KLQkJCX0NCi0JCQl9DQotCQkJew0KLQkJCWludCBfY250Mzc1PTA7DQotCQkJX2xvb3AzNzU6DQotCQkJZG8gew0KLQkJCQlpZiAoKChMQSgxKSA+PSAnMCcgJiYgTEEoMSkgPD0gJzknKSkpIHsNCi0JCQkJCW1ESUdJVChmYWxzZSk7DQotCQkJCX0NCi0JCQkJZWxzZSB7DQotCQkJCQlpZiAoIF9jbnQzNzU+PTEgKSB7IGJyZWFrIF9sb29wMzc1OyB9IGVsc2Uge3Rocm93IG5ldyBOb1ZpYWJsZUFsdEZvckNoYXJFeGNlcHRpb24oKGNoYXIpTEEoMSksIGdldEZpbGVuYW1lKCksIGdldExpbmUoKSwgZ2V0Q29sdW1uKCkpO30NCi0JCQkJfQ0KLQkJCQkNCi0JCQkJX2NudDM3NSsrOw0KLQkJCX0gd2hpbGUgKHRydWUpOw0KLQkJCX0NCi0JCQlfdHR5cGUgPSBGTE9BVDsNCi0JCQlicmVhazsNCi0JCX0NCi0JCWNhc2UgJ0QnOiAgY2FzZSAnZCc6DQotCQl7DQotCQkJew0KLQkJCXN3aXRjaCAoIExBKDEpKSB7DQotCQkJY2FzZSAnZCc6DQotCQkJew0KLQkJCQltYXRjaCgnZCcpOw0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJY2FzZSAnRCc6DQotCQkJew0KLQkJCQltYXRjaCgnRCcpOw0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJZGVmYXVsdDoNCi0JCQl7DQotCQkJCXRocm93IG5ldyBOb1ZpYWJsZUFsdEZvckNoYXJFeGNlcHRpb24oKGNoYXIpTEEoMSksIGdldEZpbGVuYW1lKCksIGdldExpbmUoKSwgZ2V0Q29sdW1uKCkpOw0KLQkJCX0NCi0JCQl9DQotCQkJfQ0KLQkJCV90dHlwZSA9IEZJWEVEOw0KLQkJCWJyZWFrOw0KLQkJfQ0KLQkJZGVmYXVsdDoNCi0JCQl7DQotCQkJfQ0KLQkJfQ0KLQkJfQ0KLQkJaWYgKCBfY3JlYXRlVG9rZW4gJiYgX3Rva2VuPT1udWxsICYmIF90dHlwZSE9VG9rZW4uU0tJUCApIHsNCi0JCQlfdG9rZW4gPSBtYWtlVG9rZW4oX3R0eXBlKTsNCi0JCQlfdG9rZW4uc2V0VGV4dChuZXcgU3RyaW5nKHRleHQuZ2V0QnVmZmVyKCksIF9iZWdpbiwgdGV4dC5sZW5ndGgoKS1fYmVnaW4pKTsNCi0JCX0NCi0JCV9yZXR1cm5Ub2tlbiA9IF90b2tlbjsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgbU9DVEFMKGJvb2xlYW4gX2NyZWF0ZVRva2VuKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIENoYXJTdHJlYW1FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCWludCBfdHR5cGU7IFRva2VuIF90b2tlbj1udWxsOyBpbnQgX2JlZ2luPXRleHQubGVuZ3RoKCk7DQotCQlfdHR5cGUgPSBPQ1RBTDsNCi0JCWludCBfc2F2ZUluZGV4Ow0KLQkJDQotCQltYXRjaCgnMCcpOw0KLQkJew0KLQkJc3dpdGNoICggTEEoMSkpIHsNCi0JCWNhc2UgJzAnOiAgY2FzZSAnMSc6ICBjYXNlICcyJzogIGNhc2UgJzMnOg0KLQkJY2FzZSAnNCc6ICBjYXNlICc1JzogIGNhc2UgJzYnOiAgY2FzZSAnNyc6DQotCQljYXNlICc4JzogIGNhc2UgJzknOg0KLQkJew0KLQkJCXsNCi0JCQlpbnQgX2NudDM4MD0wOw0KLQkJCV9sb29wMzgwOg0KLQkJCWRvIHsNCi0JCQkJaWYgKCgoTEEoMSkgPj0gJzAnICYmIExBKDEpIDw9ICc5JykpKSB7DQotCQkJCQltRElHSVQoZmFsc2UpOw0KLQkJCQl9DQotCQkJCWVsc2Ugew0KLQkJCQkJaWYgKCBfY250MzgwPj0xICkgeyBicmVhayBfbG9vcDM4MDsgfSBlbHNlIHt0aHJvdyBuZXcgTm9WaWFibGVBbHRGb3JDaGFyRXhjZXB0aW9uKChjaGFyKUxBKDEpLCBnZXRGaWxlbmFtZSgpLCBnZXRMaW5lKCksIGdldENvbHVtbigpKTt9DQotCQkJCX0NCi0JCQkJDQotCQkJCV9jbnQzODArKzsNCi0JCQl9IHdoaWxlICh0cnVlKTsNCi0JCQl9DQotCQkJYnJlYWs7DQotCQl9DQotCQljYXNlICcuJzoNCi0JCXsNCi0JCQltRkxPQVQoZmFsc2UpOw0KLQkJCV90dHlwZSA9IEZMT0FUOw0KLQkJCWJyZWFrOw0KLQkJfQ0KLQkJY2FzZSAnRCc6ICBjYXNlICdkJzoNCi0JCXsNCi0JCQl7DQotCQkJc3dpdGNoICggTEEoMSkpIHsNCi0JCQljYXNlICdkJzoNCi0JCQl7DQotCQkJCW1hdGNoKCdkJyk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlICdEJzoNCi0JCQl7DQotCQkJCW1hdGNoKCdEJyk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQlkZWZhdWx0Og0KLQkJCXsNCi0JCQkJdGhyb3cgbmV3IE5vVmlhYmxlQWx0Rm9yQ2hhckV4Y2VwdGlvbigoY2hhcilMQSgxKSwgZ2V0RmlsZW5hbWUoKSwgZ2V0TGluZSgpLCBnZXRDb2x1bW4oKSk7DQotCQkJfQ0KLQkJCX0NCi0JCQl9DQotCQkJX3R0eXBlID0gRklYRUQ7DQotCQkJYnJlYWs7DQotCQl9DQotCQlkZWZhdWx0Og0KLQkJCXsNCi0JCQkJX3R0eXBlID0gSU5UOw0KLQkJCX0NCi0JCX0NCi0JCX0NCi0JCWlmICggX2NyZWF0ZVRva2VuICYmIF90b2tlbj09bnVsbCAmJiBfdHR5cGUhPVRva2VuLlNLSVAgKSB7DQotCQkJX3Rva2VuID0gbWFrZVRva2VuKF90dHlwZSk7DQotCQkJX3Rva2VuLnNldFRleHQobmV3IFN0cmluZyh0ZXh0LmdldEJ1ZmZlcigpLCBfYmVnaW4sIHRleHQubGVuZ3RoKCktX2JlZ2luKSk7DQotCQl9DQotCQlfcmV0dXJuVG9rZW4gPSBfdG9rZW47DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIG1GTE9BVChib29sZWFuIF9jcmVhdGVUb2tlbikgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBDaGFyU3RyZWFtRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQlpbnQgX3R0eXBlOyBUb2tlbiBfdG9rZW49bnVsbDsgaW50IF9iZWdpbj10ZXh0Lmxlbmd0aCgpOw0KLQkJX3R0eXBlID0gRkxPQVQ7DQotCQlpbnQgX3NhdmVJbmRleDsNCi0JCQ0KLQkJbWF0Y2goJy4nKTsNCi0JCXsNCi0JCWludCBfY250Mzg0PTA7DQotCQlfbG9vcDM4NDoNCi0JCWRvIHsNCi0JCQlpZiAoKChMQSgxKSA+PSAnMCcgJiYgTEEoMSkgPD0gJzknKSkpIHsNCi0JCQkJbURJR0lUKGZhbHNlKTsNCi0JCQl9DQotCQkJZWxzZSB7DQotCQkJCWlmICggX2NudDM4ND49MSApIHsgYnJlYWsgX2xvb3AzODQ7IH0gZWxzZSB7dGhyb3cgbmV3IE5vVmlhYmxlQWx0Rm9yQ2hhckV4Y2VwdGlvbigoY2hhcilMQSgxKSwgZ2V0RmlsZW5hbWUoKSwgZ2V0TGluZSgpLCBnZXRDb2x1bW4oKSk7fQ0KLQkJCX0NCi0JCQkNCi0JCQlfY250Mzg0Kys7DQotCQl9IHdoaWxlICh0cnVlKTsNCi0JCX0NCi0JCXsNCi0JCXN3aXRjaCAoIExBKDEpKSB7DQotCQljYXNlICdFJzogIGNhc2UgJ2UnOg0KLQkJew0KLQkJCXsNCi0JCQlzd2l0Y2ggKCBMQSgxKSkgew0KLQkJCWNhc2UgJ2UnOg0KLQkJCXsNCi0JCQkJbWF0Y2goJ2UnKTsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWNhc2UgJ0UnOg0KLQkJCXsNCi0JCQkJbWF0Y2goJ0UnKTsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWRlZmF1bHQ6DQotCQkJew0KLQkJCQl0aHJvdyBuZXcgTm9WaWFibGVBbHRGb3JDaGFyRXhjZXB0aW9uKChjaGFyKUxBKDEpLCBnZXRGaWxlbmFtZSgpLCBnZXRMaW5lKCksIGdldENvbHVtbigpKTsNCi0JCQl9DQotCQkJfQ0KLQkJCX0NCi0JCQl7DQotCQkJc3dpdGNoICggTEEoMSkpIHsNCi0JCQljYXNlICcrJzoNCi0JCQl7DQotCQkJCW1hdGNoKCcrJyk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlICctJzoNCi0JCQl7DQotCQkJCW1hdGNoKCctJyk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlICcwJzogIGNhc2UgJzEnOiAgY2FzZSAnMic6ICBjYXNlICczJzoNCi0JCQljYXNlICc0JzogIGNhc2UgJzUnOiAgY2FzZSAnNic6ICBjYXNlICc3JzoNCi0JCQljYXNlICc4JzogIGNhc2UgJzknOg0KLQkJCXsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWRlZmF1bHQ6DQotCQkJew0KLQkJCQl0aHJvdyBuZXcgTm9WaWFibGVBbHRGb3JDaGFyRXhjZXB0aW9uKChjaGFyKUxBKDEpLCBnZXRGaWxlbmFtZSgpLCBnZXRMaW5lKCksIGdldENvbHVtbigpKTsNCi0JCQl9DQotCQkJfQ0KLQkJCX0NCi0JCQl7DQotCQkJaW50IF9jbnQzODk9MDsNCi0JCQlfbG9vcDM4OToNCi0JCQlkbyB7DQotCQkJCWlmICgoKExBKDEpID49ICcwJyAmJiBMQSgxKSA8PSAnOScpKSkgew0KLQkJCQkJbURJR0lUKGZhbHNlKTsNCi0JCQkJfQ0KLQkJCQllbHNlIHsNCi0JCQkJCWlmICggX2NudDM4OT49MSApIHsgYnJlYWsgX2xvb3AzODk7IH0gZWxzZSB7dGhyb3cgbmV3IE5vVmlhYmxlQWx0Rm9yQ2hhckV4Y2VwdGlvbigoY2hhcilMQSgxKSwgZ2V0RmlsZW5hbWUoKSwgZ2V0TGluZSgpLCBnZXRDb2x1bW4oKSk7fQ0KLQkJCQl9DQotCQkJCQ0KLQkJCQlfY250Mzg5Kys7DQotCQkJfSB3aGlsZSAodHJ1ZSk7DQotCQkJfQ0KLQkJCWJyZWFrOw0KLQkJfQ0KLQkJY2FzZSAnRCc6ICBjYXNlICdkJzoNCi0JCXsNCi0JCQl7DQotCQkJc3dpdGNoICggTEEoMSkpIHsNCi0JCQljYXNlICdkJzoNCi0JCQl7DQotCQkJCW1hdGNoKCdkJyk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlICdEJzoNCi0JCQl7DQotCQkJCW1hdGNoKCdEJyk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQlkZWZhdWx0Og0KLQkJCXsNCi0JCQkJdGhyb3cgbmV3IE5vVmlhYmxlQWx0Rm9yQ2hhckV4Y2VwdGlvbigoY2hhcilMQSgxKSwgZ2V0RmlsZW5hbWUoKSwgZ2V0TGluZSgpLCBnZXRDb2x1bW4oKSk7DQotCQkJfQ0KLQkJCX0NCi0JCQl9DQotCQkJX3R0eXBlID0gRklYRUQ7DQotCQkJYnJlYWs7DQotCQl9DQotCQlkZWZhdWx0Og0KLQkJCXsNCi0JCQl9DQotCQl9DQotCQl9DQotCQlpZiAoIF9jcmVhdGVUb2tlbiAmJiBfdG9rZW49PW51bGwgJiYgX3R0eXBlIT1Ub2tlbi5TS0lQICkgew0KLQkJCV90b2tlbiA9IG1ha2VUb2tlbihfdHR5cGUpOw0KLQkJCV90b2tlbi5zZXRUZXh0KG5ldyBTdHJpbmcodGV4dC5nZXRCdWZmZXIoKSwgX2JlZ2luLCB0ZXh0Lmxlbmd0aCgpLV9iZWdpbikpOw0KLQkJfQ0KLQkJX3JldHVyblRva2VuID0gX3Rva2VuOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBtSURFTlQoYm9vbGVhbiBfY3JlYXRlVG9rZW4pIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgQ2hhclN0cmVhbUV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJaW50IF90dHlwZTsgVG9rZW4gX3Rva2VuPW51bGw7IGludCBfYmVnaW49dGV4dC5sZW5ndGgoKTsNCi0JCV90dHlwZSA9IElERU5UOw0KLQkJaW50IF9zYXZlSW5kZXg7DQotCQkNCi0JCXsNCi0JCXN3aXRjaCAoIExBKDEpKSB7DQotCQljYXNlICdhJzogIGNhc2UgJ2InOiAgY2FzZSAnYyc6ICBjYXNlICdkJzoNCi0JCWNhc2UgJ2UnOiAgY2FzZSAnZic6ICBjYXNlICdnJzogIGNhc2UgJ2gnOg0KLQkJY2FzZSAnaSc6ICBjYXNlICdqJzogIGNhc2UgJ2snOiAgY2FzZSAnbCc6DQotCQljYXNlICdtJzogIGNhc2UgJ24nOiAgY2FzZSAnbyc6ICBjYXNlICdwJzoNCi0JCWNhc2UgJ3EnOiAgY2FzZSAncic6ICBjYXNlICdzJzogIGNhc2UgJ3QnOg0KLQkJY2FzZSAndSc6ICBjYXNlICd2JzogIGNhc2UgJ3cnOiAgY2FzZSAneCc6DQotCQljYXNlICd5JzogIGNhc2UgJ3onOg0KLQkJew0KLQkJCW1hdGNoUmFuZ2UoJ2EnLCd6Jyk7DQotCQkJYnJlYWs7DQotCQl9DQotCQljYXNlICdBJzogIGNhc2UgJ0InOiAgY2FzZSAnQyc6ICBjYXNlICdEJzoNCi0JCWNhc2UgJ0UnOiAgY2FzZSAnRic6ICBjYXNlICdHJzogIGNhc2UgJ0gnOg0KLQkJY2FzZSAnSSc6ICBjYXNlICdKJzogIGNhc2UgJ0snOiAgY2FzZSAnTCc6DQotCQljYXNlICdNJzogIGNhc2UgJ04nOiAgY2FzZSAnTyc6ICBjYXNlICdQJzoNCi0JCWNhc2UgJ1EnOiAgY2FzZSAnUic6ICBjYXNlICdTJzogIGNhc2UgJ1QnOg0KLQkJY2FzZSAnVSc6ICBjYXNlICdWJzogIGNhc2UgJ1cnOiAgY2FzZSAnWCc6DQotCQljYXNlICdZJzogIGNhc2UgJ1onOg0KLQkJew0KLQkJCW1hdGNoUmFuZ2UoJ0EnLCdaJyk7DQotCQkJYnJlYWs7DQotCQl9DQotCQlkZWZhdWx0Og0KLQkJew0KLQkJCXRocm93IG5ldyBOb1ZpYWJsZUFsdEZvckNoYXJFeGNlcHRpb24oKGNoYXIpTEEoMSksIGdldEZpbGVuYW1lKCksIGdldExpbmUoKSwgZ2V0Q29sdW1uKCkpOw0KLQkJfQ0KLQkJfQ0KLQkJfQ0KLQkJew0KLQkJX2xvb3AzOTQ6DQotCQlkbyB7DQotCQkJc3dpdGNoICggTEEoMSkpIHsNCi0JCQljYXNlICdhJzogIGNhc2UgJ2InOiAgY2FzZSAnYyc6ICBjYXNlICdkJzoNCi0JCQljYXNlICdlJzogIGNhc2UgJ2YnOiAgY2FzZSAnZyc6ICBjYXNlICdoJzoNCi0JCQljYXNlICdpJzogIGNhc2UgJ2onOiAgY2FzZSAnayc6ICBjYXNlICdsJzoNCi0JCQljYXNlICdtJzogIGNhc2UgJ24nOiAgY2FzZSAnbyc6ICBjYXNlICdwJzoNCi0JCQljYXNlICdxJzogIGNhc2UgJ3InOiAgY2FzZSAncyc6ICBjYXNlICd0JzoNCi0JCQljYXNlICd1JzogIGNhc2UgJ3YnOiAgY2FzZSAndyc6ICBjYXNlICd4JzoNCi0JCQljYXNlICd5JzogIGNhc2UgJ3onOg0KLQkJCXsNCi0JCQkJbWF0Y2hSYW5nZSgnYScsJ3onKTsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWNhc2UgJ0EnOiAgY2FzZSAnQic6ICBjYXNlICdDJzogIGNhc2UgJ0QnOg0KLQkJCWNhc2UgJ0UnOiAgY2FzZSAnRic6ICBjYXNlICdHJzogIGNhc2UgJ0gnOg0KLQkJCWNhc2UgJ0knOiAgY2FzZSAnSic6ICBjYXNlICdLJzogIGNhc2UgJ0wnOg0KLQkJCWNhc2UgJ00nOiAgY2FzZSAnTic6ICBjYXNlICdPJzogIGNhc2UgJ1AnOg0KLQkJCWNhc2UgJ1EnOiAgY2FzZSAnUic6ICBjYXNlICdTJzogIGNhc2UgJ1QnOg0KLQkJCWNhc2UgJ1UnOiAgY2FzZSAnVic6ICBjYXNlICdXJzogIGNhc2UgJ1gnOg0KLQkJCWNhc2UgJ1knOiAgY2FzZSAnWic6DQotCQkJew0KLQkJCQltYXRjaFJhbmdlKCdBJywnWicpOw0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJY2FzZSAnXyc6DQotCQkJew0KLQkJCQltYXRjaCgnXycpOw0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJY2FzZSAnMCc6ICBjYXNlICcxJzogIGNhc2UgJzInOiAgY2FzZSAnMyc6DQotCQkJY2FzZSAnNCc6ICBjYXNlICc1JzogIGNhc2UgJzYnOiAgY2FzZSAnNyc6DQotCQkJY2FzZSAnOCc6ICBjYXNlICc5JzoNCi0JCQl7DQotCQkJCW1hdGNoUmFuZ2UoJzAnLCc5Jyk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQlkZWZhdWx0Og0KLQkJCXsNCi0JCQkJYnJlYWsgX2xvb3AzOTQ7DQotCQkJfQ0KLQkJCX0NCi0JCX0gd2hpbGUgKHRydWUpOw0KLQkJfQ0KLQkJX3R0eXBlID0gdGVzdExpdGVyYWxzVGFibGUoX3R0eXBlKTsNCi0JCWlmICggX2NyZWF0ZVRva2VuICYmIF90b2tlbj09bnVsbCAmJiBfdHR5cGUhPVRva2VuLlNLSVAgKSB7DQotCQkJX3Rva2VuID0gbWFrZVRva2VuKF90dHlwZSk7DQotCQkJX3Rva2VuLnNldFRleHQobmV3IFN0cmluZyh0ZXh0LmdldEJ1ZmZlcigpLCBfYmVnaW4sIHRleHQubGVuZ3RoKCktX2JlZ2luKSk7DQotCQl9DQotCQlfcmV0dXJuVG9rZW4gPSBfdG9rZW47DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIG1FU0NBUEVEX0lERU5UKGJvb2xlYW4gX2NyZWF0ZVRva2VuKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIENoYXJTdHJlYW1FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCWludCBfdHR5cGU7IFRva2VuIF90b2tlbj1udWxsOyBpbnQgX2JlZ2luPXRleHQubGVuZ3RoKCk7DQotCQlfdHR5cGUgPSBFU0NBUEVEX0lERU5UOw0KLQkJaW50IF9zYXZlSW5kZXg7DQotCQkNCi0JCW1hdGNoKCdfJyk7DQotCQl7DQotCQlzd2l0Y2ggKCBMQSgxKSkgew0KLQkJY2FzZSAnYSc6ICBjYXNlICdiJzogIGNhc2UgJ2MnOiAgY2FzZSAnZCc6DQotCQljYXNlICdlJzogIGNhc2UgJ2YnOiAgY2FzZSAnZyc6ICBjYXNlICdoJzoNCi0JCWNhc2UgJ2knOiAgY2FzZSAnaic6ICBjYXNlICdrJzogIGNhc2UgJ2wnOg0KLQkJY2FzZSAnbSc6ICBjYXNlICduJzogIGNhc2UgJ28nOiAgY2FzZSAncCc6DQotCQljYXNlICdxJzogIGNhc2UgJ3InOiAgY2FzZSAncyc6ICBjYXNlICd0JzoNCi0JCWNhc2UgJ3UnOiAgY2FzZSAndic6ICBjYXNlICd3JzogIGNhc2UgJ3gnOg0KLQkJY2FzZSAneSc6ICBjYXNlICd6JzoNCi0JCXsNCi0JCQltYXRjaFJhbmdlKCdhJywneicpOw0KLQkJCWJyZWFrOw0KLQkJfQ0KLQkJY2FzZSAnQSc6ICBjYXNlICdCJzogIGNhc2UgJ0MnOiAgY2FzZSAnRCc6DQotCQljYXNlICdFJzogIGNhc2UgJ0YnOiAgY2FzZSAnRyc6ICBjYXNlICdIJzoNCi0JCWNhc2UgJ0knOiAgY2FzZSAnSic6ICBjYXNlICdLJzogIGNhc2UgJ0wnOg0KLQkJY2FzZSAnTSc6ICBjYXNlICdOJzogIGNhc2UgJ08nOiAgY2FzZSAnUCc6DQotCQljYXNlICdRJzogIGNhc2UgJ1InOiAgY2FzZSAnUyc6ICBjYXNlICdUJzoNCi0JCWNhc2UgJ1UnOiAgY2FzZSAnVic6ICBjYXNlICdXJzogIGNhc2UgJ1gnOg0KLQkJY2FzZSAnWSc6ICBjYXNlICdaJzoNCi0JCXsNCi0JCQltYXRjaFJhbmdlKCdBJywnWicpOw0KLQkJCWJyZWFrOw0KLQkJfQ0KLQkJZGVmYXVsdDoNCi0JCXsNCi0JCQl0aHJvdyBuZXcgTm9WaWFibGVBbHRGb3JDaGFyRXhjZXB0aW9uKChjaGFyKUxBKDEpLCBnZXRGaWxlbmFtZSgpLCBnZXRMaW5lKCksIGdldENvbHVtbigpKTsNCi0JCX0NCi0JCX0NCi0JCX0NCi0JCXsNCi0JCV9sb29wMzk4Og0KLQkJZG8gew0KLQkJCXN3aXRjaCAoIExBKDEpKSB7DQotCQkJY2FzZSAnYSc6ICBjYXNlICdiJzogIGNhc2UgJ2MnOiAgY2FzZSAnZCc6DQotCQkJY2FzZSAnZSc6ICBjYXNlICdmJzogIGNhc2UgJ2cnOiAgY2FzZSAnaCc6DQotCQkJY2FzZSAnaSc6ICBjYXNlICdqJzogIGNhc2UgJ2snOiAgY2FzZSAnbCc6DQotCQkJY2FzZSAnbSc6ICBjYXNlICduJzogIGNhc2UgJ28nOiAgY2FzZSAncCc6DQotCQkJY2FzZSAncSc6ICBjYXNlICdyJzogIGNhc2UgJ3MnOiAgY2FzZSAndCc6DQotCQkJY2FzZSAndSc6ICBjYXNlICd2JzogIGNhc2UgJ3cnOiAgY2FzZSAneCc6DQotCQkJY2FzZSAneSc6ICBjYXNlICd6JzoNCi0JCQl7DQotCQkJCW1hdGNoUmFuZ2UoJ2EnLCd6Jyk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlICdBJzogIGNhc2UgJ0InOiAgY2FzZSAnQyc6ICBjYXNlICdEJzoNCi0JCQljYXNlICdFJzogIGNhc2UgJ0YnOiAgY2FzZSAnRyc6ICBjYXNlICdIJzoNCi0JCQljYXNlICdJJzogIGNhc2UgJ0onOiAgY2FzZSAnSyc6ICBjYXNlICdMJzoNCi0JCQljYXNlICdNJzogIGNhc2UgJ04nOiAgY2FzZSAnTyc6ICBjYXNlICdQJzoNCi0JCQljYXNlICdRJzogIGNhc2UgJ1InOiAgY2FzZSAnUyc6ICBjYXNlICdUJzoNCi0JCQljYXNlICdVJzogIGNhc2UgJ1YnOiAgY2FzZSAnVyc6ICBjYXNlICdYJzoNCi0JCQljYXNlICdZJzogIGNhc2UgJ1onOg0KLQkJCXsNCi0JCQkJbWF0Y2hSYW5nZSgnQScsJ1onKTsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWNhc2UgJ18nOg0KLQkJCXsNCi0JCQkJbWF0Y2goJ18nKTsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWNhc2UgJzAnOiAgY2FzZSAnMSc6ICBjYXNlICcyJzogIGNhc2UgJzMnOg0KLQkJCWNhc2UgJzQnOiAgY2FzZSAnNSc6ICBjYXNlICc2JzogIGNhc2UgJzcnOg0KLQkJCWNhc2UgJzgnOiAgY2FzZSAnOSc6DQotCQkJew0KLQkJCQltYXRjaFJhbmdlKCcwJywnOScpOw0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJZGVmYXVsdDoNCi0JCQl7DQotCQkJCWJyZWFrIF9sb29wMzk4Ow0KLQkJCX0NCi0JCQl9DQotCQl9IHdoaWxlICh0cnVlKTsNCi0JCX0NCi0JCV9iZWdpbisrO190dHlwZSA9IElERU5UOw0KLQkJaWYgKCBfY3JlYXRlVG9rZW4gJiYgX3Rva2VuPT1udWxsICYmIF90dHlwZSE9VG9rZW4uU0tJUCApIHsNCi0JCQlfdG9rZW4gPSBtYWtlVG9rZW4oX3R0eXBlKTsNCi0JCQlfdG9rZW4uc2V0VGV4dChuZXcgU3RyaW5nKHRleHQuZ2V0QnVmZmVyKCksIF9iZWdpbiwgdGV4dC5sZW5ndGgoKS1fYmVnaW4pKTsNCi0JCX0NCi0JCV9yZXR1cm5Ub2tlbiA9IF90b2tlbjsNCi0JfQ0KLQkNCi0JDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmdbXSBta190b2tlblNldF8wKCkgew0KLQkJbG9uZ1tdIGRhdGEgPSBuZXcgbG9uZ1sxMDI1XTsNCi0JCWRhdGFbMV09NTc2NDYwNzQzODQ3NzA2NjIyTDsNCi0JCXJldHVybiBkYXRhOw0KLQl9DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IF90b2tlblNldF8wID0gbmV3IEJpdFNldChta190b2tlblNldF8wKCkpOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nW10gbWtfdG9rZW5TZXRfMSgpIHsNCi0JCWxvbmdbXSBkYXRhID0gbmV3IGxvbmdbMjA0OF07DQotCQlkYXRhWzBdPS0xMDI1TDsNCi0JCWZvciAoaW50IGkgPSAxOyBpPD0xMDIyOyBpKyspIHsgZGF0YVtpXT0tMUw7IH0NCi0JCWRhdGFbMTAyM109OTIyMzM3MjAzNjg1NDc3NTgwN0w7DQotCQlyZXR1cm4gZGF0YTsNCi0JfQ0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBfdG9rZW5TZXRfMSA9IG5ldyBCaXRTZXQobWtfdG9rZW5TZXRfMSgpKTsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZ1tdIG1rX3Rva2VuU2V0XzIoKSB7DQotCQlsb25nW10gZGF0YSA9IG5ldyBsb25nWzIwNDhdOw0KLQkJZGF0YVswXT0tMTQwNzM3NDg4MzU1MzI5TDsNCi0JCWZvciAoaW50IGkgPSAxOyBpPD0xMDIyOyBpKyspIHsgZGF0YVtpXT0tMUw7IH0NCi0JCWRhdGFbMTAyM109OTIyMzM3MjAzNjg1NDc3NTgwN0w7DQotCQlyZXR1cm4gZGF0YTsNCi0JfQ0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBfdG9rZW5TZXRfMiA9IG5ldyBCaXRTZXQobWtfdG9rZW5TZXRfMigpKTsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZ1tdIG1rX3Rva2VuU2V0XzMoKSB7DQotCQlsb25nW10gZGF0YSA9IG5ldyBsb25nWzIwNDhdOw0KLQkJZGF0YVswXT0tMTQ1MTM1NTM0ODY3NDU3TDsNCi0JCWZvciAoaW50IGkgPSAxOyBpPD0xMDIyOyBpKyspIHsgZGF0YVtpXT0tMUw7IH0NCi0JCWRhdGFbMTAyM109OTIyMzM3MjAzNjg1NDc3NTgwN0w7DQotCQlyZXR1cm4gZGF0YTsNCi0JfQ0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBfdG9rZW5TZXRfMyA9IG5ldyBCaXRTZXQobWtfdG9rZW5TZXRfMygpKTsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZ1tdIG1rX3Rva2VuU2V0XzQoKSB7DQotCQlsb25nW10gZGF0YSA9IG5ldyBsb25nWzIwNDhdOw0KLQkJZGF0YVswXT0tNDM5ODA0NjUxMjEyOUw7DQotCQlmb3IgKGludCBpID0gMTsgaTw9MTAyMjsgaSsrKSB7IGRhdGFbaV09LTFMOyB9DQotCQlkYXRhWzEwMjNdPTkyMjMzNzIwMzY4NTQ3NzU4MDdMOw0KLQkJcmV0dXJuIGRhdGE7DQotCX0NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgX3Rva2VuU2V0XzQgPSBuZXcgQml0U2V0KG1rX3Rva2VuU2V0XzQoKSk7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmdbXSBta190b2tlblNldF81KCkgew0KLQkJbG9uZ1tdIGRhdGEgPSBuZXcgbG9uZ1syMDQ4XTsNCi0JCWRhdGFbMF09LTU0OTc1NTgxMzg4OUw7DQotCQlkYXRhWzFdPS0yNjg0MzU0NTdMOw0KLQkJZm9yIChpbnQgaSA9IDI7IGk8PTEwMjI7IGkrKykgeyBkYXRhW2ldPS0xTDsgfQ0KLQkJZGF0YVsxMDIzXT05MjIzMzcyMDM2ODU0Nzc1ODA3TDsNCi0JCXJldHVybiBkYXRhOw0KLQl9DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IF90b2tlblNldF81ID0gbmV3IEJpdFNldChta190b2tlblNldF81KCkpOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nW10gbWtfdG9rZW5TZXRfNigpIHsNCi0JCWxvbmdbXSBkYXRhID0gbmV3IGxvbmdbMTAyNV07DQotCQlkYXRhWzBdPTI4Nzk0ODkwMTE3NTAwMTA4OEw7DQotCQlkYXRhWzFdPTU0MTE2NTg3OTQyMkw7DQotCQlyZXR1cm4gZGF0YTsNCi0JfQ0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBfdG9rZW5TZXRfNiA9IG5ldyBCaXRTZXQobWtfdG9rZW5TZXRfNigpKTsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZ1tdIG1rX3Rva2VuU2V0XzcoKSB7DQotCQlsb25nW10gZGF0YSA9IG5ldyBsb25nWzIwNDhdOw0KLQkJZGF0YVswXT0tMTcxNzk4NjkxODVMOw0KLQkJZGF0YVsxXT0tMjY4NDM1NDU3TDsNCi0JCWZvciAoaW50IGkgPSAyOyBpPD0xMDIyOyBpKyspIHsgZGF0YVtpXT0tMUw7IH0NCi0JCWRhdGFbMTAyM109OTIyMzM3MjAzNjg1NDc3NTgwN0w7DQotCQlyZXR1cm4gZGF0YTsNCi0JfQ0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBfdG9rZW5TZXRfNyA9IG5ldyBCaXRTZXQobWtfdG9rZW5TZXRfNygpKTsNCi0JDQotCX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9pZGwvcGFyc2VyL0lETFBhcnNlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvaWRsL3BhcnNlci9JRExQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAxNzk1ZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9pZGwvcGFyc2VyL0lETFBhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjk5NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotLy8gJEFOVExSIDIuNy42ICgyMDA1LTEyLTIyKTogIm9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLmciIC0+ICJJRExQYXJzZXIuamF2YSIkDQotDQotICBwYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLnBhcnNlcjsNCi0NCi1pbXBvcnQgYW50bHIuQVNURmFjdG9yeTsNCi1pbXBvcnQgYW50bHIuQVNUUGFpcjsNCi1pbXBvcnQgYW50bHIuTm9WaWFibGVBbHRFeGNlcHRpb247DQotaW1wb3J0IGFudGxyLlBhcnNlclNoYXJlZElucHV0U3RhdGU7DQotaW1wb3J0IGFudGxyLlJlY29nbml0aW9uRXhjZXB0aW9uOw0KLWltcG9ydCBhbnRsci5Ub2tlbjsNCi1pbXBvcnQgYW50bHIuVG9rZW5CdWZmZXI7DQotaW1wb3J0IGFudGxyLlRva2VuU3RyZWFtOw0KLWltcG9ydCBhbnRsci5Ub2tlblN0cmVhbUV4Y2VwdGlvbjsNCi1pbXBvcnQgYW50bHIuY29sbGVjdGlvbnMuQVNUOw0KLWltcG9ydCBhbnRsci5jb2xsZWN0aW9ucy5pbXBsLkJpdFNldDsNCi0NCi0vKioNCi0gKiAgVGhpcyBpcyBhIGNvbXBsZXRlIHBhcnNlciBmb3IgdGhlIElETCBsYW5ndWFnZSBhcyBkZWZpbmVkDQotICogIGJ5IHRoZSBDT1JCQSAzLjAuMiBzcGVjaWZpY2F0aW9uLiAgSXQgd2lsbCBhbGxvdyB0aG9zZSB3aG8NCi0gKiAgbmVlZCBhbiBJREwgcGFyc2VyIHRvIGdldCB1cC1hbmQtcnVubmluZyB2ZXJ5IHF1aWNrbHkuDQotICogIFRob3VnaCBJREwncyBzeW50YXggaXMgdmVyeSBzaW1pbGFyIHRvIEMrKywgaXQgaXMgYWxzbw0KLSAqICBtdWNoIHNpbXBsZXIsIGR1ZSBpbiBsYXJnZSBwYXJ0IHRvIHRoZSBmYWN0IHRoYXQgaXQgaXMNCi0gKiAgYSBkZWNsYXJhdGl2ZS1vbmx5IGxhbmd1YWdlLg0KLSAqDQotICogIFNvbWUgdGhpbmdzIHRoYXQgYXJlIG5vdCBpbmNsdWRlZCBhcmU6IFN5bWJvbCB0YWJsZSBjb25zdHJ1Y3Rpb24NCi0gKiAgKGl0IGlzIG5vdCBuZWNlc3NhcnkgZm9yIHBhcnNpbmcsIGJ0dykgYW5kIHByZXByb2Nlc3NpbmcgKGZvcg0KLSAqICBJREwgY29tcGlsZXIgI3ByYWdtYSBkaXJlY3RpdmVzKS4gWW91IGNhbiB1c2UganVzdCBhYm91dCBhbnkNCi0gKiAgQyBvciBDKysgcHJlcHJvY2Vzc29yLCBidXQgdGhlcmUgaXMgYW4gaW50ZXJlc3Rpbmcgc2VtYW50aWMNCi0gKiAgaXNzdWUgaWYgeW91IGFyZSBnb2luZyB0byBnZW5lcmF0ZSBjb2RlOiBJbiBDLCAjaW5jbHVkZSBpcw0KLSAqICBhIGxpdGVyYWwgaW5jbHVkZSwgaW4gSURMLCAjaW5jbHVkZSBpcyBtb3JlIGxpa2UgSmF2YSdzIGltcG9ydDoNCi0gKiAgSXQgYWRkcyBkZWZpbml0aW9ucyB0byB0aGUgc2NvcGUgb2YgdGhlIHBhcnNlLCBidXQgaW5jbHVkZWQNCi0gKiAgZGVmaW5pdGlvbnMgYXJlIG5vdCBnZW5lcmF0ZWQuDQotICoNCi0gKiAgSmltIENva2VyLCBqY29rZXJAbWFnZWxhbmcuY29tDQotICogIEdhcnkgRHV6YW4sIGdkdXphbkBiYm4uY29tDQotICovDQotcHVibGljIGNsYXNzIElETFBhcnNlciBleHRlbmRzIGFudGxyLkxMa1BhcnNlciAgICAgICBpbXBsZW1lbnRzIElETFRva2VuVHlwZXMNCi0gew0KLQ0KLXByb3RlY3RlZCBJRExQYXJzZXIoVG9rZW5CdWZmZXIgdG9rZW5CdWYsIGludCBrKSB7DQotICBzdXBlcih0b2tlbkJ1ZixrKTsNCi0gIHRva2VuTmFtZXMgPSBfdG9rZW5OYW1lczsNCi0gIGJ1aWxkVG9rZW5UeXBlQVNUQ2xhc3NNYXAoKTsNCi0gIGFzdEZhY3RvcnkgPSBuZXcgQVNURmFjdG9yeShnZXRUb2tlblR5cGVUb0FTVENsYXNzTWFwKCkpOw0KLX0NCi0NCi1wdWJsaWMgSURMUGFyc2VyKFRva2VuQnVmZmVyIHRva2VuQnVmKSB7DQotICB0aGlzKHRva2VuQnVmLDQpOw0KLX0NCi0NCi1wcm90ZWN0ZWQgSURMUGFyc2VyKFRva2VuU3RyZWFtIGxleGVyLCBpbnQgaykgew0KLSAgc3VwZXIobGV4ZXIsayk7DQotICB0b2tlbk5hbWVzID0gX3Rva2VuTmFtZXM7DQotICBidWlsZFRva2VuVHlwZUFTVENsYXNzTWFwKCk7DQotICBhc3RGYWN0b3J5ID0gbmV3IEFTVEZhY3RvcnkoZ2V0VG9rZW5UeXBlVG9BU1RDbGFzc01hcCgpKTsNCi19DQotDQotcHVibGljIElETFBhcnNlcihUb2tlblN0cmVhbSBsZXhlcikgew0KLSAgdGhpcyhsZXhlciw0KTsNCi19DQotDQotcHVibGljIElETFBhcnNlcihQYXJzZXJTaGFyZWRJbnB1dFN0YXRlIHN0YXRlKSB7DQotICBzdXBlcihzdGF0ZSw0KTsNCi0gIHRva2VuTmFtZXMgPSBfdG9rZW5OYW1lczsNCi0gIGJ1aWxkVG9rZW5UeXBlQVNUQ2xhc3NNYXAoKTsNCi0gIGFzdEZhY3RvcnkgPSBuZXcgQVNURmFjdG9yeShnZXRUb2tlblR5cGVUb0FTVENsYXNzTWFwKCkpOw0KLX0NCi0NCi0JcHVibGljIGZpbmFsIHZvaWQgc3BlY2lmaWNhdGlvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBzcGVjaWZpY2F0aW9uX0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJew0KLQkJCV9sb29wMzoNCi0JCQlkbyB7DQotCQkJCWlmICgoTEEoMSk9PUxJVEVSQUxfaW1wb3J0KSkgew0KLQkJCQkJaW1wb3J0X2RjbCgpOw0KLQkJCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQl9DQotCQkJCWVsc2Ugew0KLQkJCQkJYnJlYWsgX2xvb3AzOw0KLQkJCQl9DQotCQkJCQ0KLQkJCX0gd2hpbGUgKHRydWUpOw0KLQkJCX0NCi0JCQl7DQotCQkJaW50IF9jbnQ1PTA7DQotCQkJX2xvb3A1Og0KLQkJCWRvIHsNCi0JCQkJaWYgKChfdG9rZW5TZXRfMC5tZW1iZXIoTEEoMSkpKSkgew0KLQkJCQkJZGVmaW5pdGlvbigpOw0KLQkJCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQl9DQotCQkJCWVsc2Ugew0KLQkJCQkJaWYgKCBfY250NT49MSApIHsgYnJlYWsgX2xvb3A1OyB9IGVsc2Uge3Rocm93IG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihMVCgxKSwgZ2V0RmlsZW5hbWUoKSk7fQ0KLQkJCQl9DQotCQkJCQ0KLQkJCQlfY250NSsrOw0KLQkJCX0gd2hpbGUgKHRydWUpOw0KLQkJCX0NCi0JCQlzcGVjaWZpY2F0aW9uX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJfQ0KLQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJcmVwb3J0RXJyb3IoZXgpOw0KLQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF8xKTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gc3BlY2lmaWNhdGlvbl9BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIGltcG9ydF9kY2woKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCQ0KLQkJcmV0dXJuQVNUID0gbnVsbDsNCi0JCUFTVFBhaXIgY3VycmVudEFTVCA9IG5ldyBBU1RQYWlyKCk7DQotCQlBU1QgaW1wb3J0X2RjbF9BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCUFTVCB0bXAxX0FTVCA9IG51bGw7DQotCQkJdG1wMV9BU1QgPSBhc3RGYWN0b3J5LmNyZWF0ZShMVCgxKSk7DQotCQkJYXN0RmFjdG9yeS5tYWtlQVNUUm9vdChjdXJyZW50QVNULCB0bXAxX0FTVCk7DQotCQkJbWF0Y2goTElURVJBTF9pbXBvcnQpOw0KLQkJCWltcG9ydGVkX3Njb3BlKCk7DQotCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCW1hdGNoKFNFTUkpOw0KLQkJCWltcG9ydF9kY2xfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzIpOw0KLQkJCX0gZWxzZSB7DQotCQkJICB0aHJvdyBleDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm5BU1QgPSBpbXBvcnRfZGNsX0FTVDsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgZGVmaW5pdGlvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBkZWZpbml0aW9uX0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJew0KLQkJCXN3aXRjaCAoIExBKDEpKSB7DQotCQkJY2FzZSBMSVRFUkFMX3R5cGVkZWY6DQotCQkJY2FzZSBMSVRFUkFMX25hdGl2ZToNCi0JCQljYXNlIExJVEVSQUxfc3RydWN0Og0KLQkJCWNhc2UgTElURVJBTF91bmlvbjoNCi0JCQljYXNlIExJVEVSQUxfZW51bToNCi0JCQl7DQotCQkJCXR5cGVfZGNsKCk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJbWF0Y2goU0VNSSk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIExJVEVSQUxfY29uc3Q6DQotCQkJew0KLQkJCQljb25zdF9kY2woKTsNCi0JCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQltYXRjaChTRU1JKTsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWNhc2UgTElURVJBTF9leGNlcHRpb246DQotCQkJew0KLQkJCQlleGNlcHRfZGNsKCk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJbWF0Y2goU0VNSSk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIExJVEVSQUxfbW9kdWxlOg0KLQkJCXsNCi0JCQkJbW9kdWxlKCk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJbWF0Y2goU0VNSSk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIExJVEVSQUxfdHlwZWlkOg0KLQkJCXsNCi0JCQkJdHlwZV9pZF9kY2woKTsNCi0JCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQltYXRjaChTRU1JKTsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWNhc2UgTElURVJBTF90eXBlcHJlZml4Og0KLQkJCXsNCi0JCQkJdHlwZV9wcmVmaXhfZGNsKCk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJbWF0Y2goU0VNSSk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIExJVEVSQUxfY29tcG9uZW50Og0KLQkJCXsNCi0JCQkJY29tcG9uZW50KCk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJbWF0Y2goU0VNSSk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIExJVEVSQUxfaG9tZToNCi0JCQl7DQotCQkJCWhvbWVfZGNsKCk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJbWF0Y2goU0VNSSk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQlkZWZhdWx0Og0KLQkJCQlib29sZWFuIHN5blByZWRNYXRjaGVkMTAgPSBmYWxzZTsNCi0JCQkJaWYgKCgoKExBKDEpID49IExJVEVSQUxfYWJzdHJhY3QgJiYgTEEoMSkgPD0gTElURVJBTF9pbnRlcmZhY2UpKSAmJiAoTEEoMik9PUxJVEVSQUxfaW50ZXJmYWNlfHxMQSgyKT09SURFTlQpICYmIChfdG9rZW5TZXRfMy5tZW1iZXIoTEEoMykpKSAmJiAoX3Rva2VuU2V0XzQubWVtYmVyKExBKDQpKSkpKSB7DQotCQkJCQlpbnQgX20xMCA9IG1hcmsoKTsNCi0JCQkJCXN5blByZWRNYXRjaGVkMTAgPSB0cnVlOw0KLQkJCQkJaW5wdXRTdGF0ZS5ndWVzc2luZysrOw0KLQkJCQkJdHJ5IHsNCi0JCQkJCQl7DQotCQkJCQkJew0KLQkJCQkJCXN3aXRjaCAoIExBKDEpKSB7DQotCQkJCQkJY2FzZSBMSVRFUkFMX2Fic3RyYWN0Og0KLQkJCQkJCXsNCi0JCQkJCQkJbWF0Y2goTElURVJBTF9hYnN0cmFjdCk7DQotCQkJCQkJCWJyZWFrOw0KLQkJCQkJCX0NCi0JCQkJCQljYXNlIExJVEVSQUxfbG9jYWw6DQotCQkJCQkJew0KLQkJCQkJCQltYXRjaChMSVRFUkFMX2xvY2FsKTsNCi0JCQkJCQkJYnJlYWs7DQotCQkJCQkJfQ0KLQkJCQkJCWNhc2UgTElURVJBTF9pbnRlcmZhY2U6DQotCQkJCQkJew0KLQkJCQkJCQlicmVhazsNCi0JCQkJCQl9DQotCQkJCQkJZGVmYXVsdDoNCi0JCQkJCQl7DQotCQkJCQkJCXRocm93IG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihMVCgxKSwgZ2V0RmlsZW5hbWUoKSk7DQotCQkJCQkJfQ0KLQkJCQkJCX0NCi0JCQkJCQl9DQotCQkJCQkJbWF0Y2goTElURVJBTF9pbnRlcmZhY2UpOw0KLQkJCQkJCX0NCi0JCQkJCX0NCi0JCQkJCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBwZSkgew0KLQkJCQkJCXN5blByZWRNYXRjaGVkMTAgPSBmYWxzZTsNCi0JCQkJCX0NCi0JCQkJCXJld2luZChfbTEwKTsNCi1pbnB1dFN0YXRlLmd1ZXNzaW5nLS07DQotCQkJCX0NCi0JCQkJaWYgKCBzeW5QcmVkTWF0Y2hlZDEwICkgew0KLQkJCQkJaW50ZXJmKCk7DQotCQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCQltYXRjaChTRU1JKTsNCi0JCQkJfQ0KLQkJCQllbHNlIHsNCi0JCQkJCWJvb2xlYW4gc3luUHJlZE1hdGNoZWQxMyA9IGZhbHNlOw0KLQkJCQkJaWYgKCgoTEEoMSk9PUxJVEVSQUxfYWJzdHJhY3R8fExBKDEpPT1MSVRFUkFMX2N1c3RvbXx8TEEoMSk9PUxJVEVSQUxfdmFsdWV0eXBlKSAmJiAoTEEoMik9PUxJVEVSQUxfdmFsdWV0eXBlfHxMQSgyKT09SURFTlQpICYmIChfdG9rZW5TZXRfNS5tZW1iZXIoTEEoMykpKSAmJiAoX3Rva2VuU2V0XzYubWVtYmVyKExBKDQpKSkpKSB7DQotCQkJCQkJaW50IF9tMTMgPSBtYXJrKCk7DQotCQkJCQkJc3luUHJlZE1hdGNoZWQxMyA9IHRydWU7DQotCQkJCQkJaW5wdXRTdGF0ZS5ndWVzc2luZysrOw0KLQkJCQkJCXRyeSB7DQotCQkJCQkJCXsNCi0JCQkJCQkJew0KLQkJCQkJCQlzd2l0Y2ggKCBMQSgxKSkgew0KLQkJCQkJCQljYXNlIExJVEVSQUxfYWJzdHJhY3Q6DQotCQkJCQkJCXsNCi0JCQkJCQkJCW1hdGNoKExJVEVSQUxfYWJzdHJhY3QpOw0KLQkJCQkJCQkJYnJlYWs7DQotCQkJCQkJCX0NCi0JCQkJCQkJY2FzZSBMSVRFUkFMX2N1c3RvbToNCi0JCQkJCQkJew0KLQkJCQkJCQkJbWF0Y2goTElURVJBTF9jdXN0b20pOw0KLQkJCQkJCQkJYnJlYWs7DQotCQkJCQkJCX0NCi0JCQkJCQkJY2FzZSBMSVRFUkFMX3ZhbHVldHlwZToNCi0JCQkJCQkJew0KLQkJCQkJCQkJYnJlYWs7DQotCQkJCQkJCX0NCi0JCQkJCQkJZGVmYXVsdDoNCi0JCQkJCQkJew0KLQkJCQkJCQkJdGhyb3cgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKExUKDEpLCBnZXRGaWxlbmFtZSgpKTsNCi0JCQkJCQkJfQ0KLQkJCQkJCQl9DQotCQkJCQkJCX0NCi0JCQkJCQkJbWF0Y2goTElURVJBTF92YWx1ZXR5cGUpOw0KLQkJCQkJCQl9DQotCQkJCQkJfQ0KLQkJCQkJCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBwZSkgew0KLQkJCQkJCQlzeW5QcmVkTWF0Y2hlZDEzID0gZmFsc2U7DQotCQkJCQkJfQ0KLQkJCQkJCXJld2luZChfbTEzKTsNCi1pbnB1dFN0YXRlLmd1ZXNzaW5nLS07DQotCQkJCQl9DQotCQkJCQlpZiAoIHN5blByZWRNYXRjaGVkMTMgKSB7DQotCQkJCQkJdmFsdWUoKTsNCi0JCQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCQkJbWF0Y2goU0VNSSk7DQotCQkJCQl9DQotCQkJCQllbHNlIHsNCi0JCQkJCQlib29sZWFuIHN5blByZWRNYXRjaGVkMTYgPSBmYWxzZTsNCi0JCQkJCQlpZiAoKChMQSgxKT09TElURVJBTF9hYnN0cmFjdHx8TEEoMSk9PUxJVEVSQUxfY3VzdG9tfHxMQSgxKT09TElURVJBTF9ldmVudHR5cGUpICYmIChMQSgyKT09TElURVJBTF9ldmVudHR5cGV8fExBKDIpPT1JREVOVCkgJiYgKF90b2tlblNldF83Lm1lbWJlcihMQSgzKSkpICYmIChfdG9rZW5TZXRfOC5tZW1iZXIoTEEoNCkpKSkpIHsNCi0JCQkJCQkJaW50IF9tMTYgPSBtYXJrKCk7DQotCQkJCQkJCXN5blByZWRNYXRjaGVkMTYgPSB0cnVlOw0KLQkJCQkJCQlpbnB1dFN0YXRlLmd1ZXNzaW5nKys7DQotCQkJCQkJCXRyeSB7DQotCQkJCQkJCQl7DQotCQkJCQkJCQl7DQotCQkJCQkJCQlzd2l0Y2ggKCBMQSgxKSkgew0KLQkJCQkJCQkJY2FzZSBMSVRFUkFMX2Fic3RyYWN0Og0KLQkJCQkJCQkJew0KLQkJCQkJCQkJCW1hdGNoKExJVEVSQUxfYWJzdHJhY3QpOw0KLQkJCQkJCQkJCWJyZWFrOw0KLQkJCQkJCQkJfQ0KLQkJCQkJCQkJY2FzZSBMSVRFUkFMX2N1c3RvbToNCi0JCQkJCQkJCXsNCi0JCQkJCQkJCQltYXRjaChMSVRFUkFMX2N1c3RvbSk7DQotCQkJCQkJCQkJYnJlYWs7DQotCQkJCQkJCQl9DQotCQkJCQkJCQljYXNlIExJVEVSQUxfZXZlbnR0eXBlOg0KLQkJCQkJCQkJew0KLQkJCQkJCQkJCWJyZWFrOw0KLQkJCQkJCQkJfQ0KLQkJCQkJCQkJZGVmYXVsdDoNCi0JCQkJCQkJCXsNCi0JCQkJCQkJCQl0aHJvdyBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oTFQoMSksIGdldEZpbGVuYW1lKCkpOw0KLQkJCQkJCQkJfQ0KLQkJCQkJCQkJfQ0KLQkJCQkJCQkJfQ0KLQkJCQkJCQkJbWF0Y2goTElURVJBTF9ldmVudHR5cGUpOw0KLQkJCQkJCQkJfQ0KLQkJCQkJCQl9DQotCQkJCQkJCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBwZSkgew0KLQkJCQkJCQkJc3luUHJlZE1hdGNoZWQxNiA9IGZhbHNlOw0KLQkJCQkJCQl9DQotCQkJCQkJCXJld2luZChfbTE2KTsNCi1pbnB1dFN0YXRlLmd1ZXNzaW5nLS07DQotCQkJCQkJfQ0KLQkJCQkJCWlmICggc3luUHJlZE1hdGNoZWQxNiApIHsNCi0JCQkJCQkJZXZlbnQoKTsNCi0JCQkJCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQkJCQltYXRjaChTRU1JKTsNCi0JCQkJCQl9DQotCQkJCQllbHNlIHsNCi0JCQkJCQl0aHJvdyBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oTFQoMSksIGdldEZpbGVuYW1lKCkpOw0KLQkJCQkJfQ0KLQkJCQkJfX19DQotCQkJCQl9DQotCQkJCQlkZWZpbml0aW9uX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJCQl9DQotCQkJCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgew0KLQkJCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfOSk7DQotCQkJCQl9IGVsc2Ugew0KLQkJCQkJICB0aHJvdyBleDsNCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCQlyZXR1cm5BU1QgPSBkZWZpbml0aW9uX0FTVDsNCi0JCQl9DQotCQkJDQotCXB1YmxpYyBmaW5hbCB2b2lkIHR5cGVfZGNsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQkNCi0JCXJldHVybkFTVCA9IG51bGw7DQotCQlBU1RQYWlyIGN1cnJlbnRBU1QgPSBuZXcgQVNUUGFpcigpOw0KLQkJQVNUIHR5cGVfZGNsX0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJc3dpdGNoICggTEEoMSkpIHsNCi0JCQljYXNlIExJVEVSQUxfdHlwZWRlZjoNCi0JCQl7DQotCQkJCUFTVCB0bXAxNF9BU1QgPSBudWxsOw0KLQkJCQl0bXAxNF9BU1QgPSBhc3RGYWN0b3J5LmNyZWF0ZShMVCgxKSk7DQotCQkJCWFzdEZhY3RvcnkubWFrZUFTVFJvb3QoY3VycmVudEFTVCwgdG1wMTRfQVNUKTsNCi0JCQkJbWF0Y2goTElURVJBTF90eXBlZGVmKTsNCi0JCQkJdHlwZV9kZWNsYXJhdG9yKCk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJdHlwZV9kY2xfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIExJVEVSQUxfZW51bToNCi0JCQl7DQotCQkJCWVudW1fdHlwZSgpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCXR5cGVfZGNsX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJY2FzZSBMSVRFUkFMX25hdGl2ZToNCi0JCQl7DQotCQkJCUFTVCB0bXAxNV9BU1QgPSBudWxsOw0KLQkJCQl0bXAxNV9BU1QgPSBhc3RGYWN0b3J5LmNyZWF0ZShMVCgxKSk7DQotCQkJCWFzdEZhY3RvcnkubWFrZUFTVFJvb3QoY3VycmVudEFTVCwgdG1wMTVfQVNUKTsNCi0JCQkJbWF0Y2goTElURVJBTF9uYXRpdmUpOw0KLQkJCQlzaW1wbGVfZGVjbGFyYXRvcigpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCXR5cGVfZGNsX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJZGVmYXVsdDoNCi0JCQkJYm9vbGVhbiBzeW5QcmVkTWF0Y2hlZDExMSA9IGZhbHNlOw0KLQkJCQlpZiAoKChMQSgxKT09TElURVJBTF9zdHJ1Y3QpICYmIChMQSgyKT09SURFTlQpICYmIChMQSgzKT09TENVUkxZKSkpIHsNCi0JCQkJCWludCBfbTExMSA9IG1hcmsoKTsNCi0JCQkJCXN5blByZWRNYXRjaGVkMTExID0gdHJ1ZTsNCi0JCQkJCWlucHV0U3RhdGUuZ3Vlc3NpbmcrKzsNCi0JCQkJCXRyeSB7DQotCQkJCQkJew0KLQkJCQkJCXN0cnVjdF90eXBlKCk7DQotCQkJCQkJfQ0KLQkJCQkJfQ0KLQkJCQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHBlKSB7DQotCQkJCQkJc3luUHJlZE1hdGNoZWQxMTEgPSBmYWxzZTsNCi0JCQkJCX0NCi0JCQkJCXJld2luZChfbTExMSk7DQotaW5wdXRTdGF0ZS5ndWVzc2luZy0tOw0KLQkJCQl9DQotCQkJCWlmICggc3luUHJlZE1hdGNoZWQxMTEgKSB7DQotCQkJCQlzdHJ1Y3RfdHlwZSgpOw0KLQkJCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQkJdHlwZV9kY2xfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQkJCX0NCi0JCQkJZWxzZSB7DQotCQkJCQlib29sZWFuIHN5blByZWRNYXRjaGVkMTEzID0gZmFsc2U7DQotCQkJCQlpZiAoKChMQSgxKT09TElURVJBTF91bmlvbikgJiYgKExBKDIpPT1JREVOVCkgJiYgKExBKDMpPT1MSVRFUkFMX3N3aXRjaCkpKSB7DQotCQkJCQkJaW50IF9tMTEzID0gbWFyaygpOw0KLQkJCQkJCXN5blByZWRNYXRjaGVkMTEzID0gdHJ1ZTsNCi0JCQkJCQlpbnB1dFN0YXRlLmd1ZXNzaW5nKys7DQotCQkJCQkJdHJ5IHsNCi0JCQkJCQkJew0KLQkJCQkJCQl1bmlvbl90eXBlKCk7DQotCQkJCQkJCX0NCi0JCQkJCQl9DQotCQkJCQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHBlKSB7DQotCQkJCQkJCXN5blByZWRNYXRjaGVkMTEzID0gZmFsc2U7DQotCQkJCQkJfQ0KLQkJCQkJCXJld2luZChfbTExMyk7DQotaW5wdXRTdGF0ZS5ndWVzc2luZy0tOw0KLQkJCQkJfQ0KLQkJCQkJaWYgKCBzeW5QcmVkTWF0Y2hlZDExMyApIHsNCi0JCQkJCQl1bmlvbl90eXBlKCk7DQotCQkJCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQkJCXR5cGVfZGNsX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJCQkJfQ0KLQkJCQkJZWxzZSBpZiAoKExBKDEpPT1MSVRFUkFMX3N0cnVjdHx8TEEoMSk9PUxJVEVSQUxfdW5pb24pICYmIChMQSgyKT09SURFTlQpICYmIChMQSgzKT09U0VNSSkpIHsNCi0JCQkJCQljb25zdHJfZm9yd2FyZF9kZWNsKCk7DQotCQkJCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQkJCXR5cGVfZGNsX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJCQkJfQ0KLQkJCQllbHNlIHsNCi0JCQkJCXRocm93IG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihMVCgxKSwgZ2V0RmlsZW5hbWUoKSk7DQotCQkJCX0NCi0JCQkJfX0NCi0JCQl9DQotCQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJCWlmIChpbnB1dFN0YXRlLmd1ZXNzaW5nPT0wKSB7DQotCQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF8xMCk7DQotCQkJCX0gZWxzZSB7DQotCQkJCSAgdGhyb3cgZXg7DQotCQkJCX0NCi0JCQl9DQotCQkJcmV0dXJuQVNUID0gdHlwZV9kY2xfQVNUOw0KLQkJfQ0KLQkJDQotCXB1YmxpYyBmaW5hbCB2b2lkIGNvbnN0X2RjbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBjb25zdF9kY2xfQVNUID0gbnVsbDsNCi0JCQ0KLQkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcNCi0JCQlBU1QgdG1wMTZfQVNUID0gbnVsbDsNCi0JCQl0bXAxNl9BU1QgPSBhc3RGYWN0b3J5LmNyZWF0ZShMVCgxKSk7DQotCQkJYXN0RmFjdG9yeS5tYWtlQVNUUm9vdChjdXJyZW50QVNULCB0bXAxNl9BU1QpOw0KLQkJCW1hdGNoKExJVEVSQUxfY29uc3QpOw0KLQkJCWNvbnN0X3R5cGUoKTsNCi0JCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJaWRlbnRpZmllcigpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQltYXRjaChBU1NJR04pOw0KLQkJCWNvbnN0X2V4cCgpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQljb25zdF9kY2xfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzEwKTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gY29uc3RfZGNsX0FTVDsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgZXhjZXB0X2RjbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBleGNlcHRfZGNsX0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJQVNUIHRtcDE4X0FTVCA9IG51bGw7DQotCQkJdG1wMThfQVNUID0gYXN0RmFjdG9yeS5jcmVhdGUoTFQoMSkpOw0KLQkJCWFzdEZhY3RvcnkubWFrZUFTVFJvb3QoY3VycmVudEFTVCwgdG1wMThfQVNUKTsNCi0JCQltYXRjaChMSVRFUkFMX2V4Y2VwdGlvbik7DQotCQkJaWRlbnRpZmllcigpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQltYXRjaChMQ1VSTFkpOw0KLQkJCW9wdF9tZW1iZXJfbGlzdCgpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQltYXRjaChSQ1VSTFkpOw0KLQkJCWV4Y2VwdF9kY2xfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzEwKTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gZXhjZXB0X2RjbF9BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIGludGVyZigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBpbnRlcmZfQVNUID0gbnVsbDsNCi0JCQ0KLQkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcNCi0JCQl7DQotCQkJc3dpdGNoICggTEEoMSkpIHsNCi0JCQljYXNlIExJVEVSQUxfYWJzdHJhY3Q6DQotCQkJew0KLQkJCQlBU1QgdG1wMjFfQVNUID0gbnVsbDsNCi0JCQkJdG1wMjFfQVNUID0gYXN0RmFjdG9yeS5jcmVhdGUoTFQoMSkpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHRtcDIxX0FTVCk7DQotCQkJCW1hdGNoKExJVEVSQUxfYWJzdHJhY3QpOw0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJY2FzZSBMSVRFUkFMX2xvY2FsOg0KLQkJCXsNCi0JCQkJQVNUIHRtcDIyX0FTVCA9IG51bGw7DQotCQkJCXRtcDIyX0FTVCA9IGFzdEZhY3RvcnkuY3JlYXRlKExUKDEpKTsNCi0JCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCB0bXAyMl9BU1QpOw0KLQkJCQltYXRjaChMSVRFUkFMX2xvY2FsKTsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWNhc2UgTElURVJBTF9pbnRlcmZhY2U6DQotCQkJew0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJZGVmYXVsdDoNCi0JCQl7DQotCQkJCXRocm93IG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihMVCgxKSwgZ2V0RmlsZW5hbWUoKSk7DQotCQkJfQ0KLQkJCX0NCi0JCQl9DQotCQkJQVNUIHRtcDIzX0FTVCA9IG51bGw7DQotCQkJdG1wMjNfQVNUID0gYXN0RmFjdG9yeS5jcmVhdGUoTFQoMSkpOw0KLQkJCWFzdEZhY3RvcnkubWFrZUFTVFJvb3QoY3VycmVudEFTVCwgdG1wMjNfQVNUKTsNCi0JCQltYXRjaChMSVRFUkFMX2ludGVyZmFjZSk7DQotCQkJaWRlbnRpZmllcigpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQl7DQotCQkJc3dpdGNoICggTEEoMSkpIHsNCi0JCQljYXNlIExDVVJMWToNCi0JCQljYXNlIENPTE9OOg0KLQkJCXsNCi0JCQkJaW50ZXJmYWNlX2RjbCgpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIFNFTUk6DQotCQkJew0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJZGVmYXVsdDoNCi0JCQl7DQotCQkJCXRocm93IG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihMVCgxKSwgZ2V0RmlsZW5hbWUoKSk7DQotCQkJfQ0KLQkJCX0NCi0JCQl9DQotCQkJaW50ZXJmX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJfQ0KLQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJcmVwb3J0RXJyb3IoZXgpOw0KLQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF8xMCk7DQotCQkJfSBlbHNlIHsNCi0JCQkgIHRocm93IGV4Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybkFTVCA9IGludGVyZl9BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIG1vZHVsZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBtb2R1bGVfQVNUID0gbnVsbDsNCi0JCUFTVCBkX0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJQVNUIHRtcDI0X0FTVCA9IG51bGw7DQotCQkJdG1wMjRfQVNUID0gYXN0RmFjdG9yeS5jcmVhdGUoTFQoMSkpOw0KLQkJCWFzdEZhY3RvcnkubWFrZUFTVFJvb3QoY3VycmVudEFTVCwgdG1wMjRfQVNUKTsNCi0JCQltYXRjaChMSVRFUkFMX21vZHVsZSk7DQotCQkJaWRlbnRpZmllcigpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQltYXRjaChMQ1VSTFkpOw0KLQkJCWRlZmluaXRpb25fbGlzdCgpOw0KLQkJCWRfQVNUID0gKEFTVClyZXR1cm5BU1Q7DQotCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCW1hdGNoKFJDVVJMWSk7DQotCQkJbW9kdWxlX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJfQ0KLQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJcmVwb3J0RXJyb3IoZXgpOw0KLQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF8xMCk7DQotCQkJfSBlbHNlIHsNCi0JCQkgIHRocm93IGV4Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybkFTVCA9IG1vZHVsZV9BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIHZhbHVlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQkNCi0JCXJldHVybkFTVCA9IG51bGw7DQotCQlBU1RQYWlyIGN1cnJlbnRBU1QgPSBuZXcgQVNUUGFpcigpOw0KLQkJQVNUIHZhbHVlX0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJew0KLQkJCXN3aXRjaCAoIExBKDEpKSB7DQotCQkJY2FzZSBMSVRFUkFMX2Fic3RyYWN0Og0KLQkJCXsNCi0JCQkJdmFsdWVfYWJzX2RjbCgpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIExJVEVSQUxfY3VzdG9tOg0KLQkJCXsNCi0JCQkJdmFsdWVfY3VzdG9tX2RjbCgpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQlkZWZhdWx0Og0KLQkJCQlpZiAoKExBKDEpPT1MSVRFUkFMX3ZhbHVldHlwZSkgJiYgKExBKDIpPT1JREVOVCkgJiYgKExBKDMpPT1MQ1VSTFl8fExBKDMpPT1DT0xPTnx8TEEoMyk9PUxJVEVSQUxfc3VwcG9ydHMpKSB7DQotCQkJCQl2YWx1ZV9kY2woKTsNCi0JCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJfQ0KLQkJCQllbHNlIGlmICgoTEEoMSk9PUxJVEVSQUxfdmFsdWV0eXBlKSAmJiAoTEEoMik9PUlERU5UKSAmJiAoX3Rva2VuU2V0XzExLm1lbWJlcihMQSgzKSkpKSB7DQotCQkJCQl2YWx1ZV9ib3hfZGNsKCk7DQotCQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCX0NCi0JCQkJZWxzZSBpZiAoKExBKDEpPT1MSVRFUkFMX3ZhbHVldHlwZSkgJiYgKExBKDIpPT1JREVOVCkgJiYgKExBKDMpPT1TRU1JKSkgew0KLQkJCQkJdmFsdWVfZm9yd2FyZF9kY2woKTsNCi0JCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJfQ0KLQkJCWVsc2Ugew0KLQkJCQl0aHJvdyBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oTFQoMSksIGdldEZpbGVuYW1lKCkpOw0KLQkJCX0NCi0JCQl9DQotCQkJfQ0KLQkJCXZhbHVlX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJfQ0KLQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJcmVwb3J0RXJyb3IoZXgpOw0KLQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF8xMCk7DQotCQkJfSBlbHNlIHsNCi0JCQkgIHRocm93IGV4Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybkFTVCA9IHZhbHVlX0FTVDsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgdHlwZV9pZF9kY2woKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCQ0KLQkJcmV0dXJuQVNUID0gbnVsbDsNCi0JCUFTVFBhaXIgY3VycmVudEFTVCA9IG5ldyBBU1RQYWlyKCk7DQotCQlBU1QgdHlwZV9pZF9kY2xfQVNUID0gbnVsbDsNCi0JCQ0KLQkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcNCi0JCQlBU1QgdG1wMjdfQVNUID0gbnVsbDsNCi0JCQl0bXAyN19BU1QgPSBhc3RGYWN0b3J5LmNyZWF0ZShMVCgxKSk7DQotCQkJYXN0RmFjdG9yeS5tYWtlQVNUUm9vdChjdXJyZW50QVNULCB0bXAyN19BU1QpOw0KLQkJCW1hdGNoKExJVEVSQUxfdHlwZWlkKTsNCi0JCQlzY29wZWRfbmFtZSgpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQlzdHJpbmdfbGl0ZXJhbCgpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQl0eXBlX2lkX2RjbF9BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCX0NCi0JCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgew0KLQkJCWlmIChpbnB1dFN0YXRlLmd1ZXNzaW5nPT0wKSB7DQotCQkJCXJlcG9ydEVycm9yKGV4KTsNCi0JCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfMTApOw0KLQkJCX0gZWxzZSB7DQotCQkJICB0aHJvdyBleDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm5BU1QgPSB0eXBlX2lkX2RjbF9BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIHR5cGVfcHJlZml4X2RjbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCB0eXBlX3ByZWZpeF9kY2xfQVNUID0gbnVsbDsNCi0JCQ0KLQkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcNCi0JCQlBU1QgdG1wMjhfQVNUID0gbnVsbDsNCi0JCQl0bXAyOF9BU1QgPSBhc3RGYWN0b3J5LmNyZWF0ZShMVCgxKSk7DQotCQkJYXN0RmFjdG9yeS5tYWtlQVNUUm9vdChjdXJyZW50QVNULCB0bXAyOF9BU1QpOw0KLQkJCW1hdGNoKExJVEVSQUxfdHlwZXByZWZpeCk7DQotCQkJc2NvcGVkX25hbWUoKTsNCi0JCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJc3RyaW5nX2xpdGVyYWwoKTsNCi0JCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJdHlwZV9wcmVmaXhfZGNsX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJfQ0KLQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJcmVwb3J0RXJyb3IoZXgpOw0KLQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF8xMCk7DQotCQkJfSBlbHNlIHsNCi0JCQkgIHRocm93IGV4Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybkFTVCA9IHR5cGVfcHJlZml4X2RjbF9BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIGV2ZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQkNCi0JCXJldHVybkFTVCA9IG51bGw7DQotCQlBU1RQYWlyIGN1cnJlbnRBU1QgPSBuZXcgQVNUUGFpcigpOw0KLQkJQVNUIGV2ZW50X0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJew0KLQkJCXN3aXRjaCAoIExBKDEpKSB7DQotCQkJY2FzZSBMSVRFUkFMX2Fic3RyYWN0Og0KLQkJCXsNCi0JCQkJZXZlbnRfYWJzKCk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWNhc2UgTElURVJBTF9jdXN0b206DQotCQkJew0KLQkJCQlldmVudF9jdXN0b20oKTsNCi0JCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJY2FzZSBMSVRFUkFMX2V2ZW50dHlwZToNCi0JCQl7DQotCQkJCWV2ZW50X2RjbCgpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQlkZWZhdWx0Og0KLQkJCXsNCi0JCQkJdGhyb3cgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKExUKDEpLCBnZXRGaWxlbmFtZSgpKTsNCi0JCQl9DQotCQkJfQ0KLQkJCX0NCi0JCQlldmVudF9BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCX0NCi0JCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgew0KLQkJCWlmIChpbnB1dFN0YXRlLmd1ZXNzaW5nPT0wKSB7DQotCQkJCXJlcG9ydEVycm9yKGV4KTsNCi0JCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfMTApOw0KLQkJCX0gZWxzZSB7DQotCQkJICB0aHJvdyBleDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm5BU1QgPSBldmVudF9BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIGNvbXBvbmVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBjb21wb25lbnRfQVNUID0gbnVsbDsNCi0JCQ0KLQkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcNCi0JCQlBU1QgdG1wMjlfQVNUID0gbnVsbDsNCi0JCQl0bXAyOV9BU1QgPSBhc3RGYWN0b3J5LmNyZWF0ZShMVCgxKSk7DQotCQkJYXN0RmFjdG9yeS5tYWtlQVNUUm9vdChjdXJyZW50QVNULCB0bXAyOV9BU1QpOw0KLQkJCW1hdGNoKExJVEVSQUxfY29tcG9uZW50KTsNCi0JCQlpZGVudGlmaWVyKCk7DQotCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCXsNCi0JCQlzd2l0Y2ggKCBMQSgxKSkgew0KLQkJCWNhc2UgTENVUkxZOg0KLQkJCWNhc2UgQ09MT046DQotCQkJY2FzZSBMSVRFUkFMX3N1cHBvcnRzOg0KLQkJCXsNCi0JCQkJY29tcG9uZW50X2RjbCgpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIFNFTUk6DQotCQkJew0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJZGVmYXVsdDoNCi0JCQl7DQotCQkJCXRocm93IG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihMVCgxKSwgZ2V0RmlsZW5hbWUoKSk7DQotCQkJfQ0KLQkJCX0NCi0JCQl9DQotCQkJY29tcG9uZW50X0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJfQ0KLQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJcmVwb3J0RXJyb3IoZXgpOw0KLQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF8xMCk7DQotCQkJfSBlbHNlIHsNCi0JCQkgIHRocm93IGV4Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybkFTVCA9IGNvbXBvbmVudF9BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIGhvbWVfZGNsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQkNCi0JCXJldHVybkFTVCA9IG51bGw7DQotCQlBU1RQYWlyIGN1cnJlbnRBU1QgPSBuZXcgQVNUUGFpcigpOw0KLQkJQVNUIGhvbWVfZGNsX0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJaG9tZV9oZWFkZXIoKTsNCi0JCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJaG9tZV9ib2R5KCk7DQotCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCWhvbWVfZGNsX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJfQ0KLQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJcmVwb3J0RXJyb3IoZXgpOw0KLQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF8xMCk7DQotCQkJfSBlbHNlIHsNCi0JCQkgIHRocm93IGV4Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybkFTVCA9IGhvbWVfZGNsX0FTVDsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgaWRlbnRpZmllcigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBpZGVudGlmaWVyX0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJQVNUIHRtcDMwX0FTVCA9IG51bGw7DQotCQkJdG1wMzBfQVNUID0gYXN0RmFjdG9yeS5jcmVhdGUoTFQoMSkpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgdG1wMzBfQVNUKTsNCi0JCQltYXRjaChJREVOVCk7DQotCQkJaWRlbnRpZmllcl9BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCX0NCi0JCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgew0KLQkJCWlmIChpbnB1dFN0YXRlLmd1ZXNzaW5nPT0wKSB7DQotCQkJCXJlcG9ydEVycm9yKGV4KTsNCi0JCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfMTIpOw0KLQkJCX0gZWxzZSB7DQotCQkJICB0aHJvdyBleDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm5BU1QgPSBpZGVudGlmaWVyX0FTVDsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgZGVmaW5pdGlvbl9saXN0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQkNCi0JCXJldHVybkFTVCA9IG51bGw7DQotCQlBU1RQYWlyIGN1cnJlbnRBU1QgPSBuZXcgQVNUUGFpcigpOw0KLQkJQVNUIGRlZmluaXRpb25fbGlzdF9BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCXsNCi0JCQlpbnQgX2NudDIwPTA7DQotCQkJX2xvb3AyMDoNCi0JCQlkbyB7DQotCQkJCWlmICgoX3Rva2VuU2V0XzAubWVtYmVyKExBKDEpKSkpIHsNCi0JCQkJCWRlZmluaXRpb24oKTsNCi0JCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJfQ0KLQkJCQllbHNlIHsNCi0JCQkJCWlmICggX2NudDIwPj0xICkgeyBicmVhayBfbG9vcDIwOyB9IGVsc2Uge3Rocm93IG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihMVCgxKSwgZ2V0RmlsZW5hbWUoKSk7fQ0KLQkJCQl9DQotCQkJCQ0KLQkJCQlfY250MjArKzsNCi0JCQl9IHdoaWxlICh0cnVlKTsNCi0JCQl9DQotCQkJZGVmaW5pdGlvbl9saXN0X0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJfQ0KLQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJcmVwb3J0RXJyb3IoZXgpOw0KLQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF8xMyk7DQotCQkJfSBlbHNlIHsNCi0JCQkgIHRocm93IGV4Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybkFTVCA9IGRlZmluaXRpb25fbGlzdF9BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIGludGVyZmFjZV9kY2woKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCQ0KLQkJcmV0dXJuQVNUID0gbnVsbDsNCi0JCUFTVFBhaXIgY3VycmVudEFTVCA9IG5ldyBBU1RQYWlyKCk7DQotCQlBU1QgaW50ZXJmYWNlX2RjbF9BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCWludGVyZmFjZV9oZWFkZXIoKTsNCi0JCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJbWF0Y2goTENVUkxZKTsNCi0JCQlpbnRlcmZhY2VfYm9keSgpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQltYXRjaChSQ1VSTFkpOw0KLQkJCWludGVyZmFjZV9kY2xfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzEwKTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gaW50ZXJmYWNlX2RjbF9BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIGludGVyZmFjZV9oZWFkZXIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCQ0KLQkJcmV0dXJuQVNUID0gbnVsbDsNCi0JCUFTVFBhaXIgY3VycmVudEFTVCA9IG5ldyBBU1RQYWlyKCk7DQotCQlBU1QgaW50ZXJmYWNlX2hlYWRlcl9BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCXsNCi0JCQlzd2l0Y2ggKCBMQSgxKSkgew0KLQkJCWNhc2UgQ09MT046DQotCQkJew0KLQkJCQlpbnRlcmZhY2VfaW5oZXJpdGFuY2Vfc3BlYygpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIExDVVJMWToNCi0JCQl7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQlkZWZhdWx0Og0KLQkJCXsNCi0JCQkJdGhyb3cgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKExUKDEpLCBnZXRGaWxlbmFtZSgpKTsNCi0JCQl9DQotCQkJfQ0KLQkJCX0NCi0JCQlpbnRlcmZhY2VfaGVhZGVyX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJfQ0KLQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJcmVwb3J0RXJyb3IoZXgpOw0KLQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF8xNCk7DQotCQkJfSBlbHNlIHsNCi0JCQkgIHRocm93IGV4Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybkFTVCA9IGludGVyZmFjZV9oZWFkZXJfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBpbnRlcmZhY2VfYm9keSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBpbnRlcmZhY2VfYm9keV9BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCXsNCi0JCQlfbG9vcDI5Og0KLQkJCWRvIHsNCi0JCQkJaWYgKChfdG9rZW5TZXRfMTUubWVtYmVyKExBKDEpKSkpIHsNCi0JCQkJCWV4cG9ydCgpOw0KLQkJCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQl9DQotCQkJCWVsc2Ugew0KLQkJCQkJYnJlYWsgX2xvb3AyOTsNCi0JCQkJfQ0KLQkJCQkNCi0JCQl9IHdoaWxlICh0cnVlKTsNCi0JCQl9DQotCQkJaW50ZXJmYWNlX2JvZHlfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzEzKTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gaW50ZXJmYWNlX2JvZHlfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBpbnRlcmZhY2VfaW5oZXJpdGFuY2Vfc3BlYygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBpbnRlcmZhY2VfaW5oZXJpdGFuY2Vfc3BlY19BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCUFTVCB0bXAzM19BU1QgPSBudWxsOw0KLQkJCXRtcDMzX0FTVCA9IGFzdEZhY3RvcnkuY3JlYXRlKExUKDEpKTsNCi0JCQlhc3RGYWN0b3J5Lm1ha2VBU1RSb290KGN1cnJlbnRBU1QsIHRtcDMzX0FTVCk7DQotCQkJbWF0Y2goQ09MT04pOw0KLQkJCXNjb3BlZF9uYW1lX2xpc3QoKTsNCi0JCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJaW50ZXJmYWNlX2luaGVyaXRhbmNlX3NwZWNfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzE0KTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gaW50ZXJmYWNlX2luaGVyaXRhbmNlX3NwZWNfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBleHBvcnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCQ0KLQkJcmV0dXJuQVNUID0gbnVsbDsNCi0JCUFTVFBhaXIgY3VycmVudEFTVCA9IG5ldyBBU1RQYWlyKCk7DQotCQlBU1QgZXhwb3J0X0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJew0KLQkJCXN3aXRjaCAoIExBKDEpKSB7DQotCQkJY2FzZSBMSVRFUkFMX3R5cGVkZWY6DQotCQkJY2FzZSBMSVRFUkFMX25hdGl2ZToNCi0JCQljYXNlIExJVEVSQUxfc3RydWN0Og0KLQkJCWNhc2UgTElURVJBTF91bmlvbjoNCi0JCQljYXNlIExJVEVSQUxfZW51bToNCi0JCQl7DQotCQkJCXR5cGVfZGNsKCk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJbWF0Y2goU0VNSSk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIExJVEVSQUxfY29uc3Q6DQotCQkJew0KLQkJCQljb25zdF9kY2woKTsNCi0JCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQltYXRjaChTRU1JKTsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWNhc2UgTElURVJBTF9leGNlcHRpb246DQotCQkJew0KLQkJCQlleGNlcHRfZGNsKCk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJbWF0Y2goU0VNSSk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIExJVEVSQUxfcmVhZG9ubHk6DQotCQkJY2FzZSBMSVRFUkFMX2F0dHJpYnV0ZToNCi0JCQl7DQotCQkJCWF0dHJfZGNsKCk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJbWF0Y2goU0VNSSk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIFNDT1BFT1A6DQotCQkJY2FzZSBJREVOVDoNCi0JCQljYXNlIExJVEVSQUxfZmxvYXQ6DQotCQkJY2FzZSBMSVRFUkFMX2RvdWJsZToNCi0JCQljYXNlIExJVEVSQUxfbG9uZzoNCi0JCQljYXNlIExJVEVSQUxfc2hvcnQ6DQotCQkJY2FzZSBMSVRFUkFMX3Vuc2lnbmVkOg0KLQkJCWNhc2UgTElURVJBTF9jaGFyOg0KLQkJCWNhc2UgTElURVJBTF93Y2hhcjoNCi0JCQljYXNlIExJVEVSQUxfYm9vbGVhbjoNCi0JCQljYXNlIExJVEVSQUxfb2N0ZXQ6DQotCQkJY2FzZSBMSVRFUkFMX2FueToNCi0JCQljYXNlIExJVEVSQUxfT2JqZWN0Og0KLQkJCWNhc2UgTElURVJBTF9zdHJpbmc6DQotCQkJY2FzZSBMSVRFUkFMX3dzdHJpbmc6DQotCQkJY2FzZSBMSVRFUkFMX29uZXdheToNCi0JCQljYXNlIExJVEVSQUxfdm9pZDoNCi0JCQljYXNlIExJVEVSQUxfVmFsdWVCYXNlOg0KLQkJCXsNCi0JCQkJb3BfZGNsKCk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJbWF0Y2goU0VNSSk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIExJVEVSQUxfdHlwZWlkOg0KLQkJCXsNCi0JCQkJdHlwZV9pZF9kY2woKTsNCi0JCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQltYXRjaChTRU1JKTsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWNhc2UgTElURVJBTF90eXBlcHJlZml4Og0KLQkJCXsNCi0JCQkJdHlwZV9wcmVmaXhfZGNsKCk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJbWF0Y2goU0VNSSk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIFBSRVBST0NfRElSRUNUSVZFOg0KLQkJCXsNCi0JCQkJQVNUIHRtcDQxX0FTVCA9IG51bGw7DQotCQkJCXRtcDQxX0FTVCA9IGFzdEZhY3RvcnkuY3JlYXRlKExUKDEpKTsNCi0JCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCB0bXA0MV9BU1QpOw0KLQkJCQltYXRjaChQUkVQUk9DX0RJUkVDVElWRSk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQlkZWZhdWx0Og0KLQkJCXsNCi0JCQkJdGhyb3cgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKExUKDEpLCBnZXRGaWxlbmFtZSgpKTsNCi0JCQl9DQotCQkJfQ0KLQkJCX0NCi0JCQlleHBvcnRfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzE2KTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gZXhwb3J0X0FTVDsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgYXR0cl9kY2woKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCQ0KLQkJcmV0dXJuQVNUID0gbnVsbDsNCi0JCUFTVFBhaXIgY3VycmVudEFTVCA9IG5ldyBBU1RQYWlyKCk7DQotCQlBU1QgYXR0cl9kY2xfQVNUID0gbnVsbDsNCi0JCQ0KLQkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcNCi0JCQlzd2l0Y2ggKCBMQSgxKSkgew0KLQkJCWNhc2UgTElURVJBTF9yZWFkb25seToNCi0JCQl7DQotCQkJCXJlYWRvbmx5X2F0dHJfc3BlYygpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCWF0dHJfZGNsX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJY2FzZSBMSVRFUkFMX2F0dHJpYnV0ZToNCi0JCQl7DQotCQkJCWF0dHJfc3BlYygpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCWF0dHJfZGNsX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJZGVmYXVsdDoNCi0JCQl7DQotCQkJCXRocm93IG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihMVCgxKSwgZ2V0RmlsZW5hbWUoKSk7DQotCQkJfQ0KLQkJCX0NCi0JCX0NCi0JCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgew0KLQkJCWlmIChpbnB1dFN0YXRlLmd1ZXNzaW5nPT0wKSB7DQotCQkJCXJlcG9ydEVycm9yKGV4KTsNCi0JCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfMTApOw0KLQkJCX0gZWxzZSB7DQotCQkJICB0aHJvdyBleDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm5BU1QgPSBhdHRyX2RjbF9BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIG9wX2RjbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBvcF9kY2xfQVNUID0gbnVsbDsNCi0JCQ0KLQkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcNCi0JCQl7DQotCQkJc3dpdGNoICggTEEoMSkpIHsNCi0JCQljYXNlIExJVEVSQUxfb25ld2F5Og0KLQkJCXsNCi0JCQkJb3BfYXR0cmlidXRlKCk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWNhc2UgU0NPUEVPUDoNCi0JCQljYXNlIElERU5UOg0KLQkJCWNhc2UgTElURVJBTF9mbG9hdDoNCi0JCQljYXNlIExJVEVSQUxfZG91YmxlOg0KLQkJCWNhc2UgTElURVJBTF9sb25nOg0KLQkJCWNhc2UgTElURVJBTF9zaG9ydDoNCi0JCQljYXNlIExJVEVSQUxfdW5zaWduZWQ6DQotCQkJY2FzZSBMSVRFUkFMX2NoYXI6DQotCQkJY2FzZSBMSVRFUkFMX3djaGFyOg0KLQkJCWNhc2UgTElURVJBTF9ib29sZWFuOg0KLQkJCWNhc2UgTElURVJBTF9vY3RldDoNCi0JCQljYXNlIExJVEVSQUxfYW55Og0KLQkJCWNhc2UgTElURVJBTF9PYmplY3Q6DQotCQkJY2FzZSBMSVRFUkFMX3N0cmluZzoNCi0JCQljYXNlIExJVEVSQUxfd3N0cmluZzoNCi0JCQljYXNlIExJVEVSQUxfdm9pZDoNCi0JCQljYXNlIExJVEVSQUxfVmFsdWVCYXNlOg0KLQkJCXsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWRlZmF1bHQ6DQotCQkJew0KLQkJCQl0aHJvdyBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oTFQoMSksIGdldEZpbGVuYW1lKCkpOw0KLQkJCX0NCi0JCQl9DQotCQkJfQ0KLQkJCW9wX3R5cGVfc3BlYygpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQlBU1QgdG1wNDJfQVNUID0gbnVsbDsNCi0JCQl0bXA0Ml9BU1QgPSBhc3RGYWN0b3J5LmNyZWF0ZShMVCgxKSk7DQotCQkJYXN0RmFjdG9yeS5tYWtlQVNUUm9vdChjdXJyZW50QVNULCB0bXA0Ml9BU1QpOw0KLQkJCW1hdGNoKElERU5UKTsNCi0JCQlwYXJhbWV0ZXJfZGNscygpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQl7DQotCQkJc3dpdGNoICggTEEoMSkpIHsNCi0JCQljYXNlIExJVEVSQUxfcmFpc2VzOg0KLQkJCXsNCi0JCQkJcmFpc2VzX2V4cHIoKTsNCi0JCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJY2FzZSBTRU1JOg0KLQkJCWNhc2UgTElURVJBTF9jb250ZXh0Og0KLQkJCXsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWRlZmF1bHQ6DQotCQkJew0KLQkJCQl0aHJvdyBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oTFQoMSksIGdldEZpbGVuYW1lKCkpOw0KLQkJCX0NCi0JCQl9DQotCQkJfQ0KLQkJCXsNCi0JCQlzd2l0Y2ggKCBMQSgxKSkgew0KLQkJCWNhc2UgTElURVJBTF9jb250ZXh0Og0KLQkJCXsNCi0JCQkJY29udGV4dF9leHByKCk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWNhc2UgU0VNSToNCi0JCQl7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQlkZWZhdWx0Og0KLQkJCXsNCi0JCQkJdGhyb3cgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKExUKDEpLCBnZXRGaWxlbmFtZSgpKTsNCi0JCQl9DQotCQkJfQ0KLQkJCX0NCi0JCQlvcF9kY2xfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzEwKTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gb3BfZGNsX0FTVDsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgc2NvcGVkX25hbWVfbGlzdCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBzY29wZWRfbmFtZV9saXN0X0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJc2NvcGVkX25hbWUoKTsNCi0JCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJew0KLQkJCV9sb29wMzY6DQotCQkJZG8gew0KLQkJCQlpZiAoKExBKDEpPT1DT01NQSkpIHsNCi0JCQkJCW1hdGNoKENPTU1BKTsNCi0JCQkJCXNjb3BlZF9uYW1lKCk7DQotCQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCX0NCi0JCQkJZWxzZSB7DQotCQkJCQlicmVhayBfbG9vcDM2Ow0KLQkJCQl9DQotCQkJCQ0KLQkJCX0gd2hpbGUgKHRydWUpOw0KLQkJCX0NCi0JCQlzY29wZWRfbmFtZV9saXN0X0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJfQ0KLQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJcmVwb3J0RXJyb3IoZXgpOw0KLQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF8xNyk7DQotCQkJfSBlbHNlIHsNCi0JCQkgIHRocm93IGV4Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybkFTVCA9IHNjb3BlZF9uYW1lX2xpc3RfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBpbnRlcmZhY2VfbmFtZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBpbnRlcmZhY2VfbmFtZV9BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCXNjb3BlZF9uYW1lKCk7DQotCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCWludGVyZmFjZV9uYW1lX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJfQ0KLQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJcmVwb3J0RXJyb3IoZXgpOw0KLQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF8xOCk7DQotCQkJfSBlbHNlIHsNCi0JCQkgIHRocm93IGV4Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybkFTVCA9IGludGVyZmFjZV9uYW1lX0FTVDsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgc2NvcGVkX25hbWUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCQ0KLQkJcmV0dXJuQVNUID0gbnVsbDsNCi0JCUFTVFBhaXIgY3VycmVudEFTVCA9IG5ldyBBU1RQYWlyKCk7DQotCQlBU1Qgc2NvcGVkX25hbWVfQVNUID0gbnVsbDsNCi0JCQ0KLQkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcNCi0JCQl7DQotCQkJc3dpdGNoICggTEEoMSkpIHsNCi0JCQljYXNlIFNDT1BFT1A6DQotCQkJew0KLQkJCQlBU1QgdG1wNDRfQVNUID0gbnVsbDsNCi0JCQkJdG1wNDRfQVNUID0gYXN0RmFjdG9yeS5jcmVhdGUoTFQoMSkpOw0KLQkJCQlhc3RGYWN0b3J5Lm1ha2VBU1RSb290KGN1cnJlbnRBU1QsIHRtcDQ0X0FTVCk7DQotCQkJCW1hdGNoKFNDT1BFT1ApOw0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJY2FzZSBJREVOVDoNCi0JCQl7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQlkZWZhdWx0Og0KLQkJCXsNCi0JCQkJdGhyb3cgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKExUKDEpLCBnZXRGaWxlbmFtZSgpKTsNCi0JCQl9DQotCQkJfQ0KLQkJCX0NCi0JCQlBU1QgdG1wNDVfQVNUID0gbnVsbDsNCi0JCQl0bXA0NV9BU1QgPSBhc3RGYWN0b3J5LmNyZWF0ZShMVCgxKSk7DQotCQkJYXN0RmFjdG9yeS5tYWtlQVNUUm9vdChjdXJyZW50QVNULCB0bXA0NV9BU1QpOw0KLQkJCW1hdGNoKElERU5UKTsNCi0JCQl7DQotCQkJX2xvb3A0MDoNCi0JCQlkbyB7DQotCQkJCWlmICgoTEEoMSk9PVNDT1BFT1ApKSB7DQotCQkJCQltYXRjaChTQ09QRU9QKTsNCi0JCQkJCWlkZW50aWZpZXIoKTsNCi0JCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJfQ0KLQkJCQllbHNlIHsNCi0JCQkJCWJyZWFrIF9sb29wNDA7DQotCQkJCX0NCi0JCQkJDQotCQkJfSB3aGlsZSAodHJ1ZSk7DQotCQkJfQ0KLQkJCXNjb3BlZF9uYW1lX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJfQ0KLQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJcmVwb3J0RXJyb3IoZXgpOw0KLQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF8xOSk7DQotCQkJfSBlbHNlIHsNCi0JCQkgIHRocm93IGV4Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybkFTVCA9IHNjb3BlZF9uYW1lX0FTVDsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgdmFsdWVfZGNsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQkNCi0JCXJldHVybkFTVCA9IG51bGw7DQotCQlBU1RQYWlyIGN1cnJlbnRBU1QgPSBuZXcgQVNUUGFpcigpOw0KLQkJQVNUIHZhbHVlX2RjbF9BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCUFTVCB0bXA0N19BU1QgPSBudWxsOw0KLQkJCXRtcDQ3X0FTVCA9IGFzdEZhY3RvcnkuY3JlYXRlKExUKDEpKTsNCi0JCQlhc3RGYWN0b3J5Lm1ha2VBU1RSb290KGN1cnJlbnRBU1QsIHRtcDQ3X0FTVCk7DQotCQkJbWF0Y2goTElURVJBTF92YWx1ZXR5cGUpOw0KLQkJCWlkZW50aWZpZXIoKTsNCi0JCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJdmFsdWVfaW5oZXJpdGFuY2Vfc3BlYygpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQltYXRjaChMQ1VSTFkpOw0KLQkJCXsNCi0JCQlfbG9vcDUyOg0KLQkJCWRvIHsNCi0JCQkJaWYgKChfdG9rZW5TZXRfMjAubWVtYmVyKExBKDEpKSkpIHsNCi0JCQkJCXZhbHVlX2VsZW1lbnQoKTsNCi0JCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJfQ0KLQkJCQllbHNlIHsNCi0JCQkJCWJyZWFrIF9sb29wNTI7DQotCQkJCX0NCi0JCQkJDQotCQkJfSB3aGlsZSAodHJ1ZSk7DQotCQkJfQ0KLQkJCW1hdGNoKFJDVVJMWSk7DQotCQkJdmFsdWVfZGNsX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJfQ0KLQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJcmVwb3J0RXJyb3IoZXgpOw0KLQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF8xMCk7DQotCQkJfSBlbHNlIHsNCi0JCQkgIHRocm93IGV4Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybkFTVCA9IHZhbHVlX2RjbF9BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIHZhbHVlX2Fic19kY2woKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCQ0KLQkJcmV0dXJuQVNUID0gbnVsbDsNCi0JCUFTVFBhaXIgY3VycmVudEFTVCA9IG5ldyBBU1RQYWlyKCk7DQotCQlBU1QgdmFsdWVfYWJzX2RjbF9BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCUFTVCB0bXA1MF9BU1QgPSBudWxsOw0KLQkJCXRtcDUwX0FTVCA9IGFzdEZhY3RvcnkuY3JlYXRlKExUKDEpKTsNCi0JCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHRtcDUwX0FTVCk7DQotCQkJbWF0Y2goTElURVJBTF9hYnN0cmFjdCk7DQotCQkJQVNUIHRtcDUxX0FTVCA9IG51bGw7DQotCQkJdG1wNTFfQVNUID0gYXN0RmFjdG9yeS5jcmVhdGUoTFQoMSkpOw0KLQkJCWFzdEZhY3RvcnkubWFrZUFTVFJvb3QoY3VycmVudEFTVCwgdG1wNTFfQVNUKTsNCi0JCQltYXRjaChMSVRFUkFMX3ZhbHVldHlwZSk7DQotCQkJaWRlbnRpZmllcigpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQl7DQotCQkJc3dpdGNoICggTEEoMSkpIHsNCi0JCQljYXNlIExDVVJMWToNCi0JCQljYXNlIENPTE9OOg0KLQkJCWNhc2UgTElURVJBTF9zdXBwb3J0czoNCi0JCQl7DQotCQkJCXZhbHVlX2Fic19mdWxsX2RjbCgpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIFNFTUk6DQotCQkJew0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJZGVmYXVsdDoNCi0JCQl7DQotCQkJCXRocm93IG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihMVCgxKSwgZ2V0RmlsZW5hbWUoKSk7DQotCQkJfQ0KLQkJCX0NCi0JCQl9DQotCQkJdmFsdWVfYWJzX2RjbF9BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCX0NCi0JCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgew0KLQkJCWlmIChpbnB1dFN0YXRlLmd1ZXNzaW5nPT0wKSB7DQotCQkJCXJlcG9ydEVycm9yKGV4KTsNCi0JCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfMTApOw0KLQkJCX0gZWxzZSB7DQotCQkJICB0aHJvdyBleDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm5BU1QgPSB2YWx1ZV9hYnNfZGNsX0FTVDsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgdmFsdWVfYm94X2RjbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCB2YWx1ZV9ib3hfZGNsX0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJQVNUIHRtcDUyX0FTVCA9IG51bGw7DQotCQkJdG1wNTJfQVNUID0gYXN0RmFjdG9yeS5jcmVhdGUoTFQoMSkpOw0KLQkJCWFzdEZhY3RvcnkubWFrZUFTVFJvb3QoY3VycmVudEFTVCwgdG1wNTJfQVNUKTsNCi0JCQltYXRjaChMSVRFUkFMX3ZhbHVldHlwZSk7DQotCQkJaWRlbnRpZmllcigpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQl0eXBlX3NwZWMoKTsNCi0JCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJdmFsdWVfYm94X2RjbF9BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCX0NCi0JCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgew0KLQkJCWlmIChpbnB1dFN0YXRlLmd1ZXNzaW5nPT0wKSB7DQotCQkJCXJlcG9ydEVycm9yKGV4KTsNCi0JCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfMTApOw0KLQkJCX0gZWxzZSB7DQotCQkJICB0aHJvdyBleDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm5BU1QgPSB2YWx1ZV9ib3hfZGNsX0FTVDsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgdmFsdWVfY3VzdG9tX2RjbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCB2YWx1ZV9jdXN0b21fZGNsX0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJQVNUIHRtcDUzX0FTVCA9IG51bGw7DQotCQkJdG1wNTNfQVNUID0gYXN0RmFjdG9yeS5jcmVhdGUoTFQoMSkpOw0KLQkJCWFzdEZhY3RvcnkubWFrZUFTVFJvb3QoY3VycmVudEFTVCwgdG1wNTNfQVNUKTsNCi0JCQltYXRjaChMSVRFUkFMX2N1c3RvbSk7DQotCQkJdmFsdWVfZGNsKCk7DQotCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCXZhbHVlX2N1c3RvbV9kY2xfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzEwKTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gdmFsdWVfY3VzdG9tX2RjbF9BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIHZhbHVlX2ZvcndhcmRfZGNsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQkNCi0JCXJldHVybkFTVCA9IG51bGw7DQotCQlBU1RQYWlyIGN1cnJlbnRBU1QgPSBuZXcgQVNUUGFpcigpOw0KLQkJQVNUIHZhbHVlX2ZvcndhcmRfZGNsX0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJQVNUIHRtcDU0X0FTVCA9IG51bGw7DQotCQkJdG1wNTRfQVNUID0gYXN0RmFjdG9yeS5jcmVhdGUoTFQoMSkpOw0KLQkJCWFzdEZhY3RvcnkubWFrZUFTVFJvb3QoY3VycmVudEFTVCwgdG1wNTRfQVNUKTsNCi0JCQltYXRjaChMSVRFUkFMX3ZhbHVldHlwZSk7DQotCQkJaWRlbnRpZmllcigpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQl2YWx1ZV9mb3J3YXJkX2RjbF9BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCX0NCi0JCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgew0KLQkJCWlmIChpbnB1dFN0YXRlLmd1ZXNzaW5nPT0wKSB7DQotCQkJCXJlcG9ydEVycm9yKGV4KTsNCi0JCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfMTApOw0KLQkJCX0gZWxzZSB7DQotCQkJICB0aHJvdyBleDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm5BU1QgPSB2YWx1ZV9mb3J3YXJkX2RjbF9BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIHR5cGVfc3BlYygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCB0eXBlX3NwZWNfQVNUID0gbnVsbDsNCi0JCQ0KLQkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcNCi0JCQlzd2l0Y2ggKCBMQSgxKSkgew0KLQkJCWNhc2UgU0NPUEVPUDoNCi0JCQljYXNlIElERU5UOg0KLQkJCWNhc2UgTElURVJBTF9mbG9hdDoNCi0JCQljYXNlIExJVEVSQUxfZG91YmxlOg0KLQkJCWNhc2UgTElURVJBTF9sb25nOg0KLQkJCWNhc2UgTElURVJBTF9zaG9ydDoNCi0JCQljYXNlIExJVEVSQUxfdW5zaWduZWQ6DQotCQkJY2FzZSBMSVRFUkFMX2NoYXI6DQotCQkJY2FzZSBMSVRFUkFMX3djaGFyOg0KLQkJCWNhc2UgTElURVJBTF9ib29sZWFuOg0KLQkJCWNhc2UgTElURVJBTF9vY3RldDoNCi0JCQljYXNlIExJVEVSQUxfYW55Og0KLQkJCWNhc2UgTElURVJBTF9PYmplY3Q6DQotCQkJY2FzZSBMSVRFUkFMX3NlcXVlbmNlOg0KLQkJCWNhc2UgTElURVJBTF9zdHJpbmc6DQotCQkJY2FzZSBMSVRFUkFMX3dzdHJpbmc6DQotCQkJY2FzZSBMSVRFUkFMX2ZpeGVkOg0KLQkJCWNhc2UgTElURVJBTF9WYWx1ZUJhc2U6DQotCQkJew0KLQkJCQlzaW1wbGVfdHlwZV9zcGVjKCk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJdHlwZV9zcGVjX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJY2FzZSBMSVRFUkFMX3N0cnVjdDoNCi0JCQljYXNlIExJVEVSQUxfdW5pb246DQotCQkJY2FzZSBMSVRFUkFMX2VudW06DQotCQkJew0KLQkJCQljb25zdHJfdHlwZV9zcGVjKCk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJdHlwZV9zcGVjX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJZGVmYXVsdDoNCi0JCQl7DQotCQkJCXRocm93IG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihMVCgxKSwgZ2V0RmlsZW5hbWUoKSk7DQotCQkJfQ0KLQkJCX0NCi0JCX0NCi0JCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgew0KLQkJCWlmIChpbnB1dFN0YXRlLmd1ZXNzaW5nPT0wKSB7DQotCQkJCXJlcG9ydEVycm9yKGV4KTsNCi0JCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfMjEpOw0KLQkJCX0gZWxzZSB7DQotCQkJICB0aHJvdyBleDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm5BU1QgPSB0eXBlX3NwZWNfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCB2YWx1ZV9hYnNfZnVsbF9kY2woKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCQ0KLQkJcmV0dXJuQVNUID0gbnVsbDsNCi0JCUFTVFBhaXIgY3VycmVudEFTVCA9IG5ldyBBU1RQYWlyKCk7DQotCQlBU1QgdmFsdWVfYWJzX2Z1bGxfZGNsX0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJdmFsdWVfaW5oZXJpdGFuY2Vfc3BlYygpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQltYXRjaChMQ1VSTFkpOw0KLQkJCXsNCi0JCQlfbG9vcDQ5Og0KLQkJCWRvIHsNCi0JCQkJaWYgKChfdG9rZW5TZXRfMTUubWVtYmVyKExBKDEpKSkpIHsNCi0JCQkJCWV4cG9ydCgpOw0KLQkJCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQl9DQotCQkJCWVsc2Ugew0KLQkJCQkJYnJlYWsgX2xvb3A0OTsNCi0JCQkJfQ0KLQkJCQkNCi0JCQl9IHdoaWxlICh0cnVlKTsNCi0JCQl9DQotCQkJbWF0Y2goUkNVUkxZKTsNCi0JCQl2YWx1ZV9hYnNfZnVsbF9kY2xfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzEwKTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gdmFsdWVfYWJzX2Z1bGxfZGNsX0FTVDsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgdmFsdWVfaW5oZXJpdGFuY2Vfc3BlYygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCB2YWx1ZV9pbmhlcml0YW5jZV9zcGVjX0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJew0KLQkJCXN3aXRjaCAoIExBKDEpKSB7DQotCQkJY2FzZSBDT0xPTjoNCi0JCQl7DQotCQkJCXZhbHVlX3ZhbHVlX2luaGVyaXRhbmNlX3NwZWMoKTsNCi0JCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJY2FzZSBMQ1VSTFk6DQotCQkJY2FzZSBMSVRFUkFMX3N1cHBvcnRzOg0KLQkJCXsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWRlZmF1bHQ6DQotCQkJew0KLQkJCQl0aHJvdyBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oTFQoMSksIGdldEZpbGVuYW1lKCkpOw0KLQkJCX0NCi0JCQl9DQotCQkJfQ0KLQkJCXsNCi0JCQlzd2l0Y2ggKCBMQSgxKSkgew0KLQkJCWNhc2UgTElURVJBTF9zdXBwb3J0czoNCi0JCQl7DQotCQkJCXZhbHVlX2ludGVyZmFjZV9pbmhlcml0YW5jZV9zcGVjKCk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWNhc2UgTENVUkxZOg0KLQkJCXsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWRlZmF1bHQ6DQotCQkJew0KLQkJCQl0aHJvdyBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oTFQoMSksIGdldEZpbGVuYW1lKCkpOw0KLQkJCX0NCi0JCQl9DQotCQkJfQ0KLQkJCXZhbHVlX2luaGVyaXRhbmNlX3NwZWNfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzE0KTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gdmFsdWVfaW5oZXJpdGFuY2Vfc3BlY19BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIHZhbHVlX2VsZW1lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCQ0KLQkJcmV0dXJuQVNUID0gbnVsbDsNCi0JCUFTVFBhaXIgY3VycmVudEFTVCA9IG5ldyBBU1RQYWlyKCk7DQotCQlBU1QgdmFsdWVfZWxlbWVudF9BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCXsNCi0JCQlzd2l0Y2ggKCBMQSgxKSkgew0KLQkJCWNhc2UgUFJFUFJPQ19ESVJFQ1RJVkU6DQotCQkJY2FzZSBTQ09QRU9QOg0KLQkJCWNhc2UgSURFTlQ6DQotCQkJY2FzZSBMSVRFUkFMX2NvbnN0Og0KLQkJCWNhc2UgTElURVJBTF90eXBlZGVmOg0KLQkJCWNhc2UgTElURVJBTF9uYXRpdmU6DQotCQkJY2FzZSBMSVRFUkFMX2Zsb2F0Og0KLQkJCWNhc2UgTElURVJBTF9kb3VibGU6DQotCQkJY2FzZSBMSVRFUkFMX2xvbmc6DQotCQkJY2FzZSBMSVRFUkFMX3Nob3J0Og0KLQkJCWNhc2UgTElURVJBTF91bnNpZ25lZDoNCi0JCQljYXNlIExJVEVSQUxfY2hhcjoNCi0JCQljYXNlIExJVEVSQUxfd2NoYXI6DQotCQkJY2FzZSBMSVRFUkFMX2Jvb2xlYW46DQotCQkJY2FzZSBMSVRFUkFMX29jdGV0Og0KLQkJCWNhc2UgTElURVJBTF9hbnk6DQotCQkJY2FzZSBMSVRFUkFMX09iamVjdDoNCi0JCQljYXNlIExJVEVSQUxfc3RydWN0Og0KLQkJCWNhc2UgTElURVJBTF91bmlvbjoNCi0JCQljYXNlIExJVEVSQUxfZW51bToNCi0JCQljYXNlIExJVEVSQUxfc3RyaW5nOg0KLQkJCWNhc2UgTElURVJBTF93c3RyaW5nOg0KLQkJCWNhc2UgTElURVJBTF9leGNlcHRpb246DQotCQkJY2FzZSBMSVRFUkFMX29uZXdheToNCi0JCQljYXNlIExJVEVSQUxfdm9pZDoNCi0JCQljYXNlIExJVEVSQUxfVmFsdWVCYXNlOg0KLQkJCWNhc2UgTElURVJBTF90eXBlaWQ6DQotCQkJY2FzZSBMSVRFUkFMX3R5cGVwcmVmaXg6DQotCQkJY2FzZSBMSVRFUkFMX3JlYWRvbmx5Og0KLQkJCWNhc2UgTElURVJBTF9hdHRyaWJ1dGU6DQotCQkJew0KLQkJCQlleHBvcnQoKTsNCi0JCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJY2FzZSBMSVRFUkFMX3B1YmxpYzoNCi0JCQljYXNlIExJVEVSQUxfcHJpdmF0ZToNCi0JCQl7DQotCQkJCXN0YXRlX21lbWJlcigpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIExJVEVSQUxfZmFjdG9yeToNCi0JCQl7DQotCQkJCWluaXRfZGNsKCk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWRlZmF1bHQ6DQotCQkJew0KLQkJCQl0aHJvdyBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oTFQoMSksIGdldEZpbGVuYW1lKCkpOw0KLQkJCX0NCi0JCQl9DQotCQkJfQ0KLQkJCXZhbHVlX2VsZW1lbnRfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzIyKTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gdmFsdWVfZWxlbWVudF9BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIHZhbHVlX3ZhbHVlX2luaGVyaXRhbmNlX3NwZWMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCQ0KLQkJcmV0dXJuQVNUID0gbnVsbDsNCi0JCUFTVFBhaXIgY3VycmVudEFTVCA9IG5ldyBBU1RQYWlyKCk7DQotCQlBU1QgdmFsdWVfdmFsdWVfaW5oZXJpdGFuY2Vfc3BlY19BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCUFTVCB0bXA1N19BU1QgPSBudWxsOw0KLQkJCXRtcDU3X0FTVCA9IGFzdEZhY3RvcnkuY3JlYXRlKExUKDEpKTsNCi0JCQlhc3RGYWN0b3J5Lm1ha2VBU1RSb290KGN1cnJlbnRBU1QsIHRtcDU3X0FTVCk7DQotCQkJbWF0Y2goQ09MT04pOw0KLQkJCXsNCi0JCQlzd2l0Y2ggKCBMQSgxKSkgew0KLQkJCWNhc2UgTElURVJBTF90cnVuY2F0YWJsZToNCi0JCQl7DQotCQkJCUFTVCB0bXA1OF9BU1QgPSBudWxsOw0KLQkJCQl0bXA1OF9BU1QgPSBhc3RGYWN0b3J5LmNyZWF0ZShMVCgxKSk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgdG1wNThfQVNUKTsNCi0JCQkJbWF0Y2goTElURVJBTF90cnVuY2F0YWJsZSk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIFNDT1BFT1A6DQotCQkJY2FzZSBJREVOVDoNCi0JCQl7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQlkZWZhdWx0Og0KLQkJCXsNCi0JCQkJdGhyb3cgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKExUKDEpLCBnZXRGaWxlbmFtZSgpKTsNCi0JCQl9DQotCQkJfQ0KLQkJCX0NCi0JCQl2YWx1ZV9uYW1lKCk7DQotCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCXsNCi0JCQlfbG9vcDYwOg0KLQkJCWRvIHsNCi0JCQkJaWYgKChMQSgxKT09Q09NTUEpKSB7DQotCQkJCQltYXRjaChDT01NQSk7DQotCQkJCQl2YWx1ZV9uYW1lKCk7DQotCQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCX0NCi0JCQkJZWxzZSB7DQotCQkJCQlicmVhayBfbG9vcDYwOw0KLQkJCQl9DQotCQkJCQ0KLQkJCX0gd2hpbGUgKHRydWUpOw0KLQkJCX0NCi0JCQl2YWx1ZV92YWx1ZV9pbmhlcml0YW5jZV9zcGVjX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJfQ0KLQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJcmVwb3J0RXJyb3IoZXgpOw0KLQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF8yMyk7DQotCQkJfSBlbHNlIHsNCi0JCQkgIHRocm93IGV4Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybkFTVCA9IHZhbHVlX3ZhbHVlX2luaGVyaXRhbmNlX3NwZWNfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCB2YWx1ZV9pbnRlcmZhY2VfaW5oZXJpdGFuY2Vfc3BlYygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCB2YWx1ZV9pbnRlcmZhY2VfaW5oZXJpdGFuY2Vfc3BlY19BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCUFTVCB0bXA2MF9BU1QgPSBudWxsOw0KLQkJCXRtcDYwX0FTVCA9IGFzdEZhY3RvcnkuY3JlYXRlKExUKDEpKTsNCi0JCQlhc3RGYWN0b3J5Lm1ha2VBU1RSb290KGN1cnJlbnRBU1QsIHRtcDYwX0FTVCk7DQotCQkJbWF0Y2goTElURVJBTF9zdXBwb3J0cyk7DQotCQkJaW50ZXJmYWNlX25hbWUoKTsNCi0JCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJew0KLQkJCV9sb29wNjM6DQotCQkJZG8gew0KLQkJCQlpZiAoKExBKDEpPT1DT01NQSkpIHsNCi0JCQkJCW1hdGNoKENPTU1BKTsNCi0JCQkJCWludGVyZmFjZV9uYW1lKCk7DQotCQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCX0NCi0JCQkJZWxzZSB7DQotCQkJCQlicmVhayBfbG9vcDYzOw0KLQkJCQl9DQotCQkJCQ0KLQkJCX0gd2hpbGUgKHRydWUpOw0KLQkJCX0NCi0JCQl2YWx1ZV9pbnRlcmZhY2VfaW5oZXJpdGFuY2Vfc3BlY19BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCX0NCi0JCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgew0KLQkJCWlmIChpbnB1dFN0YXRlLmd1ZXNzaW5nPT0wKSB7DQotCQkJCXJlcG9ydEVycm9yKGV4KTsNCi0JCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfMTQpOw0KLQkJCX0gZWxzZSB7DQotCQkJICB0aHJvdyBleDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm5BU1QgPSB2YWx1ZV9pbnRlcmZhY2VfaW5oZXJpdGFuY2Vfc3BlY19BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIHZhbHVlX25hbWUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCQ0KLQkJcmV0dXJuQVNUID0gbnVsbDsNCi0JCUFTVFBhaXIgY3VycmVudEFTVCA9IG5ldyBBU1RQYWlyKCk7DQotCQlBU1QgdmFsdWVfbmFtZV9BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCXNjb3BlZF9uYW1lKCk7DQotCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCXZhbHVlX25hbWVfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzI0KTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gdmFsdWVfbmFtZV9BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIHN0YXRlX21lbWJlcigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBzdGF0ZV9tZW1iZXJfQVNUID0gbnVsbDsNCi0JCQ0KLQkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcNCi0JCQl7DQotCQkJc3dpdGNoICggTEEoMSkpIHsNCi0JCQljYXNlIExJVEVSQUxfcHVibGljOg0KLQkJCXsNCi0JCQkJQVNUIHRtcDYyX0FTVCA9IG51bGw7DQotCQkJCXRtcDYyX0FTVCA9IGFzdEZhY3RvcnkuY3JlYXRlKExUKDEpKTsNCi0JCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCB0bXA2Ml9BU1QpOw0KLQkJCQltYXRjaChMSVRFUkFMX3B1YmxpYyk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIExJVEVSQUxfcHJpdmF0ZToNCi0JCQl7DQotCQkJCUFTVCB0bXA2M19BU1QgPSBudWxsOw0KLQkJCQl0bXA2M19BU1QgPSBhc3RGYWN0b3J5LmNyZWF0ZShMVCgxKSk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgdG1wNjNfQVNUKTsNCi0JCQkJbWF0Y2goTElURVJBTF9wcml2YXRlKTsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWRlZmF1bHQ6DQotCQkJew0KLQkJCQl0aHJvdyBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oTFQoMSksIGdldEZpbGVuYW1lKCkpOw0KLQkJCX0NCi0JCQl9DQotCQkJfQ0KLQkJCXR5cGVfc3BlYygpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQlkZWNsYXJhdG9ycygpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQltYXRjaChTRU1JKTsNCi0JCQlzdGF0ZV9tZW1iZXJfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzIyKTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gc3RhdGVfbWVtYmVyX0FTVDsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgaW5pdF9kY2woKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCQ0KLQkJcmV0dXJuQVNUID0gbnVsbDsNCi0JCUFTVFBhaXIgY3VycmVudEFTVCA9IG5ldyBBU1RQYWlyKCk7DQotCQlBU1QgaW5pdF9kY2xfQVNUID0gbnVsbDsNCi0JCQ0KLQkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcNCi0JCQlBU1QgdG1wNjVfQVNUID0gbnVsbDsNCi0JCQl0bXA2NV9BU1QgPSBhc3RGYWN0b3J5LmNyZWF0ZShMVCgxKSk7DQotCQkJYXN0RmFjdG9yeS5tYWtlQVNUUm9vdChjdXJyZW50QVNULCB0bXA2NV9BU1QpOw0KLQkJCW1hdGNoKExJVEVSQUxfZmFjdG9yeSk7DQotCQkJaWRlbnRpZmllcigpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQltYXRjaChMUEFSRU4pOw0KLQkJCXsNCi0JCQlzd2l0Y2ggKCBMQSgxKSkgew0KLQkJCWNhc2UgTElURVJBTF9pbjoNCi0JCQl7DQotCQkJCWluaXRfcGFyYW1fZGVjbHMoKTsNCi0JCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJY2FzZSBSUEFSRU46DQotCQkJew0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJZGVmYXVsdDoNCi0JCQl7DQotCQkJCXRocm93IG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihMVCgxKSwgZ2V0RmlsZW5hbWUoKSk7DQotCQkJfQ0KLQkJCX0NCi0JCQl9DQotCQkJbWF0Y2goUlBBUkVOKTsNCi0JCQl7DQotCQkJc3dpdGNoICggTEEoMSkpIHsNCi0JCQljYXNlIExJVEVSQUxfcmFpc2VzOg0KLQkJCXsNCi0JCQkJcmFpc2VzX2V4cHIoKTsNCi0JCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJY2FzZSBTRU1JOg0KLQkJCXsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWRlZmF1bHQ6DQotCQkJew0KLQkJCQl0aHJvdyBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oTFQoMSksIGdldEZpbGVuYW1lKCkpOw0KLQkJCX0NCi0JCQl9DQotCQkJfQ0KLQkJCW1hdGNoKFNFTUkpOw0KLQkJCWluaXRfZGNsX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJfQ0KLQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJcmVwb3J0RXJyb3IoZXgpOw0KLQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF8yMik7DQotCQkJfSBlbHNlIHsNCi0JCQkgIHRocm93IGV4Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybkFTVCA9IGluaXRfZGNsX0FTVDsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgZGVjbGFyYXRvcnMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCQ0KLQkJcmV0dXJuQVNUID0gbnVsbDsNCi0JCUFTVFBhaXIgY3VycmVudEFTVCA9IG5ldyBBU1RQYWlyKCk7DQotCQlBU1QgZGVjbGFyYXRvcnNfQVNUID0gbnVsbDsNCi0JCQ0KLQkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcNCi0JCQlkZWNsYXJhdG9yKCk7DQotCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCXsNCi0JCQlfbG9vcDEyNDoNCi0JCQlkbyB7DQotCQkJCWlmICgoTEEoMSk9PUNPTU1BKSkgew0KLQkJCQkJbWF0Y2goQ09NTUEpOw0KLQkJCQkJZGVjbGFyYXRvcigpOw0KLQkJCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQl9DQotCQkJCWVsc2Ugew0KLQkJCQkJYnJlYWsgX2xvb3AxMjQ7DQotCQkJCX0NCi0JCQkJDQotCQkJfSB3aGlsZSAodHJ1ZSk7DQotCQkJfQ0KLQkJCWRlY2xhcmF0b3JzX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJfQ0KLQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJcmVwb3J0RXJyb3IoZXgpOw0KLQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF8xMCk7DQotCQkJfSBlbHNlIHsNCi0JCQkgIHRocm93IGV4Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybkFTVCA9IGRlY2xhcmF0b3JzX0FTVDsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgaW5pdF9wYXJhbV9kZWNscygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBpbml0X3BhcmFtX2RlY2xzX0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJaW5pdF9wYXJhbV9kZWNsKCk7DQotCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCXsNCi0JCQlfbG9vcDc0Og0KLQkJCWRvIHsNCi0JCQkJaWYgKChMQSgxKT09Q09NTUEpKSB7DQotCQkJCQltYXRjaChDT01NQSk7DQotCQkJCQlpbml0X3BhcmFtX2RlY2woKTsNCi0JCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJfQ0KLQkJCQllbHNlIHsNCi0JCQkJCWJyZWFrIF9sb29wNzQ7DQotCQkJCX0NCi0JCQkJDQotCQkJfSB3aGlsZSAodHJ1ZSk7DQotCQkJfQ0KLQkJCWluaXRfcGFyYW1fZGVjbHNfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzI1KTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gaW5pdF9wYXJhbV9kZWNsc19BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIHJhaXNlc19leHByKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQkNCi0JCXJldHVybkFTVCA9IG51bGw7DQotCQlBU1RQYWlyIGN1cnJlbnRBU1QgPSBuZXcgQVNUUGFpcigpOw0KLQkJQVNUIHJhaXNlc19leHByX0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJQVNUIHRtcDcxX0FTVCA9IG51bGw7DQotCQkJdG1wNzFfQVNUID0gYXN0RmFjdG9yeS5jcmVhdGUoTFQoMSkpOw0KLQkJCWFzdEZhY3RvcnkubWFrZUFTVFJvb3QoY3VycmVudEFTVCwgdG1wNzFfQVNUKTsNCi0JCQltYXRjaChMSVRFUkFMX3JhaXNlcyk7DQotCQkJbWF0Y2goTFBBUkVOKTsNCi0JCQlzY29wZWRfbmFtZV9saXN0KCk7DQotCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCW1hdGNoKFJQQVJFTik7DQotCQkJcmFpc2VzX2V4cHJfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzI2KTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gcmFpc2VzX2V4cHJfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBpbml0X3BhcmFtX2RlY2woKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCQ0KLQkJcmV0dXJuQVNUID0gbnVsbDsNCi0JCUFTVFBhaXIgY3VycmVudEFTVCA9IG5ldyBBU1RQYWlyKCk7DQotCQlBU1QgaW5pdF9wYXJhbV9kZWNsX0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJaW5pdF9wYXJhbV9hdHRyaWJ1dGUoKTsNCi0JCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJcGFyYW1fdHlwZV9zcGVjKCk7DQotCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCXNpbXBsZV9kZWNsYXJhdG9yKCk7DQotCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCWluaXRfcGFyYW1fZGVjbF9BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCX0NCi0JCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgew0KLQkJCWlmIChpbnB1dFN0YXRlLmd1ZXNzaW5nPT0wKSB7DQotCQkJCXJlcG9ydEVycm9yKGV4KTsNCi0JCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfMjcpOw0KLQkJCX0gZWxzZSB7DQotCQkJICB0aHJvdyBleDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm5BU1QgPSBpbml0X3BhcmFtX2RlY2xfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBpbml0X3BhcmFtX2F0dHJpYnV0ZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBpbml0X3BhcmFtX2F0dHJpYnV0ZV9BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCUFTVCB0bXA3NF9BU1QgPSBudWxsOw0KLQkJCXRtcDc0X0FTVCA9IGFzdEZhY3RvcnkuY3JlYXRlKExUKDEpKTsNCi0JCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHRtcDc0X0FTVCk7DQotCQkJbWF0Y2goTElURVJBTF9pbik7DQotCQkJaW5pdF9wYXJhbV9hdHRyaWJ1dGVfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzI4KTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gaW5pdF9wYXJhbV9hdHRyaWJ1dGVfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBwYXJhbV90eXBlX3NwZWMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCQ0KLQkJcmV0dXJuQVNUID0gbnVsbDsNCi0JCUFTVFBhaXIgY3VycmVudEFTVCA9IG5ldyBBU1RQYWlyKCk7DQotCQlBU1QgcGFyYW1fdHlwZV9zcGVjX0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJc3dpdGNoICggTEEoMSkpIHsNCi0JCQljYXNlIExJVEVSQUxfZmxvYXQ6DQotCQkJY2FzZSBMSVRFUkFMX2RvdWJsZToNCi0JCQljYXNlIExJVEVSQUxfbG9uZzoNCi0JCQljYXNlIExJVEVSQUxfc2hvcnQ6DQotCQkJY2FzZSBMSVRFUkFMX3Vuc2lnbmVkOg0KLQkJCWNhc2UgTElURVJBTF9jaGFyOg0KLQkJCWNhc2UgTElURVJBTF93Y2hhcjoNCi0JCQljYXNlIExJVEVSQUxfYm9vbGVhbjoNCi0JCQljYXNlIExJVEVSQUxfb2N0ZXQ6DQotCQkJY2FzZSBMSVRFUkFMX2FueToNCi0JCQljYXNlIExJVEVSQUxfT2JqZWN0Og0KLQkJCWNhc2UgTElURVJBTF9WYWx1ZUJhc2U6DQotCQkJew0KLQkJCQliYXNlX3R5cGVfc3BlYygpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCXBhcmFtX3R5cGVfc3BlY19BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWNhc2UgTElURVJBTF9zdHJpbmc6DQotCQkJew0KLQkJCQlzdHJpbmdfdHlwZSgpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCXBhcmFtX3R5cGVfc3BlY19BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWNhc2UgTElURVJBTF93c3RyaW5nOg0KLQkJCXsNCi0JCQkJd2lkZV9zdHJpbmdfdHlwZSgpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCXBhcmFtX3R5cGVfc3BlY19BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWNhc2UgU0NPUEVPUDoNCi0JCQljYXNlIElERU5UOg0KLQkJCXsNCi0JCQkJc2NvcGVkX25hbWUoKTsNCi0JCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQlwYXJhbV90eXBlX3NwZWNfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQlkZWZhdWx0Og0KLQkJCXsNCi0JCQkJdGhyb3cgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKExUKDEpLCBnZXRGaWxlbmFtZSgpKTsNCi0JCQl9DQotCQkJfQ0KLQkJfQ0KLQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJcmVwb3J0RXJyb3IoZXgpOw0KLQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF8yOSk7DQotCQkJfSBlbHNlIHsNCi0JCQkgIHRocm93IGV4Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybkFTVCA9IHBhcmFtX3R5cGVfc3BlY19BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIHNpbXBsZV9kZWNsYXJhdG9yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQkNCi0JCXJldHVybkFTVCA9IG51bGw7DQotCQlBU1RQYWlyIGN1cnJlbnRBU1QgPSBuZXcgQVNUUGFpcigpOw0KLQkJQVNUIHNpbXBsZV9kZWNsYXJhdG9yX0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJaWRlbnRpZmllcigpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQlzaW1wbGVfZGVjbGFyYXRvcl9BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCX0NCi0JCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgew0KLQkJCWlmIChpbnB1dFN0YXRlLmd1ZXNzaW5nPT0wKSB7DQotCQkJCXJlcG9ydEVycm9yKGV4KTsNCi0JCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfMzApOw0KLQkJCX0gZWxzZSB7DQotCQkJICB0aHJvdyBleDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm5BU1QgPSBzaW1wbGVfZGVjbGFyYXRvcl9BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIGNvbnN0X3R5cGUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCQ0KLQkJcmV0dXJuQVNUID0gbnVsbDsNCi0JCUFTVFBhaXIgY3VycmVudEFTVCA9IG5ldyBBU1RQYWlyKCk7DQotCQlBU1QgY29uc3RfdHlwZV9BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCXN3aXRjaCAoIExBKDEpKSB7DQotCQkJY2FzZSBMSVRFUkFMX2NoYXI6DQotCQkJew0KLQkJCQljaGFyX3R5cGUoKTsNCi0JCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQljb25zdF90eXBlX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJY2FzZSBMSVRFUkFMX3djaGFyOg0KLQkJCXsNCi0JCQkJd2lkZV9jaGFyX3R5cGUoKTsNCi0JCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQljb25zdF90eXBlX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJY2FzZSBMSVRFUkFMX2Jvb2xlYW46DQotCQkJew0KLQkJCQlib29sZWFuX3R5cGUoKTsNCi0JCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQljb25zdF90eXBlX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJY2FzZSBMSVRFUkFMX3N0cmluZzoNCi0JCQl7DQotCQkJCXN0cmluZ190eXBlKCk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJY29uc3RfdHlwZV9BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWNhc2UgTElURVJBTF93c3RyaW5nOg0KLQkJCXsNCi0JCQkJd2lkZV9zdHJpbmdfdHlwZSgpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCWNvbnN0X3R5cGVfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIExJVEVSQUxfZml4ZWQ6DQotCQkJew0KLQkJCQlmaXhlZF9wdF9jb25zdF90eXBlKCk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJY29uc3RfdHlwZV9BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWNhc2UgU0NPUEVPUDoNCi0JCQljYXNlIElERU5UOg0KLQkJCXsNCi0JCQkJc2NvcGVkX25hbWUoKTsNCi0JCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQljb25zdF90eXBlX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJY2FzZSBMSVRFUkFMX29jdGV0Og0KLQkJCXsNCi0JCQkJb2N0ZXRfdHlwZSgpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCWNvbnN0X3R5cGVfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQlkZWZhdWx0Og0KLQkJCQlib29sZWFuIHN5blByZWRNYXRjaGVkODAgPSBmYWxzZTsNCi0JCQkJaWYgKCgoKExBKDEpID49IExJVEVSQUxfbG9uZyAmJiBMQSgxKSA8PSBMSVRFUkFMX3Vuc2lnbmVkKSkgJiYgKExBKDIpPT1JREVOVHx8TEEoMik9PUxJVEVSQUxfbG9uZ3x8TEEoMik9PUxJVEVSQUxfc2hvcnQpICYmIChMQSgzKT09SURFTlR8fExBKDMpPT1BU1NJR058fExBKDMpPT1MSVRFUkFMX2xvbmcpICYmIChfdG9rZW5TZXRfMzEubWVtYmVyKExBKDQpKSkpKSB7DQotCQkJCQlpbnQgX204MCA9IG1hcmsoKTsNCi0JCQkJCXN5blByZWRNYXRjaGVkODAgPSB0cnVlOw0KLQkJCQkJaW5wdXRTdGF0ZS5ndWVzc2luZysrOw0KLQkJCQkJdHJ5IHsNCi0JCQkJCQl7DQotCQkJCQkJaW50ZWdlcl90eXBlKCk7DQotCQkJCQkJfQ0KLQkJCQkJfQ0KLQkJCQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHBlKSB7DQotCQkJCQkJc3luUHJlZE1hdGNoZWQ4MCA9IGZhbHNlOw0KLQkJCQkJfQ0KLQkJCQkJcmV3aW5kKF9tODApOw0KLWlucHV0U3RhdGUuZ3Vlc3NpbmctLTsNCi0JCQkJfQ0KLQkJCQlpZiAoIHN5blByZWRNYXRjaGVkODAgKSB7DQotCQkJCQlpbnRlZ2VyX3R5cGUoKTsNCi0JCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJCWNvbnN0X3R5cGVfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQkJCX0NCi0JCQkJZWxzZSBpZiAoKChMQSgxKSA+PSBMSVRFUkFMX2Zsb2F0ICYmIExBKDEpIDw9IExJVEVSQUxfbG9uZykpICYmIChMQSgyKT09SURFTlR8fExBKDIpPT1MSVRFUkFMX2RvdWJsZSkgJiYgKExBKDMpPT1JREVOVHx8TEEoMyk9PUFTU0lHTikgJiYgKF90b2tlblNldF8zMS5tZW1iZXIoTEEoNCkpKSkgew0KLQkJCQkJZmxvYXRpbmdfcHRfdHlwZSgpOw0KLQkJCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQkJY29uc3RfdHlwZV9BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCQkJfQ0KLQkJCWVsc2Ugew0KLQkJCQl0aHJvdyBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oTFQoMSksIGdldEZpbGVuYW1lKCkpOw0KLQkJCX0NCi0JCQl9DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzI5KTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gY29uc3RfdHlwZV9BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIGNvbnN0X2V4cCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBjb25zdF9leHBfQVNUID0gbnVsbDsNCi0JCQ0KLQkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcNCi0JCQlvcl9leHByKCk7DQotCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCWNvbnN0X2V4cF9BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCX0NCi0JCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgew0KLQkJCWlmIChpbnB1dFN0YXRlLmd1ZXNzaW5nPT0wKSB7DQotCQkJCXJlcG9ydEVycm9yKGV4KTsNCi0JCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfMzIpOw0KLQkJCX0gZWxzZSB7DQotCQkJICB0aHJvdyBleDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm5BU1QgPSBjb25zdF9leHBfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBpbnRlZ2VyX3R5cGUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCQ0KLQkJcmV0dXJuQVNUID0gbnVsbDsNCi0JCUFTVFBhaXIgY3VycmVudEFTVCA9IG5ldyBBU1RQYWlyKCk7DQotCQlBU1QgaW50ZWdlcl90eXBlX0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJc3dpdGNoICggTEEoMSkpIHsNCi0JCQljYXNlIExJVEVSQUxfbG9uZzoNCi0JCQljYXNlIExJVEVSQUxfc2hvcnQ6DQotCQkJew0KLQkJCQlzaWduZWRfaW50KCk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJaW50ZWdlcl90eXBlX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJY2FzZSBMSVRFUkFMX3Vuc2lnbmVkOg0KLQkJCXsNCi0JCQkJdW5zaWduZWRfaW50KCk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJaW50ZWdlcl90eXBlX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJZGVmYXVsdDoNCi0JCQl7DQotCQkJCXRocm93IG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihMVCgxKSwgZ2V0RmlsZW5hbWUoKSk7DQotCQkJfQ0KLQkJCX0NCi0JCX0NCi0JCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgew0KLQkJCWlmIChpbnB1dFN0YXRlLmd1ZXNzaW5nPT0wKSB7DQotCQkJCXJlcG9ydEVycm9yKGV4KTsNCi0JCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfMzMpOw0KLQkJCX0gZWxzZSB7DQotCQkJICB0aHJvdyBleDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm5BU1QgPSBpbnRlZ2VyX3R5cGVfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBjaGFyX3R5cGUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCQ0KLQkJcmV0dXJuQVNUID0gbnVsbDsNCi0JCUFTVFBhaXIgY3VycmVudEFTVCA9IG5ldyBBU1RQYWlyKCk7DQotCQlBU1QgY2hhcl90eXBlX0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJQVNUIHRtcDc1X0FTVCA9IG51bGw7DQotCQkJdG1wNzVfQVNUID0gYXN0RmFjdG9yeS5jcmVhdGUoTFQoMSkpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgdG1wNzVfQVNUKTsNCi0JCQltYXRjaChMSVRFUkFMX2NoYXIpOw0KLQkJCWNoYXJfdHlwZV9BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCX0NCi0JCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgew0KLQkJCWlmIChpbnB1dFN0YXRlLmd1ZXNzaW5nPT0wKSB7DQotCQkJCXJlcG9ydEVycm9yKGV4KTsNCi0JCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfMzMpOw0KLQkJCX0gZWxzZSB7DQotCQkJICB0aHJvdyBleDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm5BU1QgPSBjaGFyX3R5cGVfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCB3aWRlX2NoYXJfdHlwZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCB3aWRlX2NoYXJfdHlwZV9BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCUFTVCB0bXA3Nl9BU1QgPSBudWxsOw0KLQkJCXRtcDc2X0FTVCA9IGFzdEZhY3RvcnkuY3JlYXRlKExUKDEpKTsNCi0JCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHRtcDc2X0FTVCk7DQotCQkJbWF0Y2goTElURVJBTF93Y2hhcik7DQotCQkJd2lkZV9jaGFyX3R5cGVfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzM0KTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gd2lkZV9jaGFyX3R5cGVfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBib29sZWFuX3R5cGUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCQ0KLQkJcmV0dXJuQVNUID0gbnVsbDsNCi0JCUFTVFBhaXIgY3VycmVudEFTVCA9IG5ldyBBU1RQYWlyKCk7DQotCQlBU1QgYm9vbGVhbl90eXBlX0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJQVNUIHRtcDc3X0FTVCA9IG51bGw7DQotCQkJdG1wNzdfQVNUID0gYXN0RmFjdG9yeS5jcmVhdGUoTFQoMSkpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgdG1wNzdfQVNUKTsNCi0JCQltYXRjaChMSVRFUkFMX2Jvb2xlYW4pOw0KLQkJCWJvb2xlYW5fdHlwZV9BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCX0NCi0JCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgew0KLQkJCWlmIChpbnB1dFN0YXRlLmd1ZXNzaW5nPT0wKSB7DQotCQkJCXJlcG9ydEVycm9yKGV4KTsNCi0JCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfMzMpOw0KLQkJCX0gZWxzZSB7DQotCQkJICB0aHJvdyBleDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm5BU1QgPSBib29sZWFuX3R5cGVfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBmbG9hdGluZ19wdF90eXBlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQkNCi0JCXJldHVybkFTVCA9IG51bGw7DQotCQlBU1RQYWlyIGN1cnJlbnRBU1QgPSBuZXcgQVNUUGFpcigpOw0KLQkJQVNUIGZsb2F0aW5nX3B0X3R5cGVfQVNUID0gbnVsbDsNCi0JCQ0KLQkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcNCi0JCQlzd2l0Y2ggKCBMQSgxKSkgew0KLQkJCWNhc2UgTElURVJBTF9mbG9hdDoNCi0JCQl7DQotCQkJCUFTVCB0bXA3OF9BU1QgPSBudWxsOw0KLQkJCQl0bXA3OF9BU1QgPSBhc3RGYWN0b3J5LmNyZWF0ZShMVCgxKSk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgdG1wNzhfQVNUKTsNCi0JCQkJbWF0Y2goTElURVJBTF9mbG9hdCk7DQotCQkJCWZsb2F0aW5nX3B0X3R5cGVfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIExJVEVSQUxfZG91YmxlOg0KLQkJCXsNCi0JCQkJQVNUIHRtcDc5X0FTVCA9IG51bGw7DQotCQkJCXRtcDc5X0FTVCA9IGFzdEZhY3RvcnkuY3JlYXRlKExUKDEpKTsNCi0JCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCB0bXA3OV9BU1QpOw0KLQkJCQltYXRjaChMSVRFUkFMX2RvdWJsZSk7DQotCQkJCWZsb2F0aW5nX3B0X3R5cGVfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIExJVEVSQUxfbG9uZzoNCi0JCQl7DQotCQkJCUFTVCB0bXA4MF9BU1QgPSBudWxsOw0KLQkJCQl0bXA4MF9BU1QgPSBhc3RGYWN0b3J5LmNyZWF0ZShMVCgxKSk7DQotCQkJCWFzdEZhY3RvcnkubWFrZUFTVFJvb3QoY3VycmVudEFTVCwgdG1wODBfQVNUKTsNCi0JCQkJbWF0Y2goTElURVJBTF9sb25nKTsNCi0JCQkJQVNUIHRtcDgxX0FTVCA9IG51bGw7DQotCQkJCXRtcDgxX0FTVCA9IGFzdEZhY3RvcnkuY3JlYXRlKExUKDEpKTsNCi0JCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCB0bXA4MV9BU1QpOw0KLQkJCQltYXRjaChMSVRFUkFMX2RvdWJsZSk7DQotCQkJCWZsb2F0aW5nX3B0X3R5cGVfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQlkZWZhdWx0Og0KLQkJCXsNCi0JCQkJdGhyb3cgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKExUKDEpLCBnZXRGaWxlbmFtZSgpKTsNCi0JCQl9DQotCQkJfQ0KLQkJfQ0KLQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJcmVwb3J0RXJyb3IoZXgpOw0KLQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF8zNCk7DQotCQkJfSBlbHNlIHsNCi0JCQkgIHRocm93IGV4Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybkFTVCA9IGZsb2F0aW5nX3B0X3R5cGVfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBzdHJpbmdfdHlwZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBzdHJpbmdfdHlwZV9BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCUFTVCB0bXA4Ml9BU1QgPSBudWxsOw0KLQkJCXRtcDgyX0FTVCA9IGFzdEZhY3RvcnkuY3JlYXRlKExUKDEpKTsNCi0JCQlhc3RGYWN0b3J5Lm1ha2VBU1RSb290KGN1cnJlbnRBU1QsIHRtcDgyX0FTVCk7DQotCQkJbWF0Y2goTElURVJBTF9zdHJpbmcpOw0KLQkJCXsNCi0JCQlzd2l0Y2ggKCBMQSgxKSkgew0KLQkJCWNhc2UgTFQ6DQotCQkJew0KLQkJCQltYXRjaChMVCk7DQotCQkJCXBvc2l0aXZlX2ludF9jb25zdCgpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCW1hdGNoKEdUKTsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWNhc2UgU0VNSToNCi0JCQljYXNlIENPTU1BOg0KLQkJCWNhc2UgSURFTlQ6DQotCQkJY2FzZSBHVDoNCi0JCQl7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQlkZWZhdWx0Og0KLQkJCXsNCi0JCQkJdGhyb3cgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKExUKDEpLCBnZXRGaWxlbmFtZSgpKTsNCi0JCQl9DQotCQkJfQ0KLQkJCX0NCi0JCQlzdHJpbmdfdHlwZV9BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCX0NCi0JCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgew0KLQkJCWlmIChpbnB1dFN0YXRlLmd1ZXNzaW5nPT0wKSB7DQotCQkJCXJlcG9ydEVycm9yKGV4KTsNCi0JCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfMzQpOw0KLQkJCX0gZWxzZSB7DQotCQkJICB0aHJvdyBleDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm5BU1QgPSBzdHJpbmdfdHlwZV9BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIHdpZGVfc3RyaW5nX3R5cGUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCQ0KLQkJcmV0dXJuQVNUID0gbnVsbDsNCi0JCUFTVFBhaXIgY3VycmVudEFTVCA9IG5ldyBBU1RQYWlyKCk7DQotCQlBU1Qgd2lkZV9zdHJpbmdfdHlwZV9BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCUFTVCB0bXA4NV9BU1QgPSBudWxsOw0KLQkJCXRtcDg1X0FTVCA9IGFzdEZhY3RvcnkuY3JlYXRlKExUKDEpKTsNCi0JCQlhc3RGYWN0b3J5Lm1ha2VBU1RSb290KGN1cnJlbnRBU1QsIHRtcDg1X0FTVCk7DQotCQkJbWF0Y2goTElURVJBTF93c3RyaW5nKTsNCi0JCQl7DQotCQkJc3dpdGNoICggTEEoMSkpIHsNCi0JCQljYXNlIExUOg0KLQkJCXsNCi0JCQkJbWF0Y2goTFQpOw0KLQkJCQlwb3NpdGl2ZV9pbnRfY29uc3QoKTsNCi0JCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQltYXRjaChHVCk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIFNFTUk6DQotCQkJY2FzZSBDT01NQToNCi0JCQljYXNlIElERU5UOg0KLQkJCWNhc2UgR1Q6DQotCQkJew0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJZGVmYXVsdDoNCi0JCQl7DQotCQkJCXRocm93IG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihMVCgxKSwgZ2V0RmlsZW5hbWUoKSk7DQotCQkJfQ0KLQkJCX0NCi0JCQl9DQotCQkJd2lkZV9zdHJpbmdfdHlwZV9BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCX0NCi0JCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgew0KLQkJCWlmIChpbnB1dFN0YXRlLmd1ZXNzaW5nPT0wKSB7DQotCQkJCXJlcG9ydEVycm9yKGV4KTsNCi0JCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfMzQpOw0KLQkJCX0gZWxzZSB7DQotCQkJICB0aHJvdyBleDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm5BU1QgPSB3aWRlX3N0cmluZ190eXBlX0FTVDsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgZml4ZWRfcHRfY29uc3RfdHlwZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBmaXhlZF9wdF9jb25zdF90eXBlX0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJQVNUIHRtcDg4X0FTVCA9IG51bGw7DQotCQkJdG1wODhfQVNUID0gYXN0RmFjdG9yeS5jcmVhdGUoTFQoMSkpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgdG1wODhfQVNUKTsNCi0JCQltYXRjaChMSVRFUkFMX2ZpeGVkKTsNCi0JCQlmaXhlZF9wdF9jb25zdF90eXBlX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJfQ0KLQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJcmVwb3J0RXJyb3IoZXgpOw0KLQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF8yOSk7DQotCQkJfSBlbHNlIHsNCi0JCQkgIHRocm93IGV4Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybkFTVCA9IGZpeGVkX3B0X2NvbnN0X3R5cGVfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBvY3RldF90eXBlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQkNCi0JCXJldHVybkFTVCA9IG51bGw7DQotCQlBU1RQYWlyIGN1cnJlbnRBU1QgPSBuZXcgQVNUUGFpcigpOw0KLQkJQVNUIG9jdGV0X3R5cGVfQVNUID0gbnVsbDsNCi0JCQ0KLQkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcNCi0JCQlBU1QgdG1wODlfQVNUID0gbnVsbDsNCi0JCQl0bXA4OV9BU1QgPSBhc3RGYWN0b3J5LmNyZWF0ZShMVCgxKSk7DQotCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCB0bXA4OV9BU1QpOw0KLQkJCW1hdGNoKExJVEVSQUxfb2N0ZXQpOw0KLQkJCW9jdGV0X3R5cGVfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzM0KTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gb2N0ZXRfdHlwZV9BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIG9yX2V4cHIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCQ0KLQkJcmV0dXJuQVNUID0gbnVsbDsNCi0JCUFTVFBhaXIgY3VycmVudEFTVCA9IG5ldyBBU1RQYWlyKCk7DQotCQlBU1Qgb3JfZXhwcl9BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCXhvcl9leHByKCk7DQotCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCXsNCi0JCQlfbG9vcDg0Og0KLQkJCWRvIHsNCi0JCQkJaWYgKChMQSgxKT09T1IpKSB7DQotCQkJCQlBU1QgdG1wOTBfQVNUID0gbnVsbDsNCi0JCQkJCXRtcDkwX0FTVCA9IGFzdEZhY3RvcnkuY3JlYXRlKExUKDEpKTsNCi0JCQkJCWFzdEZhY3RvcnkubWFrZUFTVFJvb3QoY3VycmVudEFTVCwgdG1wOTBfQVNUKTsNCi0JCQkJCW1hdGNoKE9SKTsNCi0JCQkJCXhvcl9leHByKCk7DQotCQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCX0NCi0JCQkJZWxzZSB7DQotCQkJCQlicmVhayBfbG9vcDg0Ow0KLQkJCQl9DQotCQkJCQ0KLQkJCX0gd2hpbGUgKHRydWUpOw0KLQkJCX0NCi0JCQlvcl9leHByX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJfQ0KLQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJcmVwb3J0RXJyb3IoZXgpOw0KLQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF8zMik7DQotCQkJfSBlbHNlIHsNCi0JCQkgIHRocm93IGV4Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybkFTVCA9IG9yX2V4cHJfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCB4b3JfZXhwcigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCB4b3JfZXhwcl9BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCWFuZF9leHByKCk7DQotCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCXsNCi0JCQlfbG9vcDg3Og0KLQkJCWRvIHsNCi0JCQkJaWYgKChMQSgxKT09WE9SKSkgew0KLQkJCQkJQVNUIHRtcDkxX0FTVCA9IG51bGw7DQotCQkJCQl0bXA5MV9BU1QgPSBhc3RGYWN0b3J5LmNyZWF0ZShMVCgxKSk7DQotCQkJCQlhc3RGYWN0b3J5Lm1ha2VBU1RSb290KGN1cnJlbnRBU1QsIHRtcDkxX0FTVCk7DQotCQkJCQltYXRjaChYT1IpOw0KLQkJCQkJYW5kX2V4cHIoKTsNCi0JCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJfQ0KLQkJCQllbHNlIHsNCi0JCQkJCWJyZWFrIF9sb29wODc7DQotCQkJCX0NCi0JCQkJDQotCQkJfSB3aGlsZSAodHJ1ZSk7DQotCQkJfQ0KLQkJCXhvcl9leHByX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJfQ0KLQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJcmVwb3J0RXJyb3IoZXgpOw0KLQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF8zNSk7DQotCQkJfSBlbHNlIHsNCi0JCQkgIHRocm93IGV4Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybkFTVCA9IHhvcl9leHByX0FTVDsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgYW5kX2V4cHIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCQ0KLQkJcmV0dXJuQVNUID0gbnVsbDsNCi0JCUFTVFBhaXIgY3VycmVudEFTVCA9IG5ldyBBU1RQYWlyKCk7DQotCQlBU1QgYW5kX2V4cHJfQVNUID0gbnVsbDsNCi0JCQ0KLQkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcNCi0JCQlzaGlmdF9leHByKCk7DQotCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCXsNCi0JCQlfbG9vcDkwOg0KLQkJCWRvIHsNCi0JCQkJaWYgKChMQSgxKT09QU5EKSkgew0KLQkJCQkJQVNUIHRtcDkyX0FTVCA9IG51bGw7DQotCQkJCQl0bXA5Ml9BU1QgPSBhc3RGYWN0b3J5LmNyZWF0ZShMVCgxKSk7DQotCQkJCQlhc3RGYWN0b3J5Lm1ha2VBU1RSb290KGN1cnJlbnRBU1QsIHRtcDkyX0FTVCk7DQotCQkJCQltYXRjaChBTkQpOw0KLQkJCQkJc2hpZnRfZXhwcigpOw0KLQkJCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQl9DQotCQkJCWVsc2Ugew0KLQkJCQkJYnJlYWsgX2xvb3A5MDsNCi0JCQkJfQ0KLQkJCQkNCi0JCQl9IHdoaWxlICh0cnVlKTsNCi0JCQl9DQotCQkJYW5kX2V4cHJfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzM2KTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gYW5kX2V4cHJfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBzaGlmdF9leHByKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQkNCi0JCXJldHVybkFTVCA9IG51bGw7DQotCQlBU1RQYWlyIGN1cnJlbnRBU1QgPSBuZXcgQVNUUGFpcigpOw0KLQkJQVNUIHNoaWZ0X2V4cHJfQVNUID0gbnVsbDsNCi0JCQ0KLQkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcNCi0JCQlhZGRfZXhwcigpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQl7DQotCQkJX2xvb3A5NDoNCi0JCQlkbyB7DQotCQkJCWlmICgoTEEoMSk9PUxTSElGVHx8TEEoMSk9PVJTSElGVCkpIHsNCi0JCQkJCXsNCi0JCQkJCXN3aXRjaCAoIExBKDEpKSB7DQotCQkJCQljYXNlIExTSElGVDoNCi0JCQkJCXsNCi0JCQkJCQlBU1QgdG1wOTNfQVNUID0gbnVsbDsNCi0JCQkJCQl0bXA5M19BU1QgPSBhc3RGYWN0b3J5LmNyZWF0ZShMVCgxKSk7DQotCQkJCQkJYXN0RmFjdG9yeS5tYWtlQVNUUm9vdChjdXJyZW50QVNULCB0bXA5M19BU1QpOw0KLQkJCQkJCW1hdGNoKExTSElGVCk7DQotCQkJCQkJYnJlYWs7DQotCQkJCQl9DQotCQkJCQljYXNlIFJTSElGVDoNCi0JCQkJCXsNCi0JCQkJCQlBU1QgdG1wOTRfQVNUID0gbnVsbDsNCi0JCQkJCQl0bXA5NF9BU1QgPSBhc3RGYWN0b3J5LmNyZWF0ZShMVCgxKSk7DQotCQkJCQkJYXN0RmFjdG9yeS5tYWtlQVNUUm9vdChjdXJyZW50QVNULCB0bXA5NF9BU1QpOw0KLQkJCQkJCW1hdGNoKFJTSElGVCk7DQotCQkJCQkJYnJlYWs7DQotCQkJCQl9DQotCQkJCQlkZWZhdWx0Og0KLQkJCQkJew0KLQkJCQkJCXRocm93IG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihMVCgxKSwgZ2V0RmlsZW5hbWUoKSk7DQotCQkJCQl9DQotCQkJCQl9DQotCQkJCQl9DQotCQkJCQlhZGRfZXhwcigpOw0KLQkJCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQl9DQotCQkJCWVsc2Ugew0KLQkJCQkJYnJlYWsgX2xvb3A5NDsNCi0JCQkJfQ0KLQkJCQkNCi0JCQl9IHdoaWxlICh0cnVlKTsNCi0JCQl9DQotCQkJc2hpZnRfZXhwcl9BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCX0NCi0JCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgew0KLQkJCWlmIChpbnB1dFN0YXRlLmd1ZXNzaW5nPT0wKSB7DQotCQkJCXJlcG9ydEVycm9yKGV4KTsNCi0JCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfMzcpOw0KLQkJCX0gZWxzZSB7DQotCQkJICB0aHJvdyBleDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm5BU1QgPSBzaGlmdF9leHByX0FTVDsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgYWRkX2V4cHIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCQ0KLQkJcmV0dXJuQVNUID0gbnVsbDsNCi0JCUFTVFBhaXIgY3VycmVudEFTVCA9IG5ldyBBU1RQYWlyKCk7DQotCQlBU1QgYWRkX2V4cHJfQVNUID0gbnVsbDsNCi0JCQ0KLQkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcNCi0JCQltdWx0X2V4cHIoKTsNCi0JCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJew0KLQkJCV9sb29wOTg6DQotCQkJZG8gew0KLQkJCQlpZiAoKExBKDEpPT1QTFVTfHxMQSgxKT09TUlOVVMpKSB7DQotCQkJCQl7DQotCQkJCQlzd2l0Y2ggKCBMQSgxKSkgew0KLQkJCQkJY2FzZSBQTFVTOg0KLQkJCQkJew0KLQkJCQkJCUFTVCB0bXA5NV9BU1QgPSBudWxsOw0KLQkJCQkJCXRtcDk1X0FTVCA9IGFzdEZhY3RvcnkuY3JlYXRlKExUKDEpKTsNCi0JCQkJCQlhc3RGYWN0b3J5Lm1ha2VBU1RSb290KGN1cnJlbnRBU1QsIHRtcDk1X0FTVCk7DQotCQkJCQkJbWF0Y2goUExVUyk7DQotCQkJCQkJYnJlYWs7DQotCQkJCQl9DQotCQkJCQljYXNlIE1JTlVTOg0KLQkJCQkJew0KLQkJCQkJCUFTVCB0bXA5Nl9BU1QgPSBudWxsOw0KLQkJCQkJCXRtcDk2X0FTVCA9IGFzdEZhY3RvcnkuY3JlYXRlKExUKDEpKTsNCi0JCQkJCQlhc3RGYWN0b3J5Lm1ha2VBU1RSb290KGN1cnJlbnRBU1QsIHRtcDk2X0FTVCk7DQotCQkJCQkJbWF0Y2goTUlOVVMpOw0KLQkJCQkJCWJyZWFrOw0KLQkJCQkJfQ0KLQkJCQkJZGVmYXVsdDoNCi0JCQkJCXsNCi0JCQkJCQl0aHJvdyBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oTFQoMSksIGdldEZpbGVuYW1lKCkpOw0KLQkJCQkJfQ0KLQkJCQkJfQ0KLQkJCQkJfQ0KLQkJCQkJbXVsdF9leHByKCk7DQotCQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCX0NCi0JCQkJZWxzZSB7DQotCQkJCQlicmVhayBfbG9vcDk4Ow0KLQkJCQl9DQotCQkJCQ0KLQkJCX0gd2hpbGUgKHRydWUpOw0KLQkJCX0NCi0JCQlhZGRfZXhwcl9BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCX0NCi0JCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgew0KLQkJCWlmIChpbnB1dFN0YXRlLmd1ZXNzaW5nPT0wKSB7DQotCQkJCXJlcG9ydEVycm9yKGV4KTsNCi0JCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfMzgpOw0KLQkJCX0gZWxzZSB7DQotCQkJICB0aHJvdyBleDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm5BU1QgPSBhZGRfZXhwcl9BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIG11bHRfZXhwcigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBtdWx0X2V4cHJfQVNUID0gbnVsbDsNCi0JCQ0KLQkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcNCi0JCQl1bmFyeV9leHByKCk7DQotCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCXsNCi0JCQlfbG9vcDEwMjoNCi0JCQlkbyB7DQotCQkJCWlmICgoKExBKDEpID49IFNUQVIgJiYgTEEoMSkgPD0gTU9EKSkpIHsNCi0JCQkJCXsNCi0JCQkJCXN3aXRjaCAoIExBKDEpKSB7DQotCQkJCQljYXNlIFNUQVI6DQotCQkJCQl7DQotCQkJCQkJQVNUIHRtcDk3X0FTVCA9IG51bGw7DQotCQkJCQkJdG1wOTdfQVNUID0gYXN0RmFjdG9yeS5jcmVhdGUoTFQoMSkpOw0KLQkJCQkJCWFzdEZhY3RvcnkubWFrZUFTVFJvb3QoY3VycmVudEFTVCwgdG1wOTdfQVNUKTsNCi0JCQkJCQltYXRjaChTVEFSKTsNCi0JCQkJCQlicmVhazsNCi0JCQkJCX0NCi0JCQkJCWNhc2UgRElWOg0KLQkJCQkJew0KLQkJCQkJCUFTVCB0bXA5OF9BU1QgPSBudWxsOw0KLQkJCQkJCXRtcDk4X0FTVCA9IGFzdEZhY3RvcnkuY3JlYXRlKExUKDEpKTsNCi0JCQkJCQlhc3RGYWN0b3J5Lm1ha2VBU1RSb290KGN1cnJlbnRBU1QsIHRtcDk4X0FTVCk7DQotCQkJCQkJbWF0Y2goRElWKTsNCi0JCQkJCQlicmVhazsNCi0JCQkJCX0NCi0JCQkJCWNhc2UgTU9EOg0KLQkJCQkJew0KLQkJCQkJCUFTVCB0bXA5OV9BU1QgPSBudWxsOw0KLQkJCQkJCXRtcDk5X0FTVCA9IGFzdEZhY3RvcnkuY3JlYXRlKExUKDEpKTsNCi0JCQkJCQlhc3RGYWN0b3J5Lm1ha2VBU1RSb290KGN1cnJlbnRBU1QsIHRtcDk5X0FTVCk7DQotCQkJCQkJbWF0Y2goTU9EKTsNCi0JCQkJCQlicmVhazsNCi0JCQkJCX0NCi0JCQkJCWRlZmF1bHQ6DQotCQkJCQl7DQotCQkJCQkJdGhyb3cgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKExUKDEpLCBnZXRGaWxlbmFtZSgpKTsNCi0JCQkJCX0NCi0JCQkJCX0NCi0JCQkJCX0NCi0JCQkJCXVuYXJ5X2V4cHIoKTsNCi0JCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJfQ0KLQkJCQllbHNlIHsNCi0JCQkJCWJyZWFrIF9sb29wMTAyOw0KLQkJCQl9DQotCQkJCQ0KLQkJCX0gd2hpbGUgKHRydWUpOw0KLQkJCX0NCi0JCQltdWx0X2V4cHJfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzM5KTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gbXVsdF9leHByX0FTVDsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgdW5hcnlfZXhwcigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCB1bmFyeV9leHByX0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJc3dpdGNoICggTEEoMSkpIHsNCi0JCQljYXNlIFBMVVM6DQotCQkJY2FzZSBNSU5VUzoNCi0JCQljYXNlIFRJTERFOg0KLQkJCXsNCi0JCQkJew0KLQkJCQlzd2l0Y2ggKCBMQSgxKSkgew0KLQkJCQljYXNlIE1JTlVTOg0KLQkJCQl7DQotCQkJCQlBU1QgdG1wMTAwX0FTVCA9IG51bGw7DQotCQkJCQl0bXAxMDBfQVNUID0gYXN0RmFjdG9yeS5jcmVhdGUoTFQoMSkpOw0KLQkJCQkJYXN0RmFjdG9yeS5tYWtlQVNUUm9vdChjdXJyZW50QVNULCB0bXAxMDBfQVNUKTsNCi0JCQkJCW1hdGNoKE1JTlVTKTsNCi0JCQkJCWJyZWFrOw0KLQkJCQl9DQotCQkJCWNhc2UgUExVUzoNCi0JCQkJew0KLQkJCQkJQVNUIHRtcDEwMV9BU1QgPSBudWxsOw0KLQkJCQkJdG1wMTAxX0FTVCA9IGFzdEZhY3RvcnkuY3JlYXRlKExUKDEpKTsNCi0JCQkJCWFzdEZhY3RvcnkubWFrZUFTVFJvb3QoY3VycmVudEFTVCwgdG1wMTAxX0FTVCk7DQotCQkJCQltYXRjaChQTFVTKTsNCi0JCQkJCWJyZWFrOw0KLQkJCQl9DQotCQkJCWNhc2UgVElMREU6DQotCQkJCXsNCi0JCQkJCUFTVCB0bXAxMDJfQVNUID0gbnVsbDsNCi0JCQkJCXRtcDEwMl9BU1QgPSBhc3RGYWN0b3J5LmNyZWF0ZShMVCgxKSk7DQotCQkJCQlhc3RGYWN0b3J5Lm1ha2VBU1RSb290KGN1cnJlbnRBU1QsIHRtcDEwMl9BU1QpOw0KLQkJCQkJbWF0Y2goVElMREUpOw0KLQkJCQkJYnJlYWs7DQotCQkJCX0NCi0JCQkJZGVmYXVsdDoNCi0JCQkJew0KLQkJCQkJdGhyb3cgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKExUKDEpLCBnZXRGaWxlbmFtZSgpKTsNCi0JCQkJfQ0KLQkJCQl9DQotCQkJCX0NCi0JCQkJcHJpbWFyeV9leHByKCk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJdW5hcnlfZXhwcl9BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWNhc2UgU0NPUEVPUDoNCi0JCQljYXNlIElERU5UOg0KLQkJCWNhc2UgTFBBUkVOOg0KLQkJCWNhc2UgTElURVJBTF9UUlVFOg0KLQkJCWNhc2UgTElURVJBTF9GQUxTRToNCi0JCQljYXNlIElOVDoNCi0JCQljYXNlIE9DVEFMOg0KLQkJCWNhc2UgSEVYOg0KLQkJCWNhc2UgU1RSSU5HX0xJVEVSQUw6DQotCQkJY2FzZSBXSURFX1NUUklOR19MSVRFUkFMOg0KLQkJCWNhc2UgQ0hBUl9MSVRFUkFMOg0KLQkJCWNhc2UgV0lERV9DSEFSX0xJVEVSQUw6DQotCQkJY2FzZSBGSVhFRDoNCi0JCQljYXNlIEZMT0FUOg0KLQkJCXsNCi0JCQkJcHJpbWFyeV9leHByKCk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJdW5hcnlfZXhwcl9BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWRlZmF1bHQ6DQotCQkJew0KLQkJCQl0aHJvdyBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oTFQoMSksIGdldEZpbGVuYW1lKCkpOw0KLQkJCX0NCi0JCQl9DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzQwKTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gdW5hcnlfZXhwcl9BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIHByaW1hcnlfZXhwcigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBwcmltYXJ5X2V4cHJfQVNUID0gbnVsbDsNCi0JCQ0KLQkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcNCi0JCQlzd2l0Y2ggKCBMQSgxKSkgew0KLQkJCWNhc2UgU0NPUEVPUDoNCi0JCQljYXNlIElERU5UOg0KLQkJCXsNCi0JCQkJc2NvcGVkX25hbWUoKTsNCi0JCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQlwcmltYXJ5X2V4cHJfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIExJVEVSQUxfVFJVRToNCi0JCQljYXNlIExJVEVSQUxfRkFMU0U6DQotCQkJY2FzZSBJTlQ6DQotCQkJY2FzZSBPQ1RBTDoNCi0JCQljYXNlIEhFWDoNCi0JCQljYXNlIFNUUklOR19MSVRFUkFMOg0KLQkJCWNhc2UgV0lERV9TVFJJTkdfTElURVJBTDoNCi0JCQljYXNlIENIQVJfTElURVJBTDoNCi0JCQljYXNlIFdJREVfQ0hBUl9MSVRFUkFMOg0KLQkJCWNhc2UgRklYRUQ6DQotCQkJY2FzZSBGTE9BVDoNCi0JCQl7DQotCQkJCWxpdGVyYWwoKTsNCi0JCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQlwcmltYXJ5X2V4cHJfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIExQQVJFTjoNCi0JCQl7DQotCQkJCUFTVCB0bXAxMDNfQVNUID0gbnVsbDsNCi0JCQkJdG1wMTAzX0FTVCA9IGFzdEZhY3RvcnkuY3JlYXRlKExUKDEpKTsNCi0JCQkJYXN0RmFjdG9yeS5tYWtlQVNUUm9vdChjdXJyZW50QVNULCB0bXAxMDNfQVNUKTsNCi0JCQkJbWF0Y2goTFBBUkVOKTsNCi0JCQkJY29uc3RfZXhwKCk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJQVNUIHRtcDEwNF9BU1QgPSBudWxsOw0KLQkJCQl0bXAxMDRfQVNUID0gYXN0RmFjdG9yeS5jcmVhdGUoTFQoMSkpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHRtcDEwNF9BU1QpOw0KLQkJCQltYXRjaChSUEFSRU4pOw0KLQkJCQlwcmltYXJ5X2V4cHJfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQlkZWZhdWx0Og0KLQkJCXsNCi0JCQkJdGhyb3cgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKExUKDEpLCBnZXRGaWxlbmFtZSgpKTsNCi0JCQl9DQotCQkJfQ0KLQkJfQ0KLQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJcmVwb3J0RXJyb3IoZXgpOw0KLQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF80MCk7DQotCQkJfSBlbHNlIHsNCi0JCQkgIHRocm93IGV4Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybkFTVCA9IHByaW1hcnlfZXhwcl9BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIGxpdGVyYWwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCQ0KLQkJcmV0dXJuQVNUID0gbnVsbDsNCi0JCUFTVFBhaXIgY3VycmVudEFTVCA9IG5ldyBBU1RQYWlyKCk7DQotCQlBU1QgbGl0ZXJhbF9BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCXN3aXRjaCAoIExBKDEpKSB7DQotCQkJY2FzZSBJTlQ6DQotCQkJY2FzZSBPQ1RBTDoNCi0JCQljYXNlIEhFWDoNCi0JCQl7DQotCQkJCWludGVnZXJfbGl0ZXJhbCgpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCWxpdGVyYWxfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIFNUUklOR19MSVRFUkFMOg0KLQkJCXsNCi0JCQkJc3RyaW5nX2xpdGVyYWwoKTsNCi0JCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQlsaXRlcmFsX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJY2FzZSBXSURFX1NUUklOR19MSVRFUkFMOg0KLQkJCXsNCi0JCQkJd2lkZV9zdHJpbmdfbGl0ZXJhbCgpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCWxpdGVyYWxfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIENIQVJfTElURVJBTDoNCi0JCQl7DQotCQkJCWNoYXJhY3Rlcl9saXRlcmFsKCk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJbGl0ZXJhbF9BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWNhc2UgV0lERV9DSEFSX0xJVEVSQUw6DQotCQkJew0KLQkJCQl3aWRlX2NoYXJhY3Rlcl9saXRlcmFsKCk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJbGl0ZXJhbF9BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWNhc2UgRklYRUQ6DQotCQkJew0KLQkJCQlmaXhlZF9wdF9saXRlcmFsKCk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJbGl0ZXJhbF9BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWNhc2UgRkxPQVQ6DQotCQkJew0KLQkJCQlmbG9hdGluZ19wdF9saXRlcmFsKCk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJbGl0ZXJhbF9BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWNhc2UgTElURVJBTF9UUlVFOg0KLQkJCWNhc2UgTElURVJBTF9GQUxTRToNCi0JCQl7DQotCQkJCWJvb2xlYW5fbGl0ZXJhbCgpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCWxpdGVyYWxfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQlkZWZhdWx0Og0KLQkJCXsNCi0JCQkJdGhyb3cgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKExUKDEpLCBnZXRGaWxlbmFtZSgpKTsNCi0JCQl9DQotCQkJfQ0KLQkJfQ0KLQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJcmVwb3J0RXJyb3IoZXgpOw0KLQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF80MCk7DQotCQkJfSBlbHNlIHsNCi0JCQkgIHRocm93IGV4Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybkFTVCA9IGxpdGVyYWxfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBpbnRlZ2VyX2xpdGVyYWwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCQ0KLQkJcmV0dXJuQVNUID0gbnVsbDsNCi0JCUFTVFBhaXIgY3VycmVudEFTVCA9IG5ldyBBU1RQYWlyKCk7DQotCQlBU1QgaW50ZWdlcl9saXRlcmFsX0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJc3dpdGNoICggTEEoMSkpIHsNCi0JCQljYXNlIElOVDoNCi0JCQl7DQotCQkJCUFTVCB0bXAxMDVfQVNUID0gbnVsbDsNCi0JCQkJdG1wMTA1X0FTVCA9IGFzdEZhY3RvcnkuY3JlYXRlKExUKDEpKTsNCi0JCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCB0bXAxMDVfQVNUKTsNCi0JCQkJbWF0Y2goSU5UKTsNCi0JCQkJaW50ZWdlcl9saXRlcmFsX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJY2FzZSBPQ1RBTDoNCi0JCQl7DQotCQkJCUFTVCB0bXAxMDZfQVNUID0gbnVsbDsNCi0JCQkJdG1wMTA2X0FTVCA9IGFzdEZhY3RvcnkuY3JlYXRlKExUKDEpKTsNCi0JCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCB0bXAxMDZfQVNUKTsNCi0JCQkJbWF0Y2goT0NUQUwpOw0KLQkJCQlpbnRlZ2VyX2xpdGVyYWxfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIEhFWDoNCi0JCQl7DQotCQkJCUFTVCB0bXAxMDdfQVNUID0gbnVsbDsNCi0JCQkJdG1wMTA3X0FTVCA9IGFzdEZhY3RvcnkuY3JlYXRlKExUKDEpKTsNCi0JCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCB0bXAxMDdfQVNUKTsNCi0JCQkJbWF0Y2goSEVYKTsNCi0JCQkJaW50ZWdlcl9saXRlcmFsX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJZGVmYXVsdDoNCi0JCQl7DQotCQkJCXRocm93IG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihMVCgxKSwgZ2V0RmlsZW5hbWUoKSk7DQotCQkJfQ0KLQkJCX0NCi0JCX0NCi0JCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgew0KLQkJCWlmIChpbnB1dFN0YXRlLmd1ZXNzaW5nPT0wKSB7DQotCQkJCXJlcG9ydEVycm9yKGV4KTsNCi0JCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfNDApOw0KLQkJCX0gZWxzZSB7DQotCQkJICB0aHJvdyBleDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm5BU1QgPSBpbnRlZ2VyX2xpdGVyYWxfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBzdHJpbmdfbGl0ZXJhbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBzdHJpbmdfbGl0ZXJhbF9BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCXsNCi0JCQlpbnQgX2NudDI4Mj0wOw0KLQkJCV9sb29wMjgyOg0KLQkJCWRvIHsNCi0JCQkJaWYgKChMQSgxKT09U1RSSU5HX0xJVEVSQUwpKSB7DQotCQkJCQlBU1QgdG1wMTA4X0FTVCA9IG51bGw7DQotCQkJCQl0bXAxMDhfQVNUID0gYXN0RmFjdG9yeS5jcmVhdGUoTFQoMSkpOw0KLQkJCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCB0bXAxMDhfQVNUKTsNCi0JCQkJCW1hdGNoKFNUUklOR19MSVRFUkFMKTsNCi0JCQkJfQ0KLQkJCQllbHNlIHsNCi0JCQkJCWlmICggX2NudDI4Mj49MSApIHsgYnJlYWsgX2xvb3AyODI7IH0gZWxzZSB7dGhyb3cgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKExUKDEpLCBnZXRGaWxlbmFtZSgpKTt9DQotCQkJCX0NCi0JCQkJDQotCQkJCV9jbnQyODIrKzsNCi0JCQl9IHdoaWxlICh0cnVlKTsNCi0JCQl9DQotCQkJc3RyaW5nX2xpdGVyYWxfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzQwKTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gc3RyaW5nX2xpdGVyYWxfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCB3aWRlX3N0cmluZ19saXRlcmFsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQkNCi0JCXJldHVybkFTVCA9IG51bGw7DQotCQlBU1RQYWlyIGN1cnJlbnRBU1QgPSBuZXcgQVNUUGFpcigpOw0KLQkJQVNUIHdpZGVfc3RyaW5nX2xpdGVyYWxfQVNUID0gbnVsbDsNCi0JCQ0KLQkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcNCi0JCQl7DQotCQkJaW50IF9jbnQyODU9MDsNCi0JCQlfbG9vcDI4NToNCi0JCQlkbyB7DQotCQkJCWlmICgoTEEoMSk9PVdJREVfU1RSSU5HX0xJVEVSQUwpKSB7DQotCQkJCQlBU1QgdG1wMTA5X0FTVCA9IG51bGw7DQotCQkJCQl0bXAxMDlfQVNUID0gYXN0RmFjdG9yeS5jcmVhdGUoTFQoMSkpOw0KLQkJCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCB0bXAxMDlfQVNUKTsNCi0JCQkJCW1hdGNoKFdJREVfU1RSSU5HX0xJVEVSQUwpOw0KLQkJCQl9DQotCQkJCWVsc2Ugew0KLQkJCQkJaWYgKCBfY250Mjg1Pj0xICkgeyBicmVhayBfbG9vcDI4NTsgfSBlbHNlIHt0aHJvdyBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oTFQoMSksIGdldEZpbGVuYW1lKCkpO30NCi0JCQkJfQ0KLQkJCQkNCi0JCQkJX2NudDI4NSsrOw0KLQkJCX0gd2hpbGUgKHRydWUpOw0KLQkJCX0NCi0JCQl3aWRlX3N0cmluZ19saXRlcmFsX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJfQ0KLQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJcmVwb3J0RXJyb3IoZXgpOw0KLQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF80MCk7DQotCQkJfSBlbHNlIHsNCi0JCQkgIHRocm93IGV4Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybkFTVCA9IHdpZGVfc3RyaW5nX2xpdGVyYWxfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBjaGFyYWN0ZXJfbGl0ZXJhbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBjaGFyYWN0ZXJfbGl0ZXJhbF9BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCUFTVCB0bXAxMTBfQVNUID0gbnVsbDsNCi0JCQl0bXAxMTBfQVNUID0gYXN0RmFjdG9yeS5jcmVhdGUoTFQoMSkpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgdG1wMTEwX0FTVCk7DQotCQkJbWF0Y2goQ0hBUl9MSVRFUkFMKTsNCi0JCQljaGFyYWN0ZXJfbGl0ZXJhbF9BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCX0NCi0JCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgew0KLQkJCWlmIChpbnB1dFN0YXRlLmd1ZXNzaW5nPT0wKSB7DQotCQkJCXJlcG9ydEVycm9yKGV4KTsNCi0JCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfNDApOw0KLQkJCX0gZWxzZSB7DQotCQkJICB0aHJvdyBleDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm5BU1QgPSBjaGFyYWN0ZXJfbGl0ZXJhbF9BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIHdpZGVfY2hhcmFjdGVyX2xpdGVyYWwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCQ0KLQkJcmV0dXJuQVNUID0gbnVsbDsNCi0JCUFTVFBhaXIgY3VycmVudEFTVCA9IG5ldyBBU1RQYWlyKCk7DQotCQlBU1Qgd2lkZV9jaGFyYWN0ZXJfbGl0ZXJhbF9BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCUFTVCB0bXAxMTFfQVNUID0gbnVsbDsNCi0JCQl0bXAxMTFfQVNUID0gYXN0RmFjdG9yeS5jcmVhdGUoTFQoMSkpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgdG1wMTExX0FTVCk7DQotCQkJbWF0Y2goV0lERV9DSEFSX0xJVEVSQUwpOw0KLQkJCXdpZGVfY2hhcmFjdGVyX2xpdGVyYWxfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzQwKTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gd2lkZV9jaGFyYWN0ZXJfbGl0ZXJhbF9BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIGZpeGVkX3B0X2xpdGVyYWwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCQ0KLQkJcmV0dXJuQVNUID0gbnVsbDsNCi0JCUFTVFBhaXIgY3VycmVudEFTVCA9IG5ldyBBU1RQYWlyKCk7DQotCQlBU1QgZml4ZWRfcHRfbGl0ZXJhbF9BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCUFTVCB0bXAxMTJfQVNUID0gbnVsbDsNCi0JCQl0bXAxMTJfQVNUID0gYXN0RmFjdG9yeS5jcmVhdGUoTFQoMSkpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgdG1wMTEyX0FTVCk7DQotCQkJbWF0Y2goRklYRUQpOw0KLQkJCWZpeGVkX3B0X2xpdGVyYWxfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzQwKTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gZml4ZWRfcHRfbGl0ZXJhbF9BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIGZsb2F0aW5nX3B0X2xpdGVyYWwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCQ0KLQkJcmV0dXJuQVNUID0gbnVsbDsNCi0JCUFTVFBhaXIgY3VycmVudEFTVCA9IG5ldyBBU1RQYWlyKCk7DQotCQlBU1QgZmxvYXRpbmdfcHRfbGl0ZXJhbF9BU1QgPSBudWxsOw0KLQkJVG9rZW4gIGYgPSBudWxsOw0KLQkJQVNUIGZfQVNUID0gbnVsbDsNCi0JCQ0KLQkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcNCi0JCQlmID0gTFQoMSk7DQotCQkJZl9BU1QgPSBhc3RGYWN0b3J5LmNyZWF0ZShmKTsNCi0JCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIGZfQVNUKTsNCi0JCQltYXRjaChGTE9BVCk7DQotCQkJZmxvYXRpbmdfcHRfbGl0ZXJhbF9BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCX0NCi0JCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgew0KLQkJCWlmIChpbnB1dFN0YXRlLmd1ZXNzaW5nPT0wKSB7DQotCQkJCXJlcG9ydEVycm9yKGV4KTsNCi0JCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfNDApOw0KLQkJCX0gZWxzZSB7DQotCQkJICB0aHJvdyBleDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm5BU1QgPSBmbG9hdGluZ19wdF9saXRlcmFsX0FTVDsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgYm9vbGVhbl9saXRlcmFsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQkNCi0JCXJldHVybkFTVCA9IG51bGw7DQotCQlBU1RQYWlyIGN1cnJlbnRBU1QgPSBuZXcgQVNUUGFpcigpOw0KLQkJQVNUIGJvb2xlYW5fbGl0ZXJhbF9BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCXN3aXRjaCAoIExBKDEpKSB7DQotCQkJY2FzZSBMSVRFUkFMX1RSVUU6DQotCQkJew0KLQkJCQlBU1QgdG1wMTEzX0FTVCA9IG51bGw7DQotCQkJCXRtcDExM19BU1QgPSBhc3RGYWN0b3J5LmNyZWF0ZShMVCgxKSk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgdG1wMTEzX0FTVCk7DQotCQkJCW1hdGNoKExJVEVSQUxfVFJVRSk7DQotCQkJCWJvb2xlYW5fbGl0ZXJhbF9BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWNhc2UgTElURVJBTF9GQUxTRToNCi0JCQl7DQotCQkJCUFTVCB0bXAxMTRfQVNUID0gbnVsbDsNCi0JCQkJdG1wMTE0X0FTVCA9IGFzdEZhY3RvcnkuY3JlYXRlKExUKDEpKTsNCi0JCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCB0bXAxMTRfQVNUKTsNCi0JCQkJbWF0Y2goTElURVJBTF9GQUxTRSk7DQotCQkJCWJvb2xlYW5fbGl0ZXJhbF9BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWRlZmF1bHQ6DQotCQkJew0KLQkJCQl0aHJvdyBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oTFQoMSksIGdldEZpbGVuYW1lKCkpOw0KLQkJCX0NCi0JCQl9DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzQwKTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gYm9vbGVhbl9saXRlcmFsX0FTVDsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgcG9zaXRpdmVfaW50X2NvbnN0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQkNCi0JCXJldHVybkFTVCA9IG51bGw7DQotCQlBU1RQYWlyIGN1cnJlbnRBU1QgPSBuZXcgQVNUUGFpcigpOw0KLQkJQVNUIHBvc2l0aXZlX2ludF9jb25zdF9BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCWNvbnN0X2V4cCgpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQlwb3NpdGl2ZV9pbnRfY29uc3RfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzQxKTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gcG9zaXRpdmVfaW50X2NvbnN0X0FTVDsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgdHlwZV9kZWNsYXJhdG9yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQkNCi0JCXJldHVybkFTVCA9IG51bGw7DQotCQlBU1RQYWlyIGN1cnJlbnRBU1QgPSBuZXcgQVNUUGFpcigpOw0KLQkJQVNUIHR5cGVfZGVjbGFyYXRvcl9BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCXR5cGVfc3BlYygpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQlkZWNsYXJhdG9ycygpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQl0eXBlX2RlY2xhcmF0b3JfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzEwKTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gdHlwZV9kZWNsYXJhdG9yX0FTVDsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgc3RydWN0X3R5cGUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCQ0KLQkJcmV0dXJuQVNUID0gbnVsbDsNCi0JCUFTVFBhaXIgY3VycmVudEFTVCA9IG5ldyBBU1RQYWlyKCk7DQotCQlBU1Qgc3RydWN0X3R5cGVfQVNUID0gbnVsbDsNCi0JCQ0KLQkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcNCi0JCQlBU1QgdG1wMTE1X0FTVCA9IG51bGw7DQotCQkJdG1wMTE1X0FTVCA9IGFzdEZhY3RvcnkuY3JlYXRlKExUKDEpKTsNCi0JCQlhc3RGYWN0b3J5Lm1ha2VBU1RSb290KGN1cnJlbnRBU1QsIHRtcDExNV9BU1QpOw0KLQkJCW1hdGNoKExJVEVSQUxfc3RydWN0KTsNCi0JCQlpZGVudGlmaWVyKCk7DQotCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCW1hdGNoKExDVVJMWSk7DQotCQkJbWVtYmVyX2xpc3QoKTsNCi0JCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJbWF0Y2goUkNVUkxZKTsNCi0JCQlzdHJ1Y3RfdHlwZV9BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCX0NCi0JCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgew0KLQkJCWlmIChpbnB1dFN0YXRlLmd1ZXNzaW5nPT0wKSB7DQotCQkJCXJlcG9ydEVycm9yKGV4KTsNCi0JCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfMjEpOw0KLQkJCX0gZWxzZSB7DQotCQkJICB0aHJvdyBleDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm5BU1QgPSBzdHJ1Y3RfdHlwZV9BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIHVuaW9uX3R5cGUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCQ0KLQkJcmV0dXJuQVNUID0gbnVsbDsNCi0JCUFTVFBhaXIgY3VycmVudEFTVCA9IG5ldyBBU1RQYWlyKCk7DQotCQlBU1QgdW5pb25fdHlwZV9BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCUFTVCB0bXAxMThfQVNUID0gbnVsbDsNCi0JCQl0bXAxMThfQVNUID0gYXN0RmFjdG9yeS5jcmVhdGUoTFQoMSkpOw0KLQkJCWFzdEZhY3RvcnkubWFrZUFTVFJvb3QoY3VycmVudEFTVCwgdG1wMTE4X0FTVCk7DQotCQkJbWF0Y2goTElURVJBTF91bmlvbik7DQotCQkJaWRlbnRpZmllcigpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQltYXRjaChMSVRFUkFMX3N3aXRjaCk7DQotCQkJbWF0Y2goTFBBUkVOKTsNCi0JCQlzd2l0Y2hfdHlwZV9zcGVjKCk7DQotCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCW1hdGNoKFJQQVJFTik7DQotCQkJbWF0Y2goTENVUkxZKTsNCi0JCQlzd2l0Y2hfYm9keSgpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQltYXRjaChSQ1VSTFkpOw0KLQkJCXVuaW9uX3R5cGVfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzIxKTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gdW5pb25fdHlwZV9BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIGVudW1fdHlwZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBlbnVtX3R5cGVfQVNUID0gbnVsbDsNCi0JCQ0KLQkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcNCi0JCQlBU1QgdG1wMTI0X0FTVCA9IG51bGw7DQotCQkJdG1wMTI0X0FTVCA9IGFzdEZhY3RvcnkuY3JlYXRlKExUKDEpKTsNCi0JCQlhc3RGYWN0b3J5Lm1ha2VBU1RSb290KGN1cnJlbnRBU1QsIHRtcDEyNF9BU1QpOw0KLQkJCW1hdGNoKExJVEVSQUxfZW51bSk7DQotCQkJaWRlbnRpZmllcigpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQltYXRjaChMQ1VSTFkpOw0KLQkJCWVudW1lcmF0b3JfbGlzdCgpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQltYXRjaChSQ1VSTFkpOw0KLQkJCWVudW1fdHlwZV9BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCX0NCi0JCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgew0KLQkJCWlmIChpbnB1dFN0YXRlLmd1ZXNzaW5nPT0wKSB7DQotCQkJCXJlcG9ydEVycm9yKGV4KTsNCi0JCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfNDIpOw0KLQkJCX0gZWxzZSB7DQotCQkJICB0aHJvdyBleDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm5BU1QgPSBlbnVtX3R5cGVfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBjb25zdHJfZm9yd2FyZF9kZWNsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQkNCi0JCXJldHVybkFTVCA9IG51bGw7DQotCQlBU1RQYWlyIGN1cnJlbnRBU1QgPSBuZXcgQVNUUGFpcigpOw0KLQkJQVNUIGNvbnN0cl9mb3J3YXJkX2RlY2xfQVNUID0gbnVsbDsNCi0JCQ0KLQkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcNCi0JCQlzd2l0Y2ggKCBMQSgxKSkgew0KLQkJCWNhc2UgTElURVJBTF9zdHJ1Y3Q6DQotCQkJew0KLQkJCQlBU1QgdG1wMTI3X0FTVCA9IG51bGw7DQotCQkJCXRtcDEyN19BU1QgPSBhc3RGYWN0b3J5LmNyZWF0ZShMVCgxKSk7DQotCQkJCWFzdEZhY3RvcnkubWFrZUFTVFJvb3QoY3VycmVudEFTVCwgdG1wMTI3X0FTVCk7DQotCQkJCW1hdGNoKExJVEVSQUxfc3RydWN0KTsNCi0JCQkJaWRlbnRpZmllcigpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCWNvbnN0cl9mb3J3YXJkX2RlY2xfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIExJVEVSQUxfdW5pb246DQotCQkJew0KLQkJCQlBU1QgdG1wMTI4X0FTVCA9IG51bGw7DQotCQkJCXRtcDEyOF9BU1QgPSBhc3RGYWN0b3J5LmNyZWF0ZShMVCgxKSk7DQotCQkJCWFzdEZhY3RvcnkubWFrZUFTVFJvb3QoY3VycmVudEFTVCwgdG1wMTI4X0FTVCk7DQotCQkJCW1hdGNoKExJVEVSQUxfdW5pb24pOw0KLQkJCQlpZGVudGlmaWVyKCk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJY29uc3RyX2ZvcndhcmRfZGVjbF9BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWRlZmF1bHQ6DQotCQkJew0KLQkJCQl0aHJvdyBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oTFQoMSksIGdldEZpbGVuYW1lKCkpOw0KLQkJCX0NCi0JCQl9DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzEwKTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gY29uc3RyX2ZvcndhcmRfZGVjbF9BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIHNpbXBsZV90eXBlX3NwZWMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCQ0KLQkJcmV0dXJuQVNUID0gbnVsbDsNCi0JCUFTVFBhaXIgY3VycmVudEFTVCA9IG5ldyBBU1RQYWlyKCk7DQotCQlBU1Qgc2ltcGxlX3R5cGVfc3BlY19BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCXN3aXRjaCAoIExBKDEpKSB7DQotCQkJY2FzZSBMSVRFUkFMX2Zsb2F0Og0KLQkJCWNhc2UgTElURVJBTF9kb3VibGU6DQotCQkJY2FzZSBMSVRFUkFMX2xvbmc6DQotCQkJY2FzZSBMSVRFUkFMX3Nob3J0Og0KLQkJCWNhc2UgTElURVJBTF91bnNpZ25lZDoNCi0JCQljYXNlIExJVEVSQUxfY2hhcjoNCi0JCQljYXNlIExJVEVSQUxfd2NoYXI6DQotCQkJY2FzZSBMSVRFUkFMX2Jvb2xlYW46DQotCQkJY2FzZSBMSVRFUkFMX29jdGV0Og0KLQkJCWNhc2UgTElURVJBTF9hbnk6DQotCQkJY2FzZSBMSVRFUkFMX09iamVjdDoNCi0JCQljYXNlIExJVEVSQUxfVmFsdWVCYXNlOg0KLQkJCXsNCi0JCQkJYmFzZV90eXBlX3NwZWMoKTsNCi0JCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQlzaW1wbGVfdHlwZV9zcGVjX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJY2FzZSBMSVRFUkFMX3NlcXVlbmNlOg0KLQkJCWNhc2UgTElURVJBTF9zdHJpbmc6DQotCQkJY2FzZSBMSVRFUkFMX3dzdHJpbmc6DQotCQkJY2FzZSBMSVRFUkFMX2ZpeGVkOg0KLQkJCXsNCi0JCQkJdGVtcGxhdGVfdHlwZV9zcGVjKCk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJc2ltcGxlX3R5cGVfc3BlY19BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWNhc2UgU0NPUEVPUDoNCi0JCQljYXNlIElERU5UOg0KLQkJCXsNCi0JCQkJc2NvcGVkX25hbWUoKTsNCi0JCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQlzaW1wbGVfdHlwZV9zcGVjX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJZGVmYXVsdDoNCi0JCQl7DQotCQkJCXRocm93IG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihMVCgxKSwgZ2V0RmlsZW5hbWUoKSk7DQotCQkJfQ0KLQkJCX0NCi0JCX0NCi0JCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgew0KLQkJCWlmIChpbnB1dFN0YXRlLmd1ZXNzaW5nPT0wKSB7DQotCQkJCXJlcG9ydEVycm9yKGV4KTsNCi0JCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfMzQpOw0KLQkJCX0gZWxzZSB7DQotCQkJICB0aHJvdyBleDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm5BU1QgPSBzaW1wbGVfdHlwZV9zcGVjX0FTVDsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgY29uc3RyX3R5cGVfc3BlYygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBjb25zdHJfdHlwZV9zcGVjX0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJc3dpdGNoICggTEEoMSkpIHsNCi0JCQljYXNlIExJVEVSQUxfc3RydWN0Og0KLQkJCXsNCi0JCQkJc3RydWN0X3R5cGUoKTsNCi0JCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQljb25zdHJfdHlwZV9zcGVjX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJY2FzZSBMSVRFUkFMX3VuaW9uOg0KLQkJCXsNCi0JCQkJdW5pb25fdHlwZSgpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCWNvbnN0cl90eXBlX3NwZWNfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIExJVEVSQUxfZW51bToNCi0JCQl7DQotCQkJCWVudW1fdHlwZSgpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCWNvbnN0cl90eXBlX3NwZWNfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQlkZWZhdWx0Og0KLQkJCXsNCi0JCQkJdGhyb3cgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKExUKDEpLCBnZXRGaWxlbmFtZSgpKTsNCi0JCQl9DQotCQkJfQ0KLQkJfQ0KLQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJcmVwb3J0RXJyb3IoZXgpOw0KLQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF8yMSk7DQotCQkJfSBlbHNlIHsNCi0JCQkgIHRocm93IGV4Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybkFTVCA9IGNvbnN0cl90eXBlX3NwZWNfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBiYXNlX3R5cGVfc3BlYygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBiYXNlX3R5cGVfc3BlY19BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCXN3aXRjaCAoIExBKDEpKSB7DQotCQkJY2FzZSBMSVRFUkFMX2NoYXI6DQotCQkJew0KLQkJCQljaGFyX3R5cGUoKTsNCi0JCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQliYXNlX3R5cGVfc3BlY19BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWNhc2UgTElURVJBTF93Y2hhcjoNCi0JCQl7DQotCQkJCXdpZGVfY2hhcl90eXBlKCk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJYmFzZV90eXBlX3NwZWNfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIExJVEVSQUxfYm9vbGVhbjoNCi0JCQl7DQotCQkJCWJvb2xlYW5fdHlwZSgpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCWJhc2VfdHlwZV9zcGVjX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJY2FzZSBMSVRFUkFMX29jdGV0Og0KLQkJCXsNCi0JCQkJb2N0ZXRfdHlwZSgpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCWJhc2VfdHlwZV9zcGVjX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJY2FzZSBMSVRFUkFMX2FueToNCi0JCQl7DQotCQkJCWFueV90eXBlKCk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJYmFzZV90eXBlX3NwZWNfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIExJVEVSQUxfT2JqZWN0Og0KLQkJCXsNCi0JCQkJb2JqZWN0X3R5cGUoKTsNCi0JCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQliYXNlX3R5cGVfc3BlY19BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWNhc2UgTElURVJBTF9WYWx1ZUJhc2U6DQotCQkJew0KLQkJCQl2YWx1ZV9iYXNlX3R5cGUoKTsNCi0JCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQliYXNlX3R5cGVfc3BlY19BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWRlZmF1bHQ6DQotCQkJCWJvb2xlYW4gc3luUHJlZE1hdGNoZWQxMTkgPSBmYWxzZTsNCi0JCQkJaWYgKCgoKExBKDEpID49IExJVEVSQUxfZmxvYXQgJiYgTEEoMSkgPD0gTElURVJBTF9sb25nKSkgJiYgKF90b2tlblNldF80My5tZW1iZXIoTEEoMikpKSAmJiAoX3Rva2VuU2V0XzQ0Lm1lbWJlcihMQSgzKSkpICYmIChfdG9rZW5TZXRfNDUubWVtYmVyKExBKDQpKSkpKSB7DQotCQkJCQlpbnQgX20xMTkgPSBtYXJrKCk7DQotCQkJCQlzeW5QcmVkTWF0Y2hlZDExOSA9IHRydWU7DQotCQkJCQlpbnB1dFN0YXRlLmd1ZXNzaW5nKys7DQotCQkJCQl0cnkgew0KLQkJCQkJCXsNCi0JCQkJCQlmbG9hdGluZ19wdF90eXBlKCk7DQotCQkJCQkJfQ0KLQkJCQkJfQ0KLQkJCQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHBlKSB7DQotCQkJCQkJc3luUHJlZE1hdGNoZWQxMTkgPSBmYWxzZTsNCi0JCQkJCX0NCi0JCQkJCXJld2luZChfbTExOSk7DQotaW5wdXRTdGF0ZS5ndWVzc2luZy0tOw0KLQkJCQl9DQotCQkJCWlmICggc3luUHJlZE1hdGNoZWQxMTkgKSB7DQotCQkJCQlmbG9hdGluZ19wdF90eXBlKCk7DQotCQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCQliYXNlX3R5cGVfc3BlY19BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCQkJfQ0KLQkJCQllbHNlIGlmICgoKExBKDEpID49IExJVEVSQUxfbG9uZyAmJiBMQSgxKSA8PSBMSVRFUkFMX3Vuc2lnbmVkKSkgJiYgKF90b2tlblNldF80Ni5tZW1iZXIoTEEoMikpKSAmJiAoX3Rva2VuU2V0XzQ3Lm1lbWJlcihMQSgzKSkpICYmIChfdG9rZW5TZXRfNDUubWVtYmVyKExBKDQpKSkpIHsNCi0JCQkJCWludGVnZXJfdHlwZSgpOw0KLQkJCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQkJYmFzZV90eXBlX3NwZWNfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQkJCX0NCi0JCQllbHNlIHsNCi0JCQkJdGhyb3cgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKExUKDEpLCBnZXRGaWxlbmFtZSgpKTsNCi0JCQl9DQotCQkJfQ0KLQkJfQ0KLQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJcmVwb3J0RXJyb3IoZXgpOw0KLQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF8zNCk7DQotCQkJfSBlbHNlIHsNCi0JCQkgIHRocm93IGV4Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybkFTVCA9IGJhc2VfdHlwZV9zcGVjX0FTVDsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgdGVtcGxhdGVfdHlwZV9zcGVjKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQkNCi0JCXJldHVybkFTVCA9IG51bGw7DQotCQlBU1RQYWlyIGN1cnJlbnRBU1QgPSBuZXcgQVNUUGFpcigpOw0KLQkJQVNUIHRlbXBsYXRlX3R5cGVfc3BlY19BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCXN3aXRjaCAoIExBKDEpKSB7DQotCQkJY2FzZSBMSVRFUkFMX3NlcXVlbmNlOg0KLQkJCXsNCi0JCQkJc2VxdWVuY2VfdHlwZSgpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCXRlbXBsYXRlX3R5cGVfc3BlY19BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWNhc2UgTElURVJBTF9zdHJpbmc6DQotCQkJew0KLQkJCQlzdHJpbmdfdHlwZSgpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCXRlbXBsYXRlX3R5cGVfc3BlY19BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWNhc2UgTElURVJBTF93c3RyaW5nOg0KLQkJCXsNCi0JCQkJd2lkZV9zdHJpbmdfdHlwZSgpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCXRlbXBsYXRlX3R5cGVfc3BlY19BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWNhc2UgTElURVJBTF9maXhlZDoNCi0JCQl7DQotCQkJCWZpeGVkX3B0X3R5cGUoKTsNCi0JCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQl0ZW1wbGF0ZV90eXBlX3NwZWNfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQlkZWZhdWx0Og0KLQkJCXsNCi0JCQkJdGhyb3cgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKExUKDEpLCBnZXRGaWxlbmFtZSgpKTsNCi0JCQl9DQotCQkJfQ0KLQkJfQ0KLQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJcmVwb3J0RXJyb3IoZXgpOw0KLQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF8zNCk7DQotCQkJfSBlbHNlIHsNCi0JCQkgIHRocm93IGV4Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybkFTVCA9IHRlbXBsYXRlX3R5cGVfc3BlY19BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIGFueV90eXBlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQkNCi0JCXJldHVybkFTVCA9IG51bGw7DQotCQlBU1RQYWlyIGN1cnJlbnRBU1QgPSBuZXcgQVNUUGFpcigpOw0KLQkJQVNUIGFueV90eXBlX0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJQVNUIHRtcDEyOV9BU1QgPSBudWxsOw0KLQkJCXRtcDEyOV9BU1QgPSBhc3RGYWN0b3J5LmNyZWF0ZShMVCgxKSk7DQotCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCB0bXAxMjlfQVNUKTsNCi0JCQltYXRjaChMSVRFUkFMX2FueSk7DQotCQkJYW55X3R5cGVfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzM0KTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gYW55X3R5cGVfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBvYmplY3RfdHlwZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBvYmplY3RfdHlwZV9BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCUFTVCB0bXAxMzBfQVNUID0gbnVsbDsNCi0JCQl0bXAxMzBfQVNUID0gYXN0RmFjdG9yeS5jcmVhdGUoTFQoMSkpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgdG1wMTMwX0FTVCk7DQotCQkJbWF0Y2goTElURVJBTF9PYmplY3QpOw0KLQkJCW9iamVjdF90eXBlX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJfQ0KLQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJcmVwb3J0RXJyb3IoZXgpOw0KLQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF8zNCk7DQotCQkJfSBlbHNlIHsNCi0JCQkgIHRocm93IGV4Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybkFTVCA9IG9iamVjdF90eXBlX0FTVDsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgdmFsdWVfYmFzZV90eXBlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQkNCi0JCXJldHVybkFTVCA9IG51bGw7DQotCQlBU1RQYWlyIGN1cnJlbnRBU1QgPSBuZXcgQVNUUGFpcigpOw0KLQkJQVNUIHZhbHVlX2Jhc2VfdHlwZV9BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCUFTVCB0bXAxMzFfQVNUID0gbnVsbDsNCi0JCQl0bXAxMzFfQVNUID0gYXN0RmFjdG9yeS5jcmVhdGUoTFQoMSkpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgdG1wMTMxX0FTVCk7DQotCQkJbWF0Y2goTElURVJBTF9WYWx1ZUJhc2UpOw0KLQkJCXZhbHVlX2Jhc2VfdHlwZV9BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCX0NCi0JCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgew0KLQkJCWlmIChpbnB1dFN0YXRlLmd1ZXNzaW5nPT0wKSB7DQotCQkJCXJlcG9ydEVycm9yKGV4KTsNCi0JCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfMzQpOw0KLQkJCX0gZWxzZSB7DQotCQkJICB0aHJvdyBleDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm5BU1QgPSB2YWx1ZV9iYXNlX3R5cGVfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBzZXF1ZW5jZV90eXBlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQkNCi0JCXJldHVybkFTVCA9IG51bGw7DQotCQlBU1RQYWlyIGN1cnJlbnRBU1QgPSBuZXcgQVNUUGFpcigpOw0KLQkJQVNUIHNlcXVlbmNlX3R5cGVfQVNUID0gbnVsbDsNCi0JCQ0KLQkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcNCi0JCQlBU1QgdG1wMTMyX0FTVCA9IG51bGw7DQotCQkJdG1wMTMyX0FTVCA9IGFzdEZhY3RvcnkuY3JlYXRlKExUKDEpKTsNCi0JCQlhc3RGYWN0b3J5Lm1ha2VBU1RSb290KGN1cnJlbnRBU1QsIHRtcDEzMl9BU1QpOw0KLQkJCW1hdGNoKExJVEVSQUxfc2VxdWVuY2UpOw0KLQkJCW1hdGNoKExUKTsNCi0JCQlzaW1wbGVfdHlwZV9zcGVjKCk7DQotCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCW9wdF9wb3NfaW50KCk7DQotCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCW1hdGNoKEdUKTsNCi0JCQlzZXF1ZW5jZV90eXBlX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJfQ0KLQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJcmVwb3J0RXJyb3IoZXgpOw0KLQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF8zNCk7DQotCQkJfSBlbHNlIHsNCi0JCQkgIHRocm93IGV4Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybkFTVCA9IHNlcXVlbmNlX3R5cGVfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBmaXhlZF9wdF90eXBlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQkNCi0JCXJldHVybkFTVCA9IG51bGw7DQotCQlBU1RQYWlyIGN1cnJlbnRBU1QgPSBuZXcgQVNUUGFpcigpOw0KLQkJQVNUIGZpeGVkX3B0X3R5cGVfQVNUID0gbnVsbDsNCi0JCQ0KLQkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcNCi0JCQlBU1QgdG1wMTM1X0FTVCA9IG51bGw7DQotCQkJdG1wMTM1X0FTVCA9IGFzdEZhY3RvcnkuY3JlYXRlKExUKDEpKTsNCi0JCQlhc3RGYWN0b3J5Lm1ha2VBU1RSb290KGN1cnJlbnRBU1QsIHRtcDEzNV9BU1QpOw0KLQkJCW1hdGNoKExJVEVSQUxfZml4ZWQpOw0KLQkJCW1hdGNoKExUKTsNCi0JCQlwb3NpdGl2ZV9pbnRfY29uc3QoKTsNCi0JCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJbWF0Y2goQ09NTUEpOw0KLQkJCXBvc2l0aXZlX2ludF9jb25zdCgpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQltYXRjaChHVCk7DQotCQkJZml4ZWRfcHRfdHlwZV9BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCX0NCi0JCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgew0KLQkJCWlmIChpbnB1dFN0YXRlLmd1ZXNzaW5nPT0wKSB7DQotCQkJCXJlcG9ydEVycm9yKGV4KTsNCi0JCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfMzQpOw0KLQkJCX0gZWxzZSB7DQotCQkJICB0aHJvdyBleDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm5BU1QgPSBmaXhlZF9wdF90eXBlX0FTVDsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgZGVjbGFyYXRvcigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBkZWNsYXJhdG9yX0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJaWYgKChMQSgxKT09SURFTlQpICYmIChMQSgyKT09U0VNSXx8TEEoMik9PUNPTU1BKSkgew0KLQkJCQlzaW1wbGVfZGVjbGFyYXRvcigpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCWRlY2xhcmF0b3JfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQkJfQ0KLQkJCWVsc2UgaWYgKChMQSgxKT09SURFTlQpICYmIChMQSgyKT09TEJSQUNLKSkgew0KLQkJCQljb21wbGV4X2RlY2xhcmF0b3IoKTsNCi0JCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQlkZWNsYXJhdG9yX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJCX0NCi0JCQllbHNlIHsNCi0JCQkJdGhyb3cgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKExUKDEpLCBnZXRGaWxlbmFtZSgpKTsNCi0JCQl9DQotCQkJDQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzQ4KTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gZGVjbGFyYXRvcl9BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIGNvbXBsZXhfZGVjbGFyYXRvcigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBjb21wbGV4X2RlY2xhcmF0b3JfQVNUID0gbnVsbDsNCi0JCQ0KLQkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcNCi0JCQlhcnJheV9kZWNsYXJhdG9yKCk7DQotCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCWNvbXBsZXhfZGVjbGFyYXRvcl9BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCX0NCi0JCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgew0KLQkJCWlmIChpbnB1dFN0YXRlLmd1ZXNzaW5nPT0wKSB7DQotCQkJCXJlcG9ydEVycm9yKGV4KTsNCi0JCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfNDgpOw0KLQkJCX0gZWxzZSB7DQotCQkJICB0aHJvdyBleDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm5BU1QgPSBjb21wbGV4X2RlY2xhcmF0b3JfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBhcnJheV9kZWNsYXJhdG9yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQkNCi0JCXJldHVybkFTVCA9IG51bGw7DQotCQlBU1RQYWlyIGN1cnJlbnRBU1QgPSBuZXcgQVNUUGFpcigpOw0KLQkJQVNUIGFycmF5X2RlY2xhcmF0b3JfQVNUID0gbnVsbDsNCi0JCQ0KLQkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcNCi0JCQlBU1QgdG1wMTM5X0FTVCA9IG51bGw7DQotCQkJdG1wMTM5X0FTVCA9IGFzdEZhY3RvcnkuY3JlYXRlKExUKDEpKTsNCi0JCQlhc3RGYWN0b3J5Lm1ha2VBU1RSb290KGN1cnJlbnRBU1QsIHRtcDEzOV9BU1QpOw0KLQkJCW1hdGNoKElERU5UKTsNCi0JCQl7DQotCQkJaW50IF9jbnQxNzM9MDsNCi0JCQlfbG9vcDE3MzoNCi0JCQlkbyB7DQotCQkJCWlmICgoTEEoMSk9PUxCUkFDSykpIHsNCi0JCQkJCWZpeGVkX2FycmF5X3NpemUoKTsNCi0JCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJfQ0KLQkJCQllbHNlIHsNCi0JCQkJCWlmICggX2NudDE3Mz49MSApIHsgYnJlYWsgX2xvb3AxNzM7IH0gZWxzZSB7dGhyb3cgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKExUKDEpLCBnZXRGaWxlbmFtZSgpKTt9DQotCQkJCX0NCi0JCQkJDQotCQkJCV9jbnQxNzMrKzsNCi0JCQl9IHdoaWxlICh0cnVlKTsNCi0JCQl9DQotCQkJYXJyYXlfZGVjbGFyYXRvcl9BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCX0NCi0JCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgew0KLQkJCWlmIChpbnB1dFN0YXRlLmd1ZXNzaW5nPT0wKSB7DQotCQkJCXJlcG9ydEVycm9yKGV4KTsNCi0JCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfNDgpOw0KLQkJCX0gZWxzZSB7DQotCQkJICB0aHJvdyBleDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm5BU1QgPSBhcnJheV9kZWNsYXJhdG9yX0FTVDsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgc2lnbmVkX2ludCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBzaWduZWRfaW50X0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJaWYgKChMQSgxKT09TElURVJBTF9zaG9ydCkpIHsNCi0JCQkJc2lnbmVkX3Nob3J0X2ludCgpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCXNpZ25lZF9pbnRfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQkJfQ0KLQkJCWVsc2UgaWYgKChMQSgxKT09TElURVJBTF9sb25nKSAmJiAoX3Rva2VuU2V0XzMzLm1lbWJlcihMQSgyKSkpKSB7DQotCQkJCXNpZ25lZF9sb25nX2ludCgpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCXNpZ25lZF9pbnRfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQkJfQ0KLQkJCWVsc2UgaWYgKChMQSgxKT09TElURVJBTF9sb25nKSAmJiAoTEEoMik9PUxJVEVSQUxfbG9uZykpIHsNCi0JCQkJc2lnbmVkX2xvbmdsb25nX2ludCgpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCXNpZ25lZF9pbnRfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQkJfQ0KLQkJCWVsc2Ugew0KLQkJCQl0aHJvdyBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oTFQoMSksIGdldEZpbGVuYW1lKCkpOw0KLQkJCX0NCi0JCQkNCi0JCX0NCi0JCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgew0KLQkJCWlmIChpbnB1dFN0YXRlLmd1ZXNzaW5nPT0wKSB7DQotCQkJCXJlcG9ydEVycm9yKGV4KTsNCi0JCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfMzMpOw0KLQkJCX0gZWxzZSB7DQotCQkJICB0aHJvdyBleDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm5BU1QgPSBzaWduZWRfaW50X0FTVDsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgdW5zaWduZWRfaW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQkNCi0JCXJldHVybkFTVCA9IG51bGw7DQotCQlBU1RQYWlyIGN1cnJlbnRBU1QgPSBuZXcgQVNUUGFpcigpOw0KLQkJQVNUIHVuc2lnbmVkX2ludF9BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCWlmICgoTEEoMSk9PUxJVEVSQUxfdW5zaWduZWQpICYmIChMQSgyKT09TElURVJBTF9zaG9ydCkpIHsNCi0JCQkJdW5zaWduZWRfc2hvcnRfaW50KCk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJdW5zaWduZWRfaW50X0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJCX0NCi0JCQllbHNlIGlmICgoTEEoMSk9PUxJVEVSQUxfdW5zaWduZWQpICYmIChMQSgyKT09TElURVJBTF9sb25nKSAmJiAoX3Rva2VuU2V0XzMzLm1lbWJlcihMQSgzKSkpKSB7DQotCQkJCXVuc2lnbmVkX2xvbmdfaW50KCk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJdW5zaWduZWRfaW50X0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJCX0NCi0JCQllbHNlIGlmICgoTEEoMSk9PUxJVEVSQUxfdW5zaWduZWQpICYmIChMQSgyKT09TElURVJBTF9sb25nKSAmJiAoTEEoMyk9PUxJVEVSQUxfbG9uZykpIHsNCi0JCQkJdW5zaWduZWRfbG9uZ2xvbmdfaW50KCk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJdW5zaWduZWRfaW50X0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJCX0NCi0JCQllbHNlIHsNCi0JCQkJdGhyb3cgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKExUKDEpLCBnZXRGaWxlbmFtZSgpKTsNCi0JCQl9DQotCQkJDQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzMzKTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gdW5zaWduZWRfaW50X0FTVDsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgc2lnbmVkX3Nob3J0X2ludCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBzaWduZWRfc2hvcnRfaW50X0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJQVNUIHRtcDE0MF9BU1QgPSBudWxsOw0KLQkJCXRtcDE0MF9BU1QgPSBhc3RGYWN0b3J5LmNyZWF0ZShMVCgxKSk7DQotCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCB0bXAxNDBfQVNUKTsNCi0JCQltYXRjaChMSVRFUkFMX3Nob3J0KTsNCi0JCQlzaWduZWRfc2hvcnRfaW50X0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJfQ0KLQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJcmVwb3J0RXJyb3IoZXgpOw0KLQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF8zMyk7DQotCQkJfSBlbHNlIHsNCi0JCQkgIHRocm93IGV4Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybkFTVCA9IHNpZ25lZF9zaG9ydF9pbnRfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBzaWduZWRfbG9uZ19pbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCQ0KLQkJcmV0dXJuQVNUID0gbnVsbDsNCi0JCUFTVFBhaXIgY3VycmVudEFTVCA9IG5ldyBBU1RQYWlyKCk7DQotCQlBU1Qgc2lnbmVkX2xvbmdfaW50X0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJQVNUIHRtcDE0MV9BU1QgPSBudWxsOw0KLQkJCXRtcDE0MV9BU1QgPSBhc3RGYWN0b3J5LmNyZWF0ZShMVCgxKSk7DQotCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCB0bXAxNDFfQVNUKTsNCi0JCQltYXRjaChMSVRFUkFMX2xvbmcpOw0KLQkJCXNpZ25lZF9sb25nX2ludF9BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCX0NCi0JCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgew0KLQkJCWlmIChpbnB1dFN0YXRlLmd1ZXNzaW5nPT0wKSB7DQotCQkJCXJlcG9ydEVycm9yKGV4KTsNCi0JCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfMzMpOw0KLQkJCX0gZWxzZSB7DQotCQkJICB0aHJvdyBleDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm5BU1QgPSBzaWduZWRfbG9uZ19pbnRfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBzaWduZWRfbG9uZ2xvbmdfaW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQkNCi0JCXJldHVybkFTVCA9IG51bGw7DQotCQlBU1RQYWlyIGN1cnJlbnRBU1QgPSBuZXcgQVNUUGFpcigpOw0KLQkJQVNUIHNpZ25lZF9sb25nbG9uZ19pbnRfQVNUID0gbnVsbDsNCi0JCQ0KLQkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcNCi0JCQlBU1QgdG1wMTQyX0FTVCA9IG51bGw7DQotCQkJdG1wMTQyX0FTVCA9IGFzdEZhY3RvcnkuY3JlYXRlKExUKDEpKTsNCi0JCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHRtcDE0Ml9BU1QpOw0KLQkJCW1hdGNoKExJVEVSQUxfbG9uZyk7DQotCQkJQVNUIHRtcDE0M19BU1QgPSBudWxsOw0KLQkJCXRtcDE0M19BU1QgPSBhc3RGYWN0b3J5LmNyZWF0ZShMVCgxKSk7DQotCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCB0bXAxNDNfQVNUKTsNCi0JCQltYXRjaChMSVRFUkFMX2xvbmcpOw0KLQkJCXNpZ25lZF9sb25nbG9uZ19pbnRfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzMzKTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gc2lnbmVkX2xvbmdsb25nX2ludF9BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIHVuc2lnbmVkX3Nob3J0X2ludCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCB1bnNpZ25lZF9zaG9ydF9pbnRfQVNUID0gbnVsbDsNCi0JCQ0KLQkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcNCi0JCQlBU1QgdG1wMTQ0X0FTVCA9IG51bGw7DQotCQkJdG1wMTQ0X0FTVCA9IGFzdEZhY3RvcnkuY3JlYXRlKExUKDEpKTsNCi0JCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHRtcDE0NF9BU1QpOw0KLQkJCW1hdGNoKExJVEVSQUxfdW5zaWduZWQpOw0KLQkJCUFTVCB0bXAxNDVfQVNUID0gbnVsbDsNCi0JCQl0bXAxNDVfQVNUID0gYXN0RmFjdG9yeS5jcmVhdGUoTFQoMSkpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgdG1wMTQ1X0FTVCk7DQotCQkJbWF0Y2goTElURVJBTF9zaG9ydCk7DQotCQkJdW5zaWduZWRfc2hvcnRfaW50X0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJfQ0KLQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJcmVwb3J0RXJyb3IoZXgpOw0KLQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF8zMyk7DQotCQkJfSBlbHNlIHsNCi0JCQkgIHRocm93IGV4Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybkFTVCA9IHVuc2lnbmVkX3Nob3J0X2ludF9BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIHVuc2lnbmVkX2xvbmdfaW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQkNCi0JCXJldHVybkFTVCA9IG51bGw7DQotCQlBU1RQYWlyIGN1cnJlbnRBU1QgPSBuZXcgQVNUUGFpcigpOw0KLQkJQVNUIHVuc2lnbmVkX2xvbmdfaW50X0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJQVNUIHRtcDE0Nl9BU1QgPSBudWxsOw0KLQkJCXRtcDE0Nl9BU1QgPSBhc3RGYWN0b3J5LmNyZWF0ZShMVCgxKSk7DQotCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCB0bXAxNDZfQVNUKTsNCi0JCQltYXRjaChMSVRFUkFMX3Vuc2lnbmVkKTsNCi0JCQlBU1QgdG1wMTQ3X0FTVCA9IG51bGw7DQotCQkJdG1wMTQ3X0FTVCA9IGFzdEZhY3RvcnkuY3JlYXRlKExUKDEpKTsNCi0JCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHRtcDE0N19BU1QpOw0KLQkJCW1hdGNoKExJVEVSQUxfbG9uZyk7DQotCQkJdW5zaWduZWRfbG9uZ19pbnRfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzMzKTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gdW5zaWduZWRfbG9uZ19pbnRfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCB1bnNpZ25lZF9sb25nbG9uZ19pbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCQ0KLQkJcmV0dXJuQVNUID0gbnVsbDsNCi0JCUFTVFBhaXIgY3VycmVudEFTVCA9IG5ldyBBU1RQYWlyKCk7DQotCQlBU1QgdW5zaWduZWRfbG9uZ2xvbmdfaW50X0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJQVNUIHRtcDE0OF9BU1QgPSBudWxsOw0KLQkJCXRtcDE0OF9BU1QgPSBhc3RGYWN0b3J5LmNyZWF0ZShMVCgxKSk7DQotCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCB0bXAxNDhfQVNUKTsNCi0JCQltYXRjaChMSVRFUkFMX3Vuc2lnbmVkKTsNCi0JCQlBU1QgdG1wMTQ5X0FTVCA9IG51bGw7DQotCQkJdG1wMTQ5X0FTVCA9IGFzdEZhY3RvcnkuY3JlYXRlKExUKDEpKTsNCi0JCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHRtcDE0OV9BU1QpOw0KLQkJCW1hdGNoKExJVEVSQUxfbG9uZyk7DQotCQkJQVNUIHRtcDE1MF9BU1QgPSBudWxsOw0KLQkJCXRtcDE1MF9BU1QgPSBhc3RGYWN0b3J5LmNyZWF0ZShMVCgxKSk7DQotCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCB0bXAxNTBfQVNUKTsNCi0JCQltYXRjaChMSVRFUkFMX2xvbmcpOw0KLQkJCXVuc2lnbmVkX2xvbmdsb25nX2ludF9BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCX0NCi0JCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgew0KLQkJCWlmIChpbnB1dFN0YXRlLmd1ZXNzaW5nPT0wKSB7DQotCQkJCXJlcG9ydEVycm9yKGV4KTsNCi0JCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfMzMpOw0KLQkJCX0gZWxzZSB7DQotCQkJICB0aHJvdyBleDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm5BU1QgPSB1bnNpZ25lZF9sb25nbG9uZ19pbnRfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBtZW1iZXJfbGlzdCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBtZW1iZXJfbGlzdF9BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCXsNCi0JCQlpbnQgX2NudDE0Nz0wOw0KLQkJCV9sb29wMTQ3Og0KLQkJCWRvIHsNCi0JCQkJaWYgKChfdG9rZW5TZXRfMTEubWVtYmVyKExBKDEpKSkpIHsNCi0JCQkJCW1lbWJlcigpOw0KLQkJCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQl9DQotCQkJCWVsc2Ugew0KLQkJCQkJaWYgKCBfY250MTQ3Pj0xICkgeyBicmVhayBfbG9vcDE0NzsgfSBlbHNlIHt0aHJvdyBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oTFQoMSksIGdldEZpbGVuYW1lKCkpO30NCi0JCQkJfQ0KLQkJCQkNCi0JCQkJX2NudDE0NysrOw0KLQkJCX0gd2hpbGUgKHRydWUpOw0KLQkJCX0NCi0JCQltZW1iZXJfbGlzdF9BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCX0NCi0JCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgew0KLQkJCWlmIChpbnB1dFN0YXRlLmd1ZXNzaW5nPT0wKSB7DQotCQkJCXJlcG9ydEVycm9yKGV4KTsNCi0JCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfMTMpOw0KLQkJCX0gZWxzZSB7DQotCQkJICB0aHJvdyBleDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm5BU1QgPSBtZW1iZXJfbGlzdF9BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIG1lbWJlcigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBtZW1iZXJfQVNUID0gbnVsbDsNCi0JCQ0KLQkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcNCi0JCQl0eXBlX3NwZWMoKTsNCi0JCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJZGVjbGFyYXRvcnMoKTsNCi0JCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJbWF0Y2goU0VNSSk7DQotCQkJbWVtYmVyX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJfQ0KLQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJcmVwb3J0RXJyb3IoZXgpOw0KLQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF80OSk7DQotCQkJfSBlbHNlIHsNCi0JCQkgIHRocm93IGV4Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybkFTVCA9IG1lbWJlcl9BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIHN3aXRjaF90eXBlX3NwZWMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCQ0KLQkJcmV0dXJuQVNUID0gbnVsbDsNCi0JCUFTVFBhaXIgY3VycmVudEFTVCA9IG5ldyBBU1RQYWlyKCk7DQotCQlBU1Qgc3dpdGNoX3R5cGVfc3BlY19BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCXN3aXRjaCAoIExBKDEpKSB7DQotCQkJY2FzZSBMSVRFUkFMX2xvbmc6DQotCQkJY2FzZSBMSVRFUkFMX3Nob3J0Og0KLQkJCWNhc2UgTElURVJBTF91bnNpZ25lZDoNCi0JCQl7DQotCQkJCWludGVnZXJfdHlwZSgpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCXN3aXRjaF90eXBlX3NwZWNfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIExJVEVSQUxfY2hhcjoNCi0JCQl7DQotCQkJCWNoYXJfdHlwZSgpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCXN3aXRjaF90eXBlX3NwZWNfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIExJVEVSQUxfYm9vbGVhbjoNCi0JCQl7DQotCQkJCWJvb2xlYW5fdHlwZSgpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCXN3aXRjaF90eXBlX3NwZWNfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIExJVEVSQUxfZW51bToNCi0JCQl7DQotCQkJCWVudW1fdHlwZSgpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCXN3aXRjaF90eXBlX3NwZWNfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIFNDT1BFT1A6DQotCQkJY2FzZSBJREVOVDoNCi0JCQl7DQotCQkJCXNjb3BlZF9uYW1lKCk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJc3dpdGNoX3R5cGVfc3BlY19BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWRlZmF1bHQ6DQotCQkJew0KLQkJCQl0aHJvdyBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oTFQoMSksIGdldEZpbGVuYW1lKCkpOw0KLQkJCX0NCi0JCQl9DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzI1KTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gc3dpdGNoX3R5cGVfc3BlY19BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIHN3aXRjaF9ib2R5KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQkNCi0JCXJldHVybkFTVCA9IG51bGw7DQotCQlBU1RQYWlyIGN1cnJlbnRBU1QgPSBuZXcgQVNUUGFpcigpOw0KLQkJQVNUIHN3aXRjaF9ib2R5X0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJY2FzZV9zdG10X2xpc3QoKTsNCi0JCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJc3dpdGNoX2JvZHlfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzEzKTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gc3dpdGNoX2JvZHlfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBjYXNlX3N0bXRfbGlzdCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBjYXNlX3N0bXRfbGlzdF9BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCXsNCi0JCQlpbnQgX2NudDE1ND0wOw0KLQkJCV9sb29wMTU0Og0KLQkJCWRvIHsNCi0JCQkJaWYgKChMQSgxKT09TElURVJBTF9jYXNlfHxMQSgxKT09TElURVJBTF9kZWZhdWx0KSkgew0KLQkJCQkJY2FzZV9zdG10KCk7DQotCQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCX0NCi0JCQkJZWxzZSB7DQotCQkJCQlpZiAoIF9jbnQxNTQ+PTEgKSB7IGJyZWFrIF9sb29wMTU0OyB9IGVsc2Uge3Rocm93IG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihMVCgxKSwgZ2V0RmlsZW5hbWUoKSk7fQ0KLQkJCQl9DQotCQkJCQ0KLQkJCQlfY250MTU0Kys7DQotCQkJfSB3aGlsZSAodHJ1ZSk7DQotCQkJfQ0KLQkJCWNhc2Vfc3RtdF9saXN0X0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJfQ0KLQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJcmVwb3J0RXJyb3IoZXgpOw0KLQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF8xMyk7DQotCQkJfSBlbHNlIHsNCi0JCQkgIHRocm93IGV4Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybkFTVCA9IGNhc2Vfc3RtdF9saXN0X0FTVDsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgY2FzZV9zdG10KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQkNCi0JCXJldHVybkFTVCA9IG51bGw7DQotCQlBU1RQYWlyIGN1cnJlbnRBU1QgPSBuZXcgQVNUUGFpcigpOw0KLQkJQVNUIGNhc2Vfc3RtdF9BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCXsNCi0JCQlpbnQgX2NudDE1Nz0wOw0KLQkJCV9sb29wMTU3Og0KLQkJCWRvIHsNCi0JCQkJc3dpdGNoICggTEEoMSkpIHsNCi0JCQkJY2FzZSBMSVRFUkFMX2Nhc2U6DQotCQkJCXsNCi0JCQkJCUFTVCB0bXAxNTJfQVNUID0gbnVsbDsNCi0JCQkJCXRtcDE1Ml9BU1QgPSBhc3RGYWN0b3J5LmNyZWF0ZShMVCgxKSk7DQotCQkJCQlhc3RGYWN0b3J5Lm1ha2VBU1RSb290KGN1cnJlbnRBU1QsIHRtcDE1Ml9BU1QpOw0KLQkJCQkJbWF0Y2goTElURVJBTF9jYXNlKTsNCi0JCQkJCWNvbnN0X2V4cCgpOw0KLQkJCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQkJbWF0Y2goQ09MT04pOw0KLQkJCQkJYnJlYWs7DQotCQkJCX0NCi0JCQkJY2FzZSBMSVRFUkFMX2RlZmF1bHQ6DQotCQkJCXsNCi0JCQkJCUFTVCB0bXAxNTRfQVNUID0gbnVsbDsNCi0JCQkJCXRtcDE1NF9BU1QgPSBhc3RGYWN0b3J5LmNyZWF0ZShMVCgxKSk7DQotCQkJCQlhc3RGYWN0b3J5Lm1ha2VBU1RSb290KGN1cnJlbnRBU1QsIHRtcDE1NF9BU1QpOw0KLQkJCQkJbWF0Y2goTElURVJBTF9kZWZhdWx0KTsNCi0JCQkJCW1hdGNoKENPTE9OKTsNCi0JCQkJCWJyZWFrOw0KLQkJCQl9DQotCQkJCWRlZmF1bHQ6DQotCQkJCXsNCi0JCQkJCWlmICggX2NudDE1Nz49MSApIHsgYnJlYWsgX2xvb3AxNTc7IH0gZWxzZSB7dGhyb3cgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKExUKDEpLCBnZXRGaWxlbmFtZSgpKTt9DQotCQkJCX0NCi0JCQkJfQ0KLQkJCQlfY250MTU3Kys7DQotCQkJfSB3aGlsZSAodHJ1ZSk7DQotCQkJfQ0KLQkJCWVsZW1lbnRfc3BlYygpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQltYXRjaChTRU1JKTsNCi0JCQljYXNlX3N0bXRfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzUwKTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gY2FzZV9zdG10X0FTVDsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgZWxlbWVudF9zcGVjKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQkNCi0JCXJldHVybkFTVCA9IG51bGw7DQotCQlBU1RQYWlyIGN1cnJlbnRBU1QgPSBuZXcgQVNUUGFpcigpOw0KLQkJQVNUIGVsZW1lbnRfc3BlY19BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCXR5cGVfc3BlYygpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQlkZWNsYXJhdG9yKCk7DQotCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCWVsZW1lbnRfc3BlY19BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCX0NCi0JCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgew0KLQkJCWlmIChpbnB1dFN0YXRlLmd1ZXNzaW5nPT0wKSB7DQotCQkJCXJlcG9ydEVycm9yKGV4KTsNCi0JCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfMTApOw0KLQkJCX0gZWxzZSB7DQotCQkJICB0aHJvdyBleDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm5BU1QgPSBlbGVtZW50X3NwZWNfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBlbnVtZXJhdG9yX2xpc3QoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCQ0KLQkJcmV0dXJuQVNUID0gbnVsbDsNCi0JCUFTVFBhaXIgY3VycmVudEFTVCA9IG5ldyBBU1RQYWlyKCk7DQotCQlBU1QgZW51bWVyYXRvcl9saXN0X0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJZW51bWVyYXRvcigpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQl7DQotCQkJX2xvb3AxNjI6DQotCQkJZG8gew0KLQkJCQlpZiAoKExBKDEpPT1DT01NQSkpIHsNCi0JCQkJCW1hdGNoKENPTU1BKTsNCi0JCQkJCWVudW1lcmF0b3IoKTsNCi0JCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJfQ0KLQkJCQllbHNlIHsNCi0JCQkJCWJyZWFrIF9sb29wMTYyOw0KLQkJCQl9DQotCQkJCQ0KLQkJCX0gd2hpbGUgKHRydWUpOw0KLQkJCX0NCi0JCQllbnVtZXJhdG9yX2xpc3RfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzEzKTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gZW51bWVyYXRvcl9saXN0X0FTVDsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgZW51bWVyYXRvcigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBlbnVtZXJhdG9yX0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJaWRlbnRpZmllcigpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQllbnVtZXJhdG9yX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJfQ0KLQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJcmVwb3J0RXJyb3IoZXgpOw0KLQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF81MSk7DQotCQkJfSBlbHNlIHsNCi0JCQkgIHRocm93IGV4Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybkFTVCA9IGVudW1lcmF0b3JfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBvcHRfcG9zX2ludCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBvcHRfcG9zX2ludF9BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCXsNCi0JCQlzd2l0Y2ggKCBMQSgxKSkgew0KLQkJCWNhc2UgQ09NTUE6DQotCQkJew0KLQkJCQltYXRjaChDT01NQSk7DQotCQkJCXBvc2l0aXZlX2ludF9jb25zdCgpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIEdUOg0KLQkJCXsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWRlZmF1bHQ6DQotCQkJew0KLQkJCQl0aHJvdyBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oTFQoMSksIGdldEZpbGVuYW1lKCkpOw0KLQkJCX0NCi0JCQl9DQotCQkJfQ0KLQkJCW9wdF9wb3NfaW50X0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJfQ0KLQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJcmVwb3J0RXJyb3IoZXgpOw0KLQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF81Mik7DQotCQkJfSBlbHNlIHsNCi0JCQkgIHRocm93IGV4Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybkFTVCA9IG9wdF9wb3NfaW50X0FTVDsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgZml4ZWRfYXJyYXlfc2l6ZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBmaXhlZF9hcnJheV9zaXplX0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJbWF0Y2goTEJSQUNLKTsNCi0JCQlwb3NpdGl2ZV9pbnRfY29uc3QoKTsNCi0JCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJbWF0Y2goUkJSQUNLKTsNCi0JCQlmaXhlZF9hcnJheV9zaXplX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJfQ0KLQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJcmVwb3J0RXJyb3IoZXgpOw0KLQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF81Myk7DQotCQkJfSBlbHNlIHsNCi0JCQkgIHRocm93IGV4Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybkFTVCA9IGZpeGVkX2FycmF5X3NpemVfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCByZWFkb25seV9hdHRyX3NwZWMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCQ0KLQkJcmV0dXJuQVNUID0gbnVsbDsNCi0JCUFTVFBhaXIgY3VycmVudEFTVCA9IG5ldyBBU1RQYWlyKCk7DQotCQlBU1QgcmVhZG9ubHlfYXR0cl9zcGVjX0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJQVNUIHRtcDE2MV9BU1QgPSBudWxsOw0KLQkJCXRtcDE2MV9BU1QgPSBhc3RGYWN0b3J5LmNyZWF0ZShMVCgxKSk7DQotCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCB0bXAxNjFfQVNUKTsNCi0JCQltYXRjaChMSVRFUkFMX3JlYWRvbmx5KTsNCi0JCQlBU1QgdG1wMTYyX0FTVCA9IG51bGw7DQotCQkJdG1wMTYyX0FTVCA9IGFzdEZhY3RvcnkuY3JlYXRlKExUKDEpKTsNCi0JCQlhc3RGYWN0b3J5Lm1ha2VBU1RSb290KGN1cnJlbnRBU1QsIHRtcDE2Ml9BU1QpOw0KLQkJCW1hdGNoKExJVEVSQUxfYXR0cmlidXRlKTsNCi0JCQlwYXJhbV90eXBlX3NwZWMoKTsNCi0JCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJcmVhZG9ubHlfYXR0cl9kZWNsYXJhdG9yKCk7DQotCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCXJlYWRvbmx5X2F0dHJfc3BlY19BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCX0NCi0JCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgew0KLQkJCWlmIChpbnB1dFN0YXRlLmd1ZXNzaW5nPT0wKSB7DQotCQkJCXJlcG9ydEVycm9yKGV4KTsNCi0JCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfMTApOw0KLQkJCX0gZWxzZSB7DQotCQkJICB0aHJvdyBleDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm5BU1QgPSByZWFkb25seV9hdHRyX3NwZWNfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBhdHRyX3NwZWMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCQ0KLQkJcmV0dXJuQVNUID0gbnVsbDsNCi0JCUFTVFBhaXIgY3VycmVudEFTVCA9IG5ldyBBU1RQYWlyKCk7DQotCQlBU1QgYXR0cl9zcGVjX0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJQVNUIHRtcDE2M19BU1QgPSBudWxsOw0KLQkJCXRtcDE2M19BU1QgPSBhc3RGYWN0b3J5LmNyZWF0ZShMVCgxKSk7DQotCQkJYXN0RmFjdG9yeS5tYWtlQVNUUm9vdChjdXJyZW50QVNULCB0bXAxNjNfQVNUKTsNCi0JCQltYXRjaChMSVRFUkFMX2F0dHJpYnV0ZSk7DQotCQkJcGFyYW1fdHlwZV9zcGVjKCk7DQotCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCWF0dHJfZGVjbGFyYXRvcigpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQlhdHRyX3NwZWNfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzEwKTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gYXR0cl9zcGVjX0FTVDsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgb3B0X21lbWJlcl9saXN0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQkNCi0JCXJldHVybkFTVCA9IG51bGw7DQotCQlBU1RQYWlyIGN1cnJlbnRBU1QgPSBuZXcgQVNUUGFpcigpOw0KLQkJQVNUIG9wdF9tZW1iZXJfbGlzdF9BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCXsNCi0JCQlfbG9vcDE3OToNCi0JCQlkbyB7DQotCQkJCWlmICgoX3Rva2VuU2V0XzExLm1lbWJlcihMQSgxKSkpKSB7DQotCQkJCQltZW1iZXIoKTsNCi0JCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJfQ0KLQkJCQllbHNlIHsNCi0JCQkJCWJyZWFrIF9sb29wMTc5Ow0KLQkJCQl9DQotCQkJCQ0KLQkJCX0gd2hpbGUgKHRydWUpOw0KLQkJCX0NCi0JCQlvcHRfbWVtYmVyX2xpc3RfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzEzKTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gb3B0X21lbWJlcl9saXN0X0FTVDsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgb3BfYXR0cmlidXRlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQkNCi0JCXJldHVybkFTVCA9IG51bGw7DQotCQlBU1RQYWlyIGN1cnJlbnRBU1QgPSBuZXcgQVNUUGFpcigpOw0KLQkJQVNUIG9wX2F0dHJpYnV0ZV9BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCUFTVCB0bXAxNjRfQVNUID0gbnVsbDsNCi0JCQl0bXAxNjRfQVNUID0gYXN0RmFjdG9yeS5jcmVhdGUoTFQoMSkpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgdG1wMTY0X0FTVCk7DQotCQkJbWF0Y2goTElURVJBTF9vbmV3YXkpOw0KLQkJCW9wX2F0dHJpYnV0ZV9BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCX0NCi0JCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgew0KLQkJCWlmIChpbnB1dFN0YXRlLmd1ZXNzaW5nPT0wKSB7DQotCQkJCXJlcG9ydEVycm9yKGV4KTsNCi0JCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfNTQpOw0KLQkJCX0gZWxzZSB7DQotCQkJICB0aHJvdyBleDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm5BU1QgPSBvcF9hdHRyaWJ1dGVfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBvcF90eXBlX3NwZWMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCQ0KLQkJcmV0dXJuQVNUID0gbnVsbDsNCi0JCUFTVFBhaXIgY3VycmVudEFTVCA9IG5ldyBBU1RQYWlyKCk7DQotCQlBU1Qgb3BfdHlwZV9zcGVjX0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJc3dpdGNoICggTEEoMSkpIHsNCi0JCQljYXNlIFNDT1BFT1A6DQotCQkJY2FzZSBJREVOVDoNCi0JCQljYXNlIExJVEVSQUxfZmxvYXQ6DQotCQkJY2FzZSBMSVRFUkFMX2RvdWJsZToNCi0JCQljYXNlIExJVEVSQUxfbG9uZzoNCi0JCQljYXNlIExJVEVSQUxfc2hvcnQ6DQotCQkJY2FzZSBMSVRFUkFMX3Vuc2lnbmVkOg0KLQkJCWNhc2UgTElURVJBTF9jaGFyOg0KLQkJCWNhc2UgTElURVJBTF93Y2hhcjoNCi0JCQljYXNlIExJVEVSQUxfYm9vbGVhbjoNCi0JCQljYXNlIExJVEVSQUxfb2N0ZXQ6DQotCQkJY2FzZSBMSVRFUkFMX2FueToNCi0JCQljYXNlIExJVEVSQUxfT2JqZWN0Og0KLQkJCWNhc2UgTElURVJBTF9zdHJpbmc6DQotCQkJY2FzZSBMSVRFUkFMX3dzdHJpbmc6DQotCQkJY2FzZSBMSVRFUkFMX1ZhbHVlQmFzZToNCi0JCQl7DQotCQkJCXBhcmFtX3R5cGVfc3BlYygpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCW9wX3R5cGVfc3BlY19BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWNhc2UgTElURVJBTF92b2lkOg0KLQkJCXsNCi0JCQkJQVNUIHRtcDE2NV9BU1QgPSBudWxsOw0KLQkJCQl0bXAxNjVfQVNUID0gYXN0RmFjdG9yeS5jcmVhdGUoTFQoMSkpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHRtcDE2NV9BU1QpOw0KLQkJCQltYXRjaChMSVRFUkFMX3ZvaWQpOw0KLQkJCQlvcF90eXBlX3NwZWNfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQlkZWZhdWx0Og0KLQkJCXsNCi0JCQkJdGhyb3cgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKExUKDEpLCBnZXRGaWxlbmFtZSgpKTsNCi0JCQl9DQotCQkJfQ0KLQkJfQ0KLQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJcmVwb3J0RXJyb3IoZXgpOw0KLQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF8yOSk7DQotCQkJfSBlbHNlIHsNCi0JCQkgIHRocm93IGV4Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybkFTVCA9IG9wX3R5cGVfc3BlY19BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIHBhcmFtZXRlcl9kY2xzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQkNCi0JCXJldHVybkFTVCA9IG51bGw7DQotCQlBU1RQYWlyIGN1cnJlbnRBU1QgPSBuZXcgQVNUUGFpcigpOw0KLQkJQVNUIHBhcmFtZXRlcl9kY2xzX0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJbWF0Y2goTFBBUkVOKTsNCi0JCQl7DQotCQkJc3dpdGNoICggTEEoMSkpIHsNCi0JCQljYXNlIExJVEVSQUxfaW46DQotCQkJY2FzZSBMSVRFUkFMX291dDoNCi0JCQljYXNlIExJVEVSQUxfaW5vdXQ6DQotCQkJew0KLQkJCQlwYXJhbV9kY2xfbGlzdCgpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIFJQQVJFTjoNCi0JCQl7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQlkZWZhdWx0Og0KLQkJCXsNCi0JCQkJdGhyb3cgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKExUKDEpLCBnZXRGaWxlbmFtZSgpKTsNCi0JCQl9DQotCQkJfQ0KLQkJCX0NCi0JCQltYXRjaChSUEFSRU4pOw0KLQkJCXBhcmFtZXRlcl9kY2xzX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJfQ0KLQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJcmVwb3J0RXJyb3IoZXgpOw0KLQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF81NSk7DQotCQkJfSBlbHNlIHsNCi0JCQkgIHRocm93IGV4Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybkFTVCA9IHBhcmFtZXRlcl9kY2xzX0FTVDsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgY29udGV4dF9leHByKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQkNCi0JCXJldHVybkFTVCA9IG51bGw7DQotCQlBU1RQYWlyIGN1cnJlbnRBU1QgPSBuZXcgQVNUUGFpcigpOw0KLQkJQVNUIGNvbnRleHRfZXhwcl9BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCUFTVCB0bXAxNjhfQVNUID0gbnVsbDsNCi0JCQl0bXAxNjhfQVNUID0gYXN0RmFjdG9yeS5jcmVhdGUoTFQoMSkpOw0KLQkJCWFzdEZhY3RvcnkubWFrZUFTVFJvb3QoY3VycmVudEFTVCwgdG1wMTY4X0FTVCk7DQotCQkJbWF0Y2goTElURVJBTF9jb250ZXh0KTsNCi0JCQltYXRjaChMUEFSRU4pOw0KLQkJCXN0cmluZ19saXRlcmFsX2xpc3QoKTsNCi0JCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJbWF0Y2goUlBBUkVOKTsNCi0JCQljb250ZXh0X2V4cHJfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzEwKTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gY29udGV4dF9leHByX0FTVDsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgcGFyYW1fZGNsX2xpc3QoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCQ0KLQkJcmV0dXJuQVNUID0gbnVsbDsNCi0JCUFTVFBhaXIgY3VycmVudEFTVCA9IG5ldyBBU1RQYWlyKCk7DQotCQlBU1QgcGFyYW1fZGNsX2xpc3RfQVNUID0gbnVsbDsNCi0JCQ0KLQkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcNCi0JCQlwYXJhbV9kY2woKTsNCi0JCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJew0KLQkJCV9sb29wMTkwOg0KLQkJCWRvIHsNCi0JCQkJaWYgKChMQSgxKT09Q09NTUEpKSB7DQotCQkJCQltYXRjaChDT01NQSk7DQotCQkJCQlwYXJhbV9kY2woKTsNCi0JCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJfQ0KLQkJCQllbHNlIHsNCi0JCQkJCWJyZWFrIF9sb29wMTkwOw0KLQkJCQl9DQotCQkJCQ0KLQkJCX0gd2hpbGUgKHRydWUpOw0KLQkJCX0NCi0JCQlwYXJhbV9kY2xfbGlzdF9BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCX0NCi0JCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgew0KLQkJCWlmIChpbnB1dFN0YXRlLmd1ZXNzaW5nPT0wKSB7DQotCQkJCXJlcG9ydEVycm9yKGV4KTsNCi0JCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfMjUpOw0KLQkJCX0gZWxzZSB7DQotCQkJICB0aHJvdyBleDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm5BU1QgPSBwYXJhbV9kY2xfbGlzdF9BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIHBhcmFtX2RjbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBwYXJhbV9kY2xfQVNUID0gbnVsbDsNCi0JCQ0KLQkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcNCi0JCQl7DQotCQkJc3dpdGNoICggTEEoMSkpIHsNCi0JCQljYXNlIExJVEVSQUxfaW46DQotCQkJew0KLQkJCQlBU1QgdG1wMTcyX0FTVCA9IG51bGw7DQotCQkJCXRtcDE3Ml9BU1QgPSBhc3RGYWN0b3J5LmNyZWF0ZShMVCgxKSk7DQotCQkJCWFzdEZhY3RvcnkubWFrZUFTVFJvb3QoY3VycmVudEFTVCwgdG1wMTcyX0FTVCk7DQotCQkJCW1hdGNoKExJVEVSQUxfaW4pOw0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJY2FzZSBMSVRFUkFMX291dDoNCi0JCQl7DQotCQkJCUFTVCB0bXAxNzNfQVNUID0gbnVsbDsNCi0JCQkJdG1wMTczX0FTVCA9IGFzdEZhY3RvcnkuY3JlYXRlKExUKDEpKTsNCi0JCQkJYXN0RmFjdG9yeS5tYWtlQVNUUm9vdChjdXJyZW50QVNULCB0bXAxNzNfQVNUKTsNCi0JCQkJbWF0Y2goTElURVJBTF9vdXQpOw0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJY2FzZSBMSVRFUkFMX2lub3V0Og0KLQkJCXsNCi0JCQkJQVNUIHRtcDE3NF9BU1QgPSBudWxsOw0KLQkJCQl0bXAxNzRfQVNUID0gYXN0RmFjdG9yeS5jcmVhdGUoTFQoMSkpOw0KLQkJCQlhc3RGYWN0b3J5Lm1ha2VBU1RSb290KGN1cnJlbnRBU1QsIHRtcDE3NF9BU1QpOw0KLQkJCQltYXRjaChMSVRFUkFMX2lub3V0KTsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWRlZmF1bHQ6DQotCQkJew0KLQkJCQl0aHJvdyBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oTFQoMSksIGdldEZpbGVuYW1lKCkpOw0KLQkJCX0NCi0JCQl9DQotCQkJfQ0KLQkJCXBhcmFtX3R5cGVfc3BlYygpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQlzaW1wbGVfZGVjbGFyYXRvcigpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQlwYXJhbV9kY2xfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzI3KTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gcGFyYW1fZGNsX0FTVDsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgc3RyaW5nX2xpdGVyYWxfbGlzdCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBzdHJpbmdfbGl0ZXJhbF9saXN0X0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJc3RyaW5nX2xpdGVyYWwoKTsNCi0JCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJew0KLQkJCV9sb29wMTk3Og0KLQkJCWRvIHsNCi0JCQkJaWYgKChMQSgxKT09Q09NTUEpKSB7DQotCQkJCQltYXRjaChDT01NQSk7DQotCQkJCQlzdHJpbmdfbGl0ZXJhbCgpOw0KLQkJCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQl9DQotCQkJCWVsc2Ugew0KLQkJCQkJYnJlYWsgX2xvb3AxOTc7DQotCQkJCX0NCi0JCQkJDQotCQkJfSB3aGlsZSAodHJ1ZSk7DQotCQkJfQ0KLQkJCXN0cmluZ19saXRlcmFsX2xpc3RfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzI1KTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gc3RyaW5nX2xpdGVyYWxfbGlzdF9BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIGltcG9ydGVkX3Njb3BlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQkNCi0JCXJldHVybkFTVCA9IG51bGw7DQotCQlBU1RQYWlyIGN1cnJlbnRBU1QgPSBuZXcgQVNUUGFpcigpOw0KLQkJQVNUIGltcG9ydGVkX3Njb3BlX0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJc3dpdGNoICggTEEoMSkpIHsNCi0JCQljYXNlIFNDT1BFT1A6DQotCQkJY2FzZSBJREVOVDoNCi0JCQl7DQotCQkJCXNjb3BlZF9uYW1lKCk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJaW1wb3J0ZWRfc2NvcGVfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIFNUUklOR19MSVRFUkFMOg0KLQkJCXsNCi0JCQkJc3RyaW5nX2xpdGVyYWwoKTsNCi0JCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQlpbXBvcnRlZF9zY29wZV9BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWRlZmF1bHQ6DQotCQkJew0KLQkJCQl0aHJvdyBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oTFQoMSksIGdldEZpbGVuYW1lKCkpOw0KLQkJCX0NCi0JCQl9DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzEwKTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gaW1wb3J0ZWRfc2NvcGVfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCByZWFkb25seV9hdHRyX2RlY2xhcmF0b3IoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCQ0KLQkJcmV0dXJuQVNUID0gbnVsbDsNCi0JCUFTVFBhaXIgY3VycmVudEFTVCA9IG5ldyBBU1RQYWlyKCk7DQotCQlBU1QgcmVhZG9ubHlfYXR0cl9kZWNsYXJhdG9yX0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJc2ltcGxlX2RlY2xhcmF0b3IoKTsNCi0JCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJew0KLQkJCXN3aXRjaCAoIExBKDEpKSB7DQotCQkJY2FzZSBMSVRFUkFMX3JhaXNlczoNCi0JCQl7DQotCQkJCXJhaXNlc19leHByKCk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWNhc2UgU0VNSToNCi0JCQljYXNlIENPTU1BOg0KLQkJCXsNCi0JCQkJew0KLQkJCQlfbG9vcDIxMToNCi0JCQkJZG8gew0KLQkJCQkJaWYgKChMQSgxKT09Q09NTUEpKSB7DQotCQkJCQkJbWF0Y2goQ09NTUEpOw0KLQkJCQkJCXNpbXBsZV9kZWNsYXJhdG9yKCk7DQotCQkJCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQkJfQ0KLQkJCQkJZWxzZSB7DQotCQkJCQkJYnJlYWsgX2xvb3AyMTE7DQotCQkJCQl9DQotCQkJCQkNCi0JCQkJfSB3aGlsZSAodHJ1ZSk7DQotCQkJCX0NCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWRlZmF1bHQ6DQotCQkJew0KLQkJCQl0aHJvdyBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oTFQoMSksIGdldEZpbGVuYW1lKCkpOw0KLQkJCX0NCi0JCQl9DQotCQkJfQ0KLQkJCXJlYWRvbmx5X2F0dHJfZGVjbGFyYXRvcl9BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCX0NCi0JCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgew0KLQkJCWlmIChpbnB1dFN0YXRlLmd1ZXNzaW5nPT0wKSB7DQotCQkJCXJlcG9ydEVycm9yKGV4KTsNCi0JCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfMTApOw0KLQkJCX0gZWxzZSB7DQotCQkJICB0aHJvdyBleDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm5BU1QgPSByZWFkb25seV9hdHRyX2RlY2xhcmF0b3JfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBhdHRyX2RlY2xhcmF0b3IoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCQ0KLQkJcmV0dXJuQVNUID0gbnVsbDsNCi0JCUFTVFBhaXIgY3VycmVudEFTVCA9IG5ldyBBU1RQYWlyKCk7DQotCQlBU1QgYXR0cl9kZWNsYXJhdG9yX0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJc2ltcGxlX2RlY2xhcmF0b3IoKTsNCi0JCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJew0KLQkJCWJvb2xlYW4gc3luUHJlZE1hdGNoZWQyMTYgPSBmYWxzZTsNCi0JCQlpZiAoKChMQSgxKT09U0VNSXx8TEEoMSk9PUxJVEVSQUxfZ2V0cmFpc2VzfHxMQSgxKT09TElURVJBTF9zZXRyYWlzZXMpICYmIChfdG9rZW5TZXRfNTYubWVtYmVyKExBKDIpKSkgJiYgKF90b2tlblNldF81Ny5tZW1iZXIoTEEoMykpKSAmJiAoX3Rva2VuU2V0XzU4Lm1lbWJlcihMQSg0KSkpKSkgew0KLQkJCQlpbnQgX20yMTYgPSBtYXJrKCk7DQotCQkJCXN5blByZWRNYXRjaGVkMjE2ID0gdHJ1ZTsNCi0JCQkJaW5wdXRTdGF0ZS5ndWVzc2luZysrOw0KLQkJCQl0cnkgew0KLQkJCQkJew0KLQkJCQkJc3dpdGNoICggTEEoMSkpIHsNCi0JCQkJCWNhc2UgTElURVJBTF9nZXRyYWlzZXM6DQotCQkJCQl7DQotCQkJCQkJbWF0Y2goTElURVJBTF9nZXRyYWlzZXMpOw0KLQkJCQkJCWJyZWFrOw0KLQkJCQkJfQ0KLQkJCQkJY2FzZSBMSVRFUkFMX3NldHJhaXNlczoNCi0JCQkJCXsNCi0JCQkJCQltYXRjaChMSVRFUkFMX3NldHJhaXNlcyk7DQotCQkJCQkJYnJlYWs7DQotCQkJCQl9DQotCQkJCQlkZWZhdWx0Og0KLQkJCQkJew0KLQkJCQkJCXRocm93IG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihMVCgxKSwgZ2V0RmlsZW5hbWUoKSk7DQotCQkJCQl9DQotCQkJCQl9DQotCQkJCQl9DQotCQkJCX0NCi0JCQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHBlKSB7DQotCQkJCQlzeW5QcmVkTWF0Y2hlZDIxNiA9IGZhbHNlOw0KLQkJCQl9DQotCQkJCXJld2luZChfbTIxNik7DQotaW5wdXRTdGF0ZS5ndWVzc2luZy0tOw0KLQkJCX0NCi0JCQlpZiAoIHN5blByZWRNYXRjaGVkMjE2ICkgew0KLQkJCQlhdHRyX3JhaXNlc19leHByKCk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQl9DQotCQkJZWxzZSBpZiAoKExBKDEpPT1TRU1JfHxMQSgxKT09Q09NTUEpICYmIChfdG9rZW5TZXRfNTkubWVtYmVyKExBKDIpKSkgJiYgKF90b2tlblNldF82MC5tZW1iZXIoTEEoMykpKSAmJiAoX3Rva2VuU2V0XzYxLm1lbWJlcihMQSg0KSkpKSB7DQotCQkJCXsNCi0JCQkJX2xvb3AyMTg6DQotCQkJCWRvIHsNCi0JCQkJCWlmICgoTEEoMSk9PUNPTU1BKSkgew0KLQkJCQkJCW1hdGNoKENPTU1BKTsNCi0JCQkJCQlzaW1wbGVfZGVjbGFyYXRvcigpOw0KLQkJCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJCX0NCi0JCQkJCWVsc2Ugew0KLQkJCQkJCWJyZWFrIF9sb29wMjE4Ow0KLQkJCQkJfQ0KLQkJCQkJDQotCQkJCX0gd2hpbGUgKHRydWUpOw0KLQkJCQl9DQotCQkJfQ0KLQkJCWVsc2Ugew0KLQkJCQl0aHJvdyBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oTFQoMSksIGdldEZpbGVuYW1lKCkpOw0KLQkJCX0NCi0JCQkNCi0JCQl9DQotCQkJYXR0cl9kZWNsYXJhdG9yX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJfQ0KLQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJcmVwb3J0RXJyb3IoZXgpOw0KLQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF8xMCk7DQotCQkJfSBlbHNlIHsNCi0JCQkgIHRocm93IGV4Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybkFTVCA9IGF0dHJfZGVjbGFyYXRvcl9BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIGF0dHJfcmFpc2VzX2V4cHIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCQ0KLQkJcmV0dXJuQVNUID0gbnVsbDsNCi0JCUFTVFBhaXIgY3VycmVudEFTVCA9IG5ldyBBU1RQYWlyKCk7DQotCQlBU1QgYXR0cl9yYWlzZXNfZXhwcl9BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCXsNCi0JCQlzd2l0Y2ggKCBMQSgxKSkgew0KLQkJCWNhc2UgTElURVJBTF9nZXRyYWlzZXM6DQotCQkJew0KLQkJCQlnZXRfZXhjZXBfZXhwcigpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIFNFTUk6DQotCQkJY2FzZSBMSVRFUkFMX3NldHJhaXNlczoNCi0JCQl7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQlkZWZhdWx0Og0KLQkJCXsNCi0JCQkJdGhyb3cgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKExUKDEpLCBnZXRGaWxlbmFtZSgpKTsNCi0JCQl9DQotCQkJfQ0KLQkJCX0NCi0JCQl7DQotCQkJc3dpdGNoICggTEEoMSkpIHsNCi0JCQljYXNlIExJVEVSQUxfc2V0cmFpc2VzOg0KLQkJCXsNCi0JCQkJc2V0X2V4Y2VwX2V4cHIoKTsNCi0JCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJY2FzZSBTRU1JOg0KLQkJCXsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWRlZmF1bHQ6DQotCQkJew0KLQkJCQl0aHJvdyBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oTFQoMSksIGdldEZpbGVuYW1lKCkpOw0KLQkJCX0NCi0JCQl9DQotCQkJfQ0KLQkJCWF0dHJfcmFpc2VzX2V4cHJfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzEwKTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gYXR0cl9yYWlzZXNfZXhwcl9BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIGdldF9leGNlcF9leHByKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQkNCi0JCXJldHVybkFTVCA9IG51bGw7DQotCQlBU1RQYWlyIGN1cnJlbnRBU1QgPSBuZXcgQVNUUGFpcigpOw0KLQkJQVNUIGdldF9leGNlcF9leHByX0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJQVNUIHRtcDE3OF9BU1QgPSBudWxsOw0KLQkJCXRtcDE3OF9BU1QgPSBhc3RGYWN0b3J5LmNyZWF0ZShMVCgxKSk7DQotCQkJYXN0RmFjdG9yeS5tYWtlQVNUUm9vdChjdXJyZW50QVNULCB0bXAxNzhfQVNUKTsNCi0JCQltYXRjaChMSVRFUkFMX2dldHJhaXNlcyk7DQotCQkJZXhjZXB0aW9uX2xpc3QoKTsNCi0JCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJZ2V0X2V4Y2VwX2V4cHJfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzYyKTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gZ2V0X2V4Y2VwX2V4cHJfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBzZXRfZXhjZXBfZXhwcigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBzZXRfZXhjZXBfZXhwcl9BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCUFTVCB0bXAxNzlfQVNUID0gbnVsbDsNCi0JCQl0bXAxNzlfQVNUID0gYXN0RmFjdG9yeS5jcmVhdGUoTFQoMSkpOw0KLQkJCWFzdEZhY3RvcnkubWFrZUFTVFJvb3QoY3VycmVudEFTVCwgdG1wMTc5X0FTVCk7DQotCQkJbWF0Y2goTElURVJBTF9zZXRyYWlzZXMpOw0KLQkJCWV4Y2VwdGlvbl9saXN0KCk7DQotCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCXNldF9leGNlcF9leHByX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJfQ0KLQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJcmVwb3J0RXJyb3IoZXgpOw0KLQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF8xMCk7DQotCQkJfSBlbHNlIHsNCi0JCQkgIHRocm93IGV4Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybkFTVCA9IHNldF9leGNlcF9leHByX0FTVDsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgZXhjZXB0aW9uX2xpc3QoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCQ0KLQkJcmV0dXJuQVNUID0gbnVsbDsNCi0JCUFTVFBhaXIgY3VycmVudEFTVCA9IG5ldyBBU1RQYWlyKCk7DQotCQlBU1QgZXhjZXB0aW9uX2xpc3RfQVNUID0gbnVsbDsNCi0JCQ0KLQkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcNCi0JCQltYXRjaChMUEFSRU4pOw0KLQkJCXNjb3BlZF9uYW1lKCk7DQotCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCXsNCi0JCQlfbG9vcDIyNjoNCi0JCQlkbyB7DQotCQkJCWlmICgoTEEoMSk9PUNPTU1BKSkgew0KLQkJCQkJbWF0Y2goQ09NTUEpOw0KLQkJCQkJc2NvcGVkX25hbWUoKTsNCi0JCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJfQ0KLQkJCQllbHNlIHsNCi0JCQkJCWJyZWFrIF9sb29wMjI2Ow0KLQkJCQl9DQotCQkJCQ0KLQkJCX0gd2hpbGUgKHRydWUpOw0KLQkJCX0NCi0JCQltYXRjaChSUEFSRU4pOw0KLQkJCWV4Y2VwdGlvbl9saXN0X0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJfQ0KLQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJcmVwb3J0RXJyb3IoZXgpOw0KLQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF82Mik7DQotCQkJfSBlbHNlIHsNCi0JCQkgIHRocm93IGV4Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybkFTVCA9IGV4Y2VwdGlvbl9saXN0X0FTVDsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgY29tcG9uZW50X2RjbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBjb21wb25lbnRfZGNsX0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJew0KLQkJCXN3aXRjaCAoIExBKDEpKSB7DQotCQkJY2FzZSBDT0xPTjoNCi0JCQl7DQotCQkJCWNvbXBvbmVudF9pbmhlcml0YW5jZV9zcGVjKCk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWNhc2UgTENVUkxZOg0KLQkJCWNhc2UgTElURVJBTF9zdXBwb3J0czoNCi0JCQl7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQlkZWZhdWx0Og0KLQkJCXsNCi0JCQkJdGhyb3cgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKExUKDEpLCBnZXRGaWxlbmFtZSgpKTsNCi0JCQl9DQotCQkJfQ0KLQkJCX0NCi0JCQl7DQotCQkJc3dpdGNoICggTEEoMSkpIHsNCi0JCQljYXNlIExJVEVSQUxfc3VwcG9ydHM6DQotCQkJew0KLQkJCQlzdXBwb3J0ZWRfaW50ZXJmYWNlX3NwZWMoKTsNCi0JCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJY2FzZSBMQ1VSTFk6DQotCQkJew0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJZGVmYXVsdDoNCi0JCQl7DQotCQkJCXRocm93IG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihMVCgxKSwgZ2V0RmlsZW5hbWUoKSk7DQotCQkJfQ0KLQkJCX0NCi0JCQl9DQotCQkJbWF0Y2goTENVUkxZKTsNCi0JCQljb21wb25lbnRfYm9keSgpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQltYXRjaChSQ1VSTFkpOw0KLQkJCWNvbXBvbmVudF9kY2xfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzEwKTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gY29tcG9uZW50X2RjbF9BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIGNvbXBvbmVudF9pbmhlcml0YW5jZV9zcGVjKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQkNCi0JCXJldHVybkFTVCA9IG51bGw7DQotCQlBU1RQYWlyIGN1cnJlbnRBU1QgPSBuZXcgQVNUUGFpcigpOw0KLQkJQVNUIGNvbXBvbmVudF9pbmhlcml0YW5jZV9zcGVjX0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJQVNUIHRtcDE4NV9BU1QgPSBudWxsOw0KLQkJCXRtcDE4NV9BU1QgPSBhc3RGYWN0b3J5LmNyZWF0ZShMVCgxKSk7DQotCQkJYXN0RmFjdG9yeS5tYWtlQVNUUm9vdChjdXJyZW50QVNULCB0bXAxODVfQVNUKTsNCi0JCQltYXRjaChDT0xPTik7DQotCQkJc2NvcGVkX25hbWUoKTsNCi0JCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJY29tcG9uZW50X2luaGVyaXRhbmNlX3NwZWNfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzIzKTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gY29tcG9uZW50X2luaGVyaXRhbmNlX3NwZWNfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBzdXBwb3J0ZWRfaW50ZXJmYWNlX3NwZWMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCQ0KLQkJcmV0dXJuQVNUID0gbnVsbDsNCi0JCUFTVFBhaXIgY3VycmVudEFTVCA9IG5ldyBBU1RQYWlyKCk7DQotCQlBU1Qgc3VwcG9ydGVkX2ludGVyZmFjZV9zcGVjX0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJQVNUIHRtcDE4Nl9BU1QgPSBudWxsOw0KLQkJCXRtcDE4Nl9BU1QgPSBhc3RGYWN0b3J5LmNyZWF0ZShMVCgxKSk7DQotCQkJYXN0RmFjdG9yeS5tYWtlQVNUUm9vdChjdXJyZW50QVNULCB0bXAxODZfQVNUKTsNCi0JCQltYXRjaChMSVRFUkFMX3N1cHBvcnRzKTsNCi0JCQlzY29wZWRfbmFtZSgpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQl7DQotCQkJX2xvb3AyMzQ6DQotCQkJZG8gew0KLQkJCQlpZiAoKExBKDEpPT1DT01NQSkpIHsNCi0JCQkJCW1hdGNoKENPTU1BKTsNCi0JCQkJCXNjb3BlZF9uYW1lKCk7DQotCQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCX0NCi0JCQkJZWxzZSB7DQotCQkJCQlicmVhayBfbG9vcDIzNDsNCi0JCQkJfQ0KLQkJCQkNCi0JCQl9IHdoaWxlICh0cnVlKTsNCi0JCQl9DQotCQkJc3VwcG9ydGVkX2ludGVyZmFjZV9zcGVjX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJfQ0KLQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJcmVwb3J0RXJyb3IoZXgpOw0KLQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF82Myk7DQotCQkJfSBlbHNlIHsNCi0JCQkgIHRocm93IGV4Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybkFTVCA9IHN1cHBvcnRlZF9pbnRlcmZhY2Vfc3BlY19BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIGNvbXBvbmVudF9ib2R5KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQkNCi0JCXJldHVybkFTVCA9IG51bGw7DQotCQlBU1RQYWlyIGN1cnJlbnRBU1QgPSBuZXcgQVNUUGFpcigpOw0KLQkJQVNUIGNvbXBvbmVudF9ib2R5X0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJew0KLQkJCV9sb29wMjM4Og0KLQkJCWRvIHsNCi0JCQkJaWYgKChfdG9rZW5TZXRfNjQubWVtYmVyKExBKDEpKSkpIHsNCi0JCQkJCWNvbXBvbmVudF9leHBvcnQoKTsNCi0JCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJfQ0KLQkJCQllbHNlIHsNCi0JCQkJCWJyZWFrIF9sb29wMjM4Ow0KLQkJCQl9DQotCQkJCQ0KLQkJCX0gd2hpbGUgKHRydWUpOw0KLQkJCX0NCi0JCQljb21wb25lbnRfYm9keV9BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCX0NCi0JCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgew0KLQkJCWlmIChpbnB1dFN0YXRlLmd1ZXNzaW5nPT0wKSB7DQotCQkJCXJlcG9ydEVycm9yKGV4KTsNCi0JCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfMTMpOw0KLQkJCX0gZWxzZSB7DQotCQkJICB0aHJvdyBleDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm5BU1QgPSBjb21wb25lbnRfYm9keV9BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIGNvbXBvbmVudF9leHBvcnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCQ0KLQkJcmV0dXJuQVNUID0gbnVsbDsNCi0JCUFTVFBhaXIgY3VycmVudEFTVCA9IG5ldyBBU1RQYWlyKCk7DQotCQlBU1QgY29tcG9uZW50X2V4cG9ydF9BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCXsNCi0JCQlzd2l0Y2ggKCBMQSgxKSkgew0KLQkJCWNhc2UgTElURVJBTF9wcm92aWRlczoNCi0JCQl7DQotCQkJCXByb3ZpZGVzX2RjbCgpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCW1hdGNoKFNFTUkpOw0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJY2FzZSBMSVRFUkFMX3VzZXM6DQotCQkJew0KLQkJCQl1c2VzX2RjbCgpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCW1hdGNoKFNFTUkpOw0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJY2FzZSBMSVRFUkFMX2VtaXRzOg0KLQkJCXsNCi0JCQkJZW1pdHNfZGNsKCk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJbWF0Y2goU0VNSSk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIExJVEVSQUxfcHVibGlzaGVzOg0KLQkJCXsNCi0JCQkJcHVibGlzaGVzX2RjbCgpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCW1hdGNoKFNFTUkpOw0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJY2FzZSBMSVRFUkFMX2NvbnN1bWVzOg0KLQkJCXsNCi0JCQkJY29uc3VtZXNfZGNsKCk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJbWF0Y2goU0VNSSk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIExJVEVSQUxfcmVhZG9ubHk6DQotCQkJY2FzZSBMSVRFUkFMX2F0dHJpYnV0ZToNCi0JCQl7DQotCQkJCWF0dHJfZGNsKCk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJbWF0Y2goU0VNSSk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQlkZWZhdWx0Og0KLQkJCXsNCi0JCQkJdGhyb3cgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKExUKDEpLCBnZXRGaWxlbmFtZSgpKTsNCi0JCQl9DQotCQkJfQ0KLQkJCX0NCi0JCQljb21wb25lbnRfZXhwb3J0X0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJfQ0KLQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJcmVwb3J0RXJyb3IoZXgpOw0KLQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF82NSk7DQotCQkJfSBlbHNlIHsNCi0JCQkgIHRocm93IGV4Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybkFTVCA9IGNvbXBvbmVudF9leHBvcnRfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBwcm92aWRlc19kY2woKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCQ0KLQkJcmV0dXJuQVNUID0gbnVsbDsNCi0JCUFTVFBhaXIgY3VycmVudEFTVCA9IG5ldyBBU1RQYWlyKCk7DQotCQlBU1QgcHJvdmlkZXNfZGNsX0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJQVNUIHRtcDE5NF9BU1QgPSBudWxsOw0KLQkJCXRtcDE5NF9BU1QgPSBhc3RGYWN0b3J5LmNyZWF0ZShMVCgxKSk7DQotCQkJYXN0RmFjdG9yeS5tYWtlQVNUUm9vdChjdXJyZW50QVNULCB0bXAxOTRfQVNUKTsNCi0JCQltYXRjaChMSVRFUkFMX3Byb3ZpZGVzKTsNCi0JCQlpbnRlcmZhY2VfdHlwZSgpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQlpZGVudGlmaWVyKCk7DQotCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCXByb3ZpZGVzX2RjbF9BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCX0NCi0JCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgew0KLQkJCWlmIChpbnB1dFN0YXRlLmd1ZXNzaW5nPT0wKSB7DQotCQkJCXJlcG9ydEVycm9yKGV4KTsNCi0JCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfMTApOw0KLQkJCX0gZWxzZSB7DQotCQkJICB0aHJvdyBleDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm5BU1QgPSBwcm92aWRlc19kY2xfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCB1c2VzX2RjbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCB1c2VzX2RjbF9BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCUFTVCB0bXAxOTVfQVNUID0gbnVsbDsNCi0JCQl0bXAxOTVfQVNUID0gYXN0RmFjdG9yeS5jcmVhdGUoTFQoMSkpOw0KLQkJCWFzdEZhY3RvcnkubWFrZUFTVFJvb3QoY3VycmVudEFTVCwgdG1wMTk1X0FTVCk7DQotCQkJbWF0Y2goTElURVJBTF91c2VzKTsNCi0JCQl7DQotCQkJc3dpdGNoICggTEEoMSkpIHsNCi0JCQljYXNlIExJVEVSQUxfbXVsdGlwbGU6DQotCQkJew0KLQkJCQlBU1QgdG1wMTk2X0FTVCA9IG51bGw7DQotCQkJCXRtcDE5Nl9BU1QgPSBhc3RGYWN0b3J5LmNyZWF0ZShMVCgxKSk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgdG1wMTk2X0FTVCk7DQotCQkJCW1hdGNoKExJVEVSQUxfbXVsdGlwbGUpOw0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJY2FzZSBTQ09QRU9QOg0KLQkJCWNhc2UgSURFTlQ6DQotCQkJY2FzZSBMSVRFUkFMX09iamVjdDoNCi0JCQl7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQlkZWZhdWx0Og0KLQkJCXsNCi0JCQkJdGhyb3cgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKExUKDEpLCBnZXRGaWxlbmFtZSgpKTsNCi0JCQl9DQotCQkJfQ0KLQkJCX0NCi0JCQlpbnRlcmZhY2VfdHlwZSgpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQlpZGVudGlmaWVyKCk7DQotCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCXVzZXNfZGNsX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJfQ0KLQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJcmVwb3J0RXJyb3IoZXgpOw0KLQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF8xMCk7DQotCQkJfSBlbHNlIHsNCi0JCQkgIHRocm93IGV4Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybkFTVCA9IHVzZXNfZGNsX0FTVDsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgZW1pdHNfZGNsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQkNCi0JCXJldHVybkFTVCA9IG51bGw7DQotCQlBU1RQYWlyIGN1cnJlbnRBU1QgPSBuZXcgQVNUUGFpcigpOw0KLQkJQVNUIGVtaXRzX2RjbF9BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCUFTVCB0bXAxOTdfQVNUID0gbnVsbDsNCi0JCQl0bXAxOTdfQVNUID0gYXN0RmFjdG9yeS5jcmVhdGUoTFQoMSkpOw0KLQkJCWFzdEZhY3RvcnkubWFrZUFTVFJvb3QoY3VycmVudEFTVCwgdG1wMTk3X0FTVCk7DQotCQkJbWF0Y2goTElURVJBTF9lbWl0cyk7DQotCQkJc2NvcGVkX25hbWUoKTsNCi0JCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJaWRlbnRpZmllcigpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQllbWl0c19kY2xfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzEwKTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gZW1pdHNfZGNsX0FTVDsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgcHVibGlzaGVzX2RjbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBwdWJsaXNoZXNfZGNsX0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJQVNUIHRtcDE5OF9BU1QgPSBudWxsOw0KLQkJCXRtcDE5OF9BU1QgPSBhc3RGYWN0b3J5LmNyZWF0ZShMVCgxKSk7DQotCQkJYXN0RmFjdG9yeS5tYWtlQVNUUm9vdChjdXJyZW50QVNULCB0bXAxOThfQVNUKTsNCi0JCQltYXRjaChMSVRFUkFMX3B1Ymxpc2hlcyk7DQotCQkJc2NvcGVkX25hbWUoKTsNCi0JCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJaWRlbnRpZmllcigpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQlwdWJsaXNoZXNfZGNsX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJfQ0KLQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJcmVwb3J0RXJyb3IoZXgpOw0KLQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF8xMCk7DQotCQkJfSBlbHNlIHsNCi0JCQkgIHRocm93IGV4Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybkFTVCA9IHB1Ymxpc2hlc19kY2xfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBjb25zdW1lc19kY2woKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCQ0KLQkJcmV0dXJuQVNUID0gbnVsbDsNCi0JCUFTVFBhaXIgY3VycmVudEFTVCA9IG5ldyBBU1RQYWlyKCk7DQotCQlBU1QgY29uc3VtZXNfZGNsX0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJQVNUIHRtcDE5OV9BU1QgPSBudWxsOw0KLQkJCXRtcDE5OV9BU1QgPSBhc3RGYWN0b3J5LmNyZWF0ZShMVCgxKSk7DQotCQkJYXN0RmFjdG9yeS5tYWtlQVNUUm9vdChjdXJyZW50QVNULCB0bXAxOTlfQVNUKTsNCi0JCQltYXRjaChMSVRFUkFMX2NvbnN1bWVzKTsNCi0JCQlzY29wZWRfbmFtZSgpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQlpZGVudGlmaWVyKCk7DQotCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCWNvbnN1bWVzX2RjbF9BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCX0NCi0JCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgew0KLQkJCWlmIChpbnB1dFN0YXRlLmd1ZXNzaW5nPT0wKSB7DQotCQkJCXJlcG9ydEVycm9yKGV4KTsNCi0JCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfMTApOw0KLQkJCX0gZWxzZSB7DQotCQkJICB0aHJvdyBleDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm5BU1QgPSBjb25zdW1lc19kY2xfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBpbnRlcmZhY2VfdHlwZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBpbnRlcmZhY2VfdHlwZV9BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCXsNCi0JCQlzd2l0Y2ggKCBMQSgxKSkgew0KLQkJCWNhc2UgU0NPUEVPUDoNCi0JCQljYXNlIElERU5UOg0KLQkJCXsNCi0JCQkJc2NvcGVkX25hbWUoKTsNCi0JCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJY2FzZSBMSVRFUkFMX09iamVjdDoNCi0JCQl7DQotCQkJCUFTVCB0bXAyMDBfQVNUID0gbnVsbDsNCi0JCQkJdG1wMjAwX0FTVCA9IGFzdEZhY3RvcnkuY3JlYXRlKExUKDEpKTsNCi0JCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCB0bXAyMDBfQVNUKTsNCi0JCQkJbWF0Y2goTElURVJBTF9PYmplY3QpOw0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJZGVmYXVsdDoNCi0JCQl7DQotCQkJCXRocm93IG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihMVCgxKSwgZ2V0RmlsZW5hbWUoKSk7DQotCQkJfQ0KLQkJCX0NCi0JCQl9DQotCQkJaW50ZXJmYWNlX3R5cGVfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzI5KTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gaW50ZXJmYWNlX3R5cGVfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBob21lX2hlYWRlcigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBob21lX2hlYWRlcl9BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCUFTVCB0bXAyMDFfQVNUID0gbnVsbDsNCi0JCQl0bXAyMDFfQVNUID0gYXN0RmFjdG9yeS5jcmVhdGUoTFQoMSkpOw0KLQkJCWFzdEZhY3RvcnkubWFrZUFTVFJvb3QoY3VycmVudEFTVCwgdG1wMjAxX0FTVCk7DQotCQkJbWF0Y2goTElURVJBTF9ob21lKTsNCi0JCQlpZGVudGlmaWVyKCk7DQotCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCXsNCi0JCQlzd2l0Y2ggKCBMQSgxKSkgew0KLQkJCWNhc2UgQ09MT046DQotCQkJew0KLQkJCQlob21lX2luaGVyaXRhbmNlX3NwZWMoKTsNCi0JCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJY2FzZSBMSVRFUkFMX3N1cHBvcnRzOg0KLQkJCWNhc2UgTElURVJBTF9tYW5hZ2VzOg0KLQkJCXsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWRlZmF1bHQ6DQotCQkJew0KLQkJCQl0aHJvdyBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oTFQoMSksIGdldEZpbGVuYW1lKCkpOw0KLQkJCX0NCi0JCQl9DQotCQkJfQ0KLQkJCXsNCi0JCQlzd2l0Y2ggKCBMQSgxKSkgew0KLQkJCWNhc2UgTElURVJBTF9zdXBwb3J0czoNCi0JCQl7DQotCQkJCXN1cHBvcnRlZF9pbnRlcmZhY2Vfc3BlYygpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIExJVEVSQUxfbWFuYWdlczoNCi0JCQl7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQlkZWZhdWx0Og0KLQkJCXsNCi0JCQkJdGhyb3cgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKExUKDEpLCBnZXRGaWxlbmFtZSgpKTsNCi0JCQl9DQotCQkJfQ0KLQkJCX0NCi0JCQltYXRjaChMSVRFUkFMX21hbmFnZXMpOw0KLQkJCXNjb3BlZF9uYW1lKCk7DQotCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCXsNCi0JCQlzd2l0Y2ggKCBMQSgxKSkgew0KLQkJCWNhc2UgTElURVJBTF9wcmltYXJ5a2V5Og0KLQkJCXsNCi0JCQkJcHJpbWFyeV9rZXlfc3BlYygpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIExDVVJMWToNCi0JCQl7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQlkZWZhdWx0Og0KLQkJCXsNCi0JCQkJdGhyb3cgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKExUKDEpLCBnZXRGaWxlbmFtZSgpKTsNCi0JCQl9DQotCQkJfQ0KLQkJCX0NCi0JCQlob21lX2hlYWRlcl9BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCX0NCi0JCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgew0KLQkJCWlmIChpbnB1dFN0YXRlLmd1ZXNzaW5nPT0wKSB7DQotCQkJCXJlcG9ydEVycm9yKGV4KTsNCi0JCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfMTQpOw0KLQkJCX0gZWxzZSB7DQotCQkJICB0aHJvdyBleDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm5BU1QgPSBob21lX2hlYWRlcl9BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIGhvbWVfYm9keSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBob21lX2JvZHlfQVNUID0gbnVsbDsNCi0JCQ0KLQkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcNCi0JCQltYXRjaChMQ1VSTFkpOw0KLQkJCXsNCi0JCQlfbG9vcDI1ODoNCi0JCQlkbyB7DQotCQkJCWlmICgoX3Rva2VuU2V0XzY2Lm1lbWJlcihMQSgxKSkpKSB7DQotCQkJCQlob21lX2V4cG9ydCgpOw0KLQkJCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQl9DQotCQkJCWVsc2Ugew0KLQkJCQkJYnJlYWsgX2xvb3AyNTg7DQotCQkJCX0NCi0JCQkJDQotCQkJfSB3aGlsZSAodHJ1ZSk7DQotCQkJfQ0KLQkJCW1hdGNoKFJDVVJMWSk7DQotCQkJaG9tZV9ib2R5X0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJfQ0KLQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJcmVwb3J0RXJyb3IoZXgpOw0KLQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF8xMCk7DQotCQkJfSBlbHNlIHsNCi0JCQkgIHRocm93IGV4Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybkFTVCA9IGhvbWVfYm9keV9BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIGhvbWVfaW5oZXJpdGFuY2Vfc3BlYygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBob21lX2luaGVyaXRhbmNlX3NwZWNfQVNUID0gbnVsbDsNCi0JCQ0KLQkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcNCi0JCQlBU1QgdG1wMjA1X0FTVCA9IG51bGw7DQotCQkJdG1wMjA1X0FTVCA9IGFzdEZhY3RvcnkuY3JlYXRlKExUKDEpKTsNCi0JCQlhc3RGYWN0b3J5Lm1ha2VBU1RSb290KGN1cnJlbnRBU1QsIHRtcDIwNV9BU1QpOw0KLQkJCW1hdGNoKENPTE9OKTsNCi0JCQlzY29wZWRfbmFtZSgpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQlob21lX2luaGVyaXRhbmNlX3NwZWNfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzY3KTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gaG9tZV9pbmhlcml0YW5jZV9zcGVjX0FTVDsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgcHJpbWFyeV9rZXlfc3BlYygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBwcmltYXJ5X2tleV9zcGVjX0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJQVNUIHRtcDIwNl9BU1QgPSBudWxsOw0KLQkJCXRtcDIwNl9BU1QgPSBhc3RGYWN0b3J5LmNyZWF0ZShMVCgxKSk7DQotCQkJYXN0RmFjdG9yeS5tYWtlQVNUUm9vdChjdXJyZW50QVNULCB0bXAyMDZfQVNUKTsNCi0JCQltYXRjaChMSVRFUkFMX3ByaW1hcnlrZXkpOw0KLQkJCXNjb3BlZF9uYW1lKCk7DQotCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCXByaW1hcnlfa2V5X3NwZWNfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzE0KTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gcHJpbWFyeV9rZXlfc3BlY19BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIGhvbWVfZXhwb3J0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQkNCi0JCXJldHVybkFTVCA9IG51bGw7DQotCQlBU1RQYWlyIGN1cnJlbnRBU1QgPSBuZXcgQVNUUGFpcigpOw0KLQkJQVNUIGhvbWVfZXhwb3J0X0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJew0KLQkJCXN3aXRjaCAoIExBKDEpKSB7DQotCQkJY2FzZSBQUkVQUk9DX0RJUkVDVElWRToNCi0JCQljYXNlIFNDT1BFT1A6DQotCQkJY2FzZSBJREVOVDoNCi0JCQljYXNlIExJVEVSQUxfY29uc3Q6DQotCQkJY2FzZSBMSVRFUkFMX3R5cGVkZWY6DQotCQkJY2FzZSBMSVRFUkFMX25hdGl2ZToNCi0JCQljYXNlIExJVEVSQUxfZmxvYXQ6DQotCQkJY2FzZSBMSVRFUkFMX2RvdWJsZToNCi0JCQljYXNlIExJVEVSQUxfbG9uZzoNCi0JCQljYXNlIExJVEVSQUxfc2hvcnQ6DQotCQkJY2FzZSBMSVRFUkFMX3Vuc2lnbmVkOg0KLQkJCWNhc2UgTElURVJBTF9jaGFyOg0KLQkJCWNhc2UgTElURVJBTF93Y2hhcjoNCi0JCQljYXNlIExJVEVSQUxfYm9vbGVhbjoNCi0JCQljYXNlIExJVEVSQUxfb2N0ZXQ6DQotCQkJY2FzZSBMSVRFUkFMX2FueToNCi0JCQljYXNlIExJVEVSQUxfT2JqZWN0Og0KLQkJCWNhc2UgTElURVJBTF9zdHJ1Y3Q6DQotCQkJY2FzZSBMSVRFUkFMX3VuaW9uOg0KLQkJCWNhc2UgTElURVJBTF9lbnVtOg0KLQkJCWNhc2UgTElURVJBTF9zdHJpbmc6DQotCQkJY2FzZSBMSVRFUkFMX3dzdHJpbmc6DQotCQkJY2FzZSBMSVRFUkFMX2V4Y2VwdGlvbjoNCi0JCQljYXNlIExJVEVSQUxfb25ld2F5Og0KLQkJCWNhc2UgTElURVJBTF92b2lkOg0KLQkJCWNhc2UgTElURVJBTF9WYWx1ZUJhc2U6DQotCQkJY2FzZSBMSVRFUkFMX3R5cGVpZDoNCi0JCQljYXNlIExJVEVSQUxfdHlwZXByZWZpeDoNCi0JCQljYXNlIExJVEVSQUxfcmVhZG9ubHk6DQotCQkJY2FzZSBMSVRFUkFMX2F0dHJpYnV0ZToNCi0JCQl7DQotCQkJCWV4cG9ydCgpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIExJVEVSQUxfZmFjdG9yeToNCi0JCQl7DQotCQkJCWZhY3RvcnlfZGNsKCk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJbWF0Y2goU0VNSSk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIExJVEVSQUxfZmluZGVyOg0KLQkJCXsNCi0JCQkJZmluZGVyX2RjbCgpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCW1hdGNoKFNFTUkpOw0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJZGVmYXVsdDoNCi0JCQl7DQotCQkJCXRocm93IG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihMVCgxKSwgZ2V0RmlsZW5hbWUoKSk7DQotCQkJfQ0KLQkJCX0NCi0JCQl9DQotCQkJaG9tZV9leHBvcnRfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzY4KTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gaG9tZV9leHBvcnRfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBmYWN0b3J5X2RjbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBmYWN0b3J5X2RjbF9BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCUFTVCB0bXAyMDlfQVNUID0gbnVsbDsNCi0JCQl0bXAyMDlfQVNUID0gYXN0RmFjdG9yeS5jcmVhdGUoTFQoMSkpOw0KLQkJCWFzdEZhY3RvcnkubWFrZUFTVFJvb3QoY3VycmVudEFTVCwgdG1wMjA5X0FTVCk7DQotCQkJbWF0Y2goTElURVJBTF9mYWN0b3J5KTsNCi0JCQlpZGVudGlmaWVyKCk7DQotCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCW1hdGNoKExQQVJFTik7DQotCQkJaW5pdF9wYXJhbV9kZWNscygpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQltYXRjaChSUEFSRU4pOw0KLQkJCXsNCi0JCQlzd2l0Y2ggKCBMQSgxKSkgew0KLQkJCWNhc2UgTElURVJBTF9yYWlzZXM6DQotCQkJew0KLQkJCQlyYWlzZXNfZXhwcigpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIFNFTUk6DQotCQkJew0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJZGVmYXVsdDoNCi0JCQl7DQotCQkJCXRocm93IG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihMVCgxKSwgZ2V0RmlsZW5hbWUoKSk7DQotCQkJfQ0KLQkJCX0NCi0JCQl9DQotCQkJZmFjdG9yeV9kY2xfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzEwKTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gZmFjdG9yeV9kY2xfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBmaW5kZXJfZGNsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQkNCi0JCXJldHVybkFTVCA9IG51bGw7DQotCQlBU1RQYWlyIGN1cnJlbnRBU1QgPSBuZXcgQVNUUGFpcigpOw0KLQkJQVNUIGZpbmRlcl9kY2xfQVNUID0gbnVsbDsNCi0JCQ0KLQkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcNCi0JCQlBU1QgdG1wMjEyX0FTVCA9IG51bGw7DQotCQkJdG1wMjEyX0FTVCA9IGFzdEZhY3RvcnkuY3JlYXRlKExUKDEpKTsNCi0JCQlhc3RGYWN0b3J5Lm1ha2VBU1RSb290KGN1cnJlbnRBU1QsIHRtcDIxMl9BU1QpOw0KLQkJCW1hdGNoKExJVEVSQUxfZmluZGVyKTsNCi0JCQlpZGVudGlmaWVyKCk7DQotCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCW1hdGNoKExQQVJFTik7DQotCQkJaW5pdF9wYXJhbV9kZWNscygpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQltYXRjaChSUEFSRU4pOw0KLQkJCXsNCi0JCQlzd2l0Y2ggKCBMQSgxKSkgew0KLQkJCWNhc2UgTElURVJBTF9yYWlzZXM6DQotCQkJew0KLQkJCQlyYWlzZXNfZXhwcigpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIFNFTUk6DQotCQkJew0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJZGVmYXVsdDoNCi0JCQl7DQotCQkJCXRocm93IG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihMVCgxKSwgZ2V0RmlsZW5hbWUoKSk7DQotCQkJfQ0KLQkJCX0NCi0JCQl9DQotCQkJZmluZGVyX2RjbF9BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCX0NCi0JCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgew0KLQkJCWlmIChpbnB1dFN0YXRlLmd1ZXNzaW5nPT0wKSB7DQotCQkJCXJlcG9ydEVycm9yKGV4KTsNCi0JCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfMTApOw0KLQkJCX0gZWxzZSB7DQotCQkJICB0aHJvdyBleDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm5BU1QgPSBmaW5kZXJfZGNsX0FTVDsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgZXZlbnRfYWJzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQkNCi0JCXJldHVybkFTVCA9IG51bGw7DQotCQlBU1RQYWlyIGN1cnJlbnRBU1QgPSBuZXcgQVNUUGFpcigpOw0KLQkJQVNUIGV2ZW50X2Fic19BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCUFTVCB0bXAyMTVfQVNUID0gbnVsbDsNCi0JCQl0bXAyMTVfQVNUID0gYXN0RmFjdG9yeS5jcmVhdGUoTFQoMSkpOw0KLQkJCWFzdEZhY3RvcnkubWFrZUFTVFJvb3QoY3VycmVudEFTVCwgdG1wMjE1X0FTVCk7DQotCQkJbWF0Y2goTElURVJBTF9hYnN0cmFjdCk7DQotCQkJZXZlbnRfaGVhZGVyKCk7DQotCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCXsNCi0JCQlzd2l0Y2ggKCBMQSgxKSkgew0KLQkJCWNhc2UgTENVUkxZOg0KLQkJCWNhc2UgQ09MT046DQotCQkJY2FzZSBMSVRFUkFMX3N1cHBvcnRzOg0KLQkJCXsNCi0JCQkJZXZlbnRfYWJzX2RjbCgpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIFNFTUk6DQotCQkJew0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJZGVmYXVsdDoNCi0JCQl7DQotCQkJCXRocm93IG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihMVCgxKSwgZ2V0RmlsZW5hbWUoKSk7DQotCQkJfQ0KLQkJCX0NCi0JCQl9DQotCQkJZXZlbnRfYWJzX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJfQ0KLQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJcmVwb3J0RXJyb3IoZXgpOw0KLQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF8xMCk7DQotCQkJfSBlbHNlIHsNCi0JCQkgIHRocm93IGV4Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybkFTVCA9IGV2ZW50X2Fic19BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIGV2ZW50X2N1c3RvbSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBldmVudF9jdXN0b21fQVNUID0gbnVsbDsNCi0JCQ0KLQkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcNCi0JCQlBU1QgdG1wMjE2X0FTVCA9IG51bGw7DQotCQkJdG1wMjE2X0FTVCA9IGFzdEZhY3RvcnkuY3JlYXRlKExUKDEpKTsNCi0JCQlhc3RGYWN0b3J5Lm1ha2VBU1RSb290KGN1cnJlbnRBU1QsIHRtcDIxNl9BU1QpOw0KLQkJCW1hdGNoKExJVEVSQUxfY3VzdG9tKTsNCi0JCQlldmVudF9oZWFkZXIoKTsNCi0JCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJZXZlbnRfZWxlbV9kY2woKTsNCi0JCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJZXZlbnRfY3VzdG9tX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJfQ0KLQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJcmVwb3J0RXJyb3IoZXgpOw0KLQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF8xMCk7DQotCQkJfSBlbHNlIHsNCi0JCQkgIHRocm93IGV4Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybkFTVCA9IGV2ZW50X2N1c3RvbV9BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIGV2ZW50X2RjbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBldmVudF9kY2xfQVNUID0gbnVsbDsNCi0JCQ0KLQkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcNCi0JCQlldmVudF9oZWFkZXIoKTsNCi0JCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJew0KLQkJCXN3aXRjaCAoIExBKDEpKSB7DQotCQkJY2FzZSBMQ1VSTFk6DQotCQkJY2FzZSBDT0xPTjoNCi0JCQljYXNlIExJVEVSQUxfc3VwcG9ydHM6DQotCQkJew0KLQkJCQlldmVudF9lbGVtX2RjbCgpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIFNFTUk6DQotCQkJew0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJZGVmYXVsdDoNCi0JCQl7DQotCQkJCXRocm93IG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihMVCgxKSwgZ2V0RmlsZW5hbWUoKSk7DQotCQkJfQ0KLQkJCX0NCi0JCQl9DQotCQkJZXZlbnRfZGNsX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJfQ0KLQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJcmVwb3J0RXJyb3IoZXgpOw0KLQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF8xMCk7DQotCQkJfSBlbHNlIHsNCi0JCQkgIHRocm93IGV4Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybkFTVCA9IGV2ZW50X2RjbF9BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIGV2ZW50X2hlYWRlcigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBldmVudF9oZWFkZXJfQVNUID0gbnVsbDsNCi0JCQ0KLQkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcNCi0JCQlBU1QgdG1wMjE3X0FTVCA9IG51bGw7DQotCQkJdG1wMjE3X0FTVCA9IGFzdEZhY3RvcnkuY3JlYXRlKExUKDEpKTsNCi0JCQlhc3RGYWN0b3J5Lm1ha2VBU1RSb290KGN1cnJlbnRBU1QsIHRtcDIxN19BU1QpOw0KLQkJCW1hdGNoKExJVEVSQUxfZXZlbnR0eXBlKTsNCi0JCQlpZGVudGlmaWVyKCk7DQotCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCWV2ZW50X2hlYWRlcl9BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCX0NCi0JCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgew0KLQkJCWlmIChpbnB1dFN0YXRlLmd1ZXNzaW5nPT0wKSB7DQotCQkJCXJlcG9ydEVycm9yKGV4KTsNCi0JCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfNjkpOw0KLQkJCX0gZWxzZSB7DQotCQkJICB0aHJvdyBleDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm5BU1QgPSBldmVudF9oZWFkZXJfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBldmVudF9hYnNfZGNsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQkNCi0JCXJldHVybkFTVCA9IG51bGw7DQotCQlBU1RQYWlyIGN1cnJlbnRBU1QgPSBuZXcgQVNUUGFpcigpOw0KLQkJQVNUIGV2ZW50X2Fic19kY2xfQVNUID0gbnVsbDsNCi0JCQ0KLQkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcNCi0JCQl2YWx1ZV9pbmhlcml0YW5jZV9zcGVjKCk7DQotCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCW1hdGNoKExDVVJMWSk7DQotCQkJew0KLQkJCV9sb29wMjcyOg0KLQkJCWRvIHsNCi0JCQkJaWYgKChfdG9rZW5TZXRfMTUubWVtYmVyKExBKDEpKSkpIHsNCi0JCQkJCWV4cG9ydCgpOw0KLQkJCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQl9DQotCQkJCWVsc2Ugew0KLQkJCQkJYnJlYWsgX2xvb3AyNzI7DQotCQkJCX0NCi0JCQkJDQotCQkJfSB3aGlsZSAodHJ1ZSk7DQotCQkJfQ0KLQkJCW1hdGNoKFJDVVJMWSk7DQotCQkJZXZlbnRfYWJzX2RjbF9BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCX0NCi0JCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgew0KLQkJCWlmIChpbnB1dFN0YXRlLmd1ZXNzaW5nPT0wKSB7DQotCQkJCXJlcG9ydEVycm9yKGV4KTsNCi0JCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfMTApOw0KLQkJCX0gZWxzZSB7DQotCQkJICB0aHJvdyBleDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm5BU1QgPSBldmVudF9hYnNfZGNsX0FTVDsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgZXZlbnRfZWxlbV9kY2woKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCQ0KLQkJcmV0dXJuQVNUID0gbnVsbDsNCi0JCUFTVFBhaXIgY3VycmVudEFTVCA9IG5ldyBBU1RQYWlyKCk7DQotCQlBU1QgZXZlbnRfZWxlbV9kY2xfQVNUID0gbnVsbDsNCi0JCQ0KLQkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcNCi0JCQl2YWx1ZV9pbmhlcml0YW5jZV9zcGVjKCk7DQotCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCW1hdGNoKExDVVJMWSk7DQotCQkJew0KLQkJCV9sb29wMjc4Og0KLQkJCWRvIHsNCi0JCQkJaWYgKChfdG9rZW5TZXRfMTUubWVtYmVyKExBKDEpKSkpIHsNCi0JCQkJCWV4cG9ydCgpOw0KLQkJCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQl9DQotCQkJCWVsc2Ugew0KLQkJCQkJYnJlYWsgX2xvb3AyNzg7DQotCQkJCX0NCi0JCQkJDQotCQkJfSB3aGlsZSAodHJ1ZSk7DQotCQkJfQ0KLQkJCW1hdGNoKFJDVVJMWSk7DQotCQkJZXZlbnRfZWxlbV9kY2xfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzEwKTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gZXZlbnRfZWxlbV9kY2xfQVNUOw0KLQl9DQotCQ0KLQkNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBfdG9rZW5OYW1lcyA9IHsNCi0JCSI8MD4iLA0KLQkJIkVPRiIsDQotCQkiPDI+IiwNCi0JCSJOVUxMX1RSRUVfTE9PS0FIRUFEIiwNCi0JCSI7IiwNCi0JCSJcImFic3RyYWN0XCIiLA0KLQkJIlwibG9jYWxcIiIsDQotCQkiXCJpbnRlcmZhY2VcIiIsDQotCQkiXCJjdXN0b21cIiIsDQotCQkiXCJ2YWx1ZXR5cGVcIiIsDQotCQkiXCJldmVudHR5cGVcIiIsDQotCQkiXCJtb2R1bGVcIiIsDQotCQkieyIsDQotCQkifSIsDQotCQkiYSBwcmVwcm9jZXNzb3IgZGlyZWN0aXZlIiwNCi0JCSI6IiwNCi0JCSIsIiwNCi0JCSI6OiIsDQotCQkiYW4gaWRlbnRpZmVyIiwNCi0JCSJcInRydW5jYXRhYmxlXCIiLA0KLQkJIlwic3VwcG9ydHNcIiIsDQotCQkiXCJwdWJsaWNcIiIsDQotCQkiXCJwcml2YXRlXCIiLA0KLQkJIlwiZmFjdG9yeVwiIiwNCi0JCSIoIiwNCi0JCSIpIiwNCi0JCSJcImluXCIiLA0KLQkJIlwiY29uc3RcIiIsDQotCQkiPSIsDQotCQkifCIsDQotCQkiXiIsDQotCQkiJiIsDQotCQkiPDwiLA0KLQkJIj4+IiwNCi0JCSIrIiwNCi0JCSItIiwNCi0JCSIqIiwNCi0JCSIvIiwNCi0JCSIlIiwNCi0JCSJ+IiwNCi0JCSJcIlRSVUVcIiIsDQotCQkiXCJGQUxTRVwiIiwNCi0JCSJcInR5cGVkZWZcIiIsDQotCQkiXCJuYXRpdmVcIiIsDQotCQkiXCJmbG9hdFwiIiwNCi0JCSJcImRvdWJsZVwiIiwNCi0JCSJcImxvbmdcIiIsDQotCQkiXCJzaG9ydFwiIiwNCi0JCSJcInVuc2lnbmVkXCIiLA0KLQkJIlwiY2hhclwiIiwNCi0JCSJcIndjaGFyXCIiLA0KLQkJIlwiYm9vbGVhblwiIiwNCi0JCSJcIm9jdGV0XCIiLA0KLQkJIlwiYW55XCIiLA0KLQkJIlwiT2JqZWN0XCIiLA0KLQkJIlwic3RydWN0XCIiLA0KLQkJIlwidW5pb25cIiIsDQotCQkiXCJzd2l0Y2hcIiIsDQotCQkiXCJjYXNlXCIiLA0KLQkJIlwiZGVmYXVsdFwiIiwNCi0JCSJcImVudW1cIiIsDQotCQkiXCJzZXF1ZW5jZVwiIiwNCi0JCSI8IiwNCi0JCSI+IiwNCi0JCSJcInN0cmluZ1wiIiwNCi0JCSJcIndzdHJpbmdcIiIsDQotCQkiWyIsDQotCQkiXSIsDQotCQkiXCJleGNlcHRpb25cIiIsDQotCQkiXCJvbmV3YXlcIiIsDQotCQkiXCJ2b2lkXCIiLA0KLQkJIlwib3V0XCIiLA0KLQkJIlwiaW5vdXRcIiIsDQotCQkiXCJyYWlzZXNcIiIsDQotCQkiXCJjb250ZXh0XCIiLA0KLQkJIlwiZml4ZWRcIiIsDQotCQkiXCJWYWx1ZUJhc2VcIiIsDQotCQkiXCJpbXBvcnRcIiIsDQotCQkiXCJ0eXBlaWRcIiIsDQotCQkiXCJ0eXBlcHJlZml4XCIiLA0KLQkJIlwicmVhZG9ubHlcIiIsDQotCQkiXCJhdHRyaWJ1dGVcIiIsDQotCQkiXCJnZXRyYWlzZXNcIiIsDQotCQkiXCJzZXRyYWlzZXNcIiIsDQotCQkiXCJjb21wb25lbnRcIiIsDQotCQkiXCJwcm92aWRlc1wiIiwNCi0JCSJcInVzZXNcIiIsDQotCQkiXCJtdWx0aXBsZVwiIiwNCi0JCSJcImVtaXRzXCIiLA0KLQkJIlwicHVibGlzaGVzXCIiLA0KLQkJIlwiY29uc3VtZXNcIiIsDQotCQkiXCJob21lXCIiLA0KLQkJIlwibWFuYWdlc1wiIiwNCi0JCSJcInByaW1hcnlrZXlcIiIsDQotCQkiXCJmaW5kZXJcIiIsDQotCQkiYW4gaW50ZWdlciB2YWx1ZSIsDQotCQkiYW4gb2N0YWwgdmFsdWUiLA0KLQkJImEgaGV4YWRlY2ltYWwgdmFsdWUgdmFsdWUiLA0KLQkJImEgc3RyaW5nIGxpdGVyYWwiLA0KLQkJImEgd2lkZSBzdHJpbmcgbGl0ZXJhbCIsDQotCQkiYSBjaGFyYWN0ZXIgbGl0ZXJhbCIsDQotCQkiYSB3aWRlIGNoYXJhY3RlciBsaXRlcmFsIiwNCi0JCSJGSVhFRCIsDQotCQkiYSBmbG9hdGluZyBwb2ludCB2YWx1ZSIsDQotCQkiPyIsDQotCQkiLiIsDQotCQkiISIsDQotCQkid2hpdGUgc3BhY2UiLA0KLQkJImEgY29tbWVudCIsDQotCQkiYSBjb21tZW50IiwNCi0JCSJhbiBlc2NhcGUgc2VxdWVuY2UiLA0KLQkJImFuIGVzY2FwZWQgY2hhcmFjdGVyIHZhbHVlIiwNCi0JCSJhIGRpZ2l0IiwNCi0JCSJhIG5vbi16ZXJvIGRpZ2l0IiwNCi0JCSJhbiBvY3RhbCBkaWdpdCIsDQotCQkiYSBoZXhhZGVjaW1hbCBkaWdpdCIsDQotCQkiYW4gZXNjYXBlZCBpZGVudGlmZXIiDQotCX07DQotCQ0KLQlwcm90ZWN0ZWQgdm9pZCBidWlsZFRva2VuVHlwZUFTVENsYXNzTWFwKCkgew0KLQkJdG9rZW5UeXBlVG9BU1RDbGFzc01hcD1udWxsOw0KLQl9DQotCQ0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nW10gbWtfdG9rZW5TZXRfMCgpIHsNCi0JCWxvbmdbXSBkYXRhID0geyAxMjYxMDIxMDg5OTM3NDkzOTg0TCwgMTM1MzE1NDcyTCwgMEwsIDBMfTsNCi0JCXJldHVybiBkYXRhOw0KLQl9DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IF90b2tlblNldF8wID0gbmV3IEJpdFNldChta190b2tlblNldF8wKCkpOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nW10gbWtfdG9rZW5TZXRfMSgpIHsNCi0JCWxvbmdbXSBkYXRhID0geyAyTCwgMEx9Ow0KLQkJcmV0dXJuIGRhdGE7DQotCX0NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgX3Rva2VuU2V0XzEgPSBuZXcgQml0U2V0KG1rX3Rva2VuU2V0XzEoKSk7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmdbXSBta190b2tlblNldF8yKCkgew0KLQkJbG9uZ1tdIGRhdGEgPSB7IDEyNjEwMjEwODk5Mzc0OTM5ODRMLCAxMzUzMjM2NjRMLCAwTCwgMEx9Ow0KLQkJcmV0dXJuIGRhdGE7DQotCX0NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgX3Rva2VuU2V0XzIgPSBuZXcgQml0U2V0KG1rX3Rva2VuU2V0XzIoKSk7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmdbXSBta190b2tlblNldF8zKCkgew0KLQkJbG9uZ1tdIGRhdGEgPSB7IDI5OTAyNEwsIDBMfTsNCi0JCXJldHVybiBkYXRhOw0KLQl9DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IF90b2tlblNldF8zID0gbmV3IEJpdFNldChta190b2tlblNldF8zKCkpOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nW10gbWtfdG9rZW5TZXRfNCgpIHsNCi0JCWxvbmdbXSBkYXRhID0geyAxMjk3MDMyMjk0NzcwODY4MjEwTCwgMTM1NTE2Mjc1TCwgMEwsIDBMfTsNCi0JCXJldHVybiBkYXRhOw0KLQl9DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IF90b2tlblNldF80ID0gbmV3IEJpdFNldChta190b2tlblNldF80KCkpOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nW10gbWtfdG9rZW5TZXRfNSgpIHsNCi0JCWxvbmdbXSBkYXRhID0geyAzNjAyODYyMTA5NzExODMxMDU2TCwgNjE0N0wsIDBMLCAwTH07DQotCQlyZXR1cm4gZGF0YTsNCi0JfQ0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBfdG9rZW5TZXRfNSA9IG5ldyBCaXRTZXQobWtfdG9rZW5TZXRfNSgpKTsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZ1tdIG1rX3Rva2VuU2V0XzYoKSB7DQotCQlsb25nW10gZGF0YSA9IHsgNTkwODcxODMxMzIxNDUwOTA0MkwsIDEzNTUxNjI3NUwsIDBMLCAwTH07DQotCQlyZXR1cm4gZGF0YTsNCi0JfQ0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBfdG9rZW5TZXRfNiA9IG5ldyBCaXRTZXQobWtfdG9rZW5TZXRfNigpKTsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZ1tdIG1rX3Rva2VuU2V0XzcoKSB7DQotCQlsb25nW10gZGF0YSA9IHsgMTM0NzYwMEwsIDBMfTsNCi0JCXJldHVybiBkYXRhOw0KLQl9DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IF90b2tlblNldF83ID0gbmV3IEJpdFNldChta190b2tlblNldF83KCkpOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nW10gbWtfdG9rZW5TZXRfOCgpIHsNCi0JCWxvbmdbXSBkYXRhID0geyAxMjk3MDMyMjk0NzcyNDQxMDc0TCwgMTM1NTE2Mjc1TCwgMEwsIDBMfTsNCi0JCXJldHVybiBkYXRhOw0KLQl9DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IF90b2tlblNldF84ID0gbmV3IEJpdFNldChta190b2tlblNldF84KCkpOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nW10gbWtfdG9rZW5TZXRfOSgpIHsNCi0JCWxvbmdbXSBkYXRhID0geyAxMjYxMDIxMDg5OTM3NTAyMTc4TCwgMTM1MzE1NDcyTCwgMEwsIDBMfTsNCi0JCXJldHVybiBkYXRhOw0KLQl9DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IF90b2tlblNldF85ID0gbmV3IEJpdFNldChta190b2tlblNldF85KCkpOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nW10gbWtfdG9rZW5TZXRfMTAoKSB7DQotCQlsb25nW10gZGF0YSA9IHsgMTZMLCAwTH07DQotCQlyZXR1cm4gZGF0YTsNCi0JfQ0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBfdG9rZW5TZXRfMTAgPSBuZXcgQml0U2V0KG1rX3Rva2VuU2V0XzEwKCkpOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nW10gbWtfdG9rZW5TZXRfMTEoKSB7DQotCQlsb25nW10gZGF0YSA9IHsgMzYwMjg2MjEwOTcxMDc0NTYwMEwsIDYxNDdMLCAwTCwgMEx9Ow0KLQkJcmV0dXJuIGRhdGE7DQotCX0NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgX3Rva2VuU2V0XzExID0gbmV3IEJpdFNldChta190b2tlblNldF8xMSgpKTsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZ1tdIG1rX3Rva2VuU2V0XzEyKCkgew0KLQkJbG9uZ1tdIGRhdGEgPSB7IC01NDc2Mzk0MTg5NTI5MzA1MDcyTCwgMTc5ODU5Njg2NTFMLCAwTCwgMEx9Ow0KLQkJcmV0dXJuIGRhdGE7DQotCX0NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgX3Rva2VuU2V0XzEyID0gbmV3IEJpdFNldChta190b2tlblNldF8xMigpKTsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZ1tdIG1rX3Rva2VuU2V0XzEzKCkgew0KLQkJbG9uZ1tdIGRhdGEgPSB7IDgxOTJMLCAwTH07DQotCQlyZXR1cm4gZGF0YTsNCi0JfQ0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBfdG9rZW5TZXRfMTMgPSBuZXcgQml0U2V0KG1rX3Rva2VuU2V0XzEzKCkpOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nW10gbWtfdG9rZW5TZXRfMTQoKSB7DQotCQlsb25nW10gZGF0YSA9IHsgNDA5NkwsIDBMfTsNCi0JCXJldHVybiBkYXRhOw0KLQl9DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IF90b2tlblNldF8xNCA9IG5ldyBCaXRTZXQobWtfdG9rZW5TZXRfMTQoKSk7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmdbXSBta190b2tlblNldF8xNSgpIHsNCi0JCWxvbmdbXSBkYXRhID0geyAxMjk3MDMyMjk0NzcwODE5MDcyTCwgMjQ5OTcxTCwgMEwsIDBMfTsNCi0JCXJldHVybiBkYXRhOw0KLQl9DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IF90b2tlblNldF8xNSA9IG5ldyBCaXRTZXQobWtfdG9rZW5TZXRfMTUoKSk7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmdbXSBta190b2tlblNldF8xNigpIHsNCi0JCWxvbmdbXSBkYXRhID0geyAxMjk3MDMyMjk0Nzg1NTA3MzI4TCwgMTA3Mzk5MTc5NUwsIDBMLCAwTH07DQotCQlyZXR1cm4gZGF0YTsNCi0JfQ0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBfdG9rZW5TZXRfMTYgPSBuZXcgQml0U2V0KG1rX3Rva2VuU2V0XzE2KCkpOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nW10gbWtfdG9rZW5TZXRfMTcoKSB7DQotCQlsb25nW10gZGF0YSA9IHsgMzM1NTg1MjhMLCAwTH07DQotCQlyZXR1cm4gZGF0YTsNCi0JfQ0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBfdG9rZW5TZXRfMTcgPSBuZXcgQml0U2V0KG1rX3Rva2VuU2V0XzE3KCkpOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nW10gbWtfdG9rZW5TZXRfMTgoKSB7DQotCQlsb25nW10gZGF0YSA9IHsgNjk2MzJMLCAwTH07DQotCQlyZXR1cm4gZGF0YTsNCi0JfQ0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBfdG9rZW5TZXRfMTggPSBuZXcgQml0U2V0KG1rX3Rva2VuU2V0XzE4KCkpOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nW10gbWtfdG9rZW5TZXRfMTkoKSB7DQotCQlsb25nW10gZGF0YSA9IHsgLTkyMjMzNzE0ODc2MDA4NjUyNjRMLCAxNzk4NTE3NTU2MEwsIDBMLCAwTH07DQotCQlyZXR1cm4gZGF0YTsNCi0JfQ0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBfdG9rZW5TZXRfMTkgPSBuZXcgQml0U2V0KG1rX3Rva2VuU2V0XzE5KCkpOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nW10gbWtfdG9rZW5TZXRfMjAoKSB7DQotCQlsb25nW10gZGF0YSA9IHsgMTI5NzAzMjI5NDc4NTQ5OTEzNkwsIDI0OTk3MUwsIDBMLCAwTH07DQotCQlyZXR1cm4gZGF0YTsNCi0JfQ0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBfdG9rZW5TZXRfMjAgPSBuZXcgQml0U2V0KG1rX3Rva2VuU2V0XzIwKCkpOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nW10gbWtfdG9rZW5TZXRfMjEoKSB7DQotCQlsb25nW10gZGF0YSA9IHsgMjYyMTYwTCwgMEx9Ow0KLQkJcmV0dXJuIGRhdGE7DQotCX0NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgX3Rva2VuU2V0XzIxID0gbmV3IEJpdFNldChta190b2tlblNldF8yMSgpKTsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZ1tdIG1rX3Rva2VuU2V0XzIyKCkgew0KLQkJbG9uZ1tdIGRhdGEgPSB7IDEyOTcwMzIyOTQ3ODU1MDczMjhMLCAyNDk5NzFMLCAwTCwgMEx9Ow0KLQkJcmV0dXJuIGRhdGE7DQotCX0NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgX3Rva2VuU2V0XzIyID0gbmV3IEJpdFNldChta190b2tlblNldF8yMigpKTsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZ1tdIG1rX3Rva2VuU2V0XzIzKCkgew0KLQkJbG9uZ1tdIGRhdGEgPSB7IDEwNTI2NzJMLCAwTH07DQotCQlyZXR1cm4gZGF0YTsNCi0JfQ0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBfdG9rZW5TZXRfMjMgPSBuZXcgQml0U2V0KG1rX3Rva2VuU2V0XzIzKCkpOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nW10gbWtfdG9rZW5TZXRfMjQoKSB7DQotCQlsb25nW10gZGF0YSA9IHsgMTExODIwOEwsIDBMfTsNCi0JCXJldHVybiBkYXRhOw0KLQl9DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IF90b2tlblNldF8yNCA9IG5ldyBCaXRTZXQobWtfdG9rZW5TZXRfMjQoKSk7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmdbXSBta190b2tlblNldF8yNSgpIHsNCi0JCWxvbmdbXSBkYXRhID0geyAzMzU1NDQzMkwsIDBMfTsNCi0JCXJldHVybiBkYXRhOw0KLQl9DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IF90b2tlblNldF8yNSA9IG5ldyBCaXRTZXQobWtfdG9rZW5TZXRfMjUoKSk7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmdbXSBta190b2tlblNldF8yNigpIHsNCi0JCWxvbmdbXSBkYXRhID0geyAxNkwsIDEwMjRMLCAwTCwgMEx9Ow0KLQkJcmV0dXJuIGRhdGE7DQotCX0NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgX3Rva2VuU2V0XzI2ID0gbmV3IEJpdFNldChta190b2tlblNldF8yNigpKTsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZ1tdIG1rX3Rva2VuU2V0XzI3KCkgew0KLQkJbG9uZ1tdIGRhdGEgPSB7IDMzNjE5OTY4TCwgMEx9Ow0KLQkJcmV0dXJuIGRhdGE7DQotCX0NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgX3Rva2VuU2V0XzI3ID0gbmV3IEJpdFNldChta190b2tlblNldF8yNygpKTsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZ1tdIG1rX3Rva2VuU2V0XzI4KCkgew0KLQkJbG9uZ1tdIGRhdGEgPSB7IDM2MDExMjA0ODMzMzEyNzY4TCwgNDA5OUwsIDBMLCAwTH07DQotCQlyZXR1cm4gZGF0YTsNCi0JfQ0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBfdG9rZW5TZXRfMjggPSBuZXcgQml0U2V0KG1rX3Rva2VuU2V0XzI4KCkpOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nW10gbWtfdG9rZW5TZXRfMjkoKSB7DQotCQlsb25nW10gZGF0YSA9IHsgMjYyMTQ0TCwgMEx9Ow0KLQkJcmV0dXJuIGRhdGE7DQotCX0NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgX3Rva2VuU2V0XzI5ID0gbmV3IEJpdFNldChta190b2tlblNldF8yOSgpKTsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZ1tdIG1rX3Rva2VuU2V0XzMwKCkgew0KLQkJbG9uZ1tdIGRhdGEgPSB7IDMzNjE5OTg0TCwgNzg2OTQ0TCwgMEwsIDBMfTsNCi0JCXJldHVybiBkYXRhOw0KLQl9DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IF90b2tlblNldF8zMCA9IG5ldyBCaXRTZXQobWtfdG9rZW5TZXRfMzAoKSk7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmdbXSBta190b2tlblNldF8zMSgpIHsNCi0JCWxvbmdbXSBkYXRhID0geyAzOTAwMTE1OTEwNjU2TCwgMTA5NzM2NDE0NDEyOEwsIDBMLCAwTH07DQotCQlyZXR1cm4gZGF0YTsNCi0JfQ0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBfdG9rZW5TZXRfMzEgPSBuZXcgQml0U2V0KG1rX3Rva2VuU2V0XzMxKCkpOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nW10gbWtfdG9rZW5TZXRfMzIoKSB7DQotCQlsb25nW10gZGF0YSA9IHsgLTkyMjMzNzIwMzY4MjExMjMwNTZMLCA4TCwgMEwsIDBMfTsNCi0JCXJldHVybiBkYXRhOw0KLQl9DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IF90b2tlblNldF8zMiA9IG5ldyBCaXRTZXQobWtfdG9rZW5TZXRfMzIoKSk7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmdbXSBta190b2tlblNldF8zMygpIHsNCi0JCWxvbmdbXSBkYXRhID0geyAtOTIyMzM3MjAzNjgyMDg5MzY4MEwsIDBMfTsNCi0JCXJldHVybiBkYXRhOw0KLQl9DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IF90b2tlblNldF8zMyA9IG5ldyBCaXRTZXQobWtfdG9rZW5TZXRfMzMoKSk7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmdbXSBta190b2tlblNldF8zNCgpIHsNCi0JCWxvbmdbXSBkYXRhID0geyAtOTIyMzM3MjAzNjg1NDQ0ODExMkwsIDBMfTsNCi0JCXJldHVybiBkYXRhOw0KLQl9DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IF90b2tlblNldF8zNCA9IG5ldyBCaXRTZXQobWtfdG9rZW5TZXRfMzQoKSk7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmdbXSBta190b2tlblNldF8zNSgpIHsNCi0JCWxvbmdbXSBkYXRhID0geyAtOTIyMzM3MjAzNjI4NDI1MjE0NEwsIDhMLCAwTCwgMEx9Ow0KLQkJcmV0dXJuIGRhdGE7DQotCX0NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgX3Rva2VuU2V0XzM1ID0gbmV3IEJpdFNldChta190b2tlblNldF8zNSgpKTsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZ1tdIG1rX3Rva2VuU2V0XzM2KCkgew0KLQkJbG9uZ1tdIGRhdGEgPSB7IC05MjIzMzcyMDM1MjEwNTEwMzIwTCwgOEwsIDBMLCAwTH07DQotCQlyZXR1cm4gZGF0YTsNCi0JfQ0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBfdG9rZW5TZXRfMzYgPSBuZXcgQml0U2V0KG1rX3Rva2VuU2V0XzM2KCkpOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nW10gbWtfdG9rZW5TZXRfMzcoKSB7DQotCQlsb25nW10gZGF0YSA9IHsgLTkyMjMzNzIwMzMwNjMwMjY2NzJMLCA4TCwgMEwsIDBMfTsNCi0JCXJldHVybiBkYXRhOw0KLQl9DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IF90b2tlblNldF8zNyA9IG5ldyBCaXRTZXQobWtfdG9rZW5TZXRfMzcoKSk7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmdbXSBta190b2tlblNldF8zOCgpIHsNCi0JCWxvbmdbXSBkYXRhID0geyAtOTIyMzM3MjAyMDE3ODEyNDc4NEwsIDhMLCAwTCwgMEx9Ow0KLQkJcmV0dXJuIGRhdGE7DQotCX0NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgX3Rva2VuU2V0XzM4ID0gbmV3IEJpdFNldChta190b2tlblNldF8zOCgpKTsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZ1tdIG1rX3Rva2VuU2V0XzM5KCkgew0KLQkJbG9uZ1tdIGRhdGEgPSB7IC05MjIzMzcxOTY4NjM4NTE3MjMyTCwgOEwsIDBMLCAwTH07DQotCQlyZXR1cm4gZGF0YTsNCi0JfQ0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBfdG9rZW5TZXRfMzkgPSBuZXcgQml0U2V0KG1rX3Rva2VuU2V0XzM5KCkpOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nW10gbWtfdG9rZW5TZXRfNDAoKSB7DQotCQlsb25nW10gZGF0YSA9IHsgLTkyMjMzNzE0ODc2MDIxODAwODBMLCA4TCwgMEwsIDBMfTsNCi0JCXJldHVybiBkYXRhOw0KLQl9DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IF90b2tlblNldF80MCA9IG5ldyBCaXRTZXQobWtfdG9rZW5TZXRfNDAoKSk7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmdbXSBta190b2tlblNldF80MSgpIHsNCi0JCWxvbmdbXSBkYXRhID0geyAtOTIyMzM3MjAzNjg1NDcxMDI3MkwsIDhMLCAwTCwgMEx9Ow0KLQkJcmV0dXJuIGRhdGE7DQotCX0NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgX3Rva2VuU2V0XzQxID0gbmV3IEJpdFNldChta190b2tlblNldF80MSgpKTsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZ1tdIG1rX3Rva2VuU2V0XzQyKCkgew0KLQkJbG9uZ1tdIGRhdGEgPSB7IDMzODE2NTkyTCwgMEx9Ow0KLQkJcmV0dXJuIGRhdGE7DQotCX0NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgX3Rva2VuU2V0XzQyID0gbmV3IEJpdFNldChta190b2tlblNldF80MigpKTsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZ1tdIG1rX3Rva2VuU2V0XzQzKCkgew0KLQkJbG9uZ1tdIGRhdGEgPSB7IC05MjIzMzM2ODUyNDgyMzU5MjgwTCwgMEx9Ow0KLQkJcmV0dXJuIGRhdGE7DQotCX0NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgX3Rva2VuU2V0XzQzID0gbmV3IEJpdFNldChta190b2tlblNldF80MygpKTsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZ1tdIG1rX3Rva2VuU2V0XzQ0KCkgew0KLQkJbG9uZ1tdIGRhdGEgPSB7IC03OTYyMzQ3MDQ3MDM2MTc4NDQ2TCwgMTA5NzUwMDI0NjU0OEwsIDBMLCAwTH07DQotCQlyZXR1cm4gZGF0YTsNCi0JfQ0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBfdG9rZW5TZXRfNDQgPSBuZXcgQml0U2V0KG1rX3Rva2VuU2V0XzQ0KCkpOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nW10gbWtfdG9rZW5TZXRfNDUoKSB7DQotCQlsb25nW10gZGF0YSA9IHsgLTQ3NTU4MDEyMDY3NzMyODg5NzRMLCAxMDk4Njk3OTI0NTk5TCwgMEwsIDBMfTsNCi0JCXJldHVybiBkYXRhOw0KLQl9DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IF90b2tlblNldF80NSA9IG5ldyBCaXRTZXQobWtfdG9rZW5TZXRfNDUoKSk7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmdbXSBta190b2tlblNldF80NigpIHsNCi0JCWxvbmdbXSBkYXRhID0geyAtOTIyMzE2MDkzMDYyMTkxNTEyMEwsIDBMfTsNCi0JCXJldHVybiBkYXRhOw0KLQl9DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IF90b2tlblNldF80NiA9IG5ldyBCaXRTZXQobWtfdG9rZW5TZXRfNDYoKSk7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmdbXSBta190b2tlblNldF80NygpIHsNCi0JCWxvbmdbXSBkYXRhID0geyAtNzk2MjI3NjY3ODI5MjAwMDc4MkwsIDEwOTc1MDAyNDY1NDhMLCAwTCwgMEx9Ow0KLQkJcmV0dXJuIGRhdGE7DQotCX0NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgX3Rva2VuU2V0XzQ3ID0gbmV3IEJpdFNldChta190b2tlblNldF80NygpKTsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZ1tdIG1rX3Rva2VuU2V0XzQ4KCkgew0KLQkJbG9uZ1tdIGRhdGEgPSB7IDY1NTUyTCwgMEx9Ow0KLQkJcmV0dXJuIGRhdGE7DQotCX0NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgX3Rva2VuU2V0XzQ4ID0gbmV3IEJpdFNldChta190b2tlblNldF80OCgpKTsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZ1tdIG1rX3Rva2VuU2V0XzQ5KCkgew0KLQkJbG9uZ1tdIGRhdGEgPSB7IDM2MDI4NjIxMDk3MTA3NTM3OTJMLCA2MTQ3TCwgMEwsIDBMfTsNCi0JCXJldHVybiBkYXRhOw0KLQl9DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IF90b2tlblNldF80OSA9IG5ldyBCaXRTZXQobWtfdG9rZW5TZXRfNDkoKSk7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmdbXSBta190b2tlblNldF81MCgpIHsNCi0JCWxvbmdbXSBkYXRhID0geyA4NjQ2OTExMjg0NTUxNDM0MjRMLCAwTH07DQotCQlyZXR1cm4gZGF0YTsNCi0JfQ0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBfdG9rZW5TZXRfNTAgPSBuZXcgQml0U2V0KG1rX3Rva2VuU2V0XzUwKCkpOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nW10gbWtfdG9rZW5TZXRfNTEoKSB7DQotCQlsb25nW10gZGF0YSA9IHsgNzM3MjhMLCAwTH07DQotCQlyZXR1cm4gZGF0YTsNCi0JfQ0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBfdG9rZW5TZXRfNTEgPSBuZXcgQml0U2V0KG1rX3Rva2VuU2V0XzUxKCkpOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nW10gbWtfdG9rZW5TZXRfNTIoKSB7DQotCQlsb25nW10gZGF0YSA9IHsgLTkyMjMzNzIwMzY4NTQ3NzU4MDhMLCAwTH07DQotCQlyZXR1cm4gZGF0YTsNCi0JfQ0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBfdG9rZW5TZXRfNTIgPSBuZXcgQml0U2V0KG1rX3Rva2VuU2V0XzUyKCkpOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nW10gbWtfdG9rZW5TZXRfNTMoKSB7DQotCQlsb25nW10gZGF0YSA9IHsgNjU1NTJMLCA0TCwgMEwsIDBMfTsNCi0JCXJldHVybiBkYXRhOw0KLQl9DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IF90b2tlblNldF81MyA9IG5ldyBCaXRTZXQobWtfdG9rZW5TZXRfNTMoKSk7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmdbXSBta190b2tlblNldF81NCgpIHsNCi0JCWxvbmdbXSBkYXRhID0geyAzNjAxMTIwNDgzMzMxMjc2OEwsIDQxNjNMLCAwTCwgMEx9Ow0KLQkJcmV0dXJuIGRhdGE7DQotCX0NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgX3Rva2VuU2V0XzU0ID0gbmV3IEJpdFNldChta190b2tlblNldF81NCgpKTsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZ1tdIG1rX3Rva2VuU2V0XzU1KCkgew0KLQkJbG9uZ1tdIGRhdGEgPSB7IDE2TCwgMTUzNkwsIDBMLCAwTH07DQotCQlyZXR1cm4gZGF0YTsNCi0JfQ0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBfdG9rZW5TZXRfNTUgPSBuZXcgQml0U2V0KG1rX3Rva2VuU2V0XzU1KCkpOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nW10gbWtfdG9rZW5TZXRfNTYoKSB7DQotCQlsb25nW10gZGF0YSA9IHsgMTI5NzAzMjI5NDgwMjI4NDU0NEwsIDExOTc3MjM3NjNMLCAwTCwgMEx9Ow0KLQkJcmV0dXJuIGRhdGE7DQotCX0NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgX3Rva2VuU2V0XzU2ID0gbmV3IEJpdFNldChta190b2tlblNldF81NigpKTsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZ1tdIG1rX3Rva2VuU2V0XzU3KCkgew0KLQkJbG9uZ1tdIGRhdGEgPSB7IDgyMTQ1NjEzMjI0MjY1ODkyMDBMLCAxMDgyMzgyNDUxTCwgMEwsIDBMfTsNCi0JCXJldHVybiBkYXRhOw0KLQl9DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IF90b2tlblNldF81NyA9IG5ldyBCaXRTZXQobWtfdG9rZW5TZXRfNTcoKSk7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmdbXSBta190b2tlblNldF81OCgpIHsNCi0JCWxvbmdbXSBkYXRhID0geyA4MzU4NjgwNDEwMzgzMTU1MTg2TCwgMTA5ODU3MzQwNDI3NUwsIDBMLCAwTH07DQotCQlyZXR1cm4gZGF0YTsNCi0JfQ0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBfdG9rZW5TZXRfNTggPSBuZXcgQml0U2V0KG1rX3Rva2VuU2V0XzU4KCkpOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nW10gbWtfdG9rZW5TZXRfNTkoKSB7DQotCQlsb25nW10gZGF0YSA9IHsgMTI5NzAzMjI5NDc4NTUwNzMyOEwsIDExOTc3MjM3NjNMLCAwTCwgMEx9Ow0KLQkJcmV0dXJuIGRhdGE7DQotCX0NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgX3Rva2VuU2V0XzU5ID0gbmV3IEJpdFNldChta190b2tlblNldF81OSgpKTsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZ1tdIG1rX3Rva2VuU2V0XzYwKCkgew0KLQkJbG9uZ1tdIGRhdGEgPSB7IDgyMTQ1NjEzMjI0MjY2NTQ3MzZMLCAxMDgyMzgyNDUxTCwgMEwsIDBMfTsNCi0JCXJldHVybiBkYXRhOw0KLQl9DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IF90b2tlblNldF82MCA9IG5ldyBCaXRTZXQobWtfdG9rZW5TZXRfNjAoKSk7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmdbXSBta190b2tlblNldF82MSgpIHsNCi0JCWxvbmdbXSBkYXRhID0geyA4MzU4NjgwNDEwMzQ5NTM1MjE4TCwgMTA5ODY5NzEzNjI0M0wsIDBMLCAwTH07DQotCQlyZXR1cm4gZGF0YTsNCi0JfQ0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBfdG9rZW5TZXRfNjEgPSBuZXcgQml0U2V0KG1rX3Rva2VuU2V0XzYxKCkpOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nW10gbWtfdG9rZW5TZXRfNjIoKSB7DQotCQlsb25nW10gZGF0YSA9IHsgMTZMLCA1MjQyODhMLCAwTCwgMEx9Ow0KLQkJcmV0dXJuIGRhdGE7DQotCX0NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgX3Rva2VuU2V0XzYyID0gbmV3IEJpdFNldChta190b2tlblNldF82MigpKTsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZ1tdIG1rX3Rva2VuU2V0XzYzKCkgew0KLQkJbG9uZ1tdIGRhdGEgPSB7IDQwOTZMLCAyNjg0MzU0NTZMLCAwTCwgMEx9Ow0KLQkJcmV0dXJuIGRhdGE7DQotCX0NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgX3Rva2VuU2V0XzYzID0gbmV3IEJpdFNldChta190b2tlblNldF82MygpKTsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZ1tdIG1rX3Rva2VuU2V0XzY0KCkgew0KLQkJbG9uZ1tdIGRhdGEgPSB7IDBMLCAxMjM5Mjg1NzZMLCAwTCwgMEx9Ow0KLQkJcmV0dXJuIGRhdGE7DQotCX0NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgX3Rva2VuU2V0XzY0ID0gbmV3IEJpdFNldChta190b2tlblNldF82NCgpKTsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZ1tdIG1rX3Rva2VuU2V0XzY1KCkgew0KLQkJbG9uZ1tdIGRhdGEgPSB7IDgxOTJMLCAxMjM5Mjg1NzZMLCAwTCwgMEx9Ow0KLQkJcmV0dXJuIGRhdGE7DQotCX0NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgX3Rva2VuU2V0XzY1ID0gbmV3IEJpdFNldChta190b2tlblNldF82NSgpKTsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZ1tdIG1rX3Rva2VuU2V0XzY2KCkgew0KLQkJbG9uZ1tdIGRhdGEgPSB7IDEyOTcwMzIyOTQ3NzkyMDc2ODBMLCAxMDczOTkxNzk1TCwgMEwsIDBMfTsNCi0JCXJldHVybiBkYXRhOw0KLQl9DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IF90b2tlblNldF82NiA9IG5ldyBCaXRTZXQobWtfdG9rZW5TZXRfNjYoKSk7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmdbXSBta190b2tlblNldF82NygpIHsNCi0JCWxvbmdbXSBkYXRhID0geyAxMDQ4NTc2TCwgMjY4NDM1NDU2TCwgMEwsIDBMfTsNCi0JCXJldHVybiBkYXRhOw0KLQl9DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IF90b2tlblNldF82NyA9IG5ldyBCaXRTZXQobWtfdG9rZW5TZXRfNjcoKSk7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmdbXSBta190b2tlblNldF82OCgpIHsNCi0JCWxvbmdbXSBkYXRhID0geyAxMjk3MDMyMjk0Nzc5MjE1ODcyTCwgMTA3Mzk5MTc5NUwsIDBMLCAwTH07DQotCQlyZXR1cm4gZGF0YTsNCi0JfQ0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBfdG9rZW5TZXRfNjggPSBuZXcgQml0U2V0KG1rX3Rva2VuU2V0XzY4KCkpOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nW10gbWtfdG9rZW5TZXRfNjkoKSB7DQotCQlsb25nW10gZGF0YSA9IHsgMTA4NTQ1NkwsIDBMfTsNCi0JCXJldHVybiBkYXRhOw0KLQl9DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IF90b2tlblNldF82OSA9IG5ldyBCaXRTZXQobWtfdG9rZW5TZXRfNjkoKSk7DQotCQ0KLQl9DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvaWRsL3BhcnNlci9JRExUb2tlblR5cGVzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9pZGwvcGFyc2VyL0lETFRva2VuVHlwZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JhODY3ZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9pZGwvcGFyc2VyL0lETFRva2VuVHlwZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotLy8gJEFOVExSIDIuNy42ICgyMDA1LTEyLTIyKTogIm9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLmciIC0+ICJJRExQYXJzZXIuamF2YSIkDQotDQotICBwYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLnBhcnNlcjsNCi0NCi1wdWJsaWMgaW50ZXJmYWNlIElETFRva2VuVHlwZXMgew0KLQlpbnQgRU9GID0gMTsNCi0JaW50IE5VTExfVFJFRV9MT09LQUhFQUQgPSAzOw0KLQlpbnQgU0VNSSA9IDQ7DQotCWludCBMSVRFUkFMX2Fic3RyYWN0ID0gNTsNCi0JaW50IExJVEVSQUxfbG9jYWwgPSA2Ow0KLQlpbnQgTElURVJBTF9pbnRlcmZhY2UgPSA3Ow0KLQlpbnQgTElURVJBTF9jdXN0b20gPSA4Ow0KLQlpbnQgTElURVJBTF92YWx1ZXR5cGUgPSA5Ow0KLQlpbnQgTElURVJBTF9ldmVudHR5cGUgPSAxMDsNCi0JaW50IExJVEVSQUxfbW9kdWxlID0gMTE7DQotCWludCBMQ1VSTFkgPSAxMjsNCi0JaW50IFJDVVJMWSA9IDEzOw0KLQlpbnQgUFJFUFJPQ19ESVJFQ1RJVkUgPSAxNDsNCi0JaW50IENPTE9OID0gMTU7DQotCWludCBDT01NQSA9IDE2Ow0KLQlpbnQgU0NPUEVPUCA9IDE3Ow0KLQlpbnQgSURFTlQgPSAxODsNCi0JaW50IExJVEVSQUxfdHJ1bmNhdGFibGUgPSAxOTsNCi0JaW50IExJVEVSQUxfc3VwcG9ydHMgPSAyMDsNCi0JaW50IExJVEVSQUxfcHVibGljID0gMjE7DQotCWludCBMSVRFUkFMX3ByaXZhdGUgPSAyMjsNCi0JaW50IExJVEVSQUxfZmFjdG9yeSA9IDIzOw0KLQlpbnQgTFBBUkVOID0gMjQ7DQotCWludCBSUEFSRU4gPSAyNTsNCi0JaW50IExJVEVSQUxfaW4gPSAyNjsNCi0JaW50IExJVEVSQUxfY29uc3QgPSAyNzsNCi0JaW50IEFTU0lHTiA9IDI4Ow0KLQlpbnQgT1IgPSAyOTsNCi0JaW50IFhPUiA9IDMwOw0KLQlpbnQgQU5EID0gMzE7DQotCWludCBMU0hJRlQgPSAzMjsNCi0JaW50IFJTSElGVCA9IDMzOw0KLQlpbnQgUExVUyA9IDM0Ow0KLQlpbnQgTUlOVVMgPSAzNTsNCi0JaW50IFNUQVIgPSAzNjsNCi0JaW50IERJViA9IDM3Ow0KLQlpbnQgTU9EID0gMzg7DQotCWludCBUSUxERSA9IDM5Ow0KLQlpbnQgTElURVJBTF9UUlVFID0gNDA7DQotCWludCBMSVRFUkFMX0ZBTFNFID0gNDE7DQotCWludCBMSVRFUkFMX3R5cGVkZWYgPSA0MjsNCi0JaW50IExJVEVSQUxfbmF0aXZlID0gNDM7DQotCWludCBMSVRFUkFMX2Zsb2F0ID0gNDQ7DQotCWludCBMSVRFUkFMX2RvdWJsZSA9IDQ1Ow0KLQlpbnQgTElURVJBTF9sb25nID0gNDY7DQotCWludCBMSVRFUkFMX3Nob3J0ID0gNDc7DQotCWludCBMSVRFUkFMX3Vuc2lnbmVkID0gNDg7DQotCWludCBMSVRFUkFMX2NoYXIgPSA0OTsNCi0JaW50IExJVEVSQUxfd2NoYXIgPSA1MDsNCi0JaW50IExJVEVSQUxfYm9vbGVhbiA9IDUxOw0KLQlpbnQgTElURVJBTF9vY3RldCA9IDUyOw0KLQlpbnQgTElURVJBTF9hbnkgPSA1MzsNCi0JaW50IExJVEVSQUxfT2JqZWN0ID0gNTQ7DQotCWludCBMSVRFUkFMX3N0cnVjdCA9IDU1Ow0KLQlpbnQgTElURVJBTF91bmlvbiA9IDU2Ow0KLQlpbnQgTElURVJBTF9zd2l0Y2ggPSA1NzsNCi0JaW50IExJVEVSQUxfY2FzZSA9IDU4Ow0KLQlpbnQgTElURVJBTF9kZWZhdWx0ID0gNTk7DQotCWludCBMSVRFUkFMX2VudW0gPSA2MDsNCi0JaW50IExJVEVSQUxfc2VxdWVuY2UgPSA2MTsNCi0JaW50IExUID0gNjI7DQotCWludCBHVCA9IDYzOw0KLQlpbnQgTElURVJBTF9zdHJpbmcgPSA2NDsNCi0JaW50IExJVEVSQUxfd3N0cmluZyA9IDY1Ow0KLQlpbnQgTEJSQUNLID0gNjY7DQotCWludCBSQlJBQ0sgPSA2NzsNCi0JaW50IExJVEVSQUxfZXhjZXB0aW9uID0gNjg7DQotCWludCBMSVRFUkFMX29uZXdheSA9IDY5Ow0KLQlpbnQgTElURVJBTF92b2lkID0gNzA7DQotCWludCBMSVRFUkFMX291dCA9IDcxOw0KLQlpbnQgTElURVJBTF9pbm91dCA9IDcyOw0KLQlpbnQgTElURVJBTF9yYWlzZXMgPSA3MzsNCi0JaW50IExJVEVSQUxfY29udGV4dCA9IDc0Ow0KLQlpbnQgTElURVJBTF9maXhlZCA9IDc1Ow0KLQlpbnQgTElURVJBTF9WYWx1ZUJhc2UgPSA3NjsNCi0JaW50IExJVEVSQUxfaW1wb3J0ID0gNzc7DQotCWludCBMSVRFUkFMX3R5cGVpZCA9IDc4Ow0KLQlpbnQgTElURVJBTF90eXBlcHJlZml4ID0gNzk7DQotCWludCBMSVRFUkFMX3JlYWRvbmx5ID0gODA7DQotCWludCBMSVRFUkFMX2F0dHJpYnV0ZSA9IDgxOw0KLQlpbnQgTElURVJBTF9nZXRyYWlzZXMgPSA4MjsNCi0JaW50IExJVEVSQUxfc2V0cmFpc2VzID0gODM7DQotCWludCBMSVRFUkFMX2NvbXBvbmVudCA9IDg0Ow0KLQlpbnQgTElURVJBTF9wcm92aWRlcyA9IDg1Ow0KLQlpbnQgTElURVJBTF91c2VzID0gODY7DQotCWludCBMSVRFUkFMX211bHRpcGxlID0gODc7DQotCWludCBMSVRFUkFMX2VtaXRzID0gODg7DQotCWludCBMSVRFUkFMX3B1Ymxpc2hlcyA9IDg5Ow0KLQlpbnQgTElURVJBTF9jb25zdW1lcyA9IDkwOw0KLQlpbnQgTElURVJBTF9ob21lID0gOTE7DQotCWludCBMSVRFUkFMX21hbmFnZXMgPSA5MjsNCi0JaW50IExJVEVSQUxfcHJpbWFyeWtleSA9IDkzOw0KLQlpbnQgTElURVJBTF9maW5kZXIgPSA5NDsNCi0JaW50IElOVCA9IDk1Ow0KLQlpbnQgT0NUQUwgPSA5NjsNCi0JaW50IEhFWCA9IDk3Ow0KLQlpbnQgU1RSSU5HX0xJVEVSQUwgPSA5ODsNCi0JaW50IFdJREVfU1RSSU5HX0xJVEVSQUwgPSA5OTsNCi0JaW50IENIQVJfTElURVJBTCA9IDEwMDsNCi0JaW50IFdJREVfQ0hBUl9MSVRFUkFMID0gMTAxOw0KLQlpbnQgRklYRUQgPSAxMDI7DQotCWludCBGTE9BVCA9IDEwMzsNCi0JaW50IFFVRVNUSU9OID0gMTA0Ow0KLQlpbnQgRE9UID0gMTA1Ow0KLQlpbnQgTk9UID0gMTA2Ow0KLQlpbnQgV1MgPSAxMDc7DQotCWludCBTTF9DT01NRU5UID0gMTA4Ow0KLQlpbnQgTUxfQ09NTUVOVCA9IDEwOTsNCi0JaW50IEVTQyA9IDExMDsNCi0JaW50IFZPQ0FCID0gMTExOw0KLQlpbnQgRElHSVQgPSAxMTI7DQotCWludCBOT05aRVJPRElHSVQgPSAxMTM7DQotCWludCBPQ1RESUdJVCA9IDExNDsNCi0JaW50IEhFWERJR0lUID0gMTE1Ow0KLQlpbnQgRVNDQVBFRF9JREVOVCA9IDExNjsNCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvaWRsL3BhcnNlci9JRExWaXNpdG9yLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9pZGwvcGFyc2VyL0lETFZpc2l0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZmNjFmMi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9pZGwvcGFyc2VyL0lETFZpc2l0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC5wYXJzZXI7DQotDQotaW1wb3J0IGFudGxyLmNvbGxlY3Rpb25zLkFTVDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5pZGwudHlwZXMuQXJyYXlUeXBlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC50eXBlcy5Db21wb3NpdGVEYXRhVHlwZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5pZGwudHlwZXMuRGF0YVR5cGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLnR5cGVzLkVudW1UeXBlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC50eXBlcy5FeGNlcHRpb25UeXBlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC50eXBlcy5JREw7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLnR5cGVzLkludGVyZmFjZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5pZGwudHlwZXMuTWVtYmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC50eXBlcy5PcGVyYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLnR5cGVzLlByaW1pdGl2ZURhdGFUeXBlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC50eXBlcy5TZXF1ZW5jZVR5cGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLnR5cGVzLlN0cnVjdDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5pZGwudHlwZXMuVHlwZWRlZjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5pZGwudHlwZXMuVW5pb25NZW1iZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLnR5cGVzLlVuaW9uVHlwZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5pZGwudHlwZXMuVmFsdWVUeXBlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmV4Y2VwdGlvbnMuSW52YWxpZElETEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIENyZWF0ZWQgYnkgSW50ZWxsaUogSURFQS4NCi0gKiBVc2VyOiBFcmFuZ2ENCi0gKiBEYXRlOiBGZWIgMTEsIDIwMDcNCi0gKiBUaW1lOiAxMDowNjoyMyBQTQ0KLSAqLw0KLXB1YmxpYyBjbGFzcyBJRExWaXNpdG9yIC8qaW1wbGVtZW50cyBBU1RWaXNpdG9yKi8gew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coSURMVmlzaXRvci5jbGFzcyk7DQotICAgIHByaXZhdGUgSURMIGlkbCA9IG5ldyBJREwoKTsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgbW9kdWxlID0gIiI7DQotICAgIHByaXZhdGUgU3RyaW5nIG1vZHVsZUZvcklubmVyVHlwZXMgPSBudWxsOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5ORVJUWVBFX1NVRkZJWCA9ICJQYWNrYWdlIjsNCi0NCi0gICAgcHVibGljIElETCBnZXRJREwoKSB7DQotICAgICAgICByZXR1cm4gaWRsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldElETChJREwgaWRsKSB7DQotICAgICAgICB0aGlzLmlkbCA9IGlkbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB2aXNpdChBU1Qgbm9kZSkgdGhyb3dzIEludmFsaWRJRExFeGNlcHRpb24gew0KLSAgICAgICAgd2hpbGUgKG5vZGUgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHN3aXRjaCAobm9kZS5nZXRUeXBlKCkpIHsNCi0NCi0gICAgICAgICAgICAgICAgY2FzZSBJRExUb2tlblR5cGVzLkxJVEVSQUxfaW50ZXJmYWNlOiB7DQotICAgICAgICAgICAgICAgICAgICBpZGwuYWRkSW50ZXJmYWNlKHZpc2l0SW50ZXJmYWNlKG5vZGUpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIGNhc2UgSURMVG9rZW5UeXBlcy5MSVRFUkFMX21vZHVsZTogew0KLSAgICAgICAgICAgICAgICAgICAgQVNUIG1vZHVsZU5hbWUgPSBub2RlLmdldEZpcnN0Q2hpbGQoKTsNCi0gICAgICAgICAgICAgICAgICAgIElETFZpc2l0b3IgbW9kdWxlVmlzaXRvciA9IG5ldyBJRExWaXNpdG9yKCk7DQotICAgICAgICAgICAgICAgICAgICBtb2R1bGVWaXNpdG9yLnNldElETChpZGwpOw0KLSAgICAgICAgICAgICAgICAgICAgbW9kdWxlVmlzaXRvci5zZXRNb2R1bGUobW9kdWxlICsgbW9kdWxlTmFtZSk7DQotICAgICAgICAgICAgICAgICAgICBtb2R1bGVWaXNpdG9yLnZpc2l0KG1vZHVsZU5hbWUuZ2V0TmV4dFNpYmxpbmcoKSk7DQotICAgICAgICAgICAgICAgICAgICBpZGwuYWRkSURMKG1vZHVsZVZpc2l0b3IuZ2V0SURMKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgY2FzZSBJRExUb2tlblR5cGVzLkxJVEVSQUxfc3RydWN0OiB7DQotICAgICAgICAgICAgICAgICAgICBpZGwuYWRkVHlwZSh2aXNpdFN0cnVjdChub2RlKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBjYXNlIElETFRva2VuVHlwZXMuTElURVJBTF92YWx1ZXR5cGU6IHsNCi0gICAgICAgICAgICAgICAgICAgIGlkbC5hZGRUeXBlKHZpc2l0VmFsdWVUeXBlKG5vZGUpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICBjYXNlIElETFRva2VuVHlwZXMuTElURVJBTF9leGNlcHRpb246IHsNCi0gICAgICAgICAgICAgICAgICAgIGlkbC5hZGRUeXBlKHZpc2l0RXhjZXB0aW9uKG5vZGUpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIGNhc2UgSURMVG9rZW5UeXBlcy5MSVRFUkFMX2VudW06IHsNCi0gICAgICAgICAgICAgICAgICAgIGlkbC5hZGRUeXBlKHZpc2l0RW51bShub2RlKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBjYXNlIElETFRva2VuVHlwZXMuTElURVJBTF91bmlvbjogew0KLSAgICAgICAgICAgICAgICAgICAgaWRsLmFkZFR5cGUodmlzaXRVbmlvbihub2RlKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBjYXNlIElETFRva2VuVHlwZXMuTElURVJBTF90eXBlZGVmOiB7DQotICAgICAgICAgICAgICAgICAgICB2aXNpdEFuZEFkZFR5cGVkZWZzKG5vZGUsIG1vZHVsZSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB7DQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZElETEV4Y2VwdGlvbigiVW5zdXBwb3J0ZWQgSURMIHRva2VuICIgKyBub2RlKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RydWN0IHZpc2l0U3RydWN0KEFTVCBub2RlKSB0aHJvd3MgSW52YWxpZElETEV4Y2VwdGlvbiB7DQotICAgICAgICBBU1Qgc3RydWN0Tm9kZSA9IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOw0KLSAgICAgICAgU3RyaW5nIHN0cnVjdE5hbWUgPSBzdHJ1Y3ROb2RlLnRvU3RyaW5nKCk7DQotICAgICAgICBTdHJ1Y3Qgc3RydWN0ID0gbmV3IFN0cnVjdCgpOw0KLSAgICAgICAgc3RydWN0LnNldE1vZHVsZShtb2R1bGUpOw0KLSAgICAgICAgc3RydWN0LnNldE5hbWUoc3RydWN0TmFtZSk7DQotICAgICAgICBBU1QgbWVtYmVyVHlwZU5vZGUgPSBzdHJ1Y3ROb2RlLmdldE5leHRTaWJsaW5nKCk7DQotICAgICAgICB3aGlsZSAobWVtYmVyVHlwZU5vZGUgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIE1lbWJlciBtZW1iZXIgPSBuZXcgTWVtYmVyKCk7DQotICAgICAgICAgICAgRGF0YVR5cGUgZGF0YVR5cGUgPSBmaW5kRGF0YVR5cGUobWVtYmVyVHlwZU5vZGUsIHN0cnVjdE5hbWUpOw0KLSAgICAgICAgICAgIEFTVCBtZW1iZXJOb2RlID0gbWVtYmVyVHlwZU5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsNCi0gICAgICAgICAgICBTdHJpbmcgbWVtYmVyTmFtZSA9IG1lbWJlck5vZGUuZ2V0VGV4dCgpOw0KLSAgICAgICAgICAgIGludCBkaW1lbnNpb25zID0gbWVtYmVyTm9kZS5nZXROdW1iZXJPZkNoaWxkcmVuKCk7DQotICAgICAgICAgICAgaWYgKGRpbWVuc2lvbnMgPiAwKSB7DQotICAgICAgICAgICAgICAgIEFTVCBkaW1lbnNpb25Ob2RlID0gbWVtYmVyTm9kZS5nZXRGaXJzdENoaWxkKCk7DQotICAgICAgICAgICAgICAgIEFycmF5VHlwZSBhcnJheVR5cGUgPSBudWxsOw0KLSAgICAgICAgICAgICAgICBBcnJheVR5cGUgcm9vdEFycmF5VHlwZSA9IG51bGw7DQotICAgICAgICAgICAgICAgIGludCBpID0gMTsNCi0gICAgICAgICAgICAgICAgd2hpbGUoZGltZW5zaW9uTm9kZSE9bnVsbCkgew0KLSAgICAgICAgICAgICAgICAgICAgQXJyYXlUeXBlIHRlbXAgPSBuZXcgQXJyYXlUeXBlKCk7DQotICAgICAgICAgICAgICAgICAgICB0ZW1wLnNldEVsZW1lbnRNb2R1bGUobW9kdWxlKTsNCi0gICAgICAgICAgICAgICAgICAgIHRlbXAuc2V0RWxlbWVudE5hbWUobWVtYmVyTmFtZSk7DQotICAgICAgICAgICAgICAgICAgICB0ZW1wLnNldERlcHRoKGkpOw0KLSAgICAgICAgICAgICAgICAgICAgaSsrOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGFycmF5VHlwZSAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlUeXBlLnNldERhdGFUeXBlKHRlbXApOw0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICByb290QXJyYXlUeXBlID0gdGVtcDsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGFycmF5VHlwZSA9IHRlbXA7DQotICAgICAgICAgICAgICAgICAgICBhcnJheVR5cGUuc2V0RWxlbWVudENvdW50KEludGVnZXIucGFyc2VJbnQoZGltZW5zaW9uTm9kZS5nZXRUZXh0KCkpKTsNCi0gICAgICAgICAgICAgICAgICAgIGRpbWVuc2lvbk5vZGUgPSBkaW1lbnNpb25Ob2RlLmdldE5leHRTaWJsaW5nKCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgaWYgKGFycmF5VHlwZSAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICBhcnJheVR5cGUuc2V0RGF0YVR5cGUoZGF0YVR5cGUpOw0KLSAgICAgICAgICAgICAgICB9DQotLy8gICAgICAgICAgICAgICAgZGF0YVR5cGUgPSByb290QXJyYXlUeXBlOw0KLSAgICAgICAgICAgICAgICBUeXBlZGVmIHR5cGVkZWYgPSBuZXcgVHlwZWRlZigpOw0KLSAgICAgICAgICAgICAgICB0eXBlZGVmLnNldERhdGFUeXBlKHJvb3RBcnJheVR5cGUpOw0KLSAgICAgICAgICAgICAgICB0eXBlZGVmLnNldE1vZHVsZShtb2R1bGUpOw0KLSAgICAgICAgICAgICAgICB0eXBlZGVmLnNldE5hbWUoc3RydWN0TmFtZSArICdfJyArIG1lbWJlck5hbWUpOw0KLSAgICAgICAgICAgICAgICBpZGwuYWRkVHlwZSh0eXBlZGVmKTsNCi0gICAgICAgICAgICAgICAgZGF0YVR5cGUgPSB0eXBlZGVmOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBtZW1iZXIuc2V0RGF0YVR5cGUoZGF0YVR5cGUpOw0KLSAgICAgICAgICAgIG1lbWJlci5zZXROYW1lKG1lbWJlck5hbWUpOw0KLSAgICAgICAgICAgIHN0cnVjdC5hZGRNZW1iZXIobWVtYmVyKTsNCi0gICAgICAgICAgICBtZW1iZXJUeXBlTm9kZSA9IG1lbWJlck5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBzdHJ1Y3Q7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBWYWx1ZVR5cGUgdmlzaXRWYWx1ZVR5cGUoQVNUIG5vZGUpIHRocm93cyBJbnZhbGlkSURMRXhjZXB0aW9uIHsNCi0gICAgICAgIEFTVCB2YWx1ZU5vZGUgPSBub2RlLmdldEZpcnN0Q2hpbGQoKTsNCi0gICAgICAgIFZhbHVlVHlwZSB2YWx1ZSA9IG5ldyBWYWx1ZVR5cGUoKTsNCi0gICAgICAgIHZhbHVlLnNldE1vZHVsZShtb2R1bGUpOw0KLSAgICAgICAgU3RyaW5nIHZhbHVlTmFtZSA9IHZhbHVlTm9kZS50b1N0cmluZygpOw0KLSAgICAgICAgdmFsdWUuc2V0TmFtZSh2YWx1ZU5hbWUpOw0KLSAgICAgICAgQVNUIG1lbWJlck1vZGlmaWVyTm9kZSA9IHZhbHVlTm9kZS5nZXROZXh0U2libGluZygpOw0KLSAgICAgICAgd2hpbGUgKG1lbWJlck1vZGlmaWVyTm9kZSAhPSBudWxsKSB7DQotICAgICAgICAgICAgU3RyaW5nIG1lbWJlck1vZGlmaWVyTmFtZSA9IG1lbWJlck1vZGlmaWVyTm9kZS50b1N0cmluZygpOw0KLSAgICAgICAgICAgIGlmICghbWVtYmVyTW9kaWZpZXJOYW1lLmVxdWFscygicHJpdmF0ZSIpICYmICFtZW1iZXJNb2RpZmllck5hbWUuZXF1YWxzKCJwdWJsaWMiKSkgew0KLSAgICAgICAgICAgICAgICBpZiAoSURMVG9rZW5UeXBlcy5QUkVQUk9DX0RJUkVDVElWRT09bWVtYmVyTW9kaWZpZXJOb2RlLmdldFR5cGUoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1lbWJlck1vZGlmaWVyTmFtZS5zdGFydHNXaXRoKCJwcmFnbWEgSUQgIikpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtZW1iZXJNb2RpZmllck5hbWUgPSBtZW1iZXJNb2RpZmllck5hbWUuc3Vic3RyaW5nKDEwKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSBwcmFnbWEgPSBtZW1iZXJNb2RpZmllck5hbWUuc3BsaXQoIiAiKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJhZ21hLmxlbmd0aD09MiAmJiBwcmFnbWFbMF0hPW51bGwgJiYgcHJhZ21hWzFdIT1udWxsICYmIHByYWdtYVswXS5lcXVhbHModmFsdWUuZ2V0TmFtZSgpKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmFnbWFbMV0gPSBwcmFnbWFbMV0ucmVwbGFjZSgnIicsICcgJyk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLnNldElkKHByYWdtYVsxXS50cmltKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgIC8vIGFic3RyYWN0IG9wZXJhdGlvbg0KLSAgICAgICAgICAgICAgICAgICAgdmFsdWUuYWRkT3BlcmF0aW9uKHZpc2l0T3BlcmF0aW9uKG1lbWJlck1vZGlmaWVyTm9kZSkpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIG1lbWJlck1vZGlmaWVyTm9kZSA9IG1lbWJlck1vZGlmaWVyTm9kZS5nZXROZXh0U2libGluZygpOw0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgTWVtYmVyIG1lbWJlclR5cGUgPSBuZXcgTWVtYmVyKCk7DQotICAgICAgICAgICAgbWVtYmVyVHlwZS5zZXRNb2RpZmllcihtZW1iZXJNb2RpZmllck5hbWUpOw0KLSAgICAgICAgICAgIEFTVCBtZW1iZXJUeXBlTm9kZSA9IG1lbWJlck1vZGlmaWVyTm9kZS5nZXROZXh0U2libGluZygpOw0KLSAgICAgICAgICAgIG1lbWJlclR5cGUuc2V0RGF0YVR5cGUoZmluZERhdGFUeXBlKG1lbWJlclR5cGVOb2RlLCB2YWx1ZU5hbWUpKTsNCi0gICAgICAgICAgICBBU1QgbWVtYmVyTm9kZSA9IG1lbWJlclR5cGVOb2RlLmdldE5leHRTaWJsaW5nKCk7DQotICAgICAgICAgICAgbWVtYmVyVHlwZS5zZXROYW1lKG1lbWJlck5vZGUudG9TdHJpbmcoKSk7DQotICAgICAgICAgICAgdmFsdWUuYWRkTWVtYmVyKG1lbWJlclR5cGUpOw0KLSAgICAgICAgICAgIG1lbWJlck1vZGlmaWVyTm9kZSA9IG1lbWJlck5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB2YWx1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIEludGVyZmFjZSB2aXNpdEludGVyZmFjZShBU1Qgbm9kZSkgdGhyb3dzIEludmFsaWRJRExFeGNlcHRpb24gew0KLSAgICAgICAgSW50ZXJmYWNlIGludGYgPSBuZXcgSW50ZXJmYWNlKCk7DQotICAgICAgICBpbnRmLnNldE1vZHVsZShtb2R1bGUpOw0KLSAgICAgICAgQVNUIGludGVyZmFjZU5vZGUgPSBub2RlLmdldEZpcnN0Q2hpbGQoKTsNCi0gICAgICAgIFN0cmluZyBpbnRlcmZhY2VOYW1lID0gaW50ZXJmYWNlTm9kZS50b1N0cmluZygpOw0KLSAgICAgICAgaW50Zi5zZXROYW1lKGludGVyZmFjZU5hbWUpOw0KLSAgICAgICAgbW9kdWxlRm9ySW5uZXJUeXBlcyA9IG1vZHVsZSArIGludGVyZmFjZU5hbWUgKyBJTk5FUlRZUEVfU1VGRklYICsgQ29tcG9zaXRlRGF0YVR5cGUuTU9EVUxFX1NFUEVSQVRPUjsNCi0gICAgICAgIEFTVCBub2RlMiA9IGludGVyZmFjZU5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsNCi0gICAgICAgIHdoaWxlIChub2RlMiAhPSBudWxsKSB7DQotICAgICAgICAgICAgc3dpdGNoIChub2RlMi5nZXRUeXBlKCkpIHsNCi0gICAgICAgICAgICBjYXNlIElETFRva2VuVHlwZXMuTElURVJBTF9zdHJ1Y3Q6DQotICAgICAgICAgICAgICAgIFN0cnVjdCBpbm5lclN0cnVjdCA9IHZpc2l0U3RydWN0KG5vZGUyKTsNCi0gICAgICAgICAgICAgICAgaW5uZXJTdHJ1Y3Quc2V0TW9kdWxlKG1vZHVsZUZvcklubmVyVHlwZXMpOw0KLSAgICAgICAgICAgICAgICBpZGwuYWRkVHlwZShpbm5lclN0cnVjdCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgSURMVG9rZW5UeXBlcy5MSVRFUkFMX3ZhbHVldHlwZToNCi0gICAgICAgICAgICAgICAgbG9nLmVycm9yKCJVbnN1cHBvcnRlZCBJREwgdG9rZW4gIiArIG5vZGUyKTsNCi0gICAgICAgICAgICAgICAgLy8gQ09SQkEgMy5PIHNwZWMgZG9lcyBub3Qgc3VwcG9ydCB0aGlzDQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgSURMVG9rZW5UeXBlcy5MSVRFUkFMX2V4Y2VwdGlvbjoNCi0gICAgICAgICAgICAgICAgU3RydWN0IGlubmVyRXggPSB2aXNpdEV4Y2VwdGlvbihub2RlMik7DQotICAgICAgICAgICAgICAgIGlubmVyRXguc2V0TW9kdWxlKG1vZHVsZUZvcklubmVyVHlwZXMpOw0KLSAgICAgICAgICAgICAgICBpZGwuYWRkVHlwZShpbm5lckV4KTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBJRExUb2tlblR5cGVzLkxJVEVSQUxfZW51bToNCi0gICAgICAgICAgICAgICAgRW51bVR5cGUgaW5uZXJFbnVtID0gdmlzaXRFbnVtKG5vZGUyKTsNCi0gICAgICAgICAgICAgICAgaW5uZXJFbnVtLnNldE1vZHVsZShtb2R1bGVGb3JJbm5lclR5cGVzKTsNCi0gICAgICAgICAgICAgICAgaWRsLmFkZFR5cGUoaW5uZXJFbnVtKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBJRExUb2tlblR5cGVzLkxJVEVSQUxfdW5pb246DQotICAgICAgICAgICAgICAgIFVuaW9uVHlwZSBpbm5lclVuaW9uID0gdmlzaXRVbmlvbihub2RlMik7DQotICAgICAgICAgICAgICAgIGlubmVyVW5pb24uc2V0TW9kdWxlKG1vZHVsZUZvcklubmVyVHlwZXMpOw0KLSAgICAgICAgICAgICAgICBpZGwuYWRkVHlwZShpbm5lclVuaW9uKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBJRExUb2tlblR5cGVzLkxJVEVSQUxfdHlwZWRlZjoNCi0gICAgICAgICAgICAgICAgdmlzaXRBbmRBZGRUeXBlZGVmcyhub2RlMiwgbW9kdWxlRm9ySW5uZXJUeXBlcyk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgSURMVG9rZW5UeXBlcy5MSVRFUkFMX2NvbnN0Og0KLSAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIlVuc3VwcG9ydGVkIElETCB0b2tlbiAiICsgbm9kZTIpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIElETFRva2VuVHlwZXMuTElURVJBTF9hdHRyaWJ1dGU6DQotICAgICAgICAgICAgICAgIGludGYuYWRkT3BlcmF0aW9uKHZpc2l0R2V0QXR0cmlidXRlKG5vZGUyKSk7DQotICAgICAgICAgICAgICAgIGludGYuYWRkT3BlcmF0aW9uKHZpc2l0U2V0QXR0cmlidXRlKG5vZGUyKSk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgICAgIGlmIChub2RlMi50b1N0cmluZygpLnN0YXJ0c1dpdGgoInByYWdtYSBJRCAiKSkgew0KLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHByYWdtYUlkID0gbm9kZTIudG9TdHJpbmcoKS5zdWJzdHJpbmcoMTApOw0KLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gcHJhZ21hID0gcHJhZ21hSWQuc3BsaXQoIiAiKTsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChwcmFnbWEubGVuZ3RoPT0yICYmIHByYWdtYVswXSE9bnVsbCAmJiBwcmFnbWFbMV0hPW51bGwgJiYgcHJhZ21hWzBdLmVxdWFscyhpbnRmLmdldE5hbWUoKSkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwcmFnbWFbMV0gPSBwcmFnbWFbMV0ucmVwbGFjZSgnIicsICcgJyk7DQotICAgICAgICAgICAgICAgICAgICAgICAgaW50Zi5zZXRJZChwcmFnbWFbMV0udHJpbSgpKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgIGludGYuYWRkT3BlcmF0aW9uKHZpc2l0T3BlcmF0aW9uKG5vZGUyKSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIG5vZGUyID0gbm9kZTIuZ2V0TmV4dFNpYmxpbmcoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIG1vZHVsZUZvcklubmVyVHlwZXMgPSBudWxsOw0KLSAgICAgICAgcmV0dXJuIGludGY7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBPcGVyYXRpb24gdmlzaXRHZXRBdHRyaWJ1dGUoQVNUIG5vZGUpIHRocm93cyBJbnZhbGlkSURMRXhjZXB0aW9uIHsNCi0gICAgICAgIE9wZXJhdGlvbiBvcGVyYXRpb24gPSBuZXcgT3BlcmF0aW9uKCk7DQotICAgICAgICBBU1QgdHlwZSA9IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOw0KLSAgICAgICAgQVNUIG5hbWUgPSB0eXBlLmdldE5leHRTaWJsaW5nKCk7DQotICAgICAgICBTdHJpbmcgYXR0ck5hbWUgPSBuYW1lLnRvU3RyaW5nKCk7DQotICAgICAgICBvcGVyYXRpb24uc2V0UmV0dXJuVHlwZShmaW5kRGF0YVR5cGUodHlwZSwgYXR0ck5hbWUpKTsNCi0gICAgICAgIG9wZXJhdGlvbi5zZXROYW1lKCJfZ2V0XyIgKyBhdHRyTmFtZSk7DQotICAgICAgICByZXR1cm4gb3BlcmF0aW9uOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgT3BlcmF0aW9uIHZpc2l0U2V0QXR0cmlidXRlKEFTVCBub2RlKSB0aHJvd3MgSW52YWxpZElETEV4Y2VwdGlvbiB7DQotICAgICAgICBPcGVyYXRpb24gb3BlcmF0aW9uID0gbmV3IE9wZXJhdGlvbigpOw0KLSAgICAgICAgQVNUIHR5cGUgPSBub2RlLmdldEZpcnN0Q2hpbGQoKTsNCi0gICAgICAgIG9wZXJhdGlvbi5zZXRSZXR1cm5UeXBlKFByaW1pdGl2ZURhdGFUeXBlLmdldFByaW1pdGl2ZURhdGFUeXBlKCJ2b2lkIikpOw0KLSAgICAgICAgQVNUIG5hbWUgPSB0eXBlLmdldE5leHRTaWJsaW5nKCk7DQotICAgICAgICBTdHJpbmcgYXR0ck5hbWUgPSBuYW1lLnRvU3RyaW5nKCk7DQotICAgICAgICBvcGVyYXRpb24uc2V0TmFtZSgiX3NldF8iICsgYXR0ck5hbWUpOw0KLSAgICAgICAgTWVtYmVyIHBhcmFtID0gbmV3IE1lbWJlcigpOw0KLSAgICAgICAgcGFyYW0uc2V0TmFtZShhdHRyTmFtZSk7DQotICAgICAgICBwYXJhbS5zZXREYXRhVHlwZShmaW5kRGF0YVR5cGUodHlwZSwgYXR0ck5hbWUpKTsNCi0gICAgICAgIG9wZXJhdGlvbi5hZGRQYXJhbShwYXJhbSk7DQotICAgICAgICByZXR1cm4gb3BlcmF0aW9uOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgT3BlcmF0aW9uIHZpc2l0T3BlcmF0aW9uKEFTVCBub2RlKSB0aHJvd3MgSW52YWxpZElETEV4Y2VwdGlvbiB7DQotICAgICAgICBPcGVyYXRpb24gb3BlcmF0aW9uID0gbmV3IE9wZXJhdGlvbigpOw0KLSAgICAgICAgU3RyaW5nIG9wTmFtZSA9IG5vZGUudG9TdHJpbmcoKTsNCi0gICAgICAgIG9wZXJhdGlvbi5zZXROYW1lKG9wTmFtZSk7DQotICAgICAgICBBU1QgdHlwZSA9IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOw0KLSAgICAgICAgb3BlcmF0aW9uLnNldFJldHVyblR5cGUoZmluZERhdGFUeXBlKHR5cGUsIG9wTmFtZSkpOw0KLSAgICAgICAgQVNUIG1vZGUgPSB0eXBlLmdldE5leHRTaWJsaW5nKCk7DQotICAgICAgICB3aGlsZShtb2RlICE9IG51bGwpIHsNCi0gICAgICAgICAgICBpZiAoSURMVG9rZW5UeXBlcy5MSVRFUkFMX3JhaXNlcyA9PSBtb2RlLmdldFR5cGUoKSkgew0KLSAgICAgICAgICAgICAgICBBU1QgaWRsVHlwZSA9IG1vZGUuZ2V0Rmlyc3RDaGlsZCgpOw0KLSAgICAgICAgICAgICAgICB3aGlsZShpZGxUeXBlICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbi5hZGRSYWlzZXMoKEV4Y2VwdGlvblR5cGUpIGZpbmREYXRhVHlwZShpZGxUeXBlLCBvcE5hbWUpKTsNCi0gICAgICAgICAgICAgICAgICAgIGlkbFR5cGUgPSBpZGxUeXBlLmdldE5leHRTaWJsaW5nKCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBNZW1iZXIgcGFyYW0gPSBuZXcgTWVtYmVyKCk7DQotICAgICAgICAgICAgICAgIHBhcmFtLnNldE1vZGUobW9kZS50b1N0cmluZygpKTsNCi0gICAgICAgICAgICAgICAgQVNUIGlkbFR5cGUgPSBtb2RlLmdldEZpcnN0Q2hpbGQoKTsNCi0gICAgICAgICAgICAgICAgQVNUIHBhcmFtTmFtZSA9IGlkbFR5cGUuZ2V0TmV4dFNpYmxpbmcoKTsNCi0gICAgICAgICAgICAgICAgU3RyaW5nIHBhcmFtTmFtZVN0ciA9IHBhcmFtTmFtZS50b1N0cmluZygpOw0KLSAgICAgICAgICAgICAgICBwYXJhbS5zZXREYXRhVHlwZShmaW5kRGF0YVR5cGUoaWRsVHlwZSwgcGFyYW1OYW1lU3RyKSk7DQotICAgICAgICAgICAgICAgIHBhcmFtLnNldE5hbWUocGFyYW1OYW1lU3RyKTsNCi0gICAgICAgICAgICAgICAgb3BlcmF0aW9uLmFkZFBhcmFtKHBhcmFtKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgbW9kZSA9IG1vZGUuZ2V0TmV4dFNpYmxpbmcoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBvcGVyYXRpb247DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBFeGNlcHRpb25UeXBlIHZpc2l0RXhjZXB0aW9uKEFTVCBub2RlKSB0aHJvd3MgSW52YWxpZElETEV4Y2VwdGlvbiB7DQotICAgICAgICBFeGNlcHRpb25UeXBlIHJhaXNlc1R5cGUgPSBuZXcgRXhjZXB0aW9uVHlwZSgpOw0KLSAgICAgICAgQVNUIGV4Tm9kZSA9IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOw0KLSAgICAgICAgU3RyaW5nIGV4TmFtZSA9IGV4Tm9kZS50b1N0cmluZygpOw0KLSAgICAgICAgcmFpc2VzVHlwZS5zZXRNb2R1bGUobW9kdWxlKTsNCi0gICAgICAgIHJhaXNlc1R5cGUuc2V0TmFtZShleE5hbWUpOw0KLSAgICAgICAgQVNUIG1lbWJlclR5cGVOb2RlID0gZXhOb2RlLmdldE5leHRTaWJsaW5nKCk7DQotICAgICAgICB3aGlsZSAobWVtYmVyVHlwZU5vZGUgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIE1lbWJlciBtZW1iZXIgPSBuZXcgTWVtYmVyKCk7DQotICAgICAgICAgICAgbWVtYmVyLnNldERhdGFUeXBlKGZpbmREYXRhVHlwZShtZW1iZXJUeXBlTm9kZSwgZXhOYW1lKSk7DQotICAgICAgICAgICAgQVNUIG1lbWJlck5vZGUgPSBtZW1iZXJUeXBlTm9kZS5nZXROZXh0U2libGluZygpOw0KLSAgICAgICAgICAgIG1lbWJlci5zZXROYW1lKG1lbWJlck5vZGUudG9TdHJpbmcoKSk7DQotICAgICAgICAgICAgcmFpc2VzVHlwZS5hZGRNZW1iZXIobWVtYmVyKTsNCi0gICAgICAgICAgICBtZW1iZXJUeXBlTm9kZSA9IG1lbWJlck5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiByYWlzZXNUeXBlOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgRGF0YVR5cGUgZmluZERhdGFUeXBlKEFTVCB0eXBlTm9kZSwgU3RyaW5nIHBhcmVudE5hbWUpIHRocm93cyBJbnZhbGlkSURMRXhjZXB0aW9uIHsNCi0gICAgICAgIHJldHVybiBmaW5kRGF0YVR5cGUodHlwZU5vZGUsIHBhcmVudE5hbWUsIHRydWUsIGZhbHNlKTsNCi0gICAgfQ0KLSAgICBwcml2YXRlIERhdGFUeXBlIGZpbmREYXRhVHlwZShBU1QgdHlwZU5vZGUsIFN0cmluZyBwYXJlbnROYW1lLCBib29sZWFuIHJvb3QsIGJvb2xlYW4gbm9UeXBlRGVmRm9yU2VxcykgdGhyb3dzIEludmFsaWRJRExFeGNlcHRpb24gew0KLSAgICAgICAgLy8gQ2hlY2sgZm9yIHNlcXVlbmNlcw0KLSAgICAgICAgaWYgKHR5cGVOb2RlLmdldFR5cGUoKT09SURMVG9rZW5UeXBlcy5MSVRFUkFMX3NlcXVlbmNlKSB7DQotICAgICAgICAgICAgU2VxdWVuY2VUeXBlIHNlcXVlbmNlVHlwZSA9IHZpc2l0QW5vbnltb3VzU2VxdWVuY2UodHlwZU5vZGUsIHBhcmVudE5hbWUsIHJvb3QpOw0KLSAgICAgICAgICAgIGlmIChub1R5cGVEZWZGb3JTZXFzKSB7DQotICAgICAgICAgICAgICAgIHJldHVybiBzZXF1ZW5jZVR5cGU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIFR5cGVkZWYgdHlwZWRlZiA9IG5ldyBUeXBlZGVmKCk7DQotICAgICAgICAgICAgdHlwZWRlZi5zZXREYXRhVHlwZShzZXF1ZW5jZVR5cGUpOw0KLSAgICAgICAgICAgIHR5cGVkZWYuc2V0TW9kdWxlKG1vZHVsZSk7DQotICAgICAgICAgICAgdHlwZWRlZi5zZXROYW1lKHBhcmVudE5hbWUgKyAnXycgKyBzZXF1ZW5jZVR5cGUuZ2V0TmFtZSgpKTsNCi0gICAgICAgICAgICBpZGwuYWRkVHlwZSh0eXBlZGVmKTsNCi0gICAgICAgICAgICByZXR1cm4gdHlwZWRlZjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIERhdGFUeXBlIGRhdGFUeXBlID0gbnVsbDsNCi0gICAgICAgIE1hcCBjb21wb3NpdGVEYXRhVHlwZXMgPSBpZGwuZ2V0Q29tcG9zaXRlRGF0YVR5cGVzKCk7DQotDQotICAgICAgICBTdHJpbmcgdHlwZU5hbWU7DQotICAgICAgICBpZiAodHlwZU5vZGUuZ2V0VHlwZSgpID09IElETFRva2VuVHlwZXMuTElURVJBTF91bnNpZ25lZCkgew0KLSAgICAgICAgICAgIEFTVCBuZXh0Tm9kZSA9IHR5cGVOb2RlLmdldE5leHRTaWJsaW5nKCk7DQotICAgICAgICAgICAgaWYgKG5leHROb2RlID09IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRJRExFeGNlcHRpb24oIid1bnNpZ25lZCcgd2l0aG91dCBhIGRhdGEgdHlwZSIpOw0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAobmV4dE5vZGUuZ2V0VHlwZSgpID09IElETFRva2VuVHlwZXMuTElURVJBTF9zaG9ydCkgew0KLSAgICAgICAgICAgICAgICB0eXBlTm9kZS5zZXROZXh0U2libGluZyhuZXh0Tm9kZS5nZXROZXh0U2libGluZygpKTsNCi0gICAgICAgICAgICAgICAgdHlwZU5vZGUuc2V0Rmlyc3RDaGlsZChuZXh0Tm9kZS5nZXRGaXJzdENoaWxkKCkpOw0KLSAgICAgICAgICAgICAgICB0eXBlTmFtZSA9ICJ1c2hvcnQiOw0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAobmV4dE5vZGUuZ2V0VHlwZSgpID09IElETFRva2VuVHlwZXMuTElURVJBTF9sb25nKSB7DQotICAgICAgICAgICAgICAgIEFTVCBuZXh0VG9Mb25nID0gbmV4dE5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsNCi0gICAgICAgICAgICAgICAgaWYgKG5leHRUb0xvbmcgPT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRJRExFeGNlcHRpb24oImFuIGlkZW50aWZpZXIgaXMgcmVxdWlyZWQgYWZ0ZXIgdGhlICdsb25nJyBrZXl3b3JkIik7DQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobmV4dFRvTG9uZy5nZXRUeXBlKCkgPT0gSURMVG9rZW5UeXBlcy5MSVRFUkFMX2xvbmcpIHsNCi0gICAgICAgICAgICAgICAgICAgIHR5cGVOb2RlLnNldE5leHRTaWJsaW5nKG5leHRUb0xvbmcuZ2V0TmV4dFNpYmxpbmcoKSk7DQotICAgICAgICAgICAgICAgICAgICB0eXBlTm9kZS5zZXRGaXJzdENoaWxkKG5leHRUb0xvbmcuZ2V0Rmlyc3RDaGlsZCgpKTsNCi0gICAgICAgICAgICAgICAgICAgIHR5cGVOYW1lID0gInVsb25nbG9uZyI7DQotICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICB0eXBlTm9kZS5zZXROZXh0U2libGluZyhuZXh0Tm9kZS5nZXROZXh0U2libGluZygpKTsNCi0gICAgICAgICAgICAgICAgICAgIHR5cGVOb2RlLnNldEZpcnN0Q2hpbGQobmV4dE5vZGUuZ2V0Rmlyc3RDaGlsZCgpKTsNCi0gICAgICAgICAgICAgICAgICAgIHR5cGVOYW1lID0gInVsb25nIjsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkSURMRXhjZXB0aW9uKCJlaXRoZXIgJ2xvbmcnIG9yICdzaG9ydCcgaXMgZXhwZWN0ZWQgYWZ0ZXIgdGhlICd1bnNpZ25lZCcga2V5d29yZCIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0gZWxzZSBpZiAodHlwZU5vZGUuZ2V0VHlwZSgpID09IElETFRva2VuVHlwZXMuTElURVJBTF9sb25nKSB7DQotICAgICAgICAgICAgQVNUIG5leHRUb0xvbmcgPSB0eXBlTm9kZS5nZXROZXh0U2libGluZygpOw0KLSAgICAgICAgICAgIGlmIChuZXh0VG9Mb25nID09IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRJRExFeGNlcHRpb24oImFuIGlkZW50aWZpZXIgaXMgcmVxdWlyZWQgYWZ0ZXIgdGhlICdsb25nJyBrZXl3b3JkIik7DQotICAgICAgICAgICAgfSBlbHNlIGlmIChuZXh0VG9Mb25nLmdldFR5cGUoKSA9PSBJRExUb2tlblR5cGVzLkxJVEVSQUxfbG9uZykgew0KLSAgICAgICAgICAgICAgICB0eXBlTm9kZS5zZXROZXh0U2libGluZyhuZXh0VG9Mb25nLmdldE5leHRTaWJsaW5nKCkpOw0KLSAgICAgICAgICAgICAgICB0eXBlTm9kZS5zZXRGaXJzdENoaWxkKG5leHRUb0xvbmcuZ2V0Rmlyc3RDaGlsZCgpKTsNCi0gICAgICAgICAgICAgICAgdHlwZU5hbWUgPSAibG9uZ2xvbmciOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIHR5cGVOYW1lID0gImxvbmciOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgdHlwZU5hbWUgPSBnZXRUeXBlTmFtZSh0eXBlTm9kZSk7ICAgIA0KLSAgICAgICAgfQ0KLQ0KLQ0KLSAgICAgICAgaWYgKGNvbXBvc2l0ZURhdGFUeXBlcyE9bnVsbCkgew0KLSAgICAgICAgICAgIGlmICghbW9kdWxlLmVxdWFscygiIikpIHsNCi0gICAgICAgICAgICAgICAgaWYgKCF0eXBlTmFtZS5zdGFydHNXaXRoKG1vZHVsZSkpIHsNCi0gICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlID0gKERhdGFUeXBlKSBpZGwuZ2V0Q29tcG9zaXRlRGF0YVR5cGVzKCkuZ2V0KG1vZHVsZSArIHR5cGVOYW1lKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBpZiAoZGF0YVR5cGU9PW51bGwgJiYgbW9kdWxlRm9ySW5uZXJUeXBlcyE9bnVsbCkgew0KLSAgICAgICAgICAgICAgICBpZiAoIXR5cGVOYW1lLnN0YXJ0c1dpdGgobW9kdWxlKSkgew0KLSAgICAgICAgICAgICAgICAgICAgZGF0YVR5cGUgPSAoRGF0YVR5cGUpIGlkbC5nZXRDb21wb3NpdGVEYXRhVHlwZXMoKS5nZXQobW9kdWxlRm9ySW5uZXJUeXBlcyArIHR5cGVOYW1lKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBpZiAoZGF0YVR5cGU9PW51bGwpDQotICAgICAgICAgICAgICAgIGRhdGFUeXBlID0gKERhdGFUeXBlKSBpZGwuZ2V0Q29tcG9zaXRlRGF0YVR5cGVzKCkuZ2V0KHR5cGVOYW1lKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChkYXRhVHlwZT09bnVsbCkNCi0gICAgICAgICAgICBkYXRhVHlwZSA9IFByaW1pdGl2ZURhdGFUeXBlLmdldFByaW1pdGl2ZURhdGFUeXBlKHR5cGVOYW1lKTsNCi0NCi0gICAgICAgIGlmIChkYXRhVHlwZSA9PSBudWxsKQ0KLSAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkSURMRXhjZXB0aW9uKCJJbnZhbGlkIGRhdGEgdHlwZTogIiArIHR5cGVOYW1lKTsNCi0gICAgICAgIHJldHVybiBkYXRhVHlwZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKEFTVCBub2RlKSB7DQotICAgICAgICBTdHJpbmcgdHlwZU5hbWUgPSBub2RlLmdldFRleHQoKTsNCi0gICAgICAgIEFTVCBtZW1iZXJUeXBlTm9kZUNoaWxkID0gbm9kZS5nZXRGaXJzdENoaWxkKCk7DQotICAgICAgICB3aGlsZShtZW1iZXJUeXBlTm9kZUNoaWxkIT1udWxsKSB7DQotICAgICAgICAgICAgdHlwZU5hbWUgPSB0eXBlTmFtZSArIENvbXBvc2l0ZURhdGFUeXBlLk1PRFVMRV9TRVBFUkFUT1IgKyBtZW1iZXJUeXBlTm9kZUNoaWxkLnRvU3RyaW5nKCk7DQotICAgICAgICAgICAgbWVtYmVyVHlwZU5vZGVDaGlsZCA9IG1lbWJlclR5cGVOb2RlQ2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB0eXBlTmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRNb2R1bGUoU3RyaW5nIG1vZHVsZSkgew0KLSAgICAgICAgaWYgKG1vZHVsZT09bnVsbCB8fCBtb2R1bGUubGVuZ3RoKCk8MSkNCi0gICAgICAgICAgICBtb2R1bGUgPSAiIjsNCi0gICAgICAgIGVsc2UgaWYgKCFtb2R1bGUuZW5kc1dpdGgoQ29tcG9zaXRlRGF0YVR5cGUuTU9EVUxFX1NFUEVSQVRPUikpDQotICAgICAgICAgICAgbW9kdWxlICs9IENvbXBvc2l0ZURhdGFUeXBlLk1PRFVMRV9TRVBFUkFUT1I7DQotICAgICAgICB0aGlzLm1vZHVsZSA9IG1vZHVsZTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIEVudW1UeXBlIHZpc2l0RW51bShBU1Qgbm9kZSkgew0KLSAgICAgICAgQVNUIGVudW1Ob2RlID0gbm9kZS5nZXRGaXJzdENoaWxkKCk7DQotICAgICAgICBTdHJpbmcgZW51bU5hbWUgPSBlbnVtTm9kZS50b1N0cmluZygpOw0KLSAgICAgICAgRW51bVR5cGUgZW51bVR5cGUgPSBuZXcgRW51bVR5cGUoKTsNCi0gICAgICAgIGVudW1UeXBlLnNldE1vZHVsZShtb2R1bGUpOw0KLSAgICAgICAgZW51bVR5cGUuc2V0TmFtZShlbnVtTmFtZSk7DQotICAgICAgICBBU1QgbWVtYmVyVHlwZU5vZGUgPSBlbnVtTm9kZS5nZXROZXh0U2libGluZygpOw0KLSAgICAgICAgd2hpbGUgKG1lbWJlclR5cGVOb2RlICE9IG51bGwpIHsNCi0gICAgICAgICAgICBlbnVtVHlwZS5hZGRFbnVtTWVtYmVyKG1lbWJlclR5cGVOb2RlLnRvU3RyaW5nKCkpOw0KLSAgICAgICAgICAgIG1lbWJlclR5cGVOb2RlID0gbWVtYmVyVHlwZU5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBlbnVtVHlwZTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFVuaW9uVHlwZSB2aXNpdFVuaW9uKEFTVCBub2RlKSB0aHJvd3MgSW52YWxpZElETEV4Y2VwdGlvbiB7DQotICAgICAgICBVbmlvblR5cGUgdW5pb25UeXBlID0gbmV3IFVuaW9uVHlwZSgpOw0KLSAgICAgICAgQVNUIHVuTm9kZSA9IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOw0KLSAgICAgICAgU3RyaW5nIHVuTmFtZSA9IHVuTm9kZS50b1N0cmluZygpOw0KLSAgICAgICAgdW5pb25UeXBlLnNldE1vZHVsZShtb2R1bGUpOw0KLSAgICAgICAgdW5pb25UeXBlLnNldE5hbWUodW5OYW1lKTsNCi0gICAgICAgIEFTVCBzd2l0Y2hUeXBlTm9kZSA9IHVuTm9kZS5nZXROZXh0U2libGluZygpOw0KLSAgICAgICAgdW5pb25UeXBlLnNldERpc2NyaW1pbmF0b3JUeXBlKGZpbmREYXRhVHlwZShzd2l0Y2hUeXBlTm9kZSwgdW5OYW1lKSk7DQotICAgICAgICBBU1QgY2FzZU9yRGVmYXVsdE5vZGUgPSBzd2l0Y2hUeXBlTm9kZS5nZXROZXh0U2libGluZygpOw0KLSAgICAgICAgd2hpbGUgKGNhc2VPckRlZmF1bHROb2RlICE9IG51bGwpIHsNCi0gICAgICAgICAgICBVbmlvbk1lbWJlciB1bmlvbk1lbWJlciA9IG5ldyBVbmlvbk1lbWJlcigpOw0KLSAgICAgICAgICAgIEFTVCB0eXBlTm9kZTsNCi0gICAgICAgICAgICBpZiAoSURMVG9rZW5UeXBlcy5MSVRFUkFMX2RlZmF1bHQgPT0gY2FzZU9yRGVmYXVsdE5vZGUuZ2V0VHlwZSgpKSB7DQotICAgICAgICAgICAgICAgIHVuaW9uTWVtYmVyLnNldERlZmF1bHQodHJ1ZSk7DQotICAgICAgICAgICAgICAgIHR5cGVOb2RlID0gY2FzZU9yRGVmYXVsdE5vZGUuZ2V0Rmlyc3RDaGlsZCgpOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIHVuaW9uTWVtYmVyLnNldERlZmF1bHQoZmFsc2UpOw0KLSAgICAgICAgICAgICAgICBBU1QgY2FzZVZhbHVlTm9kZSA9IGNhc2VPckRlZmF1bHROb2RlLmdldEZpcnN0Q2hpbGQoKTsNCi0gICAgICAgICAgICAgICAgdW5pb25NZW1iZXIuc2V0RGlzY3JpbWluYXRvclZhbHVlKGNhc2VWYWx1ZU5vZGUuZ2V0VGV4dCgpKTsNCi0gICAgICAgICAgICAgICAgdHlwZU5vZGUgPSBjYXNlVmFsdWVOb2RlLmdldE5leHRTaWJsaW5nKCk7DQotICAgICAgICAgICAgfQ0KLQ0KLQ0KLSAgICAgICAgICAgIHVuaW9uTWVtYmVyLnNldERhdGFUeXBlKGZpbmREYXRhVHlwZSh0eXBlTm9kZSwgdW5OYW1lKSk7DQotDQotICAgICAgICAgICAgQVNUIG1lbWJlck5vZGUgPSB0eXBlTm9kZS5nZXROZXh0U2libGluZygpOw0KLSAgICAgICAgICAgIHVuaW9uTWVtYmVyLnNldE5hbWUobWVtYmVyTm9kZS50b1N0cmluZygpKTsNCi0gICAgICAgICAgICB1bmlvblR5cGUuYWRkTWVtYmVyKHVuaW9uTWVtYmVyKTsNCi0gICAgICAgICAgICBjYXNlT3JEZWZhdWx0Tm9kZSA9IGNhc2VPckRlZmF1bHROb2RlLmdldE5leHRTaWJsaW5nKCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gdW5pb25UeXBlOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCB2aXNpdEFuZEFkZFR5cGVkZWZzKEFTVCBub2RlLCBTdHJpbmcgbW9kdWxlTmFtZSkgdGhyb3dzIEludmFsaWRJRExFeGNlcHRpb24gew0KLSAgICAgICAgQVNUIHR5cGVkZWZOb2RlID0gbm9kZS5nZXRGaXJzdENoaWxkKCk7DQotDQotICAgICAgICBEYXRhVHlwZSBkYXRhVHlwZTsNCi0gICAgICAgIC8vU2VxdWVuY2VUeXBlIHNlcXVlbmNlID0gbnVsbDsNCi0gICAgICAgIC8vaWYgKHR5cGVkZWZOb2RlLmdldFR5cGUoKT09SURMVG9rZW5UeXBlcy5MSVRFUkFMX3NlcXVlbmNlKSB7DQotICAgICAgICAvLyAgICBzZXF1ZW5jZSA9IHZpc2l0QW5vbnltb3VzU2VxdWVuY2UodHlwZWRlZk5vZGUpOw0KLSAgICAgICAgLy8gICAgZGF0YVR5cGUgPSBzZXF1ZW5jZS5nZXREYXRhVHlwZSgpOw0KLSAgICAgICAgLy99IGVsc2Ugew0KLSAgICAgICAgICAgIGRhdGFUeXBlID0gZmluZERhdGFUeXBlKHR5cGVkZWZOb2RlLCBudWxsLCB0cnVlLCB0cnVlKTsNCi0gICAgICAgIC8vfQ0KLSAgICAgICAgQVNUIHR5cGVkZWZOYW1lTm9kZSA9IHR5cGVkZWZOb2RlLmdldE5leHRTaWJsaW5nKCk7DQotICAgICAgICBBU1QgZGltZW5zaW9uTm9kZTsNCi0gICAgICAgIFN0cmluZyB0eXBlZGVmTmFtZSA9IHR5cGVkZWZOYW1lTm9kZS50b1N0cmluZygpOw0KLSAgICAgICAgVHlwZWRlZiB0eXBlZGVmOw0KLSAgICAgICAgd2hpbGUgKHR5cGVkZWZOYW1lTm9kZSAhPSBudWxsKSB7DQotICAgICAgICAgICAgaW50IGRpbWVuc2lvbnMgPSB0eXBlZGVmTmFtZU5vZGUuZ2V0TnVtYmVyT2ZDaGlsZHJlbigpOw0KLSAgICAgICAgICAgIGlmIChkaW1lbnNpb25zID4gMCkgew0KLSAgICAgICAgICAgICAgICBkaW1lbnNpb25Ob2RlID0gdHlwZWRlZk5hbWVOb2RlLmdldEZpcnN0Q2hpbGQoKTsNCi0gICAgICAgICAgICAgICAgQXJyYXlUeXBlIGFycmF5VHlwZSA9IG51bGw7DQotICAgICAgICAgICAgICAgIEFycmF5VHlwZSByb290QXJyYXlUeXBlID0gbnVsbDsNCi0gICAgICAgICAgICAgICAgaW50IGkgPSAxOw0KLSAgICAgICAgICAgICAgICB3aGlsZShkaW1lbnNpb25Ob2RlIT1udWxsKSB7DQotICAgICAgICAgICAgICAgICAgICBBcnJheVR5cGUgdGVtcCA9IG5ldyBBcnJheVR5cGUoKTsNCi0gICAgICAgICAgICAgICAgICAgIHRlbXAuc2V0RWxlbWVudE1vZHVsZShtb2R1bGVOYW1lKTsNCi0gICAgICAgICAgICAgICAgICAgIHRlbXAuc2V0RWxlbWVudE5hbWUodHlwZWRlZk5hbWUpOw0KLSAgICAgICAgICAgICAgICAgICAgdGVtcC5zZXREZXB0aChpKTsNCi0gICAgICAgICAgICAgICAgICAgIGkrKzsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChhcnJheVR5cGUgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5VHlwZS5zZXREYXRhVHlwZSh0ZW1wKTsNCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcm9vdEFycmF5VHlwZSA9IHRlbXA7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBhcnJheVR5cGUgPSB0ZW1wOw0KLSAgICAgICAgICAgICAgICAgICAgYXJyYXlUeXBlLnNldEVsZW1lbnRDb3VudChJbnRlZ2VyLnBhcnNlSW50KGRpbWVuc2lvbk5vZGUuZ2V0VGV4dCgpKSk7DQotICAgICAgICAgICAgICAgICAgICBkaW1lbnNpb25Ob2RlID0gZGltZW5zaW9uTm9kZS5nZXROZXh0U2libGluZygpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGlmIChhcnJheVR5cGUgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICAgICAgYXJyYXlUeXBlLnNldERhdGFUeXBlKGRhdGFUeXBlKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBkYXRhVHlwZSA9IHJvb3RBcnJheVR5cGU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHR5cGVkZWYgPSBuZXcgVHlwZWRlZigpOw0KLSAgICAgICAgICAgIHR5cGVkZWYuc2V0RGF0YVR5cGUoZGF0YVR5cGUpOw0KLSAgICAgICAgICAgIHR5cGVkZWYuc2V0TW9kdWxlKG1vZHVsZU5hbWUpOw0KLSAgICAgICAgICAgIHR5cGVkZWYuc2V0TmFtZSh0eXBlZGVmTmFtZSk7DQotICAgICAgICAgICAgaWRsLmFkZFR5cGUodHlwZWRlZik7DQotICAgICAgICAgICAgdHlwZWRlZk5hbWVOb2RlID0gdHlwZWRlZk5hbWVOb2RlLmdldE5leHRTaWJsaW5nKCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTZXF1ZW5jZVR5cGUgdmlzaXRBbm9ueW1vdXNTZXF1ZW5jZShBU1Qgbm9kZSwgU3RyaW5nIHBhcmVudE5hbWUsIGJvb2xlYW4gcm9vdCkgdGhyb3dzIEludmFsaWRJRExFeGNlcHRpb24gew0KLSAgICAgICAgQVNUIHR5cGVOb2RlID0gbm9kZS5nZXRGaXJzdENoaWxkKCk7DQotICAgICAgICBTZXF1ZW5jZVR5cGUgc2VxdWVuY2VUeXBlID0gbmV3IFNlcXVlbmNlVHlwZSgpOw0KLSAgICAgICAgRGF0YVR5cGUgZGF0YVR5cGUgPSBmaW5kRGF0YVR5cGUodHlwZU5vZGUsIHBhcmVudE5hbWUsIGZhbHNlLCBmYWxzZSk7DQotICAgICAgICBzZXF1ZW5jZVR5cGUuc2V0RGF0YVR5cGUoZGF0YVR5cGUpOw0KLSAgICAgICAgc2VxdWVuY2VUeXBlLnNldEVsZW1lbnRNb2R1bGUobW9kdWxlKTsNCi0gICAgICAgIEFTVCBlbGVtZW50Tm9kZSA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsNCi0gICAgICAgIGlmIChlbGVtZW50Tm9kZSAhPSBudWxsICYmIHJvb3QpIHsNCi0gICAgICAgICAgICBTdHJpbmcgZWxlbWVudE5hbWUgPSBlbGVtZW50Tm9kZS5nZXRUZXh0KCk7DQotICAgICAgICAgICAgc2VxdWVuY2VUeXBlLnNldE5hbWUoZWxlbWVudE5hbWUpOw0KLSAgICAgICAgICAgIFNlcXVlbmNlVHlwZSB0ZW1wU2VxVHlwZSA9IHNlcXVlbmNlVHlwZTsNCi0gICAgICAgICAgICBpbnQgaSA9IDE7DQotICAgICAgICAgICAgRGF0YVR5cGUgdGVtcERhdGFUeXBlOw0KLSAgICAgICAgICAgIHdoaWxlKHRydWUpIHsNCi0gICAgICAgICAgICAgICAgdGVtcFNlcVR5cGUuc2V0RWxlbWVudE5hbWUoZWxlbWVudE5hbWUpOw0KLSAgICAgICAgICAgICAgICB0ZW1wU2VxVHlwZS5zZXREZXB0aChpKTsNCi0gICAgICAgICAgICAgICAgaSsrOw0KLSAgICAgICAgICAgICAgICB0ZW1wRGF0YVR5cGUgPSB0ZW1wU2VxVHlwZS5nZXREYXRhVHlwZSgpOw0KLSAgICAgICAgICAgICAgICBpZiAodGVtcERhdGFUeXBlIGluc3RhbmNlb2YgU2VxdWVuY2VUeXBlKSB7DQotICAgICAgICAgICAgICAgICAgICB0ZW1wU2VxVHlwZSA9IChTZXF1ZW5jZVR5cGUpIHRlbXBEYXRhVHlwZTsgICAgDQotICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIEFTVCBjb3VudE5vZGUgPSB0eXBlTm9kZS5nZXROZXh0U2libGluZygpOw0KLSAgICAgICAgaWYgKGNvdW50Tm9kZSE9bnVsbCkgew0KLSAgICAgICAgICAgIHNlcXVlbmNlVHlwZS5zZXRFbGVtZW50Q291bnQoSW50ZWdlci5wYXJzZUludChjb3VudE5vZGUuZ2V0VGV4dCgpKSk7DQotICAgICAgICAgICAgLy9zZXF1ZW5jZVR5cGUuc2V0Qm91bmRlZCh0cnVlKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgc2VxdWVuY2VUeXBlLnNldEVsZW1lbnRDb3VudCgwKTsNCi0gICAgICAgICAgICAvL3NlcXVlbmNlVHlwZS5zZXRCb3VuZGVkKGZhbHNlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBzZXF1ZW5jZVR5cGU7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvaWRsL3BhcnNlci9pZGwuZyBiL3YxLjUuMVJDMy9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL2lkbC9wYXJzZXIvaWRsLmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5ZTk5NDYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvaWRsL3BhcnNlci9pZGwuZworKysgL2Rldi9udWxsCkBAIC0xLDE0MTkgKzAsMCBAQAotaGVhZGVyIHsNCi0gIHBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5pZGw7DQotDQotICBpbXBvcnQgamF2YS5pby4qOw0KLSAgaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7DQotICBpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsNCi0gfQ0KLQ0KLS8qKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotLyoqDQotICogIFRoaXMgaXMgYSBjb21wbGV0ZSBwYXJzZXIgZm9yIHRoZSBJREwgbGFuZ3VhZ2UgYXMgZGVmaW5lZA0KLSAqICBieSB0aGUgQ09SQkEgMy4wLjIgc3BlY2lmaWNhdGlvbi4gIEl0IHdpbGwgYWxsb3cgdGhvc2Ugd2hvDQotICogIG5lZWQgYW4gSURMIHBhcnNlciB0byBnZXQgdXAtYW5kLXJ1bm5pbmcgdmVyeSBxdWlja2x5Lg0KLSAqICBUaG91Z2ggSURMJ3Mgc3ludGF4IGlzIHZlcnkgc2ltaWxhciB0byBDKyssIGl0IGlzIGFsc28NCi0gKiAgbXVjaCBzaW1wbGVyLCBkdWUgaW4gbGFyZ2UgcGFydCB0byB0aGUgZmFjdCB0aGF0IGl0IGlzDQotICogIGEgZGVjbGFyYXRpdmUtb25seSBsYW5ndWFnZS4NCi0gKg0KLSAqICBTb21lIHRoaW5ncyB0aGF0IGFyZSBub3QgaW5jbHVkZWQgYXJlOiBTeW1ib2wgdGFibGUgY29uc3RydWN0aW9uDQotICogIChpdCBpcyBub3QgbmVjZXNzYXJ5IGZvciBwYXJzaW5nLCBidHcpIGFuZCBwcmVwcm9jZXNzaW5nIChmb3INCi0gKiAgSURMIGNvbXBpbGVyICNwcmFnbWEgZGlyZWN0aXZlcykuIFlvdSBjYW4gdXNlIGp1c3QgYWJvdXQgYW55DQotICogIEMgb3IgQysrIHByZXByb2Nlc3NvciwgYnV0IHRoZXJlIGlzIGFuIGludGVyZXN0aW5nIHNlbWFudGljDQotICogIGlzc3VlIGlmIHlvdSBhcmUgZ29pbmcgdG8gZ2VuZXJhdGUgY29kZTogSW4gQywgI2luY2x1ZGUgaXMNCi0gKiAgYSBsaXRlcmFsIGluY2x1ZGUsIGluIElETCwgI2luY2x1ZGUgaXMgbW9yZSBsaWtlIEphdmEncyBpbXBvcnQ6DQotICogIEl0IGFkZHMgZGVmaW5pdGlvbnMgdG8gdGhlIHNjb3BlIG9mIHRoZSBwYXJzZSwgYnV0IGluY2x1ZGVkDQotICogIGRlZmluaXRpb25zIGFyZSBub3QgZ2VuZXJhdGVkLg0KLSAqDQotICogIEppbSBDb2tlciwgamNva2VyQG1hZ2VsYW5nLmNvbQ0KLSAqICBHYXJ5IER1emFuLCBnZHV6YW5AYmJuLmNvbQ0KLSAqLw0KLWNsYXNzIElETFBhcnNlciBleHRlbmRzIFBhcnNlcjsNCi1vcHRpb25zIHsNCi0JZXhwb3J0Vm9jYWI9SURMOw0KLQlidWlsZEFTVD10cnVlOw0KLQlrPTQ7DQotfQ0KLQ0KLXNwZWNpZmljYXRpb24NCi0JOiAgIChpbXBvcnRfZGNsKSogKGRlZmluaXRpb24pKw0KLQk7DQotDQotDQotZGVmaW5pdGlvbg0KLQk6ICAgKCAgIHR5cGVfZGNsIFNFTUkhDQotCSAgICB8ICAgY29uc3RfZGNsIFNFTUkhDQotCSAgICB8ICAgZXhjZXB0X2RjbCBTRU1JIQ0KLQkgICAgfCAgICgoImFic3RyYWN0IiB8ICJsb2NhbCIpPyAiaW50ZXJmYWNlIikgPT4gaW50ZXJmIFNFTUkhDQotCSAgICB8ICAgbW9kdWxlIFNFTUkhDQotCSAgICB8ICAgKCgiYWJzdHJhY3QiIHwgImN1c3RvbSIpPyAidmFsdWV0eXBlIikgPT4gdmFsdWUgU0VNSSENCi0JICAgIHwgICB0eXBlX2lkX2RjbCBTRU1JIQ0KLQkgICAgfCAgIHR5cGVfcHJlZml4X2RjbCBTRU1JIQ0KLQkgICAgfCAgICgoImFic3RyYWN0IiB8ICJjdXN0b20iKT8gImV2ZW50dHlwZSIpID0+IGV2ZW50IFNFTUkhDQotCSAgICB8ICAgY29tcG9uZW50IFNFTUkhDQotCSAgICB8ICAgaG9tZV9kY2wgU0VNSSENCi0JICAgICkNCi0JOw0KLQ0KLW1vZHVsZQ0KLQk6ICAgICJtb2R1bGUiXg0KLQkgICAgIGlkZW50aWZpZXINCi0JICAgICBMQ1VSTFkhIGQ6ZGVmaW5pdGlvbl9saXN0IFJDVVJMWSENCi0JOw0KLQ0KLWRlZmluaXRpb25fbGlzdA0KLQk6ICAgKGRlZmluaXRpb24pKw0KLQk7DQotDQotaW50ZXJmDQotCTogICAoICJhYnN0cmFjdCIgfCAibG9jYWwiICk/DQotCSAgICAiaW50ZXJmYWNlIl4NCi0JICAgIGlkZW50aWZpZXINCi0JICAgIC8vIGludGVyZmFjZV9uYW1lX2RjbA0KLQkgICAgKCAgIGludGVyZmFjZV9kY2wNCi0JICAgIHwgICAvLyBmb3J3YXJkX2RjbA0KLQkgICAgKQ0KLQk7DQotDQotaW50ZXJmYWNlX2RjbA0KLQk6ICAgaW50ZXJmYWNlX2hlYWRlcg0KLQkgICAgTENVUkxZISBpbnRlcmZhY2VfYm9keSBSQ1VSTFkhDQotCTsNCi0NCi0vLyBmb3J3YXJkX2RjbA0KLS8vIAk6ICAgLy8gaW50ZXJmYWNlX25hbWVfZGNsDQotLy8gCTsNCi0NCi0vLyBpbnRlcmZhY2VfbmFtZV9kY2wNCi0vLyAJOiAgICggImFic3RyYWN0IiB8ICJsb2NhbCIgKT8NCi0vLyAJICAgICJpbnRlcmZhY2UiXg0KLS8vIAkgICAgaWRlbnRpZmllcg0KLS8vIAk7DQotDQotaW50ZXJmYWNlX2hlYWRlcg0KLQk6ICAgLy8gaW50ZXJmYWNlX25hbWVfZGNsDQotCSAgICAoIGludGVyZmFjZV9pbmhlcml0YW5jZV9zcGVjICk/DQotCTsNCi0NCi1pbnRlcmZhY2VfYm9keQ0KLQk6ICAgKCBleHBvcnQgKSoNCi0JOw0KLQ0KLWV4cG9ydA0KLQk6ICAgKCAgIHR5cGVfZGNsIFNFTUkhDQotCSAgICB8ICAgY29uc3RfZGNsIFNFTUkhDQotCSAgICB8ICAgZXhjZXB0X2RjbCBTRU1JIQ0KLQkgICAgfCAgIGF0dHJfZGNsIFNFTUkhDQotCSAgICB8ICAgb3BfZGNsIFNFTUkhDQotCSAgICB8ICAgdHlwZV9pZF9kY2wgU0VNSSENCi0JICAgIHwgICB0eXBlX3ByZWZpeF9kY2wgU0VNSSENCi0JICAgIHwgICBQUkVQUk9DX0RJUkVDVElWRQ0KLQkgICAgKQ0KLQk7DQotDQotDQotaW50ZXJmYWNlX2luaGVyaXRhbmNlX3NwZWMNCi0JOiAgIENPTE9OXiBzY29wZWRfbmFtZV9saXN0DQotCTsNCi0NCi1pbnRlcmZhY2VfbmFtZQ0KLQk6ICAgc2NvcGVkX25hbWUNCi0JOw0KLQ0KLXNjb3BlZF9uYW1lX2xpc3QNCi0JOiAgICBzY29wZWRfbmFtZSAoQ09NTUEhIHNjb3BlZF9uYW1lKSoNCi0JOw0KLQ0KLQ0KLXNjb3BlZF9uYW1lDQotCTogICAoIFNDT1BFT1BeICk/IElERU5UXiAvKiBpZGVudGlmaWVyICovIChTQ09QRU9QISBpZGVudGlmaWVyKSoNCi0JOw0KLQ0KLS8qdmFsdWUNCi0JOiAgICggdmFsdWVfZGNsKQ0KLQk7Ki8NCi0NCi12YWx1ZQ0KLQk6ICAgKCB2YWx1ZV9kY2wNCi0JICAgIHwgdmFsdWVfYWJzX2RjbA0KLQkgICAgfCB2YWx1ZV9ib3hfZGNsDQotCSAgICB8IHZhbHVlX2N1c3RvbV9kY2wNCi0JICAgIHwgdmFsdWVfZm9yd2FyZF9kY2wNCi0JICAgICkNCi0JOw0KLQ0KLXZhbHVlX2ZvcndhcmRfZGNsDQotCTogICAidmFsdWV0eXBlIl4NCi0JICAgIGlkZW50aWZpZXINCi0JOw0KLQ0KLXZhbHVlX2JveF9kY2wNCi0JOiAgICJ2YWx1ZXR5cGUiXg0KLQkgICAgaWRlbnRpZmllcg0KLQkgICAgdHlwZV9zcGVjDQotCTsNCi0NCi12YWx1ZV9hYnNfZGNsDQotCTogICAiYWJzdHJhY3QiDQotCSAgICAidmFsdWV0eXBlIl4NCi0JICAgIGlkZW50aWZpZXINCi0JICAgICggdmFsdWVfYWJzX2Z1bGxfZGNsDQotCSAgICB8IC8vIHZhbHVlX2Fic19mb3J3YXJkX2RjbA0KLQkgICAgKQ0KLQk7DQotDQotdmFsdWVfYWJzX2Z1bGxfZGNsDQotCTogICB2YWx1ZV9pbmhlcml0YW5jZV9zcGVjDQotCSAgICBMQ1VSTFkhICggZXhwb3J0ICkqIFJDVVJMWSENCi0JOw0KLQ0KLS8vIHZhbHVlX2Fic19mb3J3YXJkX2RjbA0KLS8vIAk6DQotLy8gCTsNCi0NCi12YWx1ZV9kY2wNCi0JOiAgICJ2YWx1ZXR5cGUiXg0KLQkgICAgaWRlbnRpZmllcg0KLQkgICAgdmFsdWVfaW5oZXJpdGFuY2Vfc3BlYw0KLQkgICAgTENVUkxZISAodmFsdWVfZWxlbWVudCkqIFJDVVJMWSENCi0JOw0KLQ0KLS8qdmFsdWVfZGNsDQotCTogICB2YWx1ZV9oZWFkZXINCi0JICAgIExDVVJMWSEgKCB2YWx1ZV9lbGVtZW50ICkqIFJDVVJMWSENCi0JOw0KLSovDQotdmFsdWVfY3VzdG9tX2RjbA0KLQk6ICAgImN1c3RvbSJeDQotCSAgICB2YWx1ZV9kY2wNCi0JOw0KLQ0KLS8qdmFsdWVfaGVhZGVyDQotCTogICAidmFsdWV0eXBlIl4NCi0JICAgIGlkZW50aWZpZXINCi0JICAgIHZhbHVlX2luaGVyaXRhbmNlX3NwZWMNCi0JOw0KLSovDQotdmFsdWVfaW5oZXJpdGFuY2Vfc3BlYw0KLS8qDQotCTogICAoIENPTE9OICggInRydW5jYXRhYmxlIiApPw0KLQkgICAgICB2YWx1ZV9uYW1lICggQ09NTUEhIHZhbHVlX25hbWUgKSoNCi0JICAgICk/DQotCSAgICAoICJzdXBwb3J0cyIgaW50ZXJmYWNlX25hbWUgKCBDT01NQSEgaW50ZXJmYWNlX25hbWUgKSogKT8NCi0JOw0KLSovDQotCTogICAoIHZhbHVlX3ZhbHVlX2luaGVyaXRhbmNlX3NwZWMgKT8NCi0JICAgICggdmFsdWVfaW50ZXJmYWNlX2luaGVyaXRhbmNlX3NwZWMgKT8NCi0JOw0KLQ0KLXZhbHVlX3ZhbHVlX2luaGVyaXRhbmNlX3NwZWMNCi0JOiAgIENPTE9OXiAoICJ0cnVuY2F0YWJsZSIgKT8NCi0JICAgIHZhbHVlX25hbWUgKCBDT01NQSEgdmFsdWVfbmFtZSApKg0KLQk7DQotDQotdmFsdWVfaW50ZXJmYWNlX2luaGVyaXRhbmNlX3NwZWMNCi0JOiAgICJzdXBwb3J0cyJeIGludGVyZmFjZV9uYW1lICggQ09NTUEhIGludGVyZmFjZV9uYW1lICkqDQotCTsNCi0NCi12YWx1ZV9uYW1lDQotCTogICBzY29wZWRfbmFtZQ0KLQk7DQotDQotdmFsdWVfZWxlbWVudA0KLQk6ICAgKCBleHBvcnQNCi0JICAgIHwgc3RhdGVfbWVtYmVyDQotCSAgICB8IGluaXRfZGNsDQotCSAgICApDQotCTsNCi0NCi1zdGF0ZV9tZW1iZXINCi0JOiAgICggInB1YmxpYyIgfCAicHJpdmF0ZSIgKQ0KLQkgICAgdHlwZV9zcGVjIGRlY2xhcmF0b3JzIFNFTUkhDQotCTsNCi0NCi1pbml0X2RjbA0KLQk6ICAgImZhY3RvcnkiXiBpZGVudGlmaWVyDQotCSAgICBMUEFSRU4hIChpbml0X3BhcmFtX2RlY2xzKT8gUlBBUkVOIQ0KLQkgICAgKHJhaXNlc19leHByKT8NCi0JICAgIFNFTUkhDQotCTsNCi0NCi1pbml0X3BhcmFtX2RlY2xzDQotCTogICBpbml0X3BhcmFtX2RlY2wgKCBDT01NQSEgaW5pdF9wYXJhbV9kZWNsICkqDQotCTsNCi0NCi1pbml0X3BhcmFtX2RlY2wNCi0JOiAgIGluaXRfcGFyYW1fYXR0cmlidXRlDQotCSAgICBwYXJhbV90eXBlX3NwZWMNCi0JICAgIHNpbXBsZV9kZWNsYXJhdG9yDQotCTsNCi0NCi1pbml0X3BhcmFtX2F0dHJpYnV0ZQ0KLQk6ICAgImluIg0KLQk7DQotDQotY29uc3RfZGNsDQotCTogICAiY29uc3QiXiBjb25zdF90eXBlIGlkZW50aWZpZXIgQVNTSUdOISBjb25zdF9leHANCi0JOw0KLQ0KLWNvbnN0X3R5cGUNCi0JOiAgIChpbnRlZ2VyX3R5cGUpID0+IGludGVnZXJfdHlwZQ0KLQl8ICAgY2hhcl90eXBlDQotCXwgICB3aWRlX2NoYXJfdHlwZQ0KLQl8ICAgYm9vbGVhbl90eXBlDQotCXwgICBmbG9hdGluZ19wdF90eXBlDQotCXwgICBzdHJpbmdfdHlwZQ0KLQl8ICAgd2lkZV9zdHJpbmdfdHlwZQ0KLQl8ICAgZml4ZWRfcHRfY29uc3RfdHlwZQ0KLQl8ICAgc2NvcGVkX25hbWUNCi0JfCAgIG9jdGV0X3R5cGUNCi0JOw0KLQ0KLQ0KLS8qICAgRVhQUkVTU0lPTlMgICAqLw0KLQ0KLWNvbnN0X2V4cA0KLQk6ICAgb3JfZXhwcg0KLQk7DQotDQotb3JfZXhwcg0KLQk6ICAgeG9yX2V4cHINCi0JICAgICggT1JeIC8vIG9yX29wDQotCSAgICAgIHhvcl9leHByDQotCSAgICApKg0KLQk7DQotDQotLy8gb3Jfb3ANCi0vLyAJOiAgICBPUg0KLS8vIAk7DQotDQotDQoteG9yX2V4cHINCi0JOiAgIGFuZF9leHByDQotCSAgICAoIFhPUl4gLy8geG9yX29wDQotCSAgICAgIGFuZF9leHByDQotCSAgICApKg0KLQk7DQotDQotLy8geG9yX29wDQotLy8gCTogICAgWE9SDQotLy8gCTsNCi0NCi1hbmRfZXhwcg0KLQk6ICAgc2hpZnRfZXhwcg0KLQkgICAgKCBBTkReIC8vIGFuZF9vcA0KLQkgICAgICBzaGlmdF9leHByDQotCSAgICApKg0KLQk7DQotDQotLy8gYW5kX29wDQotLy8gCTogICAgQU5EDQotLy8gCTsNCi0NCi0NCi1zaGlmdF9leHByDQotCTogICBhZGRfZXhwcg0KLQkgICAgKCAoIExTSElGVF4NCi0JICAgICAgfCBSU0hJRlReDQotCSAgICAgICkgLy8gc2hpZnRfb3ANCi0JICAgIGFkZF9leHByDQotCSAgICApKg0KLQk7DQotDQotLy8gc2hpZnRfb3ANCi0vLyAJOiAgICBMU0hJRlQNCi0vLyAJfCAgICBSU0hJRlQNCi0vLyAJOw0KLQ0KLQ0KLWFkZF9leHByDQotCTogICBtdWx0X2V4cHINCi0JICAgICggKCBQTFVTXg0KLQkgICAgICB8IE1JTlVTXg0KLQkgICAgICApIC8vIGFkZF9vcA0KLQkgICAgICBtdWx0X2V4cHINCi0JICAgICkqDQotCTsNCi0NCi0vLyBhZGRfb3ANCi0vLyAJOiAgICBQTFVTDQotLy8gCXwgICAgTUlOVVMNCi0vLyAJOw0KLQ0KLW11bHRfZXhwcg0KLQk6ICAgdW5hcnlfZXhwcg0KLQkgICAgKCAoIFNUQVJeDQotCSAgICAgIHwgRElWXg0KLQkgICAgICB8IE1PRF4NCi0JICAgICAgKSAvLyBtdWx0X29wDQotCSAgICAgIHVuYXJ5X2V4cHINCi0JICAgICkqDQotCTsNCi0NCi0vLyBtdWx0X29wDQotLy8gCTogICAgU1RBUg0KLS8vIAl8ICAgIERJVg0KLS8vIAl8ICAgIE1PRA0KLS8vIAk7DQotDQotdW5hcnlfZXhwcg0KLQk6ICAgKCBNSU5VU14NCi0JICAgIHwgUExVU14NCi0JICAgIHwgVElMREVeDQotCSAgICApIC8vIHVuYXJ5X29wZXJhdG9yDQotCSAgICBwcmltYXJ5X2V4cHINCi0JfCAgIHByaW1hcnlfZXhwcg0KLQk7DQotDQotLy8gdW5hcnlfb3BlcmF0b3INCi0vLyAJOiAgIE1JTlVTDQotLy8gCXwgICBQTFVTDQotLy8gCXwgICBUSUxERQ0KLS8vIAk7DQotDQotLy8gTm9kZSBvZiB0eXBlIFRQcmltYXJ5RXhwIHNlcnZlcyB0byBhdm9pZCBpbmYuIHJlY3Vyc2lvbiBvbiB0cmVlIHBhcnNlDQotcHJpbWFyeV9leHByDQotCTogICBzY29wZWRfbmFtZQ0KLQl8ICAgbGl0ZXJhbA0KLQl8ICAgTFBBUkVOXiBjb25zdF9leHAgUlBBUkVODQotCTsNCi0NCi1saXRlcmFsDQotCTogICBpbnRlZ2VyX2xpdGVyYWwNCi0JfCAgIHN0cmluZ19saXRlcmFsDQotCXwgICB3aWRlX3N0cmluZ19saXRlcmFsDQotCXwgICBjaGFyYWN0ZXJfbGl0ZXJhbA0KLQl8ICAgd2lkZV9jaGFyYWN0ZXJfbGl0ZXJhbA0KLQl8ICAgZml4ZWRfcHRfbGl0ZXJhbA0KLQl8ICAgZmxvYXRpbmdfcHRfbGl0ZXJhbA0KLQl8ICAgYm9vbGVhbl9saXRlcmFsDQotCTsNCi0NCi1ib29sZWFuX2xpdGVyYWwNCi0JOiAgICJUUlVFIg0KLQl8ICAgIkZBTFNFIg0KLQk7DQotDQotcG9zaXRpdmVfaW50X2NvbnN0DQotCTogICAgY29uc3RfZXhwDQotCTsNCi0NCi0NCi10eXBlX2RjbA0KLQk6ICAgInR5cGVkZWYiXiB0eXBlX2RlY2xhcmF0b3INCi0JfCAgIChzdHJ1Y3RfdHlwZSkgPT4gc3RydWN0X3R5cGUNCi0JfCAgICh1bmlvbl90eXBlKSA9PiB1bmlvbl90eXBlDQotCXwgICBlbnVtX3R5cGUNCi0JfCAgICJuYXRpdmUiXiBzaW1wbGVfZGVjbGFyYXRvcg0KLQl8ICAgY29uc3RyX2ZvcndhcmRfZGVjbA0KLQk7DQotDQotdHlwZV9kZWNsYXJhdG9yDQotCTogICB0eXBlX3NwZWMgZGVjbGFyYXRvcnMNCi0JOw0KLQ0KLXR5cGVfc3BlYw0KLQk6ICAgc2ltcGxlX3R5cGVfc3BlYw0KLQl8ICAgY29uc3RyX3R5cGVfc3BlYw0KLQk7DQotDQotc2ltcGxlX3R5cGVfc3BlYw0KLQk6ICAgYmFzZV90eXBlX3NwZWMNCi0JfCAgIHRlbXBsYXRlX3R5cGVfc3BlYw0KLQl8ICAgc2NvcGVkX25hbWUNCi0JOw0KLQ0KLWJhc2VfdHlwZV9zcGVjDQotCTogICAoZmxvYXRpbmdfcHRfdHlwZSkgPT4gZmxvYXRpbmdfcHRfdHlwZQkNCi0JfCAgIGludGVnZXJfdHlwZQkNCi0JfCAgIGNoYXJfdHlwZQkJDQotCXwgICB3aWRlX2NoYXJfdHlwZQkJDQotCXwgICBib29sZWFuX3R5cGUJDQotCXwgICBvY3RldF90eXBlDQotCXwgICBhbnlfdHlwZQ0KLQl8ICAgb2JqZWN0X3R5cGUNCi0JfCAgIHZhbHVlX2Jhc2VfdHlwZQ0KLQk7DQotDQotdGVtcGxhdGVfdHlwZV9zcGVjDQotCTogICBzZXF1ZW5jZV90eXBlDQotCXwgICBzdHJpbmdfdHlwZQ0KLQl8ICAgd2lkZV9zdHJpbmdfdHlwZQ0KLQl8ICAgZml4ZWRfcHRfdHlwZQ0KLQk7DQotDQotY29uc3RyX3R5cGVfc3BlYw0KLQk6ICAgc3RydWN0X3R5cGUNCi0JfCAgIHVuaW9uX3R5cGUNCi0JfCAgIGVudW1fdHlwZQ0KLQk7DQotDQotZGVjbGFyYXRvcnMNCi0JOiAgIGRlY2xhcmF0b3IgKENPTU1BISBkZWNsYXJhdG9yKSoNCi0JOw0KLQ0KLWRlY2xhcmF0b3INCi0JOiAgIHNpbXBsZV9kZWNsYXJhdG9yDQotCXwgICBjb21wbGV4X2RlY2xhcmF0b3INCi0JOw0KLQ0KLXNpbXBsZV9kZWNsYXJhdG9yDQotCTogICBpZGVudGlmaWVyDQotCTsNCi0NCi1jb21wbGV4X2RlY2xhcmF0b3INCi0JOiAgIGFycmF5X2RlY2xhcmF0b3INCi0JOw0KLQ0KLWZsb2F0aW5nX3B0X3R5cGUNCi0JOiAgICJmbG9hdCINCi0JfCAgICJkb3VibGUiDQotCXwgICAibG9uZyJeICJkb3VibGUiDQotCTsNCi0NCi1pbnRlZ2VyX3R5cGUNCi0JOiAgc2lnbmVkX2ludA0KLQl8ICB1bnNpZ25lZF9pbnQNCi0JOw0KLQ0KLXNpZ25lZF9pbnQNCi0JOiAgc2lnbmVkX3Nob3J0X2ludA0KLQl8ICBzaWduZWRfbG9uZ19pbnQNCi0JfCAgc2lnbmVkX2xvbmdsb25nX2ludA0KLQk7DQotDQotc2lnbmVkX3Nob3J0X2ludA0KLQk6ICAic2hvcnQiDQotCTsNCi0NCi1zaWduZWRfbG9uZ19pbnQNCi0JOiAgImxvbmciDQotCTsNCi0NCi1zaWduZWRfbG9uZ2xvbmdfaW50DQotCTogICJsb25nIiAibG9uZyINCi0JOw0KLQ0KLXVuc2lnbmVkX2ludA0KLQk6ICB1bnNpZ25lZF9zaG9ydF9pbnQNCi0JfCAgdW5zaWduZWRfbG9uZ19pbnQNCi0JfCAgdW5zaWduZWRfbG9uZ2xvbmdfaW50DQotCTsNCi0NCi11bnNpZ25lZF9zaG9ydF9pbnQNCi0JOiAgInVuc2lnbmVkIiAic2hvcnQiDQotCTsNCi0NCi11bnNpZ25lZF9sb25nX2ludA0KLQk6ICAidW5zaWduZWQiICJsb25nIg0KLQk7DQotDQotdW5zaWduZWRfbG9uZ2xvbmdfaW50DQotCTogICJ1bnNpZ25lZCIgImxvbmciICJsb25nIg0KLQk7DQotDQotY2hhcl90eXBlDQotCTogICAiY2hhciINCi0JOw0KLQ0KLXdpZGVfY2hhcl90eXBlDQotCTogICAid2NoYXIiDQotCTsNCi0NCi1ib29sZWFuX3R5cGUNCi0JOiAgICJib29sZWFuIg0KLQk7DQotDQotb2N0ZXRfdHlwZQ0KLQk6ICAgIm9jdGV0Ig0KLQk7DQotDQotYW55X3R5cGUNCi0JOiAgICJhbnkiDQotCTsNCi0NCi1vYmplY3RfdHlwZQ0KLQk6ICAgIk9iamVjdCINCi0JOw0KLQ0KLXN0cnVjdF90eXBlDQotCTogICAic3RydWN0Il4NCi0JICAgIGlkZW50aWZpZXINCi0JICAgIExDVVJMWSEgbWVtYmVyX2xpc3QgUkNVUkxZIQ0KLQk7DQotDQotbWVtYmVyX2xpc3QNCi0JOiAgIChtZW1iZXIpKw0KLQk7DQotDQotbWVtYmVyDQotCTogICB0eXBlX3NwZWMgZGVjbGFyYXRvcnMgU0VNSSENCi0JOw0KLQ0KLXVuaW9uX3R5cGUNCi0JOiAgICJ1bmlvbiJeDQotCSAgICBpZGVudGlmaWVyDQotCSAgICAic3dpdGNoIiEgTFBBUkVOISBzd2l0Y2hfdHlwZV9zcGVjIFJQQVJFTiENCi0JICAgIExDVVJMWSEgc3dpdGNoX2JvZHkgUkNVUkxZIQ0KLQk7DQotDQotc3dpdGNoX3R5cGVfc3BlYw0KLQk6ICAgaW50ZWdlcl90eXBlDQotCXwgICBjaGFyX3R5cGUNCi0JfCAgIGJvb2xlYW5fdHlwZQ0KLQl8ICAgZW51bV90eXBlDQotCXwgICBzY29wZWRfbmFtZQ0KLQk7DQotDQotc3dpdGNoX2JvZHkNCi0JOiAgIGNhc2Vfc3RtdF9saXN0DQotCTsNCi0NCi1jYXNlX3N0bXRfbGlzdA0KLQk6ICAoY2FzZV9zdG10KSsNCi0JOw0KLQ0KLWNhc2Vfc3RtdA0KLQk6ICAgLy8gY2FzZV9sYWJlbF9saXN0DQotCSAgICAoICJjYXNlIl4gY29uc3RfZXhwIENPTE9OIQ0KLQkgICAgfCAiZGVmYXVsdCJeIENPTE9OIQ0KLQkgICAgKSsNCi0JICAgIGVsZW1lbnRfc3BlYyBTRU1JIQ0KLQk7DQotDQotLy8gY2FzZV9sYWJlbF9saXN0DQotLy8gCTogICAoY2FzZV9sYWJlbCkrDQotLy8gCTsNCi0NCi0NCi0vLyBjYXNlX2xhYmVsDQotLy8gCTogICAiY2FzZSJeIGNvbnN0X2V4cCBDT0xPTiENCi0vLyAJfCAgICJkZWZhdWx0Il4gQ09MT04hDQotLy8gCTsNCi0NCi1lbGVtZW50X3NwZWMNCi0JOiAgIHR5cGVfc3BlYyBkZWNsYXJhdG9yDQotCTsNCi0NCi1lbnVtX3R5cGUNCi0JOiAgICJlbnVtIl4gaWRlbnRpZmllciBMQ1VSTFkhIGVudW1lcmF0b3JfbGlzdCBSQ1VSTFkhDQotCTsNCi0NCi1lbnVtZXJhdG9yX2xpc3QNCi0JOiAgICBlbnVtZXJhdG9yIChDT01NQSEgZW51bWVyYXRvcikqDQotCTsNCi0NCi1lbnVtZXJhdG9yDQotCTogICBpZGVudGlmaWVyDQotCTsNCi0NCi1zZXF1ZW5jZV90eXBlDQotCTogICAic2VxdWVuY2UiXg0KLQkgICAgIExUISBzaW1wbGVfdHlwZV9zcGVjIG9wdF9wb3NfaW50IEdUIQ0KLQk7DQotDQotb3B0X3Bvc19pbnQNCi0JOiAgICAoQ09NTUEhIHBvc2l0aXZlX2ludF9jb25zdCk/DQotCTsNCi0NCi1zdHJpbmdfdHlwZQ0KLQk6ICAgInN0cmluZyJeIChMVCEgcG9zaXRpdmVfaW50X2NvbnN0IEdUISk/DQotCTsNCi0NCi13aWRlX3N0cmluZ190eXBlDQotCTogICAid3N0cmluZyJeIChMVCEgcG9zaXRpdmVfaW50X2NvbnN0IEdUISk/DQotCTsNCi0NCi1hcnJheV9kZWNsYXJhdG9yDQotCTogICBJREVOVF4JCQkJCS8vIGlkZW50aWZpZXINCi0JICAgIChmaXhlZF9hcnJheV9zaXplKSsNCi0JOw0KLQ0KLWZpeGVkX2FycmF5X3NpemUNCi0JOiAgIExCUkFDSyEgcG9zaXRpdmVfaW50X2NvbnN0IFJCUkFDSyENCi0JOw0KLQ0KLWF0dHJfZGNsDQotCTogICByZWFkb25seV9hdHRyX3NwZWMNCi0JfCAgIGF0dHJfc3BlYw0KLQk7DQotDQotZXhjZXB0X2RjbA0KLQk6ICAgImV4Y2VwdGlvbiJeDQotCSAgICBpZGVudGlmaWVyDQotCSAgICBMQ1VSTFkhIG9wdF9tZW1iZXJfbGlzdCBSQ1VSTFkhDQotCTsNCi0NCi0NCi1vcHRfbWVtYmVyX2xpc3QNCi0JOiAgICAobWVtYmVyKSoNCi0JOw0KLQ0KLW9wX2RjbA0KLQk6ICAgKG9wX2F0dHJpYnV0ZSk/DQotCSAgICBvcF90eXBlX3NwZWMNCi0JICAgIElERU5UXgkJCQkvLyBpZGVudGlmaWVyDQotCSAgICBwYXJhbWV0ZXJfZGNscw0KLQkgICAgKHJhaXNlc19leHByKT8NCi0JICAgIChjb250ZXh0X2V4cHIpPw0KLQk7DQotDQotb3BfYXR0cmlidXRlDQotCTogICAib25ld2F5Ig0KLQk7DQotDQotb3BfdHlwZV9zcGVjDQotCTogICBwYXJhbV90eXBlX3NwZWMNCi0JfCAgICJ2b2lkIg0KLQk7DQotDQotcGFyYW1ldGVyX2RjbHMNCi0JOiAgIExQQVJFTiEgKHBhcmFtX2RjbF9saXN0KT8gUlBBUkVOIQ0KLQk7DQotDQotcGFyYW1fZGNsX2xpc3QNCi0JOiAgIHBhcmFtX2RjbCAoQ09NTUEhIHBhcmFtX2RjbCkqDQotCTsNCi0NCi1wYXJhbV9kY2wNCi0JOiAgICgiaW4iXiB8ICJvdXQiXiB8ICJpbm91dCJeKQkJLy8gcGFyYW1fYXR0cmlidXRlDQotCSAgICBwYXJhbV90eXBlX3NwZWMgc2ltcGxlX2RlY2xhcmF0b3INCi0JOw0KLQ0KLS8vIHBhcmFtX2F0dHJpYnV0ZQ0KLS8vIAk6ICAgImluIg0KLS8vIAl8ICAgIm91dCINCi0vLyAJfCAgICJpbm91dCINCi0vLyAJOw0KLQ0KLXJhaXNlc19leHByDQotCTogICAicmFpc2VzIl4gTFBBUkVOISBzY29wZWRfbmFtZV9saXN0IFJQQVJFTiENCi0JOw0KLQ0KLWNvbnRleHRfZXhwcg0KLQk6ICAgImNvbnRleHQiXiBMUEFSRU4hIHN0cmluZ19saXRlcmFsX2xpc3QgUlBBUkVOIQ0KLQk7DQotDQotc3RyaW5nX2xpdGVyYWxfbGlzdA0KLQk6ICAgIHN0cmluZ19saXRlcmFsIChDT01NQSEgc3RyaW5nX2xpdGVyYWwpKg0KLQk7DQotDQotcGFyYW1fdHlwZV9zcGVjDQotCTogICBiYXNlX3R5cGVfc3BlYw0KLQl8ICAgc3RyaW5nX3R5cGUNCi0JfCAgIHdpZGVfc3RyaW5nX3R5cGUNCi0JfCAgIHNjb3BlZF9uYW1lDQotCTsNCi0NCi1maXhlZF9wdF90eXBlDQotCTogICAiZml4ZWQiXiBMVCEgcG9zaXRpdmVfaW50X2NvbnN0IENPTU1BISBwb3NpdGl2ZV9pbnRfY29uc3QgR1QhDQotCTsNCi0NCi1maXhlZF9wdF9jb25zdF90eXBlDQotCTogICAiZml4ZWQiDQotCTsNCi0NCi12YWx1ZV9iYXNlX3R5cGUNCi0JOiAgICJWYWx1ZUJhc2UiDQotCTsNCi0NCi1jb25zdHJfZm9yd2FyZF9kZWNsDQotCTogICAic3RydWN0Il4gaWRlbnRpZmllcg0KLQl8ICAgInVuaW9uIl4gaWRlbnRpZmllcg0KLQk7DQotDQotaW1wb3J0X2RjbA0KLQk6ICAgImltcG9ydCJeIGltcG9ydGVkX3Njb3BlIFNFTUkhDQotCTsNCi0NCi1pbXBvcnRlZF9zY29wZQ0KLQk6ICAgc2NvcGVkX25hbWUNCi0JfCAgIHN0cmluZ19saXRlcmFsDQotCTsNCi0NCi10eXBlX2lkX2RjbA0KLQk6ICAgInR5cGVpZCJeDQotCSAgICBzY29wZWRfbmFtZQ0KLQkgICAgc3RyaW5nX2xpdGVyYWwNCi0JOw0KLQ0KLXR5cGVfcHJlZml4X2RjbA0KLQk6ICAgInR5cGVwcmVmaXgiXg0KLQkgICAgc2NvcGVkX25hbWUNCi0JICAgIHN0cmluZ19saXRlcmFsDQotCTsNCi0NCi1yZWFkb25seV9hdHRyX3NwZWMNCi0JOiAgICJyZWFkb25seSIgImF0dHJpYnV0ZSJeDQotCSAgICBwYXJhbV90eXBlX3NwZWMNCi0JICAgIHJlYWRvbmx5X2F0dHJfZGVjbGFyYXRvcg0KLQk7DQotDQotcmVhZG9ubHlfYXR0cl9kZWNsYXJhdG9yDQotCTogICBzaW1wbGVfZGVjbGFyYXRvcg0KLQkgICAgKCByYWlzZXNfZXhwcg0KLQkgICAgfCAoQ09NTUEhIHNpbXBsZV9kZWNsYXJhdG9yKSoNCi0JICAgICkNCi0JOw0KLQ0KLWF0dHJfc3BlYw0KLQk6ICAgImF0dHJpYnV0ZSJeIHBhcmFtX3R5cGVfc3BlYyBhdHRyX2RlY2xhcmF0b3INCi0JOw0KLQ0KLWF0dHJfZGVjbGFyYXRvcg0KLQk6ICAgc2ltcGxlX2RlY2xhcmF0b3INCi0JICAgICggKCJnZXRyYWlzZXMiIHwgInNldHJhaXNlcyIpID0+IGF0dHJfcmFpc2VzX2V4cHINCi0JICAgIHwgKENPTU1BISBzaW1wbGVfZGVjbGFyYXRvcikqDQotCSAgICApDQotCTsNCi0NCi1hdHRyX3JhaXNlc19leHByDQotCTogICAoZ2V0X2V4Y2VwX2V4cHIpPw0KLQkgICAgKHNldF9leGNlcF9leHByKT8NCi0JOw0KLQ0KLWdldF9leGNlcF9leHByDQotCTogICAiZ2V0cmFpc2VzIl4gZXhjZXB0aW9uX2xpc3QNCi0JOw0KLQ0KLXNldF9leGNlcF9leHByDQotCTogICAic2V0cmFpc2VzIl4gZXhjZXB0aW9uX2xpc3QNCi0JOw0KLQ0KLWV4Y2VwdGlvbl9saXN0DQotCTogICBMUEFSRU4hIHNjb3BlZF9uYW1lIChDT01NQSEgc2NvcGVkX25hbWUpKiBSUEFSRU4hDQotCTsNCi0NCi0vLyBDb21wb25lbnQgU3R1ZmYNCi0NCi1jb21wb25lbnQNCi0JOiAgICJjb21wb25lbnQiXg0KLQkgICAgaWRlbnRpZmllcg0KLQkgICAgKGNvbXBvbmVudF9kY2wpPw0KLQk7DQotDQotY29tcG9uZW50X2RjbA0KLQk6ICAgKGNvbXBvbmVudF9pbmhlcml0YW5jZV9zcGVjKT8NCi0JICAgIChzdXBwb3J0ZWRfaW50ZXJmYWNlX3NwZWMpPw0KLQkgICAgTENVUkxZISBjb21wb25lbnRfYm9keSBSQ1VSTFkhDQotCTsNCi0NCi1zdXBwb3J0ZWRfaW50ZXJmYWNlX3NwZWMNCi0JOiAgICJzdXBwb3J0cyJeIHNjb3BlZF9uYW1lICggQ09NTUEhIHNjb3BlZF9uYW1lICkqDQotCTsNCi0NCi1jb21wb25lbnRfaW5oZXJpdGFuY2Vfc3BlYw0KLQk6ICAgQ09MT05eIHNjb3BlZF9uYW1lDQotCTsNCi0NCi1jb21wb25lbnRfYm9keQ0KLQk6ICAgKGNvbXBvbmVudF9leHBvcnQpKg0KLQk7DQotDQotY29tcG9uZW50X2V4cG9ydA0KLQk6ICAgKCBwcm92aWRlc19kY2wgU0VNSSENCi0JICAgIHwgdXNlc19kY2wgU0VNSSENCi0JICAgIHwgZW1pdHNfZGNsIFNFTUkhDQotCSAgICB8IHB1Ymxpc2hlc19kY2wgU0VNSSENCi0JICAgIHwgY29uc3VtZXNfZGNsIFNFTUkhDQotCSAgICB8IGF0dHJfZGNsIFNFTUkhDQotCSAgICApDQotCTsNCi0NCi1wcm92aWRlc19kY2wNCi0JOiAgICJwcm92aWRlcyJeIGludGVyZmFjZV90eXBlIGlkZW50aWZpZXINCi0JOw0KLQ0KLWludGVyZmFjZV90eXBlDQotCTogICAoIHNjb3BlZF9uYW1lDQotCSAgICB8ICJPYmplY3QiDQotCSAgICApDQotCTsNCi0NCi11c2VzX2RjbA0KLQk6ICAgInVzZXMiXiAoIm11bHRpcGxlIik/IGludGVyZmFjZV90eXBlIGlkZW50aWZpZXINCi0JOw0KLQ0KLWVtaXRzX2RjbA0KLQk6ICAgImVtaXRzIl4gc2NvcGVkX25hbWUgaWRlbnRpZmllcg0KLQk7DQotDQotcHVibGlzaGVzX2RjbA0KLQk6ICAgInB1Ymxpc2hlcyJeIHNjb3BlZF9uYW1lIGlkZW50aWZpZXINCi0JOw0KLQ0KLWNvbnN1bWVzX2RjbA0KLQk6ICAgImNvbnN1bWVzIl4gc2NvcGVkX25hbWUgaWRlbnRpZmllcg0KLQk7DQotDQotaG9tZV9kY2wNCi0JOiAgIGhvbWVfaGVhZGVyIGhvbWVfYm9keQ0KLQk7DQotDQotaG9tZV9oZWFkZXINCi0JOiAgICJob21lIl4gaWRlbnRpZmllcg0KLQkgICAgKGhvbWVfaW5oZXJpdGFuY2Vfc3BlYyk/DQotCSAgICAoc3VwcG9ydGVkX2ludGVyZmFjZV9zcGVjKT8NCi0JICAgICJtYW5hZ2VzIiEgc2NvcGVkX25hbWUNCi0JICAgIChwcmltYXJ5X2tleV9zcGVjKT8NCi0JOw0KLQ0KLWhvbWVfaW5oZXJpdGFuY2Vfc3BlYw0KLQk6ICAgQ09MT05eIHNjb3BlZF9uYW1lDQotCTsNCi0NCi1wcmltYXJ5X2tleV9zcGVjDQotCTogICAicHJpbWFyeWtleSJeIHNjb3BlZF9uYW1lDQotCTsNCi0NCi1ob21lX2JvZHkNCi0JOiAgIExDVVJMWSEgKGhvbWVfZXhwb3J0KSogUkNVUkxZIQ0KLQk7DQotDQotaG9tZV9leHBvcnQNCi0JOiAgICggZXhwb3J0DQotCSAgICB8IGZhY3RvcnlfZGNsIFNFTUkhDQotCSAgICB8IGZpbmRlcl9kY2wgU0VNSSENCi0JICAgICkNCi0JOw0KLQ0KLWZhY3RvcnlfZGNsDQotCTogICAiZmFjdG9yeSJeIGlkZW50aWZpZXINCi0JICAgIExQQVJFTiEgaW5pdF9wYXJhbV9kZWNscyBSUEFSRU4hDQotCSAgICAocmFpc2VzX2V4cHIpPw0KLQk7DQotDQotZmluZGVyX2RjbA0KLQk6ICAgImZpbmRlciJeIGlkZW50aWZpZXINCi0JICAgIExQQVJFTiEgaW5pdF9wYXJhbV9kZWNscyBSUEFSRU4hDQotCSAgICAocmFpc2VzX2V4cHIpPw0KLQk7DQotDQotZXZlbnQNCi0JOiAgICggZXZlbnRfYWJzDQotCSAgICB8IGV2ZW50X2N1c3RvbQ0KLQkgICAgfCBldmVudF9kY2wNCi0JICAgICkNCi0JOw0KLQ0KLWV2ZW50X2hlYWRlcg0KLQk6ICAgImV2ZW50dHlwZSJeDQotCSAgICBpZGVudGlmaWVyDQotCTsNCi0NCi1ldmVudF9hYnMNCi0JOiAgICJhYnN0cmFjdCJeDQotCSAgICBldmVudF9oZWFkZXINCi0JICAgIChldmVudF9hYnNfZGNsKT8NCi0JOw0KLQ0KLWV2ZW50X2Fic19kY2wNCi0JOiAgIHZhbHVlX2luaGVyaXRhbmNlX3NwZWMNCi0JICAgIExDVVJMWSEgKGV4cG9ydCkqIFJDVVJMWSENCi0JOw0KLQ0KLWV2ZW50X2N1c3RvbQ0KLQk6ICAgImN1c3RvbSJeDQotCSAgICBldmVudF9oZWFkZXINCi0JICAgIGV2ZW50X2VsZW1fZGNsDQotCTsNCi0NCi1ldmVudF9kY2wNCi0JOiAgIGV2ZW50X2hlYWRlcg0KLQkgICAgKCBldmVudF9lbGVtX2RjbA0KLQkgICAgfCAvLyBldmVudF9mb3J3YXJkX2RjbA0KLQkgICAgKQ0KLQk7DQotDQotZXZlbnRfZWxlbV9kY2wNCi0JOiAgIHZhbHVlX2luaGVyaXRhbmNlX3NwZWMNCi0JICAgIExDVVJMWSEgKGV4cG9ydCkqIFJDVVJMWSENCi0JOw0KLQ0KLS8vIGV2ZW50X2ZvcndhcmRfZGNsDQotLy8gCToNCi0vLyAJOw0KLQ0KLS8qIGxpdGVyYWxzICovDQotaW50ZWdlcl9saXRlcmFsDQotCTogICBJTlQNCi0JfCAgIE9DVEFMDQotCXwgICBIRVgNCi0JOw0KLQ0KLXN0cmluZ19saXRlcmFsDQotCTogIChTVFJJTkdfTElURVJBTCkrDQotCTsNCi0NCi13aWRlX3N0cmluZ19saXRlcmFsDQotCTogIChXSURFX1NUUklOR19MSVRFUkFMKSsNCi0JOw0KLQ0KLWNoYXJhY3Rlcl9saXRlcmFsDQotCTogIENIQVJfTElURVJBTA0KLQk7DQotDQotd2lkZV9jaGFyYWN0ZXJfbGl0ZXJhbA0KLQk6ICBXSURFX0NIQVJfTElURVJBTA0KLQk7DQotDQotZml4ZWRfcHRfbGl0ZXJhbA0KLQk6ICBGSVhFRA0KLQk7DQotDQotZmxvYXRpbmdfcHRfbGl0ZXJhbA0KLQk6ICAgZjpGTE9BVA0KLQk7DQotDQotaWRlbnRpZmllcg0KLQk6ICAgSURFTlQNCi0JOw0KLQ0KLS8qIElETCBMRVhJQ0FMIFJVTEVTICAqLw0KLWNsYXNzIElETExleGVyIGV4dGVuZHMgTGV4ZXI7DQotb3B0aW9ucyB7DQotCWV4cG9ydFZvY2FiPUlETDsNCi0JY2hhclZvY2FidWxhcnk9J1x1MDAwMCcuLidcdUZGRkUnOw0KLQlrPTQ7DQotfQ0KLQ0KLVNFTUkNCi1vcHRpb25zIHsNCi0gIHBhcmFwaHJhc2UgPSAiOyI7DQotfQ0KLQk6CSc7Jw0KLQk7DQotDQotUVVFU1RJT04NCi1vcHRpb25zIHsNCi0gIHBhcmFwaHJhc2UgPSAiPyI7DQotfQ0KLQk6CSc/Jw0KLQk7DQotDQotTFBBUkVODQotb3B0aW9ucyB7DQotICBwYXJhcGhyYXNlID0gIigiOw0KLX0NCi0JOgknKCcNCi0JOw0KLQ0KLVJQQVJFTg0KLW9wdGlvbnMgew0KLSAgcGFyYXBocmFzZSA9ICIpIjsNCi19DQotCToJJyknDQotCTsNCi0NCi1MQlJBQ0sNCi1vcHRpb25zIHsNCi0gIHBhcmFwaHJhc2UgPSAiWyI7DQotfQ0KLQk6CSdbJw0KLQk7DQotDQotUkJSQUNLDQotb3B0aW9ucyB7DQotICBwYXJhcGhyYXNlID0gIl0iOw0KLX0NCi0JOgknXScNCi0JOw0KLQ0KLUxDVVJMWQ0KLW9wdGlvbnMgew0KLSAgcGFyYXBocmFzZSA9ICJ7IjsNCi19DQotCToJJ3snDQotCTsNCi0NCi1SQ1VSTFkNCi1vcHRpb25zIHsNCi0gIHBhcmFwaHJhc2UgPSAifSI7DQotfQ0KLQk6CSd9Jw0KLQk7DQotDQotT1INCi1vcHRpb25zIHsNCi0gIHBhcmFwaHJhc2UgPSAifCI7DQotfQ0KLQk6CSd8Jw0KLQk7DQotDQotWE9SDQotb3B0aW9ucyB7DQotICBwYXJhcGhyYXNlID0gIl4iOw0KLX0NCi0JOgknXicNCi0JOw0KLQ0KLUFORA0KLW9wdGlvbnMgew0KLSAgcGFyYXBocmFzZSA9ICImIjsNCi19DQotCToJJyYnDQotCTsNCi0NCi1DT0xPTg0KLW9wdGlvbnMgew0KLSAgcGFyYXBocmFzZSA9ICI6IjsNCi19DQotCToJJzonDQotCTsNCi0NCi1DT01NQQ0KLW9wdGlvbnMgew0KLSAgcGFyYXBocmFzZSA9ICIsIjsNCi19DQotCToJJywnDQotCTsNCi0NCi1ET1QNCi1vcHRpb25zIHsNCi0gIHBhcmFwaHJhc2UgPSAiLiI7DQotfQ0KLQk6CScuJw0KLQk7DQotDQotQVNTSUdODQotb3B0aW9ucyB7DQotICBwYXJhcGhyYXNlID0gIj0iOw0KLX0NCi0JOgknPScNCi0JOw0KLQ0KLU5PVA0KLW9wdGlvbnMgew0KLSAgcGFyYXBocmFzZSA9ICIhIjsNCi19DQotCToJJyEnDQotCTsNCi0NCi1MVA0KLW9wdGlvbnMgew0KLSAgcGFyYXBocmFzZSA9ICI8IjsNCi19DQotCToJJzwnDQotCTsNCi0NCi1MU0hJRlQNCi1vcHRpb25zIHsNCi0gIHBhcmFwaHJhc2UgPSAiPDwiOw0KLX0NCi0JOiAiPDwiDQotCTsNCi0NCi1HVA0KLW9wdGlvbnMgew0KLSAgcGFyYXBocmFzZSA9ICI+IjsNCi19DQotCToJJz4nDQotCTsNCi0NCi1SU0hJRlQNCi1vcHRpb25zIHsNCi0gIHBhcmFwaHJhc2UgPSAiPj4iOw0KLX0NCi0JOiAiPj4iDQotCTsNCi0NCi1ESVYNCi1vcHRpb25zIHsNCi0gIHBhcmFwaHJhc2UgPSAiLyI7DQotfQ0KLQk6CScvJw0KLQk7DQotDQotUExVUw0KLW9wdGlvbnMgew0KLSAgcGFyYXBocmFzZSA9ICIrIjsNCi19DQotCToJJysnDQotCTsNCi0NCi1NSU5VUw0KLW9wdGlvbnMgew0KLSAgcGFyYXBocmFzZSA9ICItIjsNCi19DQotCToJJy0nDQotCTsNCi0NCi1USUxERQ0KLW9wdGlvbnMgew0KLSAgcGFyYXBocmFzZSA9ICJ+IjsNCi19DQotCToJJ34nDQotCTsNCi0NCi1TVEFSDQotb3B0aW9ucyB7DQotICBwYXJhcGhyYXNlID0gIioiOw0KLX0NCi0JOgknKicNCi0JOw0KLQ0KLU1PRA0KLW9wdGlvbnMgew0KLSAgcGFyYXBocmFzZSA9ICIlIjsNCi19DQotCToJJyUnDQotCTsNCi0NCi0NCi1TQ09QRU9QDQotb3B0aW9ucyB7DQotICBwYXJhcGhyYXNlID0gIjo6IjsNCi19DQotCTogIAkiOjoiDQotCTsNCi0NCi1XUw0KLW9wdGlvbnMgew0KLSAgcGFyYXBocmFzZSA9ICJ3aGl0ZSBzcGFjZSI7DQotfQ0KLQk6CSgnICcNCi0JfAknXHQnDQotCXwJJ1xuJyAgeyBuZXdsaW5lKCk7IH0NCi0JfAknXHInKQ0KLQkJeyAkc2V0VHlwZShUb2tlbi5TS0lQKTsgfQ0KLQk7DQotDQotDQotUFJFUFJPQ19ESVJFQ1RJVkUNCi1vcHRpb25zIHsNCi0gIHBhcmFwaHJhc2UgPSAiYSBwcmVwcm9jZXNzb3IgZGlyZWN0aXZlIjsNCi19DQotDQotCToNCi0JJyMnIQ0KLQkofidcbicpKiAnXG4nIQ0KLQk7DQotDQotDQotU0xfQ09NTUVOVA0KLW9wdGlvbnMgew0KLSAgcGFyYXBocmFzZSA9ICJhIGNvbW1lbnQiOw0KLX0NCi0NCi0JOg0KLQkiLy8iIQ0KLQkofidcbicpKiAnXG4nDQotCXsgJHNldFR5cGUoVG9rZW4uU0tJUCk7IG5ld2xpbmUoKTsgfQ0KLQk7DQotDQotTUxfQ09NTUVOVA0KLW9wdGlvbnMgew0KLSAgcGFyYXBocmFzZSA9ICJhIGNvbW1lbnQiOw0KLX0NCi0JOg0KLQkiLyoiIQ0KLQkoDQotCQkJJ1xuJyB7IG5ld2xpbmUoKTsgfQ0KLQkJfAkoJyonKSsNCi0JCQkoCSdcbicgeyBuZXdsaW5lKCk7IH0NCi0JCQl8CX4oJyonIHwgJy8nIHwgJ1xuJykNCi0JCQkpDQotCQl8CX4oJyonIHwgJ1xuJykNCi0JKSoNCi0JIiovIiENCi0JeyAkc2V0VHlwZShUb2tlbi5TS0lQKTsgIH0NCi0JOw0KLQ0KLUNIQVJfTElURVJBTA0KLW9wdGlvbnMgew0KLSAgcGFyYXBocmFzZSA9ICJhIGNoYXJhY3RlciBsaXRlcmFsIjsNCi19DQotCToNCi0JJ1wnJyENCi0JKCBFU0MgfCB+J1wnJyApDQotCSdcJychDQotCTsNCi0NCi1XSURFX0NIQVJfTElURVJBTA0KLW9wdGlvbnMgew0KLSAgcGFyYXBocmFzZSA9ICJhIHdpZGUgY2hhcmFjdGVyIGxpdGVyYWwiOw0KLX0NCi0JOiAnTCchIENIQVJfTElURVJBTA0KLQk7DQotDQotU1RSSU5HX0xJVEVSQUwNCi1vcHRpb25zIHsNCi0gIHBhcmFwaHJhc2UgPSAiYSBzdHJpbmcgbGl0ZXJhbCI7DQotfQ0KLQk6DQotCSciJyENCi0JKEVTQ3x+JyInKSoNCi0JJyInIQ0KLQk7DQotDQotDQotV0lERV9TVFJJTkdfTElURVJBTA0KLW9wdGlvbnMgew0KLSAgcGFyYXBocmFzZSA9ICJhIHdpZGUgc3RyaW5nIGxpdGVyYWwiOw0KLX0NCi0JOg0KLQknTCchIFNUUklOR19MSVRFUkFMDQotCTsNCi0NCi1wcm90ZWN0ZWQNCi1FU0MNCi1vcHRpb25zIHsNCi0gIHBhcmFwaHJhc2UgPSAiYW4gZXNjYXBlIHNlcXVlbmNlIjsNCi19DQotCToJJ1xcJyENCi0JCSgJJ24nCQl7JHNldFRleHQoIlxuIik7fQ0KLQkJfAkndCcJCXskc2V0VGV4dCgiXHQiKTt9DQotCQl8CSd2JwkJeyRzZXRUZXh0KCJcMDEzIik7fQ0KLQkJfAknYicJCXskc2V0VGV4dCgiXGIiKTt9DQotCQl8CSdyJwkJeyRzZXRUZXh0KCJcciIpO30NCi0JCXwJJ2YnCQl7JHNldFRleHQoIlxyIik7fQ0KLQkJfAknYScgIAkJeyRzZXRUZXh0KCJcMDA3Iik7fQ0KLQkJfAknXFwnCQl7JHNldFRleHQoIlxcIik7fQ0KLQkJfAknPycgICAgIAl7JHNldFRleHQoIj8iKTt9DQotCQl8CSdcJycJCXskc2V0VGV4dCgiJyIpO30NCi0JCXwJJyInCQl7JHNldFRleHQoIlwiIik7fQ0KLQkJfAlPQ1RESUdJVA0KLQkJCShvcHRpb25zIHtncmVlZHk9dHJ1ZTt9Ok9DVERJR0lUDQotCQkJICAob3B0aW9ucyB7Z3JlZWR5PXRydWU7fTpPQ1RESUdJVCk/DQotCQkJKT8NCi0JCQl7Y2hhciByZWFsYyA9IChjaGFyKSBJbnRlZ2VyLnZhbHVlT2YoJGdldFRleHQsIDgpLmludFZhbHVlKCk7ICRzZXRUZXh0KHJlYWxjKTt9DQotCQl8ICAgICAgICd4JyEgSEVYRElHSVQNCi0JCQkob3B0aW9ucyB7Z3JlZWR5PXRydWU7fTpIRVhESUdJVCk/DQotCQkJe2NoYXIgcmVhbGMgPSAoY2hhcikgSW50ZWdlci52YWx1ZU9mKCRnZXRUZXh0LCAxNikuaW50VmFsdWUoKTsgJHNldFRleHQocmVhbGMpO30NCi0JCXwJJ3UnIQ0KLQkJCUhFWERJR0lUDQotCQkJKG9wdGlvbnMge2dyZWVkeT10cnVlO306SEVYRElHSVQNCi0JCQkgIChvcHRpb25zIHtncmVlZHk9dHJ1ZTt9OkhFWERJR0lUDQotCQkJICAgIChvcHRpb25zIHtncmVlZHk9dHJ1ZTt9OkhFWERJR0lUKT8NCi0JCQkgICk/DQotCQkJKT8NCi0JCQl7Y2hhciByZWFsYyA9IChjaGFyKSBJbnRlZ2VyLnZhbHVlT2YoJGdldFRleHQsIDE2KS5pbnRWYWx1ZSgpOyAkc2V0VGV4dChyZWFsYyk7fQ0KLQkJKQ0KLQk7DQotDQotcHJvdGVjdGVkDQotVk9DQUINCi1vcHRpb25zIHsNCi0gIHBhcmFwaHJhc2UgPSAiYW4gZXNjYXBlZCBjaGFyYWN0ZXIgdmFsdWUiOw0KLX0NCi0JOgknXDMnLi4nXDM3NycNCi0JOw0KLQ0KLXByb3RlY3RlZA0KLURJR0lUDQotb3B0aW9ucyB7DQotICBwYXJhcGhyYXNlID0gImEgZGlnaXQiOw0KLX0NCi0JOgknMCcuLic5Jw0KLQk7DQotDQotcHJvdGVjdGVkDQotTk9OWkVST0RJR0lUDQotb3B0aW9ucyB7DQotICBwYXJhcGhyYXNlID0gImEgbm9uLXplcm8gZGlnaXQiOw0KLX0NCi0JOgknMScuLic5Jw0KLQk7DQotDQotcHJvdGVjdGVkDQotT0NURElHSVQNCi1vcHRpb25zIHsNCi0gIHBhcmFwaHJhc2UgPSAiYW4gb2N0YWwgZGlnaXQiOw0KLX0NCi0JOgknMCcuLic3Jw0KLQk7DQotDQotcHJvdGVjdGVkDQotSEVYRElHSVQNCi1vcHRpb25zIHsNCi0gIHBhcmFwaHJhc2UgPSAiYSBoZXhhZGVjaW1hbCBkaWdpdCI7DQotfQ0KLQk6CSgnMCcuLic5JyB8ICdhJy4uJ2YnIHwgJ0EnLi4nRicpDQotCTsNCi0NCi1IRVgNCi1vcHRpb25zIHsNCi0gIHBhcmFwaHJhc2UgPSAiYSBoZXhhZGVjaW1hbCB2YWx1ZSB2YWx1ZSI7DQotfQ0KLQ0KLQk6ICAgICgiMHgiIHwgIjBYIikgKEhFWERJR0lUKSsNCi0JOw0KLQ0KLUlOVA0KLW9wdGlvbnMgew0KLSAgcGFyYXBocmFzZSA9ICJhbiBpbnRlZ2VyIHZhbHVlIjsNCi19DQotCTogICAgTk9OWkVST0RJR0lUIChESUdJVCkqICAgICAgICAgICAgICAgICAgLy8gYmFzZS0xMA0KLQkgICAgICggICcuJyAoRElHSVQpKg0KLQkJICggKCgnZScgfCAnRScpICgnKycgfCAnLScpPyAoRElHSVQpKykJeyRzZXRUeXBlKEZMT0FUKTt9DQotCQkgfCAoJ2QnIHwgJ0QnKSEJCQkJeyRzZXRUeXBlKEZJWEVEKTt9DQotCQkgfAkJCQkJeyRzZXRUeXBlKEZMT0FUKTt9DQotCQkgKQ0KLQkgICAgIHwgICAoJ2UnIHwgJ0UnKSAoJysnIHwgJy0nKT8gKERJR0lUKSsgICAJeyRzZXRUeXBlKEZMT0FUKTt9DQotCSAgICAgfCAgICgnZCcgfCAnRCcpIQkJCQl7JHNldFR5cGUoRklYRUQpO30NCi0JICAgICApPw0KLQk7DQotDQotT0NUQUwNCi1vcHRpb25zIHsNCi0gIHBhcmFwaHJhc2UgPSAiYW4gb2N0YWwgdmFsdWUiOw0KLX0NCi0JOiAgICAnMCcNCi0JICAgICAoIChESUdJVCkrDQotCSAgICAgfCBGTE9BVAkJCQkJeyRzZXRUeXBlKEZMT0FUKTt9DQotCSAgICAgfCAoJ2QnIHwgJ0QnKSEJCQkJeyRzZXRUeXBlKEZJWEVEKTt9DQotCSAgICAgfAkJCQkJCXskc2V0VHlwZShJTlQpO30NCi0JICAgICApDQotCTsNCi0NCi0NCi1GTE9BVA0KLW9wdGlvbnMgew0KLSAgcGFyYXBocmFzZSA9ICJhIGZsb2F0aW5nIHBvaW50IHZhbHVlIjsNCi19DQotDQotCTogICAgJy4nIChESUdJVCkrDQotCSAgICAgKCAoJ2UnIHwgJ0UnKSAoJysnIHwgJy0nKT8gKERJR0lUKSsNCi0JICAgICB8ICgnZCcgfCAnRCcpIQkJCQl7JHNldFR5cGUoRklYRUQpO30NCi0JICAgICApPw0KLQk7DQotDQotSURFTlQNCi1vcHRpb25zIHsNCi0gIHBhcmFwaHJhc2UgPSAiYW4gaWRlbnRpZmVyIjsNCi0gIHRlc3RMaXRlcmFscyA9IHRydWU7DQotfQ0KLQ0KLQk6ICAgKCdhJy4uJ3onfCdBJy4uJ1onKSAoJ2EnLi4neid8J0EnLi4nWid8J18nfCcwJy4uJzknKSoNCi0JOw0KLQ0KLUVTQ0FQRURfSURFTlQNCi1vcHRpb25zIHsNCi0gIHBhcmFwaHJhc2UgPSAiYW4gZXNjYXBlZCBpZGVudGlmZXIiOw0KLSAgdGVzdExpdGVyYWxzID0gZmFsc2U7CQkJLy8gcmVkdW5kYW50LCBidXQgZXhwbGljaXQgaXMgZ29vZC4NCi19DQotICAgIC8vIE5PVEU6IEFkZGluZyBhICEgdG8gdGhlICdfJyBkb2Vzbid0IHNlZW0gdG8gd29yaywNCi0gICAgLy8gICAgICAgc28gd2UgYWRqdXN0IF9iZWdpbiBtYW51YWxseS4NCi0NCi0JOiAgICdfJyAoJ2EnLi4neid8J0EnLi4nWicpICgnYScuLid6J3wnQScuLidaJ3wnXyd8JzAnLi4nOScpKg0KLQkJCQkJCQl7X2JlZ2luKys7JHNldFR5cGUoSURFTlQpO30NCi0JOw0KLQ0KLQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL2lkbC90eXBlcy9BYnN0cmFjdENvbGxlY3Rpb25UeXBlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9pZGwvdHlwZXMvQWJzdHJhY3RDb2xsZWN0aW9uVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTY1OTdmLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL2lkbC90eXBlcy9BYnN0cmFjdENvbGxlY3Rpb25UeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC50eXBlczsNCi0NCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RDb2xsZWN0aW9uVHlwZSBleHRlbmRzIENvbXBvc2l0ZURhdGFUeXBlIHsNCi0gICAgcHJvdGVjdGVkIGludCBlbGVtZW50Q291bnQ7DQotICAgIHByb3RlY3RlZCBEYXRhVHlwZSBkYXRhVHlwZTsNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBlbGVtZW50TW9kdWxlOw0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGVsZW1lbnROYW1lOw0KLSAgICBwcm90ZWN0ZWQgaW50IGRlcHRoOw0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRFbGVtZW50Q291bnQoaW50IGVsZW1lbnRDb3VudCkgew0KLSAgICAgICAgdGhpcy5lbGVtZW50Q291bnQgPSBlbGVtZW50Q291bnQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGludCBnZXRFbGVtZW50Q291bnQoKSB7DQotICAgICAgICByZXR1cm4gZWxlbWVudENvdW50Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBEYXRhVHlwZSBnZXREYXRhVHlwZSgpIHsNCi0gICAgICAgIHJldHVybiBkYXRhVHlwZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXREYXRhVHlwZShEYXRhVHlwZSBkYXRhVHlwZSkgew0KLSAgICAgICAgdGhpcy5kYXRhVHlwZSA9IGRhdGFUeXBlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzQXJyYXkoKSB7DQotICAgICAgICByZXR1cm4gKHRoaXMgaW5zdGFuY2VvZiBBcnJheVR5cGUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzU2VxdWVuY2UoKSB7DQotICAgICAgICByZXR1cm4gKHRoaXMgaW5zdGFuY2VvZiBTZXF1ZW5jZVR5cGUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudE1vZHVsZSgpIHsNCi0gICAgICAgIHJldHVybiBlbGVtZW50TW9kdWxlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldEVsZW1lbnRNb2R1bGUoU3RyaW5nIGVsZW1lbnRNb2R1bGUpIHsNCi0gICAgICAgIHRoaXMuZWxlbWVudE1vZHVsZSA9IGVsZW1lbnRNb2R1bGU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRFbGVtZW50TmFtZSgpIHsNCi0gICAgICAgIHJldHVybiBlbGVtZW50TmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRFbGVtZW50TmFtZShTdHJpbmcgZWxlbWVudE5hbWUpIHsNCi0gICAgICAgIHRoaXMuZWxlbWVudE5hbWUgPSBlbGVtZW50TmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgaW50IGdldERlcHRoKCkgew0KLSAgICAgICAgcmV0dXJuIGRlcHRoOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldERlcHRoKGludCBkZXB0aCkgew0KLSAgICAgICAgdGhpcy5kZXB0aCA9IGRlcHRoOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL2lkbC90eXBlcy9BcnJheVR5cGUuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL2lkbC90eXBlcy9BcnJheVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ2ZjdhNy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9pZGwvdHlwZXMvQXJyYXlUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC50eXBlczsNCi0NCi1pbXBvcnQgb3JnLm9tZy5DT1JCQS5PUkI7DQotaW1wb3J0IG9yZy5vbWcuQ09SQkEuVHlwZUNvZGU7DQotDQotcHVibGljIGNsYXNzIEFycmF5VHlwZSBleHRlbmRzIEFic3RyYWN0Q29sbGVjdGlvblR5cGUgew0KLSAgICBwcm90ZWN0ZWQgVHlwZUNvZGUgZ2VuZXJhdGVUeXBlQ29kZSgpIHsNCi0gICAgICAgIHJldHVybiBPUkIuaW5pdCgpLmNyZWF0ZV9hcnJheV90YyhlbGVtZW50Q291bnQsIGRhdGFUeXBlLmdldFR5cGVDb2RlKCkpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL2lkbC90eXBlcy9Db21wb3NpdGVEYXRhVHlwZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvaWRsL3R5cGVzL0NvbXBvc2l0ZURhdGFUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhMDRkY2IuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvaWRsL3R5cGVzL0NvbXBvc2l0ZURhdGFUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC50eXBlczsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotcHVibGljIGFic3RyYWN0IGNsYXNzIENvbXBvc2l0ZURhdGFUeXBlIGV4dGVuZHMgRGF0YVR5cGUgew0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRExfUkVQT19TVFJJTkcgPSAiSURMOiI7DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElETF9WRVJTSU9OID0gIjoxLjAiOw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RVTEVfU0VQRVJBVE9SID0gIjo6IjsNCi0NCi0JcHJvdGVjdGVkIFN0cmluZyBpZDsNCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lOw0KLQlwcm90ZWN0ZWQgU3RyaW5nIG1vZHVsZTsNCi0JcHJvdGVjdGVkIExpc3QgbWVtYmVycyA9IG5ldyBBcnJheUxpc3QoKTsNCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRJZCgpIHsNCi0gICAgICAgIGlmIChpZD09bnVsbCkNCi0gICAgICAgICAgICBpZCA9IElETF9SRVBPX1NUUklORyArIG1vZHVsZS5yZXBsYWNlQWxsKE1PRFVMRV9TRVBFUkFUT1IsICIvIikgKyBuYW1lICsgSURMX1ZFUlNJT047DQotICAgICAgICByZXR1cm4gaWQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIGlkKSB7DQotICAgICAgICB0aGlzLmlkID0gaWQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgew0KLSAgICAgICAgcmV0dXJuIG5hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgew0KLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE1vZHVsZSgpIHsNCi0gICAgICAgIHJldHVybiBtb2R1bGU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TW9kdWxlKFN0cmluZyBtb2R1bGUpIHsNCi0gICAgICAgIHRoaXMubW9kdWxlID0gbW9kdWxlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGFkZE1lbWJlcihNZW1iZXIgbWVtYmVyKSB7DQotICAgICAgICBtZW1iZXJzLmFkZChtZW1iZXIpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBNZW1iZXJbXSBnZXRNZW1iZXJzKCkgew0KLSAgICAgICAgTWVtYmVyW10gbWVtYmVyc0FycmF5ID0gbmV3IE1lbWJlclttZW1iZXJzLnNpemUoKV07DQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1lbWJlcnMuc2l6ZSgpOyBpKyspIHsNCi0gICAgICAgICAgICBtZW1iZXJzQXJyYXlbaV0gPSAoTWVtYmVyKSBtZW1iZXJzLmdldChpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBtZW1iZXJzQXJyYXk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvaWRsL3R5cGVzL0RhdGFUeXBlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9pZGwvdHlwZXMvRGF0YVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU3MjgwMS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9pZGwvdHlwZXMvRGF0YVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLnR5cGVzOw0KLQ0KLWltcG9ydCBvcmcub21nLkNPUkJBLlR5cGVDb2RlOw0KLQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBEYXRhVHlwZSB7DQotICAgIHByb3RlY3RlZCBUeXBlQ29kZSB0eXBlQ29kZTsNCi0NCi0gICAgcHVibGljIFR5cGVDb2RlIGdldFR5cGVDb2RlKCkgew0KLSAgICAgICAgaWYgKHR5cGVDb2RlPT1udWxsKQ0KLSAgICAgICAgICAgIHR5cGVDb2RlID0gZ2VuZXJhdGVUeXBlQ29kZSgpOw0KLSAgICAgICAgcmV0dXJuIHR5cGVDb2RlOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBUeXBlQ29kZSBnZW5lcmF0ZVR5cGVDb2RlKCk7DQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL2lkbC90eXBlcy9FbnVtVHlwZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvaWRsL3R5cGVzL0VudW1UeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkNDY4NDQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvaWRsL3R5cGVzL0VudW1UeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC50eXBlczsNCi0NCi1pbXBvcnQgb3JnLm9tZy5DT1JCQS5PUkI7DQotaW1wb3J0IG9yZy5vbWcuQ09SQkEuVHlwZUNvZGU7DQotDQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLXB1YmxpYyBjbGFzcyBFbnVtVHlwZSBleHRlbmRzIENvbXBvc2l0ZURhdGFUeXBlIHsNCi0gICAgcHJpdmF0ZSBMaXN0IGVudW1NZW1iZXJzID0gbmV3IEFycmF5TGlzdCgpOw0KLQ0KLSAgICBwcm90ZWN0ZWQgVHlwZUNvZGUgZ2VuZXJhdGVUeXBlQ29kZSgpIHsNCi0gICAgICAgIFN0cmluZ1tdIGFyck1lbWJlcnMgPSBuZXcgU3RyaW5nW2VudW1NZW1iZXJzLnNpemUoKV07DQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVudW1NZW1iZXJzLnNpemUoKTsgaSsrKQ0KLSAgICAgICAgICAgIGFyck1lbWJlcnNbaV0gPSAoU3RyaW5nKSBlbnVtTWVtYmVycy5nZXQoaSk7DQotDQotICAgICAgICByZXR1cm4gT1JCLmluaXQgKCkuY3JlYXRlX2VudW1fdGMgKGdldElkKCksIGdldE5hbWUoKSwgYXJyTWVtYmVycyk7ICAgICAgICANCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTGlzdCBnZXRFbnVtTWVtYmVycygpIHsNCi0gICAgICAgIHJldHVybiBlbnVtTWVtYmVyczsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRFbnVtTWVtYmVycyhMaXN0IGVudW1NZW1iZXJzKSB7DQotICAgICAgICB0aGlzLmVudW1NZW1iZXJzID0gZW51bU1lbWJlcnM7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgYWRkRW51bU1lbWJlcihTdHJpbmcgcykgew0KLSAgICAgICAgZW51bU1lbWJlcnMuYWRkKHMpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL2lkbC90eXBlcy9FeGNlcHRpb25UeXBlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9pZGwvdHlwZXMvRXhjZXB0aW9uVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTEwM2Y1Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL2lkbC90eXBlcy9FeGNlcHRpb25UeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC50eXBlczsNCi0NCi1pbXBvcnQgb3JnLm9tZy5DT1JCQS5PUkI7DQotaW1wb3J0IG9yZy5vbWcuQ09SQkEuVHlwZUNvZGU7DQotDQotcHVibGljIGNsYXNzIEV4Y2VwdGlvblR5cGUgZXh0ZW5kcyBTdHJ1Y3Qgew0KLQlwcm90ZWN0ZWQgVHlwZUNvZGUgZ2VuZXJhdGVUeXBlQ29kZSgpew0KLQkJcmV0dXJuIE9SQi5pbml0KCkuY3JlYXRlX2V4Y2VwdGlvbl90YyhnZXRJZCgpLCBnZXROYW1lKCksIHByZXBhaXJTdHJ1Y3RNZW1iZXJzKCkpOw0KLQl9DQotDQotLy8gICAgcHVibGljIENsYXNzIGdldEphdmFUeXBlKCkgew0KLS8vICAgICAgICByZXR1cm4gRXhjZXB0aW9uVmFsdWUuY2xhc3M7DQotLy8gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9pZGwvdHlwZXMvSURMLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9pZGwvdHlwZXMvSURMLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4YjYxMDkuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvaWRsL3R5cGVzL0lETC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5pZGwudHlwZXM7DQotDQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOw0KLQ0KLXB1YmxpYyBjbGFzcyBJREwgew0KLQlwcml2YXRlIE1hcCBjb21wb3NpdGVEYXRhVHlwZXM7DQotCXByaXZhdGUgTWFwIGludGVyZmFjZXM7DQotDQotICAgIHB1YmxpYyBNYXAgZ2V0Q29tcG9zaXRlRGF0YVR5cGVzKCkgew0KLSAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZURhdGFUeXBlczsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb21wb3NpdGVEYXRhVHlwZXMoamF2YS51dGlsLk1hcCBjb21wb3NpdGVEYXRhVHlwZXMpIHsNCi0gICAgICAgIHRoaXMuY29tcG9zaXRlRGF0YVR5cGVzID0gY29tcG9zaXRlRGF0YVR5cGVzOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGFkZFR5cGUoQ29tcG9zaXRlRGF0YVR5cGUgZGF0YVR5cGUpIHsNCi0gICAgICAgIGlmIChjb21wb3NpdGVEYXRhVHlwZXMgPT0gbnVsbCkNCi0gICAgICAgICAgICBjb21wb3NpdGVEYXRhVHlwZXMgPSBuZXcgVHJlZU1hcCgpOw0KLSAgICAgICAgY29tcG9zaXRlRGF0YVR5cGVzLnB1dChkYXRhVHlwZS5nZXRNb2R1bGUoKSArIGRhdGFUeXBlLmdldE5hbWUoKSwgZGF0YVR5cGUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBqYXZhLnV0aWwuTWFwIGdldEludGVyZmFjZXMoKSB7DQotICAgICAgICByZXR1cm4gaW50ZXJmYWNlczsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRJbnRlcmZhY2VzKGphdmEudXRpbC5NYXAgaW50ZXJmYWNlcykgew0KLSAgICAgICAgdGhpcy5pbnRlcmZhY2VzID0gaW50ZXJmYWNlczsNCi0gICAgICAgIGlmIChjb21wb3NpdGVEYXRhVHlwZXMgPT0gbnVsbCkNCi0gICAgICAgICAgICBjb21wb3NpdGVEYXRhVHlwZXMgPSBuZXcgVHJlZU1hcCgpOw0KLSAgICAgICAgdGhpcy5jb21wb3NpdGVEYXRhVHlwZXMucHV0QWxsKGludGVyZmFjZXMpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGFkZEludGVyZmFjZShJbnRlcmZhY2UgaW50Zikgew0KLSAgICAgICAgaWYgKGludGVyZmFjZXMgPT0gbnVsbCkNCi0gICAgICAgICAgICBpbnRlcmZhY2VzID0gbmV3IFRyZWVNYXAoKTsNCi0gICAgICAgIGludGVyZmFjZXMucHV0KGludGYuZ2V0TW9kdWxlKCkgKyBpbnRmLmdldE5hbWUoKSwgaW50Zik7DQotICAgICAgICBpZiAoY29tcG9zaXRlRGF0YVR5cGVzID09IG51bGwpDQotICAgICAgICAgICAgY29tcG9zaXRlRGF0YVR5cGVzID0gbmV3IFRyZWVNYXAoKTsNCi0gICAgICAgIGNvbXBvc2l0ZURhdGFUeXBlcy5wdXQoaW50Zi5nZXRNb2R1bGUoKSArIGludGYuZ2V0TmFtZSgpLCBpbnRmKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZGRJREwgKElETCBjaGlsZElkbCkgew0KLSAgICAgICAgTWFwIHRlbXAgPSBjaGlsZElkbC5nZXRJbnRlcmZhY2VzKCk7DQotICAgICAgICBpZiAodGVtcCE9bnVsbCkgew0KLSAgICAgICAgICAgIGlmIChpbnRlcmZhY2VzPT1udWxsKQ0KLSAgICAgICAgICAgICAgICBpbnRlcmZhY2VzID0gbmV3IFRyZWVNYXAoKTsNCi0gICAgICAgICAgICBpbnRlcmZhY2VzLnB1dEFsbCh0ZW1wKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHRlbXAgPSBjaGlsZElkbC5nZXRDb21wb3NpdGVEYXRhVHlwZXMoKTsNCi0gICAgICAgIGlmICh0ZW1wIT1udWxsKSB7DQotICAgICAgICAgICAgaWYgKGNvbXBvc2l0ZURhdGFUeXBlcz09bnVsbCkNCi0gICAgICAgICAgICAgICAgY29tcG9zaXRlRGF0YVR5cGVzID0gbmV3IFRyZWVNYXAoKTsNCi0gICAgICAgICAgICBjb21wb3NpdGVEYXRhVHlwZXMucHV0QWxsKHRlbXApOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL2lkbC90eXBlcy9JbnRlcmZhY2UuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL2lkbC90eXBlcy9JbnRlcmZhY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI1YWIzMy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9pZGwvdHlwZXMvSW50ZXJmYWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC50eXBlczsNCi0NCi1pbXBvcnQgb3JnLm9tZy5DT1JCQS5UeXBlQ29kZTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KLWltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsNCi0NCi1wdWJsaWMgY2xhc3MgSW50ZXJmYWNlIGV4dGVuZHMgQ29tcG9zaXRlRGF0YVR5cGUgew0KLQlwcml2YXRlIGphdmEudXRpbC5NYXAgb3BlcmF0aW9uczsNCi0NCi0gICAgcHJvdGVjdGVkIFR5cGVDb2RlIGdlbmVyYXRlVHlwZUNvZGUoKXsNCi0gICAgICAgIHJldHVybiBvcmcub21nLkNPUkJBLk9SQi5pbml0ICgpLmNyZWF0ZV9pbnRlcmZhY2VfdGMgKGdldElkKCksIGdldE5hbWUoKSk7DQotCX0NCi0NCi0gICAgcHVibGljIGphdmEudXRpbC5NYXAgZ2V0T3BlcmF0aW9uc01hcCgpIHsNCi0gICAgICAgIHJldHVybiBvcGVyYXRpb25zOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBPcGVyYXRpb25bXSBnZXRPcGVyYXRpb25zKCkgew0KLSAgICAgICAgT3BlcmF0aW9uW10gb3BlcmF0aW9uc0FyciA9IG5ldyBPcGVyYXRpb25bb3BlcmF0aW9ucy5zaXplKCldOw0KLSAgICAgICAgSXRlcmF0b3IgaXRlciA9IG9wZXJhdGlvbnMudmFsdWVzKCkuaXRlcmF0b3IoKTsNCi0gICAgICAgIGludCBpID0gMDsNCi0gICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgew0KLSAgICAgICAgICAgIG9wZXJhdGlvbnNBcnJbaV0gPSAoT3BlcmF0aW9uKSBpdGVyLm5leHQoKTsNCi0gICAgICAgICAgICBpKys7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gb3BlcmF0aW9uc0FycjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZGRPcGVyYXRpb24oT3BlcmF0aW9uIG9wZXJhdGlvbikgew0KLSAgICAgICAgaWYgKG9wZXJhdGlvbnMgPT0gbnVsbCkNCi0gICAgICAgICAgICBvcGVyYXRpb25zID0gbmV3IFRyZWVNYXAoKTsNCi0gICAgICAgIG9wZXJhdGlvbnMucHV0KG9wZXJhdGlvbi5nZXROYW1lKCksIG9wZXJhdGlvbik7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvaWRsL3R5cGVzL01lbWJlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvaWRsL3R5cGVzL01lbWJlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMmEyYzVhLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL2lkbC90eXBlcy9NZW1iZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLnR5cGVzOw0KLQ0KLXB1YmxpYyBjbGFzcyBNZW1iZXIgew0KLQlwcm90ZWN0ZWQgRGF0YVR5cGUgZGF0YVR5cGU7DQotCXByb3RlY3RlZCBTdHJpbmcgbmFtZTsNCi0JcHJvdGVjdGVkIFN0cmluZyBtb2RlOw0KLQlwcm90ZWN0ZWQgU3RyaW5nIG1vZGlmaWVyOw0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RFX0lOID0gImluIjsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9ERV9JTk9VVCA9ICJpbm91dCI7DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1PREVfT1VUID0gIm91dCI7DQotDQotICAgIHB1YmxpYyBEYXRhVHlwZSBnZXREYXRhVHlwZSgpIHsNCi0gICAgICAgIHJldHVybiBkYXRhVHlwZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXREYXRhVHlwZShEYXRhVHlwZSBkYXRhVHlwZSkgew0KLSAgICAgICAgdGhpcy5kYXRhVHlwZSA9IGRhdGFUeXBlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsNCi0gICAgICAgIHJldHVybiBuYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsNCi0gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRNb2RlKCkgew0KLSAgICAgICAgcmV0dXJuIG1vZGU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TW9kZShTdHJpbmcgbW9kZSkgew0KLSAgICAgICAgdGhpcy5tb2RlID0gbW9kZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE1vZGlmaWVyKCkgew0KLSAgICAgICAgcmV0dXJuIG1vZGlmaWVyOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE1vZGlmaWVyKFN0cmluZyBtb2RpZmllcikgew0KLSAgICAgICAgdGhpcy5tb2RpZmllciA9IG1vZGlmaWVyOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL2lkbC90eXBlcy9PcGVyYXRpb24uamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL2lkbC90eXBlcy9PcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU0NzBiZC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9pZGwvdHlwZXMvT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC50eXBlczsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotcHVibGljIGNsYXNzIE9wZXJhdGlvbiB7DQotCXByaXZhdGUgU3RyaW5nIG5hbWU7DQotCXByaXZhdGUgTGlzdCBwYXJhbXMgPSBuZXcgQXJyYXlMaXN0KCk7DQotCXByaXZhdGUgRGF0YVR5cGUgcmV0dXJuVHlwZTsNCi0JcHJpdmF0ZSBMaXN0IHJhaXNlcyA9IG5ldyBBcnJheUxpc3QoKTsNCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgew0KLSAgICAgICAgcmV0dXJuIG5hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgew0KLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTGlzdCBnZXRQYXJhbXMoKSB7DQotICAgICAgICByZXR1cm4gcGFyYW1zOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFBhcmFtcyhMaXN0IHBhcmFtcykgew0KLSAgICAgICAgdGhpcy5wYXJhbXMgPSBwYXJhbXM7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgYWRkUGFyYW0oTWVtYmVyIHBhcmFtKSB7DQotICAgICAgICBwYXJhbXMuYWRkKHBhcmFtKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgRGF0YVR5cGUgZ2V0UmV0dXJuVHlwZSgpIHsNCi0gICAgICAgIHJldHVybiByZXR1cm5UeXBlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFJldHVyblR5cGUoRGF0YVR5cGUgcmV0dXJuVHlwZSkgew0KLSAgICAgICAgdGhpcy5yZXR1cm5UeXBlID0gcmV0dXJuVHlwZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTGlzdCBnZXRSYWlzZXMoKSB7DQotICAgICAgICByZXR1cm4gcmFpc2VzOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGhhc1JhaXNlcygpIHsNCi0gICAgICAgIHJldHVybiByYWlzZXMgIT0gbnVsbCAmJiAocmFpc2VzLnNpemUoKSA+IDApOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFJhaXNlcyhMaXN0IHJhaXNlcykgew0KLSAgICAgICAgdGhpcy5yYWlzZXMgPSByYWlzZXM7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgYWRkUmFpc2VzKEV4Y2VwdGlvblR5cGUgZXhjZXB0aW9uVHlwZSkgew0KLSAgICAgICAgcmFpc2VzLmFkZChleGNlcHRpb25UeXBlKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9pZGwvdHlwZXMvUHJpbWl0aXZlRGF0YVR5cGUuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL2lkbC90eXBlcy9QcmltaXRpdmVEYXRhVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTJlYzVmLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL2lkbC90eXBlcy9QcmltaXRpdmVEYXRhVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLnR5cGVzOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotaW1wb3J0IG9yZy5vbWcuQ09SQkEuT1JCOw0KLWltcG9ydCBvcmcub21nLkNPUkJBLlRDS2luZDsNCi1pbXBvcnQgb3JnLm9tZy5DT1JCQS5UeXBlQ29kZTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotcHVibGljIGNsYXNzIFByaW1pdGl2ZURhdGFUeXBlIGV4dGVuZHMgRGF0YVR5cGUgew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coUHJpbWl0aXZlRGF0YVR5cGUuY2xhc3MpOw0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBNYXAgUFJJTUlUSVZFX1RZUEVTID0gbmV3IEhhc2hNYXAoKTsNCi0gICAgc3RhdGljIHsNCi0gICAgICAgIE9SQiBvcmIgPSBPUkIuaW5pdCgpOw0KLSAgICAgICAgUFJJTUlUSVZFX1RZUEVTLnB1dCgibG9uZyIsb3JiLmdldF9wcmltaXRpdmVfdGMoVENLaW5kLnRrX2xvbmcpKTsNCi0gICAgICAgIFBSSU1JVElWRV9UWVBFUy5wdXQoInVsb25nIixvcmIuZ2V0X3ByaW1pdGl2ZV90YyhUQ0tpbmQudGtfdWxvbmcpKTsNCi0gICAgICAgIFBSSU1JVElWRV9UWVBFUy5wdXQoImxvbmdsb25nIixvcmIuZ2V0X3ByaW1pdGl2ZV90YyhUQ0tpbmQudGtfbG9uZ2xvbmcpKTsNCi0gICAgICAgIFBSSU1JVElWRV9UWVBFUy5wdXQoInVsb25nbG9uZyIsb3JiLmdldF9wcmltaXRpdmVfdGMoVENLaW5kLnRrX3Vsb25nbG9uZykpOw0KLSAgICAgICAgUFJJTUlUSVZFX1RZUEVTLnB1dCgic2hvcnQiLG9yYi5nZXRfcHJpbWl0aXZlX3RjKFRDS2luZC50a19zaG9ydCkpOw0KLSAgICAgICAgUFJJTUlUSVZFX1RZUEVTLnB1dCgidXNob3J0IixvcmIuZ2V0X3ByaW1pdGl2ZV90YyhUQ0tpbmQudGtfdXNob3J0KSk7DQotICAgICAgICBQUklNSVRJVkVfVFlQRVMucHV0KCJmbG9hdCIsb3JiLmdldF9wcmltaXRpdmVfdGMoVENLaW5kLnRrX2Zsb2F0KSk7DQotICAgICAgICBQUklNSVRJVkVfVFlQRVMucHV0KCJkb3VibGUiLG9yYi5nZXRfcHJpbWl0aXZlX3RjKFRDS2luZC50a19kb3VibGUpKTsNCi0gICAgICAgIFBSSU1JVElWRV9UWVBFUy5wdXQoImNoYXIiLG9yYi5nZXRfcHJpbWl0aXZlX3RjKFRDS2luZC50a19jaGFyKSk7DQotICAgICAgICBQUklNSVRJVkVfVFlQRVMucHV0KCJ3Y2hhciIsb3JiLmdldF9wcmltaXRpdmVfdGMoVENLaW5kLnRrX3djaGFyKSk7DQotICAgICAgICBQUklNSVRJVkVfVFlQRVMucHV0KCJib29sZWFuIixvcmIuZ2V0X3ByaW1pdGl2ZV90YyhUQ0tpbmQudGtfYm9vbGVhbikpOw0KLSAgICAgICAgUFJJTUlUSVZFX1RZUEVTLnB1dCgib2N0ZXQiLG9yYi5nZXRfcHJpbWl0aXZlX3RjKFRDS2luZC50a19vY3RldCkpOw0KLSAgICAgICAgUFJJTUlUSVZFX1RZUEVTLnB1dCgic3RyaW5nIixvcmIuZ2V0X3ByaW1pdGl2ZV90YyhUQ0tpbmQudGtfc3RyaW5nKSk7DQotICAgICAgICBQUklNSVRJVkVfVFlQRVMucHV0KCJ3c3RyaW5nIixvcmIuZ2V0X3ByaW1pdGl2ZV90YyhUQ0tpbmQudGtfd3N0cmluZykpOw0KLSAgICAgICAgUFJJTUlUSVZFX1RZUEVTLnB1dCgiYW55IixvcmIuZ2V0X3ByaW1pdGl2ZV90YyhUQ0tpbmQudGtfYW55KSk7DQotICAgICAgICBQUklNSVRJVkVfVFlQRVMucHV0KCJsb25nZG91YmxlIixvcmIuZ2V0X3ByaW1pdGl2ZV90YyhUQ0tpbmQudGtfbG9uZ2RvdWJsZSkpOw0KLSAgICAgICAgUFJJTUlUSVZFX1RZUEVTLnB1dCgidm9pZCIsb3JiLmdldF9wcmltaXRpdmVfdGMoVENLaW5kLnRrX3ZvaWQpKTsNCi0gICAgICAgIC8vUFJJTUlUSVZFX1RZUEVTLnB1dCgiZGF0ZVRpbWUiLG9yYi5nZXRfcHJpbWl0aXZlX3RjKFRDS2luZC50a19kYXRlVGltZSkpOw0KLSAgICAgICAgLy9QUklNSVRJVkVfVFlQRVMucHV0KCJkYXRlIixvcmIuZ2V0X3ByaW1pdGl2ZV90YyhUQ0tpbmQudGtfZGF0ZSkpOw0KLSAgICAgICAgLy9QUklNSVRJVkVfVFlQRVMucHV0KCJ0aW1lIixvcmIuZ2V0X3ByaW1pdGl2ZV90YyhUQ0tpbmQudGtfdGltZSkpOw0KLSAgICAgICAgLy9QUklNSVRJVkVfVFlQRVMucHV0KCJwb3NpdGl2ZUludGVnZXIiLG9yYi5nZXRfcHJpbWl0aXZlX3RjKFRDS2luZC50a19wb3NpdGl2ZUludGVnZXIpKTsNCi0gICAgICAgIC8vUFJJTUlUSVZFX1RZUEVTLnB1dCgibm9uUG9zaXRpdmVJbnRlZ2VyIixvcmIuZ2V0X3ByaW1pdGl2ZV90YyhUQ0tpbmQudGtfbm9uUG9zaXRpdmVJbnRlZ2VyKSk7DQotICAgICAgICAvL1BSSU1JVElWRV9UWVBFUy5wdXQoIm5lZ2F0aXZlSW50ZWdlciIsb3JiLmdldF9wcmltaXRpdmVfdGMoVENLaW5kLnRrX25lZ2F0aXZlSW50ZWdlcikpOw0KLSAgICAgICAgLy9QUklNSVRJVkVfVFlQRVMucHV0KCJub25OZWdhdGl2ZUludGVnZXIiLG9yYi5nZXRfcHJpbWl0aXZlX3RjKFRDS2luZC50a19ub25OZWdhdGl2ZUludGVnZXIpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFR5cGVDb2RlIGdldFR5cGVDb2RlKFN0cmluZyB0eXBlTmFtZSkgew0KLSAgICAgICAgVHlwZUNvZGUgdHlwZUNvZGUgPSAoVHlwZUNvZGUpIFBSSU1JVElWRV9UWVBFUy5nZXQodHlwZU5hbWUpOw0KLSAgICAgICAgaWYgKHR5cGVDb2RlID09IG51bGwgJiYgdHlwZU5hbWUgIT0gbnVsbCAmJiB0eXBlTmFtZS5jb250YWlucygiOjoiKSkgew0KLSAgICAgICAgICAgIFN0cmluZyB0eXBlTmFtZTIgPSB0eXBlTmFtZS5zdWJzdHJpbmcoMCwgdHlwZU5hbWUuaW5kZXhPZigiOjoiKSk7DQotICAgICAgICAgICAgdHlwZUNvZGUgPSAoVHlwZUNvZGUpIFBSSU1JVElWRV9UWVBFUy5nZXQodHlwZU5hbWUyKTsNCi0gICAgICAgICAgICByZXR1cm4gdHlwZUNvZGU7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gdHlwZUNvZGU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUHJpbWl0aXZlKFR5cGVDb2RlIHR5cGVDb2RlKSB7DQotICAgICAgICByZXR1cm4gdHlwZUNvZGUgIT0gbnVsbCAmJiBQUklNSVRJVkVfVFlQRVMudmFsdWVzKCkuY29udGFpbnModHlwZUNvZGUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgUHJpbWl0aXZlRGF0YVR5cGUgZ2V0UHJpbWl0aXZlRGF0YVR5cGUoU3RyaW5nIHR5cGVOYW1lKSB7DQotICAgICAgICByZXR1cm4gbmV3IFByaW1pdGl2ZURhdGFUeXBlKGdldFR5cGVDb2RlKHR5cGVOYW1lKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFByaW1pdGl2ZURhdGFUeXBlKFR5cGVDb2RlIHR5cGVDb2RlKXsNCi0gICAgICAgIHRoaXMudHlwZUNvZGUgPSB0eXBlQ29kZTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgVHlwZUNvZGUgZ2VuZXJhdGVUeXBlQ29kZSgpIHsNCi0gICAgICAgIHJldHVybiB0eXBlQ29kZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCkgew0KLSAgICAgICAgU3RyaW5nIHJldCA9IG51bGw7DQotICAgICAgICBpZiAodHlwZUNvZGUgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIFRDS2luZCBraW5kID0gdHlwZUNvZGUua2luZCgpOw0KLSAgICAgICAgICAgIGlmIChraW5kICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgc3dpdGNoKGtpbmQudmFsdWUoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBUQ0tpbmQuX3RrX2xvbmcgOiByZXQgPSAiaW50IjsgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfdWxvbmcgOiByZXQgPSAiaW50IjsgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfbG9uZ2xvbmcgOiByZXQgPSAibG9uZyI7IGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBUQ0tpbmQuX3RrX3Vsb25nbG9uZyA6IHJldCA9ICJsb25nIjsgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfc2hvcnQgOiByZXQgPSAic2hvcnQiOyBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgVENLaW5kLl90a191c2hvcnQgOiByZXQgPSAic2hvcnQiOyBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgVENLaW5kLl90a19mbG9hdCA6IHJldCA9ICJmbG9hdCI7IGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBUQ0tpbmQuX3RrX2RvdWJsZSA6IHJldCA9ICJkb3VibGUiOyBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgVENLaW5kLl90a19jaGFyIDogcmV0ID0gImNoYXIiOyBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgVENLaW5kLl90a193Y2hhciA6IHJldCA9ICJjaGFyIjsgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfYm9vbGVhbiA6IHJldCA9ICJib29sZWFuIjsgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfb2N0ZXQgOiByZXQgPSAiYnl0ZSI7IGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBUQ0tpbmQuX3RrX3N0cmluZyA6IHJldCA9ICJqYXZhLmxhbmcuU3RyaW5nIjsgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfd3N0cmluZyA6IHJldCA9ICJqYXZhLmxhbmcuU3RyaW5nIjsgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfdm9pZCA6IHJldCA9ICJ2b2lkIjsgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiSW52YWxpZCBwcmltaXRpdmUgZGF0YSB0eXBlIik7DQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gcmV0Ow0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL2lkbC90eXBlcy9TZXF1ZW5jZVR5cGUuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL2lkbC90eXBlcy9TZXF1ZW5jZVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZmMTkwMC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9pZGwvdHlwZXMvU2VxdWVuY2VUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC50eXBlczsNCi0NCi1pbXBvcnQgb3JnLm9tZy5DT1JCQS5PUkI7DQotaW1wb3J0IG9yZy5vbWcuQ09SQkEuVHlwZUNvZGU7DQotDQotcHVibGljIGNsYXNzIFNlcXVlbmNlVHlwZSBleHRlbmRzIEFic3RyYWN0Q29sbGVjdGlvblR5cGUgew0KLSAgICBwcm90ZWN0ZWQgVHlwZUNvZGUgZ2VuZXJhdGVUeXBlQ29kZSgpIHsNCi0gICAgICAgIHJldHVybiBPUkIuaW5pdCgpLmNyZWF0ZV9zZXF1ZW5jZV90YyhlbGVtZW50Q291bnQsIGRhdGFUeXBlLmdldFR5cGVDb2RlKCkpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL2lkbC90eXBlcy9TdHJ1Y3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL2lkbC90eXBlcy9TdHJ1Y3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ViNGQzYmUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvaWRsL3R5cGVzL1N0cnVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5pZGwudHlwZXM7DQotDQotaW1wb3J0IG9yZy5vbWcuQ09SQkEuT1JCOw0KLWltcG9ydCBvcmcub21nLkNPUkJBLlN0cnVjdE1lbWJlcjsNCi1pbXBvcnQgb3JnLm9tZy5DT1JCQS5UeXBlQ29kZTsNCi0NCi1wdWJsaWMgY2xhc3MgU3RydWN0IGV4dGVuZHMgQ29tcG9zaXRlRGF0YVR5cGUgew0KLQ0KLSAgICBwcm90ZWN0ZWQgVHlwZUNvZGUgZ2VuZXJhdGVUeXBlQ29kZSgpew0KLSAgICAgICAgcmV0dXJuIE9SQi5pbml0KCkuY3JlYXRlX3N0cnVjdF90YyhnZXRJZCgpLCBnZXROYW1lKCksIHByZXBhaXJTdHJ1Y3RNZW1iZXJzKCkpOw0KLQl9DQotDQotICAgIHByb3RlY3RlZCBTdHJ1Y3RNZW1iZXJbXSBwcmVwYWlyU3RydWN0TWVtYmVycygpIHsNCi0gICAgICAgIFN0cnVjdE1lbWJlcltdIHN0cnVjdE1lbWJlcnMgPSBuZXcgU3RydWN0TWVtYmVyW21lbWJlcnMuc2l6ZSgpXTsNCi0NCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVtYmVycy5zaXplKCk7IGkrKykgew0KLSAgICAgICAgICAgIE1lbWJlciBtZW1iZXIgPSAoTWVtYmVyKSBtZW1iZXJzLmdldChpKTsNCi0gICAgICAgICAgICBUeXBlQ29kZSB0eXBlQ29kZSA9IG1lbWJlci5nZXREYXRhVHlwZSgpLmdldFR5cGVDb2RlKCk7DQotICAgICAgICAgICAgc3RydWN0TWVtYmVyc1tpXSA9IG5ldyBvcmcub21nLkNPUkJBLlN0cnVjdE1lbWJlcihtZW1iZXIuZ2V0TmFtZSgpLCB0eXBlQ29kZSwgbnVsbCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gc3RydWN0TWVtYmVyczsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9pZGwvdHlwZXMvVHlwZWRlZi5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvaWRsL3R5cGVzL1R5cGVkZWYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDNiMTJkNi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9pZGwvdHlwZXMvVHlwZWRlZi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5pZGwudHlwZXM7DQotDQotaW1wb3J0IG9yZy5vbWcuQ09SQkEuT1JCOw0KLWltcG9ydCBvcmcub21nLkNPUkJBLlR5cGVDb2RlOw0KLQ0KLXB1YmxpYyBjbGFzcyBUeXBlZGVmIGV4dGVuZHMgQ29tcG9zaXRlRGF0YVR5cGUgew0KLSAgICBwcml2YXRlIERhdGFUeXBlIGRhdGFUeXBlOw0KLQ0KLSAgICBwcm90ZWN0ZWQgVHlwZUNvZGUgZ2VuZXJhdGVUeXBlQ29kZSgpIHsNCi0gICAgICAgIHJldHVybiBPUkIuaW5pdCAoKS5jcmVhdGVfYWxpYXNfdGMgKGdldElkKCksIGdldE5hbWUoKSwgZGF0YVR5cGUuZ2V0VHlwZUNvZGUoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIERhdGFUeXBlIGdldERhdGFUeXBlKCkgew0KLSAgICAgICAgcmV0dXJuIGRhdGFUeXBlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldERhdGFUeXBlKERhdGFUeXBlIGRhdGFUeXBlKSB7DQotICAgICAgICB0aGlzLmRhdGFUeXBlID0gZGF0YVR5cGU7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvaWRsL3R5cGVzL1VuaW9uTWVtYmVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9pZGwvdHlwZXMvVW5pb25NZW1iZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzgxYzdiMS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9pZGwvdHlwZXMvVW5pb25NZW1iZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLnR5cGVzOw0KLQ0KLXB1YmxpYyBjbGFzcyBVbmlvbk1lbWJlciBleHRlbmRzIE1lbWJlciB7DQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0RlZmF1bHQ7DQotICAgIHByaXZhdGUgU3RyaW5nIGRpc2NyaW1pbmF0b3JWYWx1ZTsNCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0KCkgew0KLSAgICAgICAgcmV0dXJuIGlzRGVmYXVsdDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0KGJvb2xlYW4gYURlZmF1bHQpIHsNCi0gICAgICAgIGlzRGVmYXVsdCA9IGFEZWZhdWx0Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGlzY3JpbWluYXRvclZhbHVlKCkgew0KLSAgICAgICAgcmV0dXJuIGRpc2NyaW1pbmF0b3JWYWx1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXREaXNjcmltaW5hdG9yVmFsdWUoU3RyaW5nIGRpc2NyaW1pbmF0b3JWYWx1ZSkgew0KLSAgICAgICAgdGhpcy5kaXNjcmltaW5hdG9yVmFsdWUgPSBkaXNjcmltaW5hdG9yVmFsdWU7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvaWRsL3R5cGVzL1VuaW9uVHlwZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvaWRsL3R5cGVzL1VuaW9uVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjQxNTQzLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL2lkbC90eXBlcy9VbmlvblR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLnR5cGVzOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLnJlY2VpdmVycy5Db3JiYVV0aWw7DQotaW1wb3J0IG9yZy5vbWcuQ09SQkEuQW55Ow0KLWltcG9ydCBvcmcub21nLkNPUkJBLk9SQjsNCi1pbXBvcnQgb3JnLm9tZy5DT1JCQS5UeXBlQ29kZTsNCi0NCi1wdWJsaWMgY2xhc3MgVW5pb25UeXBlIGV4dGVuZHMgQ29tcG9zaXRlRGF0YVR5cGUgew0KLSAgICBwcml2YXRlIERhdGFUeXBlIGRpc2NyaW1pbmF0b3JUeXBlOw0KLQ0KLSAgICBwcm90ZWN0ZWQgVHlwZUNvZGUgZ2VuZXJhdGVUeXBlQ29kZSgpIHsNCi0gICAgICAgIE9SQiBvcmIgPSBPUkIuaW5pdCgpOw0KLSAgICAgICAgVHlwZUNvZGUgZGlzVHlwZUNvZGUgPSBkaXNjcmltaW5hdG9yVHlwZS5nZXRUeXBlQ29kZSgpOw0KLSAgICAgICAgb3JnLm9tZy5DT1JCQS5Vbmlvbk1lbWJlcltdIHVubWVtYmVycyA9IG5ldyBvcmcub21nLkNPUkJBLlVuaW9uTWVtYmVyIFttZW1iZXJzLnNpemUoKV07DQotDQotICAgICAgICBBbnkgbWVtYmVyQW55Ow0KLSAgICAgICAgVW5pb25NZW1iZXIgdW5pb25NZW1iZXI7DQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1lbWJlcnMuc2l6ZSgpOyBpKyspIHsNCi0gICAgICAgICAgICB1bmlvbk1lbWJlciA9IChVbmlvbk1lbWJlcikgbWVtYmVycy5nZXQoaSk7DQotICAgICAgICAgICAgbWVtYmVyQW55ID0gb3JiLmNyZWF0ZV9hbnkoKTsNCi0gICAgICAgICAgICBpZiAodW5pb25NZW1iZXIuaXNEZWZhdWx0KCkpIHsNCi0gICAgICAgICAgICAgICAgbWVtYmVyQW55Lmluc2VydF9vY3RldCgoYnl0ZSkgMCk7IC8vIGRlZmF1bHQgbWVtYmVyIGxhYmVsDQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgQ29yYmFVdGlsLmluc2VydFZhbHVlKG1lbWJlckFueSwgZGlzY3JpbWluYXRvclR5cGUsIENvcmJhVXRpbC5wYXJzZVZhbHVlKGRpc2NyaW1pbmF0b3JUeXBlLCB1bmlvbk1lbWJlci5nZXREaXNjcmltaW5hdG9yVmFsdWUoKSkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB1bm1lbWJlcnNbaV0gPSBuZXcgb3JnLm9tZy5DT1JCQS5Vbmlvbk1lbWJlciAoDQotICAgICAgICAgICAgICAgICAgICB1bmlvbk1lbWJlci5nZXROYW1lKCksDQotICAgICAgICAgICAgICAgICAgICBtZW1iZXJBbnksDQotICAgICAgICAgICAgICAgICAgICB1bmlvbk1lbWJlci5nZXREYXRhVHlwZSgpLmdldFR5cGVDb2RlKCksDQotICAgICAgICAgICAgICAgICAgICBudWxsKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBvcmIuY3JlYXRlX3VuaW9uX3RjIChnZXRJZCgpLCBuYW1lLCBkaXNUeXBlQ29kZSwgdW5tZW1iZXJzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgRGF0YVR5cGUgZ2V0RGlzY3JpbWluYXRvclR5cGUoKSB7DQotICAgICAgICByZXR1cm4gZGlzY3JpbWluYXRvclR5cGU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RGlzY3JpbWluYXRvclR5cGUoRGF0YVR5cGUgZGlzY3JpbWluYXRvclR5cGUpIHsNCi0gICAgICAgIHRoaXMuZGlzY3JpbWluYXRvclR5cGUgPSBkaXNjcmltaW5hdG9yVHlwZTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9pZGwvdHlwZXMvVmFsdWVUeXBlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9pZGwvdHlwZXMvVmFsdWVUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkNWEzYTAuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvaWRsL3R5cGVzL1ZhbHVlVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5pZGwudHlwZXM7DQotDQotaW1wb3J0IG9yZy5vbWcuQ09SQkEuT1JCOw0KLWltcG9ydCBvcmcub21nLkNPUkJBLlRDS2luZDsNCi1pbXBvcnQgb3JnLm9tZy5DT1JCQS5UeXBlQ29kZTsNCi1pbXBvcnQgb3JnLm9tZy5DT1JCQS5UeXBlQ29kZVBhY2thZ2UuQmFkS2luZDsNCi1pbXBvcnQgb3JnLm9tZy5DT1JCQS5WYWx1ZU1lbWJlcjsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotDQotcHVibGljIGNsYXNzIFZhbHVlVHlwZSBleHRlbmRzIENvbXBvc2l0ZURhdGFUeXBlIHsNCi0JcHJpdmF0ZSBqYXZhLnV0aWwuTWFwIG9wZXJhdGlvbnM7DQotDQotCXByb3RlY3RlZCBvcmcub21nLkNPUkJBLlR5cGVDb2RlIGdlbmVyYXRlVHlwZUNvZGUoKXsNCi0gICAgICAgIE9SQiBvcmIgPSBPUkIuaW5pdCgpOw0KLSAgICAgICAgVmFsdWVNZW1iZXJbXSB2YWx1ZU1lbWJlcnMgPSBuZXcgVmFsdWVNZW1iZXJbbWVtYmVycy5zaXplKCldOw0KLSAgICAgICAgU3RyaW5nIGlkID0gZ2V0SWQoKTsNCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVtYmVycy5zaXplKCk7IGkrKykgew0KLSAgICAgICAgICAgIE1lbWJlciBtZW1iZXIgPSAoTWVtYmVyKSBtZW1iZXJzLmdldChpKTsNCi0gICAgICAgICAgICBUeXBlQ29kZSB0eXBlQ29kZSA9IG1lbWJlci5nZXREYXRhVHlwZSgpLmdldFR5cGVDb2RlKCk7DQotICAgICAgICAgICAgVENLaW5kIGtpbmQgPSB0eXBlQ29kZS5raW5kKCk7DQotICAgICAgICAgICAgc3dpdGNoKGtpbmQudmFsdWUoKSkgew0KLSAgICAgICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfdmFsdWUgOg0KLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1lbWJlclR5cGVJZCA9ICIiOw0KLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtZW1iZXJUeXBlSWQgPSB0eXBlQ29kZS5pZCgpOw0KLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoQmFkS2luZCBiYWRLaW5kKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgYmFkS2luZC5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlTWVtYmVyc1tpXSA9IG5ldyBvcmcub21nLkNPUkJBLlZhbHVlTWVtYmVyKG1lbWJlci5nZXROYW1lKCksIG1lbWJlclR5cGVJZCwgaWQsICIiLCB0eXBlQ29kZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCxvcmcub21nLkNPUkJBLlBSSVZBVEVfTUVNQkVSLnZhbHVlKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgICAgICAgICAgdmFsdWVNZW1iZXJzW2ldID0gbmV3IG9yZy5vbWcuQ09SQkEuVmFsdWVNZW1iZXIobWVtYmVyLmdldE5hbWUoKSwgIiIsIGlkLCAiIiwgdHlwZUNvZGUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsb3JnLm9tZy5DT1JCQS5QUklWQVRFX01FTUJFUi52YWx1ZSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gb3JiLmNyZWF0ZV92YWx1ZV90YyAoaWQsIGdldE5hbWUoKSwgKHNob3J0KTAsIG51bGwsIHZhbHVlTWVtYmVycyk7DQotCX0NCi0NCi0vLyAgICBwdWJsaWMgQ2xhc3MgZ2V0SmF2YVR5cGUoKSB7DQotLy8gICAgICAgIHJldHVybiBPYmplY3RCeVZhbHVlLmNsYXNzOw0KLS8vICAgIH0NCi0NCi0gICAgcHVibGljIGphdmEudXRpbC5NYXAgZ2V0T3BlcmF0aW9ucygpIHsNCi0gICAgICAgIHJldHVybiBvcGVyYXRpb25zOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE9wZXJhdGlvbnMoamF2YS51dGlsLk1hcCBvcGVyYXRpb25zKSB7DQotICAgICAgICB0aGlzLm9wZXJhdGlvbnMgPSBvcGVyYXRpb25zOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGFkZE9wZXJhdGlvbihPcGVyYXRpb24gb3BlcmF0aW9uKSB7DQotICAgICAgICBpZiAob3BlcmF0aW9ucyA9PSBudWxsKQ0KLSAgICAgICAgICAgIG9wZXJhdGlvbnMgPSBuZXcgSGFzaE1hcCgpOw0KLSAgICAgICAgb3BlcmF0aW9ucy5wdXQob3BlcmF0aW9uLmdldE5hbWUoKSwgb3BlcmF0aW9uKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9pZGwvdmFsdWVzL0Fic3RyYWN0Q29sbGVjdGlvblZhbHVlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9pZGwvdmFsdWVzL0Fic3RyYWN0Q29sbGVjdGlvblZhbHVlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlZjk1OGQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvaWRsL3ZhbHVlcy9BYnN0cmFjdENvbGxlY3Rpb25WYWx1ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5pZGwudmFsdWVzOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC50eXBlcy5BYnN0cmFjdENvbGxlY3Rpb25UeXBlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC50eXBlcy5Db21wb3NpdGVEYXRhVHlwZTsNCi1pbXBvcnQgb3JnLm9tZy5DT1JCQV8yXzMucG9ydGFibGUuSW5wdXRTdHJlYW07DQotaW1wb3J0IG9yZy5vbWcuQ09SQkFfMl8zLnBvcnRhYmxlLk91dHB1dFN0cmVhbTsNCi0NCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RDb2xsZWN0aW9uVmFsdWUgZXh0ZW5kcyBBYnN0cmFjdFZhbHVlIHsNCi0gICAgcHJvdGVjdGVkIE9iamVjdFtdIHZhbHVlcyA9IG51bGw7DQotDQotICAgIHB1YmxpYyBBYnN0cmFjdENvbGxlY3Rpb25WYWx1ZShDb21wb3NpdGVEYXRhVHlwZSBkYXRhVHlwZSkgew0KLSAgICAgICAgc3VwZXIoZGF0YVR5cGUpOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgQWJzdHJhY3RDb2xsZWN0aW9uVmFsdWUoQWJzdHJhY3RDb2xsZWN0aW9uVHlwZSBkYXRhVHlwZSkgew0KLSAgICAgICAgc3VwZXIoZGF0YVR5cGUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBPYmplY3RbXSBnZXRWYWx1ZXMoKSB7DQotICAgICAgICByZXR1cm4gdmFsdWVzOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlcyhPYmplY3RbXSB2YWx1ZXMpIHsNCi0gICAgICAgIHRoaXMudmFsdWVzID0gdmFsdWVzOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHJlYWQoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pOw0KLQ0KLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCB3cml0ZShPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtKTsNCi0NCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCi0gICAgICAgIEFic3RyYWN0Q29sbGVjdGlvblR5cGUgY29sbGVjdGlvblR5cGUgPSAoQWJzdHJhY3RDb2xsZWN0aW9uVHlwZSkgZGF0YVR5cGU7DQotICAgICAgICBTdHJpbmcgdHlwZSA9IG51bGw7DQotICAgICAgICBpZiAoY29sbGVjdGlvblR5cGUuaXNBcnJheSgpKQ0KLSAgICAgICAgICAgIHR5cGUgPSAiQXJyYXk6ICI7DQotICAgICAgICBlbHNlIGlmIChjb2xsZWN0aW9uVHlwZS5pc1NlcXVlbmNlKCkpDQotICAgICAgICAgICAgdHlwZSA9ICJTZXF1ZW5jZTogIjsNCi0gICAgICAgIHJldHVybiB0eXBlICsgY29sbGVjdGlvbjJTdHJpbmcodmFsdWVzKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyBjb2xsZWN0aW9uMlN0cmluZyhPYmplY3RbXSBjb2xsZWN0aW9uVmFsdWVzKSB7DQotICAgICAgICBTdHJpbmdCdWZmZXIgc3RyID0gbmV3IFN0cmluZ0J1ZmZlcigpOw0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb2xsZWN0aW9uVmFsdWVzLmxlbmd0aDsgaSsrKSB7DQotICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gY29sbGVjdGlvblZhbHVlc1tpXTsNCi0gICAgICAgICAgICBTdHJpbmcgZWxlbTsNCi0gICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBPYmplY3RbXSkgew0KLSAgICAgICAgICAgICAgICBlbGVtID0gY29sbGVjdGlvbjJTdHJpbmcoKE9iamVjdFtdKSB2YWx1ZSk7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgICAgIGVsZW0gPSB2YWx1ZS50b1N0cmluZygpOw0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgZWxlbSA9ICJudWxsIjsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBzdHIuYXBwZW5kKCIsICIpOw0KLSAgICAgICAgICAgIHN0ci5hcHBlbmQoZWxlbSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gInsiICsgc3RyLnN1YnN0cmluZygyKSArICJ9IjsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9pZGwvdmFsdWVzL0Fic3RyYWN0VmFsdWUuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL2lkbC92YWx1ZXMvQWJzdHJhY3RWYWx1ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNGEzZjVjLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL2lkbC92YWx1ZXMvQWJzdHJhY3RWYWx1ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLnZhbHVlczsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5pZGwudHlwZXMuQXJyYXlUeXBlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC50eXBlcy5Db21wb3NpdGVEYXRhVHlwZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5pZGwudHlwZXMuRGF0YVR5cGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLnR5cGVzLkVudW1UeXBlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC50eXBlcy5FeGNlcHRpb25UeXBlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC50eXBlcy5NZW1iZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLnR5cGVzLlNlcXVlbmNlVHlwZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5pZGwudHlwZXMuU3RydWN0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC50eXBlcy5UeXBlZGVmOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC50eXBlcy5VbmlvblR5cGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi1pbXBvcnQgb3JnLm9tZy5DT1JCQS5Bbnk7DQotaW1wb3J0IG9yZy5vbWcuQ09SQkEuVENLaW5kOw0KLWltcG9ydCBvcmcub21nLkNPUkJBLlR5cGVDb2RlOw0KLWltcG9ydCBvcmcub21nLkNPUkJBXzJfMy5wb3J0YWJsZS5JbnB1dFN0cmVhbTsNCi1pbXBvcnQgb3JnLm9tZy5DT1JCQV8yXzMucG9ydGFibGUuT3V0cHV0U3RyZWFtOw0KLQ0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsNCi0NCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RWYWx1ZSB7DQotICAgIHByb3RlY3RlZCBPYmplY3RbXSBtZW1iZXJWYWx1ZXM7DQotICAgIHByb3RlY3RlZCBDb21wb3NpdGVEYXRhVHlwZSBkYXRhVHlwZTsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEFic3RyYWN0VmFsdWUuY2xhc3MpOw0KLQ0KLSAgICBwcm90ZWN0ZWQgQWJzdHJhY3RWYWx1ZSAoQ29tcG9zaXRlRGF0YVR5cGUgZGF0YVR5cGUpIHsNCi0gICAgICAgIHRoaXMuZGF0YVR5cGUgPSBkYXRhVHlwZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTWVtYmVyW10gZ2V0TWVtYmVycygpIHsNCi0gICAgICAgIHJldHVybiBkYXRhVHlwZS5nZXRNZW1iZXJzKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TWVtYmVyVmFsdWVzKE9iamVjdFtdIG1lbWJlclZhbHVlcykgew0KLSAgICAgICAgdGhpcy5tZW1iZXJWYWx1ZXMgPSBtZW1iZXJWYWx1ZXM7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE9iamVjdFtdIGdldE1lbWJlclZhbHVlcygpIHsNCi0gICAgICAgIHJldHVybiBtZW1iZXJWYWx1ZXM7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFR5cGVDb2RlIGdldFR5cGVDb2RlKCkgew0KLSAgICAgICAgcmV0dXJuIGRhdGFUeXBlLmdldFR5cGVDb2RlKCk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgd3JpdGUoT2JqZWN0IHZhbHVlLCBEYXRhVHlwZSBkYXRhVHlwZSwgT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSkgew0KLSAgICAgICAgVENLaW5kIGtpbmQgPSBkYXRhVHlwZS5nZXRUeXBlQ29kZSgpLmtpbmQoKTsNCi0gICAgICAgIHN3aXRjaChraW5kLnZhbHVlKCkpIHsNCi0gICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfbG9uZyA6IG91dHB1dFN0cmVhbS53cml0ZV9sb25nKCgoSW50ZWdlcikgdmFsdWUpLmludFZhbHVlKCkpOyBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfdWxvbmcgOiBvdXRwdXRTdHJlYW0ud3JpdGVfdWxvbmcoKChJbnRlZ2VyKSB2YWx1ZSkuaW50VmFsdWUoKSk7IGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgVENLaW5kLl90a19sb25nbG9uZyA6IG91dHB1dFN0cmVhbS53cml0ZV9sb25nbG9uZygoKExvbmcpIHZhbHVlKS5sb25nVmFsdWUoKSk7IGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgVENLaW5kLl90a191bG9uZ2xvbmcgOiBvdXRwdXRTdHJlYW0ud3JpdGVfdWxvbmdsb25nKCgoTG9uZykgdmFsdWUpLmxvbmdWYWx1ZSgpKTsgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBUQ0tpbmQuX3RrX3Nob3J0IDogb3V0cHV0U3RyZWFtLndyaXRlX3Nob3J0KCgoU2hvcnQpIHZhbHVlKS5zaG9ydFZhbHVlKCkpOyBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfdXNob3J0IDogb3V0cHV0U3RyZWFtLndyaXRlX3VzaG9ydCgoKFNob3J0KSB2YWx1ZSkuc2hvcnRWYWx1ZSgpKTsgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBUQ0tpbmQuX3RrX2Zsb2F0IDogb3V0cHV0U3RyZWFtLndyaXRlX2Zsb2F0KCgoRmxvYXQpIHZhbHVlKS5mbG9hdFZhbHVlKCkpOyBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfZG91YmxlIDogb3V0cHV0U3RyZWFtLndyaXRlX2RvdWJsZSgoKERvdWJsZSkgdmFsdWUpLmZsb2F0VmFsdWUoKSk7IGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgVENLaW5kLl90a19jaGFyIDogb3V0cHV0U3RyZWFtLndyaXRlX2NoYXIoKChDaGFyYWN0ZXIpIHZhbHVlKS5jaGFyVmFsdWUoKSk7IGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgVENLaW5kLl90a193Y2hhciA6IG91dHB1dFN0cmVhbS53cml0ZV93Y2hhcigoKENoYXJhY3RlcikgdmFsdWUpLmNoYXJWYWx1ZSgpKTsgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBUQ0tpbmQuX3RrX2Jvb2xlYW4gOiBvdXRwdXRTdHJlYW0ud3JpdGVfYm9vbGVhbigoKEJvb2xlYW4pIHZhbHVlKS5ib29sZWFuVmFsdWUoKSk7IGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgVENLaW5kLl90a19vY3RldCA6IG91dHB1dFN0cmVhbS53cml0ZV9vY3RldCgoKEJ5dGUpIHZhbHVlKS5ieXRlVmFsdWUoKSk7IGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgVENLaW5kLl90a19zdHJpbmcgOiBvdXRwdXRTdHJlYW0ud3JpdGVfc3RyaW5nKChTdHJpbmcpIHZhbHVlKTsgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBUQ0tpbmQuX3RrX3dzdHJpbmcgOiBvdXRwdXRTdHJlYW0ud3JpdGVfd3N0cmluZygoU3RyaW5nKSB2YWx1ZSk7IGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgVENLaW5kLl90a19hbnkgOiBvdXRwdXRTdHJlYW0ud3JpdGVfYW55KChBbnkpIHZhbHVlKTsgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBUQ0tpbmQuX3RrX3ZhbHVlIDogb3V0cHV0U3RyZWFtLndyaXRlX3ZhbHVlKChTZXJpYWxpemFibGUpIHZhbHVlKTsgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBUQ0tpbmQuX3RrX3N0cnVjdCA6ICgoU3RydWN0VmFsdWUpIHZhbHVlKS53cml0ZShvdXRwdXRTdHJlYW0pOyBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfZW51bSA6ICgoRW51bVZhbHVlKSB2YWx1ZSkud3JpdGUob3V0cHV0U3RyZWFtKTsgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBUQ0tpbmQuX3RrX3VuaW9uOiAoKFVuaW9uVmFsdWUpIHZhbHVlKS53cml0ZShvdXRwdXRTdHJlYW0pOyBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfYWxpYXM6ICgoQWxpYXNWYWx1ZSkgdmFsdWUpLndyaXRlKG91dHB1dFN0cmVhbSk7IGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgVENLaW5kLl90a19zZXF1ZW5jZTogKChTZXF1ZW5jZVZhbHVlKSB2YWx1ZSkud3JpdGUob3V0cHV0U3RyZWFtKTsgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBUQ0tpbmQuX3RrX2FycmF5OiAoKEFycmF5VmFsdWUpIHZhbHVlKS53cml0ZShvdXRwdXRTdHJlYW0pOyBicmVhazsNCi0gICAgICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIkVSUk9SISBJbnZhbGlkIGRhdGFUeXBlIik7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBPYmplY3QgcmVhZChEYXRhVHlwZSBkYXRhVHlwZSwgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHsNCi0gICAgICAgIFRDS2luZCBraW5kID0gZGF0YVR5cGUuZ2V0VHlwZUNvZGUoKS5raW5kKCk7DQotICAgICAgICBPYmplY3QgcmV0ID0gbnVsbDsNCi0gICAgICAgIHN3aXRjaChraW5kLnZhbHVlKCkpIHsNCi0gICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfbG9uZzogcmV0ID0gbmV3IEludGVnZXIoaW5wdXRTdHJlYW0ucmVhZF9sb25nKCkpOyBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfdWxvbmc6IHJldCA9IG5ldyBJbnRlZ2VyKGlucHV0U3RyZWFtLnJlYWRfdWxvbmcoKSk7IGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgVENLaW5kLl90a19sb25nbG9uZzogcmV0ID0gbmV3IExvbmcoaW5wdXRTdHJlYW0ucmVhZF9sb25nbG9uZygpKTsgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBUQ0tpbmQuX3RrX3Vsb25nbG9uZzogcmV0ID0gbmV3IExvbmcoaW5wdXRTdHJlYW0ucmVhZF91bG9uZ2xvbmcoKSk7IGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgVENLaW5kLl90a19zaG9ydDogcmV0ID0gbmV3IFNob3J0KGlucHV0U3RyZWFtLnJlYWRfc2hvcnQoKSk7IGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgVENLaW5kLl90a191c2hvcnQ6IHJldCA9IG5ldyBTaG9ydChpbnB1dFN0cmVhbS5yZWFkX3VzaG9ydCgpKTsgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBUQ0tpbmQuX3RrX2Zsb2F0OiByZXQgPSBuZXcgRmxvYXQoaW5wdXRTdHJlYW0ucmVhZF9mbG9hdCgpKTsgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBUQ0tpbmQuX3RrX2RvdWJsZTogcmV0ID0gbmV3IERvdWJsZShpbnB1dFN0cmVhbS5yZWFkX2RvdWJsZSgpKTsgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBUQ0tpbmQuX3RrX2NoYXI6IHJldCA9IG5ldyBDaGFyYWN0ZXIoaW5wdXRTdHJlYW0ucmVhZF9jaGFyKCkpOyBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfd2NoYXI6IHJldCA9IG5ldyBDaGFyYWN0ZXIoaW5wdXRTdHJlYW0ucmVhZF93Y2hhcigpKTsgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBUQ0tpbmQuX3RrX2Jvb2xlYW46IHJldCA9IEJvb2xlYW4udmFsdWVPZihpbnB1dFN0cmVhbS5yZWFkX2Jvb2xlYW4oKSk7IGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgVENLaW5kLl90a19vY3RldDogcmV0ID0gbmV3IEJ5dGUoaW5wdXRTdHJlYW0ucmVhZF9vY3RldCgpKTsgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBUQ0tpbmQuX3RrX3N0cmluZzogcmV0ID0gaW5wdXRTdHJlYW0ucmVhZF9zdHJpbmcoKTsgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBUQ0tpbmQuX3RrX3dzdHJpbmc6IHJldCA9IGlucHV0U3RyZWFtLnJlYWRfd3N0cmluZygpOyBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfYW55OiByZXQgPSBpbnB1dFN0cmVhbS5yZWFkX2FueSgpOyBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfdmFsdWU6IHJldCA9IGlucHV0U3RyZWFtLnJlYWRfdmFsdWUoKTsgYnJlYWs7DQotICAgICAgICAgICAgLy9jYXNlIFRDS2luZC5fdGtfbG9uZ2RvdWJsZSA6DQotICAgICAgICAgICAgY2FzZSBUQ0tpbmQuX3RrX3N0cnVjdDoNCi0gICAgICAgICAgICAgICAgU3RydWN0VmFsdWUgc3RydWN0VmFsdWUgPSBuZXcgU3RydWN0VmFsdWUoKFN0cnVjdCkgZGF0YVR5cGUpOw0KLSAgICAgICAgICAgICAgICBzdHJ1Y3RWYWx1ZS5yZWFkKGlucHV0U3RyZWFtKTsNCi0gICAgICAgICAgICAgICAgcmV0ID0gc3RydWN0VmFsdWU7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgVENLaW5kLl90a19lbnVtOg0KLSAgICAgICAgICAgICAgICBFbnVtVmFsdWUgZW51bVZhbHVlID0gbmV3IEVudW1WYWx1ZSgoRW51bVR5cGUpIGRhdGFUeXBlKTsNCi0gICAgICAgICAgICAgICAgZW51bVZhbHVlLnJlYWQoaW5wdXRTdHJlYW0pOw0KLSAgICAgICAgICAgICAgICByZXQgPSBlbnVtVmFsdWU7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgVENLaW5kLl90a191bmlvbjoNCi0gICAgICAgICAgICAgICAgVW5pb25WYWx1ZSB1bmlvblZhbHVlID0gbmV3IFVuaW9uVmFsdWUoKFVuaW9uVHlwZSkgZGF0YVR5cGUpOw0KLSAgICAgICAgICAgICAgICB1bmlvblZhbHVlLnJlYWQoaW5wdXRTdHJlYW0pOw0KLSAgICAgICAgICAgICAgICByZXQgPSB1bmlvblZhbHVlOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfYWxpYXM6DQotICAgICAgICAgICAgICAgIEFsaWFzVmFsdWUgYWxpYXNWYWx1ZSA9IG5ldyBBbGlhc1ZhbHVlKChUeXBlZGVmKSBkYXRhVHlwZSk7DQotICAgICAgICAgICAgICAgIGFsaWFzVmFsdWUucmVhZChpbnB1dFN0cmVhbSk7DQotICAgICAgICAgICAgICAgIHJldCA9IGFsaWFzVmFsdWU7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgVENLaW5kLl90a19zZXF1ZW5jZToNCi0gICAgICAgICAgICAgICAgU2VxdWVuY2VWYWx1ZSBzZXF1ZW5jZVZhbHVlID0gbmV3IFNlcXVlbmNlVmFsdWUoKFNlcXVlbmNlVHlwZSkgZGF0YVR5cGUpOw0KLSAgICAgICAgICAgICAgICBzZXF1ZW5jZVZhbHVlLnJlYWQoaW5wdXRTdHJlYW0pOw0KLSAgICAgICAgICAgICAgICByZXQgPSBzZXF1ZW5jZVZhbHVlOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfYXJyYXk6DQotICAgICAgICAgICAgICAgIEFycmF5VmFsdWUgYXJyYXlWYWx1ZSA9IG5ldyBBcnJheVZhbHVlKChBcnJheVR5cGUpIGRhdGFUeXBlKTsNCi0gICAgICAgICAgICAgICAgYXJyYXlWYWx1ZS5yZWFkKGlucHV0U3RyZWFtKTsNCi0gICAgICAgICAgICAgICAgcmV0ID0gYXJyYXlWYWx1ZTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBUQ0tpbmQuX3RrX2V4Y2VwdDoNCi0gICAgICAgICAgICAgICAgRXhjZXB0aW9uVmFsdWUgZXhWYWx1ZSA9IG5ldyBFeGNlcHRpb25WYWx1ZSgoRXhjZXB0aW9uVHlwZSkgZGF0YVR5cGUpOw0KLSAgICAgICAgICAgICAgICBleFZhbHVlLnJlYWQoaW5wdXRTdHJlYW0pOw0KLSAgICAgICAgICAgICAgICByZXQgPSBleFZhbHVlOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIkVSUk9SISBJbnZhbGlkIGRhdGFUeXBlIik7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHJldDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KLSAgICAgICAgTWVtYmVyW10gbWVtYmVycyA9IGdldE1lbWJlcnMoKTsNCi0gICAgICAgIFN0cmluZyByZXQgPSAiQ29tcG9zaXRlRGF0YVR5cGUgbmFtZTogIiArIGRhdGFUeXBlLmdldE1vZHVsZSgpICsgZGF0YVR5cGUuZ2V0TmFtZSgpICsgJ1xuJzsNCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVtYmVycy5sZW5ndGg7IGkrKykgew0KLSAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IG1lbWJlclZhbHVlc1tpXTsNCi0gICAgICAgICAgICByZXQgKz0gJ1x0JyArIG1lbWJlcnNbaV0uZ2V0TmFtZSgpICsgIjogIiArIHZhbHVlICsgJ1xuJzsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiByZXQ7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvaWRsL3ZhbHVlcy9BbGlhc1ZhbHVlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9pZGwvdmFsdWVzL0FsaWFzVmFsdWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFhMTA4OC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9pZGwvdmFsdWVzL0FsaWFzVmFsdWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLnZhbHVlczsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5pZGwudHlwZXMuVHlwZWRlZjsNCi1pbXBvcnQgb3JnLm9tZy5DT1JCQV8yXzMucG9ydGFibGUuSW5wdXRTdHJlYW07DQotaW1wb3J0IG9yZy5vbWcuQ09SQkFfMl8zLnBvcnRhYmxlLk91dHB1dFN0cmVhbTsNCi0NCi1wdWJsaWMgY2xhc3MgQWxpYXNWYWx1ZSBleHRlbmRzIEFic3RyYWN0VmFsdWUgew0KLSAgICBwcml2YXRlIE9iamVjdCB2YWx1ZTsNCi0gICAgcHVibGljIEFsaWFzVmFsdWUoVHlwZWRlZiBkYXRhVHlwZSkgew0KLSAgICAgICAgc3VwZXIoZGF0YVR5cGUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7DQotICAgICAgICByZXR1cm4gdmFsdWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWUoT2JqZWN0IHZhbHVlKSB7DQotICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgcmVhZChJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgew0KLSAgICAgICAgdmFsdWUgPSByZWFkKCgoVHlwZWRlZikgZGF0YVR5cGUpLmdldERhdGFUeXBlKCksIGlucHV0U3RyZWFtKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZShPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtKSB7DQotICAgICAgICB3cml0ZSh2YWx1ZSwgKChUeXBlZGVmKSBkYXRhVHlwZSkuZ2V0RGF0YVR5cGUoKSwgb3V0cHV0U3RyZWFtKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KLSAgICAgICAgcmV0dXJuICh2YWx1ZSA9PSBudWxsKT8gIiBOVUxMIHZhbHVlIiA6ICJBbGlhcyBvZjogIiArIHZhbHVlLnRvU3RyaW5nKCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvaWRsL3ZhbHVlcy9BcnJheVZhbHVlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9pZGwvdmFsdWVzL0FycmF5VmFsdWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ1YzFmNy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9pZGwvdmFsdWVzL0FycmF5VmFsdWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLnZhbHVlczsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5pZGwudHlwZXMuQWJzdHJhY3RDb2xsZWN0aW9uVHlwZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5pZGwudHlwZXMuQXJyYXlUeXBlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC50eXBlcy5EYXRhVHlwZTsNCi1pbXBvcnQgb3JnLm9tZy5DT1JCQV8yXzMucG9ydGFibGUuSW5wdXRTdHJlYW07DQotaW1wb3J0IG9yZy5vbWcuQ09SQkFfMl8zLnBvcnRhYmxlLk91dHB1dFN0cmVhbTsNCi0NCi1wdWJsaWMgY2xhc3MgQXJyYXlWYWx1ZSBleHRlbmRzIEFic3RyYWN0Q29sbGVjdGlvblZhbHVlIHsNCi0gICAgcHVibGljIEFycmF5VmFsdWUoQXJyYXlUeXBlIGFycmF5VHlwZSkgew0KLSAgICAgICAgc3VwZXIoYXJyYXlUeXBlKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCByZWFkKElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB7DQotICAgICAgICBBYnN0cmFjdENvbGxlY3Rpb25UeXBlIGNvbGxlY3Rpb25UeXBlID0gKEFic3RyYWN0Q29sbGVjdGlvblR5cGUpIGRhdGFUeXBlOw0KLSAgICAgICAgRGF0YVR5cGUgbWVtYmVyVHlwZSA9IGNvbGxlY3Rpb25UeXBlLmdldERhdGFUeXBlKCk7DQotICAgICAgICBpbnQgbGVuZ3RoID0gY29sbGVjdGlvblR5cGUuZ2V0RWxlbWVudENvdW50KCk7DQotICAgICAgICB2YWx1ZXMgPSBuZXcgT2JqZWN0W2xlbmd0aF07DQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7DQotICAgICAgICAgICAgdmFsdWVzW2ldID0gcmVhZChtZW1iZXJUeXBlLCBpbnB1dFN0cmVhbSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgd3JpdGUoT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSkgew0KLSAgICAgICAgQWJzdHJhY3RDb2xsZWN0aW9uVHlwZSBjb2xsZWN0aW9uVHlwZSA9IChBYnN0cmFjdENvbGxlY3Rpb25UeXBlKSBkYXRhVHlwZTsNCi0gICAgICAgIERhdGFUeXBlIG1lbWJlclR5cGUgPSBjb2xsZWN0aW9uVHlwZS5nZXREYXRhVHlwZSgpOw0KLSAgICAgICAgaW50IGxlbmd0aCA9IGNvbGxlY3Rpb25UeXBlLmdldEVsZW1lbnRDb3VudCgpOw0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgew0KLSAgICAgICAgICAgIHdyaXRlKHZhbHVlc1tpXSwgbWVtYmVyVHlwZSwgb3V0cHV0U3RyZWFtKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9pZGwvdmFsdWVzL0VudW1WYWx1ZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvaWRsL3ZhbHVlcy9FbnVtVmFsdWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZiNjc2NS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9pZGwvdmFsdWVzL0VudW1WYWx1ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5pZGwudmFsdWVzOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC50eXBlcy5FbnVtVHlwZTsNCi1pbXBvcnQgb3JnLm9tZy5DT1JCQV8yXzMucG9ydGFibGUuSW5wdXRTdHJlYW07DQotaW1wb3J0IG9yZy5vbWcuQ09SQkFfMl8zLnBvcnRhYmxlLk91dHB1dFN0cmVhbTsNCi0NCi1wdWJsaWMgY2xhc3MgRW51bVZhbHVlIGV4dGVuZHMgQWJzdHJhY3RWYWx1ZSB7DQotICAgIHByaXZhdGUgaW50IGluZGV4Ow0KLQ0KLSAgICBwdWJsaWMgRW51bVZhbHVlKEVudW1UeXBlIGVudW1UeXBlKSB7DQotICAgICAgICBzdXBlcihlbnVtVHlwZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWUoaW50IGluZGV4KSB7DQotICAgICAgICB0aGlzLmluZGV4ID0gaW5kZXg7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGludCBnZXRWYWx1ZSgpIHsNCi0gICAgICAgIHJldHVybiBpbmRleDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlQXNTdHJpbmcoKSB7DQotICAgICAgICByZXR1cm4gKFN0cmluZykgKChFbnVtVHlwZSkgZGF0YVR5cGUpLmdldEVudW1NZW1iZXJzKCkuZ2V0KGluZGV4KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KLSAgICAgICAgcmV0dXJuIGRhdGFUeXBlLmdldE1vZHVsZSgpICsgZGF0YVR5cGUuZ2V0TmFtZSgpICsgIiA6ICIgKyBpbmRleDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCByZWFkKElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB7DQotICAgICAgICBpbmRleCA9IGlucHV0U3RyZWFtLnJlYWRfbG9uZygpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHdyaXRlKE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0pIHsNCi0gICAgICAgIG91dHB1dFN0cmVhbS53cml0ZV9sb25nKGluZGV4KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsNCi0gICAgICAgIGlmIChvIGluc3RhbmNlb2YgRW51bVZhbHVlKSB7DQotICAgICAgICAgICAgaWYgKGdldFZhbHVlQXNTdHJpbmcoKS5lcXVhbHMoKChFbnVtVmFsdWUpIG8pLmdldFZhbHVlQXNTdHJpbmcoKSkpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL2lkbC92YWx1ZXMvRXhjZXB0aW9uVmFsdWUuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL2lkbC92YWx1ZXMvRXhjZXB0aW9uVmFsdWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc3ZTFjYi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9pZGwvdmFsdWVzL0V4Y2VwdGlvblZhbHVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC52YWx1ZXM7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29yYmEuZXhjZXB0aW9ucy5Db3JiYUludm9jYXRpb25FeGNlcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLnR5cGVzLkV4Y2VwdGlvblR5cGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLnR5cGVzLk1lbWJlcjsNCi1pbXBvcnQgb3JnLm9tZy5DT1JCQV8yXzMucG9ydGFibGUuSW5wdXRTdHJlYW07DQotDQotcHVibGljIGNsYXNzIEV4Y2VwdGlvblZhbHVlIGV4dGVuZHMgQWJzdHJhY3RWYWx1ZSB7DQotDQotICAgIHB1YmxpYyBFeGNlcHRpb25WYWx1ZShFeGNlcHRpb25UeXBlIGV4Y2VwdGlvblR5cGUpIHsNCi0gICAgICAgIHN1cGVyKGV4Y2VwdGlvblR5cGUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHJlYWQoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHsNCi0gICAgICAgIE1lbWJlcltdIG1lbWJlcnMgPSBnZXRNZW1iZXJzKCk7DQotICAgICAgICBPYmplY3RbXSBtZW1iZXJWYWx1ZXMgPSBuZXcgT2JqZWN0W21lbWJlcnMubGVuZ3RoXTsNCi0gICAgICAgIGlmICghZGF0YVR5cGUuZ2V0SWQoKS5lcXVhbHMoaW5wdXRTdHJlYW0ucmVhZF9zdHJpbmcoKSkpDQotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIk1pc21hY2hpbmcgSURzIik7DQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1lbWJlcnMubGVuZ3RoOyBpKyspIHsNCi0gICAgICAgICAgICBtZW1iZXJWYWx1ZXNbaV0gPSByZWFkKG1lbWJlcnNbaV0uZ2V0RGF0YVR5cGUoKSwgaW5wdXRTdHJlYW0pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgc2V0TWVtYmVyVmFsdWVzKG1lbWJlclZhbHVlcyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIENvcmJhSW52b2NhdGlvbkV4Y2VwdGlvbiBnZXRFeGNlcHRpb24oKSB7DQotICAgICAgICByZXR1cm4gbmV3IENvcmJhSW52b2NhdGlvbkV4Y2VwdGlvbih0b1N0cmluZygpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KLSAgICAgICAgTWVtYmVyW10gbWVtYmVycyA9IGdldE1lbWJlcnMoKTsNCi0gICAgICAgIFN0cmluZyByZXQgPSAiRXhjZXB0aW9uIG5hbWU6ICIgKyBkYXRhVHlwZS5nZXRNb2R1bGUoKSArIGRhdGFUeXBlLmdldE5hbWUoKSArICdcbic7DQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1lbWJlcnMubGVuZ3RoOyBpKyspIHsNCi0gICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBtZW1iZXJWYWx1ZXNbaV07DQotICAgICAgICAgICAgcmV0ICs9ICdcdCcgKyBtZW1iZXJzW2ldLmdldE5hbWUoKSArICI6ICIgKyB2YWx1ZSArICdcbic7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gcmV0Ow0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL2lkbC92YWx1ZXMvT2JqZWN0QnlWYWx1ZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvaWRsL3ZhbHVlcy9PYmplY3RCeVZhbHVlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0MzM3YmMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvaWRsL3ZhbHVlcy9PYmplY3RCeVZhbHVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC52YWx1ZXM7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLnR5cGVzLk1lbWJlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5pZGwudHlwZXMuVmFsdWVUeXBlOw0KLWltcG9ydCBvcmcub21nLkNPUkJBLlR5cGVDb2RlOw0KLWltcG9ydCBvcmcub21nLkNPUkJBLnBvcnRhYmxlLklucHV0U3RyZWFtOw0KLWltcG9ydCBvcmcub21nLkNPUkJBLnBvcnRhYmxlLk91dHB1dFN0cmVhbTsNCi0NCi1wdWJsaWMgY2xhc3MgT2JqZWN0QnlWYWx1ZSBleHRlbmRzIEFic3RyYWN0VmFsdWUgaW1wbGVtZW50cyBvcmcub21nLkNPUkJBLnBvcnRhYmxlLlN0cmVhbWFibGVWYWx1ZSB7DQotDQotICAgIHB1YmxpYyBPYmplY3RCeVZhbHVlKFZhbHVlVHlwZSB2YWx1ZVR5cGUpIHsNCi0gICAgICAgIHN1cGVyKHZhbHVlVHlwZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgX3JlYWQoSW5wdXRTdHJlYW0gaXMpIHsNCi0gICAgICAgIHJlYWQoaXMpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIF93cml0ZShPdXRwdXRTdHJlYW0gb3MpIHsNCi0gICAgICAgIHdyaXRlKG9zKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgVHlwZUNvZGUgX3R5cGUoKSB7DQotICAgICAgICByZXR1cm4gZGF0YVR5cGUuZ2V0VHlwZUNvZGUoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nW10gX3RydW5jYXRhYmxlX2lkcygpIHsNCi0gICAgICAgIHJldHVybiBuZXcgU3RyaW5nW10ge2RhdGFUeXBlLmdldElkKCl9Ow0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCByZWFkKElucHV0U3RyZWFtIGlzKSB7DQotICAgICAgICBvcmcub21nLkNPUkJBXzJfMy5wb3J0YWJsZS5JbnB1dFN0cmVhbSBpbnB1dFN0cmVhbQ0KLSAgICAgICAgICAgICAgICA9IChvcmcub21nLkNPUkJBXzJfMy5wb3J0YWJsZS5JbnB1dFN0cmVhbSkgaXM7DQotICAgICAgICBNZW1iZXJbXSBtZW1iZXJzID0gZGF0YVR5cGUuZ2V0TWVtYmVycygpOw0KLSAgICAgICAgbWVtYmVyVmFsdWVzID0gbmV3IE9iamVjdFttZW1iZXJzLmxlbmd0aF07DQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1lbWJlcnMubGVuZ3RoOyBpKyspIHsNCi0gICAgICAgICAgICBtZW1iZXJWYWx1ZXNbaV0gPSByZWFkKG1lbWJlcnNbaV0uZ2V0RGF0YVR5cGUoKSwgaW5wdXRTdHJlYW0pOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCB3cml0ZShPdXRwdXRTdHJlYW0gb3MpIHsNCi0gICAgICAgIG9yZy5vbWcuQ09SQkFfMl8zLnBvcnRhYmxlLk91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0NCi0gICAgICAgICAgICAgICAgPSAob3JnLm9tZy5DT1JCQV8yXzMucG9ydGFibGUuT3V0cHV0U3RyZWFtKSBvczsNCi0gICAgICAgIE1lbWJlcltdIG1lbWJlcnMgPSBkYXRhVHlwZS5nZXRNZW1iZXJzKCk7DQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1lbWJlcnMubGVuZ3RoOyBpKyspIHsNCi0gICAgICAgICAgICB3cml0ZShtZW1iZXJWYWx1ZXNbaV0sIG1lbWJlcnNbaV0uZ2V0RGF0YVR5cGUoKSwgb3V0cHV0U3RyZWFtKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9pZGwvdmFsdWVzL1NlcXVlbmNlVmFsdWUuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL2lkbC92YWx1ZXMvU2VxdWVuY2VWYWx1ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWY0NjY4Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL2lkbC92YWx1ZXMvU2VxdWVuY2VWYWx1ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5pZGwudmFsdWVzOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC50eXBlcy5BYnN0cmFjdENvbGxlY3Rpb25UeXBlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC50eXBlcy5EYXRhVHlwZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5pZGwudHlwZXMuU2VxdWVuY2VUeXBlOw0KLWltcG9ydCBvcmcub21nLkNPUkJBXzJfMy5wb3J0YWJsZS5JbnB1dFN0cmVhbTsNCi1pbXBvcnQgb3JnLm9tZy5DT1JCQV8yXzMucG9ydGFibGUuT3V0cHV0U3RyZWFtOw0KLQ0KLXB1YmxpYyBjbGFzcyBTZXF1ZW5jZVZhbHVlIGV4dGVuZHMgQWJzdHJhY3RDb2xsZWN0aW9uVmFsdWUgew0KLSAgICBwdWJsaWMgU2VxdWVuY2VWYWx1ZShTZXF1ZW5jZVR5cGUgc2VxdWVuY2VUeXBlKSB7DQotICAgICAgICBzdXBlcihzZXF1ZW5jZVR5cGUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHJlYWQoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHsNCi0gICAgICAgIEFic3RyYWN0Q29sbGVjdGlvblR5cGUgY29sbGVjdGlvblR5cGUgPSAoQWJzdHJhY3RDb2xsZWN0aW9uVHlwZSkgZGF0YVR5cGU7DQotICAgICAgICBEYXRhVHlwZSBtZW1iZXJUeXBlID0gY29sbGVjdGlvblR5cGUuZ2V0RGF0YVR5cGUoKTsNCi0gICAgICAgIGludCBsZW5ndGggPSBpbnB1dFN0cmVhbS5yZWFkX2xvbmcoKTsNCi0gICAgICAgIHZhbHVlcyA9IG5ldyBPYmplY3RbbGVuZ3RoXTsNCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsNCi0gICAgICAgICAgICB2YWx1ZXNbaV0gPSByZWFkKG1lbWJlclR5cGUsIGlucHV0U3RyZWFtKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZShPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtKSB7DQotICAgICAgICBBYnN0cmFjdENvbGxlY3Rpb25UeXBlIGNvbGxlY3Rpb25UeXBlID0gKEFic3RyYWN0Q29sbGVjdGlvblR5cGUpIGRhdGFUeXBlOw0KLSAgICAgICAgRGF0YVR5cGUgbWVtYmVyVHlwZSA9IGNvbGxlY3Rpb25UeXBlLmdldERhdGFUeXBlKCk7DQotICAgICAgICBpbnQgbGVuZ3RoID0gdmFsdWVzLmxlbmd0aDsNCi0gICAgICAgIG91dHB1dFN0cmVhbS53cml0ZV9sb25nKGxlbmd0aCk7DQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7DQotICAgICAgICAgICAgd3JpdGUodmFsdWVzW2ldLCBtZW1iZXJUeXBlLCBvdXRwdXRTdHJlYW0pOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL2lkbC92YWx1ZXMvU3RyZWFtYWJsZVZhbHVlRmFjdG9yeS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvaWRsL3ZhbHVlcy9TdHJlYW1hYmxlVmFsdWVGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczNWUyMjcuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvaWRsL3ZhbHVlcy9TdHJlYW1hYmxlVmFsdWVGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC52YWx1ZXM7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLnR5cGVzLlZhbHVlVHlwZTsNCi1pbXBvcnQgb3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5WYWx1ZUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5vbWcuQ09SQkFfMl8zLk9SQjsNCi1pbXBvcnQgb3JnLm9tZy5DT1JCQV8yXzMucG9ydGFibGUuSW5wdXRTdHJlYW07DQotDQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOw0KLQ0KLXB1YmxpYyBjbGFzcyBTdHJlYW1hYmxlVmFsdWVGYWN0b3J5IGltcGxlbWVudHMgVmFsdWVGYWN0b3J5IHsNCi0gICAgcHJpdmF0ZSBWYWx1ZVR5cGUgdmFsdWVUeXBlOw0KLQ0KLSAgICBwcml2YXRlIFN0cmVhbWFibGVWYWx1ZUZhY3RvcnkoVmFsdWVUeXBlIHZhbHVlVHlwZSkgew0KLSAgICAgICAgdGhpcy52YWx1ZVR5cGUgPSB2YWx1ZVR5cGU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFNlcmlhbGl6YWJsZSByZWFkX3ZhbHVlKElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB7DQotICAgICAgICByZXR1cm4gaW5wdXRTdHJlYW0ucmVhZF92YWx1ZShuZXcgT2JqZWN0QnlWYWx1ZSh2YWx1ZVR5cGUpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVnaXN0ZXIoT1JCIG9yYiwgVmFsdWVUeXBlIHZhbHVlVHlwZSkgew0KLSAgICAgICAgb3JiLnJlZ2lzdGVyX3ZhbHVlX2ZhY3RvcnkodmFsdWVUeXBlLmdldElkKCksIG5ldyBTdHJlYW1hYmxlVmFsdWVGYWN0b3J5KHZhbHVlVHlwZSkpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL2lkbC92YWx1ZXMvU3RydWN0VmFsdWUuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL2lkbC92YWx1ZXMvU3RydWN0VmFsdWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ1ZWY3My4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9pZGwvdmFsdWVzL1N0cnVjdFZhbHVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC52YWx1ZXM7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLnR5cGVzLk1lbWJlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5pZGwudHlwZXMuU3RydWN0Ow0KLWltcG9ydCBvcmcub21nLkNPUkJBXzJfMy5wb3J0YWJsZS5JbnB1dFN0cmVhbTsNCi1pbXBvcnQgb3JnLm9tZy5DT1JCQV8yXzMucG9ydGFibGUuT3V0cHV0U3RyZWFtOw0KLQ0KLXB1YmxpYyBjbGFzcyBTdHJ1Y3RWYWx1ZSBleHRlbmRzIEFic3RyYWN0VmFsdWUgew0KLQ0KLSAgICBwdWJsaWMgU3RydWN0VmFsdWUgKFN0cnVjdCBzdHJ1Y3QpIHsNCi0gICAgICAgIHN1cGVyKHN0cnVjdCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgd3JpdGUoT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSkgew0KLSAgICAgICAgTWVtYmVyW10gbWVtYmVycyA9IGdldE1lbWJlcnMoKTsNCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVtYmVycy5sZW5ndGg7IGkrKykgew0KLSAgICAgICAgICAgIHdyaXRlKG1lbWJlclZhbHVlc1tpXSwgbWVtYmVyc1tpXS5nZXREYXRhVHlwZSgpLCBvdXRwdXRTdHJlYW0pOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHJlYWQoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHsNCi0gICAgICAgIE1lbWJlcltdIG1lbWJlcnMgPSBnZXRNZW1iZXJzKCk7DQotICAgICAgICBtZW1iZXJWYWx1ZXMgPSBuZXcgT2JqZWN0W21lbWJlcnMubGVuZ3RoXTsNCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVtYmVycy5sZW5ndGg7IGkrKykgew0KLSAgICAgICAgICAgIG1lbWJlclZhbHVlc1tpXSA9IHJlYWQobWVtYmVyc1tpXS5nZXREYXRhVHlwZSgpLCBpbnB1dFN0cmVhbSk7DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvaWRsL3ZhbHVlcy9VbmlvblZhbHVlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9pZGwvdmFsdWVzL1VuaW9uVmFsdWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODYxNDY3ZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9pZGwvdmFsdWVzL1VuaW9uVmFsdWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC52YWx1ZXM7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLnR5cGVzLkRhdGFUeXBlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC50eXBlcy5FbnVtVHlwZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5pZGwudHlwZXMuTWVtYmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC50eXBlcy5Vbmlvbk1lbWJlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5pZGwudHlwZXMuVW5pb25UeXBlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLnJlY2VpdmVycy5Db3JiYVV0aWw7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi1pbXBvcnQgb3JnLm9tZy5DT1JCQS5UQ0tpbmQ7DQotaW1wb3J0IG9yZy5vbWcuQ09SQkFfMl8zLnBvcnRhYmxlLklucHV0U3RyZWFtOw0KLWltcG9ydCBvcmcub21nLkNPUkJBXzJfMy5wb3J0YWJsZS5PdXRwdXRTdHJlYW07DQotDQotcHVibGljIGNsYXNzIFVuaW9uVmFsdWUgZXh0ZW5kcyBBYnN0cmFjdFZhbHVlIHsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFVuaW9uVmFsdWUuY2xhc3MpOw0KLSAgICBwcml2YXRlIE9iamVjdCBkaXNjcmltaW5hdG9yOw0KLSAgICBwcml2YXRlIFN0cmluZyBtZW1iZXJOYW1lOw0KLSAgICBwcml2YXRlIE9iamVjdCBtZW1iZXJWYWx1ZTsNCi0gICAgcHJpdmF0ZSBEYXRhVHlwZSBtZW1iZXJUeXBlOw0KLQ0KLQ0KLSAgICBwdWJsaWMgVW5pb25WYWx1ZShVbmlvblR5cGUgdW5pb25UeXBlKSB7DQotICAgICAgICBzdXBlcih1bmlvblR5cGUpOyAgICANCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCByZWFkKElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB7DQotICAgICAgICBVbmlvblR5cGUgdW5pb25UeXBlID0gKFVuaW9uVHlwZSkgZGF0YVR5cGU7DQotICAgICAgICBkaXNjcmltaW5hdG9yID0gcmVhZCh1bmlvblR5cGUuZ2V0RGlzY3JpbWluYXRvclR5cGUoKSwgaW5wdXRTdHJlYW0pOw0KLSAgICAgICAgcG9wdWxhdGVWYWx1ZSgpOw0KLSAgICAgICAgbWVtYmVyVmFsdWUgPSByZWFkKGdldE1lbWJlclR5cGUoKSwgaW5wdXRTdHJlYW0pOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBwb3B1bGF0ZVZhbHVlKCkgew0KLSAgICAgICAgTWVtYmVyW10gbWVtYmVycyA9IGdldE1lbWJlcnMoKTsNCi0gICAgICAgIFVuaW9uTWVtYmVyIHVuaW9uTWVtYmVyID0gbnVsbDsNCi0NCi0gICAgICAgIFN0cmluZyBkaXNjcmltaW5hdG9yU3RyOw0KLSAgICAgICAgaWYgKGRpc2NyaW1pbmF0b3IgaW5zdGFuY2VvZiBFbnVtVmFsdWUpIHsNCi0gICAgICAgICAgICBkaXNjcmltaW5hdG9yU3RyID0gKChFbnVtVmFsdWUpIGRpc2NyaW1pbmF0b3IpLmdldFZhbHVlQXNTdHJpbmcoKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgZGlzY3JpbWluYXRvclN0ciA9IGRpc2NyaW1pbmF0b3IudG9TdHJpbmcoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVtYmVycy5sZW5ndGg7IGkrKykgew0KLSAgICAgICAgICAgIHVuaW9uTWVtYmVyID0gKFVuaW9uTWVtYmVyKSBtZW1iZXJzW2ldOw0KLSAgICAgICAgICAgIGlmIChkaXNjcmltaW5hdG9yU3RyLmVxdWFscyh1bmlvbk1lbWJlci5nZXREaXNjcmltaW5hdG9yVmFsdWUoKSkpDQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHVuaW9uTWVtYmVyICE9IG51bGwpIHsNCi0gICAgICAgICAgICBtZW1iZXJOYW1lID0gdW5pb25NZW1iZXIuZ2V0TmFtZSgpOw0KLSAgICAgICAgICAgIHNldE1lbWJlclR5cGUodW5pb25NZW1iZXIuZ2V0RGF0YVR5cGUoKSk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGxvZy5lcnJvcigiVW5pb24gbXVzdCBoYXZlIGF0bGVhc3Qgb25lIG1lbWJlcnMiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgcG9wdWxhdGVEaXNjcmltaW5hdG9yKCkgew0KLSAgICAgICAgTWVtYmVyW10gbWVtYmVycyA9IGdldE1lbWJlcnMoKTsNCi0gICAgICAgIFVuaW9uTWVtYmVyIHVuaW9uTWVtYmVyID0gbnVsbDsNCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVtYmVycy5sZW5ndGg7IGkrKykgew0KLSAgICAgICAgICAgIHVuaW9uTWVtYmVyID0gKFVuaW9uTWVtYmVyKSBtZW1iZXJzW2ldOw0KLSAgICAgICAgICAgIGlmICh1bmlvbk1lbWJlci5nZXROYW1lKCkuZXF1YWxzKG1lbWJlck5hbWUpKQ0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICh1bmlvbk1lbWJlciAhPSBudWxsKSB7DQotICAgICAgICAgICAgc2V0TWVtYmVyVHlwZSh1bmlvbk1lbWJlci5nZXREYXRhVHlwZSgpKTsNCi0gICAgICAgICAgICBpZiAoIXVuaW9uTWVtYmVyLmlzRGVmYXVsdCgpKSB7DQotICAgICAgICAgICAgICAgIGRpc2NyaW1pbmF0b3IgPSBDb3JiYVV0aWwucGFyc2VWYWx1ZSgoKFVuaW9uVHlwZSlkYXRhVHlwZSkuZ2V0RGlzY3JpbWluYXRvclR5cGUoKSwgdW5pb25NZW1iZXIuZ2V0RGlzY3JpbWluYXRvclZhbHVlKCkpOw0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAodW5pb25NZW1iZXIuaXNEZWZhdWx0KCkpIHsNCi0gICAgICAgICAgICAgICAgRGF0YVR5cGUgZGlzY3JpbWluYXRvclR5cGUgPSAoKFVuaW9uVHlwZSlkYXRhVHlwZSkuZ2V0RGlzY3JpbWluYXRvclR5cGUoKTsNCi0gICAgICAgICAgICAgICAgaW50IGtpbmRWYWwgPSBkaXNjcmltaW5hdG9yVHlwZS5nZXRUeXBlQ29kZSgpLmtpbmQoKS52YWx1ZSgpOw0KLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGtpbmRWYWwpIHsNCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgVENLaW5kLl90a19sb25nOg0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRpc2NyaW1pbmF0b3IgPSBJbnRlZ2VyLnZhbHVlT2YoLTIxNDc0ODM2NDgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBUQ0tpbmQuX3RrX2NoYXI6DQotICAgICAgICAgICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfd2NoYXI6DQotICAgICAgICAgICAgICAgICAgICAgICAgZGlzY3JpbWluYXRvciA9IENoYXJhY3Rlci52YWx1ZU9mKCdcdTAwMDAnKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgVENLaW5kLl90a19lbnVtOg0KLSAgICAgICAgICAgICAgICAgICAgICAgIEVudW1UeXBlIGVudW1UeXBlID0gKEVudW1UeXBlKSBkaXNjcmltaW5hdG9yVHlwZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBFbnVtVmFsdWUgZW51bVZhbHVlID0gbmV3IEVudW1WYWx1ZShlbnVtVHlwZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgZW51bVZhbHVlLnNldFZhbHVlKDApOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRpc2NyaW1pbmF0b3IgPSBlbnVtVmFsdWU7DQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiVW5zdXBwb3J0ZWQgdW5pb24gbWVtYmVyIHR5cGUiKTsgICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIGRpc2NyaW1pbmF0b3IgPSBudWxsOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZShPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtKSB7DQotICAgICAgICBwb3B1bGF0ZURpc2NyaW1pbmF0b3IoKTsNCi0gICAgICAgIHdyaXRlKGRpc2NyaW1pbmF0b3IsICgoVW5pb25UeXBlKSBkYXRhVHlwZSkuZ2V0RGlzY3JpbWluYXRvclR5cGUoKSwgb3V0cHV0U3RyZWFtKTsNCi0gICAgICAgIHdyaXRlKG1lbWJlclZhbHVlLCBnZXRNZW1iZXJUeXBlKCksIG91dHB1dFN0cmVhbSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRNZW1iZXJOYW1lKCkgew0KLSAgICAgICAgcmV0dXJuIG1lbWJlck5hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TWVtYmVyTmFtZShTdHJpbmcgbWVtYmVyTmFtZSkgew0KLSAgICAgICAgdGhpcy5tZW1iZXJOYW1lID0gbWVtYmVyTmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgT2JqZWN0IGdldE1lbWJlclZhbHVlKCkgew0KLSAgICAgICAgcmV0dXJuIG1lbWJlclZhbHVlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE1lbWJlclZhbHVlKE9iamVjdCBtZW1iZXJWYWx1ZSkgew0KLSAgICAgICAgdGhpcy5tZW1iZXJWYWx1ZSA9IG1lbWJlclZhbHVlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBEYXRhVHlwZSBnZXRNZW1iZXJUeXBlKCkgew0KLSAgICAgICAgcmV0dXJuIG1lbWJlclR5cGU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TWVtYmVyVHlwZShEYXRhVHlwZSBtZW1iZXJUeXBlKSB7DQotICAgICAgICB0aGlzLm1lbWJlclR5cGUgPSBtZW1iZXJUeXBlOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL3JlY2VpdmVycy9Db3JiYUluT25seU1lc3NhZ2VSZWNlaXZlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvcmVjZWl2ZXJzL0NvcmJhSW5Pbmx5TWVzc2FnZVJlY2VpdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0YjFlYTEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvcmVjZWl2ZXJzL0NvcmJhSW5Pbmx5TWVzc2FnZVJlY2VpdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5yZWNlaXZlcnM7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTmFtZXNwYWNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmRlcGxveWVyLkNvcmJhQ29uc3RhbnRzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmV4Y2VwdGlvbnMuQ29yYmFJbnZvY2F0aW9uRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC50eXBlcy5JREw7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc01lc3NhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5QYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLkFic3RyYWN0SW5NZXNzYWdlUmVjZWl2ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMQ29uc3RhbnRzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotaW1wb3J0IG9yZy5vbWcuQ09SQkFfMl8zLk9SQjsNCi0NCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotcHVibGljIGNsYXNzIENvcmJhSW5Pbmx5TWVzc2FnZVJlY2VpdmVyIGV4dGVuZHMgQWJzdHJhY3RJbk1lc3NhZ2VSZWNlaXZlciBpbXBsZW1lbnRzIENvcmJhQ29uc3RhbnRzIHsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKENvcmJhSW5Pbmx5TWVzc2FnZVJlY2VpdmVyLmNsYXNzKTsNCi0gICAgcHJpdmF0ZSBPUkIgb3JiID0gbnVsbDsNCi0gICAgcHJpdmF0ZSBNYXAgaW52b2tlckNhY2hlID0gbmV3IEhhc2hNYXAoKTsNCi0NCi0gICAgcHVibGljIHZvaWQgaW52b2tlQnVzaW5lc3NMb2dpYyhNZXNzYWdlQ29udGV4dCBpbk1lc3NhZ2UpIHRocm93cyBBeGlzRmF1bHQgew0KLSAgICAgICAgdHJ5ew0KLSAgICAgICAgICAgIGludm9rZShpbk1lc3NhZ2UpOw0KLSAgICAgICAgfSBjYXRjaCAob3JnLm9tZy5DT1JCQS5UUkFOU0lFTlQgZSkgew0KLSAgICAgICAgICAgIGxvZy5pbmZvKCJvcmcub21nLkNPUkJBLlRSQU5TSUVOVCBleGNlcHRpb24gdGhyb3duLiIpOw0KLSAgICAgICAgICAgIC8qDQotICAgICAgICAgICAgKiBJZiBjYW5ub3QgY29ubmVjdCB0byB0aGUgY29yYmEgc2VydmVyDQotICAgICAgICAgICAgKiB0cnkgYWdhaW4gYWZ0ZXIgY2xlYXJpbmcgdGhlIGNhY2hlDQotICAgICAgICAgICAgKiAoZWcuIGlmIHRoZSBDb3JiYSBzZXJ2ZXIgaXMgcmVzdGFydGVkKQ0KLSAgICAgICAgICAgICovDQotICAgICAgICAgICAgaW52b2tlckNhY2hlLmNsZWFyKCk7DQotICAgICAgICAgICAgaW52b2tlKGluTWVzc2FnZSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGludm9rZShNZXNzYWdlQ29udGV4dCBpbk1lc3NhZ2UpIHRocm93cyBBeGlzRmF1bHQgew0KLSAgICAgICAgU3RyaW5nIG1ldGhvZE5hbWUgPSBudWxsOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBBeGlzT3BlcmF0aW9uIG9wID0gaW5NZXNzYWdlLmdldE9wZXJhdGlvbkNvbnRleHQoKS5nZXRBeGlzT3BlcmF0aW9uKCk7DQotICAgICAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSA9IGluTWVzc2FnZS5nZXRBeGlzU2VydmljZSgpOw0KLSAgICAgICAgICAgIE9NRWxlbWVudCBtZXRob2RFbGVtZW50ID0gaW5NZXNzYWdlLmdldEVudmVsb3BlKCkuZ2V0Qm9keSgpLmdldEZpcnN0RWxlbWVudCgpOw0KLQ0KLSAgICAgICAgICAgIEF4aXNNZXNzYWdlIGluQXhpc01lc3NhZ2UgPSBvcC5nZXRNZXNzYWdlKFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9JTl9WQUxVRSk7DQotICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2VOYW1lU3BhY2U7DQotICAgICAgICAgICAgUU5hbWUgZWxlbWVudFFOYW1lOw0KLSAgICAgICAgICAgIG1ldGhvZE5hbWUgPSBvcC5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCk7DQotDQotICAgICAgICAgICAgSW52b2tlciBpbnZva2VyID0gKEludm9rZXIpIGludm9rZXJDYWNoZS5nZXQobWV0aG9kTmFtZSk7DQotICAgICAgICAgICAgaWYgKGludm9rZXI9PW51bGwpIHsNCi0gICAgICAgICAgICAgICAgaWYgKG9yYj09bnVsbCkgew0KLSAgICAgICAgICAgICAgICAgICAgUGFyYW1ldGVyIG9yYlBhcmFtID0gc2VydmljZS5nZXRQYXJhbWV0ZXIoT1JCX0xJVEVSQUwpOw0KLSAgICAgICAgICAgICAgICAgICAgb3JiID0gb3JiUGFyYW0gIT0gbnVsbCA/IChPUkIpIG9yYlBhcmFtLmdldFZhbHVlKCkgOiBDb3JiYVV0aWwuZ2V0T1JCKHNlcnZpY2UpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIG9yZy5vbWcuQ09SQkEuT2JqZWN0IG9iaiA9IENvcmJhVXRpbC5yZXNvbHZlT2JqZWN0KHNlcnZpY2UsIG9yYik7DQotICAgICAgICAgICAgICAgIFBhcmFtZXRlciBpZGxQYXJhbWV0ZXIgPSBzZXJ2aWNlLmdldFBhcmFtZXRlcihJRExfTElURVJBTCk7DQotICAgICAgICAgICAgICAgIGlmIChpZGxQYXJhbWV0ZXI9PW51bGwpDQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29yYmFJbnZvY2F0aW9uRXhjZXB0aW9uKCJObyBJREwgZm91bmQiKTsNCi0gICAgICAgICAgICAgICAgSURMIGlkbCA9IChJREwpIGlkbFBhcmFtZXRlci5nZXRWYWx1ZSgpOw0KLSAgICAgICAgICAgICAgICBpbnZva2VyID0gQ29yYmFVdGlsLmdldEludm9rZXIoc2VydmljZSwgb2JqLCBpZGwsIG1ldGhvZE5hbWUpOw0KLSAgICAgICAgICAgICAgICBpbnZva2VyQ2FjaGUucHV0KG1ldGhvZE5hbWUsIGludm9rZXIpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBpZiAoaW5BeGlzTWVzc2FnZSAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgIGlmIChpbkF4aXNNZXNzYWdlLmdldEVsZW1lbnRRTmFtZSgpIT1udWxsKSB7DQotICAgICAgICAgICAgICAgICAgICBlbGVtZW50UU5hbWUgPSBpbkF4aXNNZXNzYWdlLmdldEVsZW1lbnRRTmFtZSgpOw0KLSAgICAgICAgICAgICAgICAgICAgbWVzc2FnZU5hbWVTcGFjZSA9IGVsZW1lbnRRTmFtZS5nZXROYW1lc3BhY2VVUkkoKTsNCi0gICAgICAgICAgICAgICAgICAgIE9NTmFtZXNwYWNlIG5hbWVzcGFjZSA9IG1ldGhvZEVsZW1lbnQuZ2V0TmFtZXNwYWNlKCk7DQotICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZU5hbWVTcGFjZSAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZSA9PSBudWxsIHx8DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhbWVzc2FnZU5hbWVTcGFjZS5lcXVhbHMobmFtZXNwYWNlLmdldE5hbWVzcGFjZVVSSSgpKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJuYW1lc3BhY2UgbWlzbWF0Y2ggcmVxdWlyZSAiICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlTmFtZVNwYWNlICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGZvdW5kICIgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEVsZW1lbnQuZ2V0TmFtZXNwYWNlKCkuZ2V0TmFtZXNwYWNlVVJJKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobmFtZXNwYWNlICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJuYW1lc3BhY2UgbWlzbWF0Y2guIEF4aXMgT2VwcmF0aW9uIGV4cGVjdHMgbm9uLW5hbWVzcGFjZSAiICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJxdWFsaWZpZWQgZWxlbWVudC4gQnV0IHJlY2VpdmVkIGEgbmFtZXNwYWNlIHF1YWxpZmllZCBlbGVtZW50Iik7DQotICAgICAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgICAgICBPYmplY3RbXSBvYmplY3RBcnJheSA9IENvcmJhVXRpbC5leHRyYWN0UGFyYW1ldGVycyhtZXRob2RFbGVtZW50LCBpbnZva2VyLmdldFBhcmFtZXRlck1lbWJlcnMoKSk7DQotICAgICAgICAgICAgICAgICAgICBpbnZva2VyLnNldFBhcmFtZXRlcnMob2JqZWN0QXJyYXkpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGludm9rZXIuaW52b2tlKCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSBjYXRjaCAoQ29yYmFJbnZvY2F0aW9uRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBTdHJpbmcgbXNnOw0KLSAgICAgICAgICAgIFRocm93YWJsZSBjYXVzZSA9IGUuZ2V0Q2F1c2UoKTsNCi0gICAgICAgICAgICBpZiAoY2F1c2UgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICBtc2cgPSBjYXVzZS5nZXRNZXNzYWdlKCk7DQotICAgICAgICAgICAgICAgIGlmIChtc2cgPT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICAgICAgbXNnID0gIkV4Y2VwdGlvbiBvY2N1cnJlZCB3aGlsZSB0cnlpbmcgdG8gaW52b2tlIHNlcnZpY2UgbWV0aG9kICIgKyBtZXRob2ROYW1lOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIC8vbG9nLmVycm9yKG1zZywgZSk7DQotICAgICAgICAgICAgICAgIGlmIChjYXVzZSBpbnN0YW5jZW9mIEF4aXNGYXVsdCkgew0KLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgKEF4aXNGYXVsdCkgY2F1c2U7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBtc2cgPSBlLmdldE1lc3NhZ2UoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdChtc2cpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL3JlY2VpdmVycy9Db3JiYUluT3V0QXN5bmNNZXNzYWdlUmVjZWl2ZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL3JlY2VpdmVycy9Db3JiYUluT3V0QXN5bmNNZXNzYWdlUmVjZWl2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzkxOWJhYi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9yZWNlaXZlcnMvQ29yYmFJbk91dEFzeW5jTWVzc2FnZVJlY2VpdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5yZWNlaXZlcnM7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTmFtZXNwYWNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29yYmEuZGVwbG95ZXIuQ29yYmFDb25zdGFudHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29yYmEuZXhjZXB0aW9ucy5Db3JiYUludm9jYXRpb25FeGNlcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLnR5cGVzLklETDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5pZGwudHlwZXMuTWVtYmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNNZXNzYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5BYnN0cmFjdEluT3V0QXN5bmNNZXNzYWdlUmVjZWl2ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMQ29uc3RhbnRzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotaW1wb3J0IG9yZy5vbWcuQ09SQkFfMl8zLk9SQjsNCi0NCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotcHVibGljIGNsYXNzIENvcmJhSW5PdXRBc3luY01lc3NhZ2VSZWNlaXZlciBleHRlbmRzIEFic3RyYWN0SW5PdXRBc3luY01lc3NhZ2VSZWNlaXZlciBpbXBsZW1lbnRzIENvcmJhQ29uc3RhbnRzIHsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKENvcmJhSW5PdXRBc3luY01lc3NhZ2VSZWNlaXZlci5jbGFzcyk7DQotICAgIHByaXZhdGUgT1JCIG9yYiA9IG51bGw7DQotICAgIHByaXZhdGUgTWFwIGludm9rZXJDYWNoZSA9IG5ldyBIYXNoTWFwKCk7DQotDQotICAgIHB1YmxpYyB2b2lkIGludm9rZUJ1c2luZXNzTG9naWMoTWVzc2FnZUNvbnRleHQgaW5NZXNzYWdlLCBNZXNzYWdlQ29udGV4dCBvdXRNZXNzYWdlKSB0aHJvd3MgQXhpc0ZhdWx0IHsNCi0gICAgICAgIHRyeXsNCi0gICAgICAgICAgICBpbnZva2UoaW5NZXNzYWdlLCBvdXRNZXNzYWdlKTsNCi0gICAgICAgIH0gY2F0Y2ggKG9yZy5vbWcuQ09SQkEuVFJBTlNJRU5UIGUpIHsNCi0gICAgICAgICAgICBsb2cuaW5mbygib3JnLm9tZy5DT1JCQS5UUkFOU0lFTlQgZXhjZXB0aW9uIHRocm93bi4iKTsNCi0gICAgICAgICAgICAvKg0KLSAgICAgICAgICAgICogSWYgY2Fubm90IGNvbm5lY3QgdG8gdGhlIGNvcmJhIHNlcnZlcg0KLSAgICAgICAgICAgICogdHJ5IGFnYWluIGFmdGVyIGNsZWFyaW5nIHRoZSBjYWNoZQ0KLSAgICAgICAgICAgICogKGVnLiBpZiB0aGUgQ29yYmEgc2VydmVyIGlzIHJlc3RhcnRlZCkNCi0gICAgICAgICAgICAqLw0KLSAgICAgICAgICAgIGludm9rZXJDYWNoZS5jbGVhcigpOw0KLSAgICAgICAgICAgIGludm9rZShpbk1lc3NhZ2UsIG91dE1lc3NhZ2UpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbnZva2UoTWVzc2FnZUNvbnRleHQgaW5NZXNzYWdlLCBNZXNzYWdlQ29udGV4dCBvdXRNZXNzYWdlKSB0aHJvd3MgQXhpc0ZhdWx0IHsNCi0gICAgICAgIFN0cmluZyBtZXRob2ROYW1lID0gbnVsbDsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgQXhpc09wZXJhdGlvbiBvcCA9IGluTWVzc2FnZS5nZXRPcGVyYXRpb25Db250ZXh0KCkuZ2V0QXhpc09wZXJhdGlvbigpOw0KLSAgICAgICAgICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2UgPSBpbk1lc3NhZ2UuZ2V0QXhpc1NlcnZpY2UoKTsNCi0gICAgICAgICAgICBPTUVsZW1lbnQgbWV0aG9kRWxlbWVudCA9IGluTWVzc2FnZS5nZXRFbnZlbG9wZSgpLmdldEJvZHkoKS5nZXRGaXJzdEVsZW1lbnQoKTsNCi0NCi0gICAgICAgICAgICBBeGlzTWVzc2FnZSBpbkF4aXNNZXNzYWdlID0gb3AuZ2V0TWVzc2FnZShXU0RMQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfSU5fVkFMVUUpOw0KLSAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlTmFtZVNwYWNlID0gbnVsbDsNCi0gICAgICAgICAgICBRTmFtZSBlbGVtZW50UU5hbWU7DQotICAgICAgICAgICAgbWV0aG9kTmFtZSA9IG9wLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKTsNCi0NCi0gICAgICAgICAgICBJbnZva2VyIGludm9rZXIgPSAoSW52b2tlcikgaW52b2tlckNhY2hlLmdldChtZXRob2ROYW1lKTsNCi0gICAgICAgICAgICBpZiAoaW52b2tlcj09bnVsbCkgew0KLSAgICAgICAgICAgICAgICBpZiAob3JiPT1udWxsKSB7DQotICAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXIgb3JiUGFyYW0gPSBzZXJ2aWNlLmdldFBhcmFtZXRlcihPUkJfTElURVJBTCk7DQotICAgICAgICAgICAgICAgICAgICBvcmIgPSBvcmJQYXJhbSAhPSBudWxsID8gKE9SQikgb3JiUGFyYW0uZ2V0VmFsdWUoKSA6IENvcmJhVXRpbC5nZXRPUkIoc2VydmljZSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgb3JnLm9tZy5DT1JCQS5PYmplY3Qgb2JqID0gQ29yYmFVdGlsLnJlc29sdmVPYmplY3Qoc2VydmljZSwgb3JiKTsNCi0gICAgICAgICAgICAgICAgUGFyYW1ldGVyIGlkbFBhcmFtZXRlciA9IHNlcnZpY2UuZ2V0UGFyYW1ldGVyKElETF9MSVRFUkFMKTsNCi0gICAgICAgICAgICAgICAgaWYgKGlkbFBhcmFtZXRlcj09bnVsbCkNCi0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb3JiYUludm9jYXRpb25FeGNlcHRpb24oIklETCBub3QgZm91bmQiKTsNCi0gICAgICAgICAgICAgICAgSURMIGlkbCA9IChJREwpIGlkbFBhcmFtZXRlci5nZXRWYWx1ZSgpOw0KLSAgICAgICAgICAgICAgICBpbnZva2VyID0gQ29yYmFVdGlsLmdldEludm9rZXIoc2VydmljZSwgb2JqLCBpZGwsIG1ldGhvZE5hbWUpOw0KLSAgICAgICAgICAgICAgICBpbnZva2VyQ2FjaGUucHV0KG1ldGhvZE5hbWUsIGludm9rZXIpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBPYmplY3QgcmVzT2JqZWN0ID0gbnVsbDsNCi0gICAgICAgICAgICBNZW1iZXJbXSBwYXJhbXMgPSBudWxsOw0KLSAgICAgICAgICAgIE9iamVjdFtdIG91dFBhcmFtVmFsdWVzID0gbnVsbDsNCi0gICAgICAgICAgICBpZiAoaW5BeGlzTWVzc2FnZSAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgIGlmIChpbkF4aXNNZXNzYWdlLmdldEVsZW1lbnRRTmFtZSgpIT1udWxsKSB7DQotICAgICAgICAgICAgICAgICAgICBlbGVtZW50UU5hbWUgPSBpbkF4aXNNZXNzYWdlLmdldEVsZW1lbnRRTmFtZSgpOw0KLSAgICAgICAgICAgICAgICAgICAgbWVzc2FnZU5hbWVTcGFjZSA9IGVsZW1lbnRRTmFtZS5nZXROYW1lc3BhY2VVUkkoKTsNCi0gICAgICAgICAgICAgICAgICAgIE9NTmFtZXNwYWNlIG5hbWVzcGFjZSA9IG1ldGhvZEVsZW1lbnQuZ2V0TmFtZXNwYWNlKCk7DQotICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZU5hbWVTcGFjZSAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZSA9PSBudWxsIHx8ICFtZXNzYWdlTmFtZVNwYWNlLmVxdWFscyhuYW1lc3BhY2UuZ2V0TmFtZXNwYWNlVVJJKCkpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoIm5hbWVzcGFjZSBtaXNtYXRjaCByZXF1aXJlICIgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VOYW1lU3BhY2UgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZm91bmQgIiArIG1ldGhvZEVsZW1lbnQuZ2V0TmFtZXNwYWNlKCkuZ2V0TmFtZXNwYWNlVVJJKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobmFtZXNwYWNlICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJuYW1lc3BhY2UgbWlzbWF0Y2guIEF4aXMgT2VwcmF0aW9uIGV4cGVjdHMgbm9uLW5hbWVzcGFjZSAiICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJxdWFsaWZpZWQgZWxlbWVudC4gQnV0IHJlY2VpdmVkIGEgbmFtZXNwYWNlIHF1YWxpZmllZCBlbGVtZW50Iik7DQotICAgICAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgICAgICBPYmplY3RbXSBvYmplY3RBcnJheSA9IENvcmJhVXRpbC5leHRyYWN0UGFyYW1ldGVycyhtZXRob2RFbGVtZW50LCBpbnZva2VyLmdldFBhcmFtZXRlck1lbWJlcnMoKSk7DQotICAgICAgICAgICAgICAgICAgICBpbnZva2VyLnNldFBhcmFtZXRlcnMob2JqZWN0QXJyYXkpOw0KLSAgICAgICAgICAgICAgICAgICAgcGFyYW1zID0gaW52b2tlci5nZXRQYXJhbWV0ZXJNZW1iZXJzKCk7DQotICAgICAgICAgICAgICAgICAgICBvdXRQYXJhbVZhbHVlcyA9IGludm9rZXIuZ2V0T3V0UGFyYW1ldGVyVmFsdWVzcygpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHJlc09iamVjdCA9IGludm9rZXIuaW52b2tlKCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIFNPQVBGYWN0b3J5IGZhYyA9IGdldFNPQVBGYWN0b3J5KGluTWVzc2FnZSk7DQotDQotICAgICAgICAgICAgQXhpc01lc3NhZ2Ugb3V0YXhpc01lc3NhZ2UgPSBvcC5nZXRNZXNzYWdlKFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9PVVRfVkFMVUUpOw0KLSAgICAgICAgICAgIGlmIChtZXNzYWdlTmFtZVNwYWNlID09IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgUU5hbWUgcW5hbWUgPSBvdXRheGlzTWVzc2FnZS5nZXRFbGVtZW50UU5hbWUoKTsNCi0gICAgICAgICAgICAgICAgaWYgKHFuYW1lICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VOYW1lU3BhY2UgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAvLyBIYW5kbGluZyB0aGUgcmVzcG9uc2UNCi0gICAgICAgICAgICBDb3JiYVV0aWwucHJvY2Vzc1Jlc3BvbnNlKHJlc09iamVjdCwgcGFyYW1zLCBvdXRQYXJhbVZhbHVlcywgaW52b2tlci5nZXRSZXR1cm5UeXBlKCksIHNlcnZpY2UsIG1ldGhvZE5hbWUsIGZhYywNCi0gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VOYW1lU3BhY2UsIG91dE1lc3NhZ2UpOw0KLSAgICAgICAgfSBjYXRjaCAoQ29yYmFJbnZvY2F0aW9uRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBTdHJpbmcgbXNnOw0KLSAgICAgICAgICAgIFRocm93YWJsZSBjYXVzZSA9IGUuZ2V0Q2F1c2UoKTsNCi0gICAgICAgICAgICBpZiAoY2F1c2UgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICBtc2cgPSBjYXVzZS5nZXRNZXNzYWdlKCk7DQotICAgICAgICAgICAgICAgIGlmIChtc2cgPT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICAgICAgbXNnID0gIkV4Y2VwdGlvbiBvY2N1cnJlZCB3aGlsZSB0cnlpbmcgdG8gaW52b2tlIHNlcnZpY2UgbWV0aG9kICIgKyBtZXRob2ROYW1lOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIC8vbG9nLmVycm9yKG1zZywgZSk7DQotICAgICAgICAgICAgICAgIGlmIChjYXVzZSBpbnN0YW5jZW9mIEF4aXNGYXVsdCkgew0KLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgKEF4aXNGYXVsdCkgY2F1c2U7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBtc2cgPSBlLmdldE1lc3NhZ2UoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdChtc2cpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL3JlY2VpdmVycy9Db3JiYUludm9rZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL3JlY2VpdmVycy9Db3JiYUludm9rZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA2MWI3Mi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9yZWNlaXZlcnMvQ29yYmFJbnZva2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5yZWNlaXZlcnM7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29yYmEuZXhjZXB0aW9ucy5Db3JiYUludm9jYXRpb25FeGNlcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLnR5cGVzLkRhdGFUeXBlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC50eXBlcy5FeGNlcHRpb25UeXBlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC50eXBlcy5JbnRlcmZhY2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLnR5cGVzLk1lbWJlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5pZGwudHlwZXMuT3BlcmF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC52YWx1ZXMuRXhjZXB0aW9uVmFsdWU7DQotaW1wb3J0IG9yZy5vbWcuQ09SQkEuQW55Ow0KLWltcG9ydCBvcmcub21nLkNPUkJBLkV4Y2VwdGlvbkxpc3Q7DQotaW1wb3J0IG9yZy5vbWcuQ09SQkEuUmVxdWVzdDsNCi1pbXBvcnQgb3JnLm9tZy5DT1JCQS5UeXBlQ29kZTsNCi1pbXBvcnQgb3JnLm9tZy5DT1JCQS5Vbmtub3duVXNlckV4Y2VwdGlvbjsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsNCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotcHVibGljIGNsYXNzIENvcmJhSW52b2tlciBpbXBsZW1lbnRzIEludm9rZXIgew0KLSAgICBwcml2YXRlIE9wZXJhdGlvbiBvcGVyYXRpb247DQotICAgIHByaXZhdGUgSW50ZXJmYWNlIGludGY7DQotICAgIC8vcHJpdmF0ZSBNYXAgY29tcG9zaXRlRGF0YVR5cGVzOw0KLSAgICBwcml2YXRlIG9yZy5vbWcuQ09SQkEuT2JqZWN0IG9iamVjdDsNCi0gICAgcHJpdmF0ZSBPYmplY3RbXSBwYXJhbWV0ZXJzOw0KLSAgICBwcml2YXRlIExpc3QgcGFyYW1ldGVyVHlwZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7DQotICAgIHByaXZhdGUgTGlzdCByZXR1cm5lZFBhcmFtczsNCi0NCi0gICAgcHJvdGVjdGVkIENvcmJhSW52b2tlcihPcGVyYXRpb24gb3BlcmF0aW9uLCBJbnRlcmZhY2UgaW50Ziwgb3JnLm9tZy5DT1JCQS5PYmplY3Qgb2JqZWN0KSB7DQotICAgICAgICB0aGlzLm9wZXJhdGlvbiA9IG9wZXJhdGlvbjsNCi0gICAgICAgIHRoaXMuaW50ZiA9IGludGY7DQotICAgICAgICB0aGlzLm9iamVjdCA9IG9iamVjdDsNCi0NCi0gICAgICAgIExpc3QgcGFyYW1zID0gb3BlcmF0aW9uLmdldFBhcmFtcygpOw0KLSAgICAgICAgaWYgKHBhcmFtcyE9bnVsbCkgew0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1zLnNpemUoKTsgaSsrKSB7DQotICAgICAgICAgICAgICAgIE1lbWJlciBtZW1iZXIgPSAoTWVtYmVyKSBwYXJhbXMuZ2V0KGkpOw0KLSAgICAgICAgICAgICAgICBwYXJhbWV0ZXJUeXBlTGlzdC5hZGQobWVtYmVyKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIE9iamVjdCBpbnZva2UoKSB0aHJvd3MgQ29yYmFJbnZvY2F0aW9uRXhjZXB0aW9uIHsNCi0gICAgICAgIC8vIENyZWF0ZSByZXF1ZXN0DQotICAgICAgICBSZXF1ZXN0IHJlcXVlc3QgPSBvYmplY3QuX3JlcXVlc3Qob3BlcmF0aW9uLmdldE5hbWUoKSk7DQotDQotICAgICAgICAvLyBTZXQgcGFyYW1ldGVycw0KLSAgICAgICAgQW55IGFyZyA9IG51bGw7DQotICAgICAgICBMaXN0IG1lbUFyZ3MgPSBuZXcgQXJyYXlMaXN0KCk7DQotICAgICAgICBpZiAocGFyYW1ldGVycyE9bnVsbCkgew0KLSAgICAgICAgICAgIExpc3QgcGF0YW1MaXN0ID0gbmV3IExpbmtlZExpc3QoQXJyYXlzLmFzTGlzdChwYXJhbWV0ZXJzKSk7DQotICAgICAgICAgICAgSXRlcmF0b3IgcGFyYW1zSXRlciA9IHBhdGFtTGlzdC5pdGVyYXRvcigpOw0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1ldGVyVHlwZUxpc3Quc2l6ZSgpOyBpKyspIHsNCi0gICAgICAgICAgICAgICAgTWVtYmVyIG1lbWJlciA9IChNZW1iZXIpIHBhcmFtZXRlclR5cGVMaXN0LmdldChpKTsNCi0gICAgICAgICAgICAgICAgRGF0YVR5cGUgdHlwZSA9IG1lbWJlci5nZXREYXRhVHlwZSgpOw0KLSAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBudWxsOw0KLSAgICAgICAgICAgICAgICBTdHJpbmcgbW9kZSA9IG1lbWJlci5nZXRNb2RlKCk7DQotICAgICAgICAgICAgICAgIGlmIChtb2RlLmVxdWFscyhNZW1iZXIuTU9ERV9JTikpIHsNCi0gICAgICAgICAgICAgICAgICAgIGFyZyA9IHJlcXVlc3QuYWRkX2luX2FyZygpOw0KLSAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBwYXJhbXNJdGVyLm5leHQoKTsNCi0gICAgICAgICAgICAgICAgfWVsc2UgaWYgKG1vZGUuZXF1YWxzKE1lbWJlci5NT0RFX0lOT1VUKSkgew0KLSAgICAgICAgICAgICAgICAgICAgYXJnID0gcmVxdWVzdC5hZGRfaW5vdXRfYXJnKCk7DQotICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHBhcmFtc0l0ZXIubmV4dCgpOw0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1vZGUuZXF1YWxzKE1lbWJlci5NT0RFX09VVCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIGFyZyA9IHJlcXVlc3QuYWRkX291dF9hcmcoKTsNCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gQ29yYmFVdGlsLmdldEVtcHR5VmFsdWUodHlwZSk7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgbWVtQXJncy5hZGQoYXJnKTsNCi0gICAgICAgICAgICAgICAgQ29yYmFVdGlsLmluc2VydFZhbHVlKGFyZywgdHlwZSwgdmFsdWUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vIFNldCByZXR1cm4gdHlwZQ0KLSAgICAgICAgRGF0YVR5cGUgcmV0dXJuVHlwZSA9IG9wZXJhdGlvbi5nZXRSZXR1cm5UeXBlKCk7DQotICAgICAgICBpZiAocmV0dXJuVHlwZSE9bnVsbCkgew0KLSAgICAgICAgICAgIFR5cGVDb2RlIHR5cGVDb2RlID0gcmV0dXJuVHlwZS5nZXRUeXBlQ29kZSgpOw0KLSAgICAgICAgICAgIHJlcXVlc3Quc2V0X3JldHVybl90eXBlKHR5cGVDb2RlKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vIFNldCBleGNlcHRpb25zDQotICAgICAgICBMaXN0IGV4Y2VwdGlvbnMgPSBvcGVyYXRpb24uZ2V0UmFpc2VzKCk7DQotICAgICAgICBpZiAoZXhjZXB0aW9ucyE9bnVsbCAmJiAhZXhjZXB0aW9ucy5pc0VtcHR5KCkpIHsNCi0gICAgICAgICAgICBFeGNlcHRpb25MaXN0IGV4Y2VwdGlvbkxpc3QgPSByZXF1ZXN0LmV4Y2VwdGlvbnMoKTsNCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4Y2VwdGlvbnMuc2l6ZSgpOyBpKyspIHsNCi0gICAgICAgICAgICAgICAgRXhjZXB0aW9uVHlwZSBleFR5cGUgPSAoRXhjZXB0aW9uVHlwZSkgZXhjZXB0aW9ucy5nZXQoaSk7DQotICAgICAgICAgICAgICAgIGV4Y2VwdGlvbkxpc3QuYWRkKGV4VHlwZS5nZXRUeXBlQ29kZSgpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICAvLyBJbnZva2UNCi0gICAgICAgIHJlcXVlc3QuaW52b2tlKCk7DQotDQotICAgICAgICAvLyBHZXQgZXhjZXB0aW9uDQotICAgICAgICBPYmplY3QgcmV0dXJuVmFsdWUgPSBudWxsOw0KLSAgICAgICAgRXhjZXB0aW9uIGV4Y2VwdGlvbiA9IHJlcXVlc3QuZW52KCkuZXhjZXB0aW9uKCk7DQotICAgICAgICBpZiAoZXhjZXB0aW9uID09IG51bGwpIHsNCi0gICAgICAgICAgICAvLyBFeHRyYWN0IHRoZSByZXR1cm4gdmFsdWUNCi0gICAgICAgICAgICBpZiAocmV0dXJuVHlwZSAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgIEFueSByZXR1cm5lZCA9IHJlcXVlc3QucmV0dXJuX3ZhbHVlKCk7DQotICAgICAgICAgICAgICAgIHJldHVyblZhbHVlID0gQ29yYmFVdGlsLmV4dHJhY3RWYWx1ZShyZXR1cm5UeXBlLCByZXR1cm5lZCk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIC8vIEV4dHJhY3QgdGhlIHZhbHVlcyBvZiBpbm91dCBhbmQgb3V0IHBhcmFtZXRlcnMNCi0gICAgICAgICAgICByZXR1cm5lZFBhcmFtcyA9IG5ldyBBcnJheUxpc3QoKTsNCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtZXRlclR5cGVMaXN0LnNpemUoKTsgaSsrKSB7DQotICAgICAgICAgICAgICAgIE1lbWJlciBtZW1iZXIgPSAoTWVtYmVyKSBwYXJhbWV0ZXJUeXBlTGlzdC5nZXQoaSk7DQotICAgICAgICAgICAgICAgIFN0cmluZyBtb2RlID0gbWVtYmVyLmdldE1vZGUoKTsNCi0gICAgICAgICAgICAgICAgaWYgKG1vZGUuZXF1YWxzKE1lbWJlci5NT0RFX0lOT1VUKSB8fCBtb2RlLmVxdWFscyhNZW1iZXIuTU9ERV9PVVQpKSB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm5lZFBhcmFtcy5hZGQoQ29yYmFVdGlsLmV4dHJhY3RWYWx1ZShtZW1iZXIuZ2V0RGF0YVR5cGUoKSwgKEFueSkgbWVtQXJncy5nZXQoaSkpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgaWYoZXhjZXB0aW9uIGluc3RhbmNlb2YgVW5rbm93blVzZXJFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICAgICAgVW5rbm93blVzZXJFeGNlcHRpb24gdXNlckV4Y2VwdGlvbiA9IChVbmtub3duVXNlckV4Y2VwdGlvbikgZXhjZXB0aW9uOw0KLSAgICAgICAgICAgICAgICBUeXBlQ29kZSBleFR5cGVDb2RlID0gdXNlckV4Y2VwdGlvbi5leGNlcHQudHlwZSgpOw0KLSAgICAgICAgICAgICAgICBFeGNlcHRpb25UeXBlIGV4Y2VwdGlvblR5cGUgPSBudWxsOw0KLSAgICAgICAgICAgICAgICBpZiAoZXhjZXB0aW9ucyE9bnVsbCAmJiAhZXhjZXB0aW9ucy5pc0VtcHR5KCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXhjZXB0aW9ucy5zaXplKCk7IGkrKykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIEV4Y2VwdGlvblR5cGUgZXhUeXBlID0gKEV4Y2VwdGlvblR5cGUpIGV4Y2VwdGlvbnMuZ2V0KGkpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleFR5cGVDb2RlLmVxdWFsKGV4VHlwZS5nZXRUeXBlQ29kZSgpKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHRpb25UeXBlID0gZXhUeXBlOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgaWYgKGV4Y2VwdGlvblR5cGU9PW51bGwpIHsNCi0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb3JiYUludm9jYXRpb25FeGNlcHRpb24oZXhjZXB0aW9uKTsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgIEV4Y2VwdGlvblZhbHVlIGV4Y2VwdGlvblZhbHVlID0gKEV4Y2VwdGlvblZhbHVlKSBDb3JiYVV0aWwuZXh0cmFjdFZhbHVlKGV4Y2VwdGlvblR5cGUsIHVzZXJFeGNlcHRpb24uZXhjZXB0KTsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChleGNlcHRpb25WYWx1ZSE9bnVsbCkNCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBleGNlcHRpb25WYWx1ZS5nZXRFeGNlcHRpb24oKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb3JiYUludm9jYXRpb25FeGNlcHRpb24oZXhjZXB0aW9uKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0UGFyYW1ldGVycyhPYmplY3RbXSBwYXJhbWV0ZXJzKXsNCi0gICAgICAgIHRoaXMucGFyYW1ldGVycyA9IHBhcmFtZXRlcnM7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRJbnRlcmZhY2VOYW1lKCl7DQotICAgICAgICByZXR1cm4gaW50Zi5nZXROYW1lKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRPcGVyYXRpb25OYW1lKCl7DQotICAgICAgICByZXR1cm4gb3BlcmF0aW9uLmdldE5hbWUoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgRGF0YVR5cGUgZ2V0UmV0dXJuVHlwZSgpIHsNCi0gICAgICAgIHJldHVybiBvcGVyYXRpb24uZ2V0UmV0dXJuVHlwZSgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBPYmplY3RbXSBnZXRPdXRQYXJhbWV0ZXJWYWx1ZXNzKCkgew0KLSAgICAgICAgaWYgKHJldHVybmVkUGFyYW1zID09IG51bGwpDQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICBlbHNlDQotICAgICAgICAgICAgcmV0dXJuIHJldHVybmVkUGFyYW1zLnRvQXJyYXkoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTWVtYmVyW10gZ2V0UGFyYW1ldGVyTWVtYmVycygpIHsNCi0gICAgICAgIE1lbWJlcltdIG1lbWJlcnNBcnJheSA9IG5ldyBNZW1iZXJbcGFyYW1ldGVyVHlwZUxpc3Quc2l6ZSgpXTsNCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1ldGVyVHlwZUxpc3Quc2l6ZSgpOyBpKyspIHsNCi0gICAgICAgICAgICBtZW1iZXJzQXJyYXlbaV0gPSAoTWVtYmVyKSBwYXJhbWV0ZXJUeXBlTGlzdC5nZXQoaSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbWVtYmVyc0FycmF5Ow0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL3JlY2VpdmVycy9Db3JiYUludm9rZXJGYWN0b3J5LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9yZWNlaXZlcnMvQ29yYmFJbnZva2VyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWRkMWU1Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL3JlY2VpdmVycy9Db3JiYUludm9rZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLnJlY2VpdmVyczsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5leGNlcHRpb25zLkNvcmJhSW52b2NhdGlvbkV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5pZGwudHlwZXMuSURMOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC50eXBlcy5JbnRlcmZhY2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLnR5cGVzLk9wZXJhdGlvbjsNCi0NCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi1wdWJsaWMgY2xhc3MgQ29yYmFJbnZva2VyRmFjdG9yeSBpbXBsZW1lbnRzIEludm9rZXJGYWN0b3J5IHsNCi0gICAgLy9wcml2YXRlIE1hcCBjb21wb3NpdGVEYXRhVHlwZXM7DQotICAgIHByaXZhdGUgTWFwIGludGVyZmFjZXM7DQotDQotICAgIHB1YmxpYyBDb3JiYUludm9rZXJGYWN0b3J5KElETCBpZGwpew0KLSAgICAgICAgLy90aGlzLmNvbXBvc2l0ZURhdGFUeXBlcyA9IGlkbC5nZXRDb21wb3NpdGVEYXRhVHlwZXMoKTsNCi0gICAgICAgIHRoaXMuaW50ZXJmYWNlcyA9IGlkbC5nZXRJbnRlcmZhY2VzKCk7DQotICAgIH0NCi0NCi0JcHVibGljIEludm9rZXIgbmV3SW52b2tlcihTdHJpbmcgaW50ZXJmYWNlTmFtZSwgU3RyaW5nIG9wZXJhdGlvbk5hbWUsIG9yZy5vbWcuQ09SQkEuT2JqZWN0IG9iamVjdCkgdGhyb3dzIENvcmJhSW52b2NhdGlvbkV4Y2VwdGlvbiB7DQotICAgICAgICBJbnRlcmZhY2UgaW50ZiA9IChJbnRlcmZhY2UpIGludGVyZmFjZXMuZ2V0KGludGVyZmFjZU5hbWUpOw0KLQ0KLSAgICAgICAgaWYgKGludGY9PW51bGwpDQotICAgICAgICAgICAgdGhyb3cgbmV3IENvcmJhSW52b2NhdGlvbkV4Y2VwdGlvbigiSW50ZXJmYWNlICIgKyBpbnRlcmZhY2VOYW1lICsgIiBub3QgZm91bmQiKTsNCi0NCi0gICAgICAgIE1hcCBvcGVyYXRpb25zID0gaW50Zi5nZXRPcGVyYXRpb25zTWFwKCk7DQotDQotICAgICAgICBpZiAob3BlcmF0aW9ucz09bnVsbCB8fCBvcGVyYXRpb25zLmlzRW1wdHkoKSkNCi0gICAgICAgICAgICB0aHJvdyBuZXcgQ29yYmFJbnZvY2F0aW9uRXhjZXB0aW9uKCJJbnRlcmZhY2UgIiArIGludGVyZmFjZU5hbWUgKyAiIGRvZXMgbm90IGhhdmUgb3BlcmF0aW9ucyIpOw0KLQ0KLSAgICAgICAgT3BlcmF0aW9uIG9wZXJhdGlvbiA9IChPcGVyYXRpb24pIG9wZXJhdGlvbnMuZ2V0KG9wZXJhdGlvbk5hbWUpOw0KLQ0KLSAgICAgICAgaWYgKG9wZXJhdGlvbj09bnVsbCkNCi0gICAgICAgICAgICB0aHJvdyBuZXcgQ29yYmFJbnZvY2F0aW9uRXhjZXB0aW9uKCJPcGVyYXRpb24gIiArIG9wZXJhdGlvbk5hbWUgKyAiIG5vdCBmb3VuZCBpbiBpbnRlcmZhY2UgIiArIGludGVyZmFjZU5hbWUpOw0KLQ0KLSAgICAgICAgcmV0dXJuIG5ldyBDb3JiYUludm9rZXIob3BlcmF0aW9uLCBpbnRmLCAvKmNvbXBvc2l0ZURhdGFUeXBlcywqLyBvYmplY3QpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL3JlY2VpdmVycy9Db3JiYU1lc3NhZ2VSZWNlaXZlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvcmVjZWl2ZXJzL0NvcmJhTWVzc2FnZVJlY2VpdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4NDhmNzEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvcmVjZWl2ZXJzL0NvcmJhTWVzc2FnZVJlY2VpdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5yZWNlaXZlcnM7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTmFtZXNwYWNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29yYmEuZGVwbG95ZXIuQ29yYmFDb25zdGFudHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29yYmEuZXhjZXB0aW9ucy5Db3JiYUludm9jYXRpb25FeGNlcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLnR5cGVzLklETDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5pZGwudHlwZXMuTWVtYmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNNZXNzYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5BYnN0cmFjdEluT3V0TWVzc2FnZVJlY2VpdmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuV1NETENvbnN0YW50czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLWltcG9ydCBvcmcub21nLkNPUkJBXzJfMy5PUkI7DQotDQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLXB1YmxpYyBjbGFzcyBDb3JiYU1lc3NhZ2VSZWNlaXZlciBleHRlbmRzIEFic3RyYWN0SW5PdXRNZXNzYWdlUmVjZWl2ZXIgaW1wbGVtZW50cyBDb3JiYUNvbnN0YW50cyB7DQotICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhDb3JiYU1lc3NhZ2VSZWNlaXZlci5jbGFzcyk7DQotICAgIHByaXZhdGUgT1JCIG9yYiA9IG51bGw7DQotICAgIHByaXZhdGUgTWFwIGludm9rZXJDYWNoZSA9IG5ldyBIYXNoTWFwKCk7IC8vIEhhc2htYXAgdG8gY2FjaGUgaW52b2tlciBvYmplY3RzIHRvIGluY3JlYXNlIHByZWZvcm1hbmNlDQotDQotICAgIHB1YmxpYyB2b2lkIGludm9rZUJ1c2luZXNzTG9naWMoTWVzc2FnZUNvbnRleHQgaW5NZXNzYWdlLCBNZXNzYWdlQ29udGV4dCBvdXRNZXNzYWdlKSB0aHJvd3MgQXhpc0ZhdWx0IHsNCi0gICAgICAgIHRyeXsNCi0gICAgICAgICAgICBpbnZva2UoaW5NZXNzYWdlLCBvdXRNZXNzYWdlKTsNCi0gICAgICAgIH0gY2F0Y2ggKG9yZy5vbWcuQ09SQkEuVFJBTlNJRU5UIGUpIHsNCi0gICAgICAgICAgICBsb2cuaW5mbygib3JnLm9tZy5DT1JCQS5UUkFOU0lFTlQgZXhjZXB0aW9uIHRocm93bi4iKTsNCi0gICAgICAgICAgICAvKg0KLSAgICAgICAgICAgICogSWYgY2Fubm90IGNvbm5lY3QgdG8gdGhlIGNvcmJhIHNlcnZlcg0KLSAgICAgICAgICAgICogdHJ5IGFnYWluIGFmdGVyIGNsZWFyaW5nIHRoZSBjYWNoZQ0KLSAgICAgICAgICAgICogKGVnLiBpZiB0aGUgQ29yYmEgc2VydmVyIGlzIHJlc3RhcnRlZCkgDQotICAgICAgICAgICAgKi8NCi0gICAgICAgICAgICBpbnZva2VyQ2FjaGUuY2xlYXIoKTsNCi0gICAgICAgICAgICBpbnZva2UoaW5NZXNzYWdlLCBvdXRNZXNzYWdlKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgaW52b2tlKE1lc3NhZ2VDb250ZXh0IGluTWVzc2FnZSwgTWVzc2FnZUNvbnRleHQgb3V0TWVzc2FnZSkgdGhyb3dzIEF4aXNGYXVsdCB7DQotICAgICAgICBTdHJpbmcgbWV0aG9kTmFtZSA9IG51bGw7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIEF4aXNPcGVyYXRpb24gb3AgPSBpbk1lc3NhZ2UuZ2V0T3BlcmF0aW9uQ29udGV4dCgpLmdldEF4aXNPcGVyYXRpb24oKTsNCi0gICAgICAgICAgICBBeGlzU2VydmljZSBzZXJ2aWNlID0gaW5NZXNzYWdlLmdldEF4aXNTZXJ2aWNlKCk7DQotICAgICAgICAgICAgT01FbGVtZW50IG1ldGhvZEVsZW1lbnQgPSBpbk1lc3NhZ2UuZ2V0RW52ZWxvcGUoKS5nZXRCb2R5KCkuZ2V0Rmlyc3RFbGVtZW50KCk7DQotICAgICAgICAgICAgQXhpc01lc3NhZ2UgaW5BeGlzTWVzc2FnZSA9IG9wLmdldE1lc3NhZ2UoV1NETENvbnN0YW50cy5NRVNTQUdFX0xBQkVMX0lOX1ZBTFVFKTsNCi0gICAgICAgICAgICBTdHJpbmcgbWVzc2FnZU5hbWVTcGFjZSA9IG51bGw7DQotICAgICAgICAgICAgUU5hbWUgZWxlbWVudFFOYW1lOw0KLSAgICAgICAgICAgIG1ldGhvZE5hbWUgPSBvcC5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCk7DQotDQotICAgICAgICAgICAgSW52b2tlciBpbnZva2VyID0gKEludm9rZXIpIGludm9rZXJDYWNoZS5nZXQobWV0aG9kTmFtZSk7DQotICAgICAgICAgICAgaWYgKGludm9rZXI9PW51bGwpIHsNCi0gICAgICAgICAgICAgICAgaWYgKG9yYj09bnVsbCkgew0KLSAgICAgICAgICAgICAgICAgICAgUGFyYW1ldGVyIG9yYlBhcmFtID0gc2VydmljZS5nZXRQYXJhbWV0ZXIoT1JCX0xJVEVSQUwpOw0KLSAgICAgICAgICAgICAgICAgICAgb3JiID0gb3JiUGFyYW0gIT0gbnVsbCA/IChPUkIpIG9yYlBhcmFtLmdldFZhbHVlKCkgOiBDb3JiYVV0aWwuZ2V0T1JCKHNlcnZpY2UpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIG9yZy5vbWcuQ09SQkEuT2JqZWN0IG9iaiA9IENvcmJhVXRpbC5yZXNvbHZlT2JqZWN0KHNlcnZpY2UsIG9yYik7DQotICAgICAgICAgICAgICAgIFBhcmFtZXRlciBpZGxQYXJhbWV0ZXIgPSBzZXJ2aWNlLmdldFBhcmFtZXRlcihJRExfTElURVJBTCk7DQotICAgICAgICAgICAgICAgIGlmIChpZGxQYXJhbWV0ZXI9PW51bGwpDQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29yYmFJbnZvY2F0aW9uRXhjZXB0aW9uKCJJREwgbm90IGZvdW5kIik7DQotICAgICAgICAgICAgICAgIElETCBpZGwgPSAoSURMKSBpZGxQYXJhbWV0ZXIuZ2V0VmFsdWUoKTsNCi0gICAgICAgICAgICAgICAgaW52b2tlciA9IENvcmJhVXRpbC5nZXRJbnZva2VyKHNlcnZpY2UsIG9iaiwgaWRsLCBtZXRob2ROYW1lKTsNCi0gICAgICAgICAgICAgICAgaW52b2tlckNhY2hlLnB1dChtZXRob2ROYW1lLCBpbnZva2VyKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgT2JqZWN0IHJlc09iamVjdCA9IG51bGw7DQotICAgICAgICAgICAgTWVtYmVyW10gcGFyYW1zID0gbnVsbDsNCi0gICAgICAgICAgICBPYmplY3RbXSBvdXRQYXJhbVZhbHVlcyA9IG51bGw7DQotICAgICAgICAgICAgaWYgKGluQXhpc01lc3NhZ2UgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICBpZiAoaW5BeGlzTWVzc2FnZS5nZXRFbGVtZW50UU5hbWUoKSAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICBlbGVtZW50UU5hbWUgPSBpbkF4aXNNZXNzYWdlLmdldEVsZW1lbnRRTmFtZSgpOw0KLSAgICAgICAgICAgICAgICAgICAgbWVzc2FnZU5hbWVTcGFjZSA9IGVsZW1lbnRRTmFtZS5nZXROYW1lc3BhY2VVUkkoKTsNCi0gICAgICAgICAgICAgICAgICAgIE9NTmFtZXNwYWNlIG5hbWVzcGFjZSA9IG1ldGhvZEVsZW1lbnQuZ2V0TmFtZXNwYWNlKCk7DQotICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZU5hbWVTcGFjZSAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZSA9PSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoIm5hbWVzcGFjZSBtaXNtYXRjaCByZXF1aXJlICIgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VOYW1lU3BhY2UgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZm91bmQgbm9uZSIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1lc3NhZ2VOYW1lU3BhY2UuZXF1YWxzKG5hbWVzcGFjZS5nZXROYW1lc3BhY2VVUkkoKSkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgibmFtZXNwYWNlIG1pc21hdGNoIHJlcXVpcmUgIiArDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZU5hbWVTcGFjZSArDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBmb3VuZCAiICsgbWV0aG9kRWxlbWVudC5nZXROYW1lc3BhY2UoKS5nZXROYW1lc3BhY2VVUkkoKSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuYW1lc3BhY2UgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoIm5hbWVzcGFjZSBtaXNtYXRjaC4gQXhpcyBPZXByYXRpb24gZXhwZWN0cyBub24tbmFtZXNwYWNlICIgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInF1YWxpZmllZCBlbGVtZW50LiBCdXQgcmVjZWl2ZWQgYSBuYW1lc3BhY2UgcXVhbGlmaWVkIGVsZW1lbnQiKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIE9iamVjdFtdIG9iamVjdEFycmF5ID0gQ29yYmFVdGlsLmV4dHJhY3RQYXJhbWV0ZXJzKG1ldGhvZEVsZW1lbnQsIGludm9rZXIuZ2V0UGFyYW1ldGVyTWVtYmVycygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGludm9rZXIuc2V0UGFyYW1ldGVycyhvYmplY3RBcnJheSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgcmVzT2JqZWN0ID0gaW52b2tlci5pbnZva2UoKTsNCi0gICAgICAgICAgICAgICAgcGFyYW1zID0gaW52b2tlci5nZXRQYXJhbWV0ZXJNZW1iZXJzKCk7DQotICAgICAgICAgICAgICAgIG91dFBhcmFtVmFsdWVzID0gaW52b2tlci5nZXRPdXRQYXJhbWV0ZXJWYWx1ZXNzKCk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGlmIChtZXNzYWdlTmFtZVNwYWNlID09IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgQXhpc01lc3NhZ2Ugb3V0YXhpc01lc3NhZ2UgPSBvcC5nZXRNZXNzYWdlKFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9PVVRfVkFMVUUpOw0KLSAgICAgICAgICAgICAgICBRTmFtZSBxbmFtZSA9IG91dGF4aXNNZXNzYWdlLmdldEVsZW1lbnRRTmFtZSgpOw0KLSAgICAgICAgICAgICAgICBpZiAocW5hbWUgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICAgICAgbWVzc2FnZU5hbWVTcGFjZSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIC8vIEhhbmRsaW5nIHRoZSByZXNwb25zZQ0KLSAgICAgICAgICAgIFNPQVBGYWN0b3J5IGZhYyA9IGdldFNPQVBGYWN0b3J5KGluTWVzc2FnZSk7DQotICAgICAgICAgICAgQ29yYmFVdGlsLnByb2Nlc3NSZXNwb25zZShyZXNPYmplY3QsIHBhcmFtcywgb3V0UGFyYW1WYWx1ZXMsIGludm9rZXIuZ2V0UmV0dXJuVHlwZSgpLCBzZXJ2aWNlLA0KLSAgICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSwgZmFjLCBtZXNzYWdlTmFtZVNwYWNlLCBvdXRNZXNzYWdlKTsNCi0gICAgICAgIH0gY2F0Y2ggKENvcmJhSW52b2NhdGlvbkV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgU3RyaW5nIG1zZzsNCi0gICAgICAgICAgICBUaHJvd2FibGUgY2F1c2UgPSBlLmdldENhdXNlKCk7DQotICAgICAgICAgICAgaWYgKGNhdXNlICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgbXNnID0gY2F1c2UuZ2V0TWVzc2FnZSgpOw0KLSAgICAgICAgICAgICAgICBpZiAobXNnID09IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgICAgIG1zZyA9ICJFeGNlcHRpb24gb2NjdXJyZWQgd2hpbGUgdHJ5aW5nIHRvIGludm9rZSBzZXJ2aWNlIG1ldGhvZCAiICsgbWV0aG9kTmFtZTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAvL2xvZy5lcnJvcihtc2csIGUpOw0KLSAgICAgICAgICAgICAgICBpZiAoY2F1c2UgaW5zdGFuY2VvZiBBeGlzRmF1bHQpIHsNCi0gICAgICAgICAgICAgICAgICAgIHRocm93IChBeGlzRmF1bHQpIGNhdXNlOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgbXNnID0gZS5nZXRNZXNzYWdlKCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQobXNnLCBlKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9yZWNlaXZlcnMvQ29yYmFVdGlsLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9yZWNlaXZlcnMvQ29yYmFVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzNTM1YmUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvcmVjZWl2ZXJzL0NvcmJhVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzI1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY29yYmEucmVjZWl2ZXJzOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5hbWVzcGFjZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmRlcGxveWVyLkNvcmJhQ29uc3RhbnRzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmV4Y2VwdGlvbnMuQ29yYmFFeGNlcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29yYmEuZXhjZXB0aW9ucy5Db3JiYUludm9jYXRpb25FeGNlcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLklETFByb2Nlc3NvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5pZGwuUHJlUHJvY2Vzc29ySW5wdXRTdHJlYW07DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLnR5cGVzLkFic3RyYWN0Q29sbGVjdGlvblR5cGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLnR5cGVzLkFycmF5VHlwZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5pZGwudHlwZXMuQ29tcG9zaXRlRGF0YVR5cGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLnR5cGVzLkRhdGFUeXBlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC50eXBlcy5FbnVtVHlwZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5pZGwudHlwZXMuRXhjZXB0aW9uVHlwZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5pZGwudHlwZXMuSURMOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC50eXBlcy5NZW1iZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLnR5cGVzLlByaW1pdGl2ZURhdGFUeXBlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC50eXBlcy5TZXF1ZW5jZVR5cGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLnR5cGVzLlN0cnVjdDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5pZGwudHlwZXMuVHlwZWRlZjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5pZGwudHlwZXMuVW5pb25NZW1iZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLnR5cGVzLlVuaW9uVHlwZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5pZGwudHlwZXMuVmFsdWVUeXBlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC52YWx1ZXMuQWJzdHJhY3RDb2xsZWN0aW9uVmFsdWU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLnZhbHVlcy5BYnN0cmFjdFZhbHVlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC52YWx1ZXMuQWxpYXNWYWx1ZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5pZGwudmFsdWVzLkFycmF5VmFsdWU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLnZhbHVlcy5FbnVtVmFsdWU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLnZhbHVlcy5FeGNlcHRpb25WYWx1ZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5pZGwudmFsdWVzLk9iamVjdEJ5VmFsdWU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLnZhbHVlcy5TZXF1ZW5jZVZhbHVlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC52YWx1ZXMuU3RyZWFtYWJsZVZhbHVlRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5pZGwudmFsdWVzLlN0cnVjdFZhbHVlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC52YWx1ZXMuVW5pb25WYWx1ZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5QYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uamF2YTJ3c2RsLlR5cGVUYWJsZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5uYW1lc3BhY2UuQ29uc3RhbnRzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotaW1wb3J0IG9yZy5vbWcuQ09SQkEuQW55Ow0KLWltcG9ydCBvcmcub21nLkNPUkJBLlRDS2luZDsNCi1pbXBvcnQgb3JnLm9tZy5DT1JCQS5UeXBlQ29kZTsNCi1pbXBvcnQgb3JnLm9tZy5DT1JCQV8yXzMuT1JCOw0KLWltcG9ydCBvcmcub21nLkNvc05hbWluZy5OYW1pbmdDb250ZXh0RXh0Ow0KLWltcG9ydCBvcmcub21nLkNvc05hbWluZy5OYW1pbmdDb250ZXh0RXh0SGVscGVyOw0KLWltcG9ydCBvcmcub21nLkNvc05hbWluZy5OYW1pbmdDb250ZXh0UGFja2FnZS5DYW5ub3RQcm9jZWVkOw0KLWltcG9ydCBvcmcub21nLkNvc05hbWluZy5OYW1pbmdDb250ZXh0UGFja2FnZS5JbnZhbGlkTmFtZTsNCi1pbXBvcnQgb3JnLm9tZy5Db3NOYW1pbmcuTmFtaW5nQ29udGV4dFBhY2thZ2UuTm90Rm91bmQ7DQotDQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotaW1wb3J0IGphdmEuaW8uRmlsZTsNCi0vL2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5GaWxlUmVhZGVyOw0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOw0KLS8vaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7DQotLy9pbXBvcnQgamF2YS51dGlsLnppcC5aaXBJbnB1dFN0cmVhbTsNCi0NCi1wdWJsaWMgY2xhc3MgQ29yYmFVdGlsIGltcGxlbWVudHMgQ29yYmFDb25zdGFudHMgew0KLSAgICBwcml2YXRlIHN0YXRpYyBNYXAgSURMX0NBQ0hFID0gbmV3IEhhc2hNYXAoKTsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKENvcmJhVXRpbC5jbGFzcyk7DQotDQotICAgIHB1YmxpYyBzdGF0aWMgb3JnLm9tZy5DT1JCQV8yXzMuT1JCIGdldE9SQihBeGlzU2VydmljZSBzZXJ2aWNlKSB7DQotICAgICAgICBQYXJhbWV0ZXIgb3JiQ2xhc3MgPSBzZXJ2aWNlLmdldFBhcmFtZXRlcihPUkJfQ0xBU1MpOw0KLSAgICAgICAgUGFyYW1ldGVyIG9yYlNpbmdsZXRvbkNsYXNzID0gc2VydmljZS5nZXRQYXJhbWV0ZXIoT1JCX1NJTkdMRVRPTl9DTEFTUyk7DQotICAgICAgICBQcm9wZXJ0aWVzIHByb3BzID0gU3lzdGVtLmdldFByb3BlcnRpZXMoKTsNCi0NCi0gICAgICAgIGlmIChvcmJDbGFzcyE9bnVsbCkNCi0gICAgICAgICAgICBwcm9wcy5wdXQoT1JHX09NR19DT1JCQV9PUkJDTEFTUywgKChTdHJpbmcpIG9yYkNsYXNzLmdldFZhbHVlKCkpLnRyaW0oKSk7DQotICAgICAgICBlbHNlDQotICAgICAgICAgICAgcHJvcHMucHV0KE9SR19PTUdfQ09SQkFfT1JCQ0xBU1MsIERFRkFVTFJfT1JCX0NMQVNTKTsNCi0NCi0gICAgICAgIGlmIChvcmJTaW5nbGV0b25DbGFzcyE9bnVsbCkNCi0gICAgICAgICAgICBwcm9wcy5wdXQoT1JHX09NR19DT1JCQV9PUkJTSU5HTEVUT05fQ0xBU1MsICgoU3RyaW5nKSBvcmJTaW5nbGV0b25DbGFzcy5nZXRWYWx1ZSgpKS50cmltKCkpOw0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHByb3BzLnB1dChPUkdfT01HX0NPUkJBX09SQlNJTkdMRVRPTl9DTEFTUywgREVGQVVMVF9PUkJTSU5HTEVUT05fQ0xBU1MpOw0KLQ0KLSAgICAgICAgcmV0dXJuIChPUkIpIE9SQi5pbml0KG5ldyBTdHJpbmdbXXt9LCBwcm9wcyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBvcmcub21nLkNPUkJBLk9iamVjdCByZXNvbHZlT2JqZWN0KEF4aXNTZXJ2aWNlIHNlcnZpY2UsIG9yZy5vbWcuQ09SQkFfMl8zLk9SQiBvcmIpIHRocm93cyBDb3JiYUludm9jYXRpb25FeGNlcHRpb24gew0KLSAgICAgICAgb3JnLm9tZy5DT1JCQS5PYmplY3Qgb2JqOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBQYXJhbWV0ZXIgbmFtaW5nU2VydmljZVVybCA9IHNlcnZpY2UuZ2V0UGFyYW1ldGVyKE5BTUlOR19TRVJWSUNFX1VSTCk7DQotICAgICAgICAgICAgUGFyYW1ldGVyIG9iamVjdE5hbWUgPSBzZXJ2aWNlLmdldFBhcmFtZXRlcihPQkpFQ1RfTkFNRSk7DQotICAgICAgICAgICAgUGFyYW1ldGVyIGlvckZpbGVQYXRoID0gc2VydmljZS5nZXRQYXJhbWV0ZXIoSU9SX0ZJTEVfUEFUSCk7DQotICAgICAgICAgICAgUGFyYW1ldGVyIGlvclN0cmluZyA9IHNlcnZpY2UuZ2V0UGFyYW1ldGVyKElPUl9TVFJJTkcpOw0KLQ0KLSAgICAgICAgICAgIGlmIChuYW1pbmdTZXJ2aWNlVXJsIT1udWxsICYmIG9iamVjdE5hbWUhPW51bGwpIHsNCi0gICAgICAgICAgICAgICAgb2JqID0gb3JiLnN0cmluZ190b19vYmplY3QoKChTdHJpbmcpIG5hbWluZ1NlcnZpY2VVcmwuZ2V0VmFsdWUoKSkudHJpbSgpKTsNCi0gICAgICAgICAgICAgICAgTmFtaW5nQ29udGV4dEV4dCBuYyA9IE5hbWluZ0NvbnRleHRFeHRIZWxwZXIubmFycm93KG9iaik7DQotICAgICAgICAgICAgICAgIG9iaiA9IG5jLnJlc29sdmUobmMudG9fbmFtZSgoKFN0cmluZykgb2JqZWN0TmFtZS5nZXRWYWx1ZSgpKS50cmltKCkpKTsNCi0gICAgICAgICAgICB9IGVsc2UgaWYgKGlvckZpbGVQYXRoIT1udWxsKSB7DQotICAgICAgICAgICAgICAgIEZpbGVSZWFkZXIgZmlsZVJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCgoU3RyaW5nKSBpb3JGaWxlUGF0aC5nZXRWYWx1ZSgpKS50cmltKCkpOw0KLSAgICAgICAgICAgICAgICBjaGFyW10gYnVmID0gbmV3IGNoYXJbMTAwMF07DQotICAgICAgICAgICAgICAgIGZpbGVSZWFkZXIucmVhZChidWYpOw0KLSAgICAgICAgICAgICAgICBvYmogPSBvcmIuc3RyaW5nX3RvX29iamVjdCgobmV3IFN0cmluZyhidWYpKS50cmltKCkpOw0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoaW9yU3RyaW5nIT1udWxsKSB7DQotICAgICAgICAgICAgICAgIG9iaiA9IG9yYi5zdHJpbmdfdG9fb2JqZWN0KCgoU3RyaW5nKSBpb3JTdHJpbmcuZ2V0VmFsdWUoKSkudHJpbSgpKTsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29yYmFJbnZvY2F0aW9uRXhjZXB0aW9uKCJjYW5ub3QgcmVzb2x2ZSBvYmplY3QiKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICB9IGNhdGNoIChOb3RGb3VuZCBub3RGb3VuZCkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBDb3JiYUludm9jYXRpb25FeGNlcHRpb24oImNhbm5vdCByZXNvbHZlIG9iamVjdCIsIG5vdEZvdW5kKTsNCi0gICAgICAgIH0gY2F0Y2ggKENhbm5vdFByb2NlZWQgY2Fubm90UHJvY2VlZCkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBDb3JiYUludm9jYXRpb25FeGNlcHRpb24oImNhbm5vdCByZXNvbHZlIG9iamVjdCIsIGNhbm5vdFByb2NlZWQpOw0KLSAgICAgICAgfSBjYXRjaCAoSW52YWxpZE5hbWUgaW52YWxpZE5hbWUpIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgQ29yYmFJbnZvY2F0aW9uRXhjZXB0aW9uKCJjYW5ub3QgcmVzb2x2ZSBvYmplY3QiLCBpbnZhbGlkTmFtZSk7DQotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IENvcmJhSW52b2NhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHJlc29sdmUgb2JqZWN0IiwgZSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gb2JqOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgSURMIGdldElETChBeGlzU2VydmljZSBzZXJ2aWNlLCBPUkIgb3JiLCBTdHJpbmcgZGlyTmFtZSkgdGhyb3dzIENvcmJhRXhjZXB0aW9uIHsNCi0gICAgICAgIFBhcmFtZXRlciBpZGxGaWxlID0gc2VydmljZS5nZXRQYXJhbWV0ZXIoSURMX0ZJTEUpOw0KLQ0KLSAgICAgICAgaWYgKGlkbEZpbGUgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBDb3JiYUludm9jYXRpb25FeGNlcHRpb24oIlBsZWFzZSBzcGVjaWZ5IHRoZSBJREwgZmlsZSIpOyAgICANCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFN0cmluZyBpZGxGaWxlTmFtZSA9ICgoU3RyaW5nKSBpZGxGaWxlLmdldFZhbHVlKCkpLnRyaW0oKTsNCi0gICAgICAgIFN0cmluZyBjYWNoZUtleSA9IGRpck5hbWUgKyBGaWxlLnNlcGFyYXRvciArIGlkbEZpbGVOYW1lOw0KLSAgICAgICAgSURMIGlkbCA9IChJREwpIElETF9DQUNIRS5nZXQoY2FjaGVLZXkpOw0KLSAgICAgICAgaWYgKGlkbD09bnVsbCkgew0KLSAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgIC8qRmlsZSBmaWxlID0gbmV3IEZpbGUoZGlyTmFtZSk7DQotICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIHN0cmVhbTsNCi0gICAgICAgICAgICAgICAgaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgc3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShjYWNoZUtleSk7DQotICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICBaaXBJbnB1dFN0cmVhbSB6aW4gPSBuZXcgWmlwSW5wdXRTdHJlYW0obmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKSk7DQotDQotICAgICAgICAgICAgICAgICAgICBaaXBFbnRyeSBlbnRyeTsNCi0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZm91bmQgPSBmYWxzZTsNCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlICgoZW50cnkgPSB6aW4uZ2V0TmV4dEVudHJ5KCkpICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW50cnkuZ2V0TmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoaWRsRmlsZU5hbWUpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkNCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ29yYmFJbnZvY2F0aW9uRXhjZXB0aW9uKCJjYW5ub3QgZmluZCAiICsgaWRsRmlsZU5hbWUgKyAiIGluICIgKyBmaWxlLmdldFBhdGgoKSk7DQotDQotICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPSB6aW47DQotICAgICAgICAgICAgICAgIH0qLw0KLSAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBzdHJlYW0gPSBuZXcgUHJlUHJvY2Vzc29ySW5wdXRTdHJlYW0oZGlyTmFtZSwgaWRsRmlsZU5hbWUpOw0KLSAgICAgICAgICAgICAgICAvL1RPRE86IFNldCBwcmUtcHJvY2Vzc29yIHN5c3RlbSBhbmQgdXNlciBpbnB1dCBwYXRocw0KLSAgICAgICAgICAgICAgICBJRExQcm9jZXNzb3IgaWRsUHJvY2Vzc29yID0gbmV3IElETFByb2Nlc3NvcihzdHJlYW0pOw0KLSAgICAgICAgICAgICAgICBpZGwgPSBpZGxQcm9jZXNzb3IucHJvY2VzcygpOw0KLSAgICAgICAgICAgICAgICBzdHJlYW0uY2xvc2UoKTsNCi0gICAgICAgICAgICAgICAgSURMX0NBQ0hFLnB1dChjYWNoZUtleSwgaWRsKTsNCi0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb3JiYUludm9jYXRpb25FeGNlcHRpb24oImNhbm5vdCBwcm9jZXNzIGlkbCBmaWxlIiwgZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgTWFwIHR5cGVzID0gaWRsLmdldENvbXBvc2l0ZURhdGFUeXBlcygpOw0KLSAgICAgICAgaWYgKHR5cGVzIT1udWxsKSB7DQotICAgICAgICAgICAgSXRlcmF0b3IgaXRlciA9IHR5cGVzLnZhbHVlcygpLml0ZXJhdG9yKCk7DQotICAgICAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7DQotICAgICAgICAgICAgICAgIERhdGFUeXBlIHR5cGUgPSAgKERhdGFUeXBlKSBpdGVyLm5leHQoKTsNCi0gICAgICAgICAgICAgICAgaWYgKHR5cGUgaW5zdGFuY2VvZiBWYWx1ZVR5cGUpIHsNCi0gICAgICAgICAgICAgICAgICAgIFN0cmVhbWFibGVWYWx1ZUZhY3RvcnkucmVnaXN0ZXIob3JiLCAoVmFsdWVUeXBlKSB0eXBlKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBpZGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBJbnZva2VyIGdldEludm9rZXIoQXhpc1NlcnZpY2Ugc2VydmljZSwgb3JnLm9tZy5DT1JCQS5PYmplY3Qgb2JqLCBJREwgaWRsLCBTdHJpbmcgbWV0aG9kTmFtZSkgdGhyb3dzIENvcmJhSW52b2NhdGlvbkV4Y2VwdGlvbiB7DQotICAgICAgICBJbnZva2VyRmFjdG9yeSBpbnZva2VyRmFjdG9yeSA9IG5ldyBDb3JiYUludm9rZXJGYWN0b3J5KGlkbCk7DQotICAgICAgICBQYXJhbWV0ZXIgaW50ZXJmYWNlTmFtZSA9IHNlcnZpY2UuZ2V0UGFyYW1ldGVyKElOVEVSRkFDRV9OQU1FKTsNCi0gICAgICAgIGlmIChpbnRlcmZhY2VOYW1lPT1udWxsKQ0KLSAgICAgICAgICAgIHRocm93IG5ldyBDb3JiYUludm9jYXRpb25FeGNlcHRpb24oImludGVyZmFjZU5hbWUgY2Fubm90IGJlIG51bGwiKTsNCi0gICAgICAgIHJldHVybiBpbnZva2VyRmFjdG9yeS5uZXdJbnZva2VyKCgoU3RyaW5nKSBpbnRlcmZhY2VOYW1lLmdldFZhbHVlKCkpLnRyaW0oKSwgbWV0aG9kTmFtZSwgb2JqKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdFtdIGV4dHJhY3RQYXJhbWV0ZXJzKE9NRWxlbWVudCBtZXRob2RFbGVtZW50LCBNZW1iZXJbXSBwYXJhbWV0ZXJNZW1iZXJzKSB0aHJvd3MgQ29yYmFJbnZvY2F0aW9uRXhjZXB0aW9uIHsNCi0gICAgICAgIGlmIChwYXJhbWV0ZXJNZW1iZXJzPT1udWxsKQ0KLSAgICAgICAgICAgIHJldHVybiBuZXcgT2JqZWN0WzBdOw0KLQ0KLSAgICAgICAgT2JqZWN0W10gcmV0T2JqcyA9IG5ldyBPYmplY3RbcGFyYW1ldGVyTWVtYmVycy5sZW5ndGhdOw0KLQ0KLSAgICAgICAgaWYgKG1ldGhvZEVsZW1lbnQ9PW51bGwpDQotICAgICAgICAgICAgcmV0dXJuIHJldE9ianM7DQotDQotICAgICAgICBJdGVyYXRvciBwYXJhbXNJdGVyID0gbWV0aG9kRWxlbWVudC5nZXRDaGlsZEVsZW1lbnRzKCk7DQotICAgICAgICBNYXAgcGFyYW1zTWFwID0gbmV3IEhhc2hNYXAoKTsNCi0gICAgICAgIFN0cmluZyBsb2NhbE5hbWU7DQotICAgICAgICB3aGlsZShwYXJhbXNJdGVyIT1udWxsICYmIHBhcmFtc0l0ZXIuaGFzTmV4dCgpKSB7DQotICAgICAgICAgICAgT01FbGVtZW50IHBhcmFtID0gKE9NRWxlbWVudCkgcGFyYW1zSXRlci5uZXh0KCk7DQotICAgICAgICAgICAgbG9jYWxOYW1lID0gcGFyYW0uZ2V0TG9jYWxOYW1lKCk7DQotICAgICAgICAgICAgaWYgKHBhcmFtc01hcC5jb250YWluc0tleShsb2NhbE5hbWUpKSB7DQotICAgICAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IHBhcmFtc01hcC5nZXQobG9jYWxOYW1lKTsNCi0gICAgICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgTGlzdCkgew0KLSAgICAgICAgICAgICAgICAgICAgKChMaXN0KSB2YWx1ZSkuYWRkKHBhcmFtKTsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgIExpc3QgdmFsdWVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOw0KLSAgICAgICAgICAgICAgICAgICAgdmFsdWVMaXN0LmFkZCh2YWx1ZSk7DQotICAgICAgICAgICAgICAgICAgICB2YWx1ZUxpc3QuYWRkKHBhcmFtKTsNCi0gICAgICAgICAgICAgICAgICAgIHBhcmFtc01hcC5wdXQobG9jYWxOYW1lLCB2YWx1ZUxpc3QpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgcGFyYW1zTWFwLnB1dChsb2NhbE5hbWUsIHBhcmFtKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICBTdHJpbmcgcGFyYW1OYW1lOw0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbWV0ZXJNZW1iZXJzLmxlbmd0aDsgaSsrKSB7DQotICAgICAgICAgICAgcGFyYW1OYW1lID0gcGFyYW1ldGVyTWVtYmVyc1tpXS5nZXROYW1lKCk7DQotICAgICAgICAgICAgcmV0T2Jqc1tpXSA9IGV4dHJhY3RWYWx1ZShwYXJhbWV0ZXJNZW1iZXJzW2ldLmdldERhdGFUeXBlKCksIHBhcmFtc01hcC5nZXQocGFyYW1OYW1lKSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gcmV0T2JqczsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBPYmplY3QgZXh0cmFjdFZhbHVlKERhdGFUeXBlIGRhdGFUeXBlLCBPYmplY3QgcGFyYW0pIHRocm93cyBDb3JiYUludm9jYXRpb25FeGNlcHRpb24gew0KLSAgICAgICAgaWYgKGRhdGFUeXBlIGluc3RhbmNlb2YgVHlwZWRlZikgew0KLSAgICAgICAgICAgIFR5cGVkZWYgdHlwZWRlZiA9IChUeXBlZGVmKSBkYXRhVHlwZTsNCi0gICAgICAgICAgICBBbGlhc1ZhbHVlIGFsaWFzVmFsdWUgPSBuZXcgQWxpYXNWYWx1ZSh0eXBlZGVmKTsNCi0gICAgICAgICAgICBPTUVsZW1lbnQgcGFyYW1FbGVtZW50Ow0KLSAgICAgICAgICAgIGlmIChwYXJhbSBpbnN0YW5jZW9mIE9NRWxlbWVudCkNCi0gICAgICAgICAgICAgICAgcGFyYW1FbGVtZW50ID0gKE9NRWxlbWVudCkgcGFyYW07DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0NCi0gICAgICAgICAgICBEYXRhVHlwZSBhbGlhc1R5cGUgPSB0eXBlZGVmLmdldERhdGFUeXBlKCk7DQotICAgICAgICAgICAgaWYgKCEoYWxpYXNUeXBlIGluc3RhbmNlb2YgQWJzdHJhY3RDb2xsZWN0aW9uVHlwZSkpIHsNCi0gICAgICAgICAgICAgICAgcGFyYW1FbGVtZW50ID0gcGFyYW1FbGVtZW50LmdldEZpcnN0RWxlbWVudCgpOw0KLSAgICAgICAgICAgICAgICBpZiAocGFyYW1FbGVtZW50ID09IG51bGwgfHwgIUFSUkFZX0lURU0uZXF1YWxzKHBhcmFtRWxlbWVudC5nZXRMb2NhbE5hbWUoKSkpDQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgYWxpYXNWYWx1ZS5zZXRWYWx1ZShleHRyYWN0VmFsdWUoYWxpYXNUeXBlLCBwYXJhbUVsZW1lbnQpKTsNCi0gICAgICAgICAgICByZXR1cm4gYWxpYXNWYWx1ZTsNCi0gICAgICAgIH0gZWxzZSBpZiAoZGF0YVR5cGUgaW5zdGFuY2VvZiBQcmltaXRpdmVEYXRhVHlwZSkgew0KLSAgICAgICAgICAgIGlmIChwYXJhbSE9bnVsbCkNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlVmFsdWUoZGF0YVR5cGUsICgoT01FbGVtZW50KSBwYXJhbSkuZ2V0VGV4dCgpKTsNCi0gICAgICAgIH0gZWxzZSBpZiAoZGF0YVR5cGUgaW5zdGFuY2VvZiBBYnN0cmFjdENvbGxlY3Rpb25UeXBlKSB7DQotICAgICAgICAgICAgQWJzdHJhY3RDb2xsZWN0aW9uVHlwZSBjb2xsZWN0aW9uVHlwZSA9IChBYnN0cmFjdENvbGxlY3Rpb25UeXBlKSBkYXRhVHlwZTsNCi0gICAgICAgICAgICBPTUVsZW1lbnQgcGFyYW1FbGVtZW50Ow0KLSAgICAgICAgICAgIGlmIChwYXJhbSBpbnN0YW5jZW9mIE9NRWxlbWVudCkNCi0gICAgICAgICAgICAgICAgcGFyYW1FbGVtZW50ID0gKE9NRWxlbWVudCkgcGFyYW07DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0NCi0gICAgICAgICAgICBJdGVyYXRvciBwYXJhbXNJdGVyID0gcGFyYW1FbGVtZW50LmdldENoaWxkRWxlbWVudHMoKTsNCi0gICAgICAgICAgICBMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOw0KLSAgICAgICAgICAgIHdoaWxlIChwYXJhbXNJdGVyLmhhc05leHQoKSkgew0KLSAgICAgICAgICAgICAgICBjaGlsZHJlbi5hZGQoZXh0cmFjdFZhbHVlKGNvbGxlY3Rpb25UeXBlLmdldERhdGFUeXBlKCksIHBhcmFtc0l0ZXIubmV4dCgpKSk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIEFic3RyYWN0Q29sbGVjdGlvblZhbHVlIGNvbGxlY3Rpb25WYWx1ZTsNCi0gICAgICAgICAgICBpZiAoY29sbGVjdGlvblR5cGUuaXNBcnJheSgpKSB7DQotICAgICAgICAgICAgICAgIGNvbGxlY3Rpb25WYWx1ZSA9IG5ldyBBcnJheVZhbHVlKChBcnJheVR5cGUpIGNvbGxlY3Rpb25UeXBlKTsNCi0gICAgICAgICAgICB9IGVsc2UgaWYgKGNvbGxlY3Rpb25UeXBlLmlzU2VxdWVuY2UoKSkgew0KLSAgICAgICAgICAgICAgICBjb2xsZWN0aW9uVmFsdWUgPSBuZXcgU2VxdWVuY2VWYWx1ZSgoU2VxdWVuY2VUeXBlKSBjb2xsZWN0aW9uVHlwZSk7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGNvbGxlY3Rpb25WYWx1ZS5zZXRWYWx1ZXMoY2hpbGRyZW4udG9BcnJheSgpKTsNCi0gICAgICAgICAgICByZXR1cm4gY29sbGVjdGlvblZhbHVlOw0KLSAgICAgICAgfSBlbHNlIGlmIChkYXRhVHlwZSBpbnN0YW5jZW9mIEVudW1UeXBlKSB7DQotICAgICAgICAgICAgRW51bVR5cGUgZW51bVR5cGUgPSAoRW51bVR5cGUpIGRhdGFUeXBlOw0KLSAgICAgICAgICAgIFN0cmluZyBlbnVtVGV4dCA9ICgoT01FbGVtZW50KSBwYXJhbSkuZ2V0VGV4dCgpOw0KLSAgICAgICAgICAgIGludCBpbmRleCA9IGVudW1UeXBlLmdldEVudW1NZW1iZXJzKCkuaW5kZXhPZihlbnVtVGV4dCk7DQotICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsNCi0gICAgICAgICAgICAgICAgRW51bVZhbHVlIGVudW1WYWx1ZSA9IG5ldyBFbnVtVmFsdWUoZW51bVR5cGUpOw0KLSAgICAgICAgICAgICAgICBlbnVtVmFsdWUuc2V0VmFsdWUoaW5kZXgpOw0KLSAgICAgICAgICAgICAgICByZXR1cm4gZW51bVZhbHVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0gZWxzZSBpZiAoZGF0YVR5cGUgaW5zdGFuY2VvZiBVbmlvblR5cGUpIHsNCi0gICAgICAgICAgICBVbmlvblR5cGUgdW5pb25UeXBlID0gKFVuaW9uVHlwZSkgZGF0YVR5cGU7DQotICAgICAgICAgICAgT01FbGVtZW50IHVuRWxlbWVudCA9ICgoT01FbGVtZW50KSBwYXJhbSkuZ2V0Rmlyc3RFbGVtZW50KCk7DQotICAgICAgICAgICAgU3RyaW5nIHVuaW9uTWVtYmVyTmFtZSA9IHVuRWxlbWVudC5nZXRMb2NhbE5hbWUoKTsNCi0gICAgICAgICAgICBVbmlvblZhbHVlIHVuaW9uVmFsdWUgPSBuZXcgVW5pb25WYWx1ZSh1bmlvblR5cGUpOw0KLSAgICAgICAgICAgIHVuaW9uVmFsdWUuc2V0TWVtYmVyTmFtZSh1bmlvbk1lbWJlck5hbWUpOw0KLSAgICAgICAgICAgIE1lbWJlcltdIG1lbWJlcnMgPSB1bmlvblR5cGUuZ2V0TWVtYmVycygpOw0KLSAgICAgICAgICAgIFVuaW9uTWVtYmVyIG1lbWJlciA9IG51bGw7DQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZW1iZXJzLmxlbmd0aDsgaSsrKSB7DQotICAgICAgICAgICAgICAgIG1lbWJlciA9IChVbmlvbk1lbWJlcikgbWVtYmVyc1tpXTsNCi0gICAgICAgICAgICAgICAgaWYgKG1lbWJlci5nZXROYW1lKCkuZXF1YWxzKHVuaW9uTWVtYmVyTmFtZSkpIHsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmIChtZW1iZXIgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICB1bmlvblZhbHVlLnNldE1lbWJlclZhbHVlKGV4dHJhY3RWYWx1ZShtZW1iZXIuZ2V0RGF0YVR5cGUoKSwgdW5FbGVtZW50KSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiB1bmlvblZhbHVlOw0KLSAgICAgICAgfSBlbHNlIGlmIChkYXRhVHlwZSBpbnN0YW5jZW9mIENvbXBvc2l0ZURhdGFUeXBlKSB7DQotICAgICAgICAgICAgQ29tcG9zaXRlRGF0YVR5cGUgY29tcG9zaXRlVHlwZSA9IChDb21wb3NpdGVEYXRhVHlwZSkgZGF0YVR5cGU7DQotICAgICAgICAgICAgTWVtYmVyW10gY29tcG9zaXRlTWVtYmVycyA9IGNvbXBvc2l0ZVR5cGUuZ2V0TWVtYmVycygpOw0KLSAgICAgICAgICAgIE9iamVjdFtdIGNvbXBvc2l0ZVZhbHVlcyA9IGV4dHJhY3RQYXJhbWV0ZXJzKCgoT01FbGVtZW50KSBwYXJhbSksIGNvbXBvc2l0ZU1lbWJlcnMpOw0KLQ0KLSAgICAgICAgICAgIEFic3RyYWN0VmFsdWUgdmFsdWU7DQotICAgICAgICAgICAgaWYgKGNvbXBvc2l0ZVR5cGUgaW5zdGFuY2VvZiBWYWx1ZVR5cGUpDQotICAgICAgICAgICAgICAgIHZhbHVlID0gbmV3IE9iamVjdEJ5VmFsdWUoKFZhbHVlVHlwZSkgY29tcG9zaXRlVHlwZSk7DQotICAgICAgICAgICAgZWxzZSBpZiAoY29tcG9zaXRlVHlwZSBpbnN0YW5jZW9mIFN0cnVjdCkNCi0gICAgICAgICAgICAgICAgdmFsdWUgPSBuZXcgU3RydWN0VmFsdWUoKFN0cnVjdCkgY29tcG9zaXRlVHlwZSk7DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29yYmFJbnZvY2F0aW9uRXhjZXB0aW9uKCJQYXJhbWV0ZXIgdHlwZSBub3Qgc3VwcG9ydGVkIik7DQotDQotICAgICAgICAgICAgdmFsdWUuc2V0TWVtYmVyVmFsdWVzKGNvbXBvc2l0ZVZhbHVlcyk7DQotICAgICAgICAgICAgcmV0dXJuIHZhbHVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHByb2Nlc3NSZXNwb25zZShPYmplY3QgcmVzT2JqZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lbWJlcltdIHBhcmFtcywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RbXSBvdXRQYXJhbVZhbHVlcywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhVHlwZSBkYXRhVHlwZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBeGlzU2VydmljZSBzZXJ2aWNlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtZXRob2ROYW1lLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPQVBGYWN0b3J5IGZhYywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZU5hbWVTcGFjZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlQ29udGV4dCBvdXRNZXNzYWdlKSB0aHJvd3MgQXhpc0ZhdWx0IHsNCi0gICAgICAgIGJvb2xlYW4gcXVhbGlmaWVkID0gc2VydmljZS5pc0VsZW1lbnRGb3JtRGVmYXVsdCgpOw0KLSAgICAgICAgT01OYW1lc3BhY2UgbnMgPSBmYWMuY3JlYXRlT01OYW1lc3BhY2UobWVzc2FnZU5hbWVTcGFjZSwgc2VydmljZS5nZXRTY2hlbWFUYXJnZXROYW1lc3BhY2VQcmVmaXgoKSk7DQotICAgICAgICBPTUVsZW1lbnQgYm9keUNvbnRlbnQgPSBmYWMuY3JlYXRlT01FbGVtZW50KG1ldGhvZE5hbWUgKyBSRVNQT05TRSwgbnMpOw0KLSAgICAgICAgT01FbGVtZW50IGNoaWxkOw0KLQ0KLSAgICAgICAgaWYgKHF1YWxpZmllZCkgew0KLSAgICAgICAgICAgIGNoaWxkID0gZmFjLmNyZWF0ZU9NRWxlbWVudChSRVRVUk5fV1JBUFBFUiwgbnMpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBjaGlsZCA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoUkVUVVJOX1dSQVBQRVIsIG51bGwpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgYm9keUNvbnRlbnQuYWRkQ2hpbGQoY2hpbGQpOw0KLQ0KLSAgICAgICAgaWYgKGRhdGFUeXBlIT1udWxsDQotICAgICAgICAgICAgICAgICYmICFnZXRRdWFsaWZpZWROYW1lKGRhdGFUeXBlKS5lcXVhbHMoVk9JRCkNCi0gICAgICAgICAgICAgICAgJiYgcmVzT2JqZWN0IT1udWxsKSB7DQotICAgICAgICAgICAgcHJvY2Vzc1Jlc3BvbnNlKGNoaWxkLCBib2R5Q29udGVudCwgcmVzT2JqZWN0LCBkYXRhVHlwZSwgZmFjLCBucywgcXVhbGlmaWVkLCBzZXJ2aWNlKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgY2hpbGQuYWRkQXR0cmlidXRlKCJuaWwiLCAidHJ1ZSIsIGZhYy5jcmVhdGVPTU5hbWVzcGFjZShDb25zdGFudHMuVVJJXzIwMDFfU0NIRU1BX1hTSSwNCi0gICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5OU19QUkVGSVhfU0NIRU1BX1hTSSkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgTWVtYmVyIHBhcmFtOw0KLSAgICAgICAgTGlzdCBvdXRQYXJhbUxpc3QgPSBBcnJheXMuYXNMaXN0KG91dFBhcmFtVmFsdWVzKTsNCi0gICAgICAgIEl0ZXJhdG9yIHBhcmFtc0l0ZXIgPSBvdXRQYXJhbUxpc3QuaXRlcmF0b3IoKTsNCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1zLmxlbmd0aDsgaSsrKSB7DQotICAgICAgICAgICAgcGFyYW0gPSBwYXJhbXNbaV07DQotICAgICAgICAgICAgaWYgKE1lbWJlci5NT0RFX0lOT1VULmVxdWFscyhwYXJhbS5nZXRNb2RlKCkpDQotICAgICAgICAgICAgICAgICAgICB8fCBNZW1iZXIuTU9ERV9PVVQuZXF1YWxzKHBhcmFtLmdldE1vZGUoKSkpIHsNCi0gICAgICAgICAgICAgICAgaWYgKHF1YWxpZmllZCkgew0KLSAgICAgICAgICAgICAgICAgICAgY2hpbGQgPSBmYWMuY3JlYXRlT01FbGVtZW50KHBhcmFtLmdldE5hbWUoKSwgbnMpOw0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgY2hpbGQgPSBmYWMuY3JlYXRlT01FbGVtZW50KHBhcmFtLmdldE5hbWUoKSwgbnVsbCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYm9keUNvbnRlbnQuYWRkQ2hpbGQoY2hpbGQpOw0KLSAgICAgICAgICAgICAgICBwcm9jZXNzUmVzcG9uc2UoY2hpbGQsIGJvZHlDb250ZW50LCBwYXJhbXNJdGVyLm5leHQoKSwgcGFyYW0uZ2V0RGF0YVR5cGUoKSwgZmFjLCBucywgcXVhbGlmaWVkLCBzZXJ2aWNlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICBTT0FQRW52ZWxvcGUgZW52ZWxvcGUgPSBmYWMuZ2V0RGVmYXVsdEVudmVsb3BlKCk7DQotICAgICAgICBlbnZlbG9wZS5nZXRCb2R5KCkuYWRkQ2hpbGQoYm9keUNvbnRlbnQpOw0KLSAgICAgICAgb3V0TWVzc2FnZS5zZXRFbnZlbG9wZShlbnZlbG9wZSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcm9jZXNzUmVzcG9uc2UoT01FbGVtZW50IGNoaWxkLCBPTUVsZW1lbnQgYm9keUNvbnRlbnQsIE9iamVjdCByZXNPYmplY3QsIERhdGFUeXBlIGRhdGFUeXBlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT0FQRmFjdG9yeSBmYWMsIE9NTmFtZXNwYWNlIGRlZmF1bHROUywgYm9vbGVhbiBxdWFsaWZpZWQsIEF4aXNTZXJ2aWNlIHNlcnZpY2UpIHsNCi0gICAgICAgIGlmIChkYXRhVHlwZSBpbnN0YW5jZW9mIFByaW1pdGl2ZURhdGFUeXBlKSB7DQotICAgICAgICAgICAgY2hpbGQuYWRkQ2hpbGQoZmFjLmNyZWF0ZU9NVGV4dChjaGlsZCwgcmVzT2JqZWN0LnRvU3RyaW5nKCkpKTsNCi0gICAgICAgIH0gZWxzZSBpZiAoZGF0YVR5cGUgaW5zdGFuY2VvZiBUeXBlZGVmKSB7DQotICAgICAgICAgICAgVHlwZWRlZiB0eXBlZGVmID0gKFR5cGVkZWYpIGRhdGFUeXBlOw0KLSAgICAgICAgICAgIEFsaWFzVmFsdWUgYWxpYXNWYWx1ZSA9IChBbGlhc1ZhbHVlKSByZXNPYmplY3Q7DQotICAgICAgICAgICAgT01OYW1lc3BhY2UgbnMgPSBnZXROYW1lU3BhY2VGb3JUeXBlKGZhYywgc2VydmljZSwgdHlwZWRlZik7DQotICAgICAgICAgICAgT01FbGVtZW50IGl0ZW0gPSBmYWMuY3JlYXRlT01FbGVtZW50KEFSUkFZX0lURU0sIG5zLCBjaGlsZCk7DQotICAgICAgICAgICAgcHJvY2Vzc1Jlc3BvbnNlKGl0ZW0sIGNoaWxkLCBhbGlhc1ZhbHVlLmdldFZhbHVlKCksIHR5cGVkZWYuZ2V0RGF0YVR5cGUoKSwgZmFjLCBucywgcXVhbGlmaWVkLCBzZXJ2aWNlKTsNCi0gICAgICAgIH0gZWxzZSBpZiAoZGF0YVR5cGUgaW5zdGFuY2VvZiBBYnN0cmFjdENvbGxlY3Rpb25UeXBlKSB7DQotICAgICAgICAgICAgQWJzdHJhY3RDb2xsZWN0aW9uVHlwZSBjb2xsZWN0aW9uVHlwZSA9IChBYnN0cmFjdENvbGxlY3Rpb25UeXBlKSBkYXRhVHlwZTsNCi0gICAgICAgICAgICBBYnN0cmFjdENvbGxlY3Rpb25WYWx1ZSBjb2xsZWN0aW9uVmFsdWUgPSAoQWJzdHJhY3RDb2xsZWN0aW9uVmFsdWUpIHJlc09iamVjdDsNCi0gICAgICAgICAgICBPYmplY3RbXSB2YWx1ZXMgPSBjb2xsZWN0aW9uVmFsdWUuZ2V0VmFsdWVzKCk7DQotICAgICAgICAgICAgaW50IGxlbmd0aCA9IHZhbHVlcy5sZW5ndGg7DQotICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPGxlbmd0aDsgaSsrKSB7DQotICAgICAgICAgICAgICAgIE9NRWxlbWVudCBvdXRlciA9IGJvZHlDb250ZW50Ow0KLSAgICAgICAgICAgICAgICBpZiAoY29sbGVjdGlvblR5cGUuZ2V0RGF0YVR5cGUoKSBpbnN0YW5jZW9mIEFic3RyYWN0Q29sbGVjdGlvblR5cGUpIHsNCi0gICAgICAgICAgICAgICAgICAgIG91dGVyID0gY2hpbGQ7DQotICAgICAgICAgICAgICAgICAgICBpZiAocXVhbGlmaWVkKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQgPSBmYWMuY3JlYXRlT01FbGVtZW50KEFSUkFZX0lURU0sIGRlZmF1bHROUyk7DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkID0gZmFjLmNyZWF0ZU9NRWxlbWVudChBUlJBWV9JVEVNLCBudWxsKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIG91dGVyLmFkZENoaWxkKGNoaWxkKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBwcm9jZXNzUmVzcG9uc2UoY2hpbGQsIG91dGVyLCB2YWx1ZXNbaV0sIGNvbGxlY3Rpb25UeXBlLmdldERhdGFUeXBlKCksIGZhYywgZGVmYXVsdE5TLCBxdWFsaWZpZWQsIHNlcnZpY2UpOw0KLSAgICAgICAgICAgICAgICBpZiAoaSA8IChsZW5ndGggLTEpKSB7DQotICAgICAgICAgICAgICAgICAgICBpZiAocXVhbGlmaWVkKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQgPSBmYWMuY3JlYXRlT01FbGVtZW50KEFSUkFZX0lURU0sIGRlZmF1bHROUyk7DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkID0gZmFjLmNyZWF0ZU9NRWxlbWVudChBUlJBWV9JVEVNLCBudWxsKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGJvZHlDb250ZW50LmFkZENoaWxkKGNoaWxkKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0gZWxzZSBpZiAoZGF0YVR5cGUgaW5zdGFuY2VvZiBWYWx1ZVR5cGUgfHwgZGF0YVR5cGUgaW5zdGFuY2VvZiBTdHJ1Y3QpIHsNCi0gICAgICAgICAgICBBYnN0cmFjdFZhbHVlIHJlc1ZhbHVlID0gKEFic3RyYWN0VmFsdWUpIHJlc09iamVjdDsNCi0gICAgICAgICAgICBNZW1iZXJbXSBtZW1iZXJzID0gcmVzVmFsdWUuZ2V0TWVtYmVycygpOw0KLSAgICAgICAgICAgIE9iamVjdFtdIG1lbWJlclZhbHVlcyA9IHJlc1ZhbHVlLmdldE1lbWJlclZhbHVlcygpOw0KLSAgICAgICAgICAgIE9NTmFtZXNwYWNlIG5zID0gZ2V0TmFtZVNwYWNlRm9yVHlwZShmYWMsIHNlcnZpY2UsIChDb21wb3NpdGVEYXRhVHlwZSkgZGF0YVR5cGUpOw0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVtYmVyVmFsdWVzLmxlbmd0aDsgaSsrKSB7DQotICAgICAgICAgICAgICAgIE9NRWxlbWVudCBtZW1iZXJFbGVtZW50ID0gZmFjLmNyZWF0ZU9NRWxlbWVudChtZW1iZXJzW2ldLmdldE5hbWUoKSwgbnMpOw0KLSAgICAgICAgICAgICAgICBwcm9jZXNzUmVzcG9uc2UobWVtYmVyRWxlbWVudCwgYm9keUNvbnRlbnQsIG1lbWJlclZhbHVlc1tpXSwgbWVtYmVyc1tpXS5nZXREYXRhVHlwZSgpLCBmYWMsIG5zLCBxdWFsaWZpZWQsIHNlcnZpY2UpOw0KLSAgICAgICAgICAgICAgICBjaGlsZC5hZGRDaGlsZChtZW1iZXJFbGVtZW50KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9IGVsc2UgaWYgKGRhdGFUeXBlIGluc3RhbmNlb2YgVW5pb25UeXBlKSB7DQotICAgICAgICAgICAgVW5pb25WYWx1ZSB1bmlvblZhbHVlID0gKFVuaW9uVmFsdWUpIHJlc09iamVjdDsNCi0gICAgICAgICAgICBPTUVsZW1lbnQgdW5NZW1iZXI7DQotICAgICAgICAgICAgT01OYW1lc3BhY2UgbnMgPSBnZXROYW1lU3BhY2VGb3JUeXBlKGZhYywgc2VydmljZSwgKENvbXBvc2l0ZURhdGFUeXBlKSBkYXRhVHlwZSk7DQotICAgICAgICAgICAgaWYgKHF1YWxpZmllZCkgew0KLSAgICAgICAgICAgICAgICB1bk1lbWJlciA9IGZhYy5jcmVhdGVPTUVsZW1lbnQodW5pb25WYWx1ZS5nZXRNZW1iZXJOYW1lKCksIG5zKTsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICB1bk1lbWJlciA9IGZhYy5jcmVhdGVPTUVsZW1lbnQodW5pb25WYWx1ZS5nZXRNZW1iZXJOYW1lKCksIG51bGwpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBwcm9jZXNzUmVzcG9uc2UodW5NZW1iZXIsIGNoaWxkLCB1bmlvblZhbHVlLmdldE1lbWJlclZhbHVlKCksIHVuaW9uVmFsdWUuZ2V0TWVtYmVyVHlwZSgpLCBmYWMsIG5zLCBxdWFsaWZpZWQsIHNlcnZpY2UpOw0KLSAgICAgICAgICAgIGNoaWxkLmFkZENoaWxkKHVuTWVtYmVyKTsNCi0gICAgICAgIH0gZWxzZSBpZiAoZGF0YVR5cGUgaW5zdGFuY2VvZiBFbnVtVHlwZSkgew0KLSAgICAgICAgICAgIEVudW1WYWx1ZSBlbnVtVmFsdWUgPSAoRW51bVZhbHVlKSByZXNPYmplY3Q7DQotICAgICAgICAgICAgY2hpbGQuYWRkQ2hpbGQoZmFjLmNyZWF0ZU9NVGV4dChjaGlsZCwgZW51bVZhbHVlLmdldFZhbHVlQXNTdHJpbmcoKSkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIE9NTmFtZXNwYWNlIGdldE5hbWVTcGFjZUZvclR5cGUoU09BUEZhY3RvcnkgZmFjLCBBeGlzU2VydmljZSBzZXJ2aWNlLCBDb21wb3NpdGVEYXRhVHlwZSBkYXRhVHlwZSkgew0KLSAgICAgICAgVHlwZVRhYmxlIHR5cGVUYWJsZSA9IHNlcnZpY2UuZ2V0VHlwZVRhYmxlKCk7DQotICAgICAgICBTdHJpbmcgZnVsbG5hbWUgPSAoZGF0YVR5cGUuZ2V0TW9kdWxlKCkhPW51bGwpID8gZGF0YVR5cGUuZ2V0TW9kdWxlKCkgKyBkYXRhVHlwZS5nZXROYW1lKCkgOiBkYXRhVHlwZS5nZXROYW1lKCk7DQotICAgICAgICBmdWxsbmFtZSA9IGZ1bGxuYW1lLnJlcGxhY2VBbGwoQ29tcG9zaXRlRGF0YVR5cGUuTU9EVUxFX1NFUEVSQVRPUiwgIi4iKTsNCi0gICAgICAgIFFOYW1lIHFuYW1lID0gdHlwZVRhYmxlLmdldFFOYW1lZm9ydGhlVHlwZShmdWxsbmFtZSk7DQotICAgICAgICBpZiAocW5hbWU9PW51bGwpDQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICByZXR1cm4gZmFjLmNyZWF0ZU9NTmFtZXNwYWNlKHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpLCBxbmFtZS5nZXRQcmVmaXgoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UXVhbGlmaWVkTmFtZShEYXRhVHlwZSB0eXBlKXsNCi0gICAgICAgIGlmICh0eXBlIGluc3RhbmNlb2YgQ29tcG9zaXRlRGF0YVR5cGUpIHsNCi0gICAgICAgICAgICBDb21wb3NpdGVEYXRhVHlwZSBjb21wb3NpdGVUeXBlID0gKENvbXBvc2l0ZURhdGFUeXBlKSB0eXBlOw0KLSAgICAgICAgICAgIFN0cmluZyBtb2R1bGUgPSBjb21wb3NpdGVUeXBlLmdldE1vZHVsZSgpOw0KLSAgICAgICAgICAgIG1vZHVsZSA9IChtb2R1bGUgPT0gbnVsbCkgPyAiIiA6IG1vZHVsZS5yZXBsYWNlQWxsKCI6OiIsICIuIik7DQotICAgICAgICAgICAgcmV0dXJuICBtb2R1bGUgKyBjb21wb3NpdGVUeXBlLmdldE5hbWUoKTsNCi0gICAgICAgIH0gZWxzZSBpZiAodHlwZSBpbnN0YW5jZW9mIFByaW1pdGl2ZURhdGFUeXBlKSB7DQotICAgICAgICAgICAgUHJpbWl0aXZlRGF0YVR5cGUgcHJpbWl0aXZlRGF0YVR5cGUgPSAoUHJpbWl0aXZlRGF0YVR5cGUpIHR5cGU7DQotICAgICAgICAgICAgcmV0dXJuIHByaW1pdGl2ZURhdGFUeXBlLmdldFR5cGVOYW1lKCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgaW5zZXJ0VmFsdWUoQW55IGFyZywgRGF0YVR5cGUgdHlwZSwgT2JqZWN0IHZhbHVlKSB7DQotICAgICAgICBzd2l0Y2godHlwZS5nZXRUeXBlQ29kZSgpLmtpbmQoKS52YWx1ZSgpKSB7DQotICAgICAgICAgICAgY2FzZSBUQ0tpbmQuX3RrX2xvbmc6IGFyZy5pbnNlcnRfbG9uZygoKEludGVnZXIpIHZhbHVlKS5pbnRWYWx1ZSgpKTsgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBUQ0tpbmQuX3RrX3Vsb25nOiBhcmcuaW5zZXJ0X3Vsb25nKCgoSW50ZWdlcikgdmFsdWUpLmludFZhbHVlKCkpOyBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfbG9uZ2xvbmc6IGFyZy5pbnNlcnRfbG9uZ2xvbmcoKChMb25nKSB2YWx1ZSkubG9uZ1ZhbHVlKCkpOyBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfdWxvbmdsb25nOiBhcmcuaW5zZXJ0X3Vsb25nbG9uZygoKExvbmcpIHZhbHVlKS5sb25nVmFsdWUoKSk7IGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgVENLaW5kLl90a19zaG9ydDogYXJnLmluc2VydF9zaG9ydCgoKFNob3J0KSB2YWx1ZSkuc2hvcnRWYWx1ZSgpKTsgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBUQ0tpbmQuX3RrX3VzaG9ydDogYXJnLmluc2VydF91c2hvcnQoKChTaG9ydCkgdmFsdWUpLnNob3J0VmFsdWUoKSk7IGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgVENLaW5kLl90a19mbG9hdDogYXJnLmluc2VydF9mbG9hdCgoKEZsb2F0KSB2YWx1ZSkuZmxvYXRWYWx1ZSgpKTsgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBUQ0tpbmQuX3RrX2RvdWJsZTogYXJnLmluc2VydF9kb3VibGUoKChEb3VibGUpIHZhbHVlKS5mbG9hdFZhbHVlKCkpOyBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfY2hhcjogYXJnLmluc2VydF9jaGFyKCgoQ2hhcmFjdGVyKSB2YWx1ZSkuY2hhclZhbHVlKCkpOyBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfd2NoYXI6IGFyZy5pbnNlcnRfd2NoYXIoKChDaGFyYWN0ZXIpIHZhbHVlKS5jaGFyVmFsdWUoKSk7IGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgVENLaW5kLl90a19ib29sZWFuOiBhcmcuaW5zZXJ0X2Jvb2xlYW4oKChCb29sZWFuKSB2YWx1ZSkuYm9vbGVhblZhbHVlKCkpOyBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfb2N0ZXQ6IGFyZy5pbnNlcnRfb2N0ZXQoKChCeXRlKSB2YWx1ZSkuYnl0ZVZhbHVlKCkpOyBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfc3RyaW5nOiBhcmcuaW5zZXJ0X3N0cmluZygoU3RyaW5nKSB2YWx1ZSk7IGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgVENLaW5kLl90a193c3RyaW5nOiBhcmcuaW5zZXJ0X3dzdHJpbmcoKFN0cmluZykgdmFsdWUpOyBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfYW55OiBhcmcuaW5zZXJ0X2FueSgoQW55KSB2YWx1ZSk7IGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgVENLaW5kLl90a192YWx1ZTogYXJnLmluc2VydF9WYWx1ZSgoU2VyaWFsaXphYmxlKSB2YWx1ZSk7IGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgVENLaW5kLl90a19vYmpyZWY6IGFyZy5pbnNlcnRfT2JqZWN0KChvcmcub21nLkNPUkJBLk9iamVjdCkgdmFsdWUpOyBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfc3RydWN0Og0KLSAgICAgICAgICAgICAgICBTdHJ1Y3RWYWx1ZSBzdHJ1Y3RWYWx1ZSA9IChTdHJ1Y3RWYWx1ZSkgdmFsdWU7DQotICAgICAgICAgICAgICAgIG9yZy5vbWcuQ09SQkFfMl8zLnBvcnRhYmxlLk91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0gPSAob3JnLm9tZy5DT1JCQV8yXzMucG9ydGFibGUuT3V0cHV0U3RyZWFtKSBhcmcuY3JlYXRlX291dHB1dF9zdHJlYW0oKTsNCi0gICAgICAgICAgICAgICAgYXJnLnR5cGUoc3RydWN0VmFsdWUuZ2V0VHlwZUNvZGUoKSk7DQotICAgICAgICAgICAgICAgIHN0cnVjdFZhbHVlLndyaXRlKG91dHB1dFN0cmVhbSk7DQotICAgICAgICAgICAgICAgIGFyZy5yZWFkX3ZhbHVlKG91dHB1dFN0cmVhbS5jcmVhdGVfaW5wdXRfc3RyZWFtICgpLCBzdHJ1Y3RWYWx1ZS5nZXRUeXBlQ29kZSgpKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBUQ0tpbmQuX3RrX2VudW06DQotICAgICAgICAgICAgICAgIEVudW1WYWx1ZSBlbnVtVmFsdWUgPSAoRW51bVZhbHVlKSB2YWx1ZTsNCi0gICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtID0gKG9yZy5vbWcuQ09SQkFfMl8zLnBvcnRhYmxlLk91dHB1dFN0cmVhbSkgYXJnLmNyZWF0ZV9vdXRwdXRfc3RyZWFtKCk7DQotICAgICAgICAgICAgICAgIGFyZy50eXBlKGVudW1WYWx1ZS5nZXRUeXBlQ29kZSgpKTsNCi0gICAgICAgICAgICAgICAgZW51bVZhbHVlLndyaXRlKG91dHB1dFN0cmVhbSk7DQotICAgICAgICAgICAgICAgIGFyZy5yZWFkX3ZhbHVlKG91dHB1dFN0cmVhbS5jcmVhdGVfaW5wdXRfc3RyZWFtICgpLCBlbnVtVmFsdWUuZ2V0VHlwZUNvZGUoKSk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgVENLaW5kLl90a191bmlvbjoNCi0gICAgICAgICAgICAgICAgVW5pb25WYWx1ZSB1bmlvblZhbHVlID0gKFVuaW9uVmFsdWUpIHZhbHVlOw0KLSAgICAgICAgICAgICAgICBvdXRwdXRTdHJlYW0gPSAob3JnLm9tZy5DT1JCQV8yXzMucG9ydGFibGUuT3V0cHV0U3RyZWFtKSBhcmcuY3JlYXRlX291dHB1dF9zdHJlYW0oKTsNCi0gICAgICAgICAgICAgICAgYXJnLnR5cGUodW5pb25WYWx1ZS5nZXRUeXBlQ29kZSgpKTsNCi0gICAgICAgICAgICAgICAgdW5pb25WYWx1ZS53cml0ZShvdXRwdXRTdHJlYW0pOw0KLSAgICAgICAgICAgICAgICBhcmcucmVhZF92YWx1ZShvdXRwdXRTdHJlYW0uY3JlYXRlX2lucHV0X3N0cmVhbSAoKSwgdW5pb25WYWx1ZS5nZXRUeXBlQ29kZSgpKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBUQ0tpbmQuX3RrX2FsaWFzOg0KLSAgICAgICAgICAgICAgICBBbGlhc1ZhbHVlIGFsaWFzVmFsdWUgPSAoQWxpYXNWYWx1ZSkgdmFsdWU7DQotICAgICAgICAgICAgICAgIG91dHB1dFN0cmVhbSA9IChvcmcub21nLkNPUkJBXzJfMy5wb3J0YWJsZS5PdXRwdXRTdHJlYW0pIGFyZy5jcmVhdGVfb3V0cHV0X3N0cmVhbSgpOw0KLSAgICAgICAgICAgICAgICBhcmcudHlwZShhbGlhc1ZhbHVlLmdldFR5cGVDb2RlKCkpOw0KLSAgICAgICAgICAgICAgICBhbGlhc1ZhbHVlLndyaXRlKG91dHB1dFN0cmVhbSk7DQotICAgICAgICAgICAgICAgIGFyZy5yZWFkX3ZhbHVlKG91dHB1dFN0cmVhbS5jcmVhdGVfaW5wdXRfc3RyZWFtICgpLCBhbGlhc1ZhbHVlLmdldFR5cGVDb2RlKCkpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfc2VxdWVuY2U6DQotICAgICAgICAgICAgICAgIFNlcXVlbmNlVmFsdWUgc2VxdWVuY2VWYWx1ZSA9IChTZXF1ZW5jZVZhbHVlKSB2YWx1ZTsNCi0gICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtID0gKG9yZy5vbWcuQ09SQkFfMl8zLnBvcnRhYmxlLk91dHB1dFN0cmVhbSkgYXJnLmNyZWF0ZV9vdXRwdXRfc3RyZWFtKCk7DQotICAgICAgICAgICAgICAgIGFyZy50eXBlKHNlcXVlbmNlVmFsdWUuZ2V0VHlwZUNvZGUoKSk7DQotICAgICAgICAgICAgICAgIHNlcXVlbmNlVmFsdWUud3JpdGUob3V0cHV0U3RyZWFtKTsNCi0gICAgICAgICAgICAgICAgYXJnLnJlYWRfdmFsdWUob3V0cHV0U3RyZWFtLmNyZWF0ZV9pbnB1dF9zdHJlYW0gKCksIHNlcXVlbmNlVmFsdWUuZ2V0VHlwZUNvZGUoKSk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgVENLaW5kLl90a19hcnJheToNCi0gICAgICAgICAgICAgICAgQXJyYXlWYWx1ZSBhcnJheVZhbHVlID0gKEFycmF5VmFsdWUpIHZhbHVlOw0KLSAgICAgICAgICAgICAgICBvdXRwdXRTdHJlYW0gPSAob3JnLm9tZy5DT1JCQV8yXzMucG9ydGFibGUuT3V0cHV0U3RyZWFtKSBhcmcuY3JlYXRlX291dHB1dF9zdHJlYW0oKTsNCi0gICAgICAgICAgICAgICAgYXJnLnR5cGUoYXJyYXlWYWx1ZS5nZXRUeXBlQ29kZSgpKTsNCi0gICAgICAgICAgICAgICAgYXJyYXlWYWx1ZS53cml0ZShvdXRwdXRTdHJlYW0pOw0KLSAgICAgICAgICAgICAgICBhcmcucmVhZF92YWx1ZShvdXRwdXRTdHJlYW0uY3JlYXRlX2lucHV0X3N0cmVhbSAoKSwgYXJyYXlWYWx1ZS5nZXRUeXBlQ29kZSgpKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICAgICAgbG9nLmVycm9yKCJFUlJPUiEgSW52YWxpZCBkYXRhVHlwZSIpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBleHRyYWN0VmFsdWUoRGF0YVR5cGUgcmV0dXJuVHlwZSwgQW55IHJldHVybmVkKSB7DQotICAgICAgICBPYmplY3QgcmV0dXJuVmFsdWUgPSBudWxsOw0KLSAgICAgICAgVHlwZUNvZGUgdHlwZUNvZGUgPSByZXR1cm5UeXBlLmdldFR5cGVDb2RlKCk7DQotICAgICAgICBzd2l0Y2godHlwZUNvZGUua2luZCgpLnZhbHVlKCkpIHsNCi0gICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfdm9pZDogcmV0dXJuVmFsdWUgPSBudWxsOyBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfbG9uZzogcmV0dXJuVmFsdWUgPSBuZXcgSW50ZWdlcihyZXR1cm5lZC5leHRyYWN0X2xvbmcoKSk7IGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgVENLaW5kLl90a191bG9uZzogcmV0dXJuVmFsdWUgPSBuZXcgSW50ZWdlcihyZXR1cm5lZC5leHRyYWN0X3Vsb25nKCkpOyBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfbG9uZ2xvbmc6IHJldHVyblZhbHVlID0gbmV3IExvbmcocmV0dXJuZWQuZXh0cmFjdF9sb25nbG9uZygpKTsgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBUQ0tpbmQuX3RrX3Vsb25nbG9uZzogcmV0dXJuVmFsdWUgPSBuZXcgTG9uZyhyZXR1cm5lZC5leHRyYWN0X3Vsb25nbG9uZygpKTsgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBUQ0tpbmQuX3RrX3Nob3J0OiByZXR1cm5WYWx1ZSA9IG5ldyBTaG9ydChyZXR1cm5lZC5leHRyYWN0X3Nob3J0KCkpOyBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfdXNob3J0OiByZXR1cm5WYWx1ZSA9IG5ldyBTaG9ydChyZXR1cm5lZC5leHRyYWN0X3VzaG9ydCgpKTsgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBUQ0tpbmQuX3RrX2Zsb2F0OiByZXR1cm5WYWx1ZSA9IG5ldyBGbG9hdChyZXR1cm5lZC5leHRyYWN0X2Zsb2F0KCkpOyBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfZG91YmxlOiByZXR1cm5WYWx1ZSA9IG5ldyBEb3VibGUocmV0dXJuZWQuZXh0cmFjdF9kb3VibGUoKSk7IGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgVENLaW5kLl90a19jaGFyOiByZXR1cm5WYWx1ZSA9IG5ldyBDaGFyYWN0ZXIocmV0dXJuZWQuZXh0cmFjdF9jaGFyKCkpOyBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfd2NoYXI6IHJldHVyblZhbHVlID0gbmV3IENoYXJhY3RlcihyZXR1cm5lZC5leHRyYWN0X3djaGFyKCkpOyBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfYm9vbGVhbjogcmV0dXJuVmFsdWUgPSBCb29sZWFuLnZhbHVlT2YocmV0dXJuZWQuZXh0cmFjdF9ib29sZWFuKCkpOyBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfb2N0ZXQ6IHJldHVyblZhbHVlID0gbmV3IEJ5dGUocmV0dXJuZWQuZXh0cmFjdF9vY3RldCgpKTsgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBUQ0tpbmQuX3RrX3N0cmluZzogcmV0dXJuVmFsdWUgPSByZXR1cm5lZC5leHRyYWN0X3N0cmluZygpOyBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfd3N0cmluZzogcmV0dXJuVmFsdWUgPSByZXR1cm5lZC5leHRyYWN0X3dzdHJpbmcoKTsgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBUQ0tpbmQuX3RrX2FueTogcmV0dXJuVmFsdWUgPSByZXR1cm5lZC5leHRyYWN0X2FueSgpOyBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfdmFsdWU6IHJldHVyblZhbHVlID0gcmV0dXJuZWQuZXh0cmFjdF9WYWx1ZSgpOyBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfb2JqcmVmOiByZXR1cm5WYWx1ZSA9IHJldHVybmVkLmV4dHJhY3RfT2JqZWN0KCk7IGJyZWFrOw0KLSAgICAgICAgICAgIC8vY2FzZSBUQ0tpbmQuX3RrX2xvbmdkb3VibGUgOg0KLSAgICAgICAgICAgIGNhc2UgVENLaW5kLl90a19zdHJ1Y3Q6DQotICAgICAgICAgICAgICAgIFN0cnVjdCBzdHJ1Y3QgPSAoU3RydWN0KSByZXR1cm5UeXBlOw0KLSAgICAgICAgICAgICAgICBTdHJ1Y3RWYWx1ZSBzdHJ1Y3RWYWx1ZSA9IG5ldyBTdHJ1Y3RWYWx1ZShzdHJ1Y3QpOw0KLSAgICAgICAgICAgICAgICBvcmcub21nLkNPUkJBXzJfMy5wb3J0YWJsZS5JbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IChvcmcub21nLkNPUkJBXzJfMy5wb3J0YWJsZS5JbnB1dFN0cmVhbSkgcmV0dXJuZWQuY3JlYXRlX2lucHV0X3N0cmVhbSgpOw0KLSAgICAgICAgICAgICAgICBzdHJ1Y3RWYWx1ZS5yZWFkKGlucHV0U3RyZWFtKTsNCi0gICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUgPSBzdHJ1Y3RWYWx1ZTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBUQ0tpbmQuX3RrX2V4Y2VwdDoNCi0gICAgICAgICAgICAgICAgRXhjZXB0aW9uVHlwZSBleGNlcHRpb25UeXBlID0gKEV4Y2VwdGlvblR5cGUpIHJldHVyblR5cGU7DQotICAgICAgICAgICAgICAgIEV4Y2VwdGlvblZhbHVlIGV4Y2VwdGlvblZhbHVlID0gbmV3IEV4Y2VwdGlvblZhbHVlKGV4Y2VwdGlvblR5cGUpOw0KLSAgICAgICAgICAgICAgICBpbnB1dFN0cmVhbSA9IChvcmcub21nLkNPUkJBXzJfMy5wb3J0YWJsZS5JbnB1dFN0cmVhbSkgcmV0dXJuZWQuY3JlYXRlX2lucHV0X3N0cmVhbSgpOw0KLSAgICAgICAgICAgICAgICBleGNlcHRpb25WYWx1ZS5yZWFkKGlucHV0U3RyZWFtKTsNCi0gICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUgPSBleGNlcHRpb25WYWx1ZTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBUQ0tpbmQuX3RrX2VudW06DQotICAgICAgICAgICAgICAgIEVudW1UeXBlIGVudW1UeXBlID0gKEVudW1UeXBlKSByZXR1cm5UeXBlOw0KLSAgICAgICAgICAgICAgICBFbnVtVmFsdWUgZW51bVZhbHVlID0gbmV3IEVudW1WYWx1ZShlbnVtVHlwZSk7DQotICAgICAgICAgICAgICAgIGlucHV0U3RyZWFtID0gKG9yZy5vbWcuQ09SQkFfMl8zLnBvcnRhYmxlLklucHV0U3RyZWFtKSByZXR1cm5lZC5jcmVhdGVfaW5wdXRfc3RyZWFtKCk7DQotICAgICAgICAgICAgICAgIGVudW1WYWx1ZS5yZWFkKGlucHV0U3RyZWFtKTsNCi0gICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUgPSBlbnVtVmFsdWU7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgVENLaW5kLl90a191bmlvbjoNCi0gICAgICAgICAgICAgICAgVW5pb25UeXBlIHVuaW9uVHlwZSA9IChVbmlvblR5cGUpIHJldHVyblR5cGU7DQotICAgICAgICAgICAgICAgIGlucHV0U3RyZWFtID0gKG9yZy5vbWcuQ09SQkFfMl8zLnBvcnRhYmxlLklucHV0U3RyZWFtKSByZXR1cm5lZC5jcmVhdGVfaW5wdXRfc3RyZWFtKCk7DQotICAgICAgICAgICAgICAgIFVuaW9uVmFsdWUgdW5pb25WYWx1ZSA9IG5ldyBVbmlvblZhbHVlKHVuaW9uVHlwZSk7DQotICAgICAgICAgICAgICAgIHVuaW9uVmFsdWUucmVhZChpbnB1dFN0cmVhbSk7DQotICAgICAgICAgICAgICAgIHJldHVyblZhbHVlID0gdW5pb25WYWx1ZTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBUQ0tpbmQuX3RrX2FsaWFzOg0KLSAgICAgICAgICAgICAgICBUeXBlZGVmIHR5cGVkZWYgPSAoVHlwZWRlZikgcmV0dXJuVHlwZTsNCi0gICAgICAgICAgICAgICAgaW5wdXRTdHJlYW0gPSAob3JnLm9tZy5DT1JCQV8yXzMucG9ydGFibGUuSW5wdXRTdHJlYW0pIHJldHVybmVkLmNyZWF0ZV9pbnB1dF9zdHJlYW0oKTsNCi0gICAgICAgICAgICAgICAgQWxpYXNWYWx1ZSBhbGlhc1ZhbHVlID0gbmV3IEFsaWFzVmFsdWUodHlwZWRlZik7DQotICAgICAgICAgICAgICAgIGFsaWFzVmFsdWUucmVhZChpbnB1dFN0cmVhbSk7DQotICAgICAgICAgICAgICAgIHJldHVyblZhbHVlID0gYWxpYXNWYWx1ZTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBUQ0tpbmQuX3RrX3NlcXVlbmNlOg0KLSAgICAgICAgICAgICAgICBTZXF1ZW5jZVR5cGUgc2VxdWVuY2VUeXBlID0gKFNlcXVlbmNlVHlwZSkgcmV0dXJuVHlwZTsNCi0gICAgICAgICAgICAgICAgaW5wdXRTdHJlYW0gPSAob3JnLm9tZy5DT1JCQV8yXzMucG9ydGFibGUuSW5wdXRTdHJlYW0pIHJldHVybmVkLmNyZWF0ZV9pbnB1dF9zdHJlYW0oKTsNCi0gICAgICAgICAgICAgICAgU2VxdWVuY2VWYWx1ZSBzZXF1ZW5jZVZhbHVlID0gbmV3IFNlcXVlbmNlVmFsdWUoc2VxdWVuY2VUeXBlKTsNCi0gICAgICAgICAgICAgICAgc2VxdWVuY2VWYWx1ZS5yZWFkKGlucHV0U3RyZWFtKTsNCi0gICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUgPSBzZXF1ZW5jZVZhbHVlOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfYXJyYXk6DQotICAgICAgICAgICAgICAgIEFycmF5VHlwZSBhcnJheVR5cGUgPSAoQXJyYXlUeXBlKSByZXR1cm5UeXBlOw0KLSAgICAgICAgICAgICAgICBpbnB1dFN0cmVhbSA9IChvcmcub21nLkNPUkJBXzJfMy5wb3J0YWJsZS5JbnB1dFN0cmVhbSkgcmV0dXJuZWQuY3JlYXRlX2lucHV0X3N0cmVhbSgpOw0KLSAgICAgICAgICAgICAgICBBcnJheVZhbHVlIGFycmF5VmFsdWUgPSBuZXcgQXJyYXlWYWx1ZShhcnJheVR5cGUpOw0KLSAgICAgICAgICAgICAgICBhcnJheVZhbHVlLnJlYWQoaW5wdXRTdHJlYW0pOw0KLSAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZSA9IGFycmF5VmFsdWU7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiRVJST1IhIEludmFsaWQgZGF0YVR5cGUiKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgcGFyc2VWYWx1ZShEYXRhVHlwZSB0eXBlLCBTdHJpbmcgdmFsdWUpIHsNCi0gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQ0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgdmFsdWUgPSB2YWx1ZS50cmltKCk7DQotICAgICAgICBPYmplY3QgcmV0ID0gbnVsbDsNCi0gICAgICAgIHN3aXRjaCh0eXBlLmdldFR5cGVDb2RlKCkua2luZCgpLnZhbHVlKCkpIHsNCi0gICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfbG9uZyA6IHJldCA9IEludGVnZXIudmFsdWVPZih2YWx1ZSk7IGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgVENLaW5kLl90a191bG9uZyA6IHJldCA9IEludGVnZXIudmFsdWVPZih2YWx1ZSk7IGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgVENLaW5kLl90a19sb25nbG9uZyA6IHJldCA9IExvbmcudmFsdWVPZih2YWx1ZSk7IGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgVENLaW5kLl90a191bG9uZ2xvbmcgOiByZXQgPSBMb25nLnZhbHVlT2YodmFsdWUpOyBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfc2hvcnQgOiByZXQgPSBTaG9ydC52YWx1ZU9mKHZhbHVlKTsgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBUQ0tpbmQuX3RrX3VzaG9ydCA6IHJldCA9IFNob3J0LnZhbHVlT2YodmFsdWUpOyBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfZmxvYXQgOiByZXQgPSBGbG9hdC52YWx1ZU9mKHZhbHVlKTsgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBUQ0tpbmQuX3RrX2RvdWJsZSA6IHJldCA9IERvdWJsZS52YWx1ZU9mKHZhbHVlKTsgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBUQ0tpbmQuX3RrX2NoYXIgOiByZXQgPSBDaGFyYWN0ZXIudmFsdWVPZih2YWx1ZS5jaGFyQXQoMCkpOyBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfd2NoYXIgOiByZXQgPSBDaGFyYWN0ZXIudmFsdWVPZih2YWx1ZS5jaGFyQXQoMCkpOyBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfYm9vbGVhbiA6IHJldCA9IEJvb2xlYW4udmFsdWVPZih2YWx1ZSk7IGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgVENLaW5kLl90a19vY3RldCA6IHJldCA9IEJ5dGUudmFsdWVPZih2YWx1ZSk7IGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgVENLaW5kLl90a19zdHJpbmcgOiByZXQgPSB2YWx1ZTsgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBUQ0tpbmQuX3RrX3dzdHJpbmcgOiByZXQgPSB2YWx1ZTsgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBUQ0tpbmQuX3RrX2VudW0gOg0KLSAgICAgICAgICAgICAgICBFbnVtVHlwZSBlbnVtVHlwZSA9IChFbnVtVHlwZSkgdHlwZTsNCi0gICAgICAgICAgICAgICAgRW51bVZhbHVlIGVudW1WYWx1ZSA9IG5ldyBFbnVtVmFsdWUoZW51bVR5cGUpOw0KLSAgICAgICAgICAgICAgICBpbnQgaSA9IGVudW1UeXBlLmdldEVudW1NZW1iZXJzKCkuaW5kZXhPZih2YWx1ZSk7DQotICAgICAgICAgICAgICAgIGVudW1WYWx1ZS5zZXRWYWx1ZShpKTsNCi0gICAgICAgICAgICAgICAgcmV0ID0gZW51bVZhbHVlOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIkVSUk9SISBJbnZhbGlkIGRhdGFUeXBlIik7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHJldDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRFbXB0eVZhbHVlKERhdGFUeXBlIHR5cGUpIHsNCi0gICAgICAgIHN3aXRjaCh0eXBlLmdldFR5cGVDb2RlKCkua2luZCgpLnZhbHVlKCkpIHsNCi0gICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfbG9uZzogcmV0dXJuIG5ldyBJbnRlZ2VyKDApOw0KLSAgICAgICAgICAgIGNhc2UgVENLaW5kLl90a191bG9uZzogcmV0dXJuIG5ldyBJbnRlZ2VyKDApOw0KLSAgICAgICAgICAgIGNhc2UgVENLaW5kLl90a19sb25nbG9uZzogcmV0dXJuIG5ldyBMb25nKDApOw0KLSAgICAgICAgICAgIGNhc2UgVENLaW5kLl90a191bG9uZ2xvbmc6IHJldHVybiBuZXcgTG9uZygwKTsNCi0gICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfc2hvcnQ6IHJldHVybiBuZXcgU2hvcnQoIjAiKTsNCi0gICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfdXNob3J0OiByZXR1cm4gbmV3IFNob3J0KCIwIik7DQotICAgICAgICAgICAgY2FzZSBUQ0tpbmQuX3RrX2Zsb2F0OiByZXR1cm4gbmV3IEZsb2F0KDBmKTsNCi0gICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfZG91YmxlOiByZXR1cm4gbmV3IERvdWJsZSgwZCk7DQotICAgICAgICAgICAgY2FzZSBUQ0tpbmQuX3RrX2NoYXI6IHJldHVybiBuZXcgQ2hhcmFjdGVyKCcwJyk7DQotICAgICAgICAgICAgY2FzZSBUQ0tpbmQuX3RrX3djaGFyOiByZXR1cm4gbmV3IENoYXJhY3RlcignMCcpOw0KLSAgICAgICAgICAgIGNhc2UgVENLaW5kLl90a19ib29sZWFuOiByZXR1cm4gQm9vbGVhbi5GQUxTRTsNCi0gICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfb2N0ZXQ6IHJldHVybiBuZXcgQnl0ZSgiMCIpOw0KLSAgICAgICAgICAgIGNhc2UgVENLaW5kLl90a19zdHJpbmc6IHJldHVybiAiIjsNCi0gICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfd3N0cmluZzogcmV0dXJuICIiOw0KLSAgICAgICAgICAgIC8vY2FzZSBUQ0tpbmQuX3RrX2FueTogcmV0dXJuIG5ldyBBbnkoKTsNCi0gICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfdmFsdWU6IHJldHVybiAiIjsNCi0gICAgICAgICAgICAvL2Nhc2UgVENLaW5kLl90a19vYmpyZWY6IHJldHVybiBuZXcgb3JnLm9tZy5DT1JCQS5PYmplY3QoKTsNCi0gICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfc3RydWN0Og0KLSAgICAgICAgICAgICAgICBTdHJ1Y3Qgc3RydWN0ID0gKFN0cnVjdCkgdHlwZTsNCi0gICAgICAgICAgICAgICAgU3RydWN0VmFsdWUgdmFsdWUgPSBuZXcgU3RydWN0VmFsdWUoc3RydWN0KTsNCi0gICAgICAgICAgICAgICAgTWVtYmVyW10gbWVtYmVycyA9IHN0cnVjdC5nZXRNZW1iZXJzKCk7DQotICAgICAgICAgICAgICAgIE9iamVjdFtdIG1lbWJlclZhbHVlcyA9IG5ldyBPYmplY3RbbWVtYmVycy5sZW5ndGhdOw0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1lbWJlcnMubGVuZ3RoOyBpKyspIHsNCi0gICAgICAgICAgICAgICAgICAgIG1lbWJlclZhbHVlc1tpXSA9IGdldEVtcHR5VmFsdWUobWVtYmVyc1tpXS5nZXREYXRhVHlwZSgpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB2YWx1ZS5zZXRNZW1iZXJWYWx1ZXMobWVtYmVyVmFsdWVzKTsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOw0KLSAgICAgICAgICAgIGNhc2UgVENLaW5kLl90a19lbnVtOiByZXR1cm4gbmV3IEVudW1WYWx1ZSgoRW51bVR5cGUpIHR5cGUpOw0KLSAgICAgICAgICAgIGNhc2UgVENLaW5kLl90a191bmlvbjoNCi0gICAgICAgICAgICAgICAgVW5pb25UeXBlIHVuaW9uVHlwZSA9IChVbmlvblR5cGUpIHR5cGU7DQotICAgICAgICAgICAgICAgIFVuaW9uVmFsdWUgdW5pb25WYWx1ZSA9IG5ldyBVbmlvblZhbHVlKHVuaW9uVHlwZSk7DQotICAgICAgICAgICAgICAgIG1lbWJlcnMgPSB1bmlvblR5cGUuZ2V0TWVtYmVycygpOw0KLSAgICAgICAgICAgICAgICB1bmlvblZhbHVlLnNldE1lbWJlck5hbWUobWVtYmVyc1swXS5nZXROYW1lKCkpOw0KLSAgICAgICAgICAgICAgICB1bmlvblZhbHVlLnNldE1lbWJlclR5cGUobWVtYmVyc1swXS5nZXREYXRhVHlwZSgpKTsNCi0gICAgICAgICAgICAgICAgdW5pb25WYWx1ZS5zZXRNZW1iZXJWYWx1ZShnZXRFbXB0eVZhbHVlKG1lbWJlcnNbMF0uZ2V0RGF0YVR5cGUoKSkpOw0KLSAgICAgICAgICAgICAgICByZXR1cm4gdW5pb25WYWx1ZTsNCi0gICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfYWxpYXM6DQotICAgICAgICAgICAgICAgIFR5cGVkZWYgdHlwZWRlZiA9IChUeXBlZGVmKSB0eXBlOw0KLSAgICAgICAgICAgICAgICBBbGlhc1ZhbHVlIGFsaWFzVmFsdWUgPSBuZXcgQWxpYXNWYWx1ZSh0eXBlZGVmKTsNCi0gICAgICAgICAgICAgICAgYWxpYXNWYWx1ZS5zZXRWYWx1ZShnZXRFbXB0eVZhbHVlKHR5cGVkZWYuZ2V0RGF0YVR5cGUoKSkpOw0KLSAgICAgICAgICAgICAgICByZXR1cm4gYWxpYXNWYWx1ZTsNCi0gICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfc2VxdWVuY2U6DQotICAgICAgICAgICAgICAgIFNlcXVlbmNlVHlwZSBzZXF1ZW5jZVR5cGUgPSAoU2VxdWVuY2VUeXBlKSB0eXBlOw0KLSAgICAgICAgICAgICAgICBTZXF1ZW5jZVZhbHVlIHNlcXVlbmNlVmFsdWUgPSBuZXcgU2VxdWVuY2VWYWx1ZShzZXF1ZW5jZVR5cGUpOw0KLSAgICAgICAgICAgICAgICBzZXF1ZW5jZVZhbHVlLnNldFZhbHVlcyhuZXcgT2JqZWN0WzBdKTsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHNlcXVlbmNlVmFsdWU7DQotICAgICAgICAgICAgY2FzZSBUQ0tpbmQuX3RrX2FycmF5Og0KLSAgICAgICAgICAgICAgICBBcnJheVR5cGUgYXJyYXlUeXBlID0gKEFycmF5VHlwZSkgdHlwZTsNCi0gICAgICAgICAgICAgICAgQXJyYXlWYWx1ZSBhcnJheVZhbHVlID0gbmV3IEFycmF5VmFsdWUoYXJyYXlUeXBlKTsNCi0gICAgICAgICAgICAgICAgT2JqZWN0W10gb2JqZWN0cyA9IG5ldyBPYmplY3RbYXJyYXlUeXBlLmdldEVsZW1lbnRDb3VudCgpXTsNCi0gICAgICAgICAgICAgICAgRGF0YVR5cGUgYXJyYXlEYXRhVHlwZSA9IGFycmF5VHlwZS5nZXREYXRhVHlwZSgpOw0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG9iamVjdHMubGVuZ3RoOyBpKyspIHsNCi0gICAgICAgICAgICAgICAgICAgIG9iamVjdHNbaV0gPSBnZXRFbXB0eVZhbHVlKGFycmF5RGF0YVR5cGUpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGFycmF5VmFsdWUuc2V0VmFsdWVzKG9iamVjdHMpOw0KLSAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXlWYWx1ZTsNCi0gICAgICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIkVSUk9SISBJbnZhbGlkIGRhdGFUeXBlIik7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9yZWNlaXZlcnMvSW52b2tlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvcmVjZWl2ZXJzL0ludm9rZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmMwMGYxOC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9yZWNlaXZlcnMvSW52b2tlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5yZWNlaXZlcnM7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29yYmEuZXhjZXB0aW9ucy5Db3JiYUludm9jYXRpb25FeGNlcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLnR5cGVzLkRhdGFUeXBlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC50eXBlcy5NZW1iZXI7DQotDQotcHVibGljIGludGVyZmFjZSBJbnZva2VyIHsNCi0JcHVibGljIE9iamVjdCBpbnZva2UoKSB0aHJvd3MgQ29yYmFJbnZvY2F0aW9uRXhjZXB0aW9uOw0KLQlwdWJsaWMgU3RyaW5nIGdldEludGVyZmFjZU5hbWUoKTsNCi0JcHVibGljIFN0cmluZyBnZXRPcGVyYXRpb25OYW1lKCk7DQotICAgIHB1YmxpYyB2b2lkIHNldFBhcmFtZXRlcnMoT2JqZWN0W10gcGFyYW1ldGVycyk7DQotICAgIHB1YmxpYyBEYXRhVHlwZSBnZXRSZXR1cm5UeXBlKCk7DQotICAgIHB1YmxpYyBNZW1iZXJbXSBnZXRQYXJhbWV0ZXJNZW1iZXJzKCk7DQotICAgIHB1YmxpYyBPYmplY3RbXSBnZXRPdXRQYXJhbWV0ZXJWYWx1ZXNzKCk7DQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL3JlY2VpdmVycy9JbnZva2VyRmFjdG9yeS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvcmVjZWl2ZXJzL0ludm9rZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwOGQ0YTUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvcmVjZWl2ZXJzL0ludm9rZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLnJlY2VpdmVyczsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5leGNlcHRpb25zLkNvcmJhSW52b2NhdGlvbkV4Y2VwdGlvbjsNCi0NCi1wdWJsaWMgaW50ZXJmYWNlIEludm9rZXJGYWN0b3J5IHsNCi0JcHVibGljIEludm9rZXIgbmV3SW52b2tlcihTdHJpbmcgaW50ZXJmYWNlTmFtZSwgU3RyaW5nIG9wZXJhdGlvbk5hbWUsIG9yZy5vbWcuQ09SQkEuT2JqZWN0IG9iamVjdCkgdGhyb3dzIENvcmJhSW52b2NhdGlvbkV4Y2VwdGlvbjsNCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZGlzdHJpYnV0aW9uL3BvbS54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9kaXN0cmlidXRpb24vcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjdlY2EzMy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kaXN0cmlidXRpb24vcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQzMiArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxwcm9qZWN0Ci0gICAgICAgIHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiCi0gICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjEuNS4xPC92ZXJzaW9uPgotICAgICAgICA8cmVsYXRpdmVQYXRoPi4uL3BhcmVudC9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+Ci0gICAgPC9wYXJlbnQ+Ci0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPmRpc3RyaWJ1dGlvbjwvYXJ0aWZhY3RJZD4KLSAgICA8bmFtZT5BcGFjaGUgQXhpczIgLSBEaXN0cmlidXRpb248L25hbWU+Ci0gICAgPGRlc2NyaXB0aW9uPkFwYWNoZSBBeGlzMiBEaXN0cmlidXRpb248L2Rlc2NyaXB0aW9uPgotICAgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+Ci0KLSAgICA8cHJvcGVydGllcz4KLSAgICAgICAgPGRvY3MuZm9sZGVyLnZlcnNpb24+MV81PC9kb2NzLmZvbGRlci52ZXJzaW9uPgotICAgIDwvcHJvcGVydGllcz4KLQotICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLnN1bi54bWwuZmFzdGluZm9zZXQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5GYXN0SW5mb3NldDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUudG9tY2F0PC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+dHJpYmVzPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS50b21jYXQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5qdWxpPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+eGFsYW48L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD54YWxhbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmNvbS5zdW4ueG1sLmJpbmQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXhiLWltcGw8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5jb20uc3VuLnhtbC5iaW5kPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF4Yi14amM8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC54bWwuYmluZDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmpheGItYXBpPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLnNwcmluZ2ZyYW1ld29yazwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnNwcmluZy1jb3JlPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtzcHJpbmcudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuc3ByaW5nZnJhbWV3b3JrPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+c3ByaW5nLWJlYW5zPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLnNwcmluZ2ZyYW1ld29yazwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnNwcmluZy1jb250ZXh0PC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLnNwcmluZ2ZyYW1ld29yazwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnNwcmluZy13ZWI8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMuamV0dGlzb248L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXR0aXNvbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5qaWJ4PC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+amlieC1iaW5kPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmppYng8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5qaWJ4LXJ1bjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYW50PC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YW50LWxhdW5jaGVyPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPlhtbFNjaGVtYTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubmVldGhpPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bmVldGhpPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5hbnQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5hbnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmJjZWw8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5iY2VsPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1sb2dnaW5nPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1sb2dnaW5nPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1jb2RlYzwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtY29kZWM8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD4ke3N0YXguaW1wbC5ncm91cGlkfTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPiR7c3RheC5pbXBsLmFydGlmYWN0fTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZ2Vyb25pbW8uc3BlY3M8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5nZXJvbmltby1hY3RpdmF0aW9uXzEuMV9zcGVjPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5nZXJvbmltby5zcGVjczwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmdlcm9uaW1vLWphdmFtYWlsXzEuNF9zcGVjPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5nZXJvbmltby5zcGVjczwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmdlcm9uaW1vLWFubm90YXRpb25fMS4wX3NwZWM8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmdlcm9uaW1vLnNwZWNzPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+Z2Vyb25pbW8td3MtbWV0YWRhdGFfMi4wX3NwZWM8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmdlcm9uaW1vLnNwZWNzPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+Z2Vyb25pbW8tc2Fhal8xLjNfc3BlYzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZ2Vyb25pbW8uc3BlY3M8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5nZXJvbmltby1qYXh3c18yLjFfc3BlYzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmpheGVuPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF4ZW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5jb21tb25zLWh0dHBjbGllbnQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWh0dHBjbGllbnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmh0dHBjb21wb25lbnRzPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+aHR0cGNvcmU8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5jb21tb25zLWZpbGV1cGxvYWQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWZpbGV1cGxvYWQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD53c2RsNGo8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD53c2RsNGo8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLndvZGVuPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+d29kZW4tYXBpPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS53b2RlbjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPndvZGVuLWltcGwtZG9tPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS54bWxiZWFuczwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnhtbGJlYW5zPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+bG9nNGo8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5sb2c0ajwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPnJoaW5vPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+anM8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5ic2Y8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5ic2Y8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5qYWxvcHk8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYWxvcHk8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5sb2c0ajwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmxvZzRqPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+eG1sLXJlc29sdmVyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+eG1sLXJlc29sdmVyPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDwhLS0gU21hY2sgSmFiYmVyIGNsaWVudCBsaWJyYXJpZXMgdG8gYmUgaW5jbHVkZWQgLS0+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmlnbml0ZXJlYWx0aW1lPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+c21hY2s8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuaWduaXRlcmVhbHRpbWU8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5zbWFja3g8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5jb21tb25zLWxhbmc8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWxhbmc8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8L2RlcGVuZGVuY2llcz4KLSAgICA8ZGlzdHJpYnV0aW9uTWFuYWdlbWVudD4KLSAgICAgICAgPHJlcG9zaXRvcnk+Ci0gICAgICAgICAgICA8aWQ+YXBhY2hlLXJlcG88L2lkPgotICAgICAgICAgICAgPG5hbWU+TWF2ZW4gQ2VudHJhbCBSZXBvc2l0b3J5PC9uYW1lPgotICAgICAgICAgICAgPHVybD4KLSAgICAgICAgICAgICAgICBzY3BleGU6Ly9wZW9wbGUuYXBhY2hlLm9yZy8vd3d3L3Blb3BsZS5hcGFjaGUub3JnL3JlcG8vbTItaWJpYmxpby1yc3luYy1yZXBvc2l0b3J5Ci0gICAgICAgICAgICA8L3VybD4KLSAgICAgICAgPC9yZXBvc2l0b3J5PgotICAgICAgICA8c25hcHNob3RSZXBvc2l0b3J5PgotICAgICAgICAgICAgPGlkPmFwYWNoZS1zbmFwc2hvdHM8L2lkPgotICAgICAgICAgICAgPG5hbWU+QXBhY2hlIERldmVsb3BtZW50IFJlcG9zaXRvcnk8L25hbWU+Ci0gICAgICAgICAgICA8dXJsPnNjcGV4ZTovL3Blb3BsZS5hcGFjaGUub3JnLy93d3cvcGVvcGxlLmFwYWNoZS5vcmcvcmVwby9tMi1zbmFwc2hvdC1yZXBvc2l0b3J5PC91cmw+Ci0gICAgICAgICAgICA8dW5pcXVlVmVyc2lvbj5mYWxzZTwvdW5pcXVlVmVyc2lvbj4KLSAgICAgICAgPC9zbmFwc2hvdFJlcG9zaXRvcnk+Ci0gICAgPC9kaXN0cmlidXRpb25NYW5hZ2VtZW50PgotICAgIDxidWlsZD4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+JHttYXZlbi5hc3NlbWJseS52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5kaXN0cmlidXRpb24tcGFja2FnZTwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+c2luZ2xlPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaW5hbE5hbWU+YXhpczItJHt2ZXJzaW9ufTwvZmluYWxOYW1lPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9ycz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0b3I+c3JjL21haW4vYXNzZW1ibHkvd2FyLWFzc2VtYmx5LnhtbDwvZGVzY3JpcHRvcj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0b3I+c3JjL21haW4vYXNzZW1ibHkvc3JjLWFzc2VtYmx5LnhtbDwvZGVzY3JpcHRvcj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0b3I+c3JjL21haW4vYXNzZW1ibHkvYmluLWFzc2VtYmx5LnhtbDwvZGVzY3JpcHRvcj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0b3I+c3JjL21haW4vYXNzZW1ibHkvZG9jLWFzc2VtYmx5LnhtbDwvZGVzY3JpcHRvcj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rlc2NyaXB0b3JzPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLQotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYW50cnVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke21hdmVuLmFudHJ1bi52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+Ci0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+cGFja2FnZTwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cHJvY2Vzcy1yZXNvdXJjZXM8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhc2tzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29weSB0b0Rpcj0idGFyZ2V0L3RtcC1kb2MtZGlzdHJvL3hkb2NzLyR7ZG9jcy5mb2xkZXIudmVyc2lvbn0iPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIuLi9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9IioqLyoueG1sIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29weT4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsdGVyIGZpbHRlcnNmaWxlPSIuLi9kb2N1bWVudGF0aW9uL3hkb2NzL2R5bmFtaWMtbGFiZWxzLnByb3BlcnRpZXMiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvcHkgdG9EaXI9InRhcmdldC90bXAtZG9jLWRpc3Ryby94ZG9jcy8ke2RvY3MuZm9sZGVyLnZlcnNpb259IiBmaWx0ZXJpbmc9Im9uIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVyd3JpdGU9InRydWUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdsb2JtYXBwZXIgZnJvbT0iKi54bWwiIHRvPSIqLmh0bWwiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iLi4vZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29weT4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsdGVyIHRva2VuPSJheGlzVmVyc2lvbiIgdmFsdWU9IiR7dmVyc2lvbn0iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRzdGFtcD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmb3JtYXQgcHJvcGVydHk9IlRPREFZIiBwYXR0ZXJuPSJkZC1NTS15eXl5Ii8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHN0YW1wPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsdGVyIHRva2VuPSJUT0RBWSIgdmFsdWU9IiR7VE9EQVl9Ii8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3B5IHRvRGlyPSJ0YXJnZXQvdG1wLWRvYy1kaXN0cm8vZG9jcyIgZmlsdGVyaW5nPSJvbiIgb3ZlcndyaXRlPSJ0cnVlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iLi4vLi4iPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IkxJQ0VOU0UudHh0Ii8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iUkVBRE1FLnR4dCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9InJlbGVhc2Utbm90ZXMuaHRtbCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIuLi8uLi9yZWxlYXNlLWRvY3MvcmVhZG1lLWZpbGVzIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqLnR4dCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvcHk+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvcHkgdG9EaXI9InRhcmdldC90bXAtZG9jLWRpc3Ryby94ZG9jcyIgZmlsdGVyaW5nPSJvbiIgb3ZlcndyaXRlPSJ0cnVlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnbG9ibWFwcGVyIGZyb209IioueG1sIiB0bz0iKi5odG1sIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9Ii4uL2RvY3VtZW50YXRpb24veGRvY3MiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9IkBheGlzMl92ZXJzaW9uX2RpckAvKioiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSIqKi8qLmdpZiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9IioqLyouanBnIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iKiovKi5wbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb3B5PgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3B5IHRvRGlyPSJ0YXJnZXQvdG1wLWRvYy1kaXN0cm8veGRvY3MiIGZpbHRlcmluZz0ib2ZmIiBvdmVyd3JpdGU9InRydWUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIuLi9kb2N1bWVudGF0aW9uL3hkb2NzIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJAYXhpczJfdmVyc2lvbl9kaXJALyoqIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5naWYiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLmpwZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoucG5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5jc3MiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLnhzZCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouY2dpIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5wcm9wZXJ0aWVzIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29weT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rhc2tzPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnJ1bjwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPnNlcnZpY2UtbW9kdWxlLWxpc3QtZ2VuZXJhdGlvbjwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cHJvY2Vzcy1yZXNvdXJjZXM8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhc2tzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWtkaXIgZGlyPSJ0YXJnZXQvdG1wLXJlcG9zaXRvcnkiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1rZGlyIGRpcj0idGFyZ2V0L3RtcC1yZXBvc2l0b3J5L21vZHVsZXMiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1rZGlyIGRpcj0idGFyZ2V0L3RtcC1yZXBvc2l0b3J5L3NlcnZpY2VzIi8+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvcHkgZmlsZT0iLi4vLi4vbW9kdWxlcy9zb2FwbW9uaXRvci90YXJnZXQvc29hcG1vbml0b3ItJHt2ZXJzaW9ufS5tYXIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvZmlsZT0idGFyZ2V0L3RtcC1yZXBvc2l0b3J5L21vZHVsZXMvc29hcG1vbml0b3ItJHtzb2FwbW9uaXRvci5tYXIudmVyc2lvbn0ubWFyIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3B5IGZpbGU9Ii4uLy4uL21vZHVsZXMvYWRkcmVzc2luZy90YXJnZXQvYWRkcmVzc2luZy0ke3ZlcnNpb259Lm1hciIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9maWxlPSJ0YXJnZXQvdG1wLXJlcG9zaXRvcnkvbW9kdWxlcy9hZGRyZXNzaW5nLSR7YWRkcmVzc2luZy5tYXIudmVyc2lvbn0ubWFyIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3B5IGZpbGU9Ii4uLy4uL21vZHVsZXMvcGluZy90YXJnZXQvcGluZy0ke3ZlcnNpb259Lm1hciIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9maWxlPSJ0YXJnZXQvdG1wLXJlcG9zaXRvcnkvbW9kdWxlcy9waW5nLSR7cGluZy5tYXIudmVyc2lvbn0ubWFyIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3B5IGZpbGU9Ii4uLy4uL21vZHVsZXMvbWV4L3RhcmdldC9tZXgtJHt2ZXJzaW9ufS5tYXIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvZmlsZT0idGFyZ2V0L3RtcC1yZXBvc2l0b3J5L21vZHVsZXMvbWV4LSR7bWV4Lm1hci52ZXJzaW9ufS5tYXIiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvcHkgZmlsZT0iLi4vLi4vbW9kdWxlcy9zY3JpcHRpbmcvdGFyZ2V0L2F4aXMyLXNjcmlwdGluZy0ke3ZlcnNpb259Lm1hciIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9maWxlPSJ0YXJnZXQvdG1wLXJlcG9zaXRvcnkvbW9kdWxlcy9zY3JpcHRpbmctJHtzY3JpcHRpbmcubWFyLnZlcnNpb259Lm1hciIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29weSBmaWxlPSIuLi8uLi9tb2R1bGVzL210b21wb2xpY3ktbWFyL3RhcmdldC9tdG9tcG9saWN5LSR7dmVyc2lvbn0ubWFyIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2ZpbGU9InRhcmdldC90bXAtcmVwb3NpdG9yeS9tb2R1bGVzL210b21wb2xpY3ktJHttdG9tcG9saWN5Lm1hci52ZXJzaW9ufS5tYXIiLz4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGdlbmVyYXRlIG1vZHVsZXMubGlzdCAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVjaG8gZmlsZT0idGFyZ2V0L3RtcC1yZXBvc2l0b3J5L21vZHVsZXMvbW9kdWxlcy5saXN0IiBhcHBlbmQ9ImZhbHNlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB1bmRlciB0aGUgTGljZW5zZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvYXBtb25pdG9yLSR7c29hcG1vbml0b3IubWFyLnZlcnNpb259Lm1hcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzc2luZy0ke2FkZHJlc3NpbmcubWFyLnZlcnNpb259Lm1hcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGluZy0ke3BpbmcubWFyLnZlcnNpb259Lm1hcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV4LSR7bWV4Lm1hci52ZXJzaW9ufS5tYXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdGluZy0ke3NjcmlwdGluZy5tYXIudmVyc2lvbn0ubWFyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZWNobz4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29weSBmaWxlPSIuLi8uLi9tb2R1bGVzL3NhbXBsZXMvdGFyZ2V0L3RvV2FyL3NlcnZpY2VzL3ZlcnNpb24uYWFyIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2Rpcj0idGFyZ2V0L3RtcC1yZXBvc2l0b3J5L3NlcnZpY2VzIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gZ2VuZXJhdGUgc2VydmljZXMubGlzdCAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVjaG8gZmlsZT0idGFyZ2V0L3RtcC1yZXBvc2l0b3J5L3NlcnZpY2VzL3NlcnZpY2VzLmxpc3QiIGFwcGVuZD0iZmFsc2UiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHVuZGVyIHRoZSBMaWNlbnNlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbi5hYXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9lY2hvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFza3M+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+cnVuPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+ZGVsZXRlLXRlbXBvcmFyeS1maWxlczwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+aW5zdGFsbDwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFza3M+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZWxldGUgZGlyPSJ0YXJnZXQvdG1wLWRvYy1kaXN0cm8iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlbGV0ZSBkaXI9InRhcmdldC90bXAtcmVwb3NpdG9yeSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVsZXRlIGRpcj0idGFyZ2V0L2FyY2hpdmUtdG1wIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YXNrcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5ydW48L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvYnVpbGQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kaXN0cmlidXRpb24vc3JjL21haW4vYXNzZW1ibHkvYmluLWFzc2VtYmx5LnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2Rpc3RyaWJ1dGlvbi9zcmMvbWFpbi9hc3NlbWJseS9iaW4tYXNzZW1ibHkueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0ZjFmNTQ2Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2Rpc3RyaWJ1dGlvbi9zcmMvbWFpbi9hc3NlbWJseS9iaW4tYXNzZW1ibHkueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDI2ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGFzc2VtYmx5PgotICAgIDxpZD5iaW48L2lkPgotICAgIDxpbmNsdWRlQmFzZURpcmVjdG9yeT50cnVlPC9pbmNsdWRlQmFzZURpcmVjdG9yeT4gCi0gICAgPGJhc2VEaXJlY3Rvcnk+YXhpczItJHt2ZXJzaW9ufTwvYmFzZURpcmVjdG9yeT4KLSAgICA8Zm9ybWF0cz4KLQk8IS0tPGZvcm1hdD50YXIuZ3o8L2Zvcm1hdD4gIC8vdW5jb21tZW50LGlmIHRhci5neiBhcmNoaXZlIG5lZWRlZC0tPgotICAgICAgICA8Zm9ybWF0PnppcDwvZm9ybWF0PgotICAgIDwvZm9ybWF0cz4KLQotCi0gICAgPGZpbGVTZXRzPgotICAgICAgICA8IS0tKioqKioqKioqKioqKioqKioqKioqKiBjcmVhdGluZyB0aGUgcmVwb3NpdG9yeSAqKioqKioqKioqKioqKioqKioqKioqIC0tPgotICAgICAgICA8ZmlsZVNldD4KLSAgICAgICAgICAgIDxkaXJlY3Rvcnk+dGFyZ2V0L3RtcC1yZXBvc2l0b3J5PC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PnJlcG9zaXRvcnk8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qPC9pbmNsdWRlPgotICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgPC9maWxlU2V0PgotCi0gICAgICAgIDwhLS0qKioqKioqKioqKioqKioqKioqKioqIGNyZWF0aW5nIHRoZSBiaW4gKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLSAgICAgICAgPCEtLSBDb3B5IGJpbiBzY3JpcHRzIC0tPgotICAgICAgICA8ZmlsZVNldD4KLSAgICAgICAgICAgIDxkaXJlY3Rvcnk+Li4vLi4vbW9kdWxlcy90b29sL3NjcmlwdDwvZGlyZWN0b3J5PgotICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT5iaW48L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZT4qLmJhdDwvaW5jbHVkZT4KLSAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgIDwvZmlsZVNldD4KLQotICAgICAgICA8ZmlsZVNldD4KLSAgICAgICAgICAgIDxkaXJlY3Rvcnk+Li4vLi4vbW9kdWxlcy90b29sL3NjcmlwdDwvZGlyZWN0b3J5PgotICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT5iaW48L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZT4qLnNoPC9pbmNsdWRlPgotICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgIDxmaWxlTW9kZT43NTU8L2ZpbGVNb2RlPgotICAgICAgICA8L2ZpbGVTZXQ+Ci0KLSAgICAgICAgPCEtLSoqKioqKioqKioqKioqKioqKioqKiogY3JlYXRpbmcgdGhlIGNvbmYgKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLSAgICAgICAgPCEtLSBjb3B5IHRoZSBheGlzMi54bWwgaW50byBjb25mIGRpcmVjdG95IC0tPgotICAgICAgICA8ZmlsZVNldD4KLSAgICAgICAgICAgIDxkaXJlY3Rvcnk+Li4vLi4vbW9kdWxlcy9rZXJuZWwvY29uZjwvZGlyZWN0b3J5PgotICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT5jb25mPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGU+YXhpczIueG1sPC9pbmNsdWRlPgotICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgPC9maWxlU2V0PgotCi0gICAgICAgIDwhLS0qKioqKioqKioqKioqKioqKioqKioqIGNyZWF0aW5nIHRoZSB3ZWJhcHBwICoqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0gICAgICAgIDwhLS0gY29weSB0aGUgd2ViLnhtbCBpbnRvIHdlYmFwcC9XRUItSU5GIGRpcmVjdG9yeSAtLT4KLQotICAgICAgICA8ZmlsZVNldD4KLSAgICAgICAgICAgIDxkaXJlY3Rvcnk+Li4vLi4vbW9kdWxlcy93ZWJhcHAvY29uZjwvZGlyZWN0b3J5PgotICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT53ZWJhcHAvV0VCLUlORjwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlPndlYi54bWw8L2luY2x1ZGU+Ci0gICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICA8L2ZpbGVTZXQ+Ci0KLQotICAgICAgICA8IS0tIGNvcHkgdGhlIGJ1aWxkLnhtbCBpbnRvIHdlYmFwcCBkaXJlY3RvcnkgLS0+Ci0gICAgICAgIDxmaWxlU2V0PgotICAgICAgICAgICAgPGRpcmVjdG9yeT4uLi8uLi9tb2R1bGVzL3dlYmFwcC9zY3JpcHRzPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PndlYmFwcDwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlPmJ1aWxkLnhtbDwvaW5jbHVkZT4KLSAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgIDwvZmlsZVNldD4KLQotICAgICAgICA8IS0tIGNvcHkgY2xhc3MgZmlsZXMgdG8gd2ViYXBwL1dFQi1JTkYvY2xhc3NlcyBkaXJlY3RvcnkgLS0+Ci0gICAgICAgIDxmaWxlU2V0PgotICAgICAgICAgICAgPGRpcmVjdG9yeT4uLi8uLi9tb2R1bGVzL3dlYmFwcC90YXJnZXQvY2xhc3NlczwvZGlyZWN0b3J5PgotICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT53ZWJhcHAvV0VCLUlORi9jbGFzc2VzPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKjwvaW5jbHVkZT4KLSAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgIDwvZmlsZVNldD4KLQotICAgICAgICA8IS0tIGNvcHkgKi5wcm9wZXJ0aWVzIHRvIHdlYmFwcC9XRUItSU5GL2NsYXNzZXMgZGlyZWN0b3J5IC0tPgotICAgICAgICA8ZmlsZVNldD4KLSAgICAgICAgICAgIDxkaXJlY3Rvcnk+Li4vLi4vbW9kdWxlcy9rZXJuZWwvY29uZjwvZGlyZWN0b3J5PgotICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT53ZWJhcHAvV0VCLUlORi9jbGFzc2VzPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGU+Ki5wcm9wZXJ0aWVzPC9pbmNsdWRlPgotICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgPC9maWxlU2V0PgotCi0gICAgICAgIDwhLS0gY29weSBjb250ZW50cyBvZiB0aGUgd2ViYXBwIG1vZHVsZSAtLT4KLQotICAgICAgICA8ZmlsZVNldD4KLSAgICAgICAgICAgIDxkaXJlY3Rvcnk+Li4vLi4vbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PndlYmFwcDwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICAgICAgPGV4Y2x1ZGVzPgotICAgICAgICAgICAgICAgIDxleGNsdWRlPnByb2plY3QueG1sPC9leGNsdWRlPgotICAgICAgICAgICAgICAgIDxleGNsdWRlPioqLyouaW1sPC9leGNsdWRlPgotICAgICAgICAgICAgICAgIDxleGNsdWRlPioqLy4qPC9leGNsdWRlPgotICAgICAgICAgICAgICAgIDxleGNsdWRlPioqL2NvbmYvKio8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1ZGU+Kiovc2NyaXB0cy8qKjwvZXhjbHVkZT4KLSAgICAgICAgICAgIDwvZXhjbHVkZXM+Ci0gICAgICAgIDwvZmlsZVNldD4KLQotCi0gICAgICAgIDxmaWxlU2V0PgotICAgICAgICAgICAgPGRpcmVjdG9yeT4uLi8uLi9tb2R1bGVzL2phdmEyd3NkbC90YXJnZXQ8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+bGliPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGU+YXhpczItamF2YTJ3c2RsLSR7dmVyc2lvbn0uamFyPC9pbmNsdWRlPgotICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgPC9maWxlU2V0PgotICAgICAgICA8ZmlsZVNldD4KLSAgICAgICAgICAgIDxkaXJlY3Rvcnk+Li4vLi4vbW9kdWxlcy9rZXJuZWwvdGFyZ2V0PC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PmxpYjwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlPmF4aXMyLWtlcm5lbC0ke3ZlcnNpb259LmphcjwvaW5jbHVkZT4KLSAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgIDwvZmlsZVNldD4gCi0gICAgICAgIDxmaWxlU2V0PgotICAgICAgICAgICAgPGRpcmVjdG9yeT4uLi8uLi9tb2R1bGVzL2FkYi90YXJnZXQ8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+bGliPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGU+YXhpczItYWRiLSR7dmVyc2lvbn0uamFyPC9pbmNsdWRlPgotICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgPC9maWxlU2V0PgotICAgICAgICA8ZmlsZVNldD4KLSAgICAgICAgICAgIDxkaXJlY3Rvcnk+Li4vLi4vbW9kdWxlcy9jb2RlZ2VuL3RhcmdldDwvZGlyZWN0b3J5PgotICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT5saWI8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZT5heGlzMi1jb2RlZ2VuLSR7dmVyc2lvbn0uamFyPC9pbmNsdWRlPgotICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgPC9maWxlU2V0PgotICAgICAgICA8ZmlsZVNldD4KLSAgICAgICAgICAgIDxkaXJlY3Rvcnk+Li4vLi4vbW9kdWxlcy9hZGItY29kZWdlbi90YXJnZXQ8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+bGliPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGU+YXhpczItYWRiLWNvZGVnZW4tJHt2ZXJzaW9ufS5qYXI8L2luY2x1ZGU+Ci0gICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICA8L2ZpbGVTZXQ+Ci0KLSAgICAgICAgPGZpbGVTZXQ+Ci0gICAgICAgICAgICA8ZGlyZWN0b3J5Pi4uLy4uL21vZHVsZXMveG1sYmVhbnMvdGFyZ2V0PC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PmxpYjwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlPmF4aXMyLXhtbGJlYW5zLSR7dmVyc2lvbn0uamFyPC9pbmNsdWRlPgotICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgPC9maWxlU2V0PgotICAgICAgICA8ZmlsZVNldD4KLSAgICAgICAgICAgIDxkaXJlY3Rvcnk+Li4vLi4vbW9kdWxlcy9qaWJ4L3RhcmdldDwvZGlyZWN0b3J5PgotICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT5saWI8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZT5heGlzMi1qaWJ4LSR7dmVyc2lvbn0uamFyPC9pbmNsdWRlPgotICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgPC9maWxlU2V0PgotICAgICAgICA8ZmlsZVNldD4KLSAgICAgICAgICAgIDxkaXJlY3Rvcnk+Li4vLi4vbW9kdWxlcy9qc29uL3RhcmdldDwvZGlyZWN0b3J5PgotICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT5saWI8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZT5heGlzMi1qc29uLSR7dmVyc2lvbn0uamFyPC9pbmNsdWRlPgotICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgPC9maWxlU2V0PgotICAgICAgICA8ZmlsZVNldD4KLSAgICAgICAgICAgIDxkaXJlY3Rvcnk+Li4vLi4vbW9kdWxlcy90b29sL3RhcmdldDwvZGlyZWN0b3J5PgotICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT5saWI8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZT5heGlzMi10b29scy0ke3ZlcnNpb259LmphcjwvaW5jbHVkZT4KLSAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgIDwvZmlsZVNldD4KLSAgICAgICAgPGZpbGVTZXQ+Ci0gICAgICAgICAgICA8ZGlyZWN0b3J5Pi4uLy4uL21vZHVsZXMvc3ByaW5nL3RhcmdldDwvZGlyZWN0b3J5PgotICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT5saWI8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZT5heGlzMi1zcHJpbmctJHt2ZXJzaW9ufS5qYXI8L2luY2x1ZGU+Ci0gICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICA8L2ZpbGVTZXQ+Ci0gICAgICAgIDxmaWxlU2V0PgotICAgICAgICAgICAgPGRpcmVjdG9yeT4uLi8uLi9tb2R1bGVzL3NvYXBtb25pdG9yL3RhcmdldDwvZGlyZWN0b3J5PgotICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT5saWI8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZT5zb2FwbW9uaXRvci0ke3ZlcnNpb259LmphcjwvaW5jbHVkZT4KLSAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgIDwvZmlsZVNldD4KLSAgICAgICAgPGZpbGVTZXQ+Ci0gICAgICAgICAgICA8ZGlyZWN0b3J5Pi4uLy4uL21vZHVsZXMvZmFzdGluZm9zZXQvdGFyZ2V0PC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PmxpYjwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlPmF4aXMyLWZhc3RpbmZvc2V0LSR7dmVyc2lvbn0uamFyPC9pbmNsdWRlPgotICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgPC9maWxlU2V0PgotICAgICAgICA8ZmlsZVNldD4KLSAgICAgICAgICAgIDxkaXJlY3Rvcnk+Li4vLi4vbW9kdWxlcy9qYXhicmkvdGFyZ2V0PC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PmxpYjwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlPmF4aXMyLWpheGJyaS0ke3ZlcnNpb259LmphcjwvaW5jbHVkZT4KLSAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgIDwvZmlsZVNldD4KLSAgICAgICAgPGZpbGVTZXQ+Ci0gICAgICAgICAgICA8ZGlyZWN0b3J5Pi4uLy4uL21vZHVsZXMvamF4d3MvdGFyZ2V0PC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PmxpYjwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlPmF4aXMyLWpheHdzLSR7dmVyc2lvbn0uamFyPC9pbmNsdWRlPgotICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgPC9maWxlU2V0PgotICAgICAgICA8ZmlsZVNldD4KLSAgICAgICAgICAgIDxkaXJlY3Rvcnk+Li4vLi4vbW9kdWxlcy9tZXRhZGF0YS90YXJnZXQ8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+bGliPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGU+YXhpczItbWV0YWRhdGEtJHt2ZXJzaW9ufS5qYXI8L2luY2x1ZGU+Ci0gICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICA8L2ZpbGVTZXQ+Ci0gICAgICAgIDxmaWxlU2V0PgotICAgICAgICAgICAgPGRpcmVjdG9yeT4uLi8uLi9tb2R1bGVzL2NsdXN0ZXJpbmcvdGFyZ2V0PC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PmxpYjwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlPmF4aXMyLWNsdXN0ZXJpbmctJHt2ZXJzaW9ufS5qYXI8L2luY2x1ZGU+Ci0gICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICA8L2ZpbGVTZXQ+Ci0gICAgICAgIDxmaWxlU2V0PgotICAgICAgICAgICAgPGRpcmVjdG9yeT4uLi8uLi9tb2R1bGVzL3NhYWovdGFyZ2V0PC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PmxpYjwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlPmF4aXMyLXNhYWotJHt2ZXJzaW9ufS5qYXI8L2luY2x1ZGU+Ci0gICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICA8L2ZpbGVTZXQ+Ci0gICAgICAgIDxmaWxlU2V0PgotICAgICAgICAgICAgPGRpcmVjdG9yeT4uLi8uLi9tb2R1bGVzL3Rvb2wvYXhpczItYW50LXBsdWdpbi90YXJnZXQ8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+bGliPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGU+YXhpczItYW50LXBsdWdpbi0ke3ZlcnNpb259LmphcjwvaW5jbHVkZT4KLSAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgIDwvZmlsZVNldD4KLSAgICAgICAgPGZpbGVTZXQ+Ci0gICAgICAgICAgICA8ZGlyZWN0b3J5Pi4uLy4uL21vZHVsZXMvbWV4L3RhcmdldDwvZGlyZWN0b3J5PgotICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT5saWI8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZT5tZXgtJHt2ZXJzaW9ufS5qYXI8L2luY2x1ZGU+Ci0gICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICA8L2ZpbGVTZXQ+Ci0gICAgICAgIDxmaWxlU2V0PgotICAgICAgICAgICAgPGRpcmVjdG9yeT4uLi8uLi9tb2R1bGVzL2NvcmJhL3RhcmdldDwvZGlyZWN0b3J5PgotICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT5saWI8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZT5heGlzMi1jb3JiYS0ke3ZlcnNpb259LmphcjwvaW5jbHVkZT4KLSAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgIDwvZmlsZVNldD4KLSAgICAgICAgPGZpbGVTZXQ+Ci0gICAgICAgICAgICA8ZGlyZWN0b3J5Pi4uLy4uL21vZHVsZXMvbXRvbXBvbGljeS90YXJnZXQ8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+bGliPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGU+YXhpczItbXRvbXBvbGljeS0ke3ZlcnNpb259LmphcjwvaW5jbHVkZT4KLSAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgIDwvZmlsZVNldD4KLSAgICAgICAgPGZpbGVTZXQ+Ci0gICAgICAgICAgICA8ZGlyZWN0b3J5Pi4uLy4uL21vZHVsZXMvdHJhbnNwb3J0L2h0dHAvdGFyZ2V0PC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PmxpYjwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlPmF4aXMyLXRyYW5zcG9ydC1odHRwLSR7dmVyc2lvbn0uamFyPC9pbmNsdWRlPgotICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgPC9maWxlU2V0PgotICAgICAgICA8ZmlsZVNldD4KLSAgICAgICAgICAgIDxkaXJlY3Rvcnk+Li4vLi4vbW9kdWxlcy90cmFuc3BvcnQvbG9jYWwvdGFyZ2V0PC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PmxpYjwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlPmF4aXMyLXRyYW5zcG9ydC1sb2NhbC0ke3ZlcnNpb259LmphcjwvaW5jbHVkZT4KLSAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgIDwvZmlsZVNldD4KLQotICAgICAgICA8ZmlsZVNldD4KLSAgICAgICAgICAgIDxkaXJlY3Rvcnk+Li4vLi4vbGVnYWw8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+bGliPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKi50eHQ8L2luY2x1ZGU+Ci0gICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICA8L2ZpbGVTZXQ+Ci0KLQk8IS0tIFRPRE86IE5lZWQgdG8gcmVuYW1lIHRoaXMgZmlsZSB0byBJTlNUQUxMLnR4dCAtLT4KLQk8ZmlsZVNldD4KLSAgICAgICAgICAgIDxkaXJlY3Rvcnk+dGFyZ2V0L3RtcC1kb2MtZGlzdHJvL2RvY3M8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+PC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGU+aW5zdGFsbGF0aW9uLXN0ZC1iaW4udHh0PC9pbmNsdWRlPgotICAgICAgICAgICAgPC9pbmNsdWRlcz4KLQk8L2ZpbGVTZXQ+Ci0KLQk8ZmlsZVNldD4KLSAgICAgICAgICAgIDxkaXJlY3Rvcnk+Li4vLi4vbW9kdWxlcy9rZXJuZWwvY29uZjwvZGlyZWN0b3J5PgotICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT48L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZT5sb2c0ai5wcm9wZXJ0aWVzPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlPmNvbW1vbnMtbG9nZ2luZy5wcm9wZXJ0aWVzPC9pbmNsdWRlPgotICAgICAgICAgICAgPC9pbmNsdWRlcz4KLQk8L2ZpbGVTZXQ+Ci0KLQk8ZmlsZVNldD4KLSAgICAgICAgICAgIDxkaXJlY3Rvcnk+dGFyZ2V0L3RtcC1kb2MtZGlzdHJvL2RvY3M8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+PC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGU+TElDRU5TRS50eHQ8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGU+Tk9USUNFLnR4dDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZT5SRUFETUUudHh0PC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlPnJlbGVhc2Utbm90ZXMuaHRtbDwvaW5jbHVkZT4KLSAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0JPC9maWxlU2V0PgotCi0gICAgICAgIDwhLS0gY29weSBzYW1wbGVzIC0tPgotICAgICAgICA8ZmlsZVNldD4KLSAgICAgICAgICAgIDxkaXJlY3Rvcnk+Li4vLi4vbW9kdWxlcy9zYW1wbGVzPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PnNhbXBsZXM8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgIDxpbmNsdWRlcz4KLQkJCQk8aW5jbHVkZT5kYXRhYmluZGluZy8qKi8qPC9pbmNsdWRlPgotCQkJCTxpbmNsdWRlPmZhdWx0aGFuZGxpbmcvKiovKjwvaW5jbHVkZT4KLQkJCQk8aW5jbHVkZT5qYXh3cy1jYWxjdWxhdG9yLyoqLyo8L2luY2x1ZGU+Ci0JCQkJPGluY2x1ZGU+amF4d3MtYWRkcmVzc2Jvb2svKiovKjwvaW5jbHVkZT4KLQkJCQk8aW5jbHVkZT5qYXh3cy1zYW1wbGVzLyoqLyo8L2luY2x1ZGU+Ci0JCQkJPGluY2x1ZGU+amF2YV9maXJzdF9qYXh3cy8qKi8qPC9pbmNsdWRlPgotCQkJCTxpbmNsdWRlPmpheHdzLWludGVyb3AvKiovKjwvaW5jbHVkZT4KLQkJCQk8aW5jbHVkZT5qYXh3cy1keW5hbWljLyoqLyo8L2luY2x1ZGU+Ci0JCQkJPGluY2x1ZGU+amF4d3MtdmVyc2lvbi8qKi8qPC9pbmNsdWRlPgotCQkJCTxpbmNsdWRlPm10b20vKiovKjwvaW5jbHVkZT4KLQkJCQk8aW5jbHVkZT5wb2pvLyoqLyo8L2luY2x1ZGU+Ci0JCQkJPGluY2x1ZGU+cG9qb2d1aWRlLyoqLyo8L2luY2x1ZGU+Ci0JCQkJPGluY2x1ZGU+cG9qb2d1aWRlc3ByaW5nLyoqLyo8L2luY2x1ZGU+Ci0JCQkJPGluY2x1ZGU+cXVpY2tzdGFydC8qKi8qPC9pbmNsdWRlPgotCQkJCTxpbmNsdWRlPnF1aWNrc3RhcnRhZGIvKiovKjwvaW5jbHVkZT4KLQkJCQk8aW5jbHVkZT5xdWlja3N0YXJ0YXhpb20vKiovKjwvaW5jbHVkZT4KLQkJCQk8aW5jbHVkZT5xdWlja3N0YXJ0amlieC8qKi8qPC9pbmNsdWRlPgotCQkJCTxpbmNsdWRlPnF1aWNrc3RhcnR4bWxiZWFucy8qKi8qPC9pbmNsdWRlPgotCQkJCTxpbmNsdWRlPnNlcnZpY2VsaWZlY3ljbGUvKiovKjwvaW5jbHVkZT4KLQkJCQk8aW5jbHVkZT5zb2Fwd2l0aGF0dGFjaG1lbnRzLyoqLyo8L2luY2x1ZGU+Ci0JCQkJPGluY2x1ZGU+dXNlcmd1aWRlLyoqLyo8L2luY2x1ZGU+Ci0JCQkJPGluY2x1ZGU+dmVyc2lvbi8qKi8qPC9pbmNsdWRlPgotCQkJCTxpbmNsdWRlPndzZGwvKiovKjwvaW5jbHVkZT4KLQkJCQk8aW5jbHVkZT55YWhvb2pzb25zZWFyY2gvKiovKjwvaW5jbHVkZT4KLQkJCQk8aW5jbHVkZT55YWhvb3Jlc3RzZWFyY2gvKiovKjwvaW5jbHVkZT4gICAgICAgICAgICAKLSAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICA8ZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovKi5pbWw8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICA8L2V4Y2x1ZGVzPgotICAgICAgICA8L2ZpbGVTZXQ+Ci0gICAgPC9maWxlU2V0cz4KLSAgICAKLSAgICAgIDxkZXBlbmRlbmN5U2V0cz4KLSAgICAgICAgPGRlcGVuZGVuY3lTZXQ+Ci0gICAgICAgICAgPG91dHB1dERpcmVjdG9yeT5saWI8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgIDxleGNsdWRlcz4KLSAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+bXg0ajpteDRqLWpteDpqYXI8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgIDxleGNsdWRlPm14NGo6bXg0ai1pbXBsOmphcjwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+bXg0ajpteDRqLXJlbW90ZTpqYXI8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgIDxleGNsdWRlPm14NGo6bXg0ai10b29sczpqYXI8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgIDxleGNsdWRlPm14NGo6bXg0ajpqYXI8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgIDxleGNsdWRlPnJvbWU6cm9tZTpqYXI8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgIDxleGNsdWRlPm9yZy5hcGFjaGUuZ2Vyb25pbW8uc3BlY3M6Z2Vyb25pbW8tYWN0aXZhdGlvbl8xLjFfc3BlYzpqYXI8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgIDxleGNsdWRlPm9yZy5hcGFjaGUuZ2Vyb25pbW8uc3BlY3M6Z2Vyb25pbW8tajJlZS1jb25uZWN0b3JfMS41X3NwZWM6amFyPC9leGNsdWRlPgotICAgICAgICAgICAgICAgICA8ZXhjbHVkZT5vcmcuYXBhY2hlLmdlcm9uaW1vLnNwZWNzOmdlcm9uaW1vLWoyZWUtamFjY18xLjBfc3BlYzpqYXI8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgIDxleGNsdWRlPm9yZy5hcGFjaGUuZ2Vyb25pbW8uc3BlY3M6Z2Vyb25pbW8tajJlZS1tYW5hZ2VtZW50XzEuMF9zcGVjOmphcjwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnLmFwYWNoZS5nZXJvbmltby5zcGVjczpnZXJvbmltby1qYXZhbWFpbF8xLjRfc3BlYzpqYXI8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgIDxleGNsdWRlPm9yZy5hcGFjaGUuZ2Vyb25pbW8uc3BlY3M6Z2Vyb25pbW8tanNwXzIuMF9zcGVjOmphcjwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnLmFwYWNoZS5hY3RpdmVtcTphY3RpdmVtcS1jb25zb2xlOmphcjwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnLmFwYWNoZS5hY3RpdmVtcTphY3RpdmVtcS1jb3JlOmphcjwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnLmFwYWNoZS5hY3RpdmVtcTphY3RpdmVtcS1qYWFzOmphcjwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnLmFwYWNoZS5hY3RpdmVtcTphY3RpdmVtcS1vcHRpb25hbDpqYXI8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgIDxleGNsdWRlPm9yZy5hcGFjaGUuYWN0aXZlbXE6YWN0aXZlbXEtb3B0aW9uYWw6amFyPC9leGNsdWRlPgotICAgICAgICAgICAgICAgICA8ZXhjbHVkZT5vcmcuYXBhY2hlLmFjdGl2ZW1xOmFjdGl2ZW1xLXdlYjpqYXI8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgIDxleGNsdWRlPm9yZy5hcGFjaGUuYWN0aXZlbXE6YWN0aXZlbXEtd2ViLWRlbW86d2FyPC9leGNsdWRlPgotICAgICAgICAgICAgICAgICA8ZXhjbHVkZT54c3RyZWFtOnhzdHJlYW06amFyPC9leGNsdWRlPgotICAgICAgICAgICAgICAgICA8ZXhjbHVkZT54b206eG9tOmphcjwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+eG1scHVsbDp4bWxwdWxsOmphcjwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+eGVyY2VzOnhtbFBhcnNlckFQSXM6amFyPC9leGNsdWRlPgotICAgICAgICAgICAgICAgICA8ZXhjbHVkZT5vcmcuYXBhY2hlLnhiZWFuOnhiZWFuLXNwcmluZzpqYXI8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgIDxleGNsdWRlPm9yZy5hcGFjaGUudG9tY2F0OnRyaWJlczpqYXI8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgIDxleGNsdWRlPm9yZy5zcHJpbmdmcmFtZXdvcms6c3ByaW5nOmphcjwvZXhjbHVkZT4JCi0gICAgICAgICAgICAgICAgIDxleGNsdWRlPm9yZy5zcHJpbmdmcmFtZXdvcms6c3ByaW5nLWJlYW5zOmphcjwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnLnNwcmluZ2ZyYW1ld29yazpzcHJpbmctY29udGV4dDpqYXI8L2V4Y2x1ZGU+CQotICAgICAgICAgICAgICAgICA8ZXhjbHVkZT5vcmcuc3ByaW5nZnJhbWV3b3JrOnNwcmluZy1jb3JlOmphcjwvZXhjbHVkZT4JCi0gICAgICAgICAgICAgICAgIDxleGNsdWRlPm9yZy5zcHJpbmdmcmFtZXdvcms6c3ByaW5nLXdlYjpqYXI8L2V4Y2x1ZGU+CQotICAgICAgICAgICAgICAgICA8ZXhjbHVkZT5sb2draXQ6bG9na2l0OmphcjwvZXhjbHVkZT4JCi0gICAgICAgICAgICAgICAgIDxleGNsdWRlPm9yZy5hcGFjaGUudG9tY2F0Omp1bGk6amFyPC9leGNsdWRlPgkKLSAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+amF2YXgueG1sLmJpbmQ6anNyMTczX2FwaTpqYXI8L2V4Y2x1ZGU+CQotICAgICAgICAgICAgICAgICA8ZXhjbHVkZT5qcm1zOmpybXM6amFyPC9leGNsdWRlPgkKLSAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+YWN0aXZlbXE6am1kbnM6amFyPC9leGNsdWRlPgkKLSAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnLm1vcnRiYXkuamV0dHk6amV0dHk6amFyPC9leGNsdWRlPgkKLSAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnLm1vcnRiYXkuamV0dHk6amV0dHktdXRpbDpqYXI8L2V4Y2x1ZGU+CQotICAgICAgICAgICAgICAgICA8ZXhjbHVkZT5qZG9tOmpkb206amFyPC9leGNsdWRlPgotICAgICAgICAgICAgICAgICA8ZXhjbHVkZT5qYWthcnRhLXJlZ2V4cDpqYWthcnRhLXJlZ2V4cDpqYXI8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgIDxleGNsdWRlPmNvbS5pYm0uaWN1OmljdTRqOmphcjwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnLmFwYWNoZS5iY2VsOmJjZWw6amFyPC9leGNsdWRlPgkKLSAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnLmFwYWNoZS5hY3RpdmVtcTphY3RpdmVpby1jb3JlOmphcjwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnLmFwYWNoZS5hbnQ6YW50OmphcjwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnLmFwYWNoZS5hbnQ6YW50LWxhdW5jaGVyOmphcjwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+YW9wYWxsaWFuY2U6YW9wYWxsaWFuY2U6amFyPC9leGNsdWRlPgotICAgICAgICAgICAgICAgICA8ZXhjbHVkZT5vcmcuYXBhY2hlLmFjdGl2ZW1xOmFwYWNoZS1hY3RpdmVtcTpqYXI8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgIDxleGNsdWRlPmF2YWxvbi1mcmFtZXdvcms6YXZhbG9uLWZyYW1ld29yazpqYXI8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgIDxleGNsdWRlPmF4aXM6YXhpczpqYXI8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgIDxleGNsdWRlPmJzZjpic2Y6amFyPC9leGNsdWRlPgotICAgICAgICAgICAgICAgICA8ZXhjbHVkZT5jb21tb25zLWJlYW51dGlsczpjb21tb25zLWJlYW51dGlsczpqYXI8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgIDxleGNsdWRlPmNvbW1vbnMtY29sbGVjdGlvbnM6Y29tbW9ucy1jb2xsZWN0aW9uczpqYXI8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgIDxleGNsdWRlPmNvbW1vbnMtcG9vbDpjb21tb25zLXBvb2w6amFyPC9leGNsdWRlPgotICAgICAgICAgICAgICAgICA8ZXhjbHVkZT5kb200ajpkb200ajpqYXI8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgIDxleGNsdWRlPmNvbS5zdW4ueG1sLmZhc3RpbmZvc2V0OkZhc3RJbmZvc2V0OmphcjwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+YWN0aXZlc29hcDpqYXhwLWFwaTpqYXI8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgIDxleGNsdWRlPnJoaW5vOmpzOmphcjwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+anVuaXQ6anVuaXQ6amFyPC9leGNsdWRlPgotICAgICAgICAgICAgICAgICA8ZXhjbHVkZT5qYXZheC5zZXJ2bGV0OnNlcnZsZXQtYXBpPC9leGNsdWRlPgotICAgICAgICAgICAgICAgICA8ZXhjbHVkZT5vcmcubW9ydGJheS5qZXR0eTpzZXJ2bGV0LWFwaS0yLjU6amFyOjYuMC4xPC9leGNsdWRlPgotICAgICAgICAgICAgPC9leGNsdWRlcz4KLSAgICAgICAgPC9kZXBlbmRlbmN5U2V0PgotICAgICAgPC9kZXBlbmRlbmN5U2V0cz4KLTwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kaXN0cmlidXRpb24vc3JjL21haW4vYXNzZW1ibHkvZG9jLWFzc2VtYmx5LnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2Rpc3RyaWJ1dGlvbi9zcmMvbWFpbi9hc3NlbWJseS9kb2MtYXNzZW1ibHkueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDUxOWZiLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2Rpc3RyaWJ1dGlvbi9zcmMvbWFpbi9hc3NlbWJseS9kb2MtYXNzZW1ibHkueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08YXNzZW1ibHk+Ci0gICAgPGlkPmRvY3M8L2lkPgotICAgIDxpbmNsdWRlQmFzZURpcmVjdG9yeT50cnVlPC9pbmNsdWRlQmFzZURpcmVjdG9yeT4gCi0gICAgPGJhc2VEaXJlY3Rvcnk+YXhpczItJHt2ZXJzaW9ufTwvYmFzZURpcmVjdG9yeT4KLSAgICA8Zm9ybWF0cz4KLQk8IS0tPGZvcm1hdD50YXIuZ3o8L2Zvcm1hdD4gIC8vdW5jb21tZW50LGlmIHRhci5neiBhcmNoaXZlIG5lZWRlZC0tPgotICAgICAgICA8Zm9ybWF0PnppcDwvZm9ybWF0PgotICAgIDwvZm9ybWF0cz4KLQotICAgIDxmaWxlU2V0cz4KLSAgICAgICAgPGZpbGVTZXQ+Ci0gICAgICAgICAgICA8ZGlyZWN0b3J5PnRhcmdldC90bXAtZG9jLWRpc3Ryby94ZG9jczwvZGlyZWN0b3J5PgotICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT5kb2NzL3hkb2NzPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgICA8ZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1ZGU+LnN2bi8qKjwvZXhjbHVkZT4KLSAgICAgICAgICAgIDwvZXhjbHVkZXM+Ci0gICAgICAgIDwvZmlsZVNldD4KLSAgICAgICAgPGZpbGVTZXQ+Ci0gICAgICAgICAgICA8ZGlyZWN0b3J5Pi4uLy4uL21vZHVsZXMvZG9jdW1lbnRhdGlvbi90YXJnZXQvYXBpZG9jczwvZGlyZWN0b3J5PgotICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT5kb2NzL2phdmFkb2NzPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgICA8ZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1ZGU+LnN2bi8qKjwvZXhjbHVkZT4KLSAgICAgICAgICAgIDwvZXhjbHVkZXM+Ci0gICAgICAgIDwvZmlsZVNldD4KLSAgICAgICAgPGZpbGVTZXQ+Ci0gICAgICAgICAgICA8ZGlyZWN0b3J5PnRhcmdldC90bXAtZG9jLWRpc3Ryby9kb2NzPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PmRvY3M8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZT5MSUNFTlNFLnR4dDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZT5SRUFETUUudHh0PC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlPnJlbGVhc2Utbm90ZXMuaHRtbDwvaW5jbHVkZT4KLSAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgIDwvZmlsZVNldD4KLSAgICAgICAgPGZpbGVTZXQ+Ci0gICAgICAgICAgICA8ZGlyZWN0b3J5PnRhcmdldC90bXAtZG9jLWRpc3Ryby9kb2NzPC9kaXJlY3Rvcnk+Ci0JICAgIDxvdXRwdXREaXJlY3Rvcnk+PC9vdXRwdXREaXJlY3Rvcnk+Ci0JICAgIDxpbmNsdWRlcz4KLQkgICAgICAgPGluY2x1ZGU+UkVBRE1FLWRvY3MudHh0PC9pbmNsdWRlPgotCSAgICA8L2luY2x1ZGVzPgotCTwvZmlsZVNldD4KLSAgICA8L2ZpbGVTZXRzPgotPC9hc3NlbWJseT4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2Rpc3RyaWJ1dGlvbi9zcmMvbWFpbi9hc3NlbWJseS9zcmMtYXNzZW1ibHkueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvZGlzdHJpYnV0aW9uL3NyYy9tYWluL2Fzc2VtYmx5L3NyYy1hc3NlbWJseS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY4MjVkMWQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZGlzdHJpYnV0aW9uL3NyYy9tYWluL2Fzc2VtYmx5L3NyYy1hc3NlbWJseS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08YXNzZW1ibHk+Ci0gICAgPGlkPnNyYzwvaWQ+Ci0gICAgPGluY2x1ZGVCYXNlRGlyZWN0b3J5PnRydWU8L2luY2x1ZGVCYXNlRGlyZWN0b3J5PiAKLSAgICA8YmFzZURpcmVjdG9yeT5heGlzMi0ke3ZlcnNpb259PC9iYXNlRGlyZWN0b3J5PgotICAgIDxmb3JtYXRzPgotCTwhLS08Zm9ybWF0PnRhci5nejwvZm9ybWF0PiAgLy91bmNvbW1lbnQsaWYgdGFyLmd6IGFyY2hpdmUgbmVlZGVkLS0+Ci0gICAgICAgIDxmb3JtYXQ+emlwPC9mb3JtYXQ+Ci0gICAgPC9mb3JtYXRzPgotCi0gICAgPGZpbGVTZXRzPgotICAgICAgICA8ZmlsZVNldD4KLSAgICAgICAgICAgIDxkaXJlY3Rvcnk+Li4vLi48L2RpcmVjdG9yeT4KLSAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+PC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGU+Li4vLi4vZXRjLyoqPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlPm1vZHVsZXMvKio8L2luY2x1ZGU+Ci0gICAgICAgICAgICA8L2luY2x1ZGVzPgotCi0JICAgIDxleGNsdWRlcz4KLQkJPGV4Y2x1ZGU+Li4vLi4vU2FtZVNlcnZpY2VBZGRpbmdUZXN0LmphdmE8L2V4Y2x1ZGU+Ci0JCTxleGNsdWRlPioqL3RhcmdldC8qKjwvZXhjbHVkZT4KLQkJPGV4Y2x1ZGU+Li4vLi4vbW9kdWxlcy9zYW1wbGVzL2V2ZW50aW5nLyoqPC9leGNsdWRlPgotCQk8ZXhjbHVkZT4uLi8uLi9tb2R1bGVzL3NhbXBsZXMvc2VjdXJpdHkvKio8L2V4Y2x1ZGU+Ci0JCTxleGNsdWRlPnhkb2NzLyoqPC9leGNsdWRlPgotCQk8IS0tIAotCQk8ZXhjbHVkZT4qKi8qY2xhc3MqLyoqPC9leGNsdWRlPiAKLQkJQWJvdmUgcHJldmVudHMgZm9sbG93aW5nIGNsYXNzIGJlaW5nIGNvcGllZC4KLQkJL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsYXNzbG9hZGVyL011bHRpUGFyZW50Q2xhc3NMb2FkZXIuamF2YQotCQktLT4KLQkJPGV4Y2x1ZGU+KiovLnN2bi8qKjwvZXhjbHVkZT4KLQkJPGV4Y2x1ZGU+KiovYmluLyoqPC9leGNsdWRlPgotCQk8ZXhjbHVkZT4qKi8qLmxvZzwvZXhjbHVkZT4KLQkJPCEtLQotCQk8ZXhjbHVkZT4qKi8uKjwvZXhjbHVkZT4KLQkJQWJvdmUgcHJldmVudHMgIi5jbGFzc3BhdGgiIGFuZCAiLnByb2plY3QiIGZyb20gYmVpbmcgY29waWVkIChzZWUKLQkJbW9kdWxlcy90b29sL2NvbmYvY29kZWdlbgotCQktLT4KLQkJPGV4Y2x1ZGU+KiovLnNldHRpbmdzLyoqPC9leGNsdWRlPgotCQk8ZXhjbHVkZT4qKi8qLmxpY2Vuc2U8L2V4Y2x1ZGU+Ci0JCTxleGNsdWRlPioqLyouaW1sPC9leGNsdWRlPgotCSAgICA8L2V4Y2x1ZGVzPgotCi0gICAgICAgIDwvZmlsZVNldD4KLQotCi0gICAgICAgIDxmaWxlU2V0PgotICAgICAgICAgICAgPGRpcmVjdG9yeT4uLi8uLi9ldGM8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+ZXRjPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGU+Ki4qPC9pbmNsdWRlPgotICAgICAgICAgICAgPC9pbmNsdWRlcz4KLQkgICAgPGV4Y2x1ZGVzPgotCQk8ZXhjbHVkZT4uc3ZuLyoqPC9leGNsdWRlPgotCSAgICA8L2V4Y2x1ZGVzPgotICAgICAgICA8L2ZpbGVTZXQ+Ci0gICAgICAgIDxmaWxlU2V0PgotICAgICAgICAgICAgPGRpcmVjdG9yeT50YXJnZXQvdG1wLWRvYy1kaXN0cm8vZG9jczwvZGlyZWN0b3J5PgotICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT48L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZT5OT1RJQ0UudHh0PC9pbmNsdWRlPgotICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgPC9maWxlU2V0PgotCi0gICAgICAgIDxmaWxlU2V0PgotICAgICAgICAgICAgPGRpcmVjdG9yeT50YXJnZXQvdG1wLWRvYy1kaXN0cm8vZG9jczwvZGlyZWN0b3J5PgotICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT48L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZT5MSUNFTlNFLnR4dDwvaW5jbHVkZT4KLSAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgIDwvZmlsZVNldD4KLQotICAgICAgICA8ZmlsZVNldD4KLSAgICAgICAgICAgIDxkaXJlY3Rvcnk+Li4vLi48L2RpcmVjdG9yeT4KLSAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+PC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGU+cHJvamVjdC54bWw8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGU+bWF2ZW4ueG1sPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlPnBvbS54bWw8L2luY2x1ZGU+Ci0gICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICA8L2ZpbGVTZXQ+Ci0JPCEtLSBjb3B5aW5nIHRvb2xzIHNlY3Rpb24gb2YgeGRvY3MuIFRoaXMgaXMgbmVlZGVkIGJ5IGVjbGlwc2UgcGx1Z2lucyAtLT4KLSAgICAgICAgPGZpbGVTZXQ+Ci0gICAgICAgICAgICA8ZGlyZWN0b3J5Pi4uLy4uL3hkb2NzPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5Pnhkb2NzPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGU+dG9vbHMvKio8L2luY2x1ZGU+Ci0gICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICA8L2ZpbGVTZXQ+Ci0JPCEtLSBjb3B5aW5nIGxpY2Vuc2VzIC0tPgotICAgICAgICA8ZmlsZVNldD4KLSAgICAgICAgICAgIDxkaXJlY3Rvcnk+Li4vLi4vbGVnYWw8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+bGVnYWw8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgIDxleGNsdWRlcz4KLSAgICAgICAgICAgICAgICA8ZXhjbHVkZT4uc3ZuLyoqPC9leGNsdWRlPgotICAgICAgICAgICAgPC9leGNsdWRlcz4KLSAgICAgICAgPC9maWxlU2V0PgotICAgIDwhLS0gY29weWluZyByZWxlYXNlIGRvY3MgLS0+Ci0gICAgICAgIDxmaWxlU2V0PgotICAgICAgICAgICAgIDxkaXJlY3Rvcnk+Li4vLi4vcmVsZWFzZS1kb2NzPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT5yZWxlYXNlLWRvY3M8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgICA8ZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgIDxleGNsdWRlPi5zdm4vKio8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgPC9leGNsdWRlcz4KLSAgICAgICAgIDwvZmlsZVNldD4gICAgCi0gICAgICAgIDxmaWxlU2V0PgotICAgICAgICAgICAgPGRpcmVjdG9yeT50YXJnZXQvdG1wLWRvYy1kaXN0cm8vZG9jczwvZGlyZWN0b3J5PgotICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT48L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZT5SRUFETUUtc3RkLXNyYy50eHQ8L2luY2x1ZGU+Ci0gICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICA8L2ZpbGVTZXQ+Ci0gICAgPC9maWxlU2V0cz4KLTwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kaXN0cmlidXRpb24vc3JjL21haW4vYXNzZW1ibHkvd2FyLWFzc2VtYmx5LnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2Rpc3RyaWJ1dGlvbi9zcmMvbWFpbi9hc3NlbWJseS93YXItYXNzZW1ibHkueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyMmUwY2RmLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2Rpc3RyaWJ1dGlvbi9zcmMvbWFpbi9hc3NlbWJseS93YXItYXNzZW1ibHkueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08YXNzZW1ibHk+Ci0gICAgPGlkPndhcjwvaWQ+Ci0gICAgPGluY2x1ZGVCYXNlRGlyZWN0b3J5PmZhbHNlPC9pbmNsdWRlQmFzZURpcmVjdG9yeT4KLSAgICA8Zm9ybWF0cz4KLSAgICAgICAgPGZvcm1hdD56aXA8L2Zvcm1hdD4KLSAgICA8L2Zvcm1hdHM+Ci0KLSAgPGZpbGVTZXRzPgotICAgIDxmaWxlU2V0PgotCQkJPGRpcmVjdG9yeT4uLi8uLi9tb2R1bGVzL3dlYmFwcC90YXJnZXQ8L2RpcmVjdG9yeT4KLQkJCTxvdXRwdXREaXJlY3Rvcnk+PC9vdXRwdXREaXJlY3Rvcnk+Ci0JCQk8aW5jbHVkZXM+Ci0JCQkJPGluY2x1ZGU+Ki53YXI8L2luY2x1ZGU+Ci0JCQk8L2luY2x1ZGVzPgotICAgIDwvZmlsZVNldD4KLQk8ZmlsZVNldD4KLQkJPGRpcmVjdG9yeT50YXJnZXQvdG1wLWRvYy1kaXN0cm8vZG9jczwvZGlyZWN0b3J5PgotCQk8b3V0cHV0RGlyZWN0b3J5Pjwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICA8aW5jbHVkZT5MSUNFTlNFLnR4dDwvaW5jbHVkZT4KLSAgICAgICAgICAgIDxpbmNsdWRlPk5PVElDRS50eHQ8L2luY2x1ZGU+Ci0gICAgICAgICAgICA8aW5jbHVkZT5SRUFETUUudHh0PC9pbmNsdWRlPgotICAgICAgICAgICAgPGluY2x1ZGU+cmVsZWFzZS1ub3Rlcy5odG1sPC9pbmNsdWRlPgotICAgICAgICA8L2luY2x1ZGVzPgotICAgIDwvZmlsZVNldD4KLSAgPC9maWxlU2V0cz4KLQk8bW9kdWxlU2V0cz4KLQkgIDxtb2R1bGVTZXQ+Ci0JCQk8aW5jbHVkZXM+PGluY2x1ZGU+b3JnLmFwYWNoZS5heGlzMjp3ZWJhcHA8L2luY2x1ZGU+PC9pbmNsdWRlcz4KLQkgIDwvbW9kdWxlU2V0PgotCTwvbW9kdWxlU2V0cz4KLTwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3BvbS54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2ZTU3YTAuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDg2ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHByb2plY3QKLSAgICAgICAgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIKLSAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+MS41LjE8L3ZlcnNpb24+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+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmFudDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmFudDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYmNlbDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmJjZWw8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5jb21tb25zLWxvZ2dpbmc8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWxvZ2dpbmc8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5jb21tb25zLWNvZGVjPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1jb2RlYzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPiR7c3RheC5pbXBsLmdyb3VwaWR9PC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+JHtzdGF4LmltcGwuYXJ0aWZhY3R9PC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5nZXJvbmltby5zcGVjczwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmdlcm9uaW1vLWFjdGl2YXRpb25fMS4xX3NwZWM8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmdlcm9uaW1vLnNwZWNzPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+Z2Vyb25pbW8tamF2YW1haWxfMS40X3NwZWM8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmdlcm9uaW1vLnNwZWNzPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+Z2Vyb25pbW8tYW5ub3RhdGlvbl8xLjBfc3BlYzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmpheGVuPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF4ZW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5jb21tb25zLWh0dHBjbGllbnQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWh0dHBjbGllbnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmh0dHBjb21wb25lbnRzPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+aHR0cGNvcmU8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5jb21tb25zLWZpbGV1cGxvYWQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWZpbGV1cGxvYWQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD53c2RsNGo8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD53c2RsNGo8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLndvZGVuPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+d29kZW4tYXBpPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLnhtbGJlYW5zPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+eG1sYmVhbnM8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5sb2c0ajwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmxvZzRqPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+cmhpbm88L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5qczwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmJzZjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmJzZjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmphbG9weTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmphbG9weTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmxvZzRqPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bG9nNGo8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLndvZGVuPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+d29kZW4taW1wbC1kb208L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3dvZGVuLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPGV4Y2x1c2lvbnM+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+eGVyY2VzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD54ZXJjZXNJbXBsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPnhtbC1hcGlzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD54bWwtYXBpczwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgIDwvZXhjbHVzaW9ucz4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmphdmF4LnNlcnZsZXQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5zZXJ2bGV0LWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5pZ25pdGVyZWFsdGltZTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnNtYWNrPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1sYW5nPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1sYW5nPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+eG1sLXJlc29sdmVyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+eG1sLXJlc29sdmVyPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPC9kZXBlbmRlbmNpZXM+Ci0KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc2l0ZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4ZG9jRGlyZWN0b3J5PiR7YmFzZWRpcn0veGRvY3M8L3hkb2NEaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgICAgIDxyZXNvdXJjZXNEaXJlY3Rvcnk+JHtiYXNlZGlyfS94ZG9jcy9yZXNvdXJjZXM8L3Jlc291cmNlc0RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+aW5zdGFsbDwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+c2l0ZTwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYW50cnVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke21hdmVuLmFudHJ1bi52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+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+Ci0gICAgPC9wcm9maWxlcz4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24vc3JjL3NpdGUvc2l0ZS54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3NyYy9zaXRlL3NpdGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYmU2NWFlLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24vc3JjL3NpdGUvc2l0ZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIj8+Ci08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxwcm9qZWN0IG5hbWU9IkFwYWNoZSBBeGlzMiI+Ci0gIDxiYW5uZXJMZWZ0PgotICAgIDxuYW1lPkFwYWNoZSBBeGlzMjwvbmFtZT4KLSAgICA8c3JjPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9pbWFnZXMvYXNmX2xvZ29fd2lkZS5wbmc8L3NyYz4KLSAgICA8aHJlZj5odHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi88L2hyZWY+Ci0gIDwvYmFubmVyTGVmdD4KLSAgPGJhbm5lclJpZ2h0PgotICAgIDxzcmM+aHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvaW1hZ2VzL2F4aXMuanBnPC9zcmM+Ci0gIDwvYmFubmVyUmlnaHQ+Ci0gIDxib2R5PgotCQk8bGlua3M+Ci0JCQk8aXRlbSBuYW1lPSJBeGlzMi9KYXZhIiBocmVmPSJpbmRleC5odG1sIiAvPgotCQkJPGl0ZW0gbmFtZT0iQXhpczIvQyIgaHJlZj0iaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvYyIgLz4KLQkJCTxpdGVtIG5hbWU9IkFwYWNoZSBXUyIgaHJlZj0iaHR0cDovL3dzLmFwYWNoZS5vcmciIC8+Ci0JCQk8aXRlbSBuYW1lPSJBcGFjaGUJIiBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmciIC8+Ci0JCTwvbGlua3M+Ci0KLQkJPG1lbnUgbmFtZT0iQXhpczIvSmF2YSI+Ci0JCQk8aXRlbSBuYW1lPSJIb21lIiBocmVmPSJpbmRleC5odG1sIiAvPgotCQk8L21lbnU+Ci0JCTxtZW51IG5hbWU9IkRvd25sb2FkcyI+Ci0JCQk8aXRlbSBuYW1lPSJSZWxlYXNlcyIgaHJlZj0iZG93bmxvYWQuY2dpIiAvPgotCQkJPGl0ZW0gbmFtZT0iTW9kdWxlcyIgaHJlZj0ibW9kdWxlcy9pbmRleC5odG1sIiAvPgotCQkJPGl0ZW0gbmFtZT0iVG9vbHMiIGhyZWY9InRvb2xzL2luZGV4Lmh0bWwiIC8+Ci0JCTwvbWVudT4KLQkJPG1lbnUgbmFtZT0iRG9jdW1lbnRhdGlvbiI+Ci0JCQk8aXRlbSBuYW1lPSJWZXJzaW9uIDEuNSIgaHJlZj0iL0BheGlzMl92ZXJzaW9uX2RpckAvY29udGVudHMuaHRtbCIgPgotCQkJICAgPGl0ZW0gbmFtZT0iVGFibGUgb2YgQ29udGVudHMiIGhyZWY9IkBheGlzMl92ZXJzaW9uX2RpckAvdG9jLmh0bWwiIC8+Ci0JCQkgICA8aXRlbSBuYW1lPSJJbnN0YWxsYXRpb24gR3VpZGUiIGhyZWY9IkBheGlzMl92ZXJzaW9uX2RpckAvaW5zdGFsbGF0aW9uZ3VpZGUuaHRtbCIgLz4KLQkJCSAgIDxpdGVtIG5hbWU9IlF1aWNrU3RhcnQgR3VpZGUiIGhyZWY9IkBheGlzMl92ZXJzaW9uX2RpckAvcXVpY2tzdGFydGd1aWRlLmh0bWwiIC8+Ci0JCQkgICA8aXRlbSBuYW1lPSJVc2VyIEd1aWRlIiBocmVmPSJAYXhpczJfdmVyc2lvbl9kaXJAL3VzZXJndWlkZS5odG1sIiAvPgotCQkJICAgPGl0ZW0gbmFtZT0iSkFYV1MgR3VpZGUiIGhyZWY9IkBheGlzMl92ZXJzaW9uX2RpckAvamF4d3MtZ3VpZGUuaHRtbCIgLz4KLQkJCSAgIDxpdGVtIG5hbWU9IlBPSk8gR3VpZGUiIGhyZWY9IkBheGlzMl92ZXJzaW9uX2RpckAvcG9qb2d1aWRlLmh0bWwiIC8+Ci0JCQkgICA8aXRlbSBuYW1lPSJTcHJpbmcgR3VpZGUiIGhyZWY9IkBheGlzMl92ZXJzaW9uX2RpckAvc3ByaW5nLmh0bWwiIC8+Ci0JCQkgICA8aXRlbSBuYW1lPSJXZWIgQWRtaW5pc3RyYXRvcidzIEd1aWRlIiBocmVmPSJAYXhpczJfdmVyc2lvbl9kaXJAL3dlYmFkbWluZ3VpZGUuaHRtbCIgLz4KLQkJCSAgIDxpdGVtIG5hbWU9Ik1pZ3JhdGlvbiBHdWlkZSAoZnJvbSBBeGlzMSkiIGhyZWY9IkBheGlzMl92ZXJzaW9uX2RpckAvbWlncmF0aW9uLmh0bWwiIC8+Ci0JCQk8L2l0ZW0+Ci0gICAgICAgICAgICA8aXRlbSBuYW1lPSJWZXJzaW9uIDEuNC4xIiBocmVmPSIvMV80XzEvY29udGVudHMuaHRtbCIvPgotICAgICAgICAgICAgPGl0ZW0gbmFtZT0iVmVyc2lvbiAxLjQiIGhyZWY9Ii8xXzQvY29udGVudHMuaHRtbCIvPgotICAgICAgPGl0ZW0gbmFtZT0iVmVyc2lvbiAxLjMiIGhyZWY9Ii8xXzMvY29udGVudHMuaHRtbCIgLz4KLSAgICAgIDxpdGVtIG5hbWU9IlZlcnNpb24gMS4yIiBocmVmPSIvMV8yL2NvbnRlbnRzLmh0bWwiIC8+Ci0JCQk8aXRlbSBuYW1lPSJWZXJzaW9uIDEuMS4xIiBocmVmPSIvMV8xXzEvY29udGVudHMuaHRtbCIgLz4KLQkJCTxpdGVtIG5hbWU9IlZlcnNpb24gMS4xIiBocmVmPSIvMV8xL2NvbnRlbnRzLmh0bWwiIC8+Ci0JCQk8aXRlbSBuYW1lPSJWZXJzaW9uIDEuMCIgaHJlZj0iLzFfMC9pbmRleC5odG1sIiAvPgotCQkJPGl0ZW0gbmFtZT0iVmVyc2lvbiAwLjk1IiBocmVmPSIvMF85NS9pbmRleC5odG1sIiAvPgotCQkJPGl0ZW0gbmFtZT0iVmVyc2lvbiAwLjk0IiBocmVmPSIvMF85NC9pbmRleC5odG1sIiAvPgotCQkJPGl0ZW0gbmFtZT0iVmVyc2lvbiAwLjkzIiBocmVmPSIvMF85My9pbmRleC5odG1sIiAvPgotCQk8L21lbnU+Ci0JCTxtZW51IG5hbWU9IlJlc291cmNlcyI+Ci0JCTxpdGVtIG5hbWU9IkZBUSIgaHJlZj0iZmFxLmh0bWwiIC8+Ci0JCTxpdGVtIG5hbWU9IkFydGljbGVzIiBocmVmPSJhcnRpY2xlcy5odG1sIiAvPgotCQk8aXRlbSBuYW1lPSJXaWtpIiBocmVmPSJodHRwOi8vd2lraS5hcGFjaGUub3JnL3dzL0Zyb250UGFnZS9BeGlzMi8iIC8+Ci0JCQk8aXRlbSBuYW1lPSJSZWZlcmVuY2UgTGlicmFyeSIgaHJlZj0icmVmTGliLmh0bWwiIC8+Ci0JCQk8aXRlbSBuYW1lPSJPbmxpbmUgSmF2YSBEb2NzIiBocmVmPSJAYXhpczJfdmVyc2lvbl9kaXJAL2FwaS9pbmRleC5odG1sIiAvPgotCQk8L21lbnU+Ci0JCTxtZW51IG5hbWU9IkdldCBJbnZvbHZlZCIgaHJlZj0ib3ZlcnZpZXcuaHRtbCI+Ci0JCTxpdGVtIG5hbWU9Ik92ZXJ2aWV3IiBocmVmPSJvdmVydmlldy5odG1sIiAvPgotCQkJPGl0ZW0gbmFtZT0iQ2hlY2tvdXQgdGhlIFNvdXJjZSIgaHJlZj0ic3ZuLmh0bWwiIC8+Ci0JCSA8aXRlbSBuYW1lPSJNYWlsaW5nIExpc3RzIiBocmVmPSJtYWlsLWxpc3RzLmh0bWwiIC8+Ci0gICAgICAgICA8aXRlbSBuYW1lPSJSZWxlYXNlIFByb2Nlc3MiIGhyZWY9InJlbGVhc2UtcHJvY2Vzcy5odG1sIi8+Ci0gICAgICAgICAgICA8aXRlbSBuYW1lPSJEZXZlbG9wZXIgR3VpZGVsaW5lcyIgaHJlZj0iZ3VpZGVsaW5lcy5odG1sIiAvPgotCQkJPGl0ZW0gbmFtZT0iQnVpbGQgdGhlIFNpdGUiIGhyZWY9InNpdGVIb3dUby5odG1sIiAvPgkKLQkJPC9tZW51PgotCQk8bWVudSBuYW1lPSJQcm9qZWN0IEluZm9ybWF0aW9uIj4KLQkJCTxpdGVtIG5hbWU9IlByb2plY3QgVGVhbSIgaHJlZj0idGVhbS1saXN0Lmh0bWwiIC8+Ci0JCQkJPGl0ZW0gbmFtZT0iSXNzdWUgVHJhY2tpbmciIGhyZWY9Imlzc3VlLXRyYWNraW5nLmh0bWwiIC8+Ci0JCQk8aXRlbSBuYW1lPSJTb3VyY2UgQ29kZSIKLQkJCQlocmVmPSJodHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld2N2cy5jZ2kvd2Vic2VydmljZXMvYXhpczIvdHJ1bmsvP3Jvb3Q9QXBhY2hlLVNWTiIgLz4KLQkJCTxpdGVtIG5hbWU9IkFja25vd2xlZGdlbWVudHMiIGhyZWY9InRoYW5rcy5odG1sIiAvPgotCQkJPGl0ZW0gbmFtZT0iTGljZW5zZSIKLQkJCQlocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAuaHRtbCIgLz4KLQkJPC9tZW51PgotCi0gIDwvYm9keT4KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvQXhpczItcnBjLXN1cHBvcnQueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL0F4aXMyLXJwYy1zdXBwb3J0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDczYzk5My4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvQXhpczItcnBjLXN1cHBvcnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjg4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotDQotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiINCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPg0KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4NCi08aGVhZD4NCi08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9DQotIkhUTUwgVGlkeSBmb3IgV2luZG93cyAodmVycyAxNCBKdW5lIDIwMDcpLCBzZWUgd3d3LnczLm9yZyIgLz4NCi08bWV0YSBodHRwLWVxdWl2PSJjb250ZW50LXR5cGUiIGNvbnRlbnQ9IiIgLz4NCi08dGl0bGU+QXhpczIgUlBDIFN1cHBvcnQ8L3RpdGxlPg0KLTxsaW5rIGhyZWY9Ii4uL2Nzcy9heGlzLWRvY3MuY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIg0KLW1lZGlhPSJhbGwiIC8+DQotPC9oZWFkPg0KLTxib2R5Pg0KLTxoMT5BeGlzMiBSUEMgU3VwcG9ydDwvaDE+DQotPHA+VGhpcyBkb2N1bWVudCBkZXNjcmliZXMgQXhpczIncyBSZW1vdGUgUHJvY2VkdXJlIENhbGwgc3VwcG9ydCBpbg0KLWEgc2V0IG9mIGVhc3kgdG8gdW5kZXJzdGFuZCBpbXBsZW1lbnRhdGlvbiBzdGVwcy48L3A+DQotPGgyPkludHJvZHVjdGlvbjwvaDI+DQotPHA+QXhpczIgUmVtb3RlIFByb2NlZHVyZSBDYWxsIChSUEMpIHN1cHBvcnQgbWF5IHNlZW0gc29tZXdoYXQNCi10cmlja3kgYW5kIGNvbmZ1c2luZyBhdCBmaXJzdCBnbGFuY2UuIEhvd2V2ZXIsIEF4aXMyIFJQQyBzdHJhdGVneQ0KLWlzIGJhc2VkIG9uIGEgc2V0IG9mIHdlbGwgZGVmaW5lZCBydWxlcy4gVGhpcyBkb2N1bWVudCBhaW1zIHRvDQotZHJpbGwgZG93biB0byB0aGUgZGV0YWlscyBvZiB0aGUgc3RyYXRlZ3kgYW5kIHJlc29sdmUgbW9zdCBvZiB0aGUNCi11bmtub3duIGJpdHMgYW5kIHBpZWNlcy4gTm90ZSB0aGF0IEF4aXMyIGN1cnJlbnRseSBkb2VzIG5vdCBzdXBwb3J0DQotdGhlIHJwYy9lbmNvZGVkIHN0eWxlLiBCdXQgaXQgZnVsbHkgc3VwcG9ydHMgdGhlIHJwYy9saXRlcmFsIA0KLXN0eWxlLjwvcD4NCi08cD5XZSB3aWxsIGRpc2N1c3MgdGhlIEF4aXMyIFJQQyBzdHJhdGVneSBpbiB0aGUgZm9sbG93aW5nDQotc3RlcHM8L3A+DQotPGgyPlN0ZXAgMSAtIENvbnZlcnRpbmcgUlBDIFN0eWxlIFdTREwncyBpbnRvIERvYy9MaXQgU3R5bGUNCi1XU0RMPC9oMj4NCi08cD5UaGlzIGlzIHByb2JhYmx5IHRoZSBtb3N0IGNvbmZ1c2luZyBwYXJ0IG9mIHRoZSBSUEMgc3RyYXRlZ3kuDQotU2luY2UgdGhlIEF4aXMyIGNvZGUgZ2VuZXJhdG9yIGlzIGJhc2VkIG9uIHB1cmUgZG9jL2xpdCBzdHlsZSwgdGhlDQotZmlyc3Qgc3RlcCBvZiB0aGUgY29kZSBnZW5lcmF0aW9uIHByb2Nlc3MgaXMgdG8gZ2VuZXJhdGUgYSB3cmFwcGVyDQotc2NoZW1hLiBUaGlzIHdyYXBwZXIgZ2VuZXJhdGlvbiBjYW4gYmUgZWFzaWx5IGV4cGxhaW5lZCBieSB1c2luZyBhbg0KLWV4YW1wbGUuPC9wPg0KLTxwPlRha2UgdGhlIGZvbGxvd2luZyBwaWVjZSBvZiBXU0RMPC9wPg0KLTxwcmU+DQotIC4uLi4uDQotICAgICZsdDttZXNzYWdlIG5hbWU9InJlcXVlc3RNZXNzYWdlIiZndDsNCi0gICAgICAgICAgICAgICAgJmx0O3BhcnQgbmFtZT0icGFydDEiIHR5cGU9InhzOnN0cmluZyIvJmd0Ow0KLSAgICAgICAgICAgICAgICAmbHQ7cGFydCBuYW1lPSJwYXJ0MiIgdHlwZT0ieHM6aW50Ii8mZ3Q7DQotICAgICAgICAmbHQ7L21lc3NhZ2UmZ3Q7DQotICAgICAgICAmbHQ7bWVzc2FnZSBuYW1lPSJyZXNwb25zZU1lc3NhZ2UiJmd0Ow0KLSAgICAgICAgICAgICAgICAmbHQ7cGFydCBuYW1lPSJwYXJ0MSIgdHlwZT0ieHM6c3RyaW5nIi8mZ3Q7DQotICAgICAgICAmbHQ7L21lc3NhZ2UmZ3Q7DQotICAgICAgICAmbHQ7cG9ydFR5cGUgbmFtZT0iZWNob1BvcnRUeXBlIiZndDsNCi0gICAgICAgICAgICAgICAgJmx0O29wZXJhdGlvbiBuYW1lPSJlY2hvIiZndDsNCi0gICAgICAgICAgICAgICAgICAgICAgICAmbHQ7aW5wdXQgbWVzc2FnZT0ieTpyZXF1ZXN0TWVzc2FnZSIvJmd0Ow0KLSAgICAgICAgICAgICAgICAgICAgICAgICZsdDtvdXRwdXQgbWVzc2FnZT0ieTpyZXNwb25zZU1lc3NhZ2UiLyZndDsNCi0gICAgICAgICAgICAgICAgJmx0Oy9vcGVyYXRpb24mZ3Q7DQotICAgICAgICAmbHQ7L3BvcnRUeXBlJmd0Ow0KLSAgICAgICAgJmx0O2JpbmRpbmcgbmFtZT0iZWNob0JpbmRpbmciIHR5cGU9Ink6ZWNob1BvcnRUeXBlIiZndDsNCi0gICAgICAgICAgICAgICAgJmx0O3NvYXA6YmluZGluZyBzdHlsZT0icnBjIiB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIvJmd0Ow0KLSAgICAgICAgICAgICAgICAmbHQ7b3BlcmF0aW9uIG5hbWU9ImVjaG8iJmd0Ow0KLSAgICAgICAgICAgICAgICAgICAgICAgICZsdDtzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJlY2hvIi8mZ3Q7DQotICAgICAgICAgICAgICAgICAgICAgICAgJmx0O2lucHV0Jmd0Ow0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmx0O3NvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLyZndDsNCi0gICAgICAgICAgICAgICAgICAgICAgICAmbHQ7L2lucHV0Jmd0Ow0KLSAgICAgICAgICAgICAgICAgICAgICAgICZsdDtvdXRwdXQmZ3Q7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbHQ7c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvJmd0Ow0KLSAgICAgICAgICAgICAgICAgICAgICAgICZsdDsvb3V0cHV0Jmd0Ow0KLSAgICAgICAgICAgICAgICAmbHQ7L29wZXJhdGlvbiZndDsNCi0gICAgICAgICZsdDsvYmluZGluZyZndDsNCi0uLi4uLg0KLTwvcHJlPg0KLTxwPlRoZSBiaW5kaW5nIHNheXMgcnBjL2xpdCBpcyByZXF1aXJlZCBhbmQgaW4gdGhpcyBjYXNlIHRoZQ0KLW1lc3NhZ2UgcGFydHMgd2lsbCBuZWVkIHdyYXBwaW5nIGluIHRoZSBmb2xsb3dpbmcgb3JkZXI6PC9wPg0KLTxvbD4NCi08bGk+VGhlIGZpcnN0IGVsZW1lbnQgbmVlZHMgdG8gaGF2ZSB0aGUgb3BlcmF0aW9uIG5hbWUgYXMgdGhlIGxvY2FsDQotbmFtZSBhbmQgdGhlIG9wZXJhdGlvbiBuYW1lc3BhY2UuIChUaGlzIGhhcHBlbnMgdG8gYmUgdGhlIG5hbWVzcGFjZQ0KLW9mIHRoZSBwb3J0dHlwZSAtIGluIHRoaXMgY2FzZSB0aGUgdGFyZ2V0bmFtZXNwYWNlIG9mIHRoZQ0KLVdTREwuKTwvbGk+DQotPGxpPlRoZSBjaGlsZHJlbiBvZiB0aGlzIGVsZW1lbnQgYXJlIG5vbiBuYW1lc3BhY2UgcXVhbGlmaWVkDQotZWxlbWVudHMgd2l0aCB0aGUgcGFydCBuYW1lcyBhcyBsb2NhbCBuYW1lcyAocmVmZXJyZWQgdG8gYXMNCi08c3Ryb25nPnBhcnQgZWxlbWVudDwvc3Ryb25nPik8L2xpPg0KLTxsaT5JbiBjYXNlIHRoZSBwYXJ0IHJlZmVycyB0byBhIHN0YW5kYXJkIHR5cGUgbGlrZSB0aGUgZXhhbXBsZQ0KLVdTREwsIHRoZSBjb250ZW50IG9mIHRoZSBwYXJ0IGVsZW1lbnQgd291bGQgYmUgb2YgdGhhdCB0eXBlLiBJZiB0aGUNCi1wYXJ0IHJlZmVycyB0byBhIGNvbXBsZXggdHlwZSBkZWZpbmVkIGluIHRoZSBzY2hlbWEsIHRoZSBjb250ZW50IG9mDQotdGhlIHBhcnQgZWxlbWVudCBiZWNvbWVzIG9mIHRoYXQgdHlwZS4gSGF2aW5nIGFuIGVsZW1lbnQgcmVmZXJlbmNlDQotaW4gdGhlIHBhcnQgd2hlbiB0aGUgYmluZGluZyBpcyBycGMgaXMgaW52YWxpZC48L2xpPg0KLTwvb2w+DQotPHA+Rm9yIGV4YW1wbGUsIHRoZSBpbnB1dCB3aXJlIG1lc3NhZ2UgZm9yIHRoZSBlY2hvIG9wZXJhdGlvbg0KLW1lbnRpb25lZCBpbiB0aGUgYWJvdmUgV1NETCBmcmFnbWVudCB3b3VsZCBsb29rIGxpa2UgdGhpczo8L3A+DQotPHByZT4NCi0gJmx0O29wOjxzdHJvbmc+ZWNobzwvc3Ryb25nPiB4bWxuczpvcD0icG9ydHR5cGUgbmFtZXNwYWNlIiZndDsNCi0gICZsdDs8c3Ryb25nPnBhcnQxPC9zdHJvbmc+Jmd0O0hlbGxvIFdvcmxkJmx0Oy9wYXJ0MSZndDsNCi0gICZsdDs8c3Ryb25nPnBhcnQyPC9zdHJvbmc+Jmd0OzEyMyZsdDsvcGFydDImZ3Q7DQotICZsdDsvb3A6ZWNobyZndDsNCi08L3ByZT4NCi08cD5Ob3RlIHRoYXQgdGhlIGVsZW1lbnQgbmFtZSBpcyBpbiBib2xkLiBUaGUgZmlyc3Qgb25lIGlzIHRoZQ0KLW9wZXJhdGlvbiBuYW1lLCB0aGUgc2Vjb25kIGFuZCB0aGlyZCBhcmUgcGFydCBuYW1lcy4gSXQgY2FuIGJlIHNlZW4NCi10aGF0IGl0IGlzIHBvc3NpYmxlIHRvIGdlbmVyYXRlIGEgc2NoZW1hIHJlcHJlc2VudGluZyB0aGlzDQotc3RydWN0dXJlLCBhbmQgdGhlbiB0cmVhdCB0aGUgd2hvbGUgc2VydmljZSBhcyBhIHB1cmUgZG9jL2xpdA0KLXNlcnZpY2UuIEluIHRoaXMgY2FzZSwgdGhlIGZvbGxvd2luZyBwaWVjZSBvZiBzY2hlbWEgaXMgZ2VuZXJhdGVkDQotdG8gbWFrZSB0aGUgcnBjIHRvIGRvYyBjb252ZXJzaW9uLiBOb3RlIHRoYXQgaW4gdGhpcyBjYXNlIHRoZSB3aXJlDQotbWVzc2FnZSBzdGF5cyB1bmNoYW5nZWQuIEl0IGlzIG9ubHkgYSBkaWZmZXJlbnQgV1NETCBhdXRob3JpbmcNCi1zdHlsZTwvcD4NCi08cHJlPg0KLSAmbHQ7eHM6ZWxlbWVudCBuYW1lPSJlY2hvIiZndDsNCi0gICAgJmx0O3hzOmNvbXBsZXhUeXBlJmd0Ow0KLSAgICAgICZsdDt4czpzZXF1ZW5jZSZndDsNCi0gICAgICAgICAgICAgICAgJmx0O3hzOmVsZW1lbnQgbmFtZT0icGFydDEiIHR5cGU9InhzOnN0cmluZyIgLyZndDsgDQotICAgICAgICAgICAgICAgICZsdDt4czplbGVtZW50IG5hbWU9InBhcnQyIiB0eXBlPSJ4czppbnQiIC8mZ3Q7IA0KLSAgICAgICAgICAgJmx0Oy94czpzZXF1ZW5jZSZndDsgICAgDQotICAgICZsdDsveHM6Y29tcGxleFR5cGUmZ3Q7DQotICZsdDsveHM6ZWxlbWVudCZndDsNCi08L3ByZT4NCi08cD5XaGF0IHRoZSBBeGlzMiBjb2RlIGdlbmVyYXRvciBkb2VzIGlzIGV4YWN0bHkgdGhpcy4gQnkgbG9va2luZw0KLWF0IHRoZSBiaW5kaW5nIHN0eWxlLCBpdCBnZW5lcmF0ZXMgYSB3cmFwcGVyIHNjaGVtYSBpbiBwbGFjZXMNCi1yZXF1aXJlZCBiZWZvcmUgaGFuZGluZyBvdmVyIHRoZSBBeGlzKiBoaWVyYXJjaHkgdG8gdGhlIGNvZGUNCi1nZW5lcmF0b3IgZW5naW5lLiBJbiBldmVyeSBjYXNlIChldmVuIHdoZW4gdGhlIHNjaGVtYSBuZWVkcyB0byBiZQ0KLXVud3JhcHBlZCkgdGhpcyB3cmFwcGluZyBwYXJ0IHdpbGwgdGFrZSBwbGFjZSE8L3A+DQotPGgyPlN0ZXAgMiAtIFVud3JhcHBpbmcgdGhlIFNjaGVtYTwvaDI+DQotPHA+SWYgdGhlIHNjaGVtYSBuZWVkcyB0byBiZSB1bndyYXBwZWQsIGl0IGJyaW5ncyB1cCBhIGZldyBpc3N1ZXMuDQotVGhpcyBpcyBtYWlubHkgYmVjYXVzZSB0aGUgb25seSB0aGluZyB0aGF0IHRoZSBlbWl0dGVycyByZWx5IG9uDQotd2hlbiBnZW5lcmF0aW5nIGNvZGUgaXMgYSBtYXBwaW5nIHRhYmxlLjwvcD4NCi08b2w+DQotPGxpPldoZW4gdGhlIHNjaGVtYSBpcyB1bndyYXBwZWQsIHdoZXJlIHdpbGwgdGhlIHVud3JhcHBpbmcNCi1pbmZvcm1hdGlvbiByZW1haW4/DQotPHA+VGhlcmUgaGFzIHRvIGJlIGEgc3RvcmUgdG8ga2VlcCB0aGUgaW5mb3JtYXRpb24gc2VwZXJhdGVkLiBUaGUNCi1BeGlzICogaGllcmFyY2h5IGNhbiBiZSB1c2VkIGZvciB0aGlzLiBJdCBoYXMgbmljZWx5IHNlcGFyYXRlZA0KLWluZm9ybWF0aW9uIGhvbGRlcnMgYW5kIGEgcGFyYW1ldGVyIHN0b3JlIHRoYXQgY2FuIGhvbGQgYW4NCi1pbmZvcm1hdGlvbiBiZWFuLjwvcD4NCi08L2xpPg0KLTxsaT5Ib3cgZG8gd2UgbWFpbnRhaW4gdW5pcXVlbmVzcyBhbW9uZyBtZXNzYWdlIHBhcnQgbmFtZXM/DQotPHA+UGFydCBuYW1lcyBhcmUgb25seSB1bmlxdWUgYWNyb3NzIGEgbWVzc2FnZSBhbmQgbm90IGdsb2JhbGx5Lg0KLUhvd2V2ZXIsIGR1ZSB0byB0aGUgZmFjdCB0aGF0IHdlIGhhdmUgYSBnbG9iYWwgbWFwcGluZyB0YWJsZSwgd2UNCi1uZWVkIGEgd2F5IHRvIGRpZmZlcmVudGlhdGUgYmV0d2VlbiBwYXJ0cyBvZiBkaWZmZXJlbnQgbWVzc2FnZXMuDQotVGhlIHRlY2huaXF1ZSB1c2VkIGhlcmUgaXMgdG8gZ2VuZXJhdGUgYSBRTmFtZSB0aGF0IGhhcyB0aGUNCi1vcGVyYXRpb24gbmFtZSBhcyBhIG5hbWVzcGFjZSBhbmQgYSBzdWZmaXggKGxpa2UgX2lucHV0KSBhcHBlbmRlZA0KLXRvIHRoZSBsb2NhbCBuYW1lLjwvcD4NCi08L2xpPg0KLTwvb2w+DQotPHA+R2l2ZW4gdGhlc2Ugc29sdXRpb25zLCB0aGUgZmlyc3Qgc3RlcCBpbiB1bndyYXBwaW5nIGlzIHRvIHdhbGsNCi10aGUgc2NoZW1hIGFuZCBmaWd1cmUgb3V0IHRoZSB1bndyYXBwYWJsZSBpdGVtcy4gVGhlIGtleSBwbGF5ZXIgb2YNCi10aGUgdW53cmFwcGluZyBwcm9jZXNzIGlzIHRoZSB1bndyYXBwaW5nIGV4dGVuc2lvbi4gSXQgd2Fsa3MgYQ0KLWdpdmVuIHNjaGVtYSBhbmQgZmlndXJlIG91dCB0aGUgdW53cmFwcGFibGUgcGFydHMgaWYgdGhlcmUgYXJlDQotYW55LjwvcD4NCi08cD5UaGUgY3VycmVudCB1bndyYXBwZXIgbG9va3MgZm9yIHRoZSBmb2xsb3dpbmcgcGF0dGVybnMgYW5kIGZhaWxzDQotaWYgaXQgaXMgbm90IGZvdW5kITwvcD4NCi08cHJlPg0KLSZsdDsgZWxlbWVudCAmZ3Q7DQotICAgICAgJmx0OyBjb21wbGV4VHlwZSAmZ3Q7DQotICAgICAgICAgICAmbHQ7IHNlcXVlbmNlICZndDsNCi0gICAgICAgICAgICAgICAmbHQ7IGVsZW1lbnQgLyZndDsNCi0gICAgICAgICAgICZsdDsgL3NlcXVlbmNlICZndDsNCi0gICAgICAgJmx0OyAvY29tcGxleFR5cGUgJmd0Ow0KLSAgJmx0OyAvZWxlbWVudCAmZ3Q7DQotIA0KLTwvcHJlPg0KLTxwPk9uY2UgdGhpcyBwYXR0ZXJuIGlzIGRldGVjdGVkLCB0aGUgdW53cmFwcGVyIGRldGFpbHMgd2lsbCBiZQ0KLWFkZGVkIHRvIHRoZSByZWxldmFudCBBeGlzTWVzc2FnZSBjb21wb25lbnQuPC9wPg0KLTxoMj5TdGVwIDMgLSBQb3B1bGF0ZSBUeXBlIEluZm9ybWF0aW9uPC9oMj4NCi08cD5UaGUgbmV4dCBzdGVwIGlzIHRvIHBvcHVsYXRlIHRoZSBUeXBlIGluZm9ybWF0aW9uIGZvciB0aGUgcGFydHMuDQotVGhpcyBoYXMgdG8gYmUgZXhwbGljaXRseSBkb25lIGJ5IHRoZSBkYXRhIGJpbmRpbmcgZXh0ZW5zaW9ucywgYW5kDQotY3VycmVudGx5IHRoZSBBREIgYW5kIFhNTGJlYW5zIGV4dGVuc2lvbnMgcG9wdWxhdGUgdGhlIHJlbGV2YW50DQotQXhpc01lc3NhZ2UgYnkgbG9va2luZyB1cCB0aGVpciBnZW5lcmF0ZWQgdHlwZSBzeXN0ZW1zLiBUaGlzIHR5cGUNCi1pbmZvcm1hdGlvbiBnb2VzIGludG8gdGhlIEF4aXNNZXNzYWdlIGluc2lkZSBhDQotTWVzc2FnZVBhcnRJbmZvcm1hdGlvbkhvbGRlciBpbnN0YW5jZS48L3A+DQotPHA+VGhlIGZvbGxvd2luZyBjb2RlIGZyYWdtZW50IGZyb20gdGhlIEFEQiBleHRlbnNpb24gc2hvd3MgaG93IHRoZQ0KLUF4aXNNZXNzYWdlcyBnZXQgcG9wdWxhdGVkIHdpdGggdGhlIHJlbGV2YW50IHR5cGUgaW5mb3JtYXRpb24uIFRoZQ0KLWNvZGUgaXMgYWxtb3N0IHRoZSBzYW1lIGZvciB0aGUgWE1MQmVhbnMgZXh0ZW5zaW9uLiBOb3RlIHRoZSBpdGVtcw0KLWluIGJvbGQuPC9wPg0KLTxwcmU+DQotIGlmIChtZXNzYWdlLmdldFBhcmFtZXRlcihDb25zdGFudHMuVU5XUkFQUEVEX0tFWSkgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIFhtbFNjaGVtYVR5cGUgc2NoZW1hVHlwZSA9IG1lc3NhZ2UuZ2V0U2NoZW1hRWxlbWVudCgpLmdldFNjaGVtYVR5cGUoKTsNCi0gICAgICAgICAgICBpZiAoc2NoZW1hVHlwZSBpbnN0YW5jZW9mIFhtbFNjaGVtYUNvbXBsZXhUeXBlKSB7DQotICAgICAgICAgICAgICAgIFhtbFNjaGVtYUNvbXBsZXhUeXBlIGNtcGx4VHlwZSA9IChYbWxTY2hlbWFDb21wbGV4VHlwZSkgc2NoZW1hVHlwZTsNCi0gICAgICAgICAgICAgICAgWG1sU2NoZW1hUGFydGljbGUgcGFydGljbGUgPSBjbXBseFR5cGUuZ2V0UGFydGljbGUoKTsNCi0gICAgICAgICAgICAgICAgaWYgKHBhcnRpY2xlIGluc3RhbmNlb2YgWG1sU2NoZW1hU2VxdWVuY2UpIHsNCi0gICAgICAgICAgICAgICAgICAgIFhtbFNjaGVtYU9iamVjdENvbGxlY3Rpb24gaXRlbXMgPQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFhtbFNjaGVtYVNlcXVlbmNlKSBwYXJ0aWNsZSkuZ2V0SXRlbXMoKTsNCi0gICAgICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGl0ZW1zLmdldEl0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBpdGVtID0gaS5uZXh0KCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBYbWxTY2hlbWFFbGVtZW50KSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgWG1sU2NoZW1hRWxlbWVudCB4bWxTY2hlbWFFbGVtZW50ID0gKFhtbFNjaGVtYUVsZW1lbnQpIGl0ZW07DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhtbFNjaGVtYVR5cGUgZWx0U2NoZW1hVHlwZSA9IHhtbFNjaGVtYUVsZW1lbnQuZ2V0U2NoZW1hVHlwZSgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWx0U2NoZW1hVHlwZSAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Ryb25nPnBvcHVsYXRlQ2xhc3NOYW1lKGVsdFNjaGVtYVR5cGUsbWFwcGVyLG9wTmFtZSx4bWxTY2hlbWFFbGVtZW50LmdldE5hbWUoKSk7PC9zdHJvbmc+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoeG1sU2NoZW1hRWxlbWVudC5nZXRTY2hlbWFUeXBlTmFtZSgpICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHRTY2hlbWFUeXBlID0gZmluZFNjaGVtYVR5cGUoc2NoZW1hTWFwLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFNjaGVtYUVsZW1lbnQuZ2V0U2NoZW1hVHlwZU5hbWUoKSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsdFNjaGVtYVR5cGUhPW51bGwpew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcHVsYXRlQ2xhc3NOYW1lKGVsdFNjaGVtYVR5cGUsbWFwcGVyLG9wTmFtZSx4bWxTY2hlbWFFbGVtZW50LmdldE5hbWUoKSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgIH0NCi0gICAgICAgICB9DQotICAgfQ0KLTwvcHJlPg0KLTxwPlRoZSBwb3B1bGF0ZUNsYXNzTmFtZSBsb29rcyBsaWtlIHRoaXM8L3A+DQotPHByZT4NCi0gcHJpdmF0ZSBzdGF0aWMgdm9pZCBwb3B1bGF0ZUNsYXNzTmFtZShYbWxTY2hlbWFUeXBlIGVsdFNjaGVtYVR5cGUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZU1hcHBlciB0eXBlTWFwLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBvcE5hbWUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhcnROYW1lKSB7DQotICAgICAgICBNYXAgbWV0YUluZm9NYXAgPSBlbHRTY2hlbWFUeXBlLmdldE1ldGFJbmZvTWFwKCk7DQotICAgICAgICBpZiAobWV0YUluZm9NYXAgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIDxzdHJvbmc+U3RyaW5nIGNsYXNzTmFtZSA9IChTdHJpbmcpIG1ldGFJbmZvTWFwLg0KLSAgICAgICAgICAgICAgICAgICAgZ2V0KFNjaGVtYUNvbnN0YW50cy5TY2hlbWFDb21waWxlckluZm9Ib2xkZXIuQ0xBU1NOQU1FX0tFWSk7DQotICAgICAgICAgICAgUU5hbWUgcGFydFFOYW1lID0gV1NETFV0aWwuZ2V0UGFydFFOYW1lKG9wTmFtZSwNCi0gICAgICAgICAgICAgICAgICAgIFdTRExDb25zdGFudHMuSU5QVVRfUEFSVF9RTkFNRV9TVUZGSVgsDQotICAgICAgICAgICAgICAgICAgICBwYXJ0TmFtZSk7DQotICAgICAgICAgICAgdHlwZU1hcC5hZGRUeXBlTWFwcGluZ05hbWUocGFydFFOYW1lLGNsYXNzTmFtZSk7PC9zdHJvbmc+DQotICAgICAgICAgICAgaWYgKEJvb2xlYW4uVFJVRS5lcXVhbHMoDQotICAgICAgICAgICAgICAgICAgICBtZXRhSW5mb01hcC5nZXQoU2NoZW1hQ29uc3RhbnRzLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFDb21waWxlckluZm9Ib2xkZXIuQ0xBU1NOQU1FX1BSSU1JVFZFX0tFWSkpKXsNCi0gICAgICAgICAgICAgICAgLy90aGlzIHR5cGUgaXMgcHJpbWl0aXZlIC0gYWRkIHRoYXQgdG8gdGhlIHR5cGUgbWFwcGVyIHN0YXR1cw0KLSAgICAgICAgICAgICAgICAvL2ZvciBub3cgbGV0cyBhZGQgYSBib29sZWFuDQotICAgICAgICAgICAgICAgIHR5cGVNYXAuYWRkVHlwZU1hcHBpbmdTdGF0dXMocGFydFFOYW1lLEJvb2xlYW4uVFJVRSk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgfQ0KLSAgICB9DQotPC9wcmU+DQotPGgyPlN0ZXAgNCAtIEdlbmVyYXRlIENvZGUgd2l0aCBVbndyYXBwZWQgUGFyYW1ldGVyczwvaDI+DQotPHA+VGhlIG5leHQgc3RlcCBpcyBnZW5lcmF0aW5nIHRoZSBhY3R1YWwgY29kZS4gVGhlDQotQXhpc1NlcnZpY2VCYXNlZE11bHRpTGFuZ3VhZ2VFbWl0dGVyIGhhcyBhIG1ldGhvZCB0aGF0IGdlbmVyYXRlcw0KLXRoZSBYTUwgbW9kZWwgZm9yIHRoZSBpbnB1dCBwYXJhbWV0ZXJzLCBhbmQgdGhhdCBtZXRob2QgaW5jbHVkZXMNCi10aGUgcmVsZXZhbnQgcGFydCBwYXJhbWV0ZXJzIGluc2lkZSB0aGUgcmVsYXZhbnQgdG9wIGxldmVsIGlucHV0DQotcGFyYW1ldGVyIGVsZW1lbnQuPC9wPg0KLTxwPlRoZSByZWxldmFudCBwYXJ0IG9mIHRoZSBYTUwgbW9kZWwgbG9va3MgbGlrZSB0aGlzLiBOb3RlIHRoYXQNCi10aGlzIGludGVybWVkaWF0ZSBYTUwgbW9kZWwgaXMgdGhlIG9uZSB0aGF0IGlzIHBhcnNlZCBhZ2FpbnN0IHRoZQ0KLVN0eWxlc2hlZXRzIHRvIGdlbmVyYXRlIHRoZSBjb2RlLjwvcD4NCi08cHJlPg0KLSZsdDtpbnB1dCZndDsNCi0gJmx0O3BhcmFtIG5hbWU9InBhcmFtNCIgdHlwZT0iY29tLmV4YW1wbGUud3d3LlNlcnZpY2VOYW1lU3R1Yi5FY2hvIiBzaG9ydHR5cGU9IkVjaG8iIHZhbHVlPSJudWxsIiBsb2NhdGlvbj0iYm9keSIgb3BuYW1lPSJlY2hvIiZndDsNCi0gICAgICAgICZsdDtwYXJhbSBuYW1lPSJwYXJhbTUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciIHNob3J0dHlwZT0iU3RyaW5nIiB2YWx1ZT0ibnVsbCIgbG9jYXRpb249ImJvZHkiIG9wbmFtZT0iZWNobyIgcGFydG5hbWU9IlBhcnQxIiANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmltaXRpdmU9InllcyIvJmd0Ow0KLSAgICAgICAgJmx0O3BhcmFtIG5hbWU9InBhcmFtNiIgdHlwZT0iaW50IiBzaG9ydHR5cGU9ImludCIgdmFsdWU9IjAiIGxvY2F0aW9uPSJib2R5IiBvcG5hbWU9ImVjaG8iIHBhcnRuYW1lPSJQYXJ0MiIgcHJpbWl0aXZlPSJ5ZXMiLyZndDsNCi0gICZsdDsvcGFyYW0mZ3Q7DQotJmx0Oy9pbnB1dCZndDsNCi08L3ByZT4NCi08cD5UaGUgbmV4dCBwYXJ0IGlzIGhhbmRsZWQgYnkgdGhlIHRlbXBsYXRlLiBCYXNpY2FsbHksIHRoZQ0KLXRlbXBsYXRlIGxvb2tzIGFmdGVyIHRoZSBnZW5lcmF0aW9uIG9mIG11bHRpcGxlIHBhcmFtZXRlcnMgaW50byB0aGUNCi1tZXRob2Qgc2lnbmF0dXJlcywgYW5kIHRoZW4gdGhlIGdlbmVyYXRpbmcgb2YgdGhlIHJlbGV2YW50DQotc2VyaWFsaXphdGlvbiBhbmQgZGVzZXJpYWxpemF0aW9uIGNvZGUgZm9yIHRoZSBwYXJhbWV0ZXJzLjwvcD4NCi08aDI+QnJpbmdpbmcgdGhlIFBhcmFtZXRlcnMgVG9nZXRoZXIgYW5kIEV4cGxvZGluZyBUaGVtPC9oMj4NCi08cD5UaGlzIGlzIGEgc29tZXdoYXQgY29udHJvdmVyc2lhbCBhcmVhLiBUaGUgY3VycmVudCBBeGlzMiBjb2RlDQotZ2VuZXJhdG9yIGRvZXMgdGhlIHdyYXBwaW5nIGFuZCB1bndyYXBwaW5nIGF0IHRoZSBvYmplY3QgbGV2ZWwgYW5kDQotbm90IHRoZSBYTUwgbGV2ZWwuIEluIHNob3J0LCB0aGUgZXhwbG9kZWQgcGFyYW1ldGVycyBhcmUgb25seSBhDQotY29udmVuaWVuY2UgYW5kIHRoZSBleHBsb3Npb24gZG9lcyBub3QgcnVuIGRvd24gdG8gdGhlIFhNTCBsZXZlbC4NCi1UaGUgZm9sbG93aW5nIGV4YW1wbGUgb2YgZ2VuZXJhdGVkIHNvdXJjZSBjb2RlIG1ha2VzIHRoaXMNCi1jbGVhcjo8L3A+DQotPHByZT4NCi0gcHJpdmF0ZSBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlIHRvRW52ZWxvcGUoDQotICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhY3RvcnkgZmFjdG9yeSwgamF2YS5sYW5nLlN0cmluZyBwYXJhbTEsDQotICAgICAgICBpbnQgcGFyYW0yLCBib29sZWFuIG9wdGltaXplQ29udGVudCkgew0KLSAgICAgICAgPHN0cm9uZz5jb20uZXhhbXBsZS53d3cuU2VydmljZU5hbWVTdHViLkVjaG8gd3JhcHBlZFR5cGUgPSBuZXcgY29tLmV4YW1wbGUud3d3LlNlcnZpY2VOYW1lU3R1Yi5FY2hvKCk7DQotICAgICAgICB3cmFwcGVkVHlwZS5zZXRQYXJ0MShwYXJhbTEpOw0KLSAgICAgICAgd3JhcHBlZFR5cGUuc2V0UGFydDIocGFyYW0yKTs8L3N0cm9uZz4NCi0gICAgICAgIHJnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZSBlbXB0eUVudmVsb3BlID0gZmFjdG9yeS5nZXREZWZhdWx0RW52ZWxvcGUoKTsNCi0gICAgICAgIGVtcHR5RW52ZWxvcGUuZ2V0Qm9keSgpLmFkZENoaWxkKHdyYXBwZWRUeXBlLmdldE9NRWxlbWVudCgNCi0gICAgICAgICAgICAgICAgICAgICAgICBjb20uZXhhbXBsZS53d3cuU2VydmljZU5hbWVTdHViLkVjaG8uTVlfUU5BTUUsIGZhY3RvcnkpKTsNCi0gICAgICAgIA0KLSAgICAgICAgcmV0dXJuIGVtcHR5RW52ZWxvcGU7DQotfQ0KLTwvcHJlPg0KLTxwPk5vdGUgdGhlIGxpbmVzIGluIGJvbGQuIFRoZSB3cmFwcGVkIGNsYXNzIHdpbGwgYW55d2F5IGJlDQotaW5zdGFudGlhdGVkIGFuZCB1c2VkIGF0IHRoZSBlbmQsIGJ1dCB3aGF0IHRoZSB1c2VyIHNlZXMgaXMNCi1kaWZmZXJlbnQuIEV4cGxvZGluZyB0aGUgcGFyYW1ldGVycyBoYXBwZW5zIGluIGEgc2ltaWxhciB3YXkhPC9wPg0KLTxoMj5Db25jbHVzaW9uPC9oMj4NCi08cD5BeGlzMiBSUEMgc3VwcG9ydCBpcyBzb3J0IG9mIGEgbWlzdHkgYXJlYSwgYnV0IGl0IGlzIGJhc2VkIG9uIGENCi13ZWxsIGRlZmluZWQgc2V0IG9mIHJ1bGVzIHdoaWNoIG1ha2VzIGl0IG5vdCA8ZW0+dGhhdDwvZW0+IG1pc3R5DQotYWZ0ZXIgYWxsITwvcD4NCi08aHIgLz4NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9BeGlzMkFyY2hpdGVjdHVyZUd1aWRlLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9BeGlzMkFyY2hpdGVjdHVyZUd1aWRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFiNjU3NC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvQXhpczJBcmNoaXRlY3R1cmVHdWlkZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3OTUgKzAsMCBAQAotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiINCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPg0KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4NCi08aGVhZD4NCi08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9DQotIkhUTUwgVGlkeSBmb3IgV2luZG93cyAodmVycyAxNCBKdW5lIDIwMDcpLCBzZWUgd3d3LnczLm9yZyIgLz4NCi08bWV0YSBodHRwLWVxdWl2PSJjb250ZW50LXR5cGUiIGNvbnRlbnQ9IiIgLz4NCi08dGl0bGU+QXhpczIgQXJjaGl0ZWN0dXJlIEd1aWRlPC90aXRsZT4NCi08bWV0YSBjb250ZW50PSIyMDA1MDkxNjsyMjQ1NTI4OCIgLz4NCi08bGluayBocmVmPSIuLi9jc3MvYXhpcy1kb2NzLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyINCi1tZWRpYT0iYWxsIiAvPg0KLTwvaGVhZD4NCi08Ym9keSBsYW5nPSJlbi1VUyIgZGlyPSJsdHIiIHhtbDpsYW5nPSJlbi1VUyI+DQotPGgxIGFsaWduPSJjZW50ZXIiPkFwYWNoZSBBeGlzMiBBcmNoaXRlY3R1cmUgR3VpZGU8L2gxPg0KLTxwPlRoaXMgZG9jdW1lbnQgZ2l2ZXMgYW4gaW50cm9kdWN0aW9uIHRvIEF4aXMyJ3MgbW9kdWxhcg0KLWFyY2hpdGVjdHVyZSB3aXRoIGV4cGxhbmF0aW9ucyBvbiBldmVyeSBtb2R1bGUuPC9wPg0KLTxoMj5Db250ZW50czwvaDI+DQotPHVsPg0KLTxsaT48YSBocmVmPSIjYm1CUCI+VGhlIEJpZyBQaWN0dXJlPC9hPjwvbGk+DQotPGxpPg0KLTxwPjxhIGhyZWY9IiNyZXF1aXJlbWVudHMiPlJlcXVpcmVtZW50IG9mIEF4aXMyPC9hPjwvcD4NCi08L2xpPg0KLTxsaT48YSBocmVmPSIjdGhlYXJjaGkiPkF4aXMyIEFyY2hpdGVjdHVyZTwvYT4NCi08dWw+DQotPGxpPg0KLTxwPjxhIGhyZWY9IiNibWNvcmUiPkNvcmUgTW9kdWxlczwvYT48L3A+DQotPC9saT4NCi08bGk+PGEgaHJlZj0iI2Jtb3RoZXIiPk90aGVyIE1vZHVsZXM8L2E+PC9saT4NCi08bGk+DQotPHA+PGEgaHJlZj0iI2JtSW5mb01vZCI+SW5mb3JtYXRpb24gTW9kZWw8L2E+PC9wPg0KLTwvbGk+DQotPGxpPjxhIGhyZWY9IiNibVhNTCI+WE1MIFByb2Nlc3NpbmcgTW9kZWw8L2E+PC9saT4NCi08bGk+DQotPHA+PGEgaHJlZj0iI2JtU09BUFBNIj5TT0FQIFByb2Nlc3NpbmcgTW9kZWw8L2E+PC9wPg0KLTx1bD4NCi08bGk+PGEgaHJlZj0iI2RlZmF1bHQiPkF4aXMyIERlZmF1bHQgUHJvY2Vzc2luZyBNb2RlbDwvYT48L2xpPg0KLTxsaT4NCi08cD48YSBocmVmPSIjaW5jb21pbmdzb2FwIj5Qcm9jZXNzaW5nIGFuIEluY29taW5nIFNPQVANCi1NZXNzYWdlPC9hPjwvcD4NCi08L2xpPg0KLTxsaT48YSBocmVmPSIjb3V0Z29pbmciPlByb2Nlc3Npbmcgb2YgdGhlIE91dGdvaW5nIE1lc3NhZ2U8L2E+PC9saT4NCi08bGk+DQotPHA+PGEgaHJlZj0iI2V4dGVuZGluZyI+RXh0ZW5kaW5nIHRoZSBTT0FQIFByb2Nlc3NpbmcgTW9kZWw8L2E+PC9wPg0KLTx1bD4NCi08bGk+PGEgaHJlZj0iI2V4dGVuZGluZ3dpdGhoYW5kbGVycyI+RXh0ZW5kaW5nIHRoZSBTT0FQIFByb2Nlc3NpbmcNCi1Nb2RlbCB3aXRoIEhhbmRsZXJzPC9hPjwvbGk+DQotPGxpPg0KLTxwPjxhIGhyZWY9IiNleHRlbmRpbmd3aXRobW9kdWxlcyI+RXh0ZW5kaW5nIHRoZSBTT0FQIFByb2Nlc3NpbmcNCi1Nb2RlbCB3aXRoIE1vZHVsZXM8L2E+PC9wPg0KLTwvbGk+DQotPC91bD4NCi08L2xpPg0KLTwvdWw+DQotPC9saT4NCi08bGk+PGEgaHJlZj0iI2JtRGVwbG95bWVudCI+RGVwbG95bWVudDwvYT4NCi08dWw+DQotPGxpPjxhIGhyZWY9IiN4bWxmaWxlIj5UaGUgPGVtPmF4aXMyLnhtbDwvZW0+IGZpbGU8L2E+PC9saT4NCi08bGk+DQotPHA+PGEgaHJlZj0iI3NlcnZpY2VhcmNoaXZlIj5TZXJ2aWNlIEFyY2hpdmU8L2E+PC9wPg0KLTwvbGk+DQotPGxpPjxhIGhyZWY9IiNtb2R1bGVhcmNoaXZlIj5Nb2R1bGUgQXJjaGl2ZTwvYT48L2xpPg0KLTwvdWw+DQotPC9saT4NCi08bGk+DQotPHA+PGEgaHJlZj0iI2JtQ2xpZW50QVBJIj5DbGllbnQgQVBJPC9hPjwvcD4NCi08dWw+DQotPGxpPjxhIGhyZWY9IiNvbmV3YXkiPk9uZSBXYXkgTWVzc2FnaW5nIFN1cHBvcnQ8L2E+PC9saT4NCi08bGk+DQotPHA+PGEgaHJlZj0iI3JlcXVlc3RyZXNwb25zZSI+UmVxdWVzdCBSZXNwb25zZSBNZXNzYWdpbmcNCi1TdXBwb3J0PC9hPjwvcD4NCi08L2xpPg0KLTwvdWw+DQotPC9saT4NCi08bGk+PGEgaHJlZj0iI2JtVHJhbnNwb3J0cyI+VHJhbnNwb3J0czwvYT48L2xpPg0KLTxsaT4NCi08cD48YSBocmVmPSIjYm1XU0RMIj5Db2RlIEdlbmVyYXRpb248L2E+PC9wPg0KLTwvbGk+DQotPGxpPjxhIGhyZWY9IiNibURCIj5EYXRhIEJpbmRpbmc8L2E+DQotPHVsPg0KLTxsaT48YSBocmVmPSIjaW50ZWdyYXRpb24iPkludGVncmF0aW9uIHdpdGggQ29kZSBHZW5lcmF0aW9uDQotRW5naW5lPC9hPjwvbGk+DQotPGxpPg0KLTxwPjxhIGhyZWY9IiNzZXJpYWwiPlNlcmlhbGl6YXRpb24gYW5kIERlLVNlcmlhbGl6YXRpb248L2E+PC9wPg0KLTwvbGk+DQotPC91bD4NCi08L2xpPg0KLTwvdWw+DQotPC9saT4NCi08L3VsPg0KLTxhIG5hbWU9ImJtQlAiIGlkPSJibUJQIj48L2E+DQotPGgyPlRoZSBCaWcgUGljdHVyZTwvaDI+DQotPHA+QSBuZXcgYXJjaGl0ZWN0dXJlIGZvciBBeGlzIHdhcyBpbnRyb2R1Y2VkIGR1cmluZyB0aGUgQXVndXN0DQotMjAwNCBTdW1taXQgaW4gQ29sb21ibywgU3JpIExhbmthLiBUaGlzIG5ldyBhcmNoaXRlY3R1cmUgb24gd2hpY2gNCi1BeGlzMiBpcyBiYXNlZCBpcyBtb3JlIGZsZXhpYmxlLCBlZmZpY2llbnQsIGFuZCBjb25maWd1cmFibGUgaW4NCi1jb21wYXJpc29uIHRvIDxhIGhyZWY9DQotImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMvamF2YS9hcmNoaXRlY3R1cmUtZ3VpZGUuaHRtbCI+QXhpczEueA0KLWFyY2hpdGVjdHVyZTwvYT4uIFNvbWUgd2VsbCBlc3RhYmxpc2hlZCBjb25jZXB0cyBmcm9tIEF4aXMgMS54LA0KLWxpa2UgaGFuZGxlcnMgZXRjLiwgaGF2ZSBiZWVuIHByZXNlcnZlZCBpbiB0aGlzIG5ldw0KLWFyY2hpdGVjdHVyZS48L3A+DQotPHA+QW55IGFyY2hpdGVjdHVyZSBpcyBhIHJlc3VsdCBvZiB3aGF0IHRoYXQgYXJjaGl0ZWN0dXJlIHNob3VsZA0KLXlpZWxkLiBUaGUgc3VjY2VzcyBvZiBhbiBhcmNoaXRlY3R1cmUgc2hvdWxkIGJlIGV2YWx1YXRlZCBiYXNlZCBvbg0KLXRoZSByZXF1aXJlbWVudHMgZXhwZWN0ZWQgdG8gYmUgbWV0IGJ5IHRoYXQgYXJjaGl0ZWN0dXJlLiBMZXQgdXMNCi1zdGFydCBvdXIgam91cm5leSBpbnRvIEF4aXMyIGJ5IGxvb2tpbmcgYXQgdGhlIHJlcXVpcmVtZW50cy48L3A+DQotPGEgbmFtZT0icmVxdWlyZW1lbnRzIiBpZD0icmVxdWlyZW1lbnRzIj48L2E+DQotPGgyPlJlcXVpcmVtZW50IG9mIEF4aXMyPC9oMj4NCi08cD5JbiBTT0FQIHRlcm1pbm9sb2d5LCBhIHBhcnRpY2lwYW50IHdobyBpcyB0YWtpbmcgcGFydCBpbiBhIFdlYg0KLXNlcnZpY2UgaW50ZXJhY3Rpb24gaXMga25vd24gYXMgYSBTT0FQIE5vZGUuIERlbGl2ZXJ5IG9mIGEgc2luZ2xlDQotU09BUCBNZXNzYWdlIGlzIGRlZmluZWQgYmFzZWQgb24gdHdvIHBhcnRpY2lwYW50cywgU09BUCBTZW5kZXIgYW5kDQotU09BUCBSZWNlaXZlci4gRWFjaCBTT0FQIG1lc3NhZ2UgaXMgc2VudCBieSBhIFNPQVAgU2VuZGVyIGFuZA0KLXJlY2VpdmVkIGJ5IGEgU09BUCBSZWNlaXZlci4gQSBzaW5nbGUgU09BUCBkZWxpdmVyeSBpcyB0aGUgbW9zdA0KLWJhc2ljIHVuaXQgdGhhdCBidWlsZHMgdGhlIFdlYiBzZXJ2aWNlIGludGVyYWN0aW9uLjwvcD4NCi08cD5FYWNoIFNPQVAgTm9kZSBtYXkgYmUgd3JpdHRlbiBpbiBzcGVjaWZpYyBwcm9ncmFtbWluZyBsYW5ndWFnZSwNCi1tYXkgaXQgYmUgSmF2YSwgQysrLCAuTkVUIG9yIFBlcmwsIGJ1dCB0aGUgV2ViIHNlcnZpY2VzIGFsbG93IHRoZW0NCi10byBpbnRlcm9wZXJhdGUuIFRoaXMgaXMgcG9zc2libGUgYmVjYXVzZSBvbiB0aGUgd2lyZSBlYWNoIFdlYg0KLXNlcnZpY2UgaW50ZXJhY3Rpb24gaXMgZG9uZSB2aWEgU09BUCwgd2hpY2ggaXMgY29tbW9uIHRvIGV2ZXJ5IFNPQVANCi1Ob2RlLjwvcD4NCi08cD48aW1nIGFsdD0iIiBzcmM9ImltYWdlcy9hcmNoaS1ndWlkZS9zb2FwLmdpZiIgbmFtZT0iR3JhcGhpYzEiDQotYWxpZ249ImJvdHRvbSIgd2lkdGg9IjY5MSIgaGVpZ2h0PSIzMTkiIGJvcmRlcj0iMCIgaWQ9DQotIkdyYXBoaWMxIiAvPjwvcD4NCi08cD5XZWIgc2VydmljZSBtaWRkbGV3YXJlIGhhbmRsZXMgdGhlIGNvbXBsZXhpdHkgaW4gU09BUCBtZXNzYWdpbmcNCi1hbmQgbGV0cyB0aGUgdXNlcnMgd29yayB3aXRoIHRoZSBwcm9ncmFtbWluZyBsYW5ndWFnZSB0aGV5IGFyZQ0KLWFjY3VzdG9tZWQgdG8uIEF4aXMyIGFsbG93cyBKYXZhIHVzZXJzIHRvIGludm9rZSBXZWIgc2VydmljZXMgdXNpbmcNCi1KYXZhIHJlcHJlc2VudGF0aW9ucywgYW5kIGhhbmRsZXMgdGhlIFNPQVAgbWVzc2FnaW5nIGJlaGluZCB0aGUNCi1jdXJ0YWluLjwvcD4NCi08cD5BeGlzMiBoYW5kbGVzIFNPQVAgcHJvY2Vzc2luZyBhbG9uZyB3aXRoIG51bWVyb3VzIG90aGVyIHRhc2tzLg0KLVRoaXMgbWFrZXMgbGlmZSBvZiBhIFdlYiBzZXJ2aWNlIGRldmVsb3BlciBhIHdob2xlIGxvdCBlYXNpZXIuDQotRm9sbG93aW5nIGFyZSB0aGUgaWRlbnRpZmllZCByZXF1aXJlbWVudHM6PC9wPg0KLTxvbD4NCi08bGk+UHJvdmlkZSBhIGZyYW1ld29yayB0byBwcm9jZXNzIHRoZSBTT0FQIG1lc3NhZ2VzLiBUaGUgZnJhbWV3b3JrDQotc2hvdWxkIGJlIGV4dGVuc2libGUgYW5kIHRoZSB1c2VycyBzaG91bGQgYmUgYWJsZSB0byBleHRlbmQgdGhlDQotU09BUCBwcm9jZXNzaW5nIHBlciBzZXJ2aWNlIG9yIHBlciBvcGVyYXRpb24gYmFzaXMuIEZ1cnRoZXJtb3JlLCBpdA0KLXNob3VsZCBiZSBhYmxlIHRvIG1vZGVsIGRpZmZlcmVudCBNZXNzYWdlIEV4Y2hhbmdlIFBhdHRlcm5zIChNRVBzKQ0KLXVzaW5nIHRoZSBwcm9jZXNzaW5nIGZyYW1ld29yay48L2xpPg0KLTxsaT5BYmlsaXR5IHRvIGRlcGxveSBhIFdlYiBzZXJ2aWNlICh3aXRoIG9yIHdpdGhvdXQgV1NETCk8L2xpPg0KLTxsaT5Qcm92aWRlIGEgQ2xpZW50IEFQSSB0aGF0IGNhbiBiZSB1c2VkIHRvIGludm9rZSBXZWIgc2VydmljZXMuDQotVGhpcyBBUEkgc2hvdWxkIHN1cHBvcnQgYm90aCB0aGUgU3luY2hyb25vdXMgYW5kIEFzeW5jaHJvbm91cw0KLXByb2dyYW1taW5nIG1vZGVscy48L2xpPg0KLTxsaT5BYmlsaXR5IHRvIGNvbmZpZ3VyZSBBeGlzMiBhbmQgaXRzIGNvbXBvbmVudHMgdGhyb3VnaA0KLWRlcGxveW1lbnQuPC9saT4NCi08bGk+QWJpbGl0eSB0byBzZW5kIGFuZCByZWNlaXZlIFNPQVAgbWVzc2FnZXMgd2l0aCBkaWZmZXJlbnQNCi10cmFuc3BvcnRzLjwvbGk+DQotPC9vbD4NCi08cD5BcGFydCBmcm9tIHRoZSBhYm92ZSBmdW5jdGlvbmFsaXRpZXMsIHBlcmZvcm1hbmNlIGluIHRlcm1zIG9mDQotbWVtb3J5IGFuZCBzcGVlZCBpcyBhIG1ham9yIGNvbnNpZGVyYXRpb24gZm9yIEF4aXMyLiBBeGlzMiBDb3JlDQotQXJjaGl0ZWN0dXJlIGlzIGJ1aWx0IG9uIHRocmVlIHNwZWNpZmljYXRpb25zLSA8YSBocmVmPQ0KLSJodHRwOi8vd3d3LnczLm9yZy9UUi93c2RsIj5XU0RMPC9hPiwgPGEgaHJlZj0NCi0iaHR0cDovL3d3dy53My5vcmcvVFIvc29hcC8iPlNPQVA8L2E+IGFuZCA8YSBocmVmPQ0KLSJodHRwOi8vd3d3LnczLm9yZy9TdWJtaXNzaW9uL3dzLWFkZHJlc3NpbmcvIj5XUy1BZGRyZXNzaW5nPC9hPi4NCi1PdGhlciBzcGVjaWZpY2F0aW9ucyBsaWtlIEpBWC1SUEMsIDxhIGhyZWY9DQotImh0dHA6Ly9qYXZhLnN1bi5jb20vd2Vic2VydmljZXMvc2Fhai9pbmRleC5qc3AiPlNBQUo8L2E+IGFuZA0KLTxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1N1Ym1pc3Npb24vV1MtUG9saWN5LyI+V1MtUG9saWN5PC9hPiBhcmUNCi1sYXllcmVkIG9uIHRvcCBvZiB0aGUgQ29yZSBBcmNoaXRlY3R1cmUuPC9wPg0KLTxhIG5hbWU9InRoZWFyY2hpIiBpZD0idGhlYXJjaGkiPjwvYT4NCi08aDI+QXhpczIgQXJjaGl0ZWN0dXJlPC9oMj4NCi1BeGlzMiBhcmNoaXRlY3R1cmUgbGF5cyBvdXQgc29tZSBwcmluY2lwYWxzIHRvIHByZXNlcnZlIHRoZQ0KLXVuaWZvcm1pdHkuIFRoZXkgYXJlIGFzIGZvbGxvd3M6DQotPHVsPg0KLTxsaT4NCi08cD5BeGlzMiBhcmNoaXRlY3R1cmUgc2VwYXJhdGVzIHRoZSBsb2dpYyBhbmQgdGhlIHN0YXRlcy4gQ29kZSB0aGF0DQotZG9lcyB0aGUgcHJvY2Vzc2luZyBkb2VzIG5vdCBoYXZlIGEgc3RhdGUgaW5zaWRlIEF4aXMyLiBUaGlzIGFsbG93cw0KLWNvZGUgdG8gYmUgZXhlY3V0ZWQgZnJlZWx5IGJ5IHBhcmFsbGVsIHRocmVhZHMuPC9wPg0KLTwvbGk+DQotPGxpPkFsbCB0aGUgaW5mb3JtYXRpb24gaXMga2VwdCBpbiBvbmUgaW5mb3JtYXRpb24gbW9kZWwsIGFsbG93aW5nDQotdGhlIHN5c3RlbSB0byBiZSBzdXNwZW5kZWQgYW5kIHJlc3VtZWQuPC9saT4NCi08L3VsPg0KLTxwPkF4aXMyIGFyY2hpdGVjdHVyZSBpcyBtb2R1bGFyLiBUaGVyZWZvcmUsIEF4aXMyIEZyYW1ld29yayBpcw0KLWJ1aWx0IHVwIG9mIGNvcmUgbW9kdWxlcyB0aGF0IGNvbGxlY3RpdmVseSBtYWtlIHVwIHRoZSBjb3JlDQotYXJjaGl0ZWN0dXJlIG9mIEF4aXMyLiBOb24tY29yZS9vdGhlciBtb2R1bGVzIGFyZSBsYXllcmVkIG9uIHRvcCBvZg0KLXRoZXNlIGNvcmUgbW9kdWxlcy48L3A+DQotPGEgbmFtZT0iYm1jb3JlIiBpZD0iYm1jb3JlIj48L2E+DQotPGgzPkNvcmUgTW9kdWxlczo8L2gzPg0KLTx1bD4NCi08bGk+PGEgaHJlZj0iI2JtSW5mb01vZCI+SW5mb3JtYXRpb24gTW9kZWw8L2E+IC0gQXhpczIgZGVmaW5lcyBhDQotbW9kZWwgdG8gaGFuZGxlIGluZm9ybWF0aW9uIGFuZCBhbGwgc3RhdGVzIGFyZSBrZXB0IGluIHRoaXMgbW9kZWwuDQotVGhlIG1vZGVsIGNvbnNpc3RzIG9mIGEgaGllcmFyY2h5IG9mIGluZm9ybWF0aW9uLiBUaGUgc3lzdGVtDQotbWFuYWdlcyB0aGUgbGlmZSBjeWNsZSBvZiB0aGUgb2JqZWN0cyBpbiB0aGlzIGhpZXJhcmNoeS48L2xpPg0KLTxsaT4NCi08cD48YSBocmVmPSIjYm1YTUwiPlhNTCBwcm9jZXNzaW5nIE1vZGVsPC9hPiAtIEhhbmRsaW5nIHRoZSBTT0FQDQotTWVzc2FnZSBpcyB0aGUgbW9zdCBpbXBvcnRhbnQgYW5kIG1vc3QgY29tcGxleCB0YXNrLiBUaGUgZWZmaWNpZW5jeQ0KLW9mIHRoaXMgaXMgdGhlIHNpbmdsZSBtb3N0IGltcG9ydGFudCBmYWN0b3IgdGhhdCBkZWNpZGVzIHRoZQ0KLXBlcmZvcm1hbmNlLiBJdCBtYWtlcyBzZW5zZSB0byBkZWxlZ2F0ZSB0aGlzIHRhc2sgdG8gYSBzZXBhcmF0ZQ0KLXN1Yi1wcm9qZWN0IHVuZGVyIHRoZSBXZWIgc2VydmljZXMgcHJvamVjdCwgYWxsb3dpbmcgdGhhdA0KLXN1Yi1wcm9qZWN0ICg8YSBocmVmPQ0KLSJodHRwOi8vd3MuYXBhY2hlLm9yZy9jb21tb25zL2F4aW9tL2luZGV4Lmh0bWwiPkFYSU9NPC9hPiBvciBBWGlzDQotT2JqZWN0IE1vZGVsKSB0byBwcm92aWRlIGEgc2ltcGxlIEFQSSBmb3IgU09BUCBhbmQgWE1MIGluZm8tc2V0LiBJdA0KLWhpZGVzIHRoZSBjb21wbGV4aXRpZXMgb2YgZWZmaWNpZW50IFhNTCBwcm9jZXNzaW5nIHdpdGhpbiBpdHMNCi1pbXBsZW1lbnRhdGlvbi48L3A+DQotPC9saT4NCi08bGk+PGEgaHJlZj0iI2JtU09BUFBNIj5TT0FQIFByb2Nlc3NpbmcgTW9kZWw8L2E+IC0gVGhpcyBjb250cm9scw0KLXRoZSBleGVjdXRpb24gb2YgdGhlIHByb2Nlc3NpbmcuIFRoZSBtb2RlbCBkZWZpbmVzIGRpZmZlcmVudCBwaGFzZXMNCi10aGUgZXhlY3V0aW9uIHdvdWxkIHdhbGsgdGhyb3VnaCwgYW5kIHRoZSB1c2VyIGNhbiBleHRlbmQgdGhlDQotUHJvY2Vzc2luZyBNb2RlbCBhdCBzcGVjaWZpYyBwbGFjZXMuPC9saT4NCi08bGk+DQotPHA+PGEgaHJlZj0iI2JtRGVwbG95bWVudCI+RGVwbG95bWVudCBNb2RlbDwvYT4gLSBUaGUgQXhpczINCi1kZXBsb3ltZW50IG1vZGVsIGFsbG93cyB0aGUgdXNlciB0byBkZXBsb3kgc2VydmljZXMsIGNvbmZpZ3VyZSB0aGUNCi10cmFuc3BvcnRzLCBhbmQgZXh0ZW5kIHRoZSBTT0FQIFByb2Nlc3NpbmcgbW9kZWwgcGVyIHN5c3RlbSwNCi1zZXJ2aWNlLCBvciBvcGVyYXRpb24gYmFzaXMuPC9wPg0KLTwvbGk+DQotPGxpPjxhIGhyZWY9IiNibUNsaWVudEFQSSI+Q2xpZW50IEFQSTwvYT4gLSBUaGlzIHByb3ZpZGVzIGENCi1jb252ZW5pZW50IEFQSSBmb3IgdXNlcnMgdG8gY29tbXVuaWNhdGUgd2l0aCBXZWIgc2VydmljZXMgdXNpbmcNCi1BeGlzMi4gVGhlcmUgYXJlIGEgc2V0IG9mIGNsYXNzZXMgdG8gaW50ZXJhY3Qgd2l0aCBJTi1PVVQgYW5kDQotSU4tT25seSBzdHlsZSA8YSBocmVmPQ0KLSJodHRwOi8vd3d3LnczLm9yZy8yMDAyL3dzL2NnLzIvMDcvbWVwcy5odG1sIj5NZXNzYWdlIEV4Y2hhbmdlDQotUGF0dGVybnMgKE1FUHMpPC9hPiwgd2hlcmUgdGhleSBjYW4gYmUgdXNlZCB0byBjb25zdHJ1Y3QgYW55IG90aGVyDQotTUVQLiAoUGxlYXNlIG5vdGUgdGhhdCBldmVuIGlmIHRoZSBjbGllbnQgQVBJIGhhcyBpbi1idWlsdCBzdXBwb3J0DQotZm9yIHRoZSBhYm92ZSBuYW1lZCBNRVBzLCBpdCBkb2VzIG5vdCBieSBhbnkgbWVhbnMgbGltaXQgQXhpczIncw0KLWZsZXhpYmlsaXR5IHRvIHN1cHBvcnQgY3VzdG9tIE1FUHMuKTwvbGk+DQotPGxpPg0KLTxwPjxhIGhyZWY9IiNibVRyYW5zcG9ydHMiPlRyYW5zcG9ydHM8L2E+IC0gQXhpczIgZGVmaW5lcyBhDQotdHJhbnNwb3J0IGZyYW1ld29yayB0aGF0IGVuYWJsZXMgdGhlIHVzZXIgdG8gdXNlIG11bHRpcGxlIGRpZmZlcmVudA0KLXRyYW5zcG9ydHMuIFRoZSB0cmFuc3BvcnRzIGZpdCBpbnRvIHNwZWNpZmljIHBsYWNlcyBpbiB0aGUgU09BUA0KLXByb2Nlc3NpbmcgbW9kZWwuIFRoZSBpbXBsZW1lbnRhdGlvbiBwcm92aWRlcyBhIGZldyBjb21tb24NCi10cmFuc3BvcnRzIGFuZCB0aGUgdXNlciBjYW4gd3JpdGUgb3IgcGx1Zy1pbiBuZXcgb25lcyBpZiBhbmQgd2hlbg0KLWl0IGlzIG5lZWRlZC48L3A+DQotPC9saT4NCi08L3VsPg0KLTxhIG5hbWU9ImJtb3RoZXIiIGlkPSJibW90aGVyIj48L2E+DQotPGgzPk90aGVyIE1vZHVsZXM6PC9oMz4NCi08dWw+DQotPGxpPjxhIGhyZWY9IiNibVdTREwiPkNvZGUgR2VuZXJhdGlvbjwvYT4gLSBBeGlzMiBwcm92aWRlcyBhIGNvZGUNCi1nZW5lcmF0aW9uIHRvb2wgdGhhdCBnZW5lcmF0ZXMgc2VydmVyIHNpZGUgYW5kIGNsaWVudCBzaWRlIGNvZGUNCi1hbG9uZyB3aXRoIGRlc2NyaXB0b3JzIGFuZCBhIHRlc3QgY2FzZS4gVGhlIGdlbmVyYXRlZCBjb2RlDQotc2ltcGxpZmllcyB0aGUgc2VydmljZSBkZXBsb3ltZW50IGFuZCB0aGUgc2VydmljZSBpbnZvY2F0aW9uLA0KLWluY3JlYXNpbmcgdGhlIHVzYWJpbGl0eSBvZiBBeGlzMi48L2xpPg0KLTxsaT4NCi08cD48YSBocmVmPSIjYm1EQiI+RGF0YSBCaW5kaW5nPC9hPiAtIFRoZSBiYXNpYyBjbGllbnQgQVBJIG9mIEF4aXMyDQotbGV0cyB0aGUgdXNlcnMgcHJvY2VzcyBTT0FQIGF0IHRoZSBpbmZvc2V0IGxldmVsLCB3aGVyZWFzIGRhdGENCi1iaW5kaW5nIGV4dGVuZHMgaXQgdG8gbWFrZSBpdCBtb3JlIGNvbnZlbmllbnQgdG8gdXNlcnMgYnkNCi1lbmNhcHN1bGF0aW5nIHRoZSBpbmZvc2V0IGxheWVyIGFuZCBwcm92aWRpbmcgYSBwcm9ncmFtbWluZw0KLWxhbmd1YWdlIHNwZWNpZmljIGludGVyZmFjZS48L3A+DQotPC9saT4NCi08L3VsPg0KLTxtYXAgbmFtZT0iR3JhcGhpYzJNYXAiIGlkPSJnMm0iPg0KLTxhcmVhIHNoYXBlPSJyZWN0IiBjb29yZHM9IjEyMywzMSwyMjIsOTciIGhyZWY9IiNibUluZm9Nb2QiIGFsdD0NCi0iIiAvPg0KLTxhcmVhIHNoYXBlPSJyZWN0IiBjb29yZHM9IjIzOSw2MiwzMTksMTM0IiBocmVmPSIjYm1YTUwiIGFsdD0iIiAvPg0KLTxhcmVhIHNoYXBlPSJyZWN0IiBjb29yZHM9IjEyNywxMTIsMjE4LDE3NyIgaHJlZj0iI2JtU09BUFBNIiBhbHQ9DQotIiIgLz4NCi08YXJlYSBzaGFwZT0icmVjdCIgY29vcmRzPSIxMiwzOSw4OSw5NSIgaHJlZj0iI2JtRGVwbG95bWVudCIgYWx0PQ0KLSIiIC8+DQotPGFyZWEgc2hhcGU9InJlY3QiIGNvb3Jkcz0iMCwxMDgsOTQsMTU2IiBocmVmPSIjYm1XU0RMIiBhbHQ9IiIgLz4NCi08YXJlYSBzaGFwZT0icmVjdCIgY29vcmRzPSIzNTAsMzEsNDI2LDg2IiBocmVmPSIjYm1DbGllbnRBUEkiIGFsdD0NCi0iIiAvPg0KLTxhcmVhIHNoYXBlPSJyZWN0IiBjb29yZHM9IjM1MCwxMTQsNDIxLDE2NCIgaHJlZj0iI2JtVHJhbnNwb3J0cyINCi1hbHQ9IiIgLz48L21hcD4NCi08cD48aW1nIHNyYz0iaW1hZ2VzL2FyY2hpLWd1aWRlL2FsbC5wbmciIG5hbWU9IkdyYXBoaWMyIiB3aWR0aD0NCi0iNDI2IiBhbHQ9IiIgaGVpZ2h0PSIxODkiIGJvcmRlcj0iMCIgYWxpZ249ImJvdHRvbSIgdXNlbWFwPQ0KLSIjR3JhcGhpYzJNYXAiIGlkPSJHcmFwaGljMiIgLz48L3A+DQotPGEgbmFtZT0iYm1JbmZvTW9kIiBpZD0iYm1JbmZvTW9kIj48L2E+DQotPGgyPkluZm9ybWF0aW9uIE1vZGVsPC9oMj4NCi08cD5UaGUgSW5mb3JtYXRpb24gTW9kZWwgaGFzIHR3byBtYWluIGhpZXJhcmNoaWVzLS1Db250ZXh0cyBhbmQNCi1EZXNjcmlwdGlvbnMuIFRoaXMgbW9kZWwgaXMgZGVzY3JpYmVkIGluIFVNTCBub3RhdGlvbnMgYmVsb3cuPC9wPg0KLTxwPjxpbWcgc3JjPSJpbWFnZXMvYXJjaGktZ3VpZGUvY29udGV4dHMucG5nIiBuYW1lPSJHcmFwaGljMyINCi1hbGlnbj0iYm90dG9tIiBhbHQ9IiIgd2lkdGg9IjQwMCIgaGVpZ2h0PSI0NDMiIGJvcmRlcj0iMCIgaWQ9DQotIkdyYXBoaWMzIiAvPjwvcD4NCi08cD4oIEEgLS0tLSZsdDsmZ3Q7IEIgc2F5cywgQiBoYXMgMSBvciBtb3JlIG9iamVjdHMgb2YgQS4NCi1BLS0tLS0tJmd0O0Igc2F5cywgdGhlIGdpdmVuIHJlbGF0aW9uc2hpcCBob2xkcyBiZXR3ZWVuIEEgYW5kDQotQi4pPC9wPg0KLTxwPlRoZSB0d28gaGllcmFyY2hpZXMgYXJlIGNvbm5lY3RlZCBhcyBzaG93biBpbiB0aGUgYWJvdmUgZmlndXJlLg0KLVRoZSBEZXNjcmlwdGlvbiBoaWVyYXJjaHkgcmVwcmVzZW50cyB0aGUgc3RhdGljIGRhdGEuIFRoaXMgZGF0YSBtYXkNCi1iZSBsb2FkZWQgZnJvbSBhIGNvbmZpZ3VyYXRpb24gZmlsZSB0aGF0IGV4aXN0cyB0aHJvdWdob3V0IHRoZQ0KLWxpZmV0aW1lIG9mIEF4aXMyLiBGb3IgZXhhbXBsZSwgZGVwbG95ZWQgV2ViIHNlcnZpY2VzLCBvcGVyYXRpb25zLA0KLWV0Yy4gT24gdGhlIG90aGVyIGhhbmQsIHRoZSBjb250ZXh0IGhpZXJhcmNoeSBob2xkcyBtb3JlIGR5bmFtaWMNCi1pbmZvcm1hdGlvbiBhYm91dCBvYmplY3RzIHRoYXQgY2FuIGhhdmUgbW9yZSB0aGFuIG9uZSBpbnN0YW5jZQ0KLShlLmcuLCBNZXNzYWdlIENvbnRleHRzKS48L3A+DQotPHA+VGhlc2UgdHdvIGhpZXJhcmNoaWVzIGNyZWF0ZSBhIG1vZGVsIHRoYXQgcHJvdmlkZXMgdGhlIGFiaWxpdHkNCi10byBzZWFyY2ggZm9yIGtleS12YWx1ZSBwYWlycy4gV2hlbiB0aGUgdmFsdWVzIGFyZSBzZWFyY2hlZCBhdCBhDQotZ2l2ZW4gbGV2ZWwsIHRoZXkgYXJlIHNlYXJjaGVkIHdoaWxlIG1vdmluZyB1cCB0aGUgaGllcmFyY2h5IHVudGlsDQotYSBtYXRjaCBpcyBmb3VuZC4gSW4gdGhlIHJlc3VsdGluZyBtb2RlbCwgdGhlIGxvd2VyIGxldmVscyBvdmVycmlkZQ0KLXRoZSB2YWx1ZXMgaW4gdGhlIHVwcGVyIGxldmVscy4gRm9yIGV4YW1wbGUsIHdoZW4gYSB2YWx1ZSBpcyBsb29rZWQNCi11cCBpbiB0aGUgTWVzc2FnZSBDb250ZXh0IGFuZCBpcyBub3QgZm91bmQsIGl0IHdvdWxkIGJlIGxvb2tlZCB1cA0KLWluIHRoZSBPcGVyYXRpb24gQ29udGV4dCwgZXRjLCB1cCB0aGUgaGllcmFyY2h5LiBUaGUgU2VhcmNoIGlzDQotZmlyc3QgZG9uZSB1cCB0aGUgaGllcmFyY2h5LCBhbmQgaWYgdGhlIHN0YXJ0aW5nIHBvaW50IGlzIGEgQ29udGV4dA0KLXRoZW4gaXQgc2VhcmNoZXMgaW4gdGhlIERlc2NyaXB0aW9uIGhpZXJhcmNoeSBhcyB3ZWxsLjwvcD4NCi08cD5UaGlzIGFsbG93cyB0aGUgdXNlciB0byBkZWNsYXJlIGFuZCBvdmVycmlkZSB2YWx1ZXMsIHdpdGggdGhlDQotcmVzdWx0IGJlaW5nIGEgdmVyeSBmbGV4aWJsZSBjb25maWd1cmF0aW9uIG1vZGVsLiBUaGlzIGZsZXhpYmlsaXR5DQotY291bGQgYmUgdGhlIDxlbT5BY2hpbGxlcyBoZWVsPC9lbT4gZm9yIHRoZSBzeXN0ZW0sIGhvd2V2ZXIsIGFzDQotc2VhcmNoZXMgYXJlIGV4cGVuc2l2ZSwgZXNwZWNpYWxseSBmb3IgcGFyYW1ldGVycyB0aGF0IHR1cm4gb3V0IG5vdA0KLXRvIGV4aXN0LiBZZXQgaW4gdGhlIGZpbmFsIGFuYWx5c2lzLCB0aGUgQXhpcyBUZWFtIGJlbGlldmVzIHRoYXQNCi10aGlzIGZsZXhpYmlsaXR5IHNlcnZlcyBkZXZlbG9wZXJzIGJldHRlciBvdmVyYWxsLjwvcD4NCi08dGFibGUgd2lkdGg9Ijk1NSIgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjMiPg0KLTxjb2wgd2lkdGg9IjExMiIgLz4NCi08Y29sIHdpZHRoPSIzNzEiIC8+DQotPGNvbCB3aWR0aD0iMTAzIiAvPg0KLTxjb2wgd2lkdGg9IjMzNiIgLz4NCi08dGJvZHk+DQotPHRyPg0KLTx0ZD48c3Ryb25nPkNvbnRleHQ8L3N0cm9uZz48L3RkPg0KLTx0ZD48c3Ryb25nPkRlc2NyaXB0aW9uPC9zdHJvbmc+PC90ZD4NCi08dGQ+PHN0cm9uZz5Db25maWd1cmF0aW9uPC9zdHJvbmc+PC90ZD4NCi08dGQ+PHN0cm9uZz5EZXNjcmlwdGlvbjwvc3Ryb25nPjwvdGQ+DQotPC90cj4NCi08dHI+DQotPHRkIHdpZHRoPSIxMTIiPg0KLTxwPkNvbmZpZ3VyYXRpb24gQ29udGV4dDwvcD4NCi08L3RkPg0KLTx0ZCB3aWR0aD0iMzcxIj4NCi08cD5Ib2xkcyB0aGUgQXhpczIncyBydW4gdGltZSBzdGF0dXMuIEEgZGVlcCBjb3B5IG9mIHRoaXMgd291bGQNCi1lc3NlbnRpYWxseSBtYWtlIGEgY29weSBvZiBBeGlzMi48L3A+DQotPC90ZD4NCi08dGQgd2lkdGg9IjEwMyI+DQotPHA+QXhpcyBDb25maWd1cmF0aW9uPC9wPg0KLTwvdGQ+DQotPHRkIHdpZHRoPSIzMzYiPg0KLTxwPkhvbGRzIGFsbCBnbG9iYWwgY29uZmlndXJhdGlvbnM6IHRyYW5zcG9ydHMsIGdsb2JhbCBtb2R1bGVzLA0KLXBhcmFtZXRlcnMsIHNlcnZpY2VzLCBldGMuPC9wPg0KLTwvdGQ+DQotPC90cj4NCi08dHI+DQotPHRkIHdpZHRoPSIxMTIiPg0KLTxwPlNlcnZpY2UgR3JvdXAgQ29udGV4dDwvcD4NCi08L3RkPg0KLTx0ZCB3aWR0aD0iMzcxIj4NCi08cD5Ib2xkcyBpbmZvcm1hdGlvbiBhYm91dCBhIHBhcnRpY3VsYXIgdXNhZ2Ugb2YgdGhlIHJlc3BlY3RpdmUNCi1zZXJ2aWNlIGdyb3VwLiBUaGUgbGlmZSBvZiBhIFNlcnZpY2UgR3JvdXAgQ29udGV4dCBzdGFydHMgd2hlbiBhDQotdXNlciBzdGFydHMgaW50ZXJhY3Rpbmcgd2l0aCBhIHNlcnZpY2UgdGhhdCBiZWxvbmdzIHRvIHRoaXMgc2VydmljZQ0KLWdyb3VwLiBUaGlzIGNhbiBiZSB1c2VkIHRvIHNoYXJlIGluZm9ybWF0aW9uIGJldHdlZW4gc2VydmljZXMNCi0od2l0aGluIHRoZSBzYW1lIHNlcnZpY2UgZ3JvdXApIGluIGEgc2luZ2xlIGludGVyYWN0aW9uLjwvcD4NCi08L3RkPg0KLTx0ZCB3aWR0aD0iMTAzIj4NCi08cD5BeGlzU2VydmljZUdyb3VwPC9wPg0KLTwvdGQ+DQotPHRkIHdpZHRoPSIzMzYiPg0KLTxwPkhvbGRzIGRlcGxveW1lbnQgdGltZSBpbmZvcm1hdGlvbiBhYm91dCBhIHBhcnRpY3VsYXIgc2VydmljZQ0KLWdyb3VwLjwvcD4NCi08L3RkPg0KLTwvdHI+DQotPHRyPg0KLTx0ZCB3aWR0aD0iMTEyIj4NCi08cD5TZXJ2aWNlIENvbnRleHQ8L3A+DQotPC90ZD4NCi08dGQgd2lkdGg9IjM3MSI+DQotPHA+VGhpcyBjb250ZXh0IGlzIGF2YWlsYWJsZSB0aHJvdWdob3V0IHRoZSB1c2FnZSBvZiB0aGUgcmVzcGVjdGl2ZQ0KLXNlcnZpY2UuIFRoaXMgY2FuIGJlIHVzZWQgdG8gc2hhcmUgaW5mb3JtYXRpb24gYmV0d2VlbiBzZXZlcmFsIE1FUHMNCi1vZiB0aGUgc2FtZSBzZXJ2aWNlLCB3aXRoaW4gYSBzaW5nbGUgaW50ZXJhY3Rpb24uIFRoZSBsaWZlIGN5Y2xlDQotZGVwZW5kcyBvbiB0aGUgc2NvcGUgb2YgdGhlIHNlcnZpY2UuPC9wPg0KLTwvdGQ+DQotPHRkIHdpZHRoPSIxMDMiPg0KLTxwPkF4aXNTZXJ2aWNlPC9wPg0KLTwvdGQ+DQotPHRkIHdpZHRoPSIzMzYiPg0KLTxwPkhvbGRzIHRoZSBPcGVyYXRpb25zIGFuZCB0aGUgc2VydmljZSBsZXZlbCBjb25maWd1cmF0aW9uczwvcD4NCi08L3RkPg0KLTwvdHI+DQotPHRyPg0KLTx0ZCB3aWR0aD0iMTEyIj4NCi08cD5PcGVyYXRpb24gQ29udGV4dDwvcD4NCi08L3RkPg0KLTx0ZCB3aWR0aD0iMzcxIj4NCi08cD5Ib2xkcyB0aGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGN1cnJlbnQgTUVQIGluc3RhbmNlLCBtYWludGFpbnMNCi10aGUgbWVzc2FnZXMgaW4gdGhlIGN1cnJlbnQgTUVQIGV0Yy48L3A+DQotPC90ZD4NCi08dGQgd2lkdGg9IjEwMyI+DQotPHA+QXhpc09wZXJhdGlvbjwvcD4NCi08L3RkPg0KLTx0ZCB3aWR0aD0iMzM2Ij4NCi08cD5Ib2xkcyB0aGUgb3BlcmF0aW9uIGxldmVsIGNvbmZpZ3VyYXRpb25zPC9wPg0KLTwvdGQ+DQotPC90cj4NCi08dHI+DQotPHRkIHdpZHRoPSIxMTIiPjxhIG5hbWU9Im1lc3NhZ2VDb250ZXh0IiBpZD0ibWVzc2FnZUNvbnRleHQiPjwvYT4NCi08cD5NZXNzYWdlIENvbnRleHQ8L3A+DQotPC90ZD4NCi08dGQgd2lkdGg9IjM3MSI+DQotPHA+SG9sZHMgYWxsIHRoZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbWVzc2FnZSBjdXJyZW50bHkgYmVpbmcNCi1leGVjdXRlZC48L3A+DQotPC90ZD4NCi08dGQgd2lkdGg9IjEwMyI+DQotPHA+QXhpc01lc3NhZ2U8L3A+DQotPC90ZD4NCi08dGQgd2lkdGg9IjMzNiI+DQotPHA+SG9sZHMgbWVzc2FnZSBsZXZlbCBzdGF0aWMgaW5mb3JtYXRpb24gbGlrZSB0aGUgc2NoZW1hIG9mIHRoZQ0KLXBhcnRpY3VsYXIgbWVzc2FnZS48L3A+DQotPC90ZD4NCi08L3RyPg0KLTwvdGJvZHk+DQotPC90YWJsZT4NCi08YSBuYW1lPSJibVhNTCIgaWQ9ImJtWE1MIj48L2E+DQotPGgyPlhNTCBQcm9jZXNzaW5nIE1vZGVsPC9oMj4NCi08cD5BcyBtZW50aW9uZWQgYWJvdmUsIHRoZSBYTUwgcHJvY2Vzc2luZyBtb2RlbCBvZiBBeGlzMiBoYXMgYmVjb21lDQotYSBzZXBhcmF0ZSBzdWItcHJvamVjdCwgY2FsbGVkIDxhIGhyZWY9DQotImh0dHA6Ly93cy5hcGFjaGUub3JnL2NvbW1vbnMvYXhpb20vaW5kZXguaHRtbCI+QXBhY2hlIEF4aW9tPC9hPiwNCi1pbiB0aGUgQXBhY2hlIFdlYiBzZXJ2aWNlcyBwcm9qZWN0LiBQbGVhc2UgcmVmZXIgdG8gdGhlIDxhIGhyZWY9DQotIk9NVHV0b3JpYWwuaHRtbCI+T00gVHV0b3JpYWw8L2E+IGZvciBtb3JlIGluZm9ybWF0aW9uLjwvcD4NCi08YSBuYW1lPSJibVNPQVBQTSIgaWQ9ImJtU09BUFBNIj48L2E+DQotPGgyPlNPQVAgUHJvY2Vzc2luZyBNb2RlbDwvaDI+DQotPHA+PGltZyBzcmM9ImltYWdlcy9hcmNoaS1ndWlkZS9zb2FwLXByb2Nlc3NpbmcuZ2lmIiBuYW1lPQ0KLSJHcmFwaGljNCIgYWx0PSIiIGFsaWduPSJib3R0b20iIHdpZHRoPSI3NTUiIGhlaWdodD0iMzQ4IiBib3JkZXI9DQotIjAiIGlkPSJHcmFwaGljNCIgLz48L3A+DQotPHA+VGhlIGFyY2hpdGVjdHVyZSBpZGVudGlmaWVkIHR3byBiYXNpYyBhY3Rpb25zIGEgU09BUCBwcm9jZXNzb3INCi1zaG91bGQgcGVyZm9ybSwgc2VuZGluZyBhbmQgcmVjZWl2aW5nIFNPQVAgbWVzc2FnZXMuIFRoZQ0KLWFyY2hpdGVjdHVyZSBwcm92aWRlcyB0d28gcGlwZXMgKG9yIGZsb3dzKSB0byBwZXJmb3JtIHRoZXNlIHR3bw0KLWJhc2ljIGFjdGlvbnMuIFRoZSBBeGlzIEVuZ2luZSBvciB0aGUgZHJpdmVyIG9mIEF4aXMyIGRlZmluZXMgdHdvDQotbWV0aG9kcywgc2VuZCgpIGFuZCByZWNlaXZlKCksIHRvIGltcGxlbWVudCB0aGVzZSB0d28gcGlwZXMuIFRoZQ0KLXR3byBwaXBlcyBhcmUgbmFtZWQgPGk+PGI+SW48L2I+IFBpcGU8L2k+IGFuZCA8aT48Yj5PdXQ8L2I+DQotUGlwZTwvaT4sIGFuZCBjb21wbGV4IE1lc3NhZ2UgRXhjaGFuZ2UgUGF0dGVybnMgKE1FUHMpIGFyZQ0KLWNvbnN0cnVjdGVkIGJ5IGNvbWJpbmluZyB0aGVzZSB0d28gcGlwZXMuPC9wPg0KLTxwPkV4dGVuc2liaWxpdHkgb2YgdGhlIFNPQVAgcHJvY2Vzc2luZyBtb2RlbCBpcyBwcm92aWRlZCB0aHJvdWdoDQotaGFuZGxlcnMuIFdoZW4gYSBTT0FQIG1lc3NhZ2UgaXMgYmVpbmcgcHJvY2Vzc2VkLCB0aGUgaGFuZGxlcnMgdGhhdA0KLWFyZSByZWdpc3RlcmVkIHdpbGwgYmUgZXhlY3V0ZWQuIFRoZSBoYW5kbGVycyBjYW4gYmUgcmVnaXN0ZXJlZCBpbg0KLWdsb2JhbCwgc2VydmljZSwgb3Igb3BlcmF0aW9uIHNjb3BlIGFuZCB0aGUgZmluYWwgaGFuZGxlciBjaGFpbiBpcw0KLWNhbGN1bGF0ZWQgY29tYmluaW5nIHRoZSBoYW5kbGVycyBmcm9tIGFsbCB0aGUgc2NvcGVzLjwvcD4NCi08cD5UaGUgaGFuZGxlcnMgYWN0IGFzIGludGVyY2VwdG9ycyBhbmQgdGhleSBwcm9jZXNzIHBhcnRzIG9mIHRoZQ0KLVNPQVAgbWVzc2FnZSBhbmQgcHJvdmlkZSBhZGQtb24gc2VydmljZXMuIFVzdWFsbHkgaGFuZGxlcnMgd29yayBvbg0KLXRoZSBTT0FQIGhlYWRlcnMsIHlldCB0aGV5IG1heSBhY2Nlc3Mgb3IgY2hhbmdlIHRoZSBTT0FQIGJvZHkgYXMNCi13ZWxsLjwvcD4NCi08cD5XaGVuIGEgU09BUCBtZXNzYWdlIGlzIGJlaW5nIHNlbnQgdGhyb3VnaCB0aGUgQ2xpZW50IEFQSSwgYW4NCi08aT5PdXQgUGlwZTwvaT4gYWN0aXZhdGVzLiBUaGUgPGk+T3V0IFBpcGU8L2k+IHdpbGwgaW52b2tlIHRoZQ0KLWhhbmRsZXJzIGFuZCBlbmQgd2l0aCBhIFRyYW5zcG9ydCBTZW5kZXIgdGhhdCBzZW5kcyB0aGUgU09BUA0KLW1lc3NhZ2UgdG8gdGhlIHRhcmdldCBlbmRwb2ludC4gVGhlIFNPQVAgbWVzc2FnZSBpcyByZWNlaXZlZCBieSBhDQotVHJhbnNwb3J0IFJlY2VpdmVyIGF0IHRoZSB0YXJnZXQgZW5kcG9pbnQsIHdoaWNoIHJlYWRzIHRoZSBTT0FQDQotbWVzc2FnZSBhbmQgc3RhcnRzIHRoZSA8aT5JbiBQaXBlPC9pPi4gVGhlIDxlbT5JbiBQaXBlPC9lbT4NCi1jb25zaXN0cyBvZiBoYW5kbGVycyBhbmQgZW5kcyB3aXRoIHRoZSA8YSBocmVmPSIjbXIiPk1lc3NhZ2UNCi1SZWNlaXZlcjwvYT4sIHdoaWNoIGNvbnN1bWVzIHRoZSBTT0FQIG1lc3NhZ2UuPC9wPg0KLTxwPlRoZSBwcm9jZXNzaW5nIGV4cGxhaW5lZCBhYm92ZSBoYXBwZW5zIGZvciBlYWNoIGFuZCBldmVyeSBTT0FQDQotbWVzc2FnZSB0aGF0IGlzIGV4Y2hhbmdlZC4gQWZ0ZXIgcHJvY2Vzc2luZyBvbmUgbWVzc2FnZSwgQXhpczIgbWF5DQotZGVjaWRlIHRvIGNyZWF0ZSBvdGhlciBTT0FQIG1lc3NhZ2VzLCBpbiB3aGljaCBjYXNlIG1vcmUgY29tcGxleA0KLW1lc3NhZ2UgcGF0dGVybnMgZW1lcmdlLiBIb3dldmVyLCBBeGlzMiBhbHdheXMgdmlld3MgdGhlIFNPQVANCi1tZXNzYWdlIGluIHRlcm1zIG9mIHByb2Nlc3NpbmcgYSBzaW5nbGUgbWVzc2FnZS4gVGhlIGNvbWJpbmF0aW9uIG9mDQotdGhlIG1lc3NhZ2VzIGFyZSBsYXllcmVkIG9uIHRvcCBvZiB0aGF0IGJhc2ljIGZyYW1ld29yay48L3A+DQotPHA+VGhlIHR3byBwaXBlcyBkbyBub3QgZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIHRoZSBTZXJ2ZXIgYW5kIHRoZQ0KLUNsaWVudC4gVGhlIFNPQVAgUHJvY2Vzc2luZyBNb2RlbCBoYW5kbGVzIHRoZSBjb21wbGV4aXR5IGFuZA0KLXByb3ZpZGVzIHR3byBhYnN0cmFjdCBwaXBlcyB0byB0aGUgdXNlci4gVGhlIGRpZmZlcmVudCBhcmVhcyBvciB0aGUNCi1zdGFnZXMgb2YgdGhlIHBpcGVzIGFyZSBjYWxsZWQgJ3BoYXNlcycgd2l0aGluIEF4aXMyLiBBIEhhbmRsZXINCi1hbHdheXMgcnVucyBpbnNpZGUgYSBzcGVjaWZpYyBwaGFzZSwgYW5kIHRoZSBwaGFzZSBwcm92aWRlcyBhDQotbWVjaGFuaXNtIHRvIHNwZWNpZnkgdGhlIG9yZGVyaW5nIG9mIGhhbmRsZXJzLiBCb3RoIFBpcGVzIGhhdmUNCi1idWlsdC1pbiBwaGFzZXMsIGFuZCBib3RoIGRlZmluZSB0aGUgYXJlYXMgZm9yICdVc2VyIFBoYXNlcycgd2hpY2gNCi1jYW4gYmUgZGVmaW5lZCBieSB0aGUgdXNlci48L3A+DQotPGEgbmFtZT0iZGVmYXVsdCIgaWQ9ImRlZmF1bHQiPjwvYT4NCi08aDM+QXhpczIgRGVmYXVsdCBQcm9jZXNzaW5nIE1vZGVsPC9oMz4NCi08cD5BeGlzMiBoYXMgc29tZSBpbmJ1aWx0IGhhbmRsZXJzIHRoYXQgcnVuIGluIGluYnVpbHQgcGhhc2VzIGFuZA0KLXRoZXkgY3JlYXRlIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZm9yIEF4aXMyLiBXZSB3aWxsIGJlIGxvb2tpbmcNCi1tb3JlIGluIHRvIGhvdyB0byBleHRlbmQgdGhlIGRlZmF1bHQgcHJvY2Vzc2luZyBNb2RlbCBpbiB0aGUgbmV4dA0KLXNlY3Rpb24uPC9wPg0KLVRoZXJlIGFyZSB0aHJlZSBzcGVjaWFsIGhhbmRsZXJzIGRlZmluZWQgaW4gQXhpczIuDQotPG9sPg0KLTxsaT5EaXNwYXRjaGVycyAtIEZpbmRzIHRoZSBzZXJ2aWNlIGFuZCB0aGUgb3BlcmF0aW9uIHRoZSBTT0FQDQotbWVzc2FnZSBpcyBkaXJlY3RlZCB0by4gRGlzcGF0Y2hlcnMgYWx3YXlzIHJ1biBvbiB0aGUNCi08ZW0+SW4tUGlwZTwvZW0+IGFuZCBpbnNpZGUgdGhlIERpc3BhdGNoIHBoYXNlLiBUaGUgaW4tYnVpbHQNCi1kaXNwYXRjaGVycyBkaXNwYXRjaCB0byBhIHBhcnRpY3VsYXIgb3BlcmF0aW9uIGRlcGVuZGluZyBvbiB2YXJpb3VzDQotY29uZGl0aW9ucyBsaWtlIFdTLUFkZHJlc3NpbmcgaW5mb3JtYXRpb24sIFVSSSBpbmZvcm1hdGlvbiwgU09BUA0KLWFjdGlvbiBpbmZvcm1hdGlvbiwgZXRjLiAoIFNlZSBtb3JlIGluZm9ybWF0aW9uIG9uIDxhIGhyZWY9DQotImh0dHA6Ly93d3cud3NvMi5uZXQvdHV0b3JpYWxzL2F4aXMyL2phdmEvMjAwNi8wNi8xOC9vcGVyYXRpb24tc2VydmljZS1tZXNzYWdlLWlzLWRlc3RpbmVkLXRvIj4NCi1EaXNwYXRjaGluZzwvYT4pPC9saT4NCi08L29sPg0KLTx1bD4NCi08bGk+PGEgbmFtZT0ibXIiIGlkPSJtciI+PC9hPk1lc3NhZ2UgUmVjZWl2ZXIgLSBDb25zdW1lcyB0aGUgU09BUA0KLW1lc3NhZ2UgYW5kIGhhbmRzIGl0IG92ZXIgdG8gdGhlIGFwcGxpY2F0aW9uLiBUaGUgbWVzc2FnZSByZWNlaXZlcg0KLWlzIHRoZSBsYXN0IGhhbmRsZXIgb2YgdGhlIGluLXBpcGU8L2xpPg0KLTxsaT4NCi08cD5UcmFuc3BvcnQgU2VuZGVyIC0gU2VuZHMgdGhlIFNPQVAgbWVzc2FnZSB0byB0aGUgU09BUCBlbmRwb2ludA0KLXRoZSBtZXNzYWdlIGlzIGRlc3RpbmVkIHRvLiBBbHdheXMgcnVucyBhcyB0aGUgbGFzdCBoYW5kbGVyIGluIHRoZQ0KLW91dC1waXBlPC9wPg0KLTwvbGk+DQotPC91bD4NCi08YSBuYW1lPSJpbmNvbWluZ3NvYXAiIGlkPSJpbmNvbWluZ3NvYXAiPjwvYT4NCi08aDM+UHJvY2Vzc2luZyBhbiBJbmNvbWluZyBTT0FQIE1lc3NhZ2U8L2gzPg0KLTxwPkFuIGluY29taW5nIFNPQVAgbWVzc2FnZSBpcyBhbHdheXMgcmVjZWl2ZWQgYnkgYSBUcmFuc3BvcnQNCi1SZWNlaXZlciB3YWl0aW5nIGZvciB0aGUgU09BUCBtZXNzYWdlcy4gT25jZSB0aGUgU09BUCBtZXNzYWdlDQotYXJyaXZlcywgdGhlIHRyYW5zcG9ydCBIZWFkZXJzIGFyZSBwYXJzZWQgYW5kIGEgPGEgaHJlZj0NCi0iI21lc3NhZ2VDb250ZXh0Ij5NZXNzYWdlIENvbnRleHQ8L2E+IGlzIGNyZWF0ZWQgZnJvbSB0aGUgaW5jb21pbmcNCi1TT0FQIG1lc3NhZ2UuIFRoaXMgbWVzc2FnZSBjb250ZXh0IGVuY2Fwc3VsYXRlcyBhbGwgdGhlDQotaW5mb3JtYXRpb24sIGluY2x1ZGluZyB0aGUgU09BUCBtZXNzYWdlIGl0c2VsZiwgdHJhbnNwb3J0IGhlYWRlcnMsDQotZXRjLiwgaW5zaWRlIGl0LiBUaGVuIHRoZSA8aT5JbiBQaXBlPC9pPiBpcyBleGVjdXRlZCB3aXRoIHRoZQ0KLU1lc3NhZ2UgQ29udGV4dC48L3A+DQotPHA+TGV0IHVzIHNlZSB3aGF0IGhhcHBlbnMgYXQgZWFjaCBwaGFzZSBvZiB0aGUgZXhlY3V0aW9uLiBUaGlzDQotcHJvY2VzcyBjYW4gaGFwcGVuIGluIHRoZSBzZXJ2ZXIgb3IgaW4gdGhlIGNsaWVudC48L3A+DQotPG9sPg0KLTxsaT48c3Ryb25nPlRyYW5zcG9ydCBQaGFzZTwvc3Ryb25nPiAtIFRoZSBoYW5kbGVycyBhcmUgaW4gdGhlDQotcGhhc2UgdGhhdCBwcm9jZXNzZXMgdHJhbnNwb3J0IHNwZWNpZmljIGluZm9ybWF0aW9uIHN1Y2ggYXMNCi12YWxpZGF0aW5nIGluY29taW5nIG1lc3NhZ2VzIGJ5IGxvb2tpbmcgYXQgdmFyaW91cyB0cmFuc3BvcnQNCi1oZWFkZXJzLCBhZGRpbmcgZGF0YSBpbnRvIG1lc3NhZ2UgY29udGV4dHMsIGV0Yy48L2xpPg0KLTxsaT48c3Ryb25nPlByZS1EaXNwYXRjaCBQaGFzZTwvc3Ryb25nPi0gVGhlIG1haW4gZnVuY3Rpb25hbGl0eSBvZg0KLXRoZSBoYW5kbGVycyBpbiB0aGlzIHBoYXNlIGlzIHRvIHBvcHVsYXRlIG1lc3NhZ2UgY29udGV4dCB0byBkbyB0aGUNCi1kaXNwYXRjaGluZy4gRm9yIGV4YW1wbGUsIHByb2Nlc3Npbmcgb2YgYWRkcmVzc2luZyBoZWFkZXJzIG9mIHRoZQ0KLVNPQVAgbWVzc2FnZSwgaWYgYW55LCBoYXBwZW5zIGluIHRoaXMgcGhhc2UuIEFkZHJlc3NpbmcgaGFuZGxlcnMNCi1leHRyYWN0IGluZm9ybWF0aW9uIGFuZCBwdXQgdGhlbSBpbiB0byB0aGUgbWVzc2FnZSBjb250ZXh0LjwvbGk+DQotPGxpPjxzdHJvbmc+RGlzcGF0Y2ggUGhhc2U8L3N0cm9uZz4gLSBUaGUgRGlzcGF0Y2hlcnMgcnVuIGluIHRoaXMNCi1waGFzZSBhbmQgdHJ5IHRvIGZpbmQgdGhlIGNvcnJlY3Qgc2VydmljZSBhbmQgb3BlcmF0aW9uIHRoaXMNCi1wYXJ0aWN1bGFyIG1lc3NhZ2UgaXMgZGVzdGluZWQgZm9yLjxiciAvPg0KLVRoZSBwb3N0IGNvbmRpdGlvbiBvZiB0aGUgZGlzcGF0Y2ggcGhhc2UgKGFueSBwaGFzZSBjYW4gY29udGFpbiBhDQotcG9zdCBjb25kaXRpb24pIGNoZWNrcyB3aGV0aGVyIGEgc2VydmljZSBhbmQgYW4gb3BlcmF0aW9uIHdlcmUNCi1mb3VuZCBieSB0aGUgZGlzcGF0Y2hlcnMuIElmIG5vdCwgdGhlIGV4ZWN1dGlvbiB3aWxsIGhhbHQgYW5kDQotcmV0dXJuIGEgInNlcnZpY2Ugbm90IGZvdW5kJyBlcnJvci48L2xpPg0KLTxsaT48c3Ryb25nPlVzZXIgRGVmaW5lZCBQaGFzZXM8L3N0cm9uZz4gLSBVc2VycyBjYW4gZW5nYWdlIHRoZWlyDQotY3VzdG9tIGhhbmRsZXJzIGhlcmUuPC9saT4NCi08bGk+PHN0cm9uZz5NZXNzYWdlIFZhbGlkYXRpb24gUGhhc2U8L3N0cm9uZz4gLSBPbmNlIHRoZSB1c2VyIGxldmVsDQotZXhlY3V0aW9uIGhhcyB0YWtlbiBwbGFjZSwgdGhpcyBwaGFzZSB2YWxpZGF0ZXMgd2hldGhlciBTT0FQDQotTWVzc2FnZSBQcm9jZXNzaW5nIGhhcyB0YWtlbiBwbGFjZSBjb3JyZWN0bHkuPC9saT4NCi08bGk+PHN0cm9uZz5NZXNzYWdlIFByb2Nlc3NpbmcgUGhhc2U8L3N0cm9uZz4gLSBUaGUgQnVzaW5lc3MgbG9naWMNCi1vZiB0aGUgU09BUCBtZXNzYWdlIGlzIGV4ZWN1dGVkIGhlcmUuIEEgPGEgaHJlZj0iI21yIj5NZXNzYWdlDQotUmVjZWl2ZXI8L2E+IGlzIHJlZ2lzdGVyZWQgd2l0aCBlYWNoIE9wZXJhdGlvbi4gVGhpcyBtZXNzYWdlDQotcmVjZWl2ZXIgKGFzc29jaWF0ZWQgdG8gdGhlIHBhcnRpY3VsYXIgb3BlcmF0aW9uKSB3aWxsIGJlIGV4ZWN1dGVkDQotYXMgdGhlIGxhc3QgaGFuZGxlciBvZiB0aGlzIHBoYXNlLjwvbGk+DQotPC9vbD4NCi08cD5UaGVyZSBtYXkgYmUgb3RoZXIgaGFuZGxlcnMgaW4gYW55IG9mIHRoZXNlIHBoYXNlcy4gVXNlcnMgbWF5DQotdXNlIGN1c3RvbSBoYW5kbGVycyB0byBvdmVycmlkZSB0aGUgcHJvY2Vzc2luZyBsb2dpYyBpbiBlYWNoIG9mDQotdGhlc2UgcGhhc2VzLjwvcD4NCi08YSBuYW1lPSJvdXRnb2luZyIgaWQ9Im91dGdvaW5nIj48L2E+DQotPGgzPlByb2Nlc3Npbmcgb2YgdGhlIE91dGdvaW5nIE1lc3NhZ2U8L2gzPg0KLTxwPlRoZSA8ZW0+T3V0IFBpcGU8L2VtPiBpcyBzaW1wbGVyIGJlY2F1c2UgdGhlIHNlcnZpY2UgYW5kIHRoZQ0KLW9wZXJhdGlvbiB0byBkaXNwYXRjaCBhcmUga25vd24gYnkgdGhlIHRpbWUgdGhlIHBpcGUgaXMgZXhlY3V0ZWQuDQotVGhlIDxlbT5PdXQgUGlwZTwvZW0+IG1heSBiZSBpbml0aWF0ZWQgYnkgdGhlPC9wPg0KLTxhIGhyZWY9IiNtciI+TWVzc2FnZSBSZWNlaXZlcjwvYT4gb3IgdGhlIENsaWVudCBBUEkNCi1pbXBsZW1lbnRhdGlvbi4gUGhhc2VzIG9mIHRoZSA8ZW0+T3V0IFBpcGU8L2VtPiBhcmUgZGVzY3JpYmVkDQotYmVsb3c6DQotPG9sPg0KLTxsaT48c3Ryb25nPk1lc3NhZ2UgSW5pdGlhbGl6ZSBQaGFzZTwvc3Ryb25nPiAtIEZpcnN0IHBoYXNlIG9mIHRoZQ0KLTxlbT5PdXQgUGlwZTwvZW0+LiBTZXJ2ZXMgYXMgdGhlIHBsYWNlaG9sZGVyIGZvciB0aGUgY3VzdG9tDQotaGFuZGxlcnMuPC9saT4NCi08bGk+PHN0cm9uZz5Vc2VyIFBoYXNlczwvc3Ryb25nPiAtIEV4ZWN1dGVzIGhhbmRsZXJzIGluDQotdXNlci1kZWZpbmVkIHBoYXNlcy48L2xpPg0KLTxsaT48c3Ryb25nPlRyYW5zcG9ydHMgUGhhc2U8L3N0cm9uZz4gLSBFeGVjdXRlcyBhbnkgdHJhbnNwb3J0DQotaGFuZGxlcnMgdGFrZW4gZnJvbSB0aGUgYXNzb2NpYXRlZCB0cmFuc3BvcnQgY29uZmlndXJhdGlvbi4gVGhlDQotbGFzdCBoYW5kbGVyIHdvdWxkIGJlIGEgdHJhbnNwb3J0IHNlbmRlciB3aGljaCB3aWxsIHNlbmQgdGhlIFNPQVANCi1tZXNzYWdlIHRvIHRoZSB0YXJnZXQgZW5kcG9pbnQuPC9saT4NCi08L29sPg0KLTxhIG5hbWU9ImV4dGVuZGluZyIgaWQ9ImV4dGVuZGluZyI+PC9hPg0KLTxoMz5FeHRlbmRpbmcgdGhlIFNPQVAgUHJvY2Vzc2luZyBNb2RlbDwvaDM+DQotPHA+QWJvdmUsIHdlIGRpc2N1c3NlZCB0aGUgZGVmYXVsdCBwcm9jZXNzaW5nIG1vZGVsIG9mIEF4aXMyLiBOb3cNCi1sZXQgdXMgZGlzY3VzcyB0aGUgZXh0ZW5zaW9uIG1lY2hhbmlzbSBmb3IgdGhlIFNPQVAgcHJvY2Vzc2luZw0KLW1vZGVsLiBBZnRlciBhbGwsIHRoZSB3aG9sZSBlZmZvcnQgb2YgbWFraW5nIHRoaXMgU09BUA0KLWVuZ2luZS9wcm9jZXNzaW5nIG1vZGVsIHdhcyBmb2N1c2VkIG9uIG1ha2luZyBpdCBleHRlbmRhYmxlLjwvcD4NCi08cD5UaGUgaWRlYSBiZWhpbmQgaW50cm9kdWNpbmcgc3RlcC13aXNlIHByb2Nlc3Npbmcgb2YgdGhlIFNPQVANCi1tZXNzYWdlIGluIHRlcm1zIG9mIGhhbmRsZXJzIGFuZCBwaGFzZXMgaXMgdG8gYWxsb3cgZWFzaWVyDQotbW9kaWZpY2F0aW9uIG9mIHRoZSBwcm9jZXNzaW5nIG9yZGVyLiBUaGUgbm90aW9uIG9mIHBoYXNlcyBtYWtlcyBpdA0KLWVhc2llciB0byBwbGFjZSBoYW5kbGVycyBpbiBiZXR3ZWVuIG90aGVyIGhhbmRsZXJzLiBUaGlzIGVuYWJsZXMNCi1tb2RpZmljYXRpb24gb2YgdGhlIGRlZmF1bHQgcHJvY2Vzc2luZyBiZWhhdmlvci4gVGhlIFNPQVANCi1Qcm9jZXNzaW5nIE1vZGVsIGNhbiBiZSBleHRlbmRlZCB3aXRoIDxhIGhyZWY9DQotIiNleHRlbmRpbmd3aXRoaGFuZGxlcnMiPmhhbmRsZXJzPC9hPiBvciA8YSBocmVmPQ0KLSIjZXh0ZW5kaW5nd2l0aG1vZHVsZXMiPm1vZHVsZXM8L2E+LjwvcD4NCi08aDQ+RXh0ZW5kaW5nIHRoZSBTT0FQIFByb2Nlc3NpbmcgTW9kZWwgd2l0aCBIYW5kbGVyczwvaDQ+DQotPHA+VGhlIGhhbmRsZXJzIGluIGEgbW9kdWxlIGNhbiBzcGVjaWZ5IHRoZSBwaGFzZSB0aGV5IG5lZWQgdG8gYmUNCi1wbGFjZWQgaW4uIEZ1cnRoZXJtb3JlLCB0aGV5IGNhbiBzcGVjaWZ5IHRoZWlyIGxvY2F0aW9uIGluc2lkZSBhDQotcGhhc2UgYnkgcHJvdmlkaW5nIHBoYXNlIHJ1bGVzLiBQaGFzZSBydWxlcyB3aWxsIHBsYWNlIGENCi1oYW5kbGVyLDwvcD4NCi08b2w+DQotPGxpPmFzIHRoZSBmaXJzdCBoYW5kbGVyIGluIGEgcGhhc2UsPC9saT4NCi08bGk+YXMgdGhlIGxhc3QgaGFuZGxlciBpbiBhIHBoYXNlLDwvbGk+DQotPGxpPmJlZm9yZSBhIGdpdmVuIGhhbmRsZXIsPC9saT4NCi08bGk+b3IgYWZ0ZXIgYSBnaXZlbiBoYW5kbGVyLjwvbGk+DQotPC9vbD4NCi08YSBuYW1lPSJleHRlbmRpbmd3aXRobW9kdWxlcyIgaWQ9ImV4dGVuZGluZ3dpdGhtb2R1bGVzIj48L2E+DQotPGg0PkV4dGVuZGluZyB0aGUgU09BUCBQcm9jZXNzaW5nIE1vZGVsIHdpdGggTW9kdWxlczwvaDQ+DQotPHA+QXhpczIgZGVmaW5lcyBhbiBlbnRpdHkgY2FsbGVkIGEgJ21vZHVsZScgdGhhdCBjYW4gaW50cm9kdWNlDQotaGFuZGxlcnMgYW5kIFdlYiBzZXJ2aWNlIG9wZXJhdGlvbnMuIEEgTW9kdWxlIGluIHRlcm1zIG9mIEF4aXMyDQotdXN1YWxseSBhY3RzIGFzIGEgY29udmVuaWVudCBwYWNrYWdpbmcgdGhhdCBpbmNsdWRlczo8L3A+DQotPHVsPg0KLTxsaT5BIHNldCBvZiBoYW5kbGVycyBhbmQ8L2xpPg0KLTxsaT5BbiBhc3NvY2lhdGVkIGRlc2NyaXB0b3Igd2hpY2ggaW5jbHVkZXMgdGhlIHBoYXNlIHJ1bGVzPC9saT4NCi08L3VsPg0KLTxwPk1vZHVsZXMgaGF2ZSB0aGUgY29uY2VwdCBvZiBiZWluZyAnYXZhaWxhYmxlJyBhbmQgJ2VuZ2FnZWQnLg0KLSdBdmFpbGFiaWxpdHknIG1lYW5zIHRoZSBtb2R1bGUgaXMgcHJlc2VudCBpbiB0aGUgc3lzdGVtLCBidXQgaGFzDQotbm90IGJlZW4gYWN0aXZhdGVkLCBpLmUuLCB0aGUgaGFuZGxlcnMgaW5jbHVkZWQgaW5zaWRlIHRoZSBtb2R1bGUNCi1oYXZlIG5vdCBiZWVuIHVzZWQgaW4gdGhlIHByb2Nlc3NpbmcgbWVjaGFuaXNtLiBXaGVuIGEgbW9kdWxlIGlzDQotJ2VuZ2FnZWQnIGl0IGJlY29tZXMgYWN0aXZlIGFuZCB0aGUgaGFuZGxlcnMgZ2V0IHBsYWNlZCBpbiB0aGUNCi1wcm9wZXIgcGhhc2VzLiBUaGUgaGFuZGxlcnMgd2lsbCBhY3QgaW4gdGhlIHNhbWUgd2F5IGFzIGV4cGxhaW5lZA0KLWluIHRoZSBwcmV2aW91cyBzZWN0aW9uLiBVc3VhbGx5IGEgbW9kdWxlIHdpbGwgYmUgdXNlZCB0byBpbXBsZW1lbnQNCi1hIFdTLSogZnVuY3Rpb25hbGl0eSBzdWNoIGFzIFdTLUFkZHJlc3NpbmcuPC9wPg0KLTxwPkFwYXJ0IGZyb20gdGhlIGV4dGVuc2lvbiBtZWNoYW5pc20gYmFzZWQgb24gdGhlIGhhbmRsZXJzLCB0aGUNCi1XUy0qIHNwZWNpZmljYXRpb25zIG1heSBzdWdnZXN0IGEgcmVxdWlyZW1lbnQgZm9yIGFkZGluZyBuZXcNCi1vcGVyYXRpb25zLiBGb3IgZXhhbXBsZSwgb25jZSBhIHVzZXIgYWRkcyBSZWxpYWJsZSBNZXNzYWdpbmcNCi1jYXBhYmlsaXR5IHRvIGEgc2VydmljZSwgdGhlICJDcmVhdGUgU2VxdWVuY2UiIG9wZXJhdGlvbiBuZWVkcyB0bw0KLWJlIGF2YWlsYWJsZSB0byB0aGUgc2VydmljZSBlbmRwb2ludC4gVGhpcyBjYW4gYmUgaW1wbGVtZW50ZWQgYnkNCi1sZXR0aW5nIHRoZSBtb2R1bGVzIGRlZmluZSB0aGUgb3BlcmF0aW9ucy4gT25jZSB0aGUgbW9kdWxlIGlzDQotZW5nYWdlZCB0byBhIHNlcnZpY2UsIHRoZSBuZWNlc3Nhcnkgb3BlcmF0aW9ucyB3aWxsIGJlIGFkZGVkIHRvDQotdGhhdCBzZXJ2aWNlLjwvcD4NCi08cD5BIHNlcnZpY2UsIG9wZXJhdGlvbiwgb3IgdGhlIHN5c3RlbSBtYXkgZW5nYWdlIGEgbW9kdWxlLiBPbmNlDQotdGhlIG1vZHVsZSBpcyBlbmdhZ2VkLCB0aGUgaGFuZGxlcnMgYW5kIHRoZSBvcGVyYXRpb25zIGRlZmluZWQgaW4NCi10aGUgbW9kdWxlIGFyZSBhZGRlZCB0byB0aGUgZW50aXR5IHRoYXQgZW5nYWdlZCB0aGVtLjwvcD4NCi08cD5Nb2R1bGVzIGNhbm5vdCBiZSBhZGRlZCAobm8gaG90IGRlcGxveW1lbnQpIHdoaWxlIHRoZSBBeGlzMg0KLWVuZ2luZSBpcyBydW5uaW5nLCBidXQgdGhleSB3aWxsIGJlIGF2YWlsYWJsZSBvbmNlIHRoZSBzeXN0ZW0gaXMNCi1yZXN0YXJ0ZWQuPC9wPg0KLTxhIG5hbWU9ImJtRGVwbG95bWVudCIgaWQ9ImJtRGVwbG95bWVudCI+PC9hPg0KLTxoMj5EZXBsb3ltZW50PC9oMj4NCi08cD5UaGUgRGVwbG95bWVudCBNb2RlbCBwcm92aWRlcyBhIGNvbmNyZXRlIG1lY2hhbmlzbSB0byBjb25maWd1cmUNCi1BeGlzMi4gVGhpcyBtb2RlbCBoYXMgdGhyZWUgZW50aXRpZXMgdGhhdCBwcm92aWRlIHRoZQ0KLWNvbmZpZ3VyYXRpb24uPC9wPg0KLTxhIG5hbWU9InhtbGZpbGUiIGlkPSJ4bWxmaWxlIj48L2E+DQotPGgzPlRoZSBheGlzMi54bWwgZmlsZTwvaDM+DQotPHA+VGhpcyBmaWxlIGhvbGRzIHRoZSBnbG9iYWwgY29uZmlndXJhdGlvbiBmb3IgdGhlIGNsaWVudCBhbmQNCi1zZXJ2ZXIsIGFuZCBwcm92aWRlcyB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uOjwvcD4NCi08b2w+DQotPGxpPlRoZSBnbG9iYWwgcGFyYW1ldGVyczwvbGk+DQotPGxpPlJlZ2lzdGVyZWQgdHJhbnNwb3J0LWluIGFuZCB0cmFuc3BvcnQtb3V0czwvbGk+DQotPGxpPlVzZXItZGVmaW5lZCBwaGFzZSBuYW1lczwvbGk+DQotPGxpPk1vZHVsZXMgdGhhdCBhcmUgZW5nYWdlZCBnbG9iYWxseSAodG8gYWxsIHNlcnZpY2VzKTwvbGk+DQotPGxpPkdsb2JhbGx5IGRlZmluZWQgPGEgaHJlZj0iI21yIj5NZXNzYWdlIFJlY2VpdmVyczwvYT48L2xpPg0KLTwvb2w+DQotPGEgbmFtZT0ic2VydmljZWFyY2hpdmUiIGlkPSJzZXJ2aWNlYXJjaGl2ZSI+PC9hPg0KLTxoMz5TZXJ2aWNlIEFyY2hpdmU8L2gzPg0KLTxwPlRoZSBTZXJ2aWNlIGFyY2hpdmUgbXVzdCBoYXZlIGEgPGVtPk1FVEEtSU5GL3NlcnZpY2VzLnhtbDwvZW0+IGZpbGUgYW5kIG1heQ0KLWNvbnRhaW4gdGhlIGRlcGVuZGVudCBjbGFzc2VzLiBQbGVhc2Ugc2VlIG1vZHVsZXMva2VybmVsL3Jlc291cmNlcy9zZXJ2aWNlcy54c2QgaW4gDQotdGhlIHNvdXJjZSBkaXN0cmlidXRpb24gZm9yIHRoZSBzY2hlbWEgZm9yIHNlcnZpY2VzLnhtbC4gVGhlIDxlbT5zZXJ2aWNlcy54bWw8L2VtPiBmaWxlIGhhcw0KLXRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb24uPC9wPg0KLTxvbD4NCi08bGk+U2VydmljZSBsZXZlbCBwYXJhbWV0ZXJzPC9saT4NCi08bGk+TW9kdWxlcyB0aGF0IGFyZSBlbmdhZ2VkIGF0IHNlcnZpY2UgbGV2ZWw8L2xpPg0KLTxsaT5TZXJ2aWNlIFNwZWNpZmljIDxhIGhyZWY9IiNtciI+TWVzc2FnZSBSZWNlaXZlcnM8L2E+PC9saT4NCi08bGk+T3BlcmF0aW9ucyBpbnNpZGUgdGhlIHNlcnZpY2U8L2xpPg0KLTwvb2w+DQotPGEgbmFtZT0ibW9kdWxlYXJjaGl2ZSIgaWQ9Im1vZHVsZWFyY2hpdmUiPjwvYT4NCi08aDM+TW9kdWxlIEFyY2hpdmU8L2gzPg0KLTxwPk1vZHVsZSBhcmNoaXZlIG11c3QgaGF2ZSBhIE1FVEEtSU5GLzxhIGhyZWY9DQotInJlc291cmNlcy9zY2hlbWFzL21vZHVsZS54c2QiPm1vZHVsZS54bWw8L2E+IGZpbGUgYW5kIGRlcGVuZGVudA0KLWNsYXNzZXMuIFRoZSA8ZW0+bW9kdWxlLnhtbDwvZW0+IGZpbGUgaGFzIE1vZHVsZSBwYXJhbWV0ZXJzIGFuZCB0aGUNCi1PcGVyYXRpb25zIGRlZmluZWQgaW4gdGhlIG1vZHVsZS48L3A+DQotPHA+V2hlbiB0aGUgc3lzdGVtIHN0YXJ0cyB1cCwgQXhpczIgcHJvbXB0cyB0aGUgZGVwbG95bWVudCBtb2RlbCB0bw0KLWNyZWF0ZSBhbiBBeGlzIENvbmZpZ3VyYXRpb24uIFRoZSBkZXBsb3ltZW50IG1vZGVsIGZpcnN0IGZpbmRzIHRoZQ0KLWF4aXMyLnhtbCBmaWxlIGFuZCBidWlsZHMgdGhlIGdsb2JhbCBjb25maWd1cmF0aW9uLiBUaGVuIGl0IGNoZWNrcw0KLWZvciB0aGUgbW9kdWxlIGFyY2hpdmVzIGFuZCB0aGVuIGZvciB0aGUgc2VydmljZSBhcmNoaXZlcy4gQWZ0ZXINCi10aGF0LCB0aGUgY29ycmVzcG9uZGluZyBzZXJ2aWNlcyBhbmQgbW9kdWxlcyBhcmUgYWRkZWQgdG8gdGhlIEF4aXMNCi1Db25maWd1cmF0aW9uLiBUaGUgc3lzdGVtIHdpbGwgYnVpbGQgY29udGV4dHMgb24gdG9wIG9mIHRoZSBBeGlzDQotQ29uZmlndXJhdGlvbi4gQWZ0ZXIgdGhpcywgQXhpczIgaXMgcmVhZHkgdG8gc2VuZCBvciByZWNlaXZlIFNPQVANCi1tZXNzYWdlcy4gSG90IGRlcGxveW1lbnQgaXMgb25seSBhbGxvd2VkIGZvciBzZXJ2aWNlcy48L3A+DQotPGEgbmFtZT0iYm1DbGllbnRBUEkiIGlkPSJibUNsaWVudEFQSSI+PC9hPg0KLTxoMj5DbGllbnQgQVBJPC9oMj4NCi08cD5UaGVyZSBhcmUgdGhyZWUgcGFyYW1ldGVycyB0aGF0IGRlY2lkZSB0aGUgbmF0dXJlIG9mIHRoZSBXZWINCi1zZXJ2aWNlIGludGVyYWN0aW9uLjwvcD4NCi08b2w+DQotPGxpPk1lc3NhZ2UgRXhjaGFuZ2UgUGF0dGVybiAoTUVQKTwvbGk+DQotPGxpPlRoZSBiZWhhdmlvciBvZiB0aGUgdHJhbnNwb3J0LCB3aGV0aGVyIGl0J3MgT25lLVdheSBvcg0KLVR3by1XYXk8L2xpPg0KLTxsaT5TeW5jaHJvbm91cy9Bc3luY2hyb25vdXMgYmVoYXZpb3Igb2YgdGhlIENsaWVudCBBUEk8L2xpPg0KLTwvb2w+DQotPHA+VmFyaWF0aW9ucyBvZiB0aGUgdGhyZWUgcGFyYW1ldGVycyBjYW4gcmVzdWx0IGluIGFuIGluZGVmaW5pdGUNCi1udW1iZXIgb2Ygc2NlbmFyaW9zLiBFdmVuIHRob3VnaCBBeGlzMiBpcyBidWlsdCBvbiBhIGNvcmUgdGhhdA0KLXN1cHBvcnRzIGFueSBtZXNzYWdpbmcgaW50ZXJhY3Rpb24sIHRoZSBkZXZlbG9wZXJzIHdlcmUgY29tcGVsbGVkDQotdG8gcHJvdmlkZSBidWlsdC1pbiBzdXBwb3J0IGZvciBvbmx5IHRoZSB0d28gbW9zdCB3aWRlbHkgdXNlZA0KLU1lc3NhZ2UgRXhjaGFuZ2UgUGF0dGVybnMgKE1FUHMpLjwvcD4NCi08cD5UaGUgdHdvIHN1cHBvcnRlZCBNRVBzIGFyZSBPbmUtV2F5IGFuZCB0aGUgSW4tT3V0DQotKFJlcXVlc3QtUmVzcG9uc2UpIHNjZW5hcmlvcyBpbiB0aGUgQ2xpZW50IEFQSS4gVGhlIGltcGxlbWVudGF0aW9uDQotaXMgYmFzZWQgb24gYSBjbGFzcyBjYWxsZWQgPGNvZGU+U2VydmljZUNsaWVudDwvY29kZT4gYW5kIHRoZXJlIGFyZQ0KLWV4dGVuc2lvbnMgZm9yIGVhY2ggTUVQIHRoYXQgQXhpczIgQ2xpZW50IEFQSSBzdXBwb3J0cy48L3A+DQotPGEgbmFtZT0ib25ld2F5IiBpZD0ib25ld2F5Ij48L2E+DQotPGgzPk9uZSBXYXkgTWVzc2FnaW5nIFN1cHBvcnQ8L2gzPg0KLTxwPlRoZSBPbmUtV2F5IHN1cHBvcnQgaXMgcHJvdmlkZWQgYnkgdGhlDQotPGNvZGU+ZmlyZUFuZEZvcmdldDwvY29kZT4gbWV0aG9kIG9mIDxjb2RlPlNlcnZpY2VDbGllbnQ8L2NvZGU+Lg0KLUZvciBvbmUgd2F5IGludm9jYXRpb25zLCBvbmUgY2FuIHVzZSBIVFRQLCBTTVRQIGFuZCBUQ1AgdHJhbnNwb3J0cy4NCi1JbiB0aGUgY2FzZSBvZiB0aGUgSFRUUCB0cmFuc3BvcnQsIHRoZSByZXR1cm4gY2hhbm5lbCBpcyBub3QgdXNlZCwNCi1hbmQgdGhlIEhUVFAgMjAyIE9LIGlzIHJldHVybmVkIGluIHRoZSByZXR1cm4gY2hhbm5lbC48L3A+DQotPGEgbmFtZT0icmVxdWVzdHJlc3BvbnNlIiBpZD0icmVxdWVzdHJlc3BvbnNlIj48L2E+DQotPGgzPkluLU91dCAoUmVxdWVzdCBSZXNwb25zZSkgTWVzc2FnaW5nIFN1cHBvcnQ8L2gzPg0KLTxwPlRoZSBJbi1PdXQgc3VwcG9ydCBpcyBwcm92aWRlZCBieSB0aGUgPGNvZGU+c2VuZFJlY2VpdmUoKTwvY29kZT4NCi1tZXRob2QgaW4gU2VydmljZUNsaWVudC4gVGhpcyBwcm92aWRlcyBhIHNpbXBsZXIgaW50ZXJmYWNlIGZvciB0aGUNCi11c2VyLiBUaGUgQ2xpZW50IEFQSSBoYXMgZm91ciB3YXlzIHRvIGNvbmZpZ3VyZSBhIGdpdmVuIG1lc3NhZ2UNCi1leGNoYW5nZTwvcD4NCi08b2w+DQotPGxpPkJsb2NraW5nIG9yIE5vbi1CbG9ja2luZyBuYXR1cmUgLSB0aGlzIGNhbiBiZSBkZWNpZGVkIGJ5IHVzaW5nDQotPGNvZGU+c2VuZFJlY2VpdmUoKTwvY29kZT4gb3IgPGNvZGU+c2VuZFJlY2VpdmVOb25CbG9ja2luZygpPC9jb2RlPg0KLW1ldGhvZHM8L2xpPg0KLTxsaT5TZW5kZXIgdHJhbnNwb3J0IC0gdHJhbnNwb3J0IHRoYXQgc2VuZHMgdGhlIFNPQVAgbWVzc2FnZTwvbGk+DQotPGxpPkxpc3RlbmVyIHRyYW5zcG9ydCAtIHRyYW5zcG9ydCB0aGF0IHJlY2VpdmVzIHRoZSByZXNwb25zZTwvbGk+DQotPGxpPlVzZSBTZXBhcmF0ZSBDaGFubmVsIC0gZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSByZXNwb25zZSBpcyBzZW50DQotb3ZlciBhIHNlcGFyYXRlIHRyYW5zcG9ydCBjb25uZWN0aW9uIG9yIG5vdC4gVGhpcyBjYW4gYmUgZmFsc2Ugb25seQ0KLXdoZW4gdGhlIHNlbmRlciBhbmQgbGlzdGVuZXIgdHJhbnNwb3J0IGlzIHNhbWUgYW5kIGlzIGEgVHdvLVdheQ0KLXRyYW5zcG9ydC48L2xpPg0KLTwvb2w+DQotPHA+RGVwZW5kaW5nIG9uIHRoZSB2YWx1ZXMgb2YgdGhlIGFib3ZlIGZvdXIgcGFyYW1ldGVycywgQXhpczINCi1iZWhhdmVzIGRpZmZlcmVudGx5LjwvcD4NCi08YSBuYW1lPSJibVRyYW5zcG9ydHMiIGlkPSJibVRyYW5zcG9ydHMiPjwvYT4NCi08aDI+VHJhbnNwb3J0czwvaDI+DQotPHA+QXhpczIgaGFzIHR3byBiYXNpYyBjb25zdHJ1Y3RzIGZvciB0cmFuc3BvcnRzLCBuYW1lbHk6IFRyYW5zcG9ydA0KLVNlbmRlcnMgYW5kIFRyYW5zcG9ydCBSZWNlaXZlcnMuIFRoZXNlIGFyZSBhY2Nlc3NlZCB2aWEgdGhlDQotQXhpc0NvbmZpZ3VyYXRpb24uPC9wPg0KLTxwPlRoZSBpbmNvbWluZyB0cmFuc3BvcnQgaXMgdGhlIHRyYW5zcG9ydCB2aWEgd2hpY2ggdGhlIEF4aXNFbmdpbmUNCi1yZWNlaXZlcyB0aGUgbWVzc2FnZS4gVGhlIG91dGdvaW5nIHRyYW5zcG9ydCBpcyBkZWNpZGVkIGJhc2VkIG9uDQotdGhlIGFkZHJlc3NpbmcgaW5mb3JtYXRpb24gKHdzYTpSZXBseVRvIGFuZCB3c2E6RmF1bHRUbykuIElmDQotYWRkcmVzc2luZyBpbmZvcm1hdGlvbiBpcyBub3QgYXZhaWxhYmxlIGFuZCBpZiB0aGUgc2VydmVyIGlzIHRyeWluZw0KLXRvIHJlc3BvbmQsIHRoZW4gdGhlIG91dCBnb2luZyB0cmFuc3BvcnQgd2lsbCBiZSB0aGUgb3V0cHV0IHN0cmVhbQ0KLW9mIHRoZSBpbmNvbWluZyB0cmFuc3BvcnQgKGlmIGl0IGlzIHR3by13YXkgdHJhbnNwb3J0KS48L3A+DQotPHA+QXQgdGhlIGNsaWVudCBzaWRlLCB0aGUgdXNlciBpcyBmcmVlIHRvIHNwZWNpZnkgdGhlIHRyYW5zcG9ydCB0bw0KLWJlIHVzZWQuPC9wPg0KLTxwPlRyYW5zcG9ydCBTZW5kZXJzIGFuZCBUcmFuc3BvcnQgUmVjZWl2ZXJzIGNvbnRhaW4gdGhlIGZvbGxvd2luZw0KLWluZm9ybWF0aW9uLjwvcD4NCi08b2w+DQotPGxpPlRyYW5zcG9ydCBTZW5kZXIgZm9yIE91dCBDb25maWd1cmF0aW9uPC9saT4NCi08bGk+VHJhbnNwb3J0IExpc3RlbmVyIGZvciBJbiBDb25maWd1cmF0aW9uPC9saT4NCi08bGk+UGFyYW1ldGVycyBvZiB0aGUgdHJhbnNwb3J0PC9saT4NCi08L29sPg0KLTxwPkVhY2ggYW5kIGV2ZXJ5IHRyYW5zcG9ydCBvdXQgY29uZmlndXJhdGlvbiBkZWZpbmVzIGEgdHJhbnNwb3J0DQotc2VuZGVyLiBUaGUgdHJhbnNwb3J0IHNlbmRlciBzZW5kcyB0aGUgU09BUCBtZXNzYWdlIGRlcGVuZGluZyBvbg0KLWl0cyBjb25maWd1cmF0aW9uLjwvcD4NCi08cD5UaGUgdHJhbnNwb3J0IHJlY2VpdmVyIHdhaXRzIGZvciB0aGUgU09BUCBtZXNzYWdlcywgYW5kIGZvciBlYWNoDQotU09BUCBtZXNzYWdlIHRoYXQgYXJyaXZlcywgaXQgdXNlcyB0aGUgPGk+SW4gUGlwZTwvaT4gdG8gcHJvY2Vzcw0KLXRoZSBTT0FQIG1lc3NhZ2UuPC9wPg0KLTxwPkF4aXMyIHByZXNlbnRseSBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHRyYW5zcG9ydHM6PC9wPg0KLTxvbD4NCi08bGk+SFRUUCAtIEluIEhUVFAgdHJhbnNwb3J0LCB0aGUgdHJhbnNwb3J0IGxpc3RlbmVyIGlzIGEgc2VydmxldA0KLW9yIG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuU2ltcGxlSFRUUFNlcnZlciBwcm92aWRlZCBieQ0KLUF4aXMyLiBUaGUgdHJhbnNwb3J0IHNlbmRlciB1c2VzIGNvbW1vbnMtaHR0cGNsaWVudCB0byBjb25uZWN0IGFuZA0KLXNlbmQgdGhlIFNPQVAgbWVzc2FnZS48L2xpPg0KLTxsaT5UQ1AgLSBUaGlzIGlzIHRoZSBzaW1wbGVzdCB0cmFuc3BvcnQsIGJ1dCBuZWVkcyBXUy1BZGRyZXNzaW5nDQotc3VwcG9ydCB0byBiZSBmdW5jdGlvbmFsLjwvbGk+DQotPGxpPlNNVFAgLSBUaGlzIHdvcmtzIG9mZiBhIHNpbmdsZSBlbWFpbCBhY2NvdW50LiBUcmFuc3BvcnQNCi1yZWNlaXZlciBpcyBhIHRocmVhZCB0aGF0IGNoZWNrcyBmb3IgZW1haWxzIGF0IGZpeGVkIHRpbWUNCi1pbnRlcnZhbHMuPC9saT4NCi08bGk+Sk1TPC9saT4NCi08L29sPg0KLTxhIG5hbWU9ImJtV1NETCIgaWQ9ImJtV1NETCI+PC9hPg0KLTxoMj5Db2RlIEdlbmVyYXRpb248L2gyPg0KLTxwPkFsdGhvdWdoIHRoZSBiYXNpYyBvYmplY3RpdmUgb2YgdGhlIGNvZGUgZ2VuZXJhdGlvbiB0b29scyBoYXMNCi1ub3QgY2hhbmdlZCwgdGhlIGNvZGUgZ2VuZXJhdGlvbiBtb2R1bGUgb2YgQXhpczIgaGFzIHRha2VuIGENCi1kaWZmZXJlbnQgYXBwcm9hY2ggdG8gZ2VuZXJhdGUgY29kZS4gUHJpbWFyaWx5LCB0aGUgY2hhbmdlIGlzIGluDQotdGhlIHVzZSBvZiB0ZW1wbGF0ZXMsIG5hbWVseSBYU0wgdGVtcGxhdGVzLCB3aGljaCBnaXZlcyB0aGUgY29kZQ0KLWdlbmVyYXRvciB0aGUgZmxleGliaWxpdHkgdG8gZ2VuZXJhdGUgY29kZSBpbiBtdWx0aXBsZQ0KLWxhbmd1YWdlcy48L3A+DQotPHA+VGhlIGJhc2ljIGFwcHJvYWNoIGlzIHRvIHNldCB0aGUgY29kZSBnZW5lcmF0b3IgdG8gZ2VuZXJhdGUgYW4NCi1YTUwsIGFuZCBwYXJzZSBpdCB3aXRoIGEgdGVtcGxhdGUgdG8gZ2VuZXJhdGUgdGhlIGNvZGUgZmlsZS4gVGhlDQotZm9sbG93aW5nIGZpZ3VyZSBkZXNjcmliZXMgaG93IHRoaXMgc2hvd3MgdXAgaW4gdGhlIGFyY2hpdGVjdHVyZSBvZg0KLXRoZSB0b29sLjwvcD4NCi08cD48aW1nIHNyYz0iaW1hZ2VzL2FyY2hpLWd1aWRlL0NvZGVnZW5BcmNoaXRlY3R1cmUtbmV3LmdpZiIgbmFtZT0NCi0iR3JhcGhpYzYiIGFsdD0iIiBhbGlnbj0iYm90dG9tIiBib3JkZXI9IjAiIGlkPSJHcmFwaGljNiIgLz48L3A+DQotPHA+VGhlIGZhY3QgaGVyZSBpcyB0aGF0IGl0IGlzIHRoZSBzYW1lIGluZm9ybWF0aW9uIHRoYXQgaXMNCi1leHRyYWN0ZWQgZnJvbSB0aGUgV1NETCBubyBtYXR0ZXIgd2hhdCBvdXRwdXQgY29kZSBpcyBnZW5lcmF0ZWQuDQotRmlyc3QsIGFuIEF4aXNTZXJ2aWNlIGlzIHBvcHVsYXRlZCBmcm9tIGEgV1NETC4gVGhlbiB0aGUgY29kZQ0KLWdlbmVyYXRvciBleHRyYWN0cyBpbmZvcm1hdGlvbiBmcm9tIHRoZSBBeGlzU2VydmljZSBhbmQgY3JlYXRlcyBhbg0KLVhNTCwgd2hpY2ggaXMgbGFuZ3VhZ2UgaW5kZXBlbmRlbnQuIFRoaXMgZW1pdHRlZCBYTUwgaXMgdGhlbiBwYXJzZWQNCi13aXRoIHRoZSByZWxldmFudCBYU0wgdG8gZ2VuZXJhdGUgY29kZSBpbiB0aGUgZGVzaXJlZCBvdXRwdXQNCi1sYW5ndWFnZS4gTm8gbWF0dGVyIHdoYXQgdGhlIG91dHB1dCBsYW5ndWFnZSBpcywgdGhlIHByb2Nlc3MgaXMgdGhlDQotc2FtZSBleGNlcHQgZm9yIHRoZSBYU0wgdGVtcGxhdGUgdGhhdCBpcyB1c2VkLjwvcD4NCi08YSBuYW1lPSJibURCIiBpZD0iYm1EQiI+PC9hPg0KLTxoMj5EYXRhIEJpbmRpbmc8L2gyPg0KLTxoMz5JbnRlZ3JhdGlvbiB3aXRoIHRoZSBDb2RlIEdlbmVyYXRpb24gRW5naW5lPC9oMz4NCi08cD5EYXRhYmluZGluZyBmb3IgQXhpczIgaXMgaW1wbGVtZW50ZWQgaW4gYW4gaW50ZXJlc3RpbmcgbWFubmVyLg0KLURhdGFiaW5kaW5nIGhhcyBub3QgYmVlbiBpbmNsdWRlZCBpbiB0aGUgY29yZSBkZWxpYmVyYXRlbHksIGFuZA0KLWhlbmNlIHRoZSBjb2RlIGdlbmVyYXRpb24gYWxsb3dzIGRpZmZlcmVudCBkYXRhIGJpbmRpbmcgZnJhbWV3b3Jrcw0KLXRvIGJlIHBsdWdnZWQgaW4uIFRoaXMgaXMgZG9uZSB0aHJvdWdoIGFuIGV4dGVuc2lvbiBtZWNoYW5pc20gd2hlcmUNCi10aGUgY29kZWdlbiBlbmdpbmUgZmlyc3QgY2FsbHMgdGhlIGV4dGVuc2lvbnMgYW5kIHRoZW4gZXhlY3V0ZXMgdGhlDQotY29yZSBlbWl0dGVyLiBUaGUgZXh0ZW5zaW9ucyBwb3B1bGF0ZSBhIG1hcCBvZiBRTmFtZXMgdnMuIGNsYXNzDQotbmFtZXMgdGhhdCBpcyBwYXNzZWQgdG8gdGhlIGNvZGUgZ2VuZXJhdG9yIG9uIHdoaWNoIHRoZSBlbWl0dGVyDQotb3BlcmF0ZXMgb24uPC9wPg0KLTxwPjxzdHJvbmc+VGhlIGZvbGxvd2luZyBkaWFncmFtIHNob3dzIHRoZSBzdHJ1Y3R1cmU6PC9zdHJvbmc+PC9wPg0KLTxwPjxpbWcgc3JjPSJpbWFnZXMvY29kZWdlbi5naWYiIG5hbWU9IkdyYXBoaWM3IiBhbGlnbj0iYm90dG9tIg0KLWJvcmRlcj0iMCIgaWQ9IkdyYXBoaWM3IiAvPjwvcD4NCi08cD48c3Ryb25nPlRoZSBmb2xsb3dpbmcgZGF0YWJpbmRpbmcgZXh0ZW5zaW9ucyBhcmUNCi1hdmFpbGFibGU6PC9zdHJvbmc+PC9wPg0KLTxvbD4NCi08bGk+PHN0cm9uZz5BREI8L3N0cm9uZz4gLSBBREIgKEF4aXMgRGF0YSBCaW5kaW5nICkgaXMgYSBzaW1wbGUNCi1mcmFtZXdvcmsgdGhhdCBhbGxvd3Mgc2ltcGxlIHNjaGVtYXMgdG8gYmUgY29tcGlsZWQuIEl0IGlzDQotbGlnaHR3ZWlnaHQgYW5kIHNpbXBsZSwgd29ya3Mgb2ZmIFN0QVggYW5kIGZhaXJseSBwZXJmb3JtYW50Lg0KLUhvd2V2ZXIsIGl0IGRvZXMgbm90IHN1cHBvcnQgdGhlIGNvbXBsZXRlIHNldCBvZiBzY2hlbWEgY29uc3RydWN0cw0KLWFuZCBpcyBsaWtlbHkgdG8gY29tcGxhaW4gZm9yIGNlcnRhaW4gc2NoZW1hcyE8L2xpPg0KLTxsaT48c3Ryb25nPlhNTEJlYW5zPC9zdHJvbmc+IC0gWE1MYmVhbnMgY2xhaW1zIHRoYXQgaXQgc3VwcG9ydHMNCi10aGUgY29tcGxldGUgc2NoZW1hIHNwZWNpZmljYXRpb24sIGFuZCBpdCBpcyBwcmVmZXJyZWQgaWYgZnVsbA0KLXNjaGVtYSBzdXBwb3J0IGlzIG5lZWRlZCE8L2xpPg0KLTxsaT48c3Ryb25nPkpBWEItUkk8L3N0cm9uZz4gLSBKQVhCMiBzdXBwb3J0IGhhcyBiZWVuIGFkZGVkIGluIGENCi1zaW1pbGFyIG1hbm5lciB0byBYTUxiZWFucyBhbmQgc2VydmVzIGFzIGFub3RoZXIgb3B0aW9uIGZvciB0aGUNCi11c2VyPC9saT4NCi08bGk+PHN0cm9uZz5KaWJYPC9zdHJvbmc+IC0gVGhpcyBpcyB0aGUgbW9zdCByZWNlbnQgYWRkaXRpb24gdG8gdGhlDQotZmFtaWx5IG9mIGRhdGFiaW5kaW5nIGV4dGVuc2lvbnMsIGFuZCBpdCBpcyBhbHNvIGFub3RoZXIgb3B0aW9uDQotdXNlcnMgaGF2ZSBmb3IgZGF0YSBiaW5kaW5nLjwvbGk+DQotPC9vbD4NCi08YSBuYW1lPSJzZXJpYWwiIGlkPSJzZXJpYWwiPjwvYT4NCi08aDM+U2VyaWFsaXphdGlvbiBhbmQgRGUtU2VyaWFsaXphdGlvbiBvZiBEYXRhIGJvdW5kIGNsYXNzZXM8L2gzPg0KLTxwPkFYSU9NIGlzIGJhc2VkIG9uIHRoZSBTdEFYIEFQSSAoU3RyZWFtaW5nIEFQSSBmb3IgWE1MKS4NCi1YbWwtYmVhbnMgYWxzbyBzdXBwb3J0cyB0aGlzIEFQSS4gRGF0YSBiaW5kaW5nIGluIEF4aXMyIGlzIGFjaGlldmVkDQotdGhyb3VnaCBpbnRlcmZhY2luZyB0aGUgQVhJT00gd2l0aCB0aGUgWG1sLWJlYW5zIHVzaW5nIHRoZSBTdEFYDQotQVBJLiBBdCB0aGUgdGltZSBvZiBjb2RlIGdlbmVyYXRpb24sIHRoZXJlIHdpbGwgYmUgdXRpbGl0eSBtZXRob2RzDQotZ2VuZXJhdGVkIGluc2lkZSB0aGUgc3R1YiAob3IgdGhlIG1lc3NhZ2UgcmVjZWl2ZXIpIHRoYXQgY2FuDQotZGUtc2VyaWFsaXplIGZyb20gQVhJT00gdG8gYSBkYXRhIGJvdW5kIG9iamVjdCBhbmQgc2VyaWFsaXplIGZyb20gYQ0KLWRhdGEgYm91bmQgb2JqZWN0IHRvIEFYSU9NLiBGb3IgZXhhbXBsZSwgaWYgdGhlIFdTREwgaGFzIGFuDQotb3BlcmF0aW9uIGNhbGxlZCAiZWNob1N0cmluZyIsIG9uY2UgdGhlIGNvZGUgaXMgZ2VuZXJhdGVkLCB0aGUNCi1mb2xsb3dpbmcgbWV0aG9kcyB3aWxsIGJlIGdlbmVyYXRlZCBpbnNpZGUgdGhlIHJlbGV2YW50DQotY2xhc3Nlcy48L3A+DQotPHByZT4NCi1wdWJsaWMgc3RhdGljDQotb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgdG9PTShvcmcuc29hcGludGVyb3AueHNkLkVjaG9TdHJpbmdQYXJhbURvY3VtZW50DQotcGFyYW0pLy8gVGhpcyBtZXRob2Qgd2lsbCBoYW5kbGUgdGhlIHNlcmlhbGl6YXRpb24uDQotDQotcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdA0KLWZyb21PTShvcmcuYXBhY2hlLmF4aXMyLm9tLk9NRWxlbWVudCBwYXJhbSwgamF2YS5sYW5nLkNsYXNzIHR5cGUpIC8vVGhpcw0KLW1ldGhvZCB3aWxsIGhhbmRsZSB0aGUgZGUtc2VyaWFsaXphdGlvbi4NCi08L3ByZT4NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9XU19wb2xpY3kueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL1dTX3BvbGljeS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkNTQwMmIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL1dTX3BvbGljeS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQgKzAsMCBAQAotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiINCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPg0KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4NCi08aGVhZD4NCi08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9DQotIkhUTUwgVGlkeSBmb3IgV2luZG93cyAodmVycyAxNCBKdW5lIDIwMDcpLCBzZWUgd3d3LnczLm9yZyIgLz4NCi08bWV0YSBodHRwLWVxdWl2PSJjb250ZW50LXR5cGUiIGNvbnRlbnQ9DQotInRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4NCi08dGl0bGU+V1MgUG9saWN5IFN1cHBvcnQgaW4gQXhpczI8L3RpdGxlPg0KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0NCi0iYW1heWEgOS4yLjEsIHNlZSBodHRwOi8vd3d3LnczLm9yZy9BbWF5YS8iIC8+DQotPGxpbmsgaHJlZj0iLi4vY3NzL2F4aXMtZG9jcy5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiDQotbWVkaWE9ImFsbCIgLz4NCi08L2hlYWQ+DQotPGJvZHkgbGFuZz0iZW4iIHhtbDpsYW5nPSJlbiI+DQotPGgxIGFsaWduPSJjZW50ZXIiPldlYiBTZXJ2aWNlcyBQb2xpY3kgU3VwcG9ydCBJbiBBcGFjaGUgQXhpczI8L2gxPg0KLTxwPlRoaXMgZG9jdW1lbnQgZ2l2ZXMgeW91IGFuIGludHJvZHVjdGlvbiB0byB0aGUgcm9sZSBvZiBXZWINCi1zZXJ2aWNlcyBwb2xpY3kgaW4gQXBhY2hlIEF4aXMyLjwvcD4NCi08cD5TZW5kIHlvdXIgZmVlZGJhY2sgdG86IDxhIGhyZWY9DQotIm1haWx0bzpheGlzLWRldkB3cy5hcGFjaGUub3JnP3N1YmplY3Q9W0F4aXMyXSI+YXhpcy1kZXZAd3MuYXBhY2hlLm9yZzwvYT4uDQotKFN1YnNjcmlwdGlvbiBkZXRhaWxzIGFyZSBhdmFpbGFibGUgb24gdGhlIDxhIGhyZWY9DQotImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL21haWwtbGlzdHMuaHRtbCI+QXhpczIgc2l0ZTwvYT4uKQ0KLUtpbmRseSBwcmVmaXggZXZlcnkgZW1haWwgc3ViamVjdCB3aXRoIFtBeGlzMl0uPC9wPg0KLTxoMj5Db250ZW50PC9oMj4NCi08dWw+DQotPGxpPjxhIGhyZWY9IiN3aGF0Ij5XaGF0IGlzIFdlYiBTZXJ2aWNlcyAoV1MpIFBvbGljeT88L2E+PC9saT4NCi08bGk+PGEgaHJlZj0iI2NsaWVudCI+Q2xpZW50IFNpZGUgV1MtUG9saWN5IFN1cHBvcnQ8L2E+PC9saT4NCi08bGk+PGEgaHJlZj0iI3NlcnZlciI+U2VydmVyIFNpZGUgV1MtUG9saWN5IFN1cHBvcnQ8L2E+PC9saT4NCi08bGk+PGEgaHJlZj0iI3Jlc291cmNlcyI+UmVzb3VyY2VzPC9hPjwvbGk+DQotPC91bD4NCi08YSBuYW1lPSJ3aGF0IiBpZD0id2hhdCI+PC9hPg0KLTxoMj5XaGF0IGlzIFdlYiBTZXJ2aWNlcyAoV1MpIFBvbGljeT88L2gyPg0KLTxwPlRvIGNvbnN1bWUgbm9uIHRyaXZpYWwgd2ViIHNlcnZpY2VzIHlvdSBtdXN0IGZ1bGx5IHVuZGVyc3RhbmQNCi1pdHMgWE1MIGNvbnRyYWN0IChXU0RMKSBhbG9uZyB3aXRoIGFueSBvdGhlciBhZGRpdGlvbmFsDQotcmVxdWlyZW1lbnRzLCBjYXBhYmlsaXRpZXMsIG9yIHByZWZlcmVuY2VzIHRoYXQgdHJhbnNsYXRlIHRvIHRoZQ0KLWNvbmZpZ3VyYXRpb24gb2YgdGhlIHNlcnZpY2UgYW5kIGVzc2VudGlhbGx5IGJlY29tZXMgdGhlIHBvbGljaWVzDQotb2YgdGhlIHNlcnZpY2UuPC9wPg0KLTxwPldTIFBvbGljeSBmcmFtZXdvcmsgcHJvdmlkZXMgYSB3YXkgdG8gZXhwcmVzcyB0aGUgcG9saWNpZXMgb2YgYQ0KLXNlcnZpY2UgaW4gYSBtYWNoaW5lLXJlYWRhYmxlIHdheS4gQSBXZWIgc2VydmljZXMgaW5mcmFzdHJ1Y3R1cmUNCi1jYW4gYmUgZW5oYW5jZWQgdG8gdW5kZXJzdGFuZCBhbmQgZW5mb3JjZSBwb2xpY2llcyBhdCBydW50aW1lLiBGb3INCi1pbnN0YW5jZSwgYSBzZXJ2aWNlIGF1dGhvciBtaWdodCB3cml0ZSBhIHBvbGljeSByZXF1aXJpbmcgYSBkaWdpdGFsDQotc2lnbmF0dXJlIGFuZCBlbmNyeXB0aW9uLCB3aGlsZSBzZXJ2aWNlIGNvbnN1bWVycyBjYW4gdXNlIHRoZQ0KLXBvbGljeSBpbmZvcm1hdGlvbiB0byByZWFzb24gb3V0IHdoZXRoZXIgdGhleSBjYW4gYWRoZXJlIHRvIHRoaXMNCi1wb2xpY3kgaW5mb3JtYXRpb24gdG8gdXNlIHRoZSBzZXJ2aWNlLjwvcD4NCi08cD5GdXJ0aGVybW9yZSwgV2ViIHNlcnZpY2UgaW5mcmFzdHJ1Y3R1cmUgY2FuIGJlIGVuaGFuY2VkIHRvDQotZW5mb3JjZSB0aG9zZSByZXF1aXJlbWVudHMgd2l0aG91dCByZXF1aXJpbmcgdGhlIHNlcnZpY2UgYXV0aG9yIHRvDQotd3JpdGUgZXZlbiBhIHNpbmdsZSBsaW5lIG9mIGNvZGUuPC9wPg0KLTxhIG5hbWU9ImNsaWVudCIgaWQ9ImNsaWVudCI+PC9hPg0KLTxoMj5DbGllbnQgU2lkZSBXUy1Qb2xpY3kgU3VwcG9ydDwvaDI+DQotPHA+VGhpcyByZWxlYXNlIDxzdHJvbmc+ZnVsbHkgc3VwcG9ydHMgV1MgUG9saWN5IGF0DQotY2xpZW50LXNpZGU8L3N0cm9uZz4uIEl0IG1lYW5zIHRoYXQgd2hlbiB5b3UgY29kZWdlbiBhIHN0dWIgYWdhaW5zdA0KLWEgV1NMRCB3aGljaCBjb250YWlucyBwb2xpY2llcywgdGhlIHN0dWIgd2lsbCBjb250YWluIHRoZQ0KLWNhcGFiaWxpdHkgdG8gZW5nYWdlIHRoZSByZXF1aXJlZCBtb2R1bGVzIHdpdGggdGhlIGFwcHJvcHJpYXRlDQotY29uZmlndXJhdGlvbnMsIHBsdXMgaXQgd2lsbCBnZW5lcmF0ZSBhZGRpdGlvbmFsIG1ldGhvZHMgaW4gdGhlDQotc3R1YiB3aGVyZSB0aGUgdXNlciBjYW4gc2V0IGNlcnRhaW4gcHJvcGVydGllcy4gRm9yIGluc3RhbmNlLCBpZg0KLXRoZXJlIGlzIGEgc2VjdXJpdHkgcG9saWN5IGF0dGFjaGVkIHRvIGEgYmluZGluZywgdGhlIGdlbmVyYXRlZA0KLXN0dWIgd2lsbCBlbmdhZ2UgdGhlIHNlY3VyaXR5IG1vZHVsZSBmb3IgdGhhdCBzZXJ2aWNlIHdpdGggdGhlDQotYXBwcm9wcmlhdGUgc2VjdXJpdHkgY29uZmlndXJhdGlvbnMgd2l0aCBzb21lIGFkZHRpb25hbCBtZXRob2RzDQotdGhhdCB0aGUgdXNlciBjYW4gdXNlIHRvIHNldCBwcm9wZXJ0aWVzIGluIHRoZSBnZW5lcmF0ZWQgc3R1Yi48L3A+DQotPGgzPkhvdyBpdCB3b3Jrczo8L2gzPg0KLTxoND5QaGFzZSAxOiBBdCBQb2xpY3lFdmFsdWF0b3I8L2g0Pg0KLTxwPlRoZSBDb2RlZ2VuIGVuZ2luZSBydW5zIGEgZmV3IG9mIGl0cyByZWdpc3RlcmVkIGV4dGVuc2lvbnMNCi1iZWZvcmUgaXQgZ2VuZXJhdGVzIHRoZSBzdHViLiBXaGVuIHRoZSBQb2xpY3lFdmFsdXRvciAod2hpY2ggaXMgYQ0KLXJlZ2lzdGVyZWQgQ29kZWdlbiBleHRlbnNpb24pIGlzIGluaXRpYWxpemVkLCBpdCBwb3B1bGF0ZXMgYQ0KLXJlZ2lzdHJ5IG9mIFFOYW1lcyBvZiBzdXBwb3J0ZWQgcG9saWN5IGFzc2VydGlvbnMgdG8NCi1Qb2xpY3lFeHRlbnNpb25zLjwvcD4NCi08cD5Gb3IgaW5zdGFuY2UsIG1vZHVsZSBGb28gbWlnaHQgaGF2ZSBhIG1hcHBpbmcgb2YgYXNzZXJ0aW9uDQote2h0dHA6Ly90ZXN0LmNvbS9mb28sIGZvb30gd2hpY2ggbWVhbnMgYW55IGFzc2VydGlvbiB0aGF0IGhhcyB0aGlzDQotbmFtZSB3aWxsIGJlIHByb2Nlc3NlZCBieSB0aGlzIG1vZHVsZS4gVGhlIEZvbyBtb2R1bGUgbWlnaHQNCi1pbXBsZW1lbnQgdGhlIE1vZHVsZVBvbGljeUV4dGVuc2lvbiBpbnRlcmZhY2UgdGhyb3VnaCB3aGljaCB0aGUNCi1Qb2xpY3lFeHRlbnNpb24gb2JqZWN0IGNhbiBiZSBvYnRhaW5lZC48L3A+DQotPHA+QSA8c3Ryb25nPlBvbGljeUV4dGVuc2lvbjwvc3Ryb25nPiBpcyB0aGUgYWNjZXNzIHBvaW50IGZvciBhDQotbW9kdWxlIHRvIGFkZCBhbnkgYWRkaXRpb25hbCBtZXRob2RzIHRvIHRoZSBzdHViLiBGb3IgaW5zdGFuY2UgYQ0KLVJlbGlhYmxlIE1lc3NhZ2luZyBtb2R1bGUgY2FuIGFkZCBzdGFydFNlcXVlbmNlKCkgYW5kIGVuZFNlcXVlbmNlKCkNCi1tZXRob2RzIHRvIHRoZSBzdHViLCB0aGF0IHRoZSB1c2VyIG11c3QgY2FsbCB0byBzdGFydCBhbmQgZW5kIGFuIFJNDQotc2VxdWVuY2UuPC9wPg0KLTxwPlRoZW4gYXQgdGhlIGVuZ2FnZW1lbnQgb2YgdGhlIFBvbGljeUV2YWx1YXRvciwgdGhlIGVmZmVjdGl2ZQ0KLXBvbGljeSBvZiBlYWNoIG1lc3NhZ2Ugb2YgZXZlcnkgb3BlcmF0aW9uIGlzIGNhbGN1bGF0ZWQgYmFzZWQgb24NCi1wb2xpY3kgaW5mb3JtYXRpb24gZGVjbGFyZWQgaW4gdGhlIFdTREwgZG9jdW1lbnQuIEhlcmUgd2UgYXNzdW1lDQotdGhhdCB0aGUgZWZmZWN0aXZlIHBvbGljeSBvZiBhbiBvcGVyYXRpb24gY29udGFpbnMgYSBzaW5nbGUNCi1hbHRlcm5hdGl2ZSAoPHN0cm9uZz5NdWx0aXBsZSBwb2xpY3kgYWx0ZXJuYXRpdmVzIGFyZSBub3QNCi1zdXBwb3J0ZWQ8L3N0cm9uZz4pLiBUaGVuIHdlIHNwbGl0IHRoYXQgcG9saWN5IGFzIGZvbGxvd3MgaW50byBmZXcNCi1vdGhlciBwb2xpY2llcyBzdWNoIHRoYXQsIGVhY2ggcG9saWN5IHdpbGwgY29udGFpbiBhc3NlcnRpb25zIHRoYXQNCi1jYW4gYmUgcHJvY2Vzc2VkIGJ5IGEgc2luZ2xlIG1vZHVsZS48L3A+DQotPHByZT4NCi0gICZsdDt3c3A6UG9saWN5Jmd0OyAgICAgICAgICZsdDt3c3A6UG9saWN5Jmd0OyAgICAgICAmbHQ7d3NwOlBvbGljeSZndDsgICAgICAgIA0KLSAgICAmbHQ7YTpGb28vJmd0OyAgICAgICAgICAgICAmbHQ7YTpGb28vJmd0OyAgICAgICAgICAgJmx0O2I6Rm9vLyZndDsgICAgICAgICAgICAgICANCi0gICAgJmx0O2I6QmFyLyZndDsgICAgICA9Jmd0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbHQ7L3dzcDpQb2xpY3kmZ3Q7ICAgICAgIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmx0Oy93c3A6UG9saWN5Jmd0Ow0KLSAgJmx0Oy93c3A6UG9saWN5Jmd0Ow0KLTwvcHJlPg0KLTxwPlRoZW4gZWFjaCBwb2xpY3kgaXMgZ2l2ZW4gdGhlIGFwcHJvcHJpYXRlIFBvbGljeUV4dGVuc2lvbiB3aXRoDQotYW4gb3JnLnczYy5FbGVtZW50IHR5cGUgb2JqZWN0IHRvIHdoaWNoIHRoZSBtb2R1bGUgY2FuIGFwcGVuZCBhbnkNCi1vdGhlciBlbGVtZW50cy9hdHRyaWJ1dGVzIGl0IHdpc2hlcy4gVGhvc2UgYXR0cmlidXRlcy9lbGVtZW50cw0KLXNob3VsZCByZXNvbHZlIHRvIG1lYW5pbmdmdWwgc3R1YiBmdW5jdGlvbnMgdGhyb3VnaCB0aGUgQ3VzdG9tDQotUG9saWN5RXh0ZW5zaW9uVGVtcGxhdGUueHNsIGF0IGEgbGF0dGVyIHBvaW50IG9mIHRpbWUuPC9wPg0KLTxwPkZvciBpbnN0YW5jZSwgZGVwZW5kaW5nIG9uIHRoZSBwb2xpY3ksIHRoZSBTZWN1cml0eSBtb2R1bGUgY2FuDQotYXBwZW5kICZsdDt1c2VybmFtZSZndDssICZsdDtwYXNzd2QmZ3Q7IGVsZW1lbnRzIHRvIHRoZSBnaXZlbg0KLWVsZW1lbnQgYXMgY2hpbGRyZW4sIHdoaWNoIGFyZSBsYXRlciByZXNvbHZlZCBpbnRvIHNldFVzZXJuYW1lKC4uKSwNCi1zZXRQYXNzd2QoLi4pLCBmdW5jdGlvbnMgb2YgdGhlIHN0dWIuIFRoaXMgd2F5IGEgbW9kdWxlIGNhbiBpbmNsdWRlDQotYWRkaXRpb25hbCBtZXRob2RzIHRvIHRoZSBzdHViIHRoYXQgY2FuIGJlIHVzZWQgdG8gZ2V0IHNwZWNpZmljDQotcHJvcHJldGllcyBmcm9tIHRoZSB1c2VyLiBUaGVzZSBtZXRob2RzIHN0b3JlIGFueSB1c2VyIGlucHV0IGluIHRoZQ0KLVNlcnZpY2VDbGllbnQgcHJvcGVydGllcw0KLShTZXJ2aWNlQ2xpZW50LmdldE9wdGlvbnMoKS5wdXRQcm9wZXJ0eSguLi4pKSB3aGljaCBjYW4gbGF0ZXIgYmUNCi1hY2Nlc3NlZCBieSB0aGUgbW9kdWxlLjwvcD4NCi08aDQ+UGhhc2UgMjogQXQgQXhpc1NlcnZpY2VCYXNlZE11bHRpTGFuZ3VhZ2VDbGllbnRFbWl0dGVyPC9oND4NCi08cD5GdXJ0aGVyLCBwb2xpY2llcyAoYmFzZWQgb24gdGhlIFdTREwpIGF0IGFwcHJvcHJpYXRlIGxldmVscw0KLShzZXJ2aWNlIGxldmVsLCBvcGVyYXRpb24gbGV2ZWwpIGFyZSBzdG9yZWQgYXMgcG9saWN5IHN0cmluZ3MgaW4NCi10aGUgc3R1Yi4gSWYgdGhlcmUgYXJlIGEgZmV3IHBvbGljaWVzIGF0IGEgZ2l2ZW4gbGV2ZWwsIHRoZXkgYXJlDQotbWVyZ2VkIHRvZ2V0aGVyIGFuZCByZXByZXNlbnRlZCBhcyBhIHNpbmdsZSBwb2xpY3kgaW4gdGhlIHN0dWIuIEZldw0KLW1vcmUgZ2VuZXJpYyBtZXRob2RzIGFyZSBhbHNvIGFkZGVkIHRvIHRoZSBzdHViIHdoaWNoIGFyZSB1c2VkIHRvDQotZXZhbHVhdGUgYW5kIHByb2Nlc3MgdGhlIHBvbGljaWVzIGF0IHJ1bnRpbWUuPC9wPg0KLTxoND5QaGFzZSAzOiBSdW50aW1lPC9oND4NCi08cD5XaGVuIGEgbmV3IHN0dWIgb2JqZWN0IGlzIGNyZWF0ZWQsIHRoZSBwb2xpY3kgc3RyaW5ncyBpbiB0aGUNCi1zdHViIGFyZSBjb252ZXJ0ZWQgaW50byBwb2xpY3kgb2JqZWN0cyBhbmQgYXJlIHNldCBpbiB0aGUNCi1BeGlzRGVzY3JpcHRpb24gaGllcmFyY2h5IHRoYXQgaXMgdXNlZCBpbiB0aGUgc3R1Yi4gSW4gb3RoZXIgd29yZHMsDQotYW55IHBvbGljeSBpbmZvcm1hdGlvbiBhdmFpbGFibGUgaW4gdGhlIFdTREwgd2lsbCBiZSBwcmVzZXJ2ZWQgaW4NCi10aGUgQXhpc1NlcnZpY2Ugb2JqZWN0IHRoYXQgaXMgdXNlZCBpbiB0aGUgc3R1Yi48L3A+DQotPHA+VGhlbiBiYXNlZCBvbiBpdHMgcG9saWN5LCBlYWNoIEF4aXNEZXNjcmlwdGlvbiBpcyBlbmdhZ2VkIHRvIGENCi1zZXQgb2YgbW9kdWxlcy4gTW9kdWxlcyBjYW4gZG8gYSBwcmlvciBjYWxjdWxhdGlvbiBvZg0KLWNvbmZpZ3VyYXRpb25zIGlmIG5lZWRlZCBhdCB0aGUgZW5nYWdlbWVudC48L3A+DQotPHA+V2hlbiB0aGUgc3R1YiBtZXRob2QgaXMgaW52b2tlZCwgdGhvc2UgbW9kdWxlcyB3aGljaCBhcmUgZW5nYWdlZA0KLXRvIHRoYXQgQXhpc0Rlc2NyaXB0aW9uLCBhY2Nlc3MgdGhlIHBvbGljeSBmb3IgdGhhdCBvcGVyYXRpb24gdmlhDQotdGhlIEF4aXNEZXNjcmlwdGlvbiBvYmplY3QuIEl0IGNhbiBnZXQgdGhlIG90aGVyIHJlcXVpcmVkDQotaW5mb3JtYXRpb24gZnJvbSB0aGUgTWVzc2FnZUNvbnRleHQsIHdoaWNoIGlzIHN0b3JlZCBieSBzdHViDQotbWV0aG9kcyB0aGF0IHRoZSBtb2R1bGUgaGFzIGFkZGVkIHRvIHRoZSBzdHViIGVhcmxpZXIsIHRocm91Z2ggdGhlDQotTW9kdWxlUG9saWN5RXh0ZW5zaW9uIGltcGxlbWVudGF0aW9uLiBUaGUgbW9kdWxlcyBhcmUgcmVxdWlyZWQgdG8NCi1sb2FkIHRoZWlyIGNvbmZpZ3VyYXRpb25zIGFjY29yZGluZyB0byB0aGUgZWZmZWN0aXZlIHBvbGljeSwgd2hpY2gNCi1pcyBzZXQgYXQgQXhpc0Rlc2NyaXB0aW9uLCBhbmQgdGhlIHByb3BlcnRpZXMgdGhleSBnZXQgdmlhDQotTWVzc2FnZUNvbnRleHQuPC9wPg0KLTxhIG5hbWU9InNlcnZlciIgaWQ9InNlcnZlciI+PC9hPg0KLTxoMj5TZXJ2ZXIgU2lkZSBXUy1Qb2xpY3kgU3VwcG9ydDwvaDI+DQotPHA+SW4gdGhpcyBjdXJyZW50IHJlbGVhc2UsIHRoZSBBcGFjaGUgQXhpczIgZnJhbWV3b3JrIHVzZXMgdGhlDQotV1MtQ29tbW9ucy9OZWV0aGkgZnJhbWV3b3JrIHRvIG1hbmlwdWxhdGUgcG9saWN5IGRvY3VtZW50cy4gQWxsIGl0cw0KLWRlc2NyaXB0aW9uIGJ1aWxkZXJzIHN0b3JlIHRoZSBwb2xpY3kgaW5mb3JtYXRpb24gaW5jbHVkZWQgaW4NCi1kZXNjcmlwdGlvbiBkb2N1bWVudHMgKHNlcnZpY2VzLnhtbCwgYXhpczIueG1sLCAuLiBldGMpIGluIHRoZQ0KLWFwcHJvcHJpYXRlIGRlc2NyaXB0aW9uIGNsYXNzZXMuIFRoaXMgaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlIGF0DQotYm90aCBkZXBsb3ltZW50IGFuZCBydW4gdGltZSB2aWEgdGhlc2UgZGVzY3JpcHRpb24gY2xhc3Nlcy48L3A+DQotPHA+V2hlbiBnZW5lcmF0aW5nIFdTREwgZHluYW1pY2FsbHkgZm9yIGVhY2ggc2VydmljZSwgcG9saWN5DQotaW5mb3JtYXRpb24gaW4gdGhlIGRlc2NyaXB0aW9uIGNsYXNzZXMgaXMgaW5jbHVkZWQuIEZvciBpbnN0YW5jZSwNCi1pZiB5b3UgZGVjbGFyZSBhIHBvbGljeSBpbiBheGlzMi54bWwsIHRoZW4gdGhhdCBwb2xpY3kgaXMgcmVmbGVjdGVkDQotaW4gdGhlIHNlcnZpY2UgZWxlbWVudHMgb2YgdGhlIFdTREwgb2YgZXZlcnkgc2VydmljZS4gSWYgYSBwb2xpY3kNCi1pcyBkZWNsYXJlZCBpbiBhIHNlcnZpY2VzLnhtbCwgaXQgaXMgc2hvd24gaW4gdGhlIHNlcnZpY2UgZWxlbWVudA0KLW9mIFdTREwgZm9yIHRoYXQgcGFydGljdWxhciBzZXJ2aWNlLjwvcD4NCi08cD5GdXJ0aGVyLCB3aGVuIGEgc2VydmljZSBpcyBkZXBsb3llZCwgYW4gYXJiaXRhcnkgcG9saWN5DQotYWx0ZXJuYXRpdmUgaXMgc2VsZWN0ZWQgYW5kIHNldCBmb3IgZWFjaCBBeGlzT3BlcmF0aW9uIGFuZA0KLUF4aXNNZXNzYWdlcyBvZiB0aGUgQXhpc1NlcnZpY2UuIElmIHRoZSBzZWxlY3RlZCBQb2xpY3kgYWx0ZXJuYXRpdmUNCi1jYW5ub3QgYmUgc3VwcG9ydGVkIGJ5IGFueSBtb2R1bGVzIHRoYXQgYXJlIGNhcGFibGUgb2YgcHJvY2Vzc2luZw0KLXRoZSBzZWxlY3RpdmUgYWx0ZXJuYXRpdmUsIHRoZW4gdGhlIHNlcnZpY2UgaXMgY29uc2lkZXJlZCBhcyBhDQotZmF1bHR5IHNlcnZpY2UuIEVsc2UsIHRoZSBzZXQgb2YgbW9kdWxlcyBpcyBlbmdhZ2VkIGF0IGFwcHJvcHJpYXRlDQotbGV2ZWxzIHRvIHN1cHBvcnQgdGhlIHJlcXVpcm1lbnRzIGFuZCBjYXBhYmlsaXRpZXMgdGhhdCBhcmUgZGVmaW5lZA0KLWluIHRoZSBQb2xpY2llcyBhc3NvY2lhdGVkIHdpdGggdGhlIEF4aXNEZXNjcmlwdGlvbi48L3A+DQotPHA+SXQgaXMgZXZpZGVudCB0aGF0IHRoZXJlIGlzIHNvbWUgd29yayBsZWZ0IHRvIG1ha2UgQXBhY2hlIEF4aXMyDQotYSBmdWxseSBmbGVkZ2VkIHdzLXBvbGljeSBzdXBwb3J0ZWQgV2ViIHNlcnZpY2UgaW5mcmFzdHJ1Y3R1cmUuDQotSG93ZXZlciwgaXQgaXMgZW5jb3VyYWdpbmcgdG8gbm90ZSB0aGF0IHdlJ3ZlIHRha2VuIHRoZSBmaXJzdCBzdGVwcw0KLXRvd2FyZHMgdGhpcyBnb2FsLiBXZSBhcHByZWNpYXRlIGFueSBzdWdnZXN0aW9ucywgcGF0Y2hlcywgZXRjLiwNCi15b3Ugc2VuZCB1cyBpbiB0aGlzIHJlZ2FyZC4gS2VlcCBvbiBjb250cmlidXRpbmchPC9wPg0KLTxhIG5hbWU9InJlc291cmNlcyIgaWQ9InJlc291cmNlcyI+PC9hPg0KLTxoMj5SZXNvdXJjZXM8L2gyPg0KLTx1bD4NCi08bGk+QXBhY2hlIE5lZXRoaSAoV1MgUG9saWN5IEltcGxlbWVudGF0aW9uKSBvZmZpY2lhbCBzaXRlLQ0KLTxhIGhyZWY9Imh0dHA6Ly93cy5hcGFjaGUub3JnL2NvbW1vbnMvbmVldGhpL2luZGV4Lmh0bWwiIHRhcmdldD0NCi0iX2JsYW5rIj5Ib21lIFBhZ2U8L2E+PC9saT4NCi08bGk+U2Fua2EgU2FtYXJhbmF5YWtlLCBNYXJjaCAyMDA2LiA8YSBocmVmPQ0KLSJodHRwOi8vd3d3LndzbzIubmV0L2FydGljbGVzL25lZXRoaS9qYXZhLzIwMDYvMDEvMjQvd3MtcG9saWN5Ig0KLXRhcmdldD0iX2JsYW5rIj5XZWIgc2VydmljZXMgUG9saWN5IC0gV2h5LCBXaGF0ICZhbXA7IEhvdzwvYT48L2xpPg0KLTxsaT48YSBocmVmPQ0KLSJodHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld2N2cy5jZ2kvd2Vic2VydmljZXMvY29tbW9ucy90cnVuay9tb2R1bGVzL25lZXRoaS8iDQotdGFyZ2V0PSJfYmxhbmsiPldTLWNvbW1vbnMvcG9saWN5IFNWTjwvYT48L2xpPg0KLTxsaT48YSBocmVmPQ0KLSJodHRwOi8vc3BlY3MueG1sc29hcC5vcmcvd3MvMjAwNC8wOS9wb2xpY3kvd3MtcG9saWN5LnBkZiIgdGFyZ2V0PQ0KLSJfYmxhbmsiPldlYiBTZXJ2aWNlcyBQb2xpY3kgRnJhbWV3b3JrIChXUy1Qb2xpY3kpPC9hPjwvbGk+DQotPC91bD4NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9hZGIvYWRiLWFkdmFuY2VkLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9hZGIvYWRiLWFkdmFuY2VkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjc5ZjQxNC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvYWRiL2FkYi1hZHZhbmNlZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiINCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPg0KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4NCi08aGVhZD4NCi08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9DQotIkhUTUwgVGlkeSBmb3IgV2luZG93cyAodmVycyAxNCBKdW5lIDIwMDcpLCBzZWUgd3d3LnczLm9yZyIgLz4NCi08bWV0YSBodHRwLWVxdWl2PSJjb250ZW50LXR5cGUiIGNvbnRlbnQ9DQotInRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4NCi08dGl0bGU+QWR2YW5jZWQgQXhpczIgRGF0YWJpbmRpbmcgRnJhbWV3b3JrIEZlYXR1cmVzPC90aXRsZT4NCi08bGluayBocmVmPSIuLi8uLi9jc3MvYXhpcy1kb2NzLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPQ0KLSJ0ZXh0L2NzcyIgbWVkaWE9ImFsbCIgLz4NCi08L2hlYWQ+DQotPGJvZHkgbGFuZz0iZW4iIHhtbDpsYW5nPSJlbiI+DQotPGgxPkFkdmFuY2VkIEF4aXMyIERhdGFiaW5kaW5nIEZyYW1ld29yayBGZWF0dXJlczwvaDE+DQotPHA+VGhlIGFpbSBvZiB0aGlzIHNlY3Rpb24gaXMgcHJvdmlkZSBhbiBpbnNpZ2h0IGludG8gdGhlIG5ld2x5DQotYWRkZWQgYWR2YW5jZWQgZmVhdHVyZXMgb2YgdGhlIEF4aXMyIERhdGFiaW5kaW5nIChBREIpDQotRnJhbWV3b3JrLjwvcD4NCi08aDI+Q29udGVudDwvaDI+DQotPHVsPg0KLTxsaT48YSBocmVmPSIjdHlwZVN1cHBvcnQiPnhzaTp0eXBlIFN1cHBvcnQ8L2E+PC9saT4NCi08bGk+PGEgaHJlZj0iI2hlbHBlciI+SGVscGVyIE1vZGU8L2E+PC9saT4NCi08bGk+PGEgaHJlZj0iI21vcmUiPkFkZGl0aW9uYWwgQURCIFRvcGljczwvYT48L2xpPg0KLTwvdWw+DQotPGEgbmFtZT0idHlwZVN1cHBvcnQiIGlkPSJ0eXBlU3VwcG9ydCI+PC9hPg0KLTxoMj54c2k6dHlwZSBTdXBwb3J0PC9oMj4NCi08cD5UaGlzIGlzIGltcGxlbWVudGVkIGJ5IGFkZGluZyBhIGV4dGVuc2lvbiBtYXBwaW5nIGNsYXNzLiBUaGUNCi1jb2RlIHRoYXQgY2FsbHMgdGhlIGV4dGVuc2lvbiBtYXBwZXIgaXMgZ2VuZXJhdGVkIGluc2lkZSB0aGUNCi1GYWN0b3J5LnBhcnNlIG1ldGhvZCBvZiB0aGUgYmVhbnMgYW5kIGdldHMgYWN0aXZhdGVkIHdoZW4gdGhlDQoteHNpOnR5cGUgYXR0cmlidXRlIGlzIHByZXNlbnQuIFRoZSBmb2xsb3dpbmcgY29kZSBmcmFnbWVudCBzaG93cw0KLXdoYXQgdGhlIGdlbmVyYXRlZCB0eXBlIG1hcHBlciBsb29rcyBsaWtlIDo8L3A+DQotPHByZT4NCi0gICAgICAgICAgICBwdWJsaWMgc3RhdGljIGphdmEubGFuZy5PYmplY3QgZ2V0VHlwZU9iamVjdChqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgdHlwZU5hbWUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uew0KLSAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgICAgaWYgKA0KLSAgICAgICAgICAgICAgICAgICJodHRwOi8vc29hcGludGVyb3Aub3JnL3R5cGVzIi5lcXVhbHMobmFtZXNwYWNlVVJJKSAmYW1wOyZhbXA7DQotICAgICAgICAgICAgICAgICAgIlNPQVBTdHJ1Y3QiLmVxdWFscyh0eXBlTmFtZSkpew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIGNvbS50ZXN0LlNPQVBTdHJ1Y3QuRmFjdG9yeS5wYXJzZShyZWFkZXIpOw0KLSAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbigiVW5zdXBwb3J0ZWQgdHlwZSAiICsgbmFtZXNwYWNlVVJJICsgIiAiICsgdHlwZU5hbWUpOw0KLSAgICAgICAgICAgIH0NCi08L3ByZT4NCi08cD5JbnNpZGUgZXZlcnkgRmFjdG9yeS5wYXJzZSBtZXRob2QsIHRoZSBleHRlbnNpb24gbWFwcGVyIGdldHMNCi1jYWxsZWQgd2hlbiBhIHhzaTp0eXBlIGF0dHJpYnV0ZSBpcyBlbmNvdW50ZXJlZA0KLTxzdHJvbmc+YW5kPC9zdHJvbmc+IHRoYXQgdHlwZSBpcyBub3QgdGhlIHR5cGUgdGhhdCBpcyBjdXJyZW50bHkNCi1iZWluZyBwYXJzZWQuPC9wPg0KLTxwPlRoZSBmb2xsb3dpbmcgY29kZSBmcmFnbWVudCBzaG93cyBob3cgdGhlIEFEQiBkZXNlcmlhbGl6ZSBtZXRob2QNCi1jYWxscyB0aGUgbWFwcGVyIGNsYXNzOjwvcD4NCi08cHJlPg0KLSAgICAgICAgICAgICBpZiAocmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiKSE9bnVsbCl7DQotICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBmdWxsVHlwZU5hbWUgPSByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAidHlwZSIpOw0KLSAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUhPW51bGwpew0KLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1ByZWZpeCA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoMCxmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKTsNCi0gICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gbnNQcmVmaXg9PW51bGw/IiI6bnNQcmVmaXg7DQotDQotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHR5cGUgPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikrMSk7DQotICAgICAgICAgICAgICAgICAgICBpZiAoISJTT0FQU3RydWN0Ii5lcXVhbHModHlwZSkpew0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vZmluZCBuYW1lc3BhY2UgZm9yIHRoZSBwcmVmaXgNCi0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zVXJpID0gcmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkobnNQcmVmaXgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoU09BUFN0cnVjdClvcmcuc29hcGludGVyb3AudHlwZXMuRXh0ZW5zaW9uTWFwcGVyLmdldFR5cGVPYmplY3QoDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc1VyaSx0eXBlLHJlYWRlcik7DQotICAgICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICB9DQotPC9wcmU+DQotPHA+VGhpcyBtYWtlcyB4c2k6dHlwZSBiYXNlZCBwYXJzaW5nIHBvc3NpYmxlIGFuZCByZXN1bHRzIGluIHByb3Blcg0KLXhzaTp0eXBlIGJhc2VkIHNlcmlhbGl6YXRpb25zIGF0IHJ1bnRpbWUuPC9wPg0KLTxwPkJ5IGRlZmF1bHQsIHRoZSBtYXBwaW5nIHBhY2thZ2UgaXMgZGVyaXZlZCBmcm9tIHRoZQ0KLXRhcmdldG5hbWVzcGFjZSBvZiB0aGUgZmlyc3Qgc2NoZW1hIHRoYXQgaXMgZW5jb3VudGVyZWQuIFRoZQ0KLXBhY2thZ2UgbmFtZSBjYW4gYWxzbyBiZSBleHBsaWNpdGx5IHNldCBieSBhIENvbXBpbGVyT3B0aW9uOjwvcD4NCi08cHJlPg0KLSAgIA0KLSAgICAgICAgQ29tcGlsZXJPcHRpb25zIGNvbXBpbGVyT3B0aW9ucyA9IG5ldyBDb21waWxlck9wdGlvbnMoKTsNCi0gICAgICAgIGNvbXBpbGVyT3B0aW9ucy5zZXRXcml0ZU91dHB1dCh0cnVlKTsNCi0gICAgICAgIDxzdHJvbmc+Y29tcGlsZXJPcHRpb25zLnNldE1hcHBlckNsYXNzUGFja2FnZSgiY29tLnRlc3QiKTs8L3N0cm9uZz4NCi0gICAgICAgIGNvbXBpbGVyT3B0aW9ucy5zZXRPdXRwdXRMb2NhdGlvbihuZXcgRmlsZSgic3JjIikpOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBTY2hlbWFDb21waWxlciBzY2hlbWFDb21waWxlciA9IG5ldyBTY2hlbWFDb21waWxlcihjb21waWxlck9wdGlvbnMpOw0KLSAgICAgICAgICAgIFhtbFNjaGVtYUNvbGxlY3Rpb24geG1sU2NoZW1hQ29sbGVjdGlvbiA9IG5ldyBYbWxTY2hlbWFDb2xsZWN0aW9uKCk7DQotICAgICAgICAgICAgWG1sU2NoZW1hIHhtbFNjaGVtYSA9eG1sU2NoZW1hQ29sbGVjdGlvbi5yZWFkKG5ldyBGaWxlUmVhZGVyKCJzY2hlbWEvc2FtcGxlLnhzZCIpLG51bGwpOw0KLSAgICAgICAgICAgIHNjaGVtYUNvbXBpbGVyLmNvbXBpbGUoeG1sU2NoZW1hKTsNCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgIH0NCi08L3ByZT4NCi08YSBuYW1lPSJoZWxwZXIiIGlkPSJoZWxwZXIiPjwvYT4NCi08aDI+SGVscGVyIG1vZGU8L2gyPg0KLTxwPkhlbHBlciBtb2RlIGlzIGEgZmFpcmx5IG5ldyBmZWF0dXJlLiBJbiB0aGUgaGVscGVyIG1vZGUsIHRoZQ0KLWJlYW5zIGFyZSBwbGFpbiBKYXZhIGJlYW5zIGFuZCBhbGwgdGhlDQotZGVzZXJpYWxpemF0aW9uL3NlcmlhbGl6YXRpb24gY29kZSBpcyBtb3ZlZCB0byBhIGhlbHBlciBjbGFzcy4gRm9yDQotZXhhbXBsZSwgdGhlIHNpbXBsZSBzY2hlbWEgbWVudGlvbmVkIGluIHRoZSBBREItaG93dG8gZG9jdW1lbnQgd2lsbA0KLXlpZWxkIGZvdXIgY2xhc3NlcyBpbnN0ZWFkIG9mIHRoZSB0d28gcHJldmlvdXNseSBnZW5lcmF0ZWQ6PC9wPg0KLTxvbD4NCi08bGk+TXlFbGVtZW50LmphdmE8L2xpPg0KLTxsaT5NeUVsZW1lbnRIZWxwZXIuamF2YTwvbGk+DQotPGxpPlNPQVBTdHJ1Y3QuamF2YTwvbGk+DQotPGxpPlNPQVBTdHJ1Y3RIZWxwZXIuamF2YTwvbGk+DQotPC9vbD4NCi08cD5UaGUgaGVscGVycyBiYXNpY2FsbHkgY29udGFpbiBhbGwgdGhlIHNlcmlhbGl6YXRpb24gY29kZSB0aGF0DQotb3RoZXJ3aXNlIHdvdWxkIGdvIGludG8gdGhlIEFEQkJlYW5zLiBIZW5jZSB0aGUgYmVhbnMgaW4gdGhlIGhlbHBlcg0KLW1vZGUgYXJlIG11Y2ggbW9yZSBzaW1wbGlmaWVkLiBBbHNvIG5vdGUgdGhhdCB0aGUgaGVscGVyIG1vZGUgaXMNCi1hdmFpbGFibGUgb25seSBpZiB5b3UgYXJlIGluIHVucGFja2VkIG1vZGUuIFRoZSBjb2RlIGdlbmVyYXRvciBieQ0KLWRlZmF1bHQgZG9lcyBub3QgZXhwYW5kIHRoZSBjbGFzc2VzLjwvcD4NCi08cD5IZWxwZXIgbW9kZSBjYW4gYmUgc3dpdGNoZWQgb24gYnkgdXNpbmcgdGhlIHNldEhlbHBlck1vZGUgbWV0aG9kDQotaW4gQ29tcGlsZXJPcHRpb25zOjwvcD4NCi08cHJlPg0KLTxzdHJvbmc+Y29tcGlsZXJPcHRpb25zLnNldEhlbHBlck1vZGUodHJ1ZSk7PC9zdHJvbmc+DQotPC9wcmU+DQotPGEgbmFtZT0ibW9yZSIgaWQ9Im1vcmUiPjwvYT4NCi08aDI+QWRkaXRpb25hbCBBREIgVG9waWNzPC9oMj4NCi08dWw+DQotPGxpPjxhIGhyZWY9ImFkYi10d2Vha2luZy5odG1sIj5Ud2Vha2luZyB0aGUgQURCIENvZGUNCi1HZW5lcmF0b3I8L2E+LSBleHBsYWlucyBhdmFpbGFibGUgbWVjaGFuaXNtcyB0byBleHRlbmQgQURCIGFuZA0KLXBvc3NpYmx5IGFkb3B0IGl0IHRvIGNvbXBpbGUgc2NoZW1hcyB0byBzdXBwb3J0IG90aGVyDQotbGFuZ3VhZ2VzLjwvbGk+DQotPGxpPjxhIGhyZWY9ImFkYi1jb2RlZ2VuLWludGVncmF0aW9uLmh0bWwiPkFEQiBhbmQgQXhpczINCi1JbnRlZ3JhdGlvbjwvYT4gLSBleHBsYWlucyBob3cgdGhlIEFEQiBzY2hlbWEgY29tcGlsZXIgd2FzIGF0dGFjaGVkDQotdG8gdGhlIEF4aXMyIGZyYW1ld29yazwvbGk+DQotPC91bD4NCi08aHIgLz4NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9hZGIvYWRiLWNvZGVnZW4taW50ZWdyYXRpb24ueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2FkYi9hZGItY29kZWdlbi1pbnRlZ3JhdGlvbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1MGVjZGUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2FkYi9hZGItY29kZWdlbi1pbnRlZ3JhdGlvbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiINCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPg0KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4NCi08aGVhZD4NCi08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9DQotIkhUTUwgVGlkeSBmb3IgV2luZG93cyAodmVycyAxNCBKdW5lIDIwMDcpLCBzZWUgd3d3LnczLm9yZyIgLz4NCi08dGl0bGU+QURCIEludGVncmF0aW9uIFdpdGggQXhpczI8L3RpdGxlPg0KLTxsaW5rIGhyZWY9Ii4uLy4uL2Nzcy9heGlzLWRvY3MuY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9DQotInRleHQvY3NzIiBtZWRpYT0iYWxsIiAvPg0KLTwvaGVhZD4NCi08Ym9keT4NCi08aDE+QURCIEludGVncmF0aW9uIFdpdGggQXhpczI8L2gxPg0KLTxwPlRoaXMgZG9jdW1lbnQgd2lsbCBhc3Npc3QgeW91IGluIHdyaXRpbmcgYW4gZXh0ZW5zaW9uIHVzaW5nIHRoZQ0KLWludGVncmF0b3IgaW4gb3JkZXIgdG8gaW50ZWdyYXRlIEFEQiB3aXRoIEF4aXMyLjwvcD4NCi08aDI+Q29udGVudDwvaDI+DQotPHVsPg0KLTxsaT48YSBocmVmPSIjaW50cm8iPkludHJvZHVjdGlvbjwvYT48L2xpPg0KLTxsaT48YSBocmVmPSIjc2VsZWN0X21vZGVzIj5TZWxlY3Rpb24gb2YgR2VuZXJhdGlvbiBNb2RlcyBmb3INCi1BREI8L2E+PC9saT4NCi08bGk+PGEgaHJlZj0iI3JlbWVtYmVyIj5UaGluZ3MgdG8gUmVtZW1iZXI8L2E+PC9saT4NCi08L3VsPg0KLTxoMj48YSBuYW1lPSJpbnRybyIgaWQ9ImludHJvIj5JbnRyb2R1Y3Rpb248L2E+PC9oMj4NCi08cD5BREIgSW50ZWdyYXRpb24gd2l0aCBBeGlzMiBpcyBzaW1wbGUgYW5kIHN0cmFpZ2h0Zm9yd2FyZC4gR2l2ZW4NCi10aGUgZXh0ZW5zaW9uIG1lY2hhbmlzbSBvZiB0aGUgQXhpczIgY29kZSBnZW5lcmF0b3IsIHRoZSBvYnZpb3VzDQotY2hvaWNlIGZvciB0aGUgaW50ZWdyYXRvciBpcyB0byB3cml0ZSBhbiBleHRlbnNpb24uIFRoZSBleHRlbnNpb24NCi10aGF0IGlzIGFkZGVkIHRvIHN1cHBvcnQgQURCIGlzIHRoZSBTaW1wbGVEQkV4dGVuc2lvbg0KLSg8c3Ryb25nPm9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLmV4dGVuc2lvbi5TaW1wbGVEQkV4dGVuc2lvbjwvc3Ryb25nPikNCi1hbmQgY2FuIGJlIGZvdW5kIGluIHRoZSBleHRlbnNpb25zIGxpc3Qgb2YgdGhlDQotY29kZWdlbi1jb25maWcucHJvcGVydGllcyBmaWxlLjwvcD4NCi08YSBuYW1lPSJzZWxlY3RfbW9kZXMiIGlkPSJzZWxlY3RfbW9kZXMiPjwvYT4NCi08aDI+U2VsZWN0aW9uIG9mIEdlbmVyYXRpb24gTW9kZXMgZm9yIEFEQjwvaDI+DQotPHA+VGhlIGV4dGVuc2lvbiBzZXRzIHRoZSBvcHRpb25zIGZvciB0aGUgY29kZSBnZW5lcmF0b3IgdmlhIHRoZQ0KLUNvbXBpbGVyT3B0aW9ucywgZGVwZW5kaW5nIG9uIHRoZSB1c2VyJ3Mgc2V0dGluZ3MuIFRoZSBmb2xsb3dpbmcNCi10YWJsZSBzdW1tYXJpemVzIHRoZSB1c2Ugb2Ygb3B0aW9ucy4gUGxlYXNlIHJlZmVyIHRvIHRoZSA8YSBocmVmPQ0KLSJhZGItaG93dG8uaHRtbCIgdGFyZ2V0PSJfYmxhbmsiPkFEQi1Ib3cgdG8gZG9jdW1lbnQ8L2E+IGZvciB0aGUNCi1kaWZmZXJlbnQgZ2VuZXJhdGlvbiBtb2RlcyBhbmQgdGhlaXIgZGVzY3JpcHRpb25zLjwvcD4NCi08dGFibGUgYm9yZGVyPSIxIj4NCi08dGJvZHk+DQotPHRyPg0KLTx0ZD48c3Ryb25nPlVzZXIgcGFyYW1ldGVyczwvc3Ryb25nPjwvdGQ+DQotPHRkPjxzdHJvbmc+U2VsZWN0ZWQgY29kZSBnZW5lcmF0aW9uIHBhcmFtZXRlcnM8L3N0cm9uZz48L3RkPg0KLTwvdHI+DQotPHRyPg0KLTx0ZD5Ob25lIChubyBwYXJhbWV0ZXIgb3RoZXIgdGhhbiBtYW5kYXRvcnkgb25lcyk8L3RkPg0KLTx0ZD53cmFwQ2xhc3Nlcz1mYWxzZSx3cml0ZUNsYXNzZXM9ZmFsc2U8L3RkPg0KLTwvdHI+DQotPHRyPg0KLTx0ZD4tc3MgKHNlcnZlciBzaWRlKTwvdGQ+DQotPHRkPndyYXBDbGFzc2VzPWZhbHNlLHdyaXRlQ2xhc3Nlcz10cnVlPC90ZD4NCi08L3RyPg0KLTx0cj4NCi08dGQ+LXUgKHVud3JhcCBjbGFzc2VzKTwvdGQ+DQotPHRkPndyYXBDbGFzc2VzPWZhbHNlLHdyaXRlQ2xhc3Nlcz10cnVlPC90ZD4NCi08L3RyPg0KLTwvdGJvZHk+DQotPC90YWJsZT4NCi08cD5UaGUgZm9sbG93aW5nIHBhcmFtZXRlcnMgKHByZWZpeGVkIHdpdGggLUUpIGNhbiBiZSB1c2VkIHRvDQotb3ZlcnJpZGUgdGhlc2Ugc2V0dGluZ3MgbWFudWFsbHk6PC9wPg0KLTx0YWJsZSBib3JkZXI9IjEiPg0KLTx0Ym9keT4NCi08dHI+DQotPHRkPjxzdHJvbmc+UGFyYW1ldGVyIE5hbWU8L3N0cm9uZz48L3RkPg0KLTx0ZD48c3Ryb25nPkFsbG93ZWQgdmFsdWVzPC9zdHJvbmc+PC90ZD4NCi08dGQ+PHN0cm9uZz5EZXNjcmlwdGlvbjwvc3Ryb25nPjwvdGQ+DQotPC90cj4NCi08dHI+DQotPHRkPnI8L3RkPg0KLTx0ZD50cnVlLCBmYWxzZTwvdGQ+DQotPHRkPlNldHMgdGhlIHdyaXRlIGZsYWcuIElmIHNldCB0byB0cnVlIHRoZSBjbGFzc2VzIHdpbGwgYmUgd3JpdHRlbg0KLWJ5IEFEQjwvdGQ+DQotPC90cj4NCi08dHI+DQotPHRkPnc8L3RkPg0KLTx0ZD50cnVlLCBmYWxzZTwvdGQ+DQotPHRkPlNldHMgdGhlIHdyYXBwaW5nIGZsYWcuIGlmIHRydWUgdGhlIGNsYXNzZXMgd2lsbCBiZQ0KLXdyYXBwZWQuPC90ZD4NCi08L3RyPg0KLTwvdGJvZHk+DQotPC90YWJsZT4NCi08cD5Ob3RlIHRoYXQgdGhlc2UgcGFyYW1ldGVycyBoYXZlIG5vIGNvcnJlc3BvbmRpbmcgbG9uZyBuYW1lcyBhbmQNCi1NVVNUIGJlIHByZWZpeGVkIHdpdGggYSAtRSB0byBiZSBwcm9jZXNzZWQgYnkgdGhlIGNvZGUgZ2VuZXJhdG9yLg0KLUZvciBleGFtcGxlOjwvcD4NCi08cHJlPg0KLVdTREwySmF2YSAuLi4uIC1FciB0cnVlDQotPC9wcmU+DQotPGEgbmFtZT0icmVtZW1iZXIiIGlkPSJyZW1lbWJlciI+PC9hPg0KLTxoMj5UaGluZ3MgdG8gUmVtZW1iZXI8L2gyPg0KLTxvbD4NCi08bGk+U2ltcGxlREJFeHRlbnNpb24gaXMgZm9yIHRoZSBBREIgZGF0YWJpbmRpbmcgZnJhbWV3b3JrIG9ubHkgYW5kDQotd2lsbCBwcm9jZXNzIHJlcXVlc3RzIG9ubHkgd2hlbiB0aGlzIGZyYW1ld29yayBpcyBzcGVjaWZpZWQgZHVyaW5nDQotY29kZSBnZW5lcmF0aW9uICh1c2luZyB0aGUgc3dpdGNoIC1kIGFkYikuIEluIHRoZSBtb3N0IHJlY2VudA0KLXJlbGVhc2UsIHRoZSBkZWZhdWx0IGhhcyBiZWVuIHNldCBhcyBBREIgYW5kIGhlbmNlIGlmIHRoZSAtZCBvcHRpb24NCi1pcyBtaXNzaW5nIHRoZW4gdGhlIGRhdGFiaW5kaW5nIGZyYW1ld29yayB3aWxsIGJlIEFEQi48L2xpPg0KLTwvb2w+DQotPGhyIC8+DQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvYWRiL2FkYi1ob3d0by54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvYWRiL2FkYi1ob3d0by54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzODllMWUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2FkYi9hZGItaG93dG8ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDI4ICswLDAgQEAKLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iDQotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4NCi08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+DQotPGhlYWQ+DQotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PQ0KLSJIVE1MIFRpZHkgZm9yIFdpbmRvd3MgKHZlcnMgMTQgSnVuZSAyMDA3KSwgc2VlIHd3dy53My5vcmciIC8+DQotPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PQ0KLSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+DQotPHRpdGxlPkFEQiAtIEhvd3RvPC90aXRsZT4NCi08bGluayBocmVmPSIuLi8uLi9jc3MvYXhpcy1kb2NzLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPQ0KLSJ0ZXh0L2NzcyIgbWVkaWE9ImFsbCIgLz4NCi08L2hlYWQ+DQotPGJvZHkgbGFuZz0iZW4iIHhtbDpsYW5nPSJlbiI+DQotPGgxPkF4aXMyIERhdGFiaW5kaW5nIEZyYW1ld29yazwvaDE+DQotPHA+VGhpcyBkb2N1bWVudCBhaW1zIHRvIHByb3ZpZGUgYW4gYXJjaGl0ZWN0dXJhbCBvdmVydmlldyBvZiB0aGUNCi1BeGlzMiBEYXRhYmluZGluZyBGcmFtZXdvcmsgKHJlZmVycmVkIHRvIGFzIEFEQiBmcm9tIGhlcmUgb253YXJkcykNCi1hbmQgYmUgYSBndWlkZSB0byBhbnlvbmUgd2hvIHdhbnRzIHRvIHVzZSBhbmQgbW9kaWZ5IEFEQi4gVGhlDQotaW5mb3JtYXRpb24gaXMgcHJlc2VudGVkIHVuZGVyIHRoZSBmb2xsb3dpbmcgdG9waWNzLjwvcD4NCi08aDI+Q29udGVudDwvaDI+DQotPHVsPg0KLTxsaT48YSBocmVmPSIjaW50cm8iPkludHJvZHVjdGlvbjwvYT48L2xpPg0KLTxsaT48YSBocmVmPSIjYXJjaGkiPkFyY2hpdGVjdHVyYWwgT3ZlcnZpZXc8L2E+PC9saT4NCi08bGk+PGEgaHJlZj0iI2NvZGVfZGVwZW5kIj5Db2RlIGFuZCBEZXBlbmRlbmNpZXM8L2E+PC9saT4NCi08bGk+PGEgaHJlZj0iI2NvZGVfZ2VuIj5JbnZva2luZyB0aGUgQURCIENvZGUgR2VuZXJhdG9yPC9hPg0KLTx1bD4NCi08bGk+PGEgaHJlZj0iI3NjaGVtYV9jb21waWxlciI+QXMgYSBTdGFuZC1hbG9uZSBTY2hlbWENCi1Db21waWxlcjwvYT48L2xpPg0KLTxsaT48YSBocmVmPSIjYXBpIj5UaHJvdWdoIHRoZSBBUEk8L2E+PC9saT4NCi08L3VsPg0KLTwvbGk+DQotPGxpPjxhIGhyZWY9IiNnZW5fbW9kZXMiPkdlbmVyYXRpb24gTW9kZXM8L2E+PC9saT4NCi08bGk+PGEgaHJlZj0iI2RlZXAiPkRlZXAgaW50byBHZW5lcmF0ZWQgQ29kZTwvYT4NCi08dWw+DQotPGxpPjxhIGhyZWY9IiNleGFtcGxlIj5BbiBFeGFtcGxlITwvYT48L2xpPg0KLTwvdWw+DQotPC9saT4NCi08bGk+PGEgaHJlZj0iI2xpbWl0YXRpb24iPktub3duIExpbWl0YXRpb25zPC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9IiNtb3JlIj5XYW50IHRvIExlYXJuIE1vcmU/PC9hPjwvbGk+DQotPC91bD4NCi08YSBuYW1lPSJpbnRybyIgaWQ9ImludHJvIj48L2E+DQotPGgyPkludHJvZHVjdGlvbjwvaDI+DQotPHA+VGhlIG9iamVjdGl2ZSBvZiB0aGUgQXhpczIgRGF0YWJpbmRpbmcgZnJhbWV3b3JrIGlzIHRvIHByb3ZpZGUgYQ0KLWxpZ2h0d2VpZ2h0IGFuZCBzaW1wbGUgc2NoZW1hIGNvbXBpbGVyL0phdmEgYmVhbiBnZW5lcmF0b3IgZm9yDQotQXhpczIuIEJ5IG5vIG1lYW5zIGlzIGl0IGludGVuZGVkIHRvIGJlIGEgZnVsbHkgZnVuY3Rpb25hbCBzY2hlbWENCi1jb21waWxlciBsaWtlIFhNTEJlYW5zLiBOb3RlIHRoYXQgQURCIGlzIHdyaXR0ZW4gaW4gYSBmYXNoaW9uIHRoYXQNCi1hbGxvd3MgaXQgdG8gYmUgdXNlZCBhcyBhIHN0YW5kLWFsb25lIHNjaGVtYSBjb21waWxlciBhbmQgYWxzbyB0bw0KLWJlIGV4dGVuZGVkIHRvIGdlbmVyYXRlIGNvZGUgZm9yIG90aGVyIGxhbmd1YWdlcy48L3A+DQotPGEgbmFtZT0iYXJjaGkiIGlkPSJhcmNoaSI+PC9hPg0KLTxoMj5BcmNoaXRlY3R1cmFsIE92ZXJ2aWV3PC9oMj4NCi08cD5BREIgaXMgYnVpbHQgb24gYSBtb2R1bGFyIGFyY2hpdGVjdHVyZSB0aGF0IGFsbG93cyBpdCB0byB1dGlsaXplDQotYSBwcmUtY29uZmlndXJlZCB3cml0ZXIgZGVwZW5kaW5nIG9uIHRoZSBjb25maWd1cmF0aW9uLiBUaGUgJ2JpZw0KLWJsb2NrIGRpYWdyYW0nIGZvciB0aGUgY29kZSBnZW5lcmF0b3IgYXJjaGl0ZWN0dXJlIGlzIGRlcGljdGVkDQotYmVsb3cuPC9wPg0KLTxwPjxpbWcgc3JjPSJpbWFnZXMvQURCLmpwZyIgYWx0PSJBREIgYXJjaGl0ZWN0dXJlIiAvPjwvcD4NCi08cD5BREIgdXRpbGl6ZXMgdGhlIFdTLUNvbW1vbnMgPGEgaHJlZj0NCi0iaHR0cDovL3dzLmFwYWNoZS5vcmcvY29tbW9ucy9YbWxTY2hlbWEvaW5kZXguaHRtbCI+WG1sU2NoZW1hDQotbGlicmFyeTwvYT4gZm9yIHJlYWRpbmcgdGhlIFNjaGVtYS4gVGhlIG9iamVjdCBtb2RlbCBmb3IgdGhlIHNjaGVtYQ0KLWNvbWVzIGluIHRoZSBmb3JtIG9mIGFuIFhtbFNjaGVtYSBvYmplY3QuIFRoZSBzY2hlbWEgY29tcGlsZXIga2VlcHMNCi1hbiBpbnN0YW5jZSBvZiB0aGUgd3JpdGVyIChpbiB0aGUgZGVmYXVsdCBjYXNlIGl0J3MgdGhlDQotSmF2YUJlYW5Xcml0ZXIpIHdoaWNoIGFjdHVhbGx5IHdyaXRlcyB0aGUgY2xhc3Nlcy4gVGhlIHdyaXRlcnMgbWF5DQotdXNlIHdoYXRldmVyIHRlY2huaXF1ZSB0aGV5IHByZWZlciwgaW4gdGhlIGNhc2Ugb2YgdGhlDQotSmF2YUJlYW5Xcml0ZXIsIGl0IHVzZXMgYW4gWFNMVCB0ZW1wbGF0ZS4gVGhlIFNjaGVtYUNvbXBpbGVyIGFsc28NCi11c2VzIGEgdHlwZW1hcHBlciBvYmplY3QgdGhhdCB0ZWxscyBpdCB3aGF0IGNsYXNzbmFtZXMgdG8gdXNlIGZvcg0KLXRoZSBRTmFtZXMgdGhhdCBpdCBlbmNvdW50ZXJzLiBUaGlzIHR5cGUgbWFwcGVyIGlzIGFsc28gcGFydCBvZiB0aGUNCi1jb25maWd1cmF0aW9uIGFuZCB0aGUgdXNlcnMgY2FuIG92ZXJyaWRlIHRoZSBkZWZhdWx0IHR5cGUgbWFwcGVyIGJ5DQotb3ZlcnJpZGluZyB0aGUgcHJvcGVydHkgc2V0dGluZy48L3A+DQotPGEgbmFtZT0iY29kZV9kZXBlbmQiIGlkPSJjb2RlX2RlcGVuZCI+PC9hPg0KLTxoMj5Db2RlIGFuZCBEZXBlbmRlbmNpZXM8L2gyPg0KLTxwPkFzIGV4cGxhaW5lZCBpbiB0aGUgcHJldmlvdXMgc2VjdGlvbiwgdGhlIHNjaGVtYSBjb21waWxlcg0KLWRlcGVuZHMgb24gdGhlIFdTLUNvbW1vbnMgWG1sU2NoZW1hIGxpYnJhcnkuIFRoZSBYU0xUDQotdHJhbnNmb3JtYXRpb25zIGFyZSBkZXBlbmRlbnQgb24gdGhlIEpWTSdzIERPTSBpbXBsZW1lbnRhdGlvbg0KLShlaXRoZXIgQ3JpbXNvbiBvciBYZXJjZXMpIHdoaWNoIG1lYW5zIHRoYXQgdGhlIHVuZGVybHlpbmcgSlZNDQotc2hvdWxkIGJlIDEuNCBvciBoaWdoZXIuIEFwYXJ0IGZyb20gdGhhdCBBREIgaGFzIG5vIGRlcGVuZGVuY2llcyBvbg0KLWFueSBvdGhlciBzcGVjaWFsIGphciBmaWxlcy4gVGhlIGNvZGUgZm9yIHRoZSBzY2hlbWEgY29tcGlsZXIgaXMNCi1jb21wbGV0ZWx5IGluIHRoZSA8c3Ryb25nPm9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLio8L3N0cm9uZz4NCi1wYWNrYWdlLiBUaGlzIHBhY2thZ2UgcmVzaWRlcyBpbiB0aGUgY29kZWdlbiBtb2R1bGUgb2YgdGhlIEF4aXMyDQotc291cmNlIHRyZWUuPC9wPg0KLTxwPlRoZSBmb2xsb3dpbmcgYXJlIHRoZSBpbXBvcnRhbnQgY2xhc3NlcyBhbmQgZmlsZXMgb2YgQURCOjwvcD4NCi08b2w+DQotPGxpPjxzdHJvbmc+U2NoZW1hQ29tcGlsZXI8L3N0cm9uZz4gLSBUaGUgd29yayBob3JzZSB0aGF0IHJlYWxseQ0KLWNvbXBpbGVzIHRoZSBzY2hlbWEgaW50byBjbGFzc2VzLjwvbGk+DQotPGxpPjxzdHJvbmc+QmVhbldyaXRlcjwvc3Ryb25nPiAtIEJlYW5Xcml0ZXJzIGhhbmRsZSB0aGUgdGhlIGFjdHVhbA0KLXJlbmRlcmluZyBvZiB0aGUgY2xhc3Nlcy4gQmVhbldyaXRlciBpcyB0aGUgaW50ZXJmYWNlIHRoYXQgd3JpdGVycw0KLW5lZWQgdG8gaW1wbGVtZW50IGluIG9yZGVyIHRvIGJlIHVzZWQgYnkgdGhlIFNjaGVtYUNvbXBpbGVyLjwvbGk+DQotPGxpPjxzdHJvbmc+SmF2YUJlYW5Xcml0ZXI8L3N0cm9uZz4gLSBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZg0KLXRoZSBCZWFuV3JpdGVyIGludGVyZmFjZS48L2xpPg0KLTxsaT48c3Ryb25nPlR5cGVNYXA8L3N0cm9uZz4gLSByZXByZXNlbnRzIHRoZSBpbnRlcmZhY2UgdGhhdCB0aGUNCi1zY2hlbWEgY29tcGlsZXIgdXNlcyB0byBmaW5kIGNsYXNzIG5hbWVzIGZvciBhIGdpdmVuIFFOYW1lLjwvbGk+DQotPGxpPjxzdHJvbmc+SmF2YVR5cGVNYXA8L3N0cm9uZz4gLSB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZg0KLXRoZSBUeXBlTWFwPC9saT4NCi08bGk+PHN0cm9uZz5BREJCZWFuVGVtcGxhdGUueHNsPC9zdHJvbmc+IC0gdGhlIFhTTHRlbXBsYXRlIHRoZQ0KLUphdmFCZWFuV3JpdGVyIHVzZXMuPC9saT4NCi08bGk+PHN0cm9uZz5TY2hlbWEtY29tcGlsZS5wcm9wZXJ0aWVzPC9zdHJvbmc+IC0gVGhlIHByb3BlcnR5IGZpbGUNCi1mb3IgdGhlIHNjaGVtYSBjb21waWxlcjwvbGk+DQotPC9vbD4NCi08cD5UaGUgZWFzaWVzdCB3YXkgdG8gb2J0YWluIHRoZSBBREIgYmluYXJpZXMgaXMgdG8gcnVuIHRoZSBtYXZlbg0KLWJ1aWxkIGZvciB0aGUgQXhpczIgYWRiLWNvZGVnZW4gbW9kdWxlLiBUaGlzIHdpbGwgZ2VuZXJhdGUgdGhlDQotPHN0cm9uZz5heGlzMi1hZGItY29kZWdlbi17JHZlcnNpb259Lmphcjwvc3Ryb25nPiBpbnNpZGUgdGhlIHRhcmdldA0KLWZvbGRlciB3aGljaCBpcyBkaXJlY3RseSB1c2FibGUgd2hlbiB0aGUgQURCIHNjaGVtYSBjb21waWxlciBpcw0KLXJlcXVpcmVkLjwvcD4NCi08cD5UaGUgcnVudGltZSBkZXBlbmRlbmNpZXMgZm9yIHRoZSBBREIgZ2VuZXJhdGVkIGNsYXNzZXMgaXMgaW4gdGhlDQotQXhpczIgYWRiIG1vZHVsZSBhbmQgdGhlIGtlcm5hbCBtb2R1bGUuIEhlbmNlIHRvIGNvbXBpbGUgYW5kIHdvcmsNCi13aXRoIHRoZSBnZW5lcmF0ZWQgY2xhc3NlcyB0aGUNCi08c3Ryb25nPmF4aXMyLWFkYi17JHZlcnNpb259Lmphcjwvc3Ryb25nPiBhbmQNCi08c3Ryb25nPmF4aXMyLWtlcm5hbC17JHZlcnNpb259Lmphcjwvc3Ryb25nPiBuZWVkcyB0byBiZSBpbiB0aGUNCi1jbGFzc3BhdGggaW4gYWRkaXRpb24gdG8gb3RoZXIgZGVwZW5kZW5jaWVzIHN1Y2ggYXMgU3RBWCwgQXhpb20sDQotQ29tbW9ucy1sb2dnaW5nIGFuZCBqYXZheC5hY3RpdmF0aW9uLjwvcD4NCi08YSBuYW1lPSJjb2RlX2dlbiIgaWQ9ImNvZGVfZ2VuIj48L2E+DQotPGgyPkludm9raW5nIHRoZSBBREIgQ29kZSBHZW5lcmF0b3I8L2gyPg0KLTxhIG5hbWU9InNjaGVtYV9jb21waWxlciIgaWQ9InNjaGVtYV9jb21waWxlciI+PC9hPg0KLTxoMz5BcyBhIFN0YW5kYWxvbmUgU2NoZW1hIENvbXBpbGVyPC9oMz4NCi08cD5BREIgY29tZXMgd2l0aCBhIFhTRDJKYXZhIGNvZGUgZ2VuZXJhdG9yIHRoYXQgYWxsb3dzIHRoZSBzY2hlbWFzDQotdG8gYmUgY29tcGlsZWQganVzdCBieSBnaXZpbmcgdGhlIHNjaGVtYSBmaWxlIHJlZmVyZW5jZS4gVGhpcyBtYWluDQotY2xhc3MgaXMgcHJlc2VudGx5IHJhdGhlciBwcmltaXRpdmUgYW5kIGRvZXMgbm90IHByb3ZpZGUgbXVjaA0KLWNvbnRyb2wgb3ZlciB0aGUgY29kZSBnZW5lcmF0aW9uIHByb2Nlc3MuIFRoaXMgaXMgYm91bmQgdG8gaW1wcm92ZQ0KLWluIHRoZSBuZWFyIGZ1dHVyZS48L3A+DQotPHA+WFNEMkphdmEgYWNjZXB0cyB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnM6PC9wPg0KLTxvbD4NCi08bGk+VGhlIFNjaGVtYSBmaWxlIG5hbWUgLSBUaGlzIHNob3VsZCBiZSBhIGNvbXBsZXRlIGZpbGUgbmFtZQ0KLXBvaW50aW5nIHRvIHRoZSBsb2NhbCBmaWxlIHN5c3RlbTwvbGk+DQotPGxpPlRoZSBvdXRwdXQgZm9sZGVyIG5hbWUgLSBUaGlzIHNob3VsZCBiZSB0aGUgbmFtZSBvZiBhIGZvbGRlcg0KLXdpdGhpbiB0aGUgbG9jYWwgZmlsZSBzeXN0ZW08L2xpPg0KLTwvb2w+DQotPHA+U2luY2UgdGhlIGNvZGUgZ2VuZXJhdG9yIHByZXNlbnRseSBoYXMgbm8gdmFsaWRhdGlvbnMgYnVpbHQgaW50bw0KLWl0LCB0aGUgY29tcGlsZXIgaXMgbGlrZWx5IHRvIHNob3cgdmFyaW91cyBlcnJvciBtZXNzYWdlcyBpZiB0aGVzZQ0KLXBhcmFtZXRlcnMgYXJlIG5vdCBzdXBwbGllZCBwcm9wZXJseS48L3A+DQotPGEgbmFtZT0iYXBpIiBpZD0iYXBpIj48L2E+DQotPGgzPlRocm91Z2ggdGhlIEFQSTwvaDM+DQotPHA+VGhpcyBpcyB0aGUgb25seSB3YXkgdG8gaGFybmVzcyB0aGUgZnVsbCBwb3RlbnRpYWwgb2YgdGhlIHNjaGVtYQ0KLWNvbXBpbGVyLiBUaGUgY3VycmVudCBBeGlzMiBpbnRlZ3JhdGlvbiBvZiBBREIgaGFwcGVucyB0aHJvdWdoIHRoaXMNCi1BUEkuIFRoZSBtb3N0IGltcG9ydGFudCBjbGFzc2VzIGFuZCBtZXRob2RzIG9mIHRoZSBTY2hlbWEgY29tcGlsZXINCi1hcmUgYXMgZm9sbG93cy48L3A+DQotPHVsPg0KLTxsaT48c3Ryb25nPlNjaGVtYUNvbXBpbGVyIC0gQ29uc3RydWN0b3I8L3N0cm9uZz4NCi08cD5UaGUgY29uc3RydWN0b3Igb2YgdGhlIHNjaGVtYSBjb21waWxlciBleHBlY3RzIGEgQ29tcGlsZXJPcHRpb25zDQotb2JqZWN0LiBUaGlzIGNvbXBpbGVyT3B0aW9ucyBvYmplY3QgaXMgbW9yZSBvZiBhIGhvbGRlciBmb3IgdGhlDQotcGFyYW1ldGVycyB0aGF0IGFyZSBwYXNzZWQgdG8gdGhlIFNjaGVtYUNvbXBpbGVyLiBUaGUgb25seQ0KLW1hbmRhdG9yeSBwYXJhbWV0ZXIgaW4gdGhlIENvbXBpbGVyT3B0aW9ucyBpcyB0aGUgb3V0cHV0DQotZGlyZWN0b3J5LjwvcD4NCi08L2xpPg0KLTxsaT48c3Ryb25nPlNjaGVtYUNvbXBpbGVyIC0gQ29tcGlsZShYTUxTY2hlbWEgc2NoZW1hKTwvc3Ryb25nPg0KLTxwPlRoZSBjb21waWxlIG1ldGhvZCB0byBjYWxsIGZvciBhIHNpbmdsZSBzY2hlbWEuIFRoZSBleHBlY3RlZA0KLW9iamVjdCBpcyBhIFhNTFNjaGVtYSB3aGljaCBpcyBwYXJ0IG9mIHRoZSBYbWxTY2hlbWEgbGlicmFyeS48L3A+DQotPC9saT4NCi08bGk+PHN0cm9uZz5TY2hlbWFDb21waWxlciAtIENvbXBpbGUoTGlzdCBzY2hlbWFMaXN0KTwvc3Ryb25nPg0KLTxwPlNpbWlsYXIgdG8gdGhlIHByZXZpb3VzIG1ldGhvZCBidXQgYWNjZXB0cyBhIGxpc3Qgb2Ygc2NoZW1hcw0KLWluc3RlYWQgb2Ygb25lLjwvcD4NCi08L2xpPg0KLTwvdWw+DQotPHA+Rm9yIGEgY29tcHJlaGVuc2l2ZSBjb2RlIHNhbXBsZSBpbiBpbnZva2luZyB0aGUgc2NoZW1hIGNvbXBpbGVyDQotdGhyb3VnaCB0aGUgQVBJLCB0aGUgZm9sbG93aW5nIGNsYXNzZXMgd291bGQgYmUgaGVscGZ1bC4gT25lIHdvdWxkDQotYWxzbyBuZWVkIGFuIHVuZGVyc3RhbmRpbmcgb2YgdGhlIGdlbmVyYXRpb24gbW9kZXMgb2YgdGhlIEFEQg0KLXNjaGVtYSBjb21waWxlciB3aGVuIHVzaW5nIGl0IHRocm91Z2ggdGhlIEFQSS4gSGVuY2UgdGhlIGZvbGxvd2luZw0KLXNlY3Rpb24gaW5jbHVkZXMgYSBicmllZiBkZXNjcmlwdGlvbiBvZiB0aGUgZ2VuZXJhdGlvbiBtb2Rlcy48L3A+DQotPHVsPg0KLTxsaT48c3Ryb25nPm9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLlhTRDJKYXZhPC9zdHJvbmc+PC9saT4NCi08bGk+PHN0cm9uZz5vcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5FeHRlbnNpb25VdGlsaXR5PC9zdHJvbmc+PC9saT4NCi08L3VsPg0KLTxhIG5hbWU9Imdlbl9tb2RlcyIgaWQ9Imdlbl9tb2RlcyI+PC9hPg0KLTxoMj5HZW5lcmF0aW9uIE1vZGVzPC9oMj4NCi08cD5BREIgZXh0ZW5zaW9uIHByb3ZpZGVzIHNldmVyYWwgZ2VuZXJhdGlvbiBtb2RlcyBmb3IgdGhlIGRhdGENCi1ib3VuZCBjbGFzc2VzLjwvcD4NCi08b2w+DQotPGxpPjxzdHJvbmc+SW50ZWdyYXRlZCBNb2RlPC9zdHJvbmc+DQotPHA+SW4gdGhpcyBtb2RlIHRoZSBjbGFzc2VzIGFyZSBnZW5lcmF0ZWQgYXMgaW5uZXIgY2xhc3NlcyBvZiB0aGUNCi1zdHViLCBtZXNzYWdlIHJlY2VpdmVyIG9yIHRoZSBpbnRlcmZhY2UuIFRoZSBBREIgZnJhbWV3b3JrIGRvZXMgbm90DQotYWN0dWFsbHkgd3JpdGUgdGhlIGNsYXNzZXMgYnV0IGluc3RlYWQgcHJvdmlkZXMgYSBtYXAgb2YgRE9NDQotZG9jdW1lbnQgb2JqZWN0cyB0aGF0IGNvbnRhaW5zIHRoZSBtb2RlbCBmb3IgdGhlIGRhdGFiaW5kaW5nDQotY2xhc3Nlcy4gVGhlIEF4aXMyIGNvZGVnZW4gZW5naW5lIGluIHR1cm4gcGFyc2VzIHRoZXNlIGRvY3VtZW50cw0KLXdpdGhpbiBpdHMgb3duIFhTTFQgcGFyc2VyIHRvIGNyZWF0ZSB0aGUgbmVjZXNzYXJ5IGNsYXNzZXMuDQotSW1wbGVtZW50ZXJzIGFyZSBmcmVlIHRvIHVzZSB0aGVzZSBtb2RlbHMgZGlmZmVyZW50bHkgZm9yIHRoZWlyIG93bg0KLXBhcnRpY3VsYXIgbmVlZHMuPC9wPg0KLTxwPkludGVncmF0ZWQgbW9kZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGJ5IHRvb2wgYnVpbGRlcnMuPC9wPg0KLTwvbGk+DQotPGxpPjxzdHJvbmc+V3JhcHBlZCBNb2RlPC9zdHJvbmc+DQotPHA+SW4gdGhlIHdyYXBwZWQgbW9kZSwgdGhlIEFEQiBkYXRhYmluZGVyIGdlbmVyYXRlcyBvbmUgY2xhc3MgdGhhdA0KLWNvbnRhaW5zIGFsbCB0aGUgZGF0YWJvdW5kIGNsYXNzZXMuIFRoaXMgaXMgY29udmVuaWVudCB3aGVuIHRoZQ0KLW51bWJlciBvZiBjbGFzc2VzIG5lZWQgdG8gYmUgbGltaXRlZC48L3A+DQotPC9saT4NCi08bGk+PHN0cm9uZz5FeHBhbmRlZCBNb2RlPC9zdHJvbmc+DQotPHA+VGhpcyBpcyB0aGUgdXN1YWwgbW9kZSB3aGVyZSB0aGUgY29kZSBnZW5lcmF0b3IgZ2VuZXJhdGVzIGENCi1jbGFzcyBmb3IgZWFjaCBvZiB0aGUgb3V0ZXIgZWxlbWVudHMgYW5kIHRoZSBuYW1lZCBjb21wbGV4IHR5cGVzLg0KLVRoZSBjb21tYW5kIGxpbmUgdG9vbCAoWFNEMkphdmEpIGFsd2F5cyBnZW5lcmF0ZXMgY29kZSBpbiB0aGUNCi1leHBhbmRlZCBtb2RlLjwvcD4NCi08L2xpPg0KLTwvb2w+DQotPHA+VGhlIHJ1bGVzIGZvciBnZW5lcmF0aW5nIGNvZGUgKGRlc2NyaWJlZCBpbiB0aGUgbmV4dCBzZWN0aW9uKQ0KLWFwcGxpZXMgcmVnYXJkbGVzcyBvZiB0aGUgbW9kZS4gU3dpdGNoaW5nIHRoZXNlIG1vZGVzIGNhbiBiZSBkb25lDQotYnkgcGFzc2luZyB0aGUgY29ycmVjdCBvcHRpb25zIHZpYSB0aGUgQ29tcGlsZXJPcHRpb25zIG9iamVjdC4gVGhlDQotZm9sbG93aW5nIHRhYmxlIGxpc3RzIHRoZSBvcHRpb25zIGFuZCB0aGUgZWZmZWN0cyBvZiB1c2luZw0KLXRoZW0uPC9wPg0KLTx0YWJsZSBib3JkZXI9IjEiIHN1bW1hcnk9Ik9wdGlvbnMgYW5kIGRlc2NyaXB0aW9ucyI+DQotPHRib2R5Pg0KLTx0cj4NCi08dGQ+PHN0cm9uZz5GaWVsZCBOYW1lIGluIE9wdGlvbnM8L3N0cm9uZz48L3RkPg0KLTx0ZD48c3Ryb25nPkRlc2NyaXB0aW9uPC9zdHJvbmc+PC90ZD4NCi08L3RyPg0KLTx0cj4NCi08dGQ+d3JpdGVPdXRwdXQ8L3RkPg0KLTx0ZD5UaGlzIGRldGVybWluZXMgd2hldGhlciB0byB3cml0ZSB0aGUgb3V0cHV0IG9yIG5vdC4gSWYgdGhlIGZsYWcNCi1pcyBvbiB0aGVuIHRoZSBjbGFzc2VzIHdpbGwgYmUgd3JpdHRlbiBieSBBREIuIFRoZSBkZWZhdWx0IGlzDQotb2ZmLjwvdGQ+DQotPC90cj4NCi08dHI+DQotPHRkPndyYXBDbGFzc2VzPC90ZD4NCi08dGQ+VGhpcyBkZXRlcm1pbmVzIHdoZXRoZXIgdG8gd3JhcCB0aGUgZ2VuZXJhdGVkIGNsYXNzZXMuIElmIHRoZQ0KLWZsYWcgaXMgb24gdGhlbiBhIHNpbmdsZSBjbGFzcyAod2l0aCBhZGIgYWRkZWQgdG8gdGhlIGVuZCBvZiB0aGUNCi1zcGVjaWZpZWQgcGFja2FnZSkgd2lsbCBiZSBnZW5lcmF0ZWQuIFRoZSBkZWZhdWx0IGlzIG9mZi48L3RkPg0KLTwvdHI+DQotPHRyPg0KLTx0ZD5tYXBwZXJDbGFzc1BhY2thZ2U8L3RkPg0KLTx0ZD5UaGUgcGFja2FnZSBuYW1lIGZvciB0aGUgbWFwcGVyIGNsYXNzLiBQbGVhc2Ugc2VlIHRoZSBhZHZhbmNlZA0KLXNlY3Rpb24gZm9yIGRldGFpbHMgb2YgdGhlIG1hcHBlciBjbGFzcy48L3RkPg0KLTwvdHI+DQotPHRyPg0KLTx0ZD5oZWxwZXJNb2RlPC90ZD4NCi08dGQ+VGhlIHN3aXRjaCB0aGF0IGRldGVybWluZXMgd2hldGhlciB0byBzd2l0Y2ggdG8gaGVscGVyIG1vZGUgb3INCi1ub3QuIFBsZWFzZSBzZWUgdGhlIGFkdmFuY2VkIHNlY3Rpb24gZm9yIGRldGFpbHMgb2YgaGVscGVyDQotbW9kZS48L3RkPg0KLTwvdHI+DQotPHRyPg0KLTx0ZD5uczJQYWNrYWdlTWFwPC90ZD4NCi08dGQ+QSBtYXAgdGhhdCBzdG9yZXMgdGhlIG5hbWVzcGFjZSBuYW1lIGFnYWluc3QgdGhlIHBhY2thZ2UgbmFtZQ0KLVRoZXNlIGRldGFpbHMgYXJlIHVzZWQgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgcGFja2FnZXM8L3RkPg0KLTwvdHI+DQotPC90Ym9keT4NCi08L3RhYmxlPg0KLTxhIG5hbWU9ImRlZXAiIGlkPSJkZWVwIj48L2E+DQotPGgyPkRlZXAgaW50byBHZW5lcmF0ZWQgQ29kZTwvaDI+DQotPHA+V2hlbiB0aGUgc2NoZW1hIGNvbXBpbGVyIGlzIGludm9rZWQgKG9uZS13YXkgb3IgYW5vdGhlcikgaXQNCi1nZW5lcmF0ZXMgY29kZSBkZXBlbmRpbmcgb24gdGhlIGZvbGxvd2luZyBydWxlczo8L3A+DQotPG9sPg0KLTxsaT5BbGwgbmFtZWQgY29tcGxleCB0eXBlcyBiZWNvbWUgYmVhbiBjbGFzc2VzLiBBbnkgYXR0cmlidXRlIG9yDQotZWxlbWVudCBlbmNhcHN1bGF0ZWQgaW4gdGhpcyBjb21wbGV4IHR5cGUgd2lsbCBiZWNvbWUgYSBmaWVsZCBpbg0KLXRoZSBnZW5lcmF0ZWQgY2xhc3MuIE5vdGUgdGhhdCB0aGUgc3VwcG9ydCBmb3IgY29uc3RydWN0cyBvdGhlcg0KLXRoYW4geHNkOnNlcXVlbmNlIGFuZCB4c2Q6YWxsIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQuPC9saT4NCi08bGk+QWxsIHRvcCBsZXZlbCBlbGVtZW50cyBiZWNvbWUgY2xhc3Nlcy4gVGhpcyBpcyBhIHJhdGhlciBvYnZpb3VzDQotZmVhdHVyZSBzaW5jZSB1bmxlc3MgY2xhc3NlcyBhcmUgZ2VuZXJhdGVkIGZvciB0aGUgdG9wIGxldmVsDQotZWxlbWVudHMgdGhlIGhhbmRsaW5nIG9mIGVsZW1lbnRzIGJlY29tZXMgZGlmZmljdWx0IGFuZCBtZXNzeSE8L2xpPg0KLTxsaT5TaW1wbGVUeXBlIHJlc3RyaWN0aW9ucyBhcmUgaGFuZGxlZCBieSByZXBsYWNpbmcgdGhlIHJlbGV2YW50DQotdHlwZSB3aXRoIHRoZSBiYXNldHlwZTwvbGk+DQotPC9vbD4NCi08cD5PbmNlIHRoZSBjb2RlIGlzIGdlbmVyYXRlZCBhY2NvcmRpbmcgdG8gdGhlIHJ1bGVzIGl0IGxvb2tzIGxpa2UNCi10aGUgZm9sbG93aW5nLiBDb25zaWRlciB0aGUgZm9sbG93aW5nIHNjaGVtYTo8L3A+DQotPHByZT4NCi0mbHQ7c2NoZW1hIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSINCi14bWxuczp0bnM9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvdHlwZXMiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy90eXBlcyIgDQotZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiICZndDsNCi0mbHQ7aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLyZndDsNCi0gJmx0O2NvbXBsZXhUeXBlIG5hbWU9IlNPQVBTdHJ1Y3QiJmd0Ow0KLSAgJmx0O3NlcXVlbmNlJmd0Ow0KLSAgICZsdDtlbGVtZW50IG5hbWU9InZhclN0cmluZyIgdHlwZT0ieHNkOnN0cmluZyIvJmd0Ow0KLSAgICZsdDtlbGVtZW50IG5hbWU9InZhckludCIgdHlwZT0ieHNkOmludCIvJmd0Ow0KLSAgICZsdDtlbGVtZW50IG5hbWU9InZhckZsb2F0IiB0eXBlPSJ4c2Q6ZmxvYXQiLyZndDsNCi0gICZsdDsvc2VxdWVuY2UmZ3Q7DQotICZsdDsvY29tcGxleFR5cGUmZ3Q7DQotJmx0O2VsZW1lbnQgbmFtZT0ibXlFbGVtZW50IiB0eXBlPSJ0bnM6U09BUFN0cnVjdCIvJmd0Ow0KLSZsdDsvc2NoZW1hJmd0Ow0KLTwvcHJlPg0KLTxwPkZvciBjb21wcmVoZW5zaW9uIGxldCB1cyBjb25zaWRlciB0aGUgZXhwYW5kZWQgbW9kZSBmb3IgdGhlIGNvZGUNCi1nZW5lcmF0b3IuIFVubGVzcyBzcGVjaWZpY2FsbHkgbWVudGlvbmVkLCB0aGUgcmVzdCBvZiB0aGlzIGRvY3VtZW50DQotYXNzdW1lcyB0aGF0IHRoZSBleHBhbmRlZCBtb2RlIG9mIHRoZSBjb2RlIGdlbmVyYXRpb24gaXMgdXNlZC4gVGhpcw0KLXBhcnRpY3VsYXIgc2NoZW1hIHdpbGwgZ2VuZXJhdGUgdGhlIGZvbGxvd2luZyB0d28gY2xhc3NlcyBpbiB0aGUNCi1kZXNpZ25hdGVkIHBhY2thZ2UsIHdoaWNoIGluIHRoaXMgY2FzZSB3b3VsZCBiZQ0KLTxzdHJvbmc+b3JnLnNvYXBpbnRlcm9wLnR5cGVzPC9zdHJvbmc+LiBUaGUgcGFja2FnZSBuYW1lIGlzIGRlcml2ZWQNCi1mcm9tIHRoZSB0YXJnZXQgbmFtZXNwYWNlIG9mIHRoZSBzY2hlbWEuPC9wPg0KLTxvbD4NCi08bGk+TXlFbGVtZW50LmphdmE8L2xpPg0KLTxsaT5TT0FQU3RydWN0LmphdmE8L2xpPg0KLTwvb2w+DQotPHA+QXMgZXhwbGFpbmVkIGVhcmxpZXIsIFNPQVBTdHJ1Y3QgcmVmZXJzIHRvIHRoZSBjb21wbGV4VHlwZS4NCi1NeUVsZW1lbnQgaXMgdGhlIGNsYXNzIHRoYXQgcmVmZXJzIHRvIHRoZSBlbGVtZW50LiBKdXN0IGFzDQotZXhwZWN0ZWQsIHRoZSBTT0FQU3RydWN0IGJlYW4gaGFzIGdldHRlcnMgYW5kIHNldHRlcnMgZm9yDQotdmFyU3RyaW5nLCB2YXJJbnQgYW5kIHZhckZsb2F0IHdoaWNoIGFyZSBTdHJpbmcsIGludCBhbmQgZmxvYXQNCi1yZXNwZWN0aXZlbHkuIE15RWxlbWVudCBvbiB0aGUgb3RoZXIgaGFuZCBoYXMgYSBzaW5nbGUgZmllbGQNCi1yZXByZXNlbnRpbmcgdGhlIFNPQVBTdHJ1Y3Qgb2JqZWN0IHRoYXQgaXQgZW5jYXBzdWxhdGVzLjwvcD4NCi08cD5UaGUgbW9zdCBpbXBvcnRhbnQgYXNwZWN0IG9mIHRoZSBnZW5lcmF0ZWQgY29kZSBpcyB0aGF0IGl0DQotZW5jYXBzdWxhdGVzIHR3byBtZXRob2RzIGZvciBjcmVhdGluZyBhbmQgc2VyaWFsaXppbmcgdGhlIGJlYW5zLg0KLU5vdGUgdGhhdCB0byBtYWtlIHRoaXMgd29yaywgdGhlIGdlbmVyYXRlZCBiZWFucyBpbXBsZW1lbnQgdGhlDQotPHN0cm9uZz5vcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkJlYW48L3N0cm9uZz4gaW50ZXJmYWNlPC9wPg0KLTxwPlRoZSBjcmVhdG9yIGFuZCBzZXJpYWxpemVyIG1ldGhvZHMgbG9vayBsaWtlIHRoZSBmb2xsb3dpbmc6PC9wPg0KLTx1bD4NCi08bGk+DQotPHByZT4NCi1wdWJsaWMgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXINCi0gICAgZ2V0UHVsbFBhcnNlcihqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFOYW1lKQ0KLTwvcHJlPg0KLTxwPlRoaXMgbWV0aG9kIHJldHVybnMgYSBwdWxsIHBhcnNlciB0aGF0IHRocm93cyB0aGUgcmlnaHQgZXZlbnRzDQotZm9yIHRoaXMgcGFydGljdWxhciBvYmplY3QuIEhvd2V2ZXIgdGhlcmUgaXMgYSBzdWJ0bGUgZGlmZmVyZW5jZQ0KLWJldHdlZW4gZWxlbWVudCBiYXNlZCBjbGFzc2VzIGFuZCBjb21wbGV4VHlwZSBiYXNlZCBjbGFzc2VzPC9wPg0KLTxvbD4NCi08bGk+QW4gZWxlbWVudCBiYXNlZCBiZWFuIGNsYXNzIChsaWtlIE15RWxlbWVudC5qYXZhIGluIHRoZQ0KLWV4YW1wbGUpIHdpbGwgPHN0cm9uZz48ZW0+aWdub3JlIHRoZSBwYXNzZWQgaW4gUU5hbWU8L2VtPjwvc3Ryb25nPi4NCi1JbnN0ZWFkIG9mIHVzaW5nIHRoZSBwYXNzZWQgaW4gUU5hbWUgaXQnbGwgdXRpbGl6ZSBpdHMgb3duIFFOYW1lDQotd2hpY2ggaXMgZW1iZWRkZWQgaW4gdGhlIGNsYXNzIHVuZGVyIHRoZSBjb25zdGFudCBNWV9RTkFNRSwgZHVyaW5nDQotdGhlIGNvZGUgZ2VuZXJhdGlvbi4gSGVuY2UgaXQgaXMgdXN1YWwgdG8gY2FsbCBnZXRQdWxscGFyc2VyKCkgd2l0aA0KLWEgbnVsbCBwYXJhbWV0ZXIgZm9yIGVsZW1lbnRzLjwvbGk+DQotPGxpPkEgQ29tcGxleFR5cGUgYmFzZWQgYmVhbiBjbGFzcyAobGlrZSBTT0FQU3RydWN0LmphdmEgaW4gdGhlDQotZXhhbXBsZSkgd2lsbCB1c2UgdGhlIHBhc3NlZC1pbiBRTmFtZSB0byByZXR1cm4gYW4gaW5zdGFuY2Ugb2YgdGhlDQotQURCcHVsbHBhcnNlci4gVGhpcyB3aWxsIGVmZmVjdGl2ZWx5IHdyYXAgdGhlIGVsZW1lbnRzIGluc2lkZSB3aXRoDQotYW4gZWxlbWVudCBoYXZpbmcgdGhlIHBhc3NlZCBRTmFtZTwvbGk+DQotPC9vbD4NCi08L2xpPg0KLTxsaT4NCi08cHJlPg0KLSBwdWJsaWMgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgZ2V0T01FbGVtZW50KA0KLSAgICAgICAgICAgIGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsDQotICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSl7DQotPC9wcmU+DQotPHA+VGhpcyBtZXRob2QgcmV0dXJucyBhbiBPTUVsZW1lbnQgcmVwcmVzZW50aW5nIHRoZSBBREIgYmVhbg0KLW9iamVjdC48L3A+DQotPG9sPg0KLTxsaT5JbnNpZGUgdGhlIGdldE9NRWxlbWVudCBtZXRob2QgYW4gYW5vbnltb3VzIEFEQkRhdGFTb3VyY2UgY2xhc3MNCi1pcyBjcmVhdGVkLiBUaGlzIGFub255bW91cyBjbGFzcyBpbXBsZW1lbnRzIGEgc2VyaWFsaXplKCkgbWV0aG9kDQotd2hlcmUgdGhlIHNlcmlhbGl6YXRpb24gbG9naWMgZm9yIHRoYXQgcGFydGljdWxhciBiZWFuIGNsYXNzIGlzDQotaGFuZGxlZC4gRmluYWxseSBhbiBPTVNvdXJjZWRFbGVtZW50SW1wbCBvYmplY3Qgd2l0aCB0aGUgYWJvdmUNCi1hbm9ueW1vdXMgY2xhc3MgdHlwZSBvYmplY3QgYXMgdGhlIGRhdGEgc291cmNlIGlzIHJldHVybmVkLjwvbGk+DQotPC9vbD4NCi08L2xpPg0KLTxsaT4NCi08cHJlPg0KLSBwdWJsaWMgc3RhdGljIFtPYmplY3RdLkZhY3RvcnkuIA0KLSAgICAgICAgICAgICBwYXJzZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIA0KLSAgICAgICAgICAgICB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbiANCi08L3ByZT4NCi08cD5UaGlzIG1ldGhvZCByZXR1cm5zIGEgcG9wdWxhdGVkIGluc3RhbmNlIG9mIHRoZSBjbGFzcyBpbg0KLXF1ZXN0aW9uLiBOb3RlIHRoYXQ8L3A+DQotPHByZT4NCi1bT2JqZWN0XQ0KLTwvcHJlPg0KLXdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlIGFjdHVhbCBjbGFzcyB0aGF0IGNvbnRhaW5zIHRoaXMgbWV0aG9kLiBTYXkNCi1mb3IgU09BUFN0cnVjdCB0aGUgbWV0aG9kIGxvb2tzIGxpa2UNCi08cHJlPg0KLXB1YmxpYyBzdGF0aWMgU09BUFN0cnVjdC5GYWN0b3J5LiANCi0gICAgICAgICAgICAgICAgcGFyc2UoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSANCi0gICAgICAgICAgICAgICAgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24NCi08L3ByZT4NCi08cD5BbHNvIG5vdGUgdGhhdCB0aGUgYWJvdmUgcGFyc2UgbWV0aG9kIGlzIGF2YWlsYWJsZSBpbiB0aGUNCi08c3Ryb25nPkZhY3Rvcnk8L3N0cm9uZz4gbmVzdGVkIGNsYXNzIHdpdGhpbiB0aGUgcmVsZXZhbnQgdG9wIGxldmVsDQotY2xhc3MuIEhlbmNlIG9uZSB3aWxsIGhhdmUgdG8gZ2V0IHRoZSBzdGF0aWMgRmFjdG9yeSBpbnN0YW5jZQ0KLWJlZm9yZSBjYWxsaW5nIHRoZSBwYXJzZSBtZXRob2QuPC9wPg0KLTwvbGk+DQotPC91bD4NCi08YSBuYW1lPSJleGFtcGxlIiBpZD0iZXhhbXBsZSI+PC9hPg0KLTxoMz5BbiBFeGFtcGxlITwvaDM+DQotPHA+Q29uc2lkZXIgdGhlIGZvbGxvd2luZyBYTUwgZnJhZ21lbnQ8L3A+DQotPHByZT4NCi0mbHQ7bXlFbGVtZW50IHhtbG5zPSJodHRwOi8vc29hcGludGVyb3Aub3JnL3R5cGVzIiZndDsNCi0gICZsdDt2YXJJbnQmZ3Q7NSZsdDsvdmFySW50Jmd0Ow0KLSAgJmx0O3ZhclN0cmluZyZndDtIZWxsbyZsdDsvdmFyU3RyaW5nJmd0Ow0KLSAgJmx0O3ZhckZsb2F0Jmd0OzMuMyZsdDsvdmFyRmxvYXQmZ3Q7DQotJmx0Oy9teUVsZW1lbnQmZ3Q7DQotPC9wcmU+DQotPHA+RW50aHVzaWFzdGljIHJlYWRlcnMgbWlnaHQgYWxyZWFkeSBoYXZlIGZpZ3VyZWQgb3V0IHRoYXQgdGhpcw0KLVhNTCBmcmFnbWVudCBjb21wbGllcyB3aXRoIHRoZSBTY2hlbWEgbWVudGlvbmVkIGFib3ZlLiBUaGUNCi1mb2xsb3dpbmcgY29kZSBzbmlwcGV0IHNob3dzIGhvdyB0byBidWlsZCBhIHBvcHVsYXRlZCBpbnN0YW5jZSBvZg0KLU15RWxlbWVudCB3aXRoIHRoZSBYTUwgYWJvdmU6PC9wPg0KLTxwcmU+DQotWE1MU3RyZWFtUmVhZGVyIHJlYWRlciA9IFhNTElucHV0RmFjdG9yeS5uZXdJbnN0YW5jZSgpLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlWE1MU3RyZWFtUmVhZGVyKA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oeG1sU3RyaW5nLmdldEJ5dGVzKCkpKTsNCi1NeUVsZW1lbnQgZWx0ID0gTXlFbGVtZW50LkZhY3RvcnkucGFyc2UocmVhZGVyKTsNCi08L3ByZT4NCi08cD5PcHRpb25hbGx5LCB0aGUgYWJvdmUgeG1sIGZyYWdtZW50IGNhbiBiZSByZXByb2R1Y2VkIHdpdGggdGhlDQotZm9sbG93aW5nIGNvZGUgZnJhZ21lbnQ6PC9wPg0KLTxwcmU+DQotT01FbGVtZW50IG9tRWxlbWVudCA9IG15RWxlbWVudC5nZXRPTUVsZW1lbnQNCi0gICAgICAgICAgICAgICAgKE15RWxlbWVudC5NWV9RTkFNRSwgT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDEyRmFjdG9yeSgpKTsNCi1TdHJpbmcgeG1sU3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsNCi08L3ByZT4NCi08cD5BbHRob3VnaCB0aGlzIGV4YW1wbGUgdGFrZXMgb24gdGhlIHRlZGlvdXMgZWZmb3J0IG9mIGNyZWF0aW5nIGENCi1yZWFkZXIgb3V0IG9mIGEgU3RyaW5nLCBpbnNpZGUgdGhlIEF4aXMyIGVudmlyb25tZW50IGFuDQotWE1MU3RyZWFtUmVhZGVyIGNhbiBiZSBkaXJlY3RseSBvYnRhaW5lZCBmcm9tIHRoZSBPTUVsZW1lbnQhIEhlbmNlLA0KLXRoZSBwYXJzZSBtZXRob2QgYmVjb21lcyBhIGh1Z2UgYWR2YW50YWdlIGZvciBoYXNzbGUgZnJlZSBvYmplY3QNCi1jcmVhdGlvbi48L3A+DQotPHA+U2ltaWxhcmx5IHRoZSByZWFkZXIgb2J0YWluZWQgZnJvbSB0aGUgb2JqZWN0IGNhbiBhbHNvIGJlDQotdXRpbGl6ZWQgYXMgbmVlZGVkLiBUaGUgZm9sbG93aW5nIGNvZGUgZnJhZ21lbnQgc2hvd3MgaG93IHRvDQotdXRpbGl6ZSB0aGUgZ2V0UHVsbFBhcnNlciBtZXRob2QgdG8gY3JlYXRlIGFuIE9NRWxlbWVudCA6PC9wPg0KLTxwcmU+DQotWE1MU3RyZWFtUmVhZGVyIHJlYWRlciA9IGVsdC5nZXRQdWxsUGFyc2VyKG51bGwpOw0KLU9NRWxlbWVudCBvbUVsdCA9ICBuZXcgU3RBWE9NQnVpbGRlcihyZWFkZXIpLmdldERvY3VtZW50RWxlbWVudCgpOw0KLTwvcHJlPg0KLTxwPlRoYXQncyBhbGwgdG8gaXQhIElmIHlvdSBhcmUgaW50ZXJlc3RlZCBpbiBsZWFybmluZyBtb3JlIG9uIEFEQg0KLXRoZSBmb2xsb3dpbmcgZG9jdW1lbnRzIG1heSBhbHNvIGJlIGhlbHBmdWwuIEhvd2V2ZXIsIGJlIHN1cmUgdG8NCi1jaGVjayB0aGUgbGltaXRhdGlvbnMgc2VjdGlvbiB0aGF0IGZvbGxvd3MgaWYgeW91IGFyZSBwbGFubmluZyB0bw0KLXVzZSBBREIgZm9yIHNvbWV0aGluZyBzZXJpb3VzLjwvcD4NCi08YSBuYW1lPSJsaW1pdGF0aW9uIiBpZD0ibGltaXRhdGlvbiI+PC9hPg0KLTxoMj5Lbm93biBMaW1pdGF0aW9uczwvaDI+DQotPHA+QURCIGlzIG1lYW50IHRvIGJlIGEgJ1NpbXBsZScgZGF0YWJpbmRpbmcgZnJhbWV3b3JrIGFuZCB3YXMgbm90DQotbWVhbnQgdG8gY29tcGlsZSBhbGwgdHlwZXMgb2Ygc2NoZW1hcy4gVGhlIGZvbGxvd2luZyBsaW1pdGF0aW9ucw0KLWFyZSB0aGUgbW9zdCBoaWdobGlnaHRlZC48L3A+DQotPG9sPg0KLTxsaT5Db21wbGV4IFR5cGUgRXh0ZW5zaW9ucyBhbmQgUmVzdHJpY3Rpb25zLjwvbGk+DQotPC9vbD4NCi08YSBuYW1lPSJtb3JlIiBpZD0ibW9yZSI+PC9hPg0KLTxoMj5XYW50IHRvIExlYXJuIE1vcmU/PC9oMj4NCi08dWw+DQotPGxpPjxhIGhyZWY9ImFkYi1hZHZhbmNlZC5odG1sIj5BZHZhbmNlZCBmZWF0dXJlcyBvZiB0aGUgQURCIGNvZGUNCi1nZW5lcmF0b3I8L2E+IC0gZXhwbGFpbnMgeHNpOnR5cGUgYmFzZWQgZGVzZXJpYWxpemF0aW9uIGFuZCBoZWxwZXINCi1tb2RlPC9saT4NCi08bGk+PGEgaHJlZj0iYWRiLXR3ZWFraW5nLmh0bWwiPlR3ZWFraW5nIHRoZSBBREIgQ29kZSBHZW5lcmF0b3I8L2E+DQotLSBleHBsYWlucyBhdmFpbGFibGUgbWVjaGFuaXNtcyB0byBleHRlbmQgQURCIGFuZCBwb3NzaWJseSBhZG9wdCBpdA0KLXRvIGNvbXBpbGUgc2NoZW1hcyB0byBzdXBwb3J0IG90aGVyIGxhbmd1YWdlcy48L2xpPg0KLTxsaT48YSBocmVmPSJhZGItY29kZWdlbi1pbnRlZ3JhdGlvbi5odG1sIj5BREIgYW5kIEF4aXMyDQotSW50ZWdyYXRpb248L2E+IC0gZXhwbGFpbnMgaG93IHRoZSBBREIgc2NoZW1hIGNvbXBpbGVyIHdhcyBhdHRhY2hlZA0KLXRvIHRoZSBBeGlzMiBmcmFtZXdvcms8L2xpPg0KLTwvdWw+DQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvYWRiL2FkYi10d2Vha2luZy54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvYWRiL2FkYi10d2Vha2luZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiN2ZlNjdkLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9hZGIvYWRiLXR3ZWFraW5nLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIg0KLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+DQotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPg0KLTxoZWFkPg0KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0NCi0iSFRNTCBUaWR5IGZvciBXaW5kb3dzICh2ZXJzIDE0IEp1bmUgMjAwNyksIHNlZSB3d3cudzMub3JnIiAvPg0KLTx0aXRsZT5BREIgVHdlYWtpbmcgR3VpZGU8L3RpdGxlPg0KLTxsaW5rIGhyZWY9Ii4uLy4uL2Nzcy9heGlzLWRvY3MuY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9DQotInRleHQvY3NzIiBtZWRpYT0iYWxsIiAvPg0KLTwvaGVhZD4NCi08Ym9keSBsYW5nPSJlbiIgeG1sOmxhbmc9ImVuIj4NCi08aDE+QURCIFR3ZWFraW5nIEd1aWRlPC9oMT4NCi08cD5UaGlzIGRvY3VtZW50IGV4cGxhaW5zIHRoZSBtZWNoYW5pc21zIGF2YWlsYWJsZSB0byBleHRlbmQgQURCDQotYW5kIHBvc3NpYmx5IGFkb3B0IGl0IHRvIGNvbXBpbGUgc2NoZW1hcyB0byBzdXBwb3J0IG90aGVyDQotbGFuZ3VhZ2VzLjwvcD4NCi08aDI+Q29udGVudDwvaDI+DQotPHVsPg0KLTxsaT48YSBocmVmPSIjaW50cm8iPkludHJvZHVjdGlvbjwvYT48L2xpPg0KLTxsaT48YSBocmVmPSIjY29uZmlnIj5Lbm93IHRoZSBDb25maWd1cmF0aW9uPC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9IiNmaXJzdF90d2VhayI+VGhlIEZpcnN0IFR3ZWFrIC0gR2VuZXJhdGUgUGxhaW4gSmF2YQ0KLUJlYW5zPC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9IiNhZHZhbmNlZF90d2VhayI+QSBNb3JlIEFkdmFuY2VkIFR3ZWFrIC0gR2VuZXJhdGUgQ29kZQ0KLWZvciBBbm90aGVyIExhbmd1YWdlPC9hPjwvbGk+DQotPC91bD4NCi08YSBuYW1lPSJpbnRybyIgaWQ9ImludHJvIj48L2E+DQotPGgyPkludHJvZHVjdGlvbjwvaDI+DQotPHA+QURCIHdhcyB3cml0dGVuIHdpdGggZnV0dXJlIGV4dGVuc2liaWxpdHkgaW4gbWluZCwgd2l0aCBhIGNsZWFyDQotYW5kIGZsZXhpYmxlIHdheSB0byBleHRlbmQgb3IgbW9kaWZ5IGl0cyBmdW5jdGlvbmFsaXR5LiBBdmFpbGFibGUNCi1tZWNoYW5pc21zIHRvIGV4dGVuZCBBREIgYW5kIHBvc3NpYmx5IGFkb3B0IGl0IHRvIGNvbXBpbGUgc2NoZW1hcw0KLXRvIHN1cHBvcnQgb3RoZXIgbGFuZ3VhZ2VzIGFyZSBkZXNjcmliZWQgYmVsb3cuPC9wPg0KLTxhIG5hbWU9ImNvbmZpZyIgaWQ9ImNvbmZpZyI+PC9hPg0KLTxoMj5Lbm93IHRoZSBDb25maWd1cmF0aW9uPC9oMj4NCi08cD5UaGUgY29uZmlndXJhdGlvbiBmb3IgdGhlIEFEQiBmcmFtZXdvcmsgaXMgaW4gdGhlDQotPHN0cm9uZz5zY2hlbWEtY29tcGlsZS5wcm9wZXJ0aWVzPC9zdHJvbmc+IGZpbGUgZm91bmQgaW4gdGhlDQotPHN0cm9uZz5vcmcuYXBhY2hlLmF4aXMyLnNjaGVtYTwvc3Ryb25nPiBwYWNrYWdlLiBUaGlzIHByb3BlcnRpZXMNCi1maWxlIGhhcyB0aGUgZm9sbG93aW5nIGltcG9ydGFudCBwcm9wZXJ0aWVzPC9wPg0KLTx1bD4NCi08bGk+c2NoZW1hLmJlYW4ud3JpdGVyLmNsYXNzDQotPHA+VGhpcyBpcyB0aGUgd3JpdGVyIGNsYXNzLiBUaGlzIGlzIHVzZWQgYnkgdGhlIHNjaGVtYSBjb21waWxlciB0bw0KLXdyaXRlIHRoZSBiZWFucyBhbmQgc2hvdWxkIGltcGxlbWVudCB0aGUNCi08c3Ryb25nPm9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLndyaXRlci5CZWFuV3JpdGVyPC9zdHJvbmc+DQotaW50ZXJmYWNlLiBUaGUgc2NoZW1hIGNvbXBpbGVyIGRlbGVnYXRlcyB0aGUgYmVhbiB3cml0aW5nIHRhc2sgdG8NCi10aGUgc3BlY2lmaWVkIGluc3RhbmNlIG9mIHRoZSBCZWFuV3JpdGVyLjwvcD4NCi08L2xpPg0KLTxsaT5zY2hlbWEuYmVhbi53cml0ZXIudGVtcGxhdGUNCi08cD5UaGlzIHNwZWNpZmllcyB0aGUgdGVtcGxhdGUgdG8gYmUgdXNlZCBpbiB0aGUgQmVhbldyaXRlci4gVGhlDQotQmVhbldyaXRlciBhdXRob3IgaXMgZnJlZSB0byB1c2UgYW55IG1lY2hhbmlzbSB0byB3cml0ZSB0aGUgY2xhc3Nlcw0KLWJ1dCB0aGUgZGVmYXVsdCBtZWNoYW5pc20gaXMgdG8gdXNlIGEgeHNsIHRlbXBsYXRlLiBUaGlzIHByb3BlcnR5DQotbWF5IGJlIGxlZnQgYmxhbmsgaWYgdGhlIEJlYW5Xcml0ZXIgaW1wbGVtZW50YXRpb24gZG9lcyBub3QgdXNlIGENCi10ZW1wbGF0ZS48L3A+DQotPC9saT4NCi08bGk+c2NoZW1hLmJlYW4udHlwZW1hcA0KLTxwPlRoaXMgaXMgdGhlIHR5cGUgbWFwIHRvIGJlIHVzZWQgYnkgdGhlIHNjaGVtYSBjb21waWxlci4gSXQNCi1zaG91bGQgYmUgYW4gaW1wbGVtZW50YXRpb24gb2YgdGhlDQotPHN0cm9uZz5vcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS50eXBlbWFwLlR5cGVNYXA8L3N0cm9uZz4gaW50ZXJmYWNlLg0KLVRoZSBkZWZhdWx0IHR5cGVtYXAgaW1wbGVtZW50YXRpb24gZW5jYXBzdWxhdGVzIGEgaGFzaG1hcCB3aXRoIHR5cGUNCi1RTmFtZSB0byBDbGFzcyBuYW1lIHN0cmluZyBtYXBwaW5nLjwvcD4NCi08L2xpPg0KLTwvdWw+DQotPGEgbmFtZT0iZmlyc3RfdHdlYWsiIGlkPSJmaXJzdF90d2VhayI+PC9hPg0KLTxoMj5UaGUgRmlyc3QgVHdlYWsgLSBHZW5lcmF0ZSBQbGFpbiBKYXZhIEJlYW5zPC9oMj4NCi08cD5UaGUgZmlyc3QsIG1vc3Qgc2ltcGxlIHR3ZWFrIGZvciB0aGUgY29kZSBnZW5lcmF0b3IgY291bGQgYmUgdG8NCi1zd2l0Y2ggdG8gcGxhaW4gYmVhbiBnZW5lcmF0aW9uLiBUaGUgZGVmYXVsdCBiZWhhdmlvciBvZiB0aGUgQURCDQotZnJhbWV3b3JrIGlzIHRvIGdlbmVyYXRlIEFEQkJlYW5zLCBidXQgbW9zdCB1c2VycywgaWYgdGhleSB3YW50IHRvDQotdXNlIEFEQiBhcyBhIHN0YW5kYWxvbmUgY29tcGlsZXIsIHdvdWxkIHByZWZlciB0byBoYXZlIHBsYWluIGphdmENCi1iZWFucy4gVGhpcyBjYW4gaW4gZmFjdCBiZSBkb25lIGJ5IHNpbXBseSBjaGFuZ2luZyB0aGUgdGVtcGxhdGUNCi11c2VkLjwvcD4NCi08cD5UaGUgdGVtcGxhdGUgZm9yIHBsYWluIGphdmEgYmVhbnMgaXMgYWxyZWFkeSBhdmFpbGFibGUgaW4gdGhlDQotPHN0cm9uZz5vcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS50ZW1wbGF0ZTwvc3Ryb25nPiBwYWNrYWdlLiBUbyBtYWtlDQotdGhpcyB3b3JrIHJlcGxhY2UgdGhlDQotPHN0cm9uZz4vb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy9zY2hlbWEvdGVtcGxhdGUvQURCQmVhblRlbXBsYXRlLnhzbDwvc3Ryb25nPg0KLXdpdGggdGhlDQotPHN0cm9uZz4vb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy9zY2hlbWEvdGVtcGxhdGUvUGxhaW5CZWFuVGVtcGxhdGUueHNsPC9zdHJvbmc+DQotaW4gdGhlIHNjaGVtYS1jb21waWxlLnByb3BlcnRpZXM8c3Ryb25nPi48L3N0cm9uZz48L3A+DQotPHA+Q29uZ3JhdHVsYXRpb25zISBZb3UganVzdCB0d2Vha2VkIEFEQiB0byBnZW5lcmF0ZSBwbGFpbiBqYXZhDQotYmVhbnMuPC9wPg0KLTxwPlRvIGdlbmVyYXRlIGN1c3RvbSBmb3JtYXRzLCB0aGUgdGVtcGxhdGVzIG5lZWQgdG8gYmUgbW9kaWZpZWQuDQotVGhlIHNjaGVtYSBmb3IgdGhlIHhtbCBnZW5lcmF0ZWQgYnkgdGhlIEphdmFCZWFuV3JpdGVyIGlzIGF2YWlsYWJsZQ0KLWluIHRoZSBzb3VyY2UgdHJlZSB1bmRlciB0aGUgT3RoZXIgZGlyZWN0b3J5IGluIHRoZSBjb2RlZ2VuIG1vZHVsZS4NCi1BZHZhbmNlZCB1c2VycyB3aXRoIGtub3dsZWRnZSBvZiBYU0xUIGNhbiBlYXNpbHkgbW9kaWZ5IHRoZQ0KLXRlbXBsYXRlcyB0byBnZW5lcmF0ZSBjb2RlIGluIHRoZWlyIG93biBmb3JtYXRzLjwvcD4NCi08YSBuYW1lPSJhZHZhbmNlZF90d2VhayIgaWQ9ImFkdmFuY2VkX3R3ZWFrIj48L2E+DQotPGgyPkEgTW9yZSBBZHZhbmNlZCBUd2VhayAtIEdlbmVyYXRlIENvZGUgZm9yIEFub3RoZXIgTGFuZ3VhZ2U8L2gyPg0KLTxwPlRvIGdlbmVyYXRlIGNvZGUgZm9yIGFub3RoZXIgbGFuZ3VhZ2UsIHRoZXJlIGFyZSB0d28gbWFpbg0KLWNvbXBvbmVudHMgdGhhdCBuZWVkIHRvIGJlIHdyaXR0ZW4uPC9wPg0KLTx1bD4NCi08bGk+VGhlIEJlYW5Xcml0ZXINCi08cD5JbXBsZW1lbnQgdGhlIEJlYW5Xcml0ZXIgaW50ZXJmYWNlIGZvciB0aGlzIGNsYXNzLiBBIG5pY2UNCi1leGFtcGxlIGlzIHRoZQ0KLTxzdHJvbmc+b3JnLmFwYWNoZS5heGlzMi5zY2hlbWEud3JpdGVyLkphdmFCZWFuV3JpdGVyPC9zdHJvbmc+DQotd2hpY2ggaGFzIGEgbG90IG9mIHJldXNhYmxlIGNvZGUuIEluIGZhY3QgaWYgdGhlIHRhcmdldCBsYW5ndWFnZSBpcw0KLW9iamVjdC1vcmllbnRlZCAoc3VjaCBhcyBDIyBvciBldmVuIEMrKyksIG9uZSB3b3VsZCBldmVuIGJlIGFibGUgdG8NCi1leHRlbmQgdGhlIEphdmFCZWFuV3JpdGVyIGl0c2VsZi48L3A+DQotPC9saT4NCi08bGk+VGhlIFR5cGVNYXANCi08cD5JbXBsZW1lbnQgdGhlIFR5cGVNYXAgaW50ZXJmYWNlIGZvciB0aGlzIGNsYXNzLiBUaGUNCi08c3Ryb25nPm9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLnR5cGVtYXAuSmF2YVR5cGVNYXA8L3N0cm9uZz4gY2xhc3MNCi1pcyBhIHNpbXBsZSBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIHR5cGVtYXAgd2hlcmUgdGhlIFFOYW1lIHRvIGNsYXNzDQotbmFtZSBzdHJpbmdzIGFyZSBrZXB0IGluc2lkZSBhIGhhc2htYXAgaW5zdGFuY2UuIFRoaXMgdGVjaG5pcXVlIGlzDQotZmFpcmx5IHN1ZmZpY2llbnQgYW5kIG9ubHkgdGhlIHR5cGUgbmFtZXMgd291bGQgbmVlZCB0byBjaGFuZ2UgdG8NCi1zdXBwb3J0IGFub3RoZXIgbGFuZ3VhZ2UuPC9wPg0KLTwvbGk+DQotPC91bD4NCi08cD5TdXJwcmlzaW5nbHksIHRoaXMgaXMgYWxsIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSB0byBoYXZlIG90aGVyDQotbGFuZ3VhZ2Ugc3VwcG9ydCBmb3IgQURCLiBDaGFuZ2UgdGhlIGNvbmZpZ3VyYXRpb24gYW5kIHlvdSBhcmUNCi1yZWFkeSB0byBnZW5lcmF0ZSBjb2RlIGZvciBvdGhlciBsYW5ndWFnZXMhPC9wPg0KLTxwPlRoaXMgdHdlYWtpbmcgZ3VpZGUgaXMgc3VwcG9zZWQgdG8gYmUgYSBzaW1wbGUgZ3VpZGVsaW5lIGZvcg0KLWFueW9uZSB3aG8gd2lzaGVzIHRvIGRpZyBkZWVwIGludG8gdGhlIG1lY2hhbmljcyBvZiB0aGUgQURCIGNvZGUNCi1nZW5lcmF0b3IuIFVzZXJzIGFyZSBmcmVlIHRvIGV4cGVyaW1lbnQgd2l0aCBpdCBhbmQgbW9kaWZ5IHRoZQ0KLXNjaGVtYSBjb21waWxlciBhY2NvcmRpbmdseSB0byB0aGVpciBuZWVkcy4gQWxzbyBub3RlIHRoYXQgdGhlDQotaW50ZW50aW9uIG9mIHRoaXMgc2VjdGlvbiBpcyA8ZW0+bm90PC9lbT4gdG8gYmUgYSBzdGVwIGJ5IHN0ZXANCi1ndWlkZSB0byBjdXN0b20gY29kZSBnZW5lcmF0aW9uLiBBbnlvbmUgd2hvIHdpc2ggdG8gZG8gc28gd291bGQNCi1uZWVkIHRvIGRpZyBpbnRvIHRoZSBjb2RlIGFuZCBnZXQgdGhlaXIgaGFuZHMgZGlydHkhPC9wPg0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2FkYi9pbWFnZXMvQURCLmpwZyBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9hZGIvaW1hZ2VzL0FEQi5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2YzY0YjIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2FkYi9pbWFnZXMvQURCLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9hZHYtdXNlcmd1aWRlLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9hZHYtdXNlcmd1aWRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NmMzYwZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvYWR2LXVzZXJndWlkZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MzQgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMS8vRU4iCi0gICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDExL0RURC94aHRtbDExLmR0ZCI+Ci08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJjb250ZW50LXR5cGUiIGNvbnRlbnQ9IiIvPgotICA8dGl0bGU+QXhpczIgQWR2YW5jZWQgVXNlcidzIEd1aWRlPC90aXRsZT4KLSAgPGxpbmsgaHJlZj0iLi4vY3NzL2F4aXMtZG9jcy5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiCi0gIG1lZGlhPSJhbGwiLz4KLTwvaGVhZD4KLQotPGJvZHkgZGlyPSJsdHIiIGxhbmc9ImVuLVVTIj4KLTxhIG5hbWU9Il9Ub2M5NjY5Nzg0OSIgaWQ9Il9Ub2M5NjY5Nzg0OSI+PC9hPgotCi08aDEgYWxpZ249ImNlbnRlciI+QXBhY2hlIEF4aXMyIEFkdmFuY2VkIFVzZXIncyBHdWlkZTwvaDE+Ci0KLTxwPlRoaXMgZ3VpZGUgd2lsbCBoZWxwIHlvdSBnZXQgc3RhcnRlZCB3aXRoIEF4aXMyLCB0aGUgbmV4dCBnZW5lcmF0aW9uIG9mCi1BcGFjaGUgQXhpcyEgSXQgZ2l2ZXMgYSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvbiBob3cgdG8gd3JpdGUgV2ViIHNlcnZpY2VzIGFuZAotV2ViIHNlcnZpY2UgY2xpZW50cyB1c2luZyBBeGlzMiwgaG93IHRvIHdyaXRlIGN1c3RvbSBtb2R1bGVzLCBhbmQgaG93IHRvIHVzZQotdGhlbSB3aXRoIGEgV2ViIHNlcnZpY2UuIEFkdmFuY2VkIHRvcGljcyBhbmQgc2FtcGxlcyB0aGF0IGFyZSBzaGlwcGVkIHdpdGgKLXRoZSBiaW5hcnkgZGlzdHJpYnV0aW9uIG9mIEF4aXMyIGFyZSBhbHNvIGRpc2N1c3NlZC48L3A+Ci08YSBuYW1lPSJJbnRyb2R1Y3Rpb24iPjwvYT4KLQotPGgyPkludHJvZHVjdGlvbjwvaDI+Ci0KLTxwPlRoaXMgdXNlciBndWlkZSBpcyB3cml0dGVuIGJhc2VkIG9uIHRoZSA8YQotaHJlZj0iLi4vZG93bmxvYWQvQGF4aXMyX3ZlcnNpb25fZGlyQC9kb3dubG9hZC5odG1sLyNzdGQtYmluIj5BeGlzMiBTdGFuZGFyZCBCaW5hcnkKLURpc3RyaWJ1dGlvbjwvYT4uIFRoZSBTdGFuZGFyZCBCaW5hcnkgRGlzdHJpYnV0aW9uIGNhbiBiZSBkaXJlY3RseSA8YQotaHJlZj0iLi4vZG93bmxvYWQvQGF4aXMyX3ZlcnNpb25fZGlyQC9kb3dubG9hZC5odG1sLyNzdGQtYmluIj5kb3dubG9hZGVkPC9hPiBvciBidWlsdCB1c2luZwotdGhlIDxhIGhyZWY9Ii4uL2Rvd25sb2FkL0BheGlzMl92ZXJzaW9uX2RpckAvZG93bmxvYWQuaHRtbCNzcmMiPlNvdXJjZSBEaXN0cmlidXRpb248L2E+LiBJZgoteW91IGNob29zZSB0aGUgbGF0dGVyLCB0aGVuIHRoZSA8YSBocmVmPSJpbnN0YWxsYXRpb25ndWlkZS5odG1sIj5JbnN0YWxsYXRpb24KLUd1aWRlPC9hPiB3aWxsIGluc3RydWN0IHlvdSBvbiBob3cgdG8gYnVpbGQgQXhpczIgU3RhbmRhcmQgQmluYXJ5Ci1EaXN0cmlidXRpb24gdXNpbmcgdGhlIHNvdXJjZS48L3A+Ci0KLTxwPlBsZWFzZSBub3RlIHRoYXQgQXhpczIgaXMgYW4gb3Blbi1zb3VyY2UgZWZmb3J0LiBJZiB5b3UgZmVlbCB0aGUgY29kZQotY291bGQgdXNlIHNvbWUgbmV3IGZlYXR1cmVzIG9yIGZpeGVzLCBwbGVhc2UgZ2V0IGludm9sdmVkIGFuZCBsZW5kIHVzIGEgaGFuZCEKLVRoZSBBeGlzIGRldmVsb3BlciBjb21tdW5pdHkgd2VsY29tZXMgeW91ciBwYXJ0aWNpcGF0aW9uLjwvcD4KLQotPHA+TGV0IHVzIGtub3cgd2hhdCB5b3UgdGhpbmshIFNlbmQgeW91ciBmZWVkYmFjayB0byAiPGEKLWhyZWY9Im1haWx0bzpheGlzLXVzZXJAd3MuYXBhY2hlLm9yZz9zdWJqZWN0PVtBeGlzMl0iPmF4aXMtdXNlckB3cy5hcGFjaGUub3JnPC9hPiIuCi0oU3Vic2NyaXB0aW9uIGRldGFpbHMgYXJlIGF2YWlsYWJsZSBvbiB0aGUgPGEKLWhyZWY9Imh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL21haWwtbGlzdHMuaHRtbCI+QXhpczIgc2l0ZTwvYT4uKSBLaW5kbHkKLXByZWZpeCB0aGUgc3ViamVjdCBvZiB0aGUgbWFpbCB3aXRoIFtBeGlzMl0uPC9wPgotCi08aDI+R2V0dGluZyBTdGFydGVkPC9oMj4KLQotPHA+VGhlIGZpcnN0IHR3byBzZWN0aW9ucyBvZiB0aGUgdXNlciBndWlkZSBleHBsYWluIGhvdyB0byB3cml0ZSBhbmQgZGVwbG95IGEKLW5ldyBXZWIgU2VydmljZSB1c2luZyBBeGlzMiwgYW5kIGhvdyB0byB3cml0ZSBhIFdlYiBTZXJ2aWNlIGNsaWVudCB1c2luZwotQXhpczIuIFRoZSBuZXh0IHNlY3Rpb24gLSA8YSBocmVmPSIjY29uZmlnIj4gQ29uZmlndXJpbmcgQXhpczI8L2E+IC0gcHJvdmlkZXMKLWFuIGludHJvZHVjdGlvbiB0byBpbXBvcnRhbnQgY29uZmlndXJhdGlvbiBvcHRpb25zIGluIEF4aXMyLiBUaGUgZmluYWwKLXNlY3Rpb24gLSA8YSBocmVmPSIjYWR2YW5jZWQiPkFkdmFuY2VkIFRvcGljczwvYT4gLSBwcm92aWRlcyByZWZlcmVuY2VzIHRvCi1vdGhlciBmZWF0dXJlcy48L3A+Ci0KLTxwPkluIHRoaXMgKGZpcnN0KSBzZWN0aW9uLCB3ZSB3aWxsIGxlYXJuIGhvdyB0byB3cml0ZSBhbmQgZGVwbG95IFdlYgotc2VydmljZXMgdXNpbmcgQXhpczIuIEFsbCB0aGUgc2FtcGxlcyBtZW50aW9uZWQgaW4gdGhpcyBndWlkZSBhcmUgbG9jYXRlZCBpbgotdGhlIDxiPiJzYW1wbGVzL3VzZXJndWlkZS9zcmMiPC9iPiBkaXJlY3Rvcnkgb2YgPGEKLWhyZWY9Ii4uL2Rvd25sb2FkL0BheGlzMl92ZXJzaW9uX2RpckAvZG93bmxvYWQuaHRtbC8jc3RkLWJpbiI+QXhpczIgc3RhbmRhcmQgYmluYXJ5Ci1kaXN0cmlidXRpb248L2E+LjwvcD4KLQotPHA+UGxlYXNlIGRlcGxveSBheGlzMi53YXIgaW4geW91ciBzZXJ2bGV0IGNvbnRhaW5lciBhbmQgZW5zdXJlIHRoYXQgaXQgd29ya3MKLWZpbmUuIFRoZSA8YSBocmVmPSJpbnN0YWxsYXRpb25ndWlkZS5odG1sIiB0YXJnZXQ9Il9ibGFuayI+SW5zdGFsbGF0aW9uCi1HdWlkZTwvYT4gZ2l2ZXMgeW91IHN0ZXAtYnktc3RlcCBpbnN0cnVjdGlvbnMgb24ganVzdCBob3cgdG8gYnVpbGQgYXhpczIud2FyCi1hbmQgZGVwbG95IGl0IGluIHlvdXIgc2VydmxldCBjb250YWluZXIuPC9wPgotPGEgbmFtZT0id3NfY29kZWdlbiI+PC9hPjxhIG5hbWU9IldlYl9TZXJ2aWNlc19Vc2luZ19BeGlzMiI+PC9hPgotCi08aDI+Q3JlYXRpbmcgYSBOZXcgV2ViIFNlcnZpY2U8L2gyPgotCi08cD5JZiB5b3UgYXJlIGludGVyZXN0ZWQgaW4gaG93IHRvIHdyaXRlIGEgV2ViIFNlcnZpY2UgY2xpZW50IHVzaW5nIEF4aXMyLCBpdAotaXMgZGVzY3JpYmVkIHVuZGVyIDxhIGhyZWY9IiNjbGllbnQiPldyaXRpbmcgYSBXZWIgU2VydmljZSBDbGllbnQ8L2E+LiBBeGlzMgotcHJvdmlkZXMgdHdvIHdheXMgdG8gY3JlYXRlIG5ldyBXZWIgU2VydmljZXMsIHVzaW5nIDxzdHJvbmc+Y29kZQotZ2VuZXJhdGlvbjwvc3Ryb25nPiBhbmQgdXNpbmcgPHN0cm9uZz5YTUwgYmFzZWQgcHJpbWFyeSBBUElzPC9zdHJvbmc+LiBUaGUKLWZvbGxvd2luZyBzZWN0aW9uIGV4cGxhaW5zIGhvdyB0byBzdGFydCBmcm9tIGEgV1NETCwgYW5kIGNyZWF0ZSBhIG5ldyBzZXJ2aWNlCi13aXRoIGNvZGUgZ2VuZXJhdGlvbi4gRm9yIHRoZSBYTUwgYmFzZWQgcHJpbWFyeSBBUEksIHBsZWFzZSByZWZlciB0byB0aGUKLXNlY3Rpb24gPGEgaHJlZj0ieG1sYmFzZWQtc2VydmVyLmh0bWwiPldyaXRpbmcgV2ViIFNlcnZpY2VzIFVzaW5nIEF4aXMyJ3MKLVByaW1hcnkgQVBJczwvYT4gZm9yIG1vcmUgaW5mb3JtYXRpb24uIEhvd2V2ZXIsIGlmIHlvdSBhcmUgYSBuZXcgdXNlciwgaXQgaXMKLWJldHRlciB0byBmb2xsb3cgdGhlIGNvZGUgZ2VuZXJhdGlvbiBhcHByb2FjaCBmaXJzdCAoZ2l2ZW4gYmVsb3cpPC9wPgotCi08aDM+U3RhcnRpbmcgd2l0aCBXU0RMLCBDcmVhdGluZyBhbmQgRGVwbG95aW5nIGEgU2VydmljZTwvaDM+Ci0KLTxwPldlIHN0YXJ0IHdpdGggYSBXU0RMLCBob3dldmVyIGlmIHlvdSBkbyBub3QgaGF2ZSBhIFdTREwgYW5kIG5lZWQgdG8gY3JlYXRlCi1hIFdTREwgZnJvbSBhIGphdmEgY2xhc3MsIHBsZWFzZSB1c2UgdGhlIDxhCi1ocmVmPSJyZWZlcmVuY2UuaHRtbCN3c2RsMmphdmEiPkphdmEyV1NETCB0b29sPC9hPiB0byBjcmVhdGUgdGhlIFdTREwuIEFzIHlvdQotbWlnaHQgYWxyZWFkeSBrbm93LCBhIFdTREwgZGVzY3JpcHRpb24gb2YgYSBzZXJ2aWNlIHByb3ZpZGVzIGEgcHJlY2lzZQotZGVmaW5pdGlvbiBvZiB0aGF0IHdlYiBzZXJ2aWNlLiBBeGlzMiBjYW4gcHJvY2VzcyB0aGUgV1NETCBhbmQgZ2VuZXJhdGUgamF2YQotY29kZSB0aGF0IGRvZXMgbW9zdCBvZiB0aGUgd29yayBmb3IgeW91LiBBdCB0aGUgc2VydmVyIHNpZGUsIHdlIGNhbGwgdGhlbQotU2tlbGV0b25zLCBhbmQgYXQgdGhlIGNsaWVudCBzaWRlLCBTdHVicy48L3A+Ci1UaGlzIG1ldGhvZCBvZiB3cml0aW5nIGEgV2ViIHNlcnZpY2Ugd2l0aCBBeGlzMiBpbnZvbHZlcyBmb3VyIHN0ZXBzOgotPG9sPgotICA8bGk+R2VuZXJhdGUgdGhlIHNrZWxldG9uIGNvZGUuPC9saT4KLSAgPGxpPkFkZCBidXNpbmVzcyBsb2dpYy48L2xpPgotICA8bGk+Q3JlYXRlIGEgKi5hYXIgYXJjaGl2ZSAoQXhpcyBBcmNoaXZlKSBmb3IgdGhlIFdlYiBzZXJ2aWNlLjwvbGk+Ci0gIDxsaT5EZXBsb3kgdGhlIFdlYiBzZXJ2aWNlLjwvbGk+Ci08L29sPgotPGEgbmFtZT0iU3RlcDFfOkdlbmVyYXRlX3NrZWxldG9uIj48L2E+Ci0KLTxoMz5TdGVwMTogR2VuZXJhdGUgU2tlbGV0b24gQ29kZTwvaDM+Ci0KLTxwPlRvIGdlbmVyYXRlIHRoZSBza2VsZXRvbiBhbmQgcmVxdWlyZWQgY2xhc3NlcywgeW91IGNhbiB1c2UgdGhlIFdTREwySmF2YQotdG9vbCBwcm92aWRlZCBpbiBBeGlzMi4gVGhpcyB0b29sIGlzIGxvY2F0ZWQgaW4gdGhlIGJpbiBkaXJlY3Rvcnkgb2YgdGhlCi1kaXN0cmlidXRpb24gYW5kIGNhbiBiZSBleGVjdXRlZCB1c2luZyB0aGUgcHJvdmlkZWQgc2NyaXB0cyAoLmJhdCBvciAuc2gpLgotVGhlIHRvb2wncyBwYXJhbWV0ZXIgbGlzdCBjYW4gYmUgZm91bmQgaW4gdGhlIDxhCi1ocmVmPSJyZWZlcmVuY2UuaHRtbCN3c2RsMmNvZGUiPkF4aXMyIFJlZmVyZW5jZSBEb2N1bWVudDwvYT4uPC9wPgotCi08cD5UaGUgcGFyYW1ldGVycyBmb3IgdGhlIHdzZGwyamF2YSB0b29sIGluIG91ciBleGFtcGxlIGFyZSBhcyBmb2xsb3dzLgotUGxlYXNlIG5vdGUgdGhhdCwgZm9yIHRoaXMgZXhhbXBsZSwgd2UgYXJlIHVzaW5nIHhtbGJlYW5zIGFzIHRoZSBkYXRhIGJpbmRpbmcgZnJhbWV3b3JrLCBhbmQgdGhlIGdlbmVyYXRlZAotY29kZSB3aWxsIGJlIHBsYWNlZCBpbiBhICJzYW1wbGVzIiBkaXJlY3RvcnkuIDwvcD4KLTxwcmU+d3NkbDJqYXZhLnNoIC11cmkgLi4vc2FtcGxlcy93c2RsL0F4aXMyU2FtcGxlRG9jTGl0LndzZGwgLXNzIC1zZCAtZCB4bWxiZWFucyAKLS1vIC4uL3NhbXBsZXMgLXAgb3JnLmFwYWNoZS5heGlzMi51c2VyZ3VpZGU8L3ByZT4KLQotPHA+VGhpcyB3aWxsIGdlbmVyYXRlIHRoZSByZXF1aXJlZCBjbGFzc2VzIGluIHRoZSA8Yj4ic2FtcGxlL3NyYyI8L2I+Ci1kaXJlY3RvcnksIGFuZCB0aGUgc2NoZW1hIGNsYXNzZXMgaW4gdGhlCi08c3Ryb25nPiJzYW1wbGVzL3Jlc291cmNlcy9zY2hlbWFvcmdfYXBhY2hlX3htbGJlYW5zIjwvc3Ryb25nPgotZGlyZWN0b3J5PHN0cm9uZz48L3N0cm9uZz4uIE5vdGUgdGhhdCB0aGVzZSBhcmUgbm90IHNvdXJjZSBmaWxlcyBhbmQgc2hvdWxkCi1iZSBhdmFpbGFibGUgaW4gdGhlIGNsYXNzIHBhdGggaW4gb3JkZXIgdG8gY29tcGlsZSB0aGUgZ2VuZXJhdGVkIGNsYXNzZXMuPC9wPgotPGEgbmFtZT0iU3RlcDJfSW1wbGVtZW50X0J1c2luZXNzX0xvZ2ljIj48L2E+Ci0KLTxoMz5TdGVwIDI6IEltcGxlbWVudCBCdXNpbmVzcyBMb2dpYzwvaDM+Ci0KLTxwPk5vdyB5b3Ugc2hvdWxkIGZpbGwgdGhlIGJ1c2luZXNzIGxvZ2ljIGluIHRoZSBza2VsZXRvbiBjbGFzcy4gWW91IGNhbiBmaW5kCi10aGUgc2tlbGV0b24gY2xhc3MgLUF4aXMyU2FtcGxlRG9jTGl0U2VydmljZVNrZWxldG9uLmphdmEtIGFtb25nIHRoZQotZ2VuZXJhdGVkIGNsYXNzZXMgaW4gdGhlCi08c3Ryb25nPiJzYW1wbGVzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3VzZXJndWlkZTwvc3Ryb25nPiBkaXJlY3RvcnkuIExldCdzCi1maWxsIHRoZSA8Y29kZT5lY2hvU3RyaW5nKC4uKTwvY29kZT4gbWV0aG9kIGluIHRoZSBza2VsZXRvbiBhcyBzaG93biBiZWxvdy4KLU91ciBzYW1wbGUgV1NETC1BeGlzMlNhbXBsZURvY0xpdC53c2RsIGluIDxzdHJvbmc+InNhbXBsZXMvd3NkbCI8L3N0cm9uZz4KLWRpcmVjdG9yeSBoYXMgdGhyZWUgb3BlcmF0aW9uczogZWNob1N0cmluZywgZWNob1N0cmluZ0FycmF5LCBlY2hvU3RydWN0LiBUbwotc2VlIGhvdyB0aGUgb3RoZXJzIHdpbGwgbG9vayB3aGVuIHRoZXkgYXJlIGZpbGxlZCB1cCwgc2VlIDxhCi1ocmVmPSJzcmMvQXhpczJTYW1wbGVEb2NMaXRTZXJ2aWNlQ29kZS5odG1sIj5Db2RlIExpc3RpbmcgRm9yCi1BeGlzMlNhbXBsZURvY0xpdFNlcnZpY2UgU2VydmljZTwvYT48L3A+Ci08c291cmNlPjxwcmU+cHVibGljIG9yZy5hcGFjaGUuYXhpczIudXNlcmd1aWRlLnhzZC5FY2hvU3RyaW5nUmV0dXJuRG9jdW1lbnQgCi0gICAgZWNob1N0cmluZyhvcmcuYXBhY2hlLmF4aXMyLnVzZXJndWlkZS54c2QuRWNob1N0cmluZ1BhcmFtRG9jdW1lbnQgcGFyYW00KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAvL1VzZSB0aGUgZmFjdG9yeSB0byBjcmVhdGUgdGhlIG91dHB1dCBkb2N1bWVudC4KLSAgICBvcmcuYXBhY2hlLmF4aXMyLnVzZXJndWlkZS54c2QuRWNob1N0cmluZ1JldHVybkRvY3VtZW50IHJldERvYyA9IAotICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLnVzZXJndWlkZS54c2QuRWNob1N0cmluZ1JldHVybkRvY3VtZW50LkZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAvL3NlbmQgdGhlIHN0cmluZyBiYWNrLgotICAgIHJldERvYy5zZXRFY2hvU3RyaW5nUmV0dXJuKHBhcmFtNC5nZXRFY2hvU3RyaW5nUGFyYW0oKSk7Ci0gICByZXR1cm4gcmV0RG9jOzxici8+PC9wcmU+Ci08L3NvdXJjZT48YSBuYW1lPSJTdGVwNF9DcmVhdGVfYXJjaGl2ZSI+PC9hPgotCi08aDM+U3RlcCAzOiBDcmVhdGUgQXJjaGl2ZSBGaWxlPC9oMz4KLQotPHA+QW4gQXhpczIgc2VydmljZSBtdXN0IGJlIGJ1bmRsZWQgYXMgYSBzZXJ2aWNlIGFyY2hpdmUuIFRoZSBuZXh0IHN0ZXAgaXMgdG8KLXBhY2thZ2UgdGhlIGNsYXNzZXMgaW4gYW4gLmFhciAoYXhpczIgYXJjaGl2ZSkgYW5kIGRlcGxveSBpdCBpbiBBeGlzMi4gVGhlcmUKLWlzIGFuIGFudCBmaWxlIGdlbmVyYXRlZCB3aXRoIHRoZSBjb2RlOyBpdCB3aWxsIGdlbmVyYXRlIHRoZSBBeGlzMiBzZXJ2aWNlCi1hcmNoaXZlIGZvciB5b3UuIEhvd2V2ZXIsIGlmIHlvdSBkbyBub3Qgd2FudCB0byB1c2UgYW50LCB5b3UgY2FuIGNyZWF0ZSBhbgotYXJjaGl2ZSB3aXRoIHRoZSBmb2xsb3dpbmcgc3RlcHMgOjwvcD4KLTxvbD4KLSAgPGxpPkNvbXBpbGUgdGhlIGdlbmVyYXRlZCBjb2RlLjwvbGk+Ci0gIDxsaT5Db3B5IDxzdHJvbmc+InJlc291cmNlcy9zY2hlbWFvcmdfYXBhY2hlX3htbGJlYW5zPC9zdHJvbmc+IiB4bWxiZWFucwotICAgIGNsYXNzZXMgdG8geW91ciBjbGFzcyBmb2xkZXIuPC9saT4KLSAgPGxpPkFtb25nIHRoZSBnZW5lcmF0ZWQgZmlsZXMsIHRoZXJlIHdpbGwgYmUgYSBzZXJ2aWNlcy54bWwgZmlsZSwgd2hpY2ggaXMKLSAgICB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGZvciBBeGlzMiBzZXJ2aWNlLls8YQotICAgIGhyZWY9InJlZmVyZW5jZS5odG1sI3NlcnZpY2VkZCI+bGVhcm4gbW9yZSBhYm91dCBpdDwvYT5dLiBDb3B5IHRoZQotICAgIHJlc291cmNlcy9zZXJ2aWNlLnhtbCB0byBNRVRBLUlORi9zZXJ2aWNlcy54bWw8L2xpPgotCi0gIDxwPihUbyB3cml0ZSB5b3VyIG93biBzZXJ2aWNlLnhtbCBmaWxlLCBzZWUgdGhlIHN1YiBzZWN0aW9uIGluIDxhCi0gIGhyZWY9InhtbGJhc2VkLXNlcnZlci5odG1sI1N0ZXAyXzpXcml0ZV90aGVfc2VydmljZXNfeG1sX2ZpbGUiPldyaXRpbmcgV2ViCi0gIFNlcnZpY2VzIFVzaW5nIEF4aXMyJ3MgUHJpbWFyeSBBUElzPC9hPiApPC9wPgotICA8bGk+Q3JlYXRlIHRoZSBhcmNoaXZlIHVzaW5nIGNvbnRlbnQgb2YgdGhlIGNsYXNzIGZvbGRlci4gQ2hhbmdlIHRoZQotICAgIGRpcmVjdG9yeSB0byB0aGUgY2xhc3MgZm9sZGVyIGFuZCBydW4gPGNvZGU+amFyIC1jZgotICAgICZsdDtzZXJ2aWNlLW5hbWUmZ3Q7LmFhcjwvY29kZT4gdG8gY3JlYXRlIHRoZSBhcmNoaXZlLjwvbGk+Ci08L29sPgotCi08cD5PbmNlIHRoZSBhcmNoaXZlIGlzIGNyZWF0ZWQsIHRoZSBjb250ZW50IG9mIHRoZSBKQVIgc2hvdWxkIGxvb2sgbGlrZQotdGhpczo8L3A+Ci0KLTxwPjxpbWcgc3JjPSJpbWFnZXMvdXNlcmd1aWRlL0RpcmVjdG9yeVN0cnVjdHVyZS5qcGciIGFsaWduPSJib3R0b20iCi1ib3JkZXI9IjAiLz48L3A+Ci08YSBuYW1lPSJTdGVwNV9EZXBsb3lfd2ViX3NlcnZpY2UiPjwvYT4KLQotPGgzPlN0ZXAgNDogRGVwbG95IFdlYiBTZXJ2aWNlPC9oMz4KLQotPHA+VGhlIHNlcnZpY2UgY2FuIGJlIGRlcGxveWVkIGJ5IHNpbXBseSBkcm9wcGluZyB0aGUgIi5hYXIiIGZpbGUgaW50byB0aGUKLSJzZXJ2aWNlcyIgZGlyZWN0b3J5IGluICIvd2ViYXBwcy9heGlzMi9XRUItSU5GIiBvZiB5b3VyIHNlcnZsZXQgY29udGFpbmVyLgotV2UgcmVjb21tZW5kIHVzaW5nIDxhIGhyZWY9Imh0dHA6Ly90b21jYXQuYXBhY2hlLm9yZy8iPkFwYWNoZSBUb21jYXQ8L2E+IGFzCi10aGUgc2VydmxldCBjb250YWluZXIuIDxzdHJvbmc+UGxlYXNlIE5vdGUgdGhhdCB0aGUgc2VydmljZXMgZGlyZWN0b3J5IGlzCi1hdmFpbGFibGUgb25seSBhZnRlciBheGlzMi53YXIgaGFzIGJlZW4gZXhwbG9kZWQgYnkgVG9tY2F0LiBIb3dldmVyLCB0aGUgZWFzaWVzdAotd2F5IHRvIGRvIGl0IGlzIHRvIHN0YXJ0IFRvbWNhdCBhZnRlciBheGlzMi53YXIgaXMgY29waWVkIHRvIHRoZSB3ZWJhcHBzCi1kaXJlY3Rvcnk8L3N0cm9uZz4gKGlmIHlvdSBoYXZlIG5vdCBhbHJlYWR5IHN0YXJ0ZWQgaXQpLiBDaGVjayB0aGUgIlNlcnZpY2VzIgotbGluayBvbiB0aGUgPGEgaHJlZj0iaHR0cDovL2xvY2FsaG9zdDo4MDgwL2F4aXMyLyIgdGFyZ2V0PSJfYmxhbmsiPkhvbWUgcGFnZQotb2YgQXhpczIgV2ViIEFwcGxpY2F0aW9uPC9hPiAoaHR0cDovL2xvY2FsaG9zdDo4MDgwL2F4aXMyKSBhbmQgc2VlIHdoZXRoZXIKLXRoZSBBeGlzMlNhbXBsZURvY0xpdFNlcnZpY2UgaXMgZGlzcGxheWVkIHVuZGVyIHRoZSBkZXBsb3llZCBzZXJ2aWNlcy48L3A+Ci0KLTxwPldlIHJlY29tbWVuZCB1c2luZyB0aGUgZXhwbG9kZWQgY29uZmlndXJhdGlvbiB0byBkZXBsb3kgQXhpczIgV0FSIGluCi08c3Ryb25nPldlYkxvZ2ljIGFuZCBXZWJTcGhlcmU8L3N0cm9uZz4gYXBwbGljYXRpb24gc2VydmVycyB0byBzdXBwb3J0IHRoZQotaG90dXBkYXRlL2hvdGRlcGxveW1lbnQgZmVhdHVyZXMgb2YgQXhpczIuIFNlZSA8YQotaHJlZj0iYXBwX3NlcnZlci5odG1sI3dlYmxvZ2ljX3dlYnNwaGVyZSI+QXBwbGljYXRpb24gU2VydmVyIFNwZWNpZmljCi1Db25maWd1cmF0aW9uIEd1aWRlPC9hPiBmb3IgZGV0YWlscy48L3A+Ci0KLTxwPk5vdGU6IEF4aXMyIHByb3ZpZGVzIGFuIGVhc3kgd2F5IHRvIGRlcGxveSBXZWIgU2VydmljZXMgdXNpbmcgdGhlICJVcGxvYWQKLVNlcnZpY2UiIHRvb2wgaW4gdGhlIEF4aXMyIFdlYiBBcHBsaWNhdGlvbidzIEFkbWluaXN0cmF0aW9uIG1vZHVsZS4gKFNlZSB0aGUKLTxhIGhyZWY9IndlYmFkbWluZ3VpZGUuaHRtbCIgdGFyZ2V0PSJfYmxhbmsiPldlYiBBZG1pbmlzdHJhdGlvbiBHdWlkZTwvYT4gZm9yCi1tb3JlIGluZm9ybWF0aW9uKTwvcD4KLTxhIG5hbWU9ImNsaWVudCI+PC9hPgotCi08aDI+V3JpdGluZyBhIFdlYiBTZXJ2aWNlIENsaWVudDwvaDI+Ci0KLTxwPkF4aXMyIGFsc28gcHJvdmlkZXMgYSBtb3JlIGNvbXBsZXgsIHlldCBwb3dlcmZ1bCBYTUwgYmFzZWQgY2xpZW50IEFQSQotd2hpY2ggaXMgaW50ZW5kZWQgZm9yIGFkdmFuY2VkIHVzZXJzLiBSZWFkIDxhIGhyZWY9ImRpaS5odG1sIj5Xcml0aW5nIFdlYgotU2VydmljZSBDbGllbnRzIFVzaW5nIEF4aXMyJ3MgUHJpbWFyeSBBUElzPC9hPiB0byBsZWFybiBtb3JlIGFib3V0IGl0LgotSG93ZXZlciwgaWYgeW91IGFyZSBhIG5ldyB1c2VyLCB3ZSByZWNvbW1lbmQgdXNpbmcgdGhlIDxzdHJvbmc+Y29kZQotZ2VuZXJhdGlvbjwvc3Ryb25nPiBhcHByb2FjaCBwcmVzZW50ZWQgYmVsb3cuPC9wPgotCi08aDM+R2VuZXJhdGUgU3R1YnM8L2gzPgotCi08cD5MZXQncyBzZWUgaG93IHdlIGNvdWxkIGdlbmVyYXRlIGphdmEgY29kZSAoU3R1YikgdG8gaGFuZGxlIHRoZSBjbGllbnQgc2lkZQotV2ViIFNlcnZpY2UgaW52b2NhdGlvbiBmb3IgeW91LiBUaGlzIGNhbiBiZSBkb25lIGJ5IHJ1bm5pbmcgdGhlIFdTREwySmF2YQotdG9vbCB1c2luZyB0aGUgZm9sbG93aW5nIGFyZ3VtZW50czwvcD4KLTxzb3VyY2U+PHByZT53c2RsMmphdmEuc2ggLXVyaSAuLi9zYW1wbGVzL3dzZGwvQXhpczJTYW1wbGVEb2NMaXQud3NkbCAtZCB4bWxiZWFucyAKLSAgICAgLW8gLi4vc2FtcGxlcy9zcmMgLXAgb3JnLmFwYWNoZS5heGlzMi51c2VyZ3VpZGU8L3ByZT4KLTwvc291cmNlPgotPHA+VGhpcyB3aWxsIGdlbmVyYXRlIGNsaWVudCBzaWRlIHN0dWJzIGFuZCB4bWxiZWFucyB0eXBlcyBmb3IgeW91ciB0eXBlcy4KLVRoZSBTdHViIGNsYXNzIHRoYXQgeW91IG5lZWQgdG8gdXNlIHdpbGwgYmUgb2YgdGhlIGZvcm0KLTxzdHJvbmc+Jmx0O3NlcnZpY2UtbmFtZSZndDtTdHViPC9zdHJvbmc+LiBJbiBvdXIgZXhhbXBsZSwgaXQgd2lsbCBiZSBjYWxsZWQKLSJBeGlzMlNhbXBsZURvY0xpdFNlcnZpY2VTdHViLmphdmEiPC9wPgotCi08cD5BeGlzMiBjbGllbnRzIGNhbiBpbnZva2UgV2ViIFNlcnZpY2VzIGJvdGggaW4gYSBibG9ja2luZyBhbmQgbm9uLWJsb2NraW5nCi1tYW5uZXIuIEluIGEgYmxvY2tpbmcgaW52b2NhdGlvbiwgdGhlIGNsaWVudCB3YWl0cyB0aWxsIHRoZSBzZXJ2aWNlIHBlcmZvcm1zCi1pdHMgdGFzayB3aXRob3V0IHByb2NlZWRpbmcgdG8gdGhlIG5leHQgc3RlcC4gTm9ybWFsbHksIHRoZSBjbGllbnQgd2FpdHMgdGlsbAotdGhlIHJlc3BvbnNlIHRvIGl0cyBwYXJ0aWN1bGFyIHJlcXVlc3QgYXJyaXZlcy4gSW4gYSBub24tYmxvY2tpbmcgaW52b2NhdGlvbiwKLXRoZSBjbGllbnQgcHJvY2VlZHMgdG8gdGhlIG5leHQgc3RlcCBpbW1lZGlhdGVseSwgYW5kIHRoZSByZXNwb25zZXMgKGlmIGFueSkKLWFyZSBoYW5kbGVkIHVzaW5nIGEgQ2FsbGJhY2sgbWVjaGFuaXNtLiBQbGVhc2Ugbm90ZSB0aGF0IHNvbWUgZXhwbGFuYXRpb25zCi11c2UgdGhlIHRlcm1zIFN5bmNocm9ub3VzIGFuZCBBc3luY2hyb25vdXMgdG8gZGVzY3JpYmUgdGhlIHNpbWlsYXIgaW52b2NhdGlvbgotc3RyYXRlZ2llcy48L3A+Ci0KLTxoMz5EbyBhIEJsb2NraW5nIEludm9jYXRpb248L2gzPgotCi08cD5UaGUgZm9sbG93aW5nIGNvZGUgZnJhZ21lbnQgc2hvd3MgdGhlIG5lY2Vzc2FyeSBjb2RlIGNhbGxpbmcKLTxjb2RlPmVjaG9TdHJpbmc8L2NvZGU+IG9wZXJhdGlvbiBvZiB0aGUKLTxjb2RlPkF4aXMyU2FtcGxlRG9jTGl0U2VydmljZTwvY29kZT4gdGhhdCB3ZSBoYXZlIGFscmVhZHkgZGVwbG95ZWQuIFRoZSBjb2RlCi1pcyBleHRyZW1lbHkgc2ltcGxlIHRvIHVuZGVyc3RhbmQgYW5kIHRoZSBleHBsYW5hdGlvbnMgYXJlIGluIHRoZSBmb3JtIG9mCi1jb21tZW50cy48L3A+Ci08c291cmNlPjxwcmU+ICAgICB0cnkgewotICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi51c2VyZ3VpZGUuQXhpczJTYW1wbGVEb2NMaXRTZXJ2aWNlU3R1YiBzdHViIAotICAgICAgICAgICAgICAgICAgPSBuZXcgb3JnLmFwYWNoZS5heGlzMi51c2VyZ3VpZGUuQXhpczJTYW1wbGVEb2NMaXRTZXJ2aWNlU3R1YihudWxsLAotICAgICAgICAgICAgICAgICAgICAiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2F4aXMyL3NlcnZpY2VzL0F4aXMyU2FtcGxlRG9jTGl0U2VydmljZSIpOwotICAgICAgICAgICAgICAgIC8vQ3JlYXRlIHRoZSByZXF1ZXN0IGRvY3VtZW50IHRvIGJlIHNlbnQuCi0gICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi51c2VyZ3VpZGUueHNkLkVjaG9TdHJpbmdQYXJhbURvY3VtZW50IHJlcURvYyA9Ci0gICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi51c2VyZ3VpZGUueHNkLkVjaG9TdHJpbmdQYXJhbURvY3VtZW50LkZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgICAgICByZXFEb2Muc2V0RWNob1N0cmluZ1BhcmFtKCJBeGlzMiBFY2hvIik7Ci0gICAgICAgICAgICAgICAgLy9pbnZva2VzIHRoZSBXZWIgc2VydmljZS4KLSAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLnVzZXJndWlkZS54c2QuRWNob1N0cmluZ1JldHVybkRvY3VtZW50IHJlc0RvYyA9IAotICAgICAgICAgICAgICAgIHN0dWIuZWNob1N0cmluZyhyZXFEb2MpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihyZXNEb2MuZ2V0RWNob1N0cmluZ1JldHVybigpKTsKLSAgICAgICAgICAgICAgIH0gY2F0Y2ggKGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgICB9PC9wcmU+Ci08L3NvdXJjZT4KLTxwPkZpcnN0IGFyZ3VtZW50IG9mIDxjb2RlPkF4aXMyU2FtcGxlRG9jTGl0UG9ydFR5cGVTdHViPC9jb2RlPiBzaG91bGQgYmUgdGhlCi1BeGlzMiByZXBvc2l0b3J5IGZvciB0aGUgY2xpZW50LiBIZXJlIHdlIHVzZSBudWxsIHRvIG1ha2UgdGhlIHN0dWIgdXNlCi1kZWZhdWx0IGNvbmZpZ3VyYXRpb25zLiBIb3dldmVyLCB5b3UgY2FuIG1ha2UgQXhpczIgdXNlIHlvdXIgb3duIHJlcG9zaXRvcnkKLWJ5IHByb3ZpZGluZyBpdCBoZXJlLiBZb3UgY2FuIGZpbmQgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGZyb20gdGhlIDxhCi1ocmVmPSIjY29uZmlnIj5BeGlzMiBDb25maWd1cmF0aW9uIHNlY3Rpb248L2E+LiBZb3UgY2FuIGZpbmQgY29kZSB0byBpbnZva2UKLW90aGVyIG9wZXJhdGlvbnMgZnJvbSA8YSBocmVmPSJzcmMvQXhpczJTYW1wbGVEb2NMaXRTZXJ2aWNlQ29kZS5odG1sIj5Db2RlCi1MaXN0aW5nIEZvciBBeGlzMlNhbXBsZURvY0xpdFNlcnZpY2UgU2VydmljZTwvYT48L3A+Ci0KLTxoMz5EbyBhIE5vbi1CbG9ja2luZyBJbnZvY2F0aW9uPC9oMz4KLQotPHA+VGhlIHN0dWJzIGFsc28gaW5jbHVkZSBhIG1ldGhvZCB0aGF0IGFsbG93cyB5b3UgdG8gZG8gYSBub24tYmxvY2tpbmcKLWlubm92YXRpb24uIEZvciBlYWNoIG1ldGhvZCBpbiB0aGUgU2VydmljZSwgdGhlcmUgd2lsbCBiZSBhIG1ldGhvZAotPHN0cm9uZz5zdGFydCZsdDttZXRob2QtbmFtZSZndDs8L3N0cm9uZz4uIFRoZXNlIG1ldGhvZHMgYWNjZXB0IGEgY2FsbGJhY2sKLW9iamVjdCwgd2hpY2ggd291bGQgYmUgY2FsbGVkIHdoZW4gdGhlIHJlc3BvbnNlIGlzIHJlY2VpdmVkLiBTYW1wbGUgY29kZSB0aGF0Ci1kb2VzIGFuIGFzeW5jaHJvbm91cyBpbnRlcmFjdGlvbiBpcyBnaXZlbiBiZWxvdy48L3A+Ci08c291cmNlPjxwcmU+dHJ5IHsKLSAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIudXNlcmd1aWRlLkF4aXMyU2FtcGxlRG9jTGl0U2VydmljZVN0dWIgc3R1YgotICAgICAgICAgICA9IG5ldyBvcmcuYXBhY2hlLmF4aXMyLnVzZXJndWlkZS5BeGlzMlNhbXBsZURvY0xpdFNlcnZpY2VTdHViKG51bGwsCi0gICAgICAgICAgICAgImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9heGlzMi9zZXJ2aWNlcy9BeGlzMlNhbXBsZURvY0xpdFNlcnZpY2UiKTsKLSAgICAgICAgICAgICAvL2ltcGxlbWVudGluZyB0aGUgY2FsbGJhY2sgb25saW5lCi0gICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLnVzZXJndWlkZS5BeGlzMlNhbXBsZURvY0xpdFNlcnZpY2VDYWxsYmFja0hhbmRsZXIgY2FsbGJhY2sgPQotICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUuYXhpczIudXNlcmd1aWRlLkF4aXMyU2FtcGxlRG9jTGl0U2VydmljZUNhbGxiYWNrSGFuZGxlcigpIHsKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcmVjZWl2ZVJlc3VsdGVjaG9TdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi51c2VyZ3VpZGUueHNkLkVjaG9TdHJpbmdSZXR1cm5Eb2N1bWVudCByZXNEb2MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHJlc0RvYy5nZXRFY2hvU3RyaW5nUmV0dXJuKCkpOwotICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLnVzZXJndWlkZS54c2QuRWNob1N0cmluZ1BhcmFtRG9jdW1lbnQgcmVxRG9jID0gCi0gICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi51c2VyZ3VpZGUueHNkLkVjaG9TdHJpbmdQYXJhbURvY3VtZW50LkZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgcmVxRG9jLnNldEVjaG9TdHJpbmdQYXJhbSgiQXhpczIgRWNobyIpOwotICAgICAgICAgICBzdHViLnN0YXJ0ZWNob1N0cmluZyhyZXFEb2MsIGNhbGxiYWNrKTsKLSAgICAgICAgfSBjYXRjaCAoamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgIH08L3ByZT4KLTwvc291cmNlPgotPHA+RXZlbiB0aG91Z2ggdGhlIGFib3ZlIGNvZGUgZG9lcyBhIG5vbi1ibG9ja2luZyBpbnZvY2F0aW9uIGF0IHRoZSBjbGllbnQKLUFQSSwgdGhlIHRyYW5zcG9ydCBjb25uZWN0aW9uIG1heSBzdGlsbCBvcGVyYXRlIGluIGEgYmxvY2tpbmcgZmFzaGlvbi4gRm9yCi1leGFtcGxlLCBhIHNpbmdsZSBIVFRQIGNvbm5lY3Rpb24gY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGEgV2ViIFNlcnZpY2UgcmVxdWVzdAotYW5kIHRvIGdldCB0aGUgcmVzcG9uc2Ugd2hlbiBhIGJsb2NraW5nIGludm9jYXRpb24gaGFwcGVucyBhdCB0aGUgdHJhbnNwb3J0Ci1sZXZlbC4gVG8gcGVyZm9ybSBhICJ0cnVlIiBub24tYmxvY2tpbmcgaW52b2NhdGlvbiBpbiB3aGljaCB0d28gc2VwYXJhdGUKLXRyYW5zcG9ydCBjb25uZWN0aW9ucyBhcmUgdXNlZCBmb3IgdGhlIHJlcXVlc3QgYW5kIHRoZSByZXNwb25zZSwgcGxlYXNlIGFkZAotdGhlIGZvbGxvd2luZyBjb2RlIHNlZ21lbnQgYWZ0ZXIgY3JlYXRpbmcgdGhlIHN0dWIuIEl0IHdpbGwgZm9yY2UgQXhpczIgdG8KLXVzZSB0d28gdHJhbnNwb3J0IGNvbm5lY3Rpb25zIGZvciB0aGUgcmVxdWVzdCBhbmQgdGhlIHJlc3BvbnNlIHdoaWxlIHRoZQotY2xpZW50IHVzZXMgYSBDYWxsYmFjayB0byBwcm9jZXNzIHRoZSByZXNwb25zZS48L3A+Ci08c291cmNlPjxwcmU+c3R1Yi5fZ2V0U2VydmljZUNsaWVudCgpLmVuZ2FnZU1vZHVsZShuZXcgUU5hbWUoImFkZHJlc3NpbmciKSk7Ci1zdHViLl9nZXRTZXJ2aWNlQ2xpZW50KCkuZ2V0T3B0aW9ucygpLnNldFVzZVNlcGFyYXRlTGlzdGVuZXIodHJ1ZSk7PC9wcmU+Ci08L3NvdXJjZT4KLTxwPk9uY2UgdGhvc2Ugb3B0aW9ucyBhcmUgc2V0LCBBeGlzMiBjbGllbnQgZG9lcyB0aGUgZm9sbG93aW5nOjwvcD4KLTxvbD4KLSAgPGxpPlN0YXJ0cyBhIG5ldyBUcmFuc3BvcnQgTGlzdGVuZXIoU2VydmVyKSBhdCB0aGUgY2xpZW50IHNpZGUuPC9saT4KLSAgPGxpPlNldHMgdGhlIGFkZHJlc3Mgb2YgdGhlIFRyYW5zcG9ydCBMaXN0ZW5lciwgYXMgdGhlIFJlcGx5VG8KLSAgICBXUy1BZGRyZXNzaW5nIEhlYWRlciBvZiB0aGUgcmVxdWVzdCBtZXNzYWdlPC9saT4KLSAgPGxpPkFjY29yZGluZyB0byB0aGUgV1MtQWRkcmVzc2luZyBydWxlcywgdGhlIFNlcnZlciB3aWxsIHByb2Nlc3MgdGhlCi0gICAgcmVxdWVzdCBtZXNzYWdlIGFuZCBzZW5kIHRoZSByZXNwb25zZSBiYWNrIHRvIHRoZSBSZXBseVRvIGFkZHJlc3MuPC9saT4KLSAgPGxpPkNsaWVudCBhY2NlcHRzIHRoZSByZXNwb25zZSwgcHJvY2Vzc2VzIGl0IGFuZCBpbnZva2VzIHRoZSBjYWxsYmFjayB3aXRoCi0gICAgdGhlIHJlc3BvbnNlIHBhcmFtZXRlcnMuPC9saT4KLTwvb2w+Ci0KLTxoMz5Vc2luZyBZb3VyIE93biBSZXBvc2l0b3J5PC9oMz4KLQotPHA+WW91IGNhbiBhbHNvIHVzZSB5b3VyIG93biByZXBvc2l0b3J5IHdpdGggYW4gQXhpczIgQ2xpZW50LiAgVGhlIGNvZGUgYmVsb3cgc2hvd3MgaG93Ci10byBkbyB0aGlzLjwvcD4KLTxzb3VyY2U+PHByZT5TdHJpbmcgYXhpczJSZXBvID0gLi4uCi1TdHJpbmcgYXhpczJ4bWwgPSAuLi4KLUNvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQgPQotQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5LmNyZWF0ZUNvbmZpZ3VyYXRpb25Db250ZXh0RnJvbUZpbGVTeXN0ZW0oYXhpczJSZXBvLCBheGlzMnhtbCk7Ci1TZXJ2aWNlMVN0dWIgc3R1YjEgPSBuZXcgU2VydmljZTFTdHViKGNvbmZpZ0NvbnRleHQsLi4uKTsKLS8vaW52b2tlIFNlcnZpY2UxCi1TZXJ2aWNlMlN0dWIgc3R1YjIgPSBuZXcgU2VydmljZTJTdHViKGNvbmZpZ0NvbnRleHQsLi4uKTsKLS8vaW52b2tlIFNlcnZpY2UyPC9wcmU+Ci08L3NvdXJjZT4KLTxwPk5vdGUgYnkgY3JlYXRpbmcgdGhlIDxjb2RlPkNvbmZpZ3VyYXRpb25Db250ZXh0PC9jb2RlPiBvdXRzaWRlIGFuZCBwYXNzaW5nCi1pdCB0byB0aGUgc3R1YnMsIHlvdSBjb3VsZCBtYWtlIG51bWJlciBvZiBzdHVicyB0byB1c2Ugc2FtZSByZXBvc2l0b3J5LCB0aHVzCi1zYXZpbmcgdGhlIGNvbmZpZ3VyYXRpb24gbG9hZGluZyBvdmVyaGVhZCBmcm9tIGVhY2ggcmVxdWVzdC48L3A+Ci08YSBuYW1lPSJjb25maWciPjwvYT4KLQotPGgyPkNvbmZpZ3VyaW5nIEF4aXMyPC9oMj4KLQotPGgzPkF4aXMyIFJlcG9zaXRvcnk8L2gzPgotCi08cD5BeGlzMiBjb25maWd1cmF0aW9uIGlzIGJhc2VkIG9uIGEgcmVwb3NpdG9yeSBhbmQgc3RhbmRhcmQgYXJjaGl2ZSBmb3JtYXQuCi1BIHJlcG9zaXRvcnkgaXMgYSBkaXJlY3RvcnkgaW4gdGhlIGZpbGUgc3lzdGVtLCBhbmQgaXQgc2hvdWxkIGhhdmUgdGhlCi1mb2xsb3dpbmc6PC9wPgotPG9sPgotICA8bGk+PHN0cm9uZz5heGlzMi54bWw8L3N0cm9uZz4sIHRoZSBBeGlzMiBnbG9iYWwgZGVwbG95bWVudCBkZXNjcmlwdG9yIGluCi0gICAgY29uZi9heGlzMi54bWwgZmlsZTwvbGk+Ci0gIDxsaT48c3Ryb25nPnNlcnZpY2VzPC9zdHJvbmc+IGRpcmVjdG9yeSwgd2hpY2ggd2lsbCBoYXZlIHRoZSBzZXJ2aWNlCi0gICAgYXJjaGl2ZXM8L2xpPgotICA8bGk+PHN0cm9uZz5tb2R1bGVzPC9zdHJvbmc+IGRpcmVjdG9yeSAob3B0aW9uYWwpLCB3aGljaCB3aWxsIGhhdmUgdGhlCi0gICAgbW9kdWxlIGFyY2hpdmVzPC9saT4KLTwvb2w+Ci0KLTxwPkJvdGggc2VydmljZXMgYW5kIG1vZHVsZXMgd2lsbCBiZSBpZGVudGlmaWVkIGFuZCBkZXBsb3llZCBvbmNlIHRoZWlyCi1hcmNoaXZlcyBhcmUgY29waWVkIHRvIHRoZSBjb3JyZXNwb25kaW5nIGRpcmVjdG9yaWVzLiBBdCB0aGUgc2VydmVyIHNpZGUsCi11c2VycyBzaG91bGQgc3BlY2lmeSB0aGUgcmVwb3NpdG9yeSBmb2xkZXIgYXQgdGhlIHRpbWUgb2Ygc3RhcnRpbmcgdGhlIEF4aXMyCi1TZXJ2ZXIgKGUuZy4gSFRUUCBvciBUQ1ApLiBJbiBUb21jYXQsIDxjb2RlPndlYmFwcHMvYXhpczIvV0VCLUlORjwvY29kZT4KLWZvbGRlciBhY3RzIGFzIHRoZSByZXBvc2l0b3J5LiBBdCB0aGUgY2xpZW50IHNpZGUsIGJpbmFyeSBkaXN0cmlidXRpb24gY2FuCi1pdHNlbGYgYmUgYSByZXBvc2l0b3J5LiBZb3UgY2FuIGNvcHkgdGhlIGNvbmYgZGlyZWN0b3J5IHdoaWNoIGluY2x1ZGVzIHRoZQotYXhpczIueG1sIGZpbGUgZnJvbSB0aGUgZXhwbG9kZWQgYXhpczIud2FyIGFuZCBlZGl0IGl0IHRvIGNoYW5nZSB0aGUgZ2xvYmFsCi1jb25maWd1cmF0aW9ucyByZXBvc2l0b3J5LjwvcD4KLQotPGgzPkdsb2JhbCBDb25maWd1cmF0aW9uczwvaDM+Ci0KLTxwPlRoZSBHbG9iYWwgY29uZmlndXJhdGlvbiBjYW4gYmUgY2hhbmdlZCBieSBlZGl0aW5nIHRoZSBheGlzMi54bWwgZmlsZSwKLXJlZmVyIHRvIHRoZSA8YSBocmVmPSJheGlzMmNvbmZpZy5odG1sI0dsb2JhbF9Db25maWd1cmF0aW9uIj5BeGlzMgotQ29uZmlndXJhdGlvbiBHdWlkZTwvYT4gZm9yIG1vcmUgaW5mb3JtYXRpb24uPC9wPgotCi08aDM+QWRkIE5ldyBTZXJ2aWNlczwvaDM+Ci0KLTxwPk5ldyBzZXJ2aWNlcyBjYW4gYmUgd3JpdHRlbiBlaXRoZXIgdXNpbmcgV1NETCBiYXNlZCBjb2RlIGdlbmVyYXRpb24gYXMgd2UKLWRpZCwgb3IgZnJvbSBzY3JhdGNoIGFzIGV4cGxhaW5lZCBpbiA8YSBocmVmPSJ4bWxiYXNlZC1zZXJ2ZXIuaHRtbCI+V3JpdGluZwotV2ViIFNlcnZpY2VzIFVzaW5nIEF4aXMyJ3MgUHJpbWFyeSBBUElzPC9hPi4gIFJlYWQgPGEKLWhyZWY9InhtbGJhc2VkLXNlcnZlci5odG1sIj5DcmVhdGluZyBhIFNlcnZpY2UgZnJvbSBTY3JhdGNoPC9hPiBmb3IgbW9yZQotaW5mb3JtYXRpb24uIEFsc28gcmVmZXIgdG8gPGEKLWhyZWY9ImF4aXMyY29uZmlnLmh0bWwjU2VydmljZV9Db25maWd1cmF0aW9uIj5BeGlzMiBDb25maWd1cmF0aW9uIEd1aWRlPC9hPgotZm9yIGEgcmVmZXJlbmNlIG9uIDxzdHJvbmc+c2VydmljZXMueG1sPC9zdHJvbmc+IGZpbGUuPC9wPgotCi08aDMgbmFtZT0ibW9kdWxlX2VuZ2FnZSI+RW5nYWdpbmcgTW9kdWxlczwvaDM+Ci0KLTxwPkVhY2ggbW9kdWxlKC5tYXIgZmlsZSkgcHJvdmlkZXMgZXh0ZW5zaW9ucyB0byBBeGlzMi4gQSBtb2R1bGUgY2FuIGJlCi1kZXBsb3llZCBieSBjb3B5aW5nIGl0IHRvIHRoZSBtb2R1bGVzIGRpcmVjdG9yeSBpbiB0aGUgcmVwb3NpdG9yeS4gVGhlbiBpdAotYmVjb21lcyBhdmFpbGFibGUgYW5kIGNhbiBiZSBlbmdhZ2VkIGF0IGEgZ2xvYmFsLCBzZXJ2aWNlIG9yIG9wZXJhdGlvbiBzY29wZS4KLU9uY2UgZW5nYWdlZCwgaXQgYmVjb21lcyBhY3RpdmUgKGFkZHMgaGFuZGxlcnMgdG8gdGhlIGV4ZWN1dGlvbiBmbG93KSBhdCB0aGUKLXJlc3BlY3RpdmUgc2NvcGUuIFBsZWFzZSByZWZlciB0byA8YSBocmVmPSJBeGlzMkFyY2hpdGVjdHVyZUd1aWRlLmh0bWwiPkF4aXMyCi1hcmNoaXRlY3R1cmUgZ3VpZGU8L2E+IGZvciBkZXRhaWxlZCBleHBsYW5hdGlvbi4gVGhlIGZvbGxvd2luZyB0YWJsZSBleHBsYWlucwotdGhlIHNlbWFudGljcyBvZiBzY29wZSwgYW5kIGhvdyB0byBlbmdhZ2UgbW9kdWxlcyBpbiB0aG9zZSBzY29wZXMuPC9wPgotCi08dGFibGUgYm9yZGVyPSIxIj4KLSAgPHRib2R5PgotICAgIDx0cj4KLSAgICAgIDx0aD5TY29wZTwvdGg+Ci0gICAgICA8dGg+U2VtYW50aWNzPC90aD4KLSAgICAgIDx0aD5Ib3cgdG8gRW5nYWdlPC90aD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgIDx0ZD5HbG9iYWw8L3RkPgotICAgICAgPHRkPkFkZCBoYW5kbGVycyBpbiB0aGUgbW9kdWxlIHRvIGFsbCB0aGUgc2VydmljZXMuIEFkZHJlc3NpbmcgSGFuZGxlcgotICAgICAgICBjYW4gYmUgb25seSBlbmdhZ2VkIGFzIGdsb2JhbDwvdGQ+Ci0gICAgICA8dGQ+QnkgYWRkaW5nIGEgJmx0O21vZHVsZSByZWY9ImFkZHJlc3NpbmciLyZndDsgdG8gdGhlIEF4aXMyIHhtbCBmaWxlCi0gICAgICAgIG9yIGNhbGxpbmcKLSAgICAgICAgPHByZT5zdHViLl9nZXRTZXJ2aWNlQ2xpZW50KCkuZW5nYWdlTW9kdWxlKG1vZHVsZU5hbWUpPC9wcmU+Ci0gICAgICAgIGF0IGNsaWVudCBzaWRlPC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgIDx0ZD5TZXJ2aWNlPC90ZD4KLSAgICAgIDx0ZD5BZGQgaGFuZGxlcnMgaW4gdGhlIG1vZHVsZSB0byBhIHNwZWNpZmljIHNlcnZpY2U8L3RkPgotICAgICAgPHRkPkJ5IGFkZGluZyBhICZsdDttb2R1bGUgcmVmPSJhZGRyZXNzaW5nIi8mZ3Q7IHRvIGEgc2VydmljZS54bWwgZmlsZQotICAgICAgICBpbiBhIHNlcnZpY2UgYXJjaGl2ZTwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgICA8dGQ+T3BlcmF0aW9uPC90ZD4KLSAgICAgIDx0ZD5BZGQgaGFuZGxlcnMgaW4gdGhlIG1vZHVsZSB0byBhIHNwZWNpZmljIG9wZXJhdGlvbjwvdGQ+Ci0gICAgICA8dGQ+QnkgYWRkaW5nIGEgJmx0O21vZHVsZSByZWY9ImFkZHJlc3NpbmciLyZndDsgaW5zaWRlIGFuIG9wZXJhdGlvbgotICAgICAgICB0YWcgb2YgYSBzZXJ2aWNlLnhtbCBmaWxlIGluIGEgc2VydmljZSBhcmNoaXZlPC90ZD4KLSAgICA8L3RyPgotICA8L3Rib2R5PgotPC90YWJsZT4KLQotPHA+KiBJZiBhIGhhbmRsZXIgaXMgYWRkZWQgdG8gYSBzZXJ2aWNlIG9yIGFuIG9wZXJhdGlvbiwgaXQgd2lsbCBiZSBpbnZva2VkCi1mb3IgZXZlcnkgcmVxdWVzdCByZWNlaXZlZCBieSB0aGF0IHNlcnZpY2Ugb3Igb3BlcmF0aW9uPC9wPgotCi08cD5BeGlzMiBwcm92aWRlcyBhIG51bWJlciBvZiBidWlsdCBpbiBNb2R1bGVzIChzdWNoIGFzIDxhCi1ocmVmPSIiPmFkZHJlc3Npbmc8L2E+LDxhIGhyZWY9IiI+U2VjdXJpdHk8L2E+LCA8YSBocmVmPSIiPldTLVJlbGlhYmxlCi1NZXNzYWdpbmc8L2E+KSwgYW5kIHRoZXkgY2FuIGJlIGVuZ2FnZWQgYXMgc2hvd24gYWJvdmUuIFBsZWFzZSByZWZlciB0byBlYWNoCi1tb2R1bGUgb24gaG93IHRvIHVzZSBhbmQgY29uZmlndXJlIHRoZW0uIFlvdSBjYW4gYWxzbyA8YQotaHJlZj0ibW9kdWxlcy5odG1sIj5jcmVhdGUgeW91ciBvd24gbW9kdWxlcyB3aXRoIEF4aXMyPC9hPi4gQWxzbyByZWZlciB0byA8YQotaHJlZj0iYXhpczJjb25maWcuaHRtbCNHbG9iYWxfQ29uZmlndXJhdGlvbiI+QXhpczIgQ29uZmlndXJhdGlvbiBHdWlkZTwvYT4KLWZvciBhIHJlZmVyZW5jZSBvbiB0aGUgbW9kdWxlLnhtbCBmaWxlLjwvcD4KLQotPGgzPldTLUFkZHJlc3NpbmcgU3VwcG9ydDwvaDM+Ci0KLTxwPldTLUFkZHJlc3Npbmcgc3VwcG9ydCBmb3IgQXhpczIgaXMgaW1wbGVtZW50ZWQgYnkgdGhlIGFkZHJlc3NpbmcgbW9kdWxlLgotVG8gZW5hYmxlIGFkZHJlc3NpbmcsIHlvdSBuZWVkIHRvIGVuZ2FnZSB0aGUgYWRkcmVzc2luZyBtb2R1bGUgaW4gYm90aCBzZXJ2ZXIKLWFuZCBjbGllbnQgc2lkZXMuPC9wPgotPG9sPgotICA8bGk+VG8gPHN0cm9uZz5lbmFibGU8L3N0cm9uZz4gYWRkcmVzc2luZyBhdCB0aGUgc2VydmVyIHNpZGUsIHlvdSBuZWVkIHRvCi0gICAgY29weSB0aGUgYWRkcmVzc2luZy5tYXIgZmlsZSB0byB0aGUgbW9kdWxlcyBkaXJlY3Rvcnkgb2YgdGhlIHNlcnZlcidzCi0gICAgYXhpczIgcmVwb3NpdG9yeS4gVG8gZW5nYWdlIHRoZSBtb2R1bGUsIGFkZCBhICZsdDttb2R1bGUKLSAgICByZWY9ImFkZHJlc3NpbmciLyZndDsgdG8gYXhpczIueG1sLiBUaGUgPHN0cm9uZz5BZGRyZXNzaW5nIG1vZHVsZSBjYW4gYmUKLSAgICBlbmdhZ2VkIG9ubHkgYXQgZ2xvYmFsIGxldmVsLjwvc3Ryb25nPjwvbGk+Ci0gIDxsaT5UbyA8c3Ryb25nPmVuYWJsZTwvc3Ryb25nPiBhZGRyZXNzaW5nIGF0IHRoZSBjbGllbnQgc2lkZSwgeW91IHNob3VsZAotICAgIGFkZCBpdCB0byB0aGUgcmVwb3NpdG9yeSBhbmQgcHJvdmlkZSB0aGUgcmVwb3NpdG9yeSBhcyBhbiBhcmd1bWVudCB0byB0aGUKLSAgICA8YSBocmVmPSJkaWkuaHRtbCI+U2VydmljZUNsaWVudDwvYT4gb3IgPGEgaHJlZj0iI2NsaWVudCI+Z2VuZXJhdGVkCi0gICAgc3R1YjwvYT4gb3IgaGF2ZSBpdCBpbiB5b3VyIGNsYXNzcGF0aC48L2xpPgotICA8bGk+VG8gPHN0cm9uZz5lbmdhZ2U8L3N0cm9uZz4gdGhlIGFkZHJlc3NpbmcgbW9kdWxlLCB5b3Ugc2hvdWxkIGVpdGhlciBhZGQKLSAgICAmbHQ7bW9kdWxlIHJlZj0iYWRkcmVzc2luZyIvJmd0OyB0byB0aGUgYXhpczIueG1sIGZpbGUgYXQgdGhlIGNsaWVudCBzaWRlCi0gICAgb3IgY2FsbAotICAgIDxwcmU+c3R1Yi5fZ2V0U2VydmljZUNsaWVudCgpLmVuZ2FnZU1vZHVsZShtb2R1bGVOYW1lKTwvcHJlPgotICA8L2xpPgotPC9vbD4KLTxhIG5hbWU9ImFkdmFuY2VkIj48L2E+Ci0KLTxoMj5BZHZhbmNlZCBUb3BpY3M8L2gyPgotCi08aDM+VHJhbnNwb3J0czwvaDM+Ci0KLTxwPkJ5IGRlZmF1bHQsIEF4aXMyIGlzIGNvbmZpZ3VyZWQgdG8gdXNlIEhUVFAgYXMgdGhlIHRyYW5zcG9ydC4gSG93ZXZlciwKLUF4aXMyIHN1cHBvcnRzIEhUVFAsIFNNVFAsIFRDUCBhbmQgSk1TIHRyYW5zcG9ydHMuIFlvdSBjYW4gYWxzbyB3cml0ZSB5b3VyCi1vd24gdHJhbnNwb3J0cywgYW5kIGRlcGxveSB0aGVtIGJ5IGFkZGluZyBuZXcgdHJhbnNwb3J0UmVjZWl2ZXIgb3IKLXRyYW5zcG9ydFNlbmRlciB0YWdzIHRvIGF4aXMyLnhtbC4gVG8gbGVhcm4gaG93IHRvIGNvbmZpZ3VyZSBhbmQgdXNlCi1kaWZmZXJlbnQgdHJhbnNwb3J0cywgcGxlYXNlIHJlZmVyIHRvIHRoZSBmb2xsb3dpbmcgZG9jdW1lbnRzLjwvcD4KLTxvbD4KLSAgPGxpPjxhIGhyZWY9InRjcC10cmFuc3BvcnQuaHRtbCIgdGFyZ2V0PSJfYmxhbmsiPlRDUCBUcmFuc3BvcnQ8L2E+PC9saT4KLSAgPGxpPjxhIGhyZWY9Imh0dHAtdHJhbnNwb3J0Lmh0bWwiIHRhcmdldD0iX2JsYW5rIj5IVFRQIFRyYW5zcG9ydHM8L2E+PC9saT4KLTwvb2w+Ci0KLTxoMz5BdHRhY2htZW50czwvaDM+Ci0KLTxwPkF4aXMyIHByb3ZpZGVzIGF0dGFjaG1lbnQgc3VwcG9ydCB1c2luZyA8YQotaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIvc29hcDEyLW10b20vIj5NVE9NPC9hPi4gUGxlYXNlIHJlZmVyIHRvIDxhCi1ocmVmPSJtdG9tLWd1aWRlLmh0bWwiIHRhcmdldD0iX2JsYW5rIj5NVE9NIHdpdGggQXhpczI8L2E+IGZvciBtb3JlCi1pbmZvcm1hdGlvbi48L3A+Ci0KLTxoMz5TZWN1cml0eTwvaDM+Ci0KLTxwPkF4aXMyIHByb3ZpZGVzIFNlY3VyaXR5IHN1cHBvcnQgdXNpbmcgPGEKLWhyZWY9Imh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL21vZHVsZXMvcmFtcGFydC8xXzAvc2VjdXJpdHktbW9kdWxlLmh0bWwiPkFwYWNoZQotUmFtcGFydDwvYT4uIFBsZWFzZSByZWZlciB0byA8YQotaHJlZj0iLi4vbW9kdWxlcy93c3M0ai8xXzAvc2VjdXJpdHktbW9kdWxlLmh0bWwiIHRhcmdldD0iX2JsYW5rIj5TZWN1cmluZwotU09BUCBNZXNzYWdlcyB3aXRoIEFwYWNoZSBSYW1wYXJ0PC9hPiBmb3IgbW9yZSBpbmZvcm1hdGlvbi48L3A+Ci0KLTxoMz5SRVNUIFdlYiBTZXJ2aWNlPC9oMz4KLQotPHA+UGxlYXNlIHJlZmVyIHRvIDxhIGhyZWY9InJlc3Qtd3MuaHRtbCIgdGFyZ2V0PSJfYmxhbmsiPlJFU1RmdWwgV2ViCi1TZXJ2aWNlczwvYT4gZm9yIG1vcmUgaW5mb3JtYXRpb24uPC9wPgotCi08aDM+UGx1Z2dhYmxlIERhdGEgQmluZGluZzwvaDM+Ci0KLTxwPkF4aXMyIHNoaXBzIHdpdGggQXhpcyBEYXRhIEJpbmRpbmcoQURCKSBhcyB0aGUgZGVmYXVsdCBkYXRhIGJpbmRpbmcKLWZyYW1ld29yay4gSG93ZXZlciwgZGF0YSBiaW5kaW5nIGZyYW1ld29ya3MgYXJlIHBsdWdnYWJsZSB0byBBeGlzMiwgYW5kCi10aGVyZWZvcmUgeW91IGNhbiB1c2Ugb3RoZXIgZGF0YSBiaW5kaW5nIGZyYW1ld29ya3Mgd2l0aCBBeGlzMi4gUGxlYXNlIHJlZmVyCi10byB0aGUgZm9sbG93aW5nIGRvY3VtZW50cyBmb3IgbW9yZSBpbmZvcm1hdGlvbi48L3A+Ci0KLTxoND5BeGlzMiBEYXRhIEJpbmRpbmcoQURCKTwvaDQ+Ci08b2w+Ci0gIDxsaT48YSBocmVmPSJhZGIvYWRiLWhvd3RvLmh0bWwiIHRhcmdldD0iX2JsYW5rIj5BeGlzMiBEYXRhYmluZGluZwotICAgIEZyYW1ld29yazwvYT48L2xpPgotICA8bGk+PGEgaHJlZj0iYWRiL2FkYi1jb2RlZ2VuLWludGVncmF0aW9uLmh0bWwiIHRhcmdldD0iX2JsYW5rIj5BREIKLSAgICBJbnRlZ3JhdGlvbiBXaXRoIEF4aXMyPC9hPjwvbGk+Ci0gIDxsaT48YSBocmVmPSJhZGIvYWRiLWFkdmFuY2VkLmh0bWwiPkFkdmFuY2VkIEF4aXMyIERhdGFiaW5kaW5nIEZyYW1ld29yawotICAgIEZlYXR1cmVzPC9hPjwvbGk+Ci0gIDxsaT48YSBocmVmPSJhZGIvYWRiLXR3ZWFraW5nLmh0bWwiPkFEQiBUd2Vha2luZyBHdWlkZTwvYT48L2xpPgotPC9vbD4KLQotPGg0PkppQlg8L2g0PgotPGEgaHJlZj0iamlieC9qaWJ4LWNvZGVnZW4taW50ZWdyYXRpb24uaHRtbCI+SmlCWCBJbnRlZ3JhdGlvbiBXaXRoIEF4aXMyPC9hPgotCi08aDM+T3RoZXIgVG9waWNzPC9oMz4KLTxvbD4KLSAgPGxpPjxhIGhyZWY9InNwcmluZy5odG1sIiB0YXJnZXQ9Il9ibGFuayI+QXhpczIgSW50ZWdyYXRpb24gV2l0aCBUaGUgU3ByaW5nCi0gICAgRnJhbWV3b3JrPC9hPjwvbGk+Ci0gIDxsaT48YSBocmVmPSJXU19wb2xpY3kuaHRtbCIgdGFyZ2V0PSJfYmxhbmsiPldlYiBTZXJ2aWNlcyBQb2xpY3kgU3VwcG9ydCBJbgotICAgIEF4aXMyPC9hPjwvbGk+Ci0gIDxsaT48YSBocmVmPSJheGlzMmNvbmZpZy5odG1sI0dsb2JhbF9Db25maWd1cmF0aW9uIj5BeGlzMiBDb25maWd1cmF0aW9uCi0gICAgR3VpZGU8L2E+PC9saT4KLSAgPGxpPjxhIGhyZWY9IkF4aXMyLXJwYy1zdXBwb3J0Lmh0bWwiPkF4aXMyIFJQQyBTdXBwb3J0PC9hPjwvbGk+Ci0gIDxsaT48YSBocmVmPSJtaWdyYXRpb24uaHRtbCI+TWlncmF0aW5nIGZyb20gQXBhY2hlIEF4aXMgMS54IHRvIEF4aXMKLSAgMjwvYT48L2xpPgotICA8bGk+PGEgaHJlZj0ibW9kdWxlcy5odG1sIj5Xcml0aW5nIHlvdXIgT3duIEF4aXMyIE1vZHVsZTwvYT48L2xpPgotICA8bGk+PGEgaHJlZj0ic29hcG1vbml0b3ItbW9kdWxlLmh0bWwiPlVzaW5nIHRoZSBTT0FQIE1vbml0b3I8L2E+PC9saT4KLSAgPGxpPjxhIGhyZWY9InhtbGJhc2VkLXNlcnZlci5odG1sIj5Xcml0aW5nIFdlYiBTZXJ2aWNlcyBVc2luZyBBeGlzMidzCi0gICAgUHJpbWFyeSBBUElzPC9hPjwvbGk+Ci0gIDxsaT48YSBocmVmPSJkaWkuaHRtbCI+V3JpdGluZyBXZWIgU2VydmljZSBDbGllbnRzIFVzaW5nIEF4aXMyJ3MgUHJpbWFyeQotICAgIEFQSXM8L2E+PC9saT4KLSAgPGxpPjxhIGhyZWY9ImFwcF9zZXJ2ZXIuaHRtbCI+QXBwbGljYXRpb24gU2VydmVyIFNwZWNpZmljIENvbmZpZ3VyYXRpb24KLSAgICBHdWlkZTwvYT48L2xpPgotPC9vbD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9hcHBfc2VydmVyLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9hcHBfc2VydmVyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2MxNzZmNy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvYXBwX3NlcnZlci54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pg0KLQ0KLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4xLy9FTiINCi0gICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDExL0RURC94aHRtbDExLmR0ZCI+DQotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPg0KLTxoZWFkPg0KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0NCi0iSFRNTCBUaWR5IGZvciBXaW5kb3dzICh2ZXJzIDE0IEp1bmUgMjAwNyksIHNlZSB3d3cudzMub3JnIiAvPg0KLTxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0NCi0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPg0KLTx0aXRsZT5BcHBsaWNhdGlvbiBTZXJ2ZXIgU3BlY2lmaWMgQ29uZmlndXJhdGlvbiBHdWlkZTwvdGl0bGU+DQotPG1ldGEgY29udGVudD0iYW1heWEgOS4yLjEsIHNlZSBodHRwOi8vd3d3LnczLm9yZy9BbWF5YS8iIC8+DQotPGxpbmsgaHJlZj0iLi4vY3NzL2F4aXMtZG9jcy5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiDQotbWVkaWE9ImFsbCIgLz4NCi08L2hlYWQ+DQotPGJvZHk+DQotPGgxPkFwcGxpY2F0aW9uIFNlcnZlciBTcGVjaWZpYyBDb25maWd1cmF0aW9uIEd1aWRlPC9oMT4NCi08cD5UaGlzIGRvY3VtZW50IHByb3ZpZGVzIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gcmVxdWlyZWQgZm9yDQoteW91ciBBcHBsaWNhdGlvbiBTZXJ2ZXIgdG8gcnVuIEFwYWNoZSBBeGlzMiB0byBpdHMgZnVsbGVzdA0KLXBvdGVudGlhbC48L3A+DQotPGgzPldlYkxvZ2ljLyBXZWJTcGhlcmU8L2gzPg0KLTxwPjxzdHJvbmc+MS4gVXNlIGV4cGxvZGVkIGNvbmZpZ3VyYXRpb24gdG8gZGVwbG95IEF4aXMyDQotV0FSPC9zdHJvbmc+PC9wPg0KLTxwPldlIHJlY29tbWVuZCB1c2luZyB0aGUgZXhwbG9kZWQgY29uZmlndXJhdGlvbiB0byBkZXBsb3kgQXhpczINCi1XQVIgaW4gV2ViTG9naWMgYW5kIFdlYlNwaGVyZSBhcHBsaWNhdGlvbiBzZXJ2ZXJzIHRvIHN1cHBvcnQgdGhlDQotaG90dXBkYXRlLyBob3RkZXBsb3ltZW50IGZlYXR1cmVzIGluIEF4aXMyLiBIb3dldmVyLCBpZiB5b3Ugd2FudCB0bw0KLWRlcGxveSBjdXN0b20gV0FScywgc2F5IGluIGEgY2x1c3RlcmluZyBlbnZpcm9ubWVudCwgeW91IG5lZWQgdG8NCi1hZGQgdHdvIGFkZGl0aW9uYWwgZmlsZXMgaW50byB0aGUgV0VCLUlORiBuYW1lZCAic2VydmljZXMubGlzdCIgYW5kDQotIm1vZHVsZXMubGlzdCIgdW5kZXIgdGhlIG1vZHVsZXMgYW5kIHNlcnZpY2VzIGRpcmVjdG9yeQ0KLXJlc3BlY3RpdmVseS48L3A+DQotPHVsPg0KLTxsaT48Yj5XRUItSU5GL3NlcnZpY2VzL3NlcnZpY2VzLmxpc3Q8L2I+IDogc2hvdWxkIGxpc3QgYWxsIHRoZQ0KLXNlcnZpY2VzIChhYXIgZmlsZXMpIHRoYXQgeW91IHdhbnQgdG8gZXhwb3NlLjwvbGk+DQotPGxpPjxiPldFQi1JTkYvbW9kdWxlcy9tb2R1bGVzLmxpc3Q8L2I+IDogc2hvdWxkIGxpc3QgYWxsIHRoZQ0KLW1vZHVsZXMgKG1hciBmaWxlcykgdGhhdCB5b3Ugd2FudCB0byB1c2UuPC9saT4NCi08L3VsPg0KLU5PVEU6IEluIGJvdGggY2FzZXMsIHBsZWFzZSBsaXN0IG9uZSBlbnRyeSBwZXIgbGluZS4NCi08cD5XZWJMb2dpYyBzaGlwcyB3aXRoIEpBUnMgdGhhdCBjb25mbGljdCB3aXRoIEpBUnMgcHJlc2VudCBpbg0KLUF4aXMyLiBUaGVyZWZvcmUgdXNlICZsdDtwcmVmZXItd2ViLWluZi1jbGFzc2VzJmd0OyB0byBlbnN1cmUgdGhhdA0KLUpBUnMgcGFja2FnZWQgaW4gQXhpczIgV0FSIGFyZSBwaWNrZWQgdXAgZnJvbSBXRUItSU5GL2xpYi4gWW91IGNhbg0KLWRvIHRoaXMgYnkgc2V0dGluZyB0aGUgJmx0O3ByZWZlci13ZWItaW5mLWNsYXNzZXMmZ3Q7IGVsZW1lbnQgaW4NCi1XRUItSU5GL3dlYmxvZ2ljLnhtbCB0byB0cnVlLiBBbiBleGFtcGxlIG9mIHdlYmxvZ2ljLnhtbCBpcyBzaG93bg0KLWJlbG93OjwvcD4NCi08cHJlPg0KLSZsdDt3ZWJsb2dpYy13ZWItYXBwJmd0Ow0KLSAmbHQ7Y29udGFpbmVyLWRlc2NyaXB0b3ImZ3Q7DQotICAgICZsdDtwcmVmZXItd2ViLWluZi1jbGFzc2VzJmd0O3RydWUmbHQ7L3ByZWZlci13ZWItaW5mLWNsYXNzZXMmZ3Q7DQotICAmbHQ7L2NvbnRhaW5lci1kZXNjcmlwdG9yJmd0Ow0KLSZsdDsvd2VibG9naWMtd2ViLWFwcCZndDsNCi08L3ByZT4NCi08cD5JZiBzZXQgdG8gdHJ1ZSwgdGhlICZsdDtwcmVmZXItd2ViLWluZi1jbGFzc2VzJmd0OyBlbGVtZW50IHdpbGwNCi1mb3JjZSBXZWJMb2dpYydzIGNsYXNzbG9hZGVyIHRvIGxvYWQgY2xhc3NlcyBsb2NhdGVkIGluIHRoZSBXRUItSU5GDQotZGlyZWN0b3J5IG9mIGEgV2ViIGFwcGxpY2F0aW9uIGluIHByZWZlcmVuY2UgdG8gYXBwbGljYXRpb24gb3INCi1zeXN0ZW0gY2xhc3Nlcy4gVGhpcyBpcyBhIHJlY29tbWVuZGVkIGFwcHJvYWNoIHNpbmNlIGl0IG9ubHkNCi1pbXBhY3RzIGEgc2luZ2xlIFdlYiBtb2R1bGUuPC9wPg0KLTxwPlBsZWFzZSByZWZlciB0byB0aGUgZm9sbG93aW5nIGRvY3VtZW50cyBpbiBXZWJMb2dpYy8gV2ViU3BoZXJlDQotZm9yIG1vcmUgaW5mb3JtYXRpb246PC9wPg0KLTx1bD4NCi08bGk+PGEgaHJlZj0NCi0iaHR0cDovL2UtZG9jcy5iZWEuY29tL3dscy9kb2NzODEvcHJvZ3JhbW1pbmcvY2xhc3Nsb2FkaW5nLmh0bWwiPldlYkxvZ2ljDQotU2VydmVyQXBwbGljYXRpb24gQ2xhc3Nsb2FkaW5nPC9hPi0gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gaG93DQotV2ViTG9naWMncyBjbGFzcyBsb2FkZXIgd29ya3M8L2xpPg0KLTxsaT48YSBocmVmPQ0KLSJodHRwOi8vZS1kb2NzLmJlYS5jb20vd2xzL2RvY3M4MS93ZWJhcHAvZGVwbG95bWVudC5odG1sIj5SZWRlcGxveWluZw0KLWEgV2ViIEFwcGxpY2F0aW9uIGluIEV4cGxvZGVkIERpcmVjdG9yeSBGb3JtYXQ8L2E+PC9saT4NCi08bGk+PGEgaHJlZj0NCi0iaHR0cDovL3B1YmxpYi5ib3VsZGVyLmlibS5jb20vaW5mb2NlbnRlci93c2lpaGVscC92OHIzL2luZGV4LmpzcD90b3BpYz0vY29tLmlibS53ZWJzcGhlcmUuaWkucHJvZHVjdC5jZS5kb2MvY29uZmlndXJpbmcvaWl5dmlpZ2RlcHdlYmV4cGwuaHRtIj4NCi1EZXBsb3lpbmcgdGhlIFdlYiBhcHBsaWNhdGlvbiBpbiBleHBsb2RlZCBmb3JtPC9hPjwvbGk+DQotPC91bD4NCi08cD48c3Ryb25nPjIuIExhY2sgb2YgbmFtZXNwYWNpbmcgb24gc2VyaWFsaXNlZCBpdGVtczwvc3Ryb25nPjwvcD4NCi08cD5CRUEgV2ViTG9naWMgU2VydmVyIDkuMCBjb21lcyB3aXRoIGl0cyBvd24gU3RBWCBpbXBsZW1lbnRhdGlvbi4NCi1UaGlzIHJlc3VsdHMgaW4gbGFjayBvZiBuYW1lc3BhY2luZyBvbiBzZXJpYWxpc2VkIGl0ZW1zLiBJbiB0dXJuLA0KLVdlYkxvZ2ljIHNlcnZlciAoV0xTKSBicmVha3Mgd2l0aCBBWElPTSBvbiB0aGUgV0xTIGNsYXNzcGF0aC4gSGVuY2UNCi1hIGZpbHRlcmluZyBjbGFzc2xvYWRlciBpcyByZXF1aXJlZDo8L3A+DQotPHA+QWRkaW5nIHRoZSBmb2xsb3dpbmcgdG8gd2VibG9naWMtYXBwbGljYXRpb24ueG1sIHNob3VsZCByZXNvbHZlDQotdGhpcyBpc3N1ZTo8L3A+DQotPHByZT4NCi0mbHQ7cHJlZmVyLWFwcGxpY2F0aW9uLXBhY2thZ2VzJmd0Ow0KLSZsdDtwYWNrYWdlLW5hbWUmZ3Q7Y29tLmN0Yy53c3R4LiombHQ7L3BhY2thZ2UtbmFtZSZndDsNCi0mbHQ7cGFja2FnZS1uYW1lJmd0O2phdmF4LnhtbC4qJmx0Oy9wYWNrYWdlLW5hbWUmZ3Q7DQotJmx0O3BhY2thZ2UtbmFtZSZndDtvcmcuYXBhY2hlLiombHQ7L3BhY2thZ2UtbmFtZSZndDsNCi0mbHQ7L3ByZWZlci1hcHBsaWNhdGlvbi1wYWNrYWdlcyZndDsNCi08L3ByZT4NCi08cD5Ob3RlIHRoYXQgdGhlIGxpYnJhcmllcyBsaXN0ZWQtLVhlcmNlcywgU3RBWCBBUEksIFdvb2RzdG94LS1uZWVkDQotdG8gYmUgb24gdGhlIGFwcGxpY2F0aW9uIGNsYXNzcGF0aC48L3A+DQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvYXhpczJjb25maWcueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2F4aXMyY29uZmlnLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE2Mjk5NS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvYXhpczJjb25maWcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDgxICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjEvL0VOIgotICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxMS9EVEQveGh0bWwxMS5kdGQiPgotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSIiLz4KLSAgPHRpdGxlPkF4aXMyIENvbmZpZ3VyYXRpb24gRG9jdW1lbnRzPC90aXRsZT4KLSAgPGxpbmsgaHJlZj0iLi4vY3NzL2F4aXMtZG9jcy5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiCi0gIG1lZGlhPSJhbGwiLz4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iZW4iPgotPGgxPkF4aXMyIENvbmZpZ3VyYXRpb24gR3VpZGU8L2gxPgotCi08cD5JbiBBeGlzMiwgdGhlcmUgYXJlIHRocmVlIGtpbmRzIG9mIGNvbmZpZ3VyYXRpb24gZmlsZXMgdG8gY29uZmlndXJlIHRoZQotc3lzdGVtLiBUaGUgZmlyc3Qgb25lIGlzIHRvIGNvbmZpZ3VyZSB0aGUgd2hvbGUgc3lzdGVtIChnbG9iYWwKLWNvbmZpZ3VyYXRpb24pLCB0aGUgc2Vjb25kIG9uZSBpcyB0byBjb25maWd1cmUgYSBzZXJ2aWNlIChzZXJ2aWNlCi1jb25maWd1cmF0aW9uKSwgYW5kIHRoZSB0aGlyZCBvbmUgaXMgdG8gY29uZmlndXJlIGEgbW9kdWxlIChtb2R1bGUKLWNvbmZpZ3VyYXRpb24pLiBUaGlzIGRvY3VtZW50IGV4cGxhaW5zIHRoZSBhYm92ZSBjb25maWd1cmF0aW9ucyBpbiBkZXRhaWwuPC9wPgotCi08aDI+Q29udGVudDwvaDI+Ci08dWw+Ci0gIDxsaT48YSBocmVmPSIjR2xvYmFsX0NvbmZpZ3VyYXRpb24iPkdsb2JhbCBDb25maWd1cmF0aW9uCi0gIChheGlzMi54bWwpPC9hPjwvbGk+Ci0gIDxsaT48YSBocmVmPSIjU2VydmljZV9Db25maWd1cmF0aW9uIj5TZXJ2aWNlIENvbmZpZ3VyYXRpb24KLSAgICAoc2VydmljZXMueG1sKTwvYT48L2xpPgotICA8bGk+PGEgaHJlZj0iI01vZHVsZV9Db25maWd1cmF0aW9uIj5Nb2R1bGUgQ29uZmlndXJhdGlvbgotICAobW9kdWxlLnhtbCk8L2E+PC9saT4KLTwvdWw+Ci08YSBuYW1lPSJHbG9iYWxfQ29uZmlndXJhdGlvbiI+PC9hPgotCi08aDI+R2xvYmFsIENvbmZpZ3VyYXRpb248L2gyPgotPHVsPgotICA8bGk+V3JpdGluZyBheGlzMi54bWw8L2xpPgotPC91bD4KLQotPHA+QWxsIHRoZSBjb25maWd1cmF0aW9ucyB0aGF0IHJlcXVpcmUgc3RhcnRpbmcgQXhpczIgYXJlIG9idGFpbmVkIGZyb20KLWF4aXMyLnhtbC4gVGhlIHdheSB0byBzcGVjaWZ5IHRoZW0gaXMgZXh0cmVtZWx5IHNpbXBsZSBhbmQgZWFzeS4gVGhlIGRvY3VtZW50Ci1pcyBhbGwgYWJvdXQgdGhlIHByb3BlciB3YXkgb2Ygc3BlY2lmeWluZyB0aGUgY29uZmlndXJhdGlvbnMgaW4gYXhpczIueG1sLgotVGhlcmUgYXJlIHNpeCB0b3AgbGV2ZWwgZWxlbWVudHMgdGhhdCBjYW4gYmUgc2VlbiBpbiB0aGUgY29uZmlndXJhdGlvbiBmaWxlCi1hbmQgY2FuIGJlIGxpc3RlZCBhcyBmb2xsb3dzOjwvcD4KLTx1bD4KLSAgPGxpPjxhIGhyZWY9IiNQYXJhbWV0ZXIiPlBhcmFtZXRlcjwvYT48L2xpPgotICA8bGk+PGEgaHJlZj0iI1JlY2VpdmVyIj5UcmFuc3BvcnQgUmVjZWl2ZXI8L2E+PC9saT4KLSAgPGxpPjxhIGhyZWY9IiNTZW5kZXIiPlRyYW5zcG9ydCBTZW5kZXI8L2E+PC9saT4KLSAgPGxpPjxhIGhyZWY9IiNQaGFzZV9PcmRlciI+UGhhc2UgT3JkZXI8L2E+PC9saT4KLSAgPGxpPjxhIGhyZWY9IiNSZWZlcmVuY2VzIj5Nb2R1bGUgUmVmZXJlbmNlczwvYT48L2xpPgotICA8bGk+PGEgaHJlZj0iI0xpc3RlbmVycyI+TGlzdGVuZXJzIChPYnNlcnZlcnMpPC9hPjwvbGk+Ci08L3VsPgotPGEgbmFtZT0iUGFyYW1ldGVyIj48L2E+Ci0KLTxoMz5QYXJhbWV0ZXI8L2gzPgotCi08cD5JbiBBeGlzMiwgYSBwYXJhbWV0ZXIgaXMgbm90aGluZyBidXQgYSBuYW1lLXZhbHVlIHBhaXIuIEVhY2ggYW5kIGV2ZXJ5IHRvcAotbGV2ZWwgcGFyYW1ldGVyIGF2YWlsYWJsZSBpbiB0aGUgYXhpczIueG1sIChkaXJlY3Qgc3ViIGVsZW1lbnRzIG9mIHRoZSByb290Ci1lbGVtZW50KSB3aWxsIGJlIHRyYW5zZm9ybWVkIGludG8gcHJvcGVydGllcyBpbiBBeGlzQ29uZmlndXJhdGlvbi4gVGhlcmVmb3JlLAotdGhlIHRvcCBsZXZlbCBwYXJhbWV0ZXJzIGluIHRoZSBjb25maWd1cmF0aW9uIGRvY3VtZW50IGNhbiBiZSBhY2Nlc3NlZCB2aWEKLUF4aXNDb25maWd1cmF0aW9uIGluIHRoZSBydW5uaW5nIHN5c3RlbS4gVGhlIGNvcnJlY3Qgd2F5IG9mIGRlZmluaW5nIGEKLXBhcmFtZXRlciBpcyBzaG93biBiZWxvdzo8L3A+Ci08c291cmNlPjxwcmU+IAotICAmbHQ7cGFyYW1ldGVyIG5hbWU9Im5hbWUgb2YgdGhlIHBhcmFtZXRlciIgJmd0O3BhcmFtZXRlciB2YWx1ZSAmbHQ7L3BhcmFtZXRlciZndDs8L3ByZT4KLTwvc291cmNlPjxhIG5hbWU9IlJlY2VpdmVyIj48L2E+Ci0KLTxoMz5UcmFuc3BvcnQgUmVjZWl2ZXI8L2gzPgotCi08cD5EZXBlbmRpbmcgb24gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0IG9uIHdoaWNoIEF4aXMyIGlzIGdvaW5nIHRvIHJ1biwgeW91Ci1uZWVkIHRvIGhhdmUgZGlmZmVyZW50IHRyYW5zcG9ydCByZWNlaXZlcnMuIFRoZSB3YXkgeW91IGFkZCB0aGVtIHRvIHRoZQotc3lzdGVtIGlzIGFzIGZvbGxvd3M6PC9wPiA8c291cmNlPgotPHByZT4KLSZsdDt0cmFuc3BvcnRSZWNlaXZlciBuYW1lPSJodHRwIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5TaW1wbGVIVFRQU2VydmVyIiZndDsKLSAgICAgICAgJmx0O3BhcmFtZXRlciBuYW1lPSJwb3J0IiAmZ3Q7NjA2MCZsdDsvcGFyYW1ldGVyJmd0OwotICZsdDsvdHJhbnNwb3J0UmVjZWl2ZXImZ3Q7IAotIDwvcHJlPgotPC9zb3VyY2U+VGhlIGFib3ZlIGVsZW1lbnRzIHNob3cgaG93IHRvIGRlZmluZSB0cmFuc3BvcnQgcmVjZWl2ZXJzIGluCi1heGlzMi54bWwuIEhlcmUgdGhlICJuYW1lIiBhdHRyaWJ1dGUgb2YgdGhlICZsdDt0cmFuc3BvcnRSZWNlaXZlci8mZ3Q7IGVsZW1lbnQgaWRlbnRpZmllcyB0aGUKLXR5cGUgb2YgdGhlIHRyYW5zcG9ydCByZWNlaXZlci4gSXQgY2FuIGJlIEhUVFAsIFRDUCwgU01UUCwgQ29tbW9uc0hUVFAsIGV0Yy4KLVdoZW4gdGhlIHN5c3RlbSBzdGFydHMgdXAgb3Igd2hlbiB5b3Ugc2V0IHRoZSB0cmFuc3BvcnQgYXQgdGhlIGNsaWVudCBzaWRlLAoteW91IGNhbiB1c2UgdGhlc2UgdHJhbnNwb3J0IG5hbWVzIHRvIGxvYWQgdGhlIGFwcHJvcHJpYXRlIHRyYW5zcG9ydC4gVGhlICJjbGFzcyIKLWF0dHJpYnV0ZSBpcyBmb3Igc3BlY2lmeWluZyB0aGUgYWN0dWFsIGphdmEgY2xhc3MgdGhhdCB3aWxsIGltcGxlbWVudCB0aGUgcmVxdWlyZWQKLWludGVyZmFjZXMgZm9yIHRoZSB0cmFuc3BvcnQuIEFueSB0cmFuc3BvcnQgY2FuIGhhdmUgemVybyBvciBtb3JlIHBhcmFtZXRlcnMsCi1hbmQgYW55IHBhcmFtZXRlcnMgZ2l2ZW4gY2FuIGJlIGFjY2Vzc2VkIHZpYSB0aGUgY29ycmVzcG9uZGluZwotdHJhbnNwb3J0IHJlY2VpdmVyLiA8YSBuYW1lPSJTZW5kZXIiPjwvYT4KLQotPGgzPlRyYW5zcG9ydCBTZW5kZXI8L2gzPgotCi08cD5KdXN0IGxpa2UgdGhlIHRyYW5zcG9ydCByZWNlaXZlcnMsIHlvdSBjYW4gcmVnaXN0ZXIgdHJhbnNwb3J0IHNlbmRlcnMgaW4gdGhlCi1zeXN0ZW0sIGFuZCBsYXRlciBhdCBydW4gdGltZSwgdGhlIHNlbmRlcnMgY2FuIGJlIHVzZWQgdG8gc2VuZCB0aGUgbWVzc2FnZXMuCi1Gb3IgZXhhbXBsZSwgY29uc2lkZXIgQXhpczIgcnVubmluZyB1bmRlciBBcGFjaGUgVG9tY2F0LiBUaGVuIEF4aXMyIGNhbiB1c2UKLVRDUCB0cmFuc3BvcnQgc2VuZGVycyB0byBzZW5kIG1lc3NhZ2VzIHJhdGhlciB0aGFuIEhUVFAuIFRoZSBtZXRob2Qgb2YKLXNwZWNpZnlpbmcgdHJhbnNwb3J0IHNlbmRlcnMgaXMgYXMgZm9sbG93czo8L3A+Ci08cHJlPiAKLSZsdDt0cmFuc3BvcnRTZW5kZXIgbmFtZT0iaHR0cCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuQ29tbW9uc0hUVFBUcmFuc3BvcnRTZW5kZXIiJmd0OwotICAgICAgICAmbHQ7cGFyYW1ldGVyIG5hbWU9IlBST1RPQ09MIiBsb2NrZWQ9InhzZDpmYWxzZSImZ3Q7SFRUUC8xLjAmbHQ7L3BhcmFtZXRlciZndDsKLSAmbHQ7L3RyYW5zcG9ydFNlbmRlciZndDsgCi0gPC9wcmU+Ci08c3Ryb25nPm5hbWU6PC9zdHJvbmc+IE5hbWUgb2YgdGhlIHRyYW5zcG9ydCAoeW91IGNhbiBoYXZlIEhUVFAgYW5kIEhUVFAxIGFzCi10aGUgdHJhbnNwb3J0IG5hbWUpCi0KLTxwPjxzdHJvbmc+Y2xhc3M6PC9zdHJvbmc+IEltcGxlbWVudGF0aW9uIGNsYXNzIG9mIHRoZSBjb3JyZXNwb25kaW5nCi10cmFuc3BvcnQuPC9wPgotCi08cD5KdXN0IGxpa2UgdGhlIHRyYW5zcG9ydCByZWNlaXZlcnMsIHRyYW5zcG9ydCBzZW5kZXJzIGNhbiBoYXZlIHplcm8KLW9yIG1vcmUgcGFyYW1ldGVycywgYW5kIGlmIHRoZXJlIGFyZSBhbnksIHRoZXkgY2FuIGJlIGFjY2Vzc2VkIHZpYSB0aGUKLWNvcnJlc3BvbmRpbmcgdHJhbnNwb3J0IHNlbmRlci48L3A+Ci08YSBuYW1lPSJQaGFzZV9PcmRlciI+PC9hPgotCi08aDM+UGhhc2UgT3JkZXI8L2gzPgotCi08cD5TcGVjaWZ5aW5nIHRoZSBvcmRlciBvZiBwaGFzZXMgaW4gdGhlIGV4ZWN1dGlvbiBjaGFpbiBoYXMgdG8gYmUgZG9uZSB1c2luZwotdGhlIHBoYXNlIG9yZGVyIGVsZW1lbnQuIEl0IHdpbGwgbG9vayBhcyBmb2xsb3dzOjwvcD4KLTxwcmU+Jmx0O3BoYXNlT3JkZXIgdHlwZT0iSW5GbG93IiZndDsKLSAgICAgICAgICZsdDtwaGFzZSBuYW1lPSJUcmFuc3BvcnRJbiIvJmd0OwotICAgICAgICAgLgotICAgICAgICAgLgotJmx0Oy9waGFzZU9yZGVyJmd0OyAgIDwvcHJlPgotCi08cD5UaGUgbW9zdCBpbnRlcmVzdGluZyB0aGluZyBpcyB0aGF0IHlvdSBjYW4gYWRkIGhhbmRsZXJzIGhlcmUgYXMgd2VsbC4gSWYKLXlvdSB3YW50IHRvIGFkZCBhIGhhbmRsZXIgdGhhdCBzaG91bGQgZ28gaW50byB0aGF0IHBoYXNlLCB5b3UgY2FuIGRpcmVjdGx5IGRvCi10aGF0IGJ5IGFkZGluZyBhIGhhbmRsZXIgZWxlbWVudCBpbnRvIGl0LiBJbiBhZGRpdGlvbiB0byB0aGF0LCB0aGVyZSBpcyBubwotaGFyZCBjb2Rpbmcgd29yayBmb3IgdGhlIGhhbmRsZXIgY2hhaW4gYW55d2hlcmUgaW4gQXhpczIgKGF0IGFueSBBeGlzKikuIFNvCi1hbGwgdGhvc2UgY29uZmlndXJhdGlvbnMgYXJlIGFsc28gZG9uZSBpbiB0aGUgcGhhc2Ugb3JkZXIgZWxlbWVudC4gVGhlCi1jb21wbGV0ZSBjb25maWd1cmF0aW9ucyB3aWxsIGxvb2sgYXMgZm9sbG93czogPC9wPjxzb3VyY2U+Ci08cHJlPiZsdDtwaGFzZU9yZGVyIHR5cGU9IkluRmxvdyImZ3Q7Ci0gICAgICAgICZsdDshLS0gICBHbG9iYWwgcGhhc2VzICAgIC0tJmd0OwotICAgICAgICAgJmx0O3BoYXNlIG5hbWU9IlRyYW5zcG9ydCImZ3Q7Ci0gICAgICAgICAgICAmbHQ7aGFuZGxlciBuYW1lPSJSZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciImZ3Q7Ci0gICAgICAgICAgICAgICAgJmx0O29yZGVyIHBoYXNlPSJUcmFuc3BvcnQiLyZndDsKLSAgICAgICAgICAgICZsdDsvaGFuZGxlciZndDsKLQotICAgICAgICAgICAgJmx0O2hhbmRsZXIgbmFtZT0iU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiJmd0OwotICAgICAgICAgICAgICAgICZsdDtvcmRlciBwaGFzZT0iVHJhbnNwb3J0Ii8mZ3Q7Ci0gICAgICAgICAgICAmbHQ7L2hhbmRsZXImZ3Q7Ci0gICAgICAgICZsdDsvcGhhc2UmZ3Q7Ci0gICAgICAgICZsdDtwaGFzZSBuYW1lPSJTZWN1cml0eSIvJmd0OwotICAgICAgICAmbHQ7cGhhc2UgbmFtZT0iUHJlRGlzcGF0Y2giLyZndDsKLSAgICAgICAgJmx0O3BoYXNlIG5hbWU9IkRpc3BhdGNoIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuRGlzcGF0Y2hQaGFzZSImZ3Q7Ci0gICAgICAgICAgICAmbHQ7aGFuZGxlciBuYW1lPSJBZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciImZ3Q7Ci0gICAgICAgICAgICAgICAgJmx0O29yZGVyIHBoYXNlPSJEaXNwYXRjaCIvJmd0OwotICAgICAgICAgICAgJmx0Oy9oYW5kbGVyJmd0OwotCi0gICAgICAgICAgICAmbHQ7aGFuZGxlciBuYW1lPSJTT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiJmd0OwotICAgICAgICAgICAgICAgICZsdDtvcmRlciBwaGFzZT0iRGlzcGF0Y2giLyZndDsKLSAgICAgICAgICAgICZsdDsvaGFuZGxlciZndDsKLQotICAgICAgICAgICAgJmx0O2hhbmRsZXIgbmFtZT0iSW5zdGFuY2VEaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkluc3RhbmNlRGlzcGF0Y2hlciImZ3Q7Ci0gICAgICAgICAgICAgICAgJmx0O29yZGVyIHBoYXNlPSJEaXNwYXRjaCIvJmd0OwotICAgICAgICAgICAgJmx0Oy9oYW5kbGVyJmd0OwotICAgICAgICAmbHQ7L3BoYXNlJmd0OwotICAgICAgICAmbHQ7IS0tICAgR2xvYmFsIHBoYXNlcyAgIC0tJmd0OwotICAgICAgICAmbHQ7IS0tICAgQWZ0ZXIgdGhlIERpc3BhdGNoIHBoYXNlIG1vZHVsZSBhdXRob3Igb3Igc2VydmljZSBhdXRob3IgY2FuIGFkZCBhbnkgcGhhc2UgaGUgd2FudHMgICAgLS0mZ3Q7Ci0gICAgICAgICZsdDtwaGFzZSBuYW1lPSJPcGVyYXRpb25JblBoYXNlIi8mZ3Q7Ci0gICAgJmx0Oy9waGFzZU9yZGVyJmd0OwotICAgICZsdDtwaGFzZU9yZGVyIHR5cGU9Ik91dEZsb3ciJmd0OwotICAgICAgICAmbHQ7IS0tICAgdXNlciBjYW4gYWRkIGhpcyBvd24gcGhhc2VzIHRvIHRoaXMgYXJlYSAgLS0mZ3Q7Ci0gICAgICAgICZsdDtwaGFzZSBuYW1lPSJPcGVyYXRpb25PdXRQaGFzZSIvJmd0OwotICAgICAgICAmbHQ7IS0tICBHbG9iYWwgcGhhc2VzICAtLSZndDsKLSAgICAgICAgJmx0OyEtLSAgdGhlc2UgcGhhc2VzIHdpbGwgcnVuIGlycmVzcGVjdGl2ZSBvZiB0aGUgc2VydmljZSAgLS0mZ3Q7Ci0gICAgICAgICZsdDtwaGFzZSBuYW1lPSJNZXNzYWdlT3V0Ii8mZ3Q7Ci0gICAgICAgICZsdDtwaGFzZSBuYW1lPSJQb2xpY3lEZXRlcm1pbmF0aW9uIi8mZ3Q7Ci0gICAgJmx0Oy9waGFzZU9yZGVyJmd0OwotICAgICZsdDtwaGFzZU9yZGVyIHR5cGU9IkluRmF1bHRGbG93IiZndDsKLSAgICAgICAgJmx0O3BoYXNlIG5hbWU9IlByZURpc3BhdGNoIi8mZ3Q7Ci0gICAgICAgICZsdDtwaGFzZSBuYW1lPSJEaXNwYXRjaCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkRpc3BhdGNoUGhhc2UiJmd0OwotICAgICAgICAgICAgJmx0O2hhbmRsZXIgbmFtZT0iUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiJmd0OwotICAgICAgICAgICAgICAgICZsdDtvcmRlciBwaGFzZT0iRGlzcGF0Y2giLyZndDsKLSAgICAgICAgICAgICZsdDsvaGFuZGxlciZndDsKLQotICAgICAgICAgICAgJmx0O2hhbmRsZXIgbmFtZT0iU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiJmd0OwotICAgICAgICAgICAgICAgICZsdDtvcmRlciBwaGFzZT0iRGlzcGF0Y2giLyZndDsKLSAgICAgICAgICAgICZsdDsvaGFuZGxlciZndDsKLQotICAgICAgICAgICAgJmx0O2hhbmRsZXIgbmFtZT0iQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiJmd0OwotICAgICAgICAgICAgICAgICZsdDtvcmRlciBwaGFzZT0iRGlzcGF0Y2giLyZndDsKLSAgICAgICAgICAgICZsdDsvaGFuZGxlciZndDsKLQotICAgICAgICAgICAgJmx0O2hhbmRsZXIgbmFtZT0iU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIiZndDsKLSAgICAgICAgICAgICAgICAmbHQ7b3JkZXIgcGhhc2U9IkRpc3BhdGNoIi8mZ3Q7Ci0gICAgICAgICAgICAmbHQ7L2hhbmRsZXImZ3Q7Ci0gICAgICAgICAgICAmbHQ7aGFuZGxlciBuYW1lPSJJbnN0YW5jZURpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuSW5zdGFuY2VEaXNwYXRjaGVyIiZndDsKLSAgICAgICAgICAgICAgICAmbHQ7b3JkZXIgcGhhc2U9IkRpc3BhdGNoIi8mZ3Q7Ci0gICAgICAgICAgICAmbHQ7L2hhbmRsZXImZ3Q7Ci0gICAgICAgICZsdDsvcGhhc2UmZ3Q7Ci0gICAgICAgICZsdDshLS0gICAgICB1c2VyIGNhbiBhZGQgaGlzIG93biBwaGFzZXMgdG8gdGhpcyBhcmVhICAtLSZndDsKLSAgICAgICAgJmx0O3BoYXNlIG5hbWU9Ik9wZXJhdGlvbkluRmF1bHRQaGFzZSIvJmd0OwotICAgICZsdDsvcGhhc2VPcmRlciZndDsKLSAgICAmbHQ7cGhhc2VPcmRlciB0eXBlPSJPdXRGYXVsdEZsb3ciJmd0OwotICAgICAgICAmbHQ7IS0tICAgICAgdXNlciBjYW4gYWRkIGhpcyBvd24gcGhhc2VzIHRvIHRoaXMgYXJlYSAgLS0mZ3Q7Ci0gICAgICAgICZsdDtwaGFzZSBuYW1lPSJPcGVyYXRpb25PdXRGYXVsdFBoYXNlIi8mZ3Q7Ci0gICAgICAgICZsdDtwaGFzZSBuYW1lPSJQb2xpY3lEZXRlcm1pbmF0aW9uIi8mZ3Q7Ci0gICAgICAgICZsdDtwaGFzZSBuYW1lPSJNZXNzYWdlT3V0Ii8mZ3Q7Ci0gICAgJmx0Oy9waGFzZU9yZGVyJmd0OzwvcHJlPgotPC9zb3VyY2U+Ci08cD48c3Ryb25nPnR5cGU6PC9zdHJvbmc+IHRoZSBhdHRyaWJ1dGUgcmVwcmVzZW50cyB0aGUgdHlwZSBvZiB0aGUgZmxvdy4gSXQKLWNhbiBvbmx5IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOjwvcD4KLTx1bD4KLSAgPGxpPkluRmxvdzwvbGk+Ci0gIDxsaT5PdXRGbG93PC9saT4KLSAgPGxpPkluRmF1bHRGbG93PC9saT4KLSAgPGxpPk91dEZhdWx0RmxvdzwvbGk+Ci08L3VsPgotCi08cD5JbiBhZGRpdGlvbiB0byB0aGF0LCB0aGUgb25seSBjaGlsZCBlbGVtZW50IHRoYXQgaXMgYWxsb3dlZCBpbnNpZGUKLSJwaGFzZU9yZGVyIiBpcyB0aGUgInBoYXNlIiBlbGVtZW50IHdoaWNoIHJlcHJlc2VudHMgdGhlIGF2YWlsYWJsZSBwaGFzZXMgaW4KLXRoZSBleGVjdXRpb24gY2hhaW4uIFRoZSBtZXRob2Qgb2Ygc3BlY2lmeWluZyBwaGFzZXMgaW5zaWRlICJwaGFzZU9yZGVyIiBpcwotYXMgZm9sbG93czo8L3A+PHNvdXJjZT4KLTxwcmU+ICZsdDtwaGFzZSBuYW1lPSJUcmFuc3BvcnQiLyZndDs8L3ByZT4KLTwvc291cmNlPgotPHA+PHN0cm9uZz5uYW1lOjwvc3Ryb25nPiBOYW1lIG9mIHRoZSBwaGFzZS4gPGJyLz4KLTwvcD4KLQotPHA+VGhlcmUgYXJlIGEgbnVtYmVyIG9mIHRoaW5ncyB0aGF0IG9uZSBoYXMgdG8ga2VlcCBpbiBtaW5kIHdoZW4gY2hhbmdpbmcgYQotcGhhc2VPcmRlcjo8L3A+Ci0KLTxwPkZvciB0aGUgcGhhc2VPcmRlciB0eXBlcyA8c3Ryb25nPiJJbkZsb3ciPC9zdHJvbmc+IGFuZAotPHN0cm9uZz4iSW5GYXVsdEZsb3ciPC9zdHJvbmc+PC9wPgotPHVsPgotICA8bGk+QWxsIHRoZSBwaGFzZXMgdGhhdCBhcmUgYWJvdmUgdGhlICJEaXNwYXRjaCIgcGhhc2UsIGluY2x1ZGluZyB0aGUKLSAgICAiRGlzcGF0Y2giIHBoYXNlLCBhcmUga25vd24gYXMgIkdsb2JhbCBwaGFzZXMiIC4gWW91IGNhbiBhZGQgYW55IG51bWJlcgotICAgIG9mIG5ldyBwaGFzZXMgaGVyZSBhbmQgdGhleSB3aWxsIGJlIGNvbnNpZGVyZWQgZ2xvYmFsLjwvbGk+Ci0gIDxsaT5JbiB0aGVzZSB0d28gcGhhc2VPcmRlciB0eXBlcywgdGhlIHBoYXNlcyBhZGRlZCBhZnRlciB0aGUgIkRpc3BhdGNoIgotICAgIHBoYXNlIGFyZSBrbm93biBhcyAiT3BlcmF0aW9uIHBoYXNlcyIuPC9saT4KLTwvdWw+Ci0KLTxwPkZvciB0aGUgcGhhc2VPcmRlciB0eXBlcyA8c3Ryb25nPiJPdXRGbG93Ijwvc3Ryb25nPiBhbmQKLTxzdHJvbmc+Ik91dEZhdWx0RmxvdyI8L3N0cm9uZz48L3A+Ci08dWw+Ci0gIDxsaT5BbGwgdGhlIHBoYXNlcyB0aGF0IGFyZSBiZWxvdyB0aGUgIk1lc3NhZ2VPdXQiIHBoYXNlLCBpbmNsdWRpbmcgdGhlCi0gICAgIk1lc3NhZ2VPdXQiIHBoYXNlLCBhcmUga25vd24gYXMgIkdsb2JhbCBwaGFzZXMiLiBZb3UgY2FuIGFkZCBuZXcgcGhhc2VzCi0gICAgYWNjb3JkaW5nIHRvIHlvdXIgcmVxdWlyZW1lbnQuPC9saT4KLSAgPGxpPlRoZSBwaGFzZXMgYWRkZWQgYmVmb3JlIHRoZSAiTWVzc2FnZU91dCIgcGhhc2UgYXJlIGtub3duIGFzICJPcGVyYXRpb24KLSAgICBwaGFzZXMiLjwvbGk+Ci0KLSAgPHA+PHN0cm9uZz5Ob3RlIDo8L3N0cm9uZz4gSWYgeW91IGxvb2sgY2xvc2VseSBhdCB0aGUgZGVmYXVsdCBheGlzMi54bWwsCi0gIHlvdSB3aWxsIGJlIGFibGUgdG8gY2xlYXJseSBpZGVudGlmeSBpdC48L3A+Ci08L3VsPgotPGEgbmFtZT0iUmVmZXJlbmNlcyI+PC9hPgotCi08aDM+TW9kdWxlIFJlZmVyZW5jZXM8L2gzPgotCi08cD5JZiB5b3Ugd2FudCB0byBlbmdhZ2UgYSBtb2R1bGUsIHN5c3RlbSB3aWRlLCB5b3UgY2FuIGRvIGl0IGJ5IGFkZGluZyBhIHRvcAotbGV2ZWwgbW9kdWxlIGVsZW1lbnQgaW4gYXhpczIueG1sLiBJdCBzaG91bGQgbG9vayBhcyBmb2xsb3dzOjwvcD48c291cmNlPgotPHByZT4mbHQ7bW9kdWxlIHJlZj0iYWRkcmVzc2luZyIvJmd0OyAgPC9wcmU+Ci08L3NvdXJjZT4KLTxwPjxzdHJvbmc+cmVmOjwvc3Ryb25nPiB0aGUgbW9kdWxlIG5hbWUgd2hpY2ggaXMgZ29pbmcgdG8gYmUgZW5nYWdlZCwgc3lzdGVtCi13aWRlLjwvcD4KLTxhIG5hbWU9Ikxpc3RlbmVycyI+PC9hPgotCi08aDM+PHN0cm9uZz5MaXN0ZW5lcnMgKE9ic2VydmVycyk8L3N0cm9uZz48L2gzPgotCi08cD5JbiBBeGlzMiwgQXhpc0NvbmZpZ3VyYXRpb24gaXMgb2JzZXJ2YWJsZSBzbyB0aGF0IHlvdSBjYW4gcmVnaXN0ZXIKLW9ic2VydmVycyBpbnRvIHRoYXQuIFRoZXkgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGluZm9ybWVkIHdoZW5ldmVyIGEgY2hhbmdlCi1vY2N1cnMgaW4gQXhpc0NvbmZpZ3VyYXRpb24uIEluIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uLCB0aGUgb2JzZXJ2ZXJzIGFyZQotaW5mb3JtZWQgb2YgdGhlIGZvbGxvd2luZyBldmVudHM6PC9wPgotPHVsPgotICA8bGk+RGVwbG95aW5nIGEgU2VydmljZTwvbGk+Ci0gIDxsaT5SZW1vdmluZyBhIHNlcnZpY2U8L2xpPgotICA8bGk+QWN0aXZhdGUvSW5hY3RpdmF0ZSBTZXJ2aWNlPC9saT4KLSAgPGxpPk1vZHVsZSBkZXBsb3k8L2xpPgotICA8bGk+TW9kdWxlIHJlbW92ZTwvbGk+Ci08L3VsPgotCi08cD5SZWdpc3RlcmluZyBPYnNlcnZlcnMgaXMgdmVyeSB1c2VmdWwgZm9yIGFkZGl0aW9uYWwgZmVhdHVyZXMgc3VjaCBhcyBSU1MKLWZlZWQgZ2VuZXJhdGlvbiwgd2hpY2ggd2lsbCBwcm92aWRlIHNlcnZpY2UgaW5mb3JtYXRpb24gdG8gc3Vic2NyaWJlcnMuIFRoZQotY29ycmVjdCB3YXkgb2YgcmVnaXN0ZXJpbmcgb2JzZXJ2ZXJzIHNob3VsZCBhcyBmb2xsb3dzOjwvcD48c291cmNlPgotPHByZT4mbHQ7bGlzdGVuZXIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuT2JzZXJ2ZXJJTVBMIiZndDsKLSAgICAmbHQ7cGFyYW1ldGVyIG5hbWU9IlJTU19VUkwiICZndDtodHRwOi8vMTI3LjAuMC4xL3JzcyZsdDsvcGFyYW1ldGVyJmd0OwotICAmbHQ7L2xpc3RlbmVyJmd0OzwvcHJlPgotPC9zb3VyY2U+Ci08cD48c3Ryb25nPmNsYXNzOjwvc3Ryb25nPiBSZXByZXNlbnRzIGFuIEltcGxlbWVudGF0aW9uIGNsYXNzIG9mIG9ic2VydmVyLAotYW5kIGl0IHNob3VsZCBiZSBub3RlZCB0aGF0IHRoZSBJbXBsZW1lbnRhdGlvbiBjbGFzcyBzaG91bGQgaW1wbGVtZW50Ci1BeGlzT2JzZXJ2ZXIgaW50ZXJmYWNlLCBhbmQgdGhlIGNsYXNzIGhhcyB0byBiZSBhdmFpbGFibGUgaW4gdGhlIGNsYXNzcGF0aC4KLTxhIG5hbWU9IlNlcnZpY2VfQ29uZmlndXJhdGlvbiI+PC9hPjwvcD4KLQotPGgyPjxmb250PlNlcnZpY2UgQ29uZmlndXJhdGlvbjwvZm9udD48L2gyPgotPHVsPgotICA8bGk+PGZvbnQ+V3JpdGluZyBzZXJ2aWNlcy54bWw8L2ZvbnQ+PC9saT4KLTwvdWw+Ci0KLTxwPjxmb250PlRoZSBkZXNjcmlwdGlvbiBvZiBzZXJ2aWNlcyBhcmUgc3BlY2lmaWVkIHVzaW5nIHNlcnZpY2VzLnhtbC4gRWFjaAotc2VydmljZSBhcmNoaXZlIGZpbGUgbmVlZHMgdG8gaGF2ZSBhIHNlcnZpY2VzLnhtbCBpbiBvcmRlciB0byBiZSBhIHZhbGlkCi1zZXJ2aWNlIGFuZCBpdCBzaG91bGQgYmUgYXZhaWxhYmxlIGluIHRoZSBNRVRBLUlORiBkaXJlY3Rvcnkgb2YgdGhlIGFyY2hpdmUKLWZpbGUuIEEgdmVyeSBzaW1wbGUgc2VydmljZXMueG1sIGlzIHNob3duIGJlbG93OjwvZm9udD48L3A+Ci08c291cmNlPjxwcmU+Jmx0O3NlcnZpY2UgbmFtZT0ibmFtZSBvZiB0aGUgc2VydmljZSIgc2NvcGU9Im5hbWUgb2YgdGhlIHNjb3BlIiBjbGFzcz0iZnVsbCBxdWFsaWZpZGUgbmFtZSB0aGUgc2VydmljZSBsaWZlY3ljbGUgY2xhc3MiICAgdGFyZ2V0TmFtZXNwYWNlPSJ0YXJnZXQgbmFtZXNwYXNlIGZvciB0aGUgc2VydmljZSImZ3Q7Ci0gICAgJmx0O0Rlc2NyaXB0aW9uJmd0OyBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIHNlcnZpY2UgICZsdDsvRGVzY3JpcHRpb24mZ3Q7ICAKLQotICAgICZsdDt0cmFuc3BvcnRzJmd0OyAKLSAgICAgICAmbHQ7dHJhbnNwb3J0Jmd0O0hUVFAmbHQ7L3RyYW5zcG9ydCZndDsKLSAgICAmbHQ7L3RyYW5zcG9ydHMmZ3Q7Ci0gICAgCi0gICAgJmx0O3NjaGVtYSBzY2hlbWFOYW1lc3BhY2U9InNjaGVtYSBuYW1lc3BhY2UiLyZndDsgCi0gICAgIAotICAgICZsdDttZXNzYWdlUmVjZWl2ZXJzJmd0OwotICAgICAgICAgICAgJmx0O21lc3NhZ2VSZWNlaXZlciBtZXA9Imh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgvd3NkbC9pbi1vdXQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJwYy5yZWNlaXZlcnMuUlBDTWVzc2FnZVJlY2VpdmVyIi8mZ3Q7Ci0gICAgJmx0Oy9tZXNzYWdlUmVjZWl2ZXJzJmd0OwotICAgICAKLSAgICAgJmx0O3BhcmFtZXRlciBuYW1lPSJTZXJ2aWNlQ2xhc3MiIGxvY2tlZD0ieHNkOmZhbHNlIiZndDtvcmcuYXBhY2hlLmF4aXMyLnNhbXBsZS5lY2hvLkVjaG9JbXBsJmx0Oy9wYXJhbWV0ZXImZ3Q7Ci0gICAgCi0gICAgJmx0O29wZXJhdGlvbiBuYW1lPSJlY2hvU3RyaW5nIiBtZXA9Im9wZXJhdGlvbiBNRVAiJmd0OyAKLSAgICAgICAgJmx0O2FjdGlvbk1hcHBpbmcmZ3Q7TWFwcGluZyB0byBhY3Rpb24mbHQ7L2FjdGlvbk1hcHBpbmcmZ3Q7Ci0gICAgICAgICZsdDttb2R1bGUgcmVmPSIgYSBtb2R1bGUgbmFtZSAiLyZndDsKLSAgICAgICAgJmx0O21lc3NhZ2VSZWNlaXZlciBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuUmF3WE1MSU5PdXRNZXNzYWdlUmVjZWl2ZXIiLyZndDsKLSAgICAmbHQ7L29wZXJhdGlvbiZndDsKLSAgJmx0Oy9zZXJ2aWNlJmd0OzwvcHJlPgotPC9zb3VyY2U+Ci08cD48c3Ryb25nPm5hbWU8L3N0cm9uZz46IFRoZSBzZXJ2aWNlIG5hbWUgd2lsbCBiZSB0aGUgbmFtZSBvZiB0aGUgYXJjaGl2ZQotZmlsZSBpZiB0aGUgLmFhciBmaWxlIGNvbnRhaW5zIG9ubHkgb25lIHNlcnZpY2UsIG9yIGVsc2UgdGhlIG5hbWUgb2YgdGhlCi1zZXJ2aWNlIHdpbGwgYmUgdGhlIG5hbWUgZ2l2ZW4gYnkgdGhlIG5hbWUgYXR0cmlidXRlLjwvcD4KLQotPHA+PHN0cm9uZz5zY29wZTwvc3Ryb25nPjogKE9wdGlvbmFsIEF0dHJpYnV0ZSkgVGhlIHRpbWUgcGVyaW9kIGR1cmluZyB3aGljaAotcnVudGltZSBpbmZvcm1hdGlvbiBvZiB0aGUgZGVwbG95ZWQgc2VydmljZXMgd2lsbCBiZSBhdmFpbGFibGUuIFNjb3BlIGlzIG9mCi1zZXZlcmFsIHR5cGVzLSAiYXBwbGljYXRpb24iLCAic29hcHNlc3Npb24iLCAidHJhbnNwb3J0c2Vzc2lvbiIsICJyZXF1ZXN0Ii4KLVRoZSBkZWZhdWx0IHZhbHVlIChpZiB5b3UgZG9uJ3QgZW50ZXIgYW55IHZhbHVlKSB3aWxsIGJlICJyZXF1ZXN0IjwvcD4KLQotPHA+PHN0cm9uZz5jbGFzczwvc3Ryb25nPjogKE9wdGlvbmFsIGF0dHJpYnV0ZSkgVGhlIGZ1bGwgcXVhbGlmaWVkIG5hbWUgb2YKLXRoZSBzZXJ2aWNlIGxpZmVjeWNsZSBpbXBsZW1lbnRhdGlvbiBjbGFzcy4gU2VydmljZUxpZmVDeWNsZSBjbGFzcyBpcyB1c2VmdWwKLXdoZW4geW91IHdhbnQgdG8gZG8gc29tZSB0YXNrcyB3aGVuIHRoZSBzeXN0ZW0gc3RhcnRzIGFuZCB3aGVuIGl0Ci1zaHV0cyBkb3duLjwvcD4KLQotPHA+PHN0cm9uZz50YXJnZXROYW1lc3BhY2U8L3N0cm9uZz46IChPcHRpb25hbCBBdHRyaWJ1dGUpIFRhcmdldCBuYW1lIHNwYWNlCi1vZiB0aGUgc2VydmljZS4gVGhpcyB2YWx1ZSB3aWxsIGJlIHVzZWQgd2hlbiBnZW5lcmF0aW5nIHRoZSBXU0RMLiBJZiB5b3UgZG8KLW5vdCBzcGVjaWZ5IHRoaXMgdmFsdWUsIHRoZSB2YWx1ZSB3aWxsIGJlIGNhbGN1bGF0ZWQgZnJvbSB0aGUgcGFja2FnZSBuYW1lIG9mCi10aGUgc2VydmljZSBpbXBsIGNsYXNzLjwvcD4KLQotPHA+PGZvbnQ+PHN0cm9uZz5EZXNjcmlwdGlvbjwvc3Ryb25nPjogKE9wdGlvbmFsKSBJZiB5b3Ugd2FudCB0byBkaXNwbGF5IGFueQotZGVzY3JpcHRpb24gYWJvdXQgdGhlIHNlcnZpY2UgdmlhIEF4aXMyIHdlYi1hZG1pbiBtb2R1bGUsIHRoZW4gdGhlCi1kZXNjcmlwdGlvbiBjYW4gYmUgc3BlY2lmaWVkIGhlcmUuPC9mb250PjwvcD4KLQotPHA+PHN0cm9uZz50cmFuc3BvcnRzPC9zdHJvbmc+IDogKE9wdGlvbmFsKSBUaGUgdHJhbnNwb3J0cyB0byB3aGljaCB0aGUKLXNlcnZpY2UgaXMgZ29pbmcgdG8gYmUgZXhwb3NlZC4gSWYgdGhlIHRyYW5zcG9ydCBlbGVtZW50IGlzIG5vdCBwcmVzZW50LCB0aGVuCi10aGUgc2VydmljZSB3aWxsIGJlIGV4cG9zZWQgaW4gYWxsIHRoZSB0cmFuc3BvcnRzIGF2YWlsYWJsZSBpbiB0aGUgc3lzdGVtLgotVGhlIHRyYW5zcG9ydCBjaGlsZCBlbGVtZW50IHNwZWNpZmllcyB0aGUgdHJhbnNwb3J0IHByZWZpeCAodGhlIG5hbWUgb2YgdGhlCi10cmFuc3BvcnQgc3BlY2lmaWVkIGluIGF4aXMyLnhtbCkuPC9wPgotCi08cD48Yj5wYXJhbWV0ZXJzOjwvYj4gQSBzZXJ2aWNlcy54bWwgY2FuIGhhdmUgYW55IG51bWJlciBvZiB0b3AgbGV2ZWwKLXBhcmFtZXRlcnMgYW5kIGFsbCB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMgd2lsbCBiZSB0cmFuc2Zvcm1lZCBpbnRvIHNlcnZpY2UKLXByb3BlcnRpZXMgaW4gdGhlIGNvcnJlc3BvbmRpbmcgQXhpc1NlcnZpY2UuIFRoZXJlIGlzIGEgY29tcHVsc29yeSBwYXJhbWV0ZXIKLWluIHNlcnZpY2VzLnhtbCBjYWxsZWQgU2VydmljZUNsYXNzIHRoYXQgc3BlY2lmaWVzIHRoZSBKYXZhIGNsYXNzLCB3aGljaAotcGVyZm9ybXMgdGhlIGFib3ZlIHRyYW5zZm9ybWF0aW9uLiBUaGlzIGNsYXNzIGlzIGxvYWRlZCBieSB0aGUKLU1lc3NhZ2VSZWNlaXZlci48L3A+Ci0KLTxwPjxiPm9wZXJhdGlvbnMgOjwvYj4gSWYgdGhlIHNlcnZpY2UgaW1wbCBjbGFzcyBpcyBKYXZhLCB0aGVuIGFsbCB0aGUgcHVibGljCi1tZXRob2RzIGluIHRoYXQgc2VydmljZSB3aWxsIGJlIGV4cG9zZWQuIElmIHRoZSB1c2VyIHdhbnRzIHRvIG92ZXJyaWRlIGl0LCBoZQotaGFzIHRvIGFkZCB0aGUgIm9wZXJhdGlvbiIgdGFnIGFuZCBvdmVycmlkZSBpdC4gSW4gYSBub24tSmF2YSBzY2VuYXJpbyBvciBpZgoteW91IGRvIG5vdCBoYXZlIGEgc2VydmljZSBjbGFzcywgdGhlbiBhbGwgdGhlIG9wZXJhdGlvbnMgdGhlIHVzZXIgd2FudHMgdG8KLWV4cG9zZSBieSB0aGUgc2VydmljZSBoYXMgdG8gYmUgaW5kaWNhdGVkIGluIHRoZSBzZXJ2aWNlcy54bWwuIEl0IGlzCi1zcGVjaWZpZWQgYXMgZm9sbG93czo8L3A+ICA8c291cmNlPgotPHByZT4gICAgJmx0O29wZXJhdGlvbiBuYW1lPSJlY2hvU3RyaW5nIiZndDsKLSAgICAgICAgJmx0O21vZHVsZSByZWY9IiBhIG1vZHVsZSBuYW1lICIvJmd0OwotICAgICAgICAmbHQ7bWVzc2FnZVJlY2VpdmVyIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5SYXdYTUxJTk91dE1lc3NhZ2VSZWNlaXZlciIvJmd0OwotICAgICZsdDsvb3BlcmF0aW9uJmd0OzwvcHJlPgotPC9zb3VyY2U+Ci08cD5UaGUgb25seSBjb21wdWxzb3J5IGF0dHJpYnV0ZSBoZXJlIGlzICJuYW1lIiwgd2hpY2ggcmVwcmVzZW50cyB0aGUKLW9wZXJhdGlvbiBuYW1lIHRoYXQgaXMgZ29pbmcgdG8gYmUgZXhwb3NlZC4gQW55IG9wZXJhdGlvbiBjYW4gY29udGFpbiBtb2R1bGUKLXJlZmVyZW5jZXMgYXMgd2VsbCBhcyBhbnkgbnVtYmVyIG9mIHBhcmFtZXRlcnMuIFRoZSBtb3N0IGludGVyZXN0aW5nIHRoaW5nIGlzCi10aGF0IHlvdSBjYW4gcmVnaXN0ZXIgY3VzdG9tIG1lc3NhZ2UgcmVjZWl2ZXJzIHBlciBvcGVyYXRpb24uIFRoZW4gdGhlCi1yZWdpc3RlcmVkIG1lc3NhZ2UgcmVjZWl2ZXIgd2lsbCBiZSB0aGUgbWVzc2FnZSByZWNlaXZlciBmb3IgdGhlCi1jb3JyZXNwb25kaW5nIG9wZXJhdGlvbi4gSWYgeW91IGRvIG5vdCBzcGVjaWZ5IHRoZSBtZXNzYWdlIHJlY2VpdmVyLCB0aGVuIHRoZQotZGVmYXVsdCBtZXNzYWdlIHJlY2VpdmVyIHdpbGwgcGVyZm9ybSB0aGUgb3BlcmF0aW9uLiA8YnIvPgotPGEgbmFtZT0iTW9kdWxlX0NvbmZpZ3VyYXRpb24iPjwvYT48L3A+Ci0KLTxoMj5Nb2R1bGUgQ29uZmlndXJhdGlvbjwvaDI+Ci08dWw+Ci0gIDxsaT5Xcml0aW5nIG1vZHVsZS54bWw8L2xpPgotPC91bD4KLQotPHA+VGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBtb2R1bGUgaXMgc3BlY2lmaWVkIHVzaW5nIHRoZSBtb2R1bGUueG1sLiBFYWNoCi1tb2R1bGUgYXJjaGl2ZSBmaWxlIG5lZWRzIHRvIGhhdmUgYSBtb2R1bGUueG1sIGluIG9yZGVyIHRvIGJlIGEgdmFsaWQgbW9kdWxlLAotYW5kIGl0IHNob3VsZCBiZSBhdmFpbGFibGUgaW4gdGhlIE1FVEEtSU5GIGRpcmVjdG9yeSBvZiB0aGUgYXJjaGl2ZSBmaWxlLiA8YnIvPgotPC9wPgotCi08cD5BIHZlcnkgc2ltcGxlIG1vZHVsZS54bWwgaXMgc2hvd24gYmVsb3c6PC9wPiA8c291cmNlPgotPHByZT4mbHQ7bW9kdWxlIGNsYXNzPSJvcmcuYXBhY2hlLm1vZHVsZS5Nb2R1bGUxSW1wbCImZ3Q7Ci0gICAgJmx0O0luRmxvdyZndDsKLSAgICAgICAgLgotICAgICAgICAuCi0gICAgJmx0Oy9JbkZsb3cmZ3Q7Ci0gICAgJmx0O091dEZsb3cmZ3Q7Ci0gICAgICAgIC4KLSAgICAgICAgLgotICAgICZsdDsvT3V0RmxvdyZndDsKLQotICAgICZsdDtPdXRGYXVsdEZsb3cmZ3Q7Ci0gICAgICAgIC4gICAKLSAgICAgICAgLgotICAgICZsdDsvT3V0RmF1bHRGbG93Jmd0OwotCi0gICAgJmx0O0luRmF1bHRGbG93Jmd0OwotICAgICAgICAuICAgICAgICAgCi0gICAgICAgIC4KLSAgICAmbHQ7L0luRmF1bHRGbG93Jmd0OwotCi0gICAgJmx0O29wZXJhdGlvbiBuYW1lPSJjcmVhdFNlcSIgbWVwPSJNRVBfVVJJX0lOX09VVCImZ3Q7Ci0gICAgICAgICZsdDttZXNzYWdlUmVjZWl2ZXIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLlJhd1hNTElOT3V0TWVzc2FnZVJlY2VpdmVyIi8mZ3Q7Ci0gICAgICAgICZsdDtwYXJhbWV0ZXIgbmFtZT0icGFyYTEiIGxvY2tlZD0ieHNkOnRydWUiJmd0OzEwJmx0Oy9wYXJhbWV0ZXImZ3Q7Ci0gICAgJmx0Oy9vcGVyYXRpb24mZ3Q7Ci0mbHQ7L21vZHVsZSZndDs8L3ByZT4KLTwvc291cmNlPgotPHA+PHN0cm9uZz5jbGFzczo8L3N0cm9uZz4gKE9wdGlvbmFsIGF0dHJpYnV0ZSkgSW5kaWNhdGVzIHRoZSBtb2R1bGUKLWltcGxlbWVudGF0aW9uIGNsYXNzLiBBIG1vZHVsZSBtYXkgb3IgbWF5IG5vdCBjb250YWluIGEgbW9kdWxlIGltcGxlbWVudGF0aW9uCi1jbGFzcyBzaW5jZSB0aGUgbW9kdWxlIGNhbiBhbHNvIGJlIGEgY29sbGVjdGlvbiBvZiBoYW5kbGVycy4gSWYgYSBtb2R1bGUKLWNvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUKLW9yZy5hcGFjaGUuYXhpczIubW9kdWxlcy5Nb2R1bGUgaW50ZXJmYWNlIGF0IGRlcGxveW1lbnQsIGl0cwotPGNvZGU+aW5pdCgpOzwvY29kZT4gbWV0aG9kIHdpbGwgYmUgY2FsbGVkLjwvcD4KLQotPHA+PGI+cGFyYW1ldGVyOjwvYj4gQSBtb2R1bGUgY2FuIGNvbnRhaW4gYW55IG51bWJlciBvZiBwYXJhbWV0ZXJzIGFuZCBhbGwKLXRoZSBsaXN0ZWQgcGFyYW1ldGVycyBpbiB0aGUgbW9kdWxlLnhtbCB3aWxsIGJlIHRyYW5zZm9ybWVkIGludG8gdGhlCi1jb3JyZXNwb25kaW5nIEF4aXNNb2R1bGUgb2YgdGhlIG1vZHVsZS48L3A+Ci0KLTxwPjxiPmZsb3c6IDwvYj5EZWZpbmluZyBvZiBoYW5kbGVycyBpbiBhIG1vZHVsZSBoYXMgdG8gYmUgZG9uZSBpbnNpZGUgZmxvd3MuCi1UaGVyZSBhcmUgZm91ciB0eXBlcyBvZiBmbG93cyBhcyBsaXN0ZWQgYmVsb3cuPC9wPgotCi08cD5Zb3UgY2FuIGFkZCBhbnkgbnVtYmVyIG9mIGhhbmRsZXJzIGludG8gYSBmbG93LCBhbmQgdGhvc2UgaGFuZGxlcnMgd2lsbCBiZQotYXZhaWxhYmxlIGluIHRoZSBjb3JyZXNwb25kaW5nIGNoYWlucyBhdCBydW50aW1lLCB3aGVuIHRoZXkgYXJlIGVuZ2FnZWQuPC9wPgotPHVsPgotICA8bGk+SW5GbG93PC9saT4KLSAgPGxpPk91dEZsb3c8L2xpPgotICA8bGk+SW5GYXVsdEZsb3c8L2xpPgotICA8bGk+T3V0RmF1bHRGbG93PC9saT4KLTwvdWw+Ci0KLTxwPjxiPm9wZXJhdGlvbnM6IDwvYj4gSWYgYSBtb2R1bGUgd2FudHMgdG8gYWRkIGFuIG9wZXJhdGlvbiB3aGVuIGl0IGlzCi1lbmdhZ2VkIGludG8gYSBzZXJ2aWNlLCBpdCBjYW4gYmUgZG9uZSBieSBhZGRpbmcgYW4gb3BlcmF0aW9uIHRhZyBpbgotbW9kdWxlLnhtbC4gVGhlIG1ldGhvZCBvZiBzcGVjaWZ5aW5nIHRoZSBvcGVyYXRpb24gaXMgdGhlIHNhbWUgYXMgb3BlcmF0aW9uCi1pbiBzZXJ2aWNlcy54bWwuPC9wPgotCi08cD48Yj5oYW5kbGVyOjwvYj4gVGhlIEhhbmRsZXIgZWxlbWVudCBjb25zaXN0cyBvZiBjb21wdWxzb3J5IGFuZCBvcHRpb25hbAotYXR0cmlidXRlcy4gVGhlIG1ldGhvZCBvZiBkZWZpbmluZyBhIGhhbmRsZXIgd2lsbCBsb29rIGFzIGZvbGxvd3M6PC9wPiA8c291cmNlPgotPHByZT4mbHQ7aGFuZGxlciBuYW1lPSJoYW5kbGVyMSIgY2xhc3M9ImhhbmRsZXJDbGFzcyAiJmd0OwotICAgICAgICAgICAgJmx0O29yZGVyIHBoYXNlPSJ1c2VycGhhc2UxIiAvJmd0OwotICZsdDsvaGFuZGxlciZndDs8L3ByZT4KLTwvc291cmNlPgotPHA+PGI+PGk+Q29tcHVsc29yeSBBdHRyaWJ1dGVzPC9pPjwvYj4gPGJyLz4KLTxiPm5hbWU6PC9iPiBOYW1lIG9mIHRoZSBoYW5kbGVyLjxici8+Ci08Yj5jbGFzczo8L2I+IEhhbmRsZXIgaW1wbGVtZW50YXRpb24gY2xhc3MuPGJyLz4KLTxiPnBoYXNlOjwvYj4gTmFtZSBvZiB0aGUgcGhhc2UgdGhhdCB0aGUgaGFuZGxlciBzaG91bGQgcmVtYWluLCBpbiB0aGUKLWV4ZWN1dGlvbiBjaGFpbi4gPGJyLz4KLTxici8+Ci08aT48Yj5PcHRpb25hbCBBdHRyaWJ1dGVzIDo8L2I+PC9pPjxici8+Ci08Yj5waGFzZUxhc3Q6PC9iPiBJbmRpY2F0ZXMgdGhhdCB0aGUgaGFuZGxlciBpcyB0aGUgbGFzdCBoYW5kbGVyIG9mIHRoZQotcGhhc2UuPGJyLz4KLTxiPnBoYXNlRmlyc3Q6PC9iPiBJbmRpY2F0ZSB0aGF0IHRoZSBoYW5kbGVyIGlzIHRoZSBmaXJzdCBoYW5kbGVyIG9mIHRoZQotcGhhc2UuPGJyLz4KLTxiPmJlZm9yZSA6PC9iPiBJbmRpY2F0ZXMgdGhhdCB0aGUgY3VycmVudCBoYW5kbGVyIHNob3VsZCBiZSBpbnZva2VkIGJlZm9yZQotdGhlIGhhbmRsZXIgc3BlY2lmaWVkIGJ5IHRoZSBiZWZvcmUgaGFuZGxlcjxici8+Ci08Yj5hZnRlcjo8L2I+IEluZGljYXRlcyB0aGF0IHRoZSBjdXJyZW50IGhhbmRsZXIgc2hvdWxkIGJlIGludm9rZWQgYWZ0ZXIgdGhlCi1oYW5kbGVyIHNwZWNpZmllZCBieSB0aGUgYWZ0ZXIgaGFuZGxlcjxici8+Ci08L3A+Ci0KLTxwPjxici8+Ci08L3A+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvY2x1c3RlcmluZy1ndWlkZS54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvY2x1c3RlcmluZy1ndWlkZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3MTVhMjAuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2NsdXN0ZXJpbmctZ3VpZGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjk0ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0iIiAvPgotPHRpdGxlPkF4aXMyIENsdXN0ZXJpbmcgU3VwcG9ydDwvdGl0bGU+Ci08bGluayBocmVmPSIuLi9jc3MvYXhpcy1kb2NzLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIKLW1lZGlhPSJhbGwiIC8+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJlbiIgeG1sOmxhbmc9ImVuIj4KLQotPCEtLSBJbnRyb2R1Y3Rpb24gUGFyYSAtLT4KLTxoMT5BeGlzMiBDbHVzdGVyaW5nIFN1cHBvcnQ8L2gxPgotPHA+QXJlIHlvdSBpbnRlcmVzdGVkIGluIGltcHJvdmluZyBTY2FsYWJpbGl0eSBhbmQgSGlnaCBBdmFpbGFiaWxpdHkgb2YgeW91ciBXZWIgU2VydmljZXM/PC9wPgotPHA+QXhpczIgMS40IHByb3ZpZGVzIGV4cGVyaW1lbnRhbCBjbHVzdGVyaW5nIHN1cHBvcnQgdG8gYWRkIDxiPjxpPlNjYWxhYmlsaXR5LCBGYWlsb3ZlciBhbmQgSGlnaCBBdmFpbGFiaWxpdHk8L2k+PC9iPiB0byB5b3VyIFdlYiBTZXJ2aWNlcy4KLVRoaXMgZ3VpZGUgd2lsbCBleHBsYWluIHRoZSBleHRlbnQgb2YgY2x1c3RlcmluZyBzdXBwb3J0IGFuZCBpdCdzIHRoZSBjdXJyZW50IGxpbWl0YXRpb25zLgotSXQgYWxzbyBoaWdobGlnaHRzIHRoZSByZWNvbW1lbmRlZCBhcHByb2FjaGVzIHVzaW5nIGV4YW1wbGVzLjwvcD4KLTxwPkF4aXMyIGNsdXN0ZXJpbmcgc3VwcG9ydCBjYW4gYmUgdXNlZCBpbiBzZXZlcmFsIHNjZW5hcmlvcy4KLUhvd2V2ZXIgaXQgaXMgaW1wb3J0YW50IHRvIHVuZGVyc3RhbmQgdGhlIGN1cnJlbnQgbGltaXRhdGlvbnMgYW5kIHRoZSByaXNrcy9pbXBhY3RzIGFzc29jaWF0ZWQgd2l0aCBlYWNoIHNjZW5hcmlvLgotPC9wPgotCi08IS0tIENvbnRlbnQgbWVudSAtLT4KLTxoMj5Db250ZW50PC9oMj4KLTx1bD4KLTxsaT48YSBocmVmPSIjaW50cm9kdWN0aW9uIj5JbnRyb2R1Y3Rpb248L2E+PC9saT4KLTxsaT48YSBocmVmPSIjc2NhbGFiaWxpdHkiPlNjYWxhYmlsaXR5PC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iI2ZhaWxvdmVyIj5GYWlsb3ZlcjwvYT48L2xpPgotPGxpPjxhIGhyZWY9IiNoYSI+SGlnaCBBdmFpbGFiaWxpdHk8L2E+PC9saT4KLTxsaT48YSBocmVmPSIjc3RhdGVsZXNzX3dlYnNlcnZpY2VzIj5DbHVzdGVyaW5nIGZvciBTdGF0ZWxlc3MgV2ViIFNlcnZpY2VzPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iI3N0YXRlZnVsIFdlYiBTZXJ2aWNlcyI+Q2x1c3RlcmluZyBmb3IgU3RhdGVmdWwgV2ViIFNlcnZpY2VzPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iI2NvbmZpZyI+Q29uZmlndXJpbmcgQXhpczIgdG8gYWRkIENsdXN0ZXJpbmcgU3VwcG9ydDwvYT48L2xpPgotCi08bGk+PGEgaHJlZj0iI3NjYWxhYmlsaXR5X3N0YXRlbGVzc19leGFtcGxlIj5FeGFtcGxlIDE6IFNjYWxhYmlsaXR5IGFuZCBIQSB3aXRoIFN0YXRlbGVzcyBXZWIgU2VydmljZXM8L2E+PC9saT4KLTxsaT48YSBocmVmPSIjZmFpbG92ZXJfc3RhdGVmdWxfZXhhbXBsZSI+RXhhbXBsZSAyOiBGYWlsb3ZlciBmb3IgU3RhdGVmdWwgV2ViIFNlcnZpY2VzPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iI3NjYWxhYmlsaXR5X3N0YXRlZnVsX2V4YW1wbGUiPkV4YW1wbGUgMzogU2NhbGFiaWxpdHkgYW5kIEhBIHdpdGggU3RhdGVmdWwgV2ViIFNlcnZpY2VzPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iI3N1bW1hcnkiPlN1bW1hcnk8L2E+PC9saT4KLTxsaT48YSBocmVmPSIjZnVydGhlcnN0dWR5Ij5Gb3IgRnVydGhlciBTdHVkeTwvYT48L2xpPgotPC91bD4KLQotPCEtLSBJbnRybyAtLT4KLTxhIG5hbWU9ImludHJvZHVjdGlvbiIgaWQ9ImludHJvZHVjdGlvbiI+PC9hPgotPGgyPkludHJvZHVjdGlvbjwvaDI+Ci08cD5JbiB0aGUgY29udGV4dCBvZiBBeGlzMiBjbHVzdGVyaW5nLCBhIG5vZGUgaXMgZGVmaW5lZCBhcyBhIHNlcGFyYXRlIHByb2Nlc3Mgd2l0aCBhIHVuaXF1ZSBwb3J0IG51bWJlciB3aGVyZSBpdCBsaXN0ZW5zIGZvciByZXF1ZXN0cyBvbiBhIGdpdmVuIHRyYW5zcG9ydCAuIEEgcGh5c2ljYWwgbWFjaGluZSBjYW4gY29udGFpbiBtb3JlIHRoYW4gb25lIG5vZGUuPC9wPgotCi08IS0tIFNjYWxhYmlsaXR5IC0tPgotPGEgbmFtZT0ic2NhbGFiaWxpdHkiIGlkPSJzY2FsYWJpbGl0eSI+PC9hPgotPGgyPlNjYWxhYmlsaXR5PC9oMj4KLTxwPkluIG9yZGVyIHRvIG1haW50YWluIHRoZSBzYW1lIGxldmVsIG9mIHNlcnZpY2VhYmlsaXR5IChRb1MpIGR1cmluZyBhbiBpbmNyZWFzZSBpbiBsb2FkIHlvdSBuZWVkIHRoZSBhYmlsaXR5IHRvIHNjYWxlLgotQXhpczIgcHJvdmlkZXMgcmVwbGljYXRpb24gc3VwcG9ydCB0byBzY2FsZSBob3Jpem9udGFsbHkuIFRoYXQgaXMsIHlvdSBjYW4gZGVwbG95IHRoZSBzYW1lIHNlcnZpY2UgaW4gbW9yZSB0aGFuIG9uZSBub2RlIHRvIHNoYXJlIHRoZSB3b3JrIGxvYWQsIHRoZXJlYnkgaW5jcmVhc2luZyBvciBtYWludGFpbmluZyB0aGUgc2FtZSBsZXZlbCBvZiBzZXJ2aWNlYWJpbGl0eSAodGhyb3VnaHB1dCBldGMpLjwvcD4KLQotPCEtLSBGYWlsb3ZlciAtLT4KLTxhIG5hbWU9ImZhaWxvdmVyIiBpZD0iZmFpbG92ZXIiPjwvYT4KLTxoMj5GYWlsb3ZlcjwvaDI+Ci08cD5BeGlzMiBwcm92aWRlcyBleGNlbGxlbnQgc3VwcG9ydCBmb3IgRmFpbG92ZXIgYnkgcmVwbGljYXRpbmcgdG8gYmFja3VwIG5vZGUocykuIAotSWYgeW91IGRlcGxveSB5b3VyIFN0YXRlZnVsIFdlYiBTZXJ2aWNlcyBpbiB0aGlzIG1vZGUsIHlvdSBjYW4gZGVzaWduYXRlIDEtMiBiYWNrdXBzIGFuZCByZXBsaWNhdGUgc3RhdGUuIAotSW4gdGhlIGV2ZW50IHRoZSBwcmltYXJ5IG5vZGUgZmFpbHMsIHRoZSBjbGllbnRzIGNhbiBzd2l0Y2ggdG8gb25lIG9mIHRoZSBiYWNrdXBzLiAKLUlmIHlvdSB1c2UgU3luYXBzZSB3aXRoIHRoZSBGYWlsb3ZlciBtZWRpYXRvciB5b3UgY2FuIHByb3ZpZGUgdHJhbnNwYXJlbnQgRmFpbG92ZXIuPC9wPgotCi08IS0tIEhBIC0tPgotPGEgbmFtZT0iaGEiIGlkPSJoYSI+PC9hPgotPGgyPkhpZ2ggQXZhaWxhYmlsaXR5PC9oMj4KLTxwPllvdSBjYW4gaW1wcm92ZSB0aGUgYXZhaWxhYmlsaXR5IG9mIHlvdXIgV2ViIFNlcnZpY2UgYnkgdXNpbmcgdGhlIGZvbGxvd2luZyBBeGlzMiBmdW5jdGlvbmFsaXR5LiAKLTx1bD4KLTxsaT48Yj5GYWlsb3ZlcjwvYj4gc3VwcG9ydCB3aWxsIGVuc3VyZSB0aGF0IGEgY2xpZW50IHdpbGwgY29udGludWVkIGJlIHNlcnZlZCwgd2l0aG91dCBhbnkgaW50ZXJydXB0aW9uIGR1ZSB0byBhIG5vZGUgZmFpbHVyZS48L2xpPgotPGxpPjxiPlNjYWxhYmlsaXR5PC9iPiBzdXBwb3J0IHdpbGwgZW5zdXJlIHRoYXQgeW91ciBzZXJ2aWNlcyBjYW4gbWFpbnRhaW4gdGhlIHNhbWUgbGV2ZWwgb2Ygc2VydmljZWFiaWxpdHkvYXZhaWxhYmlsaXR5IChRb1MpIGluIGluY3JlYXNlZCBsb2FkIGNvbmRpdGlvbnMuPC9saT4KLTxsaT48Yj5Ib3QgRGVwbG95PC9iPiBmZWF0dXJlIGVuc3VyZXMgdGhhdCB5b3UgY291bGQgZGVwbG95IG5ldyBzZXJ2aWNlcyB3aXRob3V0IHNodXR0aW5nIGRvd24geW91ciBleGlzdGluZyBzZXJ2aWNlcy48L2xpPgotPC91bD4KLTwvcD4KLQotPCEtLSBTdGF0ZWxlc3MgV2ViIFNlcnZpY2VzIC0tPgotPGEgbmFtZT0ic3RhdGVsZXNzX3dlYnNlcnZpY2VzIiBpZD0ic3RhdGVsZXNzX3dlYnNlcnZpY2VzIj48L2E+Ci08aDI+Q2x1c3RlcmluZyBmb3IgU3RhdGVsZXNzIFdlYiBTZXJ2aWNlczwvaDI+Ci08cD5UaGlzIGlzIHRoZSBzaW1wbGVzdCB1c2UgY2FzZS4gCi1JZiB5b3VyIFdlYiBTZXJ2aWNlIGRvZXMgbm90IHN0b3JlIGFueSBzdGF0ZSBpbiB0aGUgY29udGV4dCBoaWVyYXJjaHkgdGhlbiB5b3UgY291bGQgZGVwbG95IHlvdXIgc2VydmljZSBpbiAibiIgbnVtYmVyIG9mIG5vZGVzLiBUbyBlbnN1cmUgaWRlbnRpY2FsIGNvbmZpZ3VyYXRpb24gZm9yIHlvdXIgc2VydmljZXMsIHlvdSBjYW4gbG9hZCBmcm9tIGEgY2VudHJhbCByZXBvc2l0b3J5IHVzaW5nIHRoZSBVUkxCYXNlZEF4aXNDb25maWd1cmF0b3IuIFRoaXMgaXMgbm90IGEgbXVzdCwgYnV0IGl0IG1ha2VzIG1hbmFnZW1lbnQgb2YgdGhlIGNsdXN0ZXIgZWFzeSBhbmQgbGVzcyBlcnJvciBwcm9uZS48L3A+Ci0KLTxwPlNpbmNlIGl0IGlzIHN0YXRlbGVzcyBubyBleHBsaWNpdCByZXBsaWNhdGlvbiBpcyBuZWVkZWQuIElmIGEgbm9kZSBmYWlscyBhbnkgb3RoZXIgbm9kZSBpbiB0aGUgY2x1c3RlciBjYW4gdGFrZSBvdmVyLiBZb3UgY2FuIHVzZSBhIGxvYWQgYmFsYW5jZXIgdG8gZGlyZWN0IHJlcXVlc3RzIGJhc2VkIG9uIGEgcGFydGljdWxhciBhbGdvcml0aG0gKEV4OiBSb3VuZCBSb2JpbiwgV2VpZ2h0IGJhc2VkLCBBZmZpbml0eSBiYXNlZCkuIFlvdSBjYW4gaW5jcmVhc2UgdGhlIG5vIG9mIG5vZGVzIHRvIGhhbmRsZSBzY2FsYWJpbGl0eSAodG8gc2NhbGUgdmVydGljYWxseSkgd2l0aG91dCB3b3JyeWluZyBhYm91dCB0aGUgb3ZlcmhlYWQgb2YgcmVwbGljYXRpb24gYXMgdGhlIHNlcnZpY2VzIGFyZSBzdGF0ZWxlc3M8L3A+Ci0KLTwhLS0gU3RhdGVmdWwgV2ViIFNlcnZpY2VzIC0tPgotPGEgbmFtZT0ic3RhdGVmdWxfd2Vic2VydmljZXMiIGlkPSJzdGF0ZWZ1bF93ZWJzZXJ2aWNlcyI+PC9hPgotPGgyPkNsdXN0ZXJpbmcgZm9yIFN0YXRlZnVsIFdlYiBTZXJ2aWNlczwvaDI+Ci08cD5UaGlzIGlzIGEgbW9yZSBjb21wbGljYXRlZCB1c2UgY2FzZSB3aGVyZSB5b3VyIFdlYiBTZXJ2aWNlIG5lZWRzIHRvIHN0b3JlIHN0YXRlIGluIHRoZSBjb250ZXh0IGhpZXJhcmNoeS4gRWFjaCBXZWIgU2VydmljZSBpbnN0YW5jZSAoZGVwbG95ZWQgaW4gc2VwYXJhdGUgbm9kZXMpIHdpbGwgbmVlZCB0byBzaGFyZSBzdGF0ZSBhbW9uZyB0aGVtc2VsdmVzLiBBeGlzMiBwcm92aWRlcyByZXBsaWNhdGlvbiB0byBzdXBwb3J0IHNoYXJpbmcgb2Ygc3RhdGUgYW1vbmcgc2VydmljZXMuPC9wPgotCi08cD5Ib3dldmVyLCBpZiBtb3JlIHRoYW4gb25lIG5vZGUgdHJpZXMgdG8gdXBkYXRlIHRoZSBzYW1lIHN0YXRlIGluIHRoZSBjb250ZXh0IGhpZXJhcmNoeSwgY29uZmxpY3RzIHdpbGwgYXJpc2UgYW5kIHRoZSBpbnRlZ3JpdHkgb2YgeW91ciBkYXRhIHdpbGwgYmUgY29tcHJvbWlzZWQuIE5vdyB5b3VyIGNsdXN0ZXIgd2lsbCBoYXZlIGluY29uc2lzdGVudCBzdGF0ZS4gVGhpcyBjYW4gYmUgYXZvaWRlZCB1c2luZyBhIGxvY2tpbmcgbWVjaGFuaXNtLiBIb3dldmVyIEF4aXMyIGN1cnJlbnRseSBkb2VzIG5vdCBzdXBwb3J0IGl0IHlldC48L3A+Ci0KLTxwPklmIHRoaXMgc2hhcmVkIHN0YXRlIGlzIHJlYWQgbW9yZSBmcmVxdWVudGx5IGFuZCB1cGRhdGVkIHJhcmVseSB0aGUgcHJvYmFiaWxpdHkgb2YgY29uZmxpY3RzIGRlY3JlYXNlLiBZb3UgbWF5IHVzZSBBeGlzMiBpbiB0aGUgYWJvdmUgdXNlIGNhc2UgZm9yIFN0YXRlZnVsIFdlYiBTZXJ2aWNlcyBiYXNlZCBvbiB5b3VyIGRpc2NyZXRpb24uIEhvd2V2ZXIgaXQncyBpbXBvcnRhbnQgdG8gcmVtZW1iZXIgdGhhdCB0aGVyZSBjYW4gYmUgY29uZmxpY3RzLjxpPjxiPklmIHlvdSBoYXZlIGZyZXF1ZW50IHdyaXRlcyBpdCBpcyBub3QgYWR2aXNhYmxlIHRvIHVzZSBBeGlzMiB1bnRpbCB3ZSBpbnRyb2R1Y2UgbG9ja2luZyBzdXBwb3J0PC9iPjwvaT48L3A+Ci0KLTxwPlBsZWFzZSBub3RlIHRoaXMgd2FybmluZyBpcyBvbmx5IGFwcGxpY2FibGUgdG8gdGhlIGZvbGxvd2luZyB1c2UgY2FzZXMuCi08dWw+Ci08bGk+WW91ciBTZXJ2aWNlIGlzIGRlcGxveWVkIGluIEFwcGxpY2F0aW9uIFNjb3BlPC9saT4KLTxsaT5Zb3Ugc3RvcmUgaW5mb3JtYXRpb24gaW4gdGhlIFNlcnZpY2VHcm91cENvbnRleHQgKGlycmVzcGVjdGl2ZSBvZiB5b3VyIHNjb3BlKTwvbGk+Ci08L3VsPgotPC9wPgotCi08cD5Zb3UgbWF5IHNhZmVseSB1c2Ugc2VydmljZXMgaW4gInNvYXBzZXNzaW9uIiBzY29wZSBwcm92aWRlZCB5b3UgPGk+PGI+ZG9uJ3QgbW9kaWZ5IChvciBtb2RpZnkgYXQgYWxsKSBzdGF0ZSBpbiBTZXJ2aWNlR3JvdXBDb250ZXh0IGZyZXF1ZW50bHk8L2I+PC9pPi4gSW4gc29hcC1zZXNzaW9uIHRoZSBzZXJ2aWNlIGNvbnRleHQgaXMgZXhjbHVzaXZlIHRvIHRoZSBjbGllbnQgd2hvIG93bnMgdGhlIHNlc3Npb24uIFRoZXJlZm9yZSBvbmx5IHRoYXQgY2xpZW50IGNhbiBtb2RpZnkgc3RhdGUuIEEgY29uZmxpY3QgbWlnaHQgYXJpc2UgaWYgdGhlIHNhbWUgY2xpZW50IHRyaWVzIHRvIGFjY2VzcyB0aGUgc2FtZSBzZXJ2aWNlIGluIHR3byBkaWZmZXJlbnQgbm9kZXMgc2ltdWx0YW5lb3VzbHkgd2hpY2ggaGFwcGVucyB0byBtb2RpZnkgdGhlIHNhbWUgc3RhdGUuIEhvd2V2ZXIgdGhpcyBpcyByYXJlLCBidXQgbWlnaHQgYXJpc2UgZHVlIHRvIGFuIGVycm9yIGluIHRoZSBsb2FkIGJhbGFuY2VyIG9yIHRoZSBjbGllbnQuIElmIHlvdSB1c2UgU3RpY2t5IHNlc3Npb25zLCBpdCB3aWxsIGVuc3VyZSB0aGF0IHN0YXRlIHdpbGwgYmUgY2hhbmdlZCBpbiBvbmUgbm9kZSBvbmx5IGJ5IGRpcmVjdGluZyBhbGwgcmVxdWVzdHMgYnkgdGhlIHNhbWUgY2xpZW50IHRvIHRoZSBzYW1lIG5vZGUuIFRoaXMgaXMgdGhlIHNhZmVzdCB3YXkgdG8gdXNlIEF4aXMyIGNsdXN0ZXJpbmcgc3VwcG9ydCBmb3IgU3RhdGVmdWwgV2ViIFNlcnZpY2VzIHRvIGFjaGVpdmUgc2NhbGFiaWxpdHkuCi08L3A+Ci0KLTwhLS0gQ29uZmlndXJpbmcgQXhpczIgdG8gYWRkIENsdXN0ZXJpbmcgc3VwcG9ydCAtLT4KLQotPGEgbmFtZT0iY29uZmlnIiBpZD0iY29uZmlnIj48L2E+Ci08aDI+Q29uZmlndXJpbmcgQXhpczIgdG8gYWRkIENsdXN0ZXJpbmcgU3VwcG9ydDwvaDI+Ci08cD5Zb3UgbmVlZCB0byBhZGQgdGhlIGZvbGxvd2luZyBzbmlwcGV0IHRvIHlvdXIgYXhpczIueG1sPC9wPgotPHByZT4KLSAgICZsdDtjbHVzdGVyIGNsYXNzPSZxdW90O29yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy50cmliZXMuVHJpYmVzQ2x1c3Rlck1hbmFnZXImcXVvdDsmZ3Q7Ci0gICAgICZsdDtjb250ZXh0TWFuYWdlciBjbGFzcz0mcXVvdDtvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuY29udGV4dC5EZWZhdWx0Q29udGV4dE1hbmFnZXImcXVvdDsmZ3Q7Ci0gICAgICAgICZsdDtsaXN0ZW5lciBjbGFzcz0mcXVvdDtvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuY29udGV4dC5EZWZhdWx0Q29udGV4dE1hbmFnZXJMaXN0ZW5lciZxdW90Oy8mZ3Q7Ci0gICAgICAgICZsdDtyZXBsaWNhdGlvbiZndDsKLSAgICAgICAgICAgICZsdDtkZWZhdWx0cyZndDsKLSAgICAgICAgICAgICAgICAmbHQ7ZXhjbHVkZSBuYW1lPSZxdW90O2xvY2FsXyomcXVvdDsvJmd0OwotICAgICAgICAgICAgICAgICZsdDtleGNsdWRlIG5hbWU9JnF1b3Q7TE9DQUxfKiZxdW90Oy8mZ3Q7Ci0gICAgICAgICAgICAmbHQ7L2RlZmF1bHRzJmd0OwotICAgICAgICAgICAgJmx0O2NvbnRleHQgY2xhc3M9JnF1b3Q7b3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0JnF1b3Q7Jmd0OwotICAgICAgICAgICAgICAgICZsdDtleGNsdWRlIG5hbWU9JnF1b3Q7U2VxdWVuY2VQcm9wZXJ0eUJlYW5NYXAmcXVvdDsvJmd0OwotICAgICAgICAgICAgICAgICZsdDtleGNsdWRlIG5hbWU9JnF1b3Q7TmV4dE1zZ0JlYW5NYXAmcXVvdDsvJmd0OwotICAgICAgICAgICAgICAgICZsdDtleGNsdWRlIG5hbWU9JnF1b3Q7UmV0cmFuc21pdHRlckJlYW5NYXAmcXVvdDsvJmd0OwotICAgICAgICAgICAgICAgICZsdDtleGNsdWRlIG5hbWU9JnF1b3Q7U3RvcmFnZU1hcEJlYW5NYXAmcXVvdDsvJmd0OwotICAgICAgICAgICAgICAgICZsdDtleGNsdWRlIG5hbWU9JnF1b3Q7Q3JlYXRlU2VxdWVuY2VCZWFuTWFwJnF1b3Q7LyZndDsKLSAgICAgICAgICAgICAgICAmbHQ7ZXhjbHVkZSBuYW1lPSZxdW90O0NvbmZpZ0NvbnRleHRUaW1lb3V0SW50ZXJ2YWwmcXVvdDsvJmd0OwotICAgICAgICAgICAgICAgICZsdDtleGNsdWRlIG5hbWU9JnF1b3Q7Q29udGFpbmVyTWFuYWdlZCZxdW90Oy8mZ3Q7Ci0gICAgICAgICAgICAmbHQ7L2NvbnRleHQmZ3Q7Ci0gICAgICAgICAgICAmbHQ7Y29udGV4dCBjbGFzcz0mcXVvdDtvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuU2VydmljZUdyb3VwQ29udGV4dCZxdW90OyZndDsKLSAgICAgICAgICAgICAgICAmbHQ7ZXhjbHVkZSBuYW1lPSZxdW90O215LnNhbmRlc2hhLiomcXVvdDsvJmd0OwotICAgICAgICAgICAgJmx0Oy9jb250ZXh0Jmd0OwotICAgICAgICAgICAgJmx0O2NvbnRleHQgY2xhc3M9JnF1b3Q7b3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LlNlcnZpY2VDb250ZXh0JnF1b3Q7Jmd0OwotICAgICAgICAgICAgICAgICZsdDtleGNsdWRlIG5hbWU9JnF1b3Q7bXkuc2FuZGVzaGEuKiZxdW90Oy8mZ3Q7Ci0gICAgICAgICAgICAmbHQ7L2NvbnRleHQmZ3Q7Ci0gICAgICAgICZsdDsvcmVwbGljYXRpb24mZ3Q7Ci0gICAgICZsdDsvY29udGV4dE1hbmFnZXImZ3Q7Ci0gICAmbHQ7L2NsdXN0ZXImZ3Q7Ci08L3ByZT4KLTxwPlRoZSBleGNsdWRlIHRhZyB0ZWxscyB0aGUgc3lzdGVtIHRvIGF2b2lkIHJlcGxpY2F0aW5nIHRoYXQgcGFydGljdWxhciBwcm9wZXJ0eS4gVGhpcyBpcyBhIHVzZWZ1bAotZmVhdHVyZSBhcyB5b3Ugd291bGQgbmVlZCB0byBoYXZlIHByb3BlcnRpZXMgdGhhdCBpcyBub2RlIHNwZWNpZmljIG9ubHkuIAotVGhlIGRlZmF1bHQgY29uZmlnIGluIGF4aXMyIHdpbGwgaGF2ZSBhbGwgcHJvcGVydGllcyB0aGUgYXhpczIgc3lzdGVtIGRvZXNuJ3Qgd2FudCB0byByZXBsaWNhdGUuIFdlYiBTZXJ2aWNlIGRldmVsb3BlcnMgY2FuIGFsc28gdXNlIHRoaXMgdG8gZmlsdGVyIG91dCBwcm9wZXJ0aWVzIHRoYXQgc2hvdWxkIGJlIGxvY2FsIG9ubHkuCi08L3A+Ci0KLTwhLS0gRXhhbXBsZTEgU2NhbGFiaWxpdHkgJiBIQSB3aXRoIFN0YXRlbGVzcyBXZWIgU2VydmljZSAtLT4KLTxhIG5hbWU9InNjYWxhYmlsaXR5X3N0YXRlbGVzc19leGFtcGxlIiBpZD0ic2NhbGFiaWxpdHlfc3RhdGVsZXNzX2V4YW1wbGUiPjwvYT4KLTxoMj5FeGFtcGxlIDE6IFNjYWxhYmlsaXR5IGFuZCBIQSB3aXRoIFN0YXRlbGVzcyBXZWIgU2VydmljZXM8L2gyPgotPHA+VGhlIGZvbGxvd2luZyBpcyBhIGdvb2QgZXhhbXBsZSBmb3IgZGVwbG95aW5nIGEgU3RhdGVsZXNzIFdlYiBTZXJ2aWNlIGZvciBTY2FsYWJpbGl0eSBhbmQgSGlnaCBBdmFpbGFiaWxpdHkuCi1UaGUgZm9sbG93aW5nIHNlcnZpY2UgY2FuIGJlIGRlcGxveWVkIGluICJhcHBsaWNhdGlvbiIgc2NvcGUgaW4gIm4iIG5vZGVzIHVzaW5nIGEgY2VudHJhbCByZXBvc2l0b3J5LiAKLU9uY2Ugc3RhdGUgaXMgbG9hZGVkIGJ5IGEgcGFydGljdWxhciBub2RlIGl0IHdpbGwgYmUgc2hhcmVkIGJ5IG90aGVyIG5vZGVzIGFzIHRoZSBjb25maWcgY29udGV4dCB3aWxsIHJlcGxpY2F0ZSB0aGUgZGF0YS4KLUV2ZW4gaWYgdHdvIG5vZGVzIGxvYWQgdGhlIGRhdGEgYXQgdGhlIHNhbWUgdGltZSwgdGhlcmUgd2FudCBiZSBhbnkgY29uZmxpY3RzIGFzIGl0IGlzIHRoZSBzYW1lIHNldCBvZiBkYXRhLgotKEFsbCBub2RlcyBzaG91bGQgc3luY2hyb25pemUgdGhlaXIgY2xvY2tzIHVzaW5nIGEgdGltZSBzZXJ2ZXIgdG8gYXZvaWQgbG9hZGluZyBkaWZmZXJlbnQgc2V0cyBvZiBkYXRhKTwvcD4KLQotPHA+Rm9yIHRoZSBzYWtlIG9mIHRoaXMgZXhhbXBsZSB3ZSBhc3N1bWUgcmVwbGljYXRpb24gaXMgY2hlYXBlciB0aGFuIHF1ZXJ5aW5nIHRoZSBkYXRhYmFzZS4KLVNvIG9uY2UgcXVlcmllZCBpdCB3aWxsIGJlIHJlcGxpY2F0ZWQgdG8gdGhlIGNsdXN0ZXI8L3A+Ci08cHJlPgotLyoqCi0gKiBUaGlzIFNlcnZpY2UgaXMgcmVzcG9uc2libGUgZm9yIHByb3ZpZGluZyB0aGUgdG9wIDUKLSAqIHN0b2NrcyBmb3IgdGhlIGRheSwgd2VlayBvciBxdWFydGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUb3A1U3RvY2tTZXJ2aWNlCi17Ci0JcHVibGljIFN0cmluZ1tdIGdldFRvcDVTdG9ja3NGb3JUb2RheSgpCi0JewotCQkvLyBJZiBjYWNoZSBpcyBudWxsIG9yIGludmFsaWQgZmV0Y2ggaXQgZnJvbSBkYXRhIGJhc2UKLQkJQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ29udGV4dCA9Ci0gICAgICAgICAgICBNZXNzYWdlQ29udGV4dC5nZXRDdXJyZW50TWVzc2FnZUNvbnRleHQoKS5nZXRDb25maWd1cmF0aW9uQ29udGV4dCgpOwotCQkKLQkJU3RyaW5nW10gIHN5bWJvbHMgPSAoU3RyaW5nW10pY29uZmlnQ29udGV4dC5nZXRQcm9wZXJ0eShUT1A1X1RPREFZKTsKLQkJaWYgKCFjaGVja1ZhbGlkaXR5KGNvbmZpZ0NvbnRleHQuZ2V0UHJvcGVydHkoVE9QNV9UT0RBWV9MT0FEX1RJTUUpKSkKLSAgICAgICAgICAgICAgICB7Ci0JCSAgICBzeW1ib2xzID0gbG9hZEZyb21EYXRhYmFzZShUT1A1X1RPREFZKTsKLSAgICAgICAgICAgICAgICAgICAgY29uZmlnQ29udGV4dC5zZXRQcm9wZXJ0eShUT1A1X1RPREFZLHN5bWJvbHMpOwotCQkgICAgY29uZmlnQ29udGV4dC5zZXRQcm9wZXJ0eShUT1A1X1RPREFZX0xPQURfVElNRSxuZXcgamF2YS51dGlsLkRhdGUoKSk7IAkgCi0gICAgICAgICAgICAgICAgfSAKLQkJCi0JCXJldHVybiBzeW1ib2xzOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nW10gZ2V0VG9wNVN0b2Nrc0ZvclRoZVdlZWsoKQotCXsKLQkJIC8vIElmIGNhY2hlIGlzIG51bGwgb3IgaW52YWxpZCBmZXRjaCBpdCBmcm9tIGRhdGEgYmFzZQotCQkuLi4uLi4uLi4uLi4uCi0JfQotCQotCXB1YmxpYyBTdHJpbmdbXSBnZXRUb3A1U3RvY2tzRm9yVGhlUXVhcnRlcigpCi0JewotCQkvLyBJZiBjYWNoZSBpcyBudWxsIG9yIGludmFsaWQgZmV0Y2ggaXQgZnJvbSBkYXRhIGJhc2UKLSAgICAgICAgICAgICAgICAuLi4uLi4uLi4uLi4KLQl9Ci19Ci08L3ByZT4KLQotPCEtLSBFeGFtcGxlMiBGYWlsb3ZlciBmb3IgU3RhdGVmdWwgV2ViIFNlcnZpY2UgLS0+Ci08YSBuYW1lPSJmYWlsb3Zlcl9zdGF0ZWZ1bF9leGFtcGxlIiBpZD0iZmFpbG92ZXJfc3RhdGVmdWxfZXhhbXBsZSI+PC9hPgotPGgyPkV4YW1wbGUgMjogRmFpbG92ZXIgZm9yIFN0YXRlZnVsIFdlYiBTZXJ2aWNlczwvaDI+Ci08cD5UaGUgZm9sbG93aW5nIGV4YW1wbGUgZGVtb25zdHJhdGVzIEZhaWxvdmVyIHN1cHBvcnQgYnkgcmVwbGljYXRpbmcgc3RhdGUgaW4gYSBzZXJ2aWNlIGRlcGxveWVkIGluICJzb2Fwc2Vzc2lvbiIgc2NvcGUuCi1Zb3UgY2FuIGRlcGxveSB0aGUgc2VydmljZSBpbiAyIG5vZGVzLiBUaGVuIHBvaW50IGEgY2xpZW50IHRvIHRoZSBmaXJzdCBub2RlIGFuZCBhZGQgYSBmZXcgaXRlbXMgdG8gdGhlIHNob3BwaW5nIGNhcnQuCi1Bc3N1bWluZyB0aGUgcHJpbWFyeSBub2RlIGhhcyBjcmFzaGVkLCBwb2ludCB0aGUgY2xpZW50IHRvIHRoZSBiYWNrdXAgbm9kZS4gWW91IHNob3VsZCBiZSBhYmxlIHRvIGNoZWNrb3V0IHRoZSBjYXJ0IHdpdGggdGhlIGl0ZW1zIHlvdSBhZGRlZCBpbiB0aGUgZmlyc3Qgbm9kZS48L3A+Ci0KLTxwcmU+Ci1wdWJsaWMgY2xhc3MgU2hvcHBpbmdDYXJ0Ci17CQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFNIT1BQSU5HX0NBUlQgPSAiU0hPUFBJTkdfQ0FSVCI7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRElTQ09VTlQgPSAiRElTQ09VTlQiOwotCQotCXB1YmxpYyB2b2lkIGNyZWF0ZVNlc3Npb24oKQotCXsKLQkJTGlzdCZsdDtJdGVtJmd0OyBjYXJ0ID0gbmV3IEFycmF5TGlzdCZsdDtJdGVtJmd0OygpOwotCQlTZXJ2aWNlQ29udGV4dCBzZXJ2aWNlQ29udGV4dCA9Ci0gICAgICAgICAgICBNZXNzYWdlQ29udGV4dC5nZXRDdXJyZW50TWVzc2FnZUNvbnRleHQoKS5nZXRTZXJ2aWNlQ29udGV4dCgpOwotCQlzZXJ2aWNlQ29udGV4dC5zZXRQcm9wZXJ0eShTSE9QUElOR19DQVJULCBjYXJ0KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYWRkSXRlbShJdGVtIGl0ZW0pCi0JewotCQlTZXJ2aWNlQ29udGV4dCBzZXJ2aWNlQ29udGV4dCA9Ci0gICAgICAgICAgICBNZXNzYWdlQ29udGV4dC5nZXRDdXJyZW50TWVzc2FnZUNvbnRleHQoKS5nZXRTZXJ2aWNlQ29udGV4dCgpOwotCQlMaXN0Jmx0O0l0ZW0mZ3Q7IGNhcnQgPSAoTGlzdCZsdDtJdGVtJmd0OylzZXJ2aWNlQ29udGV4dC5nZXRQcm9wZXJ0eShTSE9QUElOR19DQVJUKTsKLQkJY2FydC5hZGQoaXRlbSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZUl0ZW0oSXRlbSBpdGVtKQotCXsKLQkJU2VydmljZUNvbnRleHQgc2VydmljZUNvbnRleHQgPQotICAgICAgICAgICAgTWVzc2FnZUNvbnRleHQuZ2V0Q3VycmVudE1lc3NhZ2VDb250ZXh0KCkuZ2V0U2VydmljZUNvbnRleHQoKTsKLQkJTGlzdCZsdDtJdGVtJmd0OyBjYXJ0ID0gKExpc3QmbHQ7SXRlbSZndDspc2VydmljZUNvbnRleHQuZ2V0UHJvcGVydHkoU0hPUFBJTkdfQ0FSVCk7Ci0JCWNhcnQucmVtb3ZlKGl0ZW0pOwotCX0KLQkKLQlwdWJsaWMgZG91YmxlIGNoZWNrb3V0KCkKLQl7Ci0JCVNlcnZpY2VDb250ZXh0IHNlcnZpY2VDb250ZXh0ID0KLSAgICAgICAgICAgIE1lc3NhZ2VDb250ZXh0LmdldEN1cnJlbnRNZXNzYWdlQ29udGV4dCgpLmdldFNlcnZpY2VDb250ZXh0KCk7Ci0JCUxpc3QmbHQ7SXRlbSZndDsgY2FydCA9IChMaXN0Jmx0O0l0ZW0mZ3Q7KXNlcnZpY2VDb250ZXh0LmdldFByb3BlcnR5KFNIT1BQSU5HX0NBUlQpOwotCQkKLQkJZG91YmxlIGRpc2NvdW50ID0gKERvdWJsZSlzZXJ2aWNlQ29udGV4dC5nZXRTZXJ2aWNlR3JvdXBDb250ZXh0KCkuZ2V0UHJvcGVydHkoRElTQ09VTlQpOwotCQkKLQkJZG91YmxlIHRvdGFsID0gMDsKLQkJZm9yIChJdGVtIGkgOiBjYXJ0KQotCQl7Ci0JCQl0b3RhbCA9IHRvdGFsICsgaS5nZXRQcmljZSgpOwotCQl9Ci0JCQotCQl0b3RhbCA9IHRvdGFsIC0gdG90YWwgKiAoZGlzY291bnQvMTAwKTsKLQkJCi0JCXJldHVybiB0b3RhbDsKLQl9CQotfQotPC9wcmU+Ci0KLTwhLS0gRXhhbXBsZSAzIFNjYWxhYmlsaXR5ICYgSEEgd2l0aCBTdGF0ZWZ1bCBXZWIgU2VydmljZXMgLS0+Ci08YSBuYW1lPSJzY2FsYWJpbGl0eV9zdGF0ZWZ1bF9leGFtcGxlIiBpZD0ic2NhbGFiaWxpdHlfc3RhdGVmdWxfZXhhbXBsZSI+PC9hPgotPGgyPkV4YW1wbGUzOiBTY2FsYWJpbGl0eSBhbmQgSEEgd2l0aCBTdGF0ZWZ1bCBXZWIgU2VydmljZXM8L2gyPgotPHA+WW91IGNhbiBkZXBsb3kgdGhlIHRoZSBhYm92ZSBTaG9wcGluZyBDYXJ0IHNlcnZpY2UgaW4gc2V2ZXJhbCBhY3RpdmUgbm9kZXMgKHdpdGggYSBiYWNrdXAocykgZm9yIGVhY2ggbm9kZSkuIAotWW91IG9ubHkgcmVwbGljYXRlIHRvIHlvdXIgYmFja3VwIG5vZGVzIGZvciBGYWlsb3Zlci4gVGhlIGxvYWQgYmFsYW5jZXIgc2hvdWxkIGVuc3VyZSBzdGlja3kgc2Vzc2lvbnMuIAotIFRoZSBzdHJhdGVneSBpcyB0byBwYXJ0aXRpb24geW91ciBsb2FkIGJldHdlZW4gdGhlIGFjdGl2ZSBub2RlcyB0byBhY2hpZXZlIHNjYWxhYmlsaXR5IGFuZCByZXBsaWNhdGlvbiB0byB0aGUgYmFja3VwcyB0byBhY2hpZXZlIEZhaWxvdmVyLiBUaGVzZSBpbiB0dXJuIHdpbGwgaW5jcmVhc2UgdGhlIGhpZ2ggYXZhaWxhYmlsaXR5IG9mIHlvdXIgc2VydmljZXMuIFNpbmNlIHRoZSBhYm92ZSBleGFtcGxlIGRvZXNuJ3QgdXNlIFNlcnZpY2UgR3JvdXAgQ29udGV4dCB0byB3cml0ZSBhbnkgc3RhdGUgdGhlcmUgd2FudCBiZSBhbnkgY29uZmxpY3RzLjwvcD4KLQotPHA+Rm9yIHRoZSBzYWtlIG9mIHRoaXMgZXhhbXBsZSB3ZSBhc3N1bWUgdGhhdCBhbGwgcmVhZCBvbmx5IHByb3BlcnRpZXMgZm9yIHRoZSBTZXJ2aWNlIEdyb3VwIENvbnRleHQgaXMgbG9hZGVkIGF0IGluaXRpYWxpemF0aW9uCi0gPGI+PGk+UGxlYXNlIG5vdGUgdGhpcyBpcyB0aGUgcmVjb21tZW5kZWQgYXBwcm9hY2ggZm9yIFN0YXRlZnVsIFdlYiBTZXJ2aWNlcyBkdWUgdG8gdGhlIGN1cnJlbnQgbGltaXRhdGlvbnM8L2k+PC9iPgotPC9wPgotCi0KLTxhIG5hbWU9InN1bW1hcnkiIGlkPSJzdW1tYXJ5Ij48L2E+Ci08aDI+U3VtbWFyeTwvaDI+Ci08cD5BcGFjaGUgQXhpczIgcHJvdmlkZXMgZXhwZXJpbWVudGFsIHN1cHBvcnQgZm9yIGNsdXN0ZXJpbmcgdG8gaW1wcm92ZSB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXMgb2YgeW91ciBXZWIgU2VydmljZXMuCi08dWw+Ci08bGk+U2NhbGFiaWxpdHk8L2xpPgotPGxpPkZhaWxvdmVyPC9saT4KLTxsaT5IaWdoIEF2YWlsYWJpbGl0eTwvbGk+Ci08L3VsPgotSXQgaXMgaW1wb3J0YW50IHRvIHVuZGVyc3RhbmQgdGhlIGN1cnJlbnQgbGltaXRhdGlvbnMgd2hlbiBsZXZlcmFnaW5nIGNsdXN0ZXJpbmcgc3VwcG9ydC4KLTwvcD4KLQotCi08YSBuYW1lPSJmdXJ0aGVyc3R1ZHkiIGlkPSJmdXJ0aGVyc3R1ZHkiPjwvYT4KLTxoMj5Gb3IgRnVydGhlciBTdHVkeTwvaDI+Ci08cD5BcGFjaGUgQXhpczItPGEgaHJlZj0KLSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi8iPmh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyLzwvYT48L3A+Ci08cD5BeGlzMiBBcmNoaXRlY3R1cmUtPGEgaHJlZj0KLSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi8xXzAvQXhpczJBcmNoaXRlY3R1cmVHdWlkZS5odG1sIj5odHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi8xXzAvQXhpczJBcmNoaXRlY3R1cmVHdWlkZS5odG1sPC9hPjwvcD4KLTxwPkludHJvZHVjdGlvbiB0byBBcGFjaGUgQXhpczItPGEgaHJlZj0KLSJodHRwOi8vd3d3LnJlZGhhdC5jb20vbWFnYXppbmUvMDIxanVsMDYvZmVhdHVyZXMvYXBhY2hlX2F4aXMyLyI+aHR0cDovL3d3dy5yZWRoYXQuY29tL21hZ2F6aW5lLzAyMWp1bDA2L2ZlYXR1cmVzL2FwYWNoZV9heGlzMi88L2E+PC9wPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2NvbnRlbnRzLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9jb250ZW50cy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0ZjUyOWIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2NvbnRlbnRzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4MCArMCwwIEBACi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIg0KLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+DQotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPg0KLTxoZWFkPg0KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0NCi0iSFRNTCBUaWR5IGZvciBXaW5kb3dzICh2ZXJzIDE0IEp1bmUgMjAwNyksIHNlZSB3d3cudzMub3JnIiAvPg0KLTxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0NCi0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPg0KLTx0aXRsZT5BeGlzMi9KYXZhIEBheGlzMl92ZXJzaW9uQCBEb2N1bWVudGF0aW9uIEhvbWU8L3RpdGxlPg0KLTxsaW5rIGhyZWY9Ii4uL2Nzcy9heGlzLWRvY3MuY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIg0KLW1lZGlhPSJhbGwiIC8+DQotPC9oZWFkPg0KLTxib2R5IGxhbmc9ImVuIiB4bWw6bGFuZz0iZW4iPg0KLTxoMT5BcGFjaGUgQXhpczIvSmF2YSBWZXJzaW9uIEBheGlzMl92ZXJzaW9uQCBEb2N1bWVudGF0aW9uDQotSW5kZXg8L2gxPg0KLTxoMj5JbnRyb2R1Y3Rpb248L2gyPg0KLTxwPkFwYWNoZSBBeGlzMiwgdGhlIHRoaXJkIGdlbmVyYXRpb24gV2ViIHNlcnZpY2VzIGVuZ2luZSBpcyBtb3JlDQotZWZmaWNpZW50LCBtb3JlIG1vZHVsYXIgYW5kIG1vcmUgWE1MLW9yaWVudGVkIHRoYW4gaXRzIHByZWRlY2Vzc29yDQotPGEgaHJlZj0iaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpcy8iPkFwYWNoZSBBeGlzPC9hPi4gSXQgaXMNCi1jYXJlZnVsbHkgZGVzaWduZWQgdG8gc3VwcG9ydCB0aGUgZWFzeSBhZGRpdGlvbiBvZiBwbHVnLWluIG1vZHVsZXMNCi10aGF0IGV4dGVuZCBpdHMgZnVuY3Rpb25hbGl0eSBmb3IgZmVhdHVyZXMgc3VjaCBhcyBzZWN1cml0eSBhbmQNCi1pbmNyZWFzZWQgcmVsaWFiaWxpdHkuPC9wPg0KLTxwPkFwYWNoZSBBeGlzMiBWZXJzaW9uIEBheGlzMl92ZXJzaW9uQCBjb21lcyB0byB5b3Ugd2l0aA0KLXBlcmZvcm1hbmNlIGltcHJvdmVtZW50cyBhbmQgYnVnIGZpeGVzIG92ZXIgdGhlIDEuMSByZWxlYXNlLjwvcD4NCi08cD5UaGlzIHBhZ2Ugd2lsbCB0YWtlIHlvdSB0aHJvdWdoIHRoZSBsaXN0IG9mIGRvY3VtZW50cyB0aGF0IHdlDQotaGF2ZSBpbiBzdG9yZSBmb3IgeW91LjwvcD4NCi08aDI+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+DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2NvcmJhLWRlcGxveWVyLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9jb3JiYS1kZXBsb3llci54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0NTE1Y2IuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2NvcmJhLWRlcGxveWVyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJpc28tODg1OS0xIj8+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+Y2FsY3VsYXRvci54bWw8L3R0PiBmaWxlIGFuZCBhZGQgdGhlIGZvbGxvd2luZyBsaW5lIHRvIHRoZSAJc2FtZSBmaWxlLgotCQk8cHJlPiZsdDtwYXJhbWV0ZXIgbmFtZT0iaW9yRmlsZVBhdGgiJmd0Oy9wYXRoL3RvL2EvbmV3L2ZpbGUmbHQ7L3BhcmFtZXRlciZndDs8L3ByZT4KLTwvYm9keT4KLTwvaHRtbD4KLQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2RpaS54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvZGlpLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI4NjJhYS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvZGlpLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0NCArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+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+Ci0KLTxwPlRvIHJ1biB0aGUgc2FtcGxlIGNsaWVudCAoIkVjaG9Ob25CbG9ja2luZ0R1YWxDbGllbnQiKSB5b3UgY2FuIHNpbXBseSB1c2UKLXRoZSAicnVuLmNsaWVudC5ub25ibG9ja2luZ2R1YWwiIHRhcmdldCBvZiB0aGUgQW50IGZpbGUgZm91bmQgaW4gdGhlCi0iPHN0cm9uZz5BeGlzMl9IT01FL3NhbXBsZXMvdXNlcmd1aWRlLzwvc3Ryb25nPiIgZGlyZWN0b3J5LjwvcD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9lamItcHJvdmlkZXIueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2VqYi1wcm92aWRlci54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1ZDAwOGUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2VqYi1wcm92aWRlci54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyODggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/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+DQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaHR0cC10cmFuc3BvcnQueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2h0dHAtdHJhbnNwb3J0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmIyNGVhOC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaHR0cC10cmFuc3BvcnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI3ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+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+Ci1NdWx0aVRocmVhZGVkSHR0cENvbm5lY3Rpb25NYW5hZ2VyIGNvbm1nciA9IG5ldwotTXVsdGlUaHJlYWRlZEh0dHBDb25uZWN0aW9uTWFuYWdlcigpOwotY29ubWdyLmdldFBhcmFtcygpLnNldERlZmF1bHRNYXhDb25uZWN0aW9uc1Blckhvc3QoMTApOwotSHR0cENsaWVudCBjbGllbnQgPSBuZXcgSHR0cENsaWVudChjb25tZ3IpOwotY29uZmlndXJhdGlvbkNvbnRleHQuc2V0UHJvcGVydHkoSFRUUENvbnN0YW50cy5DQUNIRURfSFRUUF9DTElFTlQsIGNsaWVudCk7Ci08L3ByZT4KLSAgICA8L3NvdXJjZT4KLSAgICAKLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvQXJjaGl0ZWN0dXJlLmdpZiBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvQXJjaGl0ZWN0dXJlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhjMzBhMy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL0FyY2hpdGVjdHVyZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL0F4aXNTZXJ2aWNlLmpwZyBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvQXhpc1NlcnZpY2UuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzdhNDhkLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvQXhpc1NlcnZpY2UuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9Db21wb25lbnQucG5nIGIvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9Db21wb25lbnQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTg4ZGFiLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvQ29tcG9uZW50LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvSkFYQl9hcmNoaXRlY3R1cmUuZ2lmIGIvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9KQVhCX2FyY2hpdGVjdHVyZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0Yjk3MDYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9KQVhCX2FyY2hpdGVjdHVyZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL09NMDAxLmdpZiBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvT00wMDEuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODMxODMzLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvT00wMDEuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9PTTAwMi5qcGcgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL09NMDAyLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTBhMzBkYi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL09NMDAyLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvT00wMDMuanBnIGIvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9PTTAwMy5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjNjY5YTQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9PTTAwMy5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL09NMDA0LmpwZyBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvT00wMDQuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDliZDIxLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvT00wMDQuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9PTTAwNS5naWYgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL09NMDA1LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkyMDllNC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL09NMDA1LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvT00wMDYuZ2lmIGIvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9PTTAwNi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlMTdlZDAuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9PTTAwNi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL09NMDA3LmdpZiBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvT00wMDcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTBmZTUzLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvT00wMDcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9PTTAwOC5naWYgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL09NMDA4LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ1YTRhNi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL09NMDA4LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvT00xLnBuZyBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvT00xLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA5YjljOS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL09NMS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL1NlcnZlclNpZGVGYXVsdC5wbmcgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL1NlcnZlclNpZGVGYXVsdC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwZGY5NTcuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9TZXJ2ZXJTaWRlRmF1bHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9TZXJ2aWNlRGVzYy5naWYgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL1NlcnZpY2VEZXNjLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDY2YTUwNy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL1NlcnZpY2VEZXNjLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvVG90YWxBcmNoLnBuZyBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvVG90YWxBcmNoLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBiZGNlZi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL1RvdGFsQXJjaC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL1dvbUJ1aWxkZXIucG5nIGIvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9Xb21CdWlsZGVyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQyNTRhOC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL1dvbUJ1aWxkZXIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9hY3RpdmF0ZS5qcGcgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2FjdGl2YXRlLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUyODcxOC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2FjdGl2YXRlLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvYWRtaW4uanBnIGIvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9hZG1pbi5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmODkwNzAuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9hZG1pbi5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2FkbWlubG9naW4uanBnIGIvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9hZG1pbmxvZ2luLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODIzNWUyYi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2FkbWlubG9naW4uanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9hZG1pbm1haW4uanBnIGIvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9hZG1pbm1haW4uanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjE0OTAxLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvYWRtaW5tYWluLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvYW50LmpwZyBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvYW50LmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjA1MzFlMy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2FudC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2FyY2hpLWd1aWRlL0NvZGVnZW5BcmNoaXRlY3R1cmUtbmV3LmdpZiBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvYXJjaGktZ3VpZGUvQ29kZWdlbkFyY2hpdGVjdHVyZS1uZXcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjYxYzVmLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvYXJjaGktZ3VpZGUvQ29kZWdlbkFyY2hpdGVjdHVyZS1uZXcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9hcmNoaS1ndWlkZS9Db2RlZ2VuQXJjaGl0ZWN0dXJlLmpwZyBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvYXJjaGktZ3VpZGUvQ29kZWdlbkFyY2hpdGVjdHVyZS5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExN2M0NTUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9hcmNoaS1ndWlkZS9Db2RlZ2VuQXJjaGl0ZWN0dXJlLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvYXJjaGktZ3VpZGUvYWxsLnBuZyBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvYXJjaGktZ3VpZGUvYWxsLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI5OTE1Ny4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2FyY2hpLWd1aWRlL2FsbC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2FyY2hpLWd1aWRlL2JpZy1waWN0dXJlLmdpZiBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvYXJjaGktZ3VpZGUvYmlnLXBpY3R1cmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDIzZjAwLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvYXJjaGktZ3VpZGUvYmlnLXBpY3R1cmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9hcmNoaS1ndWlkZS9jb250ZXh0cy5wbmcgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2FyY2hpLWd1aWRlL2NvbnRleHRzLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmViYjg4OC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2FyY2hpLWd1aWRlL2NvbnRleHRzLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvYXJjaGktZ3VpZGUvcGhhc2VzLnBuZyBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvYXJjaGktZ3VpZGUvcGhhc2VzLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThjYTAwOS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2FyY2hpLWd1aWRlL3BoYXNlcy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2FyY2hpLWd1aWRlL3NvYXAtcHJvY2Vzc2luZy5naWYgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2FyY2hpLWd1aWRlL3NvYXAtcHJvY2Vzc2luZy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhM2VjNTQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9hcmNoaS1ndWlkZS9zb2FwLXByb2Nlc3NpbmcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9hcmNoaS1ndWlkZS9zb2FwLmdpZiBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvYXJjaGktZ3VpZGUvc29hcC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhZWZiYmQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9hcmNoaS1ndWlkZS9zb2FwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvYXJjaGkwMDEuZ2lmIGIvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9hcmNoaTAwMS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiZTA0NzcuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9hcmNoaTAwMS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2FyY2hpMDAyLmdpZiBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvYXJjaGkwMDIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTU2Nzk3Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvYXJjaGkwMDIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9hcmNoaTAwMy5naWYgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2FyY2hpMDAzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y2ZmU4Yy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2FyY2hpMDAzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvYXJjaGkwMDQuanBnIGIvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9hcmNoaTAwNC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmZTI1ZjcuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9hcmNoaTAwNC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2FyY2hpMDA1LmpwZyBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvYXJjaGkwMDUuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2Q3MDNhLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvYXJjaGkwMDUuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9hcmNoaTAwNi5qcGcgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2FyY2hpMDA2LmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBhMjEyMi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2FyY2hpMDA2LmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvYXJjaGkwMDcuanBnIGIvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9hcmNoaTAwNy5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyZGI0MzcuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9hcmNoaTAwNy5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2FyY2hpMDA4LmdpZiBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvYXJjaGkwMDguZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTFkYzM0Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvYXJjaGkwMDguZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9hcmNoaTAwOS5qcGcgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2FyY2hpMDA5LmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjhiZGQwYy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2FyY2hpMDA5LmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvYXJjaGkwMTAuanBnIGIvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9hcmNoaTAxMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3YWQwMjcuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9hcmNoaTAxMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2FyY2hpMDExLmdpZiBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvYXJjaGkwMTEuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODkxZWJkLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvYXJjaGkwMTEuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9hcmNoaTAxMi5qcGcgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2FyY2hpMDEyLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ5Yjg2YS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2FyY2hpMDEyLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvYXJjaGkwMTMuZ2lmIGIvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9hcmNoaTAxMy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkYmMwZGMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9hcmNoaTAxMy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2FyY2hpMDE0LmpwZyBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvYXJjaGkwMTQuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjE4ZWZkLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvYXJjaGkwMTQuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9hcmNoaTAxNS5qcGcgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2FyY2hpMDE1LmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFiMjcwYy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2FyY2hpMDE1LmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvYXJjaGkwMTYuanBnIGIvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9hcmNoaTAxNi5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiNjA2M2YuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9hcmNoaTAxNi5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2FyY2hpMDE3LmpwZyBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvYXJjaGkwMTcuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDZkZTE4Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvYXJjaGkwMTcuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9hcmNoaTAxOC5qcGcgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2FyY2hpMDE4LmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWY3Y2YyOS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2FyY2hpMDE4LmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvYXJjaGkwMTkuanBnIGIvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9hcmNoaTAxOS5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwZTg3YjkuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9hcmNoaTAxOS5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2FyY2hpMDIwLmpwZyBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvYXJjaGkwMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDMxYzYzLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvYXJjaGkwMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9hcmNoaTAyMS5qcGcgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2FyY2hpMDIxLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzExOWE1Yi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2FyY2hpMDIxLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvYXJjaGkwMjIuanBnIGIvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9hcmNoaTAyMi5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3NmNkNTMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9hcmNoaTAyMi5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2FyY2hpMDIzLmpwZyBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvYXJjaGkwMjMuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTdhMjI4Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvYXJjaGkwMjMuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9hcmNoaTAyNC5qcGcgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2FyY2hpMDI0LmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjhhZGYyZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2FyY2hpMDI0LmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvYXJjaGkwMjUuanBnIGIvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9hcmNoaTAyNS5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkZjI4OGEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9hcmNoaTAyNS5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2FyY2hpMDI2LmpwZyBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvYXJjaGkwMjYuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjBhNTBkLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvYXJjaGkwMjYuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9hcnJvd19sZWZ0LmdpZiBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvYXJyb3dfbGVmdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxMTAwZWMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9hcnJvd19sZWZ0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvYXJyb3dfcmlnaHQuZ2lmIGIvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9hcnJvd19yaWdodC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3YzFkOTIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9hcnJvd19yaWdodC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2F4aXMuanBnIGIvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9heGlzLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzMzNzFkOC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2F4aXMuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9heW5jcmVzdWx0LnBuZyBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvYXluY3Jlc3VsdC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3OTE2YmIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9heW5jcmVzdWx0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvY2FsbC5wbmcgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2NhbGwucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTkyN2U0Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvY2FsbC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2NhbGxiYWNrLnBuZyBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvY2FsbGJhY2sucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTYyYjNlLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvY2FsbGJhY2sucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9jYXNlcy5qcGcgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2Nhc2VzLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTIwYjk0NS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2Nhc2VzLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvY2xpZW50QVBpLnBuZyBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvY2xpZW50QVBpLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGYyMDVkNi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2NsaWVudEFQaS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2NsaWVudHNpZGUucG5nIGIvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9jbGllbnRzaWRlLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc3MGZhZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2NsaWVudHNpZGUucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9jbGlwX2ltYWdlMDAyLmpwZyBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvY2xpcF9pbWFnZTAwMi5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmNDU4MzQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9jbGlwX2ltYWdlMDAyLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvY2xpcF9pbWFnZTAwNC5qcGcgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2NsaXBfaW1hZ2UwMDQuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTJkYWU5Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvY2xpcF9pbWFnZTAwNC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2NsaXBfaW1hZ2UwMDYuanBnIGIvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9jbGlwX2ltYWdlMDA2LmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmM0N2ZhMy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2NsaXBfaW1hZ2UwMDYuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9jbGlwX2ltYWdlMDA4LmpwZyBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvY2xpcF9pbWFnZTAwOC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzMjQ4MTguLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9jbGlwX2ltYWdlMDA4LmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvY2xpcF9pbWFnZTAxMC5qcGcgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2NsaXBfaW1hZ2UwMTAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTIzNWEyLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvY2xpcF9pbWFnZTAxMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2NsaXBfaW1hZ2UwMTIuanBnIGIvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9jbGlwX2ltYWdlMDEyLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY4YzYzMC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2NsaXBfaW1hZ2UwMTIuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9jbGlwX2ltYWdlMDE0LmpwZyBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvY2xpcF9pbWFnZTAxNC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5NmNhMDEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9jbGlwX2ltYWdlMDE0LmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvY2xpcF9pbWFnZTAxNi5qcGcgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2NsaXBfaW1hZ2UwMTYuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTc1MGE3Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvY2xpcF9pbWFnZTAxNi5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2NsaXBfaW1hZ2UwMTguanBnIGIvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9jbGlwX2ltYWdlMDE4LmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhhZTBjOC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2NsaXBfaW1hZ2UwMTguanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9jbGlwX2ltYWdlMDIwLmpwZyBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvY2xpcF9pbWFnZTAyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxNmIyZDcuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9jbGlwX2ltYWdlMDIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvY2xpcF9pbWFnZTAyMi5qcGcgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2NsaXBfaW1hZ2UwMjIuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2YyYTU5Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvY2xpcF9pbWFnZTAyMi5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2NsaXBfaW1hZ2UwMjQuanBnIGIvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9jbGlwX2ltYWdlMDI0LmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2E3MDU3MC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2NsaXBfaW1hZ2UwMjQuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9jbGlwX2ltYWdlMDI2LmpwZyBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvY2xpcF9pbWFnZTAyNi5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4YmNjZTguLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9jbGlwX2ltYWdlMDI2LmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvY29kZWdlbi5naWYgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2NvZGVnZW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjBjNjUyLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvY29kZWdlbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2NvcnJlbGF0b3IucG5nIGIvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9jb3JyZWxhdG9yLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ1MTFmZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2NvcnJlbGF0b3IucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9kZXBsb3ltZXRuY29tcG9uZW50LnBuZyBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvZGVwbG95bWV0bmNvbXBvbmVudC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyY2RiYTUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9kZXBsb3ltZXRuY29tcG9uZW50LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvZWRpdHNlcnZpZWNwYXJhLmpwZyBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvZWRpdHNlcnZpZWNwYXJhLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Q5YTU5Ny4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2VkaXRzZXJ2aWVjcGFyYS5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2VuZ2luZTEucG5nIGIvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9lbmdpbmUxLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzIzNTEyOC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2VuZ2luZTEucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9mYXVsdG1zZy5qcGcgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2ZhdWx0bXNnLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFmMjhlZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2ZhdWx0bXNnLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvZmF1bHRzZXJ2aWNlLmpwZyBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvZmF1bHRzZXJ2aWNlLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWUzNmUwMy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2ZhdWx0c2VydmljZS5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2ZpZzAxLmpwZyBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvZmlnMDEuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzg5ODFhLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvZmlnMDEuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9maWcwMi5qcGcgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2ZpZzAyLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVlOGY4NC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2ZpZzAyLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvZmlnMDMuanBnIGIvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9maWcwMy5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzMGM5MTkuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9maWcwMy5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2ZpZzA0LmpwZyBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvZmlnMDQuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWQ3Mzg3Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvZmlnMDQuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9maWcwNS5qcGcgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2ZpZzA1LmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDljZWUwOS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2ZpZzA1LmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvZmlnMDYuanBnIGIvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9maWcwNi5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2ZDU0NDAuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9maWcwNi5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2dsb2JhbGNoYWluLmpwZyBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvZ2xvYmFsY2hhaW4uanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjk0ZGI1Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvZ2xvYmFsY2hhaW4uanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9oYXBweWF4aXMuanBnIGIvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9oYXBweWF4aXMuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTBmOTkxLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvaGFwcHlheGlzLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvaW1hZ2UwMDEucG5nIGIvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9pbWFnZTAwMS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmMjA1ZDYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9pbWFnZTAwMS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2ltYWdlMDAyLmpwZyBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvaW1hZ2UwMDIuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjBiYzExLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvaW1hZ2UwMDIuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9pbWFnZTAwMy5wbmcgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2ltYWdlMDAzLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE5NGI2NS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2ltYWdlMDAzLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvaW1hZ2UwMDQuanBnIGIvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9pbWFnZTAwNC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyNzcwYzUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9pbWFnZTAwNC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2ltYWdlMDA1LmdpZiBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvaW1hZ2UwMDUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTIwOWU0Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvaW1hZ2UwMDUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9pbWFnZTAwNS5wbmcgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2ltYWdlMDA1LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM0NDQxMy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2ltYWdlMDA1LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvaW1hZ2UwMDYuanBnIGIvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9pbWFnZTAwNi5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlYTY3NTcuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9pbWFnZTAwNi5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2ltYWdlMDA3LnBuZyBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvaW1hZ2UwMDcucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDkyYzVhLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvaW1hZ2UwMDcucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9pbWFnZTAwOC5qcGcgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2ltYWdlMDA4LmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg1YjNlOS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2ltYWdlMDA4LmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvaW1hZ2UwMDkucG5nIGIvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9pbWFnZTAwOS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1Nzc3MjYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9pbWFnZTAwOS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2ltYWdlMDEwLmpwZyBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvaW1hZ2UwMTAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjA0MzhmLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvaW1hZ2UwMTAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9pbWFnZTAxMS5wbmcgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2ltYWdlMDExLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc4YTg2Yy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2ltYWdlMDExLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvaW1hZ2UwMTIuanBnIGIvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9pbWFnZTAxMi5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhNDRiMWMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9pbWFnZTAxMi5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2ltYWdlMDEzLmpwZyBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvaW1hZ2UwMTMuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDBhMjEwLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvaW1hZ2UwMTMuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9pbmFjdGl2YXRlLmpwZyBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvaW5hY3RpdmF0ZS5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3YWQ3YjQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9pbmFjdGl2YXRlLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvbW9kdWxlLnBuZyBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvbW9kdWxlLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU5YTAyZC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL21vZHVsZS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL21vZHVsZWVuZ2FnZS5qcGcgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL21vZHVsZWVuZ2FnZS5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwYTg3NjguLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9tb2R1bGVlbmdhZ2UuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9tb2R1bGVzLmpwZyBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvbW9kdWxlcy5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjZjNhNjguLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9tb2R1bGVzLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvbmV3LmdpZiBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvbmV3LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTg5Mzg2My4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL25ldy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL29tMi5wbmcgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL29tMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhNTIwOTIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9vbTIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9vbTMucG5nIGIvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9vbTMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzlkZTM3Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvb20zLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvcGFyYW1ldGVycy5qcGcgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL3BhcmFtZXRlcnMuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDRlMjIzLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvcGFyYW1ldGVycy5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL3NlbGVjdF9zZXJ2aWNlX2Zvcl9oYW5kbGVyLmpwZyBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvc2VsZWN0X3NlcnZpY2VfZm9yX2hhbmRsZXIuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjgxNGQxLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvc2VsZWN0X3NlcnZpY2VfZm9yX2hhbmRsZXIuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9zZW5kLnBuZyBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvc2VuZC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4ODc5MmYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9zZW5kLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvc2VuZEFzeW5jLnBuZyBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvc2VuZEFzeW5jLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTVlZjMxMy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL3NlbmRBc3luYy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL3NlbmRSZWNpZXZjZS5wbmcgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL3NlbmRSZWNpZXZjZS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwMjFkNGMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9zZW5kUmVjaWV2Y2UucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9zZW5kUmVjaWV2ZUFzeW5jLnBuZyBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvc2VuZFJlY2lldmVBc3luYy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0MjNjNjMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9zZW5kUmVjaWV2ZUFzeW5jLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvc2VuZFJlY2lldmVXaXRoTGlzdG5lcmUucG5nIGIvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9zZW5kUmVjaWV2ZVdpdGhMaXN0bmVyZS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjM2RjMGEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9zZW5kUmVjaWV2ZVdpdGhMaXN0bmVyZS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL3NlcnZlclNpZGUucG5nIGIvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9zZXJ2ZXJTaWRlLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I3NDBlZC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL3NlcnZlclNpZGUucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9zZXJ2aWNlLnBuZyBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvc2VydmljZS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0NDhiZjAuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9zZXJ2aWNlLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvc2VydmljZUhhbmRsZXJzLmpwZyBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvc2VydmljZUhhbmRsZXJzLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzg2N2RmOS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL3NlcnZpY2VIYW5kbGVycy5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL3NlcnZpY2Vncm91cHMuanBnIGIvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9zZXJ2aWNlZ3JvdXBzLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRhYzNkZi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL3NlcnZpY2Vncm91cHMuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy91c2VyZ3VpZGUvRGlyZWN0b3J5U3RydWN0dXJlLmpwZyBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvdXNlcmd1aWRlL0RpcmVjdG9yeVN0cnVjdHVyZS5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1M2MzMzMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy91c2VyZ3VpZGUvRGlyZWN0b3J5U3RydWN0dXJlLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvdXNlcmd1aWRlL01vZHVsZVZpZXcuanBnIGIvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy91c2VyZ3VpZGUvTW9kdWxlVmlldy5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2NjdiMDkuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy91c2VyZ3VpZGUvTW9kdWxlVmlldy5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL3VzZXJndWlkZS9NeVNlcnZpY2VEZXBsb3llZC5qcGcgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL3VzZXJndWlkZS9NeVNlcnZpY2VEZXBsb3llZC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4ZThjYzIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy91c2VyZ3VpZGUvTXlTZXJ2aWNlRGVwbG95ZWQuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy91c2VyZ3VpZGUvU2VydmljZURlcGxveWVkLmpwZyBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvdXNlcmd1aWRlL1NlcnZpY2VEZXBsb3llZC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3ODY0ZDguLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy91c2VyZ3VpZGUvU2VydmljZURlcGxveWVkLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvdXNlcmd1aWRlL1NlcnZpY2VJdGVtcy5qcGcgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL3VzZXJndWlkZS9TZXJ2aWNlSXRlbXMuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODQ3YzA0Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvdXNlcmd1aWRlL1NlcnZpY2VJdGVtcy5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL3VzZXJndWlkZS9UZXN0Q2xpZW50LmpwZyBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvdXNlcmd1aWRlL1Rlc3RDbGllbnQuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjA0M2IyLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvdXNlcmd1aWRlL1Rlc3RDbGllbnQuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy91c2VyZ3VpZGUvaHR0cC1nZXQtd3MuanBnIGIvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy91c2VyZ3VpZGUvaHR0cC1nZXQtd3MuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTYyOWUxLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvdXNlcmd1aWRlL2h0dHAtZ2V0LXdzLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvdmlld3BoYXNlcy5qcGcgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL3ZpZXdwaGFzZXMuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTMwZWFhLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvdmlld3BoYXNlcy5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL3dvbS5wbmcgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL3dvbS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiN2U5ZmEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy93b20ucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2luZGV4LnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbmRleC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5MGFmZWUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2luZGV4LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4NCi08aGVhZD4NCi08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9DQotIkhUTUwgVGlkeSBmb3IgV2luZG93cyAodmVycyAxNCBKdW5lIDIwMDcpLCBzZWUgd3d3LnczLm9yZyIgLz4NCi08dGl0bGU+PC90aXRsZT4NCi08L2hlYWQ+DQotPGZyYW1lc2V0IGNvbHM9IjI2MCwqIiBib3JkZXI9IjEiIGZyYW1lYm9yZGVyPSJ5ZXMiIGZyYW1lc3BhY2luZz0NCi0iMCIgbWFyZ2luPSIwIj4NCi08ZnJhbWUgbmFtZT0ibGVmdEZyYW1lIiBzcmM9InRvYy5odG1sIiBub3Jlc2l6ZT0ibm9yZXNpemUiDQotc2Nyb2xsaW5nPSJ5ZXMiIC8+DQotPGZyYW1lIG5hbWU9Im1haW5GcmFtZSIgc3JjPSJjb250ZW50cy5odG1sIiAvPg0KLTxub2ZyYW1lcz4NCi08Ym9keT4NCi08L2JvZHk+DQotPC9ub2ZyYW1lcz4NCi08L2ZyYW1lc2V0Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW5zdGFsbGF0aW9uZ3VpZGUueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2luc3RhbGxhdGlvbmd1aWRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y3YTI0Zi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW5zdGFsbGF0aW9uZ3VpZGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDMyICswLDAgQEAKLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+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+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9qYXh3cy1ndWlkZS54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvamF4d3MtZ3VpZGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjJkNTk0Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9qYXh3cy1ndWlkZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNjk1ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iDQotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4NCi0NCi08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+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+DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ppYngvamlieC1jb2RlZ2VuLWludGVncmF0aW9uLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9qaWJ4L2ppYngtY29kZWdlbi1pbnRlZ3JhdGlvbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmZjkyNzAuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ppYngvamlieC1jb2RlZ2VuLWludGVncmF0aW9uLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyMSArMCwwIEBACi08IS0tDQotICB+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+DQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvamlieC9qaWJ4LWRvY2xpdC1leGFtcGxlLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9qaWJ4L2ppYngtZG9jbGl0LWV4YW1wbGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDBlNDRjLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9qaWJ4L2ppYngtZG9jbGl0LWV4YW1wbGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzAzICswLDAgQEAKLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iDQotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4NCi08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+DQotPGhlYWQ+DQotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PQ0KLSJIVE1MIFRpZHkgZm9yIFdpbmRvd3MgKHZlcnMgMTQgSnVuZSAyMDA3KSwgc2VlIHd3dy53My5vcmciIC8+DQotPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSIiIC8+DQotPHRpdGxlPkppQlggZ2VuZXJhbCBkb2N1bWVudC9saXRlcmFsPC90aXRsZT4NCi08bGluayBocmVmPSIuLi8uLi9jc3MvYXhpcy1kb2NzLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPQ0KLSJ0ZXh0L2NzcyIgbWVkaWE9ImFsbCIgLz4NCi08L2hlYWQ+DQotPGJvZHk+DQotPGgxPkppQlggZ2VuZXJhbCBkb2N1bWVudC9saXRlcmFsPC9oMT4NCi08cD5Db2RlIGdlbmVyYXRpb24gZm9yIEppQlggZGF0YSBiaW5kaW5nIGNvbnZlcnRzIG9wZXJhdGlvbnMNCi1kZWZpbmVkIGJ5IGEgV2ViIHNlcnZpY2UgdG8gbWV0aG9kIGNhbGxzLiBXaXRoIGdlbmVyYWwNCi1kb2N1bWVudC9saXRlcmFsIChkb2MvbGl0KSBXZWIgc2VydmljZXMgdGhlIGdlbmVyYXRlZCBtZXRob2RzIGVhY2gNCi10YWtlIGEgc2luZ2xlIHBhcmFtZXRlciBvYmplY3QgYW5kIHJldHVybiBhIHNpbmdsZSByZXN1bHQgb2JqZWN0Lg0KLUhlcmUncyBhIHNhbXBsZSBkb2MvbGl0IFdTREwgKHBhcnRpYWwpIGJ5IHdheSBvZiBhbiBleGFtcGxlOjwvcD4NCi08cHJlPg0KLSZsdDt3c2RsOmRlZmluaXRpb25zIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3dzLnNvc25vc2tpLmNvbS9saWJyYXJ5L3dzZGwiDQotICAgIHhtbG5zOnRucz0iaHR0cDovL3dzLnNvc25vc2tpLmNvbS9saWJyYXJ5L3R5cGVzIg0KLSAgICB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyINCi0gICAgeG1sbnM6d3NkbHNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iJmd0Ow0KLSAgICANCi0gICZsdDt3c2RsOnR5cGVzJmd0Ow0KLSAgDQotICAgICZsdDtzY2hlbWEgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiDQotICAgICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93cy5zb3Nub3NraS5jb20vbGlicmFyeS90eXBlcyINCi0gICAgICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSImZ3Q7DQotICAgICAgICANCi0gICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJnZXRCb29rIiZndDsNCi0gICAgICAgICZsdDtjb21wbGV4VHlwZSZndDsNCi0gICAgICAgICAgJmx0O3NlcXVlbmNlJmd0Ow0KLSAgICAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9ImlzYm4iIHR5cGU9InN0cmluZyIvJmd0Ow0KLSAgICAgICAgICAmbHQ7L3NlcXVlbmNlJmd0Ow0KLSAgICAgICAgJmx0Oy9jb21wbGV4VHlwZSZndDsNCi0gICAgICAmbHQ7L2VsZW1lbnQmZ3Q7DQotICAgICAgDQotICAgICAgJmx0O2VsZW1lbnQgbmFtZT0iZ2V0Qm9va1Jlc3BvbnNlIiZndDsNCi0gICAgICAgICZsdDtjb21wbGV4VHlwZSZndDsNCi0gICAgICAgICAgJmx0O3NlcXVlbmNlJmd0Ow0KLSAgICAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9ImJvb2siIG1pbk9jY3Vycz0iMCIgdHlwZT0idG5zOkJvb2tJbmZvcm1hdGlvbiIvJmd0Ow0KLSAgICAgICAgICAmbHQ7L3NlcXVlbmNlJmd0Ow0KLSAgICAgICAgJmx0Oy9jb21wbGV4VHlwZSZndDsNCi0gICAgICAmbHQ7L2VsZW1lbnQmZ3Q7DQotICAgICAgDQotICAgICAgJmx0O2VsZW1lbnQgbmFtZT0iYWRkQm9vayImZ3Q7DQotICAgICAgICAmbHQ7Y29tcGxleFR5cGUmZ3Q7DQotICAgICAgICAgICZsdDtzZXF1ZW5jZSZndDsNCi0gICAgICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJ0eXBlIiB0eXBlPSJzdHJpbmciLyZndDsNCi0gICAgICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJpc2JuIiB0eXBlPSJzdHJpbmciLyZndDsNCi0gICAgICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJhdXRob3IiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHR5cGU9InN0cmluZyIvJmd0Ow0KLSAgICAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9InRpdGxlIiB0eXBlPSJzdHJpbmciLyZndDsNCi0gICAgICAgICAgJmx0Oy9zZXF1ZW5jZSZndDsNCi0gICAgICAgICZsdDsvY29tcGxleFR5cGUmZ3Q7DQotICAgICAgJmx0Oy9lbGVtZW50Jmd0Ow0KLSAgICAgIA0KLSAgICAgICZsdDtlbGVtZW50IG5hbWU9ImFkZEJvb2tSZXNwb25zZSImZ3Q7DQotICAgICAgICAmbHQ7Y29tcGxleFR5cGUmZ3Q7DQotICAgICAgICAgICZsdDtzZXF1ZW5jZSZndDsNCi0gICAgICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJzdWNjZXNzIiB0eXBlPSJib29sZWFuIi8mZ3Q7DQotICAgICAgICAgICZsdDsvc2VxdWVuY2UmZ3Q7DQotICAgICAgICAmbHQ7L2NvbXBsZXhUeXBlJmd0Ow0KLSAgICAgICZsdDsvZWxlbWVudCZndDsNCi0gICAgICANCi0gICAgICAmbHQ7Y29tcGxleFR5cGUgbmFtZT0iQm9va0luZm9ybWF0aW9uIiZndDsNCi0gICAgICAgICZsdDtzZXF1ZW5jZSZndDsNCi0gICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0iYXV0aG9yIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiB0eXBlPSJzdHJpbmciLyZndDsNCi0gICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0idGl0bGUiIHR5cGU9InN0cmluZyIvJmd0Ow0KLSAgICAgICAgJmx0Oy9zZXF1ZW5jZSZndDsNCi0gICAgICAgICZsdDthdHRyaWJ1dGUgbmFtZT0idHlwZSIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ic3RyaW5nIi8mZ3Q7DQotICAgICAgICAmbHQ7YXR0cmlidXRlIG5hbWU9ImlzYm4iIHVzZT0icmVxdWlyZWQiIHR5cGU9InN0cmluZyIvJmd0Ow0KLSAgICAgICZsdDsvY29tcGxleFR5cGUmZ3Q7DQotICAgICAgDQotICAgICZsdDsvc2NoZW1hJmd0Ow0KLQ0KLSAgJmx0Oy93c2RsOnR5cGVzJmd0Ow0KLQ0KLSAgJmx0O3dzZGw6bWVzc2FnZSBuYW1lPSJnZXRCb29rUmVxdWVzdCImZ3Q7DQotICAgICZsdDt3c2RsOnBhcnQgZWxlbWVudD0id25zOmdldEJvb2siIG5hbWU9InBhcmFtZXRlcnMiLyZndDsNCi0gICZsdDsvd3NkbDptZXNzYWdlJmd0Ow0KLQ0KLSAgJmx0O3dzZGw6bWVzc2FnZSBuYW1lPSJnZXRCb29rUmVzcG9uc2UiJmd0Ow0KLSAgICAmbHQ7d3NkbDpwYXJ0IGVsZW1lbnQ9InduczpnZXRCb29rUmVzcG9uc2UiIG5hbWU9InBhcmFtZXRlcnMiLyZndDsNCi0gICZsdDsvd3NkbDptZXNzYWdlJmd0Ow0KLQ0KLSAgJmx0O3dzZGw6bWVzc2FnZSBuYW1lPSJhZGRCb29rUmVxdWVzdCImZ3Q7DQotICAgICZsdDt3c2RsOnBhcnQgZWxlbWVudD0id25zOmFkZEJvb2siIG5hbWU9InBhcmFtZXRlcnMiLyZndDsNCi0gICZsdDsvd3NkbDptZXNzYWdlJmd0Ow0KLSAgDQotICAmbHQ7d3NkbDptZXNzYWdlIG5hbWU9ImFkZEJvb2tSZXNwb25zZSImZ3Q7DQotICAgICZsdDt3c2RsOnBhcnQgZWxlbWVudD0id25zOmFkZEJvb2tSZXNwb25zZSIgbmFtZT0icGFyYW1ldGVycyIvJmd0Ow0KLSAgJmx0Oy93c2RsOm1lc3NhZ2UmZ3Q7DQotDQotICAmbHQ7d3NkbDpwb3J0VHlwZSBuYW1lPSJMaWJyYXJ5IiZndDsNCi0NCi0gICAgJmx0O3dzZGw6b3BlcmF0aW9uIG5hbWU9ImdldEJvb2siJmd0Ow0KLSAgICAgICZsdDt3c2RsOmlucHV0IG1lc3NhZ2U9InduczpnZXRCb29rUmVxdWVzdCIgbmFtZT0iZ2V0Qm9va1JlcXVlc3QiLyZndDsNCi0gICAgICAmbHQ7d3NkbDpvdXRwdXQgbWVzc2FnZT0id25zOmdldEJvb2tSZXNwb25zZSIgbmFtZT0iZ2V0Qm9va1Jlc3BvbnNlIi8mZ3Q7DQotICAgICZsdDsvd3NkbDpvcGVyYXRpb24mZ3Q7DQotDQotICAgICZsdDt3c2RsOm9wZXJhdGlvbiBuYW1lPSJhZGRCb29rIiZndDsNCi0gICAgICAmbHQ7d3NkbDppbnB1dCBtZXNzYWdlPSJ3bnM6YWRkQm9va1JlcXVlc3QiIG5hbWU9ImFkZEJvb2tSZXF1ZXN0Ii8mZ3Q7DQotICAgICAgJmx0O3dzZGw6b3V0cHV0IG1lc3NhZ2U9InduczphZGRCb29rUmVzcG9uc2UiIG5hbWU9ImFkZEJvb2tSZXNwb25zZSIvJmd0Ow0KLSAgICAmbHQ7L3dzZGw6b3BlcmF0aW9uJmd0Ow0KLQ0KLSAgJmx0Oy93c2RsOnBvcnRUeXBlJmd0Ow0KLSAgLi4uDQotJmx0Oy93c2RsOmRlZmluaXRpb25zJmd0Ow0KLTwvcHJlPg0KLTxwPlRoaXMgV1NETCBkZWZpbmVzIGEgc2VydmljZSB3aXRoIGp1c3QgdHdvIG9wZXJhdGlvbnM6DQotPGI+Z2V0Qm9vazwvYj4gYW5kIDxiPmFkZEJvb2s8L2I+LiBUaGUgPGI+Z2V0Qm9vazwvYj4gb3BlcmF0aW9uDQotdGFrZXMgYSA8aT5nZXRCb29rPC9pPiBlbGVtZW50IGFzIGlucHV0LCBhbmQgcmV0dXJucyBhDQotPGk+Z2V0Qm9va1Jlc3BvbnNlPC9pPiBlbGVtZW50IGFzIG91dHB1dCwgd2hpbGUgPGI+YWRkQm9vazwvYj4NCi10YWtlcyBhbiA8aT5hZGRCb29rPC9pPiBlbGVtZW50IGFzIGlucHV0IGFuZCByZXR1cm5zIGFuDQotPGk+YWRkQm9va1Jlc3BvbnNlPC9pPiBhcyBvdXRwdXQuIEhlcmUncyB0aGUgYm9keSBvZiB0aGUgY2xpZW50DQotaW50ZXJmYWNlIGdlbmVyYXRlZCBieSB0aGUgc3RhbmRhcmQgSmlCWCBjb2RlIGdlbmVyYXRpb246PC9wPg0KLTxwcmU+DQotICAgIHB1YmxpYyBpbnRlcmZhY2UgTGlicmFyeUppYnhVbndyYXBwZWQgew0KLSAgICAgICAgICANCi0gICAgICAgICAgICAgDQotICAgICAgICAvKioNCi0gICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIG1ldGhvZCBzaWduYXR1cmVzDQotICAgICAgICAgKiBAcGFyYW0gYWRkQm9vaw0KLSAgICAgICAgICovDQotICAgICAgICAgcHVibGljIGNvbS5zb3Nub3NraS53cy5saWJyYXJ5LmppYngud3JhcHBlcnMuQWRkQm9va1Jlc3BvbnNlIGFkZEJvb2soDQotICAgICAgICAgY29tLnNvc25vc2tpLndzLmxpYnJhcnkuamlieC53cmFwcGVycy5BZGRCb29rUmVxdWVzdCBhZGRCb29rKSB0aHJvd3MgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uDQotICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgIDsNCi0gICAgICAgICAgICAgDQotICAgICAgICAgICAgIA0KLSAgICAgICAgLyoqDQotICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBtZXRob2Qgc2lnbmF0dXJlcw0KLSAgICAgICAgICogQHBhcmFtIGdldEJvb2sNCi0gICAgICAgICAqLw0KLSAgICAgICAgIHB1YmxpYyBjb20uc29zbm9za2kud3MubGlicmFyeS5qaWJ4LndyYXBwZXJzLkdldEJvb2tSZXNwb25zZSBnZXRCb29rKA0KLSAgICAgICAgIGNvbS5zb3Nub3NraS53cy5saWJyYXJ5LmppYngud3JhcHBlcnMuR2V0Qm9va1JlcXVlc3QgZ2V0Qm9vaykgdGhyb3dzIGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbg0KLSAgICAgICAgICANCi0gICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICA7DQotICAgICAgICAgICAgIA0KLQ0KLSAgICAgICAgDQotICAgICAgIC8vDQotICAgICAgIH0NCi08L3ByZT4NCi08cD5Zb3UgY2FuIHNlZSB0aGF0IHRoZSBKaUJYIGNvZGUgZ2VuZXJhdGlvbiBjb252ZXJ0ZWQgdGhlDQotb3BlcmF0aW9ucyBpbnRvIHNpbXBsZSBtZXRob2QgY2FsbCBpbnRlcmZhY2VzIHVzaW5nIG9iamVjdHMNCi1jb3JyZXNwb25kaW5nIHRvIHRoZSBpbnB1dCBhbmQgb3V0cHV0IGVsZW1lbnRzIG9mIHRoZSBvcGVyYXRpb24NCi0oc2VlIDxhIGhyZWY9Ii4vamlieC11bndyYXBwZWQtZXhhbXBsZS5odG1sIj5KaUJYIFVud3JhcHBlZA0KLUV4YW1wbGU8L2E+IGZvciB0aGUgaW50ZXJmYWNlIGdlbmVyYXRlZCB3aGVuIHVud3JhcHBpbmcgaXMgaW5zdGVhZA0KLXVzZWQpLiBUaGUgc2VydmVyLXNpZGUgaW50ZXJmYWNlIGlzIHRoZSBzYW1lLjwvcD4NCi08cD5Zb3UgbmVlZCB0byBzdXBwbHkgYW4gYXBwcm9wcmlhdGUgSmlCWCBiaW5kaW5nIGRlZmluaXRpb24gZm9yDQotdXNlIGluIGNvZGUgZ2VuZXJhdGlvbiAodXNpbmcgdGhlIDxpPi1FYmluZGluZ2ZpbGUge2ZpbGV9PC9pPg0KLXBhcmFtZXRlciBmb3IgV1NETDJKYXZhIC0gc2VlIDxhIGhyZWY9DQotIi4vamlieC1jb2RlZ2VuLWludGVncmF0aW9uLmh0bWwjY29kZWdlbiI+SmlCWCBDb2RlZ2VuIEludGVncmF0aW9uDQotLSBXU0RMMkphdmEgdXNhZ2U8L2E+IGZvciBtb3JlIGRldGFpbHMpLiBUaGlzIG11c3QgZGVmaW5lIGNvbmNyZXRlDQotPGk+bWFwcGluZ3M8L2k+IGZvciBlYWNoIGVsZW1lbnQgdXNlZCBhcyB0aGUgaW5wdXQgb3Igb3V0cHV0IG9mIGFuDQotb3BlcmF0aW9uLiBUaGUgSmlCWCBjb2RlIGdlbmVyYXRpb24gZXh0ZW5zaW9uIG1hdGNoZXMgdGhlIGVsZW1lbnQNCi1uYW1lcyB0byB0aGUgYmluZGluZyBpbiBvcmRlciB0byBkZXRlcm1pbmUgdGhlIGNvcnJlc3BvbmRpbmcgY2xhc3MNCi10byB1c2UgaW4gZ2VuZXJhdGVkIGNvZGUuPC9wPg0KLTxwPkZvciBleGFtcGxlLCBoZXJlJ3MgYSBiaW5kaW5nIGRlZmluaXRpb24gdGhhdCBtYXRjaGVzIHRoZSBhYm92ZQ0KLVdTREw6PC9wPg0KLTxwcmU+DQotJmx0O2JpbmRpbmcgYWRkLWNvbnN0cnVjdG9ycz0idHJ1ZSImZ3Q7DQotDQotICAmbHQ7bmFtZXNwYWNlIHVyaT0iaHR0cDovL3dzLnNvc25vc2tpLmNvbS9saWJyYXJ5L3R5cGVzIiBkZWZhdWx0PSJlbGVtZW50cyIvJmd0Ow0KLSAgDQotICAmbHQ7bWFwcGluZyBuYW1lPSJnZXRCb29rIg0KLSAgICAgIGNsYXNzPSJjb20uc29zbm9za2kud3MubGlicmFyeS5qaWJ4LndyYXBwZXJzLkdldEJvb2tSZXF1ZXN0IiZndDsNCi0gICAgJmx0O3ZhbHVlIG5hbWU9ImlzYm4iIGZpZWxkPSJtX2lzYm4iLyZndDsNCi0gICZsdDsvbWFwcGluZyZndDsNCi0gIA0KLSAgJmx0O21hcHBpbmcgbmFtZT0iZ2V0Qm9va1Jlc3BvbnNlIg0KLSAgICAgIGNsYXNzPSJjb20uc29zbm9za2kud3MubGlicmFyeS5qaWJ4LndyYXBwZXJzLkdldEJvb2tSZXNwb25zZSImZ3Q7DQotICAgICZsdDtzdHJ1Y3R1cmUgbmFtZT0iYm9vayIgZmllbGQ9Im1fYm9vayIvJmd0Ow0KLSAgJmx0Oy9tYXBwaW5nJmd0Ow0KLSAgDQotICAmbHQ7bWFwcGluZyBuYW1lPSJhZGRCb29rIg0KLSAgICAgIGNsYXNzPSJjb20uc29zbm9za2kud3MubGlicmFyeS5qaWJ4LndyYXBwZXJzLkFkZEJvb2tSZXF1ZXN0IiZndDsNCi0gICAgJmx0O3N0cnVjdHVyZSBmaWVsZD0ibV9ib29rIiZndDsNCi0gICAgICAmbHQ7dmFsdWUgbmFtZT0idHlwZSIgZmllbGQ9Im1fdHlwZSIvJmd0Ow0KLSAgICAgICZsdDt2YWx1ZSBuYW1lPSJpc2JuIiBmaWVsZD0ibV9pc2JuIi8mZ3Q7DQotICAgICAgJmx0O2NvbGxlY3Rpb24gZmllbGQ9Im1fYXV0aG9ycyImZ3Q7DQotICAgICAgICAmbHQ7dmFsdWUgbmFtZT0iYXV0aG9yIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8mZ3Q7DQotICAgICAgJmx0Oy9jb2xsZWN0aW9uJmd0Ow0KLSAgICAgICZsdDt2YWx1ZSBuYW1lPSJ0aXRsZSIgZmllbGQ9Im1fdGl0bGUiLyZndDsNCi0gICAgJmx0Oy9zdHJ1Y3R1cmUmZ3Q7DQotICAmbHQ7L21hcHBpbmcmZ3Q7DQotICANCi0gICZsdDttYXBwaW5nIG5hbWU9ImFkZEJvb2tSZXNwb25zZSINCi0gICAgICBjbGFzcz0iY29tLnNvc25vc2tpLndzLmxpYnJhcnkuamlieC53cmFwcGVycy5BZGRCb29rUmVzcG9uc2UiLyZndDsNCi0gIA0KLSAgJmx0O21hcHBpbmcgYWJzdHJhY3Q9InRydWUiIGNsYXNzPSJjb20uc29zbm9za2kud3MubGlicmFyeS5qaWJ4LmJlYW5zLkJvb2siJmd0Ow0KLSAgICAmbHQ7dmFsdWUgbmFtZT0idHlwZSIgc3R5bGU9ImF0dHJpYnV0ZSIgZmllbGQ9Im1fdHlwZSIvJmd0Ow0KLSAgICAmbHQ7dmFsdWUgbmFtZT0iaXNibiIgc3R5bGU9ImF0dHJpYnV0ZSIgZmllbGQ9Im1faXNibiIvJmd0Ow0KLSAgICAmbHQ7Y29sbGVjdGlvbiBmaWVsZD0ibV9hdXRob3JzIiZndDsNCi0gICAgICAmbHQ7dmFsdWUgbmFtZT0iYXV0aG9yIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8mZ3Q7DQotICAgICZsdDsvY29sbGVjdGlvbiZndDsNCi0gICAgJmx0O3ZhbHVlIG5hbWU9InRpdGxlIiBmaWVsZD0ibV90aXRsZSIvJmd0Ow0KLSAgJmx0Oy9tYXBwaW5nJmd0Ow0KLQ0KLSZsdDsvYmluZGluZyZndDsNCi08L3ByZT4NCi08cD5BbmQgaGVyZSBhcmUgdGhlIGFjdHVhbCBkYXRhIG9iamVjdCBjbGFzc2VzOjwvcD4NCi08cHJlPg0KLXBhY2thZ2UgY29tLnNvc25vc2tpLndzLmxpYnJhcnkuamlieC53cmFwcGVyczsNCi0NCi1pbXBvcnQgY29tLnNvc25vc2tpLndzLmxpYnJhcnkuamlieC5iZWFucy5Cb29rOw0KLQ0KLXB1YmxpYyBjbGFzcyBBZGRCb29rUmVxdWVzdA0KLXsNCi0gICAgcHJpdmF0ZSBCb29rIG1fYm9vazsNCi0gICAgDQotICAgIHB1YmxpYyBBZGRCb29rUmVxdWVzdChCb29rIGJvb2spIHsNCi0gICAgICAgIG1fYm9vayA9IGJvb2s7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyBCb29rIGdldEJvb2soKSB7DQotICAgICAgICByZXR1cm4gbV9ib29rOw0KLSAgICB9DQotfQ0KLQ0KLXB1YmxpYyBjbGFzcyBBZGRCb29rUmVzcG9uc2UNCi17DQotfQ0KLQ0KLXB1YmxpYyBjbGFzcyBHZXRCb29rUmVxdWVzdA0KLXsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgbV9pc2JuOw0KLSAgICANCi0gICAgcHVibGljIEdldEJvb2tSZXF1ZXN0KFN0cmluZyBpc2JuKSB7DQotICAgICAgICBtX2lzYm4gPSBpc2JuOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SXNibigpIHsNCi0gICAgICAgIHJldHVybiBtX2lzYm47DQotICAgIH0NCi19DQotDQotcHVibGljIGNsYXNzIEdldEJvb2tSZXNwb25zZQ0KLXsNCi0gICAgcHJpdmF0ZSBCb29rIG1fYm9vazsNCi0gICAgDQotICAgIHB1YmxpYyBHZXRCb29rUmVzcG9uc2UoQm9vayBib29rKSB7DQotICAgICAgICBtX2Jvb2sgPSBib29rOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgQm9vayBnZXRCb29rKCkgew0KLSAgICAgICAgcmV0dXJuIG1fYm9vazsNCi0gICAgfQ0KLX0NCi0NCi1wYWNrYWdlIGNvbS5zb3Nub3NraS53cy5saWJyYXJ5LmppYnguYmVhbnM7DQotDQotcHVibGljIGNsYXNzIEJvb2sNCi17DQotICAgIHByaXZhdGUgU3RyaW5nIG1fdHlwZTsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgbV9pc2JuOw0KLSAgICBwcml2YXRlIFN0cmluZyBtX3RpdGxlOw0KLSAgICBwcml2YXRlIFN0cmluZ1tdIG1fYXV0aG9yczsNCi0gICAgDQotICAgIHB1YmxpYyBCb29rKCkge30NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRUeXBlKCkgew0KLSAgICAgICAgcmV0dXJuIG1fdHlwZTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIFN0cmluZyBnZXRJc2JuKCkgew0KLSAgICAgICAgcmV0dXJuIG1faXNibjsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIFN0cmluZyBnZXRUaXRsZSgpIHsNCi0gICAgICAgIHJldHVybiBtX3RpdGxlOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0QXV0aG9ycygpIHsNCi0gICAgICAgIHJldHVybiBtX2F1dGhvcnM7DQotICAgIH0NCi19DQotPC9wcmU+DQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvamlieC9qaWJ4LXVud3JhcHBlZC1leGFtcGxlLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9qaWJ4L2ppYngtdW53cmFwcGVkLWV4YW1wbGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzRhMGQxLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9qaWJ4L2ppYngtdW53cmFwcGVkLWV4YW1wbGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjgxICswLDAgQEAKLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+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+DQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvanNvbl9zdXBwb3J0LnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9qc29uX3N1cHBvcnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTYxNTU3Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9qc29uX3N1cHBvcnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjE5ICswLDAgQEAKLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+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+DQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvbWlncmF0aW9uLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9taWdyYXRpb24ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjdkODE4Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9taWdyYXRpb24ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzE3ICswLDAgQEAKLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+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+DQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvbW9kdWxlcy54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvbW9kdWxlcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjN2JmMmMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL21vZHVsZXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzkyICswLDAgQEAKLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+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+DQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvbXRvbS1ndWlkZS54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvbXRvbS1ndWlkZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwNGU5YTkuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL210b20tZ3VpZGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzI4ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+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+KTs8L3ByZT4KLTwvc291cmNlPjwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9wb2pvZ3VpZGUueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL3Bvam9ndWlkZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4NmEzNWYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL3Bvam9ndWlkZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2NDkgKzAsMCBAQAotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+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+DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL3F1aWNrc3RhcnRndWlkZS54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvcXVpY2tzdGFydGd1aWRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWYyMjhkZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvcXVpY2tzdGFydGd1aWRlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDExMTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi0NCi08IS0tDQotICB+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+DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL3JlZmVyZW5jZS54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvcmVmZXJlbmNlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFlZTNhNC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvcmVmZXJlbmNlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIg0KLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+DQotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPg0KLTxoZWFkPg0KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0NCi0iSFRNTCBUaWR5IGZvciBXaW5kb3dzICh2ZXJzIDE0IEp1bmUgMjAwNyksIHNlZSB3d3cudzMub3JnIiAvPg0KLTxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0iIiAvPg0KLTx0aXRsZT5BeGlzMiBSZWZlcmVuY2UgR3VpZGU8L3RpdGxlPg0KLTxsaW5rIGhyZWY9Ii4uL2Nzcy9heGlzLWRvY3MuY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIg0KLW1lZGlhPSJhbGwiIC8+DQotPC9oZWFkPg0KLTxib2R5IGxhbmc9ImVuLVVTIiBkaXI9Imx0ciIgeG1sOmxhbmc9ImVuLVVTIj4NCi08YSBuYW1lPSJfVG9jOTY2OTc4NDkiIGlkPSJfVG9jOTY2OTc4NDkiPjwvYT4NCi08aDEgYWxpZ249ImNlbnRlciI+QXhpczIgUmVmZXJlbmNlIEd1aWRlPC9oMT4NCi08YSBuYW1lPSJ3c2RsMmNvZGUiIGlkPSJ3c2RsMmNvZGUiPjwvYT4NCi08aDI+V1NETDJKYXZhIFJlZmVyZW5jZTwvaDI+DQotPHByZT4NCi1OQU1FDQotICAgICAgIHdzZGwyamF2YS5zaCBvciB3c2RsMmphdmEuYmF0IC0gR2VuZXJhdGVzIGphdmEgY29kZSBhY2NvcmRpbmcgdG8gYSBnaXZlbiBXU0RMIGZpbGUgdG8gaGFuZGxlIFdlYiBzZXJ2aWNlIGludm9jYXRpb24uDQotICAgICAgIFRoZXNlIHNjcmlwdHMgY2FuIGJlIGZvdW5kIHVuZGVyIHRoZSBiaW4gZGlyZWN0b3J5IG9mIHRoZSBBeGlzMiBkaXN0cmlidXRpb24uDQotDQotU1lOT1BTSVMNCi0gICAgICAgd3NkbDJqYXZhLnNoIFtPUFRJT05dLi4uIC11cmkgJmx0O0xvY2F0aW9uIG9mIFdTREwmZ3Q7DQotDQotREVTQ1JJUFRJT04NCi0gICAgICAgR2l2ZW4gYSBXU0RMIGZpbGUsIHRoaXMgZ2VuZXJhdGVzIGphdmEgY29kZSB0byBoYW5kbGUgV2ViIHNlcnZpY2UgaW52b2NhdGlvbnMuDQotDQotICAgICAgLW8gJmx0O3BhdGgmZ3Q7ICAgICAgICAgIFNwZWNpZnkgYSBkaXJlY3RvcnkgcGF0aCBmb3IgdGhlIGdlbmVyYXRlZCBjb2RlLg0KLSAgICAgIC1hICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmF0ZSBhc3luYyBzdHlsZSBjb2RlIG9ubHkgKERlZmF1bHQ6IG9mZikuDQotICAgICAgLXMgICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRlIHN5bmMgc3R5bGUgY29kZSBvbmx5IChEZWZhdWx0OiBvZmYpLiBUYWtlcyBwcmVjZWRlbmNlIG92ZXIgLWEuDQotICAgICAgLXAgJmx0O3BrZzEmZ3Q7ICAgICAgICAgIFNwZWNpZnkgYSBjdXN0b20gcGFja2FnZSBuYW1lIGZvciB0aGUgZ2VuZXJhdGVkIGNvZGUuDQotICAgICAgLWwgJmx0O2xhbmd1YWdlJmd0OyAgICAgIFZhbGlkIGxhbmd1YWdlcyBhcmUgamF2YSBhbmQgYyAoRGVmYXVsdDogamF2YSkuDQotICAgICAgLXQgICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRlIGEgdGVzdCBjYXNlIGZvciB0aGUgZ2VuZXJhdGVkIGNvZGUuDQotICAgICAgLXNzICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRlIHNlcnZlciBzaWRlIGNvZGUgKGkuZS4gc2tlbGV0b25zKSAoRGVmYXVsdDogb2ZmKS4NCi0gICAgICAtc2QgICAgICAgICAgICAgICAgICAgICAgR2VuZXJhdGUgc2VydmljZSBkZXNjcmlwdG9yIChpLmUuIHNlcnZpY2VzLnhtbCkuIChEZWZhdWx0OiBvZmYpLiBWYWxpZCB3aXRoIC1zcy4NCi0gICAgICAtZCAmbHQ7ZGF0YWJpbmRpbmcmZ3Q7ICAgVmFsaWQgZGF0YWJpbmRpbmcocykgYXJlIGFkYiwgeG1sYmVhbnMsIGppYnggYW5kIGpheGJyaSAoRGVmYXVsdDogYWRiKS4NCi0gICAgICAtZyAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJhdGVzIGFsbCB0aGUgY2xhc3Nlcy4gVmFsaWQgb25seSB3aXRoIC1zcy4NCi0gICAgICAtcG4gJmx0O3BvcnRfbmFtZSZndDsgICAgQ2hvb3NlIGEgc3BlY2lmaWMgcG9ydCB3aGVuIHRoZXJlIGFyZSBtdWx0aXBsZSBwb3J0cyBpbiB0aGUgd3NkbC4NCi0gICAgICAtc24gJmx0O3NlcnZpY2VfbmFtZSZndDsgQ2hvb3NlIGEgc3BlY2lmaWMgc2VydmljZSB3aGVuIHRoZXJlIGFyZSBtdWx0aXBsZSBzZXJ2aWNlcyBpbiB0aGUgd3NkbC4NCi0gICAgICAtdSAgICAgICAgICAgICAgICAgICAgICAgVW5wYWNrcyB0aGUgZGF0YWJpbmRpbmcgY2xhc3Nlcw0KLSAgICAgIC1yICZsdDtwYXRoJmd0OyAgICAgICAgICBTcGVjaWZ5IGEgcmVwb3NpdG9yeSBhZ2FpbnN0IHdoaWNoIGNvZGUgaXMgZ2VuZXJhdGVkLg0KLSAgICAgIC1uczJwIG5zMT1wa2cxLG5zMj1wa2cyICBTcGVjaWZ5IGEgY3VzdG9tIHBhY2thZ2UgbmFtZSBmb3IgZWFjaCBuYW1lc3BhY2Ugc3BlY2lmaWVkIGluIHRoZSB3c2RscyBzY2hlbWEuDQotICAgICAgLXNzaSAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRlIGFuIGludGVyZmFjZSBmb3IgdGhlIHNlcnZpY2UgaW1wbGVtZW50YXRpb24gKERlZmF1bHQ6IG9mZikuDQotICAgICAgLXd2ICZsdDt2ZXJzaW9uJmd0OyAgICAgIFdTREwgVmVyc2lvbi4gVmFsaWQgT3B0aW9ucyA6IDIsIDIuMCwgMS4xDQotICAgICAgLVMgICAgICAgICAgICAgICAgICAgICAgIFNwZWNpZnkgYSBkaXJlY3RvcnkgcGF0aCBmb3IgZ2VuZXJhdGVkIHNvdXJjZQ0KLSAgICAgIC1SICAgICAgICAgICAgICAgICAgICAgICBTcGVjaWZ5IGEgZGlyZWN0b3J5IHBhdGggZm9yIGdlbmVyYXRlZCByZXNvdXJjZXMNCi0gICAgICAtZW0gICAgICAgICAgICAgICAgICAgICAgU3BlY2lmeSBhbiBleHRlcm5hbCBtYXBwaW5nIGZpbGUNCi0gICAgICAtZiAgICAgICAgICAgICAgICAgICAgICAgRmxhdHRlbnMgdGhlIGdlbmVyYXRlZCBmaWxlcw0KLSAgICAgIC11dyAgICAgICAgICAgICAgICAgICAgICBTd2l0Y2ggb24gdW4td3JhcHBpbmcuDQotICAgICAgLXhzZGNvbmZpZyAmbHQ7ZmlsZSBwYXRoJmd0OyAgIFVzZSBYTUxCZWFucyAueHNkY29uZmlnIGZpbGUuIFZhbGlkIG9ubHkgd2l0aCAtZCB4bWxiZWFucy4NCi0gICAgICAtYXAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJhdGUgY29kZSBmb3IgYWxsIHBvcnRzDQotICAgICAgLW9yICAgICAgICAgICAgICAgICAgICAgIE92ZXJ3cml0ZSB0aGUgZXhpc3RpbmcgY2xhc3Nlcw0KLSAgICAgIC1iICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmF0ZSBBeGlzIDEueCBiYWNrd29yZCBjb21wYXRpYmxlIGNvZGUuDQotICAgICAgLXNwICAgICAgICAgICAgICAgICAgICAgIFN1cHByZXNzIG5hbWVzcGFjZSBwcmVmaXhlcyAoT3B0aW16YXRpb24gdGhhdCByZWR1Y2VzIHNpemUgb2Ygc29hcCByZXF1ZXN0L3Jlc3BvbnNlKQ0KLSAgICAgIC1FJmx0O2tleSZndDsgJmx0O3ZhbHVlJmd0OyAgICAgICAgICBFeHRyYSBjb25maWd1cmF0aW9uIG9wdGlvbnMgc3BlY2lmaWMgdG8gY2VydGFpbiBkYXRhYmluZGluZ3MuIEV4YW1wbGVzOg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtRWJpbmRpbmdmaWxlICZsdDtwYXRoJmd0OyAgICAgICAgICAgICAgICAgICAoZm9yIGppYngpIC0gc3BlY2lmeSB0aGUgZmlsZSBwYXRoIGZvciB0aGUgYmluZGluZyBmaWxlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1FdHlwZXN5c3RlbW5hbWUgJmx0O215X3R5cGVfc3lzdGVtX25hbWUmZ3Q7IChmb3IgeG1sYmVhbnMpIC0gb3ZlcnJpZGUgdGhlIHJhbmRvbWx5IGdlbmVyYXRlZCB0eXBlIHN5c3RlbSBuYW1lDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1FamF2YXZlcnNpb24gMS41ICAgICAgICAgICAgICAgICAgICAgIChmb3IgeG1sYmVhbnMpIC0gZ2VuZXJhdGVzIEphdmEgMS41IGNvZGUgKHR5cGVkIGxpc3RzIGluc3RlYWQgb2YgYXJyYXlzKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtRW1wICZsdDtwYWNrYWdlIG5hbWUmZ3Q7IChmb3IgQURCKSAtIGV4dGVuc2lvbiBtYXBwZXIgcGFja2FnZSBuYW1lDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1Fb3N2IChmb3IgQURCKSAtIHR1cm4gb2ZmIHN0cmljdCB2YWxpZGF0aW9uLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtRXdkYyAoZm9yIHhtbGJlYW5zKSAtIEdlbmVyYXRlIGNvZGUgd2l0aCBhIGR1bW15IHNjaGVtYS4gaWYgc29tZW9uZSB1c2UgdGhpcyBvcHRpb24NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhleSBoYXZlIHRvIGdlbmVyYXRlIHRoZSB4bWxiZWFucyBjb2RlIHNlcGVyYXRlbHkgd2l0aCB0aGUgc2NvbXAgY29tbWFuZCBjb21lcyB3aXRoIHRoZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxiZWFucyBkaXN0cmlidXRpb24gYW5kIHJlcGxhY2UgdGhlIEF4aXMyIGdlbmVyYXRlZCBjbGFzc2VzIHdpdGggY29ycmVjdCBjbGFzc2VzDQotICAgICAgLS1ub0J1aWxkWE1MICAgICAgICAgICAgIERvbnQgZ2VuZXJhdGUgdGhlIGJ1aWxkLnhtbCBpbiB0aGUgb3V0cHV0IGRpcmVjdG9yeQ0KLSAgICAgIC0tbm9XU0RMICAgICAgICAgICAgICAgICBEb250IGdlbmVyYXRlIFdTRExzIGluIHRoZSByZXNvdXJjZXMgZGlyZWN0b3J5DQotICAgICAgLS1ub01lc3NhZ2VSZWNlaXZlciAgICAgIERvbnQgZ2VuZXJhdGUgYSBNZXNzYWdlUmVjZWl2ZXIgaW4gdGhlIGdlbmVyYXRlZCBzb3VyY2VzDQotICAgICAgLS1odHRwLXByb3h5LWhvc3QgICAgICAgIFByb3h5IGhvc3QgYWRkcmVzcyBpZiB5b3UgYXJlIGJlaGluZCBhIGZpcmV3YWxsDQotICAgICAgLS1odHRwLXByb3h5LXBvcnQgICAgICAgIFByb3h5IHByb3QgYWRkcmVzcyBpZiB5b3UgYXJlIGJlaGluZCBhIGZpcmV3YWxsDQotICAgICAgLWVwICAgICAgICAgICAgICAgICAgICAgIEV4Y2x1ZGUgcGFja2FnZXMgLSB0aGVzZSBwYWNrYWdlcyBhcmUgZGVsZXRlZCBhZnRlciBjb2RlZ2VuZXJhdGlvbg0KLSAgICANCi1FWEFNUExFUw0KLSAgICAgICB3c2RsMmphdmEuc2ggLXVyaSAuLi9zYW1wbGVzL3dzZGwvQXhpczJTYW1wbGVEb2NMaXQud3NkbA0KLSAgICAgICB3c2RsMmphdmEuc2ggLXVyaSAuLi9zYW1wbGVzL3dzZGwvQXhpczJTYW1wbGVEb2NMaXQud3NkbCAtc3MgLXNkIA0KLSAgICAgICB3c2RsMmphdmEuc2ggLXVyaSAuLi9zYW1wbGVzL3dzZGwvQXhpczJTYW1wbGVEb2NMaXQud3NkbCAtc3MgLXNkIC1kIHhtbGJlYW5zIC1vIC4uL3NhbXBsZXMgLXAgb3JnLmFwYWNoZS5heGlzMi51c2VyZ3VpZGUNCi08L3ByZT4NCi08YSBuYW1lPSJ3c2RsMmphdmEiIGlkPSJ3c2RsMmphdmEiPjwvYT4NCi08aDI+SmF2YTJXU0RMIFJlZmVyZW5jZTwvaDI+DQotPHByZT4NCi1OQU1FDQotICAgICAgIEphdmEyV1NETC5zaCBvciBKYXZhMldTREwuYmF0IC0gR2VuZXJhdGVzIHRoZSBhcHByb3ByaWF0ZSBXU0RMIGZpbGUgZm9yIGEgZ2l2ZW4gamF2YSBjbGFzcy4NCi0gICAgICAgVGhlc2Ugc2NyaXB0cyBjYW4gYmUgZm91bmQgdW5kZXIgdGhlIGJpbiBkaXJlY3Rvcnkgb2YgdGhlIEF4aXMyIGRpc3RyaWJ1dGlvbi4NCi0NCi1TWU5PUFNJUw0KLSAgICAgICBKYXZhMldTREwuc2ggW09QVElPTl0uLi4gLWNuICZsdDtmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSZndDsNCi0NCi1ERVNDUklQVElPTg0KLSAgICAgICBHaXZlbiBhIGphdmEgY2xhc3MgZ2VuZXJhdGVzIGEgV1NETCBmaWxlIGZvciB0aGUgZ2l2ZW4gamF2YSBjbGFzcy4gDQotDQotICAgICAgLW8gJmx0O291dHB1dCBsb2NhdGlvbiZndDsgICAgICAgICAgICAgICAgICAgIG91dHB1dCBkaXJlY3RvcnkNCi0gICAgICAtb2YgJmx0O291dHB1dCBmaWxlIG5hbWUmZ3Q7ICAgICAgICAgICAgICAgICAgb3V0cHV0IGZpbGUgbmFtZSBmb3IgdGhlIFdTREwNCi0gICAgICAtc24gJmx0O3NlcnZpY2UgbmFtZSZndDsgICAgICAgICAgICAgICAgICAgICAgc2VydmljZSBuYW1lDQotICAgICAgLWwgJmx0O3NvYXAgYWRkcmVzcyZndDsgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3Mgb2YgdGhlIHBvcnQgZm9yIHRoZSBXU0RMDQotICAgICAgLWNwICZsdDtjbGFzcyBwYXRoIHVyaSZndDsgICAgICAgICAgICAgICAgICAgIGxpc3Qgb2YgY2xhc3NwYXRoIGVudHJpZXMgLSAodXJscykNCi0gICAgICAtdG4gJmx0O3RhcmdldCBuYW1lc3BhY2UmZ3Q7ICAgICAgICAgICAgICAgICAgdGFyZ2V0IG5hbWVzcGFjZSBmb3Igc2VydmljZQ0KLSAgICAgIC10cCAmbHQ7dGFyZ2V0IG5hbWVzcGFjZSBwcmVmaXgmZ3Q7ICAgICAgICAgICB0YXJnZXQgbmFtZXNwYWNlIHByZWZpeCBmb3Igc2VydmljZQ0KLSAgICAgIC1zdG4gJmx0O3NjaGVtYSB0YXJnZXQgbmFtZXNwYWNlJmd0OyAgICAgICAgICB0YXJnZXQgbmFtZXNwYWNlIGZvciBzY2hlbWENCi0gICAgICAtc3RwICZsdDtzY2hlbWEgdGFyZ2V0IG5hbWVzcGFjZSBwcmVmaXgmZ3Q7ICAgdGFyZ2V0IG5hbWVzcGFjZSBwcmVmaXggZm9yIHNjaGVtYQ0KLSAgICAgIC1zdCAmbHQ7YmluZGluZyBzdHlsZSZndDsgICAgICAgICAgICAgICAgICAgICBzdHlsZSBmb3IgdGhlIFdTREwNCi0gICAgICAtdSAmbHQ7YmluZGluZyB1c2UmZ3Q7ICAgICAgICAgICAgICAgICAgICAgICAgdXNlIGZvciB0aGUgV1NETA0KLSAgICAgIC1uc2cgJmx0O2NsYXNzIG5hbWUmZ3Q7ICAgICAgICAgICAgICAgICAgICAgICBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyBOYW1lc3BhY2VHZW5lcmF0b3INCi0gICAgICAtc2cgJmx0O2NsYXNzIG5hbWUmZ3Q7ICAgICAgICAgICAgICAgICAgICAgICAgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBjbGFzcyB0aGF0IGltcGxlbWVudHMgU2NoZW1hR2VuZXJhdG9yDQotICAgICAgLXAybiBbJmx0O2phdmEgcGFja2FnZSZndDssJmx0O25hbWVzcGFjZV0gWyZsdDtqYXZhIHBhY2thZ2UmZ3Q7LCZsdDtuYW1lc3BhY2VdLi4uDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEgcGFja2FnZSB0byBuYW1lc3BhY2UgbWFwcGluZyBmb3IgYXJndW1lbnQgYW5kIHJldHVybiB0eXBlcw0KLSAgICAgIC1wMm4gW2FsbCwgJmx0O25hbWVzcGFjZSZndDtdICAgICAgICAgICAgICAgICB0byBhc3NpZ24gYWxsIHR5cGVzIHRvIGEgc2luZ2xlIG5hbWVzcGFjZQ0KLSAgICAgIC1lZmQgJmx0O3F1YWxpZmllZC91bnF1YWxpZmllZCZndDsgICAgICAgICAgICBzZXR0aW5nIGZvciBlbGVtZW50Rm9ybURlZmF1bHQgKGRlZmF1bHRzIHRvIHF1YWxpZmllZCkNCi0gICAgICAtYWZkICZsdDtxdWFsaWZpZWQvdW5xdWFsaWZpZWQmZ3Q7ICAgICAgICAgICAgc2V0dGluZyBmb3IgYXR0cmlidXRlRm9ybURlZmF1bHQgKGRlZmF1bHRzIHRvIHF1YWxpZmllZCkNCi0gICAgICAteGMgY2xhc3MxIC14YyBjbGFzczIuLi4gICAgICAgICAgICAgICAgZXh0cmEgY2xhc3MoZXMpIGZvciB3aGljaCBzY2hlbWF0eXBlIG11c3QgYmUgZ2VuZXJhdGVkLg0KLSAgICAgIC13diAmbHQ7MS4xLzIuMCZndDsgICAgICAgICAgICAgICAgICAgICAgICAgICB3c2RsIHZlcnNpb24gLSBkZWZhdWx0cyB0byAxLjEgaWYgbm90IHNwZWNpZmllZA0KLSAgICAgIC1kbGIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZSBzY2hlbWFzIGNvbmZvcm1pbmcgdG8gZG9jL2xpdC9iYXJlIHN0eWxlDQotICAgIA0KLUVYQU1QTEVTDQotICAgICAgIEphdmEyV1NETC5zaCAtY24gLi4vc2FtcGxlcy90ZXN0L3NlYXJjaFRvb2wuU2VhcmNoDQotICAgICAgIEphdmEyV1NETC5zaCAtY24gLi4vc2FtcGxlcy90ZXN0L3NlYXJjaFRvb2wuU2VhcmNoIC1zbiBzZWFyY2gNCi0gICAgICAgSmF2YTJXU0RMLnNoIC1jbiAuLi9zYW1wbGVzL3Rlc3Qvc2VhcmNoVG9vbC5TZWFyY2ggLXUgLXNuIHNlYXJjaA0KLSAgICAgICBKYXZhMldTREwuc2ggLWNuIC4uL3NhbXBsZXMvdGVzdC9zZWFyY2hUb29sLlNlYXJjaCAtc24gc2VhcmNoIC1vIC4uL3NhbXBsZXMvdGVzdC93c2RsICANCi08L3ByZT4NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9yZXNvdXJjZXMvc2NoZW1hcy9tb2R1bGUueHNkIGIvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL3Jlc291cmNlcy9zY2hlbWFzL21vZHVsZS54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhMzg3ZTkuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL3Jlc291cmNlcy9zY2hlbWFzL21vZHVsZS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+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+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJtZXAiIHR5cGU9InhzOmFueVVSSSIgdXNlPSJyZXF1aXJlZCIvPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLTwveHM6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL3Jlc291cmNlcy9zY2hlbWFzL3NlcnZpY2VzLnhzZCBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9yZXNvdXJjZXMvc2NoZW1hcy9zZXJ2aWNlcy54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5ZWVjODYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL3Jlc291cmNlcy9zY2hlbWFzL3NlcnZpY2VzLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/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+Ci08L3hzOnNjaGVtYT4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9yZXN0LXdzLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9yZXN0LXdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM0ZjQ5Mi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvcmVzdC13cy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNzUgKzAsMCBAQAotPCEtLQotICB+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+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvc29hcG1vbml0b3ItbW9kdWxlLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9zb2FwbW9uaXRvci1tb2R1bGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmI3NjE2Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9zb2FwbW9uaXRvci1tb2R1bGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjEvL0VOIgotICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxMS9EVEQveGh0bWwxMS5kdGQiPgotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSIiLz4KLSAgPHRpdGxlPlRoZSBTT0FQIE1vbml0b3IgTW9kdWxlPC90aXRsZT4KLSAgPGxpbmsgaHJlZj0iLi4vY3NzL2F4aXMtZG9jcy5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiCi0gIG1lZGlhPSJhbGwiLz4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDE+VXNpbmcgdGhlIFNPQVAgTW9uaXRvcjwvaDE+Ci0KLTxwPldlYiBzZXJ2aWNlIGRldmVsb3BlcnMgb2Z0ZW4gd2FudCB0byBzZWUgdGhlIFNPQVAgbWVzc2FnZXMgdGhhdCBhcmUgYmVpbmcKLXVzZWQgdG8gaW52b2tlIHRoZSBXZWIgc2VydmljZXMsIGFsb25nIHdpdGggdGhlIHJlc3VsdHMgb2YgdGhvc2UgbWVzc2FnZXMuCi1UaGUgZ29hbCBvZiB0aGUgU09BUCBNb25pdG9yIHV0aWxpdHkgaXMgdG8gcHJvdmlkZSBhIHdheSBmb3IgdGhlIGRldmVsb3BlcnMKLXRvIG1vbml0b3IgdGhlc2UgU09BUCBtZXNzYWdlcyB3aXRob3V0IHJlcXVpcmluZyBhbnkgc3BlY2lhbCBjb25maWd1cmF0aW9uIG9yCi1yZXN0YXJ0aW5nIHRoZSBzZXJ2ZXIuPC9wPgotCi08cD5JbiB0aGlzIHV0aWxpdHksIGEgaGFuZGxlciBoYXMgYmVlbiB3cml0dGVuIGFuZCBhZGRlZCB0byB0aGUgZ2xvYmFsCi1oYW5kbGVyIGNoYWluLiBBcyBTT0FQIHJlcXVlc3RzIGFuZCByZXNwb25zZXMgYXJlIHJlY2VpdmVkLCB0aGUgU09BUCBtZXNzYWdlCi1pbmZvcm1hdGlvbiBpcyBmb3J3YXJkZWQgdG8gYSBTT0FQIG1vbml0b3Igc2VydmljZSB3aGVyZSBpdCBjYW4gYmUgZGlzcGxheWVkCi11c2luZyBhIFdlYiBicm93c2VyIGludGVyZmFjZS4gVGhlIFNPQVAgbWVzc2FnZSBpbmZvcm1hdGlvbiBpcyBhY2Nlc3NlZCBieSBhCi1XZWIgYnJvd3NlciBieSBnb2luZyB0byBodHRwOi8vbG9jYWxob3N0OjgwODAvYXhpczIvU09BUE1vbml0b3IgKHdoZXJlIDgwODAKLWlzIHRoZSBwb3J0IG51bWJlciB3aGVyZSB0aGUgYXBwbGljYXRpb24gc2VydmVyIGlzIHJ1bm5pbmcpLiBUaGUgU09BUCBtZXNzYWdlCi1pbmZvcm1hdGlvbiBpcyBkaXNwbGF5ZWQgdGhyb3VnaCBhIFdlYiBicm93c2VyIGJ5IHVzaW5nIGFuIGFwcGxldCB0aGF0IG9wZW5zCi1hIHNvY2tldCBjb25uZWN0aW9uIHRvIHRoZSBTT0FQIG1vbml0b3Igc2VydmljZS4gVGhpcyBhcHBsZXQgcmVxdWlyZXMgYSBKYXZhCi1wbHVnLWluIDEuMyBvciBoaWdoZXIgdG8gYmUgaW5zdGFsbGVkIGluIHlvdXIgYnJvd3Nlci4gSWYgeW91IGRvIG5vdCBoYXZlIGEKLWNvcnJlY3QgcGx1Zy1pbiwgdGhlIGJyb3dzZXIgd2lsbCBwcm9tcHQgeW91IHRvIGluc3RhbGwgb25lLiBUaGUgcG9ydCB1c2VkIGJ5Ci10aGUgU09BUCBtb25pdG9yIHNlcnZpY2UgdG8gY29tbXVuaWNhdGUgd2l0aCBhcHBsZXRzIGlzIGNvbmZpZ3VyYWJsZS4gRWRpdAotdGhlIHdlYi54bWwgZmlsZSB0byBjaGFuZ2UgdGhlIHBvcnQgdXNlZCBieSB0aGUgQXhpczIgV2ViIGFwcGxpY2F0aW9uLjwvcD4KLQotPHA+VGhlIFNPQVAgTW9uaXRvciBtb2R1bGUgKHNvYXBtb25pdG9yLm1hcikgaXMgYXZhaWxhYmxlIGluIHRoZSBheGlzMi53YXIKLWJ1dCBpdCBpcyBub3QgZW5nYWdlZCBieSBkZWZhdWx0LiBUaGUgU09BUCBNb25pdG9yIGlzIE5PVCBlbmFibGVkIGJ5IGRlZmF1bHQKLWZvciBzZWN1cml0eSByZWFzb25zLjwvcD4KLQotPHA+VGhlIFNPQVAgTW9uaXRvciBjYW4gYmUgZW5nYWdlZCBieSBpbnNlcnRpbmcgdGhlIGZvbGxvd2luZyBpbiB0aGUKLWF4aXMyLnhtbCBmaWxlLjwvcD4KLTxzb3VyY2U+PHByZT4gICAmbHQ7bW9kdWxlIHJlZj0ic29hcG1vbml0b3IiLyZndDs8L3ByZT4KLTwvc291cmNlPgotPHA+SW4gdGhlIGF4aXMyLnhtbCBmaWxlLCBkZWZpbmUgeW91ciBwaGFzZSBvcmRlcnMgZm9yIHRoZSAnc29hcG1vbml0b3JQaGFzZScKLXJlZmVyZW5jZWQgaW4gdGhlIG1vZHVsZS54bWwgb2Ygc29hcG1vbml0b3IubWFycy4gQmVsb3cgaXMgYW4gZXhhbXBsZSB3aGljaAotc2hvdWxkIE5PVCBiZSBjb3BpZWQgZXhhY3RseSwgc2luY2UgdGhlIGRlZmF1bHQgcGhhc2VzIGNoYW5nZSBvY2Nhc2lvbmFsbHkuCi1UaGUgaW1wb3J0YW50IHBvaW50IGhlcmUgaXMgdGhhdCAnc29hcG1vbml0b3JQaGFzZScgc2hvdWxkIGJlIHBsYWNlZCB1bmRlcgotdGhlICd1c2VyIGNhbiBhZGQgaGlzIG93biBwaGFzZXMgdG8gdGhpcyBhcmVhJyBjb21tZW50IGluIHRoZSAnaW5mbG93JywKLSdvdXRmbG93JywgJ0lOZmF1bHRmbG93JywgYW5kICdPdXRmYXVsdGZsb3cnIHNlY3Rpb25zLjwvcD4KLTxwcmU+ICAgICZsdDtwaGFzZU9yZGVyIHR5cGU9ImluZmxvdyImZ3Q7Ci0gICAgICAgICZsdDshLS1TeXN0ZW0gcHJlIGRlZmluZWQgcGhhc2VzLS0mZ3Q7Ci0gICAgICAgICZsdDtwaGFzZSBuYW1lPSJUcmFuc3BvcnRJbiIvJmd0OwotICAgICAgICAmbHQ7cGhhc2UgbmFtZT0iUHJlRGlzcGF0Y2giLyZndDsKLSAgICAgICAgJmx0O3BoYXNlIG5hbWU9IkRpc3BhdGNoIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuRGlzcGF0Y2hQaGFzZSImZ3Q7Ci0gICAgICAgICAgICAmbHQ7aGFuZGxlciBuYW1lPSJBZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciImZ3Q7Ci0gICAgICAgICAgICAgICAgJmx0O29yZGVyIHBoYXNlPSJEaXNwYXRjaCIvJmd0OwotICAgICAgICAgICAgJmx0Oy9oYW5kbGVyJmd0OwotICAgICAgICAgICAgJmx0O2hhbmRsZXIgbmFtZT0iUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiJmd0OwotICAgICAgICAgICAgICAgICZsdDtvcmRlciBwaGFzZT0iRGlzcGF0Y2giLyZndDsKLSAgICAgICAgICAgICZsdDsvaGFuZGxlciZndDsKLSAgICAgICAgICAgICZsdDtoYW5kbGVyIG5hbWU9IlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIiZndDsKLSAgICAgICAgICAgICAgICAmbHQ7b3JkZXIgcGhhc2U9IkRpc3BhdGNoIi8mZ3Q7Ci0gICAgICAgICAgICAmbHQ7L2hhbmRsZXImZ3Q7Ci0gICAgICAgICAgICAmbHQ7aGFuZGxlciBuYW1lPSJTT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiJmd0OwotICAgICAgICAgICAgICAgICZsdDtvcmRlciBwaGFzZT0iRGlzcGF0Y2giLyZndDsKLSAgICAgICAgICAgICZsdDsvaGFuZGxlciZndDsKLSAgICAgICAgICAgICZsdDtoYW5kbGVyIG5hbWU9Ikluc3RhbmNlRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5JbnN0YW5jZURpc3BhdGNoZXIiJmd0OwotICAgICAgICAgICAgICAgICZsdDtvcmRlciBwaGFzZT0iUG9zdERpc3BhdGNoIi8mZ3Q7Ci0gICAgICAgICAgICAmbHQ7L2hhbmRsZXImZ3Q7Ci0gICAgICAgICZsdDsvcGhhc2UmZ3Q7Ci0gICAgICAgICZsdDshLS1TeXN0ZW0gcHJlIGRlZmluZWQgcGhhc2VzLS0mZ3Q7Ci0gICAgICAgICZsdDshLS1BZnRlciBQb3N0ZGlzcGF0Y2ggcGhhc2UgbW9kdWxlIGF1dGhvciBvciBvciBzZXJ2aWNlIGF1dGhvciBjYW4gYWRkIGFueSBwaGFzZSBoZSB3YW50LS0mZ3Q7Ci0gICAgICAgICZsdDtwaGFzZSBuYW1lPSJ1c2VycGhhc2UxIi8mZ3Q7Ci0gICAgICAgICZsdDtwaGFzZSBuYW1lPSJzb2FwbW9uaXRvclBoYXNlIi8mZ3Q7Ci0gICAgJmx0Oy9waGFzZU9yZGVyJmd0OwotICAgICZsdDtwaGFzZU9yZGVyIHR5cGU9Im91dGZsb3ciJmd0OwotICAgICAgICAmbHQ7IS0tdXNlciBjYW4gYWRkIGhpcyBvd24gcGhhc2VzIHRvIHRoaXMgYXJlYS0tJmd0OwotICAgICAgICAmbHQ7cGhhc2UgbmFtZT0idXNlcnBoYXNlMSIvJmd0OwotICAgICAgICAmbHQ7cGhhc2UgbmFtZT0ic29hcG1vbml0b3JQaGFzZSIvJmd0OwotICAgICAgICAmbHQ7IS0tc3lzdGVtIHByZWRlZmluZWQgcGhhc2UtLSZndDsKLSAgICAgICAgJmx0OyEtLXRoZXNlIHBoYXNlIHdpbGwgcnVuIGlycmVzcGVjdGl2ZSBvZiB0aGUgc2VydmljZS0tJmd0OwotICAgICAgICAmbHQ7cGhhc2UgbmFtZT0iUG9saWN5RGV0ZXJtaW5hdGlvbiIvJmd0OwotICAgICAgICAmbHQ7cGhhc2UgbmFtZT0iTWVzc2FnZU91dCIvJmd0OwotICAgICZsdDsvcGhhc2VPcmRlciZndDsKLSAgICAmbHQ7cGhhc2VPcmRlciB0eXBlPSJJTmZhdWx0ZmxvdyImZ3Q7Ci0gICAgICAgICZsdDshLS11c2VyIGNhbiBhZGQgaGlzIG93biBwaGFzZXMgdG8gdGhpcyBhcmVhLS0mZ3Q7Ci0gICAgICAgICZsdDtwaGFzZSBuYW1lPSJ1c2VycGhhc2UxIi8mZ3Q7Ci0gICAgICAgICZsdDtwaGFzZSBuYW1lPSJzb2FwbW9uaXRvclBoYXNlIi8mZ3Q7Ci0gICAgJmx0Oy9waGFzZU9yZGVyJmd0OwotICAgICZsdDtwaGFzZU9yZGVyIHR5cGU9Ik91dGZhdWx0ZmxvdyImZ3Q7Ci0gICAgICAgICZsdDshLS11c2VyIGNhbiBhZGQgaGlzIG93biBwaGFzZXMgdG8gdGhpcyBhcmVhLS0mZ3Q7Ci0gICAgICAgICZsdDtwaGFzZSBuYW1lPSJ1c2VycGhhc2UxIi8mZ3Q7Ci0gICAgICAgICZsdDtwaGFzZSBuYW1lPSJzb2FwbW9uaXRvclBoYXNlIi8mZ3Q7Ci0gICAgICAgICZsdDtwaGFzZSBuYW1lPSJQb2xpY3lEZXRlcm1pbmF0aW9uIi8mZ3Q7Ci0gICAgICAgICZsdDtwaGFzZSBuYW1lPSJNZXNzYWdlT3V0Ii8mZ3Q7Ci0gICAgJmx0Oy9waGFzZU9yZGVyJmd0OzwvcHJlPgotCi08cD5UbyBjb25maWd1cmUgdGhlIHNlcnZsZXQgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgYXBwbGV0LCBhZGQgdGhlIGZvbGxvd2luZwotY29kZSB0byB0aGUgd2ViLnhtbCAoVGhlIFNPQVBNb25pdG9yUG9ydCBpcyBjb25maWd1cmFibGUuKTo8L3A+Ci08cHJlPiAgICAmbHQ7c2VydmxldCZndDsKLSAgICAgICAmbHQ7c2VydmxldC1uYW1lJmd0O1NPQVBNb25pdG9yU2VydmljZSZsdDsvc2VydmxldC1uYW1lJmd0OwotICAgICAgICZsdDtkaXNwbGF5LW5hbWUmZ3Q7U09BUE1vbml0b3JTZXJ2aWNlJmx0Oy9kaXNwbGF5LW5hbWUmZ3Q7Ci0gICAgICAgJmx0O3NlcnZsZXQtY2xhc3MmZ3Q7Ci0gICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLnNvYXBtb25pdG9yLnNlcnZsZXQuU09BUE1vbml0b3JTZXJ2aWNlCi0gICAgICAgJmx0Oy9zZXJ2bGV0LWNsYXNzJmd0OwotICAgICAgICZsdDtpbml0LXBhcmFtJmd0OwotICAgICAgICAgICZsdDtwYXJhbS1uYW1lJmd0O1NPQVBNb25pdG9yUG9ydCZsdDsvcGFyYW0tbmFtZSZndDsKLSAgICAgICAgICAmbHQ7cGFyYW0tdmFsdWUmZ3Q7NTAwMSZsdDsvcGFyYW0tdmFsdWUmZ3Q7Ci0gICAgICAgJmx0Oy9pbml0LXBhcmFtJmd0OwotICAgICAgICZsdDtsb2FkLW9uLXN0YXJ0dXAmZ3Q7MSZsdDsvbG9hZC1vbi1zdGFydHVwJmd0OwotICAgICZsdDsvc2VydmxldCZndDsKLQotICAgICZsdDtzZXJ2bGV0LW1hcHBpbmcmZ3Q7Ci0gICAgICAgICZsdDtzZXJ2bGV0LW5hbWUmZ3Q7U09BUE1vbml0b3JTZXJ2aWNlJmx0Oy9zZXJ2bGV0LW5hbWUmZ3Q7Ci0gICAgICAgICZsdDt1cmwtcGF0dGVybiZndDsvU09BUE1vbml0b3ImbHQ7L3VybC1wYXR0ZXJuJmd0OwotICAgICZsdDsvc2VydmxldC1tYXBwaW5nJmd0OzwvcHJlPgotCi08cD5GaW5hbGx5LCBjb21waWxlIHRoZSBhcHBsZXQgY2xhc3NlcyBhbmQgcGxhY2UgdGhlbSBhdCB0aGUgcm9vdCAoZWc6Ci0mbHQ7Q0FUQUxJTkFfSE9NRSZndDsvd2ViYXBwcy9heGlzMi8pIG9mIHRoZSBleHRyYWN0ZWQgV0FSIGZpbGUuIFlvdSBjYW4gZmluZAotdGhlIFNPQVBNb25pdG9yQXBwbGV0LmphdmEgaW4gdGhlIHNvdXJjZSBkaXN0cmlidXRpb24uIFRvIGNvbXBpbGUsIHVzZSB0aGUKLWZvbGxvd2luZyBjb21tYW5kOjwvcD4KLTxwcmU+amF2YWMgLWNsYXNzcGF0aCBheGlzMi1zb2FwbW9uaXRvci5qYXIgb3JnL2FwYWNoZS9heGlzMi9zb2FwbW9uaXRvci9hcHBsZXQvU09BUE1vbml0b3JBcHBsZXQuamF2YTwvcHJlPgotCi08cD5BbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIGRpcmVjdGx5IGdldCB0aGUgPHN0cm9uZz5jb21waWxlZCBhcHBsZXQKLWNsYXNzZXM8L3N0cm9uZz4gZnJvbSB0aGUgV0VCLUlORi9saWIvc29hcG1vbml0b3ItMS40LmphciB3aGljaCBpcyBpbnNpZGUKLXRoZSBleHRyYWN0ZWQgYXhpczIud2FyLiBUbyBleHRyYWN0IHRoZSBzb2FwbW9uaXRvci0xLjQuamFyIGZpbGUsIHNpbXBseQotZXhlY3V0ZSB0aGUgY29tbWFuZCwgPGNvZGU+amFyIC14ZiBzb2FwbW9uaXRvci0xLjQuamFyPC9jb2RlPiBhbmQgcGxhY2UKLXRoZSBjb21waWxlZCBhcHBsZXQgY2xhc3NlcyBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhlIGV4dHJhY3RlZCBXQVIsIGZvcgotZXhhbXBsZSwgaW4gJmx0O0NBVEFMSU5BX0hPTUUmZ3Q7L3dlYmFwcHMvYXhpczIvLiBOT1RFOiBTdGFydGluZyB3aXRoIGF4aXMyIDEuNCwgCi10aGUgYXBwbGV0cyBjb2RlIGlzIGluIHRoZSBvcmcuYXBhY2hlLmF4aXMyLnNvYXBtb25pdG9yLmFwcGxldCBwYWNrYWdlLiBUaGVyZWZvcmUgCi10aGUgJ29yZycgZGlyZWN0b3J5IGNyZWF0ZWQgYnkgdGhlIHVucGFja2luZyBvZiBzb2FwbW9uaXRvci0xLjQuamFyIHNob3VsZCBiZSBwbGFjZWQKLWluICZsdDtDQVRBTElOQV9IT01FJmd0Oy93ZWJhcHBzL2F4aXMyLyBhcyBzaG93biBpbiB0aGUgYWJvdmUgZXhhbXBsZS48L3A+Ci0KLTxwPlVzaW5nIGEgV2ViIGJyb3dzZXIsIGdvIHRvIGh0dHBbc106Ly9ob3N0Wzpwb3J0XVsvd2ViYXBwXS9TT0FQTW9uaXRvcgotKGUuZy5odHRwOi8vbG9jYWxob3N0OjgwODAvYXhpczIvU09BUE1vbml0b3IpIHN1YnN0aXR1dGluZyB0aGUgY29ycmVjdCB2YWx1ZXMKLWZvciB5b3VyIFdlYiBhcHBsaWNhdGlvbi4gVGhpcyB3aWxsIHNob3cgdGhlIFNPQVAgTW9uaXRvciBhcHBsZXQgdXNlZCB0byB2aWV3Ci10aGUgc2VydmljZSByZXF1ZXN0cyBhbmQgcmVzcG9uc2VzLiBBbnkgcmVxdWVzdHMgdG8gc2VydmljZXMgdGhhdCBoYXZlIGJlZW4KLWNvbmZpZ3VyZWQgYW5kIGRlcGxveWVkIGNvcnJlY3RseSBzaG91bGQgc2hvdyB1cCBpbiB0aGUgYXBwbGV0LjwvcD4KLQotPHA+VGhlIFNPQVBNb25pdG9yIHdpdGggYXR0YWNobWVudHMgY3VycmVudGx5IHNlcmlhbGl6ZXMgdGhlbXNlbHZlcyBhcyBiYXNlNjQKLWNoYXJhY3RlcnMuIEl0IGlzIHRoZXJlZm9yZSByZWNvbW1lbmRlZCB0byB1c2UgdGhlIFRDUE1vbiB0b29sIHRvIGNvcnJlY3RseQotY2FwdHVyZSBNVE9NIGFuZCBTV0EgbWVzc2FnZXMgYXMgYW4gbXVsdGlwYXJ0IG1pbWUgd2hlcmUgdGhlIGJpbmFyeSBkYXRhIGlzCi1hbiBhdHRhY2htZW50LjwvcD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9zcHJpbmcueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL3NwcmluZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2ZjZjZjEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL3NwcmluZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MDMgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMS8vRU4iCi0gICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDExL0RURC94aHRtbDExLmR0ZCI+Ci08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJjb250ZW50LXR5cGUiIGNvbnRlbnQ9IiIvPgotICA8dGl0bGU+QXhpczIgaW50ZWdyYXRpb24gd2l0aCB0aGUgU3ByaW5nIEZyYW1ld29yazwvdGl0bGU+Ci0gIDxsaW5rIGhyZWY9Ii4uL2Nzcy9heGlzLWRvY3MuY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIgotICBtZWRpYT0iYWxsIi8+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9ImVuIj4KLTxoMT5BeGlzMiBJbnRlZ3JhdGlvbiB3aXRoIHRoZSBTcHJpbmcgRnJhbWV3b3JrPC9oMT4KLQotPHA+VGhpcyBkb2N1bWVudCBpcyBhIGd1aWRlIG9uIGhvdyB0byB1c2UgQXhpczIgd2l0aCB0aGUgU3ByaW5nIEZyYW1ld29yazwvcD4KLQotPGgyPkNvbnRlbnQ8L2gyPgotPHVsPgotICA8bGk+PGEgaHJlZj0iIzEiPkludHJvZHVjdGlvbjwvYT48L2xpPgotICA8bGk+PGEgaHJlZj0iIzIiPkNvbmZpZ3VyaW5nIEF4aXMyIHRvIGJlIFNwcmluZyBBd2FyZTwvYT4KLSAgICA8dWw+Ci0gICAgICA8bGk+PGEgaHJlZj0iIzIxIj5Qcm9ncmFtbWluZyBNb2RlbDwvYT48L2xpPgotICAgICAgPGxpPjxhIGhyZWY9IiMyMiI+U2ltcGxlIFNwcmluZyBDb25maWcgRXhhbXBsZTwvYT48L2xpPgotICAgICAgPGxpPjxhIGhyZWY9IiMyMyI+V2l0aCBhIFNlcnZsZXRDb250ZXh0PC9hPjwvbGk+Ci0gICAgICA8bGk+PGEgaHJlZj0iIzI0Ij5XaXRob3V0IGEgU2VydmxldENvbnRleHQ8L2E+PC9saT4KLSAgICAgIDxsaT48YSBocmVmPSIjMjUiPlB1dHRpbmcgaXQgQWxsIFRvZ2V0aGVyPC9hPjwvbGk+Ci0gICAgICA8bGk+PGEgaHJlZj0iIzI2Ij5TcHJpbmcgSW5zaWRlIGFuIEFBUiA8L2E+Ci0gICAgICAgIDx1bD4KLSAgICAgICAgICA8bGk+PGEgaHJlZj0iIzI2MSI+VGhlIFNwcmluZyBJbnNpZGUgYW4gQUFSIExheW91dDwvYT48L2xpPgotICAgICAgICAgIDxsaT48YSBocmVmPSIjMjYyIj5UaGUgU3ByaW5nIEluc2lkZSBhbiBBQVIgaW5pdCBDbGFzczwvYT48L2xpPgotICAgICAgICAgIDxsaT48YSBocmVmPSIjMjYzIj5Lbm93biBJc3N1ZXMgUnVubmluZyBTcHJpbmcgSW5zaWRlIHRoZQotICAgICAgICAgIEFBUjwvYT48L2xpPgotICAgICAgICA8L3VsPgotICAgICAgPC9saT4KLSAgICA8L3VsPgotICA8L2xpPgotPC91bD4KLTxhIG5hbWU9IjEiPjwvYT4KLQotPGgyPkludHJvZHVjdGlvbjwvaDI+Ci0KLTxwPkF4aXMyIGFuZCBTcHJpbmcgaW50ZWdyYXRpb24gdGFrZXMgcGxhY2Ugd2hlbiBTcHJpbmcgc3VwcGxpZXMgb25lIG9mIGl0cwotcHJlLWxvYWRlZCBiZWFucyB0byB0aGUgQXhpczIgTWVzc2FnZSBSZWNlaXZlciBkZWZpbmVkIGluIHRoZSBBQVIKLXNlcnZpY2VzLnhtbC4gQXhpczIgdHlwaWNhbGx5IHVzZXMgcmVmbGVjdGlvbiB0byBpbnN0YW50aWF0ZSB0aGUgU2VydmljZUNsYXNzCi1kZWZpbmVkIGluIHRoZSBzZXJ2aWNlcy54bWwgdXNlZCBieSB0aGUgTWVzc2FnZSBSZWNlaXZlci4gQWx0ZXJuYXRpdmVseSwgeW91Ci1jYW4gZGVmaW5lIGEgU2VydmljZU9iamVjdFN1cHBsaWVyIHRoYXQgd2lsbCBzdXBwbHkgdGhlIE9iamVjdC48L3A+Ci0KLTxwPlRoaXMgZ3VpZGUgZGVzY3JpYmVzIGhvdyB0byB1c2UgdHdvIHNlcGFyYXRlIFNlcnZpY2VPYmplY3RTdXBwbGllciBjbGFzc2VzCi10aGF0IGFyZSBhIHBhcnQgb2YgdGhlIEF4aXMyIHN0YW5kYXJkIGRpc3RyaWJ1dGlvbiAtIG9uZSBmb3IgdXNlIHdpdGggYQotU2VydmxldENvbnRleHQsIGFuZCBvbmUgd2l0aG91dC4gQ29uZmlndXJpbmcgQXhpczIgd2l0aCBhIFNlcnZsZXRDb250ZXh0IGlzIAotc2ltcGxlciB0aGFuIHdpdGhvdXQsIGFuZCBpcyByZWNvbW1lbmRlZCBmb3IgbW9zdCB1c2UgY2FzZXMuIFdpdGhvdXQgYSAKLVNlcnZsZXRDb250ZXh0LCBpZSwgU3ByaW5nIGluc2lkZSB0aGUgQUFSLCByZXF1aXJlcyBhbiBleHRyYSBTcHJpbmcgYmVhbiAKLWFuZCBpcyBjb25zaWRlcmVkIGFuIGFkdmFuY2VkIHVzZSBjYXNlLiBPbmNlIGNvbmZpZ3VyZWQsIHRoZSBXZWIgc2VydmljZSBpdHNlbGYgCi1hY3RzIGxpa2UgYW55IG90aGVyIFNwcmluZyB3aXJlZCBiZWFuLiBUaGVzZSBTcHJpbmcgYmVhbnMgY2FuIGJlIGxvYWRlZCBhbnkgd2F5Ci1kZXNpcmVkIGFzIEF4aXMyIGhhcyBubyBjb25maWd1cmF0aW9uIGZpbGUgZGVwZW5kZW5jaWVzIGZyb20gU3ByaW5nLiBTcHJpbmcKLXZlcnNpb25zIDEuMi42LCAxLjIuOCBhbmQgMi4wIGhhdmUgYmVlbiB0ZXN0ZWQsIGJ1dCBwcm9iYWJseSBhbnkgdmVyc2lvbgotd291bGQgd29yayBhcyBvbmx5IHRoZSBjb3JlIGZ1bmN0aW9uYWxpdHkgaXMgcmVxdWlyZWQuPC9wPgotCi08cD5UaGlzIGd1aWRlIGFzc3VtZXMgc29tZSBiYXNpYyBrbm93bGVkZ2Ugb2YgQXhpczIuIFNlZSB0aGUgPGEKLWhyZWY9InVzZXJndWlkZS5odG1sIj5Vc2VyJ3MgR3VpZGU8L2E+IGZvciBtb3JlIGluZm9ybWF0aW9uLjwvcD4KLTxhIG5hbWU9IjIiPjwvYT4KLQotPGgzPlByb2dyYW1taW5nIE1vZGVsPC9oMz4KLQotPHA+RnJvbSBhbiBBeGlzMiBzdGFuZHBvaW50LCB0d28gaG9va3MgYXJlIG5lZWRlZCB0byBiZSBwbGFjZWQgaW50byB0aGUgQUFSCi1zZXJ2aWNlcy54bWwgLSB0aGUgU2VydmljZU9iamVjdFN1cHBsaWVyIHRoYXQgaG9va3MgQXhpczIgYW5kIFNwcmluZwotdG9nZXRoZXIsIGFuZCB0aGUgbmFtZSBvZiB0aGUgU3ByaW5nIGJlYW4gdGhhdCBBeGlzMiB3aWxsIHVzZSBhcyB0aGUgc2VydmljZS4KLUFsbCBNZXNzYWdlIFJlY2VpdmVycyBhcmUgY3VycmVudGx5IHN1cHBvcnRlZCwgYXMgd291bGQgYmUgYW55IE1lc3NhZ2UKLVJlY2VpdmVyIHRoYXQgZXh0ZW5kcyBvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5BYnN0cmFjdE1lc3NhZ2VSZWNlaXZlciAuPC9wPgotPGEgbmFtZT0iMjIiPjwvYT4KLQotPGgzPlNpbXBsZSBTcHJpbmcgQ29uZmlnIEV4YW1wbGU8L2gzPgotCi08cD5Gb3IgdGhlIHB1cnBvc2Ugb2YgdGhpcyBleGFtcGxlLCB3ZSdsbCBjb25maWd1cmUgU3ByaW5nIHZpYSBhIFdBUiBmaWxlJ3MKLXdlYi54bWwuIExldCdzIGFkZCBhIGNvbnRleHQtcGFyYW0gYW5kIGEgbGlzdGVuZXI6PC9wPgotPHByZT4mbHQ7bGlzdGVuZXImZ3Q7Ci0gICAgICAgICZsdDtsaXN0ZW5lci1jbGFzcyZndDtvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5jb250ZXh0LkNvbnRleHRMb2FkZXJMaXN0ZW5lciZsdDsvbGlzdGVuZXItY2xhc3MmZ3Q7Ci0mbHQ7L2xpc3RlbmVyJmd0OwotJmx0O2NvbnRleHQtcGFyYW0mZ3Q7Ci0gICAgICAmbHQ7cGFyYW0tbmFtZSZndDtjb250ZXh0Q29uZmlnTG9jYXRpb24mbHQ7L3BhcmFtLW5hbWUmZ3Q7Ci0gICAgICAmbHQ7cGFyYW0tdmFsdWUmZ3Q7L1dFQi1JTkYvYXBwbGljYXRpb25Db250ZXh0LnhtbCZsdDsvcGFyYW0tdmFsdWUmZ3Q7Ci0mbHQ7L2NvbnRleHQtcGFyYW0mZ3Q7PC9wcmU+Ci0KLTxwPk5leHQgd2Ugd2lsbCBzaG93IHR3byBleGFtcGxlcyBvZiBTcHJpbmcncyAvV0VCLUlORi9hcHBsaWNhdGlvbkNvbnRleHQueG1sCi1yZWZlcmVuY2VkIGluIHRoZSB3ZWIueG1sIGxpc3RlbmVyIC0gIG9uZSB1c2luZyBhIFNlcnZsZXRDb250ZXh0LCBhbmQgb25lCi13aXRob3V0LjwvcD4KLTxhIG5hbWU9IjIzIj48L2E+Ci0KLTxoMz5XaXRoIGEgU2VydmxldENvbnRleHQ8L2gzPgotCi08cD5UaGlzIGV4YW1wbGUgKHdpdGggYSBTZXJ2bGV0Q29udGV4dCkgYXBwbGljYXRpb25Db250ZXh0LnhtbCBzaG91bGQgYmUKLWZhbWlsaWFyIHRvIGFueSBTcHJpbmcgdXNlcjo8L3A+Ci08cHJlPiZsdDs/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8mZ3Q7Ci0mbHQ7IURPQ1RZUEUgYmVhbnMgUFVCTElDICItLy9TUFJJTkcvL0RURCBCRUFOLy9FTiIgImh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9kdGQvc3ByaW5nLWJlYW5zLmR0ZCImZ3Q7Ci0KLSZsdDtiZWFucyZndDsKLSAgJmx0OyEtLSBBeGlzMiBXZWIgU2VydmljZSwgYnV0IHRvIFNwcmluZywgaXRzIGp1c3QgYW5vdGhlciBiZWFuIHRoYXQgaGFzIGRlcGVuZGVuY2llcyAtLSZndDsKLSAgJmx0O2JlYW4gaWQ9InNwcmluZ0F3YXJlU2VydmljZSIgY2xhc3M9InNwcmluZy5TcHJpbmdBd2FyZVNlcnZpY2UiJmd0OwotICAgICZsdDtwcm9wZXJ0eSBuYW1lPSJteUJlYW4iIHJlZj0ibXlCZWFuIi8mZ3Q7Ci0gICZsdDsvYmVhbiZndDsKLQotICAmbHQ7IS0tIGp1c3QgYW5vdGhlciBiZWFuIC8gaW50ZXJmYWNlIHdpdGggYSB3aXJlZCBpbXBsZW1lbnRhdGlvbiwgdGhhdCdzIGluamVjdGVkIGJ5IFNwcmluZwotICAgICAgICAgIGludG8gdGhlIFdlYiBTZXJ2aWNlIC0tJmd0OwotICAgJmx0O2JlYW4gaWQ9Im15QmVhbiIgY2xhc3M9InNwcmluZy5NeUJlYW5JbXBsIiZndDsKLSAgICAgJmx0O3Byb3BlcnR5IG5hbWU9InZhbCIgdmFsdWU9IlNwcmluZywgZW1lcmdlIHRoeXNlbGYiIC8mZ3Q7Ci0gICZsdDsvYmVhbiZndDsKLSZsdDsvYmVhbnMmZ3Q7PC9wcmU+Ci0KLTxwPklmIHRoZSBzZXJ2aWNlIGlzIHJ1bm5pbmcgaW4gYSBTZXJ2bGV0IENvbnRhaW5lciwgaS5lLiwgQXhpczIgd2lsbCBiZSBhYmxlCi10byBnZXQgYSBob2xkIG9mIHRoZSBTZXJ2bGV0Q29udGV4dCwgdGhlIHNlcnZpY2VzLnhtbCBmb3IgdGhlIGV4YW1wbGUgd291bGQKLWJlIHVzaW5nIFNwcmluZ1NlcnZsZXRDb250ZXh0T2JqZWN0U3VwcGxpZXIgc3VjaCBhczo8L3A+Ci08cHJlPiAmbHQ7c2VydmljZSBuYW1lPSJTcHJpbmdBd2FyZVNlcnZpY2UiJmd0OwotICAgICZsdDtkZXNjcmlwdGlvbiZndDsKLSAgICAgICAgc2ltcGxlIHNwcmluZyBleGFtcGxlCi0gICAgJmx0Oy9kZXNjcmlwdGlvbiZndDsKLSAgICAmbHQ7cGFyYW1ldGVyIG5hbWU9IlNlcnZpY2VPYmplY3RTdXBwbGllciImZ3Q7b3JnLmFwYWNoZS5heGlzMi5leHRlbnNpb25zLnNwcmluZy5yZWNlaXZlcnMuU3ByaW5nU2VydmxldENvbnRleHRPYmplY3RTdXBwbGllciZsdDsvcGFyYW1ldGVyJmd0OwotICAgICZsdDtwYXJhbWV0ZXIgbmFtZT0iU3ByaW5nQmVhbk5hbWUiJmd0O3NwcmluZ0F3YXJlU2VydmljZSZsdDsvcGFyYW1ldGVyJmd0OwotICAgICZsdDtvcGVyYXRpb24gbmFtZT0iZ2V0VmFsdWUiJmd0OwotICAgICAgICAmbHQ7bWVzc2FnZVJlY2VpdmVyIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5SYXdYTUxJTk91dE1lc3NhZ2VSZWNlaXZlciIvJmd0OwotICAgICZsdDsvb3BlcmF0aW9uJmd0OwotJmx0Oy9zZXJ2aWNlJmd0OyA8L3ByZT4KLQotPHA+V2hpbGUgdGhlIGFib3ZlIGV4YW1wbGUgdXNlcyBSYXdYTUxJTk91dE1lc3NhZ2VSZWNlaXZlciBhcyBpdHMKLW1lc3NhZ2VSZWNlaXZlciBjbGFzcywgYWxsIE1lc3NhZ2UgUmVjZWl2ZXJzIGFyZSBjdXJyZW50bHkgc3VwcG9ydGVkLCBhcwotd291bGQgYmUgYW55IE1lc3NhZ2UgUmVjZWl2ZXIgdGhhdCBleHRlbmRzCi1vcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5BYnN0cmFjdE1lc3NhZ2VSZWNlaXZlciAuPC9wPgotPGEgbmFtZT0iMjQiPjwvYT4KLQotPGgzPldpdGhvdXQgYSBTZXJ2bGV0Q29udGV4dDwvaDM+Ci0KLTxwPkluIGNhc2UgQXhpczIgY2FuJ3QgZ2V0IGEgU2VydmxldENvbnRleHQsIChpLmUuLCB1c2VzIGEgZGlmZmVyZW50Ci10cmFuc3BvcnQgb3IgaXMgcnVubmluZyBBeGlzMiBpbnNpZGUgdGhlIEFBUiBldGMsKSB5b3UgaGF2ZSB0aGUgb3B0aW9uIG9mCi1kZWZpbmluZyBhIGJlYW4gdGhhdCB0YWtlcyBhZHZhbnRhZ2Ugb2YgU3ByaW5nJ3MgaW50ZXJuYWwgYWJpbGl0aWVzCi0oQXBwbGljYXRpb25Db250ZXh0QXdhcmUgaW50ZXJmYWNlLCBzcGVjaWZpY2FsbHkpIHRvIHByb3ZpZGUgYW4gQXBwbGljYXRpb24KLUNvbnRleHQgdG8gQXhpczIsIHdpdGggYSBiZWFuIHJlZiAnYXBwbGljYXRpb25Db250ZXh0JyA6PC9wPgotPHByZT4mbHQ7P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Jmd0OwotJmx0OyFET0NUWVBFIGJlYW5zIFBVQkxJQyAiLS8vU1BSSU5HLy9EVEQgQkVBTi8vRU4iICJodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvZHRkL3NwcmluZy1iZWFucy5kdGQiJmd0OwotCi0mbHQ7YmVhbnMmZ3Q7Ci0gICZsdDshLS0gQ29uZmlndXJlIHNwcmluZyB0byBnaXZlIGEgaG9vayB0byBheGlzMiB3aXRob3V0IGEgU2VydmxldENvbnRleHQgLS0mZ3Q7Ci0gICZsdDtiZWFuIGlkPSJhcHBsaWNhdGlvbkNvbnRleHQiIAotICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmV4dGVuc2lvbnMuc3ByaW5nLnJlY2VpdmVycy5BcHBsaWNhdGlvbkNvbnRleHRIb2xkZXIiIC8mZ3Q7Ci0KLSAgJmx0OyEtLSBBeGlzMiBXZWIgU2VydmljZSwgYnV0IHRvIFNwcmluZywgaXRzIGp1c3QgYW5vdGhlciBiZWFuIHRoYXQgaGFzIGRlcGVuZGVuY2llcyAtLSZndDsKLSAgJmx0O2JlYW4gaWQ9InNwcmluZ0F3YXJlU2VydmljZSIKLSAgICAgICAgY2xhc3M9InNwcmluZy5TcHJpbmdBd2FyZVNlcnZpY2UiJmd0OwotICAgICZsdDtwcm9wZXJ0eSBuYW1lPSJteUJlYW4iIHJlZj0ibXlCZWFuIiAvJmd0OwotICAmbHQ7L2JlYW4mZ3Q7Ci0KLSAgJmx0OyEtLSBqdXN0IGFub3RoZXIgYmVhbiB3aXRoIGEgd2lyZWQgaW1wbGVtZW50YXRpb24sIHRoYXQncyBpbmplY3RlZCBieSBTcHJpbmcgCi0gICAgICAgICAgaW50byB0aGUgV2ViIFNlcnZpY2UgLS0mZ3Q7Ci0gICAmbHQ7YmVhbiBpZD0ibXlCZWFuIgotICAgICAgICBjbGFzcz0ic3ByaW5nLk15QmVhbkltcGwiJmd0OwotICAgICAmbHQ7cHJvcGVydHkgbmFtZT0idmFsIiB2YWx1ZT0iU3ByaW5nLCBlbWVyZ2UgdGh5c2VsZiIgLyZndDsKLSAgJmx0Oy9iZWFuJmd0OwotJmx0Oy9iZWFucyZndDs8L3ByZT4KLQotPHA+SWYgdGhlIHNlcnZpY2UgaXMgPHN0cm9uZz5ub3Q8L3N0cm9uZz4gcnVubmluZyBpbiBhIFNlcnZsZXQgQ29udGFpbmVyLAotaS5lLiwgQXhpczIgd2lsbCBub3QgYmUgYWJsZSB0byBnZXQgYSBob2xkIG9mIFNlcnZsZXRDb250ZXh0IG9yIHlvdSBwcmVmZXIKLW5vdCB0bywgdGhlIHNlcnZpY2VzLnhtbCBmb3IgdGhlIGV4YW1wbGUgd2lsbCBiZSB1c2luZwotU3ByaW5nQXBwQ29udGV4dEF3YXJlT2JqZWN0U3VwcGxpZXIgc3VjaCBhczo8L3A+Ci08cHJlPiAmbHQ7c2VydmljZSBuYW1lPSJTcHJpbmdBd2FyZVNlcnZpY2UiJmd0OwotICAgICZsdDtkZXNjcmlwdGlvbiZndDsKLSAgICAgICAgc2ltcGxlIHNwcmluZyBleGFtcGxlCi0gICAgJmx0Oy9kZXNjcmlwdGlvbiZndDsKLSAgICAmbHQ7cGFyYW1ldGVyIG5hbWU9IlNlcnZpY2VPYmplY3RTdXBwbGllciImZ3Q7b3JnLmFwYWNoZS5heGlzMi5leHRlbnNpb25zLnNwcmluZy5yZWNlaXZlcnMuU3ByaW5nQXBwQ29udGV4dEF3YXJlT2JqZWN0U3VwcGxpZXImbHQ7L3BhcmFtZXRlciZndDsKLSAgICAmbHQ7cGFyYW1ldGVyIG5hbWU9IlNwcmluZ0JlYW5OYW1lIiZndDtzcHJpbmdBd2FyZVNlcnZpY2UmbHQ7L3BhcmFtZXRlciZndDsKLSAgICAmbHQ7b3BlcmF0aW9uIG5hbWU9ImdldFZhbHVlIiZndDsKLSAgICAgICAgJmx0O21lc3NhZ2VSZWNlaXZlciBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuUmF3WE1MSU5PdXRNZXNzYWdlUmVjZWl2ZXIiLyZndDsKLSAgICAmbHQ7L29wZXJhdGlvbiZndDsKLSZsdDsvc2VydmljZSZndDsgPC9wcmU+Ci0KLTxwPldoaWxlIHRoZSBhYm92ZSBleGFtcGxlIHVzZXMgUmF3WE1MSU5PdXRNZXNzYWdlUmVjZWl2ZXIgYXMgaXRzCi1tZXNzYWdlUmVjZWl2ZXIgY2xhc3MsIGFsbCBNZXNzYWdlIFJlY2VpdmVycyBhcmUgY3VycmVudGx5IHN1cHBvcnRlZCwgYXMKLXdvdWxkIGJlIGFueSBNZXNzYWdlIFJlY2VpdmVyIHRoYXQgZXh0ZW5kcwotb3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuQWJzdHJhY3RNZXNzYWdlUmVjZWl2ZXIgLjwvcD4KLQotPHA+SW4gYW4gZW52aXJvbm1lbnQgPHN0cm9uZz53aXRob3V0IGEgU2VydmxldENvbnRleHQ8L3N0cm9uZz4sIG9uZSB3YXkgeW91Ci1jb3VsZCBsb2FkIHRoZSBhcHBsaWNhdGlvbkNvbnRleHQueG1sIGZpbGUgaXMgaW4gYSBwbGFjZSB0aGF0IHdpbGwgYmUgcnVuCi1vbmNlLiBVcG9uIHN0YXJ0LXVwLCBleGVjdXRlIHRoZSBmb2xsb3dpbmc6PC9wPgotPHByZT5pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5jb250ZXh0LnN1cHBvcnQuQ2xhc3NQYXRoWG1sQXBwbGljYXRpb25Db250ZXh0OwotCi0gcHVibGljIHZvaWQgY3JlYXRlU3ByaW5nQXBwQ3R4KENsYXNzTG9hZGVyIGNsKQotICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICBDbGFzc1BhdGhYbWxBcHBsaWNhdGlvbkNvbnRleHQgY3R4ID0gbmV3Ci0gICAgICBDbGFzc1BhdGhYbWxBcHBsaWNhdGlvbkNvbnRleHQobmV3IFN0cmluZ1tdIHtDb25zdGFudHMuTVlfUEFUSCArCi0gICAgICAic3ByaW5nL2FwcGxpY2F0aW9uQ29udGV4dC54bWwifSwgZmFsc2UpOwotICAgICAgICAgICBjdHguc2V0Q2xhc3NMb2FkZXIoY2wpOwotICAgICAgICAgICBjdHgucmVmcmVzaCgpOzwvcHJlPgotfSA8YSBuYW1lPSIyNSI+PC9hPgotCi08aDM+UHV0dGluZyBJdCBBbGwgVG9nZXRoZXI8L2gzPgotCi08cD5Gcm9tIGhlcmUsIGl0J3MganVzdCBzdGFuZGFyZCBBeGlzMiBjb2RpbmcuIE9ubHkgbm93IHRoZSBzZXJ2aWNlIGhhcwotU3ByaW5nIHdpcmluZyBjYXBhYmlsaXRpZXMuIFRoZSBpbXBsZW1lbnRhdGlvbiBpcyB0aGUgc2FtZSB3aGV0aGVyIHVzaW5nCi1laXRoZXIgU3ByaW5nU2VydmxldENvbnRleHRPYmplY3RTdXBwbGllciBvcgotU3ByaW5nQXBwQ29udGV4dEF3YXJlT2JqZWN0U3VwcGxpZXIuIFRoZSBzZXJ2aWNlIGlzIGFzIGZvbGxvd3M6PC9wPgotPHByZT5wYWNrYWdlIHNwcmluZzsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NVGV4dDsKLQotcHVibGljIGNsYXNzIFNwcmluZ0F3YXJlU2VydmljZSB7Ci0KLSAgICBwcml2YXRlIE15QmVhbiBteUJlYW4gPSBudWxsOwotCi0gICAgLy9zcHJpbmcgJ2luamVjdHMnIHRoaXMgaW1wbGVtZW50YXRpb24KLSAgICBwdWJsaWMgdm9pZCBzZXRNeUJlYW4oTXlCZWFuIG15QmVhbikgewotICAgICAgICAgICAgdGhpcy5teUJlYW4gPSBteUJlYW47Ci0gICAgfQotCi0gICAgLy8gVGhlIHdlYiBzZXJ2aWNlCi0gICAgcHVibGljIE9NRWxlbWVudCBnZXRWYWx1ZShPTUVsZW1lbnQgaWdub3JlKSB7Ci0gICAgICAgICAgICBPTUZhY3RvcnkgZmFjdG9yeT0KLSAgICAgICAgICAgICAgICBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKTsKLSAgICAgICAgICAgIE9NTmFtZXNwYWNlIHBheWxvYWROcz0gZmFjdG9yeS5jcmVhdGVPTU5hbWVzcGFjZSgKLSAgICAgICAgICAgICAgICAiaHR0cDovL3NwcmluZ0V4YW1wbGUub3JnL2V4YW1wbGUxIiwgImV4YW1wbGUxIik7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgcGF5bG9hZCA9Ci0gICAgICAgICAgICAgICAgZmFjdG9yeS5jcmVhdGVPTUVsZW1lbnQoInN0cmluZyIsIHBheWxvYWROcyk7Ci0gICAgICAgICAgICBPTVRleHQgcmVzcG9uc2UgPSBmYWN0b3J5LmNyZWF0ZU9NVGV4dCh0aGlzLm15QmVhbi5lbWVyZ2UoKSk7Ci0gICAgICAgICAgICBwYXlsb2FkLmFkZENoaWxkKHJlc3BvbnNlKTsKLSAgICAgICAgICAgIHJldHVybiBwYXlsb2FkOwotICAgIH0KLX0gPC9wcmU+Ci0KLTxwPkZvciB0aG9zZSB3aG8gYXJlIG5ldyB0byBTcHJpbmcsIG9uZSBvZiB0aGUgaWRlYXMgaXMgdGhhdCB5b3UgcHJvZ3JhbSBhbgotSW50ZXJmYWNlLCBhcyB0aGUgaW1wbGVtZW50YXRpb24gaXMgcGx1Z2dhYmxlLiBUaGlzIGlkZWEgaXMgcmVmZXJlbmNlZCBpbiB0aGUKLVNwcmluZyBjb25maWcgZmlsZSBhYm92ZS4gQmVsb3cgaXMgdGhlIGludGVyZmFjZTo8L3A+Ci08cHJlPnBhY2thZ2Ugc3ByaW5nOwotCi0vKiogSW50ZXJmYWNlIGZvciBTcHJpbmcgYXdhcmUgQmVhbiAqLwotcHVibGljIGludGVyZmFjZSBNeUJlYW4gewotICAgICAgICAgU3RyaW5nIGVtZXJnZSgpOwotfTwvcHJlPgotCi08cD5IZXJlJ3MgdGhlIGltcGxlbWVudGF0aW9uOjwvcD4KLTxwcmU+LyoqIFNwcmluZyB3aXJlZCBpbXBsZW1lbnRhdGlvbiAqLwotcHVibGljIGNsYXNzIE15QmVhbkltcGwgaW1wbGVtZW50cyBNeUJlYW4gewotCi0gICAgU3RyaW5nIHN0ciA9IG51bGw7Ci0gICAgLy8gc3ByaW5nICdpbmplY3RzJyB0aGlzIHZhbHVlCi0gICAgcHVibGljIHZvaWQgc2V0VmFsKFN0cmluZyBzKSB7Ci0gICAgICAgIHN0ciA9IHM7Ci0gICAgfQotICAgIC8vIHdlYiBzZXJ2aWNlIGdldHMgdGhpcyB2YWx1ZQotICAgIHB1YmxpYyBTdHJpbmcgZW1lcmdlKCkgewotICAgICAgICByZXR1cm4gc3RyOwotICAgIH0KLX08L3ByZT4KLQotPHA+TGFzdGx5IGhlcmUncyB0aGUgY2xpZW50IC0gbm90IHJlYWxseSBuZWNlc3NhcnkgZm9yIHRoZSBleGFtcGxlLCBvdGhlcgotdGhhbiBmb3IgY29tcGxldGVuZXNzOjwvcD4KLTxwcmU+cGFja2FnZSBjbGllbnQ7Ci0KLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MT3V0cHV0RmFjdG9yeTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuT3B0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5TZXJ2aWNlQ2xpZW50OwotCi1wdWJsaWMgY2xhc3MgVGVzdENsaWVudCB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgRW5kcG9pbnRSZWZlcmVuY2UgdGFyZ2V0RVBSID0KLSAgICAgICAgbmV3IEVuZHBvaW50UmVmZXJlbmNlKAotICAgICAgICAgICAgICAgImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9heGlzMi9zZXJ2aWNlcy9TcHJpbmdBd2FyZVNlcnZpY2UiKTsKLQotICAgIC8qKgotICAgICAqIFNpbXBsZSBheGlzMiBjbGllbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYXJncyBNYWluCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgT01GYWN0b3J5IGZhY3RvcnkgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKTsKLSAgICAgICAgICAgIE9NTmFtZXNwYWNlIG9tTnMgPSBmYWN0b3J5LmNyZWF0ZU9NTmFtZXNwYWNlKAotICAgICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly9zcHJpbmdFeGFtcGxlLm9yZy9leGFtcGxlMSIsICJleGFtcGxlMSIpOwotCi0gICAgICAgICAgICBPTUVsZW1lbnQgbWV0aG9kID0gZmFjdG9yeS5jcmVhdGVPTUVsZW1lbnQoImdldFZhbHVlIiwgb21Ocyk7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgdmFsdWUgPSBmYWN0b3J5LmNyZWF0ZU9NRWxlbWVudCgiVGV4dCIsIG9tTnMpOwotICAgICAgICAgICAgdmFsdWUuYWRkQ2hpbGQoZmFjdG9yeS5jcmVhdGVPTVRleHQodmFsdWUsICJTb21lIFN0cmluZyAiKSk7Ci0gICAgICAgICAgICBtZXRob2QuYWRkQ2hpbGQodmFsdWUpOwotCi0gICAgICAgICAgICBTZXJ2aWNlQ2xpZW50IHNlcnZpY2VDbGllbnQgPSBuZXcgU2VydmljZUNsaWVudCgpOwotCi0gICAgICAgICAgICBPcHRpb25zIG9wdGlvbnMgPSBuZXcgT3B0aW9ucygpOwotICAgICAgICAgICAgc2VydmljZUNsaWVudC5zZXRPcHRpb25zKG9wdGlvbnMpOwotICAgICAgICAgICAgb3B0aW9ucy5zZXRUbyh0YXJnZXRFUFIpOwotCi0gICAgICAgICAgICAvL0Jsb2NraW5nIGludm9jYXRpb24KLSAgICAgICAgICAgIE9NRWxlbWVudCByZXN1bHQgPSBzZXJ2aWNlQ2xpZW50LnNlbmRSZWNlaXZlKG1ldGhvZCk7Ci0KLSAgICAgICAgICAgIFN0cmluZ1dyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgICAgICAgICByZXN1bHQuc2VyaWFsaXplKFhNTE91dHB1dEZhY3RvcnkubmV3SW5zdGFuY2UoKQotICAgICAgICAgICAgICAgICAgICAuY3JlYXRlWE1MU3RyZWFtV3JpdGVyKHdyaXRlcikpOwotICAgICAgICAgICAgd3JpdGVyLmZsdXNoKCk7Ci0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUmVzcG9uc2U6ICIgKyB3cml0ZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19IDwvcHJlPgotCi08cD5UaGUgZXhhbXBsZXMgYWJvdmUgYXNzdW1lIHRoYXQgYm90aCB0aGUgc3ByaW5nIGZyYW1ld29yayAuamFyIGFuZCB0aGUKLWF4aXMyLXNwcmluZy0qLmphciBhcmUgdW5kZXIgV0VCLUlORi9saWIuIEluIHN1Y2ggYSBjYXNlLCB0aGUgY2xhc3NlcyBzaG93bgotaW4gdGhpcyB0dXRvcmlhbCBuZWVkIHRvIGJlIHBsYWNlZCBpbiBhIEpBUiB1bmRlciBXRUItSU5GL2xpYi4gSW4gdGhpcwotZXhhbXBsZSB0aGUgSkFSIGxheW91dCBpczo8L3A+Ci08c291cmNlPjxwcmU+Li9teVNwcmluZy5qYXIKLS4vTUVUQS1JTkYKLS4vTUVUQS1JTkYvTUFOSUZFU1QuTUYKLS4vc3ByaW5nCi0uL3NwcmluZy9NeUJlYW4uY2xhc3MKLS4vc3ByaW5nL015QmVhbkltcGwuY2xhc3MKLS4vc3ByaW5nL1NwcmluZ0F3YXJlU2VydmljZS5jbGFzczwvcHJlPgotPC9zb3VyY2U+Ci08cD5TaW5jZSBhbGwgdGhlIHVzZXIgY2xhc3NlcyBhcmUgaW4gbXlTcHJpbmcuamFyIGluIHRoaXMgZXhhbXBsZSwgdGhlIEFBUgotbWVyZWx5IGNvbnRhaW5zIHRoZSBzZXJ2aWNlcy54bWwgZmlsZTo8L3A+Ci08c291cmNlPjxwcmU+Li9zcHJpbmdFeGFtcGxlLmFhcgotLi9NRVRBLUlORgotLi9NRVRBLUlORi9NQU5JRkVTVC5NRgotLi9NRVRBLUlORi9zZXJ2aWNlcy54bWw8L3ByZT4KLTwvc291cmNlPgotPHA+VG8gcnVuIHRoaXMgZXhhbXBsZSwgbWFrZSBzdXJlIHlvdSBoYXZlIHRoZSBheGlzMi1zcHJpbmcqLmphciB0aGF0IGNvbWVzCi1mcm9tIHRoZSBheGlzMi1zdGQtKi1iaW4gZGlzdHJvIGluIHRoZSBzZXJ2ZXIgc2lkZSBXRUItSU5GL2xpYiwgYXMgd2VsbCBhcwotdGhlIGFwcHJvcHJpYXRlIFNwcmluZyBqYXIgLSBtb3N0IHdpbGwgdXNlIHRoZSBmdWxsIHNwcmluZy5qYXIsIGJ1dCB0aGUKLW1pbmltdW0gcmVxdWlyZW1lbnRzIGFyZSBzcHJpbmctY29yZSwgc3ByaW5nLWJlYW5zLCBzcHJpbmctY29udGV4dCwgYW5kCi1zcHJpbmctd2ViLiBXaGVuIHJ1bm5pbmcgdGhlIGNsaWVudCwgeW91IHNob3VsZCBzZWUgdGhpcyBvdXRwdXQ6PC9wPgotPHByZT5SZXNwb25zZTogJmx0O2V4YW1wbGUxOnN0cmluZyB4bWxuczpleGFtcGxlMT0iaHR0cDovL3NwcmluZ0V4YW1wbGUub3JnL2V4YW1wbGUxIiAKLSAgeG1sbnM6dG5zPSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMiImZ3Q7U3ByaW5nLCBlbWVyZ2UgdGh5c2VsZiZsdDsvZXhhbXBsZTE6c3RyaW5nJmd0OzwvcHJlPgotPGEgbmFtZT0iMjYiPjwvYT4KLQotPGgzPlNwcmluZyBJbnNpZGUgYW4gQUFSPC9oMz4KLQotPHA+QXhpczIgdXNlcnMgZnJlcXVlbnRseSB3YW50IHRvIHJ1biBTcHJpbmcgaW5zaWRlIHRoZSBBQVIuIEhlcmUgd2Ugc2hvdyB5b3UKLWhvdyBpdCBpcyBkb25lLiBUaGVyZSBhcmUgZm91ciBwb2ludHMgdG8gYmUgYXdhcmUgb2Y6PC9wPgotCi08cD4oQSkgWW91IG5lZWQgdG8gY29uZmlndXJlIFNwcmluZyB0byB1c2UgdGhlIEF4aXMyIFNlcnZpY2UgQ2xhc3Nsb2FkZXIuIFNlZQotdGhlIDxhIGhyZWY9IiMyNjMiPktub3duIGlzc3VlcyBydW5uaW5nIFNwcmluZyBpbnNpZGUgdGhlIEFBUjwvYT4gYXJlYS48L3A+Ci0KLTxwPihCKSBJdCdzIHVwIHRvIHlvdSB0byBsb2FkIFNwcmluZywgdGhvdWdoIHdlIGdpdmUgYW4gZXhhbXBsZSBiZWxvdy48L3A+Ci0KLTxwPihDKSBGb3IgcmVhc29ucyBzdWNoIGFzIGNsYXNzbG9hZGVyIGlzb2xhdGlvbiwgdGhlCi1TcHJpbmdBcHBDb250ZXh0QXdhcmVPYmplY3RTdXBwbGllciBpcyB0aGUgYmVzdCBjaG9pY2UuPC9wPgotCi08cD4oRCkgVGhlIHNwcmluZ2ZyYW1ld29yayAuamFyIGFuZCBheGlzMi1zcHJpbmctKi5qYXIgd2lsbCBiZSBwbGFjZWQgaW5zaWRlCi10aGUgQUFSIHVuZGVyIHRoZSBsaWIgZGlyZWN0b3J5LiBQbGVhc2UgPHN0cm9uZz5tb3ZlPC9zdHJvbmc+IHRoZQotYXhpczItc3ByaW5nLSouamFyIGZyb20gV0VCLUlORi9saWIgdG8gaW5zaWRlIHRoZSBBQVIsIGFzIHNob3duIGJlbG93IC0gaXQKLXdpbGwgPHN0cm9uZz5ub3Q8L3N0cm9uZz4gd29yayBvdGhlcndpc2UuPC9wPgotPHVsPgotICA8bGk+PHN0cm9uZz48YSBuYW1lPSIyNjEiPjwvYT5UaGUgU3ByaW5nIGluc2lkZSBhbiBBQVIgbGF5b3V0PC9zdHJvbmc+PC9saT4KLTwvdWw+Ci08c291cmNlPjxwcmU+Li9zcHJpbmdFeGFtcGxlLmFhcgotLi9NRVRBLUlORgotLi9NRVRBLUlORi9NQU5JRkVTVC5NRgotLi9NRVRBLUlORi9zZXJ2aWNlcy54bWwKLS4vYXBwbGljYXRpb25Db250ZXh0LnhtbAotLi9saWIKLS4vbGliL2F4aXMyLXNwcmluZy0xLjQuamFyCi0uL2xpYi9zcHJpbmcuamFyCi0uL3NwcmluZwotLi9zcHJpbmcvTXlCZWFuLmNsYXNzCi0uL3NwcmluZy9NeUJlYW5JbXBsLmNsYXNzCi0uL3NwcmluZy9TcHJpbmdBd2FyZVNlcnZpY2UuY2xhc3MKLS4vc3ByaW5nL1NwcmluZ0luaXQuY2xhc3MgPC9wcmU+Ci08L3NvdXJjZT4KLTxwPkFzIGV4cGxhaW5lZCBpbiB0aGUgPGEgaHJlZj0iIzI0Ij5XaXRob3V0IGEgU2VydmxldENvbnRleHQ8L2E+IHNlY3Rpb24sCi10aGUgJ1NwcmluZyBpbnNpZGUgYW4gQUFSJyBjb25maWcgbmVlZHMgdG8gaG9vayBBeGlzMiBhbmQgU3ByaW5nIHRvZ2V0aGVyIHZpYQotYSBTcHJpbmcgYmVhbi4gUGxhY2UgdGhlIGZvbGxvd2luZyBpbiB5b3VyIFNwcmluZyBjb25maWcgZmlsZTo8L3A+Ci08cHJlPiAgJmx0OyEtLSBDb25maWd1cmUgc3ByaW5nIHRvIGdpdmUgYSBob29rIHRvIGF4aXMyIHdpdGhvdXQgYSBTZXJ2bGV0Q29udGV4dCAtLSZndDsKLSAgJmx0O2JlYW4gaWQ9ImFwcGxpY2F0aW9uQ29udGV4dCIgCi0gICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZXh0ZW5zaW9ucy5zcHJpbmcucmVjZWl2ZXJzLkFwcGxpY2F0aW9uQ29udGV4dEhvbGRlciIgLyZndDs8L3ByZT4KLTx1bD4KLSAgPGxpPjxzdHJvbmc+PGEgbmFtZT0iMjYyIj48L2E+VGhlIFNwcmluZyBpbnNpZGUgYW4gQUFSIGluaXQKLSAgY2xhc3M8L3N0cm9uZz48L2xpPgotPC91bD4KLQotPHA+T25lIHdheSB0byBpbml0aWFsaXplIFNwcmluZyBpbnNpZGUgdGhlIEFBUiBpcyB0byB1c2UgdGhlCi1vcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5TZXJ2aWNlTGlmZUN5Y2xlIGludGVyZmFjZS4gSGVyZSB3ZSBnaXZlIGFuCi1leGFtcGxlOjwvcD4KLTxzb3VyY2U+PHByZT5wYWNrYWdlIHNwcmluZzsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLlNlcnZpY2VMaWZlQ3ljbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5jb250ZXh0LnN1cHBvcnQuQ2xhc3NQYXRoWG1sQXBwbGljYXRpb25Db250ZXh0OwotCi1wdWJsaWMgY2xhc3MgU3ByaW5nSW5pdCBpbXBsZW1lbnRzIFNlcnZpY2VMaWZlQ3ljbGUgewotICAgICAgICAKLSAgICAvKioKLSAgICAgKiBUaGlzIHdpbGwgYmUgY2FsbGVkIGR1cmluZyB0aGUgZGVwbG95ZW1lbnQgdGltZSBvZiB0aGUgc2VydmljZS4gCi0gICAgICogaXJyZXNwZWN0aXZlCi0gICAgICogb2YgdGhlIHNlcnZpY2Ugc2NvcGUgdGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdGFydFVwKENvbmZpZ3VyYXRpb25Db250ZXh0IGlnbm9yZSwgQXhpc1NlcnZpY2Ugc2VydmljZSkgewotIAotICAgICAgICB0cnkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTdGFydGluZyBzcHJpbmcgaW5pdCIpOwotICAgICAgICAgICAgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIgPSBzZXJ2aWNlLmdldENsYXNzTG9hZGVyKCk7Ci0gICAgICAgICAgICBDbGFzc1BhdGhYbWxBcHBsaWNhdGlvbkNvbnRleHQgYXBwQ3R4ID0gbmV3Ci0gICAgICAgICAgICBDbGFzc1BhdGhYbWxBcHBsaWNhdGlvbkNvbnRleHQobmV3IFN0cmluZ1tdIHsiYXBwbGljYXRpb25Db250ZXh0LnhtbCJ9LCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgYXBwQ3R4LnNldENsYXNzTG9hZGVyKGNsYXNzTG9hZGVyKTsKLSAgICAgICAgICAgICAgICBhcHBDdHgucmVmcmVzaCgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJzcHJpbmcgbG9hZGVkIik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHdpbGwgYmUgY2FsbGVkIGR1cmluZyB0aGUgc3lzdGVtIHNodXQgZG93biB0aW1lLiAKLSAgICAgKiBpcnJlc3BlY3RpdmUKLSAgICAgKiBvZiB0aGUgc2VydmljZSBzY29wZSB0aGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNodXREb3duKENvbmZpZ3VyYXRpb25Db250ZXh0IGN0eElnbm9yZSwgQXhpc1NlcnZpY2UgaWdub3JlKSB7Ci0gICAgfQotfTwvcHJlPgotPC9zb3VyY2U+Ci08cD5IZXJlJ3MgdGhlIHNlcnZpY2VzLnhtbCB0aGF0IG5vdyBpbmNsdWRlcyBTcHJpbmdJbml0IGFuZCB0aGUKLVNwcmluZ0F3YXJlU2VydmljZSBzaG93biBhYm92ZS4gVGhlcmUgaXMgYWxzbyB0aGUgY29tcG9zaXRlIHBhcmFtZXRlciB3aGljaAotaXMgbmVlZGVkIHdoZW4gbG9hZGluZyBTcHJpbmcgaW4gdGhlIEFBUiAtIHNlZSB0aGUgPGEgaHJlZj0iIzI2MyI+S25vd24KLWlzc3VlcyBydW5uaW5nIFNwcmluZyBpbnNpZGUgdGhlIEFBUjwvYT4gYXJlYS48L3A+Ci08c291cmNlPjxwcmU+Jmx0O3NlcnZpY2VHcm91cCZndDsKLSAgJmx0OyEtLSBJbnZva2UgU3ByaW5nSW5pdCBvbiBzZXJ2ZXIgc3RhcnR1cCBhbmQgc2h1dGRvd24gLS0mZ3Q7Ci0gICZsdDtzZXJ2aWNlIG5hbWU9IlNwcmluZ0F3YXJlU2VydmljZSIgY2xhc3M9InNwcmluZy5TcHJpbmdJbml0IiZndDsKLSAgICAmbHQ7ZGVzY3JpcHRpb24mZ3Q7Ci0gICAgICAgICBzaW1wbGUgc3ByaW5nIGV4YW1wbGUgLSBpbnNpZGUgdGhlIEFBUgotICAgICZsdDsvZGVzY3JpcHRpb24mZ3Q7Ci0gICAgJmx0OyEtLSBuZWVkIHRoZSBUQ0NMIHBhcmFtIHdoZW4gdXNpbmcgc3ByaW5nIGluc2lkZSB0aGUgQUFSIC0tJmd0OwotICAgICZsdDtwYXJhbWV0ZXIgbmFtZT0iU2VydmljZVRDQ0wiJmd0O2NvbXBvc2l0ZSZsdDsvcGFyYW1ldGVyJmd0OwotICAgICZsdDtwYXJhbWV0ZXIgbmFtZT0iU2VydmljZU9iamVjdFN1cHBsaWVyIiZndDtvcmcuYXBhY2hlLmF4aXMyLmV4dGVuc2lvbnMuc3ByaW5nLnJlY2VpdmVycy5TcHJpbmdBcHBDb250ZXh0QXdhcmVPYmplY3RTdXBwbGllciZsdDsvcGFyYW1ldGVyJmd0OwotICAgICZsdDtwYXJhbWV0ZXIgbmFtZT0iU3ByaW5nQmVhbk5hbWUiJmd0O3NwcmluZ0F3YXJlU2VydmljZSZsdDsvcGFyYW1ldGVyJmd0OwotICAgICZsdDtvcGVyYXRpb24gbmFtZT0iZ2V0VmFsdWUiJmd0OwotICAgICAgICAmbHQ7bWVzc2FnZVJlY2VpdmVyIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5SYXdYTUxJTk91dE1lc3NhZ2VSZWNlaXZlciIvJmd0OwotICAgICZsdDsvb3BlcmF0aW9uJmd0OwotICAmbHQ7L3NlcnZpY2UmZ3Q7Ci0mbHQ7L3NlcnZpY2VHcm91cCZndDs8L3ByZT4KLTwvc291cmNlPjx1bD4KLSAgPGxpPjxzdHJvbmc+PGEgbmFtZT0iMjYzIj48L2E+S25vd24gaXNzdWVzIHJ1bm5pbmcgU3ByaW5nIGluc2lkZSB0aGUKLSAgICBBQVI8L3N0cm9uZz48L2xpPgotPC91bD4KLQotPHA+QnkgZGVmYXVsdCwgdGhlIEF4aXMyIGNsYXNzbG9hZGVyIHN0cmF0ZWd5IGRvZXMgbm90IHBlcm1pdCBTcHJpbmcgdG8gcnVuCi1pbnNpZGUgdGhlIEFBUi4gVG8gYWxsb3cgU3ByaW5nIHRvIHJ1biBpbnNpZGUgdGhlIEFBUiwgdGhlICdjb21wb3NpdGUnCi1wYXJhbWV0ZXIgaXMgdXNlZCBpbiB0aGUgc2VydmljZXMueG1sIGFzIHNob3duIGluIHRoZSBleGFtcGxlIGFib3ZlLiBUaGVyZQotd2FzIGRlZmF1bHQgYmVoYXZpb3Igb2YgJ2NvbXBvc2l0ZScgaW4gdGhlIGRldmVsb3BtZW50IGN5Y2xlIGluIGJldHdlZW4gMS4wCi1hbmQgMS4xLCBidXQgaXQgcmVzdWx0ZWQgaW4gdGhlIEpJUkEgaXNzdWUgQVhJUzItMTIxNCAtcHJvYmxlbXMgd2l0aCBnZXR0aW5nCi1hbiBpbml0Q29udGV4dC5sb29rdXAoKSBoYW5kbGUgaW5zaWRlIHRoZSBBQVIuIFNwcmluZyB1c2VycyB0eXBpY2FsbHkgaGF2ZQotbGl0dGxlIGRlc2lyZSB0byB1c2UgaW5pdENvbnRleHQubG9va3VwKCksIGFzIHRoZXkgZ2V0IHRoZWlyIERhdGFzb3VyY2VzIHZpYQotb3JnLnNwcmluZ2ZyYW1ld29yay5qZGJjLmRhdGFzb3VyY2UuRHJpdmVyTWFuYWdlckRhdGFTb3VyY2UgaW4gYW4gWE1MIGZpbGUgb3IKLXdpdGggYW5ub3RhdGlvbnMuIEZvciBFSkIgaG9tZSByZWZlcmVuY2VzIGFuZCB0aGUgbGlrZSwgU3ByaW5nIHByb3ZpZGVzCi1KbmRpT2JqZWN0RmFjdG9yeUJlYW4uIDwvcD4KLQotPHA+QSBjb21tb24gcmVxdWlyZW1lbnQgaXMgdG8gcnVuIEhpYmVybmF0ZSBhbG9uZyB3aXRoIFNwcmluZyB3aXRoIEF4aXMyIHdlYiBzZXJ2aWNlcy4KLUl0IGlzIGVhc2llciB0byBydW4gSGliZXJuYXRlIGFzIHdlbGwgYXMgU3ByaW5nIG91dHNpZGUgdGhlIEFBUiBhcyBzaG93biBpbiB0aGUgCi1TZXJ2bGV0Q29udGV4dCBleGFtcGxlLCBpZSwgcGxhY2UgdGhlIFNwcmluZyBhbmQgSGliZXJuYXRlIGphcnMgaW4gV0VCLUlORi9saWIgYW5kIAotdGhlIGhpYmVybmF0ZSBjb25maWcgZmlsZXMgdW5kZXIgV0VCLUlORi9jbGFzc2VzLiBXaXRoIHRoYXQgYWR2aXNlbWVudCwgU3ByaW5nIHByb3ZpZGVzCi1hbiBBUEkgdGhhdCBhbGxvd3MgU3ByaW5nIHRvIGxvYWQgSGliZXJuYXRlIHVuZGVyIHRoZSBjb250cmFpbnRzIG9mIGFuIEFBUi4gPC9wPgotCi08cD5IaWJlcm5hdGUgYnkgZGVmYXVsdCBsb29rcyBmb3IgaXRzIGNvbmZpZyBmaWxlcyBpbiB0aGUgY2xhc3NwYXRoLiBCeSBydW5uaW5nIEhpYmVybmF0ZQotaW5zaWRlIHRoZSBBQVIsIEhpYmVybmF0ZSB3b24ndCBiZSBhYmxlIHRvIGZpbmQgaXRzIGNvbmZpZyBmaWxlcy4gVGhlIHdheSB0byBnZXQgCi1hcm91bmQgdGhpcyBsaW1pdGF0aW9uIGlzIGVpdGhlciB0byBleHBhbmQgdGhlIEFBUiBvciBwbGFjZSB0aGUgaGliZXJuYXRlIGNvbmZpZwotZmlsZXMgaW4gYSBzcGVjaWZpYyBkaXJlY3RvcnkgdW5kZXIgV0VCLUlORi9jbGFzc2VzIC0gYW5kIHRoZW4gdXNlIAotPGEgaHJlZj0iaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL2RvY3MvYXBpL29yZy9zcHJpbmdmcmFtZXdvcmsvb3JtL2hpYmVybmF0ZS9Mb2NhbFNlc3Npb25GYWN0b3J5QmVhbi5odG1sI3NldE1hcHBpbmdEaXJlY3RvcnlMb2NhdGlvbnMob3JnLnNwcmluZ2ZyYW1ld29yay5jb3JlLmlvLlJlc291cmNlW10pIj5TcHJpbmcncyBzZXRNYXBwaW5nRGlyZWN0b3J5TG9jYXRpb25zPC9hPiBmb3Igc2V2ZXJhbCBvcHRpb25zLiAgPC9wPgotCi08cD5CeSBwbGFjaW5nIFNwcmluZyBpbnRvIERFQlVHIG1vZGUgeW91IGNhbiBsb29rIGF0IHRoZSBsb2dzIHRvIHNlZSB3aGVyZSBTcHJpbmcgd2lsbCBsb29rCi1mb3IgeW91ciBqYXIgLyBjbGFzcyBsb2NhdGlvbnMuIFVzZSB0aGUgd2lsZGNhcmRzIGluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSB0byBsaXN0IHlvdXIgbWFwcGluZyAKLWxvY2F0aW9ucyBhcyBzaG93bjogIDwvcD4KLQotPHNvdXJjZT48cHJlPiZsdDtiZWFuIGlkPSJteVNlc3Npb25GYWN0b3J5IiBjbGFzcz0ib3JnLnNwcmluZ2ZyYW1ld29yay5vcm0uaGliZXJuYXRlMy5Mb2NhbFNlc3Npb25GYWN0b3J5QmVhbiImZ3Q7Ci0gICAgICAgICAgICAgICAgJmx0O3Byb3BlcnR5IG5hbWU9Im1hcHBpbmdMb2NhdGlvbnMiJmd0OwotICAgICAgICAgICAgICAgICAgICZsdDt2YWx1ZSZndDtjbGFzc3BhdGgqOioqL015RW50aXR5LmhibS54bWwmbHQ7L3ZhbHVlJmd0OwotICAgICAgICAgICAgICAgICZsdDsvcHJvcGVydHkmZ3Q7Ci0gICAgICAgICAgICAgICAgLi4uCi0mbHQ7L2JlYW4mZ3Q7IDwvcHJlPgotPC9zb3VyY2U+PC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL3NyYy9BeGlzMlNhbXBsZURvY0xpdFNlcnZpY2VDb2RlLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9zcmMvQXhpczJTYW1wbGVEb2NMaXRTZXJ2aWNlQ29kZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0ZDIwMzUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL3NyYy9BeGlzMlNhbXBsZURvY0xpdFNlcnZpY2VDb2RlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCi08aHRtbD4NCi08aGVhZD4NCi0gIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0iIi8+DQotICA8dGl0bGU+PC90aXRsZT4NCi0gIDxsaW5rIGhyZWY9Ii4uLy4uL2Nzcy9heGlzLWRvY3MuY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBtZWRpYT0iYWxsIiAvPg0KLTwvaGVhZD4NCi0NCi08Ym9keSBsYW5nPSJlbiI+DQotPGgxPkNvZGUgTGlzdGluZyBGb3IgQXhpczJTYW1wbGVEb2NMaXRTZXJ2aWNlIFNlcnZpY2U8L2gxPg0KLQ0KLTxoMj5TZXJ2ZXI6PC9oMj4NCi0NCi08aDM+ZWNob1N0cmluZzwvaDM+DQotDQotPHA+TG9jYXRlIHRoZSBmb2xsb3dpbmcgY29kZSBzZWdtZW50IGluICJBeGlzMlNhbXBsZURvY0xpdFNlcnZpY2VTa2VsZXRvbi5qYXZhIi48YnIvPg0KLTwvcD4NCi08c291cmNlPjxwcmU+cHVibGljIG9yZy5hcGFjaGUuYXhpczIudXNlcmd1aWRlLnhzZC5FY2hvU3RyaW5nUmV0dXJuRG9jdW1lbnQgDQotICAgICAgICBlY2hvU3RyaW5nKG9yZy5hcGFjaGUuYXhpczIudXNlcmd1aWRlLnhzZC5FY2hvU3RyaW5nUGFyYW1Eb2N1bWVudCBwYXJhbTQgKXsNCi0gICAgICAgIC8vVG9kbzogZmlsbCB0aGlzIHdpdGggdGhlIG5lY2Vzc2FyeSBidXNpbmVzcyBsb2dpYw0KLSAgICAgICAgdGhyb3cgbmV3ICBqYXZhLmxhbmcuVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsNCi0gICB9DQotPC9wcmU+PC9zb3VyY2U+DQotDQotPHA+VGhlbiBjb21wbGV0ZSB0aGUgY29kZSBieSBhZGRpbmcgdGhlIGJ1c2luZXNzIGxvZ2ljIGFzIHNob3duIGJlbG93OjwvcD4NCi08c291cmNlPg0KLTxwcmU+cHVibGljIG9yZy5hcGFjaGUuYXhpczIudXNlcmd1aWRlLnhzZC5FY2hvU3RyaW5nUmV0dXJuRG9jdW1lbnQgDQotICAgICAgIGVjaG9TdHJpbmcob3JnLmFwYWNoZS5heGlzMi51c2VyZ3VpZGUueHNkLkVjaG9TdHJpbmdQYXJhbURvY3VtZW50IHBhcmFtNCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgIC8vVXNlIHRoZSBmYWN0b3J5IHRvIGNyZWF0ZSB0aGUgb3V0cHV0IGRvY3VtZW50DQotICAgICAgIG9yZy5hcGFjaGUuYXhpczIudXNlcmd1aWRlLnhzZC5FY2hvU3RyaW5nUmV0dXJuRG9jdW1lbnQgcmV0RG9jID0gDQotICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLnVzZXJndWlkZS54c2QuRWNob1N0cmluZ1JldHVybkRvY3VtZW50LkZhY3RvcnkubmV3SW5zdGFuY2UoKTsNCi0gICAgICAvL3NlbmQgdGhlIHN0cmluZyBiYWNrLg0KLSAgICAgIHJldERvYy5zZXRFY2hvU3RyaW5nUmV0dXJuKHBhcmFtNC5nZXRFY2hvU3RyaW5nUGFyYW0oKSk7DQotICAgICAgcmV0dXJuIHJldERvYzsNCi0gIH08L3ByZT4NCi08L3NvdXJjZT4NCi0NCi08aDM+ZWNob1N0cmluZ0FycmF5PC9oMz4NCi0NCi08cD5UaGUgY29kZSBzZWdtZW50IGZvciBlY2hvU3RyaW5nQXJyYXkgaXMgc2hvd24gYmVsb3c6PC9wPg0KLTxzb3VyY2U+DQotPHByZT5wdWJsaWMgb3JnLmFwYWNoZS5heGlzMi51c2VyZ3VpZGUueHNkLkVjaG9TdHJpbmdBcnJheVJldHVybkRvY3VtZW50IA0KLSAgICAgIGVjaG9TdHJpbmdBcnJheShvcmcuYXBhY2hlLmF4aXMyLnVzZXJndWlkZS54c2QuRWNob1N0cmluZ0FycmF5UGFyYW1Eb2N1bWVudCBwYXJhbTApIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgIC8vVXNlIHRoZSBmYWN0b3J5IHRvIGNyZWF0ZSB0aGUgb3V0cHV0IGRvY3VtZW50Lg0KLSAgICAgb3JnLmFwYWNoZS5heGlzMi51c2VyZ3VpZGUueHNkLkVjaG9TdHJpbmdBcnJheVJldHVybkRvY3VtZW50IHJldERvYyA9IA0KLSAgICAgb3JnLmFwYWNoZS5heGlzMi51c2VyZ3VpZGUueHNkLkVjaG9TdHJpbmdBcnJheVJldHVybkRvY3VtZW50LkZhY3RvcnkubmV3SW5zdGFuY2UoKTsNCi0gICAgIC8vR2V0IHRoZSBTdHJpbmcgYXJyYXkgZnJvbSB0aGUgaW5wdXQgcGFyYW1ldGVycy4NCi0gICAgIFN0cmluZ1tdIGluUGFyYW1zID0gcGFyYW0wLmdldEVjaG9TdHJpbmdBcnJheVBhcmFtKCkuZ2V0U3RyaW5nQXJyYXkoKTsNCi0gICAgIG9yZy5hcGFjaGUuYXhpczIudXNlcmd1aWRlLnhzZC5BcnJheU9mc3RyaW5nTGl0ZXJhbCByZXRQYXJhbXMgPQ0KLSAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIudXNlcmd1aWRlLnhzZC5BcnJheU9mc3RyaW5nTGl0ZXJhbC5GYWN0b3J5Lm5ld0luc3RhbmNlKCk7DQotICAgICAvL1NldCB0aGUgaW5wdXQgcGFyYW1ldGVycyB0byB0aGUgb3V0cHV0IHBhcmFtZXRlcnMgZm9yIGVjaG9pbmcuDQotICAgICBmb3IgKGludCBpID0gMDsgaSAmbHQ7IGluUGFyYW1zLmxlbmd0aDsgaSsrKSB7DQotICAgICAgICAgcmV0UGFyYW1zLmFkZFN0cmluZyhpblBhcmFtc1tpXSk7PGJyLz4gICAgIH0NCi0gICAgIC8vcmV0dXJuIHRoZSBvdXRwdXQgZG9jdW1lbnQuDQotICAgIHJldERvYy5zZXRFY2hvU3RyaW5nQXJyYXlSZXR1cm4ocmV0UGFyYW1zKTsNCi0gICAgcmV0dXJuIHJldERvYzsNCi0gICB9PC9wcmU+DQotPC9zb3VyY2U+DQotDQotPGgzPmVjaG9TdHJ1Y3Q8L2gzPg0KLQ0KLTxwPlRoZSBjb2RlIHNlZ21lbnQgZm9yIGVjaG9TdHJ1Y3QgaXMgc2hvd24gYmVsb3c6PC9wPg0KLTxzb3VyY2U+PHByZT4NCi0gIHB1YmxpYyBvcmcuYXBhY2hlLmF4aXMyLnVzZXJndWlkZS54c2QuRWNob1N0cnVjdFJldHVybkRvY3VtZW50IA0KLSAgICAgICAgZWNob1N0cnVjdChvcmcuYXBhY2hlLmF4aXMyLnVzZXJndWlkZS54c2QuRWNob1N0cnVjdFBhcmFtRG9jdW1lbnQgcGFyYW0yKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIC8vVXNlIHRoZSBmYWN0b3J5IHRvIGNyZWF0ZSB0aGUgb3V0cHV0IGRvY3VtZW50Lg0KLSAgICAgICAgb3JnLmFwYWNoZS5heGlzMi51c2VyZ3VpZGUueHNkLkVjaG9TdHJ1Y3RSZXR1cm5Eb2N1bWVudCByZXREb2MgPQ0KLSAgICAgICAgb3JnLmFwYWNoZS5heGlzMi51c2VyZ3VpZGUueHNkLkVjaG9TdHJ1Y3RSZXR1cm5Eb2N1bWVudC5GYWN0b3J5Lm5ld0luc3RhbmNlKCk7DQotICAgICAgICAvL0dldCB0aGUgU09BUFN0cmN1dCBmcm9tIHRoZSBpbmNvbWluZyBwYXJhbWV0ZXJzDQotICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLnVzZXJndWlkZS54c2QuU09BUFN0cnVjdCBpblN0cnVjdCA9IHBhcmFtMi5nZXRFY2hvU3RydWN0UGFyYW0oKTsNCi0gICAgICAgIC8vU3RydWN0IGZvciB0aGUgc2VuZGluZyBiYWNrDQotICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLnVzZXJndWlkZS54c2QuU09BUFN0cnVjdCBvdXRTdHJ1Y3QgPQ0KLSAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLnVzZXJndWlkZS54c2QuU09BUFN0cnVjdC5GYWN0b3J5Lm5ld0luc3RhbmNlKCk7DQotICAgICAgICAvL0ZpbGwgdGhlIG91dGdvaW5nIHN0cnVjdA0KLSAgICAgICAgb3V0U3RydWN0LnNldFZhckZsb2F0KGluU3RydWN0LmdldFZhckZsb2F0KCkpOw0KLSAgICAgICAgb3V0U3RydWN0LnNldFZhckludChpblN0cnVjdC5nZXRWYXJJbnQoKSk7DQotICAgICAgICBvdXRTdHJ1Y3Quc2V0VmFyU3RyaW5nKGluU3RydWN0LmdldFZhclN0cmluZygpKTsNCi0gICAgICAgIC8vU2V0IHRoZSBvdXRnb2luZyBkb2N1bWVudC4NCi0gICAgICAgIHJldERvYy5zZXRFY2hvU3RydWN0UmV0dXJuKG91dFN0cnVjdCk7DQotICAgICAgICByZXR1cm4gcmV0RG9jOw0KLSAgICB9DQotPC9wcmU+PC9zb3VyY2U+DQotDQotPGgyPkNsaWVudDo8L2gyPg0KLQ0KLTxoMz5DbGllbnQgZm9yIGVjaG9TdHJpbmcgT3BlcmF0aW9uPC9oMz4NCi0NCi08cD5UaGUgZm9sbG93aW5nIGNvZGUgZnJhZ21lbnQgc2hvd3MgdGhlIG5lY2Vzc2FyeSBjb2RlIGZvciB1dGlsaXppbmcgdGhlDQotZWNob1N0cmluZyBvcGVyYXRpb24gb2YgdGhlIEF4aXMyU2FtcGxlRG9jTGl0U2VydmljZSB0aGF0IHdlIGhhdmUgYWxyZWFkeQ0KLWRlcGxveWVkLiBUaGUgY29kZSBpcyB2ZXJ5IHNpbXBsZSB0byB1bmRlcnN0YW5kIGFuZCB0aGUgZXhwbGFuYXRpb25zIGFyZSBpbg0KLXRoZSBmb3JtIG9mIGNvbW1lbnRzLjwvcD4NCi08c291cmNlPjxwcmU+ICAgICB0cnkgew0KLSAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLnVzZXJndWlkZS5BeGlzMlNhbXBsZURvY0xpdFNlcnZpY2VTdHViIHN0dWIgDQotICAgICAgICAgICAgICAgICAgICAgICAgPSBuZXcgb3JnLmFwYWNoZS5heGlzMi51c2VyZ3VpZGUuQXhpczJTYW1wbGVEb2NMaXRTZXJ2aWNlU3R1YihudWxsLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vbG9jYWxob3N0OjgwODAvYXhpczIvc2VydmljZXMvQXhpczJTYW1wbGVEb2NMaXRTZXJ2aWNlIik7DQotICAgICAgICAgICAgICAgICAgICAgIC8vQ3JlYXRlIHRoZSByZXF1ZXN0IGRvY3VtZW50IHRvIGJlIHNlbnQuDQotICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIudXNlcmd1aWRlLnhzZC5FY2hvU3RyaW5nUGFyYW1Eb2N1bWVudCByZXFEb2MgPQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi51c2VyZ3VpZGUueHNkLkVjaG9TdHJpbmdQYXJhbURvY3VtZW50LkZhY3RvcnkubmV3SW5zdGFuY2UoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgcmVxRG9jLnNldEVjaG9TdHJpbmdQYXJhbSgiQXhpczIgRWNobyIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAvL2ludm9rZXMgdGhlIFdlYiBzZXJ2aWNlLg0KLSAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLnVzZXJndWlkZS54c2QuRWNob1N0cmluZ1JldHVybkRvY3VtZW50IHJlc0RvYyA9IA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHViLmVjaG9TdHJpbmcocmVxRG9jKTsNCi0gICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHJlc0RvYy5nZXRFY2hvU3RyaW5nUmV0dXJuKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgfQ0KLTwvcHJlPjwvc291cmNlPg0KLQ0KLTxwPlNpbWlsYXJseSB0aGUgZm9sbG93aW5nIGNvZGUgZnJhZ21lbnRzIHNob3cgY2xpZW50IHNpZGUgY29kZSBmb3INCi1lY2hvU3RyaW5nQXJyYXkgb3BlcmF0aW9uIGFuZCBlY2hvU3RydWN0IG9wZXJhdGlvbiByZXNwZWN0aXZlbHkuPC9wPg0KLQ0KLTxoMz5DbGllbnQgZm9yIGVjaG9TdHJpbmdBcnJheSBPcGVyYXRpb248L2gzPg0KLTxzb3VyY2U+PHByZT4gICAgICB0cnkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgLy9DcmVhdGUgdGhlIHN0dWIgYnkgcGFzc2luZyB0aGUgQVhJU19IT01FIGFuZCB0YXJnZXQgRVBSLg0KLSAgICAgICAgICAgICAgICAgICAgICAgLy9XZSBwYXNzIG51bGwgdG8gdGhlIEFYSVNfSE9NRSBhbmQgaGVuY2UgdGhlIHN0dWIgd2lsbCB1c2UgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGFzIHRoZSBBWElTX0hPTUUNCi0gICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIudXNlcmd1aWRlLkF4aXMyU2FtcGxlRG9jTGl0U2VydmljZVN0dWIgc3R1YiA9IA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLmF4aXMyLnVzZXJndWlkZS5BeGlzMlNhbXBsZURvY0xpdFNlcnZpY2VTdHViKG51bGwsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9heGlzMi9zZXJ2aWNlcy9BeGlzMlNhbXBsZURvY0xpdFNlcnZpY2UiKTsNCi0gICAgICAgICAgICAgICAgICAgICAgIC8vQ3JlYXRlIHRoZSByZXF1ZXN0IGRvY3VtZW50IHRvIGJlIHNlbnQuDQotICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLnVzZXJndWlkZS54c2QuRWNob1N0cmluZ0FycmF5UGFyYW1Eb2N1bWVudCByZXFEb2MgPSANCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIudXNlcmd1aWRlLnhzZC5FY2hvU3RyaW5nQXJyYXlQYXJhbURvY3VtZW50LkZhY3RvcnkubmV3SW5zdGFuY2UoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi51c2VyZ3VpZGUueHNkLkFycmF5T2ZzdHJpbmdMaXRlcmFsIHBhcmFtQXJyYXkgPSANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLnVzZXJndWlkZS54c2QuQXJyYXlPZnN0cmluZ0xpdGVyYWwuRmFjdG9yeS5uZXdJbnN0YW5jZSgpOw0KLSAgICAgICAgICAgICAgICAgICAgICBwYXJhbUFycmF5LmFkZFN0cmluZygiQXhpczIiKTsNCi0gICAgICAgICAgICAgICAgICAgICAgcGFyYW1BcnJheS5hZGRTdHJpbmcoIkVjaG8iKTsNCi0gICAgICAgICAgICAgICAgICAgICAgcmVxRG9jLnNldEVjaG9TdHJpbmdBcnJheVBhcmFtKHBhcmFtQXJyYXkpOw0KLSAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLnVzZXJndWlkZS54c2QuRWNob1N0cmluZ0FycmF5UmV0dXJuRG9jdW1lbnQgcmVzRG9jID0gDQotICAgICAgICAgICAgICAgICAgICAgIHN0dWIuZWNob1N0cmluZ0FycmF5KHJlcURvYyk7IA0KLSAgICAgICAgICAgICAgICAgICAgICAvL0dldCB0aGUgcmVzcG9uc2UgcGFyYW1zDQotICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIHJlc1BhcmFtcyA9IHJlc0RvYy5nZXRFY2hvU3RyaW5nQXJyYXlSZXR1cm4oKS5nZXRTdHJpbmdBcnJheSgpOw0KLSAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSAmbHQ7IHJlc1BhcmFtcy5sZW5ndGg7IGkrKykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHJlc1BhcmFtc1tpXSk7DQotICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOyANCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICA8L3ByZT4NCi0gICAgPC9zb3VyY2U+DQotDQotPGgzPkNsaWVudCBmb3IgZWNob1N0cnVjdCBPcGVyYXRpb248L2gzPg0KLTxzb3VyY2U+PHByZT50cnkgew0KLSAgICAgICAgICAgICAgICAvL0NyZWF0ZSB0aGUgc3R1YiBieSBwYXNzaW5nIHRoZSBBWElTX0hPTUUgYW5kIHRhcmdldCBFUFIuDQotICAgICAgICAgICAgICAgIC8vV2UgcGFzcyBudWxsIHRvIHRoZSBBWElTX0hPTUUgYW5kIGhlbmNlIHRoZSBzdHViIHdpbGwgdXNlIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBhcyB0aGUgQVhJU19IT01FDQotICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIudXNlcmd1aWRlLkF4aXMyU2FtcGxlRG9jTGl0U2VydmljZVN0dWIgc3R1YiA9DQotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUuYXhpczIudXNlcmd1aWRlLkF4aXMyU2FtcGxlRG9jTGl0U2VydmljZVN0dWIobnVsbCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2F4aXMyL3NlcnZpY2VzL0F4aXMyU2FtcGxlRG9jTGl0U2VydmljZSIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgLy9DcmVhdGUgdGhlIHJlcXVlc3QgRG9jdW1lbnQNCi0gICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLnVzZXJndWlkZS54c2QuRWNob1N0cnVjdFBhcmFtRG9jdW1lbnQgcmVxRG9jID0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIudXNlcmd1aWRlLnhzZC5FY2hvU3RydWN0UGFyYW1Eb2N1bWVudC5GYWN0b3J5Lm5ld0luc3RhbmNlKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgIC8vQ3JlYXRlIHRoZSBjb21wbGV4IHR5cGUNCi0gICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLnVzZXJndWlkZS54c2QuU09BUFN0cnVjdCByZXFTdHJ1Y3QgPQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIudXNlcmd1aWRlLnhzZC5TT0FQU3RydWN0LkZhY3RvcnkubmV3SW5zdGFuY2UoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXFTdHJ1Y3Quc2V0VmFyRmxvYXQoMTAwLjUwRik7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmVxU3RydWN0LnNldFZhckludCgxMCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmVxU3RydWN0LnNldFZhclN0cmluZygiSGlnaCIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJlcURvYy5zZXRFY2hvU3RydWN0UGFyYW0ocmVxU3RydWN0KTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAvL1NlcnZpY2UgaW52b2NhdGlvbg0KLSAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIudXNlcmd1aWRlLnhzZC5FY2hvU3RydWN0UmV0dXJuRG9jdW1lbnQgcmVzRG9jID0gDQotICAgICAgICAgICAgICAgICAgICAgICAgIHN0dWIuZWNob1N0cnVjdChyZXFEb2MpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi51c2VyZ3VpZGUueHNkLlNPQVBTdHJ1Y3QgcmVzU3RydWN0ID0gDQotICAgICAgICAgICAgICAgICAgICAgICAgICByZXNEb2MuZ2V0RWNob1N0cnVjdFJldHVybigpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJmbG9vdCBWYWx1ZSA6IiArIHJlc1N0cnVjdC5nZXRWYXJGbG9hdCgpKTsNCi0gICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiaW50IFZhbHVlIDoiICsgcmVzU3RydWN0LmdldFZhckludCgpKTsNCi0gICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU3RyaW5nIFZhbHVlIDoiICsgcmVzU3RydWN0LmdldFZhclN0cmluZygpKTsNCi0gICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAgICAgICAgICAgICB9DQotPC9wcmU+PC9zb3VyY2U+DQotDQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvdGNwLXRyYW5zcG9ydC54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvdGNwLXRyYW5zcG9ydC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0NzNlMGUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL3RjcC10cmFuc3BvcnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSIiLz4KLSAgPHRpdGxlPlRDUCB0cmFuc3BvcnQ8L3RpdGxlPgotICA8bGluayBocmVmPSIuLi9jc3MvYXhpcy1kb2NzLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIKLSAgbWVkaWE9ImFsbCIvPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJlbiI+Ci08aDE+VENQIFRyYW5zcG9ydDwvaDE+Ci1UaGlzIGRvY3VtZW50IGV4cGxhaW5zIGhvdyB0byBzZW5kIGFuZCByZWNlaXZlIFNPQVAgbWVzc2FnZXMgdmlhIFRDUCBpbiBBeGlzMi4KLQotPHA+PGk+U2VuZCB5b3VyIGZlZWRiYWNrIG9yIHF1ZXN0aW9ucyB0bzogPGEKLWhyZWY9Im1haWx0bzpheGlzLWRldkB3cy5hcGFjaGUub3JnP3N1YmplY3Q9W0F4aXMyXSI+YXhpcy1kZXZAd3MuYXBhY2hlLm9yZzwvYT48L2k+LgotUHJlZml4IHN1YmplY3Qgd2l0aCBbQXhpczJdLiBTdWJzY3JpcHRpb24gZGV0YWlscyBhcmUgYXZhaWxhYmxlIG9uIHRoZSA8YQotaHJlZj0iaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvbWFpbC1saXN0cy5odG1sIj5BeGlzMiBzaXRlPC9hPi4KLTwvcD4KLQotPGgyPkNvbnRlbnQ8L2gyPgotPHVsPgotICA8bGk+PGEgaHJlZj0iI2ludHJvIj5JbnRyb2R1Y3Rpb248L2E+PC9saT4KLSAgPGxpPjxhIGhyZWY9IiNzdGFydCI+SG93IHRvIFN0YXJ0IHRoZSBUQ1BTZXJ2ZXI8L2E+PC9saT4KLSAgPGxpPjxhIGhyZWY9IiNzZW5kIj5Ib3cgdG8gU2VuZCBTT0FQIE1lc3NhZ2VzIFVzaW5nIFRDUCBUcmFuc3BvcnQ8L2E+PC9saT4KLSAgPGxpPjxhIGhyZWY9IiNzYW1wbGVzIj5TYW1wbGVzPC9hPjwvbGk+Ci0gIDxsaT48YSBocmVmPSIjY29tcG9uZW50cyI+VHJhbnNwb3J0IENvbXBvbmVudHM8L2E+PC9saT4KLTwvdWw+Ci08YSBuYW1lPSJpbnRybyI+PC9hPgotCi08aDI+SW50cm9kdWN0aW9uPC9oMj4KLQotPHA+QXhpczIgc3VwcG9ydHMgVENQIGFzIGEgdHJhbnNwb3J0LiBJdCBzdXBwb3J0cyBib3RoIHNlbmRpbmcgYW5kIHJlY2VpdmluZyBTT0FQCi1tZXNzYWdlcyB2aWEgVENQLiBBIFRDUCB0cmFuc3BvcnQgZG9lcyBub3QgaGF2ZSBhbnkgYXBwbGljYXRpb24gbGV2ZWwgaGVhZGVycwotYW5kIHRoZSBTT0FQIG1lc3NhZ2UgdGhhdCBpcyBzZW50IHNob3VsZCBiZSBzZWxmLWNvbnRhaW5lZC4gVGhpcyBtYWtlcyB0aGUKLWludGVyYWN0aW9uIGZhc3QgYW5kIHNpbXBsZS4gSG93ZXZlciwgc2luY2UgdGhlcmUgYXJlIG5vIGFwcGxpY2F0aW9uIGhlYWRlcnMsCi1pdCBkb2VzIG5vdCBoYXZlIHRoZSBwcml2aWxlZ2Ugb2YgaGF2aW5nIGEgcmVxdWVzdCBVUkksIGFuZCBTZXJ2aWNlCi1kaXNwYXRjaGluZyBzaG91bGQgYmUgZG9uZSBieSBhbiBhbHRlcm5hdGl2ZSBtZXRob2QuIFRodXMsCi1SZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIGNhbm5vdCBiZSB1c2VkLiBUaGUgZm9sbG93aW5nIGFyZSB0aGUgdHdvIG1haW4KLWFsdGVybmF0aXZlcyBhdmFpbGFibGUgZm9yIGRpc3BhdGNoaW5nIGluIHRoZSBBeGlzMiBlbnZpcm9ubWVudDo8L3A+Ci08b2w+Ci0gIDxsaT5Vc2UgdGhlIG5hbWUgc3BhY2UgVVJJIG9mIHRoZSBmaXJzdCBjaGlsZCBlbGVtZW50IG9mIFNPQVBCb2R5LgotICAgIChTT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIpLjwvbGk+Ci0gIDxsaT5FbmFibGUgV1MtQWRkcmVzc2luZy4gSW4gdGhlIGNhc2Ugb2YgdmVyc2lvbiAxLjEgYW5kIDEuMS4xIHJlbGVhc2VzCi0gICAgQWRkcmVzc2luZyBpcyBkZWZhdWx0IChTT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyKS48L2xpPgotPC9vbD4KLQotPHA+V2hlbiB0aGUgVENQIHJlcXVlc3QgaXMgc2VudCwgaXQgaXMgdGhlIHVzZXIncyByZXNwb25zaWJpbGl0eSB0byB1c2UKLWVpdGhlciBBZGRyZXNzaW5nIG9yIHRoZSBTT0FQIGJvZHkgYmFzZSBtZWNoYW5pc20uPC9wPgotPGEgbmFtZT0ic3RhcnQiPjwvYT4KLQotPGgyPkhvdyB0byBTdGFydCB0aGUgVENQU2VydmVyPC9oMj4KLQotPHA+VGhlIFRDUCBzZXJ2ZXIgY2FuIGJlIHN0YXJ0ZWQgYnkgcnVubmluZyB0aGUgY2xhc3MKLW9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0LnRjcC5UQ1BTZXJ2ZXIgd2l0aCB0d28gcGFyYW1ldGVycyAtIDxhCi1ocmVmPSIuLi9mYXEuaHRtbCNjNSI+cmVwb3NpdG9yeTwvYT4gYW5kIHBvcnQgbnVtYmVyLCBhcyBhcmd1bWVudHMuIFRoaXMKLWNsYXNzIG5lZWRzIGFsbCB0aGUgQXhpcyBkZXBlbmRlbmN5IEpBUnMgaW4gdGhlIGNsYXNzcGF0aC4gTmV3IHNlcnZpY2VzIGNhbgotYmUgYWRkZWQgaW4gdGhlIHVzdWFsIHdheSBieSBkcm9wcGluZyB0aGUgYXJjaGl2ZXMgdG8gdGhlIHJlcG9zaXRvcnkgKFNlZSA8YQotaHJlZj0iYWR2LXVzZXJndWlkZS5odG1sIj5BZHZhbmNlZCBVc2VyJ3MgR3VpZGU8L2E+IGZvciBtb3JlIGluZm9ybWF0aW9uKTwvcD4KLTwhLS08cD5BbHRlcm5hdGl2ZWx5IHRoZSBUQ1AgU2VydmVyIGNhbiBydW4gd2l0aCB0Y3Atc2VydmVyLmJhdC8gdGNwLXNlcnZlci5zaAotZmlsZSBpbiB0aGUgYmluIGRpcmVjdG9yeSBvZiB0aGUgQmluYXJ5IGRpc3RyaWJ1dGlvbiBvZiBUQ1AgU2VydmVyLjwvcD4tLT4KLTxhIG5hbWU9InNlbmQiPjwvYT4KLQotPGgyPkhvdyB0byBTZW5kIFNPQVAgTWVzc2FnZXMgVXNpbmcgVENQIFRyYW5zcG9ydDwvaDI+Ci0KLTxwPlRDUCB0cmFuc3BvcnQgY2FuIGJlIGVuYWJsZWQgZWFzaWx5IGZyb20gdGhlIGNhbGwgQVBJLiBUaGUgZm9sbG93aW5nIGNvZGUKLXNlZ21lbnQgZGVtb25zdHJhdGVzIGhvdyB0aGlzIGNhbiBiZSBkb25lLjwvcD4KLTxzb3VyY2U+PHByZT5PTUVsZW1lbnQgcGF5bG9hZCA9IC4uLgotU2VydmljZUNsaWVudCBzZXJ2aWNlQ2xpZW50ID0gbmV3IFNlcnZpY2VDbGllbnQoKTsKLU9wdGlvbnMgb3B0aW9ucyA9IG5ldyBPcHRpb25zKCk7Ci1vcHRpb25zLnNldFRvKHRhcmdldEVQUik7Ci08IS0tb3B0aW9ucy51c2VTZXBlcmF0ZUxpc3RlbmVyKGZhbHNlKTstLT4KLQotPCEtLWNvbW1lbnRlZCBvZmYgYXMgdGhlcmUgaXMgYW4gZXJyb3I6ICJUaGUgbWV0aG9kIHVzZVNlcGVyYXRlTGlzdGVuZXIoYm9vbGVhbilpcyB1bmRlZmluZWQgZm9yIHRoZSB0eXBlIE9wdGlvbnMiLS0+Ci0KLXNlcnZpY2VDbGllbnQuc2V0T3B0aW9ucyhvcHRpb25zKTsKLQotT01FbGVtZW50IHJlc3BvbnNlID0gc2VydmljZUNsaWVudC5zZW5kUmVjZWl2ZShwYXlsb2FkKTs8L3ByZT4KLTwvc291cmNlPgotPHA+VGhlIHRyYW5zcG9ydCB0aGF0IHNob3VsZCBiZSBpbnZva2VkIGlzIGluZmVycmVkIGZyb20gdGhlIHRhcmdldEVQUgotKHRjcDovLy4uLikuIEluIHRoaXMgY2FzZSBpdCBpcyBUQ1AgYW5kIHRoZSBsaXN0ZW5lciBpcyBhbHNvIFRDUC4gVGhlIFNPQVAKLW1lc3NhZ2UgaGFzIHRvIGJlIHNlbGYgY29udGFpbmVkIGluIG9yZGVyIHRvIHVzZSBBZGRyZXNzaW5nLiBUaGUgb3RoZXIgb3B0aW9uCi1pcyB0byB1c2UgdGhlIFVSSSBvZiB0aGUgZmlyc3QgY2hpbGQgb2YgdGhlIFNPQVAgQm9keSB0byBkaXNwYXRjaCB0aGUKLXNlcnZpY2UuIFRoZSBwYXJhbWV0ZXIgaXMgb2YgdGhlIHR5cGUgPGEgaHJlZj0iLi4vZmFxLmh0bWwjYTIiPk9NRWxlbWVudDwvYT4sCi10aGUgWE1MIHJlcHJlc2VudGF0aW9uIG9mIEF4aXMyLjwvcD4KLTxhIG5hbWU9InNhbXBsZXMiPjwvYT4KLQotPGgyPlNhbXBsZXM8L2gyPgotCi08cD5BIHNhbXBsZSBmb3IgYSBUQ1AgQ2xpZW50IGNhbiBiZSBmb3VuZCBmcm9tIHRoZQotc2FtcGxlcy91c2VyZ3VpZGUvc3JjL3VzZXJndWlkZS9jbGllbnRzL1RDUENsaWVudC5qYXZhIGluIHRoZSBiaW5hcnkKLWRpc3RyaWJ1dGlvbi4gVGhpcyBhY2Nlc3NlcyB0aGUgc2FtZSBXZWIgc2VydmljZSBleHBsYWluZWQgaW4gdGhlIDxhCi1ocmVmPSJhZHYtdXNlcmd1aWRlLmh0bWwiPkF4aXMyIEFkdmFuY2VkIFVzZXIncyBHdWlkZTwvYT4uIFRoZSBjbGllbnQgZmlyc3QKLXN0YXJ0cyB0aGUgVENQU2VydmVyIHdpdGggdGhlIHNhbWUgcmVwb3NpdG9yeSB1c2VkIGZvciB0aGUgPGEKLWhyZWY9ImFkdi11c2VyZ3VpZGUuaHRtbCI+QXhpczIgQWR2YW5jZWQgVXNlcidzIEd1aWRlPC9hPiBzYW1wbGVzLiBTaW5jZSB0aGUKLXNhbXBsZSBpcyBhbHJlYWR5IGRlcGxveWVkIGluIHRoZSByZXBvc2l0b3J5LCBhcyBwZXIgdGhlIHVzZXJndWlkZSwgaXQgd2lsbAotYmUgYXV0b21hdGljYWxseSBhdmFpbGFibGUuPC9wPgotCi08cD5JbiBvcmRlciB0byBydW4gdGhlIFRDUENsaWVudC5qYXZhLCBhZGRyZXNzaW5nIHNob3VsZCBiZSBlbmdhZ2VkIGJvdGggaW4KLXRoZSBjbGllbnQgYW5kIHNlcnZlciBzaWRlcy4gT24gdGhlIGNsaWVudCBzaWRlLCB5b3UgY2FuIGVuZ2FnZSBhZGRyZXNzaW5nIGJ5Ci1jb3B5aW5nIHRoZSBhZGRyZXNzaW5nLUBheGlzMl92ZXJzaW9uQC5tYXIgKEFYSVMyX0hPTUUvcmVwb3NpdG9yeS9tb2R1bGUpIHRvCi1BWElTMl9IT01FL2xpYiBkaXJlY3RvcnkuPC9wPgotPGEgbmFtZT0iY29tcG9uZW50cyI+PC9hPgotCi08aDI+VHJhbnNwb3J0IENvbXBvbmVudHM8L2gyPgotCi08cD5UaGUgQXhpczIgVENQIHRyYW5zcG9ydCBoYXMgdHdvIGNvbXBvbmVudHMsIGEgdHJhbnNwb3J0IExpc3RlbmVyIGZvcgotcmVjZWl2aW5nIHRoZSBtZXNzYWdlcyBhbmQgYSB0cmFuc3BvcnQgU2VuZGVyIHRvIHNlbmQgdGhlIFNPQVAgTWVzc2FnZXMuIFRoZQotQXhpczIgaW5zdGFsbGF0aW9uIGhhcyBib3RoIHRoZSBjb21wb25lbnRzIGJ1aWx0IGludG8gaXRzZWxmIGJ5IGRlZmF1bHQuIEluCi10aGUgYXhpczIueG1sIGNvbmZpZ3VyYXRpb24gZmlsZSwgdGhlIHR3byBUQ1AgdHJhbnNwb3J0IGNvbXBvbmVudHMgY2FuIGJlIAotY29uZmlndXJlZCBhcyBzaG93biBiZWxvdy48L3A+Ci0KLTxwPlRoZSBmb2xsb3dpbmcgWE1MIGxpbmVzIGluaXRpYWxpemUgdGhlIFRDUFRyYW5zcG9ydCBSZWNlaXZlcjo8L3A+Ci08c291cmNlPjxwcmU+Jmx0O3RyYW5zcG9ydFJlY2VpdmVyIG5hbWU9InRjcCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0LnRjcC5UQ1BTZXJ2ZXIiJmd0OwotICAgICZsdDtwYXJhbWV0ZXIgbmFtZT0icG9ydCImZ3Q7NjA2MCZsdDsvcGFyYW1ldGVyJmd0OwotJmx0Oy90cmFuc3BvcnRSZWNlaXZlciZndDs8L3ByZT4KLTwvc291cmNlPgotPHA+VGhlIGZvbGxvd2luZyBYTUwgbGluZXMgYWRkIHRoZSBUQ1BUcmFuc3BvcnQgU2VuZGVyOjwvcD4KLTxzb3VyY2U+PHByZT4mbHQ7dHJhbnNwb3J0U2VuZGVyIG5hbWU9InRjcCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0LnRjcC5UQ1BUcmFuc3BvcnRTZW5kZXIiLyZndDs8L3ByZT4KLTwvc291cmNlPgotCi08cD5Ob3RlOiBJZiB0aGUgVENQIHNlcnZlciBpcyBzdGFydGVkIG1hbnVhbGx5LCB0aGlzIGNvbmZpZ3VyYXRpb24gZG9lcyBub3QgdGFrZQotZWZmZWN0LiBJbiByZXR1cm4sIHRoaXMgYWZmZWN0cyB0aGUgdHJhbnNwb3J0IExpc3RlbmVyJ3Mgc3RhcnQgYnkgQXhpczIuCi0oZS5nLiBMaXN0ZW5lciBzdGFydGVkIGJ5IHRoZSBDb21wbGV0ZSBBc3luYyBpbnRlcmFjdGlvbik8L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC90b2MueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL3RvYy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiMjlmYTAuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL3RvYy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PQotIkhUTUwgVGlkeSBmb3IgV2luZG93cyAodmVycyAxNCBKdW5lIDIwMDcpLCBzZWUgd3d3LnczLm9yZyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0iIiAvPgotPHRpdGxlPjwvdGl0bGU+Ci08bGluayBocmVmPSIuLi9jc3MvYXhpcy1kb2NzLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIKLW1lZGlhPSJhbGwiIC8+Ci08c3R5bGUgdHlwZT0idGV4dC9jc3MiIG1lZGlhPSJzY3JlZW4iPgotLyo8IVtDREFUQVsqLwotPCEtLQotdWwgeyBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7IG1hcmdpbjogMCAwIDAgNXB4OyBwYWRkaW5nOiAwOyBib3JkZXItd2lkdGg6IDA7IGxpc3Qtc3R5bGUtcG9zaXRpb246IG91dHNpZGU7IH0KLS0tPgotCi0KLQotCi0KLQotLypdXT4qLwotPC9zdHlsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9ImVuLVVTIiBkaXI9Imx0ciIgeG1sOmxhbmc9ImVuLVVTIj4KLTxoMT5UYWJsZSBvZiBDb250ZW50czwvaDE+Ci08b2w+Ci08bGk+PGEgaHJlZj0iY29udGVudHMuaHRtbCIgdGFyZ2V0PQotIm1haW5GcmFtZSI+SW50cm9kdWN0aW9uPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iaW5zdGFsbGF0aW9uZ3VpZGUuaHRtbCIgdGFyZ2V0PQotIm1haW5GcmFtZSI+SW5zdGFsbGF0aW9uIEd1aWRlPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iLi4vbW9kdWxlcy9pbmRleC5odG1sIiB0YXJnZXQ9Im1haW5GcmFtZSI+QWRkLW9uCi1Nb2R1bGVzPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iYXBwX3NlcnZlci5odG1sIiB0YXJnZXQ9Im1haW5GcmFtZSI+QXBwbGljYXRpb24gU2VydmVyCi1TcGVjaWZpYyBDb25maWd1cmF0aW9uIEd1aWRlPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0icXVpY2tzdGFydGd1aWRlLmh0bWwiIHRhcmdldD0ibWFpbkZyYW1lIj5RdWljayBTdGFydAotR3VpZGU8L2E+PC9saT4KLTxsaT48YSBocmVmPSJ1c2VyZ3VpZGUuaHRtbCIgdGFyZ2V0PSJtYWluRnJhbWUiPlVzZXIncwotR3VpZGU8L2E+PC9saT4KLTxsaT48YSBocmVmPSJhZHYtdXNlcmd1aWRlLmh0bWwiIHRhcmdldD0ibWFpbkZyYW1lIj5BZHZhbmNlZCBVc2VyJ3MKLUd1aWRlPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iYXhpczJjb25maWcuaHRtbCIgdGFyZ2V0PSJtYWluRnJhbWUiPkNvbmZpZ3VyYXRpb24KLUd1aWRlPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0id2ViYWRtaW5ndWlkZS5odG1sIiB0YXJnZXQ9Im1haW5GcmFtZSI+V2ViCi1BZG1pbmlzdHJhdG9yJ3MgR3VpZGU8L2E+PC9saT4KLTxsaT48YSBocmVmPSJBeGlzMkFyY2hpdGVjdHVyZUd1aWRlLmh0bWwiIHRhcmdldD0KLSJtYWluRnJhbWUiPkFyY2hpdGVjdHVyZSBHdWlkZTwvYT48L2xpPgotPGxpPjxhIGhyZWY9ImpheHdzLWd1aWRlLmh0bWwiIHRhcmdldD0ibWFpbkZyYW1lIj5KQVhXUyBHdWlkZTwvYT48L2xpPgotPGxpPjxhIGhyZWY9InBvam9ndWlkZS5odG1sIiB0YXJnZXQ9Im1haW5GcmFtZSI+UE9KTyBHdWlkZTwvYT48L2xpPgotPGxpPjxhIGhyZWY9InNwcmluZy5odG1sIiB0YXJnZXQ9Im1haW5GcmFtZSI+U3ByaW5nIEd1aWRlPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0ibW9kdWxlcy5odG1sIiB0YXJnZXQ9Im1haW5GcmFtZSI+TW9kdWxlc0d1aWRlPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iY2x1c3RlcmluZy1ndWlkZS5odG1sIiB0YXJnZXQ9Im1haW5GcmFtZSI+Q2x1c3RlcmluZyBHdWlkZTwvYT48L2xpPgotPGxpPkFEQiBEYXRhIEJpbmRpbmcKLTx1bD4KLTxsaT4xNC4xIDxhIGhyZWY9ImFkYi9hZGItaG93dG8uaHRtbCIgdGFyZ2V0PQotIm1haW5GcmFtZSI+QXJjaGl0ZWN0dXJlPC9hPjwvbGk+Ci08bGk+MTQuMiA8YSBocmVmPSJhZGIvYWRiLWFkdmFuY2VkLmh0bWwiIHRhcmdldD0KLSJtYWluRnJhbWUiPkFkdmFuY2VkIEZlYXR1cmVzPC9hPjwvbGk+Ci08bGk+MTQuMyA8YSBocmVmPSJhZGIvYWRiLWNvZGVnZW4taW50ZWdyYXRpb24uaHRtbCIgdGFyZ2V0PQotIm1haW5GcmFtZSI+Q29kZSBHZW5lcmF0aW9uIEludGVncmF0aW9uPC9hPjwvbGk+Ci08bGk+MTQuNCA8YSBocmVmPSJhZGIvYWRiLXR3ZWFraW5nLmh0bWwiIHRhcmdldD0KLSJtYWluRnJhbWUiPlR3ZWFraW5nPC9hPjwvbGk+Ci08L3VsPgotPC9saT4KLTxsaT5KaUJYIERhdGEgQmluZGluZwotPHVsPgotPGxpPjE1LjEgPGEgaHJlZj0iamlieC9qaWJ4LWNvZGVnZW4taW50ZWdyYXRpb24uaHRtbCIgdGFyZ2V0PQotIm1haW5GcmFtZSI+Q29kZSBHZW5lcmF0aW9uIEludGVncmF0aW9uPC9hPjwvbGk+Ci08bGk+MTUuMiA8YSBocmVmPSJqaWJ4L2ppYngtZG9jbGl0LWV4YW1wbGUuaHRtbCIgdGFyZ2V0PQotIm1haW5GcmFtZSI+ZG9jL2xpdCBFeGFtcGxlPC9hPjwvbGk+Ci08bGk+MTUuMyA8YSBocmVmPSJqaWJ4L2ppYngtdW53cmFwcGVkLWV4YW1wbGUuaHRtbCIgdGFyZ2V0PQotIm1haW5GcmFtZSI+dW53cmFwcGVkIEV4YW1wbGU8L2E+PC9saT4KLTwvdWw+Ci08L2xpPgotPGxpPkFkdmFuY2VkCi08dWw+Ci08bGk+MTYuMSA8YSBocmVmPSJ4bWxiYXNlZC1zZXJ2ZXIuaHRtbCIgdGFyZ2V0PSJtYWluRnJhbWUiPkFYSU9NCi1CYXNlZCBTZXJ2aWNlPC9hPjwvbGk+Ci08bGk+MTYuMiA8YSBocmVmPSJkaWkuaHRtbCIgdGFyZ2V0PSJtYWluRnJhbWUiPkFYSU9NIEJhc2VkCi1DbGllbnQ8L2E+PC9saT4KLTwvdWw+Ci08L2xpPgotPGxpPjxhIGhyZWY9Im10b20tZ3VpZGUuaHRtbCIgdGFyZ2V0PSJtYWluRnJhbWUiPkF0dGFjaG1lbnRzL01UT00KLUd1aWRlPC9hPjwvbGk+Ci08bGk+VHJhbnNwb3J0cwotPHVsPgotPGxpPjE4LjEgPGEgaHJlZj0iaHR0cC10cmFuc3BvcnQuaHRtbCIgdGFyZ2V0PSJtYWluRnJhbWUiPkhUVFAKLVRyYW5zcG9ydDwvYT48L2xpPgotPGxpPjE4LjMgPGEgaHJlZj0idGNwLXRyYW5zcG9ydC5odG1sIiB0YXJnZXQ9Im1haW5GcmFtZSI+VENQCi1UcmFuc3BvcnQ8L2E+PC9saT4KLTxsaT4xOC41IDxhIGhyZWY9InRyYW5zcG9ydF9ob3d0by5odG1sIiB0YXJnZXQ9Im1haW5GcmFtZSI+Q3VzdG9tCi1UcmFuc3BvcnQ8L2E+PC9saT4KLTwvdWw+Ci08L2xpPgotPGxpPjxhIGhyZWY9IldTX3BvbGljeS5odG1sIiB0YXJnZXQ9Im1haW5GcmFtZSI+V1MtUG9saWN5Ci1TdXBwb3J0PC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0icmVzdC13cy5odG1sIiB0YXJnZXQ9Im1haW5GcmFtZSI+UkVTVCBTdXBwb3J0PC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0ianNvbl9zdXBwb3J0Lmh0bWwiIHRhcmdldD0ibWFpbkZyYW1lIj5KU09OCi1TdXBwb3J0PC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iY29yYmEtZGVwbG95ZXIuaHRtbCIgdGFyZ2V0PSJtYWluRnJhbWUiPkV4cG9zaW5nIENPUkJBIFNlcnZpY2VzIGFzIFdlYiBTZXJ2aWNlczwvYT48L2xpPgotPGxpPjxhIGhyZWY9ImVqYi1wcm92aWRlci5odG1sIiB0YXJnZXQ9Im1haW5GcmFtZSI+R3VpZGUgdG8gdXNpbmcKLUVKQiBQcm92aWRlciBpbiBBeGlzMjwvYT48L2xpPgotPGxpPjxhIGhyZWY9InNvYXBtb25pdG9yLW1vZHVsZS5odG1sIiB0YXJnZXQ9Im1haW5GcmFtZSI+U09BUAotTW9uaXRvcjwvYT48L2xpPgotPGxpPjxhIGhyZWY9InJlZmVyZW5jZS5odG1sIiB0YXJnZXQ9Im1haW5GcmFtZSI+Q29tbWFuZCBMaW5lCi1Ub29sczwvYT48L2xpPgotPGxpPjxhIGhyZWY9Ii4uL3Rvb2xzL2luZGV4Lmh0bWwiIHRhcmdldD0KLSJtYWluRnJhbWUiPlRvb2xzL1BsdWctaW5zPC9hPgotPHVsPgotPGxpPjI1LjEgPGEgaHJlZj0KLSIuLi90b29scy9AYXhpczJfdmVyc2lvbl9kaXJAL0NvZGVnZW5Ub29sUmVmZXJlbmNlLmh0bWwiIHRhcmdldD0KLSJtYWluRnJhbWUiPkNvZGUgR2VuZXJhdG9yIFRvb2wgLSBDb21tYW5kIExpbmUgYW5kIEFudAotVGFzazwvYT48L2xpPgotPGxpPjI1LjIgPGEgaHJlZj0KLSIuLi90b29scy9AYXhpczJfdmVyc2lvbl9kaXJAL2lkZWEvSWRlYV9wbHVnLWluX3VzZXJndWlkZS5odG1sIgotdGFyZ2V0PSJtYWluRnJhbWUiPkF4aXMyIFBsdWctaW4gZm9yIEludGVsbGlKIElERUE8L2E+PC9saT4KLTxsaT4yNS4zIDxhIGhyZWY9Ci0iLi4vdG9vbHMvQGF4aXMyX3ZlcnNpb25fZGlyQC9lY2xpcHNlL3NlcnZpY2VhcmNoaXZlci1wbHVnaW4uaHRtbCIKLXRhcmdldD0ibWFpbkZyYW1lIj5TZXJ2aWNlIEFyY2hpdmUgR2VuZXJhdG9yIFdpemFyZCAtIEVjbGlwc2UKLVBsdWctaW48L2E+PC9saT4KLTxsaT4yNS40IDxhIGhyZWY9Ci0iLi4vdG9vbHMvQGF4aXMyX3ZlcnNpb25fZGlyQC9lY2xpcHNlL3dzZGwyamF2YS1wbHVnaW4uaHRtbCIKLXRhcmdldD0ibWFpbkZyYW1lIj5Db2RlIEdlbmVyYXRvciBXaXphcmQgLSBFY2xpcHNlIFBsdWctaW48L2E+PC9saT4KLTxsaT4yNS41IDxhIGhyZWY9Ci0iLi4vdG9vbHMvQGF4aXMyX3ZlcnNpb25fZGlyQC9tYXZlbi1wbHVnaW5zL21hdmVuLWFhci1wbHVnaW4uaHRtbCIKLXRhcmdldD0ibWFpbkZyYW1lIj5BQVIgTWF2ZW4yIFBsdWctaW48L2E+PC9saT4KLTxsaT4yNS42IDxhIGhyZWY9Ci0iLi4vdG9vbHMvQGF4aXMyX3ZlcnNpb25fZGlyQC9tYXZlbi1wbHVnaW5zL21hdmVuLWphdmEyd3NkbC1wbHVnaW4uaHRtbCIKLXRhcmdldD0ibWFpbkZyYW1lIj5KYXZhMldTREwgTWF2ZW4yIFBsdWctaW48L2E+PC9saT4KLTxsaT4yNS43IDxhIGhyZWY9Ci0iLi4vdG9vbHMvQGF4aXMyX3ZlcnNpb25fZGlyQC9tYXZlbi1wbHVnaW5zL21hdmVuLXdzZGwyY29kZS1wbHVnaW4uaHRtbCIKLXRhcmdldD0ibWFpbkZyYW1lIj5XU0RMMkNvZGUgTWF2ZW4yIFBsdWctaW48L2E+PC9saT4KLTwvdWw+Ci08L2xpPgotPGxpPjxhIGhyZWY9Im1pZ3JhdGlvbi5odG1sIiB0YXJnZXQ9Im1haW5GcmFtZSI+TWlncmF0aW9uIEd1aWRlCi0oZnJvbSBBeGlzMSk8L2E+PC9saT4KLTxsaT5EZXNpZ24gTm90ZXMKLTx1bD4KLTxsaT4yNy4xIDxhIGhyZWY9IkF4aXMyLXJwYy1zdXBwb3J0Lmh0bWwiIHRhcmdldD0ibWFpbkZyYW1lIj5SUEMKLVN1cHBvcnQ8L2E+PC9saT4KLTwvdWw+Ci08L2xpPgotPC9vbD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC90cmFuc3BvcnRfaG93dG8ueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL3RyYW5zcG9ydF9ob3d0by54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiZTdjMzUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL3RyYW5zcG9ydF9ob3d0by54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMzIgKzAsMCBAQAotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPGh0bWw+DQotPGhlYWQ+DQotICA8bWV0YSBodHRwLWVxdWl2PSJjb250ZW50LXR5cGUiIGNvbnRlbnQ9IiIvPg0KLSAgPHRpdGxlPjwvdGl0bGU+DQotICA8bGluayBocmVmPSIuLi9jc3MvYXhpcy1kb2NzLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyINCi0gIG1lZGlhPSJhbGwiLz4NCi08L2hlYWQ+DQotDQotPGJvZHk+DQotPGgxPkhvdyB0byBXcml0ZSBZb3VyIE93biBBeGlzMiBUcmFuc3BvcnQ8L2gxPg0KLQ0KLTxoMj5Qcm9sb2d1ZTwvaDI+DQotDQotPHA+VG8gc3RvcCB5b3UgZnJvbSByZS1pbnZlbnRpbmcgdGhlIHdoZWVsLCBiZWZvcmUgd2UgZ2V0IHN0YXJ0ZWQsIEkgd2lsbA0KLXF1aWNrbHkgbGlzdCB0aGUgdHJhbnNwb3J0cyB0aGF0IGFyZSBhbHJlYWR5IHN1cHBvcnRlZCBpbiBBeGlzMiB3aXRoIGEgc21hbGwNCi1kZXNjcmlwdGlvbi48L3A+DQotDQotPHA+PC9wPg0KLTx1bD4NCi0gIDxsaT48Yj5IVFRQPC9iPiAtIEluIHRoZSBIVFRQIHRyYW5zcG9ydCwgdGhlIHRyYW5zcG9ydCBMaXN0ZW5lciBpcyBlaXRoZXIgYQ0KLSAgICBTZXJ2bGV0IG9yIGEgU2ltcGxlIEhUVFAgc2VydmVyIHByb3ZpZGVkIGJ5IEF4aXMyLiBUaGUgdHJhbnNwb3J0IFNlbmRlcg0KLSAgICB1c2VzIHNvY2tldHMgdG8gY29ubmVjdCBhbmQgc2VuZCB0aGUgU09BUCBtZXNzYWdlLiBDdXJyZW50bHkgd2UgaGF2ZSB0aGUNCi0gICAgY29tbW9ucy1odHRwY2xpZW50IGJhc2VkIEhUVFAgVHJhbnNwb3J0IHNlbmRlciBhcyB0aGUgZGVmYXVsdA0KLSAgdHJhbnNwb3J0LjwvbGk+DQotICA8bGk+PGI+VENQPC9iPiAtIFRoaXMgaXMgdGhlIG1vc3Qgc2ltcGxlIHRyYW5zcG9ydCwgYnV0IG5lZWRzIEFkZHJlc3NpbmcNCi0gICAgc3VwcG9ydCB0byBiZSBmdW5jdGlvbmFsLjwvbGk+DQotPC91bD4NCi0NCi08cD5UbyB1bmRlcnN0YW5kIHRoZSByZXN0IG9mIHRoaXMgZG9jdW1lbnQgeW91IHdpbGwgbmVlZCBzb21lIHVuZGVyc3RhbmRpbmcNCi1vZiB0aGUgYXJjaGl0ZWN0dXJlIG9mIEF4aXMyLiBJZiB5b3UgYXJlIG5vdCBmYW1pbGlhciB3aXRoIHRoZSBBeGlzMg0KLWFyY2hpdGVjdHVyZSwgcGxlYXNlIGdvIHRocm91Z2ggdGhlIDxhDQotaHJlZj0iQXhpczJBcmNoaXRlY3R1cmVHdWlkZS5odG1sIj5BeGlzMiBBcmNoaXRlY3R1cmUgR3VpZGU8L2E+IGJlZm9yZSB5b3UNCi1yZWFkIGFueSBmdXJ0aGVyLjwvcD4NCi0NCi08aDI+SW50cm9kdWN0aW9uPC9oMj4NCi0NCi08cD5Ccm9hZGx5IHNwZWFraW5nLCBhIHRyYW5zcG9ydCBpbnNpZGUgQXhpczIgY2FuIGJlIGNsYXNzaWZpZWQgYXMgYSB3YXkgb2YNCi1nZXR0aW5nIG1lc3NhZ2VzIHRoYXQgYXJyaXZlIHRob3VnaCBzb21lIGNoYW5uZWwgaW50byB0aGUgQXhpczIgZW5naW5lLiBUaGUNCi1jb3JlIG9mIEF4aXMyIGlzIHRyYW5zcG9ydCBpbmRlcGVuZGVudC4gQWxsIGRhdGEgdGhhdCBpcyB0cmFuc3BvcnQgc3BlY2lmaWMNCi1pcyBzdHJpcHBlZCBvdXQgb2YgdGhlIGluY29taW5nIG1lc3NhZ2UgYW5kIGluc2VydGVkIGludG8gdGhlIE1lc3NhZ2VDb250ZXh0Lg0KLUluIHRoZSBvdXRnb2luZyBtZXNzYWdlLCBhbGwgdHJhbnNwb3J0IHNwZWNpZmljIGluZm9ybWF0aW9uLCBsaWtlIGhlYWRlcnMsDQotYXJlIGFkZGVkIGFuZCBzZW50LjwvcD4NCi0NCi08cD5UbyB3cml0ZSB5b3VyIG93biB0cmFuc3BvcnQsIHlvdSB3aWxsIHByaW1hcmlseSBuZWVkIHRvIHdyaXRlIHR3byBjbGFzc2VzOg0KLW9uZSBpcyB0aGUgVHJhbnNwb3J0U2VuZGVyIGFuZCB0aGUgb3RoZXIgaXMgdGhlIFRyYW5zcG9ydFJlY2VpdmVyLiBUbw0KLXJlZ2lzdGVyIGEgdHJhbnNwb3J0IHdpdGggQXhpczIgeW91IHdpbGwgbmVlZCB0byBwdXQgZW50cmllcyBjb3JyZXNwb25kaW5nDQotdG8gdGhlc2UgdHdvIGNsYXNzZXMgaW4gdGhlIGF4aXMyLnhtbCBmaWxlLiBJIHdpbGwgdGFrZSB5b3UgdGhyb3VnaCB0aGUgDQotcHJvY2VzcyBvZiBhZGRpbmcgdGhlIGVudHJpZXMgaW4gdGhlIHJlbGV2YW50IHNlY3Rpb25zLjwvcD4NCi0NCi08aDI+VHJhbnNwb3J0IFJlY2VpdmVyPC9oMj4NCi0NCi08cD5BbnkgbWVzc2FnZSB0aGF0IGlzIGNvbWluZyBpbnRvIEF4aXMyIG5lZWRzIHRvIGdvIHRocm91Z2ggYSB0cmFuc3BvcnQNCi1yZWNlaXZlci4gQWxsIGluZm9ybWF0aW9uIGFib3V0IGhvdyB0aGUgbWVzc2FnZSBpcyByZWNlaXZlZCBhdCB0aGUgQXhpczINCi1zZXJ2ZXIgZnJvbSB0aGUgd2lyZSAob3IgdmlhIGFuIGUtbWFpbCkgaXMgaXNvbGF0ZWQgaW5zaWRlIHRoZSB0cmFuc3BvcnQNCi1yZWNlaXZlci4gSXQgZXh0cmFjdHMgdGhlIGRhdGEgdGhhdCBpcyBjb21pbmcgb24gdGhlIHdpcmUgYW5kIHRyYW5zZm9ybXMgaXQNCi1pbnRvIGEgc3RhdGUgdGhhdCB0aGUgQXhpczIgc2VydmVyIHVuZGVyc3RhbmRzLjwvcD4NCi0NCi08cD5TbyBub3cgdGhhdCB3ZSBoYXZlIHNvbWUgYmFja2dyb3VuZCBpbmZvcm1hdGlvbiBhYm91dCBob3cgdHJhbnNwb3J0cyB3b3JrDQotaW5zaWRlIEF4aXMyLCB3aXRob3V0IGZ1cnRoZXIgZGVsYXksIGxldHMgZGl2ZSBpbnRvIHNvbWUgY29kaW5nIGFuZCBzdGFydA0KLWJ1aWxkaW5nIG91ciBvd24gdHJhbnNwb3J0LjwvcD4NCi0NCi08cD48L3A+DQotDQotPHA+VG8gZ2V0IHRoaW5ncyBzdGFyZWQsIHlvdSB3aWxsIGZpcnN0IG5lZWQgdG8gZXh0ZW5kIGZyb20gdGhlDQotb3JnLmFwYWNoZS5BeGlzMi50cmFuc3BvcnQuVHJhbnNwb3J0TGlzdGVuZXIgY2xhc3MgYW5kIHdyaXRlIHlvdXIgb3duDQotdHJhbnNwb3J0IGxpc3RlbmVyLiBUbyBjcmVhdGUgYW4gZW5naW5lIHRvIHByb2Nlc3MgdGhlIE1lc3NhZ2VDb250ZXh0LCB3ZQ0KLW5lZWQgYSBjb25maWd1cmF0aW9uIGNvbnRleHQuIFRoZSBmb2xsb3dpbmcgY29kZSBmcmFnbWVudCB3aWxsIGRvIHRoaXMuIFRoaXMNCi1zaG91bGQgaWRlYWxseSBiZSBvbmx5IGRvbmUgb25jZSBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZSBUcmFuc3BvcnQNCi1yZWNlaXZlci48L3A+DQotDQotPHA+PC9wPjxzb3VyY2U+DQotPHByZT50cnkgew0KLSAgICAgICAgLy9DcmVhdGUgYSBmYWN0b3J5IA0KLSAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5IGZhY3RvcnkgPSBuZXcgQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5KCk7DQotICAgICAgICAvL1VzZSB0aGUgZmFjdG9yeSBhbmQgYW4gQXhpczIgcmVwb3NpdG9yeSB0byBjcmVhdGUgYSBuZXcgQ29uZmlndXJhdGlvbiBDb250ZXh0DQotICAgICAgICBjb25maWd1cmF0aW9uQ29udGV4dCA9IENvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeS5jcmVhdGVDb25maWd1cmF0aW9uQ29udGV4dEZyb21GaWxlU3lzdGVtKHJlcG9zaXRvcnlfZGlyZWN0b3J5LCANCi1heGlzMnhtbGxvY2F0aW9uKTsNCi19IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgbG9nLmluZm8oZS5nZXRNZXNzYWdlKCkpOw0KLX08L3ByZT4NCi08L3NvdXJjZT4NCi08cD5Ob3cgd2UgbmVlZCBzb21lIGtpbmQgb2YgYSBMaXN0ZW5lciB0byBsaXN0ZW4gdG8gdGhlIHJlcXVlc3RzIHRoYXQgY29tZQ0KLWluLiBZb3UgbmVlZCB0byBpbXBsZW1lbnQgdGhpcyBhY2NvcmRpbmcgdG8gdGhlIHRyYW5zcG9ydCB0aGF0IHlvdSBhcmUgdHJ5aW5nDQotdG8gYnVpbGQuIEFmdGVyIGEgbWVzc2FnZSBpcyByZWNlaXZlZCBhdCB0aGUgUmVjZWl2ZXIsIHlvdSBjYW4gdXNlIHRoZQ0KLWZvbGxvd2luZyBjb2RlIHRvIHByb2Nlc3MgdGhlIHJlcXVlc3QgYW5kIHRoZW4gZm9yd2FyZCB0aGUgbWVzc2FnZSBjb250ZXh0IHRvDQotdGhlIGVuZ2luZSB1c2luZyB0aGUgZW5naW5lLnJlY2VpdmUobXNnQ29udGV4dCkgbWV0aG9kLiAoVGhlIGZvbGxvd2luZyBjb2RlDQotaXMgZXh0cmFjdGVkIGZyb20gdGhlIE1haWxMaXN0ZW5lciBhcyBhbiBleGFtcGxlKTwvcD4NCi08c291cmNlPjxwcmU+QXhpc0VuZ2luZSBlbmdpbmUgPSBuZXcgQXhpc0VuZ2luZShjb25maWd1cmF0aW9uQ29udGV4dCk7DQotTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCA9IG51bGw7DQotDQotLy8gY3JlYXRlIGFuZCBpbml0aWFsaXplIGEgbWVzc2FnZSBjb250ZXh0DQotdHJ5IHsNCi0gICAgICAgIFRyYW5zcG9ydEluRGVzY3JpcHRpb24gdHJhbnNwb3J0SW4gPQ0KLSAgICAgICAgICAgICAgICByZWcuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5nZXRUcmFuc3BvcnRJbihuZXcgUU5hbWUoQ29uc3RhbnRzLlRSQU5TUE9SVF9OQU1FKSk7DQotICAgICAgICBUcmFuc3BvcnRPdXREZXNjcmlwdGlvbiB0cmFuc3BvcnRPdXQgPQ0KLSAgICAgICAgICAgICAgICByZWcuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5nZXRUcmFuc3BvcnRPdXQobmV3IFFOYW1lKENvbnN0YW50cy5UUkFOU1BPUlRfTkFNRSkpOw0KLSAgICAgICAgaWYgKHRyYW5zcG9ydEluICE9IG51bGwgJmFtcDsmYW1wOyB0cmFuc3BvcnRPdXQgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICAvL2NyZWF0ZSBNZXNzYWdlIENvbnRleHQNCi0gICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgIG1zZ0NvbnRleHQgPSBuZXcgTWVzc2FnZUNvbnRleHQoY29uZmlndXJhdGlvbkNvbnRleHQsIHRyYW5zcG9ydEluLCB0cmFuc3BvcnRPdXQpOw0KLSAgICAgICAgICAgICAgICBtc2dDb250ZXh0LnNldFNlcnZlclNpZGUodHJ1ZSk7DQotICAgICAgICAgICAgICAgIG1zZ0NvbnRleHQuc2V0UHJvcGVydHkoTWFpbFNydkNvbnN0YW50cy5DT05URU5UX1RZUEUsIG1lc3NhZ2UuZ2V0Q29udGVudFR5cGUoKSk7DQotICAgICAgICAgICAgICAgIG1zZ0NvbnRleHQuc2V0UHJvcGVydHkoTWVzc2FnZUNvbnRleHQuQ0hBUkFDVEVSX1NFVF9FTkNPRElORywgbWVzc2FnZS5nZXRFbmNvZGluZygpKTsNCi0NCi0gICAgICAgICAgICAgICAgU3RyaW5nIHNvYXBBY3Rpb24gPSBtZXNzYWdlLmdldFNPQVBBY3Rpb25IZWFkZXIoKTsNCi0gICAgICAgICAgICAgICAgbXNnQ29udGV4dC5zZXRXU0FBY3Rpb24oc29hcEFjdGlvbik7DQotICAgICAgICAgICAgICAgIG1zZ0NvbnRleHQuc2V0U29hcEFjdGlvbihzb2FwQWN0aW9uKTsNCi0NCi0gICAgICAgICAgICAgICAgLy8gSGVyZSB3ZSBhcmUgdHJ5aW5nIHRvIHNldCB0aGUgcmVwbHkgdG8gaWYgaXQgaXMgcHJlc2VudCBpbiB0aGUgdHJhbnNwb3J0IGluZm9ybWF0aW9uLg0KLSAgICAgICAgICAgICAgICBtc2dDb250ZXh0LnNldFJlcGx5VG8obmV3IEVuZHBvaW50UmVmZXJlbmNlKG1lc3NhZ2UuZ2V0UmVwbHlUbygpKTsNCi0NCi0gICAgICAgICAgICAgICAgLy9DcmVhdGUgdGhlIFNPQVAgTWVzc2FnZSAtLSBUaGlzIGNvZGUgaW4gZnJvbSB0aGUgbWFpbCB0cmFuc3BvcnQgYW5kIHdpbGwgY2hhbmdlIGRlcGVuZGluZw0KLSAgICAgICAgICAgICAgICAvL29uIGhvdyB0aGUgZGF0YSBpcyBoYW5kbGVkIGluIGVhY2ggdHJhbnNwb3J0Lg0KLSAgICAgICAgICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBiYWlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG1lc3NhZ2UuZ2V0Q29udGVudCgpLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoKSk7DQotICAgICAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciByZWFkZXIgPSBYTUxJbnB1dEZhY3RvcnkubmV3SW5zdGFuY2UoKS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoYmFpcyk7DQotDQotICAgICAgICAgICAgICAgIFN0cmluZyBzb2FwTmFtZXNwYWNlVVJJID0gIiI7DQotICAgICAgICAgICAgICAgIGlmKG1lc3NhZ2UuZ2V0Q29udGVudFR5cGUoKS5pbmRleE9mKFNPQVAxMkNvbnN0YW50cy5TT0FQXzEyX0NPTlRFTlRfVFlQRSkgJmd0OyAtMSl7DQotICAgICAgICAgICAgICAgICAgICAgICAgc29hcE5hbWVzcGFjZVVSSSA9IFNPQVAxMkNvbnN0YW50cy5TT0FQX0VOVkVMT1BFX05BTUVTUEFDRV9VUkk7DQotICAgICAgICAgICAgICAgIH1lbHNlIGlmKG1lc3NhZ2UuZ2V0Q29udGVudFR5cGUoKS5pbmRleE9mKFNPQVAxMUNvbnN0YW50cy5TT0FQXzExX0NPTlRFTlRfVFlQRSkgJmd0OyAtMSl7DQotICAgICAgICAgICAgICAgICAgICAgICAgc29hcE5hbWVzcGFjZVVSSSA9IFNPQVAxMUNvbnN0YW50cy5TT0FQX0VOVkVMT1BFX05BTUVTUEFDRV9VUkk7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgU3RBWEJ1aWxkZXIgYnVpbGRlciA9IG5ldyBTdEFYU09BUE1vZGVsQnVpbGRlcihyZWFkZXIsIHNvYXBOYW1lc3BhY2VVUkkpOw0KLQ0KLSAgICAgICAgICAgICAgICBTT0FQRW52ZWxvcGUgZW52ZWxvcGUgPSAoU09BUEVudmVsb3BlKSBidWlsZGVyLmdldERvY3VtZW50RWxlbWVudCgpOw0KLSAgICAgICAgICAgICAgICBtc2dDb250ZXh0LnNldEVudmVsb3BlKGVudmVsb3BlKTsNCi0gICAgICAgICAgICAgICAgZW5naW5lLnJlY2VpdmUobXNnQ29udGV4dCk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KE1lc3NhZ2VzLmdldE1lc3NhZ2UoInVua25vd25UcmFuc3BvcnQiLENvbnN0YW50cy5UUkFOU1BPUlRfTkFNRSkpOw0KLSAgICAgICAgfQ0KLQ0KLX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgICAgICBpZiAobXNnQ29udGV4dCAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUNvbnRleHQgZmF1bHRDb250ZXh0ID0gZW5naW5lLmNyZWF0ZUZhdWx0TWVzc2FnZUNvbnRleHQobXNnQ29udGV4dCwgZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgZW5naW5lLnNlbmRGYXVsdChmYXVsdENvbnRleHQpOw0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcihlKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGUxKSB7DQotICAgICAgICAgICAgICAgIGxvZy5lcnJvcihlKTsNCi0gICAgICAgIH0NCi19PC9wcmU+DQotPC9zb3VyY2U+DQotPHA+Tm93IHRoYXQgd2UgaGF2ZSB0aGUgY29kaW5nIGluIHBsYWNlLCB3ZSBuZWVkIHRvIGxldCBBeGlzMiBrbm93IGFib3V0IG91cg0KLW5ldyB0cmFuc3BvcnQgcmVjZWl2ZXIuIFdlIGRvIHRoaXMgYnkgYWRkaW5nIGFuIGVudHJ5IGludG8gdGhlIGF4aXMyLnhtbA0KLWZpbGUuIElmIHlvdSBuZWVkIHRvIHBhc3MgYW55IHByb3BlcnRpZXMgZm9yIHRoZSB0cmFuc3BvcnQgdG8gb3BlcmF0ZSwgaXQgY2FuDQotYWxzbyBiZSBkb25lIHRocm91Z2ggdGhlIGF4aXMyLnhtbCBmaWxlLjwvcD4NCi08c291cmNlPjxwcmU+ICAgJmx0O3RyYW5zcG9ydFJlY2VpdmVyIG5hbWU9IlRSQU5TUE9SVF9OQU1FIiBjbGFzcz0ib3JnLmFwYWNoZS5BeGlzMi50cmFuc3BvcnQuVFJBTlNQT1JUX05BTUUuVFJBTlNQT1JUX0xJU1RORVJfQ0xBU1MiJmd0Ow0KLSAgICAgICAgJmx0O3BhcmFtZXRlciBuYW1lPSJQUk9QRVJUWV9OQU1FIiZndDtQUk9QRVJUWV9WQUxVRSZsdDsvcGFyYW1ldGVyJmd0Ow0KLSAgICAgICAgJmx0O3BhcmFtZXRlciBuYW1lPSJQUk9QRVJUWV9OQU1FXzIiJmd0O1BST1BFUlRZX1ZBTFVFXzImbHQ7L3BhcmFtZXRlciZndDsNCi0gICZsdDsvdHJhbnNwb3J0UmVjZWl2ZXImZ3Q7DQotICA8L3ByZT4NCi08L3NvdXJjZT4NCi08cD5CeSB1c2luZyBhIGNvZGUgZnJhZ21lbnQgbGlrZQ0KLTxjb2RlPlV0aWxzLmdldFBhcmFtZXRlclZhbHVlKHRyYW5zcG9ydE91dC5nZXRQYXJhbWV0ZXIoTWFpbFNydkNvbnN0YW50cy5TTVRQX1VTRVIpKTwvY29kZT4NCi13ZSBjYW4gZXh0cmFjdCB0aGUgcGFyYW1ldGVycyB0aGF0IHdlIGluc2VydGVkIGludG8gdGhlIGF4aXMyLnhtbCBmaWxlLjwvcD4NCi0NCi08cD5BcyB5b3UgY2FuIHNlZSwgZ2V0dGluZyBhIG5ldyB0cmFuc3BvcnQgcmVjZWl2ZXIgdXAgYW5kIHJ1bm5pbmcgaXMgYSB0YXNrDQotdGhhdCByZXF1aXJlcyB2ZXJ5IGxpdHRsZSBlZmZvcnQuPC9wPg0KLQ0KLTxoMj5UcmFuc3BvcnQgU2VuZGVyPC9oMj4NCi0NCi08cD5BbnkgbWVzc2FnZSB0aGF0IGlzIHRvIGJlIHNlbnQgb3V0IG9mIEF4aXMyLCBpcyBzZW50IHRocm91Z2ggdGhlIFRyYW5zcG9ydA0KLVNlbmRlci4gVGhlIFRyYW5zcG9ydCBTZW5kZXIgbmVlZHMgdG8gYmUgZXh0ZW5kZWQgZnJvbSB0aGUNCi1vcmcuYXBhY2hlLkF4aXMyLnRyYW5zcG9ydC5BYnN0cmFjdFRyYW5zcG9ydFNlbmRlciBjbGFzcy48L3A+DQotDQotPHA+VGhlIGZvbGxvd2luZyBiaXQgb2YgY29kZSBmcm9tIHRoZSBhYnN0cmFjdCB0cmFuc3BvcnQgc2VuZGVyIHdpbGwgY2FsbCB0aGUNCi1UcmFuc3BvcnQgU2VuZGVyIHRoYXQgeW91IHdyb3RlLjwvcD4NCi08c291cmNlPjxwcmU+Ly8gSWYgYW4gRVBSIGlzIHByZXNlbnQgdGhlbiB0aGUgbWVzc2FnZSBpcyBnb2luZyBvbiBhIGRpZmZlcmVudCBjaGFubmVsLg0KLWlmIChlcHIgIT0gbnVsbCkgew0KLSAgICAgICAgb3V0ID0gb3BlblRoZUNvbm5lY3Rpb24oZXByLCBtc2dDb250ZXh0KTsNCi0gICAgICAgIE91dHB1dFN0cmVhbSBuZXdPdXQgPSBzdGFydFNlbmRXaXRoVG9BZGRyZXNzKG1zZ0NvbnRleHQsIG91dCk7DQotICAgICAgICBpZiAobmV3T3V0ICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgb3V0ID0gbmV3T3V0Ow0KLSAgICAgICAgfQ0KLSAgICAgICAgd3JpdGVNZXNzYWdlKG1zZ0NvbnRleHQsIG91dCk7DQotICAgICAgICBmaW5hbGl6ZVNlbmRXaXRoVG9BZGRyZXNzKG1zZ0NvbnRleHQsIG91dCk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgb3V0ID0gKE91dHB1dFN0cmVhbSkgbXNnQ29udGV4dC5nZXRQcm9wZXJ0eShNZXNzYWdlQ29udGV4dC5UUkFOU1BPUlRfT1VUKTsNCi0gICAgICAgIGlmIChvdXQgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICBzdGFydFNlbmRXaXRoT3V0cHV0U3RyZWFtRnJvbUluY29taW5nQ29ubmVjdGlvbihtc2dDb250ZXh0LCBvdXQpOw0KLSAgICAgICAgICAgICAgICB3cml0ZU1lc3NhZ2UobXNnQ29udGV4dCwgb3V0KTsNCi0gICAgICAgICAgICAgICAgZmluYWxpemVTZW5kV2l0aE91dHB1dFN0cmVhbUZyb21JbmNvbWluZ0Nvbm5lY3Rpb24obXNnQ29udGV4dCwgb3V0KTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoDQotICAgICAgICAgICAgICAgICAgICAgICAgIkJvdGggdGhlIFRPIGFuZCBQcm9wZXJ0eSBNZXNzYWdlQ29udGV4dC5UUkFOU1BPUlRfV1JJVEVSIGlzIE51bGwsIE5vIHdheSB0byBzZW5kIHJlc3BvbnNlLiIpOw0KLSAgICAgICAgfQ0KLX08L3ByZT4NCi08L3NvdXJjZT4NCi08cD5UaGVyZWZvcmUsIGRlcGVuZGluZyBvbiB3aGV0aGVyIHlvdXIgdHJhbnNwb3J0IGlzIHVzaW5nIHRoZSBzYW1lIGNoYW5uZWwNCi10byBzZW5kIHRoZSByZXNwb25zZSBvciB1c2luZyBhIGRpZmZlcmVudCBjaGFubmVsLCB5b3Ugd2lsbCBuZWVkIHRvIGltcGxlbWVudA0KLWEgc3ViLXNldCBvZiB0aGUgbWV0aG9kcyBmcm9tIHRoZSBhYnN0cmFjdCBjbGFzcy48L3A+DQotDQotPHA+QWZ0ZXIgaW1wbGVtZW50aW5nIHRoZSBuZWNlc3NhcnkgbWV0aG9kcywgeW91IGNhbiBsZXQgQXhpczIga25vdyBhYm91dA0KLXlvdXIgbmV3IHRyYW5zcG9ydCBzZW5kZXIgYnkgYWRkaW5nIGFuIGVudHJ5IHRvIHRoZSBheGlzMi54bWwgZmlsZSwgbGlrZSB5b3UNCi1kaWQgZm9yIHRoZSBUcmFuc3BvcnRSZWNlaXZlci48L3A+DQotPHNvdXJjZT48cHJlPiAgJmx0O3RyYW5zcG9ydFNlbmRlciBuYW1lPSJUUkFOU1BPUlRfTkFNRSIgY2xhc3M9Im9yZy5hcGFjaGUuQXhpczIudHJhbnNwb3J0LlRSQU5TUE9SVF9OQU1FLlRSQU5TUE9SVF9TRU5ERVJfQ0xBU1MiJmd0Ow0KLSAgICAgICAgJmx0O3BhcmFtZXRlciBuYW1lPSJQUk9QRVJUWV9OQU1FIiZndDtQUk9QRVJUWV9WQUxVRSZsdDsvcGFyYW1ldGVyJmd0Ow0KLSAgICAgICAgJmx0O3BhcmFtZXRlciBuYW1lPSJQUk9QRVJUWV9OQU1FXzIiJmd0O1BST1BFUlRZX1ZBTFVFXzImbHQ7L3BhcmFtZXRlciZndDsNCi0gICZsdDsvdHJhbnNwb3J0U2VuZGVyJmd0Ow0KLSAgPC9wcmU+DQotPC9zb3VyY2U+DQotPHA+SGF2ZSBhIGxvb2sgYXQNCi1vcmcuYXBhY2hlLkF4aXMyLnRyYW5zcG9ydC5odHRwLkNvbW1vbnNIVFRQVHJhbnNwb3J0U2VuZGVyIHdoaWNoIGlzIHVzZWQgdG8NCi1zZW5kIEhUVFAgcmVzcG9uc2VzLjwvcD4NCi0NCi08cD5PbmNlIHdlIGhhdmUgd3JpdHRlbiBvdXIgdHJhbnNwb3J0IHJlY2VpdmVyIGFuZCBvdXIgdHJhbnNwb3J0IHNlbmRlciwgYW5kDQotaW5zZXJ0ZWQgdGhlIHJlcXVpcmVkIGVudHJpZXMgaW50byB0aGUgYXhpczIueG1sIGZpbGUsIHdlIGFyZSBkb25lLiBJdCBpcyBhcw0KLXNpbXBsZSBhcyB0aGF0ITwvcD4NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC91c2VyZ3VpZGUtYnVpbGRpbmdzZXJ2aWNlcy54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvdXNlcmd1aWRlLWJ1aWxkaW5nc2VydmljZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmIwYzU1Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC91c2VyZ3VpZGUtYnVpbGRpbmdzZXJ2aWNlcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi0NCi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIg0KLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+DQotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPg0KLTxoZWFkPg0KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0NCi0iSFRNTCBUaWR5IGZvciBXaW5kb3dzICh2ZXJzIDE0IEp1bmUgMjAwNyksIHNlZSB3d3cudzMub3JnIiAvPg0KLTxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0iIiAvPg0KLTx0aXRsZT5JbnRyb2R1Y2luZyBBeGlzMjwvdGl0bGU+DQotPGxpbmsgaHJlZj0iLi4vY3NzL2F4aXMtZG9jcy5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiDQotbWVkaWE9ImFsbCIgLz4NCi08L2hlYWQ+DQotPGJvZHk+DQotPGEgbmFtZT0iYnVpbGRzZXJ2aWNlcyIgaWQ9ImJ1aWxkc2VydmljZXMiPjwvYT4NCi08aDE+QXBhY2hlIEF4aXMyIFVzZXIncyBHdWlkZSAtQnVpbGRpbmcgU2VydmljZXM8L2gxPg0KLTxwPk5vdyB0aGF0IHlvdSBrbm93IGhvdyB0byB1c2UgQXhpczIgdG8gZ2VuZXJhdGUgY2xpZW50cyBmcm9tDQotV1NETCwgdGhpcyBzZWN0aW9uIGRpZ3MgYSBsaXR0bGUgZGVlcGVyIHNob3dpbmcgeW91IGhvdyB0byBjcmVhdGUNCi1zZXJ2aWNlcywgYW5kIGFsc28gaG93IHRvIGNyZWF0ZSBzZXJ2aWNlcyBhbmQgY2xpZW50cyAiZnJvbQ0KLXNjcmF0Y2giLCBzbyB0byBzcGVhay48L3A+DQotPHVsPg0KLTxsaT48YSBocmVmPSJ1c2VyZ3VpZGUuaHRtbCNpbnRybyI+SW50cm9kdWNpbmcgQXhpczI8L2E+PGJyIC8+DQotPHVsPg0KLTxsaT48YSBocmVmPSJ1c2VyZ3VpZGUuaHRtbCN3aGF0aXMiPldoYXQgaXMgQXhpczI/PC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9InVzZXJndWlkZS5odG1sI3VuZGVyaG9vZCI+V2hhdCdzIFVuZGVyIHRoZQ0KLUhvb2Q/PC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9InVzZXJndWlkZS5odG1sI2hhbmRsZXNzb2FwIj5Ib3cgQXhpczIgSGFuZGxlcyBTT0FQDQotTWVzc2FnZXM8L2E+PC9saT4NCi08bGk+PGEgaHJlZj0idXNlcmd1aWRlLmh0bWwjZGlzdHJpYnV0aW9ucyI+QXhpczINCi1EaXN0cmlidXRpb25zPC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9InVzZXJndWlkZS5odG1sI3NiZCI+VGhlIEF4aXMyIFN0YW5kYXJkIEJpbmFyeQ0KLURpc3RyaWJ1dGlvbjwvYT48L2xpPg0KLTxsaT48YSBocmVmPSJ1c2VyZ3VpZGUuaHRtbCNoaWVyYXJjaHkiPkF4aXMyLndhciBEaXJlY3RvcnkNCi1IaWVyYXJjaHk8L2E+PC9saT4NCi08bGk+PGEgaHJlZj0idXNlcmd1aWRlLmh0bWwjZG9jcyI+QXhpczIgRG9jdW1lbnRzDQotRGlzdHJpYnV0aW9uPC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9InVzZXJndWlkZS5odG1sI2NsaWVudHMiPkF4aXMyIGFuZCBDbGllbnRzPC9hPjwvbGk+DQotPC91bD4NCi08L2xpPg0KLTxsaT48YSBocmVmPQ0KLSJ1c2VyZ3VpZGUtaW5zdGFsbGluZ3Rlc3RpbmcuaHRtbCNpbnN0YWxsaW5ndGVzdGluZyI+SW5zdGFsbGluZyBhbmQNCi1UZXN0aW5nIENsaWVudCBDb2RlPC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9DQotInVzZXJndWlkZS1pbnRyb3Rvc2VydmljZXMuaHRtbCNpbnRyb3NlcnZpY2VzIj5JbnRyb2R1Y3Rpb24gdG8NCi1TZXJ2aWNlczwvYT48YnIgLz4NCi08dWw+DQotPGxpPjxhIGhyZWY9DQotInVzZXJndWlkZS1pbnRyb3Rvc2VydmljZXMuaHRtbCNtZXNzYWdlZXhjaGFuZ2UiPk1lc3NhZ2UgRXhjaGFuZ2UNCi1QYXR0ZXJuczwvYT48L2xpPg0KLTwvdWw+DQotPC9saT4NCi08bGk+PGEgaHJlZj0idXNlcmd1aWRlLWNyZWF0aW5nY2xpZW50cy5odG1sI2NyZWF0ZWNsaWVudHMiPkNyZWF0aW5nDQotQ2xpZW50czwvYT48YnIgLz4NCi08dWw+DQotPGxpPjxhIGhyZWY9DQotInVzZXJndWlkZS1jcmVhdGluZ2NsaWVudHMuaHRtbCNjaG9vc2luZ2NsaWVudCI+Q2hvb3NpbmcgYSBDbGllbnQNCi1HZW5lcmF0aW9uIE1ldGhvZDwvYT48L2xpPg0KLTxsaT48YSBocmVmPSJ1c2VyZ3VpZGUtY3JlYXRpbmdjbGllbnRzLmh0bWwjZ2VuZXJhdGluZyI+R2VuZXJhdGluZw0KLUNsaWVudHM8L2E+PC9saT4NCi08bGk+PGEgaHJlZj0idXNlcmd1aWRlLWNyZWF0aW5nY2xpZW50cy5odG1sI2FkYiI+QXhpcyBEYXRhIEJpbmRpbmcNCi0oQURCKTwvYT48L2xpPg0KLTwvdWw+DQotPC9saT4NCi08bGk+PGEgaHJlZj0NCi0idXNlcmd1aWRlLWJ1aWxkaW5nc2VydmljZXMuaHRtbCNidWlsZHNlcnZpY2VzIj48c3Ryb25nPkJ1aWxkaW5nDQotU2VydmljZXM8L3N0cm9uZz48L2E+PGJyIC8+DQotPHVsPg0KLTxsaT48YSBocmVmPQ0KLSJ1c2VyZ3VpZGUtYnVpbGRpbmdzZXJ2aWNlcy5odG1sI2dldGNvbWZvcnRhYmxlIj48c3Ryb25nPkdldHRpbmcNCi1Db21mb3J0YWJsZSB3aXRoIEF2YWlsYWJsZSBPcHRpb25zPC9zdHJvbmc+PC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9DQotInVzZXJndWlkZS1idWlsZGluZ3NlcnZpY2VzLmh0bWwjY3JlYXRlc2NyYXRjaCI+PHN0cm9uZz5DcmVhdGluZyBhDQotU2VydmljZSBmcm9tIFNjcmF0Y2g8L3N0cm9uZz48L2E+PC9saT4NCi08bGk+PGEgaHJlZj0NCi0idXNlcmd1aWRlLWJ1aWxkaW5nc2VydmljZXMuaHRtbCNkZXBsb3lwb2pvIj48c3Ryb25nPkRlcGxveWluZw0KLVBsYWluIE9sZCBKYXZhIE9iamVjdHM8L3N0cm9uZz48L2E+PC9saT4NCi08bGk+PGEgaHJlZj0NCi0idXNlcmd1aWRlLWJ1aWxkaW5nc2VydmljZXMuaHRtbCNkZXBsb3lydW4iPjxzdHJvbmc+RGVwbG95aW5nIGFuZA0KLVJ1bm5pbmcgYW4gQXhpczIgU2VydmljZSBDcmVhdGVkIGZyb20gV1NETDwvc3Ryb25nPjwvYT48L2xpPg0KLTwvdWw+DQotPC9saT4NCi08bGk+PGEgaHJlZj0idXNlcmd1aWRlLXNhbXBsZXMuaHRtbCI+U2FtcGxlczwvYT48L2xpPg0KLTxsaT48YSBocmVmPSJ1c2VyZ3VpZGUtZm9yZnVydGhlcnN0dWR5Lmh0bWwiPkZvciBGdXJ0aGVyDQotU3R1ZHk8L2E+PC9saT4NCi08L3VsPg0KLTxwPjxhIG5hbWU9ImdldGNvbWZvcnRhYmxlIiBpZD0iZ2V0Y29tZm9ydGFibGUiPjwvYT48L3A+DQotPGgyPkdldHRpbmcgQ29tZm9ydGFibGUgd2l0aCB0aGUgQXZhaWxhYmxlIE9wdGlvbnM8L2gyPg0KLTxwPkF4aXMyIHByb3ZpZGVzIGEgbnVtYmVyIG9mIHdheXMgdG8gY3JlYXRlIGEgc2VydmljZSwgc3VjaA0KLWFzOjwvcD4NCi08dWw+DQotPGxpPkNyZWF0ZSBhIHNlcnZpY2UgYW5kIGJ1aWxkIGl0IGZyb20gc2NyYXRjaC4gSW4gdGhpcyBjYXNlLCB5b3UNCi1idWlsZCB5b3VyIHNlcnZpY2UgY2xhc3MgdG8gc3BlY2lmaWNhbGx5IGFjY2VzcyBBWElPTSBPTUVsZW1lbnQNCi1vYmplY3RzLCB0aGVuIGNyZWF0ZSB0aGUgc2VydmljZXMueG1sIGZpbGUgYW5kIHBhY2thZ2UgaXQgZm9yDQotZGVwbG95bWVudC48L2xpPg0KLTxsaT5EZXBsb3kgUGxhaW4gT2xkIEphdmEgT2JqZWN0cyAoUE9KT3MpIGFzIGEgc2VydmljZS48L2xpPg0KLTxsaT5HZW5lcmF0ZSB0aGUgc2VydmljZSBmcm9tIFdTREwuIEp1c3QgYXMgeW91IGNhbiBnZW5lcmF0ZQ0KLWNsaWVudHMgd2l0aCBXU0RMLCB5b3UgY2FuIGFsc28gZ2VuZXJhdGUgdGhlIHNrZWxldG9uIG9mIGENCi1zZXJ2aWNlLjwvbGk+DQotPC91bD4NCi08cD5MZXQncyBsb29rIGF0IHRoZXNlIHRocmVlIG9wdGlvbnMuPC9wPg0KLTxhIG5hbWU9ImNyZWF0ZXNjcmF0Y2giIGlkPSJjcmVhdGVzY3JhdGNoIj48L2E+DQotPGgyPkNyZWF0aW5nIGEgU2VydmljZSBmcm9tIFNjcmF0Y2g8L2gyPg0KLTxwPkNyZWF0aW5nIGEgc2VydmljZSBmcm9tIHNjcmF0Y2ggaXMgbm90IHRoZSBtb3N0IGNvbnZlbmllbnQgd2F5DQotdG8gZG8gaXQsIGJ1dCBpdCBkb2VzIGdpdmUgeW91IHRoZSBtb3N0IGNvbnRyb2wuIFRoZSBwcm9jZXNzDQotaW52b2x2ZXMgc2V2ZXJhbCBzdGVwcy48L3A+DQotPHA+PGI+VGhlIHNob3J0IHN0b3J5OjwvYj48L3A+DQotPG9sPg0KLTxsaT5DcmVhdGUgdGhlIHNlcnZpY2UgY2xhc3Mgd2l0aCBlYWNoIG9wZXJhdGlvbiB0aGF0IGlzDQotcmVwcmVzZW50ZWQgYnkgYSBtZXRob2QgdGhhdCB0YWtlcyBhbiBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudA0KLW9iamVjdCBhcyBpdHMgYXJndW1lbnQuIChBbiBPTUVsZW1lbnQgaXMgaG93IHRoZSBBWElzMiBPYmplY3QgTW9kZWwNCi0oQVhJT00pIHJlcHJlc2VudHMgYW4gWE1MIGVsZW1lbnQuKTwvbGk+DQotPGxpPkNyZWF0ZSB0aGUgc2VydmljZSBkZXNjcmlwdG9yLCBzZXJ2aWNlcy54bWwsIHdoaWNoIGRlZmluZXMgdGhlDQotY2xhc3MgdG8gYmUgdXNlZCBieSB0aGUgc2VydmljZSBhbmQgdGhlIGFwcHJvcHJpYXRlIG1lc3NhZ2UNCi1yZWNlaXZlcnMuPC9saT4NCi08bGk+Q3JlYXRlIHRoZSAuYWFyIGZpbGUsIHdpdGggdGhlIGNsYXNzZXMgaW4gdGhlaXIgcHJvcGVyDQotbG9jYXRpb25zIGJhc2VkIG9uIHRoZSBwYWNrYWdlIGFuZCB0aGUgc2VydmljZXMueG1sIGZpbGUgaW4gdGhlDQotTUVUQS1JTkYgZGlyZWN0b3J5LjwvbGk+DQotPGxpPkRlcGxveSB0aGUgLmFhciBmaWxlIGJ5IHVzaW5nIHRoZSA8YSBocmVmPQ0KLSJ3ZWJhZG1pbmd1aWRlLmh0bWwiPldlYiBBZG1pbmlzdHJhdGlvbiBhcHBsaWNhdGlvbjwvYT4gb3IgYnkNCi1jb3B5aW5nIGl0IHRvIHRoZSBBeGlzMiBzZXJ2aWNlcyBkaXJlY3RvcnkuPC9saT4NCi08L29sPg0KLTxwPjxiPlRoZSBsb25nIHN0b3J5OjwvYj48L3A+DQotPHA+U3RhcnQgYnkgY3JlYXRpbmcgdGhlIHNlcnZpY2UgY2xhc3MsIGEgcGxhaW4gSmF2YSBjbGFzcyB0aGF0DQotdXNlcyBjbGFzc2VzIGZyb20gdGhlIEF4aXMyIGxpYnJhcmllcyAoc2VlIENvZGUgTGlzdGluZyA4KS48L3A+DQotPGgzPkNvZGUgTGlzdGluZyA4LUNyZWF0aW5nIHRoZSBTZXJ2aWNlIENsYXNzPC9oMz4NCi08cHJlPg0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5heGlzMnVzZXJndWlkZTsNCi0NCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5hbWVzcGFjZTsNCi0NCi1wdWJsaWMgY2xhc3MgU2FtcGxlU2VydmljZSB7DQotDQotICAgIHB1YmxpYyBPTUVsZW1lbnQgc2F5SGVsbG8oT01FbGVtZW50IGVsZW1lbnQpIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7DQotICAgICAgICAgICAgZWxlbWVudC5idWlsZCgpOw0KLSAgICAgICAgICAgIGVsZW1lbnQuZGV0YWNoKCk7DQotDQotICAgICAgICAgICAgU3RyaW5nIHJvb3ROYW1lID0gZWxlbWVudC5nZXRMb2NhbE5hbWUoKTsNCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlJlYWRpbmcgIityb290TmFtZSsiIGVsZW1lbnQiKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBPTUVsZW1lbnQgY2hpbGRFbGVtZW50ID0gZWxlbWVudC5nZXRGaXJzdEVsZW1lbnQoKTsNCi0gICAgICAgICAgICBTdHJpbmcgcGVyc29uVG9HcmVldCA9IGNoaWxkRWxlbWVudC5nZXRUZXh0KCk7DQotDQotICAgICAgICAgICAgT01GYWN0b3J5IGZhYyA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpOw0KLSAgICAgICAgICAgIE9NTmFtZXNwYWNlIG9tTnMgPSBmYWMuY3JlYXRlT01OYW1lc3BhY2UoDQotICAgICAgICAgICAgICAgICAgICAiaHR0cDovL2V4YW1wbGUxLm9yZy9leGFtcGxlMSIsICJleGFtcGxlMSIpOw0KLSAgICAgICAgICAgIE9NRWxlbWVudCBtZXRob2QgPSBmYWMuY3JlYXRlT01FbGVtZW50KCJzYXlIZWxsb1Jlc3BvbnNlIiwgDQotb21Ocyk7DQotICAgICAgICAgICAgT01FbGVtZW50IHZhbHVlID0gZmFjLmNyZWF0ZU9NRWxlbWVudCgiZ3JlZXRpbmciLCBvbU5zKTsNCi0gICAgICAgICAgICB2YWx1ZS5hZGRDaGlsZChmYWMuY3JlYXRlT01UZXh0KHZhbHVlLCAiSGVsbG8sIA0KLSIrcGVyc29uVG9HcmVldCkpOw0KLSAgICAgICAgICAgIG1ldGhvZC5hZGRDaGlsZCh2YWx1ZSk7DQotDQotICAgICAgICAgICAgcmV0dXJuIG1ldGhvZDsNCi0gICAgICAgIH0NCi0NCi0gICAgIHByaXZhdGUgdm9pZCBwaW5nKCl7DQotICAgICB9DQotICAgIA0KLX0NCi08L3ByZT4NCi08cD5NYWtlIHN1cmUgdG8gaW5jbHVkZSBBeGlzMiBsaWJyYXJpZXMgaW4geW91ciBjbGFzcyBwYXRoIHdoZW4NCi1jb21waWxpbmcgdGhlIHNvdXJjZS48L3A+DQotPHA+QXhpczIgdXNlcyBBWElPTSwgb3IgdGhlIEFYSXMgT2JqZWN0IE1vZGVsLCBhIERPTSAoRG9jdW1lbnQNCi1PYmplY3QgTW9kZWwpIC1saWtlIHN0cnVjdHVyZSB0aGF0IGlzIGJhc2VkIG9uIHRoZSBTdEFYIEFQSSAoDQotU3RyZWFtaW5nIEFQSSBmb3IgWE1MKS4gTWV0aG9kcyB0aGF0IGFjdCBhcyBzZXJ2aWNlcyBtdXN0IHRha2UgYW4NCi1PTUVsZW1lbnQgYXMgdGhlaXIgYXJndW1lbnQsIHdoaWNoIHJlcHJlc2VudHMgdGhlIHBheWxvYWQgb2YgdGhlDQotaW5jb21pbmcgU09BUCBtZXNzYWdlLiAoQW4gT01FbGVtZW50IGlzIGp1c3QgQVhJT00ncyB3YXkgb2YNCi1yZXByZXNlbnRpbmcgYW4gWE1MIGVsZW1lbnQsIGxpa2UgYSBET00gRWxlbWVudCBvYmplY3QuKSBJbiB0aGlzDQotY2FzZSwgeW91J3JlIGV4dHJhY3RpbmcgdGhlIGNvbnRlbnRzIG9mIHRoZSBmaXJzdCBjaGlsZCBvZiB0aGUNCi1wYXlsb2FkIGVsZW1lbnQsIGFkZGluZyB0ZXh0IHRvIGl0LCBhbmQgdXNpbmcgaXQgYXMgY29udGVudCBmb3IgdGhlDQotcmV0dXJuIE9NRWxlbWVudC4gVW5sZXNzIHRoaXMgaXMgYW4gImluIG9ubHkiIHNlcnZpY2UsIHRoZXNlDQotbWV0aG9kcyBtdXN0IHJldHVybiBhbiBPTUVsZW1lbnQsIGJlY2F1c2UgdGhhdCBiZWNvbWVzIHRoZSBwYXlsb2FkDQotb2YgdGhlIHJldHVybiBTT0FQIG1lc3NhZ2UuPC9wPg0KLTxwPlRvIHR1cm4gdGhpcyBjbGFzcyBpbnRvIGEgc2VydmljZSwgY3JlYXRlIHRoZSBzZXJ2aWNlDQotZGVzY3JpcHRpb24gZmlsZSwgc2VydmljZXMueG1sLCBhcyBpbiBDb2RlIExpc3RpbmcgOS48L3A+DQotPGgzPkNvZGUgTGlzdGluZyA5IC0gQ3JlYXRlIHRoZSBTZXJ2aWNlIERlc2NyaXB0aW9uPC9oMz4NCi08cHJlPg0KLSZsdDtzZXJ2aWNlIG5hbWU9IlVzZXJHdWlkZVNhbXBsZVNlcnZpY2UiJmd0Ow0KLSAgICAmbHQ7ZGVzY3JpcHRpb24mZ3Q7DQotICAgICAgICBUaGlzIGlzIGEgc2FtcGxlIHNlcnZpY2UgY3JlYXRlZCBpbiB0aGUgQXhpczIgVXNlcidzIEd1aWRlDQotICAgICZsdDsvZGVzY3JpcHRpb24mZ3Q7DQotDQotICAgICZsdDtwYXJhbWV0ZXIgbmFtZT0iU2VydmljZUNsYXNzIiANCi0mZ3Q7b3JnLmFwYWNoZS5heGlzMi5heGlzMnVzZXJndWlkZS5TYW1wbGVTZXJ2aWNlDQotJmx0Oy9wYXJhbWV0ZXImZ3Q7DQotDQotICAgICZsdDtvcGVyYXRpb24gbmFtZT0ic2F5SGVsbG8iJmd0Ow0KLSAgICAgICAgJmx0O21lc3NhZ2VSZWNlaXZlciANCi1jbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuUmF3WE1MSU5PdXRNZXNzYWdlUmVjZWl2ZXIiLyZndDsNCi0gICAgJmx0Oy9vcGVyYXRpb24mZ3Q7DQotICAgICZsdDtvcGVyYXRpb24gbmFtZT0icGluZyImZ3Q7DQotICAgICAgICAmbHQ7bWVzc2FnZVJlY2VpdmVyIA0KLWNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5SYXdYTUxJTk9ubHlNZXNzYWdlUmVjZWl2ZXIiLyZndDsNCi0gICAgJmx0Oy9vcGVyYXRpb24mZ3Q7DQotJmx0Oy9zZXJ2aWNlJmd0Ow0KLTwvcHJlPg0KLTxwPlRoaXMgZG9jdW1lbnQgZGVmaW5lcyB0aGUgc2VydmljZSwgY2FsbGVkIGJ5IHRoZSA8YSBocmVmPQ0KLSJ3ZWJhZG1pbmd1aWRlLmh0bWwiPldlYiBBZG1pbmlzdHJhdGlvbiBBcHBsaWNhdGlvbjwvYT4sIGFuZCB0aGUNCi1jbGFzcyB1c2VkIHRvIHNlcnZlIHJlcXVlc3RzLiBGb3IgZWFjaCBvcGVyYXRpb24sIGl0IGRlZmluZXMgdGhlDQotYXBwcm9wcmlhdGUgbWVzc2FnZSByZWNlaXZlciBjbGFzcy48L3A+DQotPHA+Q3JlYXRlIGEgbmV3IGRpcmVjdG9yeSwgTUVUQS1JTkYsIGluIHRoZSBtYWluIGRpcmVjdG9yeSBmb3IgdGhlDQotY2xhc3MuIChJbiB0aGlzIGNhc2UsIHRoYXQncyB0aGUgc2FtZSBkaXJlY3RvcnkgdGhhdCBjb250YWlucyB0aGUNCi1vcmcgZGlyZWN0b3J5KSBhbmQgcGxhY2UgdGhlIHNlcnZpY2VzLnhtbCBmaWxlIGluIGl0LjwvcD4NCi08cD5DcmVhdGUgdGhlIC5hYXIgZmlsZSBieSB0eXBpbmc6IGphciBjdmYgU2FtcGxlU2VydmljZS5hYXINCi0uLyo8L3A+DQotPHA+RGVwbG95IHRoZSBTYW1wbGVTZXJ2aWNlLmFhciBmaWxlIGJ5IHVzaW5nIHRoZSA8YSBocmVmPQ0KLSJ3ZWJhZG1pbmd1aWRlLmh0bWwiPldlYiBBZG1pbmlzdHJhdGlvbiBhcHBsaWNhdGlvbjwvYT4gb3IgYnkNCi1jb3B5aW5nIGl0IHRvIHRoZSBBeGlzMiBzZXJ2aWNlcyBkaXJlY3RvcnkuPC9wPg0KLTxwPk5vdyB5b3UgY2FuIGNyZWF0ZSBhIGNsaWVudCBjbGFzcyB0aGF0IGFjY2Vzc2VzIHRoZSBzZXJ2aWNlDQotZGlyZWN0bHkgKHNlZSBDb2RlIExpc3RpbmcgMTApLjwvcD4NCi08aDM+Q29kZSBMaXN0aW5nIDEwIC0gQ3JlYXRlIGEgQ2xpZW50IENsYXNzIHRoYXQgQWNjZXNzZXMgdGhlDQotU2VydmljZSBEaXJlY3RseTwvaDM+DQotPHByZT4NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuYXhpczJ1c2VyZ3VpZGU7DQotDQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01OYW1lc3BhY2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuT3B0aW9uczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50LlNlcnZpY2VDbGllbnQ7DQotDQotcHVibGljIGNsYXNzIFNhbXBsZUNsaWVudCB7DQotDQotICAgICAgIHByaXZhdGUgc3RhdGljIEVuZHBvaW50UmVmZXJlbmNlIHRhcmdldEVQUiA9IA0KLSAgICAgICAgICAgICBuZXcgRW5kcG9pbnRSZWZlcmVuY2UoDQotICAgICAgICAgICAgICAgImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9heGlzMi9zZXJ2aWNlcy9Vc2VyR3VpZGVTYW1wbGVTZXJ2aWNlIik7DQotDQotICAgICAgICBwdWJsaWMgc3RhdGljIE9NRWxlbWVudCBncmVldFVzZXJQYXlsb2FkKFN0cmluZyBwZXJzb25Ub0dyZWV0KSB7DQotICAgICAgICAgICAgT01GYWN0b3J5IGZhYyA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpOw0KLSAgICAgICAgICAgIE9NTmFtZXNwYWNlIG9tTnMgPSBmYWMuY3JlYXRlT01OYW1lc3BhY2UoDQotICAgICAgICAgICAgICAgICAgICAiaHR0cDovL2V4YW1wbGUxLm9yZy9leGFtcGxlMSIsICJleGFtcGxlMSIpOw0KLSAgICAgICAgICAgIE9NRWxlbWVudCBtZXRob2QgPSBmYWMuY3JlYXRlT01FbGVtZW50KCJzYXlIZWxsbyIsIG9tTnMpOw0KLSAgICAgICAgICAgIE9NRWxlbWVudCB2YWx1ZSA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoInBlcnNvblRvR3JlZXQiLCANCi1vbU5zKTsNCi0gICAgICAgICAgICB2YWx1ZS5hZGRDaGlsZChmYWMuY3JlYXRlT01UZXh0KHZhbHVlLCBwZXJzb25Ub0dyZWV0KSk7DQotICAgICAgICAgICAgbWV0aG9kLmFkZENoaWxkKHZhbHVlKTsNCi0gICAgICAgICAgICByZXR1cm4gbWV0aG9kOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgew0KLSAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgIE9NRWxlbWVudCBwYXlsb2FkID0gDQotU2FtcGxlQ2xpZW50LmdyZWV0VXNlclBheWxvYWQoIkpvaG4iKTsNCi0gICAgICAgICAgICAgICAgT3B0aW9ucyBvcHRpb25zID0gbmV3IE9wdGlvbnMoKTsNCi0gICAgICAgICAgICAgICAgb3B0aW9ucy5zZXRUbyh0YXJnZXRFUFIpOw0KLSAgICAgICAgICAgICAgICANCi1vcHRpb25zLnNldFRyYW5zcG9ydEluUHJvdG9jb2woQ29uc3RhbnRzLlRSQU5TUE9SVF9IVFRQKTsNCi0NCi0gICAgICAgICAgICAgICAgU2VydmljZUNsaWVudCBzZW5kZXIgPSBuZXcgU2VydmljZUNsaWVudCgpOw0KLSAgICAgICAgICAgICAgICBzZW5kZXIuc2V0T3B0aW9ucyhvcHRpb25zKTsNCi0gICAgICAgICAgICAgICAgT01FbGVtZW50IHJlc3VsdCA9IHNlbmRlci5zZW5kUmVjZWl2ZShwYXlsb2FkKTsNCi0NCi0gICAgICAgICAgICAgICAgU3RyaW5nIHJlc3BvbnNlID0gcmVzdWx0LmdldEZpcnN0RWxlbWVudCgpLmdldFRleHQoKTsNCi0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHJlc3BvbnNlKTsNCi0NCi0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeyAvLyhYTUxTdHJlYW1FeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZS50b1N0cmluZygpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIA0KLX0NCi08L3ByZT4NCi08cD5UaGlzIGNsYXNzIHVzZXMgdGhlIHNhbWUgdGVjaG5pcXVlIG9mIHNlbmRpbmcgYW5kIHJlY2VpdmluZw0KLU9NRWxlbWVudHMsIGJ1dCBpdCdzIGFsc28gaW1wb3J0YW50IHRvIG5vdGUgdGhlIHVzZSBvZiB0aGUgT3B0aW9ucw0KLWNsYXNzLiBUaGlzIGNsYXNzIGVuYWJsZXMgeW91IHRvIGRldGVybWluZSBwcm9wZXJ0aWVzIHN1Y2ggYXMgdGhlDQotdHJhbnNwb3J0IHVzZWQgZm9yIHRoZSByZXR1cm4gbWVzc2FnZSAodGhlIHRyYW5zcG9ydCB1c2VkIGZvciB0aGUNCi1vdXRnb2luZyBtZXNzYWdlIGNhbiBiZSBpbmZlcnJlZCBmcm9tIHRoZSBVUkwgb2YgdGhlIGRlc3RpbmF0aW9uKQ0KLWFuZCB0aGUgU09BUCB2ZXJzaW9uIHRvIHVzZS4gSW4gYWRkaXRpb24gdG8gcHJvdmlkaW5nIHNldHRlciBhbmQNCi1nZXR0ZXIgbWV0aG9kcyBvZiBzcGVjaWZpYyBwcm9wZXJ0aWVzIHRoYXQgYWZmZWN0IGhvdyB0aGUgY2xpZW50DQotaW50ZXJhY3RzIHdpdGggdGhlIHNlcnZpY2UsIHRoZSBPcHRpb25zIGNsYXNzIGVuYWJsZXMgeW91IHRvIGNyZWF0ZQ0KLWluaGVyaXRhbmNlIHJlbGF0aW9uc2hpcHMgYmV0d2VlbiBPcHRpb25zIG9iamVjdHMuIFNvIGlmIGEgcHJvcGVydHkNCi1pcyBub3QgZm91bmQgaW4gdGhlIGN1cnJlbnQgT3B0aW9ucyBvYmplY3QgdXNlZCwgdGhlIGNsaWVudCBjYW4NCi1jaGVjayB0aGUgcGFyZW50IE9wdGlvbnMgb2JqZWN0IG9mIHRoZSBjdXJyZW50IE9wdGlvbnMgb2JqZWN0LjwvcD4NCi08cD5Db21waWxlIGFuZCBydW4gdGhlIGFib3ZlIFNhbXBsZUNsaWVudC5qYXZhLiBNYWtlIHN1cmUgdG8gaGF2ZQ0KLWFsbCBheGlzMiBsaWJyYXJpZXMgaW4geW91ciBjbGFzcyBwYXRoLiBJZiBhbGwgaGFzIGdvbmUgd2VsbCwNCi0nSGVsbG8sIEpvaG4nIHdpbGwgYmUgc2hvd24gYXMgdGhlIG91dHB1dCBpbiB0aGUgY29uc29sZS48L3A+DQotPGEgbmFtZT0iZGVwbG95cG9qbyIgaWQ9ImRlcGxveXBvam8iPjwvYT4NCi08aDI+RGVwbG95aW5nIFBsYWluIE9sZCBKYXZhIE9iamVjdHMgKFBPSk9zKTwvaDI+DQotPHA+T25lIHZlcnkgZWFzeSB3YXkgdG8gY3JlYXRlIGEgV2ViIHNlcnZpY2UgaXMgc2ltcGx5IHRvIGRlcGxveQ0KLXRoZSBKYXZhIG9iamVjdHMgdGhhdCByZXByZXNlbnQgdGhlIHNlcnZpY2UuIFN0YXJ0IHdpdGggdGhlIGNsYXNzLA0KLXNob3duIGluIENvZGUgTGlzdGluZyAxMS48L3A+DQotPGgzPjxiPkNvZGUgTGlzdGluZyAxMSAtIENyZWF0aW5nIHRoZSBDbGFzcyBTYW1wbGVTZXJ2aWNlPC9iPjwvaDM+DQotPHByZT4NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuYXhpczJ1c2VyZ3VpZGU7DQotDQotcHVibGljIGNsYXNzIFNhbXBsZVNlcnZpY2Ugew0KLQ0KLSAgICBwdWJsaWMgdm9pZCBkb0luT25seSgpew0KLSAgICAgcmV0dXJuOyANCi0gICAgfSANCi0gICAgIA0KLSAgICBwdWJsaWMgU3RyaW5nIG5vUGFyYW1ldGVycygpew0KLSAgICAgIHJldHVybiAiSGVsbG8iOw0KLSAgICB9IA0KLSAgICANCi0gICAgcHVibGljIFN0cmluZyB0d29XYXlPbmVQYXJhbWV0ZXJFY2hvKFN0cmluZyB0b0VjaG8pew0KLSAgICAgIHJldHVybiB0b0VjaG87DQotICAgIH0gDQotICAgIA0KLSAgICBwdWJsaWMgYm9vbGVhbiBtdWx0aXBsZVBhcmFtZXRlcnNBZGQoZmxvYXQgcHJpY2UsIGludCBpdGVtSWQsIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGRlc2NyaXB0aW9uLCBTdHJpbmcgaXRlbU5hbWUpew0KLSAgICAgIC8vQ29kZSB0byBoYW5kbGUgdGhlIGxvZ2ljDQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9IA0KLSANCi19DQotPC9wcmU+DQotPHA+TmV4dCwgeW91J2xsIG5lZWQgdG8gdGVsbCBBeGlzMiB3aGF0IGNsYXNzIGNvcnJlc3BvbmRzIHdpdGggd2hhdA0KLVdlYiBzZXJ2aWNlIGNhbGxzLiBEbyB0aGlzIGJ5IGNyZWF0aW5nIGEgZmlsZSBjYWxsZWQgc2VydmljZXMueG1sDQotYW5kIGFkZGluZyB0aGUgZm9sbG93aW5nIHNob3duIGluIENvZGUgTGlzdGluZyAxMi48L3A+DQotPGgzPjxiPkNvZGUgTGlzdGluZyAxMiAtIENyZWF0aW5nIHNlcnZpY2VzLnhtbDwvYj48L2gzPg0KLTxwcmU+DQotJmx0O3NlcnZpY2UgbmFtZT0iU2FtcGxlU2VydmljZSIgc2NvcGU9ImFwcGxpY2F0aW9uIiZndDsNCi0gICAgJmx0O2Rlc2NyaXB0aW9uJmd0Ow0KLSAgICAgICAgU2FtcGxlIFNlcnZpY2UNCi0gICAgJmx0Oy9kZXNjcmlwdGlvbiZndDsNCi0gICAgJmx0O21lc3NhZ2VSZWNlaXZlcnMmZ3Q7DQotICAgICAgICAmbHQ7bWVzc2FnZVJlY2VpdmVyIA0KLSAgICAgICAgICAgIG1lcD0iaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC93c2RsL2luLW9ubHkiDQotICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJwYy5yZWNlaXZlcnMuUlBDSW5Pbmx5TWVzc2FnZVJlY2VpdmVyIi8mZ3Q7DQotICAgICAgICAmbHQ7bWVzc2FnZVJlY2VpdmVyDQotICAgICAgICAgICAgbWVwPSJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaW4tb3V0Ig0KLSAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5ycGMucmVjZWl2ZXJzLlJQQ01lc3NhZ2VSZWNlaXZlciIvJmd0Ow0KLSAgICAmbHQ7L21lc3NhZ2VSZWNlaXZlcnMmZ3Q7DQotICAgICZsdDtwYXJhbWV0ZXIgbmFtZT0iU2VydmljZUNsYXNzIiZndDsNCi0gICAgICAgIG9yZy5hcGFjaGUuYXhpczIuYXhpczJ1c2VyZ3VpZGUuU2FtcGxlU2VydmljZQ0KLSAgICAmbHQ7L3BhcmFtZXRlciZndDsNCi0mbHQ7L3NlcnZpY2UmZ3Q7DQotPC9wcmU+DQotPHA+VGhpcyBmaWxlIG1ha2VzIHRoZSBJbk9ubHkgYW5kIEluT3V0IE1FUHMgYXZhaWxhYmxlIHRvIHRoZQ0KLXNlcnZpY2UgYW5kIHRlbGxzIEF4aXMyIHdoaWNoIGNsYXNzIHRvIGNhbGw7IG9wZXJhdGlvbnMgbXVzdCBtYXRjaA0KLW1ldGhvZCBuYW1lcy4gSW4gb3RoZXIgd29yZHMsIEF4aXMyIGF1dG9tYXRpY2FsbHkgc2VuZHMgYSBjYWxsIHRvDQotdGhlIG11bHRpcGxlUGFyYW1ldGVyc0FkZCBvcGVyYXRpb24gdG8gdGhlDQotb3JnLmFwYWNoZS5heGlzMi5heGlzMnVzZXJndWlkZS5TYW1wbGVTZXJ2aWNlLm11bHRpcGxlUGFyYW1ldGVyc0FkZCgpDQotbWV0aG9kLjwvcD4NCi08cD5Ob3cgaXQncyB0aW1lIHRvIGNyZWF0ZSB0aGUgZGlzdHJpYnV0aW9uLiBBcnJhbmdlIHlvdXIgZmlsZXMgaW4NCi10aGUgZm9sbG93aW5nIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgKHNlZSBDb2RlIExpc3RpbmcgMTMpLjwvcD4NCi08aDM+PGI+Q29kZSBMaXN0aW5nIDEzLSBDcmVhdGUgdGhlIERpcmVjdG9yeSBTdHJ1Y3R1cmUgZm9yIHRoZQ0KLURpc3RyaWJ1dGlvbjwvYj48L2gzPg0KLTxwcmU+DQotIC0gU2FtcGxlU2VydmljZQ0KLSAgIC0gTUVUQS1JTkYNCi0gICAgIC0gc2VydmljZXMueG1sDQotICAgLSBvcmcNCi0gICAgIC0gYXBhY2hlDQotICAgICAgIC0gYXhpczINCi0gICAgICAgICAtIGF4aXMydXNlcmd1aWRlDQotICAgICAgICAgICAtIFNhbXBsZVNlcnZpY2UuY2xhc3MNCi08L3ByZT4NCi08cD5GaW5hbGx5LCBkZXBsb3kgdGhlIHNlcnZpY2UgYnkgY29weWluZyB0aGUgU2FtcGxlU2VydmljZQ0KLWRpcmVjdG9yeSB0byB0aGUgd2ViYXBwcy9heGlzMi9XRUItSU5GL3NlcnZpY2VzIGRpcmVjdG9yeSBvbiB0aGUNCi1zZXJ2bGV0IGVuZ2luZS4gWW91IGNhbiBjaGVjayB0byBtYWtlIHN1cmUgdGhhdCBpdCdzIGJlZW4gcHJvcGVybHkNCi1kZXBsb3llZCBieSBjaGVja2luZyA8YSBocmVmPQ0KLSJodHRwOi8vJTNDaG9zdCUzRTolM0Nwb3J0JTNFL2F4aXMyL3NlcnZpY2VzL2xpc3RTZXJ2aWNlcyI+aHR0cDovLyZsdDtob3N0Jmd0OzombHQ7cG9ydCZndDsvYXhpczIvc2VydmljZXMvbGlzdFNlcnZpY2VzPC9hPi48L3A+DQotPGEgbmFtZT0iZGVwbG95cnVuIiBpZD0iZGVwbG95cnVuIj48L2E+DQotPGgyPkRlcGxveWluZyBhbmQgUnVubmluZyBhbiBBeGlzMiBTZXJ2aWNlIENyZWF0ZWQgZnJvbSBXU0RMPC9oMj4NCi08cD5JZiB5b3UgaGF2ZSBhIFdTREwgZmlsZSwgeW91IGNhbiBlYXNpbHkgY3JlYXRlIGFuZCBkZXBsb3kgYQ0KLXNlcnZpY2UgYmFzZWQgb24gdGhhdCBkZXNjcmlwdGlvbi4gRm9yIGV4YW1wbGUsIHRvIGNyZWF0ZSBhIHNlcnZpY2UNCi1iYXNlZCBvbiB0aGUgc2FtZSBXU0RMIGZpbGUgdXNlZCBpbiB0aGUgPGEgaHJlZj0NCi0idXNlcmd1aWRlLWNyZWF0aW5nY2xpZW50cy5odG1sIj5jbGllbnRzIHNlY3Rpb248L2E+IG9mIHRoaXMNCi1kb2N1bWVudCwgeW91IHdpbGwgZm9sbG93IHRoZSBzdGVwcyBiZWxvdy48L3A+DQotPHA+PGI+VGhlIHNob3J0IHN0b3J5OjwvYj48L3A+DQotPG9sPg0KLTxsaT48YSBocmVmPQ0KLSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi9kb3dubG9hZC9AYXhpczJfdmVyc2lvbl9kaXJAL2Rvd25sb2FkLmNnaSNzdGQtYmluIj4NCi1Eb3dubG9hZDwvYT4gdGhlIEF4aXMyIHN0YW5kYXJkIGRpc3RyaWJ1dGlvbiwgaWYgeW91IGhhdmUgbm90IGRvbmUNCi1zbyBhbHJlYWR5LjwvbGk+DQotPGxpPkdlbmVyYXRlIHRoZSBza2VsZXRvbiB1c2luZyB0aGUgV1NETDJKYXZhIHV0aWxpdHksIGFzIGluOjxiciAvPg0KLTxwcmU+DQotamF2YSBvcmcuYXBhY2hlLmF4aXMyLndzZGwuV1NETDJKYXZhIC11cmkgZmlsZTovLy9DOi9hcHBzL2F4aXMyL3NhbXBsZXMvelNhbXBsZS9BeGlzMlVzZXJHdWlkZS53c2RsIC1wIG9yZy5hcGFjaGUuYXhpczIuYXhpczJ1c2VyZ3VpZGUgLWQgYWRiIC1zIC13diAxLjEgLXNzIC1zZCAtc3NpDQotPC9wcmU+PC9saT4NCi08bGk+T3BlbiB0aGUgKlNrZWxldG9uLmphdmEgZmlsZSBhbmQgYWRkIHRoZSBmdW5jdGlvbmFsaXR5IG9mIHlvdXINCi1zZXJ2aWNlIHRvIHRoZSBnZW5lcmF0ZWQgbWV0aG9kcy48L2xpPg0KLTxsaT5CdWlsZCBhIHNlcnZpY2UgdXNpbmcgQW50IGJ5IHR5cGluZyBhbnQgamFyLnNlcnZlcjwvbGk+DQotPGxpPkRlcGxveSB0aGUgc2VydmljZSBieSBjb3B5aW5nIHRoZSBidWlsZC9saWIvKi5hYXIgZmlsZSB0bw0KLSZsdDtKMkVFX0hPTUUmZ3Q7L3dlYmFwcHMvYXhpczIvV0VCLUlORi9zZXJ2aWNlczwvbGk+DQotPGxpPkNoZWNrDQotaHR0cDovLyZsdDtzZXJ2ZXImZ3Q7OiZsdDtwb3J0Jmd0Oy9heGlzMi9zZXJ2aWNlcy9saXN0U2VydmljZXMgdG8NCi1tYWtlIHN1cmUgdGhlIHNlcnZpY2UgaGFzIGJlZW4gcHJvcGVybHkgZGVwbG95ZWQuPC9saT4NCi08L29sPg0KLTxwPjxiPlRoZSBsb25nIHN0b3J5OjwvYj48L3A+DQotPHA+QXMgd2l0aCBnZW5lcmF0aW5nIGNsaWVudHMsIHlvdSB3aWxsIG5lZWQgdGhlIDxhIGhyZWY9DQotImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL2Rvd25sb2FkL0BheGlzMl92ZXJzaW9uX2RpckAvZG93bmxvYWQuY2dpI3N0ZC1iaW4iPg0KLUF4aXMyIFN0YW5kYXJkIERpc3RyaWJ1dGlvbjwvYT4sIGJlY2F1c2UgdGhlIDxhIGhyZWY9DQotImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL2Rvd25sb2FkL0BheGlzMl92ZXJzaW9uX2RpckAvZG93bmxvYWQuY2dpI3dhciI+DQotQXhpczIgV0FSIERpc3RyaWJ1dGlvbjwvYT4gZG9lcyBub3QgaW5jbHVkZSB0aGUgV1NETDJKYXZhIHV0aWxpdHkuDQotT25jZSB5b3UndmUgZ290IGl0IGRvd25sb2FkZWQgYW5kIHVucGFja2VkLCBtYWtlIHN1cmUgdGhhdCB5b3Ugc2V0DQotdGhlIEFYSVMyX0hPTUUgdmFyaWFibGUgdG8gcG9pbnQgdG8gdGhlIGxvY2F0aW9uIGluIHdoaWNoIHlvdSd2ZQ0KLXVucGFja2VkIGl0LjwvcD4NCi08cD5Ob3cgeW91IGFyZSByZWFkeSB0byBnZW5lcmF0ZSB0aGUgYWN0dWFsIHNlcnZpY2UuIFRvIGtlZXAgdGhpbmdzDQotbmVhdCwgY3JlYXRlIGEgbmV3IGRpcmVjdG9yeSBhbmQgY2hhbmdlIHRvIGl0LiBUaGUgV1NETCBmaWxlIGlzIHRoZQ0KLXNhbWUgb25lIHJlZmVyZW5jZWQgaW4gPGEgaHJlZj0NCi0idXNlcmd1aWRlLWNyZWF0aW5nY2xpZW50cyNnZW5lcmF0aW5nLnhodG1sIj5HZW5lcmF0aW5nIENsaWVudHM8L2E+DQotYW5kIGluY2x1ZGVzIGZvdXIgb3BlcmF0aW9uczogTm9QYXJhbWV0ZXJzLCBUd29XYXlPbmVQYXJhbWV0ZXJFY2hvLA0KLU11bHRpcGxlUGFyYW1ldGVyc0FkZEl0ZW0sIGFuZCBEb0luT25seS4gVG8gZ2VuZXJhdGUgdGhlIHNlcnZpY2UsDQotdXNlIHRoZSBXU0RMMkphdmEgdXRpbGl0eSwgYXMgaW4gQ29kZSBMaXN0aW5nIDE0LjwvcD4NCi08aDM+Q29kZSBMaXN0aW5nIDE0IC0gVXNpbmcgdGhlIFdTREwySmF2YSBVdGlsaXR5IHRvIEdlbmVyYXRlIHRoZQ0KLVNlcnZpY2U8L2gzPg0KLTxwPjxzdHJvbmc+Q29kZSBMaXN0aW5nIDE0LjE6PC9zdHJvbmc+PC9wPg0KLTxwcmU+DQotamF2YSBvcmcuYXBhY2hlLmF4aXMyLndzZGwuV1NETDJKYXZhIC11cmkgDQotZmlsZTovLy9DOi9hcHBzL2F4aXMyL3NhbXBsZXMvelNhbXBsZS9BeGlzMlVzZXJHdWlkZS53c2RsIC1wIA0KLW9yZy5hcGFjaGUuYXhpczIuYXhpczJ1c2VyZ3VpZGUgLWQgYWRiIC1zIC13diBAYXhpczJfdmVyc2lvbkAgLXNzIC1zZA0KLTwvcHJlPg0KLTxwPk5vdGU6IE1ha2Ugc3VyZSBhbGwgdGhlIC5qYXIgZmlsZXMgaW4gdGhlIEF4aXMyIGxpYiBkaXJlY3RvcnkgaXMNCi1zZXQgdG8gdGhlIENMQVNTUEFUSCBiZWZvcmUgeW91IHJ1biB0aGUgYWJvdmUgY29kZS48L3A+DQotPHA+VGhpcyBzdGF0ZW1lbnQgdGVsbHMgdGhlIHV0aWxpdHkgeW91IHdhbnQgdG8gY3JlYXRlIGEgc2VydmljZQ0KLW91dCBvZiB0aGUgb3BlcmF0aW9ucyBpbiB0aGUgZmlsZSA8YSBocmVmPQ0KLSJ1c2VyZ3VpZGUtY29kZWxpc3Rpbmc1Lmh0bWwiPkF4aXMyVXNlckd1aWRlLndzZGw8L2E+LCBhbmQgdGhhdCB0aGUNCi1KYXZhIGNsYXNzZXMgZ2VuZXJhdGVkIHNob3VsZCBiZSBpbiB0aGUNCi1vcmcuYXBhY2hlLmF4aXMyLmF4aXMydXNlcmd1aWRlIHBhY2thZ2UgKC1wKS4gKFlvdSBjYW4gdmlldyB0aGUNCi1hcHByb3ByaWF0ZSBkaXJlY3RvcmllcyBjcmVhdGVkLikgSXQgYWxzbyBpbmRpY2F0ZXMgdGhhdCB5b3Ugd2FudA0KLXRvIHVzZSB0aGUgQXhpczIgRGF0YUJpbmRpbmcgRnJhbWV3b3JrLCBvciBBREIgKC1kKSwgdG8gZ2VuZXJhdGUNCi1vbmx5IHN5bmNocm9ub3VzIG9yIGJsb2NraW5nIGNvZGUgKC1zKSwgYW5kIHRvIGdlbmVyYXRlIHNlcnZlci1zaWRlDQotY29kZSAoLXNzKSBhcyBvcHBvc2VkIHRvIGEgY2xpZW50LCBpbmNsdWRpbmcgdGhlIHNlcnZpY2VzLnhtbA0KLXNlcnZpY2UgZGVzY3JpcHRvciBmaWxlICgtc2QpLiBJdCBhbHNvIHNwZWNpZmllcyB2ZXJzaW9uDQotQGF4aXMyX3ZlcnNpb25AIGZvciB0aGUgV1NETCBmaWxlICgtd3YpPHN0cm9uZz4uPC9zdHJvbmc+PC9wPg0KLTxwPjxzdHJvbmc+Q29kZSBMaXN0aW5nIDE0LjI6PC9zdHJvbmc+PC9wPg0KLTxwPllvdSBjYW4gYWxzbyB1c2UgdGhlIGZvbGxvd2luZyBzY3JpcHQgZmlsZXMgdG8gYWNoaWV2ZSB0aGUgc2FtZS4NCi1JbiB0aGlzIGNhc2UgeW91IGRvIG5vdCBoYXZlIHRoZSBzZXQgdGhlIENMQVNTUEFUSCBtYW51YWxseS48L3A+DQotPHA+Rm9yIExpbnV4OjwvcD4NCi08cHJlPg0KLSRBWElTMl9IT01FL2Jpbi93c2RsMmphdmEuc2ggLXVyaSBmaWxlOi8vL0M6L2FwcHMvYXhpczIvc2FtcGxlcy96U2FtcGxlL0F4aXMyVXNlckd1aWRlLndzZGwNCi0tcCBvcmcuYXBhY2hlLmF4aXMyLmF4aXMydXNlcmd1aWRlIC1vIHRhcmdldF9kaXJlY3RvcnlfbmFtZSAtZCBhZGIgLXMgLXd2IEBheGlzMl92ZXJzaW9uQCAtc3MgLXNkDQotPC9wcmU+DQotPHA+Rm9yIE1TIFdpbmRvd3M6PC9wPg0KLTxwcmU+DQotJUFYSVMyX0hPTUUlXGJpblx3c2RsMmphdmEuYmF0IC11cmkgZmlsZTpcXFxDOlxhcHBzXGF4aXMyXHNhbXBsZXNcelNhbXBsZVxBeGlzMlVzZXJHdWlkZS53c2RsDQotLXAgb3JnLmFwYWNoZS5heGlzMi5heGlzMnVzZXJndWlkZSAtbyB0YXJnZXRfZGlyZWN0b3J5X25hbWUgLWQgYWRiIC1zIC13diBAYXhpczJfdmVyc2lvbkAgLXNzIC1zZA0KLTwvcHJlPg0KLTxwPkluIGJvdGggaW5zdGFuY2VzLCBhdCB0aGlzIHBvaW50LCB5b3Ugc2hvdWxkIHNlZSBmb3VyIG5ldyBpdGVtcw0KLWluIHlvdXIgY2hvc2VuIGRpcmVjdG9yeTogdGhlIGJ1aWxkLnhtbCBmaWxlLCB3aGljaCBpbmNsdWRlcw0KLWluc3RydWN0aW9ucyBmb3IgQW50LCB0aGUgc3JjIGRpcmVjdG9yeSwgd2hpY2ggaW5jbHVkZXMgYWxsIHRoZQ0KLWdlbmVyYXRlZCBjbGFzc2VzIGFuZCBzdHVicywgdGhlIHJlc291cmNlcyBkaXJlY3RvcnksIHdoaWNoDQotaW5jbHVkZXMgYSByZWdlbmVyYXRlZCB2ZXJzaW9uIG9mIHRoZSBXU0RMLCBhbmQgdGhlIHNlcnZpY2VzLnhtbA0KLWZpbGUsIHdoaWNoIHVsdGltYXRlbHkgY29udHJvbHMgdGhlIHNlcnZpY2UncyBiZWhhdmlvci48L3A+DQotPHA+WW91IGNhbiBjb21waWxlIHRoZSBzZXJ2aWNlIGF0IHRoaXMgcG9pbnQsIGJ1dCBpdCBkb2Vzbid0DQotYWN0dWFsbHkgZG8gYW55dGhpbmcgeWV0LiBZb3UgY2FuIHNvbHZlIHRoYXQgcHJvYmxlbSBieSBvcGVuaW5nIHRoZQ0KLXNyY1xvcmdcYXBhY2hlXGF4aXMyXGF4aXMydXNlcmd1aWRlXEF4aXMyVXNlckd1aWRlU2VydmljZVNrZWxldG9uLmphdmENCi1maWxlIGFuZCBlaXRoZXIgZWRpdGluZyB0aGUgY29kZSBpbiBib2xkIC0tIG1ha2Ugc3VyZSB5b3UgbWFuYWdlDQotcGFyYW1ldGVyIG51bWJlcnMgLS0gb3IgcmVwbGFjaW5nIGFsbCB0aGUgY29kZSB3aXRoIHRoZSBmb2xsb3dpbmcNCi1pbiBDb2RlIExpc3RpbmcgMTUuPC9wPg0KLTxoMz5Db2RlIExpc3RpbmcgMTUgLSBDb21waWxpbmcgdGhlIFNlcnZpY2U8L2gzPg0KLTxwcmU+DQotLyoqDQotICogQXhpczJVc2VyR3VpZGVTZXJ2aWNlU2tlbGV0b24uamF2YQ0KLSAqDQotICogVGhpcyBmaWxlIHdhcyBhdXRvLWdlbmVyYXRlZCBmcm9tIFdTREwNCi0gKiBieSB0aGUgQXBhY2hlIEF4aXMyIHZlcnNpb246IFNOQVBTSE9UIE9jdCAxNSwgMjAwNiAoMTE6MjM6MTggDQotR01UKzAwOjAwKQ0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5heGlzMnVzZXJndWlkZTsNCi0vKioNCi0gKiAgQXhpczJVc2VyR3VpZGVTZXJ2aWNlU2tlbGV0b24gamF2YSBza2VsZXRvbiBmb3IgdGhlIGF4aXNTZXJ2aWNlDQotICovDQotcHVibGljIGNsYXNzIEF4aXMyVXNlckd1aWRlU2VydmljZVNrZWxldG9uIHsNCi0gICAgIA0KLSAgICAgICAgIA0KLSAgICAvKioNCi0gICAgICogQXV0byBnZW5lcmF0ZWQgbWV0aG9kIHNpZ25hdHVyZQ0KLSAgICAgICAgIA0KLSAgICAgKiBAcGFyYW0gcGFyYW03DQotICAgICAgICAgDQotICAgICovDQotICAgIHB1YmxpYyAgb3JnLmFwYWNoZS5heGlzMi5heGlzMnVzZXJndWlkZS5Ob1BhcmFtZXRlcnNSZXNwb25zZSANCi1Ob1BhcmFtZXRlcnMNCi0gICAgICAgIChvcmcuYXBhY2hlLmF4aXMyLmF4aXMydXNlcmd1aWRlLk5vUGFyYW1ldGVyc1JlcXVlc3QgcGFyYW03KQ0KLSAgICAgICAgIA0KLSAgICB7DQotICAgICAgICA8Yj5TeXN0ZW0ub3V0LnByaW50bG4ocGFyYW03KTsNCi0NCi0gICAgICAgIE5vUGFyYW1ldGVyc1Jlc3BvbnNlIHJlcyA9DQotICAgICAgICAgICAgbmV3IE5vUGFyYW1ldGVyc1Jlc3BvbnNlKCk7DQotDQotICAgICAgICByZXR1cm4gcmVzOzwvYj4NCi0gICAgfQ0KLSAgICAgDQotICAgICAgICAgDQotICAgIC8qKg0KLSAgICAgKiBBdXRvIGdlbmVyYXRlZCBtZXRob2Qgc2lnbmF0dXJlDQotICAgICAgICAgDQotICAgICAqIEBwYXJhbSBwYXJhbTkNCi0gICAgICAgICANCi0gICAgKi8NCi0gICAgcHVibGljICANCi1vcmcuYXBhY2hlLmF4aXMyLmF4aXMydXNlcmd1aWRlLlR3b1dheU9uZVBhcmFtZXRlckVjaG9SZXNwb25zZSANCi1Ud29XYXlPbmVQYXJhbWV0ZXJFY2hvDQotICAgICAgICAoDQotICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5heGlzMnVzZXJndWlkZS5Ud29XYXlPbmVQYXJhbWV0ZXJFY2hvUmVxdWVzdCANCi1wYXJhbTkNCi0gICAgICAgICApDQotICAgICAgICAgDQotICAgIHsNCi0gICAgICAgIDxiPlN5c3RlbS5vdXQucHJpbnRsbihwYXJhbTkuZ2V0RWNob1N0cmluZygpKTsNCi0NCi0gICAgICAgIFR3b1dheU9uZVBhcmFtZXRlckVjaG9SZXNwb25zZSByZXMgPQ0KLSAgICAgICAgICAgIG5ldyBUd29XYXlPbmVQYXJhbWV0ZXJFY2hvUmVzcG9uc2UoKTsNCi0gICAgICAgIA0KLSAgICAgICAgcmVzLnNldEVjaG9TdHJpbmcocGFyYW05LmdldEVjaG9TdHJpbmcoKSk7DQotDQotICAgICAgICByZXR1cm4gcmVzOzwvYj4NCi0gICAgfQ0KLSAgICAgDQotICAgICAgICAgDQotICAgIC8qKg0KLSAgICAgKiBBdXRvIGdlbmVyYXRlZCBtZXRob2Qgc2lnbmF0dXJlDQotICAgICAgICAgDQotICAgICAqIEBwYXJhbSBwYXJhbTExDQotICAgICAgICAgDQotICAgICovDQotICAgIHB1YmxpYyAgdm9pZCBEb0luT25seQ0KLSAgICAgICAgKA0KLSAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuYXhpczJ1c2VyZ3VpZGUuRG9Jbk9ubHlSZXF1ZXN0IHBhcmFtMTENCi0gICAgICAgICApDQotICAgICAgICAgDQotICAgIHsNCi0gICAgICAgIDxiPlN5c3RlbS5vdXQucHJpbnRsbihwYXJhbTExLmdldE1lc3NhZ2VTdHJpbmcoKSk7PC9iPg0KLSAgICB9DQotICAgICANCi0gICAgICAgICANCi0gICAgLyoqDQotICAgICAqIEF1dG8gZ2VuZXJhdGVkIG1ldGhvZCBzaWduYXR1cmUNCi0gICAgICAgICANCi0gICAgICogQHBhcmFtIHBhcmFtMTINCi0gICAgICAgICANCi0gICAgKi8NCi0gICAgcHVibGljICANCi1vcmcuYXBhY2hlLmF4aXMyLmF4aXMydXNlcmd1aWRlLk11bHRpcGxlUGFyYW1ldGVyc0FkZEl0ZW1SZXNwb25zZSANCi1NdWx0aXBsZVBhcmFtZXRlcnNBZGRJdGVtDQotICAgICAgICAoDQotICAgICAgICAgDQotb3JnLmFwYWNoZS5heGlzMi5heGlzMnVzZXJndWlkZS5NdWx0aXBsZVBhcmFtZXRlcnNBZGRJdGVtUmVxdWVzdCANCi1wYXJhbTEyDQotICAgICAgICAgKQ0KLSAgICAgICAgIA0KLSAgICB7DQotICAgICAgICA8Yj5TeXN0ZW0ub3V0LnByaW50bG4ocGFyYW0xMi5nZXRQcmljZSgpKTsNCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihwYXJhbTEyLmdldEl0ZW1JZCgpKTsNCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihwYXJhbTEyLmdldERlc2NyaXB0aW9uKCkpOw0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHBhcmFtMTIuZ2V0SXRlbU5hbWUoKSk7DQotDQotICAgICAgICBNdWx0aXBsZVBhcmFtZXRlcnNBZGRJdGVtUmVzcG9uc2UgcmVzID0NCi0gICAgICAgICAgICBuZXcgTXVsdGlwbGVQYXJhbWV0ZXJzQWRkSXRlbVJlc3BvbnNlKCk7DQotICAgICAgICANCi0gICAgICAgIHJlcy5zZXRTdWNjZXNzZnVsQWRkKHRydWUpOw0KLSAgICAgICAgcmVzLnNldEl0ZW1JZChwYXJhbTEyLmdldEl0ZW1JZCgpKTsNCi0NCi0gICAgICAgIHJldHVybiByZXM7PC9iPg0KLSAgICB9DQotICAgICANCi19DQotPC9wcmU+DQotPHA+QXMgd2l0aCBnZW5lcmF0aW5nIGNsaWVudHMsIGFsbCB0aGVzZSBjbGFzc2VzLCBzdWNoIGFzDQotTXVsdGlwbGVQYXJhbWV0ZXJzQWRkSXRlbVJlcXVlc3QgYW5kDQotVHdvV2F5T25lUGFyYW1ldGVyRWNob1Jlc3BvbnNlLCBhcmUgZ2VuZXJhdGVkIGJ5IHRoZSB1dGlsaXR5LCBhbmQNCi1jYW4gYmUgZm91bmQgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHRoZSBza2VsZXRvbiBmaWxlLiBUaGV5DQotaW5jbHVkZSBtZXRob2RzIHN1Y2ggYXMgc2V0U3VjY2Vzc2Z1bEFkZCgpLCB3aGljaCBzZXRzIHRoZSB2YWx1ZSBvZg0KLXRoZSBjb250ZW50IG9mIGFuIGVsZW1lbnQgaW4gdGhlIHJlc3BvbnNlLCBhbmQgZ2V0SXRlbU5hbWUoKSwgd2hpY2gNCi1yZXRyaWV2ZXMgdGhlIGNvbnRlbnQgb2YgZWxlbWVudHMgaW4gdGhlIHJlcXVlc3QuPC9wPg0KLTxwPlNhdmUgdGhlIGZpbGUgYW5kIGNvbXBpbGUgaXQgYnkgdHlwaW5nOiBhbnQgamFyLnNlcnZlcjwvcD4NCi08cD5JZiBhbGwgZ29lcyB3ZWxsLCB5b3Ugc2hvdWxkIHNlZSB0aGUgQlVJTEQgU1VDQ0VTU0ZVTCBtZXNzYWdlIGluDQoteW91ciB3aW5kb3csIGFuZCB0aGUgQXhpczJVc2VyR3VpZGVTZXJ2aWNlLmFhciBmaWxlIGluIHRoZSBuZXdseQ0KLWNyZWF0ZWQgYnVpbGQvbGliIGRpcmVjdG9yeS48L3A+DQotPHA+PGltZyBhbHQ9IlRoZSBCVUlMRCBTVUNDRVNTRlVMIG1lc3NhZ2UgaW4geW91ciB3aW5kb3ciIHNyYz0NCi0iaW1hZ2VzL2ZpZzA1LmpwZyIgLz48L3A+DQotPHA+Tm93IHlvdSBuZWVkIHRvIGRlcGxveSB0aGUgc2VydmljZSB0byB0aGUgc2VydmVyLiBUbyBkbyB0aGF0LA0KLWNvcHkgdGhlIEF4aXMyVXNlckd1aWRlU2VydmljZS5hYXIgZmlsZSB0byB0aGUgV0VCLUlORi9zZXJ2aWNlcw0KLWRpcmVjdG9yeSBvZiB0aGUgYXBwbGljYXRpb24gc2VydmVyLiAoWW91IGFsc28gaGF2ZSB0aGUgb3B0aW9uIHRvDQotdXNlIHRoZSBhZG1pbmlzdHJhdGlvbiB0b29scy4gU2VlIHRoZSA8YSBocmVmPQ0KLSJ3ZWJhZG1pbmd1aWRlLmh0bWwiPldlYiBBZG1pbmlzdHJhdG9yJ3MgR3VpZGU8L2E+IGZvciBtb3JlDQotaW5mb3JtYXRpb24uKTwvcD4NCi08cD5UbyB2ZXJpZnkgdGhhdCB0aGUgc2VydmljZSBoYXMgYmVlbiBwcm9wZXJseSBkZXBsb3llZCwgY2hlY2sgdGhlDQotbGlzdCBvZiBzZXJ2aWNlcyBhdCA8YSBocmVmPQ0KLSJodHRwOi8vJTNDaG9zdCUzRTolM0Nwb3J0JTNFL2F4aXMyL3NlcnZpY2VzL2xpc3RTZXJ2aWNlcyI+aHR0cDovLyZsdDtob3N0Jmd0OzombHQ7cG9ydCZndDsvYXhpczIvc2VydmljZXMvbGlzdFNlcnZpY2VzPC9hPi48L3A+DQotPHA+PGltZyBhbHQ9IkNoZWNraW5nIHRoZSBsaXN0IG9mIHNlcnZpY2VzIiBzcmM9DQotImltYWdlcy9maWcwNi5qcGciIC8+PC9wPg0KLTxwPk5vdyB5b3Ugc2hvdWxkIGJlIGFibGUgdG8gYWNjZXNzIHRoZSBzZXJ2aWNlIHVzaW5nIGFueSBvZiB0aGUNCi1jbGllbnRzIGJ1aWx0IGluIHRoZSA8YSBocmVmPQ0KLSJ1c2VyZ3VpZGUtY3JlYXRpbmdjbGllbnRzLmh0bWwjZ2VuZXJhdGluZyI+R2VuZXJhdGluZyBDbGllbnRzPC9hPg0KLWRvY3VtZW50LjwvcD4NCi08cD48c3Ryb25nPlNlZSBOZXh0IFNlY3Rpb248L3N0cm9uZz4tIDxhIGhyZWY9DQotInVzZXJndWlkZS1zYW1wbGVzLmh0bWwiPlNhbXBsZXM8L2E+PC9wPg0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL3VzZXJndWlkZS1jb2RlbGlzdGluZzUueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL3VzZXJndWlkZS1jb2RlbGlzdGluZzUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTU2MmNjLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC91c2VyZ3VpZGUtY29kZWxpc3Rpbmc1LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLQ0KLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iDQotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4NCi08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+DQotPGhlYWQ+DQotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PQ0KLSJIVE1MIFRpZHkgZm9yIFdpbmRvd3MgKHZlcnMgMTQgSnVuZSAyMDA3KSwgc2VlIHd3dy53My5vcmciIC8+DQotPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSIiIC8+DQotPHRpdGxlPkNvZGUgTGlzdGluZyA0OiBHZW5lcmF0aW5nIGNsaWVudHMgZnJvbSB0aGUgV1NETA0KLWZpbGU8L3RpdGxlPg0KLTxsaW5rIGhyZWY9Ii4uL2Nzcy9heGlzLWRvY3MuY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIg0KLW1lZGlhPSJhbGwiIC8+DQotPC9oZWFkPg0KLTxib2R5Pg0KLTxoMT5Db2RlIExpc3RpbmcgNSAtIEdlbmVyYXRpbmcgQ2xpZW50cyBmcm9tIHRoZSBXU0RMIEZpbGU8L2gxPg0KLTxwcmU+DQotJmx0Oz94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPyZndDsNCi0mbHQ7d3NkbDpkZWZpbml0aW9ucw0KLSAgIHhtbG5zOmFwYWNoZXNvYXA9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94bWwtc29hcCINCi0gICB4bWxuczppbXBsPSJodHRwOi8vYXBhY2hlLm9yZy9heGlzMi9BeGlzMlVzZXJHdWlkZSINCi0gICB4bWxuczppbnRmPSJodHRwOi8vYXBhY2hlLm9yZy9heGlzMi9BeGlzMlVzZXJHdWlkZSINCi0gICB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyINCi0gICB4bWxuczp3c2Rsc29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyINCi0gICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIg0KLSAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2FwYWNoZS5vcmcvYXhpczIvQXhpczJVc2VyR3VpZGUiJmd0Ow0KLQ0KLSAgJmx0O3dzZGw6dHlwZXMmZ3Q7DQotICAgICZsdDtzY2hlbWENCi0gICAgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiDQotICAgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2FwYWNoZS5vcmcvYXhpczIvQXhpczJVc2VyR3VpZGUiDQotICAgICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSImZ3Q7DQotICAgICAgDQotICAgICAgJmx0OyEtLSBFTEVNRU5UUyAtLSZndDsNCi0gICAgICANCi0gICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJEb0luT25seVJlcXVlc3QiJmd0Ow0KLSAgICAgICAgJmx0O2NvbXBsZXhUeXBlJmd0Ow0KLSAgICAgICAgICAmbHQ7c2VxdWVuY2UmZ3Q7DQotICAgICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0ibWVzc2FnZVN0cmluZyIgdHlwZT0ieHNkOnN0cmluZyIvJmd0Ow0KLSAgICAgICAgICAmbHQ7L3NlcXVlbmNlJmd0Ow0KLSAgICAgICAgJmx0Oy9jb21wbGV4VHlwZSZndDsNCi0gICAgICAmbHQ7L2VsZW1lbnQmZ3Q7DQotICAgICAgDQotICAgICAgJmx0O2VsZW1lbnQgbmFtZT0iVHdvV2F5T25lUGFyYW1ldGVyRWNob1JlcXVlc3QiJmd0Ow0KLSAgICAgICAgJmx0O2NvbXBsZXhUeXBlJmd0Ow0KLSAgICAgICAgICAmbHQ7c2VxdWVuY2UmZ3Q7DQotICAgICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0iZWNob1N0cmluZyIgdHlwZT0ieHNkOnN0cmluZyIvJmd0Ow0KLSAgICAgICAgICAmbHQ7L3NlcXVlbmNlJmd0Ow0KLSAgICAgICAgJmx0Oy9jb21wbGV4VHlwZSZndDsNCi0gICAgICAmbHQ7L2VsZW1lbnQmZ3Q7DQotICAgICAgJmx0O2VsZW1lbnQgbmFtZT0iVHdvV2F5T25lUGFyYW1ldGVyRWNob1Jlc3BvbnNlIiZndDsNCi0gICAgICAgICZsdDtjb21wbGV4VHlwZSZndDsNCi0gICAgICAgICAgJmx0O3NlcXVlbmNlJmd0Ow0KLSAgICAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9ImVjaG9TdHJpbmciIHR5cGU9InhzZDpzdHJpbmciLyZndDsNCi0gICAgICAgICAgJmx0Oy9zZXF1ZW5jZSZndDsNCi0gICAgICAgICZsdDsvY29tcGxleFR5cGUmZ3Q7DQotICAgICAgJmx0Oy9lbGVtZW50Jmd0Ow0KLSAgICAgIA0KLSAgICAgICZsdDtlbGVtZW50IG5hbWU9Ik5vUGFyYW1ldGVyc1JlcXVlc3QiJmd0Ow0KLSAgICAgICAgJmx0O2NvbXBsZXhUeXBlLyZndDsNCi0gICAgICAmbHQ7L2VsZW1lbnQmZ3Q7DQotICAgICAgJmx0O2VsZW1lbnQgbmFtZT0iTm9QYXJhbWV0ZXJzUmVzcG9uc2UiJmd0Ow0KLSAgICAgICAgJmx0O2NvbXBsZXhUeXBlLyZndDsNCi0gICAgICAmbHQ7L2VsZW1lbnQmZ3Q7DQotICAgICAgDQotICAgICAgJmx0O2VsZW1lbnQgbmFtZT0iTXVsdGlwbGVQYXJhbWV0ZXJzQWRkSXRlbVJlcXVlc3QiJmd0Ow0KLSAgICAgICAgJmx0O2NvbXBsZXhUeXBlJmd0Ow0KLSAgICAgICAgICAmbHQ7c2VxdWVuY2UmZ3Q7DQotICAgICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0iaXRlbUlkIiB0eXBlPSJ4c2Q6aW50Ii8mZ3Q7DQotICAgICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0iaXRlbU5hbWUiIHR5cGU9InhzZDpzdHJpbmciLyZndDsNCi0gICAgICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJwcmljZSIgdHlwZT0ieHNkOmZsb2F0Ii8mZ3Q7DQotICAgICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciLyZndDsNCi0gICAgICAgICAgJmx0Oy9zZXF1ZW5jZSZndDsNCi0gICAgICAgICZsdDsvY29tcGxleFR5cGUmZ3Q7DQotICAgICAgJmx0Oy9lbGVtZW50Jmd0Ow0KLQ0KLSAgICAgICZsdDtlbGVtZW50IG5hbWU9Ik11bHRpcGxlUGFyYW1ldGVyc0FkZEl0ZW1SZXNwb25zZSImZ3Q7DQotICAgICAgICAmbHQ7Y29tcGxleFR5cGUmZ3Q7DQotICAgICAgICAgICZsdDtzZXF1ZW5jZSZndDsNCi0gICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0iaXRlbUlkIiB0eXBlPSJ4c2Q6aW50Ii8mZ3Q7DQotICAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9InN1Y2Nlc3NmdWxBZGQiIHR5cGU9InhzZDpib29sZWFuIi8mZ3Q7DQotICAgICAgICAgICZsdDsvc2VxdWVuY2UmZ3Q7DQotICAgICAgICAmbHQ7L2NvbXBsZXhUeXBlJmd0Ow0KLSAgICAgICZsdDsvZWxlbWVudCZndDsNCi0NCi0gICAgJmx0Oy9zY2hlbWEmZ3Q7DQotICAmbHQ7L3dzZGw6dHlwZXMmZ3Q7DQotDQotICANCi0gICZsdDshLS0gTUVTU0FHRVMgLS0mZ3Q7DQotDQotICAmbHQ7d3NkbDptZXNzYWdlIG5hbWU9IkRvSW5Pbmx5UmVxdWVzdE1lc3NhZ2UiJmd0Ow0KLSAgICAmbHQ7d3NkbDpwYXJ0IG5hbWU9ImlucHV0IiBlbGVtZW50PSJpbXBsOkRvSW5Pbmx5UmVxdWVzdCIvJmd0Ow0KLSAgJmx0Oy93c2RsOm1lc3NhZ2UmZ3Q7DQotDQotICAmbHQ7d3NkbDptZXNzYWdlIG5hbWU9IlR3b1dheU9uZVBhcmFtZXRlckVjaG9SZXF1ZXN0TWVzc2FnZSImZ3Q7DQotICAgICZsdDt3c2RsOnBhcnQgbmFtZT0iaW5wdXQiIGVsZW1lbnQ9ImltcGw6VHdvV2F5T25lUGFyYW1ldGVyRWNob1JlcXVlc3QiLyZndDsNCi0gICZsdDsvd3NkbDptZXNzYWdlJmd0Ow0KLSAgJmx0O3dzZGw6bWVzc2FnZSBuYW1lPSJUd29XYXlPbmVQYXJhbWV0ZXJFY2hvUmVzcG9uc2VNZXNzYWdlIiZndDsNCi0gICAgJmx0O3dzZGw6cGFydCBuYW1lPSJvdXRwdXQiIGVsZW1lbnQ9ImltcGw6VHdvV2F5T25lUGFyYW1ldGVyRWNob1Jlc3BvbnNlIi8mZ3Q7DQotICAmbHQ7L3dzZGw6bWVzc2FnZSZndDsNCi0NCi0gICZsdDt3c2RsOm1lc3NhZ2UgbmFtZT0iTm9QYXJhbWV0ZXJzUmVxdWVzdE1lc3NhZ2UiJmd0Ow0KLSAgICAmbHQ7d3NkbDpwYXJ0IG5hbWU9ImlucHV0IiBlbGVtZW50PSJpbXBsOk5vUGFyYW1ldGVyc1JlcXVlc3QiLyZndDsNCi0gICZsdDsvd3NkbDptZXNzYWdlJmd0Ow0KLSAgJmx0O3dzZGw6bWVzc2FnZSBuYW1lPSJOb1BhcmFtZXRlcnNSZXNwb25zZU1lc3NhZ2UiJmd0Ow0KLSAgICAmbHQ7d3NkbDpwYXJ0IG5hbWU9Im91dHB1dCIgZWxlbWVudD0iaW1wbDpOb1BhcmFtZXRlcnNSZXNwb25zZSIvJmd0Ow0KLSAgJmx0Oy93c2RsOm1lc3NhZ2UmZ3Q7DQotDQotICAmbHQ7d3NkbDptZXNzYWdlIG5hbWU9Ik11bHRpcGxlUGFyYW1ldGVyc0FkZEl0ZW1SZXF1ZXN0TWVzc2FnZSImZ3Q7DQotICAgICZsdDt3c2RsOnBhcnQgbmFtZT0iaW5wdXQiIGVsZW1lbnQ9ImltcGw6TXVsdGlwbGVQYXJhbWV0ZXJzQWRkSXRlbVJlcXVlc3QiLyZndDsNCi0gICZsdDsvd3NkbDptZXNzYWdlJmd0Ow0KLSAgJmx0O3dzZGw6bWVzc2FnZSBuYW1lPSJNdWx0aXBsZVBhcmFtZXRlcnNBZGRJdGVtUmVzcG9uc2VNZXNzYWdlIiZndDsNCi0gICAgJmx0O3dzZGw6cGFydCBuYW1lPSJvdXRwdXQiIGVsZW1lbnQ9ImltcGw6TXVsdGlwbGVQYXJhbWV0ZXJzQWRkSXRlbVJlc3BvbnNlIi8mZ3Q7DQotICAmbHQ7L3dzZGw6bWVzc2FnZSZndDsNCi0NCi0NCi0gICZsdDshLS0gUG9ydCB0eXBlIChvcGVyYXRpb25zKSAtLSZndDsNCi0NCi0gICZsdDt3c2RsOnBvcnRUeXBlIG5hbWU9IkF4aXMyVXNlckd1aWRlUG9ydFR5cGUiJmd0Ow0KLQ0KLSAgICAmbHQ7d3NkbDpvcGVyYXRpb24gbmFtZT0iRG9Jbk9ubHkiIHBhcmFtZXRlck9yZGVyPSJpbnB1dCImZ3Q7DQotICAgICAgJmx0O3dzZGw6aW5wdXQgbmFtZT0iRG9Jbk9ubHlSZXF1ZXN0TWVzc2FnZSINCi0gICAgICAgICAgICAgICAgICBtZXNzYWdlPSJpbXBsOkRvSW5Pbmx5UmVxdWVzdE1lc3NhZ2UiLyZndDsNCi0gICAgJmx0Oy93c2RsOm9wZXJhdGlvbiZndDsNCi0NCi0gICAgJmx0O3dzZGw6b3BlcmF0aW9uIG5hbWU9IlR3b1dheU9uZVBhcmFtZXRlckVjaG8iIHBhcmFtZXRlck9yZGVyPSJpbnB1dCImZ3Q7DQotICAgICAgJmx0O3dzZGw6aW5wdXQgbmFtZT0iVHdvV2F5T25lUGFyYW1ldGVyRWNob1JlcXVlc3RNZXNzYWdlIg0KLSAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9ImltcGw6VHdvV2F5T25lUGFyYW1ldGVyRWNob1JlcXVlc3RNZXNzYWdlIi8mZ3Q7DQotICAgICAgJmx0O3dzZGw6b3V0cHV0IG5hbWU9IlR3b1dheU9uZVBhcmFtZXRlckVjaG9SZXNwb25zZU1lc3NhZ2UiDQotICAgICAgICAgICAgICAgICAgbWVzc2FnZT0iaW1wbDpUd29XYXlPbmVQYXJhbWV0ZXJFY2hvUmVzcG9uc2VNZXNzYWdlIi8mZ3Q7DQotICAgICZsdDsvd3NkbDpvcGVyYXRpb24mZ3Q7DQotDQotICAgICZsdDt3c2RsOm9wZXJhdGlvbiBuYW1lPSJOb1BhcmFtZXRlcnMiIHBhcmFtZXRlck9yZGVyPSJpbnB1dCImZ3Q7DQotICAgICAgJmx0O3dzZGw6aW5wdXQgbmFtZT0iTm9QYXJhbWV0ZXJzUmVxdWVzdE1lc3NhZ2UiDQotICAgICAgICAgICAgICAgICAgbWVzc2FnZT0iaW1wbDpOb1BhcmFtZXRlcnNSZXF1ZXN0TWVzc2FnZSIvJmd0Ow0KLSAgICAgICZsdDt3c2RsOm91dHB1dCBuYW1lPSJOb1BhcmFtZXRlcnNSZXNwb25zZU1lc3NhZ2UiDQotICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9ImltcGw6Tm9QYXJhbWV0ZXJzUmVzcG9uc2VNZXNzYWdlIi8mZ3Q7DQotICAgICZsdDsvd3NkbDpvcGVyYXRpb24mZ3Q7DQotDQotICAgICZsdDt3c2RsOm9wZXJhdGlvbiBuYW1lPSJNdWx0aXBsZVBhcmFtZXRlcnNBZGRJdGVtIiBwYXJhbWV0ZXJPcmRlcj0iaW5wdXQiJmd0Ow0KLSAgICAgICZsdDt3c2RsOmlucHV0IG5hbWU9Ik11bHRpcGxlUGFyYW1ldGVyc0FkZEl0ZW1SZXF1ZXN0TWVzc2FnZSINCi0gICAgICAgICAgICAgICAgICBtZXNzYWdlPSJpbXBsOk11bHRpcGxlUGFyYW1ldGVyc0FkZEl0ZW1SZXF1ZXN0TWVzc2FnZSIvJmd0Ow0KLSAgICAgICZsdDt3c2RsOm91dHB1dCBuYW1lPSJNdWx0aXBsZVBhcmFtZXRlcnNBZGRJdGVtUmVzcG9uc2VNZXNzYWdlIg0KLSAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9ImltcGw6TXVsdGlwbGVQYXJhbWV0ZXJzQWRkSXRlbVJlc3BvbnNlTWVzc2FnZSIvJmd0Ow0KLSAgICAmbHQ7L3dzZGw6b3BlcmF0aW9uJmd0Ow0KLQ0KLSAgJmx0Oy93c2RsOnBvcnRUeXBlJmd0Ow0KLQ0KLQ0KLSAgJmx0OyEtLSBCSU5ESU5HIChiaW5kIG9wZXJhdGlvbnMpIC0tJmd0Ow0KLSAgJmx0O3dzZGw6YmluZGluZw0KLSAgICAgbmFtZT0iQXhpczJVc2VyR3VpZGVTb2FwQmluZGluZyINCi0gICAgIHR5cGU9ImltcGw6QXhpczJVc2VyR3VpZGVQb3J0VHlwZSImZ3Q7DQotICAgICZsdDt3c2Rsc29hcDpiaW5kaW5nIHN0eWxlPSJkb2N1bWVudCIgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiLyZndDsNCi0NCi0gICAgJmx0O3dzZGw6b3BlcmF0aW9uIG5hbWU9IkRvSW5Pbmx5IiZndDsNCi0gICAgICAmbHQ7d3NkbHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IkRvSW5Pbmx5Ii8mZ3Q7DQotICAgICAgJmx0O3dzZGw6aW5wdXQmZ3Q7DQotICAgICAgICAmbHQ7d3NkbHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLyZndDsNCi0gICAgICAmbHQ7L3dzZGw6aW5wdXQmZ3Q7DQotICAgICZsdDsvd3NkbDpvcGVyYXRpb24mZ3Q7DQotDQotICAgICZsdDt3c2RsOm9wZXJhdGlvbiBuYW1lPSJUd29XYXlPbmVQYXJhbWV0ZXJFY2hvIiZndDsNCi0gICAgICAmbHQ7d3NkbHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IlR3b1dheU9uZVBhcmFtZXRlckVjaG8iLyZndDsNCi0gICAgICAmbHQ7d3NkbDppbnB1dCZndDsNCi0gICAgICAgICZsdDt3c2Rsc29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvJmd0Ow0KLSAgICAgICZsdDsvd3NkbDppbnB1dCZndDsNCi0gICAgICAmbHQ7d3NkbDpvdXRwdXQmZ3Q7DQotICAgICAgICAmbHQ7d3NkbHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLyZndDsNCi0gICAgICAmbHQ7L3dzZGw6b3V0cHV0Jmd0Ow0KLSAgICAmbHQ7L3dzZGw6b3BlcmF0aW9uJmd0Ow0KLQ0KLSAgICAmbHQ7d3NkbDpvcGVyYXRpb24gbmFtZT0iTm9QYXJhbWV0ZXJzIiZndDsNCi0gICAgICAmbHQ7d3NkbHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Ik5vUGFyYW1ldGVycyIvJmd0Ow0KLSAgICAgICZsdDt3c2RsOmlucHV0Jmd0Ow0KLSAgICAgICAgJmx0O3dzZGxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8mZ3Q7DQotICAgICAgJmx0Oy93c2RsOmlucHV0Jmd0Ow0KLSAgICAgICZsdDt3c2RsOm91dHB1dCZndDsNCi0gICAgICAgICZsdDt3c2Rsc29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvJmd0Ow0KLSAgICAgICZsdDsvd3NkbDpvdXRwdXQmZ3Q7DQotICAgICZsdDsvd3NkbDpvcGVyYXRpb24mZ3Q7DQotDQotICAgICZsdDt3c2RsOm9wZXJhdGlvbiBuYW1lPSJNdWx0aXBsZVBhcmFtZXRlcnNBZGRJdGVtIiZndDsNCi0gICAgICAmbHQ7d3NkbHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Ik11bHRpcGxlUGFyYW1ldGVyc0FkZEl0ZW0iLyZndDsNCi0gICAgICAmbHQ7d3NkbDppbnB1dCZndDsNCi0gICAgICAgICZsdDt3c2Rsc29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvJmd0Ow0KLSAgICAgICZsdDsvd3NkbDppbnB1dCZndDsNCi0gICAgICAmbHQ7d3NkbDpvdXRwdXQmZ3Q7DQotICAgICAgICAmbHQ7d3NkbHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLyZndDsNCi0gICAgICAmbHQ7L3dzZGw6b3V0cHV0Jmd0Ow0KLSAgICAmbHQ7L3dzZGw6b3BlcmF0aW9uJmd0Ow0KLSAgJmx0Oy93c2RsOmJpbmRpbmcmZ3Q7DQotDQotDQotICAmbHQ7IS0tIFNFUlZJQ0UgLS0mZ3Q7DQotDQotICAmbHQ7d3NkbDpzZXJ2aWNlIG5hbWU9IkF4aXMyVXNlckd1aWRlU2VydmljZSImZ3Q7DQotICAgICZsdDt3c2RsOnBvcnQgYmluZGluZz0iaW1wbDpBeGlzMlVzZXJHdWlkZVNvYXBCaW5kaW5nIg0KLSAgICAgICAgICAgICAgIG5hbWU9IkF4aXMyVXNlckd1aWRlIiZndDsNCi0gICAgICAmbHQ7d3NkbHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo4MDgwL2F4aXMyL3NlcnZpY2VzL0F4aXMyVXNlckd1aWRlIi8mZ3Q7DQotICAgICZsdDsvd3NkbDpwb3J0Jmd0Ow0KLSAgJmx0Oy93c2RsOnNlcnZpY2UmZ3Q7DQotJmx0Oy93c2RsOmRlZmluaXRpb25zJmd0Ow0KLTwvcHJlPg0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL3VzZXJndWlkZS1jb2RlbGlzdGluZzcueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL3VzZXJndWlkZS1jb2RlbGlzdGluZzcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTBmODRjLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC91c2VyZ3VpZGUtY29kZWxpc3Rpbmc3LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLQ0KLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iDQotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4NCi08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+DQotPGhlYWQ+DQotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PQ0KLSJIVE1MIFRpZHkgZm9yIFdpbmRvd3MgKHZlcnMgMTQgSnVuZSAyMDA3KSwgc2VlIHd3dy53My5vcmciIC8+DQotPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSIiIC8+DQotPHRpdGxlPkNvZGUgTGlzdGluZyA2OiBDbGllbnQuamF2YTwvdGl0bGU+DQotPGxpbmsgaHJlZj0iLi4vY3NzL2F4aXMtZG9jcy5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiDQotbWVkaWE9ImFsbCIgLz4NCi08L2hlYWQ+DQotPGJvZHk+DQotPGgxPkNvZGUgTGlzdGluZyA3LSBDbGllbnQuamF2YTwvaDE+DQotPHByZT4NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuYXhpczJ1c2VyZ3VpZGU7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYXhpczJ1c2VyZ3VpZGUuQXhpczJVc2VyR3VpZGVTZXJ2aWNlU3R1Yi5Eb0luT25seVJlcXVlc3Q7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYXhpczJ1c2VyZ3VpZGUuQXhpczJVc2VyR3VpZGVTZXJ2aWNlU3R1Yi5Ud29XYXlPbmVQYXJhbWV0ZXJFY2hvUmVxdWVzdDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5heGlzMnVzZXJndWlkZS5BeGlzMlVzZXJHdWlkZVNlcnZpY2VTdHViLk5vUGFyYW1ldGVyc1JlcXVlc3Q7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYXhpczJ1c2VyZ3VpZGUuQXhpczJVc2VyR3VpZGVTZXJ2aWNlU3R1Yi5NdWx0aXBsZVBhcmFtZXRlcnNBZGRJdGVtUmVxdWVzdDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5heGlzMnVzZXJndWlkZS5BeGlzMlVzZXJHdWlkZVNlcnZpY2VTdHViLlR3b1dheU9uZVBhcmFtZXRlckVjaG9SZXNwb25zZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5heGlzMnVzZXJndWlkZS5BeGlzMlVzZXJHdWlkZVNlcnZpY2VTdHViLk5vUGFyYW1ldGVyc1Jlc3BvbnNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmF4aXMydXNlcmd1aWRlLkF4aXMyVXNlckd1aWRlU2VydmljZVN0dWIuTXVsdGlwbGVQYXJhbWV0ZXJzQWRkSXRlbVJlc3BvbnNlOw0KLQ0KLXB1YmxpYyBjbGFzcyBDbGllbnR7DQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKGphdmEubGFuZy5TdHJpbmcgYXJnc1tdKXsNCi0gICAgICAgIHRyeXsNCi0gICAgICAgICAgICBBeGlzMlVzZXJHdWlkZVNlcnZpY2VTdHViIHN0dWIgPQ0KLSAgICAgICAgICAgICAgICBuZXcgQXhpczJVc2VyR3VpZGVTZXJ2aWNlU3R1Yg0KLSAgICAgICAgICAgICAgICAoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9heGlzMi9zZXJ2aWNlcy9BeGlzMlVzZXJHdWlkZVNlcnZpY2UiKTsNCi0NCi0gICAgICAgICAgICBkb0luT25seShzdHViKTsNCi0gICAgICAgICAgICB0d29XYXlPbmVQYXJhbWV0ZXJFY2hvKHN0dWIpOw0KLSAgICAgICAgICAgIG5vUGFyYW1ldGVycyhzdHViKTsNCi0gICAgICAgICAgICBtdWx0aXBsZVBhcmFtZXRlcnMoc3R1Yik7DQotDQotICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKXsNCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG5cblxuIik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgLyogZG8gaW4gb25seSAqLw0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZG9Jbk9ubHkoQXhpczJVc2VyR3VpZGVTZXJ2aWNlU3R1YiBzdHViKXsNCi0gICAgICAgIHRyeXsNCi0gICAgICAgICAgICBEb0luT25seVJlcXVlc3QgcmVxID0gbmV3IERvSW5Pbmx5UmVxdWVzdCgpOw0KLQ0KLSAgICAgICAgICAgIHJlcS5zZXRNZXNzYWdlU3RyaW5nKCJBbiBpbiBvbmx5IHJlcXVlc3QiKTsNCi0NCi0gICAgICAgICAgICBzdHViLkRvSW5Pbmx5KHJlcSk7DQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJkb25lIik7DQotICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKXsNCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG5cblxuIik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgLyogdHdvIHdheSBjYWxsL3JlY2VpdmUgKi8NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHR3b1dheU9uZVBhcmFtZXRlckVjaG8oQXhpczJVc2VyR3VpZGVTZXJ2aWNlU3R1YiBzdHViKXsNCi0gICAgICAgIHRyeXsNCi0gICAgICAgICAgICBUd29XYXlPbmVQYXJhbWV0ZXJFY2hvUmVxdWVzdCByZXEgPSBuZXcgVHdvV2F5T25lUGFyYW1ldGVyRWNob1JlcXVlc3QoKTsNCi0NCi0gICAgICAgICAgICByZXEuc2V0RWNob1N0cmluZygiZWNobyEgLi4uIGVjaG8hIik7DQotDQotICAgICAgICAgICAgVHdvV2F5T25lUGFyYW1ldGVyRWNob1Jlc3BvbnNlIHJlcyA9DQotICAgICAgICAgICAgICAgIHN0dWIuVHdvV2F5T25lUGFyYW1ldGVyRWNobyhyZXEpOw0KLQ0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihyZXMuZ2V0RWNob1N0cmluZygpKTsNCi0gICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpew0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcblxuXG4iKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICAvKiBObyBwYXJhbWV0ZXJzICovDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBub1BhcmFtZXRlcnMoQXhpczJVc2VyR3VpZGVTZXJ2aWNlU3R1YiBzdHViKXsNCi0gICAgICAgIHRyeXsNCi0gICAgICAgICAgICBOb1BhcmFtZXRlcnNSZXF1ZXN0IHJlcSA9IG5ldyBOb1BhcmFtZXRlcnNSZXF1ZXN0KCk7DQotDQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHN0dWIuTm9QYXJhbWV0ZXJzKHJlcSkpOw0KLSAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSl7DQotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxuXG5cbiIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIC8qIG11bHRpcGxlIHBhcmFtZXRlcnMgKi8NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG11bHRpcGxlUGFyYW1ldGVycyhBeGlzMlVzZXJHdWlkZVNlcnZpY2VTdHViIHN0dWIpew0KLSAgICAgICAgdHJ5ew0KLSAgICAgICAgICAgIE11bHRpcGxlUGFyYW1ldGVyc0FkZEl0ZW1SZXF1ZXN0IHJlcSA9DQotICAgICAgICAgICAgICAgIG5ldyBNdWx0aXBsZVBhcmFtZXRlcnNBZGRJdGVtUmVxdWVzdCgpOw0KLQ0KLSAgICAgICAgICAgIHJlcS5zZXRQcmljZSgoZmxvYXQpMS45OSk7DQotICAgICAgICAgICAgcmVxLnNldEl0ZW1JZCgoaW50KTIzODcyOTgzKTsNCi0gICAgICAgICAgICByZXEuc2V0RGVzY3JpcHRpb24oIk11c3QgaGF2ZSBmb3IgY29va2luZyIpOw0KLSAgICAgICAgICAgIHJlcS5zZXRJdGVtTmFtZSgiZmxvdXIiKTsNCi0NCi0gICAgICAgICAgICBNdWx0aXBsZVBhcmFtZXRlcnNBZGRJdGVtUmVzcG9uc2UgcmVzID0NCi0gICAgICAgICAgICAgICAgc3R1Yi5NdWx0aXBsZVBhcmFtZXRlcnNBZGRJdGVtKHJlcSk7DQotDQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHJlcy5nZXRTdWNjZXNzZnVsQWRkKCkpOw0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihyZXMuZ2V0SXRlbUlkKCkpOw0KLSAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSl7DQotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxuXG5cbiIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KLTwvcHJlPg0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL3VzZXJndWlkZS1jcmVhdGluZ2NsaWVudHMtamlieC54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvdXNlcmd1aWRlLWNyZWF0aW5nY2xpZW50cy1qaWJ4LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTE2OTcwOS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvdXNlcmd1aWRlLWNyZWF0aW5nY2xpZW50cy1qaWJ4LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUwOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLQ0KLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iDQotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4NCi08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+DQotPGhlYWQ+DQotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PQ0KLSJIVE1MIFRpZHkgZm9yIFdpbmRvd3MgKHZlcnMgMTQgSnVuZSAyMDA3KSwgc2VlIHd3dy53My5vcmciIC8+DQotPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSIiIC8+DQotPHRpdGxlPkdlbmVyYXRpbmcgYSBXZWIgU2VydmljZSBDbGllbnQgdXNpbmcgQXhpczIgYW5kIEppQlg8L3RpdGxlPg0KLTxsaW5rIGhyZWY9Ii4uL2Nzcy9heGlzLWRvY3MuY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIg0KLW1lZGlhPSJhbGwiIC8+DQotPC9oZWFkPg0KLTxib2R5Pg0KLTxoMSBjbGFzcz0idGl0bGUiPkdlbmVyYXRpbmcgYSBXZWIgU2VydmljZSBDbGllbnQgdXNpbmcgQXhpczIgYW5kDQotSmlCWDwvaDE+DQotPHA+VGhpcyBkb2N1bWVudCBleHBsYWlucyBob3cgdG8gZ2VuZXJhdGUgYSBXZWIgc2VydmljZSBjbGllbnQNCi11c2luZyBBeGlzMiBhbmQgSmlCWCBkYXRhIGJpbmRpbmcuIFRoZSBzZXJ2aWNlIGhhcyB0aGUgZm9sbG93aW5nDQotV1NETDo8L3A+DQotPHA+PGI+Q29kZSBMaXN0aW5nIDE6IFRoZSBXU0RMIGZpbGU8L2I+PC9wPg0KLTxwcmU+DQotJmx0Oz94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPyZndDsNCi0mbHQ7d3NkbDpkZWZpbml0aW9ucw0KLSAgIHhtbG5zOmFwYWNoZXNvYXA9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94bWwtc29hcCINCi0gICB4bWxuczppbXBsPSJodHRwOi8vYXBhY2hlLm9yZy9heGlzMi9BeGlzMlVzZXJHdWlkZSINCi0gICB4bWxuczppbnRmPSJodHRwOi8vYXBhY2hlLm9yZy9heGlzMi9BeGlzMlVzZXJHdWlkZSINCi0gICB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyINCi0gICB4bWxuczp3c2Rsc29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyINCi0gICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIg0KLSAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2FwYWNoZS5vcmcvYXhpczIvQXhpczJVc2VyR3VpZGUiJmd0Ow0KLQ0KLSAgJmx0O3dzZGw6dHlwZXMmZ3Q7DQotICAgICZsdDtzY2hlbWENCi0gICAgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiDQotICAgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2FwYWNoZS5vcmcvYXhpczIvQXhpczJVc2VyR3VpZGUiDQotICAgICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSImZ3Q7DQotICAgICAgDQotICAgICAgJmx0OyEtLSBFTEVNRU5UUyAtLSZndDsNCi0gICAgICANCi0gICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJEb0luT25seVJlcXVlc3QiJmd0Ow0KLSAgICAgICAgJmx0O2NvbXBsZXhUeXBlJmd0Ow0KLSAgICAgICAgICAmbHQ7c2VxdWVuY2UmZ3Q7DQotICAgICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0ibWVzc2FnZVN0cmluZyIgdHlwZT0ieHNkOnN0cmluZyIvJmd0Ow0KLSAgICAgICAgICAmbHQ7L3NlcXVlbmNlJmd0Ow0KLSAgICAgICAgJmx0Oy9jb21wbGV4VHlwZSZndDsNCi0gICAgICAmbHQ7L2VsZW1lbnQmZ3Q7DQotICAgICAgDQotICAgICAgJmx0O2VsZW1lbnQgbmFtZT0iVHdvV2F5T25lUGFyYW1ldGVyRWNob1JlcXVlc3QiJmd0Ow0KLSAgICAgICAgJmx0O2NvbXBsZXhUeXBlJmd0Ow0KLSAgICAgICAgICAmbHQ7c2VxdWVuY2UmZ3Q7DQotICAgICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0iZWNob1N0cmluZyIgdHlwZT0ieHNkOnN0cmluZyIvJmd0Ow0KLSAgICAgICAgICAmbHQ7L3NlcXVlbmNlJmd0Ow0KLSAgICAgICAgJmx0Oy9jb21wbGV4VHlwZSZndDsNCi0gICAgICAmbHQ7L2VsZW1lbnQmZ3Q7DQotICAgICAgJmx0O2VsZW1lbnQgbmFtZT0iVHdvV2F5T25lUGFyYW1ldGVyRWNob1Jlc3BvbnNlIiZndDsNCi0gICAgICAgICZsdDtjb21wbGV4VHlwZSZndDsNCi0gICAgICAgICAgJmx0O3NlcXVlbmNlJmd0Ow0KLSAgICAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9ImVjaG9TdHJpbmciIHR5cGU9InhzZDpzdHJpbmciLyZndDsNCi0gICAgICAgICAgJmx0Oy9zZXF1ZW5jZSZndDsNCi0gICAgICAgICZsdDsvY29tcGxleFR5cGUmZ3Q7DQotICAgICAgJmx0Oy9lbGVtZW50Jmd0Ow0KLSAgICAgIA0KLSAgICAgICZsdDtlbGVtZW50IG5hbWU9Ik5vUGFyYW1ldGVyc1JlcXVlc3QiJmd0Ow0KLSAgICAgICAgJmx0O2NvbXBsZXhUeXBlLyZndDsNCi0gICAgICAmbHQ7L2VsZW1lbnQmZ3Q7DQotICAgICAgJmx0O2VsZW1lbnQgbmFtZT0iTm9QYXJhbWV0ZXJzUmVzcG9uc2UiJmd0Ow0KLSAgICAgICAgJmx0O2NvbXBsZXhUeXBlLyZndDsNCi0gICAgICAmbHQ7L2VsZW1lbnQmZ3Q7DQotICAgICAgDQotICAgICAgJmx0O2VsZW1lbnQgbmFtZT0iTXVsdGlwbGVQYXJhbWV0ZXJzQWRkSXRlbVJlcXVlc3QiJmd0Ow0KLSAgICAgICAgJmx0O2NvbXBsZXhUeXBlJmd0Ow0KLSAgICAgICAgICAmbHQ7c2VxdWVuY2UmZ3Q7DQotICAgICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0iaXRlbUlkIiB0eXBlPSJ4c2Q6aW50Ii8mZ3Q7DQotICAgICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0iaXRlbU5hbWUiIHR5cGU9InhzZDpzdHJpbmciLyZndDsNCi0gICAgICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJwcmljZSIgdHlwZT0ieHNkOmZsb2F0Ii8mZ3Q7DQotICAgICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciLyZndDsNCi0gICAgICAgICAgJmx0Oy9zZXF1ZW5jZSZndDsNCi0gICAgICAgICZsdDsvY29tcGxleFR5cGUmZ3Q7DQotICAgICAgJmx0Oy9lbGVtZW50Jmd0Ow0KLQ0KLSAgICAgICZsdDtlbGVtZW50IG5hbWU9Ik11bHRpcGxlUGFyYW1ldGVyc0FkZEl0ZW1SZXNwb25zZSImZ3Q7DQotICAgICAgICAmbHQ7Y29tcGxleFR5cGUmZ3Q7DQotICAgICAgICAgICZsdDtzZXF1ZW5jZSZndDsNCi0gICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0iaXRlbUlkIiB0eXBlPSJ4c2Q6aW50Ii8mZ3Q7DQotICAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9InN1Y2Nlc3NmdWxBZGQiIHR5cGU9InhzZDpib29sZWFuIi8mZ3Q7DQotICAgICAgICAgICZsdDsvc2VxdWVuY2UmZ3Q7DQotICAgICAgICAmbHQ7L2NvbXBsZXhUeXBlJmd0Ow0KLSAgICAgICZsdDsvZWxlbWVudCZndDsNCi0NCi0gICAgJmx0Oy9zY2hlbWEmZ3Q7DQotICAmbHQ7L3dzZGw6dHlwZXMmZ3Q7DQotDQotICANCi0gICZsdDshLS0gTUVTU0FHRVMgLS0mZ3Q7DQotDQotICAmbHQ7d3NkbDptZXNzYWdlIG5hbWU9IkRvSW5Pbmx5UmVxdWVzdE1lc3NhZ2UiJmd0Ow0KLSAgICAmbHQ7d3NkbDpwYXJ0IG5hbWU9ImlucHV0IiBlbGVtZW50PSJpbXBsOkRvSW5Pbmx5UmVxdWVzdCIvJmd0Ow0KLSAgJmx0Oy93c2RsOm1lc3NhZ2UmZ3Q7DQotDQotICAmbHQ7d3NkbDptZXNzYWdlIG5hbWU9IlR3b1dheU9uZVBhcmFtZXRlckVjaG9SZXF1ZXN0TWVzc2FnZSImZ3Q7DQotICAgICZsdDt3c2RsOnBhcnQgbmFtZT0iaW5wdXQiIGVsZW1lbnQ9ImltcGw6VHdvV2F5T25lUGFyYW1ldGVyRWNob1JlcXVlc3QiLyZndDsNCi0gICZsdDsvd3NkbDptZXNzYWdlJmd0Ow0KLSAgJmx0O3dzZGw6bWVzc2FnZSBuYW1lPSJUd29XYXlPbmVQYXJhbWV0ZXJFY2hvUmVzcG9uc2VNZXNzYWdlIiZndDsNCi0gICAgJmx0O3dzZGw6cGFydCBuYW1lPSJvdXRwdXQiIGVsZW1lbnQ9ImltcGw6VHdvV2F5T25lUGFyYW1ldGVyRWNob1Jlc3BvbnNlIi8mZ3Q7DQotICAmbHQ7L3dzZGw6bWVzc2FnZSZndDsNCi0NCi0gICZsdDt3c2RsOm1lc3NhZ2UgbmFtZT0iTm9QYXJhbWV0ZXJzUmVxdWVzdE1lc3NhZ2UiJmd0Ow0KLSAgICAmbHQ7d3NkbDpwYXJ0IG5hbWU9ImlucHV0IiBlbGVtZW50PSJpbXBsOk5vUGFyYW1ldGVyc1JlcXVlc3QiLyZndDsNCi0gICZsdDsvd3NkbDptZXNzYWdlJmd0Ow0KLSAgJmx0O3dzZGw6bWVzc2FnZSBuYW1lPSJOb1BhcmFtZXRlcnNSZXNwb25zZU1lc3NhZ2UiJmd0Ow0KLSAgICAmbHQ7d3NkbDpwYXJ0IG5hbWU9Im91dHB1dCIgZWxlbWVudD0iaW1wbDpOb1BhcmFtZXRlcnNSZXNwb25zZSIvJmd0Ow0KLSAgJmx0Oy93c2RsOm1lc3NhZ2UmZ3Q7DQotDQotICAmbHQ7d3NkbDptZXNzYWdlIG5hbWU9Ik11bHRpcGxlUGFyYW1ldGVyc0FkZEl0ZW1SZXF1ZXN0TWVzc2FnZSImZ3Q7DQotICAgICZsdDt3c2RsOnBhcnQgbmFtZT0iaW5wdXQiIGVsZW1lbnQ9ImltcGw6TXVsdGlwbGVQYXJhbWV0ZXJzQWRkSXRlbVJlcXVlc3QiLyZndDsNCi0gICZsdDsvd3NkbDptZXNzYWdlJmd0Ow0KLSAgJmx0O3dzZGw6bWVzc2FnZSBuYW1lPSJNdWx0aXBsZVBhcmFtZXRlcnNBZGRJdGVtUmVzcG9uc2VNZXNzYWdlIiZndDsNCi0gICAgJmx0O3dzZGw6cGFydCBuYW1lPSJvdXRwdXQiIGVsZW1lbnQ9ImltcGw6TXVsdGlwbGVQYXJhbWV0ZXJzQWRkSXRlbVJlc3BvbnNlIi8mZ3Q7DQotICAmbHQ7L3dzZGw6bWVzc2FnZSZndDsNCi0NCi0NCi0gICZsdDshLS0gUG9ydCB0eXBlIChvcGVyYXRpb25zKSAtLSZndDsNCi0NCi0gICZsdDt3c2RsOnBvcnRUeXBlIG5hbWU9IkF4aXMyVXNlckd1aWRlUG9ydFR5cGUiJmd0Ow0KLQ0KLSAgICAmbHQ7d3NkbDpvcGVyYXRpb24gbmFtZT0iRG9Jbk9ubHkiIHBhcmFtZXRlck9yZGVyPSJpbnB1dCImZ3Q7DQotICAgICAgJmx0O3dzZGw6aW5wdXQgbmFtZT0iRG9Jbk9ubHlSZXF1ZXN0TWVzc2FnZSINCi0gICAgICAgICAgICAgICAgICBtZXNzYWdlPSJpbXBsOkRvSW5Pbmx5UmVxdWVzdE1lc3NhZ2UiLyZndDsNCi0gICAgJmx0Oy93c2RsOm9wZXJhdGlvbiZndDsNCi0NCi0gICAgJmx0O3dzZGw6b3BlcmF0aW9uIG5hbWU9IlR3b1dheU9uZVBhcmFtZXRlckVjaG8iIHBhcmFtZXRlck9yZGVyPSJpbnB1dCImZ3Q7DQotICAgICAgJmx0O3dzZGw6aW5wdXQgbmFtZT0iVHdvV2F5T25lUGFyYW1ldGVyRWNob1JlcXVlc3RNZXNzYWdlIg0KLSAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9ImltcGw6VHdvV2F5T25lUGFyYW1ldGVyRWNob1JlcXVlc3RNZXNzYWdlIi8mZ3Q7DQotICAgICAgJmx0O3dzZGw6b3V0cHV0IG5hbWU9IlR3b1dheU9uZVBhcmFtZXRlckVjaG9SZXNwb25zZU1lc3NhZ2UiDQotICAgICAgICAgICAgICAgICAgbWVzc2FnZT0iaW1wbDpUd29XYXlPbmVQYXJhbWV0ZXJFY2hvUmVzcG9uc2VNZXNzYWdlIi8mZ3Q7DQotICAgICZsdDsvd3NkbDpvcGVyYXRpb24mZ3Q7DQotDQotICAgICZsdDt3c2RsOm9wZXJhdGlvbiBuYW1lPSJOb1BhcmFtZXRlcnMiIHBhcmFtZXRlck9yZGVyPSJpbnB1dCImZ3Q7DQotICAgICAgJmx0O3dzZGw6aW5wdXQgbmFtZT0iTm9QYXJhbWV0ZXJzUmVxdWVzdE1lc3NhZ2UiDQotICAgICAgICAgICAgICAgICAgbWVzc2FnZT0iaW1wbDpOb1BhcmFtZXRlcnNSZXF1ZXN0TWVzc2FnZSIvJmd0Ow0KLSAgICAgICZsdDt3c2RsOm91dHB1dCBuYW1lPSJOb1BhcmFtZXRlcnNSZXNwb25zZU1lc3NhZ2UiDQotICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9ImltcGw6Tm9QYXJhbWV0ZXJzUmVzcG9uc2VNZXNzYWdlIi8mZ3Q7DQotICAgICZsdDsvd3NkbDpvcGVyYXRpb24mZ3Q7DQotDQotICAgICZsdDt3c2RsOm9wZXJhdGlvbiBuYW1lPSJNdWx0aXBsZVBhcmFtZXRlcnNBZGRJdGVtIiBwYXJhbWV0ZXJPcmRlcj0iaW5wdXQiJmd0Ow0KLSAgICAgICZsdDt3c2RsOmlucHV0IG5hbWU9Ik11bHRpcGxlUGFyYW1ldGVyc0FkZEl0ZW1SZXF1ZXN0TWVzc2FnZSINCi0gICAgICAgICAgICAgICAgICBtZXNzYWdlPSJpbXBsOk11bHRpcGxlUGFyYW1ldGVyc0FkZEl0ZW1SZXF1ZXN0TWVzc2FnZSIvJmd0Ow0KLSAgICAgICZsdDt3c2RsOm91dHB1dCBuYW1lPSJNdWx0aXBsZVBhcmFtZXRlcnNBZGRJdGVtUmVzcG9uc2VNZXNzYWdlIg0KLSAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9ImltcGw6TXVsdGlwbGVQYXJhbWV0ZXJzQWRkSXRlbVJlc3BvbnNlTWVzc2FnZSIvJmd0Ow0KLSAgICAmbHQ7L3dzZGw6b3BlcmF0aW9uJmd0Ow0KLQ0KLSAgJmx0Oy93c2RsOnBvcnRUeXBlJmd0Ow0KLQ0KLQ0KLSAgJmx0OyEtLSBCSU5ESU5HIChiaW5kIG9wZXJhdGlvbnMpIC0tJmd0Ow0KLSAgJmx0O3dzZGw6YmluZGluZw0KLSAgICAgbmFtZT0iQXhpczJVc2VyR3VpZGVTb2FwQmluZGluZyINCi0gICAgIHR5cGU9ImltcGw6QXhpczJVc2VyR3VpZGVQb3J0VHlwZSImZ3Q7DQotICAgICZsdDt3c2Rsc29hcDpiaW5kaW5nIHN0eWxlPSJkb2N1bWVudCIgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiLyZndDsNCi0NCi0gICAgJmx0O3dzZGw6b3BlcmF0aW9uIG5hbWU9IkRvSW5Pbmx5IiZndDsNCi0gICAgICAmbHQ7d3NkbHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IkRvSW5Pbmx5Ii8mZ3Q7DQotICAgICAgJmx0O3dzZGw6aW5wdXQmZ3Q7DQotICAgICAgICAmbHQ7d3NkbHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLyZndDsNCi0gICAgICAmbHQ7L3dzZGw6aW5wdXQmZ3Q7DQotICAgICZsdDsvd3NkbDpvcGVyYXRpb24mZ3Q7DQotDQotICAgICZsdDt3c2RsOm9wZXJhdGlvbiBuYW1lPSJUd29XYXlPbmVQYXJhbWV0ZXJFY2hvIiZndDsNCi0gICAgICAmbHQ7d3NkbHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IlR3b1dheU9uZVBhcmFtZXRlckVjaG8iLyZndDsNCi0gICAgICAmbHQ7d3NkbDppbnB1dCZndDsNCi0gICAgICAgICZsdDt3c2Rsc29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvJmd0Ow0KLSAgICAgICZsdDsvd3NkbDppbnB1dCZndDsNCi0gICAgICAmbHQ7d3NkbDpvdXRwdXQmZ3Q7DQotICAgICAgICAmbHQ7d3NkbHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLyZndDsNCi0gICAgICAmbHQ7L3dzZGw6b3V0cHV0Jmd0Ow0KLSAgICAmbHQ7L3dzZGw6b3BlcmF0aW9uJmd0Ow0KLQ0KLSAgICAmbHQ7d3NkbDpvcGVyYXRpb24gbmFtZT0iTm9QYXJhbWV0ZXJzIiZndDsNCi0gICAgICAmbHQ7d3NkbHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Ik5vUGFyYW1ldGVycyIvJmd0Ow0KLSAgICAgICZsdDt3c2RsOmlucHV0Jmd0Ow0KLSAgICAgICAgJmx0O3dzZGxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8mZ3Q7DQotICAgICAgJmx0Oy93c2RsOmlucHV0Jmd0Ow0KLSAgICAgICZsdDt3c2RsOm91dHB1dCZndDsNCi0gICAgICAgICZsdDt3c2Rsc29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvJmd0Ow0KLSAgICAgICZsdDsvd3NkbDpvdXRwdXQmZ3Q7DQotICAgICZsdDsvd3NkbDpvcGVyYXRpb24mZ3Q7DQotDQotICAgICZsdDt3c2RsOm9wZXJhdGlvbiBuYW1lPSJNdWx0aXBsZVBhcmFtZXRlcnNBZGRJdGVtIiZndDsNCi0gICAgICAmbHQ7d3NkbHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Ik11bHRpcGxlUGFyYW1ldGVyc0FkZEl0ZW0iLyZndDsNCi0gICAgICAmbHQ7d3NkbDppbnB1dCZndDsNCi0gICAgICAgICZsdDt3c2Rsc29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvJmd0Ow0KLSAgICAgICZsdDsvd3NkbDppbnB1dCZndDsNCi0gICAgICAmbHQ7d3NkbDpvdXRwdXQmZ3Q7DQotICAgICAgICAmbHQ7d3NkbHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLyZndDsNCi0gICAgICAmbHQ7L3dzZGw6b3V0cHV0Jmd0Ow0KLSAgICAmbHQ7L3dzZGw6b3BlcmF0aW9uJmd0Ow0KLSAgJmx0Oy93c2RsOmJpbmRpbmcmZ3Q7DQotDQotDQotICAmbHQ7IS0tIFNFUlZJQ0UgLS0mZ3Q7DQotDQotICAmbHQ7d3NkbDpzZXJ2aWNlIG5hbWU9IkF4aXMyVXNlckd1aWRlU2VydmljZSImZ3Q7DQotICAgICZsdDt3c2RsOnBvcnQgYmluZGluZz0iaW1wbDpBeGlzMlVzZXJHdWlkZVNvYXBCaW5kaW5nIg0KLSAgICAgICAgICAgICAgIG5hbWU9IkF4aXMyVXNlckd1aWRlIiZndDsNCi0gICAgICAmbHQ7d3NkbHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo4MDgwL2F4aXMyL3NlcnZpY2VzL0F4aXMyVXNlckd1aWRlIi8mZ3Q7DQotICAgICZsdDsvd3NkbDpwb3J0Jmd0Ow0KLSAgJmx0Oy93c2RsOnNlcnZpY2UmZ3Q7DQotJmx0Oy93c2RsOmRlZmluaXRpb25zJmd0Ow0KLTwvcHJlPg0KLTxwPk5vdGUgdGhhdCB0aGUgZG9jdW1lbnQgZGVmaW5lcyBmb3VyIG9wZXJhdGlvbnMsIERvSW5Pbmx5LA0KLU5vUGFyYW1ldGVycywgVHdvV2F5T25lUGFyYW1ldGVyRWNobywgYW5kDQotTXVsdGlwbGVQYXJhbWV0ZXJzQWRkSXRlbS4gRWFjaCBjbGllbnQgd2lsbCBpbmNsdWRlIG1ldGhvZHMgZm9yDQotY2FsbGluZyBlYWNoIG9mIHRoZXNlIG9wZXJhdGlvbnMuPC9wPg0KLTxwPihZb3UgY2FuIGdldCBtb3JlIGluZm9ybWF0aW9uIG9uIFdTREwgYXQgPGEgaHJlZj0NCi0iaHR0cDovL3d3dy53My5vcmcvMjAwMi93cy9kZXNjLyI+aHR0cDovL3d3dy53My5vcmcvMjAwMi93cy9kZXNjLzwvYT4NCi0uKTwvcD4NCi08YSBuYW1lPSJqaWJ4IiBpZD0iamlieCI+PC9hPg0KLTxoMj5KaUJYPC9oMj4NCi08cD5KaUJYIGlzIG5vdCBwYXJ0IG9mIHRoZSBBcGFjaGUgcHJvamVjdCwgc28gaW4gb3JkZXIgdG8gdXNlIGl0IHRvDQotZ2VuZXJhdGUgeW91ciBjbGllbnRzLCB5b3Ugd2lsbCBuZWVkIHRvIGRvIHNvbWUgc2V0dGluZyB1cCB0byBzdGFydA0KLXdpdGguIFRvIGdlbmVyYXRlIHlvdXIgY2xpZW50LCBleGVjdXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6PC9wPg0KLTxwPjxiPlRoZSBzaG9ydCBzdG9yeTwvYj46PC9wPg0KLTxvbD4NCi08bGk+RG93bmxvYWQgdGhlIGxhdGVzdCBKaUJYIHBhY2thZ2UgKHRlc3RlZCB3aXRoIEppQlggdjEuMSkgZnJvbQ0KLTxhIGhyZWY9DQotImh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvamlieC8iPmh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvamlieC88L2E+DQotLiBFeHRyYWN0IHRoZSB6aXAgZmlsZSwgYW5kIGNvcHkgdGhlIEpBUnMgaW4gdGhlIGxpYiBkaXJlY3RvcnkgdG8NCi10aGUgQVhJUzJfSE9NRS9saWIgZGlyZWN0b3J5LiAoRGVsZXRlIHRoZSBzdGF4LWFwaS5qYXIgZmlsZTsgaXQncw0KLXN1cGVyc2VkZWQgYnkgdGhlIHZlcnNpb24gdGhhdCBjb21lcyB3aXRoIEF4aXMyLik8L2xpPg0KLTxsaT5Eb3dubG9hZCA8YSBocmVmPQ0KLSJodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3Qvc2hvd2ZpbGVzLnBocD9ncm91cF9pZD02OTM1OCZhbXA7cGFja2FnZV9pZD0xMjI4OTciPg0KLXhzZDJqaWJ4IHZlcnNpb24gYmV0YTJhPC9hPiBmcm9tIFNvdXJjZUZvcmdlLiBDcmVhdGUgYSBkaXJlY3RvcnkNCi1jYWxsZWQgeHNkMmppYnggaW4geW91ciB3b3JraW5nIGRpcmVjdG9yeSBhbmQgZXh0cmFjdCB0aGUgZmlsZXMNCi1pbnRvIGl0LiBUaGlzIHV0aWxpdHkgZG9lcyBub3Qgd29yayB3aXRoIHRoZSBsYXRlc3QgcmVsZWFzZSAodjEuMSkNCi1vZiBKaUJYLCBzbyBkb3dubG9hZCA8YSBocmVmPQ0KLSJodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3Qvc2hvd2ZpbGVzLnBocD9ncm91cF9pZD02OTM1OCZhbXA7cGFja2FnZV9pZD02ODI5MCI+DQotamlieC0xLjBSQzE8L2E+IGZyb20gU291cmNlRm9yZ2UuIEV4dHJhY3QgdGhlIGZpbGVzIGZyb20gdGhpcw0KLWFyY2hpdmUgYW5kIGNvcHkgdGhlICouamFyIGZpbGVzIGluIHRoZSBsaWIgZGlyZWN0b3J5IGludG8gdGhlDQoteHNkMmppYngvbGliIGRpcmVjdG9yeS48L2xpPg0KLTxsaT5DcmVhdGUgYSBzY2hlbWEgYmFzZWQgb24gdGhlIGRhdGEgc3RydWN0dXJlcyBvZiB5b3VyIFdTREwgZmlsZQ0KLWFuZCBzYXZlIGl0IGluIHlvdXIgd29ya2luZyBkaXJlY3RvcnkuPC9saT4NCi08bGk+TWFrZSBzdXJlIHRoYXQgb25seSB0aGUgeHNkMmppYnggamFyIGZpbGVzIGFyZSBpbiB0aGUgY2xhc3NwYXRoDQotYW5kIGV4ZWN1dGUgdGhlIGZvbGxvd2luZyBjb21tYW5kIHRvIGNyZWF0ZSB0aGUgYmFzaWMgYmluZGluZyBmaWxlOg0KLWphdmEgLWphciB4c2QyamlieFxsaWJceHNkMmppYnguamFyIEF4aXMyVXNlckd1aWRlLnhzZDwvbGk+DQotPGxpPkNvcHkgdGhlIG9yZyBkaXJlY3RvcnkgdG8gdGhlIHNyYyBkaXJlY3RvcnkgdG8gcGxhY2UgdGhlDQotZ2VuZXJhdGVkIGNsYXNzZXMgaW50byB0aGUgcHJvamVjdCBzbyB0aGF0IHRoZSBjb21waWxlciB3aWxsIHNlZQ0KLXRoZW0uPC9saT4NCi08bGk+UmVtb3ZlIHRoZSB4c2QyamlieC1yZWxhdGVkICouamFyIGZpbGVzIGZyb20geW91ciBDTEFTU1BBVEggYW5kDQotYWRkIHRoZSBBeGlzMiAuamFyIGZpbGVzIGJhY2sgaW50byBpdC4gRXhlY3V0ZSB0aGUgZm9sbG93aW5nDQotY29tbWFuZCB0byBnZW5lcmF0ZSB0aGUgc3R1YnM6DQotPHByZT4NCi0lQVhJUzJfSE9NRSVcYmluXFdTREwySmF2YSAtdXJpIEF4aXMyVXNlckd1aWRlLndzZGwgLXAgb3JnLmFwYWNoZS5heGlzMi5heGlzMnVzZXJndWlkZSAtZCBqaWJ4IC1FYmluZGluZ2ZpbGUgb3JnXGFwYWNoZVxheGlzMlxheGlzMnVzZXJndWlkZVxiaW5kaW5nLnhtbCAtcw0KLTwvcHJlPjwvbGk+DQotPGxpPkNyZWF0ZSB0aGUgY2xpZW50IGZpbGUgaW4gdGhlIG9yZy9hcGFjaGUvYXhpczIvYXhpczJ1c2VyZ3VpZGUNCi1kaXJlY3RvcnkuPC9saT4NCi08bGk+Q29weSB0aGUgb3JnIGRpcmVjdG9yeSBhbmQgYWxsIGl0cyBjb250ZW50cyB0byB0aGUgc3JjDQotZGlyZWN0b3J5LjwvbGk+DQotPGxpPkNvbXBpbGUgdGhlIGZpcnN0IHNldCBvZiBjbGFzc2VzIGJ5IHR5cGluZzo8Y29kZT5hbnQNCi1qYXIuY2xpZW50PC9jb2RlPjwvbGk+DQotPGxpPkdvIHRvIHRoZSBidWlsZC9jbGFzc2VzIGRpcmVjdG9yeSBhbmQgcnVuIHRoZSBKaUJYIGNvbXBpbGVyOg0KLTxwcmU+DQotamF2YSAtamFyIEM6XGFwcHNcYXhpczJcbGliXGppYngtYmluZC5qYXIgDQotLi5cLi5cb3JnXGFwYWNoZVxheGlzMlxheGlzMnVzZXJndWlkZVxiaW5kaW5nLnhtbA0KLTwvcHJlPjwvbGk+DQotPGxpPlJ1biBBbnQgYWdhaW4gdG8gcGFja2FnZSB0aGUgbmV3IGF1dG8tZ2VuZXJhdGVkIEppQlggY2xhc3Nlcw0KLWludG8gdGhlIGNsaWVudCBqYXIgYnkgdHlwaW5nOiA8Y29kZT5hbnQgamFyLmNsaWVudDwvY29kZT48L2xpPg0KLTxsaT5BZGQgdGhlIGJ1aWxkL2xpYi9BeGlzMlVzZXJHdWlkZVNlcnZpY2UtdGVzdC1jbGllbnQuamFyIGZpbGUgdG8NCi10aGUgQ0xBU1NQQVRIIGFuZCBydW4gdGhlIGNsaWVudCBieSB0eXBpbmc6DQotPHByZT4NCi1qYXZhIG9yZy5hcGFjaGUuYXhpczIuYXhpczJ1c2VyZ3VpZGUuQ2xpZW50DQotPC9wcmU+PC9saT4NCi08L29sPg0KLTxwPjxiPlRoZSBsb25nIHN0b3J5OjwvYj48L3A+DQotPHA+VG8gdXNlIEppQlggdG8gZ2VuZXJhdGUgeW91ciBjbGllbnQsIHlvdSBmaXJzdCBuZWVkIHRvIHVzZSBpdCBpbg0KLXR3byBkaWZmZXJlbnQgZnVuY3Rpb25zLiBZb3UgaGF2ZSB0byBnZW5lcmF0ZSBhIGJpbmRpbmcgZmlsZSB0aGF0DQotbWFwcyBvYmplY3RzIHRvIHRoZSBYTUwgZWxlbWVudHMsIGFuZCB0aGVuIHVzZSBKaUJYIHRvIGdlbmVyYXRlIHRoZQ0KLXN0dWJzIHRoYXQgeW91ciBjbGllbnQgd2lsbCB1c2UuIFRvIGdlbmVyYXRlIGEgYmluZGluZyBmaWxlLCB5b3UnbGwNCi1uZWVkIHRoZSB4c2QyamlieCB1dGlsaXR5LCB3aGljaCBjcmVhdGVzIGEgYmluZGluZyBmaWxlIGZyb20gYW4gWE1MDQotU2NoZW1hIGRvY3VtZW50LiBPbmNlIHlvdSBoYXZlIHRoZSBiaW5kaW5nIGZpbGUsIHlvdSBjYW4gcnVuIEppQlgNCi10byBjcmVhdGUgdGhlIGFjdHVhbCBvYmplY3QuIEluIG9yZGVyIHRvIGRvIGFsbCB0aGF0IHlvdSdsbCBuZWVkIHRvDQotaGF2ZSB0aGUgYXBwcm9wcmlhdGUgdmVyc2lvbnMgb2YgdGhlIEppQlggc29mdHdhcmUuPC9wPg0KLTxwPkRvd25sb2FkIHRoZSBsYXRlc3QgSmlCWCBwYWNrYWdlICh0ZXN0ZWQgd2l0aCBKaUJYIHYxLjEpIGZyb20NCi08YSBocmVmPQ0KLSJodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2ppYngvIj5odHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2ppYngvPC9hPi4NCi1FeHRyYWN0IHRoZSB6aXAgZmlsZSwgYW5kIGNvcHkgdGhlIEpBUnMgaW4gdGhlIGxpYiBkaXJlY3RvcnkgdG8gdGhlDQotQVhJUzJfSE9NRS9saWIgZGlyZWN0b3J5LiAoRGVsZXRlIHRoZSBzdGF4LWFwaS5qYXIgZmlsZTsgaXQncw0KLXN1cGVyc2VkZWQgYnkgdGhlIHZlcnNpb24gdGhhdCBjb21lcyB3aXRoIEF4aXMyLikgVGhlc2UgZmlsZXMNCi1wZXJ0YWluIHRvIHRoZSBtYWluIEppQlggYXBwbGljYXRpb24uPC9wPg0KLTxwPkRvd25sb2FkIDxhIGhyZWY9DQotImh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdC9zaG93ZmlsZXMucGhwP2dyb3VwX2lkPTY5MzU4JmFtcDtwYWNrYWdlX2lkPTEyMjg5NyI+DQoteHNkMmppYnggdmVyc2lvbiBiZXRhMmE8L2E+IGZyb20gU291cmNlZm9yZ2UuIENyZWF0ZSBhIGRpcmVjdG9yeQ0KLWNhbGxlZCB4c2QyamlieCBpbiB5b3VyIHdvcmtpbmcgZGlyZWN0b3J5IGFuZCBleHRyYWN0IHRoZSBmaWxlcw0KLWludG8gaXQuIFVuZm9ydHVuYXRlbHksIHRoaXMgdXRpbGl0eSBkb2VzIG5vdCB3b3JrIHdpdGggdGhlIGxhdGVzdA0KLXJlbGVhc2Ugb2YgSmlCWCwgc28geW91IHdpbGwgbmVlZCB0byBkb3dubG9hZCA8YSBocmVmPQ0KLSJodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3Qvc2hvd2ZpbGVzLnBocD9ncm91cF9pZD02OTM1OCZhbXA7cGFja2FnZV9pZD02ODI5MCI+DQotamlieC0xLjBSQzE8L2E+IGZyb20gU291cmNlZm9yZ2UuIEV4dHJhY3QgdGhlIGZpbGVzIGZyb20gdGhpcw0KLWFyY2hpdmUgYW5kIHBsYWNlIHRoZSAqLmphciBmaWxlcyBpbiB0aGUgbGliIGRpcmVjdG9yeSBpbnRvIHRoZQ0KLXhzZDJqaWJ4L2xpYiBkaXJlY3RvcnkuIFRoaXMgd2F5LCB5b3UgY2FuIHVzZSB0aGVtIGV4Y2x1c2l2ZWx5IHdpdGgNCi10aGUgeHNkMmppYnggdXRpbGl0eS48L3A+DQotPHA+WW91J2xsIG5lZWQgYW4gWE1MIHNjaGVtYSBmcm9tIHdoaWNoIHRvIGdlbmVyYXRlIHRoZSBiaW5kaW5nDQotZmlsZSwgd2hpY2ggbGlua3MgWE1MIGVsZW1lbnRzIHRvIHRoZSBKYXZhIGNsYXNzZXMuIEFzIGRlZmluZWQgaW4NCi10aGUgc2FtcGxlIFdTREwgZmlsZSwgaXRzIGNvbnRlbnQgc2hvdWxkIGJlIGFzIHNob3duIGluIENvZGUNCi1MaXN0aW5nIDIuPC9wPg0KLTxwPjxiPkNvZGUgTGlzdGluZyAyOiBYTUwgU2NoZW1hPC9iPjwvcD4NCi08cHJlPg0KLSZsdDs/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8mZ3Q7DQotJmx0O3hzZDpzY2hlbWENCi0gICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCINCi0gICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9hcGFjaGUub3JnL2F4aXMyL0F4aXMyVXNlckd1aWRlIg0KLSAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSINCi0gICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiZndDsNCi0gIA0KLSAgJmx0OyEtLSBFTEVNRU5UUyAtLSZndDsNCi0gICZsdDt4c2Q6ZWxlbWVudCBuYW1lPSJEb0luT25seVJlcXVlc3QiJmd0Ow0KLSAgICAmbHQ7eHNkOmNvbXBsZXhUeXBlJmd0Ow0KLSAgICAgICZsdDt4c2Q6c2VxdWVuY2UmZ3Q7DQotICAgICAgICAmbHQ7eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZVN0cmluZyIgdHlwZT0ieHNkOnN0cmluZyIvJmd0Ow0KLSAgICAgICZsdDsveHNkOnNlcXVlbmNlJmd0Ow0KLSAgICAmbHQ7L3hzZDpjb21wbGV4VHlwZSZndDsNCi0gICZsdDsveHNkOmVsZW1lbnQmZ3Q7DQotICANCi0gICZsdDt4c2Q6ZWxlbWVudCBuYW1lPSJUd29XYXlPbmVQYXJhbWV0ZXJFY2hvUmVxdWVzdCImZ3Q7DQotICAgICZsdDt4c2Q6Y29tcGxleFR5cGUmZ3Q7DQotICAgICAgJmx0O3hzZDpzZXF1ZW5jZSZndDsNCi0gICAgICAgICZsdDt4c2Q6ZWxlbWVudCBuYW1lPSJlY2hvU3RyaW5nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8mZ3Q7DQotICAgICAgJmx0Oy94c2Q6c2VxdWVuY2UmZ3Q7DQotICAgICZsdDsveHNkOmNvbXBsZXhUeXBlJmd0Ow0KLSAgJmx0Oy94c2Q6ZWxlbWVudCZndDsNCi0gICZsdDt4c2Q6ZWxlbWVudCBuYW1lPSJUd29XYXlPbmVQYXJhbWV0ZXJFY2hvUmVzcG9uc2UiJmd0Ow0KLSAgICAmbHQ7eHNkOmNvbXBsZXhUeXBlJmd0Ow0KLSAgICAgICZsdDt4c2Q6c2VxdWVuY2UmZ3Q7DQotICAgICAgICAmbHQ7eHNkOmVsZW1lbnQgbmFtZT0iZWNob1N0cmluZyIgdHlwZT0ieHNkOnN0cmluZyIvJmd0Ow0KLSAgICAgICZsdDsveHNkOnNlcXVlbmNlJmd0Ow0KLSAgICAmbHQ7L3hzZDpjb21wbGV4VHlwZSZndDsNCi0gICZsdDsveHNkOmVsZW1lbnQmZ3Q7DQotICANCi0gICZsdDt4c2Q6ZWxlbWVudCBuYW1lPSJOb1BhcmFtZXRlcnNSZXF1ZXN0IiZndDsNCi0gICAgJmx0O3hzZDpjb21wbGV4VHlwZS8mZ3Q7DQotICAmbHQ7L3hzZDplbGVtZW50Jmd0Ow0KLSAgJmx0O3hzZDplbGVtZW50IG5hbWU9Ik5vUGFyYW1ldGVyc1Jlc3BvbnNlIiZndDsNCi0gICAgJmx0O3hzZDpjb21wbGV4VHlwZS8mZ3Q7DQotICAmbHQ7L3hzZDplbGVtZW50Jmd0Ow0KLSAgDQotICAmbHQ7eHNkOmVsZW1lbnQgbmFtZT0iTXVsdGlwbGVQYXJhbWV0ZXJzQWRkSXRlbVJlcXVlc3QiJmd0Ow0KLSAgICAmbHQ7eHNkOmNvbXBsZXhUeXBlJmd0Ow0KLSAgICAgICZsdDt4c2Q6c2VxdWVuY2UmZ3Q7DQotICAgICAgICAmbHQ7eHNkOmVsZW1lbnQgbmFtZT0iaXRlbUlkIiB0eXBlPSJ4c2Q6aW50Ii8mZ3Q7DQotICAgICAgICAmbHQ7eHNkOmVsZW1lbnQgbmFtZT0iaXRlbU5hbWUiIHR5cGU9InhzZDpzdHJpbmciLyZndDsNCi0gICAgICAgICZsdDt4c2Q6ZWxlbWVudCBuYW1lPSJwcmljZSIgdHlwZT0ieHNkOmZsb2F0Ii8mZ3Q7DQotICAgICAgICAmbHQ7eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciLyZndDsNCi0gICAgICAmbHQ7L3hzZDpzZXF1ZW5jZSZndDsNCi0gICAgJmx0Oy94c2Q6Y29tcGxleFR5cGUmZ3Q7DQotICAmbHQ7L3hzZDplbGVtZW50Jmd0Ow0KLQ0KLSAgJmx0O3hzZDplbGVtZW50IG5hbWU9Ik11bHRpcGxlUGFyYW1ldGVyc0FkZEl0ZW1SZXNwb25zZSImZ3Q7DQotICAgICZsdDt4c2Q6Y29tcGxleFR5cGUmZ3Q7DQotICAgICAgJmx0O3hzZDpzZXF1ZW5jZSZndDsNCi0gICAgICAgICZsdDt4c2Q6ZWxlbWVudCBuYW1lPSJpdGVtSWQiIHR5cGU9InhzZDppbnQiLyZndDsNCi0gICAgICAgICZsdDt4c2Q6ZWxlbWVudCBuYW1lPSJzdWNjZXNzZnVsQWRkIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvJmd0Ow0KLSAgICAgICZsdDsveHNkOnNlcXVlbmNlJmd0Ow0KLSAgICAmbHQ7L3hzZDpjb21wbGV4VHlwZSZndDsNCi0gICZsdDsveHNkOmVsZW1lbnQmZ3Q7DQotDQotJmx0Oy94c2Q6c2NoZW1hJmd0Ow0KLTwvcHJlPg0KLTxwPlNhdmUgdGhlIGFib3ZlIFhNTCBzY2hlbWEgZmlsZSBhcyBBeGlzMlVzZXJHdWlkZS54c2QuPC9wPg0KLTxwPkluIG9yZGVyIHRvIG1hcCB0aGlzIHNjaGVtYSBpbnRvIGEgSmlCWCBiaW5kaW5nIGZpbGUsIHlvdSdsbA0KLW5lZWQgdG8gdXNlIHRoZSB4c2QyamlieCB1dGlsaXR5LiBDbGVhciB5b3VyIENMQVNTUEFUSCBhbmQgYWRkIG9ubHkNCi10aGUgLmphciBmaWxlcyBpbiB0aGUgeHNkMmppYngvbGliIGRpcmVjdG9yeS4gRXhlY3V0ZSB0aGUgZm9sbG93aW5nDQotY29tbWFuZCB0byBjcmVhdGUgdGhlIGJhc2ljIGJpbmRpbmcgZmlsZTo8L3A+DQotPHByZT4NCi1qYXZhIC1qYXIgeHNkMmppYnhcbGliXHhzZDJqaWJ4LmphciBBeGlzMlVzZXJHdWlkZS54c2QNCi08L3ByZT4NCi08cD5UaGlzIG9wZXJhdGlvbiBjcmVhdGVzIHRoZSBiYXNpYyBjbGFzcyBmaWxlcywgYXMgd2VsbCBhcyB0aGUNCi1tYXBwaW5nIGZpbGUsIGNhbGxlZCBiaW5kaW5nLnhtbC4gWW91J2xsIHVzZSB0aGlzIGZpbGUgdG8gZG8gdGhlDQotYWN0dWFsIFdTREwtdG8tSmF2YSBjb252ZXJzaW9uLjwvcD4NCi08cD5SZW1vdmUgdGhlIHhzZDJqaWJ4IC5qYXIgZmlsZXMgZnJvbSB5b3VyIENMQVNTUEFUSCBhbmQgYWRkIHRoZQ0KLUF4aXMyIC5qYXIgZmlsZXMgYmFjayBpbnRvIGl0LiBFeGVjdXRlIHRoZSBjb21tYW5kIGluIENvZGUgTGlzdGluZw0KLTMgdG8gZ2VuZXJhdGUgdGhlIHN0dWJzLjwvcD4NCi08cD48Yj5Db2RlIExpc3RpbmcgMzogR2VuZXJhdGluZyB0aGUgc3R1YnM8L2I+PC9wPg0KLTxwcmU+DQotJUFYSVMyX0hPTUUlXGJpblxXU0RMMkphdmEgLXVyaSBBeGlzMlVzZXJHdWlkZS53c2RsIC1wIG9yZy5hcGFjaGUuYXhpczIuYXhpczJ1c2VyZ3VpZGUgLWQgamlieCAtRWJpbmRpbmdmaWxlIG9yZ1xhcGFjaGVcYXhpczJcYXhpczJ1c2VyZ3VpZGVcYmluZGluZy54bWwgLXMNCi08L3ByZT4NCi08cD5DcmVhdGUgdGhlIGNsaWVudCBmaWxlLCBDbGllbnQuamF2YSwgaW4gdGhlDQotb3JnL2FwYWNoZS9heGlzMi9heGlzMnVzZXJndWlkZSBkaXJlY3RvcnkuIEFkZCB0aGUgZm9sbG93aW5nIGNvZGUNCi1pbiBDb2RlIExpc3RpbmcgNC48L3A+DQotPHA+PGI+Q29kZSBMaXN0aW5nIDQ6IENyZWF0aW5nIENsaWVudC5qYXZhPC9iPjwvcD4NCi08cHJlPg0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5heGlzMnVzZXJndWlkZTsNCi0NCi1wdWJsaWMgY2xhc3MgQ2xpZW50ew0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihqYXZhLmxhbmcuU3RyaW5nIGFyZ3NbXSl7DQotICAgICAgICB0cnl7DQotICAgICAgICAgICAgQXhpczJVc2VyR3VpZGVTZXJ2aWNlU3R1YiBzdHViID0NCi0gICAgICAgICAgICAgICAgbmV3IEF4aXMyVXNlckd1aWRlU2VydmljZVN0dWINCi0gICAgICAgICAgICAgICgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2F4aXMyL3NlcnZpY2VzL0F4aXMyVXNlckd1aWRlU2VydmljZSIpOw0KLQ0KLSAgICAgICAgICAgIGRvSW5Pbmx5KHN0dWIpOw0KLSAgICAgICAgICAgIHR3b1dheU9uZVBhcmFtZXRlckVjaG8oc3R1Yik7DQotICAgICAgICAgICAgbm9QYXJhbWV0ZXJzKHN0dWIpOw0KLSAgICAgICAgICAgIG11bHRpcGxlUGFyYW1ldGVycyhzdHViKTsNCi0gICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpew0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcblxuXG4iKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZG9Jbk9ubHkoQXhpczJVc2VyR3VpZGVTZXJ2aWNlU3R1YiBzdHViKXsNCi0gICAgICAgIHRyeXsNCi0gICAgICAgICAgICBEb0luT25seVJlcXVlc3QgcmVxID0gDQotICAgICAgICAgICAgICAgIG5ldyBEb0luT25seVJlcXVlc3QoKTsNCi0NCi0gICAgICAgICAgICByZXEuc2V0TWVzc2FnZVN0cmluZygiZmlyZSBhbmQgZm9yZ2V0IGl0ISIpOw0KLQ0KLSAgICAgICAgICAgIHN0dWIuRG9Jbk9ubHkocmVxKTsNCi0gICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpew0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcblxuXG4iKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdHdvV2F5T25lUGFyYW1ldGVyRWNobyhBeGlzMlVzZXJHdWlkZVNlcnZpY2VTdHViIHN0dWIpew0KLSAgICAgICAgdHJ5ew0KLSAgICAgICAgICAgIFR3b1dheU9uZVBhcmFtZXRlckVjaG9SZXF1ZXN0IHJlcSA9IA0KLSAgICAgICAgICAgICAgICBuZXcgVHdvV2F5T25lUGFyYW1ldGVyRWNob1JlcXVlc3QoKTsNCi0NCi0gICAgICAgICAgICByZXEuc2V0RWNob1N0cmluZygiZWNobyEgLi4uIGVjaG8hIik7DQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oc3R1Yi5Ud29XYXlPbmVQYXJhbWV0ZXJFY2hvKHJlcSkuZ2V0RWNob1N0cmluZygpKTsNCi0gICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpew0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcblxuXG4iKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbm9QYXJhbWV0ZXJzKEF4aXMyVXNlckd1aWRlU2VydmljZVN0dWIgc3R1Yil7DQotICAgICAgICB0cnl7DQotICAgICAgICAgICAgTm9QYXJhbWV0ZXJzUmVxdWVzdCByZXEgPQ0KLSAgICAgICAgICAgICAgICBuZXcgTm9QYXJhbWV0ZXJzUmVxdWVzdCgpOw0KLQ0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihzdHViLk5vUGFyYW1ldGVycyhyZXEpKTsNCi0gICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpew0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcblxuXG4iKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbXVsdGlwbGVQYXJhbWV0ZXJzKEF4aXMyVXNlckd1aWRlU2VydmljZVN0dWIgc3R1Yil7DQotICAgICAgICB0cnl7DQotICAgICAgICAgICAgTXVsdGlwbGVQYXJhbWV0ZXJzQWRkSXRlbVJlcXVlc3QgcmVxID0NCi0gICAgICAgICAgICAgICAgbmV3IE11bHRpcGxlUGFyYW1ldGVyc0FkZEl0ZW1SZXF1ZXN0KCk7DQotDQotICAgICAgICAgICAgcmVxLnNldFByaWNlKChmbG9hdCkxLjk5KTsNCi0gICAgICAgICAgICByZXEuc2V0SXRlbUlkKChpbnQpMjM4NzI5ODMpOw0KLSAgICAgICAgICAgIHJlcS5zZXREZXNjcmlwdGlvbigiTXVzdCBoYXZlIGZvciBjb29raW5nIik7DQotICAgICAgICAgICAgcmVxLnNldEl0ZW1OYW1lKCJmbG91ciIpOw0KLQ0KLSAgICAgICAgICAgIE11bHRpcGxlUGFyYW1ldGVyc0FkZEl0ZW1SZXNwb25zZSByZXMgPQ0KLSAgICAgICAgICAgICAgICBzdHViLk11bHRpcGxlUGFyYW1ldGVyc0FkZEl0ZW0ocmVxKTsNCi0NCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4ocmVzLmdldEl0ZW1JZCgpKTsNCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4ocmVzLmdldFN1Y2Nlc3NmdWxBZGQoKSk7DQotICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKXsNCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG5cblxuIik7DQotICAgICAgICB9DQotICAgIH0NCi19DQotPC9wcmU+DQotPHA+Tm93IGl0J3MgdGltZSB0byBjb21waWxlIHRoZSBjbGllbnQuIEZvciB0aGUgZ2VuZXJhdGVkIGZpbGVzIHRvDQotYmUgZm91bmQsIHRoZXkgbmVlZCB0byBiZSBpbiB0aGUgc291cmNlIGRpcmVjdG9yeSwgc28gY29weSB0aGUgb3JnDQotZmlsZSB0byB0aGUgc3JjIGRpcmVjdG9yeS48L3A+DQotPHA+Q29tcGlsZSB0aGUgZmlyc3Qgc2V0IG9mIGNsYXNzZXMgYnkgdHlwaW5nOiA8Y29kZT5hbnQNCi1qYXIuY2xpZW50PC9jb2RlPjwvcD4NCi08cD5UaGlzIGFjdGlvbiBjb21waWxlcyBtb3N0IG9mIHRoZSBhdmFpbGFibGUgY2xhc3NlcywgYnV0IG5vdA0KLWV2ZXJ5dGhpbmcuIEZvcnR1bmF0ZWx5LCBpdCBkb2VzIGNvbXBpbGUgdGhlIGNsYXNzZXMgbmVlZGVkIGJ5IHRoZQ0KLUppQlggY29tcGlsZXIsIHNvIHlvdSBjYW4gbm93IGdlbmVyYXRlIHRoZSBhY3R1YWwgSmlCWCByZXNvdXJjZXMuDQotQ2hhbmdlIHRvIHRoZSBidWlsZC9jbGFzc2VzIGRpcmVjdG9yeSBhbmQgcnVuIHRoZSBKaUJYDQotY29tcGlsZXI6PC9wPg0KLTxwcmU+DQotamF2YSAtamFyIEM6XGFwcHNcYXhpczJcbGliXGppYngtYmluZC5qYXIgLi5cLi5cb3JnXGFwYWNoZVxheGlzMlxheGlzMnVzZXJndWlkZVxiaW5kaW5nLnhtbA0KLTwvcHJlPg0KLTxwPk5vdyB0aGF0IHlvdSBoYXZlIHRoZSBuZXcgZmlsZXMgaW4gcGxhY2UsIHJlLXJ1biB0aGUgQW50IHRhc2sgdG8NCi1nZW5lcmF0ZSB0aGUgY2xpZW50OiA8Y29kZT5hbnQgamFyLmNsaWVudDwvY29kZT48L3A+DQotPHA+VGhpcyBhY3Rpb24gYWRkcyBhbGwgdGhlIGFwcHJvcHJpYXRlIGZpbGVzIHRvIHRoZQ0KLWJ1aWxkL2xpYi9BeGlzMlVzZXJHdWlkZVNlcnZpY2UtdGVzdC1jbGllbnQuamFyIGZpbGUsIHNvIGFkZCB0aGF0DQotLmphciBmaWxlIHRvIHlvdXIgQ0xBU1NQQVRIIGFuZCBydW4gdGhlIGNsaWVudCBieSB0eXBpbmc6IGphdmENCi1vcmcuYXBhY2hlLmF4aXMyLmF4aXMydXNlcmd1aWRlLkNsaWVudDwvcD4NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC91c2VyZ3VpZGUtY3JlYXRpbmdjbGllbnRzLXhtbGJlYW5zLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC91c2VyZ3VpZGUtY3JlYXRpbmdjbGllbnRzLXhtbGJlYW5zLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDMwM2M0MS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvdXNlcmd1aWRlLWNyZWF0aW5nY2xpZW50cy14bWxiZWFucy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi0NCi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIg0KLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+DQotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPg0KLTxoZWFkPg0KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0NCi0iSFRNTCBUaWR5IGZvciBXaW5kb3dzICh2ZXJzIDE0IEp1bmUgMjAwNyksIHNlZSB3d3cudzMub3JnIiAvPg0KLTxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0iIiAvPg0KLTx0aXRsZT5HZW5lcmF0aW5nIGEgV2ViIFNlcnZpY2UgQ2xpZW50IHVzaW5nIEF4aXMyIGFuZA0KLVhtbEJlYW5zPC90aXRsZT4NCi08bGluayBocmVmPSIuLi9jc3MvYXhpcy1kb2NzLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyINCi1tZWRpYT0iYWxsIiAvPg0KLTwvaGVhZD4NCi08Ym9keT4NCi08aDEgY2xhc3M9InRpdGxlIj5HZW5lcmF0aW5nIGEgV2ViIFNlcnZpY2UgQ2xpZW50IHVzaW5nIEFwYWNoZQ0KLUF4aXMyIGFuZCBYTUxCZWFuczwvaDE+DQotPHA+VGhpcyBkb2N1bWVudCBleHBsYWlucyBob3cgdG8gZ2VuZXJhdGUgYSBXZWIgc2VydmljZSBjbGllbnQNCi11c2luZyBBcGFjaGUgQXhpczIgYW5kIFhNTEJlYW5zIGRhdGEgYmluZGluZy4gVGhlIHNlcnZpY2UgaGFzIHRoZQ0KLWZvbGxvd2luZyBXU0RMOjwvcD4NCi08cD48Yj5Db2RlIExpc3RpbmcgMTogVGhlIFdTREwgZmlsZTwvYj48L3A+DQotPHByZT4NCi0mbHQ7P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Jmd0Ow0KLSZsdDt3c2RsOmRlZmluaXRpb25zDQotICAgeG1sbnM6YXBhY2hlc29hcD0iaHR0cDovL3htbC5hcGFjaGUub3JnL3htbC1zb2FwIg0KLSAgIHhtbG5zOmltcGw9Imh0dHA6Ly9hcGFjaGUub3JnL2F4aXMyL0F4aXMyVXNlckd1aWRlIg0KLSAgIHhtbG5zOmludGY9Imh0dHA6Ly9hcGFjaGUub3JnL2F4aXMyL0F4aXMyVXNlckd1aWRlIg0KLSAgIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIg0KLSAgIHhtbG5zOndzZGxzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIg0KLSAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiDQotICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vYXBhY2hlLm9yZy9heGlzMi9BeGlzMlVzZXJHdWlkZSImZ3Q7DQotDQotICAmbHQ7d3NkbDp0eXBlcyZndDsNCi0gICAgJmx0O3NjaGVtYQ0KLSAgICAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCINCi0gICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vYXBhY2hlLm9yZy9heGlzMi9BeGlzMlVzZXJHdWlkZSINCi0gICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiZndDsNCi0gICAgICANCi0gICAgICAmbHQ7IS0tIEVMRU1FTlRTIC0tJmd0Ow0KLSAgICAgIA0KLSAgICAgICZsdDtlbGVtZW50IG5hbWU9IkRvSW5Pbmx5UmVxdWVzdCImZ3Q7DQotICAgICAgICAmbHQ7Y29tcGxleFR5cGUmZ3Q7DQotICAgICAgICAgICZsdDtzZXF1ZW5jZSZndDsNCi0gICAgICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJtZXNzYWdlU3RyaW5nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8mZ3Q7DQotICAgICAgICAgICZsdDsvc2VxdWVuY2UmZ3Q7DQotICAgICAgICAmbHQ7L2NvbXBsZXhUeXBlJmd0Ow0KLSAgICAgICZsdDsvZWxlbWVudCZndDsNCi0gICAgICANCi0gICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJUd29XYXlPbmVQYXJhbWV0ZXJFY2hvUmVxdWVzdCImZ3Q7DQotICAgICAgICAmbHQ7Y29tcGxleFR5cGUmZ3Q7DQotICAgICAgICAgICZsdDtzZXF1ZW5jZSZndDsNCi0gICAgICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJlY2hvU3RyaW5nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8mZ3Q7DQotICAgICAgICAgICZsdDsvc2VxdWVuY2UmZ3Q7DQotICAgICAgICAmbHQ7L2NvbXBsZXhUeXBlJmd0Ow0KLSAgICAgICZsdDsvZWxlbWVudCZndDsNCi0gICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJUd29XYXlPbmVQYXJhbWV0ZXJFY2hvUmVzcG9uc2UiJmd0Ow0KLSAgICAgICAgJmx0O2NvbXBsZXhUeXBlJmd0Ow0KLSAgICAgICAgICAmbHQ7c2VxdWVuY2UmZ3Q7DQotICAgICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0iZWNob1N0cmluZyIgdHlwZT0ieHNkOnN0cmluZyIvJmd0Ow0KLSAgICAgICAgICAmbHQ7L3NlcXVlbmNlJmd0Ow0KLSAgICAgICAgJmx0Oy9jb21wbGV4VHlwZSZndDsNCi0gICAgICAmbHQ7L2VsZW1lbnQmZ3Q7DQotICAgICAgDQotICAgICAgJmx0O2VsZW1lbnQgbmFtZT0iTm9QYXJhbWV0ZXJzUmVxdWVzdCImZ3Q7DQotICAgICAgICAmbHQ7Y29tcGxleFR5cGUvJmd0Ow0KLSAgICAgICZsdDsvZWxlbWVudCZndDsNCi0gICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJOb1BhcmFtZXRlcnNSZXNwb25zZSImZ3Q7DQotICAgICAgICAmbHQ7Y29tcGxleFR5cGUvJmd0Ow0KLSAgICAgICZsdDsvZWxlbWVudCZndDsNCi0gICAgICANCi0gICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJNdWx0aXBsZVBhcmFtZXRlcnNBZGRJdGVtUmVxdWVzdCImZ3Q7DQotICAgICAgICAmbHQ7Y29tcGxleFR5cGUmZ3Q7DQotICAgICAgICAgICZsdDtzZXF1ZW5jZSZndDsNCi0gICAgICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJpdGVtSWQiIHR5cGU9InhzZDppbnQiLyZndDsNCi0gICAgICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJpdGVtTmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvJmd0Ow0KLSAgICAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9InByaWNlIiB0eXBlPSJ4c2Q6ZmxvYXQiLyZndDsNCi0gICAgICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvJmd0Ow0KLSAgICAgICAgICAmbHQ7L3NlcXVlbmNlJmd0Ow0KLSAgICAgICAgJmx0Oy9jb21wbGV4VHlwZSZndDsNCi0gICAgICAmbHQ7L2VsZW1lbnQmZ3Q7DQotDQotICAgICAgJmx0O2VsZW1lbnQgbmFtZT0iTXVsdGlwbGVQYXJhbWV0ZXJzQWRkSXRlbVJlc3BvbnNlIiZndDsNCi0gICAgICAgICZsdDtjb21wbGV4VHlwZSZndDsNCi0gICAgICAgICAgJmx0O3NlcXVlbmNlJmd0Ow0KLSAgICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJpdGVtSWQiIHR5cGU9InhzZDppbnQiLyZndDsNCi0gICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0ic3VjY2Vzc2Z1bEFkZCIgdHlwZT0ieHNkOmJvb2xlYW4iLyZndDsNCi0gICAgICAgICAgJmx0Oy9zZXF1ZW5jZSZndDsNCi0gICAgICAgICZsdDsvY29tcGxleFR5cGUmZ3Q7DQotICAgICAgJmx0Oy9lbGVtZW50Jmd0Ow0KLQ0KLSAgICAmbHQ7L3NjaGVtYSZndDsNCi0gICZsdDsvd3NkbDp0eXBlcyZndDsNCi0NCi0gIA0KLSAgJmx0OyEtLSBNRVNTQUdFUyAtLSZndDsNCi0NCi0gICZsdDt3c2RsOm1lc3NhZ2UgbmFtZT0iRG9Jbk9ubHlSZXF1ZXN0TWVzc2FnZSImZ3Q7DQotICAgICZsdDt3c2RsOnBhcnQgbmFtZT0iaW5wdXQiIGVsZW1lbnQ9ImltcGw6RG9Jbk9ubHlSZXF1ZXN0Ii8mZ3Q7DQotICAmbHQ7L3dzZGw6bWVzc2FnZSZndDsNCi0NCi0gICZsdDt3c2RsOm1lc3NhZ2UgbmFtZT0iVHdvV2F5T25lUGFyYW1ldGVyRWNob1JlcXVlc3RNZXNzYWdlIiZndDsNCi0gICAgJmx0O3dzZGw6cGFydCBuYW1lPSJpbnB1dCIgZWxlbWVudD0iaW1wbDpUd29XYXlPbmVQYXJhbWV0ZXJFY2hvUmVxdWVzdCIvJmd0Ow0KLSAgJmx0Oy93c2RsOm1lc3NhZ2UmZ3Q7DQotICAmbHQ7d3NkbDptZXNzYWdlIG5hbWU9IlR3b1dheU9uZVBhcmFtZXRlckVjaG9SZXNwb25zZU1lc3NhZ2UiJmd0Ow0KLSAgICAmbHQ7d3NkbDpwYXJ0IG5hbWU9Im91dHB1dCIgZWxlbWVudD0iaW1wbDpUd29XYXlPbmVQYXJhbWV0ZXJFY2hvUmVzcG9uc2UiLyZndDsNCi0gICZsdDsvd3NkbDptZXNzYWdlJmd0Ow0KLQ0KLSAgJmx0O3dzZGw6bWVzc2FnZSBuYW1lPSJOb1BhcmFtZXRlcnNSZXF1ZXN0TWVzc2FnZSImZ3Q7DQotICAgICZsdDt3c2RsOnBhcnQgbmFtZT0iaW5wdXQiIGVsZW1lbnQ9ImltcGw6Tm9QYXJhbWV0ZXJzUmVxdWVzdCIvJmd0Ow0KLSAgJmx0Oy93c2RsOm1lc3NhZ2UmZ3Q7DQotICAmbHQ7d3NkbDptZXNzYWdlIG5hbWU9Ik5vUGFyYW1ldGVyc1Jlc3BvbnNlTWVzc2FnZSImZ3Q7DQotICAgICZsdDt3c2RsOnBhcnQgbmFtZT0ib3V0cHV0IiBlbGVtZW50PSJpbXBsOk5vUGFyYW1ldGVyc1Jlc3BvbnNlIi8mZ3Q7DQotICAmbHQ7L3dzZGw6bWVzc2FnZSZndDsNCi0NCi0gICZsdDt3c2RsOm1lc3NhZ2UgbmFtZT0iTXVsdGlwbGVQYXJhbWV0ZXJzQWRkSXRlbVJlcXVlc3RNZXNzYWdlIiZndDsNCi0gICAgJmx0O3dzZGw6cGFydCBuYW1lPSJpbnB1dCIgZWxlbWVudD0iaW1wbDpNdWx0aXBsZVBhcmFtZXRlcnNBZGRJdGVtUmVxdWVzdCIvJmd0Ow0KLSAgJmx0Oy93c2RsOm1lc3NhZ2UmZ3Q7DQotICAmbHQ7d3NkbDptZXNzYWdlIG5hbWU9Ik11bHRpcGxlUGFyYW1ldGVyc0FkZEl0ZW1SZXNwb25zZU1lc3NhZ2UiJmd0Ow0KLSAgICAmbHQ7d3NkbDpwYXJ0IG5hbWU9Im91dHB1dCIgZWxlbWVudD0iaW1wbDpNdWx0aXBsZVBhcmFtZXRlcnNBZGRJdGVtUmVzcG9uc2UiLyZndDsNCi0gICZsdDsvd3NkbDptZXNzYWdlJmd0Ow0KLQ0KLQ0KLSAgJmx0OyEtLSBQb3J0IHR5cGUgKG9wZXJhdGlvbnMpIC0tJmd0Ow0KLQ0KLSAgJmx0O3dzZGw6cG9ydFR5cGUgbmFtZT0iQXhpczJVc2VyR3VpZGVQb3J0VHlwZSImZ3Q7DQotDQotICAgICZsdDt3c2RsOm9wZXJhdGlvbiBuYW1lPSJEb0luT25seSIgcGFyYW1ldGVyT3JkZXI9ImlucHV0IiZndDsNCi0gICAgICAmbHQ7d3NkbDppbnB1dCBuYW1lPSJEb0luT25seVJlcXVlc3RNZXNzYWdlIg0KLSAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9ImltcGw6RG9Jbk9ubHlSZXF1ZXN0TWVzc2FnZSIvJmd0Ow0KLSAgICAmbHQ7L3dzZGw6b3BlcmF0aW9uJmd0Ow0KLQ0KLSAgICAmbHQ7d3NkbDpvcGVyYXRpb24gbmFtZT0iVHdvV2F5T25lUGFyYW1ldGVyRWNobyIgcGFyYW1ldGVyT3JkZXI9ImlucHV0IiZndDsNCi0gICAgICAmbHQ7d3NkbDppbnB1dCBuYW1lPSJUd29XYXlPbmVQYXJhbWV0ZXJFY2hvUmVxdWVzdE1lc3NhZ2UiDQotICAgICAgICAgICAgICAgICAgbWVzc2FnZT0iaW1wbDpUd29XYXlPbmVQYXJhbWV0ZXJFY2hvUmVxdWVzdE1lc3NhZ2UiLyZndDsNCi0gICAgICAmbHQ7d3NkbDpvdXRwdXQgbmFtZT0iVHdvV2F5T25lUGFyYW1ldGVyRWNob1Jlc3BvbnNlTWVzc2FnZSINCi0gICAgICAgICAgICAgICAgICBtZXNzYWdlPSJpbXBsOlR3b1dheU9uZVBhcmFtZXRlckVjaG9SZXNwb25zZU1lc3NhZ2UiLyZndDsNCi0gICAgJmx0Oy93c2RsOm9wZXJhdGlvbiZndDsNCi0NCi0gICAgJmx0O3dzZGw6b3BlcmF0aW9uIG5hbWU9Ik5vUGFyYW1ldGVycyIgcGFyYW1ldGVyT3JkZXI9ImlucHV0IiZndDsNCi0gICAgICAmbHQ7d3NkbDppbnB1dCBuYW1lPSJOb1BhcmFtZXRlcnNSZXF1ZXN0TWVzc2FnZSINCi0gICAgICAgICAgICAgICAgICBtZXNzYWdlPSJpbXBsOk5vUGFyYW1ldGVyc1JlcXVlc3RNZXNzYWdlIi8mZ3Q7DQotICAgICAgJmx0O3dzZGw6b3V0cHV0IG5hbWU9Ik5vUGFyYW1ldGVyc1Jlc3BvbnNlTWVzc2FnZSINCi0gICAgICAgICAgICAgICAgICAgbWVzc2FnZT0iaW1wbDpOb1BhcmFtZXRlcnNSZXNwb25zZU1lc3NhZ2UiLyZndDsNCi0gICAgJmx0Oy93c2RsOm9wZXJhdGlvbiZndDsNCi0NCi0gICAgJmx0O3dzZGw6b3BlcmF0aW9uIG5hbWU9Ik11bHRpcGxlUGFyYW1ldGVyc0FkZEl0ZW0iIHBhcmFtZXRlck9yZGVyPSJpbnB1dCImZ3Q7DQotICAgICAgJmx0O3dzZGw6aW5wdXQgbmFtZT0iTXVsdGlwbGVQYXJhbWV0ZXJzQWRkSXRlbVJlcXVlc3RNZXNzYWdlIg0KLSAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9ImltcGw6TXVsdGlwbGVQYXJhbWV0ZXJzQWRkSXRlbVJlcXVlc3RNZXNzYWdlIi8mZ3Q7DQotICAgICAgJmx0O3dzZGw6b3V0cHV0IG5hbWU9Ik11bHRpcGxlUGFyYW1ldGVyc0FkZEl0ZW1SZXNwb25zZU1lc3NhZ2UiDQotICAgICAgICAgICAgICAgICAgbWVzc2FnZT0iaW1wbDpNdWx0aXBsZVBhcmFtZXRlcnNBZGRJdGVtUmVzcG9uc2VNZXNzYWdlIi8mZ3Q7DQotICAgICZsdDsvd3NkbDpvcGVyYXRpb24mZ3Q7DQotDQotICAmbHQ7L3dzZGw6cG9ydFR5cGUmZ3Q7DQotDQotDQotICAmbHQ7IS0tIEJJTkRJTkcgKGJpbmQgb3BlcmF0aW9ucykgLS0mZ3Q7DQotICAmbHQ7d3NkbDpiaW5kaW5nDQotICAgICBuYW1lPSJBeGlzMlVzZXJHdWlkZVNvYXBCaW5kaW5nIg0KLSAgICAgdHlwZT0iaW1wbDpBeGlzMlVzZXJHdWlkZVBvcnRUeXBlIiZndDsNCi0gICAgJmx0O3dzZGxzb2FwOmJpbmRpbmcgc3R5bGU9ImRvY3VtZW50IiB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIvJmd0Ow0KLQ0KLSAgICAmbHQ7d3NkbDpvcGVyYXRpb24gbmFtZT0iRG9Jbk9ubHkiJmd0Ow0KLSAgICAgICZsdDt3c2Rsc29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iRG9Jbk9ubHkiLyZndDsNCi0gICAgICAmbHQ7d3NkbDppbnB1dCZndDsNCi0gICAgICAgICZsdDt3c2Rsc29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvJmd0Ow0KLSAgICAgICZsdDsvd3NkbDppbnB1dCZndDsNCi0gICAgJmx0Oy93c2RsOm9wZXJhdGlvbiZndDsNCi0NCi0gICAgJmx0O3dzZGw6b3BlcmF0aW9uIG5hbWU9IlR3b1dheU9uZVBhcmFtZXRlckVjaG8iJmd0Ow0KLSAgICAgICZsdDt3c2Rsc29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iVHdvV2F5T25lUGFyYW1ldGVyRWNobyIvJmd0Ow0KLSAgICAgICZsdDt3c2RsOmlucHV0Jmd0Ow0KLSAgICAgICAgJmx0O3dzZGxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8mZ3Q7DQotICAgICAgJmx0Oy93c2RsOmlucHV0Jmd0Ow0KLSAgICAgICZsdDt3c2RsOm91dHB1dCZndDsNCi0gICAgICAgICZsdDt3c2Rsc29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvJmd0Ow0KLSAgICAgICZsdDsvd3NkbDpvdXRwdXQmZ3Q7DQotICAgICZsdDsvd3NkbDpvcGVyYXRpb24mZ3Q7DQotDQotICAgICZsdDt3c2RsOm9wZXJhdGlvbiBuYW1lPSJOb1BhcmFtZXRlcnMiJmd0Ow0KLSAgICAgICZsdDt3c2Rsc29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iTm9QYXJhbWV0ZXJzIi8mZ3Q7DQotICAgICAgJmx0O3dzZGw6aW5wdXQmZ3Q7DQotICAgICAgICAmbHQ7d3NkbHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLyZndDsNCi0gICAgICAmbHQ7L3dzZGw6aW5wdXQmZ3Q7DQotICAgICAgJmx0O3dzZGw6b3V0cHV0Jmd0Ow0KLSAgICAgICAgJmx0O3dzZGxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8mZ3Q7DQotICAgICAgJmx0Oy93c2RsOm91dHB1dCZndDsNCi0gICAgJmx0Oy93c2RsOm9wZXJhdGlvbiZndDsNCi0NCi0gICAgJmx0O3dzZGw6b3BlcmF0aW9uIG5hbWU9Ik11bHRpcGxlUGFyYW1ldGVyc0FkZEl0ZW0iJmd0Ow0KLSAgICAgICZsdDt3c2Rsc29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iTXVsdGlwbGVQYXJhbWV0ZXJzQWRkSXRlbSIvJmd0Ow0KLSAgICAgICZsdDt3c2RsOmlucHV0Jmd0Ow0KLSAgICAgICAgJmx0O3dzZGxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8mZ3Q7DQotICAgICAgJmx0Oy93c2RsOmlucHV0Jmd0Ow0KLSAgICAgICZsdDt3c2RsOm91dHB1dCZndDsNCi0gICAgICAgICZsdDt3c2Rsc29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvJmd0Ow0KLSAgICAgICZsdDsvd3NkbDpvdXRwdXQmZ3Q7DQotICAgICZsdDsvd3NkbDpvcGVyYXRpb24mZ3Q7DQotICAmbHQ7L3dzZGw6YmluZGluZyZndDsNCi0NCi0NCi0gICZsdDshLS0gU0VSVklDRSAtLSZndDsNCi0NCi0gICZsdDt3c2RsOnNlcnZpY2UgbmFtZT0iQXhpczJVc2VyR3VpZGVTZXJ2aWNlIiZndDsNCi0gICAgJmx0O3dzZGw6cG9ydCBiaW5kaW5nPSJpbXBsOkF4aXMyVXNlckd1aWRlU29hcEJpbmRpbmciDQotICAgICAgICAgICAgICAgbmFtZT0iQXhpczJVc2VyR3VpZGUiJmd0Ow0KLSAgICAgICZsdDt3c2Rsc29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjgwODAvYXhpczIvc2VydmljZXMvQXhpczJVc2VyR3VpZGUiLyZndDsNCi0gICAgJmx0Oy93c2RsOnBvcnQmZ3Q7DQotICAmbHQ7L3dzZGw6c2VydmljZSZndDsNCi0mbHQ7L3dzZGw6ZGVmaW5pdGlvbnMmZ3Q7DQotPC9wcmU+DQotPHA+Tm90ZSB0aGF0IHRoZSBkb2N1bWVudCBkZWZpbmVzIGZvdXIgb3BlcmF0aW9ucywgRG9Jbk9ubHksDQotTm9QYXJhbWV0ZXJzLCBUd29XYXlPbmVQYXJhbWV0ZXJFY2hvLCBhbmQNCi1NdWx0aXBsZVBhcmFtZXRlcnNBZGRJdGVtLiBFYWNoIGNsaWVudCB3aWxsIGluY2x1ZGUgbWV0aG9kcyBmb3INCi1jYWxsaW5nIGVhY2ggb2YgdGhlc2Ugb3BlcmF0aW9ucy48L3A+DQotPHA+KEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIFdTREwsIHJlZmVyIHRvOiA8YSBocmVmPQ0KLSJodHRwOi8vd3d3LnczLm9yZy8yMDAyL3dzL2Rlc2MvIj5odHRwOi8vd3d3LnczLm9yZy8yMDAyL3dzL2Rlc2MvPC9hPg0KLS4pPC9wPg0KLTxwPjxiPlRoZSBzaG9ydCBzdG9yeTo8L2I+PC9wPg0KLTxvbD4NCi08bGk+PGEgaHJlZj0NCi0iaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvZG93bmxvYWQvMV8xL2Rvd25sb2FkLmNnaSNzdGQtYmluIj5Eb3dubG9hZDwvYT4NCi1hbmQgdW5wYWNrIHRoZSBBcGFjaGUgQXhpczIgU3RhbmRhcmQgRGlzdHJpYnV0aW9uLCBpZiB5b3UgaGF2ZSBub3QNCi1kb25lIHNvIGFscmVhZHkuPC9saT4NCi08bGk+Q3JlYXRlIHRoZSBjbGllbnQgY2xhc3NlcyB3aXRoIHRoZSBmb2xsb3dpbmcgY29tbWFuZDo8YnIgLz4NCi08cHJlPg0KLSVBWElTMl9IT01FJVxiaW5cV1NETDJKYXZhIC11cmkgQXhpczJVc2VyR3VpZGUud3NkbCAtcCBvcmcuYXBhY2hlLmF4aXMyLmF4aXMydXNlcmd1aWRlIC1kIHhtbGJlYW5zIC1zDQotPC9wcmU+PC9saT4NCi08bGk+Q3JlYXRlIHRoZSBjbGllbnQgKGZvciBleGFtcGxlLCBDbGllbnQuamF2YSkgYW5kIHNhdmUgaXQgaW4gdGhlDQotb3JnL2FwYWNoZS9heGlzMi9heGlzMnVzZXJndWlkZSBkaXJlY3RvcnkuPC9saT4NCi08bGk+QnVpbGQgdGhlIGNsaWVudCBieSB0eXBpbmc6IDxjb2RlPmFudCBqYXIuY2xpZW50LjwvY29kZT48L2xpPg0KLTxsaT5NYWtlIHN1cmUgYWxsIHRoZSAuamFyIGZpbGVzIGluIHRoZSBBeGlzMiBsaWIgZGlyZWN0b3J5IGFyZSBpbg0KLXRoZSBDTEFTU1BBVEguPC9saT4NCi08bGk+QXNzdW1pbmcgeW91IGhhdmUgYSBjb3JyZXNwb25kaW5nIHNlcnZpY2UsIHJ1biB0aGUgY2xpZW50IGJ5DQotYWRkaW5nIHRoZSBnZW5lcmF0ZWQgQXhpczJVc2VyR3VpZGVTZXJ2aWNlLXRlc3QtY2xpZW50LmphciBmaWxlIGluDQotYnVpbGQvbGliIHRvIHRoZSBDTEFTU1BBVEggYW5kIHR5cGU6IDxjb2RlPmphdmENCi1vcmcuYXBhY2hlLmF4aXMyLmF4aXMydXNlcmd1aWRlLkNsaWVudDwvY29kZT48L2xpPg0KLTwvb2w+DQotPHA+PGI+VGhlIGxvbmcgc3Rvcnk6PC9iPjwvcD4NCi08cD48YSBocmVmPQ0KLSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi9kb3dubG9hZC8xXzEvZG93bmxvYWQuY2dpI3N0ZC1iaW4iPkRvd25sb2FkPC9hPg0KLWFuZCB1bnBhY2sgdGhlIEFwYWNoZSBBeGlzMiBTdGFuZGFyZCBEaXN0cmlidXRpb24sIGlmIHlvdSBoYXZlIG5vdA0KLWRvbmUgc28gYWxyZWFkeS4gVGhlIDxhIGhyZWY9DQotImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL2Rvd25sb2FkLzFfMS9kb3dubG9hZC5jZ2kjd2FyIj5XQVINCi1kaXN0cmlidXRpb248L2E+IGRvZXMgbm90IGluY2x1ZGUgdGhlIG5lY2Vzc2FyeSB1dGlsaXRpZXMgZm9yDQotZ2VuZXJhdGluZyBjb2RlLCBzdWNoIGFzIFdTREwySmF2YS48L3A+DQotPHA+VGhlIFhNTEJlYW5zIG1ldGhvZCBvZiBnZW5lcmF0aW5nIGNsaWVudHMsIHVubGlrZSBBREIsIGNyZWF0ZXMNCi1pbmRpdmlkdWFsIGNsYXNzZXMgZm9yIGVhY2ggb2JqZWN0IGl0IG11c3QgbW9kZWwuIEZvciBleGFtcGxlLA0KLWdlbmVyYXRpbmcgYSBjbGllbnQgZm9yIHRoaXMgV1NETCBmaWxlIGNyZWF0ZWQgNjQyIGZpbGVzIGFuZA0KLWZvbGRlcnMuIEEgc21hbGwgbnVtYmVyIG9mIHRoZXNlIGZpbGVzIGFyZSBkaXJlY3RseSByZWxhdGVkIHRvIHRoZQ0KLWFjdHVhbCBjbGllbnQgeW91J3JlIGNyZWF0aW5nLiBUaGUgcmVzdCBhcmUgcmVsYXRlZCB0byB0aGUNCi1wcm9jZXNzaW5nIG9mIFhNTCwgYW5kIGluY2x1ZGUgZGF0YSBib3VuZCBvYmplY3RzIGZvciBzY2hlbWFzLA0KLWVuY29kaW5ncywgYW5kIG90aGVyIG9iamVjdHMgbmVlZGVkIHRvIHByb2Nlc3MgbWVzc2FnZXMuPC9wPg0KLTxwPlRvIGdlbmVyYXRlIHRoZSBjbGllbnQsIGlzc3VlIHRoZSBmb2xsb3dpbmcgY29tbWFuZCBpbiBMaXN0aW5nDQotMi48L3A+DQotPHA+PGI+Q29kZSBMaXN0aW5nIDIuIEdlbmVyYXRpbmcgdGhlIGNsaWVudDwvYj48L3A+DQotPHByZT4NCi0lQVhJUzJfSE9NRSVcYmluXFdTREwySmF2YSAtdXJpIEF4aXMyVXNlckd1aWRlLndzZGwgLXAgb3JnLmFwYWNoZS5heGlzMi5heGlzMnVzZXJndWlkZSAtZCB4bWxiZWFucyAtcw0KLTwvcHJlPg0KLTxwPlRoaXMgY29tbWFuZCBhbmFseXplcyB0aGUgV1NETCBmaWxlIGFuZCBjcmVhdGVzIHRoZSBzdHVicyBpbiB0aGUNCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuYXhpczJ1c2VyZ3VpZGUuIFRoZSBvcHRpb25zIHNwZWNpZnkgdGhhdA0KLXlvdSB3YW50IHRoZSBYTUxCZWFucyBkYXRhIGJpbmRpbmcgbWV0aG9kICgtZCksIGFuZCBzeW5jaHJvbm91cyBvcg0KLWJsb2NraW5nIG1ldGhvZHMgKC1zKS4gSW4gb3RoZXIgd29yZHMsIHdoZW4gdGhlIGNsaWVudCBtYWtlcyBhbg0KLUluLU91dCBjYWxsIHRvIHRoZSBzZXJ2aWNlLCBpdCB3aWxsIHdhaXQgZm9yIGEgcmVzcG9uc2UgYmVmb3JlDQotY29udGludWluZy48L3A+DQotPHA+T25jZSB5b3UgcnVuIHRoaXMgY29tbWFuZCwgeW91IHdpbGwgc2VlIHNldmVyYWwgbmV3IGl0ZW1zIGluIHRoZQ0KLWRpcmVjdG9yeS4gVGhlIGZpcnN0IGlzIHRoZSBidWlsZC54bWwgZmlsZSwgd2hpY2ggY29udGFpbnMgdGhlDQotaW5zdHJ1Y3Rpb25zIGZvciA8YSBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvIj5BbnQ8L2E+IHRvDQotY29tcGlsZSB0aGUgZ2VuZXJhdGVkIGNsYXNzZXMuIFRoZSBzZWNvbmQgaXMgdGhlIHNyYyBkaXJlY3RvcnksDQotd2hpY2ggY29udGFpbnMgYWxsIHRoZSBnZW5lcmF0ZWQgY2xhc3Nlcy4gVGhlIHRoaXJkIGlzIHRoZQ0KLXJlc291cmNlcyBkaXJlY3RvcnksIHdoaWNoIGluY2x1ZGVzIGZpbGVzIHJlbGF0ZWQgdG8gdGhlIGFjdHVhbA0KLWRhdGEgYmluZGluZyBwcm9jZXNzLjwvcD4NCi08cD5Ob3cgeW91IG5lZWQgYSBjbGllbnQuIFRvIGNyZWF0ZSBhIGNsaWVudCwgY3JlYXRlIGEgbmV3IGNsYXNzDQotYW5kIHNhdmUgaXQgYXMgQ2xpZW50LmphdmEgaW4gdGhlIG9yZy9hcGFjaGUvYXhpczIvYXhpczJ1c2VyZ3VpZGUNCi1kaXJlY3RvcnkuIEl0IHNob3VsZCBjb250YWluIHRoZSBmb2xsb3dpbmcgY29kZSBpbiBMaXN0aW5nIDMuPC9wPg0KLTxwPjxiPkNvZGUgTGlzdGluZyAzOiBDbGllbnQuamF2YTwvYj48L3A+DQotPHByZT4NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuYXhpczJ1c2VyZ3VpZGU7DQotDQotcHVibGljIGNsYXNzIENsaWVudHsNCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oamF2YS5sYW5nLlN0cmluZyBhcmdzW10pew0KLSAgICAgICAgdHJ5ew0KLSAgICAgICAgICAgIEF4aXMyVXNlckd1aWRlU2VydmljZVN0dWIgc3R1YiA9DQotICAgICAgICAgICAgICAgIG5ldyBBeGlzMlVzZXJHdWlkZVNlcnZpY2VTdHViDQotICAgICAgICAgICAgICAgICgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2F4aXMyL3NlcnZpY2VzL0F4aXMyVXNlckd1aWRlU2VydmljZSIpOw0KLQ0KLSAgICAgICAgICAgIGRvSW5Pbmx5KHN0dWIpOw0KLSAgICAgICAgICAgIHR3b1dheU9uZVBhcmFtZXRlckVjaG8oc3R1Yik7DQotICAgICAgICAgICAgbm9QYXJhbWV0ZXJzKHN0dWIpOw0KLSAgICAgICAgICAgIG11bHRpcGxlUGFyYW1ldGVycyhzdHViKTsNCi0NCi0gICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpew0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcblxuXG4iKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICAvKiBmaXJlIGFuZCBmb3JnZXQgKi8NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGRvSW5Pbmx5KEF4aXMyVXNlckd1aWRlU2VydmljZVN0dWIgc3R1Yil7DQotICAgICAgICB0cnl7DQotICAgICAgICAgICAgRG9Jbk9ubHlSZXF1ZXN0RG9jdW1lbnQgcmVxID0NCi0gICAgICAgICAgICAgICAgRG9Jbk9ubHlSZXF1ZXN0RG9jdW1lbnQuRmFjdG9yeS5uZXdJbnN0YW5jZSgpOw0KLSAgICAgICAgICAgIERvSW5Pbmx5UmVxdWVzdERvY3VtZW50LkRvSW5Pbmx5UmVxdWVzdCBkYXRhID0NCi0gICAgICAgICAgICAgICAgcmVxLmFkZE5ld0RvSW5Pbmx5UmVxdWVzdCgpOw0KLQ0KLSAgICAgICAgICAgIGRhdGEuc2V0TWVzc2FnZVN0cmluZygiZmlyZSBhbmQgZm9yZ2V0IGl0ISIpOw0KLQ0KLSAgICAgICAgICAgIHN0dWIuRG9Jbk9ubHkocmVxKTsNCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImRvbmUiKTsNCi0gICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpew0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcblxuXG4iKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICAvKiB0d28gd2F5IGNhbGwvcmVjZWl2ZSAqLw0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdHdvV2F5T25lUGFyYW1ldGVyRWNobyhBeGlzMlVzZXJHdWlkZVNlcnZpY2VTdHViIHN0dWIpew0KLSAgICAgICAgdHJ5ew0KLSAgICAgICAgICAgIFR3b1dheU9uZVBhcmFtZXRlckVjaG9SZXF1ZXN0RG9jdW1lbnQgcmVxID0NCi0gICAgICAgICAgICAgICAgVHdvV2F5T25lUGFyYW1ldGVyRWNob1JlcXVlc3REb2N1bWVudC5GYWN0b3J5Lm5ld0luc3RhbmNlKCk7DQotICAgICAgICAgICAgVHdvV2F5T25lUGFyYW1ldGVyRWNob1JlcXVlc3REb2N1bWVudC5Ud29XYXlPbmVQYXJhbWV0ZXJFY2hvUmVxdWVzdCBkYXRhID0NCi0gICAgICAgICAgICAgICAgcmVxLmFkZE5ld1R3b1dheU9uZVBhcmFtZXRlckVjaG9SZXF1ZXN0KCk7DQotDQotICAgICAgICAgICAgZGF0YS5zZXRFY2hvU3RyaW5nKCJlY2hvISAuLi4gZWNobyEiKTsNCi0NCi0gICAgICAgICAgICBUd29XYXlPbmVQYXJhbWV0ZXJFY2hvUmVzcG9uc2VEb2N1bWVudCByZXMgPQ0KLSAgICAgICAgICAgICAgICBzdHViLlR3b1dheU9uZVBhcmFtZXRlckVjaG8ocmVxKTsNCi0NCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4ocmVzLmdldFR3b1dheU9uZVBhcmFtZXRlckVjaG9SZXNwb25zZSgpLmdldEVjaG9TdHJpbmcoKSk7DQotICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKXsNCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG5cblxuIik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgLyogTm8gcGFyYW1ldGVycyAqLw0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbm9QYXJhbWV0ZXJzKEF4aXMyVXNlckd1aWRlU2VydmljZVN0dWIgc3R1Yil7DQotICAgICAgICB0cnl7DQotICAgICAgICAgICAgTm9QYXJhbWV0ZXJzUmVxdWVzdERvY3VtZW50IHJlcSA9DQotICAgICAgICAgICAgICAgIE5vUGFyYW1ldGVyc1JlcXVlc3REb2N1bWVudC5GYWN0b3J5Lm5ld0luc3RhbmNlKCk7DQotICAgICAgICAgICAgTm9QYXJhbWV0ZXJzUmVxdWVzdERvY3VtZW50Lk5vUGFyYW1ldGVyc1JlcXVlc3QgZGF0YSA9DQotICAgICAgICAgICAgICAgIHJlcS5hZGROZXdOb1BhcmFtZXRlcnNSZXF1ZXN0KCk7DQotDQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHN0dWIuTm9QYXJhbWV0ZXJzKHJlcSkpOw0KLSAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSl7DQotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxuXG5cbiIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIC8qIG11bHRpcGxlIHBhcmFtZXRlcnMgKi8NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG11bHRpcGxlUGFyYW1ldGVycyhBeGlzMlVzZXJHdWlkZVNlcnZpY2VTdHViIHN0dWIpew0KLSAgICAgICAgdHJ5ew0KLSAgICAgICAgICAgIE11bHRpcGxlUGFyYW1ldGVyc0FkZEl0ZW1SZXF1ZXN0RG9jdW1lbnQgcmVxID0NCi0gICAgICAgICAgICAgICAgTXVsdGlwbGVQYXJhbWV0ZXJzQWRkSXRlbVJlcXVlc3REb2N1bWVudC5GYWN0b3J5Lm5ld0luc3RhbmNlKCk7DQotICAgICAgICAgICAgTXVsdGlwbGVQYXJhbWV0ZXJzQWRkSXRlbVJlcXVlc3REb2N1bWVudC4NCi0gICAgICAgICAgICAgICAgTXVsdGlwbGVQYXJhbWV0ZXJzQWRkSXRlbVJlcXVlc3QgZGF0YSA9DQotICAgICAgICAgICAgICAgIHJlcS5hZGROZXdNdWx0aXBsZVBhcmFtZXRlcnNBZGRJdGVtUmVxdWVzdCgpOw0KLQ0KLSAgICAgICAgICAgIGRhdGEuc2V0UHJpY2UoKGZsb2F0KTEuOTkpOw0KLSAgICAgICAgICAgIGRhdGEuc2V0SXRlbUlkKChpbnQpMjM4NzI5ODMpOw0KLSAgICAgICAgICAgIGRhdGEuc2V0RGVzY3JpcHRpb24oIk11c3QgaGF2ZSBmb3IgY29va2luZyIpOw0KLSAgICAgICAgICAgIGRhdGEuc2V0SXRlbU5hbWUoImZsb3VyIik7DQotDQotICAgICAgICAgICAgTXVsdGlwbGVQYXJhbWV0ZXJzQWRkSXRlbVJlc3BvbnNlRG9jdW1lbnQgcmVzID0NCi0gICAgICAgICAgICAgICAgc3R1Yi5NdWx0aXBsZVBhcmFtZXRlcnNBZGRJdGVtKHJlcSk7DQotICAgICAgICAgICAgTXVsdGlwbGVQYXJhbWV0ZXJzQWRkSXRlbVJlc3BvbnNlRG9jdW1lbnQuDQotICAgICAgICAgICAgICAgIE11bHRpcGxlUGFyYW1ldGVyc0FkZEl0ZW1SZXNwb25zZSBkYXRhUmVzID0NCi0gICAgICAgICAgICAgICAgcmVzLmdldE11bHRpcGxlUGFyYW1ldGVyc0FkZEl0ZW1SZXNwb25zZSgpOw0KLQ0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihkYXRhUmVzLmdldFN1Y2Nlc3NmdWxBZGQoKSk7DQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGRhdGFSZXMuZ2V0SXRlbUlkKCkpOw0KLSAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSl7DQotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxuXG5cbiIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KLTwvcHJlPg0KLTxwPlhNTEJlYW5zIHVzZXMgYSBkaWZmZXJlbnQgYXJjaGl0ZWN0dXJlIGZyb20gQURCLiBJbiBYTUxCZWFucywNCi1wcm9jZXNzaW5nIGNlbnRlcnMgYXJvdW5kIGRvY3VtZW50cywgd2hpY2ggYXJlIGNyZWF0ZWQgdGhyb3VnaCB0aGUNCi11c2Ugb2YgZmFjdG9yaWVzLCBhbmQgd2hpY2ggaW5jbHVkZSBpbm5lciBjbGFzc2VzIGZvciB0aGUgb2JqZWN0cw0KLXRoZXkgY29udGFpbi4gVGhlIHByb2Nlc3MgaXMgc3RpbGwgdGhlIHNhbWUgLS0geW91IGNyZWF0ZSBhDQotcmVxdWVzdCwgYW5kIHNlbmQgaXQgdXNpbmcgdGhlIHN0dWIgLS0gdGhlIGNvZGUgaXMganVzdCBhIGJpdCBtb3JlDQotY29tcGxleC48L3A+DQotPHA+VG8gYnVpbGQgdGhlIGNsaWVudCwgdHlwZTogPGNvZGU+YW50IGphci5jbGllbnQ8L2NvZGU+PC9wPg0KLTxwPlRoaXMgYWN0aW9uIGNyZWF0ZXMgdHdvIG5ldyBkaXJlY3RvcmllcywgYnVpbGQgYW5kIHRlc3QuIFRoZQ0KLXRlc3QgZGlyZWN0b3J5IHdpbGwgYmUgZW1wdHksIGJ1dCB0aGUgYnVpbGQgZGlyZWN0b3J5IHdpbGwgY29udGFpbg0KLXR3byB2ZXJzaW9ucyBvZiB0aGUgY2xpZW50LiBUaGUgZmlyc3QgdmVyc2lvbiBpbiB0aGUgbGliIGRpcmVjdG9yeQ0KLWNvbnNpc3RzIG9mIHR3byAuamFyIGZpbGVzLCBvbmUgY29udGFpbmluZyB0aGUgQ2xpZW50IGNsYXNzIGFuZCB0aGUNCi1zdHViIGltcGxlbWVudGF0aW9ucywgYW5kIHRoZSBvdGhlciBjb250YWluaW5nIHRoZSBYTUxCZWFucy1yZWxhdGVkDQotY2xhc3Nlcy4gVGhlIHNlY29uZCB2ZXJzaW9uIGluIHRoZSBjbGFzc2VzIGRpcmVjdG9yeSBjb25zaXN0cyBvZg0KLWp1c3QgdGhlIHJhdyBjbGFzc2VzLjwvcD4NCi08cD5NYWtlIHN1cmUgYWxsIHRoZSAuamFyIGZpbGVzIGluIHRoZSBBeGlzMiBsaWIgZGlyZWN0b3J5IGFyZSBvbg0KLXRoZSBjbGFzc3BhdGguPC9wPg0KLTxwPklmIHlvdSBoYXZlIGEgc2VydmljZSBjb3JyZXNwb25kaW5nIHRvIHRoaXMgY2xpZW50IChpZiB5b3UNCi1kb24ndCwgY2hlY2sgb3V0IHRoZSA8YSBocmVmPQ0KLSJ1c2VyZ3VpZGUtYnVpbGRpbmdzZXJ2aWNlcy5odG1sIj5CdWlsZGluZyBTZXJ2aWNlczwvYT4gZG9jdW1lbnQpDQoteW91IGNhbiBydW4gdGhlIGNsaWVudCBieSBhZGRpbmcgdGhlIHR3byAuamFyIGZpbGVzIHRvIHlvdXINCi1jbGFzc3BhdGggYW5kIHR5cGluZzoNCi08Y29kZT5qYXZhLm9yZy5hcGFjaGUuYXhpczIuYXhpczJ1c2VyZ3VpZGUuQ2xpZW50PC9jb2RlPjwvcD4NCi08cD5Zb3Ugc2hvdWxkIHNlZSB0aGUgcmVzcG9uc2UgaW4gYSBjb25zb2xlIHdpbmRvdyBvZiB5b3VyIHNlcnZsZXQNCi1jb250YWluZXIuIEl0IHNob3VsZCBsb29rIHNvbWV0aGluZyBsaWtlIHRoaXM6PC9wPg0KLTxwPjxpbWcgYWx0PQ0KLSJSZXNwb25zZSBpbiBhIGNvbnNvbGUgd2luZG93IG9mIHlvdXIgc2VydmxldCBjb250YWluZXIiIHNyYz0NCi0iaW1hZ2VzL2ZpZzA0LmpwZyIgLz48YnIgY2xlYXI9ImFsbCIgLz48L3A+DQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvdXNlcmd1aWRlLWNyZWF0aW5nY2xpZW50cy54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvdXNlcmd1aWRlLWNyZWF0aW5nY2xpZW50cy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1Yzc2NzAuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL3VzZXJndWlkZS1jcmVhdGluZ2NsaWVudHMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjQ3ICswLDAgQEAKLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iDQotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4NCi08aHRtbCBsYW5nPSJlbiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiI+DQotPGhlYWQ+DQotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PQ0KLSJIVE1MIFRpZHkgZm9yIFdpbmRvd3MgKHZlcnMgMTQgSnVuZSAyMDA3KSwgc2VlIHd3dy53My5vcmciIC8+DQotPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSIiIC8+DQotPHRpdGxlPkFwYWNoZSBBeGlzMiBVc2VyJ3MgR3VpZGUtIENyZWF0aW5nIENsaWVudHM8L3RpdGxlPg0KLTxsaW5rIGhyZWY9Ii4uL2Nzcy9heGlzLWRvY3MuY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIg0KLW1lZGlhPSJhbGwiIC8+DQotPC9oZWFkPg0KLTxib2R5Pg0KLTxhIG5hbWU9ImNyZWF0ZWNsaWVudHMiIGlkPSJjcmVhdGVjbGllbnRzIj48L2E+DQotPGgxPkFwYWNoZSBBeGlzMiBVc2VyJ3MgR3VpZGUgLSBDcmVhdGluZyBDbGllbnRzPC9oMT4NCi08cD5XaGVuIGl0IGNvbWVzIHRvIGNyZWF0aW5nIGEgV2ViIHNlcnZpY2UgY2xpZW50LCB5b3UgY2FuIGRvIGl0DQotbWFudWFsbHkgKHNlZSA8YSBocmVmPSJ1c2VyZ3VpZGUtYnVpbGRpbmdzZXJ2aWNlcy5odG1sIj5CdWlsZGluZw0KLVNlcnZpY2VzPC9hPiksIGJ1dCBpbiBtb3N0IGNhc2VzIHlvdSBoYXZlIGEgV2ViIFNlcnZpY2UgRGVzY3JpcHRpb24NCi1MYW5ndWFnZSAoV1NETCkgZGVmaW5pdGlvbiB0aGF0IGRlc2NyaWJlcyB0aGUgbWVzc2FnZXMgY2xpZW50cw0KLXNob3VsZCBzZW5kIGFuZCBleHBlY3QgdG8gcmVjZWl2ZS4gQXhpczIgcHJvdmlkZXMgc2V2ZXJhbCB3YXlzIHRvDQotdXNlIHRoaXMgZGVmaW5pdGlvbiB0byBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlIGEgY2xpZW50LjwvcD4NCi08aDI+Q29udGVudDwvaDI+DQotPHVsPg0KLTxsaT48YSBocmVmPSJ1c2VyZ3VpZGUuaHRtbCNpbnRybyI+SW50cm9kdWNpbmcgQXhpczI8L2E+PGJyIC8+DQotPHVsPg0KLTxsaT48YSBocmVmPSJ1c2VyZ3VpZGUuaHRtbCN3aGF0aXMiPldoYXQgaXMgQXhpczI/PC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9InVzZXJndWlkZS5odG1sI3VuZGVyaG9vZCI+V2hhdCdzIFVuZGVyIHRoZQ0KLWhvb2Q/PC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9InVzZXJndWlkZS5odG1sI2hhbmRsZXNzb2FwIj5Ib3cgQXhpczIgSGFuZGxlcyBTT0FQDQotTWVzc2FnZXM8L2E+PC9saT4NCi08bGk+PGEgaHJlZj0idXNlcmd1aWRlLmh0bWwjZGlzdHJpYnV0aW9ucyI+QXhpczINCi1EaXN0cmlidXRpb25zPC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9InVzZXJndWlkZS5odG1sI3NiZCI+VGhlIEF4aXMyIFN0YW5kYXJkIEJpbmFyeQ0KLURpc3RyaWJ1dGlvbjwvYT48L2xpPg0KLTxsaT48YSBocmVmPSJ1c2VyZ3VpZGUuaHRtbCNoaWVyYXJjaHkiPkF4aXMyLndhciBEaXJlY3RvcnkNCi1oaWVyYXJjaHk8L2E+PC9saT4NCi08bGk+PGEgaHJlZj0idXNlcmd1aWRlLmh0bWwjZG9jcyI+QXhpczIgRG9jdW1lbnRzDQotRGlzdHJpYnV0aW9uPC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9InVzZXJndWlkZS5odG1sI2NsaWVudHMiPkF4aXMyIGFuZCBDbGllbnRzPC9hPjwvbGk+DQotPC91bD4NCi08L2xpPg0KLTxsaT48YSBocmVmPQ0KLSJ1c2VyZ3VpZGUtaW5zdGFsbGluZ3Rlc3RpbmcuaHRtbCNpbnN0YWxsaW5ndGVzdGluZyI+SW5zdGFsbGluZyBhbmQNCi1UZXN0aW5nIENsaWVudCBDb2RlPC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9DQotInVzZXJndWlkZS1pbnRyb3Rvc2VydmljZXMuaHRtbCNpbnRyb3NlcnZpY2VzIj5JbnRyb2R1Y3Rpb24gdG8NCi1TZXJ2aWNlczwvYT48YnIgLz4NCi08dWw+DQotPGxpPjxhIGhyZWY9DQotInVzZXJndWlkZS1pbnRyb3Rvc2VydmljZXMuaHRtbCNtZXNzYWdlZXhjaGFuZ2UiPk1lc3NhZ2UgRXhjaGFuZ2UNCi1QYXR0ZXJuczwvYT48L2xpPg0KLTwvdWw+DQotPC9saT4NCi08bGk+PGEgaHJlZj0NCi0idXNlcmd1aWRlLWNyZWF0aW5nY2xpZW50cy5odG1sI2NyZWF0ZWNsaWVudHMiPjxzdHJvbmc+Q3JlYXRpbmcNCi1DbGllbnRzPC9zdHJvbmc+PC9hPjxiciAvPg0KLTx1bD4NCi08bGk+PGEgaHJlZj0NCi0idXNlcmd1aWRlLWNyZWF0aW5nY2xpZW50cy5odG1sI2Nob29zaW5nY2xpZW50Ij48c3Ryb25nPkNob29zaW5nIGENCi1DbGllbnQgR2VuZXJhdGlvbiBNZXRob2Q8L3N0cm9uZz48L2E+PC9saT4NCi08bGk+PGEgaHJlZj0NCi0idXNlcmd1aWRlLWNyZWF0aW5nY2xpZW50cy5odG1sI2dlbmVyYXRpbmciPjxzdHJvbmc+R2VuZXJhdGluZw0KLUNsaWVudHM8L3N0cm9uZz48L2E+PC9saT4NCi08bGk+PGEgaHJlZj0idXNlcmd1aWRlLWNyZWF0aW5nY2xpZW50cy5odG1sI2FkYiI+PHN0cm9uZz5BeGlzIERhdGENCi1CaW5kaW5nIChBREIpPC9zdHJvbmc+PC9hPjwvbGk+DQotPC91bD4NCi08L2xpPg0KLTxsaT48YSBocmVmPQ0KLSJ1c2VyZ3VpZGUtYnVpbGRpbmdzZXJ2aWNlcy5odG1sI2J1aWxkc2VydmljZXMiPkJ1aWxkaW5nDQotU2VydmljZXM8L2E+PGJyIC8+DQotPHVsPg0KLTxsaT48YSBocmVmPQ0KLSJ1c2VyZ3VpZGUtYnVpbGRpbmdzZXJ2aWNlcy5odG1sI2dldGNvbWZvcnRhYmxlIj5HZXR0aW5nDQotQ29tZm9ydGFibGUgd2l0aCBBdmFpbGFibGUgT3B0aW9uczwvYT48L2xpPg0KLTxsaT48YSBocmVmPQ0KLSJ1c2VyZ3VpZGUtYnVpbGRpbmdzZXJ2aWNlcy5odG1sI2NyZWF0ZXNjcmF0Y2giPkNyZWF0aW5nIGEgc2VydmljZQ0KLWZyb20gU2NyYXRjaDwvYT48L2xpPg0KLTxsaT48YSBocmVmPSJ1c2VyZ3VpZGUtYnVpbGRpbmdzZXJ2aWNlcy5odG1sI2RlcGxveXBvam8iPkRlcGxveWluZw0KLVBsYWluIE9sZCBKYXZhIE9iamVjdHM8L2E+PC9saT4NCi08bGk+PGEgaHJlZj0idXNlcmd1aWRlLWJ1aWxkaW5nc2VydmljZXMuaHRtbCNkZXBsb3lydW4iPkRlcGxveWluZw0KLWFuZCBSdW5uaW5nIGFuIEF4aXMyIFNlcnZpY2UgQ3JlYXRlZCBmcm9tIFdTREw8L2E+PC9saT4NCi08L3VsPg0KLTwvbGk+DQotPGxpPjxhIGhyZWY9InVzZXJndWlkZS1zYW1wbGVzLmh0bWwiPlNhbXBsZXM8L2E+PC9saT4NCi08bGk+PGEgaHJlZj0idXNlcmd1aWRlLWZvcmZ1cnRoZXJzdHVkeS5odG1sIj5Gb3IgRnVydGhlcg0KLVN0dWR5PC9hPjwvbGk+DQotPC91bD4NCi08YSBuYW1lPSJjaG9vc2luZ2NsaWVudCIgaWQ9ImNob29zaW5nY2xpZW50Ij48L2E+DQotPGgyPkNob29zaW5nIGEgQ2xpZW50IEdlbmVyYXRpb24gTWV0aG9kPC9oMj4NCi08cD5BeGlzMiBnaXZlcyB5b3Ugc2V2ZXJhbCBvcHRpb25zIHdoZW4gaXQgY29tZXMgdG8gbWFwcGluZyBXU0RMIHRvDQotb2JqZWN0cyB3aGVuIGdlbmVyYXRpbmcgY2xpZW50cy4gVGhyZWUgb2YgdGhlc2Ugb3B0aW9ucyBhcmUgQXhpczINCi1EYXRhQmluZGluZyBGcmFtZXdvcmssIFhNTEJlYW5zLCBhbmQgSmlCWCBkYXRhYmluZGluZy4gQWxsIG9mIHRoZXNlDQotbWV0aG9kcyBpbnZvbHZlIHVzaW5nIGRhdGFiaW5kaW5nIHRvIGNyZWF0ZSBKYXZhIG9iamVjdHMgb3V0IG9mIHRoZQ0KLVhNTCBzdHJ1Y3R1cmVzIHVzZWQgYnkgdGhlIHNlcnZpY2UsIGFuZCBlYWNoIGhhcyBpdHMgcHJvcyBhbmQgY29ucy4NCi1Zb3UgY2FuIGFsc28gZ2VuZXJhdGUgWE1MIGluLW91dCBzdHVicyB0aGF0IGFyZSBub3QgYmFzZWQgb24NCi1kYXRhYmluZGluZy48L3A+DQotPHA+QXhpczIgRGF0YWJpbmRpbmcgRnJhbWV3b3JrIChBREIpOiBBREIgaXMgcHJvYmFibHkgdGhlIHNpbXBsZXN0DQotbWV0aG9kIG9mIGdlbmVyYXRpbmcgYW4gQXhpczIgY2xpZW50LiBJbiBtb3N0IGNhc2VzLCBhbGwgb2YgdGhlDQotcGVydGluZW50IGNsYXNzZXMgYXJlIGNyZWF0ZWQgYXMgaW5uZXIgY2xhc3NlcyBvZiBhIG1haW4gc3R1Yg0KLWNsYXNzLiBBREIgaXMgdmVyeSBlYXN5IHRvIHVzZSwgYnV0IGl0IGRvZXMgaGF2ZSBsaW1pdGF0aW9ucy4gSXQgaXMNCi1ub3QgbWVhbnQgdG8gYmUgYSBmdWxsIHNjaGVtYSBiaW5kaW5nIGFwcGxpY2F0aW9uLCBhbmQgaGFzDQotZGlmZmljdWx0eSB3aXRoIHN0cnVjdHVyZXMgc3VjaCBhcyBYTUwgU2NoZW1hIGVsZW1lbnQgZXh0ZW5zaW9ucw0KLWFuZCByZXN0cmljdGlvbnMuPC9wPg0KLTxwPlhNTEJlYW5zOiBVbmxpa2UgQURCLCBYTUxCZWFucyBpcyBhIGZ1bGx5IGZ1bmN0aW9uYWwgc2NoZW1hDQotY29tcGlsZXIsIHNvIGl0IGRvZXNuJ3QgY2FycnkgdGhlIHNhbWUgbGltaXRhdGlvbnMgYXMgQURCLiBJdCBpcywNCi1ob3dldmVyLCBhIGJpdCBtb3JlIGNvbXBsaWNhdGVkIHRvIHVzZSB0aGFuIEFEQi4gSXQgZ2VuZXJhdGVzIGENCi1odWdlIG51bWJlciBvZiBmaWxlcywgYW5kIHRoZSBwcm9ncmFtbWluZyBtb2RlbCwgd2hpbGUgYmVpbmcNCi1jZXJ0YWlubHkgdXNhYmxlLCBpcyBub3QgYXMgc3RyYWlnaHRmb3J3YXJkIGFzIEFEQi48L3A+DQotPHA+SmlCWDogSmlCWCBpcyBhIGNvbXBsZXRlIGRhdGFiaW5kaW5nIGZyYW1ld29yayB0aGF0IGFjdHVhbGx5DQotcHJvdmlkZXMgbm90IG9ubHkgV1NETC10by1KYXZhIGNvbnZlcnNpb24sIGFzIGNvdmVyZWQgaW4gdGhpcw0KLWRvY3VtZW50LCBidXQgYWxzbyBKYXZhLXRvLVhNTCBjb252ZXJzaW9uLiBJbiBzb21lIHdheXMsIEppQlgNCi1wcm92aWRlcyB0aGUgYmVzdCBvZiBib3RoIHdvcmxkcy4gSmlCWCBpcyBleHRyZW1lbHkgZmxleGlibGUsDQotZW5hYmxpbmcgeW91IHRvIGNob29zZSB0aGUgY2xhc3NlcyB0aGF0IHJlcHJlc2VudCB5b3VyIGVudGl0aWVzLA0KLWJ1dCBpdCBjYW4gYmUgY29tcGxpY2F0ZWQgdG8gc2V0IHVwLiBPbiB0aGUgb3RoZXIgaGFuZCwgb25jZSBpdCBpcw0KLXNldCB1cCwgYWN0dWFsbHkgdXNpbmcgdGhlIGdlbmVyYXRlZCBjb2RlIGlzIGFzIGVhc3kgYXMgdXNpbmcNCi1BREIuPC9wPg0KLTxwPkluIHRoZSBlbmQsIGZvciBzaW1wbGUgc3RydWN0dXJlcywgQURCIHdpbGwgbGlrZWx5IGJlIGVub3VnaCBmb3INCi15b3UuIElmLCBvbiB0aGUgb3RoZXIgaGFuZCB5b3UgbmVlZCBtb3JlIHBvd2VyIG9yIGZsZXhpYmlsaXR5LA0KLXdoZXRoZXIgeW91IGNob29zZSBYTUxCZWFucyBvciBKaUJYIGRlcGVuZHMgb24gaG93IG11Y2ggcG93ZXIgb3INCi1mbGV4aWJpbGl0eSB5b3UgbmVlZCBhbmQgeW91ciB0b2xlcmFuY2UgZm9yIGNvbXBsZXhpdHkuPC9wPg0KLTxhIG5hbWU9ImdlbmVyYXRpbmciIGlkPSJnZW5lcmF0aW5nIj48L2E+DQotPGgyPkdlbmVyYXRpbmcgQ2xpZW50czwvaDI+DQotPHA+VGhlIHByb2Nlc3MgZm9yIGdlbmVyYXRpbmcgYW5kIHVzaW5nIGEgY2xpZW50IHZhcmllcyBzbGlnaHRseQ0KLWRlcGVuZGluZyBvbiB0aGUgbWV0aG9kIG9mIGdlbmVyYXRpb24geW91IGNob29zZS4gSW4gYWxsIHRocmVlDQotY2FzZXMgaW4gdGhpcyBkb2N1bWVudCwgY2xpZW50cyBhcmUgZ2VuZXJhdGVkIGZyb20gdGhlIHNhbWUgV1NETA0KLWZpbGUgKHNlZSA8YSBocmVmPSJ1c2VyZ3VpZGUtY29kZWxpc3Rpbmc1Lmh0bWwiPkNvZGUgTGlzdGluZw0KLTU8L2E+KS48L3A+DQotPHA+Tm90ZSB0aGF0IHRoZSBkb2N1bWVudCBkZWZpbmVzIGZvdXIgb3BlcmF0aW9ucywgRG9Jbk9ubHksDQotTm9QYXJhbWV0ZXJzLCBUd29XYXlPbmVQYXJhbWV0ZXJFY2hvLCBhbmQNCi1NdWx0aXBsZVBhcmFtZXRlcnNBZGRJdGVtLiBFYWNoIG9mIHRoZSBjbGllbnRzIHdpbGwgaW5jbHVkZSBtZXRob2RzDQotZm9yIGNhbGxpbmcgZWFjaCBvZiB0aGVzZSBvcGVyYXRpb25zLjwvcD4NCi08cD4oWW91IGNhbiBnZXQgbW9yZSBpbmZvcm1hdGlvbiBvbiBXU0RMIGF0IDxhIGhyZWY9DQotImh0dHA6Ly93d3cudzMub3JnLzIwMDIvd3MvZGVzYy8iPmh0dHA6Ly93d3cudzMub3JnLzIwMDIvd3MvZGVzYy88L2E+DQotLik8L3A+DQotPGEgbmFtZT0iYWRiIiBpZD0iYWRiIj48L2E+DQotPGgyPkF4aXMgRGF0YSBCaW5kaW5nIChBREIpPC9oMj4NCi08cD5UbyBjcmVhdGUgYSBjbGllbnQgdXNpbmcgQURCLCBleGVjdXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6PC9wPg0KLTxwPjxiPlRoZSBzaG9ydCBzdG9yeTo8L2I+PC9wPg0KLTxvbD4NCi08bGk+DQotPGEgaHJlZj0iaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvZG93bmxvYWQvQGF4aXMyX3ZlcnNpb25fZGlyQC9kb3dubG9hZC5jZ2kjc3RkLWJpbiI+RG93bmxvYWQ8L2E+IGFuZCB1bnBhY2sgdGhlIEFwYWNoZSBBeGlzMiBTdGFuZGFyZA0KLURpc3RyaWJ1dGlvbiwgaWYgeW91IGhhdmUgbm90IGRvbmUgaXQgYWxyZWFkeS48L2xpPg0KLTxsaT5DcmVhdGUgdGhlIGNsaWVudCBzdHViIHdpdGggdGhlIGZvbGxvd2luZyBjb21tYW5kOg0KLTxwcmU+DQotJUFYSVMyX0hPTUUlXGJpblxXU0RMMkphdmEgLXVyaSBBeGlzMlVzZXJHdWlkZS53c2RsIC1wIG9yZy5hcGFjaGUuYXhpczIuYXhpczJ1c2VyZ3VpZGUgLWQgYWRiIC1zDQotPC9wcmU+PC9saT4NCi08bGk+Q3JlYXRlIHRoZSBjbGllbnQgKGZvciBleGFtcGxlLCBDbGllbnQuamF2YSksIGEgSmF2YQ0KLWFwcGxpY2F0aW9uIHRoYXQgdXNlcyB0aGUgZ2VuZXJhdGVkIHN0dWIsIGFuZCBzYXZlIGl0IGluIHRoZQ0KLW9yZy9hcGFjaGUvYXhpczIvYXhpczJ1c2VyZ3VpZGUgZGlyZWN0b3J5LjwvbGk+DQotPGxpPkJ1aWxkIHRoZSBjbGllbnQgYnkgdHlwaW5nOiBhbnQgamFyLmNsaWVudC48L2xpPg0KLTxsaT5Bc3N1bWluZyB5b3UgaGF2ZSBhIGNvcnJlc3BvbmRpbmcgc2VydmljZSwgcnVuIHRoZSBjbGllbnQgYnkNCi1hZGRpbmcgdGhlIGdlbmVyYXRlZCBBeGlzMlVzZXJHdWlkZVNlcnZpY2UtdGVzdC1jbGllbnQuamFyIGZpbGUNCi1sb2NhdGVkIGluIGJ1aWxkL2xpYiB0byB0aGUgY2xhc3NwYXRoIGFuZCB0eXBlOiBqYXZhDQotb3JnLmFwYWNoZS5heGlzMi5heGlzMnVzZXJndWlkZS5DbGllbnQ8L2xpPg0KLTwvb2w+DQotPHA+PGI+VGhlIGxvbmcgc3Rvcnk6PC9iPjwvcD4NCi08cD5JZiB5b3UgaGF2ZSBub3QgZG9uZSBpdCBhbHJlYWR5LCA8YSBocmVmPQ0KLSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi9kb3dubG9hZC9AYXhpczJfdmVyc2lvbl9kaXJAL2Rvd25sb2FkLmNnaSNzdGQtYmluIj4NCi1kb3dubG9hZDwvYT4gYW5kIHVucGFjayB0aGUgQXBhY2hlIEF4aXMyIFN0YW5kYXJkIERpc3RyaWJ1dGlvbi4gVGhlDQotQXhpczIgV0FSIERpc3RyaWJ1dGlvbiBkb2VzIG5vdCBpbmNsdWRlIHRoZSBuZWNlc3NhcnkgdXRpbGl0aWVzIGZvcg0KLWdlbmVyYXRpbmcgY29kZSwgc3VjaCBhcyBXU0RMMkphdmEuPC9wPg0KLTxwPkluIHRoZSBBREIgbWV0aG9kIG9mIGdlbmVyYXRpbmcgY2xpZW50cywgYWxsIHRoZSBmdW5jdGlvbmFsaXRpZXMNCi1vZiB0aGUgc2VydmljZXMgYXJlIGNvbnRhaW5lZCBpbiBhIHNpbmdsZSBjbGFzcyBjYWxsZWQgYSBzdHViLiBUaGUNCi1zdHViIGNvbnRhaW5zIGlubmVyIGNsYXNzZXMgY29ycmVzcG9uZGluZyB0byBhbGwgdGhlIG5lY2Vzc2FyeQ0KLW9iamVjdHMgZGVmaW5lZCBpbiB0aGUgV1NETCBmaWxlLCBzdWNoIGFzLCBpbiB0aGUgY2FzZSBvZiB0aGlzDQotV1NETCwgRG9Jbk9ubHlSZXF1ZXN0TWVzc2FnZS4gT25jZSB5b3UgaGF2ZSB0aGUgc3R1YiwgeW91IHdpbGwgYmUNCi1hYmxlIHRvIGNyZWF0ZSBhIGNsaWVudCBieSBzaW1wbHkgcmVmZXJyaW5nIHRvIHRoZXNlIGNsYXNzZXMgYW5kDQotdGhlaXIgbWV0aG9kcy4gVG8gZ2VuZXJhdGUgdGhlIGNsaWVudCwgaXNzdWUgdGhlIGZvbGxvd2luZyBjb21tYW5kDQotaW4gQ29kZSBMaXN0aW5nIDYuPC9wPg0KLTxoMz48Yj5Db2RlIExpc3RpbmcgNiAtIEdlbmVyYXRpbmcgdGhlIENsaWVudDwvYj48L2gzPg0KLTxwcmU+DQotJUFYSVMyX0hPTUUlXGJpblxXU0RMMkphdmEgLXVyaSBBeGlzMlVzZXJHdWlkZS53c2RsIC1wIG9yZy5hcGFjaGUuYXhpczIuYXhpczJ1c2VyZ3VpZGUgLWQgYWRiIC1zDQotPC9wcmU+DQotPHA+VGhpcyBjb21tYW5kIGFuYWx5emVzIHRoZSBXU0RMIGZpbGUgYW5kIGNyZWF0ZXMgdGhlIHN0dWIgaW4gdGhlDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmF4aXMydXNlcmd1aWRlLiBUaGUgb3B0aW9ucyBzcGVjaWZ5IHRoYXQNCi15b3Ugd2FudCB0aGUgQURCIGRhdGEgYmluZGluZyBtZXRob2QgKC1kKSwgYW5kIHN5bmNocm9ub3VzIG9yDQotYmxvY2tpbmcsIG1ldGhvZHMgKC1zKS4gSW4gb3RoZXIgd29yZHMsIHdoZW4gdGhlIGNsaWVudCBtYWtlcyBhbg0KLUluLU91dCBjYWxsIHRvIHRoZSBzZXJ2aWNlLCBpdCB3aWxsIHdhaXQgZm9yIGEgcmVzcG9uc2UgYmVmb3JlDQotY29udGludWluZy48L3A+DQotPHA+T25jZSB5b3UgcnVuIHRoaXMgY29tbWFuZCwgeW91IHdpbGwgc2VlIHR3byBuZXcgaXRlbXMgaW4gdGhlDQotZGlyZWN0b3J5LiBUaGUgZmlyc3QgaXMgdGhlIGJ1aWxkLnhtbCBmaWxlLCB3aGljaCBjb250YWlucyB0aGUNCi1pbnN0cnVjdGlvbnMgZm9yIDxhIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy8iPkFudDwvYT4gdG8NCi1jb21waWxlIHRoZSBnZW5lcmF0ZWQgY2xhc3Nlcy4gVGhlIHNlY29uZCBpcyB0aGUgc3JjIGRpcmVjdG9yeSwNCi13aGljaCBjb250YWlucyB0aGUgYWN0dWFsIEF4aXMyVXNlckd1aWRlU2VydmljZVN0dWIuamF2YSBmaWxlLiBJZg0KLXlvdSBvcGVuIHRoaXMgZmlsZSwgeW91IHdpbGwgc2VlIGEgY29sbGVjdGlvbiBvZiBpbm5lciBjbGFzc2VzIGZvcg0KLWVhY2ggb2YgdGhlIGl0ZW1zIGluIHRoZSBXU0RMIGZpbGUuIFlvdSdsbCBhbHNvIHNlZSBhIG51bWJlciBvZg0KLWNhbGxzIHRvIHRoZSBBeGlzMiBjbGllbnQgQVBJLCBpbmNsdWRpbmcgdGhvc2UgdGhhdCB1c2UgQVhJT00gdG8NCi1idWlsZCBhbmQgYW5hbHl6ZSB0aGUgaW5jb21pbmcgYW5kIG91dGdvaW5nIG1lc3NhZ2VzLjwvcD4NCi08cD5Ob3cgeW91IG5lZWQgYSBjbGllbnQgdG8gbWFrZSB1c2Ugb2YgdGhpcyBjb2RlLiBUbyBjcmVhdGUgYQ0KLWNsaWVudCwgY3JlYXRlIGEgbmV3IGNsYXNzIGFuZCBzYXZlIGl0IGFzIENsaWVudC5qYXZhIGluIHRoZQ0KLW9yZy9hcGFjaGUvYXhpczIvYXhpczJ1c2VyZ3VpZGUgZGlyZWN0b3J5LiBJdCBzaG91bGQgY29udGFpbiB0aGUNCi1mb2xsb3dpbmcgY29kZSBpbiA8YSBocmVmPSJ1c2VyZ3VpZGUtY29kZWxpc3Rpbmc3Lmh0bWwiPkNvZGUNCi1MaXN0aW5nIDc8L2E+LjwvcD4NCi08cD5Ob3RlIHRoYXQgdXNpbmcgdGhlIHNlcnZpY2UgaXMgc2ltcGx5IGEgbWF0dGVyIG9mIGNyZWF0aW5nIGFuZA0KLXBvcHVsYXRpbmcgdGhlIGFwcHJvcHJpYXRlIHR5cGUgb2YgcmVxdWVzdCB1c2luZyB0aGUgbmFtZXMgZGVmaW5lZA0KLWluIHRoZSBXU0RMIGZpbGUsIGFuZCB0aGVuIHVzaW5nIHRoZSBzdHViIHRvIGFjdHVhbGx5IHNlbmQgdGhlDQotcmVxdWVzdCB0byB0aGUgYXBwcm9wcmlhdGUgbWV0aG9kLiBGb3IgZXhhbXBsZSwgdG8gY2FsbCB0aGUNCi1Eb0luT25seSBvcGVyYXRpb24sIHlvdSBjcmVhdGUgYSBEb0luT25seVJlcXVlc3QsIHVzZSBpdHMNCi1zZXRNZXNzYWdlU3RyaW5nKCkgbWV0aG9kIHRvIHNldCB0aGUgY29udGVudHMgb2YgaXRzIG1lc3NhZ2VTdHJpbmcNCi1lbGVtZW50LCBhbmQgcGFzcyBpdCBhcyBhbiBhcmd1bWVudCB0byBzdHViLkRvSW5Pbmx5KCkuPC9wPg0KLTxwPlRvIGJ1aWxkIHRoZSBjbGllbnQsIHR5cGU6IGFudCBqYXIuY2xpZW50PC9wPg0KLTxwPlRoaXMgYWN0aW9uIGNyZWF0ZXMgdHdvIG5ldyBkaXJlY3RvcmllcywgYnVpbGQgYW5kIHRlc3QuIFRoZQ0KLXRlc3QgZGlyZWN0b3J5IHdpbGwgYmUgZW1wdHksIGJ1dCB0aGUgYnVpbGQgZGlyZWN0b3J5IGNvbnRhaW5zIHR3bw0KLXZlcnNpb25zIG9mIHRoZSBjbGllbnQuIFRoZSBmaXJzdCB2ZXJzaW9uLCBpbiB0aGUgbGliIGRpcmVjdG9yeSwgaXMNCi1hIC5qYXIgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBjbGllbnQgY2xhc3MgYW5kIHRoZSBzdHViLiBUaGUNCi1zZWNvbmQsIGluIHRoZSBjbGFzc2VzIGRpcmVjdG9yeSwgaXMganVzdCByYXcgY2xhc3Nlcy48L3A+DQotPHA+TWFrZSBzdXJlIGFsbCB0aGUgamFyIGZpbGVzIGluIHRoZSBBeGlzMiBsaWIgZGlyZWN0b3J5IGFyZSBpbg0KLXRoZSBjbGFzc3BhdGguPC9wPg0KLTxwPklmIHlvdSBoYXZlIGEgc2VydmljZSBjb3JyZXNwb25kaW5nIHRvIHRoaXMgY2xpZW50IHlvdSBjYW4gcnVuDQotdGhlIGNsaWVudCBieSBhZGRpbmcgdGhlIGphciBmaWxlIHRvIHlvdXIgY2xhc3NwYXRoIGFuZCB0eXBpbmc6DQotamF2YSBvcmcuYXBhY2hlLmF4aXMyLmF4aXMydXNlcmd1aWRlLkNsaWVudDwvcD4NCi08cD4oSWYgeW91IGRvbid0IGhhdmUgc3VjaCBhIHNlcnZpY2UsLCByZWZlciB0byB0aGUgPGEgaHJlZj0NCi0idXNlcmd1aWRlLWJ1aWxkaW5nc2VydmljZXMuaHRtbCI+QnVpbGRpbmcgc2VydmljZXM8L2E+DQotZG9jdW1lbnQuKTwvcD4NCi08cD5Zb3Ugc2hvdWxkIHNlZSB0aGUgcmVzcG9uc2UgaW4gdGhlIGNvbnNvbGUgd2luZG93IG9mIHlvdXINCi1zZXJ2bGV0IGNvbnRhaW5lci4gSXQgc2hvdWxkIGxvb2sgc29tZXRoaW5nIGxpa2UgdGhpczo8L3A+DQotPHA+PGltZyBhbHQ9DQotIlJlc3BvbnNlIGluIGEgY29uc29sZSB3aW5kb3cgb2YgeW91ciBzZXJ2bGV0IGNvbnRhaW5lciIgc3JjPQ0KLSJpbWFnZXMvZmlnMDMuanBnIiAvPjxiciBjbGVhcj0iYWxsIiAvPjwvcD4NCi08cD5BREIgaXMgbm90IHlvdXIgb25seSBvcHRpb24gZm9yIGdlbmVyYXRpbmcgV2ViIHNlcnZpY2UgY2xpZW50cy4NCi1PdGhlciBvcHRpb25zIGluY2x1ZGUgPGEgaHJlZj0NCi0idXNlcmd1aWRlLWNyZWF0aW5nY2xpZW50cy14bWxiZWFucy5odG1sIj5YbWxCZWFuczwvYT4sIDxhIGhyZWY9DQotInVzZXJndWlkZS1jcmVhdGluZ2NsaWVudHMtamlieC5odG1sIj5KaUJYPC9hPiBhbmQNCi1KQVhCUkkuPC9wPg0KLTxwPjxzdHJvbmc+U2VlIHRoZSBOZXh0IFNlY3Rpb248L3N0cm9uZz4gLTxhIGhyZWY9DQotInVzZXJndWlkZS1idWlsZGluZ3NlcnZpY2VzLmh0bWwjYnVpbGRzZXJ2aWNlcyI+QnVpbGRpbmcNCi1TZXJ2aWNlczwvYT48L3A+DQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvdXNlcmd1aWRlLWZvcmZ1cnRoZXJzdHVkeS54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvdXNlcmd1aWRlLWZvcmZ1cnRoZXJzdHVkeS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxZWFjYjUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL3VzZXJndWlkZS1mb3JmdXJ0aGVyc3R1ZHkueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iDQotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4NCi08aHRtbCBsYW5nPSJlbiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiI+DQotPGhlYWQ+DQotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PQ0KLSJIVE1MIFRpZHkgZm9yIFdpbmRvd3MgKHZlcnMgMTQgSnVuZSAyMDA3KSwgc2VlIHd3dy53My5vcmciIC8+DQotPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSIiIC8+DQotPHRpdGxlPkFwYWNoZSBBeGlzMiBVc2VyJ3MgR3VpZGUtRm9yIEZ1cnRoZXIgU3R1ZHk8L3RpdGxlPg0KLTxsaW5rIGhyZWY9Ii4uL2Nzcy9heGlzLWRvY3MuY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIg0KLW1lZGlhPSJhbGwiIC8+DQotPC9oZWFkPg0KLTxib2R5Pg0KLTxhIG5hbWU9IiNmb3JmdXJ0aGVyc3R1ZHkiIGlkPSIjZm9yZnVydGhlcnN0dWR5Ij48L2E+DQotPGgxPkFwYWNoZSBBeGlzMiBVc2VyJ3MgR3VpZGUgLSBGb3IgRnVydGhlciBTdHVkeTwvaDE+DQotPCEtLTxoMj5Db250ZW50PC9oMj4NCi08dWw+DQotPGxpPjxhIGhyZWY9InVzZXJndWlkZS5odG1sI2ludHJvIj5JbnRyb2R1Y2luZyBBeGlzMjwvYT48YnIgLz4NCi0NCi08dWw+DQotPGxpPjxhIGhyZWY9InVzZXJndWlkZS5odG1sI3doYXRpcyI+V2hhdCBpcyBBeGlzMjwvYT48L2xpPg0KLTxsaT48YSBocmVmPSJ1c2VyZ3VpZGUuaHRtbCN1bmRlcmhvb2QiPldoYXQncyB1bmRlciB0aGUNCi1ob29kPzwvYT48L2xpPg0KLTxsaT48YSBocmVmPSJ1c2VyZ3VpZGUuaHRtbCNoYW5kbGVzc29hcCI+SG93IEF4aXMyIGhhbmRsZXMgU09BUA0KLW1lc3NhZ2VzPC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9InVzZXJndWlkZS5odG1sI2Rpc3RyaWJ1dGlvbnMiPkF4aXMyDQotZGlzdHJpYnV0aW9uczwvYT48L2xpPg0KLTxsaT48YSBocmVmPSJ1c2VyZ3VpZGUuaHRtbCNzYmQiPlRoZSBBeGlzMiBTdGFuZGFyZCBCaW5hcnkNCi1EaXN0cmlidXRpb248L2E+PC9saT4NCi08bGk+PGEgaHJlZj0idXNlcmd1aWRlLmh0bWwjaGllcmFyY2h5Ij5BeGlzMi53YXIgZG9jdW1lbnQNCi1oaWVyYXJjaHk8L2E+PC9saT4NCi08bGk+PGEgaHJlZj0idXNlcmd1aWRlLmh0bWwjY2xpZW50cyI+QXhpczIgYW5kIGNsaWVudHM8L2E+PC9saT4NCi08L3VsPg0KLTwvbGk+DQotPGxpPjxhIGhyZWY9InVzZXJndWlkZS1pbnN0YWxsaW5ndGVzdGluZy5odG1sI2luc3RhbGxpbmd0ZXN0aW5nIj5JbnN0YWxsaW5nDQotYW5kIHRlc3RpbmcgY2xpZW50IGNvZGU8L2E+PC9saT4NCi08bGk+PGEgaHJlZj0idXNlcmd1aWRlLWludHJvdG9zZXJ2aWNlcy5odG1sI2ludHJvc2VydmljZXMiPkludHJvZHVjdGlvbiB0bw0KLVNlcnZpY2VzPC9hPjxiciAvPg0KLQ0KLTx1bD4NCi08bGk+PGEgaHJlZj0idXNlcmd1aWRlLWludHJvdG9zZXJ2aWNlcy5odG1sI21lc3NhZ2VleGNoYW5nZSI+TWVzc2FnZQ0KLUV4Y2hhbmdlIFBhdHRlcm5zPC9hPjwvbGk+DQotPC91bD4NCi08L2xpPg0KLTxsaT48YSBocmVmPSJ1c2VyZ3VpZGUtY3JlYXRpbmdjbGllbnRzLmh0bWwjY3JlYXRlY2xpZW50cyI+Q3JlYXRpbmcNCi1DbGllbnRzPC9hPjxiciAvPg0KLQ0KLTx1bD4NCi08bGk+PGEgaHJlZj0idXNlcmd1aWRlLWNyZWF0aW5nY2xpZW50cy5odG1sI2Nob29zaW5nY2xpZW50Ij5DaG9vc2luZyBhDQotQ2xpZW50IEdlbmVyYXRpb24gTWV0aG9kPC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9InVzZXJndWlkZS1jcmVhdGluZ2NsaWVudHMuaHRtbCNnZW5lcmF0aW5nIj5HZW5lcmF0aW5nDQotQ2xpZW50czwvYT48L2xpPg0KLTxsaT48YSBocmVmPSJ1c2VyZ3VpZGUtY3JlYXRpbmdjbGllbnRzLmh0bWwjYWRiIj5BeGlzIERhdGEgQmluZGluZw0KLShBREIpPC9hPjwvbGk+DQotPC91bD4NCi08L2xpPg0KLTxsaT48YSBocmVmPSJ1c2VyZ3VpZGUtYnVpbGRpbmdzZXJ2aWNlcy5odG1sI2J1aWxkc2VydmljZXMiPkJ1aWxkaW5nDQotU2VydmljZXM8L2E+PGJyIC8+DQotDQotPHVsPg0KLTxsaT48YSBocmVmPSJ1c2VyZ3VpZGUtYnVpbGRpbmdzZXJ2aWNlcy5odG1sI2dldGNvbWZvcnRhYmxlIj5HZXR0aW5nDQotQ29tZm9ydGFibGUgd2l0aCBBdmFpbGFibGUgT3B0aW9uczwvYT48L2xpPg0KLTxsaT48YSBocmVmPSJ1c2VyZ3VpZGUtYnVpbGRpbmdzZXJ2aWNlcy5odG1sI2NyZWF0ZXNjcmF0Y2giPkNyZWF0aW5nIGENCi1zZXJ2aWNlIGZyb20gc2NyYXRjaDwvYT48L2xpPg0KLTxsaT48YSBocmVmPSJ1c2VyZ3VpZGUtYnVpbGRpbmdzZXJ2aWNlcy5odG1sI2RlcGxveXBvam8iPkRlcGxveWluZw0KLVBsYWluIE9sZCBKYXZhIE9iamVjdHM8L2E+PC9saT4NCi08bGk+PGEgaHJlZj0idXNlcmd1aWRlLWJ1aWxkaW5nc2VydmljZXMuaHRtbCNkZXBsb3lydW4iPkRlcGxveWluZyBhbmQNCi1ydW5uaW5nIGFuIEF4aXMyIHNlcnZpY2UgY3JlYXRlZCBmcm9tIFdTREw8L2E+PC9saT4NCi08L3VsPg0KLTwvbGk+DQotPGxpPjxhIGhyZWY9InVzZXJndWlkZS1zYW1wbGVzLmh0bWwiPlNhbXBsZXM8L2E+DQotPHVsPg0KLTxsaT48YSBocmVmPSJ1c2VyZ3VpZGUtc2FtcGxlcy5odG1sI2NsaWVudHMiPkNsaWVudHM8L2E+PC9saT4NCi08bGk+PGEgaHJlZj0idXNlcmd1aWRlLXNhbXBsZXMuaHRtbCNzZXJ2aWNlcyI+U2VydmljZXM8L2E+PC9saT4NCi08bGk+PGEgaHJlZj0idXNlcmd1aWRlLXNhbXBsZXMuaHRtbCN3c2RsIj5TYW1wbGUgV1NETCBmaWxlczwvYT48L2xpPg0KLTxsaT48YSBocmVmPSJ1c2VyZ3VpZGUtc2FtcGxlcy5odG1sI290aGVycyI+T3RoZXIgU2FtcGxlczwvYT48L2xpPg0KLTwvdWw+DQotPC9saT4NCi08bGk+PGEgaHJlZj0idXNlcmd1aWRlLWZvcmZ1cnRoZXJzdHVkeS5odG1sIj48c3Ryb25nPkZvciBGdXJ0aGVyDQotU3R1ZHk8L3N0cm9uZz48L2E+PC9saT4NCi08L3VsPi0tPg0KLTxoMj5SZXNvdXJjZXM8L2gyPg0KLTxwPkF4aXMyIEFyY2hpdGVjdHVyZS08YSBocmVmPQ0KLSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi9AYXhpczJfdmVyc2lvbl9kaXJAL0F4aXMyQXJjaGl0ZWN0dXJlR3VpZGUuaHRtbCI+aHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvQGF4aXMyX3ZlcnNpb25fZGlyQC9BeGlzMkFyY2hpdGVjdHVyZUd1aWRlLmh0bWw8L2E+PC9wPg0KLTxwPlhNTCBwcm9jZXNzaW5nIHdpdGggQVhJT00tPGEgaHJlZj0NCi0iaHR0cDovL3dzLmFwYWNoZS5vcmcvY29tbW9ucy9heGlvbS9PTVR1dG9yaWFsLmh0bWwiPmh0dHA6Ly93cy5hcGFjaGUub3JnL2NvbW1vbnMvYXhpb20vT01UdXRvcmlhbC5odG1sPC9hPjwvcD4NCi08cD5SRVNUZnVsIFdlYiBTZXJ2aWNlcy08YSBocmVmPQ0KLSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi9AYXhpczJfdmVyc2lvbl9kaXJAL3Jlc3Qtd3MuaHRtbCI+aHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvQGF4aXMyX3ZlcnNpb25fZGlyQC9yZXN0LXdzLmh0bWw8L2E+PC9wPg0KLTxwPlRDUCBUcmFuc3BvcnQtPGEgaHJlZj0NCi0iaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvQGF4aXMyX3ZlcnNpb25fZGlyQC90Y3AtdHJhbnNwb3J0Lmh0bWwiPmh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL0BheGlzMl92ZXJzaW9uX2RpckAvdGNwLXRyYW5zcG9ydC5odG1sPC9hPjwvcD4NCi08cD5IVFRQIFRyYW5zcG9ydHMtPGEgaHJlZj0NCi0iaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvQGF4aXMyX3ZlcnNpb25fZGlyQC9odHRwLXRyYW5zcG9ydC5odG1sIj5odHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi9AYXhpczJfdmVyc2lvbl9kaXJAL2h0dHAtdHJhbnNwb3J0Lmh0bWw8L2E+PC9wPg0KLTxwPk1UT00gd2l0aCBBeGlzMi08YSBocmVmPQ0KLSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi9AYXhpczJfdmVyc2lvbl9kaXJAL210b20tZ3VpZGUuaHRtbCI+aHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvQGF4aXMyX3ZlcnNpb25fZGlyQC9tdG9tLWd1aWRlLmh0bWw8L2E+PC9wPg0KLTxwPlNlY3VyaW5nIFNPQVAgTWVzc2FnZXMgd2l0aCBBcGFjaGUgUmFtcGFydC0gPGEgaHJlZj0NCi0iLi4vbW9kdWxlcy9yYW1wYXJ0L0BheGlzMl92ZXJzaW9uX2RpckAvc2VjdXJpdHktbW9kdWxlLmh0bWwiPmh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL21vZHVsZXMvcmFtcGFydC9AYXhpczJfdmVyc2lvbl9kaXJAL3NlY3VyaXR5LW1vZHVsZS5odG1sPC9hPjwvcD4NCi08cD5TT0FQTW9uaXRvci08YSBocmVmPQ0KLSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi9AYXhpczJfdmVyc2lvbl9kaXJAL3NvYXBtb25pdG9yLW1vZHVsZS5odG1sIj5odHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi9AYXhpczJfdmVyc2lvbl9kaXJAL3NvYXBtb25pdG9yLW1vZHVsZS5odG1sPC9hPjwvcD4NCi08cD5BcGFjaGUgQXhpczIgQWR2YW5jZSBVc2VyJ3MgR3VpZGUtIDxhIGhyZWY9DQotImFkdi11c2VyZ3VpZGUuaHRtbCI+aHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvQGF4aXMyX3ZlcnNpb25fZGlyQC9hZHYtdXNlcmd1aWRlLmh0bWw8L2E+PC9wPg0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL3VzZXJndWlkZS1pbnN0YWxsaW5ndGVzdGluZy54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvdXNlcmd1aWRlLWluc3RhbGxpbmd0ZXN0aW5nLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGI5OTdlMy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvdXNlcmd1aWRlLWluc3RhbGxpbmd0ZXN0aW5nLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIg0KLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+DQotPGh0bWwgbGFuZz0iZW4iIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iPg0KLTxoZWFkPg0KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0NCi0iSFRNTCBUaWR5IGZvciBXaW5kb3dzICh2ZXJzIDE0IEp1bmUgMjAwNyksIHNlZSB3d3cudzMub3JnIiAvPg0KLTxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0iIiAvPg0KLTx0aXRsZT5BcGFjaGUgQXhpczIgVXNlcidzIEd1aWRlLUluc3RhbGxpbmcgYW5kIFRlc3RpbmcgQ2xpZW50DQotQ29kZTwvdGl0bGU+DQotPGxpbmsgaHJlZj0iLi4vY3NzL2F4aXMtZG9jcy5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiDQotbWVkaWE9ImFsbCIgLz4NCi08L2hlYWQ+DQotPGJvZHkgbGFuZz0iZW4iIHhtbDpsYW5nPSJlbiI+DQotPGEgbmFtZT0iaW5zdGFsbGluZ3Rlc3RpbmciIGlkPSJpbnN0YWxsaW5ndGVzdGluZyI+PC9hPg0KLTxoMT5BcGFjaGUgQXhpczIgVXNlcidzIEd1aWRlIC0gSW5zdGFsbGluZyBhbmQgVGVzdGluZyBDbGllbnQNCi1Db2RlPC9oMT4NCi08cD5UaGUgYmVzdCB3YXkgdG8gbWFrZSBzdXJlIHRoYXQgeW91ciBzeXN0ZW0gaXMgcnVubmluZyBBcGFjaGUNCi1BeGlzMiBpcyB0byBpbnN0YWxsIGFuZCB0ZXN0IGJvdGggYSBzZXJ2aWNlIGFuZCBhIGNsaWVudC4gVGhlDQotcHJvY2VzcyBpbnZvbHZlcyB0aGUgZm9sbG93aW5nIHN0ZXBzOjwvcD4NCi08aDI+Q29udGVudDwvaDI+DQotPHVsPg0KLTxsaT48YSBocmVmPSJ1c2VyZ3VpZGUuaHRtbCNpbnRybyI+SW50cm9kdWNpbmcgQXhpczI8L2E+PGJyIC8+DQotPHVsPg0KLTxsaT48YSBocmVmPSJ1c2VyZ3VpZGUuaHRtbCN3aGF0aXMiPldoYXQgaXMgQXhpczI/PC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9InVzZXJndWlkZS5odG1sI3VuZGVyaG9vZCI+V2hhdCdzIHVuZGVyIHRoZQ0KLWhvb2Q/PC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9InVzZXJndWlkZS5odG1sI2hhbmRsZXNzb2FwIj5Ib3cgQXhpczIgaGFuZGxlcyBTT0FQDQotbWVzc2FnZXM8L2E+PC9saT4NCi08bGk+PGEgaHJlZj0idXNlcmd1aWRlLmh0bWwjZGlzdHJpYnV0aW9ucyI+QXhpczINCi1kaXN0cmlidXRpb25zPC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9InVzZXJndWlkZS5odG1sI3NiZCI+VGhlIEF4aXMyIFN0YW5kYXJkIEJpbmFyeQ0KLURpc3RyaWJ1dGlvbjwvYT48L2xpPg0KLTxsaT48YSBocmVmPSJ1c2VyZ3VpZGUuaHRtbCNoaWVyYXJjaHkiPkF4aXMyLndhciBEaXJlY3RvcnkNCi1IaWVyYXJjaHk8L2E+PC9saT4NCi08bGk+PGEgaHJlZj0idXNlcmd1aWRlLmh0bWwjZG9jcyI+QXhpczIgRG9jdW1lbnRzDQotRGlzdHJpYnV0aW9uPC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9InVzZXJndWlkZS5odG1sI2NsaWVudHMiPkF4aXMyIGFuZCBjbGllbnRzPC9hPjwvbGk+DQotPC91bD4NCi08L2xpPg0KLTxsaT48YSBocmVmPQ0KLSJ1c2VyZ3VpZGUtaW5zdGFsbGluZ3Rlc3RpbmcuaHRtbCNpbnN0YWxsaW5ndGVzdGluZyI+PHN0cm9uZz5JbnN0YWxsaW5nDQotYW5kIHRlc3RpbmcgY2xpZW50IGNvZGU8L3N0cm9uZz48L2E+PC9saT4NCi08bGk+PGEgaHJlZj0NCi0idXNlcmd1aWRlLWludHJvdG9zZXJ2aWNlcy5odG1sI2ludHJvc2VydmljZXMiPkludHJvZHVjdGlvbiB0bw0KLVNlcnZpY2VzPC9hPjxiciAvPg0KLTx1bD4NCi08bGk+PGEgaHJlZj0NCi0idXNlcmd1aWRlLWludHJvdG9zZXJ2aWNlcy5odG1sI21lc3NhZ2VleGNoYW5nZSI+TWVzc2FnZSBFeGNoYW5nZQ0KLVBhdHRlcm5zPC9hPjwvbGk+DQotPC91bD4NCi08L2xpPg0KLTxsaT48YSBocmVmPSJ1c2VyZ3VpZGUtY3JlYXRpbmdjbGllbnRzLmh0bWwjY3JlYXRlY2xpZW50cyI+Q3JlYXRpbmcNCi1DbGllbnRzPC9hPjxiciAvPg0KLTx1bD4NCi08bGk+PGEgaHJlZj0NCi0idXNlcmd1aWRlLWNyZWF0aW5nY2xpZW50cy5odG1sI2Nob29zaW5nY2xpZW50Ij5DaG9vc2luZyBhIENsaWVudA0KLUdlbmVyYXRpb24gTWV0aG9kPC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9InVzZXJndWlkZS1jcmVhdGluZ2NsaWVudHMuaHRtbCNnZW5lcmF0aW5nIj5HZW5lcmF0aW5nDQotQ2xpZW50czwvYT48L2xpPg0KLTxsaT48YSBocmVmPSJ1c2VyZ3VpZGUtY3JlYXRpbmdjbGllbnRzLmh0bWwjYWRiIj5BeGlzIERhdGEgQmluZGluZw0KLShBREIpPC9hPjwvbGk+DQotPC91bD4NCi08L2xpPg0KLTxsaT48YSBocmVmPQ0KLSJ1c2VyZ3VpZGUtYnVpbGRpbmdzZXJ2aWNlcy5odG1sI2J1aWxkc2VydmljZXMiPkJ1aWxkaW5nDQotU2VydmljZXM8L2E+PGJyIC8+DQotPHVsPg0KLTxsaT48YSBocmVmPQ0KLSJ1c2VyZ3VpZGUtYnVpbGRpbmdzZXJ2aWNlcy5odG1sI2dldGNvbWZvcnRhYmxlIj5HZXR0aW5nDQotQ29tZm9ydGFibGUgd2l0aCB0aGUgQXZhaWxhYmxlIE9wdGlvbnM8L2E+PC9saT4NCi08bGk+PGEgaHJlZj0NCi0idXNlcmd1aWRlLWJ1aWxkaW5nc2VydmljZXMuaHRtbCNjcmVhdGVzY3JhdGNoIj5DcmVhdGluZyBhIHNlcnZpY2UNCi1mcm9tIHNjcmF0Y2g8L2E+PC9saT4NCi08bGk+PGEgaHJlZj0idXNlcmd1aWRlLWJ1aWxkaW5nc2VydmljZXMuaHRtbCNkZXBsb3lwb2pvIj5EZXBsb3lpbmcNCi1QbGFpbiBPbGQgSmF2YSBPYmplY3RzPC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9InVzZXJndWlkZS1idWlsZGluZ3NlcnZpY2VzLmh0bWwjZGVwbG95cnVuIj5EZXBsb3lpbmcNCi1hbmQgcnVubmluZyBhbiBBeGlzMiBzZXJ2aWNlIGNyZWF0ZWQgZnJvbSBXU0RMPC9hPjwvbGk+DQotPC91bD4NCi08L2xpPg0KLTxsaT48YSBocmVmPSJ1c2VyZ3VpZGUtc2FtcGxlcy5odG1sIj5TYW1wbGVzPC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9InVzZXJndWlkZS1mb3JmdXJ0aGVyc3R1ZHkuaHRtbCI+Rm9yIEZ1cnRoZXINCi1TdHVkeTwvYT48L2xpPg0KLTwvdWw+DQotPHA+PGI+VGhlIFNob3J0IFN0b3J5OjwvYj48L3A+DQotPG9sPg0KLTxsaT5JbnN0YWxsIEFwYWNoZSBBeGlzMiBpbiBhIHN1aXRhYmxlIGNvbnRhaW5lciwgc3VjaCBhcyBBcGFjaGUNCi1Ub21jYXQsIGJ5IGNvcHlpbmcgdGhlIGF4aXMyLndhciBmaWxlIHRvIHRoZSB3ZWJhcHBzDQotZGlyZWN0b3J5LjwvbGk+DQotPGxpPkluc3RhbGwgdGhlIHNlcnZpY2UgaW50byB0aGUgQXhpczIgYXBwbGljYXRpb24gYnkgY29weWluZyB0aGUNCi0qLmFhciBmaWxlIGludG8gdGhlIEF4aXMyIHNlcnZpY2VzIGRpcmVjdG9yeS48L2xpPg0KLTxsaT5JbnN0YWxsIHRoZSBjbGllbnQgb24gdGhlIHN5c3RlbSBvbiB3aGljaCB5b3Ugd2FudCB0byBydW4gaXQsDQotYW5kIG1ha2Ugc3VyZSBhbGwgdGhlIEF4aXMyIGxpYnJhcmllcyBhcmUgb24gdGhlIENMQVNTUEFUSC48L2xpPg0KLTxsaT5SdW4gdGhlIGNsaWVudC48L2xpPg0KLTwvb2w+DQotPCEtLXN0b3BwZWQgaGVyZS0tPg0KLTxwPjxiPlRoZSBMb25nIFN0b3J5OjwvYj48L3A+DQotPHA+U3RhcnQgYnkgaW5zdGFsbGluZyBhIHN1aXRhYmxlIGNvbnRhaW5lciwgc3VjaCBhcyA8YSBocmVmPQ0KLSJodHRwOi8vdG9tY2F0LmFwYWNoZS5vcmcvIj5BcGFjaGUgVG9tY2F0PC9hPi4gQW55IEoyRUUgc2VydmVyIHdpbGwNCi1kby4gVG8gaW5zdGFsbCBBcGFjaGUgQXhpczIgb24gdGhlIHNlcnZlciwgZG93bmxvYWQgdGhlIEF4aXMyIFdBUg0KLWRpc3RyaWJ1dGlvbiBmcm9tIDxhIGhyZWY9DQotImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL2Rvd25sb2FkLmNnaSI+aHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvZG93bmxvYWQuY2dpPC9hPg0KLWFuZCBwbGFjZSB0aGUgYXhpczIud2FyIGZpbGUgaW4gdGhlIHNlcnZlcidzIHdlYmFwcHMgZGlyZWN0b3J5LiBUaGUNCi1zZXJ2ZXIgd2lsbCB0aGVuIGV4cGFuZCB0aGUgZGlzdHJpYnV0aW9uIGludG8gaXRzIHByb3BlciBzdHJ1Y3R1cmUsDQotYXMgc2VlbiBpbiB0aGUgPGEgaHJlZj0idXNlcmd1aWRlLmh0bWwjaGllcmFyY2h5Ij5lYXJsaWVyDQotc2VjdGlvbjwvYT4uPC9wPg0KLTxwPkFwYWNoZSBBeGlzMiBzZXJ2aWNlcyBjb21lIGJ1bmRsZWQgYXMgKi5hYXIgZmlsZXMsIHdoaWNoIGNvbnRhaW4NCi1hbGwgdGhlIHBpZWNlcyBuZWNlc3NhcnkgdG8gZGVmaW5lIHRoZSBzZXJ2aWNlLCBzdWNoIGFzIHRoZQ0KLW5lY2Vzc2FyeSBjbGFzc2VzIGFuZCBsaWJyYXJpZXMgYW5kIHRoZSBzZXJ2aWNlcy54bWwgZmlsZSB0aGF0DQotZGVmaW5lcyB0aGUgc2VydmljZSdzIGJlaGF2aW9yLiBZb3UgY2FuIGluc3RhbGwgdGhlIHNlcnZpY2UgdXNpbmcNCi10aGUgPGEgaHJlZj0id2ViYWRtaW5ndWlkZS5odG1sIj5XZWIgYWRtaW5pc3RyYXRpb24NCi1hcHBsaWNhdGlvbjwvYT4sIGJ1dCB0byBtYWtlIHRoaW5ncyBzaW1wbGUgZm9yIG5vdywgY29weSB0aGUgKi5hYXINCi1maWxlIGludG8gdGhlIEF4aXMyIHNlcnZpY2VzIGRpcmVjdG9yeS4gRm9yIGV4YW1wbGUsIHRvIGluc3RhbGwgdGhlDQotTXlTZXJ2aWNlIHNlcnZpY2UgZGlzdHJpYnV0ZWQgYXMgb25lIG9mIHRoZSBBeGlzMiBzYW1wbGVzLCBjb3B5IHRoZQ0KLWZpbGUgJmx0O0FYSVMyX0hPTUUmZ3Q7L3NhbXBsZXMvdXNlcmd1aWRlL2J1aWxkL015U2VydmljZS5hYXIgZmlsZSwNCi13aGljaCBpcyBidWlsdCB1c2luZyB0aGUgPGNvZGU+YW50PC9jb2RlPiBjb21tYW5kLCBmcm9tDQotJmx0O0FYSVMyX0hPTUUmZ3Q7L3NhbXBsZXMvdXNlcmd1aWRlLCB0byB0aGUgZGlyZWN0b3J5DQotJmx0O0oyRUVfSE9NRSZndDsvd2ViYXBwcy9heGlzMi9XRUItSU5GL3NlcnZpY2VzLjwvcD4NCi08cD5Zb3VyIGNsaWVudCBjYW4gY29tZSBpbiBhbnkgbnVtYmVyIG9mIGZvcm1zLCBmcm9tIGEgY29sbGVjdGlvbg0KLW9mIGZpbGVzIHRvIGEgc2luZ2xlICouamFyIGZpbGUuIFRoZSBpbXBvcnRhbnQgdGhpbmcgaXMgdG8gZW5zdXJlDQotdGhhdCBhbGwgdGhlIGFwcHJvcHJpYXRlIGNsYXNzZXMgYXJlIG9uIHRoZSBjbGFzc3BhdGguIEluIGFkZGl0aW9uDQotdG8gdGhlIGNsYXNzZXMgdGhhdCBwZXJ0YWluIHRvIHRoZSBhY3R1YWwgY2xpZW50LCB5b3UgbXVzdCBhbHNvIGFkZA0KLXRoZSBBeGlzMiAuamFyIGZpbGVzIGludG8gdGhlIENMQVNTUEFUSC4gTm9ybWFsbHkgeW91IHdpbGwgZG8gdGhpcw0KLWJ5IGRvd25sb2FkaW5nIGFuZCB1bnBhY2tpbmcgdGhlIDxhIGhyZWY9DQotImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL2Rvd25sb2FkL0BheGlzMl92ZXJzaW9uX2RpckAvZG93bmxvYWQuY2dpI3N0ZC1iaW4iPg0KLUF4aXMyIFN0YW5kYXJkIERpc3RyaWJ1dGlvbjwvYT4gYW5kIGFkZGluZyB0aGUgKi5qYXIgZmlsZXMgaW4gdGhlDQotbGliIGRpcmVjdG9yeSB0byB5b3VyIENMQVNTUEFUSCwgb3IgeW91IGFsc28gaGF2ZSB0aGUgb3B0aW9uIG9mDQotcnVubmluZyB5b3VyIGNsaWVudCB1c2luZyB0aGUgYXhpczIuYmF0IChvciBheGlzMi5zaCkgc2NyaXB0LCB3aGljaA0KLXRha2VzIGNhcmUgb2YgaXQgZm9yIHlvdS4gRm9yIGV4YW1wbGUsIHlvdSBjYW4gcnVuIGEgY2xpZW50IHdpdGgNCi10aGUgY29tbWFuZDo8L3A+DQotPHA+YXhpczIgb3JnLmFwYWNoZS5heGlzMi5heGlzMnVzZXJndWlkZS5DbGllbnQuPC9wPg0KLTxwPjxzdHJvbmc+U2VlIE5leHQgU2VjdGlvbjwvc3Ryb25nPi0gPGEgaHJlZj0NCi0idXNlcmd1aWRlLWludHJvdG9zZXJ2aWNlcy5odG1sI2ludHJvc2VydmljZXMiPkludHJvZHVjdGlvbiB0bw0KLVNlcnZpY2VzPC9hPjwvcD4NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC91c2VyZ3VpZGUtaW50cm90b3NlcnZpY2VzLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC91c2VyZ3VpZGUtaW50cm90b3NlcnZpY2VzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ4YjhiZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvdXNlcmd1aWRlLWludHJvdG9zZXJ2aWNlcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiINCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPg0KLTxodG1sIGxhbmc9ImVuIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIj4NCi08aGVhZD4NCi08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9DQotIkhUTUwgVGlkeSBmb3IgV2luZG93cyAodmVycyAxNCBKdW5lIDIwMDcpLCBzZWUgd3d3LnczLm9yZyIgLz4NCi08bWV0YSBodHRwLWVxdWl2PSJjb250ZW50LXR5cGUiIGNvbnRlbnQ9IiIgLz4NCi08dGl0bGU+QXBhY2hlIEF4aXMyIFVzZXIncyBHdWlkZS0gSW50cm9kdWN0aW9uIHRvIFNlcnZpY2VzPC90aXRsZT4NCi08bGluayBocmVmPSIuLi9jc3MvYXhpcy1kb2NzLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyINCi1tZWRpYT0iYWxsIiAvPg0KLTwvaGVhZD4NCi08Ym9keT4NCi08YSBuYW1lPSJpbnRyb3NlcnZpY2VzIiBpZD0iaW50cm9zZXJ2aWNlcyI+PC9hPg0KLTxoMT5BcGFjaGUgQXhpczIgVXNlcidzIEd1aWRlIC0gSW50cm9kdWN0aW9uIHRvIFNlcnZpY2VzPC9oMT4NCi08cD5UaGUgdGVybSAiV2ViIHNlcnZpY2VzIiBjYW4gYXBwbHkgdG8gYSBudW1iZXIgb2YgZGlmZmVyZW50IHdheXMNCi1vZiBzZW5kaW5nIGluZm9ybWF0aW9uIGJhY2sgYW5kIGZvcnRoLiBIb3dldmVyLCB0aGlzIGd1aWRlIGZvY3VzZXMNCi1vbiB0aGUgc2VuZGluZyBhbmQgcmVjZWl2aW5nIG9mIFNPQVAgbWVzc2FnZXMuIFNPQVAgbWVzc2FnZXMgYXJlDQotWE1MIGRvY3VtZW50cyB0aGF0IGNvbnNpc3Qgb2YgYW4gImVudmVsb3BlIiBjb250YWluaW5nIGEgInBheWxvYWQiDQotKHNlZSBDb2RlIExpc3RpbmcgNCkuPC9wPg0KLTxoMj5Db250ZW50PC9oMj4NCi08dWw+DQotPGxpPjxhIGhyZWY9InVzZXJndWlkZS5odG1sI2ludHJvIj5JbnRyb2R1Y2luZyBBeGlzMjwvYT48YnIgLz4NCi08dWw+DQotPGxpPjxhIGhyZWY9InVzZXJndWlkZS5odG1sI3doYXRpcyI+V2hhdCBpcyBBeGlzMj88L2E+PC9saT4NCi08bGk+PGEgaHJlZj0idXNlcmd1aWRlLmh0bWwjdW5kZXJob29kIj5XaGF0J3MgdW5kZXIgdGhlDQotaG9vZD88L2E+PC9saT4NCi08bGk+PGEgaHJlZj0idXNlcmd1aWRlLmh0bWwjaGFuZGxlc3NvYXAiPkhvdyBBeGlzMiBoYW5kbGVzIFNPQVANCi1tZXNzYWdlczwvYT48L2xpPg0KLTxsaT48YSBocmVmPSJ1c2VyZ3VpZGUuaHRtbCNkaXN0cmlidXRpb25zIj5BeGlzMg0KLWRpc3RyaWJ1dGlvbnM8L2E+PC9saT4NCi08bGk+PGEgaHJlZj0idXNlcmd1aWRlLmh0bWwjc2JkIj5UaGUgQXhpczIgU3RhbmRhcmQgQmluYXJ5DQotRGlzdHJpYnV0aW9uPC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9InVzZXJndWlkZS5odG1sI2hpZXJhcmNoeSI+QXhpczIud2FyIERpcmVjdG9yeQ0KLUhpZXJhcmNoeTwvYT48L2xpPg0KLTxsaT48YSBocmVmPSJ1c2VyZ3VpZGUuaHRtbCNkb2NzIj5BeGlzMiBEb2N1bWVudHMNCi1EaXN0cmlidXRpb248L2E+PC9saT4NCi08bGk+PGEgaHJlZj0idXNlcmd1aWRlLmh0bWwjY2xpZW50cyI+QXhpczIgYW5kIGNsaWVudHM8L2E+PC9saT4NCi08L3VsPg0KLTwvbGk+DQotPGxpPjxhIGhyZWY9DQotInVzZXJndWlkZS1pbnN0YWxsaW5ndGVzdGluZy5odG1sI2luc3RhbGxpbmd0ZXN0aW5nIj5JbnN0YWxsaW5nIGFuZA0KLXRlc3RpbmcgY2xpZW50IGNvZGU8L2E+PC9saT4NCi08bGk+PGEgaHJlZj0NCi0idXNlcmd1aWRlLWludHJvdG9zZXJ2aWNlcy5odG1sI2ludHJvc2VydmljZXMiPjxzdHJvbmc+SW50cm9kdWN0aW9uDQotdG8gU2VydmljZXM8L3N0cm9uZz48L2E+PGJyIC8+DQotPHVsPg0KLTxsaT48YSBocmVmPQ0KLSJ1c2VyZ3VpZGUtaW50cm90b3NlcnZpY2VzLmh0bWwjbWVzc2FnZWV4Y2hhbmdlIj48c3Ryb25nPk1lc3NhZ2UNCi1FeGNoYW5nZSBQYXR0ZXJuczwvc3Ryb25nPjwvYT48L2xpPg0KLTwvdWw+DQotPC9saT4NCi08bGk+PGEgaHJlZj0idXNlcmd1aWRlLWNyZWF0aW5nY2xpZW50cy5odG1sI2NyZWF0ZWNsaWVudHMiPkNyZWF0aW5nDQotQ2xpZW50czwvYT48YnIgLz4NCi08dWw+DQotPGxpPjxhIGhyZWY9DQotInVzZXJndWlkZS1jcmVhdGluZ2NsaWVudHMuaHRtbCNjaG9vc2luZ2NsaWVudCI+Q2hvb3NpbmcgYSBDbGllbnQNCi1HZW5lcmF0aW9uIE1ldGhvZDwvYT48L2xpPg0KLTxsaT48YSBocmVmPSJ1c2VyZ3VpZGUtY3JlYXRpbmdjbGllbnRzLmh0bWwjZ2VuZXJhdGluZyI+R2VuZXJhdGluZw0KLUNsaWVudHM8L2E+PC9saT4NCi08bGk+PGEgaHJlZj0idXNlcmd1aWRlLWNyZWF0aW5nY2xpZW50cy5odG1sI2FkYiI+QXhpcyBEYXRhIEJpbmRpbmcNCi0oQURCKTwvYT48L2xpPg0KLTwvdWw+DQotPC9saT4NCi08bGk+PGEgaHJlZj0NCi0idXNlcmd1aWRlLWJ1aWxkaW5nc2VydmljZXMuaHRtbCNidWlsZHNlcnZpY2VzIj5CdWlsZGluZw0KLVNlcnZpY2VzPC9hPjxiciAvPg0KLTx1bD4NCi08bGk+PGEgaHJlZj0NCi0idXNlcmd1aWRlLWJ1aWxkaW5nc2VydmljZXMuaHRtbCNnZXRjb21mb3J0YWJsZSI+R2V0dGluZw0KLUNvbWZvcnRhYmxlIHdpdGggdGhlIEF2YWlsYWJsZSBPcHRpb25zPC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9DQotInVzZXJndWlkZS1idWlsZGluZ3NlcnZpY2VzLmh0bWwjY3JlYXRlc2NyYXRjaCI+Q3JlYXRpbmcgYSBzZXJ2aWNlDQotZnJvbSBzY3JhdGNoPC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9InVzZXJndWlkZS1idWlsZGluZ3NlcnZpY2VzLmh0bWwjZGVwbG95cG9qbyI+RGVwbG95aW5nDQotUGxhaW4gT2xkIEphdmEgT2JqZWN0czwvYT48L2xpPg0KLTxsaT48YSBocmVmPSJ1c2VyZ3VpZGUtYnVpbGRpbmdzZXJ2aWNlcy5odG1sI2RlcGxveXJ1biI+RGVwbG95aW5nDQotYW5kIHJ1bm5pbmcgYW4gQXhpczIgc2VydmljZSBjcmVhdGVkIGZyb20gV1NETDwvYT48L2xpPg0KLTwvdWw+DQotPC9saT4NCi08bGk+PGEgaHJlZj0idXNlcmd1aWRlLXNhbXBsZXMuaHRtbCI+U2FtcGxlczwvYT48L2xpPg0KLTxsaT48YSBocmVmPSJ1c2VyZ3VpZGUtZm9yZnVydGhlcnN0dWR5Lmh0bWwiPkZvciBGdXJ0aGVyDQotU3R1ZHk8L2E+PC9saT4NCi08L3VsPg0KLTxoMz5Db2RlIExpc3RpbmcgNDogRXhhbXBsZSBTT0FQIE1lc3NhZ2U8L2gzPg0KLTxwcmU+DQotJmx0Oz94bWwgdmVyc2lvbj0nMS4wJyA/Jmd0Ow0KLSZsdDtlbnY6RW52ZWxvcGUgeG1sbnM6ZW52PSJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUiDQoteG1sbnM6d3NhPSJodHRwOi8vd3d3LnczLm9yZy8yMDA1LzAzL2FkZHJlc3NpbmciJmd0OyANCi0gJmx0O2VudjpIZWFkZXImZ3Q7DQotDQotICAgICZsdDt3c2E6TWVzc2FnZUlEJmd0Ow0KLSAgICAgIGh0dHA6Ly93cy5hcGFjaGUub3JnLzlDMjFERTMyLURCNDItMTIyOC1DNDJFLTY2Q0IxMDE0MjFBRA0KLSAgICAmbHQ7L3dzYTpNZXNzYWdlSUQmZ3Q7DQotICAgICZsdDt3c2E6UmVwbHlUbyZndDsNCi0gICAgICAmbHQ7d3NhOkFkZHJlc3MmZ3Q7aHR0cDovL2V4YW1wbGUuY29tL3Byb2plY3RzL2NsaWVudEFwcCZsdDsvd3NhOkFkZHJlc3MmZ3Q7DQotICAgICZsdDsvd3NhOlJlcGx5VG8mZ3Q7DQotICAgIA0KLSZsdDt3c2E6VG8mZ3Q7aHR0cDovL2V4YW1wbGUuY29tL2F4aXMyL3B1Ymxpc2hpbmdTZXJ2aWNlJmx0Oy93c2E6VG8mZ3Q7DQotICAgIA0KLSZsdDt3c2E6QWN0aW9uJmd0O2h0dHA6Ly9leGFtcGxlLmNvbS9heGlzMi9hZGREb2N1bWVudCZsdDsvd3NhOkFjdGlvbiZndDsNCi0gDQotJmx0Oy9lbnY6SGVhZGVyJmd0Ow0KLSAmbHQ7ZW52OkJvZHkmZ3Q7DQotDQotICAmbHQ7YWRkRG9jdW1lbnQmZ3Q7DQotICAgJmx0O2RvY1RpdGxlJmd0O1doYXQgSSBEaWQgT24gTXkgU3VtbWVyIFZhY2F0aW9uJmx0Oy9kb2N0aXRsZSZndDsNCi0gICAmbHQ7ZG9jU3VidGl0bGUmZ3Q7Q2hpbGRyZW4ncyBFc3NheXMgZnJvbSBBY2Nyb3NzIHRoZSBXb3JsZCZsdDsvZG9jU3VidGl0bGUmZ3Q7DQotICAgJmx0O2RvY0xvY2F0aW9uJmd0O2NvbnRlbnRSZXBvcy9zdW1tZXJWYWMuZG9jJmx0Oy9kb2NMb2NhdGlvbiZndDsNCi0gICZsdDsvYWRkRG9jdW1lbnQmZ3Q7DQotDQotICZsdDsvZW52OkJvZHkmZ3Q7DQotJmx0Oy9lbnY6RW52ZWxvcGUmZ3Q7DQotPC9wcmU+DQotPHA+VGhpcyBYTUwgZG9jdW1lbnQgY29uc2lzdHMgb2YgdGhlIG91dGVyIGVsZW1lbnQgb3IgdGhlIFNPQVANCi1FbnZlbG9wZSwgYW5kIGl0cyBjb250ZW50cy4gVGhlIFNPQVAgRW52ZWxvcGUgaXMgaW4gdGhlIFNPQVANCi1uYW1lc3BhY2UsIGh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZSwgcHJlZml4ZWQgYXMNCi1lbnY6IGFuZCBjb250YWlucyB1cCB0byB0d28gY2hpbGRyZW4uIFRoaXMgZW52ZWxvcGUgaXMgYSBzdGFuZGFyZA0KLWZvcm1hdCB0aGF0IHBlcnRhaW5zIHRvIGV2ZXJ5IHNpbmdsZSBTT0FQIG1lc3NhZ2Ugc2VudCBhbmQgcmVjZWl2ZWQNCi1ieSBhbnkgU09BUCBXZWIgc2VydmljZS48L3A+DQotPHA+VGhlIGNvbnRlbnRzIG9mIHRoZSBFbnZlbG9wZSBjb25zaXN0cyBvZiB0d28gcGFydHM7IHRoZSBmaXJzdA0KLWJlaW5nIHRoZSBTT0FQIGhlYWRlcnMtdGhlIGNvbnRlbnRzIG9mIHRoZSBlbnY6SGVhZGVyIGVsZW1lbnQuDQotVGhlc2UgaGVhZGVycywgc3VjaCBhcyB0aGUgV1MtQWRkcmVzc2luZyBlbGVtZW50cyBzaG93biBoZXJlLA0KLXByb3ZpZGUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbWVzc2FnZSBhbmQgaG93IGl0IHNob3VsZA0KLWJlIGhhbmRsZWQuIEEgU09BUCBtZXNzYWdlIG1heSBjYXJyeSBoZWFkZXJzIHJlbGF0aW5nIHRvIHNldmVyYWwNCi1hc3BlY3RzIG9mIHRoZSBtZXNzYWdlLCBvciBpdCBtYXkgY2Fycnkgbm8gaGVhZGVycyBhdCBhbGwuIFRoZXNlDQotaGVhZGVycyBhcmUgdHlwaWNhbGx5IHByb2Nlc3NlZCBieSB0aGUgbWVzc2FnZSBoYW5kbGVycy48L3A+DQotPHA+VGhlIHNlY29uZCBhbmQgYXJndWFibHkgdGhlIG1vc3QgaW1wb3J0YW50IHBhcnQgb2YgdGhlIG1lc3NhZ2UNCi1pcyB0aGUgcGF5bG9hZCwgd2hpY2ggY29uc2lzdHMgb2YgdGhlIGNvbnRlbnRzIG9mIHRoZSBlbnY6Qm9keQ0KLWVsZW1lbnQuIFRoaXMgaXMgdGhlIGFjdHVhbCBtZXNzYWdlIGludGVuZGVkIGZvciB0aGUgcmVjZWl2ZXIsIGFuZA0KLWl0IGlzIHRoZSBpbmZvcm1hdGlvbiB0aGF0IHRoZSBtYWluIGFwcGxpY2F0aW9uIHdpbGwgdWx0aW1hdGVseQ0KLXByb2Nlc3MuPC9wPg0KLTxhIG5hbWU9Im1lc3NhZ2VleGNoYW5nZSIgaWQ9Im1lc3NhZ2VleGNoYW5nZSI+PC9hPg0KLTxoMj5NZXNzYWdlIEV4Y2hhbmdlIFBhdHRlcm5zPC9oMj4NCi08cD5BbHRob3VnaCBhbGwgU09BUCBtZXNzYWdlcyBjYXJyeSB0aGUgc2FtZSBzdHJ1Y3R1cmUsIHRoZSB3YXlzIGluDQotd2hpY2ggdGhleSBhcmUgdXNlZCBjYW4gYmUgY29tYmluZWQgaW50byBhIG51bWJlciBvZiBkaWZmZXJlbnQNCi0ibWVzc2FnZSBleGNoYW5nZSBwYXR0ZXJucyIsIG9yIE1FUHMuIFRoZSB0d28gbWFqb3IgbWVzc2FnZQ0KLWV4Y2hhbmdlIHBhdHRlcm5zIGFyZTo8L3A+DQotPHVsPg0KLTxsaT5Jbi1PdXQ6IGluIHRoaXMgTUVQLCB0aGUgY2xpZW50IHNlbmRzIGEgU09BUCBtZXNzYWdlIHRvIHRoZQ0KLXNlcnZlciwgd2hpY2ggcHJvY2Vzc2VzIHRoZSBtZXNzYWdlIGFuZCBzZW5kcyBhIHJlc3BvbnNlIGJhY2suIFRoaXMNCi1pcyBwcm9iYWJseSB0aGUgbW9zdCBjb21tb25seSB1c2VkIE1FUCwgYW5kIGlzIHVzZWZ1bCBmb3IgdGFza3MNCi1zdWNoIGFzIHNlYXJjaGluZyBmb3IgaW5mb3JtYXRpb24gb3Igc3VibWl0dGluZyBpbmZvcm1hdGlvbiBpbg0KLXNpdHVhdGlvbnMgaW4gd2hlcmUgYWNrbm93bGVkZ21lbnQgaXMgaW1wb3J0YW50LjwvbGk+DQotPGxpPkluLU9ubHk6IEluIHRoaXMgTUVQLCB0aGUgY2xpZW50IHNlbmRzIGEgbWVzc2FnZSB0byB0aGUgc2VydmVyDQotd2l0aG91dCBleHBlY3RpbmcgYSByZXNwb25zZS4gWW91IG1heSB1c2UgdGhpcyBNRVAgZm9yIGFjdGl2aXRpZXMNCi1zdWNoIGFzIHBpbmdpbmcgYSBzZXJ2ZXIgdG8gd2FrZSBpdCB1cCwgcmVwb3J0aW5nIGxvZ2dpbmcNCi1pbmZvcm1hdGlvbiBmb3Igd2hpY2ggeW91IGRvIG5vdCBuZWVkIGFuIGFja25vd2xlZGdtZW50IGFuZCBzbw0KLW9uLjwvbGk+DQotPC91bD4NCi08cD5XaXRoaW4gdGhlc2UgdHdvIE1FUHMsIHlvdSBhbHNvIGhhdmUgc2V2ZXJhbCB2YXJpYWJsZXMgdG8NCi1jb25zaWRlcjo8L3A+DQotPHVsPg0KLTxsaT5CbG9ja2luZyB2ZXJzdXMgbm9uLWJsb2NraW5nOiBXaGVuIHRoZSBjbGllbnQgc2VuZHMgYSBtZXNzYWdlLA0KLXRoZSBhcHBsaWNhdGlvbiBtYXkgd2FpdCB0byByZWNlaXZlIGEgcmVzcG9uc2UgYmVmb3JlIG1vdmluZyBvbiwgb3INCi1pdCBtYXkgc2ltcGx5IHNlbmQgYSBtZXNzYWdlIGFuZCBtb3ZlIG9uIGJ5IHNwZWNpZnlpbmcgYSBjYWxsYmFjaw0KLWFjdGlvbiB0byBiZSBjb21wbGV0ZWQgd2hlbiB0aGUgcmVzcG9uc2UgaXMgcmVjZWl2ZWQuPC9saT4NCi08bGk+TnVtYmVyIG9mIHBhcmFtZXRlcnM6IFVsdGltYXRlbHksIGEgbWVzc2FnZSBzZW50IGZyb20gYSBjbGllbnQNCi10byBzZXJ2ZXIgaXMgaW50ZW5kZWQgdG8gZXhlY3V0ZSBhIHBhcnRpY3VsYXIgYWN0aW9uLiBUaGF0IGFjdGlvbg0KLW1heSBub3QgcmVxdWlyZSBhbnkgcGFyYW1ldGVycywgb3IgaXQgbWF5IHJlcXVpcmUgb25lIG9yIG1vcmUNCi1wYXJhbWV0ZXJzLiBUaGVzZSBwYXJhbWV0ZXJzIG11c3QgYmUgZW5jb2RlZCBhcyBwYXJ0IG9mIHRoZSBwYXlsb2FkDQotb2YgdGhlIG1lc3NhZ2UuPC9saT4NCi08L3VsPg0KLTxwPlRha2luZyBhbGwgdGhlc2Ugb3B0aW9ucyBpbnRvIGNvbnNpZGVyYXRpb24sIHlvdSBjYW4gY3JlYXRlDQotdmlydHVhbGx5IGFueSBNRVAuIEZvciBleGFtcGxlLCB5b3UgY2FuIGNyZWF0ZSBhbiBPdXQtT25seSBzeXN0ZW0NCi1ieSByZXZlcnNpbmcgcm9sZXMgZm9yIHRoZSBJbi1Pbmx5IE1FUC4gQXBhY2hlIEF4aXMyIGFsc28gaW5jbHVkZXMNCi1zdXBwb3J0IGZvciBsZXNzIHByb21pbmVudCBNRVBzLCBzdWNoIGFzIFJvYnVzdC1Jbi1Pbmx5LjwvcD4NCi08cD48c3Ryb25nPlNlZSBOZXh0IFNlY3Rpb248L3N0cm9uZz4gLSA8YSBocmVmPQ0KLSJ1c2VyZ3VpZGUtY3JlYXRpbmdjbGllbnRzLmh0bWwjY3JlYXRlY2xpZW50cyI+Q3JlYXRpbmcNCi1DbGllbnRzPC9hPjwvcD4NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC91c2VyZ3VpZGUtc2FtcGxlcy54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvdXNlcmd1aWRlLXNhbXBsZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzc3MWRhLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC91c2VyZ3VpZGUtc2FtcGxlcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMDQgKzAsMCBAQAotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiINCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPg0KLTxodG1sIGxhbmc9ImVuIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIj4NCi08aGVhZD4NCi08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9DQotIkhUTUwgVGlkeSBmb3IgV2luZG93cyAodmVycyAxNCBKdW5lIDIwMDcpLCBzZWUgd3d3LnczLm9yZyIgLz4NCi08bWV0YSBodHRwLWVxdWl2PSJjb250ZW50LXR5cGUiIGNvbnRlbnQ9IiIgLz4NCi08dGl0bGU+QXBhY2hlIEF4aXMyIFVzZXIncyBHdWlkZS0gVGhlIFNhbXBsZXM8L3RpdGxlPg0KLTxsaW5rIGhyZWY9Ii4uL2Nzcy9heGlzLWRvY3MuY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIg0KLW1lZGlhPSJhbGwiIC8+DQotPC9oZWFkPg0KLTxib2R5IGxhbmc9ImVuIiB4bWw6bGFuZz0iZW4iPg0KLTxhIG5hbWU9InNhbXBsZXMiIGlkPSJzYW1wbGVzIj48L2E+DQotPGgxPkFwYWNoZSBBeGlzMiBVc2VyJ3MgR3VpZGUgLSBUaGUgU2FtcGxlczwvaDE+DQotPHA+VGhlIEFwYWNoZSBBeGlzMiBTdGFuZGFyZCBEaXN0cmlidXRpb24gcHJvdmlkZXMgYSBudW1iZXIgb2YNCi1zYW1wbGVzIHlvdSBjYW4gdXNlIGFzIGEgZ3VpZGUgZm9yIGltcGxlbWVudGluZyBzcGVjaWZpYyBmZWF0dXJlcw0KLWFuZCBjYXBhYmlsaXRpZXMuIFRoZXNlIHNlcnZpY2VzIGFyZSBsaXN0ZWQgaW4gdGhpcyBzZWN0aW9uLjwvcD4NCi08aDI+Q29udGVudDwvaDI+DQotPHVsPg0KLTxsaT48YSBocmVmPSJ1c2VyZ3VpZGUuaHRtbCNpbnRybyI+SW50cm9kdWNpbmcgQXhpczI8L2E+PGJyIC8+DQotPHVsPg0KLTxsaT48YSBocmVmPSJ1c2VyZ3VpZGUuaHRtbCN3aGF0aXMiPldoYXQgaXMgQXhpczI/PC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9InVzZXJndWlkZS5odG1sI3VuZGVyaG9vZCI+V2hhdCdzIHVuZGVyIHRoZQ0KLWhvb2Q/PC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9InVzZXJndWlkZS5odG1sI2hhbmRsZXNzb2FwIj5Ib3cgQXhpczIgaGFuZGxlcyBTT0FQDQotbWVzc2FnZXM8L2E+PC9saT4NCi08bGk+PGEgaHJlZj0idXNlcmd1aWRlLmh0bWwjZGlzdHJpYnV0aW9ucyI+QXhpczINCi1kaXN0cmlidXRpb25zPC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9InVzZXJndWlkZS5odG1sI3NiZCI+VGhlIEF4aXMyIFN0YW5kYXJkIEJpbmFyeQ0KLURpc3RyaWJ1dGlvbjwvYT48L2xpPg0KLTxsaT48YSBocmVmPSJ1c2VyZ3VpZGUuaHRtbCNoaWVyYXJjaHkiPkF4aXMyLndhciBEaXJlY3RvcnkNCi1IaWVyYXJjaHk8L2E+PC9saT4NCi08bGk+PGEgaHJlZj0idXNlcmd1aWRlLmh0bWwjZG9jcyI+QXhpczIgRG9jdW1lbnRzDQotRGlzdHJpYnV0aW9uPC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9InVzZXJndWlkZS5odG1sI2NsaWVudHMiPkF4aXMyIGFuZCBjbGllbnRzPC9hPjwvbGk+DQotPC91bD4NCi08L2xpPg0KLTxsaT48YSBocmVmPQ0KLSJ1c2VyZ3VpZGUtaW5zdGFsbGluZ3Rlc3RpbmcuaHRtbCNpbnN0YWxsaW5ndGVzdGluZyI+SW5zdGFsbGluZyBhbmQNCi10ZXN0aW5nIGNsaWVudCBjb2RlPC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9DQotInVzZXJndWlkZS1pbnRyb3Rvc2VydmljZXMuaHRtbCNpbnRyb3NlcnZpY2VzIj5JbnRyb2R1Y3Rpb24gdG8NCi1TZXJ2aWNlczwvYT48YnIgLz4NCi08dWw+DQotPGxpPjxhIGhyZWY9DQotInVzZXJndWlkZS1pbnRyb3Rvc2VydmljZXMuaHRtbCNtZXNzYWdlZXhjaGFuZ2UiPk1lc3NhZ2UgRXhjaGFuZ2UNCi1QYXR0ZXJuczwvYT48L2xpPg0KLTwvdWw+DQotPC9saT4NCi08bGk+PGEgaHJlZj0idXNlcmd1aWRlLWNyZWF0aW5nY2xpZW50cy5odG1sI2NyZWF0ZWNsaWVudHMiPkNyZWF0aW5nDQotQ2xpZW50czwvYT48YnIgLz4NCi08dWw+DQotPGxpPjxhIGhyZWY9DQotInVzZXJndWlkZS1jcmVhdGluZ2NsaWVudHMuaHRtbCNjaG9vc2luZ2NsaWVudCI+Q2hvb3NpbmcgYSBDbGllbnQNCi1HZW5lcmF0aW9uIE1ldGhvZDwvYT48L2xpPg0KLTxsaT48YSBocmVmPSJ1c2VyZ3VpZGUtY3JlYXRpbmdjbGllbnRzLmh0bWwjZ2VuZXJhdGluZyI+R2VuZXJhdGluZw0KLUNsaWVudHM8L2E+PC9saT4NCi08bGk+PGEgaHJlZj0idXNlcmd1aWRlLWNyZWF0aW5nY2xpZW50cy5odG1sI2FkYiI+QXhpcyBEYXRhIEJpbmRpbmcNCi0oQURCKTwvYT48L2xpPg0KLTwvdWw+DQotPC9saT4NCi08bGk+PGEgaHJlZj0NCi0idXNlcmd1aWRlLWJ1aWxkaW5nc2VydmljZXMuaHRtbCNidWlsZHNlcnZpY2VzIj5CdWlsZGluZw0KLVNlcnZpY2VzPC9hPjxiciAvPg0KLTx1bD4NCi08bGk+PGEgaHJlZj0NCi0idXNlcmd1aWRlLWJ1aWxkaW5nc2VydmljZXMuaHRtbCNnZXRjb21mb3J0YWJsZSI+R2V0dGluZw0KLUNvbWZvcnRhYmxlIHdpdGggdGhlIEF2YWlsYWJsZSBPcHRpb25zPC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9DQotInVzZXJndWlkZS1idWlsZGluZ3NlcnZpY2VzLmh0bWwjY3JlYXRlc2NyYXRjaCI+Q3JlYXRpbmcgYSBzZXJ2aWNlDQotZnJvbSBzY3JhdGNoPC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9InVzZXJndWlkZS1idWlsZGluZ3NlcnZpY2VzLmh0bWwjZGVwbG95cG9qbyI+RGVwbG95aW5nDQotUGxhaW4gT2xkIEphdmEgT2JqZWN0czwvYT48L2xpPg0KLTxsaT48YSBocmVmPSJ1c2VyZ3VpZGUtYnVpbGRpbmdzZXJ2aWNlcy5odG1sI2RlcGxveXJ1biI+RGVwbG95aW5nDQotYW5kIHJ1bm5pbmcgYW4gQXhpczIgc2VydmljZSBjcmVhdGVkIGZyb20gV1NETDwvYT48L2xpPg0KLTwvdWw+DQotPC9saT4NCi08bGk+PGEgaHJlZj0idXNlcmd1aWRlLXNhbXBsZXMuaHRtbCI+PHN0cm9uZz5TYW1wbGVzPC9zdHJvbmc+PC9hPg0KLTx1bD4NCi08bGk+PGEgaHJlZj0NCi0idXNlcmd1aWRlLXNhbXBsZXMuaHRtbCNjbGllbnRzIj48c3Ryb25nPkNsaWVudHM8L3N0cm9uZz48L2E+PC9saT4NCi08bGk+PGEgaHJlZj0NCi0idXNlcmd1aWRlLXNhbXBsZXMuaHRtbCNzZXJ2aWNlcyI+PHN0cm9uZz5TZXJ2aWNlczwvc3Ryb25nPjwvYT48L2xpPg0KLTxsaT48YSBocmVmPSJ1c2VyZ3VpZGUtc2FtcGxlcy5odG1sI3dzZGwiPjxzdHJvbmc+U2FtcGxlIFdTREwNCi1maWxlczwvc3Ryb25nPjwvYT48L2xpPg0KLTxsaT48YSBocmVmPSJ1c2VyZ3VpZGUtc2FtcGxlcy5odG1sI290aGVycyI+PHN0cm9uZz5PdGhlcg0KLVNhbXBsZXM8L3N0cm9uZz48L2E+PC9saT4NCi08L3VsPg0KLTwvbGk+DQotPGxpPjxhIGhyZWY9InVzZXJndWlkZS1mb3JmdXJ0aGVyc3R1ZHkuaHRtbCI+Rm9yIEZ1cnRoZXINCi1TdHVkeTwvYT48L2xpPg0KLTwvdWw+DQotPGEgbmFtZT0iY2xpZW50cyIgaWQ9ImNsaWVudHMiPjwvYT4NCi08aDI+Q2xpZW50cyAoaW4gQVhJUzJfSE9NRS9zYW1wbGVzL3VzZXJndWlkZS9zcmMvY2xpZW50cyk6PC9oMj4NCi08cD48c3Ryb25nPkVjaG9CbG9ja2luZ0NsaWVudC5qYXZhPC9zdHJvbmc+OiBBIGJhc2ljIGV4YW1wbGUgb2YgdGhlDQotc2VuZC9yZWNlaXZlIE1FUC48L3A+DQotPHA+PHN0cm9uZz5FY2hvQmxvY2tpbmdEdWFsQ2xpZW50LmphdmE8L3N0cm9uZz46IFNwZWNpZmllcyB0aGF0IHRoZQ0KLXJldHVybiBtZXNzYWdlIHNob3VsZCBiZSBzZW50IG92ZXIgYSBkaWZmZXJlbnQgY2hhbm5lbCB0aGFuIHRoZQ0KLXJlcXVlc3QgbWVzc2FnZS48L3A+DQotPHA+PHN0cm9uZz5FY2hvQmxvY2tpbmdXc2FCYXNlZENsaWVudC5qYXZhPC9zdHJvbmc+OiBQcm92aWRlcyBhbg0KLWV4YW1wbGUgb2YgdXNpbmcgdGhlIGNhcGFiaWxpdGllcyBvZiBXUy1BZGRyZXNzaW5nIGFjdGlvbg0KLW1hcHBpbmcuPC9wPg0KLTxwPjxzdHJvbmc+RWNob05vbkJsb2NraW5nQ2xpZW50LmphdmE8L3N0cm9uZz46IERlbW9uc3RyYXRlcyBhbg0KLWFzeW5jaHJvbm91cyByZXF1ZXN0IHVzaW5nIENhbGxiYWNrcy48L3A+DQotPHA+PHN0cm9uZz5FY2hvTm9uQmxvY2tpbmdEdWFsQ2xpZW50LmphdmE8L3N0cm9uZz46IFNpbWlsYXIgdG8gdGhlDQotYWJvdmUsIGJ1dCB1c2VzIGEgc2VwYXJhdGUgbGlzdGVuZXIgZm9yIHRoZSByZXNwb25zZS48L3A+DQotPHA+PHN0cm9uZz5DbGllbnRGb3JXZWJTZXJ2aWNlV2l0aE1vZHVsZS5qYXZhPC9zdHJvbmc+OiBTaW1wbHkNCi1tYWtlcyBhIGNhbGwgdG8gYSBzZXJ2aWNlIHdpdGggZW5nYWdlZCBtb2R1bGVzLjwvcD4NCi08cD48c3Ryb25nPkNsaWVudFNpZGVNb2R1bGVFbmdhZ2VtZW50LmphdmE8L3N0cm9uZz46IERlbW9uc3RyYXRlcw0KLXRoZSB1c2Ugb2YgbW9kdWxlcyBvbiB0aGUgY2xpZW50IHNpZGUsIGluIGFkZGl0aW9uIHRvIHRoZSBzZXJ2ZXINCi1zaWRlLjwvcD4NCi08cD48c3Ryb25nPk1haWxDbGllbnQuamF2YTwvc3Ryb25nPjogRGVtb25zdHJhdGVzIHRoZSB1c2Ugb2YgdGhlDQotUm9idXN0IEluLU9ubHkgTUVQLjwvcD4NCi08cD48c3Ryb25nPlBpbmdDbGllbnQuamF2YTwvc3Ryb25nPjogQSBzaW1wbGUgImZpcmUgYW5kIGZvcmdldCINCi1jbGllbnQuPC9wPg0KLTxwPjxzdHJvbmc+UkVTVENsaWVudC5qYXZhPC9zdHJvbmc+OiBEZW1vbnN0cmF0ZXMgdGhlIGFiaWxpdHkgdG8NCi1yZXF1ZXN0IGEgUkVTVCByZXNwb25zZSByYXRoZXIgdGhhbiBhIFNPQVAgcmVzcG9uc2UuIEFsc28NCi1kZW1vbnN0cmF0ZXMgc2V0dGluZyBhcmJpdHJhcnkgcHJvcGVydGllcyBvbiB0aGUgT3B0aW9ucw0KLW9iamVjdC48L3A+DQotPHA+PHN0cm9uZz5UQ1BDbGllbnQuamF2YTwvc3Ryb25nPjogUHJvdmlkZXMgYW4gZXhhbXBsZSBvZiB1c2luZw0KLXRoZSBUQ1AgdHJhbnNwb3J0IHJhdGhlciB0aGFuIEhUVFAuPC9wPg0KLTxhIG5hbWU9InNlcnZpY2VzIiBpZD0ic2VydmljZXMiPjwvYT4NCi08aDI+U2VydmljZXMgKGluIEFYSVMyX0hPTUUvc2FtcGxlcy91c2VyZ3VpZGUpOjwvaDI+DQotPHA+PHN0cm9uZz5ncm9vdnlTZXJ2aWNlLmFhcjwvc3Ryb25nPjogRGVtb25zdHJhdGVzIGhvdyB0byB1c2UNCi1Hcm9vdnkgY2xhc3NlcyBpbiB0aGUgcHJvY2Vzc2luZyBvZiBTT0FQIG1lc3NhZ2VzLjwvcD4NCi08cD48c3Ryb25nPk15U2VydmljZS5hYXI8L3N0cm9uZz46IFByb3ZpZGVzIHNpbXBsZSAiZWNobyIgYW5kDQotInBpbmciIG9wZXJhdGlvbnMuPC9wPg0KLTxwPjxzdHJvbmc+TXlTZXJ2aWNlV2l0aE1vZHVsZS5hYXI8L3N0cm9uZz46IFNhbWUgYXMgYWJvdmUsIGJ1dA0KLWRlbW9uc3RyYXRlcyBob3cgdG8gZW5nYWdlIGEgbW9kdWxlLjwvcD4NCi08cD48c3Ryb25nPldzYU1hcHBpbmdTZXJ2aWNlLmFhcjwvc3Ryb25nPjogRGVtb25zdHJhdGVzIHRoZSBtYXBwaW5nDQotb2YgV1MtQWRkcmVzc2luZyBhY3Rpb25zLjwvcD4NCi08YSBuYW1lPSJ3c2RsIiBpZD0id3NkbCI+PC9hPg0KLTxoMj5TYW1wbGUgV1NETCBmaWxlcyAoaW4gQVhJUzJfSE9NRS9zYW1wbGVzKTo8L2gyPg0KLTxwPjxzdHJvbmc+QXhpczJTYW1wbGVEb2NMaXQud3NkbDwvc3Ryb25nPjogRGVtb25zdHJhdGVzIHRoZSB1c2Ugb2YNCi10aGUgRG9jdW1lbnQvTGl0ZXJhbCBXU0RMIHBhdHRlcm4sIHJhdGhlciB0aGFuIFJQQy48L3A+DQotPHA+PHN0cm9uZz5wZXJmLndzZGw8L3N0cm9uZz46IERlbW9uc3RyYXRlcyB0aGUgdXNlIG9mIGFycmF5IHZhbHVlcw0KLWFzIGlucHV0IHZhbHVlcy48L3A+DQotPGEgbmFtZT0ib3RoZXJzIiBpZD0ib3RoZXJzIj48L2E+DQotPGgyPk90aGVyIHNhbXBsZXM8L2gyPg0KLTxoMz5JbiBBWElTMl9IT01FL3NhbXBsZXMgRGlyZWN0b3J5OjwvaDM+DQotPCEtLTxwPjxzdHJvbmc+YW1hem9ucXM8L3N0cm9uZz46IFVzZXMgdGhlIEFtYXpvbiBRdWV1ZSBTZXJ2aWNlIHRvIHN0b3JlIGFuZA0KLXJldHJpZXZlIFN0cmluZyBvYmplY3RzLjwvcD4tLT4NCi08cD48c3Ryb25nPmZhdWx0aGFuZGxpbmc8L3N0cm9uZz46IERlbW9uc3RyYXRlcyB0aGUgdXNlIG9mIFNPQVANCi1mYXVsdHMgYW5kIHRoZWlyIGRlZmluaXRpb25zIGluIFdTREwgZW5hYmxpbmcgZXhjZXB0aW9uIHByb2Nlc3NpbmcNCi1pbiB0aGUgY2xpZW50LjwvcD4NCi08IS0tPHA+PHN0cm9uZz5nb29nbGVzZWFyY2g8L3N0cm9uZz46IENyZWF0ZXMgYSBHVUktYmFzZWQgYXBwbGljYXRpb24gbWFraW5nIHVzZQ0KLW9mIEdvb2dsZSBXZWIgU2VydmljZXMgYXN5bmNocm9ub3VzbHkuPC9wPi0tPg0KLTxwPjxzdHJvbmc+Z29vZ2xlU3BlbGxjaGVjazwvc3Ryb25nPjogRGVtb25zdHJhdGVzIGJvdGggc3luY2hyb25vdXMNCi1hbmQgbm9uLXN5bmNocm9ub3VzIHVzZSBvZiB0aGUgR29vZ2xlIFdlYiBTZXJ2aWNlIGluIGEgR1VJLjwvcD4NCi08cD48c3Ryb25nPm10b208L3N0cm9uZz46IERlbW9uc3RyYXRlcyB0aGUgdXNlIG9mIE1UT00gYW5kIFNPQVANCi13aXRoIEF0dGFjaG1lbnRzIHRvIHNlbmQgYmluYXJ5IGZpbGVzIHRvIGEgc2VydmljZS48L3A+DQotPHA+PHN0cm9uZz5zYW9wd2l0aGF0dGFjaG1lbnRzPC9zdHJvbmc+OiBEZW1vbnN0cmF0ZXMgdGhlDQotY2FwYWJpbGl0aWVzIGFuZCBwb3dlciBvZiBTT0FQIHdpdGggQXR0YWNobWVudCBzdXBwb3J0IGFuZCB0aGUNCi1BdHRhY2htZW50IEFQSSBvZiBBeGlzMi48L3A+DQotPHA+PHN0cm9uZz5wb2pvPC9zdHJvbmc+OiBFeGFtcGxlIG9mIGEgUE9KTyAoUGxhaW4gT2xkIEphdmEgT2JqZWN0KQ0KLVdlYiBzZXJ2aWNlLiBJdCBzaG93cyBob3cgdG8gZXhwb3NlIHRoZSBtZXRob2RzIG9mIGEgSmF2YSBjbGFzcyBhcw0KLWEgV2ViIHNlcnZpY2UgdXNpbmcgQXBhY2hlIEFpeHMyLjwvcD4NCi08cD48c3Ryb25nPnNlcnZpY2VsaWZlY3ljbGU8L3N0cm9uZz46IERlbW9uc3RyYXRlcyB0aGUgdXNhZ2Ugb2YgYQ0KLXNlcnZpY2UgbGlmZSBjeWNsZSBhbmQgYSBiaXQgb2Ygc2Vzc2lvbiBtYW5hZ2VtZW50LiBUaGUgbWFpbiBpZGVhDQotaXMgdG8gc2hvdyB3aGVyZSBhbmQgaG93IHRvIHVzZSB0aGUgc2VydmljZSBsaWZlIGN5Y2xlIGludGVyZmFjZQ0KLWFuZCBzZXNzaW9uIHJlbGF0ZWQgbWV0aG9kcy48L3A+DQotPCEtLTxwPjxzdHJvbmc+c2djY2FsY3VsYXRvcjwvc3Ryb25nPjogQSBzaW1wbGUgY2FsY3VsYXRvciB0aGF0IGRlbW9uc3RyYXRlcyB0aGUNCi11c2Ugb2YgU2VydmljZSBHcm91cHMuPC9wPi0tPg0KLTxwPjxzdHJvbmc+ZGF0YWJpbmRpbmc8L3N0cm9uZz46IERlbW9uc3RyYXRlcyBob3cgdG8gdXNlIFdTREwySmF2YQ0KLWdlbmVyYXRlZCBjb2RlIHdpdGggQ2FzdG9yLjwvcD4NCi08cD48c3Ryb25nPnZlcnNpb248L3N0cm9uZz46IEEgdmVyeSBzaW1wbGUgc2VydmljZSB0aGF0IHNpbXBseQ0KLW91dHB1dHMgdGhlIEFwYWNoZSBBeGlzMiB2ZXJzaW9uLjwvcD4NCi08cD48c3Ryb25nPnlhaG9vcmVzdGVhcmNoPC9zdHJvbmc+OiBBIGNvbXBsZXRlIGV4YW1wbGUgb2YgdGhlIHVzZQ0KLW9mIGEgUkVTVCBzZXJ2aWNlIHJhdGhlciB0aGFuIGEgU09BUCBzZXJ2aWNlLjwvcD4NCi08aDM+RXh0ZXJuYWw6PC9oMz4NCi08cD48c3Ryb25nPkZsaWNrckNsaWVudDwvc3Ryb25nPiA6IERlbW9uc3RyYXRlcyBjb2RlIGdlbmVyYXRpb24NCi1jYXBhYmlsaXRpZXMgZm9yIFdTREwgMi4wLiBUaGUgRmxpY2tyU2VydmljZS53c2RsIGRlc2NyaWJlcw0KLXNlcnZpY2VzIG9mZmVyZWQgYnkgZmxpY2tyIGluIHRlcm1zIG9mIFdTREwgMi4wLiBJdCBhbHNvDQotZGVtb25zdHJhdGVzIGhvdyBhIHJlc3RmdWwgc2VydmljZSBjYW4gYmUgZGVzY3JpYmVkIHVzaW5nIHRoZQ0KLUhUVFBCaW5kaW5nIG9mIHdzZGwgMi4wLjwvcD4NCi08cD5FeHRyYWN0IHRoZSA8YSBocmVmPQ0KLSJodHRwOi8vZGlzdC53c28yLm9yZy9wcm9kdWN0cy93c2FzL2phdmEvbmlnaHRseS1idWlsZC8iPldTTzIgV1NBUw0KLWZvciBKYXZhIG5pZ2h0bHkgYnVpbGQgZGlzdHJpYnV0aW9uPC9hPiBhbmQgeW91IHdpbGwgZmluZCB0aGUNCi1zYW1wbGUgYXQgV1NBU19IT01FL3NhbXBsZXMvRmxpY2tyQ2xpZW50IG9yIGNoZWNrb3V0IHNhbXBsZSBmcm9tDQotU1ZOOg0KLWh0dHA6Ly93c28yLm9yZy9yZXBvcy93c28yL3RydW5rL3dzYXMvamF2YS9tb2R1bGVzL3NhbXBsZXMvRmxpY2tyQ2xpZW50PC9wPg0KLTxwPjxzdHJvbmc+U2VlIE5leHQgU2VjdGlvbjwvc3Ryb25nPiAtIDxhIGhyZWY9DQotInVzZXJndWlkZS1mb3JmdXJ0aGVyc3R1ZHkuaHRtbCI+Rm9yIEZ1cnRoZXIgU3R1ZHk8L2E+PC9wPg0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL3VzZXJndWlkZS54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvdXNlcmd1aWRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU2MmRlYi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvdXNlcmd1aWRlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM3NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLQ0KLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iDQotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4NCi08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+DQotPGhlYWQ+DQotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PQ0KLSJIVE1MIFRpZHkgZm9yIFdpbmRvd3MgKHZlcnMgMTQgSnVuZSAyMDA3KSwgc2VlIHd3dy53My5vcmciIC8+DQotPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSIiIC8+DQotPHRpdGxlPkFwYWNoZSBBeGlzMiBVc2VyJ3MgR3VpZGUtIEludHJvZHVjaW5nIEF4aXMyPC90aXRsZT4NCi08bGluayBocmVmPSIuLi9jc3MvYXhpcy1kb2NzLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyINCi1tZWRpYT0iYWxsIiAvPg0KLTwvaGVhZD4NCi08Ym9keSB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4NCi08aDE+QXBhY2hlIEF4aXMyIFVzZXIncyBHdWlkZTwvaDE+DQotPHA+VGhpcyBndWlkZSBwcm92aWRlcyBhIHN0YXJ0aW5nIHBsYWNlIGZvciB1c2VycyB3aG8gYXJlIG5ldyB0bw0KLUFwYWNoZSBBeGlzMi4gSXQgYWxzbyBjb3ZlcnMgc29tZSBhZHZhbmNlZCB0b3BpY3MsIHN1Y2ggYXMgaG93IHRvDQotdXNlIEF4aXMyIHRvIGNyZWF0ZSBhbmQgZGVwbG95IFdlYiBzZXJ2aWNlcyBhcyB3ZWxsIGFzIGhvdyB0byB1c2UNCi1XU0RMIHRvIGdlbmVyYXRlIGJvdGggY2xpZW50cyBhbmQgc2VydmljZXMuPC9wPg0KLUZvciBleHBlcmllbmNlZCB1c2VycyBvZiBBcGFjaGUgQXhpczIsIHdlIHJlY29tbWVuZCB0aGUgPGEgaHJlZj0NCi0iYWR2LXVzZXJndWlkZS5odG1sIj5BZHZhbmNlZCBVc2VyJ3MgR3VpZGUuPC9hPiA8YSBuYW1lPSJpbnRybyIgaWQ9DQotImludHJvIj48L2E+DQotPGgxPkludHJvZHVjaW5nIEF4aXMyPC9oMT4NCi08cD5UaGlzIHNlY3Rpb24gaW50cm9kdWNlcyBBeGlzMiBhbmQgaXRzIHN0cnVjdHVyZSwgaW5jbHVkaW5nIGFuDQotZXhwbGFuYXRpb24gb2YgdmFyaW91cyBkaXJlY3Rvcmllcy9maWxlcyBpbmNsdWRlZCBpbiB0aGUgbGF0ZXN0DQotQXhpczIgPGEgaHJlZj0NCi0iaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvZG93bmxvYWQuY2dpIj5kb3dubG9hZDwvYT4uPC9wPg0KLTxoMj5Db250ZW50PC9oMj4NCi08dWw+DQotPGxpPjxhIGhyZWY9InVzZXJndWlkZS5odG1sI2ludHJvIj48c3Ryb25nPkludHJvZHVjaW5nDQotQXhpczI8L3N0cm9uZz48L2E+PGJyIC8+DQotPHVsPg0KLTxsaT48YSBocmVmPSJ1c2VyZ3VpZGUuaHRtbCN3aGF0aXMiPjxzdHJvbmc+V2hhdCBpcw0KLUF4aXMyPzwvc3Ryb25nPjwvYT48L2xpPg0KLTxsaT48YSBocmVmPSJ1c2VyZ3VpZGUuaHRtbCN1bmRlcmhvb2QiPjxzdHJvbmc+V2hhdCdzIHVuZGVyIHRoZQ0KLWhvb2Q/PC9zdHJvbmc+PC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9InVzZXJndWlkZS5odG1sI2hhbmRsZXNzb2FwIj48c3Ryb25nPkhvdyBBeGlzMiBoYW5kbGVzDQotU09BUCBtZXNzYWdlczwvc3Ryb25nPjwvYT48L2xpPg0KLTxsaT48YSBocmVmPSJ1c2VyZ3VpZGUuaHRtbCNkaXN0cmlidXRpb25zIj48c3Ryb25nPkF4aXMyDQotRGlzdHJpYnV0aW9uczwvc3Ryb25nPjwvYT48L2xpPg0KLTxsaT48YSBocmVmPSJ1c2VyZ3VpZGUuaHRtbCNzYmQiPjxzdHJvbmc+VGhlIEF4aXMyIFN0YW5kYXJkIEJpbmFyeQ0KLURpc3RyaWJ1dGlvbjwvc3Ryb25nPjwvYT48L2xpPg0KLTxsaT48YSBocmVmPSJ1c2VyZ3VpZGUuaHRtbCNoaWVyYXJjaHkiPjxzdHJvbmc+QXhpczIud2FyIERpcmVjdG9yeQ0KLUhpZXJhcmNoeTwvc3Ryb25nPjwvYT48L2xpPg0KLTxsaT48YSBocmVmPSJ1c2VyZ3VpZGUuaHRtbCNkb2NzIj48c3Ryb25nPkF4aXMyIERvY3VtZW50cw0KLURpc3RyaWJ1dGlvbjwvc3Ryb25nPjwvYT48L2xpPg0KLTxsaT48YSBocmVmPSJ1c2VyZ3VpZGUuaHRtbCNjbGllbnRzIj48c3Ryb25nPkF4aXMyIGFuZA0KLUNsaWVudHM8L3N0cm9uZz48L2E+PC9saT4NCi08L3VsPg0KLTwvbGk+DQotPGxpPjxhIGhyZWY9DQotInVzZXJndWlkZS1pbnN0YWxsaW5ndGVzdGluZy5odG1sI2luc3RhbGxpbmd0ZXN0aW5nIj5JbnN0YWxsaW5nIGFuZA0KLVRlc3RpbmcgQ2xpZW50IENvZGU8L2E+PC9saT4NCi08bGk+PGEgaHJlZj0NCi0idXNlcmd1aWRlLWludHJvdG9zZXJ2aWNlcy5odG1sI2ludHJvc2VydmljZXMiPkludHJvZHVjdGlvbiB0bw0KLVNlcnZpY2VzPC9hPjxiciAvPg0KLTx1bD4NCi08bGk+PGEgaHJlZj0NCi0idXNlcmd1aWRlLWludHJvdG9zZXJ2aWNlcy5odG1sI21lc3NhZ2VleGNoYW5nZSI+TWVzc2FnZSBFeGNoYW5nZQ0KLVBhdHRlcm5zPC9hPjwvbGk+DQotPC91bD4NCi08L2xpPg0KLTxsaT48YSBocmVmPSJ1c2VyZ3VpZGUtY3JlYXRpbmdjbGllbnRzLmh0bWwjY3JlYXRlY2xpZW50cyI+Q3JlYXRpbmcNCi1DbGllbnRzPC9hPjxiciAvPg0KLTx1bD4NCi08bGk+PGEgaHJlZj0NCi0idXNlcmd1aWRlLWNyZWF0aW5nY2xpZW50cy5odG1sI2Nob29zaW5nY2xpZW50Ij5DaG9vc2luZyBhIENsaWVudA0KLUdlbmVyYXRpb24gTWV0aG9kPC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9InVzZXJndWlkZS1jcmVhdGluZ2NsaWVudHMuaHRtbCNnZW5lcmF0aW5nIj5HZW5lcmF0aW5nDQotQ2xpZW50czwvYT48L2xpPg0KLTxsaT48YSBocmVmPSJ1c2VyZ3VpZGUtY3JlYXRpbmdjbGllbnRzLmh0bWwjYWRiIj5BeGlzIERhdGEgQmluZGluZw0KLShBREIpPC9hPjwvbGk+DQotPC91bD4NCi08L2xpPg0KLTxsaT48YSBocmVmPQ0KLSJ1c2VyZ3VpZGUtYnVpbGRpbmdzZXJ2aWNlcy5odG1sI2J1aWxkc2VydmljZXMiPkJ1aWxkaW5nDQotU2VydmljZXM8L2E+PGJyIC8+DQotPHVsPg0KLTxsaT48YSBocmVmPQ0KLSJ1c2VyZ3VpZGUtYnVpbGRpbmdzZXJ2aWNlcy5odG1sI2dldGNvbWZvcnRhYmxlIj5HZXR0aW5nDQotQ29tZm9ydGFibGUgd2l0aCBBdmFpbGFibGUgT3B0aW9uczwvYT48L2xpPg0KLTxsaT48YSBocmVmPQ0KLSJ1c2VyZ3VpZGUtYnVpbGRpbmdzZXJ2aWNlcy5odG1sI2NyZWF0ZXNjcmF0Y2giPkNyZWF0aW5nIGEgU2VydmljZQ0KLWZyb20gU2NyYXRjaDwvYT48L2xpPg0KLTxsaT48YSBocmVmPSJ1c2VyZ3VpZGUtYnVpbGRpbmdzZXJ2aWNlcy5odG1sI2RlcGxveXBvam8iPkRlcGxveWluZw0KLVBsYWluIE9sZCBKYXZhIE9iamVjdHM8L2E+PC9saT4NCi08bGk+PGEgaHJlZj0idXNlcmd1aWRlLWJ1aWxkaW5nc2VydmljZXMuaHRtbCNkZXBsb3lydW4iPkRlcGxveWluZw0KLWFuZCBSdW5uaW5nIGFuIEF4aXMyIFNlcnZpY2UgQ3JlYXRlZCBmcm9tIFdTREw8L2E+PC9saT4NCi08L3VsPg0KLTwvbGk+DQotPGxpPjxhIGhyZWY9InVzZXJndWlkZS1zYW1wbGVzLmh0bWwiPlNhbXBsZXM8L2E+PC9saT4NCi08bGk+PGEgaHJlZj0idXNlcmd1aWRlLWZvcmZ1cnRoZXJzdHVkeS5odG1sIj5Gb3IgRnVydGhlcg0KLVN0dWR5PC9hPjwvbGk+DQotPC91bD4NCi08YSBuYW1lPSJ3aGF0aXMiIGlkPSJ3aGF0aXMiPjwvYT4NCi08aDI+V2hhdCBpcyBBeGlzMj88L2gyPg0KLTxwPlRoZSBBcGFjaGUgQXhpczIgcHJvamVjdCBpcyBhIEphdmEtYmFzZWQgaW1wbGVtZW50YXRpb24gb2YgYm90aA0KLXRoZSBjbGllbnQgYW5kIHNlcnZlciBzaWRlcyBvZiB0aGUgV2ViIHNlcnZpY2VzIGVxdWF0aW9uLiBEZXNpZ25lZA0KLXRvIHRha2UgYWR2YW50YWdlIG9mIHRoZSBsZXNzb25zIGxlYXJuZWQgZnJvbSBBcGFjaGUgQXhpcyAxLjAsDQotQXBhY2hlIEF4aXMyIHByb3ZpZGVzIGEgY29tcGxldGUgb2JqZWN0IG1vZGVsIGFuZCBhIG1vZHVsYXINCi1hcmNoaXRlY3R1cmUgdGhhdCBtYWtlcyBpdCBlYXN5IHRvIGFkZCBmdW5jdGlvbmFsaXR5IGFuZCBzdXBwb3J0DQotZm9yIG5ldyBXZWIgc2VydmljZXMtcmVsYXRlZCBzcGVjaWZpY2F0aW9ucyBhbmQNCi1yZWNvbW1lbmRhdGlvbnMuPC9wPg0KLTxwPkF4aXMyIGVuYWJsZXMgeW91IHRvIGVhc2lseSBwZXJmb3JtIHRoZSBmb2xsb3dpbmcgdGFza3M6PC9wPg0KLTx1bD4NCi08bGk+U2VuZCBTT0FQIG1lc3NhZ2VzPC9saT4NCi08bGk+UmVjZWl2ZSBhbmQgcHJvY2VzcyBTT0FQIG1lc3NhZ2VzPC9saT4NCi08bGk+Q3JlYXRlIGEgV2ViIHNlcnZpY2Ugb3V0IG9mIGEgcGxhaW4gSmF2YSBjbGFzczwvbGk+DQotPGxpPkNyZWF0ZSBpbXBsZW1lbnRhdGlvbiBjbGFzc2VzIGZvciBib3RoIHRoZSBzZXJ2ZXIgYW5kIGNsaWVudA0KLXVzaW5nIFdTREw8L2xpPg0KLTxsaT5FYXNpbHkgcmV0cmlldmUgdGhlIFdTREwgZm9yIGEgc2VydmljZTwvbGk+DQotPGxpPlNlbmQgYW5kIHJlY2VpdmUgU09BUCBtZXNzYWdlcyB3aXRoIGF0dGFjaG1lbnRzPC9saT4NCi08bGk+Q3JlYXRlIG9yIHV0aWxpemUgYSBSRVNULWJhc2VkIFdlYiBzZXJ2aWNlPC9saT4NCi08bGk+Q3JlYXRlIG9yIHV0aWxpemUgc2VydmljZXMgdGhhdCB0YWtlIGFkdmFudGFnZSBvZiB0aGUgPGEgaHJlZj0NCi0iaHR0cDovL3d3dy5vYXNpcy1vcGVuLm9yZy9jb21taXR0ZWVzL2Rvd25sb2FkLnBocC8xNjc5MC93c3MtdjEuMS1zcGVjLW9zLVNPQVBNZXNzYWdlU2VjdXJpdHkucGRmIj4NCi1XUy1TZWN1cml0eTwvYT4sIDxhIGhyZWY9DQotImh0dHA6Ly94bWwuY292ZXJwYWdlcy5vcmcvd3MtcmVsaWFibGVtZXNzYWdpbmcyMDAzMDMxMy5wZGYiPldTLVJlbGlhYmxlTWVzc2FnaW5nPC9hPiwNCi08YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy8yMDAyL3dzL2FkZHIvIj5XUy1BZGRyZXNzaW5nPC9hPiwNCi08YSBocmVmPQ0KLSJodHRwOi8vZGV2MmRldi5iZWEuY29tL3B1Yi9hLzIwMDQvMDMvd3MtY29vcmRpbmF0aW9uLmh0bWwiPldTLUNvb3JkaW5hdGlvbjwvYT4sDQotYW5kIDxhIGhyZWY9DQotImZ0cDovL3d3dzYuc29mdHdhcmUuaWJtLmNvbS9zb2Z0d2FyZS9kZXZlbG9wZXIvbGlicmFyeS9XUy1BdG9taWNUcmFuc2FjdGlvbi5wZGYiPg0KLVdTLUF0b21pYyBUcmFuc2FjdGlvbjwvYT4gcmVjb21tZW5kYXRpb25zPC9saT4NCi08bGk+VXNlIEF4aXMyJ3MgbW9kdWxhciBzdHJ1Y3R1cmUgdG8gZWFzaWx5IGFkZCBzdXBwb3J0IGZvciBuZXcNCi1yZWNvbW1lbmRhdGlvbnMgYXMgdGhleSBlbWVyZ2U8L2xpPg0KLTwvdWw+DQotPHA+TWFueSBtb3JlIGZlYXR1cmVzIGV4aXN0IGFzIHdlbGwsIGJ1dCB0aGlzIHVzZXIgZ3VpZGUNCi1jb25jZW50cmF0ZXMgb24gc2hvd2luZyB5b3UgaG93IHRvIGFjY29tcGxpc2ggdGhlIGZpcnN0IGZpdmUgdGFza3MNCi1vbiB0aGlzIGxpc3QuPC9wPg0KLTxhIG5hbWU9InVuZGVyaG9vZCIgaWQ9InVuZGVyaG9vZCI+PC9hPg0KLTxoMj5XaGF0J3MgVW5kZXIgdGhlIEhvb2Q/PC9oMj4NCi08cD5UbyB1bmRlcnN0YW5kIEF4aXMyIGFuZCB3aGF0IGl0IGRvZXMsIHlvdSBtdXN0IGhhdmUgYSBnb29kIGlkZWENCi1vZiB0aGUgbGlmZSBjeWNsZSBvZiBhIFdlYiBzZXJ2aWNlcyBtZXNzYWdlLiBUeXBpY2FsbHksIGl0IGxvb2tzDQotc29tZXRoaW5nIGxpa2UgdGhpczo8L3A+DQotPHA+PGltZyBhbHQ9IkxpZmVjeWNsZSBvZiBhIFdlYiBzZXJ2aWNlcyBtZXNzYWdlIiBzcmM9DQotImltYWdlcy9maWcwMS5qcGciIC8+PGJyIGNsZWFyPSJhbGwiIC8+PC9wPg0KLTxwPlRoZSBzZW5kaW5nIGFwcGxpY2F0aW9uIGNyZWF0ZXMgdGhlIG9yaWdpbmFsIFNPQVAgbWVzc2FnZSwgYW4NCi1YTUwgbWVzc2FnZSB0aGF0IGNvbnNpc3RzIG9mIGhlYWRlcnMgYW5kIGEgYm9keS4gKEZvciBtb3JlDQotaW5mb3JtYXRpb24gb24gU09BUCwgc2VlICI8YSBocmVmPQ0KLSJ1c2VyZ3VpZGUtaW50cm90b3NlcnZpY2VzLmh0bWwvIj5JbnRyb2R1Y3Rpb24gdG8gU2VydmljZXM8L2E+Ii4pDQotSWYgdGhlIHN5c3RlbSByZXF1aXJlcyB0aGUgdXNlIG9mIFdTKiByZWNvbW1lbmRhdGlvbnMgc3VjaCBhcw0KLVdTLUFkZHJlc3Npbmcgb3IgV1MtU2VjdXJpdHksIHRoZSBtZXNzYWdlIG1heSB1bmRlcmdvIGFkZGl0aW9uYWwNCi1wcm9jZXNzaW5nIGJlZm9yZSBpdCBsZWF2ZXMgdGhlIHNlbmRlci4gT25jZSB0aGUgbWVzc2FnZSBpcyByZWFkeSwNCi1pdCBpcyBzZW50IHZpYSBhIHBhcnRpY3VsYXIgdHJhbnNwb3J0IHN1Y2ggYXMgSFRUUCwgSk1TLCBhbmQgc28NCi1vbi48L3A+DQotPHA+VGhlIG1lc3NhZ2Ugd29ya3MgaXRzIHdheSBvdmVyIHRvIHRoZSByZWNlaXZlciwgd2hpY2ggdGFrZXMgaW4NCi10aGUgbWVzc2FnZSB2aWEgdGhlIHRyYW5zcG9ydCBsaXN0ZW5lci4gKEluIG90aGVyIHdvcmRzLCBpZiB0aGUNCi1hcHBsaWNhdGlvbiBkb2Vzbid0IGhhdmUgYW4gSFRUUCBsaXN0ZW5lciBydW5uaW5nLCBpdCdzIG5vdCBnb2luZw0KLXRvIHJlY2VpdmUgYW55IEhUVFAgbWVzc2FnZXMuKSBBZ2FpbiwgaWYgdGhlIG1lc3NhZ2UgaXMgcGFydCBvZiBhDQotc3lzdGVtIHRoYXQgcmVxdWlyZXMgdGhlIHVzZSBvZiBXUy1TZWN1cml0eSBvciBvdGhlcg0KLXJlY29tbWVuZGF0aW9ucywgaXQgbWF5IG5lZWQgYWRkaXRpb25hbCBwcm9jZXNzaW5nIGZvciB0aGUgcHVycG9zZQ0KLW9mIGNoZWNraW5nIGNyZWRlbnRpYWxzIG9yIGRlY3J5cHRpbmcgc2Vuc2l0aXZlIGluZm9ybWF0aW9uLg0KLUZpbmFsbHksIGEgZGlzcGF0Y2hlciBkZXRlcm1pbmVzIHRoZSBzcGVjaWZpYyBhcHBsaWNhdGlvbiAob3Igb3RoZXINCi1jb21wb25lbnQsIHN1Y2ggYXMgYSBKYXZhIG1ldGhvZCkgZm9yIHdoaWNoIHRoZSBtZXNzYWdlIHdhcw0KLWludGVuZGVkLCBhbmQgc2VuZHMgaXQgdG8gdGhhdCBjb21wb25lbnQuIFRoYXQgY29tcG9uZW50IGlzIHBhcnQgb2YNCi1hbiBvdmVyYWxsIGFwcGxpY2F0aW9uIGRlc2lnbmVkIHRvIHdvcmsgd2l0aCB0aGUgZGF0YSBiZWluZyBzZW50DQotYmFjayBhbmQgZm9ydGguPC9wPg0KLTxhIG5hbWU9ImhhbmRsZXNzb2FwIiBpZD0iaGFuZGxlc3NvYXAiPjwvYT4NCi08aDI+SG93IEF4aXMyIEhhbmRsZXMgU09BUCBNZXNzYWdlczwvaDI+DQotPHA+QXhpczIgY2FuIGhhbmRsZSBwcm9jZXNzaW5nIGZvciBib3RoIHRoZSBzZW5kZXIgYW5kIHRoZSByZWNlaXZlcg0KLWluIGEgdHJhbnNhY3Rpb24uIEZyb20gdGhlIEF4aXMyIHBlcnNwZWN0aXZlLCB0aGUgc3RydWN0dXJlIGxvb2tzDQotbGlrZSB0aGlzOjwvcD4NCi08cD48aW1nIGFsdD0iQXhpczIgaGFuZGxlcyBTT0FQIG1lc3NhZ2VzIiBzcmM9DQotImltYWdlcy9maWcwMi5qcGciIC8+PGJyIGNsZWFyPSJhbGwiIC8+PC9wPg0KLTxwPk9uIGVhY2ggZW5kLCB5b3UgaGF2ZSBhbiBhcHBsaWNhdGlvbiBkZXNpZ25lZCB0byBkZWFsIHdpdGggdGhlDQotKHNlbnQgb3IgcmVjZWl2ZWQpIG1lc3NhZ2VzLiBJbiB0aGUgbWlkZGxlLCB5b3UgaGF2ZSBBeGlzMiwgb3INCi1yYXRoZXIsIHlvdSA8ZW0+Y2FuPC9lbT4gaGF2ZSBBeGlzMi4gVGhlIHZhbHVlIG9mIFdlYiBzZXJ2aWNlcyBpcw0KLXRoYXQgdGhlIHNlbmRlciBhbmQgcmVjZWl2ZXIgKGVhY2ggb2Ygd2hpY2ggY2FuIGJlIGVpdGhlciB0aGUNCi1zZXJ2ZXIgb3IgdGhlIGNsaWVudCkgZG9uJ3QgZXZlbiBoYXZlIHRvIGJlIG9uIHRoZSBzYW1lIHBsYXRmb3JtLA0KLW11Y2ggbGVzcyBydW5uaW5nIHRoZSBzYW1lIGFwcGxpY2F0aW9uLiBBc3N1bWluZyB0aGF0IEF4aXMyIGlzDQotcnVubmluZyBvbiBib3RoIHNpZGVzLCB0aGUgcHJvY2VzcyBsb29rcyBsaWtlIHRoaXM6PC9wPg0KLTx1bD4NCi08bGk+VGhlIHNlbmRlciBjcmVhdGVzIHRoZSBTT0FQIG1lc3NhZ2UuPC9saT4NCi08bGk+QXhpcyAiaGFuZGxlcnMiIHBlcmZvcm0gYW55IG5lY2Vzc2FyeSBhY3Rpb25zIG9uIHRoYXQgbWVzc2FnZQ0KLXN1Y2ggYXMgZW5jcnlwdGlvbiBvZiBXUy1TZWN1cml0eSByZWxhdGVkIG1lc3NhZ2VzLjwvbGk+DQotPGxpPlRoZSB0cmFuc3BvcnQgc2VuZGVyIHNlbmRzIHRoZSBtZXNzYWdlLjwvbGk+DQotPGxpPk9uIHRoZSByZWNlaXZpbmcgZW5kLCB0aGUgdHJhbnNwb3J0IGxpc3RlbmVyIGRldGVjdHMgdGhlDQotbWVzc2FnZS48L2xpPg0KLTxsaT5UaGUgdHJhbnNwb3J0IGxpc3RlbmVyIHBhc3NlcyB0aGUgbWVzc2FnZSBvbiB0byBhbnkgaGFuZGxlcnMgb24NCi10aGUgcmVjZWl2aW5nIHNpZGUuPC9saT4NCi08bGk+T25jZSB0aGUgbWVzc2FnZSBoYXMgYmVlbiBwcm9jZXNzZWQgaW4gdGhlICJwcmUtZGlzcGF0Y2giDQotcGhhc2UsIGl0IGlzIGhhbmRlZCBvZmYgdG8gdGhlIGRpc3BhdGNoZXJzLCB3aGljaCBwYXNzIGl0IG9uIHRvIHRoZQ0KLWFwcHJvcHJpYXRlIGFwcGxpY2F0aW9uLjwvbGk+DQotPC91bD4NCi08cD5JbiBBeGlzMiwgdGhlc2UgYWN0aW9ucyBhcmUgYnJva2VuIGRvd24gaW50byAicGhhc2VzIiwgd2l0aA0KLXNldmVyYWwgcHJlLWRlZmluZWQgcGhhc2VzLCBzdWNoIGFzIHRoZSAicHJlLWRpc3BhdGNoIiwgImRpc3BhdGNoLCINCi1hbmQgIm1lc3NhZ2UgcHJvY2Vzc2luZyIsIGJlaW5nIGJ1aWx0IGludG8gQXhpczIuIEVhY2ggcGhhc2UgaXMgYQ0KLWNvbGxlY3Rpb24gb2YgImhhbmRsZXJzIi4gQXhpczIgZW5hYmxlcyB5b3UgdG8gY29udHJvbCB3aGF0DQotaGFuZGxlcnMgZ28gaW50byB3aGljaCBwaGFzZXMsIGFuZCB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlIGhhbmRsZXJzDQotYXJlIGV4ZWN1dGVkIHdpdGhpbiB0aGUgcGhhc2VzLiBZb3UgY2FuIGFsc28gYWRkIHlvdXIgb3duIHBoYXNlcw0KLWFuZCBoYW5kbGVycy48L3A+DQotPHA+SGFuZGxlcnMgY29tZSBmcm9tICJtb2R1bGVzIiB0aGF0IGNhbiBiZSBwbHVnZ2VkIGludG8gYSBydW5uaW5nDQotQXhpczIgc3lzdGVtLiBUaGVzZSBtb2R1bGVzLCBzdWNoIGFzIFJhbXBhcnQsIHdoaWNoIHByb3ZpZGVzIGFuDQotaW1wbGVtZW50YXRpb24gb2YgV1MtU2VjdXJpdHksIGFuZCBTYW5kZXNoYSwgd2hpY2ggcHJvdmlkZXMgYW4NCi1pbXBsZW1lbnRhdGlvbiBvZiBXUy1SZWxpYWJsZU1lc3NhZ2luZywgYXJlIHRoZSBtYWluIGV4dGVuc2liaWxpdHkNCi1tZWNoYW5pc21zIGluIEF4aXMyLjwvcD4NCi08YSBuYW1lPSJkaXN0cmlidXRpb25zIiBpZD0iZGlzdHJpYnV0aW9ucyI+PC9hPg0KLTxoMj5BeGlzMiBEaXN0cmlidXRpb25zPC9oMj4NCi08cD5BeGlzMiBpcyByZWxlYXNlZCBpbiBzZXZlcmFsIDxhIGhyZWY9DQotImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL2Rvd25sb2FkL0BheGlzMl92ZXJzaW9uX2RpckAvZG93bmxvYWQuY2dpIj4NCi1kaXN0cmlidXRpb25zPC9hPi4gV2hpY2ggb25lIHlvdSBuZWVkIGRlcGVuZHMgb24gd2hhdCB5b3UnbGwgYmUNCi1kb2luZyB3aXRoIGl0LjwvcD4NCi08YSBuYW1lPSJzYmQiIGlkPSJzYmQiPjwvYT4NCi08aDM+VGhlIEF4aXMyIFN0YW5kYXJkIEJpbmFyeSBEaXN0cmlidXRpb248L2gzPg0KLTxwPklmIHlvdSdyZSBkZXZlbG9waW5nIHNlcnZpY2VzIGFuZCBhcHBsaWNhdGlvbnMsIHlvdSdsbCBuZWVkIHRoZQ0KLUF4aXMyIDxhIGhyZWY9DQotImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL2Rvd25sb2FkL0BheGlzMl92ZXJzaW9uX2RpckAvZG93bmxvYWQuY2dpI3N0ZC1iaW4iPg0KLVN0YW5kYXJkIEJpbmFyeSBEaXN0cmlidXRpb248L2E+LiBUaGUgZGlzdHJpYnV0aW9uIGluY2x1ZGVzIGFsbCB0aGUNCi1uZWNlc3NhcnkgKi5qYXIgZmlsZXMsIGFzIHdlbGwgYXMgYSB2YXJpZXR5IG9mIHNjcmlwdHMgdGhhdCBlYXNlDQotZGV2ZWxvcG1lbnQuIEl0IGhhcyB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZS48L3A+DQotPHA+PGI+Q29kZSBMaXN0aW5nIDE6IEF4aXMyIFN0YW5kYXJkIEJpbmFyeSBEaXN0cmlidXRpb248L2I+PC9wPg0KLTxwcmU+DQotYmluDQotICAgICAgYXhpczIuYmF0DQotICAgICAgYXhpczIuc2gNCi0gICAgICBheGlzMnNlcnZlci5iYXQNCi0gICAgICBheGlzMnNlcnZlci5zaA0KLSAgICAgIGphdmEyd3NkbC5iYXQNCi0gICAgICBqYXZhMndzZGwuc2gNCi0gICAgICB3c2RsMmphdmEuYmF0DQotICAgICAgd3NkbDJqYXZhLnNoDQotICAgICAgc2V0ZW52LnNoDQotbGliDQotICAgICAgYWN0aXZhdGlvbi0xLjEuamFyDQotICAgICAgLi4uDQotICAgICAgWG1sU2NoZW1hLmphcg0KLXJlcG9zaXRvcnkNCi0gICAgICAgICAgICAgbW9kdWxlcw0KLSAgICAgICAgIG1vZHVsZXMubGlzdCANCi0gICAgICAgICAgICAgICAgYWRkcmVzc2luZy0xLjEubWFyDQotICAgICAgICAgICAgICAgLi4NCi0gICAgICAgICAgICAgc2VydmljZXMNCi0gICAgICAgICBzZXJ2aWNlcy5saXN0DQotICAgICAgICAgICAgICAgIHZlcnNpb24uYWFyDQotICAgICAgICAgLi4NCi1zYW1wbGVzDQotICAgICAgLi4uDQotd2ViYXBwDQotICAgICAgLi4uDQotY29uZg0KLSAgICBheGlzMi54bWwNCi0NCi1MSUNFTlNFLnR4dA0KLVJFQURNRS50eHQNCi1OT1RJQ0UudHh0DQotSU5TVEFMTC50eHQNCi1yZWxlYXNlLW5vdGVzLmh0bWwNCi08L3ByZT4NCi08cD5UaGUgYmluIGRpcmVjdG9yeSBpbmNsdWRlcyBhIG51bWJlciBvZiB1c2VmdWwgc2NyaXB0cy4gVGhleQ0KLWluY2x1ZGUgYXhpczIuYmF0IChvciBheGlzMi5zaCksIHdoaWNoIGVuYWJsZXMgeW91IHRvIGVhc2lseQ0KLWV4ZWN1dGUgYSBKYXZhIGNvbW1hbmQgd2l0aG91dCBoYXZpbmcgdG8gbWFudWFsbHkgYWRkIGFsbCB0aGUgQXhpczINCi1qYXIgZmlsZXMgdG8gdGhlIGNsYXNzcGF0aCwgamF2YTJ3c2RsLmJhdCAoYW5kIC5zaCkgYW5kDQotd3NkbDJqYXZhLmJhdCAoYW5kIC5zaCksIHdoaWNoIGVuYWJsZSB5b3UgdG8gZWFzaWx5IGdlbmVyYXRlIEphdmENCi1jb2RlIGZyb20gYSBXU0RMIGZpbGUgYW5kIHZpY2UgdmVyc2EsIGFuZCBheGlzMnNlcnZlci5iYXQgKGFuZCBzaCksDQotYSBzaW1wbGUgV2ViIHNlcnZlciB0aGF0IGVuYWJsZXMgeW91IHRvIGJ1aWxkIEF4aXMyJ3MgY2FwYWJpbGl0eSB0bw0KLXNlbmQgYW5kIHJlY2VpdmUgbWVzc2FnZXMgaW50byB5b3VyIG93biBhcHBsaWNhdGlvbi48L3A+DQotPHA+QXMgZXhwZWN0ZWQsIHRoZSBsaWIgZGlyZWN0b3J5IGluY2x1ZGVzIGFsbCB0aGUgbmVjZXNzYXJ5IC5qYXINCi1maWxlcy4gU2VydmljZXMgYW5kIG1vZHVsZXMgYXJlIGFkZGVkIHRvIHRoZSByZXBvc2l0b3J5IGRpcmVjdG9yeS4NCi1BeGlzMiBjb21lcyB3aXRoIGEgc3RhbmRhcmQgbW9kdWxlIGltcGxlbWVudGluZyBXUy1BZGRyZXNzaW5nLCBhbmQNCi15b3UgY2FuIGFkZCBhbnkgb3RoZXIgbmVjZXNzYXJ5IG1vZHVsZSBzdWNoIGFzIFJhbXBhcnQgdG8gdGhlDQotcmVwb3NpdG9yeS9tb2R1bGVzIGRpcmVjdG9yeS48L3A+DQotPHA+Y29uZiBkaXJlY3RvcnkgaW5jbHVkZXMgdGhlIGF4aXMyLnhtbCB3aGljaCBpcyB0aGUgZ2xvYmFsDQotZGVwbG95bWVudCBkZXNjcmlwdG9yLjwvcD4NCi08cD5GaW5hbGx5LCB0aGUgc2FtcGxlcyBkaXJlY3RvcnkgaW5jbHVkZXMgYWxsIHRoZSBzYW1wbGUgY29kZQ0KLWRpc3RyaWJ1dGVkIHdpdGggQXhpczIuIFNlZSB0aGUgbGlzdCBvZiA8YSBocmVmPQ0KLSJ1c2VyZ3VpZGUtc2FtcGxlcy5odG1sIj5zYW1wbGVzIGFuZCB0aGVpciBkZXNjcmlwdGlvbnM8L2E+LjwvcD4NCi08YSBuYW1lPSJoaWVyYXJjaHkiIGlkPSJoaWVyYXJjaHkiPjwvYT4NCi08aDI+YXhpczIud2FyIERpc3RyaWJ1dGlvbiBEaXJlY3RvcnkgSGllcmFyY2h5PC9oMj4NCi08cD5heGlzMi53YXIgaXMgYXZhaWxhYmxlIGluIDxhIGhyZWY9DQotImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL2Rvd25sb2FkL0BheGlzMl92ZXJzaW9uX2RpckAvZG93bmxvYWQuY2dpI3dhciI+DQotV0FSIChXZWIgQXJjaGl2ZSkgRGlzdHJpYnV0aW9uPC9hPi4gVGhlIHNlcnZlciBzaWRlIG9mIEF4aXMyIHNoaXBzDQotYXMgYSBKMkVFIGFwcGxpY2F0aW9uLCBhbmQgaGFzIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIHNob3duIGluDQotQ29kZSBMaXN0aW5nIDIuPC9wPg0KLTxwPjxiPkNvZGUgTGlzdGluZyAyOiBTZXJ2ZXIgU2lkZSBvZiBBeGlzMjwvYj48L3A+DQotPHByZT4NCi1heGlzMi13ZWIgDQotTUVUQS1JTkYNCi1XRUItSU5GDQotICAgIGNsYXNzZXMgDQotICAgIGNvbmYNCi0gICAgICAgIGF4aXMyLnhtbCANCi0gICAgbGliDQotICAgICAgICBhY3RpdmF0aW9uLmphcg0KLSAgICAgICAgLi4uDQotICAgICAgICB4bWxTY2hlbWEuamFyDQotICAgIG1vZHVsZXMNCi0gICAgICAgIG1vZHVsZXMubGlzdCANCi0gICAgICAgIGFkZHJlc3NpbmcubWFyDQotICAgICAgICAuLi4NCi0gICAgICAgIHNvYXBtb25pdG9yLm1hcg0KLSAgICBzZXJ2aWNlcw0KLSAgICAgICAgc2VydmljZXMubGlzdA0KLSAgICAgICAgYXNlcnZpY2UuYWFyDQotICAgICAgICAuLi4NCi0gICAgICAgIHZlcnNpb24uYWFyDQotICAgIHdlYi54bWwNCi08L3ByZT4NCi08cD5TdGFydGluZyBhdCB0aGUgdG9wLCBheGlzMi13ZWIgaXMgYSBjb2xsZWN0aW9uIG9mIEpTUHMgdGhhdCBtYWtlDQotdXAgdGhlIDxhIGhyZWY9IndlYmFkbWluZ3VpZGUuaHRtbCI+QXhpczIgYWRtaW5pc3RyYXRpb24NCi1hcHBsaWNhdGlvbjwvYT4sIHRocm91Z2ggd2hpY2ggeW91IGNhbiBwZXJmb3JtIGFueSBuZWVkZWQgYWN0aW9ucw0KLXN1Y2ggYXMgYWRkaW5nIHNlcnZpY2VzIGFuZCBlbmdhZ2luZyBhbmQgZGlzLWVuZ2FnaW5nIG1vZHVsZXMuIFRoZQ0KLVdFQi1JTkYgZGlyZWN0b3J5IHJlcHJlc2VudHMgdGhlIGFjdHVhbCBBeGlzMiBhcHBsaWNhdGlvbiwNCi1pbmNsdWRpbmcgYWxsIHRoZSAqLmphciBmaWxlcywgYW55IGluY2x1ZGVkIG1vZHVsZXMsIGFuZCBldmVuIHRoZQ0KLWRlcGxveWVkIHNlcnZpY2VzIHRoZW1zZWx2ZXMuPC9wPg0KLTxwPlRoZSBjbGFzc2VzIGRpcmVjdG9yeSBob2xkcyBhbnkgY2xhc3Mgb3IgcHJvcGVydHkgZmlsZXMgdGhhdCBhcmUNCi1uZWVkZWQgYnkgQXhpczIgaXRzZWxmLCBzdWNoIGFzIGxvZzRqLnByb3BlcnRpZXMuIEFueSBhY3R1YWwNCi1zZXJ2aWNlcyB0byBiZSBoYW5kbGVkIGJ5IHRoZSBzeXN0ZW0gcmVzaWRlIGluIHRoZSBzZXJ2aWNlcw0KLWRpcmVjdG9yeSBpbiB0aGUgZm9ybSBvZiBhbiBheGlzIGFyY2hpdmUsIG9yICouYWFyIGZpbGUuIFRoaXMgZmlsZQ0KLWNvbnRhaW5zIGFueSBjbGFzc2VzIHJlbGF0ZWQgdG8gdGhlIHNlcnZpY2UsIGFzIHdlbGwgYXMgdGhlDQotc2VydmljZXMueG1sIGZpbGUsIHdoaWNoIGNvbnRyb2xzIGFueSBhZGRpdGlvbmFsIHJlcXVpcmVtZW50cywgc3VjaA0KLWFzIHRoZSBkZWZpbml0aW9uIG9mIG1lc3NhZ2Ugc2VuZGVycyBhbmQgbWVzc2FnZSByZWNlaXZlcnMuPC9wPg0KLTxwPlRoZSBtYWluIGZpbGUgaW4gYWxsIHRoaXMgaXMgYXhpczIueG1sLCB3aGljaCBjb250cm9scyBob3cgdGhlDQotYXBwbGljYXRpb24gZGVhbHMgd2l0aCByZWNlaXZlZCBtZXNzYWdlcy4gSXQgZGVmaW5lcyBtZXNzYWdlDQotcmVjZWl2ZXJzIGFuZCB0cmFuc3BvcnQgcmVjZWl2ZXJzLCBhcyB3ZWxsIGFzIGRlZmluaW5nIHRyYW5zcG9ydA0KLXNlbmRlcnMgYW5kIGRldGVybWluaW5nIHdoaWNoIG1vZHVsZXMgYXJlIGFjdGl2ZS4gSXQgYWxzbyBkZWZpbmVzDQotdGhlIG9yZGVyIG9mIHBoYXNlcywgYW5kIHRoZSBoYW5kbGVycyB0byBiZSBleGVjdXRlZCB3aXRoaW4gZWFjaA0KLXBoYXNlLjwvcD4NCi08cD5Zb3UgY2FuIGNvbnRyb2wgYWxsIG9mIHRoaXMgaW5mb3JtYXRpb24gdGhyb3VnaCB0aGUgdXNlIG9mIHRoZQ0KLVdlYiBhcHBsaWNhdGlvbiwgYnV0IGlmIHlvdSByZXN0YXJ0IHRoZSBBeGlzMiBhcHBsaWNhdGlvbiwgdGhlc2UNCi1jaGFuZ2VzIGFyZSBsb3N0IGFuZCB0aGUgc2VydmVyIGdvZXMgYmFjayB0byB0aGUgZGVmaW5pdGlvbnMgaW4gdGhlDQotYXhpczIueG1sIGZpbGUuPC9wPg0KLTxwPkF4aXMyIGFsc28gcHJvdmlkZXMgYSB0aGlyZCBkaXN0cmlidXRpb24sIHRoZSA8YSBocmVmPQ0KLSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi9kb3dubG9hZC9AYXhpczJfdmVyc2lvbl9kaXJAL2Rvd25sb2FkLmNnaSNzcmMiPg0KLXNvdXJjZSBkaXN0cmlidXRpb248L2E+LCB3aGljaCBlbmFibGVzIHlvdSB0byBnZW5lcmF0ZSB0aGlzIC53YXINCi1maWxlIHlvdXJzZWxmLjwvcD4NCi08YSBpZD0iZG9jcyIgbmFtZT0iZG9jcyI+PC9hPg0KLTxoMj5BeGlzMiBEb2N1bWVudGF0aW9uIERpc3RyaWJ1dGlvbiBEaXJlY3RvcnkgSGllcmFyY2h5PC9oMj4NCi08cD5UaGUgRG9jdW1lbnRzIGRpc3RyaWJ1dGlvbiBpbmNsdWRlcyBhbGwgQXhpczIgZG9jdW1lbnRhdGlvbg0KLWluY2x1ZGluZyB0aGUgeGRjb3MgYW5kIGphdmFkb2NzLiBJdCBoYXMgdGhlIGZvbGxvd2luZw0KLXN0cnVjdHVyZTo8L3A+DQotPHA+PGI+Q29kZSBMaXN0aW5nIDM6IEF4aXMyIERvY3VtZW50cyBEaXN0cmlidXRpb248L2I+PC9wPg0KLTxwcmU+DQotZG9jcw0KLSAgICAgIGphdmFkb2NzDQotICAgICAgeGRvY3MNCi0NCi1MSUNFTlNFLnR4dA0KLVJFQURNRS50eHQNCi1yZWxlYXNlLW5vdGVzLmh0bWwNCi08L3ByZT4NCi08cD5UaGUgamF2YWRvY3MgZGlyZWN0b3J5IGluY2x1ZGVzIGFsbCB0aGUgc3RhbmRhcmQgPGEgaHJlZj0NCi0iLi4vLi4vamF2YWRvY3MvaW5kZXguaHRtbCI+QVBJIGRvY3VtZW50YXRpb248L2E+IGZvciB0aGUgQXhpczINCi1BUEksIHdpdGggb3RoZXIgZG9jdW1lbnRhdGlvbiAobGlrZSB0aGlzIGRvY3VtZW50KSBpbiB0aGUgeGRvY3MNCi1kaXJlY3RvcnkuPC9wPg0KLTxhIG5hbWU9ImNsaWVudHMiIGlkPSJjbGllbnRzIj48L2E+DQotPGgyPkF4aXMyIGFuZCBDbGllbnRzPC9oMj4NCi08cD5Ob3cgdGhhdCBleHBsYWlucyBob3cgQXhpczIgYmVoYXZlcyBhcyBwYXJ0IG9mIGEgV2ViDQotYXBwbGljYXRpb24uIFdoYXQgYWJvdXQgYSBzdGFuZGFsb25lIGNsaWVudCB0aGF0IGlzIG5vdCBwYXJ0IG9mIGENCi1KMkVFIGFwcGxpY2F0aW9uPyBJbiB0aGF0IGNhc2UsIGEgc2VuZGVyIGNhbiB1c2UgdGhlIEF4aXMyIGRlZmF1bHQNCi1wcm9wZXJ0aWVzLCBpbiBvdGhlciB3b3Jkcywgbm8gc3BlY2lhbCBoYW5kbGVycywgYW5kIHNvIG9uLiBCdXQgeW91DQotYWxzbyBoYXZlIHRoZSBvcHRpb24gdG8gdGVsbCB0aGUgY2xpZW50IHRvIGxvYWQgaXRzIG93biBjb3B5IG9mIHRoZQ0KLWF4aXMyLnhtbCBmaWxlIGFuZCBiZWhhdmUgYWNjb3JkaW5nbHkuPC9wPg0KLTxwPjxzdHJvbmc+U2VlIE5leHQgU2VjdGlvbjwvc3Ryb25nPiAtIDxhIGhyZWY9DQotInVzZXJndWlkZS1pbnN0YWxsaW5ndGVzdGluZy5odG1sI2luc3RhbGxpbmd0ZXN0aW5nIj5JbnN0YWxsaW5nIGFuZA0KLVRlc3RpbmcgQ2xpZW50IENvZGU8L2E+PC9wPg0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL3dlYmFkbWluZ3VpZGUueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL3dlYmFkbWluZ3VpZGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTg3N2U1Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC93ZWJhZG1pbmd1aWRlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyNiArMCwwIEBACi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIg0KLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+DQotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPg0KLTxoZWFkPg0KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0NCi0iSFRNTCBUaWR5IGZvciBXaW5kb3dzICh2ZXJzIDE0IEp1bmUgMjAwNyksIHNlZSB3d3cudzMub3JnIiAvPg0KLTxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0iIiAvPg0KLTx0aXRsZT5BcGFjaGUgQXhpczIgV2ViIEFkbWluaXN0cmF0b3IncyBHdWlkZTwvdGl0bGU+DQotPGxpbmsgaHJlZj0iLi4vY3NzL2F4aXMtZG9jcy5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiDQotbWVkaWE9ImFsbCIgLz4NCi08L2hlYWQ+DQotPGJvZHkgbGFuZz0iZW4iIHhtbDpsYW5nPSJlbiI+DQotPGgxIGFsaWduPSJjZW50ZXIiPkFwYWNoZSBBeGlzMiBXZWIgQWRtaW5pc3RyYXRvcidzIEd1aWRlPC9oMT4NCi08cD5UaGlzIGRvY3VtZW50IGdpdmVzIHlvdSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBvbiB0aGUNCi1hZG1pbmlzdHJhdGlvbiBjb25zb2xlIG9mIHRoZSBBcGFjaGUgQXhpczIgV2ViIGFwcGxpY2F0aW9uLiBBcGFjaGUNCi1BeGlzMiBBZG1pbmlzdHJhdGlvbiBpcyBhbGwgYWJvdXQgY29uZmlndXJpbmcgQXBhY2hlIEF4aXMyIGF0IHJ1bg0KLXRpbWUsIHdoZXJlIHRoZSBjb25maWd1cmF0aW9uIGlzIHRyYW5zaWVudC48L3A+DQotPHA+PGk+U2VuZCB5b3VyIGZlZWRiYWNrIHRvOiA8YSBocmVmPQ0KLSJtYWlsdG86YXhpcy1kZXZAd3MuYXBhY2hlLm9yZz9zdWJqZWN0PVtBeGlzMl0iPmF4aXMtZGV2QHdzLmFwYWNoZS5vcmc8L2E+PC9pPi4NCi0oU3Vic2NyaXB0aW9uIGRldGFpbHMgYXJlIGF2YWlsYWJsZSBvbiB0aGUgPGEgaHJlZj0NCi0iaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvbWFpbC1saXN0cy5odG1sIj5BeGlzMiBzaXRlPC9hPi4pDQotS2luZGx5IHByZWZpeCBldmVyeSBlbWFpbCBzdWJqZWN0IHdpdGggW0F4aXMyXS48L3A+DQotPGgyPkNvbnRlbnRzPC9oMj4NCi08dWw+DQotPGxpPjxhIGhyZWY9IiNJbnRybyI+SW50cm9kdWN0aW9uPC9hPg0KLTx1bD4NCi08bGk+DQotPHA+PGEgaHJlZj0iI2xvZ2luIj5Mb2dpbiBpbnRvIEFkbWluaXN0cmF0aW9uIFNpdGU8L2E+PC9wPg0KLTwvbGk+DQotPC91bD4NCi08L2xpPg0KLTxsaT48YSBocmVmPSIjYWRtaW5vcHRpb25zIj5BZG1pbmlzdHJhdGlvbiBPcHRpb25zPC9hPg0KLTx1bD4NCi08bGk+DQotPHA+PGEgaHJlZj0iI3Rvb2xzIj5Ub29sczwvYT48L3A+DQotPHVsPg0KLTxsaT48YSBocmVmPSIjdXBzZXJ2aWNlIj5VcGxvYWQgU2VydmljZTwvYT48L2xpPg0KLTwvdWw+DQotPC9saT4NCi08bGk+DQotPHA+PGEgaHJlZj0iI3N5c2NvbXBvbmVudHMiPlN5c3RlbSBjb21wb25lbnRzPC9hPjwvcD4NCi08dWw+DQotPGxpPjxhIGhyZWY9IiNoZWFkaW5nMSI+QXZhaWxhYmxlIHNlcnZpY2VzPC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9IiNzZXJ2Z3JvdXBzIj5BdmFpbGFibGUgc2VydmljZSBncm91cHM8L2E+PC9saT4NCi08bGk+PGEgaHJlZj0iI2F2bW9kdWxlcyI+QXZhaWxhYmxlIG1vZHVsZXM8L2E+PC9saT4NCi08bGk+PGEgaHJlZj0iI2dsb2JhbG1vZHVsZXMiPkdsb2JhbGx5IGVuZ2FnZWQgbW9kdWxlczwvYT48L2xpPg0KLTxsaT48YSBocmVmPSIjcGhhc2VzIj5BdmFpbGFibGUgcGhhc2VzPC9hPjwvbGk+DQotPC91bD4NCi08L2xpPg0KLTxsaT4NCi08cD48YSBocmVmPSIjZXhlY3V0aW9uY2hhaW5zIj5FeGVjdXRpb24gY2hhaW5zPC9hPjwvcD4NCi08dWw+DQotPGxpPjxhIGhyZWY9IiNnbG9iYWxjaGFpbnMiPkdsb2JhbCBjaGFpbnM8L2E+PC9saT4NCi08bGk+PGEgaHJlZj0iI29wZXJhdGlvbmNoYWlucyI+T3BlcmF0aW9uIHNwZWNpZmljIGNoYWluczwvYT48L2xpPg0KLTwvdWw+DQotPC9saT4NCi08bGk+DQotPHA+PGEgaHJlZj0iI2VuZ2FnaW5tb2R1bGUiPkVuZ2FnZSBtb2R1bGU8L2E+PC9wPg0KLTwvbGk+DQotPGxpPjxhIGhyZWY9IiNzZXJ2aWNlcyI+U2VydmljZXM8L2E+DQotPHVsPg0KLTxsaT48YSBocmVmPSIjdHVybm9mZnNlcnZpY2UiPkRlYWN0aXZhdGUgU2VydmljZTwvYT48L2xpPg0KLTxsaT48YSBocmVmPSIjdHVybm9uc2VydmljZSI+QWN0aXZhdGUgU2VydmljZTwvYT48L2xpPg0KLTxsaT48YSBocmVmPSIjZWRpdHNlcnZpY2VwYXJhIj5FZGl0IHNlcnZpY2UgcGFyYW1ldGVyczwvYT48L2xpPg0KLTwvdWw+DQotPC9saT4NCi08bGk+DQotPHA+PGEgaHJlZj0iI2NvbnRleHQiPkNvbnRleHRzPC9hPjwvcD4NCi08dWw+DQotPGxpPjxhIGhyZWY9IiN2aWV3aGllcmFyY2h5Ij5WaWV3IEhpZXJhcmNoeTwvYT48L2xpPg0KLTwvdWw+DQotPC9saT4NCi08L3VsPg0KLTwvbGk+DQotPC91bD4NCi08YSBuYW1lPSJJbnRybyIgaWQ9IkludHJvIj48L2E+DQotPGgzPkludHJvZHVjdGlvbjwvaDM+DQotPHA+VGhlIEFwYWNoZSBBeGlzMiBXZWIgYXBwbGljYXRpb24gaGFzIHRocmVlIG1haW4gc2VjdGlvbnM6DQotJ1NlcnZpY2VzJyBsaXN0cyBhbGwgdGhlIGF2YWlsYWJsZSBzZXJ2aWNlcyBkZXBsb3llZCBpbiB0aGlzDQotc2VydmVyLCAnVmFsaWRhdGUnIGNoZWNrcyB0aGUgc3lzdGVtIHRvIHNlZSB3aGV0aGVyIGFsbCB0aGUNCi1yZXF1aXJlZCBsaWJyYXJpZXMgYXJlIGluIHBsYWNlIGFuZCB2aWV3cyB0aGUgc3lzdGVtIGluZm9ybWF0aW9uLA0KLWFuZCAnQWRtaW5pc3RyYXRpb24nIGlzIHRoZSBBeGlzMiBXZWIgQWRtaW5pc3RyYXRpb24gbW9kdWxlIHdoaWNoDQotaXMgdGhlIGNvbnNvbGUgZm9yIGFkbWluaXN0ZXJpbmcgdGhlIEFwYWNoZSBBeGlzMiBpbnN0YWxsYXRpb24uPC9wPg0KLTxwPlRoZSBBeGlzMiBXZWIgQWRtaW5pc3RyYXRpb24gbW9kdWxlIHByb3ZpZGVzIGEgd2F5IHRvIGNvbmZpZ3VyZQ0KLUF4aXMyIGR5bmFtaWNhbGx5LiBJdCdzIGltcG9ydGFudCB0byBub3RlIHRoYXQgdGhpcyBkeW5hbWljDQotY29uZmlndXJhdGlvbiB3aWxsIE5PVCBiZSBwZXJzaXN0ZW50LCBpLmUuLCBpZiB0aGUgc2VydmxldA0KLWNvbnRhaW5lciBpcyByZXN0YXJ0ZWQsIHRoZW4gYWxsIHRoZSBkeW5hbWljIGNvbmZpZ3VyYXRpb24gY2hhbmdlcw0KLXdpbGwgYmUgbG9zdC48L3A+DQotPGEgbmFtZT0ibG9naW4iIGlkPSJsb2dpbiI+PC9hPg0KLTxoND5Mb2cgb24gdG8gdGhlIEFkbWluaXN0cmF0aW9uIFNpdGU8L2g0Pg0KLTxwPk9uY2UgQXBhY2hlIEF4aXMyIGlzIHN1Y2Nlc3NmdWxseSBpbnN0YWxsZWQsIHRoZSBXZWIgYXBwbGljYXRpb24NCi1jYW4gYmUgYWNjZXNzZWQgKHNlZSA8YSBocmVmPSJpbnN0YWxsYXRpb25ndWlkZS5odG1sIj5JbnN0YWxsYXRpb24NCi1HdWlkZTwvYT4gZm9yIGluc3RydWN0aW9ucykuIEZyb20gdGhlIDxhIGhyZWY9IiNob21lcGFnZSI+QXhpczIgV2ViDQotQXBwbGljYXRpb24gSG9tZSBwYWdlPC9hPiB5b3UgY2FuIGdvIHRvIHRoZSBBZG1pbmlzdHJhdGlvbiBwYWdlIGJ5DQotY2xpY2tpbmcgdGhlICdBZG1pbmlzdHJhdGlvbicgbGluay4gVGhlIExvZ2luIHBhZ2Ugc2hvd24gYmVsb3cgd2lsbA0KLWFwcGVhciByZXF1ZXN0aW5nIHRoZSB1c2VyIG5hbWUgYW5kIHBhc3N3b3JkLiBUaGUgZGVmYXVsdCB1c2VyIG5hbWUNCi1pcyAnYWRtaW4nICh3aXRob3V0IHF1b3RlcykgYW5kIGRlZmF1bHQgcGFzc3dvcmQgaXMgJ2F4aXMyJw0KLSh3aXRob3V0IHF1b3RlcykuPC9wPg0KLTxwIGFsaWduPSJjZW50ZXIiPjxpbWcgYWx0PSIiIHNyYz0iaW1hZ2VzL2FkbWlubG9naW4uanBnIiAvPjwvcD4NCi08cD5Zb3UgY2FuIGNoYW5nZSB0aGUgdXNlciBuYW1lIGFuZCBwYXNzd29yZCB2YWx1ZXMgYnkgY2hhbmdpbmcgdGhlDQotZm9sbG93aW5nIHR3byBwYXJhbWV0ZXJzIGluIHRoZSBheGlzMi54bWwgYXMgcmVxdWlyZWQuPC9wPg0KLTxwIGFsaWduPSJjZW50ZXIiPjxpbWcgYWx0PSIiIHNyYz0iaW1hZ2VzL3BhcmFtZXRlcnMuanBnIiAvPjwvcD4NCi08cD5JZiB0aGUgbG9nIG9uIGlzIHN1Y2Nlc3NmdWwsIHlvdSB3aWxsIHNlZSB0aGUgc2NyZWVuIGJlbG93LiBUaGlzDQotaXMgd2hlcmUgeW91IGNhbiB2aWV3IHRoZSBjb25maWd1cmF0aW9uIGFuZCB0aGUgc3RhdHVzIG9mIHRoZQ0KLXJ1bm5pbmcgc3lzdGVtIGFuZCBkeW5hbWljYWxseSBjb25maWd1cmUgaXQuPC9wPg0KLTxwIGFsaWduPSJjZW50ZXIiPjxpbWcgYWx0PSIiIHNyYz0iaW1hZ2VzL2FkbWluLmpwZyIgLz48L3A+DQotPGEgbmFtZT0iYWRtaW5vcHRpb25zIiBpZD0iYWRtaW5vcHRpb25zIj48L2E+DQotPGgzPkFkbWluaXN0cmF0aW9uIE9wdGlvbnM8L2gzPg0KLTxkaXYgc3R5bGU9Im1hcmdpbi1sZWZ0OiAyZW0iPjxhIG5hbWU9InRvb2xzIiBpZD0NCi0idG9vbHMiPjxiPlRvb2xzPC9iPjwvYT4NCi08dWw+DQotPGxpPjxhIGhyZWY9IiN1cHNlcnZpY2UiPlVwbG9hZCBTZXJ2aWNlPC9hPjwvbGk+DQotPC91bD4NCi08YSBuYW1lPSJzeXNjb21wb25lbnRzIiBpZD0ic3lzY29tcG9uZW50cyI+PGI+U3lzdGVtDQotY29tcG9uZW50czwvYj48L2E+DQotPHVsPg0KLTxsaT48YSBocmVmPSIjaGVhZGluZzEiPkF2YWlsYWJsZSBzZXJ2aWNlczwvYT48L2xpPg0KLTxsaT48YSBocmVmPSIjc2Vydmdyb3VwcyI+QXZhaWxhYmxlIHNlcnZpY2UgZ3JvdXBzPC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9IiNhdm1vZHVsZXMiPkF2YWlsYWJsZSBtb2R1bGVzPC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9IiNnbG9iYWxtb2R1bGVzIj5HbG9iYWxseSBlbmdhZ2VkIG1vZHVsZXM8L2E+PC9saT4NCi08bGk+PGEgaHJlZj0iI3BoYXNlcyI+QXZhaWxhYmxlIHBoYXNlczwvYT48L2xpPg0KLTwvdWw+DQotPGEgbmFtZT0iZXhlY3V0aW9uY2hhaW5zIiBpZD0iZXhlY3V0aW9uY2hhaW5zIj48Yj5FeGVjdXRpb24NCi1jaGFpbnM8L2I+PC9hPg0KLTx1bD4NCi08bGk+PGEgaHJlZj0iI2dsb2JhbGNoYWlucyI+R2xvYmFsIGNoYWluczwvYT48L2xpPg0KLTxsaT48YSBocmVmPSIjb3BlcmF0aW9uY2hhaW5zIj5PcGVyYXRpb24gc3BlY2lmaWMgY2hhaW5zPC9hPjwvbGk+DQotPC91bD4NCi08Yj48YSBocmVmPSIjZW5nYWdpbm1vZHVsZSI+RW5nYWdlIG1vZHVsZTwvYT48L2I+PGJyIC8+DQotPHVsPg0KLTxsaT5Gb3IgYWxsIFNlcnZpY2VzPC9saT4NCi08bGk+Rm9yIGEgU2VydmljZSBHcm91cDwvbGk+DQotPGxpPkZvciBhIFNlcnZpY2U8L2xpPg0KLTxsaT5Gb3IgYW4gT3BlcmF0aW9uPC9saT4NCi08L3VsPg0KLTxhIG5hbWU9InNlcnZpY2VzIiBpZD0ic2VydmljZXMiPjxiPlNlcnZpY2VzPC9iPjwvYT4NCi08dWw+DQotPGxpPjxhIGhyZWY9IiN0dXJub2Zmc2VydmljZSI+RGVhY3RpdmF0ZSBzZXJ2aWNlPC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9IiN0dXJub25zZXJ2aWNlIj5BY3RpdmF0ZSBzZXJ2aWNlPC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9IiNlZGl0c2VydmljZXBhcmEiPkVkaXQgc2VydmljZSBwYXJhbWV0ZXJzPC9hPjwvbGk+DQotPC91bD4NCi08YSBuYW1lPSJjb250ZXh0IiBpZD0iY29udGV4dCI+PGI+Q29udGV4dHM8L2I+PC9hPg0KLTx1bD4NCi08bGk+PGEgaHJlZj0iI3ZpZXdoaWVyYXJjaHkiPlZpZXcgSGllcmFyY2h5PC9hPjwvbGk+DQotPC91bD4NCi08L2Rpdj4NCi08YSBuYW1lPSJob21lcGFnZSIgaWQ9ImhvbWVwYWdlIj48L2E+DQotPGgzPkFwYWNoZSBBeGlzMiBXZWIgQXBwbGljYXRpb24gSG9tZSBQYWdlPC9oMz4NCi08cCBhbGlnbj0iY2VudGVyIj48c3Ryb25nPjxpbWcgYWx0PSIiIHNyYz0NCi0iaW1hZ2VzL2NsaXBfaW1hZ2UwMDYuanBnIiAvPjwvc3Ryb25nPjwvcD4NCi08YSBuYW1lPSJ1cHNlcnZpY2UiIGlkPSJ1cHNlcnZpY2UiPjwvYT4NCi08aDM+VXBsb2FkIFNlcnZpY2VzPC9oMz4NCi08cD5Zb3UgY2FuIHVwbG9hZCBwYWNrYWdlZCBBcGFjaGUgQXhpczIgc2VydmljZSBhcmNoaXZlIGZpbGVzIHVzaW5nDQotdGhpcyBwYWdlLiBUaGlzIGNhbiBiZSBkb25lIGluIHR3byBzaW1wbGUgc3RlcHM6PC9wPg0KLTx1bD4NCi08bGk+QnJvd3NlIHRvIHRoZSBsb2NhdGlvbiBhbmQgc2VsZWN0IHRoZSBheGlzU2VydmljZSBhcmNoaXZlIGZpbGUNCi15b3Ugd2lzaCB0byB1cGxvYWQ8L2xpPg0KLTxsaT5UaGVuIGNsaWNrIFVwbG9hZDwvbGk+DQotPC91bD4NCi08cCBhbGlnbj0iY2VudGVyIj48aW1nIGFsdD0iIiBzcmM9ImltYWdlcy9jbGlwX2ltYWdlMDEwLmpwZyIgLz48L3A+DQotPGEgbmFtZT0iaGVhZGluZzEiIGlkPSJoZWFkaW5nMSI+PC9hPg0KLTxoMz5BdmFpbGFibGUgU2VydmljZXM8L2gzPg0KLTxwPlRoZSBmdW5jdGlvbmFsaXR5IG9mIHRoZSAnQXZhaWxhYmxlIFNlcnZpY2VzJyBvcHRpb24gaXMgYWxtb3N0DQotdGhlIHNhbWUgYXMgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgdGhlICdTZXJ2aWNlcycgb3B0aW9uIG9uIHRoZSBBeGlzMg0KLVdlYiBBcHBsaWNhdGlvbiBIb21lIHBhZ2UsIHdoZXJlIGl0IGRpc3BsYXlzIGEgbGlzdCBvZiBkZXBsb3llZA0KLXNlcnZpY2VzIGFuZCB0aGVpciBvcGVyYXRpb25zLiBBcyBhbiBhZGRpdGlvbmFsIGZlYXR1cmUsIHRoZQ0KLSdBdmFpbGFibGUgU2VydmljZXMnIHBhZ2UgbGlzdHMgZGV0YWlscyBvZiBtb2R1bGVzIHRoYXQgYXJlIGVuZ2FnZWQNCi10byB0aGUgZGVwbG95ZWQgc2VydmljZXMgYW5kIHRoZWlyIG9wZXJhdGlvbnMgb24gYSBnbG9iYWwsIHNlcnZpY2UNCi1vciBvbiBhbiBvcGVyYXRpb24gbGV2ZWwuPC9wPg0KLTxwPlVzaW5nIHRoZSAnRGlzZW5nYWdlJyBsaW5rLCB5b3UgY2FuIGRpc2VuZ2FnZSB0aGUgY29ycmVzcG9uZGluZw0KLW1vZHVsZSBhcyBsb25nIGFzIHRoZSBtb2R1bGUgaXMgbm90IGdsb2JhbGx5IGVuZ2FnZWQgKGkuZS4sIGVuZ2FnZWQNCi10byBhbGwgdGhlIHNlcnZpY2VzIGFuZCBvcGVyYXRpb25zKS48L3A+DQotPHA+Q2xpY2sgb24gYSBzcGVjaWZpYyBzZXJ2aWNlIGFuZCBpdCB3aWxsIGdpdmUgeW91IHRoZSBXU0RMIGZpbGUNCi1vZiB0aGF0IHBhcnRpY3VsYXIgc2VydmljZS48L3A+DQotPHA+PHN0cm9uZz5GYXVsdHkgc2VydmljZXM8L3N0cm9uZz4gb2YgdGhpcyBzeXN0ZW0gd2lsbCBhbHNvIGJlDQotbGlzdGVkIG9uIHRoaXMgcGFnZS4gQ2xpY2sgb24gYSBmYXVsdHkgc2VydmljZSB0byB2aWV3IGEgcGFnZSB0aGF0DQotbGlzdHMgdGhlIGV4Y2VwdGlvbiBzdGFjayB0cmFjZSBvZiB0aGUgZXhjZXB0aW9uLCB3aGljaCBjYXVzZWQgdGhlDQotc2VydmljZSB0byBiZSBmYXVsdHkuPC9wPg0KLTxwIGFsaWduPSJjZW50ZXIiPjxpbWcgYWx0PSIiIHNyYz0iaW1hZ2VzL2FkbWlubWFpbi5qcGciIC8+PC9wPg0KLTxhIG5hbWU9InNlcnZncm91cHMiIGlkPSJzZXJ2Z3JvdXBzIj48L2E+DQotPGgzPkF2YWlsYWJsZSBTZXJ2aWNlIEdyb3VwczwvaDM+DQotPHA+U2VydmljZSBncm91cCBpcyBhIGxvZ2ljYWwgY29sbGVjdGlvbiBvZiByZWxhdGVkIHNlcnZpY2VzLCBhbmQNCi10aGUgJ0F2YWlsYWJsZSBTZXJ2aWNlIEdyb3VwcycgbGluayB3aWxsIGxpc3QgYWxsIHRoZSBhdmFpbGFibGUNCi1zZXJ2aWNlIGdyb3VwcyBpbiB0aGUgc3lzdGVtLjwvcD4NCi08cCBhbGlnbj0iY2VudGVyIj48aW1nIGFsdD0iIiBzcmM9ImltYWdlcy9zZXJ2aWNlZ3JvdXBzLmpwZyIgLz48L3A+DQotPGEgbmFtZT0iYXZtb2R1bGVzIiBpZD0iYXZtb2R1bGVzIj48L2E+DQotPGgzPkF2YWlsYWJsZSBNb2R1bGVzPC9oMz4NCi08cD5UbyB2aWV3IHRoZSBhdmFpbGFibGUgbW9kdWxlcyBpbiB0aGUgJ21vZHVsZXMnIGRpcmVjdG9yeSBvZiB0aGUNCi1yZXBvc2l0b3J5LCBjbGljayAnQXZhaWxhYmxlIE1vZHVsZXMnLiBUaGlzIHdpbGwgc2hvdyB5b3UgYWxsIHRoZQ0KLWF2YWlsYWJsZSBtb2R1bGVzIGluIHRoZSBzeXN0ZW0uIFRob3NlIG1vZHVsZXMgY2FuIGJlIGVuZ2FnZWQNCi1keW5hbWljYWxseS48L3A+DQotPHAgYWxpZ249ImNlbnRlciI+PGltZyBhbHQ9IiIgc3JjPSJpbWFnZXMvbW9kdWxlcy5qcGciIC8+PC9wPg0KLTxiciAvPg0KLTxhIG5hbWU9Imdsb2JhbG1vZHVsZXMiIGlkPSJnbG9iYWxtb2R1bGVzIj48L2E+DQotPGgzPkdsb2JhbGx5IEVuZ2FnZWQgTW9kdWxlczwvaDM+DQotPHA+Q2xpY2sgdGhlICdHbG9iYWxseSBFbmdhZ2VkIE1vZHVsZXMnIHRvIHZpZXcgdGhlIGdsb2JhbGx5DQotZW5nYWdlZCBtb2R1bGVzLCBpZiBhbnkuIElmIGEgbW9kdWxlIGlzIGVuZ2FnZWQgZ2xvYmFsbHksIHRoZW4gdGhlDQotaGFuZGxlcnMgdGhhdCBiZWxvbmcgdG8gdGhhdCBtb2R1bGUgd2lsbCBiZSBleGVjdXRlZCBpcnJlc3BlY3RpdmUNCi1vZiB0aGUgc2VydmljZS48L3A+DQotPGEgbmFtZT0icGhhc2VzIiBpZD0icGhhc2VzIj48L2E+DQotPGgzPkF2YWlsYWJsZSBQaGFzZXM8L2gzPg0KLTxwPlRoZSAnQXZhaWxhYmxlIFBoYXNlcycgbGluayB3aWxsIGRpc3BsYXkgYWxsIHRoZSBhdmFpbGFibGUNCi1waGFzZXMuIEluIEF4aXMyLCB0aGVyZSBhcmUgdHdvIGxldmVscyBvZiBwaGFzZXM6PC9wPg0KLTx1bD4NCi08bGk+U3lzdGVtIHByZWRlZmluZWQgcGhhc2VzIChub3QgYWxsb3dlZCB0byBiZSBjaGFuZ2VkKTwvbGk+DQotPGxpPlVzZXIgZGVmaW5lZCBwaGFzZXM8L2xpPg0KLTwvdWw+DQotPHA+VGhlIG1haW4gZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZXNlIHR3byBsZXZlbHMgaXMgdGhhdCBzeXN0ZW0NCi1wcmVkZWZpbmVkIHBoYXNlcyB3aWxsIGJlIGludm9rZWQgaXJyZXNwZWN0aXZlIG9mIHRoZSBzZXJ2aWNlcywNCi13aGlsZSB0aGUgdXNlciBkZWZpbmVkIHBoYXNlcyB3aWxsIGJlIGludm9rZWQgd2hlbiB0aGUgZGlzcGF0Y2hlcg0KLWZpbmRzIHRoZSBvcGVyYXRpb24uIE5vdGUgdGhhdCBpdCBpcyBlc3NlbnRpYWwgZm9yIG1vZHVsZQ0KLWRldmVsb3BlcnMgYW5kIHNlcnZpY2Ugd3JpdGVycyB0byBoYXZlIGEgZ29vZCB1bmRlcnN0YW5kaW5nIG9mDQotcGhhc2VzIGFuZCBwaGFzZSBvcmRlcmluZy48L3A+DQotPHAgYWxpZ249ImNlbnRlciI+PGltZyBhbHQ9IiIgc3JjPSJpbWFnZXMvdmlld3BoYXNlcy5qcGciIC8+PC9wPg0KLTxiciAvPg0KLTxhIG5hbWU9Imdsb2JhbGNoYWlucyIgaWQ9Imdsb2JhbGNoYWlucyI+PC9hPg0KLTxoMz5HbG9iYWwgQ2hhaW5zPC9oMz4NCi08cD5UaGUgJ0dsb2JhbCBDaGFpbnMnIGxpbmsgd2lsbCBkaXNwbGF5IGFsbCB0aGUgR2xvYmFsIEV4ZWN1dGlvbg0KLUNoYWlucy4gVGhlIG1vc3QgaW50ZXJlc3RpbmcgZmVhdHVyZSBvZiB0aGUgQXhpczIgV2ViDQotQWRtaW5pc3RyYXRpb24gTW9kdWxlIGlzIHRoYXQgaXQgcHJvdmlkZXMgYSB2ZXJ5IGJhc2ljIG1ldGhvZCBvZg0KLXZpZXdpbmcgdGhlIGdsb2JhbCBwaGFzZSBsaXN0IGFuZCBoYW5kbGVycyBpbnNpZGUgdGhlIHBoYXNlcw0KLWRlcGVuZGluZyBvbiBib3RoIHRoZSBwaGFzZSBhbmQgaGFuZGxlciBvcmRlcnMuIFRoaXMga2luZCBvZg0KLWluZm9ybWF0aW9uIGlzIGV4dHJlbWVseSB1c2VmdWwgaW4gZGVidWdnaW5nIHRoZSBzeXN0ZW0sIGFzIHRoZXJlDQotaXMgbm8gb3RoZXIgd2F5IHRvIGxpc3Qgb3V0IGhhbmRsZXJzIGluIHRoZSBnbG9iYWwgY2hhaW5zLiBJZiB5b3UNCi1lbmdhZ2UgYSBuZXcgbW9kdWxlLCB0aGUgbmV3IGhhbmRsZXJzIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGdsb2JhbA0KLWNoYWlucyBhbmQgd2lsbCBiZSBkaXNwbGF5ZWQgb24gdGhpcyBwYWdlLjwvcD4NCi08cCBhbGlnbj0iY2VudGVyIj48aW1nIGFsdD0iIiBzcmM9ImltYWdlcy9nbG9iYWxjaGFpbi5qcGciIC8+PC9wPg0KLTxiciAvPg0KLTxhIG5hbWU9Im9wZXJhdGlvbmNoYWlucyIgaWQ9Im9wZXJhdGlvbmNoYWlucyI+PC9hPg0KLTxoMz5PcGVyYXRpb24gU3BlY2lmaWMgQ2hhaW5zPC9oMz4NCi08cD5UaGUgJ09wZXJhdGlvbiBTcGVjaWZpYyBDaGFpbnMnIGxpbmsgY2FuIGJlIHVzZWQgdG8gdmlldyB0aGUNCi1oYW5kbGVycyBjb3JyZXNwb25kaW5nIHRvIGEgZ2l2ZW4gc2VydmljZSBpbiB0aGUgc2FtZSBvcmRlciBhcyBpdA0KLWlzIGluIHRoZSByZWFsIGV4ZWN1dGlvbiBjaGFpbi48L3A+DQotPHAgYWxpZ249ImNlbnRlciI+PGltZyBhbHQ9IiIgc3JjPQ0KLSJpbWFnZXMvc2VsZWN0X3NlcnZpY2VfZm9yX2hhbmRsZXIuanBnIiAvPjwvcD4NCi08YnIgLz4NCi08cD5TZWxlY3QgdGhlIHNlcnZpY2Ugb2Ygd2hvc2Ugc2VydmljZSBoYW5kbGVycyB5b3Ugd2lzaCB0byB2aWV3DQotZnJvbSB0aGUgbGlzdCwgYW5kIGNsaWNrICdWaWV3JyB0byB2aWV3IHRoZSBoYW5kbGVycy4gVGhlIHBhZ2UNCi1iZWxvdyBzaG93cyB0aGUgc2VydmljZSBoYW5kbGVycyBvZiB0aGUgc2VydmljZQ0KLTxlbT52ZXJzaW9uPC9lbT48L3A+DQotPHAgYWxpZ249ImNlbnRlciI+PGltZyBhbHQ9IiIgc3JjPQ0KLSJpbWFnZXMvc2VydmljZUhhbmRsZXJzLmpwZyIgLz48L3A+DQotPGJyIC8+DQotPGEgbmFtZT0iZW5nYWdpbm1vZHVsZSIgaWQ9ImVuZ2FnaW5tb2R1bGUiPjwvYT4NCi08aDM+RW5nYWdpbmcgTW9kdWxlczwvaDM+DQotPHA+VGhlICdFbmdhZ2luZyBNb2R1bGVzJyBsaW5rIGFsbG93cyB5b3UgdG8gZW5nYWdlIG1vZHVsZXMgZWl0aGVyDQotZ2xvYmFsbHkgKHRvIGFsbCBzZXJ2aWNlcyksIHRvIGEgc2VydmljZSBncm91cCwgdG8gYSBzZXJ2aWNlLCBvciB0bw0KLWFuIG9wZXJhdGlvbiBkZXBlbmRpbmcgb24gdGhlIG1vZHVsZSBpbXBsZW1lbnRhdGlvbi4gSWYgdGhlIG1vZHVsZQ0KLXdhcyBkZXNpZ25lZCB0byBlbmdhZ2UgdGhlIGhhbmRsZXJzIGdsb2JhbGx5LCB0aGVuIHRoZSBoYW5kbGVycyBpbg0KLXRoZSBtb2R1bGUgY2FuIGJlIGluY2x1ZGVkIGluIGFueSBwaGFzZSBpbiB0aGUgc3lzdGVtLiBJdCBjYW4gYmUNCi1laXRoZXIgYSBzeXN0ZW0gcHJlZGVmaW5lZCBwaGFzZSBvciBhIHVzZXIgZGVmaW5lZCBwaGFzZS48L3A+DQotPHA+T24gdGhlIG90aGVyIGhhbmQsIGlmIHRoZSBtb2R1bGUgd2FzIGltcGxlbWVudGVkIGluIHN1Y2ggYSB3YXkNCi10aGF0IGl0IGlzIGdvaW5nIHRvIGJlIGRlcGxveWVkIHRvIGEgc2VydmljZSBvciB0byBhbiBvcGVyYXRpb24sDQotdGhlbiB0aGUgbW9kdWxlIGNhbm5vdCBiZSBpbmNsdWRlZCBpbiBhbnkgb2YgdGhlIDxhIGhyZWY9DQotIiNwaGFzZXMiPlN5c3RlbSBQcmVkZWZpbmVkIFBoYXNlczwvYT4uIFRodXMgaXQgY2FuIG9ubHkgYmUNCi1pbmNsdWRlZCBpbiA8YSBocmVmPSIjcGhhc2VzIj5Vc2VyIERlZmluZWQgUGhhc2VzPC9hPi48L3A+DQotPHA+SW1tZWRpYXRlbHkgYWZ0ZXIgZW5nYWdpbmcgdGhlIG1vZHVsZSwgeW91IGNhbiBzZWUgdGhlIHN0YXR1cyBvZg0KLXRoZSBlbmdhZ2VtZW50IGluZGljYXRpbmcgd2hldGhlciBpdCBpcyBlbmdhZ2VkIHByb3Blcmx5IG9yDQotbm90LjwvcD4NCi08cCBhbGlnbj0iY2VudGVyIj48aW1nIGFsdD0iIiBzcmM9ImltYWdlcy9tb2R1bGVlbmdhZ2UuanBnIiAvPjwvcD4NCi08YSBuYW1lPSJ0dXJub2Zmc2VydmljZSIgaWQ9InR1cm5vZmZzZXJ2aWNlIj48L2E+DQotPGgzPkRlYWN0aXZhdGUgU2VydmljZTwvaDM+DQotPHA+VGhlICdEZWFjdGl2YXRlIFNlcnZpY2UnIGxpbmsgdW5kZXIgdGhlICdTZXJ2aWNlcycgbGlzdCB3aWxsDQotbGVhZCB0byB0aGUgcGFnZSBiZWxvdy4gVGhlIERlYWN0aXZhdGUgc2VydmljZSBmdW5jdGlvbmFsaXR5DQotcHJvdmlkZXMgYSB3YXkgdG8gcmVtb3ZlIHVubmVjZXNzYXJ5IHNlcnZpY2VzIGZyb20gdGhlIHJ1bm5pbmcNCi1zeXN0ZW0sIGJ1dCB0aGUgcmVtb3ZhbCBpcyB0cmFuc2llbnQtLXdoaWNoIG1lYW5zIHRoYXQgaWYgeW91DQotcmVzdGFydCB0aGUgc3lzdGVtLCB0aGUgc2VydmljZSB3aWxsIGJlIGFjdGl2ZS48L3A+DQotPHA+VG8gZGVhY3RpdmF0ZSBhIHNlcnZpY2UsIHNlbGVjdCBhIHNlcnZpY2UgZnJvbSB0aGUgbGlzdCwgc2VsZWN0DQotdGhlICdEZWFjdGl2YXRlIHNlcnZpY2UnIGNoZWNrIGJveCwgYW5kIHRoZW4gY2xpY2sgJ0RlYWN0aXZhdGUnLi4NCi1UaGUgJ0NsZWFyJyBidXR0b24gd2lsbCBjbGVhciB0aGUgJ0RlYWN0aXZhdGUgc2VydmljZScgY2hlY2sNCi1ib3guPC9wPg0KLTxwIGFsaWduPSJjZW50ZXIiPjxpbWcgYWx0PSIiIHNyYz0iaW1hZ2VzL2luYWN0aXZhdGUuanBnIiAvPjwvcD4NCi08YnIgLz4NCi08YSBuYW1lPSJ0dXJub25zZXJ2aWNlIiBpZD0idHVybm9uc2VydmljZSI+PC9hPg0KLTxoMz5BY3RpdmF0ZSBTZXJ2aWNlPC9oMz4NCi08cD5UaGUgJ0FjdGl2YXRlIFNlcnZpY2UnIGxpbmsgdW5kZXIgdGhlICdTZXJ2aWNlcycgbGlzdCB3aWxsIGxlYWQNCi10byB0aGUgcGFnZSBiZWxvdy4gVGhlIEFjdGl2YXRlIHNlcnZpY2UgZnVuY3Rpb25hbGl0eSBwcm92aWRlcyBhDQotd2F5IHRvIGFjdGl2YXRlIHNlcnZpY2VzIHdoaWxlIHRoZSBzeXN0ZW0gaXMgcnVubmluZywgYnV0IHRoZQ0KLWFjdGl2YXRpb24gaXMgdHJhbnNpZW50LS0gd2hpY2ggbWVhbnMgdGhhdCBpZiB5b3UgcmVzdGFydCB0aGUNCi1zeXN0ZW0sIHRoZSBzZXJ2aWNlIHdpbGwgYmUgaW5hY3RpdmUuPC9wPg0KLTxwPlRvIGFjdGl2YXRlIGEgc2VydmljZSwgc2VsZWN0IGEgc2VydmljZSBmcm9tIHRoZSBsaXN0LCBzZWxlY3QNCi10aGUgJ0FjdGl2YXRlIFNlcnZpY2UnIGNoZWNrIGJveCwgdGhlbiBjbGljayAnQWN0aXZhdGUnLiBUaGUNCi0nQ2xlYXInIGJ1dHRvbiB3aWxsIGNsZWFyIHRoZSAnQWN0aXZhdGUgc2VydmljZScgY2hlY2sgYm94LjwvcD4NCi08cCBhbGlnbj0iY2VudGVyIj48aW1nIGFsdD0iIiBzcmM9ImltYWdlcy9hY3RpdmF0ZS5qcGciIC8+PC9wPg0KLTxiciAvPg0KLTxhIG5hbWU9ImVkaXRzZXJ2aWNlcGFyYSIgaWQ9ImVkaXRzZXJ2aWNlcGFyYSI+PC9hPg0KLTxoMz5FZGl0IFNlcnZpY2UgUGFyYW1ldGVyczwvaDM+DQotPHA+VGhpcyBmdW5jdGlvbmFsaXR5IHByb3ZpZGVzIGEgd2F5IHRvIGNoYW5nZSB0aGUgcGFyYW1ldGVycyBpbiBhDQotc2VydmljZSBvciBpdHMgb3BlcmF0aW9ucy4gVGhlc2UgY2hhbmdlcyB3aWxsIGJlIHRyYW5zaWVudCB0b28sDQotd2hpY2ggbWVhbnMgaWYgeW91IHJlc3RhcnQgdGhlIHN5c3RlbSwgdGhlIGNoYW5nZXMgd2lsbCBub3QgYmUNCi1yZWZsZWN0ZWQuPC9wPg0KLTxwPlRoZSAnRWRpdCBQYXJhbWV0ZXJzJyBsaW5rIHVuZGVyIHRoZSAnU2VydmljZXMnIGxpc3QgKG9uIHRoZQ0KLW5hdmlnYXRpb24gYmFyKSB3aWxsIGxpbmsgdG8gdGhlIHBhZ2Ugd2hlcmUgeW91IGNhbiBzZWxlY3QgdGhlDQotc2VydmljZXMgb2Ygd2hpY2ggeW91IHdhbnQgdG8gZWRpdCB0aGUgcGFyYW1ldGVycy4gT25jZSB0aGUgc2VydmljZQ0KLWlzIHNlbGVjdGVkLCBjbGljayAnRWRpdCBQYXJhbWV0ZXJzJy4uIFRoaXMgd2lsbCBvcGVuIHRoZSBwYWdlDQotc2hvd24gYmVsb3cuPC9wPg0KLTxwIGFsaWduPSJjZW50ZXIiPjxpbWcgYWx0PSIiIHNyYz0NCi0iaW1hZ2VzL2VkaXRzZXJ2aWVjcGFyYS5qcGciIC8+PC9wPg0KLTxiciAvPg0KLTxhIG5hbWU9InZpZXdoaWVyYXJjaHkiIGlkPSJ2aWV3aGllcmFyY2h5Ij48L2E+DQotPGgzPlZpZXcgSGllcmFyY2h5PC9oMz4NCi08cD5CeSBsaXN0aW5nIHRoZSBjdXJyZW50IGNvbnRleHQgaGllcmFyY2h5LCB0aGUgJ1ZpZXcgSGllcmFyY2h5Jw0KLWxpbmsgcHJvdmlkZXMgYSBtZWFucyB0byBsb29rIGF0IHRoZSBzeXN0ZW0gc3RhdGUgYXQgcnVuIHRpbWUuIFRoaXMNCi13aWxsIGxpc3Qgb3V0IGFsbCB0aGUgYXZhaWxhYmxlIHNlcnZpY2UgZ3JvdXAgY29udGV4dHMsIHNlcnZpY2UNCi1jb250ZXh0cywgb3BlcmF0aW9uIGNvbnRleHRzLCBldGMuPC9wPg0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL3htbGJhc2VkLXNlcnZlci54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAveG1sYmFzZWQtc2VydmVyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk2OTAzZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAveG1sYmFzZWQtc2VydmVyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIwMCArMCwwIEBACi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIg0KLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+DQotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPg0KLTxoZWFkPg0KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0NCi0iSFRNTCBUaWR5IGZvciBXaW5kb3dzICh2ZXJzIDE0IEp1bmUgMjAwNyksIHNlZSB3d3cudzMub3JnIiAvPg0KLTxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0iIiAvPg0KLTx0aXRsZT5Xcml0aW5nIFdlYiBTZXJ2aWNlcyBVc2luZyBBeGlzMidzIFByaW1hcnkgQVBJczwvdGl0bGU+DQotPGxpbmsgaHJlZj0iLi4vY3NzL2F4aXMtZG9jcy5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiDQotbWVkaWE9ImFsbCIgLz4NCi08L2hlYWQ+DQotPGJvZHk+DQotPGEgbmFtZT0iV3JpdGluZ19XZWJfU2VydmljZXNfVXNpbmcgQXhpczInc19QcmltYXJ5X0FQSXMiPjwvYT4NCi08aDE+V3JpdGluZyBXZWIgU2VydmljZXMgVXNpbmcgQXBhY2hlIEF4aXMyJ3MgUHJpbWFyeSBBUElzPC9oMT4NCi08cD5BcGFjaGUgQXhpczIgZGlzcGF0Y2hlcyBhIGNvbXBvbmVudCBjYWxsZWQNCi08c3Ryb25nPk1lc3NhZ2VSZWNlaXZlcjwvc3Ryb25nPiB3aGVuIFJlY2VpdmluZyBhIE1lc3NhZ2UgdG8gdGhlDQotc2VydmVyLiBBcGFjaGUgQXhpczIgcHJvdmlkZXMgZGlmZmVyZW50IGltcGxlbWVudGF0aW9ucyBvZiB0aGlzDQotY2xhc3MgYW5kIGl0IGNhbiBiZSBjb25maWd1cmVkIGJ5IGFkZGluZyBhIG1lc3NhZ2VSZWNlaXZlciB0YWcgdG8NCi1zZXJ2aWNlcy54bWwuIEFwYWNoZSBBeGlzMiBwcm92aWRlcyBhbiBpbXBsZW1lbnRhdGlvbiBmb3IgYSBjbGFzcw0KLW9mIE1lc3NhZ2UgcmVjZWl2ZXJzIGNhbGxlZCBSYXdYbWwgTWVzc2FnZSByZWNlaXZlcnMuIFRoZXkgd29yayBhdA0KLXRoZSBYTUwgbGV2ZWwgYW5kIGNhbiBvbmx5IGhhbmRsZSBPTUVsZW1lbnRzIGFzIHBhcmFtZXRlcnMuIFRoaXMNCi1zZWN0aW9uIGV4cGxhaW5zIGhvdyB0byB3cml0ZSBhIHNlcnZpY2UgdXNpbmcgdGhlbS48L3A+DQotPHA+SW4gb3VyIGV4YW1wbGUsIHRoZSBXZWIgc2VydmljZSB3aWxsIGhhdmUgdHdvIG9wZXJhdGlvbnMuPC9wPg0KLTxwcmU+DQotcHVibGljIHZvaWQgcGluZyhPTUVsZW1lbnQgZWxlbWVudCl7fSAvL0lOLU9OTFkgb3BlcmF0aW9uLCBqdXN0IGFjY2VwdHMgdGhlIE9NRWxlbWVudCBhbmQgZG9lcyBzb21lIHByb2Nlc3NpbmcuDQotcHVibGljIE9NRWxlbWVudCBlY2hvKE9NRWxlbWVudCBlbGVtZW50KXt9Ly9JTi1PVVQgb3BlcmF0aW9uLCBhY2NlcHRzIGFuIE9NRWxlbWVudCBhbmQgIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlbmRzIGJhY2sgdGhlIHNhbWUgYWdhaW4gDQotPC9wcmU+DQotPGEgbmFtZT0iSG93X3RvX3dyaXRlX3RoZV9XZWJfU2VydmljZV8iIGlkPQ0KLSJIb3dfdG9fd3JpdGVfdGhlX1dlYl9TZXJ2aWNlXyI+PC9hPg0KLTxoND5Ib3cgdG8gV3JpdGUgYSBXZWIgU2VydmljZT88L2g0Pg0KLVdyaXRpbmcgYSBuZXcgV2ViIHNlcnZpY2Ugd2l0aCBBcGFjaGUgQXhpczIgaW52b2x2ZXMgZm91ciBzdGVwczoNCi08b2w+DQotPGxpPldyaXRlIHRoZSBJbXBsZW1lbnRhdGlvbiBDbGFzcy48L2xpPg0KLTxsaT5Xcml0ZSBhIHNlcnZpY2VzLnhtbCBmaWxlIHRvIGV4cGxhaW4gdGhlIFdlYiBzZXJ2aWNlLjwvbGk+DQotPGxpPkNyZWF0ZSBhICouYWFyIGFyY2hpdmUgKEF4aXMgQXJjaGl2ZSkgZm9yIHRoZSBXZWIgc2VydmljZS48L2xpPg0KLTxsaT5EZXBsb3kgdGhlIFdlYiBzZXJ2aWNlLjwvbGk+DQotPC9vbD4NCi08YSBuYW1lPSJTdGVwMV86V3JpdGVfdGhlX0ltcGxlbWVudGF0aW9uX0NsYXNzIiBpZD0NCi0iU3RlcDFfOldyaXRlX3RoZV9JbXBsZW1lbnRhdGlvbl9DbGFzcyI+PC9hPg0KLTxoND5TdGVwMTogV3JpdGUgdGhlIEltcGxlbWVudGF0aW9uIENsYXNzPC9oND4NCi08cD5BbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBoYXMgdGhlIGJ1c2luZXNzIGxvZ2ljIGZvciB0aGUgV2ViDQotc2VydmljZSBhbmQgaW1wbGVtZW50cyB0aGUgb3BlcmF0aW9ucyBwcm92aWRlZCBieSB0aGUgV2ViIHNlcnZpY2UuDQotVW5sZXNzIHlvdSBoYXZlIGRhdGEgYmluZGluZywgdGhlIHNpZ25hdHVyZSBvZiB0aGUgbWV0aG9kcyBjYW4gaGF2ZQ0KLW9ubHkgb25lIHBhcmFtZXRlciBvZiB0aGUgdHlwZSBPTUVsZW1lbnQuIDxpPk9NIHN0YW5kcyBmb3IgT2JqZWN0DQotTW9kZWwgKGFsc28ga25vd24gYXMgQVhJT00gLSBBWGlzIE9iamVjdCBNb2RlbCkgYW5kIHJlZmVycyB0byB0aGUNCi1YTUwgaW5mb3NldCBtb2RlbCB0aGF0IGlzIGluaXRpYWxseSBkZXZlbG9wZWQgZm9yIEFwYWNoZSBBeGlzMi4gRE9NDQotYW5kIEpET00gYXJlIHR3byBzdWNoIFhNTCBtb2RlbHMgY29uY2VwdHVhbGx5IHNpbWlsYXIgdG8gT00gYXMgYW4NCi1YTUwgbW9kZWwgYnkgaXRzIGV4dGVybmFsIGJlaGF2aW9yLCBidXQgY29uc2lkZXJpbmcgdGhlIGRlZXAgZG93bg0KLWltcGxlbWVudGF0aW9uIE9NIGlzIHZlcnkgbXVjaCBkaWZmZXJlbnQgdG8gb3RoZXJzLiBPTUVsZW1lbnQgaXMNCi10aGUgYmFzaWMgcmVwcmVzZW50YXRpb24gb2YgdGhlIFhNTCBpbmZvc2V0IGVsZW1lbnQgaW4gT00uRm9yIG1vcmUNCi1kZXRhaWxzIG9uIE9NRWxlbWVudCBzZWUgdGhlIDxhIGhyZWY9DQotImh0dHA6Ly93cy5hcGFjaGUub3JnL2NvbW1vbnMvYXhpb20vT01UdXRvcmlhbC5odG1sIj5PTQ0KLVR1dG9yaWFsPC9hPi48L2k+PC9wPg0KLTxwcmU+DQotcHVibGljIGNsYXNzIE15U2VydmljZXsNCi0gICAgcHVibGljIHZvaWQgcGluZyhPTUVsZW1lbnQgZWxlbWVudCl7DQotICAgICAgICAvLyBCdXNpbmVzcyBMb2dpYyAgICAgDQotICAgICAgICAuLi4uLi4NCi0gICAgfQ0KLSAgICBwdWJsaWMgT01FbGVtZW50IGVjaG8oT01FbGVtZW50IGVsZW1lbnQpew0KLSAgICAgLi4uLi4uDQotICAgIH0NCi19DQotPC9wcmU+DQotPGEgbmFtZT0iU3RlcDJfOldyaXRlX3RoZV9zZXJ2aWNlc194bWxfZmlsZSIgaWQ9DQotIlN0ZXAyXzpXcml0ZV90aGVfc2VydmljZXNfeG1sX2ZpbGUiPjwvYT4NCi08aDQ+U3RlcDI6IFdyaXRlIHRoZSBzZXJ2aWNlcy54bWwgZmlsZTwvaDQ+DQotPHA+InNlcnZpY2VzLnhtbCIgaGFzIHRoZSBjb25maWd1cmF0aW9uIGZvciBhIFdlYiBzZXJ2aWNlLiBFYWNoIFdlYg0KLXNlcnZpY2UsIGRlcGxveWVkIGluIEFwYWNoZSBBeGlzMiAsIG11c3QgaGF2ZSBpdHMgY29uZmlndXJhdGlvbiBpbg0KLSJzZXJ2aWNlcy54bWwiLiBUaGUgY29uZmlndXJhdGlvbiBmb3IgTXlTZXJ2aWNlIGlzIGFzIGZvbGxvd3M6PC9wPg0KLTxwcmU+DQotJmx0O3NlcnZpY2UgJmd0Ow0KLSAgICAmbHQ7ZGVzY3JpcHRpb24mZ3Q7DQotICAgICAgICBUaGlzIGlzIGEgc2FtcGxlIFdlYiBzZXJ2aWNlIHdpdGggdHdvIG9wZXJhdGlvbnMsIGVjaG8gYW5kIHBpbmcuDQotICAgICZsdDsvZGVzY3JpcHRpb24mZ3Q7DQotICAgICZsdDtwYXJhbWV0ZXIgbmFtZT0iU2VydmljZUNsYXNzIiZndDt1c2VyZ3VpZGUuZXhhbXBsZTEuTXlTZXJ2aWNlJmx0Oy9wYXJhbWV0ZXImZ3Q7DQotICAgICZsdDtvcGVyYXRpb24gbmFtZT0iZWNobyImZ3Q7DQotICAgICAgICAmbHQ7bWVzc2FnZVJlY2VpdmVyIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5SYXdYTUxJTk91dE1lc3NhZ2VSZWNlaXZlciIvJmd0Ow0KLSAgICAgICAgJmx0O2FjdGlvbk1hcHBpbmcmZ3Q7dXJuOmVjaG8mbHQ7L2FjdGlvbk1hcHBpbmcmZ3Q7DQotICAgICZsdDsvb3BlcmF0aW9uJmd0Ow0KLSAgICAgJmx0O29wZXJhdGlvbiBuYW1lPSJwaW5nIiZndDsNCi0gICAgICAgICZsdDttZXNzYWdlUmVjZWl2ZXIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLlJhd1hNTElOT25seU1lc3NhZ2VSZWNlaXZlciIvJmd0Ow0KLSAgICAgICAgJmx0O2FjdGlvbk1hcHBpbmcmZ3Q7dXJuOnBpbmcmbHQ7L2FjdGlvbk1hcHBpbmcmZ3Q7DQotICAgICZsdDsvb3BlcmF0aW9uJmd0Ow0KLSAmbHQ7L3NlcnZpY2UmZ3Q7DQotPC9wcmU+DQotPHA+VGhlIGFib3ZlIFhNTCB0YWdzIGNhbiBiZSBleHBsYWluZWQgYXMgZm9sbG93czo8L3A+DQotPHA+MS4gVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBzZXJ2aWNlIGNsYXNzIGlzIHByb3ZpZGVkIGluIHRoZQ0KLWRlc2NyaXB0aW9uIHRhZy48L3A+DQotPHByZT4NCi0mbHQ7c2VydmljZSAmZ3Q7DQotICAgICZsdDtkZXNjcmlwdGlvbiZndDsNCi0gICAgICAgIFRoaXMgaXMgYSBzYW1wbGUgV2ViIHNlcnZpY2Ugd2l0aCB0d28gb3BlcmF0aW9ucywgZWNobyBhbmQgcGluZy4NCi0gICAgJmx0Oy9kZXNjcmlwdGlvbiZndDsNCi08L3ByZT4NCi08cD4yLiBUaGUgbmFtZSBvZiB0aGUgc2VydmljZSBjbGFzcyBpcyBwcm92aWRlZCBhcyBhIHBhcmFtZXRlci48L3A+DQotPHByZT4NCi0mbHQ7cGFyYW1ldGVyIG5hbWU9InNlcnZpY2VDbGFzcyImZ3Q7dXNlcmd1aWRlLmV4YW1wbGUxLk15U2VydmljZSZsdDsvcGFyYW1ldGVyJmd0Ow0KLTwvcHJlPg0KLTxwPjMuIFRoZSAib3BlcmF0aW9uIiBYTUwgdGFnIGRlc2NyaWJlcyB0aGUgb3BlcmF0aW9ucyB0aGF0IGFyZQ0KLWF2YWlsYWJsZSBpbiB0aGlzIHNlcnZpY2Ugd2l0aCByZXNwZWN0aXZlIG1lc3NhZ2UgcmVjZWl2ZXJzLjwvcD4NCi08cHJlPg0KLSAgICZsdDtvcGVyYXRpb24gbmFtZT0iZWNobyImZ3Q7DQotICAgICAgICAgICAgJmx0O21lc3NhZ2VSZWNlaXZlciBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuUmF3WE1MSU5PdXRNZXNzYWdlUmVjZWl2ZXIiLyZndDsNCi0gICAgICAgICAgICAmbHQ7YWN0aW9uTWFwcGluZyZndDt1cm46ZWNobyZsdDsvYWN0aW9uTWFwcGluZyZndDsNCi0gICAmbHQ7L29wZXJhdGlvbiZndDsNCi0gICAmbHQ7b3BlcmF0aW9uIG5hbWU9InBpbmciJmd0Ow0KLSAgICAgICAmbHQ7bWVzc2FnZVJlY2VpdmVyIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5SYXdYTUxJTk9ubHlNZXNzYWdlUmVjZWl2ZXIiLyZndDsNCi0gICAgICAgJmx0O2FjdGlvbk1hcHBpbmcmZ3Q7dXJuOnBpbmcmbHQ7L2FjdGlvbk1hcHBpbmcmZ3Q7DQotICAgJmx0Oy9vcGVyYXRpb24mZ3Q7DQotPC9wcmU+DQotPHA+NC4gRXZlcnkgb3BlcmF0aW9uIG11c3QgbWFwIHRvIGEgY29ycmVzcG9uZGluZyBNZXNzYWdlUmVjZWl2ZXINCi1jbGFzcy4gQWZ0ZXIgYSBtZXNzYWdlIGlzIHByb2Nlc3NlZCBieSB0aGUgaGFuZGxlcnMsIHRoZSBBeGlzMg0KLWVuZ2luZSBoYW5kcyBpdCBvdmVyIHRvIGEgTWVzc2FnZVJlY2VpdmVyLjwvcD4NCi08cD41LiBGb3IgdGhlICJlY2hvIiBvcGVyYXRpb24sIHdlIGhhdmUgdXNlZCBhDQotPHN0cm9uZz5SYXdYTUxJTk91dE1lc3NhZ2VSZWNlaXZlcjwvc3Ryb25nPiBzaW5jZSBpdCBpcyBhbiBJTi1PVVQNCi1vcGVyYXRpb24uIEZvciB0aGUgSU4tT05MWSBvcGVyYXRpb24gInBpbmciLCB3ZSBoYXZlIHVzZWQNCi08c3Ryb25nPlJhd1hNTElOT25seU1lc3NhZ2VSZWNlaXZlcjwvc3Ryb25nPiBhcyB0aGUgbWVzc2FnZQ0KLXJlY2VpdmVyLjwvcD4NCi08cD42LiBUaGUgYWN0aW9uTWFwcGluZyBpcyByZXF1aXJlZCBvbmx5IGlmIHlvdSB3YW50IHRvIGVuYWJsZQ0KLVdTLUFkZHJlc3NpbmcuIFRoaXMgd2lsbCBiZSB1c2VkIGxhdGVyIGluIHRoaXMgdXNlciBndWlkZS48L3A+DQotPHA+Ny4gWW91IGNhbiB3cml0ZSBhIHNlcnZpY2VzLnhtbCBmaWxlIHRvIGluY2x1ZGUgYSBncm91cCBvZg0KLXNlcnZpY2VzIGluc3RlYWQgb2YgYSBzaW5nbGUgc2VydmljZS4gVGhpcyBtYWtlcyB0aGUgbWFuYWdlbWVudCBhbmQNCi1kZXBsb3ltZW50IG9mIGEgc2V0IG9mIHJlbGF0ZWQgc2VydmljZXMgdmVyeSBlYXN5LiBBdCBydW50aW1lLCB5b3UNCi1jYW4gc2hhcmUgaW5mb3JtYXRpb24gYmV0d2VlbiB0aGVzZSBzZXJ2aWNlcyB3aXRoaW4gYSBzaW5nbGUNCi1pbnRlcmFjdGlvbiB1c2luZyB0aGUgU2VydmljZUdyb3VwQ29udGV4dC4gSWYgeW91IGhvcGUgdG8gdXNlIHRoaXMNCi1mdW5jdGlvbmFsaXR5LCB0aGUgc2VydmljZXMueG1sIGZpbGUgc2hvdWxkIGhhdmUgdGhlIGZvbGxvd2luZw0KLWZvcm1hdC48L3A+DQotPHByZT4NCi0mbHQ7U2VydmljZUdyb3VwJmd0Ow0KLSAgJmx0O3NlcnZpY2UgbmFtZT0iU2VydmljZTEiJmd0Ow0KLSAgICAmbHQ7IS0tIGRldGFpbHMgZm9yIFNlcnZpY2UxIC0tJmd0Ow0KLSAgJmx0Oy9zZXJ2aWNlJmd0Ow0KLSAgJmx0O3NlcnZpY2UgbmFtZT0iU2VydmljZTIiJmd0Ow0KLSAgICAmbHQ7IS0tIGRldGFpbHMgZm9yIFNlcnZpY2UyIC0tJmd0Ow0KLSAgJmx0Oy9zZXJ2aWNlJmd0Ow0KLSAgJmx0O21vZHVsZSByZWY9Ik1vZHVsZU5hbWUiIC8mZ3Q7DQotICAmbHQ7cGFyYW1ldGVyIG5hbWU9InNlcnZpY2VHcm91cFBhcmFtMSImZ3Q7dmFsdWUgMSZsdDsvcGFyYW1ldGVyJmd0Ow0KLSZsdDsvc2VydmljZUdyb3VwJmd0Ow0KLTwvcHJlPg0KLTxwPk5vdGUgOiBUaGUgbmFtZSBvZiB0aGUgc2VydmljZSBpcyBhIGNvbXB1bHNvcnkgYXR0cmlidXRlLjwvcD4NCi08YSBuYW1lPSJTdGVwM186Q3JlYXRlX3RoZV9XZWJfU2VydmljZV9BcmNoaXZlIiBpZD0NCi0iU3RlcDNfOkNyZWF0ZV90aGVfV2ViX1NlcnZpY2VfQXJjaGl2ZSI+PC9hPg0KLTxoND5TdGVwMzogQ3JlYXRlIHRoZSBXZWIgU2VydmljZSBBcmNoaXZlPC9oND4NCi08cD5BcGFjaGUgQXhpczIgdXNlcyB0aGUgIi5hYXIiIChBeGlzIEFyY2hpdmUpIGZpbGUgYXMgdGhlDQotZGVwbG95bWVudCBwYWNrYWdlIGZvciBXZWIgc2VydmljZXMuIFRoZXJlZm9yZSwgZm9yIE15U2VydmljZSB3ZQ0KLXdpbGwgdXNlICJNeVNlcnZpY2UuYWFyIiB3aXRoIHRoZSAic2VydmljZXMueG1sIiBwYWNrYWdlZCBpbiB0aGUNCi1NRVRBLUlORiBpbiB0aGUgZGlyZWN0b3J5IHN0cnVjdHVyZSBzaG93biBiZWxvdy4gUGxlYXNlIG5vdGUgdGhhdA0KLXRoZSBuYW1lIG9mIHRoZSBhcmNoaXZlIGZpbGUgd2lsbCBiZSB0aGUgc2FtZSBhcyB0aGF0IG9mIHRoZQ0KLXNlcnZpY2Ugb25seSBpZiB0aGUgc2VydmljZXMueG1sIGNvbnRhaW5zIG9ubHkgb25lIHNlcnZpY2UNCi1lbGVtZW50LjwvcD4NCi08cD48aW1nIHNyYz0iaW1hZ2VzL3VzZXJndWlkZS9TZXJ2aWNlSXRlbXMuanBnIiBuYW1lPSJHcmFwaGljMSINCi1hbGlnbj0iYm90dG9tIiB3aWR0aD0iMTc2IiBoZWlnaHQ9IjkxIiBib3JkZXI9IjAiIGlkPQ0KLSJHcmFwaGljMSIgLz48L3A+DQotPHA+VG8gY3JlYXRlIHRoZSBhcmNoaXZlIGZpbGUsIHlvdSBjYW4gY3JlYXRlIGEgLmphciBmaWxlDQotY29udGFpbmluZyBhbGwgdGhlIG5lY2Vzc2FyeSBmaWxlcyBhbmQgdGhlbiByZW5hbWUgaXQgdG8gYSAuYWFyDQotZmlsZS4gVGhpcyBhcmNoaXZlIGZpbGUgY2FuIGJlIGZvdW5kIGluIHRoZQ0KLSJBeGlzMl9IT01FL3NhbXBsZXMvdXNlcmd1aWRlIiBkaXJlY3RvcnkuIFRoaXMgZmlsZSBoYXMgdG8gYmUNCi1kZXBsb3llZCBub3cuPC9wPg0KLTxhIG5hbWU9IlN0ZXA0XzpEZXBsb3lfdGhlX1dlYl9TZXJ2aWNlIiBpZD0NCi0iU3RlcDRfOkRlcGxveV90aGVfV2ViX1NlcnZpY2UiPjwvYT4NCi08aDQ+U3RlcDQ6IERlcGxveSB0aGUgV2ViIFNlcnZpY2U8L2g0Pg0KLTxwPlRoZSBzZXJ2aWNlIGNhbiBiZSBkZXBsb3llZCBieSBkcm9wcGluZyB0aGUgIi5hYXIiIGZpbGUgaW50byB0aGUNCi0ic2VydmljZXMiIGRpcmVjdG9yeSBpbiAiL3dlYmFwcHMvYXhpczIvV0VCLUlORiIgb2YgeW91ciBzZXJ2bGV0DQotY29udGFpbmVyLiBTdGFydCB0aGUgc2VydmxldCBjb250YWluZXIgKGlmIHlvdSBoYXZlIG5vdCBhbHJlYWR5DQotc3RhcnRlZCksIGNsaWNrIHRoZSBsaW5rICJTZXJ2aWNlcyIgb24gdGhlIDxhIGhyZWY9DQotImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9heGlzMi8iIHRhcmdldD0iX2JsYW5rIj5Ib21lIFBhZ2Ugb2YgQXhpczINCi1XZWIgQXBwbGljYXRpb248L2E+IChodHRwOi8vbG9jYWxob3N0OjgwODAvYXhpczIpIGFuZCBzZWUgd2hldGhlcg0KLU15U2VydmljZSBpcyBkZXBsb3llZCBwcm9wZXJseS4gSWYgeW91IGNhbiBzZWUgdGhlIGZvbGxvd2luZw0KLW91dHB1dCwgdGhlbiB5b3UgaGF2ZSBzdWNjZXNzZnVsbHkgZGVwbG95ZWQgTXlTZXJ2aWNlIG9uIEFwYWNoZQ0KLUF4aXMyLiBDb25ncmF0dWxhdGlvbnMgISE8L3A+DQotPHAgYWxpZ249ImNlbnRlciI+PGltZyBzcmM9ImltYWdlcy91c2VyZ3VpZGUvTXlTZXJ2aWNlRGVwbG95ZWQuanBnIg0KLW5hbWU9IkdyYXBoaWMyIiBhbGlnbj0iYm90dG9tIiBib3JkZXI9IjAiIGlkPSJHcmFwaGljMiIgLz48L3A+DQotPHA+Tm90ZTogQXBhY2hlIEF4aXMyIHByb3ZpZGVzIGFuIGVhc3kgd2F5IHRvIGRlcGxveSBXZWIgc2VydmljZXMNCi11c2luZyB0aGUgIlVwbG9hZCBTZXJ2aWNlIiB0b29sIG9uIHRoZSBBeGlzMiBXZWIgQXBwbGljYXRpb24ncw0KLUFkbWluaXN0cmF0aW9uIG1vZHVsZS4gUGxlYXNlIHJlZmVyIHRvIHRoZSA8YSBocmVmPQ0KLSJ3ZWJhZG1pbmd1aWRlLmh0bWwiIHRhcmdldD0iX2JsYW5rIj5XZWIgQWRtaW5pc3RyYXRpb24gR3VpZGU8L2E+DQotZm9yIG1vcmUgaW5mb3JtYXRpb24uPC9wPg0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9hcmNoaXZlZF9uZXdzLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvYXJjaGl2ZWRfbmV3cy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzZjM4YWEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9hcmNoaXZlZF9uZXdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDg5NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJpc28tODg1OS0xIj8+DQotDQotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiINCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPg0KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4NCi08aGVhZD4NCi08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9DQotIkhUTUwgVGlkeSBmb3IgV2luZG93cyAodmVycyAxNCBKdW5lIDIwMDcpLCBzZWUgd3d3LnczLm9yZyIgLz4NCi08bWV0YSBodHRwLWVxdWl2PSJjb250ZW50LXR5cGUiIGNvbnRlbnQ9DQotInRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4NCi08dGl0bGU+QXBhY2hlIEF4aXMyIEFyY2hpdmVkIE5ld3M8L3RpdGxlPg0KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0NCi0iYW1heWEgOS4yLjEsIHNlZSBodHRwOi8vd3d3LnczLm9yZy9BbWF5YS8iIC8+DQotPGxpbmsgaHJlZj0iY3NzL2F4aXMtZG9jcy5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiDQotbWVkaWE9ImFsbCIgLz4NCi08L2hlYWQ+DQotPGJvZHkgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+DQotPGgxPkFwYWNoZSBBeGlzMiBBcmNoaXZlZCBOZXdzPC9oMT4NCi08cD5UaGlzIGRvY3VtZW50IGNvbnRhaW5zIGRldGFpbHMgb2YgZWFjaCBBeGlzMiB2ZXJzaW9uIHRoYXQgd2FzDQotcmVsZWFzZWQsIHVwIHRvIHRoZSBjdXJyZW50IHZlcnNpb24uPC9wPg0KLTxoMj5Db250ZW50PC9oMj4NCi08aDM+QXBhY2hlIEF4aXMyIFJlbGVhc2VzOjwvaDM+DQotPHVsPg0KLTxsaT48YSBocmVmPSIjMS4zIj4xM3JkIEF1Z3VzdCAyMDA3ICAtIFZlcnNpb24gMS4zPC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9IiMxLjIiPjI3dGggQXByaWwgMjAwNyAtIFZlcnNpb24gMS4yPC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9IiMxXzFfMSI+MDl0aCBKYW51YXJ5IDIwMDctIFZlcnNpb24gMS4xLjE8L2E+PC9saT4NCi08bGk+PGEgaHJlZj0iIzFfMSI+MTN0aCBOb3ZlbWJlciAyMDA2LSBWZXJzaW9uIDEuMTwvYT48L2xpPg0KLTxsaT48YSBocmVmPSIjMV8wIj4wNCBNYXkgMjAwNi0gVmVyc2lvbiAxLjA8L2E+PC9saT4NCi08bGk+PGEgaHJlZj0iIzBfOTUiPjIzIE1hcmNoIDIwMDYtIFZlcnNpb24gMC45NTwvYT48L2xpPg0KLTxsaT48YSBocmVmPSIjMF85NCI+MTEgSmFudWFyeSAyMDA2LSBWZXJzaW9uIDAuOTQ8L2E+PC9saT4NCi08bGk+PGEgaHJlZj0iIzBfOTMiPjAyIERlY2VtYmVyIDIwMDUgLSBWZXJzaW9uIDAuOTM8L2E+PC9saT4NCi08bGk+PGEgaHJlZj0iIzBfOTIiPjI2IFNlcHRlbWJlciAyMDA1IC0gVmVyc2lvbiAwLjkyPC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9IiMwXzkxIj4xMiBBdWd1c3QgMjAwNSAtIFZlcnNpb24gMC45MTwvYT48L2xpPg0KLTxsaT48YSBocmVmPSIjMF85MCI+MDIgSnVseSAyMDA1IC0gVmVyc2lvbiAwLjk8L2E+PC9saT4NCi08bGk+PGEgaHJlZj0iI00yIj4wNyBKdW5lIDIwMDUgLSBNaWxlc3RvbmUgMjwvYT48L2xpPg0KLTxsaT48YSBocmVmPSIjTTEiPjI0IEZlYnJ1YXJ5IDIwMDUgLSBNaWxlc3RvbmUgMTwvYT48L2xpPg0KLTwvdWw+DQotDQotDQotPGEgaWQ9IjEuMiIgbmFtZT0iMS4yIj48L2E+DQotPGgyPjEzcmQgQXVndXN0IDIwMDcgLSBBcGFjaGUgQXhpczIvSmF2YSBWZXJzaW9uIDEuMyBSZWxlYXNlZCE8L2gyPg0KLTxwPls8YSBocmVmPQ0KLSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi9kb3dubG9hZC8xXzMvZG93bmxvYWQuY2dpIj5Eb3dubG9hZA0KLTEuMzwvYT5dPC9wPg0KLTxwPkFwYWNoZSBBeGlzMiBWZXJzaW9uIDEuMyBjb21lcyB3aXRoIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50cyBhbmQNCi1hIG51bWJlciBidWcgZml4ZXMgb3ZlciB0aGUgMS4yIHJlbGVhc2UuIENoZWNrIG91dCB0aGUgY29tcGxldGUgbGlzdCBvZg0KLWZlYXR1cmVzIGJlbG93LjwvcD4NCi08aDM+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+SmF4QlJJIChFeHBlcmltZW50YWwpPC9saT4NCi08L3VsPg0KLTxoMj48YSBuYW1lPSJUb29sc19pbmNsdWRlZF9pbiB0aGlzX1JlbGVhc2UiPlRvb2xzIEluY2x1ZGVkIGluIFRoaXMNCi1SZWxlYXNlPC9hPjwvaDI+DQotPHA+WzxhIGhyZWY9Imh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL3Rvb2xzL2luZGV4Lmh0bWwiIHRhcmdldD0NCi0iX2JsYW5rIj5Eb3dubG9hZCBUb29sIFBsdWctaW5zPC9hPl08L3A+DQotPG9sIHR5cGU9IjEiPg0KLTxsaT5BeGlzMiBXZWIgQXBwbGljYXRpb24gKFdlYiBBcHApPC9saT4NCi08bGk+V1NETDJXUy0gPGEgaHJlZj0idG9vbHMvMV8yL2VjbGlwc2Uvd3NkbDJqYXZhLXBsdWdpbi5odG1sIg0KLXRhcmdldD0iX2JsYW5rIj5lY2xpcHNlIHBsdWctaW48L2E+PGE+LzwvYT4gPGEgaHJlZj0NCi0idG9vbHMvMV8yL0NvZGVnZW5Ub29sUmVmZXJlbmNlLmh0bWwiIHRhcmdldD0iX2JsYW5rIj5Db21tYW5kIGxpbmUNCi12ZXJzaW9uPC9hPjxhPi88L2E+PGEgaHJlZj0NCi0idG9vbHMvMV8yL2lkZWEvSWRlYV9wbHVnLWluX3VzZXJndWlkZS5odG1sI1dTREwySmF2YV9Db2RlX0dlbmVyYXRpb24iDQotdGFyZ2V0PSJfYmxhbmsiPkludGVsbGlKIElERUEgcGx1Zy1pbjwvYT48YT4vPC9hPjxhIGhyZWY9DQotInRvb2xzLzFfMi9tYXZlbi1wbHVnaW5zL21hdmVuLXdzZGwyY29kZS1wbHVnaW4uaHRtbCIgdGFyZ2V0PQ0KLSJfYmxhbmsiPk1hdmVuMiBXU0RMMkNvZGUgUGx1Zy1pbjwvYT48L2xpPg0KLTxsaT5TZXJ2aWNlIEFyY2hpdmUgV2l6YXJkLSA8YSBocmVmPQ0KLSJ0b29scy8xXzIvZWNsaXBzZS9zZXJ2aWNlYXJjaGl2ZXItcGx1Z2luLmh0bWwiIHRhcmdldD0NCi0iX2JsYW5rIj5lY2xpcHNlIHBsdWctaW48L2E+LyA8YSBocmVmPQ0KLSJ0b29scy8xXzIvaWRlYS9JZGVhX3BsdWctaW5fdXNlcmd1aWRlLmh0bWwjQ3JlYXRlX1NlcnZpY2VfQXJjaGl2ZSINCi10YXJnZXQ9Il9ibGFuayI+SW50ZWxsaUogSURFQSBwbHVnLWluPC9hPi8gPGEgaHJlZj0NCi0idG9vbHMvMV8yL21hdmVuLXBsdWdpbnMvbWF2ZW4tYWFyLXBsdWdpbi5odG1sIiB0YXJnZXQ9DQotIl9ibGFuayI+TWF2ZW4yIEFBUiBQbHVnLWluPC9hPjwvbGk+DQotPGxpPkphdmEyV1NETC0gPGEgaHJlZj0NCi0idG9vbHMvMV8yL21hdmVuLXBsdWdpbnMvbWF2ZW4tamF2YTJ3c2RsLXBsdWdpbi5odG1sIiB0YXJnZXQ9DQotIl9ibGFuayI+TWF2ZW4yIEphdmEyV1NETCBQbHVnLWluPC9hPjwvbGk+DQotPC9vbD4NCi08aDI+RXh0ZW5zaW9uIE1vZHVsZXM8L2gyPg0KLTx1bD4NCi08bGk+QXBhY2hlIFJhbXBhcnQ6IFN1cHBvcnRpbmcgV1MtU2VjdXJpdHkgKGFuZCBzb29uDQotV1MtUG9saWN5KTwvbGk+DQotPGxpPkFwYWNoZSBTYW5kZXNoYTI6IFN1cHBvcnRpbmcgV1MtUmVsaWFibGUgTWVzc2FnaW5nPC9saT4NCi08L3VsPg0KLShBcGFjaGUgQXhpczIgY29tZXMgYnVpbHQgaW4gd2l0aCBhIG1vZHVsZSB0aGF0IHN1cHBvcnRzDQotV1MtQWRkcmVzc2luZy4pDQotPGgyPktub3duIElzc3VlcyBhbmQgTGltaXRhdGlvbnM8L2gyPg0KLQ0KLTxhIGlkPSIxLjIiIG5hbWU9IjEuMiI+PC9hPg0KLTxoMj4yN3RoIEFwcmlsIDIwMDcgLSBBcGFjaGUgQXhpczIvSmF2YSBWZXJzaW9uIDEuMiBSZWxlYXNlZCE8L2gyPg0KLTxwPls8YSBocmVmPQ0KLSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi9kb3dubG9hZC8xXzIvZG93bmxvYWQuY2dpIj5Eb3dubG9hZA0KLTEuMjwvYT5dPC9wPg0KLTxoMz5Qcm9ncmFtbWluZyBNb2RlbDwvaDM+DQotPHVsPg0KLTxsaT5JbXByb3ZlZCwgWE1MLWNlbnRyaWMgY2xpZW50IEFQSSBpbmNsdWRpbmcgZnVsbCBXU0RMIGFuZCBwb2xpY3kNCi1zdXBwb3J0PC9saT4NCi08bGk+U3VwcG9ydCBmb3IgUE9KTyBhbmQgU3ByaW5nIHNlcnZpY2VzIGFuZCBjbGllbnRzPC9saT4NCi08bGk+U3VwcG9ydCBmb3IgYW55IG1lc3NhZ2UgZXhjaGFuZ2UgcGF0dGVybjwvbGk+DQotPGxpPlN5bmNocm9ub3VzIGFuZCBhc3luY2hyb25vdXMgY2FsbHM8L2xpPg0KLTxsaT5BcmNoaXZlZCBzZXJ2aWNlIGRlcGxveW1lbnQgbW9kZWwgc3VwcG9ydGluZyBmdWxsIHNlcnZpY2UNCi1lbmNhcHN1bGF0aW9uIHdpdGggdmVyc2lvbmluZyBzdXBwb3J0PC9saT4NCi08bGk+QXJjaGl2ZWQgbW9kdWxlIGRlcGxveW1lbnQgbW9kZWwgc3VwcG9ydGluZyBjb250cm9sbGVkDQotZXh0ZW5zaWJpbGl0eSB3aXRoIHZlcnNpb25pbmcgc3VwcG9ydDwvbGk+DQotPGxpPjxhIGhyZWY9IiNIb3RfRGVwbG95bWVudCI+SG90IGRlcGxveW1lbnQ8L2E+PC9saT4NCi08bGk+V1MtUG9saWN5IGRyaXZlbiBjb2RlIGdlbmVyYXRpb24gZXh0ZW5zaW9uczwvbGk+DQotPGxpPkZsZXhpYmxlIHNlcnZpY2UgbGlmZSBjeWNsZSBtb2RlbDwvbGk+DQotPGxpPkF1dG9tYXRpYyBzdXBwb3J0IGZvciBQT1ggKFJFU1QpIHN0eWxlIGludm9jYXRpb24gb2YNCi1zZXJ2aWNlczwvbGk+DQotPGxpPlN1cHBvcnQgZm9yIHF1ZXJ5aW5nIGEgc2VydmljZSdzIFdTREwgKHVzaW5nID93c2RsKSwgc2NoZW1hDQotKHVzaW5nID94c2QpIGFuZCBwb2xpY2llcyAodXNpbmcgP3BvbGljeSk8L2xpPg0KLTxsaT5XU0RMIDIuMDwvbGk+DQotPGxpPlBPSk8gYW5ub3RhdGlvbiAoPGEgaHJlZj0NCi0iaHR0cDovL2pjcC5vcmcvZW4vanNyL2RldGFpbD9pZD0xODEiPkpTUiAxODE8L2E+KTwvbGk+DQotPGxpPkpBWC1XUyBpbnRyZWdyYXRpb248L2xpPg0KLTxsaT5DdXN0b20gRGVwbG95ZXJzPC9saT4NCi08bGk+QmluYXJ5IHNlcmlhbGl6YXRpb24gKEZhc3QgSW5mb3NldCk8L2xpPg0KLTxsaT5KU09OIHN1cHBvcnQ8L2xpPg0KLTxsaT5FSkIgUHJvdmlkZXIgc3VwcG9ydDwvbGk+DQotPC91bD4NCi08aDM+U3VwcG9ydGVkIFNwZWNpZmljYXRpb25zPC9oMz4NCi08dWw+DQotPGxpPlNPQVAgMS4xIGFuZCAxLjI8L2xpPg0KLTxsaT5NZXNzYWdlIFRyYW5zbWlzc2lvbiBPcHRpbWl6YXRpb24gTWVjaGFuaXNtIChNVE9NKSwgWE1MDQotT3B0aW1pemVkIFBhY2thZ2luZyAoWE9QKSBhbmQgU09BUCB3aXRoIEF0dGFjaG1lbnRzPC9saT4NCi08bGk+V1NETCAxLjEsIGluY2x1ZGluZyBib3RoIFNPQVAgYW5kIEhUVFAgYmluZGluZ3M8L2xpPg0KLTxsaT5XUy1BZGRyZXNzaW5nIChzdWJtaXNzaW9uIGFuZCBmaW5hbCk8L2xpPg0KLTxsaT5XUy1Qb2xpY3k8L2xpPg0KLTxsaT5TQUFKIDEuMTwvbGk+DQotPC91bD4NCi08aDM+VHJhbnNwb3J0czwvaDM+DQotPHVsPg0KLTxsaT5IVFRQPC9saT4NCi08bGk+U01UUDwvbGk+DQotPGxpPkpNUzwvbGk+DQotPGxpPlRDUDwvbGk+DQotPC91bD4NCi08aDM+U3VwcG9ydGVkIERhdGEgQmluZGluZ3M8L2gzPg0KLTx1bD4NCi08bGk+QXhpcyBEYXRhIEJpbmRpbmcgKEFEQik8L2xpPg0KLTxsaT5YTUxCZWFuczwvbGk+DQotPGxpPkppYlg8L2xpPg0KLTxsaT5KYXhNZSAoRXhwZXJpbWVudGFsKTwvbGk+DQotPGxpPkpheEJSSSAoRXhwZXJpbWVudGFsKTwvbGk+DQotPC91bD4NCi08aDI+VG9vbHMgSW5jbHVkZWQgaW4gdGhpcyBSZWxlYXNlPC9oMj4NCi08cD5bPGEgaHJlZj0iaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvdG9vbHMvaW5kZXguaHRtbCI+RG93bmxvYWQNCi1Ub29sIFBsdWctaW5zPC9hPl08L3A+DQotPG9sIHR5cGU9IjEiPg0KLTxsaT5BeGlzMiBXZWIgQXBwbGljYXRpb24gKFdlYiBBcHApPC9saT4NCi08bGk+V1NETDJXUy0gPGEgaHJlZj0NCi0idG9vbHMvMV8yL2VjbGlwc2Uvd3NkbDJqYXZhLXBsdWdpbi5odG1sIj5lY2xpcHNlDQotcGx1Zy1pbjwvYT48YT4vPC9hPiA8YSBocmVmPQ0KLSJ0b29scy8xXzIvQ29kZWdlblRvb2xSZWZlcmVuY2UuaHRtbCI+Q29tbWFuZCBsaW5lDQotdmVyc2lvbjwvYT48YT4vPC9hPjxhIGhyZWY9DQotInRvb2xzLzFfMi9pZGVhL0lkZWFfcGx1Zy1pbl91c2VyZ3VpZGUuaHRtbCNXU0RMMkphdmFfQ29kZV9HZW5lcmF0aW9uIj5JbnRlbGxpSg0KLUlERUEgcGx1Zy1pbjwvYT48YT4vPC9hPjxhIGhyZWY9DQotInRvb2xzLzFfMi9tYXZlbi1wbHVnaW5zL21hdmVuLXdzZGwyY29kZS1wbHVnaW4uaHRtbCI+TWF2ZW4yDQotV1NETDJDb2RlIFBsdWctaW48L2E+PC9saT4NCi08bGk+U2VydmljZSBBcmNoaXZlIFdpemFyZC0gPGEgaHJlZj0NCi0idG9vbHMvMV8yL2VjbGlwc2Uvc2VydmljZWFyY2hpdmVyLXBsdWdpbi5odG1sIj5lY2xpcHNlDQotcGx1Zy1pbjwvYT4vIDxhIGhyZWY9DQotInRvb2xzLzFfMi9pZGVhL0lkZWFfcGx1Zy1pbl91c2VyZ3VpZGUuaHRtbCNDcmVhdGVfU2VydmljZV9BcmNoaXZlIj4NCi1JbnRlbGxpSiBJREVBIHBsdWctaW48L2E+LyA8YSBocmVmPQ0KLSJ0b29scy8xXzIvbWF2ZW4tcGx1Z2lucy9tYXZlbi1hYXItcGx1Z2luLmh0bWwiPk1hdmVuMiBBQVINCi1QbHVnLWluPC9hPjwvbGk+DQotPGxpPkphdmEyV1NETC0gPGEgaHJlZj0NCi0idG9vbHMvMV8yL21hdmVuLXBsdWdpbnMvbWF2ZW4tamF2YTJ3c2RsLXBsdWdpbi5odG1sIj5NYXZlbjINCi1KYXZhMldTREwgUGx1Zy1pbjwvYT48L2xpPg0KLTwvb2w+DQotPGgyPkV4dGVuc2lvbiBNb2R1bGVzPC9oMj4NCi08dWw+DQotPGxpPkFwYWNoZSBSYW1wYXJ0OiBTdXBwb3J0aW5nIFdTLVNlY3VyaXR5IChhbmQgc29vbg0KLVdTLVBvbGljeSk8L2xpPg0KLTxsaT5BcGFjaGUgU2FuZGVzaGEyOiBTdXBwb3J0aW5nIFdTLVJlbGlhYmxlIE1lc3NhZ2luZzwvbGk+DQotPC91bD4NCi0oQXBhY2hlIEF4aXMyIGNvbWVzIGJ1aWx0LWluIHdpdGggYSBtb2R1bGUgdGhhdCBzdXBwb3J0cw0KLVdTLUFkZHJlc3NpbmcuKQ0KLTxoMj5Lbm93biBJc3N1ZXMgYW5kIExpbWl0YXRpb25zPC9oMj4NCi08dWw+DQotPGxpPlhtbC1iZWFucyBkYXRhYmluZGluZyBkb2VzIG5vdCBzdXBwb3J0IHJlc3BvbnNlIHVud3JhcHBpbmc8L2xpPg0KLTxsaT5BREIgZGF0YWJpbmRpbmcgZG9lcyBub3Qgc3VwcG9ydCBtaW5PY2N1cnMgYW5kIG1heE9jY3Vycw0KLWF0dHJpYnV0ZXMgaW4gc2VxdWVuY2UgYW5kIGNob2ljZSBlbGVtZW50cyAoaS5lLiwNCi08Y29kZT4mbHQ7c2VxdWVuY2UgbWluT2NjdXJzPSIwIg0KLW1heE9jY3Vycz0idW5ib3VuZGVkIiZndDsmbHQ7L3NlcXVlbmNlJmd0OzwvY29kZT4pPC9saT4NCi08bGk+VW5hYmxlIHRvIHByb2R1Y2Ugb3JpZ2luYWwgV1NETCBpbiB0aGUgY2FzZSBvZiBXU0RMIDIuMCwNCi10aGVyZWZvcmUgdGhlIEF4aXNTZXJ2aWNlIGlzIHNlcmlhbGl6ZWQgdG8gcHJvZHVjZSA/d3NkbDIuPC9saT4NCi08L3VsPg0KLTxhIGlkPSIxXzFfMSIgbmFtZT0iMV8xXzEiPjwvYT4NCi08aDI+MDl0aCBKYW51YXJ5IDIwMDctIEFwYWNoZSBBeGlzMi9KYXZhIFZlcnNpb24gMS4xLjENCi1SZWxlYXNlZCE8L2gyPg0KLTxwPls8YSBocmVmPQ0KLSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi9kb3dubG9hZC8xXzFfMS9kb3dubG9hZC5jZ2kiPkRvd25sb2FkDQotMS4xLjE8L2E+XTwvcD4NCi08cD5BcGFjaGUgQXhpczIgVmVyc2lvbiAxLjEuMSBjb21lcyB3aXRoIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50cw0KLWFuZCBidWcgZml4ZXMgb3ZlciB0aGUgMS4xIHJlbGVhc2UuIENoZWNrIG91dCB0aGUgY29tcGxldGUgbGlzdCBvZg0KLWZlYXR1cmVzIGJlbG93LjwvcD4NCi08aDM+UHJvZ3JhbW1pbmcgTW9kZWw8L2gzPg0KLTx1bD4NCi08bGk+SW1wcm92ZWQsIFhNTC1jZW50cmljIGNsaWVudCBBUEkgaW5jbHVkaW5nIGZ1bGwgV1NETCBhbmQgcG9saWN5DQotc3VwcG9ydDwvbGk+DQotPGxpPlN1cHBvcnQgZm9yIGFueSBtZXNzYWdlIGV4Y2hhbmdlIHBhdHRlcm48L2xpPg0KLTxsaT5TeW5jaHJvbm91cyBhbmQgYXN5bmNocm9ub3VzIGNhbGxzPC9saT4NCi08bGk+QXJjaGl2ZWQgc2VydmljZSBkZXBsb3ltZW50IG1vZGVsPC9saT4NCi08bGk+QXJjaGl2ZWQgbW9kdWxlIGRlcGxveW1lbnQgbW9kZWwgc3VwcG9ydGluZyBjb250cm9sbGVkDQotZXh0ZW5zaWJpbGl0eSB3aXRoIHZlcnNpb25pbmcgc3VwcG9ydDwvbGk+DQotPGxpPjxhIGhyZWY9IiNIb3RfRGVwbG95bWVudCI+SG90IGRlcGxveW1lbnQ8L2E+PC9saT4NCi08bGk+V1MtUG9saWN5IGRyaXZlbiBjb2RlIGdlbmVyYXRpb24gZXh0ZW5zaW9uczwvbGk+DQotPGxpPkZsZXhpYmxlIHNlcnZpY2UgbGlmZSBjeWNsZSBtb2RlbDwvbGk+DQotPGxpPlN1cHBvcnQgZm9yIHF1ZXJ5aW5nIGEgc2VydmljZSdzIFdTREwgKHVzaW5nID93c2RsKSwgc2NoZW1hDQotKHVzaW5nID94c2QpIGFuZCBwb2xpY2llcyAodXNpbmcgP3BvbGljeSk8L2xpPg0KLTwvdWw+DQotPGgzPlN1cHBvcnRlZCBTcGVjaWZpY2F0aW9uczwvaDM+DQotPHVsPg0KLTxsaT5TT0FQIDEuMSBhbmQgMS4yPC9saT4NCi08bGk+TWVzc2FnZSBUcmFuc21pc3Npb24gT3B0aW1pemF0aW9uIE1lY2hhbmlzbSAoTVRPTSksIFhNTA0KLU9wdGltaXplZCBQYWNrYWdpbmcgKFhPUCkgYW5kIFNPQVAgd2l0aCBBdHRhY2htZW50czwvbGk+DQotPGxpPldTREwgMS4xLCBpbmNsdWRpbmcgYm90aCBTT0FQIGFuZCBIVFRQIGJpbmRpbmdzPC9saT4NCi08bGk+V1MtQWRkcmVzc2luZyAoc3VibWlzc2lvbiBhbmQgZmluYWwpPC9saT4NCi08bGk+V1MtUG9saWN5PC9saT4NCi08bGk+U0FBSiAxLjE8L2xpPg0KLTwvdWw+DQotPGgzPlRyYW5zcG9ydHM8L2gzPg0KLTx1bD4NCi08bGk+SFRUUDwvbGk+DQotPGxpPlNNVFA8L2xpPg0KLTxsaT5KTVM8L2xpPg0KLTxsaT5UQ1A8L2xpPg0KLTwvdWw+DQotPGgzPlN1cHBvcnRlZCBEYXRhIEJpbmRpbmdzPC9oMz4NCi08dWw+DQotPGxpPkF4aXMgRGF0YSBCaW5kaW5nIChBREIpPC9saT4NCi08bGk+WE1MQmVhbnM8L2xpPg0KLTxsaT5KaWJYPC9saT4NCi08bGk+SmF4TWU8L2xpPg0KLTwvdWw+DQotPGgyPlRvb2xzIEluY2x1ZGVkIGluIFRoaXMgUmVsZWFzZTwvaDI+DQotPHA+WzxhIGhyZWY9Imh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL3Rvb2xzL2luZGV4Lmh0bWwiPkRvd25sb2FkDQotVG9vbCBQbHVnLWluczwvYT5dPC9wPg0KLTxvbCB0eXBlPSIxIj4NCi08bGk+QXhpczIgV2ViIEFwcGxpY2F0aW9uIChXZWIgQXBwKTwvbGk+DQotPGxpPldTREwyV1MtIDxhIGhyZWY9DQotInRvb2xzL0BheGlzMl92ZXJzaW9uX2RpckAvZWNsaXBzZS93c2RsMmphdmEtcGx1Z2luLmh0bWwiPmVjbGlwc2UNCi1wbHVnLWluPC9hPjxhPi88L2E+IDxhIGhyZWY9DQotInRvb2xzL0BheGlzMl92ZXJzaW9uX2RpckAvQ29kZWdlblRvb2xSZWZlcmVuY2UuaHRtbCI+Q29tbWFuZCBsaW5lDQotdmVyc2lvbjwvYT48YT4vPC9hPjxhIGhyZWY9DQotInRvb2xzL0BheGlzMl92ZXJzaW9uX2RpckAvaWRlYS9JZGVhX3BsdWctaW5fdXNlcmd1aWRlLmh0bWwjV1NETDJKYXZhX0NvZGVfR2VuZXJhdGlvbiI+SW50ZWxsaUoNCi1JREVBIHBsdWctaW48L2E+PGE+LzwvYT48YSBocmVmPQ0KLSJ0b29scy9AYXhpczJfdmVyc2lvbl9kaXJAL21hdmVuLXBsdWdpbnMvbWF2ZW4td3NkbDJjb2RlLXBsdWdpbi5odG1sIj5NYXZlbjINCi1XU0RMMkNvZGUgUGx1Zy1pbjwvYT48L2xpPg0KLTxsaT5TZXJ2aWNlIEFyY2hpdmUgV2l6YXJkLSA8YSBocmVmPQ0KLSJ0b29scy9AYXhpczJfdmVyc2lvbl9kaXJAL2VjbGlwc2Uvc2VydmljZWFyY2hpdmVyLXBsdWdpbi5odG1sIj5lY2xpcHNlDQotcGx1Zy1pbjwvYT4vIDxhIGhyZWY9DQotInRvb2xzL0BheGlzMl92ZXJzaW9uX2RpckAvaWRlYS9JZGVhX3BsdWctaW5fdXNlcmd1aWRlLmh0bWwjQ3JlYXRlX1NlcnZpY2VfQXJjaGl2ZSI+DQotSW50ZWxsaUogSURFQSBwbHVnLWluPC9hPi8gPGEgaHJlZj0NCi0idG9vbHMvQGF4aXMyX3ZlcnNpb25fZGlyQC9tYXZlbi1wbHVnaW5zL21hdmVuLWFhci1wbHVnaW4uaHRtbCI+TWF2ZW4yDQotQUFSIFBsdWctaW48L2E+PC9saT4NCi08bGk+SmF2YTJXU0RMLSA8YSBocmVmPQ0KLSJ0b29scy9AYXhpczJfdmVyc2lvbl9kaXJAL21hdmVuLXBsdWdpbnMvbWF2ZW4tamF2YTJ3c2RsLXBsdWdpbi5odG1sIj4NCi1NYXZlbjIgSmF2YTJXU0RMIFBsdWctaW48L2E+PC9saT4NCi08L29sPg0KLTxoMj5FeHRlbnNpb24gTW9kdWxlczwvaDI+DQotPHVsPg0KLTxsaT5BcGFjaGUgUmFtcGFydDogU3VwcG9ydGluZyBXUy1TZWN1cml0eSAoYW5kIHNvb24NCi1XUy1Qb2xpY3kpPC9saT4NCi08bGk+QXBhY2hlIFNhbmRlc2hhMjogU3VwcG9ydGluZyBXUy1SZWxpYWJsZSBNZXNzYWdpbmc8L2xpPg0KLTwvdWw+DQotKEFwYWNoZSBBeGlzMiBjb21lcyBidWlsdCBpbiB3aXRoIGEgbW9kdWxlIHRoYXQgc3VwcG9ydHMNCi1XUy1BZGRyZXNzaW5nLikNCi08aDI+S25vd24gSXNzdWVzIGFuZCBMaW1pdGF0aW9uczwvaDI+DQotPHVsPg0KLTxsaT5BREIgZG9lcyBub3Qgc3VwcG9ydCB1bndyYXBwaW5nIG9mIHJlc3BvbnNlIG1lc3NhZ2VzKGNvbWluZyBpbg0KLTEuMik8L2xpPg0KLTxsaT5KU1IgMTgxLzE4MyBBbm5vdGF0aW9uIHN1cHBvcnQgKGNvbWluZyBpbiAxLjIpPC9saT4NCi08bGk+SmF4TWUgYW5kIEpBWEJSSSBkYXRhIGJpbmRpbmcgc3VwcG9ydCBpcyBleHBlcmltZW50YWw8L2xpPg0KLTxsaT5TaW1wbGUgQXhpcyBTZXJ2ZXIgZG9lcyBub3Qgc3VwcG9ydCBQT1gvUkVTVDwvbGk+DQotPGxpPlJQQyBNZXNzYWdlIFJlY2VpdmVyIGRvZXMgbm90IHZhbGlkYXRlIGEgcmVxdWVzdCBhZ2FpbnN0IHRoZQ0KLXNjaGVtYSAoQVhJUzItMTk0Myk8L2xpPg0KLTxsaT5BeGlzMiBJZGVhIHBsdWdpbiBzaG93cyByYW5kb20gYmVoYXZpb3Igd2hlbiBYTUxCZWFucyBpcw0KLXVzZWQ8L2xpPg0KLTwvdWw+DQotPGEgaWQ9IjFfMSIgbmFtZT0iMV8xIj48L2E+DQotPGgyPjEzdGggTm92ZW1iZXIgMjAwNiAtIEFwYWNoZSBBeGlzMi9KYXZhIFZlcnNpb24gMS4xDQotUmVsZWFzZWQhPC9oMj4NCi08cD5bPGEgaHJlZj0NCi0iaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvZG93bmxvYWQvMV8xL2Rvd25sb2FkLmNnaSI+RG93bmxvYWQNCi0xLjE8L2E+XTwvcD4NCi08cD5BcGFjaGUgQXhpczIgVmVyc2lvbiAxLjEgY29tZXMgd2l0aCBiZXR0ZXIgQXhpczIgRGF0YWJpbmRpbmcNCi1GcmFtZXdvcmsgKEFEQikgc3VwcG9ydCwgPGEgaHJlZj0NCi0iaHR0cDovL3d3dy53My5vcmcvVFIvU09BUC1hdHRhY2htZW50cyI+YXR0YWNobWVudHMgQVBJPC9hPiwNCi1TcHJpbmcsIGFuZCBjb21wbGV0ZSBzdXBwb3J0IGZvciBTT0FQIHdpdGggQXR0YWNobWVudHMgKFN3QSkuIENoZWNrDQotb3V0IHRoZSBjb21wbGV0ZSBsaXN0IG9mIGZlYXR1cmVzIGJlbG93LjwvcD4NCi08aDM+UHJvZ3JhbW1pbmcgTW9kZWw8L2gzPg0KLTx1bD4NCi08bGk+SW1wcm92ZWQsIFhNTC1jZW50cmljIGNsaWVudCBBUEkgaW5jbHVkaW5nIGZ1bGwgV1NETCBhbmQgcG9saWN5DQotc3VwcG9ydDwvbGk+DQotPGxpPlN1cHBvcnQgZm9yIGFueSBtZXNzYWdlIGV4Y2hhbmdlIHBhdHRlcm48L2xpPg0KLTxsaT5TeW5jaHJvbm91cyBhbmQgYXN5bmNocm9ub3VzIGNhbGxzPC9saT4NCi08bGk+QXJjaGl2ZWQgc2VydmljZSBkZXBsb3ltZW50IG1vZGVsPC9saT4NCi08bGk+QXJjaGl2ZWQgbW9kdWxlIGRlcGxveW1lbnQgbW9kZWwsIHN1cHBvcnRpbmcgY29udHJvbGxlZA0KLWV4dGVuc2liaWxpdHkgd2l0aCB2ZXJzaW9uaW5nIHN1cHBvcnQ8L2xpPg0KLTxsaT48YSBocmVmPSIjSG90X0RlcGxveW1lbnQiPkhvdCBkZXBsb3ltZW50PC9hPjwvbGk+DQotPGxpPldTLVBvbGljeSBkcml2ZW4gY29kZSBnZW5lcmF0aW9uIGV4dGVuc2lvbnM8L2xpPg0KLTxsaT5GbGV4aWJsZSBzZXJ2aWNlIGxpZmUgY3ljbGUgbW9kZWw8L2xpPg0KLTxsaT5TdXBwb3J0IGZvciB0aGUgcXVlcnlpbmcgc2VydmljZSdzIFdTREwgKHVzaW5nID93c2RsKSwgc2NoZW1hDQotKHVzaW5nID94c2QpLCBhbmQgcG9saWNpZXMgKHVzaW5nID9wb2xpY3kpPC9saT4NCi08L3VsPg0KLTxoMz5TdXBwb3J0ZWQgU3BlY2lmaWNhdGlvbnM8L2gzPg0KLTx1bD4NCi08bGk+U09BUCAxLjEgYW5kIDEuMjwvbGk+DQotPGxpPk1lc3NhZ2UgVHJhbnNtaXNzaW9uIE9wdGltaXphdGlvbiBNZWNoYW5pc20gKE1UT00pLCBYTUwNCi1PcHRpbWl6ZWQgUGFja2FnaW5nIChYT1ApIGFuZCBTT0FQIHdpdGggQXR0YWNobWVudHM8L2xpPg0KLTxsaT5XU0RMIDEuMSwgaW5jbHVkaW5nIGJvdGggU09BUCBhbmQgSFRUUCBiaW5kaW5nczwvbGk+DQotPGxpPldTLUFkZHJlc3NpbmcgKHN1Ym1pc3Npb24gYW5kIGZpbmFsKTwvbGk+DQotPGxpPldTLVBvbGljeTwvbGk+DQotPGxpPlNBQUogMS4xPC9saT4NCi08L3VsPg0KLTxoMz5UcmFuc3BvcnRzPC9oMz4NCi08dWw+DQotPGxpPkhUVFA8L2xpPg0KLTxsaT5TTVRQPC9saT4NCi08bGk+Sk1TPC9saT4NCi08bGk+VENQPC9saT4NCi08L3VsPg0KLTxoMz5TdXBwb3J0ZWQgRGF0YSBCaW5kaW5nczwvaDM+DQotPHVsPg0KLTxsaT5BeGlzIERhdGEgQmluZGluZyAoQURCKTwvbGk+DQotPGxpPlhNTEJlYW5zPC9saT4NCi08bGk+SmliWDwvbGk+DQotPGxpPkpheE1lPC9saT4NCi08L3VsPg0KLTxoMj5Ub29scyBJbmNsdWRlZCBpbiBUaGlzIFJlbGVhc2U8L2gyPg0KLTxwPls8YSBocmVmPSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi90b29scy9pbmRleC5odG1sIj5Eb3dubG9hZA0KLVRvb2wgUGx1Zy1pbnM8L2E+XTwvcD4NCi08b2wgdHlwZT0iMSI+DQotPGxpPkF4aXMyIFdlYiBBcHBsaWNhdGlvbiAoV2ViIEFwcCk8L2xpPg0KLTxsaT5XU0RMMldTLSA8YSBocmVmPQ0KLSJ0b29scy8xXzEvZWNsaXBzZS93c2RsMmphdmEtcGx1Z2luLmh0bWwiPmVjbGlwc2UNCi1wbHVnLWluPC9hPjxhPi88L2E+IDxhIGhyZWY9DQotInRvb2xzLzFfMS9Db2RlZ2VuVG9vbFJlZmVyZW5jZS5odG1sIj5Db21tYW5kIGxpbmUNCi12ZXJzaW9uPC9hPjxhPi88L2E+PGEgaHJlZj0NCi0idG9vbHMvMV8xL2lkZWEvSWRlYV9wbHVnLWluX3VzZXJndWlkZS5odG1sI1dTREwySmF2YV9Db2RlX0dlbmVyYXRpb24iPkludGVsbGlKDQotSURFQSBwbHVnLWluPC9hPjxhPi88L2E+PGEgaHJlZj0NCi0idG9vbHMvMV8xL21hdmVuLXBsdWdpbnMvbWF2ZW4td3NkbDJjb2RlLXBsdWdpbi5odG1sIj5NYXZlbjINCi1XU0RMMkNvZGUgUGx1Zy1pbjwvYT48L2xpPg0KLTxsaT5TZXJ2aWNlIEFyY2hpdmUgV2l6YXJkLSA8YSBocmVmPQ0KLSJ0b29scy8xXzEvZWNsaXBzZS9zZXJ2aWNlYXJjaGl2ZXItcGx1Z2luLmh0bWwiPmVjbGlwc2UNCi1wbHVnLWluPC9hPi8gPGEgaHJlZj0NCi0idG9vbHMvMV8xL2lkZWEvSWRlYV9wbHVnLWluX3VzZXJndWlkZS5odG1sI0NyZWF0ZV9TZXJ2aWNlX0FyY2hpdmUiPg0KLUludGVsbGlKIElERUEgcGx1Zy1pbjwvYT4vIDxhIGhyZWY9DQotInRvb2xzLzFfMS9tYXZlbi1wbHVnaW5zL21hdmVuLWFhci1wbHVnaW4uaHRtbCI+TWF2ZW4yIEFBUg0KLVBsdWctaW48L2E+PC9saT4NCi08bGk+SmF2YTJXU0RMLSA8YSBocmVmPQ0KLSJ0b29scy8xXzEvbWF2ZW4tcGx1Z2lucy9tYXZlbi1qYXZhMndzZGwtcGx1Z2luLmh0bWwiPk1hdmVuMg0KLUphdmEyV1NETCBQbHVnLWluPC9hPjwvbGk+DQotPC9vbD4NCi08aDI+RXh0ZW5zaW9uIE1vZHVsZXM8L2gyPg0KLTx1bD4NCi08bGk+QXBhY2hlIFJhbXBhcnQ6IFN1cHBvcnRpbmcgV1MtU2VjdXJpdHkgKGFuZCBzb29uDQotV1MtUG9saWN5KTwvbGk+DQotPGxpPkFwYWNoZSBTYW5kZXNoYTI6IFN1cHBvcnRpbmcgV1MtUmVsaWFibGUgTWVzc2FnaW5nPC9saT4NCi08L3VsPg0KLShBcGFjaGUgQXhpczIgY29tZXMgYnVpbHQgaW4gd2l0aCBhIG1vZHVsZSB0aGF0IHN1cHBvcnRzDQotV1MtQWRkcmVzc2luZy4pDQotPGgyPktub3duIElzc3VlcyBhbmQgTGltaXRhdGlvbnM8L2gyPg0KLTx1bD4NCi08bGk+SmF4TWUgYW5kIEpBWEJSSSBkYXRhIGJpbmRpbmcgc3VwcG9ydCBpcyBleHBlcmltZW50YWw8L2xpPg0KLTxsaT5BWElTMi01OTU6IEhvdCByZS1kZXBsb3ltZW50IGluIEFwYWNoZSBUb21jYXQgaGFzIHByb2JsZW1zPC9saT4NCi08bGk+QXhpcyBEYXRhIEJpbmRpbmcgKEFEQikgZG9lcyBub3Qgc3VwcG9ydCB0aGUgZm9sbG93aW5nDQotY29uc3RydWN0czoNCi08b2w+DQotPGxpPkFYSVMyLTk4MzogU3VwcG9ydCBmb3IgU2ltcGxlIFR5cGUgVW5pb24gYW5kIFNpbXBsZSBUeXBlDQotTGlzdDwvbGk+DQotPGxpPkFYSVMyLTEwOTI6IFN1cHBvcnQgZm9yIHhzOmxpc3QgaW5zaWRlIGFuIHhzOnNpbXBsZVR5cGU8L2xpPg0KLTxsaT5BWElTMi0xMDkzOiBTdXBwb3J0IGZvciB4czp1bmlvbiBpbnNpZGUgeHM6c2ltcGxlVHlwZTwvbGk+DQotPC9vbD4NCi08L2xpPg0KLTxsaT5ObyBzdXBwb3J0IHlldCBmb3IgdW53cmFwcGluZyBvZiBkb2MvbGl0IFdTREwgZmlsZXMgKGluIHN0dWINCi1nZW5lcmF0aW9uKTwvbGk+DQotPGxpPk5vIHN1cHBvcnQgeWV0IGZvciBycGMvZW5jb2RlZCBzdHlsZSBXU0RMIGRvY3VtZW50cyAoaW4gc3R1Yg0KLWdlbmVyYXRpb24pPC9saT4NCi08bGk+SWRlYSBwbHVnaW4gc2hvd3MgcmFuZG9tIGJlaGF2aW9yIHdoZW4gWE1MQmVhbnMgaXMgdXNlZDwvbGk+DQotPC91bD4NCi08YSBpZD0iMV8wIiBuYW1lPSIxXzAiPjwvYT4NCi08aDI+MDQgTWF5IDIwMDYgLSBBcGFjaGUgQXhpczIgVmVyc2lvbiAxLjAgUmVsZWFzZWQhPC9oMj4NCi08cD5bPGEgaHJlZj0iaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvZG93bmxvYWQuY2dpIj5Eb3dubG9hZA0KLTEuMDwvYT5dPC9wPg0KLTxwPkFwYWNoZSBBeGlzMiBpcyBhIGNvbXBsZXRlIHJlLWRlc2lnbiBhbmQgcmUtd3JpdGUgb2YgdGhlIHdpZGVseQ0KLXVzZWQgQXBhY2hlIEF4aXMgU09BUCBzdGFjaywgYnVpbHQgb24gdGhlIGxlc3NvbnMgbGVhcm50IGZyb20NCi1BcGFjaGUgQXhpcy48L3A+DQotPHA+QXBhY2hlIEF4aXMyIG5vdCBvbmx5IHN1cHBvcnRzIFNPQVAgMS4xIGFuZCBTT0FQIDEuMiwgYnV0IGl0DQotYWxzbyBoYXMgaW50ZWdyYXRlZCBzdXBwb3J0IGZvciB0aGUgd2lkZWx5IHBvcHVsYXIgUkVTVCBzdHlsZSBvZg0KLVdlYiBzZXJ2aWNlcy4gVGhlIHNhbWUgYnVzaW5lc3MgbG9naWMgaW1wbGVtZW50YXRpb24gY2FuIG9mZmVyIGJvdGgNCi1hIFdTLSogc3R5bGUgaW50ZXJmYWNlIGFzIHdlbGwgYXMgYSBSRVNUIHN0eWxlIGludGVyZmFjZQ0KLXNpbXVsdGFuZW91c2x5LjwvcD4NCi08cD5BcGFjaGUgQXhpczIgaXMgbW9yZSBlZmZpY2llbnQsIG1vcmUgbW9kdWxhciBhbmQgbW9yZQ0KLVhNTC1vcmllbnRlZCB0aGFuIHRoZSBvbGRlciB2ZXJzaW9uLiBJdCBpcyBkZXNpZ25lZCB0byBzdXBwb3J0IHRoZQ0KLWVhc3kgYWRkaXRpb24gb2YgcGx1Zy1pbiAibW9kdWxlcyIgdGhhdCBleHRlbmQgdGhlaXIgZnVuY3Rpb25hbGl0eQ0KLWZvciBmZWF0dXJlcyBzdWNoIGFzIHNlY3VyaXR5IGFuZCByZWxpYWJpbGl0eS4gVGhlIG1vZHVsZXMNCi1jdXJyZW50bHkgYXZhaWxhYmxlIG9yIHVuZGVyIGRldmVsb3BtZW50IGluY2x1ZGU6PC9wPg0KLTx1bD4NCi08bGk+PGEgaHJlZj0NCi0iaHR0cDovL3d3dy5vYXNpcy1vcGVuLm9yZy9jb21taXR0ZWVzL3RjX2hvbWUucGhwP3dnX2FiYnJldj13c3JtIj5XUy1SZWxpYWJsZU1lc3NhZ2luZzwvYT4NCi0tIFN1cHBvcnRlZCBieSA8YSBocmVmPQ0KLSJodHRwOi8vd3MuYXBhY2hlLm9yZy9zYW5kZXNoYS9zYW5kZXNoYTIvIj5BcGFjaGUNCi1TYW5kZXNoYTI8L2E+PC9saT4NCi08bGk+PGEgaHJlZj0NCi0iaHR0cDovL3d3dy0xMjguaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9saWJyYXJ5L3NwZWNpZmljYXRpb24vd3MtdHgvI2Nvb3IiPg0KLVdTLUNvb3JkaW5hdGlvbjwvYT4gYW5kIDxhIGhyZWY9DQotImh0dHA6Ly93d3ctMTI4LmlibS5jb20vZGV2ZWxvcGVyd29ya3MvbGlicmFyeS9zcGVjaWZpY2F0aW9uL3dzLXR4LyNhdG9tIj4NCi1XUy1BdG9taWNUcmFuc2FjdGlvbjwvYT4gLSBTdXBwb3J0ZWQgYnkgPGEgaHJlZj0NCi0iaHR0cDovL3dzLmFwYWNoZS5vcmcva2FuZHVsYS8iPkFwYWNoZSBLYW5kdWxhMjwvYT48L2xpPg0KLTxsaT48YSBocmVmPQ0KLSJodHRwOi8vd3d3Lm9hc2lzLW9wZW4ub3JnL2NvbW1pdHRlZXMvdGNfaG9tZS5waHA/d2dfYWJicmV2PXdzcyI+V1MtU2VjdXJpdHk8L2E+DQotLSBTdXBwb3J0ZWQgYnkgPGEgaHJlZj0NCi0iaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvbW9kdWxlcy9pbmRleC5odG1sIj5BcGFjaGUNCi1SYW1wYXJ0PC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9DQotImh0dHA6Ly93d3cudzMub3JnL1N1Ym1pc3Npb24vd3MtYWRkcmVzc2luZy8iPldTLUFkZHJlc3Npbmc8L2E+IC0NCi08YSBocmVmPSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi9tb2R1bGVzL2luZGV4Lmh0bWwiPk1vZHVsZTwvYT4NCi1pbmNsdWRlZCBhcyBwYXJ0IG9mIEF4aXMyIGNvcmU8L2xpPg0KLTwvdWw+DQotPHA+QXBhY2hlIEF4aXMyIGlzIGJ1aWx0IG9uIDxhIGhyZWY9DQotImh0dHA6Ly93cy5hcGFjaGUub3JnL2NvbW1vbnMvYXhpb20vaW5kZXguaHRtbCI+QXBhY2hlIEF4aW9tPC9hPiwgYQ0KLW5ldyBoaWdoIHBlcmZvcm1hbnQsIHB1bGwtYmFzZWQgWE1MIG9iamVjdCBtb2RlbCB0aGF0IHdhcyByZWxlYXNlZA0KLW9uIDAyIE1heSAyMDA2LjwvcD4NCi08aDI+RmVhdHVyZXM8L2gyPg0KLTxoMz5Qcm9ncmFtbWluZyBNb2RlbDwvaDM+DQotPHVsPg0KLTxsaT5JbXByb3ZlZCwgWE1MLWNlbnRyaWMgY2xpZW50IEFQSSBpbmNsdWRpbmcgZnVsbCBXU0RMIGFuZCBwb2xpY3kNCi1zdXBwb3J0PC9saT4NCi08bGk+U3VwcG9ydCBmb3IgYW55IG1lc3NhZ2UgZXhjaGFuZ2UgcGF0dGVybjwvbGk+DQotPGxpPlN5bmNocm9ub3VzIGFuZCBhc3luY2hyb25vdXMgY2FsbHM8L2xpPg0KLTxsaT5BcmNoaXZlZCBzZXJ2aWNlIGRlcGxveW1lbnQgbW9kZWw8L2xpPg0KLTxsaT5BcmNoaXZlZCBtb2R1bGUgZGVwbG95bWVudCBtb2RlbCBzdXBwb3J0aW5nIGNvbnRyb2xsZWQNCi1leHRlbnNpYmlsaXR5IHdpdGggdmVyc2lvbmluZyBzdXBwb3J0PC9saT4NCi08bGk+PGEgaHJlZj0iMV8xL2luc3RhbGxhdGlvbmd1aWRlLmh0bWwjaG90X2RlcGxveW1lbnQiPkhvdA0KLWRlcGxveW1lbnQ8L2E+PC9saT4NCi08bGk+V1MtUG9saWN5IGRyaXZlbiBjb2RlIGdlbmVyYXRpb24gZXh0ZW5zaW9uczwvbGk+DQotPGxpPkZsZXhpYmxlIHNlcnZpY2UgbGlmZWN5bGUgbW9kZWw8L2xpPg0KLTxsaT5TdXBwb3J0IGZvciBxdWVyeWluZyBhIHNlcnZpY2UncyBXU0RMICh1c2luZyA/d3NkbCksIHNjaGVtYQ0KLSh1c2luZyA/eHNkKSBhbmQgcG9saWNpZXMgKHVzaW5nID9wb2xpY3kpPC9saT4NCi08L3VsPg0KLTxoMz5TdXBwb3J0ZWQgU3BlY2lmaWNhdGlvbnM8L2gzPg0KLTx1bD4NCi08bGk+U09BUCAxLjEgYW5kIDEuMjwvbGk+DQotPGxpPk1lc3NhZ2UgVHJhbnNtaXNzaW9uIE9wdGltaXphdGlvbiBNZWNoYW5pc20gKE1UT00pLCBYTUwNCi1PcHRpbWl6ZWQgUGFja2FnaW5nIChYT1ApIGFuZCBTT0FQIHdpdGggQXR0YWNobWVudHM8L2xpPg0KLTxsaT5XU0RMIDEuMSwgaW5jbHVkaW5nIGJvdGggU09BUCBhbmQgSFRUUCBiaW5kaW5nczwvbGk+DQotPGxpPldTLUFkZHJlc3NpbmcgKHN1Ym1pc3Npb24gYW5kIGZpbmFsKTwvbGk+DQotPGxpPldTLVBvbGljeTwvbGk+DQotPGxpPlNBQUogMS4xPC9saT4NCi08L3VsPg0KLTxoMz5UcmFuc3BvcnRzPC9oMz4NCi08dWw+DQotPGxpPkhUVFA8L2xpPg0KLTxsaT5TTVRQPC9saT4NCi08bGk+Sk1TPC9saT4NCi08bGk+VENQPC9saT4NCi08L3VsPg0KLTxoMz5TdXBwb3J0ZWQgRGF0YSBCaW5kaW5nczwvaDM+DQotPHVsPg0KLTxsaT5BeGlzIERhdGEgQmluZGluZyAoQURCKTwvbGk+DQotPGxpPlhNTEJlYW5zPC9saT4NCi08bGk+SmliWDwvbGk+DQotPGxpPkpheE1lPC9saT4NCi08L3VsPg0KLTxoMj48YT5Ub29scyBJbmNsdWRlZCBpbiBUaGlzIFJlbGVhc2U8L2E+PC9oMj4NCi08cD48YSBocmVmPSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi90b29scy9pbmRleC5odG1sIj5bRG93bmxvYWQNCi1wbHVnLWluc108L2E+PC9wPg0KLTxvbCB0eXBlPSIxIj4NCi08bGk+QXhpczIgV2ViIEFwcGxpY2F0aW9uIChXZWIgQXBwKTwvbGk+DQotPGxpPldTREwyV1MtIDxhIGhyZWY9DQotIi4uL3Rvb2xzLzFfMC9lY2xpcHNlL3dzZGwyamF2YS1wbHVnaW4uaHRtbCI+ZWNsaXBzZQ0KLXBsdWctaW48L2E+PGE+LzwvYT4gPGEgaHJlZj0NCi0iLi4vdG9vbHMvMV8wL0NvZGVnZW5Ub29sUmVmZXJlbmNlLmh0bWwiPkNvbW1hbmQgbGluZQ0KLXZlcnNpb248L2E+PGE+LzwvYT48YSBocmVmPQ0KLSIuLi90b29scy8xXzAvaWRlYS9JZGVhX3BsdWctaW5fdXNlcmd1aWRlLmh0bWwjV1NETDJKYXZhX0NvZGVfR2VuZXJhdGlvbiI+SW50ZWxsaUoNCi1JREVBIHBsdWctaW48L2E+PC9saT4NCi08bGk+U2VydmljZSBBcmNoaXZlIFdpemFyZC0gPGEgaHJlZj0NCi0iLi4vdG9vbHMvMV8wL2VjbGlwc2Uvc2VydmljZWFyY2hpdmVyLXBsdWdpbi5odG1sIj5lY2xpcHNlDQotcGx1Zy1pbjwvYT4vIDxhIGhyZWY9DQotIi4uL3Rvb2xzLzFfMC9pZGVhL0lkZWFfcGx1Zy1pbl91c2VyZ3VpZGUuaHRtbCNDcmVhdGVfU2VydmljZV9BcmNoaXZlIj4NCi1JbnRlbGxpSiBJREVBIHBsdWctaW48L2E+PC9saT4NCi08L29sPg0KLTxoMj5FeHRlbnNpb24gTW9kdWxlczwvaDI+DQotPHVsPg0KLTxsaT5BcGFjaGUgUmFtcGFydDogU3VwcG9ydGluZyBXUy1TZWN1cml0eSAoYW5kIHNvb24NCi1XUy1Qb2xpY3kpPC9saT4NCi08bGk+QXBhY2hlIFNhbmRlc2hhMjogU3VwcG9ydGluZyBXUy1SZWxpYWJsZSBNZXNzYWdpbmc8L2xpPg0KLTwvdWw+DQotKEFwYWNoZSBBeGlzMiBjb21lcyB3aXRoIGEgYnVpbHQgaW4gbW9kdWxlIHRoYXQgc3VwcG9ydHMNCi1XUy1BZGRyZXNzaW5nLikNCi08aDI+S25vd24gSXNzdWVzIGFuZCBMaW1pdGF0aW9uczwvaDI+DQotPHVsPg0KLTxsaT5SZWN1cnNpdmUgc2NoZW1hcyAoQSBpbmNsdWRlcyBCIHdoaWNoIGluY2x1ZGVzIEEpIG1heSBjYXVzZQ0KLXByb2JsZW1zPC9saT4NCi08bGk+SmF4TWUgZGF0YSBiaW5kaW5nIHN1cHBvcnQgaXMgZXhwZXJpbWVudGFsPC9saT4NCi08bGk+QXhpczItNTk1OiBIb3QgcmUtZGVwbG95bWVudCBpbiBBcGFjaGUgVG9tY2F0IGhhcyBwcm9ibGVtczwvbGk+DQotPGxpPkF4aXMyLTY2NjogQWRkcmVzc2luZ1N1Ym1pc3Npb25JbkhhbmRsZXIgZG9lcyBub3QgZGVzZXJpYWxpemUNCi1FUFIgZXh0ZW5zaWJpbGl0eSBhdHRyaWJ1dGVzIGFuZCBlbGVtZW50czwvbGk+DQotPGxpPkFYSVMyLTY2NzogT3BlcmF0aW9uIGRpc3BhdGNoIGJhc2VkIG9uIG1lc3NhZ2UgYm9keSBoYXMgYSBrbm93bg0KLWlzc3VlPC9saT4NCi08bGk+QXhpcyBEYXRhIEJpbmRpbmcgKEFEQikgZG9lcyBub3QgY292ZXIgYWxsIG9mIHRoZSBYTUwgU2NoZW1hOw0KLWl0cyBhbiA4MC0yMCBkZXNpZ24gcG9pbnQuIFVuc3VwcG9ydGVkIFhNTCBTY2hlbWEgZmVhdHVyZXMgaW5jbHVkZToNCi08b2w+DQotPGxpPlNpbXBsZSBjb250ZW50IGV4dGVuc2lvbiBhbmQgcmVzdHJpY3Rpb248L2xpPg0KLTxsaT5Db21wbGV4IGNvbnRlbnQgcmVzdHJpY3Rpb248L2xpPg0KLTwvb2w+DQotPC9saT4NCi08bGk+QURCIGRvZXMgbm90IHN1cHBvcnQgeHNpOnR5cGUgYmFzZWQgZGVzZXJpYWxpemF0aW9uIGF0DQotcnVudGltZTwvbGk+DQotPGxpPk5vIHN1cHBvcnQgeWV0IGZvciB1bndyYXBwaW5nIG9mIGRvYy9saXQgV1NETCBmaWxlcyAoaW4gc3R1Yg0KLWdlbmVyYXRpb24pPC9saT4NCi08bGk+Tm8gc3VwcG9ydCB5ZXQgZm9yIHJwYy9lbmNvZGVkIHN0eWxlIFdTREwgZG9jdW1lbnRzIChpbiBzdHViDQotZ2VuZXJhdGlvbik8L2xpPg0KLTwvdWw+DQotPGEgaWQ9IjBfOTUiIG5hbWU9IjBfOTUiPjwvYT4NCi08aDI+MjMgTWFyY2ggMjAwNiAtIEFwYWNoZSBBeGlzMiBWZXJzaW9uIDAuOTUgUmVsZWFzZWQhPC9oMj4NCi08cD5bPGEgaHJlZj0iaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvZG93bmxvYWQuY2dpIj5Eb3dubG9hZA0KLTAuOTU8L2E+XTwvcD4NCi08cD5UaGlzIHJlbGVhc2UgaW5jbHVkZXMgdGhlIGZvbGxvd2luZyBmZWF0dXJlczo8L3A+DQotPGgzIGlkPSJoZWFkLTIxNWYzOTQ1YTQwNTU4ZjlhZDA1NWVkNWI2NjAxZThmOTM3MDY1NTgiPkF4aXMyDQotQ29tcGxldGUgTGlzdCBvZiBGZWF0dXJlczwvaDM+DQotPG9sIHR5cGU9IjEiPg0KLTxsaT5BWElPTSwgYW4gWE1MIG9iamVjdCBtb2RlbCB3b3JraW5nIG9uIFN0QVggKFN0cmVhbWluZyBBUEkgZm9yDQotWE1MKSBwYXJzaW5nIG9wdGltaXplZCBmb3IgU09BUCAxLjEvMS4yIG1lc3NhZ2VzLiBUaGlzIGhhcyBjb21wbGV0ZQ0KLVhNTCBpbmZvc2V0IHN1cHBvcnQuPC9saT4NCi08bGk+U3VwcG9ydCBmb3IgT25lLVdheSBNZXNzYWdpbmcgKEluLU9ubHkpIGFuZCBSZXF1ZXN0IFJlc3BvbnNlDQotTWVzc2FnaW5nIChJbi1PdXQpPC9saT4NCi08bGk+TW9kdWxlIEFyY2hpdGVjdHVyZSwgYSBtZWNoYW5pc20gdG8gZXh0ZW5kIHRoZSBTT0FQIFByb2Nlc3NpbmcNCi1Nb2RlbDwvbGk+DQotPGxpPk1vZHVsZSB2ZXJzaW9uIHN1cHBvcnQ7IHlvdSBjYW4gaGF2ZSBtdWx0aXBsZSB2ZXJzaW9ucyBvZiB0aGUNCi1zYW1lIG1vZHVsZSBhbmQgdXNlIHRoZW0gZGVwZW5kaW5nIG9uIHRoZSByZXF1aXJlbWVudC48L2xpPg0KLTxsaT5Db250ZXh0IGhpZXJhcmNoeTwvbGk+DQotPGxpPkFyY2hpdmUgYmFzZWQgZGVwbG95bWVudCBtb2RlbCBhbmQgRGlyZWN0b3J5IGJhc2VkIGRlcGxveW1lbnQNCi1tb2RlbDwvbGk+DQotPGxpPkpXUy1saWtlIGRlcGxveW1lbnQgKG1ha2luZyBhIEphdmEgY2xhc3MgaW50byBhIFdlYg0KLXNlcnZpY2UpPC9saT4NCi08bGk+V1NETCBDb2RlIEdlbmVyYXRpb24gVG9vbCBmb3IgU3R1YiBhbmQgc2tlbGV0b25zPC9saT4NCi08bGk+V1MtQWRkcmVzc2luZywgYm90aCBpbiB0aGUgc3VibWlzc2lvbiAoMjAwNC8wOCkgYW5kIGZpbmFsDQotKDIwMDUvMDgpIHZlcnNpb25zPC9saT4NCi08bGk+V1NTNEogbW9kdWxlIGZvciBzZWN1cml0eTwvbGk+DQotPGxpPkltcHJvdmVkIGFuZCB1c2VyIGZyaWVuZGx5IENsaWVudCBBUEk8L2xpPg0KLTxsaT5XU0RMMkphdmEgYW5kIEphdmEyV1NETDwvbGk+DQotPGxpPlJFU1QgKFJFcHJlc2VudGF0aW9uYWwgU3RhdGUgVHJhbnNmZXIpIFN1cHBvcnQ8L2xpPg0KLTxsaT5UcmFuc3BvcnRzIHN1cHBvcnRzOiBIVFRQLCBTTVRQLCBUQ1AsIEpNUzwvbGk+DQotPGxpPlJhdyBYTUwgcHJvdmlkZXJzPC9saT4NCi08bGk+U3VwcG9ydCBmb3IgTVRPTS8gTUlNRS8gU3dBPC9saT4NCi08bGk+U0FBSiBpbXBsZW1lbnRhdGlvbjwvbGk+DQotPGxpPkRPT008L2xpPg0KLTxsaT5QYWNrL1VucGFjayBjYXBhYmlsaXR5IGZvciB0aGUgZ2VuZXJhdGVkIGNvZGU8L2xpPg0KLTxsaT5BeGlzIERhdGEgQmluZGluZyAtIEFEQiAoRnJhbWV3b3JrIGFuZCBTY2hlbWEgQ29tcGlsZXIpPC9saT4NCi08bGk+TnVtZXJvdXMgYnVnIGZpeGVzIHNpbmNlIGxhc3QgcmVsZWFzZTwvbGk+DQotPGxpPlRyYW5zcG9ydCBmcmFtZXdvcmsgaW1wcm92ZW1lbnRzIChMaXN0ZW5lck1hbmFnZXIpLTxzcGFuIHN0eWxlPQ0KLSJjb2xvcjogI0ZGMDAwMCI+TmV3PC9zcGFuPjwvbGk+DQotPGxpPkF4aXNTZXJ2bGV0IGF1dG8gc3RhcnQgd2hlbiB0aGUgYXBwbGljYXRpb24gc2VydmVyIHN0YXJ0cw0KLXVwLTxzcGFuIHN0eWxlPSJjb2xvcjogI0ZGMDAwMCI+TmV3PC9zcGFuPjwvbGk+DQotPGxpPk1vZHVsZSBkaXNlbmdhZ2VtZW50IHN1cHBvcnQtPHNwYW4gc3R5bGU9DQotImNvbG9yOiAjRkYwMDAwIj5OZXc8L3NwYW4+PC9saT4NCi08bGk+TG9hZGluZyBtb2R1bGUgKC5tYXIpIGZyb20gY2xhc3NwYXRoLTxzcGFuIHN0eWxlPQ0KLSJjb2xvcjogI0ZGMDAwMCI+TmV3PC9zcGFuPjwvbGk+DQotPGxpPlNlc3Npb25zIHNjb3BpbmcgZm9yIEFwcGxpY2F0aW9uLCBTT0FQLCBUcmFuc3BvcnQgYW5kIFJlcXVlc3QNCi1sZXZlbHMtPHNwYW4gc3R5bGU9ImNvbG9yOiAjRkYwMDAwIj5OZXc8L3NwYW4+PC9saT4NCi08L29sPg0KLTxwIGlkPSJoZWFkLTViYjVhYTA5OTcxN2QxZDQ5NjQyZjdhZTJkNjNjZTVjZjk0NDg3YWQiPg0KLTxzdHJvbmc+PGVtPkF4aXMyIExpc3Qgb2YgRXhwZXJpbWVudGFsIEZlYXR1cmVzPC9lbT48L3N0cm9uZz48L3A+DQotPG9sIHR5cGU9IjEiPg0KLTxsaT5TZXJ2ZXIgc2lkZSBhbmQgY2xpZW50IHNpZGUgV2ViIFNlcnZpY2UgUG9saWN5IHN1cHBvcnQ8L2xpPg0KLTxsaT4/d3NkbCBhbmQgP3hzZCBzdXBwb3J0PC9saT4NCi08bGk+R2VuZXJhdGUgU2VydmljZUNsaWVudCBmb3IgYSBnaXZlbiBXU0RMIGFuZCBpbnZva2UgdGhlDQotY29ycmVzcG9uZGluZyBzZXJ2aWNlIHVzaW5nIHRoZSBnZW5lcmF0ZWQgY2xpZW50LjwvbGk+DQotPC9vbD4NCi08aDMgaWQ9ImhlYWQtN2RkOGU3ODNiYjllMjJmYjAwZjg4NzQ4ODU1YmI2ZTUwMDExMWUxMiI+TWFqb3INCi1DaGFuZ2VzIFNpbmNlIExhc3QgUmVsZWFzZTwvaDM+DQotPG9sIHR5cGU9IjEiPg0KLTxsaT5UcmFuc3BvcnQgZnJhbWV3b3JrIGltcHJvdmVtZW50cyAoTGlzdGVuZXJNYW5hZ2VyKQ0KLTxwcmU+DQotICAgJmx0O2FjdGlvbk1hcHBpbmcmZ3Q7TXlNYXBwaW5nJmx0Oy9hY3Rpb25NYXBwaW5nJmd0Ow0KLSAgIA0KLTwvcHJlPjwvbGk+DQotPGxpPkNoYW5nZWQgdGhlIHdheSB5b3UgYWRkIGFjdGlvbiB0byBtYXBwaW5nICh3c2FtYXBwaW5nKSBmcm9tIGENCi1wYXJhbWV0ZXIgdG8gYSBjaGlsZCBlbGVtZW50LiBUaGVyZWZvcmUsIGZyb20gdGhpcyB2ZXJzaW9uIG9ud2FyZCwNCi1hZGRpbmcgbWFwcGluZyBpcyBhcyBmb2xsb3dzOjwvbGk+DQotPGxpPlJlZmFjdG9yZWQgdGhlIGZvbGxvd2luZyBwYWNrYWdlcyBpbiBBeGlvbS4NCi08dWw+DQotPGxpPm9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5sbG9tLmJ1aWxkZXIgdG8NCi1vcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuYnVpbGRlcjwvbGk+DQotPGxpPm9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5sbG9tLm10b20gdG8NCi1vcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubXRvbTwvbGk+DQotPGxpPm9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5sbG9tLnNlcmlhbGl6ZSB0bw0KLW9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5zZXJpYWxpemU8L2xpPg0KLTxsaT5vcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS50cmF2ZXJzZSB0bw0KLW9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC50cmF2ZXJzZTwvbGk+DQotPC91bD4NCi08L2xpPg0KLTwvb2w+DQotPGgzIGlkPSJoZWFkLTgzMzcxY2MzZDY5NjEyOTViZTA0MmY1ODRjN2I3NGQ4MWNjYTIzYzQiPlRvb2xzDQotSW5jbHVkZWQgaW4gVGhpcyBSZWxlYXNlPC9oMz4NCi08b2wgdHlwZT0iMSI+DQotPGxpPkF4aXMyIFdlYiBBcHBsaWNhdGlvbiAoV2ViIEFwcCk8L2xpPg0KLTxsaT5XU0RMMldTLSBDb21tYW5kIGxpbmUgdmVyc2lvbjwvbGk+DQotPCEtLTxsaT5TZXJ2aWNlIEFyY2hpdmUgV2l6YXJkLSBlY2xpcHNlIFBsdWdpbjwvbGk+LS0+PC9vbD4NCi08aDMgaWQ9ImhlYWQtNTk5YzVhNTA1NTJmMDJlYmRlYjVmNThlZjhkYTI4OTIzNDgxMmNhNCI+V2hhdCBTdGlsbA0KLU5lZWRzIHRvIGJlIERvbmU8L2gzPg0KLTxwPlRoZSBsaXN0IG9mIHdoYXQgd2UgdGhpbmsgbmVlZHMgdG8gYmUgZG9uZS4gRXZlbiB5b3UgY2FuDQotY29uc2lkZXIgaGVscGluZyBvdXQgaWYgeW91IGFyZSBpbnRlcmVzdGVkLjwvcD4NCi08b2wgdHlwZT0iMSI+DQotPGxpPkpBWC1SUEMgMS4xIGFuZC9vciBKQVgtV1MgY29tcGxpYW5jZTwvbGk+DQotPGxpPlNPQVAgRW5jb2Rpbmc8L2xpPg0KLTxsaT5CaW5hcnkgc2VyaWFsaXphdGlvbiBhbmQgZGUtc2VyaWFsaXphdGlvbiBzdXBwb3J0PC9saT4NCi08bGk+TWFuYWdlbWVudCBJbnRlcmZhY2UgZm9yIEF4aXMyPC9saT4NCi08bGk+SW1wbGVtZW50YXRpb24gb2Ygb3RoZXIgVHJhbnNwb3J0cy48L2xpPg0KLTxsaT5SZXNvdXJjZSBmcmFtZXdvcmsgaW1wbGVtZW50YXRpb24gKFdTLVJGKSBhbmQgRW50ZXJwcmlzZSB3ZWINCi1zZXJ2aWNlcyBzdWNoIGFzIEpTUiAxMDkgc3VwcG9ydDwvbGk+DQotPGxpPkNvbXBsZXRpb24gb2YgSW50ZXJvcCB0ZXN0czwvbGk+DQotPC9vbD4NCi08YSBpZD0iMF85NCIgbmFtZT0iMF85NCI+PC9hPg0KLTxoMj4xMSBKYW51YXJ5IDIwMDYgLSBBcGFjaGUgQXhpczIgVmVyc2lvbiAwLjk0IFJlbGVhc2VkITwvaDI+DQotPHA+WzxhIGhyZWY9Imh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL2Rvd25sb2FkLmNnaSI+RG93bmxvYWQNCi0wLjk0PC9hPl08L3A+DQotPHA+VGhpcyByZWxlYXNlIGluY2x1ZGVzIHRoZSBmb2xsb3dpbmcgZmVhdHVyZXM6PC9wPg0KLTxoMyBpZD0iaGVhZC0yMTVmMzk0NWE0MDU1OGY5YWQwNTVlZDViNjYwMWU4ZjkzNzA2NTU4Ij5UaGUgQ29tcGxldGUNCi1MaXN0IG9mIEZlYXR1cmVzPC9oMz4NCi08b2wgdHlwZT0iMSI+DQotPGxpPkFYSU9NLCBhbiBYTUwgb2JqZWN0IG1vZGVsIHdvcmtpbmcgb24gU3RBWCAoU3RyZWFtaW5nIEFQSSBmb3INCi1YTUwpIHBhcnNpbmcgb3B0aW1pemVkIGZvciBTT0FQIDEuMS8xLjIgTWVzc2FnZXMuIFRoaXMgaGFzIGNvbXBsZXRlDQotWE1MIGluZm9zZXQgc3VwcG9ydC48L2xpPg0KLTxsaT5TdXBwb3J0IGZvciBPbmUtV2F5IE1lc3NhZ2luZyAoSW4tT25seSkgYW5kIFJlcXVlc3QgUmVzcG9uc2UNCi1NZXNzYWdpbmcgKEluLU91dCk8L2xpPg0KLTxsaT5Nb2R1bGUgQXJjaGl0ZWN0dXJlLCBtZWNoYW5pc20gdG8gZXh0ZW5kIHRoZSBTT0FQIFByb2Nlc3NpbmcNCi1Nb2RlbDwvbGk+DQotPGxpPk1vZHVsZSB2ZXJzaW9uIHN1cHBvcnQ7IHlvdSBjYW4gaGF2ZSBtdWx0aXBsZSB2ZXJzaW9ucyBvZiB0aGUNCi1zYW1lIG1vZHVsZSBhbmQgdXNlIHRoZW0gZGVwZW5kaW5nIG9uIHRoZSByZXF1aXJlbWVudC48L2xpPg0KLTxsaT5Db250ZXh0IGhpZXJhcmNoeTwvbGk+DQotPGxpPkFyY2hpdmUgYmFzZWQgZGVwbG95bWVudCBNb2RlbCwgYW5kIERpcmVjdG9yeSBiYXNlZCBkZXBsb3ltZW50DQotbW9kZWw8L2xpPg0KLTxsaT5KV1MtbGlrZSBkZXBsb3ltZW50IChtYWtpbmcgYSBKYXZhIGNsYXNzIGludG8gYSBXZWINCi1zZXJ2aWNlKTwvbGk+DQotPGxpPldTREwgQ29kZSBHZW5lcmF0aW9uIFRvb2wgZm9yIFN0dWIgYW5kIHNrZWxldG9uczwvbGk+DQotPGxpPldTLUFkZHJlc3NpbmcsIGJvdGggdGhlIHN1Ym1pc3Npb24gKDIwMDQvMDgpIGFuZCBmaW5hbA0KLSgyMDA1LzA4KSB2ZXJzaW9uczwvbGk+DQotPGxpPldTUzRKIG1vZHVsZSBmb3Igc2VjdXJpdHk8L2xpPg0KLTxsaT5JbXByb3ZlZCBhbmQgdXNlciBmcmllbmRseSBDbGllbnQgQVBJPC9saT4NCi08bGk+V1NETDJKYXZhPC9saT4NCi08bGk+UkVTVCAoUkVwcmVzZW50YXRpb25hbCBTdGF0ZSBUcmFuc2ZlcikgU3VwcG9ydDwvbGk+DQotPGxpPlRyYW5zcG9ydHMgc3VwcG9ydHM6IEhUVFAsIFNNVFAsIFRDUCwgSk1TPC9saT4NCi08bGk+UmF3IFhNTCBwcm92aWRlcnM8L2xpPg0KLTxsaT5TdXBwb3J0IGZvciBNVE9NLyBNSU1FLyBTd0E8L2xpPg0KLTxsaT5TQUFKIGltcGxlbWVudGF0aW9uPC9saT4NCi08bGk+RE9PTSAtIDxzcGFuIHN0eWxlPSJjb2xvcjogI0ZGMDAwMCI+TmV3PC9zcGFuPjwvbGk+DQotPGxpPlBhY2svVW5wYWNrIGNhcGFiaWxpdHkgZm9yIHRoZSBnZW5lcmF0ZWQgY29kZSAtIDxzcGFuIHN0eWxlPQ0KLSJjb2xvcjogI0ZGMDAwMCI+TmV3PC9zcGFuPjwvbGk+DQotPGxpPkF4aXMgRGF0YSBCaW5kaW5nIC0gQURCIChGcmFtZXdvcmsgYW5kIFNjaGVtYSBDb21waWxlcik8L2xpPg0KLTxsaT5OdW1lcm91cyBidWcgZml4ZXMgc2luY2UgbGFzdCByZWxlYXNlPC9saT4NCi08L29sPg0KLTxoNCBpZD0iaGVhZC01YmI1YWEwOTk3MTdkMWQ0OTY0MmY3YWUyZDYzY2U1Y2Y5NDQ4N2FkIj5BeGlzMiBMaXN0DQotb2YgRXhwZXJpbWVudGFsIEZlYXR1cmVzPC9oND4NCi08b2wgdHlwZT0iMSI+DQotPGxpPlNlc3Npb25zIHNjb3BpbmcgZm9yIEFwcGxpY2F0aW9uLCBTT0FQLCBUcmFuc3BvcnQgYW5kIFJlcXVlc3QNCi1sZXZlbHM8L2xpPg0KLTxsaT5TZXJ2ZXIgc2lkZSBXZWIgU2VydmljZSBQb2xpY3kgc3VwcG9ydDwvbGk+DQotPGxpPj93c2RsIGFuZCA/eHNkIHN1cHBvcnQ8L2xpPg0KLTxsaT5KYXZhMldTREw8L2xpPg0KLTxsaT5HZW5lcmF0ZSBTZXJ2aWNlQ2xpZW50IGZvciBhIGdpdmVuIFdTREwgYW5kIGludm9rZSB0aGUNCi1jb3JyZXNwb25kaW5nIHNlcnZpY2UgdXNpbmcgdGhlIGdlbmVyYXRlZCBjbGllbnQuPC9saT4NCi08L29sPg0KLTxoMyBpZD0iaGVhZC03ZGQ4ZTc4M2JiOWUyMmZiMDBmODg3NDg4NTViYjZlNTAwMTExZTEyIj5NYWpvcg0KLUNoYW5nZXMgU2luY2UgdGhlIExhc3QgUmVsZWFzZTwvaDM+DQotPG9sIHR5cGU9IjEiPg0KLTxsaT5GaXhpbmcgb2YgbWVtb3J5IGxlYWtzLjwvbGk+DQotPGxpPkNsaWVudCBBUEkgY2hhbmdlcy4gSW50cm9kdWNpbmcgU2VydmljZUNsaWVudCBpbnN0ZWFkIG9mDQotTUVQQ2xpZW50LCBJbk9ubHlNRVBDbGllbnQsIEluT3V0TUVQQ2xpZW50LCBDYWxsLiAoUGxlYXNlIG5vdGUgdGhhdA0KLXRoZSBhYm92ZSBjbGFzc2VzIHdpbGwgYmUgZGVwcmVjYXRlZCBpbiB0aGlzIHJlbGVhc2UuKTwvbGk+DQotPGxpPk1vZHVsZSB2ZXJzaW9uaW5nIHN1cHBvcnQuIFlvdSBjYW4gaGF2ZSBtdWx0aXBsZSB2ZXJzaW9ucyBvZg0KLXRoZSBzYW1lIG1vZHVsZSBhbmQgdXNlIHRoZW0gZGVwZW5kaW5nIG9uIHRoZSByZXF1aXJlbWVudC48L2xpPg0KLTxsaT5Db2RlIGdlbmVyYXRvciBpbXByb3ZlZCB0byBwcm9jZXNzIG11bHRpLXBvcnQgV1NETHM8L2xpPg0KLTxsaT5QYWNraW5nIGFuZCB1bnBhY2tpbmcgb3B0aW9ucyBmb3IgdGhlIGNvZGUgZ2VuZXJhdGVkDQotY2xhc3NlczwvbGk+DQotPC9vbD4NCi08aDMgaWQ9ImhlYWQtODMzNzFjYzNkNjk2MTI5NWJlMDQyZjU4NGM3Yjc0ZDgxY2NhMjNjNCI+VG9vbHMNCi1JbmNsdWRlZCBpbiB0aGlzIFJlbGVhc2U8L2gzPg0KLTxvbCB0eXBlPSIxIj4NCi08bGk+QXhpczIgV2ViIEFwcGxpY2F0aW9uIChXZWIgQXBwKTwvbGk+DQotPGxpPldTREwyV1MtIEVjbGlwc2UgcGx1Z2luLyBDb21tYW5kIGxpbmUgdmVyc2lvbi8gSW50ZWxsaUogSURFQQ0KLXBsdWdpbjwvbGk+DQotPGxpPlNlcnZpY2UgQXJjaGl2ZSBXaXphcmQtIEVjbGlwc2UgcGx1Z2luLyBJbnRlbGxpSiBJREVBDQotcGx1Z2luPC9saT4NCi08L29sPg0KLTxoMyBpZD0iaGVhZC01OTljNWE1MDU1MmYwMmViZGViNWY1OGVmOGRhMjg5MjM0ODEyY2E0Ij5XaGF0IFN0aWxsDQotTmVlZHMgdG8gYmUgRG9uZTwvaDM+DQotPG9sIHR5cGU9IjEiPg0KLTxsaT5KQVgtUlBDIDEuMSBhbmQvb3IgSkFYLVdTIGNvbXBsaWFuY2U8L2xpPg0KLTxsaT5TT0FQIEVuY29kaW5nPC9saT4NCi08bGk+QmluYXJ5IHNlcmlhbGl6YXRpb24gYW5kIGRlLXNlcmlhbGl6YXRpb24gc3VwcG9ydDwvbGk+DQotPGxpPk1hbmFnZW1lbnQgaW50ZXJmYWNlIGZvciBBeGlzMjwvbGk+DQotPGxpPkltcGxlbWVudGF0aW9uIG9mIG90aGVyIFRyYW5zcG9ydHMuPC9saT4NCi08bGk+UmVzb3VyY2UgZnJhbWV3b3JrIGltcGxlbWVudGF0aW9uIChXUy1SRikgYW5kIEVudGVycHJpc2Ugd2ViDQotc2VydmljZXMgc3VjaCBhcyBKU1IgMTA5IHN1cHBvcnQ8L2xpPg0KLTxsaT5Db21wbGV0aW9uIG9mIGludGVyb3AgdGVzdHM8L2xpPg0KLTwvb2w+DQotPGEgaWQ9IjBfOTMiIG5hbWU9IjBfOTMiPjwvYT4NCi08aDI+MDIgRGVjZW1iZXIgMjAwNSAtIEFwYWNoZSBBeGlzMiBWZXJzaW9uIDAuOTMgUmVsZWFzZWQhPC9oMj4NCi08cD5bPGEgaHJlZj0iaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvZG93bmxvYWQuY2dpIj5Eb3dubG9hZA0KLTAuOTM8L2E+XTwvcD4NCi08cD5BeGlzMiBpcyBiZWNvbWluZyBtb3JlIGFuZCBtb3JlIHN0YWJsZS4gVGhpcyAwLjkzIHJlbGVhc2UNCi1jb250YWlucyB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgZmVhdHVyZXM6PC9wPg0KLTx1bD4NCi08bGk+SkRLIDEuNSBjb21wYXRpYmlsaXR5PC9saT4NCi08bGk+Q29uZmlndXJhYmxlIGhhbmRsZXIgY2hhaW5zIHVzaW5nIGF4aXMyLnhtbDwvbGk+DQotPGxpPkltcHJvdmVkIGNsYXNzIGxvYWRlciBoaWVyYXJjaHk8L2xpPg0KLTxsaT5JbXByb3ZlZCBzZWN1cml0eSBtb2R1bGUgd2l0aCBkeW5hbWljIGNvbmZpZ3VyYWJpbGl0eTwvbGk+DQotPGxpPkFEQiAoQXhpcyBEYXRhIEJpbmRpbmcpIHdpdGggY29tcGxldGUgc2ltcGxlIHR5cGUgc3VwcG9ydCBhbmQNCi1saW1pdGVkIGNvbXBsZXggdHlwZSBzdXBwb3J0PC9saT4NCi08bGk+SmFsb3B5IGJhc2VkIGNvZGUgZm9ybWF0dGluZyBvZiBnZW5lcmF0ZWQgY29kZTwvbGk+DQotPGxpPlByb3h5IHN1cHBvcnQgYW5kIE5UTE0gYXV0aGVudGljYXRpb248L2xpPg0KLTxsaT5TdXBwb3J0IGZvciBycGMvbGl0ZXJhbDwvbGk+DQotPGxpPkFuZCBudW1lcm91cyBidWcgZml4ZXMgYWZ0ZXIgMC45MiByZWxlYXNlPC9saT4NCi08L3VsPg0KLTxoMz5MaXN0IG9mIEV4cGVyaW1lbnRhbCBGZWF0dXJlczwvaDM+DQotPG9sIHR5cGU9IjEiPg0KLTxsaT5ET09NIC0gRE9NIGltcGxlbWVudGF0aW9uIG92ZXIgT008L2xpPg0KLTxsaT5KYXZhMldTREw8L2xpPg0KLTxsaT5SUEMgU3VwcG9ydDwvbGk+DQotPC9vbD4NCi08aDM+TWFqb3IgQ2hhbmdlcyBTaW5jZSB0aGUgTGFzdCBSZWxlYXNlPC9oMz4NCi08b2w+DQotPGxpPlJlZmFjdG9yZWQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnRhcGkgdG8NCi1vcmcuYXBhY2hlLmF4aXMyLmNsaWVudDwvbGk+DQotPGxpPkludHJvZHVjdGlvbiBvZiBPcHRpb25zIHRvIGNvbmZpZ3VyZSBjbGllbnRzPC9saT4NCi08bGk+UmVuYW1pbmcgb2YgZGVzY3JpcHRvcnMuIE9wZXJhdGlvbkRlc2NyaXB0aW9uIC0mZ3Q7DQotQXhpc09wZXJhdGlvbiwgU2VydmljZURlc2NyaXB0aW9uIC0mZ3Q7IEF4aXNTZXJ2aWNlLA0KLVNlcnZpY2VHcm91cERlc2NyaXB0aW9uIC0mZ3Q7IEF4aXNTZXJ2aWNlR3JvdXA8L2xpPg0KLTwvb2w+DQotV2UgYXJlIGdldHRpbmcgY2xvc2VyIHRvIGEgMS4wIHJlbGVhc2UsIGFuZCB0aGUgcmVtYWluaW5nIHRhc2tzIHRvDQotYmUgY29tcGxldGVkIGJlZm9yZSB0aGUgMS4wIHJlbGVhc2UgaW5jbHVkZTogU09BUCAxLjEgYW5kIDEuMg0KLXZhbGlkYXRpb24sIG91ciBvd24gZGF0YSBiaW5kaW5nIGltcGxlbWVudGF0aW9uLCBhbmQgV1NETA0KLWdlbmVyYXRpb24uIDxhIGlkPSIwXzkyIiBuYW1lPSIwXzkyIj48L2E+DQotPGgyPjI2IFNlcHRlbWJlciAyMDA1IC0gQXBhY2hlIEF4aXMyIFZlcnNpb24gMC45MiBSZWxlYXNlZCE8L2gyPg0KLTxwPls8YSBocmVmPSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi9kb3dubG9hZC5jZ2kiPkRvd25sb2FkDQotMC45MjwvYT5dPC9wPg0KLTxwPlRoaXMgMC45MiByZWxlYXNlIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbA0KLWZlYXR1cmVzOjwvcD4NCi08dWw+DQotPGxpPldTLVNlY3VyaXR5IHN1cHBvcnQgdXNpbmcgV1NTNEo8L2xpPg0KLTxsaT5TdXBwb3J0IGZvciBjb250ZXh0IGhpZXJhcmNoeSBzZXJpYWxpemF0aW9uPC9saT4NCi08bGk+U2VydmljZSBHcm91cHM8L2xpPg0KLTxsaT5OdW1lcm91cyBidWcgZml4ZXMgYWZ0ZXIgMC45MSByZWxlYXNlPC9saT4NCi08L3VsPg0KLTxoMz5UaGUgUmVsZWFzZSBJbmNsdWRlcyB0aGUgRm9sbG93aW5nIFRvb2xzPC9oMz4NCi08dWw+DQotPGxpPkFkbWluIFdlYiBBcHA8L2xpPg0KLTxsaT5XU0RMMkphdmEsIGVjbGlwc2UgUGx1Z2luL0NvbW1hbmQgbGluZSB2ZXJzaW9uPC9saT4NCi08bGk+U2VydmljZSBBcmNoaXZlIFdpemFyZCwgZWNsaXBzZSBQbHVnaW48L2xpPg0KLTxsaT5Nb2R1bGUgQXJjaGl2ZSBXaXphcmQsIGVjbGlwc2UgUGx1Z2luPC9saT4NCi08bGk+U2VydmljZSBBcmNoaXZlIFdpemFyZCwgSW50ZWxsaUogSURFQSBQbHVnaW48L2xpPg0KLTwvdWw+DQotPHA+V2UgYXJlIGdldHRpbmcgY2xvc2VyIHRvIGEgMS4wIHJlbGVhc2UsIGFuZCB0aGUgcmVtYWluaW5nIHRhc2tzDQotdG8gYmUgY29tcGxldGVkIGJlZm9yZSBhIDEuMCByZWxlYXNlIGluY2x1ZGU6IFNPQVAgMS4xIGFuZCAxLjINCi12YWxpZGF0aW9uLCBvdXIgb3duIGRhdGEgYmluZGluZyBpbXBsZW1lbnRhdGlvbiwgYW5kIFdTREwNCi1nZW5lcmF0aW9uLjwvcD4NCi08YSBpZD0iMF85MSIgbmFtZT0iMF85MSI+PC9hPg0KLTxoMj4xMiBBdWd1c3QgMjAwNSAtIEFwYWNoZSBBeGlzMiBWZXJzaW9uIDAuOTEgUmVsZWFzZWQhPC9oMj4NCi08cD5bPGEgaHJlZj0iaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvZG93bmxvYWQuY2dpIj5Eb3dubG9hZA0KLTAuOTE8L2E+XTwvcD4NCi08cD5UaGlzIDAuOTEgcmVsZWFzZSBpcyBhIGdsaW1wc2Ugb2YgdGhlIDEuMCB0aGF0IHNob3VsZCBiZSBjb21pbmcNCi1zb29uLiBUaGlzIDAuOTEgcmVsZWFzZSBjb250YWlucyB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwNCi1mZWF0dXJlczo8L3A+DQotPHVsPg0KLTxsaT5GaWxlIENhY2hpbmcgZm9yIE1UT008L2xpPg0KLTxsaT5TT0FQIGZhdWx0cyBiYXNlZCBvbiB0aGUgU09BUCB2ZXJzaW9uIGFuZCBiZXR0ZXIgZmF1bHQNCi1oYW5kbGluZzwvbGk+DQotPGxpPkRpZmZlcmVudCBjaGFyYWN0ZXIgZW5jb2Rpbmcgc3VwcG9ydDwvbGk+DQotPGxpPkltcHJvdmVkIGluZm9zZXQgc3VwcG9ydCBpbiBBWElPTTwvbGk+DQotPGxpPkltcHJvdmVkIGNvZGUgZ2VuZXJhdGlvbiB0ZW1wbGF0ZXM8L2xpPg0KLTxsaT5OdW1lcm91cyBidWcgZml4ZXM8L2xpPg0KLTwvdWw+DQotPGEgaWQ9IjBfOTAiIG5hbWU9IjBfOTAiPjwvYT4NCi08aDI+MDIgSnVseSAyMDA1IC0gQXBhY2hlIEF4aXMyIFZlcnNpb24gMC45IFJlbGVhc2VkITwvaDI+DQotPHA+WzxhIGhyZWY9Imh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL2Rvd25sb2FkLmNnaSI+RG93bmxvYWQNCi0wLjk8L2E+XTwvcD4NCi08cD5BeGlzMiBpcyB0YWtpbmcgc2hhcGUuIFRoaXMgMC45IHJlbGVhc2UgaXMgYSBnbGltcHNlIG9mIHRoZSAxLjANCi10aGF0IHNob3VsZCBiZSBjb21pbmcgc29vbi4gVGhpcyAwLjkgcmVsZWFzZSBjb250YWlucyB0aGUgZm9sbG93aW5nDQotYWRkaXRpb25hbCBmZWF0dXJlczo8L3A+DQotPHVsPg0KLTxsaT5YTUwgQmVhbnMgYmFzZWQgZGF0YSBiaW5kaW5nIHN1cHBvcnQ8L2xpPg0KLTxsaT5TdXBwb3J0IGZvciBXUy1BZGRyZXNzaW5nLCBib3RoIHRoZSBzdWJtaXNzaW9uIGFuZCBmaW5hbA0KLXZlcnNpb25zPC9saT4NCi08bGk+UkVTVCBXZWIgU2VydmljZSBTdXBwb3J0PC9saT4NCi08bGk+TVRPTS9TV0EgYXR0YWNobWVudHMgc3VwcG9ydDwvbGk+DQotPGxpPlNBQUogaW1wbGVtZW50YXRpb248L2xpPg0KLTwvdWw+DQotPGEgaWQ9Ik0yIiBuYW1lPSJNMiI+PC9hPg0KLTxoMj4wNyBKdW5lIDIwMDUgLSBBcGFjaGUgQXhpczIgTWlsZXN0b25lIDIgKE0yKSBSZWxlYXNlZDwvaDI+DQotPHA+QXBhY2hlIEF4aXMyIGlzIHN0YXJ0aW5nIHRvIHRha2Ugc2hhcGUuIEZlYXR1cmVzIGltcGxlbWVudGVkIGluDQotdGhpcyBzZWNvbmQgbWlsZXN0b25lIHJlbGVhc2UgYXJlOjwvcD4NCi08dWw+DQotPGxpPk1vZHVsZXMgLSBhIG1lY2hhbmlzbSB0byBleHRlbmQgdGhlIFNPQVAgUHJvY2Vzc2luZyBNb2RlbDwvbGk+DQotPGxpPlN1cHBvcnQgZm9yIFdTLUFkZHJlc3Npbmc8L2xpPg0KLTxsaT5BeGlzMiBDbGllbnQgQVBJIC0gQmxvY2tpbmcgYW5kIE5vbi1CbG9ja2luZyBBUEk8L2xpPg0KLTxsaT5TdXBwb3J0IGZvciBPbmUtV2F5IE1lc3NhZ2luZyBhbmQgUmVxdWVzdCBSZXNwb25zZQ0KLU1lc3NhZ2luZzwvbGk+DQotPGxpPldTREwgQ29kZSBHZW5lcmF0aW9uIFRvb2wuPC9saT4NCi08bGk+SFRUUCwgU01UUCwgYW5kIFRDUCB0cmFuc3BvcnQgc3VwcG9ydDwvbGk+DQotPC91bD4NCi08Yj5UaGlzIHJlbGVhc2UgYWxzbyBpbmNsdWRlcyB0aGUgZm9sbG93aW5nIHRvb2xzOjwvYj4NCi08dWw+DQotPGxpPkFkbWluaXN0cmF0aW9uIHdlYiBhcHBsaWNhdGlvbiw8L2xpPg0KLTxsaT5XU0RMMldTLUVjbGlwc2UgcGx1Zy1pbjwvbGk+DQotPGxpPlNlcnZpY2UgQXJjaGl2ZSBXaXphcmQtIEVjbGlwc2UgcGx1Zy1pbjwvbGk+DQotPGxpPk1vZHVsZSBBcmNoaXZlIFdpemFyZC1FY2xpcHNlIHBsdWctaW48L2xpPg0KLTwvdWw+DQotPGEgaWQ9Ik0xIiBuYW1lPSJNMSI+PC9hPg0KLTxoMj4yNCBGZWJydWFyeSAyMDA1IC0gQXBhY2hlIEF4aXMyIE1pbGVzdG9uZSAxIChNMSkgUmVsZWFzZWQ8L2gyPg0KLTxwPlRoaXMgZmlyc3QgbWlsZXN0b25lIHJlbGVhc2Ugb2YgQXhpczIgaW5jbHVkZXMgdGhlIGZvbGxvd2luZw0KLWZlYXR1cmVzOjwvcD4NCi08dWw+DQotPGxpPkFYSU9NLCBhIFNPQVAgc3BlY2lmaWMgc3RyZWFtaW5nIFhNTCBpbmZvc2V0IG1vZGVsIGZvciBTT0FQDQotMS4xLzEuMiBNZXNzYWdlczwvbGk+DQotPGxpPldTREwgT2JqZWN0IE1vZGVsIGJ1aWx0IGJhc2VkIG9uIHRoZSBwcm9wb3NlZCBXU0RMIDIuMA0KLUNvbXBvbmVudCBNb2RlbC48L2xpPg0KLTxsaT5IYW5kbGVyIGZyYW1ld29yayB3aXRoIHRoZSBzdXBwb3J0IHRvIHNwZWNpZnkgdGhlIGxvY2F0aW9uIG9mDQotdGhlIEhhbmRsZXIgaW4gYSBzcGVjaWZpYyBQaGFzZTwvbGk+DQotPGxpPlN1cHBvcnQgdG8gYnVuZGxlIGFuZCBlbmFibGUgdGhlIEhhbmRsZXJzIGFzIE1vZHVsZXM8L2xpPg0KLTxsaT5TdXBwb3J0IGZvciB0aGUgU3luY2hyb25vdXMgYW5kIEFzeW5jaHJvbm91cyBJTi1PVVQgbWVzc2FnaW5nDQotb3ZlciBIVFRQIHRyYW5zcG9ydDwvbGk+DQotPGxpPkhvdCBkZXBsb3ltZW50IG9mIFdlYiBTZXJ2aWNlczwvbGk+DQotPC91bD4NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvYXJ0aWNsZXMueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9hcnRpY2xlcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1ZjVjOTUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9hcnRpY2xlcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNzkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi0NCi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMS8vRU4iDQotICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxMS9EVEQveGh0bWwxMS5kdGQiPg0KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4NCi08aGVhZD4NCi08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9DQotIkhUTUwgVGlkeSBmb3IgV2luZG93cyAodmVycyAxNCBKdW5lIDIwMDcpLCBzZWUgd3d3LnczLm9yZyIgLz4NCi08bWV0YSBodHRwLWVxdWl2PSJjb250ZW50LXR5cGUiIGNvbnRlbnQ9DQotInRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4NCi08dGl0bGU+QXhpczIgS25vd2xlZGdlIEJhc2U8L3RpdGxlPg0KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0NCi0iYW1heWEgOS4yLjEsIHNlZSBodHRwOi8vd3d3LnczLm9yZy9BbWF5YS8iIC8+DQotPGxpbmsgaHJlZj0iY3NzL2F4aXMtZG9jcy5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiDQotbWVkaWE9ImFsbCIgLz4NCi08L2hlYWQ+DQotPGJvZHk+DQotPGgxPkFwYWNoZSBBeGlzMiBSZWZlcmVuY2VzPC9oMT4NCi08cD5UaGlzIHBhZ2UgY29udGFpbnMgYXJ0aWNsZXMsIHR1dG9yaWFscywgcHJlc2VudGF0aW9ucyBhbmQNCi1xdWVzdGlvbiBhbmQgYW5zd2VycyBwdWJsaXNoZWQgb24gdmFyaW91cyBXZWIgc2l0ZXMgb24gdGhlIEFwYWNoZQ0KLUF4aXMyIGVuZ2luZS4gVGhlc2UgcmVmZXJlbmNlcyB3aWxsIHByb3ZlIHRvIGJlIGEgZ3JlYXQgaGVscCBpbg0KLWJvb3N0aW5nIHlvdXIga25vd2xlZGdlIG9uIEF4aXMyLjwvcD4NCi08aDI+Qm9va3M6PC9oMj48dWw+PGxpPjxhIGNsYXNzPSJleHRlcm5hbExpbmsiIGhyZWY9Imh0dHA6Ly93d3cucGFja3RwdWIuY29tL2FydGljbGUvY3JlYXRlLXF1YWxpdHktd2ViLXNlcnZpY2VzLXdpdGgtcXVpY2t0c3RhcnQtYXBhY2hlLWF4aXMyIj4NCi1RdWlja3RzdGFydCBBcGFjaGUgQXhpczI8L2E+DQotLSBCeSBEZWVwYWwgSmF5YXNpbmdoZTwvbGk+DQotPGltZyBhbHQ9IlF1aWNrdHN0YXJ0IEFwYWNoZSBBeGlzMiIgc3JjPSJodHRwOi8vaW1hZ2VzLnBhY2t0cHViLmNvbS9pbWFnZXMvMTAweDEyMy8xODQ3MTkyODY2LnBuZyI+PC9pbWc+DQotDQotPC91bD4NCi08aDI+QXJ0aWNsZXM6PC9oMj4NCi08dWw+DQotPGxpPjxhIGhyZWY9DQotImh0dHA6Ly93d3cuamF4bWFnLmNvbS9pdHIvb25saW5lX2FydGlrZWwvcHNlY29tLGlkLDc0Nyxub2RlaWQsMTQ3Lmh0bWwiPg0KLUF4aXMyIC0gVGhlIEZ1dHVyZSBvZiBXZWIgU2VydmljZXM8L2E+LSBCeSBTcmluYXRoIFBlcmVyYSwgQWppdGgNCi1SYW5hYmFodTwvbGk+DQotPGxpPjxhIGhyZWY9DQotImh0dHA6Ly93d3cuZGV2ZWxvcGVyLmNvbS9zZXJ2aWNlcy9hcnRpY2xlLnBocC8zNTI1NDgxIj5JbnRyb2R1Y2luZw0KLUF4aXMyLCB0aGUgTmV4dCBHZW5lcmF0aW9uIG9mIHRoZSBBcGFjaGUgV2ViIFNlcnZpY2UgU3RhY2s8L2E+LSBCeQ0KLVNyaW5hdGggUGVyZXJhPC9saT4NCi08bGk+PGEgaHJlZj0NCi0iaHR0cDovL3d3dy5vbmphdmEuY29tL3B1Yi9hL29uamF2YS8yMDA1LzA3LzI3L2F4aXMyLmh0bWwiPldlYg0KLVNlcnZpY2VzIE1lc3NhZ2luZyB3aXRoIEFwYWNoZSBBeGlzMjogQ29uY2VwdHMgYW5kIFRlY2huaXF1ZXM8L2E+LQ0KLUJ5IFNyaW5hdGggUGVyZXJhLCBBaml0aCBSYW5hYmFodSAoMjcgSnVseSAyMDA1KTwvbGk+DQotPGxpPjxhIGhyZWY9DQotImh0dHA6Ly9kZXZlbG9wZXIuY29tL2phdmEvd2ViL2FydGljbGUucGhwLzM1MjkzMjEiPkF4aXMyIEV4ZWN1dGlvbg0KLUZyYW1ld29yazwvYT4tIEJ5IERlZXBhbCBKYXlhc2luZ2hlPC9saT4NCi08bGk+PGEgaHJlZj0NCi0iaHR0cDovL2pheG1hZy5jb20vaXRyL29ubGluZV9hcnRpa2VsL3BzZWNvbSxpZCw3NTcsbm9kZWlkLDE0Ny5odG1sIj4NCi1BeGlzMiBEZXBsb3ltZW50IE1vZGVsPC9hPi0gQnkgRGVlcGFsIEpheWFzaW5naGU8L2xpPg0KLTxsaT48YSBocmVmPQ0KLSJodHRwOi8vd3d3LmRldmVsb3Blci5jb20vb3Blbi9hcnRpY2xlLnBocC8zNTU3NzQxIj5VbmRlcnN0YW5kaW5nDQotQXhpczIgRGVwbG95bWVudCBBcmNoaXRlY3R1cmU8L2E+LSBCeSBEZWVwYWwgSmF5YXNpbmdoZTwvbGk+DQotPGxpPjxhIGhyZWY9DQotImh0dHA6Ly93d3cud3NvMi5uZXQvYXJ0aWNsZXMvYXhpczIvamF2YS8yMDA2LzAyLzA2L2luc2lkZS1jb2RlZ2VuIj4NCi1JbnNpZGUgdGhlIEF4aXMyIENvZGUgR2VuZXJhdG9yPC9hPi0gQnkgQWppdGggUmFuYWJhaHUgKDA2IEZlYg0KLTIwMDYpPC9saT4NCi08bGk+PGEgaHJlZj0NCi0iaHR0cDovL3d3dy5kZXZlbG9wZXIuY29tL2phdmEvb3RoZXIvYXJ0aWNsZS5waHAvMzU3MDAzMSI+VXRpbGl6aW5nDQotYSBOb24tSmF2YSBXZWIgU2VydmljZSB3aXRoIEF4aXMyPC9hPi0gQnkgRGVlcGFsIEpheWFzaW5naGU8L2xpPg0KLTxsaT48YSBocmVmPQ0KLSJodHRwOi8vd3d3LmRldmVsb3Blci5jb20vb3Blbi9hcnRpY2xlLnBocC8zNTg5MTI2Ij5Bdm9pZGluZw0KLU1pc3Rha2VzIE1hZGUgVXNpbmcgQXhpczI8L2E+LSBCeSBEZWVwYWwgSmF5YXNpbmdoZTwvbGk+DQotPGxpPjxhIGhyZWY9DQotImh0dHA6Ly93d3ctMTI4LmlibS5jb20vZGV2ZWxvcGVyd29ya3MvamF2YS9saWJyYXJ5L29zLWFnLWF4aXMybWlnL2luZGV4Lmh0bWwiPg0KLU1pZ3JhdGluZyBBcGFjaGUgQXhpcyBhcHBzIHRvIEF4aXMyIHVzaW5nIEFwYWNoZSBHZXJvbmltbzwvYT4tIEJ5DQotVHlsZXIgQW5kZXJzb24gKDA3IE1hciAyMDA2KTwvbGk+DQotPGxpPjxhIGhyZWY9DQotImh0dHA6Ly93d3cuZGV2ZWxvcGVyLmNvbS9qYXZhL2VudC9hcnRpY2xlLnBocC8zNjA2NDY2Ij5UaGUgQXhpczINCi1UcmFuc3BvcnQgRnJhbWV3b3JrPC9hPi0gQnkgRGVlcGFsIEpheWFzaW5naGU8L2xpPg0KLTxsaT48YSBocmVmPQ0KLSJodHRwOi8vd3d3LndzbzIubmV0L2FydGljbGVzL2F4aXMyL2phdmEvMjAwNi8wOC8wMS9jbGllbnQtYXBpLXBhcmFtZXRlcnMiPg0KLVJlZmVyZW5jZSBHdWlkZSB0byBBcGFjaGUgQXhpczIgQ2xpZW50IEFQSSBQYXJhbWV0ZXJzPC9hPi0gQnkgRXJhbg0KLUNoaW50aGFrYSAoMDEgQXVnIDIwMDYpPC9saT4NCi08bGk+PGEgaHJlZj0NCi0iaHR0cDovL3d3dy53c28yLm5ldC9hcnRpY2xlcy9heGlzMi9qYXZhLzIwMDYvMDUvMTcvYXhpczItcGVyZm9ybWFuY2UtdGVzdGluZy1yb3VuZC0xIj4NCi1BeGlzMiAtIFBlcmZvcm1hbmNlIFRlc3RpbmcgUm91bmQgIzE8L2E+LSBCeQ0KLURldmFudW0gU2lyaW5pdmFzICgxNyBNYXkgMjAwNik8L2xpPg0KLTxsaT48YSBocmVmPQ0KLSJodHRwOi8vd3d3LndzbzIubmV0L2FydGljbGVzL2F4aXMyL2phdmEvMjAwNi8wOS8xMy93b3JraW5nLXdpdGgtYXhpczIiPg0KLVdvcmtpbmcgV2l0aCBBcGFjaGUgQXhpczI8L2E+LSBEZWVwYWwgSmF5YXNpbmdoZSAoMTMgU2VwIDIwMDYpPC9saT4NCi08bGk+PGEgaHJlZj0NCi0iaHR0cDovL3d3dy5kZXZlbG9wZXIuY29tL2phdmEvZW50L2FydGljbGUucGhwLzM2MTM4OTYiPldyaXRpbmcgYW4NCi1BcGFjaGUgQXhpczIgU2VydmljZSBmcm9tIFNjcmF0Y2g8L2E+LSBCeSBEZWVwYWwgSmF5YXNpbmdoZSAoMjANCi1KdW5lIDIwMDYpPC9saT4NCi08bGk+PGEgaHJlZj0NCi0iaHR0cDovL3d3dy5kZXZlbG9wZXIuY29tL2phdmEvd2ViL2FydGljbGUucGhwLzM2MjA2NjEiPkFwYWNoZQ0KLUF4aXMyIFNlc3Npb24gTWFuYWdlbWVudDwvYT4tIEJ5IERlZXBhbCBKYXlhc2luZ2hlPC9saT4NCi08bGk+PGEgaHJlZj0iaHR0cDovL3d3dy5kZXZ4LmNvbS9KYXZhL0FydGljbGUvMzM4MzkiPkFwYWNoZSBBeGlzMg0KLXdpdGggUE9KTydzIGFuZCBTcHJpbmc8L2E+LSBCeSBSYW1hbnVqYW0gQS4gUmFvPC9saT4NCi0NCi08bGk+PGEgaHJlZj0NCi0iaHR0cDovL3d3dy0xMjguaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy93ZWJzZXJ2aWNlcy9saWJyYXJ5L3dzLWF4aXMyc29hcC8iPg0KLVNpeCB3YXlzIHRoZSBBeGlzMiBkZXBsb3ltZW50IG1vZGVsIGlzIG1vcmUgdXNlciBmcmllbmRseTwvYT4tIEJ5IERlZXBhbCBKYXlhc2luZ2hlPC9saT4NCi08bGk+PGEgaHJlZj0iaHR0cDovL3RvZGF5LmphdmEubmV0L3B1Yi9hL3RvZGF5LzIwMDYvMTIvMTMvaW52b2tpbmctd2ViLXNlcnZpY2VzLXVzaW5nLWFwYWNoZS1heGlzMi5odG1sIj4NCi1JbnZva2luZyBXZWIgU2VydmljZXMgdXNpbmcgQXBhY2hlIEF4aXMyDQotPC9hPi0gQnkgRGVlcGFsIEpheWFzaW5naGU8L2xpPg0KLTxsaT48YSBocmVmPSJodHRwOi8vd3NvMi5vcmcvbGlicmFyeS8yMDYwIj4NCi1Xcml0aW5nIFlvdXIgT3duIHNlcnZpY2VzLnhtbCBmb3IgQXhpczIgV2ViIFNlcnZpY2VzPC9hPi0gQnkgRGVlcGFsIEpheWFzaW5naGU8L2xpPg0KLTxsaT48YSBocmVmPSJodHRwOi8vd3NvMi5vcmcvbGlicmFyeS8yMDY4Ij4NCi1BREIgR2VuZXJhdGVkIENvZGUgaW4gQXBhY2hlIEF4aXMyPC9hPi0gQnkgQW1pbGEgU3VyaWFyYWNoY2hpPC9saT4NCi0NCi08bGk+PGEgaHJlZj0iaHR0cDovL3d3dy5pYm0uY29tL2RldmVsb3BlcndvcmtzL3dlYnNlcnZpY2VzL2xpYnJhcnkvd3MtamF2YTIvIj5KYXZhDQotV2ViIHNlcnZpY2VzLCBQYXJ0IDI6IERpZ2dpbmcgaW50byBBeGlzMjogQVhJT008L2E+IC0gQnkgRGVubmlzIFNvc25vc2tpICgzMCBOb3YNCi0yMDA2KTwvbGk+DQotPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy93ZWJzZXJ2aWNlcy9saWJyYXJ5L3dzLWphdmEzLyI+SmF2YQ0KLVdlYiBzZXJ2aWNlcywgUGFydCAzOiBBeGlzMiBEYXRhIEJpbmRpbmc8L2E+IC0gQnkgRGVubmlzIFNvc25vc2tpICgyNiBKdWwNCi0yMDA3KTwvbGk+DQotDQotDQotPC91bD4NCi08aDI+VHV0b3JpYWxzPC9oMj4NCi08dWw+DQotPGxpPjxhIGhyZWY9Imh0dHA6Ly93c28yLm9yZy9saWJyYXJ5LzE0MCI+SW50cm9kdWNpbmcgQXhpczI8L2E+LSBCeQ0KLUVyYW4gQ2hpbnRoYWthLCBDaGF0aHVyYSBIZXJhdGggKDA1IEp1bmUgMjAwNik8L2xpPg0KLTxsaT48YSBocmVmPSJodHRwOi8vd3NvMi5vcmcvbGlicmFyeS8xNDEiPkFjY2VsZXJhdGluZyBXZWIgU2VydmljZXMNCi1EZXZlbG9wbWVudCB3aXRoIEF4aXMyPC9hPi0gQnkgRGVlcGFsIEpheWFzaW5naGUsIEFqaXRoIFJhbmFiYWh1DQotKDA1IEp1bmUgMjAwNik8L2xpPg0KLTxsaT48YSBocmVmPSJodHRwOi8vd3NvMi5vcmcvbGlicmFyeS85NSI+SGVsbG8gV29ybGQgd2l0aCBBcGFjaGUNCi1BeGlzMjwvYT4tIEJ5IFJ1Y2hpdGggRmVybmFuZG8gKDI5IE1heSAyMDA2KTwvbGk+DQotPGxpPjxhIGhyZWY9Imh0dHA6Ly93c28yLm9yZy9saWJyYXJ5LzE3NiI+SG93IEFwYWNoZSBBeGlzMiBGaW5kcw0KLXRoZSBPcGVyYXRpb24gYW5kIFNlcnZpY2UgYSBNZXNzYWdlIGlzIERlc3RpbmVkIFRvPC9hPi0gQnkgRXJhbg0KLUNoaW50aGFrYSgxOCBKdW5lIDIwMDYpPC9saT4NCi08bGk+PGEgaHJlZj0iaHR0cDovL3dzbzIub3JnL2xpYnJhcnkvMjI1Ij5Ib3cgdG8gRGVidWcgYSBXZWINCi1TZXJ2aWNlPzwvYT4tIEJ5IEFqaXRoIFJhbmFiYWh1ICgyOCBKdWx5IDIwMDYpPC9saT4NCi08L3VsPg0KLTxoMj5QcmVzZW50YXRpb25zPC9oMj4NCi08dWw+DQotPGxpPjxhIGhyZWY9Imh0dHA6Ly93c28yLm9yZy9saWJyYXJ5LzEzNiI+V2h5IEF4aXMyOiBUaGUgRnV0dXJlIG9mDQotV2ViIFNlcnZpY2VzPC9hPi0gQnkgRXJhbiBDaGludGhha2EgKDA1IEp1bmUgMjAwNik8L2xpPg0KLTxsaT48YSBocmVmPSJodHRwOi8vd3NvMi5vcmcvbGlicmFyeS8yNDciPkJ1aWxkaW5nIEVudGVycHJpc2UNCi1BcHBsaWNhdGlvbnMgd2l0aCBBeGlzMi1UdXRvcmlhbCBmcm9tIEFwYWNoZUNvbiBBc2lhIDIwMDY8L2E+LSBCeQ0KLURlZXBhbCBKYXlhc2luZ2hlLCBSdWNoaXRoIEZlcm5hbmRvICgzMCBBdWcgMjAwNik8L2xpPg0KLTxsaT48YSBocmVmPSJodHRwOi8vd3NvMi5vcmcvbGlicmFyeS8xMzciPkludHJvZHVjaW5nIEF4aXMyPC9hPi0gQnkNCi1Baml0aCBSYW5hYmFodSAoMDUgSnVuZSAyMDA2KTwvbGk+DQotPC91bD4NCi08aDI+UXVlc3Rpb25zIGFuZCBBbnN3ZXJzPC9oMj4NCi08dWw+DQotPGxpPjxhIGhyZWY9Imh0dHA6Ly93c28yLm9yZy9saWJyYXJ5LzY3Ij5TZXR0aW5nIHVwIEFwYWNoZSBBeGlzMiBpbg0KLWVjbGlwc2UgSURFPC9hPi0gQnkgUnVjaGl0aCBGZXJuYW5kbyAoMDQgQXByaWwgMjAwNik8L2xpPg0KLTxsaT48YSBocmVmPSJodHRwOi8vd3NvMi5vcmcvbGlicmFyeS84MyI+SG93IGRvIEkgRW1iZWQNCi1TaW1wbGVIVFRQU2VydmVyIGluIE15IEFwcGxpY2F0aW9uIGFuZCBEZXBsb3kgYSBQT0pPPzwvYT4tIEJ5DQotRGF2YW51bSBTaXJpbml2YXMgKDA5IE1heSAyMDA2KTwvbGk+DQotPGxpPjxhIGhyZWY9Imh0dHA6Ly93c28yLm9yZy9saWJyYXJ5LzIwOSI+SG93IHRvIENvbmZpZ3VyZSBBeGlzMidzDQotSFRUUCBUcmFuc3BvcnQgU2VuZGVyIGF0IENsaWVudCBTaWRlPzwvYT4tIEJ5IFNhbWluZGEgQWJleXNpbmdoZQ0KLSgxMUp1bHkgMjAwNik8L2xpPg0KLTxsaT48YSBocmVmPSJodHRwOi8vd3NvMi5vcmcvbGlicmFyeS8xNzUiPkhvdyB0byBkbyBSRVNUIGludm9jYXRpb24NCi13aXRoIEF4aXMyL0phdmEgU2VydmljZUNsaWVudD88L2E+LSBCeSBFcmFuIENoaW50aGFrYSAoMTcgSnVuZQ0KLTIwMDYpPC9saT4NCi08bGk+PGEgaHJlZj0iaHR0cDovL3dzbzIub3JnL2xpYnJhcnkvOTAiPkhvdyB0byBFbWJlZCBhbiBBeGlzMg0KLWJhc2VkIFdlYiBTZXJ2aWNlIGluIHlvdXIgV2ViYXBwPzwvYT4tIEJ5IERhdmFudW0gU2lyaW5pdmFzKDE3IE1heQ0KLTIwMDYpPC9saT4NCi08L3VsPg0KLTxoMj5PdGhlcjwvaDI+DQotPHVsPg0KLTxsaT48YSBocmVmPQ0KLSJodHRwOi8vcHpmLmZyZW1hbnRsZS5vcmcvMjAwNy8wNS9nZXR0aW5nLXN0YXJ0ZWQtd2l0aC13c3JtLWFuZC1heGlzMi5odG1sIj4NCi1HZXR0aW5nIHN0YXJ0ZWQgd2l0aCBBeGlzMiBhbmQgU2FuZGVzaGEyIHRvIGRvDQotV1MtUmVsaWFibGVNZXNzYWdpbmc8L2E+PC9saT4NCi08L3VsPg0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9jc3MvYXhpcy1kb2NzLmNzcyBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvY3NzL2F4aXMtZG9jcy5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1NzcxN2IuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9jc3MvYXhpcy1kb2NzLmNzcworKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotLmltZy10aXRsZSB7DQotICAgIHRleHQtYWxpZ246IGNlbnRlcg0KLX0NCi0NCi0uaW1nIHsNCi0gICAgdGV4dC1hbGlnbjogY2VudGVyDQotfQ0KLQ0KLS5zcGVjaWFsLXRkIHsNCi0gICAgZm9udC1mYW1pbHk6IEFyaWFsOw0KLSAgICBmb250LXNpemU6IDEwcHQ7DQotICAgIGZvbnQtd2VpZ2h0OiBib2xkDQotfQ0KLQ0KLS5zcGVjaWFsIHsNCi0gICAgZm9udC1mYW1pbHk6IEFyaWFsOw0KLSAgICBmb250LXdlaWdodDogYm9sZDsNCi0gICAgYm9yZGVyLXN0eWxlOiBzb2xpZDsNCi0gICAgYm9yZGVyLXdpZHRoOiAxOw0KLSAgICBwYWRkaW5nLWxlZnQ6IDQ7DQotICAgIHBhZGRpbmctcmlnaHQ6IDQ7DQotICAgIHBhZGRpbmctdG9wOiAxOw0KLSAgICBwYWRkaW5nLWJvdHRvbTogMTsNCi0gICAgYmFja2dyb3VuZC1jb2xvcjogI0MwQzBDMDsNCi0gICAgZm9udC1zaXplOiAxMHB0DQotfQ0KLQ0KLS54bWwgew0KLSAgICBmb250LWZhbWlseTogQXJpYWw7DQotICAgIGZvbnQtc2l6ZTogMTBwdDsNCi0gICAgY29sb3I6ICMwMDAwRkY7DQotICAgIGZvbnQtc3R5bGU6IGl0YWxpYw0KLX0NCi0NCi0uY29kZSB7DQotICAgIGZvbnQtZmFtaWx5OiBDb3VyaWVyIE5ldzsNCi0gICAgZm9udC1zaXplOiAxMHB0Ow0KLSAgICBjb2xvcjogIzgwMDAwMA0KLX0NCi0NCi0vKg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotR2VuZXJpYyBlbGVtZW50IHN0eWxlcw0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQotYm9keSB7DQotICAgIGNvbG9yOiAjMTExOw0KLSAgICBmb250OiAxMXB4IC8gMS41IHZlcmRhbmEsIGFyaWFsOw0KLSAgICBtYXJnaW46IDEwOw0KLSAgICBwYWRkaW5nOiA1Ow0KLSAgICBib3JkZXItd2lkdGg6IDA7DQotICAgIG91dGxpbmUtd2lkdGg6IDA7DQotICAgIGxpc3Qtc3R5bGUtcG9zaXRpb246IG91dHNpZGU7DQotICAgIGRpc3BsYXk6IGJsb2NrOw0KLX0NCi0NCi1wIHsNCi19DQotDQotYSwgYTpsaW5rIHsNCi0gICAgY29sb3I6ICMwMzk7DQotICAgIGZvbnQtc2l6ZTogMTFweDsNCi19DQotDQotYTpob3ZlciB7DQotICAgIGNvbG9yOiAjMDNjOw0KLSAgICBmb250LXNpemU6IDExcHg7DQotICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsNCi19DQotDQotYTp2aXNpdGVkIHsNCi0gICAgZm9udC1zaXplOiAxMXB4OyAvKiBjb2xvcjogIzk2OTsgKi8NCi0vKiBObyBuZWVkIHRvIGRpc2NvbG91ciB2aXNpdGVkIGxpbmtzIGFzIHRoaXMgaXMgYSBzeXN0ZW0gKi8NCi19DQotDQotdWwsIG9sIHsNCi0gICAgZm9udC1zaXplOiAxMXB4Ow0KLSAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KLSAgICBsaXN0LXN0eWxlLXBvc2l0aW9uOiBvdXRzaWRlOw0KLSAgICBkaXNwbGF5OiBibG9jazsNCi0gICAgd2hpdGUtc3BhY2U6IG5vcm1hbDsNCi19DQotDQotdGFibGUgdGQgew0KLSAgICBmb250LXNpemU6IDExcHg7DQotICAgIHBhZGRpbmc6IDBweDsNCi0gICAgc3BhY2luZzogMHB4Ow0KLSAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KLSAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOw0KLX0NCi0NCi1oMSB7DQotICAgIGNvbG9yOiAjMDAwOw0KLSAgICBmb250LXNpemU6IDE2cHg7DQotICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGNkY2RjOw0KLSAgICBwYWRkaW5nLWxlZnQ6IDEwcHg7DQotfQ0KLQ0KLWgyIHsNCi0gICAgZm9udC1zaXplOiAxNXB4Ow0KLSAgICBwYWRkaW5nLWxlZnQ6IDEwcHg7DQotICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjYTlhOWE5Ow0KLSAgICBib3JkZXItbGVmdC1jb2xvcjogYmxhY2s7DQotfQ0KLQ0KLWgzIHsNCi0gICAgZm9udC1zaXplOiAxNHB4Ow0KLSAgICBwYWRkaW5nLWxlZnQ6IDEwcHg7DQotICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZDNkM2QzOw0KLX0NCi0NCi1oNCB7DQotICAgIGZvbnQtc2l6ZTogMTNweDsNCi19DQotDQotdGggew0KLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjVmNWY1Ow0KLSAgICBoZWlnaHQ6IDIwOw0KLSAgICBwYWRkb25nOiAwcHg7DQotICAgIHNwYWNpbmc6IDBweDsNCi19DQotDQotdGFibGUgew0KLSAgICBtYXJnaW46IDA7DQotICAgIHBhZGRpbmc6IDA7DQotICAgIGJvcmRlcjogc29saWQgMCAjZGNkY2RjOw0KLX0NCi0NCi0uaGVhZGVyIHsNCi0gICAgaGVpZ2h0OiA4MHB4Ow0KLSAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIC4uL2ltYWdlcy9kb2NfaGVhZGVyLmpwZyApOw0KLSAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0Ow0KLSAgICBiYWNrZ3JvdW5kLWF0dGFjaG1lbnQ6IHNjcm9sbDsNCi0gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogbGVmdCB0b3A7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvZG9hcF9BeGlzMi5yZGYgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL2RvYXBfQXhpczIucmRmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzBiODkyLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvZG9hcF9BeGlzMi5yZGYKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08P3htbC1zdHlsZXNoZWV0IHR5cGU9InRleHQveHNsIj8+Ci08cmRmOlJERiB4bWw6bGFuZz0iZW4iCi0gICAgICAgICB4bWxucz0iaHR0cDovL3VzZWZ1bGluYy5jb20vbnMvZG9hcCMiIAotICAgICAgICAgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIiAKLSAgICAgICAgIHhtbG5zOmFzZmV4dD0iaHR0cDovL3Byb2plY3RzLmFwYWNoZS5vcmcvbnMvYXNmZXh0IyIKLSAgICAgICAgIHhtbG5zOmZvYWY9Imh0dHA6Ly94bWxucy5jb20vZm9hZi8wLjEvIj4KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLSAgPFByb2plY3QgcmRmOmFib3V0PSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMiI+Ci0gICAgPGNyZWF0ZWQ+MjAwNy0wNi0wODwvY3JlYXRlZD4KLSAgICA8bGljZW5zZSByZGY6cmVzb3VyY2U9Imh0dHA6Ly91c2VmdWxpbmMuY29tL2RvYXAvbGljZW5zZXMvYXNsMjAiIC8+Ci0gICAgPG5hbWU+QXBhY2hlIFN5bmFwc2U8L25hbWU+Ci0gICAgPGhvbWVwYWdlIHJkZjpyZXNvdXJjZT0iaHR0cDovL3dzLmFwYWNoZS5vcmcvc3luYXBzZSIgLz4KLSAgICA8YXNmZXh0OnBtYyByZGY6cmVzb3VyY2U9Imh0dHA6Ly93ZWJzZXJ2aWNlcy5hcGFjaGUub3JnIiAvPgotICAgIDxzaG9ydGRlc2M+QXBhY2hlIEF4aXMyIGlzIGEgc2VydmljZSBob3N0aW5nIGFuZCBjb25zdW1wdGlvbiBmcmFtZXdvcmsgdGhhdCBtYWtlcyBpdCBlYXN5IHRvIHVzZSBTT0FQIGFuZCBXZWIgU2VydmljZXM8L3Nob3J0ZGVzYz4KLSAgICA8ZGVzY3JpcHRpb24+QXBhY2hlIEF4aXMyIGlzIGEgdG9vbGtpdCBmb3IgY3JlYXRpbmcgYW5kIHVzaW5nIFdlYiBTZXJ2aWNlcywgaW5jbHVkaW5nIFNPQVAsIE1UT00sIFhNTC9IVFRQIGFuZCBhZHZhbmNlZCBXUy0qIHN0YW5kYXJkcyBzdWNoIGFzIFdTUk0gYW5kIFdTU2VjdXJpdHkuCi0gICAgQXhpczIgaW5jbHVkZXMgYSB2ZXJ5IGZhc3QgcnVudGltZSBlbmdpbmUsIHRvZ2V0aGVyIHdpdGggdG9vbGluZyBzdXBwb3J0IGZvciBXU0RMIGFuZCBXUy1Qb2xpY3ksIGFuZCBwbHVnaW4gc3VwcG9ydCBmb3IgV1MtQWRkcmVzc2luZywgV1MtUmVsaWFibGVNZXNzYWdpbmcsIFdTLVNlY3VyaXR5LCAKLSAgICBXUy1FdmVudGluZywgV1MtVHJhbnNhY3Rpb25zLCBXUy1UcnVzdCBhbmQgV1MtU2VjdXJlQ29udmVyc2F0aW9uLgotICAgIEF4aXMyIHJ1bnMgZWl0aGVyIHN0YW5kYWxvbmUgb3IgaG9zdGVkIGluIFRvbWNhdCBvciBvdGhlciBzZXJ2bGV0IGNvbnRhaW5lcnMuIAotICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgPGJ1Zy1kYXRhYmFzZSByZGY6cmVzb3VyY2U9Imh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvQVhJUzIiIC8+Ci0gICAgPG1haWxpbmctbGlzdCByZGY6cmVzb3VyY2U9Imh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL21haWwtbGlzdHMuaHRtbCIgLz4KLSAgICA8ZG93bmxvYWQtcGFnZSByZGY6cmVzb3VyY2U9Imh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL2Rvd25sb2FkLmNnaSIgLz4KLSAgICA8cHJvZ3JhbW1pbmctbGFuZ3VhZ2U+SmF2YTwvcHJvZ3JhbW1pbmctbGFuZ3VhZ2U+Ci0gICAgPHByb2dyYW1taW5nLWxhbmd1YWdlPkM8L3Byb2dyYW1taW5nLWxhbmd1YWdlPgotICAgIDxjYXRlZ29yeSByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wcm9qZWN0cy5hcGFjaGUub3JnL2NhdGVnb3J5L3htbCIgLz4KLSAgICA8Y2F0ZWdvcnkgcmRmOnJlc291cmNlPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvY2F0ZWdvcnkvaHR0cCIvPgotICAgIDxjYXRlZ29yeSByZGY6cmVzb3VyY2U9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9jYXRlZ29yeS9uZXR3b3JrLXNlcnZlciIvPgotICAgIDxjYXRlZ29yeSByZGY6cmVzb3VyY2U9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9jYXRlZ29yeS9uZXR3b3JrLWNsaWVudCIvPgotICAgIAotICAgIDxyZWxlYXNlPgotICAgICAgPFZlcnNpb24+Ci0gICAgICAgIDxuYW1lPkFwYWNoZSBBeGlzMiAxLjA8L25hbWU+Ci0gICAgICAgIDxjcmVhdGVkPjIwMDYtMDUtMDQ8L2NyZWF0ZWQ+Ci0gICAgICAgIDxyZXZpc2lvbj4xLjA8L3JldmlzaW9uPgotICAgICAgPC9WZXJzaW9uPgotICAgIDwvcmVsZWFzZT4KLSAgICA8cmVsZWFzZT4KLSAgICAgIDxWZXJzaW9uPgotICAgICAgICA8bmFtZT5BcGFjaGUgQXhpczIgMS4xPC9uYW1lPgotICAgICAgICA8Y3JlYXRlZD4yMDA2LTExLTEzPC9jcmVhdGVkPgotICAgICAgICA8cmV2aXNpb24+MS4xPC9yZXZpc2lvbj4KLSAgICAgIDwvVmVyc2lvbj4KLSAgICA8L3JlbGVhc2U+Ci0gICAgPHJlbGVhc2U+Ci0gICAgICA8VmVyc2lvbj4KLSAgICAgICAgPG5hbWU+QXBhY2hlIEF4aXMyIDEuMS4xPC9uYW1lPgotICAgICAgICA8Y3JlYXRlZD4yMDA3LTAxLTA5PC9jcmVhdGVkPgotICAgICAgICA8cmV2aXNpb24+MS4xLjE8L3JldmlzaW9uPgotICAgICAgPC9WZXJzaW9uPgotICAgIDwvcmVsZWFzZT4KLSAgICAKLSAgICA8cmVsZWFzZT4KLSAgICAgIDxWZXJzaW9uPgotICAgICAgICA8bmFtZT5BcGFjaGUgQXhpczIgMS4yPC9uYW1lPgotICAgICAgICA8Y3JlYXRlZD4yMDA3LTA0LTI3PC9jcmVhdGVkPgotICAgICAgICA8cmV2aXNpb24+MS4yPC9yZXZpc2lvbj4KLSAgICAgIDwvVmVyc2lvbj4KLSAgICA8L3JlbGVhc2U+Ci0gICAgCi0gICAgPHJlcG9zaXRvcnk+Ci0gICAgICA8U1ZOUmVwb3NpdG9yeT4KLSAgICAgICAgPGxvY2F0aW9uIHJkZjpyZXNvdXJjZT0iaHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi93ZWJzZXJ2aWNlcy9heGlzMi90cnVuay9qYXZhIi8+Ci0gICAgICAgIDxicm93c2UgcmRmOnJlc291cmNlPSJodHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL3dlYnNlcnZpY2VzL2F4aXMyL3RydW5rL2phdmEvIi8+Ci0gICAgICA8L1NWTlJlcG9zaXRvcnk+Ci0gICAgPC9yZXBvc2l0b3J5PgotICAgIDxtYWludGFpbmVyPgotICAgICAgPGZvYWY6UGVyc29uPgotICAgICAgICA8Zm9hZjpuYW1lPlBhdWwgRnJlbWFudGxlPC9mb2FmOm5hbWU+Ci0gICAgICAgICAgPGZvYWY6bWJveCByZGY6cmVzb3VyY2U9Im1haWx0bzpwemZAYXBhY2hlLm9yZyIvPgotICAgICAgPC9mb2FmOlBlcnNvbj4KLSAgICA8L21haW50YWluZXI+Ci0gICAgPGFzZmV4dDppbXBsZW1lbnRzPjxhc2ZleHQ6U3RhbmRhcmQ+Ci0gICAgICA8YXNmZXh0OnRpdGxlPlNPQVAxLjE8L2FzZmV4dDp0aXRsZT4KLSAgICAgIDxhc2ZleHQ6Ym9keT5XM0M8L2FzZmV4dDpib2R5PgotICAgICAgPGFzZmV4dDppZD5TT0FQMS4xPC9hc2ZleHQ6aWQ+Ci0gICAgICA8YXNmZXh0OnVybCByZGY6cmVzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3NvYXAvIi8+Ci0gICAgPC9hc2ZleHQ6U3RhbmRhcmQ+PC9hc2ZleHQ6aW1wbGVtZW50cz4KLSAgICA8YXNmZXh0OmltcGxlbWVudHM+PGFzZmV4dDpTdGFuZGFyZD4KLSAgICAgIDxhc2ZleHQ6dGl0bGU+U09BUDEuMjwvYXNmZXh0OnRpdGxlPgotICAgICAgPGFzZmV4dDpib2R5PlczQzwvYXNmZXh0OmJvZHk+Ci0gICAgICA8YXNmZXh0OmlkPlNPQVAxLjI8L2FzZmV4dDppZD4KLSAgICAgIDxhc2ZleHQ6dXJsIHJkZjpyZXNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIvc29hcDEyLXBhcnQxLyIvPgotICAgIDwvYXNmZXh0OlN0YW5kYXJkPjwvYXNmZXh0OmltcGxlbWVudHM+Ci0gICAgPGFzZmV4dDppbXBsZW1lbnRzPjxhc2ZleHQ6U3RhbmRhcmQ+Ci0gICAgICA8YXNmZXh0OnRpdGxlPk1UT008L2FzZmV4dDp0aXRsZT4KLSAgICAgIDxhc2ZleHQ6Ym9keT5XM0M8L2FzZmV4dDpib2R5PgotICAgICAgPGFzZmV4dDppZD5TT0FQLU1UT008L2FzZmV4dDppZD4KLSAgICAgIDxhc2ZleHQ6dXJsIHJkZjpyZXNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIvc29hcDEyLW10b20vIi8+Ci0gICAgPC9hc2ZleHQ6U3RhbmRhcmQ+PC9hc2ZleHQ6aW1wbGVtZW50cz4KLSAgICA8YXNmZXh0OmltcGxlbWVudHM+PGFzZmV4dDpTdGFuZGFyZD4KLSAgICAgIDxhc2ZleHQ6dGl0bGU+SFRUUDwvYXNmZXh0OnRpdGxlPgotICAgICAgPGFzZmV4dDpib2R5PklFVEY8L2FzZmV4dDpib2R5PgotICAgICAgPGFzZmV4dDppZD5IVFRQIDEuMTwvYXNmZXh0OmlkPgotICAgICAgPGFzZmV4dDp1cmwgcmRmOnJlc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9Qcm90b2NvbHMvcmZjMjYxNi9yZmMyNjE2Lmh0bWwiLz4KLSAgICA8L2FzZmV4dDpTdGFuZGFyZD48L2FzZmV4dDppbXBsZW1lbnRzPgotICAgIDxhc2ZleHQ6aW1wbGVtZW50cz48YXNmZXh0OlN0YW5kYXJkPgotICAgICAgPGFzZmV4dDp0aXRsZT5XUy1BZGRyZXNzaW5nPC9hc2ZleHQ6dGl0bGU+Ci0gICAgICA8YXNmZXh0OmJvZHk+VzNDPC9hc2ZleHQ6Ym9keT4KLSAgICAgIDxhc2ZleHQ6aWQ+V1NBPC9hc2ZleHQ6aWQ+Ci0gICAgICA8YXNmZXh0OnVybCByZGY6cmVzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnLzIwMDIvd3MvYWRkci8iLz4KLSAgICA8L2FzZmV4dDpTdGFuZGFyZD48L2FzZmV4dDppbXBsZW1lbnRzPgotICAgIDxhc2ZleHQ6aW1wbGVtZW50cz48YXNmZXh0OlN0YW5kYXJkPgotICAgICAgPGFzZmV4dDp0aXRsZT5XUy1SZWxpYWJsZU1lc3NhZ2luZzwvYXNmZXh0OnRpdGxlPgotICAgICAgPGFzZmV4dDpib2R5Pk9BU0lTPC9hc2ZleHQ6Ym9keT4KLSAgICAgIDxhc2ZleHQ6aWQ+V1NSTTwvYXNmZXh0OmlkPgotICAgICAgPGFzZmV4dDp1cmwgcmRmOnJlc291cmNlPSJodHRwOi8vd3d3Lm9hc2lzLW9wZW4ub3JnL2NvbW1pdHRlZXMvdGNfaG9tZS5waHA/d2dfYWJicmV2PXdzLXJ4Ii8+Ci0gICAgPC9hc2ZleHQ6U3RhbmRhcmQ+PC9hc2ZleHQ6aW1wbGVtZW50cz4KLSAgICA8YXNmZXh0OmltcGxlbWVudHM+PGFzZmV4dDpTdGFuZGFyZD4KLSAgICAgIDxhc2ZleHQ6dGl0bGU+V1MtU2VjdXJpdHk8L2FzZmV4dDp0aXRsZT4KLSAgICAgIDxhc2ZleHQ6Ym9keT5PQVNJUzwvYXNmZXh0OmJvZHk+Ci0gICAgICA8YXNmZXh0OmlkPldTU0VDPC9hc2ZleHQ6aWQ+Ci0gICAgICA8YXNmZXh0OnVybCByZGY6cmVzb3VyY2U9Imh0dHA6Ly93d3cub2FzaXMtb3Blbi5vcmcvY29tbWl0dGVlcy9kb3dubG9hZC5waHAvMTY3OTAvd3NzLXYxLjEtc3BlYy1vcy1TT0FQTWVzc2FnZVNlY3VyaXR5LnBkZiIvPgotICAgIDwvYXNmZXh0OlN0YW5kYXJkPjwvYXNmZXh0OmltcGxlbWVudHM+Ci0gIDwvUHJvamVjdD4KLTwvcmRmOlJERj4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvZG93bmxvYWQuY2dpIGIvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9kb3dubG9hZC5jZ2kKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhOWY4ZDMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9kb3dubG9hZC5jZ2kKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jIS9iaW4vc2gKLQotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jIAotIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMgCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSMgV3JhcHBlciBzY3JpcHQgYXJvdW5kIG1pcnJvcnMuY2dpIHNjcmlwdAotIyAod2UgbXVzdCBjaGFuZ2UgdG8gdGhhdCBkaXJlY3RvcnkgaW4gb3JkZXIgZm9yIHB5dGhvbiB0byBwaWNrIHVwIHRoZQotIyAgcHl0aG9uIGluY2x1ZGVzIGNvcnJlY3RseSkKLWNkIC93d3cvd3d3LmFwYWNoZS5vcmcvZHluL21pcnJvcnMKLS93d3cvd3d3LmFwYWNoZS5vcmcvZHluL21pcnJvcnMvbWlycm9ycy5jZ2kgJCoKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL2Rvd25sb2FkLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvZG93bmxvYWQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGU4NDY3Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvZG93bmxvYWQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iDQotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4NCi08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+DQotPGhlYWQ+DQotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PQ0KLSJIVE1MIFRpZHkgZm9yIFdpbmRvd3MgKHZlcnMgMTQgSnVuZSAyMDA3KSwgc2VlIHd3dy53My5vcmciIC8+DQotPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSIiIC8+DQotPHRpdGxlPlJlbGVhc2VzPC90aXRsZT4NCi08bGluayBocmVmPSJjc3MvYXhpcy1kb2NzLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyINCi1tZWRpYT0iYWxsIiAvPg0KLTwvaGVhZD4NCi08Ym9keT4NCi08aDI+QXBhY2hlIEF4aXMyIFJlbGVhc2VzPC9oMj4NCi08ZGl2IGFsaWduPSJsZWZ0Ij4NCi08cD5UaGlzIHBhZ2UgcHJvdmlkZXMgbGlua3MgdG8gdGhlIHJlbGVhc2UgdmVyc2lvbnMgb2YgQXhpczIgSmF2YS4NCi1Gb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIHNlZSA8YSBocmVmPQ0KLSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGV2L3JlbGVhc2UuaHRtbCI+QXBhY2hlIFJlbGVhc2UNCi1GQVE8L2E+LjwvcD4NCi08L2Rpdj4NCi08ZGl2IGFsaWduPSJjZW50ZXIiPg0KLTx0YWJsZSBib3JkZXI9IjEiIHN0eWxlPSJib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlIiB3aWR0aD0iOTMlIiBpZD0NCi0idGFibGUxIj4NCi08dGJvZHk+DQotPHRyPg0KLTx0aD5WZXJzaW9uPC90aD4NCi08dGg+RGF0ZTwvdGg+DQotPHRoPkRlc2NyaXB0aW9uPC90aD4NCi08L3RyPg0KLTx0cj4NCi08dGQ+PGEgaHJlZj0NCi0iZG93bmxvYWQvMV81L2Rvd25sb2FkLmNnaSI+PHN0cm9uZz4xLjU8L3N0cm9uZz48L2E+PC90ZD4NCi08dGQ+MDkgLSBKdW4gLSAyMDA5PC90ZD4NCi08dGQ+MS41IFJlbGVhc2UgKE1pcnJvcmVkKTwvdGQ+DQotPC90cj4NCi08dHI+DQotPHRkPjxhIGhyZWY9DQotImRvd25sb2FkLzFfNF8xL2Rvd25sb2FkLmNnaSI+PHN0cm9uZz4xLjQuMTwvc3Ryb25nPjwvYT48L3RkPg0KLTx0ZD4yNCAtIEF1ZyAtIDIwMDg8L3RkPg0KLTx0ZD4xLjQuMSBSZWxlYXNlIChNaXJyb3JlZCk8L3RkPg0KLTwvdHI+DQotPHRyPg0KLTx0ZD48YSBocmVmPQ0KLSJkb3dubG9hZC8xXzQvZG93bmxvYWQuY2dpIj48c3Ryb25nPjEuNDwvc3Ryb25nPjwvYT48L3RkPg0KLTx0ZD4wNSAtIEZlYiAtIDIwMDg8L3RkPg0KLTx0ZD4xLjQgUmVsZWFzZSAoQXJjaGl2ZWQpPC90ZD4NCi08L3RyPg0KLTx0cj4NCi08dGQ+PGEgaHJlZj0NCi0iZG93bmxvYWQvMV8zL2Rvd25sb2FkLmNnaSI+PHN0cm9uZz4xLjM8L3N0cm9uZz48L2E+PC90ZD4NCi08dGQ+MDYgLSBKdWwgLSAyMDA3PC90ZD4NCi08dGQ+MS4zIFJlbGVhc2UgKEFyY2hpdmVkKTwvdGQ+DQotPC90cj4NCi08dHI+DQotPHRkPjxhIGhyZWY9DQotImRvd25sb2FkLzFfMi9kb3dubG9hZC5jZ2kiPjxzdHJvbmc+MS4yPC9zdHJvbmc+PC9hPjwvdGQ+DQotPHRkPjI3IC0gQXByIC0gMjAwNzwvdGQ+DQotPHRkPjEuMiBSZWxlYXNlIChBcmNoaXZlZCk8L3RkPg0KLTwvdHI+DQotPHRyPg0KLTx0ZD48YSBocmVmPQ0KLSJkb3dubG9hZC8xXzFfMS9kb3dubG9hZC5jZ2kiPjxzdHJvbmc+MS4xLjE8L3N0cm9uZz48L2E+PC90ZD4NCi08dGQ+MDkgLSBKYW4gLSAyMDA3PC90ZD4NCi08dGQ+MS4xLjEgUmVsZWFzZSAoQXJjaGl2ZWQpPC90ZD4NCi08L3RyPg0KLTx0cj4NCi08dGQ+PGEgaHJlZj0NCi0iZG93bmxvYWQvMV8xL2Rvd25sb2FkLmNnaSI+PHN0cm9uZz4xLjE8L3N0cm9uZz48L2E+PC90ZD4NCi08dGQ+MTMgLSBOb3YgLSAyMDA2PC90ZD4NCi08dGQ+MS4xIFJlbGVhc2UgKEFyY2hpdmVkKTwvdGQ+DQotPC90cj4NCi08dHI+DQotPHRkPjxhIGhyZWY9DQotImRvd25sb2FkLzFfMC9kb3dubG9hZC5jZ2kiPjxzdHJvbmc+MS4wPC9zdHJvbmc+PC9hPjwvdGQ+DQotPHRkPjA0IC0gTWF5IC0gMjAwNjwvdGQ+DQotPHRkPjEuMCBSZWxlYXNlIChBcmNoaXZlZCk8L3RkPg0KLTwvdHI+DQotPHRyPg0KLTx0ZD48YSBocmVmPQ0KLSJkb3dubG9hZC8wXzk1L2Rvd25sb2FkLmNnaSI+PHN0cm9uZz4wLjk1PC9zdHJvbmc+PC9hPjwvdGQ+DQotPHRkPjIzIC0gTWFyIC0gMjAwNjwvdGQ+DQotPHRkPjAuOTUgUmVsZWFzZSAoQXJjaGl2ZWQpPC90ZD4NCi08L3RyPg0KLTx0cj4NCi08dGQ+PGEgaHJlZj0NCi0iZG93bmxvYWQvMF85NC9kb3dubG9hZC5jZ2kiPjxzdHJvbmc+MC45NDwvc3Ryb25nPjwvYT48L3RkPg0KLTx0ZD4xMSAtIEphbiAtIDIwMDY8L3RkPg0KLTx0ZD4wLjk0IFJlbGVhc2UgKEFyY2hpdmVkKTwvdGQ+DQotPC90cj4NCi08dHI+DQotPHRkPjxhIGhyZWY9DQotImRvd25sb2FkLzBfOTMvZG93bmxvYWQuY2dpIj48c3Ryb25nPjAuOTM8L3N0cm9uZz48L2E+PC90ZD4NCi08dGQ+MTIgLSBGZWIgLSAyMDA1PC90ZD4NCi08dGQ+MC45MyBSZWxlYXNlIChBcmNoaXZlZCk8L3RkPg0KLTwvdHI+DQotPHRyPg0KLTx0ZD48YSBocmVmPQ0KLSJkb3dubG9hZC8wXzkyL2Rvd25sb2FkLmNnaSI+PHN0cm9uZz4wLjkyPC9zdHJvbmc+PC9hPjwvdGQ+DQotPHRkPjI2IC0gQXVnIC0gMjAwNTwvdGQ+DQotPHRkPjAuOTIgUmVsZWFzZSAoQXJjaGl2ZWQpPC90ZD4NCi08L3RyPg0KLTx0cj4NCi08dGQ+PGEgaHJlZj0NCi0iZG93bmxvYWQvMF85MS9kb3dubG9hZC5jZ2kiPjxzdHJvbmc+MC45MTwvc3Ryb25nPjwvYT48L3RkPg0KLTx0ZD4xNiAtIEF1ZyAtIDIwMDU8L3RkPg0KLTx0ZD4wLjkxIFJlbGVhc2UgKEFyY2hpdmVkKTwvdGQ+DQotPC90cj4NCi08dHI+DQotPHRkPjxhIGhyZWY9DQotImRvd25sb2FkLzBfOS9kb3dubG9hZC5jZ2kiPjxzdHJvbmc+MC45PC9zdHJvbmc+PC9hPjwvdGQ+DQotPHRkPjA1IC0gSnVsIC0gMjAwNTwvdGQ+DQotPHRkPjAuOSBSZWxlYXNlIChBcmNoaXZlZCk8L3RkPg0KLTwvdHI+DQotPHRyPg0KLTx0ZD48YSBocmVmPSJkb3dubG9hZC9NMi9kb3dubG9hZC5jZ2kiPjxzdHJvbmc+TTI8L3N0cm9uZz48L2E+PC90ZD4NCi08dGQ+MDggLSBKdW4gLSAyMDA1PC90ZD4NCi08dGQ+TWlsZXN0b25lIFJlbGVhc2UgIzIgKEFyY2hpdmVkKTwvdGQ+DQotPC90cj4NCi08L3Rib2R5Pg0KLTwvdGFibGU+DQotPC9kaXY+DQotPHA+PHN0cm9uZz5BeGlzMiBEaXN0cmlidXRpb25zIDogPGEgaHJlZj0NCi0iaHR0cDovL2N2cy5hcGFjaGUub3JnL2Rpc3QvYXhpczIvbmlnaHRseSI+TmlnaHRseQ0KLWJ1aWxkczwvYT48L3N0cm9uZz48L3A+DQotPHA+PHN0cm9uZz5BeGlzMiBNYXZlbiBSZXBvc2l0b3J5OiA8YSBocmVmPQ0KLSJodHRwOi8vcGVvcGxlLmFwYWNoZS5vcmcvcmVwby9tMS1pYmlibGlvLXJzeW5jLXJlcG9zaXRvcnkvb3JnLmFwYWNoZS5heGlzMi8iPg0KLVJlbGVhc2VkIEF4aXMyIGphcnM8L2E+IHwgPGEgaHJlZj0NCi0iaHR0cDovL2N2cy5hcGFjaGUub3JnL3JlcG9zaXRvcnkvb3JnLmFwYWNoZS5heGlzMi9qYXJzLyI+TmlnaHRseQ0KLVNOQVBTSE9UPC9hPjxhIGhyZWY9DQotImh0dHA6Ly9jdnMuYXBhY2hlLm9yZy9yZXBvc2l0b3J5L29yZy5hcGFjaGUuYXhpczIvamFycy8iPjwvYT48L3N0cm9uZz48L3A+DQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL2Rvd25sb2FkLzBfOS9kb3dubG9hZC5jZ2kgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL2Rvd25sb2FkLzBfOS9kb3dubG9hZC5jZ2kKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJhOWY4ZDMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9kb3dubG9hZC8wXzkvZG93bmxvYWQuY2dpCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIyEvYmluL3NoCi0KLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIyAKLSMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jIAotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jIFdyYXBwZXIgc2NyaXB0IGFyb3VuZCBtaXJyb3JzLmNnaSBzY3JpcHQKLSMgKHdlIG11c3QgY2hhbmdlIHRvIHRoYXQgZGlyZWN0b3J5IGluIG9yZGVyIGZvciBweXRob24gdG8gcGljayB1cCB0aGUKLSMgIHB5dGhvbiBpbmNsdWRlcyBjb3JyZWN0bHkpCi1jZCAvd3d3L3d3dy5hcGFjaGUub3JnL2R5bi9taXJyb3JzCi0vd3d3L3d3dy5hcGFjaGUub3JnL2R5bi9taXJyb3JzL21pcnJvcnMuY2dpICQqClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9kb3dubG9hZC8wXzkvZG93bmxvYWQueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9kb3dubG9hZC8wXzkvZG93bmxvYWQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjMxMWE2Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvZG93bmxvYWQvMF85L2Rvd25sb2FkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iDQotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4NCi08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+DQotPGhlYWQ+DQotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PQ0KLSJIVE1MIFRpZHkgZm9yIFdpbmRvd3MgKHZlcnMgMTQgSnVuZSAyMDA3KSwgc2VlIHd3dy53My5vcmciIC8+DQotPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSIiIC8+DQotPHRpdGxlPkF4aXMyIDAuOSBSZWxlYXNlPC90aXRsZT4NCi08L2hlYWQ+DQotPGJvZHk+DQotPGgyPkF4aXMyIDAuOSBSZWxlYXNlPC9oMj4NCi08ZGl2IGFsaWduPSJsZWZ0Ij4NCi08aDM+U291cmNlIERpc3RyaWJ1dGlvbjwvaDM+DQotPHA+PGEgaHJlZj0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzBfOS9heGlzMi0wLjktc3JjLnppcCINCi10aXRsZT0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzBfOS9heGlzMi0wLjktc3JjLnppcCI+emlwPC9hPjxiciAvPg0KLTwvcD4NCi08aDM+QmluYXJ5IERpc3RyaWJ1dGlvbjwvaDM+DQotPHA+PGEgaHJlZj0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzBfOS9heGlzMi0wLjktYmluLnppcCINCi10aXRsZT0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzBfOS9heGlzMi0wLjktYmluLnppcCI+emlwPC9hPjwvcD4NCi08L2Rpdj4NCi08IS0tPGRpdiBhbGlnbj0ibGVmdCI+DQotPGJyLz4NCi0NCi0NCi08cD5baWYtYW55IGxvZ29dIDxhIGhyZWY9IltsaW5rXSI+PGltZyBhbGlnbj0icmlnaHQiIHNyYz0iW2xvZ29dIg0KLWJvcmRlcj0iMCI+PC9hPltlbmRdIFRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgbWlycm9yIGlzIDxiPltwcmVmZXJyZWRdPC9iPi4gIElmDQoteW91IGVuY291bnRlciBhIHByb2JsZW0gd2l0aCB0aGlzIG1pcnJvciwgcGxlYXNlIHNlbGVjdCBhbm90aGVyIG1pcnJvci4gIElmDQotYWxsIG1pcnJvcnMgYXJlIGZhaWxpbmcsIHRoZXJlIGFyZSA8aT5iYWNrdXA8L2k+IG1pcnJvcnMgKGF0IHRoZSBlbmQgb2YgdGhlDQotbWlycm9ycyBsaXN0KSB0aGF0IHNob3VsZCBiZSBhdmFpbGFibGUuPC9wPg0KLQ0KLTxmb3JtIGFjdGlvbj0iW2xvY2F0aW9uXSIgbWV0aG9kPSJnZXQiIGlkPSJTZWxlY3RNaXJyb3IiPg0KLSAgT3RoZXIgbWlycm9yczogDQotICA8c2VsZWN0IG5hbWU9IlByZWZlcnJlZCI+W2lmLWFueSBodHRwXVtmb3IgaHR0cF0NCi0gICAgPG9wdGlvbiB2YWx1ZT0iW2h0dHBdIg0KLSAgICBzZWxlY3RlZD0ic2VsZWN0ZWQiPltodHRwXTwvb3B0aW9uPltlbmRdW2VuZF1baWYtYW55IGZ0cF1bZm9yIGZ0cF0NCi0gICAgPG9wdGlvbiB2YWx1ZT0iW2Z0cF0iPltmdHBdPC9vcHRpb24+W2VuZF1bZW5kXVtpZi1hbnkgYmFja3VwXVtmb3IgYmFja3VwXQ0KLSAgICA8b3B0aW9uIHZhbHVlPSJbYmFja3VwXSI+W2JhY2t1cF0gKGJhY2t1cCk8L29wdGlvbj5bZW5kXVtlbmRdDQotICA8L3NlbGVjdD4NCi0gICANCi0gIDxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSJDaGFuZ2UiPjwvZm9ybT4NCi0NCi08cD5Zb3UgbWF5IGFsc28gY29uc3VsdCB0aGUgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL21pcnJvcnMvIj5jb21wbGV0ZQ0KLWxpc3Qgb2YgbWlycm9yczwvYT4uPC9wPg0KLQ0KLTxwPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gd2hlbiBkb3dubG9hZGluZyBmcm9tIGEgbWlycm9yIHBsZWFzZSBjaGVjayB0aGUgPGENCi1ocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGV2L3JlbGVhc2Utc2lnbmluZyNtZDUiPm1kNXN1bTwvYT4gYW5kIHZlcmlmeQ0KLXRoZSA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGV2L3JlbGVhc2Utc2lnbmluZyNvcGVucGdwIj5PcGVuUEdQPC9hPg0KLWNvbXBhdGlibGUgc2lnbmF0dXJlIGZyb20gdGhlIG1haW4gQXBhY2hlIHNpdGUuIFRoZXNlIGNhbiBiZSBkb3dubG9hZGVkIGJ5DQotZm9sbG93aW5nIHRoZSBsaW5rcyBhYm92ZS4gVGhpcyA8YQ0KLWhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyL0tFWVMiPktFWVM8L2E+IGZpbGUgY29udGFpbnMgdGhlDQotcHVibGljIGtleXMgdXNlZCBmb3Igc2lnbmluZyByZWxlYXNlLiBJdCBpcyByZWNvbW1lbmRlZCB0aGF0ICh3aGVuIHBvc3NpYmxlKQ0KLWEgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rldi9yZWxlYXNlLXNpZ25pbmcjd2ViLW9mLXRydXN0Ij5XZWIgb2YNCi10cnVzdDwvYT4gaXMgdXNlZCB0byBjb25maXJtIHRoZSBpZGVudGl0eSBvZiB0aGVzZSBrZXlzLjwvcD4NCi08L2Rpdj4tLT4NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvZG93bmxvYWQvMF85MS9kb3dubG9hZC5jZ2kgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL2Rvd25sb2FkLzBfOTEvZG93bmxvYWQuY2dpCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiYTlmOGQzLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvZG93bmxvYWQvMF85MS9kb3dubG9hZC5jZ2kKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jIS9iaW4vc2gKLQotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jIAotIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMgCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSMgV3JhcHBlciBzY3JpcHQgYXJvdW5kIG1pcnJvcnMuY2dpIHNjcmlwdAotIyAod2UgbXVzdCBjaGFuZ2UgdG8gdGhhdCBkaXJlY3RvcnkgaW4gb3JkZXIgZm9yIHB5dGhvbiB0byBwaWNrIHVwIHRoZQotIyAgcHl0aG9uIGluY2x1ZGVzIGNvcnJlY3RseSkKLWNkIC93d3cvd3d3LmFwYWNoZS5vcmcvZHluL21pcnJvcnMKLS93d3cvd3d3LmFwYWNoZS5vcmcvZHluL21pcnJvcnMvbWlycm9ycy5jZ2kgJCoKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL2Rvd25sb2FkLzBfOTEvZG93bmxvYWQueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9kb3dubG9hZC8wXzkxL2Rvd25sb2FkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGUxODI5Ni4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL2Rvd25sb2FkLzBfOTEvZG93bmxvYWQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiINCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPg0KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4NCi08aGVhZD4NCi08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9DQotIkhUTUwgVGlkeSBmb3IgV2luZG93cyAodmVycyAxNCBKdW5lIDIwMDcpLCBzZWUgd3d3LnczLm9yZyIgLz4NCi08bWV0YSBodHRwLWVxdWl2PSJjb250ZW50LXR5cGUiIGNvbnRlbnQ9IiIgLz4NCi08dGl0bGU+QXhpczIgMC45MSBSZWxlYXNlPC90aXRsZT4NCi08L2hlYWQ+DQotPGJvZHk+DQotPGgyPkF4aXMyIDAuOTEgUmVsZWFzZTwvaDI+DQotPGRpdiBhbGlnbj0ibGVmdCI+DQotPGgzPlNvdXJjZSBEaXN0cmlidXRpb248L2gzPg0KLTxwPjxhIGhyZWY9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8wXzkxL2F4aXMyLTAuOTEtc3JjLnppcCINCi10aXRsZT0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzBfOTEvYXhpczItMC45MS1zcmMuemlwIj56aXA8L2E+DQotPGEgaHJlZj0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzBfOTEvYXhpczItMC45MS1zcmMuemlwLm1kNSINCi10aXRsZT0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzBfOTEvYXhpczItMC45MS1zcmMuemlwLm1kNSI+DQotTUQ1PC9hPiA8YSBocmVmPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMF85MS9heGlzMi0wLjkxLXNyYy56aXAuYXNjIg0KLXRpdGxlPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMF85MS9heGlzMi0wLjkxLXNyYy56aXAuYXNjIj4NCi1QR1A8L2E+PGJyIC8+PC9wPg0KLTxoMz5CaW5hcnkgRGlzdHJpYnV0aW9uPC9oMz4NCi08cD48YSBocmVmPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL3dzL2F4aXMyLzBfOTEvYXhpczItMC45MS1iaW4uemlwIiB0aXRsZT0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy93cy9heGlzMi8wXzkxL2F4aXMyLTAuOTEtYmluLnppcCI+emlwPC9hPg0KLTxhIGhyZWY9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8wXzkxL2F4aXMyLTAuOTEtYmluLnppcC5tZDUiDQotdGl0bGU9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8wXzkxL2F4aXMyLTAuOTEtYmluLnppcC5tZDUiPg0KLU1ENTwvYT4gPGEgaHJlZj0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzBfOTEvYXhpczItMC45MS1iaW4uemlwLmFzYyINCi10aXRsZT0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzBfOTEvYXhpczItMC45MS1iaW4uemlwLmFzYyI+DQotUEdQPC9hPjxiciAvPjwvcD4NCi08L2Rpdj4NCi08IS0tPGRpdiBhbGlnbj0ibGVmdCI+DQotPGJyLz4NCi0NCi0NCi08cD5baWYtYW55IGxvZ29dIDxhIGhyZWY9IltsaW5rXSI+PGltZyBhbGlnbj0icmlnaHQiIHNyYz0iW2xvZ29dIg0KLWJvcmRlcj0iMCI+PC9hPltlbmRdIFRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgbWlycm9yIGlzIDxiPltwcmVmZXJyZWRdPC9iPi4gIElmDQoteW91IGVuY291bnRlciBhIHByb2JsZW0gd2l0aCB0aGlzIG1pcnJvciwgcGxlYXNlIHNlbGVjdCBhbm90aGVyIG1pcnJvci4gIElmDQotYWxsIG1pcnJvcnMgYXJlIGZhaWxpbmcsIHRoZXJlIGFyZSA8aT5iYWNrdXA8L2k+IG1pcnJvcnMgKGF0IHRoZSBlbmQgb2YgdGhlDQotbWlycm9ycyBsaXN0KSB0aGF0IHNob3VsZCBiZSBhdmFpbGFibGUuPC9wPg0KLQ0KLTxmb3JtIGFjdGlvbj0iW2xvY2F0aW9uXSIgbWV0aG9kPSJnZXQiIGlkPSJTZWxlY3RNaXJyb3IiPg0KLSAgT3RoZXIgbWlycm9yczogDQotICA8c2VsZWN0IG5hbWU9IlByZWZlcnJlZCI+W2lmLWFueSBodHRwXVtmb3IgaHR0cF0NCi0gICAgPG9wdGlvbiB2YWx1ZT0iW2h0dHBdIg0KLSAgICBzZWxlY3RlZD0ic2VsZWN0ZWQiPltodHRwXTwvb3B0aW9uPltlbmRdW2VuZF1baWYtYW55IGZ0cF1bZm9yIGZ0cF0NCi0gICAgPG9wdGlvbiB2YWx1ZT0iW2Z0cF0iPltmdHBdPC9vcHRpb24+W2VuZF1bZW5kXVtpZi1hbnkgYmFja3VwXVtmb3IgYmFja3VwXQ0KLSAgICA8b3B0aW9uIHZhbHVlPSJbYmFja3VwXSI+W2JhY2t1cF0gKGJhY2t1cCk8L29wdGlvbj5bZW5kXVtlbmRdDQotICA8L3NlbGVjdD4NCi0gICANCi0gIDxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSJDaGFuZ2UiPjwvZm9ybT4NCi0NCi08cD5Zb3UgbWF5IGFsc28gY29uc3VsdCB0aGUgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL21pcnJvcnMvIj5jb21wbGV0ZQ0KLWxpc3Qgb2YgbWlycm9yczwvYT4uPC9wPg0KLQ0KLTxwPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gd2hlbiBkb3dubG9hZGluZyBmcm9tIGEgbWlycm9yIHBsZWFzZSBjaGVjayB0aGUgPGENCi1ocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGV2L3JlbGVhc2Utc2lnbmluZyNtZDUiPm1kNXN1bTwvYT4gYW5kIHZlcmlmeQ0KLXRoZSA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGV2L3JlbGVhc2Utc2lnbmluZyNvcGVucGdwIj5PcGVuUEdQPC9hPg0KLWNvbXBhdGlibGUgc2lnbmF0dXJlIGZyb20gdGhlIG1haW4gQXBhY2hlIHNpdGUuIFRoZXNlIGNhbiBiZSBkb3dubG9hZGVkIGJ5DQotZm9sbG93aW5nIHRoZSBsaW5rcyBhYm92ZS4gVGhpcyA8YQ0KLWhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyL0tFWVMiPktFWVM8L2E+IGZpbGUgY29udGFpbnMgdGhlDQotcHVibGljIGtleXMgdXNlZCBmb3Igc2lnbmluZyByZWxlYXNlLiBJdCBpcyByZWNvbW1lbmRlZCB0aGF0ICh3aGVuIHBvc3NpYmxlKQ0KLWEgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rldi9yZWxlYXNlLXNpZ25pbmcjd2ViLW9mLXRydXN0Ij5XZWIgb2YNCi10cnVzdDwvYT4gaXMgdXNlZCB0byBjb25maXJtIHRoZSBpZGVudGl0eSBvZiB0aGVzZSBrZXlzLjwvcD4NCi08L2Rpdj4tLT4NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvZG93bmxvYWQvMF85Mi9kb3dubG9hZC5jZ2kgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL2Rvd25sb2FkLzBfOTIvZG93bmxvYWQuY2dpCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiYTlmOGQzLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvZG93bmxvYWQvMF85Mi9kb3dubG9hZC5jZ2kKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jIS9iaW4vc2gKLQotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jIAotIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMgCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSMgV3JhcHBlciBzY3JpcHQgYXJvdW5kIG1pcnJvcnMuY2dpIHNjcmlwdAotIyAod2UgbXVzdCBjaGFuZ2UgdG8gdGhhdCBkaXJlY3RvcnkgaW4gb3JkZXIgZm9yIHB5dGhvbiB0byBwaWNrIHVwIHRoZQotIyAgcHl0aG9uIGluY2x1ZGVzIGNvcnJlY3RseSkKLWNkIC93d3cvd3d3LmFwYWNoZS5vcmcvZHluL21pcnJvcnMKLS93d3cvd3d3LmFwYWNoZS5vcmcvZHluL21pcnJvcnMvbWlycm9ycy5jZ2kgJCoKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL2Rvd25sb2FkLzBfOTIvZG93bmxvYWQueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9kb3dubG9hZC8wXzkyL2Rvd25sb2FkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE5MmVmOC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL2Rvd25sb2FkLzBfOTIvZG93bmxvYWQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iDQotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4NCi08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+DQotPGhlYWQ+DQotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PQ0KLSJIVE1MIFRpZHkgZm9yIFdpbmRvd3MgKHZlcnMgMTQgSnVuZSAyMDA3KSwgc2VlIHd3dy53My5vcmciIC8+DQotPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSIiIC8+DQotPHRpdGxlPkF4aXMyIDAuOTIgUmVsZWFzZTwvdGl0bGU+DQotPC9oZWFkPg0KLTxib2R5Pg0KLTxoMj5BeGlzMiAwLjkyIFJlbGVhc2U8L2gyPg0KLTxkaXY+DQotPGgzPlNvdXJjZSBEaXN0cmlidXRpb248L2gzPg0KLTxwPjxhIGhyZWY9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8wXzkyL2F4aXMyLTAuOTItc3JjLnppcCINCi10aXRsZT0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzBfOTIvYXhpczItMC45Mi1zcmMuemlwIj56aXA8L2E+DQotPGEgaHJlZj0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzBfOTIvYXhpczItMC45Mi1zcmMuemlwLm1kNSINCi10aXRsZT0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzBfOTIvYXhpczItMC45Mi1zcmMuemlwLm1kNSI+DQotTUQ1PC9hPiA8YSBocmVmPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMF85Mi9heGlzMi0wLjkyLXNyYy56aXAuYXNjIg0KLXRpdGxlPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMF85Mi9heGlzMi0wLjkyLXNyYy56aXAuYXNjIj4NCi1QR1A8L2E+PGJyIC8+PC9wPg0KLTxoMz5CaW5hcnkgRGlzdHJpYnV0aW9uPC9oMz4NCi08cD48YSBocmVmPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMF85Mi9heGlzMi0wLjkyLWJpbi56aXAiDQotdGl0bGU9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8wXzkyL2F4aXMyLTAuOTItYmluLnppcCI+emlwPC9hPg0KLTxhIGhyZWY9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8wXzkyL2F4aXMyLTAuOTItYmluLnppcC5tZDUiDQotdGl0bGU9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8wXzkyL2F4aXMyLTAuOTItYmluLnppcC5tZDUiPg0KLU1ENTwvYT4gPGEgaHJlZj0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzBfOTIvYXhpczItMC45Mi1iaW4uemlwLmFzYyINCi10aXRsZT0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzBfOTIvYXhpczItMC45Mi1iaW4uemlwLmFzYyI+DQotUEdQPC9hPjxiciAvPjwvcD4NCi08aDM+UGx1Z2lucyBEaXN0cmlidXRpb248L2gzPg0KLUF4aXMyIENvZGUgR2VuZXJhdG9yIGVjbGlwc2UgcGx1Z2luIDxhIGhyZWY9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8wXzkyL0F4aXMyX0NvZGVfR2VuZXJhdG9yLnppcCINCi10aXRsZT0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzBfOTIvQXhpczJfQ29kZV9HZW5lcmF0b3IuemlwIj4NCi16aXA8L2E+PGJyIC8+DQotQXhpczIgU2VydmljZSBBcmNoaXZlciBlY2xpcHNlIHBsdWdpbiA8YSBocmVmPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMF85Mi9BeGlzMl9TZXJ2aWNlX2FyY2hpdmVyLnppcCINCi10aXRsZT0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzBfOTIvQXhpczJfU2VydmljZV9hcmNoaXZlci56aXAiPg0KLXppcDwvYT48YnIgLz4NCi1BeGlzMiBXaXphcmQgQnVuZGxlIGVjbGlwc2UgcGx1Z2luIDxhIGhyZWY9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8wXzkyL0F4aXMyX1dpemFyZF9CdW5kbGUuemlwIg0KLXRpdGxlPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMF85Mi9BeGlzMl9XaXphcmRfQnVuZGxlLnppcCI+DQotemlwPC9hPjxiciAvPg0KLUlERUEgcGx1Z2luIDxhIGhyZWY9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8wXzkyL0F4aXMySWRlYXBsdWdpbi5qYXIiDQotdGl0bGU9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8wXzkyL0F4aXMySWRlYXBsdWdpbi5qYXIiPmphcjwvYT48L2Rpdj4NCi08IS0tPGRpdiBhbGlnbj0ibGVmdCI+DQotPGJyLz4NCi0NCi0NCi08cD5baWYtYW55IGxvZ29dIDxhIGhyZWY9IltsaW5rXSI+PGltZyBhbGlnbj0icmlnaHQiIHNyYz0iW2xvZ29dIg0KLWJvcmRlcj0iMCI+PC9hPltlbmRdIFRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgbWlycm9yIGlzIDxiPltwcmVmZXJyZWRdPC9iPi4gIElmDQoteW91IGVuY291bnRlciBhIHByb2JsZW0gd2l0aCB0aGlzIG1pcnJvciwgcGxlYXNlIHNlbGVjdCBhbm90aGVyIG1pcnJvci4gIElmDQotYWxsIG1pcnJvcnMgYXJlIGZhaWxpbmcsIHRoZXJlIGFyZSA8aT5iYWNrdXA8L2k+IG1pcnJvcnMgKGF0IHRoZSBlbmQgb2YgdGhlDQotbWlycm9ycyBsaXN0KSB0aGF0IHNob3VsZCBiZSBhdmFpbGFibGUuPC9wPg0KLQ0KLTxmb3JtIGFjdGlvbj0iW2xvY2F0aW9uXSIgbWV0aG9kPSJnZXQiIGlkPSJTZWxlY3RNaXJyb3IiPg0KLSAgT3RoZXIgbWlycm9yczogDQotICA8c2VsZWN0IG5hbWU9IlByZWZlcnJlZCI+W2lmLWFueSBodHRwXVtmb3IgaHR0cF0NCi0gICAgPG9wdGlvbiB2YWx1ZT0iW2h0dHBdIg0KLSAgICBzZWxlY3RlZD0ic2VsZWN0ZWQiPltodHRwXTwvb3B0aW9uPltlbmRdW2VuZF1baWYtYW55IGZ0cF1bZm9yIGZ0cF0NCi0gICAgPG9wdGlvbiB2YWx1ZT0iW2Z0cF0iPltmdHBdPC9vcHRpb24+W2VuZF1bZW5kXVtpZi1hbnkgYmFja3VwXVtmb3IgYmFja3VwXQ0KLSAgICA8b3B0aW9uIHZhbHVlPSJbYmFja3VwXSI+W2JhY2t1cF0gKGJhY2t1cCk8L29wdGlvbj5bZW5kXVtlbmRdDQotICA8L3NlbGVjdD4NCi0gICANCi0gIDxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSJDaGFuZ2UiPjwvZm9ybT4NCi0NCi08cD5Zb3UgbWF5IGFsc28gY29uc3VsdCB0aGUgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL21pcnJvcnMvIj5jb21wbGV0ZQ0KLWxpc3Qgb2YgbWlycm9yczwvYT4uPC9wPg0KLQ0KLTxwPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gd2hlbiBkb3dubG9hZGluZyBmcm9tIGEgbWlycm9yIHBsZWFzZSBjaGVjayB0aGUgPGENCi1ocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGV2L3JlbGVhc2Utc2lnbmluZyNtZDUiPm1kNXN1bTwvYT4gYW5kIHZlcmlmeQ0KLXRoZSA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGV2L3JlbGVhc2Utc2lnbmluZyNvcGVucGdwIj5PcGVuUEdQPC9hPg0KLWNvbXBhdGlibGUgc2lnbmF0dXJlIGZyb20gdGhlIG1haW4gQXBhY2hlIHNpdGUuIFRoZXNlIGNhbiBiZSBkb3dubG9hZGVkIGJ5DQotZm9sbG93aW5nIHRoZSBsaW5rcyBhYm92ZS4gVGhpcyA8YQ0KLWhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyL0tFWVMiPktFWVM8L2E+IGZpbGUgY29udGFpbnMgdGhlDQotcHVibGljIGtleXMgdXNlZCBmb3Igc2lnbmluZyByZWxlYXNlLiBJdCBpcyByZWNvbW1lbmRlZCB0aGF0ICh3aGVuIHBvc3NpYmxlKQ0KLWEgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rldi9yZWxlYXNlLXNpZ25pbmcjd2ViLW9mLXRydXN0Ij5XZWIgb2YNCi10cnVzdDwvYT4gaXMgdXNlZCB0byBjb25maXJtIHRoZSBpZGVudGl0eSBvZiB0aGVzZSBrZXlzLjwvcD4NCi08L2Rpdj4tLT4NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvZG93bmxvYWQvMF85My9kb3dubG9hZC5jZ2kgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL2Rvd25sb2FkLzBfOTMvZG93bmxvYWQuY2dpCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiYTlmOGQzLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvZG93bmxvYWQvMF85My9kb3dubG9hZC5jZ2kKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jIS9iaW4vc2gKLQotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jIAotIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMgCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSMgV3JhcHBlciBzY3JpcHQgYXJvdW5kIG1pcnJvcnMuY2dpIHNjcmlwdAotIyAod2UgbXVzdCBjaGFuZ2UgdG8gdGhhdCBkaXJlY3RvcnkgaW4gb3JkZXIgZm9yIHB5dGhvbiB0byBwaWNrIHVwIHRoZQotIyAgcHl0aG9uIGluY2x1ZGVzIGNvcnJlY3RseSkKLWNkIC93d3cvd3d3LmFwYWNoZS5vcmcvZHluL21pcnJvcnMKLS93d3cvd3d3LmFwYWNoZS5vcmcvZHluL21pcnJvcnMvbWlycm9ycy5jZ2kgJCoKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL2Rvd25sb2FkLzBfOTMvZG93bmxvYWQueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9kb3dubG9hZC8wXzkzL2Rvd25sb2FkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRkZjg3MC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL2Rvd25sb2FkLzBfOTMvZG93bmxvYWQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iDQotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4NCi08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+DQotPGhlYWQ+DQotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PQ0KLSJIVE1MIFRpZHkgZm9yIFdpbmRvd3MgKHZlcnMgMTQgSnVuZSAyMDA3KSwgc2VlIHd3dy53My5vcmciIC8+DQotPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSIiIC8+DQotPHRpdGxlPkF4aXMyIDAuOTMgUmVsZWFzZTwvdGl0bGU+DQotPC9oZWFkPg0KLTxib2R5Pg0KLTxoMj5BeGlzMiAwLjkzIFJlbGVhc2U8L2gyPg0KLTxkaXY+DQotPGgzPlNvdXJjZSBEaXN0cmlidXRpb248L2gzPg0KLTxwPjxhIGhyZWY9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8wXzkzL2F4aXMyLTAuOTMtc3JjLnppcCINCi10aXRsZT0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzBfOTMvYXhpczItMC45My1zcmMuemlwIj56aXA8L2E+DQotPGEgaHJlZj0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzBfOTMvYXhpczItMC45My1zcmMuemlwLm1kNSINCi10aXRsZT0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzBfOTMvYXhpczItMC45My1zcmMuemlwLm1kNSI+DQotTUQ1PC9hPiA8YSBocmVmPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMF85My9heGlzMi0wLjkzLXNyYy56aXAuYXNjIg0KLXRpdGxlPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMF85My9heGlzMi0wLjkzLXNyYy56aXAuYXNjIj4NCi1QR1A8L2E+PGJyIC8+PC9wPg0KLTxoMz5CaW5hcnkgRGlzdHJpYnV0aW9uPC9oMz4NCi08cD48YSBocmVmPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMF85My9heGlzMi0wLjkzLWJpbi56aXAiDQotdGl0bGU9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8wXzkzL2F4aXMyLTAuOTMtYmluLnppcCI+emlwPC9hPg0KLTxhIGhyZWY9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8wXzkzL2F4aXMyLTAuOTMtYmluLnppcC5tZDUiDQotdGl0bGU9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8wXzkzL2F4aXMyLTAuOTMtYmluLnppcC5tZDUiPg0KLU1ENTwvYT4gPGEgaHJlZj0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzBfOTMvYXhpczItMC45My1iaW4uemlwLmFzYyINCi10aXRsZT0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzBfOTMvYXhpczItMC45My1iaW4uemlwLmFzYyI+DQotUEdQPC9hPjxiciAvPjwvcD4NCi08aDM+V2FyIERpc3RyaWJ1dGlvbjwvaDM+DQotPHA+PGEgaHJlZj0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzBfOTMvYXhpczIud2FyIj56aXA8L2E+DQotPGEgaHJlZj0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzBfOTMvYXhpczIud2FyLm1kNSIgdGl0bGU9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8wXzkzL2F4aXMyLTAuOTMtc3JjLnppcC5tZDUiPg0KLU1ENTwvYT4gPGEgaHJlZj0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzBfOTMvYXhpczIud2FyLmFzYyIgdGl0bGU9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8wXzkzL2F4aXMyLTAuOTMtc3JjLnppcC5hc2MiPg0KLVBHUDwvYT48L3A+DQotPC9kaXY+DQotPCEtLTxkaXYgYWxpZ249ImxlZnQiPg0KLTxici8+DQotDQotDQotPHA+W2lmLWFueSBsb2dvXSA8YSBocmVmPSJbbGlua10iPjxpbWcgYWxpZ249InJpZ2h0IiBzcmM9Iltsb2dvXSINCi1ib3JkZXI9IjAiPjwvYT5bZW5kXSBUaGUgY3VycmVudGx5IHNlbGVjdGVkIG1pcnJvciBpcyA8Yj5bcHJlZmVycmVkXTwvYj4uICBJZg0KLXlvdSBlbmNvdW50ZXIgYSBwcm9ibGVtIHdpdGggdGhpcyBtaXJyb3IsIHBsZWFzZSBzZWxlY3QgYW5vdGhlciBtaXJyb3IuICBJZg0KLWFsbCBtaXJyb3JzIGFyZSBmYWlsaW5nLCB0aGVyZSBhcmUgPGk+YmFja3VwPC9pPiBtaXJyb3JzIChhdCB0aGUgZW5kIG9mIHRoZQ0KLW1pcnJvcnMgbGlzdCkgdGhhdCBzaG91bGQgYmUgYXZhaWxhYmxlLjwvcD4NCi0NCi08Zm9ybSBhY3Rpb249Iltsb2NhdGlvbl0iIG1ldGhvZD0iZ2V0IiBpZD0iU2VsZWN0TWlycm9yIj4NCi0gIE90aGVyIG1pcnJvcnM6IA0KLSAgPHNlbGVjdCBuYW1lPSJQcmVmZXJyZWQiPltpZi1hbnkgaHR0cF1bZm9yIGh0dHBdDQotICAgIDxvcHRpb24gdmFsdWU9IltodHRwXSINCi0gICAgc2VsZWN0ZWQ9InNlbGVjdGVkIj5baHR0cF08L29wdGlvbj5bZW5kXVtlbmRdW2lmLWFueSBmdHBdW2ZvciBmdHBdDQotICAgIDxvcHRpb24gdmFsdWU9IltmdHBdIj5bZnRwXTwvb3B0aW9uPltlbmRdW2VuZF1baWYtYW55IGJhY2t1cF1bZm9yIGJhY2t1cF0NCi0gICAgPG9wdGlvbiB2YWx1ZT0iW2JhY2t1cF0iPltiYWNrdXBdIChiYWNrdXApPC9vcHRpb24+W2VuZF1bZW5kXQ0KLSAgPC9zZWxlY3Q+DQotICAgDQotICA8aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iQ2hhbmdlIj48L2Zvcm0+DQotDQotPHA+WW91IG1heSBhbHNvIGNvbnN1bHQgdGhlIDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9taXJyb3JzLyI+Y29tcGxldGUNCi1saXN0IG9mIG1pcnJvcnM8L2E+LjwvcD4NCi0NCi08cD48c3Ryb25nPk5vdGU6PC9zdHJvbmc+IHdoZW4gZG93bmxvYWRpbmcgZnJvbSBhIG1pcnJvciBwbGVhc2UgY2hlY2sgdGhlIDxhDQotaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rldi9yZWxlYXNlLXNpZ25pbmcjbWQ1Ij5tZDVzdW08L2E+IGFuZCB2ZXJpZnkNCi10aGUgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rldi9yZWxlYXNlLXNpZ25pbmcjb3BlbnBncCI+T3BlblBHUDwvYT4NCi1jb21wYXRpYmxlIHNpZ25hdHVyZSBmcm9tIHRoZSBtYWluIEFwYWNoZSBzaXRlLiBUaGVzZSBjYW4gYmUgZG93bmxvYWRlZCBieQ0KLWZvbGxvd2luZyB0aGUgbGlua3MgYWJvdmUuIFRoaXMgPGENCi1ocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi9LRVlTIj5LRVlTPC9hPiBmaWxlIGNvbnRhaW5zIHRoZQ0KLXB1YmxpYyBrZXlzIHVzZWQgZm9yIHNpZ25pbmcgcmVsZWFzZS4gSXQgaXMgcmVjb21tZW5kZWQgdGhhdCAod2hlbiBwb3NzaWJsZSkNCi1hIDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kZXYvcmVsZWFzZS1zaWduaW5nI3dlYi1vZi10cnVzdCI+V2ViIG9mDQotdHJ1c3Q8L2E+IGlzIHVzZWQgdG8gY29uZmlybSB0aGUgaWRlbnRpdHkgb2YgdGhlc2Uga2V5cy48L3A+DQotPC9kaXY+LS0+DQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL2Rvd25sb2FkLzBfOTQvZG93bmxvYWQuY2dpIGIvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9kb3dubG9hZC8wXzk0L2Rvd25sb2FkLmNnaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmE5ZjhkMy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL2Rvd25sb2FkLzBfOTQvZG93bmxvYWQuY2dpCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIyEvYmluL3NoCi0KLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIyAKLSMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jIAotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jIFdyYXBwZXIgc2NyaXB0IGFyb3VuZCBtaXJyb3JzLmNnaSBzY3JpcHQKLSMgKHdlIG11c3QgY2hhbmdlIHRvIHRoYXQgZGlyZWN0b3J5IGluIG9yZGVyIGZvciBweXRob24gdG8gcGljayB1cCB0aGUKLSMgIHB5dGhvbiBpbmNsdWRlcyBjb3JyZWN0bHkpCi1jZCAvd3d3L3d3dy5hcGFjaGUub3JnL2R5bi9taXJyb3JzCi0vd3d3L3d3dy5hcGFjaGUub3JnL2R5bi9taXJyb3JzL21pcnJvcnMuY2dpICQqClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9kb3dubG9hZC8wXzk0L2Rvd25sb2FkLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvZG93bmxvYWQvMF85NC9kb3dubG9hZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmNjRjOWMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9kb3dubG9hZC8wXzk0L2Rvd25sb2FkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5MiArMCwwIEBACi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIg0KLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+DQotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPg0KLTxoZWFkPg0KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0NCi0iSFRNTCBUaWR5IGZvciBXaW5kb3dzICh2ZXJzIDE0IEp1bmUgMjAwNyksIHNlZSB3d3cudzMub3JnIiAvPg0KLTxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0iIiAvPg0KLTx0aXRsZT5BeGlzMiAwLjk0IFJlbGVhc2U8L3RpdGxlPg0KLTwvaGVhZD4NCi08Ym9keT4NCi08aDI+QXhpczIgMC45NCBSZWxlYXNlPC9oMj4NCi08ZGl2IGFsaWduPSJsZWZ0Ij4NCi08cD5TZWUgPGEgaHJlZj0NCi0iaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvMF85NC9pbnN0YWxsYXRpb25ndWlkZS5odG1sIj5JbnN0YWxsYXRpb24NCi1HdWlkZTwvYT4gdG8gc2VlIGRlc2NyaXB0aW9uIG9uIGRpZmZlcmVudCBkb3dubG9hZGFibGVzIG9mIHRoaXMNCi1yZWxlYXNlLjwvcD4NCi08L2Rpdj4NCi08ZGl2Pg0KLTxoMz5TdGFuZGFyZCBEaXN0cmlidXRpb248L2gzPg0KLTxwPkJpbmFyeSBEaXN0cmlidXRpb24gPGEgaHJlZj0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzBfOTQvYXhpczItc3RkLTAuOTQtYmluLnppcCINCi10aXRsZT0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzBfOTQvYXhpczItc3RkLTAuOTQtYmluLnppcCI+DQotemlwPC9hPiA8YSBocmVmPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMF85NC9heGlzMi1zdGQtMC45NC1iaW4uemlwLm1kNSINCi10aXRsZT0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzBfOTQvYXhpczItc3RkLTAuOTQtYmluLnppcC5tZDUiPg0KLU1ENTwvYT4gPGEgaHJlZj0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzBfOTQvYXhpczItc3RkLTAuOTQtYmluLnppcC5hc2MiDQotdGl0bGU9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8wXzk0L2F4aXMyLXN0ZC0wLjk0LWJpbi56aXAuYXNjIj4NCi1QR1A8L2E+PGJyIC8+DQotU291cmNlIERpc3RyaWJ1dGlvbiA8YSBocmVmPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMF85NC9heGlzMi1zdGQtMC45NC1zcmMuemlwIg0KLXRpdGxlPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMF85NC9heGlzMi1zdGQtMC45NC1zcmMuemlwIj4NCi16aXA8L2E+IDxhIGhyZWY9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8wXzk0L2F4aXMyLXN0ZC0wLjk0LXNyYy56aXAubWQ1Ig0KLXRpdGxlPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMF85NC9heGlzMi1zdGQtMC45NC1zcmMuemlwLm1kNSI+DQotTUQ1PC9hPiA8YSBocmVmPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMF85NC9heGlzMi1zdGQtMC45NC1zcmMuemlwLmFzYyINCi10aXRsZT0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzBfOTQvYXhpczItc3RkLTAuOTQtc3JjLnppcC5hc2MiPg0KLVBHUDwvYT48YnIgLz48L3A+DQotPGgzPk1pbmltYWwgRGlzdHJpYnV0aW9uPC9oMz4NCi08cD5CaW5hcnkgRGlzdHJpYnV0aW9uIDxhIGhyZWY9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8wXzk0L2F4aXMyLW1pbi0wLjk0LWJpbi56aXAiDQotdGl0bGU9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8wXzk0L2F4aXMyLW1pbi0wLjk0LWJpbi56aXAiPg0KLXppcDwvYT4gPGEgaHJlZj0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzBfOTQvYXhpczItbWluLTAuOTQtYmluLnppcC5tZDUiDQotdGl0bGU9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8wXzk0L2F4aXMyLW1pbi0wLjk0LWJpbi56aXAubWQ1Ij4NCi1NRDU8L2E+IDxhIGhyZWY9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8wXzk0L2F4aXMyLW1pbi0wLjk0LWJpbi56aXAuYXNjIg0KLXRpdGxlPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMF85NC9heGlzMi1taW4tMC45NC1iaW4uemlwLmFzYyI+DQotUEdQPC9hPjxiciAvPg0KLVNvdXJjZSBEaXN0cmlidXRpb24gPGEgaHJlZj0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzBfOTQvYXhpczItbWluLTAuOTQtc3JjLnppcCINCi10aXRsZT0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzBfOTQvYXhpczItbWluLTAuOTQtc3JjLnppcCI+DQotemlwPC9hPiA8YSBocmVmPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMF85NC9heGlzMi1taW4tMC45NC1zcmMuemlwLm1kNSINCi10aXRsZT0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzBfOTQvYXhpczItbWluLTAuOTQtc3JjLnppcC5tZDUiPg0KLU1ENTwvYT4gPGEgaHJlZj0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzBfOTQvYXhpczItbWluLTAuOTQtc3JjLnppcC5hc2MiDQotdGl0bGU9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8wXzk0L2F4aXMyLW1pbi0wLjk0LXNyYy56aXAuYXNjIj4NCi1QR1A8L2E+PGJyIC8+PC9wPg0KLTxoMz5XYXIgRGlzdHJpYnV0aW9uPC9oMz4NCi08cD48YSBocmVmPSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMF85NC9heGlzMi53YXIiDQotdGl0bGU9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8wXzk0L2F4aXMyLndhciI+emlwPC9hPg0KLTxhIGhyZWY9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8wXzk0L2F4aXMyLndhci5tZDUiIHRpdGxlPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMF85NC9heGlzMi53YXIubWQ1Ij5NRDU8L2E+DQotPGEgaHJlZj0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzBfOTQvYXhpczIud2FyLmFzYyIgdGl0bGU9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8wXzk0L2F4aXMyLndhci5hc2MiPlBHUDwvYT48L3A+DQotPGgzPkRvY3VtZW50cyBEaXN0cmlidXRpb248L2gzPg0KLTxwPjxhIGhyZWY9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8wXzk0L2F4aXMyLTAuOTQtZG9jcy56aXAiDQotdGl0bGU9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8wXzk0L2F4aXMyLTAuOTQtZG9jcy56aXAiPnppcDwvYT4NCi08YSBocmVmPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMF85NC9heGlzMi0wLjk0LWRvY3MuemlwLm1kNSINCi10aXRsZT0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzBfOTQvYXhpczItMC45NC1kb2NzLnppcC5tZDUiPg0KLU1ENTwvYT4gPGEgaHJlZj0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzBfOTQvYXhpczItMC45NC1kb2NzLnppcC5hc2MiDQotdGl0bGU9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8wXzk0L2F4aXMyLTAuOTQtZG9jcy56aXAuYXNjIj4NCi1QR1A8L2E+PGJyIC8+PC9wPg0KLTxoMz5QbHVnaW5zIERpc3RyaWJ1dGlvbjwvaDM+DQotPHA+QXhpczIgU2VydmljZSBBcmNoaXZlciBlY2xpcHNlIHBsdWdpbiA8YSBocmVmPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMF85NC9BeGlzMl9TZXJ2aWNlX0FyY2hpdmVyLnppcCINCi10aXRsZT0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzBfOTQvQXhpczJfU2VydmljZV9BcmNoaXZlci56aXAiPg0KLXppcDwvYT4gPGEgaHJlZj0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzBfOTQvQXhpczJfU2VydmljZV9BcmNoaXZlci56aXAubWQ1Ig0KLXRpdGxlPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMF85NC9BeGlzMl9TZXJ2aWNlX0FyY2hpdmVyLnppcC5tZDUiPg0KLU1ENTwvYT4gPGEgaHJlZj0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzBfOTQvQXhpczJfU2VydmljZV9BcmNoaXZlci56aXAuYXNjIg0KLXRpdGxlPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMF85NC9BeGlzMl9TZXJ2aWNlX0FyY2hpdmVyLnppcC5hc2MiPg0KLVBHUDwvYT48YnIgLz4NCi1BeGlzMiBDb2RlIEdlbmVyYXRvciBlY2xpcHNlIHBsdWdpbiA8YSBocmVmPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMF85NC9BeGlzMl9Db2RlX0dlbmVyYXRvci56aXAiDQotdGl0bGU9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8wXzk0L0F4aXMyX0NvZGVfR2VuZXJhdG9yLnppcCI+DQotemlwPC9hPiA8YSBocmVmPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMF85NC9BeGlzMl9Db2RlX0dlbmVyYXRvci56aXAubWQ1Ig0KLXRpdGxlPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMF85NC9BeGlzMl9Db2RlX0dlbmVyYXRvci56aXAubWQ1Ij4NCi1NRDU8L2E+IDxhIGhyZWY9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8wXzk0L0F4aXMyX0NvZGVfR2VuZXJhdG9yLnppcC5hc2MiDQotdGl0bGU9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8wXzk0L0F4aXMyX0NvZGVfR2VuZXJhdG9yLnppcC5hc2MiPg0KLVBHUDwvYT48YnIgLz4NCi1JREVBIHBsdWdpbiA8YSBocmVmPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMF85NC9BeGlzMklkZWFfcGx1Z19pbi56aXAiDQotdGl0bGU9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8wXzk0L0F4aXMySWRlYV9wbHVnX2luLnppcCI+DQotemlwPC9hPiA8YSBocmVmPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMF85NC9BeGlzMklkZWFfcGx1Z19pbi56aXAubWQ1Ig0KLXRpdGxlPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMF85NC9BeGlzMklkZWFfcGx1Z19pbi56aXAubWQ1Ij4NCi1NRDU8L2E+IDxhIGhyZWY9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8wXzk0L0F4aXMySWRlYV9wbHVnX2luLnppcC5hc2MiDQotdGl0bGU9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8wXzk0L0F4aXMySWRlYV9wbHVnX2luLnppcC5hc2MiPg0KLVBHUDwvYT48L3A+DQotPC9kaXY+DQotPCEtLTxkaXYgYWxpZ249ImxlZnQiPg0KLTxici8+DQotDQotDQotPHA+W2lmLWFueSBsb2dvXSA8YSBocmVmPSJbbGlua10iPjxpbWcgYWxpZ249InJpZ2h0IiBzcmM9Iltsb2dvXSINCi1ib3JkZXI9IjAiPjwvYT5bZW5kXSBUaGUgY3VycmVudGx5IHNlbGVjdGVkIG1pcnJvciBpcyA8Yj5bcHJlZmVycmVkXTwvYj4uICBJZg0KLXlvdSBlbmNvdW50ZXIgYSBwcm9ibGVtIHdpdGggdGhpcyBtaXJyb3IsIHBsZWFzZSBzZWxlY3QgYW5vdGhlciBtaXJyb3IuICBJZg0KLWFsbCBtaXJyb3JzIGFyZSBmYWlsaW5nLCB0aGVyZSBhcmUgPGk+YmFja3VwPC9pPiBtaXJyb3JzIChhdCB0aGUgZW5kIG9mIHRoZQ0KLW1pcnJvcnMgbGlzdCkgdGhhdCBzaG91bGQgYmUgYXZhaWxhYmxlLjwvcD4NCi0NCi08Zm9ybSBhY3Rpb249Iltsb2NhdGlvbl0iIG1ldGhvZD0iZ2V0IiBpZD0iU2VsZWN0TWlycm9yIj4NCi0gIE90aGVyIG1pcnJvcnM6IA0KLSAgPHNlbGVjdCBuYW1lPSJQcmVmZXJyZWQiPltpZi1hbnkgaHR0cF1bZm9yIGh0dHBdDQotICAgIDxvcHRpb24gdmFsdWU9IltodHRwXSINCi0gICAgc2VsZWN0ZWQ9InNlbGVjdGVkIj5baHR0cF08L29wdGlvbj5bZW5kXVtlbmRdW2lmLWFueSBmdHBdW2ZvciBmdHBdDQotICAgIDxvcHRpb24gdmFsdWU9IltmdHBdIj5bZnRwXTwvb3B0aW9uPltlbmRdW2VuZF1baWYtYW55IGJhY2t1cF1bZm9yIGJhY2t1cF0NCi0gICAgPG9wdGlvbiB2YWx1ZT0iW2JhY2t1cF0iPltiYWNrdXBdIChiYWNrdXApPC9vcHRpb24+W2VuZF1bZW5kXQ0KLSAgPC9zZWxlY3Q+DQotICAgDQotICA8aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iQ2hhbmdlIj48L2Zvcm0+DQotDQotPHA+WW91IG1heSBhbHNvIGNvbnN1bHQgdGhlIDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9taXJyb3JzLyI+Y29tcGxldGUNCi1saXN0IG9mIG1pcnJvcnM8L2E+LjwvcD4NCi0NCi08cD48c3Ryb25nPk5vdGU6PC9zdHJvbmc+IHdoZW4gZG93bmxvYWRpbmcgZnJvbSBhIG1pcnJvciBwbGVhc2UgY2hlY2sgdGhlIDxhDQotaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rldi9yZWxlYXNlLXNpZ25pbmcjbWQ1Ij5tZDVzdW08L2E+IGFuZCB2ZXJpZnkNCi10aGUgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rldi9yZWxlYXNlLXNpZ25pbmcjb3BlbnBncCI+T3BlblBHUDwvYT4NCi1jb21wYXRpYmxlIHNpZ25hdHVyZSBmcm9tIHRoZSBtYWluIEFwYWNoZSBzaXRlLiBUaGVzZSBjYW4gYmUgZG93bmxvYWRlZCBieQ0KLWZvbGxvd2luZyB0aGUgbGlua3MgYWJvdmUuIFRoaXMgPGENCi1ocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi9LRVlTIj5LRVlTPC9hPiBmaWxlIGNvbnRhaW5zIHRoZQ0KLXB1YmxpYyBrZXlzIHVzZWQgZm9yIHNpZ25pbmcgcmVsZWFzZS4gSXQgaXMgcmVjb21tZW5kZWQgdGhhdCAod2hlbiBwb3NzaWJsZSkNCi1hIDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kZXYvcmVsZWFzZS1zaWduaW5nI3dlYi1vZi10cnVzdCI+V2ViIG9mDQotdHJ1c3Q8L2E+IGlzIHVzZWQgdG8gY29uZmlybSB0aGUgaWRlbnRpdHkgb2YgdGhlc2Uga2V5cy48L3A+DQotPC9kaXY+LS0+DQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL2Rvd25sb2FkLzBfOTUvZG93bmxvYWQuY2dpIGIvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9kb3dubG9hZC8wXzk1L2Rvd25sb2FkLmNnaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmE5ZjhkMy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL2Rvd25sb2FkLzBfOTUvZG93bmxvYWQuY2dpCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIyEvYmluL3NoCi0KLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIyAKLSMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jIAotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jIFdyYXBwZXIgc2NyaXB0IGFyb3VuZCBtaXJyb3JzLmNnaSBzY3JpcHQKLSMgKHdlIG11c3QgY2hhbmdlIHRvIHRoYXQgZGlyZWN0b3J5IGluIG9yZGVyIGZvciBweXRob24gdG8gcGljayB1cCB0aGUKLSMgIHB5dGhvbiBpbmNsdWRlcyBjb3JyZWN0bHkpCi1jZCAvd3d3L3d3dy5hcGFjaGUub3JnL2R5bi9taXJyb3JzCi0vd3d3L3d3dy5hcGFjaGUub3JnL2R5bi9taXJyb3JzL21pcnJvcnMuY2dpICQqClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9kb3dubG9hZC8wXzk1L2Rvd25sb2FkLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvZG93bmxvYWQvMF85NS9kb3dubG9hZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5MjQyYWQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9kb3dubG9hZC8wXzk1L2Rvd25sb2FkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIg0KLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+DQotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPg0KLTxoZWFkPg0KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0NCi0iSFRNTCBUaWR5IGZvciBXaW5kb3dzICh2ZXJzIDE0IEp1bmUgMjAwNyksIHNlZSB3d3cudzMub3JnIiAvPg0KLTxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0iIiAvPg0KLTx0aXRsZT5BeGlzMiAwLjk1IFJlbGVhc2U8L3RpdGxlPg0KLTwvaGVhZD4NCi08Ym9keT4NCi08aDI+QXhpczIgMC45NSBSZWxlYXNlPC9oMj4NCi08cD5TZWUgPGEgaHJlZj0NCi0iaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvMF85NS9pbnN0YWxsYXRpb25ndWlkZS5odG1sIj5JbnN0YWxsYXRpb24NCi1HdWlkZTwvYT4gdG8gc2VlZGVzY3JpcHRpb24gb24gZGlmZmVyZW50IGRvd25sb2FkYWJsZXMgb2YgdGhpcw0KLXJlbGVhc2UuPC9wPg0KLTxkaXY+DQotPGgzPlN0YW5kYXJkIERpc3RyaWJ1dGlvbjwvaDM+DQotQmluYXJ5IERpc3RyaWJ1dGlvbiA8YSBocmVmPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMF85NS9heGlzMi1zdGQtMC45NS1iaW4uemlwIg0KLXRpdGxlPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMF85NS9heGlzMi1zdGQtMC45NS1iaW4uemlwIj4NCi16aXA8L2E+IDxhIGhyZWY9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8wXzk1L2F4aXMyLXN0ZC0wLjk1LWJpbi56aXAubWQ1Ig0KLXRpdGxlPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMF85NS9heGlzMi1zdGQtMC45NS1iaW4uemlwLm1kNSI+DQotTUQ1PC9hPiA8YSBocmVmPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMF85NS9heGlzMi1zdGQtMC45NS1iaW4uemlwLmFzYyINCi10aXRsZT0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzBfOTUvYXhpczItc3RkLTAuOTUtYmluLnppcC5hc2MiPg0KLVBHUDwvYT48YnIgLz4NCi1Tb3VyY2UgRGlzdHJpYnV0aW9uIDxhIGhyZWY9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8wXzk1L2F4aXMyLXN0ZC0wLjk1LXNyYy56aXAiDQotdGl0bGU9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8wXzk1L2F4aXMyLXN0ZC0wLjk1LXNyYy56aXAiPg0KLXppcDwvYT4gPGEgaHJlZj0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzBfOTUvYXhpczItc3RkLTAuOTUtc3JjLnppcC5tZDUiDQotdGl0bGU9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8wXzk1L2F4aXMyLXN0ZC0wLjk1LXNyYy56aXAubWQ1Ij4NCi1NRDU8L2E+IDxhIGhyZWY9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8wXzk1L2F4aXMyLXN0ZC0wLjk1LXNyYy56aXAuYXNjIg0KLXRpdGxlPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMF85NS9heGlzMi1zdGQtMC45NS1zcmMuemlwLmFzYyI+DQotUEdQPC9hPjxiciAvPg0KLTxoMz5NaW5pbWFsIERpc3RyaWJ1dGlvbjwvaDM+DQotQmluYXJ5IERpc3RyaWJ1dGlvbiA8YSBocmVmPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMF85NS9heGlzMi1taW4tMC45NS1iaW4uemlwIg0KLXRpdGxlPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMF85NS9heGlzMi1taW4tMC45NS1iaW4uemlwIj4NCi16aXA8L2E+IDxhIGhyZWY9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8wXzk1L2F4aXMyLW1pbi0wLjk1LWJpbi56aXAubWQ1Ig0KLXRpdGxlPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMF85NS9heGlzMi1taW4tMC45NS1iaW4uemlwLm1kNSI+DQotTUQ1PC9hPiA8YSBocmVmPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMF85NS9heGlzMi1taW4tMC45NS1iaW4uemlwLmFzYyINCi10aXRsZT0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzBfOTUvYXhpczItbWluLTAuOTUtYmluLnppcC5hc2MiPg0KLVBHUDwvYT48YnIgLz4NCi1Tb3VyY2UgRGlzdHJpYnV0aW9uIDxhIGhyZWY9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8wXzk1L2F4aXMyLW1pbi0wLjk1LXNyYy56aXAiDQotdGl0bGU9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8wXzk1L2F4aXMyLW1pbi0wLjk1LXNyYy56aXAiPg0KLXppcDwvYT4gPGEgaHJlZj0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzBfOTUvYXhpczItbWluLTAuOTUtc3JjLnppcC5tZDUiDQotdGl0bGU9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8wXzk1L2F4aXMyLW1pbi0wLjk1LXNyYy56aXAubWQ1Ij4NCi1NRDU8L2E+IDxhIGhyZWY9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8wXzk1L2F4aXMyLW1pbi0wLjk1LXNyYy56aXAuYXNjIg0KLXRpdGxlPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMF85NS9heGlzMi1taW4tMC45NS1zcmMuemlwLmFzYyI+DQotUEdQPC9hPjxiciAvPg0KLTxoMz5XYXIgRGlzdHJpYnV0aW9uPC9oMz4NCi08YSBocmVmPSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMF85NS9heGlzMi53YXIiDQotdGl0bGU9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8wXzk1L2F4aXMyLndhciI+emlwPC9hPg0KLTxhIGhyZWY9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8wXzk1L2F4aXMyLndhci5tZDUiIHRpdGxlPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMF85NS9heGlzMi53YXIubWQ1Ij5NRDU8L2E+DQotPGEgaHJlZj0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzBfOTUvYXhpczIud2FyLmFzYyIgdGl0bGU9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8wXzk1L2F4aXMyLndhci5hc2MiPlBHUDwvYT48YnIgLz4NCi0NCi08aDM+RG9jdW1lbnRzIERpc3RyaWJ1dGlvbjwvaDM+DQotPHA+PGEgaHJlZj0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzBfOTUvYXhpczItMC45NS1kb2NzLnppcCI+emlwPC9hPg0KLTxhIGhyZWY9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8wXzk1L2F4aXMyLTAuOTUtZG9jcy56aXAubWQ1Ig0KLXRpdGxlPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMF85NS9heGlzMi0wLjk1LWRvY3MuemlwLm1kNSI+DQotTUQ1PC9hPiA8YSBocmVmPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMF85NS9heGlzMi0wLjk1LWRvY3MuemlwLmFzYyINCi10aXRsZT0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzBfOTUvYXhpczItMC45NS1kb2NzLnppcC5hc2MiPg0KLVBHUDwvYT48YnIgLz48L3A+DQotPC9kaXY+DQotPCEtLTxkaXYgYWxpZ249ImxlZnQiPg0KLTxici8+DQotDQotPHA+W2lmLWFueSBsb2dvXSA8YSBocmVmPSJbbGlua10iPjxpbWcgYWxpZ249InJpZ2h0IiBzcmM9Iltsb2dvXSINCi1ib3JkZXI9IjAiPjwvYT5bZW5kXSBUaGUgY3VycmVudGx5IHNlbGVjdGVkIG1pcnJvciBpcyA8Yj5bcHJlZmVycmVkXTwvYj4uICBJZg0KLXlvdSBlbmNvdW50ZXIgYSBwcm9ibGVtIHdpdGggdGhpcyBtaXJyb3IsIHBsZWFzZSBzZWxlY3QgYW5vdGhlciBtaXJyb3IuICBJZg0KLWFsbCBtaXJyb3JzIGFyZSBmYWlsaW5nLCB0aGVyZSBhcmUgPGk+YmFja3VwPC9pPiBtaXJyb3JzIChhdCB0aGUgZW5kIG9mIHRoZQ0KLW1pcnJvcnMgbGlzdCkgdGhhdCBzaG91bGQgYmUgYXZhaWxhYmxlLjwvcD4NCi0NCi08Zm9ybSBhY3Rpb249Iltsb2NhdGlvbl0iIG1ldGhvZD0iZ2V0IiBpZD0iU2VsZWN0TWlycm9yIj4NCi0gIE90aGVyIG1pcnJvcnM6IA0KLSAgPHNlbGVjdCBuYW1lPSJQcmVmZXJyZWQiPltpZi1hbnkgaHR0cF1bZm9yIGh0dHBdDQotICAgIDxvcHRpb24gdmFsdWU9IltodHRwXSINCi0gICAgc2VsZWN0ZWQ9InNlbGVjdGVkIj5baHR0cF08L29wdGlvbj5bZW5kXVtlbmRdW2lmLWFueSBmdHBdW2ZvciBmdHBdDQotICAgIDxvcHRpb24gdmFsdWU9IltmdHBdIj5bZnRwXTwvb3B0aW9uPltlbmRdW2VuZF1baWYtYW55IGJhY2t1cF1bZm9yIGJhY2t1cF0NCi0gICAgPG9wdGlvbiB2YWx1ZT0iW2JhY2t1cF0iPltiYWNrdXBdIChiYWNrdXApPC9vcHRpb24+W2VuZF1bZW5kXQ0KLSAgPC9zZWxlY3Q+DQotICAgDQotICA8aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iQ2hhbmdlIj48L2Zvcm0+DQotDQotPHA+WW91IG1heSBhbHNvIGNvbnN1bHQgdGhlIDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9taXJyb3JzLyI+Y29tcGxldGUNCi1saXN0IG9mIG1pcnJvcnM8L2E+LjwvcD4NCi0NCi08cD48c3Ryb25nPk5vdGU6PC9zdHJvbmc+IHdoZW4gZG93bmxvYWRpbmcgZnJvbSBhIG1pcnJvciBwbGVhc2UgY2hlY2sgdGhlIDxhDQotaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rldi9yZWxlYXNlLXNpZ25pbmcjbWQ1Ij5tZDVzdW08L2E+IGFuZCB2ZXJpZnkNCi10aGUgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rldi9yZWxlYXNlLXNpZ25pbmcjb3BlbnBncCI+T3BlblBHUDwvYT4NCi1jb21wYXRpYmxlIHNpZ25hdHVyZSBmcm9tIHRoZSBtYWluIEFwYWNoZSBzaXRlLiBUaGVzZSBjYW4gYmUgZG93bmxvYWRlZCBieQ0KLWZvbGxvd2luZyB0aGUgbGlua3MgYWJvdmUuIFRoaXMgPGENCi1ocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi9LRVlTIj5LRVlTPC9hPiBmaWxlIGNvbnRhaW5zIHRoZQ0KLXB1YmxpYyBrZXlzIHVzZWQgZm9yIHNpZ25pbmcgcmVsZWFzZS4gSXQgaXMgcmVjb21tZW5kZWQgdGhhdCAod2hlbiBwb3NzaWJsZSkNCi1hIDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kZXYvcmVsZWFzZS1zaWduaW5nI3dlYi1vZi10cnVzdCI+V2ViIG9mDQotdHJ1c3Q8L2E+IGlzIHVzZWQgdG8gY29uZmlybSB0aGUgaWRlbnRpdHkgb2YgdGhlc2Uga2V5cy48L3A+DQotPC9kaXY+LS0+DQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL2Rvd25sb2FkLzFfMC9kb3dubG9hZC5jZ2kgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL2Rvd25sb2FkLzFfMC9kb3dubG9hZC5jZ2kKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJhOWY4ZDMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9kb3dubG9hZC8xXzAvZG93bmxvYWQuY2dpCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIyEvYmluL3NoCi0KLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIyAKLSMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jIAotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jIFdyYXBwZXIgc2NyaXB0IGFyb3VuZCBtaXJyb3JzLmNnaSBzY3JpcHQKLSMgKHdlIG11c3QgY2hhbmdlIHRvIHRoYXQgZGlyZWN0b3J5IGluIG9yZGVyIGZvciBweXRob24gdG8gcGljayB1cCB0aGUKLSMgIHB5dGhvbiBpbmNsdWRlcyBjb3JyZWN0bHkpCi1jZCAvd3d3L3d3dy5hcGFjaGUub3JnL2R5bi9taXJyb3JzCi0vd3d3L3d3dy5hcGFjaGUub3JnL2R5bi9taXJyb3JzL21pcnJvcnMuY2dpICQqClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9kb3dubG9hZC8xXzAvZG93bmxvYWQueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9kb3dubG9hZC8xXzAvZG93bmxvYWQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjMxM2ZkLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvZG93bmxvYWQvMV8wL2Rvd25sb2FkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE1MiArMCwwIEBACi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIg0KLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+DQotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPg0KLTxoZWFkPg0KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0NCi0iSFRNTCBUaWR5IGZvciBXaW5kb3dzICh2ZXJzIDE0IEp1bmUgMjAwNyksIHNlZSB3d3cudzMub3JnIiAvPg0KLTxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0iIiAvPg0KLTx0aXRsZT5BeGlzMiAxLjAgUmVsZWFzZTwvdGl0bGU+DQotPC9oZWFkPg0KLTxib2R5Pg0KLTxoMj5BeGlzMiAxLjAgUmVsZWFzZTwvaDI+DQotPGRpdiBhbGlnbj0ibGVmdCI+DQotPHA+U2VlIDxhIGhyZWY9DQotImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyLzFfMC9pbnN0YWxsYXRpb25ndWlkZS5odG1sI0Rvd25sb2FkX0F4aXMyIj4NCi1JbnN0YWxsYXRpb24gR3VpZGU8L2E+IHRvIHNlZSBkZXNjcmlwdGlvbiBvbiBkaWZmZXJlbnQNCi1kb3dubG9hZGFibGVzIG9mIHRoaXMgcmVsZWFzZS48L3A+DQotPC9kaXY+DQotPGRpdj4NCi08aDM+U3RhbmRhcmQgRGlzdHJpYnV0aW9uPC9oMz4NCi1CaW5hcnkgRGlzdHJpYnV0aW9uIDxhIGhyZWY9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8xXzAvYXhpczItc3RkLTEuMC1iaW4uemlwIg0KLXRpdGxlPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMV8wL2F4aXMyLXN0ZC0xLjAtYmluLnppcCI+DQotemlwPC9hPiA8YSBocmVmPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMV8wL2F4aXMyLXN0ZC0xLjAtYmluLnppcC5tZDUiDQotdGl0bGU9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8xXzAvYXhpczItc3RkLTEuMC1iaW4uemlwLm1kNSI+DQotTUQ1PC9hPiA8YSBocmVmPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMV8wL2F4aXMyLXN0ZC0xLjAtYmluLnppcC5hc2MiDQotdGl0bGU9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8xXzAvYXhpczItc3RkLTEuMC1iaW4uemlwLmFzYyI+DQotUEdQPC9hPjxiciAvPg0KLVNvdXJjZSBEaXN0cmlidXRpb24gPGEgaHJlZj0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzFfMC9heGlzMi1zdGQtMS4wLXNyYy56aXAiDQotdGl0bGU9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8xXzAvYXhpczItc3RkLTEuMC1zcmMuemlwIj4NCi16aXA8L2E+IDxhIGhyZWY9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8xXzAvYXhpczItc3RkLTEuMC1zcmMuemlwLm1kNSINCi10aXRsZT0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzFfMC9heGlzMi1zdGQtMS4wLXNyYy56aXAubWQ1Ij4NCi1NRDU8L2E+IDxhIGhyZWY9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8xXzAvYXhpczItc3RkLTEuMC1zcmMuemlwLmFzYyINCi10aXRsZT0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzFfMC9heGlzMi1zdGQtMS4wLXNyYy56aXAuYXNjIj4NCi1QR1A8L2E+PGJyIC8+DQotPGgzPk1pbmltYWwgRGlzdHJpYnV0aW9uPC9oMz4NCi1CaW5hcnkgRGlzdHJpYnV0aW9uIDxhIGhyZWY9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8xXzAvYXhpczItbWluLTEuMC1iaW4uemlwIg0KLXRpdGxlPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMV8wL2F4aXMyLW1pbi0xLjAtYmluLnppcCI+DQotemlwPC9hPiA8YSBocmVmPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMV8wL2F4aXMyLW1pbi0xLjAtYmluLnppcC5tZDUiDQotdGl0bGU9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8xXzAvYXhpczItbWluLTEuMC1iaW4uemlwLm1kNSI+DQotTUQ1PC9hPiA8YSBocmVmPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMV8wL2F4aXMyLW1pbi0xLjAtYmluLnppcC5hc2MiDQotdGl0bGU9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8xXzAvYXhpczItbWluLTEuMC1iaW4uemlwLmFzYyI+DQotUEdQPC9hPjxiciAvPg0KLVNvdXJjZSBEaXN0cmlidXRpb24gPGEgaHJlZj0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzFfMC9heGlzMi1taW4tMS4wLXNyYy56aXAiDQotdGl0bGU9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8xXzAvYXhpczItbWluLTEuMC1zcmMuemlwIj4NCi16aXA8L2E+IDxhIGhyZWY9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8xXzAvYXhpczItbWluLTEuMC1zcmMuemlwLm1kNSINCi10aXRsZT0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzFfMC9heGlzMi1taW4tMS4wLXNyYy56aXAubWQ1Ij4NCi1NRDU8L2E+IDxhIGhyZWY9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8xXzAvYXhpczItbWluLTEuMC1zcmMuemlwLmFzYyINCi10aXRsZT0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzFfMC9heGlzMi1taW4tMS4wLXNyYy56aXAuYXNjIj4NCi1QR1A8L2E+PGJyIC8+DQotPGgzPldhciBEaXN0cmlidXRpb248L2gzPg0KLTxhIGhyZWY9Imh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8xXzAvYXhpczIud2FyIg0KLXRpdGxlPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMV8wL2F4aXMyLndhciI+emlwPC9hPg0KLTxhIGhyZWY9Imh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8xXzAvYXhpczIud2FyLm1kNSINCi10aXRsZT0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzFfMC9heGlzMi53YXIubWQ1Ij5NRDU8L2E+DQotPGEgaHJlZj0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzFfMC9heGlzMi53YXIuYXNjIg0KLXRpdGxlPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMV8wL2F4aXMyLndhci5hc2MiPlBHUDwvYT48YnIgLz4NCi0NCi08aDM+RG9jdW1lbnRzIERpc3RyaWJ1dGlvbjwvaDM+DQotPGEgaHJlZj0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzFfMC9heGlzMi0xLjAtZG9jcy56aXAiDQotdGl0bGU9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8xXzAvYXhpczItMS4wLWRvY3MuemlwIj56aXA8L2E+DQotPGEgaHJlZj0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzFfMC9heGlzMi0xLjAtZG9jcy56aXAubWQ1Ig0KLXRpdGxlPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMV8wL2F4aXMyLTEuMC1kb2NzLnppcC5tZDUiPg0KLU1ENTwvYT4gPGEgaHJlZj0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzFfMC9heGlzMi0xLjAtZG9jcy56aXAuYXNjIg0KLXRpdGxlPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMV8wL2F4aXMyLTEuMC1kb2NzLnppcC5hc2MiPg0KLVBHUDwvYT48YnIgLz48L2Rpdj4NCi08IS0tPGRpdiBhbGlnbj0ibGVmdCI+DQotPGJyLz4NCi0NCi0NCi08cD5baWYtYW55IGxvZ29dIDxhIGhyZWY9IltsaW5rXSI+PGltZyBhbGlnbj0icmlnaHQiIHNyYz0iW2xvZ29dIg0KLWJvcmRlcj0iMCI+PC9hPltlbmRdIFRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgbWlycm9yIGlzIDxiPltwcmVmZXJyZWRdPC9iPi4gIElmDQoteW91IGVuY291bnRlciBhIHByb2JsZW0gd2l0aCB0aGlzIG1pcnJvciwgcGxlYXNlIHNlbGVjdCBhbm90aGVyIG1pcnJvci4gIElmDQotYWxsIG1pcnJvcnMgYXJlIGZhaWxpbmcsIHRoZXJlIGFyZSA8aT5iYWNrdXA8L2k+IG1pcnJvcnMgKGF0IHRoZSBlbmQgb2YgdGhlDQotbWlycm9ycyBsaXN0KSB0aGF0IHNob3VsZCBiZSBhdmFpbGFibGUuPC9wPg0KLQ0KLTxmb3JtIGFjdGlvbj0iW2xvY2F0aW9uXSIgbWV0aG9kPSJnZXQiIGlkPSJTZWxlY3RNaXJyb3IiPg0KLSAgT3RoZXIgbWlycm9yczogDQotICA8c2VsZWN0IG5hbWU9IlByZWZlcnJlZCI+W2lmLWFueSBodHRwXVtmb3IgaHR0cF0NCi0gICAgPG9wdGlvbiB2YWx1ZT0iW2h0dHBdIg0KLSAgICBzZWxlY3RlZD0ic2VsZWN0ZWQiPltodHRwXTwvb3B0aW9uPltlbmRdW2VuZF1baWYtYW55IGZ0cF1bZm9yIGZ0cF0NCi0gICAgPG9wdGlvbiB2YWx1ZT0iW2Z0cF0iPltmdHBdPC9vcHRpb24+W2VuZF1bZW5kXVtpZi1hbnkgYmFja3VwXVtmb3IgYmFja3VwXQ0KLSAgICA8b3B0aW9uIHZhbHVlPSJbYmFja3VwXSI+W2JhY2t1cF0gKGJhY2t1cCk8L29wdGlvbj5bZW5kXVtlbmRdDQotICA8L3NlbGVjdD4NCi0gICANCi0gIDxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSJDaGFuZ2UiPjwvZm9ybT4NCi0NCi08cD5Zb3UgbWF5IGFsc28gY29uc3VsdCB0aGUgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL21pcnJvcnMvIj5jb21wbGV0ZQ0KLWxpc3Qgb2YgbWlycm9yczwvYT4uPC9wPg0KLQ0KLTxwPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gd2hlbiBkb3dubG9hZGluZyBmcm9tIGEgbWlycm9yIHBsZWFzZSBjaGVjayB0aGUgPGENCi1ocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGV2L3JlbGVhc2Utc2lnbmluZyNtZDUiPm1kNXN1bTwvYT4gYW5kIHZlcmlmeQ0KLXRoZSA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGV2L3JlbGVhc2Utc2lnbmluZyNvcGVucGdwIj5PcGVuUEdQPC9hPg0KLWNvbXBhdGlibGUgc2lnbmF0dXJlIGZyb20gdGhlIG1haW4gQXBhY2hlIHNpdGUuIFRoZXNlIGNhbiBiZSBkb3dubG9hZGVkIGJ5DQotZm9sbG93aW5nIHRoZSBsaW5rcyBhYm92ZS4gVGhpcyA8YQ0KLWhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyL0tFWVMiPktFWVM8L2E+IGZpbGUgY29udGFpbnMgdGhlDQotcHVibGljIGtleXMgdXNlZCBmb3Igc2lnbmluZyByZWxlYXNlLiBJdCBpcyByZWNvbW1lbmRlZCB0aGF0ICh3aGVuIHBvc3NpYmxlKQ0KLWEgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rldi9yZWxlYXNlLXNpZ25pbmcjd2ViLW9mLXRydXN0Ij5XZWIgb2YNCi10cnVzdDwvYT4gaXMgdXNlZCB0byBjb25maXJtIHRoZSBpZGVudGl0eSBvZiB0aGVzZSBrZXlzLjwvcD4NCi08L2Rpdj4tLT4NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvZG93bmxvYWQvMV8xL2Rvd25sb2FkLmNnaSBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvZG93bmxvYWQvMV8xL2Rvd25sb2FkLmNnaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmE5ZjhkMy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL2Rvd25sb2FkLzFfMS9kb3dubG9hZC5jZ2kKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jIS9iaW4vc2gKLQotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jIAotIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMgCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSMgV3JhcHBlciBzY3JpcHQgYXJvdW5kIG1pcnJvcnMuY2dpIHNjcmlwdAotIyAod2UgbXVzdCBjaGFuZ2UgdG8gdGhhdCBkaXJlY3RvcnkgaW4gb3JkZXIgZm9yIHB5dGhvbiB0byBwaWNrIHVwIHRoZQotIyAgcHl0aG9uIGluY2x1ZGVzIGNvcnJlY3RseSkKLWNkIC93d3cvd3d3LmFwYWNoZS5vcmcvZHluL21pcnJvcnMKLS93d3cvd3d3LmFwYWNoZS5vcmcvZHluL21pcnJvcnMvbWlycm9ycy5jZ2kgJCoKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL2Rvd25sb2FkLzFfMS9kb3dubG9hZC54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL2Rvd25sb2FkLzFfMS9kb3dubG9hZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkODIxNWQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9kb3dubG9hZC8xXzEvZG93bmxvYWQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iDQotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4NCi08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+DQotPGhlYWQ+DQotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PQ0KLSJIVE1MIFRpZHkgZm9yIFdpbmRvd3MgKHZlcnMgMTQgSnVuZSAyMDA3KSwgc2VlIHd3dy53My5vcmciIC8+DQotPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSIiIC8+DQotPHRpdGxlPkF4aXMyIDEuMSBSZWxlYXNlPC90aXRsZT4NCi08L2hlYWQ+DQotPGJvZHk+DQotPGgyPkF4aXMyIDEuMSBSZWxlYXNlPC9oMj4NCi08ZGl2Pg0KLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIxIj4NCi08dGJvZHk+DQotPHRyPg0KLTx0aCBzY29wZT0iY29sIj5EaXN0cmlidXRpb24gTmFtZTwvdGg+DQotPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4NCi08IS0tPHRoIHNjb3BlPSJjb2wiPkl0ZW1zPC90aD4tLT4NCi08dGggc2NvcGU9ImNvbCI+RG93bmxvYWQ8L3RoPg0KLTwvdHI+DQotPHRyPg0KLTx0ZD48YSBuYW1lPSJzdGQtYmluIiBpZD0ic3RkLWJpbiI+PC9hPjxzdHJvbmc+U3RhbmRhcmQgQmluYXJ5DQotRGlzdHJpYnV0aW9uPC9zdHJvbmc+PC90ZD4NCi08dGQ+VGhpcyBpcyB0aGUgY29tcGxldGUgdmVyc2lvbiBvZiBBeGlzMiBhbmQgd2lsbCBjb250YWluIHVzZWZ1bA0KLXNhbXBsZXMgYXMgd2VsbC4gVXNlZnVsIGZvciBzb21lIG9uZSB0byBnZXQgZmFtaWxpYXIgd2l0aCBBeGlzMi4NCi0oU2luY2UgV1MtQWRkcmVzc2luZyBpbXBsZW1lbnRhdGlvbiBtb2R1bGUgaXMgZW5nYWdlZCBpbiB0byBBeGlzMiwNCi1ieSBkZWZhdWx0LCB0aGlzIGRpc3RyaWJ1dGlvbiB3aWxsIGNvbnRhaW4gYWRkcmVzc2luZy5tYXIuIEJ1dCB0aGUNCi1vdGhlciBtb2R1bGVzIHRoYXQgYXJlIGJlaW5nIGRldmVsb3BlZCB3aXRoaW4gQXhpczIgd2lsbCBub3QgYmUNCi1pbmNsdWRlZCBoZXJlIGFuZCBhcmUgYXZhaWxhYmxlIHRvIGJlIGRvd25sb2FkZWQgc2VwYXJhdGVseSBmcm9tDQotPGEgaHJlZj0iLi4vLi4vbW9kdWxlcy9pbmRleC5odG1sIj5oZXJlPC9hPi4pPC90ZD4NCi08dGQ+PGEgaHJlZj0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzFfMS9heGlzMi0xLjEuemlwIiB0aXRsZT0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzFfMS9heGlzMi0xLjEuemlwIj56aXA8L2E+DQotPGEgaHJlZj0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzFfMS9heGlzMi0xLjEuemlwLm1kNSINCi10aXRsZT0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzFfMS9heGlzMi0xLjEuemlwLm1kNSI+TUQ1PC9hPg0KLTxhIGhyZWY9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8xXzEvYXhpczItMS4xLnppcC5hc2MiDQotdGl0bGU9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8xXzEvYXhpczItMS4xLnppcC5hc2MiPlBHUDwvYT48L3RkPg0KLTwvdHI+DQotPHRyPg0KLTx0ZD48YSBuYW1lPSJzcmMiIGlkPSJzcmMiPjwvYT4gPHN0cm9uZz5Tb3VyY2UNCi1EaXN0cmlidXRpb248L3N0cm9uZz48L3RkPg0KLTx0ZD5UaGlzIHdpbGwgY29udGFpbiB0aGUgc291cmNlcyBvZiBBeGlzMiBzdGFuZGFyZCBkaXN0cmlidXRpb24uDQotT25lIGNhbiBnZW5lcmF0ZSBhIGJpbmFyeSBkaXN0cmlidXRpb24gZnJvbSB0aGlzIGJ5IHR5cGluZw0KLTxzcGFuIGNsYXNzPSJzdHlsZTEiPiRtYXZlbiBkaXN0LXN0YW5kYXJkLWJpbi48L3NwYW4+ICg8YSBocmVmPQ0KLSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi8xXzEvaW5zdGFsbGF0aW9uZ3VpZGUuaHRtbCNlbnYtc3JjIj5TZXQNCi11cCBBeGlzMiBlbnZpcm9ubWVudDwvYT4gYmVmb3JlIHJ1bm5pbmcgdGhpcyBjb21tYW5kKTwvdGQ+DQotPHRkPjxhIGhyZWY9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8xXzEvYXhpczItMS4xLXNyYy56aXAiDQotdGl0bGU9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8xXzEvYXhpczItMS4xLXNyYy56aXAiPnppcDwvYT4NCi08YSBocmVmPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMV8xL2F4aXMyLTEuMS1zcmMuemlwLm1kNSINCi10aXRsZT0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzFfMS9heGlzMi0xLjEtc3JjLnppcC5tZDUiPg0KLU1ENTwvYT4gPGEgaHJlZj0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzFfMS9heGlzMi0xLjEtc3JjLnppcC5hc2MiDQotdGl0bGU9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8xXzEvYXhpczItMS4xLXNyYy56aXAuYXNjIj4NCi1QR1A8L2E+PC90ZD4NCi08L3RyPg0KLTx0cj4NCi08dGQ+PGEgbmFtZT0id2FyIiBpZD0id2FyIj48L2E+PHN0cm9uZz5XQVIgKFdlYiBBcmNoaXZlKQ0KLURpc3RyaWJ1dGlvbjwvc3Ryb25nPjwvdGQ+DQotPHRkPlRoaXMgd2lsbCBiZSB0aGUgd2ViIGFwcGxpY2F0aW9uIG9mIEF4aXMyIHdoaWNoIGNhbiBiZSBkZXBsb3llZA0KLWluIG1vc3Qgb2YgdGhlIHNlcnZsZXQgY29udGFpbmVycy48L3RkPg0KLTx0ZD48YSBocmVmPSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMV8xL2F4aXMyLndhciINCi10aXRsZT0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzFfMS9heGlzMi53YXIiPnppcDwvYT4NCi08YSBocmVmPSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMV8xL2F4aXMyLndhci5tZDUiDQotdGl0bGU9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8xXzEvYXhpczIud2FyLm1kNSI+TUQ1PC9hPg0KLTxhIGhyZWY9Imh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8xXzEvYXhpczIud2FyLmFzYyINCi10aXRsZT0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzFfMS9heGlzMi53YXIuYXNjIj5QR1A8L2E+PC90ZD4NCi08L3RyPg0KLTx0cj4NCi08dGQ+PHN0cm9uZz5Eb2N1bWVudHMgRGlzdHJpYnV0aW9uPC9zdHJvbmc+PC90ZD4NCi08dGQ+VGhpcyB3aWxsIGNvbnRhaW4gYWxsIHRoZSBkb2N1bWVudGF0aW9uIGluIG9uZSBwYWNrYWdlLjwvdGQ+DQotPHRkPjxhIGhyZWY9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8xXzEvYXhpczItMS4xLWRvY3MuemlwIg0KLXRpdGxlPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMV8xL2F4aXMyLTEuMS1kb2NzLnppcCI+emlwPC9hPg0KLTxhIGhyZWY9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8xXzEvYXhpczItMS4xLWRvY3MuemlwLm1kNSINCi10aXRsZT0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzFfMS9heGlzMi0xLjEtZG9jcy56aXAubWQ1Ij4NCi1NRDU8L2E+IDxhIGhyZWY9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8xXzEvYXhpczItMS4xLWRvY3MuemlwLmFzYyINCi10aXRsZT0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzFfMS9heGlzMi0xLjEtZG9jcy56aXAuYXNjIj4NCi1QR1A8L2E+PC90ZD4NCi08L3RyPg0KLTwvdGJvZHk+DQotPC90YWJsZT4NCi08L2Rpdj4NCi08IS0tPGRpdiBhbGlnbj0ibGVmdCI+DQotPGJyLz4NCi0NCi0NCi08cD5baWYtYW55IGxvZ29dIDxhIGhyZWY9IltsaW5rXSI+PGltZyBhbGlnbj0icmlnaHQiIHNyYz0iW2xvZ29dIg0KLWJvcmRlcj0iMCI+PC9hPltlbmRdIFRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgbWlycm9yIGlzIDxiPltwcmVmZXJyZWRdPC9iPi4gIElmDQoteW91IGVuY291bnRlciBhIHByb2JsZW0gd2l0aCB0aGlzIG1pcnJvciwgcGxlYXNlIHNlbGVjdCBhbm90aGVyIG1pcnJvci4gIElmDQotYWxsIG1pcnJvcnMgYXJlIGZhaWxpbmcsIHRoZXJlIGFyZSA8aT5iYWNrdXA8L2k+IG1pcnJvcnMgKGF0IHRoZSBlbmQgb2YgdGhlDQotbWlycm9ycyBsaXN0KSB0aGF0IHNob3VsZCBiZSBhdmFpbGFibGUuPC9wPg0KLQ0KLTxmb3JtIGFjdGlvbj0iW2xvY2F0aW9uXSIgbWV0aG9kPSJnZXQiIGlkPSJTZWxlY3RNaXJyb3IiPg0KLSAgT3RoZXIgbWlycm9yczogDQotICA8c2VsZWN0IG5hbWU9IlByZWZlcnJlZCI+W2lmLWFueSBodHRwXVtmb3IgaHR0cF0NCi0gICAgPG9wdGlvbiB2YWx1ZT0iW2h0dHBdIg0KLSAgICBzZWxlY3RlZD0ic2VsZWN0ZWQiPltodHRwXTwvb3B0aW9uPltlbmRdW2VuZF1baWYtYW55IGZ0cF1bZm9yIGZ0cF0NCi0gICAgPG9wdGlvbiB2YWx1ZT0iW2Z0cF0iPltmdHBdPC9vcHRpb24+W2VuZF1bZW5kXVtpZi1hbnkgYmFja3VwXVtmb3IgYmFja3VwXQ0KLSAgICA8b3B0aW9uIHZhbHVlPSJbYmFja3VwXSI+W2JhY2t1cF0gKGJhY2t1cCk8L29wdGlvbj5bZW5kXVtlbmRdDQotICA8L3NlbGVjdD4NCi0gICANCi0gIDxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSJDaGFuZ2UiPjwvZm9ybT4NCi0NCi08cD5Zb3UgbWF5IGFsc28gY29uc3VsdCB0aGUgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL21pcnJvcnMvIj5jb21wbGV0ZQ0KLWxpc3Qgb2YgbWlycm9yczwvYT4uPC9wPg0KLQ0KLTxwPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gd2hlbiBkb3dubG9hZGluZyBmcm9tIGEgbWlycm9yIHBsZWFzZSBjaGVjayB0aGUgPGENCi1ocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGV2L3JlbGVhc2Utc2lnbmluZyNtZDUiPm1kNXN1bTwvYT4gYW5kIHZlcmlmeQ0KLXRoZSA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGV2L3JlbGVhc2Utc2lnbmluZyNvcGVucGdwIj5PcGVuUEdQPC9hPg0KLWNvbXBhdGlibGUgc2lnbmF0dXJlIGZyb20gdGhlIG1haW4gQXBhY2hlIHNpdGUuIFRoZXNlIGNhbiBiZSBkb3dubG9hZGVkIGJ5DQotZm9sbG93aW5nIHRoZSBsaW5rcyBhYm92ZS4gVGhpcyA8YQ0KLWhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyL0tFWVMiPktFWVM8L2E+IGZpbGUgY29udGFpbnMgdGhlIA0KLXB1YmxpYyBrZXlzIHRoYXQgY2FuIGJlIHVzZWQgZm9yIHZlcmlmeWluZyBzaWduYXR1cmVzLiBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IA0KLSh3aGVuIHBvc3NpYmxlKWEgDQotPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rldi9yZWxlYXNlLXNpZ25pbmcjd2ViLW9mLXRydXN0Ij5XZWIgb2YNCi10cnVzdDwvYT4gaXMgdXNlZCB0byBjb25maXJtIHRoZSBpZGVudGl0eSBvZiB0aGVzZSBrZXlzLjwvcD4NCi08L2Rpdj4tLT4NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvZG93bmxvYWQvMV8xXzEvZG93bmxvYWQuY2dpIGIvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9kb3dubG9hZC8xXzFfMS9kb3dubG9hZC5jZ2kKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJhOWY4ZDMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9kb3dubG9hZC8xXzFfMS9kb3dubG9hZC5jZ2kKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jIS9iaW4vc2gKLQotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jIAotIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMgCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSMgV3JhcHBlciBzY3JpcHQgYXJvdW5kIG1pcnJvcnMuY2dpIHNjcmlwdAotIyAod2UgbXVzdCBjaGFuZ2UgdG8gdGhhdCBkaXJlY3RvcnkgaW4gb3JkZXIgZm9yIHB5dGhvbiB0byBwaWNrIHVwIHRoZQotIyAgcHl0aG9uIGluY2x1ZGVzIGNvcnJlY3RseSkKLWNkIC93d3cvd3d3LmFwYWNoZS5vcmcvZHluL21pcnJvcnMKLS93d3cvd3d3LmFwYWNoZS5vcmcvZHluL21pcnJvcnMvbWlycm9ycy5jZ2kgJCoKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL2Rvd25sb2FkLzFfMV8xL2Rvd25sb2FkLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvZG93bmxvYWQvMV8xXzEvZG93bmxvYWQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzcwYjgwLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvZG93bmxvYWQvMV8xXzEvZG93bmxvYWQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iDQotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4NCi08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+DQotPGhlYWQ+DQotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PQ0KLSJIVE1MIFRpZHkgZm9yIFdpbmRvd3MgKHZlcnMgMTQgSnVuZSAyMDA3KSwgc2VlIHd3dy53My5vcmciIC8+DQotPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSIiIC8+DQotPHRpdGxlPkF4aXMyIDEuMS4xIFJlbGVhc2U8L3RpdGxlPg0KLTwvaGVhZD4NCi08Ym9keT4NCi08aDI+QXhpczIgMS4xLjEgUmVsZWFzZTwvaDI+DQotPGRpdj4NCi08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMSI+DQotPHRib2R5Pg0KLTx0cj4NCi08dGggc2NvcGU9ImNvbCI+RGlzdHJpYnV0aW9uIE5hbWU8L3RoPg0KLTx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+DQotPCEtLTx0aCBzY29wZT0iY29sIj5JdGVtczwvdGg+LS0+DQotPHRoIHNjb3BlPSJjb2wiPkRvd25sb2FkPC90aD4NCi08L3RyPg0KLTx0cj4NCi08dGQ+PGEgbmFtZT0ic3RkLWJpbiIgaWQ9InN0ZC1iaW4iPjwvYT48c3Ryb25nPlN0YW5kYXJkIEJpbmFyeQ0KLURpc3RyaWJ1dGlvbjwvc3Ryb25nPjwvdGQ+DQotPHRkPlRoaXMgaXMgdGhlIGNvbXBsZXRlIHZlcnNpb24gb2YgQXhpczIgYW5kIHdpbGwgY29udGFpbiB1c2VmdWwNCi1zYW1wbGVzIGFzIHdlbGwuIFVzZWZ1bCBmb3Igc29tZSBvbmUgdG8gZ2V0IGZhbWlsaWFyIHdpdGggQXhpczIuDQotKFNpbmNlIFdTLUFkZHJlc3NpbmcgaW1wbGVtZW50YXRpb24gbW9kdWxlIGlzIGVuZ2FnZWQgaW4gdG8gQXhpczIsDQotYnkgZGVmYXVsdCwgdGhpcyBkaXN0cmlidXRpb24gd2lsbCBjb250YWluIGFkZHJlc3NpbmcubWFyLiBCdXQgdGhlDQotb3RoZXIgbW9kdWxlcyB0aGF0IGFyZSBiZWluZyBkZXZlbG9wZWQgd2l0aGluIEF4aXMyIHdpbGwgbm90IGJlDQotaW5jbHVkZWQgaGVyZSBhbmQgYXJlIGF2YWlsYWJsZSB0byBiZSBkb3dubG9hZGVkIHNlcGFyYXRlbHkgZnJvbQ0KLTxhIGhyZWY9Ii4uLy4uL21vZHVsZXMvaW5kZXguaHRtbCI+aGVyZTwvYT4uKTwvdGQ+DQotPHRkPjxhIGhyZWY9IltwcmVmZXJyZWRdL3dzL2F4aXMyLzFfMV8xL2F4aXMyLTEuMS4xLnppcCIgdGl0bGU9DQotIltwcmVmZXJyZWRdL3dzL2F4aXMyLzFfMV8xL2F4aXMyLTEuMS4xLnppcCI+emlwPC9hPiA8YSBocmVmPQ0KLSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8xXzFfMS9heGlzMi0xLjEuMS56aXAubWQ1Ig0KLXRpdGxlPQ0KLSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8xXzFfMS9heGlzMi0xLjEuMS56aXAubWQ1Ij5NRDU8L2E+DQotPGEgaHJlZj0NCi0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMV8xXzEvYXhpczItMS4xLjEuemlwLmFzYyINCi10aXRsZT0NCi0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMV8xXzEvYXhpczItMS4xLjEuemlwLmFzYyI+UEdQPC9hPjwvdGQ+DQotPC90cj4NCi08dHI+DQotPHRkPjxhIG5hbWU9InNyYyIgaWQ9InNyYyI+PC9hPiA8c3Ryb25nPlNvdXJjZQ0KLURpc3RyaWJ1dGlvbjwvc3Ryb25nPjwvdGQ+DQotPHRkPlRoaXMgd2lsbCBjb250YWluIHRoZSBzb3VyY2VzIG9mIEF4aXMyIHN0YW5kYXJkIGRpc3RyaWJ1dGlvbi4NCi1PbmUgY2FuIGdlbmVyYXRlIGEgYmluYXJ5IGRpc3RyaWJ1dGlvbiBmcm9tIHRoaXMgYnkgdHlwaW5nDQotPHNwYW4gY2xhc3M9InN0eWxlMSI+JG1hdmVuIGRpc3QtYmluLjwvc3Bhbj4gKDxhIGhyZWY9DQotImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyLzFfMV8xL2luc3RhbGxhdGlvbmd1aWRlLmh0bWwjZW52LXNyYyI+U2V0DQotdXAgQXhpczIgZW52aXJvbm1lbnQ8L2E+IGJlZm9yZSBydW5uaW5nIHRoaXMgY29tbWFuZCk8L3RkPg0KLTx0ZD48YSBocmVmPSJbcHJlZmVycmVkXS93cy9heGlzMi8xXzFfMS9heGlzMi0xLjEuMS1zcmMuemlwIiB0aXRsZT0NCi0iW3ByZWZlcnJlZF0vd3MvYXhpczIvMV8xXzEvYXhpczItMS4xLjEtc3JjLnppcCI+emlwPC9hPiA8YSBocmVmPQ0KLSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8xXzFfMS9heGlzMi0xLjEuMS1zcmMuemlwLm1kNSINCi10aXRsZT0NCi0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMV8xXzEvYXhpczItMS4xLjEtc3JjLnppcC5tZDUiPg0KLU1ENTwvYT4gPGEgaHJlZj0NCi0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMV8xXzEvYXhpczItMS4xLjEtc3JjLnppcC5hc2MiDQotdGl0bGU9DQotImh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzFfMV8xL2F4aXMyLTEuMS4xLXNyYy56aXAuYXNjIj4NCi1QR1A8L2E+PC90ZD4NCi08L3RyPg0KLTx0cj4NCi08dGQ+PGEgbmFtZT0id2FyIiBpZD0id2FyIj48L2E+PHN0cm9uZz5XQVIgKFdlYiBBcmNoaXZlKQ0KLURpc3RyaWJ1dGlvbjwvc3Ryb25nPjwvdGQ+DQotPHRkPlRoaXMgd2lsbCBiZSB0aGUgd2ViIGFwcGxpY2F0aW9uIG9mIEF4aXMyIHdoaWNoIGNhbiBiZSBkZXBsb3llZA0KLWluIG1vc3Qgb2YgdGhlIHNlcnZsZXQgY29udGFpbmVycy48L3RkPg0KLTx0ZD48YSBocmVmPSJbcHJlZmVycmVkXS93cy9heGlzMi8xXzFfMS9heGlzMi53YXIiIHRpdGxlPQ0KLSJbcHJlZmVycmVkXS93cy9heGlzMi8xXzFfMS9heGlzMi53YXIiPnppcDwvYT4gPGEgaHJlZj0NCi0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMV8xXzEvYXhpczIud2FyLm1kNSIgdGl0bGU9DQotImh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzFfMV8xL2F4aXMyLndhci5tZDUiPk1ENTwvYT4NCi08YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8xXzFfMS9heGlzMi53YXIuYXNjIg0KLXRpdGxlPQ0KLSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8xXzFfMS9heGlzMi53YXIuYXNjIj5QR1A8L2E+PC90ZD4NCi08L3RyPg0KLTx0cj4NCi08dGQ+PHN0cm9uZz5Eb2N1bWVudHMgRGlzdHJpYnV0aW9uPC9zdHJvbmc+PC90ZD4NCi08dGQ+VGhpcyB3aWxsIGNvbnRhaW4gYWxsIHRoZSBkb2N1bWVudGF0aW9uIGluIG9uZSBwYWNrYWdlLjwvdGQ+DQotPHRkPjxhIGhyZWY9IltwcmVmZXJyZWRdL3dzL2F4aXMyLzFfMV8xL2F4aXMyLTEuMS4xLWRvY3MuemlwIg0KLXRpdGxlPSJbcHJlZmVycmVkXS93cy9heGlzMi8xXzFfMS9heGlzMi0xLjEuMS1kb2NzLnppcCI+emlwPC9hPg0KLTxhIGhyZWY9DQotImh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzFfMV8xL2F4aXMyLTEuMS4xLWRvY3MuemlwLm1kNSINCi10aXRsZT0NCi0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMV8xXzEvYXhpczItMS4xLjEtZG9jcy56aXAubWQ1Ij4NCi1NRDU8L2E+IDxhIGhyZWY9DQotImh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzFfMV8xL2F4aXMyLTEuMS4xLWRvY3MuemlwLmFzYyINCi10aXRsZT0NCi0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMV8xXzEvYXhpczItMS4xLjEtZG9jcy56aXAuYXNjIj4NCi1QR1A8L2E+PC90ZD4NCi08L3RyPg0KLTwvdGJvZHk+DQotPC90YWJsZT4NCi08L2Rpdj4NCi08ZGl2IGFsaWduPSJsZWZ0Ij48YnIgLz4NCi08cD5baWYtYW55IGxvZ29dIDxhIGhyZWY9IltsaW5rXSI+PGltZyBhbGlnbj0icmlnaHQiIHNyYz0iW2xvZ29dIg0KLWJvcmRlcj0iMCIgLz48L2E+W2VuZF0gVGhlIGN1cnJlbnRseSBzZWxlY3RlZCBtaXJyb3IgaXMNCi08Yj5bcHJlZmVycmVkXTwvYj4uIElmIHlvdSBlbmNvdW50ZXIgYSBwcm9ibGVtIHdpdGggdGhpcyBtaXJyb3IsDQotcGxlYXNlIHNlbGVjdCBhbm90aGVyIG1pcnJvci4gSWYgYWxsIG1pcnJvcnMgYXJlIGZhaWxpbmcsIHRoZXJlIGFyZQ0KLTxpPmJhY2t1cDwvaT4gbWlycm9ycyAoYXQgdGhlIGVuZCBvZiB0aGUgbWlycm9ycyBsaXN0KSB0aGF0IHNob3VsZA0KLWJlIGF2YWlsYWJsZS48L3A+DQotPGZvcm0gYWN0aW9uPSJbbG9jYXRpb25dIiBtZXRob2Q9ImdldCIgaWQ9IlNlbGVjdE1pcnJvciIgbmFtZT0NCi0iU2VsZWN0TWlycm9yIj5PdGhlciBtaXJyb3JzOiA8c2VsZWN0IG5hbWU9IlByZWZlcnJlZCI+DQotPG9wdGlvbiB2YWx1ZT0iW2h0dHBdIiBzZWxlY3RlZD0ic2VsZWN0ZWQiPltodHRwXTwvb3B0aW9uPg0KLTxvcHRpb24gdmFsdWU9IltmdHBdIj5bZnRwXTwvb3B0aW9uPg0KLTxvcHRpb24gdmFsdWU9IltiYWNrdXBdIj5bYmFja3VwXSAoYmFja3VwKTwvb3B0aW9uPg0KLTwvc2VsZWN0PiA8aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iQ2hhbmdlIiAvPjwvZm9ybT4NCi08cD5Zb3UgbWF5IGFsc28gY29uc3VsdCB0aGUgPGEgaHJlZj0NCi0iaHR0cDovL3d3dy5hcGFjaGUub3JnL21pcnJvcnMvIj5jb21wbGV0ZSBsaXN0IG9mIG1pcnJvcnM8L2E+LjwvcD4NCi08cD48c3Ryb25nPk5vdGU6PC9zdHJvbmc+IHdoZW4gZG93bmxvYWRpbmcgZnJvbSBhIG1pcnJvciBwbGVhc2UNCi1jaGVjayB0aGUgPGEgaHJlZj0NCi0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rldi9yZWxlYXNlLXNpZ25pbmcjbWQ1Ij5tZDVzdW08L2E+IGFuZA0KLXZlcmlmeSB0aGUgPGEgaHJlZj0NCi0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rldi9yZWxlYXNlLXNpZ25pbmcjb3BlbnBncCI+T3BlblBHUDwvYT4NCi1jb21wYXRpYmxlIHNpZ25hdHVyZSBmcm9tIHRoZSBtYWluIEFwYWNoZSBzaXRlLiBUaGVzZSBjYW4gYmUNCi1kb3dubG9hZGVkIGJ5IGZvbGxvd2luZyB0aGUgbGlua3MgYWJvdmUuIFRoaXMgPGEgaHJlZj0NCi0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvS0VZUyI+S0VZUzwvYT4gZmlsZSBjb250YWlucw0KLXRoZSBwdWJsaWMga2V5cyB0aGF0IGNhbiBiZSB1c2VkIGZvciB2ZXJpZnlpbmcgc2lnbmF0dXJlcy4gSXQgaXMNCi1yZWNvbW1lbmRlZCB0aGF0ICh3aGVuIHBvc3NpYmxlKWEgPGEgaHJlZj0NCi0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rldi9yZWxlYXNlLXNpZ25pbmcjd2ViLW9mLXRydXN0Ij5XZWIgb2YNCi10cnVzdDwvYT4gaXMgdXNlZCB0byBjb25maXJtIHRoZSBpZGVudGl0eSBvZiB0aGVzZSBrZXlzLjwvcD4NCi08L2Rpdj4NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvZG93bmxvYWQvMV8yL2Rvd25sb2FkLmNnaSBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvZG93bmxvYWQvMV8yL2Rvd25sb2FkLmNnaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmE5ZjhkMy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL2Rvd25sb2FkLzFfMi9kb3dubG9hZC5jZ2kKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jIS9iaW4vc2gKLQotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jIAotIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMgCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSMgV3JhcHBlciBzY3JpcHQgYXJvdW5kIG1pcnJvcnMuY2dpIHNjcmlwdAotIyAod2UgbXVzdCBjaGFuZ2UgdG8gdGhhdCBkaXJlY3RvcnkgaW4gb3JkZXIgZm9yIHB5dGhvbiB0byBwaWNrIHVwIHRoZQotIyAgcHl0aG9uIGluY2x1ZGVzIGNvcnJlY3RseSkKLWNkIC93d3cvd3d3LmFwYWNoZS5vcmcvZHluL21pcnJvcnMKLS93d3cvd3d3LmFwYWNoZS5vcmcvZHluL21pcnJvcnMvbWlycm9ycy5jZ2kgJCoKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL2Rvd25sb2FkLzFfMi9kb3dubG9hZC54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL2Rvd25sb2FkLzFfMi9kb3dubG9hZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1YWMyNTUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9kb3dubG9hZC8xXzIvZG93bmxvYWQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iDQotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4NCi08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+DQotPGhlYWQ+DQotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PQ0KLSJIVE1MIFRpZHkgZm9yIFdpbmRvd3MgKHZlcnMgMTQgSnVuZSAyMDA3KSwgc2VlIHd3dy53My5vcmciIC8+DQotPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSIiIC8+DQotPHRpdGxlPkF4aXMyIDEuMiBSZWxlYXNlPC90aXRsZT4NCi08L2hlYWQ+DQotPGJvZHk+DQotPCEtLUdvb2dsZSBBbmF5aXRjcyB0cmFja2luZyBjb2RlLS0+DQotPHNjcmlwdCBzcmM9Imh0dHA6Ly93d3cuZ29vZ2xlLWFuYWx5dGljcy5jb20vdXJjaGluLmpzIiB0eXBlPQ0KLSJ0ZXh0L2phdmFzY3JpcHQiPg0KLTwvc2NyaXB0PjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4NCi0vLzwhW0NEQVRBWw0KLV91YWNjdCA9ICJVQS0xOTU0Mzc4LTMiOw0KLXVyY2hpblRyYWNrZXIoKTsNCi0vL11dPg0KLTwvc2NyaXB0PjwhLS1FbmQgb2YgR29vZ2xlIEFuYXlpdGNzIHRyYWNraW5nIGNvZGUtLT4NCi08aDI+QXhpczIgMS4yIFJlbGVhc2U8L2gyPg0KLTxkaXY+DQotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjEiPg0KLTx0Ym9keT4NCi08dHI+DQotPHRoIHNjb3BlPSJjb2wiPkRpc3RyaWJ1dGlvbiBOYW1lPC90aD4NCi08dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPg0KLTwhLS08dGggc2NvcGU9ImNvbCI+SXRlbXM8L3RoPi0tPg0KLTx0aCBzY29wZT0iY29sIj5Eb3dubG9hZDwvdGg+DQotPC90cj4NCi08dHI+DQotPHRkPjxhIG5hbWU9InN0ZC1iaW4iIGlkPSJzdGQtYmluIj48L2E+PHN0cm9uZz5TdGFuZGFyZCBCaW5hcnkNCi1EaXN0cmlidXRpb248L3N0cm9uZz48L3RkPg0KLTx0ZD5UaGlzIGlzIHRoZSBjb21wbGV0ZSB2ZXJzaW9uIG9mIEF4aXMyIGFuZCB3aWxsIGNvbnRhaW4gc2FtcGxlcw0KLWFzIHdlbGwuIFNpbmNlIFdTLUFkZHJlc3NpbmcgaW1wbGVtZW50YXRpb24gYW5kIFNPQVAgTW9uaXRvcg0KLXV0aWxpdHkgbW9kdWxlcyBhcmUgZW5nYWdlZCBpbiB0byBBeGlzMiwgYnkgZGVmYXVsdCwgdGhpcw0KLWRpc3RyaWJ1dGlvbiB3aWxsIGNvbnRhaW4gYWRkcmVzc2luZy5tYXIgYW5kIHNvYXBtb25pdG9yLm1hci4gQnV0DQotdGhlIG90aGVyIG1vZHVsZXMgdGhhdCBhcmUgYmVpbmcgZGV2ZWxvcGVkIHdpdGhpbiBBeGlzMiB3aWxsIG5vdCBiZQ0KLWluY2x1ZGVkIGhlcmUsIGFuZCBuZWVkIHRvIGJlIDxhIGhyZWY9DQotIi4uLy4uL21vZHVsZXMvaW5kZXguaHRtbCI+ZG93bmxvYWRlZDwvYT4gc2VwYXJhdGVseS48L3RkPg0KLTx0ZD48YSBocmVmPSJbcHJlZmVycmVkXS93cy9heGlzMi8xXzIvYXhpczItMS4yLnppcCIgdGl0bGU9DQotIltwcmVmZXJyZWRdL3dzL2F4aXMyLzFfMi9heGlzMi0xLjIuemlwIiBvbkNsaWNrPQ0KLSJqYXZhc2NyaXB0OnVyY2hpblRyYWNrZXIgKCcvZG93bmxvYWRzL2F4aXMyLTEuMi1iaW4uemlwJyk7Ij56aXA8L2E+DQotPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMV8yL2F4aXMyLTEuMi56aXAubWQ1Ig0KLXRpdGxlPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8xXzIvYXhpczItMS4yLnppcC5tZDUiPk1ENTwvYT4NCi08YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8xXzIvYXhpczItMS4yLnppcC5hc2MiDQotdGl0bGU9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzFfMi9heGlzMi0xLjIuemlwLmFzYyI+UEdQPC9hPjwvdGQ+DQotPC90cj4NCi08dHI+DQotPHRkPjxhIG5hbWU9InNyYyIgaWQ9InNyYyI+PC9hPiA8c3Ryb25nPlNvdXJjZQ0KLURpc3RyaWJ1dGlvbjwvc3Ryb25nPjwvdGQ+DQotPHRkPlRoaXMgd2lsbCBjb250YWluIHRoZSBzb3VyY2VzIG9mIEF4aXMyIHN0YW5kYXJkIGRpc3RyaWJ1dGlvbi4NCi1PbmUgY2FuIGdlbmVyYXRlIGEgYmluYXJ5IGRpc3RyaWJ1dGlvbiBmcm9tIHRoaXMgYnkgdHlwaW5nDQotPHNwYW4gY2xhc3M9InN0eWxlMSI+JG1hdmVuIGRpc3QtYmluPC9zcGFuPiAoPGEgaHJlZj0NCi0iaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvMV8yL2luc3RhbGxhdGlvbmd1aWRlLmh0bWwjZW52LXNyYyI+U2V0DQotdXAgQXhpczIgZW52aXJvbm1lbnQ8L2E+IGJlZm9yZSBydW5uaW5nIHRoaXMgY29tbWFuZCkuIFVzZWZ1bCBmb3INCi1hZHZhbmNlZCB1c2Vycy48L3RkPg0KLTx0ZD48YSBocmVmPSJbcHJlZmVycmVkXS93cy9heGlzMi8xXzIvYXhpczItMS4yLXNyYy56aXAiIHRpdGxlPQ0KLSJbcHJlZmVycmVkXS93cy9heGlzMi8xXzIvYXhpczItMS4yLXNyYy56aXAiIG9uQ2xpY2s9DQotImphdmFzY3JpcHQ6dXJjaGluVHJhY2tlciAoJy9kb3dubG9hZHMvYXhpczItMS4yLXNyYy56aXAnKTsiPnppcDwvYT4NCi08YSBocmVmPQ0KLSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8xXzIvYXhpczItMS4yLXNyYy56aXAubWQ1Ig0KLXRpdGxlPQ0KLSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8xXzIvYXhpczItMS4yLXNyYy56aXAubWQ1Ij5NRDU8L2E+DQotPGEgaHJlZj0NCi0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMV8yL2F4aXMyLTEuMi1zcmMuemlwLmFzYyINCi10aXRsZT0NCi0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMV8yL2F4aXMyLTEuMi1zcmMuemlwLmFzYyI+UEdQPC9hPjwvdGQ+DQotPC90cj4NCi08dHI+DQotPHRkPjxhIG5hbWU9IndhciIgaWQ9IndhciI+PC9hPjxzdHJvbmc+V0FSIChXZWIgQXJjaGl2ZSkNCi1EaXN0cmlidXRpb248L3N0cm9uZz48L3RkPg0KLTx0ZD5UaGlzIHdpbGwgYmUgdGhlIHdlYiBhcHBsaWNhdGlvbiBvZiBBeGlzMiB3aGljaCBjYW4gYmUgZGVwbG95ZWQNCi1pbiBtb3N0IG9mIHRoZSBzZXJ2bGV0IGNvbnRhaW5lcnMuPC90ZD4NCi08dGQ+PGEgaHJlZj0iW3ByZWZlcnJlZF0vd3MvYXhpczIvMV8yL2F4aXMyLndhciIgdGl0bGU9DQotIltwcmVmZXJyZWRdL3dzL2F4aXMyLzFfMi9heGlzMi53YXIiIG9uQ2xpY2s9DQotImphdmFzY3JpcHQ6dXJjaGluVHJhY2tlciAoJy9kb3dubG9hZHMvYXhpczItMS4yLndhcicpOyI+emlwPC9hPg0KLTxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzFfMi9heGlzMi53YXIubWQ1Ig0KLXRpdGxlPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8xXzIvYXhpczIud2FyLm1kNSI+TUQ1PC9hPg0KLTxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzFfMi9heGlzMi53YXIuYXNjIg0KLXRpdGxlPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8xXzIvYXhpczIud2FyLmFzYyI+UEdQPC9hPjwvdGQ+DQotPC90cj4NCi08dHI+DQotPHRkPjxzdHJvbmc+RG9jdW1lbnRzIERpc3RyaWJ1dGlvbjwvc3Ryb25nPjwvdGQ+DQotPHRkPlRoaXMgd2lsbCBjb250YWluIGFsbCB0aGUgZG9jdW1lbnRhdGlvbiBpbiBvbmUgcGFja2FnZS48L3RkPg0KLTx0ZD48YSBocmVmPSJbcHJlZmVycmVkXS93cy9heGlzMi8xXzIvYXhpczItMS4yLWRvY3MuemlwIiB0aXRsZT0NCi0iW3ByZWZlcnJlZF0vd3MvYXhpczIvMV8yL2F4aXMyLTEuMi1kb2NzLnppcCIgb25DbGljaz0NCi0iamF2YXNjcmlwdDp1cmNoaW5UcmFja2VyICgnL2Rvd25sb2Fkcy9heGlzMi0xLjItZG9jcy56aXAnKTsiPnppcDwvYT4NCi08YSBocmVmPQ0KLSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8xXzIvYXhpczItMS4yLWRvY3MuemlwLm1kNSINCi10aXRsZT0NCi0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMV8yL2F4aXMyLTEuMi1kb2NzLnppcC5tZDUiPk1ENTwvYT4NCi08YSBocmVmPQ0KLSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8xXzIvYXhpczItMS4yLWRvY3MuemlwLmFzYyINCi10aXRsZT0NCi0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMV8yL2F4aXMyLTEuMi1kb2NzLnppcC5hc2MiPlBHUDwvYT48L3RkPg0KLTwvdHI+DQotPC90Ym9keT4NCi08L3RhYmxlPg0KLTwvZGl2Pg0KLTxkaXYgYWxpZ249ImxlZnQiPjxiciAvPg0KLTxwPltpZi1hbnkgbG9nb10gPGEgaHJlZj0iW2xpbmtdIj48aW1nIGFsaWduPSJyaWdodCIgc3JjPSJbbG9nb10iDQotYm9yZGVyPSIwIiAvPjwvYT5bZW5kXSBUaGUgY3VycmVudGx5IHNlbGVjdGVkIG1pcnJvciBpcw0KLTxiPltwcmVmZXJyZWRdPC9iPi4gSWYgeW91IGVuY291bnRlciBhIHByb2JsZW0gd2l0aCB0aGlzIG1pcnJvciwNCi1wbGVhc2Ugc2VsZWN0IGFub3RoZXIgbWlycm9yLiBJZiBhbGwgbWlycm9ycyBhcmUgZmFpbGluZywgdGhlcmUgYXJlDQotPGk+YmFja3VwPC9pPiBtaXJyb3JzIChhdCB0aGUgZW5kIG9mIHRoZSBtaXJyb3JzIGxpc3QpIHRoYXQgc2hvdWxkDQotYmUgYXZhaWxhYmxlLjwvcD4NCi08Zm9ybSBhY3Rpb249Iltsb2NhdGlvbl0iIG1ldGhvZD0iZ2V0IiBpZD0iU2VsZWN0TWlycm9yIiBuYW1lPSJTZWxlY3RNaXJyb3IiPg0KLU90aGVyIG1pcnJvcnM6IDxzZWxlY3QgbmFtZT0iUHJlZmVycmVkIj4NCi1baWYtYW55IGh0dHBdDQotICBbZm9yIGh0dHBdPG9wdGlvbiB2YWx1ZT0iW2h0dHBdIj5baHR0cF08L29wdGlvbj5bZW5kXQ0KLVtlbmRdICANCi1baWYtYW55IGZ0cF0NCi0gIFtmb3IgZnRwXTxvcHRpb24gdmFsdWU9IltmdHBdIj5bZnRwXTwvb3B0aW9uPltlbmRdDQotW2VuZF0NCi1baWYtYW55IGJhY2t1cF0NCi0gIFtmb3IgYmFja3VwXTxvcHRpb24gdmFsdWU9IltiYWNrdXBdIj5bYmFja3VwXSAoYmFja3VwKTwvb3B0aW9uPltlbmRdDQotW2VuZF0NCi08L3NlbGVjdD48aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iQ2hhbmdlIi8+PC9mb3JtPg0KLTxwPllvdSBtYXkgYWxzbyBjb25zdWx0IHRoZSA8YSBjbGFzcz0iZXh0ZXJuYWxMaW5rIiBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbWlycm9ycy8iPmNvbXBsZXRlIGxpc3Qgb2YgbWlycm9yczwvYT48L3A+DQotPHA+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiB3aGVuIGRvd25sb2FkaW5nIGZyb20gYSBtaXJyb3IgcGxlYXNlDQotY2hlY2sgdGhlIDxhIGhyZWY9DQotImh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kZXYvcmVsZWFzZS1zaWduaW5nI21kNSI+bWQ1c3VtPC9hPiBhbmQNCi12ZXJpZnkgdGhlIDxhIGhyZWY9DQotImh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kZXYvcmVsZWFzZS1zaWduaW5nI29wZW5wZ3AiPk9wZW5QR1A8L2E+DQotY29tcGF0aWJsZSBzaWduYXR1cmUgZnJvbSB0aGUgbWFpbiBBcGFjaGUgc2l0ZS4gVGhlc2UgY2FuIGJlDQotZG93bmxvYWRlZCBieSBmb2xsb3dpbmcgdGhlIGxpbmtzIGFib3ZlLiBUaGlzIDxhIGhyZWY9DQotImh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyL0tFWVMiPktFWVM8L2E+IGZpbGUgY29udGFpbnMNCi10aGUgcHVibGljIGtleXMgdGhhdCBjYW4gYmUgdXNlZCBmb3IgdmVyaWZ5aW5nIHNpZ25hdHVyZXMuIEl0IGlzDQotcmVjb21tZW5kZWQgdGhhdCAod2hlbiBwb3NzaWJsZSlhIDxhIGhyZWY9DQotImh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kZXYvcmVsZWFzZS1zaWduaW5nI3dlYi1vZi10cnVzdCI+V2ViIG9mDQotdHJ1c3Q8L2E+IGlzIHVzZWQgdG8gY29uZmlybSB0aGUgaWRlbnRpdHkgb2YgdGhlc2Uga2V5cy48L3A+DQotPC9kaXY+DQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL2Rvd25sb2FkLzFfMy9kb3dubG9hZC5jZ2kgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL2Rvd25sb2FkLzFfMy9kb3dubG9hZC5jZ2kKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJhOWY4ZDMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9kb3dubG9hZC8xXzMvZG93bmxvYWQuY2dpCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIyEvYmluL3NoCi0KLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIyAKLSMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jIAotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jIFdyYXBwZXIgc2NyaXB0IGFyb3VuZCBtaXJyb3JzLmNnaSBzY3JpcHQKLSMgKHdlIG11c3QgY2hhbmdlIHRvIHRoYXQgZGlyZWN0b3J5IGluIG9yZGVyIGZvciBweXRob24gdG8gcGljayB1cCB0aGUKLSMgIHB5dGhvbiBpbmNsdWRlcyBjb3JyZWN0bHkpCi1jZCAvd3d3L3d3dy5hcGFjaGUub3JnL2R5bi9taXJyb3JzCi0vd3d3L3d3dy5hcGFjaGUub3JnL2R5bi9taXJyb3JzL21pcnJvcnMuY2dpICQqClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9kb3dubG9hZC8xXzMvZG93bmxvYWQueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9kb3dubG9hZC8xXzMvZG93bmxvYWQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Njc1ODg2Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvZG93bmxvYWQvMV8zL2Rvd25sb2FkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIg0KLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+DQotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPg0KLTxoZWFkPg0KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0NCi0iSFRNTCBUaWR5IGZvciBXaW5kb3dzICh2ZXJzIDE0IEp1bmUgMjAwNyksIHNlZSB3d3cudzMub3JnIiAvPg0KLTxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0iIiAvPg0KLTx0aXRsZT5BeGlzMiAxLjMgUmVsZWFzZTwvdGl0bGU+DQotPC9oZWFkPg0KLTxib2R5Pg0KLTwhLS1Hb29nbGUgQW5heWl0Y3MgdHJhY2tpbmcgY29kZS0tPg0KLTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9DQotImh0dHA6Ly93d3cuZ29vZ2xlLWFuYWx5dGljcy5jb20vdXJjaGluLmpzIj4NCi08L3NjcmlwdD48c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+DQotLy88IVtDREFUQVsNCi1fdWFjY3QgPSAiVUEtMTk1NDM3OC0zIjsNCi11cmNoaW5UcmFja2VyKCk7DQotLy9dXT4NCi08L3NjcmlwdD48IS0tRW5kIG9mIEdvb2dsZSBBbmF5aXRjcyB0cmFja2luZyBjb2RlLS0+DQotPGgyPkF4aXMyIDEuMyBSZWxlYXNlPC9oMj4NCi08ZGl2Pg0KLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIxIj4NCi08dGJvZHk+DQotPHRyPg0KLTx0aCBzY29wZT0iY29sIj5EaXN0cmlidXRpb24gTmFtZTwvdGg+DQotPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4NCi08IS0tPHRoIHNjb3BlPSJjb2wiPkl0ZW1zPC90aD4tLT4NCi08dGggc2NvcGU9ImNvbCI+RG93bmxvYWQ8L3RoPg0KLTwvdHI+DQotPHRyPg0KLTx0ZD48YSBuYW1lPSJzdGQtYmluIiBpZD0ic3RkLWJpbiI+PC9hPjxzdHJvbmc+U3RhbmRhcmQgQmluYXJ5DQotRGlzdHJpYnV0aW9uPC9zdHJvbmc+PC90ZD4NCi08dGQ+VGhpcyBpcyB0aGUgY29tcGxldGUgdmVyc2lvbiBvZiBBeGlzMiBhbmQgd2lsbCBjb250YWluIHNhbXBsZXMNCi1hcyB3ZWxsLiBTaW5jZSBXUy1BZGRyZXNzaW5nIGltcGxlbWVudGF0aW9uIGFuZCBTT0FQIE1vbml0b3INCi11dGlsaXR5IG1vZHVsZXMgYXJlIGVuZ2FnZWQgaW4gdG8gQXhpczIsIGJ5IGRlZmF1bHQsIHRoaXMNCi1kaXN0cmlidXRpb24gd2lsbCBjb250YWluIGFkZHJlc3NpbmcubWFyIGFuZCBzb2FwbW9uaXRvci5tYXIuIEJ1dA0KLXRoZSBvdGhlciBtb2R1bGVzIHRoYXQgYXJlIGJlaW5nIGRldmVsb3BlZCB3aXRoaW4gQXhpczIgd2lsbCBub3QgYmUNCi1pbmNsdWRlZCBoZXJlLCBhbmQgbmVlZCB0byBiZSA8YSBocmVmPQ0KLSIuLi8uLi9tb2R1bGVzL2luZGV4Lmh0bWwiPmRvd25sb2FkZWQ8L2E+IHNlcGFyYXRlbHkuPC90ZD4NCi08dGQ+PGEgaHJlZj0iW3ByZWZlcnJlZF0vd3MvYXhpczIvMV8zL2F4aXMyLTEuMy1iaW4uemlwIiB0aXRsZT0NCi0iW3ByZWZlcnJlZF0vd3MvYXhpczIvMV8zL2F4aXMyLTEuMy1iaW4uemlwIiBvbkNsaWNrPQ0KLSJqYXZhc2NyaXB0OnVyY2hpblRyYWNrZXIgKCcvZG93bmxvYWRzL2F4aXMyLTEuMy1iaW4uemlwJyk7Ij56aXA8L2E+DQotPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMV8zL2F4aXMyLTEuMy1iaW4uemlwLm1kNSINCi10aXRsZT0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMV8zL2F4aXMyLTEuMy1iaW4uemlwLm1kNSI+TUQ1PC9hPg0KLTxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzFfMy9heGlzMi0xLjMtYmluLnppcC5hc2MiDQotdGl0bGU9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzFfMy9heGlzMi0xLjMtYmluLnppcC5hc2MiPlBHUDwvYT48L3RkPg0KLTwvdHI+DQotPHRyPg0KLTx0ZD48YSBuYW1lPSJzcmMiIGlkPSJzcmMiPjwvYT4gPHN0cm9uZz5Tb3VyY2UNCi1EaXN0cmlidXRpb248L3N0cm9uZz48L3RkPg0KLTx0ZD5UaGlzIHdpbGwgY29udGFpbiB0aGUgc291cmNlcyBvZiBBeGlzMiBzdGFuZGFyZCBkaXN0cmlidXRpb24uDQotT25lIGNhbiBnZW5lcmF0ZSBhIGJpbmFyeSBkaXN0cmlidXRpb24gZnJvbSB0aGlzIGJ5IHR5cGluZw0KLTxzcGFuIGNsYXNzPSJzdHlsZTEiPiRtYXZlbiBkaXN0LWJpbjwvc3Bhbj4gKDxhIGhyZWY9DQotImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyLzFfMy9pbnN0YWxsYXRpb25ndWlkZS5odG1sI2Vudi1zcmMiPlNldA0KLXVwIEF4aXMyIGVudmlyb25tZW50PC9hPiBiZWZvcmUgcnVubmluZyB0aGlzIGNvbW1hbmQpLiBVc2VmdWwgZm9yDQotYWR2YW5jZWQgdXNlcnMuPC90ZD4NCi08dGQ+PGEgaHJlZj0iW3ByZWZlcnJlZF0vd3MvYXhpczIvMV8zL2F4aXMyLTEuMy1zcmMuemlwIiB0aXRsZT0NCi0iW3ByZWZlcnJlZF0vd3MvYXhpczIvMV8zL2F4aXMyLTEuMy1zcmMuemlwIiBvbkNsaWNrPQ0KLSJqYXZhc2NyaXB0OnVyY2hpblRyYWNrZXIgKCcvZG93bmxvYWRzL2F4aXMyLTEuMy1zcmMuemlwJyk7Ij56aXA8L2E+DQotPGEgaHJlZj0NCi0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMV8zL2F4aXMyLTEuMy1zcmMuemlwLm1kNSINCi10aXRsZT0NCi0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMV8zL2F4aXMyLTEuMy1zcmMuemlwLm1kNSI+TUQ1PC9hPg0KLTxhIGhyZWY9DQotImh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzFfMy9heGlzMi0xLjMtc3JjLnppcC5hc2MiDQotdGl0bGU9DQotImh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzFfMy9heGlzMi0xLjMtc3JjLnppcC5hc2MiPlBHUDwvYT48L3RkPg0KLTwvdHI+DQotPHRyPg0KLTx0ZD48YSBuYW1lPSJ3YXIiIGlkPSJ3YXIiPjwvYT48c3Ryb25nPldBUiAoV2ViIEFyY2hpdmUpDQotRGlzdHJpYnV0aW9uPC9zdHJvbmc+PC90ZD4NCi08dGQ+VGhpcyB3aWxsIGJlIHRoZSB3ZWIgYXBwbGljYXRpb24gb2YgQXhpczIgd2hpY2ggY2FuIGJlIGRlcGxveWVkDQotaW4gbW9zdCBvZiB0aGUgc2VydmxldCBjb250YWluZXJzLjwvdGQ+DQotPHRkPjxhIGhyZWY9IltwcmVmZXJyZWRdL3dzL2F4aXMyLzFfMy9heGlzMi0xLjMtd2FyLnppcCIgdGl0bGU9DQotIltwcmVmZXJyZWRdL3dzL2F4aXMyLzFfMy9heGlzMi0xLjMtd2FyLnppcCIgb25DbGljaz0NCi0iamF2YXNjcmlwdDp1cmNoaW5UcmFja2VyICgnL2Rvd25sb2Fkcy9heGlzMi0xLjMtd2FyLnppcCcpOyI+emlwPC9hPg0KLTxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzFfMy9heGlzMi0xLjMtd2FyLnppcC5tZDUiDQotdGl0bGU9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzFfMy9heGlzMi0xLjMtd2FyLnppcC5tZDUiPk1ENTwvYT4NCi08YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8xXzMvYXhpczItMS4zLXdhci56aXAuYXNjIg0KLXRpdGxlPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8xXzMvYXhpczItMS4zLXdhci56aXAuYXNjIj5QR1A8L2E+PC90ZD4NCi08L3RyPg0KLTx0cj4NCi08dGQ+PHN0cm9uZz5Eb2N1bWVudHMgRGlzdHJpYnV0aW9uPC9zdHJvbmc+PC90ZD4NCi08dGQ+VGhpcyB3aWxsIGNvbnRhaW4gYWxsIHRoZSBkb2N1bWVudGF0aW9uIGluIG9uZSBwYWNrYWdlLjwvdGQ+DQotPHRkPjxhIGhyZWY9IltwcmVmZXJyZWRdL3dzL2F4aXMyLzFfMy9heGlzMi0xLjMtZG9jcy56aXAiIHRpdGxlPQ0KLSJbcHJlZmVycmVkXS93cy9heGlzMi8xXzMvYXhpczItMS4zLWRvY3MuemlwIiBvbkNsaWNrPQ0KLSJqYXZhc2NyaXB0OnVyY2hpblRyYWNrZXIgKCcvZG93bmxvYWRzL2F4aXMyLTEuMy1kb2NzLnppcCcpOyI+emlwPC9hPg0KLTxhIGhyZWY9DQotImh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzFfMy9heGlzMi0xLjMtZG9jcy56aXAubWQ1Ig0KLXRpdGxlPQ0KLSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8xXzMvYXhpczItMS4zLWRvY3MuemlwLm1kNSI+TUQ1PC9hPg0KLTxhIGhyZWY9DQotImh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzFfMy9heGlzMi0xLjMtZG9jcy56aXAuYXNjIg0KLXRpdGxlPQ0KLSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8xXzMvYXhpczItMS4zLWRvY3MuemlwLmFzYyI+UEdQPC9hPjwvdGQ+DQotPC90cj4NCi08L3Rib2R5Pg0KLTwvdGFibGU+DQotPC9kaXY+DQotPGRpdiBhbGlnbj0ibGVmdCI+PGJyIC8+DQotPHA+W2lmLWFueSBsb2dvXSA8YSBocmVmPSJbbGlua10iPjxpbWcgYWxpZ249InJpZ2h0IiBzcmM9Iltsb2dvXSINCi1ib3JkZXI9IjAiIC8+PC9hPltlbmRdIFRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgbWlycm9yIGlzDQotPGI+W3ByZWZlcnJlZF08L2I+LiBJZiB5b3UgZW5jb3VudGVyIGEgcHJvYmxlbSB3aXRoIHRoaXMgbWlycm9yLA0KLXBsZWFzZSBzZWxlY3QgYW5vdGhlciBtaXJyb3IuIElmIGFsbCBtaXJyb3JzIGFyZSBmYWlsaW5nLCB0aGVyZSBhcmUNCi08aT5iYWNrdXA8L2k+IG1pcnJvcnMgKGF0IHRoZSBlbmQgb2YgdGhlIG1pcnJvcnMgbGlzdCkgdGhhdCBzaG91bGQNCi1iZSBhdmFpbGFibGUuPC9wPg0KLTxmb3JtIGFjdGlvbj0iW2xvY2F0aW9uXSIgbWV0aG9kPSJnZXQiIGlkPSJTZWxlY3RNaXJyb3IiIG5hbWU9IlNlbGVjdE1pcnJvciI+DQotT3RoZXIgbWlycm9yczogPHNlbGVjdCBuYW1lPSJQcmVmZXJyZWQiPg0KLVtpZi1hbnkgaHR0cF0NCi0gIFtmb3IgaHR0cF08b3B0aW9uIHZhbHVlPSJbaHR0cF0iPltodHRwXTwvb3B0aW9uPltlbmRdDQotW2VuZF0gIA0KLVtpZi1hbnkgZnRwXQ0KLSAgW2ZvciBmdHBdPG9wdGlvbiB2YWx1ZT0iW2Z0cF0iPltmdHBdPC9vcHRpb24+W2VuZF0NCi1bZW5kXQ0KLVtpZi1hbnkgYmFja3VwXQ0KLSAgW2ZvciBiYWNrdXBdPG9wdGlvbiB2YWx1ZT0iW2JhY2t1cF0iPltiYWNrdXBdIChiYWNrdXApPC9vcHRpb24+W2VuZF0NCi1bZW5kXQ0KLTwvc2VsZWN0PjxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSJDaGFuZ2UiLz48L2Zvcm0+DQotPHA+WW91IG1heSBhbHNvIGNvbnN1bHQgdGhlIDxhIGNsYXNzPSJleHRlcm5hbExpbmsiIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9taXJyb3JzLyI+Y29tcGxldGUgbGlzdCBvZiBtaXJyb3JzPC9hPjwvcD4NCi08cD48c3Ryb25nPk5vdGU6PC9zdHJvbmc+IHdoZW4gZG93bmxvYWRpbmcgZnJvbSBhIG1pcnJvciBwbGVhc2UNCi1jaGVjayB0aGUgPGEgaHJlZj0NCi0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rldi9yZWxlYXNlLXNpZ25pbmcjbWQ1Ij5tZDVzdW08L2E+IGFuZA0KLXZlcmlmeSB0aGUgPGEgaHJlZj0NCi0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rldi9yZWxlYXNlLXNpZ25pbmcjb3BlbnBncCI+T3BlblBHUDwvYT4NCi1jb21wYXRpYmxlIHNpZ25hdHVyZSBmcm9tIHRoZSBtYWluIEFwYWNoZSBzaXRlLiBUaGVzZSBjYW4gYmUNCi1kb3dubG9hZGVkIGJ5IGZvbGxvd2luZyB0aGUgbGlua3MgYWJvdmUuIFRoaXMgPGEgaHJlZj0NCi0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvS0VZUyI+S0VZUzwvYT4gZmlsZSBjb250YWlucw0KLXRoZSBwdWJsaWMga2V5cyB0aGF0IGNhbiBiZSB1c2VkIGZvciB2ZXJpZnlpbmcgc2lnbmF0dXJlcy4gSXQgaXMNCi1yZWNvbW1lbmRlZCB0aGF0ICh3aGVuIHBvc3NpYmxlKWEgPGEgaHJlZj0NCi0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rldi9yZWxlYXNlLXNpZ25pbmcjd2ViLW9mLXRydXN0Ij5XZWIgb2YNCi10cnVzdDwvYT4gaXMgdXNlZCB0byBjb25maXJtIHRoZSBpZGVudGl0eSBvZiB0aGVzZSBrZXlzLjwvcD4NCi08L2Rpdj4NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvZG93bmxvYWQvMV80L2Rvd25sb2FkLmNnaSBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvZG93bmxvYWQvMV80L2Rvd25sb2FkLmNnaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmE5ZjhkMy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL2Rvd25sb2FkLzFfNC9kb3dubG9hZC5jZ2kKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jIS9iaW4vc2gKLQotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jIAotIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMgCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSMgV3JhcHBlciBzY3JpcHQgYXJvdW5kIG1pcnJvcnMuY2dpIHNjcmlwdAotIyAod2UgbXVzdCBjaGFuZ2UgdG8gdGhhdCBkaXJlY3RvcnkgaW4gb3JkZXIgZm9yIHB5dGhvbiB0byBwaWNrIHVwIHRoZQotIyAgcHl0aG9uIGluY2x1ZGVzIGNvcnJlY3RseSkKLWNkIC93d3cvd3d3LmFwYWNoZS5vcmcvZHluL21pcnJvcnMKLS93d3cvd3d3LmFwYWNoZS5vcmcvZHluL21pcnJvcnMvbWlycm9ycy5jZ2kgJCoKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL2Rvd25sb2FkLzFfNC9kb3dubG9hZC54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL2Rvd25sb2FkLzFfNC9kb3dubG9hZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkZTYxZjIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9kb3dubG9hZC8xXzQvZG93bmxvYWQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iDQotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4NCi08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+DQotPGhlYWQ+DQotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PQ0KLSJIVE1MIFRpZHkgZm9yIFdpbmRvd3MgKHZlcnMgMTQgSnVuZSAyMDA3KSwgc2VlIHd3dy53My5vcmciIC8+DQotPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSIiIC8+DQotPHRpdGxlPkF4aXMyIDEuNSBSZWxlYXNlPC90aXRsZT4NCi08L2hlYWQ+DQotPGJvZHk+DQotPCEtLUdvb2dsZSBBbmF5aXRjcyB0cmFja2luZyBjb2RlLS0+DQotPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0NCi0iaHR0cDovL3d3dy5nb29nbGUtYW5hbHl0aWNzLmNvbS91cmNoaW4uanMiPg0KLTwvc2NyaXB0PjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4NCi0vLzwhW0NEQVRBWw0KLV91YWNjdCA9ICJVQS0xOTU0Mzc4LTMiOw0KLXVyY2hpblRyYWNrZXIoKTsNCi0vL11dPg0KLTwvc2NyaXB0PjwhLS1FbmQgb2YgR29vZ2xlIEFuYXlpdGNzIHRyYWNraW5nIGNvZGUtLT4NCi08aDI+QXhpczIgMS41IFJlbGVhc2U8L2gyPg0KLTxkaXY+DQotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjEiPg0KLTx0Ym9keT4NCi08dHI+DQotPHRoIHNjb3BlPSJjb2wiPkRpc3RyaWJ1dGlvbiBOYW1lPC90aD4NCi08dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPg0KLTwhLS08dGggc2NvcGU9ImNvbCI+SXRlbXM8L3RoPi0tPg0KLTx0aCBzY29wZT0iY29sIj5Eb3dubG9hZDwvdGg+DQotPC90cj4NCi08dHI+DQotPHRkPjxhIG5hbWU9InN0ZC1iaW4iIGlkPSJzdGQtYmluIj48L2E+PHN0cm9uZz5TdGFuZGFyZCBCaW5hcnkNCi1EaXN0cmlidXRpb248L3N0cm9uZz48L3RkPg0KLTx0ZD5UaGlzIGlzIHRoZSBjb21wbGV0ZSB2ZXJzaW9uIG9mIEF4aXMyIGFuZCB3aWxsIGNvbnRhaW4gc2FtcGxlcw0KLWFzIHdlbGwuIFNpbmNlIFdTLUFkZHJlc3NpbmcgaW1wbGVtZW50YXRpb24gYW5kIFNPQVAgTW9uaXRvcg0KLXV0aWxpdHkgbW9kdWxlcyBhcmUgZW5nYWdlZCBpbiB0byBBeGlzMiwgYnkgZGVmYXVsdCwgdGhpcw0KLWRpc3RyaWJ1dGlvbiB3aWxsIGNvbnRhaW4gYWRkcmVzc2luZy5tYXIgYW5kIHNvYXBtb25pdG9yLm1hci4gQnV0DQotdGhlIG90aGVyIG1vZHVsZXMgdGhhdCBhcmUgYmVpbmcgZGV2ZWxvcGVkIHdpdGhpbiBBeGlzMiB3aWxsIG5vdCBiZQ0KLWluY2x1ZGVkIGhlcmUsIGFuZCBuZWVkIHRvIGJlIDxhIGhyZWY9DQotIi4uLy4uL21vZHVsZXMvaW5kZXguaHRtbCI+ZG93bmxvYWRlZDwvYT4gc2VwYXJhdGVseS48L3RkPg0KLTx0ZD48YSBocmVmPSJbcHJlZmVycmVkXS93cy9heGlzMi8xXzUvYXhpczItMS41LWJpbi56aXAiIHRpdGxlPQ0KLSJbcHJlZmVycmVkXS93cy9heGlzMi8xXzUvYXhpczItMS41LWJpbi56aXAiIG9uQ2xpY2s9DQotImphdmFzY3JpcHQ6dXJjaGluVHJhY2tlciAoJy9kb3dubG9hZHMvYXhpczItMS41LWJpbi56aXAnKTsiPnppcDwvYT4NCi08YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8xXzUvYXhpczItMS41LWJpbi56aXAubWQ1Ig0KLXRpdGxlPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8xXzUvYXhpczItMS41LWJpbi56aXAubWQ1Ij5NRDU8L2E+DQotPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMV81L2F4aXMyLTEuNS1iaW4uemlwLmFzYyINCi10aXRsZT0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMV81L2F4aXMyLTEuNS1iaW4uemlwLmFzYyI+UEdQPC9hPjwvdGQ+DQotPC90cj4NCi08dHI+DQotPHRkPjxhIG5hbWU9InNyYyIgaWQ9InNyYyI+PC9hPiA8c3Ryb25nPlNvdXJjZQ0KLURpc3RyaWJ1dGlvbjwvc3Ryb25nPjwvdGQ+DQotPHRkPlRoaXMgd2lsbCBjb250YWluIHRoZSBzb3VyY2VzIG9mIEF4aXMyIHN0YW5kYXJkIGRpc3RyaWJ1dGlvbi4NCi1PbmUgY2FuIGdlbmVyYXRlIGEgYmluYXJ5IGRpc3RyaWJ1dGlvbiBmcm9tIHRoaXMgYnkgdHlwaW5nDQotPHNwYW4gY2xhc3M9InN0eWxlMSI+JG1hdmVuIGRpc3QtYmluPC9zcGFuPiAoPGEgaHJlZj0NCi0iaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvMV81L2luc3RhbGxhdGlvbmd1aWRlLmh0bWwjZW52LXNyYyI+U2V0DQotdXAgQXhpczIgZW52aXJvbm1lbnQ8L2E+IGJlZm9yZSBydW5uaW5nIHRoaXMgY29tbWFuZCkuIFVzZWZ1bCBmb3INCi1hZHZhbmNlZCB1c2Vycy48L3RkPg0KLTx0ZD48YSBocmVmPSJbcHJlZmVycmVkXS93cy9heGlzMi8xXzUvYXhpczItMS41LXNyYy56aXAiIHRpdGxlPQ0KLSJbcHJlZmVycmVkXS93cy9heGlzMi8xXzUvYXhpczItMS41LXNyYy56aXAiIG9uQ2xpY2s9DQotImphdmFzY3JpcHQ6dXJjaGluVHJhY2tlciAoJy9kb3dubG9hZHMvYXhpczItMS41LXNyYy56aXAnKTsiPnppcDwvYT4NCi08YSBocmVmPQ0KLSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8xXzUvYXhpczItMS41LXNyYy56aXAubWQ1Ig0KLXRpdGxlPQ0KLSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8xXzUvYXhpczItMS41LXNyYy56aXAubWQ1Ij5NRDU8L2E+DQotPGEgaHJlZj0NCi0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMV81L2F4aXMyLTEuNS1zcmMuemlwLmFzYyINCi10aXRsZT0NCi0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMV81L2F4aXMyLTEuNS1zcmMuemlwLmFzYyI+UEdQPC9hPjwvdGQ+DQotPC90cj4NCi08dHI+DQotPHRkPjxhIG5hbWU9IndhciIgaWQ9IndhciI+PC9hPjxzdHJvbmc+V0FSIChXZWIgQXJjaGl2ZSkNCi1EaXN0cmlidXRpb248L3N0cm9uZz48L3RkPg0KLTx0ZD5UaGlzIHdpbGwgYmUgdGhlIHdlYiBhcHBsaWNhdGlvbiBvZiBBeGlzMiB3aGljaCBjYW4gYmUgZGVwbG95ZWQNCi1pbiBtb3N0IG9mIHRoZSBzZXJ2bGV0IGNvbnRhaW5lcnMuPC90ZD4NCi08dGQ+PGEgaHJlZj0iW3ByZWZlcnJlZF0vd3MvYXhpczIvMV81L2F4aXMyLTEuNS13YXIuemlwIiB0aXRsZT0NCi0iW3ByZWZlcnJlZF0vd3MvYXhpczIvMV81L2F4aXMyLTEuNS13YXIuemlwIiBvbkNsaWNrPQ0KLSJqYXZhc2NyaXB0OnVyY2hpblRyYWNrZXIgKCcvZG93bmxvYWRzL2F4aXMyLTEuNS13YXIuemlwJyk7Ij56aXA8L2E+DQotPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMV81L2F4aXMyLTEuNS13YXIuemlwLm1kNSINCi10aXRsZT0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMV81L2F4aXMyLTEuNS13YXIuemlwLm1kNSI+TUQ1PC9hPg0KLTxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzFfNS9heGlzMi0xLjUtd2FyLnppcC5hc2MiDQotdGl0bGU9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzFfNS9heGlzMi0xLjUtd2FyLnppcC5hc2MiPlBHUDwvYT48L3RkPg0KLTwvdHI+DQotPHRyPg0KLTx0ZD48c3Ryb25nPkRvY3VtZW50cyBEaXN0cmlidXRpb248L3N0cm9uZz48L3RkPg0KLTx0ZD5UaGlzIHdpbGwgY29udGFpbiBhbGwgdGhlIGRvY3VtZW50YXRpb24gaW4gb25lIHBhY2thZ2UuPC90ZD4NCi08dGQ+PGEgaHJlZj0iW3ByZWZlcnJlZF0vd3MvYXhpczIvMV81L2F4aXMyLTEuNS1kb2NzLnppcCIgdGl0bGU9DQotIltwcmVmZXJyZWRdL3dzL2F4aXMyLzFfNS9heGlzMi0xLjUtZG9jcy56aXAiIG9uQ2xpY2s9DQotImphdmFzY3JpcHQ6dXJjaGluVHJhY2tlciAoJy9kb3dubG9hZHMvYXhpczItMS41LWRvY3MuemlwJyk7Ij56aXA8L2E+DQotPGEgaHJlZj0NCi0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMV81L2F4aXMyLTEuNS1kb2NzLnppcC5tZDUiDQotdGl0bGU9DQotImh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzFfNS9heGlzMi0xLjUtZG9jcy56aXAubWQ1Ij5NRDU8L2E+DQotPGEgaHJlZj0NCi0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMV81L2F4aXMyLTEuNS1kb2NzLnppcC5hc2MiDQotdGl0bGU9DQotImh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzFfNS9heGlzMi0xLjUtZG9jcy56aXAuYXNjIj5QR1A8L2E+PC90ZD4NCi08L3RyPg0KLTwvdGJvZHk+DQotPC90YWJsZT4NCi08L2Rpdj4NCi08ZGl2IGFsaWduPSJsZWZ0Ij48YnIgLz4NCi08cD5baWYtYW55IGxvZ29dIDxhIGhyZWY9IltsaW5rXSI+PGltZyBhbGlnbj0icmlnaHQiIHNyYz0iW2xvZ29dIg0KLWJvcmRlcj0iMCIgLz48L2E+W2VuZF0gVGhlIGN1cnJlbnRseSBzZWxlY3RlZCBtaXJyb3IgaXMNCi08Yj5bcHJlZmVycmVkXTwvYj4uIElmIHlvdSBlbmNvdW50ZXIgYSBwcm9ibGVtIHdpdGggdGhpcyBtaXJyb3IsDQotcGxlYXNlIHNlbGVjdCBhbm90aGVyIG1pcnJvci4gSWYgYWxsIG1pcnJvcnMgYXJlIGZhaWxpbmcsIHRoZXJlIGFyZQ0KLTxpPmJhY2t1cDwvaT4gbWlycm9ycyAoYXQgdGhlIGVuZCBvZiB0aGUgbWlycm9ycyBsaXN0KSB0aGF0IHNob3VsZA0KLWJlIGF2YWlsYWJsZS48L3A+DQotPGZvcm0gYWN0aW9uPSJbbG9jYXRpb25dIiBtZXRob2Q9ImdldCIgaWQ9IlNlbGVjdE1pcnJvciIgbmFtZT0iU2VsZWN0TWlycm9yIj4NCi1PdGhlciBtaXJyb3JzOiA8c2VsZWN0IG5hbWU9IlByZWZlcnJlZCI+DQotW2lmLWFueSBodHRwXQ0KLSAgW2ZvciBodHRwXTxvcHRpb24gdmFsdWU9IltodHRwXSI+W2h0dHBdPC9vcHRpb24+W2VuZF0NCi1bZW5kXSAgDQotW2lmLWFueSBmdHBdDQotICBbZm9yIGZ0cF08b3B0aW9uIHZhbHVlPSJbZnRwXSI+W2Z0cF08L29wdGlvbj5bZW5kXQ0KLVtlbmRdDQotW2lmLWFueSBiYWNrdXBdDQotICBbZm9yIGJhY2t1cF08b3B0aW9uIHZhbHVlPSJbYmFja3VwXSI+W2JhY2t1cF0gKGJhY2t1cCk8L29wdGlvbj5bZW5kXQ0KLVtlbmRdDQotPC9zZWxlY3Q+PGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9IkNoYW5nZSIvPjwvZm9ybT4NCi08cD5Zb3UgbWF5IGFsc28gY29uc3VsdCB0aGUgPGEgY2xhc3M9ImV4dGVybmFsTGluayIgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL21pcnJvcnMvIj5jb21wbGV0ZSBsaXN0IG9mIG1pcnJvcnM8L2E+PC9wPg0KLTxwPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gd2hlbiBkb3dubG9hZGluZyBmcm9tIGEgbWlycm9yIHBsZWFzZQ0KLWNoZWNrIHRoZSA8YSBocmVmPQ0KLSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGV2L3JlbGVhc2Utc2lnbmluZyNtZDUiPm1kNXN1bTwvYT4gYW5kDQotdmVyaWZ5IHRoZSA8YSBocmVmPQ0KLSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGV2L3JlbGVhc2Utc2lnbmluZyNvcGVucGdwIj5PcGVuUEdQPC9hPg0KLWNvbXBhdGlibGUgc2lnbmF0dXJlIGZyb20gdGhlIG1haW4gQXBhY2hlIHNpdGUuIFRoZXNlIGNhbiBiZQ0KLWRvd25sb2FkZWQgYnkgZm9sbG93aW5nIHRoZSBsaW5rcyBhYm92ZS4gVGhpcyA8YSBocmVmPQ0KLSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi9LRVlTIj5LRVlTPC9hPiBmaWxlIGNvbnRhaW5zDQotdGhlIHB1YmxpYyBrZXlzIHRoYXQgY2FuIGJlIHVzZWQgZm9yIHZlcmlmeWluZyBzaWduYXR1cmVzLiBJdCBpcw0KLXJlY29tbWVuZGVkIHRoYXQgKHdoZW4gcG9zc2libGUpYSA8YSBocmVmPQ0KLSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGV2L3JlbGVhc2Utc2lnbmluZyN3ZWItb2YtdHJ1c3QiPldlYiBvZg0KLXRydXN0PC9hPiBpcyB1c2VkIHRvIGNvbmZpcm0gdGhlIGlkZW50aXR5IG9mIHRoZXNlIGtleXMuPC9wPg0KLTwvZGl2Pg0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9kb3dubG9hZC9NMi9kb3dubG9hZC5jZ2kgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL2Rvd25sb2FkL00yL2Rvd25sb2FkLmNnaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmE5ZjhkMy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL2Rvd25sb2FkL00yL2Rvd25sb2FkLmNnaQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMhL2Jpbi9zaAotCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMgCi0jIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIyAKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLQotIyBXcmFwcGVyIHNjcmlwdCBhcm91bmQgbWlycm9ycy5jZ2kgc2NyaXB0Ci0jICh3ZSBtdXN0IGNoYW5nZSB0byB0aGF0IGRpcmVjdG9yeSBpbiBvcmRlciBmb3IgcHl0aG9uIHRvIHBpY2sgdXAgdGhlCi0jICBweXRob24gaW5jbHVkZXMgY29ycmVjdGx5KQotY2QgL3d3dy93d3cuYXBhY2hlLm9yZy9keW4vbWlycm9ycwotL3d3dy93d3cuYXBhY2hlLm9yZy9keW4vbWlycm9ycy9taXJyb3JzLmNnaSAkKgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvZG93bmxvYWQvTTIvZG93bmxvYWQueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9kb3dubG9hZC9NMi9kb3dubG9hZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjNWI4OWQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9kb3dubG9hZC9NMi9kb3dubG9hZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIg0KLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+DQotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPg0KLTxoZWFkPg0KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0NCi0iSFRNTCBUaWR5IGZvciBXaW5kb3dzICh2ZXJzIDE0IEp1bmUgMjAwNyksIHNlZSB3d3cudzMub3JnIiAvPg0KLTxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0iIiAvPg0KLTx0aXRsZT5BeGlzMiBNMiBSZWxlYXNlPC90aXRsZT4NCi08L2hlYWQ+DQotPGJvZHk+DQotPGgyPkF4aXMyIE1pbGVzdG9uZSAyIFJlbGVhc2U8L2gyPg0KLTxkaXYgYWxpZ249ImxlZnQiPg0KLTxoMz5Tb3VyY2UgRGlzdHJpYnV0aW9uPC9oMz4NCi08cD48YSBocmVmPQ0KLSJodHRwOi8vY3ZzLmFwYWNoZS5vcmcvZGlzdC9heGlzL3YyLjAtTTIvYXhpczItTTItc3JjLnppcCIgdGl0bGU9DQotImh0dHA6Ly9jdnMuYXBhY2hlLm9yZy9kaXN0L2F4aXMvdjIuMC1NMi9heGlzMi1NMi1zcmMuemlwIj56aXA8L2E+PGJyIC8+DQotPC9wPg0KLTxoMz5CaW5hcnkgRGlzdHJpYnV0aW9uPC9oMz4NCi08cD48YSBocmVmPQ0KLSJodHRwOi8vY3ZzLmFwYWNoZS5vcmcvZGlzdC9heGlzL3YyLjAtTTIvYXhpczItTTItYmluLnppcCIgdGl0bGU9DQotImh0dHA6Ly9jdnMuYXBhY2hlLm9yZy9kaXN0L2F4aXMvdjIuMC1NMi9heGlzMi1NMi1iaW4uemlwIj56aXA8L2E+PC9wPg0KLTwvZGl2Pg0KLTxkaXYgYWxpZ249ImxlZnQiPjxiciAvPg0KLTxwPltpZi1hbnkgbG9nb10gPGEgaHJlZj0iW2xpbmtdIj48aW1nIGFsaWduPSJyaWdodCIgc3JjPSJbbG9nb10iDQotYm9yZGVyPSIwIiAvPjwvYT5bZW5kXSBUaGUgY3VycmVudGx5IHNlbGVjdGVkIG1pcnJvciBpcw0KLTxiPltwcmVmZXJyZWRdPC9iPi4gSWYgeW91IGVuY291bnRlciBhIHByb2JsZW0gd2l0aCB0aGlzIG1pcnJvciwNCi1wbGVhc2Ugc2VsZWN0IGFub3RoZXIgbWlycm9yLiBJZiBhbGwgbWlycm9ycyBhcmUgZmFpbGluZywgdGhlcmUgYXJlDQotPGk+YmFja3VwPC9pPiBtaXJyb3JzIChhdCB0aGUgZW5kIG9mIHRoZSBtaXJyb3JzIGxpc3QpIHRoYXQgc2hvdWxkDQotYmUgYXZhaWxhYmxlLjwvcD4NCi08Zm9ybSBhY3Rpb249Iltsb2NhdGlvbl0iIG1ldGhvZD0iZ2V0IiBpZD0iU2VsZWN0TWlycm9yIiBuYW1lPQ0KLSJTZWxlY3RNaXJyb3IiPk90aGVyIG1pcnJvcnM6IDxzZWxlY3QgbmFtZT0iUHJlZmVycmVkIj4NCi08b3B0aW9uIHZhbHVlPSJbaHR0cF0iIHNlbGVjdGVkPSJzZWxlY3RlZCI+W2h0dHBdPC9vcHRpb24+DQotPG9wdGlvbiB2YWx1ZT0iW2Z0cF0iPltmdHBdPC9vcHRpb24+DQotPG9wdGlvbiB2YWx1ZT0iW2JhY2t1cF0iPltiYWNrdXBdIChiYWNrdXApPC9vcHRpb24+DQotPC9zZWxlY3Q+IDxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSJDaGFuZ2UiIC8+PC9mb3JtPg0KLTxwPllvdSBtYXkgYWxzbyBjb25zdWx0IHRoZSA8YSBocmVmPQ0KLSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbWlycm9ycy8iPmNvbXBsZXRlIGxpc3Qgb2YgbWlycm9yczwvYT4uPC9wPg0KLTxwPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gd2hlbiBkb3dubG9hZGluZyBmcm9tIGEgbWlycm9yIHBsZWFzZQ0KLWNoZWNrIHRoZSA8YSBocmVmPQ0KLSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGV2L3JlbGVhc2Utc2lnbmluZyNtZDUiPm1kNXN1bTwvYT4gYW5kDQotdmVyaWZ5IHRoZSA8YSBocmVmPQ0KLSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGV2L3JlbGVhc2Utc2lnbmluZyNvcGVucGdwIj5PcGVuUEdQPC9hPg0KLWNvbXBhdGlibGUgc2lnbmF0dXJlIGZyb20gdGhlIG1haW4gQXBhY2hlIHNpdGUuIFRoZXNlIGNhbiBiZQ0KLWRvd25sb2FkZWQgYnkgZm9sbG93aW5nIHRoZSBsaW5rcyBhYm92ZS4gVGhpcyA8YSBocmVmPQ0KLSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi9LRVlTIj5LRVlTPC9hPiBmaWxlIGNvbnRhaW5zDQotdGhlIHB1YmxpYyBrZXlzIHVzZWQgZm9yIHNpZ25pbmcgcmVsZWFzZS4gSXQgaXMgcmVjb21tZW5kZWQgdGhhdA0KLSh3aGVuIHBvc3NpYmxlKSBhIDxhIGhyZWY9DQotImh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kZXYvcmVsZWFzZS1zaWduaW5nI3dlYi1vZi10cnVzdCI+d2ViIG9mDQotdHJ1c3Q8L2E+IGlzIHVzZWQgdG8gY29uZmlybSB0aGUgaWRlbnRpdHkgb2YgdGhlc2Uga2V5cy48L3A+DQotPC9kaXY+DQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL2R5bmFtaWMtbGFiZWxzLnByb3BlcnRpZXMgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL2R5bmFtaWMtbGFiZWxzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1ZjJmZTIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9keW5hbWljLWxhYmVscy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIwotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi1heGlzMl92ZXJzaW9uPTEuNQotYXhpczJfdmVyc2lvbl9kaXI9MV81Ci0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvZmFxLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvZmFxLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFkZTdmMi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL2ZhcS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNjEgKzAsMCBAQAotPCEtLQotICB+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+Ci08L2xpPgotPC9vbD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvZ3VpZGVsaW5lcy54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL2d1aWRlbGluZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWVjNDYwLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvZ3VpZGVsaW5lcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi08IS0tDQotICB+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+DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9pbWFnZXMvYnJlYWRjcnVtYnMtYmcuZ2lmIGIvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9pbWFnZXMvYnJlYWRjcnVtYnMtYmcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDEwMzA0Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvaW1hZ2VzL2JyZWFkY3J1bWJzLWJnLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvaW1hZ2VzL2ZhcS8xLmpwZyBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvaW1hZ2VzL2ZhcS8xLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJlN2VjNC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL2ltYWdlcy9mYXEvMS5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL2ltYWdlcy9oMi1iZy5naWYgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL2ltYWdlcy9oMi1iZy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkZGIzMmUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9pbWFnZXMvaDItYmcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9pbWFnZXMvbGVmdGNvbHVtbi1iZy5naWYgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL2ltYWdlcy9sZWZ0Y29sdW1uLWJnLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJmYWEyMS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL2ltYWdlcy9sZWZ0Y29sdW1uLWJnLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvaW5kZXgueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9pbmRleC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0OGE2NjMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9pbmRleC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMDIgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PQotIkhUTUwgVGlkeSBmb3IgV2luZG93cyAodmVycyAxNCBKdW5lIDIwMDcpLCBzZWUgd3d3LnczLm9yZyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0iIiAvPgotPHRpdGxlPkFwYWNoZSBBeGlzMi9KYXZhIC0gTmV4dCBHZW5lcmF0aW9uIFdlYiBTZXJ2aWNlczwvdGl0bGU+Ci08bGluayBocmVmPSJjc3MvYXhpcy1kb2NzLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIKLW1lZGlhPSJhbGwiIC8+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJlbiIgeG1sOmxhbmc9ImVuIj4KLTxoMT5XZWxjb21lIHRvIEFwYWNoZSBBeGlzMi9KYXZhPC9oMT4KLTxwPkJhc2VkIG9uIHRoZSBBeGlzMiBhcmNoaXRlY3R1cmUsIHRoZXJlIGFyZSB0d28gaW1wbGVtZW50YXRpb25zCi1vZiB0aGUgQXBhY2hlIEF4aXMyIFdlYiBzZXJ2aWNlcyBlbmdpbmUgLSBBcGFjaGUgQXhpczIvSmF2YSBhbmQKLUFwYWNoZSBBeGlzMi9DPC9wPgotPHA+V2hpbGUgeW91IHdpbGwgZmluZCBhbGwgdGhlIGluZm9ybWF0aW9uIG9uIEFwYWNoZSBBeGlzMi9KYXZhCi1oZXJlLCB5b3UgY2FuIHZpc2l0IHRoZSA8YSBocmVmPQotImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL2MvIj48c3Ryb25nPkFwYWNoZSBBeGlzMi9DPC9zdHJvbmc+PC9hPgotV2ViIHNpdGUgZm9yIEF4aXMyL0MgaW1wbGVtZW50YXRpb24gaW5mb3JtYXRpb24uPC9wPgotPGgyPk1heSAyOSwgMjAwOSAtIEFwYWNoZSBBeGlzMi9KYXZhIFZlcnNpb24gMS41IFJlbGVhc2VkITwvaDI+Ci08cD5UaGUgMS41IHZlcnNpb24gZml4ZXMgYSBsYXJnZSBudW1iZXIgb2YgPGEgaHJlZj0iaHR0cDovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0FYSVMyIj5idWdzPC9hPiwgYWRkcyBiZXR0ZXIgcGx1Z2dhYmlsaXR5IGZvciB0cmFuc3BvcnRzLCBhbmQgaW5jbHVkZXMgY2x1c3RlcmluZyB1cGdyYWRlcyAoaW5jbHVkaW5nIGNsdXN0ZXJpbmcgc3VwcG9ydCBvbiBFQzIpLjwvcD4KLTxwPlsgPGEgaHJlZj0KLSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi9kb3dubG9hZC5jZ2kiPjxzdHJvbmc+RG93bmxvYWQ8L3N0cm9uZz48L2E+Ci1dIHwgWyA8YSBocmVmPSIxXzUvaW5kZXguaHRtbCI+PHN0cm9uZz5Eb2N1bWVudHMgSG9tZTwvc3Ryb25nPjwvYT4KLV08L3A+Ci08cD5BcGFjaGUgQXhpczIgaXMgdGhlIGNvcmUgZW5naW5lIGZvciBXZWIgc2VydmljZXMuIEl0IGlzIGEKLWNvbXBsZXRlIHJlLWRlc2lnbiBhbmQgcmUtd3JpdGUgb2YgdGhlIHdpZGVseSB1c2VkIDxhIGhyZWY9Ci0iaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpcy8iPkFwYWNoZSBBeGlzPC9hPiBTT0FQIHN0YWNrLjwvcD4KLTxwPlBsZWFzZSBzZWUgdGhlIDxhIGhyZWY9Imh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMvcmVmLmh0bWwiPkF4aXMKLVJlZmVyZW5jZSBMaWJyYXJ5PC9hPiBmb3IgYSBsaXN0IG9mIHRlY2huaWNhbCByZXNvdXJjZXMgdGhhdCBzaG91bGQKLXByb3ZlIHVzZWZ1bCBvbiB0aGlzIHByb2plY3QuPC9wPgotPGgzPjxlbT5XaHkgQXBhY2hlIEF4aXMyOjwvZW0+PC9oMz4KLTxwPkEgbmV3IGFyY2hpdGVjdHVyZSBmb3IgQXhpczIgd2FzIGludHJvZHVjZWQgZHVyaW5nIHRoZSBBdWd1c3QKLTIwMDQgU3VtbWl0IGluIENvbG9tYm8sIFNyaSBMYW5rYS4gVGhlIG5ldyBhcmNoaXRlY3R1cmUgb24gd2hpY2gKLUF4aXMyIGlzIGJhc2VkIG9uIGlzIG1vcmUgZmxleGlibGUsIGVmZmljaWVudCBhbmQgY29uZmlndXJhYmxlIGluCi1jb21wYXJpc29uIHRvIDxhIGhyZWY9Ci0iaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpcy9qYXZhL2FyY2hpdGVjdHVyZS1ndWlkZS5odG1sIj5BeGlzMS54Ci1hcmNoaXRlY3R1cmU8L2E+LiBTb21lIHdlbGwgZXN0YWJsaXNoZWQgY29uY2VwdHMgZnJvbSBBeGlzIDEueCwKLWxpa2UgaGFuZGxlcnMgZXRjLiwgaGF2ZSBiZWVuIHByZXNlcnZlZCBpbiB0aGUgbmV3Ci1hcmNoaXRlY3R1cmUuPC9wPgotPHA+QXBhY2hlIEF4aXMyIG5vdCBvbmx5IHN1cHBvcnRzIFNPQVAgMS4xIGFuZCBTT0FQIDEuMiwgYnV0IGl0Ci1hbHNvIGhhcyBpbnRlZ3JhdGVkIHN1cHBvcnQgZm9yIHRoZSB3aWRlbHkgcG9wdWxhciA8YSBocmVmPQotImh0dHA6Ly93d3cueGZyb250LmNvbS9SRVNULVdlYi1TZXJ2aWNlcy5odG1sIj5SRVNUIHN0eWxlIG9mIFdlYgotc2VydmljZXM8L2E+LiBUaGUgc2FtZSBidXNpbmVzcyBsb2dpYyBpbXBsZW1lbnRhdGlvbiBjYW4gb2ZmZXIgYm90aAotYSBXUy0qIHN0eWxlIGludGVyZmFjZSBhcyB3ZWxsIGFzIGEgUkVTVC9QT1ggc3R5bGUgaW50ZXJmYWNlCi1zaW11bHRhbmVvdXNseS48L3A+Ci08cD5BcGFjaGUgQXhpczIgaXMgbW9yZSBlZmZpY2llbnQsIG1vcmUgbW9kdWxhciBhbmQgbW9yZQotWE1MLW9yaWVudGVkIHRoYW4gdGhlIG9sZGVyIHZlcnNpb24uIEl0IGlzIGNhcmVmdWxseSBkZXNpZ25lZCB0bwotc3VwcG9ydCB0aGUgZWFzeSBhZGRpdGlvbiBvZiBwbHVnLWluICJtb2R1bGVzIiB0aGF0IGV4dGVuZCB0aGVpcgotZnVuY3Rpb25hbGl0eSBmb3IgZmVhdHVyZXMgc3VjaCBhcyBzZWN1cml0eSBhbmQgcmVsaWFiaWxpdHkuIFRoZQotPGEgaHJlZj0iaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvbW9kdWxlcy9pbmRleC5odG1sIj5Nb2R1bGVzPC9hPgotY3VycmVudGx5IGF2YWlsYWJsZSBvciB1bmRlciBkZXZlbG9wbWVudCBpbmNsdWRlOjwvcD4KLTx1bD4KLTxsaT48YSBocmVmPQotImh0dHA6Ly93d3cub2FzaXMtb3Blbi5vcmcvY29tbWl0dGVlcy90Y19ob21lLnBocD93Z19hYmJyZXY9d3NybSIKLXRhcmdldD0iX2JsYW5rIj5XUy1SZWxpYWJsZU1lc3NhZ2luZzwvYT4gLSBTdXBwb3J0ZWQgYnkgPGEgaHJlZj0KLSJodHRwOi8vd3MuYXBhY2hlLm9yZy9zYW5kZXNoYS9zYW5kZXNoYTIvIj5BcGFjaGUKLVNhbmRlc2hhMjwvYT48L2xpPgotPGxpPjxhIGhyZWY9Ci0iaHR0cDovL3d3dy0xMjguaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9saWJyYXJ5L3NwZWNpZmljYXRpb24vd3MtdHgvI2Nvb3IiCi10YXJnZXQ9Il9ibGFuayI+V1MtQ29vcmRpbmF0aW9uPC9hPiBhbmQgPGEgaHJlZj0KLSJodHRwOi8vd3d3LTEyOC5pYm0uY29tL2RldmVsb3BlcndvcmtzL2xpYnJhcnkvc3BlY2lmaWNhdGlvbi93cy10eC8jYXRvbSIKLXRhcmdldD0iX2JsYW5rIj5XUy1BdG9taWNUcmFuc2FjdGlvbjwvYT4gLSBTdXBwb3J0ZWQgYnkgPGEgaHJlZj0KLSJodHRwOi8vd3MuYXBhY2hlLm9yZy9rYW5kdWxhLyI+QXBhY2hlIEthbmR1bGEyPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0KLSJodHRwOi8vd3d3Lm9hc2lzLW9wZW4ub3JnL2NvbW1pdHRlZXMvdGNfaG9tZS5waHA/d2dfYWJicmV2PXdzcyIKLXRhcmdldD0iX2JsYW5rIj5XUy1TZWN1cml0eTwvYT4gLSBTdXBwb3J0ZWQgYnkgPGEgaHJlZj0KLSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi9tb2R1bGVzL3JhbXBhcnQvMV8yL3NlY3VyaXR5LW1vZHVsZS5odG1sIj4KLUFwYWNoZSBSYW1wYXJ0PC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvU3VibWlzc2lvbi93cy1hZGRyZXNzaW5nLyIgdGFyZ2V0PQotIl9ibGFuayI+V1MtQWRkcmVzc2luZzwvYT4gLU1vZHVsZSBpbmNsdWRlZCBhcyBwYXJ0IG9mIEF4aXMyCi1jb3JlPC9saT4KLTwvdWw+Ci08cD5BcGFjaGUgQXhpczIgaXMgYnVpbHQgb24gPGEgaHJlZj0KLSJodHRwOi8vd3MuYXBhY2hlLm9yZy9jb21tb25zL2F4aW9tL2luZGV4Lmh0bWwiPkFwYWNoZSBBWElPTTwvYT4sIGEKLW5ldyBoaWdoIHBlcmZvcm1hbnQsIHB1bGwtYmFzZWQgWE1MIG9iamVjdCBtb2RlbC48L3A+Ci08cD5BeGlzMiBjb21lcyB3aXRoIG1hbnkgbmV3IGZlYXR1cmVzLCBlbmhhbmNlbWVudHMgYW5kIGluZHVzdHJ5Ci1zcGVjaWZpY2F0aW9uIGltcGxlbWVudGF0aW9ucy4gVGhlIGtleSBmZWF0dXJlcyBvZmZlcmVkIGFyZSBhcwotZm9sbG93czo8L3A+Ci08dWw+Ci08bGk+Ci08cCBzdHlsZT0ibWFyZ2luLWJvdHRvbTogMGluIj48c3Ryb25nPlNwZWVkPC9zdHJvbmc+IC0gQXhpczIgdXNlcwotaXRzIG93biBvYmplY3QgbW9kZWwgYW5kIFN0QVggKFN0cmVhbWluZyBBUEkgZm9yIFhNTCkgcGFyc2luZyB0bwotYWNoaWV2ZSBzaWduaWZpY2FudGx5IGdyZWF0ZXIgc3BlZWQgdGhhbiBlYXJsaWVyIHZlcnNpb25zIG9mIEFwYWNoZQotQXhpcy48L3A+Ci08L2xpPgotPGxpPgotPHAgc3R5bGU9Im1hcmdpbi1ib3R0b206IDBpbiI+PHN0cm9uZz5Mb3cgbWVtb3J5IGZvb3QKLXByaW50PC9zdHJvbmc+LSBBeGlzMiB3YXMgZGVzaWduZWQgZ3JvdW5kLXVwIGtlZXBpbmcgbG93IG1lbW9yeQotZm9vdCBwcmludCBpbiBtaW5kLjwvcD4KLTwvbGk+Ci08bGk+Ci08cCBzdHlsZT0ibWFyZ2luLWJvdHRvbTogMGluIj48c3Ryb25nPkFYSU9NPC9zdHJvbmc+IC0gQXhpczIgY29tZXMKLXdpdGggaXRzIG93biBsaWdodC13ZWlnaHQgb2JqZWN0IG1vZGVsLCBBWElPTSwgZm9yIG1lc3NhZ2UKLXByb2Nlc3Npbmcgd2hpY2ggaXMgZXh0ZW5zaWJsZSwgaGlnaGx5IHBlcmZvcm1hbnQgYW5kIGlzIGRldmVsb3BlcgotY29udmVuaWVudC48L3A+Ci08L2xpPgotPGxpPgotPHAgc3R5bGU9Im1hcmdpbi1ib3R0b206IDBpbiI+PHN0cm9uZz48YSBuYW1lPSJIb3RfRGVwbG95bWVudCIgaWQ9Ci0iSG90X0RlcGxveW1lbnQiPjwvYT5Ib3QgRGVwbG95bWVudDwvc3Ryb25nPiAtIEF4aXMyIGlzIGVxdWlwcGVkCi13aXRoIHRoZSBjYXBhYmlsaXR5IG9mIGRlcGxveWluZyBXZWIgc2VydmljZXMgYW5kIGhhbmRsZXJzIHdoaWxlCi10aGUgc3lzdGVtIGlzIHVwIGFuZCBydW5uaW5nLiBJbiBvdGhlciB3b3JkcywgbmV3IHNlcnZpY2VzIGNhbiBiZQotYWRkZWQgdG8gdGhlIHN5c3RlbSB3aXRob3V0IGhhdmluZyB0byBzaHV0IGRvd24gdGhlIHNlcnZlci4gU2ltcGx5Ci1kcm9wIHRoZSByZXF1aXJlZCBXZWIgc2VydmljZSBhcmNoaXZlIGludG8gdGhlIHNlcnZpY2VzIGRpcmVjdG9yeQotaW4gdGhlIHJlcG9zaXRvcnksIGFuZCB0aGUgZGVwbG95bWVudCBtb2RlbCB3aWxsIGF1dG9tYXRpY2FsbHkKLWRlcGxveSB0aGUgc2VydmljZSBhbmQgbWFrZSBpdCBhdmFpbGFibGUgZm9yIHVzZS48L3A+Ci08L2xpPgotPGxpPgotPHAgc3R5bGU9Im1hcmdpbi1ib3R0b206IDBpbiI+PHN0cm9uZz5Bc3luY2hyb25vdXMgV2ViCi1zZXJ2aWNlczwvc3Ryb25nPiAtIEF4aXMyIG5vdyBzdXBwb3J0cyBhc3luY2hyb25vdXMgV2ViIHNlcnZpY2VzCi1hbmQgYXN5bmNocm9ub3VzIFdlYiBzZXJ2aWNlcyBpbnZvY2F0aW9uIHVzaW5nIG5vbi1ibG9ja2luZyBjbGllbnRzCi1hbmQgdHJhbnNwb3J0cy48L3A+Ci08L2xpPgotPGxpPgotPHAgc3R5bGU9Im1hcmdpbi1ib3R0b206IDBpbiI+PHN0cm9uZz5NRVAgU3VwcG9ydDwvc3Ryb25nPiAtIEF4aXMyCi1ub3cgY29tZXMgaGFuZHkgd2l0aCB0aGUgZmxleGliaWxpdHkgdG8gc3VwcG9ydCBNZXNzYWdlIEV4Y2hhbmdlCi1QYXR0ZXJucyAoTUVQcykgd2l0aCBpbi1idWlsdCBzdXBwb3J0IGZvciBiYXNpYyBNRVBzIGRlZmluZWQgaW4KLVdTREwgMi4wLjwvcD4KLTwvbGk+Ci08bGk+Ci08cCBzdHlsZT0ibWFyZ2luLWJvdHRvbTogMGluIj48c3Ryb25nPkZsZXhpYmlsaXR5PC9zdHJvbmc+IC0gVGhlCi1BeGlzMiBhcmNoaXRlY3R1cmUgZ2l2ZXMgdGhlIGRldmVsb3BlciBjb21wbGV0ZSBmcmVlZG9tIHRvIGluc2VydAotZXh0ZW5zaW9ucyBpbnRvIHRoZSBlbmdpbmUgZm9yIGN1c3RvbSBoZWFkZXIgcHJvY2Vzc2luZywgc3lzdGVtCi1tYW5hZ2VtZW50LCBhbmQgPGVtPmFueXRoaW5nIGVsc2UgeW91IGNhbiBpbWFnaW5lPC9lbT4uPC9wPgotPC9saT4KLTxsaT4KLTxwIHN0eWxlPSJtYXJnaW4tYm90dG9tOiAwaW4iPjxzdHJvbmc+U3RhYmlsaXR5PC9zdHJvbmc+IC0gQXhpczIKLWRlZmluZXMgYSBzZXQgb2YgcHVibGlzaGVkIGludGVyZmFjZXMgd2hpY2ggY2hhbmdlIHJlbGF0aXZlbHkKLXNsb3dseSBjb21wYXJlZCB0byB0aGUgcmVzdCBvZiBBeGlzLjwvcD4KLTwvbGk+Ci08bGk+Ci08cCBzdHlsZT0ibWFyZ2luLWJvdHRvbTogMGluIj48c3Ryb25nPkNvbXBvbmVudC1vcmllbnRlZAotRGVwbG95bWVudDwvc3Ryb25nPiAtIFlvdSBjYW4gZWFzaWx5IGRlZmluZSByZXVzYWJsZSBuZXR3b3JrcyBvZgotSGFuZGxlcnMgdG8gaW1wbGVtZW50IGNvbW1vbiBwYXR0ZXJucyBvZiBwcm9jZXNzaW5nIGZvciB5b3VyCi1hcHBsaWNhdGlvbnMsIG9yIHRvIGRpc3RyaWJ1dGUgdG8gcGFydG5lcnMuPC9wPgotPC9saT4KLTxsaT4KLTxwIHN0eWxlPSJtYXJnaW4tYm90dG9tOiAwaW4iPjxzdHJvbmc+VHJhbnNwb3J0IEZyYW1ld29yazwvc3Ryb25nPgotLSBXZSBoYXZlIGEgY2xlYW4gYW5kIHNpbXBsZSBhYnN0cmFjdGlvbiBmb3IgaW50ZWdyYXRpbmcgYW5kIHVzaW5nCi1UcmFuc3BvcnRzIChpLmUuLCBzZW5kZXJzIGFuZCBsaXN0ZW5lcnMgZm9yIFNPQVAgb3ZlciB2YXJpb3VzCi1wcm90b2NvbHMgc3VjaCBhcyBTTVRQLCBGVFAsIG1lc3NhZ2Utb3JpZW50ZWQgbWlkZGxld2FyZSwgZXRjKSwgYW5kCi10aGUgY29yZSBvZiB0aGUgZW5naW5lIGlzIGNvbXBsZXRlbHkgdHJhbnNwb3J0LWluZGVwZW5kZW50LjwvcD4KLTwvbGk+Ci08bGk+Ci08cCBzdHlsZT0ibWFyZ2luLWJvdHRvbTogMGluIj48c3Ryb25nPldTREwgc3VwcG9ydDwvc3Ryb25nPiAtIEF4aXMyCi1zdXBwb3J0cyB0aGUgV2ViIFNlcnZpY2UgRGVzY3JpcHRpb24gTGFuZ3VhZ2UsIHZlcnNpb24gPGEgaHJlZj0KLSJodHRwOi8vd3d3LnczLm9yZy9UUi93c2RsIj4xLjE8L2E+IGFuZCA8YSBocmVmPQotImh0dHA6Ly93d3cudzMub3JnL1RSL3dzZGwyMC8iPjIuMDwvYT4sIHdoaWNoIGFsbG93cyB5b3UgdG8gZWFzaWx5Ci1idWlsZCBzdHVicyB0byBhY2Nlc3MgcmVtb3RlIHNlcnZpY2VzLCBhbmQgYWxzbyB0byBhdXRvbWF0aWNhbGx5Ci1leHBvcnQgbWFjaGluZS1yZWFkYWJsZSBkZXNjcmlwdGlvbnMgb2YgeW91ciBkZXBsb3llZCBzZXJ2aWNlcyBmcm9tCi1BeGlzMi48L3A+Ci08L2xpPgotPGxpPgotPHAgc3R5bGU9Im1hcmdpbi1ib3R0b206IDBpbiI+PHN0cm9uZz5BZGQtb25zPC9zdHJvbmc+IC0gU2V2ZXJhbAotV2ViIHNlcnZpY2VzIHNwZWNpZmljYXRpb25zIGhhdmUgYmVlbiBpbmNvcnBvcmF0ZWQgaW5jbHVkaW5nCi08YSBocmVmPSJodHRwOi8vd3MuYXBhY2hlLm9yZy93c3M0ai8iIHRhcmdldD0iX2JsYW5rIj5XU1M0SjwvYT4gZm9yCi1zZWN1cml0eSAoQXBhY2hlIFJhbXBhcnQpLCA8YSBocmVmPSJodHRwOi8vd3MuYXBhY2hlLm9yZy9zYW5kZXNoYS8iCi10YXJnZXQ9Il9ibGFuayI+U2FuZGVzaGE8L2E+IGZvciByZWxpYWJsZSBtZXNzYWdpbmcsIDxhIGhyZWY9Ci0iaHR0cDovL3dzLmFwYWNoZS5vcmcva2FuZHVsYS8iIHRhcmdldD0iX2JsYW5rIj5LYW5kdWxhPC9hPiB3aGljaAotaXMgYW4gZW5jYXBzdWxhdGlvbiBvZiBXUy1Db29yZGluYXRpb24sIFdTLUF0b21pY1RyYW5zYWN0aW9uIGFuZAotV1MtQnVzaW5lc3NBY3Rpdml0eS48L3A+Ci08L2xpPgotPGxpPgotPHAgc3R5bGU9Im1hcmdpbi1ib3R0b206IDBpbiI+PHN0cm9uZz5Db21wb3NpdGlvbiBhbmQKLUV4dGVuc2liaWxpdHk8L3N0cm9uZz4gLSBNb2R1bGVzIGFuZCBwaGFzZXMgaW1wcm92ZSBzdXBwb3J0IGZvcgotY29tcG9zYWJpbGl0eSBhbmQgZXh0ZW5zaWJpbGl0eS4gTW9kdWxlcyBzdXBwb3J0IGNvbXBvc2FiaWxpdHkgYW5kCi1jYW4gYWxzbyBzdXBwb3J0IG5ldyBXUy0qIHNwZWNpZmljYXRpb25zIGluIGEgc2ltcGxlIGFuZCBjbGVhbgotbWFubmVyLiBUaGV5IGFyZSBob3dldmVyIG5vdCA8YSBocmVmPSIjSG90X0RlcGxveW1lbnQiPmhvdAotZGVwbG95YWJsZTwvYT4gYXMgdGhleSBjaGFuZ2UgdGhlIG92ZXJhbGwgYmVoYXZpb3Igb2YgdGhlCi1zeXN0ZW0uPC9wPgotPC9saT4KLTwvdWw+Ci08cD5XZSBob3BlIHlvdSBlbmpveSB1c2luZyBBeGlzMi4gUGxlYXNlIG5vdGUgdGhhdCB0aGlzIGlzIGFuCi1vcGVuLXNvdXJjZSBlZmZvcnQuIElmIHlvdSBmZWVsIHRoZSBjb2RlIGNvdWxkIHVzZSBuZXcgZmVhdHVyZXMgb3IKLWZpeGVzLCBvciB0aGUgZG9jdW1lbnRhdGlvbiBjYW4gYmUgaW1wcm92ZWQsIHBsZWFzZSBnZXQgaW52b2x2ZWQKLWFuZCBsZW5kIHVzIGEgaGFuZCEgVGhlIEF4aXMgZGV2ZWxvcGVyIGNvbW11bml0eSB3ZWxjb21lcyB5b3VyCi1wYXJ0aWNpcGF0aW9uLjwvcD4KLTxwPkxldCB1cyBrbm93IHdoYXQgeW91IHRoaW5rISBTZW5kIHlvdXIgZmVlZGJhY2sgb24gQXhpczIgdG8KLSI8YSBocmVmPQotIm1haWx0bzpheGlzLXVzZXJAd3MuYXBhY2hlLm9yZyI+YXhpcy11c2VyQHdzLmFwYWNoZS5vcmc8L2E+Ii4gTWFrZQotc3VyZSB0byBwcmVmaXggdGhlIHN1YmplY3Qgb2YgdGhlIG1haWwgd2l0aCBbQXhpczJdLjwvcD4KLTxoMj5GZWF0dXJlcyBvZiBBeGlzMiBMYXRlc3QgVmVyc2lvbjwvaDI+Ci08cD5BcGFjaGUgQXhpczIgVmVyc2lvbiAxLjQgY29tZXMgd2l0aCBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudHMgYW5kCi1hIG51bWJlciBidWcgZml4ZXMgb3ZlciB0aGUgMS4zIHJlbGVhc2UuIENoZWNrIG91dCB0aGUgY29tcGxldGUgbGlzdCBvZgotZmVhdHVyZXMgYmVsb3cuPC9wPgotPGgzPlByb2dyYW1taW5nIE1vZGVsPC9oMz4KLTx1bD4KLTxsaT5JbXByb3ZlZCwgWE1MLWNlbnRyaWMgY2xpZW50IEFQSSBpbmNsdWRpbmcgZnVsbCBXU0RMIGFuZCBwb2xpY3kKLXN1cHBvcnQ8L2xpPgotPGxpPjxhIGhyZWY9IkBheGlzMl92ZXJzaW9uX2RpckAvamF4d3MtZ3VpZGUuaHRtbCI+U3VwcG9ydCBmb3IgSkFYV1Mtc3R5bGUgc2VydmljZXMgYW5kIGNsaWVudHM8L2E+PC9saT4KLTxsaT5TdXBwb3J0IGZvciBQT0pPIGFuZCBTcHJpbmcgc2VydmljZXMgYW5kIGNsaWVudHM8L2xpPgotPGxpPlN1cHBvcnQgZm9yIGFueSBtZXNzYWdlIGV4Y2hhbmdlIHBhdHRlcm48L2xpPgotPGxpPlN5bmNocm9ub3VzIGFuZCBhc3luY2hyb25vdXMgY2FsbHM8L2xpPgotPGxpPkFyY2hpdmVkIHNlcnZpY2UgZGVwbG95bWVudCBtb2RlbCBzdXBwb3J0aW5nIGZ1bGwgc2VydmljZQotZW5jYXBzdWxhdGlvbiB3aXRoIHZlcnNpb25pbmcgc3VwcG9ydDwvbGk+Ci08bGk+QXJjaGl2ZWQgbW9kdWxlIGRlcGxveW1lbnQgbW9kZWwgc3VwcG9ydGluZyBjb250cm9sbGVkCi1leHRlbnNpYmlsaXR5IHdpdGggdmVyc2lvbmluZyBzdXBwb3J0PC9saT4KLTxsaT48YSBocmVmPSIjSG90X0RlcGxveW1lbnQiPkhvdCBkZXBsb3ltZW50PC9hPjwvbGk+Ci08bGk+V1MtUG9saWN5IGRyaXZlbiBjb2RlIGdlbmVyYXRpb24gZXh0ZW5zaW9uczwvbGk+Ci08bGk+RmxleGlibGUgc2VydmljZSBsaWZlIGN5Y2xlIG1vZGVsPC9saT4KLTxsaT5BdXRvbWF0aWMgc3VwcG9ydCBmb3IgUE9YIChSRVNUKSBzdHlsZSBpbnZvY2F0aW9uIG9mCi1zZXJ2aWNlczwvbGk+Ci08bGk+U3VwcG9ydCBmb3IgcXVlcnlpbmcgYSBzZXJ2aWNlJ3MgV1NETCAodXNpbmcgP3dzZGwpLCBzY2hlbWEKLSh1c2luZyA/eHNkKSBhbmQgcG9saWNpZXMgKHVzaW5nID9wb2xpY3kpPC9saT4KLTxsaT5XU0RMIDIuMDwvbGk+Ci08bGk+Q3VzdG9tIERlcGxveWVyczwvbGk+Ci08bGk+QmluYXJ5IHNlcmlhbGl6YXRpb24gKEZhc3QgSW5mb3NldCk8L2xpPgotPGxpPkpTT04gc3VwcG9ydDwvbGk+Ci08bGk+RUpCIFByb3ZpZGVyIHN1cHBvcnQ8L2xpPgotPC91bD4KLTxoMz5TdXBwb3J0ZWQgU3BlY2lmaWNhdGlvbnM8L2gzPgotPHVsPgotPGxpPlNPQVAgMS4xIGFuZCAxLjI8L2xpPgotPGxpPk1lc3NhZ2UgVHJhbnNtaXNzaW9uIE9wdGltaXphdGlvbiBNZWNoYW5pc20gKE1UT00pLCBYTUwKLU9wdGltaXplZCBQYWNrYWdpbmcgKFhPUCkgYW5kIFNPQVAgd2l0aCBBdHRhY2htZW50czwvbGk+Ci08bGk+V1NETCAxLjEsIGluY2x1ZGluZyBib3RoIFNPQVAgYW5kIEhUVFAgYmluZGluZ3M8L2xpPgotPGxpPldTLUFkZHJlc3NpbmcgKHN1Ym1pc3Npb24gYW5kIGZpbmFsKTwvbGk+Ci08bGk+V1MtUG9saWN5PC9saT4KLTxsaT5TQUFKIDEuMTwvbGk+Ci08L3VsPgotPGgzPlRyYW5zcG9ydHM8L2gzPgotPHVsPgotPGxpPkhUVFA8L2xpPgotPGxpPlNNVFA8L2xpPgotPGxpPkpNUzwvbGk+Ci08bGk+VENQPC9saT4KLTwvdWw+Ci08aDM+U3VwcG9ydGVkIERhdGEgQmluZGluZ3M8L2gzPgotPHVsPgotPGxpPkF4aXMgRGF0YSBCaW5kaW5nIChBREIpPC9saT4KLTxsaT5YTUxCZWFuczwvbGk+Ci08bGk+SmliWDwvbGk+Ci08bGk+SmF4QlJJIChFeHBlcmltZW50YWwpPC9saT4KLTwvdWw+Ci08aDI+PGEgbmFtZT0iVG9vbHNfaW5jbHVkZWRfaW4gdGhpc19SZWxlYXNlIj5Ub29scyBJbmNsdWRlZCBpbiBUaGlzCi1SZWxlYXNlPC9hPjwvaDI+Ci08cD5bPGEgaHJlZj0iaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvdG9vbHMvaW5kZXguaHRtbCIgdGFyZ2V0PQotIl9ibGFuayI+RG93bmxvYWQgVG9vbCBQbHVnLWluczwvYT5dPC9wPgotPG9sIHR5cGU9IjEiPgotPGxpPkF4aXMyIFdlYiBBcHBsaWNhdGlvbiAoV2ViIEFwcCk8L2xpPgotPGxpPldTREwyV1MtIDxhIGhyZWY9InRvb2xzLzFfMi9lY2xpcHNlL3dzZGwyamF2YS1wbHVnaW4uaHRtbCIKLXRhcmdldD0iX2JsYW5rIj5lY2xpcHNlIHBsdWctaW48L2E+PGE+LzwvYT4gPGEgaHJlZj0KLSJ0b29scy8xXzIvQ29kZWdlblRvb2xSZWZlcmVuY2UuaHRtbCIgdGFyZ2V0PSJfYmxhbmsiPkNvbW1hbmQgbGluZQotdmVyc2lvbjwvYT48YT4vPC9hPjxhIGhyZWY9Ci0idG9vbHMvMV8yL2lkZWEvSWRlYV9wbHVnLWluX3VzZXJndWlkZS5odG1sI1dTREwySmF2YV9Db2RlX0dlbmVyYXRpb24iCi10YXJnZXQ9Il9ibGFuayI+SW50ZWxsaUogSURFQSBwbHVnLWluPC9hPjxhPi88L2E+PGEgaHJlZj0KLSJ0b29scy8xXzIvbWF2ZW4tcGx1Z2lucy9tYXZlbi13c2RsMmNvZGUtcGx1Z2luLmh0bWwiIHRhcmdldD0KLSJfYmxhbmsiPk1hdmVuMiBXU0RMMkNvZGUgUGx1Zy1pbjwvYT48L2xpPgotPGxpPlNlcnZpY2UgQXJjaGl2ZSBXaXphcmQtIDxhIGhyZWY9Ci0idG9vbHMvMV8yL2VjbGlwc2Uvc2VydmljZWFyY2hpdmVyLXBsdWdpbi5odG1sIiB0YXJnZXQ9Ci0iX2JsYW5rIj5lY2xpcHNlIHBsdWctaW48L2E+LyA8YSBocmVmPQotInRvb2xzLzFfMi9pZGVhL0lkZWFfcGx1Zy1pbl91c2VyZ3VpZGUuaHRtbCNDcmVhdGVfU2VydmljZV9BcmNoaXZlIgotdGFyZ2V0PSJfYmxhbmsiPkludGVsbGlKIElERUEgcGx1Zy1pbjwvYT4vIDxhIGhyZWY9Ci0idG9vbHMvMV8yL21hdmVuLXBsdWdpbnMvbWF2ZW4tYWFyLXBsdWdpbi5odG1sIiB0YXJnZXQ9Ci0iX2JsYW5rIj5NYXZlbjIgQUFSIFBsdWctaW48L2E+PC9saT4KLTxsaT5KYXZhMldTREwtIDxhIGhyZWY9Ci0idG9vbHMvMV8yL21hdmVuLXBsdWdpbnMvbWF2ZW4tamF2YTJ3c2RsLXBsdWdpbi5odG1sIiB0YXJnZXQ9Ci0iX2JsYW5rIj5NYXZlbjIgSmF2YTJXU0RMIFBsdWctaW48L2E+PC9saT4KLTwvb2w+Ci08aDI+RXh0ZW5zaW9uIE1vZHVsZXM8L2gyPgotPHVsPgotPGxpPkFwYWNoZSBSYW1wYXJ0OiBTdXBwb3J0aW5nIFdTLVNlY3VyaXR5IChhbmQgc29vbgotV1MtUG9saWN5KTwvbGk+Ci08bGk+QXBhY2hlIFNhbmRlc2hhMjogU3VwcG9ydGluZyBXUy1SZWxpYWJsZSBNZXNzYWdpbmc8L2xpPgotPC91bD4KLShBcGFjaGUgQXhpczIgY29tZXMgYnVpbHQgaW4gd2l0aCBhIG1vZHVsZSB0aGF0IHN1cHBvcnRzCi1XUy1BZGRyZXNzaW5nLikKLTxoMj5Lbm93biBJc3N1ZXMgYW5kIExpbWl0YXRpb25zPC9oMj4KLTxoMj5BcmNoaXZlZCBOZXdzPC9oMj4KLTxwPkZvciBpbmZvcm1hdGlvbiBvbiBwcmV2aW91cyBBeGlzMiByZWxlYXNlcyBydW5uaW5nIHVwIHRvIHRoZQotY3VycmVudCByZWxlYXNlIHNlZSB0aGUgPGEgaHJlZj0iYXJjaGl2ZWRfbmV3cy5odG1sIiB0YXJnZXQ9Ci0iX2JsYW5rIj4nQXhpczIgQXJjaGl2ZWQgTmV3cyc8L2E+IHBhZ2UuPC9wPgotRm9yIG90aGVyIG5ld3MgaXRlbXMgZnJvbSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBzZWU6Ci08dWw+Ci08bGk+PGEgaHJlZj0KLSJodHRwOi8vd3d3LmFwYWNoZW5ld3Mub3JnL2FyY2hpdmVzL2NhdF9hcGFjaGVfd2Vic2VydmljZXNfaW5kZXguaHRtbCI+Ci1XZWIgc2VydmljZXMgcmVsYXRlZCBuZXdzIG9uIHRoZSBBcGFjaGUgTmV3cyBCbG9nIE9ubGluZTwvYT48L2xpPgotPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlbmV3cy5vcmcvIj5UaGUgQXBhY2hlIE5ld3MgQmxvZwotT25saW5lPC9hPjwvbGk+Ci08L3VsPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9tYXZlbi1oZWxwLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvbWF2ZW4taGVscC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkZGI0OTQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9tYXZlbi1oZWxwLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIwNSArMCwwIEBACi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIg0KLSAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPg0KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4NCi0gICAgPGhlYWQ+DQotICAgICAgICA8bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9DQotICAgICAgICAgICAgICAgICJIVE1MIFRpZHkgZm9yIFdpbmRvd3MgKHZlcnMgMTQgSnVuZSAyMDA3KSwgc2VlIHd3dy53My5vcmciLz4NCi0gICAgICAgIDx0aXRsZT5RdWljayBHdWlkZSB0byBNYXZlbiBmb3IgQXhpcyAyLjA8L3RpdGxlPg0KLSAgICAgICAgPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PQ0KLSAgICAgICAgICAgICAgICAidGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIi8+DQotICAgICAgICA8bGluayBocmVmPSJjc3MvYXhpcy1kb2NzLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyINCi0gICAgICAgICAgICAgIG1lZGlhPSJhbGwiLz4NCi0gICAgPC9oZWFkPg0KLSAgICA8Ym9keSBsYW5nPSJlbiIgeG1sOmxhbmc9ImVuIj4NCi0gICAgICAgIDxoMSBhbGlnbj0iY2VudGVyIj5RdWljayBHdWlkZSB0byBNYXZlbiBmb3IgQXhpcyAyLjA8L2gxPg0KLSAgICAgICAgPGgyIGFsaWduPSJsZWZ0Ij5JbnRyb2R1Y3Rpb248L2gyPg0KLSAgICAgICAgPHAgYWxpZ249ImxlZnQiPg0KLSAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnIj5NYXZlbiAyPC9hPg0KLSAgICAgICAgICAgIGlzIHVzZWQNCi0gICAgICAgICAgICBhcyB0aGUgYnVpbGQgZW52aXJvbm1lbnQgZm9yIEF4aXMyLiBUaGlzIGRvY3VtZW50IHdpbGwgcHJvdmlkZSBhIHF1aWNrDQotICAgICAgICAgICAgZ3VpZGUgb24gaG93IHRvIHVzZSBNYXZlbiB3aXRoIG91ciBwcm9qZWN0Lg0KLSAgICAgICAgPC9wPg0KLSAgICAgICAgPGgyIGFsaWduPSJsZWZ0Ij5Db21tYW5kczwvaDI+DQotICAgICAgICA8dGFibGUgYm9yZGVyPSIxIiBhbGlnbj0iY2VudGVyIj4NCi0gICAgICAgICAgICA8dGJvZHk+DQotICAgICAgICAgICAgICAgIDx0cj4NCi0gICAgICAgICAgICAgICAgICAgIDx0aCBzY29wZT0iY29sIj4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGFsaWduPSJsZWZ0Ij5Db21tYW5kPC9kaXY+DQotICAgICAgICAgICAgICAgICAgICA8L3RoPg0KLSAgICAgICAgICAgICAgICAgICAgPHRoIHNjb3BlPSJjb2wiPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgYWxpZ249ImxlZnQiPkRlc2NyaXB0aW9uPC9kaXY+DQotICAgICAgICAgICAgICAgICAgICA8L3RoPg0KLSAgICAgICAgICAgICAgICA8L3RyPg0KLSAgICAgICAgICAgICAgICA8dHI+DQotICAgICAgICAgICAgICAgICAgICA8dGQ+bXZuIGNsZWFuPC90ZD4NCi0gICAgICAgICAgICAgICAgICAgIDx0ZD5DbGVhbnMgYWxsIHRoZSBjb250ZW50IGJ1aWx0IHNvIGZhciBpbiB0aGUgdGFyZ2V0LyBmb2xkZXIuIFRoaXMNCi0gICAgICAgICAgICAgICAgICAgICAgICB3aWxsIG5vdCBkZWxldGUgamFycyBmcm9tIHlvdXIgbG9jYWwgcmVwb3NpdG9yeS4NCi0gICAgICAgICAgICAgICAgICAgIDwvdGQ+DQotICAgICAgICAgICAgICAgIDwvdHI+DQotICAgICAgICAgICAgICAgIDx0cj4NCi0gICAgICAgICAgICAgICAgICAgIDx0ZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGFsaWduPSJsZWZ0Ij5tdm4gaW5zdGFsbDwvZGl2Pg0KLSAgICAgICAgICAgICAgICAgICAgPC90ZD4NCi0gICAgICAgICAgICAgICAgICAgIDx0ZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGFsaWduPSJsZWZ0Ij5SdW4gYSBmdWxsIGJ1aWxkLjwvZGl2Pg0KLSAgICAgICAgICAgICAgICAgICAgPC90ZD4NCi0gICAgICAgICAgICAgICAgPC90cj4NCi0gICAgICAgICAgICAgICAgPHRyPg0KLSAgICAgICAgICAgICAgICAgICAgPHRkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgYWxpZ249ImxlZnQiPm12biB0ZXN0PC9kaXY+DQotICAgICAgICAgICAgICAgICAgICA8L3RkPg0KLSAgICAgICAgICAgICAgICAgICAgPHRkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgYWxpZ249ImxlZnQiPlJ1bnMgb3VyIGJhc2ljIHRlc3Qgc3VpdGUuPC9kaXY+DQotICAgICAgICAgICAgICAgICAgICA8L3RkPg0KLSAgICAgICAgICAgICAgICA8L3RyPg0KLSAgICAgICAgICAgICAgICA8dHI+DQotICAgICAgICAgICAgICAgICAgICA8dGQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBhbGlnbj0ibGVmdCI+bXZuIGNsZWFuIHRlc3Q8L2Rpdj4NCi0gICAgICAgICAgICAgICAgICAgIDwvdGQ+DQotICAgICAgICAgICAgICAgICAgICA8dGQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBhbGlnbj0ibGVmdCI+Q2xlYW5zIHVwLCByZWJ1aWxkcyBldmVyeXRoaW5nIGZyb20gc2NyYXRjaCwgYW5kIHRoZW4gcnVucyB0aGUgYmFzaWMgdGVzdA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWl0ZS4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCi0gICAgICAgICAgICAgICAgICAgIDwvdGQ+DQotICAgICAgICAgICAgICAgIDwvdHI+DQotICAgICAgICAgICAgICAgIDx0cj4NCi0gICAgICAgICAgICAgICAgICAgIDx0ZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGFsaWduPSJsZWZ0Ij5tdm4gLUR0ZXN0PU15VGVzdCBpbnN0YWxsPC9kaXY+DQotICAgICAgICAgICAgICAgICAgICA8L3RkPg0KLSAgICAgICAgICAgICAgICAgICAgPHRkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgYWxpZ249ImxlZnQiPnJ1biBhIHNpbmdsZSB0ZXN0IChjZCB0byB0aGUgc3BlY2lmaWMgbW9kdWxlIHNheSBrZXJuZWwgYmVmb3JlIHJ1bm5pbmcgdGhpcw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgZG9uJ3QgdXNlIHRoZSBwYWNrYWdlIG5hbWUgb2YgdGhlIGNsYXNzLCBqdXN0IHRoZSBjbGFzcyBuYW1lKS4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCi0gICAgICAgICAgICAgICAgICAgIDwvdGQ+DQotICAgICAgICAgICAgICAgIDwvdHI+DQotICAgICAgICAgICAgICAgIDx0cj4NCi0gICAgICAgICAgICAgICAgICAgIDx0ZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGFsaWduPSJsZWZ0Ij5tdm4gZGVwZW5kZW5jeTpyZXNvbHZlPC9kaXY+DQotICAgICAgICAgICAgICAgICAgICA8L3RkPg0KLSAgICAgICAgICAgICAgICAgICAgPHRkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgYWxpZ249ImxlZnQiPnByaW50IGRlcGVuZGVuY2llcyB1bmRlciBhbnkgbW9kdWxlPC9kaXY+DQotICAgICAgICAgICAgICAgICAgICA8L3RkPg0KLSAgICAgICAgICAgICAgICA8L3RyPg0KLSAgICAgICAgICAgICAgICA8dHI+DQotICAgICAgICAgICAgICAgICAgICA8dGQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBhbGlnbj0ibGVmdCI+bXZuIHNpdGU8L2Rpdj4NCi0gICAgICAgICAgICAgICAgICAgIDwvdGQ+DQotICAgICAgICAgICAgICAgICAgICA8dGQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBhbGlnbj0ibGVmdCI+R2VuZXJhdGVzIHRoZSB3ZWJzaXRlIGluIHRhcmdldC9zaXRlLzwvZGl2Pg0KLSAgICAgICAgICAgICAgICAgICAgPC90ZD4NCi0gICAgICAgICAgICAgICAgPC90cj4NCi0gICAgICAgICAgICAgICAgPHRyPg0KLSAgICAgICAgICAgICAgICAgICAgPHRkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgYWxpZ249ImxlZnQiPm12biBpZGVhOmlkZWE8L2Rpdj4NCi0gICAgICAgICAgICAgICAgICAgIDwvdGQ+DQotICAgICAgICAgICAgICAgICAgICA8dGQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBhbGlnbj0ibGVmdCI+R2VuZXJhdGVzIElERUEgLmlwciwgLmltbCBhbmQgLml3cyBwcm9qZWN0DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVzLg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KLSAgICAgICAgICAgICAgICAgICAgPC90ZD4NCi0gICAgICAgICAgICAgICAgPC90cj4NCi0gICAgICAgICAgICAgICAgPHRyPg0KLSAgICAgICAgICAgICAgICAgICAgPHRkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgYWxpZ249ImxlZnQiPm12biAtRHRlc3Q9ZmFsc2U8L2Rpdj4NCi0gICAgICAgICAgICAgICAgICAgIDwvdGQ+DQotICAgICAgICAgICAgICAgICAgICA8dGQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBhbGlnbj0ibGVmdCI+PC9kaXY+DQotICAgICAgICAgICAgICAgICAgICAgICAgQnVpbGRzIEF4aXMyIGFuZCBza2lwcyBhbGwgdGhlIHRlc3RzLg0KLSAgICAgICAgICAgICAgICAgICAgPC90ZD4NCi0gICAgICAgICAgICAgICAgPC90cj4NCi0gICAgICAgICAgICAgICAgPHRyPg0KLSAgICAgICAgICAgICAgICAgICAgPHRkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgYWxpZ249ImxlZnQiPm12biAtVSAtRHJlbGVhc2UgY2xlYW4gaW5zdGFsbDwvZGl2Pg0KLSAgICAgICAgICAgICAgICAgICAgPC90ZD4NCi0gICAgICAgICAgICAgICAgICAgIDx0ZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGFsaWduPSJsZWZ0Ij48L2Rpdj4NCi0gICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmF0ZSByZWxlYXNlIGFydGlmYWN0cy4NCi0gICAgICAgICAgICAgICAgICAgIDwvdGQ+DQotICAgICAgICAgICAgICAgIDwvdHI+DQotICAgICAgICAgICAgPC90Ym9keT4NCi0gICAgICAgIDwvdGFibGU+DQotICAgICAgICA8aDQ+Tm90ZXM6PC9oND4NCi0gICAgICAgIDx1bD4NCi0gICAgICAgICAgICA8bGk+VGhlICItVSIgZW5zdXJlcyB0aGF0IHlvdSBmZXRjaCB0aGUgbGF0ZXN0IHNuYXBzaG90czwvbGk+DQotICAgICAgICAgICAgPGxpPlRoZSAiLURyZWxlYXNlIiBydW5zIHRoZSBwb20ueG1sIHVuZGVyIG1vZHVsZXMvZGlzdHJpYnV0aW9uLiBUaGUgemlwJ3MgYXJlIGNyZWF0ZWQgdW5kZXINCi0gICAgICAgICAgICAgICAgbW9kdWxlcy9kaXN0cmlidXRpb24vdGFyZ2V0DQotICAgICAgICAgICAgPC9saT4NCi0gICAgICAgICAgICA8bGk+VG8gc2tpcCB0ZXN0cyB1c2UgIi1EdGVzdD1mYWxzZSI8L2xpPg0KLSAgICAgICAgICAgIDxsaT5JZiB5b3UgcnVuIGludG8gYW4gZXhjZXB0aW9uLCBzd2l0Y2ggb24gcHJpbnRpbmcgb2YgZnVsbCBleGNlcHRpb24gdXNpbmcgIi1lIjwvbGk+DQotICAgICAgICAgICAgPGxpPklmIHlvdSB3YW50IHRvIHNlZSB0aGUgdmVyc2Jvc2Ugb3V0cHV0LCB1c2UgIi1YIjwvbGk+DQotICAgICAgICA8L3VsPg0KLSAgICAgICAgPGgzPkFudCBoZWxwZXIgZm9yIHRoZSBtMiBidWlsZDwvaDM+DQotICAgICAgICA8cD5JZiB5b3UgcHJlZmVyIHRvIHVzZSBBbnQsIHdlIGhhdmUgYSBidWlsZC54bWwuIFBsZWFzZSBub3RlIHRoYXQgdGhlcmUgYXJlIDIgbWF2ZW4yIHBsdWdpbnMgdGhhdCBuZWVkIHRvIGJlDQotICAgICAgICAgICAgYnVpbHQgZmlyc3Qgd2hlbiB5b3UgdXBkYXRlIHZlcnNpb24gIyBmb3IgQXhpczIuIHRoZSBhbnQgYnVpbGQueG1sIHRha2VzIGNhcmUgb2YgdGhhdCBhdXRvbWF0aWNhbGx5LiBJdA0KLSAgICAgICAgICAgIGJ1aWxkcw0KLSAgICAgICAgICAgIGF4aXMyLWFhci1tYXZlbi1wbHVnaW4gYW5kIGF4aXMyLW1hci1tYXZlbi1wbHVnaW4gYmVmb3JlIGl0IHJ1bnMgdGhlIG1haW4gYnVpbGQuDQotICAgICAgICA8L3A+DQotICAgICAgICA8dGFibGUgYm9yZGVyPSIxIiBhbGlnbj0iY2VudGVyIj4NCi0gICAgICAgICAgICA8dGJvZHk+DQotICAgICAgICAgICAgICAgIDx0cj4NCi0gICAgICAgICAgICAgICAgICAgIDx0aCBzY29wZT0iY29sIj4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGFsaWduPSJsZWZ0Ij5Db21tYW5kPC9kaXY+DQotICAgICAgICAgICAgICAgICAgICA8L3RoPg0KLSAgICAgICAgICAgICAgICAgICAgPHRoIHNjb3BlPSJjb2wiPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgYWxpZ249ImxlZnQiPkRlc2NyaXB0aW9uPC9kaXY+DQotICAgICAgICAgICAgICAgICAgICA8L3RoPg0KLSAgICAgICAgICAgICAgICA8L3RyPg0KLSAgICAgICAgICAgICAgICA8dHI+DQotICAgICAgICAgICAgICAgICAgICA8dGQ+YW50IGNsZWFuIjwvdGQ+DQotICAgICAgICAgICAgICAgICAgICA8dGQ+Y2xlYW5zIHVwPC90ZD4NCi0gICAgICAgICAgICAgICAgPC90cj4NCi0gICAgICAgICAgICAgICAgPHRyPg0KLSAgICAgICAgICAgICAgICAgICAgPHRkPmFudCBpbnN0YWxsIjwvdGQ+DQotICAgICAgICAgICAgICAgICAgICA8dGQ+cnVucyB0aGUgYnVpbGQ8L3RkPg0KLSAgICAgICAgICAgICAgICA8L3RyPg0KLSAgICAgICAgICAgICAgICA8dHI+DQotICAgICAgICAgICAgICAgICAgICA8dGQ+YW50IGRlcGxveSI8L3RkPg0KLSAgICAgICAgICAgICAgICAgICAgPHRkPmRlcGxveXMgYXJ0aWZhY3RzIGluIGFwYWNoZSBtMiBzbmFwc2hvdHMgcmVwbzwvdGQ+DQotICAgICAgICAgICAgICAgIDwvdHI+DQotICAgICAgICAgICAgICAgIDx0cj4NCi0gICAgICAgICAgICAgICAgICAgIDx0ZD5hbnQgLURvZmZsaW5lPXRydWUgY2xlYW4iPC90ZD4NCi0gICAgICAgICAgICAgICAgICAgIDx0ZD5vZmZsaW5lIGNsZWFuIHVwPC90ZD4NCi0gICAgICAgICAgICAgICAgPC90cj4NCi0gICAgICAgICAgICAgICAgPHRyPg0KLSAgICAgICAgICAgICAgICAgICAgPHRkPmFudCAtRG9mZmxpbmU9dHJ1ZSBpbnN0YWxsIjwvdGQ+DQotICAgICAgICAgICAgICAgICAgICA8dGQ+b2ZmbGluZSBidWlsZDwvdGQ+DQotICAgICAgICAgICAgICAgIDwvdHI+DQotICAgICAgICAgICAgICAgIDx0cj4NCi0gICAgICAgICAgICAgICAgICAgIDx0ZD5hbnQgLURza2lwPXRydWUgaW5zdGFsbCI8L3RkPg0KLSAgICAgICAgICAgICAgICAgICAgPHRkPnJ1biB0aGUgYnVpbGQsIGJ1dCBza2lwIHRoZSB0ZXN0czwvdGQ+DQotICAgICAgICAgICAgICAgIDwvdHI+DQotICAgICAgICAgICAgICAgIDx0cj4NCi0gICAgICAgICAgICAgICAgICAgIDx0ZD5hbnQgLURza2lwPXRydWUgaW5zdGFsbCI8L3RkPg0KLSAgICAgICAgICAgICAgICAgICAgPHRkPnJ1biB0aGUgYnVpbGQsIGJ1dCBza2lwIHRoZSB0ZXN0czwvdGQ+DQotICAgICAgICAgICAgICAgIDwvdHI+DQotICAgICAgICAgICAgICAgIDx0cj4NCi0gICAgICAgICAgICAgICAgICAgIDx0ZD5hbnQgLURza2lwPXRydWUgZGVwbG95IjwvdGQ+DQotICAgICAgICAgICAgICAgICAgICA8dGQ+ZGVwbG95cyBhcnRpZmFjdHMsIGJ1dCBza2lwIHRoZSB0ZXN0czwvdGQ+DQotICAgICAgICAgICAgICAgIDwvdHI+DQotICAgICAgICAgICAgICAgIDx0cj4NCi0gICAgICAgICAgICAgICAgICAgIDx0ZD5hbnQgLURvZmZsaW5lPXRydWUgLURza2lwPXRydWUgaW5zdGFsbCI8L3RkPg0KLSAgICAgICAgICAgICAgICAgICAgPHRkPnJ1biB0aGUgYnVpbGQgaW4gdGhlIG9mZmxpbmUgYW5kIHNraXBzIHRoZSB0ZXN0czwvdGQ+DQotICAgICAgICAgICAgICAgIDwvdHI+DQotICAgICAgICAgICAgPC90Ym9keT4NCi0gICAgICAgIDwvdGFibGU+DQotICAgIDwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9tb2R1bGVzL2FkZHJlc3NpbmcvaW5kZXgueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9tb2R1bGVzL2FkZHJlc3NpbmcvaW5kZXgueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmQxZmQ5Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvbW9kdWxlcy9hZGRyZXNzaW5nL2luZGV4LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iDQotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4NCi08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+DQotPGhlYWQ+DQotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PQ0KLSJIVE1MIFRpZHkgZm9yIFdpbmRvd3MgKHZlcnMgMTQgSnVuZSAyMDA3KSwgc2VlIHd3dy53My5vcmciIC8+DQotPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSIiIC8+DQotPHRpdGxlPjo6IEF4aXMyIC0gV1MtQWRkcmVzc2luZyBJbXBsZW1lbnRhdGlvbiA6OjwvdGl0bGU+DQotPGxpbmsgaHJlZj0iLi4vLi4vY3NzL2F4aXMtZG9jcy5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0NCi0idGV4dC9jc3MiIG1lZGlhPSJhbGwiIC8+DQotPC9oZWFkPg0KLTxib2R5Pg0KLTxoMT5BeGlzMiAtIFdTLUFkZHJlc3NpbmcgSW1wbGVtZW50YXRpb248L2gxPg0KLTxwPlRoaXMgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgV1MtQWRkcmVzc2luZyBzdWJtaXNzaW9uIHZlcnNpb24NCi0oMjAwNC0wOCkgYW5kIFdTLUFkZHJlc3NpbmcgMjAwNS0wOCB2ZXJzaW9ucy4gQ29tcGxldGUNCi1XUy1BZGRyZXNzaW5nIEZpbmFsIHZlcnNpb24gd2lsbCBiZSBhdmFpbGFibGUsIG9uY2UgdGhlDQotc3BlY2lmaWNhdGlvbiBpdHNlbGYgZ2V0cyBmaW5hbGl6ZWQuPC9wPg0KLTxwPkF4aXMyIGVuZ2luZSBjb250YWlucyBhZGRyZXNzaW5nIHN1cHBvcnQgYnkgZGVmYXVsdC4gU28geW91IG1heQ0KLW5lZWQgbm90IHB1dCB0aGlzIG1vZHVsZSwgdW5sZXNzIHlvdSBzcGVjaWZpY2FsbHkgd2FudCB0byB1c2UgYQ0KLXBhcnRpY3VsYXIgcmVsZWFzZSBvZiB0aGlzIG1vZHVsZS48L3A+DQotPHA+PC9wPg0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9tb2R1bGVzL2Rvd25sb2FkLmNnaSBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvbW9kdWxlcy9kb3dubG9hZC5jZ2kKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhOWY4ZDMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9tb2R1bGVzL2Rvd25sb2FkLmNnaQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMhL2Jpbi9zaAotCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMgCi0jIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIyAKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLQotIyBXcmFwcGVyIHNjcmlwdCBhcm91bmQgbWlycm9ycy5jZ2kgc2NyaXB0Ci0jICh3ZSBtdXN0IGNoYW5nZSB0byB0aGF0IGRpcmVjdG9yeSBpbiBvcmRlciBmb3IgcHl0aG9uIHRvIHBpY2sgdXAgdGhlCi0jICBweXRob24gaW5jbHVkZXMgY29ycmVjdGx5KQotY2QgL3d3dy93d3cuYXBhY2hlLm9yZy9keW4vbWlycm9ycwotL3d3dy93d3cuYXBhY2hlLm9yZy9keW4vbWlycm9ycy9taXJyb3JzLmNnaSAkKgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvbW9kdWxlcy9pbmRleC54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL21vZHVsZXMvaW5kZXgueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOGM4MjFlLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvbW9kdWxlcy9pbmRleC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiINCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPg0KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4NCi08aGVhZD4NCi08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9DQotIkhUTUwgVGlkeSBmb3IgV2luZG93cyAodmVycyAxNCBKdW5lIDIwMDcpLCBzZWUgd3d3LnczLm9yZyIgLz4NCi08bWV0YSBodHRwLWVxdWl2PSJjb250ZW50LXR5cGUiIGNvbnRlbnQ9IiIgLz4NCi08dGl0bGU+OjogQXhpczIgTW9kdWxlcyA6OjwvdGl0bGU+DQotPGxpbmsgaHJlZj0iLi4vY3NzL2F4aXMtZG9jcy5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiDQotbWVkaWE9ImFsbCIgLz4NCi08L2hlYWQ+DQotPGJvZHkgbGFuZz0iZW4iIHhtbDpsYW5nPSJlbiI+DQotPGgxPkFwYWNoZSBBeGlzMiBNb2R1bGVzPC9oMT4NCi08cD5BeGlzMiBhcmNoaXRlY3R1cmUgaXMgZmxleGlibGUgZW5vdWdoIHRvIGV4dGVuZCBpdHMNCi1mdW5jdGlvbmFsaXRpZXMgdXNpbmcgbW9kdWxlcy4gVGhpcyBwYWdlIGlzIG1haW50YWluZWQgdG8ga2VlcA0KLXRyYWNrIG9mIHRoZSByZWxldmFudCBtb2R1bGVzIHRoYXQgYXJlIGRldmVsb3BlZCBvbiB0b3Agb2YNCi1BeGlzMi48L3A+DQotPHRhYmxlIHdpZHRoPSI2NzUiIGJvcmRlcj0iMSIgYWxpZ249ImNlbnRlciIgY2VsbHBhZGRpbmc9IjEiPg0KLTx0Ym9keT4NCi08dHI+DQotPHRoIHdpZHRoPSI2OCIgc2NvcGU9ImNvbCI+TmFtZTwvdGg+DQotPHRoIHdpZHRoPSIxNDciIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4NCi08dGggd2lkdGg9IjUyIiBzY29wZT0iY29sIj5WZXJzaW9uPC90aD4NCi08dGggd2lkdGg9IjgwIiBzY29wZT0iY29sIj5Db21wYXRpYmxlIEF4aXMyIHZlcnNpb248L3RoPg0KLTx0aCB3aWR0aD0iOTciIHNjb3BlPSJjb2wiPkRvd25sb2FkczwvdGg+DQotPHRoIHdpZHRoPSIxOTEiIHNjb3BlPSJjb2wiPkNvbW1lbnRzPC90aD4NCi08L3RyPg0KLTx0cj4NCi08dGQ+PGEgaHJlZj0iYWRkcmVzc2luZy9pbmRleC5odG1sIj5BZGRyZXNzaW5nPC9hPjwvdGQ+DQotPHRkPlRoaXMgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgV1MtQWRkcmVzc2luZyBzdWJtaXNzaW9uIHZlcnNpb24NCi0oMjAwNC0wOCkgYW5kIFdTLUFkZHJlc3NpbmcgMjAwNS0wOCB2ZXJzaW9ucy48L3RkPg0KLTx0ZD4xLjQ8L3RkPg0KLTx0ZD4xLjQ8L3RkPg0KLTx0ZD48YSBocmVmPQ0KLSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZHluL21pcnJvcnMvbWlycm9ycy5jZ2kvd3MvYXhpczIvbW9kdWxlcy9hZGRyZXNzaW5nLzFfNC9hZGRyZXNzaW5nLTEuNC5tYXIiDQotdGl0bGU9DQotImh0dHA6Ly93d3cuYXBhY2hlLm9yZy9keW4vbWlycm9ycy9taXJyb3JzLmNnaS93cy9heGlzMi9tb2R1bGVzL2FkZHJlc3NpbmcvMV80L2FkZHJlc3NpbmctMS40Lm1hciI+DQotbWFyPC9hPiA8YSBocmVmPQ0KLSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZHluL21pcnJvcnMvbWlycm9ycy5jZ2kvd3MvYXhpczIvbW9kdWxlcy9hZGRyZXNzaW5nLzFfNC9hZGRyZXNzaW5nLTEuNC5tYXIubWQ1Ig0KLXRpdGxlPQ0KLSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZHluL21pcnJvcnMvbWlycm9ycy5jZ2kvd3MvYXhpczIvbW9kdWxlcy9hZGRyZXNzaW5nLzFfNC9hZGRyZXNzaW5nLTEuNC5tYXIubWQ1Ij4NCi1NRDU8L2E+IDxhIGhyZWY9DQotImh0dHA6Ly93d3cuYXBhY2hlLm9yZy9keW4vbWlycm9ycy9taXJyb3JzLmNnaS93cy9heGlzMi9tb2R1bGVzL2FkZHJlc3NpbmcvMV80L2FkZHJlc3NpbmctMS40Lm1hci5hc2MiDQotdGl0bGU9DQotImh0dHA6Ly93d3cuYXBhY2hlLm9yZy9keW4vbWlycm9ycy9taXJyb3JzLmNnaS93cy9heGlzMi9tb2R1bGVzL2FkZHJlc3NpbmcvMV80L2FkZHJlc3NpbmctMS40Lm1hci5hc2MiPg0KLVBHUDwvYT48L3RkPg0KLTx0ZD48L3RkPg0KLTwvdHI+DQotPHRyPg0KLTx0ZD48YSBocmVmPSIuLi8xXzMvc29hcG1vbml0b3ItbW9kdWxlLmh0bWwiPlNPQVAgTW9uaXRvcjwvYT48L3RkPg0KLTx0ZD5TT0FQIE1vbml0b3IgdXRpbGl0eSBwcm92aWRlcyBhIHdheSBmb3IgV2ViIHNlcnZpY2VzIGRldmVsb3BlcnMNCi10byBtb25pdG9yIHRoZSBTT0FQIG1lc3NhZ2VzIGJlaW5nIHNlbnQvcmVjZWl2ZWQgd2l0aG91dCByZXF1aXJpbmcNCi1hbnkgc3BlY2lhbCBjb25maWd1cmF0aW9uIG9yIHJlc3RhcnRpbmcgb2YgdGhlIHNlcnZlcjwvdGQ+DQotPHRkPjEuNDwvdGQ+DQotPHRkPjEuNDwvdGQ+DQotPHRkPjxhIGhyZWY9DQotImh0dHA6Ly93d3cuYXBhY2hlLm9yZy9keW4vbWlycm9ycy9taXJyb3JzLmNnaS93cy9heGlzMi9tb2R1bGVzL3NvYXBtb25pdG9yLzFfNC9zb2FwbW9uaXRvci0xLjQubWFyIg0KLXRpdGxlPQ0KLSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZHluL21pcnJvcnMvbWlycm9ycy5jZ2kvd3MvYXhpczIvbW9kdWxlcy9zb2FwbW9uaXRvci8xXzQvc29hcG1vbml0b3ItMS40Lm1hciI+DQotemlwPC9hPiA8YSBocmVmPQ0KLSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZHluL21pcnJvcnMvbWlycm9ycy5jZ2kvd3MvYXhpczIvbW9kdWxlcy9zb2FwbW9uaXRvci8xXzQvc29hcG1vbml0b3ItMS40Lm1hci5tZDUiDQotdGl0bGU9DQotImh0dHA6Ly93d3cuYXBhY2hlLm9yZy9keW4vbWlycm9ycy9taXJyb3JzLmNnaS93cy9heGlzMi9tb2R1bGVzL3NvYXBtb25pdG9yLzFfNC9zb2FwbW9uaXRvci0xLjQubWFyLm1kNSI+DQotTUQ1PC9hPiA8YSBocmVmPQ0KLSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZHluL21pcnJvcnMvbWlycm9ycy5jZ2kvd3MvYXhpczIvbW9kdWxlcy9zb2FwbW9uaXRvci8xXzQvc29hcG1vbml0b3ItMS40Lm1hci5hc2MiDQotdGl0bGU9DQotImh0dHA6Ly93d3cuYXBhY2hlLm9yZy9keW4vbWlycm9ycy9taXJyb3JzLmNnaS93cy9heGlzMi9tb2R1bGVzL3NvYXBtb25pdG9yLzFfNC9zb2FwbW9uaXRvci0xLjQubWFyLmFzYyI+DQotUEdQPC9hPjwvdGQ+DQotPHRkPjwvdGQ+DQotPC90cj4NCi08dHI+DQotPHRkPjxhIGhyZWY9DQotImh0dHA6Ly93cy5hcGFjaGUub3JnL3NhbmRlc2hhL3NhbmRlc2hhMi9pbmRleC5odG1sIj5TYW5kZXNoYTI8L2E+PC90ZD4NCi08dGQ+QW4gaW1wbGVtZW50YXRpb24gb2YgV1MtUk0gc3BlY2lmaWNhdGlvbiBGZWJydWFyeSAyMDA1PC90ZD4NCi08dGQ+MS4zPC90ZD4NCi08dGQ+MS4zPC90ZD4NCi08dGQ+PGEgaHJlZj0NCi0iaHR0cDovL2FwYWNoZS5ob3h0LmNvbS93cy9zYW5kZXNoYTIvMV8zL3NhbmRlc2hhMi0xLjMtYmluLnppcCINCi10aXRsZT0NCi0iaHR0cDovL2FwYWNoZS5ob3h0LmNvbS93cy9zYW5kZXNoYTIvMV8zL3NhbmRlc2hhMi0xLjMtYmluLnppcCI+emlwPC9hPg0KLTxhIGhyZWY9DQotImh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L3dzL3NhbmRlc2hhMi8xXzMvc2FuZGVzaGEyLTEuMy1iaW4uemlwLm1kNSINCi10aXRsZT0NCi0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3Qvd3Mvc2FuZGVzaGEyLzFfMy9zYW5kZXNoYTItMS4zLWJpbi56aXAubWQ1Ij4NCi1NRDU8L2E+IDxhIGhyZWY9DQotImh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L3dzL3NhbmRlc2hhMi8xXzMvc2FuZGVzaGEyLTEuMy1iaW4uemlwLmFzYyINCi10aXRsZT0NCi0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3Qvd3Mvc2FuZGVzaGEyLzFfMy9zYW5kZXNoYTItMS4zLWJpbi56aXAuYXNjIj4NCi1QR1A8L2E+PC90ZD4NCi08dGQ+Q2xpY2sgPGEgaHJlZj0NCi0iaHR0cDovL3Blb3BsZS5hcGFjaGUub3JnL3JlcG8vbTEtc25hcHNob3QtcmVwb3NpdG9yeS9vcmcuYXBhY2hlLnNhbmRlc2hhMi8iPg0KLWhlcmU8L2E+IHRvIGdldCB0aGUgU2FuZGVzaGEyIG5pZ2h0bHkgYnVpbGRzIGNvbXBhdGlibGUgd2l0aCB0aGUNCi1sYXRlc3QgQXhpczIgU05BUFNIT1QuPC90ZD4NCi08L3RyPg0KLTx0cj4NCi08dGQ+PGEgaHJlZj0icmFtcGFydC8xXzMvc2VjdXJpdHktbW9kdWxlLmh0bWwiPlJhbXBhcnQ8L2E+PC90ZD4NCi08dGQ+VGhlIFdTLVNlY3VyaXR5IGFuZCBXUy1TZWN1cmVDb252ZXJzYXRpb24gaW1wbGVtZW50YXRpb24gZm9yDQotYXhpczIuIE5vdyB3aXRoIGEgbmV3IGNvbmZpZ3VyYXRpb24gbW9kZWwgYmFzZWQgb24NCi1XUy1TZWN1cml0eVBvbGljeTwvdGQ+DQotPHRkPjEuMzwvdGQ+DQotPHRkPjEuMzwvdGQ+DQotPHRkPjxhIGhyZWY9DQotImh0dHA6Ly93d3cuYXBhY2hlLm9yZy9keW4vbWlycm9ycy9taXJyb3JzLmNnaS93cy9yYW1wYXJ0LzFfMy9yYW1wYXJ0LTEuMy56aXAiDQotdGl0bGU9DQotImh0dHA6Ly93d3cuYXBhY2hlLm9yZy9keW4vbWlycm9ycy9taXJyb3JzLmNnaS93cy9yYW1wYXJ0LzFfMy9yYW1wYXJ0LTEuMS56aXAiPg0KLURpc3RybyB6aXA8L2E+IDxhIGhyZWY9DQotImh0dHA6Ly93d3cuYXBhY2hlLm9yZy9keW4vbWlycm9ycy9taXJyb3JzLmNnaS93cy9yYW1wYXJ0LzFfMy9yYW1wYXJ0LTEuMy56aXAubWQ1Ig0KLXRpdGxlPQ0KLSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZHluL21pcnJvcnMvbWlycm9ycy5jZ2kvd3MvcmFtcGFydC8xXzMvcmFtcGFydC0xLjMuemlwLm1kNSI+DQotTUQ1PC9hPiA8YSBocmVmPQ0KLSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZHluL21pcnJvcnMvbWlycm9ycy5jZ2kvd3MvcmFtcGFydC8xXzMvcmFtcGFydC0xLjMuemlwLmFzYyINCi10aXRsZT0NCi0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2R5bi9taXJyb3JzL21pcnJvcnMuY2dpL3dzL3JhbXBhcnQvMV8zL3JhbXBhcnQtMS4zLnppcC5hc2MiPg0KLVBHUDwvYT48L3RkPg0KLTx0ZD5QbGVhc2UgZm9sbG93IHRoZSBpbnN0cnVjdGlvbnMgaW4gdGhlIFJFQURNRS50eHQgYXZhaWxhYmxlIGluDQotdGhlIHJhbXBhcnQtMS4zLnppcCBmaWxlIHRvIGNvcHkgdGhlIHJlcXVpcmVkIGxpYnJhcmllcyB0byB0aGUgbWFpbg0KLSJsaWIiIGRpciBvZiBBeGlzMi4NCi08cD48c3Ryb25nPk5vdGU8L3N0cm9uZz46IEluIEF4aXMyIHYxLjMgdG8gcnVuIFJhbXBhcnQgdjEuMw0KLXNhbXBsZXMsIGNoYW5nZSB0aGUgYWRkcmVzc2luZyBtYXIgdmFsdWUgdG8gYWRyZXNzaW5nLTEuMy5tYXIgYXMNCi1naXZlbiBiZWxvdzsgPGNvZGU+Jmx0O3Byb3BlcnR5IG5hbWU9ImFkZHJlc3NpbmcubWFyIg0KLXZhbHVlPSJhZGRyZXNzaW5nLTEuMy5tYXIiLyZndDs8L2NvZGU+IGluDQotLi5ccmFtcGFydC0xLjNcc2FtcGxlc1xiYXNpY1xidWlsZC54bWw8L3A+DQotPC90ZD4NCi08L3RyPg0KLTwvdGJvZHk+DQotPC90YWJsZT4NCi08YnIgLz4NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvbW9kdWxlcy9yYW1wYXJ0LzFfMy9zZWMtY29uZi9pbi1zYW1wbGUucG5nIGIvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9tb2R1bGVzL3JhbXBhcnQvMV8zL3NlYy1jb25mL2luLXNhbXBsZS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyODkzNDguLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9tb2R1bGVzL3JhbXBhcnQvMV8zL3NlYy1jb25mL2luLXNhbXBsZS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL21vZHVsZXMvcmFtcGFydC8xXzMvc2VjLWNvbmYvaW4uYWN0aW9uLnhzZCBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvbW9kdWxlcy9yYW1wYXJ0LzFfMy9zZWMtY29uZi9pbi5hY3Rpb24ueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2VkOThiLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvbW9kdWxlcy9yYW1wYXJ0LzFfMy9zZWMtY29uZi9pbi5hY3Rpb24ueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08eHM6c2NoZW1hIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCI+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iYWN0aW9uIj4KLQkJPHhzOmFubm90YXRpb24+Ci0JCQk8eHM6ZG9jdW1lbnRhdGlvbj5JbmZsb3cgc2VjdXJpdHkgJ2FjdGlvbicgY29uZmlndXJhdGlvbjwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJPC94czphbm5vdGF0aW9uPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iaXRlbXMiIHR5cGU9InhzOnN0cmluZyIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InBhc3N3b3JkQ2FsbGJhY2tDbGFzcyIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJzaWduYXR1cmVQcm9wRmlsZSIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJkZWNyeXB0aW9uUHJvcEZpbGUiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLTwveHM6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9tb2R1bGVzL3JhbXBhcnQvMV8zL3NlYy1jb25mL291dC1hY3Rpb24ueHNkIGIvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9tb2R1bGVzL3JhbXBhcnQvMV8zL3NlYy1jb25mL291dC1hY3Rpb24ueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2E0YTRlLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvbW9kdWxlcy9yYW1wYXJ0LzFfMy9zZWMtY29uZi9vdXQtYWN0aW9uLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHhzOnNjaGVtYSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiPgotCTx4czplbGVtZW50IG5hbWU9ImFjdGlvbiI+Ci0JCTx4czphbm5vdGF0aW9uPgotCQkJPHhzOmRvY3VtZW50YXRpb24+T3V0ZmxvdyBzZWN1cml0eSAnYWN0aW9uJyBjb25maWd1cmF0aW9uPC94czpkb2N1bWVudGF0aW9uPgotCQk8L3hzOmFubm90YXRpb24+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJpdGVtcyIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0idXNlciIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icGFzc3dvcmRDYWxsYmFja0NsYXNzIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InNpZ25hdHVyZVByb3BGaWxlIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImVuY3J5cHRpb25Qcm9wRmlsZSIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJlbmNyeXB0aW9uUHJvcEZpbGUiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0ic2lnbmF0dXJlS2V5SWRlbnRpZmllciIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJlbmNyeXB0aW9uS2V5SWRlbnRpZmllciIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJlbmNyeXB0aW9uVXNlciIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJzaWduYXR1cmVQYXJ0cyIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJlbmNyeXB0aW9uUGFydHMiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0ib3B0aW1pemVQYXJ0cyIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJlbmNyeXB0aW9uU3ltQWxnb3JpdGhtIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IkVtYmVkZGVkS2V5Q2FsbGJhY2tDbGFzcyIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJlbmNyeXB0aW9uS2V5VHJhbnNwb3J0QWxnb3JpdGhtIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9IkVtYmVkZGVkS2V5TmFtZSIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJ0aW1lVG9MaXZlIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci08L3hzOnNjaGVtYT4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvbW9kdWxlcy9yYW1wYXJ0LzFfMy9zZWMtY29uZi9vdXQtc2FtcGxlLnBuZyBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvbW9kdWxlcy9yYW1wYXJ0LzFfMy9zZWMtY29uZi9vdXQtc2FtcGxlLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFlMzhlNi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL21vZHVsZXMvcmFtcGFydC8xXzMvc2VjLWNvbmYvb3V0LXNhbXBsZS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL21vZHVsZXMvcmFtcGFydC8xXzMvc2VjLWNvbmYvb3V0LXNhbXBsZTIucG5nIGIvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9tb2R1bGVzL3JhbXBhcnQvMV8zL3NlYy1jb25mL291dC1zYW1wbGUyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2UwMWYyNS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL21vZHVsZXMvcmFtcGFydC8xXzMvc2VjLWNvbmYvb3V0LXNhbXBsZTIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9tb2R1bGVzL3JhbXBhcnQvMV8zL3NlYy1jb25mL3JhbXBhcnQtY29uZmlnLnhzZCBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvbW9kdWxlcy9yYW1wYXJ0LzFfMy9zZWMtY29uZi9yYW1wYXJ0LWNvbmZpZy54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0MTdhNWEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9tb2R1bGVzL3JhbXBhcnQvMV8zL3NlYy1jb25mL3JhbXBhcnQtY29uZmlnLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHhzOnNjaGVtYSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOnJhbXA9Imh0dHA6Ly93cy5hcGFjaGUub3JnL3JhbXBhcnQvcG9saWN5IiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93cy5hcGFjaGUub3JnL3JhbXBhcnQvcG9saWN5IiBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIj4KLQk8eHM6ZWxlbWVudCBuYW1lPSJSYW1wYXJ0Q29uZmlnIj4KLQkJPHhzOmFubm90YXRpb24+Ci0JCQk8eHM6ZG9jdW1lbnRhdGlvbj5SYW1wYXJ0IHNwZWNpZmljIGNvbmZpZ3VyYXRpb24gYXNzZXJ0aW9uPC94czpkb2N1bWVudGF0aW9uPgotCQk8L3hzOmFubm90YXRpb24+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJ1c2VyIiB0eXBlPSJ4czpzdHJpbmciLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJlbmNyeXB0aW9uVXNlciIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJwYXNzd29yZENhbGxiYWNrQ2xhc3MiIHR5cGU9InhzOnN0cmluZyIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImVuY3J5cHRpb25DeXB0byIgdHlwZT0icmFtcDpjcnlwdG8iIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InNpZ25hdHVyZUN5cHRvIiB0eXBlPSJyYW1wOmNyeXB0byIgbWluT2NjdXJzPSIwIi8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY3J5cHRvIj4KLQkJPHhzOmFubm90YXRpb24+Ci0JCQk8eHM6ZG9jdW1lbnRhdGlvbj5DcnlwdG8gY29uZmlndXJhdGlvbiBhc3NlcnRpb248L3hzOmRvY3VtZW50YXRpb24+Ci0JCTwveHM6YW5ub3RhdGlvbj4KLQkJPHhzOnNlcXVlbmNlIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCTx4czplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJ4czpzdHJpbmciLz4KLQkJPC94czpzZXF1ZW5jZT4KLQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJwcm92aWRlciIvPgotCTwveHM6Y29tcGxleFR5cGU+Ci08L3hzOnNjaGVtYT4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvbW9kdWxlcy9yYW1wYXJ0LzFfMy9zZWMtY29uZi9zYW1wbGUtcG9saWN5LnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvbW9kdWxlcy9yYW1wYXJ0LzFfMy9zZWMtY29uZi9zYW1wbGUtcG9saWN5LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE0ODJjNC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL21vZHVsZXMvcmFtcGFydC8xXzMvc2VjLWNvbmYvc2FtcGxlLXBvbGljeS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTx3c3A6UG9saWN5IHdzdTpJZD0iU2lnRW5jclRyaXBsZURlc1JTQTE1REsiIHhtbG5zOndzdT0iaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NzLzIwMDQvMDEvb2FzaXMtMjAwNDAxLXdzcy13c3NlY3VyaXR5LXV0aWxpdHktMS4wLnhzZCIgeG1sbnM6d3NwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA5L3BvbGljeSI+Ci08d3NwOkV4YWN0bHlPbmU+Ci0JPHdzcDpBbGw+Ci0JCTxzcDpBc3ltbWV0cmljQmluZGluZyB4bWxuczpzcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNS8wNy9zZWN1cml0eXBvbGljeSI+Ci0JCQk8d3NwOlBvbGljeT4KLQkJCQk8c3A6SW5pdGlhdG9yVG9rZW4+Ci0JCQkJCTx3c3A6UG9saWN5PgotCQkJCQkJPHNwOlg1MDlUb2tlbiBzcDpJbmNsdWRlVG9rZW49Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDUvMDcvc2VjdXJpdHlwb2xpY3kvSW5jbHVkZVRva2VuL0Fsd2F5c1RvUmVjaXBpZW50Ij4KLQkJCQkJCQk8d3NwOlBvbGljeT4KLQkJCQkJCQkJPHNwOlJlcXVpcmVEZXJpdmVkS2V5cy8+Ci0JCQkJCQkJCTxzcDpXc3NYNTA5VjNUb2tlbjEwLz4KLQkJCQkJCQk8L3dzcDpQb2xpY3k+Ci0JCQkJCQk8L3NwOlg1MDlUb2tlbj4KLQkJCQkJPC93c3A6UG9saWN5PgotCQkJCTwvc3A6SW5pdGlhdG9yVG9rZW4+Ci0JCQkJPHNwOlJlY2lwaWVudFRva2VuPgotCQkJCQk8d3NwOlBvbGljeT4KLQkJCQkJCTxzcDpYNTA5VG9rZW4gc3A6SW5jbHVkZVRva2VuPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA3L3NlY3VyaXR5cG9saWN5L0luY2x1ZGVUb2tlbi9OZXZlciI+Ci0JCQkJCQkJPHdzcDpQb2xpY3k+Ci0JCQkJCQkJCTxzcDpSZXF1aXJlRGVyaXZlZEtleXMvPgotCQkJCQkJCQk8c3A6V3NzWDUwOVYzVG9rZW4xMC8+Ci0JCQkJCQkJPC93c3A6UG9saWN5PgotCQkJCQkJPC9zcDpYNTA5VG9rZW4+Ci0JCQkJCTwvd3NwOlBvbGljeT4KLQkJCQk8L3NwOlJlY2lwaWVudFRva2VuPgotCQkJCTxzcDpBbGdvcml0aG1TdWl0ZT4KLQkJCQkJPHdzcDpQb2xpY3k+Ci0JCQkJCQk8c3A6VHJpcGxlRGVzUnNhMTUvPgotCQkJCQk8L3dzcDpQb2xpY3k+Ci0JCQkJPC9zcDpBbGdvcml0aG1TdWl0ZT4KLQkJCQk8c3A6TGF5b3V0PgotCQkJCQk8d3NwOlBvbGljeT4KLQkJCQkJCTxzcDpTdHJpY3QvPgotCQkJCQk8L3dzcDpQb2xpY3k+Ci0JCQkJPC9zcDpMYXlvdXQ+Ci0JCQkJPHNwOkluY2x1ZGVUaW1lc3RhbXAvPgotCQkJCTxzcDpPbmx5U2lnbkVudGlyZUhlYWRlcnNBbmRCb2R5Lz4KLQkJCTwvd3NwOlBvbGljeT4KLQkJPC9zcDpBc3ltbWV0cmljQmluZGluZz4KLQkJPHNwOldzczEwIHhtbG5zOnNwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA3L3NlY3VyaXR5cG9saWN5Ij4KLQkJCTx3c3A6UG9saWN5PgotCQkJCTxzcDpNdXN0U3VwcG9ydFJlZktleUlkZW50aWZpZXIvPgotCQkJCTxzcDpNdXN0U3VwcG9ydFJlZklzc3VlclNlcmlhbC8+Ci0JCQk8L3dzcDpQb2xpY3k+Ci0JCTwvc3A6V3NzMTA+Ci0JCTxzcDpTaWduZWRQYXJ0cyB4bWxuczpzcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNS8wNy9zZWN1cml0eXBvbGljeSI+Ci0JCQk8c3A6Qm9keS8+Ci0JCTwvc3A6U2lnbmVkUGFydHM+Ci0JCTxzcDpFbmNyeXB0ZWRQYXJ0cyB4bWxuczpzcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNS8wNy9zZWN1cml0eXBvbGljeSI+Ci0JCQk8c3A6Qm9keS8+Ci0JCTwvc3A6RW5jcnlwdGVkUGFydHM+Ci0JCTxyYW1wOlJhbXBhcnRDb25maWcgeG1sbnM6cmFtcD0iaHR0cDovL3dzLmFwYWNoZS5vcmcvcmFtcGFydC9wb2xpY3kiPiAKLQkJCTxyYW1wOnVzZXI+YWxpY2U8L3JhbXA6dXNlcj4KLQkJCTxyYW1wOmVuY3J5cHRpb25Vc2VyPmJvYjwvcmFtcDplbmNyeXB0aW9uVXNlcj4KLQkJCTxyYW1wOnBhc3N3b3JkQ2FsbGJhY2tDbGFzcz5vcmcuYXBhY2hlLnJhbXBhcnQuUFdDYWxsYmFjazwvcmFtcDpwYXNzd29yZENhbGxiYWNrQ2xhc3M+Ci0JCQkKLQkJCTxyYW1wOnNpZ25hdHVyZUNyeXB0bz4KLQkJCQk8cmFtcDpjcnlwdG8gcHJvdmlkZXI9Im9yZy5hcGFjaGUud3Muc2VjdXJpdHkuY29tcG9uZW50cy5jcnlwdG8uTWVybGluIj4KLQkJCQkJPHJhbXA6cHJvcGVydHkgbmFtZT0ib3JnLmFwYWNoZS53cy5zZWN1cml0eS5jcnlwdG8ubWVybGluLmtleXN0b3JlLnR5cGUiPkpLUzwvcmFtcDpwcm9wZXJ0eT4KLQkJCQkJPHJhbXA6cHJvcGVydHkgbmFtZT0ib3JnLmFwYWNoZS53cy5zZWN1cml0eS5jcnlwdG8ubWVybGluLmZpbGUiPnRlc3QtcmVzb3VyY2VzL3JhbXBhcnQvc3RvcmUuamtzPC9yYW1wOnByb3BlcnR5PgotCQkJCQk8cmFtcDpwcm9wZXJ0eSBuYW1lPSJvcmcuYXBhY2hlLndzLnNlY3VyaXR5LmNyeXB0by5tZXJsaW4ua2V5c3RvcmUucGFzc3dvcmQiPnBhc3N3b3JkPC9yYW1wOnByb3BlcnR5PgotCQkJCTwvcmFtcDpjcnlwdG8+Ci0JCQk8L3JhbXA6c2lnbmF0dXJlQ3J5cHRvPgotCQkJPHJhbXA6ZW5jcnlwdGlvbkN5cHRvPgotCQkJCTxyYW1wOmNyeXB0byBwcm92aWRlcj0ib3JnLmFwYWNoZS53cy5zZWN1cml0eS5jb21wb25lbnRzLmNyeXB0by5NZXJsaW4iPgotCQkJCQk8cmFtcDpwcm9wZXJ0eSBuYW1lPSJvcmcuYXBhY2hlLndzLnNlY3VyaXR5LmNyeXB0by5tZXJsaW4ua2V5c3RvcmUudHlwZSI+SktTPC9yYW1wOnByb3BlcnR5PgotCQkJCQk8cmFtcDpwcm9wZXJ0eSBuYW1lPSJvcmcuYXBhY2hlLndzLnNlY3VyaXR5LmNyeXB0by5tZXJsaW4uZmlsZSI+dGVzdC1yZXNvdXJjZXMvcmFtcGFydC9zdG9yZS5qa3M8L3JhbXA6cHJvcGVydHk+Ci0JCQkJCTxyYW1wOnByb3BlcnR5IG5hbWU9Im9yZy5hcGFjaGUud3Muc2VjdXJpdHkuY3J5cHRvLm1lcmxpbi5rZXlzdG9yZS5wYXNzd29yZCI+cGFzc3dvcmQ8L3JhbXA6cHJvcGVydHk+Ci0JCQkJPC9yYW1wOmNyeXB0bz4KLQkJCTwvcmFtcDplbmNyeXB0aW9uQ3lwdG8+Ci0JCTwvcmFtcDpSYW1wYXJ0Q29uZmlnPgotCTwvd3NwOkFsbD4KLTwvd3NwOkV4YWN0bHlPbmU+Ci08L3dzcDpQb2xpY3k+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL21vZHVsZXMvcmFtcGFydC8xXzMvc2VjLWNvbmYvc2FtcGxlLXNlcnZpY2VzLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvbW9kdWxlcy9yYW1wYXJ0LzFfMy9zZWMtY29uZi9zYW1wbGUtc2VydmljZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjgwOTBiLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvbW9kdWxlcy9yYW1wYXJ0LzFfMy9zZWMtY29uZi9zYW1wbGUtc2VydmljZXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHNlcnZpY2UgbmFtZT0iU2VjdXJlU2VydmljZTciPgotCi0JPG1vZHVsZSByZWY9ImFkZHJlc3NpbmciLz4KLQk8bW9kdWxlIHJlZj0icmFtcGFydCIvPgotCi0JPHBhcmFtZXRlciBuYW1lPSJTZXJ2aWNlQ2xhc3MiPm9yZy5hcGFjaGUucmFtcGFydC5TZXJ2aWNlPC9wYXJhbWV0ZXI+Ci0KLQk8b3BlcmF0aW9uIG5hbWU9ImVjaG8iPgotCQk8bWVzc2FnZVJlY2VpdmVyIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5SYXdYTUxJTk91dE1lc3NhZ2VSZWNlaXZlciIvPgotCQk8YWN0aW9uTWFwcGluZz51cm46ZWNobzwvYWN0aW9uTWFwcGluZz4KLQk8L29wZXJhdGlvbj4KLQkKLQk8d3NwOlBvbGljeSB3c3U6SWQ9IlNpZ0VuY3JUcmlwbGVEZXNSU0ExNURLIiB4bWxuczp3c3U9Imh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzcy8yMDA0LzAxL29hc2lzLTIwMDQwMS13c3Mtd3NzZWN1cml0eS11dGlsaXR5LTEuMC54c2QiIHhtbG5zOndzcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOS9wb2xpY3kiPgotCTx3c3A6RXhhY3RseU9uZT4KLQkJPHdzcDpBbGw+Ci0JCQk8c3A6QXN5bW1ldHJpY0JpbmRpbmcgeG1sbnM6c3A9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDUvMDcvc2VjdXJpdHlwb2xpY3kiPgotCQkJCTx3c3A6UG9saWN5PgotCQkJCQk8c3A6SW5pdGlhdG9yVG9rZW4+Ci0JCQkJCQk8d3NwOlBvbGljeT4KLQkJCQkJCQk8c3A6WDUwOVRva2VuIHNwOkluY2x1ZGVUb2tlbj0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNS8wNy9zZWN1cml0eXBvbGljeS9JbmNsdWRlVG9rZW4vQWx3YXlzVG9SZWNpcGllbnQiPgotCQkJCQkJCQk8d3NwOlBvbGljeT4KLQkJCQkJCQkJCTxzcDpSZXF1aXJlRGVyaXZlZEtleXMvPgotCQkJCQkJCQkJPHNwOldzc1g1MDlWM1Rva2VuMTAvPgotCQkJCQkJCQk8L3dzcDpQb2xpY3k+Ci0JCQkJCQkJPC9zcDpYNTA5VG9rZW4+Ci0JCQkJCQk8L3dzcDpQb2xpY3k+Ci0JCQkJCTwvc3A6SW5pdGlhdG9yVG9rZW4+Ci0JCQkJCTxzcDpSZWNpcGllbnRUb2tlbj4KLQkJCQkJCTx3c3A6UG9saWN5PgotCQkJCQkJCTxzcDpYNTA5VG9rZW4gc3A6SW5jbHVkZVRva2VuPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA3L3NlY3VyaXR5cG9saWN5L0luY2x1ZGVUb2tlbi9OZXZlciI+Ci0JCQkJCQkJCTx3c3A6UG9saWN5PgotCQkJCQkJCQkJPHNwOlJlcXVpcmVEZXJpdmVkS2V5cy8+Ci0JCQkJCQkJCQk8c3A6V3NzWDUwOVYzVG9rZW4xMC8+Ci0JCQkJCQkJCTwvd3NwOlBvbGljeT4KLQkJCQkJCQk8L3NwOlg1MDlUb2tlbj4KLQkJCQkJCTwvd3NwOlBvbGljeT4KLQkJCQkJPC9zcDpSZWNpcGllbnRUb2tlbj4KLQkJCQkJPHNwOkFsZ29yaXRobVN1aXRlPgotCQkJCQkJPHdzcDpQb2xpY3k+Ci0JCQkJCQkJPHNwOlRyaXBsZURlc1JzYTE1Lz4KLQkJCQkJCTwvd3NwOlBvbGljeT4KLQkJCQkJPC9zcDpBbGdvcml0aG1TdWl0ZT4KLQkJCQkJPHNwOkxheW91dD4KLQkJCQkJCTx3c3A6UG9saWN5PgotCQkJCQkJCTxzcDpTdHJpY3QvPgotCQkJCQkJPC93c3A6UG9saWN5PgotCQkJCQk8L3NwOkxheW91dD4KLQkJCQkJPHNwOkluY2x1ZGVUaW1lc3RhbXAvPgotCQkJCQk8c3A6T25seVNpZ25FbnRpcmVIZWFkZXJzQW5kQm9keS8+Ci0JCQkJPC93c3A6UG9saWN5PgotCQkJPC9zcDpBc3ltbWV0cmljQmluZGluZz4KLQkJCTxzcDpXc3MxMCB4bWxuczpzcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNS8wNy9zZWN1cml0eXBvbGljeSI+Ci0JCQkJPHdzcDpQb2xpY3k+Ci0JCQkJCTxzcDpNdXN0U3VwcG9ydFJlZktleUlkZW50aWZpZXIvPgotCQkJCQk8c3A6TXVzdFN1cHBvcnRSZWZJc3N1ZXJTZXJpYWwvPgotCQkJCTwvd3NwOlBvbGljeT4KLQkJCTwvc3A6V3NzMTA+Ci0JCQk8c3A6U2lnbmVkUGFydHMgeG1sbnM6c3A9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDUvMDcvc2VjdXJpdHlwb2xpY3kiPgotCQkJCTxzcDpCb2R5Lz4KLQkJCTwvc3A6U2lnbmVkUGFydHM+Ci0JCQk8c3A6RW5jcnlwdGVkUGFydHMgeG1sbnM6c3A9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDUvMDcvc2VjdXJpdHlwb2xpY3kiPgotCQkJCTxzcDpCb2R5Lz4KLQkJCTwvc3A6RW5jcnlwdGVkUGFydHM+Ci0KLQkJCTxyYW1wOlJhbXBhcnRDb25maWcgeG1sbnM6cmFtcD0iaHR0cDovL3dzLmFwYWNoZS5vcmcvcmFtcGFydC9wb2xpY3kiPiAKLQkJCQk8cmFtcDp1c2VyPmFsaWNlPC9yYW1wOnVzZXI+Ci0JCQkJPHJhbXA6ZW5jcnlwdGlvblVzZXI+Ym9iPC9yYW1wOmVuY3J5cHRpb25Vc2VyPgotCQkJCTxyYW1wOnBhc3N3b3JkQ2FsbGJhY2tDbGFzcz5vcmcuYXBhY2hlLnJhbXBhcnQuUFdDYWxsYmFjazwvcmFtcDpwYXNzd29yZENhbGxiYWNrQ2xhc3M+Ci0JCQkJCi0JCQkJPHJhbXA6c2lnbmF0dXJlQ3J5cHRvPgotCQkJCQk8cmFtcDpjcnlwdG8gcHJvdmlkZXI9Im9yZy5hcGFjaGUud3Muc2VjdXJpdHkuY29tcG9uZW50cy5jcnlwdG8uTWVybGluIj4KLQkJCQkJCTxyYW1wOnByb3BlcnR5IG5hbWU9Im9yZy5hcGFjaGUud3Muc2VjdXJpdHkuY3J5cHRvLm1lcmxpbi5rZXlzdG9yZS50eXBlIj5KS1M8L3JhbXA6cHJvcGVydHk+Ci0JCQkJCQk8cmFtcDpwcm9wZXJ0eSBuYW1lPSJvcmcuYXBhY2hlLndzLnNlY3VyaXR5LmNyeXB0by5tZXJsaW4uZmlsZSI+c3RvcmUuamtzPC9yYW1wOnByb3BlcnR5PgotCQkJCQkJPHJhbXA6cHJvcGVydHkgbmFtZT0ib3JnLmFwYWNoZS53cy5zZWN1cml0eS5jcnlwdG8ubWVybGluLmtleXN0b3JlLnBhc3N3b3JkIj5wYXNzd29yZDwvcmFtcDpwcm9wZXJ0eT4KLQkJCQkJPC9yYW1wOmNyeXB0bz4KLQkJCQk8L3JhbXA6c2lnbmF0dXJlQ3J5cHRvPgotCQkJCTxyYW1wOmVuY3J5cHRpb25DeXB0bz4KLQkJCQkJPHJhbXA6Y3J5cHRvIHByb3ZpZGVyPSJvcmcuYXBhY2hlLndzLnNlY3VyaXR5LmNvbXBvbmVudHMuY3J5cHRvLk1lcmxpbiI+Ci0JCQkJCQk8cmFtcDpwcm9wZXJ0eSBuYW1lPSJvcmcuYXBhY2hlLndzLnNlY3VyaXR5LmNyeXB0by5tZXJsaW4ua2V5c3RvcmUudHlwZSI+SktTPC9yYW1wOnByb3BlcnR5PgotCQkJCQkJPHJhbXA6cHJvcGVydHkgbmFtZT0ib3JnLmFwYWNoZS53cy5zZWN1cml0eS5jcnlwdG8ubWVybGluLmZpbGUiPnN0b3JlLmprczwvcmFtcDpwcm9wZXJ0eT4KLQkJCQkJCTxyYW1wOnByb3BlcnR5IG5hbWU9Im9yZy5hcGFjaGUud3Muc2VjdXJpdHkuY3J5cHRvLm1lcmxpbi5rZXlzdG9yZS5wYXNzd29yZCI+cGFzc3dvcmQ8L3JhbXA6cHJvcGVydHk+Ci0JCQkJCTwvcmFtcDpjcnlwdG8+Ci0JCQkJPC9yYW1wOmVuY3J5cHRpb25DeXB0bz4KLQkJCTwvcmFtcDpSYW1wYXJ0Q29uZmlnPgotCi0JCTwvd3NwOkFsbD4KLQk8L3dzcDpFeGFjdGx5T25lPgotCTwvd3NwOlBvbGljeT4KLTwvc2VydmljZT4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvbW9kdWxlcy9yYW1wYXJ0LzFfMy9zZWN1cml0eS1tb2R1bGUueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9tb2R1bGVzL3JhbXBhcnQvMV8zL3NlY3VyaXR5LW1vZHVsZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2NjU3YjQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9tb2R1bGVzL3JhbXBhcnQvMV8zL3NlY3VyaXR5LW1vZHVsZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMTUgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSIiLz4KLSAgPGxpbmsgaHJlZj0iLi4vLi4vLi4vY3NzL2F4aXMtZG9jcy5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIG1lZGlhPSJhbGwiIC8+Ci0gIDx0aXRsZT5SYW1wYXJ0IDogV1MtU2VjdXJpdHkgbW9kdWxlIGZvciBBeGlzMjwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgxPlNlY3VyaW5nIFNPQVAgTWVzc2FnZXMgd2l0aCBSYW1wYXJ0PC9oMT4KLQotPHA+QXhpczIgY29tZXMgd2l0aCBhIG1vZHVsZSBiYXNlZCBvbiBBcGFjaGUgV1NTNEogWzFdIHRvIHByb3ZpZGUgV1MtU2VjdXJpdHkKLWZlYXR1cmVzLCBjYWxsZWQgIlJhbXBhcnQiLiBUaGlzIGRvY3VtZW50IGV4cGxhaW5zIGhvdyB0byBlbmdhZ2UgYW5kCi1jb25maWd1cmUgUmFtcGFydCBtb2R1bGUuPC9wPgotCi08aDI+Q29udGVudDwvaDI+Ci08dWw+Ci0gIDxsaT48YSBocmVmPSIjaW50cm8iPkludHJvZHVjdGlvbjwvYT48L2xpPgotICAgIDxsaT48YSBocmVmPSIjMV8xX2NvbmZpZyI+UmFtcGFydC0xLjEgQ29uZmlndXJhdGlvbjwvYT4KLQk8dWw+Ci0JPGxpPjxhIGhyZWY9IiMxXzFfYXNzZXRpb25zIj5SYW1wYXJ0IFNwZWNpZmljIEFzc2VydGlvbnM8L2E+PC9saT4KLQk8bGk+PGEgaHJlZj0iIzFfMV9zZXJ2aWNlX2NvbmZpZyI+U2VydmljZSBDb25maWdyYXRpb248L2E+PC9saT4KLQk8bGk+PGEgaHJlZj0iIzFfMV9jbGllbnRfY29uZmlnIj5DbGllbnQgQ29uZml1cmF0aW9uPC9hPjwvbGk+Ci0JPC91bD48L2xpPgotICA8bGk+PGEgaHJlZj0iIzFfMF9jb25maWciPlJhbXBhcnQtMS4wIENvbmZpZ3VyYXRpb248L2E+Ci0gIDx1bD4KLSAgPGxpPjxhIGhyZWY9IiNvdXRmbG93c2VjdXJpdHkiPk91dGZsb3dTZWN1cml0eSBQYXJhbWV0ZXI8L2E+PC9saT4KLSAgPGxpPjxhIGhyZWY9IiNpbmZsb3dzZWN1cml0eSI+SW5mbG93U2VjdXJpdHkgUGFyYW1ldGVyPC9hPjwvbGk+Ci0gIDwvdWw+PC9saT4KLSAgPGxpPjxhIGhyZWY9IiNyZWZlcmVuY2VzIj5SZWZlcmVuY2VzPC9hPjwvbGk+Ci0gIDxsaT48YSBocmVmPSIjZXhhbXBsZXMiPkV4YW1wbGVzPC9hPjwvbGk+Ci08L3VsPgotPGEgbmFtZT0iaW50cm8iPjwvYT4KLQotPGgyPkludHJvZHVjdGlvbjwvaDI+Ci0KLTxwPlNpbmNlIHJhbXBhcnQgbW9kdWxlIGluc2VydHMgaGFuZGxlcnMgaW4gdGhlIHN5c3RlbSBzcGVjaWZpYyBzZWN1cml0eQotcGhhc2UsIGl0IG11c3QgYmUgZW5nYWdlZCBnbG9iYWxseS4gVGhlc2UgaGFuZGxlcnMgY2FuIGJlIGNvbmZpZ3VyZWQgCi11c2luZyBXUy1TZWN1cml0eVBvbGljeVsyXSBhbmQgUmFtcGFydCBzcGVjaWZpYyBwb2xpY3kgYXNzZXJ0aW9ucy4gCi1SYW1wYXJ0LTEuMCB1c2VkIHR3byBheGlzMiBwYXJhbWV0ZXJzIGZvciBjb25maWd1cmF0aW9uIGFuZCB0aGVzZSBhcmUKLXN0aWxsIHN1cHBvcnRlZCBpbiB0aGUgMS4xIHJlbGVhc2UgYXMgd2VsbC48L3A+Ci0KLTxwPlRoZSByYW1wYXJ0LTEuMSByZWxlYXNlIGlzIGF2YWlsYWJsZSAKLTxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9keW4vY2xvc2VyLmNnaS93cy9yYW1wYXJ0LzFfMSI+aGVyZTwvYT4uPC9wPgotCi08cD5GaXJzdCBpdCBzaG91bGQgYmUgZW5nYWdlZCBieSBpbnNlcnRpbmcgdGhlIGZvbGxvd2luZyBpbiB0aGUgYXhpczIueG1sCi1maWxlLjwvcD4KLTxzb3VyY2U+PHByZT4gICAgJmx0O21vZHVsZSByZWY9InJhbXBhcnQiLyZndDs8L3ByZT4KLTwvc291cmNlPgotPHA+VGhlIHdlYiBhZG1pbiBpbnRlcmZhY2UgY2FuIGJlIHVzZWQgd2hlbiBBeGlzMiBpcyBkZXBsb3llZCBpbiBhIHNlcnZsZXQKLWNvbnRhaW5lciBzdWNoIGFzIEFwYWNoZSBUb21jYXQuPC9wPgotCi08cD5BdCB0aGUgc2VydmVyIGl0IGlzIHBvc3NpYmxlIHRvIHByb3ZpZGUgc2VjdXJpdHkgb24gYSBwZXIgc2VydmljZSBiYXNpcy4KLVRoZSBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgc2hvdWxkIGJlIHNldCBpbiB0aGUgc2VydmljZS54bWwgZmlsZSBvZiB0aGUKLXNlcnZpY2UuIFRoZSBjbGllbnQgc2lkZSBjb25maWcgcGFyYW1ldGVycyBzaG91bGQgYmUgc2V0IGluIHRoZSBheGlzMi54bWwgb2YKLXRoZSBjbGllbnQncyBBeGlzMiByZXBvc2l0b3J5LjwvcD4KLTxhIGlkPSIxXzFfY29uZmlnIj48L2E+Ci08aDI+UmFtcGFydC0xLjEgQ29uZmlndXJhdGlvbjwvaDI+Ci08YSBpZD0iMV8xX2Fzc2V0aW9ucyI+PC9hPgotPGgzPlJhbXBhcnQgU3BlY2lmaWMgQXNzZXJ0aW9uczwvaDM+Ci0KLTxwPlJhbXBhcnQgdXNlcyB0aGUgc3RhbmRhcmQgV1MtU2VjdXJpdHlQb2xpY3lbMl0gYXNzZXJ0aW9ucyBhbmQgYWxzbyBkZWZpbmVzIGl0cyBvd24gCi1hc3NlcnRpb25zIHRvIGJlIGFibGUgY2FwdHVyZSB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiB0aGF0IGlzIG5vdCBwcm92aWRlZCAKLWluIFdTLVNlY3VyaXR5UG9saWN5LjwvcD4KLTxwPlRoZSBSYW1wYXJ0IHNwZWNpZmljIGFzc2VydGlvbidzIHhzZCBjYW4gYmUgZm91bmQgPGEgaHJlZj0ic2VjLWNvbmYvcmFtcGFydC1jb25maWcueHNkIj5oZXJlCi08L2E+LjwvcD4KLQotPHA+VGhlIDxzdHJvbmc+cmFtcDpSYW1wYXJ0Q29uZmlnPC9zdHJvbmc+IGFzc2VydGlvbiBtdXN0IGJlIGF2YWlsYWJsZSBhcyBhIG9uZSBvZiB0aGUgdG9wIAotbGV2ZWwgYXNzZXJ0aW9ucyBvZiB0aGUgcG9saWN5IGFzIHNob3duIDxhIGhyZWY9InNlYy1jb25mL3NhbXBsZS1wb2xpY3kueG1sIj5oZXJlPC9hPi48L3A+Ci08YSBpZD0iMV8xX3NlcnZpY2VfY29uZmlnIj48L2E+Ci08aDM+U2VydmljZSBDb25maWdyYXRpb248L2gzPgotCi1UbyBjb25maWd1cmUgdGhlIHNlcnZpY2Ugb25lIHdpbGwgc2ltcGx5IGhhdmUgdG8gYWRkIHRoZSBwb2xpY3kgZWxlbWVudCBpbnRvIHRoZSAKLXNldmljZXMueG1sIGZpbGUuIEEgc2FtcGxlIHNlcnZpY2UueG1sIGZpbGUgaXMgYXZhaWxhYmxlIAotPGEgaHJlZj0ic2VjLWNvbmYvc2FtcGxlLXNlcnZpY2VzLnhtbCI+aGVyZTwvYT4uCi08YSBpZD0iMV8xX2NsaWVudF9jb25maWciPjwvYT4KLTxoMz5DbGllbnQgQ29uZml1cmF0aW9uPC9oMz4KLTxwPk9uIHRoZSBjbGllbnQgc2lkZSwgYSBwb2xpY3kgb2JqZWN0IHNob3VsZCBiZSBjcmVhdGVkIGFuZCBsb2FkZWQgaW50byBvcHRpb25zLiBDcmVhdGluZyB0aGUgcG9saWN5IG9iamVjdCBjYW4gYmUgZG9uZSB1c2luZyBhICJwb2xpY3kueG1sIiBmaWxlIGFzIGZvbGxvd3MuPC9wPgotCQotPHByZT4KLQkvL0NyZWF0aW5nIHRoZSBvYmplY3QKLSAgCVN0QVhPTUJ1aWxkZXIgYnVpbGRlciA9IG5ldyBTdEFYT01CdWlsZGVyKHBhdGhUb1BvbGljeWZpbGUpOwotICAgICAgICBQb2xpY3kgY2xpZW50UG9saWN5ID0gUG9saWN5RW5naW5lLmdldFBvbGljeShidWlsZGVyLmdldERvY3VtZW50RWxlbWVudCgpKTsKLQkvL3NldHRpbmcgdGhlIG9iamVjdAotCU9wdGlvbnMgb3B0aW9ucyA9IG5ldyBPcHRpb25zKCk7Ci0gICAgICAgIG9wdGlvbnMuc2V0UHJvcGVydHkoUmFtcGFydE1lc3NhZ2VEYXRhLktFWV9SQU1QQVJUX1BPTElDWSwgY2xpZW50UG9saWN5KTsKLTwvcHJlPgotPGEgaWQ9IjFfMF9jb25maWciPjwvYT4KLTxoMj5SYW1wYXJ0LTEuMCBDb25maWd1cmF0aW9uPC9oMj4KLQotPHA+UmFtcGFydCBtb2R1bGUgdXNlcyB0d28gcGFyYW1ldGVyczo8L3A+Ci08dWw+Ci0gIDxsaT48YSBocmVmPSJvdXRmbG93c2VjdXJpdHkiPk91dGZsb3dTZWN1cml0eTwvYT48L2xpPgotICA8bGk+PGEgaHJlZj0iaW5mbG93c2VjdXJpdHkiPkluZmxvd1NlY3VyaXR5PC9hPjwvbGk+Ci08L3VsPgotVGhlIGNvbmZpZ3VyYXRpb24gdGhhdCBjYW4gZ28gaW4gZWFjaCBvZiB0aGVzZSBwYXJhbWV0ZXJzIGFyZSBkZXNjcmliZWQKLWJlbG93OiA8YSBuYW1lPSJvdXRmbG93c2VjdXJpdHkiPjwvYT4KLQotPGgzPk91dGZsb3dTZWN1cml0eSBQYXJhbWV0ZXI8L2gzPgotVGhpcyBwYXJhbWV0ZXIgaXMgdXNlZCB0byBjb25maWd1cmUgdGhlIG91dGZsb3cgc2VjdXJpdHkgaGFuZGxlci4gVGhlIG91dGZsb3cKLWhhbmRsZXIgY2FuIGJlIGludm9rZWQgbW9yZSB0aGFuIG9uY2UgaW4gdGhlIG91dGZsb3cgb25lIGNhbiBwcm92aWRlCi1jb25maWd1cmF0aW9uIGZvciBlYWNoIG9mIHRoZXNlIGludm9jYXRpb25zLiBUaGUgJ2FjdGlvbicgZWxlbWVudCBkZXNjcmliZXMKLW9uZSBvZiB0aGVzZSBjb25maWd1cmF0aW9ucy4gVGhlcmVmb3JlIHRoZSAnT3V0Zmxvd1NlY3VyaXR5JyBwYXJhbWV0ZXIgY2FuCi1jb250YWluIG1vcmUgdGhhbiBvbmUgJ2FjdGlvbicgZWxlbWVudHMuIFRoZSBzY2hlbWEgb2YgdGhpcyAnYWN0aW9uJyBlbGVtZW50Ci1pcyBhdmFpbGFibGUgPGEgaHJlZj0ic2VjLWNvbmYvb3V0LWFjdGlvbi54c2QiPmhlcmU8L2E+LgotCi08cD5BbiBvdXRmbG93IGNvbmZpZ3VyYXRpb24gdG8gYWRkIGEgdGltZXN0YW1wLCBzaWduIGFuZCBlbmNyeXB0IHRoZSBtZXNzYWdlCi1vbmNlLCBpcyBzaG93biBpbjxhIGhyZWY9IiNleDEiPiBFeGFtcGxlIDE8L2E+IGFuZCA8YSBocmVmPSIjZXgxIj4gRXhhbXBsZQotMjwvYT4gc2hvd3MgaG93IHRvIHNpZ24gdGhlIG1lc3NhZ2UgdHdpY2UgYnkgY2hhaW5pbmcgdGhlIG91dGZsb3cgaGFuZGxlcgotKHVzaW5nIHR3byAnYWN0aW9uJyBlbGVtZW50cyk8L3A+Ci0KLTxwPkZvbGxvd2luZyBpcyBhIGRlc2NyaXB0aW9uIG9mIHRoZSBlbGVtZW50cyB0aGF0IGNhbiBnbyBpbiBhbiAnYWN0aW9uJwotZWxlbWVudCBvZiB0aGUgT3V0Zmxvd1NlY3VyaXR5IHBhcmFtZXRlcjwvcD4KLTxici8+Ci0KLQotPHRhYmxlIGJvcmRlcj0iMSI+Ci0gIDx0Ym9keT4KLSAgICA8dHI+Ci0gICAgICA8dGQ+PGI+UGFyYW1ldGVyPC9iPjwvdGQ+Ci0gICAgICA8dGQ+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICAgIDx0ZD48Yj5FeGFtcGxlPC9iPjwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgICA8dGQ+aXRlbXM8L3RkPgotICAgICAgPHRkPlNlY3VyaXR5IGFjdGlvbnMgZm9yIHRoZSBpbmZsb3c8L3RkPgotICAgICAgPHRkPkFkZCBhIFRpbWVzdGFtcCwgU2lnbiB0aGUgU09BUCBib2R5IGFuZCBFbmNyeXB0IHRoZSBTT0FQIGJvZHkgPGJyLz4KLSAgICAgICAgJmx0O2l0ZW1zJmd0OyBUaW1lc3RhbXAgU2lnbmF0dXJlIEVuY3J5cHQmbHQ7L2l0ZW1zJmd0OzwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgICA8dGQ+dXNlcjwvdGQ+Ci0gICAgICA8dGQ+VGhlIHVzZXIncyBuYW1lPC90ZD4KLSAgICAgIDx0ZD5TZXQgYWxpYXMgb2YgdGhlIGtleSB0byBiZSB1c2VkIHRvIHNpZ248YnIvPgotICAgICAgICAmbHQ7dXNlciZndDsgYm9iJmx0Oy91c2VyJmd0OzwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgICA8dGQ+cGFzc3dvcmRDYWxsYmFja0NsYXNzPC90ZD4KLSAgICAgIDx0ZD5DYWxsYmFjayBjbGFzcyB1c2VkIHRvIHByb3ZpZGUgdGhlIHBhc3N3b3JkIHJlcXVpcmVkIHRvIGNyZWF0ZSB0aGUKLSAgICAgICAgVXNlcm5hbWVUb2tlbiBvciB0byBzaWduIHRoZSBtZXNzYWdlPC90ZD4KLSAgICAgIDx0ZD4mbHQ7cGFzc3dvcmRDYWxsYmFja0NsYXNzJmd0OwotICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLnNlY3VyaXR5LlBXQ2FsbGJhY2smbHQ7L3Bhc3N3b3JkQ2FsbGJhY2tDbGFzcyZndDs8L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgPHRkPnNpZ25hdHVyZVByb3BGaWxlPC90ZD4KLSAgICAgIDx0ZD5wcm9wZXJ0eSBmaWxlIHVzZWQgdG8gZ2V0IHRoZSBzaWduYXR1cmUgcGFyYW1ldGVycyBzdWNoIGFzIGNyeXB0bwotICAgICAgICBwcm92aWRlciwga2V5c3RvcmUgYW5kIGl0cyBwYXNzd29yZDwvdGQ+Ci0gICAgICA8dGQ+U2V0IGV4YW1wbGUucHJvcGVydGllcyBmaWxlIGFzIHRoZSBzaWduYXR1cmUgcHJvcGVydHkgZmlsZTxici8+Ci0gICAgICAgICZsdDtzaWduYXR1cmVQcm9wRmlsZSZndDsKLSAgICAgIGV4YW1wbGUucHJvcGVydGllcyZsdDsvc2lnbmF0dXJlUHJvcEZpbGUmZ3Q7PC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgIDx0ZD5zaWduYXR1cmVLZXlJZGVudGlmaWVyPC90ZD4KLSAgICAgIDx0ZD5LZXkgaWRlbnRpZmllciB0byBiZSB1c2VkIGluIHJlZmVycmluZyB0aGUga2V5IGluIHRoZSBzaWduYXR1cmU8L3RkPgotICAgICAgPHRkPlVzZSB0aGUgc2VyaWFsIG51bWJlciBvZiB0aGUgY2VydGlmaWNhdGU8YnIvPgotICAgICAgICAmbHQ7c2lnbmF0dXJlS2V5SWRlbnRpZmllciZndDsKLSAgICAgICAgSXNzdWVyU2VyaWFsJmx0Oy9zaWduYXR1cmVLZXlJZGVudGlmaWVyJmd0OzwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgICA8dGQ+ZW5jcnlwdGlvbktleUlkZW50aWZpZXI8L3RkPgotICAgICAgPHRkPktleSBpZGVudGlmaWVyIHRvIGJlIHVzZWQgaW4gcmVmZXJyaW5nIHRoZSBrZXkgaW4gZW5jcnlwdGlvbjwvdGQ+Ci0gICAgICA8dGQ+VXNlIHRoZSBzZXJpYWwgbnVtYmVyIG9mIHRoZSBjZXJ0aWZpY2F0ZSA8YnIvPgotICAgICAgICAmbHQ7ZW5jcnlwdGlvbktleUlkZW50aWZpZXImZ3Q7SXNzdWVyU2VyaWFsJmx0Oy9lbmNyeXB0aW9uS2V5SWRlbnRpZmllciZndDs8L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgPHRkPmVuY3J5cHRpb25Vc2VyPC90ZD4KLSAgICAgIDx0ZD5UaGUgdXNlcidzIG5hbWUgZm9yIGVuY3J5cHRpb24uPC90ZD4KLSAgICAgIDx0ZD48YnIvPgotICAgICAgICAmbHQ7ZW5jcnlwdGlvblVzZXImZ3Q7YWxpY2UmbHQ7L2VuY3J5cHRpb25Vc2VyJmd0OzwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgICA8dGQ+ZW5jcnlwdGlvblN5bUFsZ29yaXRobTwvdGQ+Ci0gICAgICA8dGQ+U3ltbWV0cmljIGFsZ29yaXRobSB0byBiZSB1c2VkIGZvciBlbmNyeXB0aW9uPC90ZD4KLSAgICAgIDx0ZD5Vc2UgQUVTLTEyODxici8+Ci0gICAgICAgICZsdDtlbmNyeXB0aW9uU3ltQWxnb3JpdGhtJmd0OwotICAgICAgICBodHRwOi8vd3d3LnczLm9yZy8yMDAxLzA0L3htbGVuYyNhZXMxMjgtY2JjJmx0Oy9lbmNyeXB0aW9uU3ltQWxnb3JpdGhtJmd0OzwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgICA8dGQ+ZW5jcnlwdGlvbktleVRyYW5zcG9ydEFsZ29yaXRobTwvdGQ+Ci0gICAgICA8dGQ+S2V5IGVuY3J5cHRpb24gYWxnb3JpdGhtPC90ZD4KLSAgICAgIDx0ZD5Vc2UgUlNBLU9BRVA8YnIvPgotICAgICAgICAmbHQ7cGFyYW1ldGVyIG5hbWU9ImVuY3J5cHRpb25TeW1BbGdvcml0aG0iJmd0OwotICAgICAgICBodHRwOi8vd3d3LnczLm9yZy8yMDAxLzA0L3htbGVuYyNyc2Etb2FlcC1tZ2YxcCZsdDsvcGFyYW1ldGVyJmd0OzwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgICA8dGQ+c2lnbmF0dXJlUGFydHM8L3RkPgotICAgICAgPHRkPlNpZ24gbXVsdGlwbGUgcGFydHMgaW4gdGhlIFNPQVAgbWVzc2FnZTwvdGQ+Ci0gICAgICA8dGQ+U2lnbiBGb28gYW5kIEJhciBlbGVtZW50cyBxdWFsaWZpZWQgYnkgImh0dHA6Ly9hcHAubnMvbnMiPGJyLz4KLSAgICAgICAgJmx0O3NpZ25hdHVyZVBhcnRzJmd0OwotICAgICAgICB7RWxlbWVudH17aHR0cDovL2FwcC5ucy9uc31Gb287e0VsZW1lbnR9e2h0dHA6Ly9hcHAubnMvbnN9QmFyCi0gICAgICAgICZsdDsvc2lnbmF0dXJlUGFydHMmZ3Q7PC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgIDx0ZD5vcHRpbWl6ZVBhcnRzPC90ZD4KLSAgICAgIDx0ZD5NVE9NIE9wdGltaXplIHRoZSBlbGVtZW50cyBzcGVjaWZpZWQgYnkgdGhlIFhQYXRoIHF1ZXJ5PC90ZD4KLSAgICAgIDx0ZD5PcHRpbWl6ZSB0aGUgQ2lwaGVyVmFsdWU8YnIvPgotICAgICAgICAmbHQ7b3B0aW1pemVQYXJ0cyZndDsKLSAgICAgICAgLy94ZW5jOkVuY3J5cHRlZERhdGEveGVuYzpDaXBoZXJEYXRhL3hlbmM6Q2lwaGVyVmFsdWUKLSAgICAgICAgJmx0Oy9vcHRpbWl6ZVBhcnRzJmd0OzwvdGQ+Ci0gICAgPC90cj4KLSAgPC90Ym9keT4KLTwvdGFibGU+Ci08YSBuYW1lPSJpbmZsb3dzZWN1cml0eSI+PC9hPgotCi08aDM+SW5mbG93U2VjdXJpdHkgUGFyYW1ldGVyPC9oMz4KLQotPHA+VGhpcyBwYXJhbWV0ZXIgaXMgdXNlZCB0byBjb25maWd1cmUgdGhlIGluZmxvdyBzZWN1cml0eSBoYW5kbGVyLiBUaGUKLSdhY3Rpb24nIGVsZW1lbnQgaXMgdXNlZCB0byBlbmNhcHN1bGF0ZSB0aGUgY29uZmlndXJhdGlvbiBlbGVtZW50cyBoZXJlIGFzCi13ZWxsLiBUaGUgc2NoZW1hIG9mIHRoZSAnYWN0aW9uJyBlbGVtZW50IGlzIGF2YWlsYWJsZSBoZXJlLiA8YQotaHJlZj0iI2V4MyI+RXhhbXBsZSAzPC9hPiBzaG93cyB0aGUgY29uZmlndXJhdGlvbiB0byBkZWNyeXB0LCB2ZXJpZnkKLXNpZ25hdHVyZSBhbmQgdmFsaWRhdGUgdGltZXN0YW1wLjwvcD4KLQotPHRhYmxlIGJvcmRlcj0iMSI+Ci0gIDx0Ym9keT4KLSAgICA8dHI+Ci0gICAgICA8dGQ+PGI+UGFyYW1ldGVyPC9iPjwvdGQ+Ci0gICAgICA8dGQ+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICAgIDx0ZD48Yj5FeGFtcGxlPC9iPjwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgICA8dGQ+aXRlbXM8L3RkPgotICAgICAgPHRkPlNlY3VyaXR5IGFjdGlvbnMgZm9yIHRoZSBpbmZsb3c8L3RkPgotICAgICAgPHRkPmZpcnN0IHRoZSBpbmNvbWluZyBtZXNzYWdlIHNob3VsZCBiZSBkZWNyeXB0ZWQgYW5kIHRoZW4gdGhlCi0gICAgICAgIHNpZ25hdHVyZXMgc2hvdWxkIGJlIHZlcmlmaWVkIGFuZCBzaG91bGQgYmUgY2hlY2tlZCBmb3IgdGhlCi0gICAgICAgIGF2YWlsYWJpbGl0eSBvZiB0aGUgVGltZXN0YW1wIDxici8+Ci0gICAgICAgICZsdDtpdGVtcyZndDsgVGltZXN0YW1wIFNpZ25hdHVyZSBFbmNyeXB0Jmx0Oy9pdGVtcyZndDs8L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgPHRkPnBhc3N3b3JkQ2FsbGJhY2tDbGFzczwvdGQ+Ci0gICAgICA8dGQ+Q2FsbGJhY2sgY2xhc3MgdXNlZCB0byBvYnRhaW4gcGFzc3dvcmQgZm9yIGRlY3J5cHRpb24gYW5kCi0gICAgICAgIFVzZXJuYW1lVG9rZW4gdmVyaWZpY2F0aW9uPC90ZD4KLSAgICAgIDx0ZD48YnIvPgotICAgICAgICAmbHQ7cGFzc3dvcmRDYWxsYmFja0NsYXNzJmd0OwotICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLnNlY3VyaXR5LlBXQ2FsbGJhY2smbHQ7L3Bhc3N3b3JkQ2FsbGJhY2tDbGFzcyZndDs8L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgPHRkPnNpZ25hdHVyZVByb3BGaWxlPC90ZD4KLSAgICAgIDx0ZD5Qcm9wZXJ0eSBmaWxlIHVzZWQgZm9yIHNpZ25hdHVyZSB2ZXJpZmljYXRpb248L3RkPgotICAgICAgPHRkPjxici8+Ci0gICAgICAgICZsdDtzaWduYXR1cmVQcm9wRmlsZSZndDsKLSAgICAgIHNpZy5wcm9wZXJ0aWVzJmx0Oy9zaWduYXR1cmVQcm9wRmlsZSZndDs8L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgPHRkPmRlY3J5cHRpb25Qcm9wRmlsZTwvdGQ+Ci0gICAgICA8dGQ+UHJvcGVydHkgZmlsZSB1c2VkIGZvciBkZWNyeXB0aW9uPC90ZD4KLSAgICAgIDx0ZD48YnIvPgotICAgICAgICAmbHQ7ZGVjcnlwdGlvblByb3BGaWxlJmd0OwotICAgICAgZGVjLnByb3BlcnRpZXMmbHQ7L2RlY3J5cHRpb25Qcm9wRmlsZSZndDs8L3RkPgotICAgIDwvdHI+Ci0gIDwvdGJvZHk+Ci08L3RhYmxlPgotPGJyLz4KLQotCi08cD5QbGVhc2Ugbm90ZSB0aGF0IHRoZSAnLnByb3BlcnRpZXMnIGZpbGVzIHVzZWQgaW4gcHJvcGVydGllcyBzdWNoIGFzCi1PdXRTaWduYXR1cmVQcm9wRmlsZSBhcmUgdGhlIHNhbWUgcHJvcGVydHkgZmlsZXMgdGhhdCBhcmUgdXNpbmcgaW4gdGhlIFdTUzRKCi1wcm9qZWN0LiBGb2xsb3dpbmcgc2hvd3MgdGhlIHByb3BlcnRpZXMgZGVmaW5lZCBpbiBhIHNhbXBsZSBwcm9wZXJ0eSBmaWxlPC9wPgotPHNvdXJjZT48cHJlPiAgICAgICAgb3JnLmFwYWNoZS53cy5zZWN1cml0eS5jcnlwdG8ucHJvdmlkZXI9b3JnLmFwYWNoZS53cy5zZWN1cml0eS5jb21wb25lbnRzLmNyeXB0by5NZXJsaW4KLSAgICAgICAgb3JnLmFwYWNoZS53cy5zZWN1cml0eS5jcnlwdG8ubWVybGluLmtleXN0b3JlLnR5cGU9cGtjczEyCi0gICAgICAgIG9yZy5hcGFjaGUud3Muc2VjdXJpdHkuY3J5cHRvLm1lcmxpbi5rZXlzdG9yZS5wYXNzd29yZD1zZWN1cml0eQotICAgICAgICBvcmcuYXBhY2hlLndzLnNlY3VyaXR5LmNyeXB0by5tZXJsaW4ua2V5c3RvcmUuYWxpYXM9MTZjNzNhYjYtYjg5Mi00NThmLWFiZjUtMmY4NzVmNzQ4ODJlCi0gICAgICAgIG9yZy5hcGFjaGUud3Muc2VjdXJpdHkuY3J5cHRvLm1lcmxpbi5hbGlhcy5wYXNzd29yZD1zZWN1cml0eQotICAgICAgICBvcmcuYXBhY2hlLndzLnNlY3VyaXR5LmNyeXB0by5tZXJsaW4uZmlsZT1rZXlzL3g1MDkuUEZYLk1TRlQKLSAgICA8L3ByZT4KLTwvc291cmNlPm9yZy5hcGFjaGUud3Muc2VjdXJpdHkuY3J5cHRvLnByb3ZpZGVyIGRlZmluZXMgdGhlIGltcGxlbWVudGF0aW9uIG9mCi10aGUgb3JnLmFwYWNoZS53cy5zZWN1cml0eS5jb21wb25lbnRzLmNyeXB0by5DcnlwdG8gaW50ZXJmYWNlIHRvIHByb3ZpZGUgdGhlCi1jcnlwdG8gaW5mb3JtYXRpb24gcmVxdWlyZWQgYnkgV1NTNEouIFRoZSBvdGhlciBwcm9wZXJ0aWVzIGRlZmluZWQgYXJlIHRoZQotY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIHVzZWQgYnkgdGhlIGltcGxlbWVudGF0aW9uIGNsYXNzCi0ob3JnLmFwYWNoZS53cy5zZWN1cml0eS5jb21wb25lbnRzLmNyeXB0by5NZXJsaW4pLiA8YSBuYW1lPSJyZWYiPjwvYT4gPGEKLW5hbWU9InJlZmVyZW5jZXMiPjwvYT4KLQotPGgyPlJlZmVyZW5jZXM8L2gyPgotCi08cD4xLiA8YSBocmVmPSJodHRwOi8vd3MuYXBhY2hlLm9yZy93c3M0aiI+QXBhY2hlIFdTUzRKIC1Ib21lPC9hPjwvcD4KLTxhIG5hbWU9ImV4YW1wbGVzIj48L2E+Ci08cD4yLiA8YSBocmVmPSJodHRwOi8vc3BlY3MueG1sc29hcC5vcmcvd3MvMjAwNS8wNy9zZWN1cml0eXBvbGljeS93cy1zZWN1cml0eXBvbGljeS5wZGYiPndzLXNlY3VyaXR5cG9saWN5LnBkZjwvYT48L3A+Ci08YSBuYW1lPSJleGFtcGxlcyI+PC9hPgotCi0KLTxoMj5FeGFtcGxlczwvaDI+Ci0KLTxwIGlkPSJleDEiPkV4YW1wbGUgMTogQW4gb3V0ZmxvdyBjb25maWd1cmF0aW9uIHRvIGFkZCBhIHRpbWVzdGFtcCwgc2lnbiBhbmQKLWVuY3J5cHQgdGhlIG1lc3NhZ2Ugb25jZTwvcD4KLQotPHA+PGltZyBhbHQ9IiIgc3JjPSJzZWMtY29uZi9vdXQtc2FtcGxlLnBuZyIvPjwvcD4KLQotPHAgaWQ9ImV4MiI+RXhhbXBsZSAyOiBBbiBvdXRmbG93IGNvbmZpZ3VyYXRpb24gdG8gc2lnbiB0aGUgbWVzc2FnZSB0d2ljZSBhbmQKLWFkZCBhIHRpbWVzdGFtcDwvcD4KLQotPHA+PGltZyBhbHQ9IiIgc3JjPSJzZWMtY29uZi9vdXQtc2FtcGxlMi5wbmciLz48L3A+Ci0KLTxwIGlkPSJleDMiPkV4YW1wbGUgMzogQW4gaW5mbG93IGNvbmZpZ3VyYXRpb24gdG8gZGVjcnlwdCwgdmVyaWZ5IHNpZ25hdHVyZQotYW5kIHZhbGlkYXRlIHRpbWVzdGFtcDwvcD4KLQotPHA+PGltZyBhbHQ9IiIgc3JjPSJzZWMtY29uZi9pbi1zYW1wbGUucG5nIi8+PC9wPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9vdmVydmlldy54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL292ZXJ2aWV3LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjg0NmZhNS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL292ZXJ2aWV3LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iDQotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4NCi08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+DQotPGhlYWQ+DQotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PQ0KLSJIVE1MIFRpZHkgZm9yIFdpbmRvd3MgKHZlcnMgMTQgSnVuZSAyMDA3KSwgc2VlIHd3dy53My5vcmciIC8+DQotPHRpdGxlPk92ZXJ2aWV3PC90aXRsZT4NCi08bGluayBocmVmPSJjc3MvYXhpcy1kb2NzLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyINCi1tZWRpYT0iYWxsIiAvPg0KLTwvaGVhZD4NCi08Ym9keT4NCi08aDI+T3ZlcnZpZXc8L2gyPg0KLTxwPkV2ZXJ5IHZvbHVudGVlciBwcm9qZWN0IG9idGFpbnMgaXRzIHN0cmVuZ3RoIGZyb20gdGhlIHBlb3BsZQ0KLWludm9sdmVkIGluIGl0LiBXZSBpbnZpdGUgeW91IHRvIHBhcnRpY2lwYXRlIGFzIG11Y2ggb3IgYXMgbGl0dGxlDQotYXMgeW91IGNob29zZS4gVGhlIHJvbGVzIGFuZCByZXNwb25zaWJpbGl0aWVzIHRoYXQgcGVvcGxlIGNhbg0KLWFzc3VtZSBpbiB0aGUgcHJvamVjdCBhcmUgYmFzZWQgb24gbWVyaXQuIEV2ZXJ5Ym9keSdzIGlucHV0DQotbWF0dGVycyE8L3A+DQotPHA+VGhlcmUgYXJlIGEgdmFyaWV0eSBvZiB3YXlzIHRvIHBhcnRpY2lwYXRlLiBSZWdhcmRsZXNzIG9mIGhvdw0KLXlvdSBjaG9vc2UgdG8gcGFydGljaXBhdGUsIHdlIHN1Z2dlc3QgeW91IGpvaW4gc29tZSBvciBhbGwgb2Ygb3VyDQotPGEgaHJlZj0ibWFpbC1saXN0cy5odG1sIj5tYWlsaW5nIGxpc3RzPC9hPi48L3A+DQotPGgyPjxiPlVzZSB0aGUgUHJvZHVjdHMgYW5kIEdpdmUgVXMgRmVlZGJhY2s8L2I+PC9oMj4NCi08cD5Vc2luZyB0aGUgcHJvZHVjdHMsIHJlcG9ydGluZyBidWdzLCBtYWtpbmcgZmVhdHVyZSByZXF1ZXN0cywNCi1ldGMuIGlzIGJ5IGZhciB0aGUgbW9zdCBpbXBvcnRhbnQgcm9sZS4gSXQncyB5b3VyIGZlZWRiYWNrIHRoYXQNCi1hbGxvd3MgdGhlIHRlY2hub2xvZ3kgdG8gZXZvbHZlLjwvcD4NCi08dWw+DQotPGxpPjxhIGhyZWY9Im1haWwtbGlzdHMuaHRtbCI+Sm9pbiBNYWlsaW5nIExpc3RzPC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9Imh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL2Rvd25sb2FkLmNnaSIgdGFyZ2V0PQ0KLSJfYmxhbmsiPkRvd25sb2FkIEJpbmFyeSBCdWlsZHM8L2E+PC9saT4NCi08bGk+PGEgaHJlZj0iaHR0cDovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0FYSVMyIj5SZXBvcnQNCi1idWdzL1JlcXVlc3QgYWRkaXRpb25hbCBmZWF0dXJlczwvYT48L2xpPg0KLTwvdWw+DQotPGgyPjxiPkNvbnRyaWJ1dGUgQ29kZSBvciBEb2N1bWVudGF0aW9uIFBhdGNoZXM8L2I+PC9oMj4NCi08cD5JbiB0aGlzIHJvbGUsIHlvdSBwYXJ0aWNpcGF0ZSBpbiB0aGUgYWN0dWFsIGRldmVsb3BtZW50IG9mIHRoZQ0KLWNvZGUuIElmIHRoaXMgaXMgdGhlIHR5cGUgb2Ygcm9sZSB5b3UnZCBsaWtlIHRvIHBsYXksIGhlcmUgYXJlIHNvbWUNCi1zdGVwcyAoaW4gYWRkaXRpb24gdG8gdGhlIG9uZXMgYWJvdmUpIHRvIGdldCB5b3Ugc3RhcnRlZDo8L3A+DQotPHVsPg0KLTxsaT5SZWFkIG91ciA8YSBocmVmPSJndWlkZWxpbmVzLmh0bWwiPmRldmVsb3BlciBndWlkZWxpbmVzPC9hPiBhbmQgPGENCi1ocmVmPSJyZWxlYXNlLXByb2Nlc3MuaHRtbCI+cmVsZWFzZSBwcm9jZXNzPC9hPjwvbGk+DQotPGxpPlJldmlldyB0aGUgPGEgaHJlZj0icmVmTGliLmh0bWwiPnJlZmVyZW5jZSBsaWJyYXJ5PC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9DQotImh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3dmMvd2Vic2VydmljZXMvYXhpczIvIj4NCi1WaWV3IHRoZSBTb3VyY2UgQ29kZTwvYT48L2xpPg0KLTxsaT48YSBocmVmPSJzdm4uaHRtbCI+QWNjZXNzIFNWTiBSZXBvc2l0b3J5PC9hPjwvbGk+DQotPC91bD4NCi08ZGl2IGlkPSJwZGYiIGFsaWduPSJyaWdodCI+PC9kaXY+DQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3JlZkxpYi54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3JlZkxpYi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzZjRiOGEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9yZWZMaWIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiINCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPg0KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4NCi08aGVhZD4NCi08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9DQotIkhUTUwgVGlkeSBmb3IgV2luZG93cyAodmVycyAxNCBKdW5lIDIwMDcpLCBzZWUgd3d3LnczLm9yZyIgLz4NCi08bWV0YSBodHRwLWVxdWl2PSJjb250ZW50LXR5cGUiIGNvbnRlbnQ9IiIgLz4NCi08dGl0bGU+UmVmZXJlbmNlIExpYnJhcnk8L3RpdGxlPg0KLTxsaW5rIGhyZWY9ImNzcy9heGlzLWRvY3MuY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIg0KLW1lZGlhPSJhbGwiIC8+DQotPC9oZWFkPg0KLTxib2R5Pg0KLTxoMj5SZWZlcmVuY2UgTGlicmFyeTwvaDI+DQotPHA+VGhlIEF4aXMgUHJvamVjdCBsaXZlcyBvciBmYWlscyBiYXNlZCBvbiBpdHMgaHVtYW4gcmVzb3VyY2VzLg0KLVVzZXJzIGFuZCBjb250cmlidXRvcnMgYWxpa2UgaGVscCB0aGUgcHJvamVjdCB3aXRoIGlkZWFzIGFuZA0KLWJyYWlucG93ZXIuIEEgY29tbW9uIGZvdW5kYXRpb24gb2Yga25vd2xlZGdlIGlzIHJlcXVpcmVkIHRvDQotZWZmZWN0aXZlbHkgcGFydGljaXBhdGUgaW4gdGhpcyB2aXJ0dWFsIGNvbW11bml0eS4gVGhlIGZvbGxvd2luZyBpcw0KLWEgbGlzdCBvZiBkb2N1bWVudHMgdGhhdCB3ZSBoYXZlIGZvdW5kIGhlbHBmdWwgdG8gdXMgYW5kIHRoZXkgbWF5YmUNCi1oZWxwZnVsIHRvIHlvdTo8L3A+DQotPHA+VGhlc2UgcmVzb3VyY2VzIGFyZSByZXF1aXJlZCByZWFkaW5nIGZvciBhbnlib2R5IGNvbnRyaWJ1dGluZw0KLXNvdXJjZSBjb2RlIHRvIHRoZSBwcm9qZWN0LjwvcD4NCi08cD48Yj48Zm9udD5TT0FQIFNwZWNpZmljIFJlc291cmNlczwvZm9udD48L2I+PC9wPg0KLTxwPjxiPlNPQVAgVzNDIFNwZWNpZmljYXRpb248L2I+IDxhIGhyZWY9DQotImh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDAvTk9URS1TT0FQLTIwMDAwNTA4LyI+MS4xPC9hPiBhbmQNCi08YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi9zb2FwLyI+MS4yPC9hPjxiciAvPg0KLVJlcXVpcmVkIHJlYWRpbmcuPC9wPg0KLTxwPjxiPjxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL1NPQVAtYXR0YWNobWVudHMiPlNPQVANCi1NZXNzYWdpbmcgd2l0aCBBdHRhY2htZW50cyBXM0MgU3BlY2lmaWNhdGlvbjwvYT48L2I+PGJyIC8+DQotU09BUCBjb21iaW5lZCB3aXRoIE1JTUUuPC9wPg0KLTxwPjxiPjxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL1NPQVAtZHNpZy8iPlNPQVAgU2VjdXJpdHkNCi1FeHRlbnNpb25zOiBEaWdpdGFsIFNpZ25hdHVyZSBTcGVjaWZpY2F0aW9uPC9hPjwvYj48YnIgLz4NCi1BZGRpbmcgc2VjdXJpdHkgdG8gU09BUC48L3A+DQotPHA+PGI+T3RoZXIgU3BlY2lmaWNhdGlvbnM8L2I+PC9wPg0KLTxwPldlYiBTZXJ2aWNlcyBEZXNjcmlwdGlvbiBMYW5ndWFnZSAoV1NETCkgPGEgaHJlZj0NCi0iaHR0cDovL3d3dy53M2Mub3JnL1RSL3dzZGwuaHRtbCI+MS4xPC9hPiA8YSBocmVmPQ0KLSJodHRwOi8vd3d3LnczLm9yZy9UUi93c2RsMjAvIj4yLjA8L2E+PC9wPg0KLTxwPldTIC0gQWRkcmVzc2luZyA8YSBocmVmPQ0KLSJodHRwOi8vd3d3LnczLm9yZy9TdWJtaXNzaW9uL3dzLWFkZHJlc3NpbmcvIj5zdWJtaXNzaW9uPC9hPg0KLTxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDUvV0Qtd3MtYWRkci1jb3JlLTIwMDUwMzMxLyI+MS4wDQotKDMxc3QgTWFyY2gsMjAwNSk8L2E+PC9wPg0KLTxwPjxhIGhyZWY9DQotImZ0cDovL3d3dzYuc29mdHdhcmUuaWJtLmNvbS9zb2Z0d2FyZS9kZXZlbG9wZXIvbGlicmFyeS93cy1wb2xpY3kucGRmIj4NCi1XZWIgU2VydmljZXMgUG9saWN5IEZyYW1ld29yayAoV1NQb2xpY3kpPC9hPjwvcD4NCi08cD48YSBocmVmPQ0KLSJodHRwOi8vd3d3LndzLWkub3JnL1Byb2ZpbGVzL0Jhc2ljUHJvZmlsZS0xLjAuaHRtbCI+V1MtSSBCYXNpYw0KLVByb2ZpbGUgVmVyc2lvbiAxLjA8L2E+PC9wPg0KLTxwPjxhIGhyZWY9DQotImh0dHA6Ly9qY3Aub3JnL2Fib3V0SmF2YS9jb21tdW5pdHlwcm9jZXNzL2ZpcnN0L2pzcjEwMS9pbmRleC5odG1sIj4NCi1KYXZhIEFQSSBmb3IgWE1MLWJhc2VkIFJQQyAoSkFYLVJQQyk8L2E+PC9wPg0KLTxwPjxhIGhyZWY9DQotImh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDUvUkVDLXNvYXAxMi1tdG9tLTIwMDUwMTI1LyI+U09BUCBNZXNzYWdlDQotVHJhbnNtaXNzaW9uIE9wdGltaXphdGlvbiBNZWNoYW5pc208L2E+PC9wPg0KLTxwPjxiPk90aGVyIFJlc291cmNlczwvYj48L3A+DQotPHA+PGI+PGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9pbmRleC5odG1sIj5UaGUNCi1KYXZhIExhbmd1YWdlIFNwZWNpZmljYXRpb248L2E+PC9iPjxiciAvPg0KLVdyaXR0ZW4gYnkgdGhlIGNyZWF0b3JzIG9mIHRoZSBKYXZhIFByb2dyYW1taW5nIExhbmd1YWdlLCB0aGlzDQotb25saW5lIGJvb2sgaXMgY29uc2lkZXJlZCBieSBtYW55IHRvIGJlIHRoZSBiaWJsZSBmb3IgcHJvZ3JhbW1pbmcNCi1pbiBKYXZhLiBBIG11c3QgcmVhZC48L3A+DQotPHA+PGI+PGEgaHJlZj0NCi0iaHR0cDovL2phdmEuc3VuLmNvbS9wcm9kdWN0cy9qZGsvamF2YWRvYy9pbmRleC5odG1sIj5KYXZhZG9jPC9hPjwvYj48YnIgLz4NCi0NCi1KYXZhZG9jIGlzIHRoZSBhdXRvbWF0aWMgc29mdHdhcmUgZG9jdW1lbnRhdGlvbiBnZW5lcmF0b3IgdXNlZCBieQ0KLUphdmEsIHNpbmNlIGl0IHdhcyBmaXJzdCByZWxlYXNlZC4gQWxsIGNvZGUgd3JpdHRlbiBmb3IgdGhpcw0KLXByb2plY3QgbXVzdCBiZSBkb2N1bWVudGVkIHVzaW5nIEphdmFkb2MgY29udmVudGlvbnMuPC9wPg0KLTxwPjxiPjxhIGhyZWY9DQotImh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9jb2RlY29udi9odG1sL0NvZGVDb252VE9DLmRvYy5odG1sIj5UaGUNCi1KYXZhIENvZGUgQ29udmVudGlvbnM8L2E+PC9iPjxiciAvPg0KLVRoaXMgU3VuIGRvY3VtZW50IHNwZWNpZmllcyB0aGUgZGUtZmFjdG8gc3RhbmRhcmQgd2F5IG9mIGZvcm1hdHRpbmcNCi1KYXZhIGNvZGUuIEFsbCBjb2RlIHdyaXR0ZW4gZm9yIHRoaXMgcHJvamVjdCBtdXN0IGZvbGxvdyB0aGVzZQ0KLWNvbnZlbnRpb25zLjwvcD4NCi08cD48YSBocmVmPQ0KLSJodHRwOi8vc3ZuYm9vay5yZWQtYmVhbi5jb20vZW4vMS4xL3N2bi1ib29rLmh0bWwiPjxzdHJvbmc+VmVyc2lvbg0KLUNvbnRyb2wgd2l0aCBTdWJWZXJzaW9uPC9zdHJvbmc+PC9hPjxiciAvPg0KLVdyaXR0ZW4gYnkgQmVuIENvbGxpbnMtU3Vzc21hbiwgQnJpYW4gVy4gRml0enBhdHJpY2ssIEMuIE1pY2hhZWwNCi1QaWxhdG8uIEl0IHByb3ZpZGVzIGRldGFpbHMgb24gU1ZOIGZlYXR1cmVzLjwvcD4NCi08cD48L3A+DQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3JlbGVhc2UtcHJvY2Vzcy54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3JlbGVhc2UtcHJvY2Vzcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0ZGQ0MmQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9yZWxlYXNlLXByb2Nlc3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiINCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPg0KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4NCi08aGVhZD4NCi08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9DQotIkhUTUwgVGlkeSBmb3IgV2luZG93cyAodmVycyAxNCBKdW5lIDIwMDcpLCBzZWUgd3d3LnczLm9yZyIgLz4NCi08bWV0YSBodHRwLWVxdWl2PSJjb250ZW50LXR5cGUiIGNvbnRlbnQ9IiIgLz4NCi08dGl0bGU+QXhpczIgUmVsZWFzZSBQcm9jZXNzPC90aXRsZT4NCi08bGluayBocmVmPSJjc3MvYXhpcy1kb2NzLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyINCi1tZWRpYT0iYWxsIiAvPg0KLTwvaGVhZD4NCi08Ym9keT4NCi08aDE+UmVsZWFzZSBQcm9jZXNzPC9oMT4NCi08aDM+Q3V0dGluZyBhIGJyYW5jaDwvaDM+DQotPHVsPg0KLTxsaT5XaGVuIGEgcmVsZWFzZSBpcyByZWFkeSB0byBnbywgcmVsZWFzZSBtYW5hZ2VyIChSTSkgcHV0cw0KLWZvcndhcmQgYSByZWxlYXNlIHBsYW4gYXMgcGVyIHN0YW5kYXJkIEFwYWNoZSBwcm9jZXNzLCBpbmNsdWRpbmcNCi1kYXRlcy4gVGhpcyBnZXRzIFZPVEVkIG9uIGJ5IHRoZSBjb21taXR0ZXJzLiBEdXJpbmcgdGhpcyBwZXJpb2QgdGhlDQotdHJ1bmsgaXMgc3RpbGwgdGhlIG9ubHkgcmVsZXZhbnQgc291cmNlIGJhc2UuPC9saT4NCi08bGk+QXMgc29vbiBhcyBhIHJlbGVhc2UgaXMgYXBwcm92ZWQgKG9yIGV2ZW4gYmVmb3JlKSwgUk0gc2hvdWxkDQotYWRkIHRoZSBuZXcgdmVyc2lvbiBpbnRvIEpJUkEgYXMgYSB0YXJnZXQuPC9saT4NCi08bGk+QXQgdGhlIHBvaW50IHdoZXJlIHdlIHdvdWxkIG5vcm1hbGx5IGRvIHRoZSAiY29kZSBmcmVlemUiIGZvciBhDQotcmVsZWFzZSwgdGhlIFJNIGN1dHMgYSBicmFuY2ggbmFtZWQgZm9yIHRoZSByZWxlYXNlLiBUaGlzIGJyYW5jaCBpcw0KLXdoZXJlIHRoZSByZWxlYXNlIGNhbmRpZGF0ZXMgYW5kIHJlbGVhc2VzIHdpbGwgaGFwcGVuLjwvbGk+DQotPGxpPklkZWFsbHkgYSByZWxlYXNlIGJyYW5jaCBpcyBvbmx5IGFyb3VuZCBmb3IgYSB3ZWVrIG9yIG1heWJlIHR3bw0KLWJlZm9yZSB0aGUgcmVsZWFzZSBoYXBwZW5zLjwvbGk+DQotPGxpPlRoZSBvbmx5IHRoaW5ncyB0aGF0IHNob3VsZCBFVkVSIGdldCBjaGVja2VkIGludG8gdGhlIHJlbGVhc2UNCi1icmFuY2ggYXJlIC0gMSkgYnVnIGZpeGVzIHRhcmdldGVkIGF0IHRoZSByZWxlYXNlLCAyKQ0KLXJlbGVhc2Utc3BlY2lmaWMgdXBkYXRlcyAoZG9jdW1lbnRhdGlvbiwgU05BUFNIT1QgcmVtb3ZhbCwgZXRjKS4gSW4NCi1wYXJ0aWN1bGFyIG5ldyBmdW5jdGlvbmFsaXR5IGRvZXMgbm90IGdvIGhlcmUgdW5sZXNzIGl0IGlzIGENCi1zb2x1dGlvbiB0byBhIEpJUkEgcmVwb3J0IHRhcmdldGVkIGF0IHRoZSByZWxlYXNlLjwvbGk+DQotPGxpPk5vcm1hbCBkZXZlbG9wbWVudCBjb250aW51ZXMgb24gdGhlIHRydW5rLjwvbGk+DQotPC91bD4NCi08aDM+RGVwZW5kZW5jaWVzIGFuZCBicmFuY2hlczwvaDM+DQotPHVsPg0KLTxsaT5UaGUgdHJ1bmsgc2hvdWxkIGFsd2F5cyBiZSAiY3V0dGluZyBlZGdlIiBhbmQgYXMgc3VjaCBzaG91bGQNCi11c3VhbGx5IGJlIHBvaW50aW5nIGF0IFNOQVBTSE9UIHZlcnNpb25zIG9mIGFsbCBkZXBlbmRlbmNpZXMuIFRoaXMNCi1hbGxvd3MgZm9yIGNvbnRpbnVvdXMgaW50ZWdyYXRpb24gd2l0aCBvdXIgcGFydG5lciBwcm9qZWN0cy48L2xpPg0KLTxsaT5Tb29uIGFmdGVyIGEgcmVsZWFzZSBicmFuY2ggaXMgY3V0LCB0aGUgUk0gaXMgcmVzcG9uc2libGUgZm9yDQotcmVtb3ZpbmcgQUxMIGRlcGVuZGVuY2llcyBvbiBTTkFQU0hPVCB2ZXJzaW9ucyBhbmQgcmVwbGFjaW5nIHRoZW0NCi13aXRoIG9mZmljaWFsbHkgcmVsZWFzZWQgdmVyc2lvbnMuIFRoaXMgY2hhbmdlIGhhcHBlbnMgb25seSBvbiB0aGUNCi1yZWxlYXNlIGJyYW5jaC48L2xpPg0KLTwvdWw+DQotPGgzPk1hbmFnaW5nIGNoYW5nZSBhbmQgaXNzdWUgcmVzb2x1dGlvbiB3aXRoIGEgcmVsZWFzZSBicmFuY2g8L2gzPg0KLTx1bD4NCi08bGk+VGhlIFJNIGdvZXMgdGhyb3VnaCBKSVJBIGlzc3VlcyBhbmQgc2V0cyAiZml4IGZvciIgdG8gcG9pbnQgdG8NCi1ib3RoICJOSUdIVExZIiBhbmQgdGhlIG5ldyBicmFuY2hlZCByZWxlYXNlIG51bWJlciBmb3IgdGhlIGZpeGVzDQotdGhhdCBhcmUgdGFyZ2V0ZWQgZm9yIHRoZSByZWxlYXNlIGFmdGVyIHRoZSBicmFuY2ggaXMgY3V0LjwvbGk+DQotPGxpPkluIGdlbmVyYWwsIHRoZSBhc3NpZ25lZS9jb2RlciBmaXhlcyBKSVJBIGlzc3VlcyBvciBtYWtlcyBvdGhlcg0KLWNoYW5nZXMgKm9uIHRoZSB0cnVuayouIElmIHRoZSBKSVJBIGlzc3VlIGlzIHRhcmdldGVkIGF0IHRoZQ0KLXJlbGVhc2UsIG9yIHVwb24gY29kZXIncyBkaXNjcmV0aW9uLCB0aGV5IHRoZW4gbWVyZ2UgdGhlIGZpeCBvdmVyDQotdG8gdGhlIHJlbGVhc2UgYnJhbmNoLjwvbGk+DQotPGxpPlRoaXMgd2F5IHRoZSB0cnVuayBpcyBBTFdBWVMgdXAtdG8tZGF0ZSwgYW5kIHdlIGRvbid0IGhhdmUgdG8NCi13b3JyeSBhYm91dCBsb3NpbmcgZml4ZXMgdGhhdCBoYXZlIG9ubHkgYmVlbiBtYWRlIG9uIHRoZSByZWxlYXNlDQotYnJhbmNoLjwvbGk+DQotPGxpPldoZW4gdGhlIGFzc2lnbmVlIHJlc29sdmVzIGFuIGlzc3VlLCB0aGV5IGNvbmZpcm0gaXQncyBiZWVuDQotZml4ZWQgaW4gYm90aCBicmFuY2hlcywgaWYgYXBwcm9wcmlhdGUuPC9saT4NCi08L3VsPg0KLTxoMz5DaGVja2luZyBjaGFuZ2VzIGludG8gdGhlIGJyYW5jaDwvaDM+DQotPHVsPg0KLTxsaT5JZiBidWcgZml4ZXMgYXJlIG5lZWRlZCBsYXRlciBmb3IgYSByZWxlYXNlIHdoaWNoIGhhcyBsb25nDQotc2luY2UgaGFwcGVuZWQgKHRvIGZpeCB1c2VyIGlzc3VlcywgZXRjKSwgdGhvc2UgZml4ZXMgZ2VuZXJhbGx5DQotc2hvdWxkIGFsc28gaGFwcGVuIG9uIHRoZSB0cnVuayBmaXJzdCBhc3N1bWluZyB0aGUgcHJvYmxlbSBzdGlsbA0KLWV4aXN0cyBvbiB0aGUgdHJ1bmsuPC9saT4NCi08bGk+VGhlcmUgYXJlIG9ubHkgdHdvIGNhc2VzIHdoZXJlIHdlIHdvdWxkIGV2ZXIgY2hlY2sgYW55dGhpbmcNCi1pbnRvIHRoZSBicmFuY2ggd2l0aG91dCBmaXJzdCBjaGVja2luZyBpdCBpbnRvIHRoZSB0cnVuay4gMSkNCi1SZWxlYXNlIHNwZWNpZmljIGl0ZW1zIChyZWxlYXNlIG51bWJlciByZWZlcmVuY2VzLCByZWxlYXNlIG5vdGVzLA0KLXJlbW92YWwgb2YgU05BUFNIT1RzKSwgYW5kIDIpIGlmIHRoZSB0cnVuayBoYXMgbW92ZWQgb24gaW4gc29tZQ0KLWluY29tcGF0aWJsZSB3YXkuPC9saT4NCi08L3VsPg0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9zaXRlSG93VG8ueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9zaXRlSG93VG8ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDg0N2FjLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3Mvc2l0ZUhvd1RvLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0KLSJIVE1MIFRpZHkgZm9yIFdpbmRvd3MgKHZlcnMgMTQgSnVuZSAyMDA3KSwgc2VlIHd3dy53My5vcmciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJjb250ZW50LXR5cGUiIGNvbnRlbnQ9IiIgLz4KLTx0aXRsZT5Ib3cgVG8gQnVpbGQgQXhpcyBQcm9qZWN0J3MgV2Vic2l0ZTwvdGl0bGU+Ci08bGluayBocmVmPSJjc3MvYXhpcy1kb2NzLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIKLW1lZGlhPSJhbGwiIC8+Ci08L2hlYWQ+Ci08Ym9keT4KLTxoMT5Ib3cgdG8gQnVpbGQgdGhlIEF4aXMyIFByb2plY3QncyBXZWJzaXRlPC9oMT4KLTxoMj5JbnN0YWxsaW5nIE1hdmVuMjwvaDI+Ci08cD5UaGUgQXhpcyAyLjAgd2Vic2l0ZSBidWlsZCBzeXN0ZW0gc29sZWx5IGRlcGVuZHMgb24gPGEgaHJlZj0KLSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy8iPk1hdmVuMjwvYT4uIFRoZSBidWlsZCBoYXMgYmVlbgotc3BlY2lmaWNhbGx5IHRlc3RlZCB0byB3b3JrIHdpdGggTWF2ZW4gdmVyc2lvbiAyLjAuNy4gVG8gaW5zdGFsbAotTWF2ZW4sIGRvd25sb2FkIHRoZSBkaXN0cmlidXRpb25zIGFuZCBmb2xsb3cgdGhlIGluc3RydWN0aW9ucyBpbgotdGhlIGRvY3VtZW50YXRpb24uIE1ha2Ugc3VyZSB5b3UgZG9uJ3QgZm9yZ2V0IHRvIGFkZCBNQVZFTl9IT01FL2JpbgotZGlyZWN0b3J5IGluIHRoZSBwYXRoLjwvcD4KLTxoMj5DaGVja2luZyBvdXQgQXhpcyAyLjA8L2gyPgotPHA+Q2hlY2tvdXQgdGhlIDxhIGhyZWY9Ci0iaHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi93ZWJzZXJ2aWNlcy9heGlzMi90cnVuay9qYXZhIj5sYXRlc3QKLXNvdXJjZTwvYT4gdXNpbmcgeW91ciBmYXZvcml0ZSBTVk4gY2xpZW50LiBJZiB5b3UgYXJlIGEgY29tbWl0dGVyLAotZ2V0IGEgPGEgaHJlZj0KLSJodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi93ZWJzZXJ2aWNlcy9heGlzMi90cnVuay9qYXZhIj5jb21taXRlcgotY2hlY2sgb3V0LjwvYT48L3A+Ci08aDI+QnVpbGRpbmcgdGhlIFNpdGU8L2gyPgotPHA+Y2QgdG8gbW9kdWxlcy9kb2N1bWVudGF0aW9uIGFuZCB0eXBlIDxpPm12biBpbnN0YWxsPC9pPiBUaGUgYnVpbHQKLXNpdGUgd2lsbCBiZSBhdmFpbGFibGUgdW5kZXIgdGFyZ2V0L3NpdGUuPC9wPgotPGgyPkZBUTwvaDI+Ci08b2w+Ci08bGk+SG93IGNhbiBJIHVwZGF0ZSBhIGRvY3VtZW50IGluIHRoZSBzaXRlID88YnIgLz4KLUdldCBhIGNvbW1pdGVyIGNoZWNrIG91dC4gQWxsIHRoZSBkb2N1bWVudHMgYXJlIGluIFhIVE1MIGZvcm1hdAotdW5kZXIgdGhlIG1vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcyBmb2xkZXIsIGFuZCB5b3UgY2FuIGNoYW5nZSBvbmx5IHRoZSBkb2N1bWVudHMgZm91bmQKLXVuZGVyIHRoaXMgZm9sZGVyLiBDaGFuZ2UgdGhlIHJlbGV2YW50IGZpbGUgYW5kIHJ1biA8aT5tdm4KLWluc3RhbGw8L2k+LiBOZXcgZG9jdW1lbnRhdGlvbiB3aWxsIGJlIGF2YWlsYWJsZSB1bmRlcgotdGhlIHRhcmdldCBmb2xkZXIuPC9saT4KLTxsaT5Ib3cgY2FuIEkgYWRkIGEgbmV3IGRvY3VtZW50PzxiciAvPgotQWRkIHRoZSBuZXcgZG9jdW1lbnQgaW4gdGhlIHhkb2NzIGZvbGRlci4gQ2hhbmdlIHRoZSBuYXZpZ2F0aW9uLnhtbAotZm91bmQgdW5kZXIgdGhlIHhkb2NzIGZvbGRlciBieSBhZGRpbmcgYSBsaW5rIHRvIHRoZSBuZXdseSBhZGRlZAotZG9jdW1lbnQuIFJlLWdlbmVyYXRlIHRoZSBzaXRlLjxiciAvPgotUGxlYXNlIG1ha2Ugc3VyZSB5b3UgaGF2ZSBub3QgaW5jbHVkZWQgYW55IG9mIHRoZSBpbGxlZ2FsCi1jaGFyYWN0ZXJzIGFuZCB5b3VyIGRvY3VtZW50IHNob3VsZCBiZSB3ZWxsIGZvcm1lZC48L2xpPgotPC9vbD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3Mvc3R5bGUvbWF2ZW4tdGhlbWUuY3NzIGIvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9zdHlsZS9tYXZlbi10aGVtZS5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyNWVmZmIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9zdHlsZS9tYXZlbi10aGVtZS5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLWJvZHksIHRkLCBzZWxlY3QsIGlucHV0LCBsaXsKLSAgZm9udC1mYW1pbHk6IFZlcmRhbmEsIEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWY7Ci0gIGZvbnQtc2l6ZTogMTNweDsKLX0KLWEgewotICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci1hOmxpbmsgewotICBjb2xvcjojMzZhOwotfQotYTp2aXNpdGVkICB7Ci0gIGNvbG9yOiM0N2E7Ci19Ci1hOmFjdGl2ZSwgYTpob3ZlciB7Ci0gIGNvbG9yOiM2OWM7Ci19Ci1hLmV4dGVybmFsTGluaywgYS5leHRlcm5hbExpbms6bGluaywgYS5leHRlcm5hbExpbms6dmlzaXRlZCwgYS5leHRlcm5hbExpbms6YWN0aXZlLCBhLmV4dGVybmFsTGluazpob3ZlciB7Ci0gIGJhY2tncm91bmQ6IHVybCguLi9pbWFnZXMvZXh0ZXJuYWwucG5nKSByaWdodCBjZW50ZXIgbm8tcmVwZWF0OwotICBwYWRkaW5nLXJpZ2h0OiAxNXB4OwotfQotYS5uZXdXaW5kb3csIGEubmV3V2luZG93OmxpbmssIGEubmV3V2luZG93OnZpc2l0ZWQsIGEubmV3V2luZG93OmFjdGl2ZSwgYS5uZXdXaW5kb3c6aG92ZXIgewotICBiYWNrZ3JvdW5kOiB1cmwoLi4vaW1hZ2VzL25ld3dpbmRvdy5wbmcpIHJpZ2h0IGNlbnRlciBuby1yZXBlYXQ7Ci0gIHBhZGRpbmctcmlnaHQ6IDE4cHg7Ci19Ci1oMiB7Ci1iYWNrZ3JvdW5kLWltYWdlOiB1cmwoLi4vaW1hZ2VzL2gyLWJnLmdpZik7IAotCWJhY2tncm91bmQtcmVwZWF0OiByZXBlYXQteDsgCi0JYmFja2dyb3VuZC1hdHRhY2htZW50OiBzY3JvbGw7IAotCWJhY2tncm91bmQtcG9zaXRpb246IGxlZnQgdG9wOyAKLQloZWlnaHQ6IDIwcHg7Ci0gIHBhZGRpbmc6IDRweCA0cHggNHB4IDZweDsKLSAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNjY2NjY2M7Ci0gIGNvbG9yOiAjMzMzMzMzOwotICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOwotICBmb250LXdlaWdodDo5MDA7Ci0gIGZvbnQtc2l6ZTogbGFyZ2U7Ci19Ci1oMyB7Ci1wYWRkaW5nOiA0cHggNHB4IDJweCA2cHg7Ci0gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjY2NjY2NjOwotICBib3JkZXItdG9wOiAwcHggc29saWQgI2NjY2NjYzsKLSAgYm9yZGVyLWxlZnQ6IDBweCBzb2xpZCAjY2NjY2NjOwotICBib3JkZXItcmlnaHQ6IDBweCBzb2xpZCAjY2NjY2NjOwotICBjb2xvcjogIzY2NjY2NjsKLSAgZm9udC13ZWlnaHQ6IHNlbWktYm9sZDsKLSAgZm9udC1zaXplOiBub3JtYWw7Ci19Ci1wIHsKLSAgbGluZS1oZWlnaHQ6IDEuM2VtOwotICBmb250LXNpemU6IHNtYWxsOwotfQotI2Jhbm5lciB7IAotCWJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7IAotCWJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZmZmOyAKLX0KLSNicmVhZGNydW1icyB7Ci0gIGJvcmRlci10b3A6IDFweCBzb2xpZCAjYWFhOwotICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoLi4vaW1hZ2VzL2JyZWFkY3J1bWJzLWJnLmdpZik7IAotCWJhY2tncm91bmQtcmVwZWF0OiByZXBlYXQteDsgCi0JYmFja2dyb3VuZC1hdHRhY2htZW50OiBzY3JvbGw7IAotCWJhY2tncm91bmQtcG9zaXRpb246IGxlZnQgdG9wOyAKLQloZWlnaHQ6IDI4cHg7Ci19Ci0jbGVmdENvbHVtbiB7Ci0gIG1hcmdpbjogNXB4IDAgMCAxMHB4OwotICBib3JkZXI6IDFweCBzb2xpZCAjYjViNWI1OwotICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOwotICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoLi4vaW1hZ2VzL2xlZnRjb2x1bW4tYmcuZ2lmKTsgCi0JYmFja2dyb3VuZC1yZXBlYXQ6IHJlcGVhdC14OyAKLQliYWNrZ3JvdW5kLWF0dGFjaG1lbnQ6IHNjcm9sbDsgCi0JYmFja2dyb3VuZC1wb3NpdGlvbjogbGVmdCB0b3A7Ci19Ci0jbmF2Y29sdW1uIGg1IHsKLSAgZm9udC1zaXplOiBzbWFsbGVyOwotICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2FhYWFhYTsKLSAgcGFkZGluZy10b3A6IDRweDsKLSAgcGFkZGluZy1ib3R0b206IDRweDsKLX0KLQotdGFibGUuYm9keVRhYmxlIHRoIHsKLSAgY29sb3I6IHdoaXRlOwotICBiYWNrZ3JvdW5kLWNvbG9yOiAjYmJiOwotICB0ZXh0LWFsaWduOiBsZWZ0OwotICBmb250LXdlaWdodDogYm9sZDsKLX0KLQotdGFibGUuYm9keVRhYmxlIHRoLCB0YWJsZS5ib2R5VGFibGUgdGQgewotICBmb250LXNpemU6IDFlbTsKLX0KLQotdGFibGUuYm9keVRhYmxlIHRyLmEgewotICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGRkOwotfQotCi10YWJsZS5ib2R5VGFibGUgdHIuYiB7Ci0gIGJhY2tncm91bmQtY29sb3I6ICNlZWU7Ci19Ci0KLS5zb3VyY2UgewotICBib3JkZXI6IDFweCBzb2xpZCAjOTk5OwotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9zdm4ueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9zdm4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YmE1NWQ2Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3Mvc3ZuLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIg0KLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+DQotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPg0KLTxoZWFkPg0KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0NCi0iSFRNTCBUaWR5IGZvciBXaW5kb3dzICh2ZXJzIDE0IEp1bmUgMjAwNyksIHNlZSB3d3cudzMub3JnIiAvPg0KLTxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0iIiAvPg0KLTx0aXRsZT5EZXZlbG9waW5nIEFwYWNoZSBBeGlzMjwvdGl0bGU+DQotPGxpbmsgaHJlZj0iY3NzL2F4aXMtZG9jcy5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiDQotbWVkaWE9ImFsbCIgLz4NCi08L2hlYWQ+DQotPGJvZHkgbGFuZz0iZW4iIHhtbDpsYW5nPSJlbiI+DQotPGgxPkRldmVsb3BpbmcgQXBhY2hlIEF4aXMyPC9oMT4NCi08cD5UaGlzIGRvY3VtZW50IHByb3ZpZGVzIGluZm9ybWF0aW9uIG9uIGhvdyB0byB1c2UgU1ZOIHRvIGdldCBhbg0KLVNWTiBjaGVja291dC91cGRhdGUsIG1ha2UgY29tbWl0cyB0byB0aGUgcmVwb3NpdG9yeSwgZXRjLiwgaW4gdGhlDQotcHJvY2VzcyBvZiBjb250cmlidXRpbmcgdG8gQXBhY2hlIHByb2plY3RzIChzcGVjaWZpY2FsbHkgQXhpczIpLg0KLUluc3RydWN0aW9ucyBvbiBjb25maWd1cmluZyBJREVzIGZvciBkZXZlbG9wbWVudCBhbmQgdXNpbmcgTWF2ZW4gdG8NCi1idWlsZCB0aGUgcHJvamVjdCBpcyBhbHNvIGluY2x1ZGVkIGhlcmUuPC9wPg0KLTxoMj5Db250ZW50PC9oMj4NCi08dWw+DQotPGxpPjxhIGhyZWY9IiNzdm4iPldvcmtpbmcgd2l0aCBTdWJ2ZXJzaW9uIChTVk4pPC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9IiNjaGVja291dCI+Q2hlY2tvdXQgQXhpczIgZnJvbSBTdWJ2ZXJzaW9uPC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9IiNtYXZlbiI+SW5zdGFsbGluZyBNYXZlbiAyPC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9IiNpZGUiPkNvbmZpZ3VyaW5nIHlvdXIgSURFPC9hPjwvbGk+DQotPC91bD4NCi08YSBuYW1lPSJzdm4iIGlkPSJzdm4iPjwvYT4NCi08aDI+V29ya2luZyB3aXRoIFN1YnZlcnNpb24gKFNWTik8L2gyPg0KLTxwPlRoZSBBeGlzMiBkZXZlbG9wbWVudCB0ZWFtIHVzZXMgU3VidmVyc2lvbiAoU1ZOKSBmb3Igc291cmNlDQotY29udHJvbC4gU3VidmVyc2lvbiBpcyBhIGNvbXBlbGxpbmcgcmVwbGFjZW1lbnQgZm9yIENWUywgZGV2ZWxvcGVkDQotdW5kZXIgdGhlIGF1c3BpY2VzIG9mIHRoZSBUaWdyaXMgY29tbXVuaXR5IGFuZCBsaWNlbnNlZCB1bmRlciBhbg0KLUFwYWNoZSBjb21wYXRpYmxlIGxpY2Vuc2UuIFRvIGxlYXJuIG1vcmUgYWJvdXQgU3VidmVyc2lvbiBvciB0bw0KLWRvd25sb2FkIHRoZSBsYXRlc3QgZGlzdHJpYnV0aW9uLCB2aXNpdCB0aGUgPGEgaHJlZj0NCi0iaHR0cDovLy9zdWJ2ZXJzaW9uLnRpZ3Jpcy5vcmciIHRhcmdldD0iX2JsYW5rIj5TdWJ2ZXJzaW9uIHByb2plY3QNCi1zaXRlPC9hPi4gSWYgeW91IGFyZSBsb29raW5nIGZvciBndWlkYW5jZSBvbiBzZXR0aW5nIHVwIGFuZA0KLWluc3RhbGxpbmcgU3VidmVyc2lvbiwgcGxlYXNlIHJlYWQgdGhlIEFTRiA8YSBocmVmPQ0KLSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGV2L3ZlcnNpb24tY29udHJvbC5odG1sIiB0YXJnZXQ9DQotIl9ibGFuayI+U291cmNlIENvZGUgUmVwb3NpdG9yaWVzIHBhZ2U8L2E+LjwvcD4NCi08YSBuYW1lPSJjaGVja291dCIgaWQ9ImNoZWNrb3V0Ij48L2E+DQotPGgyPkNoZWNrb3V0IEF4aXMyIGZyb20gU3VidmVyc2lvbjwvaDI+DQotPHA+VG8gY2hlY2sgb3V0IHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBBeGlzMiBmcm9tIHRoZSBGb3VuZGF0aW9uJ3MNCi1TdWJ2ZXJzaW9uIHJlcG9zaXRvcnksIHlvdSBtdXN0IHVzZSBvbmUgb2YgdGhlIGZvbGxvd2luZyBVUkxzDQotZGVwZW5kaW5nIG9uIHlvdXIgbGV2ZWwgb2YgYWNjZXNzIHRvIHRoZSBBeGlzMiBzb3VyY2UgY29kZTo8L3A+DQotPHVsPg0KLTxsaT48Yj5JZiB5b3UgYXJlIG5vdCBhIGNvbW1pdHRlcjo8L2I+IDxhIGhyZWY9DQotImh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2Yvd2Vic2VydmljZXMvYXhpczIvdHJ1bmsvamF2YSINCi10YXJnZXQ9DQotIl9ibGFuayI+aHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi93ZWJzZXJ2aWNlcy9heGlzMi90cnVuay9qYXZhPC9hPjwvbGk+DQotPGxpPjxiPklmIHlvdSBhcmUgYSBjb21taXR0ZXI6PC9iPiA8YSBocmVmPQ0KLSJodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi93ZWJzZXJ2aWNlcy9heGlzMi90cnVuay9qYXZhIg0KLXRhcmdldD0NCi0iX2JsYW5rIj5odHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi93ZWJzZXJ2aWNlcy9heGlzMi90cnVuay9qYXZhPC9hPjwvbGk+DQotPC91bD4NCi1JZiB5b3UgYXJlIGEgY29tbWl0dGVyLCBtYWtlIHN1cmUgdGhhdCB5b3UgaGF2ZSBzZWxlY3RlZCBhbg0KLXN2bnBhc3N3ZC4gVG8gZG8gdGhpcywgeW91IG11c3QgbG9nIGludG8gc3ZuLmFwYWNoZS5vcmcuIEZvciBtb3JlDQotaW5mb3JtYXRpb24sIHBsZWFzZSByZWFkIHRoZSBBU0YgPGEgaHJlZj0NCi0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rldi92ZXJzaW9uLWNvbnRyb2wuaHRtbCIgdGFyZ2V0PQ0KLSJfYmxhbmsiPlNvdXJjZSBDb2RlIFJlcG9zaXRvcmllcyBwYWdlPC9hPi4NCi08cD5PbmNlIHlvdSBoYXZlIHN1Y2Nlc3NmdWxseSBpbnN0YWxsZWQgU3VidmVyc2lvbiwgeW91IGNhbiBjaGVjaw0KLW91dCBBeGlzMiB0cnVuayBieSBmb2xsb3dpbmcgdGhlc2Ugc3RlcHM6PC9wPg0KLTxvbCB0eXBlPSIxIj4NCi08bGk+UnVuIDxzdHJvbmc+c3ZuIGNvICZsdDtyZXBvc2l0b3J5IFVSTCZndDsgYXhpczI8L3N0cm9uZz4gd2hlcmUNCi10aGUgcmVwb3NpdG9yeSBVUkwgaXMgb25lIG9mIHRoZSBVUkxzIGZyb20gdGhlIHByZXZpb3VzIGxpc3QuPC9saT4NCi08bGk+VGhpcyBzdGVwIHdpbGwgY2hlY2sgb3V0IHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGUgQXhpczIgSmF2YQ0KLWNvZGViYXNlIHRvIGEgZGlyZWN0b3J5IG5hbWVkICJheGlzMiIuIFRoZSBzZWNvbmQgcGFyYW1ldGVyIHRvIHRoZQ0KLTxzdHJvbmc+c3ZuIGNvPC9zdHJvbmc+IHNlbGVjdHMgYSBkaXJlY3RvcnkgdG8gY3JlYXRlIG9uIHlvdXIgbG9jYWwNCi1tYWNoaW5lLiBJZiB5b3Ugd2FudCB0byBjaGVja291dCBBeGlzMiB0byBhIGRpZmZlcmVudCBkaXJlY3RvcnksDQotZmVlbCBmcmVlIHRvIGNoYW5nZSBheGlzMiB0byBhbnkgb3RoZXIgZGlyZWN0b3J5IG5hbWUuPC9saT4NCi08bGk+VG8gdXBkYXRlIHlvdXIgd29ya2luZyBjb3B5IHRvIHRoZSBsYXRlc3QgdmVyc2lvbiBmcm9tIHRoZQ0KLXJlcG9zaXRvcnksIGV4ZWN1dGUgdGhlIDxzdHJvbmc+c3ZuIHVwZGF0ZTwvc3Ryb25nPiBjb21tYW5kLjwvbGk+DQotPGxpPklmIHlvdSB3b3VsZCBsaWtlIHRvIHN1Ym1pdCBhIHBhdGNoLCB5b3UgY2FuIGV4ZWN1dGUNCi08c3Ryb25nPnN2biBkaWZmPC9zdHJvbmc+IHRvIGNyZWF0ZSBhIHVuaWZpZWQgZGlmZiBmb3Igc3VibWlzc2lvbg0KLXRvIHRoZSBBeGlzMiBKSVJBIGlzc3VlIHRyYWNrZXIuPC9saT4NCi08L29sPg0KLTxhIG5hbWU9Im1hdmVuIiBpZD0ibWF2ZW4iPjwvYT4NCi08aDI+SW5zdGFsbGluZyBNYXZlbiAyPC9oMj4NCi08cD5BeGlzMidzIGJ1aWxkIGlzIGJhc2VkIG9uIE1hdmVuIDIuIE1hdmVuIGlzIGEgYnVpbGQgc3lzdGVtIHRoYXQNCi1hbGxvd3MgZm9yIHRoZSByZXVzZSBvZiBjb21tb24gYnVpbGQgcHJvamVjdHMgYWNyb3NzIG11bHRpcGxlDQotcHJvamVjdHMuIEZvciBpbmZvcm1hdGlvbiBhYm91dCBvYnRhaW5pbmcsIGluc3RhbGxpbmcsIGFuZA0KLWNvbmZpZ3VyaW5nIE1hdmVuIDIsIHBsZWFzZSBzZWUgdGhlIDxhIGhyZWY9DQotImh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnIiB0YXJnZXQ9Il9ibGFuayI+TWF2ZW4gcHJvamVjdCBwYWdlPC9hPi4NCi1UbyB1c2UgTWF2ZW4gdG8gYnVpbGQgdGhlIEF4aXMyIHByb2plY3QsIFBsZWFzZSBpbnN0YWxsIDxhIGhyZWY9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL2Rvd25sb2FkLmh0bWwiIHRhcmdldD0NCi0iX2JsYW5rIj5NYXZlbjI8L2E+IGFuZCBmb2xsb3cgaW5zdHJ1Y3Rpb25zIGhlcmUgLSAgPGEgaHJlZj0ibWF2ZW4taGVscC5odG1sIj5RdWljayBHdWlkZSB0byBNYXZlbiBmb3IgQXhpcyAyLjA8L2E+PC9wPi4NCi08YSBuYW1lPSJpZGUiIGlkPSJpZGUiPjwvYT4NCi08aDI+Q29uZmlndXJpbmcgeW91ciBJREU8L2gyPg0KLTxwPlRoZSBBeGlzMiBkZXZlbG9wbWVudCB0ZWFtIHVzZXMgYSB2YXJpZXR5IG9mIGRldmVsb3BtZW50IHRvb2xzDQotZnJvbSB2aSB0byBlbWFjcyB0byBlY2xpcHNlIHRvIEludGVsbGlqL0lERUEuIFRoZSBmb2xsb3dpbmcgc2VjdGlvbg0KLWlzIG5vdCBhbiBlbmRvcnNlbWVudCBvZiBhIHNwZWNpZmljIHNldCBvZiB0b29scywgaXQgaXMgc2ltcGx5DQotbWVhbnQgYXMgYSBwb2ludGVyIHRvIGVhc2UgdGhlIHByb2Nlc3Mgb2YgZ2V0dGluZyBzdGFydGVkIHdpdGgNCi1BeGlzMiBkZXZlbG9wbWVudC48L3A+DQotPHVsPg0KLTxsaT48c3Ryb25nPkludGVsbGlqIElERUE8L3N0cm9uZz4gLSB0eXBlIDxzdHJvbmc+bXZuDQotaWRlYTppZGVhPC9zdHJvbmc+LiBHZW5lcmF0ZXMgdGhlIG5lY2Vzc2FyeSBJREVBIC5pcHIsIC5pbWwNCi1hbmQgLml3cyBwcm9qZWN0IGZpbGVzPC9saT4NCi08bGk+PHN0cm9uZz5FY2xpcHNlPC9zdHJvbmc+LSB0eXBlIDxzdHJvbmc+bXZuIGVjbGlwc2U6ZWNsaXBzZTwvc3Ryb25nPi4gVGhlbiBpbiBFY2xpcHNlLCBzZXR1cCBhIENsYXNzcGF0aCBWYXJpYWJsZQ0KLWZvciBNQVZFTl9SRVBPLCBhbmQgc2VsZWN0IEZpbGUgJmd0OyBJbXBvcnQgJmd0OyBFeGlzdGluZyBQcm9qZWN0cw0KLWludG8gV29ya3NwYWNlICZndDsgU2VsZWN0IHJvb3QgZGlyZWN0b3J5LiBTZWxlY3RpbmcgdGhlIHJvb3Qgb2YNCi10aGUgQXhpcyBzb3VyY2UgZGlzY292ZXJzIGFsbCB0aGUgbW9kdWxlcyBhbmQgYWxsb3dzIHRoZW0gdG8gYmUNCi1pbXBvcnRlZCBhcyBpbmRpdmlkdWFsIHByb2plY3RzIGF0IG9uY2UuPC9saT4NCi08L3VsPg0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90aGFua3MueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90aGFua3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjNmZjA0Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdGhhbmtzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGRvY3VtZW50PgotICA8cHJvcGVydGllcz4KLSAgICA8YXV0aG9yIGVtYWlsPSJkaW1zQGFwYWNoZS5vcmciPkRhdmFudW0gU3Jpbml2YXM8L2F1dGhvcj4KLSAgICA8dGl0bGU+U3BlY2lhbCBUaGFua3MhPC90aXRsZT4KLSAgPC9wcm9wZXJ0aWVzPiAKLSAgCi0gIDxib2R5PgotCi0gICAgPHNlY3Rpb24gbmFtZT0iU3BlY2lhbCBUaGFua3MgdG8gLi4uIj4KLSAgICAgICAgPHRhYmxlPgotICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgIDx0aD5Db21wYW55PC90aD4KLSAgICAgICAgICAgIDx0aD5Eb25hdGlvbiBUeXBlPC90aD4KLSAgICAgICAgICA8L3RyPgotICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgIDx0ZD48QSBocmVmPSJodHRwOi8vd3d3LmpldGJyYWlucy5jb20vIj48aW1nIGhlaWdodD0iNTEiIHdpZHRoPSIyMDAiIHNyYz0iaHR0cDovL3d3dy5qZXRicmFpbnMuY29tL2ltZy9sb2dvcy9sb2dvX2ludGVsbGlqX2lkZWEuZ2lmIi8+PC9BPjwvdGQ+Ci0gICAgICAgICAgICA8dGQ+TGljZW5zZXMgZm9yIElERUE8L3RkPgotICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgPHRyPgotICAgICAgICAgICAgPHRkPjxBIGhyZWY9Imh0dHA6Ly93d3cueW91cmtpdC5jb20vIj48aW1nIGhlaWdodD0iNTEiIHdpZHRoPSIyMDAiIHNyYz0iaHR0cDovL2RiLmFwYWNoZS5vcmcvb2piL2ltYWdlcy95anAuZ2lmIi8+PC9BPjwvdGQ+Ci0gICAgICAgICAgICA8dGQ+TGljZW5zZXMgZm9yIFlvdXJLaXQ8L3RkPgotICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgPHRyPgotICAgICAgICAgICAgPHRkPjxBIGhyZWY9Imh0dHA6Ly93d3cuZWotdGVjaG5vbG9naWVzLmNvbS9wcm9kdWN0cy9qcHJvZmlsZXIvb3ZlcnZpZXcuaHRtbCI+PGltZyBoZWlnaHQ9IjUxIiB3aWR0aD0iMjAwIiBzcmM9Imh0dHA6Ly93d3cuZWotdGVjaG5vbG9naWVzLmNvbS9pbWFnZXMvcHJvZHVjdHMvbG9nb19qcHJvZmlsZXIwMS5naWYiLz48L0E+PC90ZD4KLSAgICAgICAgICAgIDx0ZD5MaWNlbnNlcyBmb3IgSlByb2ZpbGVyPC90ZD4KLSAgICAgICAgICA8L3RyPgotPHRyPgotICAgICAgICAgICAgPHRkPjxBIGhyZWY9Imh0dHA6Ly93d3cuYWx0b3ZhLmNvbS8iPjxpbWcgaGVpZ2h0PSI1MSIgd2lkdGg9IjIwMCIgc3JjPSJodHRwOi8vd3d3LmFsdG92YS5jb20vaW1hZ2VzL2xvZ29zL0FsdG92YV9Mb2dvX0NNWUsuZ2lmIi8+PC9BPjwvdGQ+Ci0gICAgICAgICAgICA8dGQ+TGljZW5zZXMgZm9yIEFsdG92YSBYTUxTcHk8L3RkPgotICAgICAgICAgIDwvdHI+Ci0gICAgICAgIDwvdGFibGU+Ci0gICAgPC9zZWN0aW9uPgotICA8L2JvZHk+Ci08L2RvY3VtZW50PgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvQ29kZWdlblRvb2xSZWZlcmVuY2UueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvQ29kZWdlblRvb2xSZWZlcmVuY2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjcxYzgwLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L0NvZGVnZW5Ub29sUmVmZXJlbmNlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDk3MSArMCwwIEBACi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIg0KLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+DQotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPg0KLTxoZWFkPg0KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0NCi0iSFRNTCBUaWR5IGZvciBXaW5kb3dzICh2ZXJzIDE0IEp1bmUgMjAwNyksIHNlZSB3d3cudzMub3JnIiAvPg0KLTxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0iIiAvPg0KLTx0aXRsZT5Db2RlIEdlbmVyYXRvciBUb29sIEd1aWRlIGZvciBDb21tYW5kIExpbmUgYW5kIEFudA0KLVRhc2s8L3RpdGxlPg0KLTxsaW5rIGhyZWY9Ii4uLy4uL2Nzcy9heGlzLWRvY3MuY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9DQotInRleHQvY3NzIiBtZWRpYT0iYWxsIiAvPg0KLTwvaGVhZD4NCi08Ym9keSBsYW5nPSJlbiIgeG1sOmxhbmc9ImVuIj4NCi08aDE+Q29kZSBHZW5lcmF0b3IgVG9vbCBHdWlkZSBmb3IgQ29tbWFuZCBMaW5lIGFuZCBBbnQgVGFzazwvaDE+DQotPHA+VGhlIENvZGUgR2VuZXJhdG9yIHRvb2wgY29uc2lzdHMgb2YgYSBjb21tYW5kIGxpbmUgdmVyc2lvbiBhbmQNCi1hbiBBbnQgVGFzay4gVGhpcyBkb2N1bWVudCB3aWxsIGxpc3QgdGhlIGNvbW1hbmQgbGluZSByZWZlcmVuY2VzDQotYW5kIEFudCB0YXNrIHJlZmVyZW5jZXMuIEFsc28gaW4gZGV0YWlsLCB0aGlzIGRvY3VtZW50IHNob3dzIGhvdyB0bw0KLWJ1aWxkIGZpbGUgdXNpbmcgY3VzdG9tIEFudCB0YXNrIGFuZCBpbnZva2luZyB0aGUgQ29kZSBHZW5lcmF0b3INCi1mcm9tIEFudC48L3A+DQotPHA+VGhpcyB0b29sIGlzIGJ1bmRsZWQgd2l0aCB0aGUgPGEgaHJlZj0NCi0iaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvZG93bmxvYWQuY2dpIj5BeGlzMiBCaW5hcnkNCi1EaXN0cmlidXRpb248L2E+LjwvcD4NCi08aDI+Q29udGVudDwvaDI+DQotPHVsPg0KLTxsaT48YSBocmVmPSIjaW50cm8iPkludHJvZHVjdGlvbjwvYT48L2xpPg0KLTxsaT48YSBocmVmPSIjY21kbGluZSI+Q29tbWFuZCBMaW5lIFZlcnNpb248L2E+DQotPHVsPg0KLTxsaT48YSBocmVmPSIjY21kcmVmIj5PcHRpb24gUmVmZXJlbmNlPC9hPjwvbGk+DQotPC91bD4NCi08L2xpPg0KLTxsaT48YSBocmVmPSIjYW50Ij5BbnQgVGFzazwvYT4NCi08dWw+DQotPGxpPjxhIGhyZWY9IiNhbnRyZWYiPkFudCBUYXNrIFJlZmVyZW5jZTwvYT48L2xpPg0KLTxsaT48YSBocmVmPSIjZXhhbXBsZSI+RXhhbXBsZSBCdWlsZCBGaWxlIFVzaW5nIHRoZSBDdXN0b20gQW50DQotVGFzazwvYT48L2xpPg0KLTxsaT48YSBocmVmPSIjaW52b2tpbmciPkludm9raW5nIHRoZSBDb2RlIEdlbmVyYXRvciBGcm9tDQotQW50PC9hPjwvbGk+DQotPC91bD4NCi08L2xpPg0KLTxsaT48YSBocmVmPSIjYXBwZW5kaXgiPkFwcGVuZGl4PC9hPjwvbGk+DQotPC91bD4NCi08YSBuYW1lPSJpbnRybyIgaWQ9ImludHJvIj48L2E+DQotPGgyPkludHJvZHVjdGlvbjwvaDI+DQotPHA+VGhpcyBiYXNpYyB0b29sIGlzIGltcGxlbWVudGVkIGJ5IHRoZSBXU0RMMkNvZGUgY2xhc3MgYW5kIGp1c3QNCi1mb3IgdGhlIGNvbnZlbmllbmNlIGluIHRoZSBjYXNlIG9mIEphdmEgKHdoaWNoIHdvdWxkIGJlIHRoZQ0KLW1ham9yaXR5KSB0aGVyZSBpcyBhbm90aGVyIFdTREwySmF2YSBjbGFzcy4gT25lIGNhbiBjaG9vc2UgdG8gcnVuDQotdGhlIG1haW4gY2xhc3NlcyBkaXJlY3RseSBvciB1c2Ugb25lIG9mIHRoZSBzY3JpcHRzIHRvIHJ1biB0aGUNCi1XU0RMMkNvZGUgYW5kIFdTREwySmF2YSBhcHByb3ByaWF0ZWx5LiAodGhlIHNjcmlwdHMgYXJlIGZvdW5kIGluDQotdGhlIGJpbiBkaXJlY3Rvcnkgb2YgdGhlIDxhIGhyZWY9DQotIi4uLy4uL2Rvd25sb2FkLzFfMS9kb3dubG9hZC5odG1sI3N0ZC1iaW4iPlN0YW5kYXJkIEJpbmFyeQ0KLURpc3RyaWJ1dGlvbjwvYT4pPC9wPg0KLTxhIG5hbWU9ImNtZGxpbmUiIGlkPSJjbWRsaW5lIj48L2E+DQotPGgyPkNvbW1hbmQgTGluZSBWZXJzaW9uPC9oMj4NCi08cD5Gb3IgdGhvc2UgdXNlcnMgd2hvIHdpc2ggdG8gdXNlIHRoZSBjb21tYW5kIGxpbmUgdmVyc2lvbiBvZiB0aGUNCi10b29sLCB0aGlzIHNlY3Rpb24gd2lsbCBiZSBvZiB2YWx1ZS48L3A+DQotPGEgbmFtZT0iY21kcmVmIiBpZD0iY21kcmVmIj48L2E+DQotPGgzPk9wdGlvbiBSZWZlcmVuY2U8L2gzPg0KLTxwPlVzYWdlIFdTREwyQ29kZSAmbHQ7b3B0aW9uX3JlZmVyZW5jZSZndDs8L3A+DQotPHA+PGI+RS5nLiA6LSBXU0RMMkNvZGUgLXVyaSAmbHQ7TG9jYXRpb24gb2YgV1NETCZndDs8L2I+PC9wPg0KLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgc3R5bGU9DQotImJvcmRlci1jb2xsYXBzZTogY29sbGFwc2UiIHdpZHRoPSIxMDAlIiBpZD0iQXV0b051bWJlcjEiPg0KLTx0Ym9keT4NCi08dHI+DQotPHRkIHdpZHRoPSIyMCUiPjxzdHJvbmc+U2hvcnQgT3B0aW9uPC9zdHJvbmc+PC90ZD4NCi08dGQgd2lkdGg9IjIwJSI+PHN0cm9uZz5Mb25nIE9wdGlvbjwvc3Ryb25nPjwvdGQ+DQotPHRkIHdpZHRoPSI2MCUiPjxzdHJvbmc+RGVzY3JpcHRpb248L3N0cm9uZz48L3RkPg0KLTx0ZD48L3RkPg0KLTwvdHI+DQotPHRyPg0KLTx0ZCB3aWR0aD0iMjAlIj4tdXJpICZsdDtMb2NhdGlvbiBvZiBXU0RMJmd0OzwvdGQ+DQotPHRkIHdpZHRoPSIyMCUiPk5vbmU8L3RkPg0KLTx0ZCB3aWR0aD0iNjAlIj5XU0RMIGZpbGUgbG9jYXRpb24uIFRoaXMgc2hvdWxkIHBvaW50IHRvIGEgV1NETA0KLWZpbGUgaW4gdGhlIGxvY2FsIGZpbGUgc3lzdGVtLjwvdGQ+DQotPHRkPjwvdGQ+DQotPC90cj4NCi08dHI+DQotPHRkIHdpZHRoPSIyMCUiPi1vICZsdDtvdXRwdXQgTG9jYXRpb24mZ3Q7PC90ZD4NCi08dGQgd2lkdGg9IjIwJSI+LS1vdXRwdXQgJmx0O291dHB1dCBMb2NhdGlvbiZndDs8L3RkPg0KLTx0ZCB3aWR0aD0iNjAlIj5PdXRwdXQgZmlsZSBsb2NhdGlvbi4gVGhpcyBpcyB3aGVyZSB0aGUgZmlsZXMgd291bGQNCi1iZSBjb3BpZWQgb25jZSB0aGUgY29kZSBnZW5lcmF0aW9uIGlzIGRvbmUuIElmIHRoaXMgb3B0aW9uIGlzDQotb21pdHRlZCB0aGUgZ2VuZXJhdGVkIGZpbGVzIHdvdWxkIGJlIGNvcGllZCB0byB0aGUgd29ya2luZw0KLWRpcmVjdG9yeS48L3RkPg0KLTx0ZD48L3RkPg0KLTwvdHI+DQotPHRyPg0KLTx0ZCB3aWR0aD0iMjAlIj4tbCAmbHQ7bGFuZ3VhZ2UmZ3Q7PC90ZD4NCi08dGQgd2lkdGg9IjIwJSI+LS1sYW5ndWFnZSAmbHQ7bGFuZ3VhZ2UmZ3Q7PC90ZD4NCi08dGQgd2lkdGg9IjYwJSI+T3V0cHV0IGxhbmd1YWdlLiBDdXJyZW50bHkgdGhlIGNvZGUgZ2VuZXJhdG9yIGNhbg0KLWdlbmVyYXRlIGNvZGUgaW4gSmF2YSBidXQgaXQgaGFzIHRoZSBhYmlsaXR5IHRvIGJlIGV4dGVuZGVkIHRvDQotc3VwcG9ydCBvdGhlciBsYW5ndWFnZXMuPC90ZD4NCi08dGQ+PC90ZD4NCi08L3RyPg0KLTx0cj4NCi08dGQgd2lkdGg9IjIwJSI+LXAgJmx0O3BhY2thZ2UgbmFtZSZndDs8L3RkPg0KLTx0ZCB3aWR0aD0iMjAlIj4tLXBhY2thZ2UgJmx0O3BhY2thZ2UgbmFtZSZndDs8L3RkPg0KLTx0ZCB3aWR0aD0iNjAlIj5UaGUgdGFyZ2V0IHBhY2thZ2UgbmFtZS4gSWYgb21pdHRlZCwgYSBkZWZhdWx0DQotcGFja2FnZSAoZm9ybWVkIHVzaW5nIHRoZSB0YXJnZXQgbmFtZXNwYWNlIG9mIHRoZSBXU0RMKSB3aWxsIGJlDQotdXNlZC48L3RkPg0KLTx0ZD48L3RkPg0KLTwvdHI+DQotPHRyPg0KLTx0ZCB3aWR0aD0iMjAlIj4tYTwvdGQ+DQotPHRkIHdpZHRoPSIyMCUiPi0tYXN5bmM8L3RkPg0KLTx0ZCB3aWR0aD0iNjAlIj5HZW5lcmF0ZSBjb2RlIG9ubHkgZm9yIGFzeW5jIHN0eWxlLiBXaGVuIHRoaXMNCi1vcHRpb24gaXMgdXNlZCB0aGUgZ2VuZXJhdGVkIHN0dWJzIHdpbGwgaGF2ZSBvbmx5IHRoZSBhc3luY2hyb25vdXMNCi1pbnZvY2F0aW9uIG1ldGhvZHMuIFN3aXRjaGVkIG9mZiBieSBkZWZhdWx0LjwvdGQ+DQotPHRkPjwvdGQ+DQotPC90cj4NCi08dHI+DQotPHRkIHdpZHRoPSIyMCUiPi1zPC90ZD4NCi08dGQgd2lkdGg9IjIwJSI+LS1zeW5jPC90ZD4NCi08dGQgd2lkdGg9IjYwJSI+R2VuZXJhdGUgY29kZSBvbmx5IGZvciBzeW5jIHN0eWxlIC4gV2hlbiB0aGlzDQotb3B0aW9uIGlzIHVzZWQgdGhlIGdlbmVyYXRlZCBzdHVicyB3aWxsIGhhdmUgb25seSB0aGUgc3luY2hyb25vdXMNCi1pbnZvY2F0aW9uIG1ldGhvZHMuIFN3aXRjaGVkIG9mZiBieSBkZWZhdWx0LiBXaGVuIHVzZWQgd2l0aCB0aGUgLWENCi1vcHRpb24sIHRoaXMgdGFrZXMgcHJlY2VkZW5jZS48L3RkPg0KLTx0ZD48L3RkPg0KLTwvdHI+DQotPHRyPg0KLTx0ZCB3aWR0aD0iMjAlIj4tdDwvdGQ+DQotPHRkIHdpZHRoPSIyMCUiPi0tdGVzdC1jYXNlPC90ZD4NCi08dGQgd2lkdGg9IjYwJSI+R2VuZXJhdGVzIGEgdGVzdCBjYXNlLiBJbiB0aGUgY2FzZSBvZiBKYXZhIGl0IHdvdWxkDQotYmUgYSBKVW5pdCB0ZXN0IGNhc2UuPC90ZD4NCi08dGQ+PC90ZD4NCi08L3RyPg0KLTx0cj4NCi08dGQgd2lkdGg9IjIwJSI+LXNzPC90ZD4NCi08dGQgd2lkdGg9IjIwJSI+LS1zZXJ2ZXItc2lkZTwvdGQ+DQotPHRkIHdpZHRoPSI2MCUiPkdlbmVyYXRlcyBzZXJ2ZXIgc2lkZSBjb2RlIChpLmUuIHNrZWxldG9ucykuDQotRGVmYXVsdCBpcyBvZmYuPC90ZD4NCi08dGQ+PC90ZD4NCi08L3RyPg0KLTx0cj4NCi08dGQgd2lkdGg9IjIwJSI+LXNkPC90ZD4NCi08dGQgd2lkdGg9IjIwJSI+LS1zZXJ2aWNlLWRlc2NyaXB0aW9uPC90ZD4NCi08dGQgd2lkdGg9IjYwJSI+R2VuZXJhdGVzIHRoZSBzZXJ2aWNlIGRlc2NyaXB0b3IgKGkuZS4gc2VydmVyLnhtbCkuDQotRGVmYXVsdCBpcyBvZmYuIE9ubHkgdmFsaWQgd2l0aCAtc3MsIHRoZSBzZXJ2ZXIgc2lkZSBjb2RlDQotZ2VuZXJhdGlvbiBvcHRpb24uPC90ZD4NCi08dGQ+PC90ZD4NCi08L3RyPg0KLTx0cj4NCi08dGQgd2lkdGg9IjIwJSI+LWQgJmx0O2RhdGFiaW5kaW5nJmd0OzwvdGQ+DQotPHRkIHdpZHRoPSIyMCUiPi0tZGF0YWJpbmRpbmctbWV0aG9kICZsdDtkYXRhYmluZGluZyZndDs8L3RkPg0KLTx0ZCB3aWR0aD0iNjAlIj5TcGVjaWZpZXMgdGhlIERhdGFiaW5kaW5nIGZyYW1ld29yay4gVmFsaWQgdmFsdWVzDQotYXJlIHhtbGJlYW5zLCBhZGIsIGppYngsIGFuZCBub25lLiBEZWZhdWx0IGlzIGFkYi48L3RkPg0KLTx0ZD48L3RkPg0KLTwvdHI+DQotPHRyPg0KLTx0ZCB3aWR0aD0iMjAlIj4tZzwvdGQ+DQotPHRkIHdpZHRoPSIyMCUiPi0tZ2VuZXJhdGUtYWxsPC90ZD4NCi08dGQgd2lkdGg9IjYwJSI+R2VuZXJhdGVzIGFsbCB0aGUgY2xhc3Nlcy4gVGhpcyBvcHRpb24gaXMgdmFsaWQNCi1vbmx5IHdpdGggdGhlIC1zcyAoc2VydmVyIHNpZGUgY29kZSBnZW5lcmF0aW9uKSBvcHRpb24uIFdoZW4gb24sDQotdGhlIGNsaWVudCBjb2RlIChzdHVicykgd2lsbCBhbHNvIGJlIGdlbmVyYXRlZCBhbG9uZyB3aXRoIHRoZQ0KLXNrZWxldG9uLjwvdGQ+DQotPHRkPjwvdGQ+DQotPC90cj4NCi08dHI+DQotPHRkIHdpZHRoPSIyMCUiPi11PC90ZD4NCi08dGQgd2lkdGg9IjIwJSI+LS11bnBhY2stY2xhc3NlczwvdGQ+DQotPHRkIHdpZHRoPSI2MCUiPlVucGFjayBjbGFzc2VzLiBUaGlzIG9wdGlvbiBzcGVjaWZpZXMgd2hldGhlciB0bw0KLXVucGFjayB0aGUgY2xhc3NlcyBhbmQgZ2VuZXJhdGUgc2VwYXJhdGUgY2xhc3NlcyBmb3IgdGhlDQotZGF0YWJpbmRlcnMuPC90ZD4NCi08dGQ+PC90ZD4NCi08L3RyPg0KLTx0cj4NCi08dGQgd2lkdGg9IjIwJSI+LXNuICZsdDtzZXJ2aWNlIG5hbWUmZ3Q7PC90ZD4NCi08dGQgd2lkdGg9IjIwJSI+LS1zZXJ2aWNlLW5hbWUgJmx0O3NlcnZpY2UgbmFtZSZndDs8L3RkPg0KLTx0ZCB3aWR0aD0iNjAlIj5TcGVjaWZpZXMgdGhlIHNlcnZpY2UgbmFtZSB0byBiZSBjb2RlIGdlbmVyYXRlZC4gSWYNCi10aGUgc2VydmljZSBuYW1lIGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gdGhlIGZpcnN0IHNlcnZpY2Ugd2lsbCBiZQ0KLXBpY2tlZC48L3RkPg0KLTx0ZD48L3RkPg0KLTwvdHI+DQotPHRyPg0KLTx0ZCB3aWR0aD0iMjAlIj4tcG4gJmx0O3BvcnQgbmFtZSZndDs8L3RkPg0KLTx0ZCB3aWR0aD0iMjAlIj4tLXBvcnQtbmFtZSAmbHQ7cG9ydCBuYW1lJmd0OzwvdGQ+DQotPHRkIHdpZHRoPSI2MCUiPlNwZWNpZmllcyB0aGUgcG9ydCBuYW1lIHRvIGJlIGNvZGUgZ2VuZXJhdGVkLiBJZg0KLXRoZSBwb3J0IG5hbWUgaXMgbm90IHNwZWNpZmllZCwgdGhlbiB0aGUgZmlyc3QgcG9ydCAob2YgdGhlDQotc2VsZWN0ZWQgc2VydmljZSkgd2lsbCBiZSBwaWNrZWQuPC90ZD4NCi08dGQ+PC90ZD4NCi08L3RyPg0KLTx0cj4NCi08dGQgd2lkdGg9IjIwJSI+LW5zMnA8L3RkPg0KLTx0ZCB3aWR0aD0iMjAlIj4tLW5hbWVzcGFjZTJwYWNrYWdlPC90ZD4NCi08dGQgd2lkdGg9IjYwJSI+U3BlY2lmaWVzIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgbmFtZXNwYWNlcyBhbmQNCi1wYWNrYWdlcyB3aGVyZSB0aGUgZ2l2ZW4gcGFja2FnZSB3aWxsIGJlIHVzZWQgaW4gdGhlIHBsYWNlIG9mIHRoZQ0KLWF1dG8gZ2VuZXJhdGVkIHBhY2thZ2UgZm9yIHRoZSByZWxldmFudCBuYW1lc3BhY2UuIFRoZSBsaXN0IHdpbGwgYmUNCi10aGUgZm9ybWF0IG9mIG5zMT1wa2cxLG5zMj1wa2cyLjwvdGQ+DQotPHRkPjwvdGQ+DQotPC90cj4NCi08dHI+DQotPHRkIHdpZHRoPSIyMCUiPi1zc2k8L3RkPg0KLTx0ZCB3aWR0aD0iMjAlIj4tLXNlcnZlcnNpZGUtaW50ZXJmYWNlPC90ZD4NCi08dGQgd2lkdGg9IjYwJSI+R2VuZXJhdGUgYW4gaW50ZXJmYWNlIGZvciB0aGUgc2VydmljZQ0KLXNrZWxldG9uLjwvdGQ+DQotPHRkPjwvdGQ+DQotPC90cj4NCi08dHI+DQotPHRkIHdpZHRoPSIyMCUiPi13djwvdGQ+DQotPHRkIHdpZHRoPSIyMCUiPi0td3NkbC12ZXJzaW9uPC90ZD4NCi08dGQgd2lkdGg9IjYwJSI+V1NETCBWZXJzaW9uLiBWYWxpZCBPcHRpb25zIDogMiwgMi4wLCAxLjE8L3RkPg0KLTx0ZD48L3RkPg0KLTwvdHI+DQotPHRyPg0KLTx0ZCB3aWR0aD0iMjAlIj4tUzwvdGQ+DQotPHRkIHdpZHRoPSIyMCUiPi0tc291cmNlLWZvbGRlcjwvdGQ+DQotPHRkIHdpZHRoPSI2MCUiPlNwZWNpZnkgYSBkaXJlY3RvcnkgcGF0aCBmb3IgZ2VuZXJhdGVkIHNvdXJjZTwvdGQ+DQotPHRkPjwvdGQ+DQotPC90cj4NCi08dHI+DQotPHRkIHdpZHRoPSIyMCUiPi1SPC90ZD4NCi08dGQgd2lkdGg9IjIwJSI+LS1yZXNvdXJjZS1mb2xkZXI8L3RkPg0KLTx0ZCB3aWR0aD0iNjAlIj5TcGVjaWZ5IGEgZGlyZWN0b3J5IHBhdGggZm9yIGdlbmVyYXRlZCByZXNvdXJjZXM8L3RkPg0KLTx0ZD48L3RkPg0KLTwvdHI+DQotPHRyPg0KLTx0ZCB3aWR0aD0iMjAlIj4tZW08L3RkPg0KLTx0ZCB3aWR0aD0iMjAlIj4tLWV4dGVybmFsLW1hcHBpbmc8L3RkPg0KLTx0ZCB3aWR0aD0iNjAlIj5TcGVjaWZ5IGFuIGV4dGVybmFsIG1hcHBpbmcgZmlsZTwvdGQ+DQotPHRkPjwvdGQ+DQotPC90cj4NCi08dHI+DQotPHRkIHdpZHRoPSIyMCUiPi1mPC90ZD4NCi08dGQgd2lkdGg9IjIwJSI+LS1mbGF0dGVuLWZpbGVzPC90ZD4NCi08dGQgd2lkdGg9IjYwJSI+RmxhdHRlbnMgdGhlIGdlbmVyYXRlZCBmaWxlczwvdGQ+DQotPHRkPjwvdGQ+DQotPC90cj4NCi08dHI+DQotPHRkIHdpZHRoPSIyMCUiPi11dzwvdGQ+DQotPHRkIHdpZHRoPSIyMCUiPi0tdW53cmFwLXBhcmFtczwvdGQ+DQotPHRkIHdpZHRoPSI2MCUiPlN3aXRjaCBvbiB1bi13cmFwcGluZzwvdGQ+DQotPHRkPjwvdGQ+DQotPC90cj4NCi08dHI+DQotPHRkIHdpZHRoPSIyMCUiPi14c2Rjb25maWc8L3RkPg0KLTx0ZCB3aWR0aD0iMjAlIj48L3RkPg0KLTx0ZCB3aWR0aD0iNjAlIj5Vc2UgWE1MQmVhbnMgLnhzZGNvbmZpZyBmaWxlLiBWYWxpZCBvbmx5IHdpdGggLWQgeG1sYmVhbnM8L3RkPg0KLTx0ZD48L3RkPg0KLTwvdHI+DQotPHRyPg0KLTx0ZCB3aWR0aD0iMjAlIj4tYXA8L3RkPg0KLTx0ZCB3aWR0aD0iMjAlIj4tLWFsbC1wb3J0czwvdGQ+DQotPHRkIHdpZHRoPSI2MCUiPkdlbmVyYXRlIGNvZGUgZm9yIGFsbCBwb3J0czwvdGQ+DQotPHRkPjwvdGQ+DQotPC90cj4NCi08dHI+DQotPHRkIHdpZHRoPSIyMCUiPi1vcjwvdGQ+DQotPHRkIHdpZHRoPSIyMCUiPi0tb3Zlci1yaWRlPC90ZD4NCi08dGQgd2lkdGg9IjYwJSI+T3ZlcndyaXRlIHRoZSBleGlzdGluZyBjbGFzc2VzPC90ZD4NCi08dGQ+PC90ZD4NCi08L3RyPg0KLTx0cj4NCi08dGQgd2lkdGg9IjIwJSI+LWI8L3RkPg0KLTx0ZCB3aWR0aD0iMjAlIj4tLWJhY2t3b3JkLWNvbXBhdGlibGU8L3RkPg0KLTx0ZCB3aWR0aD0iNjAlIj5HZW5lcmF0ZSBBeGlzIDEueCBiYWNrd29yZCBjb21wYXRpYmxlIGNvZGU8L3RkPg0KLTx0ZD48L3RkPg0KLTwvdHI+DQotPHRyPg0KLTx0ZCB3aWR0aD0iMjAlIj4tc3A8L3RkPg0KLTx0ZCB3aWR0aD0iMjAlIj4tLXN1cHByZXNzLXByZWZpeGVzPC90ZD4NCi08dGQgd2lkdGg9IjYwJSI+U3VwcHJlc3MgbmFtZXNwYWNlIHByZWZpeGVzIChPcHRpbXphdGlvbiB0aGF0IHJlZHVjZXMgc2l6ZSBvZiBzb2FwIHJlcXVlc3QvcmVzcG9uc2UpPC90ZD4NCi08dGQ+PC90ZD4NCi08L3RyPg0KLTx0cj4NCi08dGQgd2lkdGg9IjIwJSI+PC90ZD4NCi08dGQgd2lkdGg9IjIwJSI+LS1ub0J1aWxkWE1MPC90ZD4NCi08dGQgd2lkdGg9IjYwJSI+RG9uJ3QgZ2VuZXJhdGUgdGhlIGJ1aWxkLnhtbCBpbiB0aGUgb3V0cHV0IGRpcmVjdG9yeTwvdGQ+DQotPHRkPjwvdGQ+DQotPC90cj4NCi08dHI+DQotPHRkIHdpZHRoPSIyMCUiPjwvdGQ+DQotPHRkIHdpZHRoPSIyMCUiPi0tbm9XU0RMPC90ZD4NCi08dGQgd2lkdGg9IjYwJSI+RG9uJ3QgZ2VuZXJhdGUgV1NETCdzIGluIHRoZSByZXNvdXJjZXMgZGlyZWN0b3J5PC90ZD4NCi08dGQ+PC90ZD4NCi08L3RyPg0KLTx0cj4NCi08dGQgd2lkdGg9IjIwJSI+PC90ZD4NCi08dGQgd2lkdGg9IjIwJSI+LS1ub01lc3NhZ2VSZWNlaXZlcjwvdGQ+DQotPHRkIHdpZHRoPSI2MCUiPkRvbid0IGdlbmVyYXRlIGEgTWVzc2FnZVJlY2VpdmVyIGluIHRoZSBnZW5lcmF0ZWQgc291cmNlczwvdGQ+DQotPHRkPjwvdGQ+DQotPC90cj4NCi08L3Rib2R5Pg0KLTwvdGFibGU+DQotPHA+QXBhcnQgZnJvbSB0aGVzZSBtZW50aW9uZWQgb3B0aW9ucyBvbmUgY2FuIHBhc3MgZXh0cmEgb3B0aW9ucyBieQ0KLXByZWZpeGluZyB0aGVtIHdpdGggLUUgKHVwcGVyY2FzZSkuIFRoZXNlIGV4dHJhIG9wdGlvbnMgd2lsbCBiZQ0KLXByb2Nlc3NlZCBieSB0aGUgZXh0ZW5zaW9ucy4gVGhlIGV4dHJhIG9wdGlvbnMgdGhhdCBjYW4gYmUgcGFzc2VkDQotYXJlIGRvY3VtZW50ZWQgc2VwYXJhdGVseSB3aXRoIHRoZSBleHRlbnNpb25zIGRvY3VtZW50YXRpb24gKEZvcg0KLWV4YW1wbGUgd2l0aCBBREIpLjwvcD4NCi08YSBuYW1lPSJhbnQiIGlkPSJhbnQiPjwvYT4NCi08aDI+QW50IFRhc2s8L2gyPg0KLTxwPlRoZSBjb2RlIGdlbmVyYXRvciBhbHNvIGNvbWVzIGJ1bmRsZWQgd2l0aCBhbiBBbnQgdGFzay4gVGhlIGFudA0KLXRhc2sgaXMgaW1wbGVtZW50ZWQgYnkgdGhlIG9yZy5hcGFjaGUuYXhpczIudG9vbC5hbnQuQW50Q29kZWdlblRhc2sNCi1jbGFzcy4gRm9sbG93aW5nIGFyZSB0aGUgYW50IHRhc2sgYXR0cmlidXRlcy48L3A+DQotPGEgbmFtZT0iYW50cmVmIiBpZD0iYW50cmVmIj48L2E+DQotPGgzPkFudCBUYXNrIFJlZmVyZW5jZTwvaDM+DQotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBzdHlsZT0NCi0iYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZSIgd2lkdGg9IjEwMCUiIGlkPSJBdXRvTnVtYmVyMiI+DQotPHRib2R5Pg0KLTx0cj4NCi08dGQ+d3NkbGZpbGVuYW1lPC90ZD4NCi08dGQ+V1NETCBmaWxlIGxvY2F0aW9uLiBNYXBzIHRvIHRoZSAtdXJpIG9wdGlvbiBvZiB0aGUgY29tbWFuZCBsaW5lDQotdG9vbC48L3RkPg0KLTwvdHI+DQotPHRyPg0KLTx0ZD5vdXRwdXQ8L3RkPg0KLTx0ZD5PdXRwdXQgZmlsZSBsb2NhdGlvbi4gVGhpcyBpcyB3aGVyZSB0aGUgZmlsZXMgd291bGQgYmUgY29waWVkDQotb25jZSB0aGUgY29kZSBnZW5lcmF0aW9uIGlzIGRvbmUuIElmIHRoaXMgb3B0aW9uIGlzIG9taXR0ZWQgdGhlDQotZ2VuZXJhdGVkIGZpbGVzIHdvdWxkIGJlIGNvcGllZCB0byB0aGUgd29ya2luZyBkaXJlY3RvcnkuIE1hcHMgdG8NCi10aGUgLW8gb3B0aW9uIG9mIHRoZSBjb21tYW5kIGxpbmUgdG9vbC48L3RkPg0KLTwvdHI+DQotPHRyPg0KLTx0ZD5sYW5ndWFnZTwvdGQ+DQotPHRkPk91dHB1dCBsYW5ndWFnZS4gQ3VycmVudGx5IHRoZSBjb2RlIGdlbmVyYXRvciBjYW4gZ2VuZXJhdGUgY29kZQ0KLWluIEphdmEuIE1hcHMgdG8gdGhlIC1sIG9wdGlvbiBvZiB0aGUgY29tbWFuZCBsaW5lIHRvb2wuPC90ZD4NCi08L3RyPg0KLTx0cj4NCi08dGQ+cGFja2FnZU5hbWU8L3RkPg0KLTx0ZD5UaGUgdGFyZ2V0IHBhY2thZ2UgbmFtZS4gSWYgb21pdHRlZCwgYSBkZWZhdWx0IHBhY2thZ2UgKGZvcm1lZA0KLXVzaW5nIHRoZSB0YXJnZXQgbmFtZXNwYWNlIG9mIHRoZSBXU0RMKSB3aWxsIGJlIHVzZWQuIE1hcHMgdG8gdGhlDQotLXAgb3B0aW9uIG9mIHRoZSBjb21tYW5kIGxpbmUgdG9vbC48L3RkPg0KLTwvdHI+DQotPHRyPg0KLTx0ZD5kYXRhYmluZGluZ05hbWU8L3RkPg0KLTx0ZD5EYXRhIGJpbmRpbmcgZnJhbWV3b3JrIG5hbWUuIE1hcHMgdG8gdGhlIC1kIG9wdGlvbiBvZiB0aGUNCi1jb21tYW5kIGxpbmUgdG9vbC4gUG9zc2libGUgdmFsdWVzIGluY2x1ZGUgImFkYiIsICJ4bWxiZWFucyIsDQotImppYngiLjwvdGQ+DQotPC90cj4NCi08dHI+DQotPHRkPnNlcnZpY2VOYW1lPC90ZD4NCi08dGQ+VGhlIG5hbWUgb2YgdGhlIHNlcnZpY2UgaW4gdGhlIGNhc2Ugb2YgbXVsdGlwbGUgc2VydmljZXMuIE1hcHMNCi10byAtc24gb3B0aW9ucyBvZiB0aGUgY29tbWFuZCBsaW5lIHRvb2wuPC90ZD4NCi08L3RyPg0KLTx0cj4NCi08dGQ+cG9ydE5hbWU8L3RkPg0KLTx0ZD5UaGUgbmFtZSBvZiB0aGUgcG9ydCBpbiB0aGUgcHJlc2VuY2Ugb2YgbXVsdGlwbGUgcG9ydHMuIE1hcHMgdG8NCi0tcG4gb3B0aW9ucyBvZiB0aGUgY29tbWFuZCBsaW5lIHRvb2wuPC90ZD4NCi08L3RyPg0KLTx0cj4NCi08dGQ+YXN5bmNPbmx5PC90ZD4NCi08dGQ+R2VuZXJhdGUgY29kZSBvbmx5IGZvciBhc3luYyBzdHlsZS4gV2hlbiB0aGlzIG9wdGlvbiBpcyB1c2VkDQotdGhlIGdlbmVyYXRlZCBzdHVicyB3aWxsIGhhdmUgb25seSB0aGUgYXN5bmNocm9ub3VzIGludm9jYXRpb24NCi1tZXRob2RzLiBEZWZhdWx0cyB0byBmYWxzZSBpZiBvbWl0dGVkLiBPbmx5IHRydWUgYW5kIGZhbHNlIGFyZQ0KLWFwcGxpY2FibGUgYXMgdmFsdWVzLiBNYXBzIHRvIHRoZSAtYSBvcHRpb24gb2YgdGhlIGNvbW1hbmQgbGluZQ0KLXRvb2wuPC90ZD4NCi08L3RyPg0KLTx0cj4NCi08dGQ+c3luY09ubHk8L3RkPg0KLTx0ZD5HZW5lcmF0ZSBjb2RlIG9ubHkgZm9yIHN5bmMgc3R5bGUuIFdoZW4gdGhpcyBvcHRpb24gaXMgdXNlZCB0aGUNCi1nZW5lcmF0ZWQgc3R1YnMgd2lsbCBoYXZlIG9ubHkgdGhlIHN5bmNocm9ub3VzIGludm9jYXRpb24gbWV0aG9kcy4NCi1EZWZhdWx0cyB0byBmYWxzZSBpZiBvbWl0dGVkLiBPbmx5IHRydWUgYW5kIGZhbHNlIGFyZSBhcHBsaWNhYmxlIGFzDQotdmFsdWVzLiBNYXBzIHRvIHRoZSAtcyBvcHRpb24gb2YgdGhlIGNvbW1hbmQgbGluZSB0b29sLjwvdGQ+DQotPC90cj4NCi08dHI+DQotPHRkPnNlcnZlclNpZGU8L3RkPg0KLTx0ZD5HZW5lcmF0ZXMgc2VydmVyIHNpZGUgY29kZSAoaS5lLiBza2VsZXRvbnMpLiBPbmx5IHRydWUgYW5kDQotZmFsc2UgYXJlIGFwcGxpY2FibGUgYXMgdmFsdWVzLiBEZWZhdWx0IGlzIGZhbHNlLiBNYXBzIHRvIHRoZSAtc3MNCi1vcHRpb24gb2YgdGhlIGNvbW1hbmQgbGluZSB0b29sLjwvdGQ+DQotPC90cj4NCi08dHI+DQotPHRkPnRlc3RjYXNlPC90ZD4NCi08dGQ+R2VuZXJhdGVzIGEgdGVzdCBjYXNlLiBQb3NzaWJsZSB2YWx1ZXMgYXJlIHRydWUgYW5kIGZhbHNlLiBNYXBzDQotdG8gdGhlIC10IG9wdGlvbnMgb2YgdGhlIGNvbW1hbmQgbGluZSB0b29sLjwvdGQ+DQotPC90cj4NCi08dHI+DQotPHRkPmdlbmVyYXRlU2VydmljZVhtbDwvdGQ+DQotPHRkPkdlbmVyYXRlcyBzZXJ2ZXIgc2lkZSBjb2RlIChpLmUuIHNrZWxldG9ucykuIE9ubHkgdHJ1ZSBhbmQNCi1mYWxzZSBhcmUgYXBwbGljYWJsZSBhcyB2YWx1ZXMuIERlZmF1bHQgaXMgZmFsc2UuIE1hcHMgdG8gdGhlIC1zZA0KLW9wdGlvbiBvZiB0aGUgY29tbWFuZCBsaW5lIHRvb2wuPC90ZD4NCi08L3RyPg0KLTx0cj4NCi08dGQ+dW5wYWNrQ2xhc3NlczwvdGQ+DQotPHRkPlVucGFja3MgdGhlIGdlbmVyYXRlZCBjbGFzc2VzLiBUaGlzIGZvcmNlcyB0aGUgZGF0YWJpbmRpbmcNCi1jbGFzc2VzIHRvIGJlIGdlbmVyYXRlZCBzZXBhcmF0ZWx5LCB3aGljaCBvdGhlcndpc2Ugd291bGQgaGF2ZSBiZWVuDQotZ2VuZXJhdGVkIGFzIGlubmVyIGNsYXNzZXMuPC90ZD4NCi08L3RyPg0KLTx0cj4NCi08dGQ+Z2VuZXJhdGVBbGxDbGFzc2VzPC90ZD4NCi08dGQ+R2VuZXJhdGVzIGFsbCB0aGUgY2xhc3NlcyBpbmNsdWRpbmcgY2xpZW50IGFuZCBzZXJ2ZXIgc2lkZQ0KLWNvZGUuIE1hcHMgdG8gdGhlIC1nIG9wdGlvbiBvZiB0aGUgY29tbWFuZCBsaW5lIHRvb2wuPC90ZD4NCi08L3RyPg0KLTx0cj4NCi08dGQ+bmFtZXNwYWNlVG9QYWNrYWdlczwvdGQ+DQotPHRkPkEgbGlzdCBvZiBuYW1lc3BhY2UgdG8gcGFja2FnZSBtYXBwaW5ncy48L3RkPg0KLTwvdHI+DQotPHRyPg0KLTx0ZD5zZXJ2ZXJTaWRlSW50ZXJmYWNlPC90ZD4NCi08dGQ+RmxhZyBzdGF0aW5nIHdoZXRoZXIgdG8gZ2VuZXJhdGUgYW4gaW50ZXJmYWNlIGZvciB0aGUgc2VydmVyDQotc2lkZSBza2VsZXRvbi48L3RkPg0KLTwvdHI+DQotPHRyPg0KLTx0ZD5yZXBvc2l0b3J5UGF0aDwvdGQ+DQotPHRkPlNldHMgdGhlIHJlcG9zaXRvcnkgcGF0aCB0byBiZSB1c2VkLiBNYXBzIHRvIHRoZSAtciBvcHRpb24gb2YNCi10aGUgY29tbWFuZCBsaW5lIHRvb2wuPC90ZD4NCi08L3RyPg0KLTx0cj4NCi08dGQ+d3NkbFZlcnNpb248L3RkPg0KLTx0ZD5TZXRzIHRoZSB2ZXJzaW9uIG9mIHRoZSB3c2RsIHRoYXQgaXMgYmVpbmcgdXNlZCBkdXJpbmcNCi1jb2RlZ2VuZXJhdGlvbi4gVGhpcyBkZWFmdWx0cyB0byAxLjEgYW5kIG9uZSBjYW4gc2V0IHRoaXMgdG8gMiwNCi13aGVuIHRyeWluZyB0byB3b3JrIHdpdGggYSBXU0RMIDIuMCBkb2N1bWVudC4gTWFwcyB0byB0aGUgLXd2DQotb3B0aW9uIG9mIHRoZSBjb21tYW5kIGxpbmUgdG9vbC48L3RkPg0KLTwvdHI+DQotPHRyPg0KLTx0ZD5leHRlcm5hbE1hcHBpbmc8L3RkPg0KLTx0ZD5Mb2NhdGlvbiBvZiB0aGUgZXh0ZXJuYWwgbWFwcGluZyBmaWxlIHRvIGJlIHVzZWQuIE1hcHMgdG8gdGhlDQotLWVtIG9wdGlvbiBvZiB0aGUgY29tbWFuZCBsaW5lIHRvb2wuPC90ZD4NCi08L3RyPg0KLTx0cj4NCi08dGQ+dGFyZ2V0U291cmNlRm9sZGVyTG9jYXRpb248L3RkPg0KLTx0ZD5SYXRoZXIgdGhhbiBkdW1waW5nIGFsbCB0aGUgY29kZSBpbiB0aGUgc2FtZSBsb2NhdGlvbiwgb25lIGhhcw0KLXRoZSBvcHRpb24gdG8gbWFrZSB0aGUgc291cmNlcyB0byBiZSBnZW5lcmF0ZWQgaW4gYSBkaWZmZXJlbnQNCi1sb2NhdGlvbiwgZ2l2ZW4gdXNpbmcgdGhpcyBvcHRpb24uIE1hcHMgdG8gdGhlIC1TIG9wdGlvbiBvZiB0aGUNCi1jb21tYW5kIGxpbmUgdG9vbC48L3RkPg0KLTwvdHI+DQotPHRyPg0KLTx0ZD50YXJnZXRSZXNvdXJjZXNGb2xkZXJMb2NhdGlvbjwvdGQ+DQotPHRkPlJhdGhlciB0aGFuIGR1bXBpbmcgYWxsIHRoZSBjb2RlIGluIHRoZSBzYW1lIGxvY2F0aW9uLCBvbmUgaGFzDQotdGhlIG9wdGlvbiB0byBtYWtlIHRoZSByZXNvdXJjZXMgdG8gYmUgZ2VuZXJhdGVkIGluIGEgZGlmZmVyZW50DQotbG9jYXRpb24sIGdpdmVuIHVzaW5nIHRoaXMgb3B0aW9uLiBNYXBzIHRvIHRoZSAtUiBvcHRpb24gb2YgdGhlDQotY29tbWFuZCBsaW5lIHRvb2wuPC90ZD4NCi08L3RyPg0KLTx0cj4NCi08dGQ+dW53cmFwPC90ZD4NCi08dGQ+VGhpcyB3aWxsIHNlbGVjdCBiZXR3ZWVuIHdyYXBwZWQgYW5kIHVud3JhcHBlZCBkdXJpbmcgY29kZQ0KLWdlbmVyYXRpb24uIERlZmF1bHQgaXMgc2V0IHRvIGZhbHNlLiBNYXBzIHRvIHRoZSAtdXcgb3B0aW9uIG9mIHRoZQ0KLWNvbW1hbmQgbGluZSB0b29sLjwvdGQ+DQotPC90cj4NCi08L3Rib2R5Pg0KLTwvdGFibGU+DQotPGEgbmFtZT0iZXhhbXBsZSIgaWQ9ImV4YW1wbGUiPjwvYT4NCi08aDM+RXhhbXBsZSBCdWlsZCBGaWxlIFVzaW5nIHRoZSBDdXN0b20gQW50IFRhc2s8L2gzPg0KLTxwPkZvbGxvd2luZyBpcyBhbiBleGFtcGxlIGFudCBidWlsZCBmaWxlIHRoYXQgdXNlcyB0aGUgY3VzdG9tIEFudA0KLXRhc2suIFlvdSBjYW4gdXNlIGFueSB3c2RsIGZpbGUgdG8gdGVzdCB0aGUgZXhhbXBsZS4gUmVwbGFjZSB0aGUNCi0iQ29tYmluZWRTZXJ2aWNlLndzZGwiIHdpdGggdGhlIG5hbWUgb2YgeW91ciB3c2RsIGZpbGUgaW4gdGhlDQotZm9sbG93aW5nIHNjcmlwdC48L3A+DQotPHByZT4NCi0xICZsdDs/eG1sIHZlcnNpb249IjEuMCI/Jmd0Ow0KLSAgICAyICZsdDtwcm9qZWN0IG5hbWU9IkNvZGVnZW5FeGFtcGxlIiBkZWZhdWx0PSJtYWluIiBiYXNlZGlyPSIuIiZndDsNCi0gICAgMw0KLSAgICA0ICZsdDtwYXRoIGlkPSJleGFtcGxlLmNsYXNzcGF0aCImZ3Q7DQotICAgIDUgJmx0O2ZpbGVzZXQgZGlyPSJjbGFzc2VzIiZndDsNCi0gICAgNiAmbHQ7aW5jbHVkZSBuYW1lPSIqKi8qLmphciIgLyZndDsNCi0gICAgNyAmbHQ7L2ZpbGVzZXQmZ3Q7DQotICAgIDggJmx0Oy9wYXRoJmd0Ow0KLSAgICA5DQotICAgIDEwICZsdDt0YXJnZXQgbmFtZT0iZGVjbGFyZSIgJmd0Ow0KLSAgICAxMSAmbHQ7dGFza2RlZiBuYW1lPSJjb2RlZ2VuIg0KLSAgICAxMiBjbGFzc25hbWU9Im9yZy5hcGFjaGUuYXhpczIudG9vbC5hbnQuQW50Q29kZWdlblRhc2siDQotICAgIDEzIGNsYXNzcGF0aHJlZj0iZXhhbXBsZS5jbGFzc3BhdGgiLyZndDsNCi0gICAgMTUgJmx0Oy90YXJnZXQmZ3Q7DQotICAgIDE2DQotICAgIDE3ICZsdDt0YXJnZXQgbmFtZT0ibWFpbiIgZGVwZW5kcz0iZGVjbGFyZSImZ3Q7DQotICAgIDE4ICZsdDtjb2RlZ2VuDQotICAgIDE5IHdzZGxmaWxlbmFtZT0iQzpcdGVzdFx3c2RsXENvbWJpbmVkU2VydmljZS53c2RsIg0KLSAgICAyMCBvdXRwdXQ9IkM6XG91dHB1dCINCi0gICAgMjEgc2VydmVyc2lkZT0idHJ1ZSINCi0gICAgMjIgZ2VuZXJhdGVzZXJ2aWNleG1sPSJ0cnVlIi8mZ3Q7DQotICAgIDIzICZsdDsvdGFyZ2V0Jmd0Ow0KLSAgICAyNA0KLSAgICAyNSAmbHQ7L3Byb2plY3QmZ3Q7DQotPC9wcmU+DQotPHA+SW4gdGhlIGFib3ZlIGJ1aWxkIHNjcmlwdCwgZnJvbSBsaW5lIDQgdG8gOCBpdCBzZXRzIHRoZQ0KLWNsYXNzcGF0aCBhbmQgaW5jbHVkZXMgYWxsIHRoZSAuamFyIGZpbGVzICh3aGljaCBhcmUgbGlzdGVkIGJlbG93KQ0KLWludG8gdGhlIGNsYXNzcGF0aC4gRnJvbSBsaW5lIDEwIHRvIDE1IGl0IGNyZWF0ZXMgYSB0YXJnZXQgdG8NCi1kZWNsYXJlIGEgdGFzayBjYWxsZWQgImNvZGVnZW4iIGFuZCBzZXRzIHRoZSBhcHByb3ByaWF0ZSBjbGFzcw0KLShvcmcuYXBhY2hlLmF4aXMyLnRvb2wuYW50LkFudENvZGVnZW5UYXNrKSB3aXRoaW4gdGhlIGNsYXNzcGF0aCBpbg0KLWxpbmUgMTIuIEZyb20gbGluZSAxNyB0byAyMyBpdCBjcmVhdGVzIHRoZSAibWFpbiIgdGFyZ2V0IHRvDQotZ2VuZXJhdGUgdGhlIGNvZGUgZnJvbSB0aGUgZ2l2ZW4gd3NkbC4gVGhlcmUgYXJlIHNvbWUgYXJndW1lbnRzIHNldA0KLWZvcm0gbGluZSAxOSB0byAyMi4gSGVyZSBpbiBsaW5lIDE5IGl0IHNldHMgdGhlIGxvY2F0aW9uIG9mIHRoZQ0KLXdzZGwuIEluIGxpbmUgMjAgaXQgc2V0cyB0aGUgb3V0cHV0IGRpcmVjdG9yeSBpbiB3aGljaCB0aGUgY29kZSBpcw0KLWdlbmVyYXRlZC4gTGluZSAyMSBpbmRpY2F0ZXMgdGhhdCB0aGlzIGJ1aWxkIGdlbmVyYXRlcyB0aGUgc2VydmVyDQotc2lkZSBjb2RlKHNrZWxldG9uKSBhbmQgbGluZSAyMiBpbmRpY2F0ZXMgdGhhdCB0aGUgc2VydmljZXMueG1sIGlzDQotYWxzbyBnZW5lcmF0ZWQuPC9wPg0KLTxwPk5vdGljZSB0aGUgbWFpbiB0YXJnZXQgdGhhdCB1c2VzIHRoZSAiY29kZWdlbiIgdGFzayB3aGljaCB3aWxsDQotdXNlIHRoZSBvcmcuYXBhY2hlLmF4aXMyLnRvb2wuYW50LkFudENvZGVnZW5UYXNrIGNsYXNzIGFuZCBydW4gdGhlDQotY29kZSBnZW5lcmF0aW9uIHRvb2wgaW50ZXJuYWxseSB3aGlsZSBwYXNzaW5nIHRoZSByZWxldmFudA0KLWFyZ3VtZW50cyBhbmQgZG8gdGhlIHByb3BlciBnZW5lcmF0aW9uLiBJZiBhIHVzZXIgdHlwZXM8L3A+DQotPHA+PGNvZGU+Jmd0O2FudDwvY29kZT4gb3IgPGNvZGU+Jmd0O2FudCBtYWluPC9jb2RlPjwvcD4NCi08cD5pdCB3aWxsIGdlbmVyYXRlIHRoZSBzZXJ2ZXIgc2lkZSBjb2RlIGFuZCBzZXJ2aWNlcy54bWwgZm9yIHRoZQ0KLWdpdmVuIFdTREwgZmlsZSAoQzpcdGVzdFx3c2RsXENvbWJpbmVkU2VydmljZS53c2RsIC1pbiB0aGUgYWJvdmUNCi1pbnN0YW5jZSkgYW5kIHRoZSBnZW5lcmF0ZWQgY29kZSB3aWxsIGJlIHdyaXR0ZW4gdG8gdGhlIHNwZWNpZmllZA0KLW91dHB1dCBwYXRoIChDOlxvdXRwdXQgLSBpbiB0aGUgYWJvdmUgaW5zdGFuY2UpLjwvcD4NCi08cD5Gb3IgdGhpcyBBbnQgdGFzayB0byB3b3JrIHRoZSBmb2xsb3dpbmcgamFycyBuZWVkIHRvIGJlIGluIHRoZQ0KLWNsYXNzIHBhdGguPC9wPg0KLTx1bD4NCi08bGk+YXhpczItKi5qYXIgKGZyb20gdGhlIEF4aXMyIGRpc3RyaWJ1dGlvbik8L2xpPg0KLTxsaT53c2RsNGotMS42LjIuamFyIG9yIGhpZ2hlciAoVGhlIFdTREw0SiBpbXBsZW1lbnRhdGlvbiBqYXIuDQotQnVuZGxlZCB3aXRoIHRoZSBBeGlzMiBkaXN0cmlidXRpb24pPC9saT4NCi08bGk+c3RheC1hcGktMS4wLjEuamFyIChUaGUgU3RBWCBBUEkncyB0aGF0IGNvbnRhaW4gdGhlDQotamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBjbGFzcy4gVGhpcyBqYXIgbWF5IGJlIHJlcGxhY2VkIGJ5IGFueQ0KLW90aGVyIGphciB0aGF0IGNvbnRhaW5zIHRoZSBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lDQotaW1wbGVtZW50YXRpb24uIEhvd2V2ZXIgQXhpczIgdXNlcyB0aGlzIGNsYXNzIGZyb20gdGhlDQotc3RheC1hcGktMS4wLjEuamFyIHdoaWNoIGNvbWVzIGJ1bmRsZWQgd2l0aCB0aGUgQXhpczINCi1kaXN0cmlidXRpb24pPC9saT4NCi08bGk+Y29tbW9ucy1sb2dnaW5nLTEuMS5qYXIsIG5lZXRoaS0yLjAuamFyIGFuZCBYbWxTY2hlbWEtMS4yLmphcg0KLShmcm9tIHRoZSBBeGlzMiBkaXN0cmlidXRpb24pPC9saT4NCi08bGk+YXhpb20tYXBpLTEuMi4xLmphciBhbmQgYXhpb20taW1wbC0xLjIuMS5qYXIgKGZyb20gdGhlIEF4aXMyDQotZGlzdHJpYnV0aW9uKTwvbGk+DQotPGxpPmFjdGl2YXRpb24tMS4xLmphciAoZnJvbSB0aGUgQXhpczIgZGlzdHJpYnV0aW9uKTwvbGk+DQotPGxpPndzdHgtYXNsLTMuMS4wLmphciAoZnJvbSB0aGUgQXhpczIgZGlzdHJpYnV0aW9uKTwvbGk+DQotPC91bD4NCi08YSBuYW1lPSJpbnZva2luZyIgaWQ9Imludm9raW5nIj48L2E+DQotPGgzPkludm9raW5nIHRoZSBDb2RlIEdlbmVyYXRvciBGcm9tIEFudDwvaDM+DQotPHA+U2luY2UgdGhlIHVzZXJzIG1heSBmaW5kIGFsdGVyaW5nIHRoZWlyIGFudCBjbGFzcyBwYXRoIGEgYml0DQotZGF1bnRpbmcgdGhleSBjYW4gYWxzbyBmb2xsb3cgYW4gZWFzaWVyIHRlY2huaXF1ZS4gVGhlIGNvZGUNCi1nZW5lcmF0b3IgbWFpbiBjbGFzcyBjYW4gYmUgaW52b2tlZCBkaXJlY3RseSB0aHJvdWdoIHRoZSBidWlsZA0KLWZpbGUuPC9wPg0KLTxwPkJlbG93IGlzIGFuIGV4YW1wbGUgb2YgYSBmdWxsIGJ1aWxkLnhtbCBuZWVkZWQgdG8gcnVuIFdTREwySmF2YQ0KLWFuZCBnZW5lcmF0ZSB0aGUgSmF2YSBzb3VyY2UgZmlsZXMsIGNvbXBpbGUgdGhlIHNvdXJjZXMsIGFuZCBidWlsZA0KLWFuIEFBUiBmaWxlIHJlYWR5IGZvciBkZXBsb3ltZW50IChUaGVzZSBhcmUgZG9uZSBvbmUgYnkgb25lLCBieQ0KLWNhbGxpbmcgdGhlIHRhcmdldHMgaW4gdGhlIGJ1aWxkIGZpbGUgc2VwYXJhdGVseSk6PC9wPg0KLTxwcmUgY2xhc3M9ImNvZGUiPg0KLSZsdDshRE9DVFlQRSBwcm9qZWN0Jmd0Ow0KLQ0KLSZsdDtwcm9qZWN0IG5hbWU9IndzZGwyamF2YS1leGFtcGxlIiBkZWZhdWx0PSJ1c2FnZSIgYmFzZWRpcj0iLiImZ3Q7DQotDQotJmx0O3Byb3BlcnR5IG5hbWU9InByb2plY3QtbmFtZSIgdmFsdWU9IndzZGwyamF2YS1leGFtcGxlIi8mZ3Q7DQotJmx0O3Byb3BlcnR5IGZpbGU9ImJ1aWxkLnByb3BlcnRpZXMiLyZndDsNCi0NCi0mbHQ7cHJvcGVydHkgbmFtZT0iYnVpbGQiIHZhbHVlPSJidWlsZCIvJmd0Ow0KLSZsdDtwcm9wZXJ0eSBuYW1lPSJzcmMiIHZhbHVlPSJzcmMiLyZndDsNCi0mbHQ7cHJvcGVydHkgbmFtZT0iYnVpbGQuY2xhc3NlcyIgdmFsdWU9ImJ1aWxkL2NsYXNzZXMiIC8mZ3Q7DQotDQotJmx0O3BhdGggaWQ9ImF4aXMuY2xhc3NwYXRoIiZndDsNCi0mbHQ7cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL2NsYXNzZXMiIC8mZ3Q7DQotJmx0O2ZpbGVzZXQgZGlyPSIke2F4aXMuaG9tZX0vbGliIiZndDsNCi0mbHQ7aW5jbHVkZSBuYW1lPSIqKi8qLmphciIgLyZndDsNCi0mbHQ7L2ZpbGVzZXQmZ3Q7DQotJmx0O3BhdGhlbGVtZW50IGxvY2F0aW9uPSIke2J1aWxkLmNsYXNzZXN9IiAvJmd0Ow0KLSZsdDsvcGF0aCZndDsNCi0NCi0mbHQ7cGF0aCBpZD0iYXhpc19jbGllbnQuY2xhc3NwYXRoIiZndDsNCi0mbHQ7cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL2NsYXNzZXMiIC8mZ3Q7DQotJmx0O2ZpbGVzZXQgZGlyPSIke2F4aXMuaG9tZX0iJmd0Ow0KLSZsdDtpbmNsdWRlIG5hbWU9IioqLyouamFyIiAvJmd0Ow0KLSZsdDsvZmlsZXNldCZndDsNCi0mbHQ7ZmlsZXNldCBkaXI9ImxpYiImZ3Q7DQotJmx0O2luY2x1ZGUgbmFtZT0iKi5qYXIiIC8mZ3Q7DQotJmx0Oy9maWxlc2V0Jmd0Ow0KLSZsdDtwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtidWlsZC5jbGFzc2VzfSIgLyZndDsNCi0mbHQ7L3BhdGgmZ3Q7DQotDQotJmx0O3RhcmdldCBuYW1lPSJ1c2FnZSIgZGVzY3JpcHRpb249IkJ1aWxkIGZpbGUgdXNhZ2UgaW5mbyAoZGVmYXVsdCB0YXNrKSImZ3Q7DQotJmx0O2VjaG8gbWVzc2FnZT0iICIgLyZndDsNCi0mbHQ7ZWNobyBtZXNzYWdlPSIke3Byb2plY3QtbmFtZX0gIiAvJmd0Ow0KLSZsdDtlY2hvIG1lc3NhZ2U9Ii0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iIC8mZ3Q7DQotJmx0O2VjaG8gbWVzc2FnZT0iICIgLyZndDsNCi0mbHQ7ZWNobyBtZXNzYWdlPSJBdmFpbGFibGUgVGFyZ2V0czoiIC8mZ3Q7DQotJmx0O2VjaG8gbWVzc2FnZT0iICIgLyZndDsNCi0mbHQ7ZWNobyBtZXNzYWdlPSIgQ29tcGlsaW5nOiIgLyZndDsNCi0mbHQ7ZWNobyBtZXNzYWdlPSIgY29tcGlsZSAtIENvbXBpbGVzIHRoZSBXU0RMMkphdmEgc291cmNlIGNvZGUiIC8mZ3Q7DQotJmx0O2VjaG8gbWVzc2FnZT0iICIgLyZndDsNCi0mbHQ7ZWNobyBtZXNzYWdlPSIgQ29tcGlsaW5nIGNsaWVudDoiIC8mZ3Q7DQotJmx0O2VjaG8gbWVzc2FnZT0iIGNvbXBpbGVfY2xpZW50IC0gQ29tcGlsZXMgdGhlIGNsaWVudCBzb3VyY2UgY29kZSIgLyZndDsNCi0mbHQ7ZWNobyBtZXNzYWdlPSIgIiAvJmd0Ow0KLSZsdDtlY2hvIG1lc3NhZ2U9IiBDbGVhbmluZyB1cDoiIC8mZ3Q7DQotJmx0O2VjaG8gbWVzc2FnZT0iIGNsZWFuIC0gRGVsZXRlIGNsYXNzIGZpbGVzIiAvJmd0Ow0KLSZsdDtlY2hvIG1lc3NhZ2U9IiAiIC8mZ3Q7DQotJmx0O2VjaG8gbWVzc2FnZT0iIFdTREw6IiAvJmd0Ow0KLSZsdDtlY2hvIG1lc3NhZ2U9IiB3c2RsMmphdmEgLSBHZW5lcmF0ZSBzb3VyY2UgZnJvbSBXU0RMIiAvJmd0Ow0KLSZsdDtlY2hvIG1lc3NhZ2U9IiAiIC8mZ3Q7DQotJmx0O2VjaG8gbWVzc2FnZT0iIEFBUjoiIC8mZ3Q7DQotJmx0O2VjaG8gbWVzc2FnZT0iIGFhciAtIEdlbmVyYXRlIGFuIC5hYXIgZm9yIGRlcGxveW1lbnQgaW50byBXRUItSU5GL3NlcnZpY2VzIiAvJmd0Ow0KLSZsdDtlY2hvIG1lc3NhZ2U9IiAiIC8mZ3Q7DQotJmx0O2VjaG8gbWVzc2FnZT0iIEV4ZWN1dGluZzoiIC8mZ3Q7DQotJmx0O2VjaG8gbWVzc2FnZT0iIHJ1bkxvZ2luIC0gRXhlY3V0ZSB0aGUgcnVuTG9naW4gY2xpZW50IiAvJmd0Ow0KLSZsdDsvdGFyZ2V0Jmd0Ow0KLQ0KLSZsdDt0YXJnZXQgbmFtZT0icHJlcGFyZSIgJmd0Ow0KLSZsdDtta2RpciBkaXI9IiR7YnVpbGQuY2xhc3Nlc30iIC8mZ3Q7DQotJmx0Oy90YXJnZXQmZ3Q7DQotDQotJmx0O3RhcmdldCBuYW1lPSJjbGVhbiIgJmd0Ow0KLSZsdDtkZWxldGUgZGlyPSIke2J1aWxkfSIgLyZndDsNCi0mbHQ7ZGVsZXRlIGRpcj0iJHtkaXN0fSIgLyZndDsNCi0mbHQ7L3RhcmdldCZndDsNCi0NCi0mbHQ7dGFyZ2V0IG5hbWU9ImNvbXBpbGUiJmd0Ow0KLSZsdDtlY2hvIG1lc3NhZ2U9IkNvbXBpbGluZyB3c2RsMiBmaWxlcyIvJmd0Ow0KLQ0KLSZsdDtqYXZhYw0KLXNyY2Rpcj0ib3V0cHV0Ig0KLWRlc3RkaXI9IiR7YnVpbGQuY2xhc3Nlc30iDQotZGVwcmVjYXRpb249InRydWUiDQotZmFpbG9uZXJyb3I9InRydWUiIGRlYnVnPSJ0cnVlIiZndDsNCi0NCi0mbHQ7Y2xhc3NwYXRoIHJlZmlkPSJheGlzLmNsYXNzcGF0aCIvJmd0Ow0KLSZsdDsvamF2YWMmZ3Q7DQotDQotJmx0Oy90YXJnZXQmZ3Q7DQotDQotJmx0O3RhcmdldCBuYW1lPSJ3c2RsMmphdmEiIGRlcGVuZHM9ImNsZWFuLHByZXBhcmUiJmd0Ow0KLSZsdDtkZWxldGUgZGlyPSJvdXRwdXQiIC8mZ3Q7DQotJmx0O2phdmEgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmF4aXMyLndzZGwuV1NETDJKYXZhIiBmb3JrPSJ0cnVlIiZndDsNCi0mbHQ7Y2xhc3NwYXRoIHJlZmlkPSJheGlzLmNsYXNzcGF0aCIvJmd0Ow0KLSZsdDthcmcgdmFsdWU9Ii1kIi8mZ3Q7DQotJmx0O2FyZyB2YWx1ZT0ieG1sYmVhbnMiLyZndDsNCi0mbHQ7YXJnIHZhbHVlPSItdXJpIi8mZ3Q7DQotJmx0O2FyZyBmaWxlPSJ3c2RsL0xvZ2luRW5kcG9pbnQud3NkbCIvJmd0Ow0KLSZsdDthcmcgdmFsdWU9Ii1zcyIvJmd0Ow0KLSZsdDthcmcgdmFsdWU9Ii1nIi8mZ3Q7DQotJmx0O2FyZyB2YWx1ZT0iLXNkIi8mZ3Q7DQotJmx0O2FyZyB2YWx1ZT0iLW8iLyZndDsNCi0mbHQ7YXJnIGZpbGU9Im91dHB1dCIvJmd0Ow0KLSZsdDthcmcgdmFsdWU9Ii1wIi8mZ3Q7DQotJmx0O2FyZyB2YWx1ZT0ib3JnLmV4YW1wbGUudHlwZXMiLyZndDsNCi0mbHQ7L2phdmEmZ3Q7DQotDQotJmx0OyEtLSBNb3ZlIHRoZSBzY2hlbWEgZm9sZGVyIHRvIGNsYXNzcGF0aC0tJmd0Ow0KLSZsdDttb3ZlIHRvZGlyPSIke2J1aWxkLmNsYXNzZXN9IiZndDsNCi0mbHQ7ZmlsZXNldCBkaXI9Im91dHB1dC9yZXNvdXJjZXMiJmd0Ow0KLSZsdDtpbmNsdWRlIG5hbWU9IioqLypzY2hlbWEqLyoqLyouY2xhc3MiLyZndDsNCi0mbHQ7aW5jbHVkZSBuYW1lPSIqKi8qc2NoZW1hKi8qKi8qLnhzYiIvJmd0Ow0KLSZsdDsvZmlsZXNldCZndDsNCi0mbHQ7L21vdmUmZ3Q7DQotDQotJmx0Oy90YXJnZXQmZ3Q7DQotDQotJmx0O3RhcmdldCBuYW1lPSJqYXJfd3NkbCIgZGVwZW5kcz0iY29tcGlsZSImZ3Q7DQotJmx0O2phciBqYXJmaWxlPSJsaWIvYXhpczJfZXhhbXBsZV93c2RsLmphciIgJmd0Ow0KLSZsdDtmaWxlc2V0IGRpcj0iJHtidWlsZC5jbGFzc2VzfSIgLyZndDsNCi0mbHQ7L2phciZndDsNCi0mbHQ7L3RhcmdldCZndDsNCi0NCi0mbHQ7IS0tIGJ1aWxkIGFuIC5hYXIgZmlsZSBmb3IgYXhpczIgd2ViIHNlcnZpY2VzIC0tJmd0Ow0KLSZsdDt0YXJnZXQgbmFtZT0iYWFyIiBkZXBlbmRzPSJjb21waWxlIiZndDsNCi0mbHQ7ZGVsZXRlIGRpcj0iJHtidWlsZC5jbGFzc2VzfS9NRVRBLUlORiIgLyZndDsNCi0mbHQ7bWtkaXIgZGlyPSIke2J1aWxkLmNsYXNzZXN9L01FVEEtSU5GIiAvJmd0Ow0KLSZsdDtjb3B5IHRvZGlyPSIke2J1aWxkLmNsYXNzZXN9L01FVEEtSU5GIiAmZ3Q7DQotJmx0O2ZpbGVzZXQgZGlyPSJvdXRwdXQvcmVzb3VyY2VzIiAmZ3Q7DQotJmx0OyEtLSBheGlzMiB3ZWIgc2VydmljZXMgZGVmaW5pdGlvbnMgZmlsZSAtLSZndDsNCi0mbHQ7aW5jbHVkZSBuYW1lPSJzZXJ2aWNlcy54bWwiLyZndDsNCi0mbHQ7L2ZpbGVzZXQmZ3Q7DQotJmx0O2ZpbGVzZXQgZGlyPSJ3c2RsIiAmZ3Q7DQotJmx0O2luY2x1ZGUgbmFtZT0iTG9naW5FbmRwb2ludC53c2RsIi8mZ3Q7DQotJmx0Oy9maWxlc2V0Jmd0Ow0KLSZsdDsvY29weSZndDsNCi0mbHQ7amFyIGphcmZpbGU9ImRpc3QvTG9naW5FbmRwb2ludC5hYXIiICZndDsNCi0mbHQ7ZmlsZXNldCBkaXI9IiR7YnVpbGQuY2xhc3Nlc30iIC8mZ3Q7DQotJmx0Oy9qYXImZ3Q7DQotJmx0Oy90YXJnZXQmZ3Q7DQotDQotJmx0O3RhcmdldCBuYW1lPSJjb21waWxlX2NsaWVudCImZ3Q7DQotJmx0O2VjaG8gbWVzc2FnZT0iQ29tcGlsaW5nIGNsaWVudCBmaWxlcyIvJmd0Ow0KLQ0KLSZsdDtqYXZhYw0KLXNyY2Rpcj0ic3JjIg0KLWRlc3RkaXI9IiR7YnVpbGQuY2xhc3Nlc30iDQotZGVwcmVjYXRpb249InRydWUiDQotZmFpbG9uZXJyb3I9InRydWUiIGRlYnVnPSJ0cnVlIiZndDsNCi0NCi0mbHQ7Y2xhc3NwYXRoIHJlZmlkPSJheGlzLmNsYXNzcGF0aCIvJmd0Ow0KLSZsdDsvamF2YWMmZ3Q7DQotDQotJmx0Oy90YXJnZXQmZ3Q7DQotDQotJmx0O3RhcmdldCBuYW1lPSJydW5Mb2dpbiIgZGVwZW5kcz0icHJlcGFyZSxjb21waWxlX2NsaWVudCIgZGVzY3JpcHRpb249InJ1biBzaW1wbGUgTG9naW4gY2xpZW50IiZndDsNCi0mbHQ7amF2YSBjbGFzc25hbWU9Im9yZy5jbGllbnQuTG9naW5DbGllbnQiICZndDsNCi0mbHQ7Y2xhc3NwYXRoIHJlZmlkPSJheGlzX2NsaWVudC5jbGFzc3BhdGgiLyZndDsNCi0mbHQ7L2phdmEmZ3Q7DQotJmx0Oy90YXJnZXQmZ3Q7DQotDQotJmx0Oy9wcm9qZWN0Jmd0Ow0KLTwvcHJlPg0KLTxwPlBsYWNlIHRoZSBhYm92ZSBidWlsZC54bWwgZmlsZSBpbiB0aGUgJ2JpbicgZGlyZWN0b3J5IG9mIHRoZQ0KLWF4aXMyIGJpbmFyeSBkaXN0cmlidXRpb24uIFRoZW4gY3JlYXRlIGEgYnVpbGQucHJvcGVydGllcyBmaWxlIGluDQotdGhlIHNhbWUgZGlyZWN0b3J5IGFuZCBzcGVjaWZ5IHRoZSBheGlzLmhvbWUgcGF0aCBwb2ludGluZyB0byB0aGUNCi1heGlzMiBiaW5hcnkgZGlzdHJpYnV0aW9uPC9wPg0KLTxwPkUuZy4gOi0gYXhpcy5ob21lPUM6Ly9BeGlzMi8vYXhpczItMS4xLWJpbjwvcD4NCi08cD5UaGUgYWJvdmUgYnVpbGQueG1sIGV4YW1wbGUgYWxzbyBhc3N1bWVzIHRocmVlIGVtcHR5IGRpcmVjdG9yaWVzDQotZXhpc3QsICdkaXN0JywgJ2xpYicsIGFuZCAnc3JjJy48L3A+DQotPHA+QmVsb3cgaXMgYSB2YWxpZGF0ZWQgV1NETCBEb2N1bWVudCBmb2xsb3dpbmcgdGhlDQotRG9jdW1lbnQvTGl0ZXJhbCBTdHlsZS4gVGhlIG5hbWUgb2YgdGhpcyBmaWxlIG1hdGNoZXMgdGhlIG5hbWUgdXNlZA0KLWluIHRoZSBXU0RMMkphdmEgYW50IHRhc2sgYWJvdmUsIExvZ2luRW5kcG9pbnQud3NkbC48L3A+DQotPHByZSBjbGFzcz0iY29kZSI+DQotJmx0Oz94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPyZndDsNCi0NCi0gICAgJmx0O2RlZmluaXRpb25zIG5hbWU9IkxvZ2luU2VydmljZSIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vbG9naW4iIHhtbG5zOnRucz0iaHR0cDovL2xvZ2luIg0KLSAgICB4bWxucz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiDQotICAgIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iIHhtbG5zOm5zMj0iaHR0cDovL2xvZ2luL3R5cGVzIiZndDsNCi0NCi0gICAgJmx0O3R5cGVzJmd0Ow0KLSAgICAmbHQ7c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2xvZ2luL3R5cGVzIiB4bWxuczp0bnM9Imh0dHA6Ly9sb2dpbi90eXBlcyINCi0gICAgeG1sbnM6c29hcDExLWVuYz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iDQotICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQotICAgIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIg0KLSAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiJmd0Ow0KLSAgICAmbHQ7aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLyZndDsNCi0gICAgJmx0O2VsZW1lbnQgbmFtZT0icmV0dXJuV2ViTG9naW5FbGVtZW50IiZndDsNCi0gICAgJmx0O2NvbXBsZXhUeXBlJmd0Ow0KLSAgICAmbHQ7c2VxdWVuY2UmZ3Q7DQotDQotICAgICZsdDtlbGVtZW50IHJlZj0idG5zOnNvYXBfc2Vzc2lvbl9pZEVsZW1lbnQiLyZndDsNCi0gICAgJmx0O2VsZW1lbnQgcmVmPSJ0bnM6d2ViX3VzZXJfbmFtZUVsZW1lbnQiLyZndDsNCi0gICAgJmx0Oy9zZXF1ZW5jZSZndDsNCi0gICAgJmx0Oy9jb21wbGV4VHlwZSZndDsNCi0gICAgJmx0Oy9lbGVtZW50Jmd0Ow0KLSAgICAmbHQ7ZWxlbWVudCBuYW1lPSJ3ZWJMb2dpbkVsZW1lbnQiJmd0Ow0KLQ0KLSAgICAmbHQ7Y29tcGxleFR5cGUmZ3Q7DQotICAgICZsdDtzZXF1ZW5jZSZndDsNCi0gICAgJmx0O2VsZW1lbnQgcmVmPSJ0bnM6dXNlcl9uYW1lRWxlbWVudCIvJmd0Ow0KLSAgICAmbHQ7ZWxlbWVudCByZWY9InRuczp1c2VyX3Bhc3N3b3JkRWxlbWVudCIvJmd0Ow0KLSAgICAmbHQ7L3NlcXVlbmNlJmd0Ow0KLSAgICAmbHQ7L2NvbXBsZXhUeXBlJmd0Ow0KLQ0KLSAgICAmbHQ7L2VsZW1lbnQmZ3Q7DQotICAgICZsdDtlbGVtZW50IG5hbWU9InVzZXJfbmFtZUVsZW1lbnQiIHR5cGU9InhzZDpzdHJpbmciLyZndDsNCi0gICAgJmx0O2VsZW1lbnQgbmFtZT0idXNlcl9wYXNzd29yZEVsZW1lbnQiIHR5cGU9InhzZDpzdHJpbmciLyZndDsNCi0gICAgJmx0O2VsZW1lbnQgbmFtZT0ic29hcF9zZXNzaW9uX2lkRWxlbWVudCIgdHlwZT0ieHNkOnN0cmluZyIvJmd0Ow0KLSAgICAmbHQ7ZWxlbWVudCBuYW1lPSJ3ZWJfdXNlcl9uYW1lRWxlbWVudCIgdHlwZT0ieHNkOnN0cmluZyIvJmd0Ow0KLSAgICAmbHQ7L3NjaGVtYSZndDsmbHQ7L3R5cGVzJmd0Ow0KLQ0KLSAgICAmbHQ7bWVzc2FnZSBuYW1lPSJMb2dpbkVuZHBvaW50X3dlYkxvZ2luIiZndDsNCi0gICAgJmx0O3BhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0ibnMyOndlYkxvZ2luRWxlbWVudCIvJmd0Ow0KLSAgICAmbHQ7L21lc3NhZ2UmZ3Q7DQotICAgICZsdDttZXNzYWdlIG5hbWU9IkxvZ2luRW5kcG9pbnRfd2ViTG9naW5SZXNwb25zZSImZ3Q7DQotICAgICZsdDtwYXJ0IG5hbWU9InJlc3VsdCIgZWxlbWVudD0ibnMyOnJldHVybldlYkxvZ2luRWxlbWVudCIvJmd0Ow0KLSAgICAmbHQ7L21lc3NhZ2UmZ3Q7DQotDQotICAgICZsdDtwb3J0VHlwZSBuYW1lPSJMb2dpbkVuZHBvaW50IiZndDsNCi0gICAgJmx0O29wZXJhdGlvbiBuYW1lPSJ3ZWJMb2dpbiImZ3Q7DQotICAgICZsdDtpbnB1dCBtZXNzYWdlPSJ0bnM6TG9naW5FbmRwb2ludF93ZWJMb2dpbiIgbmFtZT0iTG9naW5FbmRwb2ludF93ZWJMb2dpbiIvJmd0Ow0KLSAgICAmbHQ7b3V0cHV0IG1lc3NhZ2U9InRuczpMb2dpbkVuZHBvaW50X3dlYkxvZ2luUmVzcG9uc2UiIG5hbWU9IkxvZ2luRW5kcG9pbnRfd2ViTG9naW5SZXNwb25zZSIvJmd0Ow0KLSAgICAmbHQ7L29wZXJhdGlvbiZndDsNCi0gICAgJmx0Oy9wb3J0VHlwZSZndDsNCi0NCi0gICAgJmx0O2JpbmRpbmcgbmFtZT0iTG9naW5FbmRwb2ludEJpbmRpbmciIHR5cGU9InRuczpMb2dpbkVuZHBvaW50IiZndDsNCi0gICAgJmx0O3NvYXA6YmluZGluZyB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIgc3R5bGU9ImRvY3VtZW50Ii8mZ3Q7DQotICAgICZsdDtvcGVyYXRpb24gbmFtZT0id2ViTG9naW4iJmd0Ow0KLSAgICAmbHQ7c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0id2ViTG9naW4iLyZndDsNCi0gICAgJmx0O2lucHV0IG5hbWU9IkxvZ2luRW5kcG9pbnRfd2ViTG9naW4iJmd0Ow0KLSAgICAmbHQ7c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvJmd0Ow0KLQ0KLSAgICAmbHQ7L2lucHV0Jmd0Ow0KLSAgICAmbHQ7b3V0cHV0IG5hbWU9IkxvZ2luRW5kcG9pbnRfd2ViTG9naW5SZXNwb25zZSImZ3Q7DQotICAgICZsdDtzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8mZ3Q7DQotICAgICZsdDsvb3V0cHV0Jmd0Ow0KLSAgICAmbHQ7L29wZXJhdGlvbiZndDsNCi0gICAgJmx0Oy9iaW5kaW5nJmd0Ow0KLQ0KLSAgICAmbHQ7c2VydmljZSBuYW1lPSJMb2dpblNlcnZpY2UiJmd0Ow0KLSAgICAmbHQ7cG9ydCBuYW1lPSJMb2dpbkVuZHBvaW50UG9ydCIgYmluZGluZz0idG5zOkxvZ2luRW5kcG9pbnRCaW5kaW5nIiZndDsNCi0gICAgJmx0O3NvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo4MDgwL2F4aXMyL3NlcnZpY2VzL0xvZ2luU2VydmljZSIvJmd0OyZsdDsvcG9ydCZndDsNCi0gICAgJmx0Oy9zZXJ2aWNlJmd0OyZsdDsvZGVmaW5pdGlvbnMmZ3Q7DQotPC9wcmU+DQotPHA+UGxhY2UgdGhlIGFib3ZlIGZpbGUsIG5hbWVkIExvZ2luRW5kcG9pbnQud3NkbCwgaW4gdGhlIGRpcmVjdG9yeQ0KLSd3c2RsJyB3aGljaCBpcyBhbHNvIGluc2lkZSB0aGUgJ2JpbicgZGlyZWN0b3J5LiBSdW4gdGhlIHdzZGwyamF2YQ0KLWNvbW1hbmQgdmlhIHRoZSBhbnQgdGFzayBkZWZpbmVkIGFib3ZlICgmZ3Q7YW50IHdzZGwyamF2YSksIGFuZA0KLXRoZXJlIHdpbGwgYmUgYSBkaXJlY3RvcnkgY2FsbGVkICdvdXRwdXQnIGNyZWF0ZWQuIFRoaXMgZGlyZWN0b3J5DQotY29udGFpbnMgdGhlIFdTREwySmF2YSBnZW5lcmF0ZWQgc291cmNlLjwvcD4NCi08cD5BbiBpbXBvcnRhbnQgZGV0YWlsIGlzIHRoYXQgYW4gWE1MQmVhbiBjbGFzcyBmaWxlIGlzIGFsc28NCi1nZW5lcmF0ZWQgYnkgV1NETDJKYXZhLCBUeXBlU3lzdGVtSG9sZGVyLmNsYXNzLiBUaGF0IGZpbGUgaXMgcGxhY2VkDQotaW50byBidWlsZC9jbGFzc2VzIGJ5IHRoZSBhYm92ZSBhbnQgdGFzayBhbmQgd2lsbCBiZSBuZWVkZWQgdG8NCi1jb21waWxlIHRoZSBnZW5lcmF0ZWQgc291cmNlcy4gQSBmcmVxdWVudCBwcm9ibGVtIGlzIHVzZXJzIGdldCBhbg0KLWVycm9yIHN1Y2ggYXM6PC9wPg0KLTxwPjxlbT48Yj5DbGFzc05vdEZvdW5kRXhjZXB0aW9uIDogQ2Fubm90IGxvYWQgU2NoZW1hVHlwZVN5c3RlbS4NCi1VbmFibGUgdG8gbG9hZCBjbGFzcyB3aXRoIG5hbWUNCi1zY2hlbWFvcmdfYXBhY2hlX3htbGJlYW5zLnN5c3RlbS5zNjhDNDFEQjgxMkY1MkM5NzU0MzlCQTEwRkU0RkVFNTQuVHlwZVN5c3RlbUhvbGRlci4NCi1NYWtlIHN1cmUgdGhlIGdlbmVyYXRlZCBiaW5hcnkgZmlsZXMgYXJlIG9uIHRoZQ0KLWNsYXNzcGF0aC48L2I+PC9lbT48L3A+DQotPHA+VGhlIFR5cGVTeXN0ZW1Ib2xkZXIuY2xhc3MgZ2VuZXJhdGVkIGJ5IFdTREwySmF2YSBtdXN0IGJlIHBsYWNlZA0KLWluIHlvdXIgY2xhc3NwYXRoIGluIG9yZGVyIHRvIGF2b2lkIHRoaXMgZXJyb3IuPC9wPg0KLTxwPlRoZSBuZXh0IHN0ZXAgaXMgdG8gbW9kaWZ5IHRoZSBnZW5lcmF0ZWQgU2tlbGV0b24gSmF2YSBTb3VyY2UNCi1maWxlIC0gdGhlIFdlYiBzZXJ2aWNlLiBUaGlzIGZpbGUgYXMgZ2VuZXJhdGVkIHJldHVybnMgbnVsbCBhbmQNCi1uZWVkcyB0byBiZSB1cGRhdGVkIHRvIGNvbnRhaW4gdGhlIGJ1c2luZXNzIGxvZ2ljLjwvcD4NCi08cD5BZnRlciB0aGUgV1NETDJKYXZhIGNvbW1hbmQgcnVucyB0aGUgZmlsZSBMb2dpbkVuZHBvaW50LndzZGwsDQotZWRpdCB0aGUgZm9sbG93aW5nIGZpbGU6PC9wPg0KLTxwPm91dHB1dC9zcmMvb3JnL2V4YW1wbGUvdHlwZXMvTG9naW5TZXJ2aWNlU2tlbGV0b24uamF2YS4gWW91DQotc2hvdWxkIHNlZSB0aGUgZm9sbG93aW5nIGNvZGU6PC9wPg0KLTxwcmUgY2xhc3M9ImNvZGUiPg0KLS8qKg0KLSAgICAqIExvZ2luU2VydmljZVNrZWxldG9uLmphdmENCi0gICAgKg0KLSAgICAqIFRoaXMgZmlsZSB3YXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBXU0RMDQotICAgICogYnkgdGhlIEFwYWNoZSBBeGlzMiB2ZXJzaW9uOiAxLjAtUkM0IEFwciAyOCwgMjAwNiAoMDU6MjM6MjMgSVNUKQ0KLSAgICAqLw0KLSAgICBwYWNrYWdlIG9yZy5leGFtcGxlLnR5cGVzOw0KLSAgICAvKioNCi0gICAgKiBMb2dpblNlcnZpY2VTa2VsZXRvbiBqYXZhIHNrZWxldG9uIGZvciB0aGUgYXhpc1NlcnZpY2UNCi0gICAgKi8NCi0gICAgcHVibGljIGNsYXNzIExvZ2luU2VydmljZVNrZWxldG9uIHsNCi0NCi0NCi0gICAgLyoqDQotICAgICogQXV0byBnZW5lcmF0ZWQgbWV0aG9kIHNpZ25hdHVyZQ0KLQ0KLSAgICAqIEBwYXJhbSBwYXJhbTANCi0NCi0gICAgKi8NCi0gICAgcHVibGljIGxvZ2luLnR5cGVzLlJldHVybldlYkxvZ2luRWxlbWVudERvY3VtZW50IHdlYkxvZ2luDQotICAgIChsb2dpbi50eXBlcy5XZWJMb2dpbkVsZW1lbnREb2N1bWVudCBwYXJhbTAgKQ0KLQ0KLSAgICB7DQotICAgIC8vVG9kbyBmaWxsIHRoaXMgd2l0aCB0aGUgbmVjZXNzYXJ5IGJ1c2luZXNzIGxvZ2ljDQotICAgIHRocm93IG5ldyBqYXZhLmxhbmcuVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsNCi0gICAgfQ0KLQ0KLSAgICB9DQotPC9wcmU+DQotPHA+UmVwbGFjZSB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIHdpdGggdGhlIGZvbGxvd2luZywgd2hpY2ggdXNlcw0KLXRoZSBjb21wbGV4IHR5cGVzIGdlbmVyYXRlZCBieSBXU0RMMkphdmEgYW5kIHRoZSBleGFtcGxlIHdzZGwNCi1maWxlOjwvcD4NCi08cHJlIGNsYXNzPSJjb2RlIj4NCi0vKioNCi0gICAgKiBMb2dpblNlcnZpY2VTa2VsZXRvbi5qYXZhDQotICAgICoNCi0gICAgKiBUaGlzIGZpbGUgd2FzIGF1dG8tZ2VuZXJhdGVkIGZyb20gV1NETA0KLSAgICAqIGJ5IHRoZSBBcGFjaGUgQXhpczIgdmVyc2lvbjogMS4wLVJDNCBBcHIgMjgsIDIwMDYgKDA1OjIzOjIzIElTVCkNCi0gICAgKi8NCi0gICAgcGFja2FnZSBvcmcuZXhhbXBsZS50eXBlczsNCi0gICAgaW1wb3J0IGxvZ2luLnR5cGVzLlJldHVybldlYkxvZ2luRWxlbWVudERvY3VtZW50Ow0KLSAgICBpbXBvcnQgbG9naW4udHlwZXMuUmV0dXJuV2ViTG9naW5FbGVtZW50RG9jdW1lbnQuKjsNCi0gICAgaW1wb3J0IGxvZ2luLnR5cGVzLldlYkxvZ2luRWxlbWVudERvY3VtZW50Ow0KLSAgICBpbXBvcnQgbG9naW4udHlwZXMuV2ViTG9naW5FbGVtZW50RG9jdW1lbnQuKjsNCi0NCi0gICAgLyoqDQotICAgICogQXV0byBnZW5lcmF0ZWQgamF2YSBza2VsZXRvbiBmb3IgdGhlIHNlcnZpY2UgYnkgdGhlIEF4aXMgY29kZSBnZW5lcmF0b3INCi0gICAgKi8NCi0gICAgcHVibGljIGNsYXNzIExvZ2luU2VydmljZVNrZWxldG9uIHsNCi0NCi0gICAgLyoqDQotICAgICogQXV0byBnZW5lcmF0ZWQgbWV0aG9kIHNpZ25hdHVyZQ0KLQ0KLSAgICAqIEBwYXJhbSB3ZWJMb2dpbkVsZW1lbnREb2N1bWVudCBjaGFuZ2VkIGZyb20gcGFyYW0wDQotDQotICAgICovDQotICAgIHB1YmxpYyBSZXR1cm5XZWJMb2dpbkVsZW1lbnREb2N1bWVudCB3ZWJMb2dpbg0KLSAgICAoV2ViTG9naW5FbGVtZW50RG9jdW1lbnQgd2ViTG9naW5FbGVtZW50RG9jdW1lbnQgKXsNCi0NCi0gICAgLy9Ub2RvIGZpbGwgdGhpcyB3aXRoIHRoZSBuZWNlc3NhcnkgYnVzaW5lc3MgbG9naWMNCi0gICAgU3lzdGVtLm91dC5wcmludGxuKCJMb2dpblNlcnZpY2VTa2VsZXRvbi53ZWJMb2dpbiByZWFjaGVkIHN1Y2Nlc3NmdWxseSEiKTsNCi0NCi0gICAgLy8gR2V0IHBhcmFtZXRlcnMgcGFzc2VkIGluDQotICAgIFdlYkxvZ2luRWxlbWVudCB3ZWJMb2dpbkVsZW1lbnQgPSB3ZWJMb2dpbkVsZW1lbnREb2N1bWVudC5nZXRXZWJMb2dpbkVsZW1lbnQoKTsNCi0gICAgU3RyaW5nIHVzZXJOYW1lID0gd2ViTG9naW5FbGVtZW50LmdldFVzZXJOYW1lRWxlbWVudCgpOw0KLSAgICBTdHJpbmcgcGFzc3dvcmQgPSB3ZWJMb2dpbkVsZW1lbnQuZ2V0VXNlclBhc3N3b3JkRWxlbWVudCgpOw0KLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkxvZ2luU2VydmljZVNrZWxldG9uLndlYkxvZ2luIHVzZXJOYW1lOiAiICsgdXNlck5hbWUpOw0KLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkxvZ2luU2VydmljZVNrZWxldG9uLndlYkxvZ2luIHBhc3N3b3JkOiAiICsgcGFzc3dvcmQpOw0KLQ0KLSAgICAvLyBpbnB1dCBwYXJhbWF0ZXJzIHdvdWxkIGJlIHVzZWQgaGVyZQ0KLQ0KLSAgICAvLyBwcmVwYXJlIG91dHB1dA0KLSAgICBSZXR1cm5XZWJMb2dpbkVsZW1lbnREb2N1bWVudCByZXREb2MgPQ0KLSAgICBSZXR1cm5XZWJMb2dpbkVsZW1lbnREb2N1bWVudC5GYWN0b3J5Lm5ld0luc3RhbmNlKCk7DQotDQotICAgIFJldHVybldlYkxvZ2luRWxlbWVudCByZXRFbGVtZW50ID0gUmV0dXJuV2ViTG9naW5FbGVtZW50LkZhY3RvcnkubmV3SW5zdGFuY2UoKTsNCi0NCi0gICAgcmV0RWxlbWVudC5zZXRXZWJVc2VyTmFtZUVsZW1lbnQoImpvZSBzaXhwYWNrIik7DQotICAgIHJldEVsZW1lbnQuc2V0U29hcFNlc3Npb25JZEVsZW1lbnQoInNvbWVfcmFuZG9tX3N0cmluZyIpOw0KLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oInZhbGlkYXRlIHJldEVsZW1lbnQ6ICIgKyByZXRFbGVtZW50LnZhbGlkYXRlKCkpOw0KLQ0KLSAgICByZXREb2Muc2V0UmV0dXJuV2ViTG9naW5FbGVtZW50KHJldEVsZW1lbnQpOw0KLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oInZhbGlkYXRlIHJldERvYzogIiArIHJldERvYy52YWxpZGF0ZSgpKTsNCi0NCi0gICAgU3lzdGVtLm91dC5wcmludGxuKCJMb2dpblNlcnZpY2VTa2VsZXRvbi53ZWJMb2dpbiByZXR1cm5pbmcuLi4iKTsNCi0NCi0gICAgcmV0dXJuIHJldERvYzsNCi0NCi0gICAgfQ0KLSAgICB9DQotPC9wcmU+DQotPHA+VGhlIG5leHQgc3RlcHMgYXNzdW1lIHRoZSBheGlzMi53YXIgaGFzIGJlZW4gZGVwbG95ZWQgYW5kIGhhcw0KLWV4cGFuZGVkIGluIGEgc2VydmxldCBjb250YWluZXIuPC9wPg0KLTxwPlJ1biB0aGUgJ2phcl93c2RsJyBhbnQgdGFzayBmcm9tIHRoZSBleGFtcGxlIGJ1aWxkLnhtbCAoJmd0O2FudA0KLWphcl93c2RsKSwgd2hpY2ggZ2VuZXJhdGVzIGEgamFyIGZpbGUgYXhpczJfZXhhbXBsZV93c2RsLmphciBpbiB0aGUNCi0nYmluL2xpYicgZGlyZWN0b3J5LiBUaGlzIGphciB3aWxsIGJlIHVzZWQgdG8gY29tcGlsZSB0aGUgY2xpZW50LA0KLWFuZCBhbHNvIHdpbGwgYmUgcGxhY2VkIGluIHRoZSBzZXJ2bGV0IGNvbnRhaW5lci48L3A+DQotPHA+TmV4dCwgcnVuIHRoZSAnYWFyJyBhbnQgdGFzayBmcm9tIHRoZSBleGFtcGxlIGJ1aWxkLnhtbCAoJmd0O2FudA0KLWFhciksIHdoaWNoIGdlbmVyYXRlcyB0aGUgZGVwbG95YWJsZSBheGlzMiBXZWIgc2VydmljZS4gUGxhY2UNCi1kaXN0L0xvZ2luRW5kcG9pbnQuYWFyIGludG8gYXhpczIvV0VCLUlORi9zZXJ2aWNlcyAuIFBsYWNlDQotbGliL2F4aXMyX2V4YW1wbGVfd3NkbC5qYXIgaW50byBheGlzMi9XRUItSU5GL2xpYiAuIFZlcmlmeSB0aGUNCi1oYXBweSBheGlzIHBhZ2UgbG9hZGVkIHRoZSBzZXJ2aWNlcyBjb3JyZWN0bHkgLSB0aGVyZSBzaG91bGQgYmUgdGhlDQotc2VydmljZSAnTG9naW5FbmRwb2ludCcgd2l0aCB0aGUgYXZhaWxhYmxlIG9wZXJhdGlvbiAnd2ViTG9naW4nDQotZGlzcGxheWVkLjwvcD4NCi08cD5UaGUgbGFzdCBzdGVwIGlzIHRvIGNyZWF0ZSBhbmQgcnVuIHRoZSBjbGllbnQuIEluIHRoZSBzcmMNCi1kaXJlY3RvcnkgY3JlYXRlIHRoZSBmaWxlIG9yZy5jbGllbnQuTG9naW5DbGllbnQuamF2YSwgd2l0aCB0aGUNCi1jb250ZW50cyBiZWxvdzo8L3A+DQotPHByZSBjbGFzcz0iY29kZSI+DQotcGFja2FnZSBvcmcuY2xpZW50Ow0KLQ0KLSAgICBpbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7DQotDQotICAgIGltcG9ydCBsb2dpbi50eXBlcy5SZXR1cm5XZWJMb2dpbkVsZW1lbnREb2N1bWVudDsNCi0gICAgaW1wb3J0IGxvZ2luLnR5cGVzLlJldHVybldlYkxvZ2luRWxlbWVudERvY3VtZW50Lio7DQotICAgIGltcG9ydCBsb2dpbi50eXBlcy5XZWJMb2dpbkVsZW1lbnREb2N1bWVudDsNCi0gICAgaW1wb3J0IGxvZ2luLnR5cGVzLldlYkxvZ2luRWxlbWVudERvY3VtZW50Lio7DQotICAgIGltcG9ydCBvcmcuZXhhbXBsZS50eXBlcy5Mb2dpblNlcnZpY2VTdHViOw0KLQ0KLSAgICAvKioNCi0gICAgKiBMb2dpbi4NCi0gICAgKg0KLSAgICAqLw0KLSAgICBwdWJsaWMgY2xhc3MgTG9naW5DbGllbnQgew0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7DQotICAgIHRyeSB7DQotDQotICAgIFN5c3RlbS5vdXQucHJpbnRsbigid2ViTG9naW4sIGZpcmluZy4uLiIpOw0KLSAgICBMb2dpblNlcnZpY2VTdHViIHN0dWIgPSBuZXcgTG9naW5TZXJ2aWNlU3R1YigpOw0KLQ0KLSAgICBXZWJMb2dpbkVsZW1lbnREb2N1bWVudCB3ZWJMb2dpbkVsZW1lbnREb2N1bWVudA0KLSAgICA9IFdlYkxvZ2luRWxlbWVudERvY3VtZW50LkZhY3RvcnkubmV3SW5zdGFuY2UoKTsNCi0gICAgV2ViTG9naW5FbGVtZW50IHdlYkxvZ2luRWxlbWVudCA9DQotICAgIFdlYkxvZ2luRWxlbWVudC5GYWN0b3J5Lm5ld0luc3RhbmNlKCk7DQotICAgIHdlYkxvZ2luRWxlbWVudC5zZXRVc2VyTmFtZUVsZW1lbnQoImpvZSIpOw0KLSAgICB3ZWJMb2dpbkVsZW1lbnQuc2V0VXNlclBhc3N3b3JkRWxlbWVudCgic2l4cGFjayIpOw0KLQ0KLSAgICB3ZWJMb2dpbkVsZW1lbnREb2N1bWVudC5zZXRXZWJMb2dpbkVsZW1lbnQod2ViTG9naW5FbGVtZW50KTsNCi0NCi0gICAgU3lzdGVtLm91dC5wcmludGxuKCJ2YWxpZGF0ZTogIiArIHdlYkxvZ2luRWxlbWVudC52YWxpZGF0ZSgpKTsNCi0gICAgc3R1Yi53ZWJMb2dpbih3ZWJMb2dpbkVsZW1lbnREb2N1bWVudCk7DQotDQotICAgIFJldHVybldlYkxvZ2luRWxlbWVudERvY3VtZW50IHJldHVybldlYkxvZ2luRWxlbWVudERvY3VtZW50ID0NCi0gICAgc3R1Yi53ZWJMb2dpbih3ZWJMb2dpbkVsZW1lbnREb2N1bWVudCk7DQotDQotICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ2xpZW50IHJldHVybmVkIik7DQotDQotICAgIFJldHVybldlYkxvZ2luRWxlbWVudERvY3VtZW50LlJldHVybldlYkxvZ2luRWxlbWVudA0KLSAgICByZXRFbGVtZW50ID0gcmV0dXJuV2ViTG9naW5FbGVtZW50RG9jdW1lbnQuZ2V0UmV0dXJuV2ViTG9naW5FbGVtZW50KCk7DQotDQotICAgIFN5c3RlbS5vdXQucHJpbnRsbigiV2ViVXNlck5hbWU6ICIgKyByZXRFbGVtZW50LmdldFdlYlVzZXJOYW1lRWxlbWVudCgpKTsNCi0gICAgU3lzdGVtLm91dC5wcmludGxuKCJTT0FQU2Vzc2lvbklkOiAiICsgcmV0RWxlbWVudC5nZXRTb2FwU2Vzc2lvbklkRWxlbWVudCgpKTsNCi0gICAgU3lzdGVtLm91dC5wcmludGxuKCJ3ZWJMb2dpbiwgY29tcGxldGVkISEhIik7DQotDQotICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBheGlzRmF1bHQpIHsNCi0gICAgYXhpc0ZhdWx0LnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsNCi0gICAgZXgucHJpbnRTdGFja1RyYWNlKCk7DQotICAgIH0NCi0gICAgfQ0KLSAgICB9DQotPC9wcmU+DQotPHA+Tm93IHJ1biB0aGUgYW50IHRhc2sgJ3J1bkxvZ2luJyAoJmd0O2FudCBydW5Mb2dpbikuIFRoZQ0KLWZvbGxvd2luZyBvdXRwdXQgc2hvdWxkIGFwcGVhcjo8L3A+DQotPHByZSBjbGFzcz0iY29kZSI+DQotcnVuTG9naW46DQotICAgIFtlY2hvXSBydW5uaW5nIHRoZSB3ZWJMb2dpbiBjbGllbnQNCi0gICAgW2phdmFdIHdlYkxvZ2luLCBmaXJpbmcuLi4NCi0gICAgW2phdmFdIHZhbGlkYXRlOiB0cnVlDQotICAgIFtqYXZhXSBDbGllbnQgcmV0dXJuZWQNCi0gICAgW2phdmFdIFdlYlVzZXJOYW1lOiBqb2Ugc2l4cGFjaw0KLSAgICBbamF2YV0gU09BUFNlc3Npb25JZDogc29tZV9yYW5kb21fc3RyaW5nDQotICAgIFtqYXZhXSB3ZWJMb2dpbiwgY29tcGxldGVkISEhDQotPC9wcmU+DQotPGEgbmFtZT0iYXBwZW5kaXgiIGlkPSJhcHBlbmRpeCI+PC9hPg0KLTxoMj5BcHBlbmRpeDwvaDI+DQotPHVsPg0KLTxsaT5FY2xpcHNlIHJlZmVyZW5jZSAtIDxhIGhyZWY9DQotImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvYT48L2xpPg0KLTxsaT5DdXN0b20gQW50IFRhc2tzIC0gPGEgaHJlZj0NCi0iaHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC9kZXZlbG9wLmh0bWwiPmh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvZGV2ZWxvcC5odG1sPC9hPjwvbGk+DQotPC91bD4NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2VjbGlwc2UvaW1hZ2VzL1NlcnZpY2VQYWdlMS5qcGcgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9lY2xpcHNlL2ltYWdlcy9TZXJ2aWNlUGFnZTEuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDc1OGZkLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2VjbGlwc2UvaW1hZ2VzL1NlcnZpY2VQYWdlMS5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9lY2xpcHNlL2ltYWdlcy9TZXJ2aWNlV2l6YXJkU2VsZWN0aW9uLmpwZyBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2VjbGlwc2UvaW1hZ2VzL1NlcnZpY2VXaXphcmRTZWxlY3Rpb24uanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzQ4M2I3Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2VjbGlwc2UvaW1hZ2VzL1NlcnZpY2VXaXphcmRTZWxlY3Rpb24uanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvZWNsaXBzZS9pbWFnZXMvaGVscC5qcGcgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9lY2xpcHNlL2ltYWdlcy9oZWxwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTlhYzk2ZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9lY2xpcHNlL2ltYWdlcy9oZWxwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2VjbGlwc2UvaW1hZ2VzL2phdmEyd3NkbC1zY3JlZW4wLmpwZyBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2VjbGlwc2UvaW1hZ2VzL2phdmEyd3NkbC1zY3JlZW4wLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM1MGRiMC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9lY2xpcHNlL2ltYWdlcy9qYXZhMndzZGwtc2NyZWVuMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9lY2xpcHNlL2ltYWdlcy9qYXZhMndzZGwtc2NyZWVuMC5wbmcgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9lY2xpcHNlL2ltYWdlcy9qYXZhMndzZGwtc2NyZWVuMC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyY2ZmMWQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvZWNsaXBzZS9pbWFnZXMvamF2YTJ3c2RsLXNjcmVlbjAucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvZWNsaXBzZS9pbWFnZXMvamF2YTJ3c2RsLXNjcmVlbjEuanBnIGIvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvZWNsaXBzZS9pbWFnZXMvamF2YTJ3c2RsLXNjcmVlbjEuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMmYyZWZiLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2VjbGlwc2UvaW1hZ2VzL2phdmEyd3NkbC1zY3JlZW4xLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2VjbGlwc2UvaW1hZ2VzL2phdmEyd3NkbC1zY3JlZW4xLnBuZyBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2VjbGlwc2UvaW1hZ2VzL2phdmEyd3NkbC1zY3JlZW4xLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU0NDk3MC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9lY2xpcHNlL2ltYWdlcy9qYXZhMndzZGwtc2NyZWVuMS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9lY2xpcHNlL2ltYWdlcy9qYXZhMndzZGwtc2NyZWVuMi5qcGcgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9lY2xpcHNlL2ltYWdlcy9qYXZhMndzZGwtc2NyZWVuMi5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiZDI5NGUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvZWNsaXBzZS9pbWFnZXMvamF2YTJ3c2RsLXNjcmVlbjIuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvZWNsaXBzZS9pbWFnZXMvamF2YTJ3c2RsLXNjcmVlbjIucG5nIGIvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvZWNsaXBzZS9pbWFnZXMvamF2YTJ3c2RsLXNjcmVlbjIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTIwMDM0Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2VjbGlwc2UvaW1hZ2VzL2phdmEyd3NkbC1zY3JlZW4yLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2VjbGlwc2UvaW1hZ2VzL2phdmEyd3NkbC1zY3JlZW4zLmpwZyBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2VjbGlwc2UvaW1hZ2VzL2phdmEyd3NkbC1zY3JlZW4zLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNiYmYwNy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9lY2xpcHNlL2ltYWdlcy9qYXZhMndzZGwtc2NyZWVuMy5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9lY2xpcHNlL2ltYWdlcy9qYXZhMndzZGwtc2NyZWVuMy5wbmcgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9lY2xpcHNlL2ltYWdlcy9qYXZhMndzZGwtc2NyZWVuMy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhOTc4NWIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvZWNsaXBzZS9pbWFnZXMvamF2YTJ3c2RsLXNjcmVlbjMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvZWNsaXBzZS9pbWFnZXMvamF2YTJ3c2RsLXNjcmVlbjMxLnBuZyBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2VjbGlwc2UvaW1hZ2VzL2phdmEyd3NkbC1zY3JlZW4zMS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2NWQyMGYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvZWNsaXBzZS9pbWFnZXMvamF2YTJ3c2RsLXNjcmVlbjMxLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2VjbGlwc2UvaW1hZ2VzL2phdmEyd3NkbC1zY3JlZW40LnBuZyBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2VjbGlwc2UvaW1hZ2VzL2phdmEyd3NkbC1zY3JlZW40LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI1N2ZmMi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9lY2xpcHNlL2ltYWdlcy9qYXZhMndzZGwtc2NyZWVuNC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9lY2xpcHNlL2ltYWdlcy9zZXJ2aWNlX3BhZ2UyLmpwZyBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2VjbGlwc2UvaW1hZ2VzL3NlcnZpY2VfcGFnZTIuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWQzYWZjLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2VjbGlwc2UvaW1hZ2VzL3NlcnZpY2VfcGFnZTIuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvZWNsaXBzZS9pbWFnZXMvc2VydmljZV9wYWdlMy5qcGcgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9lY2xpcHNlL2ltYWdlcy9zZXJ2aWNlX3BhZ2UzLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQzOGVlNC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9lY2xpcHNlL2ltYWdlcy9zZXJ2aWNlX3BhZ2UzLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2VjbGlwc2UvaW1hZ2VzL3NlcnZpY2VfcGFnZTNfaGwuanBnIGIvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvZWNsaXBzZS9pbWFnZXMvc2VydmljZV9wYWdlM19obC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzNmJlMmYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvZWNsaXBzZS9pbWFnZXMvc2VydmljZV9wYWdlM19obC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9lY2xpcHNlL2ltYWdlcy9zZXJ2aWNlX3BhZ2U0X2xvYWQuanBnIGIvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvZWNsaXBzZS9pbWFnZXMvc2VydmljZV9wYWdlNF9sb2FkLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RkNWU2Zi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9lY2xpcHNlL2ltYWdlcy9zZXJ2aWNlX3BhZ2U0X2xvYWQuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvZWNsaXBzZS9pbWFnZXMvc2VydmljZV9wYWdlNF9wbGFpbi5qcGcgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9lY2xpcHNlL2ltYWdlcy9zZXJ2aWNlX3BhZ2U0X3BsYWluLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNiNDk3ZC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9lY2xpcHNlL2ltYWdlcy9zZXJ2aWNlX3BhZ2U0X3BsYWluLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2VjbGlwc2UvaW1hZ2VzL3NlcnZpY2VfcGFnZTRfc2VhcmNoX2RlY2xhcmVkLmpwZyBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2VjbGlwc2UvaW1hZ2VzL3NlcnZpY2VfcGFnZTRfc2VhcmNoX2RlY2xhcmVkLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGUzMDkwMC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9lY2xpcHNlL2ltYWdlcy9zZXJ2aWNlX3BhZ2U0X3NlYXJjaF9kZWNsYXJlZC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9lY2xpcHNlL2ltYWdlcy9zZXJ2aWNlX3BhZ2U0X3RhYmxlLmpwZyBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2VjbGlwc2UvaW1hZ2VzL3NlcnZpY2VfcGFnZTRfdGFibGUuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWYwNDk1Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2VjbGlwc2UvaW1hZ2VzL3NlcnZpY2VfcGFnZTRfdGFibGUuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvZWNsaXBzZS9pbWFnZXMvc2VydmljZV9wYWdlNS5qcGcgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9lY2xpcHNlL2ltYWdlcy9zZXJ2aWNlX3BhZ2U1LmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFmMjI2ZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9lY2xpcHNlL2ltYWdlcy9zZXJ2aWNlX3BhZ2U1LmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2VjbGlwc2UvaW1hZ2VzL3NlcnZpY2VfcGFnZTVfYWRkZWQuanBnIGIvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvZWNsaXBzZS9pbWFnZXMvc2VydmljZV9wYWdlNV9hZGRlZC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzM2UzNzYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvZWNsaXBzZS9pbWFnZXMvc2VydmljZV9wYWdlNV9hZGRlZC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9lY2xpcHNlL2ltYWdlcy9zZXJ2aWNlX3BhZ2U1X2Jyb3dzZWQuanBnIGIvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvZWNsaXBzZS9pbWFnZXMvc2VydmljZV9wYWdlNV9icm93c2VkLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY4MzgxMy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9lY2xpcHNlL2ltYWdlcy9zZXJ2aWNlX3BhZ2U1X2Jyb3dzZWQuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvZWNsaXBzZS9pbWFnZXMvc2VydmljZV9wYWdlNV9obC5qcGcgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9lY2xpcHNlL2ltYWdlcy9zZXJ2aWNlX3BhZ2U1X2hsLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFkMjE0OS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9lY2xpcHNlL2ltYWdlcy9zZXJ2aWNlX3BhZ2U1X2hsLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2VjbGlwc2UvaW1hZ2VzL3NlcnZpY2VfcGFnZTVfcmVtb3ZlLmpwZyBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2VjbGlwc2UvaW1hZ2VzL3NlcnZpY2VfcGFnZTVfcmVtb3ZlLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFiN2Y2My4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9lY2xpcHNlL2ltYWdlcy9zZXJ2aWNlX3BhZ2U1X3JlbW92ZS5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9lY2xpcHNlL2ltYWdlcy9zZXJ2aWNlX3BhZ2U2LmpwZyBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2VjbGlwc2UvaW1hZ2VzL3NlcnZpY2VfcGFnZTYuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZmUxN2M3Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2VjbGlwc2UvaW1hZ2VzL3NlcnZpY2VfcGFnZTYuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvZWNsaXBzZS9pbWFnZXMvc3VjY2Vzc19tc2cuanBnIGIvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvZWNsaXBzZS9pbWFnZXMvc3VjY2Vzc19tc2cuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDVjNmM4Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2VjbGlwc2UvaW1hZ2VzL3N1Y2Nlc3NfbXNnLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2VjbGlwc2UvaW1hZ2VzL3dzZGwyamF2YS1zY3JlZW4wLmpwZyBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2VjbGlwc2UvaW1hZ2VzL3dzZGwyamF2YS1zY3JlZW4wLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjMxOGVmNS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9lY2xpcHNlL2ltYWdlcy93c2RsMmphdmEtc2NyZWVuMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9lY2xpcHNlL2ltYWdlcy93c2RsMmphdmEtc2NyZWVuMC5wbmcgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9lY2xpcHNlL2ltYWdlcy93c2RsMmphdmEtc2NyZWVuMC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwYmMwNDUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvZWNsaXBzZS9pbWFnZXMvd3NkbDJqYXZhLXNjcmVlbjAucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvZWNsaXBzZS9pbWFnZXMvd3NkbDJqYXZhLXNjcmVlbjEuanBnIGIvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvZWNsaXBzZS9pbWFnZXMvd3NkbDJqYXZhLXNjcmVlbjEuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTgxMTNlLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2VjbGlwc2UvaW1hZ2VzL3dzZGwyamF2YS1zY3JlZW4xLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2VjbGlwc2UvaW1hZ2VzL3dzZGwyamF2YS1zY3JlZW4xLnBuZyBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2VjbGlwc2UvaW1hZ2VzL3dzZGwyamF2YS1zY3JlZW4xLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWU5NTAzMi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9lY2xpcHNlL2ltYWdlcy93c2RsMmphdmEtc2NyZWVuMS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9lY2xpcHNlL2ltYWdlcy93c2RsMmphdmEtc2NyZWVuMi5qcGcgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9lY2xpcHNlL2ltYWdlcy93c2RsMmphdmEtc2NyZWVuMi5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0ZDc1MjkuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvZWNsaXBzZS9pbWFnZXMvd3NkbDJqYXZhLXNjcmVlbjIuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvZWNsaXBzZS9pbWFnZXMvd3NkbDJqYXZhLXNjcmVlbjIucG5nIGIvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvZWNsaXBzZS9pbWFnZXMvd3NkbDJqYXZhLXNjcmVlbjIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTYyYTgzLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2VjbGlwc2UvaW1hZ2VzL3dzZGwyamF2YS1zY3JlZW4yLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2VjbGlwc2UvaW1hZ2VzL3dzZGwyamF2YS1zY3JlZW4zLmpwZyBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2VjbGlwc2UvaW1hZ2VzL3dzZGwyamF2YS1zY3JlZW4zLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmEzY2E2NC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9lY2xpcHNlL2ltYWdlcy93c2RsMmphdmEtc2NyZWVuMy5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9lY2xpcHNlL2ltYWdlcy93c2RsMmphdmEtc2NyZWVuMy5wbmcgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9lY2xpcHNlL2ltYWdlcy93c2RsMmphdmEtc2NyZWVuMy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2ZmNkZTguLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvZWNsaXBzZS9pbWFnZXMvd3NkbDJqYXZhLXNjcmVlbjMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvZWNsaXBzZS9pbWFnZXMvd3NkbDJqYXZhLXNjcmVlbjMxLnBuZyBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2VjbGlwc2UvaW1hZ2VzL3dzZGwyamF2YS1zY3JlZW4zMS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2NWQyMGYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvZWNsaXBzZS9pbWFnZXMvd3NkbDJqYXZhLXNjcmVlbjMxLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2VjbGlwc2UvaW1hZ2VzL3dzZGwyamF2YS1zY3JlZW40LmpwZyBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2VjbGlwc2UvaW1hZ2VzL3dzZGwyamF2YS1zY3JlZW40LmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODdlZjZkOS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9lY2xpcHNlL2ltYWdlcy93c2RsMmphdmEtc2NyZWVuNC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9lY2xpcHNlL2ltYWdlcy93c2RsMmphdmEtc2NyZWVuNC5wbmcgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9lY2xpcHNlL2ltYWdlcy93c2RsMmphdmEtc2NyZWVuNC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2M2FkN2MuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvZWNsaXBzZS9pbWFnZXMvd3NkbDJqYXZhLXNjcmVlbjQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvZWNsaXBzZS9pbWFnZXMvd3NkbDJqYXZhLXNjcmVlbjQxLnBuZyBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2VjbGlwc2UvaW1hZ2VzL3dzZGwyamF2YS1zY3JlZW40MS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2OTFkNDcuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvZWNsaXBzZS9pbWFnZXMvd3NkbDJqYXZhLXNjcmVlbjQxLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2VjbGlwc2Uvc2VydmljZWFyY2hpdmVyLXBsdWdpbi54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9lY2xpcHNlL3NlcnZpY2VhcmNoaXZlci1wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTgyYzAyLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2VjbGlwc2Uvc2VydmljZWFyY2hpdmVyLXBsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOTEgKzAsMCBAQAotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiINCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPg0KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4NCi08aGVhZD4NCi08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9DQotIkhUTUwgVGlkeSBmb3IgV2luZG93cyAodmVycyAxNCBKdW5lIDIwMDcpLCBzZWUgd3d3LnczLm9yZyIgLz4NCi08bWV0YSBodHRwLWVxdWl2PSJjb250ZW50LXR5cGUiIGNvbnRlbnQ9IiIgLz4NCi08dGl0bGU+U2VydmljZSBBcmNoaXZlIEdlbmVyYXRvciBXaXphcmQgR3VpZGUgZm9yIEVjbGlwc2UNCi1QbHVnLWluPC90aXRsZT4NCi08bGluayBocmVmPSIuLi8uLi8uLi9jc3MvYXhpcy1kb2NzLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPQ0KLSJ0ZXh0L2NzcyIgbWVkaWE9ImFsbCIgLz4NCi08L2hlYWQ+DQotPGJvZHkgbGFuZz0iZW4iIHhtbDpsYW5nPSJlbiI+DQotPGgxPlNlcnZpY2UgQXJjaGl2ZSBHZW5lcmF0b3IgV2l6YXJkIEd1aWRlIGZvciBFY2xpcHNlIFBsdWctaW48L2gxPg0KLTxwPlRoaXMgZG9jdW1lbnQgd2lsbCBndWlkZSB5b3UgdGhyb3VnaCB0aGUgaW5zdGFsbGF0aW9uIGFuZCB1c2FnZQ0KLW9mIHRoZSBhcmNoaXZlIGdlbmVyYXRvciBFY2xpcHNlIHBsdWctaW4uPC9wPg0KLTxwPjxhIGhyZWY9Imh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL3Rvb2xzL2luZGV4Lmh0bWwiIHRhcmdldD0NCi0iX2JsYW5rIj5bRG93bmxvYWQgUGx1Z2luIFRvb2xdPC9hPjwvcD4NCi08aDI+Q29udGVudDwvaDI+DQotPHVsPg0KLTxsaT48YSBocmVmPSIjaW50cm8iPkludHJvZHVjdGlvbjwvYT48L2xpPg0KLTxsaT48YSBocmVmPSIjaW5zdGFsbGF0aW9uIj5JbnN0YWxsYXRpb248L2E+PC9saT4NCi08bGk+PGEgaHJlZj0iI29wZXJhdGlvbiI+T3BlcmF0aW9uPC9hPjwvbGk+DQotPC91bD4NCi08YSBuYW1lPSJpbnRybyIgaWQ9ImludHJvIj48L2E+DQotPGgyPkludHJvZHVjdGlvbjwvaDI+DQotPHA+QXMgcGFydCBvZiB0aGUgQXhpczIgdG9vbCBzZXQsIHRoZSBzZXJ2aWNlIGFyY2hpdmUgZ2VuZXJhdG9yIGlzDQotYW4gaW1wb3J0YW50IHRvb2wgdGhhdCBhbGxvd3MgdGhlIGdlbmVyYXRpb24gb2Ygc2VydmljZSBhcmNoaXZlcw0KLSgiYWFyIiBmaWxlIG9yIGEgImphciIgZmlsZXMpIHRoYXQgY2FuIGJlIGRlcGxveWVkIGFzIGEgd2ViDQotc2VydmljZXMgdG8gdGhlIEF4aXMyLjwvcD4NCi08YSBuYW1lPSJpbnN0YWxsYXRpb24iIGlkPSJpbnN0YWxsYXRpb24iPjwvYT4NCi08aDI+SW5zdGFsbGF0aW9uPC9oMj4NCi08cD5PbmUgY2FuIGVhc2lseSA8YSBocmVmPQ0KLSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi90b29scy9pbmRleC5odG1sIj5kb3dubG9hZDwvYT4gdGhlDQotcGx1Z2luPC9wPg0KLTxwPklmIG9uZSBuZWVkcyB0byBidWlsZCB0aGUgcGx1Zy1pbiBmcm9tIHNvdXJjZSwgTWF2ZW4yIGFuZCBBbnQNCi1idWlsZHMgYXJldmFpbGFiZS4gUGxlYXNlIHJlZmVyIHRoZSByZWFkbWUudHh0IGxvY2F0ZWQgYXQNCi1tb2R1bGUvdG9vbHMgb24gQXhpczIgc291cmNlLjwvcD4NCi08cD5PbmNlIHlvdSd2ZSBvYnRhaW5lZCB0aGUgcGx1Zy1pbiBqdXN0IHVuemlwIHRoZSBjb250ZW50IG9mIHRoZQ0KLXBsdWctaW4gYXJjaGl2ZSB0byB0aGUgRWNsaXBzZSBwbHVnLWluIGRpcmVjdG9yeSAoaWYgaXQgaXMgdGhlDQotemlwcGVkLWJpbmFyeSB2ZXJzaW9uKSBvciBjb3B5IHRoZSBuZWNlc3NhcnkgZm9sZGVycyB0byB0aGUgRWNsaXBzZQ0KLXBsdWctaW4gZGlyZWN0b3J5IGFuZCByZXN0YXJ0IEVjbGlwc2UuPC9wPg0KLTxwPjxzdHJvbmc+Tk9URTwvc3Ryb25nPiA6IFRoaXMgcGx1Zy1pbiB3b3JrcyBvbiBFY2xpcHNlIHZlcnNpb24NCi0zLjEgYW5kIHVwd2FyZHMsIGFsc28gdGhlIGphdmEgdmVyc2lvbiBzaG91bGQgYmUgMS40IG9yIGhpZ2hlci4gVGhlDQotcHJvdmlkZWQgc2NyZWVuIHNob3RzIG1heSBzbGlnaHRseSBkaWZmZXIgd2l0aCB3aGF0IHRoZSB1c2VyIHdvdWxkDQotYWN0dWFsbHkgc2VlIGJ1dCB0aGUgZnVuY3Rpb25hbGl0eSBoYXMgbm90IGJlZW4gY2hhbmdlZC48L3A+DQotPGEgbmFtZT0ib3BlcmF0aW9uIiBpZD0ib3BlcmF0aW9uIj48L2E+DQotPGgyPk9wZXJhdGlvbjwvaDI+DQotPHA+SWYgdGhlIHBsdWctaW4gaXMgcHJvcGVybHkgaW5zdGFsbGVkIHlvdSBzaG91bGQgc2VlIGEgbmV3IHdpemFyZA0KLXVuZGVyIHRoZSAiTmV3IiBzZWN0aW9uLiAoVXNlIHRoZSBGaWxlIC0mZ3Q7IE5ldyAtJmd0OyBPdGhlciBvcg0KLUN0cmwgKyBOICk8L3A+DQotPHAgYWxpZ249ImNlbnRlciI+PGltZyBib3JkZXI9IjAiIHNyYz0NCi0iaW1hZ2VzL1NlcnZpY2VXaXphcmRTZWxlY3Rpb24uanBnIiAvPjwvcD4NCi08cD5TZWxlY3RpbmcgdGhlIHdpemFyZCBhbmQgcHJlc3NpbmcgdGhlICJOZXh0IiBidXR0b24gd2lsbCBzdGFydA0KLXRoZSBzZXJ2aWNlIGdlbmVyYXRvciB3aXphcmQuIEZvbGxvd2luZyBpcyB0aGUgZmlyc3QgcGFnZSBvZiB0aGUNCi13aXphcmQuPC9wPg0KLTxwPjxzdHJvbmc+UGFnZSAxOjwvc3Ryb25nPjwvcD4NCi08cCBhbGlnbj0iY2VudGVyIj48aW1nIGJvcmRlcj0iMCIgc3JjPQ0KLSJpbWFnZXMvU2VydmljZVBhZ2UxLmpwZyIgLz48L3A+DQotPHA+T25jZSB0aGUgY2xhc3MgZmlsZSBmb2xkZXIod2hpY2ggc2hvdWxkIGJlIGEgZm9sZGVyIGluIHRoZQ0KLWZpbGUgc3lzdGVtKSBpcyBicm93c2VkIGFuZCBzZWxlY3RlZCwgdGhlICJOZXh0IiBidXR0b24gd2lsbCBiZQ0KLWVuYWJsZWQgYW5kIHlvdSBjYW4gbW92ZSB0byB0aGUgbmV4dCBwYWdlLiBOb3RlIHRoYXQgeW91IGhhdmUgdGhlDQotb3B0aW9uIG9mIGVpdGhlciBpbmNsdWRpbmcgYWxsIHRoZSBmaWxlcyBvciB0aGUgY2xhc3MgZmlsZXMgb25seSBvZg0KLXRoZSBmb2xkZXIgb24gcGFnZSAxLjwvcD4NCi08cD48c3Ryb25nPlBhZ2UgMjo8L3N0cm9uZz48L3A+DQotPHA+UGFnZSAyIG9mIHRoZSB3aXphcmQgYXMgc2VlbiBiZWxvdyByZXF1aXJlcyB5b3UgdG8gbG9jYXRlL2Jyb3dzZQ0KLXRoZSBXU0RMIGZpbGUuIElmIHlvdSBkbyBub3Qgd2lzaCB0byBhZGQgYSBXU0RMIGZpbGUgdG8gdGhlIHNlcnZpY2UNCi1hcmNoaXZlLCBzZWxlY3Qgc2tpcCBXU0RMLCBlbHNlIHlvdSBjYW4gc2VsZWN0IHRoZSBsb2NhdGlvbiBvZiB0aGUNCi1XU0RMIGZpbGUgYnkgc2VsZWN0aW5nIHRoZSBzZWxlY3QgV1NETCBvcHRpb24uPC9wPg0KLTxwIGFsaWduPSJjZW50ZXIiPjxpbWcgYm9yZGVyPSIwIiBzcmM9DQotImltYWdlcy9zZXJ2aWNlX3BhZ2UyLmpwZyIgLz48L3A+DQotPHA+PHN0cm9uZz5QYWdlIDM6PC9zdHJvbmc+PC9wPg0KLTxwPlNlbGVjdCB0aGUgc2VydmljZXMueG1sIGZpbGUgb24gdGhpcyB3aXphcmQgcGFnZSBieSBicm93c2luZyBvcg0KLXNlbGVjdCB0aGUgb3B0aW9uIG9mIGdlbmVyYXRpbmcgc2VydmljZSB4bWwgYXV0b21hdGljYWxseSwgYWZ0ZXINCi13aGljaCB5b3UgY2FuIGNsaWNrICJOZXh0IiBidXR0b24gdG8gZ28gdG8gdGhlIG5leHQgcGFnZS4gTm90aWNlDQotaG93IHRoZSBicm93c2luZyBvcHRpb24gZGlzYWJsZXMgd2hlbiB0aGUgIkdlbmVyYXRlIHNlcnZpY2UgeG1sDQotYXV0b21hdGljYWxseSIgY2hlY2sgYm94IGlzIHRpY2tlZC48L3A+DQotPHAgYWxpZ249ImNlbnRlciI+PGltZyBib3JkZXI9IjAiIHNyYz0NCi0iaW1hZ2VzL3NlcnZpY2VfcGFnZTMuanBnIiAvPjwvcD4NCi08IS0tDQotPHA+Tm90ZSB0aGF0IFRoZSBzZXJ2aWNlIFhNTCBmaWxlIGNhbiBiZSBnZW5lcmF0ZWQgaWYgbmVlZGVkLiBUbyBwcm9jZWVkDQotdG8gdGhlIHNlcnZpY2UgZ2VuZXJhdGlvbiBwYWdlLCBjaGVjayB0aGUgImdlbmVyYXRlIGF1dG9tYXRpY2FsbHkiIGNoZWNrYm94LiA8L3A+DQotPHAgYWxpZ249ImNlbnRlciI+PGltZyBib3JkZXI9IjAiIHNyYz0ic2VydmljZV9wYWdlM19obC5qcGciPjwvcD4NCi0NCi08cD5JZiB0aGUgYXV0b21hdGljIG1vZGUgaXMgbm90IHNlbGVjdGVkIHRoZW4gdGhlIHdpemFyZA0KLXdpbGwgZGlyZWN0bHkganVtcCB0byB0aGUgbGlicmFyeSBzZWxlY3Rpb24gcGFnZS4gSG93ZXZlciBpZiB0aGUgYXV0b21hdGljIG1vZGUgaXMgc2VsZWN0ZWQgdGhlIHdpemFyZCB3aWxsIHNob3cgdGhlDQotZm9sbG93aW5nIHBhZ2U8L3A+DQotPHAgYWxpZ249ImNlbnRlciI+PGltZyBib3JkZXI9IjAiIHNyYz0ic2VydmljZV9wYWdlNF9wbGFpbi5KUEciIHdpZHRoPSI1MDAiIGhlaWdodD0iNTAwIj48L3A+DQotPHA+VGhpcyBpcyBhIHNvbWV3aGF0IGNvbXBsaWNhdGVkIHBhZ2UuIFRoZSBzZXJ2aWNlIG5hbWUgdGV4dGJveCBzaG91bGQgaW5jbHVkZSB0aGUgbmFtZSBvZiB0aGUgc2VydmljZSB0aGF0IHlvdQ0KLXdpc2ggdG8gZ2l2ZSB0aGlzIHNlcnZpY2UuIA0KLUZvciB0aGUgaW1wbGVtZW50YXRpb24gY2xhc3MgdHlwZSBpbiB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgYW5kIGhpdCB0aGUgbG9hZCBidXR0b24gdG8gdmlldyB0aGUgb3BlcmF0aW9uczwvcD4NCi08cCBhbGlnbj0iY2VudGVyIj48aW1nIGJvcmRlcj0iMCIgc3JjPSJzZXJ2aWNlX3BhZ2U0X2xvYWQuSlBHIiA+PC9wPg0KLTxwPiBUaGUgbG9hZGVkIG9wZXJhdGlvbnMgc2hvdWxkIGJlIGRpc3BsYXllZCBpbiBhIHRhYmxlLiBPbmNlIHRoaXMgaXMgZGlzcGxheWVkIHlvdSBjYW4gZmlsdGVyIHRoZSBtZXRob2RzIGJ5IHNlbGVjdGluZy9kZXNlbGVjdGluZyB0aGUgbWV0aG9kcyB1c2luZyB0aGUgY2hlY2tib3ggYXQgZWFjaCByb3cuPC9wPg0KLTxwIGFsaWduPSJjZW50ZXIiPjxpbWcgYm9yZGVyPSIwIiBzcmM9InNlcnZpY2VfcGFnZTRfdGFibGUuSlBHIiB3aWR0aD0iNTAwIiBoZWlnaHQ9IjUwMCI+PC9wPg0KLTxwPkZ1cnRoZXIgZmlsdGVyaW5nIGNhbiBiZSBhY2hpZXZlZCBieSB1c2luZyB0aGUgInNlYXJjaCBkZWNsYXJlZCBtZXRob2RzIiBvbmx5IGNoZWNrYm94PC9wPg0KLTxwIGFsaWduPSJjZW50ZXIiPjxpbWcgYm9yZGVyPSIwIiBzcmM9InNlcnZpY2VfcGFnZTRfc2VhcmNoX2RlY2xhcmVkLkpQRyIgPjwvcD4NCi08cD5PbmNlIHRoZSBtZXRob2Qgc2VsZWN0aW9uIGlzIGNvbXBsZXRlIHRoZSB3aXphcmQgaGFzIGVub3VnaCBpbmZvcm1hdGlvbiB0byBnZW5lcmF0ZSBhIGJhc2ljIHNlcnZpY2VzLnhtbCBmaWxlLiBJZiBmdXJ0aGVyIGN1c3RvbWl6YXRpb24gaXMgcmVxdWlyZWQsIHRoZXJlJ3Mgbm8gY2hvaWNlIGJ1dCB0byBtYW51YWxseSBlZGl0IGl0ITwvcD4NCi0NCi0tLT4NCi08cD48c3Ryb25nPlBhZ2UgNDo8L3N0cm9uZz48L3A+DQotPCEtLVNUQVJULS0+DQotPHA+VGhlIG5leHQgc3RlcCBpcyB0byBhZGQgdGhlIGxpYnJhcmllcy4gVGhlIGxpYnJhcnkgYWRkaXRpb24gcGFnZQ0KLWxvb2tzIGxpa2UgdGhpcyA6PC9wPg0KLTxwIGFsaWduPSJjZW50ZXIiPjxpbWcgYm9yZGVyPSIwIiBzcmM9DQotImltYWdlcy9zZXJ2aWNlX3BhZ2U1LmpwZyIgLz48L3A+DQotPHA+VGhlIGxpYnJhcnkgbmFtZSAod2l0aCBmdWxsIHBhdGgpIGNhbiBiZSBlaXRoZXIgdHlwZWQgb24gdGhlDQotdGV4dCBib3ggb3IgYnJvd3NlZCBmb3IgdXNpbmcgdGhlICJCcm93c2UiIGJ1dHRvbi48L3A+DQotPHAgYWxpZ249ImNlbnRlciI+PGltZyBib3JkZXI9IjAiIHNyYz0NCi0iaW1hZ2VzL3NlcnZpY2VfcGFnZTVfYnJvd3NlZC5qcGciIC8+PC9wPg0KLTxwPk9uY2UgdGhlcmUgaXMgYSBsaWJyYXJ5IG5hbWUgd2l0aCBmdWxsIHBhdGggb24gdGhlIHRleHQgYm94LCBoaXQNCi10aGUgIkFkZCIgYnV0dG9uIHRvIGFkZCB0aGUgbGlicmFyeSB0byB0aGUgbGlzdC4gQWRkZWQgbGlicmFyaWVzDQotc2hvdWxkIGJlIGRpc3BsYXllZCBpbiB0aGUgIkFkZGVkIGxpYnJhcmllcyIgbGlzdCBib3guIFRoaXMgd2F5IHlvdQ0KLWNhbiBhZGQgYXMgbWFueSBleHRlcm5hbCBsaWJyYXJpZXMgYXMgeW91IHdpc2guIFNlZSB0aGUgc2NyZWVuDQotc2hvdHMgYmVsb3cuPC9wPg0KLTxwIGFsaWduPSJjZW50ZXIiPjxpbWcgYm9yZGVyPSIwIiBzcmM9DQotImltYWdlcy9zZXJ2aWNlX3BhZ2U1X2hsLmpwZyIgLz48L3A+DQotPHAgYWxpZ249ImNlbnRlciI+PGltZyBib3JkZXI9IjAiIHNyYz0NCi0iaW1hZ2VzL3NlcnZpY2VfcGFnZTVfYWRkZWQuanBnIiAvPjwvcD4NCi08cD5JZiBhbnkgYWRkZWQgbGlicmFyeSBuZWVkcyB0byBiZSByZW1vdmVkLCBoaWdobGlnaHQgaXQgb3IgaW4NCi1vdGhlciB3b3Jkcywgc2VsZWN0IGl0IGZyb20gdGhlICJBZGRlZCBsaWJyYXJpZXMiIGxpc3QgYW5kIGhpdCBvbg0KLXRoZSAiUmVtb3ZlIiBidXR0b24gYXMgc2hvd24gYmVsb3cuIENsaWNrIG9uIHRoZSAiTmV4dCIgYnV0dG9uIHRvDQotcHJvY2VlZCB0byB0aGUgbGFzdCBwYWdlIG9mIHRoZSB3aXphcmQgaWYgdGhlIHVzZXIgZGlkIG5vdCBzZWxlY3QNCi10byBhdXRvIGdlbmVyYXRlIHRoZSBzZXJ2aWNlcy54bWwgZmlsZS4gSWYgdXNlciBzZWxlY3QgdG8gYXV0bw0KLWdlbmVyYXRlIHRoZSBzZXJ2aWNlcy54bWwgZmlsZSB0aGVuIHRoZSBzZXJ2aWNlcy54bWwgb3B0aW9uIHBhZ2UNCi13aWxsIGJlIGRpc3BsYXllZC48L3A+DQotPHAgYWxpZ249ImNlbnRlciI+PGltZyBib3JkZXI9IjAiIHNyYz0NCi0iaW1hZ2VzL3NlcnZpY2VfcGFnZTVfcmVtb3ZlLmpwZyIgLz48L3A+DQotPHA+PHN0cm9uZz5QYWdlIDU6PC9zdHJvbmc+PC9wPg0KLTxwPlRoaXMgcGFnZSBvbmx5IGFwcGVhcnMgaWYgdGhlIHVzZXIgc2VsZWN0IHRvIGdlbmVyYXRlIHRoZQ0KLXNlcnZpY2VzLnhtbCBhdCBwYWdlIDMgb2YgdGhlIHdpemFyZC4gSWYgdGhlIHVzZXIgaGF2ZSBzZWxlY3RlZCBhDQotc2VydmljZXMueG1sIHRoZW4gdGhlIHVzZXIgd2lsbCBiZSBkaXJlY3RlZCB0byB0aGUgbGFzdCBwYWdlIG9mIHRoZQ0KLXdpemFyZC48L3A+DQotPHA+QWZ0ZXIgZW50ZXJpbmcgdGhlIGNvcnJlY3Qgc2VydmljZSBuYW1lIGFuZCB2YWxpZCBmdWxseQ0KLXF1YWxpZmllZCBjbGFzcyBuYW1lLCB0cnkgdG8gbG9hZCB0aGUgZXhpc3RpbmcgbWV0aG9kcyBvZiB0aGF0DQotY2xhc3MgYnkgY2xpY2tpbmcgdGhlIGxvYWQgYnV0dG9uLjwvcD4NCi08cCBhbGlnbj0iY2VudGVyIj48aW1nIGJvcmRlcj0iMCIgc3JjPQ0KLSJpbWFnZXMvc2VydmljZV9wYWdlNF9sb2FkLmpwZyIgLz48L3A+DQotPHA+SWYgc3VjY2Vzc2Z1bGx5IGxvYWRlZCB0aGUgdXNlciB3aWxsIGJlIHByZXNlbnRlZCB3aXRoIGEgdGFibGUNCi1hdCB0aGUgYm90dG9tIG9mIHRoZSBwYWdlIHdpdGggdGhlIGRldGFpbHMgb2YgdGhlIGxvYWRlZCBjbGFzcy4gQnkNCi1jaGVja2luZyBhbmQgdW5jaGVja2luZyB0aGUgdXNlciBjYW4gc2VsZWN0IHRoZSBuZWNlc3NhcnkgbWV0aG9kcw0KLXRvIGluY2x1ZGUgaW4gdGhlIHNlcnZpY2VzLnhtbDwvcD4NCi08cCBhbGlnbj0iY2VudGVyIj48aW1nIGJvcmRlcj0iMCIgc3JjPQ0KLSJpbWFnZXMvc2VydmljZV9wYWdlNF90YWJsZS5qcGciIC8+PC9wPg0KLTxwPkJ5IGNsaWNraW5nIG9uIHRoZSBzZWFyY2ggZGVjbGFyZWQgbWV0aG9kIG9ubHkgY2hlY2sgYm94LCB0aGUNCi11c2VyIGNhbiByZW1vdmUgdGhlIGluaGVyaXRlZCBtZXRob2RzIGZyb20gdGhlIGNsYXNzLiBDbGljayBvbiB0aGUNCi0iTmV4dCIgYnV0dG9uIHRvIHByb2NlZWQgdG8gdGhlIGxhc3QgcGFnZSBvZiB0aGUgd2l6YXJkPC9wPg0KLTxwIGFsaWduPSJjZW50ZXIiPjxpbWcgYm9yZGVyPSIwIiBzcmM9DQotImltYWdlcy9zZXJ2aWNlX3BhZ2U0X3NlYXJjaF9kZWNsYXJlZC5qcGciIC8+PC9wPg0KLTxwPjxzdHJvbmc+UGFnZSA2Ojwvc3Ryb25nPjwvcD4NCi08cD5UaGUgbGFzdCBwYWdlIG9mIHRoZSB3aXphcmQgYXNrcyBmb3IgdGhlIG91dHB1dCBmaWxlIGxvY2F0aW9uDQotYW5kIHRoZSBvdXRwdXQgYXJjaGl2ZSBmaWxlIG5hbWUuIFRvIGJlIGFibGUgdG8gZmluaXNoIHRoZSB3aXphcmQsDQotdXNlciBtdXN0IGVudGVyIHZhbGlkIG91dHB1dCBmaWxlIGxvY2F0aW9uIGFuZCBvdXRwdXQgZmlsZQ0KLW5hbWUuPC9wPg0KLTxwIGFsaWduPSJjZW50ZXIiPjxpbWcgYm9yZGVyPSIwIiBzcmM9DQotImltYWdlcy9zZXJ2aWNlX3BhZ2U2LmpwZyIgLz48L3A+DQotPHA+T25jZSBhbGwgdGhlIHBhcmFtZXRlcnMgYXJlIGZpbGxlZCwgaGl0IHRoZSAiRmluaXNoIiBidXR0b24gdG8NCi1jb21wbGV0ZSB0aGUgd2l6YXJkIGFuZCBnZW5lcmF0ZSB0aGUgc2VydmljZSBhcmNoaXZlLjwvcD4NCi08cCBhbGlnbj0iY2VudGVyIj48aW1nIGJvcmRlcj0iMCIgc3JjPQ0KLSJpbWFnZXMvc3VjY2Vzc19tc2cuanBnIiAvPjwvcD4NCi08cD5JZiB5b3Ugc2VlIHRoZSBhYm92ZSBtZXNzYWdlLCB0aGVuIHlvdSd2ZSBzdWNjZXNzZnVsbHkgZ2VuZXJhdGVkDQotdGhlIHNlcnZpY2UgYXJjaGl2ZSEgVGhpcyBzZXJ2aWNlIGFyY2hpdmUgY2FuIGJlIGhvdCBkZXBsb3llZA0KLShkZXBsb3llZCBhdCBydW4gdGltZSkgdG8gdGhlIGF4aXMyPC9wPg0KLTxoMT5BcHBlbmRpeDwvaDE+DQotPHVsPg0KLTxsaT5FY2xpcHNlIHJlZmVyZW5jZSAtIDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIiB0YXJnZXQ9DQotIl9ibGFuayI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L2E+PC9saT4NCi08bGk+Q3VzdG9tIEFudCBUYXNrcyAtIDxhIGhyZWY9DQotImh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvZGV2ZWxvcC5odG1sIiB0YXJnZXQ9DQotIl9ibGFuayI+aHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC9kZXZlbG9wLmh0bWw8L2E+PC9saT4NCi08L3VsPg0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvZWNsaXBzZS93c2RsMmphdmEtcGx1Z2luLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2VjbGlwc2Uvd3NkbDJqYXZhLXBsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3NjNiZGUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvZWNsaXBzZS93c2RsMmphdmEtcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIg0KLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+DQotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPg0KLTxoZWFkPg0KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0NCi0iSFRNTCBUaWR5IGZvciBXaW5kb3dzICh2ZXJzIDE0IEp1bmUgMjAwNyksIHNlZSB3d3cudzMub3JnIiAvPg0KLTxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0iIiAvPg0KLTx0aXRsZT5Db2RlIEdlbmVyYXRvciBXaXphcmQgR3VpZGUgZm9yIEVjbGlwc2UgUGx1Zy1pbjwvdGl0bGU+DQotPGxpbmsgaHJlZj0iLi4vLi4vLi4vY3NzL2F4aXMtZG9jcy5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0NCi0idGV4dC9jc3MiIG1lZGlhPSJhbGwiIC8+DQotPC9oZWFkPg0KLTxib2R5IGxhbmc9ImVuIiB4bWw6bGFuZz0iZW4iPg0KLTxoMT5Db2RlIEdlbmVyYXRvciBXaXphcmQgR3VpZGUgZm9yIEVjbGlwc2UgUGx1Zy1pbjwvaDE+DQotPHA+VGhpcyBkb2N1bWVudCBleHBsYWlucyB0aGUgdXNhZ2Ugb2YgdGhpcyBjb2RlIGdlbmVyYXRvciBwbHVnLWluDQotZm9yIEVjbGlwc2UuIEluIG90aGVyIHdvcmRzLCB0aGlzIGRvY3VtZW50IHdpbGwgZ3VpZGUgeW91IHRocm91Z2gNCi10aGUgb3BlcmF0aW9ucyBvZiBnZW5lcmF0aW5nIGEgV1NETCBmaWxlIGZyb20gYSBKYXZhIGNsYXNzIGFuZC9vcg0KLWdlbmVyYXRpbmcgYSBKYXZhIGNsYXNzIGZpbGUgZnJvbSBhIFdTREwgZmlsZS48L3A+DQotPHA+PGEgaHJlZj0iaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvdG9vbHMvaW5kZXguaHRtbCIgdGFyZ2V0PQ0KLSJfYmxhbmsiPltEb3dubG9hZCBQbHVnaW4gVG9vbF08L2E+PC9wPg0KLTxoMj5Db250ZW50PC9oMj4NCi08dWw+DQotPGxpPjxhIGhyZWY9IiNpbnRybyI+SW50cm9kdWN0aW9uPC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9IiNpbnN0YWxsYXRpb24iPkluc3RhbGxhdGlvbjwvYT48L2xpPg0KLTxsaT48YSBocmVmPSIjb3BlcmF0aW9uMSI+T3BlcmF0aW9uIC0gV1NETDJKYXZhPC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9IiNvcGVyYXRpb24yIj5PcGVyYXRpb24gLSBKYXZhMldTREw8L2E+PC9saT4NCi08L3VsPg0KLTxhIG5hbWU9ImludHJvIiBpZD0iaW50cm8iPjwvYT4NCi08aDI+SW50cm9kdWN0aW9uPC9oMj4NCi08cD5UaGUgQXhpczIgY29kZSBnZW5lcmF0b3IgY29tZXMgYnVpbHQtaW4gd2l0aCBhbiA8YSBocmVmPQ0KLSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIj5FY2xpcHNlPC9hPiBwbHVnLWluLiBUaGlzIHBsdWctaW4gY2FuIGJlDQotdXNlZCB0byBnZW5lcmF0ZSBhIFdTREwgZmlsZSBmcm9tIGEgamF2YSBjbGFzcyAoSmF2YTJXU0RMKSBhbmQvb3IgYQ0KLWphdmEgY2xhc3MgZmlsZSBmcm9tIGEgV1NETCAoV1NETDJKYXZhKS4gRmlyc3QgeW91IG5lZWQgdG8gaW5zdGFsbA0KLXRoZSBwbHVnLWluLiBUaGUgaW5zdHJ1Y3Rpb25zIGZvciB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MgYXJlDQotZ2l2ZW4gYmVsb3cuPC9wPg0KLTxhIG5hbWU9Imluc3RhbGxhdGlvbiIgaWQ9Imluc3RhbGxhdGlvbiI+PC9hPg0KLTxoMj5JbnN0YWxsYXRpb248L2gyPg0KLTxwPk9uZSBjYW4gZWFzaWx5IDxhIGhyZWY9DQotImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL3Rvb2xzL2luZGV4Lmh0bWwiPmRvd25sb2FkPC9hPiB0aGUNCi1wbHVnaW48L3A+DQotPHA+SWYgb25lIG5lZWRzIHRvIGJ1aWxkIHRoZSBwbHVnLWluIGZyb20gc291cmNlLCBNYXZlbjIgYW5kIEFudA0KLWJ1aWxkcyBhcmV2YWlsYWJlLiBQbGVhc2UgcmVmZXIgdGhlIHJlYWRtZS50eHQgbG9jYXRlZCBhdA0KLW1vZHVsZS90b29scyBvbiBBeGlzMiBzb3VyY2UuPC9wPg0KLTxwPk9uY2UgeW91J3ZlIG9idGFpbmVkIHRoZSBwbHVnLWluIGp1c3QgdW56aXAgdGhlIGNvbnRlbnQgb2YgdGhlDQotcGx1Zy1pbiBhcmNoaXZlIHRvIHRoZSBFY2xpcHNlIHBsdWctaW4gZGlyZWN0b3J5IChpZiBpdCBpcyB0aGUNCi16aXBwZWQtYmluYXJ5IHZlcnNpb24pIG9yIGNvcHkgdGhlIG5lY2Vzc2FyeSBmb2xkZXJzIHRvIHRoZSBFY2xpcHNlDQotcGx1Zy1pbiBkaXJlY3RvcnkgYW5kIHJlc3RhcnQgRWNsaXBzZS48L3A+DQotPHA+PHN0cm9uZz5OT1RFPC9zdHJvbmc+IDogVGhpcyBwbHVnLWluIHdvcmtzIG9uIEVjbGlwc2UgdmVyc2lvbg0KLTMuMSBhbmQgdXB3YXJkcywgYWxzbyB0aGUgamF2YSB2ZXJzaW9uIHNob3VsZCBiZSAxLjQgb3IgaGlnaGVyLiBUaGUNCi1wcm92aWRlZCBzY3JlZW4gc2hvdHMgbWF5IHNsaWdodGx5IGRpZmZlciB3aXRoIHdoYXQgdGhlIHVzZXIgd291bGQNCi1hY3R1YWxseSBzZWUgYnV0IHRoZSBmdW5jdGlvbmFsaXR5IGhhcyBub3QgYmVlbiBjaGFuZ2VkLjwvcD4NCi08YSBuYW1lPSJvcGVyYXRpb24xIiBpZD0ib3BlcmF0aW9uMSI+PC9hPg0KLTxoMj5PcGVyYXRpb24gLSBXU0RMMkphdmE8L2gyPg0KLTxwPklmIHRoZSBwbHVnLWluIGlzIHByb3Blcmx5IGluc3RhbGxlZCB5b3Ugc2hvdWxkIHNlZSBhIG5ldyB3aXphcmQNCi11bmRlciB0aGUgIk5ldyIgc2VjdGlvbi4odXNlIHRoZSBGaWxlIC0mZ3Q7IE5ldyAtJmd0OyBPdGhlciBvciBDdHJsDQotKyBOICk8L3A+DQotPHA+PGltZyBib3JkZXI9IjAiIHNyYz0iaW1hZ2VzL3dzZGwyamF2YS1zY3JlZW4wLnBuZyIgLz48L3A+DQotPHA+U2VsZWN0aW5nIHRoZSB3aXphcmQgYW5kIHByZXNzaW5nIHRoZSAiTmV4dCIgYnV0dG9uIHdpbGwgc3RhcnQNCi10aGUgY29kZSBnZW5lcmF0b3Igd2l6YXJkLiBGb2xsb3dpbmcgaXMgdGhlIGZpcnN0IHdpemFyZCBwYWdlLjwvcD4NCi08cD48c3Ryb25nPlBhZ2UgMTo8L3N0cm9uZz48L3A+DQotPHA+PGltZyBzcmM9ImltYWdlcy93c2RsMmphdmEtc2NyZWVuMS5wbmciIC8+PC9wPg0KLTxwPlNlbGVjdGluZyB0aGUgIkdlbmVyYXRlIEphdmEgc291cmNlIGNvZGUgZnJvbSBXU0RMIGZpbGUiIG9wdGlvbg0KLWFuZCBjbGlja2luZyAiTmV4dCIgbGVhZHMgdG8gdGhlIGZvbGxvd2luZyBwYWdlLjwvcD4NCi08cD48c3Ryb25nPldTREwySmF2YSBQYWdlIDIgOjwvc3Ryb25nPjwvcD4NCi08cD48aW1nIGJvcmRlcj0iMCIgc3JjPSJpbWFnZXMvd3NkbDJqYXZhLXNjcmVlbjIucG5nIiAvPjwvcD4NCi08cD5UbyBtb3ZlIG9uIHRvIHRoZSBuZXh0IHBhZ2UgdGhlIFdTREwgZmlsZSBsb2NhdGlvbiBtdXN0IGJlDQotZ2l2ZW4uIFRoZSAiQnJvd3NlIiBidXR0b24gY2FuIGJlIHVzZWQgdG8gZWFzaWx5IGJyb3dzZSBmb3IgYSBmaWxlDQotcmF0aGVyIHRoYW4gdHlwaW5nIHRoZSB3aG9sZSBwYXRoLjwvcD4NCi08cD48c3Ryb25nPldTREwySmF2YSBQYWdlIDMgOjwvc3Ryb25nPjwvcD4NCi08cD5PbmNlIHRoZSBXU0RMIGZpbGUgaXMgc2VsZWN0ZWQsIHRoZSBuZXh0IHBhZ2Ugd2lsbCB0YWtlIHlvdSB0bw0KLXRoZSBwYWdlIGZyb20gd2hlcmUgPHN0cm9uZz5jb2RlZ2VuIG9wdGlvbnM8L3N0cm9uZz4gYXJlIHRvIGJlDQotc2VsZWN0ZWQuIEJ5IGZhciB0aGlzIGlzIHRoZSBtb3N0IGltcG9ydGFudCBwYWdlIGluIHRoaXMgd2l6YXJkLg0KLVRoaXMgcGFnZSBkZXRlcm1pbmVzIHRoZSBjaGFyYWN0ZXJpc3RpY3Mgb2YgdGhlIGNvZGUgYmVpbmcNCi1nZW5lcmF0ZWQuPC9wPg0KLTxwPk5vdmljZXMgbmVlZCBub3Qgd29ycnkgYWJvdXQgdGhlc2Ugb3B0aW9ucyBzaW5jZSB0aGUgbW9zdCBjb21tb24NCi1vcHRpb25zIGFyZSBkZWZhdWx0ZWQsIGJ1dCBhZHZhbmNlZCB1c2VycyB3aWxsIGZpbmQgaXQgdmVyeSBlYXN5IHRvDQotdHVybiB0aGUga25vYnMgdXNpbmcgdGhlc2Ugb3B0aW9ucy48L3A+DQotPHA+PGltZyBib3JkZXI9IjAiIHNyYz0iaW1hZ2VzL3dzZGwyamF2YS1zY3JlZW4zLnBuZyIgLz48L3A+DQotPHA+V2hhdCBhZHZhbmNlZCB1c2VycyBjYW4gZG8gaXMgc2VsZWN0IGN1c3RvbSBmcm9tIHRoZSBzZWxlY3QNCi1jb2RlZ2VuIG9wdGlvbnMgZHJvcCBkb3duIGxpc3QgYW5kIHRoZW4gY2hhbmdlL2VkaXQgdGhlIGZpZWxkcyB0aGF0DQoteW91IG5lZWQuPC9wPg0KLTxwPjxpbWcgYm9yZGVyPSIwIiBzcmM9ImltYWdlcy93c2RsMmphdmEtc2NyZWVuMzEucG5nIiAvPjwvcD4NCi08cD5PbmNlIHRoZSBvcHRpb25zIGFyZSBzZWxlY3RlZCwgb25seSB0aGUgZmluYWwgc3RlcCBvZiB0aGUgY29kZQ0KLWdlbmVyYXRpb24gaXMgbGVmdCB3aGljaCBpcyB0aGUgc2VsZWN0aW9uIG9mIHRoZSBvdXRwdXQgZmlsZQ0KLWxvY2F0aW9uLjwvcD4NCi08cD48c3Ryb25nPldTREwySmF2YSBQYWdlIDQgOjwvc3Ryb25nPjwvcD4NCi08cD5IZXJlIHlvdSBjYW4gc2VsZWN0IHRoZSBvdXRwdXQgZmlsZSBwYXRoIGJ5IHR5cGluZyBvciBicm93c2luZw0KLXVzaW5nIHRoZSAiQnJvd3NlIiBidXR0b24uIFlvdSBoYXZlIHRoZSBvcHRpb24gb2YgYnJvd3Npbmcgb25seQ0KLWVjbGlwc2Ugd29ya3NwYWNlIHByb2plY3RzIGJ5IHNlbGVjdGluZyB0aGUgIkFkZCB0aGUgc291cmNlIHRvIGENCi1wcm9qZWN0IG9uIGN1cnJlbnQgZWNsaXBzZSB3b3Jrc3BhY2UiIHJhZGlvIGJ1dHRvbi4gT3IgZWxzZSB5b3UNCi1oYXZlIHRoZSBvcHRpb24gdG8gc2F2ZSB0aGUgY29kZWdlbiByZXN1dGxzIHRvIGZpbGUgc3lzdGVtPC9wPg0KLTxwPjxpbWcgYm9yZGVyPSIwIiBzcmM9ImltYWdlcy93c2RsMmphdmEtc2NyZWVuNC5wbmciIC8+PC9wPg0KLTxwPkhlcmUgYWxzbyB5b3UgaGF2ZSB0aGUgb3B0aW9uIHRvIGFkZCBzb21lIHZhbHVlIHRvIHRoZSBjb2RlZ2VuDQotcmVzdWx0cy4gSWYgeW91IGhhdmUgZW5hYmxlZCB0aGUgY2hlY2sgYm94ICJBZGQgQXhpczIgbGlicmFyaWVzIHRvDQotdGhlIGNvZGVnZW4gcmVzdWx0IHByb2plY3QiIHRoZW4gYWxsIG90aGVyIGNvbnRyb2xzIGJlbG93IHdpbGwgZ2V0DQotZW5hYmxlZC4gV2hhdCB5b3UgY2FuIGRvIGlzIHBvaW50IHRoZSBkb3dubG9hZGVkIEF4aXMyX0hPTUUNCi1sb2NhdGlvbiB2aWEgdGhlICJCcm93c2UiIGJ1dHRvbi4gVGhlbiB5b3UgY2FuIHZlcmlmeSB0aGUNCi1hdmFpbGFiaWxpdHkgb2YgdGhlIEF4aXMyIGxpYnMgYnkgY2xpY2tpbmcgb24gdGhlICJDaGVjayBMaWJzIg0KLWJ1dHRvbi4gSWYgYWxsIGdvZXMgd2VsbCB0aGVuIHlvdSBjYW4gYWRkIHRoZSBheGlzIDIgbGlicyB0byB0aGUNCi1jb2RlZ2VuIHJlc3VsdHMgbG9jYXRpb24uIEFub3RoZXIgb3B0aW9uIGlzIGF2YWlsYWJsZSB0byBnZW5lcmF0ZSBhDQotamFyIGZpbGUgaWYgdGhlIHVzZXIgbmVlZHMgdG8gYWRkIHRoZSBjb2RlZ2VuIHJlc3VsdHMgdG8gYSBwcm9qZWN0DQotYXMgYSBjb21waWxlZCBqYXIgZmlsZSB0byB0aGUgc2VsZWN0ZWQgbG9jYXRpb25zIGxpYiBkaXJlY3RvcnkuPC9wPg0KLTxwPjxpbWcgYm9yZGVyPSIwIiBzcmM9ImltYWdlcy93c2RsMmphdmEtc2NyZWVuNDEucG5nIiAvPjwvcD4NCi08cD5XaGVuIHRoZSBvdXRwdXQgZmlsZSBsb2NhdGlvbiBpcyBzZWxlY3RlZCwgdGhlICJGaW5pc2giIGJ1dHRvbg0KLXdpbGwgYmUgZW5hYmxlZC4gQ2xpY2tpbmcgdGhlICJGaW5pc2giIGJ1dHRvbiB3aWxsIGdlbmVyYXRlIHRoZQ0KLWNvZGUgYW5kIGEgbWVzc2FnZSBib3ggd2lsbCBwb3AgdXAgYWNrbm93bGVkZ2luZyB0aGUgc3VjY2Vzcy4gV2VsbA0KLURvbmUhIFlvdSd2ZSBzdWNjZXNzZnVsbHkgY29tcGxldGVkIEF4aXMyIGNvZGUgZ2VuZXJhdGlvbi48L3A+DQotPGEgbmFtZT0ib3BlcmF0aW9uMiIgaWQ9Im9wZXJhdGlvbjIiPjwvYT4NCi08aDI+T3BlcmF0aW9uIC0gSmF2YTJXU0RMPC9oMj4NCi08cD48c3Ryb25nPlBhZ2UgMTo8L3N0cm9uZz48L3A+DQotPHA+Rm9yIHRoaXMgb3BlcmF0aW9uIHlvdSBuZWVkIHRvIHNlbGVjdCB0aGUgb3B0aW9uIHdoaWNoIHNheXMNCi0iR2VuZXJhdGUgYSBXU0RMIGZyb20gYSBKYXZhIHNvdXJjZSBmaWxlIjwvcD4NCi08cD48aW1nIGJvcmRlcj0iMCIgc3JjPSJpbWFnZXMvamF2YTJ3c2RsLXNjcmVlbjAucG5nIiAvPjwvcD4NCi08cD5UaGVuIGNsaWNrIHRoZSAiTmV4dCIgYnV0dG9uIHdoaWNoIHdpbGwgbGVhZCB0byB0aGUgbmV4dCBwYWdlDQotYmVsb3cuPC9wPg0KLTxwPjxzdHJvbmc+SmF2YTJXU0RMIFBhZ2UgMjo8L3N0cm9uZz48L3A+DQotPHA+PGltZyBib3JkZXI9IjAiIHNyYz0iaW1hZ2VzL2phdmEyd3NkbC1zY3JlZW4xLnBuZyIgLz48L3A+DQotPHA+SW4gdGhpcyBwYWdlIG9uZSBuZWVkcyB0byBzZWxlY3QgdGhlIGNsYXNzIHRvIGJlIGV4cG9zZWQgYW5kIHRoZQ0KLXJlbGV2YW50IGphciBmaWxlcyAvY2xhc3NlcyB0byBiZSBsb2FkZWQgYXMgdGhlIGNsYXNzcGF0aC4gQWZ0ZXINCi10aGUgbGlicmFyaWVzIGhhdmUgYmVlbiBzZXQsIHRoZSAiVGVzdCBDbGFzcyBMb2FkaW5nIiBidXR0b24gbXVzdA0KLWJlIGNsaWNrZWQgaW4gb3JkZXIgdG8gdGVzdCB3aGV0aGVyIHRoZSBjbGFzcyBpcyBsb2FkYWJsZS4gVW5sZXNzDQotdGhlIGNsYXNzIGxvYWRpbmcgaXMgc3VjY2Vzc2Z1bCBwcm9jZWVkaW5nIHRvIHRoZSAiTmV4dCIgYnV0dG9uDQotd2lsbCBub3QgYmUgZW5hYmxlZC48L3A+DQotPHA+T25jZSB0aGUgY2xhc3Nsb2FkaW5nIGlzIHN1Y2Nlc3NmdWwgYW5kICJOZXh0IiBidXR0b24gaXMgY2xpY2tlZA0KLXRoZSBwYWdlIGJlbG93IHdpbGwgYXBwZWFyLjwvcD4NCi08cD48c3Ryb25nPkphdmEyV1NETCBQYWdlIDM6PC9zdHJvbmc+PC9wPg0KLTxwPlRoaXMgcGFnZSBhbGxvd3MgdGhlIHBhcmFtZXRlcnMgdG8gYmUgbW9kaWZpZWQgYnkgc2V0dGluZyB0aGUNCi1vcHRpb25zIGZvciB0aGUgZ2VuZXJhdG9yLjwvcD4NCi08cD48aW1nIGJvcmRlcj0iMCIgc3JjPSJpbWFnZXMvamF2YTJ3c2RsLXNjcmVlbjIucG5nIiAvPjwvcD4NCi08cD48c3Ryb25nPkphdmEyV1NETCBQYWdlIDQ6PC9zdHJvbmc+PC9wPg0KLTxwPkhlcmUgeW91IGNhbiBzZWxlY3QgdGhlIG91dHB1dCBmaWxlIHBhdGggYnkgdHlwaW5nIG9yIGJyb3dzaW5nDQotdXNpbmcgdGhlICJCcm93c2UiIGJ1dHRvbi4gWW91IGhhdmUgdGhlIG9wdGlvbiBvZiBicm93c2luZyBvbmx5DQotRWNsaXBzZSB3b3Jrc3BhY2UgcHJvamVjdHMgYnkgc2VsZWN0aW5nIHRoZSAiQWRkIHRoZSBzb3VyY2UgdG8gYQ0KLXByb2plY3Qgb24gY3VycmVudCBlY2xpcHNlIHdvcmtzcGFjZSIgcmFkaW8gYnV0dG9uIC4gT3IgZWxzZSB5b3UNCi1oYXZlIHRoZSBvcHRpb24gdG8gc2F2ZSB0aGUgY29kZWdlbiByZXN1dGxzIHRvIGZpbGUgc3lzdGVtLiBPbmNlDQotdGhlIG91dHB1dCBmaWxlIGxvY2F0aW9uIGFuZCB0aGUgb3V0cHV0IFdTREwgZmlsZSBuYW1lIGlzIGFkZGVkIHlvdQ0KLWNhbiBjbGljayB0aGUgIkZpbmlzaCIgYnV0dG9uIHRvIGNvbXBsZXRlIGdlbmVyYXRpb24uPC9wPg0KLTxwPjxpbWcgYm9yZGVyPSIwIiBzcmM9ImltYWdlcy9qYXZhMndzZGwtc2NyZWVuMy5wbmciIC8+PC9wPg0KLTxwPklmIGEgbWVzc2FnZSBib3ggcG9wcyB1cCBhY2tub3dsZWRnaW5nIHRoZSBzdWNjZXNzLCB0aGVuIHlvdSd2ZQ0KLXN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQgdGhlIEphdmEyV1NETCBjb2RlIGdlbmVyYXRpb24uPC9wPg0KLTxoMT5BcHBlbmRpeDwvaDE+DQotPHVsPg0KLTxsaT5FY2xpcHNlIHJlZmVyZW5jZSAtIDxhIGhyZWY9DQotImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvYT48L2xpPg0KLTxsaT5DdXN0b20gQW50IFRhc2tzIC0gPGEgaHJlZj0NCi0iaHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC9kZXZlbG9wLmh0bWwiPmh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvZGV2ZWxvcC5odG1sPC9hPjwvbGk+DQotPC91bD4NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2lkZWEvSWRlYV9wbHVnLWluX3VzZXJndWlkZS54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9pZGVhL0lkZWFfcGx1Zy1pbl91c2VyZ3VpZGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTNkNTAzLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2lkZWEvSWRlYV9wbHVnLWluX3VzZXJndWlkZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNTIgKzAsMCBAQAotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiINCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPg0KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4NCi08aGVhZD4NCi08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9DQotIkhUTUwgVGlkeSBmb3IgV2luZG93cyAodmVycyAxNCBKdW5lIDIwMDcpLCBzZWUgd3d3LnczLm9yZyIgLz4NCi08bWV0YSBodHRwLWVxdWl2PSJjb250ZW50LXR5cGUiIGNvbnRlbnQ9DQotInRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4NCi08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSIgLz4NCi08dGl0bGU+QXhpczIgUGx1Zy1pbiBHdWlkZSBmb3IgSW50ZWxsaUogSURFQTwvdGl0bGU+DQotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJCbHVlZmlzaCAxLjAuNiIgLz4NCi08bGluayBocmVmPSIuLi8uLi8uLi9jc3MvYXhpcy1kb2NzLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPQ0KLSJ0ZXh0L2NzcyIgbWVkaWE9ImFsbCIgLz4NCi08L2hlYWQ+DQotPGJvZHkgbGFuZz0iZW4iIHhtbDpsYW5nPSJlbiI+DQotPGgxPkF4aXMyIFBsdWctaW4gR3VpZGUgZm9yIEludGVsbGlKIElERUE8L2gxPg0KLTxwPlRoaXMgZG9jdW1lbnQgZXhwbGFpbnMgdGhlIGluc3RhbGxhdGlvbiBhbmQgdXNhZ2Ugb2YgQXhpczINCi1wbHVnLWluIGZvciBJbnRlbGxpSiBJREVBLjwvcD4NCi08cD48YSBocmVmPSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi90b29scy9pbmRleC5odG1sIj5bRG93bmxvYWQNCi1QbHVnLWluXTwvYT48L3A+DQotPGgyPkNvbnRlbnQ8L2gyPg0KLTx1bD4NCi08bGk+PGEgaHJlZj0iI2ludHJvIj5JbnRyb2R1Y3Rpb248L2E+PC9saT4NCi08bGk+PGEgaHJlZj0iI2luc3RhbGxhdGlvbiI+SW5zdGFsbGF0aW9uPC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9IiNXU0RMMkphdmFfQ29kZV9HZW5lcmF0aW9uIj5XU0RMMkphdmEgQ29kZQ0KLUdlbmVyYXRpb248L2E+PC9saT4NCi08bGk+PGEgaHJlZj0iI0NyZWF0ZV9TZXJ2aWNlX0FyY2hpdmUiPkNyZWF0ZSBhIFNlcnZpY2UgQXJjaGl2ZTwvYT4NCi08dWw+DQotPGxpPjxhIGhyZWY9IiNzdWIxMiI+U3ViIFdpemFyZCAxICZhbXA7IFN1YiBXaXphcmQgMjwvYT48L2xpPg0KLTxsaT48YSBocmVmPSIjc3ViMyI+U3ViIFdpemFyZCAzPC9hPjwvbGk+DQotPC91bD4NCi08L2xpPg0KLTwvdWw+DQotPGEgbmFtZT0iaW50cm8iIGlkPSJpbnRybyI+PC9hPg0KLTxoMj5JbnRyb2R1Y3Rpb248L2gyPg0KLTxwPlRoZSBBeGlzMiBwbHVnLWluIGZvciBJbnRlbGxpSiBJREVBIGhlbHBzIHVzZXJzIHRvIGNyZWF0ZQ0KLXNlcnZpY2UgYXJjaGl2ZXMgd2hpY2ggY2FuIGJlIGRlcGxveWVkIGluIEF4aXMyLCBhbmQgZ2VuZXJhdGUgamF2YQ0KLWNsYXNzZXMgZmlsZXMgZnJvbSBXU0RMIGZpbGVzLiBUaGUgZm9sbG93aW5nIHNlY3Rpb24gZGVzY3JpYmVzIHRoZQ0KLWluc3RhbGxhdGlvbiBwcm9jZWR1cmUgZm9sbG93ZWQgYnkgdGhlIHVzYWdlIG9mIHRoZSBwbHVnLWluLjwvcD4NCi08cD48Yj5Ob3RlOjwvYj4gVGhpcyBwbHVnLWluIGlzIG1hZGUgdXAgd2l0aCA8YSBocmVmPQ0KLSJodHRwOi8vYXBpZG9jLm9yZy9kb2NzZXQvMTYiPklERUEgT3BlbiBBUEk8L2E+IHdoaWNoIHdpbGwgYmUNCi1jb21wYXRpYmxlIHdpdGggaWRlYSB2ZXJzaW9uIHNpbmNlIGJ1aWxkIDQxMjEuIFRoZSBwbHVnaW4gYWxzbyBiZQ0KLWNvbXBhdGlibGUgd2l0aCBhbGwgdGhlIGJ1aWxkcyBhZnRlciBidWlsZCBudW1iZXIgNDEyMSBhbmQgYWxzbyB0aGUNCi1qYXZhIHZlcnNpb24gc2hvdWxkIGJlIDEuNCBvciBoaWdoZXIuIFRoZSBwcm92aWRlZCBzY3JlZW4gc2hvdHMgbWF5DQotc2xpZ2h0bHkgZGlmZmVyIHdpdGggd2hhdCB0aGUgdXNlciB3b3VsZCBhY3R1YWxseSBzZWUgYnV0IHRoZQ0KLWZ1bmN0aW9uYWxpdHkgaGFzIG5vdCBiZWVuIGNoYW5nZWQuPC9wPg0KLTxhIG5hbWU9Imluc3RhbGxhdGlvbiIgaWQ9Imluc3RhbGxhdGlvbiI+PC9hPg0KLTxoMj5JbnN0YWxsYXRpb248L2gyPg0KLTxwPkZpcnN0IDxhIGhyZWY9DQotImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL3Rvb2xzL2luZGV4Lmh0bWwiPmRvd25sb2FkPC9hPiB0aGUNCi1wbHVnLWluIHdoaWNoIGlzIGEgemlwcGVkIGZpbGUsIGFuZCBleHRyYWN0IGl0IGludG8gcGx1Z2lucw0KLWRpcmVjdG9yeSB3aGljaCBpcyBsb2NhdGVkIGluIHRoZSBkaXJlY3Rvcnkgd2hlcmUgSURFQSBpcw0KLWluc3RhbGxlZC4gSWYgYSBwcmV2aW91cyB2ZXJzaW9uIG9mIHRoZSBwbHVnLWluIHJlc2lkZXMgaW4gdGhpcw0KLWRpcmVjdG9yeSB5b3Ugd2lsbCBoYXZlIHRvIGRlbGV0ZSBpdCBwcmlvciB0byBleHRyYWN0aW5nIHRoZSBuZXcNCi16aXAgZmlsZS4gSWYgeW91IGhhdmUgZXh0cmFjdGVkIHRoZSBmaWxlIGNvcnJlY3RseSB5b3Ugd291bGQgc2VlIGENCi1kaXJlY3RvcnkgY2FsbGVkIGF4aXMyLWlkZWEtcGx1Z2luLjwvcD4NCi08cD5OZXh0IHN0ZXAgaXMgdG8gcmVzdGFydCBJREVBIHNvIHRoYXQgdGhlIGNoYW5nZXMgY2FuIHRha2UgcGxhY2UuDQotSWYgdGhlIHBsdWctaW4gaGFzIGJlZW4gaW5zdGFsbGVkIGNvcnJlY3RseSwgeW91IHdpbGwgc2VlIGZvbGxvd2luZw0KLWljb25zIGluIElERUEgd2hlbiBpdCBpcyByZXN0YXJ0ZWQuPC9wPg0KLTxwPjxpbWcgYWx0PSJGaWd1cmUgMSIgc3JjPSJpbWFnZXMvaWRlYS1pY29ucy5qcGciIC8+PC9wPg0KLTxwPkFsc28gaWYgeW91IHJpZ2h0LWNsaWNrIG9uIHRoZSBJREVBIGVkaXRvciB5b3Ugd291bGQgc2VlIGEgbGluaw0KLXRvIHRoZSBzYW1lIHBsdWctaW4uPC9wPg0KLTxwPjxpbWcgYWx0PSJGaWd1cmUyIiBzcmM9ImltYWdlcy9pZGVhLXBvcHVwLmpwZyIgLz48L3A+DQotPHA+V2hlbiB5b3UgY2xpY2sgb24gZWl0aGVyIG9uZSBvZiB0aGVtLCBhIHdpbmRvdyAoUGFnZSAxKSB3aWxsDQotYXBwZWFyIGFza2luZyB5b3UgdG8gc2VsZWN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHR3byBvcHRpb25zLjwvcD4NCi08b2w+DQotPGxpPjxhIGhyZWY9IiNDcmVhdGVfU2VydmljZV9BcmNoaXZlIj5DcmVhdGUgYSBzZXJ2aWNlDQotYXJjaGl2ZTwvYT48L2xpPg0KLTxsaT48YSBocmVmPSIjV1NETDJKYXZhX0NvZGVfR2VuZXJhdGlvbiI+V1NETDJKYXZhIGNvZGUNCi1nZW5lcmF0aW9uPC9hPjwvbGk+DQotPC9vbD4NCi08cD48c3Ryb25nPlBhZ2UgMTo8L3N0cm9uZz48L3A+DQotPHA+PGltZyBhbHQ9IkZpZ3VyZTMiIHNyYz0iaW1hZ2VzL2ZpZzEuanBnIiAvPjwvcD4NCi08cD5JZiB5b3Ugd2FudCB0byBjcmVhdGUgYSBzZXJ2aWNlIGFyY2hpdmUgb2J2aW91c2x5IHlvdSBtdXN0DQotc2VsZWN0ICJDcmVhdGUgYSBzZXJ2aWNlIGFyY2hpdmUiIG9wdGlvbi4gTGlrZSB3aXNlLCBpZiB1IHdhbnQgdG8NCi1nZW5lcmF0ZSBqYXZhIGNsYXNzIGZpbGUgZnJvbSBhIFdTREwgZmlsZSB5b3UgbXVzdCBzZWxlY3QgdGhlIHJhZGlvDQotYnV0dG9uIG9wdGlvbiAiV1NETDJKYXZhIGNvZGUgZ2VuZXJhdGlvbiIuPC9wPg0KLTxoMj48YSBuYW1lPSJXU0RMMkphdmFfQ29kZV9HZW5lcmF0aW9uIiBpZD0NCi0iV1NETDJKYXZhX0NvZGVfR2VuZXJhdGlvbiI+V1NETDJKYXZhIENvZGUgR2VuZXJhdGlvbjwvYT48L2gyPg0KLTxwPlNlbGVjdCAiV1NETDJKYXZhIGNvZGUgZ2VuZXJhdGlvbiIgYW5kIGNsaWNrIG9uIHRoZSBidXR0b24gIk9LIg0KLXRvIGdlbmVyYXRlIGNvZGUgZnJvbSBhIFdTREwgZmlsZS4gVGhlbiB0aGUgZm9sbG93aW5nIHdpbmRvdyB3aWxsDQotYXBwZWFyLjwvcD4NCi08cD48c3Ryb25nPldTREwySmF2YSBQYWdlIDI6PC9zdHJvbmc+PC9wPg0KLTxwPjxpbWcgYWx0PSJGaWd1cmU0IiBzcmM9ImltYWdlcy9maWcyLmpwZyIgLz48L3A+DQotPHA+T25jZSB0aGUgV1NETCBmaWxlIGlzIHNlbGVjdGVkIHlvdSB3aWxsIGJlIGFibGUgdG8gbW92ZSBvbnRvIHRoZQ0KLW5leHQgcGFnZS4gVGhlICJCcm93c2UiIGJ1dHRvbiBjYW4gYmUgdXNlZCB0byBlYXNpbHkgYnJvd3NlIGZvciBhDQotZmlsZSByYXRoZXIgdGhhbiBoYXZpbmcgdG8gdHlwZSB0aGUgd2hvbGUgcGF0aC48L3A+DQotPHA+T25jZSB0aGUgV1NETCBmaWxlIGlzIHNlbGVjdGVkLCBjbGljayBvbiB0aGUgIk5leHQiIGJ1dHRvbiB3aGljaA0KLXdpbGwgdGFrZSB5b3UgdG8gdGhlIHBhZ2UgYmVsb3cuPC9wPg0KLTxwPjxzdHJvbmc+V1NETDJKYXZhIFBhZ2UgMzo8L3N0cm9uZz48L3A+DQotPHA+VGhpcyBwYWdlIGdpdmVzIHRoZSB1c2VyIHRoZSBvcHRpb24gb2Ygc2VsZWN0aW5nIGRlZmF1bHQgb3INCi1jdXN0b20gY29kZSBnZW5lcmF0aW9uIG9wdGlvbnMuIFRoZXJlIGFyZSB0aHJlZSBkZWZhdWx0IGNvZGUNCi1nZW5lcmF0aW9uIG9wdGlvbnMgaW4gYWxsLiBUaGUgZmlyc3QgZW5hYmxlcyB0aGUgdXNlciB0byBnZW5lcmF0ZQ0KLWJvdGggY2xpZW50IGFuZCBzZXJ2ZXIgY29kZSB1bmRlciBkZWZhdWx0IGNvbmZpZ3VyYXRpb25zIHdoaWxlIHRoZQ0KLXNlY29uZCBnZW5lcmF0ZXMganVzdCB0aGUgY2xpZW50IHNpZGUgdW5kZXIgZGVmYXVsdCBjb25maWd1cmF0aW9ucy4NCi1UaGUgdGhpcmQgb3B0aW9uIGdlbmVyYXRlcyBzZXJ2ZXIgc2lkZSBjb2RlIHVuZGVyIGRlZmF1bHQNCi1jb25maWd1cmF0aW9ucy48L3A+DQotPHA+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPjwvcD4NCi08dWw+DQotPGxpPldoZW4gY2xpZW50IHNpZGUgY29kZSBpcyBnZW5lcmF0ZWQgdW5kZXIgZGVmYXVsdCBjb25maWd1cmF0aW9ucw0KLWl0IGdlbmVyYXRlcyB0aGUgc3R1YiwgY29tcGlsZXMgaXQsIHBhY2thZ2VzIGl0IGFzIGEgamFyICh0aGUgbmFtZQ0KLW9mIHRoZSBqYXIgd2lsbCBiZSAmbHQ7c2VydmljZSBuYW1lICZndDstamFyKSBwbGFjZXMgaXQgaW4gYSBsaWINCi1mb2xkZXIgKElmIHRoZXJlIGlzIG5vIGxpYiBmb2xkZXIsIGl0IGlzIGNyZWF0ZWQpIHVuZGVyIHRoZSBJREVBDQotcHJvamVjdCB0aGF0IGlzIG9wZW5lZC4gVGhpcyBqYXIgdGhhdCdzIGdlbmVyYXRlZCB3aWxsIGFsc28gYmUNCi1hZGRlZCBhcyBhIHByb2plY3QgbGlicmFyeSB0byB0aGUgY3VycmVudCBhY3RpdmUgSURFQSBwcm9qZWN0LjwvbGk+DQotPGxpPldoZW4gc2VydmVyIGNvZGUgaXMgZ2VuZXJhdGVkIHVuZGVyIGRlZmF1bHQgY29uZmlndXJhdGlvbnMgaXQNCi1nZW5lcmF0ZXMgdGhlIHNlcnZlciBzaWRlIGNvZGUgYW5kIGFsc28gZ2VuZXJhdGVzIGEgZGVmYXVsdA0KLXNlcnZpY2UueG1sLiBUaGUgdXNlciB3aWxsIHRoZW4gYmUgdGFrZW4gdG8gcGFnZSA1LjwvbGk+DQotPGxpPldoZW4gYm90aCBzZXJ2ZXIgYW5kIGNsaWVudCBzaWRlIGlzIGdlbmVyYXRlZCB1bmRlciBkZWZhdWx0DQotY29uZmlndXJhdGlvbnMgdGhlIGNsaWVudCBzdHViIGlzIGFkZGVkIGFyZSBhIGphciB0byB0aGUgY3VycmVudA0KLUlERUEgcHJvamVjdCBhbmQgdGhlIHVzZXIgaXMgdGFrZW4gdG8gcGFnZSA1LjwvbGk+DQotPC91bD4NCi08cD48aW1nIGFsdD0iRmlndXJlNSIgc3JjPSJpbWFnZXMvZmlnMTkuanBnIiAvPjwvcD4NCi08cD48c3Ryb25nPldTREwySmF2YSBQYWdlIDQ6PC9zdHJvbmc+PC9wPg0KLTxwPjxzdHJvbmc+Q29kZWdlbiBvcHRpb25zPC9zdHJvbmc+IGFyZSB0byBiZSBzZWxlY3RlZCBoZXJlLiBCeSBmYXINCi10aGlzIGlzIHRoZSBtb3N0IGltcG9ydGFudCBwYWdlIGluIHRoaXMgd2l6YXJkLCB3aGljaCBkZXRlcm1pbmVzDQotdGhlIGNoYXJhY3RlcmlzdGljcyBvZiB0aGUgY29kZSBiZWluZyBnZW5lcmF0ZWQuPC9wPg0KLTxwPjxpbWcgYWx0PSJGaWd1cmU1IiBzcmM9ImltYWdlcy9maWcxOC5qcGciIC8+PC9wPg0KLTxwPjxzdHJvbmc+SGVyZSdzIHNvbWUgaW5mb3JtYXRpb24gb24gdGhlIG9wdGlvbnMgZm9yDQotc2VsZWN0aW9uOjwvc3Ryb25nPjwvcD4NCi08dWw+DQotPGxpPk91dHB1dCBsYW5ndWFnZSBjYW4gYmUgSmF2YSwgQyMuIEJ1dCB3ZSBoYXZlIG5vdCBmdWxseSB0ZXN0ZWQNCi1DIyBjb2RlZ2VuZXJhdGlvbiwgdGhlcmVmb3JlLCBpdCBpcyBiZXR0ZXIgdG8gc2VsZWN0IEphdmEgYXMgb3V0cHV0DQotbGFuZ3VhZ2UuPC9saT4NCi08bGk+SWYgdGhlIFdTREwgY29tcHJpc2VzIG9mIHNldmVyYWwgc2VydmljZXMsIHRoZSB1c2VyIGNhbiBzZWxlY3QNCi10aGUgc2VydmljZSBmb3Igd2hpY2ggdGhlIGNvZGUgc2hvdWxkIGJlIGdlbmVyYXRlZCBmb3IuPC9saT4NCi08bGk+SWYgdGhlIFdTREwgY29tcHJpc2VzIG9mIHNldmVyYWwgcG9ydHMgZm9yIGEgcGFydGljdWxsYXINCi1zZXJ2aWNlLCB0aGUgdXNlciBjYW4gc2VsZWN0IHRoZSBwb3J0IHdoaWNoIHRoZSBjb2RlIHNob3VsZCBiZQ0KLWdlbmVyYXRlZCBmb3IuPC9saT4NCi08bGk+VGhlIGRlZmF1bHQgZGF0YSBiaW5kaW5nIHR5cGUgaXMgYWRiIChBeGlzMiBEYXRhIEJpbmRpbmcpLg0KLUFsdGhvdWdoIHRoZSB0b29sIGlzIGNhcGFibGUgb2YgcHJvdmlkaW5nIFhNTCBiZWFucywgZHVlIHRvIGNsYXNzDQotbG9hZGluZyBpc3N1ZXMgaW4gWE1MIGJlYW5zLCBjdXJyZW50IGltcGxlbWVudGF0aW9uIG9ubHkgZ2VuZXJhdGUNCi1jb2RlIHdpdGggT00gYW5kIEFEQi48L2xpPg0KLTxsaT5BcyBmb3IgdGhlIHBhY2thZ2UgbmFtZSBvZiB0aGUgZ2VuZXJhdGVkIGNvZGUsIHlvdSBjYW4gc2V0IHRoZQ0KLW5hbWUgYXMgeW91IHdpc2guPC9saT4NCi08bGk+VXNlcnMgY2FuIHNlbGVjdCB0aGUgb25lIG91dCBvZiB0aGUgdGhyZWUgb3B0aW9ucy0gIkdlbmVyYXRlDQotQ2xpZW50IFNpZGUiLCAiR2VuZXJhdGUgU2VydmVyIFNpZGUiIGFuZCAiR2VuZXJhdGUgQWxsIi4gVGhlIHVzZXINCi13aWxsIGJlIGFibGUgdG8gc2VsZWN0IGZ1cnRoZXIgb3B0aW9ucyBiYXNlZCBvbiBoaXMgb3B0aW9ucw0KLXNlbGVjdGVkIGhlcmUuIFRoZXNlIHN1YiBvcHRpb25zIGFyZSBleHBsYWluZWQgYmVsb3cuPC9saT4NCi08bGkgc3R5bGU9Imxpc3Qtc3R5bGU6IG5vbmU7IGRpc3BsYXk6IGlubGluZSI+DQotPHVsPg0KLTxsaT5JZiB1c2VyIHNlbGVjdHMgIkdlbmVyYXRlIENsaWVudCBTaWRlIiwgaGUgY2FuIGZ1cnRoZXIgc2VsZWN0DQotdGhlIHNlcnZpY2UgaW52b2NhdGlvbiBzdHlsZS4gU2luY2UgQXhpczIgc3VwcG9ydHMgYm90aCBzeW5jaHJvbm91cw0KLWFuZCBhc3luY2hyb25vdXMgY2xpZW50IHByb2dyYW1taW5nIG1vZGVsLCB0aGUgdG9vbCBoYXMgcHJvdmlkZWQgYQ0KLXdheSB0byBzZWxlY3RpbmcgdGhlIGludm9jYXRpb24gc3R5bGUuPC9saT4NCi08bGk+SWYgdXNlciBzZWxlY3RzICJHZW5lcmF0ZSBTZXJ2ZXIgU2lkZSIsIGhlIGNhbiBhbHNvIGdlbmVyYXRlIGENCi1kZWZhdWx0IHNlcnZpY2UgWE1MIGZpbGUuIElmIHRoZSB1c2VyIHNlbGVjdHMgIkdlbmVyYXRlIGFuDQotaW50ZXJmYWNlIGZvciBza2VsZXRvbiIgb3B0aW9uIHRoZW4gaXQgb25seSBnZW5lcmF0ZXMgYW4gaW50ZXJmYWNlDQotZm9yIHRoZSBzZXJ2ZXIgc2lkZS4gSWYgc28gdGhlIHVzZXIgaGFzIHRvIGltcGxlbWVudCB0aGlzDQotaW50ZXJmYWNlLiBJZiB0aGlzIG9wdGlvbiBpcyBub3Qgc2VsZWN0ZWQsIHRoZSBza2VsZXRvbiBjbGFzcyBpcw0KLWdlbmVyYXRlZCwgd2hpY2ggdGhlIHVzZXIgY2FuIGZpbGwgaW4gbGF0ZXIgb24uPC9saT4NCi08bGk+SWYgdXNlciBzZWxlY3RzICJHZW5lcmF0ZSBBbGwiIG9wdGlvbiwgdGhlbiBhbGwgdGhlIGNsYXNzZXMNCi13aWxsIGJlIGdlbmVyYXRlZCBpbiB0aGUgcmVmZXJlbmNlZCBzY2hlbWFzIGJ5IHRoZSBXU0RMDQotaXJyZXNwZWN0aXZlIG9mIGVsZW1lbnRzIHJlZmVycmVkIGJ5IHRoZSBXU0RMLCBhbG9uZyB3aXRoIHRoZQ0KLWNsaWVudCBzaWRlIGNvZGUuPC9saT4NCi08L3VsPg0KLTwvbGk+DQotPGxpPlRoZSBkYWZhdWx0IGJlaGF2aW91ciBvZiB0aGUgY29kZSBnZW5lcmF0b3IgaXMgdG8gbWFwDQotbmFtZXNwYWNlcyB0byBwYWNrYWdlIG5hbWVzIGxvZ2ljYWxseSwgYnV0IGlmIHRoZSB1c2VyIHdpc2hlcyB0bw0KLWNoYW5nZSB0aGUgcGFja2FnZSBuYW1lcyBvZiB0aGUgZ2VuZXJhdGVkIGNsYXNzZXMsIGhlIGNhbiBkbyBzbyBieQ0KLWNoYW5naW5nIHRoZSB2YWx1ZXMgaW4gdGhlIE5hbWVzcGFjZSB0byBQYWNrYWdlbmFtZSBtYXBwaW5nDQotdGFibGUuPC9saT4NCi08L3VsPg0KLTxwPldpdGggdGhlc2UgZW5oYW5jZWQgb3B0aW9ucyBub3ZpY2VzIG5lZWQgbm90IHdvcnJ5IGFib3V0IHRoZQ0KLW9wdGlvbnMgdGhhdCBjYW4gYmUgc2V0IGFzIHRoZSBkZWZhdWx0IG9wdGlvbnMgY292ZXIgdGhlIG1vc3QNCi1jb21tb24gY2FzZXMuIEFkdmFuY2VkIHVzZXJzIHdpbGwgZmluZCBpdCB2ZXJ5IGVhc3kgdG8gdHVybiB0aGUNCi1rbm9icyB1c2luZyB0aGUgY3VzdG9tIGdlbmVyYXRpb24gb3B0aW9uLjwvcD4NCi08cD48c3Ryb25nPldTREwySmF2YSBQYWdlIDU6PC9zdHJvbmc+PC9wPg0KLTxwPjxpbWcgYWx0PSJGaWd1cmU2IiBzcmM9ImltYWdlcy9maWczLmpwZyIgLz48L3A+DQotPHA+SGVyZSB1c2VzIGhhdmUgdGhlIG9wdGlvbiBvZiBhZGRpbmcgdGhlIGdlbmVyYXRlZCBjb2RlIGRpcmVjdGx5DQotdG8gdGhlaXIgd29ya2luZyBJREVBIHByb2plY3Qgb3IgY2hvb3NlIGEgY3VzdG9tIGxvY2F0aW9uLiBJZiB0aGUNCi11c2VyIGRlY2lkZXMgdG8gYWRkIGl0IHRvIHRoZSBjdXJyZW50IElERUEgcHJvamVjdCBoZS9zaGUgd2lsbCBoYXZlDQotdG8gY2hvb3NlIHRoZSBtb2R1bGUgYW5kIHRoZSBzb3VyY2UgZGlyZWN0b3J5IHRoYXQgdGhlIGNvZGUgc2hvdWxkDQotYmUgZ2VuZXJhdGVkIHRvLjwvcD4NCi08cD5BbHRlcm5hdGl2ZWx5IHRoZSB1c2VyIGNhbiBicm93c2UgYW5kIHNlbGVjdCB0aGUgb3V0cHV0DQotbG9jYXRpb24vcGF0aCAodGhlIGxvY2F0aW9uIGF0IHdoaWNoIHRoZSBjb2RlIGlzIHRvIGJlIGdlbmVyYXRlZCkNCi11c2luZyB0aGUgIkJyb3dzZSIgYnV0dG9uLiBCZWNhdXNlIG9mIHRoZSAiQnJvd3NlIiBidXR0b24geW91IGRvDQotbm90IG5lZWQgdG8gdHlwZSBpbiB0aGUgb3V0cHV0IGZpbGUgcGF0aC48L3A+DQotPHA+PGltZyBhbHQ9IkZpZzQiIHNyYz0iaW1hZ2VzL2ZpZzQuanBnIiAvPjwvcD4NCi08cD5PbmNlIGFuIG91dHB1dCBsb2NhdGlvbiBpcyBzZWxlY3RlZCB5b3UgY2FuIGNsaWNrIG9uICJGaW5pc2giDQotYnV0dG9uIHdoaWNoIHdpbGwgZ2VuZXJhdGUgdGhlIGphdmEgY2xhc3MgZmlsZS4gSWYgY29kZSBnZW5lcmF0aW9uDQotaXMgc3VjY2Vzc2Z1bCB0aGVuIGEgbWVzc2FnZSBib3ggd2lsbCBhcHBlYXIgYWNrbm93bGVkZ2luZyB0aGlzDQotZmFjdCBhIHNob3duIGFib3ZlLjwvcD4NCi08cD48YSBuYW1lPSJDcmVhdGVfU2VydmljZV9BcmNoaXZlIiBpZD0NCi0iQ3JlYXRlX1NlcnZpY2VfQXJjaGl2ZSI+PC9hPjwvcD4NCi08aDI+Q3JlYXRlIGEgU2VydmljZSBBcmNoaXZlPC9oMj4NCi08cD5TZWxlY3QgdGhlICJDcmVhdGUgYSBzZXJ2aWNlIGFyY2hpdmUiIHJhZGlvIGJ1dHRvbiBvbiBQYWdlIDEgb2YNCi1BeGlzMiBJREVBIHBsdWctaW4gd2l6YXJkLjwvcD4NCi08cD48c3Ryb25nPlBhZ2UgMTo8L3N0cm9uZz48L3A+DQotPHA+PGltZyBhbHQ9IkZpZzUiIHNyYz0iaW1hZ2VzL2ZpZzEuanBnIiAvPjwvcD4NCi08cD48c3Ryb25nPlNlcnZpY2UgQXJjaGl2ZSBQYWdlIDI6PC9zdHJvbmc+PC9wPg0KLTxwPlRoZSBwYWdlIGJlbG93IHdpbGwgYXBwZWFyIGFza2luZyB0aGUgdXNlciB0byBzZWxlY3QgdGhlIGFyY2hpdmUNCi10eXBlPC9wPg0KLTxwPjxpbWcgYWx0PSJmaWc2IiBzcmM9ImltYWdlcy9maWc2LmpwZyIgLz48L3A+DQotPHA+SW4gQXhpczIsIHRoZSB1c2VyIGNhbiBkZXBsb3kgYSBzaW5nbGUgc2VydmljZSBvciBhIHNlcnZpY2UNCi1ncm91cC4gVGhlcmVmb3JlLCB5b3UgY2FuIHNlbGVjdCBlaXRoZXIgIlNpbmdsZSBzZXJ2aWNlIGFyY2hpdmUiIG9yDQotIlNlcnZpY2UgZ3JvdXAgYXJjaGl2ZSIgZm9yIHRoZSBhcmNoaXZlIHR5cGUgeW91IHdhbnQgdG8NCi1jcmVhdGUuPC9wPg0KLTxwPklmIHlvdSBhbHJlYWR5IGhhdmUgYSBzZXJ2aWNlcy54bWwgeW91IGNhbiBza2lwIHNvbWUgb2YgdGhlDQotc3RlcHMgaW4gdGhlIHdpemFyZCBieSBzZWxlY3RpbmcgdGhlIHJhZGlvIGJ1dHRvbiBvcHRpb24gIkkgYWxyZWFkeQ0KLWhhdmUgc2VydmljZXMueG1sIiBhbmQgY2xpY2tpbmcgb24gIk5leHQiIGJ1dHRvbi4gSWYgeW91IGRvIG5vdA0KLWhhdmUgdGhlIHNlcnZpY2VzLnhtbCwgc2VsZWN0IHRoZSByYWRpbyBidXR0b24gb3B0aW9uICJHZW5lcmF0ZQ0KLXNlcnZpY2VzLnhtbCIgYW5kIGNsaWNrIG9uIHRoZSAiTmV4dCIgYnV0dG9uLCBpbiB3aGljaCBjYXNlIHRoZQ0KLXRvb2wgd2lsbCBjcmVhdGUgdGhlIHNlcnZpY2VzLnhtbCBmb3IgeW91LjwvcD4NCi08cD5EZXBlbmRpbmcgb24gdGhlIG9wdGlvbnMgeW91IHNlbGVjdGVkIG9uIHRoaXMgcGFnZSB0aGVyZSBjYW4gYmUNCi10aHJlZSBzdWIgd2l6YXJkczo8L3A+DQotPG9sPg0KLTxsaT48YSBocmVmPSIjc3ViMTIiPlN1YiB3aXphcmQgMTwvYT4gKEdlbmVyYXRlIHNpbmdsZSBzZXJ2aWNlIGFuZA0KLWl0cyBzZXJ2aWNlcy54bWwpPC9saT4NCi08bGk+PGEgaHJlZj0iI3N1YjEyIj5TdWIgd2l6YXJkIDI8L2E+IChHZW5lcmF0ZSBzZXJ2aWNlIGdyb3VwIGFuZA0KLWl0cyBzZXJ2aWNlcy54bWwpPC9saT4NCi08bGk+PGEgaHJlZj0iI3N1YjMiPlN1YiB3aXphcmQgMzwvYT4gKEdlbmVyYXRlIHNlcnZpY2Uvc2VydmljZQ0KLWdyb3VwIHVzaW5nIGFscmVhZHkgZXhpc3Rpbmcgc2VydmljZXMueG1sKTwvbGk+DQotPC9vbD4NCi08cD4xICZhbXA7IDIgZm9sbG93IHRoZSBzYW1lIHNldCBvZiBzdGVwcyBleGNlcHQgZm9yIHNvbWUgbG9vcGluZw0KLW1lY2hhbmlzbSBpbiB0aGUgbWlkZGxlIG9mIHRoZSB3aXphcmQuPC9wPg0KLTxhIG5hbWU9InN1YjEyIiBpZD0ic3ViMTIiPjwvYT4NCi08aDM+U3ViIFdpemFyZCAxIGFuZCBTdWIgV2l6YXJkIDI8L2gzPg0KLTxwPjxzdHJvbmc+U2VydmljZSBBcmNoaXZlIChzdWIgd2l6YXJkcyAxICZhbXA7IDIpIFBhZ2UNCi0zOjwvc3Ryb25nPjwvcD4NCi08cD5Gcm9tIHRoaXMgcGFnZSB5b3UgaGF2ZSB0byBzZWxlY3QgdGhlIGxvY2F0aW9uIG9mIHRoZSBzZXJ2aWNlDQotY2xhc3NlcyBkaXJlY3RvcnkgKHRoZSBsb2NhdGlvbiBvZiB0aGUgY29tcGlsZWQgY2xhc3NlcykuIFlvdSBkbw0KLW5vdCBuZWVkIHRvIHR5cGUgcGF0aCwgc2ltcGx5IGJyb3dzZSBhbmQgc2VsZWN0LjwvcD4NCi08cD48aW1nIGFsdD0iZmlnNyIgc3JjPSJpbWFnZXMvZmlnNy5qcGciIC8+PC9wPg0KLTxwPldoZW4geW91IGNsaWNrIG9uICJOZXh0IiBidXR0b24sIHdpemFyZCB3aWxsIG1vdmUgdG8gdGhlIHBhZ2UNCi1iZWxvdzwvcD4NCi08cD48c3Ryb25nPlNlcnZpY2UgQXJjaGl2ZSAoc3ViIHdpemFyZHMgMSAmYW1wOyAyKSBQYWdlDQotNDo8L3N0cm9uZz48L3A+DQotPHA+SGVyZSB5b3Ugc2VsZWN0IHNlcnZpY2Ugc3BlY2lmaWMgZXh0ZXJuYWwgbGlicmFyaWVzICh0aGlyZCBwYXJ0eQ0KLWxpYnJhcmllcykgYW5kIHNlcnZpY2UgV1NETCBmaWxlcy4gSWYgeW91IHdhbnQgdG8gYWRkIG11bHRpcGxlIFdTREwNCi1maWxlcyB0byBhIHNpbmdsZSBzZXJ2aWNlIHR5cGUgeW91IGNhbiBkbyB0aGF0IGFzIHdlbGwuPC9wPg0KLTxwPjxpbWcgYWx0PSJmaWc4IiBzcmM9ImltYWdlcy9maWc4LmpwZyIgLz48L3A+DQotPHA+VG8gYWRkIGxpYnJhcmllcyBmaXJzdCBjbGljayBvbiB0aGUgYnJvd3NlIGJ1dHRvbiB0byBicm93c2UgZm9yDQotbGlicmFyeSBmaWxlcyBhbmQgdGhlbiBjbGljayBvbiB0aGUgIkFkZCIgYnV0dG9uLiBPbmNlIGFkZGVkIHRoZQ0KLXNlbGVjdGVkIGZpbGUgd2lsbCBhcHBlYXIgaW4gdGhlIGxpc3QgYm94LjwvcD4NCi08cD5UbyBhZGQgV1NETHMsIGZpcnN0IGNsaWNrIG9uIHRoZSBicm93c2UgYnV0dG9uIHRvIGJyb3dzZSBmb3INCi1XU0RMIGZpbGUgYW5kIHRoZW4gY2xpY2sgdGhlICJBZGQiIGJ1dHRvbiB0byBhZGQgdGhlIGZpbGUgdG8gdGhlDQotbGlzdC48L3A+DQotPHA+QWZ0ZXIgYWRkaW5nIGV4dGVybmFsIGxpYnJhcmllcyBhbmQgc2VydmljZSBXU0RMIGZpbGVzIGNsaWNrIG9uDQotdGhlICJOZXh0IiBidXR0b24gdG8gbW92ZSB0byBuZXh0IHBhZ2UuPC9wPg0KLTxwPjxzdHJvbmc+U2VydmljZSBBcmNoaXZlIChzdWIgd2l6YXJkcyAxICZhbXA7IDIpIFBhZ2UNCi01Ojwvc3Ryb25nPjwvcD4NCi08cD5UaGlzIHBhZ2UgYWxsb3dzIHlvdSB0byBzZWxlY3Qgc2VydmljZSBpbXBsZW1lbnRhdGlvbiBjbGFzcy4gSW4NCi10aGUgY2FzZSBvZiBzZXJ2aWNlIGdyb3VwLCBzYW1lIHBhZ2Ugd2lsbCBiZSBsb29wZWQgdG8gc2VsZWN0DQotbXVsdGlwbGUgc2VydmljZSBpbXBsZW1lbnRhdGlvbiBjbGFzc2VzLiBUaGlzIHByb2Nlc3MgaXMgZXhwbGFpbmVkDQotaW4gZGV0YWlsIGJlbG93LjwvcD4NCi08cD5TZWxlY3QgYSBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIGNsYXNzIGJ5IGJyb3dzaW5nIGFuZCBjbGlja2luZw0KLW9uIHRoZSAiTG9hZCIgYnV0dG9uIHRvIGxvYWQgYWxsIHRoZSBwdWJsaWMgbWV0aG9kcyBpbiB0aGF0IGNsYXNzLA0KLWFmdGVyIHdoaWNoIHlvdSBjYW4gc2VsZWN0IHRoZSBtZXRob2RzIHRoYXQgeW91IHdhbnQgdG8gcHVibGlzaA0KLXVzaW5nIHRoZSBjaGVjayBib3hlcy48L3A+DQotPHA+PHN0cm9uZz5Ob3RlIDo8L3N0cm9uZz4gSWYgeW91IGRvIG5vdCBzZWxlY3QgdGhlIGNvcnJlY3QgY2xhc3MNCi1wYXRoIGZyb20gdGhlICJDbGFzcyBsb2NhdGlvbiBzZWxlY3Rpb24iIHdpbmRvdywgdGhlIHB1YmxpYyBtZXRob2RzDQotd2hpY2ggYXJlIGF2YWlsYWJsZSBpbiB0aGUgc2VsZWN0ZWQgY2xhc3MgZmlsZSB3aWxsIG5vdCBiZQ0KLWxvYWRlZC48L3A+DQotPHA+PGltZyBhbHQ9ImZpZzEwIiBzcmM9ImltYWdlcy9maWcxMC5qcGciIC8+PC9wPg0KLTxwPkluICJTZXJ2aWNlIE5hbWUiIHRleHQgYm94IHlvdSBjYW4gdHlwZSB0aGUgbmFtZSBvZiB0aGUgc2VydmljZQ0KLXlvdSB3YW50LCBidXQgcmVtZW1iZXIgdGhhdCB0aGUgc2VydmljZSBuYW1lIHNob3VsZCBiZSB1bmlxdWUNCi10aHJvdWdob3V0IHRoZSBzeXN0ZW0uPC9wPg0KLTxwPldoZW4geW91IGhhdmUgY29tcGxldGVkIHRoaXMgcGFydGljdWxhciBzZXJ2aWNlIGNsaWNrIG9uIHRoZQ0KLWJ1dHRvbiAiTmV4dCIuIEluIHRoZSBjYXNlIG9mIGEgc2VydmljZSBncm91cCB3aGVuIHlvdSBjbGljayBvbiB0aGUNCi0iTmV4dCIgYnV0dG9uIGZvciB0aGF0IHBhcnRpY3VsYXIgc2VydmljZSB0aGUgZm9sbG93aW5nIGRpYWxvZyBib3gNCi13aWxsIGFwcGVhciB3aXRoIG9wdGlvbiB0byBhZGQgbW9yZSBzZXJ2aWNlKHMpIHRvIGEgc2VydmljZQ0KLWdyb3VwLjwvcD4NCi08cD48aW1nIGFsdD0iZmlnMTEiIHNyYz0iaW1hZ2VzL2ZpZzExLmpwZyIgLz48L3A+DQotPHA+SWYgeW91IGNsaWNrIG9uICJZZXMiLCB5b3UgaGF2ZSB0byBmb2xsb3cgdGhlIHNhbWUgcHJvY2VkdXJlIHRvDQotYWRkIHNvbWUgb3RoZXIgc2VydmljZShzKSB0byBzZXJ2aWNlIGdyb3VwLjwvcD4NCi08cD5JZiB5b3UgY2xpY2sgb24gIk5vIiwgdGhlIGJ1dHRvbiAiTmV4dCIgd2lsbCBiZSBlbmFibGVkIGFuZCB5b3UNCi1jYW4gZ28gdG8gbmV4dCBwYWdlLjwvcD4NCi08cD48YSBuYW1lPSJOb3RlIiBpZD0iTm90ZSI+PHN0cm9uZz48ZW0+Tm90ZTogRnJvbSB0aGlzIHBvaW50DQotb253YXJkcyB0aGUgc3RlcHMgYXJlIHNpbWlsYXIgdG8gYWxsIHRoZSBzdWINCi13aXphcmRzLjwvZW0+PC9zdHJvbmc+PC9hPjwvcD4NCi08cD48c3Ryb25nPlNlcnZpY2UgQXJjaGl2ZSAoc3ViIHdpemFyZHMgMSAmYW1wOyAyKSBQYWdlDQotNjo8L3N0cm9uZz48L3A+DQotPHA+VGhpcyBwYWdlIGRpc3BsYXlzIHRoZSBzZXJ2aWNlcy54bWwgZmlsZSwgZWl0aGVyIHRoZSBvbmUgZ2l2ZW4NCi1ieSB5b3UgKGluIHRoZSBjYXNlIG9mIEkgYWxyZWFkeSBoYXZlIHNlcnZpY2VzLnhtbCkNCi1vciB0aGUgb25lIGdlbmVyYXRlZCBieSB0aGUgc3lzdGVtIChpbiB0aGUgY2FzZSBvZiAiZ2VuZXJhdGUNCi1zZXJ2aWNlcy54bWwiKTwvcD4NCi08cD48aW1nIGFsdD0iZmlnMTIiIHNyYz0iaW1hZ2VzL2ZpZzEyLmpwZyIgLz48L3A+DQotPHA+VGhpcyBwYWdlIGlzIGVkaXRhYmxlIGFuZCBwcm92aWRlIGEgd2F5IHRvIGFkZCBwYXJhbWV0ZXJzIGFuZA0KLW1vZHVsZSByZWZlcmVuY2VzIHRvIGFueSBsZXZlbC48L3A+DQotPHA+PHN0cm9uZz5Ob3RlIDo8L3N0cm9uZz4gV2hlbiB5b3UgY2xpY2sgb24gZWl0aGVyIHRoZQ0KLSIrUGFyYW1ldGVyIiBvciB0aGUgIitNb2R1bGVSZWYiIGJ1dHRvbnMgcmVtZW1iZXIgdGhhdA0KLWNvcnJlc3BvbmRpbmcgdGV4dCB3aWxsIGJlIGFkZGVkIHRvIHRoZSBjdXJyZW50IG1vdXNlIHBvc2l0aW9uLg0KLVRoZXJlZm9yZSwgY2xpY2sgb24gdGhlIGxvY2F0aW9uIHlvdSB3YW50IHRvIGFkZCB0aGUgcGFyYW1ldGVyIG9yDQotbW9kdWxlIHJlZmVyZW5jZXMgYW5kIHRoZW4gY2xpY2sgcmVsZXZhbnQgYnV0dG9uICgrUGFyYW1ldGVyIG9yDQotK01vZHVsZVJlZikuPC9wPg0KLTxwPjxzdHJvbmc+K1BhcmFtZXRlciBidXR0b246PC9zdHJvbmc+PC9wPg0KLTxwPklmIHlvdSBjbGljayBvbiB0aGUgIitQYXJhbWV0ZXIiIGJ1dHRvbiBhIHdpbmRvdyB3aWxsIGFwcGVhcg0KLWFza2luZyB0byBnaXZlIHBhcmFtZXRlciBuYW1lIGFuZCBwYXJhbWV0ZXIgdmFsdWUuPC9wPg0KLTxwPjxpbWcgYWx0PSJmaWcxMyIgc3JjPSJpbWFnZXMvZmlnMTMuanBnIiAvPjwvcD4NCi08cD5Ob3RlIHRoYXQgeW91IGNhbiBhbHNvIG1hbnVhbGx5IGFkZCBwYXJhbWV0ZXJzICh3aXRob3V0IGNsaWNraW5nDQotb24gdGhlICIrUGFyYW1ldGVyIiBidXR0b24gKSB0byBhbnkgd2hlcmUgaW4gdGhlIGRvY3VtZW50IGFzIHlvdQ0KLXdpc2guPC9wPg0KLTxwPjxzdHJvbmc+K01vZHVsZVJlZiBidXR0b246PC9zdHJvbmc+PC9wPg0KLTxwPkxpa2V3aXNlLCBhZGRpbmcgbW9kdWxlIHJlZmVyZW5jZXMgY2FuIGJlIGRvbmUgYnkgY2xpY2tpbmcgb24NCi10aGUgIitNb2R1bGVSZWYiIGJ1dHRvbiBpbiB0aGUgcGFnZS4gWW91IGhhdmUgdG8gdHlwZSB0aGUgbmFtZSBvZg0KLXRoZSBtb2R1bGUgdG8gYmUgZW5nYWdlZCBhcyBzaG93biBpbiB0aGUgZm9sbG93aW5nIGZpZ3VyZS48L3A+DQotPHA+PGltZyBhbHQ9ImZpZzE0IiBzcmM9ImltYWdlcy9maWcxNC5qcGciIC8+PC9wPg0KLTxwPldoZW4geW91IGNvbXBsZXRlIHRoaXMgcGFnZSBwcmVzcyB0aGUgIk5leHQiIGJ1dHRvbiB0byBnbyB0bw0KLWZpbmFsIHBhZ2UuPC9wPg0KLTxwPjxzdHJvbmc+U2VydmljZSBBcmNoaXZlIChzdWIgd2l6YXJkcyAxICZhbXA7IDIpIFBhZ2UNCi03Ojwvc3Ryb25nPjwvcD4NCi08cD48aW1nIGFsdD0iZmlnMTUiIHNyYz0iaW1hZ2VzL2ZpZzE1LmpwZyIgLz48L3A+DQotPHA+TmV4dCBzdGVwIGlzIHRvIHNlbGVjdCBvdXRwdXQgZmlsZSBsb2NhdGlvbiwgdGhlIGxvY2F0aW9uIGluDQotd2hpY2ggYXJjaGl2ZSBmaWxlIHNob3VsZCBiZSBjcmVhdGVkLjwvcD4NCi08cD5JbiB0aGUgIkFyY2hpdmUgTmFtZSIgdGV4dCBib3gsIHR5cGUgdGhlIG5hbWUgb2YgdGhlIGFyY2hpdmUNCi1maWxlIHlvdSB3YW50IHRvIHBsYWNlLiBUaGlzIG5hbWUgd2lsbCBmaW5hbGx5IGJlY29tZSB0aGUgc2VydmljZQ0KLWdyb3VwIG5hbWUuPC9wPg0KLTxwPjxzdHJvbmc+Tm90ZSA6PC9zdHJvbmc+IERvIG5vdCBpbmNsdWRlIGZpbGUgZXh0ZW5zaW9uIHdoZW4geW91DQotdHlwZSBhcmNoaXZlIG5hbWUuIFN5c3RlbSB3aWxsIGdlbmVyYXRlIHRoYXQgZm9yIHlvdS48L3A+DQotPHA+V2hlbiB5b3UgYXJlIGRvbmUsIGNsaWNrIHRoZSAiRmluaXNoIiBidXR0b24uIElmIGV2ZXJ5dGhpbmcgaGFzDQotYmVlbiBkb25lIHN1Y2Nlc3NmdWxseSB5b3Ugd2lsbCBzZWUgZm9sbG93aW5nIG1lc3NhZ2UuPC9wPg0KLTxwPjxpbWcgYWx0PSJmaWcxNiIgc3JjPSJpbWFnZXMvZmlnMTYuanBnIiAvPjwvcD4NCi08cD48c3Ryb25nPjxlbT5Ob3RlOiBQYWdlcyA2ICZhbXA7IDcgb2Ygc3ViIHdpemFyZHMgMSAmYW1wOyAyIGFyZQ0KLWNvbW1vbiB0byBzdWIgd2l6YXJkIDMgZnJvbSBpdHMgcGFnZSAzIG9ud2FyZHMuPC9lbT48L3N0cm9uZz48L3A+DQotPGEgbmFtZT0ic3ViMyIgaWQ9InN1YjMiPjwvYT4NCi08aDM+U3ViIFdpemFyZCAzPC9oMz4NCi08cD5JbiB0aGUgY2FzZSB3aGVyZSBzZXJ2aWNlcy54bWwgaXMgYWxyZWFkeSBhdmFpbGFibGUsIHRoZSBzdGVwcw0KLWFyZSBhcyBmb2xsb3dzOjwvcD4NCi08cD48c3Ryb25nPlNlcnZpY2UgQXJjaGl2ZSAoc3ViIHdpemFyZCAzKSBQYWdlIDM6PC9zdHJvbmc+PC9wPg0KLTxwPjxpbWcgYWx0PSJmaWcxNyIgc3JjPSJpbWFnZXMvZmlnMTcuanBnIiAvPjwvcD4NCi08cD5UaGlzIHBhZ2UgYWxsb3dzIHlvdSB0byBzZWxlY3QgYm90aCBsb2NhdGlvbiBvZiBzZXJ2aWNlcy54bWwgYW5kDQotdGhlIGxvY2F0aW9uIG9mIHNlcnZpY2UgY2xhc3NlcyBkaXJlY3RvcnkuIENsaWNrIG9uIHRoZSAiU2VsZWN0Ig0KLWJ1dHRvbnMgYW5kIGJyb3dzZSB0aGUgZmlsZSBzeXN0ZW0gdG8gZmluZCByZXF1aXJlZCBkb2N1bWVudCBhbmQNCi1sb2NhdGlvbi48L3A+DQotPHA+Q2xpY2sgb24gdGhlICJOZXh0IiBidXR0b24gd2hpY2ggd2lsbCB0YWtlIHlvdSB0byBhIHBhZ2Ugd2hpY2gNCi1hbGxvd3MgeW91IHRvIGFkZCB0aGlyZCBwYXJ0eSBsaWJyYXJpZXMgYW5kIFdTREwncyBpbiB0aGUgc2FtZQ0KLW1hbm5lciBhcyAiU3ViIFdpemFyZCAxICZhbXA7IFN1YiBXaXphcmQgMiIgc2VjdGlvbidzIDxhIGhyZWY9DQotIiNOb3RlIj5QYWdlIDYgLSBFZGl0IHNlcnZpY2UgZGVzY3JpcHRvcnM8L2E+LiBOb3RlIHRoYXQgU3ViIFdpemFyZA0KLTMgZnJvbSB0aGlzIHBvaW50IHRha2VzIHRoZSBzYW1lIHBhZ2VzIGFzIDYgdG8gNyBvZiBTdWIgV2l6YXJkcyAxDQotJmFtcDsgMi48L3A+DQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9pZGVhL2ltYWdlcy9maWcxLmpwZyBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2lkZWEvaW1hZ2VzL2ZpZzEuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwY2I4OTFhLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2lkZWEvaW1hZ2VzL2ZpZzEuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvaWRlYS9pbWFnZXMvZmlnMTAuanBnIGIvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvaWRlYS9pbWFnZXMvZmlnMTAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTI4MWRiLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2lkZWEvaW1hZ2VzL2ZpZzEwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2lkZWEvaW1hZ2VzL2ZpZzExLmpwZyBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2lkZWEvaW1hZ2VzL2ZpZzExLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdjMTA3Ni4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9pZGVhL2ltYWdlcy9maWcxMS5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9pZGVhL2ltYWdlcy9maWcxMi5qcGcgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9pZGVhL2ltYWdlcy9maWcxMi5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmNDI0MzAuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvaWRlYS9pbWFnZXMvZmlnMTIuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvaWRlYS9pbWFnZXMvZmlnMTMuanBnIGIvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvaWRlYS9pbWFnZXMvZmlnMTMuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2E1MDAzLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2lkZWEvaW1hZ2VzL2ZpZzEzLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2lkZWEvaW1hZ2VzL2ZpZzE0LmpwZyBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2lkZWEvaW1hZ2VzL2ZpZzE0LmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA0OTMxMi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9pZGVhL2ltYWdlcy9maWcxNC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9pZGVhL2ltYWdlcy9maWcxNS5qcGcgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9pZGVhL2ltYWdlcy9maWcxNS5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1MDQ5NTAuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvaWRlYS9pbWFnZXMvZmlnMTUuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvaWRlYS9pbWFnZXMvZmlnMTYuanBnIGIvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvaWRlYS9pbWFnZXMvZmlnMTYuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmNmY2NjLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2lkZWEvaW1hZ2VzL2ZpZzE2LmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2lkZWEvaW1hZ2VzL2ZpZzE3LmpwZyBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2lkZWEvaW1hZ2VzL2ZpZzE3LmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmUzYzUxOS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9pZGVhL2ltYWdlcy9maWcxNy5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9pZGVhL2ltYWdlcy9maWcxOC5qcGcgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9pZGVhL2ltYWdlcy9maWcxOC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzYmU0NGIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvaWRlYS9pbWFnZXMvZmlnMTguanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvaWRlYS9pbWFnZXMvZmlnMTkuanBnIGIvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvaWRlYS9pbWFnZXMvZmlnMTkuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjA2ZGI5NS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9pZGVhL2ltYWdlcy9maWcxOS5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9pZGVhL2ltYWdlcy9maWcyLmpwZyBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2lkZWEvaW1hZ2VzL2ZpZzIuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTljN2I1Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2lkZWEvaW1hZ2VzL2ZpZzIuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvaWRlYS9pbWFnZXMvZmlnMy5qcGcgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9pZGVhL2ltYWdlcy9maWczLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjljZWZkMS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9pZGVhL2ltYWdlcy9maWczLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2lkZWEvaW1hZ2VzL2ZpZzQuanBnIGIvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvaWRlYS9pbWFnZXMvZmlnNC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmNzU3MTQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvaWRlYS9pbWFnZXMvZmlnNC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9pZGVhL2ltYWdlcy9maWc1LmpwZyBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2lkZWEvaW1hZ2VzL2ZpZzUuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmI1NTg1Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2lkZWEvaW1hZ2VzL2ZpZzUuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvaWRlYS9pbWFnZXMvZmlnNi5qcGcgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9pZGVhL2ltYWdlcy9maWc2LmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmZkNGI1NS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9pZGVhL2ltYWdlcy9maWc2LmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2lkZWEvaW1hZ2VzL2ZpZzcuanBnIGIvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvaWRlYS9pbWFnZXMvZmlnNy5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhODE5MGUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvaWRlYS9pbWFnZXMvZmlnNy5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9pZGVhL2ltYWdlcy9maWc4LmpwZyBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2lkZWEvaW1hZ2VzL2ZpZzguanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTMwZTlhLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2lkZWEvaW1hZ2VzL2ZpZzguanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvaWRlYS9pbWFnZXMvaWRlYS1pY29ucy5qcGcgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9pZGVhL2ltYWdlcy9pZGVhLWljb25zLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGNmMWI2Yy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9pZGVhL2ltYWdlcy9pZGVhLWljb25zLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2lkZWEvaW1hZ2VzL2lkZWEtcG9wdXAuanBnIGIvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvaWRlYS9pbWFnZXMvaWRlYS1wb3B1cC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4MTdlMzIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvaWRlYS9pbWFnZXMvaWRlYS1wb3B1cC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9tYXZlbi1wbHVnaW5zL21hdmVuLWFhci1wbHVnaW4ueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvbWF2ZW4tcGx1Z2lucy9tYXZlbi1hYXItcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdmYmM4Mi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9tYXZlbi1wbHVnaW5zL21hdmVuLWFhci1wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjA0ICswLDAgQEAKLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iDQotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4NCi08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+DQotPGhlYWQ+DQotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PQ0KLSJIVE1MIFRpZHkgZm9yIFdpbmRvd3MgKHZlcnMgMTQgSnVuZSAyMDA3KSwgc2VlIHd3dy53My5vcmciIC8+DQotPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSIiIC8+DQotPHRpdGxlPk1hdmVuMiBBQVIgUGx1Zy1pbiBHdWlkZTwvdGl0bGU+DQotPGxpbmsgaHJlZj0iLi4vLi4vLi4vY3NzL2F4aXMtZG9jcy5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0NCi0idGV4dC9jc3MiIG1lZGlhPSJhbGwiIC8+DQotPC9oZWFkPg0KLTxib2R5Pg0KLTxoMT5NYXZlbjIgQUFSIFBsdWctaW4gR3VpZGU8L2gxPg0KLTxoMj5JbnRyb2R1Y3Rpb248L2gyPg0KLTxwPlRoaXMgcGx1Z2luIGdlbmVyYXRlcyBhbiBBeGlzIDIgc2VydmljZSBmaWxlIChBQVIgZmlsZSkuPC9wPg0KLTxwPjxhIGhyZWY9Imh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL3Rvb2xzL2luZGV4Lmh0bWwiIHRhcmdldD0NCi0iX2JsYW5rIj5bRG93bmxvYWQgUGx1Z2luIFRvb2xdPC9hPjwvcD4NCi08aDI+R29hbHM8L2gyPg0KLTxwPlRoZSBBQVIgcGx1Z2luIGFsbG93cyB0aGUgcGFja2FnaW5nIG9mIGFuIEF4aXMgMiBzZXJ2aWNlIGFhciBpbg0KLTMgZGlmZmVyZW50IG1vZGVzOjwvcD4NCi08b2w+DQotPGxpPjxiPmF4aXMyLWFhcjphYXI8L2I+OiBnZW5lcmF0ZXMgdGhlIGFhciBhcnRpZmFjdDwvbGk+DQotPGxpPjxiPmF4aXMyLWFhcjppbnBsYWNlPC9iPiA6IHBhY2thZ2UgdGhlIGFhciBpbiB0aGUgc291cmNlIHRyZWU8L2xpPg0KLTxsaT48Yj5heGlzMi1hYXI6ZXhwbG9kZWQ8L2I+IDogcGFja2FnZSBhbiBleHBsb2RlZCBhYXIgYXBwbGljYXRpb248L2xpPg0KLTwvb2w+DQotPHA+RWFjaCBtb2RlIGlzIG1hdGVyaWFsaXplZCBieSBhIGdvYWwuIEZvciBpbnN0YW5jZSwgdG8gZ2VuZXJhdGUNCi1hbiBleHBsb2RlZCBhYXIgZnJvbSB0aGUgY3VycmVudCBwcm9qZWN0LCBvbmUgd291bGQgdHlwZTwvcD4NCi08cHJlPg0KLW12biBheGlzMi1hYXI6ZXhwbG9kZWQNCi08L3ByZT4NCi08aDI+Q29uZmlndXJhdGlvbjwvaDI+DQotPHA+QWxsIEFBUiBwbHVnaW4gZ29hbHMgdGFrZXMgdGhlIGZvbGxvd2luZyBjb25maWd1cmF0aW9uDQotcGFyYW1ldGVycyBhcyBpbnB1dDo8L3A+DQotPHRhYmxlIGJvcmRlcj0iMiI+DQotPHRib2R5Pg0KLTx0cj4NCi08dGQ+PHN0cm9uZz5QYXJhbWV0ZXIgTmFtZTwvc3Ryb25nPjwvdGQ+DQotPHRkPjxzdHJvbmc+RGVmYXVsdCBWYWx1ZTwvc3Ryb25nPjwvdGQ+DQotPHRkPjxzdHJvbmc+RGVzY3JpcHRpb248L3N0cm9uZz48L3RkPg0KLTwvdHI+DQotPHRyPg0KLTx0ZD5hYXJEaXJlY3Rvcnk8L3RkPg0KLTx0ZD4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9hYXI8L3RkPg0KLTx0ZD5EaXJlY3Rvcnkgd2hlcmUgdGhlIGFhciBmaWxlIGlzIGJ1aWx0PC90ZD4NCi08L3RyPg0KLTx0cj4NCi08dGQ+Y2xhc3Nlc0RpcmVjdG9yeTwvdGQ+DQotPHRkPiR7cHJvamVjdC5idWlsZC5vdXRwdXREaXJlY3Rvcnl9PC90ZD4NCi08dGQ+RGlyZWN0b3J5IHdpdGggY29tcGlsZWQgY2xhc3NlcyBhbmQgcmVzb3VyY2VzPC90ZD4NCi08L3RyPg0KLTx0cj4NCi08dGQ+ZmlsZVNldHM8L3RkPg0KLTx0ZD48L3RkPg0KLTx0ZD5BZGRpdGlvbmFsIGZpbGUgc2V0cywgd2hpY2ggYXJlIGJlaW5nIGFkZGVkIHRvIHRoZSBhcmNoaXZlLiBTZWUNCi0iPGEgaHJlZj0iI2ZpbGVfc2V0cyI+RmlsZSBTZXRzPC9hPiIgYmVsb3cgZm9yIGFuIGV4YW1wbGU8L3RkPg0KLTwvdHI+DQotPHRyPg0KLTx0ZD5zZXJ2aWNlc1htbEZpbGU8L3RkPg0KLTx0ZD48L3RkPg0KLTx0ZD5Mb2NhdGlvbiBvZiB0aGUgc2VydmljZXMueG1sIGZpbGUuIEJ5IGRlZmF1bHQsIGl0IGlzIGFzc3VtZWQNCi10aGF0IHRoZSBmaWxlIGlzIGFscmVhZHkgcHJlc2VudCBpbiBjbGFzc2VzRGlyZWN0b3J5L01FVEEtSU5GIGFuZA0KLW5vIHNwZWNpYWwgcHJvY2Vzc2luZyBpcyByZXF1aXJlZDwvdGQ+DQotPC90cj4NCi08dHI+DQotPHRkPndzZGxGaWxlPC90ZD4NCi08dGQ+PC90ZD4NCi08dGQ+TG9jYXRpb24gb2YgdGhlIFdTREwgZmlsZS4gQnkgZGVmYXVsdCwgaXQgaXMgYXNzdW1lZCB0aGF0IHRoZQ0KLWZpbGUgaXMgYWxyZWFkeSBwcmVzZW50IGluIGNsYXNzZXNEaXJlY3RvcnkvTUVUQS1JTkYgYW5kIG5vIHNwZWNpYWwNCi1wcm9jZXNzaW5nIGlzIHJlcXVpcmVkPC90ZD4NCi08L3RyPg0KLTx0cj4NCi08dGQ+d3NkbEZpbGVOYW1lPC90ZD4NCi08dGQ+c2VydmljZS53c2RsPC90ZD4NCi08dGQ+TmFtZSwgdG8gd2hpY2ggdGhlIFdTREwgZmlsZSBzaG91bGQgYmUgbWFwcGVkPC90ZD4NCi08L3RyPg0KLTwvdGJvZHk+DQotPC90YWJsZT4NCi08aDM+VGhlIGFhciBHb2FsPC9oMz4NCi08cD5UaGUgYWFyIGdvYWwgYWxsb3dzIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBwYXJhbWV0ZXJzOjwvcD4NCi08dGFibGUgYm9yZGVyPSIyIj4NCi08dGJvZHk+DQotPHRyPg0KLTx0ZD48c3Ryb25nPlBhcmFtZXRlciBOYW1lPC9zdHJvbmc+PC90ZD4NCi08dGQ+PHN0cm9uZz5EZWZhdWx0IFZhbHVlPC9zdHJvbmc+PC90ZD4NCi08dGQ+PHN0cm9uZz5EZXNjcmlwdGlvbjwvc3Ryb25nPjwvdGQ+DQotPC90cj4NCi08dHI+DQotPHRkPm91dHB1dERpcmVjdG9yeTwvdGQ+DQotPHRkPiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9PC90ZD4NCi08dGQ+RGlyZWN0b3J5IHdoZXJlIHRvIGdlbmVyYXRlIHRoZSBBQVIgZmlsZTwvdGQ+DQotPC90cj4NCi08dHI+DQotPHRkPmFhck5hbWU8L3RkPg0KLTx0ZD4ke3Byb2plY3QuYnVpbGQuZmluYWxOYW1lfTwvdGQ+DQotPHRkPlRoZSBnZW5lcmF0ZWQgQUFSIGZpbGVzIG5hbWU8L3RkPg0KLTwvdHI+DQotPHRyPg0KLTx0ZD5hcmNoaXZlPC90ZD4NCi08dGQ+PC90ZD4NCi08dGQ+QSBNYXZlbiBhcmNoaXZlIGNvbmZpZ3VyYXRpb24uIFRoaXMgYWxsb3dzLCBmb3IgZXhhbXBsZSwgdG8NCi1jb25maWd1cmUgdGhlIE1BTklGRVNULk1GIGZpbGU8L3RkPg0KLTwvdHI+DQotPHRyPg0KLTx0ZD5jbGFzc2lmaWVyPC90ZD4NCi08dGQ+PC90ZD4NCi08dGQ+QSBjbGFzc2lmaWVyLCB3aGljaCBzaG91bGQgYmUgYWRkZWQgdG8gdGhlIGdlbmVyYXRlZCBBQVIgZmlsZXMNCi1uYW1lLiBTZXR0aW5nIHRoaXMgcGFyYW1ldGVyIGhhcyB0aGUgc2lkZSBlZmZlY3QsIHRoYXQgdGhlIGFydGlmYWN0DQotaXMgdHJlYXRlZCBhcyBhbiBhdHRhY2htZW50IGFuZCBub3QgYXMgdGhlIHByb2plY3RzIHByaW1hcnkNCi1hcnRpZmFjdDwvdGQ+DQotPC90cj4NCi08dHI+DQotPHRkPnByaW1hcnlBcnRpZmFjdDwvdGQ+DQotPHRkPnRydWU8L3RkPg0KLTx0ZD5TZXR0aW5nIHRoaXMgcHJvcGVydHkgdG8gZmFsc2UgZGlzYWJsZXMgaW5zdGFsbGF0aW9uIG9yDQotZGVwbG95bWVudCBvZiB0aGUgYXJ0aWZhY3QgYXMgdGhlIHByb2plY3RzIHByaW1hcnkgYXJ0aWZhY3Q8L3RkPg0KLTwvdHI+DQotPC90Ym9keT4NCi08L3RhYmxlPg0KLTxhIG5hbWU9ImZpbGVfc2V0cyIgaWQ9ImZpbGVfc2V0cyI+PC9hPg0KLTxoMz5GaWxlIFNldHM8L2gzPg0KLTxwPkFkZGl0aW9uYWwgZmlsZSBzZXRzIG1heSBiZSBjb25maWd1cmVkIGZvciBpbmNsdXNpb24gaW50byB0aGUNCi1BQVIgZmlsZS4gQSBmaWxlIHNldCBsb29rcyBhcyBmb2xsb3dzOjwvcD4NCi08cHJlPg0KLSAgDQotICAmbHQ7ZmlsZVNldHMmZ3Q7DQotICAgICZsdDtmaWxlU2V0Jmd0Ow0KLSAgICAgICZsdDtkaXJlY3RvcnkmZ3Q7c3JjL2Fhci9maWxlcyZsdDsvZGlyZWN0b3J5Jmd0Ow0KLSAgICAgICZsdDtvdXRwdXREaXJlY3RvcnkmZ3Q7TUVUQS1JTkYvZG9jcyZsdDsvb3V0cHV0RGlyZWN0b3J5Jmd0Ow0KLSAgICAgICZsdDtpbmNsdWRlcyZndDsNCi0gICAgICAgICZsdDtpbmNsdWRlJmd0OyoqLyouaHRtbCZsdDsvaW5jbHVkZSZndDsNCi0NCi0gICAgICAmbHQ7L2luY2x1ZGVzJmd0Ow0KLSAgICAmbHQ7L2ZpbGVTZXQmZ3Q7DQotICAgICZsdDtmaWxlU2V0Jmd0Ow0KLSAgICAgICZsdDtkaXJlY3RvcnkmZ3Q7c3JjL2Fhci9maWxlcyZsdDsvZGlyZWN0b3J5Jmd0Ow0KLSAgICAgICZsdDtvdXRwdXREaXJlY3RvcnkmZ3Q7TUVUQS1JTkYvZXRjJmx0Oy9vdXRwdXREaXJlY3RvcnkmZ3Q7DQotDQotICAgICAgJmx0O2V4Y2x1ZGVzJmd0Ow0KLSAgICAgICAgJmx0O2V4Y2x1ZGUmZ3Q7KiovKi5odG1sJmx0Oy9leGNsdWRlJmd0Ow0KLSAgICAgICZsdDsvZXhjbHVkZXMmZ3Q7DQotICAgICZsdDsvZmlsZVNldCZndDsNCi0gICZsdDsvZmlsZVNldHMmZ3Q7DQotICANCi08L3ByZT4NCi08cD5UaGUgZXhhbXBsZSBzcGVjaWZpZXMsIHRoYXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBkaXJlY3RvcnkNCi1zcmMvYWFyL2ZpbGVzIHNoYWxsIGJlIGFkZGVkIHRvIHRoZSBBQVIgZmlsZS4gSFRNTCBmaWxlcyB3aWxsIGdvDQotaW50byBNRVRBLUlORi9kb2NzLCBhbGwgb3RoZXIgZmlsZXMgdG8gTUVUQS1JTkYvZXRjLjwvcD4NCi08cD5BIGZpbGUgc2V0IGlzIGNvbmZpZ3VyZWQgdGhyb3VnaCB0aGUgZm9sbG93aW5nIGNvbmZpZ3VyYXRpb24NCi1wYXJhbWV0ZXJzOjwvcD4NCi08dGFibGUgYm9yZGVyPSIyIj4NCi08dGJvZHk+DQotPHRyPg0KLTx0ZD48c3Ryb25nPlBhcmFtZXRlciBOYW1lPC9zdHJvbmc+PC90ZD4NCi08dGQ+PHN0cm9uZz5EZXNjcmlwdGlvbjwvc3Ryb25nPjwvdGQ+DQotPC90cj4NCi08dHI+DQotPHRkPmRpcmVjdG9yeTwvdGQ+DQotPHRkPlRoZSBkaXJlY3RvcnksIGZyb20gd2hpY2ggdG8gcmVhZCB0aGUgZmlsZSBzZXQuIFRoaXMgcGFyYW1ldGVyDQotaXMgcmVxdWlyZWQ8L3RkPg0KLTwvdHI+DQotPHRyPg0KLTx0ZD5vdXRwdXREaXJlY3Rvcnk8L3RkPg0KLTx0ZD5UaGUgdGFyZ2V0IGRpcmVjdG9yeSB3aXRoaW4gdGhlIEFBUiBmaWxlLiBEZWZhdWx0cyB0byB0aGUgQUFSDQotZmlsZXMgcm9vdCBkaXJlY3Rvcnk8L3RkPg0KLTwvdHI+DQotPHRyPg0KLTx0ZD5pbmNsdWRlczwvdGQ+DQotPHRkPkNvbmZpZ3VyZXMgdGhlIHNldCBvZiBmaWxlcywgd2hpY2ggc2hhbGwgYmUgaW5jbHVkZWQgaW50byB0aGUNCi1BQVIgZmlsZS4gRGVmYXVsdHMgdG8gKiovKjwvdGQ+DQotPC90cj4NCi08dHI+DQotPHRkPmV4Y2x1ZGVzPC90ZD4NCi08dGQ+Q29uZmlndXJlcyBhIHNldCBvZiBmaWxlcywgd2hpY2ggc2hhbGwgYmUgZXhjbHVkZWQgZnJvbSB0aGUNCi1maWxlIHNldC4gRGVmYXVsdHMgdG8gdGhlIE1hdmVuIGRlZmF1bHQgZXhjbHVkZXMgKCoqLyp+LA0KLSoqL2N2cy8qKi8qLCAqKi8uc3ZuLyoqLyosIGV0Yy4pPC90ZD4NCi08L3RyPg0KLTx0cj4NCi08dGQ+c2tpcERlZmF1bHRFeGNsdWRlczwvdGQ+DQotPHRkPklmIHRoaXMgcGFyYW1ldGVyIGlzIHNldCB0byB0cnVlLCB0aGVuIG5vIGRlZmF1bHQgZXhjbHVkZXMgYXJlDQotYmVpbmcgdXNlZDwvdGQ+DQotPC90cj4NCi08L3Rib2R5Pg0KLTwvdGFibGU+DQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9tYXZlbi1wbHVnaW5zL21hdmVuLWphdmEyd3NkbC1wbHVnaW4ueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvbWF2ZW4tcGx1Z2lucy9tYXZlbi1qYXZhMndzZGwtcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA2NjRkZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9tYXZlbi1wbHVnaW5zL21hdmVuLWphdmEyd3NkbC1wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iDQotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4NCi08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+DQotPGhlYWQ+DQotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PQ0KLSJIVE1MIFRpZHkgZm9yIFdpbmRvd3MgKHZlcnMgMTQgSnVuZSAyMDA3KSwgc2VlIHd3dy53My5vcmciIC8+DQotPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSIiIC8+DQotPHRpdGxlPk1hdmVuMiBKYXZhMldTREwgUGx1Zy1pbiBHdWlkZTwvdGl0bGU+DQotPGxpbmsgaHJlZj0iLi4vLi4vLi4vY3NzL2F4aXMtZG9jcy5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0NCi0idGV4dC9jc3MiIG1lZGlhPSJhbGwiIC8+DQotPC9oZWFkPg0KLTxib2R5Pg0KLTxoMT5NYXZlbjIgSmF2YTJXU0RMIFBsdWctaW4gR3VpZGU8L2gxPg0KLTxoMj5JbnRyb2R1Y3Rpb248L2gyPg0KLTxwPlRoaXMgcGx1Z2luIHRha2VzIGFzIGlucHV0IGEgSmF2YSBjbGFzcyBhbmQgZ2VuZXJhdGVzIGEgV1NETCwNCi13aGljaCBkZXNjcmliZXMgYSBXZWIgc2VydmljZSBmb3IgaW52b2tpbmcgdGhlIGNsYXNzZXMgbWV0aG9kcy48L3A+DQotPHA+PGEgaHJlZj0iaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvdG9vbHMvaW5kZXguaHRtbCIgdGFyZ2V0PQ0KLSJfYmxhbmsiPltEb3dubG9hZCBQbHVnaW4gVG9vbF08L2E+PC9wPg0KLTxoMj5Hb2FsczwvaDI+DQotPHA+VGhlIEphdmEyV1NETCBwbHVnaW4gb2ZmZXJzIGEgc2luZ2xlIGdvYWw6PC9wPg0KLTx1bD4NCi08bGk+amF2YTJ3c2RsIChkZWZhdWx0KTogUmVhZHMgYSBqYXZhIGNsYXNzIGFuZCBnZW5lcmF0ZXMgYSBXU0RMDQotZm9yIGludm9raW5nIHRoZSBjbGFzc2VzIG1ldGhvZHMgYXMgYSBXZWIgc2VydmljZS48L2xpPg0KLTwvdWw+DQotPHA+VG8gcnVuIHRoZSBwbHVnaW4sIGFkZCB0aGUgZm9sbG93aW5nIHNlY3Rpb24gdG8geW91ciA8YSBocmVmPQ0KLSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9ndWlkZXMvaW50cm9kdWN0aW9uL2ludHJvZHVjdGlvbi10by10aGUtcG9tLmh0bWwiPg0KLVBPTTwvYT4gKFByb2plY3QgT2JqZWN0IE1vZGVsKTo8L3A+DQotPHByZT4NCi0gICZsdDtidWlsZCZndDsNCi0gICAgJmx0O3BsdWdpbnMmZ3Q7DQotICAgICAgJmx0O3BsdWdpbiZndDsNCi0gICAgICAgICZsdDtncm91cElkJmd0O29yZy5hcGFjaGUuYXhpczIubWF2ZW4yJmx0Oy9ncm91cElkJmd0Ow0KLSAgICAgICAgJmx0O2FydGlmYWN0SWQmZ3Q7YXhpczItamF2YTJ3c2RsLW1hdmVuLXBsdWdpbiZsdDsvYXJ0aWZhY3RJZCZndDsNCi0gICAgICAgICZsdDtjb25maWd1cmF0aW9uJmd0Ow0KLSAgICAgICAgICAmbHQ7Y2xhc3NOYW1lJmd0O2NvbS5mb28ubXlzZXJ2aWNlLk15SGFuZGxlciZsdDsvY2xhc3NOYW1lJmd0Ow0KLSAgICAgICAgJmx0Oy9jb25maWd1cmF0aW9uJmd0Ow0KLSAgICAgICAgJmx0O2V4ZWN1dGlvbnMmZ3Q7DQotICAgICAgICAgICZsdDtleGVjdXRpb24mZ3Q7DQotICAgICAgICAgICAgJmx0O2dvYWxzJmd0Ow0KLSAgICAgICAgICAgICAgJmx0O2dvYWwmZ3Q7amF2YTJ3c2RsJmx0Oy9nb2FsJmd0Ow0KLSAgICAgICAgICAgICZsdDsvZ29hbHMmZ3Q7DQotICAgICAgICAgICZsdDsvZXhlY3V0aW9uJmd0Ow0KLSAgICAgICAgICZsdDsvZXhlY3V0aW9ucyZndDsNCi0gICAgICAmbHQ7L3BsdWdpbiZndDsNCi0gICAgJmx0Oy9wbHVnaW5zJmd0Ow0KLSAgJmx0Oy9idWlsZCZndDsNCi0gIA0KLTwvcHJlPg0KLTxwPlRoZSBwbHVnaW4gd2lsbCBiZSBpbnZva2VkIGF1dG9tYXRpY2FsbHkgaW4gdGhlDQotZ2VuZXJhdGUtcmVzb3VyY2VzIHBoYXNlLiBZb3UgY2FuIGFsc28gaW52b2tlIGl0IGRpcmVjdGx5IGZyb20gdGhlDQotY29tbWFuZCBsaW5lIGJ5IHJ1bm5pbmcgdGhlIGNvbW1hbmQ6PC9wPg0KLTxwcmU+DQotbXZuIGF4aXMyLWphdmEyd3NkbDpqYXZhMndzZGwNCi08L3ByZT4NCi08aDM+VGhlIEphdmEyV1NETCBHb2FsPC9oMz4NCi08cD5CeSBkZWZhdWx0LCB0aGUgcGx1Z2luIHJlYWRzIHRoZSBnaXZlbiBKYXZhIGNsYXNzIGFuZCBjcmVhdGVzIGENCi1maWxlDQotPHN0cm9uZz50YXJnZXQvZ2VuZXJhdGVkLXJlc291cmNlcy9qYXZhMndzZGwvc2VydmljZS53c2RsDQotPC9zdHJvbmc+Lg0KLVRoZSBKYXZhIGNsYXNzIGlzIGdpdmVuIGJ5IHRoZSBjb25maWd1cmF0aW9uIGVsZW1lbnQNCi08c3Ryb25nPmNsYXNzTmFtZTwvc3Ryb25nPiBhYm92ZS48L3A+DQotPGgyPkNvbmZpZ3VyYXRpb248L2gyPg0KLTxwPlRoZSBKYXZhMldTREwgZ29hbCB0YWtlcyB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnMgYXMgaW5wdXQuIEFsbA0KLXBhcmFtZXRlcnMgY2FuIGJlIHNldCBmcm9tIHRoZSBjb21tYW5kIGxpbmUgYnkgdXNpbmcgcHJvcGVydGllcy4NCi1Gb3IgZXhhbXBsZSwgdGhlIHBhcmFtZXRlciAiY2xhc3NOYW1lIiBtYXkgYmUgc2V0IHVzaW5nIHRoZQ0KLXByb3BlcnR5ICJheGlzMi5qYXZhMndzZGwuY2xhc3NOYW1lIi4gSWYgdGhlIHBhcmFtZXRlciBpc24ndCBzZXQNCi12aWEgcHJvcGVydHkgb3IgaW4gdGhlIFBPTSwgdGhlbiBhIGRlZmF1bHQgdmFsdWUgYXBwbGllcy48L3A+DQotPHRhYmxlIGJvcmRlcj0iMiI+DQotPHRib2R5Pg0KLTx0cj4NCi08dGQ+PHN0cm9uZz5QYXJhbWV0ZXIgbmFtZTwvc3Ryb25nPjwvdGQ+DQotPHRkPjxzdHJvbmc+Q29tbWFuZCBsaW5lIHByb3BlcnR5PC9zdHJvbmc+PC90ZD4NCi08dGQ+PHN0cm9uZz5EZXNjcmlwdGlvbjwvc3Ryb25nPjwvdGQ+DQotPHRkPjxzdHJvbmc+RGVmYXVsdCB2YWx1ZTwvc3Ryb25nPjwvdGQ+DQotPC90cj4NCi08dHI+DQotPHRkPmNsYXNzTmFtZTwvdGQ+DQotPHRkPiR7YXhpczIuamF2YTJ3c2RsLmNsYXNzTmFtZX08L3RkPg0KLTx0ZD5GdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgY2xhc3MsIHdoaWNoIGlzIGJlaW5nIHJlYWQgYW5kDQotdHJhbnNmb3JtZWQgaW50byBhIFdTREw8L3RkPg0KLTx0ZD48L3RkPg0KLTwvdHI+DQotPHRyPg0KLTx0ZD5vdXRwdXRGaWxlTmFtZTwvdGQ+DQotPHRkPiR7YXhpczIuamF2YTJ3c2RsLm91dHB1dEZpbGVOYW1lfTwvdGQ+DQotPHRkPlBhdGggb2YgdGhlIGdlbmVyYXRlZCBzZXJ2aWNlIGZpbGUuPC90ZD4NCi08dGQ+PC90ZD4NCi08L3RyPg0KLTx0cj4NCi08dGQ+c2NoZW1hVGFyZ2V0TmFtZXNwYWNlPC90ZD4NCi08dGQ+JHtheGlzMi5qYXZhMndzZGwuc2NoZW1hVGFyZ2V0TmFtZXNwYWNlfTwvdGQ+DQotPHRkPlRhcmdldCBuYW1lc3BhY2Ugb2YgdGhlIGdlbmVyYXRlZCBzY2hlbWEuPC90ZD4NCi08dGQ+PC90ZD4NCi08L3RyPg0KLTx0cj4NCi08dGQ+c2NoZW1hVGFyZ2V0TmFtZXNwYWNlUHJlZml4PC90ZD4NCi08dGQ+JHtheGlzMi5qYXZhMndzZGwuc2NoZW1hVGFyZ2V0TmFtZXNwYWNlUHJlZml4fTwvdGQ+DQotPHRkPlByZWZpeCwgd2hpY2ggaXMgYmVpbmcgYXNzb2NpYXRlZCB3aXRoIHRoZSBzY2hlbWFzIHRhcmdldA0KLW5hbWVzcGFjZS48L3RkPg0KLTx0ZD48L3RkPg0KLTwvdHI+DQotPHRyPg0KLTx0ZD5zZXJ2aWNlTmFtZTwvdGQ+DQotPHRkPiR7YXhpczIuamF2YTJ3c2RsLnNlcnZpY2VOYW1lfTwvdGQ+DQotPHRkPk5hbWUgb2YgdGhlIGdlbmVyYXRlZCBXZWIgc2VydmljZS48L3RkPg0KLTx0ZD5VbnF1YWxpZmllZCBuYW1lIG9mIHRoZSBpbnB1dCBjbGFzcy48L3RkPg0KLTwvdHI+DQotPHRyPg0KLTx0ZD50YXJnZXROYW1lc3BhY2U8L3RkPg0KLTx0ZD4ke2F4aXMyLmphdmEyd3NkbC50YXJnZXROYW1lc3BhY2V9PC90ZD4NCi08dGQ+VGFyZ2V0IG5hbWVzcGFjZSBvZiB0aGUgZ2VuZXJhdGVkIFdTREw8L3RkPg0KLTx0ZD5EZWZhdWx0IG5hbWVzcGFjZTwvdGQ+DQotPC90cj4NCi08dHI+DQotPHRkPnRhcmdldE5hbWVzcGFjZVByZWZpeDwvdGQ+DQotPHRkPiR7YXhpczIuamF2YTJ3c2RsLnRhcmdldE5hbWVzcGFjZVByZWZpeH08L3RkPg0KLTx0ZD5QcmVmaXgsIHdoaWNoIGlzIGJlaW5nIGFzc29jaWF0ZWQgd2l0aCB0aGUgdGFyZ2V0DQotbmFtZXNwYWNlPC90ZD4NCi08dGQ+PC90ZD4NCi08L3RyPg0KLTwvdGJvZHk+DQotPC90YWJsZT4NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L21hdmVuLXBsdWdpbnMvbWF2ZW4td3NkbDJjb2RlLXBsdWdpbi54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9tYXZlbi1wbHVnaW5zL21hdmVuLXdzZGwyY29kZS1wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTZiYThjLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L21hdmVuLXBsdWdpbnMvbWF2ZW4td3NkbDJjb2RlLXBsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMjUgKzAsMCBAQAotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiINCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPg0KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4NCi08aGVhZD4NCi08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9DQotIkhUTUwgVGlkeSBmb3IgV2luZG93cyAodmVycyAxNCBKdW5lIDIwMDcpLCBzZWUgd3d3LnczLm9yZyIgLz4NCi08bWV0YSBodHRwLWVxdWl2PSJjb250ZW50LXR5cGUiIGNvbnRlbnQ9IiIgLz4NCi08dGl0bGU+TWF2ZW4yIFdTREwyQ29kZSBQbHVnLWluIEd1aWRlPC90aXRsZT4NCi08bGluayBocmVmPSIuLi8uLi8uLi9jc3MvYXhpcy1kb2NzLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPQ0KLSJ0ZXh0L2NzcyIgbWVkaWE9ImFsbCIgLz4NCi08L2hlYWQ+DQotPGJvZHk+DQotPGgxPk1hdmVuMiBXU0RMMkNvZGUgUGx1Zy1pbiBHdWlkZTwvaDE+DQotPGgyPkludHJvZHVjdGlvbjwvaDI+DQotPHA+VGhpcyBwbHVnaW4gdGFrZXMgYXMgaW5wdXQgYSBXU0RMIGFuZCBnZW5lcmF0ZXMgY2xpZW50IGFuZA0KLXNlcnZlciBzdHVicyBmb3IgY2FsbGluZyBvciBpbXBsZW1lbnRpbmcgYSBXZWIgc2VydmljZSBtYXRjaGluZyB0aGUNCi1XU0RMLjwvcD4NCi08cD48YSBocmVmPSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi90b29scy9pbmRleC5odG1sIiB0YXJnZXQ9DQotIl9ibGFuayI+W0Rvd25sb2FkIFBsdWdpbiBUb29sXTwvYT48L3A+DQotPGgyPkdvYWxzPC9oMj4NCi08cD5UaGUgV1NEbDJDb2RlIG9mZmVycyBhIHNpbmdsZSBnb2FsOjwvcD4NCi08dWw+DQotPGxpPndzZGwyY29kZSAoZGVmYXVsdCk6IFJlYWRzIHRoZSBXU0RMIGFuZCBnZW5lcmF0ZXMgY29kZS48L2xpPg0KLTwvdWw+DQotPHA+VG8gcnVuIHRoZSBwbHVnaW4sIGFkZCB0aGUgZm9sbG93aW5nIHNlY3Rpb24gdG8geW91ciA8YSBocmVmPQ0KLSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9ndWlkZXMvaW50cm9kdWN0aW9uL2ludHJvZHVjdGlvbi10by10aGUtcG9tLmh0bWwiPg0KLVBPTTwvYT4gKFByb2plY3QgT2JqZWN0IE1vZGVsKTo8L3A+DQotPHByZT4NCi0gICAgJmx0O2J1aWxkJmd0Ow0KLSAgICAJJmx0O3BsdWdpbnMmZ3Q7DQotICAgIAkJJmx0O3BsdWdpbiZndDsNCi0gICAgCQkJJmx0O2dyb3VwSWQmZ3Q7b3JnLmFwYWNoZS5heGlzMiZsdDsvZ3JvdXBJZCZndDsNCi0gICAgCQkJJmx0O2FydGlmYWN0SWQmZ3Q7YXhpczItd3NkbDJjb2RlLW1hdmVuLXBsdWdpbiZsdDsvYXJ0aWZhY3RJZCZndDsNCi0JCQkJJmx0O3ZlcnNpb24mZ3Q7MS40Jmx0Oy92ZXJzaW9uJmd0Ow0KLSAgICAJCQkmbHQ7ZXhlY3V0aW9ucyZndDsNCi0gICAgCQkJCSZsdDtleGVjdXRpb24mZ3Q7DQotICAgIAkJCQkJJmx0O2dvYWxzJmd0Ow0KLSAgICAJCQkJCQkmbHQ7Z29hbCZndDt3c2RsMmNvZGUmbHQ7L2dvYWwmZ3Q7DQotICAgIAkJCQkJJmx0Oy9nb2FscyZndDsNCi0gICAgCQkJCSZsdDtjb25maWd1cmF0aW9uJmd0Ow0KLQkJCQkJJmx0O3BhY2thZ2VOYW1lJmd0O2NvbS5mb28ubXlzZXJ2aWNlJmx0Oy9wYWNrYWdlTmFtZSZndDsNCi0JCQkJCSZsdDt3c2RsRmlsZSZndDtzcmMvbWFpbi93c2RsL215c2VydmljZS53c2RsJmx0Oy93c2RsRmlsZSZndDsNCi0JCQkJCSZsdDtkYXRhYmluZGluZ05hbWUmZ3Q7eG1sYmVhbnMmbHQ7L2RhdGFiaW5kaW5nTmFtZSZndDsNCi0JCQkJJmx0Oy9jb25maWd1cmF0aW9uJmd0Ow0KLQkJCQkmbHQ7L2V4ZWN1dGlvbiZndDsNCi0JCQkmbHQ7L2V4ZWN1dGlvbnMmZ3Q7DQotICAgIAkJJmx0Oy9wbHVnaW4mZ3Q7DQotICAgIAkmbHQ7L3BsdWdpbnMmZ3Q7DQotICAgICZsdDsvYnVpbGQmZ3Q7DQotPC9wcmU+DQotQWxzbyBwbGVhc2UgYWRkIGF4aXMyIGphcnMgYXMgYSBkZXBlbmRlbmN5IA0KLTxwcmUgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+DQotICAgICZsdDtkZXBlbmRlbmN5Jmd0Ow0KLSAgICAgICAgICAmbHQ7Z3JvdXBJZCZndDtvcmcuYXBhY2hlLmF4aXMyJmx0Oy9ncm91cElkJmd0Ow0KLSAgICAgICAgICAmbHQ7YXJ0aWZhY3RJZCZndDtheGlzMiZsdDsvYXJ0aWZhY3RJZCZndDsNCi0gICAgICAgICAgJmx0O3ZlcnNpb24mZ3Q7MS40Jmx0Oy92ZXJzaW9uJmd0Ow0KLSAgICAmbHQ7L2RlcGVuZGVuY3kmZ3Q7DQotPC9wcmU+DQotICAgIA0KLTxwPlRoZSBwbHVnaW4gd2lsbCBiZSBpbnZva2VkIGF1dG9tYXRpY2FsbHkgaW4gdGhlIGdlbmVyYXRlLXNvdXJjZXMNCi1waGFzZS4gWW91IGNhbiBhbHNvIGludm9rZSBpdCBkaXJlY3RseSBmcm9tIHRoZSBjb21tYW5kIGxpbmUgYnkNCi1ydW5uaW5nIHRoZSBjb21tYW5kPC9wPg0KLTxwcmU+DQotbXZuIGF4aXMyLXdzZGwyY29kZTp3c2RsMmNvZGUNCi08L3ByZT4NCi08aDM+VGhlIFdTREwyQ29kZSBHb2FsPC9oMz4NCi08cD5CeSBkZWZhdWx0LCB0aGUgcGx1Z2luIHJlYWRzIHRoZSBmaWxlDQotPHN0cm9uZz5zcmMvbWFpbi9heGlzMi9zZXJ2aWNlLndzZGw8L3N0cm9uZz4uIFNvdXJjZXMgZm9yIHRoZSBKYXZhDQotcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UgYW5kIHRoZSBBREIgZGF0YSBiaW5kaW5nIGFyZSBnZW5lcmF0ZWQgaW50bw0KLTxzdHJvbmc+dGFyZ2V0L2dlbmVyYXRlZC1zb3VyY2VzL2F4aXMyL3dzZGwyY29kZTwvc3Ryb25nPi4gTm90ZSB0aGUNCi1jb25maWd1cmF0aW9uIGVsZW1lbnQgPHN0cm9uZz5wYWNrYWdlTmFtZTwvc3Ryb25nPiBhYm92ZSwgd2hpY2gNCi1zZXRzIHRoZSBwYWNrYWdlIG5hbWUsIHRodXMgYSBzdWJkaXJlY3RvcnkuPC9wPg0KLTxoMj5Db25maWd1cmF0aW9uPC9oMj4NCi08cD5UaGUgV1NETDJDb2RlIGdvYWwgdGFrZXMgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzIGFzIGlucHV0LiBBbGwNCi1wYXJhbWV0ZXJzIGNhbiBiZSBzZXQgZnJvbSB0aGUgY29tbWFuZCBsaW5lIGJ5IHVzaW5nIHByb3BlcnRpZXMuDQotRm9yIGV4YW1wbGUsIHRoZSBwYXJhbWV0ZXIgImdlbmVyYXRlU2VydmVyU2lkZSIgbWF5IGJlIHNldCB1c2luZw0KLXRoZSBwcm9wZXJ0eSAiYXhpczIud3NkbDJjb2RlLmdlbmVyYXRlU2VydmVyU2lkZSIuIElmIHRoZSBwYXJhbWV0ZXINCi1pc24ndCBzZXQgdmlhIHByb3BlcnR5IG9yIGluIHRoZSBQT00sIHRoZW4gYSBkZWZhdWx0IHZhbHVlDQotYXBwbGllcy48L3A+DQotPHRhYmxlIGJvcmRlcj0iMiI+DQotPHRib2R5Pg0KLTx0ciBhbGlnbj0iY2VudGVyIj4NCi08dGQ+PHN0cm9uZz5QYXJhbWV0ZXIgTmFtZTwvc3Ryb25nPjwvdGQ+DQotPHRkPjxzdHJvbmc+Q29tbWFuZCBMaW5lIFByb3BlcnR5PC9zdHJvbmc+PC90ZD4NCi08dGQ+PHN0cm9uZz5EZXNjcmlwdGlvbjwvc3Ryb25nPjwvdGQ+DQotPHRkPjxzdHJvbmc+RGVmYXVsdCBWYWx1ZTwvc3Ryb25nPjwvdGQ+DQotPC90cj4NCi08dHI+DQotPHRkPmRhdGFiaW5kaW5nTmFtZTwvdGQ+DQotPHRkPiR7YXhpczIud3NkbDJjb2RlLmRhdGFiaW5kaW5nTmFtZX08L3RkPg0KLTx0ZD5EYXRhIGJpbmRpbmcgZnJhbWV3b3JrLCB3aGljaCBpcyBiZWluZyB1c2VkIGJ5IHRoZSBnZW5lcmF0ZWQNCi1zb3VyY2VzLjwvdGQ+DQotPHRkPmFkYjwvdGQ+DQotPC90cj4NCi08dHI+DQotPHRkPmdlbmVyYXRlQWxsQ2xhc3NlczwvdGQ+DQotPHRkPiR7YXhpczIud3NkbDJjb2RlLmdlbmVyYXRlQWxsQ2xhc3Nlc308L3RkPg0KLTx0ZD5XaGV0aGVyIHRvIGdlbmVyYXRlIHNpbXBseSBhbGwgY2xhc3Nlcy4gVGhpcyBpcyBvbmx5IHZhbGlkIGluDQotY29uanVuY3Rpb24gd2l0aCAiZ2VuZXJhdGVTZXJ2ZXJTaWRlIi48L3RkPg0KLTx0ZD5mYWxzZTwvdGQ+DQotPC90cj4NCi08dHI+DQotPHRkPmdlbmVyYXRlU2VydmVyU2lkZTwvdGQ+DQotPHRkPiR7YXhpczIud3NkbDJjb2RlLmdlbmVyYXRlU2VydmVyU2lkZX08L3RkPg0KLTx0ZD5XaGV0aGVyIHNlcnZlciBzaWRlIHNvdXJjZXMgYXJlIGJlaW5nIGdlbmVyYXRlZC48L3RkPg0KLTx0ZD5mYWxzZTwvdGQ+DQotPC90cj4NCi08dHI+DQotPHRkPmdlbmVyYXRlU2VydmVyU2lkZUludGVyZmFjZTwvdGQ+DQotPHRkPiR7YXhpczIud3NkbDJjb2RlLmdlbmVyYXRlU2VydmVyU2lkZUludGVyZmFjZX08L3RkPg0KLTx0ZD5XaGV0aGVyIHRvIGdlbmVyYXRlIHRoZSBzZXJ2ZXIgc2lkZSBpbnRlcmZhY2UuPC90ZD4NCi08dGQ+ZmFsc2U8L3RkPg0KLTwvdHI+DQotPHRyPg0KLTx0ZD5nZW5lcmF0ZVNlcnZpY2VzWG1sPC90ZD4NCi08dGQ+JHtheGlzMi53c2RsMmNvZGUuZ2VuZXJhdGVTZXJ2aWNlc1htbH08L3RkPg0KLTx0ZD5XaGV0aGVyIGEgInNlcnZpY2VzLnhtbCIgZmlsZSBpcyBiZWluZyBnZW5lcmF0ZWQuPC90ZD4NCi08dGQ+ZmFsc2U8L3RkPg0KLTwvdHI+DQotPHRyPg0KLTx0ZD5nZW5lcmF0ZVRlc3RjYXNlPC90ZD4NCi08dGQ+JHtheGlzMi53c2RsMmNvZGUuZ2VuZXJhdGVUZXN0Q2FzZX08L3RkPg0KLTx0ZD5XaGV0aGVyIGEgdGVzdCBjYXNlIGlzIGJlaW5nIGdlbmVyYXRlZC48L3RkPg0KLTx0ZD5mYWxzZTwvdGQ+DQotPC90cj4NCi08dHI+DQotPHRkPmxhbmd1YWdlPC90ZD4NCi08dGQ+JHtheGlzMi53c2RsMmNvZGUubGFuZ3VhZ2V9PC90ZD4NCi08dGQ+UHJvZ3JhbW1pbmcgbGFuZ3VhZ2Ugb2YgdGhlIGdlbmVyYXRlZCBzb3VyY2VzLjwvdGQ+DQotPHRkPmphdmE8L3RkPg0KLTwvdHI+DQotPHRyPg0KLTx0ZD5uYW1lc3BhY2VUb1BhY2thZ2VzPC90ZD4NCi08dGQ+JHtheGlzMi53c2RsMmNvZGUubmFtZXNwYWNlVG9QYWNrYWdlc308L3RkPg0KLTx0ZD5NYXAgb2YgbmFtZXNwYWNlIFVSSSB0byBwYWNrYWdlcyBpbiB0aGUgZm9ybWF0DQotdXJpMT1wYWNrYWdlMSx1cmkyPXBhY2thZ2UyLC4uLiBVc2luZyB0aGlzIHBhcmFtZXRlciBpcw0KLWRpc2NvdXJhZ2VkLiBJbiBnZW5lcmFsLCB5b3Ugc2hvdWxkIHVzZSB0aGUgbmFtZXNwYWNlVXJpcw0KLXBhcmFtZXRlci4gSG93ZXZlciwgdGhlIGxhdHRlciBjYW5ub3QgYmUgc2V0IG9uIHRoZSBjb21tYW5kDQotbGluZS48L3RkPg0KLTx0ZD48L3RkPg0KLTwvdHI+DQotPHRyPg0KLTx0ZD5uYW1lc3BhY2VVUklzPC90ZD4NCi08dGQ+PC90ZD4NCi08dGQ+TWFwIG9mIG5hbWVzcGFjZSBVUkkgdG8gcGFja2FnZXMuIEV4YW1wbGU6DQotJmx0O25hbWVzcGFjZVVSSXMmZ3Q7ICZsdDtuYW1lc3BhY2VVUkkmZ3Q7DQotJmx0O3VyaSZndDt1cmkxJmx0Oy91cmkmZ3Q7ICZsdDtwYWNrYWdlTmFtZSZndDtwYWNrYWdlMSZsdDsvcGFja2FnZU5hbWUmZ3Q7DQotJmx0Oy9uYW1lc3BhY2VVUkkmZ3Q7IC4uLi4uLi4uICZsdDsvbmFtZXNwYWNlVVJJJmd0OzwvdGQ+DQotPHRkPjwvdGQ+DQotPC90cj4NCi08dHI+DQotPHRkPm91dHB1dERpcmVjdG9yeTwvdGQ+DQotPHRkPiR7YXhpczIud3NkbDJjb2RlLnRhcmdldH08L3RkPg0KLTx0ZD5UYXJnZXQgZGlyZWN0b3J5LCB3aGVyZSBzb3VyY2VzIGFyZSBiZWluZw0KLXRhcmdldC9nZW5lcmF0ZWQtc291cmNlcy9heGlzMi93c2RsMmNvZGUgZ2VuZXJhdGVkLjwvdGQ+DQotPHRkPjwvdGQ+DQotPC90cj4NCi08dHI+DQotPHRkPnBhY2thZ2VOYW1lPC90ZD4NCi08dGQ+JHtheGlzMi53c2RsMmNvZGUucGFja2FnZX08L3RkPg0KLTx0ZD5QYWNrYWdlIG5hbWUgb2YgdGhlIGdlbmVyYXRlZCBzb3VyY2VzLjwvdGQ+DQotPHRkPjwvdGQ+DQotPC90cj4NCi08dHI+DQotPHRkPnBvcnROYW1lPC90ZD4NCi08dGQ+JHtheGlzMi53c2RsMmNvZGUucG9ydE5hbWV9PC90ZD4NCi08dGQ+UG9ydCBuYW1lLCBmb3Igd2hpY2ggc291cmNlcyBhcmUgYmVpbmcgZ2VuZXJhdGVkLiBCeSBkZWZhdWx0LA0KLXNvdXJjZXMgYXJlIGdlbmVyYXRlZCBmb3IgYSByYW5kb21seSBwaWNrZWQgcG9ydC48L3RkPg0KLTx0ZD48L3RkPg0KLTwvdHI+DQotICAgIDx0cj4NCi0gICAgPHRkPmFsbFBvcnRzPC90ZD4NCi0gICAgPHRkPiR7YXhpczIud3NkbDJjb2RlLmFsbFBvcnRzfTwvdGQ+DQotICAgIDx0ZD5TZXQgdGhpcyB0byB0cnVlIHRvIGdlbmVyYXRlIGNvZGUgZm9yIGFsbCBwb3J0cy48L3RkPg0KLSAgICA8dGQ+ZmFsc2U8L3RkPg0KLSAgICA8L3RyPg0KLTx0cj4NCi08dGQ+c2VydmljZU5hbWU8L3RkPg0KLTx0ZD4ke2F4aXMyLndzZGwyY29kZS5zZXJ2aWNlTmFtZX08L3RkPg0KLTx0ZD5TZXJ2aWNlIG5hbWUsIGZvciB3aGljaCBzb3VyY2VzIGFyZSBiZWluZyBnZW5lcmF0ZWQuIEJ5DQotZGVmYXVsdCwgc291cmNlcyBhcmUgZ2VuZXJhdGVkIGZvciBhbGwgc2VydmljZXMuPC90ZD4NCi08dGQ+PC90ZD4NCi08L3RyPg0KLTx0cj4NCi08dGQ+c3luY01vZGU8L3RkPg0KLTx0ZD4ke2F4aXMyLndzZGwyY29kZS5zeW5jTW9kZX08L3RkPg0KLTx0ZD5TeW5jIG1vZGUsIGZvciB3aGljaCBzb3VyY2VzIGFyZSBiZWluZyBnZW5lcmF0ZWQ7IGVpdGhlciBvZg0KLSJzeW5jIiwgImFzeW5jIiwgb3IgImJvdGgiIChkZWZhdWx0KS48L3RkPg0KLTx0ZD5ib3RoPC90ZD4NCi08L3RyPg0KLTx0cj4NCi08dGQ+dW5wYWNrQ2xhc3NlczwvdGQ+DQotPHRkPiR7YXhpczIud3NkbDJjb2RlLnVucGFja0NsYXNzZXN9PC90ZD4NCi08dGQ+V2hldGhlciB0byB1bnBhY2sgY2xhc3Nlcy48L3RkPg0KLTx0ZD48L3RkPg0KLTwvdHI+DQotPHRyPg0KLTx0ZD53c2RsRmlsZTwvdGQ+DQotPHRkPiR7YXhpczIud3NkbDJjb2RlLndzZGx9PC90ZD4NCi08dGQ+TG9jYXRpb24gb2YgdGhlIFdTREwgZmlsZSwgd2hpY2ggaXMgcmVhZCBhcyBpbnB1dDwvdGQ+DQotPHRkPnNyYy9tYWluL2F4aXMyL3NlcnZpY2Uud3NkbDwvdGQ+DQotPC90cj4NCi08L3Rib2R5Pg0KLTwvdGFibGU+DQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzL2Rvd25sb2FkLmNnaSBiL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvZG93bmxvYWQuY2dpCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTlmOGQzLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvZG93bmxvYWQuY2dpCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIyEvYmluL3NoCi0KLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIyAKLSMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jIAotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jIFdyYXBwZXIgc2NyaXB0IGFyb3VuZCBtaXJyb3JzLmNnaSBzY3JpcHQKLSMgKHdlIG11c3QgY2hhbmdlIHRvIHRoYXQgZGlyZWN0b3J5IGluIG9yZGVyIGZvciBweXRob24gdG8gcGljayB1cCB0aGUKLSMgIHB5dGhvbiBpbmNsdWRlcyBjb3JyZWN0bHkpCi1jZCAvd3d3L3d3dy5hcGFjaGUub3JnL2R5bi9taXJyb3JzCi0vd3d3L3d3dy5hcGFjaGUub3JnL2R5bi9taXJyb3JzL21pcnJvcnMuY2dpICQqClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy9pbmRleC54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzL2luZGV4LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmUzNWUxYi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzL2luZGV4LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJpc28tODg1OS0xIj8+DQotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjEvL0VOIg0KLSAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMTEvRFREL3hodG1sMTEuZHRkIj4NCi08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+DQotCTxoZWFkPg0KLQkJPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJIVE1MIFRpZHkgZm9yIFdpbmRvd3MgKHZlcnMgMTQgSnVuZSAyMDA3KSwgc2VlIHd3dy53My5vcmciLz4NCi0JCTxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIi8+DQotCQk8dGl0bGU+QXhpczIgVG9vbHMgRG93bmxvYWQgUGFnZTwvdGl0bGU+DQotCQk8bGluayBocmVmPSIuLi9jc3MvYXhpcy1kb2NzLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgbWVkaWE9ImFsbCIvPg0KLQk8L2hlYWQ+DQotCTxib2R5IHhtbDpsYW5nPSJlbiI+DQotCQk8aDE+QXBhY2hlIEF4aXMyIFRvb2xzPC9oMT4NCi0JCTxwPkF4aXMyIGlzIGJ1bmRsZWQgd2l0aCBhIHNldCBvZiB0b29scyBpbiBvcmRlciB0byBtYWtlIHVzZXJzJw0KLWxpZmUgZWFzaWVyLiBUaGlzIHBhZ2UgaXMgbWFpbnRhaW5lZCB0byBrZWVwIHRyYWNrIG9mIHRoZSB0b29scw0KLXN1cHBvcnRlZCBieSBBeGlzMi48L3A+DQotCQk8dGFibGUgYm9yZGVyPSIyIj4NCi0JCQk8dGJvZHk+DQotCQkJCTx0cj4NCi0JCQkJCTx0aCBzY29wZT0iY29sIj5OYW1lPC90aD4NCi0JCQkJCTx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+DQotCQkJCQk8dGggc2NvcGU9ImNvbCI+VmVyc2lvbjwvdGg+DQotCQkJCQk8dGggc2NvcGU9ImNvbCI+Q29tcGF0aWJsZSBBeGlzMiB2ZXJzaW9uPC90aD4NCi0JCQkJCTx0aCBzY29wZT0iY29sIj5Eb3dubG9hZHM8L3RoPg0KLQkJCQkJPHRoIHNjb3BlPSJjb2wiPkNvbW1lbnRzPC90aD4NCi0JCQkJPC90cj4NCi0JCQkJPHRyPg0KLQkJCQkJPHRkPg0KLQkJCQkJCTxhIGhyZWY9Ii4uL3Rvb2xzLzFfNC9Db2RlZ2VuVG9vbFJlZmVyZW5jZS5odG1sIj5Db2RlIEdlbmVyYXRvcg0KLVRvb2wtIENvbW1hbmQgTGluZSAmYW1wOyBBbnQgVGFzazwvYT4NCi0JCQkJCTwvdGQ+DQotCQkJCQk8dGQ+VG9vbCBjb25zaXN0cyBvZiBhIGNvbW1hbmQgbGluZSB2ZXJzaW9uIGFuZCBhbiBBbnQgVGFzay4gSXQgaXMNCi1pbXBsZW1lbnRlZCBieSB0aGUgV1NETDJDb2RlIGNsYXNzIGFuZCBXU0RMMkphdmEgY2xhc3MuIE9uZSBjYW4NCi1jaG9vc2UgdG8gcnVuIHRoZSBtYWluIGNsYXNzZXMgZGlyZWN0bHkgb3IgdXNlIG9uZSBvZiB0aGUgc2NyaXB0cw0KLXRvIHJ1biB0aGUgV1NETDJDb2RlIGFuZCBXU0RMMkphdmEgYXBwcm9wcmlhdGVseS48L3RkPg0KLQkJCQkJPHRkPjEuNDwvdGQ+DQotCQkJCQk8dGQ+MS40PC90ZD4NCi0JCQkJCTx0ZC8+DQotCQkJCQk8dGQ+VGhpcyB0b29sIGlzIGJ1bmRsZWQgd2l0aCB0aGUgQXhpczIgU3RhbmRhcmQgQmluYXJ5DQotRGlzdHJpYnV0aW9uIGZvdW5kIDxhIGhyZWY9Imh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL2Rvd25sb2FkLmNnaSI+aGVyZTwvYT4NCi0JCQkJCTwvdGQ+DQotCQkJCTwvdHI+DQotCQkJCTx0cj4NCi0JCQkJCTx0ZD4NCi0JCQkJCQk8YSBocmVmPSIuLi90b29scy8xXzQvZWNsaXBzZS9zZXJ2aWNlYXJjaGl2ZXItcGx1Z2luLmh0bWwiPlNlcnZpY2UgQXJjaGl2ZQ0KLVdpemFyZCAtIEVjbGlwc2UgUGx1Zy1pbjwvYT4NCi0JCQkJCTwvdGQ+DQotCQkJCQk8dGQ+QXMgcGFydCBvZiB0aGUgQXhpczIgdG9vbCBzZXQsIHRoZSBzZXJ2aWNlIGFyY2hpdmUgZ2VuZXJhdG9yIGlzDQotYW4gaW1wb3J0YW50IHRvb2wgdGhhdCBhbGxvd3MgdGhlIGdlbmVyYXRpb24gb2Ygc2VydmljZSBhcmNoaXZlcw0KLSgiYWFyIiBmaWxlIG9yIGEgImphciIgZmlsZXMpIHRoYXQgY2FuIGJlIGRlcGxveWVkIGFzIGEgV2ViDQotc2VydmljZXMgdG8gdGhlIEF4aXMyLjwvdGQ+DQotCQkJCQk8dGQ+MS40PC90ZD4NCi0JCQkJCTx0ZD4xLjQ8L3RkPg0KLQkJCQkJPHRkPg0KLQkJCQkJCTxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9keW4vbWlycm9ycy9taXJyb3JzLmNnaS93cy9heGlzMi90b29scy8xXzQvYXhpczItZWNsaXBzZS1zZXJ2aWNlLWFyY2hpdmVyLXdpemFyZC0xLjQuemlwIiB0aXRsZT0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2R5bi9taXJyb3JzL21pcnJvcnMuY2dpL3dzL2F4aXMyL3Rvb2xzLzFfNC9heGlzMi1lY2xpcHNlLXNlcnZpY2UtYXJjaGl2ZXItd2l6YXJkLTEuNC56aXAiPg0KLXppcDwvYT4NCi0JCQkJCQk8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZHluL21pcnJvcnMvbWlycm9ycy5jZ2kvd3MvYXhpczIvdG9vbHMvMV80L2F4aXMyLWVjbGlwc2Utc2VydmljZS1hcmNoaXZlci13aXphcmQtMS40LnppcC5tZDUiIHRpdGxlPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZHluL21pcnJvcnMvbWlycm9ycy5jZ2kvd3MvYXhpczIvdG9vbHMvMV80L2F4aXMyLWVjbGlwc2Utc2VydmljZS1hcmNoaXZlci13aXphcmQtMS40LnppcC5tZDUiPg0KLU1ENTwvYT4NCi0JCQkJCQk8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZHluL21pcnJvcnMvbWlycm9ycy5jZ2kvd3MvYXhpczIvdG9vbHMvMV80L2F4aXMyLWVjbGlwc2Utc2VydmljZS1hcmNoaXZlci13aXphcmQtMS40LnppcC5hc2MiIHRpdGxlPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZHluL21pcnJvcnMvbWlycm9ycy5jZ2kvd3MvYXhpczIvdG9vbHMvMV80L2F4aXMyLWVjbGlwc2Utc2VydmljZS1hcmNoaXZlci13aXphcmQtMS40LnppcC5hc2MiPg0KLVBHUDwvYT4NCi0JCQkJCTwvdGQ+DQotCQkJCQk8dGQvPg0KLQkJCQk8L3RyPg0KLQkJCQk8dHI+DQotCQkJCQk8dGQ+DQotCQkJCQkJPGEgaHJlZj0iLi4vdG9vbHMvMV80L2VjbGlwc2Uvd3NkbDJqYXZhLXBsdWdpbi5odG1sIj5Db2RlDQotR2VuZXJhdG9yIFdpemFyZCAtIEVjbGlwc2UgUGx1Zy1pbjwvYT4NCi0JCQkJCTwvdGQ+DQotCQkJCQk8dGQ+QXhpczIgY29kZSBnZW5lcmF0b3IgY29tZXMgYnVpbHQtaW4gd2l0aCBhbiA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+ZWNsaXBzZTwvYT4gcGx1Zy1pbi4gVGhpcyBjYW4gYmUgdXNlZCB0bw0KLWdlbmVyYXRlIGEgV1NETCBmaWxlIGZyb20gYSBqYXZhIGNsYXNzIChKYXZhMldTREwpIGFuZC9vciBhIGphdmENCi1jbGFzcyBmaWxlIGZyb20gYSBXU0RMIChXU0RMMkphdmEpPC90ZD4NCi0JCQkJCTx0ZD4xLjQ8L3RkPg0KLQkJCQkJPHRkPjEuNDwvdGQ+DQotCQkJCQk8dGQ+DQotCQkJCQkJPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2R5bi9taXJyb3JzL21pcnJvcnMuY2dpL3dzL2F4aXMyL3Rvb2xzLzFfNC9heGlzMi1lY2xpcHNlLWNvZGVnZW4td2l6YXJkLTEuNC56aXAiIHRpdGxlPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZHluL21pcnJvcnMvbWlycm9ycy5jZ2kvd3MvYXhpczIvdG9vbHMvMV80L2F4aXMyLWVjbGlwc2UtY29kZWdlbi13aXphcmQtMS40LnppcCI+DQotemlwPC9hPg0KLQkJCQkJCTxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9keW4vbWlycm9ycy9taXJyb3JzLmNnaS93cy9heGlzMi90b29scy8xXzQvYXhpczItZWNsaXBzZS1jb2RlZ2VuLXdpemFyZC0xLjQuemlwLm1kNSIgdGl0bGU9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9keW4vbWlycm9ycy9taXJyb3JzLmNnaS93cy9heGlzMi90b29scy8xXzQvYXhpczItZWNsaXBzZS1jb2RlZ2VuLXdpemFyZC0xLjQuemlwLm1kNSI+DQotTUQ1PC9hPg0KLQkJCQkJCTxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9keW4vbWlycm9ycy9taXJyb3JzLmNnaS93cy9heGlzMi90b29scy8xXzQvYXhpczItZWNsaXBzZS1jb2RlZ2VuLXdpemFyZC0xLjQuemlwLmFzYyIgdGl0bGU9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9keW4vbWlycm9ycy9taXJyb3JzLmNnaS93cy9heGlzMi90b29scy8xXzQvYXhpczItZWNsaXBzZS1jb2RlZ2VuLXdpemFyZC0xLjQuemlwLmFzYyI+DQotUEdQPC9hPg0KLQkJCQkJPC90ZD4NCi0JCQkJCTx0ZC8+DQotCQkJCTwvdHI+DQotCQkJCTx0cj4NCi0JCQkJCTx0ZD4NCi0JCQkJCQk8YSBocmVmPSIuLi90b29scy8xXzQvaWRlYS9JZGVhX3BsdWctaW5fdXNlcmd1aWRlLmh0bWwiPkNvZGUNCi1HZW5lcmF0b3IgV2l6YXJkIC0gSW50ZWxsaUogSURFQSBQbHVnLWluPC9hPg0KLQkJCQkJPC90ZD4NCi0JCQkJCTx0ZD5Vc2luZyB0aGlzIHRvb2wgb25lIGNhbiBjcmVhdGUgc2VydmljZSBhcmNoaXZlcyB0aGF0IGNhbiBiZQ0KLWRlcGxveWVkIGFzIGEgV2ViIHNlcnZpY2VzIHRvIHRoZSBBeGlzMiwgYW5kIGFsc28gZ2VuZXJhdGUgYSBqYXZhDQotY2xhc3MgZmlsZSBmcm9tIGEgV1NETCBmaWxlIChXU0RMMkphdmEpLjwvdGQ+DQotCQkJCQk8dGQ+MS40PC90ZD4NCi0JCQkJCTx0ZD4xLjQ8L3RkPg0KLQkJCQkJPHRkPg0KLQkJCQkJCTxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9keW4vbWlycm9ycy9taXJyb3JzLmNnaS93cy9heGlzMi90b29scy8xXzQvYXhpczItaWRlYS1wbHVnaW4tMS40LnppcCIgdGl0bGU9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9keW4vbWlycm9ycy9taXJyb3JzLmNnaS93cy9heGlzMi90b29scy8xXzQvYXhpczItaWRlYS1wbHVnaW4tMS40LnppcCI+DQotemlwPC9hPg0KLQkJCQkJCTxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9keW4vbWlycm9ycy9taXJyb3JzLmNnaS93cy9heGlzMi90b29scy8xXzQvYXhpczItaWRlYS1wbHVnaW4tMS40LnppcC5tZDUiIHRpdGxlPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZHluL21pcnJvcnMvbWlycm9ycy5jZ2kvd3MvYXhpczIvdG9vbHMvMV80L2F4aXMyLWlkZWEtcGx1Z2luLTEuNC56aXAubWQ1Ij4NCi1NRDU8L2E+DQotCQkJCQkJPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2R5bi9taXJyb3JzL21pcnJvcnMuY2dpL3dzL2F4aXMyL3Rvb2xzLzFfNC9heGlzMi1pZGVhLXBsdWdpbi0xLjQuemlwLmFzYyIgdGl0bGU9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9keW4vbWlycm9ycy9taXJyb3JzLmNnaS93cy9heGlzMi90b29scy8xXzQvYXhpczItaWRlYS1wbHVnaW4tMS40LnppcC5hc2MiPg0KLVBHUDwvYT4NCi0JCQkJCTwvdGQ+DQotCQkJCQk8dGQvPg0KLQkJCQk8L3RyPg0KLQkJCQk8dHI+DQotCQkJCQk8dGQ+DQotCQkJCQkJTWF2ZW4yIEFudCBQbHVnLWluDQotCQkJCQk8L3RkPg0KLQkJCQkJPHRkPkFudCBUYXNrIGZvciBXU0RMMkphdmE8L3RkPg0KLQkJCQkJPHRkPjEuNDwvdGQ+DQotCQkJCQk8dGQ+MS40PC90ZD4NCi0JCQkJCTx0ZD4NCi0JCQkJCQk8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZHluL21pcnJvcnMvbWlycm9ycy5jZ2kvd3MvYXhpczIvdG9vbHMvMV80L2F4aXMyLWFudC1wbHVnaW4tMS40LmphciIgdGl0bGU9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9keW4vbWlycm9ycy9taXJyb3JzLmNnaS93cy9heGlzMi90b29scy8xXzQvYXhpczItYW50LXBsdWdpbi0xLjQuamFyIj4NCi1qYXI8L2E+DQotCQkJCQkJPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2R5bi9taXJyb3JzL21pcnJvcnMuY2dpL3dzL2F4aXMyL3Rvb2xzLzFfNC9heGlzMi1hbnQtcGx1Z2luLTEuNC5qYXIubWQ1IiB0aXRsZT0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2R5bi9taXJyb3JzL21pcnJvcnMuY2dpL3dzL2F4aXMyL3Rvb2xzLzFfNC9heGlzMi1hbnQtcGx1Z2luLTEuNC5qYXIubWQ1Ij4NCi1NRDU8L2E+DQotCQkJCQkJPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2R5bi9taXJyb3JzL21pcnJvcnMuY2dpL3dzL2F4aXMyL3Rvb2xzLzFfNC9heGlzMi1hbnQtcGx1Z2luLTEuNC5qYXIuYXNjIiB0aXRsZT0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2R5bi9taXJyb3JzL21pcnJvcnMuY2dpL3dzL2F4aXMyL3Rvb2xzLzFfNC9heGlzMi1hbnQtcGx1Z2luLTEuNC5qYXIuYXNjIj4NCi1QR1A8L2E+DQotCQkJCQk8L3RkPg0KLQkJCQkJPHRkLz4NCi0JCQkJPC90cj4NCi0JCQkJPHRyPg0KLQkJCQkJPHRkPg0KLQkJCQkJCTxhIGhyZWY9Ii4uL3Rvb2xzLzFfNC9tYXZlbi1wbHVnaW5zL21hdmVuLWFhci1wbHVnaW4uaHRtbCI+TWF2ZW4yIEFBUg0KLVBsdWctaW48L2E+DQotCQkJCQk8L3RkPg0KLQkJCQkJPHRkPlRoaXMgcGx1Z2luIGdlbmVyYXRlcyBhbiBBeGlzMiBzZXJ2aWNlIGZpbGUgKEFBUiBmaWxlKS48L3RkPg0KLQkJCQkJPHRkPjEuNDwvdGQ+DQotCQkJCQk8dGQ+MS40PC90ZD4NCi0JCQkJCTx0ZD4NCi0JCQkJCQk8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZHluL21pcnJvcnMvbWlycm9ycy5jZ2kvd3MvYXhpczIvdG9vbHMvMV80L2F4aXMyLWFhci1tYXZlbi1wbHVnaW4tMS40LmphciIgdGl0bGU9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9keW4vbWlycm9ycy9taXJyb3JzLmNnaS93cy9heGlzMi90b29scy8xXzQvYXhpczItYWFyLW1hdmVuLXBsdWdpbi0xLjQuamFyIj4NCi1qYXI8L2E+DQotCQkJCQkJPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2R5bi9taXJyb3JzL21pcnJvcnMuY2dpL3dzL2F4aXMyL3Rvb2xzLzFfNC9heGlzMi1hYXItbWF2ZW4tcGx1Z2luLTEuNC5qYXIubWQ1IiB0aXRsZT0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2R5bi9taXJyb3JzL21pcnJvcnMuY2dpL3dzL2F4aXMyL3Rvb2xzLzFfNC9heGlzMi1hYXItbWF2ZW4tcGx1Z2luLTEuNC5qYXIubWQ1Ij4NCi1NRDU8L2E+DQotCQkJCQkJPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2R5bi9taXJyb3JzL21pcnJvcnMuY2dpL3dzL2F4aXMyL3Rvb2xzLzFfNC9heGlzMi1hYXItbWF2ZW4tcGx1Z2luLTEuNC5qYXIuYXNjIiB0aXRsZT0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2R5bi9taXJyb3JzL21pcnJvcnMuY2dpL3dzL2F4aXMyL3Rvb2xzLzFfNC9heGlzMi1hYXItbWF2ZW4tcGx1Z2luLTEuNC5qYXIuYXNjIj4NCi1QR1A8L2E+DQotCQkJCQk8L3RkPg0KLQkJCQkJPHRkLz4NCi0JCQkJPC90cj4NCi0JCQkJPHRyPg0KLQkJCQkJPHRkPg0KLQkJCQkJCU1hdmVuMiBNQVIgUGx1Zy1pbg0KLQkJCQkJPC90ZD4NCi0JCQkJCTx0ZD5UaGlzIHBsdWdpbiBnZW5lcmF0ZXMgYW4gQXhpczIgbW9kdWxlIGFyY2hpdmUgZmlsZSAoTUFSIGZpbGUpLjwvdGQ+DQotCQkJCQk8dGQ+MS40PC90ZD4NCi0JCQkJCTx0ZD4xLjQ8L3RkPg0KLQkJCQkJPHRkPg0KLQkJCQkJCTxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9keW4vbWlycm9ycy9taXJyb3JzLmNnaS93cy9heGlzMi90b29scy8xXzQvYXhpczItbWFyLW1hdmVuLXBsdWdpbi0xLjQuamFyIiB0aXRsZT0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2R5bi9taXJyb3JzL21pcnJvcnMuY2dpL3dzL2F4aXMyL3Rvb2xzLzFfNC9heGlzMi1tYXItbWF2ZW4tcGx1Z2luLTEuNC5qYXIiPg0KLWphcjwvYT4NCi0JCQkJCQk8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZHluL21pcnJvcnMvbWlycm9ycy5jZ2kvd3MvYXhpczIvdG9vbHMvMV80L2F4aXMyLW1hci1tYXZlbi1wbHVnaW4tMS40Lmphci5tZDUiIHRpdGxlPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZHluL21pcnJvcnMvbWlycm9ycy5jZ2kvd3MvYXhpczIvdG9vbHMvMV80L2F4aXMyLW1hci1tYXZlbi1wbHVnaW4tMS40Lmphci5tZDUiPg0KLU1ENTwvYT4NCi0JCQkJCQk8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZHluL21pcnJvcnMvbWlycm9ycy5jZ2kvd3MvYXhpczIvdG9vbHMvMV80L2F4aXMyLW1hci1tYXZlbi1wbHVnaW4tMS40Lmphci5hc2MiIHRpdGxlPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZHluL21pcnJvcnMvbWlycm9ycy5jZ2kvd3MvYXhpczIvdG9vbHMvMV80L2F4aXMyLW1hci1tYXZlbi1wbHVnaW4tMS40Lmphci5hc2MiPg0KLVBHUDwvYT4NCi0JCQkJCTwvdGQ+DQotCQkJCQk8dGQvPg0KLQkJCQk8L3RyPg0KLQkJCQk8dHI+DQotCQkJCQk8dGQ+DQotCQkJCQkJPGEgaHJlZj0iLi4vdG9vbHMvMV80L21hdmVuLXBsdWdpbnMvbWF2ZW4tamF2YTJ3c2RsLXBsdWdpbi5odG1sIj5NYXZlbjINCi1KYXZhMldTREwgUGx1Zy1pbjwvYT4NCi0JCQkJCTwvdGQ+DQotCQkJCQk8dGQ+DQotCQkJCQkJPHA+VGhpcyBwbHVnaW4gdGFrZXMgYXMgaW5wdXQgYSBKYXZhIGNsYXNzIGFuZCBnZW5lcmF0ZXMgYSBXU0RMLA0KLXdoaWNoIGRlc2NyaWJlcyBhIFdlYiBzZXJ2aWNlIGZvciBpbnZva2luZyB0aGUgY2xhc3NlcyBtZXRob2RzLjwvcD4NCi0JCQkJCTwvdGQ+DQotCQkJCQk8dGQ+MS40PC90ZD4NCi0JCQkJCTx0ZD4xLjQ8L3RkPg0KLQkJCQkJPHRkPg0KLQkJCQkJCTxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9keW4vbWlycm9ycy9taXJyb3JzLmNnaS93cy9heGlzMi90b29scy8xXzQvYXhpczItamF2YTJ3c2RsLW1hdmVuLXBsdWdpbi0xLjQuamFyIiB0aXRsZT0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2R5bi9taXJyb3JzL21pcnJvcnMuY2dpL3dzL2F4aXMyL3Rvb2xzLzFfNC9heGlzMi1qYXZhMndzZGwtbWF2ZW4tcGx1Z2luLTEuNC5qYXIiPg0KLWphcjwvYT4NCi0JCQkJCQk8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZHluL21pcnJvcnMvbWlycm9ycy5jZ2kvd3MvYXhpczIvdG9vbHMvMV80L2F4aXMyLWphdmEyd3NkbC1tYXZlbi1wbHVnaW4tMS40Lmphci5tZDUiIHRpdGxlPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZHluL21pcnJvcnMvbWlycm9ycy5jZ2kvd3MvYXhpczIvdG9vbHMvMV80L2F4aXMyLWphdmEyd3NkbC1tYXZlbi1wbHVnaW4tMS40Lmphci5tZDUiPg0KLU1ENTwvYT4NCi0JCQkJCQk8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZHluL21pcnJvcnMvbWlycm9ycy5jZ2kvd3MvYXhpczIvdG9vbHMvMV80L2F4aXMyLWphdmEyd3NkbC1tYXZlbi1wbHVnaW4tMS40Lmphci5hc2MiIHRpdGxlPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZHluL21pcnJvcnMvbWlycm9ycy5jZ2kvd3MvYXhpczIvdG9vbHMvMV80L2F4aXMyLWphdmEyd3NkbC1tYXZlbi1wbHVnaW4tMS40Lmphci5hc2MiPg0KLVBHUDwvYT4NCi0JCQkJCTwvdGQ+DQotCQkJCQk8dGQvPg0KLQkJCQk8L3RyPg0KLQkJCQk8dHI+DQotCQkJCQk8dGQ+DQotCQkJCQkJPGEgaHJlZj0iLi4vdG9vbHMvMV80L21hdmVuLXBsdWdpbnMvbWF2ZW4td3NkbDJjb2RlLXBsdWdpbi5odG1sIj5NYXZlbjINCi1XU0RMMkNvZGUgUGx1Zy1pbjwvYT4NCi0JCQkJCTwvdGQ+DQotCQkJCQk8dGQ+DQotCQkJCQkJPHA+VGhpcyBwbHVnaW4gdGFrZXMgYXMgaW5wdXQgYSBXU0RMIGFuZCBnZW5lcmF0ZXMgY2xpZW50IGFuZA0KLXNlcnZlciBzdHVicyBmb3IgY2FsbGluZyBvciBpbXBsZW1lbnRpbmcgYSBXZWIgc2VydmljZSBtYXRjaGluZyB0aGUNCi1XU0RMLjwvcD4NCi0JCQkJCTwvdGQ+DQotCQkJCQk8dGQ+MS40PC90ZD4NCi0JCQkJCTx0ZD4xLjQ8L3RkPg0KLQkJCQkJPHRkPg0KLQkJCQkJCTxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9keW4vbWlycm9ycy9taXJyb3JzLmNnaS93cy9heGlzMi90b29scy8xXzQvYXhpczItd3NkbDJjb2RlLW1hdmVuLXBsdWdpbi0xLjQuamFyIiB0aXRsZT0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2R5bi9taXJyb3JzL21pcnJvcnMuY2dpL3dzL2F4aXMyL3Rvb2xzLzFfNC9heGlzMi13c2RsMmNvZGUtbWF2ZW4tcGx1Z2luLTEuNC5qYXIiPg0KLWphcjwvYT4NCi0JCQkJCQk8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZHluL21pcnJvcnMvbWlycm9ycy5jZ2kvd3MvYXhpczIvdG9vbHMvMV80L2F4aXMyLXdzZGwyY29kZS1tYXZlbi1wbHVnaW4tMS40Lmphci5tZDUiIHRpdGxlPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZHluL21pcnJvcnMvbWlycm9ycy5jZ2kvd3MvYXhpczIvdG9vbHMvMV80L2F4aXMyLXdzZGwyY29kZS1tYXZlbi1wbHVnaW4tMS40Lmphci5tZDUiPg0KLU1ENTwvYT4NCi0JCQkJCQk8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZHluL21pcnJvcnMvbWlycm9ycy5jZ2kvd3MvYXhpczIvdG9vbHMvMV80L2F4aXMyLXdzZGwyY29kZS1tYXZlbi1wbHVnaW4tMS40Lmphci5hc2MiIHRpdGxlPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZHluL21pcnJvcnMvbWlycm9ycy5jZ2kvd3MvYXhpczIvdG9vbHMvMV80L2F4aXMyLXdzZGwyY29kZS1tYXZlbi1wbHVnaW4tMS40Lmphci5hc2MiPg0KLVBHUDwvYT4NCi0JCQkJCTwvdGQ+DQotCQkJCQk8dGQvPg0KLQkJCQk8L3RyPg0KLQkJCTwvdGJvZHk+DQotCQk8L3RhYmxlPg0KLQk8L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2Zhc3RpbmZvc2V0L1JFQURNRS50eHQgYi92MS41LjFSQzMvbW9kdWxlcy9mYXN0aW5mb3NldC9SRUFETUUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDk2OTM3Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2Zhc3RpbmZvc2V0L1JFQURNRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLVRoaXMgbW9kdWxlIGhhbmRsZXMgRmFzdCBJbmZvc2V0IChGSSkgYmluYXJ5IHNlcmlhbGl6YXRpb24gZm9yIEF4aXMyLgotCi1UaGUgZmFzdCBpbmZvc2V0IHBhcnNlciB1c2VkIGhlcmUgaXMgZnJvbSBGYXN0IEluZm9zZXQgUHJvamVjdCBAIGh0dHBzOi8vZmkuZGV2LmphdmEubmV0LwotCi1GSSAxLjEueCBpcyB0YXJnZXRlZCB0byBKREsxLjQgYW5kIGlzIHVzZWQgaW4gSkFYLVdTIDIuMCwgSkFYQiAyLjAuCi1GSSAxLjIueCBpcyB0YXJnZXRlZCB0byBKREsxLjUgYW5kIGlzIHVzZWQgaW4gSkFYLVdTIDIuMSwgSkFYQiAyLjEuCi0KLVRoZSBtYXZlbiBzY3JpcHQgYXV0b21hdGljYWxseSBkZXRlY3RzIHRoZSBKREsgdmVyc2lvbiBhbmQgdXNlIHRoZSBhcHByb3ByaWF0ZSBGSSBqYXIgZmlsZS4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2Zhc3RpbmZvc2V0L3BvbS54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9mYXN0aW5mb3NldC9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTQ2ZWE1Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2Zhc3RpbmZvc2V0L3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMzcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+MS41LjE8L3ZlcnNpb24+Ci0gICAgICAgIDxyZWxhdGl2ZVBhdGg+Li4vcGFyZW50L3BvbS54bWw8L3JlbGF0aXZlUGF0aD4KLSAgICA8L3BhcmVudD4KLSAgICA8YXJ0aWZhY3RJZD5heGlzMi1mYXN0aW5mb3NldDwvYXJ0aWZhY3RJZD4KLSAgICA8bmFtZT5BcGFjaGUgQXhpczIgLSBGYXN0IEluZm9zZXQ8L25hbWU+Ci0gICAgPGRlc2NyaXB0aW9uPkF4aXMyIEZhc3QgSW5mb3NldCBtb2R1bGU8L2Rlc2NyaXB0aW9uPgotICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLnN1bi54bWwuZmFzdGluZm9zZXQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5GYXN0SW5mb3NldDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1rZXJuZWw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3ZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLWFkYjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7dmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD53c2RsNGo8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD53c2RsNGo8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5jb21tb25zLWxvZ2dpbmc8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWxvZ2dpbmc8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5jb21tb25zLWh0dHBjbGllbnQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWh0dHBjbGllbnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5jb21tb25zLWZpbGV1cGxvYWQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWZpbGV1cGxvYWQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+WG1sU2NoZW1hPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLWphdmEyd3NkbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7dmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItYWRiLWNvZGVnZW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3ZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLWNvZGVnZW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3ZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5odHRwY29tcG9uZW50czwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmh0dHBjb3JlPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1jb2RlYzwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtY29kZWM8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm5lZXRoaTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm5lZXRoaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgIDwvZGVwZW5kZW5jaWVzPgotICAgIDxidWlsZD4KLSAgICAgICAgPHNvdXJjZURpcmVjdG9yeT5zcmM8L3NvdXJjZURpcmVjdG9yeT4KLSAgICAgICAgPHRlc3RTb3VyY2VEaXJlY3Rvcnk+dGVzdDwvdGVzdFNvdXJjZURpcmVjdG9yeT4KLSAgICAgICAgPHJlc291cmNlcz4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PmNvbmY8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLyoucHJvcGVydGllczwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYzwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKi5wcm9wZXJ0aWVzPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qLnhtbDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnJlc291cmNlczwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKjwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5Pi4uLy4uPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5OT1RJQ0UudHh0PC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5MSUNFTlNFLnR4dDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgICAgIDxmaWx0ZXJpbmc+ZmFsc2U8L2ZpbHRlcmluZz4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgIDwvcmVzb3VyY2VzPgotICAgICAgICA8dGVzdFJlc291cmNlcz4KLSAgICAgICAgICAgIDx0ZXN0UmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT50ZXN0PC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qLnhtbDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKi53c2RsPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qLnByb3BlcnRpZXM8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgIDwvdGVzdFJlc291cmNlPgotICAgICAgICA8L3Rlc3RSZXNvdXJjZXM+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxzb3VyY2U+MS41PC9zb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx0YXJnZXQ+MS41PC90YXJnZXQ+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hbnRydW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmdlbi10czwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+Z2VuZXJhdGUtdGVzdC1zb3VyY2VzPC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YXNrcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBTZXQgYSBwcm9wZXJ0eSB0aGF0IGNhbiBiZSBwaWNrZWQgdXAgZnJvbSB0aGUgYW50IGJ1aWxkLnhtbCdzIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ibWF2ZW4uY2xhc3MucGF0aCIgcmVmaWQ9Im1hdmVuLnJ1bnRpbWUuY2xhc3NwYXRoIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJtYXZlbi50ZXN0LnBhdGgiIHJlZmlkPSJtYXZlbi5jb21waWxlLmNsYXNzcGF0aCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGNvcHkgdGhlIG1hcnMgc28gdGhhdCB0aGV5IGFyZSBhdmFpbGFibGUgb24gdGhlIHRlc3QgY2xhc3NwYXRoIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29weSBmaWxlPSIuLi9hZGRyZXNzaW5nL3RhcmdldC9hZGRyZXNzaW5nLSR7dmVyc2lvbn0ubWFyIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2ZpbGU9InRhcmdldC90ZXN0LWNsYXNzZXMvbW9kdWxlcy9hZGRyZXNzaW5nLSR7dmVyc2lvbn0ubWFyIi8+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImF4aXMyLmhvbWUiIHZhbHVlPSIke2Jhc2VkaXJ9L3RhcmdldCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBpZD0ibWF2ZW4uZGVwZW5kZW5jeS5jbGFzc3BhdGgiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggcmVmaWQ9Im1hdmVuLmNvbXBpbGUuY2xhc3NwYXRoIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBjb21waWxpbmcgc29tZSBjdXN0b20gd3NkbCBmaWxlcyAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9IndzZGwuc291cmNlLmRpciIgdmFsdWU9InRlc3QtcmVzb3VyY2VzL3dzZGwiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9IndzZGwub3V0cHV0LmJhc2UuZGlyIiB2YWx1ZT0idGFyZ2V0L3dzZGwiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBtYWtlIHRoZSBkaXJzIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWtkaXIgZGlyPSIke3dzZGwub3V0cHV0LmJhc2UuZGlyfSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWNobz5Db21waWxpbmcgU2VydmljZSBjbGFzczwvZWNobz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGphdmFjIGZvcms9InRydWUiIGRlc3RkaXI9InRhcmdldC90ZXN0LWNsYXNzZXMiIGRlYnVnPSJvbiI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJtYXZlbi5kZXBlbmRlbmN5LmNsYXNzcGF0aCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzcGF0aCBsb2NhdGlvbj0iJHtjb21waWxlZC5jbGFzc2VzLmRpcn0iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLypTaW1wbGVBZGRTZXJ2aWNlLmphdmEiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcmMgcGF0aD0idGVzdC8iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9qYXZhYz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVjaG8+R2VuZXJhdGluZyB0aGUgV1NETDwvZWNobz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGphdmEgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLndzLmphdmEyd3NkbC5KYXZhMldTREwiIGZvcms9InRydWUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzcGF0aD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCByZWZpZD0ibWF2ZW4uZGVwZW5kZW5jeS5jbGFzc3BhdGgiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249InRhcmdldC90ZXN0LWNsYXNzZXMiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY2xhc3NwYXRoPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFyZyBsaW5lPSItbyB0YXJnZXQvdGVzdC1jbGFzc2VzIC1vZiBTaW1wbGVBZGRTZXJ2aWNlLndzZGwgLWVmZCB1bnF1YWxpZmllZCAtY24gb3JnLmFwYWNoZS5heGlzMi5mYXN0aW5mb3NldC5TaW1wbGVBZGRTZXJ2aWNlIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvamF2YT4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWNobz5Db21waWxpbmcgU2ltcGxlQWRkU2VydmljZS53c2RsPC9lY2hvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWtkaXIgZGlyPSIke3dzZGwub3V0cHV0LmJhc2UuZGlyfS9zaW1wbGVBZGRTZXJ2aWNlIi8+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGphdmEgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmF4aXMyLndzZGwuV1NETDJKYXZhIiBmb3JrPSJ0cnVlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc3BhdGggcmVmaWQ9Im1hdmVuLnJ1bnRpbWUuY2xhc3NwYXRoIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoIGxvY2F0aW9uPSIke2NvbXBpbGVkLmNsYXNzZXMuZGlyfSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFyZyBsaW5lPSItdXJpIHRhcmdldC90ZXN0LWNsYXNzZXMvU2ltcGxlQWRkU2VydmljZS53c2RsIC1vIHRhcmdldC93c2RsL3NpbXBsZUFkZFNlcnZpY2UgLVMgLiAtb3IiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9qYXZhPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8amF2YWMgZm9yaz0idHJ1ZSIgZGVzdGRpcj0idGFyZ2V0L2NsYXNzZXMiIGRlYnVnPSJvbiI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJtYXZlbi5ydW50aW1lLmNsYXNzcGF0aCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzcGF0aCBsb2NhdGlvbj0iJHtjb21waWxlZC5jbGFzc2VzLmRpcn0iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcmMgcGF0aD0idGFyZ2V0L3dzZGwvc2ltcGxlQWRkU2VydmljZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2phdmFjPgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YXNrcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5ydW48L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8c2tpcD5mYWxzZTwvc2tpcD4KLQotICAgICAgICAgICAgICAgICAgICA8IS0tIFRoZSBwZXJ0ZXN0IGZvcmtNb2RlIGlzIG5vdCBpZGVhbCBidXQgc2VlbXMgdG8gYmUgbmVjZXNzYXJ5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgYmVjYXVzZSB0aGUgdGVzdCBzZXJ2ZXIgZG9lc24ndCBzaHV0IGRvd24gcHJvcGVybHkgOi0oCi0gICAgICAgICAgICAgICAgICAgICAgICAgU2hvdWxkIGJlIHJlbW92ZWQgaWYgcG9zc2libGUgLS0+Ci0gICAgICAgICAgICAgICAgICAgIDxmb3JrTW9kZT5wZXJ0ZXN0PC9mb3JrTW9kZT4KLSAgICAgICAgICAgICAgICAgICAgPGFyZ0xpbmU+LVhtczI1Nm0gLVhteDUxMm08L2FyZ0xpbmU+Ci0gICAgICAgICAgICAgICAgICAgIDwhLS0gRW5hYmxlIHRoZSBuZXh0IDIgbGluZXMgaWYgeW91IHdhbnQgdG8gYXR0YWNoIGEgZGVidWdnZXIKLSAgICAgICAgICAgICAgICAgICA8YXJnTGluZT4tWGRlYnVnIC1Ybm9hZ2VudCAtRGphdmEuY29tcGlsZXI9Tk9ORSAtWHJ1bmpkd3A6dHJhbnNwb3J0PWR0X3NvY2tldCxzZXJ2ZXI9eSxzdXNwZW5kPXksYWRkcmVzcz01MDA2PC9hcmdMaW5lPi0tPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qVGVzdC5qYXZhPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8c3lzdGVtUHJvcGVydGllcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5idWlsZC5yZXBvc2l0b3J5PC9uYW1lPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2YWx1ZT4uL3RhcmdldC90ZXN0LWNsYXNzZXM8L3ZhbHVlPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KLSAgICAgICAgICAgICAgICAgICAgPC9zeXN0ZW1Qcm9wZXJ0aWVzPgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgPC9idWlsZD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2Zhc3RpbmZvc2V0L3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Zhc3RpbmZvc2V0L0Zhc3RJbmZvc2V0QnVpbGRlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvZmFzdGluZm9zZXQvc3JjL29yZy9hcGFjaGUvYXhpczIvZmFzdGluZm9zZXQvRmFzdEluZm9zZXRCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljNWU3YzcuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZmFzdGluZm9zZXQvc3JjL29yZy9hcGFjaGUvYXhpczIvZmFzdGluZm9zZXQvRmFzdEluZm9zZXRCdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZmFzdGluZm9zZXQ7Ci0KLWltcG9ydCBjb20uc3VuLnhtbC5mYXN0aW5mb3NldC5zdGF4LlN0QVhEb2N1bWVudFBhcnNlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuYnVpbGRlci5TdEFYQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuaW1wbC5idWlsZGVyLlN0QVhTT0FQTW9kZWxCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYnVpbGRlci5CdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLXB1YmxpYyBjbGFzcyBGYXN0SW5mb3NldEJ1aWxkZXIgaW1wbGVtZW50cyBCdWlsZGVyIHsKLQotCXByaXZhdGUgc3RhdGljICBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coRmFzdEluZm9zZXRCdWlsZGVyLmNsYXNzKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgT01FbGVtZW50IGhhbmRsZXIgdG8gdGhlIGRvY3VtZW50IGVsZW1lbnQgb2YgdGhlIEZhc3QgSW5mb3NldCBtZXNzYWdlLgotCSAqIAotCSAqIEBwYXJhbSBpbnB1dFN0cmVhbSBJbnB1dFN0cmVhbSB0byB0aGUgbWVzc2FnZQotCSAqIEBwYXJhbSBjb250ZW50VHlwZSBDb250ZW50IHR5cGUgb2YgdGhlIG1lc3NhZ2UKLQkgKiBAcGFyYW0gbWVzc2FnZUNvbnRleHQgTWVzc2FnZUNvbnRleHQgdG8gYmUgdXNlZAotCSAqIAotCSAqIEByZXR1cm4gT01FbGVtZW50IGhhbmRsZXIgdG8gdGhlIGRvY3VtZW50IGVsZW1lbnQKLQkgKiAKLQkgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuYnVpbGRlci5CdWlsZGVyI3Byb2Nlc3NEb2N1bWVudChJbnB1dFN0cmVhbSwgU3RyaW5nLCBNZXNzYWdlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgT01FbGVtZW50IHByb2Nlc3NEb2N1bWVudChJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgU3RyaW5nIGNvbnRlbnRUeXBlLCAKLQkJCU1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLQkJaWYgKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0JCQlsb2dnZXIuZGVidWcoIlByb2Nlc3NpbmcgYSBEb2N1bWVudCB3aXRoIHRoZSBjb250ZW50IHR5cGU6ICIgKyBjb250ZW50VHlwZSk7Ci0JCX0KLQkJLy9DcmVhdGUgYSBpbnN0YW5jZSBvZiB0aGUgU3RBWCBQYXJzZXIgd2hpY2ggY2FuIGhhbmRsZSB0aGUgZmFzdCBpbmZvc2V0IHN0cmVhbSAKLQkJWE1MU3RyZWFtUmVhZGVyIHN0cmVhbVJlYWRlciA9IG5ldyBTdEFYRG9jdW1lbnRQYXJzZXIoaW5wdXRTdHJlYW0pOwotCQlTdEFYQnVpbGRlciBidWlsZGVyID0gbmV3IFN0QVhTT0FQTW9kZWxCdWlsZGVyKHN0cmVhbVJlYWRlcik7Ci0KLQkJcmV0dXJuIGJ1aWxkZXIuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZmFzdGluZm9zZXQvc3JjL29yZy9hcGFjaGUvYXhpczIvZmFzdGluZm9zZXQvRmFzdEluZm9zZXRNZXNzYWdlRm9ybWF0dGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9mYXN0aW5mb3NldC9zcmMvb3JnL2FwYWNoZS9heGlzMi9mYXN0aW5mb3NldC9GYXN0SW5mb3NldE1lc3NhZ2VGb3JtYXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM2ZDA5Ni4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9mYXN0aW5mb3NldC9zcmMvb3JnL2FwYWNoZS9heGlzMi9mYXN0aW5mb3NldC9GYXN0SW5mb3NldE1lc3NhZ2VGb3JtYXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZmFzdGluZm9zZXQ7Ci0KLWltcG9ydCBjb20uc3VuLnhtbC5mYXN0aW5mb3NldC5zdGF4LlN0QVhEb2N1bWVudFNlcmlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU91dHB1dEZvcm1hdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuTWVzc2FnZUZvcm1hdHRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgRmFzdEluZm9zZXRNZXNzYWdlRm9ybWF0dGVyIGltcGxlbWVudHMgTWVzc2FnZUZvcm1hdHRlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coRmFzdEluZm9zZXRNZXNzYWdlRm9ybWF0dGVyLmNsYXNzKTsKLQkKLQkvKioKLQkgKiBGYXN0IEluZm9zZXQgbWVzc2FnZSBmb3JtYXR0ZXIgZG9lc24ndCBuZWVkIHRvIGhhbmRsZSBTT0FQLiBIZW5jZSBkbyBub3RoaW5nLgotCSAqIAotCSAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuTWVzc2FnZUZvcm1hdHRlciNmb3JtYXRTT0FQQWN0aW9uKG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dCwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU91dHB1dEZvcm1hdCwgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGZvcm1hdFNPQVBBY3Rpb24oTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQsCi0JCQlPTU91dHB1dEZvcm1hdCBmb3JtYXQsIFN0cmluZyBzb2FwQWN0aW9uKSB7Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0cmlldmVzIHRoZSByYXcgYnl0ZXMgZnJvbSB0aGUgU09BUCBlbnZlbG9wLgotCSAqIAotCSAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuTWVzc2FnZUZvcm1hdHRlciNnZXRCeXRlcyhvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQsIG9yZy5hcGFjaGUuYXhpb20ub20uT01PdXRwdXRGb3JtYXQpCi0JICovCi0JcHVibGljIGJ5dGVbXSBnZXRCeXRlcyhNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCwgT01PdXRwdXRGb3JtYXQgZm9ybWF0KQotCQkJdGhyb3dzIEF4aXNGYXVsdCB7Ci0JCU9NRWxlbWVudCBlbGVtZW50ID0gbWVzc2FnZUNvbnRleHQuZ2V0RW52ZWxvcGUoKTsKLQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJCi0JCXRyeSB7Ci0JCQkvL0NyZWF0ZXMgU3RBWCBkb2N1bWVudCBzZXJpYWxpemVyIHdoaWNoIGFjdHVhbGx5IGltcGxlbWVudHMgdGhlIFhNTFN0cmVhbVdyaXRlcgotCQkJWE1MU3RyZWFtV3JpdGVyIHN0cmVhbVdyaXRlciA9IG5ldyBTdEFYRG9jdW1lbnRTZXJpYWxpemVyKG91dFN0cmVhbSk7Ci0JCQllbGVtZW50LnNlcmlhbGl6ZUFuZENvbnN1bWUoc3RyZWFtV3JpdGVyKTsKLQkJCS8vVE9ETyBMb29rcyBsaWtlIHRoZSBTT0FQIGVudmVsb3AgZG9lc24ndCBoYXZlIGFuIGVuZCBkb2N1bWVudCB0YWcuIEZpbmQgb3V0IHdoeT8KLQkJCXN0cmVhbVdyaXRlci53cml0ZUVuZERvY3VtZW50KCk7Ci0JCQkKLQkJCXJldHVybiBvdXRTdHJlYW0udG9CeXRlQXJyYXkoKTsKLQkJCQotCQl9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24geG1sc2UpIHsKLQkJCWxvZ2dlci5lcnJvcih4bWxzZS5nZXRNZXNzYWdlKCkpOwotCQkJdGhyb3cgbmV3IEF4aXNGYXVsdCh4bWxzZS5nZXRNZXNzYWdlKCksIHhtbHNlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbnRlbnQgdHlwZQotCSAqIAotCSAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuTWVzc2FnZUZvcm1hdHRlciNnZXRDb250ZW50VHlwZShvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQsIG9yZy5hcGFjaGUuYXhpb20ub20uT01PdXRwdXRGb3JtYXQsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb250ZW50VHlwZShNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCwKLQkJCU9NT3V0cHV0Rm9ybWF0IGZvcm1hdCwgU3RyaW5nIHNvYXBBY3Rpb24pIHsKLQkJU3RyaW5nIGNvbnRlbnRUeXBlID0gKFN0cmluZykgbWVzc2FnZUNvbnRleHQuZ2V0UHJvcGVydHkoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uQ09OVEVOVF9UWVBFKTsKLQkJU3RyaW5nIGVuY29kaW5nID0gZm9ybWF0LmdldENoYXJTZXRFbmNvZGluZygpOwotCQkKLQkJLy9JZiB0aGUgQ29udGVudCBUeXBlIGlzIG5vdCBhdmFpbGFibGUgd2l0aCB0aGUgcHJvcGVydHkgIkNvbnRlbnQgVHlwZSIgcmV0cmlldmUgaXQgZnJvbSB0aGUgcHJvcGVydHkgIk1lc3NhZ2UgVHlwZSIKLQkJaWYgKGNvbnRlbnRUeXBlID09IG51bGwpIHsKLQkJCWNvbnRlbnRUeXBlID0gKFN0cmluZykgbWVzc2FnZUNvbnRleHQuZ2V0UHJvcGVydHkoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uTUVTU0FHRV9UWVBFKTsKLQkJfQotCi0JCWlmIChlbmNvZGluZyAhPSBudWxsKSB7Ci0JCQljb250ZW50VHlwZSArPSAiOyBjaGFyc2V0PSIgKyBlbmNvZGluZzsKLQkJfQotCSAgICAgICAgCi0JCXJldHVybiBjb250ZW50VHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0YXJnZXQgYWRkcmVzcyB0byBzZW5kIHRoZSByZXNwb25zZQotCSAqIEZJWE1FIFRoaXMgaXMgdmVyeSBIVFRQIHNwZWNpZmljLiBXaGF0IGFib3V0IG90aGVyIHRyYW5zcG9ydD8KLQkgKiAKLQkgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lk1lc3NhZ2VGb3JtYXR0ZXIjZ2V0VGFyZ2V0QWRkcmVzcyhvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQsIG9yZy5hcGFjaGUuYXhpb20ub20uT01PdXRwdXRGb3JtYXQsIGphdmEubmV0LlVSTCkKLQkgKi8KLQlwdWJsaWMgVVJMIGdldFRhcmdldEFkZHJlc3MoTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQsCi0JCQlPTU91dHB1dEZvcm1hdCBmb3JtYXQsIFVSTCB0YXJnZXRVUkwpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBTdHJpbmcgaHR0cE1ldGhvZCA9Ci0gICAgICAgICAgICAoU3RyaW5nKSBtZXNzYWdlQ29udGV4dC5nZXRQcm9wZXJ0eShDb25zdGFudHMuQ29uZmlndXJhdGlvbi5IVFRQX01FVEhPRCk7Ci0KLSAgICAgICAgVVJMIHRhcmdldEFkZHJlc3MgPSB0YXJnZXRVUkw7IC8vTGV0J3MgaW5pdGlhbGl6ZSB0byB0aGlzCi0JICAgIC8vaWYgdGhlIGh0dHAgbWV0aG9kIGlzIEdFVCwgcGFyYW1ldGVycyBhcmUgYXR0YWNoZWQgdG8gdGhlIHRhcmdldCBVUkwKLQkgICAgaWYgKChodHRwTWV0aG9kICE9IG51bGwpCi0JICAgICAgICAgICAgJiYgQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uSFRUUF9NRVRIT0RfR0VULmVxdWFsc0lnbm9yZUNhc2UoaHR0cE1ldGhvZCkpIHsKLQkgICAgICAgIFN0cmluZyBwYXJhbSA9IGdldFBhcmFtKG1lc3NhZ2VDb250ZXh0KTsKLQkKLQkgICAgICAgIGlmIChwYXJhbS5sZW5ndGgoKSA+IDApIHsKLQkgICAgICAgICAgICBTdHJpbmcgcmV0dXJuVVJMRmlsZSA9IHRhcmdldFVSTC5nZXRGaWxlKCkgKyAiPyIgKyBwYXJhbTsKLQkgICAgICAgICAgICB0cnkgewotCSAgICAgICAgICAgICAgICB0YXJnZXRBZGRyZXNzID0gCi0JICAgICAgICAgICAgICAgIAluZXcgVVJMKHRhcmdldFVSTC5nZXRQcm90b2NvbCgpLCB0YXJnZXRVUkwuZ2V0SG9zdCgpLCB0YXJnZXRVUkwuZ2V0UG9ydCgpLCByZXR1cm5VUkxGaWxlKTsKLQkgICAgICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gbXVybGUpIHsKLQkgICAgICAgICAgICAJbG9nZ2VyLmVycm9yKG11cmxlLmdldE1lc3NhZ2UoKSk7Ci0JICAgICAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQobXVybGUuZ2V0TWVzc2FnZSgpLCBtdXJsZSk7Ci0JICAgICAgICAgICAgfQotCSAgICAgICAgfQotCSAgICB9Ci0JICAgIAotCSAgICByZXR1cm4gdGFyZ2V0QWRkcmVzczsKLQl9Ci0KLQkvKioKLQkgKiBXcml0ZSB0aGUgU09BUCBlbnZlbG9wIHRvIHRoZSBnaXZlbiBPdXRwdXRTdHJlYW0uCi0JICogCi0JICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5NZXNzYWdlRm9ybWF0dGVyI3dyaXRlVG8ob3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0LCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NT3V0cHV0Rm9ybWF0LCBqYXZhLmlvLk91dHB1dFN0cmVhbSwgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCB3cml0ZVRvKE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0LCBPTU91dHB1dEZvcm1hdCBmb3JtYXQsCi0JCQlPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtLCBib29sZWFuIHByZXNlcnZlKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgT01FbGVtZW50IGVsZW1lbnQgPSBtZXNzYWdlQ29udGV4dC5nZXRFbnZlbG9wZSgpOwotCQkKLQkJdHJ5IHsKLQkJCS8vQ3JlYXRlIHRoZSBTdEFYIGRvY3VtZW50IHNlcmlhbGl6ZXIKLQkJCVhNTFN0cmVhbVdyaXRlciBzdHJlYW1Xcml0ZXIgPSBuZXcgU3RBWERvY3VtZW50U2VyaWFsaXplcihvdXRwdXRTdHJlYW0pOwotCQkJaWYgKHByZXNlcnZlKSB7Ci0JCQkJZWxlbWVudC5zZXJpYWxpemUoc3RyZWFtV3JpdGVyKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZWxlbWVudC5zZXJpYWxpemVBbmRDb25zdW1lKHN0cmVhbVdyaXRlcik7Ci0JCQl9Ci0vLwkJCVRPRE8gTG9va3MgbGlrZSB0aGUgU09BUCBlbnZlbG9wIGRvZXNuJ3QgaGF2ZSBhIGVuZCBkb2N1bWVudCB0YWcuIEZpbmQgb3V0IHdoeT8KLQkJCXN0cmVhbVdyaXRlci53cml0ZUVuZERvY3VtZW50KCk7Ci0JCX0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiB4bWxzZSkgewotCQkJbG9nZ2VyLmVycm9yKHhtbHNlLmdldE1lc3NhZ2UoKSk7Ci0JCQl0aHJvdyBuZXcgQXhpc0ZhdWx0KHhtbHNlLmdldE1lc3NhZ2UoKSwgeG1sc2UpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIENvbnN0cnVjdCBVUkwgcGFyYW1ldGVycyBsaWtlLCAicGFyYW0xPXZhbHVlMSZwYXJhbTI9dmFsdWUyIgotCSAqIEZJWE1FIFRoaXMgaXMgdmVyeSBIVFRQIHNwZWNpZmljLiBXaGF0IGFib3V0IG90aGVyIHRyYW5zcG9ydHMKLQkgKiAKLQkgKiBAcGFyYW0gbWVzc2FnZUNvbnRleHQKLQkgKiBAcmV0dXJuIEZvcm1hdHRlZCBVUkwgcGFyYW1ldGVycwotCSAqLwotICAgIHByaXZhdGUgU3RyaW5nIGdldFBhcmFtKE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0KSB7Ci0gICAgICAgIAotICAgIAlPTUVsZW1lbnQgZGF0YU91dCA9IG1lc3NhZ2VDb250ZXh0LmdldEVudmVsb3BlKCkuZ2V0Qm9keSgpLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgICBJdGVyYXRvciBpdCA9IGRhdGFPdXQuZ2V0Q2hpbGRFbGVtZW50cygpOwotICAgICAgICBTdHJpbmdCdWZmZXIgcGFyYW1CdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gCi0gICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBlbGVtZW50ID0gKE9NRWxlbWVudCkgaXQubmV4dCgpOwotICAgICAgICAgICAgU3RyaW5nIHBhcmFtZXRlciA9IGVsZW1lbnQuZ2V0TG9jYWxOYW1lKCkgKyAiPSIgKyBlbGVtZW50LmdldFRleHQoKTsKLSAgICAgICAgICAgIHBhcmFtQnVmZmVyLmFwcGVuZChwYXJhbWV0ZXIpOwotICAgICAgICAgICAgcGFyYW1CdWZmZXIuYXBwZW5kKCImIik7Ci0gICAgICAgIH0KLSAgICAgICAgLy9XZSBkb24ndCBuZWVkIGEgJyYnIGF0IHRoZSBlbmQKLSAgICAgICAgcGFyYW1CdWZmZXIuZGVsZXRlQ2hhckF0KHBhcmFtQnVmZmVyLmxlbmd0aCgpIC0gMSk7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gcGFyYW1CdWZmZXIudG9TdHJpbmcoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2Zhc3RpbmZvc2V0L3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Zhc3RpbmZvc2V0L0Zhc3RJbmZvc2V0UE9YQnVpbGRlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvZmFzdGluZm9zZXQvc3JjL29yZy9hcGFjaGUvYXhpczIvZmFzdGluZm9zZXQvRmFzdEluZm9zZXRQT1hCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5MWE5YzQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZmFzdGluZm9zZXQvc3JjL29yZy9hcGFjaGUvYXhpczIvZmFzdGluZm9zZXQvRmFzdEluZm9zZXRQT1hCdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZmFzdGluZm9zZXQ7Ci0KLWltcG9ydCBjb20uc3VuLnhtbC5mYXN0aW5mb3NldC5zdGF4LlN0QVhEb2N1bWVudFBhcnNlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuYnVpbGRlci5TdEFYQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuYnVpbGRlci5TdEFYT01CdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYnVpbGRlci5CdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLXB1YmxpYyBjbGFzcyBGYXN0SW5mb3NldFBPWEJ1aWxkZXIgaW1wbGVtZW50cyBCdWlsZGVyIHsKLQotCXByaXZhdGUgc3RhdGljIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhGYXN0SW5mb3NldEJ1aWxkZXIuY2xhc3MpOwotCQotCS8qKgotCSAqIFJldHVybnMgYSBPTUVsZW1lbnQgaGFuZGxlciB0byB0aGUgZG9jdW1lbnQgZWxlbWVudCBvZiB0aGUgRmFzdCBJbmZvc2V0IG1lc3NhZ2UuCi0JICogCi0JICogQHBhcmFtIGlucHV0U3RyZWFtIElucHV0U3RyZWFtIHRvIHRoZSBtZXNzYWdlCi0JICogQHBhcmFtIGNvbnRlbnRUeXBlIENvbnRlbnQgdHlwZSBvZiB0aGUgbWVzc2FnZQotCSAqIEBwYXJhbSBtZXNzYWdlQ29udGV4dCBNZXNzYWdlQ29udGV4dCB0byBiZSB1c2VkCi0JICogCi0JICogQHJldHVybiBPTUVsZW1lbnQgaGFuZGxlciB0byB0aGUgZG9jdW1lbnQgZWxlbWVudAotCSAqIAotCSAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5idWlsZGVyLkJ1aWxkZXIjcHJvY2Vzc0RvY3VtZW50KElucHV0U3RyZWFtLCBTdHJpbmcsIE1lc3NhZ2VDb250ZXh0KQotCSAqLwotCXB1YmxpYyBPTUVsZW1lbnQgcHJvY2Vzc0RvY3VtZW50KElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBTdHJpbmcgY29udGVudFR5cGUsIAotCQkJTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQpIHRocm93cyBBeGlzRmF1bHQgewotCQlpZiAobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpIHsKLQkJCWxvZ2dlci5kZWJ1ZygiUHJvY2Vzc2luZyBhIERvY3VtZW50IHdpdGggdGhlIGNvbnRlbnQgdHlwZTogIiArIGNvbnRlbnRUeXBlKTsKLQkJfQotCQkvL0NyZWF0ZSBhIGluc3RhbmNlIG9mIHRoZSBTdEFYIFBhcnNlciB3aGljaCBjYW4gaGFuZGxlIHRoZSBmYXN0IGluZm9zZXQgc3RyZWFtCi0JCVhNTFN0cmVhbVJlYWRlciBzdHJlYW1SZWFkZXIgPSBuZXcgU3RBWERvY3VtZW50UGFyc2VyKGlucHV0U3RyZWFtKTsKLQkJU3RBWEJ1aWxkZXIgYnVpbGRlciA9IG5ldyBTdEFYT01CdWlsZGVyKHN0cmVhbVJlYWRlcik7Ci0KLQkJcmV0dXJuIGJ1aWxkZXIuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZmFzdGluZm9zZXQvc3JjL29yZy9hcGFjaGUvYXhpczIvZmFzdGluZm9zZXQvRmFzdEluZm9zZXRQT1hNZXNzYWdlRm9ybWF0dGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9mYXN0aW5mb3NldC9zcmMvb3JnL2FwYWNoZS9heGlzMi9mYXN0aW5mb3NldC9GYXN0SW5mb3NldFBPWE1lc3NhZ2VGb3JtYXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmE2YzhlMi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9mYXN0aW5mb3NldC9zcmMvb3JnL2FwYWNoZS9heGlzMi9mYXN0aW5mb3NldC9GYXN0SW5mb3NldFBPWE1lc3NhZ2VGb3JtYXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZmFzdGluZm9zZXQ7Ci0KLWltcG9ydCBjb20uc3VuLnhtbC5mYXN0aW5mb3NldC5zdGF4LlN0QVhEb2N1bWVudFNlcmlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU91dHB1dEZvcm1hdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuTWVzc2FnZUZvcm1hdHRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgRmFzdEluZm9zZXRQT1hNZXNzYWdlRm9ybWF0dGVyIGltcGxlbWVudHMgTWVzc2FnZUZvcm1hdHRlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coRmFzdEluZm9zZXRNZXNzYWdlRm9ybWF0dGVyLmNsYXNzKTsKLQkKLQkvKioKLQkgKiBQbGFpbiBGYXN0IEluZm9zZXQgbWVzc2FnZSBmb3JtYXR0ZXIgZG9lc24ndCBuZWVkIHRvIGhhbmRsZSBTT0FQLiBIZW5jZSBkbyBub3RoaW5nLgotCSAqIAotCSAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuTWVzc2FnZUZvcm1hdHRlciNmb3JtYXRTT0FQQWN0aW9uKG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dCwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU91dHB1dEZvcm1hdCwgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGZvcm1hdFNPQVBBY3Rpb24oTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQsCi0JCQlPTU91dHB1dEZvcm1hdCBmb3JtYXQsIFN0cmluZyBzb2FwQWN0aW9uKSB7Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0cmlldmVzIHRoZSByYXcgYnl0ZXMgZnJvbSB0aGUgU09BUCBlbnZlbG9wLgotCSAqIAotCSAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuTWVzc2FnZUZvcm1hdHRlciNnZXRCeXRlcyhvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQsIG9yZy5hcGFjaGUuYXhpb20ub20uT01PdXRwdXRGb3JtYXQpCi0JICovCi0JcHVibGljIGJ5dGVbXSBnZXRCeXRlcyhNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCwgT01PdXRwdXRGb3JtYXQgZm9ybWF0KQotCQkJdGhyb3dzIEF4aXNGYXVsdCB7Ci0JCS8vRm9yIFBPWCBkcm9wIHRoZSBTT0FQIGVudmVsb3BlIGFuZCB1c2UgdGhlIG1lc3NhZ2UgYm9keQotCQlPTUVsZW1lbnQgZWxlbWVudCA9IG1lc3NhZ2VDb250ZXh0LmdldEVudmVsb3BlKCkuZ2V0Qm9keSgpLmdldEZpcnN0RWxlbWVudCgpOwotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0U3RyZWFtID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQkKLQkJdHJ5IHsKLQkJCS8vQ3JlYXRlcyBTdEFYIGRvY3VtZW50IHNlcmlhbGl6ZXIgd2hpY2ggYWN0dWFsbHkgaW1wbGVtZW50cyB0aGUgWE1MU3RyZWFtV3JpdGVyCi0JCQlYTUxTdHJlYW1Xcml0ZXIgc3RyZWFtV3JpdGVyID0gbmV3IFN0QVhEb2N1bWVudFNlcmlhbGl6ZXIob3V0U3RyZWFtKTsKLQkJCS8vU2luY2Ugd2UgZHJvcCB0aGUgU09BUCBlbnZlbG9wIHdlIGhhdmUgdG8gbWFudWFsbHkgd3JpdGUgdGhlIHN0YXJ0IGRvY3VtZW50IGFuZCB0aGUgZW5kIGRvY3VtZW50IGV2ZW50cwotCQkJc3RyZWFtV3JpdGVyLndyaXRlU3RhcnREb2N1bWVudCgpOwotCQkJZWxlbWVudC5zZXJpYWxpemVBbmRDb25zdW1lKHN0cmVhbVdyaXRlcik7Ci0JCQlzdHJlYW1Xcml0ZXIud3JpdGVFbmREb2N1bWVudCgpOwotCQkJCi0JCQlyZXR1cm4gb3V0U3RyZWFtLnRvQnl0ZUFycmF5KCk7Ci0JCQkKLQkJfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIHhtbHNlKSB7Ci0JCQlsb2dnZXIuZXJyb3IoeG1sc2UuZ2V0TWVzc2FnZSgpKTsKLQkJCXRocm93IG5ldyBBeGlzRmF1bHQoeG1sc2UuZ2V0TWVzc2FnZSgpLCB4bWxzZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb250ZW50IHR5cGUKLQkgKiAKLQkgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lk1lc3NhZ2VGb3JtYXR0ZXIjZ2V0Q29udGVudFR5cGUob3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0LCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NT3V0cHV0Rm9ybWF0LCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudFR5cGUoTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQsCi0JCQlPTU91dHB1dEZvcm1hdCBmb3JtYXQsIFN0cmluZyBzb2FwQWN0aW9uKSB7Ci0JCVN0cmluZyBjb250ZW50VHlwZSA9IChTdHJpbmcpIG1lc3NhZ2VDb250ZXh0LmdldFByb3BlcnR5KENvbnN0YW50cy5Db25maWd1cmF0aW9uLkNPTlRFTlRfVFlQRSk7Ci0JCVN0cmluZyBlbmNvZGluZyA9IGZvcm1hdC5nZXRDaGFyU2V0RW5jb2RpbmcoKTsKLQkJCi0JCS8vSWYgdGhlIENvbnRlbnQgVHlwZSBpcyBub3QgYXZhaWxhYmxlIHdpdGggdGhlIHByb3BlcnR5ICJDb250ZW50IFR5cGUiIHJldHJpZXZlIGl0IGZyb20gdGhlIHByb3BlcnR5ICJNZXNzYWdlIFR5cGUiCi0JCWlmIChjb250ZW50VHlwZSA9PSBudWxsKSB7Ci0JCQljb250ZW50VHlwZSA9IChTdHJpbmcpIG1lc3NhZ2VDb250ZXh0LmdldFByb3BlcnR5KENvbnN0YW50cy5Db25maWd1cmF0aW9uLk1FU1NBR0VfVFlQRSk7Ci0JCX0KLQotCQlpZiAoZW5jb2RpbmcgIT0gbnVsbCkgewotCQkJY29udGVudFR5cGUgKz0gIjsgY2hhcnNldD0iICsgZW5jb2Rpbmc7Ci0JCX0KLQkgICAgICAgIAotCQlyZXR1cm4gY29udGVudFR5cGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdGFyZ2V0IGFkZHJlc3MgdG8gc2VuZCB0aGUgcmVzcG9uc2UKLQkgKiBGSVhNRSBUaGlzIGlzIHZlcnkgSFRUUCBzcGVjaWZpYy4gV2hhdCBhYm91dCBvdGhlciB0cmFuc3BvcnQ/Ci0JICogCi0JICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5NZXNzYWdlRm9ybWF0dGVyI2dldFRhcmdldEFkZHJlc3Mob3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0LCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NT3V0cHV0Rm9ybWF0LCBqYXZhLm5ldC5VUkwpCi0JICovCi0JcHVibGljIFVSTCBnZXRUYXJnZXRBZGRyZXNzKE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0LAotCQkJT01PdXRwdXRGb3JtYXQgZm9ybWF0LCBVUkwgdGFyZ2V0VVJMKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgU3RyaW5nIGh0dHBNZXRob2QgPQotICAgICAgICAgICAgKFN0cmluZykgbWVzc2FnZUNvbnRleHQuZ2V0UHJvcGVydHkoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uSFRUUF9NRVRIT0QpOwotCi0gICAgICAgIFVSTCB0YXJnZXRBZGRyZXNzID0gdGFyZ2V0VVJMOyAvL0xldCdzIGluaXRpYWxpemUgdG8gdGhpcwotCSAgICAvL2lmIHRoZSBodHRwIG1ldGhvZCBpcyBHRVQsIHBhcmFtZXRlcnMgYXJlIGF0dGFjaGVkIHRvIHRoZSB0YXJnZXQgVVJMCi0JICAgIGlmICgoaHR0cE1ldGhvZCAhPSBudWxsKQotCSAgICAgICAgICAgICYmIENvbnN0YW50cy5Db25maWd1cmF0aW9uLkhUVFBfTUVUSE9EX0dFVC5lcXVhbHNJZ25vcmVDYXNlKGh0dHBNZXRob2QpKSB7Ci0JICAgICAgICBTdHJpbmcgcGFyYW0gPSBnZXRQYXJhbShtZXNzYWdlQ29udGV4dCk7Ci0JCi0JICAgICAgICBpZiAocGFyYW0ubGVuZ3RoKCkgPiAwKSB7Ci0JICAgICAgICAgICAgU3RyaW5nIHJldHVyblVSTEZpbGUgPSB0YXJnZXRVUkwuZ2V0RmlsZSgpICsgIj8iICsgcGFyYW07Ci0JICAgICAgICAgICAgdHJ5IHsKLQkgICAgICAgICAgICAgICAgdGFyZ2V0QWRkcmVzcyA9IAotCSAgICAgICAgICAgICAgICAJbmV3IFVSTCh0YXJnZXRVUkwuZ2V0UHJvdG9jb2woKSwgdGFyZ2V0VVJMLmdldEhvc3QoKSwgdGFyZ2V0VVJMLmdldFBvcnQoKSwgcmV0dXJuVVJMRmlsZSk7Ci0JICAgICAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIG11cmxlKSB7Ci0JICAgICAgICAgICAgCWxvZ2dlci5lcnJvcihtdXJsZS5nZXRNZXNzYWdlKCkpOwotCSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KG11cmxlLmdldE1lc3NhZ2UoKSwgbXVybGUpOwotCSAgICAgICAgICAgIH0KLQkgICAgICAgIH0KLQkgICAgfQotCSAgICAKLQkgICAgcmV0dXJuIHRhcmdldEFkZHJlc3M7Ci0JfQotCi0JLyoqCi0JICogV3JpdGUgdGhlIFNPQVAgZW52ZWxvcCB0byB0aGUgZ2l2ZW4gT3V0cHV0U3RyZWFtLgotCSAqIAotCSAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuTWVzc2FnZUZvcm1hdHRlciN3cml0ZVRvKG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dCwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU91dHB1dEZvcm1hdCwgamF2YS5pby5PdXRwdXRTdHJlYW0sIGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgd3JpdGVUbyhNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCwgT01PdXRwdXRGb3JtYXQgZm9ybWF0LAotCQkJT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSwgYm9vbGVhbiBwcmVzZXJ2ZSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0JCS8vRm9yIFBPWCBkcm9wIHRoZSBTT0FQIGVudmVsb3BlIGFuZCB1c2UgdGhlIG1lc3NhZ2UgYm9keQotCQlPTUVsZW1lbnQgZWxlbWVudCA9IG1lc3NhZ2VDb250ZXh0LmdldEVudmVsb3BlKCkuZ2V0Qm9keSgpLmdldEZpcnN0RWxlbWVudCgpOwotCQkKLQkJdHJ5IHsKLQkJCS8vQ3JlYXRlIHRoZSBTdEFYIGRvY3VtZW50IHNlcmlhbGl6ZXIKLQkJCVhNTFN0cmVhbVdyaXRlciBzdHJlYW1Xcml0ZXIgPSBuZXcgU3RBWERvY3VtZW50U2VyaWFsaXplcihvdXRwdXRTdHJlYW0pOwotCQkJLy9TaW5jZSB3ZSBkcm9wIHRoZSBTT0FQIGVudmVsb3Agd2UgaGF2ZSB0byBtYW51YWxseSB3cml0ZSB0aGUgc3RhcnQgZG9jdW1lbnQgYW5kIHRoZSBlbmQgZG9jdW1lbnQgZXZlbnRzCQkJCi0JCQlzdHJlYW1Xcml0ZXIud3JpdGVTdGFydERvY3VtZW50KCk7Ci0JCQlpZiAocHJlc2VydmUpIHsKLQkJCQllbGVtZW50LnNlcmlhbGl6ZShzdHJlYW1Xcml0ZXIpOwotCQkJfSBlbHNlIHsKLQkJCQllbGVtZW50LnNlcmlhbGl6ZUFuZENvbnN1bWUoc3RyZWFtV3JpdGVyKTsKLQkJCX0KLQkJCXN0cmVhbVdyaXRlci53cml0ZUVuZERvY3VtZW50KCk7Ci0JCX0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiB4bWxzZSkgewotCQkJbG9nZ2VyLmVycm9yKHhtbHNlLmdldE1lc3NhZ2UoKSk7Ci0JCQl0aHJvdyBuZXcgQXhpc0ZhdWx0KHhtbHNlLmdldE1lc3NhZ2UoKSwgeG1sc2UpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIENvbnN0cnVjdCBVUkwgcGFyYW1ldGVycyBsaWtlLCAicGFyYW0xPXZhbHVlMSZwYXJhbTI9dmFsdWUyIgotCSAqIEZJWE1FIFRoaXMgaXMgdmVyeSBIVFRQIHNwZWNpZmljLiBXaGF0IGFib3V0IG90aGVyIHRyYW5zcG9ydHMKLQkgKiAKLQkgKiBAcGFyYW0gbWVzc2FnZUNvbnRleHQKLQkgKiBAcmV0dXJuIEZvcm1hdHRlZCBVUkwgcGFyYW1ldGVycwotCSAqLwotICAgIHByaXZhdGUgU3RyaW5nIGdldFBhcmFtKE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0KSB7Ci0gICAgICAgIAotICAgIAlPTUVsZW1lbnQgZGF0YU91dCA9IG1lc3NhZ2VDb250ZXh0LmdldEVudmVsb3BlKCkuZ2V0Qm9keSgpLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgICBJdGVyYXRvciBpdCA9IGRhdGFPdXQuZ2V0Q2hpbGRFbGVtZW50cygpOwotICAgICAgICBTdHJpbmdCdWZmZXIgcGFyYW1CdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gCi0gICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBlbGVtZW50ID0gKE9NRWxlbWVudCkgaXQubmV4dCgpOwotICAgICAgICAgICAgU3RyaW5nIHBhcmFtZXRlciA9IGVsZW1lbnQuZ2V0TG9jYWxOYW1lKCkgKyAiPSIgKyBlbGVtZW50LmdldFRleHQoKTsKLSAgICAgICAgICAgIHBhcmFtQnVmZmVyLmFwcGVuZChwYXJhbWV0ZXIpOwotICAgICAgICAgICAgcGFyYW1CdWZmZXIuYXBwZW5kKCImIik7Ci0gICAgICAgIH0KLSAgICAgICAgLy9XZSBkb24ndCBuZWVkIGEgJyYnIGF0IHRoZSBlbmQKLSAgICAgICAgcGFyYW1CdWZmZXIuZGVsZXRlQ2hhckF0KHBhcmFtQnVmZmVyLmxlbmd0aCgpIC0gMSk7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gcGFyYW1CdWZmZXIudG9TdHJpbmcoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9mYXN0aW5mb3NldC90ZXN0LXJlc291cmNlcy9heGlzMi54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9mYXN0aW5mb3NldC90ZXN0LXJlc291cmNlcy9heGlzMi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViY2JjMGYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZmFzdGluZm9zZXQvdGVzdC1yZXNvdXJjZXMvYXhpczIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjkwICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGF4aXNjb25maWcgbmFtZT0iQXhpc0phdmEyLjAiPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIFBhcmFtZXRlcnMgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iaG90ZGVwbG95bWVudCI+dHJ1ZTwvcGFyYW1ldGVyPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iaG90dXBkYXRlIj5mYWxzZTwvcGFyYW1ldGVyPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iZW5hYmxlTVRPTSI+ZmFsc2U8L3BhcmFtZXRlcj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImVuYWJsZVN3QSI+ZmFsc2U8L3BhcmFtZXRlcj4KLQotICAgIDwhLS1VbmNvbW1lbnQgaWYgeW91IHdhbnQgdG8gZW5hYmxlIGZpbGUgY2FjaGluZyBmb3IgYXR0YWNobWVudHMgLS0+Ci0gICAgPCEtLXBhcmFtZXRlciBuYW1lPSJjYWNoZUF0dGFjaG1lbnRzIj50cnVlPC9wYXJhbWV0ZXI+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJhdHRhY2htZW50RElSIj48L3BhcmFtZXRlcj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9InNpemVUaHJlc2hvbGQiPjQwMDA8L3BhcmFtZXRlci0tPgotCi0gICAgPCEtLVRoaXMgd2lsbCBnaXZlIG91dCB0aGUgdGltb3V0IG9mIHRoZSBjb25maWd1cmF0aW9uIGNvbnRleHRzLCBpbiBtaWxsaXNlY29uZHMtLT4KLSAgICA8cGFyYW1ldGVyIG5hbWU9IkNvbmZpZ0NvbnRleHRUaW1lb3V0SW50ZXJ2YWwiPjMwMDAwPC9wYXJhbWV0ZXI+Ci0KLSAgICA8IS0tRHVyaW5nIGEgZmF1bHQsIHN0YWNrdHJhY2UgY2FuIGJlIHNlbnQgd2l0aCB0aGUgZmF1bHQgbWVzc2FnZS4gVGhlIGZvbGxvd2luZyBmbGFnIHdpbGwgY29udHJvbCAtLT4KLSAgICA8IS0tdGhhdCBiZWhhdmlvdXIuLS0+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJzZW5kU3RhY2t0cmFjZURldGFpbHNXaXRoRmF1bHRzIj5mYWxzZTwvcGFyYW1ldGVyPgotCi0gICAgPCEtLUlmIHRoZXJlIGFyZW4ndCBhbnkgaW5mb3JtYXRpb24gYXZhaWxhYmxlIHRvIGZpbmQgb3V0IHRoZSBmYXVsdCByZWFzb24sIHdlIHNldCB0aGUgbWVzc2FnZSBvZiB0aGUgZXhwY2V0aW9uLS0+Ci0gICAgPCEtLWFzIHRoZSBmYXVsdHJlYXNvbi9SZWFzb24uIEJ1dCB3aGVuIGEgZmF1bHQgaXMgdGhyb3duIGZyb20gYSBzZXJ2aWNlIG9yIHNvbWUgd2hlcmUsIGl0IHdpbGwgYmUgLS0+Ci0gICAgPCEtLXdyYXBwZWQgYnkgZGlmZmVyZW50IGxldmVscy4gRHVlIHRvIHRoaXMgdGhlIGluaXRpYWwgZXhjZXB0aW9uIG1lc3NhZ2UgY2FuIGJlIGxvc3QuIElmIHRoaXMgZmxhZy0tPgotICAgIDwhLS1pcyBzZXQgdGhlbiwgQXhpczIgdHJpZXMgdG8gZ2V0IHRoZSBmaXJzdCBleGNlcHRpb24gYW5kIHNldCBpdHMgbWVzc2FnZSBhcyB0aGUgZmF1bHRyZWFzb24vUmVhc29uLi0tPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iRHJpbGxEb3duVG9Sb290Q2F1c2VGb3JGYXVsdFJlYXNvbiI+ZmFsc2U8L3BhcmFtZXRlcj4KLQotICAgIDxwYXJhbWV0ZXIgbmFtZT0idXNlck5hbWUiPmFkbWluPC9wYXJhbWV0ZXI+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJwYXNzd29yZCI+YXhpczI8L3BhcmFtZXRlcj4KLQotICAgIDwhLS1UbyBvdmVycmlkZSByZXBvc2l0b3J5L3NlcnZpY2VzIHlvdSBuZWVkIHRvIHVuY29tbWVudCBmb2xsb3dpbmcgcGFyYW1ldGVyIGFuZCB2YWx1ZSBTSE9VTEQgYmUgYWJzb2x1dGUgZmlsZSBwYXRoLi0tPgotICAgIDwhLS08cGFyYW1ldGVyIG5hbWU9IlNlcnZpY2VzRGlyZWN0b3J5Ij5zZXJ2aWNlPC9wYXJhbWV0ZXI+LS0+Ci0gICAgPCEtLVRvIG92ZXJyaWRlIHJlcG9zaXRvcnkvbW9kdWxlcyB5b3UgbmVlZCB0byB1bmNvbW1lbnQgZm9sbG93aW5nIHBhcmFtZXRlciBhbmQgdmFsdWUgU0hPVUxEIGJlIGFic29sdXRlIGZpbGUgcGF0aC0tPgotICAgIDwhLS08cGFyYW1ldGVyIG5hbWU9Ik1vZHVsZXNEaXJlY3RvcnkiPm1vZHVsZXM8L3BhcmFtZXRlcj4tLT4KLQotCi0KLSAgICA8IS0tRm9sbG93aW5nIHBhcmFtcyB3aWxsIHNldCB0aGUgcHJvcGVyIGNvbnRleHQgcGF0aHMgZm9yIGludm9jYXRpb25zLiBBbGwgdGhlIGVuZHBvaW50cyB3aWxsIGhhdmUgYSBjb21tb25zIGNvbnRleHQtLT4KLSAgICA8IS0tcm9vdCB3aGljaCBjYW4gY29uZmlndXJlZCB1c2luZyB0aGUgZm9sbG93aW5nIGNvbnRleHRSb290IHBhcmFtZXRlci0tPgotICAgIDwhLS08cGFyYW1ldGVyIG5hbWU9ImNvbnRleHRSb290Ij5heGlzMjwvcGFyYW1ldGVyPi0tPgotCi0gICAgPCEtLU91ciBIVFRQIGVuZHBvaW50cyBjYW4gaGFuZGxlIGJvdGggUkVTVCBhbmQgU09BUC4gRm9sbG93aW5nIHBhcmFtZXRlcnMgY2FuIGJlIHVzZWQgdG8gZGlzdGluZ2l1c2ggdGhvc2UgZW5kcG9pbnRzLS0+Ci0gICAgPCEtLUluIGNhc2Ugb2YgYSBzZXJ2bGV0LCBpZiB5b3UgY2hhbmdlIHRoaXMgeW91IGhhdmUgdG8gbWFudWFsbHkgY2hhbmdlIHRoZSBzZXR0aW5ncyBvZiB5b3VyIHNlcnZsZXQgY29udGFpbmVyIHRvIG1hcCB0aGlzIC0tPgotICAgIDwhLS1jb250ZXh0IHBhdGggdG8gcHJvcGVyIEF4aXMyIHNlcnZsZXRzLS0+Ci0gICAgPCEtLTxwYXJhbWV0ZXIgbmFtZT0ic2VydmljZVBhdGgiPnNlcnZpY2VzPC9wYXJhbWV0ZXI+LS0+Ci0gICAgPCEtLTxwYXJhbWV0ZXIgbmFtZT0icmVzdFBhdGgiPnJlc3Q8L3BhcmFtZXRlcj4tLT4KLQotICAgIDwhLS0gRm9sbG93aW5nIHBhcmFtZXRlciB3aWxsIGNvbXBsZXRlbHkgZGlzYWJsZSBSRVNUIGhhbmRsaW5nIGluIEF4aXMyLS0+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJkaXNhYmxlUkVTVCIgbG9ja2VkPSJ0cnVlIj5mYWxzZTwvcGFyYW1ldGVyPgotCi0gICAgPCEtLSBJZiB5b3UgaGF2ZSBhIGZyb250ZW5kIGhvc3Qgd2hpY2ggZXhwb3NlcyB0aGlzIHdlYnNlcnZpY2UgdXNpbmcgYSBkaWZmZXJlbnQgcHVibGljIFVSTCAgLS0+Ci0gICAgPCEtLSB1c2UgdGhpcyBwYXJhbWV0ZXIgdG8gb3ZlcnJpZGUgYXV0b2RldGVjdGVkIHVybCAtLT4KLSAgICA8IS0tPHBhcmFtZXRlciBuYW1lPSJodHRwRnJvbnRlbmRIb3N0VXJsIj5odHRwczovL3NvbWVvdGhlcmhvc3QvY29udGV4dDwvcGFyYW1ldGVyPi0tPgotCi0KLSAgICA8IS0tICAgIFRoZSB3YXkgb2YgYWRkaW5nIGxpc3RlbmVyIHRvIHRoZSBzeXN0ZW0tLT4KLSAgICA8IS0tICAgIDxsaXN0ZW5lciBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5PYnNlcnZlcklNUEwiPi0tPgotICAgIDwhLS0gICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iUlNTX1VSTCI+aHR0cDovLzEyNy4wLjAuMS9yc3M8L3BhcmFtZXRlcj4tLT4KLSAgICA8IS0tICAgIDwvbGlzdGVuZXI+LS0+Ci0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBNZXNzYWdlIFJlY2VpdmVycyAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLVRoaXMgaXMgdGhlIERlYWZ1bHQgTWVzc2FnZSBSZWNlaXZlciBmb3IgdGhlIHN5c3RlbSAsIGlmIHlvdSB3YW50IHRvIGhhdmUgTWVzc2FnZVJlY2VpdmVycyBmb3IgLS0+Ci0gICAgPCEtLWFsbCB0aGUgb3RoZXIgTUVQIGltcGxlbWVudCBpdCBhbmQgYWRkIHRoZSBjb3JyZWN0IGVudHJ5IHRvIGhlcmUgLCBzbyB0aGF0IHlvdSBjYW4gcmVmZXIgZnJvbS0tPgotICAgIDwhLS1hbnkgb3BlcmF0aW9uIC0tPgotICAgIDwhLS1Ob3RlIDogWW91IGNhbiBvdnJpZGUgdGhpcyBmb3IgcGFydGljdWxhciBzZXJ2aWNlIGJ5IGFkZGluZyB0aGUgc2FtZSBlbGVtZW50IHdpdGggeW91ciByZXF1aXJlbWVudC0tPgotICAgICA8bWVzc2FnZVJlY2VpdmVycz4KLSAgICAgICAgPG1lc3NhZ2VSZWNlaXZlciBtZXA9Imh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgvd3NkbC9pbi1vbmx5IgotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5SYXdYTUxJTk9ubHlNZXNzYWdlUmVjZWl2ZXIiLz4KLSAgICAgICAgPG1lc3NhZ2VSZWNlaXZlciBtZXA9Imh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgvd3NkbC9pbi1vdXQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLlJhd1hNTElOT3V0TWVzc2FnZVJlY2VpdmVyIi8+Ci0gICAgICAgIDxtZXNzYWdlUmVjZWl2ZXIgbWVwPSJodHRwOi8vd3d3LnczLm9yZy8yMDA2LzAxL3dzZGwvaW4tb25seSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuUmF3WE1MSU5Pbmx5TWVzc2FnZVJlY2VpdmVyIi8+Ci0gICAgICAgIDxtZXNzYWdlUmVjZWl2ZXIgbWVwPSJodHRwOi8vd3d3LnczLm9yZy8yMDA2LzAxL3dzZGwvaW4tb3V0IgotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5SYXdYTUxJTk91dE1lc3NhZ2VSZWNlaXZlciIvPgotICAgIDwvbWVzc2FnZVJlY2VpdmVycz4KLQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIE1lc3NhZ2UgRm9ybWF0dGVyIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tRm9sbG93aW5nIGNvbnRlbnQgdHlwZSB0byBtZXNzYWdlIGZvcm1hdHRlciBtYXBwaW5nIGNhbiBiZSB1c2VkIHRvIGltcGxlbWVudCBzdXBwb3J0IGZvciBkaWZmZXJlbnQgbWVzc2FnZSAtLT4KLSAgICA8IS0tZm9ybWF0ICBzZXJpYWxpemF0aW9uIGluIEF4aXMyLiBUaGVzZSBtZXNzYWdlIGZvcm1hdHMgYXJlIGV4cGVjdGVkIHRvIGJlIHJlc29sdmVkIGJhc2VkIG9uIHRoZSBjb250ZW50IHR5cGUuIC0tPgotICAgIDxtZXNzYWdlRm9ybWF0dGVycz4KLSAgICAgICAgPG1lc3NhZ2VGb3JtYXR0ZXIgY29udGVudFR5cGU9ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5YRm9ybVVSTEVuY29kZWRGb3JtYXR0ZXIiLz4KLSAgICAgICAgPG1lc3NhZ2VGb3JtYXR0ZXIgY29udGVudFR5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuTXVsdGlwYXJ0Rm9ybURhdGFGb3JtYXR0ZXIiLz4KLSAgICAgICAgPG1lc3NhZ2VGb3JtYXR0ZXIgY29udGVudFR5cGU9ImFwcGxpY2F0aW9uL3htbCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5BcHBsaWNhdGlvblhNTEZvcm1hdHRlciIvPgotCTxtZXNzYWdlRm9ybWF0dGVyIGNvbnRlbnRUeXBlPSJhcHBsaWNhdGlvbi9mYXN0aW5mb3NldCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5mYXN0aW5mb3NldC5GYXN0SW5mb3NldFBPWE1lc3NhZ2VGb3JtYXR0ZXIiLz4KLQk8bWVzc2FnZUZvcm1hdHRlciBjb250ZW50VHlwZT0iYXBwbGljYXRpb24vc29hcCtmYXN0aW5mb3NldCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5mYXN0aW5mb3NldC5GYXN0SW5mb3NldE1lc3NhZ2VGb3JtYXR0ZXIiLz4KLSAgICA8L21lc3NhZ2VGb3JtYXR0ZXJzPgotCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gTWVzc2FnZSBCdWlsZGVycyAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLUZvbGxvd2luZyBjb250ZW50IHR5cGUgdG8gYnVpbGRlciBtYXBwaW5nIGNhbiBiZSB1c2VkIHRvIGltcGxlbWVudCBzdXBwb3J0IGZvciBkaWZmZXJlbnQgbWVzc2FnZSAtLT4KLSAgICA8IS0tZm9ybWF0cyBpbiBBeGlzMi4gVGhlc2UgbWVzc2FnZSBmb3JtYXRzIGFyZSBleHBlY3RlZCB0byBiZSByZXNvbHZlZCBiYXNlZCBvbiB0aGUgY29udGVudCB0eXBlLiAtLT4KLSAgICA8bWVzc2FnZUJ1aWxkZXJzPgotICAgICAgICA8bWVzc2FnZUJ1aWxkZXIgY29udGVudFR5cGU9ImFwcGxpY2F0aW9uL3htbCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5idWlsZGVyLkFwcGxpY2F0aW9uWE1MQnVpbGRlciIvPgotICAgICAgICA8bWVzc2FnZUJ1aWxkZXIgY29udGVudFR5cGU9ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5idWlsZGVyLlhGb3JtVVJMRW5jb2RlZEJ1aWxkZXIiLz4KLSAgICAgICAgPG1lc3NhZ2VCdWlsZGVyIGNvbnRlbnRUeXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIgotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmJ1aWxkZXIuTXVsdGlwYXJ0Rm9ybURhdGFCdWlsZGVyIi8+Ci0JPG1lc3NhZ2VCdWlsZGVyIGNvbnRlbnRUeXBlPSJhcHBsaWNhdGlvbi9mYXN0aW5mb3NldCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5mYXN0aW5mb3NldC5GYXN0SW5mb3NldFBPWEJ1aWxkZXIiLz4KLQk8bWVzc2FnZUJ1aWxkZXIgY29udGVudFR5cGU9ImFwcGxpY2F0aW9uL3NvYXArZmFzdGluZm9zZXQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZmFzdGluZm9zZXQuRmFzdEluZm9zZXRCdWlsZGVyIi8+Ci0gICAgPC9tZXNzYWdlQnVpbGRlcnM+Ci0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBUcmFuc3BvcnQgSW5zIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8dHJhbnNwb3J0UmVjZWl2ZXIgbmFtZT0iaHR0cCIKLSAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuU2ltcGxlSFRUUFNlcnZlciI+Ci0gICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icG9ydCI+ODA4MDwvcGFyYW1ldGVyPgotICAgICAgICA8IS0tIEhlcmUgaXMgdGhlIGNvbXBsZXRlIGxpc3Qgb2Ygc3VwcG9ydGVkIHBhcmFtZXRlcnMgKHNlZSBleGFtcGxlIHNldHRpbmdzIGZ1cnRoZXIgYmVsb3cpOgotICAgICAgICAgICAgcG9ydDogdGhlIHBvcnQgdG8gbGlzdGVuIG9uIChkZWZhdWx0IDYwNjApCi0gICAgICAgICAgICBob3N0bmFtZTogIGlmIG5vbi1udWxsLCB1cmwgcHJlZml4IHVzZWQgaW4gcmVwbHktdG8gZW5kcG9pbnQgcmVmZXJlbmNlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkZWZhdWx0IG51bGwpCi0gICAgICAgICAgICBvcmlnaW5TZXJ2ZXI6ICB2YWx1ZSBvZiBodHRwIFNlcnZlciBoZWFkZXIgaW4gb3V0Z29pbmcgbWVzc2FnZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkZWZhdWx0ICJTaW1wbGUtU2VydmVyLzEuMSIpCi0gICAgICAgICAgICByZXF1ZXN0VGltZW91dDogIHZhbHVlIGluIG1pbGxpcyBvZiB0aW1lIHRoYXQgcmVxdWVzdHMgY2FuIHdhaXQgZm9yIGRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkZWZhdWx0IDIwMDAwKQotICAgICAgICAgICAgcmVxdWVzdFRjcE5vRGVsYXk6ICB0cnVlIHRvIG1heGltaXplIHBlcmZvcm1hbmNlIGFuZCBtaW5pbWl6ZSBsYXRlbmN5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdCB0cnVlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSB0byBtaW5pbWl6ZSBiYW5kd2lkdGggY29uc3VtcHRpb24gYnkgY29tYmluaW5nIHNlZ21lbnRzCi0gICAgICAgICAgICByZXF1ZXN0Q29yZVRocmVhZFBvb2xTaXplOiAgbnVtYmVyIG9mIHRocmVhZHMgYXZhaWxhYmxlIGZvciByZXF1ZXN0IHByb2Nlc3NpbmcgKHVubGVzcyBxdWV1ZSBmaWxscyB1cCkgIChkZWZhdWx0IDI1KQotICAgICAgICAgICAgcmVxdWVzdE1heFRocmVhZFBvb2xTaXplOiAgbnVtYmVyIG9mIHRocmVhZHMgYXZhaWxhYmxlIGZvciByZXF1ZXN0IHByb2Nlc3NpbmcgaWYgcXVldWUgZmlsbHMgdXMgICAgICAgICAoZGVmYXVsdCAxNTApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RlIHRoYXQgZGVmYXVsdCBxdWV1ZSBuZXZlciBmaWxscyB1cDogIHNlZSBIdHRwRmFjdG9yeQotICAgICAgICAgICAgdGhyZWFkS2VlcEFsaXZlVGltZTogIHRpbWUgdG8ga2VlcCB0aHJlYWRzIGluIGV4Y2VzcyBvZiBjb3JlIHNpemUgYWxpdmUgd2hpbGUgaW5hY3RpdmUgICAgICAgICAgICAgICAgICAoZGVmYXVsdCAxODApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90ZSB0aGF0IG5vIHN1Y2ggdGhyZWFkcyBjYW4gZXhpc3Qgd2l0aCBkZWZhdWx0IHVuYm91bmRlZCByZXF1ZXN0IHF1ZXVlCi0gICAgICAgICAgICB0aHJlYWRLZWVwQWxpdmVUaW1lVW5pdDogIFRpbWVVbml0IG9mIHZhbHVlIGluIHRocmVhZEtlZXBBbGl2ZVRpbWUgKGRlZmF1bHQgU0VDT05EUykgICAgICAgICAgICAgICAgICAgIChkZWZhdWx0IFNFQ09ORFMpCi0gICAgICAgIC0tPgotICAgICAgICA8IS0tIDxwYXJhbWV0ZXIgbmFtZT0iaG9zdG5hbWUiPmh0dHA6Ly93d3cubXlBcHAuY29tL3dzPC9wYXJhbWV0ZXI+IC0tPgotICAgICAgICA8IS0tIDxwYXJhbWV0ZXIgbmFtZT0ib3JpZ2luU2VydmVyIj5NeS1TZXJ2ZXIvMS4xPC9wYXJhbWV0ZXI+ICAgICAgICAgICAtLT4KLSAgICAgICAgPCEtLSA8cGFyYW1ldGVyIG5hbWU9InJlcXVlc3RUaW1lb3V0Ij4xMDAwMDwvcGFyYW1ldGVyPiAgICAgICAgICAgICAgICAgICAtLT4KLSAgICAgICAgPCEtLSA8cGFyYW1ldGVyIG5hbWU9InJlcXVlc3RUY3BOb0RlbGF5Ij5mYWxzZTwvcGFyYW1ldGVyPiAgICAgICAgICAgICAgICAgICAtLT4KLSAgICAgICAgPCEtLSA8cGFyYW1ldGVyIG5hbWU9InJlcXVlc3RDb3JlVGhyZWFkUG9vbFNpemUiPjUwPC9wYXJhbWV0ZXI+ICAgICAgICAgICAgICAgICAgICAgIC0tPgotICAgICAgICA8IS0tIDxwYXJhbWV0ZXIgbmFtZT0icmVxdWVzdE1heFRocmVhZFBvb2xTaXplIj4xMDA8L3BhcmFtZXRlcj4gICAgICAgICAgICAgICAgICAgICAtLT4KLSAgICAgICAgPCEtLSA8cGFyYW1ldGVyIG5hbWU9InRocmVhZEtlZXBBbGl2ZVRpbWUiPjI0MDAwMDwvcGFyYW1ldGVyPiAgICAgICAgICAgICAgICAgIC0tPgotICAgICAgICA8IS0tIDxwYXJhbWV0ZXIgbmFtZT0idGhyZWFkS2VlcEFsaXZlVGltZVVuaXQiPk1JTExJU0VDT05EUzwvcGFyYW1ldGVyPiAgICAgICAgICAgIC0tPgotICAgIDwvdHJhbnNwb3J0UmVjZWl2ZXI+Ci0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBUcmFuc3BvcnQgT3V0cyAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0KLSAgICA8dHJhbnNwb3J0U2VuZGVyIG5hbWU9ImxvY2FsIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0LmxvY2FsLkxvY2FsVHJhbnNwb3J0U2VuZGVyIi8+Ci0gICAgPHRyYW5zcG9ydFNlbmRlciBuYW1lPSJodHRwIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuQ29tbW9uc0hUVFBUcmFuc3BvcnRTZW5kZXIiPgotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9IlBST1RPQ09MIj5IVFRQLzEuMTwvcGFyYW1ldGVyPgotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9IlRyYW5zZmVyLUVuY29kaW5nIj5jaHVua2VkPC9wYXJhbWV0ZXI+Ci0KLSAgICAgICAgPCEtLSBJZiBmb2xsb3dpbmcgaXMgc2V0IHRvICd0cnVlJywgb3B0aW9uYWwgYWN0aW9uIHBhcnQgb2YgdGhlIENvbnRlbnQtVHlwZSB3aWxsIG5vdCBiZSBhZGRlZCB0byB0aGUgU09BUCAxLjIgbWVzc2FnZXMgLS0+Ci0gICAgICAgIDwhLS0gIDxwYXJhbWV0ZXIgbmFtZT0iT21pdFNPQVAxMkFjdGlvbiI+dHJ1ZTwvcGFyYW1ldGVyPiAgLS0+Ci0gICAgPC90cmFuc3BvcnRTZW5kZXI+Ci0KLSAgICA8dHJhbnNwb3J0U2VuZGVyIG5hbWU9Imh0dHBzIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuQ29tbW9uc0hUVFBUcmFuc3BvcnRTZW5kZXIiPgotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9IlBST1RPQ09MIj5IVFRQLzEuMTwvcGFyYW1ldGVyPgotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9IlRyYW5zZmVyLUVuY29kaW5nIj5jaHVua2VkPC9wYXJhbWV0ZXI+Ci0gICAgPC90cmFuc3BvcnRTZW5kZXI+Ci0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBHbG9iYWwgTW9kdWxlcyAgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gQ29tbWVudCB0aGlzIHRvIGRpc2FibGUgQWRkcmVzc2luZyAtLT4KLSAgICA8IS0tPG1vZHVsZSByZWY9ImFkZHJlc3NpbmciLz4tLT4KLQotICAgIDwhLS1Db25maWd1cmluZyBtb2R1bGUgLCBwcm92aWRpbmcgcGFyYW1ldGVycyBmb3IgbW9kdWxlcyB3aGV0aGVyIHRoZXkgcmVmZXIgb3Igbm90LS0+Ci0gICAgPCEtLTxtb2R1bGVDb25maWcgbmFtZT0iYWRkcmVzc2luZyI+LS0+Ci0gICAgPCEtLTxwYXJhbWV0ZXIgbmFtZT0iYWRkcmVzc2luZ1BhcmEiPk4vQTwvcGFyYW1ldGVyPi0tPgotICAgIDwhLS08L21vZHVsZUNvbmZpZz4tLT4KLQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIENsdXN0ZXJpbmcgIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIENvbmZpZ3VyZSBhbmQgdW5jb21tZW50IGZvbGxvd2luZyBmb3IgcHJlcGFyaW5nIEF4aXMyIHRvIGEgY2x1c3RlcmVkIGVudmlyb25tZW50IC0tPgotICAgIDwhLS0KLSAgICA8Y2x1c3RlciBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyLnRyaWJlcy5UcmliZXNDbHVzdGVyTWFuYWdlciI+Ci0gICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFyYW0xIj52YWx1ZTE8L3BhcmFtZXRlcj4KLSAgICAJPGNvbmZpZ3VyYXRpb25NYW5hZ2VyIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXIudHJpYmVzLmNvbmZpZ3VyYXRpb24uVHJpYmVzQ29uZmlndXJhdGlvbk1hbmFnZXIiPgotICAgIAkgICAgPGxpc3RlbmVycz4KLSAgICAJICAgIDwvbGlzdGVuZXJzPgotICAgIAk8L2NvbmZpZ3VyYXRpb25NYW5hZ2VyPgotICAgIAk8Y29udGV4dE1hbmFnZXIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuY2x1c3Rlci50cmliZXMuY29udGV4dC5UcmliZXNDb250ZXh0TWFuYWdlciI+Ci0gICAgCSAgICA8bGlzdGVuZXJzPgotICAgIAkgICAgPC9saXN0ZW5lcnM+Ci0gICAgCTwvY29udGV4dE1hbmFnZXI+Ci0gICAgPC9jbHVzdGVyPgotICAgIC0tPgotCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gUGhhc2VzICAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPHBoYXNlT3JkZXIgdHlwZT0iSW5GbG93Ij4KLSAgICAgICAgPCEtLSAgU3lzdGVtIHByZSBkZWZpbmVkIHBoYXNlcyAgICAgICAtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlRyYW5zcG9ydCI+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJSZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciI+Ci0gICAgICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJUcmFuc3BvcnQiLz4KLSAgICAgICAgICAgIDwvaGFuZGxlcj4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIj4KLSAgICAgICAgICAgICAgICA8b3JkZXIgcGhhc2U9IlRyYW5zcG9ydCIvPgotICAgICAgICAgICAgPC9oYW5kbGVyPgotICAgICAgICA8L3BoYXNlPgotICAgICAgICA8cGhhc2UgbmFtZT0iU2VjdXJpdHkiLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlByZURpc3BhdGNoIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJEaXNwYXRjaCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkRpc3BhdGNoUGhhc2UiPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiLz4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlJlcXVlc3RVUklPcGVyYXRpb25EaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSU9wZXJhdGlvbkRpc3BhdGNoZXIiLz4KLQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIi8+Ci0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IkhUVFBMb2NhdGlvbkJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLkhUVFBMb2NhdGlvbkJhc2VkRGlzcGF0Y2hlciIvPgotICAgICAgICA8L3BoYXNlPgotICAgICAgICA8IS0tICBTeXN0ZW0gcHJlIGRlZmluZWQgcGhhc2VzICAgICAgIC0tPgotICAgICAgICA8IS0tICAgQWZ0ZXIgUG9zdGRpc3BhdGNoIHBoYXNlIG1vZHVsZSBhdXRob3Igb3Igb3Igc2VydmljZSBhdXRob3IgY2FuIGFkZCBhbnkgcGhhc2UgaGUgd2FudCAgICAgIC0tPgotICAgICAgICA8cGhhc2UgbmFtZT0iT3BlcmF0aW9uSW5QaGFzZSIvPgotCTxwaGFzZSBuYW1lPSJzb2FwbW9uaXRvclBoYXNlIi8+Ci0gICAgPC9waGFzZU9yZGVyPgotICAgIDxwaGFzZU9yZGVyIHR5cGU9Ik91dEZsb3ciPgotICAgICAgICA8IS0tICAgICAgdXNlciBjYW4gYWRkIGhpcyBvd24gcGhhc2VzIHRvIHRoaXMgYXJlYSAgLS0+Ci0JPHBoYXNlIG5hbWU9InNvYXBtb25pdG9yUGhhc2UiLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik9wZXJhdGlvbk91dFBoYXNlIi8+Ci0gICAgICAgIDwhLS1zeXN0ZW0gcHJlZGVmaW5lZCBwaGFzZS0tPgotICAgICAgICA8IS0tdGhlc2UgcGhhc2Ugd2lsbCBydW4gaXJyZXNwZWN0aXZlIG9mIHRoZSBzZXJ2aWNlLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJQb2xpY3lEZXRlcm1pbmF0aW9uIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJNZXNzYWdlT3V0Ii8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJTZWN1cml0eSIvPgotICAgIDwvcGhhc2VPcmRlcj4KLSAgICA8cGhhc2VPcmRlciB0eXBlPSJJbkZhdWx0RmxvdyI+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJQcmVEaXNwYXRjaCIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iRGlzcGF0Y2giIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5EaXNwYXRjaFBoYXNlIj4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5SZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIi8+Ci0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIi8+Ci0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5BZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIi8+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJSZXF1ZXN0VVJJT3BlcmF0aW9uRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklPcGVyYXRpb25EaXNwYXRjaGVyIi8+Ci0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciIvPgotCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJIVFRQTG9jYXRpb25CYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5IVFRQTG9jYXRpb25CYXNlZERpc3BhdGNoZXIiLz4KLSAgICAgICAgPC9waGFzZT4KLSAgICAgICAgPCEtLSAgICAgIHVzZXIgY2FuIGFkZCBoaXMgb3duIHBoYXNlcyB0byB0aGlzIGFyZWEgIC0tPgotICAgICAgICA8cGhhc2UgbmFtZT0iT3BlcmF0aW9uSW5GYXVsdFBoYXNlIi8+Ci0JPHBoYXNlIG5hbWU9InNvYXBtb25pdG9yUGhhc2UiLz4KLSAgICA8L3BoYXNlT3JkZXI+Ci0gICAgPHBoYXNlT3JkZXIgdHlwZT0iT3V0RmF1bHRGbG93Ij4KLSAgICAgICAgPCEtLSAgICAgIHVzZXIgY2FuIGFkZCBoaXMgb3duIHBoYXNlcyB0byB0aGlzIGFyZWEgIC0tPgotCTxwaGFzZSBuYW1lPSJzb2FwbW9uaXRvclBoYXNlIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJPcGVyYXRpb25PdXRGYXVsdFBoYXNlIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJQb2xpY3lEZXRlcm1pbmF0aW9uIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJNZXNzYWdlT3V0Ii8+Ci0gICAgPC9waGFzZU9yZGVyPgotPC9heGlzY29uZmlnPgotCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9mYXN0aW5mb3NldC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZmFzdGluZm9zZXQvRmFzdEluZm9zZXRJbnB1dE91dHB1dFRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2Zhc3RpbmZvc2V0L3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9mYXN0aW5mb3NldC9GYXN0SW5mb3NldElucHV0T3V0cHV0VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTQwODY3Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2Zhc3RpbmZvc2V0L3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9mYXN0aW5mb3NldC9GYXN0SW5mb3NldElucHV0T3V0cHV0VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmZhc3RpbmZvc2V0OwotCi1pbXBvcnQgY29tLnN1bi54bWwuZmFzdGluZm9zZXQuc3RheC5TdEFYRG9jdW1lbnRQYXJzZXI7Ci1pbXBvcnQgY29tLnN1bi54bWwuZmFzdGluZm9zZXQuc3RheC5TdEFYRG9jdW1lbnRTZXJpYWxpemVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5idWlsZGVyLlN0QVhCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5idWlsZGVyLlN0QVhPTUJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmN1c3RvbW1vbmtleS54bWx1bml0LlhNTFRlc3RDYXNlOwotCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOwotCi1wdWJsaWMgY2xhc3MgRmFzdEluZm9zZXRJbnB1dE91dHB1dFRlc3QgZXh0ZW5kcyBYTUxUZXN0Q2FzZSB7Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIGlzIHRvIHRlc3QgaG93IGZhc3QgaW5mb3NldCBpbnRlcm9wZXJhdGUgd2l0aCBBeGlvbS4KLSAgICAgKiBUaGlzIGlzIGhvdyB0aGlzIHRlc3QgaXMgb3JnYW5pemVkLgotICAgICAqIDxwcmU+Ci0gICAgICogICAgICBkZS1zZXIod3N0eCkgICAgICAgIHNlcihmYXN0LWluZm8pICAgICAgICAgICAgIGRlLXNlcihmYXN0LWluZm8pICAgICAgIHNlcih3c3R4KQotICAgICAqIFhNTCAgLS0tLS0tLS0+ICAgICBBeGlvbSAgICAgLS0tLS0tPiAgICBiaW5hcnkgZmlsZSAtLS0tLS0tLS0tLS0tLT4gICBBeGlvbSAtLS0tLS0tLS0+IFhNTAotICAgICAqIDwvcHJlPgotICAgICAqIDxwLz4KLSAgICAgKiBUaGVuIHRoZSBpbml0aWFsIFhNTCBmaWxlIGFuZCB0aGUgbGFzdCBYTUwgd2lsbCBiZSBjb21wYXJlZCB0byBzZWUgd2hldGhlciB0aGV5IGFyZSB0aGUgc2FtZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW5wdXRPdXRwdXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIGlucHV0RmlsZSA9ICJwb20ueG1sIjsKLSAgICAgICAgRmlsZSBvdXRwdXRGaWxlID0gbmV3IEZpbGUoIm91dHB1dC54bWwiKTsKLSAgICAgICAgRmlsZSB0ZW1wRmlsZSA9IG5ldyBGaWxlKCJ0ZXN0LmJpbiIpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBmaXJzdCBsZXQncyByZWFkIHRoZSB4bWwgZG9jdW1lbnQgaW4gdG8gQXhpb20KLSAgICAgICAgICAgIE9NRWxlbWVudCBlbGVtZW50ID0gbmV3IFN0QVhPTUJ1aWxkZXIoaW5wdXRGaWxlKS5nZXREb2N1bWVudEVsZW1lbnQoKTsKLQotICAgICAgICAgICAgLy8gb3V0cHV0IGl0IHVzaW5nIGJpbmFyeSB4bWwgb3V0cHV0dGVyCi0gICAgICAgICAgICBYTUxTdHJlYW1Xcml0ZXIgc3RyZWFtV3JpdGVyID0gbmV3IFN0QVhEb2N1bWVudFNlcmlhbGl6ZXIobmV3IEZpbGVPdXRwdXRTdHJlYW0odGVtcEZpbGUpKTsKLSAgICAgICAgICAgIHN0cmVhbVdyaXRlci53cml0ZVN0YXJ0RG9jdW1lbnQoKTsKLSAgICAgICAgICAgIGVsZW1lbnQuc2VyaWFsaXplQW5kQ29uc3VtZShzdHJlYW1Xcml0ZXIpOwotICAgICAgICAgICAgc3RyZWFtV3JpdGVyLndyaXRlRW5kRG9jdW1lbnQoKTsKLQotICAgICAgICAgICAgLy8gbm93IGxldCdzIHJlYWQgdGhlIGJpbmFyeSBmaWxlIGluIHRvIEF4aW9tCi0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgc3RyZWFtUmVhZGVyID0gbmV3IFN0QVhEb2N1bWVudFBhcnNlcihuZXcgRmlsZUlucHV0U3RyZWFtKHRlbXBGaWxlKSk7Ci0gICAgICAgICAgICBTdEFYQnVpbGRlciBidWlsZGVyID0gbmV3IFN0QVhPTUJ1aWxkZXIoc3RyZWFtUmVhZGVyKTsKLSAgICAgICAgICAgIGJ1aWxkZXIuZ2V0RG9jdW1lbnRFbGVtZW50KCkuc2VyaWFsaXplKG5ldyBGaWxlV3JpdGVyKG91dHB1dEZpbGUpKTsKLQotICAgICAgICAgICAgLy8gbGV0J3Mgc2VlIHRoaXMgaXMgdGhlIHNhbWUgdGhhdCB3ZSBmZWQgaW4gdG8gdGhpcyB0ZXN0IGluaXRpYWxseQotICAgICAgICAgICAgYXNzZXJ0WE1MRXF1YWwobmV3IEZpbGVSZWFkZXIoaW5wdXRGaWxlKSwgbmV3IEZpbGVSZWFkZXIob3V0cHV0RmlsZSkpOwotCi0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAob3V0cHV0RmlsZS5leGlzdHMoKSkgb3V0cHV0RmlsZS5kZWxldGUoKTsKLSAgICAgICAgICAgIGlmICh0ZW1wRmlsZS5leGlzdHMoKSkgdGVtcEZpbGUuZGVsZXRlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9mYXN0aW5mb3NldC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZmFzdGluZm9zZXQvRmFzdEluZm9zZXRUZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9mYXN0aW5mb3NldC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZmFzdGluZm9zZXQvRmFzdEluZm9zZXRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwYmY4ZWQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZmFzdGluZm9zZXQvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2Zhc3RpbmZvc2V0L0Zhc3RJbmZvc2V0VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5mYXN0aW5mb3NldDsKLQotaW1wb3J0IGp1bml0LmV4dGVuc2lvbnMuVGVzdFNldHVwOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuU2ltcGxlSFRUUFNlcnZlcjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlNlcnZlclNvY2tldDsKLWltcG9ydCBqYXZhLm5ldC5Tb2NrZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgRmFzdEluZm9zZXRUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgU2ltcGxlSFRUUFNlcnZlciBzZXJ2ZXI7Ci0JcHJpdmF0ZSBzdGF0aWMgQXhpc1NlcnZpY2Ugc2VydmljZTsKLQlwcml2YXRlIHN0YXRpYyBFbmRwb2ludFJlZmVyZW5jZSB0YXJnZXQ7Ci0JcHJpdmF0ZSBzdGF0aWMgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlndXJhdGlvbkNvbnRleHQ7Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZCgpIHRocm93cyBSZW1vdGVFeGNlcHRpb24gewotCQlTaW1wbGVBZGRTZXJ2aWNlQ2xpZW50IGNsaWVudCA9IG5ldyBTaW1wbGVBZGRTZXJ2aWNlQ2xpZW50KHRhcmdldCk7IC8vQ29tbWVudCB0byB0ZXN0IHdpdGggdGNwbW9uLgotLy8JCVNpbXBsZUFkZFNlcnZpY2VDbGllbnQgY2xpZW50ID0gbmV3IFNpbXBsZUFkZFNlcnZpY2VDbGllbnQoKTsgLy9VbmNvbW1lbnQgdG8gdGVzdCB3aXRoIHRjcG1vbi4KLQkJCi0JCVN0cmluZyByZXN1bHQgPSBjbGllbnQuYWRkU3RyaW5ncygiSGVsbG8gIiwgIldvcmxkISIpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIk91dHB1dDogIiArIHJlc3VsdCk7Ci0JCVRlc3RDYXNlLmFzc2VydEVxdWFscygiSGVsbG8gV29ybGQhIiwgcmVzdWx0KTsKLQkJCi0JCWludCByZXN1bHQxID0gY2xpZW50LmFkZEludHMoMTcsIDMzKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJPdXRwdXQ6ICIgKyByZXN1bHQxKTsKLQkJVGVzdENhc2UuYXNzZXJ0RXF1YWxzKDUwLCByZXN1bHQxKTsKLQkJCi0JCWZsb2F0IHJlc3VsdDIgPSBjbGllbnQuYWRkRmxvYXRzKDE3LjY0ZiwgMzIuMzZmKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJPdXRwdXQ6ICIgKyByZXN1bHQyKTsKLQkJVGVzdENhc2UuYXNzZXJ0RXF1YWxzKDUwLjBmLCByZXN1bHQyLCAwLjAwMDVmKTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGQyKCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIFNpbXBsZUFkZFNlcnZpY2VDbGllbnQgY2xpZW50ID0gbmV3IFNpbXBsZUFkZFNlcnZpY2VDbGllbnQodGFyZ2V0LCB0cnVlKTsgLy9Db21tZW50IHRvIHRlc3Qgd2l0aCB0Y3Btb24uCi0vLy8vCQlTaW1wbGVBZGRTZXJ2aWNlQ2xpZW50IGNsaWVudCA9IG5ldyBTaW1wbGVBZGRTZXJ2aWNlQ2xpZW50KCk7IC8vVW5jb21tZW50IHRvIHRlc3Qgd2l0aCB0Y3Btb24uCi0vLy8vCi0JCVN0cmluZyByZXN1bHQgPSBjbGllbnQuYWRkU3RyaW5ncygiSGVsbG8gIiwgIldvcmxkISIpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIk91dHB1dDogIiArIHJlc3VsdCk7Ci0JCVRlc3RDYXNlLmFzc2VydEVxdWFscygiSGVsbG8gV29ybGQhIiwgcmVzdWx0KTsKLQotCQlpbnQgcmVzdWx0MSA9IGNsaWVudC5hZGRJbnRzKDE3LCAzMyk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiT3V0cHV0OiAiICsgcmVzdWx0MSk7Ci0JCVRlc3RDYXNlLmFzc2VydEVxdWFscyg1MCwgcmVzdWx0MSk7Ci0KLQkJZmxvYXQgcmVzdWx0MiA9IGNsaWVudC5hZGRGbG9hdHMoMTcuNjRmLCAzMi4zNmYpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIk91dHB1dDogIiArIHJlc3VsdDIpOwotCQlUZXN0Q2FzZS5hc3NlcnRFcXVhbHMoNTAuMGYsIHJlc3VsdDIsIDAuMDAwNWYpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGludCBmaW5kQXZhaWxhYmxlUG9ydCgpIHRocm93cyBTb2NrZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJLy9DcmVhdGUgYSBzZXJ2ZXIgc29ja2V0IG9uIGFueSBmcmVlIHNvY2tldCB0byBmaW5kIGEgZnJlZSBzb2NrZXQuCi0JCVNlcnZlclNvY2tldCBzcyA9IG5ldyBTZXJ2ZXJTb2NrZXQoMCk7Ci0JCWludCBwb3J0ID0gc3MuZ2V0TG9jYWxQb3J0KCk7Ci0JCXNzLmNsb3NlKCk7Ci0gICAJCi0gICAgCXJldHVybiBwb3J0OwotICAgIH0KLQkKLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgVGVzdFNldHVwKG5ldyBUZXN0U3VpdGUoRmFzdEluZm9zZXRUZXN0LmNsYXNzKSkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU2V0dGluZyB1cCB0aGUgU2ltcGxlIEhUVFAgU2VydmVyIik7Ci0KLSAgICAgICAgICAgICAgICAgICAgaW50IHBvcnQgPSBmaW5kQXZhaWxhYmxlUG9ydCgpOwotICAgICAgICAgICAgICAgICAgICBwb3J0ID0gNTU1NTsgLy9VbmNvbW1lbnQgdG8gdGVzdCB3aXRoIHRjcG1vbgotICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBuZXcgRW5kcG9pbnRSZWZlcmVuY2UoImh0dHA6Ly8xMjcuMC4wLjE6IiArIChwb3J0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIi9heGlzMi9zZXJ2aWNlcy9TaW1wbGVBZGRTZXJ2aWNlIik7Ci0KLSAgICAgICAgICAgICAgICAgICAgRmlsZSBjb25maWdGaWxlID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJiYXNlZGlyIiwiLiIpICsgIi90ZXN0LXJlc291cmNlcy9heGlzMi54bWwiKTsKLSAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbkNvbnRleHQgPSBDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkKLSAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZUNvbmZpZ3VyYXRpb25Db250ZXh0RnJvbUZpbGVTeXN0ZW0oInRhcmdldC90ZXN0LWNsYXNzZXMiLCBjb25maWdGaWxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEFic29sdXRlUGF0aCgpKTsKLQotICAgICAgICAgICAgICAgICAgICBzZXJ2ZXIgPSBuZXcgU2ltcGxlSFRUUFNlcnZlcihjb25maWd1cmF0aW9uQ29udGV4dCwgcG9ydCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgc2VydmVyLnN0YXJ0KCk7Ci0KLSAgICAgICAgICAgICAgICBzZXJ2aWNlID0gQXhpc1NlcnZpY2UuY3JlYXRlU2VydmljZSgib3JnLmFwYWNoZS5heGlzMi5mYXN0aW5mb3NldC5TaW1wbGVBZGRTZXJ2aWNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlci5nZXRDb25maWd1cmF0aW9uQ29udGV4dCgpLmdldEF4aXNDb25maWd1cmF0aW9uKCkpOwotCi0gICAgICAgICAgICAgICAgc2VydmVyLmdldENvbmZpZ3VyYXRpb25Db250ZXh0KCkuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5hZGRTZXJ2aWNlKAotICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZSk7Ci0KLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlNpbXBsZSBIVFRQIFNlcnZlciBpcyBzdGFydGVkIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgIHNlcnZlci5zdG9wKCk7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU3RvcHBlZCB0aGUgU2ltcGxlIEhUVFAgU2VydmVyIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvZmFzdGluZm9zZXQvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2Zhc3RpbmZvc2V0L1NpbXBsZUFkZFNlcnZpY2UuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2Zhc3RpbmZvc2V0L3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9mYXN0aW5mb3NldC9TaW1wbGVBZGRTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhNWZkOTIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvZmFzdGluZm9zZXQvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2Zhc3RpbmZvc2V0L1NpbXBsZUFkZFNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5mYXN0aW5mb3NldDsKLQotcHVibGljIGNsYXNzIFNpbXBsZUFkZFNlcnZpY2UgewotCQotCXB1YmxpYyBpbnQgYWRkSW50cyhpbnQgdmFsMSwgaW50IHZhbDIpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJSZWNlaXZlZCAiICsgdmFsMSArICIgJiAiICsgdmFsMik7Ci0JCXJldHVybiB2YWwxICsgdmFsMjsKLQl9Ci0KLQlwdWJsaWMgZmxvYXQgYWRkRmxvYXRzKGZsb2F0IHZhbDEsIGZsb2F0IHZhbDIpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJSZWNlaXZlZCAiICsgdmFsMSArICIgJiAiICsgdmFsMik7Ci0JCXJldHVybiB2YWwxICsgdmFsMjsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBhZGRTdHJpbmdzKFN0cmluZyB2YWwxLCBTdHJpbmcgdmFsMikgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlJlY2VpdmVkICIgKyB2YWwxICsgIiAmICIgKyB2YWwyKTsKLQkJcmV0dXJuIHZhbDEgKyB2YWwyOwotCX0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2Zhc3RpbmZvc2V0L3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9mYXN0aW5mb3NldC9TaW1wbGVBZGRTZXJ2aWNlQ2xpZW50LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9mYXN0aW5mb3NldC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZmFzdGluZm9zZXQvU2ltcGxlQWRkU2VydmljZUNsaWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjgwMTFmLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2Zhc3RpbmZvc2V0L3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9mYXN0aW5mb3NldC9TaW1wbGVBZGRTZXJ2aWNlQ2xpZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmZhc3RpbmZvc2V0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50Lk9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuU2VydmljZUNsaWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmZhc3RpbmZvc2V0LlNpbXBsZUFkZFNlcnZpY2VTdHViOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZmFzdGluZm9zZXQuU2ltcGxlQWRkU2VydmljZVN0dWIuQWRkRmxvYXRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZmFzdGluZm9zZXQuU2ltcGxlQWRkU2VydmljZVN0dWIuQWRkRmxvYXRzUmVzcG9uc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5mYXN0aW5mb3NldC5TaW1wbGVBZGRTZXJ2aWNlU3R1Yi5BZGRJbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZmFzdGluZm9zZXQuU2ltcGxlQWRkU2VydmljZVN0dWIuQWRkSW50c1Jlc3BvbnNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZmFzdGluZm9zZXQuU2ltcGxlQWRkU2VydmljZVN0dWIuQWRkU3RyaW5nczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmZhc3RpbmZvc2V0LlNpbXBsZUFkZFNlcnZpY2VTdHViLkFkZFN0cmluZ3NSZXNwb25zZTsKLQotaW1wb3J0IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIFNpbXBsZUFkZFNlcnZpY2VDbGllbnQgewotCQotCXByaXZhdGUgU2ltcGxlQWRkU2VydmljZVN0dWIgc2VydmljZVN0dWI7Ci0JCi0JLyoqCi0JICogQHBhcmFtIGFyZ3MKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCXRyeSB7Ci0JCQlTaW1wbGVBZGRTZXJ2aWNlQ2xpZW50IGNsaWVudCA9IG5ldyBTaW1wbGVBZGRTZXJ2aWNlQ2xpZW50KCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlJlc3BvbnNlIDEgaXMgIiArIGNsaWVudC5hZGRTdHJpbmdzKCJIZWxsbyAiLCAiV29ybGQhIikpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJSZXNwb25zZSAyIGlzICIgKyBjbGllbnQuYWRkSW50cygyMywgMjcpKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiUmVzcG9uc2UgMyBpcyAiICsgY2xpZW50LmFkZEZsb2F0cygyMi44NGYsIDI3LjE2ZikpOwotCQl9IGNhdGNoIChBeGlzRmF1bHQgYWYpIHsKLQkJCWFmLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gcmUpIHsKLQkJCXJlLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIENvbnRydWN0b3Igd2hpY2ggdXNlcyAiaHR0cDovL2xvY2FsaG9zdDo4MDgxL2F4aXMyL3NlcnZpY2VzL1NpbXBsZUFkZFNlcnZpY2UiIGFzIHRoZSB0YXJnZXQuCi0JICogV2hlbiB0aGUgc2VycnZlciBydW5zIGF0IHBvcnQgODA4MCwgdGhpcyBjYW4gYmUgdXNlIHdpdGggdGNwbW9uIGZvciBkZWJ1Z2dpbmcuCi0JICogCi0JICogQHRocm93cyBBeGlzRmF1bHQKLQkgKi8KLQlwdWJsaWMgU2ltcGxlQWRkU2VydmljZUNsaWVudCgpIHRocm93cyBBeGlzRmF1bHQgewotCQl0aGlzKG5ldyBFbmRwb2ludFJlZmVyZW5jZSgiaHR0cDovL2xvY2FsaG9zdDo4MDgxL2F4aXMyL3NlcnZpY2VzL1NpbXBsZUFkZFNlcnZpY2UiKSk7Ci0JfQotCQotCS8qKgotCSAqIENvbnN0cnVjdG9yIHVzZWQgYnkgdGhlIGRlZmF1bHQgSlVuaXQgdGVzdCBjYXNlLgotCSAqIAotCSAqIEBwYXJhbSB0YXJnZXQKLQkgKiBAdGhyb3dzIEF4aXNGYXVsdAotCSAqLwotCXB1YmxpYyBTaW1wbGVBZGRTZXJ2aWNlQ2xpZW50KEVuZHBvaW50UmVmZXJlbmNlIHRhcmdldCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0JCUNvbmZpZ3VyYXRpb25Db250ZXh0IGNvbnRleHQgPSAKLQkJCUNvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeS5jcmVhdGVDb25maWd1cmF0aW9uQ29udGV4dEZyb21GaWxlU3lzdGVtKCJ0YXJnZXQvdGVzdC1jbGFzc2VzIiwgInRlc3QtcmVzb3VyY2VzL2F4aXMyLnhtbCIpOwotCQlzZXJ2aWNlU3R1YiA9IG5ldyBTaW1wbGVBZGRTZXJ2aWNlU3R1Yihjb250ZXh0LCB0YXJnZXQuZ2V0QWRkcmVzcygpKTsKLQkJLy9zZXJ2aWNlU3R1YiA9IG5ldyBTaW1wbGVBZGRTZXJ2aWNlU3R1YigpOwotCQlTZXJ2aWNlQ2xpZW50IGNsaWVudD0gIHNlcnZpY2VTdHViLl9nZXRTZXJ2aWNlQ2xpZW50KCk7Ci0JCU9wdGlvbnMgb3B0aW9ucyA9IGNsaWVudC5nZXRPcHRpb25zKCk7Ci0JCW9wdGlvbnMuc2V0UHJvcGVydHkoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uTUVTU0FHRV9UWVBFLCAiYXBwbGljYXRpb24vc29hcCtmYXN0aW5mb3NldCIpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIHVzZWQgYnkgdGhlIGRlZmF1bHQgSlVuaXQgdGVzdCBjYXNlLgotCSAqIAotCSAqIEBwYXJhbSB0YXJnZXQKLQkgKiBAdGhyb3dzIEF4aXNGYXVsdAotCSAqLwotCXB1YmxpYyBTaW1wbGVBZGRTZXJ2aWNlQ2xpZW50KEVuZHBvaW50UmVmZXJlbmNlIHRhcmdldCwgYm9vbGVhbiBwb3gpIHRocm93cyBBeGlzRmF1bHQgewotCQlDb25maWd1cmF0aW9uQ29udGV4dCBjb250ZXh0ID0gCi0JCQlDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkuY3JlYXRlQ29uZmlndXJhdGlvbkNvbnRleHRGcm9tRmlsZVN5c3RlbSgidGFyZ2V0L3Rlc3QtY2xhc3NlcyIsICJ0ZXN0LXJlc291cmNlcy9heGlzMi54bWwiKTsKLQkJc2VydmljZVN0dWIgPSBuZXcgU2ltcGxlQWRkU2VydmljZVN0dWIoY29udGV4dCwgdGFyZ2V0LmdldEFkZHJlc3MoKSk7Ci0JCS8vc2VydmljZVN0dWIgPSBuZXcgU2ltcGxlQWRkU2VydmljZVN0dWIoKTsKLQkJU2VydmljZUNsaWVudCBjbGllbnQ9ICBzZXJ2aWNlU3R1Yi5fZ2V0U2VydmljZUNsaWVudCgpOwotCQlPcHRpb25zIG9wdGlvbnMgPSBjbGllbnQuZ2V0T3B0aW9ucygpOwotCQlpZiAocG94KSB7Ci0JCQlvcHRpb25zLnNldFByb3BlcnR5KENvbnN0YW50cy5Db25maWd1cmF0aW9uLk1FU1NBR0VfVFlQRSwgImFwcGxpY2F0aW9uL2Zhc3RpbmZvc2V0Iik7Ci0JCX0gZWxzZSB7Ci0JCQlvcHRpb25zLnNldFByb3BlcnR5KENvbnN0YW50cy5Db25maWd1cmF0aW9uLk1FU1NBR0VfVFlQRSwgImFwcGxpY2F0aW9uL3NvYXArZmFzdGluZm9zZXQiKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGFkZFN0cmluZ3MoU3RyaW5nIHBhcmFtMCwgU3RyaW5nIHBhcmFtMSkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7Ci0JCUFkZFN0cmluZ3MgYWRkU3RyaW5ncyA9IG5ldyBTaW1wbGVBZGRTZXJ2aWNlU3R1Yi5BZGRTdHJpbmdzKCk7Ci0JCWFkZFN0cmluZ3Muc2V0VmFsMShwYXJhbTApOwotCQlhZGRTdHJpbmdzLnNldFZhbDIocGFyYW0xKTsKLQkJQWRkU3RyaW5nc1Jlc3BvbnNlIHJlc3BvbnNlMSA9IHNlcnZpY2VTdHViLmFkZFN0cmluZ3MoYWRkU3RyaW5ncyk7Ci0JCXJldHVybiByZXNwb25zZTEuZ2V0X3JldHVybigpOwotCX0KLQotCXB1YmxpYyBpbnQgYWRkSW50cyhpbnQgcGFyYW0wLCBpbnQgcGFyYW0xKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKLQkJQWRkSW50cyBhZGRJbnRzID0gbmV3IFNpbXBsZUFkZFNlcnZpY2VTdHViLkFkZEludHMoKTsKLQkJYWRkSW50cy5zZXRWYWwxKHBhcmFtMCk7Ci0JCWFkZEludHMuc2V0VmFsMihwYXJhbTEpOwotCQlBZGRJbnRzUmVzcG9uc2UgcmVzcG9uc2UyID0gc2VydmljZVN0dWIuYWRkSW50cyhhZGRJbnRzKTsKLQkJcmV0dXJuIHJlc3BvbnNlMi5nZXRfcmV0dXJuKCk7Ci0JfQotCQotCXB1YmxpYyBmbG9hdCBhZGRGbG9hdHMoZmxvYXQgcGFyYW0wLCBmbG9hdCBwYXJhbTEpIHRocm93cyBSZW1vdGVFeGNlcHRpb24gewotCQlBZGRGbG9hdHMgYWRkRmxvYXRzID0gbmV3IFNpbXBsZUFkZFNlcnZpY2VTdHViLkFkZEZsb2F0cygpOwotCQlhZGRGbG9hdHMuc2V0VmFsMShwYXJhbTApOwotCQlhZGRGbG9hdHMuc2V0VmFsMihwYXJhbTEpOwotCQlBZGRGbG9hdHNSZXNwb25zZSByZXNwb25zZTMgPSBzZXJ2aWNlU3R1Yi5hZGRGbG9hdHMoYWRkRmxvYXRzKTsKLQkJcmV0dXJuIHJlc3BvbnNlMy5nZXRfcmV0dXJuKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vY29uZi9heGlzMi54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi9jb25mL2F4aXMyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmQ0M2E4OC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi9jb25mL2F4aXMyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIzNiArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxheGlzY29uZmlnIG5hbWU9IkF4aXNKYXZhMi4wIj4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBQYXJhbWV0ZXJzIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImhvdGRlcGxveW1lbnQiPnRydWU8L3BhcmFtZXRlcj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImhvdHVwZGF0ZSI+ZmFsc2U8L3BhcmFtZXRlcj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImVuYWJsZU1UT00iPmZhbHNlPC9wYXJhbWV0ZXI+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJlbmFibGVTd0EiPmZhbHNlPC9wYXJhbWV0ZXI+Ci0KLSAgICA8IS0tVW5jb21tZW50IGlmIHlvdSB3YW50IHRvIGVuYWJsZSBmaWxlIGNhY2hpbmcgZm9yIGF0dGFjaG1lbnRzIC0tPgotICAgIDwhLS1wYXJhbWV0ZXIgbmFtZT0iY2FjaGVBdHRhY2htZW50cyI+dHJ1ZTwvcGFyYW1ldGVyPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iYXR0YWNobWVudERJUiI+PC9wYXJhbWV0ZXI+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJzaXplVGhyZXNob2xkIj40MDAwPC9wYXJhbWV0ZXItLT4KLQotICAgIDwhLS1UaGlzIHdpbGwgZ2l2ZSBvdXQgdGhlIHRpbW91dCBvZiB0aGUgY29uZmlndXJhdGlvbiBjb250ZXh0cywgaW4gc2Vjb25kcy0tPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iQ29uZmlnQ29udGV4dFRpbWVvdXRJbnRlcnZhbCI+MzA8L3BhcmFtZXRlcj4KLQotICAgIDwhLS1EdXJpbmcgYSBmYXVsdCwgc3RhY2t0cmFjZSBjYW4gYmUgc2VudCB3aXRoIHRoZSBmYXVsdCBtZXNzYWdlLiBUaGUgZm9sbG93aW5nIGZsYWcgd2lsbCBjb250cm9sIC0tPgotICAgIDwhLS10aGF0IGJlaGF2aW91ci4tLT4KLSAgICA8cGFyYW1ldGVyIG5hbWU9InNlbmRTdGFja3RyYWNlRGV0YWlsc1dpdGhGYXVsdHMiPnRydWU8L3BhcmFtZXRlcj4KLQotICAgIDwhLS1JZiB0aGVyZSBhcmVuJ3QgYW55IGluZm9ybWF0aW9uIGF2YWlsYWJsZSB0byBmaW5kIG91dCB0aGUgZmF1bHQgcmVhc29uLCB3ZSBzZXQgdGhlIG1lc3NhZ2Ugb2YgdGhlIGV4cGNldGlvbi0tPgotICAgIDwhLS1hcyB0aGUgZmF1bHRyZWFzb24vUmVhc29uLiBCdXQgd2hlbiBhIGZhdWx0IGlzIHRocm93biBmcm9tIGEgc2VydmljZSBvciBzb21lIHdoZXJlLCBpdCB3aWxsIGJlIC0tPgotICAgIDwhLS13cmFwcGVkIGJ5IGRpZmZlcmVudCBsZXZlbHMuIER1ZSB0byB0aGlzIHRoZSBpbml0aWFsIGV4Y2VwdGlvbiBtZXNzYWdlIGNhbiBiZSBsb3N0LiBJZiB0aGlzIGZsYWctLT4KLSAgICA8IS0taXMgc2V0IHRoZW4sIEF4aXMyIHRyaWVzIHRvIGdldCB0aGUgZmlyc3QgZXhjZXB0aW9uIGFuZCBzZXQgaXRzIG1lc3NhZ2UgYXMgdGhlIGZhdWx0cmVhc29uL1JlYXNvbi4tLT4KLSAgICA8cGFyYW1ldGVyIG5hbWU9IkRyaWxsRG93blRvUm9vdENhdXNlRm9yRmF1bHRSZWFzb24iPmZhbHNlPC9wYXJhbWV0ZXI+Ci0KLSAgICA8cGFyYW1ldGVyIG5hbWU9InVzZXJOYW1lIj5hZG1pbjwvcGFyYW1ldGVyPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFzc3dvcmQiPmF4aXMyPC9wYXJhbWV0ZXI+Ci0KLSAgICA8IS0tRm9sbG93aW5nIHBhcmFtcyB3aWxsIHNldCB0aGUgcHJvcGVyIGNvbnRleHQgcGF0aHMgZm9yIGludm9jYXRpb25zLiBBbGwgdGhlIGVuZHBvaW50cyB3aWxsIGhhdmUgYSBjb21tb25zIGNvbnRleHQtLT4KLSAgICA8IS0tcm9vdCB3aGljaCBjYW4gY29uZmlndXJlZCB1c2luZyB0aGUgZm9sbG93aW5nIGNvbnRleHRSb290IHBhcmFtZXRlci0tPgotICAgIDwhLS08cGFyYW1ldGVyIG5hbWU9ImNvbnRleHRSb290Ij5heGlzMjwvcGFyYW1ldGVyPi0tPgotCi0gICAgPCEtLU91ciBIVFRQIGVuZHBvaW50cyBjYW4gaGFuZGxlIGJvdGggUkVTVCBhbmQgU09BUC4gRm9sbG93aW5nIHBhcmFtZXRlcnMgY2FuIGJlIHVzZWQgdG8gZGlzdGluZ2l1c2ggdGhvc2UgZW5kcG9pbnRzLS0+Ci0gICAgPCEtLUluIGNhc2Ugb2YgYSBzZXJ2bGV0LCBpZiB5b3UgY2hhbmdlIHRoaXMgeW91IGhhdmUgdG8gbWFudWFsbHkgY2hhbmdlIHRoZSBzZXR0aW5ncyBvZiB5b3VyIHNlcnZsZXQgY29udGFpbmVyIHRvIG1hcCB0aGlzIC0tPgotICAgIDwhLS1jb250ZXh0IHBhdGggdG8gcHJvcGVyIEF4aXMyIHNlcnZsZXRzLS0+Ci0gICAgPCEtLTxwYXJhbWV0ZXIgbmFtZT0ic2VydmljZVBhdGgiPnNlcnZpY2VzPC9wYXJhbWV0ZXI+LS0+Ci0gICAgPCEtLTxwYXJhbWV0ZXIgbmFtZT0icmVzdFBhdGgiPnJlc3Q8L3BhcmFtZXRlcj4tLT4KLQotCi0gICAgPCEtLVNldCB0aGUgZmxhZyB0byB0cnVlIGlmIHlvdSB3YW50IHRvIGVuYWJsZSB0cmFuc3BvcnQgbGV2ZWwgc2Vzc2lvbiBtYW5nbWVudC0tPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0ibWFuYWdlVHJhbnNwb3J0U2Vzc2lvbiI+ZmFsc2U8L3BhcmFtZXRlcj4KLQotICAgIDwhLS1Gb2xsb3dpbmcgdHdvIHBhcmFtZXRlcnMgd2lsbCBiZSB1c2VkIHRvIGhhbmRsZSBSRVNUIGluIEF4aXMyLiBUaGUgZGVmYXVsdCBzZXR0aW5ncyB3aWxsIG1ha2UgQXhpczIgdG8gaGF2ZSB0d28tLT4KLSAgICA8IS0tZGlmZmVyZW50IGVuZHBvaW50cywgb25lIGZvciBSRVNUIChBeGlzUkVTVFNlcnZsZXQpIG9uZSBmb3IgU09BUCBtZXNzYWdlIGhhbmRsaW5nIChBeGlzU2VydmxldCkuIEJ1dCBmb2xsb3dpbmctLT4KLSAgICA8IS0tcGFyYW1ldGVycyBoZWxwIHRvIHR3ZWFrIHRoZSBtZXNzYWdlIGhhbmRsaW5nIG9mIHR3byBtYWluIHNlcnZsZXRzLiAtLT4KLQotICAgIDwhLS0gSWYgdGhlIGVuYWJsZVJFU1RJbkF4aXMyTWFpblNlcnZsZXQgaXMgdHJ1ZSwgdGhlbiBBeGlzMk1haW5TZXJ2bGV0IHdpbGwgaGFuZGxlIGJvdGggU09BUCBhbmQgUkVTVCBtZXNzYWdlcyAtLT4KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImVuYWJsZVJFU1RJbkF4aXMyTWFpblNlcnZsZXQiIGxvY2tlZD0idHJ1ZSI+ZmFsc2U8L3BhcmFtZXRlcj4KLQotICAgIDwhLS0gRm9sbG93aW5nIHBhcmFtZXRlciB3aWxsIGNvbXBsZXRlbHkgZGlzYWJsZSBSRVNUIGhhbmRsaW5nIGluIGJvdGggdGhlIHNlcnZsZXRzLS0+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJkaXNhYmxlUkVTVCIgbG9ja2VkPSJ0cnVlIj5mYWxzZTwvcGFyYW1ldGVyPgotCi0gICAgPCEtLSBUaGlzIHdpbGwgZGlzYWJsZSB0aGUgc2VwYXJhdGUgc2VydmxldCB3ZSBoYXZlIGZvciBSRVNUIGhhbmRsaW5nLiAtLT4KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImRpc2FibGVTZXBhcmF0ZUVuZHBvaW50Rm9yUkVTVCIgbG9ja2VkPSJ0cnVlIj5mYWxzZTwvcGFyYW1ldGVyPgotCi0gICAgPCEtLSBJZiB5b3UgaGF2ZSBhIGZyb250ZW5kIGhvc3Qgd2hpY2ggZXhwb3NlcyB0aGlzIHdlYnNlcnZpY2UgdXNpbmcgYSBkaWZmZXJlbnQgcHVibGljIFVSTCAgLS0+Ci0gICAgPCEtLSB1c2UgdGhpcyBwYXJhbWV0ZXIgdG8gb3ZlcnJpZGUgYXV0b2RldGVjdGVkIHVybCAtLT4KLSAgICA8IS0tPHBhcmFtZXRlciBuYW1lPSJodHRwRnJvbnRlbmRIb3N0VXJsIj5odHRwczovL3NvbWVvdGhlcmhvc3QvY29udGV4dDwvcGFyYW1ldGVyPi0tPgotCi0KLSAgICA8IS0tICAgIFRoZSB3YXkgb2YgYWRkaW5nIGxpc3RlbmVyIHRvIHRoZSBzeXN0ZW0tLT4KLSAgICA8IS0tICAgIDxsaXN0ZW5lciBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5PYnNlcnZlcklNUEwiPi0tPgotICAgIDwhLS0gICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iUlNTX1VSTCI+aHR0cDovLzEyNy4wLjAuMS9yc3M8L3BhcmFtZXRlcj4tLT4KLSAgICA8IS0tICAgIDwvbGlzdGVuZXI+LS0+Ci0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBNZXNzYWdlIFJlY2VpdmVycyAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLVRoaXMgaXMgdGhlIERlYWZ1bHQgTWVzc2FnZSBSZWNlaXZlciBmb3IgdGhlIHN5c3RlbSAsIGlmIHlvdSB3YW50IHRvIGhhdmUgTWVzc2FnZVJlY2VpdmVycyBmb3IgLS0+Ci0gICAgPCEtLWFsbCB0aGUgb3RoZXIgTUVQIGltcGxlbWVudCBpdCBhbmQgYWRkIHRoZSBjb3JyZWN0IGVudHJ5IHRvIGhlcmUgLCBzbyB0aGF0IHlvdSBjYW4gcmVmZXIgZnJvbS0tPgotICAgIDwhLS1hbnkgb3BlcmF0aW9uIC0tPgotICAgIDwhLS1Ob3RlIDogWW91IGNhbiBvdnJpZGUgdGhpcyBmb3IgcGFydGljdWxhciBzZXJ2aWNlIGJ5IGFkZGluZyB0aGUgc2FtZSBlbGVtZW50IHdpdGggeW91ciByZXF1aXJlbWVudC0tPgotICAgIDxtZXNzYWdlUmVjZWl2ZXJzPgotICAgICAgICA8bWVzc2FnZVJlY2VpdmVyIG1lcD0iaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC93c2RsL2luLW9ubHkiCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLlJhd1hNTElOT25seU1lc3NhZ2VSZWNlaXZlciIvPgotICAgICAgICA8bWVzc2FnZVJlY2VpdmVyIG1lcD0iaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC93c2RsL2luLW91dCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuUmF3WE1MSU5PdXRNZXNzYWdlUmVjZWl2ZXIiLz4KLSAgICA8L21lc3NhZ2VSZWNlaXZlcnM+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gVHJhbnNwb3J0IElucyAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPHRyYW5zcG9ydFJlY2VpdmVyIG5hbWU9Imh0dHAiCi0gICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLlNpbXBsZUhUVFBTZXJ2ZXIiPgotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9InBvcnQiPjYwNjA8L3BhcmFtZXRlcj4KLSAgICAgICAgPCEtLSBIZXJlIGlzIHRoZSBjb21wbGV0ZSBsaXN0IG9mIHN1cHBvcnRlZCBwYXJhbWV0ZXJzIChzZWUgZXhhbXBsZSBzZXR0aW5ncyBmdXJ0aGVyIGJlbG93KToKLSAgICAgICAgICAgIHBvcnQ6IHRoZSBwb3J0IHRvIGxpc3RlbiBvbiAoZGVmYXVsdCA2MDYwKQotICAgICAgICAgICAgaG9zdG5hbWU6ICBpZiBub24tbnVsbCwgdXJsIHByZWZpeCB1c2VkIGluIHJlcGx5LXRvIGVuZHBvaW50IHJlZmVyZW5jZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdCBudWxsKQotICAgICAgICAgICAgb3JpZ2luU2VydmVyOiAgdmFsdWUgb2YgaHR0cCBTZXJ2ZXIgaGVhZGVyIGluIG91dGdvaW5nIG1lc3NhZ2VzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdCAiU2ltcGxlLVNlcnZlci8xLjEiKQotICAgICAgICAgICAgcmVxdWVzdFRpbWVvdXQ6ICB2YWx1ZSBpbiBtaWxsaXMgb2YgdGltZSB0aGF0IHJlcXVlc3RzIGNhbiB3YWl0IGZvciBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdCAyMDAwMCkKLSAgICAgICAgICAgIHJlcXVlc3RUY3BOb0RlbGF5OiAgdHJ1ZSB0byBtYXhpbWl6ZSBwZXJmb3JtYW5jZSBhbmQgbWluaW1pemUgbGF0ZW5jeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQgdHJ1ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgdG8gbWluaW1pemUgYmFuZHdpZHRoIGNvbnN1bXB0aW9uIGJ5IGNvbWJpbmluZyBzZWdtZW50cwotICAgICAgICAgICAgcmVxdWVzdENvcmVUaHJlYWRQb29sU2l6ZTogIG51bWJlciBvZiB0aHJlYWRzIGF2YWlsYWJsZSBmb3IgcmVxdWVzdCBwcm9jZXNzaW5nICh1bmxlc3MgcXVldWUgZmlsbHMgdXApICAoZGVmYXVsdCAyNSkKLSAgICAgICAgICAgIHJlcXVlc3RNYXhUaHJlYWRQb29sU2l6ZTogIG51bWJlciBvZiB0aHJlYWRzIGF2YWlsYWJsZSBmb3IgcmVxdWVzdCBwcm9jZXNzaW5nIGlmIHF1ZXVlIGZpbGxzIHVzICAgICAgICAgKGRlZmF1bHQgMTUwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90ZSB0aGF0IGRlZmF1bHQgcXVldWUgbmV2ZXIgZmlsbHMgdXA6ICBzZWUgSHR0cEZhY3RvcnkKLSAgICAgICAgICAgIHRocmVhZEtlZXBBbGl2ZVRpbWU6ICB0aW1lIHRvIGtlZXAgdGhyZWFkcyBpbiBleGNlc3Mgb2YgY29yZSBzaXplIGFsaXZlIHdoaWxlIGluYWN0aXZlICAgICAgICAgICAgICAgICAgKGRlZmF1bHQgMTgwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGUgdGhhdCBubyBzdWNoIHRocmVhZHMgY2FuIGV4aXN0IHdpdGggZGVmYXVsdCB1bmJvdW5kZWQgcmVxdWVzdCBxdWV1ZQotICAgICAgICAgICAgdGhyZWFkS2VlcEFsaXZlVGltZVVuaXQ6ICBUaW1lVW5pdCBvZiB2YWx1ZSBpbiB0aHJlYWRLZWVwQWxpdmVUaW1lIChkZWZhdWx0IFNFQ09ORFMpICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdCBTRUNPTkRTKQotICAgICAgICAtLT4KLSAgICAgICAgPCEtLSA8cGFyYW1ldGVyIG5hbWU9Imhvc3RuYW1lIiAgICAgICAgICAgICAgICAgPmh0dHA6Ly93d3cubXlBcHAuY29tL3dzPC9wYXJhbWV0ZXI+IC0tPgotICAgICAgICA8IS0tIDxwYXJhbWV0ZXIgbmFtZT0ib3JpZ2luU2VydmVyIiAgICAgICAgICAgICA+TXktU2VydmVyLzEuMTwvcGFyYW1ldGVyPiAgICAgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gPHBhcmFtZXRlciBuYW1lPSJyZXF1ZXN0VGltZW91dCIgICAgICAgICAgID4xMDAwMDwvcGFyYW1ldGVyPiAgICAgICAgICAgICAgICAgICAtLT4KLSAgICAgICAgPCEtLSA8cGFyYW1ldGVyIG5hbWU9InJlcXVlc3RUY3BOb0RlbGF5IiAgICAgICAgPmZhbHNlPC9wYXJhbWV0ZXI+ICAgICAgICAgICAgICAgICAgIC0tPgotICAgICAgICA8IS0tIDxwYXJhbWV0ZXIgbmFtZT0icmVxdWVzdENvcmVUaHJlYWRQb29sU2l6ZSI+NTA8L3BhcmFtZXRlcj4gICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gPHBhcmFtZXRlciBuYW1lPSJyZXF1ZXN0TWF4VGhyZWFkUG9vbFNpemUiID4xMDA8L3BhcmFtZXRlcj4gICAgICAgICAgICAgICAgICAgICAtLT4KLSAgICAgICAgPCEtLSA8cGFyYW1ldGVyIG5hbWU9InRocmVhZEtlZXBBbGl2ZVRpbWUiICAgICAgPjI0MDAwMDwvcGFyYW1ldGVyPiAgICAgICAgICAgICAgICAgIC0tPgotICAgICAgICA8IS0tIDxwYXJhbWV0ZXIgbmFtZT0idGhyZWFkS2VlcEFsaXZlVGltZVVuaXQiICA+TUlMTElTRUNPTkRTPC9wYXJhbWV0ZXI+ICAgICAgICAgICAgLS0+Ci0gICAgPC90cmFuc3BvcnRSZWNlaXZlcj4KLSAgICAKLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBUcmFuc3BvcnQgT3V0cyAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0KLSAgICA8dHJhbnNwb3J0U2VuZGVyIG5hbWU9ImxvY2FsIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0LmxvY2FsLkxvY2FsVHJhbnNwb3J0U2VuZGVyIi8+Ci0gICAgPHRyYW5zcG9ydFNlbmRlciBuYW1lPSJodHRwIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuQ29tbW9uc0hUVFBUcmFuc3BvcnRTZW5kZXIiPgotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9IlBST1RPQ09MIj5IVFRQLzEuMTwvcGFyYW1ldGVyPgotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9IlRyYW5zZmVyLUVuY29kaW5nIj5jaHVua2VkPC9wYXJhbWV0ZXI+Ci0gICAgPC90cmFuc3BvcnRTZW5kZXI+Ci0gICAgPHRyYW5zcG9ydFNlbmRlciBuYW1lPSJodHRwcyIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkNvbW1vbnNIVFRQVHJhbnNwb3J0U2VuZGVyIj4KLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJQUk9UT0NPTCI+SFRUUC8xLjE8L3BhcmFtZXRlcj4KLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJUcmFuc2Zlci1FbmNvZGluZyI+Y2h1bmtlZDwvcGFyYW1ldGVyPgotICAgIDwvdHJhbnNwb3J0U2VuZGVyPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIEdsb2JhbCBNb2R1bGVzICAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBDb21tZW50IHRoaXMgdG8gZGlzYWJsZSBBZGRyZXNzaW5nIC0tPgotICAgIDxtb2R1bGUgcmVmPSJhZGRyZXNzaW5nIi8+Ci0KLSAgICA8IS0tQ29uZmlndXJpbmcgbW9kdWxlICwgcHJvdmlkaW5nIHBhcmFtZXRlcnMgZm9yIG1vZHVsZXMgd2hldGhlciB0aGV5IHJlZmVyIG9yIG5vdC0tPgotICAgIDxtb2R1bGVDb25maWcgbmFtZT0iYWRkcmVzc2luZyI+Ci0gICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iaW5jbHVkZU9wdGlvbmFsSGVhZGVycyI+dHJ1ZTwvcGFyYW1ldGVyPgotICAgIDwvbW9kdWxlQ29uZmlnPgotCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gUGhhc2VzICAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPHBoYXNlT3JkZXIgdHlwZT0iSW5GbG93Ij4KLSAgICAgICAgPCEtLSAgU3lzdGVtIHByZSBkZWZpbmVkIHBoYXNlcyAgICAgICAtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlRyYW5zcG9ydCI+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJSZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciI+Ci0gICAgICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJUcmFuc3BvcnQiLz4KLSAgICAgICAgICAgIDwvaGFuZGxlcj4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlJlcXVlc3RVUklPcGVyYXRpb25EaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSU9wZXJhdGlvbkRpc3BhdGNoZXIiLz4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIj4KLSAgICAgICAgICAgICAgICA8b3JkZXIgcGhhc2U9IlRyYW5zcG9ydCIvPgotICAgICAgICAgICAgPC9oYW5kbGVyPgotICAgICAgICA8L3BoYXNlPgotICAgICAgICA8cGhhc2UgbmFtZT0iQWRkcmVzc2luZyI+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJBZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciI+Ci0gICAgICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJBZGRyZXNzaW5nIi8+Ci0gICAgICAgICAgICA8L2hhbmRsZXI+Ci0gICAgICAgIDwvcGhhc2U+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJTZWN1cml0eSIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iUHJlRGlzcGF0Y2giLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9IkRpc3BhdGNoIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuRGlzcGF0Y2hQaGFzZSI+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJSZXF1ZXN0VVJJT3BlcmF0aW9uRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklPcGVyYXRpb25EaXNwYXRjaGVyIi8+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiLz4KLSAgICAgICAgPC9waGFzZT4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlJNUGhhc2UiLz4KLSAgICAgICAgPCEtLSAgU3lzdGVtIHByZSBkZWZpbmVkIHBoYXNlcyAgICAgICAtLT4KLSAgICAgICAgPCEtLSAgIEFmdGVyIFBvc3RkaXNwYXRjaCBwaGFzZSBtb2R1bGUgYXV0aG9yIG9yIG9yIHNlcnZpY2UgYXV0aG9yIGNhbiBhZGQgYW55IHBoYXNlIGhlIHdhbnQgICAgICAtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik9wZXJhdGlvbkluUGhhc2UiLz4KLSAgICA8L3BoYXNlT3JkZXI+Ci0gICAgPHBoYXNlT3JkZXIgdHlwZT0iT3V0RmxvdyI+Ci0gICAgICAgIDwhLS0gICAgICB1c2VyIGNhbiBhZGQgaGlzIG93biBwaGFzZXMgdG8gdGhpcyBhcmVhICAtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik9wZXJhdGlvbk91dFBoYXNlIi8+Ci0gICAgICAgIDwhLS1zeXN0ZW0gcHJlZGVmaW5lZCBwaGFzZS0tPgotICAgICAgICA8IS0tdGhlc2UgcGhhc2Ugd2lsbCBydW4gaXJyZXNwZWN0aXZlIG9mIHRoZSBzZXJ2aWNlLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJSTVBoYXNlIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJQb2xpY3lEZXRlcm1pbmF0aW9uIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJNZXNzYWdlT3V0Ii8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJTZWN1cml0eSIvPgotICAgIDwvcGhhc2VPcmRlcj4KLSAgICA8cGhhc2VPcmRlciB0eXBlPSJJbkZhdWx0RmxvdyI+Ci0gICAgICAgPHBoYXNlIG5hbWU9IkFkZHJlc3NpbmciPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiPgotICAgICAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iQWRkcmVzc2luZyIvPgotICAgICAgICAgICAgPC9oYW5kbGVyPgotICAgICAgICA8L3BoYXNlPgotICAgICAgICA8cGhhc2UgbmFtZT0iU2VjdXJpdHkiLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlByZURpc3BhdGNoIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJEaXNwYXRjaCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkRpc3BhdGNoUGhhc2UiPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiLz4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIi8+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJSZXF1ZXN0VVJJT3BlcmF0aW9uRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklPcGVyYXRpb25EaXNwYXRjaGVyIi8+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiLz4KLQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iSFRUUExvY2F0aW9uQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuSFRUUExvY2F0aW9uQmFzZWREaXNwYXRjaGVyIi8+Ci0gICAgICAgIDwvcGhhc2U+ICAgICAgICA8cGhhc2UgbmFtZT0iUk1QaGFzZSIvPgotICAgICAgICA8IS0tICAgICAgdXNlciBjYW4gYWRkIGhpcyBvd24gcGhhc2VzIHRvIHRoaXMgYXJlYSAgLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJPcGVyYXRpb25JbkZhdWx0UGhhc2UiLz4KLSAgICA8L3BoYXNlT3JkZXI+Ci0gICAgPHBoYXNlT3JkZXIgdHlwZT0iT3V0RmF1bHRGbG93Ij4KLSAgICAgICAgPCEtLSAgICAgIHVzZXIgY2FuIGFkZCBoaXMgb3duIHBoYXNlcyB0byB0aGlzIGFyZWEgIC0tPgotICAgICAgICA8cGhhc2UgbmFtZT0iT3BlcmF0aW9uT3V0RmF1bHRQaGFzZSIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iUk1QaGFzZSIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iUG9saWN5RGV0ZXJtaW5hdGlvbiIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iTWVzc2FnZU91dCIvPgotICAgIDwvcGhhc2VPcmRlcj4KLTwvYXhpc2NvbmZpZz4KLQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vaXRlc3QtYnVpbGQueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vaXRlc3QtYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMWJmZjU5Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL2l0ZXN0LWJ1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08cHJvamVjdCBuYW1lPSJpdGVzdCIgZGVmYXVsdD0iYnVpbGQtcmVwb3MiIGJhc2VkaXI9Ii4iPgotCi0JPHRhcmdldCBuYW1lPSJnZW5lcmF0ZS10ZXN0LXNvdXJjZXMiIHVubGVzcz0idGVzdC5za2lwIj4KLQkJPCEtLSBTZXQgYSBwcm9wZXJ0eSB0aGF0IGNhbiBiZSBwaWNrZWQgdXAgZnJvbSB0aGUgYW50IGJ1aWxkLnhtbCdzIC0tPgotCi0JCTxlY2hvPiR7bWF2ZW4udGVzdC5wYXRofTwvZWNobz4KLQkJPCEtLSBjb3B5IHRoZSBtYXJzIHNvIHRoYXQgdGhleSBhcmUgYXZhaWxhYmxlIG9uIHRoZSB0ZXN0IGNsYXNzcGF0aCAtLT4KLQkJPGNvcHkgZmlsZT0iLi4vYWRkcmVzc2luZy90YXJnZXQvYWRkcmVzc2luZy0ke2FkZHJlc3NpbmdfdmVyc2lvbn0ubWFyIiB0b2ZpbGU9InRhcmdldC90ZXN0LWNsYXNzZXMvbW9kdWxlcy9hZGRyZXNzaW5nLSR7YWRkcmVzc2luZ192ZXJzaW9ufS5tYXIiIC8+Ci0KLQkJPHByb3BlcnR5IG5hbWU9ImF4aXMyLmhvbWUiIHZhbHVlPSIke2Jhc2VkaXJ9L3RhcmdldCIgLz4KLQkJPHByb3BlcnR5IG5hbWU9Im1hdmVuLmp1bml0Lmp2bWFyZ3MiIHZhbHVlPSIiIC8+Ci0JCTxwYXRoIGlkPSJtYXZlbi5kZXBlbmRlbmN5LmNsYXNzcGF0aCI+Ci0JCQk8cGF0aCByZWZpZD0ibWF2ZW4uY29tcGlsZS5jbGFzc3BhdGgiIC8+Ci0JCTwvcGF0aD4KLQkJPCEtLSBjb21waWxpbmcgc29tZSBjdXN0b20gd3NkbCBmaWxlcyAtLT4KLQkJPHByb3BlcnR5IG5hbWU9IndzZGwuc291cmNlLmRpciIgdmFsdWU9InRlc3QtcmVzb3VyY2VzL3dzZGwiIC8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ3c2RsLm91dHB1dC5iYXNlLmRpciIgdmFsdWU9InRhcmdldC93c2RsIiAvPgotCQk8IS0tIG1ha2UgdGhlIGRpcnMgLS0+Ci0JCTxta2RpciBkaXI9IiR7d3NkbC5vdXRwdXQuYmFzZS5kaXJ9IiAvPgotCi0JCTxlY2hvPkNvbXBpbGluZyBDb21wbGV4RGF0YVR5cGVzLndzZGw8L2VjaG8+Ci0JCTxta2RpciBkaXI9IiR7d3NkbC5vdXRwdXQuYmFzZS5kaXJ9L2NvbXBsZXhkYXRhdHlwZSIgLz4KLQotCQk8amF2YSBjbGFzc25hbWU9Im9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMMkphdmEiIGZvcms9InRydWUiPgotCQkJPGNsYXNzcGF0aCByZWZpZD0ibWF2ZW4ucnVudGltZS5jbGFzc3BhdGgiIC8+Ci0JCQk8Y2xhc3NwYXRoIGxvY2F0aW9uPSIke2NvbXBpbGVkLmNsYXNzZXMuZGlyfSIgLz4KLQkJCTxhcmcgbGluZT0iLWFwIC1vIHRhcmdldC93c2RsL2NvbXBsZXhkYXRhdHlwZSAtcyAtdSAtdXcgLXVyaSB0ZXN0LXJlc291cmNlcy9Db21wbGV4RGF0YVR5cGVzL0NvbXBsZXhEYXRhVHlwZXMud3NkbCIgLz4KLQkJPC9qYXZhPgotCQk8amF2YWMgZm9yaz0idHJ1ZSIgZGVzdGRpcj0idGFyZ2V0L2NsYXNzZXMiIGRlYnVnPSJvbiI+Ci0JCQk8Y2xhc3NwYXRoIHJlZmlkPSJtYXZlbi5ydW50aW1lLmNsYXNzcGF0aCIgLz4KLQkJCTxjbGFzc3BhdGggbG9jYXRpb249IiR7Y29tcGlsZWQuY2xhc3Nlcy5kaXJ9IiAvPgotCQkJPHNyYyBwYXRoPSJ0YXJnZXQvd3NkbC9jb21wbGV4ZGF0YXR5cGUiIC8+Ci0JCTwvamF2YWM+Ci0KLQkJPGVjaG8+Q29tcGlsaW5nIERvY3VtZW50VW53cmFwcGluZ1Rlc3Qud3NkbDwvZWNobz4KLQkJPG1rZGlyIGRpcj0iJHt3c2RsLm91dHB1dC5iYXNlLmRpcn0vZG9jdW1lbnR1bndyYXBwaW5nIiAvPgotCi0JCTxqYXZhIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5heGlzMi53c2RsLldTREwySmF2YSIgZm9yaz0idHJ1ZSI+Ci0JCQk8Y2xhc3NwYXRoIHJlZmlkPSJtYXZlbi5ydW50aW1lLmNsYXNzcGF0aCIgLz4KLQkJCTxjbGFzc3BhdGggbG9jYXRpb249IiR7Y29tcGlsZWQuY2xhc3Nlcy5kaXJ9IiAvPgotCQkJPGFyZyBsaW5lPSItYXAgLW8gdGFyZ2V0L3dzZGwvZG9jdW1lbnR1bndyYXBwaW5nIC1zcyAtc2QgLXNzaSAtdSAgLWcgLXV3IC11cmkgdGVzdC1yZXNvdXJjZXMvd3NkbC9Eb2N1bWVudFVud3JhcHBpbmdUZXN0LndzZGwiIC8+Ci0JCTwvamF2YT4KLQkJPGFudCBhbnRmaWxlPSJidWlsZC54bWwiIGluaGVyaXRhbGw9InRydWUiIGluaGVyaXRyZWZzPSJ0cnVlIiBkaXI9InRhcmdldC93c2RsL2RvY3VtZW50dW53cmFwcGluZyIgLz4KLQotCQk8ZWNobz5Db21waWxpbmcgUlBDVW53cmFwcGluZ1Rlc3Qud3NkbDwvZWNobz4KLQkJPG1rZGlyIGRpcj0iJHt3c2RsLm91dHB1dC5iYXNlLmRpcn0vcnBjdW53cmFwcGluZyIgLz4KLQkJPGphdmEgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmF4aXMyLndzZGwuV1NETDJKYXZhIiBmb3JrPSJ0cnVlIj4KLQotCQkJPGNsYXNzcGF0aCByZWZpZD0ibWF2ZW4ucnVudGltZS5jbGFzc3BhdGgiIC8+Ci0JCQk8Y2xhc3NwYXRoIGxvY2F0aW9uPSIke2NvbXBpbGVkLmNsYXNzZXMuZGlyfSIgLz4KLQkJCTxhcmcgbGluZT0iLWFwIC1vIHRhcmdldC93c2RsL3JwY3Vud3JhcHBpbmcgLXNzIC1zZCAtc3NpIC11ICAtZyAtdXcgLXVyaSB0ZXN0LXJlc291cmNlcy93c2RsL1JQQ1Vud3JhcHBpbmdUZXN0LndzZGwiIC8+Ci0JCTwvamF2YT4KLQkJPGFudCBhbnRmaWxlPSJidWlsZC54bWwiIGluaGVyaXRhbGw9InRydWUiIGluaGVyaXRyZWZzPSJ0cnVlIiBkaXI9InRhcmdldC93c2RsL3JwY3Vud3JhcHBpbmciIC8+Ci0KLQkJPGVjaG8+Q29tcGlsaW5nIENvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlLndzZGw8L2VjaG8+Ci0JCTxta2RpciBkaXI9IiR7d3NkbC5vdXRwdXQuYmFzZS5kaXJ9L2NvbXBsZXhkYXRhdHlwZWJhcmUiIC8+Ci0JCTxqYXZhIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5heGlzMi53c2RsLldTREwySmF2YSIgZm9yaz0idHJ1ZSI+Ci0JCQk8Y2xhc3NwYXRoIHJlZmlkPSJtYXZlbi5ydW50aW1lLmNsYXNzcGF0aCIgLz4KLQkJCTxjbGFzc3BhdGggbG9jYXRpb249IiR7Y29tcGlsZWQuY2xhc3Nlcy5kaXJ9IiAvPgotCQkJPGFyZyBsaW5lPSItbyB0YXJnZXQvd3NkbC9jb21wbGV4ZGF0YXR5cGViYXJlIC1zIC11cmkgdGVzdC1yZXNvdXJjZXMvQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmUvQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmUud3NkbCIgLz4KLQkJPC9qYXZhPgotCQk8YW50IGFudGZpbGU9ImJ1aWxkLnhtbCIgaW5oZXJpdGFsbD0idHJ1ZSIgaW5oZXJpdHJlZnM9InRydWUiIGRpcj0idGFyZ2V0L3dzZGwvY29tcGxleGRhdGF0eXBlYmFyZSIgLz4KLQkJPGNvcHkgdG9EaXI9InRhcmdldC9jbGFzc2VzIiBmYWlsb25lcnJvcj0iZmFsc2UiPgotCQkJPGZpbGVzZXQgZGlyPSJ0YXJnZXQvd3NkbC9jb21wbGV4ZGF0YXR5cGViYXJlL2J1aWxkL2NsYXNzZXMiPgotCQkJCTxpbmNsdWRlIG5hbWU9IioqLyouY2xhc3MiIC8+Ci0JCQk8L2ZpbGVzZXQ+Ci0JCTwvY29weT4KLQotCQk8IS0tIGNvbXBpbGUgdGhlIHNjaGVtYSBmb3IgWE1MYmVhbnMgLS0+Ci0JCTxqYXZhIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnRvb2wuU2NoZW1hQ29tcGlsZXIiIGZvcms9InRydWUiPgotCQkJPGNsYXNzcGF0aCByZWZpZD0ibWF2ZW4ucnVudGltZS5jbGFzc3BhdGgiIC8+Ci0JCQk8YXJnIGxpbmU9Ii1zcmMgdGFyZ2V0L3htbGJlYW5zLXNyYyAtZCB0YXJnZXQvY2xhc3NlcyB0ZXN0LXJlc291cmNlcy94c2QvdHlwZS10ZXN0LnhzZCIgLz4KLQkJPC9qYXZhPgotCi0JCTxhbnQgYW50ZmlsZT0iaXRlc3QtYnVpbGQueG1sIiBpbmhlcml0YWxsPSJ0cnVlIiBpbmhlcml0cmVmcz0idHJ1ZSIgZGlyPSIuIiB0YXJnZXQ9InJwYy13c2RsLWNvZGVnZW4iIC8+Ci0KLQkJPGFudCBhbnRmaWxlPSJidWlsZC54bWwiIGluaGVyaXRhbGw9InRydWUiIGluaGVyaXRyZWZzPSJ0cnVlIiBkaXI9InRlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvU09BUDEyVGVzdE1vZHVsZUIiIC8+Ci0JCTxhbnQgYW50ZmlsZT0iYnVpbGQueG1sIiBpbmhlcml0YWxsPSJ0cnVlIiBpbmhlcml0cmVmcz0idHJ1ZSIgZGlyPSJ0ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1NPQVAxMlRlc3RNb2R1bGVDIiAvPgotCQk8YW50IGFudGZpbGU9ImJ1aWxkLnhtbCIgaW5oZXJpdGFsbD0idHJ1ZSIgaW5oZXJpdHJlZnM9InRydWUiIGRpcj0idGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9TT0FQMTJUZXN0U2VydmljZUIiIC8+Ci0JCTxhbnQgYW50ZmlsZT0iYnVpbGQueG1sIiBpbmhlcml0YWxsPSJ0cnVlIiBpbmhlcml0cmVmcz0idHJ1ZSIgZGlyPSJ0ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1NPQVAxMlRlc3RTZXJ2aWNlQyIgLz4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0icnBjLXdzZGwtY29kZWdlbiI+Ci0JCTxlY2hvPlJ1bm5pbmcgY29kZWdlbiBSUEMgV1NETHMgLSB0YWtlIDE8L2VjaG8+Ci0JCTxqYXZhIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5heGlzMi53c2RsLldTREwySmF2YSIgZm9yaz0idHJ1ZSI+Ci0JCQk8Y2xhc3NwYXRoIHJlZmlkPSJtYXZlbi5kZXBlbmRlbmN5LmNsYXNzcGF0aCIgLz4KLQkJCTxhcmcgbGluZT0iLWFwIC1vIHRhcmdldC9ycGMtdGVzdDEgLXVyaSB0ZXN0LXJlc291cmNlcy9ycGMvdGVzdC1ycGMtMi53c2RsIC11dyIgLz4KLQkJPC9qYXZhPgotCQk8YW50IGFudGZpbGU9ImJ1aWxkLnhtbCIgaW5oZXJpdGFsbD0idHJ1ZSIgaW5oZXJpdHJlZnM9InRydWUiIGRpcj0idGFyZ2V0L3JwYy10ZXN0MSIgdGFyZ2V0PSJqYXIuY2xpZW50IiAvPgotCi0JCTxlY2hvPlJ1bm5pbmcgY29kZWdlbiBSUEMgV1NETHMgLSB0YWtlIDI8L2VjaG8+Ci0JCTxqYXZhIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5heGlzMi53c2RsLldTREwySmF2YSIgZm9yaz0idHJ1ZSI+Ci0JCQk8Y2xhc3NwYXRoIHJlZmlkPSJtYXZlbi5kZXBlbmRlbmN5LmNsYXNzcGF0aCIgLz4KLQkJCTxhcmcgbGluZT0iLWFwIC1vIHRhcmdldC9ycGMtdGVzdDIgLXVyaSB0ZXN0LXJlc291cmNlcy9ycGMvdGVzdC1ycGMtMy53c2RsIC11dyIgLz4KLQkJPC9qYXZhPgotCQk8YW50IGFudGZpbGU9ImJ1aWxkLnhtbCIgaW5oZXJpdGFsbD0idHJ1ZSIgaW5oZXJpdHJlZnM9InRydWUiIGRpcj0idGFyZ2V0L3JwYy10ZXN0MiIgdGFyZ2V0PSJqYXIuY2xpZW50IiAvPgotCi0KLQkJPGVjaG8+UnVubmluZyBjb2RlZ2VuIFJQQyBXU0RMcyAtIHRha2UgMzwvZWNobz4KLQkJPGphdmEgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmF4aXMyLndzZGwuV1NETDJKYXZhIiBmb3JrPSJ0cnVlIj4KLQkJCTxjbGFzc3BhdGggcmVmaWQ9Im1hdmVuLmRlcGVuZGVuY3kuY2xhc3NwYXRoIiAvPgotCQkJPGFyZyBsaW5lPSItYXAgLW8gdGFyZ2V0L3JwYy10ZXN0MyAtdXJpIHRlc3QtcmVzb3VyY2VzL3JwYy90ZXN0LXJwYy0yLndzZGwgLXV3IiAvPgotCQk8L2phdmE+Ci0JCTxhbnQgYW50ZmlsZT0iYnVpbGQueG1sIiBpbmhlcml0YWxsPSJ0cnVlIiBpbmhlcml0cmVmcz0idHJ1ZSIgZGlyPSJ0YXJnZXQvcnBjLXRlc3QzIiB0YXJnZXQ9Imphci5jbGllbnQiIC8+Ci0KLQkJPGVjaG8+UnVubmluZyBjb2RlZ2VuIFJQQyBXU0RMcyAtIHRha2UgNDwvZWNobz4KLQkJPGphdmEgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmF4aXMyLndzZGwuV1NETDJKYXZhIiBmb3JrPSJ0cnVlIj4KLQkJCTxjbGFzc3BhdGggcmVmaWQ9Im1hdmVuLmRlcGVuZGVuY3kuY2xhc3NwYXRoIiAvPgotCQkJPGFyZyBsaW5lPSItYXAgLW8gdGFyZ2V0L3JwYy10ZXN0NCAtdXJpIHRlc3QtcmVzb3VyY2VzL3JwYy90ZXN0LXJwYy0yLndzZGwgLXV3IC1zcyAtc2QiIC8+Ci0JCTwvamF2YT4KLQkJPGFudCBhbnRmaWxlPSJidWlsZC54bWwiIGluaGVyaXRhbGw9InRydWUiIGluaGVyaXRyZWZzPSJ0cnVlIiBkaXI9InRhcmdldC9ycGMtdGVzdDQiCi0JCQkJCQkJIHRhcmdldD0iamFyLnNlcnZlciIvPgotCi0JCTxlY2hvPlJ1bm5pbmcgY29kZWdlbiBSUEMgV1NETHMgd2l0aCBoZWxwZXIgbW9kZSAtICB0YWtlIDE8L2VjaG8+Ci0JCTxqYXZhIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5heGlzMi53c2RsLldTREwySmF2YSIgZm9yaz0idHJ1ZSI+Ci0JCQk8Y2xhc3NwYXRoIHJlZmlkPSJtYXZlbi5kZXBlbmRlbmN5LmNsYXNzcGF0aCIvPgotCQkJPGFyZyBsaW5lPSItYXAgLW8gdGFyZ2V0L2hlbHBlci10ZXN0MSAtdXJpIHRlc3QtcmVzb3VyY2VzL3JwYy90ZXN0LXJwYy0yLndzZGwgLXUgLUVoIi8+Ci0JCTwvamF2YT4KLQkJPGFudCBhbnRmaWxlPSJidWlsZC54bWwiIGluaGVyaXRhbGw9InRydWUiIGluaGVyaXRyZWZzPSJ0cnVlIiBkaXI9InRhcmdldC9oZWxwZXItdGVzdDEiCi0JCQkJCSB0YXJnZXQ9Imphci5jbGllbnQiLz4KLQotCQk8ZWNobz5SdW5uaW5nIGNvZGVnZW4gUlBDIFdTRExzIHdpdGggaGVscGVyIG1vZGUgLSAgdGFrZSAyPC9lY2hvPgotCQk8amF2YSBjbGFzc25hbWU9Im9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMMkphdmEiIGZvcms9InRydWUiPgotCQkJPGNsYXNzcGF0aCByZWZpZD0ibWF2ZW4uZGVwZW5kZW5jeS5jbGFzc3BhdGgiLz4KLQkJCTxhcmcgbGluZT0iLWFwIC1vIHRhcmdldC9oZWxwZXItdGVzdDIgLXVyaSB0ZXN0LXJlc291cmNlcy9ycGMvdGVzdC1ycGMtMi53c2RsIC11IC1FaCIvPgotCQk8L2phdmE+Ci0JCTxhbnQgYW50ZmlsZT0iYnVpbGQueG1sIiBpbmhlcml0YWxsPSJ0cnVlIiBpbmhlcml0cmVmcz0idHJ1ZSIgZGlyPSJ0YXJnZXQvaGVscGVyLXRlc3QyIgotCQkJCQkgdGFyZ2V0PSJqYXIuY2xpZW50Ii8+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9ImVudGVycHJpc2Utd3NkbC1jb2RlZ2VuIj4KLQkJPCEtLSBjb2RlZ2VuIGZvciB0aGUgZW50ZXJwcmlzZSB3c2RsIC0tPgotCQk8ZWNobz5SdW5uaW5nIGNvZGVnZW4gZm9yIEVudGVycHJpc2UgV1NETCAtIHRha2UgMTwvZWNobz4KLQkJPGphdmEgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmF4aXMyLndzZGwuV1NETDJKYXZhIiBmb3JrPSJ0cnVlIj4KLQkJCTxjbGFzc3BhdGggcmVmaWQ9Im1hdmVuLmRlcGVuZGVuY3kuY2xhc3NwYXRoIi8+Ci0JCQk8YXJnIGxpbmU9Ii1hcCAtZCB4bWxiZWFucyAtbyB0YXJnZXQvZW50ZXJwcmlzZS10ZXN0MSAtcyAtdXJpIHRlc3QtcmVzb3VyY2VzL2VudGVycHJpc2Uud3NkbCIvPgotCQk8L2phdmE+Ci0JCTxhbnQgYW50ZmlsZT0iYnVpbGQueG1sIiBpbmhlcml0YWxsPSJ0cnVlIiBpbmhlcml0cmVmcz0idHJ1ZSIgZGlyPSJ0YXJnZXQvZW50ZXJwcmlzZS10ZXN0MSIKLQkJCQkJCQkJCSB0YXJnZXQ9Imphci5jbGllbnQiLz4KLQotCQk8ZWNobz5SdW5uaW5nIGNvZGVnZW4gZm9yIEVudGVycHJpc2UgV1NETCAtIHRha2UgMjwvZWNobz4KLQkJPGphdmEgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmF4aXMyLndzZGwuV1NETDJKYXZhIiBmb3JrPSJ0cnVlIj4KLQkJCTxjbGFzc3BhdGggcmVmaWQ9Im1hdmVuLmRlcGVuZGVuY3kuY2xhc3NwYXRoIi8+Ci0JCQk8YXJnIGxpbmU9Ii1hcCAtbyB0YXJnZXQvZW50ZXJwcmlzZS10ZXN0MiAtcyAtdXJpIHRlc3QtcmVzb3VyY2VzL2VudGVycHJpc2Uud3NkbCIvPgotCQk8L2phdmE+Ci0JCTxhbnQgYW50ZmlsZT0iYnVpbGQueG1sIiBpbmhlcml0YWxsPSJ0cnVlIiBpbmhlcml0cmVmcz0idHJ1ZSIgZGlyPSJ0YXJnZXQvZW50ZXJwcmlzZS10ZXN0MiIKLQkJCQkJCQkJCSB0YXJnZXQ9Imphci5jbGllbnQiLz4KLQotCQk8ZWNobz5SdW5uaW5nIGNvZGVnZW4gZm9yIEVudGVycHJpc2UgV1NETCAtIHRha2UgMzwvZWNobz4KLQkJPGphdmEgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmF4aXMyLndzZGwuV1NETDJKYXZhIiBmb3JrPSJ0cnVlIj4KLQkJCTxjbGFzc3BhdGggcmVmaWQ9Im1hdmVuLmRlcGVuZGVuY3kuY2xhc3NwYXRoIi8+Ci0JCQk8YXJnIGxpbmU9Ii1hcCAtZCB4bWxiZWFucyAtc3MgLXNkIC1nIC1vIHRhcmdldC9lbnRlcnByaXNlLXRlc3QzIC1zIC11cmkgdGVzdC1yZXNvdXJjZXMvZW50ZXJwcmlzZS53c2RsIi8+Ci0JCTwvamF2YT4KLQkJPGFudCBhbnRmaWxlPSJidWlsZC54bWwiIGluaGVyaXRhbGw9InRydWUiIGluaGVyaXRyZWZzPSJ0cnVlIiBkaXI9InRhcmdldC9lbnRlcnByaXNlLXRlc3QzIgotCQkJCQkJCQkJIHRhcmdldD0iamFyLnNlcnZlciIvPgotCi0JCTxlY2hvPlJ1bm5pbmcgY29kZWdlbiBmb3IgRW50ZXJwcmlzZSBXU0RMIC0gdGFrZSA0PC9lY2hvPgotCQk8amF2YSBjbGFzc25hbWU9Im9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMMkphdmEiIGZvcms9InRydWUiPgotCQkJPGNsYXNzcGF0aCByZWZpZD0ibWF2ZW4uZGVwZW5kZW5jeS5jbGFzc3BhdGgiLz4KLQkJCTxhcmcgbGluZT0iLWFwIC1uczJwIHVybjpzb2JqZWN0LmVudGVycHJpc2Uuc29hcC5zZm9yY2UuY29tPWNvbS5zYWxlc2ZvcmNlIC1kIHhtbGJlYW5zIC1zcyAtc2QgLWcgLW8gdGFyZ2V0L2VudGVycHJpc2UtdGVzdDQgLXMgLXVyaSB0ZXN0LXJlc291cmNlcy9lbnRlcnByaXNlLndzZGwiLz4KLQkJPC9qYXZhPgotCQk8YW50IGFudGZpbGU9ImJ1aWxkLnhtbCIgaW5oZXJpdGFsbD0idHJ1ZSIgaW5oZXJpdHJlZnM9InRydWUiIGRpcj0idGFyZ2V0L2VudGVycHJpc2UtdGVzdDQiCi0JCQkJCQkJCQkgdGFyZ2V0PSJqYXIuc2VydmVyIi8+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9ImJ1aWxkLXJlcG9zIiB1bmxlc3M9InRlc3Quc2tpcCI+Ci0JCTxta2RpciBkaXI9InRhcmdldC90ZXN0LXJlc291cmNlcy9zYW1wbGVzL21vZHVsZXMiLz4KLQkJPG1rZGlyIGRpcj0idGFyZ2V0L3Rlc3QtcmVzb3VyY2VzL3NhbXBsZXMvY29uZiIvPgotCQk8bWtkaXIgZGlyPSJ0YXJnZXQvdGVzdC1yZXNvdXJjZXMvcmVwb3NpdG9yeS1jbGllbnQvbW9kdWxlcyIvPgotCQk8bWtkaXIgZGlyPSJ0YXJnZXQvdGVzdC1yZXNvdXJjZXMvcmVwb3NpdG9yeS1jbGllbnQvY29uZiIvPgotCQk8Y29weSBmaWxlPSIuLi9hZGRyZXNzaW5nL3RhcmdldC9hZGRyZXNzaW5nLSR7YWRkcmVzc2luZ192ZXJzaW9ufS5tYXIiCi0gICAgCSAgICAgICAgICAgICAgICAgIHRvZmlsZT0idGFyZ2V0L3Rlc3QtcmVzb3VyY2VzL3NhbXBsZXMvbW9kdWxlcy9hZGRyZXNzaW5nLSR7YWRkcmVzc2luZ192ZXJzaW9ufS5tYXIiLz4KLQkJPGNvcHkgZmlsZT0iY29uZi9heGlzMi54bWwiCi0gICAgCSAgICAgICAgICAgICAgICAgIHRvZmlsZT0idGFyZ2V0L3Rlc3QtcmVzb3VyY2VzL3NhbXBsZXMvY29uZi9heGlzMi54bWwiLz4KLQkJPGNvcHkgZmlsZT0iLi4vYWRkcmVzc2luZy90YXJnZXQvYWRkcmVzc2luZy0ke2FkZHJlc3NpbmdfdmVyc2lvbn0ubWFyIgotICAgIAkgICAgICAgICAgICAgICAgICB0b2ZpbGU9InRhcmdldC90ZXN0LXJlc291cmNlcy9yZXBvc2l0b3J5LWNsaWVudC9tb2R1bGVzL2FkZHJlc3NpbmctJHthZGRyZXNzaW5nX3ZlcnNpb259Lm1hciIvPgotCQk8Y29weSBmaWxlPSJjb25mL2F4aXMyLnhtbCIKLSAgICAJICAgICAgICAgICAgICAgICAgdG9maWxlPSJ0YXJnZXQvdGVzdC1yZXNvdXJjZXMvcmVwb3NpdG9yeS1jbGllbnQvY29uZi9heGlzMi54bWwiLz4KLQkJPG1rZGlyIGRpcj0idGFyZ2V0L3RvV2FyL3NlcnZpY2VzLyIvPgotCi0JCTxta2RpciBkaXI9InRhcmdldC90ZXN0LXJlc291cmNlcy9sb2NhbCIvPgotCQk8Y29weSBmaWxlPSIuLi9hZGRyZXNzaW5nL3RhcmdldC9hZGRyZXNzaW5nLSR7YWRkcmVzc2luZ192ZXJzaW9ufS5tYXIiCi0JCSAgICAJICAgICAgICAgICAgICAgICAgdG9maWxlPSJ0YXJnZXQvdGVzdC1yZXNvdXJjZXMvbG9jYWwvYWRkcmVzc2luZy5tYXIiLz4KLQotCQk8IS0tIENyZWF0ZSBDaHVua2VkIGVuYWJsZWQgUmVwb3NpdG9yeSAtLT4KLQkJPG1rZGlyIGRpcj0idGFyZ2V0L3Rlc3QtcmVzb3VyY2VzL2NodW5raW5nLWVuYWJsZWRSZXBvc2l0b3J5Ii8+Ci0JCTxta2RpciBkaXI9InRhcmdldC90ZXN0LXJlc291cmNlcy9jaHVua2luZy1lbmFibGVkUmVwb3NpdG9yeS9jb25mIi8+Ci0JCTxjb3B5IGZpbGU9InRlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvY2h1bmtpbmctZW5hYmxlZC1heGlzMi54bWwiCi0gICAgCSAgICAgICAgICAgICAgICAgIHRvZmlsZT0idGFyZ2V0L3Rlc3QtcmVzb3VyY2VzL2NodW5raW5nLWVuYWJsZWRSZXBvc2l0b3J5L2NvbmYvYXhpczIueG1sIi8+Ci0KLQkJPCEtLSBDcmVhdGUgQ2h1bmtlZCBkaXNhYmxlZCBSZXBvc2l0b3J5IC0tPgotCQk8bWtkaXIgZGlyPSJ0YXJnZXQvdGVzdC1yZXNvdXJjZXMvY2h1bmtpbmctZGlzYWJsZWRSZXBvc2l0b3J5Ii8+Ci0JCTxta2RpciBkaXI9InRhcmdldC90ZXN0LXJlc291cmNlcy9jaHVua2luZy1kaXNhYmxlZFJlcG9zaXRvcnkvY29uZiIvPgotCQk8Y29weSBmaWxlPSJ0ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL2NodW5raW5nLWRpc2FibGVkLWF4aXMyLnhtbCIKLSAgICAJICAgICAgICAgICAgICAgICAgdG9maWxlPSJ0YXJnZXQvdGVzdC1yZXNvdXJjZXMvY2h1bmtpbmctZGlzYWJsZWRSZXBvc2l0b3J5L2NvbmYvYXhpczIueG1sIi8+Ci0KLQkJPG1rZGlyIGRpcj0idGFyZ2V0L3Rlc3QtcmVzb3VyY2VzL01lc3NhZ2VDb250ZXh0SW5qZWN0aW9uUmVwbyIvPgotCQk8bWtkaXIgZGlyPSJ0YXJnZXQvdGVzdC1yZXNvdXJjZXMvaW50ZWdyYXRpb25SZXBvL21vZHVsZXMiLz4KLQkJPG1rZGlyIGRpcj0idGFyZ2V0L3Rlc3QtcmVzb3VyY2VzL2ludGVncmF0aW9uUmVwby9jb25mIi8+Ci0JCTxjb3B5IGZpbGU9Ii4uL2FkZHJlc3NpbmcvdGFyZ2V0L2FkZHJlc3NpbmctJHthZGRyZXNzaW5nX3ZlcnNpb259Lm1hciIKLSAgICAJICAgICAgICAgICAgICAgICAgdG9maWxlPSJ0YXJnZXQvdGVzdC1yZXNvdXJjZXMvaW50ZWdyYXRpb25SZXBvL21vZHVsZXMvYWRkcmVzc2luZy0ke2FkZHJlc3NpbmdfdmVyc2lvbn0ubWFyIi8+Ci0JCTxjb3B5IGZpbGU9ImNvbmYvYXhpczIueG1sIgotICAgIAkgICAgICAgICAgICAgICAgICB0b2ZpbGU9InRhcmdldC90ZXN0LXJlc291cmNlcy9pbnRlZ3JhdGlvblJlcG8vY29uZi9heGlzMi54bWwiLz4KLQotCi0JCTwhLS0gQ29tbW9ucyB0cmFuc3BvcnQgZW5hYmxlZCBlbmFibGVkIFJlcG9zaXRvcnkgLS0+Ci0JCTxta2RpciBkaXI9InRhcmdldC90ZXN0LXJlc291cmNlcy9jb21tb25zLWh0dHAtZW5hYmxlZFJlcG9zaXRvcnkiLz4KLQkJPG1rZGlyIGRpcj0idGFyZ2V0L3Rlc3QtcmVzb3VyY2VzL2NvbW1vbnMtaHR0cC1lbmFibGVkUmVwb3NpdG9yeS9jb25mIi8+Ci0JCTxjb3B5IGZpbGU9InRlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvY29tbW9ucy1odHRwLWVuYWJsZWQtYXhpczIueG1sIgotICAgIAkgICAgICAgICAgICAgICAgICB0b2ZpbGU9InRhcmdldC90ZXN0LXJlc291cmNlcy9jb21tb25zLWh0dHAtZW5hYmxlZFJlcG9zaXRvcnkvY29uZi9heGlzMi54bWwiLz4KLQotCQk8IS0tIE1UT00gZW5hYmxlZCBSZXBvc2l0b3J5IC0tPgotCQk8bWtkaXIgZGlyPSJ0YXJnZXQvdGVzdC1yZXNvdXJjZXMvTVRPTS1lbmFibGVkUmVwb3NpdG9yeSIvPgotCQk8bWtkaXIgZGlyPSJ0YXJnZXQvdGVzdC1yZXNvdXJjZXMvTVRPTS1lbmFibGVkUmVwb3NpdG9yeS9jb25mIi8+Ci0JCTxta2RpciBkaXI9InRhcmdldC90ZXN0LXJlc291cmNlcy9NVE9NLWVuYWJsZWRSZXBvc2l0b3J5L21vZHVsZXMiLz4KLQkJPGNvcHkgZmlsZT0idGVzdC1yZXNvdXJjZXMvbXRvbS9NVE9NLWVuYWJsZWQtYXhpczIueG1sIgotICAgIAkgICAgICAgICAgICAgICAgICB0b2ZpbGU9InRhcmdldC90ZXN0LXJlc291cmNlcy9NVE9NLWVuYWJsZWRSZXBvc2l0b3J5L2NvbmYvYXhpczIueG1sIi8+Ci0JCTxjb3B5IGZpbGU9Ii4uL2FkZHJlc3NpbmcvdGFyZ2V0L2FkZHJlc3NpbmctJHthZGRyZXNzaW5nX3ZlcnNpb259Lm1hciIKLSAgICAJICAgICAgICAJICAgICAgdG9maWxlPSJ0YXJnZXQvdGVzdC1yZXNvdXJjZXMvTVRPTS1lbmFibGVkUmVwb3NpdG9yeS9tb2R1bGVzL2FkZHJlc3NpbmctJHthZGRyZXNzaW5nX3ZlcnNpb259Lm1hciIvPgotCi0JCTwhLS0gTVRPTSBmaWxlIGNhY2hlIGVuYWJsZWQgUmVwb3NpdG9yeSAtLT4KLQkJPG1rZGlyIGRpcj0idGFyZ2V0L3Rlc3QtcmVzb3VyY2VzL01UT00tZmlsZUNhY2hlLWVuYWJsZWRSZXBvc2l0b3J5Ii8+Ci0JCTxta2RpciBkaXI9InRhcmdldC90ZXN0LXJlc291cmNlcy9NVE9NLWZpbGVDYWNoZS1lbmFibGVkUmVwb3NpdG9yeS9jb25mIi8+Ci0JCTxjb3B5IGZpbGU9InRlc3QtcmVzb3VyY2VzL210b20vTVRPTS1maWxlQ2FjaGUtZW5hYmxlZC1heGlzMi54bWwiCi0gICAgCSAgICAgICAgICAgICAgICAgIHRvZmlsZT0idGFyZ2V0L3Rlc3QtcmVzb3VyY2VzL01UT00tZmlsZUNhY2hlLWVuYWJsZWRSZXBvc2l0b3J5L2NvbmYvYXhpczIueG1sIi8+Ci0JCTxjb3B5IGZpbGU9Ii4uL2FkZHJlc3NpbmcvdGFyZ2V0L2FkZHJlc3NpbmctJHthZGRyZXNzaW5nX3ZlcnNpb259Lm1hciIKLSAgICAJICAgICAgICAJICAgICAgICAJICAgICAgdG9maWxlPSJ0YXJnZXQvdGVzdC1yZXNvdXJjZXMvTVRPTS1maWxlQ2FjaGUtZW5hYmxlZFJlcG9zaXRvcnkvbW9kdWxlcy9hZGRyZXNzaW5nLSR7YWRkcmVzc2luZ192ZXJzaW9ufS5tYXIiLz4KLQotCQk8IS0tIFN3QSBlbmFibGVkIFJlcG9zaXRvcnkgLS0+Ci0JCTxta2RpciBkaXI9InRhcmdldC90ZXN0LXJlc291cmNlcy9Td0EtZW5hYmxlZFJlcG9zaXRvcnkiLz4KLQkJPG1rZGlyIGRpcj0idGFyZ2V0L3Rlc3QtcmVzb3VyY2VzL1N3QS1lbmFibGVkUmVwb3NpdG9yeS9jb25mIi8+Ci0JCTxjb3B5IGZpbGU9InRlc3QtcmVzb3VyY2VzL3N3YS9Td0EtZW5hYmxlZC1heGlzMi54bWwiCi0gICAgCSAgICAgICAgICAgICAgICAgICAgdG9maWxlPSJ0YXJnZXQvdGVzdC1yZXNvdXJjZXMvU3dBLWVuYWJsZWRSZXBvc2l0b3J5L2NvbmYvYXhpczIueG1sIi8+Ci0JCTxjb3B5IGZpbGU9Ii4uL2FkZHJlc3NpbmcvdGFyZ2V0L2FkZHJlc3NpbmctJHthZGRyZXNzaW5nX3ZlcnNpb259Lm1hciIKLSAgICAJICAgICAgICAgIAkgICAgICB0b2ZpbGU9InRhcmdldC90ZXN0LXJlc291cmNlcy9Td0EtZW5hYmxlZFJlcG9zaXRvcnkvbW9kdWxlcy9hZGRyZXNzaW5nLSR7YWRkcmVzc2luZ192ZXJzaW9ufS5tYXIiLz4KLQotCQk8IS0tIFN3QSBmaWxlIGNhY2hlIGVuYWJsZWQgUmVwb3NpdG9yeSAtLT4KLQkJPG1rZGlyIGRpcj0idGFyZ2V0L3Rlc3QtcmVzb3VyY2VzL1N3QS1maWxlQ2FjaGUtZW5hYmxlZFJlcG9zaXRvcnkiLz4KLQkJPG1rZGlyIGRpcj0idGFyZ2V0L3Rlc3QtcmVzb3VyY2VzL1N3QS1maWxlQ2FjaGUtZW5hYmxlZFJlcG9zaXRvcnkvY29uZiIvPgotCQk8Y29weSBmaWxlPSJ0ZXN0LXJlc291cmNlcy9zd2EvU3dBLWZpbGVDYWNoZS1lbmFibGVkLWF4aXMyLnhtbCIKLSAgICAJICAgICAgICAgICAgICAgICAgICB0b2ZpbGU9InRhcmdldC90ZXN0LXJlc291cmNlcy9Td0EtZmlsZUNhY2hlLWVuYWJsZWRSZXBvc2l0b3J5L2NvbmYvYXhpczIueG1sIi8+Ci0JCTxjb3B5IGZpbGU9Ii4uL2FkZHJlc3NpbmcvdGFyZ2V0L2FkZHJlc3NpbmctJHthZGRyZXNzaW5nX3ZlcnNpb259Lm1hciIKLSAgICAJICAgICAgICAgIAkgICAgICAgIAkgICAgICB0b2ZpbGU9InRhcmdldC90ZXN0LXJlc291cmNlcy9Td0EtZmlsZUNhY2hlLWVuYWJsZWRSZXBvc2l0b3J5L21vZHVsZXMvYWRkcmVzc2luZy0ke2FkZHJlc3NpbmdfdmVyc2lvbn0ubWFyIi8+Ci0KLQkJPCEtLSBTcHJpbmcgcmVzb3VyY2VzIC0tPgotCQk8bWtkaXIgZGlyPSJ0YXJnZXQvdGVzdC1yZXNvdXJjZXMvc3ByaW5nIi8+Ci0JCTxjb3B5IGZpbGU9Ii4uL3NwcmluZy90ZXN0LXJlc291cmNlcy9hcHBsaWNhdGlvbkNvbnRleHQueG1sIgotICAgIAkgICAgICAgICAgICAgICAgICB0b2ZpbGU9InRhcmdldC90ZXN0LWNsYXNzZXMvc3ByaW5nL2FwcGxpY2F0aW9uQ29udGV4dC54bWwiLz4KLQotCQk8IS0tIFRlc3Qgd2l0aCB0YXJnZXQgcmVzb2x2ZXIgIC0tPgotCQk8bWtkaXIgZGlyPSJ0YXJnZXQvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudF9yZXBvIi8+Ci0JCTxta2RpciBkaXI9InRhcmdldC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50Ii8+Ci0JCTxta2RpciBkaXI9InRhcmdldC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50X3JlcG8vY29uZiIvPgotCQk8bWtkaXIgZGlyPSJ0YXJnZXQvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudF9yZXBvL3NlcnZpY2VzIi8+Ci0JCTxta2RpciBkaXI9InRhcmdldC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50X3JlcG8vbW9kdWxlcyIvPgotCi0JCTxjb3B5IGZpbGU9InRlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvc2VydmVyLXRyYW5zcG9ydC54bWwiCi0gICAgCSAgICAgICAgICAgIAkgIHRvZmlsZT0idGFyZ2V0L3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvc2VydmVyLXRyYW5zcG9ydC54bWwiLz4KLTxjb3B5IGZpbGU9InRlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvZGVwbG95bWVudC5ib3RoLmF4aXMyLnhtbCIKLSAgICAJICAgICAgICAgICAgCSAgdG9maWxlPSJ0YXJnZXQvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudF9yZXBvL2NvbmYvYXhpczIueG1sIi8+Ci0KLQkJPGNvcHkgZmlsZT0iLi4vYWRkcmVzc2luZy90YXJnZXQvYWRkcmVzc2luZy0ke2FkZHJlc3NpbmdfdmVyc2lvbn0ubWFyIgotICAgIAkgICAgICAgICAgICAJICB0b2ZpbGU9InRhcmdldC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50X3JlcG8vbW9kdWxlcy9hZGRyZXNzaW5nLSR7YWRkcmVzc2luZ192ZXJzaW9ufS5tYXIiLz4KLQotCi0JCTwhLS0gU3RhbmRhcmQgcmVwb3NpdG9yeSAtLT4KLQkJPG1rZGlyIGRpcj0idGFyZ2V0L1JlcG9zaXRvcnkiLz4KLQkJPG1rZGlyIGRpcj0idGFyZ2V0L1JlcG9zaXRvcnkvY29uZiIvPgotCQk8bWtkaXIgZGlyPSJ0YXJnZXQvUmVwb3NpdG9yeS9zZXJ2aWNlcyIvPgotCQk8bWtkaXIgZGlyPSJ0YXJnZXQvUmVwb3NpdG9yeS9tb2R1bGVzIi8+Ci0JCTxjb3B5IGZpbGU9Ii4uL2FkZHJlc3NpbmcvdGFyZ2V0L2FkZHJlc3NpbmctJHthZGRyZXNzaW5nX3ZlcnNpb259Lm1hciIKLSAgICAJICAgICAgICAgICAgICAgICAgdG9maWxlPSJ0YXJnZXQvUmVwb3NpdG9yeS9tb2R1bGVzL2FkZHJlc3NpbmctJHthZGRyZXNzaW5nX3ZlcnNpb259Lm1hciIvPgotCQk8Y29weSBmaWxlPSJjb25mL2F4aXMyLnhtbCIKLSAgICAJICAgICAgICAgICAgICAgICAgdG9maWxlPSJ0YXJnZXQvUmVwb3NpdG9yeS9jb25mL2F4aXMyLnhtbCIvPgotCi0JCTxta2RpciBkaXI9InRhcmdldC9wZXJmMi9idWlsZC9yZXBvL2NvbmYiLz4KLQkJPG1rZGlyIGRpcj0idGFyZ2V0L3BlcmYvYnVpbGQvcmVwby9jb25mIi8+Ci0KLQkJPGNvcHkgZmlsZT0iY29uZi9heGlzMi54bWwiCi0gICAgCSAgICAgICAgICAgICAgICAgIHRvZmlsZT0idGFyZ2V0L3BlcmYyL2J1aWxkL3JlcG8vY29uZi9heGlzMi54bWwiLz4KLQkJPGNvcHkgZmlsZT0iY29uZi9heGlzMi54bWwiCi0gICAgCSAgICAgICAgICAgICAgICAgIHRvZmlsZT0idGFyZ2V0L3BlcmYvYnVpbGQvcmVwby9jb25mL2F4aXMyLnhtbCIvPgotCi0JCTxta2RpciBkaXI9InRhcmdldC9wZXJmMi9idWlsZC9yZXBvL21vZHVsZXMiLz4KLQkJPGNvcHkgZmlsZT0iLi4vYWRkcmVzc2luZy90YXJnZXQvYWRkcmVzc2luZy0ke2FkZHJlc3NpbmdfdmVyc2lvbn0ubWFyIgotICAgIAkgICAgICAgICAgICAgICAgICB0b2ZpbGU9InRhcmdldC9wZXJmMi9idWlsZC9yZXBvL21vZHVsZXMvYWRkcmVzc2luZy0ke2FkZHJlc3NpbmdfdmVyc2lvbn0ubWFyIi8+Ci0KLQkJPG1rZGlyIGRpcj0idGFyZ2V0L3BlcmYvYnVpbGQvcmVwby9tb2R1bGVzIi8+Ci0JCTxjb3B5IGZpbGU9Ii4uL2FkZHJlc3NpbmcvdGFyZ2V0L2FkZHJlc3NpbmctJHthZGRyZXNzaW5nX3ZlcnNpb259Lm1hciIKLSAgICAJICAgICAgICAgICAgICAgICAgdG9maWxlPSJ0YXJnZXQvcGVyZi9idWlsZC9yZXBvL21vZHVsZXMvYWRkcmVzc2luZy0ke2FkZHJlc3NpbmdfdmVyc2lvbn0ubWFyIi8+Ci0JPC90YXJnZXQ+Ci0JPHRhcmdldCBuYW1lPSJidWlsZC1zb2FwMTItc2VydmljZXMiPgotCQk8YW50IGFudGZpbGU9ImJ1aWxkLnhtbCIgaW5oZXJpdGFsbD0idHJ1ZSIgaW5oZXJpdHJlZnM9InRydWUiCi0JCSAgICAgICAgICAgICAgICAgICAgICAgICBkaXI9InRlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvU09BUDEyVGVzdE1vZHVsZUIiLz4KLQkJPGFudCBhbnRmaWxlPSJidWlsZC54bWwiIGluaGVyaXRhbGw9InRydWUiIGluaGVyaXRyZWZzPSJ0cnVlIgotCQkgICAgICAgICAgICAgICAgICAgICAgICAgZGlyPSJ0ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1NPQVAxMlRlc3RNb2R1bGVDIi8+Ci0JCTxhbnQgYW50ZmlsZT0iYnVpbGQueG1sIiBpbmhlcml0YWxsPSJ0cnVlIiBpbmhlcml0cmVmcz0idHJ1ZSIKLQkJICAgICAgICAgICAgICAgICAgICAgICAgIGRpcj0idGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9TT0FQMTJUZXN0U2VydmljZUIiLz4KLQkJPGFudCBhbnRmaWxlPSJidWlsZC54bWwiIGluaGVyaXRhbGw9InRydWUiIGluaGVyaXRyZWZzPSJ0cnVlIgotCQkgICAgICAgICAgICAgICAgICAgICAgICAgZGlyPSJ0ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1NPQVAxMlRlc3RTZXJ2aWNlQyIvPgotCTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vcG9tLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0MjJiN2UuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU0MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItcGFyZW50PC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4xLjUuMTwvdmVyc2lvbj4KLSAgICAgICAgPHJlbGF0aXZlUGF0aD4uLi9wYXJlbnQvcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgotICAgIDwvcGFyZW50PgotICAgIDxhcnRpZmFjdElkPmF4aXMyLWludGVncmF0aW9uPC9hcnRpZmFjdElkPgotICAgIDxuYW1lPkFwYWNoZSBBeGlzMiAtIEludGVncmF0aW9uPC9uYW1lPgotICAgIDxkZXNjcmlwdGlvbj5BeGlzMiBJbnRlZ3JhdGlvbjwvZGVzY3JpcHRpb24+Ci0gICAgPGRlcGVuZGVuY2llcz4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItY2x1c3RlcmluZzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7dmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8ZXhjbHVzaW9ucz4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmdlcm9uaW1vLnNwZWNzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5nZXJvbmltby1qYXZhbWFpbF8xLjRfc3BlYzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgIDwvZXhjbHVzaW9ucz4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi10cmFuc3BvcnQtaHR0cDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7dmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItdHJhbnNwb3J0LWxvY2FsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHt2ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZ2Vyb25pbW8uc3BlY3M8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5nZXJvbmltby1hY3RpdmF0aW9uXzEuMV9zcGVjPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLXNjcmlwdGluZzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx0eXBlPm1hcjwvdHlwZT4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7dmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8ZXhjbHVzaW9ucz4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmdlcm9uaW1vLnNwZWNzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5nZXJvbmltby1qYXZhbWFpbF8xLjRfc3BlYzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgIDwvZXhjbHVzaW9ucz4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1hZGItY29kZWdlbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7dmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8ZXhjbHVzaW9ucz4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmdlcm9uaW1vLnNwZWNzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5nZXJvbmltby1qYXZhbWFpbF8xLjRfc3BlYzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgIDwvZXhjbHVzaW9ucz4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1hZGI8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3ZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPGV4Y2x1c2lvbnM+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5nZXJvbmltby5zcGVjczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+Z2Vyb25pbW8tamF2YW1haWxfMS40X3NwZWM8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICA8L2V4Y2x1c2lvbnM+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItY29kZWdlbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7dmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8ZXhjbHVzaW9ucz4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmdlcm9uaW1vLnNwZWNzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5nZXJvbmltby1qYXZhbWFpbF8xLjRfc3BlYzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgIDwvZXhjbHVzaW9ucz4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1qYXZhMndzZGw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3ZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPGV4Y2x1c2lvbnM+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5nZXJvbmltby5zcGVjczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+Z2Vyb25pbW8tamF2YW1haWxfMS40X3NwZWM8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICA8L2V4Y2x1c2lvbnM+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItamF4YnJpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHt2ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxleGNsdXNpb25zPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZ2Vyb25pbW8uc3BlY3M8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmdlcm9uaW1vLWphdmFtYWlsXzEuNF9zcGVjPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgPC9leGNsdXNpb25zPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7dmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1qYXh3czwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDxleGNsdXNpb25zPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZ2Vyb25pbW8uc3BlY3M8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmdlcm9uaW1vLWphdmFtYWlsXzEuNF9zcGVjPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgPC9leGNsdXNpb25zPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7dmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1qYXh3cy1pbnRlZ3JhdGlvbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDxleGNsdXNpb25zPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZ2Vyb25pbW8uc3BlY3M8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmdlcm9uaW1vLWphdmFtYWlsXzEuNF9zcGVjPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgPC9leGNsdXNpb25zPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7dmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1qaWJ4PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPGV4Y2x1c2lvbnM+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5nZXJvbmltby5zcGVjczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+Z2Vyb25pbW8tamF2YW1haWxfMS40X3NwZWM8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICA8L2V4Y2x1c2lvbnM+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItanNvbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7dmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8ZXhjbHVzaW9ucz4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmdlcm9uaW1vLnNwZWNzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5nZXJvbmltby1qYXZhbWFpbF8xLjRfc3BlYzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgIDwvZXhjbHVzaW9ucz4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1rZXJuZWw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3ZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPGV4Y2x1c2lvbnM+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5nZXJvbmltby5zcGVjczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+Z2Vyb25pbW8tamF2YW1haWxfMS40X3NwZWM8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICA8L2V4Y2x1c2lvbnM+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItbWV0YWRhdGE8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3ZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPGV4Y2x1c2lvbnM+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5nZXJvbmltby5zcGVjczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+Z2Vyb25pbW8tamF2YW1haWxfMS40X3NwZWM8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICA8L2V4Y2x1c2lvbnM+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItbXRvbXBvbGljeTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7dmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8ZXhjbHVzaW9ucz4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmdlcm9uaW1vLnNwZWNzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5nZXJvbmltby1qYXZhbWFpbF8xLjRfc3BlYzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgIDwvZXhjbHVzaW9ucz4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1zYWFqPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHt2ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxleGNsdXNpb25zPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZ2Vyb25pbW8uc3BlY3M8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmdlcm9uaW1vLWphdmFtYWlsXzEuNF9zcGVjPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgPC9leGNsdXNpb25zPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLXNwcmluZzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7dmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8ZXhjbHVzaW9ucz4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmdlcm9uaW1vLnNwZWNzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5nZXJvbmltby1qYXZhbWFpbF8xLjRfc3BlYzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgIDwvZXhjbHVzaW9ucz4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5vcmcuYXBhY2hlLmF4aXMyLm9zZ2k8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3ZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPGV4Y2x1c2lvbnM+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5nZXJvbmltby5zcGVjczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+Z2Vyb25pbW8tamF2YW1haWxfMS40X3NwZWM8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICA8L2V4Y2x1c2lvbnM+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczIteG1sYmVhbnM8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3ZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPGV4Y2x1c2lvbnM+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5nZXJvbmltby5zcGVjczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+Z2Vyb25pbW8tamF2YW1haWxfMS40X3NwZWM8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICA8L2V4Y2x1c2lvbnM+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczIta2VybmVsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHt2ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxleGNsdXNpb25zPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZ2Vyb25pbW8uc3BlY3M8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmdlcm9uaW1vLWphdmFtYWlsXzEuNF9zcGVjPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgPC9leGNsdXNpb25zPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPlhtbFNjaGVtYTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUud29kZW48L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD53b2Rlbi1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLndvZGVuPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+d29kZW4taW1wbC1kb208L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5jb20uc3VuLnhtbC5iaW5kPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF4Yi1pbXBsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPGV4Y2x1c2lvbnM+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+anNyMTczPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC54bWw8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICA8L2V4Y2x1c2lvbnM+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5jb20uc3VuLnhtbC5iaW5kPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF4Yi14amM8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD54YWxhbjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnhhbGFuPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS54bWxiZWFuczwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnhtbGJlYW5zPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+d3NkbDRqPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+d3NkbDRqPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5uZWV0aGk8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5uZWV0aGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC54bWwuYmluZDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmpheGItYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPGV4Y2x1c2lvbnM+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+anNyMTczPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC54bWw8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICA8L2V4Y2x1c2lvbnM+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8L2RlcGVuZGVuY2llcz4KLSAgICA8cHJvZmlsZXM+Ci0gICAgICAgIDxwcm9maWxlPgotICAgICAgICAgICAgPGlkPmphdmExNTwvaWQ+Ci0gICAgICAgICAgICA8YWN0aXZhdGlvbj4KLSAgICAgICAgICAgICAgICA8amRrPjEuNTwvamRrPgotICAgICAgICAgICAgPC9hY3RpdmF0aW9uPgotICAgICAgICAgICAgPGJ1aWxkPgotICAgICAgICAgICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2tpcD5mYWxzZTwvc2tpcD4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gVGhlIHBlcnRlc3QgZm9ya01vZGUgaXMgbm90IGlkZWFsIGJ1dCBzZWVtcyB0byBiZSBuZWNlc3NhcnkKLSAgICAgICAgICAgICAgICAgICAgICAgYmVjYXVzZSB0aGUgdGVzdCBzZXJ2ZXIgZG9lc24ndCBzaHV0IGRvd24gcHJvcGVybHkgOi0oCi0gICAgICAgICAgICAgICAgICAgICAgIFNob3VsZCBiZSByZW1vdmVkIGlmIHBvc3NpYmxlIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmb3JrTW9kZT5wZXJ0ZXN0PC9mb3JrTW9kZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJnTGluZT4tWG1zMjU2bSAtWG14NTEybTwvYXJnTGluZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEVuYWJsZSB0aGUgbmV4dCAyIGxpbmVzIGlmIHlvdSB3YW50IHRvIGF0dGFjaCBhIGRlYnVnZ2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAgPGFyZ0xpbmU+LVhkZWJ1ZyAtWG5vYWdlbnQgLURqYXZhLmNvbXBpbGVyPU5PTkUgLVhydW5qZHdwOnRyYW5zcG9ydD1kdF9zb2NrZXQsc2VydmVyPXksc3VzcGVuZD15LGFkZHJlc3M9NTAwNjwvYXJnTGluZT4tLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLypUZXN0LmphdmE8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqLypBYnN0cmFjdCouamF2YTwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovKlV0aWwqLmphdmE8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqLypJbnRlcm9wU3R1YlRlc3QuamF2YTwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovKlNlcnZpY2VHcm91cENvbnRleHRUZXN0LmphdmE8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqLypFY2hvUmF3U3dBRmlsZUlucHV0VGVzdC5qYXZhPC9leGNsdWRlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKm9yZy9hcGFjaGUvYXhpczIvc29hcDEydGVzdGluZy9zb2FwMTJ0ZXN0c3VpdGUvKi5qYXZhPC9leGNsdWRlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi9TY2VuYXJpb1NUMVRlc3QuamF2YTwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+Kiovc2FtcGxlcy93c2RsL3BlcmYyLyouamF2YTwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2V4Y2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzeXN0ZW1Qcm9wZXJ0aWVzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5idWlsZC5yZXBvc2l0b3J5PC9uYW1lPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZhbHVlPi4vdGFyZ2V0L3Rlc3QtY2xhc3NlczwvdmFsdWU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zeXN0ZW1Qcm9wZXJ0aWVzPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgICAgICA8L3BsdWdpbnM+Ci0gICAgICAgICAgICA8L2J1aWxkPgotICAgICAgICA8L3Byb2ZpbGU+Ci0gICAgICAgIDxwcm9maWxlPgotICAgICAgICAgICAgPGlkPmphdmExNjwvaWQ+Ci0gICAgICAgICAgICA8YWN0aXZhdGlvbj4KLSAgICAgICAgICAgICAgICA8amRrPjEuNjwvamRrPgotICAgICAgICAgICAgPC9hY3RpdmF0aW9uPgotICAgICAgICAgICAgPGJ1aWxkPgotICAgICAgICAgICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2tpcD5mYWxzZTwvc2tpcD4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gVGhlIHBlcnRlc3QgZm9ya01vZGUgaXMgbm90IGlkZWFsIGJ1dCBzZWVtcyB0byBiZSBuZWNlc3NhcnkKLSAgICAgICAgICAgICAgICAgICAgICAgYmVjYXVzZSB0aGUgdGVzdCBzZXJ2ZXIgZG9lc24ndCBzaHV0IGRvd24gcHJvcGVybHkgOi0oCi0gICAgICAgICAgICAgICAgICAgICAgIFNob3VsZCBiZSByZW1vdmVkIGlmIHBvc3NpYmxlIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmb3JrTW9kZT5wZXJ0ZXN0PC9mb3JrTW9kZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJnTGluZT4tWG1zMjU2bSAtWG14NTEybTwvYXJnTGluZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEVuYWJsZSB0aGUgbmV4dCAyIGxpbmVzIGlmIHlvdSB3YW50IHRvIGF0dGFjaCBhIGRlYnVnZ2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAgPGFyZ0xpbmU+LVhkZWJ1ZyAtWG5vYWdlbnQgLURqYXZhLmNvbXBpbGVyPU5PTkUgLVhydW5qZHdwOnRyYW5zcG9ydD1kdF9zb2NrZXQsc2VydmVyPXksc3VzcGVuZD15LGFkZHJlc3M9NTAwNjwvYXJnTGluZT4tLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLypUZXN0LmphdmE8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqLypBYnN0cmFjdCouamF2YTwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovKlV0aWwqLmphdmE8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqLypJbnRlcm9wU3R1YlRlc3QuamF2YTwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovKlNlcnZpY2VHcm91cENvbnRleHRUZXN0LmphdmE8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqLypFY2hvUmF3U3dBRmlsZUlucHV0VGVzdC5qYXZhPC9leGNsdWRlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKm9yZy9hcGFjaGUvYXhpczIvc29hcDEydGVzdGluZy9zb2FwMTJ0ZXN0c3VpdGUvKi5qYXZhPC9leGNsdWRlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi9TY2VuYXJpb1NUMVRlc3QuamF2YTwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+Kiovc2FtcGxlcy93c2RsL3BlcmYyLyouamF2YTwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmVUZXN0LmphdmE8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqL0NvbXBsZXhEYXRhVHlwZXNUZXN0LmphdmE8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9leGNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3lzdGVtUHJvcGVydGllcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+YnVpbGQucmVwb3NpdG9yeTwvbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2YWx1ZT4uL3RhcmdldC90ZXN0LWNsYXNzZXM8L3ZhbHVlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Byb3BlcnR5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3lzdGVtUHJvcGVydGllcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICAgICAgPC9wbHVnaW5zPgotICAgICAgICAgICAgPC9idWlsZD4KLSAgICAgICAgPC9wcm9maWxlPgotICAgICAgICA8cHJvZmlsZT4KLSAgICAgICAgICAgIDxpZD5lbnRlcnByaXNlPC9pZD4KLSAgICAgICAgICAgIDxidWlsZD4KLSAgICAgICAgICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFudHJ1bi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+Z2VuLWVudGVycHJpc2UtdHM8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+Z2VuZXJhdGUtdGVzdC1zb3VyY2VzPC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFza3M+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBTZXQgYSBwcm9wZXJ0eSB0aGF0IGNhbiBiZSBwaWNrZWQgdXAgZnJvbSB0aGUgYW50IGJ1aWxkLnhtbCdzIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJtYXZlbi5jbGFzcy5wYXRoIiByZWZpZD0ibWF2ZW4ucnVudGltZS5jbGFzc3BhdGgiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWNobz5CdWlsZGluZyBlbnRlcnByaXNlIFdTRExzLi4uPC9lY2hvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJheGlzMi5ob21lIiB2YWx1ZT0iJHtiYXNlZGlyfS90YXJnZXQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ibWF2ZW4uanVuaXQuanZtYXJncyIgdmFsdWU9IiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGlkPSJtYXZlbi5kZXBlbmRlbmN5LmNsYXNzcGF0aCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIHJlZmlkPSJtYXZlbi5jb21waWxlLmNsYXNzcGF0aCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YW50IGFudGZpbGU9Iml0ZXN0LWJ1aWxkLnhtbCIgaW5oZXJpdGFsbD0idHJ1ZSIgaW5oZXJpdHJlZnM9InRydWUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXI9Ii4iIHRhcmdldD0iZW50ZXJwcmlzZS13c2RsLWNvZGVnZW4iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFza3M+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+cnVuPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgICAgICA8L3BsdWdpbnM+Ci0gICAgICAgICAgICA8L2J1aWxkPgotICAgICAgICA8L3Byb2ZpbGU+Ci0gICAgPC9wcm9maWxlcz4KLSAgICA8YnVpbGQ+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+Z2VuZXJhdGUtdGVzdC1zb3VyY2VzPC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YXNrcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0idGVzdC5za2lwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlcXVhbHMgYXJnMT0idHJ1ZSIgYXJnMj0iJHttYXZlbi50ZXN0LnNraXB9Ii8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZGl0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWNobz4ke3Rlc3Quc2tpcH08L2VjaG8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJhZGRyZXNzaW5nX3ZlcnNpb24iIHZhbHVlPSIke3ZlcnNpb259Ii8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJtYXZlbi5jbGFzcy5wYXRoIiByZWZpZD0ibWF2ZW4ucnVudGltZS5jbGFzc3BhdGgiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im1hdmVuLnRlc3QucGF0aCIgcmVmaWQ9Im1hdmVuLmNvbXBpbGUuY2xhc3NwYXRoIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhbnQgYW50ZmlsZT0iaXRlc3QtYnVpbGQueG1sIiBpbmhlcml0YWxsPSJ0cnVlIiBpbmhlcml0cmVmcz0idHJ1ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXI9Ii4iIHRhcmdldD0iZ2VuZXJhdGUtdGVzdC1zb3VyY2VzIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YXNrcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5ydW48L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5idWlsZC1yZXBvPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT50ZXN0LWNvbXBpbGU8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhc2tzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJ0ZXN0LnNraXAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVxdWFscyBhcmcxPSJ0cnVlIiBhcmcyPSIke21hdmVuLnRlc3Quc2tpcH0iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25kaXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlY2hvPiR7dGVzdC5za2lwfTwvZWNobz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImFkZHJlc3NpbmdfdmVyc2lvbiIgdmFsdWU9IiR7dmVyc2lvbn0iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Imdyb292eS5hbGwudmVyc2lvbiIgdmFsdWU9IiR7Z3Jvb3Z5LmFsbC52ZXJzaW9ufSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ibWF2ZW4ucmVwby5sb2NhbCIgdmFsdWU9IiR7c2V0dGluZ3MubG9jYWxSZXBvc2l0b3J5fSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBpZD0ibWF2ZW4uZGVwZW5kZW5jeS5jbGFzc3BhdGgiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggcmVmaWQ9Im1hdmVuLmNvbXBpbGUuY2xhc3NwYXRoIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCByZWZpZD0ibWF2ZW4ucnVudGltZS5jbGFzc3BhdGgiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YW50IGFudGZpbGU9Iml0ZXN0LWJ1aWxkLnhtbCIgaW5oZXJpdGFsbD0idHJ1ZSIgaW5oZXJpdHJlZnM9InRydWUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyPSIuIiB0YXJnZXQ9ImJ1aWxkLXJlcG9zIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YXNrcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5ydW48L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvYnVpbGQ+Ci0gICAgPHJlcG9ydGluZz4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1yZXBvcnQtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgIDwvcGx1Z2lucz4KLSAgICA8L3JlcG9ydGluZz4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL0Jhc2VEYXRhVHlwZXMud3NkbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL0Jhc2VEYXRhVHlwZXMud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjkzMzA4NC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9CYXNlRGF0YVR5cGVzLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcxICswLDAgQEAKLTw/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+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9Db21wbGV4RGF0YVR5cGVzL0NvbXBsZXhEYXRhVHlwZXMud3NkbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL0NvbXBsZXhEYXRhVHlwZXMvQ29tcGxleERhdGFUeXBlcy53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTFhNTE0Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL0NvbXBsZXhEYXRhVHlwZXMvQ29tcGxleERhdGFUeXBlcy53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsMjA4MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/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+Ci0gICAgICAgIDwvd3NkbDpwb3J0PgotICAgIDwvd3NkbDpzZXJ2aWNlPgotPC93c2RsOmRlZmluaXRpb25zPgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvQ29tcGxleERhdGFUeXBlcy9NRVRBLUlORi9zZXJ2aWNlcy54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9Db21wbGV4RGF0YVR5cGVzL01FVEEtSU5GL3NlcnZpY2VzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFiYzFiOC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9Db21wbGV4RGF0YVR5cGVzL01FVEEtSU5GL3NlcnZpY2VzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHNlcnZpY2UgbmFtZT0iQ29tcGxleERhdGFUeXBlcyI+Ci0gICAgPG1lc3NhZ2VSZWNlaXZlcnM+Ci0gICAgICAgIDxtZXNzYWdlUmVjZWl2ZXIgbWVwPSJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaW4tb3V0IgotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJwYy5yZWNlaXZlcnMuUlBDTWVzc2FnZVJlY2VpdmVyIi8+Ci0gICAgPC9tZXNzYWdlUmVjZWl2ZXJzPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iU2VydmljZUNsYXNzIj5vcmcudGVtcHVyaS5jb21wbGV4LkNvbXBsZXhEYXRhVHlwZXM8L3BhcmFtZXRlcj4KLTwvc2VydmljZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9Db21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZS9Db21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZS53c2RsIGIvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmUvQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmUud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZmZDdhNS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9Db21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZS9Db21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZS53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsMTc5MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/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+Ci0gICAgICAgIDwvd3NkbDpwb3J0PgotICAgICAgICA8d3NkbDpwb3J0IG5hbWU9IkNvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlSHR0cHBvcnQiIGJpbmRpbmc9Im5zMTpDb21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZUh0dHBCaW5kaW5nIj4KLSAgICAgICAgICAgIDxodHRwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly8xMC4xMDAuMS4xMzI6ODA4MC9heGlzMi9zZXJ2aWNlcy9Db21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZSIvPgotICAgICAgICA8L3dzZGw6cG9ydD4KLQotICAgIDwvd3NkbDpzZXJ2aWNlPgotPC93c2RsOmRlZmluaXRpb25zPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL0ludmFsaWQud3NkbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL0ludmFsaWQud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg5OTU5NS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9JbnZhbGlkLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxkZWZpbml0aW9ucyB4bWxuczptaD0iaHR0cDovL3d3dy5Nb25zb24tSGFlZmVsLmNvbS9qd3Nib29rL0Jvb2tRdW90ZSIKLSAgICAgICAgICAgICB4bWxucz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iCi0gICAgICAgICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgICAgICB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIgotICAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy5Nb25zb24tSGFlZmVsLmNvbS9qd3Nib29rL0Jvb2tRdW90ZSIKLSAgICAgICAgICAgICBuYW1lPSJCb29rUXVvdGUiPgotICAgIDxtZXNzYWdlIG5hbWU9IkJvb2tRdW90ZV9nZXRCb29rUHJpY2UiPgotICAgICAgICA8cGFydCBuYW1lPSJpc2JuIiB0eXBlPSJ4c2Q6YW55VHlwZSIvPgotICAgICAgICA8cGFydCBuYW1lPSJudW1iZXIiIHR5cGU9InhzZDppbnQiLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iQm9va1F1b3RlX2dldEJvb2tQcmljZVJlc3BvbnNlIj4KLSAgICAgICAgPHBhcnQgbmFtZT0icmVzdWx0IiB0eXBlPSJ4c2Q6YW55VHlwZSIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJJbnZhbGlkSXNibkZhdWx0Ij4KLSAgICAgICAgPHBhcnQgbmFtZT0ibWVzc2FnZSIgdHlwZT0ieHNkOmFueVR5cGUiLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPHBvcnRUeXBlIG5hbWU9IkJvb2tRdW90ZSI+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iZ2V0Qm9va1ByaWNlIj4KLSAgICAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJtaDpCb29rUXVvdGVfZ2V0Qm9va1ByaWNlIi8+Ci0gICAgICAgICAgICA8b3V0cHV0IG1lc3NhZ2U9Im1oOkJvb2tRdW90ZV9nZXRCb29rUHJpY2VSZXNwb25zZSIvPgotICAgICAgICAgICAgPGZhdWx0IG5hbWU9IkludmFsaWRJc2JuRmF1bHQiIG1lc3NhZ2U9Im1oOkludmFsaWRJc2JuRmF1bHQiLz4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iZ2V0Qm9va1ByaWNlTm9uUm9idXN0Ij4KLSAgICAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJtaDpCb29rUXVvdGVfZ2V0Qm9va1ByaWNlIi8+Ci0gICAgICAgICAgICA8b3V0cHV0IG1lc3NhZ2U9Im1oOkJvb2tRdW90ZV9nZXRCb29rUHJpY2VSZXNwb25zZSIvPgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICA8L3BvcnRUeXBlPgotICAgIDxiaW5kaW5nIG5hbWU9IkJvb2tRdW90ZUJpbmRpbmciIHR5cGU9Im1oOkJvb2tRdW90ZSI+Ci0gICAgICAgIDxzb2FwOmJpbmRpbmcgc3R5bGU9InJwYyIKLSAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIvPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImdldEJvb2tQcmljZSI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0ibXlBY3Rpb24iLz4KLSAgICAgICAgICAgIDxpbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZT0iaHR0cDovL3d3dy5Nb25zb24tSGFlZmVsLmNvbS9qd3Nib29rL0Jvb2tRdW90ZS9Cb29rUXVvdGUiLz4KLSAgICAgICAgICAgIDwvaW5wdXQ+Ci0gICAgICAgICAgICA8b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlPSJodHRwOi8vd3d3Lk1vbnNvbi1IYWVmZWwuY29tL2p3c2Jvb2svQm9va1F1b3RlL0Jvb2tRdW90ZSIvPgotICAgICAgICAgICAgPC9vdXRwdXQ+Ci0gICAgICAgICAgICA8ZmF1bHQgbmFtZT0iSW52YWxpZElzYm5GYXVsdCI+Ci0gICAgICAgICAgICAgICAgPHNvYXA6ZmF1bHQgbmFtZT0iSW52YWxpZElzYm5GYXVsdCIgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L2ZhdWx0PgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJnZXRCb29rUHJpY2VOb25Sb2J1c3QiPgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Im15QWN0aW9uMiIvPgotICAgICAgICAgICAgPGlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlPSJodHRwOi8vd3d3Lk1vbnNvbi1IYWVmZWwuY29tL2p3c2Jvb2svQm9va1F1b3RlL0Jvb2tRdW90ZSIvPgotICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgIDxvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2U9Imh0dHA6Ly93d3cuTW9uc29uLUhhZWZlbC5jb20vandzYm9vay9Cb29rUXVvdGUvQm9va1F1b3RlIi8+Ci0gICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgPC9iaW5kaW5nPgotICAgIDxzZXJ2aWNlIG5hbWU9IkJvb2tRdW90ZVNlcnZpY2UiPgotICAgICAgICA8cG9ydCBuYW1lPSJCb29rUXVvdGVQb3J0IiBiaW5kaW5nPSJtaDpCb29rUXVvdGVCaW5kaW5nIj4KLSAgICAgICAgICAgIDxzb2FwOmFkZHJlc3MKLSAgICAgICAgICAgICAgICAgICAgbG9jYXRpb249Imh0dHA6Ly93d3cuTW9uc29uLUhhZWZlbC5jb20vandzYm9vay9Cb29rUXVvdGVTZXJ2aWNlIi8+Ci0gICAgICAgIDwvcG9ydD4KLSAgICA8L3NlcnZpY2U+Ci08L2RlZmluaXRpb25zPgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXBseU1lc3NhZ2VzL1NPQVAxMlJlcVQyNC54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcGx5TWVzc2FnZXMvU09BUDEyUmVxVDI0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRkMDdmNC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcGx5TWVzc2FnZXMvU09BUDEyUmVxVDI0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08ZW52OkVudmVsb3BlIHhtbG5zOmVudj0iaHR0cDovL3dyb25nLXZlcnNpb24vIj4KLSAgPGVudjpCb2R5PgotICAgIDx0ZXN0OmVjaG9PayB4bWxuczp0ZXN0PSJodHRwOi8vZXhhbXBsZS5vcmcvdHMtdGVzdHMiPgotICAgICAgZm9vCi0gICAgPC90ZXN0OmVjaG9Paz4KLSAgPC9lbnY6Qm9keT4KLTwvZW52OkVudmVsb3BlPgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXBseU1lc3NhZ2VzL1NPQVAxMlJlc1QxLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVwbHlNZXNzYWdlcy9TT0FQMTJSZXNUMS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2ZWI3YTIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXBseU1lc3NhZ2VzL1NPQVAxMlJlc1QxLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08ZW52OkVudmVsb3BlIHhtbG5zOmVudj0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIj4KLSA8ZW52OkhlYWRlcj4KLSAgPHRlc3Q6cmVzcG9uc2VPayB4bWxuczp0ZXN0PSJodHRwOi8vZXhhbXBsZS5vcmcvdHMtdGVzdHMiPgotICAgIGZvbwotICA8L3Rlc3Q6cmVzcG9uc2VPaz4KLSA8L2VudjpIZWFkZXI+Ci0gPGVudjpCb2R5PgotIDwvZW52OkJvZHk+Ci08L2VudjpFbnZlbG9wZT4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVwbHlNZXNzYWdlcy9TT0FQMTJSZXNUMTAueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXBseU1lc3NhZ2VzL1NPQVAxMlJlc1QxMC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4MjgxNzUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXBseU1lc3NhZ2VzL1NPQVAxMlJlc1QxMC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnID8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGVudjpFbnZlbG9wZSB4bWxuczplbnY9Imh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZSI+Ci0gICAgPGVudjpCb2R5PgotICAgIDwvZW52OkJvZHk+Ci08L2VudjpFbnZlbG9wZT4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVwbHlNZXNzYWdlcy9TT0FQMTJSZXNUMTEueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXBseU1lc3NhZ2VzL1NPQVAxMlJlc1QxMS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4MjgxNzUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXBseU1lc3NhZ2VzL1NPQVAxMlJlc1QxMS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnID8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGVudjpFbnZlbG9wZSB4bWxuczplbnY9Imh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZSI+Ci0gICAgPGVudjpCb2R5PgotICAgIDwvZW52OkJvZHk+Ci08L2VudjpFbnZlbG9wZT4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVwbHlNZXNzYWdlcy9TT0FQMTJSZXNUMTIueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXBseU1lc3NhZ2VzL1NPQVAxMlJlc1QxMi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxZDUzMTEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXBseU1lc3NhZ2VzL1NPQVAxMlJlc1QxMi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnID8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGVudjpFbnZlbG9wZSB4bWxuczplbnY9Imh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZSI+Ci0gIDxlbnY6SGVhZGVyPgotICAgIDxlbnY6Tm90VW5kZXJzdG9vZCBxbmFtZT0idGVzdDpVbmtub3duIgotICAgICAgIHhtbG5zOnRlc3Q9Imh0dHA6Ly9leGFtcGxlLm9yZy90cy10ZXN0cyIgLz4KLSAgPC9lbnY6SGVhZGVyPgotICA8ZW52OkJvZHk+Ci0gICAgPGVudjpGYXVsdD4KLSAgICAgIDxlbnY6Q29kZT4KLSAgICAgICAgPGVudjpWYWx1ZT5lbnY6TXVzdFVuZGVyc3RhbmQ8L2VudjpWYWx1ZT4KLSAgICAgIDwvZW52OkNvZGU+Ci0gICAgICA8ZW52OlJlYXNvbj4KLSAgICAgICAgPGVudjpUZXh0IHhtbDpsYW5nPSJlbi1VUyI+IEhlYWRlciBub3QgdW5kZXJzdG9vZCA8L2VudjpUZXh0PgotICAgICAgPC9lbnY6UmVhc29uPgotICAgIDwvZW52OkZhdWx0PgotICA8L2VudjpCb2R5PgotPC9lbnY6RW52ZWxvcGU+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcGx5TWVzc2FnZXMvU09BUDEyUmVzVDEzLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVwbHlNZXNzYWdlcy9TT0FQMTJSZXNUMTMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmEwZjhhLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVwbHlNZXNzYWdlcy9TT0FQMTJSZXNUMTMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyA/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxlbnY6RW52ZWxvcGUgeG1sbnM6ZW52PSJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUiPgotICA8ZW52OkhlYWRlcj4KLSAgICA8ZW52Ok5vdFVuZGVyc3Rvb2QgcW5hbWU9InRlc3Q6VW5rbm93biIKLSAgICAgICB4bWxuczp0ZXN0PSJodHRwOi8vZXhhbXBsZS5vcmcvdHMtdGVzdHMiIC8+Ci0gIDwvZW52OkhlYWRlcj4KLSAgPGVudjpCb2R5PgotICAgIDxlbnY6RmF1bHQ+Ci0gICAgICA8ZW52OkNvZGU+Ci0gICAgICAgIDxlbnY6VmFsdWU+ZW52Ok11c3RVbmRlcnN0YW5kPC9lbnY6VmFsdWU+Ci0gICAgICA8L2VudjpDb2RlPgotICAgICAgPGVudjpSZWFzb24+Ci0gICAgICAgIDxlbnY6VGV4dCB4bWw6bGFuZz0iZW4tVVMiPgotICAgICAgICAgIEhlYWRlciBub3QgdW5kZXJzdG9vZAotICAgICAgICA8L2VudjpUZXh0PgotICAgICAgPC9lbnY6UmVhc29uPgotICAgIDwvZW52OkZhdWx0PgotICA8L2VudjpCb2R5PgotPC9lbnY6RW52ZWxvcGU+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcGx5TWVzc2FnZXMvU09BUDEyUmVzVDE0LnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVwbHlNZXNzYWdlcy9TT0FQMTJSZXNUMTQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOGIwMzZjLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVwbHlNZXNzYWdlcy9TT0FQMTJSZXNUMTQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyA/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxlbnY6RW52ZWxvcGUgeG1sbnM6ZW52PSJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUiPgotICA8ZW52OkJvZHk+Ci0gICAgPGVudjpGYXVsdD4KLSAgICAgIDxlbnY6Q29kZT4KLSAgICAgICAgPGVudjpWYWx1ZT5lbnY6U2VuZGVyPC9lbnY6VmFsdWU+Ci0gICAgICAgPC9lbnY6Q29kZT4KLSAgICAgICA8ZW52OlJlYXNvbj4KLSAgICAgICAgPGVudjpUZXh0IHhtbDpsYW5nPSJlbi1VUyI+Ci0gICAgICAgICAgZW52Om11c3RVbmRlcnN0YW5kIHZhbHVlIGlzIG5vdCBib29sZWFuCi0gICAgICAgIDwvZW52OlRleHQ+Ci0gICAgICAgPC9lbnY6UmVhc29uPgotICAgICA8L2VudjpGYXVsdD4KLSAgPC9lbnY6Qm9keT4KLTwvZW52OkVudmVsb3BlPgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXBseU1lc3NhZ2VzL1NPQVAxMlJlc1QxNS54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcGx5TWVzc2FnZXMvU09BUDEyUmVzVDE1LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTgyODE3NS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcGx5TWVzc2FnZXMvU09BUDEyUmVzVDE1LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08ZW52OkVudmVsb3BlIHhtbG5zOmVudj0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIj4KLSAgICA8ZW52OkJvZHk+Ci0gICAgPC9lbnY6Qm9keT4KLTwvZW52OkVudmVsb3BlPgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXBseU1lc3NhZ2VzL1NPQVAxMlJlc1QxNi54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcGx5TWVzc2FnZXMvU09BUDEyUmVzVDE2LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTFkNTMxMS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcGx5TWVzc2FnZXMvU09BUDEyUmVzVDE2LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08ZW52OkVudmVsb3BlIHhtbG5zOmVudj0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIj4KLSAgPGVudjpIZWFkZXI+Ci0gICAgPGVudjpOb3RVbmRlcnN0b29kIHFuYW1lPSJ0ZXN0OlVua25vd24iCi0gICAgICAgeG1sbnM6dGVzdD0iaHR0cDovL2V4YW1wbGUub3JnL3RzLXRlc3RzIiAvPgotICA8L2VudjpIZWFkZXI+Ci0gIDxlbnY6Qm9keT4KLSAgICA8ZW52OkZhdWx0PgotICAgICAgPGVudjpDb2RlPgotICAgICAgICA8ZW52OlZhbHVlPmVudjpNdXN0VW5kZXJzdGFuZDwvZW52OlZhbHVlPgotICAgICAgPC9lbnY6Q29kZT4KLSAgICAgIDxlbnY6UmVhc29uPgotICAgICAgICA8ZW52OlRleHQgeG1sOmxhbmc9ImVuLVVTIj4gSGVhZGVyIG5vdCB1bmRlcnN0b29kIDwvZW52OlRleHQ+Ci0gICAgICA8L2VudjpSZWFzb24+Ci0gICAgPC9lbnY6RmF1bHQ+Ci0gIDwvZW52OkJvZHk+Ci08L2VudjpFbnZlbG9wZT4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVwbHlNZXNzYWdlcy9TT0FQMTJSZXNUMTdfQi54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcGx5TWVzc2FnZXMvU09BUDEyUmVzVDE3X0IueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjgxM2FlLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVwbHlNZXNzYWdlcy9TT0FQMTJSZXNUMTdfQi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnID8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGVudjpFbnZlbG9wZSB4bWxuczplbnY9Imh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZSI+Ci0gIDxlbnY6SGVhZGVyPgotICAgIDxlbnY6Tm90VW5kZXJzdG9vZCBxbmFtZT0idGVzdDpVbmtub3duIgotICAgICAgIHhtbG5zOnRlc3Q9Imh0dHA6Ly9leGFtcGxlLm9yZy90cy10ZXN0cyIvPgotICA8L2VudjpIZWFkZXI+Ci0gIDxlbnY6Qm9keT4KLSAgICA8ZW52OkZhdWx0PgotICAgICAgPGVudjpDb2RlPgotICAgICAgICA8ZW52OlZhbHVlPmVudjpNdXN0VW5kZXJzdGFuZDwvZW52OlZhbHVlPgotICAgICAgPC9lbnY6Q29kZT4KLSAgICAgIDxlbnY6UmVhc29uPgotICAgICAgICA8ZW52OlRleHQgeG1sOmxhbmc9ImVuLVVTIj4gSGVhZGVyIG5vdCB1bmRlcnN0b29kIDwvZW52OlRleHQ+Ci0gICAgICA8L2VudjpSZWFzb24+Ci0gICAgPC9lbnY6RmF1bHQ+Ci0gIDwvZW52OkJvZHk+Ci08L2VudjpFbnZlbG9wZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcGx5TWVzc2FnZXMvU09BUDEyUmVzVDE4X0MueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXBseU1lc3NhZ2VzL1NPQVAxMlJlc1QxOF9DLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzkxZWViYi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcGx5TWVzc2FnZXMvU09BUDEyUmVzVDE4X0MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyA/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxlbnY6RW52ZWxvcGUgeG1sbnM6ZW52PSJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUiPgotICAgIDxlbnY6SGVhZGVyPgotICAgIDwvZW52OkhlYWRlcj4KLSAgPGVudjpCb2R5PgotICA8L2VudjpCb2R5PgotPC9lbnY6RW52ZWxvcGU+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcGx5TWVzc2FnZXMvU09BUDEyUmVzVDE5LnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVwbHlNZXNzYWdlcy9TT0FQMTJSZXNUMTkueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDM0MzBlLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVwbHlNZXNzYWdlcy9TT0FQMTJSZXNUMTkueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyA/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxlbnY6RW52ZWxvcGUgeG1sbnM6ZW52PSJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUiPgotICA8ZW52OkJvZHk+Ci0gIDwvZW52OkJvZHk+Ci08L2VudjpFbnZlbG9wZT4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVwbHlNZXNzYWdlcy9TT0FQMTJSZXNUMi54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcGx5TWVzc2FnZXMvU09BUDEyUmVzVDIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmViN2EyLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVwbHlNZXNzYWdlcy9TT0FQMTJSZXNUMi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnID8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGVudjpFbnZlbG9wZSB4bWxuczplbnY9Imh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZSI+Ci0gPGVudjpIZWFkZXI+Ci0gIDx0ZXN0OnJlc3BvbnNlT2sgeG1sbnM6dGVzdD0iaHR0cDovL2V4YW1wbGUub3JnL3RzLXRlc3RzIj4KLSAgICBmb28KLSAgPC90ZXN0OnJlc3BvbnNlT2s+Ci0gPC9lbnY6SGVhZGVyPgotIDxlbnY6Qm9keT4KLSA8L2VudjpCb2R5PgotPC9lbnY6RW52ZWxvcGU+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcGx5TWVzc2FnZXMvU09BUDEyUmVzVDIxX0IueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXBseU1lc3NhZ2VzL1NPQVAxMlJlc1QyMV9CLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTkzMjQyYS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcGx5TWVzc2FnZXMvU09BUDEyUmVzVDIxX0IueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyA/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxlbnY6RW52ZWxvcGUgeG1sbnM6ZW52PSJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUiPgotICA8ZW52OkhlYWRlcj4KLSAgICA8ZW52Ok5vdFVuZGVyc3Rvb2QgcW5hbWU9InRlc3Q6VW5rbm93biIgCi0gICAgICAgeG1sbnM6dGVzdD0iaHR0cDovL2V4YW1wbGUub3JnL3RzLXRlc3RzIiAvPgotICA8L2VudjpIZWFkZXI+Ci0gIDxlbnY6Qm9keT4KLSAgICA8ZW52OkZhdWx0PgotICAgICAgPGVudjpDb2RlPgotICAgICAgICA8ZW52OlZhbHVlPmVudjpNdXN0VW5kZXJzdGFuZDwvZW52OlZhbHVlPgotICAgICAgPC9lbnY6Q29kZT4KLSAgICAgIDxlbnY6UmVhc29uPgotICAgICAgICA8ZW52OlRleHQgeG1sOmxhbmc9ImVuLVVTIj4gSGVhZGVyIG5vdCB1bmRlcnN0b29kIDwvZW52OlRleHQ+Ci0gICAgICA8L2VudjpSZWFzb24+Ci0gICAgICA8ZW52Ok5vZGU+aHR0cDovL2V4YW1wbGUub3JnL3RzLXRlc3RzL0I8L2VudjpOb2RlPgotICAgICAgPGVudjpSb2xlPmh0dHA6Ly9leGFtcGxlLm9yZy90cy10ZXN0cy9CPC9lbnY6Um9sZT4KLSAgICA8L2VudjpGYXVsdD4KLSAgPC9lbnY6Qm9keT4KLTwvZW52OkVudmVsb3BlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVwbHlNZXNzYWdlcy9TT0FQMTJSZXNUMjIueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXBseU1lc3NhZ2VzL1NPQVAxMlJlc1QyMi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxYTBhYWEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXBseU1lc3NhZ2VzL1NPQVAxMlJlc1QyMi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnID8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGVudjpFbnZlbG9wZSB4bWxuczplbnY9Imh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZSI+Ci0gIDxlbnY6SGVhZGVyPgotICAgIDx0ZXN0OnJlc3BvbnNlT2sgeG1sbnM6dGVzdD0iaHR0cDovL2V4YW1wbGUub3JnL3RzLXRlc3RzIj4KLSAgICAgIGZvbwotICAgIDwvdGVzdDpyZXNwb25zZU9rPgotICA8L2VudjpIZWFkZXI+Ci0gIDxlbnY6Qm9keT4KLSAgICA8dGVzdDpyZXNwb25zZU9rIHhtbG5zOnRlc3Q9Imh0dHA6Ly9leGFtcGxlLm9yZy90cy10ZXN0cyI+Ci0gICAgICBmb28KLSAgICA8L3Rlc3Q6cmVzcG9uc2VPaz4KLSAgPC9lbnY6Qm9keT4KLTwvZW52OkVudmVsb3BlPgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXBseU1lc3NhZ2VzL1NPQVAxMlJlc1QyMy54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcGx5TWVzc2FnZXMvU09BUDEyUmVzVDIzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThiMDM2Yy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcGx5TWVzc2FnZXMvU09BUDEyUmVzVDIzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08ZW52OkVudmVsb3BlIHhtbG5zOmVudj0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIj4KLSAgPGVudjpCb2R5PgotICAgIDxlbnY6RmF1bHQ+Ci0gICAgICA8ZW52OkNvZGU+Ci0gICAgICAgIDxlbnY6VmFsdWU+ZW52OlNlbmRlcjwvZW52OlZhbHVlPgotICAgICAgIDwvZW52OkNvZGU+Ci0gICAgICAgPGVudjpSZWFzb24+Ci0gICAgICAgIDxlbnY6VGV4dCB4bWw6bGFuZz0iZW4tVVMiPgotICAgICAgICAgIGVudjptdXN0VW5kZXJzdGFuZCB2YWx1ZSBpcyBub3QgYm9vbGVhbgotICAgICAgICA8L2VudjpUZXh0PgotICAgICAgIDwvZW52OlJlYXNvbj4KLSAgICAgPC9lbnY6RmF1bHQ+Ci0gIDwvZW52OkJvZHk+Ci08L2VudjpFbnZlbG9wZT4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVwbHlNZXNzYWdlcy9TT0FQMTJSZXNUMjQueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXBseU1lc3NhZ2VzL1NPQVAxMlJlc1QyNC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyNDQ1ZDkuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXBseU1lc3NhZ2VzL1NPQVAxMlJlc1QyNC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnID8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGVudjpFbnZlbG9wZSB4bWxuczplbnY9Imh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZSI+Ci0gIDxlbnY6Qm9keT4KLSAgICA8ZW52OkZhdWx0PgotICAgICAgPGVudjpDb2RlPgotICAgICAgICA8ZW52OlZhbHVlPmVudjpWZXJzaW9uTWlzbWF0Y2g8L2VudjpWYWx1ZT4KLSAgICAgIDwvZW52OkNvZGU+Ci0gICAgICA8ZW52OlJlYXNvbj4KLSAgICAgICAgPGVudjpUZXh0IHhtbDpsYW5nPSJlbi1VUyI+IFdyb25nIFZlcnNpb24gPC9lbnY6VGV4dD4KLSAgICAgIDwvZW52OlJlYXNvbj4KLSAgICA8L2VudjpGYXVsdD4KLSAgPC9lbnY6Qm9keT4KLTwvZW52OkVudmVsb3BlPgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXBseU1lc3NhZ2VzL1NPQVAxMlJlc1QyNS54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcGx5TWVzc2FnZXMvU09BUDEyUmVzVDI1LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDNhMzFjYy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcGx5TWVzc2FnZXMvU09BUDEyUmVzVDI1LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08ZW52OkVudmVsb3BlIHhtbG5zOmVudj0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIj4KLSAgPGVudjpCb2R5PgotICAgICA8ZW52OkZhdWx0PgotICAgICAgIDxlbnY6Q29kZT4KLSAgICAgICAgPGVudjpWYWx1ZT5lbnY6U2VuZGVyPC9lbnY6VmFsdWU+Ci0gICAgICAgPC9lbnY6Q29kZT4KLSAgICAgICA8ZW52OlJlYXNvbj4KLSAgICAgICAgPGVudjpUZXh0IHhtbDpsYW5nPSJlbi1VUyI+Ci0gICAgICAgICAgRFREIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IFNPQVAgMS4yCi0gICAgICAgIDwvZW52OlRleHQ+Ci0gICAgICAgPC9lbnY6UmVhc29uPgotICAgICA8L2VudjpGYXVsdD4KLSAgPC9lbnY6Qm9keT4KLTwvZW52OkVudmVsb3BlPgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXBseU1lc3NhZ2VzL1NPQVAxMlJlc1QyNi54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcGx5TWVzc2FnZXMvU09BUDEyUmVzVDI2LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQzOTJiZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcGx5TWVzc2FnZXMvU09BUDEyUmVzVDI2LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08ZW52OkVudmVsb3BlIHhtbG5zOmVudj0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIj4KLSAgPGVudjpCb2R5PgotICAgIDx0ZXN0OnJlc3BvbnNlT2sgeG1sbnM6dGVzdD0iaHR0cDovL2V4YW1wbGUub3JnL3RzLXRlc3RzIj4KLSAgICAgIGZvbwotICAgIDwvdGVzdDpyZXNwb25zZU9rPgotIDwvZW52OkJvZHk+Ci08L2VudjpFbnZlbG9wZT4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVwbHlNZXNzYWdlcy9TT0FQMTJSZXNUMjkueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXBseU1lc3NhZ2VzL1NPQVAxMlJlc1QyOS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwMzQzMGUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXBseU1lc3NhZ2VzL1NPQVAxMlJlc1QyOS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnID8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGVudjpFbnZlbG9wZSB4bWxuczplbnY9Imh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZSI+Ci0gIDxlbnY6Qm9keT4KLSAgPC9lbnY6Qm9keT4KLTwvZW52OkVudmVsb3BlPgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXBseU1lc3NhZ2VzL1NPQVAxMlJlc1QzLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVwbHlNZXNzYWdlcy9TT0FQMTJSZXNUMy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxMmU4ZTcuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXBseU1lc3NhZ2VzL1NPQVAxMlJlc1QzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08ZW52OkVudmVsb3BlIHhtbG5zOmVudj0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIj4KLSAgPGVudjpIZWFkZXI+Ci0gICAgPHRlc3Q6cmVzcG9uc2VPayB4bWxuczp0ZXN0PSJodHRwOi8vZXhhbXBsZS5vcmcvdHMtdGVzdHMiPgotICAgICAgZm9vCi0gICAgPC90ZXN0OnJlc3BvbnNlT2s+Ci0gIDwvZW52OkhlYWRlcj4KLSAgPGVudjpCb2R5PgotICA8L2VudjpCb2R5PgotPC9lbnY6RW52ZWxvcGU+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcGx5TWVzc2FnZXMvU09BUDEyUmVzVDMwLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVwbHlNZXNzYWdlcy9TT0FQMTJSZXNUMzAueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOGMyNTY5Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVwbHlNZXNzYWdlcy9TT0FQMTJSZXNUMzAueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyA/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxlbnY6RW52ZWxvcGUgeG1sbnM6ZW52PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlIj4KLSAgPGVudjpIZWFkZXI+Ci0gICAgPGVudjpVcGdyYWRlPgotICAgICAgPGVudjpTdXBwb3J0ZWRFbnZlbG9wZSBxbmFtZT0ibnMyOkVudmVsb3BlIgotICAgICAgICAgICAgICAgIHhtbG5zOm5zMj0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIi8+Ci0gICAgIDwvZW52OlVwZ3JhZGU+Ci0gIDwvZW52OkhlYWRlcj4KLSAgPGVudjpCb2R5PgotICAgIDxlbnY6RmF1bHQ+Ci0gICAgICA8ZmF1bHRjb2RlPmVudjpWZXJzaW9uTWlzbWF0Y2g8L2ZhdWx0Y29kZT4KLSAgICAgIDxmYXVsdHN0cmluZz5Xcm9uZyBWZXJzaW9uPC9mYXVsdHN0cmluZz4KLSAgICA8L2VudjpGYXVsdD4KLSAgPC9lbnY6Qm9keT4KLTwvZW52OkVudmVsb3BlPgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXBseU1lc3NhZ2VzL1NPQVAxMlJlc1QzMS54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcGx5TWVzc2FnZXMvU09BUDEyUmVzVDMxLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhmZDkzNy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcGx5TWVzc2FnZXMvU09BUDEyUmVzVDMxLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08ZW52OkVudmVsb3BlIHhtbG5zOmVudj0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIj4KLSAgPGVudjpCb2R5PgotICAgIDx0ZXN0OnJldHVyblZvaWRSZXNwb25zZSB4bWxuczp0ZXN0PSJodHRwOi8vZXhhbXBsZS5vcmcvdHMtdGVzdHMiPgotICAgIDwvdGVzdDpyZXR1cm5Wb2lkUmVzcG9uc2U+Ci0gPC9lbnY6Qm9keT4KLTwvZW52OkVudmVsb3BlPgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXBseU1lc3NhZ2VzL1NPQVAxMlJlc1QzMi54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcGx5TWVzc2FnZXMvU09BUDEyUmVzVDMyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQ0MjFiYy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcGx5TWVzc2FnZXMvU09BUDEyUmVzVDMyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08ZW52OkVudmVsb3BlIHhtbG5zOmVudj0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIj4KLSAgPGVudjpCb2R5PgotICAgIDx0ZXN0OmVjaG9IZWFkZXJSZXNwb25zZSB4bWxuczp0ZXN0PSJodHRwOi8vZXhhbXBsZS5vcmcvdHMtdGVzdHMiPgotICAgICAgZm9vCi0gICAgPC90ZXN0OmVjaG9IZWFkZXJSZXNwb25zZT4KLSAgPC9lbnY6Qm9keT4KLTwvZW52OkVudmVsb3BlPgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXBseU1lc3NhZ2VzL1NPQVAxMlJlc1QzMy54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcGx5TWVzc2FnZXMvU09BUDEyUmVzVDMzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzkzMDhjZi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcGx5TWVzc2FnZXMvU09BUDEyUmVzVDMzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08ZW52OkVudmVsb3BlIHhtbG5zOmVudj0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIj4KLSAgPGVudjpCb2R5PgotICAgICA8ZW52OkZhdWx0PgotICAgICAgIDxlbnY6Q29kZT4KLSAgICAgICAgIDxlbnY6VmFsdWU+ZW52OlNlbmRlcjwvZW52OlZhbHVlPgotICAgICAgICAgPGVudjpTdWJjb2RlPgotICAgICAgICAgICA8ZW52OlZhbHVlPnJwYzpQcm9jZWR1cmVOb3RQcmVzZW50PC9lbnY6VmFsdWU+Ci0gICAgICAgICA8L2VudjpTdWJjb2RlPgotICAgICAgIDwvZW52OkNvZGU+Ci0gICAgICAgPGVudjpSZWFzb24+Ci0gICAgICAgIDxlbnY6VGV4dCB4bWw6bGFuZz0iZW4tVVMiPiBQcm9jZWR1cmUgTm90IFByZXNlbnQgPC9lbnY6VGV4dD4KLSAgICAgICA8L2VudjpSZWFzb24+Ci0gICAgIDwvZW52OkZhdWx0PgotICA8L2VudjpCb2R5PgotPC9lbnY6RW52ZWxvcGU+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcGx5TWVzc2FnZXMvU09BUDEyUmVzVDM0LnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVwbHlNZXNzYWdlcy9TT0FQMTJSZXNUMzQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDM0MzBlLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVwbHlNZXNzYWdlcy9TT0FQMTJSZXNUMzQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyA/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxlbnY6RW52ZWxvcGUgeG1sbnM6ZW52PSJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUiPgotICA8ZW52OkJvZHk+Ci0gIDwvZW52OkJvZHk+Ci08L2VudjpFbnZlbG9wZT4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVwbHlNZXNzYWdlcy9TT0FQMTJSZXNUMzUueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXBseU1lc3NhZ2VzL1NPQVAxMlJlc1QzNS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxZDUzMTEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXBseU1lc3NhZ2VzL1NPQVAxMlJlc1QzNS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnID8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGVudjpFbnZlbG9wZSB4bWxuczplbnY9Imh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZSI+Ci0gIDxlbnY6SGVhZGVyPgotICAgIDxlbnY6Tm90VW5kZXJzdG9vZCBxbmFtZT0idGVzdDpVbmtub3duIgotICAgICAgIHhtbG5zOnRlc3Q9Imh0dHA6Ly9leGFtcGxlLm9yZy90cy10ZXN0cyIgLz4KLSAgPC9lbnY6SGVhZGVyPgotICA8ZW52OkJvZHk+Ci0gICAgPGVudjpGYXVsdD4KLSAgICAgIDxlbnY6Q29kZT4KLSAgICAgICAgPGVudjpWYWx1ZT5lbnY6TXVzdFVuZGVyc3RhbmQ8L2VudjpWYWx1ZT4KLSAgICAgIDwvZW52OkNvZGU+Ci0gICAgICA8ZW52OlJlYXNvbj4KLSAgICAgICAgPGVudjpUZXh0IHhtbDpsYW5nPSJlbi1VUyI+IEhlYWRlciBub3QgdW5kZXJzdG9vZCA8L2VudjpUZXh0PgotICAgICAgPC9lbnY6UmVhc29uPgotICAgIDwvZW52OkZhdWx0PgotICA8L2VudjpCb2R5PgotPC9lbnY6RW52ZWxvcGU+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcGx5TWVzc2FnZXMvU09BUDEyUmVzVDM2LnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVwbHlNZXNzYWdlcy9TT0FQMTJSZXNUMzYueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWQ1MzExLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVwbHlNZXNzYWdlcy9TT0FQMTJSZXNUMzYueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyA/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxlbnY6RW52ZWxvcGUgeG1sbnM6ZW52PSJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUiPgotICA8ZW52OkhlYWRlcj4KLSAgICA8ZW52Ok5vdFVuZGVyc3Rvb2QgcW5hbWU9InRlc3Q6VW5rbm93biIKLSAgICAgICB4bWxuczp0ZXN0PSJodHRwOi8vZXhhbXBsZS5vcmcvdHMtdGVzdHMiIC8+Ci0gIDwvZW52OkhlYWRlcj4KLSAgPGVudjpCb2R5PgotICAgIDxlbnY6RmF1bHQ+Ci0gICAgICA8ZW52OkNvZGU+Ci0gICAgICAgIDxlbnY6VmFsdWU+ZW52Ok11c3RVbmRlcnN0YW5kPC9lbnY6VmFsdWU+Ci0gICAgICA8L2VudjpDb2RlPgotICAgICAgPGVudjpSZWFzb24+Ci0gICAgICAgIDxlbnY6VGV4dCB4bWw6bGFuZz0iZW4tVVMiPiBIZWFkZXIgbm90IHVuZGVyc3Rvb2QgPC9lbnY6VGV4dD4KLSAgICAgIDwvZW52OlJlYXNvbj4KLSAgICA8L2VudjpGYXVsdD4KLSAgPC9lbnY6Qm9keT4KLTwvZW52OkVudmVsb3BlPgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXBseU1lc3NhZ2VzL1NPQVAxMlJlc1QzNy54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcGx5TWVzc2FnZXMvU09BUDEyUmVzVDM3LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjAzNDMwZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcGx5TWVzc2FnZXMvU09BUDEyUmVzVDM3LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08ZW52OkVudmVsb3BlIHhtbG5zOmVudj0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIj4KLSAgPGVudjpCb2R5PgotICA8L2VudjpCb2R5PgotPC9lbnY6RW52ZWxvcGU+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcGx5TWVzc2FnZXMvU09BUDEyUmVzVDM4XzEueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXBseU1lc3NhZ2VzL1NPQVAxMlJlc1QzOF8xLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTEyZThlNy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcGx5TWVzc2FnZXMvU09BUDEyUmVzVDM4XzEueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyA/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxlbnY6RW52ZWxvcGUgeG1sbnM6ZW52PSJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUiPgotICA8ZW52OkhlYWRlcj4KLSAgICA8dGVzdDpyZXNwb25zZU9rIHhtbG5zOnRlc3Q9Imh0dHA6Ly9leGFtcGxlLm9yZy90cy10ZXN0cyI+Ci0gICAgICBmb28KLSAgICA8L3Rlc3Q6cmVzcG9uc2VPaz4KLSAgPC9lbnY6SGVhZGVyPgotICA8ZW52OkJvZHk+Ci0gIDwvZW52OkJvZHk+Ci08L2VudjpFbnZlbG9wZT4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVwbHlNZXNzYWdlcy9TT0FQMTJSZXNUMzhfMi54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcGx5TWVzc2FnZXMvU09BUDEyUmVzVDM4XzIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTExNGY1Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVwbHlNZXNzYWdlcy9TT0FQMTJSZXNUMzhfMi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnID8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGVudjpFbnZlbG9wZSB4bWxuczplbnY9Imh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZSI+Ci0gIDxlbnY6SGVhZGVyPgotICAgIDx0ZXN0OnJlc3BvbnNlT2sgeG1sbnM6dGVzdD0iaHR0cDovL2V4YW1wbGUub3JnL3RzLXRlc3RzIj4KLSAgICAgIGZvbwotICAgIDwvdGVzdDpyZXNwb25zZU9rPgotICAgIDx0ZXN0OnJlc3BvbnNlT2sgeG1sbnM6dGVzdD0iaHR0cDovL2V4YW1wbGUub3JnL3RzLXRlc3RzIj4KLSAgICAgIGJhcgotICAgIDwvdGVzdDpyZXNwb25zZU9rPgotICA8L2VudjpIZWFkZXI+Ci0gIDxlbnY6Qm9keT4KLSAgPC9lbnY6Qm9keT4KLTwvZW52OkVudmVsb3BlPgotCi0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVwbHlNZXNzYWdlcy9TT0FQMTJSZXNUMzkueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXBseU1lc3NhZ2VzL1NPQVAxMlJlc1QzOS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzYjQwMmIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXBseU1lc3NhZ2VzL1NPQVAxMlJlc1QzOS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnID8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGVudjpFbnZlbG9wZSB4bWxuczplbnY9Imh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZSI+Ci0gIDxlbnY6Qm9keT4KLSAgICA8ZW52OkZhdWx0PgotICAgICAgPGVudjpDb2RlPgotICAgICAgICA8ZW52OlZhbHVlPmVudjpTZW5kZXI8L2VudjpWYWx1ZT4KLSAgICAgIDwvZW52OkNvZGU+Ci0gICAgICA8ZW52OlJlYXNvbj4KLSAgICAgICAgPGVudjpUZXh0IHhtbDpsYW5nPSJlbi1VUyI+Ci0gICAgICAgICAgZW52Om11c3RVbmRlcnN0YW5kIGlzIGEgeHNkOmJvb2xlYW4KLSAgICAgICAgPC9lbnY6VGV4dD4KLSAgICAgIDwvZW52OlJlYXNvbj4KLSAgICA8L2VudjpGYXVsdD4KLSAgPC9lbnY6Qm9keT4KLTwvZW52OkVudmVsb3BlPgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXBseU1lc3NhZ2VzL1NPQVAxMlJlc1Q0LnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVwbHlNZXNzYWdlcy9TT0FQMTJSZXNUNC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxMmU4ZTcuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXBseU1lc3NhZ2VzL1NPQVAxMlJlc1Q0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08ZW52OkVudmVsb3BlIHhtbG5zOmVudj0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIj4KLSAgPGVudjpIZWFkZXI+Ci0gICAgPHRlc3Q6cmVzcG9uc2VPayB4bWxuczp0ZXN0PSJodHRwOi8vZXhhbXBsZS5vcmcvdHMtdGVzdHMiPgotICAgICAgZm9vCi0gICAgPC90ZXN0OnJlc3BvbnNlT2s+Ci0gIDwvZW52OkhlYWRlcj4KLSAgPGVudjpCb2R5PgotICA8L2VudjpCb2R5PgotPC9lbnY6RW52ZWxvcGU+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcGx5TWVzc2FnZXMvU09BUDEyUmVzVDQwLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVwbHlNZXNzYWdlcy9TT0FQMTJSZXNUNDAueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDM0MzBlLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVwbHlNZXNzYWdlcy9TT0FQMTJSZXNUNDAueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyA/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxlbnY6RW52ZWxvcGUgeG1sbnM6ZW52PSJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUiPgotICA8ZW52OkJvZHk+Ci0gIDwvZW52OkJvZHk+Ci08L2VudjpFbnZlbG9wZT4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVwbHlNZXNzYWdlcy9TT0FQMTJSZXNUNS54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcGx5TWVzc2FnZXMvU09BUDEyUmVzVDUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDM0MzBlLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVwbHlNZXNzYWdlcy9TT0FQMTJSZXNUNS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnID8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGVudjpFbnZlbG9wZSB4bWxuczplbnY9Imh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZSI+Ci0gIDxlbnY6Qm9keT4KLSAgPC9lbnY6Qm9keT4KLTwvZW52OkVudmVsb3BlPgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXBseU1lc3NhZ2VzL1NPQVAxMlJlc1Q2Ml9DLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVwbHlNZXNzYWdlcy9TT0FQMTJSZXNUNjJfQy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwMWJjMjAuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXBseU1lc3NhZ2VzL1NPQVAxMlJlc1Q2Ml9DLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08ZW52OkVudmVsb3BlIHhtbG5zOmVudj0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIj4KLSAgPGVudjpIZWFkZXI+Ci0gICAgPHRlc3Q6cmVzcG9uc2VPayB4bWxuczp0ZXN0PSJodHRwOi8vZXhhbXBsZS5vcmcvdHMtdGVzdHMiPgotICAgICAgU3RyaW5nQVN0cmluZ0IKLSAgICA8L3Rlc3Q6cmVzcG9uc2VPaz4KLSAgPC9lbnY6SGVhZGVyPgotICA8ZW52OkJvZHk+Ci0gIDwvZW52OkJvZHk+Ci08L2VudjpFbnZlbG9wZT4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVwbHlNZXNzYWdlcy9TT0FQMTJSZXNUNjMueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXBseU1lc3NhZ2VzL1NPQVAxMlJlc1Q2My54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1MjViOTIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXBseU1lc3NhZ2VzL1NPQVAxMlJlc1Q2My54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnID8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGVudjpFbnZlbG9wZSB4bWxuczplbnY9Imh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZSI+Ci0gIDxlbnY6SGVhZGVyPgotICAgIDx0ZXN0OnZhbGlkYXRlQ291bnRyeUNvZGVGYXVsdCB4bWxuczp0ZXN0PSJodHRwOi8vZXhhbXBsZS5vcmcvdHMtdGVzdHMiPgotICAgICAgQ291bnRyeSBjb2RlIG11c3QgYmUgMiBsZXR0ZXJzLgotICAgIDwvdGVzdDp2YWxpZGF0ZUNvdW50cnlDb2RlRmF1bHQ+Ci0gIDwvZW52OkhlYWRlcj4KLSAgPGVudjpCb2R5PgotICAgICA8ZW52OkZhdWx0PgotICAgICAgIDxlbnY6Q29kZT5lbnY6U2VuZGVyPC9lbnY6Q29kZT4KLSAgICAgICA8ZW52OlJlYXNvbj4KLSAgICAgICAgIDxlbnY6VGV4dCB4bWw6bGFuZz0iZW4tVVMiPgotICAgICAgICAgICBOb3QgYSB2YWxpZCBjb3VudHJ5IGNvZGUKLSAgICAgICAgIDwvZW52OlRleHQ+Ci0gICAgICAgPC9lbnY6UmVhc29uPgotICAgICA8L2VudjpGYXVsdD4KLSAgPC9lbnY6Qm9keT4KLTwvZW52OkVudmVsb3BlPgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXBseU1lc3NhZ2VzL1NPQVAxMlJlc1Q2Ni54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcGx5TWVzc2FnZXMvU09BUDEyUmVzVDY2LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTMwNzg2MS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcGx5TWVzc2FnZXMvU09BUDEyUmVzVDY2LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08ZW52OkVudmVsb3BlIHhtbG5zOmVudj0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIj4KLSAgPGVudjpIZWFkZXI+Ci0gICAgPHRlc3Q6cmVzcG9uc2VPayB4bWxuczp0ZXN0PSJodHRwOi8vZXhhbXBsZS5vcmcvdHMtdGVzdHMiPgotICAgICAgZm9vCi0gICAgPC90ZXN0OnJlc3BvbnNlT2s+Ci0gIDwvZW52OkhlYWRlcj4KLSAgPGVudjpCb2R5PgotICA8L2VudjpCb2R5PgotPC9lbnY6RW52ZWxvcGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXBseU1lc3NhZ2VzL1NPQVAxMlJlc1Q2Ny54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcGx5TWVzc2FnZXMvU09BUDEyUmVzVDY3LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTMwNzg2MS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcGx5TWVzc2FnZXMvU09BUDEyUmVzVDY3LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08ZW52OkVudmVsb3BlIHhtbG5zOmVudj0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIj4KLSAgPGVudjpIZWFkZXI+Ci0gICAgPHRlc3Q6cmVzcG9uc2VPayB4bWxuczp0ZXN0PSJodHRwOi8vZXhhbXBsZS5vcmcvdHMtdGVzdHMiPgotICAgICAgZm9vCi0gICAgPC90ZXN0OnJlc3BvbnNlT2s+Ci0gIDwvZW52OkhlYWRlcj4KLSAgPGVudjpCb2R5PgotICA8L2VudjpCb2R5PgotPC9lbnY6RW52ZWxvcGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXBseU1lc3NhZ2VzL1NPQVAxMlJlc1Q2OC54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcGx5TWVzc2FnZXMvU09BUDEyUmVzVDY4LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTEyZThlNy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcGx5TWVzc2FnZXMvU09BUDEyUmVzVDY4LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08ZW52OkVudmVsb3BlIHhtbG5zOmVudj0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIj4KLSAgPGVudjpIZWFkZXI+Ci0gICAgPHRlc3Q6cmVzcG9uc2VPayB4bWxuczp0ZXN0PSJodHRwOi8vZXhhbXBsZS5vcmcvdHMtdGVzdHMiPgotICAgICAgZm9vCi0gICAgPC90ZXN0OnJlc3BvbnNlT2s+Ci0gIDwvZW52OkhlYWRlcj4KLSAgPGVudjpCb2R5PgotICA8L2VudjpCb2R5PgotPC9lbnY6RW52ZWxvcGU+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcGx5TWVzc2FnZXMvU09BUDEyUmVzVDY5LnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVwbHlNZXNzYWdlcy9TT0FQMTJSZXNUNjkueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmYxMTY2Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVwbHlNZXNzYWdlcy9TT0FQMTJSZXNUNjkueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyA/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxlbnY6RW52ZWxvcGUgeG1sbnM6ZW52PSJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUiPgotICA8ZW52OkJvZHk+Ci0gICAgIDxlbnY6RmF1bHQ+Ci0gICAgICAgPGVudjpDb2RlPgotICAgICAgICA8ZW52OlZhbHVlPmVudjpTZW5kZXI8L2VudjpWYWx1ZT4KLSAgICAgICA8L2VudjpDb2RlPgotICAgICAgIDxlbnY6UmVhc29uPgotICAgICAgICA8ZW52OlRleHQgeG1sOmxhbmc9ImVuLVVTIj4KLSAgICAgICAgICBlbnY6Qm9keSBtdXN0IGJlIHByZXNlbnQgaW4gYSBTT0FQIDEuMiBlbnZlbG9wZQotICAgICAgICA8L2VudjpUZXh0PgotICAgICAgIDwvZW52OlJlYXNvbj4KLSAgICAgPC9lbnY6RmF1bHQ+Ci0gIDwvZW52OkJvZHk+Ci08L2VudjpFbnZlbG9wZT4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVwbHlNZXNzYWdlcy9TT0FQMTJSZXNUNzQueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXBseU1lc3NhZ2VzL1NPQVAxMlJlc1Q3NC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxMmU4ZTcuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXBseU1lc3NhZ2VzL1NPQVAxMlJlc1Q3NC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnID8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGVudjpFbnZlbG9wZSB4bWxuczplbnY9Imh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZSI+Ci0gIDxlbnY6SGVhZGVyPgotICAgIDx0ZXN0OnJlc3BvbnNlT2sgeG1sbnM6dGVzdD0iaHR0cDovL2V4YW1wbGUub3JnL3RzLXRlc3RzIj4KLSAgICAgIGZvbwotICAgIDwvdGVzdDpyZXNwb25zZU9rPgotICA8L2VudjpIZWFkZXI+Ci0gIDxlbnY6Qm9keT4KLSAgPC9lbnY6Qm9keT4KLTwvZW52OkVudmVsb3BlPgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXBseU1lc3NhZ2VzL1NPQVAxMlJlc1Q3OC54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcGx5TWVzc2FnZXMvU09BUDEyUmVzVDc4LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZlYjdhMi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcGx5TWVzc2FnZXMvU09BUDEyUmVzVDc4LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08ZW52OkVudmVsb3BlIHhtbG5zOmVudj0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIj4KLSA8ZW52OkhlYWRlcj4KLSAgPHRlc3Q6cmVzcG9uc2VPayB4bWxuczp0ZXN0PSJodHRwOi8vZXhhbXBsZS5vcmcvdHMtdGVzdHMiPgotICAgIGZvbwotICA8L3Rlc3Q6cmVzcG9uc2VPaz4KLSA8L2VudjpIZWFkZXI+Ci0gPGVudjpCb2R5PgotIDwvZW52OkJvZHk+Ci08L2VudjpFbnZlbG9wZT4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVwbHlNZXNzYWdlcy90ZXN0LnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVwbHlNZXNzYWdlcy90ZXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjhhMjBkMS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcGx5TWVzc2FnZXMvdGVzdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzb2FwZW52OkVudmVsb3BlIHhtbG5zOnNvYXBlbnY9Imh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZSI+Ci0gICAgPHNvYXBlbnY6SGVhZGVyPjwvc29hcGVudjpIZWFkZXI+Ci0gICAgPHNvYXBlbnY6Qm9keT4KLSAgICAgICAgPHNvYXBlbnY6RmF1bHQ+Ci0gICAgICAgICAgICA8c29hcGVudjpOb2RlPjwvc29hcGVudjpOb2RlPgotICAgICAgICAgICAgPHNvYXBlbnY6Um9sZT48L3NvYXBlbnY6Um9sZT4KLSAgICAgICAgICAgIDxzb2FwZW52OkRldGFpbD4KLSAgICAgICAgICAgICAgICA8c29hcGVudjpFeGNlcHRpb24+b3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ6IEludGVudGlvbmFsIEZhaWx1cmUgZnJvbSBTT0FQIDEuMiB0ZXN0aW5nIC4uLjsgbmVzdGVkIGV4Y2VwdGlvbiBpczpvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDogSW50ZW50aW9uYWwgRmFpbHVyZSBmcm9tIFNPQVAgMS4yIHRlc3RpbmcgLi4uYXQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0VuZ2luZS5oYW5kbGVGYXVsdChBeGlzRW5naW5lLmphdmE6MTg2KWF0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNFbmdpbmUucmVjZWl2ZShBeGlzRW5naW5lLmphdmE6MTI3KWF0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuSFRUUFRyYW5zcG9ydFV0aWxzLnByb2Nlc3NIVFRQUG9zdFJlcXVlc3QoSFRUUFRyYW5zcG9ydFV0aWxzLmphdmE6MTAyKWF0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuSFRUUFdvcmtlci5kb1dvcmsoSFRUUFdvcmtlci5qYXZhOjExMClhdCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwudGhyZWFkcG9vbC5UaHJlYWRXb3JrZXIucnVuKFRocmVhZFdvcmtlci5qYXZhOjM0KUNhdXNlZCBieTogb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ6IEludGVudGlvbmFsIEZhaWx1cmUgZnJvbSBTT0FQIDEuMiB0ZXN0aW5nIC4uLmF0IG9yZy5hcGFjaGUuYXhpczIuc29hcDEydGVzdGluZy5oYW5kbGVycy5TT0FQMTJJbkZsb3dIYW5kbGVyRGVmYXVsdEMuaW52b2tlKFNPQVAxMkluRmxvd0hhbmRsZXJEZWZhdWx0Qy5qYXZhOjEyMClhdCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5QaGFzZS5pbnZva2UoUGhhc2UuamF2YToxNjEpYXQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0VuZ2luZS5pbnZva2VQaGFzZXMoQXhpc0VuZ2luZS5qYXZhOjI1MilhdCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzRW5naW5lLnJlY2VpdmUoQXhpc0VuZ2luZS5qYXZhOjExOCkuLi4gMyBtb3JlPC9zb2FwZW52OkV4Y2VwdGlvbj4KLSAgICAgICAgICAgIDwvc29hcGVudjpEZXRhaWw+Ci0gICAgICAgICAgICA8c29hcGVudjpDb2RlPgotICAgICAgICAgICAgICAgIDxzb2FwZW52OlZhbHVlPmVudjpNdXN0VW5kZXJzdGFuZDwvc29hcGVudjpWYWx1ZT4KLSAgICAgICAgICAgIDwvc29hcGVudjpDb2RlPgotICAgICAgICAgICAgPHNvYXBlbnY6UmVhc29uPgotICAgICAgICAgICAgICAgIDxzb2FwZW52OlRleHQgeG1sOmxhbmc9ImVuLVVTIj5IZWFkZXIgbm90IHVuZGVyc3Rvb2Q8L3NvYXBlbnY6VGV4dD4KLSAgICAgICAgICAgIDwvc29hcGVudjpSZWFzb24+Ci0gICAgICAgIDwvc29hcGVudjpGYXVsdD4KLSAgICA8L3NvYXBlbnY6Qm9keT4KLTwvc29hcGVudjpFbnZlbG9wZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcXVlc3RNZXNzYWdlcy9TT0FQMTJSZXFUMS54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcXVlc3RNZXNzYWdlcy9TT0FQMTJSZXFUMS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzYWRkZWMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDEueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyA/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxlbnY6RW52ZWxvcGUgeG1sbnM6ZW52PSJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUiPgotICA8ZW52OkhlYWRlcj4KLSAgICA8dGVzdDplY2hvT2sgeG1sbnM6dGVzdD0iaHR0cDovL2V4YW1wbGUub3JnL3RzLXRlc3RzIgotICAgICAgICAgIGVudjpyb2xlPSJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUvcm9sZS9uZXh0Ij4KLSAgICAgIGZvbwotICAgIDwvdGVzdDplY2hvT2s+Ci0gIDwvZW52OkhlYWRlcj4KLSAgPGVudjpCb2R5PgotICA8L2VudjpCb2R5PgotPC9lbnY6RW52ZWxvcGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDEwLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQxMC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlMTYwMDkuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDEwLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08ZW52OkVudmVsb3BlIHhtbG5zOmVudj0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIj4KLSAgPGVudjpIZWFkZXI+Ci0gICAgPHRlc3Q6VW5rbm93biB4bWxuczp0ZXN0PSJodHRwOi8vZXhhbXBsZS5vcmcvdHMtdGVzdHMiIAotICAgICAgICAgIGVudjpyb2xlPSJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUvcm9sZS91bHRpbWF0ZVJlY2VpdmVyIj4KLSAgICAgIGZvbwotICAgIDwvdGVzdDpVbmtub3duPgotICA8L2VudjpIZWFkZXI+Ci0gIDxlbnY6Qm9keT4KLSAgPC9lbnY6Qm9keT4KLTwvZW52OkVudmVsb3BlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQxMS54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcXVlc3RNZXNzYWdlcy9TT0FQMTJSZXFUMTEueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OWMzNWNhLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQxMS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnID8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGVudjpFbnZlbG9wZSB4bWxuczplbnY9Imh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZSI+Ci0gIDxlbnY6SGVhZGVyPgotICAgIDx0ZXN0OlVua25vd24geG1sbnM6dGVzdD0iaHR0cDovL2V4YW1wbGUub3JnL3RzLXRlc3RzIgotICAgICAgICAgIGVudjpyb2xlPSJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUvcm9sZS91bHRpbWF0ZVJlY2VpdmVyIgotICAgICAgICAgIGVudjptdXN0VW5kZXJzdGFuZD0iZmFsc2UiPgotICAgICAgZm9vCi0gICAgPC90ZXN0OlVua25vd24+Ci0gIDwvZW52OkhlYWRlcj4KLSAgPGVudjpCb2R5PgotICA8L2VudjpCb2R5PgotPC9lbnY6RW52ZWxvcGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDEyLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQxMi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4ZTJiNmEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDEyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGVudjpFbnZlbG9wZSB4bWxuczplbnY9Imh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZSI+Ci0gIDxlbnY6SGVhZGVyPgotICAgIDx0ZXN0OlVua25vd24geG1sbnM6dGVzdD0iaHR0cDovL2V4YW1wbGUub3JnL3RzLXRlc3RzIgotICAgICAgICAgIGVudjpyb2xlPSJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUvcm9sZS91bHRpbWF0ZVJlY2VpdmVyIgotICAgICAgICAgIGVudjptdXN0VW5kZXJzdGFuZD0iMSI+Ci0gICAgICBmb28KLSAgICA8L3Rlc3Q6VW5rbm93bj4KLSAgPC9lbnY6SGVhZGVyPgotICA8ZW52OkJvZHk+Ci0gIDwvZW52OkJvZHk+Ci08L2VudjpFbnZlbG9wZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcXVlc3RNZXNzYWdlcy9TT0FQMTJSZXFUMTMueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDEzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWEyN2FiOS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcXVlc3RNZXNzYWdlcy9TT0FQMTJSZXFUMTMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyA/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxlbnY6RW52ZWxvcGUgeG1sbnM6ZW52PSJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUiPgotICA8ZW52OkhlYWRlcj4KLSAgICA8dGVzdDpVbmtub3duIHhtbG5zOnRlc3Q9Imh0dHA6Ly9leGFtcGxlLm9yZy90cy10ZXN0cyIKLSAgICAgICAgICBlbnY6cm9sZT0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlL3JvbGUvdWx0aW1hdGVSZWNlaXZlciIKLSAgICAgICAgICBlbnY6bXVzdFVuZGVyc3RhbmQ9InRydWUiPgotICAgICAgZm9vCi0gICAgPC90ZXN0OlVua25vd24+Ci0gIDwvZW52OkhlYWRlcj4KLSAgPGVudjpCb2R5PgotICA8L2VudjpCb2R5PgotPC9lbnY6RW52ZWxvcGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDE0LnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQxNC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlOWE2YTguLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDE0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08ZW52OkVudmVsb3BlIHhtbG5zOmVudj0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIj4KLSAgPGVudjpIZWFkZXI+Ci0gICAgPHRlc3Q6ZWNob09rIHhtbG5zOnRlc3Q9Imh0dHA6Ly9leGFtcGxlLm9yZy90cy10ZXN0cyIKLSAgICAgICAgICBlbnY6cm9sZT0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlL3JvbGUvdWx0aW1hdGVSZWNlaXZlciIKLSAgICAgICAgICBlbnY6bXVzdFVuZGVyc3RhbmQ9Indyb25nIj4KLSAgICAgIGZvbwotICAgIDwvdGVzdDplY2hvT2s+Ci0gIDwvZW52OkhlYWRlcj4KLSAgPGVudjpCb2R5PgotICA8L2VudjpCb2R5PgotPC9lbnY6RW52ZWxvcGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDE1LnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQxNS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3ZTViNzMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDE1LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08ZW52OkVudmVsb3BlIHhtbG5zOmVudj0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIj4KLSAgPGVudjpIZWFkZXI+Ci0gICAgPHRlc3Q6VW5rbm93biB4bWxuczp0ZXN0PSJodHRwOi8vZXhhbXBsZS5vcmcvdHMtdGVzdHMiCi0gICAgICAgICAgZW52OnJvbGU9Imh0dHA6Ly9leGFtcGxlLm9yZy90cy10ZXN0cy9CIgotICAgICAgICAgIGVudjptdXN0VW5kZXJzdGFuZD0iMSI+Ci0gICAgICBmb28KLSAgICA8L3Rlc3Q6VW5rbm93bj4KLSAgPC9lbnY6SGVhZGVyPgotICA8ZW52OkJvZHk+Ci0gIDwvZW52OkJvZHk+Ci08L2VudjpFbnZlbG9wZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcXVlc3RNZXNzYWdlcy9TT0FQMTJSZXFUMTYueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDE2LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZhZGNiNy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcXVlc3RNZXNzYWdlcy9TT0FQMTJSZXFUMTYueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyA/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxlbnY6RW52ZWxvcGUgeG1sbnM6ZW52PSJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUiPgotICA8ZW52OkhlYWRlcj4KLSAgICA8dGVzdDpVbmtub3duIHhtbG5zOnRlc3Q9Imh0dHA6Ly9leGFtcGxlLm9yZy90cy10ZXN0cyIKLSAgICAgICAgICBlbnY6cm9sZT0iaHR0cDovL2V4YW1wbGUub3JnL3RzLXRlc3RzL0MiCi0gICAgICAgICAgZW52Om11c3RVbmRlcnN0YW5kPSIxIj4KLSAgICAgIGZvbwotICAgIDwvdGVzdDpVbmtub3duPgotICA8L2VudjpIZWFkZXI+Ci0gIDxlbnY6Qm9keT4KLSAgPC9lbnY6Qm9keT4KLTwvZW52OkVudmVsb3BlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQxN19BLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQxN19BLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ5ZWI2Ny4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcXVlc3RNZXNzYWdlcy9TT0FQMTJSZXFUMTdfQS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnID8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGVudjpFbnZlbG9wZSB4bWxuczplbnY9Imh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZSI+Ci0gIDxlbnY6SGVhZGVyPgotICAgIDx0ZXN0OlVua25vd24geG1sbnM6dGVzdD0iaHR0cDovL2V4YW1wbGUub3JnL3RzLXRlc3RzIgotICAgICAgICAgIGVudjpyb2xlPSJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUvcm9sZS9uZXh0IgotICAgICAgICAgIGVudjptdXN0VW5kZXJzdGFuZD0iMSI+Ci0gICAgICBmb28KLSAgICA8L3Rlc3Q6VW5rbm93bj4KLSAgPC9lbnY6SGVhZGVyPgotICA8ZW52OkJvZHk+Ci0gIDwvZW52OkJvZHk+Ci08L2VudjpFbnZlbG9wZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcXVlc3RNZXNzYWdlcy9TT0FQMTJSZXFUMThfQS54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcXVlc3RNZXNzYWdlcy9TT0FQMTJSZXFUMThfQS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyYTI2ZjkuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDE4X0EueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyA/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxlbnY6RW52ZWxvcGUgeG1sbnM6ZW52PSJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUiPgotICA8ZW52OkhlYWRlcj4KLSAgICA8dGVzdDplY2hvT2sgeG1sbnM6dGVzdD0iaHR0cDovL2V4YW1wbGUub3JnL3RzLXRlc3RzIgotICAgICAgICAgIGVudjpyb2xlPSJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUvcm9sZS9ub25lIj4KLSAgICAgIGZvbwotICAgIDwvdGVzdDplY2hvT2s+Ci0gIDwvZW52OkhlYWRlcj4KLSAgPGVudjpCb2R5PgotICA8L2VudjpCb2R5PgotPC9lbnY6RW52ZWxvcGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDE4X0IueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDE4X0IueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmEyNmY5Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQxOF9CLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08ZW52OkVudmVsb3BlIHhtbG5zOmVudj0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIj4KLSAgPGVudjpIZWFkZXI+Ci0gICAgPHRlc3Q6ZWNob09rIHhtbG5zOnRlc3Q9Imh0dHA6Ly9leGFtcGxlLm9yZy90cy10ZXN0cyIKLSAgICAgICAgICBlbnY6cm9sZT0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlL3JvbGUvbm9uZSI+Ci0gICAgICBmb28KLSAgICA8L3Rlc3Q6ZWNob09rPgotICA8L2VudjpIZWFkZXI+Ci0gIDxlbnY6Qm9keT4KLSAgPC9lbnY6Qm9keT4KLTwvZW52OkVudmVsb3BlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQxOS54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcXVlc3RNZXNzYWdlcy9TT0FQMTJSZXFUMTkueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjZkODVhLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQxOS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnID8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGVudjpFbnZlbG9wZSB4bWxuczplbnY9Imh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZSI+Ci0gIDxlbnY6SGVhZGVyPgotICAgIDx0ZXN0OmVjaG9PayB4bWxuczp0ZXN0PSJodHRwOi8vZXhhbXBsZS5vcmcvdHMtdGVzdHMiCi0gICAgICAgICAgZW52OnJvbGU9Imh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZS9yb2xlL25vbmUiCi0gICAgICAgICAgZW52Om11c3RVbmRlcnN0YW5kPSJ0cnVlIj4KLSAgICAgIGZvbwotICAgIDwvdGVzdDplY2hvT2s+Ci0gIDwvZW52OkhlYWRlcj4KLSAgPGVudjpCb2R5PgotICA8L2VudjpCb2R5PgotPC9lbnY6RW52ZWxvcGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDIueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTAwY2E4Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08ZW52OkVudmVsb3BlIHhtbG5zOmVudj0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIj4KLSAgPGVudjpIZWFkZXI+Ci0gICAgPHRlc3Q6ZWNob09rIHhtbG5zOnRlc3Q9Imh0dHA6Ly9leGFtcGxlLm9yZy90cy10ZXN0cyIKLSAgICAgICAgICBlbnY6cm9sZT0iaHR0cDovL2V4YW1wbGUub3JnL3RzLXRlc3RzL0MiPgotICAgICAgZm9vCi0gICAgPC90ZXN0OmVjaG9Paz4KLSAgPC9lbnY6SGVhZGVyPgotICA8ZW52OkJvZHk+Ci0gIDwvZW52OkJvZHk+Ci08L2VudjpFbnZlbG9wZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcXVlc3RNZXNzYWdlcy9TT0FQMTJSZXFUMjAueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDIwLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM0NDg2OC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcXVlc3RNZXNzYWdlcy9TT0FQMTJSZXFUMjAueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyA/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxlbnY6RW52ZWxvcGUgeG1sbnM6ZW52PSJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUiPgotICA8ZW52OkhlYWRlcj4KLSAgICA8dGVzdDpVbmtub3duIHhtbG5zOnRlc3Q9Imh0dHA6Ly9leGFtcGxlLm9yZy90cy10ZXN0cyIgCi0gICAgICAgICAgZW52Om11c3RVbmRlcnN0YW5kPSIxIgotICAgICAgICAgIGVudjpyb2xlPSJodHRwOi8vZXhhbXBsZS5vcmcvdHMtdGVzdHMvQiI+Ci0gICAgICBmb28KLSAgICA8L3Rlc3Q6VW5rbm93bj4KLSAgICA8dGVzdDplY2hvT2sgeG1sbnM6dGVzdD0iaHR0cDovL2V4YW1wbGUub3JnL3RzLXRlc3RzIiAKLSAgICAgICAgICBlbnY6bXVzdFVuZGVyc3RhbmQ9IjEiCi0gICAgICAgICAgZW52OnJvbGU9Imh0dHA6Ly9leGFtcGxlLm9yZy90cy10ZXN0cy9DIj4KLSAgICAgIGZvbwotICAgIDwvdGVzdDplY2hvT2s+Ci0gIDwvZW52OkhlYWRlcj4KLSAgPGVudjpCb2R5PgotICA8L2VudjpCb2R5PgotPC9lbnY6RW52ZWxvcGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDIxX0EueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDIxX0EueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzQ0ODY4Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQyMV9BLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08ZW52OkVudmVsb3BlIHhtbG5zOmVudj0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIj4KLSAgPGVudjpIZWFkZXI+Ci0gICAgPHRlc3Q6VW5rbm93biB4bWxuczp0ZXN0PSJodHRwOi8vZXhhbXBsZS5vcmcvdHMtdGVzdHMiIAotICAgICAgICAgIGVudjptdXN0VW5kZXJzdGFuZD0iMSIKLSAgICAgICAgICBlbnY6cm9sZT0iaHR0cDovL2V4YW1wbGUub3JnL3RzLXRlc3RzL0IiPgotICAgICAgZm9vCi0gICAgPC90ZXN0OlVua25vd24+Ci0gICAgPHRlc3Q6ZWNob09rIHhtbG5zOnRlc3Q9Imh0dHA6Ly9leGFtcGxlLm9yZy90cy10ZXN0cyIgCi0gICAgICAgICAgZW52Om11c3RVbmRlcnN0YW5kPSIxIgotICAgICAgICAgIGVudjpyb2xlPSJodHRwOi8vZXhhbXBsZS5vcmcvdHMtdGVzdHMvQyI+Ci0gICAgICBmb28KLSAgICA8L3Rlc3Q6ZWNob09rPgotICA8L2VudjpIZWFkZXI+Ci0gIDxlbnY6Qm9keT4KLSAgPC9lbnY6Qm9keT4KLTwvZW52OkVudmVsb3BlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQyMi54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcXVlc3RNZXNzYWdlcy9TT0FQMTJSZXFUMjIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDg2MWRjLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQyMi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnID8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGVudjpFbnZlbG9wZSB4bWxuczplbnY9Imh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZSI+Ci0gIDxlbnY6SGVhZGVyPgotICAgIDx0ZXN0OmVjaG9PayB4bWxuczp0ZXN0PSJodHRwOi8vZXhhbXBsZS5vcmcvdHMtdGVzdHMiIAotICAgICAgICAgIGVudjptdXN0VW5kZXJzdGFuZCA9ICIxIj4KLSAgICAgIGZvbwotICAgIDwvdGVzdDplY2hvT2s+Ci0gIDwvZW52OkhlYWRlcj4KLSAgPGVudjpCb2R5PgotICAgIDx0ZXN0OmVjaG9PayB4bWxuczp0ZXN0PSJodHRwOi8vZXhhbXBsZS5vcmcvdHMtdGVzdHMiPgotICAgICAgZm9vCi0gICAgPC90ZXN0OmVjaG9Paz4KLSAgPC9lbnY6Qm9keT4KLTwvZW52OkVudmVsb3BlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQyMy54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcXVlc3RNZXNzYWdlcy9TT0FQMTJSZXFUMjMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTM4YTI2Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQyMy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnID8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGVudjpFbnZlbG9wZSB4bWxuczplbnY9Imh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZSI+Ci0gIDxlbnY6SGVhZGVyPgotICAgIDx0ZXN0OlVua25vd24geG1sbnM6dGVzdD0iaHR0cDovL2V4YW1wbGUub3JnL3RzLXRlc3RzIiAKLSAgICAgICAgICBlbnY6bXVzdFVuZGVyc3RhbmQ9IjEiPgotICAgICAgZm9vCi0gICAgPC90ZXN0OlVua25vd24+Ci0gICAgPHRlc3Q6ZWNob09rIHhtbG5zOnRlc3Q9Imh0dHA6Ly9leGFtcGxlLm9yZy90cy10ZXN0cyIgCi0gICAgICAgICAgZW52Om11c3RVbmRlcnN0YW5kPSJ3cm9uZyI+Ci0gICAgICBmb28KLSAgICA8L3Rlc3Q6ZWNob09rPgotICA8L2VudjpIZWFkZXI+Ci0gIDxlbnY6Qm9keT4KLSAgPC9lbnY6Qm9keT4KLTwvZW52OkVudmVsb3BlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQyNC54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcXVlc3RNZXNzYWdlcy9TT0FQMTJSZXFUMjQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmQ2ZGMxLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQyNC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnID8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGVudjpFbnZlbG9wZSB4bWxuczplbnY9Imh0dHA6Ly93cm9uZy12ZXJzaW9uLyI+Ci0gIDxlbnY6Qm9keT4KLSAgICA8dGVzdDplY2hvT2sgeG1sbnM6dGVzdD0iaHR0cDovL2V4YW1wbGUub3JnL3RzLXRlc3RzIj4KLSAgICAgIGZvbwotICAgIDwvdGVzdDplY2hvT2s+Ci0gIDwvZW52OkJvZHk+Ci08L2VudjpFbnZlbG9wZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcXVlc3RNZXNzYWdlcy9TT0FQMTJSZXFUMjUueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDI1LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJhNjc4Zi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcXVlc3RNZXNzYWdlcy9TT0FQMTJSZXFUMjUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyA/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTwhRE9DVFlQRSBlbnY6RW52ZWxvcGUgU1lTVEVNICJlbnYuZHRkIltdPgotPGVudjpFbnZlbG9wZSB4bWxuczplbnY9Imh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZSI+IAotICA8ZW52OkJvZHk+Ci0gICAgPHRlc3Q6ZWNob09rIHhtbG5zOnRlc3Q9Imh0dHA6Ly9leGFtcGxlLm9yZy90cy10ZXN0cyI+Ci0gICAgICBmb28KLSAgICA8L3Rlc3Q6ZWNob09rPgotIDwvZW52OkJvZHk+Ci08L2VudjpFbnZlbG9wZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcXVlc3RNZXNzYWdlcy9TT0FQMTJSZXFUMjYueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDI2LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFiZDAzZC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcXVlc3RNZXNzYWdlcy9TT0FQMTJSZXFUMjYueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyA/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxlbnY6RW52ZWxvcGUgeG1sbnM6ZW52PSJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUiPgotPD94bWwtc3R5bGVzaGVldCBocmVmPSJodHRwOi8vZXhhbXBsZS5vcmcvdHMtdGVzdHMvc3ViLnhzbCIgdHlwZSA9ICJ0ZXh0L3hzbCI/PgotICA8ZW52OkJvZHk+Ci0gICAgPHRlc3Q6ZWNob09rIHhtbG5zOnRlc3Q9Imh0dHA6Ly9leGFtcGxlLm9yZy90cy10ZXN0cyI+Ci0gICAgICBmb28KLSAgICA8L3Rlc3Q6ZWNob09rPgotICA8L2VudjpCb2R5PgotPC9lbnY6RW52ZWxvcGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDI5LnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQyOS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyY2FhNmIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDI5LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08ZW52OkVudmVsb3BlIHhtbG5zOmVudj0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIj4KLSAgPGVudjpIZWFkZXI+Ci0gICAgPHRlc3Q6ZWNob09rIHhtbG5zOnRlc3Q9Imh0dHA6Ly9leGFtcGxlLm9yZy90cy10ZXN0cyIKLSAgICAgICAgICBlbnY6cm9sZT0iaHR0cDovL2V4YW1wbGUub3JnL3RzLXRlc3RzL0N6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enoiPgotICAgICAgZm9vCi0gICAgPC90ZXN0OmVjaG9Paz4KLSAgPC9lbnY6SGVhZGVyPgotICA8ZW52OkJvZHk+Ci0gIDwvZW52OkJvZHk+Ci08L2VudjpFbnZlbG9wZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcXVlc3RNZXNzYWdlcy9TT0FQMTJSZXFUMy54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcXVlc3RNZXNzYWdlcy9TT0FQMTJSZXFUMy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjMDE1YzAuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyA/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxlbnY6RW52ZWxvcGUgeG1sbnM6ZW52PSJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUiPgotICA8ZW52OkhlYWRlcj4KLSAgICA8dGVzdDplY2hvT2sgeG1sbnM6dGVzdD0iaHR0cDovL2V4YW1wbGUub3JnL3RzLXRlc3RzIj4KLSAgICAgIGZvbwotICAgIDwvdGVzdDplY2hvT2s+Ci0gIDwvZW52OkhlYWRlcj4KLSAgPGVudjpCb2R5PgotICA8L2VudjpCb2R5PgotPC9lbnY6RW52ZWxvcGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDMwLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQzMC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4NGUwMGUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDMwLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08ZW52OkVudmVsb3BlIHhtbG5zOmVudj0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZSI+Ci0gIDxlbnY6Qm9keT4KLSAgICA8dGVzdDplY2hvT2sgeG1sbnM6dGVzdD0iaHR0cDovL2V4YW1wbGUub3JnL3RzLXRlc3RzIj4KLSAgICAgIGZvbwotICAgIDwvdGVzdDplY2hvT2s+Ci0gIDwvZW52OkJvZHk+Ci08L2VudjpFbnZlbG9wZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcXVlc3RNZXNzYWdlcy9TT0FQMTJSZXFUMzEueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDMxLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ4NTNjYi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcXVlc3RNZXNzYWdlcy9TT0FQMTJSZXFUMzEueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyA/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxlbnY6RW52ZWxvcGUgeG1sbnM6ZW52PSJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUiPgotICA8ZW52OkJvZHk+Ci0gICAgPHRlc3Q6cmV0dXJuVm9pZCB4bWxuczp0ZXN0PSJodHRwOi8vZXhhbXBsZS5vcmcvdHMtdGVzdHMiPgotICAgIDwvdGVzdDpyZXR1cm5Wb2lkPgotICA8L2VudjpCb2R5PgotPC9lbnY6RW52ZWxvcGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDMyLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQzMi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3OTcyNGQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDMyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08ZW52OkVudmVsb3BlIHhtbG5zOmVudj0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIj4KLSAgPGVudjpIZWFkZXI+Ci0gICAgPHRlc3Q6cmVxdWlyZWRIZWFkZXIgeG1sbnM6dGVzdD0iaHR0cDovL2V4YW1wbGUub3JnL3RzLXRlc3RzIgotICAgICAgICAgIGVudjptdXN0VW5kZXJzdGFuZD0idHJ1ZSI+Ci0gICAgICBmb28KLSAgICA8L3Rlc3Q6cmVxdWlyZWRIZWFkZXI+Ci0gIDwvZW52OkhlYWRlcj4KLSAgPGVudjpCb2R5PgotICAgIDx0ZXN0OmVjaG9IZWFkZXIgeG1sbnM6dGVzdD0iaHR0cDovL2V4YW1wbGUub3JnL3RzLXRlc3RzIj4KLSAgICA8L3Rlc3Q6ZWNob0hlYWRlcj4KLSAgPC9lbnY6Qm9keT4KLTwvZW52OkVudmVsb3BlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQzMy54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcXVlc3RNZXNzYWdlcy9TT0FQMTJSZXFUMzMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDA5NTY5Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQzMy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnID8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGVudjpFbnZlbG9wZSB4bWxuczplbnY9Imh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZSI+Ci0gIDxlbnY6Qm9keT4KLSAgICA8dGVzdDpEb2VzTm90RXhpc3QgeG1sbnM6dGVzdD0iaHR0cDovL2V4YW1wbGUub3JnL3RzLXRlc3RzIj4KLSAgPC90ZXN0OkRvZXNOb3RFeGlzdD4KLSA8L2VudjpCb2R5PgotPC9lbnY6RW52ZWxvcGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDM0LnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQzNC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzOGIxOTcuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDM0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08ZW52OkVudmVsb3BlIHhtbG5zOmVudj0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIj4KLSAgPGVudjpIZWFkZXI+Ci0gICAgPHRlc3Q6VW5rbm93biB4bWxuczp0ZXN0PSJodHRwOi8vZXhhbXBsZS5vcmcvdHMtdGVzdHMiIAotICAgICAgICAgIHhtbG5zOmVudjE9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIgotICAgICAgICAgIGVudjE6bXVzdFVuZGVyc3RhbmQ9InRydWUiPgotICAgICAgZm9vCi0gICAgPC90ZXN0OlVua25vd24+Ci0gIDwvZW52OkhlYWRlcj4KLSAgPGVudjpCb2R5PgotICA8L2VudjpCb2R5PgotPC9lbnY6RW52ZWxvcGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDM1LnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQzNS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmZTAwZTcuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDM1LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08ZW52OkVudmVsb3BlIHhtbG5zOmVudj0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIj4KLSAgPGVudjpIZWFkZXI+Ci0gICAgPHRlc3Q6VW5rbm93biB4bWxuczp0ZXN0PSJodHRwOi8vZXhhbXBsZS5vcmcvdHMtdGVzdHMiCi0gICAgICAgICAgZW52Om11c3RVbmRlcnN0YW5kPSIxIj4KLSAgICAgIGZvbwotICAgIDwvdGVzdDpVbmtub3duPgotICA8L2VudjpIZWFkZXI+Ci0gIDxlbnY6Qm9keT4KLSAgPC9lbnY6Qm9keT4KLTwvZW52OkVudmVsb3BlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQzNi54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcXVlc3RNZXNzYWdlcy9TT0FQMTJSZXFUMzYueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWQxMDY5Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQzNi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnID8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGVudjpFbnZlbG9wZSB4bWxuczplbnY9Imh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZSI+Ci0gIDxlbnY6SGVhZGVyPgotICAgIDx0ZXN0OlVua25vd24geG1sbnM6dGVzdD0iaHR0cDovL2V4YW1wbGUub3JnL3RzLXRlc3RzIgotICAgICAgICAgIGVudjptdXN0VW5kZXJzdGFuZD0iMSIgCi0gICAgICAgICAgZW52OnJvbGU9Imh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZS9yb2xlL3VsdGltYXRlUmVjZWl2ZXIiPgotICAgICAgZm9vCi0gICAgPC90ZXN0OlVua25vd24+Ci0gIDwvZW52OkhlYWRlcj4KLSAgPGVudjpCb2R5PgotICA8L2VudjpCb2R5PgotPC9lbnY6RW52ZWxvcGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDM3LnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQzNy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0MWJlOGYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDM3LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08ZW52OkVudmVsb3BlIHhtbG5zOmVudj0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIj4KLSAgPGVudjpIZWFkZXI+Ci0gICAgPHRlc3Q6VW5rbm93biB4bWxuczp0ZXN0PSJodHRwOi8vZXhhbXBsZS5vcmcvdHMtdGVzdHMiCi0gICAgICAgICAgZW52OnJvbGU9Imh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZS9yb2xlL3VsdGltYXRlUmVjZWl2ZXIiPgotICAgICAgZm9vCi0gICAgPC90ZXN0OlVua25vd24+Ci0gIDwvZW52OkhlYWRlcj4KLSAgPGVudjpCb2R5PgotICA8L2VudjpCb2R5PgotPC9lbnY6RW52ZWxvcGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDM4XzEueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDM4XzEueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzM2Q5YzQ4Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQzOF8xLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08ZW52OkVudmVsb3BlIHhtbG5zOmVudj0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIj4KLSAgPGVudjpIZWFkZXI+Ci0gICAgPHRlc3Q6VW5rbm93biB4bWxuczp0ZXN0PSJodHRwOi8vZXhhbXBsZS5vcmcvdHMtdGVzdHMiCi0gICAgICAgICAgZW52Om11c3RVbmRlcnN0YW5kPSJmYWxzZSIKLSAgICAgICAgICBlbnY6cm9sZT0iaHR0cDovL2V4YW1wbGUub3JnL3RzLXRlc3RzL0IiPgotICAgICAgZm9vCi0gICAgPC90ZXN0OlVua25vd24+Ci0gICAgPHRlc3Q6ZWNob09rIHhtbG5zOnRlc3Q9Imh0dHA6Ly9leGFtcGxlLm9yZy90cy10ZXN0cyIKLSAgICAgICAgICBlbnY6bXVzdFVuZGVyc3RhbmQ9IjAiCi0gICAgICAgICAgZW52OnJvbGU9Imh0dHA6Ly9leGFtcGxlLm9yZy90cy10ZXN0cy9DIj4KLSAgICAgIGZvbwotICAgIDwvdGVzdDplY2hvT2s+Ci0gIDwvZW52OkhlYWRlcj4KLSAgPGVudjpCb2R5PgotICA8L2VudjpCb2R5PgotPC9lbnY6RW52ZWxvcGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDM4XzIueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDM4XzIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTYzZjgzLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQzOF8yLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08ZW52OkVudmVsb3BlIHhtbG5zOmVudj0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIj4KLSAgPGVudjpIZWFkZXI+Ci0gICAgPHRlc3Q6ZWNob09rIHhtbG5zOnRlc3Q9Imh0dHA6Ly9leGFtcGxlLm9yZy90cy10ZXN0cyIKLSAgICAgICAgICBlbnY6bXVzdFVuZGVyc3RhbmQ9InRydWUiCi0gICAgICAgICAgZW52OnJvbGU9Imh0dHA6Ly9leGFtcGxlLm9yZy90cy10ZXN0cy9CIj4KLSAgICAgIGZvbwotICAgIDwvdGVzdDplY2hvT2s+Ci0gICAgPHRlc3Q6ZWNob09rIHhtbG5zOnRlc3Q9Imh0dHA6Ly9leGFtcGxlLm9yZy90cy10ZXN0cyIKLSAgICAgICAgICBlbnY6bXVzdFVuZGVyc3RhbmQ9IjEiCi0gICAgICAgICAgZW52OnJvbGU9Imh0dHA6Ly9leGFtcGxlLm9yZy90cy10ZXN0cy9DIj4KLSAgICAgIGJhcgotICAgIDwvdGVzdDplY2hvT2s+Ci0gIDwvZW52OkhlYWRlcj4KLSAgPGVudjpCb2R5PgotICA8L2VudjpCb2R5PgotPC9lbnY6RW52ZWxvcGU+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcXVlc3RNZXNzYWdlcy9TT0FQMTJSZXFUMzkueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDM5LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U5YzIxNy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcXVlc3RNZXNzYWdlcy9TT0FQMTJSZXFUMzkueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyA/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxlbnY6RW52ZWxvcGUgeG1sbnM6ZW52PSJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUiPgotICA8ZW52OkhlYWRlcj4KLSAgICA8dGVzdDpVbmtub3duIHhtbG5zOnRlc3Q9Imh0dHA6Ly9leGFtcGxlLm9yZy90cy10ZXN0cyIKLSAgICAgICAgICBlbnY6bXVzdFVuZGVyc3RhbmQ9IjkiPgotICAgICAgZm9vCi0gICAgPC90ZXN0OlVua25vd24+Ci0gIDwvZW52OkhlYWRlcj4KLSAgPGVudjpCb2R5PgotICA8L2VudjpCb2R5PgotPC9lbnY6RW52ZWxvcGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDQueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDdlZDY0Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQ0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08ZW52OkVudmVsb3BlIHhtbG5zOmVudj0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIj4KLSAgPGVudjpIZWFkZXI+Ci0gICAgPHRlc3Q6ZWNob09rIHhtbG5zOnRlc3Q9Imh0dHA6Ly9leGFtcGxlLm9yZy90cy10ZXN0cyIKLSAgICAgICAgICBlbnY6cm9sZT0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlL3JvbGUvdWx0aW1hdGVSZWNlaXZlciI+Ci0gICAgICBmb28KLSAgICA8L3Rlc3Q6ZWNob09rPgotICA8L2VudjpIZWFkZXI+Ci0gIDxlbnY6Qm9keT4KLSAgPC9lbnY6Qm9keT4KLTwvZW52OkVudmVsb3BlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQ0MC54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcXVlc3RNZXNzYWdlcy9TT0FQMTJSZXFUNDAueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDJiMjA2Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQ0MC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnID8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGVudjpFbnZlbG9wZSB4bWxuczplbnY9Imh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZSI+Ci0gIDxlbnY6SGVhZGVyPgotICAgIDx0ZXN0OlVua25vd24geG1sbnM6dGVzdD0iaHR0cDovL1tGRURDOkJBOTg6NzY1NDozMjEwOkZFREM6QkE5ODo3NjU0OjMyMTBdL3RzLXRlc3RzIgotICAgICAgICAgIGVudjpyb2xlPSJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUvcm9sZS91bHRpbWF0ZVJlY2VpdmVyIiAKLSAgICAgICAgICBlbnY6bXVzdFVuZGVyc3RhbmQ9ImZhbHNlIj4KLSAgICAgIGZvbwotICAgIDwvdGVzdDpVbmtub3duPgotICA8L2VudjpIZWFkZXI+Ci0gIDxlbnY6Qm9keT4KLSAgPC9lbnY6Qm9keT4KLTwvZW52OkVudmVsb3BlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQ1LnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQ1LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQ3MmRlZC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcXVlc3RNZXNzYWdlcy9TT0FQMTJSZXFUNS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnID8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGVudjpFbnZlbG9wZSB4bWxuczplbnY9Imh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZSI+Ci0gIDxlbnY6SGVhZGVyPgotICAgIDx0ZXN0OmVjaG9PayB4bWxuczp0ZXN0PSJodHRwOi8vZXhhbXBsZS5vcmcvdHMtdGVzdHMiCi0gICAgICAgICAgZW52OnJvbGU9Imh0dHA6Ly9leGFtcGxlLm9yZy90cy10ZXN0cy9CIj4KLSAgICAgIGZvbwotICAgIDwvdGVzdDplY2hvT2s+Ci0gIDwvZW52OkhlYWRlcj4KLSAgPGVudjpCb2R5PgotICA8L2VudjpCb2R5PgotPC9lbnY6RW52ZWxvcGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDYyX0EueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDYyX0EueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGNiNDA0Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQ2Ml9BLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08ZW52OkVudmVsb3BlIHhtbG5zOmVudj0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIj4KLSAgPGVudjpIZWFkZXI+Ci0gICAgPHRlc3Q6Y29uY2F0QW5kRm9yd2FyZEVjaG9PayB4bWxuczp0ZXN0PSJodHRwOi8vZXhhbXBsZS5vcmcvdHMtdGVzdHMiCi0gICAgICAgICAgZW52OnJvbGU9Imh0dHA6Ly9leGFtcGxlLm9yZy90cy10ZXN0cy9CIgotICAgICAgICAgIGVudjptdXN0VW5kZXJzdGFuZD0iMSIvPgotICAgIDx0ZXN0OmNvbmNhdEFuZEZvcndhcmRFY2hvT2tBcmcxIHhtbG5zOnRlc3Q9Imh0dHA6Ly9leGFtcGxlLm9yZy90cy10ZXN0cyIKLSAgICAgICAgICBlbnY6cm9sZT0iaHR0cDovL2V4YW1wbGUub3JnL3RzLXRlc3RzL0IiCi0gICAgICAgICAgZW52Om11c3RVbmRlcnN0YW5kPSIxIj4KLSAgICAgIFN0cmluZ0EKLSAgICA8L3Rlc3Q6Y29uY2F0QW5kRm9yd2FyZEVjaG9Pa0FyZzE+Ci0gICAgPHRlc3Q6Y29uY2F0QW5kRm9yd2FyZEVjaG9Pa0FyZzIgeG1sbnM6dGVzdD0iaHR0cDovL2V4YW1wbGUub3JnL3RzLXRlc3RzIgotICAgICAgICAgIGVudjpyb2xlPSJodHRwOi8vZXhhbXBsZS5vcmcvdHMtdGVzdHMvQiIKLSAgICAgICAgICBlbnY6bXVzdFVuZGVyc3RhbmQ9IjEiPgotICAgICAgU3RyaW5nQgotICAgIDwvdGVzdDpjb25jYXRBbmRGb3J3YXJkRWNob09rQXJnMj4KLSAgPC9lbnY6SGVhZGVyPgotICA8ZW52OkJvZHk+Ci0gIDwvZW52OkJvZHk+Ci08L2VudjpFbnZlbG9wZT4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQ2Ml9CLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQ2Ml9CLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjA3YTNhYy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcXVlc3RNZXNzYWdlcy9TT0FQMTJSZXFUNjJfQi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnID8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGVudjpFbnZlbG9wZSB4bWxuczplbnY9Imh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZSI+Ci0gIDxlbnY6SGVhZGVyPgotICAgIDx0ZXN0OmVjaG9PayB4bWxuczp0ZXN0PSJodHRwOi8vZXhhbXBsZS5vcmcvdHMtdGVzdHMiCi0gICAgICAgICAgZW52OnJvbGU9Imh0dHA6Ly9leGFtcGxlLm9yZy90cy10ZXN0cy9DIgotICAgICAgICAgIGVudjptdXN0VW5kZXJzdGFuZD0iMSI+Ci0gICAgICBTdHJpbmdBU3RyaW5nQgotICAgIDwvdGVzdDplY2hvT2s+Ci0gIDwvZW52OkhlYWRlcj4KLSAgPGVudjpCb2R5PgotICA8L2VudjpCb2R5PgotPC9lbnY6RW52ZWxvcGU+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcXVlc3RNZXNzYWdlcy9TT0FQMTJSZXFUNjMueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDYzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTUzMzUxZi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcXVlc3RNZXNzYWdlcy9TT0FQMTJSZXFUNjMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyA/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxlbnY6RW52ZWxvcGUgeG1sbnM6ZW52PSJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUiPgotICA8ZW52OkhlYWRlcj4KLSAgICA8dGVzdDp2YWxpZGF0ZUNvdW50cnlDb2RlIHhtbG5zOnRlc3Q9Imh0dHA6Ly9leGFtcGxlLm9yZy90cy10ZXN0cyIKLSAgICAgICAgICBlbnY6cm9sZT0iaHR0cDovL2V4YW1wbGUub3JnL3RzLXRlc3RzL0MiCi0gICAgICAgICAgZW52Om11c3RVbmRlcnN0YW5kPSIxIj4KLSAgICAgIEFCQ0QKLSAgICA8L3Rlc3Q6dmFsaWRhdGVDb3VudHJ5Q29kZT4KLSAgPC9lbnY6SGVhZGVyPgotICA8ZW52OkJvZHk+Ci0gIDwvZW52OkJvZHk+Ci08L2VudjpFbnZlbG9wZT4KLQotCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcXVlc3RNZXNzYWdlcy9TT0FQMTJSZXFUNjYueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDY2LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBlMGMyNS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcXVlc3RNZXNzYWdlcy9TT0FQMTJSZXFUNjYueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGOCc/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxlbnY6RW52ZWxvcGUgeG1sbnM6ZW52PSJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUiPgotICA8ZW52OkhlYWRlcj4KLSAgICA8dGVzdDplY2hvT2sgeG1sbnM6dGVzdD0iaHR0cDovL2V4YW1wbGUub3JnL3RzLXRlc3RzIgotICAgICAgICAgIGVudjpyb2xlPSJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUvcm9sZS9uZXh0Ij4KLSAgICAgIGZvbwotICAgIDwvdGVzdDplY2hvT2s+Ci0gIDwvZW52OkhlYWRlcj4KLSAgPGVudjpCb2R5PgotICA8L2VudjpCb2R5PgotPC9lbnY6RW52ZWxvcGU+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcXVlc3RNZXNzYWdlcy9TT0FQMTJSZXFUNjcueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDY3LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA5ZjM1ZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcXVlc3RNZXNzYWdlcy9TT0FQMTJSZXFUNjcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBzdGFuZGFsb25lPSd5ZXMnPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08ZW52OkVudmVsb3BlIHhtbG5zOmVudj0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIj4KLSA8ZW52OkhlYWRlcj4KLSAgPHRlc3Q6ZWNob09rIHhtbG5zOnRlc3Q9Imh0dHA6Ly9leGFtcGxlLm9yZy90cy10ZXN0cyIKLSAgICAgICAgZW52OnJvbGU9Imh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZS9yb2xlL25leHQiPgotICAgIGZvbwotICA8L3Rlc3Q6ZWNob09rPgotIDwvZW52OkhlYWRlcj4KLSA8ZW52OkJvZHk+Ci0gPC9lbnY6Qm9keT4KLTwvZW52OkVudmVsb3BlPgotCi0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQ2OC54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcXVlc3RNZXNzYWdlcy9TT0FQMTJSZXFUNjgueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGY2ZmZiLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQ2OC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxlbnY6RW52ZWxvcGUgeG1sbnM6ZW52PSJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUiPgotCi0KLSA8ZW52OkhlYWRlciAgICAgICAgICAgPgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0OmVjaG9PayB4bWxuczp0ZXN0PSJodHRwOi8vZXhhbXBsZS5vcmcvdHMtdGVzdHMiCi0gICAgICAgIGVudjpyb2xlPSJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUvcm9sZS9uZXh0IiAgPgotICAgIGZvbwotICA8L3Rlc3Q6ZWNob09rPgotCi0KLSA8L2VudjpIZWFkZXI+Ci0gPGVudjpCb2R5PgotCi0KLSA8L2VudjpCb2R5PgotCi0KLQotPC9lbnY6RW52ZWxvcGU+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcXVlc3RNZXNzYWdlcy9TT0FQMTJSZXFUNjkueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDY5LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI0YWY3MS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcXVlc3RNZXNzYWdlcy9TT0FQMTJSZXFUNjkueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyA/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxlbnY6RW52ZWxvcGUgeG1sbnM6ZW52PSJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUiPgotIDxlbnY6SGVhZGVyPgotCTx0ZXN0OmVjaG9PayB4bWxuczp0ZXN0PSJodHRwOi8vZXhhbXBsZS5vcmcvdHMtdGVzdHMiPmZvbzwvdGVzdDplY2hvT2s+Ci0gPC9lbnY6SGVhZGVyPgotPC9lbnY6RW52ZWxvcGU+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcXVlc3RNZXNzYWdlcy9TT0FQMTJSZXFUNl9BLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQ2X0EueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTAwY2E4Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQ2X0EueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyA/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxlbnY6RW52ZWxvcGUgeG1sbnM6ZW52PSJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUiPgotICA8ZW52OkhlYWRlcj4KLSAgICA8dGVzdDplY2hvT2sgeG1sbnM6dGVzdD0iaHR0cDovL2V4YW1wbGUub3JnL3RzLXRlc3RzIgotICAgICAgICAgIGVudjpyb2xlPSJodHRwOi8vZXhhbXBsZS5vcmcvdHMtdGVzdHMvQyI+Ci0gICAgICBmb28KLSAgICA8L3Rlc3Q6ZWNob09rPgotICA8L2VudjpIZWFkZXI+Ci0gIDxlbnY6Qm9keT4KLSAgPC9lbnY6Qm9keT4KLTwvZW52OkVudmVsb3BlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQ2X0IueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDZfQi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlMDBjYTguLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDZfQi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnID8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGVudjpFbnZlbG9wZSB4bWxuczplbnY9Imh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZSI+Ci0gIDxlbnY6SGVhZGVyPgotICAgIDx0ZXN0OmVjaG9PayB4bWxuczp0ZXN0PSJodHRwOi8vZXhhbXBsZS5vcmcvdHMtdGVzdHMiCi0gICAgICAgICAgZW52OnJvbGU9Imh0dHA6Ly9leGFtcGxlLm9yZy90cy10ZXN0cy9DIj4KLSAgICAgIGZvbwotICAgIDwvdGVzdDplY2hvT2s+Ci0gIDwvZW52OkhlYWRlcj4KLSAgPGVudjpCb2R5PgotICA8L2VudjpCb2R5PgotPC9lbnY6RW52ZWxvcGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDc0LnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQ3NC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2NTYzNWUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDc0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08ZW52OkVudmVsb3BlIHhtbG5zOmVudj0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIj4KLSAgPGVudjpIZWFkZXI+Ci0gICAgPHRlc3Q6ZWNob09rIHhtbG5zOnRlc3Q9Imh0dHA6Ly9leGFtcGxlLm9yZy90cy10ZXN0cyIKLSAgICAgICAgICBlbnY6cm9sZT0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlL3JvbGUvbmV4dCI+Ci0gICAgICBmb28KLSAgICA8L3Rlc3Q6ZWNob09rPgotICAgIDx0ZXN0OlVua25vd24geG1sbnM6dGVzdD0iaHR0cDovL2V4YW1wbGUub3JnL3RzLXRlc3RzIj4KLSAgICAgIDx0ZXN0OnJhaXNlRmF1bHQgZW52Om11c3RVbmRlcnN0YW5kPSIxIgotICAgICAgICAgICAgZW52OnJvbGU9Imh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZS9yb2xlL25leHQiPgotICAgICAgPC90ZXN0OnJhaXNlRmF1bHQ+Ci0gICAgPC90ZXN0OlVua25vd24+Ci0gIDwvZW52OkhlYWRlcj4KLSAgPGVudjpCb2R5PgotICA8L2VudjpCb2R5PgotPC9lbnY6RW52ZWxvcGU+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcXVlc3RNZXNzYWdlcy9TT0FQMTJSZXFUNzUueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDc1LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQzMjM4Zi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcXVlc3RNZXNzYWdlcy9TT0FQMTJSZXFUNzUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyA/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxlbnY6RW52ZWxvcGUgeG1sbnM6ZW52PSJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUiPgotIDxlbnY6SGVhZGVyPgotICA8dGVzdDplY2hvUmVzb2x2ZWRSZWYgeG1sbnM6dGVzdD0iaHR0cDovL2V4YW1wbGUub3JnL3RzLXRlc3RzIgotICAgICAgICBlbnY6cm9sZT0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlL3JvbGUvbmV4dCIKLSAgICAgICAgZW52Om11c3RVbmRlcnN0YW5kPSIxIj4KLSAgICA8dGVzdDpSZWxhdGl2ZVJlZmVyZW5jZSB4bWw6YmFzZT0iaHR0cDovL2V4YW1wbGUub3JnL3RvZGF5LyIKLSAgICAgICAgICB4bGluazpocmVmPSJuZXcueG1sIgotICAgICAgICAgIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiAvPgotICA8L3Rlc3Q6ZWNob1Jlc29sdmVkUmVmPgotIDwvZW52OkhlYWRlcj4KLSA8ZW52OkJvZHk+Ci0gPC9lbnY6Qm9keT4KLTwvZW52OkVudmVsb3BlPgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDc4LnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQ3OC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmY2M2ZWYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDc4LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08ZW52OkVudmVsb3BlIHhtbG5zOmVudj0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIj4KLSA8ZW52OkhlYWRlcj4KLSAgPHRlc3Q6ZWNob09rIHhtbG5zOnRlc3Q9Imh0dHA6Ly9leGFtcGxlLm9yZy90cy10ZXN0cyIKLSAgICAgICAgZW52OnJvbGU9Imh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZS9yb2xlL3VsdGltYXRlUmVjZWl2ZXIiPgotICAgIGZvbwotICA8L3Rlc3Q6ZWNob09rPgotIDwvZW52OkhlYWRlcj4KLSA8ZW52OkJvZHk+Ci0gPC9lbnY6Qm9keT4KLTwvZW52OkVudmVsb3BlPgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDdfQS54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcXVlc3RNZXNzYWdlcy9TT0FQMTJSZXFUN19BLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2FiZjZlYi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcXVlc3RNZXNzYWdlcy9TT0FQMTJSZXFUN19BLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08ZW52OkVudmVsb3BlIHhtbG5zOmVudj0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIj4KLSAgPGVudjpIZWFkZXI+Ci0gICAgPHRlc3Q6SWdub3JlIHhtbG5zOnRlc3Q9Imh0dHA6Ly9leGFtcGxlLm9yZy90cy10ZXN0cyIKLSAgICAgICAgICBlbnY6cm9sZT0iaHR0cDovL2V4YW1wbGUub3JnL3RzLXRlc3RzL0IiPgotICAgICAgZm9vCi0gICAgPC90ZXN0OmVjaG9Paz4KLSAgPC9lbnY6SGVhZGVyPgotICA8ZW52OkJvZHk+Ci0gIDwvZW52OkJvZHk+Ci08L2VudjpFbnZlbG9wZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcXVlc3RNZXNzYWdlcy9TT0FQMTJSZXFUN19CLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQ3X0IueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmJkYzgxLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQ3X0IueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyA/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxlbnY6RW52ZWxvcGUgeG1sbnM6ZW52PSJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUiPgotICA8ZW52OkJvZHk+Ci0gIDwvZW52OkJvZHk+Ci08L2VudjpFbnZlbG9wZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcXVlc3RNZXNzYWdlcy9TT0FQMTJSZXFUOF9BLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQ4X0EueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDg0ODkzLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQ4X0EueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyA/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxlbnY6RW52ZWxvcGUgeG1sbnM6ZW52PSJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUiPgotICA8ZW52OkhlYWRlcj4KLSAgICA8dGVzdDplY2hvT2sgeG1sbnM6dGVzdD0iaHR0cDovL2V4YW1wbGUub3JnL3RzLXRlc3RzIj4KLSAgICAgIGZvbwotICAgIDwvdGVzdDplY2hvT2s+Ci0gICAgPHRlc3Q6SWdub3JlIHhtbG5zOnRlc3Q9Imh0dHA6Ly9leGFtcGxlLm9yZy90cy10ZXN0cyIgCi0gICAgICAgICAgZW52OnJvbGU9Imh0dHA6Ly9leGFtcGxlLm9yZy90cy10ZXN0cy9CIj4KLSAgICAgIGZvbwotICAgIDwvdGVzdDplY2hvT2s+Ci0gICAgPHRlc3Q6ZWNob09rIHhtbG5zOnRlc3Q9Imh0dHA6Ly9leGFtcGxlLm9yZy90cy10ZXN0cyIKLSAgICAgICAgICBlbnY6cm9sZT0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlL3JvbGUvbm9uZSI+Ci0gICAgICBmb28KLSAgICA8L3Rlc3Q6ZWNob09rPgotICA8L2VudjpIZWFkZXI+Ci0gIDxlbnY6Qm9keT4KLSAgPC9lbnY6Qm9keT4KLTwvZW52OkVudmVsb3BlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQ4X0IueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDhfQi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4NjI4NjIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDhfQi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnID8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGVudjpFbnZlbG9wZSB4bWxuczplbnY9Imh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZSI+Ci0gIDxlbnY6SGVhZGVyPgotICAgIDx0ZXN0OmVjaG9PayB4bWxuczp0ZXN0PSJodHRwOi8vZXhhbXBsZS5vcmcvdHMtdGVzdHMiPgotICAgICAgZm9vCi0gICAgPC90ZXN0OmVjaG9Paz4gIAotICAgIDx0ZXN0OmVjaG9PayB4bWxuczp0ZXN0PSJodHRwOi8vZXhhbXBsZS5vcmcvdHMtdGVzdHMiCi0gICAgICAgICAgZW52OnJvbGU9Imh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZS9yb2xlL25vbmUiPgotICAgICAgZm9vCi0gICAgPC90ZXN0OmVjaG9Paz4KLSAgPC9lbnY6SGVhZGVyPgotICA8ZW52OkJvZHk+IAotICA8L2VudjpCb2R5PgotPC9lbnY6RW52ZWxvcGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDlfQS54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcXVlc3RNZXNzYWdlcy9TT0FQMTJSZXFUOV9BLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA3ZWQ2NC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcXVlc3RNZXNzYWdlcy9TT0FQMTJSZXFUOV9BLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08ZW52OkVudmVsb3BlIHhtbG5zOmVudj0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIj4KLSAgPGVudjpIZWFkZXI+Ci0gICAgPHRlc3Q6ZWNob09rIHhtbG5zOnRlc3Q9Imh0dHA6Ly9leGFtcGxlLm9yZy90cy10ZXN0cyIKLSAgICAgICAgICBlbnY6cm9sZT0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlL3JvbGUvdWx0aW1hdGVSZWNlaXZlciI+Ci0gICAgICBmb28KLSAgICA8L3Rlc3Q6ZWNob09rPgotICA8L2VudjpIZWFkZXI+Ci0gIDxlbnY6Qm9keT4KLSAgPC9lbnY6Qm9keT4KLTwvZW52OkVudmVsb3BlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQ5X0IueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDlfQi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwN2VkNjQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDlfQi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnID8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGVudjpFbnZlbG9wZSB4bWxuczplbnY9Imh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZSI+Ci0gIDxlbnY6SGVhZGVyPgotICAgIDx0ZXN0OmVjaG9PayB4bWxuczp0ZXN0PSJodHRwOi8vZXhhbXBsZS5vcmcvdHMtdGVzdHMiCi0gICAgICAgICAgZW52OnJvbGU9Imh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZS9yb2xlL3VsdGltYXRlUmVjZWl2ZXIiPgotICAgICAgZm9vCi0gICAgPC90ZXN0OmVjaG9Paz4KLSAgPC9lbnY6SGVhZGVyPgotICA8ZW52OkJvZHk+Ci0gIDwvZW52OkJvZHk+Ci08L2VudjpFbnZlbG9wZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1NPQVAxMlRlc3RNb2R1bGVCL01FVEEtSU5GL21vZHVsZS54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1NPQVAxMlRlc3RNb2R1bGVCL01FVEEtSU5GL21vZHVsZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4MjFjZDkuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9TT0FQMTJUZXN0TW9kdWxlQi9NRVRBLUlORi9tb2R1bGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08bW9kdWxlIG5hbWU9IlNPQVAxMlRlc3RNb2R1bGVCIj4KLSAgICA8SW5GbG93PgotCTxoYW5kbGVyIG5hbWU9IlNPQVAxMkluRmxvd0hhbmRsZXJEZWZhdWx0QiIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuc29hcDEydGVzdGluZy5oYW5kbGVycy5TT0FQMTJJbkZsb3dIYW5kbGVyRGVmYXVsdEIiPgotCSAgICA8b3JkZXIgcGhhc2U9InVzZXJwaGFzZTEiIC8+Ci0JPC9oYW5kbGVyPgotICAgIDwvSW5GbG93PgotCi0gICAgPE91dEZsb3c+Ci0gICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVAxMk91dEZsb3dIYW5kbGVyRGVmYXVsdCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuc29hcDEydGVzdGluZy5oYW5kbGVycy5TT0FQMTJPdXRGbG93SGFuZGxlckRlZmF1bHQiPgotICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJ1c2VycGhhc2UxIiAvPgotICAgICAgICA8L2hhbmRsZXI+Ci0gICAgPC9PdXRGbG93PgotCi08L21vZHVsZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1NPQVAxMlRlc3RNb2R1bGVCL2J1aWxkLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvU09BUDEyVGVzdE1vZHVsZUIvYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODRiZWM4Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvU09BUDEyVGVzdE1vZHVsZUIvYnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHByb2plY3QgYmFzZWRpcj0iLiIgZGVmYXVsdD0iamFyIj4KLSAgICA8cHJvcGVydHkgbmFtZT0ic3JjIiBsb2NhdGlvbj0iLiIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZCIgbG9jYXRpb249ImJ1aWxkIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmNsYXNzZXMiIGxvY2F0aW9uPSIke2J1aWxkfS9jbGFzc2VzIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmxpYiIgbG9jYXRpb249IiR7YnVpbGR9L2xpYiIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJsaWIiIGxvY2F0aW9uPSJsaWIiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0icm9vdCIgbG9jYXRpb249Ii4uLy4uLy4uLyIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJqYXIuZGlyIiBsb2NhdGlvbj0iJHtyb290fS90YXJnZXQvUmVwb3NpdG9yeS9tb2R1bGVzLyIvPgotCi0gICAgPHBhdGggaWQ9ImF4aXMudGVzdC5jbGFzc3BhdGgiPgotICAgICAgICA8cGF0aGVsZW1lbnQgcGF0aD0iJHtqYXZhLmNsYXNzLnBhdGh9Ii8+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke21hdmVuLmNsYXNzLnBhdGh9Ii8+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iLi4vLi4vLi4vdGFyZ2V0L2NsYXNzZXMiLz4KLSAgICA8L3BhdGg+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUiIGRlcGVuZHM9ImluaXQiIHVubGVzcz0iamFycy51cHRvZGF0ZSI+Ci0gICAgICAgIDxta2RpciBkaXI9IiR7YnVpbGQuY2xhc3Nlc30iLz4KLSAgICAgICAgPG1rZGlyIGRpcj0iJHtidWlsZC5saWJ9Ii8+Ci0gICAgICAgIDxqYXZhYyBmb3JrPSJ0cnVlIiBkZXN0ZGlyPSIke2J1aWxkLmNsYXNzZXN9IiBkZWJ1Zz0ib24iPgotICAgICAgICAgICAgPGNsYXNzcGF0aCByZWZpZD0iYXhpcy50ZXN0LmNsYXNzcGF0aCIvPgotICAgICAgICAgICAgPHNyYyBwYXRoPSIke3NyY30iLz4KLSAgICAgICAgPC9qYXZhYz4KLSAgICA8L3RhcmdldD4KLQotICAgIDx0YXJnZXQgbmFtZT0iamFyIiBkZXBlbmRzPSJjb21waWxlIiB1bmxlc3M9ImphcnMudXB0b2RhdGUiPgotICAgICAgICA8Y29weSB0b2Rpcj0iJHtidWlsZC5jbGFzc2VzfS9NRVRBLUlORiI+Ci0gICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7YmFzZWRpcn0vTUVUQS1JTkYvIj4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLnhtbCIvPgotICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9ImJ1aWxkLnhtbCIvPgotICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICA8L2NvcHk+Ci0KLSAgICAgICAgPG1rZGlyIGRpcj0iJHtqYXIuZGlyfSIvPgotICAgICAgICA8amFyIGphcmZpbGU9IiR7amFyLmRpcn0vU09BUDEyVGVzdE1vZHVsZUIuamFyIiBiYXNlZGlyPSIke2J1aWxkLmNsYXNzZXN9Ij4KLSAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqIi8+Ci0gICAgICAgIDwvamFyPgotICAgICAgICA8ZGVsZXRlIGRpcj0iJHtidWlsZH0iLz4KLSAgICA8L3RhcmdldD4KLQotICAgIDx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0gICAgICAgIDx1cHRvZGF0ZSBwcm9wZXJ0eT0iamFycy51cHRvZGF0ZSIgdGFyZ2V0ZmlsZT0iJHtqYXIuZGlyfS9TT0FQMTJUZXN0TW9kdWxlQi5qYXIiPgotICAgICAgICAgICAgPHNyY2ZpbGVzIGRpcj0iJHtzcmN9Ij4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLmphdmEiLz4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLnhtbCIvPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoud3NkbCIvPgotICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9IiR7YnVpbGR9LyoqIi8+Ci0gICAgICAgICAgICA8L3NyY2ZpbGVzPgotICAgICAgICA8L3VwdG9kYXRlPgotICAgICAgICA8ZWNobyBtZXNzYWdlPSJ0aGUgZmlsZXMgYXJlIHVwIHRvIGRhdGUgPSAke2phcnMudXB0b2RhdGV9Ij48L2VjaG8+Ci0gICAgPC90YXJnZXQ+Ci0KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvU09BUDEyVGVzdE1vZHVsZUIvb3JnL2FwYWNoZS9heGlzMi9zb2FwMTJ0ZXN0aW5nL2hhbmRsZXJzL0hlYWRlckNvbnN0YW50cy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9TT0FQMTJUZXN0TW9kdWxlQi9vcmcvYXBhY2hlL2F4aXMyL3NvYXAxMnRlc3RpbmcvaGFuZGxlcnMvSGVhZGVyQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4M2RiMDUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9TT0FQMTJUZXN0TW9kdWxlQi9vcmcvYXBhY2hlL2F4aXMyL3NvYXAxMnRlc3RpbmcvaGFuZGxlcnMvSGVhZGVyQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc29hcDEydGVzdGluZy5oYW5kbGVyczsKLQotcHVibGljIGludGVyZmFjZSBIZWFkZXJDb25zdGFudHMgewotCi0gICAgU3RyaW5nIFJFUVVFU1RfSEVBREVSQkxPQ0tfTkFNRSA9ICJlY2hvT2siOwotICAgIFN0cmluZyBSRVNQT05TRV9IRUFERVJCTE9DS19OQU1FID0gInJlc3BvbnNlT2siOwotICAgIFN0cmluZyBTQU1QTEVfUk9MRSA9ICJodHRwOi8vZXhhbXBsZS5vcmcvdHMtdGVzdHMiOwotICAgIFN0cmluZyBTT0FQMTJfUk9MRSA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUvcm9sZSI7Ci0gICAgU3RyaW5nIFVMVElNQVRFUkVDRUlWRVJfUk9MRSA9ICJ1bHRpbWF0ZVJlY2VpdmVyIjsKLSAgICBTdHJpbmcgTkVYVF9ST0xFID0gIm5leHQiOwotICAgIFN0cmluZyBOT05FX1JPTEUgPSAibm9uZSI7Ci0gICAgU3RyaW5nIFJPTEVfQllfQiA9ICJCIjsKLSAgICBTdHJpbmcgUk9MRV9CWV9DID0gIkMiOwotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9TT0FQMTJUZXN0TW9kdWxlQi9vcmcvYXBhY2hlL2F4aXMyL3NvYXAxMnRlc3RpbmcvaGFuZGxlcnMvU09BUDEySW5GbG93SGFuZGxlckRlZmF1bHRCLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1NPQVAxMlRlc3RNb2R1bGVCL29yZy9hcGFjaGUvYXhpczIvc29hcDEydGVzdGluZy9oYW5kbGVycy9TT0FQMTJJbkZsb3dIYW5kbGVyRGVmYXVsdEIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM1MGIyOS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1NPQVAxMlRlc3RNb2R1bGVCL29yZy9hcGFjaGUvYXhpczIvc29hcDEydGVzdGluZy9oYW5kbGVycy9TT0FQMTJJbkZsb3dIYW5kbGVyRGVmYXVsdEIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc29hcDEydGVzdGluZy5oYW5kbGVyczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmhhbmRsZXJzLkFic3RyYWN0SGFuZGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUDEyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQQm9keTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmF1bHRDb2RlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmF1bHROb2RlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmF1bHRSZWFzb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYXVsdFJvbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYXVsdFRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYXVsdFZhbHVlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQSGVhZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQSGVhZGVyQmxvY2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBQcm9jZXNzaW5nRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgU09BUDEySW5GbG93SGFuZGxlckRlZmF1bHRCIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyIGltcGxlbWVudHMgSGVhZGVyQ29uc3RhbnRzIHsKLSAgICBwcml2YXRlIE9NTmFtZXNwYWNlIGF0dHJpYnV0ZU5TOwotICAgIHByaXZhdGUgYm9vbGVhbiBhdHRyaWJ1dGVQcmVzZW50ID0gZmFsc2U7Ci0gICAgSW50ZWdlciBoZWFkZXJCbG9ja1ByZXNlbnQgPSBuZXcgSW50ZWdlcigwKTsKLQotICAgIFNPQVBIZWFkZXJCbG9jayBoZWFkZXJCbG9jazsKLQotCi0gICAgcHVibGljIHZvaWQgcmV2b2tlKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHsKLQotICAgIH0KLQotICAgIHB1YmxpYyBJbnZvY2F0aW9uUmVzcG9uc2UgaW52b2tlKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBTT0FQRW52ZWxvcGUgZW52ZWxvcGUgPSBtc2dDb250ZXh0LmdldEVudmVsb3BlKCk7Ci0gICAgICAgIFNPQVBGYWN0b3J5IGZhY3RvcnkgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTJGYWN0b3J5KCk7Ci0gICAgICAgIFNPQVBIZWFkZXIgaGVhZGVyQWRkID0gZmFjdG9yeS5jcmVhdGVTT0FQSGVhZGVyKGVudmVsb3BlKTsKLSAgICAgICAgaWYgKGVudmVsb3BlLmdldEhlYWRlcigpICE9IG51bGwpIHsKLSAgICAgICAgICAgIEl0ZXJhdG9yIGhlYWRlckJsb2NrcyA9IGVudmVsb3BlLmdldEhlYWRlcigpLmV4YW1pbmVBbGxIZWFkZXJCbG9ja3MoKTsKLSAgICAgICAgICAgIHdoaWxlIChoZWFkZXJCbG9ja3MuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgaGVhZGVyQmxvY2sgPSAoU09BUEhlYWRlckJsb2NrKSBoZWFkZXJCbG9ja3MubmV4dCgpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBJdGVyYXRvciBhdHRyaWJ1dGVzID0gaGVhZGVyQmxvY2suZ2V0QWxsQXR0cmlidXRlcygpOwotCi0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZXMuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIE9NQXR0cmlidXRlIGZpcnN0QXR0cmlidXRlID0gKE9NQXR0cmlidXRlKSBhdHRyaWJ1dGVzLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlTlMgPSBmaXJzdEF0dHJpYnV0ZS5nZXROYW1lc3BhY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlUHJlc2VudCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgU3RyaW5nIHJvbGVWYWx1ZSA9IGhlYWRlckJsb2NrLmdldFJvbGUoKTsKLSAgICAgICAgICAgICAgICBib29sZWFuIG11c3RVbmRlcnN0YW5kID0gaGVhZGVyQmxvY2suZ2V0TXVzdFVuZGVyc3RhbmQoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZWxlbWVudE5hbWUgPSBoZWFkZXJCbG9jay5nZXRMb2NhbE5hbWUoKTsKLSAgICAgICAgICAgICAgICBPTU5hbWVzcGFjZSBoZWFkZXJCbG9ja05hbWVzcGFjZSA9IGhlYWRlckJsb2NrLmdldE5hbWVzcGFjZSgpOwotCi0gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnROYW1lLmVxdWFscyhSRVFVRVNUX0hFQURFUkJMT0NLX05BTUUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyb2xlVmFsdWUgPT0gbnVsbCB8fCByb2xlVmFsdWUuZXF1YWxzKFNBTVBMRV9ST0xFICsgIi8iICsgUk9MRV9CWV9CKSB8fCByb2xlVmFsdWUuZXF1YWxzKFNPQVAxMl9ST0xFICsgIi8iICsgVUxUSU1BVEVSRUNFSVZFUl9ST0xFKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvbGVWYWx1ZS5lcXVhbHMoU09BUDEyX1JPTEUgKyAiLyIgKyBORVhUX1JPTEUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJCbG9jay5zZXRMb2NhbE5hbWUoUkVTUE9OU0VfSEVBREVSQkxPQ0tfTkFNRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlc2VudCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJCbG9jay5yZW1vdmVBdHRyaWJ1dGUoKE9NQXR0cmlidXRlKSBoZWFkZXJCbG9jay5nZXRBbGxBdHRyaWJ1dGVzKCkubmV4dCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlckJsb2NrUHJlc2VudCA9IG5ldyBJbnRlZ2VyKDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgbXNnQ29udGV4dC5nZXRPcGVyYXRpb25Db250ZXh0KCkuc2V0UHJvcGVydHkoIkhFQURFUl9CTE9DS19QUkVTRU5UIiwgaGVhZGVyQmxvY2tQcmVzZW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlckFkZC5hZGRDaGlsZChoZWFkZXJCbG9jayk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtc2dDb250ZXh0LmdldE9wZXJhdGlvbkNvbnRleHQoKS5zZXRQcm9wZXJ0eSgiSEVBREVSX0JMT0NLIiwgaGVhZGVyQWRkKTsKLQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJvbGVWYWx1ZSA9PSBudWxsIHx8IHJvbGVWYWx1ZS5lcXVhbHMoU0FNUExFX1JPTEUgKyAiLyIgKyBST0xFX0JZX0IpIHx8IHJvbGVWYWx1ZS5lcXVhbHMoU0FNUExFX1JPTEUgKyAiLyIgKyBST0xFX0JZX0MpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZVZhbHVlLmVxdWFscyhTT0FQMTJfUk9MRSArICIvIiArIFVMVElNQVRFUkVDRUlWRVJfUk9MRSkgfHwgcm9sZVZhbHVlLmVxdWFscyhTT0FQMTJfUk9MRSArICIvIiArIE5FWFRfUk9MRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtdXN0VW5kZXJzdGFuZCkgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU09BUEJvZHkgYm9keSA9IGZhY3RvcnkuZ2V0RGVmYXVsdEVudmVsb3BlKCkuZ2V0Qm9keSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVzZW50ICYmIGF0dHJpYnV0ZU5TLmdldE5hbWUoKSA9PSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT0FQRmF1bHQgZmF1bHQgPSBmYWN0b3J5LmNyZWF0ZVNPQVBGYXVsdChib2R5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPQVBGYXVsdENvZGUgY29kZSA9IGZhY3RvcnkuY3JlYXRlU09BUEZhdWx0Q29kZShmYXVsdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT0FQRmF1bHRWYWx1ZSB2YWx1ZSA9IGZhY3RvcnkuY3JlYXRlU09BUEZhdWx0VmFsdWUoY29kZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS5zZXRUZXh0KCJlbnY6TXVzdFVuZGVyc3RhbmQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPQVBGYXVsdFJlYXNvbiByZWFzb24gPSBmYWN0b3J5LmNyZWF0ZVNPQVBGYXVsdFJlYXNvbihmYXVsdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT0FQRmF1bHRUZXh0IHRleHQgPSBmYWN0b3J5LmNyZWF0ZVNPQVBGYXVsdFRleHQocmVhc29uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQuc2V0TGFuZygiZW4tVVMiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQuc2V0VGV4dCgiSGVhZGVyIG5vdCB1bmRlcnN0b29kIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFzb24uYWRkU09BUFRleHQodGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2ZhdWx0LnNldFJlYXNvbihyZWFzb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJvbGVWYWx1ZSAhPSBudWxsICYmIHJvbGVWYWx1ZS5lcXVhbHMoU0FNUExFX1JPTEUgKyAiLyIgKyBST0xFX0JZX0IpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09BUEZhdWx0Tm9kZSBub2RlID0gZmFjdG9yeS5jcmVhdGVTT0FQRmF1bHROb2RlKGZhdWx0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLnNldE5vZGVWYWx1ZShTQU1QTEVfUk9MRSArICIvIiArIFJPTEVfQllfQik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09BUEZhdWx0Um9sZSByb2xlID0gZmFjdG9yeS5jcmVhdGVTT0FQRmF1bHRSb2xlKGZhdWx0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2xlLnNldFJvbGVWYWx1ZShTQU1QTEVfUk9MRSArICIvIiArIFJPTEVfQllfQik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnQ29udGV4dC5zZXRQcm9wZXJ0eShTT0FQMTJDb25zdGFudHMuU09BUF9GQVVMVF9OT0RFX0xPQ0FMX05BTUUsIG5vZGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZ0NvbnRleHQuc2V0UHJvcGVydHkoU09BUDEyQ29uc3RhbnRzLlNPQVBfRkFVTFRfUk9MRV9MT0NBTF9OQU1FLCByb2xlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnQ29udGV4dC5zZXRQcm9wZXJ0eShTT0FQMTJDb25zdGFudHMuU09BUF9GQVVMVF9DT0RFX0xPQ0FMX05BTUUsIGNvZGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnQ29udGV4dC5zZXRQcm9wZXJ0eShTT0FQMTJDb25zdGFudHMuU09BUF9GQVVMVF9SRUFTT05fTE9DQUxfTkFNRSwgcmVhc29uKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChTT0FQUHJvY2Vzc2luZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IEF4aXNGYXVsdC5tYWtlRmF1bHQoZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJCbG9jay5kaXNjYXJkKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPQVBIZWFkZXJCbG9jayBuZXdIZWFkZXJCbG9jayA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdIZWFkZXJCbG9jayA9IGVudmVsb3BlLmdldEhlYWRlcigpLmFkZEhlYWRlckJsb2NrKCJOb3RVbmRlcnN0b29kIiwgZW52ZWxvcGUuZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3SGVhZGVyQmxvY2suZGVjbGFyZU5hbWVzcGFjZShoZWFkZXJCbG9ja05hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdIZWFkZXJCbG9jay5hZGRBdHRyaWJ1dGUoInFuYW1lIiwgaGVhZGVyQmxvY2tOYW1lc3BhY2UuZ2V0TmFtZSgpICsgIjoiICsgZWxlbWVudE5hbWUsIG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChTT0FQUHJvY2Vzc2luZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2UucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyQmxvY2tQcmVzZW50ID0gbmV3IEludGVnZXIoMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZ0NvbnRleHQuZ2V0T3BlcmF0aW9uQ29udGV4dCgpLnNldFByb3BlcnR5KCJIRUFERVJfQkxPQ0tfUFJFU0VOVCIsIGhlYWRlckJsb2NrUHJlc2VudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlckFkZC5hZGRDaGlsZChuZXdIZWFkZXJCbG9jayk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZ0NvbnRleHQuZ2V0T3BlcmF0aW9uQ29udGV4dCgpLnNldFByb3BlcnR5KCJIRUFERVJfQkxPQ0siLCBoZWFkZXJBZGQpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoIkludGVudGlvbmFsIEZhaWx1cmUgZnJvbSBTT0FQIDEuMiB0ZXN0aW5nIC4uLiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyQmxvY2tQcmVzZW50ID0gbmV3IEludGVnZXIoMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChoZWFkZXJCbG9ja1ByZXNlbnQuZXF1YWxzKG5ldyBJbnRlZ2VyKDApKSkgewotICAgICAgICAgICAgICAgIG1zZ0NvbnRleHQuZ2V0T3BlcmF0aW9uQ29udGV4dCgpLnNldFByb3BlcnR5KCJIRUFERVJfQkxPQ0tfUFJFU0VOVCIsIGhlYWRlckJsb2NrUHJlc2VudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBoZWFkZXJCbG9ja1ByZXNlbnQgPSBuZXcgSW50ZWdlcigwKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGhlYWRlckJsb2NrUHJlc2VudCA9IG5ldyBJbnRlZ2VyKDApOwotICAgICAgICAgICAgbXNnQ29udGV4dC5nZXRPcGVyYXRpb25Db250ZXh0KCkuc2V0UHJvcGVydHkoIkhFQURFUl9CTE9DS19QUkVTRU5UIiwgaGVhZGVyQmxvY2tQcmVzZW50KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gSW52b2NhdGlvblJlc3BvbnNlLkNPTlRJTlVFOwotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9TT0FQMTJUZXN0TW9kdWxlQi9vcmcvYXBhY2hlL2F4aXMyL3NvYXAxMnRlc3RpbmcvaGFuZGxlcnMvU09BUDEyT3V0RmF1bHRGbG93SGFuZGxlckRlZmF1bHQuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvU09BUDEyVGVzdE1vZHVsZUIvb3JnL2FwYWNoZS9heGlzMi9zb2FwMTJ0ZXN0aW5nL2hhbmRsZXJzL1NPQVAxMk91dEZhdWx0Rmxvd0hhbmRsZXJEZWZhdWx0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlM2Y2NmIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9TT0FQMTJUZXN0TW9kdWxlQi9vcmcvYXBhY2hlL2F4aXMyL3NvYXAxMnRlc3RpbmcvaGFuZGxlcnMvU09BUDEyT3V0RmF1bHRGbG93SGFuZGxlckRlZmF1bHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zb2FwMTJ0ZXN0aW5nLmhhbmRsZXJzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaGFuZGxlcnMuQWJzdHJhY3RIYW5kbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQSGVhZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQSGVhZGVyQmxvY2s7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBTT0FQMTJPdXRGYXVsdEZsb3dIYW5kbGVyRGVmYXVsdCBleHRlbmRzIEFic3RyYWN0SGFuZGxlciB7Ci0KLQotICAgIHB1YmxpYyB2b2lkIHJldm9rZShNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgSW52b2NhdGlvblJlc3BvbnNlIGludm9rZShNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB7Ci0gICAgICAgIEludGVnZXIgaGVhZGVyQmxvY2tQcmVzZW50ID0gKEludGVnZXIpIG1zZ0NvbnRleHQuZ2V0T3BlcmF0aW9uQ29udGV4dCgpLmdldFByb3BlcnR5KCJIRUFERVJfQkxPQ0tfUFJFU0VOVCIpOwotICAgICAgICBpZiAoaGVhZGVyQmxvY2tQcmVzZW50LmVxdWFscyhuZXcgSW50ZWdlcigxKSkpIHsKLSAgICAgICAgICAgIFNPQVBIZWFkZXIgaGVhZGVyQWRkID0gKFNPQVBIZWFkZXIpIG1zZ0NvbnRleHQuZ2V0T3BlcmF0aW9uQ29udGV4dCgpLmdldFByb3BlcnR5KCJIRUFERVJfQkxPQ0siKTsKLSAgICAgICAgICAgSXRlcmF0b3IgaGVhZGVyQmxvY2tzID0gaGVhZGVyQWRkLmV4YW1pbmVBbGxIZWFkZXJCbG9ja3MoKTsKLSAgICAgICAgICAgIHdoaWxlKGhlYWRlckJsb2Nrcy5oYXNOZXh0KCkpewotICAgICAgICAgICAgICAgIFNPQVBIZWFkZXJCbG9jayBoZWFkZXJCbG9jaz0oU09BUEhlYWRlckJsb2NrKSBoZWFkZXJCbG9ja3MubmV4dCgpOwotICAgICAgICAgICAgICAgIG1zZ0NvbnRleHQuZ2V0RW52ZWxvcGUoKS5nZXRIZWFkZXIoKS5hZGRDaGlsZChoZWFkZXJCbG9jayk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtc2dDb250ZXh0LmdldEVudmVsb3BlKCkuZ2V0SGVhZGVyKCkuZGlzY2FyZCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBJbnZvY2F0aW9uUmVzcG9uc2UuQ09OVElOVUU7Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1NPQVAxMlRlc3RNb2R1bGVCL29yZy9hcGFjaGUvYXhpczIvc29hcDEydGVzdGluZy9oYW5kbGVycy9TT0FQMTJPdXRGbG93SGFuZGxlckRlZmF1bHQuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvU09BUDEyVGVzdE1vZHVsZUIvb3JnL2FwYWNoZS9heGlzMi9zb2FwMTJ0ZXN0aW5nL2hhbmRsZXJzL1NPQVAxMk91dEZsb3dIYW5kbGVyRGVmYXVsdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTVlN2EyLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvU09BUDEyVGVzdE1vZHVsZUIvb3JnL2FwYWNoZS9heGlzMi9zb2FwMTJ0ZXN0aW5nL2hhbmRsZXJzL1NPQVAxMk91dEZsb3dIYW5kbGVyRGVmYXVsdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNvYXAxMnRlc3RpbmcuaGFuZGxlcnM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5oYW5kbGVycy5BYnN0cmFjdEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBIZWFkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBIZWFkZXJCbG9jazsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIFNPQVAxMk91dEZsb3dIYW5kbGVyRGVmYXVsdCBleHRlbmRzIEFic3RyYWN0SGFuZGxlciB7Ci0KLQotICAgIHB1YmxpYyB2b2lkIHJldm9rZShNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgSW52b2NhdGlvblJlc3BvbnNlIGludm9rZShNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB7Ci0gICAgICAgIEludGVnZXIgaGVhZGVyQmxvY2tQcmVzZW50ID0gKEludGVnZXIpIG1zZ0NvbnRleHQuZ2V0T3BlcmF0aW9uQ29udGV4dCgpLmdldFByb3BlcnR5KCJIRUFERVJfQkxPQ0tfUFJFU0VOVCIpOwotICAgICAgICBpZiAoaGVhZGVyQmxvY2tQcmVzZW50LmVxdWFscyhuZXcgSW50ZWdlcigxKSkpIHsKLSAgICAgICAgICAgIFNPQVBIZWFkZXIgaGVhZGVyQWRkID0gKFNPQVBIZWFkZXIpIG1zZ0NvbnRleHQuZ2V0T3BlcmF0aW9uQ29udGV4dCgpLmdldFByb3BlcnR5KCJIRUFERVJfQkxPQ0siKTsKLSAgICAgICAgICAgSXRlcmF0b3IgaGVhZGVyQmxvY2tzID0gaGVhZGVyQWRkLmV4YW1pbmVBbGxIZWFkZXJCbG9ja3MoKTsKLSAgICAgICAgICAgIHdoaWxlKGhlYWRlckJsb2Nrcy5oYXNOZXh0KCkpewotICAgICAgICAgICAgICAgIFNPQVBIZWFkZXJCbG9jayBoZWFkZXJCbG9jaz0oU09BUEhlYWRlckJsb2NrKSBoZWFkZXJCbG9ja3MubmV4dCgpOwotICAgICAgICAgICAgICAgIG1zZ0NvbnRleHQuZ2V0RW52ZWxvcGUoKS5nZXRIZWFkZXIoKS5hZGRDaGlsZChoZWFkZXJCbG9jayk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtc2dDb250ZXh0LmdldEVudmVsb3BlKCkuZ2V0SGVhZGVyKCkuZGlzY2FyZCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBJbnZvY2F0aW9uUmVzcG9uc2UuQ09OVElOVUU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9TT0FQMTJUZXN0TW9kdWxlQy9NRVRBLUlORi9tb2R1bGUueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9TT0FQMTJUZXN0TW9kdWxlQy9NRVRBLUlORi9tb2R1bGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODc2MGM3Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvU09BUDEyVGVzdE1vZHVsZUMvTUVUQS1JTkYvbW9kdWxlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPG1vZHVsZSBuYW1lPSJTT0FQMTJUZXN0TW9kdWxlQyI+Ci0gICAgPEluRmxvdz4KLQk8aGFuZGxlciBuYW1lPSJTT0FQMTJJbkZsb3dIYW5kbGVyRGVmYXVsdEMiIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnNvYXAxMnRlc3RpbmcuaGFuZGxlcnMuU09BUDEySW5GbG93SGFuZGxlckRlZmF1bHRDIj4KLQkgICAgPG9yZGVyIHBoYXNlPSJ1c2VycGhhc2UxIiAvPgotCTwvaGFuZGxlcj4KLSAgICA8L0luRmxvdz4KLQotICAgIDxPdXRGbG93PgotICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQMTJPdXRGbG93SGFuZGxlckRlZmF1bHQiIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnNvYXAxMnRlc3RpbmcuaGFuZGxlcnMuU09BUDEyT3V0Rmxvd0hhbmRsZXJEZWZhdWx0Ij4KLSAgICAgICAgICAgIDxvcmRlciBwaGFzZT0idXNlcnBoYXNlMSIgLz4KLSAgICAgICAgPC9oYW5kbGVyPgotICAgIDwvT3V0Rmxvdz4KLQotPC9tb2R1bGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9TT0FQMTJUZXN0TW9kdWxlQy9idWlsZC54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1NPQVAxMlRlc3RNb2R1bGVDL2J1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM1YWUyOC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1NPQVAxMlRlc3RNb2R1bGVDL2J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxwcm9qZWN0IGJhc2VkaXI9Ii4iIGRlZmF1bHQ9ImphciI+Ci0gICAgPHByb3BlcnR5IG5hbWU9InNyYyIgbG9jYXRpb249Ii4iLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iYnVpbGQiIGxvY2F0aW9uPSJidWlsZCIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC5jbGFzc2VzIiBsb2NhdGlvbj0iJHtidWlsZH0vY2xhc3NlcyIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC5saWIiIGxvY2F0aW9uPSIke2J1aWxkfS9saWIiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0ibGliIiBsb2NhdGlvbj0ibGliIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9InJvb3QiIGxvY2F0aW9uPSIuLi8uLi8uLi8iLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iamFyLmRpciIgbG9jYXRpb249IiR7cm9vdH0vdGFyZ2V0L1JlcG9zaXRvcnkvbW9kdWxlcy8iLz4KLQotICAgIDxwYXRoIGlkPSJheGlzLnRlc3QuY2xhc3NwYXRoIj4KLSAgICAgICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7amF2YS5jbGFzcy5wYXRofSIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgcGF0aD0iJHttYXZlbi5jbGFzcy5wYXRofSIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249Ii4uLy4uLy4uL3RhcmdldC9jbGFzc2VzIi8+Ci0gICAgPC9wYXRoPgotCi0gICAgPHRhcmdldCBuYW1lPSJjb21waWxlIiBkZXBlbmRzPSJpbml0IiB1bmxlc3M9ImphcnMudXB0b2RhdGUiPgotICAgICAgICA8bWtkaXIgZGlyPSIke2J1aWxkLmNsYXNzZXN9Ii8+Ci0gICAgICAgIDxta2RpciBkaXI9IiR7YnVpbGQubGlifSIvPgotICAgICAgICA8amF2YWMgZm9yaz0idHJ1ZSIgZGVzdGRpcj0iJHtidWlsZC5jbGFzc2VzfSIgZGVidWc9Im9uIj4KLSAgICAgICAgICAgIDxjbGFzc3BhdGggcmVmaWQ9ImF4aXMudGVzdC5jbGFzc3BhdGgiLz4KLSAgICAgICAgICAgIDxzcmMgcGF0aD0iJHtzcmN9Ii8+Ci0gICAgICAgIDwvamF2YWM+Ci0gICAgPC90YXJnZXQ+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9ImphciIgZGVwZW5kcz0iY29tcGlsZSIgdW5sZXNzPSJqYXJzLnVwdG9kYXRlIj4KLSAgICAgICAgPGNvcHkgdG9kaXI9IiR7YnVpbGQuY2xhc3Nlc30vTUVUQS1JTkYiPgotICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke2Jhc2VkaXJ9L01FVEEtSU5GLyI+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi54bWwiLz4KLSAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJidWlsZC54bWwiLz4KLSAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgPC9jb3B5PgotCi0gICAgICAgIDxta2RpciBkaXI9IiR7amFyLmRpcn0iLz4KLSAgICAgICAgPGphciBqYXJmaWxlPSIke2phci5kaXJ9L1NPQVAxMlRlc3RNb2R1bGVDLmphciIgYmFzZWRpcj0iJHtidWlsZC5jbGFzc2VzfSI+Ci0gICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKiIvPgotICAgICAgICA8L2phcj4KLSAgICAgICAgPGRlbGV0ZSBkaXI9IiR7YnVpbGR9Ii8+Ci0gICAgPC90YXJnZXQ+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9ImluaXQiPgotICAgICAgICA8dXB0b2RhdGUgcHJvcGVydHk9ImphcnMudXB0b2RhdGUiIHRhcmdldGZpbGU9IiR7amFyLmRpcn0vU09BUDEyVGVzdE1vZHVsZUMuamFyIj4KLSAgICAgICAgICAgIDxzcmNmaWxlcyBkaXI9IiR7c3JjfSI+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5qYXZhIi8+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi54bWwiLz4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLndzZGwiLz4KLSAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSIke2J1aWxkfS8qKiIvPgotICAgICAgICAgICAgPC9zcmNmaWxlcz4KLSAgICAgICAgPC91cHRvZGF0ZT4KLSAgICAgICAgPGVjaG8gbWVzc2FnZT0idGhlIGZpbGVzIGFyZSB1cCB0byBkYXRlID0gJHtqYXJzLnVwdG9kYXRlfSI+PC9lY2hvPgotICAgIDwvdGFyZ2V0PgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1NPQVAxMlRlc3RNb2R1bGVDL29yZy9hcGFjaGUvYXhpczIvc29hcDEydGVzdGluZy9oYW5kbGVycy9IZWFkZXJDb25zdGFudHMuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvU09BUDEyVGVzdE1vZHVsZUMvb3JnL2FwYWNoZS9heGlzMi9zb2FwMTJ0ZXN0aW5nL2hhbmRsZXJzL0hlYWRlckNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODNkYjA1Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvU09BUDEyVGVzdE1vZHVsZUMvb3JnL2FwYWNoZS9heGlzMi9zb2FwMTJ0ZXN0aW5nL2hhbmRsZXJzL0hlYWRlckNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNvYXAxMnRlc3RpbmcuaGFuZGxlcnM7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSGVhZGVyQ29uc3RhbnRzIHsKLQotICAgIFN0cmluZyBSRVFVRVNUX0hFQURFUkJMT0NLX05BTUUgPSAiZWNob09rIjsKLSAgICBTdHJpbmcgUkVTUE9OU0VfSEVBREVSQkxPQ0tfTkFNRSA9ICJyZXNwb25zZU9rIjsKLSAgICBTdHJpbmcgU0FNUExFX1JPTEUgPSAiaHR0cDovL2V4YW1wbGUub3JnL3RzLXRlc3RzIjsKLSAgICBTdHJpbmcgU09BUDEyX1JPTEUgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlL3JvbGUiOwotICAgIFN0cmluZyBVTFRJTUFURVJFQ0VJVkVSX1JPTEUgPSAidWx0aW1hdGVSZWNlaXZlciI7Ci0gICAgU3RyaW5nIE5FWFRfUk9MRSA9ICJuZXh0IjsKLSAgICBTdHJpbmcgTk9ORV9ST0xFID0gIm5vbmUiOwotICAgIFN0cmluZyBST0xFX0JZX0IgPSAiQiI7Ci0gICAgU3RyaW5nIFJPTEVfQllfQyA9ICJDIjsKLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvU09BUDEyVGVzdE1vZHVsZUMvb3JnL2FwYWNoZS9heGlzMi9zb2FwMTJ0ZXN0aW5nL2hhbmRsZXJzL1NPQVAxMkluRmxvd0hhbmRsZXJEZWZhdWx0Qy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9TT0FQMTJUZXN0TW9kdWxlQy9vcmcvYXBhY2hlL2F4aXMyL3NvYXAxMnRlc3RpbmcvaGFuZGxlcnMvU09BUDEySW5GbG93SGFuZGxlckRlZmF1bHRDLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5ZTZhMDcuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9TT0FQMTJUZXN0TW9kdWxlQy9vcmcvYXBhY2hlL2F4aXMyL3NvYXAxMnRlc3RpbmcvaGFuZGxlcnMvU09BUDEySW5GbG93SGFuZGxlckRlZmF1bHRDLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNvYXAxMnRlc3RpbmcuaGFuZGxlcnM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5oYW5kbGVycy5BYnN0cmFjdEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQXR0cmlidXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01OYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVAxMkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEJvZHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhdWx0Q29kZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhdWx0Tm9kZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhdWx0UmVhc29uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmF1bHRSb2xlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmF1bHRUZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmF1bHRWYWx1ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEhlYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEhlYWRlckJsb2NrOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQUHJvY2Vzc2luZ0V4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIFNPQVAxMkluRmxvd0hhbmRsZXJEZWZhdWx0QyBleHRlbmRzIEFic3RyYWN0SGFuZGxlciBpbXBsZW1lbnRzIEhlYWRlckNvbnN0YW50cyB7Ci0gICAgcHJpdmF0ZSBPTU5hbWVzcGFjZSBhdHRyaWJ1dGVOUzsKLSAgICBwcml2YXRlIGJvb2xlYW4gYXR0cmlidXRlUHJlc2VudCA9IGZhbHNlOwotICAgIEludGVnZXIgaGVhZGVyQmxvY2tQcmVzZW50ID0gbmV3IEludGVnZXIoMCk7Ci0gICAgU09BUEhlYWRlckJsb2NrIGhlYWRlckJsb2NrOwotCi0KLSAgICBwdWJsaWMgdm9pZCByZXZva2UoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgewotCi0gICAgfQotCi0gICAgcHVibGljIEludm9jYXRpb25SZXNwb25zZSBpbnZva2UoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIFNPQVBFbnZlbG9wZSBlbnZlbG9wZSA9IG1zZ0NvbnRleHQuZ2V0RW52ZWxvcGUoKTsKLSAgICAgICAgaWYgKGVudmVsb3BlLmdldEhlYWRlcigpICE9IG51bGwpIHsKLSAgICAgICAgICAgIEl0ZXJhdG9yIGhlYWRlckJsb2NrcyA9IGVudmVsb3BlLmdldEhlYWRlcigpLmV4YW1pbmVBbGxIZWFkZXJCbG9ja3MoKTsKLSAgICAgICAgICAgIFNPQVBGYWN0b3J5IGZhY3RvcnkgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTJGYWN0b3J5KCk7Ci0gICAgICAgICAgICBTT0FQSGVhZGVyIGhlYWRlckFkZCA9IGZhY3RvcnkuY3JlYXRlU09BUEhlYWRlcihlbnZlbG9wZSk7Ci0KLSAgICAgICAgICAgIHdoaWxlIChoZWFkZXJCbG9ja3MuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgaGVhZGVyQmxvY2sgPSAoU09BUEhlYWRlckJsb2NrKSBoZWFkZXJCbG9ja3MubmV4dCgpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBJdGVyYXRvciBhdHRyaWJ1dGVzID0gaGVhZGVyQmxvY2suZ2V0QWxsQXR0cmlidXRlcygpOwotCi0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZXMuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIE9NQXR0cmlidXRlIGZpcnN0QXR0cmlidXRlID0gKE9NQXR0cmlidXRlKSBhdHRyaWJ1dGVzLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlTlMgPSBmaXJzdEF0dHJpYnV0ZS5nZXROYW1lc3BhY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlUHJlc2VudCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgU3RyaW5nIHJvbGVWYWx1ZSA9IGhlYWRlckJsb2NrLmdldFJvbGUoKTsKLSAgICAgICAgICAgICAgICBib29sZWFuIG11c3RVbmRlcnN0YW5kID0gaGVhZGVyQmxvY2suZ2V0TXVzdFVuZGVyc3RhbmQoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZWxlbWVudE5hbWUgPSBoZWFkZXJCbG9jay5nZXRMb2NhbE5hbWUoKTsKLSAgICAgICAgICAgICAgICBPTU5hbWVzcGFjZSBoZWFkZXJCbG9ja05hbWVzcGFjZSA9IGhlYWRlckJsb2NrLmdldE5hbWVzcGFjZSgpOwotCi0gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnROYW1lLmVxdWFscyhSRVFVRVNUX0hFQURFUkJMT0NLX05BTUUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyb2xlVmFsdWUgPT0gbnVsbCB8fCByb2xlVmFsdWUuZXF1YWxzKFNBTVBMRV9ST0xFICsgIi8iICsgUk9MRV9CWV9DKSB8fCByb2xlVmFsdWUuZXF1YWxzKFNPQVAxMl9ST0xFICsgIi8iICsgVUxUSU1BVEVSRUNFSVZFUl9ST0xFKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvbGVWYWx1ZS5lcXVhbHMoU09BUDEyX1JPTEUgKyAiLyIgKyBORVhUX1JPTEUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJCbG9jay5zZXRMb2NhbE5hbWUoUkVTUE9OU0VfSEVBREVSQkxPQ0tfTkFNRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlc2VudCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlckJsb2NrLnJlbW92ZUF0dHJpYnV0ZSgoT01BdHRyaWJ1dGUpIGhlYWRlckJsb2NrLmdldEFsbEF0dHJpYnV0ZXMoKS5uZXh0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVByZXNlbnQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlckJsb2NrUHJlc2VudCA9IG5ldyBJbnRlZ2VyKDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgbXNnQ29udGV4dC5nZXRPcGVyYXRpb25Db250ZXh0KCkuc2V0UHJvcGVydHkoIkhFQURFUl9CTE9DS19QUkVTRU5UIiwgaGVhZGVyQmxvY2tQcmVzZW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlckFkZC5hZGRDaGlsZChoZWFkZXJCbG9jayk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtc2dDb250ZXh0LmdldE9wZXJhdGlvbkNvbnRleHQoKS5zZXRQcm9wZXJ0eSgiSEVBREVSX0JMT0NLIiwgaGVhZGVyQWRkKTsKLQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJvbGVWYWx1ZSA9PSBudWxsIHx8IHJvbGVWYWx1ZS5lcXVhbHMoU0FNUExFX1JPTEUgKyAiLyIgKyBST0xFX0JZX0MpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZVZhbHVlLmVxdWFscyhTT0FQMTJfUk9MRSArICIvIiArIFVMVElNQVRFUkVDRUlWRVJfUk9MRSkgfHwgcm9sZVZhbHVlLmVxdWFscyhTT0FQMTJfUk9MRSArICIvIiArIE5FWFRfUk9MRSkpIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG11c3RVbmRlcnN0YW5kKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT0FQQm9keSBib2R5ID0gZmFjdG9yeS5nZXREZWZhdWx0RW52ZWxvcGUoKS5nZXRCb2R5KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZXNlbnQgJiYgYXR0cmlidXRlTlMuZ2V0TmFtZSgpID09ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyIpIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPQVBGYXVsdCBmYXVsdCA9IGZhY3RvcnkuY3JlYXRlU09BUEZhdWx0KGJvZHkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09BUEZhdWx0Q29kZSBjb2RlID0gZmFjdG9yeS5jcmVhdGVTT0FQRmF1bHRDb2RlKGZhdWx0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPQVBGYXVsdFZhbHVlIHZhbHVlID0gZmFjdG9yeS5jcmVhdGVTT0FQRmF1bHRWYWx1ZShjb2RlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLnNldFRleHQoImVudjpNdXN0VW5kZXJzdGFuZCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09BUEZhdWx0UmVhc29uIHJlYXNvbiA9IGZhY3RvcnkuY3JlYXRlU09BUEZhdWx0UmVhc29uKGZhdWx0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPQVBGYXVsdFRleHQgdGV4dCA9IGZhY3RvcnkuY3JlYXRlU09BUEZhdWx0VGV4dChyZWFzb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dC5zZXRMYW5nKCJlbi1VUyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dC5zZXRUZXh0KCJIZWFkZXIgbm90IHVuZGVyc3Rvb2QiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbi5hZGRTT0FQVGV4dCh0ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZmF1bHQuc2V0UmVhc29uKHJlYXNvbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocm9sZVZhbHVlICE9IG51bGwgJiYgcm9sZVZhbHVlLmVxdWFscyhTQU1QTEVfUk9MRSArICIvIiArIFJPTEVfQllfQikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT0FQRmF1bHROb2RlIG5vZGUgPSBmYWN0b3J5LmNyZWF0ZVNPQVBGYXVsdE5vZGUoZmF1bHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuc2V0Tm9kZVZhbHVlKFNBTVBMRV9ST0xFICsgIi8iICsgUk9MRV9CWV9CKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT0FQRmF1bHRSb2xlIHJvbGUgPSBmYWN0b3J5LmNyZWF0ZVNPQVBGYXVsdFJvbGUoZmF1bHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvbGUuc2V0Um9sZVZhbHVlKFNBTVBMRV9ST0xFICsgIi8iICsgUk9MRV9CWV9CKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2dDb250ZXh0LnNldFByb3BlcnR5KFNPQVAxMkNvbnN0YW50cy5TT0FQX0ZBVUxUX05PREVfTE9DQUxfTkFNRSwgbm9kZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnQ29udGV4dC5zZXRQcm9wZXJ0eShTT0FQMTJDb25zdGFudHMuU09BUF9GQVVMVF9ST0xFX0xPQ0FMX05BTUUsIHJvbGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2dDb250ZXh0LnNldFByb3BlcnR5KFNPQVAxMkNvbnN0YW50cy5TT0FQX0ZBVUxUX0NPREVfTE9DQUxfTkFNRSwgY29kZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2dDb250ZXh0LnNldFByb3BlcnR5KFNPQVAxMkNvbnN0YW50cy5TT0FQX0ZBVUxUX1JFQVNPTl9MT0NBTF9OQU1FLCByZWFzb24pOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNPQVBQcm9jZXNzaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyQmxvY2suZGlzY2FyZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT0FQSGVhZGVyQmxvY2sgbmV3SGVhZGVyQmxvY2sgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3SGVhZGVyQmxvY2sgPSBlbnZlbG9wZS5nZXRIZWFkZXIoKS5hZGRIZWFkZXJCbG9jaygiTm90VW5kZXJzdG9vZCIsIGVudmVsb3BlLmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0hlYWRlckJsb2NrLmRlY2xhcmVOYW1lc3BhY2UoaGVhZGVyQmxvY2tOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3SGVhZGVyQmxvY2suYWRkQXR0cmlidXRlKCJxbmFtZSIsIGhlYWRlckJsb2NrTmFtZXNwYWNlLmdldE5hbWUoKSArICI6IiArIGVsZW1lbnROYW1lLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoU09BUFByb2Nlc3NpbmdFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9lLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlckJsb2NrUHJlc2VudCA9IG5ldyBJbnRlZ2VyKDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2dDb250ZXh0LmdldE9wZXJhdGlvbkNvbnRleHQoKS5zZXRQcm9wZXJ0eSgiSEVBREVSX0JMT0NLX1BSRVNFTlQiLCBoZWFkZXJCbG9ja1ByZXNlbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJBZGQuYWRkQ2hpbGQobmV3SGVhZGVyQmxvY2spOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2dDb250ZXh0LmdldE9wZXJhdGlvbkNvbnRleHQoKS5zZXRQcm9wZXJ0eSgiSEVBREVSX0JMT0NLIiwgaGVhZGVyQWRkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiSW50ZW50aW9uYWwgRmFpbHVyZSBmcm9tIFNPQVAgMS4yIHRlc3RpbmcgLi4uIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoaGVhZGVyQmxvY2tQcmVzZW50LmVxdWFscyhuZXcgSW50ZWdlcigwKSkpIHsKLSAgICAgICAgICAgICAgICBtc2dDb250ZXh0LmdldE9wZXJhdGlvbkNvbnRleHQoKS5zZXRQcm9wZXJ0eSgiSEVBREVSX0JMT0NLX1BSRVNFTlQiLCBoZWFkZXJCbG9ja1ByZXNlbnQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBoZWFkZXJCbG9ja1ByZXNlbnQgPSBuZXcgSW50ZWdlcigwKTsKLQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaGVhZGVyQmxvY2tQcmVzZW50ID0gbmV3IEludGVnZXIoMCk7Ci0gICAgICAgICAgICBtc2dDb250ZXh0LmdldE9wZXJhdGlvbkNvbnRleHQoKS5zZXRQcm9wZXJ0eSgiSEVBREVSX0JMT0NLX1BSRVNFTlQiLCBoZWFkZXJCbG9ja1ByZXNlbnQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBJbnZvY2F0aW9uUmVzcG9uc2UuQ09OVElOVUU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9TT0FQMTJUZXN0TW9kdWxlQy9vcmcvYXBhY2hlL2F4aXMyL3NvYXAxMnRlc3RpbmcvaGFuZGxlcnMvU09BUDEyT3V0RmF1bHRGbG93SGFuZGxlckRlZmF1bHQuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvU09BUDEyVGVzdE1vZHVsZUMvb3JnL2FwYWNoZS9heGlzMi9zb2FwMTJ0ZXN0aW5nL2hhbmRsZXJzL1NPQVAxMk91dEZhdWx0Rmxvd0hhbmRsZXJEZWZhdWx0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyODMwMmUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9TT0FQMTJUZXN0TW9kdWxlQy9vcmcvYXBhY2hlL2F4aXMyL3NvYXAxMnRlc3RpbmcvaGFuZGxlcnMvU09BUDEyT3V0RmF1bHRGbG93SGFuZGxlckRlZmF1bHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zb2FwMTJ0ZXN0aW5nLmhhbmRsZXJzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaGFuZGxlcnMuQWJzdHJhY3RIYW5kbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQSGVhZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQSGVhZGVyQmxvY2s7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBTT0FQMTJPdXRGYXVsdEZsb3dIYW5kbGVyRGVmYXVsdCBleHRlbmRzIEFic3RyYWN0SGFuZGxlciB7Ci0KLQotICAgIHB1YmxpYyB2b2lkIHJldm9rZShNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgSW52b2NhdGlvblJlc3BvbnNlIGludm9rZShNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB7Ci0gICAgICAgIEludGVnZXIgaGVhZGVyQmxvY2tQcmVzZW50ID0gKEludGVnZXIpIG1zZ0NvbnRleHQuZ2V0T3BlcmF0aW9uQ29udGV4dCgpLmdldFByb3BlcnR5KCJIRUFERVJfQkxPQ0tfUFJFU0VOVCIpOwotICAgICAgICBpZiAoaGVhZGVyQmxvY2tQcmVzZW50LmVxdWFscyhuZXcgSW50ZWdlcigxKSkpIHsKLSAgICAgICAgICAgIFNPQVBIZWFkZXIgaGVhZGVyQWRkID0gKFNPQVBIZWFkZXIpIG1zZ0NvbnRleHQuZ2V0T3BlcmF0aW9uQ29udGV4dCgpLmdldFByb3BlcnR5KCJIRUFERVJfQkxPQ0siKTsKLSAgICAgICAgICAgSXRlcmF0b3IgaGVhZGVyQmxvY2tzID0gaGVhZGVyQWRkLmV4YW1pbmVBbGxIZWFkZXJCbG9ja3MoKTsKLSAgICAgICAgICAgIHdoaWxlKGhlYWRlckJsb2Nrcy5oYXNOZXh0KCkpewotICAgICAgICAgICAgICAgIFNPQVBIZWFkZXJCbG9jayBoZWFkZXJCbG9jaz0oU09BUEhlYWRlckJsb2NrKSBoZWFkZXJCbG9ja3MubmV4dCgpOwotICAgICAgICAgICAgICAgIG1zZ0NvbnRleHQuZ2V0RW52ZWxvcGUoKS5nZXRIZWFkZXIoKS5hZGRDaGlsZChoZWFkZXJCbG9jayk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtc2dDb250ZXh0LmdldEVudmVsb3BlKCkuZ2V0SGVhZGVyKCkuZGlzY2FyZCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBJbnZvY2F0aW9uUmVzcG9uc2UuQ09OVElOVUU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9TT0FQMTJUZXN0TW9kdWxlQy9vcmcvYXBhY2hlL2F4aXMyL3NvYXAxMnRlc3RpbmcvaGFuZGxlcnMvU09BUDEyT3V0Rmxvd0hhbmRsZXJEZWZhdWx0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1NPQVAxMlRlc3RNb2R1bGVDL29yZy9hcGFjaGUvYXhpczIvc29hcDEydGVzdGluZy9oYW5kbGVycy9TT0FQMTJPdXRGbG93SGFuZGxlckRlZmF1bHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk1ZTdhMi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1NPQVAxMlRlc3RNb2R1bGVDL29yZy9hcGFjaGUvYXhpczIvc29hcDEydGVzdGluZy9oYW5kbGVycy9TT0FQMTJPdXRGbG93SGFuZGxlckRlZmF1bHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zb2FwMTJ0ZXN0aW5nLmhhbmRsZXJzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaGFuZGxlcnMuQWJzdHJhY3RIYW5kbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQSGVhZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQSGVhZGVyQmxvY2s7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBTT0FQMTJPdXRGbG93SGFuZGxlckRlZmF1bHQgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIgewotCi0KLSAgICBwdWJsaWMgdm9pZCByZXZva2UoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgewotCi0gICAgfQotCi0gICAgcHVibGljIEludm9jYXRpb25SZXNwb25zZSBpbnZva2UoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgewotICAgICAgICBJbnRlZ2VyIGhlYWRlckJsb2NrUHJlc2VudCA9IChJbnRlZ2VyKSBtc2dDb250ZXh0LmdldE9wZXJhdGlvbkNvbnRleHQoKS5nZXRQcm9wZXJ0eSgiSEVBREVSX0JMT0NLX1BSRVNFTlQiKTsKLSAgICAgICAgaWYgKGhlYWRlckJsb2NrUHJlc2VudC5lcXVhbHMobmV3IEludGVnZXIoMSkpKSB7Ci0gICAgICAgICAgICBTT0FQSGVhZGVyIGhlYWRlckFkZCA9IChTT0FQSGVhZGVyKSBtc2dDb250ZXh0LmdldE9wZXJhdGlvbkNvbnRleHQoKS5nZXRQcm9wZXJ0eSgiSEVBREVSX0JMT0NLIik7Ci0gICAgICAgICAgIEl0ZXJhdG9yIGhlYWRlckJsb2NrcyA9IGhlYWRlckFkZC5leGFtaW5lQWxsSGVhZGVyQmxvY2tzKCk7Ci0gICAgICAgICAgICB3aGlsZShoZWFkZXJCbG9ja3MuaGFzTmV4dCgpKXsKLSAgICAgICAgICAgICAgICBTT0FQSGVhZGVyQmxvY2sgaGVhZGVyQmxvY2s9KFNPQVBIZWFkZXJCbG9jaykgaGVhZGVyQmxvY2tzLm5leHQoKTsKLSAgICAgICAgICAgICAgICBtc2dDb250ZXh0LmdldEVudmVsb3BlKCkuZ2V0SGVhZGVyKCkuYWRkQ2hpbGQoaGVhZGVyQmxvY2spOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbXNnQ29udGV4dC5nZXRFbnZlbG9wZSgpLmdldEhlYWRlcigpLmRpc2NhcmQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gSW52b2NhdGlvblJlc3BvbnNlLkNPTlRJTlVFOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvU09BUDEyVGVzdFNlcnZpY2VCL01FVEEtSU5GL3NlcnZpY2VzLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvU09BUDEyVGVzdFNlcnZpY2VCL01FVEEtSU5GL3NlcnZpY2VzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRlYWFkZi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1NPQVAxMlRlc3RTZXJ2aWNlQi9NRVRBLUlORi9zZXJ2aWNlcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzZXJ2aWNlIG5hbWU9IlNPQVAxMlRlc3RTZXJ2aWNlQiI+Ci0gICAgPGRlc2NyaXB0aW9uPlRoaXMgaXMgYSBzYW1wbGUgV2ViIFNlcnZpY2UgZm9yIFNPQVAgMS4yIFRlc3Rpbmc8L2Rlc2NyaXB0aW9uPgotICAgIDxtb2R1bGUgcmVmPSJTT0FQMTJUZXN0TW9kdWxlQiIvPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iU2VydmljZUNsYXNzIiBsb2NrZWQ9InhzZDpmYWxzZSI+b3JnLmFwYWNoZS5heGlzMi5zb2FwMTJ0ZXN0aW5nLndlYnNlcnZpY2VzLlNPQVAxMlRlc3RXZWJTZXJ2aWNlRGVmYXVsdDwvcGFyYW1ldGVyPgotICAgIDxvcGVyYXRpb24gbmFtZT0iZWNobyI+Ci0gICAgICAgIDxtZXNzYWdlUmVjZWl2ZXIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLlJhd1hNTElOT3V0TWVzc2FnZVJlY2VpdmVyIi8+Ci0gICAgPC9vcGVyYXRpb24+Ci08L3NlcnZpY2U+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9TT0FQMTJUZXN0U2VydmljZUIvYnVpbGQueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9TT0FQMTJUZXN0U2VydmljZUIvYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzRiMTMwLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvU09BUDEyVGVzdFNlcnZpY2VCL2J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxwcm9qZWN0IGJhc2VkaXI9Ii4iIGRlZmF1bHQ9ImphciI+Ci0gICAgPHByb3BlcnR5IG5hbWU9InNyYyIgbG9jYXRpb249Ii4iLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iYnVpbGQiIGxvY2F0aW9uPSJidWlsZCIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC5jbGFzc2VzIiBsb2NhdGlvbj0iJHtidWlsZH0vY2xhc3NlcyIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC5saWIiIGxvY2F0aW9uPSIke2J1aWxkfS9saWIiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0ibGliIiBsb2NhdGlvbj0ibGliIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9InJvb3QiIGxvY2F0aW9uPSIuLi8uLi8uLi8iLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iamFyLmRpciIgbG9jYXRpb249IiR7cm9vdH0vdGFyZ2V0L1JlcG9zaXRvcnkvc2VydmljZXMvIi8+Ci0KLSAgICA8cGF0aCBpZD0iYXhpcy50ZXN0LmNsYXNzcGF0aCI+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke2phdmEuY2xhc3MucGF0aH0iLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7bWF2ZW4uY2xhc3MucGF0aH0iLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIuLi8uLi8uLi90YXJnZXQvY2xhc3NlcyIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249Ii4uLy4uLy4uL3RhcmdldC90ZXN0LWNsYXNzZXMiLz4KLSAgICA8L3BhdGg+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUiIGRlcGVuZHM9ImluaXQiIHVubGVzcz0iamFycy51cHRvZGF0ZSI+Ci0gICAgICAgIDxta2RpciBkaXI9IiR7YnVpbGQuY2xhc3Nlc30iLz4KLSAgICAgICAgPG1rZGlyIGRpcj0iJHtidWlsZC5saWJ9Ii8+Ci0gICAgICAgIDxqYXZhYyBmb3JrPSJ0cnVlIiBkZXN0ZGlyPSIke2J1aWxkLmNsYXNzZXN9IiBkZWJ1Zz0ib24iPgotICAgICAgICAgICAgPGNsYXNzcGF0aCByZWZpZD0iYXhpcy50ZXN0LmNsYXNzcGF0aCIvPgotICAgICAgICAgICAgPHNyYyBwYXRoPSIke3NyY30iLz4KLSAgICAgICAgPC9qYXZhYz4KLSAgICA8L3RhcmdldD4KLQotICAgIDx0YXJnZXQgbmFtZT0iamFyIiBkZXBlbmRzPSJjb21waWxlIiB1bmxlc3M9ImphcnMudXB0b2RhdGUiPgotICAgICAgICA8Y29weSB0b2Rpcj0iJHtidWlsZC5jbGFzc2VzfS9NRVRBLUlORiI+Ci0gICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7YmFzZWRpcn0vTUVUQS1JTkYvIj4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLnhtbCIvPgotICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9ImJ1aWxkLnhtbCIvPgotICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICA8L2NvcHk+Ci0KLSAgICAgICAgPG1rZGlyIGRpcj0iJHtqYXIuZGlyfSIvPgotICAgICAgICA8amFyIGphcmZpbGU9IiR7amFyLmRpcn0vU09BUDEyVGVzdFNlcnZpY2VCLmphciIgYmFzZWRpcj0iJHtidWlsZC5jbGFzc2VzfSI+Ci0gICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKiIvPgotICAgICAgICA8L2phcj4KLSAgICAgICAgPGRlbGV0ZSBkaXI9IiR7YnVpbGR9Ii8+Ci0gICAgPC90YXJnZXQ+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9ImluaXQiPgotICAgICAgICA8dXB0b2RhdGUgcHJvcGVydHk9ImphcnMudXB0b2RhdGUiIHRhcmdldGZpbGU9IiR7amFyLmRpcn0vU09BUDEyVGVzdFNlcnZpY2VCLmphciI+Ci0gICAgICAgICAgICA8c3JjZmlsZXMgZGlyPSIke3NyY30iPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouamF2YSIvPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoueG1sIi8+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi53c2RsIi8+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iJHtidWlsZH0vKioiLz4KLSAgICAgICAgICAgIDwvc3JjZmlsZXM+Ci0gICAgICAgIDwvdXB0b2RhdGU+Ci0gICAgICAgIDxlY2hvIG1lc3NhZ2U9InRoZSBmaWxlcyBhcmUgdXAgdG8gZGF0ZSA9ICR7amFycy51cHRvZGF0ZX0iPjwvZWNobz4KLSAgICA8L3RhcmdldD4KLQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9TT0FQMTJUZXN0U2VydmljZUIvb3JnL2FwYWNoZS9heGlzMi9zb2FwMTJ0ZXN0aW5nL3dlYnNlcnZpY2VzL1NPQVAxMlRlc3RXZWJTZXJ2aWNlRGVmYXVsdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9TT0FQMTJUZXN0U2VydmljZUIvb3JnL2FwYWNoZS9heGlzMi9zb2FwMTJ0ZXN0aW5nL3dlYnNlcnZpY2VzL1NPQVAxMlRlc3RXZWJTZXJ2aWNlRGVmYXVsdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGFiNWRmLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvU09BUDEyVGVzdFNlcnZpY2VCL29yZy9hcGFjaGUvYXhpczIvc29hcDEydGVzdGluZy93ZWJzZXJ2aWNlcy9TT0FQMTJUZXN0V2ViU2VydmljZURlZmF1bHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zb2FwMTJ0ZXN0aW5nLndlYnNlcnZpY2VzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBTT0FQMTJUZXN0V2ViU2VydmljZURlZmF1bHQgewotICAgIHB1YmxpYyBPTUVsZW1lbnQgZWNobyhPTUVsZW1lbnQgZWxlbWVudCkgewotICAgICAgICBpZiAoZWxlbWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoZWxlbWVudC5nZXRMb2NhbE5hbWUoKS5lcXVhbHMoImVjaG9PayIpKSB7Ci0gICAgICAgICAgICAgICAgZWxlbWVudC5zZXRMb2NhbE5hbWUoInJlc3BvbnNlT2siKTsKLQotICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50LmdldExvY2FsTmFtZSgpLmVxdWFscygicmV0dXJuVm9pZCIpKSB7Ci0gICAgICAgICAgICAgICAgZWxlbWVudC5zZXRMb2NhbE5hbWUoInJldHVyblZvaWRSZXNwb25zZSIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBlbGVtZW50OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvU09BUDEyVGVzdFNlcnZpY2VDL01FVEEtSU5GL3NlcnZpY2VzLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvU09BUDEyVGVzdFNlcnZpY2VDL01FVEEtSU5GL3NlcnZpY2VzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGMyZGUyYi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1NPQVAxMlRlc3RTZXJ2aWNlQy9NRVRBLUlORi9zZXJ2aWNlcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzZXJ2aWNlIG5hbWU9IlNPQVAxMlRlc3RTZXJ2aWNlQyI+Ci0gICAgPGRlc2NyaXB0aW9uPlRoaXMgaXMgYSBzYW1wbGUgV2ViIFNlcnZpY2UgZm9yIFNPQVAgMS4yIFRlc3Rpbmc8L2Rlc2NyaXB0aW9uPgotICAgIDxtb2R1bGUgcmVmPSJTT0FQMTJUZXN0TW9kdWxlQyIvPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iU2VydmljZUNsYXNzIiBsb2NrZWQ9InhzZDpmYWxzZSI+b3JnLmFwYWNoZS5heGlzMi5zb2FwMTJ0ZXN0aW5nLndlYnNlcnZpY2VzLlNPQVAxMlRlc3RXZWJTZXJ2aWNlRGVmYXVsdDwvcGFyYW1ldGVyPgotICAgIDxvcGVyYXRpb24gbmFtZT0iZWNobyI+Ci0gICAgICAgIDxtZXNzYWdlUmVjZWl2ZXIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLlJhd1hNTElOT3V0TWVzc2FnZVJlY2VpdmVyIi8+Ci0gICAgPC9vcGVyYXRpb24+Ci08L3NlcnZpY2U+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9TT0FQMTJUZXN0U2VydmljZUMvYnVpbGQueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9TT0FQMTJUZXN0U2VydmljZUMvYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjAxMWZjLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvU09BUDEyVGVzdFNlcnZpY2VDL2J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxwcm9qZWN0IGJhc2VkaXI9Ii4iIGRlZmF1bHQ9ImphciI+Ci0gICAgPHByb3BlcnR5IG5hbWU9InNyYyIgbG9jYXRpb249Ii4iLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iYnVpbGQiIGxvY2F0aW9uPSJidWlsZCIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC5jbGFzc2VzIiBsb2NhdGlvbj0iJHtidWlsZH0vY2xhc3NlcyIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC5saWIiIGxvY2F0aW9uPSIke2J1aWxkfS9saWIiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0ibGliIiBsb2NhdGlvbj0ibGliIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9InJvb3QiIGxvY2F0aW9uPSIuLi8uLi8uLi8iLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iamFyLmRpciIgbG9jYXRpb249IiR7cm9vdH0vdGFyZ2V0L1JlcG9zaXRvcnkvc2VydmljZXMvIi8+Ci0KLSAgICA8cGF0aCBpZD0iYXhpcy50ZXN0LmNsYXNzcGF0aCI+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke2phdmEuY2xhc3MucGF0aH0iLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7bWF2ZW4uY2xhc3MucGF0aH0iLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIuLi8uLi8uLi90YXJnZXQvY2xhc3NlcyIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249Ii4uLy4uLy4uL3RhcmdldC90ZXN0LWNsYXNzZXMiLz4KLSAgICA8L3BhdGg+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUiIGRlcGVuZHM9ImluaXQiIHVubGVzcz0iamFycy51cHRvZGF0ZSI+Ci0gICAgICAgIDxta2RpciBkaXI9IiR7YnVpbGQuY2xhc3Nlc30iLz4KLSAgICAgICAgPG1rZGlyIGRpcj0iJHtidWlsZC5saWJ9Ii8+Ci0gICAgICAgIDxqYXZhYyBmb3JrPSJ0cnVlIiBkZXN0ZGlyPSIke2J1aWxkLmNsYXNzZXN9IiBkZWJ1Zz0ib24iPgotICAgICAgICAgICAgPGNsYXNzcGF0aCByZWZpZD0iYXhpcy50ZXN0LmNsYXNzcGF0aCIvPgotICAgICAgICAgICAgPHNyYyBwYXRoPSIke3NyY30iLz4KLSAgICAgICAgPC9qYXZhYz4KLSAgICA8L3RhcmdldD4KLQotICAgIDx0YXJnZXQgbmFtZT0iamFyIiBkZXBlbmRzPSJjb21waWxlIiB1bmxlc3M9ImphcnMudXB0b2RhdGUiPgotICAgICAgICA8Y29weSB0b2Rpcj0iJHtidWlsZC5jbGFzc2VzfS9NRVRBLUlORiI+Ci0gICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7YmFzZWRpcn0vTUVUQS1JTkYvIj4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLnhtbCIvPgotICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9ImJ1aWxkLnhtbCIvPgotICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICA8L2NvcHk+Ci0KLSAgICAgICAgPG1rZGlyIGRpcj0iJHtqYXIuZGlyfSIvPgotICAgICAgICA8amFyIGphcmZpbGU9IiR7amFyLmRpcn0vU09BUDEyVGVzdFNlcnZpY2VDLmphciIgYmFzZWRpcj0iJHtidWlsZC5jbGFzc2VzfSI+Ci0gICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKiIvPgotICAgICAgICA8L2phcj4KLSAgICAgICAgPGRlbGV0ZSBkaXI9IiR7YnVpbGR9Ii8+Ci0gICAgPC90YXJnZXQ+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9ImluaXQiPgotICAgICAgICA8dXB0b2RhdGUgcHJvcGVydHk9ImphcnMudXB0b2RhdGUiIHRhcmdldGZpbGU9IiR7amFyLmRpcn0vU09BUDEyVGVzdFNlcnZpY2VDLmphciI+Ci0gICAgICAgICAgICA8c3JjZmlsZXMgZGlyPSIke3NyY30iPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouamF2YSIvPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoueG1sIi8+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi53c2RsIi8+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iJHtidWlsZH0vKioiLz4KLSAgICAgICAgICAgIDwvc3JjZmlsZXM+Ci0gICAgICAgIDwvdXB0b2RhdGU+Ci0gICAgICAgIDxlY2hvIG1lc3NhZ2U9InRoZSBmaWxlcyBhcmUgdXAgdG8gZGF0ZSA9ICR7amFycy51cHRvZGF0ZX0iPjwvZWNobz4KLSAgICA8L3RhcmdldD4KLQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9TT0FQMTJUZXN0U2VydmljZUMvb3JnL2FwYWNoZS9heGlzMi9zb2FwMTJ0ZXN0aW5nL3dlYnNlcnZpY2VzL1NPQVAxMlRlc3RXZWJTZXJ2aWNlRGVmYXVsdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9TT0FQMTJUZXN0U2VydmljZUMvb3JnL2FwYWNoZS9heGlzMi9zb2FwMTJ0ZXN0aW5nL3dlYnNlcnZpY2VzL1NPQVAxMlRlc3RXZWJTZXJ2aWNlRGVmYXVsdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGFiNWRmLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvU09BUDEyVGVzdFNlcnZpY2VDL29yZy9hcGFjaGUvYXhpczIvc29hcDEydGVzdGluZy93ZWJzZXJ2aWNlcy9TT0FQMTJUZXN0V2ViU2VydmljZURlZmF1bHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zb2FwMTJ0ZXN0aW5nLndlYnNlcnZpY2VzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBTT0FQMTJUZXN0V2ViU2VydmljZURlZmF1bHQgewotICAgIHB1YmxpYyBPTUVsZW1lbnQgZWNobyhPTUVsZW1lbnQgZWxlbWVudCkgewotICAgICAgICBpZiAoZWxlbWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoZWxlbWVudC5nZXRMb2NhbE5hbWUoKS5lcXVhbHMoImVjaG9PayIpKSB7Ci0gICAgICAgICAgICAgICAgZWxlbWVudC5zZXRMb2NhbE5hbWUoInJlc3BvbnNlT2siKTsKLQotICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50LmdldExvY2FsTmFtZSgpLmVxdWFscygicmV0dXJuVm9pZCIpKSB7Ci0gICAgICAgICAgICAgICAgZWxlbWVudC5zZXRMb2NhbE5hbWUoInJldHVyblZvaWRSZXNwb25zZSIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBlbGVtZW50OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1N3QS1lbmFibGVkLWF4aXMyLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1N3QS1lbmFibGVkLWF4aXMyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWExMmRmMy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9Td0EtZW5hYmxlZC1heGlzMi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotPCEtLQotICB+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+Ci0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1N3QS1maWxlQ2FjaGUtZW5hYmxlZC1heGlzMi54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9Td0EtZmlsZUNhY2hlLWVuYWJsZWQtYXhpczIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkMzgyNTQ4Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1N3QS1maWxlQ2FjaGUtZW5hYmxlZC1heGlzMi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotPCEtLQotICB+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+Ci0gICAgPC9waGFzZU9yZGVyPgotPC9heGlzY29uZmlnPgotCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L2RlcGxveW1lbnQuYm90aC5heGlzMi54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L2RlcGxveW1lbnQuYm90aC5heGlzMi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjODEyY2IuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9kZXBsb3ltZW50LmJvdGguYXhpczIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+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+Ci0gICAgPHBoYXNlT3JkZXIgdHlwZT0iT3V0RmF1bHRGbG93Ij4KLSAgICAgICAgPCEtLSAgICAgIHVzZXIgY2FuIGFkZCBoaXMgb3duIHBoYXNlcyB0byB0aGlzIGFyZWEgIC0tPgotICAgICAgICA8cGhhc2UgbmFtZT0iT3BlcmF0aW9uT3V0RmF1bHRQaGFzZSIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iUG9saWN5RGV0ZXJtaW5hdGlvbiIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iTWVzc2FnZU91dCIvPgotICAgIDwvcGhhc2VPcmRlcj4KLQotPC9heGlzY29uZmlnPgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9zZXJ2ZXItdHJhbnNwb3J0LnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvc2VydmVyLXRyYW5zcG9ydC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxNjU1NTMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9zZXJ2ZXItdHJhbnNwb3J0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+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+Ci0gICAgPHBoYXNlT3JkZXIgdHlwZT0iT3V0RmF1bHRGbG93Ij4KLSAgICAgICAgPCEtLSAgICAgIHVzZXIgY2FuIGFkZCBoaXMgb3duIHBoYXNlcyB0byB0aGlzIGFyZWEgIC0tPgotICAgICAgICA8cGhhc2UgbmFtZT0idXNlcnBoYXNlMSIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iUG9saWN5RGV0ZXJtaW5hdGlvbiIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iTWVzc2FnZU91dCIvPgotICAgIDwvcGhhc2VPcmRlcj4KLTwvYXhpc2NvbmZpZz4KLQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvZW50ZXJwcmlzZS53c2RsIGIvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvZW50ZXJwcmlzZS53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzJiYjk1Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL2VudGVycHJpc2Uud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDM4MzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLVNhbGVzZm9yY2UuY29tIEVudGVycHJpc2UgV2ViIFNlcnZpY2VzIEFQSSBWZXJzaW9uIDcuMCAKLUdlbmVyYXRlZCBvbiAyMDA2LTA0LTE5IDAwOjI4OjA2ICswMDAwLgotCi1Db3B5cmlnaHQgMTk5OS0yMDA2IHNhbGVzZm9yY2UuY29tLCBpbmMuCi1BbGwgUmlnaHRzIFJlc2VydmVkCi0tLT4KLQotPGRlZmluaXRpb25zIHRhcmdldE5hbWVzcGFjZT0idXJuOmVudGVycHJpc2Uuc29hcC5zZm9yY2UuY29tIgotICAgICAgICAgICAgIHhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIKLSAgICAgICAgICAgICB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIgotICAgICAgICAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgICAgICAgeG1sbnM6dG5zPSJ1cm46ZW50ZXJwcmlzZS5zb2FwLnNmb3JjZS5jb20iCi0gICAgICAgICAgICAgeG1sbnM6Zm5zPSJ1cm46ZmF1bHQuZW50ZXJwcmlzZS5zb2FwLnNmb3JjZS5jb20iCi0gICAgICAgICAgICAgeG1sbnM6ZW5zPSJ1cm46c29iamVjdC5lbnRlcnByaXNlLnNvYXAuc2ZvcmNlLmNvbSI+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+Ci0gICAgPC9zZXJ2aWNlPgotCi08L2RlZmluaXRpb25zPgotICAgIAotCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9taW1lX21lc3NhZ2UudHh0IGIvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvbWltZV9tZXNzYWdlLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y3NDFlNi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9taW1lX21lc3NhZ2UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLS0tLU1JTUVCb3VuZGFyeTI1OERFMkQxMDUyOThCNzU2RAotY29udGVudC10eXBlOnRleHQvcGxhaW47IGNoYXJzZXQ9SVNPLTg4NTktMTsgZm9ybWF0PWZsb3dlZAotY29udGVudC10cmFuc2Zlci1lbmNvZGluZzpiaW5hcnkKLWNvbnRlbnQtaWQ6PDAuMTVCNTBFRjQ5MzE3NTE4QjAxQGFwYWNoZS5vcmc+Ci0KLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J3V0Zi04Jz8+PHNvYXBlbnY6RW52ZWxvcGUgeG1sbnM6c29hcGVudj0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIj48c29hcGVudjpIZWFkZXI+PHdzYTpUbyB4bWxuczp3c2E9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDgvYWRkcmVzc2luZyI+aHR0cDovL2xvY2FsaG9zdDo4MDcwL2F4aXMyL3NlcnZpY2VzL01UT01TZXJ2aWNlL210b21TYW1wbGU8L3dzYTpUbz48L3NvYXBlbnY6SGVhZGVyPjxzb2FwZW52OkJvZHk+PHg6RWNob1Rlc3QgeG1sbnM6eD0iaHR0cDovL2V4YW1wbGUub3JnL210b20vZGF0YSI+PHg6RGF0YT48eG9wOkluY2x1ZGUgaHJlZj0iY2lkOjEuQkJGQzhENDhBMjEyNThFQkJEQGFwYWNoZS5vcmciIHhtbG5zOnhvcD0iaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC94b3AvaW5jbHVkZSI+PC94b3A6SW5jbHVkZT48L3g6RGF0YT48eDpEYXRhPjx4b3A6SW5jbHVkZSBocmVmPSJjaWQ6Mi5DQjM2NUUzNkUyMUJENjQ5MUFAYXBhY2hlLm9yZyIgeG1sbnM6eG9wPSJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3hvcC9pbmNsdWRlIj48L3hvcDpJbmNsdWRlPjwveDpEYXRhPjwveDpFY2hvVGVzdD48L3NvYXBlbnY6Qm9keT48L3NvYXBlbnY6RW52ZWxvcGU+Ci0tLS0tTUlNRUJvdW5kYXJ5MjU4REUyRDEwNTI5OEI3NTZECi1jb250ZW50LWlkOjwxMS5CQkZDOEQ0OEEyMTI1OEVCQkRAYXBhY2hlLm9yZz4KLWNvbnRlbnQtdHlwZTp0ZXh0L2NzdjtuYW1lPSJ0ZXN0LmNzdiIKLWNvbnRlbnQtdHJhbnNmZXItZW5jb2Rpbmc6YmluYXJ5Ci0KLXNhbWluZGEgc2FtaW5kYSBzYW1pbmRhIHNhbWluZGEgc2FtaW5kYSBzYW1pbmRhIHNhbWluZGEgc2FtaW5kYSBzYW1pbmRhIHNhbWluZGEgc2FtaW5kYSBzYW1pbmRhIHNhbWluZGEgc2FtaW5kYSBzYW1pbmRhIHNhbWluZGEgc2FtaW5kYSBzYW1pbmRhIHNhbWluZGEgc2FtaW5kYSAKLQotLS0tLU1JTUVCb3VuZGFyeTI1OERFMkQxMDUyOThCNzU2RAotY29udGVudC1pZDo8Mi5DQjM2NUUzNkUyMUJENjQ5MUFAYXBhY2hlLm9yZz4KLWNvbnRlbnQtdHlwZTphcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0KLWNvbnRlbnQtdHJhbnNmZXItZW5jb2Rpbmc6YmluYXJ5Ci0KLXNhbWluZGEgc2FtaW5kYSBzYW1pbmRhIHNhbWluZGEgc2FtaW5kYSBzYW1pbmRhIHNhbWluZGEgc2FtaW5kYSBzYW1pbmRhIHNhbWluZGEgc2FtaW5kYSBzYW1pbmRhIHNhbWluZGEgc2FtaW5kYSBzYW1pbmRhIHNhbWluZGEgc2FtaW5kYSBzYW1pbmRhIHNhbWluZGEgc2FtaW5kYSAKLQotLS0tLU1JTUVCb3VuZGFyeTI1OERFMkQxMDUyOThCNzU2RC0tCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9tdG9tL01UT00tZW5hYmxlZC1heGlzMi54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9tdG9tL01UT00tZW5hYmxlZC1heGlzMi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2MjZhNTMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvbXRvbS9NVE9NLWVuYWJsZWQtYXhpczIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+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+Ci0gICAgPHBoYXNlT3JkZXIgdHlwZT0iT3V0RmF1bHRGbG93Ij4KLSAgICAgICAgPCEtLSAgICAgIHVzZXIgY2FuIGFkZCBoaXMgb3duIHBoYXNlcyB0byB0aGlzIGFyZWEgIC0tPgotICAgICAgICA8cGhhc2UgbmFtZT0idXNlcnBoYXNlMSIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iUG9saWN5RGV0ZXJtaW5hdGlvbiIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iTWVzc2FnZU91dCIvPgotICAgIDwvcGhhc2VPcmRlcj4KLTwvYXhpc2NvbmZpZz4KLQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvbXRvbS9NVE9NLWZpbGVDYWNoZS1lbmFibGVkLWF4aXMyLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL210b20vTVRPTS1maWxlQ2FjaGUtZW5hYmxlZC1heGlzMi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5ZjQxZjkuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvbXRvbS9NVE9NLWZpbGVDYWNoZS1lbmFibGVkLWF4aXMyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+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+Ci0gICAgPHBoYXNlT3JkZXIgdHlwZT0iT3V0RmF1bHRGbG93Ij4KLSAgICAgICAgPCEtLSAgICAgIHVzZXIgY2FuIGFkZCBoaXMgb3duIHBoYXNlcyB0byB0aGlzIGFyZWEgIC0tPgotICAgICAgICA8cGhhc2UgbmFtZT0idXNlcnBoYXNlMSIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iUG9saWN5RGV0ZXJtaW5hdGlvbiIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iTWVzc2FnZU91dCIvPgotICAgIDwvcGhhc2VPcmRlcj4KLTwvYXhpc2NvbmZpZz4KLQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvbXRvbS90ZXN0LmpwZyBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL210b20vdGVzdC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5YzEwY2EuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvbXRvbS90ZXN0LmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL210b20vd210b20uYmluIGIvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvbXRvbS93bXRvbS5iaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxZjljOGMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvbXRvbS93bXRvbS5iaW4KKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0tLS0tTUlNRUJvdW5kYXJ5MjU4REUyRDEwNTI5OEI3NTZECi1jb250ZW50LXR5cGU6YXBwbGljYXRpb24veG9wK3htbDsgY2hhcnNldD11dGYtODsgdHlwZT0iYXBwbGljYXRpb24vc29hcCt4bWwiCi1jb250ZW50LXRyYW5zZmVyLWVuY29kaW5nOmJpbmFyeQotY29udGVudC1pZDo8MC4xNUI1MEVGNDkzMTc1MThCMDFAYXBhY2hlLm9yZz4KLQotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0ndXRmLTgnPz48c29hcGVudjpFbnZlbG9wZSB4bWxuczpzb2FwZW52PSJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUiPjxzb2FwZW52OkhlYWRlcj48d3NhOlRvIHhtbG5zOndzYT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOC9hZGRyZXNzaW5nIj5odHRwOi8vbG9jYWxob3N0OjgwNzAvYXhpczIvc2VydmljZXMvTVRPTVNlcnZpY2UvbXRvbVNhbXBsZTwvd3NhOlRvPjwvc29hcGVudjpIZWFkZXI+PHNvYXBlbnY6Qm9keT48eDpFY2hvVGVzdCB4bWxuczp4PSJodHRwOi8vZXhhbXBsZS5vcmcvbXRvbS9kYXRhIj48eDpEYXRhPjx4b3A6SW5jbHVkZSBocmVmPSJjaWQ6MS5CQkZDOEQ0OEEyMTI1OEVCQkRAYXBhY2hlLm9yZyIgeG1sbnM6eG9wPSJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3hvcC9pbmNsdWRlIj48L3hvcDpJbmNsdWRlPjwveDpEYXRhPjx4OkRhdGE+PHhvcDpJbmNsdWRlIGhyZWY9ImNpZDoyLkNCMzY1RTM2RTIxQkQ2NDkxQUBhcGFjaGUub3JnIiB4bWxuczp4b3A9Imh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgveG9wL2luY2x1ZGUiPjwveG9wOkluY2x1ZGU+PC94OkRhdGE+PC94OkVjaG9UZXN0Pjwvc29hcGVudjpCb2R5Pjwvc29hcGVudjpFbnZlbG9wZT4KLS0tLS1NSU1FQm91bmRhcnkyNThERTJEMTA1Mjk4Qjc1NkQKLWNvbnRlbnQtaWQ6PDExLkJCRkM4RDQ4QTIxMjU4RUJCREBhcGFjaGUub3JnPgotY29udGVudC10eXBlOmFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbQotY29udGVudC10cmFuc2Zlci1lbmNvZGluZzpiaW5hcnkKLQotc2FtaW5kYSBzYW1pbmRhIHNhbWluZGEgc2FtaW5kYSBzYW1pbmRhIHNhbWluZGEgc2FtaW5kYSBzYW1pbmRhIHNhbWluZGEgc2FtaW5kYSBzYW1pbmRhIHNhbWluZGEgc2FtaW5kYSBzYW1pbmRhIHNhbWluZGEgc2FtaW5kYSBzYW1pbmRhIHNhbWluZGEgc2FtaW5kYSBzYW1pbmRhIAotCi0tLS0tTUlNRUJvdW5kYXJ5MjU4REUyRDEwNTI5OEI3NTZECi1jb250ZW50LWlkOjwyLkNCMzY1RTM2RTIxQkQ2NDkxQUBhcGFjaGUub3JnPgotY29udGVudC10eXBlOmFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbQotY29udGVudC10cmFuc2Zlci1lbmNvZGluZzpiaW5hcnkKLQotc2FtaW5kYSBzYW1pbmRhIHNhbWluZGEgc2FtaW5kYSBzYW1pbmRhIHNhbWluZGEgc2FtaW5kYSBzYW1pbmRhIHNhbWluZGEgc2FtaW5kYSBzYW1pbmRhIHNhbWluZGEgc2FtaW5kYSBzYW1pbmRhIHNhbWluZGEgc2FtaW5kYSBzYW1pbmRhIHNhbWluZGEgc2FtaW5kYSBzYW1pbmRhIAotCi0tLS0tTUlNRUJvdW5kYXJ5MjU4REUyRDEwNTI5OEI3NTZELS0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3JwYy90ZXN0LXJwYy0yLndzZGwgYi92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9ycGMvdGVzdC1ycGMtMi53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDk1ZmRmLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3JwYy90ZXN0LXJwYy0yLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxkZWZpbml0aW9ucyB4bWxucz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iCi0gICAgICAgICAgICAgeG1sbnM6aHR0cD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9odHRwLyIgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICAgICAgIHhtbG5zOnNvYXBlbmM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIgotICAgICAgICAgICAgIHhtbG5zOm1pbWU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvbWltZS8iIHhtbG5zOnR5cGVzPSJodHRwOi8vd3d3LmV4YW1wbGUuY29tL3R5cGVzIgotICAgICAgICAgICAgIHhtbG5zOnk9Imh0dHA6Ly93d3cuZXhhbXBsZS5jb20iIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy5leGFtcGxlLmNvbSI+Ci0gICAgPHR5cGVzPjwvdHlwZXM+Ci0gICAgPG1lc3NhZ2UgbmFtZT0icmVxdWVzdE1lc3NhZ2UiPgotICAgICAgICA8cGFydCBuYW1lPSJwYXJ0MSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0gICAgICAgIDxwYXJ0IG5hbWU9InBhcnQyIiB0eXBlPSJ4czppbnQiLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0icmVzcG9uc2VNZXNzYWdlIj4KLSAgICAgICAgPHBhcnQgbmFtZT0icGFydDEiIHR5cGU9InhzOnN0cmluZyIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8cG9ydFR5cGUgbmFtZT0iZWNob1BvcnRUeXBlIj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvIj4KLSAgICAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJ5OnJlcXVlc3RNZXNzYWdlIi8+Ci0gICAgICAgICAgICA8b3V0cHV0IG1lc3NhZ2U9Ink6cmVzcG9uc2VNZXNzYWdlIi8+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotICAgIDwvcG9ydFR5cGU+Ci0gICAgPGJpbmRpbmcgbmFtZT0iZWNob0JpbmRpbmciIHR5cGU9Ink6ZWNob1BvcnRUeXBlIj4KLSAgICAgICAgPHNvYXA6YmluZGluZyBzdHlsZT0icnBjIiB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIvPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG8iPgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249ImVjaG8iLz4KLSAgICAgICAgICAgIDxpbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgIDxvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvb3V0cHV0PgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICA8L2JpbmRpbmc+Ci0gICAgPHNlcnZpY2UgbmFtZT0ic2VydmljZU5hbWUiPgotICAgICAgICA8cG9ydCBiaW5kaW5nPSJ5OmVjaG9CaW5kaW5nIiBuYW1lPSJodHRwUG9ydCI+Ci0gICAgICAgICAgICA8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjgwODAvYXhpczIvc2VydmljZXMvZWNobyIvPgotICAgICAgICA8L3BvcnQ+Ci0gICAgPC9zZXJ2aWNlPgotPC9kZWZpbml0aW9ucz4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3JwYy90ZXN0LXJwYy0zLndzZGwgYi92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9ycGMvdGVzdC1ycGMtMy53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMGMwYzE3Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3JwYy90ZXN0LXJwYy0zLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxkZWZpbml0aW9ucyB4bWxucz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iIHhtbG5zOmh0dHA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvaHR0cC8iIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6c29hcGVuYz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iIHhtbG5zOm1pbWU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvbWltZS8iIHhtbG5zOnR5cGVzPSJodHRwOi8vd3d3LmV4YW1wbGUuY29tL3R5cGVzIiB4bWxuczp5PSJodHRwOi8vd3d3LmV4YW1wbGUuY29tIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cuZXhhbXBsZS5jb20iPgotCTx0eXBlcy8+Ci0JPHR5cGVzPgotCQk8eHM6c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy5leGFtcGxlLmNvbS90eXBlcyI+Ci0JCQk8eHM6Y29tcGxleFR5cGUgbmFtZT0ibXlDb21wbGV4VHlwZSI+Ci0JCQkJPHhzOnNlcXVlbmNlPgotCQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJteUVsdCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JCQkJPC94czpzZXF1ZW5jZT4KLQkJCTwveHM6Y29tcGxleFR5cGU+Ci0JCTwveHM6c2NoZW1hPgotCTwvdHlwZXM+Ci0JPG1lc3NhZ2UgbmFtZT0icmVxdWVzdE1lc3NhZ2UiPgotCQk8cGFydCBuYW1lPSJwYXJ0MSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JCTxwYXJ0IG5hbWU9InBhcnQyIiB0eXBlPSJ4czppbnQiLz4KLQkJPHBhcnQgbmFtZT0icGFydDMiIHR5cGU9InR5cGVzOm15Q29tcGxleFR5cGUiLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0icmVzcG9uc2VNZXNzYWdlIj4KLQkJPHBhcnQgbmFtZT0icGFydDEiIHR5cGU9InhzOnN0cmluZyIvPgotCTwvbWVzc2FnZT4KLQk8cG9ydFR5cGUgbmFtZT0iZWNob1BvcnRUeXBlIj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJlY2hvIj4KLQkJCTxpbnB1dCBtZXNzYWdlPSJ5OnJlcXVlc3RNZXNzYWdlIi8+Ci0JCQk8b3V0cHV0IG1lc3NhZ2U9Ink6cmVzcG9uc2VNZXNzYWdlIi8+Ci0JCTwvb3BlcmF0aW9uPgotCTwvcG9ydFR5cGU+Ci0JPGJpbmRpbmcgbmFtZT0iZWNob0JpbmRpbmciIHR5cGU9Ink6ZWNob1BvcnRUeXBlIj4KLQkJPHNvYXA6YmluZGluZyBzdHlsZT0icnBjIiB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIvPgotCQk8b3BlcmF0aW9uIG5hbWU9ImVjaG8iPgotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249ImVjaG8iLz4KLQkJCTxpbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotCQkJPC9pbnB1dD4KLQkJCTxvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLQkJCTwvb3V0cHV0PgotCQk8L29wZXJhdGlvbj4KLQk8L2JpbmRpbmc+Ci0JPHNlcnZpY2UgbmFtZT0ic2VydmljZU5hbWUiPgotCQk8cG9ydCBuYW1lPSJodHRwUG9ydCIgYmluZGluZz0ieTplY2hvQmluZGluZyI+Ci0JCQk8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjgwODAvYXhpczIvc2VydmljZXMvZWNobyIvPgotCQk8L3BvcnQ+Ci0JPC9zZXJ2aWNlPgotPC9kZWZpbml0aW9ucz4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3NlcnZpY2Uud3NkbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3NlcnZpY2Uud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNjNDczZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9zZXJ2aWNlLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTx3c2RsOmRlZmluaXRpb25zIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3NlcnZpY2VzLmF4aXMuYXBhY2hlLm9yZyIgeG1sbnM6aW1wbD0iaHR0cDovL3NlcnZpY2VzLmF4aXMuYXBhY2hlLm9yZy1pbXBsIiB4bWxuczppbnRmPSJodHRwOi8vc2VydmljZXMuYXhpcy5hcGFjaGUub3JnIiB4bWxuczphcGFjaGVzb2FwPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveG1sLXNvYXAiIHhtbG5zOndzZGxzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0gICAgPCEtLVdTREwgY3JlYXRlZCBieSBBcGFjaGUgQXhpcyB2ZXJzaW9uOiAxLjIuMQotICAgIEJ1aWx0IG9uIEp1biAxNCwgMjAwNSAoMDk6MTU6NTcgRURUKS0tPgotCi0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJydW5SZXF1ZXN0Ij4KLQotICAgIDwvd3NkbDptZXNzYWdlPgotCi0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJydW5SZXNwb25zZSI+Ci0KLSAgICA8L3dzZGw6bWVzc2FnZT4KLQotICAgIDx3c2RsOnBvcnRUeXBlIG5hbWU9Ik91dFNlcnZpY2UiPgotCi0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJydW4iPgotCi0gICAgICAgICAgICA8d3NkbDppbnB1dCBuYW1lPSJydW5SZXF1ZXN0IiBtZXNzYWdlPSJpbnRmOnJ1blJlcXVlc3QiLz4KLQotICAgICAgICAgICAgPHdzZGw6b3V0cHV0IG5hbWU9InJ1blJlc3BvbnNlIiBtZXNzYWdlPSJpbnRmOnJ1blJlc3BvbnNlIi8+Ci0KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLQotICAgIDwvd3NkbDpwb3J0VHlwZT4KLQotICAgIDx3c2RsOmJpbmRpbmcgbmFtZT0ibG9jYWxob3N0OjgwODBTb2FwQmluZGluZyIgdHlwZT0iaW50ZjpPdXRTZXJ2aWNlIj4KLQotICAgICAgICA8d3NkbHNvYXA6YmluZGluZyBzdHlsZT0iZG9jdW1lbnQiIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIi8+Ci0KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJ1biI+Ci0KLSAgICAgICAgICAgIDx3c2Rsc29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+Ci0KLSAgICAgICAgICAgIDx3c2RsOmlucHV0IG5hbWU9InJ1blJlcXVlc3QiPgotCi0gICAgICAgICAgICAgICAgPHdzZGxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLQotICAgICAgICAgICAgPHdzZGw6b3V0cHV0IG5hbWU9InJ1blJlc3BvbnNlIj4KLQotICAgICAgICAgICAgICAgIDx3c2Rsc29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotCi0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotCi0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0KLSAgICA8L3dzZGw6YmluZGluZz4KLTwvd3NkbDpkZWZpbml0aW9ucz4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3NvYXAvZW10eUJvZHltZXNzYWdlLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3NvYXAvZW10eUJvZHltZXNzYWdlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTViMTBjZC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9zb2FwL2VtdHlCb2R5bWVzc2FnZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzb2FwZW52OkVudmVsb3BlIHhtbG5zOnNvYXBlbnY9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIgotICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4bWxuczp3c2E9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDMvYWRkcmVzc2luZyI+Ci0gICAgPHNvYXBlbnY6SGVhZGVyPgotICAgICAgICA8d3NhOk1lc3NhZ2VJRCBzb2FwZW52Om11c3RVbmRlcnN0YW5kPSIwIj4KLSAgICAgICAgICAgIHV1aWQ6OTIwQzUxOTAtMEI4Ri0xMUQ5LThDRUQtRjIyRURFRUJGN0U1PC93c2E6TWVzc2FnZUlEPgotICAgICAgICA8d3NhOlRvIHNvYXBlbnY6bXVzdFVuZGVyc3RhbmQ9IjAiPgotICAgICAgICAgICAgaHR0cDovL2xvY2FsaG9zdDo4MDgxL2F4aXMvc2VydmljZXMvQmFua1BvcnQ8L3dzYTpUbz4KLSAgICAgICAgPHdzYTpGcm9tIHNvYXBlbnY6bXVzdFVuZGVyc3RhbmQ9IjAiPgotICAgICAgICAgICAgPEFkZHJlc3MgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDMvYWRkcmVzc2luZyI+Ci0gICAgICAgICAgICAgICAgaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wMy9hZGRyZXNzaW5nL3JvbGUvYW5vbnltb3VzCi0gICAgICAgICAgICA8L0FkZHJlc3M+Ci0gICAgICAgIDwvd3NhOkZyb20+Ci0gICAgPC9zb2FwZW52OkhlYWRlcj4KLSAgICA8c29hcGVudjpCb2R5PgotICAgIDwvc29hcGVudjpCb2R5PgotPC9zb2FwZW52OkVudmVsb3BlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3NvYXAvbWluaW1hbE1lc3NhZ2UueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvc29hcC9taW5pbWFsTWVzc2FnZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkZDQ5YWQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvc29hcC9taW5pbWFsTWVzc2FnZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnID8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGVudjpFbnZlbG9wZSB4bWxuczplbnY9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIj4KLSAgICA8ZW52OkJvZHkvPgotPC9lbnY6RW52ZWxvcGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvc29hcC9yZWFsbHlSZWFsbHlCaWdNZXNzYWdlLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3NvYXAvcmVhbGx5UmVhbGx5QmlnTWVzc2FnZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiMGY2NTUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvc29hcC9yZWFsbHlSZWFsbHlCaWdNZXNzYWdlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1NDkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyA/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+Ci08L2VudjpFbnZlbG9wZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9zb2FwL3NhbXBsZTEudHh0IGIvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvc29hcC9zYW1wbGUxLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTVmNzU2MC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9zb2FwL3NhbXBsZTEudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotUE9TVCAvYXhpcy9zZXJ2aWNlcy9FY2hvU2VydmljZSBIVFRQLzEuMQotSG9zdDogMTI3LjAuMC4xCi1Db250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3NvYXAreG1sOyBjaGFyc2V0PSJ1dGYtOCIKLQotPD94bWwgdmVyc2lvbj0nMS4wJyA/PgotPGVudjpFbnZlbG9wZSB4bWxuczplbnY9Imh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZSI+IAotIDxlbnY6SGVhZGVyPgotIDwvZW52OkhlYWRlcj4KLSA8ZW52OkJvZHk+Ci0JPGF4aXMyOmVjaG9Wb2lkIHhtbG5zOmF4aXMyPSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMiIgPjwvYXhpczI6ZWNob1ZvaWQ+Ci0gPC9lbnY6Qm9keT4KLTwvZW52OkVudmVsb3BlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3NvYXAvc2FtcGxlMS54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9zb2FwL3NhbXBsZTEueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWI2YTc5Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3NvYXAvc2FtcGxlMS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnID8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGVudjpFbnZlbG9wZSB4bWxuczplbnY9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIj4KLSAgICA8ZW52OkhlYWRlcj4KLSAgICA8L2VudjpIZWFkZXI+Ci0gICAgPGVudjpCb2R5PgotICAgICAgICA8YXhpczI6ZWNob1ZvaWQgeG1sbnM6YXhpczI9Imh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyIj4KLSAgICAgICAgPC9heGlzMjplY2hvVm9pZD4KLSAgICA8L2VudjpCb2R5PgotPC9lbnY6RW52ZWxvcGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvc29hcC9zZWN1cml0eTItc29hcC54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9zb2FwL3NlY3VyaXR5Mi1zb2FwLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTczNTc3My4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9zb2FwL3NlY3VyaXR5Mi1zb2FwLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPFM6RW52ZWxvcGUgeG1sbnM6Uz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iCi0gICAgeG1sbnM6ZHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiCi0gICAgeG1sbnM6d3NzZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwMi8wNC9zZWNleHQiCi0gICAgeG1sbnM6eGVuYz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS8wNC94bWxlbmMjIj4KLSAgICA8UzpIZWFkZXI+Ci0gICAgICAgIDxtOnBhdGggeG1sbnM6bT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvcnAiPgotICAgICAgICAgICAgPG06YWN0aW9uPmh0dHA6Ly9mYWJyaWthbTEyMy5jb20vZ2V0UXVvdGU8L206YWN0aW9uPgotICAgICAgICAgICAgPG06dG8+aHR0cDovL2ZhYnJpa2FtMTIzLmNvbS9zdG9ja3M8L206dG8+Ci0gICAgICAgICAgICA8bTpmcm9tPm1haWx0bzpqb2huc21pdGhAZmFicmlrYW0xMjMuY29tPC9tOmZyb20+Ci0gICAgICAgICAgICA8bTppZD51dWlkOjg0YjlmNWQwLTMzZmItNGE4MS1iMDJiLTViNzYwNjQxYzFkNjwvbTppZD4KLSAgICAgICAgPC9tOnBhdGg+Ci0gICAgICAgIDx3c3NlOlNlY3VyaXR5PgotICAgICAgICAgICAgPHdzc2U6QmluYXJ5U2VjdXJpdHlUb2tlbgotICAgICAgICAgICAgICAgIFZhbHVlVHlwZT0id3NzZTpYNTA5djMiCi0gICAgICAgICAgICAgICAgRW5jb2RpbmdUeXBlPSJ3c3NlOkJhc2U2NEJpbmFyeSIKLSAgICAgICAgICAgICAgICBJZD0iWDUwOVRva2VuIj4KLSAgICAgICAgICAgICAgICBNSUlFWnpDQ0E5Q2dBd0lCQWdJUUVtdEpaYzBycXJLaDVpLi4uCi0gICAgICAgICAgICA8L3dzc2U6QmluYXJ5U2VjdXJpdHlUb2tlbj4KLSAgICAgICAgICAgIDxkczpTaWduYXR1cmU+Ci0gICAgICAgICAgICAgICAgPGRzOlNpZ25lZEluZm8+Ci0gICAgICAgICAgICAgICAgICAgIDxkczpDYW5vbmljYWxpemF0aW9uTWV0aG9kIEFsZ29yaXRobT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvMTAveG1sLWV4Yy1jMTRuIyIvPgotICAgICAgICAgICAgICAgICAgICA8ZHM6U2lnbmF0dXJlTWV0aG9kIEFsZ29yaXRobT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI3JzYS1zaGExIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxkczpSZWZlcmVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZHM6VHJhbnNmb3Jtcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHM6VHJhbnNmb3JtIEFsZ29yaXRobT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vLi4uI1JvdXRpbmdUcmFuc2Zvcm0iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHM6VHJhbnNmb3JtIEFsZ29yaXRobT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzEwL3htbC1leGMtYzE0biMiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZHM6VHJhbnNmb3Jtcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxkczpEaWdlc3RNZXRob2QgQWxnb3JpdGhtPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI3NoYTEiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxkczpEaWdlc3RWYWx1ZT5FVUxkZHl0U28xLi4uPC9kczpEaWdlc3RWYWx1ZT4KLSAgICAgICAgICAgICAgICAgICAgPC9kczpSZWZlcmVuY2U+Ci0gICAgICAgICAgICAgICAgPC9kczpTaWduZWRJbmZvPgotICAgICAgICAgICAgICAgIDxkczpTaWduYXR1cmVWYWx1ZT4KLSAgICAgICAgICAgICAgICAgICAgQkw4amRmVG9FYjFsL3ZYY01aTk5qUE9WLi4uCi0gICAgICAgICAgICAgICAgPC9kczpTaWduYXR1cmVWYWx1ZT4KLSAgICAgICAgICAgICAgICA8ZHM6S2V5SW5mbz4KLSAgICAgICAgICAgICAgICAgICAgPHdzc2U6U2VjdXJpdHlUb2tlblJlZmVyZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx3c3NlOlJlZmVyZW5jZSBVUkk9IiNYNTA5VG9rZW4iLz4KLSAgICAgICAgICAgICAgICAgICAgPC93c3NlOlNlY3VyaXR5VG9rZW5SZWZlcmVuY2U+Ci0gICAgICAgICAgICAgICAgPC9kczpLZXlJbmZvPgotICAgICAgICAgICAgPC9kczpTaWduYXR1cmU+Ci0gICAgICAgIDwvd3NzZTpTZWN1cml0eT4KLSAgICA8L1M6SGVhZGVyPgotICAgIDxTOkJvZHk+Ci0gICAgICAgIDx0cnU6U3RvY2tTeW1ib2wgeG1sbnM6dHJ1PSJodHRwOi8vZmFicmlrYW0xMjMuY29tL3BheWxvYWRzIj4KLSAgICAgICAgICAgIFFRUQotICAgICAgICA8L3RydTpTdG9ja1N5bWJvbD4KLSAgICA8L1M6Qm9keT4KLTwvUzpFbnZlbG9wZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9zb2FwL3NvYXBtZXNzYWdlLnR4dCBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3NvYXAvc29hcG1lc3NhZ2UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NGU2MTM5Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3NvYXAvc29hcG1lc3NhZ2UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotUE9TVCAvYXhpcy9zZXJ2aWNlcy9FY2hvU2VydmljZSBIVFRQLzEuMQ0KLUhvc3Q6IDEyNy4wLjAuMQ0KLUNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vc29hcCt4bWw7IGNoYXJzZXQ9InV0Zi04Ig0KLUNvbm5lY3Rpb246IGNsb3NlDQotDQotPHNvYXBlbnY6RW52ZWxvcGUgeG1sbnM6c29hcGVudj0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOndzYT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wMy9hZGRyZXNzaW5nIj4NCi0gICAgPHNvYXBlbnY6SGVhZGVyPg0KLSAgICAgICAgPHdzYTpNZXNzYWdlSUQgc29hcGVudjptdXN0VW5kZXJzdGFuZD0iMCI+dXVpZDo5MjBDNTE5MC0wQjhGLTExRDktOENFRC1GMjJFREVFQkY3RTU8L3dzYTpNZXNzYWdlSUQ+DQotICAgICAgICA8d3NhOlRvIHNvYXBlbnY6bXVzdFVuZGVyc3RhbmQ9IjAiPmh0dHA6Ly9sb2NhbGhvc3Q6ODA4MS9heGlzL3NlcnZpY2VzL0JhbmtQb3J0PC93c2E6VG8+DQotICAgICAgICA8d3NhOkZyb20gc29hcGVudjptdXN0VW5kZXJzdGFuZD0iMCI+DQotICAgICAgICAgICAgPEFkZHJlc3MgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDMvYWRkcmVzc2luZyI+aHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wMy9hZGRyZXNzaW5nL3JvbGUvYW5vbnltb3VzPC9BZGRyZXNzPg0KLSAgICAgICAgPC93c2E6RnJvbT4NCi0gICAgPC9zb2FwZW52OkhlYWRlcj4NCi0gICAgPHNvYXBlbnY6Qm9keT4NCi0gICAgICAgIDxheGlzMjplY2hvVm9pZCB4bWxuczpheGlzMj0iaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIiID48L2F4aXMyOmVjaG9Wb2lkPg0KLSAgICA8L3NvYXBlbnY6Qm9keT4NCi08L3NvYXBlbnY6RW52ZWxvcGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvc29hcC9zb2FwbWVzc2FnZS54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9zb2FwL3NvYXBtZXNzYWdlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU4NGFkNC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9zb2FwL3NvYXBtZXNzYWdlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHNvYXBlbnY6RW52ZWxvcGUgeG1sbnM6c29hcGVudj0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iCi0gICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhtbG5zOndzYT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wMy9hZGRyZXNzaW5nIj4KLSAgICA8c29hcGVudjpIZWFkZXI+Ci0gICAgICAgIDx3c2E6TWVzc2FnZUlEIHNvYXBlbnY6bXVzdFVuZGVyc3RhbmQ9IjAiPgotICAgICAgICAgICAgdXVpZDo5MjBDNTE5MC0wQjhGLTExRDktOENFRC1GMjJFREVFQkY3RTU8L3dzYTpNZXNzYWdlSUQ+Ci0gICAgICAgIDx3c2E6VG8gc29hcGVudjptdXN0VW5kZXJzdGFuZD0iMCI+Ci0gICAgICAgICAgICBodHRwOi8vbG9jYWxob3N0OjgwODEvYXhpcy9zZXJ2aWNlcy9CYW5rUG9ydDwvd3NhOlRvPgotICAgICAgICA8d3NhOkZyb20gc29hcGVudjptdXN0VW5kZXJzdGFuZD0iMCI+Ci0gICAgICAgICAgICA8QWRkcmVzcyB4bWxucz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wMy9hZGRyZXNzaW5nIj4KLSAgICAgICAgICAgICAgICBodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzAzL2FkZHJlc3Npbmcvcm9sZS9hbm9ueW1vdXMKLSAgICAgICAgICAgIDwvQWRkcmVzcz4KLSAgICAgICAgPC93c2E6RnJvbT4KLSAgICA8L3NvYXBlbnY6SGVhZGVyPgotICAgIDxzb2FwZW52OkJvZHk+Ci0gICAgICAgIDxheGlzMjplY2hvVm9pZCB4bWxuczpheGlzMj0iaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIiPgotICAgICAgICA8L2F4aXMyOmVjaG9Wb2lkPgotICAgIDwvc29hcGVudjpCb2R5PgotPC9zb2FwZW52OkVudmVsb3BlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3NvYXAvc29hcG1lc3NhZ2UxLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3NvYXAvc29hcG1lc3NhZ2UxLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjkxOTkyNy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9zb2FwL3NvYXBtZXNzYWdlMS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzb2FwZW52OkVudmVsb3BlIHhtbG5zOnNvYXBlbnY9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIgotICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4bWxuczp3c2E9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDMvYWRkcmVzc2luZyI+Ci0gICAgPHNvYXBlbnY6SGVhZGVyPgotICAgICAgICA8d3NhOk1lc3NhZ2VJRCBzb2FwZW52Om11c3RVbmRlcnN0YW5kPSIwIj4KLSAgICAgICAgICAgIHV1aWQ6OTIwQzUxOTAtMEI4Ri0xMUQ5LThDRUQtRjIyRURFRUJGN0U1PC93c2E6TWVzc2FnZUlEPgotICAgICAgICA8d3NhOlRvIHNvYXBlbnY6bXVzdFVuZGVyc3RhbmQ9IjAiPgotICAgICAgICAgICAgaHR0cDovL2xvY2FsaG9zdDo4MDgxL2F4aXMvc2VydmljZXMvQmFua1BvcnQ8L3dzYTpUbz4KLSAgICAgICAgPHdzYTpGcm9tIHNvYXBlbnY6bXVzdFVuZGVyc3RhbmQ9IjAiPgotICAgICAgICAgICAgPEFkZHJlc3MgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDMvYWRkcmVzc2luZyI+Ci0gICAgICAgICAgICAgICAgaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wMy9hZGRyZXNzaW5nL3JvbGUvYW5vbnltb3VzCi0gICAgICAgICAgICA8L0FkZHJlc3M+Ci0gICAgICAgIDwvd3NhOkZyb20+Ci0gICAgPC9zb2FwZW52OkhlYWRlcj4KLSAgICA8c29hcGVudjpCb2R5PgotICAgICAgICA8bnMxOmdldEJhbGFuY2Ugc29hcGVudjplbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIKLSAgICAgICAgICAgIHhtbG5zOm5zMT0iaHR0cDovL2xvY2FsaG9zdDo4MDgxL2F4aXMvc2VydmljZXMvQmFua1BvcnQiPgotICAgICAgICAgICAgPG5zMTphY2NvdW50Tm8gaHJlZj0iI2lkMCIvPgotICAgICAgICA8L25zMTpnZXRCYWxhbmNlPgotICAgICAgICA8bXVsdGlSZWYgeG1sbnM9InRlbXBVcmkiIGlkPSJpZDAiIHNvYXBlbmM6cm9vdD0iMCIKLSAgICAgICAgICAgIHNvYXBlbnY6ZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iCi0gICAgICAgICAgICB4c2k6dHlwZT0ieHNkOmludCIKLSAgICAgICAgICAgIHhtbG5zOnNvYXBlbmM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIj4xMDAxCi0gICAgICAgIDwvbXVsdGlSZWY+Ci0gICAgPC9zb2FwZW52OkJvZHk+Ci08L3NvYXBlbnY6RW52ZWxvcGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvc29hcC93aGl0ZXNwYWNlZE1lc3NhZ2UueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvc29hcC93aGl0ZXNwYWNlZE1lc3NhZ2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjgxMTEwLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3NvYXAvd2hpdGVzcGFjZWRNZXNzYWdlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08ZW52OkVudmVsb3BlIHhtbG5zOmVudj0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iCi0gICAgeG1sbnM6d3NhPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzAzL2FkZHJlc3NpbmciPgotCi0gICAgPGVudjpIZWFkZXI+Ci0KLQotICAgICAgICA8d3NhOk1lc3NhZ2VJRCBlbnY6bXVzdFVuZGVyc3RhbmQ9IjAiPgotICAgICAgICAgICAgdXVpZDo5MjBDNTE5MC0wQjhGLTExRDktOENFRC1GMjJFREVFQkY3RTU8L3dzYTpNZXNzYWdlSUQ+Ci0gICAgICAgIDx3c2E6VG8gZW52Om11c3RVbmRlcnN0YW5kPSIwIj4KLSAgICAgICAgICAgIGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MS9heGlzL3NlcnZpY2VzL0JhbmtQb3J0PC93c2E6VG8+Ci0gICAgICAgIDx3c2E6RnJvbSBlbnY6bXVzdFVuZGVyc3RhbmQ9IjAiPgotICAgICAgICAgICAgPEFkZHJlc3MgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDMvYWRkcmVzc2luZyI+Ci0gICAgICAgICAgICAgICAgaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wMy9hZGRyZXNzaW5nL3JvbGUvYW5vbnltb3VzCi0gICAgICAgICAgICA8L0FkZHJlc3M+Ci0gICAgICAgIDwvd3NhOkZyb20+Ci0KLSAgICA8L2VudjpIZWFkZXI+Ci0gICAgPGVudjpCb2R5PgotCi0KLSAgICAgICAgPGF4aXMyOmVjaG9Wb2lkIHhtbG5zOmF4aXMyPSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMiI+Ci0gICAgICAgIDwvYXhpczI6ZWNob1ZvaWQ+Ci0KLQotICAgIDwvZW52OkJvZHk+Ci08L2VudjpFbnZlbG9wZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9zb2FwbWVzc2FnZS54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9zb2FwbWVzc2FnZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5NzZiMzguLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvc29hcG1lc3NhZ2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08c29hcGVudjpFbnZlbG9wZSB4bWxuczpzb2FwZW52PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyIgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6d3NhPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzAzL2FkZHJlc3NpbmciPgotICAgIDxzb2FwZW52OkhlYWRlcj4KLSAgICAgICAgPHdzYTpNZXNzYWdlSUQgc29hcGVudjptdXN0VW5kZXJzdGFuZD0iMCI+dXVpZDo5MjBDNTE5MC0wQjhGLTExRDktOENFRC1GMjJFREVFQkY3RTU8L3dzYTpNZXNzYWdlSUQ+Ci0gICAgICAgIDx3c2E6VG8gc29hcGVudjptdXN0VW5kZXJzdGFuZD0iMCI+aHR0cDovL2xvY2FsaG9zdDo4MDgxL2F4aXMvc2VydmljZXMvQmFua1BvcnQ8L3dzYTpUbz4KLSAgICAgICAgPHdzYTpGcm9tIHNvYXBlbnY6bXVzdFVuZGVyc3RhbmQ9IjAiPgotICAgICAgICAgICAgPEFkZHJlc3MgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDMvYWRkcmVzc2luZyI+aHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wMy9hZGRyZXNzaW5nL3JvbGUvYW5vbnltb3VzPC9BZGRyZXNzPgotICAgICAgICA8L3dzYTpGcm9tPgotICAgIDwvc29hcGVudjpIZWFkZXI+Ci0gICAgPHNvYXBlbnY6Qm9keT4KLSAgICAgICAgPG5zMTpnZXRCYWxhbmNlIHNvYXBlbnY6ZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iIHhtbG5zOm5zMT0iaHR0cDovL2xvY2FsaG9zdDo4MDgxL2F4aXMvc2VydmljZXMvQmFua1BvcnQiPgotICAgICAgICAgICAgPGFjY291bnRObyBocmVmPSIjaWQwIi8+Ci0gICAgICAgIDwvbnMxOmdldEJhbGFuY2U+Ci0gICAgICAgIDxtdWx0aVJlZiBpZD0iaWQwIiBzb2FwZW5jOnJvb3Q9IjAiIHNvYXBlbnY6ZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iIHhzaTp0eXBlPSJ4c2Q6aW50IiB4bWxuczpzb2FwZW5jPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyI+MTAwMTwvbXVsdGlSZWY+Ci0gICAgPC9zb2FwZW52OkJvZHk+Ci08L3NvYXBlbnY6RW52ZWxvcGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvc3dhL1N3QS1lbmFibGVkLWF4aXMyLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3N3YS9Td0EtZW5hYmxlZC1heGlzMi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNhYmMwMjYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvc3dhL1N3QS1lbmFibGVkLWF4aXMyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+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+Ci0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3N3YS9Td0EtZmlsZUNhY2hlLWVuYWJsZWQtYXhpczIueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvc3dhL1N3QS1maWxlQ2FjaGUtZW5hYmxlZC1heGlzMi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU3ZDdiMDQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvc3dhL1N3QS1maWxlQ2FjaGUtZW5hYmxlZC1heGlzMi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotPCEtLQotICB+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+Ci0gICAgPHBoYXNlT3JkZXIgdHlwZT0iT3V0RmF1bHRGbG93Ij4KLSAgICAgICAgPCEtLSAgICAgIHVzZXIgY2FuIGFkZCBoaXMgb3duIHBoYXNlcyB0byB0aGlzIGFyZWEgIC0tPgotICAgICAgICA8cGhhc2UgbmFtZT0idXNlcnBoYXNlMSIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iUG9saWN5RGV0ZXJtaW5hdGlvbiIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iTWVzc2FnZU91dCIvPgotICAgIDwvcGhhc2VPcmRlcj4KLTwvYXhpc2NvbmZpZz4KLQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvc3dhL3N3YWlucHV0LmJpbiBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3N3YS9zd2FpbnB1dC5iaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDgzNTc3OTYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvc3dhL3N3YWlucHV0LmJpbgorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLVBPU1QgL2F4aXMyL3NlcnZpY2VzL0VjaG9Td0FTZXJ2aWNlL2VjaG9BdHRhY2htZW50IEhUVFAvMS4wDQotQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvcmVsYXRlZDsgdHlwZT0idGV4dC94bWwiOyBzdGFydD0iPDlENjQ1QzhFQkI4MzdDRTU0QUJEMDI3QTM2NTk1MzVEPiI7IAlib3VuZGFyeT0iLS0tLT1fUGFydF8wXzE5Nzc1MTEuMTEyMzE2MzU3MTEzOCINCi1BY2NlcHQ6IGFwcGxpY2F0aW9uL3NvYXAreG1sLCBhcHBsaWNhdGlvbi9kaW1lLCBtdWx0aXBhcnQvcmVsYXRlZCwgdGV4dC8qDQotVXNlci1BZ2VudDogQXhpcy8xLjIuMQ0KLUhvc3Q6IDEyNy4wLjAuMTo4MDgxDQotQ2FjaGUtQ29udHJvbDogbm8tY2FjaGUNCi1QcmFnbWE6IG5vLWNhY2hlDQotQ29ubmVjdGlvbjogY2xvc2UNCi1TT0FQQWN0aW9uOiAiIg0KLQ0KLQ0KLS0tLS0tLT1fUGFydF8wXzE5Nzc1MTEuMTEyMzE2MzU3MTEzOA0KLUNvbnRlbnQtVHlwZTogdGV4dC94bWw7IGNoYXJzZXQ9VVRGLTgNCi1Db250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBiaW5hcnkNCi1Db250ZW50LUlkOiA8OUQ2NDVDOEVCQjgzN0NFNTRBQkQwMjdBMzY1OTUzNUQ+DQotDQotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c29hcGVudjpFbnZlbG9wZSB4bWxuczpzb2FwZW52PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyIgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI+PHNvYXBlbnY6Qm9keT48ZWNob0F0dGFjaG1lbnQgeG1sbnM9IiI+PHNvdXJjZSBocmVmPSJjaWQ6MzkzNkFFMTlGQkVENTVBRTQ2MjBCODFDNzNCREQ3NkUiIHhtbG5zPSIiLz48L2VjaG9BdHRhY2htZW50Pjwvc29hcGVudjpCb2R5Pjwvc29hcGVudjpFbnZlbG9wZT4NCi0tLS0tLS09X1BhcnRfMF8xOTc3NTExLjExMjMxNjM1NzExMzgNCi1Db250ZW50LVR5cGU6IHRleHQvcGxhaW4NCi1Db250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBiaW5hcnkNCi1Db250ZW50LUlkOiA8MzkzNkFFMTlGQkVENTVBRTQ2MjBCODFDNzNCREQ3NkU+DQotDQotQXBhY2hlIEF4aXMyIC0gVGhlIE5FeHQgR2VuZXJhdGlvbiBXZWIgU2VydmljZXMgRW5naW5lDQotDQotLS0tLS0tPV9QYXJ0XzBfMTk3NzUxMS4xMTIzMTYzNTcxMTM4LS0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9zd2EvdGVzdC5qcGcgYi92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9zd2EvdGVzdC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU5YzEwY2EuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvc3dhL3Rlc3QuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9Eb2N1bWVudFVud3JhcHBpbmdUZXN0LndzZGwgYi92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy93c2RsL0RvY3VtZW50VW53cmFwcGluZ1Rlc3Qud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWI5YmVhZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy93c2RsL0RvY3VtZW50VW53cmFwcGluZ1Rlc3Qud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDM2NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/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+Ci0gICAgICAgIDwvd3NkbDpwb3J0PgotICAgIDwvd3NkbDpzZXJ2aWNlPgotPC93c2RsOmRlZmluaXRpb25zPgotCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy93c2RsL1JQQ1Vud3JhcHBpbmdUZXN0LndzZGwgYi92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy93c2RsL1JQQ1Vud3JhcHBpbmdUZXN0LndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwZWMzMGQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9SUENVbndyYXBwaW5nVGVzdC53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLTw/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+Ci0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3dzZGwvUm9idXN0SW5Pbmx5U2VydmljZVRlc3Qud3NkbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3dzZGwvUm9idXN0SW5Pbmx5U2VydmljZVRlc3Qud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhiMzVhYi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy93c2RsL1JvYnVzdEluT25seVNlcnZpY2VUZXN0LndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTx3c2RsOmRlZmluaXRpb25zIG5hbWU9IndzZGxhZG1pbnRlc3QiCi0gICAgICAgICAgICAgICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cuZXhhbXBsZS5vcmcvd3NkbHRlc3QvIgotICAgICAgICAgICAgICAgICAgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIKLSAgICAgICAgICAgICAgICAgIHhtbG5zOnRucz0iaHR0cDovL3d3dy5leGFtcGxlLm9yZy93c2RsdGVzdC8iCi0gICAgICAgICAgICAgICAgICB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIKLSAgICAgICAgICAgICAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPgotICAgIDx3c2RsOnR5cGVzPgotICAgICAgICA8eHNkOnNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cuZXhhbXBsZS5vcmcvd3NkbHRlc3QvIgotICAgICAgICAgICAgICAgICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICAgICAgICAgICAgICB4bWxuczpwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIj4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJSZXF1ZXN0Ij4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImluIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJSZXNwb25zZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvdXQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkZhdWx0Ij4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZhdWx0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2NoZW1hPgotICAgIDwvd3NkbDp0eXBlcz4KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9Ik9wZXJhdGlvblJlcXVlc3RNZXNzYWdlIj4KLSAgICAgICAgPHdzZGw6cGFydCBlbGVtZW50PSJ0bnM6UmVxdWVzdCIgbmFtZT0icGFyYW1ldGVycyIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0iT3BlcmF0aW9uUmVzcG9uc2VNZXNzYWdlIj4KLSAgICAgICAgPHdzZGw6cGFydCBlbGVtZW50PSJ0bnM6UmVzcG9uc2UiIG5hbWU9InBhcmFtZXRlcnMiLz4KLSAgICA8L3dzZGw6bWVzc2FnZT4KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9IkZhdWx0TWVzc2FnZSI+Ci0gICAgICAgIDx3c2RsOnBhcnQgZWxlbWVudD0idG5zOkZhdWx0IiBuYW1lPSJwYXJhbWV0ZXJzIi8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0KLSAgICA8d3NkbDpwb3J0VHlwZSBuYW1lPSJ3c2RsdGVzdCI+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJPcGVyYXRpb24iPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQgbWVzc2FnZT0idG5zOk9wZXJhdGlvblJlcXVlc3RNZXNzYWdlIi8+Ci0gICAgICAgICAgICA8d3NkbDpmYXVsdCBuYW1lPSJDb25uZWN0aW9uRmFpbHVyZSIgbWVzc2FnZT0idG5zOkZhdWx0TWVzc2FnZSIvPgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgIDwvd3NkbDpwb3J0VHlwZT4KLSAgICA8d3NkbDpiaW5kaW5nIG5hbWU9IndzZGx0ZXN0U09BUCIgdHlwZT0idG5zOndzZGx0ZXN0Ij4KLSAgICAgICAgPHNvYXA6YmluZGluZyBzdHlsZT0iZG9jdW1lbnQiICB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIvPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iT3BlcmF0aW9uIj4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiAgc29hcEFjdGlvbj0iaHR0cDovL3d3dy5leGFtcGxlLm9yZy93c2RsdGVzdC9OZXdPcGVyYXRpb24iLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6ZmF1bHQgbmFtZT0iQ29ubmVjdGlvbkZhaWx1cmUiPgotICAgICAgICAgICAgICAgIDxzb2FwOmZhdWx0IHVzZT0ibGl0ZXJhbCIgbmFtZT0iQ29ubmVjdGlvbkZhaWx1cmUiLz4KLSAgICAgICAgICAgIDwvd3NkbDpmYXVsdD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICA8L3dzZGw6YmluZGluZz4KLSAgICA8d3NkbDpzZXJ2aWNlIG5hbWU9IndzZGx0ZXN0Ij4KLSAgICAgICAgPHdzZGw6cG9ydCBiaW5kaW5nPSJ0bnM6d3NkbHRlc3RTT0FQIiBuYW1lPSJ3c2RsdGVzdFNPQVAiPgotICAgICAgICAgICAgPHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL3d3dy5leGFtcGxlLm9yZy8iLz4KLSAgICAgICAgPC93c2RsOnBvcnQ+Ci0gICAgPC93c2RsOnNlcnZpY2U+Ci08L3dzZGw6ZGVmaW5pdGlvbnM+Ci0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3dzZGwvVmVyc2lvbi53c2RsIGIvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9WZXJzaW9uLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5ZjE4ZWUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9WZXJzaW9uLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotPCEtLQotICB+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+Ci0gICAgICAgIDwvd3NkbDpwb3J0PgotICAgIDwvd3NkbDpzZXJ2aWNlPgotPC93c2RsOmRlZmluaXRpb25zPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3dzZGwyMC9HcmVhdEgud3NkbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3dzZGwyMC9HcmVhdEgud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQwNDcxNy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy93c2RsMjAvR3JlYXRILndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxkZXNjcmlwdGlvbiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwNS8wNS93c2RsIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9ncmVhdGguZXhhbXBsZS5jb20vMjAwNC93c2RsL3Jlc1N2YyIgeG1sbnM6dG5zPSJodHRwOi8vZ3JlYXRoLmV4YW1wbGUuY29tLzIwMDQvd3NkbC9yZXNTdmMiIHhtbG5zOmdobnM9Imh0dHA6Ly9ncmVhdGguZXhhbXBsZS5jb20vMjAwNC9zY2hlbWFzL3Jlc1N2YyIgeG1sbnM6d3NvYXA9Imh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDUvd3NkbC9zb2FwIiB4bWxuczpzb2FwPSJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUiPgotICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICBUaGlzIGRvY3VtZW50IGRlc2NyaWJlcyB0aGUgR3JlYXRIIFdlYiBzZXJ2aWNlLiBBZGRpdGlvbmFsCi0gICAgICAgIGFwcGxpY2F0aW9uLWxldmVsIHJlcXVpcmVtZW50cyBmb3IgdXNlIG9mIHRoaXMgc2VydmljZSAtLQotICAgICAgICBiZXlvbmQgd2hhdCBXU0RMIDIuMCBpcyBhYmxlIHRvIGRlc2NyaWJlIC0tIGFyZSBhdmFpbGFibGUKLSAgICAgICAgYXQgaHR0cDovL2dyZWF0aC5leGFtcGxlLmNvbS8yMDA0L3Jlc2VydmF0aW9uLWRvY3VtZW50YXRpb24uaHRtbAotICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICA8dHlwZXM+Ci0gICAgICAgIDx4czpzY2hlbWEKLSAgICAgICAgICAgICAgICB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vZ3JlYXRoLmV4YW1wbGUuY29tLzIwMDQvc2NoZW1hcy9yZXNTdmMiCi0gICAgICAgICAgICAgICAgeG1sbnM9Imh0dHA6Ly9ncmVhdGguZXhhbXBsZS5jb20vMjAwNC9zY2hlbWFzL3Jlc1N2YyI+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJjaGVja0F2YWlsYWJpbGl0eSIgdHlwZT0idENoZWNrQXZhaWxhYmlsaXR5Ii8+Ci0gICAgICAgICAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0idENoZWNrQXZhaWxhYmlsaXR5Ij4KLSAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9ImNoZWNrSW5EYXRlIiB0eXBlPSJ4czpkYXRlIi8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9ImNoZWNrT3V0RGF0ZSIgdHlwZT0ieHM6ZGF0ZSIvPgotICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJyb29tVHlwZSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJjaGVja0F2YWlsYWJpbGl0eVJlc3BvbnNlIiB0eXBlPSJ4czpkb3VibGUiLz4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9ImludmFsaWREYXRhRXJyb3IiIHR5cGU9InhzOnN0cmluZyIvPgotICAgICAgICA8L3hzOnNjaGVtYT4KLSAgICA8L3R5cGVzPgotICAgIDxpbnRlcmZhY2UgbmFtZT0icmVzZXJ2YXRpb25JbnRlcmZhY2UiPgotICAgICAgICA8ZmF1bHQgbmFtZT0iaW52YWxpZERhdGFGYXVsdCIKLSAgICAgICAgICAgICAgIGVsZW1lbnQ9ImdobnM6aW52YWxpZERhdGFFcnJvciIvPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9Im9wQ2hlY2tBdmFpbGFiaWxpdHkiCi0gICAgICAgICAgICAgICAgICAgcGF0dGVybj0iaHR0cDovL3d3dy53My5vcmcvMjAwNS8wNS93c2RsL2luLW91dCIKLSAgICAgICAgICAgICAgICAgICBzdHlsZT0iaHR0cDovL3d3dy53My5vcmcvMjAwNS8wNS93c2RsL3N0eWxlL3VyaSIKLSAgICAgICAgICAgICAgICAgICBzYWZlPSJ0cnVlIj4KLSAgICAgICAgICAgIDxpbnB1dCBtZXNzYWdlTGFiZWw9IkluIgotICAgICAgICAgICAgICAgICAgIGVsZW1lbnQ9ImdobnM6Y2hlY2tBdmFpbGFiaWxpdHkiLz4KLSAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZUxhYmVsPSJPdXQiCi0gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQ9ImdobnM6Y2hlY2tBdmFpbGFiaWxpdHlSZXNwb25zZSIvPgotICAgICAgICAgICAgPG91dGZhdWx0IHJlZj0idG5zOmludmFsaWREYXRhRmF1bHQiIG1lc3NhZ2VMYWJlbD0iT3V0Ii8+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotICAgIDwvaW50ZXJmYWNlPgotICAgIDxiaW5kaW5nIG5hbWU9InJlc2VydmF0aW9uU09BUEJpbmRpbmciCi0gICAgICAgICAgICAgaW50ZXJmYWNlPSJ0bnM6cmVzZXJ2YXRpb25JbnRlcmZhY2UiCi0gICAgICAgICAgICAgdHlwZT0iaHR0cDovL3d3dy53My5vcmcvMjAwNS8wNS93c2RsL3NvYXAiCi0gICAgICAgICAgICAgd3NvYXA6cHJvdG9jb2w9Imh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC9iaW5kaW5ncy9IVFRQIj4KLSAgICAgICAgPGZhdWx0IHJlZj0idG5zOmludmFsaWREYXRhRmF1bHQiCi0gICAgICAgICAgICAgICB3c29hcDpjb2RlPSJzb2FwOlNlbmRlciIvPgotICAgICAgICA8b3BlcmF0aW9uIHJlZj0idG5zOm9wQ2hlY2tBdmFpbGFiaWxpdHkiCi0gICAgICAgICAgICAgICAgICAgd3NvYXA6bWVwPSJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAvbWVwL3NvYXAtcmVzcG9uc2UiLz4KLSAgICA8L2JpbmRpbmc+Ci0gICAgPHNlcnZpY2UgbmFtZT0icmVzZXJ2YXRpb25TZXJ2aWNlIgotICAgICAgICAgICAgIGludGVyZmFjZT0idG5zOnJlc2VydmF0aW9uSW50ZXJmYWNlIj4KLSAgICAgICAgPGVuZHBvaW50IG5hbWU9InJlc2VydmF0aW9uRW5kcG9pbnQiCi0gICAgICAgICAgICAgICAgICBiaW5kaW5nPSJ0bnM6cmVzZXJ2YXRpb25TT0FQQmluZGluZyIKLSAgICAgICAgICAgICAgICAgIGFkZHJlc3M9Imh0dHA6Ly9ncmVhdGguZXhhbXBsZS5jb20vMjAwNC9yZXNlcnZhdGlvbiIvPgotICAgIDwvc2VydmljZT4KLTwvZGVzY3JpcHRpb24+Ci0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3dzZGwyMC9Ib3RlbFJlc2VydmF0aW9uU2VydmljZS53c2RsIGIvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbDIwL0hvdGVsUmVzZXJ2YXRpb25TZXJ2aWNlLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmMWY5OGUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbDIwL0hvdGVsUmVzZXJ2YXRpb25TZXJ2aWNlLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCIgPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08ZGVzY3JpcHRpb24KLSAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwNi8wMS93c2RsIgotICAgIHRhcmdldE5hbWVzcGFjZT0gImh0dHA6Ly9ncmVhdGguZXhhbXBsZS5jb20vMjAwNC93c2RsL3Jlc1N2YyIKLSAgICB4bWxuczp0bnM9ICJodHRwOi8vZ3JlYXRoLmV4YW1wbGUuY29tLzIwMDQvd3NkbC9yZXNTdmMiCi0gICAgeG1sbnM6Z2hucyA9ICJodHRwOi8vZ3JlYXRoLmV4YW1wbGUuY29tLzIwMDQvc2NoZW1hcy9yZXNTdmMiCi0gICAgeG1sbnM6d3NvYXA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDA2LzAxL3dzZGwvc29hcCIKLSAgICB4bWxuczpzb2FwPSJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUiPgotCi0gIDxkb2N1bWVudGF0aW9uPgotICAgIFRoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIHRoZSBHcmVhdEggV2ViIHNlcnZpY2UuICBBZGRpdGlvbmFsCi0gICAgYXBwbGljYXRpb24tbGV2ZWwgcmVxdWlyZW1lbnRzIGZvciB1c2Ugb2YgdGhpcyBzZXJ2aWNlIC0tCi0gICAgYmV5b25kIHdoYXQgV1NETCAyLjAgaXMgYWJsZSB0byBkZXNjcmliZSAtLSBhcmUgYXZhaWxhYmxlCi0gICAgYXQgaHR0cDovL2dyZWF0aC5leGFtcGxlLmNvbS8yMDA0L3Jlc2VydmF0aW9uLWRvY3VtZW50YXRpb24uaHRtbAotICA8L2RvY3VtZW50YXRpb24+Ci0KLSAgPHR5cGVzPgotICAgIDx4czpzY2hlbWEKLSAgICAgICAgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9ncmVhdGguZXhhbXBsZS5jb20vMjAwNC9zY2hlbWFzL3Jlc1N2YyIKLSAgICAgICAgeG1sbnM9Imh0dHA6Ly9ncmVhdGguZXhhbXBsZS5jb20vMjAwNC9zY2hlbWFzL3Jlc1N2YyI+Ci0KLSAgICAgIDx4czplbGVtZW50IG5hbWU9ImNoZWNrQXZhaWxhYmlsaXR5IiB0eXBlPSJ0Q2hlY2tBdmFpbGFiaWxpdHkiLz4KLSAgICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJ0Q2hlY2tBdmFpbGFiaWxpdHkiPgotICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzOmVsZW1lbnQgIG5hbWU9ImNoZWNrSW5EYXRlIiB0eXBlPSJ4czpkYXRlIi8+Ci0gICAgICAgICAgPHhzOmVsZW1lbnQgIG5hbWU9ImNoZWNrT3V0RGF0ZSIgdHlwZT0ieHM6ZGF0ZSIvPgotICAgICAgICAgIDx4czplbGVtZW50ICBuYW1lPSJyb29tVHlwZSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0gICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJjaGVja0F2YWlsYWJpbGl0eVJlc3BvbnNlIiB0eXBlPSJ4czpkb3VibGUiLz4KLQotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iaW52YWxpZERhdGFFcnJvciIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0KLSAgICA8L3hzOnNjaGVtYT4KLSAgPC90eXBlcz4KLQotICA8aW50ZXJmYWNlICBuYW1lID0gInJlc2VydmF0aW9uSW50ZXJmYWNlIiA+Ci0KLSAgICA8ZmF1bHQgbmFtZSA9ICJpbnZhbGlkRGF0YUZhdWx0IgotICAgICAgICAgICAgZWxlbWVudCA9ICJnaG5zOmludmFsaWREYXRhRXJyb3IiLz4KLQotICAgIDxvcGVyYXRpb24gbmFtZT0ib3BDaGVja0F2YWlsYWJpbGl0eSIKLSAgICAgICAgICAgIHBhdHRlcm49Imh0dHA6Ly93d3cudzMub3JnLzIwMDYvMDEvd3NkbC9pbi1vdXQiID4KLSAgICAgICAgPGlucHV0IG1lc3NhZ2VMYWJlbD0iSW4iCi0gICAgICAgICAgICAgIGVsZW1lbnQ9ImdobnM6Y2hlY2tBdmFpbGFiaWxpdHkiIC8+Ci0gICAgICAgIDxvdXRwdXQgbWVzc2FnZUxhYmVsPSJPdXQiCi0gICAgICAgICAgICAgIGVsZW1lbnQ9ImdobnM6Y2hlY2tBdmFpbGFiaWxpdHlSZXNwb25zZSIgLz4KLSAgICAgICAgPG91dGZhdWx0IHJlZj0idG5zOmludmFsaWREYXRhRmF1bHQiIG1lc3NhZ2VMYWJlbD0iT3V0Ii8+Ci0gICAgPC9vcGVyYXRpb24+Ci0KLSAgPC9pbnRlcmZhY2U+Ci0KLSAgPGJpbmRpbmcgbmFtZT0icmVzZXJ2YXRpb25TT0FQQmluZGluZyIKLQkgIGludGVyZmFjZT0idG5zOnJlc2VydmF0aW9uSW50ZXJmYWNlIgotCSAgdHlwZT0iaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC93c2RsL3NvYXAxMiIKLQkgIHdzb2FwOnByb3RvY29sPSJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAvYmluZGluZ3MvSFRUUCI+Ci0KLSAgICA8b3BlcmF0aW9uIHJlZj0idG5zOm9wQ2hlY2tBdmFpbGFiaWxpdHkiCi0gICAgICB3c29hcDptZXA9Imh0dHA6Ly93d3cudzMub3JnLzIwMDYvMDEvd3NkbC9pbi1vdXQiLz4KLQotICAgIDxmYXVsdCByZWY9InRuczppbnZhbGlkRGF0YUZhdWx0IgotICAgICAgd3NvYXA6Y29kZT0ic29hcDpTZW5kZXIiLz4KLQotICA8L2JpbmRpbmc+Ci0KLSAgPHNlcnZpY2UgbmFtZT0icmVzZXJ2YXRpb25TZXJ2aWNlIgotICAgICAgIGludGVyZmFjZT0idG5zOnJlc2VydmF0aW9uSW50ZXJmYWNlIj4KLQotICAgICA8ZW5kcG9pbnQgbmFtZT0icmVzZXJ2YXRpb25FbmRwb2ludCIKLSAgICAgICAgICAgICAgIGJpbmRpbmc9InRuczpyZXNlcnZhdGlvblNPQVBCaW5kaW5nIgotICAgICAgICAgICAgICAgYWRkcmVzcyA9Imh0dHA6Ly9ncmVhdGguZXhhbXBsZS5jb20vMjAwNC9yZXNlcnZhdGlvbiIvPgotCi0gIDwvc2VydmljZT4KLQotPC9kZXNjcmlwdGlvbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy94c2QvdHlwZS10ZXN0LnhzZCBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3hzZC90eXBlLXRlc3QueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWM4NWFhLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3hzZC90eXBlLXRlc3QueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTYzMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiID8+Ci08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTwhLS0KLTFzdCBEcmFmdCByZWxlYXNlICgyNy8xMC8yMDA1KQotMS4gUmVtb3ZlZCBhbGwgTWV0ZXIgYW5kIFJldmVudWUgc3BlY2lmaWMgb2JqZWN0cy4KLTIuIFJlbmFtZWQgYWxsICJFRCIgdG8gIk1ldGVyIi4KLTMuIE1vdmVkIDxEYXlMYXN0UHVyY2hhc2U+IGVsZW1lbnQgZnJvbSA8Q3VzdERldGFpbD4gY29tcGxleCB0eXBlIHRvIGEgbmV3IGNvbXBsZXggdHlwZSA8Q3VzdFZlbmREZXRhaWw+LiA8Q3VzdFZlbmREZXRhaWw+IGV4dGVuZHMgPEN1c3REZXRhaWw+LgkKLTQuIEFkZGVkIGdlbmVyaWMgU1RTIGJ1c2luZXNzIHJ1bGUgZXhjZXB0aW9ucy4KLTUuIFJlbW92ZWQgPGhlYWRlcj4gZW51bWVyYXRpb24uCi02LiBDcmVhdGVkIGFic3RyYWN0IDxEZXZpY2VJRD4gYW5kIDxFQU5EZXZpY2VJRD4gYXMgYSBleHRlbnNpb24uCi03LiBSZXBsYWNlZCA8VG9rZW4+IHdpdGggPENyZWRpdFRva2VuVHg+IGZvciA8VmVyaWZ5UmVzcD4uCi04LiA8Q2xpZW50U3RhdHVzPiBub3cgYXNzb2NpYXRlZCB3aXRoIDxCYXNlVmVuZFJlc3A+LgotOS48Q3VzdFZlbmREZXRhaWw+IG5vdyBhc3NvY2lhdGVkIHdpdGggPEJhc2VWZW5kUmVzcD4KLTEwLiBSZW1vdmVkIDxDcmVkaXRVcGRhdGU+IGZyb20gPENsaWVudFN0YXR1cz4uCi0xMS4gTG9naW4gYW5kIExvZ291dCBtZXNzYWdlIHBhaXJzIHJlbW92ZWQuCi0yOC8xMC8yMDA1CQotMTIuIDxDcmVkaXRTdGF0dXM+IHJlbW92ZWQsIDxhdmFpbENyZWRpdD4gZWxlbWVudCBhZGRlZCB0byA8Q2xpZW50U3RhdHVzPi4KLTEzLiA8ZWFuPiBjaGFuZ2VkIHRvIGFuIGF0dHJpYnV0ZS4KLTE0LiA8dGVybWluYWxJRD4gPGlkPiBjaGFuZ2VkIHRvIGF0dHJpYnV0ZS4KLTE1LiA8bXNnSUQ+IGNoYW5nZWQgdG8gYXR0cmlidXRlLgotMTYuIDxNc2dJRFVuaXF1ZU51bWJlcj4gZGF0YXR5cGUgY2hhbmdlInBvc3RpdmVJbnRlZ2VyIgotNy8xMS8yMDA1Ci0xNy4gPGhlYWRlcj4gcmVuYW1lZCB0byA8ZGlzcEhlYWRlcj4gYW5kIG1hZGUgb3B0aW9uYWwuJwotMTguIGNvcnJlY3RlZCBuYW1pbmcgY29udmVudGlvbiBmb3IgPEN1cnJlbmN5Pi4KLTEwLzExLzIwMDUKLTE5LiBBZGRlZCA8cmVzcERhdGVUaW1lPiB0byA8QmFzZVJlc3A+LgkKLTIwLiBSZW5hbWVkIDxDdXN0b21lcklkZW50aWZpZXI+IHRvIDxDdXN0SWRlbnRpZmllcj4uCQotMjEuIFJlbmFtZSA8Y3VzdG9tZXJNc2c+IHRvIDxjdXN0TXNnPgotMjIuIDxUQVg+LCA8YW10PiBtYWRlIG1hbmRhdG9yeS4KLTIzLiA8WE1MVmVuZEZhdWx0PiByZW5hbWVkIHRvIDxYTUxWZW5kRmF1bHRFeD4uCi0yNC4gPExhc3Rlc3RLUk5FeD4gY29ycmVjdGVkIHRvIDxMYXRlc3RLUk5FeD4KLTE2LzExLzIwMDUKLTI1LiBBZGRlZCA8ZGVzYz4gdG8gPE1ldGVyU3BlY2lmaWNUb2tlbklzc3VlPiBjb21wbGV4IHR5cGUuCi0yNi4gQWRkZWQgdGhlIGZvbGxvd2luZyA8Q3JlZGl0VmVuZFRva2VuSXNzdWU+IHNwZWNpYWxpc2F0aW9ucywgPFNhbGVUb2tlbklzc3VlPiwgPEZCRVRva2VuSXNzdWU+LCA8TUNUVG9rZW5Jc3N1ZT4gYW5kIDxGcmVlVG9LZW5Jc3N1ZT4uIFRoaXMgZW5hYmxlcyBtb3JlIHRoYW4gb25lIHR5cGUgb2YgdG9rZW4gdG8gYmUgcmV0dXJuZWQuCi0yNy4gVXBkYXRlZCA8S0NUb2tlbklzc3VlPiB0byBiZSBhIHNwZWNpYWxpc2F0aW9uIG9mIDxNZXRlclNwZWNpZmljRW5nVG9rZW5Jc3N1ZT4gYW5kIG5vdCA8TWV0ZXJTcGVjaWZpY1Rva2VuSXNzdWU+LgotMjguIDxDdXJyZW5jeT4sIDx2YWx1ZT4gY2hhbmdlZCB0byBhbiBhdHRyaWJ1dGUuCi0yOS4gPFV0aWxpdHlEZXRhaWw+LCBhbGwgc3ViIGVsZW1lbnRzIG1hZGUgYXR0cmlidXRlcy4KLTMwLiA8VmVuZG9yRGV0YWlsPiwgYWxsIHN1YiBlbGVtZW50cyBtYWRlIGF0dHJpYnV0ZXMuCi0zMS4gQ3JlYXRlZCA8VW5pdHM+IGNvbXBsZXggdHlwZSwgdXBkYXRlIDxDcmVkaXRUb2tlbklzc3VlPiB3aXRoIGl0LgotMzIuIDxDdXN0RGV0YWlsPiwgYWxsIHN1YiBlbGVtZW50cyBtYWRlIGF0dHJpYnV0ZXMuCi0zMy4gPEN1c3RWZW5kRGV0YWlsPiBzdWIgZWxlbWVudHMgbWFkZSBhdHRyaWJ1dGVzLgotMzQuIDxNZXRlckRldGFpbD4sIDxFeHRNZXRlckRldGFpbD4sIDxNZXRlclR5cGU+LCBzdWIgZWxlbWVudCBtYWRlIGF0dHJpYnV0ZXMuCQotMzUuIDx0cmFjazJEYXRhPiBtYWRlICJyZXF1aXJlZCIgaW4gPEV4dE1ldGVyRGV0YWlsPiBjb21wbGV4IHR5cGUuCi0zNi4gPEtDVERhdGE+LCBzdWIgZWxlbWVudHMgbWFkZSBhdHRyaWJ1dGVzLgotMjIvMTEvMjAwNQkKLTM3LiA8TVNOTz4gcmVndWxhciBleHByZXNzaW9uIHVwZGF0ZWQgdG8gKFxTKXszLDEzfSAJCi0tLT4KLTxzY2hlbWEgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotCXRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy5ucnMuZXNrb20uY28uemEveG1sdmVuZC9iYXNlLzIuMC9zY2hlbWEiCi0JeG1sbnM6aTA9Imh0dHA6Ly93d3cubnJzLmVza29tLmNvLnphL3htbHZlbmQvYmFzZS8yLjAvc2NoZW1hIiBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKLQlhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiPgotCTxhbm5vdGF0aW9uPgotCQk8ZG9jdW1lbnRhdGlvbj4gSGFuZCBjb2RlZCBYTUwgU2NoZW1hIGZvciBOUlMgUHJlcGFpZCBVdGlsaXR5IFZlbmRpbmcgU2VydmljZSBkZWZpbmluZyBiYXNlCi0JCQkoY29tbW9uKSBsaWJyYXJ5IGZvciB0aGUgVmVuZGluZyBNYXJrdXAgTGFuZ3VhZ2UgKFhNTFZlbmQpIGZvciBTT0FQIHJlcXVlc3QgYW5kIHJlc3BvbnNlCi0JCQltZXNzYWdlcyBbKioqIFdTLUkgQ29tcGxpYW50ICoqKiBzZWUgaHR0cDovL3d3dy53cy1pLm9yZ10gVmVyc2lvbiBOdW1iZXIgRGF0ZSBOYW1lc3BhY2UKLQkJCTIuMCBPY3RvYmVyIDIwMDUKLQkJaHR0cDovL3d3dy5ucnMuZXNrb20uY28uemEveG1sdmVuZC9iYXNlLzIuMC9zY2hlbWEvMjAwNS8xMDwvZG9jdW1lbnRhdGlvbj4KLQk8L2Fubm90YXRpb24+Ci0JPGVsZW1lbnQgbmFtZT0iYWR2aWNlUmVxIiB0eXBlPSJpMDpBZHZpY2VSZXEiPgotCQk8YW5ub3RhdGlvbj4KLQkJCTxkb2N1bWVudGF0aW9uPiBTeXN0ZW0gZ2VuZXJhdGVkIGNsaWVudCByZXF1ZXN0IG1lc3NhZ2UgdG8gYWR2aXNlIHRoZSBzZXJ2ZXIgb2YgdGhlCi0JCQkJb3V0Y29tZSBvZiBhIHVzZSBjYXNlIG9uIHRoZSBjbGllbnQuIDwvZG9jdW1lbnRhdGlvbj4KLQkJPC9hbm5vdGF0aW9uPgotCTwvZWxlbWVudD4KLQk8Y29tcGxleFR5cGUgbmFtZT0iQWR2aWNlUmVxIiBhYnN0cmFjdD0idHJ1ZSI+Ci0JCTxhbm5vdGF0aW9uPgotCQkJPGRvY3VtZW50YXRpb24+IFJlcXVlc3QgbXVzdCBiZSBleHRlbmRlZCB0byBhZHZpc2UgdGhlIHNlcnZlciB0byB0YWtlIGFuIGFwcHJvcHJpYXRlCi0JCQkJYWN0aW9uIGJhc2VkIG9uIHRoZSBvdXRjb21lIG9mIHByZXZpb3VzIHVzZSBjYXNlIG9uIHRoZSBjbGllbnQuIDwvZG9jdW1lbnRhdGlvbj4KLQkJPC9hbm5vdGF0aW9uPgotCQk8Y29tcGxleENvbnRlbnQ+Ci0JCQk8ZXh0ZW5zaW9uIGJhc2U9ImkwOkJhc2VSZXEiPgotCQkJCTxzZXF1ZW5jZT4KLQkJCQkJPGVsZW1lbnQgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIG5hbWU9ImFkdmljZVJlcU1zZ0lEIiB0eXBlPSJpMDpNc2dJRCI+Ci0JCQkJCQk8YW5ub3RhdGlvbj4KLQkJCQkJCQk8ZG9jdW1lbnRhdGlvbj4gVGhlIG9yaWdpbmFsIHJlcXVlc3QgTXNnSUQgdGhhdCBpcyBiZWluZyBhZHZpc2VkLgotCQkJCQkJCTwvZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwvYW5ub3RhdGlvbj4KLQkJCQkJPC9lbGVtZW50PgotCQkJCTwvc2VxdWVuY2U+Ci0JCQk8L2V4dGVuc2lvbj4KLQkJPC9jb21wbGV4Q29udGVudD4KLQk8L2NvbXBsZXhUeXBlPgotCTxlbGVtZW50IG5hbWU9ImFkdmljZVJlc3AiIHR5cGU9ImkwOkFkdmljZVJlc3AiPgotCQk8YW5ub3RhdGlvbj4KLQkJCTxkb2N1bWVudGF0aW9uPiBTZXJ2ZXIgcmVzcG9uc2UgbWVzc2FnZSB0byBhIGFkdmljZSByZXF1ZXN0IG1lc3NhZ2UuIDwvZG9jdW1lbnRhdGlvbj4KLQkJPC9hbm5vdGF0aW9uPgotCTwvZWxlbWVudD4KLQk8Y29tcGxleFR5cGUgbmFtZT0iQWR2aWNlUmVzcCIgYWJzdHJhY3Q9InRydWUiPgotCQk8YW5ub3RhdGlvbj4KLQkJCTxkb2N1bWVudGF0aW9uPiBSZXNwb25zZSB0byBhZHZpY2UgcmVxdWVzdC4gQ29uZmlybWluZyB0aGF0IHRoZSBhZHZpY2UgaGFzIGJlZW4KLQkJCQlwcm9jZXNzZWQgYnkgdGhlIHNlcnZlci4gPC9kb2N1bWVudGF0aW9uPgotCQk8L2Fubm90YXRpb24+Ci0JCTxjb21wbGV4Q29udGVudD4KLQkJCTxleHRlbnNpb24gYmFzZT0iaTA6QmFzZVJlc3AiPgotCQkJCTxzZXF1ZW5jZT4KLQkJCQkJPGVsZW1lbnQgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIG5hbWU9ImFkdmljZVJlcU1zZ0lEIiB0eXBlPSJpMDpNc2dJRCI+Ci0JCQkJCQk8YW5ub3RhdGlvbj4KLQkJCQkJCQk8ZG9jdW1lbnRhdGlvbj4gVGhlIG9yaWdpbmFsIHJlcXVlc3QgTXNnSUQgdGhhdCBoYXMgYmVlbiBhZHZpc2VkLgotCQkJCQkJCTwvZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwvYW5ub3RhdGlvbj4KLQkJCQkJPC9lbGVtZW50PgotCQkJCTwvc2VxdWVuY2U+Ci0JCQk8L2V4dGVuc2lvbj4KLQkJPC9jb21wbGV4Q29udGVudD4KLQk8L2NvbXBsZXhUeXBlPgotCTxlbGVtZW50IG5hbWU9InhtbHZlbmRGYXVsdFJlc3AiIHR5cGU9ImkwOlhNTFZlbmRGYXVsdFJlc3AiPgotCQk8YW5ub3RhdGlvbj4KLQkJCTxkb2N1bWVudGF0aW9uPiBSZXNwb25zZSB0byBhIFhNTFZlbmQgZXhjZXB0aW9uLCBidXNpbmVzcyBydWxlIGV4Y2VwdGlvbiBvciBhIHN5c3RlbQotCQkJCWV4Y2VwdGlvbiB0aGF0IG9jY3VycyBvbiB0aGUgc2VydmVyIHdoZW4gcHJvY2Vzc2luZyBhbnkgb3RoZXIgcmVxdWVzdC4KLQkJCTwvZG9jdW1lbnRhdGlvbj4KLQkJPC9hbm5vdGF0aW9uPgotCTwvZWxlbWVudD4KLQk8Y29tcGxleFR5cGUgbmFtZT0iWE1MVmVuZEZhdWx0UmVzcCI+Ci0JCTxhbm5vdGF0aW9uPgotCQkJPGRvY3VtZW50YXRpb24+IFJlc3BvbnNlIHRvIGEgWE1MVmVuZCBleGNlcHRpb24gb3IgYnVzaW5lc3MgcnVsZSBleGNlcHRpb24gdGhhdCBvY2N1cnMKLQkJCQlvbiB0aGUgc2VydmVyIHdoZW4gcHJvY2Vzc2luZyBhbnkgb3RoZXIgcmVxdWVzdC4gPC9kb2N1bWVudGF0aW9uPgotCQk8L2Fubm90YXRpb24+Ci0JCTxjb21wbGV4Q29udGVudD4KLQkJCTxleHRlbnNpb24gYmFzZT0iaTA6QmFzZVJlc3AiPgotCQkJCTxzZXF1ZW5jZT4KLQkJCQkJPGVsZW1lbnQgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIG5hbWU9ImZhdWx0IiB0eXBlPSJpMDpGYXVsdCIvPgotCQkJCTwvc2VxdWVuY2U+Ci0JCQk8L2V4dGVuc2lvbj4KLQkJPC9jb21wbGV4Q29udGVudD4KLQk8L2NvbXBsZXhUeXBlPgotCTwhLS0gTWVzc2FnZSBEZWZpbml0aW9ucyAgRW5kcy0tPgotCTwhLS0gQ29tcGxleCBFbGVtZW50IERlZmluaXRpb25zIFN0YXJ0cyAtLT4KLQk8IS0tQWR2aWNlIFJlcSBTcGVjaWFsaXNhdGlvbnMgLS0+Ci0JPGNvbXBsZXhUeXBlIG5hbWU9IkNvbmZpcm1hdGlvbkFkdmljZVJlcSI+Ci0JCTxhbm5vdGF0aW9uPgotCQkJPGRvY3VtZW50YXRpb24+IEFkdmljZSBzcGVjaWFsaXNhdGlvbiwgdXNlZCB0byBieSB0aGUgY2xpZW50IHRvIGNvbmZpcm0gdGhhdCBhIHByZXZpb3VzCi0JCQkJdXNlZCBjYXNlIGhhcyBiZWVuIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuIDwvZG9jdW1lbnRhdGlvbj4KLQkJPC9hbm5vdGF0aW9uPgotCQk8Y29tcGxleENvbnRlbnQ+Ci0JCQk8ZXh0ZW5zaW9uIGJhc2U9ImkwOkFkdmljZVJlcSI+Ci0JCQkJPHNlcXVlbmNlPgotCQkJCQk8ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0icGF5VHlwZSIgdHlwZT0iaTA6UGF5VHlwZSI+Ci0JCQkJCQk8YW5ub3RhdGlvbj4KLQkJCQkJCQk8ZG9jdW1lbnRhdGlvbj4gVXNlZCB0byBhZHZpc2UgdGhlIHNlcnZlciBvZiB0aGUgcGF5IHR5cGUgdGhhdCB3YXMgdXNlZAotCQkJCQkJCQlpbiB0aGUgdHJhbnNhY3Rpb24uIFRoYXQgaXMsIHRoZSBwYXkgdHlwZSBtYXkgbm90IGhhdmUgYmVlbgotCQkJCQkJCQlhdmFpbGFibGUgaW4gdGhlIG9yaWdpbmFsIHJlcXVlc3QuIDwvZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwvYW5ub3RhdGlvbj4KLQkJCQkJPC9lbGVtZW50PgotCQkJCTwvc2VxdWVuY2U+Ci0JCQk8L2V4dGVuc2lvbj4KLQkJPC9jb21wbGV4Q29udGVudD4KLQk8L2NvbXBsZXhUeXBlPgotCTxjb21wbGV4VHlwZSBuYW1lPSJSZXZlcnNhbEFkdmljZVJlcSI+Ci0JCTxhbm5vdGF0aW9uPgotCQkJPGRvY3VtZW50YXRpb24+IEFkdmlzZSBzcGVjaWFsaXNhdGlvbiwgdXNlZCB0byBhZHZpc2UgdGhlIHNlcnZlciB0aGF0IHRoZSBwcmV2aW91cwotCQkJCXRyYW5zYWN0aW9uIHdhcyBub3Qgc3VjY2Vzc2Z1bGx5IGNvbXBsZXRlZCBvbiB0aGUgY2xpZW50IGFuZCB0aGUgc2VydmVyIHNob3VsZAotCQkJCXJldmVyc2UgdGhlIHRyYW5zYWN0aW9uLiA8L2RvY3VtZW50YXRpb24+Ci0JCTwvYW5ub3RhdGlvbj4KLQkJPGNvbXBsZXhDb250ZW50PgotCQkJPGV4dGVuc2lvbiBiYXNlPSJpMDpBZHZpY2VSZXEiLz4KLQkJPC9jb21wbGV4Q29udGVudD4KLQk8L2NvbXBsZXhUeXBlPgotCTxjb21wbGV4VHlwZSBuYW1lPSJMYXN0UmVzcEFkdmljZVJlcSI+Ci0JCTxhbm5vdGF0aW9uPgotCQkJPGRvY3VtZW50YXRpb24+IEFkdmlzZSBzcGVjaWFsaXNhdGlvbiwgdXNlZCB0byBhZHZpc2UgdGhlIHNlcnZlciB0aGUgc2VydmVyIHRvIHJlc2VuZAotCQkJCXRoZSBsYXN0IHJlc3BvbnNlIHRvIHRoZSBsYXN0IGNsaWVudCByZXF1ZXN0LCBhcyB0aGUgdHJhbnNhY3Rpb24gd2FzIG5vdAotCQkJCXN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQgb24gdGhlIGNsaWVudC4gPC9kb2N1bWVudGF0aW9uPgotCQk8L2Fubm90YXRpb24+Ci0JCTxjb21wbGV4Q29udGVudD4KLQkJCTxleHRlbnNpb24gYmFzZT0iaTA6QWR2aWNlUmVxIi8+Ci0JCTwvY29tcGxleENvbnRlbnQ+Ci0JPC9jb21wbGV4VHlwZT4KLQk8IS0tQWR2aWNlIFJlcSBTcGVjaWFsaXNhdGlvbnMgRW5kcy0tPgotCTwhLS1BZHZpY2UgUmVzcG9uc2UgU3BlY2lhbGlzYXRpb25zIC0tPgotCTxjb21wbGV4VHlwZSBuYW1lPSJDb25maXJtYXRpb25BZHZpY2VSZXNwIj4KLQkJPGFubm90YXRpb24+Ci0JCQk8ZG9jdW1lbnRhdGlvbj4gUmVzcG9uc2UgdG8gY29uZmlybWF0aW9uIGFkdmljZS4gPC9kb2N1bWVudGF0aW9uPgotCQk8L2Fubm90YXRpb24+Ci0JCTxjb21wbGV4Q29udGVudD4KLQkJCTxleHRlbnNpb24gYmFzZT0iaTA6QWR2aWNlUmVzcCI+Ci0JCQkJPGF0dHJpYnV0ZSB1c2U9InJlcXVpcmVkIiBuYW1lPSJ0eENvbmZpcm1lZCIgdHlwZT0iYm9vbGVhbiI+Ci0JCQkJCTxhbm5vdGF0aW9uPgotCQkJCQkJPGRvY3VtZW50YXRpb24+IHRydWUgLSB0cmFuc2FjdGlvbiBjb25maXJtZWQsIGZhbHNlIC0gdHJhbnNhY3Rpb24gY291bGQgbm90Ci0JCQkJCQkJYmUgY29uZmlybWVkLiA8L2RvY3VtZW50YXRpb24+Ci0JCQkJCTwvYW5ub3RhdGlvbj4KLQkJCQk8L2F0dHJpYnV0ZT4KLQkJCTwvZXh0ZW5zaW9uPgotCQk8L2NvbXBsZXhDb250ZW50PgotCTwvY29tcGxleFR5cGU+Ci0JPGNvbXBsZXhUeXBlIG5hbWU9IlJldmVyc2FsQWR2aWNlUmVzcCI+Ci0JCTxjb21wbGV4Q29udGVudD4KLQkJCTxleHRlbnNpb24gYmFzZT0iaTA6QWR2aWNlUmVzcCI+Ci0JCQkJPGF0dHJpYnV0ZSB1c2U9InJlcXVpcmVkIiBuYW1lPSJ0eFJldmVyc2VkIiB0eXBlPSJib29sZWFuIj4KLQkJCQkJPGFubm90YXRpb24+Ci0JCQkJCQk8ZG9jdW1lbnRhdGlvbj4gdHJ1ZSAtIHRyYW5zYWN0aW9uIHJldmVyc2Ugb24gc2VydmVyLCBmYWxzZSAtIHRyYW5zYWN0aW9uCi0JCQkJCQkJY291bGQgbm90IGJlIHJldmVyc2VkIG9uIHNlcnZlci4gPC9kb2N1bWVudGF0aW9uPgotCQkJCQk8L2Fubm90YXRpb24+Ci0JCQkJPC9hdHRyaWJ1dGU+Ci0JCQk8L2V4dGVuc2lvbj4KLQkJPC9jb21wbGV4Q29udGVudD4KLQk8L2NvbXBsZXhUeXBlPgotCTxjb21wbGV4VHlwZSBuYW1lPSJMYXN0UmVzcEFkdmljZVJlc3AiPgotCQk8YW5ub3RhdGlvbj4KLQkJCTxkb2N1bWVudGF0aW9uPiBSZXNwb25zZSB0byBsYXN0UmVzcG9uc2UgYWR2aWNlIHJlcXVlc3QsIGNvbnRhaW5zIHRoZSBjb21wbGV0ZSBsYXN0Ci0JCQkJcmVzcG9uc2UgbWVzc2FnZSBzZW50IGJ5IHRoZSBzZXJ2ZXIgdG8gdGhpcyBjbGllbnQuIDwvZG9jdW1lbnRhdGlvbj4KLQkJPC9hbm5vdGF0aW9uPgotCQk8Y29tcGxleENvbnRlbnQ+Ci0JCQk8ZXh0ZW5zaW9uIGJhc2U9ImkwOkFkdmljZVJlc3AiPgotCQkJCTxzZXF1ZW5jZT4KLQkJCQkJPGVsZW1lbnQgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIG5hbWU9Imxhc3RSZXNwb25zZSIgdHlwZT0iaTA6QmFzZVJlc3AiPgotCQkJCQkJPGFubm90YXRpb24+Ci0JCQkJCQkJPGRvY3VtZW50YXRpb24+IFRoZSBjb21wbGV0ZSBsYXN0IHJlc3BvbnNlIG1lc3NhZ2UgdGhhdCB3YXMgcmVxdWVzdGVkLgotCQkJCQkJCTwvZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwvYW5ub3RhdGlvbj4KLQkJCQkJPC9lbGVtZW50PgotCQkJCTwvc2VxdWVuY2U+Ci0JCQk8L2V4dGVuc2lvbj4KLQkJPC9jb21wbGV4Q29udGVudD4KLQk8L2NvbXBsZXhUeXBlPgotCTwhLS1BZHZpY2UgUmVzcG9uc2UgU3BlY2lhbGlzYXRpb25zIEVuZHMtLT4KLQk8Y29tcGxleFR5cGUgbmFtZT0iQXV0aENyZWQiPgotCQk8YW5ub3RhdGlvbj4KLQkJCTxkb2N1bWVudGF0aW9uPiBQcm92aWRlcyBvcGVyYXRvciBhdXRoZW50aWNhdGlvbiBkYXRhIHRvIHRoZSBzZXJ2ZXIgZnJvbSB0aGUgY2xpZW50LgotCQkJPC9kb2N1bWVudGF0aW9uPgotCQk8L2Fubm90YXRpb24+Ci0JCTxzZXF1ZW5jZT4KLQkJCTxlbGVtZW50IG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiBuYW1lPSJvcE5hbWUiIHR5cGU9ImkwOk9wTmFtZSIvPgotCQkJPGVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9InBhc3N3b3JkIiB0eXBlPSJpMDpQYXNzd29yZCIvPgotCQkJPGVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9Im5ld1Bhc3N3b3JkIiB0eXBlPSJpMDpQYXNzd29yZCI+Ci0JCQkJPGFubm90YXRpb24+Ci0JCQkJCTxkb2N1bWVudGF0aW9uPiBBIG5ldyBwYXNzIHBocmFzZSB0aGF0IHdpbGwgcmVwbGFjZSB0aGUgb25lIHNwZWNpZmllZCBpbiB0aGUKLQkJCQkJCSJwYXNzd29yZCIgZmllbGQuIDwvZG9jdW1lbnRhdGlvbj4KLQkJCQk8L2Fubm90YXRpb24+Ci0JCQk8L2VsZW1lbnQ+Ci0JCTwvc2VxdWVuY2U+Ci0JPC9jb21wbGV4VHlwZT4KLQk8Y29tcGxleFR5cGUgbmFtZT0iQmFzZVJlc3AiPgotCQk8YW5ub3RhdGlvbj4KLQkJCTxkb2N1bWVudGF0aW9uPiBSZXR1cm5lZCBpbiBldmVyeSByZXNwb25zZSBhbmQgZGVmaW5lcyB0aGUgcmVzcG9uc2UgbWVzc2FnZSBjb250ZXh0LgotCQkJPC9kb2N1bWVudGF0aW9uPgotCQk8L2Fubm90YXRpb24+Ci0JCTxzZXF1ZW5jZT4KLQkJCTxlbGVtZW50IG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiBuYW1lPSJjbGllbnRJRCIgdHlwZT0iaTA6RGV2aWNlSUQiPgotCQkJCTxhbm5vdGF0aW9uPgotCQkJCQk8ZG9jdW1lbnRhdGlvbj4gVGhpcyBpZGVudGlmaWVyIGlzIHVzZWQgdG8gdW5pcXVlbHkgaWRlbnRpZnkgdGhlIHZlbmRpbmcgY2xpZW50Ci0JCQkJCQl0aGF0IGluaXRpYXRlZCBhIHVzZSBjYXNlLiBJZiBjbGllbnQgc2lkZSBYNTA5IGNlcnRpZmljYXRlcyBhcmUgdXNlZCwgdGhlbgotCQkJCQkJdGhlIGlkZW50aWZpZXIgbXVzdCBtYXRjaCB0aGUgc3ViamVjdCBmaWVsZCBzcGVjaWZpZWQgaW4gdGhlIGNlcnRpZmljYXRlLgotCQkJCQkJVGhpcyBpZGVudGlmaWVyIGlzIHVzdWFsbHkgbWFwcGVkIHRvIGEgc3BlY2lmaWMgdmVuZG9yIGFjY291bnQgcmVnaXN0ZXJlZCBvbgotCQkJCQkJdGhlIHZlbmRpbmcgc2VydmVyLiBUaGUgY2xpZW50SUQgbWF5IGFsc28gYmUgbWFwcGVkIHRvIENEVSBJRCBmb3IgbGVnYWN5Ci0JCQkJCQlwdXJwb3Nlcy4gPC9kb2N1bWVudGF0aW9uPgotCQkJCTwvYW5ub3RhdGlvbj4KLQkJCTwvZWxlbWVudD4KLQkJCTxlbGVtZW50IG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiBuYW1lPSJzZXJ2ZXJJRCIgdHlwZT0iaTA6RGV2aWNlSUQiPgotCQkJCTxhbm5vdGF0aW9uPgotCQkJCQk8ZG9jdW1lbnRhdGlvbj4gVGhpcyBpZGVudGlmaWVyIGlzIHVzZWQgdG8gdW5pcXVlbHkgaWRlbnRpZnkgdGhlIHZlbmRpbmcgc2VydmVyLgotCQkJCQkJSWYgc2VydmVyIHNpZGUgWDUwOSBjZXJ0aWZpY2F0ZXMgYXJlIHVzZWQsIHRoZW4gdGhlIGlkZW50aWZpZXIgbXVzdCBtYXRjaAotCQkJCQkJdGhlIHN1YmplY3QgZmllbGQgc3BlY2lmaWVkIGluIHRoZSBjZXJ0aWZpY2F0ZS4gPC9kb2N1bWVudGF0aW9uPgotCQkJCTwvYW5ub3RhdGlvbj4KLQkJCTwvZWxlbWVudD4KLQkJCTxlbGVtZW50IG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiBuYW1lPSJ0ZXJtaW5hbElEIiB0eXBlPSJpMDpEZXZpY2VJRCI+Ci0JCQkJPGFubm90YXRpb24+Ci0JCQkJCTxkb2N1bWVudGF0aW9uPiBUaGlzIGlkZW50aWZpZXIgaXMgdXNlZCB0byBpZGVudGlmeSB0aGUgdmVuZGluZyB0ZXJtaW5hbCB0aGF0Ci0JCQkJCQlpbml0aWF0ZWQgdGhlIHVzZSBjYXNlLiBJZiB0aGUgdmVuZGluZyBjbGllbnQgYWxzbyBpcyBhIHRlcm1pbmFsIHRoZW4gdGhlCi0JCQkJCQl0ZXJtaW5hbElEIG11c3QgZGVmYXVsdCB0byAiMSIuIDwvZG9jdW1lbnRhdGlvbj4KLQkJCQk8L2Fubm90YXRpb24+Ci0JCQk8L2VsZW1lbnQ+Ci0JCQk8ZWxlbWVudCBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgbmFtZT0icmVxTXNnSUQiIHR5cGU9ImkwOk1zZ0lEIj4KLQkJCQk8YW5ub3RhdGlvbj4KLQkJCQkJPGRvY3VtZW50YXRpb24+IFRoaXMgZmllbGQgY29udGFpbnMgdGhlICJtc2dJRCIgdGhhdCB3YXMgY3JlYXRlZCBpbiB0aGUKLQkJCQkJCWNvcnJlc3BvbmRpbmcgcmVxdWVzdCBtZXNzYWdlLiA8L2RvY3VtZW50YXRpb24+Ci0JCQkJPC9hbm5vdGF0aW9uPgotCQkJPC9lbGVtZW50PgotCQkJPGVsZW1lbnQgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIG5hbWU9InJlc3BEYXRlVGltZSIgdHlwZT0iZGF0ZVRpbWUiPgotCQkJCTxhbm5vdGF0aW9uPgotCQkJCQk8ZG9jdW1lbnRhdGlvbj4gVGhlIGRhdGUgdGltZSBzdGFtcCBvZiB3aGVuIHRoZSByZXNwb25zZSB3YXMKLQkJCQkJY3JlYXRlZC48L2RvY3VtZW50YXRpb24+Ci0JCQkJPC9hbm5vdGF0aW9uPgotCQkJPC9lbGVtZW50PgotCQkJPGVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9ImRpc3BIZWFkZXIiIHR5cGU9ImkwOk1zZyI+Ci0JCQkJPGFubm90YXRpb24+Ci0JCQkJCTxkb2N1bWVudGF0aW9uPiBBIG1lc3NhZ2UgdGFyZ2V0ZWQgYXQgdGhlIG9wZXJhdG9yIGUuZy4gIlZlbmRvciBjcmVkaXQgbGltaXQgaXMKLQkJCQkJCWFib3V0IHRvIGJlIHJlYWNoZWQiLiA8L2RvY3VtZW50YXRpb24+Ci0JCQkJPC9hbm5vdGF0aW9uPgotCQkJPC9lbGVtZW50PgotCQkJPGVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9Im9wZXJhdG9yTXNnIiB0eXBlPSJpMDpNc2ciPgotCQkJCTxhbm5vdGF0aW9uPgotCQkJCQk8ZG9jdW1lbnRhdGlvbj4gQSBtZXNzYWdlIHRhcmdldGVkIGF0IHRoZSBvcGVyYXRvciBlLmcuICJWZW5kb3IgY3JlZGl0IGxpbWl0IGlzCi0JCQkJCQlhYm91dCB0byBiZSByZWFjaGVkIi4gPC9kb2N1bWVudGF0aW9uPgotCQkJCTwvYW5ub3RhdGlvbj4KLQkJCTwvZWxlbWVudD4KLQkJCTxlbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJjdXN0TXNnIiB0eXBlPSJpMDpNc2ciPgotCQkJCTxhbm5vdGF0aW9uPgotCQkJCQk8ZG9jdW1lbnRhdGlvbj4gQSBtZXNzYWdlIHRhcmdldGVkIGF0IHRoZSBjdXN0b21lciBlLmcuICJZb3VyIEZCRSB0b2tlbiBmb3IKLQkJCQkJCXRoZSBjdXJyZW50IG1vbnRoIGhhcyBub3QgYmVlbiBjbGFpbWVkLiIgPC9kb2N1bWVudGF0aW9uPgotCQkJCTwvYW5ub3RhdGlvbj4KLQkJCTwvZWxlbWVudD4KLQkJPC9zZXF1ZW5jZT4KLQk8L2NvbXBsZXhUeXBlPgotCTxjb21wbGV4VHlwZSBuYW1lPSJCYXNlUmVxIj4KLQkJPGFubm90YXRpb24+Ci0JCQk8ZG9jdW1lbnRhdGlvbj4gUHJlc2VudCBpbiBhbGwgcmVxdWVzdHMsIGRlZmluZXMgdGhlIHJlcXVlc3QgbWVzc2FnZSBjb250ZXh0LgotCQkJPC9kb2N1bWVudGF0aW9uPgotCQk8L2Fubm90YXRpb24+Ci0JCTxzZXF1ZW5jZT4KLQkJCTxlbGVtZW50IG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiBuYW1lPSJjbGllbnRJRCIgdHlwZT0iaTA6RGV2aWNlSUQiLz4KLQkJCTxlbGVtZW50IG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiBuYW1lPSJ0ZXJtaW5hbElEIiB0eXBlPSJpMDpEZXZpY2VJRCIvPgotCQkJPGVsZW1lbnQgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIG5hbWU9Im1zZ0lEIiB0eXBlPSJpMDpNc2dJRCI+Ci0JCQkJPGFubm90YXRpb24+Ci0JCQkJCTxkb2N1bWVudGF0aW9uPiBUaGlzIGlzIGEgaWRlbnRpZnkgZm9yIHRoZSByZXF1ZXN0IG1lc3NhZ2UuIEl0IGlzIHNob3VsZCBiZQotCQkJCQkJdW5pcXVlIGFjcm9zcyB0aGUgc3lzdGVtLCB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIGNsaWVudElELiA8L2RvY3VtZW50YXRpb24+Ci0JCQkJPC9hbm5vdGF0aW9uPgotCQkJPC9lbGVtZW50PgotCQkJPGVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9ImF1dGhDcmVkIiB0eXBlPSJpMDpBdXRoQ3JlZCIvPgotCQk8L3NlcXVlbmNlPgotCTwvY29tcGxleFR5cGU+Ci0JPGNvbXBsZXhUeXBlIG5hbWU9IkJhc2VWZW5kUmVxIj4KLQkJPGNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0JCQk8ZXh0ZW5zaW9uIGJhc2U9ImkwOkJhc2VSZXEiPgotCQkJCTxzZXF1ZW5jZT4KLQkJCQkJPGVsZW1lbnQgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIG5hbWU9InJlc291cmNlIiB0eXBlPSJpMDpSZXNvdXJjZSIvPgotCQkJCQk8ZWxlbWVudCBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgbmFtZT0iaWRNZXRob2QiIHR5cGU9ImkwOlZlbmRJRE1ldGhvZCIvPgotCQkJCTwvc2VxdWVuY2U+Ci0JCQk8L2V4dGVuc2lvbj4KLQkJPC9jb21wbGV4Q29udGVudD4KLQk8L2NvbXBsZXhUeXBlPgotCTxjb21wbGV4VHlwZSBuYW1lPSJCYXNlVmVuZFJlc3AiPgotCQk8Y29tcGxleENvbnRlbnQ+Ci0JCQk8ZXh0ZW5zaW9uIGJhc2U9ImkwOkJhc2VSZXNwIj4KLQkJCQk8c2VxdWVuY2U+Ci0JCQkJCTxlbGVtZW50IG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiBuYW1lPSJjbGllbnRTdGF0dXMiIHR5cGU9ImkwOkNsaWVudFN0YXR1cyIvPgotCQkJCQk8ZWxlbWVudCBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgbmFtZT0idXRpbGl0eSIgdHlwZT0iaTA6VXRpbGl0eURldGFpbCIvPgotCQkJCQk8ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0idmVuZG9yIiB0eXBlPSJpMDpWZW5kb3JEZXRhaWwiLz4KLQkJCQkJPGVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9ImN1c3RWZW5kRGV0YWlsIgotCQkJCQkJdHlwZT0iaTA6Q3VzdFZlbmREZXRhaWwiPgotCQkJCQkJPGFubm90YXRpb24+Ci0JCQkJCQkJPGRvY3VtZW50YXRpb24+IERldGFpbHMgYWJvdXQgdGhlIGN1c3RvbWVyIHRoYXQgIm93bnMiIHRoZSBtZXRlci4KLQkJCQkJCQk8L2RvY3VtZW50YXRpb24+Ci0JCQkJCQk8L2Fubm90YXRpb24+Ci0JCQkJCTwvZWxlbWVudD4KLQkJCQk8L3NlcXVlbmNlPgotCQkJPC9leHRlbnNpb24+Ci0JCTwvY29tcGxleENvbnRlbnQ+Ci0JPC9jb21wbGV4VHlwZT4KLQk8IS0tQmF0Y2ggU3BlY2lhbGlzYXRpb25zIC0tPgotCTwhLS1CYXRjaCBTcGVjaWFsaXNhdGlvbnMgRW5kcy0tPgotCTxjb21wbGV4VHlwZSBuYW1lPSJCYXRjaFN0YXR1cyI+Ci0JCTxhbm5vdGF0aW9uPgotCQkJPGRvY3VtZW50YXRpb24+IFJlcG9ydHMgdGhlIHN0YXR1cyAob3BlbiAvIGNsb3NlZCkgb2YgdGhlIGFsbCB0aGUgYmF0Y2hlcy4KLQkJCTwvZG9jdW1lbnRhdGlvbj4KLQkJPC9hbm5vdGF0aW9uPgotCQk8YXR0cmlidXRlIHVzZT0icmVxdWlyZWQiIG5hbWU9ImJhbmtpbmciIHR5cGU9ImkwOkJhdGNoU3RhdHVzVHlwZSIvPgotCQk8YXR0cmlidXRlIHVzZT0icmVxdWlyZWQiIG5hbWU9InNhbGVzIiB0eXBlPSJpMDpCYXRjaFN0YXR1c1R5cGUiLz4KLQkJPGF0dHJpYnV0ZSB1c2U9InJlcXVpcmVkIiBuYW1lPSJzaGlmdCIgdHlwZT0iaTA6QmF0Y2hTdGF0dXNUeXBlIi8+Ci0JPC9jb21wbGV4VHlwZT4KLQk8Y29tcGxleFR5cGUgbmFtZT0iQ2xpZW50U3RhdHVzIj4KLQkJPGFubm90YXRpb24+Ci0JCQk8ZG9jdW1lbnRhdGlvbj4gVGhlIHNlcnZlciBzdGF0ZSBpbiB0ZXJtcyBvZiB0aGUgY2xpZW50J3MgY3JlZGl0IGFuZCBiYXRjaCBzdGF0dXNlcy4KLQkJCTwvZG9jdW1lbnRhdGlvbj4KLQkJPC9hbm5vdGF0aW9uPgotCQk8c2VxdWVuY2U+Ci0JCQk8ZWxlbWVudCBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgbmFtZT0iYXZhaWxDcmVkaXQiIHR5cGU9ImkwOkN1cnJlbmN5Ij4KLQkJCQk8YW5ub3RhdGlvbj4KLQkJCQkJPGRvY3VtZW50YXRpb24+IFRoZSBjdXJyZW50IHZlbmRvciBjcmVkaXQgdGhhdCBpcyBhdmFpbGFibGUgZm9yIGZ1cnRoZXIKLQkJCQkJCXRyYW5zYWN0aW9ucy4gPC9kb2N1bWVudGF0aW9uPgotCQkJCTwvYW5ub3RhdGlvbj4KLQkJCTwvZWxlbWVudD4KLQkJCTxlbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJiYXRjaFN0YXR1cyIgdHlwZT0iaTA6QmF0Y2hTdGF0dXMiLz4KLQkJPC9zZXF1ZW5jZT4KLQk8L2NvbXBsZXhUeXBlPgotCTwhLS1DdXN0SWRlbnRpZmllciBTcGVjaWFsaXNhdGlvbiAtLT4KLQk8Y29tcGxleFR5cGUgbmFtZT0iQ3VzdElkZW50aWZpZXIiIGFic3RyYWN0PSJ0cnVlIi8+Ci0JPGNvbXBsZXhUeXBlIG5hbWU9IkN1c3ROYW1lIj4KLQkJPGFubm90YXRpb24+Ci0JCQk8ZG9jdW1lbnRhdGlvbj4gQ29udGFpbnMgdGhlIG5hbWUgb2YgdGhlIGN1c3RvbWVyIC0gdXNlZCBhcyBhIHNlYXJjaCBzdHJpbmcuCi0JCQk8L2RvY3VtZW50YXRpb24+Ci0JCTwvYW5ub3RhdGlvbj4KLQkJPGNvbXBsZXhDb250ZW50PgotCQkJPGV4dGVuc2lvbiBiYXNlPSJpMDpDdXN0SWRlbnRpZmllciI+Ci0JCQkJPHNlcXVlbmNlPgotCQkJCQk8ZWxlbWVudCBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgbmFtZT0ibmFtZSIgdHlwZT0iaTA6UGVyc29uTmFtZSIvPgotCQkJCTwvc2VxdWVuY2U+Ci0JCQk8L2V4dGVuc2lvbj4KLQkJPC9jb21wbGV4Q29udGVudD4KLQk8L2NvbXBsZXhUeXBlPgotCTxjb21wbGV4VHlwZSBuYW1lPSJDdXN0QWRkcmVzcyI+Ci0JCTxhbm5vdGF0aW9uPgotCQkJPGRvY3VtZW50YXRpb24+IENvbnRhaW5zIHRoZSBhZGRyZXNzIG9mIHRoZSBjdXN0b21lciAtIHVzZWQgYXMgYSBzZWFyY2ggc3RyaW5nLgotCQkJPC9kb2N1bWVudGF0aW9uPgotCQk8L2Fubm90YXRpb24+Ci0JCTxjb21wbGV4Q29udGVudD4KLQkJCTxleHRlbnNpb24gYmFzZT0iaTA6Q3VzdElkZW50aWZpZXIiPgotCQkJCTxzZXF1ZW5jZT4KLQkJCQkJPGVsZW1lbnQgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIG5hbWU9ImFkZHJlc3MiIHR5cGU9ImkwOkFkZHJlc3MiLz4KLQkJCQk8L3NlcXVlbmNlPgotCQkJPC9leHRlbnNpb24+Ci0JCTwvY29tcGxleENvbnRlbnQ+Ci0JPC9jb21wbGV4VHlwZT4KLQk8Y29tcGxleFR5cGUgbmFtZT0iQ3VzdEFjY291bnRObyI+Ci0JCTxhbm5vdGF0aW9uPgotCQkJPGRvY3VtZW50YXRpb24+IENvbnRhaW5zIHRoZSBhY2NvdW50IG51bWJlciBvZiB0aGUgY3VzdG9tZXIgd2l0aCBhIHNwZWNpZmljCi0JCQkJb3JnYW5pc2F0aW9uLCB1c3VhbGx5IHRoZSBVdGlsaXR5IC0gdXNlZCBhcyBhIHNlYXJjaCBzdHJpbmcuIDwvZG9jdW1lbnRhdGlvbj4KLQkJPC9hbm5vdGF0aW9uPgotCQk8Y29tcGxleENvbnRlbnQ+Ci0JCQk8ZXh0ZW5zaW9uIGJhc2U9ImkwOkN1c3RJZGVudGlmaWVyIj4KLQkJCQk8c2VxdWVuY2U+Ci0JCQkJCTxlbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJvcmdhbmlzYXRpb24iCi0JCQkJCQl0eXBlPSJpMDpPcmdhbmlzYXRpb25OYW1lIi8+Ci0JCQkJPC9zZXF1ZW5jZT4KLQkJCQk8YXR0cmlidXRlIHVzZT0icmVxdWlyZWQiIG5hbWU9ImFjY05vIiB0eXBlPSJpMDpBY2NvdW50Tm8iLz4KLQkJCTwvZXh0ZW5zaW9uPgotCQk8L2NvbXBsZXhDb250ZW50PgotCTwvY29tcGxleFR5cGU+Ci0JPGNvbXBsZXhUeXBlIG5hbWU9IkN1c3RJRE51bWJlciI+Ci0JCTxhbm5vdGF0aW9uPgotCQkJPGRvY3VtZW50YXRpb24+IENvbnRhaW5zIHRoZSBnb3Zlcm5tZW50IGlzc3VlZCBpZGVudGl0eSBudW1iZXIgb2YgdGhlIGN1c3RvbWVyIC0gdXNlZCBhcwotCQkJCWEgc2VhcmNoIHN0cmluZy4gPC9kb2N1bWVudGF0aW9uPgotCQk8L2Fubm90YXRpb24+Ci0JCTxjb21wbGV4Q29udGVudD4KLQkJCTxleHRlbnNpb24gYmFzZT0iaTA6Q3VzdElkZW50aWZpZXIiPgotCQkJCTxhdHRyaWJ1dGUgdXNlPSJyZXF1aXJlZCIgbmFtZT0iaWRObyIgdHlwZT0iaTA6SURObyIvPgotCQkJPC9leHRlbnNpb24+Ci0JCTwvY29tcGxleENvbnRlbnQ+Ci0JPC9jb21wbGV4VHlwZT4KLQk8IS0tQ3VzdElkZW50aWZpZXIgU3BlY2lhbGlzYXRpb24gRW5kcy0tPgotCTxjb21wbGV4VHlwZSBuYW1lPSJDdXN0RGV0YWlsIj4KLQkJPGFubm90YXRpb24+Ci0JCQk8ZG9jdW1lbnRhdGlvbj4gQ29udGFpbnMgdGhlIGRldGFpbHMgb2YgY3VzdG9tZXIuIDwvZG9jdW1lbnRhdGlvbj4KLQkJPC9hbm5vdGF0aW9uPgotCQkJPGF0dHJpYnV0ZSB1c2U9InJlcXVpcmVkIiAgbmFtZT0ibmFtZSIgdHlwZT0iaTA6UGVyc29uTmFtZSIvPgotCQkJPGF0dHJpYnV0ZSB1c2U9InJlcXVpcmVkIiBuYW1lPSJhZGRyZXNzIiB0eXBlPSJpMDpBZGRyZXNzIi8+Ci0JCQk8YXR0cmlidXRlIHVzZT0ib3B0aW9uYWwiIG5hbWU9ImNvbnRhY3RObyIgdHlwZT0iaTA6Q29udGFjdE5vIi8+Ci0JCQk8YXR0cmlidXRlIHVzZT0ib3B0aW9uYWwiIG5hbWU9ImFjY05vIiB0eXBlPSJpMDpBY2NvdW50Tm8iLz4KLQkJCTxhdHRyaWJ1dGUgdXNlPSJvcHRpb25hbCIgbmFtZT0ibG9jUmVmIiB0eXBlPSJpMDpMb2NSZWYiPgotCQkJCTxhbm5vdGF0aW9uPgotCQkJCQk8ZG9jdW1lbnRhdGlvbj4gQ29udGFpbnMgYW4gYWx0ZXJuYXRpdmUgcmVmZXJlbmNlIHRvIHRoZSBjdXN0b21lciBsb2NhdGlvbiwgc3VjaAotCQkJCQkJYXMgYSBFcmYgbnVtYmVyLiA8L2RvY3VtZW50YXRpb24+Ci0JCQkJPC9hbm5vdGF0aW9uPgotCQkJPC9hdHRyaWJ1dGU+Ci0JPC9jb21wbGV4VHlwZT4KLQk8Y29tcGxleFR5cGUgbmFtZT0iQ3VzdFZlbmREZXRhaWwiPgotCQk8Y29tcGxleENvbnRlbnQ+Ci0JCQk8ZXh0ZW5zaW9uIGJhc2U9ImkwOkN1c3REZXRhaWwiPgotCQkJCTxhdHRyaWJ1dGUgdXNlPSJvcHRpb25hbCIgbmFtZT0iZGF5c0xhc3RQdXJjaGFzZSIgdHlwZT0iaW50ZWdlciI+Ci0JCQkJCQk8YW5ub3RhdGlvbj4KLQkJCQkJCQk8ZG9jdW1lbnRhdGlvbj4gVGhlIG51bWJlciBvZiBkYXlzIHNpbmNlIHRoZSBjdXN0b21lciBsYXN0IHB1cmNoYXNlZCBhCi0JCQkJCQkJCXRva2VuLiBUeXBpY2FsbHkgdXNlZCB0byBjYWxjdWxhdGUgdGhlIHNlcnZpY2UgY2hhcmdlIGFwcGxpY2FibGUuCi0JCQkJCQkJPC9kb2N1bWVudGF0aW9uPgotCQkJCQkJPC9hbm5vdGF0aW9uPgotCQkJCSA8L2F0dHJpYnV0ZT4KLQkJCTwvZXh0ZW5zaW9uPgotCQk8L2NvbXBsZXhDb250ZW50PgotCTwvY29tcGxleFR5cGU+Ci0JPGNvbXBsZXhUeXBlIG5hbWU9IkN1cnJlbmN5Ij4KLQkJPGFubm90YXRpb24+Ci0JCQk8ZG9jdW1lbnRhdGlvbj4gQ29udGFpbnMgdGhlIGFtb3VudCBhbmQgY3VycmVuY3kgc3ltYm9sLiA8L2RvY3VtZW50YXRpb24+Ci0JCTwvYW5ub3RhdGlvbj4KLQkJPGF0dHJpYnV0ZSB1c2U9InJlcXVpcmVkIiBuYW1lPSJ2YWx1ZSIgdHlwZT0iZGVjaW1hbCIvPgotCQk8YXR0cmlidXRlIHVzZT0icmVxdWlyZWQiIG5hbWU9InN5bWJvbCIgdHlwZT0iaTA6Q3VycmVuY3lTeW1ib2wiPgotCQkJPGFubm90YXRpb24+Ci0JCQkJPGRvY3VtZW50YXRpb24+IFRoZSBzeW1ib2wgb2YgdGhlIGN1cnJlbmN5IHVzZWQsIGFzIHBlciBJU08gNDIxNy4gPC9kb2N1bWVudGF0aW9uPgotCQkJPC9hbm5vdGF0aW9uPgotCQk8L2F0dHJpYnV0ZT4KLQk8L2NvbXBsZXhUeXBlPgotCTxjb21wbGV4VHlwZSBuYW1lPSJEZXZpY2VJRCIgYWJzdHJhY3Q9InRydWUiPgotCQk8YW5ub3RhdGlvbj4KLQkJCTxkb2N1bWVudGF0aW9uPiBBYnN0cmFjdCBpZGVudGlmaWVyIGZvciB0aGUgY2xpZW50LCBzZXJ2ZXIgb3IgdGVybWluYWwuIDwvZG9jdW1lbnRhdGlvbj4KLQkJPC9hbm5vdGF0aW9uPgotCTwvY29tcGxleFR5cGU+Ci0JPGNvbXBsZXhUeXBlIG5hbWU9IkVBTkRldmljZUlEIj4KLQkJPGFubm90YXRpb24+Ci0JCQk8ZG9jdW1lbnRhdGlvbj4gVGhlIEVBTiBpcyBzaW1wbHkgYSAxMy1kaWdpdCBudW1iZXIgdXNlZCB0byB1bmlxdWVseSBpZGVudGlmeSB0aGUKLQkJCQljbGllbnQsIHNlcnZlciBvciB0ZXJtaW5hbC4gSXRzIGJhc2ljIGNvbXBvbmVudHMgYXJlOiBBbiBFQU4uVUNDIENvbXBhbnkgUHJlZml4LCBhCi0JCQkJTG9jYXRpb24gUmVmZXJlbmNlIGFuZCBhIENoZWNrIERpZ2l0LiA8L2RvY3VtZW50YXRpb24+Ci0JCTwvYW5ub3RhdGlvbj4KLQkJPGNvbXBsZXhDb250ZW50PgotCQkJPGV4dGVuc2lvbiBiYXNlPSJpMDpEZXZpY2VJRCI+Ci0JCQkJPGF0dHJpYnV0ZSB1c2U9InJlcXVpcmVkIiBuYW1lPSJlYW4iIHR5cGU9ImkwOkVBTiIvPgotCQkJPC9leHRlbnNpb24+Ci0JCTwvY29tcGxleENvbnRlbnQ+Ci0JPC9jb21wbGV4VHlwZT4KLQk8Y29tcGxleFR5cGUgbmFtZT0iR2VuZXJpY0RldmljZUlEIj4KLQkJPGFubm90YXRpb24+Ci0JCQk8ZG9jdW1lbnRhdGlvbj4gVGhpcyBpcyBhIGdlbmVyaWMgaWRlbnRpZmllciwgdGhhdCBtYXkgYmUgdXNlZCB0byBpZGVudGlmaWVyIGEgY2xpZW50LAotCQkJCXNlcnZlciBvciB0ZXJtaW5hbC4gSXQgaXMgaG93ZXZlciByZWNvbW1lbmRlZCB0aGF0IGl0IGJlIHVzZWQgZm9yIHRlcm1pbmFscyBvbmx5IGFuZAotCQkJCUVBTidzIHVzZWQgZm9yIGNsaWVudHMgYW5kIHNlcnZlcnMuIDwvZG9jdW1lbnRhdGlvbj4KLQkJPC9hbm5vdGF0aW9uPgotCQk8Y29tcGxleENvbnRlbnQ+Ci0JCQk8ZXh0ZW5zaW9uIGJhc2U9ImkwOkRldmljZUlEIj4KLQkJCQk8YXR0cmlidXRlIHVzZT0icmVxdWlyZWQiIG5hbWU9ImlkIiB0eXBlPSJpMDpNc2ciLz4KLQkJCTwvZXh0ZW5zaW9uPgotCQk8L2NvbXBsZXhDb250ZW50PgotCTwvY29tcGxleFR5cGU+Ci0JPCEtLU1ldGVyU3BlY2lmaWNUb2tlbklzc3VlIFNwZWNpYWxpYXRpb25zLS0+Ci0JPGNvbXBsZXhUeXBlIG5hbWU9Ik1ldGVyU3BlY2lmaWNUb2tlbklzc3VlIiBhYnN0cmFjdD0idHJ1ZSI+Ci0JCTxhbm5vdGF0aW9uPgotCQkJPGRvY3VtZW50YXRpb24+VG9rZW4gaW5mb3JtYXRpb24gZm9yIGEgc3BlY2lmaWMgbWV0ZXIuIDwvZG9jdW1lbnRhdGlvbj4KLQkJPC9hbm5vdGF0aW9uPgotCQk8c2VxdWVuY2U+Ci0JCQk8ZWxlbWVudCBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgbmFtZT0iZGVzYyIgdHlwZT0iaTA6TXNnIj4KLQkJCQk8YW5ub3RhdGlvbj4KLQkJCQkJPGRvY3VtZW50YXRpb24+Ci0JCQkJCQlEZXNjcmlwdGlvbiBvZiB0aGUgbWV0ZXIgc3BlY2lmaWMgdG9rZW4gaXNzdWUsIGVnLiBQcmVwYXltZW50IFNhbGUsIEtleSBDaGFuZ2UgCi0JCQkJCTwvZG9jdW1lbnRhdGlvbj4KLQkJCQk8L2Fubm90YXRpb24+Ci0JCQk8L2VsZW1lbnQ+Ci0JCQk8ZWxlbWVudCBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgbmFtZT0ibWV0ZXJEZXRhaWwiIHR5cGU9ImkwOk1ldGVyRGV0YWlsIj4KLQkJCQk8YW5ub3RhdGlvbj4KLQkJCQkJPGRvY3VtZW50YXRpb24+IERldGFpbHMgYWJvdXQgdGhlIG1ldGVyIHdoZXJlIHRoZSB0b2tlbiB3aWxsIGJlIGVudGVyZWQuIEluIHRoZQotCQkJCQkJY2FzZSBvZiBLQ1Rva2VuSXNzdWUsIGl0IHdpbGwgYmUgY29udGFpbiB0aGUgdXBkYXRlZCAoVG8pIG1ldGVyIGtleSBkYXRhLgotCQkJCQk8L2RvY3VtZW50YXRpb24+Ci0JCQkJPC9hbm5vdGF0aW9uPgotCQkJPC9lbGVtZW50PgotCQkJPGVsZW1lbnQgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIG5hbWU9InRva2VuIiB0eXBlPSJpMDpUb2tlbiI+Ci0JCQkJPGFubm90YXRpb24+Ci0JCQkJCTxkb2N1bWVudGF0aW9uPiBUaGUgY2lwaGVyIHRoYXQgd2lsbCBiZSBlbnRlcmVkIGludG8gdGhlIG1ldGVyIGFzIHBlciB0aGUgQVQgb2YKLQkJCQkJCXRoZSBtZXRlci4gPC9kb2N1bWVudGF0aW9uPgotCQkJCTwvYW5ub3RhdGlvbj4KLQkJCTwvZWxlbWVudD4KLQkJPC9zZXF1ZW5jZT4KLQk8L2NvbXBsZXhUeXBlPgotCTxjb21wbGV4VHlwZSBuYW1lPSJDcmVkaXRUb2tlbklzc3VlIj4KLQkJPGFubm90YXRpb24+Ci0JCQk8ZG9jdW1lbnRhdGlvbj4gSW5mb3JtYXRpb24gdGhhdCBpcyByZXR1cm5lZCB3aXRoIGFsbCBjcmVkaXQgdG9rZW5zIHRoYXQgYXJlIHZlbmRlZCBieQotCQkJCXRoZSBzZXJ2ZXIuIDwvZG9jdW1lbnRhdGlvbj4KLQkJPC9hbm5vdGF0aW9uPgotCQk8Y29tcGxleENvbnRlbnQ+Ci0JCQk8ZXh0ZW5zaW9uIGJhc2U9ImkwOk1ldGVyU3BlY2lmaWNUb2tlbklzc3VlIj4KLQkJCQk8c2VxdWVuY2U+Ci0JCQkJCTxlbGVtZW50IG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiBuYW1lPSJ1bml0cyIgdHlwZT0iaTA6VW5pdHMiLz4KLQkJCQkJPGVsZW1lbnQgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIG5hbWU9InJlc291cmNlIiB0eXBlPSJpMDpSZXNvdXJjZSI+Ci0JCQkJCQk8YW5ub3RhdGlvbj4KLQkJCQkJCQk8ZG9jdW1lbnRhdGlvbj4gVGhlIHR5cGUgb2YgcmVzb3VyY2UgYmVpbmcgdmVuZGVkLCBlLmcuIEVsZWN0cmljaXR5LAotCQkJCQkJCQl3YXRlci4uLiA8L2RvY3VtZW50YXRpb24+Ci0JCQkJCQk8L2Fubm90YXRpb24+Ci0JCQkJCTwvZWxlbWVudD4KLQkJCQk8L3NlcXVlbmNlPgotCQkJPC9leHRlbnNpb24+Ci0JCTwvY29tcGxleENvbnRlbnQ+Ci0JPC9jb21wbGV4VHlwZT4KLQk8IS0tIENyZWRpdCBUb2tlbiBJc3N1ZSBTcGVjaWFsaXNhdGlvbnMgLS0+Ci0JPGNvbXBsZXhUeXBlIG5hbWU9IlNhbGVDcmVkVG9rZW5Jc3N1ZSI+Ci0JCTxhbm5vdGF0aW9uPgotCQkJPGRvY3VtZW50YXRpb24+Ci0JCQkJQ3JlZGl0IFRva2VuIGlzc3VlIHJldHVybmVkIGZvciBhIG5vcm1hbCBwcmVwYXltZW50IHNhbGUgdG9rZW4uIE1hcHMgdG8gdHJhbnNhY3Rpb24gdHlwZSwgMDAwIC0gUHJlcGF5bWVudCBTYWxlLCBOUlMwMDktMy4KLQkJCTwvZG9jdW1lbnRhdGlvbj4KLQkJPC9hbm5vdGF0aW9uPgotCQk8Y29tcGxleENvbnRlbnQ+Ci0JCQk8ZXh0ZW5zaW9uIGJhc2U9ImkwOkNyZWRpdFRva2VuSXNzdWUiLz4KLQkJPC9jb21wbGV4Q29udGVudD4KLQk8L2NvbXBsZXhUeXBlPgotCTxjb21wbGV4VHlwZSBuYW1lPSJGQkVDcmVkVG9rZW5Jc3N1ZSI+Ci0JCTxhbm5vdGF0aW9uPgotCQkJPGRvY3VtZW50YXRpb24+Ci0JCQkJQ3JlZGl0IFRva2VuIGlzc3VlIHJldHVybmVkIGZvciBhIGZyZWUgYmFzaWMgZWxlY3RyaWNpdHkgdG9rZW4uIE1hcHMgdG8gdHJhbnNhY3Rpb24gdHlwZSwgMDEwIC0gRkJFIHRva2VuLCBOUlMwMDktMy4KLQkJCTwvZG9jdW1lbnRhdGlvbj4KLQkJPC9hbm5vdGF0aW9uPgotCQk8Y29tcGxleENvbnRlbnQ+Ci0JCQk8ZXh0ZW5zaW9uIGJhc2U9ImkwOkNyZWRpdFRva2VuSXNzdWUiLz4KLQkJPC9jb21wbGV4Q29udGVudD4KLQk8L2NvbXBsZXhUeXBlPgotCTxjb21wbGV4VHlwZSBuYW1lPSJGcmVlQ3JlZFRva2VuSXNzdWUiPgotCQk8YW5ub3RhdGlvbj4KLQkJCTxkb2N1bWVudGF0aW9uPgotCQkJCUNyZWRpdCBUb2tlbiBpc3N1ZSByZXR1cm5lZCBmb3IgYSBmcmVlIHRva2VuLiBNYXBzIHRvIHRyYW5zYWN0aW9uIHR5cGUsIDAwNSAtIEZyZWUgSXNzdWUsIE5SUzAwOS0zLgotCQkJPC9kb2N1bWVudGF0aW9uPgotCQk8L2Fubm90YXRpb24+Ci0JCTxjb21wbGV4Q29udGVudD4KLQkJCTxleHRlbnNpb24gYmFzZT0iaTA6Q3JlZGl0VG9rZW5Jc3N1ZSIvPgotCQk8L2NvbXBsZXhDb250ZW50PgotCTwvY29tcGxleFR5cGU+Ci0JPGNvbXBsZXhUeXBlIG5hbWU9Ik1DVENyZWRUb2tlbklzc3VlIj4KLQkJPGFubm90YXRpb24+Ci0JCQk8ZG9jdW1lbnRhdGlvbj4KLQkJCQlDcmVkaXQgVG9rZW4gaXNzdWUgcmV0dXJuZWQgZm9yIGEgbWV0ZXIgY3JlZGl0IHRyYW5zZmVyIHRva2VuLiBNYXBzIHRvIHRyYW5zYWN0aW9uIHR5cGUsIDAwMyAtIFJlcGxhY2VtZW50LCBOUlMwMDktMy4KLQkJCTwvZG9jdW1lbnRhdGlvbj4KLQkJPC9hbm5vdGF0aW9uPgotCQk8Y29tcGxleENvbnRlbnQ+Ci0JCQk8ZXh0ZW5zaW9uIGJhc2U9ImkwOkNyZWRpdFRva2VuSXNzdWUiLz4KLQkJPC9jb21wbGV4Q29udGVudD4KLQk8L2NvbXBsZXhUeXBlPgotCQotCTxjb21wbGV4VHlwZSBuYW1lPSJNZXRlclNwZWNpZmljRW5nVG9rZW5Jc3N1ZSIgYWJzdHJhY3Q9InRydWUiPgotCQk8YW5ub3RhdGlvbj4KLQkJCTxkb2N1bWVudGF0aW9uPiBHZW5lcmljIE1ldGVyIHNwZWNpZmljIGVuZ2luZWVyaW5nIHRva2VuIGlzc3VlLiA8L2RvY3VtZW50YXRpb24+Ci0JCTwvYW5ub3RhdGlvbj4KLQkJPGNvbXBsZXhDb250ZW50PgotCQkJPGV4dGVuc2lvbiBiYXNlPSJpMDpNZXRlclNwZWNpZmljVG9rZW5Jc3N1ZSIvPgotCQk8L2NvbXBsZXhDb250ZW50PgotCTwvY29tcGxleFR5cGU+Ci0JPCEtLU1ldGVyU3BlY2lmaWNFbmdUb2tlbklzc3VlIFNwZWNpYWxpYXRpb25zLS0+Ci0JPGNvbXBsZXhUeXBlIG5hbWU9IktDVG9rZW5Jc3N1ZSI+Ci0JCTxhbm5vdGF0aW9uPgotCQkJPGRvY3VtZW50YXRpb24+IEluZm9ybWF0aW9uIHJldHVybmVkIHdpdGggYWxsIEtleSBDaGFuZ2UgVG9rZW4gaXNzdWVzLiA8L2RvY3VtZW50YXRpb24+Ci0JCTwvYW5ub3RhdGlvbj4KLQkJPGNvbXBsZXhDb250ZW50PgotCQkJPGV4dGVuc2lvbiBiYXNlPSJpMDpNZXRlclNwZWNpZmljRW5nVG9rZW5Jc3N1ZSI+Ci0JCQkJPHNlcXVlbmNlPgotCQkJCQk8ZWxlbWVudCBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgbmFtZT0ia2N0RGF0YSIgdHlwZT0iaTA6S0NURGF0YSI+Ci0JCQkJCQk8YW5ub3RhdGlvbj4KLQkJCQkJCQk8ZG9jdW1lbnRhdGlvbj4gVGhlIEZST00gYW5kIFRPIG1ldGVyIGtleSBkYXRhLiA8L2RvY3VtZW50YXRpb24+Ci0JCQkJCQk8L2Fubm90YXRpb24+Ci0JCQkJCTwvZWxlbWVudD4KLQkJCQkJPGVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9InB3ckxtdFRva2VuIgotCQkJCQkJdHlwZT0iaTA6UHdyTG10VG9rZW5Jc3N1ZSI+Ci0JCQkJCQk8YW5ub3RhdGlvbj4KLQkJCQkJCQk8ZG9jdW1lbnRhdGlvbj4gQSBwb3dlciBsaW1pdCB0b2tlbiB0aGF0IG1hdGNoZXMgdGhlIHNwZWNpZmljIHRhcmlmZgotCQkJCQkJCQlpbmRleCB0aGF0IGlzIGJlaW5nIHVwZGF0ZWQuIDwvZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwvYW5ub3RhdGlvbj4KLQkJCQkJPC9lbGVtZW50PgotCQkJCTwvc2VxdWVuY2U+Ci0JCQk8L2V4dGVuc2lvbj4KLQkJPC9jb21wbGV4Q29udGVudD4KLQk8L2NvbXBsZXhUeXBlPgotCTxjb21wbGV4VHlwZSBuYW1lPSJQd3JMbXRUb2tlbklzc3VlIj4KLQkJPGFubm90YXRpb24+Ci0JCQk8ZG9jdW1lbnRhdGlvbj4gRGV0YWlscyBvZiB0aGUgcG93ZXIgbGltaXQgdG9rZW4gYmVpbmcgaXNzdWVkLiA8L2RvY3VtZW50YXRpb24+Ci0JCTwvYW5ub3RhdGlvbj4KLQkJPGNvbXBsZXhDb250ZW50PgotCQkJPGV4dGVuc2lvbiBiYXNlPSJpMDpNZXRlclNwZWNpZmljRW5nVG9rZW5Jc3N1ZSI+Ci0JCQkJPHNlcXVlbmNlPgotCQkJCQk8ZWxlbWVudCBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgbmFtZT0icHdyTG10IiB0eXBlPSJpMDpQd3JMbXQiPgotCQkJCQkJPGFubm90YXRpb24+Ci0JCQkJCQkJPGRvY3VtZW50YXRpb24+IFRoZSBwb3dlciBsaW1pdCB2YWx1ZSB0aGF0IHRoZSBtZXRlciB3aWxsIGJlIHNldCB0by4KLQkJCQkJCQk8L2RvY3VtZW50YXRpb24+Ci0JCQkJCQk8L2Fubm90YXRpb24+Ci0JCQkJCTwvZWxlbWVudD4KLQkJCQk8L3NlcXVlbmNlPgotCQkJPC9leHRlbnNpb24+Ci0JCTwvY29tcGxleENvbnRlbnQ+Ci0JPC9jb21wbGV4VHlwZT4KLQk8Y29tcGxleFR5cGUgbmFtZT0iUGhVbmJhbFRva2VuSXNzdWUiPgotCQk8Y29tcGxleENvbnRlbnQ+Ci0JCQk8ZXh0ZW5zaW9uIGJhc2U9ImkwOk1ldGVyU3BlY2lmaWNFbmdUb2tlbklzc3VlIj4KLQkJCQk8c2VxdWVuY2U+Ci0JCQkJCTxlbGVtZW50IG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiBuYW1lPSJwd3JMbXQiIHR5cGU9ImkwOlB3ckxtdCIvPgotCQkJCTwvc2VxdWVuY2U+Ci0JCQk8L2V4dGVuc2lvbj4KLQkJPC9jb21wbGV4Q29udGVudD4KLQk8L2NvbXBsZXhUeXBlPgotCTxjb21wbGV4VHlwZSBuYW1lPSJDbGVhckNyZWRpdFRva2VuSXNzdWUiPgotCQk8Y29tcGxleENvbnRlbnQ+Ci0JCQk8ZXh0ZW5zaW9uIGJhc2U9ImkwOk1ldGVyU3BlY2lmaWNFbmdUb2tlbklzc3VlIi8+Ci0JCTwvY29tcGxleENvbnRlbnQ+Ci0JPC9jb21wbGV4VHlwZT4KLQk8Y29tcGxleFR5cGUgbmFtZT0iQ2xlYXJUYW1wZXJUb2tlbklzc3VlIj4KLQkJPGNvbXBsZXhDb250ZW50PgotCQkJPGV4dGVuc2lvbiBiYXNlPSJpMDpNZXRlclNwZWNpZmljRW5nVG9rZW5Jc3N1ZSIvPgotCQk8L2NvbXBsZXhDb250ZW50PgotCTwvY29tcGxleFR5cGU+Ci0JPGNvbXBsZXhUeXBlIG5hbWU9IldhdGVyRmFjdG9yVG9rZW5Jc3N1ZSI+Ci0JCTxjb21wbGV4Q29udGVudD4KLQkJCTxleHRlbnNpb24gYmFzZT0iaTA6TWV0ZXJTcGVjaWZpY0VuZ1Rva2VuSXNzdWUiPgotCQkJCTxzZXF1ZW5jZT4KLQkJCQkJPGVsZW1lbnQgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIG5hbWU9IndhdGVyRmFjdG9yIiB0eXBlPSJpMDpXYXRlckZhY3RvciIvPgotCQkJCTwvc2VxdWVuY2U+Ci0JCQk8L2V4dGVuc2lvbj4KLQkJPC9jb21wbGV4Q29udGVudD4KLQk8L2NvbXBsZXhUeXBlPgotCTwhLS1NZXRlclNwZWNpZmljRW5nVG9rZW5Jc3N1ZSBTcGVjaWFsaXNhdGlvbnMgRW5kcy0tPgotCTwhLS1JRE1ldGhvZCBTcGVjaWFsaXNhdGlvbiAtLT4KLQk8Y29tcGxleFR5cGUgbmFtZT0iSURNZXRob2QiIGFic3RyYWN0PSJ0cnVlIi8+Ci0JPGNvbXBsZXhUeXBlIG5hbWU9IkN1c3RJRE1ldGhvZCI+Ci0JCTxhbm5vdGF0aW9uPgotCQkJPGRvY3VtZW50YXRpb24+IElkZW50aWZpZXIgdXNlZCB0byBpZGVudGlmeSB0aGUgY3VzdG9tZXIuIDwvZG9jdW1lbnRhdGlvbj4KLQkJPC9hbm5vdGF0aW9uPgotCQk8Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLQkJCTxleHRlbnNpb24gYmFzZT0iaTA6SURNZXRob2QiPgotCQkJCTxzZXF1ZW5jZT4KLQkJCQkJPGVsZW1lbnQgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIG5hbWU9ImN1c3RJZGVudGlmaWVyIgotCQkJCQkJdHlwZT0iaTA6Q3VzdElkZW50aWZpZXIiLz4KLQkJCQk8L3NlcXVlbmNlPgotCQkJPC9leHRlbnNpb24+Ci0JCTwvY29tcGxleENvbnRlbnQ+Ci0JPC9jb21wbGV4VHlwZT4KLQk8Y29tcGxleFR5cGUgbmFtZT0iVmVuZElETWV0aG9kIj4KLQkJPGFubm90YXRpb24+Ci0JCQk8ZG9jdW1lbnRhdGlvbj4gVGhpcyBpZGVudGlmaWVyIGlzIHR5cGljYWxseSB1c2VkIHRvIGlkZW50Zml5IHRoZSBtZXRlciB3aGVyZSB0aGUKLQkJCQlyZXF1ZXN0ZWQgdG9rZW4gd2lsbCBiZSBlbnRlcmVkLiA8L2RvY3VtZW50YXRpb24+Ci0JCTwvYW5ub3RhdGlvbj4KLQkJPGNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0JCQk8ZXh0ZW5zaW9uIGJhc2U9ImkwOklETWV0aG9kIj4KLQkJCQk8c2VxdWVuY2U+Ci0JCQkJCTxlbGVtZW50IG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiBuYW1lPSJtZXRlcklkZW50aWZpZXIiCi0JCQkJCQl0eXBlPSJpMDpNZXRlcklkZW50aWZpZXIiPgotCQkJCQkJPGFubm90YXRpb24+Ci0JCQkJCQkJPGRvY3VtZW50YXRpb24+IElkZW50aWZpZXIgdGhhdCBpZGVudGlmeSB0aGUgc3BlY2lmaWMgbWV0ZXIgd2hlcmUgdGhlCi0JCQkJCQkJCXRva2VuIHdpbGwgYmUgZW50ZXJlZC4gPC9kb2N1bWVudGF0aW9uPgotCQkJCQkJPC9hbm5vdGF0aW9uPgotCQkJCQk8L2VsZW1lbnQ+Ci0JCQkJPC9zZXF1ZW5jZT4KLQkJCTwvZXh0ZW5zaW9uPgotCQk8L2NvbXBsZXhDb250ZW50PgotCTwvY29tcGxleFR5cGU+Ci0JPCEtLUlETWV0aG9kIFNwZWNpYWxpc2F0aW9uIEVuZHMgLS0+Ci0JPGNvbXBsZXhUeXBlIG5hbWU9IktDVERhdGEiPgotCQk8YW5ub3RhdGlvbj4KLQkJCTxkb2N1bWVudGF0aW9uPiBUaGUgRlJPTSBhbmQgVE8gbWV0ZXIga2V5IGRhdGEuIDwvZG9jdW1lbnRhdGlvbj4KLQkJPC9hbm5vdGF0aW9uPgotCQk8YXR0cmlidXRlIHVzZT0icmVxdWlyZWQiIG5hbWU9ImZyb21TR0MiIHR5cGU9ImkwOlNUU1N1cHBseUdyb3VwQ29kZSI+Ci0JCQkJPGFubm90YXRpb24+Ci0JCQkJCTxkb2N1bWVudGF0aW9uPiBUaGUgY3VycmVudCBtZXRlciBzdXBwbHkgZ3JvdXAgY29kZShTR0MpLiA8L2RvY3VtZW50YXRpb24+Ci0JCQkJPC9hbm5vdGF0aW9uPgotCQk8L2F0dHJpYnV0ZT4KLQkJPGF0dHJpYnV0ZSB1c2U9InJlcXVpcmVkIiBuYW1lPSJmcm9tS1JOIiB0eXBlPSJpMDpTVFNLZXlSZXZObyI+Ci0JCQkJPGFubm90YXRpb24+Ci0JCQkJCTxkb2N1bWVudGF0aW9uPiBUaGUgY3VycmVudCBtZXRlciBrZXkgcmV2aXNpb24gbnVtYmVyIChLUk4pIGZvciB0aGUgU0dDLgotCQkJCQk8L2RvY3VtZW50YXRpb24+Ci0JCQkJPC9hbm5vdGF0aW9uPgotCQk8L2F0dHJpYnV0ZT4KLQkJPGF0dHJpYnV0ZSB1c2U9InJlcXVpcmVkIiBuYW1lPSJmcm9tVEkiIHR5cGU9ImkwOlNUU1RhcmlmZkluZGV4Ij4KLQkJCQk8YW5ub3RhdGlvbj4KLQkJCQkJPGRvY3VtZW50YXRpb24+IFRoZSBjdXJyZW50IG1ldGVyIHRhcmlmZiBpbmRleCAoVEkpLiA8L2RvY3VtZW50YXRpb24+Ci0JCQkJPC9hbm5vdGF0aW9uPgotCQk8L2F0dHJpYnV0ZT4KLQkJPGF0dHJpYnV0ZSB1c2U9InJlcXVpcmVkIiBuYW1lPSJ0b1NHQyIgdHlwZT0iaTA6U1RTU3VwcGx5R3JvdXBDb2RlIj4KLQkJCQk8YW5ub3RhdGlvbj4KLQkJCQkJPGRvY3VtZW50YXRpb24+IFRoZSBuZXcgU0dDLiA8L2RvY3VtZW50YXRpb24+Ci0JCQkJPC9hbm5vdGF0aW9uPgotCQk8L2F0dHJpYnV0ZT4KLQkJPGF0dHJpYnV0ZSB1c2U9InJlcXVpcmVkIiBuYW1lPSJ0b0tSTiIgdHlwZT0iaTA6U1RTS2V5UmV2Tm8iPgotCQkJCTxhbm5vdGF0aW9uPgotCQkJCQk8ZG9jdW1lbnRhdGlvbj4gVGhlIG5ldyBLUk4uIDwvZG9jdW1lbnRhdGlvbj4KLQkJCQk8L2Fubm90YXRpb24+Ci0JCTwvYXR0cmlidXRlPgotCQk8YXR0cmlidXRlIHVzZT0icmVxdWlyZWQiIG5hbWU9InRvVEkiIHR5cGU9ImkwOlNUU1RhcmlmZkluZGV4Ij4KLQkJCQk8YW5ub3RhdGlvbj4KLQkJCQkJPGRvY3VtZW50YXRpb24+IFRoZSBuZXcgVEkuIDwvZG9jdW1lbnRhdGlvbj4KLQkJCQk8L2Fubm90YXRpb24+Ci0JCTwvYXR0cmlidXRlPgotCTwvY29tcGxleFR5cGU+Ci0JPGNvbXBsZXhUeXBlIG5hbWU9Ik1ldGVyVHlwZSI+Ci0JCTxhdHRyaWJ1dGUgdXNlPSJyZXF1aXJlZCIgbmFtZT0iYXQiIHR5cGU9ImkwOlNUU0FUIi8+Ci0JCTxhdHRyaWJ1dGUgdXNlPSJyZXF1aXJlZCIgbmFtZT0idHQiIHR5cGU9ImkwOlNUU1RUIi8+Ci0JPC9jb21wbGV4VHlwZT4KLQk8IS0tTWV0ZXJJZGVudGlmaWVyIFNwZWNpYWxpc2F0aW9uIC0tPgotCTxjb21wbGV4VHlwZSBuYW1lPSJNZXRlcklkZW50aWZpZXIiIGFic3RyYWN0PSJ0cnVlIi8+Ci0JPGNvbXBsZXhUeXBlIG5hbWU9Ik1ldGVyTnVtYmVyIj4KLQkJPGNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0JCQk8ZXh0ZW5zaW9uIGJhc2U9ImkwOk1ldGVySWRlbnRpZmllciI+Ci0JCQkJPGF0dHJpYnV0ZSB1c2U9InJlcXVpcmVkIiBuYW1lPSJtc25vIiB0eXBlPSJpMDpNU05PIi8+Ci0JCQk8L2V4dGVuc2lvbj4KLQkJPC9jb21wbGV4Q29udGVudD4KLQk8L2NvbXBsZXhUeXBlPgotCTxjb21wbGV4VHlwZSBuYW1lPSJNZXRlckNvbmZpZyIgYWJzdHJhY3Q9InRydWUiPgotCQk8YW5ub3RhdGlvbj4KLQkJCTxkb2N1bWVudGF0aW9uPiBDb250YWlucyBhbGwgaW5mb3JtYXRpb24gdGhhdCBkZXNjcmliZXMgdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIG1ldGVyLgotCQkJPC9kb2N1bWVudGF0aW9uPgotCQk8L2Fubm90YXRpb24+Ci0JCTxjb21wbGV4Q29udGVudD4KLQkJCTxleHRlbnNpb24gYmFzZT0iaTA6TWV0ZXJJZGVudGlmaWVyIi8+Ci0JCTwvY29tcGxleENvbnRlbnQ+Ci0JPC9jb21wbGV4VHlwZT4KLQk8Y29tcGxleFR5cGUgbmFtZT0iTWV0ZXJDYXJkIj4KLQkJPGFubm90YXRpb24+Ci0JCQk8ZG9jdW1lbnRhdGlvbj4gVGhlIG1ldGVyIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gYXMgb2J0YWluZWQgZnJvbSB0aGUgbWV0ZXIgY2FyZCwgYXMKLQkJCQlwZXIgTlJTMDA5LTQtMS4gPC9kb2N1bWVudGF0aW9uPgotCQk8L2Fubm90YXRpb24+Ci0JCTxjb21wbGV4Q29udGVudD4KLQkJCTxleHRlbnNpb24gYmFzZT0iaTA6TWV0ZXJDb25maWciPgotCQkJCTxzZXF1ZW5jZT4KLQkJCQkJPGVsZW1lbnQgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIG5hbWU9InRyYWNrMkRhdGEiIHR5cGU9ImkwOk5SU1RyYWNrMkRhdGEiLz4KLQkJCQk8L3NlcXVlbmNlPgotCQkJPC9leHRlbnNpb24+Ci0JCTwvY29tcGxleENvbnRlbnQ+Ci0JPC9jb21wbGV4VHlwZT4KLQk8Y29tcGxleFR5cGUgbmFtZT0iTWV0ZXJEZXRhaWwiPgotCQk8YW5ub3RhdGlvbj4KLQkJCTxkb2N1bWVudGF0aW9uPiBUaGUgbWV0ZXIgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBhcyBvYnRhaW5lZCBmcm9tIGEgbWV0ZXIgY2FyZCBvciBvbGQKLQkJCQl0b2tlbiBvciBzb21lIG90aGVyIHNvdXJjZSB3aGVyZSBhbGwgdGhlIG1ldGVyIGNvbmZpZ3VyYXRpb24gZGF0YSBpcyBhdmFpbGFibGUuCi0JCQk8L2RvY3VtZW50YXRpb24+Ci0JCTwvYW5ub3RhdGlvbj4KLQkJPGNvbXBsZXhDb250ZW50PgotCQkJPGV4dGVuc2lvbiBiYXNlPSJpMDpNZXRlckNvbmZpZyI+Ci0JCQkJPHNlcXVlbmNlPgotCQkJCQk8ZWxlbWVudCBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgbmFtZT0ibWV0ZXJUeXBlIiB0eXBlPSJpMDpNZXRlclR5cGUiLz4KLQkJCQkJCi0JCQkJPC9zZXF1ZW5jZT4KLQkJCQk8YXR0cmlidXRlIHVzZT0icmVxdWlyZWQiIG5hbWU9Im1zbm8iIHR5cGU9ImkwOk1TTk8iLz4KLQkJCQk8YXR0cmlidXRlIHVzZT0icmVxdWlyZWQiIG5hbWU9InNnYyIgdHlwZT0iaTA6U1RTU3VwcGx5R3JvdXBDb2RlIi8+Ci0JCQkJPGF0dHJpYnV0ZSB1c2U9InJlcXVpcmVkIiBuYW1lPSJrcm4iIHR5cGU9ImkwOlNUU0tleVJldk5vIi8+Ci0JCQkJPGF0dHJpYnV0ZSB1c2U9InJlcXVpcmVkIiBuYW1lPSJ0aSIgdHlwZT0iaTA6U1RTVGFyaWZmSW5kZXgiLz4KLQkJCQkKLQkJCTwvZXh0ZW5zaW9uPgotCQk8L2NvbXBsZXhDb250ZW50PgotCTwvY29tcGxleFR5cGU+Ci0JPGNvbXBsZXhUeXBlIG5hbWU9IkV4dE1ldGVyRGV0YWlsIj4KLQkJPGFubm90YXRpb24+Ci0JCQk8ZG9jdW1lbnRhdGlvbj4gRXh0ZW5zaW9uIG9mIHRoZSBtZXRlciBkZXRhaWwsIHRvIGluY2x1ZGUgZnVydGhlciBpbmZvcm1hdGlvbiBhYm91dCB0aGUKLQkJCQltZXRlci4gPC9kb2N1bWVudGF0aW9uPgotCQk8L2Fubm90YXRpb24+Ci0JCTxjb21wbGV4Q29udGVudD4KLQkJCTxleHRlbnNpb24gYmFzZT0iaTA6TWV0ZXJEZXRhaWwiPgotCQkJCTxhdHRyaWJ1dGUgdXNlPSJvcHRpb25hbCIgbmFtZT0idXNlU1RUIiB0eXBlPSJib29sZWFuIj4KLQkJCQkJCTxhbm5vdGF0aW9uPgotCQkJCQkJCTxkb2N1bWVudGF0aW9uPiBUb2tlbiBnZW5lcmF0ZWQgd2l0aCBhIFN0YW5kYXJkIFRva2VuIFRyYW5zbGF0b3IgKFNUVCkuCi0JCQkJCQkJPC9kb2N1bWVudGF0aW9uPgotCQkJCQkJPC9hbm5vdGF0aW9uPgotCQkJCTwvYXR0cmlidXRlPgotCQkJCTxhdHRyaWJ1dGUgdXNlPSJyZXF1aXJlZCIgbmFtZT0idHJhY2syRGF0YSIgdHlwZT0iaTA6TlJTVHJhY2syRGF0YSI+Ci0JCQkJCQk8YW5ub3RhdGlvbj4KLQkJCQkJCQk8ZG9jdW1lbnRhdGlvbj4gQ29udGFpbmluZyB0aGUgbWV0ZXIgY2FyZHMgdHJhY2sgMiBkYXRhLCBhcyBwZXIKLQkJCQkJCQkJTlJTMDA5LTQtMS4gPC9kb2N1bWVudGF0aW9uPgotCQkJCQkJPC9hbm5vdGF0aW9uPgotCQkJCTwvYXR0cmlidXRlPgkJCQotCQkJPC9leHRlbnNpb24+Ci0JCTwvY29tcGxleENvbnRlbnQ+Ci0JPC9jb21wbGV4VHlwZT4KLQk8IS0tTWV0ZXJJZGVudGlmaWVyIFNwZWNpYWxpc2F0aW9uIEVuZHMgLS0+Ci0JPGNvbXBsZXhUeXBlIG5hbWU9Ik1zZ0lEIj4KLQkJPGFubm90YXRpb24+Ci0JCQk8ZG9jdW1lbnRhdGlvbj4gU2VxdWVudGlhbCBpZGVudGlmaWVyIHRoYXQgYWxsb3dzIGVhY2ggY2xpZW50IHJlcXVlc3QgbWVzc2FnZSB0byBiZQotCQkJCXVuaXF1ZWx5IGlkZW50aWZpZWQuIDwvZG9jdW1lbnRhdGlvbj4KLQkJPC9hbm5vdGF0aW9uPgotCQk8YXR0cmlidXRlIHVzZT0icmVxdWlyZWQiIG5hbWU9ImRhdGVUaW1lIiB0eXBlPSJpMDpNc2dJRERhdGVUaW1lIi8+Ci0JCTxhdHRyaWJ1dGUgdXNlPSJyZXF1aXJlZCIgbmFtZT0idW5pcXVlTnVtYmVyIiB0eXBlPSJpMDpNc2dJRFVuaXF1ZU51bWJlciIvPgotCTwvY29tcGxleFR5cGU+Ci0JPCEtLVBheSBUeXBlIFNwZWNpYWxpc2F0aW9ucyAtLT4KLQk8Y29tcGxleFR5cGUgbmFtZT0iUGF5VHlwZSIgYWJzdHJhY3Q9InRydWUiPgotCQk8YW5ub3RhdGlvbj4KLQkJCTxkb2N1bWVudGF0aW9uPiBJbmRpY2F0ZXMgdGhlIG1lY2hhbmlzbSB1c2VkIHRvIHBheS4gSXQgaXMgZXh0ZW5kZWQgdG8gYWxsb3cgZm9yCi0JCQkJZGlmZmVyZW50IHR5cGVzIG9mIHBheW1lbnQgbWVjaGFuaXNtcy4gPC9kb2N1bWVudGF0aW9uPgotCQk8L2Fubm90YXRpb24+Ci0JPC9jb21wbGV4VHlwZT4KLQk8Y29tcGxleFR5cGUgbmFtZT0iQ2FzaCI+Ci0JCTxjb21wbGV4Q29udGVudD4KLQkJCTxleHRlbnNpb24gYmFzZT0iaTA6UGF5VHlwZSI+Ci0JCQkJPHNlcXVlbmNlPgotCQkJCQk8ZWxlbWVudCBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgbmFtZT0idGVuZGVyQW10IiB0eXBlPSJpMDpDdXJyZW5jeSI+Ci0JCQkJCQk8YW5ub3RhdGlvbj4KLQkJCQkJCQk8ZG9jdW1lbnRhdGlvbj4gVGhlIGNhc2ggYW1vdW50IHRlbmRlcmVkLiA8L2RvY3VtZW50YXRpb24+Ci0JCQkJCQk8L2Fubm90YXRpb24+Ci0JCQkJCTwvZWxlbWVudD4KLQkJCQk8L3NlcXVlbmNlPgotCQkJPC9leHRlbnNpb24+Ci0JCTwvY29tcGxleENvbnRlbnQ+Ci0JPC9jb21wbGV4VHlwZT4KLQk8Y29tcGxleFR5cGUgbmFtZT0iQ2hlcXVlIj4KLQkJPGNvbXBsZXhDb250ZW50PgotCQkJPGV4dGVuc2lvbiBiYXNlPSJpMDpQYXlUeXBlIj4KLQkJCQk8c2VxdWVuY2U+Ci0JCQkJCTxlbGVtZW50IG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiBuYW1lPSJjaGVxQW10IiB0eXBlPSJpMDpDdXJyZW5jeSIvPgotCQkJCQk8ZWxlbWVudCBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgbmFtZT0iYWNjSG9sZGVyTmFtZSIgdHlwZT0iaTA6UGVyc29uTmFtZSIvPgotCQkJCQk8ZWxlbWVudCBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgbmFtZT0iQWNjSG9sZGVySURObyIgdHlwZT0iaTA6SURObyIvPgotCQkJCQk8ZWxlbWVudCBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgbmFtZT0iYWNjTm8iIHR5cGU9ImkwOkFjY291bnRObyIvPgotCQkJCQk8ZWxlbWVudCBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgbmFtZT0iYmFua05hbWUiIHR5cGU9ImkwOk9yZ2FuaXNhdGlvbk5hbWUiLz4KLQkJCQkJPGVsZW1lbnQgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIG5hbWU9ImJyYW5jaENvZGUiIHR5cGU9ImkwOkJyYW5jaENvZGUiLz4KLQkJCQkJPGVsZW1lbnQgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIG5hbWU9ImNoZXFObyIgdHlwZT0iaTA6Q2hlcXVlTm8iLz4KLQkJCQkJPGVsZW1lbnQgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIG5hbWU9ImNoZXFUeXBlIiB0eXBlPSJpMDpDaGVxdWVUeXBlIi8+Ci0JCQkJCTxlbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJtaWNyIiB0eXBlPSJpMDpNSUNSIi8+Ci0JCQkJPC9zZXF1ZW5jZT4KLQkJCTwvZXh0ZW5zaW9uPgotCQk8L2NvbXBsZXhDb250ZW50PgotCTwvY29tcGxleFR5cGU+Ci0JPGNvbXBsZXhUeXBlIG5hbWU9IkNhcmQiIGFic3RyYWN0PSJ0cnVlIj4KLQkJPGNvbXBsZXhDb250ZW50PgotCQkJPGV4dGVuc2lvbiBiYXNlPSJpMDpQYXlUeXBlIj4KLQkJCQk8c2VxdWVuY2U+Ci0JCQkJCTxlbGVtZW50IG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiBuYW1lPSJjYXJkQW10IiB0eXBlPSJpMDpDdXJyZW5jeSIvPgotCQkJCQk8ZWxlbWVudCBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgbmFtZT0iYWNjSG9sZGVyTmFtZSIgdHlwZT0iaTA6UGVyc29uTmFtZSIvPgotCQkJCQk8ZWxlbWVudCBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgbmFtZT0icGFuIiB0eXBlPSJpMDpBY2NvdW50Tm8iPgotCQkJCQkJPGFubm90YXRpb24+Ci0JCQkJCQkJPGRvY3VtZW50YXRpb24+IFRoZSBwcmltYXJ5IGFjY291bnQgbnVtYmVyLiA8L2RvY3VtZW50YXRpb24+Ci0JCQkJCQk8L2Fubm90YXRpb24+Ci0JCQkJCTwvZWxlbWVudD4KLQkJCQkJPGVsZW1lbnQgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIG5hbWU9ImV4cERhdGUiIHR5cGU9ImkwOkJhbmtDYXJkRXhwaXJ5Ii8+Ci0JCQkJCTxlbGVtZW50IG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiBuYW1lPSJjdk51bSIgdHlwZT0iaTA6QmFua0NhcmRDVk51bSIvPgotCQkJCQk8ZWxlbWVudCBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgbmFtZT0iY2xlYXJpbmdIb3VzZSIKLQkJCQkJCXR5cGU9ImkwOk9yZ2FuaXNhdGlvbk5hbWUiPgotCQkJCQkJPGFubm90YXRpb24+Ci0JCQkJCQkJPGRvY3VtZW50YXRpb24+IFRoZSBuYW1lIG9mIHRoZSBjYXJkIGFzc29jaWF0aW9uLCBlLmcuIFZJU0EsIE1hc3RlckNhcmQsCi0JCQkJCQkJCWV0YyA8L2RvY3VtZW50YXRpb24+Ci0JCQkJCQk8L2Fubm90YXRpb24+Ci0JCQkJCTwvZWxlbWVudD4KLQkJCQk8L3NlcXVlbmNlPgotCQkJPC9leHRlbnNpb24+Ci0JCTwvY29tcGxleENvbnRlbnQ+Ci0JPC9jb21wbGV4VHlwZT4KLQk8Y29tcGxleFR5cGUgbmFtZT0iQ3JlZGl0Q2FyZCI+Ci0JCTxjb21wbGV4Q29udGVudD4KLQkJCTxleHRlbnNpb24gYmFzZT0iaTA6Q2FyZCIvPgotCQk8L2NvbXBsZXhDb250ZW50PgotCTwvY29tcGxleFR5cGU+Ci0JPGNvbXBsZXhUeXBlIG5hbWU9IkRlYml0Q2FyZCI+Ci0JCTxjb21wbGV4Q29udGVudD4KLQkJCTxleHRlbnNpb24gYmFzZT0iaTA6Q2FyZCIvPgotCQk8L2NvbXBsZXhDb250ZW50PgotCTwvY29tcGxleFR5cGU+Ci0JPGNvbXBsZXhUeXBlIG5hbWU9IlVua25vd24iPgotCQk8YW5ub3RhdGlvbj4KLQkJCTxkb2N1bWVudGF0aW9uPiBSZWZlcnMgdG8gYSBwYXltZW50IHR5cGUgdGhhdCBtYXkgbm90IGJlIGtub3duIGF0IHRoZSB0aW1lIG9mIHRoZQotCQkJCXJlcXVlc3QuIDwvZG9jdW1lbnRhdGlvbj4KLQkJPC9hbm5vdGF0aW9uPgotCQk8Y29tcGxleENvbnRlbnQ+Ci0JCQk8ZXh0ZW5zaW9uIGJhc2U9ImkwOlBheVR5cGUiLz4KLQkJPC9jb21wbGV4Q29udGVudD4KLQk8L2NvbXBsZXhUeXBlPgotCTwhLS1SZXNvdXJjZSBTcGVjaWFsaXNhdGlvbnMtLT4KLQk8Y29tcGxleFR5cGUgbmFtZT0iUmVzb3VyY2UiIGFic3RyYWN0PSJ0cnVlIj4KLQkJPGFubm90YXRpb24+Ci0JCQk8ZG9jdW1lbnRhdGlvbj4gVGhlIHR5cGUgb2YgcHJlcGFpZCByZXNvdXJjZSBiZWluZyByZXF1ZXN0ZWQuIDwvZG9jdW1lbnRhdGlvbj4KLQkJPC9hbm5vdGF0aW9uPgotCTwvY29tcGxleFR5cGU+Ci0JPGNvbXBsZXhUeXBlIG5hbWU9IkVsZWN0cmljaXR5Ij4KLQkJPGNvbXBsZXhDb250ZW50PgotCQkJPGV4dGVuc2lvbiBiYXNlPSJpMDpSZXNvdXJjZSIvPgotCQk8L2NvbXBsZXhDb250ZW50PgotCTwvY29tcGxleFR5cGU+Ci0JPGNvbXBsZXhUeXBlIG5hbWU9IldhdGVyIj4KLQkJPGNvbXBsZXhDb250ZW50PgotCQkJPGV4dGVuc2lvbiBiYXNlPSJpMDpSZXNvdXJjZSIvPgotCQk8L2NvbXBsZXhDb250ZW50PgotCTwvY29tcGxleFR5cGU+Ci0JPGNvbXBsZXhUeXBlIG5hbWU9IkdhcyI+Ci0JCTxjb21wbGV4Q29udGVudD4KLQkJCTxleHRlbnNpb24gYmFzZT0iaTA6UmVzb3VyY2UiLz4KLQkJPC9jb21wbGV4Q29udGVudD4KLQk8L2NvbXBsZXhUeXBlPgotCTxjb21wbGV4VHlwZSBuYW1lPSJDb25uZWN0aW9uVGltZSI+Ci0JCTxjb21wbGV4Q29udGVudD4KLQkJCTxleHRlbnNpb24gYmFzZT0iaTA6UmVzb3VyY2UiLz4KLQkJPC9jb21wbGV4Q29udGVudD4KLQk8L2NvbXBsZXhUeXBlPgotCTxjb21wbGV4VHlwZSBuYW1lPSJDdXJyZW5jeVJlc291cmNlIj4KLQkJPGNvbXBsZXhDb250ZW50PgotCQkJPGV4dGVuc2lvbiBiYXNlPSJpMDpSZXNvdXJjZSIvPgotCQk8L2NvbXBsZXhDb250ZW50PgotCTwvY29tcGxleFR5cGU+Ci0JPCEtLVJlc291cmNlIFNwZWNpYWxpc2F0aW9ucyBFbmRzLS0+Ci0JPGNvbXBsZXhUeXBlIG5hbWU9IlRhcmlmZiI+Ci0JCTxhbm5vdGF0aW9uPgotCQkJPGRvY3VtZW50YXRpb24+IENvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0YXJpZmYgdGhhdCB3YXMgdXNlZCB0byBwcm9jZXNzIHRoZQotCQkJCXRyYW5zYWN0aW9uLiA8L2RvY3VtZW50YXRpb24+Ci0JCTwvYW5ub3RhdGlvbj4KLQkJPHNlcXVlbmNlPgotCQkJPGVsZW1lbnQgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIG5hbWU9Im5hbWUiIHR5cGU9ImkwOk1zZyI+Ci0JCQkJPGFubm90YXRpb24+Ci0JCQkJCTxkb2N1bWVudGF0aW9uPiBOYW1lIG9mIHRoZSB0YXJpZmYuIGUuZy4gSG9tZSBMaWdodCAxIDwvZG9jdW1lbnRhdGlvbj4KLQkJCQk8L2Fubm90YXRpb24+Ci0JCQk8L2VsZW1lbnQ+Ci0JCQk8ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0iZGVzYyIgdHlwZT0iaTA6TXNnIj4KLQkJCQk8YW5ub3RhdGlvbj4KLQkJCQkJPGRvY3VtZW50YXRpb24+T3B0aW9uYWwgZGVzY3JpcHRpb24gb2YgdGhlIHRhcmlmZi4gPC9kb2N1bWVudGF0aW9uPgotCQkJCTwvYW5ub3RhdGlvbj4KLQkJCTwvZWxlbWVudD4KLQkJPC9zZXF1ZW5jZT4KLQk8L2NvbXBsZXhUeXBlPgotCTwhLS1UYXggc3BlY2lhbGlzYXRpb25zIC0tPgotCTxjb21wbGV4VHlwZSBuYW1lPSJUYXgiIGFic3RyYWN0PSJ0cnVlIj4KLQkJPGFubm90YXRpb24+Ci0JCQk8ZG9jdW1lbnRhdGlvbj4gVEFYIHRoYXQgaXMgYXBwbGljYWJsZSB0byBhIHRyYW5zYWN0aW9uLiA8L2RvY3VtZW50YXRpb24+Ci0JCTwvYW5ub3RhdGlvbj4KLQkJPHNlcXVlbmNlPgotCQkJPGVsZW1lbnQgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIG5hbWU9ImFtdCIgdHlwZT0iaTA6Q3VycmVuY3kiPgotCQkJCTxhbm5vdGF0aW9uPgotCQkJCQk8ZG9jdW1lbnRhdGlvbj4gVGhlIFRBWCBhbW91bnQgb2YgYSB0cmFuc2FjdGlvbi4gPC9kb2N1bWVudGF0aW9uPgotCQkJCTwvYW5ub3RhdGlvbj4KLQkJCTwvZWxlbWVudD4KLQkJPC9zZXF1ZW5jZT4KLQk8L2NvbXBsZXhUeXBlPgotCTxjb21wbGV4VHlwZSBuYW1lPSJWQVQiPgotCQk8YW5ub3RhdGlvbj4KLQkJCTxkb2N1bWVudGF0aW9uPiBBIGluc3RhbmNlIG9mIFRBWCwgcmVmZXJyZWQgdG8gVmFsdWUgQWRkZWQgVGF4IGFuZCBleHByZXNzZWQgYXMgYQotCQkJCXBlcmNlbnRhZ2UuIDwvZG9jdW1lbnRhdGlvbj4KLQkJPC9hbm5vdGF0aW9uPgotCQk8Y29tcGxleENvbnRlbnQ+Ci0JCQk8ZXh0ZW5zaW9uIGJhc2U9ImkwOlRheCI+Ci0JCQkJPGF0dHJpYnV0ZSB1c2U9InJlcXVpcmVkIiBuYW1lPSJyYXRlIiB0eXBlPSJpMDpQZXJjZW50YWdlIj4KLQkJCQkJPGFubm90YXRpb24+Ci0JCQkJCQk8ZG9jdW1lbnRhdGlvbj4gVGhlIHBlcmNlbnRhZ2UgcmF0ZSBvZiBWQVQsIGFzIGFwcGxpZWQgdG8gdGhlIHRyYW5zYWN0aW9uCi0JCQkJCQkJdmFsdWUuIDwvZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC9hbm5vdGF0aW9uPgotCQkJCTwvYXR0cmlidXRlPgotCQkJPC9leHRlbnNpb24+Ci0JCTwvY29tcGxleENvbnRlbnQ+Ci0JPC9jb21wbGV4VHlwZT4KLQk8IS0tVGF4IHNwZWNpYWxpc2F0aW9ucyAtLT4KLQk8IS0tVG9rZW4gU3BlY2lhbGlzYXRpb25zLS0+Ci0JPGNvbXBsZXhUeXBlIG5hbWU9IlRva2VuIiBhYnN0cmFjdD0idHJ1ZSI+Ci0JCTxhbm5vdGF0aW9uPgotCQkJPGRvY3VtZW50YXRpb24+IEdlbmVyaWMgcHJlcGFpZCB0b2tlbiB0aGF0IGlzIGdlbmVyYXRlZCBieSB0aGUgc2VydmVyLiA8L2RvY3VtZW50YXRpb24+Ci0JCTwvYW5ub3RhdGlvbj4KLQk8L2NvbXBsZXhUeXBlPgotCTxjb21wbGV4VHlwZSBuYW1lPSJLQ1Rva2VuIj4KLQkJPGFubm90YXRpb24+Ci0JCQk8ZG9jdW1lbnRhdGlvbj4gQSBrZXkgY2hhbmdlIHRva2VuLCB0aGF0IGNvbnNpc3RzIG9mIHR3byBTVFMgdG9rZW5zLiA8L2RvY3VtZW50YXRpb24+Ci0JCTwvYW5ub3RhdGlvbj4KLQkJPGNvbXBsZXhDb250ZW50PgotCQkJPGV4dGVuc2lvbiBiYXNlPSJpMDpUb2tlbiI+Ci0JCQkJPHNlcXVlbmNlPgotCQkJCQk8ZWxlbWVudCBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgbmFtZT0ic2V0MXN0TWV0ZXJLZXkiIHR5cGU9ImkwOlNUUzFUb2tlbiI+Ci0JCQkJCQk8YW5ub3RhdGlvbj4KLQkJCQkJCQk8ZG9jdW1lbnRhdGlvbj4gRmlyc3QgMjAgZGlnaXQgU1RTIHRva2VuLiA8L2RvY3VtZW50YXRpb24+Ci0JCQkJCQk8L2Fubm90YXRpb24+Ci0JCQkJCTwvZWxlbWVudD4KLQkJCQkJPGVsZW1lbnQgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIG5hbWU9InNldDJuZE1ldGVyS2V5IiB0eXBlPSJpMDpTVFMxVG9rZW4iPgotCQkJCQkJPGFubm90YXRpb24+Ci0JCQkJCQkJPGRvY3VtZW50YXRpb24+IFNlY29uZCAyMCBkaWdpdCBTVFMgdG9rZW4uIDwvZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwvYW5ub3RhdGlvbj4KLQkJCQkJPC9lbGVtZW50PgotCQkJCTwvc2VxdWVuY2U+Ci0JCQk8L2V4dGVuc2lvbj4KLQkJPC9jb21wbGV4Q29udGVudD4KLQk8L2NvbXBsZXhUeXBlPgotCTxjb21wbGV4VHlwZSBuYW1lPSJTVFMxVG9rZW4iPgotCQk8YW5ub3RhdGlvbj4KLQkJCTxkb2N1bWVudGF0aW9uPiBUaGUgMjAgZGlnaXQgU1RTIDEgdG9rZW4gYXMgZGVmaW5lZCBpbiB0aGUgU1RTIDEgc3BlY2lmaWNhdGlvbnMuIEZvciB0aGUKLQkJCQlUcmlhbENyZWRpdCBWZW5kIHJlcXVlc3QgdGhlIFNUUzFUb2tlbiB2YWx1ZSB3aWxsIGRmYXVsdCB0byAiMDAwMDAwMDAwMDAwMDAwMCIuCi0JCQk8L2RvY3VtZW50YXRpb24+Ci0JCTwvYW5ub3RhdGlvbj4KLQkJPGNvbXBsZXhDb250ZW50PgotCQkJPGV4dGVuc2lvbiBiYXNlPSJpMDpUb2tlbiI+Ci0JCQkJPHNlcXVlbmNlPgotCQkJCQk8ZWxlbWVudCBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgbmFtZT0ic3RzQ2lwaGVyIiB0eXBlPSJpMDpTVFNDaXBoZXJUZXh0Ii8+Ci0JCQkJPC9zZXF1ZW5jZT4KLQkJCTwvZXh0ZW5zaW9uPgotCQk8L2NvbXBsZXhDb250ZW50PgotCTwvY29tcGxleFR5cGU+Ci0JPCEtLVRva2VuIFNwZWNpYWxpc2F0aW9ucyBFbmRzLS0+Ci0JPCEtLVRva2VuIEluZm8gU3BlY2lhbGlzYXRpb25zIC0tPgotCTxjb21wbGV4VHlwZSBuYW1lPSJUb2tlbkluZm8iIGFic3RyYWN0PSJ0cnVlIj4KLQkJPGFubm90YXRpb24+Ci0JCQk8ZG9jdW1lbnRhdGlvbj4gSW5mb3JtYXRpb24gYWJvdXQgdGhlIHByZXBhaWQgdG9rZW4gZ2VuZXJhdGVkLiA8L2RvY3VtZW50YXRpb24+Ci0JCTwvYW5ub3RhdGlvbj4KLQk8L2NvbXBsZXhUeXBlPgotCTxjb21wbGV4VHlwZSBuYW1lPSJTVFMxVG9rZW5JbmZvIj4KLQkJPGFubm90YXRpb24+Ci0JCQk8ZG9jdW1lbnRhdGlvbj4gVG9rZW4gaW5mb3JtYXRpb24gZm9yIFNUUzEgdG9rZW5zLiA8L2RvY3VtZW50YXRpb24+Ci0JCTwvYW5ub3RhdGlvbj4KLQkJPGNvbXBsZXhDb250ZW50PgotCQkJPGV4dGVuc2lvbiBiYXNlPSJpMDpUb2tlbkluZm8iPgotCQkJCTxzZXF1ZW5jZT4KLQkJCQkJPGVsZW1lbnQgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIG5hbWU9InRva2VuSUQiIHR5cGU9ImRlY2ltYWwiPgotCQkJCQkJPGFubm90YXRpb24+Ci0JCQkJCQkJPGRvY3VtZW50YXRpb24+IEFzIGRlZmluZWQgYnkgU1RTLiA8L2RvY3VtZW50YXRpb24+Ci0JCQkJCQk8L2Fubm90YXRpb24+Ci0JCQkJCTwvZWxlbWVudD4KLQkJCQkJPGVsZW1lbnQgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIG5hbWU9InRyYW5zZmVyQW10IiB0eXBlPSJkZWNpbWFsIj4KLQkJCQkJCTxhbm5vdGF0aW9uPgotCQkJCQkJCTxkb2N1bWVudGF0aW9uPiBBcyBkZWZpbmVkIGJ5IFNUUy4gPC9kb2N1bWVudGF0aW9uPgotCQkJCQkJPC9hbm5vdGF0aW9uPgotCQkJCQk8L2VsZW1lbnQ+Ci0JCQkJCTxlbGVtZW50IG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiBuYW1lPSJ0b2tlbkNsYXNzIgotCQkJCQkJdHlwZT0iaTA6VG9rZW5TdWJDbGFzc1R5cGUiPgotCQkJCQkJPGFubm90YXRpb24+Ci0JCQkJCQkJPGRvY3VtZW50YXRpb24+IEFzIGRlZmluZWQgYnkgU1RTLiA8L2RvY3VtZW50YXRpb24+Ci0JCQkJCQk8L2Fubm90YXRpb24+Ci0JCQkJCTwvZWxlbWVudD4KLQkJCQk8L3NlcXVlbmNlPgotCQkJPC9leHRlbnNpb24+Ci0JCTwvY29tcGxleENvbnRlbnQ+Ci0JPC9jb21wbGV4VHlwZT4KLQk8Y29tcGxleFR5cGUgbmFtZT0iVG9rZW5TdWJDbGFzc1R5cGUiPgotCQk8YW5ub3RhdGlvbj4KLQkJCTxkb2N1bWVudGF0aW9uPiBQb3RlbnRpYWwgdG9rZW4gc3ViIGNsYXNzIHR5cGVzLCBhcyBwZXIgU1RTLiA8L2RvY3VtZW50YXRpb24+Ci0JCTwvYW5ub3RhdGlvbj4KLQkJPHNlcXVlbmNlPgotCQkJPGNob2ljZSBtYXhPY2N1cnM9IjEiIG1pbk9jY3Vycz0iMSI+Ci0JCQkJPGVsZW1lbnQgbmFtZT0iY3JlZGl0IiB0eXBlPSJpMDpDcmVkaXRUb2tlblN1YkNsYXNzVHlwZSIvPgotCQkJCTxlbGVtZW50IG5hbWU9Im5vbk1ldGVyTWFuYWdlbWVudCIgdHlwZT0iaTA6Tm9uTWV0ZXJTcGVjaWZpY0VuZyIvPgotCQkJCTxlbGVtZW50IG5hbWU9Im1ldGVyTWFuYWdlbWVudCIgdHlwZT0iaTA6TWV0ZXJTcGVjaWZpY0VuZyIvPgotCQkJPC9jaG9pY2U+Ci0JCTwvc2VxdWVuY2U+Ci0JPC9jb21wbGV4VHlwZT4KLQk8Y29tcGxleFR5cGUgbmFtZT0iVmVuZG9yRGV0YWlsIj4KLQkJPGFubm90YXRpb24+Ci0JCQk8ZG9jdW1lbnRhdGlvbj4gT3JnYW5pc2F0aW9uIHdobyBpcyBjb250cmFjdGVkIHdpdGggdGhlIHV0aWxpdHkgdG8gcHJvdmlkZSBwcmVwYWlkCi0JCQkJdG9rZW4ncyB0byBpdCBjdXN0b21lcnMuIDwvZG9jdW1lbnRhdGlvbj4KLQkJPC9hbm5vdGF0aW9uPgotCQk8YXR0cmlidXRlIHVzZT0icmVxdWlyZWQiIG5hbWU9Im5hbWUiIHR5cGU9ImkwOk9yZ2FuaXNhdGlvbk5hbWUiPgotCQkJCTxhbm5vdGF0aW9uPgotCQkJCQk8ZG9jdW1lbnRhdGlvbj4gTmFtZSBvZiB0aGUgdmVuZG9yLCBlLmcuIEZvbyBCYW5rIDwvZG9jdW1lbnRhdGlvbj4KLQkJCQk8L2Fubm90YXRpb24+Ci0JCTwvYXR0cmlidXRlPgotCQk8YXR0cmlidXRlIHVzZT0icmVxdWlyZWQiIG5hbWU9ImFkZHJlc3MiIHR5cGU9ImkwOkFkZHJlc3MiPgotCQkJCTxhbm5vdGF0aW9uPgotCQkJCQk8ZG9jdW1lbnRhdGlvbj4gQWRkcmVzcyBvZiB0aGUgdmVuZG9yLiA8L2RvY3VtZW50YXRpb24+Ci0JCQkJPC9hbm5vdGF0aW9uPgotCQk8L2F0dHJpYnV0ZT4JCi0JPC9jb21wbGV4VHlwZT4KLQk8Y29tcGxleFR5cGUgbmFtZT0iVXRpbGl0eURldGFpbCI+Ci0JCTxhbm5vdGF0aW9uPgotCQkJPGRvY3VtZW50YXRpb24+IERldGFpbHMgb2YgdGhlIHV0aWxpdHkgdGhhdCBpcyBzdXBwbHkgYXV0aG9yaXR5IGZvciB0aGUgcHJlcGFpZAotCQkJCXJlc291cmNlLiA8L2RvY3VtZW50YXRpb24+Ci0JCTwvYW5ub3RhdGlvbj4KLQkJPGF0dHJpYnV0ZSB1c2U9InJlcXVpcmVkIiBuYW1lPSJuYW1lIiB0eXBlPSJpMDpPcmdhbmlzYXRpb25OYW1lIi8+Ci0JCTxhdHRyaWJ1dGUgdXNlPSJyZXF1aXJlZCIgbmFtZT0iYWRkcmVzcyIgdHlwZT0iaTA6QWRkcmVzcyIvPgotCQk8YXR0cmlidXRlIHVzZT0icmVxdWlyZWQiIG5hbWU9InRheFJlZiIgdHlwZT0iaTA6VGF4UmVmIj4KLQkJCQk8YW5ub3RhdGlvbj4KLQkJCQkJPGRvY3VtZW50YXRpb24+IFRheCByZWZlcmVuY2UgbnVtYmVyIG9mIHRoZSB1dGlsaXR5LiA8L2RvY3VtZW50YXRpb24+Ci0JCQkJPC9hbm5vdGF0aW9uPgotCQk8L2F0dHJpYnV0ZT4KLQk8L2NvbXBsZXhUeXBlPgotCTwhLS0gSXNzdWUgRmF1bHQgIGFuZCBYTUx2ZW5kIEZhdWx0IFNwZWNpYWxpc2F0aW9ucyAtLT4KLQk8Y29tcGxleFR5cGUgbmFtZT0iRmF1bHQiIGFic3RyYWN0PSJ0cnVlIj4KLQkJPGFubm90YXRpb24+Ci0JCQk8ZG9jdW1lbnRhdGlvbj4gQSBnZW5lcmljIGZhdWx0IHJldHVybmVkIGJ5IHRoZSBzZXJ2ZXIgdG8gYW4gZXhjZXB0aW9uIHNjZW5hcmlvLgotCQkJPC9kb2N1bWVudGF0aW9uPgotCQk8L2Fubm90YXRpb24+Ci0JCTxzZXF1ZW5jZT4KLQkJCTxlbGVtZW50IG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiBuYW1lPSJkZXNjIiB0eXBlPSJpMDpNc2ciPgotCQkJCTxhbm5vdGF0aW9uPgotCQkJCQk8ZG9jdW1lbnRhdGlvbj4gRGVzY3JpcHRpb24gb2YgdGhlIGZhdWx0IHNjZW5hcmlvLiA8L2RvY3VtZW50YXRpb24+Ci0JCQkJPC9hbm5vdGF0aW9uPgotCQkJPC9lbGVtZW50PgotCQk8L3NlcXVlbmNlPgotCTwvY29tcGxleFR5cGU+Ci0JPGNvbXBsZXhUeXBlIG5hbWU9IlN5c3RlbUV4Ij4KLQkJPGFubm90YXRpb24+Ci0JCQk8ZG9jdW1lbnRhdGlvbj4gQSBzeXN0ZW0gZXJyb3IgaGFzIG9jY3VycmVkIHdoaWxlIHByb2Nlc3NpbmcgdGhlIHJlcXVlc3QgYW5kIHRoZXJlZm9yZQotCQkJCXRoZSBub3JtYWwgcmVzcG9uc2UgbWVzc2FnZSBjYW5ub3QgYmUgcmV0dXJuZWQuIDwvZG9jdW1lbnRhdGlvbj4KLQkJPC9hbm5vdGF0aW9uPgotCQk8Y29tcGxleENvbnRlbnQ+Ci0JCQk8ZXh0ZW5zaW9uIGJhc2U9ImkwOkZhdWx0Ii8+Ci0JCTwvY29tcGxleENvbnRlbnQ+Ci0JPC9jb21wbGV4VHlwZT4KLQk8Y29tcGxleFR5cGUgbmFtZT0iQnVzaW5lc3NSdWxlRXgiPgotCQk8YW5ub3RhdGlvbj4KLQkJCTxkb2N1bWVudGF0aW9uPiBBIGJ1c2luZXNzIHJ1bGUgZXhjZXB0aW9uIGhhcyBvY2N1cnJlZCB3aGlsZSBwcm9jZXNzaW5nIHRoZSByZXF1ZXN0Ci0JCQkJbWVzc2FnZSwgdGhlIHNlcnZlciBpcyB0aGVyZWZvcmUgdW5hYmxlIHRvIGNvbnRpbnVlIHdpdGggdGhlIGhhcHB5IHBhdGguCi0JCQk8L2RvY3VtZW50YXRpb24+Ci0JCTwvYW5ub3RhdGlvbj4KLQkJPGNvbXBsZXhDb250ZW50PgotCQkJPGV4dGVuc2lvbiBiYXNlPSJpMDpGYXVsdCIvPgotCQk8L2NvbXBsZXhDb250ZW50PgotCTwvY29tcGxleFR5cGU+Ci0JPGNvbXBsZXhUeXBlIG5hbWU9IlJlcXVlc3RBdXRob3Jpc2F0aW9uRXgiPgotCQk8YW5ub3RhdGlvbj4KLQkJCTxkb2N1bWVudGF0aW9uPiBUaGUgdmVuZG9yIGlzIG5vdCBhdXRob3Jpc2VkIHRvIHBlcmZvcm0gdGhlIHJlcXVlc3RlZCBvcGVyYXRpb24uCi0JCQk8L2RvY3VtZW50YXRpb24+Ci0JCTwvYW5ub3RhdGlvbj4KLQkJPGNvbXBsZXhDb250ZW50PgotCQkJPGV4dGVuc2lvbiBiYXNlPSJpMDpCdXNpbmVzc1J1bGVFeCIvPgotCQk8L2NvbXBsZXhDb250ZW50PgotCTwvY29tcGxleFR5cGU+Ci0JPGNvbXBsZXhUeXBlIG5hbWU9Ik1TTk9DaGVja0RpZ2l0RXgiPgotCQk8YW5ub3RhdGlvbj4KLQkJCTxkb2N1bWVudGF0aW9uPiBUaGUgY2hlY2sgZGlnaXQgb2YgdGhlIHN1cHBsaWVkIE1TTk8gY2FuIG5vdCBiZSB2ZXJpZmllZC4KLQkJCTwvZG9jdW1lbnRhdGlvbj4KLQkJPC9hbm5vdGF0aW9uPgotCQk8Y29tcGxleENvbnRlbnQ+Ci0JCQk8ZXh0ZW5zaW9uIGJhc2U9ImkwOkJ1c2luZXNzUnVsZUV4Ii8+Ci0JCTwvY29tcGxleENvbnRlbnQ+Ci0JPC9jb21wbGV4VHlwZT4KLQk8Y29tcGxleFR5cGUgbmFtZT0iU0dDQXV0aG9yaXNhdGlvbkV4Ij4KLQkJPGFubm90YXRpb24+Ci0JCQk8ZG9jdW1lbnRhdGlvbj4gVGhlIHZlbmRvciBpcyBub3QgYXV0aG9yaXNlZCB0byBwcm9kdWNlIHRva2VucyBmb3IgbWV0ZXJzIG9uIHRoZQotCQkJCXN1cHBsaWVkIFNHQy4gPC9kb2N1bWVudGF0aW9uPgotCQk8L2Fubm90YXRpb24+Ci0JCTxjb21wbGV4Q29udGVudD4KLQkJCTxleHRlbnNpb24gYmFzZT0iaTA6QnVzaW5lc3NSdWxlRXgiLz4KLQkJPC9jb21wbGV4Q29udGVudD4KLQk8L2NvbXBsZXhUeXBlPgotCTxjb21wbGV4VHlwZSBuYW1lPSJMYXRlc3RLUk5FeCI+Ci0JCTxhbm5vdGF0aW9uPgotCQkJPGRvY3VtZW50YXRpb24+IFRoZSBzdXBwbGllZCBLUk4gZm9yIHRoZSBzdXBwbGllZCBTR0MgaGFzIGV4cGlyZWQuIEFuIHVwZGF0ZSBtZXRlciBrZXkKLQkJCQlvcGVyYXRpb24gaXMgcmVxdWlyZWQuIDwvZG9jdW1lbnRhdGlvbj4KLQkJPC9hbm5vdGF0aW9uPgotCQk8Y29tcGxleENvbnRlbnQ+Ci0JCQk8ZXh0ZW5zaW9uIGJhc2U9ImkwOkJ1c2luZXNzUnVsZUV4Ii8+Ci0JCTwvY29tcGxleENvbnRlbnQ+Ci0JPC9jb21wbGV4VHlwZT4KLQk8Y29tcGxleFR5cGUgbmFtZT0iRkJFRXgiPgotCQk8YW5ub3RhdGlvbj4KLQkJCTxkb2N1bWVudGF0aW9uPiBUaGUgY3VzdG9tZXIgaXMgbm90IHJlZ2lzdGVyZWQgZm9yIEZCRS4gPC9kb2N1bWVudGF0aW9uPgotCQk8L2Fubm90YXRpb24+Ci0JCTxjb21wbGV4Q29udGVudD4KLQkJCTxleHRlbnNpb24gYmFzZT0iaTA6QnVzaW5lc3NSdWxlRXgiLz4KLQkJPC9jb21wbGV4Q29udGVudD4KLQk8L2NvbXBsZXhUeXBlPgotCTxjb21wbGV4VHlwZSBuYW1lPSJCbG9ja2VkTWV0ZXJFeCI+Ci0JCTxhbm5vdGF0aW9uPgotCQkJPGRvY3VtZW50YXRpb24+IFRoZSBtZXRlciBoYXMgYmVlbiBibG9ja2VkLCBubyB0cmFuc2FjdGlvbnMgYXJlIHBvc3NpYmxlLCB0aGUgcmVhc29uIGZvcgotCQkJCWJsb2NraW5nIHdpbGwgdmFyeS4uIDwvZG9jdW1lbnRhdGlvbj4KLQkJPC9hbm5vdGF0aW9uPgotCQk8Y29tcGxleENvbnRlbnQ+Ci0JCQk8ZXh0ZW5zaW9uIGJhc2U9ImkwOkJ1c2luZXNzUnVsZUV4Ii8+Ci0JCTwvY29tcGxleENvbnRlbnQ+Ci0JPC9jb21wbGV4VHlwZT4KLQk8Y29tcGxleFR5cGUgbmFtZT0iU1RTRGF0YUV4Ij4KLQkJPGFubm90YXRpb24+Ci0JCQk8ZG9jdW1lbnRhdGlvbj4gVGhlIHN1cHBsaWVkIGRhdGEgZm9yIE1TTk8sIFNHQywgS1JOLCBUSSwgQVQsIFRUIGFyZSBub3QgdmFsaWQuCi0JCQk8L2RvY3VtZW50YXRpb24+Ci0JCTwvYW5ub3RhdGlvbj4KLQkJPGNvbXBsZXhDb250ZW50PgotCQkJPGV4dGVuc2lvbiBiYXNlPSJpMDpCdXNpbmVzc1J1bGVFeCIvPgotCQk8L2NvbXBsZXhDb250ZW50PgotCTwvY29tcGxleFR5cGU+Ci0JPGNvbXBsZXhUeXBlIG5hbWU9IlZlbmRvckNyZWRpdEV4Ij4KLQkJPGFubm90YXRpb24+Ci0JCQk8ZG9jdW1lbnRhdGlvbj4gSW5zdWZmaWNpZW50IHZlbmRvciBjcmVkaXQgdG8gY29tcGV0ZSB0aGUgcmVxdWVzdGVkIG9wZXJhdGlvbi4KLQkJCTwvZG9jdW1lbnRhdGlvbj4KLQkJPC9hbm5vdGF0aW9uPgotCQk8Y29tcGxleENvbnRlbnQ+Ci0JCQk8ZXh0ZW5zaW9uIGJhc2U9ImkwOkJ1c2luZXNzUnVsZUV4Ii8+Ci0JCTwvY29tcGxleENvbnRlbnQ+Ci0JPC9jb21wbGV4VHlwZT4KLQk8Y29tcGxleFR5cGUgbmFtZT0iWE1MVmVuZEZhdWx0RXgiIGFic3RyYWN0PSJ0cnVlIj4KLQkJPGFubm90YXRpb24+Ci0JCQk8ZG9jdW1lbnRhdGlvbj4gQSBYTUxWZW5kIHByb3RvY29sIHJlbGF0ZWQgZmF1bHQgaGFzIG9jY3VycmVkLiA8L2RvY3VtZW50YXRpb24+Ci0JCTwvYW5ub3RhdGlvbj4KLQkJPGNvbXBsZXhDb250ZW50PgotCQkJPGV4dGVuc2lvbiBiYXNlPSJpMDpGYXVsdCIvPgotCQk8L2NvbXBsZXhDb250ZW50PgotCTwvY29tcGxleFR5cGU+Ci0JPGNvbXBsZXhUeXBlIG5hbWU9IlVzZUNhc2VTdXBwb3J0RXgiPgotCQk8YW5ub3RhdGlvbj4KLQkJCTxkb2N1bWVudGF0aW9uPiBTcGVjaWFsaXNhdGlvbiBvZiBYTUxWZW5kIHByb3RvY29sIGV4Y2VwdGlvbiwgaW5kaWNhdGluZyB0aGF0IHRoZQotCQkJCXJlcXVlc3RlZCB1c2UgY2FzZSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgWE1MVmVuZCBpbXBsZW1lbnRhdGlvbi4gPC9kb2N1bWVudGF0aW9uPgotCQk8L2Fubm90YXRpb24+Ci0JCTxjb21wbGV4Q29udGVudD4KLQkJCTxleHRlbnNpb24gYmFzZT0iaTA6WE1MVmVuZEZhdWx0RXgiLz4KLQkJPC9jb21wbGV4Q29udGVudD4KLQk8L2NvbXBsZXhUeXBlPgotCTxjb21wbGV4VHlwZSBuYW1lPSJDbGllbnRJRFNTTEV4Ij4KLQkJPGFubm90YXRpb24+Ci0JCQk8ZG9jdW1lbnRhdGlvbj4gU3BlY2lhbGlzYXRpb24gb2YgWE1MVmVuZCBwcm90b2NvbCBleGNlcHRpb24sIGluZGljYXRpbmcgdGhhdCB0aGUKLQkJCQljbGllbnRJRCBzdXBwbGllZCBpbiB0aGUgcmVxdWVzdCBkb2VzIG5vdCBtYXRjaCB0aGUgWDUwOSBjZXJ0aWZpY2F0ZSBjbGllbnRJRC4KLQkJCTwvZG9jdW1lbnRhdGlvbj4KLQkJPC9hbm5vdGF0aW9uPgotCQk8Y29tcGxleENvbnRlbnQ+Ci0JCQk8ZXh0ZW5zaW9uIGJhc2U9ImkwOlhNTFZlbmRGYXVsdEV4Ii8+Ci0JCTwvY29tcGxleENvbnRlbnQ+Ci0JPC9jb21wbGV4VHlwZT4KLQk8Y29tcGxleFR5cGUgbmFtZT0iWE1MVmVuZFNjaGVtYUV4Ij4KLQkJPGFubm90YXRpb24+Ci0JCQk8ZG9jdW1lbnRhdGlvbj4gU3BlY2lhbGlzYXRpb24gb2YgWE1MVmVuZCBwcm90b2NvbCBleGNlcHRpb24sIGluZGljYXRpbmcgdGhhdCB0aGUKLQkJCQlyZXF1ZXN0IG1lc3NhZ2UgZG9lcyBub3QgY29uZm9ybSB0byB0aGUgWE1MVmVuZCBzY2hlbWEuIDwvZG9jdW1lbnRhdGlvbj4KLQkJPC9hbm5vdGF0aW9uPgotCQk8Y29tcGxleENvbnRlbnQ+Ci0JCQk8ZXh0ZW5zaW9uIGJhc2U9ImkwOlhNTFZlbmRGYXVsdEV4Ii8+Ci0JCTwvY29tcGxleENvbnRlbnQ+Ci0JPC9jb21wbGV4VHlwZT4KLQk8Y29tcGxleFR5cGUgbmFtZT0iTGFzdFJlc3BvbnNlRXgiPgotCQk8YW5ub3RhdGlvbj4KLQkJCTxkb2N1bWVudGF0aW9uPiBTcGVjaWFsaXNhdGlvbiBvZiBYTUxWZW5kIHByb3RvY29sIGV4Y2VwdGlvbiwgaW5kaWNhdGluZyB0aGF0IHRoZQotCQkJCXJlcXVlc3RlZCByZXNwb25zZSBtZXNzYWdlIGNhbiBub3QgYmUgcmV0dXJuZWQgYXMgdGhlcmUgaXMgbm90IHRyYW5zYWN0aW9uCi0JCQkJYXNzb2NpYXRlZCB3aXRoIHRoZSByZXF1ZXN0ZWQgTXNnSUQuIDwvZG9jdW1lbnRhdGlvbj4KLQkJPC9hbm5vdGF0aW9uPgotCQk8Y29tcGxleENvbnRlbnQ+Ci0JCQk8ZXh0ZW5zaW9uIGJhc2U9ImkwOlhNTFZlbmRGYXVsdEV4Ii8+Ci0JCTwvY29tcGxleENvbnRlbnQ+Ci0JPC9jb21wbGV4VHlwZT4KLQkKLQk8Y29tcGxleFR5cGUgbmFtZT0iVW5pdHMiPgotCQk8YW5ub3RhdGlvbj4KLQkJCTxkb2N1bWVudGF0aW9uPgotCQkJCUFtb3VudCBvZiBhIHNwZWNmaWMgcmVzb3VyY2UsIGluIHRlcm1zIG9mIGl0cyBzaVVuaXQuCi0JCQk8L2RvY3VtZW50YXRpb24+Ci0JCTwvYW5ub3RhdGlvbj4KLQkJPGF0dHJpYnV0ZSB1c2U9InJlcXVpcmVkIiBuYW1lPSJ2YWx1ZSIgdHlwZT0iZGVjaW1hbCIvPgotCQk8YXR0cmlidXRlIHVzZT0icmVxdWlyZWQiIG5hbWU9InNpVW5pdCIgdHlwZT0iaTA6UmVzb3VyY2VTSVVuaXQiPgotCQkJPGFubm90YXRpb24+Ci0JCQkJPGRvY3VtZW50YXRpb24+Ci0JCQkJCVRoZSBTSSBVbml0IG9mIG1lYXN1cmVtZW50IG9mIHRoZSByZXNvdXJjZSBiZSB2ZW5kZWQsCi0JCQkJCWVnLiAia1doIiBmb3IgZWxlY3RyaWNpdHkuCi0JCQkJPC9kb2N1bWVudGF0aW9uPgotCQkJPC9hbm5vdGF0aW9uPgotCQk8L2F0dHJpYnV0ZT4KLQk8L2NvbXBsZXhUeXBlPgotCTwhLS0gQ29tcGxleCBFbGVtZW50IERlZmluYXRpb25zIEVuZHMtLT4KLQk8IS0tIEVsZW1lbnQgQ29uc3RyYWludHMgU3RhcnQgLS0+Ci0JPCEtLSBEZWZpbmUgU2ltcGxlIC8gQmFzZSBSZXN0cmljdGl2ZSAmIEVudW1lcmF0ZWQgVFlQRVM6IC0tPgotCTwhLS0gQ29uc3VtZXIgQWNjb3VudCBOdW1iZXIgVHlwZSBbMjBdIGRpZ2l0cywgY2hhcnMsIG5vIHdoaXRlIHNwYWNlIC0tPgotCTxzaW1wbGVUeXBlIG5hbWU9IkFjY291bnRObyI+Ci0JCTxhbm5vdGF0aW9uPgotCQkJPGRvY3VtZW50YXRpb24+IEdlbmVyaWMgYWNjb3VudCBudW1iZXIsIHVzZWQgaW4gc2V2ZXJhbCBjb250ZXh0cy4gPC9kb2N1bWVudGF0aW9uPgotCQk8L2Fubm90YXRpb24+Ci0JCTxyZXN0cmljdGlvbiBiYXNlPSJzdHJpbmciPgotCQkJPHBhdHRlcm4gdmFsdWU9IihcUyl7MCwyMH0iLz4KLQkJPC9yZXN0cmljdGlvbj4KLQk8L3NpbXBsZVR5cGU+Ci0JPCEtLSBTdHJpbmcgd2l0aCB3aGl0ZXNwYWNlIFswLi44MF0gYW55IGNoYXJzIC0tPgotCTxzaW1wbGVUeXBlIG5hbWU9IkFkZHJlc3MiPgotCQk8cmVzdHJpY3Rpb24gYmFzZT0ic3RyaW5nIj4KLQkJCTxtYXhMZW5ndGggdmFsdWU9IjgwIi8+Ci0JCTwvcmVzdHJpY3Rpb24+Ci0JPC9zaW1wbGVUeXBlPgotCTxzaW1wbGVUeXBlIG5hbWU9IkJyYW5jaENvZGUiPgotCQk8YW5ub3RhdGlvbj4KLQkJCTxkb2N1bWVudGF0aW9uPiBDb250YWlucyB0aGUgYnJhbmNoIGNvZGUgb2YgdGhlIGJhbmsuIDwvZG9jdW1lbnRhdGlvbj4KLQkJPC9hbm5vdGF0aW9uPgotCQk8cmVzdHJpY3Rpb24gYmFzZT0ic3RyaW5nIj4KLQkJCTxwYXR0ZXJuIHZhbHVlPSIoXGQpezEsMTB9Ii8+Ci0JCTwvcmVzdHJpY3Rpb24+Ci0JPC9zaW1wbGVUeXBlPgotCTxzaW1wbGVUeXBlIG5hbWU9IkJhbmtDYXJkRXhwaXJ5Ij4KLQkJPGFubm90YXRpb24+Ci0JCQk8ZG9jdW1lbnRhdGlvbj4gRXhwaXJ5IGRhdGUgb2YgdGhlIGJhbmsgY2FyZCwgaW4gdGhlIGZvcm1hdCBZWVlZTU0uIFs2XSBvbmx5IGRpZ2l0cyBubwotCQkJCXdoaXRlc3BhY2UuIDwvZG9jdW1lbnRhdGlvbj4KLQkJPC9hbm5vdGF0aW9uPgotCQk8cmVzdHJpY3Rpb24gYmFzZT0ic3RyaW5nIj4KLQkJCTxwYXR0ZXJuIHZhbHVlPSIoXGQpezZ9Ii8+Ci0JCTwvcmVzdHJpY3Rpb24+Ci0JPC9zaW1wbGVUeXBlPgotCTxzaW1wbGVUeXBlIG5hbWU9IkJhbmtDYXJkQ1ZOdW0iPgotCQk8YW5ub3RhdGlvbj4KLQkJCTxkb2N1bWVudGF0aW9uPiBDb250YWlucyB0aGUgQ2FyZCB2ZXJpZmljYXRpb24gbnVtYmVyICh0eXBpY2FsbHkgcHJpbnRlZCBvbiB0aGUgYmFjayBvZgotCQkJCXRoZSBjYXJkLCBidXQgbm90IGVtYm9zc2VkIG9uIHRoZSBmcm9udCkuIFsxLi4xMF0gZGlnaXRzIG9ubHksIG5vIHdoaXRlc3BhY2UuCi0JCQk8L2RvY3VtZW50YXRpb24+Ci0JCTwvYW5ub3RhdGlvbj4KLQkJPHJlc3RyaWN0aW9uIGJhc2U9InN0cmluZyI+Ci0JCQk8cGF0dGVybiB2YWx1ZT0iKFxkKXsxLDEwfSIvPgotCQk8L3Jlc3RyaWN0aW9uPgotCTwvc2ltcGxlVHlwZT4KLQk8IS0tIFsxLi4yMF0gZGlnaXRzIG9ubHksIG5vIHdoaXRlc3BhY2UgLS0+Ci0JPHNpbXBsZVR5cGUgbmFtZT0iQ2hlcXVlTm8iPgotCQk8YW5ub3RhdGlvbj4KLQkJCTxkb2N1bWVudGF0aW9uPiBBY2NvdW50IEhvbGRlcuKAmXMgbmV4dCB1bnVzZWQgY2hlcXVlIG51bWJlci4gPC9kb2N1bWVudGF0aW9uPgotCQk8L2Fubm90YXRpb24+Ci0JCTxyZXN0cmljdGlvbiBiYXNlPSJzdHJpbmciPgotCQkJPHBhdHRlcm4gdmFsdWU9IihcZCl7MSwyMH0iLz4KLQkJPC9yZXN0cmljdGlvbj4KLQk8L3NpbXBsZVR5cGU+Ci0JPCEtLSBbMS4uMjBdIGFscGhhbnVtbmVyaWMsIG5vIHdoaXRlc3BhY2UgLS0+Ci0JPHNpbXBsZVR5cGUgbmFtZT0iUmVmTm8iPgotCQk8YW5ub3RhdGlvbj4KLQkJCTxkb2N1bWVudGF0aW9uPiBHZW5lcmljIHJlZmVyZW5jZSBudW1iZXIsIHVzZWQgaW4gc2V2ZXJhbCBjb250ZXh0cy4gPC9kb2N1bWVudGF0aW9uPgotCQk8L2Fubm90YXRpb24+Ci0JCTxyZXN0cmljdGlvbiBiYXNlPSJzdHJpbmciPgotCQkJPHBhdHRlcm4gdmFsdWU9IihcUyl7MSwyMH0iLz4KLQkJPC9yZXN0cmljdGlvbj4KLQk8L3NpbXBsZVR5cGU+Ci0JPCEtLSBbNy4uMTJdIGNoYXJzIGFuZCBkaWdpdHMgb25seSwgbm8gd2hpdGVzcGFjZSAtLT4KLQk8c2ltcGxlVHlwZSBuYW1lPSJDb250YWN0Tm8iPgotCQk8YW5ub3RhdGlvbj4KLQkJCTxkb2N1bWVudGF0aW9uPiBBIHRlbGVwaG9uZSBudW1iZXIuIDwvZG9jdW1lbnRhdGlvbj4KLQkJPC9hbm5vdGF0aW9uPgotCQk8cmVzdHJpY3Rpb24gYmFzZT0ic3RyaW5nIj4KLQkJCTxwYXR0ZXJuIHZhbHVlPSIoXFMpezcsMTJ9Ii8+Ci0JCTwvcmVzdHJpY3Rpb24+Ci0JPC9zaW1wbGVUeXBlPgotCTwhLS0gWzEuLjE1XSBjaGFycyBhbmQgZGlnaXRzIG9ubHksIG5vIHdoaXRlc3BhY2UgLS0+Ci0JPHNpbXBsZVR5cGUgbmFtZT0iQ3VycmVuY3lTeW1ib2wiPgotCQk8YW5ub3RhdGlvbj4KLQkJCTxkb2N1bWVudGF0aW9uPiBUaGUgY3VycmVuY3kgc3ltYm9sIG9mIHRoZSBjdXJyZW5jeSBiZWluZyB1c2VkIGluIGEgdHJhbnNhY3Rpb24sIGFzIHBlcgotCQkJCUlTTyA0MjE3LiA8L2RvY3VtZW50YXRpb24+Ci0JCTwvYW5ub3RhdGlvbj4KLQkJPHJlc3RyaWN0aW9uIGJhc2U9InN0cmluZyI+Ci0JCQk8cGF0dGVybiB2YWx1ZT0iKFxTKXsxLDN9Ii8+Ci0JCTwvcmVzdHJpY3Rpb24+Ci0JPC9zaW1wbGVUeXBlPgotCTwhLS0gWzEuLjIwXSBjaGFycyBhbmQgZGlnaXRzIG9ubHksIG5vIHdoaXRlc3BhY2UgLS0+Ci0JPHNpbXBsZVR5cGUgbmFtZT0iQ3VzdFJlZiI+Ci0JCTxyZXN0cmljdGlvbiBiYXNlPSJzdHJpbmciPgotCQkJPHBhdHRlcm4gdmFsdWU9IihcUyl7MSwyMH0iLz4KLQkJPC9yZXN0cmljdGlvbj4KLQk8L3NpbXBsZVR5cGU+Ci0JPCEtLSBbMTNdIGRpZ2l0cyBvbmx5LCBubyB3aGl0ZXNwYWNlIC0tPgotCTxzaW1wbGVUeXBlIG5hbWU9IkVBTiI+Ci0JCTxhbm5vdGF0aW9uPgotCQkJPGRvY3VtZW50YXRpb24+IEdlbmVyaWMgbG9naWNhbCBpZGVudGlmaWVyLCB1c2VkIGZvciBhIGNsaWVudCwgc2VydmVyIG9yIHRlcm1pbmFsLgotCQkJPC9kb2N1bWVudGF0aW9uPgotCQk8L2Fubm90YXRpb24+Ci0JCTxyZXN0cmljdGlvbiBiYXNlPSJzdHJpbmciPgotCQkJPHBhdHRlcm4gdmFsdWU9IihcZCl7MTN9Ii8+Ci0JCTwvcmVzdHJpY3Rpb24+Ci0JPC9zaW1wbGVUeXBlPgotCTxzaW1wbGVUeXBlIG5hbWU9IklETm8iPgotCQk8YW5ub3RhdGlvbj4KLQkJCTxkb2N1bWVudGF0aW9uPiBHb3Zlcm5tZW50IGlzc3VlZCBudW1iZXIgZm9yIGEgY2l0aXplbi4gR292ZXJubWVudCBJZGVudGl0eSBOdW1iZXIgVHlwZQotCQkJCVsyMF0gZGlnaXRzLCBjaGFycywgbm8gd2hpdGUgc3BhY2UuIDwvZG9jdW1lbnRhdGlvbj4KLQkJPC9hbm5vdGF0aW9uPgotCQk8cmVzdHJpY3Rpb24gYmFzZT0ic3RyaW5nIj4KLQkJCTxwYXR0ZXJuIHZhbHVlPSIoXFMpezAsMjB9Ii8+Ci0JCTwvcmVzdHJpY3Rpb24+Ci0JPC9zaW1wbGVUeXBlPgotCTwhLS0gQ29uc3VtZXIgTG9jYXRpb24gUmVmZXJlbmNlIHN1Y2ggYXMgR2lTIGRhdGFbMjBdIGRpZ2l0cywgY2hhcnMsIG5vIHdoaXRlIHNwYWNlLS0+Ci0JPHNpbXBsZVR5cGUgbmFtZT0iTG9jUmVmIj4KLQkJPHJlc3RyaWN0aW9uIGJhc2U9InN0cmluZyI+Ci0JCQk8cGF0dGVybiB2YWx1ZT0iKFxTKXswLDIwfSIvPgotCQk8L3Jlc3RyaWN0aW9uPgotCTwvc2ltcGxlVHlwZT4KLQk8IS0tIFsxLi40MF0gZGlnaXRzIG9ubHksIG5vIHdoaXRlc3BhY2UgLS0+Ci0JPHNpbXBsZVR5cGUgbmFtZT0iTUlDUiI+Ci0JCTxhbm5vdGF0aW9uPgotCQkJPGRvY3VtZW50YXRpb24+IFRoZSBNYWduZXRpYyBJbmsgQ2hlcXVlIFJlYWRlciAoTUlDUikgaXMgdGhlIGVudGlyZSBsaW5lIG9mIG51bWJlcnMgYXQKLQkJCQl0aGUgYm90dG9tIG9mIHRoZSBjaGVxdWUuIEluY2x1ZGVzIHRoZSB0cmFuc2l0IG51bWJlciwgYWNjb3VudCBudW1iZXIsIGFuZCBjaGVxdWUKLQkJCQludW1iZXIuIDwvZG9jdW1lbnRhdGlvbj4KLQkJPC9hbm5vdGF0aW9uPgotCQk8cmVzdHJpY3Rpb24gYmFzZT0ic3RyaW5nIj4KLQkJCTxwYXR0ZXJuIHZhbHVlPSIoXGQpezEsNDB9Ii8+Ci0JCTwvcmVzdHJpY3Rpb24+Ci0JPC9zaW1wbGVUeXBlPgotCTwhLS0gWzEuLjZdIGRpZ2l0cyBvbmx5LCBubyB3aGl0ZXNwYWNlIC0tPgotCTxzaW1wbGVUeXBlIG5hbWU9Ik1zZ0lEVW5pcXVlTnVtYmVyIj4KLQkJPGFubm90YXRpb24+Ci0JCQk8ZG9jdW1lbnRhdGlvbj4gNiBkaWdpdCBzZXF1ZW50aWFsIG51bWJlciBmb3JtcyBwYXJ0IG9mIHRoZSByZXF1ZXN0IG1lc3NhZ2UgaWRlbnRpZmllci4KLQkJCTwvZG9jdW1lbnRhdGlvbj4KLQkJPC9hbm5vdGF0aW9uPgotCQk8cmVzdHJpY3Rpb24gYmFzZT0icG9zaXRpdmVJbnRlZ2VyIj4KLQkJCTx0b3RhbERpZ2l0cyB2YWx1ZT0iNiIvPgotCQk8L3Jlc3RyaWN0aW9uPgotCTwvc2ltcGxlVHlwZT4KLQk8IS0tIFsxNF0gb25seSBkaWdpdHMgbm8gd2hpdGVzcGFjZSAtLT4KLQk8c2ltcGxlVHlwZSBuYW1lPSJNc2dJRERhdGVUaW1lIj4KLQkJPGFubm90YXRpb24+Ci0JCQk8ZG9jdW1lbnRhdGlvbj4gRGF0ZSBUaW1lIHN0YW1wIGluIHRoZSBmb2xsb3dpbmcgZm9ybWF0LCB5eXl5bW1kZEhITU1TUy4gRm9ybXMgcGFydCBvZgotCQkJCXRoZSByZXF1ZXN0IG1lc3NhZ2UgaWRlbnRpZmllci4gPC9kb2N1bWVudGF0aW9uPgotCQk8L2Fubm90YXRpb24+Ci0JCTxyZXN0cmljdGlvbiBiYXNlPSJzdHJpbmciPgotCQkJPHBhdHRlcm4gdmFsdWU9IihcZCl7MTR9Ii8+Ci0JCTwvcmVzdHJpY3Rpb24+Ci0JPC9zaW1wbGVUeXBlPgotCTwhLS0gU3RyaW5nIHdpdGggd2hpdGVzcGFjZSBbMC4uMTYwXSBhbnkgY2hhcnMgLS0+Ci0JPHNpbXBsZVR5cGUgbmFtZT0iTXNnIj4KLQkJPHJlc3RyaWN0aW9uIGJhc2U9InN0cmluZyI+Ci0JCQk8bWF4TGVuZ3RoIHZhbHVlPSIxNjAiLz4KLQkJPC9yZXN0cmljdGlvbj4KLQk8L3NpbXBsZVR5cGU+Ci0JPCEtLSBbMy4uMTNdIGNoYXJzICYgZGlnaXRzLCBubyB3aGl0ZXNwYWNlLCBubyB3aGl0ZXNwYWNlIC0tPgotCTxzaW1wbGVUeXBlIG5hbWU9Ik1TTk8iPgotCQk8YW5ub3RhdGlvbj4KLQkJCTxkb2N1bWVudGF0aW9uPiBNZXRlciBzZXJpYWwgbnVtYmVyIG9mIHRoZSBtZXRlciB3aGVyZSB0aGUgdG9rZW4gd2lsbCBiZSBlbnRlcmVkLgotCQkJPC9kb2N1bWVudGF0aW9uPgotCQk8L2Fubm90YXRpb24+Ci0JCTxyZXN0cmljdGlvbiBiYXNlPSJzdHJpbmciPgotCQkJPHBhdHRlcm4gdmFsdWU9IihcUyl7MywxM30iLz4KLQkJPC9yZXN0cmljdGlvbj4KLQk8L3NpbXBsZVR5cGU+Ci0JPHNpbXBsZVR5cGUgbmFtZT0iTlJTVHJhY2syRGF0YSI+Ci0JCTxhbm5vdGF0aW9uPgotCQkJPGRvY3VtZW50YXRpb24+IE1hZ25ldGljIE1ldGVyIElEIENhcmQgVHJhY2sgMiBUeXBlIChzZWUgTlJTIDAwOS00OjE5OTMpIAotCQkJPC9kb2N1bWVudGF0aW9uPgotCQk8L2Fubm90YXRpb24+Ci0JCTxyZXN0cmljdGlvbiBiYXNlPSJzdHJpbmciPgotCQkJPHBhdHRlcm4KLQkJCQl2YWx1ZT0iNjAwNzI3KFxkKXsxMn09KD18KChbMC02XVswLTldfDdbMC05XSkoMFswLTldfDFbMC0yXSkpKT0oWzAtOV1bMS05XSkoWzAtOV1bMS05XSkoXGQpezZ9KFswLTldWzEtOV0pKFswLTldKSIKLQkJCS8+Ci0JCTwvcmVzdHJpY3Rpb24+Ci0JPC9zaW1wbGVUeXBlPgotCTwhLS0gU3RyaW5nIHdpdGggd2hpdGVzcGFjZSBbMC4uODBdIGFueSBjaGFycyAtLT4KLQk8c2ltcGxlVHlwZSBuYW1lPSJPcmdhbmlzYXRpb25OYW1lIj4KLQkJPHJlc3RyaWN0aW9uIGJhc2U9InN0cmluZyI+Ci0JCQk8bWF4TGVuZ3RoIHZhbHVlPSI4MCIvPgotCQk8L3Jlc3RyaWN0aW9uPgotCTwvc2ltcGxlVHlwZT4KLQk8IS0tIFsxLi4xMF0gY2hhcnMgJiBkaWdpdHMsIG5vIHdoaXRlc3BhY2UgLS0+Ci0JPHNpbXBsZVR5cGUgbmFtZT0iT3BOYW1lIj4KLQkJPGFubm90YXRpb24+Ci0JCQk8ZG9jdW1lbnRhdGlvbj4gTmFtZSBvZiB0aGUgb3BlcmF0b3IgaW5pdGlhdGluZyB0aGUgdXNlIGNhc2UuIDwvZG9jdW1lbnRhdGlvbj4KLQkJPC9hbm5vdGF0aW9uPgotCQk8cmVzdHJpY3Rpb24gYmFzZT0ic3RyaW5nIj4KLQkJCTxwYXR0ZXJuIHZhbHVlPSIoXFMpezEsMTB9Ii8+Ci0JCTwvcmVzdHJpY3Rpb24+Ci0JPC9zaW1wbGVUeXBlPgotCTwhLS0gWzYuLjE1XSBjaGFycyAmIGRpZ2l0cywgbm8gd2hpdGVzcGFjZSAtLT4KLQk8c2ltcGxlVHlwZSBuYW1lPSJQYXNzd29yZCI+Ci0JCTxyZXN0cmljdGlvbiBiYXNlPSJzdHJpbmciPgotCQkJPHBhdHRlcm4gdmFsdWU9IihcUyl7NiwxNX0iLz4KLQkJPC9yZXN0cmljdGlvbj4KLQk8L3NpbXBsZVR5cGU+Ci0JPCEtLSBbMS4uNDBdIEFueXRoaW5nIGV4Y2VwdCBkaWdpdHMgLS0+Ci0JPHNpbXBsZVR5cGUgbmFtZT0iUGVyc29uTmFtZSI+Ci0JCTxyZXN0cmljdGlvbiBiYXNlPSJzdHJpbmciPgotCQkJPHBhdHRlcm4gdmFsdWU9IihcRCl7MSw0MH0iLz4KLQkJPC9yZXN0cmljdGlvbj4KLQk8L3NpbXBsZVR5cGU+Ci0JPHNpbXBsZVR5cGUgbmFtZT0iUGVyY2VudGFnZSI+Ci0JCTxyZXN0cmljdGlvbiBiYXNlPSJkZWNpbWFsIj4KLQkJCTxtaW5JbmNsdXNpdmUgdmFsdWU9IjAiLz4KLQkJCTxtYXhJbmNsdXNpdmUgdmFsdWU9IjEwMCIvPgotCQk8L3Jlc3RyaWN0aW9uPgotCTwvc2ltcGxlVHlwZT4KLQk8IS0tPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4tLT4KLQk8c2ltcGxlVHlwZSBuYW1lPSJQd3JMbXQiPgotCQk8YW5ub3RhdGlvbj4KLQkJCTxkb2N1bWVudGF0aW9uPiBQb3dlciBsaW1pdCB2YWx1ZS4gPC9kb2N1bWVudGF0aW9uPgotCQk8L2Fubm90YXRpb24+Ci0JCTxyZXN0cmljdGlvbiBiYXNlPSJzdHJpbmciPgotCQkJPHBhdHRlcm4gdmFsdWU9IihcZCl7MSwzfVwuKFxkKXsxfSIvPgotCQk8L3Jlc3RyaWN0aW9uPgotCTwvc2ltcGxlVHlwZT4KLQk8IS0tIFN0cmluZyB3aXRoIHdoaXRlc3BhY2UgWzEuLjRdIGFueSBjaGFycyAtLT4KLQk8c2ltcGxlVHlwZSBuYW1lPSJSZXNvdXJjZVNJVW5pdCI+Ci0JCTxhbm5vdGF0aW9uPgotCQkJPGRvY3VtZW50YXRpb24+IFNJIHVuaXQgb2YgdGhlIHJlc291cmNlIGJlaW5nIHZlbmRlZC4gPC9kb2N1bWVudGF0aW9uPgotCQk8L2Fubm90YXRpb24+Ci0JCTxyZXN0cmljdGlvbiBiYXNlPSJzdHJpbmciPgotCQkJPHBhdHRlcm4gdmFsdWU9IihcUyl7MSw0fSIvPgotCQk8L3Jlc3RyaWN0aW9uPgotCTwvc2ltcGxlVHlwZT4KLQk8IS0tIFsxXSBkaWdpdCBubyB3aGl0ZXNwYWNlIC0tPgotCTxzaW1wbGVUeXBlIG5hbWU9IlNUU0tleVJldk5vIj4KLQkJPGFubm90YXRpb24+Ci0JCQk8ZG9jdW1lbnRhdGlvbj4gS2V5IFJldmlzaW9uIG51bWJlciBvZiBhIHN1cHBseSBncm91cCwgYXMgc3BlY2lmaWVkIGJ5IFNUUy4KLQkJCTwvZG9jdW1lbnRhdGlvbj4KLQkJPC9hbm5vdGF0aW9uPgotCQk8cmVzdHJpY3Rpb24gYmFzZT0ic3RyaW5nIj4KLQkJCTxwYXR0ZXJuIHZhbHVlPSIoXGQpezF9Ii8+Ci0JCTwvcmVzdHJpY3Rpb24+Ci0JPC9zaW1wbGVUeXBlPgotCTwhLS0gWzJdIG9ubHkgZGlnaXRzIG5vIHdoaXRlc3BhY2UgLS0+Ci0JPHNpbXBsZVR5cGUgbmFtZT0iU1RTVFQiPgotCQk8YW5ub3RhdGlvbj4KLQkJCTxkb2N1bWVudGF0aW9uPiBUb2tlbiB0ZWNobm9sb2d5IHNlZSBOUlMwMDktNC0xOjE5OTQsIGZvciBTVFMsIE1hZ0NhcmQoMDEpIG9yCi0JCQkJTnVtZXJpYygwMikuIDwvZG9jdW1lbnRhdGlvbj4KLQkJPC9hbm5vdGF0aW9uPgotCQk8cmVzdHJpY3Rpb24gYmFzZT0ic3RyaW5nIj4KLQkJCTxwYXR0ZXJuIHZhbHVlPSIoXGQpezJ9Ii8+Ci0JCTwvcmVzdHJpY3Rpb24+Ci0JPC9zaW1wbGVUeXBlPgotCTwhLS0gWzJdIG9ubHkgZGlnaXRzIG5vIHdoaXRlc3BhY2UgLS0+Ci0JPHNpbXBsZVR5cGUgbmFtZT0iU1RTQVQiPgotCQk8YW5ub3RhdGlvbj4KLQkJCTxkb2N1bWVudGF0aW9uPiBBbGdvcml0aG0gVGVjaG5vbG9neSBzZWUgTlJTMDA5LTQtMToxOTk0LCBmb3IgU1RTIDEsICgwNykuCi0JCQk8L2RvY3VtZW50YXRpb24+Ci0JCTwvYW5ub3RhdGlvbj4KLQkJPHJlc3RyaWN0aW9uIGJhc2U9InN0cmluZyI+Ci0JCQk8cGF0dGVybiB2YWx1ZT0iKFxkKXsyfSIvPgotCQk8L3Jlc3RyaWN0aW9uPgotCTwvc2ltcGxlVHlwZT4KLQk8IS0tIFs2XSBvbmx5IGRpZ2l0cyBubyB3aGl0ZXNwYWNlIC0tPgotCTxzaW1wbGVUeXBlIG5hbWU9IlNUU1N1cHBseUdyb3VwQ29kZSI+Ci0JCTxhbm5vdGF0aW9uPgotCQkJPGRvY3VtZW50YXRpb24+IFN1cHBseSBHcm91cCBDb2RlIChTR0MpIGFzIGRlZmluZWQgYnkgU1RTLCBnZW5lcmFsbHkgcmVmZXJzIHRvIHdoaWNoCi0JCQkJdXRpbGl0eSB3aWxsIHJlY2VpdmUgdGhlIHJldmVudWUuIEdyb3VwIGNvZGVkIFNHQyBtdXN0IGJlIGF2b2lkZWQgaW4gT25saW5lIFZlbmRpbmcKLQkJCQlzeXN0ZW1zIGFzIHRoZXNlIGNhbiBiZSBhYnVzZWQgZm9yIGZyYXVkdWxlbnQgcHVycG9zZXMuPC9kb2N1bWVudGF0aW9uPgotCQk8L2Fubm90YXRpb24+Ci0JCTxyZXN0cmljdGlvbiBiYXNlPSJzdHJpbmciPgotCQkJPHBhdHRlcm4gdmFsdWU9IihcZCl7Nn0iLz4KLQkJPC9yZXN0cmljdGlvbj4KLQk8L3NpbXBsZVR5cGU+Ci0JPCEtLSBbMl0gb25seSBkaWdpdHMgbm8gd2hpdGVzcGFjZSAtLT4KLQk8c2ltcGxlVHlwZSBuYW1lPSJTVFNUYXJpZmZJbmRleCI+Ci0JCTxhbm5vdGF0aW9uPgotCQkJPGRvY3VtZW50YXRpb24+IFJlZmVycyB0byB0aGUgdGFyaWZmIGluZGV4IChUSSkgYXMgZGVmaW5lZCBieSBTVFMuIDwvZG9jdW1lbnRhdGlvbj4KLQkJPC9hbm5vdGF0aW9uPgotCQk8cmVzdHJpY3Rpb24gYmFzZT0ic3RyaW5nIj4KLQkJCTxwYXR0ZXJuIHZhbHVlPSIoXGQpezJ9Ii8+Ci0JCTwvcmVzdHJpY3Rpb24+Ci0JPC9zaW1wbGVUeXBlPgotCTwhLS0gWzEuLjIwXSBkaWdpdHMgb25seSwgbm8gd2hpdGVzcGFjZSAtLT4KLQk8c2ltcGxlVHlwZSBuYW1lPSJTVFNDaXBoZXJUZXh0Ij4KLQkJPGFubm90YXRpb24+Ci0JCQk8ZG9jdW1lbnRhdGlvbj4gRW5jcnlwdGVkIHRleHQgYXMgc3BlY2lmaWVkIGJ5IFNUUy4gPC9kb2N1bWVudGF0aW9uPgotCQk8L2Fubm90YXRpb24+Ci0JCTxyZXN0cmljdGlvbiBiYXNlPSJzdHJpbmciPgotCQkJPHBhdHRlcm4gdmFsdWU9IihcZCl7MjB9Ii8+Ci0JCTwvcmVzdHJpY3Rpb24+Ci0JPC9zaW1wbGVUeXBlPgotCTwhLS0gVGF4IHJlZiBbMTBdIGRpZ2l0cyBubyB3aGl0ZXNwYWNlIC0tPgotCTxzaW1wbGVUeXBlIG5hbWU9IlRheFJlZiI+Ci0JCTxyZXN0cmljdGlvbiBiYXNlPSJzdHJpbmciPgotCQkJPHBhdHRlcm4gdmFsdWU9IihcZCl7MTB9Ii8+Ci0JCTwvcmVzdHJpY3Rpb24+Ci0JPC9zaW1wbGVUeXBlPgotCTxzaW1wbGVUeXBlIG5hbWU9IldhdGVyRmFjdG9yIj4KLQkJPHJlc3RyaWN0aW9uIGJhc2U9InN0cmluZyI+Ci0JCQk8cGF0dGVybiB2YWx1ZT0iKFxkKXsxLDZ9Ii8+Ci0JCTwvcmVzdHJpY3Rpb24+Ci0JPC9zaW1wbGVUeXBlPgotCTwhLS0gRWxlbWVudCBDb25zdHJhaW50cyBFbmRzLS0+Ci0JPCEtLSBOb24tVm9saXRpbGUgRW51bWVyYXRlZCAgVHlwZXMgc3RhcnRzIC0tPgotCTxzaW1wbGVUeXBlIG5hbWU9IkNoZXF1ZVR5cGUiPgotCQk8cmVzdHJpY3Rpb24gYmFzZT0ic3RyaW5nIj4KLQkJCTxlbnVtZXJhdGlvbiB2YWx1ZT0iUGVyc29uYWwiLz4KLQkJCTxlbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGFueSIvPgotCQkJPGVudW1lcmF0aW9uIHZhbHVlPSJHb3Zlcm5tZW50Ii8+Ci0JCTwvcmVzdHJpY3Rpb24+Ci0JPC9zaW1wbGVUeXBlPgotCTxzaW1wbGVUeXBlIG5hbWU9IkJhdGNoU3RhdHVzVHlwZSI+Ci0JCTxhbm5vdGF0aW9uPgotCQkJPGRvY3VtZW50YXRpb24+IEVudW1lcmF0aW9uIHRoYXQgaXMgdXNlZCB0byBpbmRpY2F0ZSBhIHN0YXR1cyBvZiBhIGJhdGNoLCAib3BlbiIgb3IKLQkJCQkiY2xvc2VkIi4gPC9kb2N1bWVudGF0aW9uPgotCQk8L2Fubm90YXRpb24+Ci0JCTxyZXN0cmljdGlvbiBiYXNlPSJzdHJpbmciPgotCQkJPGVudW1lcmF0aW9uIHZhbHVlPSJvcGVuIi8+Ci0JCQk8ZW51bWVyYXRpb24gdmFsdWU9ImNsb3NlZCIvPgotCQk8L3Jlc3RyaWN0aW9uPgotCTwvc2ltcGxlVHlwZT4KLQk8c2ltcGxlVHlwZSBuYW1lPSJDcmVkaXRUb2tlblN1YkNsYXNzVHlwZSI+Ci0JCTxhbm5vdGF0aW9uPgotCQkJPGRvY3VtZW50YXRpb24+IFRva2VuIHN1Yi1jbGFzcyB0eXBlcyBhcyBzcGVjaWZpZWQgYnkgU1RTLiA8L2RvY3VtZW50YXRpb24+Ci0JCTwvYW5ub3RhdGlvbj4KLQkJPHJlc3RyaWN0aW9uIGJhc2U9InN0cmluZyI+Ci0JCQk8ZW51bWVyYXRpb24gdmFsdWU9IkVsZWN0cmljaXR5IFRva2VuIi8+Ci0JCQk8ZW51bWVyYXRpb24gdmFsdWU9IldhdGVyIFRva2VuIi8+Ci0JCQk8ZW51bWVyYXRpb24gdmFsdWU9IkdhcyBUb2tlbiIvPgotCQkJPGVudW1lcmF0aW9uIHZhbHVlPSJDb25uZWN0aW9uIHRpbWUgVG9rZW4iLz4KLQkJCTxlbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVuY3kgVG9rZW4iLz4KLQkJPC9yZXN0cmljdGlvbj4KLQk8L3NpbXBsZVR5cGU+Ci0JPHNpbXBsZVR5cGUgbmFtZT0iTm9uTWV0ZXJTcGVjaWZpY0VuZyI+Ci0JCTxhbm5vdGF0aW9uPgotCQkJPGRvY3VtZW50YXRpb24+IFNob3J0ZW5lZCBuYW1lcyBmb3Igbm9uLU1ldGVyIHNwZWNpZmljIGVuZ2luZWVyaW5nIHRva2VucyBhcyBkZWZpbmVkIGJ5Ci0JCQkJU1RTLiA8L2RvY3VtZW50YXRpb24+Ci0JCTwvYW5ub3RhdGlvbj4KLQkJPHJlc3RyaWN0aW9uIGJhc2U9InN0cmluZyI+Ci0JCQk8ZW51bWVyYXRpb24gdmFsdWU9IlRlc3RBbGwiLz4KLQkJCTxlbnVtZXJhdGlvbiB2YWx1ZT0iVGVzdEJyZWFrZXIiLz4KLQkJCTxlbnVtZXJhdGlvbiB2YWx1ZT0iVGVzdERpc3AiLz4KLQkJCTxlbnVtZXJhdGlvbiB2YWx1ZT0iRGlzcFB3ckxtdCIvPgotCQkJPGVudW1lcmF0aW9uIHZhbHVlPSJEaXNwVEkiLz4KLQkJCTxlbnVtZXJhdGlvbiB2YWx1ZT0iRGlzcEtSTiIvPgotCQkJPGVudW1lcmF0aW9uIHZhbHVlPSJEaXNwVGFtcGVyIi8+Ci0JCQk8ZW51bWVyYXRpb24gdmFsdWU9IkRpc3BJbnN0UHdyIi8+Ci0JCQk8ZW51bWVyYXRpb24gdmFsdWU9IkRpc3BDb25zVG90Ii8+Ci0JCQk8ZW51bWVyYXRpb24gdmFsdWU9IkRpc3BVbmJhbGFuY2UiLz4KLQkJCTxlbnVtZXJhdGlvbiB2YWx1ZT0iRGlzcFZlciIvPgotCQk8L3Jlc3RyaWN0aW9uPgotCTwvc2ltcGxlVHlwZT4KLQk8c2ltcGxlVHlwZSBuYW1lPSJNZXRlclNwZWNpZmljRW5nIj4KLQkJPGFubm90YXRpb24+Ci0JCQk8ZG9jdW1lbnRhdGlvbj4gU2hvcnRlbmVkIG5hbWVzIGZvciBNZXRlciBzcGVjaWZpYyBlbmdpbmVlcmluZyB0b2tlbnMgYXMgZGVmaW5lZCBieSBTVFMuCi0JCQk8L2RvY3VtZW50YXRpb24+Ci0JCTwvYW5ub3RhdGlvbj4KLQkJPHJlc3RyaWN0aW9uIGJhc2U9InN0cmluZyI+Ci0JCQk8ZW51bWVyYXRpb24gdmFsdWU9IlNldFB3ckxtdCIvPgotCQkJPGVudW1lcmF0aW9uIHZhbHVlPSJTZXRQaFVuYmFsYW5jZSIvPgotCQkJPGVudW1lcmF0aW9uIHZhbHVlPSJBZGREZWZhdWx0Q3JlZCIvPgotCQkJPGVudW1lcmF0aW9uIHZhbHVlPSJDbGVhckNyZWQiLz4KLQkJCTxlbnVtZXJhdGlvbiB2YWx1ZT0iQ2xlYXJUYW1wZXIiLz4KLQkJCTxlbnVtZXJhdGlvbiB2YWx1ZT0iRW5nS0NUIi8+Ci0JCQk8ZW51bWVyYXRpb24gdmFsdWU9IlNldFdhdGVyRmFjdCIvPgotCQk8L3Jlc3RyaWN0aW9uPgotCTwvc2ltcGxlVHlwZT4KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL0Fic3RyYWN0VGVzdENhc2UuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9BYnN0cmFjdFRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiNTQ4MWYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL0Fic3RyYWN0VGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczI7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCi0NCi1pbXBvcnQgamF2YS5pby5GaWxlOw0KLQ0KLS8qKg0KLSAqIEFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIHRlc3QgY2FzZXMuDQotICovDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VGVzdENhc2UNCi0gICAgICAgIGV4dGVuZHMgVGVzdENhc2Ugew0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHRlc3REaXIgPSAidGVzdCIgKyBGaWxlLnNlcGFyYXRvcjsNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBzYW1wbGVEaXIgPSAic2FtcGxlcyIgKyBGaWxlLnNlcGFyYXRvcjsNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBvdXREaXIgPSAidGFyZ2V0IiArIEZpbGUuc2VwYXJhdG9yICsgImdlbmVyYXRlZCIgKw0KLSAgICAgICAgICAgIEZpbGUuc2VwYXJhdG9yICsNCi0gICAgICAgICAgICAic2FtcGxlcyIgKw0KLSAgICAgICAgICAgIEZpbGUuc2VwYXJhdG9yOw0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHRlbXBEaXIgPSAidGFyZ2V0IiArIEZpbGUuc2VwYXJhdG9yICsgImdlbmVyYXRlZCIgKw0KLSAgICAgICAgICAgIEZpbGUuc2VwYXJhdG9yICsNCi0gICAgICAgICAgICAidGVtcCI7DQotICAgIHByb3RlY3RlZCBTdHJpbmcgdGVzdFJlc291cmNlRGlyID0gInRlc3QtcmVzb3VyY2VzIjsNCi0NCi0NCi0gICAgLyoqDQotICAgICAqIEJhc2VkaXIgZm9yIGFsbCBmaWxlIEkvTy4gSW1wb3J0YW50IHdoZW4gcnVubmluZyB0ZXN0cyBmcm9tDQotICAgICAqIHRoZSByZWFjdG9yLiAgTm90ZSB0aGF0IGFueW9uZSBjYW4gdXNlIHRoaXMgc3RhdGljYWxseS4NCi0gICAgICovDQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGJhc2VkaXI7DQotDQotICAgIHN0YXRpYyB7DQotICAgICAgICBiYXNlZGlyID0gU3lzdGVtLmdldFByb3BlcnR5KCJiYXNlZGlyIik7DQotICAgICAgICBpZiAoYmFzZWRpciA9PSBudWxsKSB7DQotICAgICAgICAgICAgYmFzZWRpciA9IG5ldyBGaWxlKCIuIikuZ2V0QWJzb2x1dGVQYXRoKCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIEBwYXJhbSB0ZXN0TmFtZQ0KLSAgICAgKi8NCi0gICAgcHVibGljIEFic3RyYWN0VGVzdENhc2UoU3RyaW5nIHRlc3ROYW1lKSB7DQotICAgICAgICBzdXBlcih0ZXN0TmFtZSk7DQotICAgICAgICB0ZXN0RGlyID0gbmV3IEZpbGUoYmFzZWRpciwgdGVzdERpcikuZ2V0QWJzb2x1dGVQYXRoKCk7DQotICAgICAgICBzYW1wbGVEaXIgPSBuZXcgRmlsZShiYXNlZGlyLCBzYW1wbGVEaXIpLmdldEFic29sdXRlUGF0aCgpOw0KLSAgICAgICAgb3V0RGlyID0gbmV3IEZpbGUoYmFzZWRpciwgb3V0RGlyKS5nZXRBYnNvbHV0ZVBhdGgoKTsNCi0gICAgICAgIHRlbXBEaXIgPSBuZXcgRmlsZShiYXNlZGlyLCB0ZW1wRGlyKS5nZXRBYnNvbHV0ZVBhdGgoKTsNCi0gICAgfQ0KLQ0KLQ0KLSAgICBwdWJsaWMgRmlsZSBnZXRUZXN0UmVzb3VyY2VGaWxlKFN0cmluZyByZWxhdGl2ZVBhdGgpIHsNCi0gICAgICAgIHJldHVybiBuZXcgRmlsZSh0ZXN0UmVzb3VyY2VEaXIsIHJlbGF0aXZlUGF0aCk7DQotICAgIH0NCi19DQotDQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2FkZHJlc3NpbmcvQWRkcmVzc2luZ0ZpbmFsU2VydmljZVRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9hZGRyZXNzaW5nL0FkZHJlc3NpbmdGaW5hbFNlcnZpY2VUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxNTNhZDQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2FkZHJlc3NpbmcvQWRkcmVzc2luZ0ZpbmFsU2VydmljZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZzsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50Lk9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuU2VydmljZUNsaWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5TZXJ2aWNlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkluT25seUF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5PdXRPbmx5QXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5FY2hvOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLnV0aWwuVGVzdENvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmludGVncmF0aW9uLlV0aWxTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pbnRlZ3JhdGlvbi5VdGlsU2VydmVyQmFzZWRUZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5SYXdYTUxJTk9ubHlNZXNzYWdlUmVjZWl2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuUmF3WE1MSU5PdXRNZXNzYWdlUmVjZWl2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLlV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMQ29uc3RhbnRzOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotcHVibGljIGNsYXNzIEFkZHJlc3NpbmdGaW5hbFNlcnZpY2VUZXN0IGV4dGVuZHMgVXRpbFNlcnZlckJhc2VkVGVzdENhc2UgaW1wbGVtZW50cyBUZXN0Q29uc3RhbnRzIHsKLQotICAgIHByb3RlY3RlZCBRTmFtZSB0cmFuc3BvcnROYW1lID0gbmV3IFFOYW1lKCJodHRwOi8vbG9jYWxob3N0L215IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTnVsbFRyYW5zcG9ydCIpOwotICAgIEVuZHBvaW50UmVmZXJlbmNlIHRhcmdldEVQUiA9IG5ldyBFbmRwb2ludFJlZmVyZW5jZSgKLSAgICAgICAgICAgICJodHRwOi8vMTI3LjAuMC4xOiIgKyAoVXRpbFNlcnZlci5URVNUSU5HX1BPUlQpICsKLSAgICAgICAgICAgICAgICAgICAgIi9heGlzMi9zZXJ2aWNlcy9FY2hvWE1MU2VydmljZS9lY2hvT01FbGVtZW50Iik7Ci0KLSAgICBFbmRwb2ludFJlZmVyZW5jZSByZXBseVRvID0gbmV3IEVuZHBvaW50UmVmZXJlbmNlKAotICAgICAgICAgICAgImh0dHA6Ly8xMjcuMC4wLjE6IiArIChVdGlsU2VydmVyLlRFU1RJTkdfUE9SVCkgKwotICAgICAgICAgICAgICAgICAgICAiL2F4aXMyL3NlcnZpY2VzL1JlZGlyZWN0UmVjZWl2ZXJTZXJ2aWNlL2VjaG9PTUVsZW1lbnRSZXNwb25zZSIpOwotCi0gICAgRW5kcG9pbnRSZWZlcmVuY2UgZmF1bHRUbyA9IG5ldyBFbmRwb2ludFJlZmVyZW5jZSgKLSAgICAgICAgICAgICJodHRwOi8vMTI3LjAuMC4xOiIgKyAoVXRpbFNlcnZlci5URVNUSU5HX1BPUlQpICsKLSAgICAgICAgICAgICAgICAgICAgIi9heGlzMi9zZXJ2aWNlcy9SZWRpcmVjdFJlY2VpdmVyU2VydmljZS9mYXVsdCIpOwotCi0gICAgcHJvdGVjdGVkIEF4aXNDb25maWd1cmF0aW9uIGVuZ2luZVJlZ2lzdHJ5OwotICAgIHByb3RlY3RlZCBNZXNzYWdlQ29udGV4dCBtYzsKLSAgICBwcm90ZWN0ZWQgU2VydmljZUNvbnRleHQgc2VydmljZUNvbnRleHQ7Ci0gICAgcHJvdGVjdGVkIEF4aXNTZXJ2aWNlIGVjaG9TZXJ2aWNlOwotICAgIHByb3RlY3RlZCBBeGlzU2VydmljZSByclNlcnZpY2U7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIHJldHVybiBnZXRUZXN0U2V0dXAobmV3IFRlc3RTdWl0ZShBZGRyZXNzaW5nRmluYWxTZXJ2aWNlVGVzdC5jbGFzcykpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGVjaG9TZXJ2aWNlID0gVXRpbHMuY3JlYXRlU2ltcGxlU2VydmljZShzZXJ2aWNlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBSYXdYTUxJTk91dE1lc3NhZ2VSZWNlaXZlcigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWNoby5jbGFzcy5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25OYW1lKTsKLSAgICAgICAgZWNob1NlcnZpY2UuZ2V0T3BlcmF0aW9uKG9wZXJhdGlvbk5hbWUpLnNldE91dHB1dEFjdGlvbigiZWNob09NRWxlbWVudFJlc3BvbnNlIik7Ci0gICAgICAgIFV0aWxTZXJ2ZXIuZGVwbG95U2VydmljZShlY2hvU2VydmljZSk7Ci0KLSAgICAgICAgcnJTZXJ2aWNlID0gY3JlYXRlUmVkaXJlY3RSZWNlaXZlclNlcnZpY2UoKTsKLSAgICAgICAgVXRpbFNlcnZlci5kZXBsb3lTZXJ2aWNlKHJyU2VydmljZSk7Ci0gICAgfQotCi0gICAgQXhpc1NlcnZpY2UgY3JlYXRlUmVkaXJlY3RSZWNlaXZlclNlcnZpY2UoKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSA9IG5ldyBBeGlzU2VydmljZSgiUmVkaXJlY3RSZWNlaXZlclNlcnZpY2UiKTsKLQotICAgICAgICBzZXJ2aWNlLnNldENsYXNzTG9hZGVyKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkpOwotICAgICAgICBzZXJ2aWNlLmFkZFBhcmFtZXRlcigKLSAgICAgICAgICAgICAgICBuZXcgUGFyYW1ldGVyKENvbnN0YW50cy5TRVJWSUNFX0NMQVNTLCBSZWRpcmVjdFJlY2VpdmVyLmNsYXNzLmdldE5hbWUoKSkpOwotCi0gICAgICAgIEF4aXNPcGVyYXRpb24gYXhpc09wID0gbmV3IEluT25seUF4aXNPcGVyYXRpb24obmV3IFFOYW1lKCJlY2hvT01FbGVtZW50UmVzcG9uc2UiKSk7Ci0KLSAgICAgICAgYXhpc09wLnNldE1lc3NhZ2VSZWNlaXZlcihuZXcgUmF3WE1MSU5Pbmx5TWVzc2FnZVJlY2VpdmVyKCkpOwotICAgICAgICBheGlzT3Auc2V0U3R5bGUoV1NETENvbnN0YW50cy5TVFlMRV9SUEMpOwotICAgICAgICBzZXJ2aWNlLmFkZE9wZXJhdGlvbihheGlzT3ApOwotICAgICAgICBzZXJ2aWNlLm1hcEFjdGlvblRvT3BlcmF0aW9uKENvbnN0YW50cy5BWElTMl9OQU1FU1BBQ0VfVVJJICsgIi8iICsgImVjaG9PTUVsZW1lbnRSZXNwb25zZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpc09wKTsKLQotICAgICAgICBBeGlzT3BlcmF0aW9uIGF4aXNPcDIgPSBuZXcgSW5Pbmx5QXhpc09wZXJhdGlvbihuZXcgUU5hbWUoImZhdWx0IikpOwotCi0gICAgICAgIGF4aXNPcDIuc2V0TWVzc2FnZVJlY2VpdmVyKG5ldyBSYXdYTUxJTk9ubHlNZXNzYWdlUmVjZWl2ZXIoKSk7Ci0gICAgICAgIGF4aXNPcDIuc2V0U3R5bGUoV1NETENvbnN0YW50cy5TVFlMRV9SUEMpOwotICAgICAgICBzZXJ2aWNlLmFkZE9wZXJhdGlvbihheGlzT3AyKTsKLSAgICAgICAgc2VydmljZS5tYXBBY3Rpb25Ub09wZXJhdGlvbihDb25zdGFudHMuQVhJUzJfTkFNRVNQQUNFX1VSSSArICIvIiArICJmYXVsdCIsIGF4aXNPcDIpOwotCi0gICAgICAgIHJldHVybiBzZXJ2aWNlOwotICAgIH0KLQotICAgIHByaXZhdGUgU2VydmljZUNsaWVudCBjcmVhdGVTZXJ2aWNlQ2xpZW50KCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2UgPQotICAgICAgICAgICAgICAgIGNyZWF0ZVNpbXBsZU9uZVdheVNlcnZpY2Vmb3JDbGllbnQoc2VydmljZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFY2hvLmNsYXNzLmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbk5hbWUpOwotCi0gICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ2NvbnRleHQgPSBVdGlsU2VydmVyLmNyZWF0ZUNsaWVudENvbmZpZ3VyYXRpb25Db250ZXh0KCk7Ci0KLSAgICAgICAgU2VydmljZUNsaWVudCBzZW5kZXI7Ci0KLSAgICAgICAgT3B0aW9ucyBvcHRpb25zID0gbmV3IE9wdGlvbnMoKTsKLSAgICAgICAgb3B0aW9ucy5zZXRUbyh0YXJnZXRFUFIpOwotICAgICAgICBvcHRpb25zLnNldFRyYW5zcG9ydEluUHJvdG9jb2woQ29uc3RhbnRzLlRSQU5TUE9SVF9IVFRQKTsKLSAgICAgICAgb3B0aW9ucy5zZXRBY3Rpb24ob3BlcmF0aW9uTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgIG9wdGlvbnMuc2V0UmVwbHlUbyhyZXBseVRvKTsKLSAgICAgICAgb3B0aW9ucy5zZXRGYXVsdFRvKGZhdWx0VG8pOwotCi0gICAgICAgIHNlbmRlciA9IG5ldyBTZXJ2aWNlQ2xpZW50KGNvbmZpZ2NvbnRleHQsIHNlcnZpY2UpOwotICAgICAgICBzZW5kZXIuc2V0T3B0aW9ucyhvcHRpb25zKTsKLSAgICAgICAgc2VuZGVyLmVuZ2FnZU1vZHVsZSgiYWRkcmVzc2luZyIpOwotCi0gICAgICAgIHJldHVybiBzZW5kZXI7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgVXRpbFNlcnZlci51bkRlcGxveVNlcnZpY2Uoc2VydmljZU5hbWUpOwotICAgICAgICBVdGlsU2VydmVyLnVuRGVwbG95U2VydmljZShuZXcgUU5hbWUoIlJlZGlyZWN0UmVjZWl2ZXJTZXJ2aWNlIikpOwotICAgICAgICBVdGlsU2VydmVyLnVuRGVwbG95Q2xpZW50U2VydmljZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQXhpc1NlcnZpY2UgY3JlYXRlU2ltcGxlT25lV2F5U2VydmljZWZvckNsaWVudChRTmFtZSBzZXJ2aWNlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUU5hbWUgb3BOYW1lKQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgQXhpc1NlcnZpY2Uoc2VydmljZU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotCi0gICAgICAgIHNlcnZpY2Uuc2V0Q2xhc3NMb2FkZXIoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKSk7Ci0gICAgICAgIHNlcnZpY2UuYWRkUGFyYW1ldGVyKG5ldyBQYXJhbWV0ZXIoQ29uc3RhbnRzLlNFUlZJQ0VfQ0xBU1MsIGNsYXNzTmFtZSkpOwotCi0gICAgICAgIEF4aXNPcGVyYXRpb24gYXhpc09wID0gbmV3IE91dE9ubHlBeGlzT3BlcmF0aW9uKG9wTmFtZSk7Ci0KLSAgICAgICAgYXhpc09wLnNldE1lc3NhZ2VSZWNlaXZlcihuZXcgUmF3WE1MSU5Pbmx5TWVzc2FnZVJlY2VpdmVyKCkpOwotICAgICAgICBheGlzT3Auc2V0U3R5bGUoV1NETENvbnN0YW50cy5TVFlMRV9SUEMpOwotICAgICAgICBzZXJ2aWNlLmFkZE9wZXJhdGlvbihheGlzT3ApOwotCi0gICAgICAgIHJldHVybiBzZXJ2aWNlOwotICAgIH0KLQotICAgIHByaXZhdGUgT01FbGVtZW50IGNyZWF0ZUVjaG9PTUVsZW1lbnQoU3RyaW5nIHRleHQpIHsKLSAgICAgICAgT01GYWN0b3J5IGZhYyA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpOwotCi0gICAgICAgIE9NTmFtZXNwYWNlIG9tTnMgPSBmYWMuY3JlYXRlT01OYW1lc3BhY2UoImh0dHA6Ly9sb2NhbGhvc3QvbXkiLCAibXkiKTsKLSAgICAgICAgT01FbGVtZW50IG1ldGhvZCA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoImVjaG9PTUVsZW1lbnQiLCBvbU5zKTsKLSAgICAgICAgT01FbGVtZW50IHZhbHVlID0gZmFjLmNyZWF0ZU9NRWxlbWVudCgibXlWYWx1ZSIsIG9tTnMpOwotICAgICAgICB2YWx1ZS5zZXRUZXh0KHRleHQpOwotICAgICAgICBtZXRob2QuYWRkQ2hpbGQodmFsdWUpOwotCi0gICAgICAgIHJldHVybiBtZXRob2Q7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTZXJ2aWNlQ2xpZW50IGNyZWF0ZU5vQWRkcmVzc2luZ1NlcnZpY2VDbGllbnQoKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSA9Ci0gICAgICAgICAgICAgICAgVXRpbHMuY3JlYXRlU2ltcGxlU2VydmljZWZvckNsaWVudChzZXJ2aWNlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVjaG8uY2xhc3MuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uTmFtZSk7Ci0KLSAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnY29udGV4dCA9IFV0aWxTZXJ2ZXIuY3JlYXRlQ2xpZW50Q29uZmlndXJhdGlvbkNvbnRleHQoKTsKLSAgICAgICAgU2VydmljZUNsaWVudCBzZW5kZXI7Ci0KLSAgICAgICAgT3B0aW9ucyBvcHRpb25zID0gbmV3IE9wdGlvbnMoKTsKLSAgICAgICAgb3B0aW9ucy5zZXRUbyh0YXJnZXRFUFIpOwotICAgICAgICBvcHRpb25zLnNldEFjdGlvbihvcGVyYXRpb25OYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgb3B0aW9ucy5zZXRQcm9wZXJ0eShBZGRyZXNzaW5nQ29uc3RhbnRzLkRJU0FCTEVfQUREUkVTU0lOR19GT1JfT1VUX01FU1NBR0VTLCBCb29sZWFuLlRSVUUpOwotICAgICAgICBvcHRpb25zLnNldFByb3BlcnR5KENvbnN0YW50cy5Db25maWd1cmF0aW9uLkRJU0FCTEVfU09BUF9BQ1RJT04sIEJvb2xlYW4uVFJVRSk7Ci0KLSAgICAgICAgc2VuZGVyID0gbmV3IFNlcnZpY2VDbGllbnQoY29uZmlnY29udGV4dCwgc2VydmljZSk7Ci0gICAgICAgIHNlbmRlci5zZXRPcHRpb25zKG9wdGlvbnMpOwotCi0gICAgICAgIHJldHVybiBzZW5kZXI7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTZXJ2aWNlQ2xpZW50IGNyZWF0ZVN5bmNSZXNwb25zZVNlcnZpY2VDbGllbnQoKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSA9Ci0gICAgICAgICAgICAgICAgVXRpbHMuY3JlYXRlU2ltcGxlU2VydmljZWZvckNsaWVudChzZXJ2aWNlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVjaG8uY2xhc3MuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uTmFtZSk7Ci0KLSAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnY29udGV4dCA9IFV0aWxTZXJ2ZXIuY3JlYXRlQ2xpZW50Q29uZmlndXJhdGlvbkNvbnRleHQoKTsKLSAgICAgICAgU2VydmljZUNsaWVudCBzZW5kZXI7Ci0KLSAgICAgICAgT3B0aW9ucyBvcHRpb25zID0gbmV3IE9wdGlvbnMoKTsKLSAgICAgICAgb3B0aW9ucy5zZXRUbyh0YXJnZXRFUFIpOwotICAgICAgICBvcHRpb25zLnNldEFjdGlvbihvcGVyYXRpb25OYW1lLmdldExvY2FsUGFydCgpKTsKLQotICAgICAgICBzZW5kZXIgPSBuZXcgU2VydmljZUNsaWVudChjb25maWdjb250ZXh0LCBzZXJ2aWNlKTsKLSAgICAgICAgc2VuZGVyLnNldE9wdGlvbnMob3B0aW9ucyk7Ci0gICAgICAgIHNlbmRlci5lbmdhZ2VNb2R1bGUoImFkZHJlc3NpbmciKTsKLQotICAgICAgICByZXR1cm4gc2VuZGVyOwotICAgIH0KLQotICAgIC8vIFRlc3RzCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RWNob1RvUmVwbHlUbygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBPTUVsZW1lbnQgbWV0aG9kID0gY3JlYXRlRWNob09NRWxlbWVudCgidGhpcyBtZXNzYWdlIHNob3VsZCBub3QgY2F1c2UgYSBmYXVsdC4iKTsKLSAgICAgICAgU2VydmljZUNsaWVudCBzZW5kZXIgPSBudWxsOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzZW5kZXIgPSBjcmVhdGVTZXJ2aWNlQ2xpZW50KCk7Ci0gICAgICAgICAgICBzZW5kZXIuZmlyZUFuZEZvcmdldChvcGVyYXRpb25OYW1lLCBtZXRob2QpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJzZW50IHRoZSByZXF1ZXN0Iik7Ci0gICAgICAgICAgICBpbnQgaW5kZXggPSAwOwotICAgICAgICAgICAgd2hpbGUgKCFSZWRpcmVjdFJlY2VpdmVyLmhhc1JlY2VpdmVkUmVzcG9uc2UoKSkgewotICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsKLSAgICAgICAgICAgICAgICBpbmRleCsrOwotICAgICAgICAgICAgICAgIGlmIChpbmRleCA+IDQ1KSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRlc3RzIHdhcyBmYWlsZWQgYXMgcmVkaXJlY3RlZCByZXNwb25zZSBub3QgcmVjZWl2ZWQgaW4gdGltZSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChzZW5kZXIgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBzZW5kZXIuY2xlYW51cCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEZhdWx0VG9GYXVsdFRvKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE9NRWxlbWVudCBtZXRob2QgPSBjcmVhdGVFY2hvT01FbGVtZW50KCJmYXVsdCIpOwotICAgICAgICBTZXJ2aWNlQ2xpZW50IHNlbmRlciA9IG51bGw7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNlbmRlciA9IGNyZWF0ZVNlcnZpY2VDbGllbnQoKTsKLSAgICAgICAgICAgIHNlbmRlci5maXJlQW5kRm9yZ2V0KG9wZXJhdGlvbk5hbWUsIG1ldGhvZCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInNlbnQgdGhlIHJlcXVlc3QiKTsKLSAgICAgICAgICAgIGludCBpbmRleCA9IDA7Ci0gICAgICAgICAgICB3aGlsZSAoIVJlZGlyZWN0UmVjZWl2ZXIuaGFzUmVjZWl2ZWRGYXVsdCgpKSB7Ci0gICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDApOwotICAgICAgICAgICAgICAgIGluZGV4Kys7Ci0gICAgICAgICAgICAgICAgaWYgKGluZGV4ID4gNDUpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGVzdHMgd2FzIGZhaWxlZCBhcyByZWRpcmVjdGVkIGZhdWx0IG5vdCByZWNlaXZlZCBpbiB0aW1lIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHNlbmRlciAhPSBudWxsKQotICAgICAgICAgICAgICAgIHNlbmRlci5jbGVhbnVwKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VXNpbmdBZGRyZXNzaW5nUmVxdWlyZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgQWRkcmVzc2luZ0hlbHBlci5zZXRBZGRyZXNzaW5nUmVxdWlyZW1lbnRQYXJlbWV0ZXJWYWx1ZShlY2hvU2VydmljZSwgInJlcXVpcmVkIik7Ci0KLSAgICAgICAgT01FbGVtZW50IG1ldGhvZCA9IGNyZWF0ZUVjaG9PTUVsZW1lbnQoInRoaXMgbWVzc2FnZSBzaG91bGQgY2F1c2UgYSBmYXVsdC4iKTsKLSAgICAgICAgU2VydmljZUNsaWVudCBzZW5kZXIgPSBudWxsOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzZW5kZXIgPSBjcmVhdGVOb0FkZHJlc3NpbmdTZXJ2aWNlQ2xpZW50KCk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHNlbmRlci5zZW5kUmVjZWl2ZShvcGVyYXRpb25OYW1lLCBtZXRob2QpOwotICAgICAgICAgICAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHJlY2VpdmVkIGEgc3BlY2lmaWMgZmF1bHQiKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBhZikgewotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgd3NhOkFjdGlvbiBoZWFkZXIgaXMgcmVxdWlyZWQgd2hlbiBXUy1BZGRyZXNzaW5nIGlzIGluIHVzZSBidXQgd2FzIG5vdCBzZW50LiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBhZi5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHNlbmRlciAhPSBudWxsKQotICAgICAgICAgICAgICAgIHNlbmRlci5jbGVhbnVwKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3luY1Jlc3BvbnNlQWRkcmVzc2luZygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgdGVzdCA9ICJoZWxsby4iOwotICAgICAgICBPTUVsZW1lbnQgbWV0aG9kID0gY3JlYXRlRWNob09NRWxlbWVudCh0ZXN0KTsKLSAgICAgICAgU2VydmljZUNsaWVudCBzZW5kZXIgPSBudWxsOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzZW5kZXIgPSBjcmVhdGVTeW5jUmVzcG9uc2VTZXJ2aWNlQ2xpZW50KCk7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgcmVzdWx0ID0gc2VuZGVyLnNlbmRSZWNlaXZlKG9wZXJhdGlvbk5hbWUsIG1ldGhvZCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImVjaG9PTUVsZW1lbnRSZXNwb25zZTogIiArIHJlc3VsdCk7Ci0gICAgICAgICAgICBRTmFtZSBuYW1lID0gbmV3IFFOYW1lKCJodHRwOi8vbG9jYWxob3N0L215IiwgIm15VmFsdWUiKTsKLSAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IHJlc3VsdC5nZXRGaXJzdENoaWxkV2l0aE5hbWUobmFtZSkuZ2V0VGV4dCgpOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHModGVzdCwgdmFsdWUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHNlbmRlciAhPSBudWxsKQotICAgICAgICAgICAgICAgIHNlbmRlci5jbGVhbnVwKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvYWRkcmVzc2luZy9BZGRyZXNzaW5nU3VibWlzc2lvblNlcnZpY2VUZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvYWRkcmVzc2luZy9BZGRyZXNzaW5nU3VibWlzc2lvblNlcnZpY2VUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiMDEyZmUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2FkZHJlc3NpbmcvQWRkcmVzc2luZ1N1Ym1pc3Npb25TZXJ2aWNlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01OYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuT3B0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5TZXJ2aWNlQ2xpZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LlNlcnZpY2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uSW5Pbmx5QXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLk91dE9ubHlBeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkVjaG87Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUudXRpbC5UZXN0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaW50ZWdyYXRpb24uVXRpbFNlcnZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmludGVncmF0aW9uLlV0aWxTZXJ2ZXJCYXNlZFRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLlJhd1hNTElOT25seU1lc3NhZ2VSZWNlaXZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5SYXdYTUxJTk91dE1lc3NhZ2VSZWNlaXZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLldTRExDb25zdGFudHM7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1wdWJsaWMgY2xhc3MgQWRkcmVzc2luZ1N1Ym1pc3Npb25TZXJ2aWNlVGVzdCBleHRlbmRzIFV0aWxTZXJ2ZXJCYXNlZFRlc3RDYXNlCi0gICAgICAgIGltcGxlbWVudHMgVGVzdENvbnN0YW50cyB7Ci0KLSAgICBwcm90ZWN0ZWQgUU5hbWUgdHJhbnNwb3J0TmFtZSA9IG5ldyBRTmFtZSgiaHR0cDovL2xvY2FsaG9zdC9teSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk51bGxUcmFuc3BvcnQiKTsKLSAgICBFbmRwb2ludFJlZmVyZW5jZSB0YXJnZXRFUFIgPSBuZXcgRW5kcG9pbnRSZWZlcmVuY2UoCi0gICAgICAgICAgICAiaHR0cDovLzEyNy4wLjAuMToiICsgKFV0aWxTZXJ2ZXIuVEVTVElOR19QT1JUKSArCi0gICAgICAgICAgICAgICAgICAgICIvYXhpczIvc2VydmljZXMvRWNob1hNTFNlcnZpY2UvZWNob09NRWxlbWVudCIpOwotCi0gICAgRW5kcG9pbnRSZWZlcmVuY2UgcmVwbHlUbyA9IG5ldyBFbmRwb2ludFJlZmVyZW5jZSgKLSAgICAgICAgICAgICJodHRwOi8vMTI3LjAuMC4xOiIgKyAoVXRpbFNlcnZlci5URVNUSU5HX1BPUlQpICsKLSAgICAgICAgICAgICAgICAgICAgIi9heGlzMi9zZXJ2aWNlcy9SZWRpcmVjdFJlY2VpdmVyU2VydmljZS9lY2hvT01FbGVtZW50UmVzcG9uc2UiKTsKLQotICAgIEVuZHBvaW50UmVmZXJlbmNlIGZhdWx0VG8gPSBuZXcgRW5kcG9pbnRSZWZlcmVuY2UoCi0gICAgICAgICAgICAiaHR0cDovLzEyNy4wLjAuMToiICsgKFV0aWxTZXJ2ZXIuVEVTVElOR19QT1JUKSArCi0gICAgICAgICAgICAgICAgICAgICIvYXhpczIvc2VydmljZXMvUmVkaXJlY3RSZWNlaXZlclNlcnZpY2UvZmF1bHQiKTsKLQotICAgIHByb3RlY3RlZCBBeGlzQ29uZmlndXJhdGlvbiBlbmdpbmVSZWdpc3RyeTsKLSAgICBwcm90ZWN0ZWQgTWVzc2FnZUNvbnRleHQgbWM7Ci0gICAgcHJvdGVjdGVkIFNlcnZpY2VDb250ZXh0IHNlcnZpY2VDb250ZXh0OwotICAgIHByb3RlY3RlZCBBeGlzU2VydmljZSBlY2hvU2VydmljZTsKLSAgICBwcm90ZWN0ZWQgQXhpc1NlcnZpY2UgcnJTZXJ2aWNlOwotCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotICAgICAgICByZXR1cm4gZ2V0VGVzdFNldHVwKG5ldyBUZXN0U3VpdGUoQWRkcmVzc2luZ1N1Ym1pc3Npb25TZXJ2aWNlVGVzdC5jbGFzcykpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGVjaG9TZXJ2aWNlID0gVXRpbHMuY3JlYXRlU2ltcGxlU2VydmljZShzZXJ2aWNlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBSYXdYTUxJTk91dE1lc3NhZ2VSZWNlaXZlcigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWNoby5jbGFzcy5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25OYW1lKTsKLSAgICAgICAgZWNob1NlcnZpY2UuZ2V0T3BlcmF0aW9uKG9wZXJhdGlvbk5hbWUpLnNldE91dHB1dEFjdGlvbigiZWNob09NRWxlbWVudFJlc3BvbnNlIik7Ci0gICAgICAgIFV0aWxTZXJ2ZXIuZGVwbG95U2VydmljZShlY2hvU2VydmljZSk7Ci0KLSAgICAgICAgcnJTZXJ2aWNlID0gY3JlYXRlUmVkaXJlY3RSZWNlaXZlclNlcnZpY2UoKTsKLSAgICAgICAgVXRpbFNlcnZlci5kZXBsb3lTZXJ2aWNlKHJyU2VydmljZSk7Ci0gICAgfQotCi0gICAgQXhpc1NlcnZpY2UgY3JlYXRlUmVkaXJlY3RSZWNlaXZlclNlcnZpY2UoKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSA9IG5ldyBBeGlzU2VydmljZSgiUmVkaXJlY3RSZWNlaXZlclNlcnZpY2UiKTsKLQotICAgICAgICBzZXJ2aWNlLnNldENsYXNzTG9hZGVyKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkpOwotICAgICAgICBzZXJ2aWNlLmFkZFBhcmFtZXRlcigKLSAgICAgICAgICAgICAgICBuZXcgUGFyYW1ldGVyKENvbnN0YW50cy5TRVJWSUNFX0NMQVNTLCBSZWRpcmVjdFJlY2VpdmVyLmNsYXNzLmdldE5hbWUoKSkpOwotCi0gICAgICAgIEF4aXNPcGVyYXRpb24gYXhpc09wID0gbmV3IEluT25seUF4aXNPcGVyYXRpb24obmV3IFFOYW1lKCJlY2hvT01FbGVtZW50UmVzcG9uc2UiKSk7Ci0KLSAgICAgICAgYXhpc09wLnNldE1lc3NhZ2VSZWNlaXZlcihuZXcgUmF3WE1MSU5Pbmx5TWVzc2FnZVJlY2VpdmVyKCkpOwotICAgICAgICBheGlzT3Auc2V0U3R5bGUoV1NETENvbnN0YW50cy5TVFlMRV9SUEMpOwotICAgICAgICBzZXJ2aWNlLmFkZE9wZXJhdGlvbihheGlzT3ApOwotICAgICAgICBzZXJ2aWNlLm1hcEFjdGlvblRvT3BlcmF0aW9uKENvbnN0YW50cy5BWElTMl9OQU1FU1BBQ0VfVVJJICsgIi8iICsgImVjaG9PTUVsZW1lbnRSZXNwb25zZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpc09wKTsKLQotICAgICAgICBBeGlzT3BlcmF0aW9uIGF4aXNPcDIgPSBuZXcgSW5Pbmx5QXhpc09wZXJhdGlvbihuZXcgUU5hbWUoImZhdWx0IikpOwotCi0gICAgICAgIGF4aXNPcDIuc2V0TWVzc2FnZVJlY2VpdmVyKG5ldyBSYXdYTUxJTk9ubHlNZXNzYWdlUmVjZWl2ZXIoKSk7Ci0gICAgICAgIGF4aXNPcDIuc2V0U3R5bGUoV1NETENvbnN0YW50cy5TVFlMRV9SUEMpOwotICAgICAgICBzZXJ2aWNlLmFkZE9wZXJhdGlvbihheGlzT3AyKTsKLSAgICAgICAgc2VydmljZS5tYXBBY3Rpb25Ub09wZXJhdGlvbihDb25zdGFudHMuQVhJUzJfTkFNRVNQQUNFX1VSSSArICIvIiArICJmYXVsdCIsIGF4aXNPcDIpOwotCi0gICAgICAgIHJldHVybiBzZXJ2aWNlOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFV0aWxTZXJ2ZXIudW5EZXBsb3lTZXJ2aWNlKHNlcnZpY2VOYW1lKTsKLSAgICAgICAgVXRpbFNlcnZlci51bkRlcGxveVNlcnZpY2UobmV3IFFOYW1lKCJSZWRpcmVjdFJlY2VpdmVyU2VydmljZSIpKTsKLSAgICAgICAgVXRpbFNlcnZlci51bkRlcGxveUNsaWVudFNlcnZpY2UoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEF4aXNTZXJ2aWNlIGNyZWF0ZVNpbXBsZU9uZVdheVNlcnZpY2Vmb3JDbGllbnQoUU5hbWUgc2VydmljZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFOYW1lIG9wTmFtZSkKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBBeGlzU2VydmljZSBzZXJ2aWNlID0gbmV3IEF4aXNTZXJ2aWNlKHNlcnZpY2VOYW1lLmdldExvY2FsUGFydCgpKTsKLQotICAgICAgICBzZXJ2aWNlLnNldENsYXNzTG9hZGVyKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkpOwotICAgICAgICBzZXJ2aWNlLmFkZFBhcmFtZXRlcihuZXcgUGFyYW1ldGVyKENvbnN0YW50cy5TRVJWSUNFX0NMQVNTLCBjbGFzc05hbWUpKTsKLQotICAgICAgICBBeGlzT3BlcmF0aW9uIGF4aXNPcCA9IG5ldyBPdXRPbmx5QXhpc09wZXJhdGlvbihvcE5hbWUpOwotCi0gICAgICAgIGF4aXNPcC5zZXRNZXNzYWdlUmVjZWl2ZXIobmV3IFJhd1hNTElOT25seU1lc3NhZ2VSZWNlaXZlcigpKTsKLSAgICAgICAgYXhpc09wLnNldFN0eWxlKFdTRExDb25zdGFudHMuU1RZTEVfUlBDKTsKLSAgICAgICAgc2VydmljZS5hZGRPcGVyYXRpb24oYXhpc09wKTsKLQotICAgICAgICByZXR1cm4gc2VydmljZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RWNob1RvUmVwbHlUbygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBPTUVsZW1lbnQgbWV0aG9kID0gY3JlYXRlRWNob09NRWxlbWVudCgidGhpcyBtZXNzYWdlIHNob3VsZCBub3QgY2F1c2UgYSBmYXVsdC4iKTsKLSAgICAgICAgU2VydmljZUNsaWVudCBzZW5kZXIgPSBudWxsOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzZW5kZXIgPSBjcmVhdGVTZXJ2aWNlQ2xpZW50KCk7Ci0gICAgICAgICAgICBzZW5kZXIuZmlyZUFuZEZvcmdldChvcGVyYXRpb25OYW1lLCBtZXRob2QpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJzZW5kIHRoZSByZXFlc3QiKTsKLSAgICAgICAgICAgIGludCBpbmRleCA9IDA7Ci0gICAgICAgICAgICB3aGlsZSAoIVJlZGlyZWN0UmVjZWl2ZXIuaGFzUmVjZWl2ZWRSZXNwb25zZSgpKSB7Ci0gICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMCk7Ci0gICAgICAgICAgICAgICAgaW5kZXgrKzsKLSAgICAgICAgICAgICAgICBpZiAoaW5kZXggPiA0NSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUZXN0cyB3YXMgZmFpbGVkIGFzIHJlZGlyZWN0ZWQgcmVzcG9uc2Ugbm90IHJlY2VpdmVkIGluIHRpbWUiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoc2VuZGVyICE9IG51bGwpCi0gICAgICAgICAgICAgICAgc2VuZGVyLmNsZWFudXAoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RGYXVsdFRvRmF1bHRUbygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBPTUVsZW1lbnQgbWV0aG9kID0gY3JlYXRlRWNob09NRWxlbWVudCgiZmF1bHQiKTsKLSAgICAgICAgU2VydmljZUNsaWVudCBzZW5kZXIgPSBudWxsOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzZW5kZXIgPSBjcmVhdGVTZXJ2aWNlQ2xpZW50KCk7Ci0gICAgICAgICAgICBzZW5kZXIuZmlyZUFuZEZvcmdldChvcGVyYXRpb25OYW1lLCBtZXRob2QpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJzZW5kIHRoZSByZXFlc3QiKTsKLSAgICAgICAgICAgIGludCBpbmRleCA9IDA7Ci0gICAgICAgICAgICB3aGlsZSAoIVJlZGlyZWN0UmVjZWl2ZXIuaGFzUmVjZWl2ZWRGYXVsdCgpKSB7Ci0gICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMCk7Ci0gICAgICAgICAgICAgICAgaW5kZXgrKzsKLSAgICAgICAgICAgICAgICBpZiAoaW5kZXggPiA0NSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUZXN0cyB3YXMgZmFpbGVkIGFzIHJlZGlyZWN0ZWQgZmF1bHQgbm90IHJlY2VpdmVkIGluIHRpbWUiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoc2VuZGVyICE9IG51bGwpCi0gICAgICAgICAgICAgICAgc2VuZGVyLmNsZWFudXAoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgT01FbGVtZW50IGNyZWF0ZUVjaG9PTUVsZW1lbnQoU3RyaW5nIHRleHQpIHsKLSAgICAgICAgT01GYWN0b3J5IGZhYyA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpOwotCi0gICAgICAgIE9NTmFtZXNwYWNlIG9tTnMgPSBmYWMuY3JlYXRlT01OYW1lc3BhY2UoImh0dHA6Ly9sb2NhbGhvc3QvbXkiLCAibXkiKTsKLSAgICAgICAgT01FbGVtZW50IG1ldGhvZCA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoImVjaG9PTUVsZW1lbnQiLCBvbU5zKTsKLSAgICAgICAgT01FbGVtZW50IHZhbHVlID0gZmFjLmNyZWF0ZU9NRWxlbWVudCgibXlWYWx1ZSIsIG9tTnMpOwotICAgICAgICB2YWx1ZS5zZXRUZXh0KHRleHQpOwotICAgICAgICBtZXRob2QuYWRkQ2hpbGQodmFsdWUpOwotCi0gICAgICAgIHJldHVybiBtZXRob2Q7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTZXJ2aWNlQ2xpZW50IGNyZWF0ZVNlcnZpY2VDbGllbnQoKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSA9Ci0gICAgICAgICAgICAgICAgY3JlYXRlU2ltcGxlT25lV2F5U2VydmljZWZvckNsaWVudChzZXJ2aWNlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVjaG8uY2xhc3MuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uTmFtZSk7Ci0KLSAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnY29udGV4dCA9IFV0aWxTZXJ2ZXIuY3JlYXRlQ2xpZW50Q29uZmlndXJhdGlvbkNvbnRleHQoKTsKLQotICAgICAgICBTZXJ2aWNlQ2xpZW50IHNlbmRlcjsKLQotICAgICAgICBPcHRpb25zIG9wdGlvbnMgPSBuZXcgT3B0aW9ucygpOwotICAgICAgICBvcHRpb25zLnNldFRvKHRhcmdldEVQUik7Ci0gICAgICAgIG9wdGlvbnMuc2V0VHJhbnNwb3J0SW5Qcm90b2NvbChDb25zdGFudHMuVFJBTlNQT1JUX0hUVFApOwotICAgICAgICBvcHRpb25zLnNldEFjdGlvbihvcGVyYXRpb25OYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgb3B0aW9ucy5zZXRSZXBseVRvKHJlcGx5VG8pOwotICAgICAgICBvcHRpb25zLnNldEZhdWx0VG8oZmF1bHRUbyk7Ci0gICAgICAgIG9wdGlvbnMuc2V0UHJvcGVydHkoQWRkcmVzc2luZ0NvbnN0YW50cy5XU19BRERSRVNTSU5HX1ZFUlNJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzc2luZ0NvbnN0YW50cy5TdWJtaXNzaW9uLldTQV9OQU1FU1BBQ0UpOwotCi0gICAgICAgIHNlbmRlciA9IG5ldyBTZXJ2aWNlQ2xpZW50KGNvbmZpZ2NvbnRleHQsIHNlcnZpY2UpOwotICAgICAgICBzZW5kZXIuc2V0T3B0aW9ucyhvcHRpb25zKTsKLSAgICAgICAgc2VuZGVyLmVuZ2FnZU1vZHVsZSgiYWRkcmVzc2luZyIpOwotCi0gICAgICAgIHJldHVybiBzZW5kZXI7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTZXJ2aWNlQ2xpZW50IGNyZWF0ZVN5bmNSZXNwb25zZVNlcnZpY2VDbGllbnQoKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSA9Ci0gICAgICAgICAgICAgICAgVXRpbHMuY3JlYXRlU2ltcGxlU2VydmljZWZvckNsaWVudChzZXJ2aWNlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVjaG8uY2xhc3MuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uTmFtZSk7Ci0KLSAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnY29udGV4dCA9IFV0aWxTZXJ2ZXIuY3JlYXRlQ2xpZW50Q29uZmlndXJhdGlvbkNvbnRleHQoKTsKLSAgICAgICAgU2VydmljZUNsaWVudCBzZW5kZXI7Ci0KLSAgICAgICAgT3B0aW9ucyBvcHRpb25zID0gbmV3IE9wdGlvbnMoKTsKLSAgICAgICAgb3B0aW9ucy5zZXRUbyh0YXJnZXRFUFIpOwotICAgICAgICBvcHRpb25zLnNldEFjdGlvbihvcGVyYXRpb25OYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgb3B0aW9ucy5zZXRQcm9wZXJ0eShBZGRyZXNzaW5nQ29uc3RhbnRzLldTX0FERFJFU1NJTkdfVkVSU0lPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzaW5nQ29uc3RhbnRzLlN1Ym1pc3Npb24uV1NBX05BTUVTUEFDRSk7Ci0KLSAgICAgICAgc2VuZGVyID0gbmV3IFNlcnZpY2VDbGllbnQoY29uZmlnY29udGV4dCwgc2VydmljZSk7Ci0gICAgICAgIHNlbmRlci5zZXRPcHRpb25zKG9wdGlvbnMpOwotICAgICAgICBzZW5kZXIuZW5nYWdlTW9kdWxlKCJhZGRyZXNzaW5nIik7Ci0KLSAgICAgICAgcmV0dXJuIHNlbmRlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3luY1Jlc3BvbnNlQWRkcmVzc2luZygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgdGVzdCA9ICJoZWxsby4iOwotICAgICAgICBPTUVsZW1lbnQgbWV0aG9kID0gY3JlYXRlRWNob09NRWxlbWVudCh0ZXN0KTsKLSAgICAgICAgU2VydmljZUNsaWVudCBzZW5kZXIgPSBudWxsOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzZW5kZXIgPSBjcmVhdGVTeW5jUmVzcG9uc2VTZXJ2aWNlQ2xpZW50KCk7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgcmVzdWx0ID0gc2VuZGVyLnNlbmRSZWNlaXZlKG9wZXJhdGlvbk5hbWUsIG1ldGhvZCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImVjaG9PTUVsZW1lbnRSZXNwb25zZTogIiArIHJlc3VsdCk7Ci0gICAgICAgICAgICBRTmFtZSBuYW1lID0gbmV3IFFOYW1lKCJodHRwOi8vbG9jYWxob3N0L215IiwgIm15VmFsdWUiKTsKLSAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IHJlc3VsdC5nZXRGaXJzdENoaWxkV2l0aE5hbWUobmFtZSkuZ2V0VGV4dCgpOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHModGVzdCwgdmFsdWUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHNlbmRlciAhPSBudWxsKQotICAgICAgICAgICAgICAgIHNlbmRlci5jbGVhbnVwKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvYWRkcmVzc2luZy9NdWx0aUhvcFJlZGlyZWN0U2VydmljZTEuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9hZGRyZXNzaW5nL011bHRpSG9wUmVkaXJlY3RTZXJ2aWNlMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTk4Mzc3Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9hZGRyZXNzaW5nL011bHRpSG9wUmVkaXJlY3RTZXJ2aWNlMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3Npbmc7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pbnRlZ3JhdGlvbi5VdGlsU2VydmVyOwotCi1wdWJsaWMgY2xhc3MgTXVsdGlIb3BSZWRpcmVjdFNlcnZpY2UxIHsKLQotICAgIHB1YmxpYyBPTUVsZW1lbnQgZWNob1JlZGlyZWN0KE9NRWxlbWVudCBvbWUpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBNZXNzYWdlQ29udGV4dCBjdXJySW5NYyA9IE1lc3NhZ2VDb250ZXh0LmdldEN1cnJlbnRNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBNZXNzYWdlQ29udGV4dCBjdXJyT3V0TWMgPSBjdXJySW5NYy5nZXRPcGVyYXRpb25Db250ZXh0KCkuZ2V0TWVzc2FnZUNvbnRleHQoIk91dCIpOwotICAgICAgICBjdXJyT3V0TWMuc2V0VG8obmV3IEVuZHBvaW50UmVmZXJlbmNlKCJodHRwOi8vMTI3LjAuMC4xOiIgKyAoVXRpbFNlcnZlci5URVNUSU5HX1BPUlQpICsKLSAgICAgICAgICAgICAgICAiL2F4aXMyL3NlcnZpY2VzL011bHRpSG9wUmVkaXJlY3RTZXJ2aWNlMi9lY2hvUmVkaXJlY3QiKSk7Ci0gICAgICAgIGN1cnJPdXRNYy5zZXRSZXBseVRvKGN1cnJJbk1jLmdldFJlcGx5VG8oKSk7Ci0gICAgICAgIHJldHVybiBvbWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2FkZHJlc3NpbmcvTXVsdGlIb3BSZWRpcmVjdFNlcnZpY2UyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvYWRkcmVzc2luZy9NdWx0aUhvcFJlZGlyZWN0U2VydmljZTIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhjNzMzMi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvYWRkcmVzc2luZy9NdWx0aUhvcFJlZGlyZWN0U2VydmljZTIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotCi1wdWJsaWMgY2xhc3MgTXVsdGlIb3BSZWRpcmVjdFNlcnZpY2UyIHsKLSAgICBwdWJsaWMgT01FbGVtZW50IGVjaG9SZWRpcmVjdChPTUVsZW1lbnQgb21lKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJNdWx0aUhvcFJlZGlyZWN0U2VydmljZTIiKTsKLSAgICAgICAgTWVzc2FnZUNvbnRleHQgY3VyckluTWMgPSBNZXNzYWdlQ29udGV4dC5nZXRDdXJyZW50TWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgTWVzc2FnZUNvbnRleHQgY3Vyck91dE1jID0gY3VyckluTWMuZ2V0T3BlcmF0aW9uQ29udGV4dCgpLmdldE1lc3NhZ2VDb250ZXh0KCJPdXQiKTsKLSAgICAgICAgY3Vyck91dE1jLnNldFRvKGN1cnJJbk1jLmdldFJlcGx5VG8oKSk7Ci0gICAgICAgIGN1cnJPdXRNYy5nZXRSZWxhdGVzVG8oKS5zZXRWYWx1ZShjdXJySW5NYy5nZXRSZWxhdGVzVG8oKS5nZXRWYWx1ZSgpKTsKLSAgICAgICAgcmV0dXJuIG9tZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvYWRkcmVzc2luZy9NdWx0aUhvcFJlZGlyZWN0U2VydmljZVRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9hZGRyZXNzaW5nL011bHRpSG9wUmVkaXJlY3RTZXJ2aWNlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzExMzAxLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9hZGRyZXNzaW5nL011bHRpSG9wUmVkaXJlY3RTZXJ2aWNlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTczICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01OYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuT3B0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5TZXJ2aWNlQ2xpZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LlNlcnZpY2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uSW5PdXRBeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uT3V0SW5BeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLnV0aWwuVGVzdENvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmludGVncmF0aW9uLlV0aWxTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pbnRlZ3JhdGlvbi5VdGlsU2VydmVyQmFzZWRUZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5SYXdYTUxJTk91dE1lc3NhZ2VSZWNlaXZlcjsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLS8qKgotICogVGhpcyB0ZXN0cyB0aGF0IGl0IGlzIHBvc3NpYmxlIHRvIHVzZSB0aGUgbW9yZSBhZHZhbmNlZCBmdW5jdGlvbiBhbGxvd2VkIGJ5IHRoZSBXUy1BZGRyZXNzaW5nCi0gKiBzcGVjaWZpY2F0aW9uIHRvIHJlZGlyZWN0IHJlc3BvbnNlcy4gVGhpcyB0ZXN0IHNldHMgdXAgMiBzZXJ2aWNlcywgTXVsdGlIb3BSZWRpcmVjdFNlcnZpY2UxIGFuZAotICogTXVsdGlIb3BSZWRpcmVjdFNlcnZpY2UyLiBNdWx0aUhvcFJlZGlyZWN0U2VydmljZTEgZWNob3MgdGhlIFhNTCBpdCByZWNlaXZlcyB0bwotICogTXVsdGlIb3BSZWRpcmVjdFNlcnZpY2UyLCBhZGRpbmcgdGhlIG9yaWdpbmFsIFJlcGx5VG8uIE11bHRpSG9wUmVkaXJlY3RTZXJ2aWNlMiB0aGVuIGVjaG9zIHRoZQotICogWE1MIHRvIHRoZSBvcmlnbmFsIFJlcGx5VG8sIHNldHRpbmcgdGhlIFJlbGF0ZXNUbyB0byB0aGUgbWVzc2FnZUlEIG9mIHRoZSBvcmlnaW5hbCByZXF1ZXN0Ci0gKiBtZXNzYWdlIHRvIGFsbG93IHRoZSBjbGllbnQgdG8gY29ycmVsYXRlIHRoZSBtZXNzYWdlLgotICogPHAvPgotICogVGhlIGNsZWFybHkgb25seSB3b3JrcyBpZiB0aGUgY2xpZW50IGlzIHVzaW5nIGEgc2VwYXJhdGUgbGlzdGVuZXIgKHdoaWNoIHRoZSBjbGllbnQgaW4gdGhlIHRlc3QKLSAqIGRvZXMpCi0gKi8KLXB1YmxpYyBjbGFzcyBNdWx0aUhvcFJlZGlyZWN0U2VydmljZVRlc3QgZXh0ZW5kcyBVdGlsU2VydmVyQmFzZWRUZXN0Q2FzZSBpbXBsZW1lbnRzIFRlc3RDb25zdGFudHMgewotCi0gICAgRW5kcG9pbnRSZWZlcmVuY2UgdGFyZ2V0RVBSID0gbmV3IEVuZHBvaW50UmVmZXJlbmNlKAotICAgICAgICAgICAgImh0dHA6Ly8xMjcuMC4wLjE6IiArIChVdGlsU2VydmVyLlRFU1RJTkdfUE9SVCkgKwotICAgICAgICAgICAgICAgICAgICAiL2F4aXMyL3NlcnZpY2VzL011bHRpSG9wUmVkaXJlY3RTZXJ2aWNlMS9lY2hvUmVkaXJlY3QiKTsKLQotICAgIHByb3RlY3RlZCBBeGlzQ29uZmlndXJhdGlvbiBlbmdpbmVSZWdpc3RyeTsKLSAgICBwcm90ZWN0ZWQgTWVzc2FnZUNvbnRleHQgbWM7Ci0gICAgcHJvdGVjdGVkIFNlcnZpY2VDb250ZXh0IHNlcnZpY2VDb250ZXh0OwotICAgIHByb3RlY3RlZCBBeGlzU2VydmljZSBtaHMxOwotICAgIHByb3RlY3RlZCBBeGlzU2VydmljZSBtaHMyOwotCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotICAgICAgICByZXR1cm4gZ2V0VGVzdFNldHVwKG5ldyBUZXN0U3VpdGUoTXVsdGlIb3BSZWRpcmVjdFNlcnZpY2VUZXN0LmNsYXNzKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbWhzMSA9IGNyZWF0ZU11bHRpSG9wUmVkaXJlY3RTZXJ2aWNlMSgpOwotICAgICAgICBtaHMyID0gY3JlYXRlTXVsdGlIb3BSZWRpcmVjdFNlcnZpY2UyKCk7Ci0gICAgICAgIFV0aWxTZXJ2ZXIuZGVwbG95U2VydmljZShtaHMxKTsKLSAgICAgICAgVXRpbFNlcnZlci5kZXBsb3lTZXJ2aWNlKG1oczIpOwotICAgIH0KLQotICAgIEF4aXNTZXJ2aWNlIGNyZWF0ZU11bHRpSG9wUmVkaXJlY3RTZXJ2aWNlMSgpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBBeGlzU2VydmljZSBzZXJ2aWNlID0gbmV3IEF4aXNTZXJ2aWNlKCJNdWx0aUhvcFJlZGlyZWN0U2VydmljZTEiKTsKLQotICAgICAgICBzZXJ2aWNlLnNldENsYXNzTG9hZGVyKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkpOwotICAgICAgICBzZXJ2aWNlLmFkZFBhcmFtZXRlcigKLSAgICAgICAgICAgICAgICBuZXcgUGFyYW1ldGVyKENvbnN0YW50cy5TRVJWSUNFX0NMQVNTLCBNdWx0aUhvcFJlZGlyZWN0U2VydmljZTEuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0KLSAgICAgICAgQXhpc09wZXJhdGlvbiBheGlzT3AgPSBuZXcgSW5PdXRBeGlzT3BlcmF0aW9uKG5ldyBRTmFtZSgiZWNob1JlZGlyZWN0IikpOwotCi0gICAgICAgIGF4aXNPcC5zZXRNZXNzYWdlUmVjZWl2ZXIobmV3IFJhd1hNTElOT3V0TWVzc2FnZVJlY2VpdmVyKCkpOwotICAgICAgICBzZXJ2aWNlLmFkZE9wZXJhdGlvbihheGlzT3ApOwotICAgICAgICBzZXJ2aWNlLm1hcEFjdGlvblRvT3BlcmF0aW9uKENvbnN0YW50cy5BWElTMl9OQU1FU1BBQ0VfVVJJICsgIi8iICsgImVjaG9SZWRpcmVjdCIsIGF4aXNPcCk7Ci0KLSAgICAgICAgcmV0dXJuIHNlcnZpY2U7Ci0gICAgfQotCi0gICAgQXhpc1NlcnZpY2UgY3JlYXRlTXVsdGlIb3BSZWRpcmVjdFNlcnZpY2UyKCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgQXhpc1NlcnZpY2UoIk11bHRpSG9wUmVkaXJlY3RTZXJ2aWNlMiIpOwotCi0gICAgICAgIHNlcnZpY2Uuc2V0Q2xhc3NMb2FkZXIoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKSk7Ci0gICAgICAgIHNlcnZpY2UuYWRkUGFyYW1ldGVyKAotICAgICAgICAgICAgICAgIG5ldyBQYXJhbWV0ZXIoQ29uc3RhbnRzLlNFUlZJQ0VfQ0xBU1MsIE11bHRpSG9wUmVkaXJlY3RTZXJ2aWNlMi5jbGFzcy5nZXROYW1lKCkpKTsKLQotICAgICAgICBBeGlzT3BlcmF0aW9uIGF4aXNPcCA9IG5ldyBJbk91dEF4aXNPcGVyYXRpb24obmV3IFFOYW1lKCJlY2hvUmVkaXJlY3QiKSk7Ci0KLSAgICAgICAgYXhpc09wLnNldE1lc3NhZ2VSZWNlaXZlcihuZXcgUmF3WE1MSU5PdXRNZXNzYWdlUmVjZWl2ZXIoKSk7Ci0gICAgICAgIHNlcnZpY2UuYWRkT3BlcmF0aW9uKGF4aXNPcCk7Ci0gICAgICAgIHNlcnZpY2UubWFwQWN0aW9uVG9PcGVyYXRpb24oQ29uc3RhbnRzLkFYSVMyX05BTUVTUEFDRV9VUkkgKyAiLyIgKyAiZWNob1JlZGlyZWN0IiwgYXhpc09wKTsKLQotICAgICAgICByZXR1cm4gc2VydmljZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBVdGlsU2VydmVyLnVuRGVwbG95U2VydmljZShuZXcgUU5hbWUoIk11bHRpSG9wUmVkaXJlY3RTZXJ2aWNlMSIpKTsKLSAgICAgICAgVXRpbFNlcnZlci51bkRlcGxveVNlcnZpY2UobmV3IFFOYW1lKCJNdWx0aUhvcFJlZGlyZWN0U2VydmljZTIiKSk7Ci0gICAgICAgIFV0aWxTZXJ2ZXIudW5EZXBsb3lDbGllbnRTZXJ2aWNlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE11bHRpSG9wKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE9NRWxlbWVudCBtZXRob2QgPSBjcmVhdGVFbGVtZW50KCJ0aGlzIG1lc3NhZ2Ugc2hvdWxkIG5vdCBjYXVzZSBhIGZhdWx0LiIpOwotICAgICAgICBTZXJ2aWNlQ2xpZW50IHNlbmRlciA9IG51bGw7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNlbmRlciA9IGNyZWF0ZVNlcnZpY2VDbGllbnQoKTsKLSAgICAgICAgICAgIE9NRWxlbWVudCByZXNwb25zZSA9IHNlbmRlci5zZW5kUmVjZWl2ZShuZXcgUU5hbWUoImVjaG9SZWRpcmVjdCIpLCBtZXRob2QpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0aGlzIG1lc3NhZ2Ugc2hvdWxkIG5vdCBjYXVzZSBhIGZhdWx0LiIsIHJlc3BvbnNlLmdldFRleHQoKSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoc2VuZGVyICE9IG51bGwpCi0gICAgICAgICAgICAgICAgc2VuZGVyLmNsZWFudXAoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgT01FbGVtZW50IGNyZWF0ZUVsZW1lbnQoU3RyaW5nIHRleHQpIHsKLSAgICAgICAgT01GYWN0b3J5IGZhYyA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpOwotCi0gICAgICAgIE9NTmFtZXNwYWNlIG9tTnMgPSBmYWMuY3JlYXRlT01OYW1lc3BhY2UoQ29uc3RhbnRzLkFYSVMyX05BTUVTUEFDRV9VUkkgKyAiL2FkZHJlc3NpbmciLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJheGlzMmFkZHJlc3NpbmciKTsKLSAgICAgICAgT01FbGVtZW50IHZhbHVlID0gZmFjLmNyZWF0ZU9NRWxlbWVudCgiZWxlbWVudCIsIG9tTnMpOwotICAgICAgICB2YWx1ZS5zZXRUZXh0KHRleHQpOwotCi0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFNlcnZpY2VDbGllbnQgY3JlYXRlU2VydmljZUNsaWVudCgpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBBeGlzU2VydmljZSBzZXJ2aWNlID0gbmV3IEF4aXNTZXJ2aWNlKCJNdWx0aUhvcFJlZGlyZWN0U2VydmljZTEiKTsKLQotICAgICAgICBzZXJ2aWNlLnNldENsYXNzTG9hZGVyKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkpOwotICAgICAgICBzZXJ2aWNlLmFkZFBhcmFtZXRlcigKLSAgICAgICAgICAgICAgICBuZXcgUGFyYW1ldGVyKENvbnN0YW50cy5TRVJWSUNFX0NMQVNTLCBNdWx0aUhvcFJlZGlyZWN0U2VydmljZTEuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0KLSAgICAgICAgQXhpc09wZXJhdGlvbiBheGlzT3AgPSBuZXcgT3V0SW5BeGlzT3BlcmF0aW9uKG5ldyBRTmFtZSgiZWNob1JlZGlyZWN0IikpOwotCi0gICAgICAgIGF4aXNPcC5zZXRNZXNzYWdlUmVjZWl2ZXIobmV3IFJhd1hNTElOT3V0TWVzc2FnZVJlY2VpdmVyKCkpOwotICAgICAgICBheGlzT3Auc2V0U29hcEFjdGlvbihDb25zdGFudHMuQVhJUzJfTkFNRVNQQUNFX1VSSSArICIvIiArICJlY2hvUmVkaXJlY3QiKTsKLSAgICAgICAgYXhpc09wLnNldE91dHB1dEFjdGlvbihDb25zdGFudHMuQVhJUzJfTkFNRVNQQUNFX1VSSSArICIvIiArICJlY2hvUmVkaXJlY3QiKTsKLSAgICAgICAgc2VydmljZS5hZGRPcGVyYXRpb24oYXhpc09wKTsKLSAgICAgICAgc2VydmljZS5tYXBBY3Rpb25Ub09wZXJhdGlvbihDb25zdGFudHMuQVhJUzJfTkFNRVNQQUNFX1VSSSArICIvIiArICJlY2hvUmVkaXJlY3QiLCBheGlzT3ApOwotCi0gICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ2NvbnRleHQgPSBVdGlsU2VydmVyLmNyZWF0ZUNsaWVudENvbmZpZ3VyYXRpb25Db250ZXh0KCk7Ci0KLSAgICAgICAgU2VydmljZUNsaWVudCBzZW5kZXI7Ci0gICAgICAgIE9wdGlvbnMgb3B0aW9ucyA9IG5ldyBPcHRpb25zKCk7Ci0gICAgICAgIG9wdGlvbnMuc2V0VG8odGFyZ2V0RVBSKTsKLSAgICAgICAgb3B0aW9ucy5zZXRUcmFuc3BvcnRJblByb3RvY29sKENvbnN0YW50cy5UUkFOU1BPUlRfSFRUUCk7Ci0gICAgICAgIG9wdGlvbnMuc2V0VXNlU2VwYXJhdGVMaXN0ZW5lcih0cnVlKTsKLSAgICAgICAgb3B0aW9ucy5zZXRUaW1lT3V0SW5NaWxsaVNlY29uZHMoNTAwMCk7Ci0gICAgICAgIHNlbmRlciA9IG5ldyBTZXJ2aWNlQ2xpZW50KGNvbmZpZ2NvbnRleHQsIHNlcnZpY2UpOwotICAgICAgICBzZW5kZXIuc2V0T3B0aW9ucyhvcHRpb25zKTsKLSAgICAgICAgc2VuZGVyLmVuZ2FnZU1vZHVsZSgiYWRkcmVzc2luZyIpOwotICAgICAgICByZXR1cm4gc2VuZGVyOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9hZGRyZXNzaW5nL1JlZGlyZWN0UmVjZWl2ZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9hZGRyZXNzaW5nL1JlZGlyZWN0UmVjZWl2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI0YmJmYi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvYWRkcmVzc2luZy9SZWRpcmVjdFJlY2VpdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZzsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgUmVkaXJlY3RSZWNlaXZlciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIHJlc3BvbnNlUmVjaWV2ZWQgPSBmYWxzZTsKLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNSZWNlaXZlZFJlc3BvbnNlKCkgewotICAgICAgICByZXR1cm4gcmVzcG9uc2VSZWNpZXZlZDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGZhdWx0UmVjaWV2ZWQgPSBmYWxzZTsKLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNSZWNlaXZlZEZhdWx0KCkgewotICAgICAgICByZXR1cm4gZmF1bHRSZWNpZXZlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBlY2hvT01FbGVtZW50UmVzcG9uc2UoT01FbGVtZW50IG9tRWxlKSB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZWNob09NRWxlbWVudFJlc3BvbnNlOiAiICsgb21FbGUpOwotICAgICAgICByZXNwb25zZVJlY2lldmVkID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBmYXVsdChPTUVsZW1lbnQgb21FbGUpIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJmYXVsdDogIiArIG9tRWxlKTsKLSAgICAgICAgZmF1bHRSZWNpZXZlZCA9IHRydWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2FzeW5jL0FzeW5jTWVzc2FnZVJlY2VpdmVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvYXN5bmMvQXN5bmNNZXNzYWdlUmVjZWl2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc0OGQ5MC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvYXN5bmMvQXN5bmNNZXNzYWdlUmVjZWl2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuYXN5bmM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pMThuLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLkFic3RyYWN0SW5PdXRBc3luY01lc3NhZ2VSZWNlaXZlcjsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLQotcHVibGljIGNsYXNzIEFzeW5jTWVzc2FnZVJlY2VpdmVyIGV4dGVuZHMgQWJzdHJhY3RJbk91dEFzeW5jTWVzc2FnZVJlY2VpdmVyIHsKLQotICAgIHB1YmxpYyB2b2lkIGludm9rZUJ1c2luZXNzTG9naWMoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VDb250ZXh0IG5ld21zZ0NvbnRleHQpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gZ2V0IHRoZSBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgdGhlIFdlYiBTZXJ2aWNlCi0gICAgICAgICAgICBPYmplY3Qgb2JqID0gZ2V0VGhlSW1wbGVtZW50YXRpb25PYmplY3QobXNnQ29udGV4dCk7Ci0KLSAgICAgICAgICAgIC8vIGZpbmQgdGhlIFdlYlNlcnZpY2UgbWV0aG9kCi0gICAgICAgICAgICBDbGFzcyBJbXBsQ2xhc3MgPSBvYmouZ2V0Q2xhc3MoKTsKLQotICAgICAgICAgICAgQXhpc09wZXJhdGlvbiBvcERlc2MgPSBtc2dDb250ZXh0LmdldE9wZXJhdGlvbkNvbnRleHQoKS5nZXRBeGlzT3BlcmF0aW9uKCk7Ci0gICAgICAgICAgICBNZXRob2QgbWV0aG9kID0gZmluZE9wZXJhdGlvbihvcERlc2MsIEltcGxDbGFzcyk7Ci0KLSAgICAgICAgICAgIGlmIChtZXRob2QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIENsYXNzW10gIHBhcmFtZXRlcnMgPSBtZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKTsKLSAgICAgICAgICAgICAgICBPYmplY3RbXSBhcmdzOwotCi0gICAgICAgICAgICAgICAgaWYgKChwYXJhbWV0ZXJzID09IG51bGwpIHx8IChwYXJhbWV0ZXJzLmxlbmd0aCA9PSAwKSkgewotICAgICAgICAgICAgICAgICAgICBhcmdzID0gbmV3IE9iamVjdFswXTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhcmFtZXRlcnMubGVuZ3RoID09IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IG1zZ0NvbnRleHQuZ2V0RW52ZWxvcGUoKS5nZXRCb2R5KCkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIGFyZ3MgPSBuZXcgT2JqZWN0W10geyBvbUVsZW1lbnQgfTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KE1lc3NhZ2VzLmdldE1lc3NhZ2UoInJhd1htbFByb2l2ZGVJc0xpbWl0ZWQiKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgT01FbGVtZW50IHJlc3VsdCA9IChPTUVsZW1lbnQpbWV0aG9kLmludm9rZShvYmosIGFyZ3MpOwotICAgICAgICAgICAgICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2UgPSBtc2dDb250ZXh0LmdldEF4aXNTZXJ2aWNlKCk7Ci0gICAgICAgICAgICAgICAgc2VydmljZS5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICAgICAgICAgICAgICByZXN1bHQuZGVjbGFyZU5hbWVzcGFjZShzZXJ2aWNlLmdldFRhcmdldE5hbWVzcGFjZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UuZ2V0VGFyZ2V0TmFtZXNwYWNlUHJlZml4KCkpOwotICAgICAgICAgICAgICAgIE9NRWxlbWVudCBib2R5Q29udGVudDsKLQotICAgICAgICAgICAgICAgIFNPQVBGYWN0b3J5IGZhYyA9IGdldFNPQVBGYWN0b3J5KG1zZ0NvbnRleHQpOwotICAgICAgICAgICAgICAgIGJvZHlDb250ZW50ID0gcmVzdWx0OwotCi0gICAgICAgICAgICAgICAgU09BUEVudmVsb3BlIGVudmVsb3BlID0gZmFjLmdldERlZmF1bHRFbnZlbG9wZSgpOwotCi0gICAgICAgICAgICAgICAgaWYgKGJvZHlDb250ZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZW52ZWxvcGUuZ2V0Qm9keSgpLmFkZENoaWxkKGJvZHlDb250ZW50KTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBuZXdtc2dDb250ZXh0LnNldEVudmVsb3BlKGVudmVsb3BlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdChNZXNzYWdlcy5nZXRNZXNzYWdlKCJtZXRob2ROb3RJbXBsZW1lbnRlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wRGVzYy5nZXROYW1lKCkudG9TdHJpbmcoKSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBNZXRob2QgZmluZE9wZXJhdGlvbihBeGlzT3BlcmF0aW9uIG9wLCBDbGFzcyBJbXBsQ2xhc3MpIHsKLSAgICAgICAgTWV0aG9kIG1ldGhvZCA9IG51bGw7Ci0gICAgICAgIFN0cmluZyBtZXRob2ROYW1lID0gb3AuZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpOwotICAgICAgICBNZXRob2RbXSBtZXRob2RzID0gSW1wbENsYXNzLmdldE1ldGhvZHMoKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChtZXRob2RzW2ldLmdldE5hbWUoKS5lcXVhbHMobWV0aG9kTmFtZSkpIHsKLSAgICAgICAgICAgICAgICBtZXRob2QgPSBtZXRob2RzW2ldOwotCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbWV0aG9kOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9hc3luYy9Bc3luY1NlcnZpY2UyVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2FzeW5jL0FzeW5jU2VydmljZTJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3MTUwZWQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2FzeW5jL0FzeW5jU2VydmljZTJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmFzeW5jOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01OYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50Lk9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuU2VydmljZUNsaWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5hc3luYy5BeGlzQ2FsbGJhY2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuU2VydmljZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5FY2hvOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLnV0aWwuVGVzdENvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmludGVncmF0aW9uLlV0aWxTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pbnRlZ3JhdGlvbi5VdGlsU2VydmVyQmFzZWRUZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkhUVFBDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLlV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC50aHJlYWRwb29sLlRocmVhZFBvb2w7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1wdWJsaWMgY2xhc3MgQXN5bmNTZXJ2aWNlMlRlc3QgZXh0ZW5kcyBVdGlsU2VydmVyQmFzZWRUZXN0Q2FzZSBpbXBsZW1lbnRzIFRlc3RDb25zdGFudHMgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEFzeW5jU2VydmljZTJUZXN0LmNsYXNzKTsKLSAgICBwcm90ZWN0ZWQgUU5hbWUgdHJhbnNwb3J0TmFtZSA9IG5ldyBRTmFtZSgiaHR0cDovL2xvY2FsaG9zdC9teSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk51bGxUcmFuc3BvcnQiKTsKLSAgICBFbmRwb2ludFJlZmVyZW5jZSB0YXJnZXRFUFIgPSBuZXcgRW5kcG9pbnRSZWZlcmVuY2UoCi0gICAgICAgICAgICAiaHR0cDovLzEyNy4wLjAuMToiICsgKFV0aWxTZXJ2ZXIuVEVTVElOR19QT1JUKQotLy8gICAgICAgICAgICAiaHR0cDovLzEyNy4wLjAuMToiICsgNTU1NgotKyAiL2F4aXMyL3NlcnZpY2VzL0VjaG9YTUxTZXJ2aWNlL2VjaG9PTUVsZW1lbnQiKTsKLQotICAgIHByb3RlY3RlZCBBeGlzQ29uZmlndXJhdGlvbiBlbmdpbmVSZWdpc3RyeTsKLSAgICBwcm90ZWN0ZWQgTWVzc2FnZUNvbnRleHQgbWM7Ci0gICAgcHJvdGVjdGVkIFNlcnZpY2VDb250ZXh0IHNlcnZpY2VDb250ZXh0OwotICAgIHByb3RlY3RlZCBBeGlzU2VydmljZSBzZXJ2aWNlOwotICAgIEV4Y2VwdGlvbiBlcnJvcjsKLSAgICAvLyBBIChzeW5jaHJvbml6ZWQpIHBsYWNlIHRvIGhvbGQgdGhlIHJlc3BvbnNlcwotICAgIGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gcmVzcG9uc2VzID0KLSAgICAgICAgICAgIENvbGxlY3Rpb25zLnN5bmNocm9uaXplZE1hcChuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKSk7Ci0KLSAgICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFBSRUZJWF9URVhUID0gIlJlcXVlc3QgbnVtYmVyICI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIHJldHVybiBnZXRUZXN0U2V0dXAobmV3IFRlc3RTdWl0ZShBc3luY1NlcnZpY2UyVGVzdC5jbGFzcykpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHNlcnZpY2UgPSBVdGlscy5jcmVhdGVTaW1wbGVTZXJ2aWNlKHNlcnZpY2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXN5bmNNZXNzYWdlUmVjZWl2ZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWNoby5jbGFzcy5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbk5hbWUpOwotICAgICAgICBVdGlsU2VydmVyLmRlcGxveVNlcnZpY2Uoc2VydmljZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgVXRpbFNlcnZlci51bkRlcGxveVNlcnZpY2Uoc2VydmljZU5hbWUpOwotICAgICAgICBVdGlsU2VydmVyLnVuRGVwbG95Q2xpZW50U2VydmljZSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNSUxMSVNFQ09ORFMgPSAxMDAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEludGVnZXIgVElNRU9VVCA9IDIwMCAqIE1JTExJU0VDT05EUzsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1JFUVVFU1RTID0gOTsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFY2hvWE1MQ29tcGxldGVBU3luY1dpdGhMaW1pdGVkTnVtYmVyT2ZDb25uZWN0aW9ucygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBBeGlzU2VydmljZSBzZXJ2aWNlID0KLSAgICAgICAgICAgICAgICBVdGlscy5jcmVhdGVTaW1wbGVTZXJ2aWNlZm9yQ2xpZW50KHNlcnZpY2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWNoby5jbGFzcy5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25OYW1lKTsKLQotICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdjb250ZXh0ID0gVXRpbFNlcnZlci5jcmVhdGVDbGllbnRDb25maWd1cmF0aW9uQ29udGV4dCgpOwotCi0gICAgICAgIC8vIFVzZSBtYXggb2YgMyB0aHJlYWRzIGZvciB0aGUgYXN5bmMgdGhyZWFkIHBvb2wKLSAgICAgICAgY29uZmlnY29udGV4dC5zZXRUaHJlYWRQb29sKG5ldyBUaHJlYWRQb29sKDEsIDMpKTsKLQotICAgICAgICBPTUZhY3RvcnkgZmFjID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCk7Ci0gICAgICAgIFNlcnZpY2VDbGllbnQgc2VuZGVyID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9wdGlvbnMgb3B0aW9ucyA9IG5ldyBPcHRpb25zKCk7Ci0gICAgICAgICAgICBvcHRpb25zLnNldFRvKHRhcmdldEVQUik7Ci0gICAgICAgICAgICBvcHRpb25zLnNldFRyYW5zcG9ydEluUHJvdG9jb2woQ29uc3RhbnRzLlRSQU5TUE9SVF9IVFRQKTsKLSAgICAgICAgICAgIG9wdGlvbnMuc2V0VXNlU2VwYXJhdGVMaXN0ZW5lcih0cnVlKTsKLSAgICAgICAgICAgIG9wdGlvbnMuc2V0QWN0aW9uKG9wZXJhdGlvbk5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotCi0gICAgICAgICAgICBvcHRpb25zLnNldFRpbWVPdXRJbk1pbGxpU2Vjb25kcygyMDAgKiBNSUxMSVNFQ09ORFMpOwotICAgICAgICAgICAgb3B0aW9ucy5zZXRQcm9wZXJ0eShIVFRQQ29uc3RhbnRzLkNIVU5LRUQsIEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgICAgICBvcHRpb25zLnNldFByb3BlcnR5KEhUVFBDb25zdGFudHMuU09fVElNRU9VVCwgVElNRU9VVCk7Ci0gICAgICAgICAgICBvcHRpb25zLnNldFByb3BlcnR5KEhUVFBDb25zdGFudHMuQ09OTkVDVElPTl9USU1FT1VULCBUSU1FT1VUKTsKLSAgICAgICAgICAgIG9wdGlvbnMuc2V0UHJvcGVydHkoSFRUUENvbnN0YW50cy5SRVVTRV9IVFRQX0NMSUVOVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgICAgIG9wdGlvbnMuc2V0UHJvcGVydHkoSFRUUENvbnN0YW50cy5BVVRPX1JFTEVBU0VfQ09OTkVDVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQm9vbGVhbi5UUlVFKTsKLS8vICAgICAgICAgICAgb3B0aW9ucy5zZXRQcm9wZXJ0eShTZXJ2aWNlQ2xpZW50LkFVVE9fT1BFUkFUSU9OX0NMRUFOVVAsIHRydWUpOwotCi0gICAgICAgICAgICBBeGlzQ2FsbGJhY2sgY2FsbGJhY2sgPSBuZXcgQXhpc0NhbGxiYWNrKCkgewotCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25NZXNzYWdlKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgT01FbGVtZW50IHJlc3BvbnNlRWxlbWVudCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnQ29udGV4dC5nZXRFbnZlbG9wZSgpLmdldEJvZHkoKS5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXNwb25zZUVsZW1lbnQpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdGV4dFZhbHVlID0gcmVzcG9uc2VFbGVtZW50LmdldEZpcnN0RWxlbWVudCgpLmdldFRleHQoKTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh0ZXh0VmFsdWUuc3RhcnRzV2l0aChQUkVGSVhfVEVYVCkpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgd2hpY2hPbmUgPSB0ZXh0VmFsdWUuc3Vic3RyaW5nKFBSRUZJWF9URVhULmxlbmd0aCgpKTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0TnVsbChyZXNwb25zZXMuZ2V0KHdoaWNoT25lKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlcy5wdXQod2hpY2hPbmUsIHRleHRWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAocmVzcG9uc2VzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2VzLnNpemUoKSA9PSBNQVhfUkVRVUVTVFMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBbGwgZG9uZSEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZXMubm90aWZ5QWxsKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkZhdWx0KE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gV2hvb3BzLgotICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHJlc3BvbnNlcykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yICE9IG51bGwpIHJldHVybjsgLy8gT25seSB0YWtlIGZpcnN0IGVycm9yCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnJvciA9IG1zZ0NvbnRleHQuZ2V0RW52ZWxvcGUoKS5nZXRCb2R5KCkuZ2V0RmF1bHQoKS5nZXRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlcy5ub3RpZnkoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ29tcGxldGUoKSB7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25FcnJvcihFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuaW5mbyhlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAocmVzcG9uc2VzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IgIT0gbnVsbCkgcmV0dXJuOyAvLyBPbmx5IHRha2UgZmlyc3QgZXJyb3IKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yID0gZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlcy5ub3RpZnkoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH07Ci0KLSAgICAgICAgICAgIHNlbmRlciA9IG5ldyBTZXJ2aWNlQ2xpZW50KGNvbmZpZ2NvbnRleHQsIHNlcnZpY2UpOwotICAgICAgICAgICAgc2VuZGVyLnNldE9wdGlvbnMob3B0aW9ucyk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE1BWF9SRVFVRVNUUzsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgT01OYW1lc3BhY2Ugb21OcyA9IGZhYy5jcmVhdGVPTU5hbWVzcGFjZSgiaHR0cDovL2xvY2FsaG9zdC9teSIsICJteSIpOwotICAgICAgICAgICAgICAgIE9NRWxlbWVudCBtZXRob2QgPSBmYWMuY3JlYXRlT01FbGVtZW50KCJlY2hvT01FbGVtZW50Iiwgb21Ocyk7Ci0gICAgICAgICAgICAgICAgT01FbGVtZW50IHZhbHVlID0gZmFjLmNyZWF0ZU9NRWxlbWVudCgibXlWYWx1ZSIsIG9tTnMpOwotICAgICAgICAgICAgICAgIHZhbHVlLnNldFRleHQoUFJFRklYX1RFWFQgKyBpKTsKLSAgICAgICAgICAgICAgICBtZXRob2QuYWRkQ2hpbGQodmFsdWUpOwotICAgICAgICAgICAgICAgIHNlbmRlci5zZW5kUmVjZWl2ZU5vbkJsb2NraW5nKG9wZXJhdGlvbk5hbWUsIG1ldGhvZCwgY2FsbGJhY2spOwotICAgICAgICAgICAgICAgIGxvZy50cmFjZSgic2VudCB0aGUgcmVxdWVzdCAjIDogIiArIGkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbG9nLnRyYWNlKCJ3YWl0aW5nIChtYXggMW1pbikiKTsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAocmVzcG9uc2VzKSB7Ci0gICAgICAgICAgICAgICAgcmVzcG9uc2VzLndhaXQoNjAgKiAxMDAwKTsKLSAgICAgICAgICAgICAgICAvLyBTb21lb25lIGtpY2tlZCB1cywgc28gZWl0aGVyIHdlIGhhdmUgYSBwcm9ibGVtCi0gICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlcy5zaXplKCkgPCBNQVhfUkVRVUVTVFMpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiVGltZW91dCwgZGlkIG5vdCByZWNlaXZlIGFsbCByZXNwb25zZXMuIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHNlbmRlciAhPSBudWxsKQotICAgICAgICAgICAgICAgIHNlbmRlci5jbGVhbnVwKCk7Ci0gICAgICAgIH0KLQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9hc3luYy9Bc3luY1NlcnZpY2VUZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvYXN5bmMvQXN5bmNTZXJ2aWNlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDEzMzQ5Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9hc3luYy9Bc3luY1NlcnZpY2VUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmFzeW5jOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01OYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50Lk9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuU2VydmljZUNsaWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5hc3luYy5BeGlzQ2FsbGJhY2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuU2VydmljZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5FY2hvOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLnV0aWwuVGVzdENvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmludGVncmF0aW9uLlRlc3RpbmdVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmludGVncmF0aW9uLlV0aWxTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pbnRlZ3JhdGlvbi5VdGlsU2VydmVyQmFzZWRUZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1wdWJsaWMgY2xhc3MgQXN5bmNTZXJ2aWNlVGVzdCBleHRlbmRzIFV0aWxTZXJ2ZXJCYXNlZFRlc3RDYXNlIGltcGxlbWVudHMgVGVzdENvbnN0YW50cyB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coQXN5bmNTZXJ2aWNlVGVzdC5jbGFzcyk7Ci0gICAgcHJvdGVjdGVkIFFOYW1lIHRyYW5zcG9ydE5hbWUgPSBuZXcgUU5hbWUoImh0dHA6Ly9sb2NhbGhvc3QvbXkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOdWxsVHJhbnNwb3J0Iik7Ci0gICAgRW5kcG9pbnRSZWZlcmVuY2UgdGFyZ2V0RVBSID0gbmV3IEVuZHBvaW50UmVmZXJlbmNlKAotICAgICAgICAgICAgImh0dHA6Ly8xMjcuMC4wLjE6IiArIChVdGlsU2VydmVyLlRFU1RJTkdfUE9SVCkKLS8vICAgICAgICAgICAgImh0dHA6Ly8xMjcuMC4wLjE6IiArIDU1NTYKLSAgICAgICAgICAgICAgICAgICAgKyAiL2F4aXMyL3NlcnZpY2VzL0VjaG9YTUxTZXJ2aWNlL2VjaG9PTUVsZW1lbnQiKTsKLQotICAgIHByb3RlY3RlZCBBeGlzQ29uZmlndXJhdGlvbiBlbmdpbmVSZWdpc3RyeTsKLSAgICBwcm90ZWN0ZWQgTWVzc2FnZUNvbnRleHQgbWM7Ci0gICAgcHJvdGVjdGVkIFNlcnZpY2VDb250ZXh0IHNlcnZpY2VDb250ZXh0OwotICAgIHByb3RlY3RlZCBBeGlzU2VydmljZSBzZXJ2aWNlOwotICAgIHByaXZhdGUgYm9vbGVhbiBmaW5pc2ggPSBmYWxzZTsKLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgcmV0dXJuIGdldFRlc3RTZXR1cChuZXcgVGVzdFN1aXRlKEFzeW5jU2VydmljZVRlc3QuY2xhc3MpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzZXJ2aWNlID0gVXRpbHMuY3JlYXRlU2ltcGxlU2VydmljZShzZXJ2aWNlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFzeW5jTWVzc2FnZVJlY2VpdmVyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVjaG8uY2xhc3MuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25OYW1lKTsKLSAgICAgICAgVXRpbFNlcnZlci5kZXBsb3lTZXJ2aWNlKHNlcnZpY2UpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFV0aWxTZXJ2ZXIudW5EZXBsb3lTZXJ2aWNlKHNlcnZpY2VOYW1lKTsKLSAgICAgICAgVXRpbFNlcnZlci51bkRlcGxveUNsaWVudFNlcnZpY2UoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RWNob1hNTENvbXBsZXRlQVN5bmMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSA9Ci0gICAgICAgICAgICAgICAgVXRpbHMuY3JlYXRlU2ltcGxlU2VydmljZWZvckNsaWVudChzZXJ2aWNlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVjaG8uY2xhc3MuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uTmFtZSk7Ci0KLSAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnY29udGV4dCA9IFV0aWxTZXJ2ZXIuY3JlYXRlQ2xpZW50Q29uZmlndXJhdGlvbkNvbnRleHQoKTsKLQotICAgICAgICBPTUZhY3RvcnkgZmFjID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCk7Ci0KLSAgICAgICAgT01OYW1lc3BhY2Ugb21OcyA9IGZhYy5jcmVhdGVPTU5hbWVzcGFjZSgiaHR0cDovL2xvY2FsaG9zdC9teSIsICJteSIpOwotICAgICAgICBPTUVsZW1lbnQgbWV0aG9kID0gZmFjLmNyZWF0ZU9NRWxlbWVudCgiZWNob09NRWxlbWVudCIsIG9tTnMpOwotICAgICAgICBPTUVsZW1lbnQgdmFsdWUgPSBmYWMuY3JlYXRlT01FbGVtZW50KCJteVZhbHVlIiwgb21Ocyk7Ci0gICAgICAgIHZhbHVlLnNldFRleHQoIklzYWFjIEFzaW1vdiwgVGhlIEZvdW5kYXRpb24gVHJpbG9neSIpOwotICAgICAgICBtZXRob2QuYWRkQ2hpbGQodmFsdWUpOwotICAgICAgICBTZXJ2aWNlQ2xpZW50IHNlbmRlciA9IG51bGw7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9wdGlvbnMgb3B0aW9ucyA9IG5ldyBPcHRpb25zKCk7Ci0gICAgICAgICAgICBvcHRpb25zLnNldFRvKHRhcmdldEVQUik7Ci0gICAgICAgICAgICBvcHRpb25zLnNldFRyYW5zcG9ydEluUHJvdG9jb2woQ29uc3RhbnRzLlRSQU5TUE9SVF9IVFRQKTsKLSAgICAgICAgICAgIG9wdGlvbnMuc2V0VXNlU2VwYXJhdGVMaXN0ZW5lcih0cnVlKTsKLSAgICAgICAgICAgIG9wdGlvbnMuc2V0QWN0aW9uKG9wZXJhdGlvbk5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotCi0gICAgICAgICAgICBBeGlzQ2FsbGJhY2sgY2FsbGJhY2sgPSBuZXcgQXhpc0NhbGxiYWNrKCkgewotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogVGhpcyBpcyBjYWxsZWQgd2hlbiB3ZSByZWNlaXZlIGEgbWVzc2FnZS4KLSAgICAgICAgICAgICAgICAgKgotICAgICAgICAgICAgICAgICAqIEBwYXJhbSBtc2dDb250ZXh0IHRoZSAocmVzcG9uc2UpIE1lc3NhZ2VDb250ZXh0Ci0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25NZXNzYWdlKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHsKLSAgICAgICAgICAgICAgICAgICAgT01FbGVtZW50IHJlc3VsdCA9IG1zZ0NvbnRleHQuZ2V0RW52ZWxvcGUoKS5nZXRCb2R5KCkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIFRlc3RpbmdVdGlscy5jb21wYXJlV2l0aENyZWF0ZWRPTUVsZW1lbnQocmVzdWx0KTsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJyZXN1bHQgPSAiICsgcmVzdWx0KTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiBUaGlzIGdldHMgY2FsbGVkIHdoZW4gYSBmYXVsdCBtZXNzYWdlIGlzIHJlY2VpdmVkLgotICAgICAgICAgICAgICAgICAqCi0gICAgICAgICAgICAgICAgICogQHBhcmFtIG1zZ0NvbnRleHQgdGhlIE1lc3NhZ2VDb250ZXh0IGNvbnRhaW5pbmcgdGhlIGZhdWx0LgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uRmF1bHQoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgewotICAgICAgICAgICAgICAgICAgICBmYWlsKCJGYXVsdCByZWNlaXZlZCIpOwotICAgICAgICAgICAgICAgIH0KLQotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogVGhpcyBnZXRzIGNhbGxlZCBPTkxZIHdoZW4gYW4gaW50ZXJuYWwgcHJvY2Vzc2luZyBleGNlcHRpb24gb2NjdXJzLgotICAgICAgICAgICAgICAgICAqCi0gICAgICAgICAgICAgICAgICogQHBhcmFtIGUgdGhlIEV4Y2VwdGlvbiB3aGljaCBjYXVzZWQgdGhlIHByb2JsZW0KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkVycm9yKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqIFRoaXMgaXMgY2FsbGVkIGF0IHRoZSBlbmQgb2YgdGhlIE1FUCBubyBtYXR0ZXIgd2hhdCBoYXBwZW5zLCBxdWl0ZSBsaWtlIGEgZmluYWxseSBibG9jay4gKi8KLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNvbXBsZXRlKCkgewotICAgICAgICAgICAgICAgICAgICBmaW5pc2ggPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBub3RpZnkoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotCi0gICAgICAgICAgICBzZW5kZXIgPSBuZXcgU2VydmljZUNsaWVudChjb25maWdjb250ZXh0LCBzZXJ2aWNlKTsKLSAgICAgICAgICAgIHNlbmRlci5zZXRPcHRpb25zKG9wdGlvbnMpOwotCi0gICAgICAgICAgICBzZW5kZXIuc2VuZFJlY2VpdmVOb25CbG9ja2luZyhvcGVyYXRpb25OYW1lLCBtZXRob2QsIGNhbGxiYWNrKTsKLSAgICAgICAgICAgIGxvZy5pbmZvKCJzZW5kIHRoZSByZXF1ZXN0Iik7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGNhbGxiYWNrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFmaW5pc2gpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sud2FpdCg0NTAwMCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghZmluaXNoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2VydmVyIHdhcyBzaHV0ZG93biBhcyB0aGUgYXN5bmMgcmVzcG9uc2UgdGFrZSB0b28gbG9uZyB0byBjb21wbGV0ZSIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHNlbmRlciAhPSBudWxsKQotICAgICAgICAgICAgICAgIHNlbmRlci5jbGVhbnVwKCk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2FzeW5jL0FzeW5jU2VydmljZVdpdGhUcmFuc3BvcnRGYWlsdXJlVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2FzeW5jL0FzeW5jU2VydmljZVdpdGhUcmFuc3BvcnRGYWlsdXJlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzM5ZWRkLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9hc3luYy9Bc3luY1NlcnZpY2VXaXRoVHJhbnNwb3J0RmFpbHVyZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuYXN5bmM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuT3B0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5TZXJ2aWNlQ2xpZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50LmFzeW5jLkFzeW5jUmVzdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50LmFzeW5jLkNhbGxiYWNrOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LlNlcnZpY2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0NvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuRWNobzsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS51dGlsLlRlc3RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pbnRlZ3JhdGlvbi5UZXN0aW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pbnRlZ3JhdGlvbi5VdGlsU2VydmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaW50ZWdyYXRpb24uVXRpbFNlcnZlckJhc2VkVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLlV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgQXN5bmNTZXJ2aWNlV2l0aFRyYW5zcG9ydEZhaWx1cmVUZXN0IGV4dGVuZHMKLSAgICAgICAgVXRpbFNlcnZlckJhc2VkVGVzdENhc2UgaW1wbGVtZW50cyBUZXN0Q29uc3RhbnRzIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coQXN5bmNTZXJ2aWNlV2l0aFRyYW5zcG9ydEZhaWx1cmVUZXN0LmNsYXNzKTsKLSAgICBFbmRwb2ludFJlZmVyZW5jZSB0YXJnZXRFUFIgPSBuZXcgRW5kcG9pbnRSZWZlcmVuY2UoImh0dHA6Ly8xMjcuMC4wLjE6MCIKLSAgICAgICAgICAgICsgIi9heGlzMi9zZXJ2aWNlcy9FY2hvWE1MU2VydmljZS9lY2hvT01FbGVtZW50Iik7Ci0KLSAgICBwcm90ZWN0ZWQgQXhpc0NvbmZpZ3VyYXRpb24gZW5naW5lUmVnaXN0cnk7Ci0gICAgcHJvdGVjdGVkIE1lc3NhZ2VDb250ZXh0IG1jOwotICAgIHByb3RlY3RlZCBTZXJ2aWNlQ29udGV4dCBzZXJ2aWNlQ29udGV4dDsKLSAgICBwcm90ZWN0ZWQgQXhpc1NlcnZpY2Ugc2VydmljZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gZmluaXNoID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBib29sZWFuIHdhc0Vycm9yID0gZmFsc2U7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIHJldHVybiBnZXRUZXN0U2V0dXAobmV3IFRlc3RTdWl0ZSgKLSAgICAgICAgICAgICAgICBBc3luY1NlcnZpY2VXaXRoVHJhbnNwb3J0RmFpbHVyZVRlc3QuY2xhc3MpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzZXJ2aWNlID0gVXRpbHMuY3JlYXRlU2ltcGxlU2VydmljZShzZXJ2aWNlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFzeW5jTWVzc2FnZVJlY2VpdmVyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVjaG8uY2xhc3MuZ2V0TmFtZSgpLCBvcGVyYXRpb25OYW1lKTsKLSAgICAgICAgVXRpbFNlcnZlci5kZXBsb3lTZXJ2aWNlKHNlcnZpY2UpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFV0aWxTZXJ2ZXIudW5EZXBsb3lTZXJ2aWNlKHNlcnZpY2VOYW1lKTsKLSAgICAgICAgVXRpbFNlcnZlci51bkRlcGxveUNsaWVudFNlcnZpY2UoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RWNob1hNTENvbXBsZXRlQVN5bmNXaXRoVHJhbnNwb3J0RmFpbHVyZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlN0YXJ0aW5nIHRlc3RFY2hvWE1MQ29tcGxldGVBU3luY1dpdGhUcmFuc3BvcnRGYWlsdXJlIik7Ci0gICAgICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2UgPSBVdGlscy5jcmVhdGVTaW1wbGVTZXJ2aWNlZm9yQ2xpZW50KAotICAgICAgICAgICAgICAgIHNlcnZpY2VOYW1lLAotICAgICAgICAgICAgICAgIEVjaG8uY2xhc3MuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgIG9wZXJhdGlvbk5hbWUpOwotCi0gICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ2NvbnRleHQgPSBVdGlsU2VydmVyLmNyZWF0ZUNsaWVudENvbmZpZ3VyYXRpb25Db250ZXh0KCk7Ci0KLSAgICAgICAgT01GYWN0b3J5IGZhYyA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpOwotCi0gICAgICAgIE9NTmFtZXNwYWNlIG9tTnMgPSBmYWMuY3JlYXRlT01OYW1lc3BhY2UoImh0dHA6Ly9sb2NhbGhvc3QvbXkiLCAibXkiKTsKLSAgICAgICAgT01FbGVtZW50IG1ldGhvZCA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoImVjaG9PTUVsZW1lbnQiLCBvbU5zKTsKLSAgICAgICAgT01FbGVtZW50IHZhbHVlID0gZmFjLmNyZWF0ZU9NRWxlbWVudCgibXlWYWx1ZSIsIG9tTnMpOwotICAgICAgICB2YWx1ZS5zZXRUZXh0KCJJc2FhYyBBc2ltb3YsIFRoZSBGb3VuZGF0aW9uIFRyaWxvZ3kiKTsKLSAgICAgICAgbWV0aG9kLmFkZENoaWxkKHZhbHVlKTsKLSAgICAgICAgU2VydmljZUNsaWVudCBzZW5kZXIgPSBudWxsOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPcHRpb25zIG9wdGlvbnMgPSBuZXcgT3B0aW9ucygpOwotICAgICAgICAgICAgb3B0aW9ucy5zZXRUbyh0YXJnZXRFUFIpOwotICAgICAgICAgICAgb3B0aW9ucy5zZXRUcmFuc3BvcnRJblByb3RvY29sKENvbnN0YW50cy5UUkFOU1BPUlRfSFRUUCk7Ci0gICAgICAgICAgICBvcHRpb25zLnNldFVzZVNlcGFyYXRlTGlzdGVuZXIodHJ1ZSk7Ci0gICAgICAgICAgICBvcHRpb25zLnNldEFjdGlvbihvcGVyYXRpb25OYW1lLmdldExvY2FsUGFydCgpKTsKLQotICAgICAgICAgICAgQ2FsbGJhY2sgY2FsbGJhY2sgPSBuZXcgQ2FsbGJhY2soKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25Db21wbGV0ZShBc3luY1Jlc3VsdCByZXN1bHQpIHsKLSAgICAgICAgICAgICAgICAgICAgVGVzdGluZ1V0aWxzLmNvbXBhcmVXaXRoQ3JlYXRlZE9NRWxlbWVudCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuZ2V0UmVzcG9uc2VFbnZlbG9wZSgpLmdldEJvZHkoKS5nZXRGaXJzdEVsZW1lbnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigicmVzdWx0ID0gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcmVzdWx0LmdldFJlc3BvbnNlRW52ZWxvcGUoKS5nZXRCb2R5KCkuZ2V0Rmlyc3RFbGVtZW50KCkpOwotICAgICAgICAgICAgICAgICAgICBmaW5pc2ggPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uRXJyb3IoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmluZm8oZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgICAgICB3YXNFcnJvciA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmlzaCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLQotICAgICAgICAgICAgc2VuZGVyID0gbmV3IFNlcnZpY2VDbGllbnQoY29uZmlnY29udGV4dCwgc2VydmljZSk7Ci0gICAgICAgICAgICBzZW5kZXIuc2V0T3B0aW9ucyhvcHRpb25zKTsKLQotICAgICAgICAgICAgc2VuZGVyLnNlbmRSZWNlaXZlTm9uQmxvY2tpbmcob3BlcmF0aW9uTmFtZSwgbWV0aG9kLCBjYWxsYmFjayk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInNlbmQgdGhlIHJlcXVlc3QiKTsKLSAgICAgICAgICAgIGxvZy5pbmZvKCJzZW5kIHRoZSByZXF1ZXN0Iik7Ci0gICAgICAgICAgICBpbnQgaW5kZXggPSAwOwotICAgICAgICAgICAgd2hpbGUgKCFmaW5pc2gpIHsKLSAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7Ci0gICAgICAgICAgICAgICAgaW5kZXgrKzsKLSAgICAgICAgICAgICAgICBpZiAoaW5kZXggPiA0NSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTZXJ2ZXIgd2FzIHNodXRkb3duLCBhcyB0aGUgYXN5bmMgcmVzcG9uc2UgdG9vayB0b28gbG9uZyB0byBjb21wbGV0ZSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoZmluaXNoICYmICF3YXNFcnJvcikgewotICAgICAgICAgICAgICAgICAgICBmYWlsKCJBbiBlcnJvciBvY2N1cnJlZCBkdXJpbmcgdGhlIHRyYW5zbWlzc2lvbiBvZiB0aGUgYXN5bmMgcmVxdWVzdCBidXQgdGhlIGNhbGxiYWNrIHdhcyBub3Qgbm90aWZpZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoc2VuZGVyICE9IG51bGwpCi0gICAgICAgICAgICAgICAgc2VuZGVyLmNsZWFudXAoKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9idWlsZGVyL1Vua25vd25Db250ZW50QnVpbGRlclRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9idWlsZGVyL1Vua25vd25Db250ZW50QnVpbGRlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjU1MzNiZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvYnVpbGRlci9Vbmtub3duQ29udGVudEJ1aWxkZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuYnVpbGRlcjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01Tb3VyY2VkRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQWJzdHJhY3RUZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmJ1aWxkZXIudW5rbm93bmNvbnRlbnQuVW5rbm93bkNvbnRlbnRPTURhdGFTb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0LlRyYW5zcG9ydFV0aWxzOwotCi0KLXB1YmxpYyBjbGFzcyBVbmtub3duQ29udGVudEJ1aWxkZXJUZXN0IGV4dGVuZHMgQWJzdHJhY3RUZXN0Q2FzZXsKLSAgICBwdWJsaWMgVW5rbm93bkNvbnRlbnRCdWlsZGVyVGVzdChTdHJpbmcgdGVzdE5hbWUpIHsKLQkJc3VwZXIodGVzdE5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNdWx0aXBhcnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vICAgICAgICBGaWxlIGZpbGUgPSBnZXRUZXN0UmVzb3VyY2VGaWxlKCJtaW1lX21lc3NhZ2UudHh0Iik7Ci0vLyAgICAgICAgRmlsZUlucHV0U3RyZWFtIGZpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSk7Ci0vLyAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ29udGV4dCA9IENvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeS5jcmVhdGVEZWZhdWx0Q29uZmlndXJhdGlvbkNvbnRleHQoKTsKLS8vICAgICAgICBBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlnID0gY29uZmlnQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpOwotLy8gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1jID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7Ci0vLyAgICAgICAgbWMuc2V0Q29uZmlndXJhdGlvbkNvbnRleHQoY29uZmlnQ29udGV4dCk7Ci0vLyAgICAgICAgYXhpc0NvbmZpZy5hZGRNZXNzYWdlQnVpbGRlcigibXVsdGlwYXJ0L3JlbGF0ZWQiLCBuZXcgTUlNRUJ1aWxkZXIoKSk7Ci0vLyAgICAgICAgYXhpc0NvbmZpZy5hZGRNZXNzYWdlQnVpbGRlcigibXVsdGlwYXJ0L21peGVkIiwgbmV3IE1JTUVCdWlsZGVyKCkpOwotLy8gICAgICAgIGF4aXNDb25maWcuYWRkTWVzc2FnZUJ1aWxkZXIoImFwcGxpY2F0aW9uL3NvYXAreG1sIiwgbmV3IFNPQVBCdWlsZGVyKCkpOwotLy8gICAgICAgIGF4aXNDb25maWcuYWRkTWVzc2FnZUJ1aWxkZXIoInRleHQveG1sIiwgbmV3IFNPQVBCdWlsZGVyKCkpOwotLy8gICAgICAgIGF4aXNDb25maWcuYWRkTWVzc2FnZUJ1aWxkZXIoImFwcGxpY2F0aW9uL3hvcCt4bWwiLCBuZXcgTVRPTUJ1aWxkZXIoKSk7Ci0vLyAgICAgICAgYXhpc0NvbmZpZy5hZGRNZXNzYWdlQnVpbGRlcigiYXBwbGljYXRpb24veG1sIiwgbmV3IEFwcGxpY2F0aW9uWE1MQnVpbGRlcigpKTsKLS8vICAgICAgICBheGlzQ29uZmlnLmFkZE1lc3NhZ2VCdWlsZGVyKCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiLAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhGb3JtVVJMRW5jb2RlZEJ1aWxkZXIoKSk7Ci0vLyAgICAgICAgYXhpc0NvbmZpZy5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uVVNFX0RFRkFVTFRfRkFMTEJBQ0tfQlVJTERFUiwgInRydWUiKTsKLS8vICAgICAgICBPTUVsZW1lbnQgZW52ZWxvcGUgPSBUcmFuc3BvcnRVdGlscy5jcmVhdGVTT0FQTWVzc2FnZShtYyxmaXMsIm11bHRpcGFydC9taXhlZDtib3VuZGFyeT0tLU1JTUVCb3VuZGFyeTI1OERFMkQxMDUyOThCNzU2RCIpOwotLy8gICAgICAgIAotLy8gICAgICAgIGFzc2VydFRydWUoZW52ZWxvcGUgIT0gbnVsbCk7Ci0vLyAgICAgICAgYXNzZXJ0VHJ1ZShlbnZlbG9wZSBpbnN0YW5jZW9mIFNPQVBFbnZlbG9wZSk7Ci0vLyAgICAgICAgZW52ZWxvcGUuYnVpbGRXaXRoQXR0YWNobWVudHMoKTsKLS8vICAgICAgICBtYy5hdHRhY2htZW50cy5nZXRBbGxDb250ZW50SURzKCk7Ci0vLyAgICAgICAgaW50IG1pbWVQYXJ0Q291bnQgPSBtYy5nZXRBdHRhY2htZW50TWFwKCkuZ2V0TWFwKCkuc2l6ZSgpOwotLy8gICAgICAgIGFzc2VydEVxdWFscygyLCBtaW1lUGFydENvdW50KTsKLSAgICB9Ci0JCi0JLyoqCi0JICogQSBidWlsZGVyIGlzIG5vdCBhZGRlZCBmb3IgdGhlIG11bHRpcGFydC9taXhlZCBhcyBpbiB0aGUgYWJvdmUgdGVzdC4KLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3ROb0J1aWxkZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgRmlsZSBmaWxlID0gZ2V0VGVzdFJlc291cmNlRmlsZSgibWltZV9tZXNzYWdlLnR4dCIpOwotICAgICAgICBNSU1FQnVpbGRlciBtaW1lQnVpbGRlciA9IG5ldyBNSU1FQnVpbGRlcigpOwotICAgICAgICBGaWxlSW5wdXRTdHJlYW0gZmlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKTsKLSAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ29udGV4dCA9IENvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeS5jcmVhdGVEZWZhdWx0Q29uZmlndXJhdGlvbkNvbnRleHQoKTsKLSAgICAgICAgQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZyA9IGNvbmZpZ0NvbnRleHQuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKTsKLSAgICAgICAgTWVzc2FnZUNvbnRleHQgbWMgPSBuZXcgTWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgbWMuc2V0Q29uZmlndXJhdGlvbkNvbnRleHQoY29uZmlnQ29udGV4dCk7Ci0gICAgICAgIGF4aXNDb25maWcuYWRkTWVzc2FnZUJ1aWxkZXIoIm11bHRpcGFydC9yZWxhdGVkIiwgbmV3IE1JTUVCdWlsZGVyKCkpOwotICAgICAgICBheGlzQ29uZmlnLmFkZE1lc3NhZ2VCdWlsZGVyKCJhcHBsaWNhdGlvbi9zb2FwK3htbCIsIG5ldyBTT0FQQnVpbGRlcigpKTsKLSAgICAgICAgYXhpc0NvbmZpZy5hZGRNZXNzYWdlQnVpbGRlcigidGV4dC94bWwiLCBuZXcgU09BUEJ1aWxkZXIoKSk7Ci0gICAgICAgIGF4aXNDb25maWcuYWRkTWVzc2FnZUJ1aWxkZXIoImFwcGxpY2F0aW9uL3hvcCt4bWwiLCBuZXcgTVRPTUJ1aWxkZXIoKSk7Ci0gICAgICAgIGF4aXNDb25maWcuYWRkTWVzc2FnZUJ1aWxkZXIoImFwcGxpY2F0aW9uL3htbCIsIG5ldyBBcHBsaWNhdGlvblhNTEJ1aWxkZXIoKSk7Ci0gICAgICAgIGF4aXNDb25maWcuYWRkTWVzc2FnZUJ1aWxkZXIoImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhGb3JtVVJMRW5jb2RlZEJ1aWxkZXIoKSk7Ci0gICAgICAgIGF4aXNDb25maWcuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5Db25maWd1cmF0aW9uLlVTRV9ERUZBVUxUX0ZBTExCQUNLX0JVSUxERVIsICJ0cnVlIik7Ci0gICAgICAgIE9NRWxlbWVudCBlbnZlbG9wZSA9IFRyYW5zcG9ydFV0aWxzLmNyZWF0ZVNPQVBNZXNzYWdlKG1jLGZpcywibXVsdGlwYXJ0L21peGVkO2JvdW5kYXJ5PS0tTUlNRUJvdW5kYXJ5MjU4REUyRDEwNTI5OEI3NTZEIik7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRUcnVlKGVudmVsb3BlICE9IG51bGwpOwotICAgICAgICBhc3NlcnRUcnVlKGVudmVsb3BlIGluc3RhbmNlb2YgU09BUEVudmVsb3BlKTsKLSAgICAgICAgT01FbGVtZW50IGZpcnN0RWxlbWVudCA9ICgoU09BUEVudmVsb3BlKWVudmVsb3BlKS5nZXRCb2R5KCkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCWFzc2VydFRydWUoZmlyc3RFbGVtZW50IGluc3RhbmNlb2YgT01Tb3VyY2VkRWxlbWVudCk7Ci0JCWFzc2VydFRydWUoKChPTVNvdXJjZWRFbGVtZW50KWZpcnN0RWxlbWVudCkuZ2V0RGF0YVNvdXJjZSgpIGluc3RhbmNlb2YgVW5rbm93bkNvbnRlbnRPTURhdGFTb3VyY2UpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9jb2RlZ2VuL0ludmFsaWRGYXVsdFdzZGxUZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvY29kZWdlbi9JbnZhbGlkRmF1bHRXc2RsVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWY5ZDVjLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9jb2RlZ2VuL0ludmFsaWRGYXVsdFdzZGxUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY29kZWdlbjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuV1NETDJDb2RlOwotCi1wdWJsaWMgY2xhc3MgSW52YWxpZEZhdWx0V3NkbFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgcHVibGljIHZvaWQgdGVzdEludmFpZFdzZGwoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTdHJpbmcgd3NkbHVyaSA9ICJ0ZXN0LXJlc291cmNlcy9JbnZhbGlkLndzZGwiOwotICAgICAgICAgICAgU3RyaW5nIGFyZ3NbXSA9IG5ldyBTdHJpbmdbXSB7ICItdXJpIiwgd3NkbHVyaSwgIi1vIiwgInRhcmdldC9pbnZhbGlkd3NkbG91dGxvY2F0aW9uIiB9OwotICAgICAgICAgICAgbmV3IFdTREwyQ29kZSgpLm1haW4oYXJncyk7Ci0gICAgICAgICAgICBmYWlsKCJUaGlzIG11c3QgZmFpbCB3aXRoIHRoZSBleGNldGlvbiA6IiArCi0gICAgICAgICAgICAgICAgICAgICJObyBlbGVtZW50IHJlZmVyZW5jZSBmb3VuZCBmb3IgdGhlIHBhcnQgaW4gZmF1bHQgbWVzc2FnZSAiICsKLSAgICAgICAgICAgICAgICAgICAgIkludmFsaWRJc2JuRmF1bHQuIEZhdWx0IG1lc3NhZ2UgcGFydCBzaG91bGQgYWx3YXlzIGJlIHJlZmVyICIgKwotICAgICAgICAgICAgICAgICAgICAidG8gYW4gZWxlbWVudC4iKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUoZS5nZXRDYXVzZSgpLmdldE1lc3NhZ2UoKS5zdGFydHNXaXRoKAotICAgICAgICAgICAgICAgICAgICAiUGFydCAnbWVzc2FnZScgb2YgZmF1bHQgbWVzc2FnZSAne2h0dHA6Ly93d3cuTW9uc29uLUhhZWZlbC5jb20vandzYm9vay9Cb29rUXVvdGV9SW52YWxpZElzYm5GYXVsdCciKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9MaWZlY3ljbGVUZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9MaWZlY3ljbGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiNDk2YTIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvTGlmZWN5Y2xlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmludGVncmF0aW9uLkxvY2FsVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LlNlcnZpY2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuc2VydmljZS5MaWZlY3ljbGU7Ci0KLXB1YmxpYyBjbGFzcyBMaWZlY3ljbGVUZXN0IGV4dGVuZHMgTG9jYWxUZXN0Q2FzZSB7Ci0gICAgc3RhdGljIHB1YmxpYyBjbGFzcyBTZXJ2aWNlIGltcGxlbWVudHMgTGlmZWN5Y2xlIHsKLSAgICAgICAgc3RhdGljIGJvb2xlYW4gaW5pdENhbGxlZCwgZGVzdHJveUNhbGxlZDsKLQotICAgICAgICBwdWJsaWMgdm9pZCBpbml0KFNlcnZpY2VDb250ZXh0IGNvbnRleHQpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICAgICAgaW5pdENhbGxlZCA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBkZXN0cm95KFNlcnZpY2VDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgICAgIGRlc3Ryb3lDYWxsZWQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNlcnZpY2VPYmplY3RMaWZlY3ljbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZGVwbG95Q2xhc3NBc1NlcnZpY2UoImxpZmVjeWNsZSIsIFNlcnZpY2UuY2xhc3MsIENvbnN0YW50cy5TQ09QRV9BUFBMSUNBVElPTik7Ci0gICAgICAgIGFzc2VydFRydWUoImluaXQoKSBub3QgY2FsbGVkISIsIFNlcnZpY2UuaW5pdENhbGxlZCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvVGFyZ2V0UmVzb2x2ZXJTZXJ2aWNlVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvVGFyZ2V0UmVzb2x2ZXJTZXJ2aWNlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Mjk4YTI0Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L1RhcmdldFJlc29sdmVyU2VydmljZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50LlNlcnZpY2VDbGllbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uV1NETDJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuRWNobzsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5NZXNzYWdlUmVjZWl2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pbnRlZ3JhdGlvbi5Mb2NhbFRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaW50ZWdyYXRpb24uVGVzdGluZ1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLlJhd1hNTElOT3V0TWVzc2FnZVJlY2VpdmVyOwotCi1wdWJsaWMgY2xhc3MgVGFyZ2V0UmVzb2x2ZXJTZXJ2aWNlVGVzdCBleHRlbmRzIExvY2FsVGVzdENhc2UgewotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAJc3VwZXIuc2V0VXAoKTsKLSAgICAJc2VydmVyQ29uZmlnLmFkZE1lc3NhZ2VSZWNlaXZlcihXU0RMMkNvbnN0YW50cy5NRVBfVVJJX0lOX09VVCwgbmV3IE1lc3NhZ2VSZWNlaXZlcigpewotCQkJcHVibGljIHZvaWQgcmVjZWl2ZShNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLQkJCQkvLyBTZXQgdGhlIHJlcGx5IHRvIG9uIHRoZSBzZXJ2ZXIgc2lkZSB0byB0ZXN0IHNlcnZlciBzaWRlCi0JCQkJLy8gdGFyZ2V0IHJlc29sdmVycwotCQkJCW1zZ0NvbnRleHQuc2V0UmVwbHlUbyhuZXcgRW5kcG9pbnRSZWZlcmVuY2UoCi0JICAgICAgICAgICAgImh0dHA6Ly93cy5hcGFjaGUub3JnL25ldy9hbm9ueW1vdXMvYWRkcmVzcyIpKTsKLQkJCSAgICBuZXcgUmF3WE1MSU5PdXRNZXNzYWdlUmVjZWl2ZXIoKS5yZWNlaXZlKG1zZ0NvbnRleHQpOwotCQkJfQotICAgIAl9KTsKLSAgICAJZGVwbG95Q2xhc3NBc1NlcnZpY2UoRWNoby5TRVJWSUNFX05BTUUsIEVjaG8uY2xhc3MpOwotICAgIAljbGllbnRDdHguZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5hZGRUYXJnZXRSZXNvbHZlcihuZXcgVGVzdFRhcmdldFJlc29sdmVyKCkpOwotICAgIAlzZXJ2ZXJDb25maWcuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5hZGRUYXJnZXRSZXNvbHZlcihuZXcgVGVzdFRhcmdldFJlc29sdmVyKCkpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0VGFyZ2V0UnNvbHZlcigpIHRocm93cyBFeGNlcHRpb24gewotICAgIAlTZXJ2aWNlQ2xpZW50IHNlbmRlciA9IGdldENsaWVudChFY2hvLlNFUlZJQ0VfTkFNRSwgRWNoby5FQ0hPX09NX0VMRU1FTlRfT1BfTkFNRSk7Ci0gICAgCVN0cmluZyBvbGRBZGRyZXNzID0gc2VuZGVyLmdldE9wdGlvbnMoKS5nZXRUbygpLmdldEFkZHJlc3MoKTsKLSAgICAJU3RyaW5nIG5ld0FkZHJlc3MgPSAidHJ0ZXN0IitvbGRBZGRyZXNzLnN1YnN0cmluZyg1KTsKLSAgICAJc2VuZGVyLmdldE9wdGlvbnMoKS5nZXRUbygpLnNldEFkZHJlc3MobmV3QWRkcmVzcyk7Ci0gICAgCU9NRWxlbWVudCByZXNwb25zZSA9IHNlbmRlci5zZW5kUmVjZWl2ZShUZXN0aW5nVXRpbHMuY3JlYXRlRHVtbXlPTUVsZW1lbnQoKSk7Ci0gICAgCVRlc3RpbmdVdGlscy5jb21wYXJlV2l0aENyZWF0ZWRPTUVsZW1lbnQocmVzcG9uc2UpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvVGVzdFRhcmdldFJlc29sdmVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9UZXN0VGFyZ2V0UmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjU2ODg0Ni4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9UZXN0VGFyZ2V0UmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkFkZHJlc3NpbmdDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5UYXJnZXRSZXNvbHZlcjsKLQotcHVibGljIGNsYXNzIFRlc3RUYXJnZXRSZXNvbHZlciBpbXBsZW1lbnRzIFRhcmdldFJlc29sdmVyIHsKLQotICAgIHB1YmxpYyB2b2lkIHJlc29sdmVUYXJnZXQoTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQpIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJyZXNvbHZlVGFyZ2V0OiIgKyBtZXNzYWdlQ29udGV4dC5nZXRUbygpLmdldEFkZHJlc3MoKSk7Ci0gICAgICAgIGlmIChtZXNzYWdlQ29udGV4dC5nZXRUbygpLmdldEFkZHJlc3MoKQotICAgICAgICAgICAgICAgIC5lcXVhbHMoImh0dHA6Ly93cy5hcGFjaGUub3JnL25ldy9hbm9ueW1vdXMvYWRkcmVzcyIpKSB7Ci0gICAgICAgICAgICBtZXNzYWdlQ29udGV4dC5nZXRUbygpLnNldEFkZHJlc3MoQWRkcmVzc2luZ0NvbnN0YW50cy5GaW5hbC5XU0FfQU5PTllNT1VTX1VSTCk7Ci0gICAgICAgIH0gZWxzZSBpZiAobWVzc2FnZUNvbnRleHQuZ2V0VG8oKS5nZXRBZGRyZXNzKCkuc3RhcnRzV2l0aCgidHJ0ZXN0Oi8vIikpIHsKLSAgICAgICAgICAgIG1lc3NhZ2VDb250ZXh0LmdldFRvKCkuc2V0QWRkcmVzcygKLSAgICAgICAgICAgICAgICAgICAgImxvY2FsIiArIG1lc3NhZ2VDb250ZXh0LmdldFRvKCkuZ2V0QWRkcmVzcygpLnN1YnN0cmluZyg2KSk7Ci0gICAgICAgIH0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJyZXNvbHZlVGFyZ2V0OiIgKyBtZXNzYWdlQ29udGV4dC5nZXRUbygpLmdldEFkZHJlc3MoKSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9UcmFuc3BvcnREZXBsb3ltZW50VGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvVHJhbnNwb3J0RGVwbG95bWVudFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTk4YWMyNy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9UcmFuc3BvcnREZXBsb3ltZW50VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkFic3RyYWN0VGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5UcmFuc3BvcnRPdXREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnBoYXNlcmVzb2x2ZXIuUGhhc2VFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLXB1YmxpYyBjbGFzcyBUcmFuc3BvcnREZXBsb3ltZW50VGVzdCBleHRlbmRzIEFic3RyYWN0VGVzdENhc2UgewotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBUcmFuc3BvcnREZXBsb3ltZW50VGVzdChTdHJpbmcgdGVzdE5hbWUpIHsKLSAgICAgICAgc3VwZXIodGVzdE5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RUcmFuc3BvcnRzKCkgdGhyb3dzIEF4aXNGYXVsdCwKLSAgICAgICAgICAgIFBoYXNlRXhjZXB0aW9uLAotICAgICAgICAgICAgRGVwbG95bWVudEV4Y2VwdGlvbiwKLSAgICAgICAgICAgIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyByZXBvc2l0b3J5TmFtZSA9IEFic3RyYWN0VGVzdENhc2UuYmFzZWRpciArICIvdGFyZ2V0L3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQiOwotICAgICAgICBGaWxlIHJlcG8gPSBuZXcgRmlsZShyZXBvc2l0b3J5TmFtZSk7Ci0gICAgICAgIFN0cmluZyB4bWxGaWxlID0gcmVwb3NpdG9yeU5hbWUgKyAiL3NlcnZlci10cmFuc3BvcnQueG1sIjsKLSAgICAgICAgRmlsZSB4bWwgPSBuZXcgRmlsZSh4bWxGaWxlKTsKLSAgICAgICAgRmlsZVN5c3RlbUNvbmZpZ3VyYXRvciBmc2MgPQotICAgICAgICAgICAgICAgIG5ldyBGaWxlU3lzdGVtQ29uZmlndXJhdG9yKHJlcG8uZ2V0QWJzb2x1dGVQYXRoKCksIHhtbC5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgICAgIEF4aXNDb25maWd1cmF0aW9uIGVyID0gZnNjLmdldEF4aXNDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgIFRyYW5zcG9ydE91dERlc2NyaXB0aW9uIHRyYW5zcG9ydDEgPSBlci5nZXRUcmFuc3BvcnRPdXQoImN1c3RvbSIpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHRyYW5zcG9ydDEpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L1dTREwxMVRvQXhpc1NlcnZpY2VCdWlsZGVyVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvV1NETDExVG9BeGlzU2VydmljZUJ1aWxkZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2OGQ3MzAuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvV1NETDExVG9BeGlzU2VydmljZUJ1aWxkZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5XU0RMMTFUb0FsbEF4aXNTZXJ2aWNlc0J1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0NvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmN1c3RvbW1vbmtleS54bWx1bml0LlhNTFRlc3RDYXNlOwotaW1wb3J0IG9yZy5jdXN0b21tb25rZXkueG1sdW5pdC5YTUxVbml0OwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKLQotLyoqCi0gKgotICovCi1wdWJsaWMgY2xhc3MgV1NETDExVG9BeGlzU2VydmljZUJ1aWxkZXJUZXN0IGV4dGVuZHMgWE1MVGVzdENhc2UgewotCi0gICAgcHJpdmF0ZSBTdHJpbmcgd3NkbExvY2F0aW9uID0gU3lzdGVtLmdldFByb3BlcnR5KCJiYXNlZGlyIiwgIi4iKSArICIvIiArICJ0ZXN0LXJlc291cmNlcy93c2RsL1ZlcnNpb24ud3NkbCI7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VmVyc2lvbigpIHsKLSAgICAgICAgWE1MVW5pdC5zZXRJZ25vcmVXaGl0ZXNwYWNlKHRydWUpOwotICAgICAgICBGaWxlIHRlc3RSZXNvdXJjZUZpbGUgPSBuZXcgRmlsZSh3c2RsTG9jYXRpb24pOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgV1NETDExVG9BbGxBeGlzU2VydmljZXNCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgV1NETDExVG9BbGxBeGlzU2VydmljZXNCdWlsZGVyKAotICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZUlucHV0U3RyZWFtKHRlc3RSZXNvdXJjZUZpbGUpKTsKLSAgICAgICAgICAgIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlID0gYnVpbGRlci5wb3B1bGF0ZVNlcnZpY2UoKTsKLSAgICAgICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQgPSBDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkuY3JlYXRlRGVmYXVsdENvbmZpZ3VyYXRpb25Db250ZXh0KCk7Ci0gICAgICAgICAgICBBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlnID0gY29uZmlnQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpOwotICAgICAgICAgICAgYXhpc0NvbmZpZy5hZGRTZXJ2aWNlKGF4aXNTZXJ2aWNlKTsKLSAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICAgICAgYXhpc1NlcnZpY2UucHJpbnRXU0RMKGJhb3MpOwotICAgICAgICAgICAgYXNzZXJ0WE1MRXF1YWwobmV3IEZpbGVSZWFkZXIodGVzdFJlc291cmNlRmlsZSksIG5ldyBTdHJpbmdSZWFkZXIobmV3IFN0cmluZyhiYW9zLnRvQnl0ZUFycmF5KCkpKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIGluIFdTREwgOiAiICsgdGVzdFJlc291cmNlRmlsZS5nZXROYW1lKCkpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFeGNlcHRpb246ICIgKyBlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgZmFpbCgiQ2F1Z2h0IGV4Y2VwdGlvbiAiICsgZS50b1N0cmluZygpKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIFhNTFVuaXQuc2V0SWdub3JlV2hpdGVzcGFjZShmYWxzZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9DYWxsVW5yZWdpc3RlcmVkU2VydmljZVRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvQ2FsbFVucmVnaXN0ZXJlZFNlcnZpY2VUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwN2YxYTkuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9DYWxsVW5yZWdpc3RlcmVkU2VydmljZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5lbmdpbmU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5TZXJ2aWNlQ2xpZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaW50ZWdyYXRpb24uTG9jYWxUZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmludGVncmF0aW9uLlRlc3RpbmdVdGlsczsKLQotcHVibGljIGNsYXNzIENhbGxVbnJlZ2lzdGVyZWRTZXJ2aWNlVGVzdCBleHRlbmRzIExvY2FsVGVzdENhc2UgewotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJZGVwbG95Q2xhc3NBc1NlcnZpY2UoRWNoby5TRVJWSUNFX05BTUUsIEVjaG8uY2xhc3MpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFY2hvWE1MU3luYygpIHRocm93cyBFeGNlcHRpb24gewotCQl0cnkgewotCQkJU2VydmljZUNsaWVudCBzZW5kZXIgPSBnZXRDbGllbnQoRWNoby5TRVJWSUNFX05BTUUgKyAiLWZhaWwiLCBFY2hvLkVDSE9fT01fRUxFTUVOVF9PUF9OQU1FKTsKLQkJCXNlbmRlci5zZW5kUmVjZWl2ZShUZXN0aW5nVXRpbHMuY3JlYXRlRHVtbXlPTUVsZW1lbnQoKSk7Ci0JCQlmYWlsKCJUaGUgdGVzdCBtdXN0IGZhaWwgZHVlIHRvIHdyb25nIHNlcnZpY2UgTmFtZSIpOwotCQl9IGNhdGNoIChBeGlzRmF1bHQgZSkgewotCQkJYXNzZXJ0VHJ1ZShlLmdldE1lc3NhZ2UoKS5pbmRleE9mKCJUaGUgc2VydmljZSBjYW5ub3QgYmUgZm91bmQgZm9yIHRoZSIpID49IDApOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9DaGFyYWN0ZXJzZXRFbmNvZGluZ1Rlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvQ2hhcmFjdGVyc2V0RW5jb2RpbmdUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiY2QyOTYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9DaGFyYWN0ZXJzZXRFbmNvZGluZ1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZW5naW5lOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01OYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuT3B0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5TZXJ2aWNlQ2xpZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUudXRpbC5UZXN0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaW50ZWdyYXRpb24uVGVzdGluZ1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaW50ZWdyYXRpb24uVXRpbFNlcnZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmludGVncmF0aW9uLlV0aWxTZXJ2ZXJCYXNlZFRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotLyoqIFRlc3RpbmcgY2hhcmFjdGVyIGVuY29kaW5nIHN1cHBvcnQgKi8KLXB1YmxpYyBjbGFzcyBDaGFyYWN0ZXJzZXRFbmNvZGluZ1Rlc3QgZXh0ZW5kcyBVdGlsU2VydmVyQmFzZWRUZXN0Q2FzZSBpbXBsZW1lbnRzIFRlc3RDb25zdGFudHMgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKENoYXJhY3RlcnNldEVuY29kaW5nVGVzdC5jbGFzcyk7Ci0KLSAgICBwcml2YXRlIEF4aXNTZXJ2aWNlIHNlcnZpY2U7Ci0KLSAgICBwdWJsaWMgQ2hhcmFjdGVyc2V0RW5jb2RpbmdUZXN0KFN0cmluZyBhcmcwKSB7Ci0gICAgICAgIHN1cGVyKGFyZzApOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgcmV0dXJuIGdldFRlc3RTZXR1cDIobmV3IFRlc3RTdWl0ZShDaGFyYWN0ZXJzZXRFbmNvZGluZ1Rlc3QuY2xhc3MpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXN0aW5nVXRpbHMucHJlZml4QmFzZURpcmVjdG9yeShDb25zdGFudHMuVEVTVElOR19QQVRIICsgImNodW5raW5nLWVuYWJsZWRSZXBvc2l0b3J5IikpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHNlcnZpY2UgPQotICAgICAgICAgICAgICAgIFV0aWxzLmNyZWF0ZVNpbXBsZVNlcnZpY2Uoc2VydmljZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFY2hvLmNsYXNzLmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbk5hbWUpOwotICAgICAgICBVdGlsU2VydmVyLmRlcGxveVNlcnZpY2Uoc2VydmljZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgVXRpbFNlcnZlci51bkRlcGxveVNlcnZpY2Uoc2VydmljZU5hbWUpOwotICAgICAgICBVdGlsU2VydmVyLnVuRGVwbG95Q2xpZW50U2VydmljZSgpOwotICAgIH0KLQotCi0gICAgcHJpdmF0ZSB2b2lkIHJ1blRlc3QoU3RyaW5nIHZhbHVlLCBTdHJpbmcgZXhwZWN0ZWQpIHsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgT01GYWN0b3J5IGZhYyA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpOwotICAgICAgICAgICAgT01OYW1lc3BhY2Ugb21OcyA9IGZhYy5jcmVhdGVPTU5hbWVzcGFjZSgiaHR0cDovL2xvY2FsaG9zdC9teSIsICJteSIpOwotICAgICAgICAgICAgT01FbGVtZW50IHBheWxvYWQgPSBmYWMuY3JlYXRlT01FbGVtZW50KCJlY2hvT01FbGVtZW50Iiwgb21Ocyk7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgdGV4dCA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoIlRleHQiLCBvbU5zKTsKLSAgICAgICAgICAgIHRleHQuYWRkQ2hpbGQoZmFjLmNyZWF0ZU9NVGV4dCh0ZXh0LCB2YWx1ZSkpOwotICAgICAgICAgICAgcGF5bG9hZC5hZGRDaGlsZCh0ZXh0KTsKLQotICAgICAgICAgICAgT3B0aW9ucyBvcHRpb25zID0gbmV3IE9wdGlvbnMoKTsKLSAgICAgICAgICAgIG9wdGlvbnMuc2V0UHJvcGVydHkoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uQ0hBUkFDVEVSX1NFVF9FTkNPRElORywgInV0Zi0xNiIpOwotCi0gICAgICAgICAgICBvcHRpb25zLnNldFRvKHRhcmdldEVQUik7Ci0gICAgICAgICAgICBvcHRpb25zLnNldFRyYW5zcG9ydEluUHJvdG9jb2woQ29uc3RhbnRzLlRSQU5TUE9SVF9IVFRQKTsKLQotICAgICAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ29udGV4dCA9Ci0gICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeS5jcmVhdGVDb25maWd1cmF0aW9uQ29udGV4dEZyb21GaWxlU3lzdGVtKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RpbmdVdGlscy5wcmVmaXhCYXNlRGlyZWN0b3J5KENvbnN0YW50cy5URVNUSU5HX1BBVEggKyAiY2h1bmtpbmctZW5hYmxlZFJlcG9zaXRvcnkiKSwgbnVsbCk7Ci0gICAgICAgICAgICBTZXJ2aWNlQ2xpZW50IHNlbmRlciA9IG5ldyBTZXJ2aWNlQ2xpZW50KGNvbmZpZ0NvbnRleHQsIG51bGwpOwotICAgICAgICAgICAgc2VuZGVyLnNldE9wdGlvbnMob3B0aW9ucyk7Ci0KLSAgICAgICAgICAgIE9NRWxlbWVudCByZXN1bHRFbGVtID0gc2VuZGVyLnNlbmRSZWNlaXZlKHBheWxvYWQpOwotCi0KLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoIlJlc3VsdCBpcyBudWxsIiwgcmVzdWx0RWxlbSk7Ci0gICAgICAgICAgICBTdHJpbmcgcmVzdWx0ID0gKChPTUVsZW1lbnQpcmVzdWx0RWxlbS5nZXRGaXJzdE9NQ2hpbGQoKSkuZ2V0VGV4dCgpOwotCi0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKCJSZXN1bHQgdmFsdWUgaXMgbnVsbCIsIHJlc3VsdCk7Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiRXhwZWN0ZWQgcmVzdWx0IG5vdCByZWNlaXZlZC4iLCBleHBlY3RlZCwgcmVzdWx0KTsKLSAgICAgICAgICAgIHNlbmRlci5jbGVhbnVwKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBlKSB7Ci0gICAgICAgICAgICBsb2cuZXJyb3IoZSwgZSk7Ci0gICAgICAgICAgICBhc3NlcnRGYWxzZSgiRmFpbHVyZSBpbiBwcm9jZXNzaW5nIiwgdHJ1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIHByaXZhdGUgdm9pZCBydW50ZXN0KFN0cmluZyB2YWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJ1blRlc3QodmFsdWUsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlU3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJ1bnRlc3QoImEgc2ltcGxlIHN0cmluZyIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpbmdXaXRoQXBvc3Ryb3BoZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgcnVudGVzdCgidGhpcyBpc24ndCBhIHNpbXBsZSBzdHJpbmciKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nV2l0aEVudGl0aWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJ1blRlc3QoIiZhbXA7Jmx0OyZndDsmYXBvczsmcXVvdDsiLCAiJmFtcDsmbHQ7Jmd0OyZhcG9zOyZxdW90OyIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpbmdXaXRoUmF3RW50aXRpZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgcnVuVGVzdCgiJjw+J1wiIiwgIiY8PidcIiIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpbmdXaXRoTGVhZGluZ0FuZFRyYWlsaW5nU3BhY2VzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJ1bnRlc3QoIiAgICAgICAgICBjZW50ZXJlZCAgICAgICAgICAiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0V2hpdGVzcGFjZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBydW50ZXN0KCIgXG4gXHQgIik7IC8vIG5vdGU6IFxyIGZhaWxzCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEZyZW5jaEFjY2VudHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgcnVudGVzdCgiXHUwMGUwXHUwMGUyXHUwMGU0XHUwMGU3XHUwMGU4XHUwMGU5XHUwMGVhXHUwMGViXHUwMGVlXHUwMGVmXHUwMGY0XHUwMGY2XHUwMGY5XHUwMGZiXHUwMGZjIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEdlcm1hblVtbGF1dHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgcnVudGVzdCgiIFNvbWUgdGV4dCBcdTAwZGYgd2l0aCBcdTAwZmMgc3BlY2lhbCBcdTAwZjYgY2hhcnMgXHUwMGU0LiIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RXZWxjb21lVW5pY29kZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyB3ZWxjb21lIGluIHNldmVyYWwgbGFuZ3VhZ2VzCi0gICAgICAgIHJ1bnRlc3QoCi0gICAgICAgICAgICAgICAgIkNoaW5lc2UgKHRyYWQuKSA6IFx1NmI2MVx1OGZjZSAgIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFdlbGNvbWVVbmljb2RlMigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyB3ZWxjb21lIGluIHNldmVyYWwgbGFuZ3VhZ2VzCi0gICAgICAgIHJ1bnRlc3QoCi0gICAgICAgICAgICAgICAgIkdyZWVrIDogXHUwM2JhXHUwM2IxXHUwM2JiXHUwM2NlXHUwM2MyIFx1MDNiZlx1MDNjMVx1MDNhZlx1MDNjM1x1MDNiMVx1MDNjNFx1MDNiNSIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RXZWxjb21lVW5pY29kZTMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gd2VsY29tZSBpbiBzZXZlcmFsIGxhbmd1YWdlcwotICAgICAgICBydW50ZXN0KAotICAgICAgICAgICAgICAgICJKYXBhbmVzZSA6IFx1MzA4OFx1MzA0Nlx1MzA1M1x1MzA1ZCIpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9Db21tb25zSFRUUEVjaG9SYXdYTUxUZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL0NvbW1vbnNIVFRQRWNob1Jhd1hNTFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzIwODIzOC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL0NvbW1vbnNIVFRQRWNob1Jhd1hNTFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZW5naW5lOwotCi0vL3RvZG8KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuT3B0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5TZXJ2aWNlQ2xpZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50LmFzeW5jLkFzeW5jUmVzdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50LmFzeW5jLkNhbGxiYWNrOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUudXRpbC5UZXN0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaW50ZWdyYXRpb24uVGVzdGluZ1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaW50ZWdyYXRpb24uVXRpbFNlcnZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmludGVncmF0aW9uLlV0aWxTZXJ2ZXJCYXNlZFRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotcHVibGljIGNsYXNzIENvbW1vbnNIVFRQRWNob1Jhd1hNTFRlc3QgZXh0ZW5kcyBVdGlsU2VydmVyQmFzZWRUZXN0Q2FzZSBpbXBsZW1lbnRzIFRlc3RDb25zdGFudHMgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKENvbW1vbnNIVFRQRWNob1Jhd1hNTFRlc3QuY2xhc3MpOwotCi0gICAgcHJpdmF0ZSBBeGlzU2VydmljZSBzZXJ2aWNlOwotCi0KLSAgICBwcml2YXRlIGJvb2xlYW4gZmluaXNoID0gZmFsc2U7Ci0KLSAgICBwdWJsaWMgQ29tbW9uc0hUVFBFY2hvUmF3WE1MVGVzdCgpIHsKLSAgICAgICAgc3VwZXIoQ29tbW9uc0hUVFBFY2hvUmF3WE1MVGVzdC5jbGFzcy5nZXROYW1lKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBDb21tb25zSFRUUEVjaG9SYXdYTUxUZXN0KFN0cmluZyB0ZXN0TmFtZSkgewotICAgICAgICBzdXBlcih0ZXN0TmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotICAgICAgICByZXR1cm4gZ2V0VGVzdFNldHVwKG5ldyBUZXN0U3VpdGUoQ29tbW9uc0hUVFBFY2hvUmF3WE1MVGVzdC5jbGFzcykpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHNlcnZpY2UgPQotICAgICAgICAgICAgICAgIFV0aWxzLmNyZWF0ZVNpbXBsZVNlcnZpY2Uoc2VydmljZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFY2hvLmNsYXNzLmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbk5hbWUpOwotICAgICAgICBVdGlsU2VydmVyLmRlcGxveVNlcnZpY2Uoc2VydmljZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgVXRpbFNlcnZlci51bkRlcGxveVNlcnZpY2Uoc2VydmljZU5hbWUpOwotICAgICAgICBVdGlsU2VydmVyLnVuRGVwbG95Q2xpZW50U2VydmljZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFY2hvWE1MQVN5bmMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgT01FbGVtZW50IHBheWxvYWQgPSBUZXN0aW5nVXRpbHMuY3JlYXRlRHVtbXlPTUVsZW1lbnQoKTsKLQotICAgICAgICBPcHRpb25zIG9wdGlvbnMgPSBuZXcgT3B0aW9ucygpOwotICAgICAgICBvcHRpb25zLnNldFRvKHRhcmdldEVQUik7Ci0gICAgICAgIG9wdGlvbnMuc2V0VHJhbnNwb3J0SW5Qcm90b2NvbChDb25zdGFudHMuVFJBTlNQT1JUX0hUVFApOwotCi0gICAgICAgIENhbGxiYWNrIGNhbGxiYWNrID0gbmV3IENhbGxiYWNrKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgb25Db21wbGV0ZShBc3luY1Jlc3VsdCByZXN1bHQpIHsKLSAgICAgICAgICAgICAgICBUZXN0aW5nVXRpbHMuY29tcGFyZVdpdGhDcmVhdGVkT01FbGVtZW50KAotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmdldFJlc3BvbnNlRW52ZWxvcGUoKS5nZXRCb2R5KCkuZ2V0Rmlyc3RFbGVtZW50KCkpOwotICAgICAgICAgICAgICAgIGZpbmlzaCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uRXJyb3IoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBsb2cuaW5mbyhlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgZmluaXNoID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLQotICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0ID0KLSAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkuY3JlYXRlQ29uZmlndXJhdGlvbkNvbnRleHRGcm9tRmlsZVN5c3RlbSgKLSAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RpbmdVdGlscy5wcmVmaXhCYXNlRGlyZWN0b3J5KENvbnN0YW50cy5URVNUSU5HX1BBVEggKyAiY29tbW9ucy1odHRwLWVuYWJsZWRSZXBvc2l0b3J5IiksIG51bGwpOwotICAgICAgICBTZXJ2aWNlQ2xpZW50IHNlbmRlciA9IG5ldyBTZXJ2aWNlQ2xpZW50KGNvbmZpZ0NvbnRleHQsIG51bGwpOwotICAgICAgICBzZW5kZXIuc2V0T3B0aW9ucyhvcHRpb25zKTsKLQotICAgICAgICBzZW5kZXIuc2VuZFJlY2VpdmVOb25CbG9ja2luZyhwYXlsb2FkLCBjYWxsYmFjayk7Ci0KLSAgICAgICAgaW50IGluZGV4ID0gMDsKLSAgICAgICAgd2hpbGUgKCFmaW5pc2gpIHsKLSAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsKLSAgICAgICAgICAgIGluZGV4Kys7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPiAxMCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoCi0gICAgICAgICAgICAgICAgICAgICAgICAiU2VydmVyIHdhcyBzaHV0ZG93biBhcyB0aGUgYXN5bmMgcmVzcG9uc2UgdGFrZSB0b28gbG9uZyB0byBjb21wbGV0ZSIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0vLyAgICAgICAgY2FsbC5jbG9zZSgpOwotLy8KLSAgICAgICAgc2VuZGVyLmNsZWFudXAoKTsKLSAgICAgICAgbG9nLmluZm8oInNlbmQgdGhlIHJlcWVzdCIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFY2hvWE1MU3luYygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBPTUVsZW1lbnQgcGF5bG9hZCA9IFRlc3RpbmdVdGlscy5jcmVhdGVEdW1teU9NRWxlbWVudCgpOwotICAgICAgICBPcHRpb25zIG9wdGlvbnMgPSBuZXcgT3B0aW9ucygpOwotICAgICAgICBvcHRpb25zLnNldFRvKHRhcmdldEVQUik7Ci0gICAgICAgIG9wdGlvbnMuc2V0VHJhbnNwb3J0SW5Qcm90b2NvbChDb25zdGFudHMuVFJBTlNQT1JUX0hUVFApOwotICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0ID0KLSAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkuY3JlYXRlQ29uZmlndXJhdGlvbkNvbnRleHRGcm9tRmlsZVN5c3RlbSgKLSAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RpbmdVdGlscy5wcmVmaXhCYXNlRGlyZWN0b3J5KENvbnN0YW50cy5URVNUSU5HX1BBVEggKyAiY29tbW9ucy1odHRwLWVuYWJsZWRSZXBvc2l0b3J5IiksIG51bGwpOwotICAgICAgICBTZXJ2aWNlQ2xpZW50IHNlbmRlciA9IG5ldyBTZXJ2aWNlQ2xpZW50KGNvbmZpZ0NvbnRleHQsIG51bGwpOwotICAgICAgICBzZW5kZXIuc2V0T3B0aW9ucyhvcHRpb25zKTsKLQotICAgICAgICBPTUVsZW1lbnQgcmVzdWx0ID0gc2VuZGVyLnNlbmRSZWNlaXZlKHBheWxvYWQpOwotCi0gICAgICAgIFRlc3RpbmdVdGlscy5jb21wYXJlV2l0aENyZWF0ZWRPTUVsZW1lbnQocmVzdWx0KTsKLSAgICAgICAgc2VuZGVyLmNsZWFudXAoKTsKLS8vICAgICAgICBjYWxsLmNsb3NlKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL0VjaG8uamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvRWNoby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWNkYWM5Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvRWNoby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01UZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgRWNobyB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coRWNoby5jbGFzcyk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVklDRV9OQU1FID0gIkVjaG9YTUxTZXJ2aWNlIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFQ0hPX09NX0VMRU1FTlRfT1BfTkFNRSA9ICJlY2hvT01FbGVtZW50IjsKLSAgICAKLSAgICBwdWJsaWMgRWNobygpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBlY2hvVm9pZCgpIHsKLSAgICAgICAgbG9nLmluZm8oImVjaG8gU2VydmljZSBDYWxsZWQiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBlY2hvT01FbGVtZW50Tm9SZXNwb25zZShPTUVsZW1lbnQgb21FbGUpIHsKLSAgICAgICAgbG9nLmluZm8oImVjaG9PTUVsZW1lbnROb1Jlc3BvbnNlIHNlcnZpY2UgY2FsbGVkLiIpOwotICAgIH0KLQotICAgIHB1YmxpYyBPTUVsZW1lbnQgZWNob09NRWxlbWVudChPTUVsZW1lbnQgb21FbGUpIHsKLSAgICAgICAgb21FbGUuYnVpbGRXaXRoQXR0YWNobWVudHMoKTsKLSAgICAgICAgb21FbGUuc2V0TG9jYWxOYW1lKG9tRWxlLmdldExvY2FsTmFtZSgpICsgIlJlc3BvbnNlIik7Ci0gICAgICAgIGlmIChvbUVsZS5nZXRGaXJzdEVsZW1lbnQoKS5nZXRUZXh0KCkudHJpbSgpLnN0YXJ0c1dpdGgoImZhdWx0IikpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJmYXVsdCBzdHJpbmcgZm91bmQgaW4gZWNob09NRWxlbWVudCIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBvbUVsZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT01FbGVtZW50IGVjaG9PTShPTUVsZW1lbnQgb21FbGUpIHsKLSAgICAgICAgcmV0dXJuIG9tRWxlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZWNob1N0cmluZyhTdHJpbmcgaW4pIHsKLSAgICAgICAgcmV0dXJuIGluOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZWNob0ludChpbnQgaW4pIHsKLSAgICAgICAgcmV0dXJuIGluOwotICAgIH0KLQotICAgIHB1YmxpYyBPTUVsZW1lbnQgZWNob01UT010b0Jhc2U2NChPTUVsZW1lbnQgb21FbGUpIHsKLSAgICAgICAgT01UZXh0IG9tVGV4dCA9IChPTVRleHQpKG9tRWxlLmdldEZpcnN0RWxlbWVudCgpKS5nZXRGaXJzdE9NQ2hpbGQoKTsKLSAgICAgICAgb21UZXh0LnNldE9wdGltaXplKGZhbHNlKTsKLSAgICAgICAgcmV0dXJuIG9tRWxlOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL0VjaG9SYXdSdW50aW1lUHJveHlUZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL0VjaG9SYXdSdW50aW1lUHJveHlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1OWU4YjcuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9FY2hvUmF3UnVudGltZVByb3h5VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5lbmdpbmU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5PcHRpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50LlNlcnZpY2VDbGllbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmludGVncmF0aW9uLlRlc3RpbmdVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmludGVncmF0aW9uLlV0aWxTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pbnRlZ3JhdGlvbi5VdGlsU2VydmVyQmFzZWRUZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkhUVFBDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5IdHRwVHJhbnNwb3J0UHJvcGVydGllczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuVXRpbHM7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1wdWJsaWMgY2xhc3MgRWNob1Jhd1J1bnRpbWVQcm94eVRlc3QgZXh0ZW5kcyBVdGlsU2VydmVyQmFzZWRUZXN0Q2FzZSB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBFbmRwb2ludFJlZmVyZW5jZSB0YXJnZXRFUFIgPSBuZXcgRW5kcG9pbnRSZWZlcmVuY2UoCi0gICAgICAgICAgICAiaHR0cDovL2xvY2FsaG9zdDo1NTU1IgotICAgICAgICAgICAgICAgICAgICArICIvYXhpczIvc2VydmljZXMvRWNob1hNTFNlcnZpY2UvZWNob09NRWxlbWVudCIpOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBzZXJ2aWNlTmFtZSA9IG5ldyBRTmFtZSgiRWNob1hNTFNlcnZpY2UiKTsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgb3BlcmF0aW9uTmFtZSA9IG5ldyBRTmFtZSgiZWNob09NRWxlbWVudCIpOwotCi0KLSAgICBwdWJsaWMgRWNob1Jhd1J1bnRpbWVQcm94eVRlc3QoKSB7Ci0gICAgICAgIHN1cGVyKEVjaG9SYXdSdW50aW1lUHJveHlUZXN0LmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIEVjaG9SYXdSdW50aW1lUHJveHlUZXN0KFN0cmluZyB0ZXN0TmFtZSkgewotICAgICAgICBzdXBlcih0ZXN0TmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotICAgICAgICByZXR1cm4gZ2V0VGVzdFNldHVwKG5ldyBUZXN0U3VpdGUoRWNob1Jhd1J1bnRpbWVQcm94eVRlc3QuY2xhc3MpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBBeGlzU2VydmljZSBzZXJ2aWNlID0KLSAgICAgICAgICAgICAgICBVdGlscy5jcmVhdGVTaW1wbGVTZXJ2aWNlKHNlcnZpY2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWNoby5jbGFzcy5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25OYW1lKTsKLSAgICAgICAgVXRpbFNlcnZlci5kZXBsb3lTZXJ2aWNlKHNlcnZpY2UpOwotCi0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBVdGlsU2VydmVyLnVuRGVwbG95U2VydmljZShzZXJ2aWNlTmFtZSk7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RWNob1hNTFN5bmMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICBPTUVsZW1lbnQgcGF5bG9hZCA9IFRlc3RpbmdVdGlscy5jcmVhdGVEdW1teU9NRWxlbWVudCgpOwotICAgICAgICAvKioKLSAgICAgICAgICogUHJveHkgc2V0dGluZyBpbiBydW50aW1lCi0gICAgICAgICAqLwotICAgICAgICBIdHRwVHJhbnNwb3J0UHJvcGVydGllcy5Qcm94eVByb3BlcnRpZXMgcHJveHlwcm9wZXJ0aWVzID0KLSAgICAgICAgICAgICAgICBuZXcgSHR0cFRyYW5zcG9ydFByb3BlcnRpZXMuUHJveHlQcm9wZXJ0aWVzKCk7Ci0gICAgICAgIHByb3h5cHJvcGVydGllcy5zZXRQcm94eU5hbWUoImxvY2FsaG9zdCIpOwotICAgICAgICBwcm94eXByb3BlcnRpZXMuc2V0UHJveHlQb3J0KDU1NTUpOwotICAgICAgICBwcm94eXByb3BlcnRpZXMuc2V0RG9tYWluKCJhbm9ueW1vdXMiKTsKLSAgICAgICAgcHJveHlwcm9wZXJ0aWVzLnNldFBhc3NXb3JkKCJhbm9ueW1vdXMiKTsKLSAgICAgICAgcHJveHlwcm9wZXJ0aWVzLnNldFVzZXJOYW1lKCJhbm9ueW1vdXMiKTsKLQotICAgICAgICBPcHRpb25zIG9wdGlvbnMgPSBuZXcgT3B0aW9ucygpOwotICAgICAgICBvcHRpb25zLnNldFByb3BlcnR5KEhUVFBDb25zdGFudHMuUFJPWFksIHByb3h5cHJvcGVydGllcyk7Ci0gICAgICAgIG9wdGlvbnMuc2V0VG8odGFyZ2V0RVBSKTsKLSAgICAgICAgb3B0aW9ucy5zZXRUcmFuc3BvcnRJblByb3RvY29sKENvbnN0YW50cy5UUkFOU1BPUlRfSFRUUCk7Ci0gICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQgPQotICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeS5jcmVhdGVDb25maWd1cmF0aW9uQ29udGV4dEZyb21GaWxlU3lzdGVtKAotICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCk7Ci0gICAgICAgIFNlcnZpY2VDbGllbnQgc2VuZGVyID0gbmV3IFNlcnZpY2VDbGllbnQoY29uZmlnQ29udGV4dCwgbnVsbCk7Ci0gICAgICAgIHNlbmRlci5zZXRPcHRpb25zKG9wdGlvbnMpOwotCi0gICAgICAgIE9NRWxlbWVudCByZXN1bHQgPSBzZW5kZXIuc2VuZFJlY2VpdmUocGF5bG9hZCk7Ci0KLSAgICAgICAgVGVzdGluZ1V0aWxzLmNvbXBhcmVXaXRoQ3JlYXRlZE9NRWxlbWVudChyZXN1bHQpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvRWNob1Jhd1hNTENodW5rZWRUZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL0VjaG9SYXdYTUxDaHVua2VkVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2JkMjEyLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvRWNob1Jhd1hNTENodW5rZWRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZW5naW5lOwotCi0vL3RvZG8KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuT3B0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5TZXJ2aWNlQ2xpZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUudXRpbC5UZXN0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaW50ZWdyYXRpb24uVGVzdGluZ1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaW50ZWdyYXRpb24uVXRpbFNlcnZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmludGVncmF0aW9uLlV0aWxTZXJ2ZXJCYXNlZFRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5VdGlsczsKLQotcHVibGljIGNsYXNzIEVjaG9SYXdYTUxDaHVua2VkVGVzdCBleHRlbmRzIFV0aWxTZXJ2ZXJCYXNlZFRlc3RDYXNlIGltcGxlbWVudHMgVGVzdENvbnN0YW50cyB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xJRU5UX0hPTUUgPSBUZXN0aW5nVXRpbHMucHJlZml4QmFzZURpcmVjdG9yeShDb25zdGFudHMuVEVTVElOR19QQVRIICsgImNodW5raW5nLWVuYWJsZWRSZXBvc2l0b3J5Iik7Ci0KLSAgICBwdWJsaWMgRWNob1Jhd1hNTENodW5rZWRUZXN0KCkgewotICAgICAgICBzdXBlcihFY2hvUmF3WE1MQ2h1bmtlZFRlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRWNob1Jhd1hNTENodW5rZWRUZXN0KFN0cmluZyB0ZXN0TmFtZSkgewotICAgICAgICBzdXBlcih0ZXN0TmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotICAgICAgICByZXR1cm4gZ2V0VGVzdFNldHVwMihuZXcgVGVzdFN1aXRlKEVjaG9SYXdYTUxDaHVua2VkVGVzdC5jbGFzcyksIENMSUVOVF9IT01FKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBBeGlzU2VydmljZSBzZXJ2aWNlID0gVXRpbHMuY3JlYXRlU2ltcGxlU2VydmljZShzZXJ2aWNlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWNoby5jbGFzcy5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbk5hbWUpOwotICAgICAgICBVdGlsU2VydmVyLmRlcGxveVNlcnZpY2Uoc2VydmljZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgVXRpbFNlcnZlci51bkRlcGxveVNlcnZpY2Uoc2VydmljZU5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFY2hvWE1MU3luYygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBPTUVsZW1lbnQgcGF5bG9hZCA9IFRlc3RpbmdVdGlscy5jcmVhdGVEdW1teU9NRWxlbWVudCgpOwotCi0gICAgICAgIE9wdGlvbnMgY2xpZW50T3B0aW9ucyA9IG5ldyBPcHRpb25zKCk7Ci0gICAgICAgIGNsaWVudE9wdGlvbnMuc2V0VHJhbnNwb3J0SW5Qcm90b2NvbChDb25zdGFudHMuVFJBTlNQT1JUX0hUVFApOwotCi0gICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQgPQotICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeQotICAgICAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZUNvbmZpZ3VyYXRpb25Db250ZXh0RnJvbUZpbGVTeXN0ZW0oQ0xJRU5UX0hPTUUsIG51bGwpOwotICAgICAgICBTZXJ2aWNlQ2xpZW50IHNlbmRlciA9IG5ldyBTZXJ2aWNlQ2xpZW50KGNvbmZpZ0NvbnRleHQsIG51bGwpOwotICAgICAgICBzZW5kZXIuc2V0T3B0aW9ucyhjbGllbnRPcHRpb25zKTsKLSAgICAgICAgY2xpZW50T3B0aW9ucy5zZXRUbyh0YXJnZXRFUFIpOwotCi0gICAgICAgIE9NRWxlbWVudCByZXN1bHQgPSBzZW5kZXIuc2VuZFJlY2VpdmUocGF5bG9hZCk7Ci0KLQotICAgICAgICBUZXN0aW5nVXRpbHMuY29tcGFyZVdpdGhDcmVhdGVkT01FbGVtZW50KHJlc3VsdCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9FY2hvUmF3WE1MTXVsdGlwbGVBU3luY1Rlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvRWNob1Jhd1hNTE11bHRpcGxlQVN5bmNUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5NzcyZWUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9FY2hvUmF3WE1MTXVsdGlwbGVBU3luY1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZW5naW5lOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5PcHRpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50LlNlcnZpY2VDbGllbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuYXN5bmMuQXN5bmNSZXN1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuYXN5bmMuQ2FsbGJhY2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5TZXJ2aWNlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLnV0aWwuVGVzdENvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmludGVncmF0aW9uLlRlc3RpbmdVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmludGVncmF0aW9uLlV0aWxTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pbnRlZ3JhdGlvbi5VdGlsU2VydmVyQmFzZWRUZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi0KLXB1YmxpYyBjbGFzcyBFY2hvUmF3WE1MTXVsdGlwbGVBU3luY1Rlc3QgZXh0ZW5kcyBVdGlsU2VydmVyQmFzZWRUZXN0Q2FzZSBpbXBsZW1lbnRzIFRlc3RDb25zdGFudHMgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEVjaG9SYXdYTUxNdWx0aXBsZUFTeW5jVGVzdC5jbGFzcyk7Ci0gICAgcHJvdGVjdGVkIFFOYW1lIHRyYW5zcG9ydE5hbWUgPSBuZXcgUU5hbWUoImh0dHA6Ly9sb2NhbGhvc3QvbXkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOdWxsVHJhbnNwb3J0Iik7Ci0KLSAgICBwcm90ZWN0ZWQgQXhpc0NvbmZpZ3VyYXRpb24gZW5naW5lUmVnaXN0cnk7Ci0gICAgcHJvdGVjdGVkIE1lc3NhZ2VDb250ZXh0IG1jOwotICAgIHByb3RlY3RlZCBTZXJ2aWNlQ29udGV4dCBzZXJ2aWNlQ29udGV4dDsKLSAgICBwcm90ZWN0ZWQgQXhpc1NlcnZpY2Ugc2VydmljZTsKLQotICAgIHByb3RlY3RlZCBib29sZWFuIGZpbmlzaCA9IGZhbHNlOwotCi0gICAgcHVibGljIEVjaG9SYXdYTUxNdWx0aXBsZUFTeW5jVGVzdCgpIHsKLSAgICAgICAgc3VwZXIoRWNob1Jhd1hNTFRlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRWNob1Jhd1hNTE11bHRpcGxlQVN5bmNUZXN0KFN0cmluZyB0ZXN0TmFtZSkgewotICAgICAgICBzdXBlcih0ZXN0TmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotICAgICAgICByZXR1cm4gZ2V0VGVzdFNldHVwKG5ldyBUZXN0U3VpdGUoRWNob1Jhd1hNTE11bHRpcGxlQVN5bmNUZXN0LmNsYXNzKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc2VydmljZSA9Ci0gICAgICAgICAgICAgICAgVXRpbHMuY3JlYXRlU2ltcGxlU2VydmljZShzZXJ2aWNlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVjaG8uY2xhc3MuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uTmFtZSk7Ci0gICAgICAgIFV0aWxTZXJ2ZXIuZGVwbG95U2VydmljZShzZXJ2aWNlKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBVdGlsU2VydmVyLnVuRGVwbG95U2VydmljZShzZXJ2aWNlTmFtZSk7Ci0gICAgICAgIFV0aWxTZXJ2ZXIudW5EZXBsb3lDbGllbnRTZXJ2aWNlKCk7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RWNob1hNTE11bHRpcGxlQVN5bmMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgT01FbGVtZW50IHBheWxvYWQgPSBUZXN0aW5nVXRpbHMuY3JlYXRlRHVtbXlPTUVsZW1lbnQoKTsKLSAgICAgICAgT3B0aW9ucyBvcHRpb25zID0gbmV3IE9wdGlvbnMoKTsKLSAgICAgICAgb3B0aW9ucy5zZXRUcmFuc3BvcnRJblByb3RvY29sKENvbnN0YW50cy5UUkFOU1BPUlRfSFRUUCk7Ci0gICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQgPQotICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeS5jcmVhdGVDb25maWd1cmF0aW9uQ29udGV4dEZyb21GaWxlU3lzdGVtKAotICAgICAgICAgICAgICAgICAgICAgICAgVGVzdGluZ1V0aWxzLnByZWZpeEJhc2VEaXJlY3RvcnkoInRhcmdldC90ZXN0LXJlc291cmNlcy9pbnRlZ3JhdGlvblJlcG8iKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RpbmdVdGlscy5wcmVmaXhCYXNlRGlyZWN0b3J5KCJ0YXJnZXQvdGVzdC1yZXNvdXJjZXMvaW50ZWdyYXRpb25SZXBvL2NvbmYvYXhpczIueG1sIikpOwotICAgICAgICBTZXJ2aWNlQ2xpZW50IHNlbmRlciA9IG5ldyBTZXJ2aWNlQ2xpZW50KGNvbmZpZ0NvbnRleHQsIG51bGwpOwotICAgICAgICBzZW5kZXIuc2V0T3B0aW9ucyhvcHRpb25zKTsKLSAgICAgICAgb3B0aW9ucy5zZXRBY3Rpb24oInVybjplY2hvT01FbGVtZW50Iik7Ci0gICAgICAgIG9wdGlvbnMuc2V0VG8odGFyZ2V0RVBSKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1OyBpKyspIHsKLSAgICAgICAgICAgIENhbGxiYWNrIGNhbGxiYWNrID0gbmV3IENhbGxiYWNrKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ29tcGxldGUoQXN5bmNSZXN1bHQgcmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgICAgIFRlc3RpbmdVdGlscy5jb21wYXJlV2l0aENyZWF0ZWRPTUVsZW1lbnQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmdldFJlc3BvbnNlRW52ZWxvcGUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEJvZHkoKS5nZXRGaXJzdEVsZW1lbnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmlzaCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25FcnJvcihFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuaW5mbyhlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmlzaCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLSAgICAgICAgICAgIHNlbmRlci5zZW5kUmVjZWl2ZU5vbkJsb2NraW5nKHBheWxvYWQsIGNhbGxiYWNrKTsKLSAgICAgICAgICAgIGludCBpbmRleCA9IDA7Ci0gICAgICAgICAgICB3aGlsZSAoIWZpbmlzaCkgewotICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsKLSAgICAgICAgICAgICAgICBpbmRleCsrOwotICAgICAgICAgICAgICAgIGlmIChpbmRleCA+IDEwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNlcnZlciB3YXMgc2h1dGRvd24gYXMgdGhlIGFzeW5jIHJlc3BvbnNlIHRha2UgdG9vIGxvbmcgdG8gY29tcGxldGUiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgc2VuZGVyLmNsZWFudXAoKTsKLSAgICAgICAgY29uZmlnQ29udGV4dC50ZXJtaW5hdGUoKTsKLSAgICAgICAgbG9nLmluZm8oInNlbmQgdGhlIHJlcXVlc3QiKTsKLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFY2hvWE1MTXVsdGlwbGVEdWVsQVN5bmMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgT01FbGVtZW50IHBheWxvYWQgPSBUZXN0aW5nVXRpbHMuY3JlYXRlRHVtbXlPTUVsZW1lbnQoKTsKLQotICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0ID0KLSAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkuY3JlYXRlQ29uZmlndXJhdGlvbkNvbnRleHRGcm9tRmlsZVN5c3RlbSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQvdGVzdC1yZXNvdXJjZXMvaW50ZWdyYXRpb25SZXBvIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQvdGVzdC1yZXNvdXJjZXMvaW50ZWdyYXRpb25SZXBvL2NvbmYvYXhpczIueG1sIik7Ci0gICAgICAgIFNlcnZpY2VDbGllbnQgc2VuZGVyID0gbmV3IFNlcnZpY2VDbGllbnQoY29uZmlnQ29udGV4dCwgbnVsbCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNTsgaSsrKSB7Ci0gICAgICAgICAgICBPcHRpb25zIG9wdGlvbnMgPSBuZXcgT3B0aW9ucygpOwotICAgICAgICAgICAgb3B0aW9ucy5zZXRBY3Rpb24oInVybjplY2hvT01FbGVtZW50Iik7Ci0gICAgICAgICAgICBvcHRpb25zLnNldFRyYW5zcG9ydEluUHJvdG9jb2woQ29uc3RhbnRzLlRSQU5TUE9SVF9IVFRQKTsKLSAgICAgICAgICAgIG9wdGlvbnMuc2V0VXNlU2VwYXJhdGVMaXN0ZW5lcih0cnVlKTsKLSAgICAgICAgICAgIG9wdGlvbnMuc2V0QWN0aW9uKENvbnN0YW50cy5BWElTMl9OQU1FU1BBQ0VfVVJJICsgIi8iICsgb3BlcmF0aW9uTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0KLQotICAgICAgICAgICAgQ2FsbGJhY2sgY2FsbGJhY2sgPSBuZXcgQ2FsbGJhY2soKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25Db21wbGV0ZShBc3luY1Jlc3VsdCByZXN1bHQpIHsKLSAgICAgICAgICAgICAgICAgICAgVGVzdGluZ1V0aWxzLmNvbXBhcmVXaXRoQ3JlYXRlZE9NRWxlbWVudCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuZ2V0UmVzcG9uc2VFbnZlbG9wZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Qm9keSgpLmdldEZpcnN0RWxlbWVudCgpKTsKLSAgICAgICAgICAgICAgICAgICAgZmluaXNoID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkVycm9yKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5pbmZvKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgZmluaXNoID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotCi0gICAgICAgICAgICBzZW5kZXIuc2V0T3B0aW9ucyhvcHRpb25zKTsKLSAgICAgICAgICAgIG9wdGlvbnMuc2V0VG8odGFyZ2V0RVBSKTsKLQotICAgICAgICAgICAgc2VuZGVyLnNlbmRSZWNlaXZlTm9uQmxvY2tpbmcocGF5bG9hZCwgY2FsbGJhY2spOwotCi0gICAgICAgICAgICBpbnQgaW5kZXggPSAwOwotICAgICAgICAgICAgd2hpbGUgKCFmaW5pc2gpIHsKLSAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7Ci0gICAgICAgICAgICAgICAgaW5kZXgrKzsKLSAgICAgICAgICAgICAgICBpZiAoaW5kZXggPiAxMCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTZXJ2ZXIgaXMgc2h1dGRvd24gYXMgdGhlIEFzeW5jIHJlc3BvbnNlIHRha2UgdG9vIGxvbmdzIHRpbWUiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgc2VuZGVyLmNsZWFudXAoKTsKLSAgICAgICAgY29uZmlnQ29udGV4dC50ZXJtaW5hdGUoKTsKLSAgICAgICAgbG9nLmluZm8oInNlbmQgdGhlIHJlcXVlc3QiKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL0VjaG9SYXdYTUxNdWx0aXBsZVN5bmNUZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL0VjaG9SYXdYTUxNdWx0aXBsZVN5bmNUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiMzYxYTEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9FY2hvUmF3WE1MTXVsdGlwbGVTeW5jVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5lbmdpbmU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50Lk9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuU2VydmljZUNsaWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LlNlcnZpY2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUudXRpbC5UZXN0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaW50ZWdyYXRpb24uVGVzdGluZ1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaW50ZWdyYXRpb24uVXRpbFNlcnZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmludGVncmF0aW9uLlV0aWxTZXJ2ZXJCYXNlZFRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLQotcHVibGljIGNsYXNzIEVjaG9SYXdYTUxNdWx0aXBsZVN5bmNUZXN0IGV4dGVuZHMgVXRpbFNlcnZlckJhc2VkVGVzdENhc2UgaW1wbGVtZW50cyBUZXN0Q29uc3RhbnRzIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhFY2hvUmF3WE1MTXVsdGlwbGVTeW5jVGVzdC5jbGFzcyk7Ci0gICAgcHJvdGVjdGVkIFFOYW1lIHRyYW5zcG9ydE5hbWUgPSBuZXcgUU5hbWUoImh0dHA6Ly9sb2NhbGhvc3QvbXkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOdWxsVHJhbnNwb3J0Iik7Ci0KLSAgICBwcm90ZWN0ZWQgQXhpc0NvbmZpZ3VyYXRpb24gZW5naW5lUmVnaXN0cnk7Ci0gICAgcHJvdGVjdGVkIE1lc3NhZ2VDb250ZXh0IG1jOwotICAgIHByb3RlY3RlZCBTZXJ2aWNlQ29udGV4dCBzZXJ2aWNlQ29udGV4dDsKLSAgICBwcm90ZWN0ZWQgQXhpc1NlcnZpY2Ugc2VydmljZTsKLQotICAgIHByb3RlY3RlZCBib29sZWFuIGZpbmlzaCA9IGZhbHNlOwotCi0gICAgcHVibGljIEVjaG9SYXdYTUxNdWx0aXBsZVN5bmNUZXN0KCkgewotICAgICAgICBzdXBlcihFY2hvUmF3WE1MVGVzdC5jbGFzcy5nZXROYW1lKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBFY2hvUmF3WE1MTXVsdGlwbGVTeW5jVGVzdChTdHJpbmcgdGVzdE5hbWUpIHsKLSAgICAgICAgc3VwZXIodGVzdE5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgcmV0dXJuIGdldFRlc3RTZXR1cChuZXcgVGVzdFN1aXRlKEVjaG9SYXdYTUxNdWx0aXBsZVN5bmNUZXN0LmNsYXNzKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc2VydmljZSA9Ci0gICAgICAgICAgICAgICAgVXRpbHMuY3JlYXRlU2ltcGxlU2VydmljZShzZXJ2aWNlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVjaG8uY2xhc3MuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uTmFtZSk7Ci0gICAgICAgIFV0aWxTZXJ2ZXIuZGVwbG95U2VydmljZShzZXJ2aWNlKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBVdGlsU2VydmVyLnVuRGVwbG95U2VydmljZShzZXJ2aWNlTmFtZSk7Ci0gICAgICAgIFV0aWxTZXJ2ZXIudW5EZXBsb3lDbGllbnRTZXJ2aWNlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEVjaG9YTUxNdWx0aXBsZVN5bmMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgT01FbGVtZW50IHBheWxvYWQgPSBUZXN0aW5nVXRpbHMuY3JlYXRlRHVtbXlPTUVsZW1lbnQoKTsKLSAgICAgICAgT3B0aW9ucyBvcHRpb25zID0gbmV3IE9wdGlvbnMoKTsKLSAgICAgICAgb3B0aW9ucy5zZXRUbyh0YXJnZXRFUFIpOwotICAgICAgICBvcHRpb25zLnNldENhbGxUcmFuc3BvcnRDbGVhbnVwKHRydWUpOwotICAgICAgICBvcHRpb25zLnNldFRyYW5zcG9ydEluUHJvdG9jb2woQ29uc3RhbnRzLlRSQU5TUE9SVF9IVFRQKTsKLSAgICAgICAgb3B0aW9ucy5zZXRUaW1lT3V0SW5NaWxsaVNlY29uZHMoNTAwMDApOwotICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0ID0KLSAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkuY3JlYXRlQ29uZmlndXJhdGlvbkNvbnRleHRGcm9tRmlsZVN5c3RlbShudWxsLCBudWxsKTsKLSAgICAgICAgU2VydmljZUNsaWVudCBzZW5kZXIgPSBuZXcgU2VydmljZUNsaWVudChjb25maWdDb250ZXh0LCBudWxsKTsKLSAgICAgICAgc2VuZGVyLnNldE9wdGlvbnMob3B0aW9ucyk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNTsgaSsrKSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgcmVzdWx0ID0gc2VuZGVyLnNlbmRSZWNlaXZlKHBheWxvYWQpOwotICAgICAgICAgICAgVGVzdGluZ1V0aWxzLmNvbXBhcmVXaXRoQ3JlYXRlZE9NRWxlbWVudChyZXN1bHQpOwotICAgICAgICB9Ci0gICAgICAgIHNlbmRlci5jbGVhbnVwKCk7Ci0gICAgICAgIGNvbmZpZ0NvbnRleHQudGVybWluYXRlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEVjaG9YTUxNdWx0aXBsZUR1ZWxTeW5jKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE9NRWxlbWVudCBwYXlsb2FkID0gVGVzdGluZ1V0aWxzLmNyZWF0ZUR1bW15T01FbGVtZW50KCk7Ci0gICAgICAgIE9wdGlvbnMgb3B0aW9ucyA9IG5ldyBPcHRpb25zKCk7Ci0gICAgICAgIG9wdGlvbnMuc2V0VG8odGFyZ2V0RVBSKTsKLQotICAgICAgICBvcHRpb25zLnNldFRyYW5zcG9ydEluUHJvdG9jb2woQ29uc3RhbnRzLlRSQU5TUE9SVF9IVFRQKTsKLSAgICAgICAgb3B0aW9ucy5zZXRVc2VTZXBhcmF0ZUxpc3RlbmVyKHRydWUpOwotICAgICAgICBvcHRpb25zLnNldFRpbWVPdXRJbk1pbGxpU2Vjb25kcyg1MDAwMCk7Ci0KLSAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ29udGV4dCA9Ci0gICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5LmNyZWF0ZUNvbmZpZ3VyYXRpb25Db250ZXh0RnJvbUZpbGVTeXN0ZW0oCi0gICAgICAgICAgICAgICAgICAgICAgICBUZXN0aW5nVXRpbHMucHJlZml4QmFzZURpcmVjdG9yeSgidGFyZ2V0L3Rlc3QtcmVzb3VyY2VzL2ludGVncmF0aW9uUmVwbyIpLAotICAgICAgICAgICAgICAgICAgICAgICAgVGVzdGluZ1V0aWxzLnByZWZpeEJhc2VEaXJlY3RvcnkoInRhcmdldC90ZXN0LXJlc291cmNlcy9pbnRlZ3JhdGlvblJlcG8vY29uZi9heGlzMi54bWwiKSk7Ci0gICAgICAgIFNlcnZpY2VDbGllbnQgc2VuZGVyID0gbmV3IFNlcnZpY2VDbGllbnQoY29uZmlnQ29udGV4dCwgbnVsbCk7Ci0gICAgICAgIG9wdGlvbnMuc2V0QWN0aW9uKENvbnN0YW50cy5BWElTMl9OQU1FU1BBQ0VfVVJJICsgIi8iICsgb3BlcmF0aW9uTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgIG9wdGlvbnMuc2V0QWN0aW9uKCJ1cm46ZWNob09NRWxlbWVudCIpOwotICAgICAgICBzZW5kZXIuc2V0T3B0aW9ucyhvcHRpb25zKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDU7IGkrKykgewotICAgICAgICAgICAgT01FbGVtZW50IHJlc3VsdCA9IHNlbmRlci5zZW5kUmVjZWl2ZShwYXlsb2FkKTsKLSAgICAgICAgICAgIFRlc3RpbmdVdGlscy5jb21wYXJlV2l0aENyZWF0ZWRPTUVsZW1lbnQocmVzdWx0KTsKLSAgICAgICAgfQotICAgICAgICBzZW5kZXIuY2xlYW51cCgpOwotICAgICAgICBjb25maWdDb250ZXh0LnRlcm1pbmF0ZSgpOwotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL0VjaG9SYXdYTUxPblR3b0NoYW5uZWxzU3luY1Rlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvRWNob1Jhd1hNTE9uVHdvQ2hhbm5lbHNTeW5jVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTM0ODMxLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvRWNob1Jhd1hNTE9uVHdvQ2hhbm5lbHNTeW5jVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5lbmdpbmU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5PcHRpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50LlNlcnZpY2VDbGllbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUudXRpbC5UZXN0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaW50ZWdyYXRpb24uVGVzdGluZ1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaW50ZWdyYXRpb24uVXRpbFNlcnZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmludGVncmF0aW9uLlV0aWxTZXJ2ZXJCYXNlZFRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5VdGlsczsKLQotcHVibGljIGNsYXNzIEVjaG9SYXdYTUxPblR3b0NoYW5uZWxzU3luY1Rlc3QgZXh0ZW5kcyBVdGlsU2VydmVyQmFzZWRUZXN0Q2FzZQotICAgICAgICBpbXBsZW1lbnRzIFRlc3RDb25zdGFudHMgewotCi0gICAgcHVibGljIEVjaG9SYXdYTUxPblR3b0NoYW5uZWxzU3luY1Rlc3QoKSB7Ci0gICAgICAgIHN1cGVyKEVjaG9SYXdYTUxPblR3b0NoYW5uZWxzU3luY1Rlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRWNob1Jhd1hNTE9uVHdvQ2hhbm5lbHNTeW5jVGVzdChTdHJpbmcgdGVzdE5hbWUpIHsKLSAgICAgICAgc3VwZXIodGVzdE5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgcmV0dXJuIGdldFRlc3RTZXR1cChuZXcgVGVzdFN1aXRlKEVjaG9SYXdYTUxPblR3b0NoYW5uZWxzU3luY1Rlc3QuY2xhc3MpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBBeGlzU2VydmljZSBzZXJ2aWNlID0KLSAgICAgICAgICAgICAgICBVdGlscy5jcmVhdGVTaW1wbGVTZXJ2aWNlKHNlcnZpY2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWNoby5jbGFzcy5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25OYW1lKTsKLSAgICAgICAgVXRpbFNlcnZlci5kZXBsb3lTZXJ2aWNlKHNlcnZpY2UpOwotCi0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgVXRpbFNlcnZlci51bkRlcGxveVNlcnZpY2Uoc2VydmljZU5hbWUpOwotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgdGVzdEVjaG9YTUxDb21wbGV0ZVN5bmMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSA9Ci0gICAgICAgICAgICAgICAgVXRpbHMuY3JlYXRlU2ltcGxlU2VydmljZWZvckNsaWVudChzZXJ2aWNlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVjaG8uY2xhc3MuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uTmFtZSk7Ci0KLSAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ29uZXR4dCA9IFV0aWxTZXJ2ZXIuY3JlYXRlQ2xpZW50Q29uZmlndXJhdGlvbkNvbnRleHQoKTsKLQotICAgICAgICBPTUZhY3RvcnkgZmFjID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCk7Ci0KLSAgICAgICAgT01OYW1lc3BhY2Ugb21OcyA9IGZhYy5jcmVhdGVPTU5hbWVzcGFjZSgiaHR0cDovL2xvY2FsaG9zdC9teSIsICJteSIpOwotICAgICAgICBPTUVsZW1lbnQgbWV0aG9kID0gZmFjLmNyZWF0ZU9NRWxlbWVudCgiZWNob09NRWxlbWVudCIsIG9tTnMpOwotICAgICAgICBPTUVsZW1lbnQgdmFsdWUgPSBmYWMuY3JlYXRlT01FbGVtZW50KCJteVZhbHVlIiwgb21Ocyk7Ci0gICAgICAgIHZhbHVlLnNldFRleHQoIklzYWFjIEFzaW1vdiwgVGhlIEZvdW5kYXRpb24gVHJpbG9neSIpOwotICAgICAgICBtZXRob2QuYWRkQ2hpbGQodmFsdWUpOwotICAgICAgICBPcHRpb25zIG9wdGlvbnMgPSBuZXcgT3B0aW9ucygpOwotICAgICAgICBvcHRpb25zLnNldFRvKHRhcmdldEVQUik7Ci0gICAgICAgIG9wdGlvbnMuc2V0VHJhbnNwb3J0SW5Qcm90b2NvbChDb25zdGFudHMuVFJBTlNQT1JUX0hUVFApOwotICAgICAgICBvcHRpb25zLnNldFVzZVNlcGFyYXRlTGlzdGVuZXIodHJ1ZSk7Ci0gICAgICAgIG9wdGlvbnMuc2V0QWN0aW9uKG9wZXJhdGlvbk5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotCi0gICAgICAgIFNlcnZpY2VDbGllbnQgc2VuZGVyID0gbmV3IFNlcnZpY2VDbGllbnQoY29uZmlnQ29uZXR4dCwgc2VydmljZSk7Ci0gICAgICAgIHNlbmRlci5zZXRPcHRpb25zKG9wdGlvbnMpOwotCi0gICAgICAgIE9NRWxlbWVudCByZXN1bHQgPSBzZW5kZXIuc2VuZFJlY2VpdmUob3BlcmF0aW9uTmFtZSwgbWV0aG9kKTsKLQotICAgICAgICBUZXN0aW5nVXRpbHMuY29tcGFyZVdpdGhDcmVhdGVkT01FbGVtZW50KHJlc3VsdCk7Ci0gICAgICAgIHNlbmRlci5jbGVhbnVwKCk7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RWNob1hNTENvbXBsZXRlU3luY3dpdGhUd29UcmFuc3BvcnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSA9Ci0gICAgICAgICAgICAgICAgVXRpbHMuY3JlYXRlU2ltcGxlU2VydmljZWZvckNsaWVudChzZXJ2aWNlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVjaG8uY2xhc3MuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uTmFtZSk7Ci0KLSAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ29uZXR4dCA9IFV0aWxTZXJ2ZXIuY3JlYXRlQ2xpZW50Q29uZmlndXJhdGlvbkNvbnRleHQoKTsKLQotICAgICAgICBPTUZhY3RvcnkgZmFjID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCk7Ci0KLSAgICAgICAgT01OYW1lc3BhY2Ugb21OcyA9IGZhYy5jcmVhdGVPTU5hbWVzcGFjZSgiaHR0cDovL2xvY2FsaG9zdC9teSIsICJteSIpOwotICAgICAgICBPTUVsZW1lbnQgbWV0aG9kID0gZmFjLmNyZWF0ZU9NRWxlbWVudCgiZWNob09NRWxlbWVudCIsIG9tTnMpOwotICAgICAgICBPTUVsZW1lbnQgdmFsdWUgPSBmYWMuY3JlYXRlT01FbGVtZW50KCJteVZhbHVlIiwgb21Ocyk7Ci0gICAgICAgIHZhbHVlLnNldFRleHQoIklzYWFjIEFzaW1vdiwgVGhlIEZvdW5kYXRpb24gVHJpbG9neSIpOwotICAgICAgICBtZXRob2QuYWRkQ2hpbGQodmFsdWUpOwotICAgICAgICBPcHRpb25zIG9wdGlvbnMgPSBuZXcgT3B0aW9ucygpOwotICAgICAgICBvcHRpb25zLnNldFRvKHRhcmdldEVQUik7Ci0gICAgICAgIG9wdGlvbnMuc2V0VHJhbnNwb3J0SW5Qcm90b2NvbChDb25zdGFudHMuVFJBTlNQT1JUX0xPQ0FMKTsKLSAgICAgICAgb3B0aW9ucy5zZXRVc2VTZXBhcmF0ZUxpc3RlbmVyKGZhbHNlKTsKLSAgICAgICAgb3B0aW9ucy5zZXRBY3Rpb24ob3BlcmF0aW9uTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0KLSAgICAgICAgU2VydmljZUNsaWVudCBzZW5kZXIgPSBuZXcgU2VydmljZUNsaWVudChjb25maWdDb25ldHh0LCBzZXJ2aWNlKTsKLSAgICAgICAgc2VuZGVyLnNldE9wdGlvbnMob3B0aW9ucyk7Ci0KLSAgICAgICAgT01FbGVtZW50IHJlc3VsdCA9IHNlbmRlci5zZW5kUmVjZWl2ZShvcGVyYXRpb25OYW1lLCBtZXRob2QpOwotCi0gICAgICAgIFRlc3RpbmdVdGlscy5jb21wYXJlV2l0aENyZWF0ZWRPTUVsZW1lbnQocmVzdWx0KTsKLSAgICAgICAgc2VuZGVyLmNsZWFudXAoKTsKLQotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL0VjaG9SYXdYTUxPblR3b0NoYW5uZWxzVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9FY2hvUmF3WE1MT25Ud29DaGFubmVsc1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RiN2Y2OC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL0VjaG9SYXdYTUxPblR3b0NoYW5uZWxzVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5lbmdpbmU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5PcHRpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50LlNlcnZpY2VDbGllbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuYXN5bmMuQXN5bmNSZXN1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuYXN5bmMuQ2FsbGJhY2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUudXRpbC5UZXN0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaW50ZWdyYXRpb24uVGVzdGluZ1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaW50ZWdyYXRpb24uVXRpbFNlcnZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmludGVncmF0aW9uLlV0aWxTZXJ2ZXJCYXNlZFRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotcHVibGljIGNsYXNzIEVjaG9SYXdYTUxPblR3b0NoYW5uZWxzVGVzdCBleHRlbmRzIFV0aWxTZXJ2ZXJCYXNlZFRlc3RDYXNlIGltcGxlbWVudHMgVGVzdENvbnN0YW50cyB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coRWNob1Jhd1hNTE9uVHdvQ2hhbm5lbHNUZXN0LmNsYXNzKTsKLQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGZpbmlzaCA9IGZhbHNlOwotCi0gICAgcHVibGljIEVjaG9SYXdYTUxPblR3b0NoYW5uZWxzVGVzdCgpIHsKLSAgICAgICAgc3VwZXIoRWNob1Jhd1hNTE9uVHdvQ2hhbm5lbHNUZXN0LmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIEVjaG9SYXdYTUxPblR3b0NoYW5uZWxzVGVzdChTdHJpbmcgdGVzdE5hbWUpIHsKLSAgICAgICAgc3VwZXIodGVzdE5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgcmV0dXJuIGdldFRlc3RTZXR1cChuZXcgVGVzdFN1aXRlKEVjaG9SYXdYTUxPblR3b0NoYW5uZWxzVGVzdC5jbGFzcykpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2UgPQotICAgICAgICAgICAgICAgIFV0aWxzLmNyZWF0ZVNpbXBsZVNlcnZpY2Uoc2VydmljZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFY2hvLmNsYXNzLmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbk5hbWUpOwotICAgICAgICBVdGlsU2VydmVyLmRlcGxveVNlcnZpY2Uoc2VydmljZSk7Ci0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBVdGlsU2VydmVyLnVuRGVwbG95U2VydmljZShzZXJ2aWNlTmFtZSk7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RWNob1hNTENvbXBsZXRlQVN5bmMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSA9Ci0gICAgICAgICAgICAgICAgVXRpbHMuY3JlYXRlU2ltcGxlU2VydmljZWZvckNsaWVudChzZXJ2aWNlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVjaG8uY2xhc3MuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uTmFtZSk7Ci0KLSAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnY29udGV4dCA9IFV0aWxTZXJ2ZXIuY3JlYXRlQ2xpZW50Q29uZmlndXJhdGlvbkNvbnRleHQoKTsKLQotICAgICAgICBPTUZhY3RvcnkgZmFjID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCk7Ci0KLSAgICAgICAgT01OYW1lc3BhY2Ugb21OcyA9IGZhYy5jcmVhdGVPTU5hbWVzcGFjZSgiaHR0cDovL2xvY2FsaG9zdC9teSIsICJteSIpOwotICAgICAgICBPTUVsZW1lbnQgbWV0aG9kID0gZmFjLmNyZWF0ZU9NRWxlbWVudCgiZWNob09NRWxlbWVudCIsIG9tTnMpOwotICAgICAgICBPTUVsZW1lbnQgdmFsdWUgPSBmYWMuY3JlYXRlT01FbGVtZW50KCJteVZhbHVlIiwgb21Ocyk7Ci0gICAgICAgIHZhbHVlLnNldFRleHQoIklzYWFjIEFzaW1vdiwgVGhlIEZvdW5kYXRpb24gVHJpbG9neSIpOwotICAgICAgICBtZXRob2QuYWRkQ2hpbGQodmFsdWUpOwotICAgICAgICBTZXJ2aWNlQ2xpZW50IHNlbmRlciA9IG51bGw7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9wdGlvbnMgb3B0aW9ucyA9IG5ldyBPcHRpb25zKCk7Ci0gICAgICAgICAgICBvcHRpb25zLnNldFRvKHRhcmdldEVQUik7Ci0gICAgICAgICAgICBvcHRpb25zLnNldFRyYW5zcG9ydEluUHJvdG9jb2woQ29uc3RhbnRzLlRSQU5TUE9SVF9IVFRQKTsKLSAgICAgICAgICAgIG9wdGlvbnMuc2V0VXNlU2VwYXJhdGVMaXN0ZW5lcih0cnVlKTsKLSAgICAgICAgICAgIG9wdGlvbnMuc2V0QWN0aW9uKG9wZXJhdGlvbk5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotCi0gICAgICAgICAgICBDYWxsYmFjayBjYWxsYmFjayA9IG5ldyBDYWxsYmFjaygpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNvbXBsZXRlKEFzeW5jUmVzdWx0IHJlc3VsdCkgewotICAgICAgICAgICAgICAgICAgICBUZXN0aW5nVXRpbHMuY29tcGFyZVdpdGhDcmVhdGVkT01FbGVtZW50KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5nZXRSZXNwb25zZUVudmVsb3BlKCkuZ2V0Qm9keSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Rmlyc3RFbGVtZW50KCkpOwotICAgICAgICAgICAgICAgICAgICBmaW5pc2ggPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uRXJyb3IoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmluZm8oZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgICAgICBmaW5pc2ggPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH07Ci0KLSAgICAgICAgICAgIHNlbmRlciA9IG5ldyBTZXJ2aWNlQ2xpZW50KGNvbmZpZ2NvbnRleHQsIHNlcnZpY2UpOwotICAgICAgICAgICAgc2VuZGVyLnNldE9wdGlvbnMob3B0aW9ucyk7Ci0KLSAgICAgICAgICAgIHNlbmRlci5zZW5kUmVjZWl2ZU5vbkJsb2NraW5nKG9wZXJhdGlvbk5hbWUsIG1ldGhvZCwgY2FsbGJhY2spOwotICAgICAgICAgICAgaW50IGluZGV4ID0gMDsKLSAgICAgICAgICAgIHdoaWxlICghZmluaXNoKSB7Ci0gICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDApOwotICAgICAgICAgICAgICAgIGluZGV4Kys7Ci0gICAgICAgICAgICAgICAgaWYgKGluZGV4ID4gMTApIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2VydmVyIHdhcyBzaHV0ZG93biBhcyB0aGUgYXN5bmMgcmVzcG9uc2UgdGFrZSB0b28gbG9uZyB0byBjb21wbGV0ZSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGxvZy5pbmZvKCJzZW5kIHRoZSByZXFlc3QiKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHNlbmRlci5jbGVhbnVwKCk7Ci0gICAgICAgIH0KLQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvRWNob1Jhd1hNTFRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvRWNob1Jhd1hNTFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODczYjFjNC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL0VjaG9SYXdYTUxUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZTsKLQotLy90b2RvCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQMTJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuT3B0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5TZXJ2aWNlQ2xpZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50LmFzeW5jLkFzeW5jUmVzdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50LmFzeW5jLkNhbGxiYWNrOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuU2VydmljZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS51dGlsLlRlc3RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pbnRlZ3JhdGlvbi5UZXN0aW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pbnRlZ3JhdGlvbi5VdGlsU2VydmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaW50ZWdyYXRpb24uVXRpbFNlcnZlckJhc2VkVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5IVFRQQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotcHVibGljIGNsYXNzIEVjaG9SYXdYTUxUZXN0IGV4dGVuZHMgVXRpbFNlcnZlckJhc2VkVGVzdENhc2UgaW1wbGVtZW50cyBUZXN0Q29uc3RhbnRzIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhFY2hvUmF3WE1MVGVzdC5jbGFzcyk7Ci0KLSAgICBwcm90ZWN0ZWQgQXhpc0NvbmZpZ3VyYXRpb24gZW5naW5lUmVnaXN0cnk7Ci0gICAgcHJvdGVjdGVkIE1lc3NhZ2VDb250ZXh0IG1jOwotICAgIHByb3RlY3RlZCBTZXJ2aWNlQ29udGV4dCBzZXJ2aWNlQ29udGV4dDsKLSAgICBwcm90ZWN0ZWQgQXhpc1NlcnZpY2Ugc2VydmljZTsKLQotICAgIHByb3RlY3RlZCBib29sZWFuIGZpbmlzaCA9IGZhbHNlOwotCi0gICAgcHVibGljIEVjaG9SYXdYTUxUZXN0KCkgewotICAgICAgICBzdXBlcihFY2hvUmF3WE1MVGVzdC5jbGFzcy5nZXROYW1lKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBFY2hvUmF3WE1MVGVzdChTdHJpbmcgdGVzdE5hbWUpIHsKLSAgICAgICAgc3VwZXIodGVzdE5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgcmV0dXJuIGdldFRlc3RTZXR1cChuZXcgVGVzdFN1aXRlKEVjaG9SYXdYTUxUZXN0LmNsYXNzKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc2VydmljZSA9Ci0gICAgICAgICAgICAgICAgVXRpbHMuY3JlYXRlU2ltcGxlU2VydmljZShzZXJ2aWNlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVjaG8uY2xhc3MuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uTmFtZSk7Ci0gICAgICAgIFV0aWxTZXJ2ZXIuZGVwbG95U2VydmljZShzZXJ2aWNlKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBVdGlsU2VydmVyLnVuRGVwbG95U2VydmljZShzZXJ2aWNlTmFtZSk7Ci0gICAgICAgIFV0aWxTZXJ2ZXIudW5EZXBsb3lDbGllbnRTZXJ2aWNlKCk7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RWNob1hNTEFTeW5jKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE9NRWxlbWVudCBwYXlsb2FkID0gVGVzdGluZ1V0aWxzLmNyZWF0ZUR1bW15T01FbGVtZW50KCk7Ci0gICAgICAgIE9wdGlvbnMgb3B0aW9ucyA9IG5ldyBPcHRpb25zKCk7Ci0gICAgICAgIG9wdGlvbnMuc2V0VG8odGFyZ2V0RVBSKTsKLSAgICAgICAgb3B0aW9ucy5zZXRUcmFuc3BvcnRJblByb3RvY29sKENvbnN0YW50cy5UUkFOU1BPUlRfSFRUUCk7Ci0KLSAgICAgICAgQ2FsbGJhY2sgY2FsbGJhY2sgPSBuZXcgQ2FsbGJhY2soKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNvbXBsZXRlKEFzeW5jUmVzdWx0IHJlc3VsdCkgewotICAgICAgICAgICAgICAgIFRlc3RpbmdVdGlscy5jb21wYXJlV2l0aENyZWF0ZWRPTUVsZW1lbnQoCi0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuZ2V0UmVzcG9uc2VFbnZlbG9wZSgpLmdldEJvZHkoKS5nZXRGaXJzdEVsZW1lbnQoKSk7Ci0gICAgICAgICAgICAgICAgZmluaXNoID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25FcnJvcihFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGxvZy5pbmZvKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICBmaW5pc2ggPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotCi0gICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQgPQotICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeS5jcmVhdGVDb25maWd1cmF0aW9uQ29udGV4dEZyb21GaWxlU3lzdGVtKAotICAgICAgICAgICAgICAgICAgICAgICAgVGVzdGluZ1V0aWxzLnByZWZpeEJhc2VEaXJlY3RvcnkoInRhcmdldC90ZXN0LXJlc291cmNlcy9pbnRlZ3JhdGlvblJlcG8iKSwgbnVsbCk7Ci0gICAgICAgIFNlcnZpY2VDbGllbnQgc2VuZGVyID0gbmV3IFNlcnZpY2VDbGllbnQoY29uZmlnQ29udGV4dCwgbnVsbCk7Ci0gICAgICAgIHNlbmRlci5zZXRPcHRpb25zKG9wdGlvbnMpOwotICAgICAgICBvcHRpb25zLnNldFRvKHRhcmdldEVQUik7Ci0gICAgICAgIHNlbmRlci5zZW5kUmVjZWl2ZU5vbkJsb2NraW5nKHBheWxvYWQsIGNhbGxiYWNrKTsKLSAgICAgICAgaW50IGluZGV4ID0gMDsKLSAgICAgICAgd2hpbGUgKCFmaW5pc2gpIHsKLSAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsKLSAgICAgICAgICAgIGluZGV4Kys7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPiAxMCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoCi0gICAgICAgICAgICAgICAgICAgICAgICAiU2VydmVyIHdhcyBzaHV0ZG93biBhcyB0aGUgYXN5bmMgcmVzcG9uc2UgdGFrZSB0b28gbG9uZyB0byBjb21wbGV0ZSIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGxvZy5pbmZvKCJzZW5kIHRoZSByZXF1ZXN0Iik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEVjaG9YTUxTeW5jKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgT01FbGVtZW50IHBheWxvYWQgPSBUZXN0aW5nVXRpbHMuY3JlYXRlRHVtbXlPTUVsZW1lbnQoKTsKLSAgICAgICAgT3B0aW9ucyBvcHRpb25zID0gbmV3IE9wdGlvbnMoKTsKLSAgICAgICAgb3B0aW9ucy5zZXRUbyh0YXJnZXRFUFIpOwotICAgICAgICBvcHRpb25zLnNldFNvYXBWZXJzaW9uVVJJKFNPQVAxMkNvbnN0YW50cy5TT0FQX0VOVkVMT1BFX05BTUVTUEFDRV9VUkkpOwotICAgICAgICBvcHRpb25zLnNldFRyYW5zcG9ydEluUHJvdG9jb2woQ29uc3RhbnRzLlRSQU5TUE9SVF9IVFRQKTsKLQotICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0ID0KLSAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkuY3JlYXRlQ29uZmlndXJhdGlvbkNvbnRleHRGcm9tRmlsZVN5c3RlbShudWxsLCBudWxsKTsKLSAgICAgICAgU2VydmljZUNsaWVudCBzZW5kZXIgPSBuZXcgU2VydmljZUNsaWVudChjb25maWdDb250ZXh0LCBudWxsKTsKLSAgICAgICAgc2VuZGVyLnNldE9wdGlvbnMob3B0aW9ucyk7Ci0KLSAgICAgICAgT01FbGVtZW50IHJlc3VsdCA9IHNlbmRlci5zZW5kUmVjZWl2ZShwYXlsb2FkKTsKLQotICAgICAgICBUZXN0aW5nVXRpbHMuY29tcGFyZVdpdGhDcmVhdGVkT01FbGVtZW50KHJlc3VsdCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdExvY2FsRWNob1hNTFN5bmMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgT01FbGVtZW50IHBheWxvYWQgPSBUZXN0aW5nVXRpbHMuY3JlYXRlRHVtbXlPTUVsZW1lbnQoKTsKLSAgICAgICAgT3B0aW9ucyBvcHRpb25zID0gbmV3IE9wdGlvbnMoKTsKLSAgICAgICAgb3B0aW9ucy5zZXRUbyh0YXJnZXRFUFIpOwotICAgICAgICBvcHRpb25zLnNldFNvYXBWZXJzaW9uVVJJKFNPQVAxMkNvbnN0YW50cy5TT0FQX0VOVkVMT1BFX05BTUVTUEFDRV9VUkkpOwotICAgICAgICBvcHRpb25zLnNldFRyYW5zcG9ydEluUHJvdG9jb2woQ29uc3RhbnRzLlRSQU5TUE9SVF9IVFRQKTsKLQotICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0ID0KLSAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkuY3JlYXRlQ29uZmlndXJhdGlvbkNvbnRleHRGcm9tRmlsZVN5c3RlbShudWxsLCBudWxsKTsKLSAgICAgICAgU2VydmljZUNsaWVudCBzZW5kZXIgPSBuZXcgU2VydmljZUNsaWVudChjb25maWdDb250ZXh0LCBudWxsKTsKLSAgICAgICAgc2VuZGVyLnNldE9wdGlvbnMob3B0aW9ucyk7Ci0KLSAgICAgICAgT01FbGVtZW50IHJlc3VsdCA9IHNlbmRlci5zZW5kUmVjZWl2ZShwYXlsb2FkKTsKLQotICAgICAgICBUZXN0aW5nVXRpbHMuY29tcGFyZVdpdGhDcmVhdGVkT01FbGVtZW50KHJlc3VsdCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENvcnJlY3RTT0FQRW52ZWxvcGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICBPTUVsZW1lbnQgcGF5bG9hZCA9IFRlc3RpbmdVdGlscy5jcmVhdGVEdW1teU9NRWxlbWVudCgpOwotCi0gICAgICAgIE9wdGlvbnMgb3B0aW9ucyA9IG5ldyBPcHRpb25zKCk7Ci0gICAgICAgIG9wdGlvbnMuc2V0VG8odGFyZ2V0RVBSKTsKLSAgICAgICAgb3B0aW9ucy5zZXRUcmFuc3BvcnRJblByb3RvY29sKENvbnN0YW50cy5UUkFOU1BPUlRfSFRUUCk7Ci0KLSAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ29udGV4dCA9Ci0gICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5LmNyZWF0ZUNvbmZpZ3VyYXRpb25Db250ZXh0RnJvbUZpbGVTeXN0ZW0obnVsbCwgbnVsbCk7Ci0gICAgICAgIFNlcnZpY2VDbGllbnQgc2VuZGVyID0gbmV3IFNlcnZpY2VDbGllbnQoY29uZmlnQ29udGV4dCwgbnVsbCk7Ci0gICAgICAgIHNlbmRlci5zZXRPcHRpb25zKG9wdGlvbnMpOwotCi0gICAgICAgIE9NRWxlbWVudCByZXN1bHQgPSBzZW5kZXIuc2VuZFJlY2VpdmUocGF5bG9hZCk7Ci0KLSAgICAgICAgVGVzdGluZ1V0aWxzLmNvbXBhcmVXaXRoQ3JlYXRlZE9NRWxlbWVudChyZXN1bHQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFY2hvWE1MU3luY0h0dHBWZXJzaW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgT01FbGVtZW50IHBheWxvYWQgPSBUZXN0aW5nVXRpbHMuY3JlYXRlRHVtbXlPTUVsZW1lbnQoKTsKLSAgICAgICAgT3B0aW9ucyBvcHRpb25zID0gbmV3IE9wdGlvbnMoKTsKLSAgICAgICAgb3B0aW9ucy5zZXRUbyh0YXJnZXRFUFIpOwotICAgICAgICBvcHRpb25zLnNldFRyYW5zcG9ydEluUHJvdG9jb2woQ29uc3RhbnRzLlRSQU5TUE9SVF9IVFRQKTsKLSAgICAgICAgb3B0aW9ucy5zZXRQcm9wZXJ0eShIVFRQQ29uc3RhbnRzLkhUVFBfUFJPVE9DT0xfVkVSU0lPTiwgSFRUUENvbnN0YW50cy5IRUFERVJfUFJPVE9DT0xfMTApOwotCi0gICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQgPQotICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeS5jcmVhdGVDb25maWd1cmF0aW9uQ29udGV4dEZyb21GaWxlU3lzdGVtKG51bGwsIG51bGwpOwotICAgICAgICBTZXJ2aWNlQ2xpZW50IHNlbmRlciA9IG5ldyBTZXJ2aWNlQ2xpZW50KGNvbmZpZ0NvbnRleHQsIG51bGwpOwotICAgICAgICBzZW5kZXIuc2V0T3B0aW9ucyhvcHRpb25zKTsKLQotICAgICAgICBPTUVsZW1lbnQgcmVzdWx0ID0gc2VuZGVyLnNlbmRSZWNlaXZlKHBheWxvYWQpOwotCi0gICAgICAgIFRlc3RpbmdVdGlscy5jb21wYXJlV2l0aENyZWF0ZWRPTUVsZW1lbnQocmVzdWx0KTsKLSAgICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9FbmdpbmVQYXVzaW5nVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9FbmdpbmVQYXVzaW5nVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzlhOThhLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvRW5naW5lUGF1c2luZ1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZW5naW5lOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc0JpbmRpbmc7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzQmluZGluZ09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNFbmRwb2ludDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkhhbmRsZXJEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkluT3V0QXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlRyYW5zcG9ydEluRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5UcmFuc3BvcnRPdXREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5SZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmhhbmRsZXJzLkFic3RyYWN0SGFuZGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5SYXdYTUxJTk9ubHlNZXNzYWdlUmVjZWl2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuUmF3WE1MSU5PdXRNZXNzYWdlUmVjZWl2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5Db21tb25zSFRUUFRyYW5zcG9ydFNlbmRlcjsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotcHVibGljIGNsYXNzIEVuZ2luZVBhdXNpbmdUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFVTFRfSURYID0gIkZhdWx0SW5kZXgiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBVUxUX1JFQVNPTiA9ICJJIGZhdWx0ZWQgYmVjYXVzZSBJIHdhcyB0b2xkIHRvISI7Ci0KLSAgICBwcml2YXRlIFFOYW1lIHNlcnZpY2VOYW1lID0gbmV3IFFOYW1lKCJOdWxsU2VydmljZSIpOwotICAgIHByaXZhdGUgUU5hbWUgb3BlcmF0aW9uTmFtZSA9IG5ldyBRTmFtZSgiRHVtbXlPcCIpOwotICAgIHByaXZhdGUgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ29udGV4dDsKLQotICAgIHByaXZhdGUgVHJhbnNwb3J0T3V0RGVzY3JpcHRpb24gdHJhbnNwb3J0T3V0OwotICAgIHByaXZhdGUgVHJhbnNwb3J0SW5EZXNjcmlwdGlvbiB0cmFuc3BvcnRJbjsKLSAgICBwcml2YXRlIE1lc3NhZ2VDb250ZXh0IG1jOwotICAgIHByaXZhdGUgQXJyYXlMaXN0IGV4ZWN1dGVkSGFuZGxlcnM7Ci0KLSAgICBwdWJsaWMgRW5naW5lUGF1c2luZ1Rlc3QoU3RyaW5nIGFyZzApIHsKLSAgICAgICAgc3VwZXIoYXJnMCk7Ci0gICAgICAgIGV4ZWN1dGVkSGFuZGxlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIEF4aXNDb25maWd1cmF0aW9uIGVuZ2luZVJlZ2lzdHJ5ID0gbmV3IEF4aXNDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgIGNvbmZpZ0NvbnRleHQgPSBuZXcgQ29uZmlndXJhdGlvbkNvbnRleHQoZW5naW5lUmVnaXN0cnkpOwotICAgICAgICBjb25maWdDb250ZXh0LnNldFNlcnZpY2VQYXRoKENvbnN0YW50cy5ERUZBVUxUX1NFUlZJQ0VTX1BBVEgpOwotICAgICAgICBjb25maWdDb250ZXh0LnNldENvbnRleHRSb290KCJheGlzMiIpOwotICAgICAgICB0cmFuc3BvcnRPdXQgPSBuZXcgVHJhbnNwb3J0T3V0RGVzY3JpcHRpb24oIm51bGwiKTsKLSAgICAgICAgdHJhbnNwb3J0T3V0LnNldFNlbmRlcihuZXcgQ29tbW9uc0hUVFBUcmFuc3BvcnRTZW5kZXIoKSk7Ci0gICAgICAgIHRyYW5zcG9ydEluID0gbmV3IFRyYW5zcG9ydEluRGVzY3JpcHRpb24oIm51bGwiKTsKLQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSA9IG5ldyBBeGlzU2VydmljZShzZXJ2aWNlTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgIGNvbmZpZ0NvbnRleHQuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5hZGRTZXJ2aWNlKHNlcnZpY2UpOwotICAgICAgICBjb25maWdDb250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCkuYWRkTWVzc2FnZVJlY2VpdmVyKAotICAgICAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaW4tb25seSIsIG5ldyBSYXdYTUxJTk9ubHlNZXNzYWdlUmVjZWl2ZXIoKSk7Ci0gICAgICAgIGNvbmZpZ0NvbnRleHQuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5hZGRNZXNzYWdlUmVjZWl2ZXIoCi0gICAgICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgvd3NkbC9pbi1vdXQiLCBuZXcgUmF3WE1MSU5PdXRNZXNzYWdlUmVjZWl2ZXIoKSk7Ci0KLSAgICAgICAgRGlzcGF0Y2hQaGFzZSBkaXNwYXRjaFBoYXNlID0gbmV3IERpc3BhdGNoUGhhc2UoKTsKLQotICAgICAgICBkaXNwYXRjaFBoYXNlLnNldE5hbWUoIkRpc3BhdGNoIik7Ci0KLSAgICAgICAgQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciBhYmQgPSBuZXcgQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlcigpOwotCi0gICAgICAgIGFiZC5pbml0RGlzcGF0Y2hlcigpOwotCi0gICAgICAgIFJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIgcnVkID0gbmV3IFJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIoKTsKLQotICAgICAgICBydWQuaW5pdERpc3BhdGNoZXIoKTsKLQotICAgICAgICBTT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIHNhYmQgPSBuZXcgU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlcigpOwotCi0gICAgICAgIHNhYmQuaW5pdERpc3BhdGNoZXIoKTsKLQotICAgICAgICBTT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIgc21iZCA9IG5ldyBTT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIoKTsKLQotICAgICAgICBzbWJkLmluaXREaXNwYXRjaGVyKCk7Ci0KLSAgICAgICAgZGlzcGF0Y2hQaGFzZS5hZGRIYW5kbGVyKGFiZCk7Ci0gICAgICAgIGRpc3BhdGNoUGhhc2UuYWRkSGFuZGxlcihydWQpOwotICAgICAgICBkaXNwYXRjaFBoYXNlLmFkZEhhbmRsZXIoc2FiZCk7Ci0gICAgICAgIGRpc3BhdGNoUGhhc2UuYWRkSGFuZGxlcihzbWJkKTsKLSAgICAgICAgY29uZmlnQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpLmdldEluRmxvd1BoYXNlcygpLmFkZChkaXNwYXRjaFBoYXNlKTsKLSAgICAgICAgQXhpc09wZXJhdGlvbiBheGlzT3AgPSBuZXcgSW5PdXRBeGlzT3BlcmF0aW9uKG9wZXJhdGlvbk5hbWUpOwotICAgICAgICBheGlzT3Auc2V0TWVzc2FnZVJlY2VpdmVyKG5ldyBNZXNzYWdlUmVjZWl2ZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCByZWNlaXZlKE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDdHgpIHsKLQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgc2VydmljZS5hZGRPcGVyYXRpb24oYXhpc09wKTsKLQotICAgICAgICBBeGlzRW5kcG9pbnQgZW5kcG9pbnQgPSBuZXcgQXhpc0VuZHBvaW50KCk7Ci0gICAgICAgIGVuZHBvaW50LnNldE5hbWUoIk51bGxTZXJ2aWNlIik7Ci0KLSAgICAgICAgQXhpc0JpbmRpbmcgYmluZGluZyA9IG5ldyBBeGlzQmluZGluZygpOwotICAgICAgICBBeGlzQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3AgPSBuZXcgQXhpc0JpbmRpbmdPcGVyYXRpb24oKTsKLQotICAgICAgICBiaW5kaW5nT3Auc2V0TmFtZShheGlzT3AuZ2V0TmFtZSgpKTsKLSAgICAgICAgYmluZGluZ09wLnNldEF4aXNPcGVyYXRpb24oYXhpc09wKTsKLSAgICAgICAgYmluZGluZy5hZGRDaGlsZChiaW5kaW5nT3ApOwotICAgICAgICBlbmRwb2ludC5zZXRCaW5kaW5nKGJpbmRpbmcpOwotICAgICAgICBzZXJ2aWNlLmFkZEVuZHBvaW50KGVuZHBvaW50LmdldE5hbWUoKSwgZW5kcG9pbnQpOwotICAgICAgICBzZXJ2aWNlLnNldEVuZHBvaW50TmFtZShlbmRwb2ludC5nZXROYW1lKCkpOwotCi0gICAgICAgIHNlcnZpY2UubWFwQWN0aW9uVG9PcGVyYXRpb24ob3BlcmF0aW9uTmFtZS5nZXRMb2NhbFBhcnQoKSwgYXhpc09wKTsKLQotICAgICAgICBtYyA9IGNvbmZpZ0NvbnRleHQuY3JlYXRlTWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgbWMuc2V0VHJhbnNwb3J0SW4odHJhbnNwb3J0SW4pOwotICAgICAgICBtYy5zZXRUcmFuc3BvcnRPdXQodHJhbnNwb3J0T3V0KTsKLQotICAgICAgICBtYy5zZXRUcmFuc3BvcnRPdXQodHJhbnNwb3J0T3V0KTsKLSAgICAgICAgbWMuc2V0U2VydmVyU2lkZSh0cnVlKTsKLS8vICAgICAgICBtYy5zZXRQcm9wZXJ0eShNZXNzYWdlQ29udGV4dC5UUkFOU1BPUlRfT1VULCBTeXN0ZW0ub3V0KTsKLSAgICAgICAgU09BUEZhY3Rvcnkgb21GYWMgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTFGYWN0b3J5KCk7Ci0gICAgICAgIG1jLnNldEVudmVsb3BlKG9tRmFjLmdldERlZmF1bHRFbnZlbG9wZSgpKTsKLQotICAgICAgICBQaGFzZSBwaGFzZTEgPSBuZXcgUGhhc2UoIjEiKTsKLSAgICAgICAgcGhhc2UxLmFkZEhhbmRsZXIobmV3IFRlbXBIYW5kbGVyKDEpKTsKLSAgICAgICAgcGhhc2UxLmFkZEhhbmRsZXIobmV3IFRlbXBIYW5kbGVyKDIpKTsKLSAgICAgICAgcGhhc2UxLmFkZEhhbmRsZXIobmV3IFRlbXBIYW5kbGVyKDMpKTsKLSAgICAgICAgcGhhc2UxLmFkZEhhbmRsZXIobmV3IFRlbXBIYW5kbGVyKDQpKTsKLSAgICAgICAgcGhhc2UxLmFkZEhhbmRsZXIobmV3IFRlbXBIYW5kbGVyKDUpKTsKLSAgICAgICAgcGhhc2UxLmFkZEhhbmRsZXIobmV3IFRlbXBIYW5kbGVyKDYpKTsKLSAgICAgICAgcGhhc2UxLmFkZEhhbmRsZXIobmV3IFRlbXBIYW5kbGVyKDcpKTsKLSAgICAgICAgcGhhc2UxLmFkZEhhbmRsZXIobmV3IFRlbXBIYW5kbGVyKDgpKTsKLSAgICAgICAgcGhhc2UxLmFkZEhhbmRsZXIobmV3IFRlbXBIYW5kbGVyKDkpKTsKLQotICAgICAgICBQaGFzZSBwaGFzZTIgPSBuZXcgUGhhc2UoIjIiKTsKLSAgICAgICAgcGhhc2UyLmFkZEhhbmRsZXIobmV3IFRlbXBIYW5kbGVyKDEwKSk7Ci0gICAgICAgIHBoYXNlMi5hZGRIYW5kbGVyKG5ldyBUZW1wSGFuZGxlcigxMSkpOwotICAgICAgICBwaGFzZTIuYWRkSGFuZGxlcihuZXcgVGVtcEhhbmRsZXIoMTIpKTsKLSAgICAgICAgcGhhc2UyLmFkZEhhbmRsZXIobmV3IFRlbXBIYW5kbGVyKDEzKSk7Ci0gICAgICAgIHBoYXNlMi5hZGRIYW5kbGVyKG5ldyBUZW1wSGFuZGxlcigxNCkpOwotICAgICAgICBwaGFzZTIuYWRkSGFuZGxlcihuZXcgVGVtcEhhbmRsZXIoMTUsIHRydWUpKTsKLSAgICAgICAgcGhhc2UyLmFkZEhhbmRsZXIobmV3IFRlbXBIYW5kbGVyKDE2KSk7Ci0gICAgICAgIHBoYXNlMi5hZGRIYW5kbGVyKG5ldyBUZW1wSGFuZGxlcigxNykpOwotICAgICAgICBwaGFzZTIuYWRkSGFuZGxlcihuZXcgVGVtcEhhbmRsZXIoMTgpKTsKLQotICAgICAgICBQaGFzZSBwaGFzZTMgPSBuZXcgUGhhc2UoIjMiKTsKLSAgICAgICAgcGhhc2UzLmFkZEhhbmRsZXIobmV3IFRlbXBIYW5kbGVyKDE5KSk7Ci0gICAgICAgIHBoYXNlMy5hZGRIYW5kbGVyKG5ldyBUZW1wSGFuZGxlcigyMCkpOwotICAgICAgICBwaGFzZTMuYWRkSGFuZGxlcihuZXcgVGVtcEhhbmRsZXIoMjEpKTsKLSAgICAgICAgcGhhc2UzLmFkZEhhbmRsZXIobmV3IFRlbXBIYW5kbGVyKDIyKSk7Ci0gICAgICAgIHBoYXNlMy5hZGRIYW5kbGVyKG5ldyBUZW1wSGFuZGxlcigyMykpOwotICAgICAgICBwaGFzZTMuYWRkSGFuZGxlcihuZXcgVGVtcEhhbmRsZXIoMjQpKTsKLSAgICAgICAgcGhhc2UzLmFkZEhhbmRsZXIobmV3IFRlbXBIYW5kbGVyKDI1KSk7Ci0gICAgICAgIHBoYXNlMy5hZGRIYW5kbGVyKG5ldyBUZW1wSGFuZGxlcigyNikpOwotICAgICAgICBwaGFzZTMuYWRkSGFuZGxlcihuZXcgVGVtcEhhbmRsZXIoMjcpKTsKLQotICAgICAgICAvL1RPRE8KLSAgICAgICAgYXhpc09wLmdldFJlbWFpbmluZ1BoYXNlc0luRmxvdygpLmFkZChwaGFzZTEpOwotICAgICAgICBheGlzT3AuZ2V0UmVtYWluaW5nUGhhc2VzSW5GbG93KCkuYWRkKHBoYXNlMik7Ci0gICAgICAgIGF4aXNPcC5nZXRSZW1haW5pbmdQaGFzZXNJbkZsb3coKS5hZGQocGhhc2UzKTsKLQotICAgICAgICBtYy5zZXRXU0FBY3Rpb24ob3BlcmF0aW9uTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgIG1jLnNldFNvYXBBY3Rpb24ob3BlcmF0aW9uTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0vLyAgICAgICAgU3lzdGVtLm91dC5mbHVzaCgpOwotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFJlY2VpdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbWMuc2V0VG8obmV3IEVuZHBvaW50UmVmZXJlbmNlKCIvYXhpczIvc2VydmljZXMvTnVsbFNlcnZpY2UiKSk7Ci0gICAgICAgIG1jLnNldFdTQUFjdGlvbigiRHVtbXlPcCIpOwotICAgICAgICBBeGlzRW5naW5lLnJlY2VpdmUobWMpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMTQsIGV4ZWN1dGVkSGFuZGxlcnMuc2l6ZSgpKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxNDsgaSsrKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoKChJbnRlZ2VyKSBleGVjdXRlZEhhbmRsZXJzLmdldChpKSkuaW50VmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpICsgMSk7Ci0gICAgICAgIH0KLSAgICAgICAgQXhpc0VuZ2luZS5yZXN1bWUobWMpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygyNywgZXhlY3V0ZWRIYW5kbGVycy5zaXplKCkpOwotICAgICAgICBmb3IgKGludCBpID0gMTU7IGkgPCAyNzsgaSsrKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoKChJbnRlZ2VyKSBleGVjdXRlZEhhbmRsZXJzLmdldChpKSkuaW50VmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpICsgMSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Rmxvd0NvbXBsZXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIG1jLnNldFRvKG5ldyBFbmRwb2ludFJlZmVyZW5jZSgiL2F4aXMyL3NlcnZpY2VzL051bGxTZXJ2aWNlIikpOwotICAgICAgICBtYy5zZXRXU0FBY3Rpb24oIkR1bW15T3AiKTsKLQotICAgICAgICAvLyBGYXVsdCBvbiBIYW5kbGVyICM1Ci0gICAgICAgIG1jLnNldFByb3BlcnR5KEZBVUxUX0lEWCwgbmV3IEludGVnZXIoNSkpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBBeGlzRW5naW5lLnJlY2VpdmUobWMpOwotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgYXhpc0ZhdWx0KSB7Ci0gICAgICAgICAgICAvLyBFeHBlY3RlZCB0aGlzIGZhdWx0LgotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDQsIGV4ZWN1dGVkSGFuZGxlcnMuc2l6ZSgpKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBmYWlsKCJFeHBlY3RlZCBmYXVsdCBkaWQgbm90IG9jY3VyIik7Ci0gICAgfQotCi0gICAgcHVibGljIGNsYXNzIFRlbXBIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyIHsKLSAgICAgICAgcHJpdmF0ZSBJbnRlZ2VyIGluZGV4OwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gcGF1c2UgPSBmYWxzZTsKLQotICAgICAgICBwdWJsaWMgVGVtcEhhbmRsZXIoaW50IGluZGV4LCBib29sZWFuIHBhdXNlKSB7Ci0gICAgICAgICAgICB0aGlzLmluZGV4ID0gbmV3IEludGVnZXIoaW5kZXgpOwotICAgICAgICAgICAgdGhpcy5wYXVzZSA9IHBhdXNlOwotICAgICAgICAgICAgaW5pdChuZXcgSGFuZGxlckRlc2NyaXB0aW9uKCJoYW5kbGVyIiArIGluZGV4KSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgVGVtcEhhbmRsZXIoaW50IGluZGV4KSB7Ci0gICAgICAgICAgICB0aGlzLmluZGV4ID0gbmV3IEludGVnZXIoaW5kZXgpOwotICAgICAgICAgICAgaW5pdChuZXcgSGFuZGxlckRlc2NyaXB0aW9uKCJoYW5kbGVyIiArIGluZGV4KSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgSW52b2NhdGlvblJlc3BvbnNlIGludm9rZShNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgICAgIGlmIChwYXVzZSkgewotICAgICAgICAgICAgICAgIG1zZ0NvbnRleHQucGF1c2UoKTsKLSAgICAgICAgICAgICAgICBwYXVzZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgIHJldHVybiBJbnZvY2F0aW9uUmVzcG9uc2UuU1VTUEVORDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgSW50ZWdlciBmYXVsdEluZGV4ID0gKEludGVnZXIpbXNnQ29udGV4dC5nZXRQcm9wZXJ0eShGQVVMVF9JRFgpOwotICAgICAgICAgICAgaWYgKGZhdWx0SW5kZXggIT0gbnVsbCAmJiBmYXVsdEluZGV4LmVxdWFscyhpbmRleCkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KEZBVUxUX1JFQVNPTik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGV4ZWN1dGVkSGFuZGxlcnMuYWRkKGluZGV4KTsKLSAgICAgICAgICAgIHJldHVybiBJbnZvY2F0aW9uUmVzcG9uc2UuQ09OVElOVUU7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGZsb3dDb21wbGV0ZShNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB7Ci0gICAgICAgICAgICBpZiAobXNnQ29udGV4dC5nZXRQcm9wZXJ0eShGQVVMVF9JRFgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBJZiB3ZSdyZSBoZXJlIG9uIGFuIGludm9jYXRpb24gd2hlcmUgc29tZW9uZSB3YXMgc3VwcG9zZWQgdG8gZmF1bHQuLi4KLSAgICAgICAgICAgICAgICBBeGlzRmF1bHQgZmF1bHQgPSAoQXhpc0ZhdWx0KW1zZ0NvbnRleHQuZ2V0RmFpbHVyZVJlYXNvbigpOwotICAgICAgICAgICAgICAgIGFzc2VydE5vdE51bGwoIk5vIGZhdWx0ISIsIGZhdWx0KTsKLQotICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBpdCdzIHRoZSByaWdodCBmYXVsdC4KLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoRkFVTFRfUkVBU09OLCBmYXVsdC5nZXRSZWFzb24oKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL0VuZ2luZVdpdGhvdXRQaGFzZVJlc29sdmluZ1Rlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvRW5naW5lV2l0aG91dFBoYXNlUmVzb2x2aW5nVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjEwOTJlLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvRW5naW5lV2l0aG91dFBoYXNlUmVzb2x2aW5nVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5lbmdpbmU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5BYnN0cmFjdEluT3V0U3luY01lc3NhZ2VSZWNlaXZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuT3BlcmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuU2VydmljZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LlNlcnZpY2VHcm91cENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5Jbk91dEF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5UcmFuc3BvcnRJbkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uVHJhbnNwb3J0T3V0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5Db21tb25zSFRUUFRyYW5zcG9ydFNlbmRlcjsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBFbmdpbmVXaXRob3V0UGhhc2VSZXNvbHZpbmdUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotICAgIHByaXZhdGUgTWVzc2FnZUNvbnRleHQgbWM7Ci0gICAgcHJpdmF0ZSBRTmFtZSBzZXJ2aWNlTmFtZSA9IG5ldyBRTmFtZSgiYXhpczIvc2VydmljZXMvTnVsbFNlcnZpY2UiKTsKLSAgICBwcml2YXRlIFFOYW1lIG9wZXJhdGlvbk5hbWUgPSBuZXcgUU5hbWUoIk51bGxPcGVyYXRpb24iKTsKLSAgICBwcml2YXRlIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQ7Ci0KLSAgICBwdWJsaWMgRW5naW5lV2l0aG91dFBoYXNlUmVzb2x2aW5nVGVzdCgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRW5naW5lV2l0aG91dFBoYXNlUmVzb2x2aW5nVGVzdChTdHJpbmcgYXJnMCkgewotICAgICAgICBzdXBlcihhcmcwKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIEF4aXNDb25maWd1cmF0aW9uIGVuZ2luZVJlZ2lzdHJ5ID0gbmV3IEF4aXNDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgIGNvbmZpZ0NvbnRleHQgPSBuZXcgQ29uZmlndXJhdGlvbkNvbnRleHQoZW5naW5lUmVnaXN0cnkpOwotCi0gICAgICAgIFRyYW5zcG9ydE91dERlc2NyaXB0aW9uIHRyYW5zcG9ydCA9IG5ldyBUcmFuc3BvcnRPdXREZXNjcmlwdGlvbigibnVsbCIpOwotICAgICAgICB0cmFuc3BvcnQuc2V0U2VuZGVyKG5ldyBDb21tb25zSFRUUFRyYW5zcG9ydFNlbmRlcigpKTsKLQotICAgICAgICBUcmFuc3BvcnRJbkRlc2NyaXB0aW9uIHRyYW5zcG9ydEluID0gbmV3IFRyYW5zcG9ydEluRGVzY3JpcHRpb24oIm51bGwiKTsKLSAgICAgICAgQXhpc09wZXJhdGlvbiBheGlzT3AgPSBuZXcgSW5PdXRBeGlzT3BlcmF0aW9uKG9wZXJhdGlvbk5hbWUpOwotCi0gICAgICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgQXhpc1NlcnZpY2Uoc2VydmljZU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICBheGlzT3Auc2V0TWVzc2FnZVJlY2VpdmVyKG5ldyBNZXNzYWdlUmVjZWl2ZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCByZWNlaXZlKE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDdHgpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICAgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgZW5naW5lUmVnaXN0cnkuYWRkU2VydmljZShzZXJ2aWNlKTsKLSAgICAgICAgc2VydmljZS5hZGRPcGVyYXRpb24oYXhpc09wKTsKLQotICAgICAgICBtYyA9IGNvbmZpZ0NvbnRleHQuY3JlYXRlTWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgbWMuc2V0VHJhbnNwb3J0SW4odHJhbnNwb3J0SW4pOwotICAgICAgICBtYy5zZXRUcmFuc3BvcnRPdXQodHJhbnNwb3J0KTsKLQotICAgICAgICBTZXJ2aWNlR3JvdXBDb250ZXh0IHNnYyA9IGNvbmZpZ0NvbnRleHQuY3JlYXRlU2VydmljZUdyb3VwQ29udGV4dCgKLSAgICAgICAgICAgICAgICBzZXJ2aWNlLmdldEF4aXNTZXJ2aWNlR3JvdXAoKSk7Ci0gICAgICAgIFNlcnZpY2VDb250ZXh0IHNjID0gc2djLmdldFNlcnZpY2VDb250ZXh0KHNlcnZpY2UpOwotCi0gICAgICAgIE9wZXJhdGlvbkNvbnRleHQgb3BDb250ZXh0ID0gc2MuY3JlYXRlT3BlcmF0aW9uQ29udGV4dChheGlzT3ApOwotCi0gICAgICAgIG1jLnNldE9wZXJhdGlvbkNvbnRleHQob3BDb250ZXh0KTsKLSAgICAgICAgbWMuc2V0VHJhbnNwb3J0T3V0KHRyYW5zcG9ydCk7Ci0gICAgICAgIG1jLnNldFByb3BlcnR5KE1lc3NhZ2VDb250ZXh0LlRSQU5TUE9SVF9PVVQsIFN5c3RlbS5vdXQpOwotICAgICAgICBtYy5zZXRTZXJ2ZXJTaWRlKHRydWUpOwotICAgICAgICBTT0FQRmFjdG9yeSBvbUZhYyA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMUZhY3RvcnkoKTsKLSAgICAgICAgbWMuc2V0RW52ZWxvcGUob21GYWMuZ2V0RGVmYXVsdEVudmVsb3BlKCkpOwotCi0KLSAgICAgICAgbWMuc2V0V1NBQWN0aW9uKG9wZXJhdGlvbk5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICBtYy5zZXRTb2FwQWN0aW9uKG9wZXJhdGlvbk5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICBTeXN0ZW0ub3V0LmZsdXNoKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNlcnZlclJlY2VpdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbWMuc2V0VG8oCi0gICAgICAgICAgICAgICAgbmV3IEVuZHBvaW50UmVmZXJlbmNlKCJheGlzMi9zZXJ2aWNlcy9OdWxsU2VydmljZSIpKTsKLSAgICAgICAgbWMuc2V0U2VydmVyU2lkZSh0cnVlKTsKLSAgICAgICAgQXhpc0VuZ2luZS5yZWNlaXZlKG1jKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgY2xhc3MgTnVsbE1lc3NhZ2VSZWNlaXZlciBleHRlbmRzIEFic3RyYWN0SW5PdXRTeW5jTWVzc2FnZVJlY2VpdmVyIHsKLQotICAgICAgICBwdWJsaWMgdm9pZCBpbnZva2VCdXNpbmVzc0xvZ2ljKE1lc3NhZ2VDb250ZXh0IGluTWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlQ29udGV4dCBvdXRNZXNzYWdlKQotICAgICAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotCi0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL0ZhdWx0SGFuZGxpbmdUZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL0ZhdWx0SGFuZGxpbmdUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzYjk1OWIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9GYXVsdEhhbmRsaW5nVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5lbmdpbmU7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS51dGlsLlN0QVhVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUDExQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQMTJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuaW1wbC5idWlsZGVyLlN0QVhTT0FQTW9kZWxCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50Lk9wZXJhdGlvbkNsaWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5PcHRpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50LlNlcnZpY2VDbGllbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLnV0aWwuRmF1bHRIYW5kbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLnV0aWwuVGVzdENvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmludGVncmF0aW9uLlRlc3RpbmdVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmludGVncmF0aW9uLlV0aWxTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pbnRlZ3JhdGlvbi5VdGlsU2VydmVyQmFzZWRUZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuV1NETENvbnN0YW50czsKLQotcHVibGljIGNsYXNzIEZhdWx0SGFuZGxpbmdUZXN0IGV4dGVuZHMgVXRpbFNlcnZlckJhc2VkVGVzdENhc2UgaW1wbGVtZW50cyBUZXN0Q29uc3RhbnRzIHsKLQotICAgIHByb3RlY3RlZCBTdHJpbmcgdGVzdFJlc291cmNlRGlyID0gInRlc3QtcmVzb3VyY2VzIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgcmV0dXJuIGdldFRlc3RTZXR1cChuZXcgVGVzdFN1aXRlKEZhdWx0SGFuZGxpbmdUZXN0LmNsYXNzKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlndXJhdGlvbkNvbnRleHQgPSBVdGlsU2VydmVyLmdldENvbmZpZ3VyYXRpb25Db250ZXh0KCk7Ci0gICAgICAgIExpc3QgaW5QaGFzZXNVcHRvQW5kSW5jbHVkaW5nUG9zdERpc3BhdGNoID0KLSAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpLmdldEluRmxvd1BoYXNlcygpOwotICAgICAgICBQaGFzZSBwaGFzZU9uZSA9IChQaGFzZSlpblBoYXNlc1VwdG9BbmRJbmNsdWRpbmdQb3N0RGlzcGF0Y2guZ2V0KDApOwotICAgICAgICBwaGFzZU9uZS5hZGRIYW5kbGVyKG5ldyBGYXVsdEhhbmRsZXIoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEZhdWx0SGFuZGxpbmdXaXRoUGFyYW1zU2V0VG9Nc2dDdHh0KCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIE9NRWxlbWVudCBwYXlsb2FkID0gZ2V0T01FbGVtZW50KEZhdWx0SGFuZGxlci5FUlJfSEFORExJTkdfV0lUSF9NU0dfQ1RYVCk7Ci0gICAgICAgIHRlc3RGYXVsdEhhbmRsaW5nKHBheWxvYWQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RGYXVsdEhhbmRsaW5nV2l0aFBhcmFtc1NldFRvQXhpc0ZhdWx0KCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIE9NRWxlbWVudCBwYXlsb2FkID0gZ2V0T01FbGVtZW50KEZhdWx0SGFuZGxlci5FUlJfSEFORExJTkdfV0lUSF9BWElTX0ZBVUxUKTsKLSAgICAgICAgdGVzdEZhdWx0SGFuZGxpbmcocGF5bG9hZCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RGYXVsdEhhbmRsaW5nKE9NRWxlbWVudCBwYXlsb2FkKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ29udGV4dCA9Ci0gICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5LmNyZWF0ZUNvbmZpZ3VyYXRpb25Db250ZXh0RnJvbUZpbGVTeXN0ZW0oCi0gICAgICAgICAgICAgICAgICAgICAgICAidGFyZ2V0L3Rlc3QtcmVzb3VyY2VzL2ludGVncmF0aW9uUmVwbyIsIG51bGwpOwotICAgICAgICBTZXJ2aWNlQ2xpZW50IHNlbmRlciA9IG5ldyBTZXJ2aWNlQ2xpZW50KGNvbmZpZ0NvbnRleHQsIG51bGwpOwotCi0gICAgICAgIC8vIHRlc3Qgd2l0aCBTT0FQIDEuMgotICAgICAgICBPcHRpb25zIG9wdGlvbnMgPSBuZXcgT3B0aW9ucygpOwotICAgICAgICBvcHRpb25zLnNldFRvKHRhcmdldEVQUik7Ci0gICAgICAgIG9wdGlvbnMuc2V0VHJhbnNwb3J0SW5Qcm90b2NvbChDb25zdGFudHMuVFJBTlNQT1JUX0hUVFApOwotICAgICAgICBvcHRpb25zLnNldEV4Y2VwdGlvblRvQmVUaHJvd25PblNPQVBGYXVsdChmYWxzZSk7Ci0gICAgICAgIG9wdGlvbnMuc2V0U29hcFZlcnNpb25VUkkoU09BUDEyQ29uc3RhbnRzLlNPQVBfRU5WRUxPUEVfTkFNRVNQQUNFX1VSSSk7Ci0gICAgICAgIHNlbmRlci5zZXRPcHRpb25zKG9wdGlvbnMpOwotCi0gICAgICAgIFN0cmluZyByZXN1bHQgPSBzZW5kZXIuc2VuZFJlY2VpdmUocGF5bG9hZCkudG9TdHJpbmcoKTsKLQotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdC5pbmRleE9mKEZhdWx0SGFuZGxlci5NX0ZBVUxUX0VYQ0VQVElPTikgPiAtMSk7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0LmluZGV4T2YoRmF1bHRIYW5kbGVyLkRFVEFJTF9NT1JFX0lORk8pID4gLTEpOwotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdC5pbmRleE9mKEZhdWx0SGFuZGxlci5GQVVMVF9SRUFTT04pID4gLTEpOwotCi0gICAgICAgIC8vIHRlc3Qgd2l0aCBTT0FQIDEuMQotICAgICAgICBvcHRpb25zID0gbmV3IE9wdGlvbnMoKTsKLSAgICAgICAgb3B0aW9ucy5zZXRUbyh0YXJnZXRFUFIpOwotICAgICAgICBvcHRpb25zLnNldFRyYW5zcG9ydEluUHJvdG9jb2woQ29uc3RhbnRzLlRSQU5TUE9SVF9IVFRQKTsKLSAgICAgICAgb3B0aW9ucy5zZXRFeGNlcHRpb25Ub0JlVGhyb3duT25TT0FQRmF1bHQoZmFsc2UpOwotICAgICAgICBvcHRpb25zLnNldFNvYXBWZXJzaW9uVVJJKFNPQVAxMUNvbnN0YW50cy5TT0FQX0VOVkVMT1BFX05BTUVTUEFDRV9VUkkpOwotICAgICAgICBzZW5kZXIuc2V0T3B0aW9ucyhvcHRpb25zKTsKLQotICAgICAgICByZXN1bHQgPSBzZW5kZXIuc2VuZFJlY2VpdmUocGF5bG9hZCkudG9TdHJpbmcoKTsKLQotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdC5pbmRleE9mKEZhdWx0SGFuZGxlci5NX0ZBVUxUX0VYQ0VQVElPTikgPiAtMSk7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0LmluZGV4T2YoRmF1bHRIYW5kbGVyLkRFVEFJTF9NT1JFX0lORk8pID4gLTEpOwotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdC5pbmRleE9mKEZhdWx0SGFuZGxlci5GQVVMVF9SRUFTT04pID4gLTEpOwotICAgIH0KLQotICAgIHByaXZhdGUgT01FbGVtZW50IGdldE9NRWxlbWVudChTdHJpbmcgZWxlbWVudExvY2FsTmFtZSkgewotICAgICAgICByZXR1cm4gT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCkuY3JlYXRlT01FbGVtZW50KGVsZW1lbnRMb2NhbE5hbWUsIG51bGwpOwotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgdGVzdFJlZlBhcmFtc1dpdGhGYXVsdFRvKCkgdGhyb3dzIEF4aXNGYXVsdCwgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgU09BUEVudmVsb3BlIHNvYXBFbnZlbG9wZSA9IGdldFNPQVBFbnZlbG9wZVdpdGhSZWZQYXJhbXNJbkZhdWx0VG8oKTsKLSAgICAgICAgU09BUEVudmVsb3BlIHJlc3Bvc2VFbnZlbG9wZSA9IGdldFJlc3BvbnNlKHNvYXBFbnZlbG9wZSk7Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJyZXNwb3NlRW52ZWxvcGUgPSAiICsgcmVzcG9zZUVudmVsb3BlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFNPQVBFbnZlbG9wZSBnZXRTT0FQRW52ZWxvcGVXaXRoUmVmUGFyYW1zSW5GYXVsdFRvKCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBzb2FwID0KLSAgICAgICAgICAgICAgICAiPGVudjpFbnZlbG9wZSB4bWxuczplbnY9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGVcIiB4bWxuczp3c2E9XCJodHRwOi8vd3d3LnczLm9yZy8yMDA1LzA4L2FkZHJlc3NpbmdcIj4gIFxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgPGVudjpIZWFkZXI+ICAgIFxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgPHdzYTpBY3Rpb24+aHR0cDovL2V4YW1wbGUub3JnL2FjdGlvbi9lY2hvSW48L3dzYTpBY3Rpb24+ICAgIFxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgPHdzYTpUbz5odHRwOi8vd3d3LWxrLndzbzIuY29tOjk3NjIvYXhpczIvc2VydmljZXMvd3NhVGVzdFNlcnZpY2UvPC93c2E6VG8+ICAgIFxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgPHdzYTpNZXNzYWdlSUQ+dXJuOnV1aWQ6QkFCNzlCNzctRTlBRS00QjlGLUE4QjQtNjI0QkI5RTdFOTE5PC93c2E6TWVzc2FnZUlEPiAgICBcbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgIDx3c2E6UmVwbHlUbz4gICAgICBcbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgIDx3c2E6QWRkcmVzcz5odHRwOi8vd3d3LnczLm9yZy8yMDA1LzA4L2FkZHJlc3NpbmcvYW5vbnltb3VzPC93c2E6QWRkcmVzcz4gICAgICBcbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgIDx3c2E6UmVmZXJlbmNlUGFyYW1ldGVycyB4bWxuczpjdXN0b21lcj1cImh0dHA6Ly9leGFtcGxlLm9yZy9jdXN0b21lclwiPiAgICAgICAgXG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICA8Y3VzdG9tZXI6Q3VzdG9tZXJLZXk+S2V5IzEyMzQ1Njc4OTwvY3VzdG9tZXI6Q3VzdG9tZXJLZXk+ICAgICAgXG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICA8L3dzYTpSZWZlcmVuY2VQYXJhbWV0ZXJzPiAgICBcbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgIDwvd3NhOlJlcGx5VG8+ICAgIFxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgPHdzYTpGYXVsdFRvPiAgICAgIFxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgPHdzYTpBZGRyZXNzPmh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDgvYWRkcmVzc2luZy9hbm9ueW1vdXM8L3dzYTpBZGRyZXNzPiAgICAgIFxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgPHdzYTpSZWZlcmVuY2VQYXJhbWV0ZXJzIHhtbG5zOmN1c3RvbWVyPVwiaHR0cDovL2V4YW1wbGUub3JnL2N1c3RvbWVyXCI+ICAgICAgICBcbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgIDxjdXN0b21lcjpDdXN0b21lcktleT5GYXVsdCMxMjM0NTY3ODk8L2N1c3RvbWVyOkN1c3RvbWVyS2V5PiAgICAgIFxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgPC93c2E6UmVmZXJlbmNlUGFyYW1ldGVycz4gICAgXG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICA8L3dzYTpGYXVsdFRvPiAgXG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICA8L2VudjpIZWFkZXI+ICBcbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgIDxlbnY6Qm9keT4gICAgXG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICA8bTplY2hvSW4geG1sbnM6bT1cImh0dHA6Ly9leGFtcGxlLm9yZy9lY2hvXCIgLz4gIFxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgPC9lbnY6Qm9keT5cbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIiAgIDwvZW52OkVudmVsb3BlPiI7Ci0gICAgICAgIHJldHVybiAoU09BUEVudmVsb3BlKW5ldyBTdEFYU09BUE1vZGVsQnVpbGRlcihTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKAotICAgICAgICAgICAgICAgIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShzb2FwLmdldEJ5dGVzKCkpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPQVAxMkNvbnN0YW50cy5TT0FQX0VOVkVMT1BFX05BTUVTUEFDRV9VUkkpCi0gICAgICAgICAgICAgICAgLmdldERvY3VtZW50RWxlbWVudCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgU09BUEVudmVsb3BlIGdldFJlc3BvbnNlKFNPQVBFbnZlbG9wZSBpbkVudmVsb3BlKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmN0eCA9IENvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeS4KLSAgICAgICAgICAgICAgICBjcmVhdGVDb25maWd1cmF0aW9uQ29udGV4dEZyb21GaWxlU3lzdGVtKFRlc3RpbmdVdGlscy5wcmVmaXhCYXNlRGlyZWN0b3J5KCJ0YXJnZXQvdGVzdC1yZXNvdXJjZXMvaW50ZWdyYXRpb25SZXBvIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsKTsKLSAgICAgICAgU2VydmljZUNsaWVudCBjbGllbnQgPSBuZXcgU2VydmljZUNsaWVudChjb25mY3R4LCBudWxsKTsKLSAgICAgICAgT3B0aW9ucyBvcHRpb25zID0gbmV3IE9wdGlvbnMoKTsKLSAgICAgICAgY2xpZW50LnNldE9wdGlvbnMob3B0aW9ucyk7Ci0gICAgICAgIG9wdGlvbnMuc2V0U29hcFZlcnNpb25VUkkoU09BUDEyQ29uc3RhbnRzLlNPQVBfRU5WRUxPUEVfTkFNRVNQQUNFX1VSSSk7Ci0gICAgICAgIG9wdGlvbnMuc2V0VG8odGFyZ2V0RVBSKTsKLSAgICAgICAgb3B0aW9ucy5zZXRUcmFuc3BvcnRJblByb3RvY29sKENvbnN0YW50cy5UUkFOU1BPUlRfSFRUUCk7Ci0gICAgICAgIG9wdGlvbnMuc2V0RXhjZXB0aW9uVG9CZVRocm93bk9uU09BUEZhdWx0KGZhbHNlKTsKLSAgICAgICAgTWVzc2FnZUNvbnRleHQgbXNnY3R4ID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIG1zZ2N0eC5zZXRFbnZlbG9wZShpbkVudmVsb3BlKTsKLSAgICAgICAgT3BlcmF0aW9uQ2xpZW50IG9wQ2xpZW50ID0gY2xpZW50LmNyZWF0ZUNsaWVudChTZXJ2aWNlQ2xpZW50LkFOT05fT1VUX0lOX09QKTsKLSAgICAgICAgb3BDbGllbnQuYWRkTWVzc2FnZUNvbnRleHQobXNnY3R4KTsKLSAgICAgICAgb3BDbGllbnQuZXhlY3V0ZSh0cnVlKTsKLSAgICAgICAgcmV0dXJuIG9wQ2xpZW50LmdldE1lc3NhZ2VDb250ZXh0KFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9JTl9WQUxVRSkuZ2V0RW52ZWxvcGUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRmlsZSBnZXRUZXN0UmVzb3VyY2VGaWxlKFN0cmluZyByZWxhdGl2ZVBhdGgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBGaWxlKFRlc3RpbmdVdGlscy5wcmVmaXhCYXNlRGlyZWN0b3J5KHRlc3RSZXNvdXJjZURpciksIHJlbGF0aXZlUGF0aCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXhjZXB0aW9uSW5mb3JtYXRpb25FeHRyYWN0aW9uRnJvbUF4aXNGYXVsdCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQgPQotICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkuY3JlYXRlQ29uZmlndXJhdGlvbkNvbnRleHRGcm9tRmlsZVN5c3RlbSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXN0aW5nVXRpbHMucHJlZml4QmFzZURpcmVjdG9yeSgidGFyZ2V0L3Rlc3QtcmVzb3VyY2VzL2ludGVncmF0aW9uUmVwbyIpLCBudWxsKTsKLSAgICAgICAgICAgIFNlcnZpY2VDbGllbnQgc2VuZGVyID0gbmV3IFNlcnZpY2VDbGllbnQoY29uZmlnQ29udGV4dCwgbnVsbCk7Ci0KLSAgICAgICAgICAgIE9NRWxlbWVudCBwYXlsb2FkID0gZ2V0T01FbGVtZW50KEZhdWx0SGFuZGxlci5FUlJfSEFORExJTkdfV0lUSF9BWElTX0ZBVUxUKTsKLQotICAgICAgICAgICAgLy8gdGVzdCB3aXRoIFNPQVAgMS4yCi0gICAgICAgICAgICBPcHRpb25zIG9wdGlvbnMgPSBuZXcgT3B0aW9ucygpOwotICAgICAgICAgICAgb3B0aW9ucy5zZXRUbyh0YXJnZXRFUFIpOwotICAgICAgICAgICAgb3B0aW9ucy5zZXRUcmFuc3BvcnRJblByb3RvY29sKENvbnN0YW50cy5UUkFOU1BPUlRfSFRUUCk7Ci0gICAgICAgICAgICBvcHRpb25zLnNldEV4Y2VwdGlvblRvQmVUaHJvd25PblNPQVBGYXVsdCh0cnVlKTsKLSAgICAgICAgICAgIG9wdGlvbnMuc2V0U29hcFZlcnNpb25VUkkoU09BUDEyQ29uc3RhbnRzLlNPQVBfRU5WRUxPUEVfTkFNRVNQQUNFX1VSSSk7Ci0gICAgICAgICAgICBzZW5kZXIuc2V0T3B0aW9ucyhvcHRpb25zKTsKLQotICAgICAgICAgICAgc2VuZGVyLnNlbmRSZWNlaXZlKHBheWxvYWQpLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBheGlzRmF1bHQpIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUoYXhpc0ZhdWx0LmdldEZhdWx0Q29kZUVsZW1lbnQoKS50b1N0cmluZygpCi0gICAgICAgICAgICAgICAgICAgIC5pbmRleE9mKEZhdWx0SGFuZGxlci5NX0ZBVUxUX0VYQ0VQVElPTikgPiAtMSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGF4aXNGYXVsdC5nZXRGYXVsdERldGFpbEVsZW1lbnQoKS50b1N0cmluZygpCi0gICAgICAgICAgICAgICAgICAgIC5pbmRleE9mKEZhdWx0SGFuZGxlci5ERVRBSUxfTU9SRV9JTkZPKSA+IC0xKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoYXhpc0ZhdWx0LmdldEZhdWx0UmVhc29uRWxlbWVudCgpLnRvU3RyaW5nKCkKLSAgICAgICAgICAgICAgICAgICAgLmluZGV4T2YoRmF1bHRIYW5kbGVyLkZBVUxUX1JFQVNPTikgPiAtMSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvSGFuZGxlckV4ZWN1dGlvblRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvSGFuZGxlckV4ZWN1dGlvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGYwNzU2Yy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL0hhbmRsZXJFeGVjdXRpb25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuU2VydmljZUNsaWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUudXRpbC5GYXVsdFRocm93aW5nU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmhhbmRsZXJzLkFic3RyYWN0SGFuZGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmludGVncmF0aW9uLkxvY2FsVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pbnRlZ3JhdGlvbi5UZXN0aW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5waGFzZXJlc29sdmVyLlBoYXNlTWV0YWRhdGE7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGNsYXNzIEhhbmRsZXJFeGVjdXRpb25UZXN0IGV4dGVuZHMgTG9jYWxUZXN0Q2FzZSB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgQXJyYXlMaXN0IHRlc3RSZXN1bHRzOwotICAgIHByaXZhdGUgQXhpc1NlcnZpY2UgdGVzdFNlcnZpY2U7Ci0gICAgcHJpdmF0ZSBBeGlzU2VydmljZSB0ZXN0RmFpbGluZ1NlcnZpY2U7Ci0gICAgcHJpdmF0ZSBRTmFtZSBmYWlsaW5nU2VydmljZU5hbWUgPSBuZXcgUU5hbWUoIkZhdWx0VGhyb3dpbmdTZXJ2aWNlIik7Ci0gICAgcHJpdmF0ZSBRTmFtZSBmYWlsaW5nT3BlcmF0aW9uTmFtZSA9IG5ldyBRTmFtZSgiZWNob1dpdGhGYXVsdCIpOwotICAgIHByaXZhdGUgc3RhdGljIFRlc3RIYW5kbGVyIG1pZGRsZUdsb2JhbEluSGFuZGxlcjsKLSAgICBwcml2YXRlIFRlc3RIYW5kbGVyIGZpcnN0T3BlcmF0aW9uSW5IYW5kbGVyOwotICAgIHByaXZhdGUgVGVzdEhhbmRsZXIgbWlkZGxlT3BlcmF0aW9uSW5IYW5kbGVyOwotICAgIHByaXZhdGUgVGVzdEhhbmRsZXIgbWlkZGxlT3BlcmF0aW9uT3V0SGFuZGxlcjsKLQotICAgIHByaXZhdGUgdm9pZCByZWdpc3Rlck9wZXJhdGlvbkxldmVsSGFuZGxlcnMoQXhpc09wZXJhdGlvbiBvcGVyYXRpb24pIHsKLSAgICAgICAgQXJyYXlMaXN0IG9wZXJhdGlvblNwZWNpZmljUGhhc2VzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBvcGVyYXRpb25TcGVjaWZpY1BoYXNlcy5hZGQobmV3IFBoYXNlKFBoYXNlTWV0YWRhdGEuUEhBU0VfUE9MSUNZX0RFVEVSTUlOQVRJT04pKTsKLSAgICAgICAgb3BlcmF0aW9uLnNldFJlbWFpbmluZ1BoYXNlc0luRmxvdyhvcGVyYXRpb25TcGVjaWZpY1BoYXNlcyk7Ci0gICAgICAgIEFycmF5TGlzdCBwaGFzZUxpc3QgPSBvcGVyYXRpb24uZ2V0UmVtYWluaW5nUGhhc2VzSW5GbG93KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGhhc2VMaXN0LnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBQaGFzZSBvcGVyYXRpb25TcGVjaWZpY1BoYXNlID0gKFBoYXNlKXBoYXNlTGlzdC5nZXQoaSk7Ci0gICAgICAgICAgICBpZiAoUGhhc2VNZXRhZGF0YS5QSEFTRV9QT0xJQ1lfREVURVJNSU5BVElPTgotICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKG9wZXJhdGlvblNwZWNpZmljUGhhc2UuZ2V0UGhhc2VOYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgb3BlcmF0aW9uU3BlY2lmaWNQaGFzZS5hZGRIYW5kbGVyKGZpcnN0T3BlcmF0aW9uSW5IYW5kbGVyKTsKLSAgICAgICAgICAgICAgICBvcGVyYXRpb25TcGVjaWZpY1BoYXNlLmFkZEhhbmRsZXIobWlkZGxlT3BlcmF0aW9uSW5IYW5kbGVyKTsKLSAgICAgICAgICAgICAgICBvcGVyYXRpb25TcGVjaWZpY1BoYXNlLmFkZEhhbmRsZXIobmV3IFRlc3RIYW5kbGVyKCJJbjYiKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBvcGVyYXRpb25TcGVjaWZpY1BoYXNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgb3BlcmF0aW9uU3BlY2lmaWNQaGFzZXMuYWRkKG5ldyBQaGFzZShQaGFzZU1ldGFkYXRhLlBIQVNFX1BPTElDWV9ERVRFUk1JTkFUSU9OKSk7Ci0gICAgICAgIG9wZXJhdGlvbi5zZXRQaGFzZXNPdXRGbG93KG9wZXJhdGlvblNwZWNpZmljUGhhc2VzKTsKLSAgICAgICAgcGhhc2VMaXN0ID0gb3BlcmF0aW9uLmdldFBoYXNlc091dEZsb3coKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwaGFzZUxpc3Quc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIFBoYXNlIG9wZXJhdGlvblNwZWNpZmljUGhhc2UgPSAoUGhhc2UpcGhhc2VMaXN0LmdldChpKTsKLSAgICAgICAgICAgIGlmIChQaGFzZU1ldGFkYXRhLlBIQVNFX1BPTElDWV9ERVRFUk1JTkFUSU9OCi0gICAgICAgICAgICAgICAgICAgIC5lcXVhbHMob3BlcmF0aW9uU3BlY2lmaWNQaGFzZS5nZXRQaGFzZU5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICBvcGVyYXRpb25TcGVjaWZpY1BoYXNlLmFkZEhhbmRsZXIobmV3IFRlc3RIYW5kbGVyKCJPdXQxIikpOwotICAgICAgICAgICAgICAgIG9wZXJhdGlvblNwZWNpZmljUGhhc2UuYWRkSGFuZGxlcihtaWRkbGVPcGVyYXRpb25PdXRIYW5kbGVyKTsKLSAgICAgICAgICAgICAgICBvcGVyYXRpb25TcGVjaWZpY1BoYXNlLmFkZEhhbmRsZXIobmV3IFRlc3RIYW5kbGVyKCJPdXQzIikpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIAlzdXBlci5zZXRVcCgpOwotICAgICAgICB0ZXN0UmVzdWx0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgICAgICAgICAgTGlzdCBnbG9iYWxJblBoYXNlcyA9Ci0gICAgICAgICAgICAgICAgICAgIHNlcnZlckNvbmZpZy5nZXRBeGlzQ29uZmlndXJhdGlvbigpLmdldEluRmxvd1BoYXNlcygpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBnbG9iYWxJblBoYXNlcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIFBoYXNlIGdsb2JhbEluUGhhc2UgPSAoUGhhc2UpZ2xvYmFsSW5QaGFzZXMuZ2V0KGkpOwotICAgICAgICAgICAgICAgIGlmIChQaGFzZU1ldGFkYXRhLlBIQVNFX1BSRV9ESVNQQVRDSC5lcXVhbHMoZ2xvYmFsSW5QaGFzZS5nZXRQaGFzZU5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgZ2xvYmFsSW5QaGFzZS5hZGRIYW5kbGVyKG5ldyBUZXN0SGFuZGxlcigiSW4xIikpOwotICAgICAgICAgICAgICAgICAgICBtaWRkbGVHbG9iYWxJbkhhbmRsZXIgPSBuZXcgVGVzdEhhbmRsZXIoIkluMiIpOwotICAgICAgICAgICAgICAgICAgICBnbG9iYWxJblBoYXNlLmFkZEhhbmRsZXIobWlkZGxlR2xvYmFsSW5IYW5kbGVyKTsKLSAgICAgICAgICAgICAgICAgICAgZ2xvYmFsSW5QaGFzZS5hZGRIYW5kbGVyKG5ldyBUZXN0SGFuZGxlcigiSW4zIikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgZmlyc3RPcGVyYXRpb25JbkhhbmRsZXIgPSBuZXcgVGVzdEhhbmRsZXIoIkluNCIpOwotICAgICAgICBtaWRkbGVPcGVyYXRpb25JbkhhbmRsZXIgPSBuZXcgVGVzdEhhbmRsZXIoIkluNSIpOwotICAgICAgICBtaWRkbGVPcGVyYXRpb25PdXRIYW5kbGVyID0gbmV3IFRlc3RIYW5kbGVyKCJPdXQyIik7Ci0KLSAgICAgICAgdGVzdFNlcnZpY2UgPSBkZXBsb3lDbGFzc0FzU2VydmljZShFY2hvLlNFUlZJQ0VfTkFNRSwgRWNoby5jbGFzcyk7Ci0gICAgICAgIHJlZ2lzdGVyT3BlcmF0aW9uTGV2ZWxIYW5kbGVycyh0ZXN0U2VydmljZS5nZXRPcGVyYXRpb24obmV3IFFOYW1lKEVjaG8uRUNIT19PTV9FTEVNRU5UX09QX05BTUUpKSk7Ci0KLSAgICAgICAgdGVzdEZhaWxpbmdTZXJ2aWNlID0gZGVwbG95Q2xhc3NBc1NlcnZpY2UoZmFpbGluZ1NlcnZpY2VOYW1lLmdldExvY2FsUGFydCgpLCBGYXVsdFRocm93aW5nU2VydmljZS5jbGFzcyk7Ci0gICAgICAgIHJlZ2lzdGVyT3BlcmF0aW9uTGV2ZWxIYW5kbGVycyh0ZXN0RmFpbGluZ1NlcnZpY2UuZ2V0T3BlcmF0aW9uKGZhaWxpbmdPcGVyYXRpb25OYW1lKSk7Ci0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFNlcnZpY2VDbGllbnQgY3JlYXRlQ2xpZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgCXJldHVybiBnZXRDbGllbnQoRWNoby5TRVJWSUNFX05BTUUsIEVjaG8uRUNIT19PTV9FTEVNRU5UX09QX05BTUUpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBleGVjdXRlQ2xpZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE9NRWxlbWVudCBwYXlsb2FkID0gVGVzdGluZ1V0aWxzLmNyZWF0ZUR1bW15T01FbGVtZW50KCk7Ci0gICAgICAgIE9NRWxlbWVudCByZXN1bHQgPSBjcmVhdGVDbGllbnQoKS5zZW5kUmVjZWl2ZShwYXlsb2FkKTsKLQotICAgICAgICBUZXN0aW5nVXRpbHMuY29tcGFyZVdpdGhDcmVhdGVkT01FbGVtZW50KHJlc3VsdCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFN1Y2Nlc3NmdWxJbnZvY2F0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU3RhcnRpbmcgdGVzdFN1Y2Nlc3NmdWxJbnZvY2F0aW9uIik7Ci0KLSAgICAgICAgT01FbGVtZW50IHBheWxvYWQgPSBUZXN0aW5nVXRpbHMuY3JlYXRlRHVtbXlPTUVsZW1lbnQoKTsKLSAgICAgICAgU2VydmljZUNsaWVudCBzZW5kZXIgPSBjcmVhdGVDbGllbnQoKTsKLQotICAgICAgICBBeGlzT3BlcmF0aW9uIG9wZXJhdGlvbiA9Ci0gICAgICAgICAgICAgICAgc2VuZGVyLmdldEF4aXNTZXJ2aWNlKCkuZ2V0T3BlcmF0aW9uKFNlcnZpY2VDbGllbnQuQU5PTl9PVVRfSU5fT1ApOwotICAgICAgICBBcnJheUxpc3Qgb3BlcmF0aW9uU3BlY2lmaWNQaGFzZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIG9wZXJhdGlvblNwZWNpZmljUGhhc2VzLmFkZChuZXcgUGhhc2UoUGhhc2VNZXRhZGF0YS5QSEFTRV9QT0xJQ1lfREVURVJNSU5BVElPTikpOwotICAgICAgICBvcGVyYXRpb24uc2V0UmVtYWluaW5nUGhhc2VzSW5GbG93KG9wZXJhdGlvblNwZWNpZmljUGhhc2VzKTsKLSAgICAgICAgQXJyYXlMaXN0IHBoYXNlTGlzdCA9IG9wZXJhdGlvbi5nZXRSZW1haW5pbmdQaGFzZXNJbkZsb3coKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwaGFzZUxpc3Quc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIFBoYXNlIG9wZXJhdGlvblNwZWNpZmljUGhhc2UgPSAoUGhhc2UpcGhhc2VMaXN0LmdldChpKTsKLSAgICAgICAgICAgIGlmIChQaGFzZU1ldGFkYXRhLlBIQVNFX1BPTElDWV9ERVRFUk1JTkFUSU9OCi0gICAgICAgICAgICAgICAgICAgIC5lcXVhbHMob3BlcmF0aW9uU3BlY2lmaWNQaGFzZS5nZXRQaGFzZU5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICBvcGVyYXRpb25TcGVjaWZpY1BoYXNlLmFkZEhhbmRsZXIobmV3IFRlc3RIYW5kbGVyKCJDSW4xIikpOwotICAgICAgICAgICAgICAgIG9wZXJhdGlvblNwZWNpZmljUGhhc2UuYWRkSGFuZGxlcihuZXcgVGVzdEhhbmRsZXIoIkNJbjIiKSk7Ci0gICAgICAgICAgICAgICAgb3BlcmF0aW9uU3BlY2lmaWNQaGFzZS5hZGRIYW5kbGVyKG5ldyBUZXN0SGFuZGxlcigiQ0luMyIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIG9wZXJhdGlvblNwZWNpZmljUGhhc2VzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBvcGVyYXRpb25TcGVjaWZpY1BoYXNlcy5hZGQobmV3IFBoYXNlKFBoYXNlTWV0YWRhdGEuUEhBU0VfUE9MSUNZX0RFVEVSTUlOQVRJT04pKTsKLSAgICAgICAgb3BlcmF0aW9uLnNldFBoYXNlc091dEZsb3cob3BlcmF0aW9uU3BlY2lmaWNQaGFzZXMpOwotICAgICAgICBwaGFzZUxpc3QgPSBvcGVyYXRpb24uZ2V0UGhhc2VzT3V0RmxvdygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBoYXNlTGlzdC5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgUGhhc2Ugb3BlcmF0aW9uU3BlY2lmaWNQaGFzZSA9IChQaGFzZSlwaGFzZUxpc3QuZ2V0KGkpOwotICAgICAgICAgICAgaWYgKFBoYXNlTWV0YWRhdGEuUEhBU0VfUE9MSUNZX0RFVEVSTUlOQVRJT04KLSAgICAgICAgICAgICAgICAgICAgLmVxdWFscyhvcGVyYXRpb25TcGVjaWZpY1BoYXNlLmdldFBoYXNlTmFtZSgpKSkgewotICAgICAgICAgICAgICAgIG9wZXJhdGlvblNwZWNpZmljUGhhc2UuYWRkSGFuZGxlcihuZXcgVGVzdEhhbmRsZXIoIkNPdXQxIikpOwotICAgICAgICAgICAgICAgIG9wZXJhdGlvblNwZWNpZmljUGhhc2UuYWRkSGFuZGxlcihuZXcgVGVzdEhhbmRsZXIoIkNPdXQyIikpOwotICAgICAgICAgICAgICAgIG9wZXJhdGlvblNwZWNpZmljUGhhc2UuYWRkSGFuZGxlcihuZXcgVGVzdEhhbmRsZXIoIkNPdXQzIikpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgT01FbGVtZW50IHJlc3VsdCA9IHNlbmRlci5zZW5kUmVjZWl2ZShwYXlsb2FkKTsKLQotICAgICAgICBUZXN0aW5nVXRpbHMuY29tcGFyZVdpdGhDcmVhdGVkT01FbGVtZW50KHJlc3VsdCk7Ci0KLSAgICAgICAgTGlzdCBleHBlY3RlZEV4ZWN1dGlvblN0YXRlID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiQ091dDEiLCAiQ091dDIiLCAiQ091dDMiLCAiSW4xIiwKLSAgICAgICAgICAgICAgICAiSW4yIiwgIkluMyIsICJJbjQiLCAiSW41IiwgIkluNiIsICJPdXQxIiwgIk91dDIiLCAiT3V0MyIsICJGQ091dDMiLCAiRkNPdXQyIiwKLSAgICAgICAgICAgICAgICAiRkNPdXQxIiwgIkZDSW42IiwgIkZDSW41IiwgIkZDSW40IiwgIkZDSW4zIiwgIkZDSW4yIiwgIkZDSW4xIiwgIkZDQ091dDMiLAotICAgICAgICAgICAgICAgICJGQ0NPdXQyIiwgIkZDQ091dDEiLCAiQ0luMSIsICJDSW4yIiwgIkNJbjMiLCAiRkNDSW4zIiwgIkZDQ0luMiIsICJGQ0NJbjEiIH0pOwotICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRFeGVjdXRpb25TdGF0ZSwgdGVzdFJlc3VsdHMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJ2ZXJzaWRlRmFpbHVyZUluU2VydmljZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlN0YXJ0aW5nIHRlc3RTZXJ2ZXJzaWRlRmFpbHVyZUluU2VydmljZSIpOwotCi0gICAgICAgIE9NRmFjdG9yeSBvbUZhY3RvcnkgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKTsKLSAgICAgICAgT01FbGVtZW50IHBheWxvYWQgPSBvbUZhY3RvcnkuY3JlYXRlT01FbGVtZW50KCJFY2hvT01FbGVtZW50IiwgbnVsbCk7Ci0gICAgICAgIHBheWxvYWQuc2V0VGV4dChGYXVsdFRocm93aW5nU2VydmljZS5USFJPV19GQVVMVF9BU19BWElTX0ZBVUxUKTsKLQotICAgICAgICBTZXJ2aWNlQ2xpZW50IHNlbmRlciA9IGdldENsaWVudChmYWlsaW5nU2VydmljZU5hbWUuZ2V0TG9jYWxQYXJ0KCksIGZhaWxpbmdPcGVyYXRpb25OYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgc2VuZGVyLmdldE9wdGlvbnMoKS5zZXRFeGNlcHRpb25Ub0JlVGhyb3duT25TT0FQRmF1bHQodHJ1ZSk7Ci0gICAgICAgIAotICAgICAgICBBeGlzT3BlcmF0aW9uIG9wZXJhdGlvbiA9Ci0gICAgICAgICAgICAgICAgc2VuZGVyLmdldEF4aXNTZXJ2aWNlKCkuZ2V0T3BlcmF0aW9uKFNlcnZpY2VDbGllbnQuQU5PTl9PVVRfSU5fT1ApOwotICAgICAgICBBcnJheUxpc3Qgb3BlcmF0aW9uU3BlY2lmaWNQaGFzZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIG9wZXJhdGlvblNwZWNpZmljUGhhc2VzLmFkZChuZXcgUGhhc2UoUGhhc2VNZXRhZGF0YS5QSEFTRV9QT0xJQ1lfREVURVJNSU5BVElPTikpOwotICAgICAgICBvcGVyYXRpb24uc2V0UmVtYWluaW5nUGhhc2VzSW5GbG93KG9wZXJhdGlvblNwZWNpZmljUGhhc2VzKTsKLSAgICAgICAgQXJyYXlMaXN0IHBoYXNlTGlzdCA9IG9wZXJhdGlvbi5nZXRSZW1haW5pbmdQaGFzZXNJbkZsb3coKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwaGFzZUxpc3Quc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIFBoYXNlIG9wZXJhdGlvblNwZWNpZmljUGhhc2UgPSAoUGhhc2UpcGhhc2VMaXN0LmdldChpKTsKLSAgICAgICAgICAgIGlmIChQaGFzZU1ldGFkYXRhLlBIQVNFX1BPTElDWV9ERVRFUk1JTkFUSU9OCi0gICAgICAgICAgICAgICAgICAgIC5lcXVhbHMob3BlcmF0aW9uU3BlY2lmaWNQaGFzZS5nZXRQaGFzZU5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICBvcGVyYXRpb25TcGVjaWZpY1BoYXNlLmFkZEhhbmRsZXIobmV3IFRlc3RIYW5kbGVyKCJDSW4xIikpOwotICAgICAgICAgICAgICAgIG9wZXJhdGlvblNwZWNpZmljUGhhc2UuYWRkSGFuZGxlcihuZXcgVGVzdEhhbmRsZXIoIkNJbjIiKSk7Ci0gICAgICAgICAgICAgICAgb3BlcmF0aW9uU3BlY2lmaWNQaGFzZS5hZGRIYW5kbGVyKG5ldyBUZXN0SGFuZGxlcigiQ0luMyIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIG9wZXJhdGlvblNwZWNpZmljUGhhc2VzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBvcGVyYXRpb25TcGVjaWZpY1BoYXNlcy5hZGQobmV3IFBoYXNlKFBoYXNlTWV0YWRhdGEuUEhBU0VfUE9MSUNZX0RFVEVSTUlOQVRJT04pKTsKLSAgICAgICAgb3BlcmF0aW9uLnNldFBoYXNlc091dEZsb3cob3BlcmF0aW9uU3BlY2lmaWNQaGFzZXMpOwotICAgICAgICBwaGFzZUxpc3QgPSBvcGVyYXRpb24uZ2V0UGhhc2VzT3V0RmxvdygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBoYXNlTGlzdC5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgUGhhc2Ugb3BlcmF0aW9uU3BlY2lmaWNQaGFzZSA9IChQaGFzZSlwaGFzZUxpc3QuZ2V0KGkpOwotICAgICAgICAgICAgaWYgKFBoYXNlTWV0YWRhdGEuUEhBU0VfUE9MSUNZX0RFVEVSTUlOQVRJT04KLSAgICAgICAgICAgICAgICAgICAgLmVxdWFscyhvcGVyYXRpb25TcGVjaWZpY1BoYXNlLmdldFBoYXNlTmFtZSgpKSkgewotICAgICAgICAgICAgICAgIG9wZXJhdGlvblNwZWNpZmljUGhhc2UuYWRkSGFuZGxlcihuZXcgVGVzdEhhbmRsZXIoIkNPdXQxIikpOwotICAgICAgICAgICAgICAgIG9wZXJhdGlvblNwZWNpZmljUGhhc2UuYWRkSGFuZGxlcihuZXcgVGVzdEhhbmRsZXIoIkNPdXQyIikpOwotICAgICAgICAgICAgICAgIG9wZXJhdGlvblNwZWNpZmljUGhhc2UuYWRkSGFuZGxlcihuZXcgVGVzdEhhbmRsZXIoIkNPdXQzIikpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHRyeXsKLSAgICAgICAgCXNlbmRlci5zZW5kUmVjZWl2ZShwYXlsb2FkKTsKLSAgICAgICAgCWZhaWwoIkV4cGVjdGluZyBleGNlcHRpb24gdG8gYmUgdGhyb3duLiIpOwotICAgICAgICB9Y2F0Y2goQXhpc0ZhdWx0IGFmKXsKLSAgICAgICAgCWFzc2VydEVxdWFscygiVGVzdEZhdWx0IiwgYWYuZ2V0RmF1bHRDb2RlKCkuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAJYXNzZXJ0VHJ1ZShhZi5nZXRSZWFzb24oKS5pbmRleE9mKCJGYXVsdFJlYXNvbiIpID4gLTEpOwotICAgICAgICB9Ci0gICAgICAgIC8vVGhpcyBvZGQgcGF0dGVybiBvZiBDSW4gRkNDSW4gQ0luIEZDQ0luIGlzIGNhdXNlZCBieSB0aGUgSW5PdXRBeGlzT3BlcmF0aW9uIGFsd2F5cyBleGVjdXRpbmcgdGhlIGluZmxvdyBwaGFzZXMsIGV2ZW4gaWYgdGhlcmUgd2FzIGEgZmF1bHQgKGFuZCB0aGVuIGV4ZWN1dGluZyB0aGUgaW5mYXVsZmxvdykKLSAgICAgICAgTGlzdCBleHBlY3RlZEV4ZWN1dGlvblN0YXRlID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiQ091dDEiLCAiQ091dDIiLCAiQ091dDMiLCAiSW4xIiwKLSAgICAgICAgICAgICAgICAiSW4yIiwgIkluMyIsICJJbjQiLCAiSW41IiwgIkluNiIsICJGQ0luNiIsICJGQ0luNSIsICJGQ0luNCIsICJGQ0luMyIsICJGQ0luMiIsCi0gICAgICAgICAgICAgICAgIkZDSW4xIiwgIkZDQ091dDMiLCAiRkNDT3V0MiIsICJGQ0NPdXQxIiwgIkNJbjEiLCAiQ0luMiIsICJDSW4zIiwgIkZDQ0luMyIsCi0gICAgICAgICAgICAgICAgIkZDQ0luMiIsICJGQ0NJbjEiLCAiQ0luMSIsICJDSW4yIiwgIkNJbjMiLCAiRkNDSW4zIiwgIkZDQ0luMiIsICJGQ0NJbjEiIH0pOwotICAgICAgICAvL1RPRE8gOiBOZWVkIHRvIGZpeCB0aGUgdGhpcyB0ZXN0IGNhc2UKLS8vICAgIGFzc2VydEVxdWFscyhleHBlY3RlZEV4ZWN1dGlvblN0YXRlLCB0ZXN0UmVzdWx0cyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNlcnZlcnNpZGVIYW5kbGVyRmFpbHVyZUluSW5ib3VuZE9wZXJhdGlvblNwZWNpZmljUGhhc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTdGFydGluZyB0ZXN0U2VydmVyc2lkZUhhbmRsZXJGYWlsdXJlSW5JbmJvdW5kT3BlcmF0aW9uU3BlY2lmaWNQaGFzZSIpOwotCi0gICAgICAgIG1pZGRsZU9wZXJhdGlvbkluSGFuZGxlci5zaG91bGRGYWlsKHRydWUpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZXhlY3V0ZUNsaWVudCgpOwotICAgICAgICAgICAgZmFpbCgiQW4gZXhwZWN0ZWQgaGFuZGxlciBmYWlsdXJlIGRpZCBub3Qgb2NjdXIiKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoQXhpc0ZhdWx0IGUpIHsKLSAgICAgICAgfQotICAgICAgICBMaXN0IGV4cGVjdGVkRXhlY3V0aW9uU3RhdGUgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJJbjEiLCAiSW4yIiwgIkluMyIsICJJbjQiLAotICAgICAgICAgICAgICAgICJrYWJvb20iLCAiRkNJbjQiLCAiRkNJbjMiLCAiRkNJbjIiLCAiRkNJbjEiIH0pOwotICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRFeGVjdXRpb25TdGF0ZSwgdGVzdFJlc3VsdHMpOwotICAgICAgICBtaWRkbGVPcGVyYXRpb25JbkhhbmRsZXIuc2hvdWxkRmFpbChmYWxzZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNlcnZlcnNpZGVIYW5kbGVyRmFpbHVyZUluSW5ib3VuZE9wZXJhdGlvblNwZWNpZmljUGhhc2VXaXRoRmlyc3RIYW5kbGVyKCkKLSAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlN0YXJ0aW5nIHRlc3RTZXJ2ZXJzaWRlSGFuZGxlckZhaWx1cmVJbk91dGJvdW5kUGhhc2VXaXRoRmlyc3RIYW5kbGVyIik7Ci0gICAgICAgIGZpcnN0T3BlcmF0aW9uSW5IYW5kbGVyLnNob3VsZEZhaWwodHJ1ZSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBleGVjdXRlQ2xpZW50KCk7Ci0gICAgICAgICAgICBmYWlsKCJBbiBleHBlY3RlZCBoYW5kbGVyIGZhaWx1cmUgZGlkIG5vdCBvY2N1ciIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChBeGlzRmF1bHQgZSkgewotICAgICAgICB9Ci0gICAgICAgIExpc3QgZXhwZWN0ZWRFeGVjdXRpb25TdGF0ZSA9IEFycmF5cy5hc0xpc3QoCi0gICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgIkluMSIsICJJbjIiLCAiSW4zIiwgImthYm9vbSIsICJGQ0luMyIsICJGQ0luMiIsICJGQ0luMSIgfSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZEV4ZWN1dGlvblN0YXRlLCB0ZXN0UmVzdWx0cyk7Ci0gICAgICAgIGZpcnN0T3BlcmF0aW9uSW5IYW5kbGVyLnNob3VsZEZhaWwoZmFsc2UpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJ2ZXJzaWRlSGFuZGxlckZhaWx1cmVJbkluYm91bmRHbG9iYWxQaGFzZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlN0YXJ0aW5nIHRlc3RTZXJ2ZXJzaWRlSGFuZGxlckZhaWx1cmVJbkdsb2JhbFBoYXNlIik7Ci0KLSAgICAgICAgbWlkZGxlR2xvYmFsSW5IYW5kbGVyLnNob3VsZEZhaWwodHJ1ZSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBleGVjdXRlQ2xpZW50KCk7Ci0gICAgICAgICAgICBmYWlsKCJBbiBleHBlY3RlZCBoYW5kbGVyIGZhaWx1cmUgZGlkIG5vdCBvY2N1ciIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChBeGlzRmF1bHQgZSkgewotICAgICAgICB9Ci0gICAgICAgIExpc3QgZXhwZWN0ZWRFeGVjdXRpb25TdGF0ZSA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsiSW4xIiwgImthYm9vbSIsIkZDSW4xIn0pOwotICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRFeGVjdXRpb25TdGF0ZSwgdGVzdFJlc3VsdHMpOwotICAgICAgICBtaWRkbGVHbG9iYWxJbkhhbmRsZXIuc2hvdWxkRmFpbChmYWxzZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNlcnZlcnNpZGVIYW5kbGVyRmFpbHVyZUluT3V0Ym91bmRQaGFzZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlN0YXJ0aW5nIHRlc3RTZXJ2ZXJzaWRlSGFuZGxlckZhaWx1cmVJbk91dGJvdW5kUGhhc2UiKTsKLQotICAgICAgICBtaWRkbGVPcGVyYXRpb25PdXRIYW5kbGVyLnNob3VsZEZhaWwodHJ1ZSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBleGVjdXRlQ2xpZW50KCk7Ci0gICAgICAgICAgICBmYWlsKCJBbiBleHBlY3RlZCBoYW5kbGVyIGZhaWx1cmUgZGlkIG5vdCBvY2N1ciIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChBeGlzRmF1bHQgZSkgewotICAgICAgICB9Ci0gICAgICAgIExpc3QgZXhwZWN0ZWRFeGVjdXRpb25TdGF0ZSA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIkluMSIsICJJbjIiLCAiSW4zIiwgIkluNCIsCi0gICAgICAgICAgICAgICAgIkluNSIsICJJbjYiLCAiT3V0MSIsICJrYWJvb20iLCAiRkNPdXQxIiwgIkZDSW42IiwgIkZDSW41IiwgIkZDSW40IiwgIkZDSW4zIiwKLSAgICAgICAgICAgICAgICAiRkNJbjIiLCAiRkNJbjEiIH0pOwotICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRFeGVjdXRpb25TdGF0ZSwgdGVzdFJlc3VsdHMpOwotICAgICAgICBtaWRkbGVPcGVyYXRpb25PdXRIYW5kbGVyLnNob3VsZEZhaWwoZmFsc2UpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDbGllbnRzaWRlSGFuZGxlckZhaWx1cmVJbk91dGJvdW5kUGhhc2VXaXRoRmlyc3RIYW5kbGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU3RhcnRpbmcgdGVzdENsaWVudHNpZGVIYW5kbGVyRmFpbHVyZUluT3V0Ym91bmRQaGFzZVdpdGhGaXJzdEhhbmRsZXIiKTsKLQotICAgICAgICBPTUVsZW1lbnQgcGF5bG9hZCA9IFRlc3RpbmdVdGlscy5jcmVhdGVEdW1teU9NRWxlbWVudCgpOwotICAgICAgICBTZXJ2aWNlQ2xpZW50IHNlbmRlciA9IGNyZWF0ZUNsaWVudCgpOwotCi0gICAgICAgIEF4aXNPcGVyYXRpb24gb3BlcmF0aW9uID0KLSAgICAgICAgICAgICAgICBzZW5kZXIuZ2V0QXhpc1NlcnZpY2UoKS5nZXRPcGVyYXRpb24oU2VydmljZUNsaWVudC5BTk9OX09VVF9JTl9PUCk7Ci0gICAgICAgIEFycmF5TGlzdCBvcGVyYXRpb25TcGVjaWZpY1BoYXNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgb3BlcmF0aW9uU3BlY2lmaWNQaGFzZXMuYWRkKG5ldyBQaGFzZShQaGFzZU1ldGFkYXRhLlBIQVNFX1BPTElDWV9ERVRFUk1JTkFUSU9OKSk7Ci0gICAgICAgIG9wZXJhdGlvbi5zZXRQaGFzZXNPdXRGbG93KG9wZXJhdGlvblNwZWNpZmljUGhhc2VzKTsKLSAgICAgICAgQXJyYXlMaXN0IHBoYXNlTGlzdCA9IG9wZXJhdGlvbi5nZXRQaGFzZXNPdXRGbG93KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGhhc2VMaXN0LnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBQaGFzZSBvcGVyYXRpb25TcGVjaWZpY1BoYXNlID0gKFBoYXNlKXBoYXNlTGlzdC5nZXQoaSk7Ci0gICAgICAgICAgICBpZiAoUGhhc2VNZXRhZGF0YS5QSEFTRV9QT0xJQ1lfREVURVJNSU5BVElPTgotICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKG9wZXJhdGlvblNwZWNpZmljUGhhc2UuZ2V0UGhhc2VOYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgLy9waGFzZTEuYWRkSGFuZGxlcihuZXcgVGVzdEhhbmRsZXIoIkNPdXQxIikpOwotICAgICAgICAgICAgICAgIFRlc3RIYW5kbGVyIGNsaWVudE91dGJvdW5kSGFuZGxlciA9IG5ldyBUZXN0SGFuZGxlcigiQ091dDEiKTsKLSAgICAgICAgICAgICAgICBjbGllbnRPdXRib3VuZEhhbmRsZXIuc2hvdWxkRmFpbCh0cnVlKTsKLSAgICAgICAgICAgICAgICBvcGVyYXRpb25TcGVjaWZpY1BoYXNlLmFkZEhhbmRsZXIoY2xpZW50T3V0Ym91bmRIYW5kbGVyKTsKLSAgICAgICAgICAgICAgICAvL3BoYXNlMS5hZGRIYW5kbGVyKGNsaWVudE91dGJvdW5kSGFuZGxlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgT01FbGVtZW50IHJlc3VsdCA9IHNlbmRlci5zZW5kUmVjZWl2ZShwYXlsb2FkKTsKLSAgICAgICAgICAgIGZhaWwoIkFuIGV4cGVjdGVkIGhhbmRsZXIgZmFpbHVyZSBkaWQgbm90IG9jY3VyIik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEF4aXNGYXVsdCBlKSB7Ci0gICAgICAgIH0KLSAgICAgICAgTGlzdCBleHBlY3RlZEV4ZWN1dGlvblN0YXRlID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAia2Fib29tIiB9KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkRXhlY3V0aW9uU3RhdGUsIHRlc3RSZXN1bHRzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xpZW50c2lkZUhhbmRsZXJGYWlsdXJlSW5PdXRib3VuZFBoYXNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU3RhcnRpbmcgdGVzdENsaWVudHNpZGVIYW5kbGVyRmFpbHVyZUluT3V0Ym91bmRQaGFzZSIpOwotCi0gICAgICAgIE9NRWxlbWVudCBwYXlsb2FkID0gVGVzdGluZ1V0aWxzLmNyZWF0ZUR1bW15T01FbGVtZW50KCk7Ci0gICAgICAgIFNlcnZpY2VDbGllbnQgc2VuZGVyID0gY3JlYXRlQ2xpZW50KCk7Ci0KLSAgICAgICAgQXhpc09wZXJhdGlvbiBvcGVyYXRpb24gPQotICAgICAgICAgICAgICAgIHNlbmRlci5nZXRBeGlzU2VydmljZSgpLmdldE9wZXJhdGlvbihTZXJ2aWNlQ2xpZW50LkFOT05fT1VUX0lOX09QKTsKLSAgICAgICAgQXJyYXlMaXN0IG9wZXJhdGlvblNwZWNpZmljUGhhc2VzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBvcGVyYXRpb25TcGVjaWZpY1BoYXNlcy5hZGQobmV3IFBoYXNlKFBoYXNlTWV0YWRhdGEuUEhBU0VfUE9MSUNZX0RFVEVSTUlOQVRJT04pKTsKLSAgICAgICAgb3BlcmF0aW9uLnNldFBoYXNlc091dEZsb3cob3BlcmF0aW9uU3BlY2lmaWNQaGFzZXMpOwotICAgICAgICBBcnJheUxpc3QgcGhhc2VMaXN0ID0gb3BlcmF0aW9uLmdldFBoYXNlc091dEZsb3coKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwaGFzZUxpc3Quc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIFBoYXNlIG9wZXJhdGlvblNwZWNpZmljUGhhc2UgPSAoUGhhc2UpcGhhc2VMaXN0LmdldChpKTsKLSAgICAgICAgICAgIGlmIChQaGFzZU1ldGFkYXRhLlBIQVNFX1BPTElDWV9ERVRFUk1JTkFUSU9OCi0gICAgICAgICAgICAgICAgICAgIC5lcXVhbHMob3BlcmF0aW9uU3BlY2lmaWNQaGFzZS5nZXRQaGFzZU5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICBvcGVyYXRpb25TcGVjaWZpY1BoYXNlLmFkZEhhbmRsZXIobmV3IFRlc3RIYW5kbGVyKCJDT3V0MSIpKTsKLSAgICAgICAgICAgICAgICBUZXN0SGFuZGxlciBjbGllbnRPdXRib3VuZEhhbmRsZXIgPSBuZXcgVGVzdEhhbmRsZXIoIkNPdXQyIik7Ci0gICAgICAgICAgICAgICAgY2xpZW50T3V0Ym91bmRIYW5kbGVyLnNob3VsZEZhaWwodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgb3BlcmF0aW9uU3BlY2lmaWNQaGFzZS5hZGRIYW5kbGVyKGNsaWVudE91dGJvdW5kSGFuZGxlcik7Ci0gICAgICAgICAgICAgICAgb3BlcmF0aW9uU3BlY2lmaWNQaGFzZS5hZGRIYW5kbGVyKG5ldyBUZXN0SGFuZGxlcigiQ091dDMiKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgT01FbGVtZW50IHJlc3VsdCA9IHNlbmRlci5zZW5kUmVjZWl2ZShwYXlsb2FkKTsKLSAgICAgICAgICAgIGZhaWwoIkFuIGV4cGVjdGVkIGhhbmRsZXIgZmFpbHVyZSBkaWQgbm90IG9jY3VyIik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEF4aXNGYXVsdCBlKSB7Ci0gICAgICAgIH0KLSAgICAgICAgTGlzdCBleHBlY3RlZEV4ZWN1dGlvblN0YXRlID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiQ091dDEiLCAia2Fib29tIiwgIkZDQ091dDEiIH0pOwotICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRFeGVjdXRpb25TdGF0ZSwgdGVzdFJlc3VsdHMpOwotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENsaWVudHNpZGVIYW5kbGVyRmFpbHVyZUluSW5ib3VuZE9wZXJhdGlvblNwZWNpZmljUGhhc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTdGFydGluZyB0ZXN0Q2xpZW50c2lkZUhhbmRsZXJGYWlsdXJlSW5JbmJvdW5kT3BlcmF0aW9uU3BlY2lmaWMiKTsKLQotICAgICAgICBPTUVsZW1lbnQgcGF5bG9hZCA9IFRlc3RpbmdVdGlscy5jcmVhdGVEdW1teU9NRWxlbWVudCgpOwotICAgICAgICBTZXJ2aWNlQ2xpZW50IHNlbmRlciA9IGNyZWF0ZUNsaWVudCgpOwotCi0gICAgICAgIEF4aXNPcGVyYXRpb24gb3BlcmF0aW9uID0KLSAgICAgICAgICAgICAgICBzZW5kZXIuZ2V0QXhpc1NlcnZpY2UoKS5nZXRPcGVyYXRpb24oU2VydmljZUNsaWVudC5BTk9OX09VVF9JTl9PUCk7Ci0gICAgICAgIEFycmF5TGlzdCBvcGVyYXRpb25TcGVjaWZpY1BoYXNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgb3BlcmF0aW9uU3BlY2lmaWNQaGFzZXMuYWRkKG5ldyBQaGFzZShQaGFzZU1ldGFkYXRhLlBIQVNFX1BPTElDWV9ERVRFUk1JTkFUSU9OKSk7Ci0gICAgICAgIG9wZXJhdGlvbi5zZXRSZW1haW5pbmdQaGFzZXNJbkZsb3cob3BlcmF0aW9uU3BlY2lmaWNQaGFzZXMpOwotICAgICAgICBBcnJheUxpc3QgcGhhc2VMaXN0ID0gb3BlcmF0aW9uLmdldFJlbWFpbmluZ1BoYXNlc0luRmxvdygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBoYXNlTGlzdC5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgUGhhc2Ugb3BlcmF0aW9uU3BlY2lmaWNQaGFzZSA9IChQaGFzZSlwaGFzZUxpc3QuZ2V0KGkpOwotICAgICAgICAgICAgaWYgKFBoYXNlTWV0YWRhdGEuUEhBU0VfUE9MSUNZX0RFVEVSTUlOQVRJT04KLSAgICAgICAgICAgICAgICAgICAgLmVxdWFscyhvcGVyYXRpb25TcGVjaWZpY1BoYXNlLmdldFBoYXNlTmFtZSgpKSkgewotICAgICAgICAgICAgICAgIG9wZXJhdGlvblNwZWNpZmljUGhhc2UuYWRkSGFuZGxlcihuZXcgVGVzdEhhbmRsZXIoIkNJbjEiKSk7Ci0gICAgICAgICAgICAgICAgVGVzdEhhbmRsZXIgY2xpZW50T3V0Ym91bmRIYW5kbGVyID0gbmV3IFRlc3RIYW5kbGVyKCJDSW4yIik7Ci0gICAgICAgICAgICAgICAgY2xpZW50T3V0Ym91bmRIYW5kbGVyLnNob3VsZEZhaWwodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgb3BlcmF0aW9uU3BlY2lmaWNQaGFzZS5hZGRIYW5kbGVyKGNsaWVudE91dGJvdW5kSGFuZGxlcik7Ci0gICAgICAgICAgICAgICAgb3BlcmF0aW9uU3BlY2lmaWNQaGFzZS5hZGRIYW5kbGVyKG5ldyBUZXN0SGFuZGxlcigiQ0luMyIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgcmVzdWx0ID0gc2VuZGVyLnNlbmRSZWNlaXZlKHBheWxvYWQpOwotICAgICAgICAgICAgZmFpbCgiQW4gZXhwZWN0ZWQgaGFuZGxlciBmYWlsdXJlIGRpZCBub3Qgb2NjdXIiKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoQXhpc0ZhdWx0IGUpIHsKLSAgICAgICAgfQotCi0gICAgICAgIExpc3QgZXhwZWN0ZWRFeGVjdXRpb25TdGF0ZSA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIkluMSIsICJJbjIiLCAiSW4zIiwgIkluNCIsCi0gICAgICAgICAgICAgICAgIkluNSIsICJJbjYiLCAiT3V0MSIsICJPdXQyIiwgIk91dDMiLCAiRkNPdXQzIiwgIkZDT3V0MiIsICJGQ091dDEiLCAiRkNJbjYiLAotICAgICAgICAgICAgICAgICJGQ0luNSIsICJGQ0luNCIsICJGQ0luMyIsICJGQ0luMiIsICJGQ0luMSIsICJDSW4xIiwgImthYm9vbSIsICJGQ0NJbjEiIH0pOwotICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRFeGVjdXRpb25TdGF0ZSwgdGVzdFJlc3VsdHMpOwotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgVGVzdEhhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIgewotICAgICAgICBwcml2YXRlIFN0cmluZyBoYW5kbGVyTmFtZTsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIHNob3VsZEZhaWw7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBzaG91bGRQYXVzZTsKLQotICAgICAgICBwdWJsaWMgVGVzdEhhbmRsZXIoU3RyaW5nIGhhbmRsZXJOYW1lKSB7Ci0gICAgICAgICAgICB0aGlzLmhhbmRsZXJOYW1lID0gaGFuZGxlck5hbWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzaG91bGRGYWlsKGJvb2xlYW4gZmFpbCkgewotICAgICAgICAgICAgdGhpcy5zaG91bGRGYWlsID0gZmFpbDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNob3VsZFBhdXNlKGJvb2xlYW4gcGF1c2UpIHsKLSAgICAgICAgICAgIHRoaXMuc2hvdWxkUGF1c2UgPSBwYXVzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBJbnZvY2F0aW9uUmVzcG9uc2UgaW52b2tlKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUZXN0SGFuZGxlciAiICsgaGFuZGxlck5hbWUgKyAiIGludm9rZWQiKTsKLSAgICAgICAgICAgIGlmIChzaG91bGRGYWlsKSB7Ci0gICAgICAgICAgICAgICAgdGVzdFJlc3VsdHMuYWRkKCJrYWJvb20iKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkhhbmRsZXIgd2VudCBrYWJvb20iKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJIYW5kbGVyIGZhaWxlZCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGVzdFJlc3VsdHMuYWRkKGhhbmRsZXJOYW1lKTsKLSAgICAgICAgICAgIHJldHVybiBJbnZvY2F0aW9uUmVzcG9uc2UuQ09OVElOVUU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBmbG93Q29tcGxldGUoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUZXN0SGFuZGxlciAiICsgaGFuZGxlck5hbWUgKyAiIGNhbGxlZCBmb3IgZmxvd0NvbXBsZXRlKCkiKTsKLSAgICAgICAgICAgIHRlc3RSZXN1bHRzLmFkZCgiRkMiICsgaGFuZGxlck5hbWUpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9IYW5kbGVyRmFpbHVyZVRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvSGFuZGxlckZhaWx1cmVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlYjZmMWMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9IYW5kbGVyRmFpbHVyZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5lbmdpbmU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLnV0aWwuU3RBWFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50LlNlcnZpY2VDbGllbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaGFuZGxlcnMuQWJzdHJhY3RIYW5kbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaW50ZWdyYXRpb24uTG9jYWxUZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmludGVncmF0aW9uLlRlc3RpbmdVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmludGVncmF0aW9uLlV0aWxTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5waGFzZXJlc29sdmVyLlBoYXNlTWV0YWRhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLQotcHVibGljIGNsYXNzIEhhbmRsZXJGYWlsdXJlVGVzdCBleHRlbmRzIExvY2FsVGVzdENhc2UgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhIYW5kbGVyRmFpbHVyZVRlc3QuY2xhc3MpOwotCi0gICAgcHJpdmF0ZSBIYW5kbGVyIGN1bHByaXQgPSBuZXcgQWJzdHJhY3RIYW5kbGVyKCkgewotICAgICAgICBwdWJsaWMgSW52b2NhdGlvblJlc3BvbnNlIGludm9rZShNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoVXRpbFNlcnZlci5GQUlMVVJFX01FU1NBR0UpOwotICAgICAgICB9Ci0gICAgfTsKLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb257Ci0gICAgCXN1cGVyLnNldFVwKCk7Ci0gICAgCUF4aXNTZXJ2aWNlIGFzID0gZGVwbG95Q2xhc3NBc1NlcnZpY2UoRWNoby5TRVJWSUNFX05BTUUsIEVjaG8uY2xhc3MpOwotICAgIAlBeGlzT3BlcmF0aW9uIG9wZXJhdGlvbiA9IGFzLmdldE9wZXJhdGlvbihuZXcgUU5hbWUoRWNoby5FQ0hPX09NX0VMRU1FTlRfT1BfTkFNRSkpOwotICAgIAkKLSAgICAJQXJyYXlMaXN0IHBoYXNlYyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgcGhhc2VjLmFkZChuZXcgUGhhc2UoUGhhc2VNZXRhZGF0YS5QSEFTRV9QT0xJQ1lfREVURVJNSU5BVElPTikpOwotICAgICAgICBvcGVyYXRpb24uc2V0UmVtYWluaW5nUGhhc2VzSW5GbG93KHBoYXNlYyk7Ci0gICAgICAgIEFycmF5TGlzdCBwaGFzZSA9IG9wZXJhdGlvbi5nZXRSZW1haW5pbmdQaGFzZXNJbkZsb3coKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwaGFzZS5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgUGhhc2UgcGhhc2UxID0gKFBoYXNlKXBoYXNlLmdldChpKTsKLSAgICAgICAgICAgIGlmIChQaGFzZU1ldGFkYXRhLlBIQVNFX1BPTElDWV9ERVRFUk1JTkFUSU9OLmVxdWFscyhwaGFzZTEuZ2V0UGhhc2VOYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgcGhhc2UxLmFkZEhhbmRsZXIoY3VscHJpdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmFpbHVyZUF0U2VydmVyUmVxdWVzdEZsb3coKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNlcnZpY2VDbGllbnQgc2VuZGVyID0gZ2V0Q2xpZW50KEVjaG8uU0VSVklDRV9OQU1FLCBFY2hvLkVDSE9fT01fRUxFTUVOVF9PUF9OQU1FKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgT01FbGVtZW50IHJlc3VsdCA9IHNlbmRlci5zZW5kUmVjZWl2ZShUZXN0aW5nVXRpbHMuY3JlYXRlRHVtbXlPTUVsZW1lbnQoKSk7Ci0gICAgICAgICAgICByZXN1bHQuc2VyaWFsaXplQW5kQ29uc3VtZShTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtV3JpdGVyKFN5c3RlbS5vdXQpKTsKLSAgICAgICAgICAgIGZhaWwoInRoZSB0ZXN0IG11c3QgZmFpbCBkdWUgdG8gdGhlIGludGVudGlvbmFsIGZhaWx1cmUgb2YgdGhlIFwiY3VscHJpdFwiIGhhbmRsZXIiKTsKLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGUpIHsKLSAgICAgICAgICAgIGxvZy5pbmZvKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gZS5nZXRNZXNzYWdlKCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKChtZXNzYWdlLmluZGV4T2YoVXRpbFNlcnZlci5GQUlMVVJFX01FU1NBR0UpKSA+PSAwKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9NZXNzYWdlQ29udGV4dENoYW5nZVRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvTWVzc2FnZUNvbnRleHRDaGFuZ2VUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyMTViMzAuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9NZXNzYWdlQ29udGV4dENoYW5nZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZW5naW5lOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLXB1YmxpYyBjbGFzcyBNZXNzYWdlQ29udGV4dENoYW5nZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coTWVzc2FnZUNvbnRleHRDaGFuZ2VUZXN0LmNsYXNzKTsKLSAgICAKLSAgICBwcml2YXRlIEZpZWxkRGVzY3JpcHRpb25bXSBrbm93bkxpc3QgPSB7Ci0gICAgICAgICAgICBuZXcgRmllbGREZXNjcmlwdGlvbigib3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nIiwgImxvZyIpLAotICAgICAgICAgICAgbmV3IEZpZWxkRGVzY3JpcHRpb24oImphdmEubGFuZy5TdHJpbmciLCAibG9nQ29ycmVsYXRpb25JRCIpLAotICAgICAgICAgICAgbmV3IEZpZWxkRGVzY3JpcHRpb24oImphdmEubGFuZy5TdHJpbmciLCAibG9nQ29ycmVsYXRpb25JRFN0cmluZyIpLAotICAgICAgICAgICAgbmV3IEZpZWxkRGVzY3JpcHRpb24oImphdmEubGFuZy5TdHJpbmciLCAibXlDbGFzc05hbWUiKSwKLSAgICAgICAgICAgIG5ldyBGaWVsZERlc2NyaXB0aW9uKCJsb25nIiwgInNlcmlhbFZlcnNpb25VSUQiKSwKLSAgICAgICAgICAgIG5ldyBGaWVsZERlc2NyaXB0aW9uKCJpbnQiLCAiUkVWSVNJT05fMiIpLAotICAgICAgICAgICAgbmV3IEZpZWxkRGVzY3JpcHRpb24oImludCIsICJyZXZpc2lvbklEIiksCi0gICAgICAgICAgICBuZXcgRmllbGREZXNjcmlwdGlvbigiamF2YS5sYW5nLlRocmVhZExvY2FsIiwgImN1cnJlbnRNZXNzYWdlQ29udGV4dCIpLAotICAgICAgICAgICAgbmV3IEZpZWxkRGVzY3JpcHRpb24oIm9yZy5hcGFjaGUuYXhpczIuY2xpZW50Lk9wdGlvbnMiLCAib3B0aW9ucyIpLAotICAgICAgICAgICAgbmV3IEZpZWxkRGVzY3JpcHRpb24oImludCIsICJJTl9GTE9XIiksCi0gICAgICAgICAgICBuZXcgRmllbGREZXNjcmlwdGlvbigiaW50IiwgIklOX0ZBVUxUX0ZMT1ciKSwKLSAgICAgICAgICAgIG5ldyBGaWVsZERlc2NyaXB0aW9uKCJpbnQiLCAiT1VUX0ZMT1ciKSwKLSAgICAgICAgICAgIG5ldyBGaWVsZERlc2NyaXB0aW9uKCJpbnQiLCAiT1VUX0ZBVUxUX0ZMT1ciKSwKLSAgICAgICAgICAgIG5ldyBGaWVsZERlc2NyaXB0aW9uKCJqYXZhLmxhbmcuU3RyaW5nIiwgIlJFTU9URV9BRERSIiksCi0gICAgICAgICAgICBuZXcgRmllbGREZXNjcmlwdGlvbigiamF2YS5sYW5nLlN0cmluZyIsICJUUkFOU1BPUlRfQUREUiIpLAotICAgICAgICAgICAgbmV3IEZpZWxkRGVzY3JpcHRpb24oImphdmEubGFuZy5TdHJpbmciLCAiVFJBTlNQT1JUX0hFQURFUlMiKSwKLSAgICAgICAgICAgIG5ldyBGaWVsZERlc2NyaXB0aW9uKCJvcmcuYXBhY2hlLmF4aW9tLmF0dGFjaG1lbnRzLkF0dGFjaG1lbnRzIiwgImF0dGFjaG1lbnRzIiksCi0gICAgICAgICAgICBuZXcgRmllbGREZXNjcmlwdGlvbigiamF2YS5sYW5nLlN0cmluZyIsICJUUkFOU1BPUlRfT1VUIiksCi0gICAgICAgICAgICBuZXcgRmllbGREZXNjcmlwdGlvbigiamF2YS5sYW5nLlN0cmluZyIsICJUUkFOU1BPUlRfSU4iKSwKLSAgICAgICAgICAgIG5ldyBGaWVsZERlc2NyaXB0aW9uKCJqYXZhLmxhbmcuU3RyaW5nIiwgIkNIQVJBQ1RFUl9TRVRfRU5DT0RJTkciKSwKLSAgICAgICAgICAgIG5ldyBGaWVsZERlc2NyaXB0aW9uKCJqYXZhLmxhbmcuU3RyaW5nIiwgIlVURl84IiksCi0gICAgICAgICAgICBuZXcgRmllbGREZXNjcmlwdGlvbigiamF2YS5sYW5nLlN0cmluZyIsICJVVEZfMTYiKSwKLSAgICAgICAgICAgIG5ldyBGaWVsZERlc2NyaXB0aW9uKCJqYXZhLmxhbmcuU3RyaW5nIiwgIlRSQU5TUE9SVF9TVUNDRUVEIiksCi0gICAgICAgICAgICBuZXcgRmllbGREZXNjcmlwdGlvbigiamF2YS5sYW5nLlN0cmluZyIsICJERUZBVUxUX0NIQVJfU0VUX0VOQ09ESU5HIiksCi0gICAgICAgICAgICBuZXcgRmllbGREZXNjcmlwdGlvbigiaW50IiwgIkZMT1ciKSwKLSAgICAgICAgICAgIG5ldyBGaWVsZERlc2NyaXB0aW9uKCJqYXZhLmxhbmcuU3RyaW5nIiwgIlRSQU5TUE9SVF9OT05fQkxPQ0tJTkciKSwKLSAgICAgICAgICAgIG5ldyBGaWVsZERlc2NyaXB0aW9uKCJqYXZhLmxhbmcuU3RyaW5nIiwgIkRJU0FCTEVfQVNZTkNfQ0FMTEJBQ0tfT05fVFJBTlNQT1JUX0VSUk9SIiksCi0gICAgICAgICAgICBuZXcgRmllbGREZXNjcmlwdGlvbigiYm9vbGVhbiIsICJwcm9jZXNzaW5nRmF1bHQiKSwKLSAgICAgICAgICAgIG5ldyBGaWVsZERlc2NyaXB0aW9uKCJib29sZWFuIiwgInBhdXNlZCIpLAotICAgICAgICAgICAgbmV3IEZpZWxkRGVzY3JpcHRpb24oImJvb2xlYW4iLCAib3V0cHV0V3JpdHRlbiIpLAotICAgICAgICAgICAgbmV3IEZpZWxkRGVzY3JpcHRpb24oImJvb2xlYW4iLCAibmV3VGhyZWFkUmVxdWlyZWQiKSwKLSAgICAgICAgICAgIG5ldyBGaWVsZERlc2NyaXB0aW9uKCJib29sZWFuIiwgImlzU09BUDExIiksCi0gICAgICAgICAgICBuZXcgRmllbGREZXNjcmlwdGlvbigiamF2YS51dGlsLkFycmF5TGlzdCIsICJleGVjdXRpb25DaGFpbiIpLAotICAgICAgICAgICAgbmV3IEZpZWxkRGVzY3JpcHRpb24oImphdmEudXRpbC5MaW5rZWRMaXN0IiwgImV4ZWN1dGVkUGhhc2VzIiksCi0gICAgICAgICAgICBuZXcgRmllbGREZXNjcmlwdGlvbigiYm9vbGVhbiIsICJkb2luZ1JFU1QiKSwKLSAgICAgICAgICAgIG5ldyBGaWVsZERlc2NyaXB0aW9uKCJib29sZWFuIiwgImRvaW5nTVRPTSIpLAotICAgICAgICAgICAgbmV3IEZpZWxkRGVzY3JpcHRpb24oImJvb2xlYW4iLCAiZG9pbmdTd0EiKSwKLSAgICAgICAgICAgIG5ldyBGaWVsZERlc2NyaXB0aW9uKCJvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNNZXNzYWdlIiwgImF4aXNNZXNzYWdlIiksCi0gICAgICAgICAgICBuZXcgRmllbGREZXNjcmlwdGlvbigib3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uIiwgImF4aXNPcGVyYXRpb24iKSwKLSAgICAgICAgICAgIG5ldyBGaWVsZERlc2NyaXB0aW9uKCJvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlIiwgImF4aXNTZXJ2aWNlIiksCi0gICAgICAgICAgICBuZXcgRmllbGREZXNjcmlwdGlvbigib3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZUdyb3VwIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJheGlzU2VydmljZUdyb3VwIiksCi0gICAgICAgICAgICBuZXcgRmllbGREZXNjcmlwdGlvbigib3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb25maWd1cmF0aW9uQ29udGV4dCIpLAotICAgICAgICAgICAgbmV3IEZpZWxkRGVzY3JpcHRpb24oImludCIsICJjdXJyZW50SGFuZGxlckluZGV4IiksCi0gICAgICAgICAgICBuZXcgRmllbGREZXNjcmlwdGlvbigiaW50IiwgImN1cnJlbnRQaGFzZUluZGV4IiksCi0gICAgICAgICAgICBuZXcgRmllbGREZXNjcmlwdGlvbigib3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZSIsICJlbnZlbG9wZSIpLAotICAgICAgICAgICAgbmV3IEZpZWxkRGVzY3JpcHRpb24oIm9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5PcGVyYXRpb25Db250ZXh0IiwgIm9wZXJhdGlvbkNvbnRleHQiKSwKLSAgICAgICAgICAgIG5ldyBGaWVsZERlc2NyaXB0aW9uKCJib29sZWFuIiwgInJlc3BvbnNlV3JpdHRlbiIpLAotICAgICAgICAgICAgbmV3IEZpZWxkRGVzY3JpcHRpb24oImJvb2xlYW4iLCAic2VydmVyU2lkZSIpLAotICAgICAgICAgICAgbmV3IEZpZWxkRGVzY3JpcHRpb24oIm9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5TZXJ2aWNlQ29udGV4dCIsICJzZXJ2aWNlQ29udGV4dCIpLAotICAgICAgICAgICAgbmV3IEZpZWxkRGVzY3JpcHRpb24oImphdmEubGFuZy5TdHJpbmciLCAic2VydmljZUNvbnRleHRJRCIpLAotICAgICAgICAgICAgbmV3IEZpZWxkRGVzY3JpcHRpb24oIm9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5TZXJ2aWNlR3JvdXBDb250ZXh0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXJ2aWNlR3JvdXBDb250ZXh0IiksCi0gICAgICAgICAgICBuZXcgRmllbGREZXNjcmlwdGlvbigiamF2YS5sYW5nLlN0cmluZyIsICJzZXJ2aWNlR3JvdXBDb250ZXh0SWQiKSwKLSAgICAgICAgICAgIG5ldyBGaWVsZERlc2NyaXB0aW9uKCJvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuU2Vzc2lvbkNvbnRleHQiLCAic2Vzc2lvbkNvbnRleHQiKSwKLSAgICAgICAgICAgIG5ldyBGaWVsZERlc2NyaXB0aW9uKCJvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlRyYW5zcG9ydE91dERlc2NyaXB0aW9uIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0cmFuc3BvcnRPdXQiKSwKLSAgICAgICAgICAgIG5ldyBGaWVsZERlc2NyaXB0aW9uKCJvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlRyYW5zcG9ydEluRGVzY3JpcHRpb24iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRyYW5zcG9ydEluIiksCi0gICAgICAgICAgICBuZXcgRmllbGREZXNjcmlwdGlvbigiamF2YS5sYW5nLlN0cmluZyIsICJpbmNvbWluZ1RyYW5zcG9ydE5hbWUiKSwKLSAgICAgICAgICAgIG5ldyBGaWVsZERlc2NyaXB0aW9uKCJqYXZhLnV0aWwuTGlua2VkSGFzaE1hcCIsICJzZWxmTWFuYWdlZERhdGFNYXAiKSwKLSAgICAgICAgICAgIG5ldyBGaWVsZERlc2NyaXB0aW9uKCJib29sZWFuIiwgIm5lZWRzVG9CZVJlY29uY2lsZWQiKSwKLSAgICAgICAgICAgIG5ldyBGaWVsZERlc2NyaXB0aW9uKCJpbnQiLCAic2VsZk1hbmFnZWREYXRhSGFuZGxlckNvdW50IiksCi0gICAgICAgICAgICBuZXcgRmllbGREZXNjcmlwdGlvbigiamF2YS51dGlsLkFycmF5TGlzdCIsICJzZWxmTWFuYWdlZERhdGFMaXN0SG9sZGVyIiksCi0gICAgICAgICAgICBuZXcgRmllbGREZXNjcmlwdGlvbigiamF2YS51dGlsLkFycmF5TGlzdCIsICJtZXRhRXhlY3V0aW9uQ2hhaW4iKSwKLSAgICAgICAgICAgIG5ldyBGaWVsZERlc2NyaXB0aW9uKCJqYXZhLnV0aWwuTGlua2VkTGlzdCIsICJtZXRhRXhlY3V0ZWQiKSwKLSAgICAgICAgICAgIG5ldyBGaWVsZERlc2NyaXB0aW9uKCJpbnQiLCAibWV0YUhhbmRsZXJJbmRleCIpLAotICAgICAgICAgICAgbmV3IEZpZWxkRGVzY3JpcHRpb24oImludCIsICJtZXRhUGhhc2VJbmRleCIpLAotICAgICAgICAgICAgbmV3IEZpZWxkRGVzY3JpcHRpb24oIm9yZy5hcGFjaGUuYXhpczIudXRpbC5NZXRhRGF0YUVudHJ5IiwgIm1ldGFBeGlzT3BlcmF0aW9uIiksCi0gICAgICAgICAgICBuZXcgRmllbGREZXNjcmlwdGlvbigib3JnLmFwYWNoZS5heGlzMi51dGlsLk1ldGFEYXRhRW50cnkiLCAibWV0YUF4aXNTZXJ2aWNlIiksCi0gICAgICAgICAgICBuZXcgRmllbGREZXNjcmlwdGlvbigib3JnLmFwYWNoZS5heGlzMi51dGlsLk1ldGFEYXRhRW50cnkiLCAibWV0YUF4aXNTZXJ2aWNlR3JvdXAiKSwKLSAgICAgICAgICAgIG5ldyBGaWVsZERlc2NyaXB0aW9uKCJvcmcuYXBhY2hlLmF4aXMyLnV0aWwuTWV0YURhdGFFbnRyeSIsICJtZXRhVHJhbnNwb3J0T3V0IiksCi0gICAgICAgICAgICBuZXcgRmllbGREZXNjcmlwdGlvbigib3JnLmFwYWNoZS5heGlzMi51dGlsLk1ldGFEYXRhRW50cnkiLCAibWV0YVRyYW5zcG9ydEluIiksCi0gICAgICAgICAgICBuZXcgRmllbGREZXNjcmlwdGlvbigib3JnLmFwYWNoZS5heGlzMi51dGlsLk1ldGFEYXRhRW50cnkiLCAibWV0YUF4aXNNZXNzYWdlIiksCi0gICAgICAgICAgICBuZXcgRmllbGREZXNjcmlwdGlvbigiYm9vbGVhbiIsICJyZWNvbmNpbGVBeGlzTWVzc2FnZSIpLAotICAgICAgICAgICAgbmV3IEZpZWxkRGVzY3JpcHRpb24oImJvb2xlYW4iLCAiZXhlY3V0ZWRQaGFzZXNSZXNldCIpLAotICAgICAgICAgICAgbmV3IEZpZWxkRGVzY3JpcHRpb24oImphdmEubGFuZy5TdHJpbmciLCAic2VsZk1hbmFnZWREYXRhRGVsaW1pdGVyIiksCi0vLyAgICAgICAgICAgIG5ldyBGaWVsZERlc2NyaXB0aW9uKCJqYXZhLmxhbmcuQ2xhc3MiLAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyJjbGFzcyRvcmckYXBhY2hlJGF4aXMyJGNvbnRleHQkTWVzc2FnZUNvbnRleHQiLCJjbGFzcyQwIn0pLAotLy8gICAgICAgICAgICBuZXcgRmllbGREZXNjcmlwdGlvbigiamF2YS5sYW5nLkNsYXNzIiwKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsiY2xhc3Mkb3JnJGFwYWNoZSRheGlzMiRjb250ZXh0JFNlbGZNYW5hZ2VkRGF0YU1hbmFnZXIiLCJjbGFzcyQxIn0pLAotICAgICAgICAgICAgbmV3IEZpZWxkRGVzY3JpcHRpb24oImphdmEubGFuZy5FeGNlcHRpb24iLCAiZmFpbHVyZVJlYXNvbiIpLAotICAgIH07Ci0KLQotICAgIHB1YmxpYyBNZXNzYWdlQ29udGV4dENoYW5nZVRlc3QoU3RyaW5nIGFyZzApIHsKLSAgICAgICAgc3VwZXIoYXJnMCk7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2hhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGJvb2xlYW4gbm9DaGFuZ2UgPSB0cnVlOwotCi0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1jID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7Ci0KLSAgICAgICAgQ2xhc3MgbWNDbGFzcyA9IG1jLmdldENsYXNzKCk7Ci0KLSAgICAgICAgRmllbGQgW10gZmllbGRzID0gbWNDbGFzcy5nZXREZWNsYXJlZEZpZWxkcygpOwotICAgICAgICBpbnQgbnVtYmVyRmllbGRzID0gZmllbGRzLmxlbmd0aDsKLQotICAgICAgICBpbnQgbnVtYmVyS25vd25GaWVsZHMgPSBrbm93bkxpc3QubGVuZ3RoOwotCi0gICAgICAgIGlmIChudW1iZXJLbm93bkZpZWxkcyAhPSBudW1iZXJGaWVsZHMpIHsKLSAgICAgICAgICAgIGxvZy5lcnJvcigiRVJST1I6IG51bWJlciBvZiBhY3R1YWwgZmllbGRzIFsiICsgbnVtYmVyRmllbGRzICsKLSAgICAgICAgICAgICAgICAgICAgIl0gaW4gTWVzc2FnZUNvbnRleHQgZG9lcyBub3QgbWF0Y2ggdGhlIGV4cGVjdGVkIG51bWJlciBbIiArIG51bWJlcktub3duRmllbGRzICsKLSAgICAgICAgICAgICAgICAgICAgIl0iKTsKLSAgICAgICAgICAgIG5vQ2hhbmdlID0gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBmaXJzdCBjaGVjayB0aGUgZXhwZWN0ZWQgZmllbGRzIHdpdGggdGhlIGFjdHVhbCBmaWVsZHMKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcktub3duRmllbGRzOyBpKyspIHsKLSAgICAgICAgICAgIC8vIHNlZSBpZiB0aGlzIGVudHJ5IGlzIGluIHRoZSBhY3R1YWwgbGlzdAotICAgICAgICAgICAgU3RyaW5nW10gbmFtZXMgPSBrbm93bkxpc3RbaV0uZ2V0TmFtZXMoKTsKLSAgICAgICAgICAgIEZpZWxkIGFjdHVhbEZpZWxkID0gbnVsbDsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBhY3R1YWxGaWVsZCA9PSBudWxsICYmIGogPCBuYW1lcy5sZW5ndGg7IGorKykgewotICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gbmFtZXNbal07Ci0gICAgICAgICAgICAgICAgYWN0dWFsRmllbGQgPSBmaW5kRmllbGQoZmllbGRzLCBuYW1lKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGFjdHVhbEZpZWxkID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIkVSUk9SOiAgTWVzc2FnZUNvbnRleHQgaXMgbWlzc2luZyBmaWVsZCBbIiArIEFycmF5cy5hc0xpc3QobmFtZXMpICsgIl0iKTsKLSAgICAgICAgICAgICAgICBub0NoYW5nZSA9IGZhbHNlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcga25vd25UeXBlID0ga25vd25MaXN0W2ldLmdldFR5cGUoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgYWN0dWFsVHlwZSA9IGFjdHVhbEZpZWxkLmdldFR5cGUoKS5nZXROYW1lKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoIWtub3duVHlwZS5lcXVhbHMoYWN0dWFsVHlwZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKCJFUlJPUjogIE1lc3NhZ2VDb250ZXh0IGZpZWxkIFsiICsgQXJyYXlzLmFzTGlzdChuYW1lcykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJdIGV4cGVjdGVkIHR5cGUgWyIgKyBrbm93blR5cGUgKyAiXSBkb2VzIG5vdCBtYXRjaCBhY3R1YWwgdHlwZSBbIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsVHlwZSArICJdIik7Ci0gICAgICAgICAgICAgICAgICAgIG5vQ2hhbmdlID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gbmV4dCwgY2hlY2sgdGhlIGFjdHVhbCBmaWVsZHMgd2l0aCB0aGUgcHJlZGVmaW5lZCwga25vd24gZmllbGRzCi0KLSAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBudW1iZXJGaWVsZHM7IGorKykgewotICAgICAgICAgICAgU3RyaW5nIGRlc2NyaXB0aW9uID0gZmllbGRzW2pdLnRvU3RyaW5nKCk7Ci0KLSAgICAgICAgICAgIC8vIHNlZSBpZiB0aGlzIGVudHJ5IGlzIGluIHRoZSBwcmVkZWZpbmVkIGxpc3QKLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gZmllbGRzW2pdLmdldE5hbWUoKTsKLQotICAgICAgICAgICAgRmllbGREZXNjcmlwdGlvbiBmZCA9IGZpbmRGaWVsZERlc2NyaXB0aW9uKG5hbWUpOwotCi0gICAgICAgICAgICBpZiAoZmQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiRVJST1I6ICBNZXNzYWdlQ29udGV4dCBoYXMgbmV3IGZpZWxkIFsiICsgZGVzY3JpcHRpb24gKwotICAgICAgICAgICAgICAgICAgICAgICAgIl0gdGhhdCBuZWVkcyB0byBiZSBhc3Nlc3NlZCBmb3IgbWVzc2FnZSBjb250ZXh0IHNhdmUvcmVzdG9yZSBmdW5jdGlvbnMiKTsKLSAgICAgICAgICAgICAgICBub0NoYW5nZSA9IGZhbHNlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcga25vd25UeXBlID0gZmQuZ2V0VHlwZSgpOwotICAgICAgICAgICAgICAgIFN0cmluZyBhY3R1YWxUeXBlID0gZmllbGRzW2pdLmdldFR5cGUoKS5nZXROYW1lKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoIWtub3duVHlwZS5lcXVhbHMoYWN0dWFsVHlwZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKCJFUlJPUjogIE1lc3NhZ2VDb250ZXh0IGZpZWxkIFsiICsgbmFtZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIl0gZXhwZWN0ZWQgdHlwZSBbIiArIGtub3duVHlwZSArICJdIGRvZXMgbm90IG1hdGNoIGFjdHVhbCB0eXBlIFsiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWxUeXBlICsgIl0iKTsKLSAgICAgICAgICAgICAgICAgICAgbm9DaGFuZ2UgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0gICAgICAgIGFzc2VydFRydWUobm9DaGFuZ2UpOwotICAgIH0KLQotICAgIHByaXZhdGUgRmllbGQgZmluZEZpZWxkKEZpZWxkW10gZmllbGRzLCBTdHJpbmcgbmFtZSkgewotCi0gICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJmaW5kRmllbGQ6ICBsb29raW5nIGZvciBbIituYW1lKyJdIik7Ci0KLSAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCBmaWVsZHMubGVuZ3RoOyBrKyspIHsKLSAgICAgICAgICAgIFN0cmluZyBmaWVsZE5hbWUgPSBmaWVsZHNba10uZ2V0TmFtZSgpOwotICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oImZpZWxkTmFtZVsiK2srIl0gPSAgWyIrZmllbGROYW1lKyJdIik7Ci0KLSAgICAgICAgICAgIGlmIChmaWVsZE5hbWUuZXF1YWxzKG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZpZWxkc1trXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEZpZWxkRGVzY3JpcHRpb24gZmluZEZpZWxkRGVzY3JpcHRpb24oU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCBrbm93bkxpc3QubGVuZ3RoOyBrKyspIHsKLSAgICAgICAgICAgIFN0cmluZ1tdIGZpZWxkTmFtZSA9IGtub3duTGlzdFtrXS5nZXROYW1lcygpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZE5hbWUubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoZmllbGROYW1lW2ldLmVxdWFscyhuYW1lKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4ga25vd25MaXN0W2tdOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLQotICAgIHByaXZhdGUgY2xhc3MgRmllbGREZXNjcmlwdGlvbiB7Ci0gICAgICAgIFN0cmluZyB0eXBlID0gbnVsbDsKLSAgICAgICAgU3RyaW5nW10gbmFtZSA9IG51bGw7Ci0KLSAgICAgICAgLy8gY29uc3RydWN0b3IKLSAgICAgICAgcHVibGljIEZpZWxkRGVzY3JpcHRpb24oKSB7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjb25zdHJ1Y3RvcgotICAgICAgICBwdWJsaWMgRmllbGREZXNjcmlwdGlvbihTdHJpbmcgdCwgU3RyaW5nIG4pIHsKLSAgICAgICAgICAgIHR5cGUgPSB0OwotICAgICAgICAgICAgbmFtZSA9IG5ldyBTdHJpbmdbXXtufTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNvbnN0cnVjdG9yCi0gICAgICAgIHB1YmxpYyBGaWVsZERlc2NyaXB0aW9uKFN0cmluZyB0LCBTdHJpbmdbXSBuKSB7Ci0gICAgICAgICAgICB0eXBlID0gdDsKLSAgICAgICAgICAgIG5hbWUgPSBuOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotICAgICAgICAgICAgcmV0dXJuIHR5cGU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0TmFtZXMoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmFtZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFR5cGUoU3RyaW5nIHQpIHsKLSAgICAgICAgICAgIHR5cGUgPSB0OwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL01lc3NhZ2VDb250ZXh0U2F2ZUFUZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL01lc3NhZ2VDb250ZXh0U2F2ZUFUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3YjBjNTQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9NZXNzYWdlQ29udGV4dFNhdmVBVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMwNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZW5naW5lOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS51dGlsLlVVSURHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5PcGVyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5TZXJ2aWNlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuU2VydmljZUdyb3VwQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuZXh0ZXJuYWxpemUuQWN0aXZhdGVVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNNZXNzYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2VHcm91cDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkhhbmRsZXJEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkluT3V0QXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlRyYW5zcG9ydEluRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5UcmFuc3BvcnRPdXREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5SZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmhhbmRsZXJzLkFic3RyYWN0SGFuZGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5SYXdYTUxJTk9ubHlNZXNzYWdlUmVjZWl2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuUmF3WE1MSU5PdXRNZXNzYWdlUmVjZWl2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5Db21tb25zSFRUUFRyYW5zcG9ydFNlbmRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLlNpbXBsZUhUVFBTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGNsYXNzIE1lc3NhZ2VDb250ZXh0U2F2ZUFUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKE1lc3NhZ2VDb250ZXh0U2F2ZUFUZXN0LmNsYXNzKTsKLQotICAgIHByaXZhdGUgUU5hbWUgc2VydmljZU5hbWUgPSBuZXcgUU5hbWUoIlRlc3RTZXJ2aWNlIik7Ci0gICAgcHJpdmF0ZSBRTmFtZSBvcGVyYXRpb25OYW1lID0gbmV3IFFOYW1lKCJPcGVyYXRpb25fMSIpOwotCi0gICAgcHJpdmF0ZSBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWd1cmF0aW9uQ29udGV4dCA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTZXJ2aWNlR3JvdXBDb250ZXh0IHNlcnZpY2VHcm91cENvbnRleHQgPSBudWxsOwotICAgIHByaXZhdGUgT3BlcmF0aW9uQ29udGV4dCBvcGVyYXRpb25Db250ZXh0ID0gbnVsbDsKLQotICAgIHByaXZhdGUgQXhpc1NlcnZpY2VHcm91cCBheGlzU2VydmljZUdyb3VwID0gbnVsbDsKLSAgICBwcml2YXRlIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlID0gbnVsbDsKLSAgICBwcml2YXRlIEF4aXNPcGVyYXRpb24gYXhpc09wZXJhdGlvbiA9IG51bGw7Ci0gICAgcHJpdmF0ZSBBeGlzTWVzc2FnZSBheGlzTWVzc2FnZSA9IG51bGw7Ci0KLSAgICBwcml2YXRlIFBoYXNlIHBoYXNlMSA9IG51bGw7Ci0gICAgcHJpdmF0ZSBQaGFzZSBwaGFzZTIgPSBudWxsOwotICAgIHByaXZhdGUgUGhhc2UgcGhhc2UzID0gbnVsbDsKLSAgICBwcml2YXRlIFBoYXNlIHBoYXNlNCA9IG51bGw7Ci0gICAgcHJpdmF0ZSBQaGFzZSBwaGFzZTUgPSBudWxsOwotICAgIHByaXZhdGUgUGhhc2UgcGhhc2U2ID0gbnVsbDsKLSAgICBwcml2YXRlIFBoYXNlIHBoYXNlNyA9IG51bGw7Ci0KLSAgICBwcml2YXRlIE1lc3NhZ2VDb250ZXh0IG1jID0gbnVsbDsKLSAgICBwcml2YXRlIE1lc3NhZ2VDb250ZXh0IG1jMiA9IG51bGw7Ci0KLSAgICBwcml2YXRlIEFycmF5TGlzdCBleGVjdXRlZEhhbmRsZXJzID0gbnVsbDsKLQotICAgIHB1YmxpYyBNZXNzYWdlQ29udGV4dFNhdmVBVGVzdChTdHJpbmcgYXJnMCkgewotICAgICAgICBzdXBlcihhcmcwKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcHJlcGFyZSgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJNZXNzYWdlQ29udGV4dFNhdmVBVGVzdDpjb25zdHJ1Y3RvcjogIGVycm9yIGluIHNldHRpbmcgdXAgb2JqZWN0IGdyYXBoIFsiICsKLSAgICAgICAgICAgICAgICAgICAgZS5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgOiAiICsgZS5nZXRNZXNzYWdlKCkgKyAiXSIpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICAvLwotICAgIC8vIHByZXBhcmUgdGhlIG9iamVjdCBoaWVyYXJjaHkgZm9yIHRlc3RpbmcKLSAgICAvLwotICAgIHByaXZhdGUgdm9pZCBwcmVwYXJlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICBBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlndXJhdGlvbiA9IG5ldyBBeGlzQ29uZmlndXJhdGlvbigpOwotCi0gICAgICAgIGNvbmZpZ3VyYXRpb25Db250ZXh0ID0gbmV3IENvbmZpZ3VyYXRpb25Db250ZXh0KGF4aXNDb25maWd1cmF0aW9uKTsKLQotICAgICAgICBjb25maWd1cmF0aW9uQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpLmFkZE1lc3NhZ2VSZWNlaXZlcigKLSAgICAgICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC93c2RsL2luLW9ubHkiLCBuZXcgUmF3WE1MSU5Pbmx5TWVzc2FnZVJlY2VpdmVyKCkpOwotICAgICAgICBjb25maWd1cmF0aW9uQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpLmFkZE1lc3NhZ2VSZWNlaXZlcigKLSAgICAgICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC93c2RsL2luLW91dCIsIG5ldyBSYXdYTUxJTk91dE1lc3NhZ2VSZWNlaXZlcigpKTsKLQotICAgICAgICBEaXNwYXRjaFBoYXNlIGRpc3BhdGNoUGhhc2UgPSBuZXcgRGlzcGF0Y2hQaGFzZSgpOwotICAgICAgICBkaXNwYXRjaFBoYXNlLnNldE5hbWUoIkRpc3BhdGNoIik7Ci0KLSAgICAgICAgQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciBhYmQgPSBuZXcgQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlcigpOwotICAgICAgICBhYmQuaW5pdERpc3BhdGNoZXIoKTsKLQotICAgICAgICBSZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIHJ1ZCA9IG5ldyBSZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyKCk7Ci0gICAgICAgIHJ1ZC5pbml0RGlzcGF0Y2hlcigpOwotCi0gICAgICAgIFNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIgc2FiZCA9IG5ldyBTT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyKCk7Ci0gICAgICAgIHNhYmQuaW5pdERpc3BhdGNoZXIoKTsKLQotICAgICAgICBTT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIgc21iZCA9IG5ldyBTT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIoKTsKLSAgICAgICAgc21iZC5pbml0RGlzcGF0Y2hlcigpOwotCi0gICAgICAgIGRpc3BhdGNoUGhhc2UuYWRkSGFuZGxlcihhYmQpOwotICAgICAgICBkaXNwYXRjaFBoYXNlLmFkZEhhbmRsZXIocnVkKTsKLSAgICAgICAgZGlzcGF0Y2hQaGFzZS5hZGRIYW5kbGVyKHNhYmQpOwotICAgICAgICBkaXNwYXRjaFBoYXNlLmFkZEhhbmRsZXIoc21iZCk7Ci0KLSAgICAgICAgY29uZmlndXJhdGlvbkNvbnRleHQuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5nZXRJbkZsb3dQaGFzZXMoKS5hZGQoZGlzcGF0Y2hQaGFzZSk7Ci0KLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgIGF4aXNTZXJ2aWNlR3JvdXAgPSBuZXcgQXhpc1NlcnZpY2VHcm91cChheGlzQ29uZmlndXJhdGlvbik7Ci0gICAgICAgIGF4aXNTZXJ2aWNlR3JvdXAuc2V0U2VydmljZUdyb3VwTmFtZSgiU2VydmljZUdyb3VwVGVzdCIpOwotCi0KLSAgICAgICAgYXhpc1NlcnZpY2UgPSBuZXcgQXhpc1NlcnZpY2Uoc2VydmljZU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICBheGlzU2VydmljZUdyb3VwLmFkZFNlcnZpY2UoYXhpc1NlcnZpY2UpOwotCi0KLSAgICAgICAgYXhpc09wZXJhdGlvbiA9IG5ldyBJbk91dEF4aXNPcGVyYXRpb24ob3BlcmF0aW9uTmFtZSk7Ci0gICAgICAgIGF4aXNPcGVyYXRpb24uc2V0TWVzc2FnZVJlY2VpdmVyKG5ldyBNZXNzYWdlUmVjZWl2ZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCByZWNlaXZlKE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDdHgpIHsKLQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBheGlzU2VydmljZS5hZGRPcGVyYXRpb24oYXhpc09wZXJhdGlvbik7Ci0gICAgICAgIGF4aXNTZXJ2aWNlLm1hcEFjdGlvblRvT3BlcmF0aW9uKG9wZXJhdGlvbk5hbWUuZ2V0TG9jYWxQYXJ0KCksIGF4aXNPcGVyYXRpb24pOwotCi0KLSAgICAgICAgY29uZmlndXJhdGlvbkNvbnRleHQuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5hZGRTZXJ2aWNlKGF4aXNTZXJ2aWNlKTsKLQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgc2VydmljZUdyb3VwQ29udGV4dCA9IGNvbmZpZ3VyYXRpb25Db250ZXh0LgotICAgICAgICAgICAgICAgIGNyZWF0ZVNlcnZpY2VHcm91cENvbnRleHQoYXhpc1NlcnZpY2UuZ2V0QXhpc1NlcnZpY2VHcm91cCgpKTsKLSAgICAgICAgc2VydmljZUdyb3VwQ29udGV4dC5zZXRJZCgiU2VydmljZUdyb3VwQ29udGV4dFRlc3QiKTsKLQotICAgICAgICBTZXJ2aWNlQ29udGV4dCBzZXJ2aWNlQ29udGV4dCA9IHNlcnZpY2VHcm91cENvbnRleHQuZ2V0U2VydmljZUNvbnRleHQoYXhpc1NlcnZpY2UpOwotCi0gICAgICAgIG9wZXJhdGlvbkNvbnRleHQgPSBzZXJ2aWNlQ29udGV4dC5jcmVhdGVPcGVyYXRpb25Db250ZXh0KG9wZXJhdGlvbk5hbWUpOwotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICBUcmFuc3BvcnRPdXREZXNjcmlwdGlvbiB0cmFuc3BvcnRPdXQgPSBuZXcgVHJhbnNwb3J0T3V0RGVzY3JpcHRpb24oIm51bGwiKTsKLSAgICAgICAgVHJhbnNwb3J0T3V0RGVzY3JpcHRpb24gdHJhbnNwb3J0T3V0MiA9IG5ldyBUcmFuc3BvcnRPdXREZXNjcmlwdGlvbigiaGFwcHkiKTsKLSAgICAgICAgVHJhbnNwb3J0T3V0RGVzY3JpcHRpb24gdHJhbnNwb3J0T3V0MyA9IG5ldyBUcmFuc3BvcnRPdXREZXNjcmlwdGlvbigiZ29sdWNreSIpOwotICAgICAgICB0cmFuc3BvcnRPdXQuc2V0U2VuZGVyKG5ldyBDb21tb25zSFRUUFRyYW5zcG9ydFNlbmRlcigpKTsKLSAgICAgICAgdHJhbnNwb3J0T3V0Mi5zZXRTZW5kZXIobmV3IENvbW1vbnNIVFRQVHJhbnNwb3J0U2VuZGVyKCkpOwotICAgICAgICB0cmFuc3BvcnRPdXQzLnNldFNlbmRlcihuZXcgQ29tbW9uc0hUVFBUcmFuc3BvcnRTZW5kZXIoKSk7Ci0gICAgICAgIGF4aXNDb25maWd1cmF0aW9uLmFkZFRyYW5zcG9ydE91dCh0cmFuc3BvcnRPdXQzKTsKLSAgICAgICAgYXhpc0NvbmZpZ3VyYXRpb24uYWRkVHJhbnNwb3J0T3V0KHRyYW5zcG9ydE91dDIpOwotICAgICAgICBheGlzQ29uZmlndXJhdGlvbi5hZGRUcmFuc3BvcnRPdXQodHJhbnNwb3J0T3V0KTsKLQotICAgICAgICBUcmFuc3BvcnRJbkRlc2NyaXB0aW9uIHRyYW5zcG9ydEluID0gbmV3IFRyYW5zcG9ydEluRGVzY3JpcHRpb24oIm51bGwiKTsKLSAgICAgICAgVHJhbnNwb3J0SW5EZXNjcmlwdGlvbiB0cmFuc3BvcnRJbjIgPSBuZXcgVHJhbnNwb3J0SW5EZXNjcmlwdGlvbigiYWx3YXlzIik7Ci0gICAgICAgIFRyYW5zcG9ydEluRGVzY3JpcHRpb24gdHJhbnNwb3J0SW4zID0gbmV3IFRyYW5zcG9ydEluRGVzY3JpcHRpb24oInRoZWJlc3QiKTsKLSAgICAgICAgdHJhbnNwb3J0SW4uc2V0UmVjZWl2ZXIobmV3IFNpbXBsZUhUVFBTZXJ2ZXIoKSk7Ci0gICAgICAgIHRyYW5zcG9ydEluMi5zZXRSZWNlaXZlcihuZXcgU2ltcGxlSFRUUFNlcnZlcigpKTsKLSAgICAgICAgdHJhbnNwb3J0SW4zLnNldFJlY2VpdmVyKG5ldyBTaW1wbGVIVFRQU2VydmVyKCkpOwotICAgICAgICBheGlzQ29uZmlndXJhdGlvbi5hZGRUcmFuc3BvcnRJbih0cmFuc3BvcnRJbjIpOwotICAgICAgICBheGlzQ29uZmlndXJhdGlvbi5hZGRUcmFuc3BvcnRJbih0cmFuc3BvcnRJbik7Ci0gICAgICAgIGF4aXNDb25maWd1cmF0aW9uLmFkZFRyYW5zcG9ydEluKHRyYW5zcG9ydEluMyk7Ci0KLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgIG1jID0gY29uZmlndXJhdGlvbkNvbnRleHQuY3JlYXRlTWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgbWMuc2V0VHJhbnNwb3J0SW4odHJhbnNwb3J0SW4pOwotICAgICAgICBtYy5zZXRUcmFuc3BvcnRPdXQodHJhbnNwb3J0T3V0KTsKLQotICAgICAgICBtYy5zZXRTZXJ2ZXJTaWRlKHRydWUpOwotLy8gICAgICAgIG1jLnNldFByb3BlcnR5KE1lc3NhZ2VDb250ZXh0LlRSQU5TUE9SVF9PVVQsIFN5c3RlbS5vdXQpOwotCi0gICAgICAgIFNPQVBGYWN0b3J5IG9tRmFjID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDExRmFjdG9yeSgpOwotICAgICAgICBtYy5zZXRFbnZlbG9wZShvbUZhYy5nZXREZWZhdWx0RW52ZWxvcGUoKSk7Ci0KLSAgICAgICAgcGhhc2UxID0gbmV3IFBoYXNlKCJiZWdpblBoYXNlMSIpOwotICAgICAgICBwaGFzZTEuYWRkSGFuZGxlcihuZXcgVGVtcEhhbmRsZXIoMSkpOwotICAgICAgICBwaGFzZTEuYWRkSGFuZGxlcihuZXcgVGVtcEhhbmRsZXIoMikpOwotICAgICAgICBwaGFzZTEuYWRkSGFuZGxlcihuZXcgVGVtcEhhbmRsZXIoMykpOwotICAgICAgICBwaGFzZTEuYWRkSGFuZGxlcihuZXcgVGVtcEhhbmRsZXIoNCkpOwotICAgICAgICBwaGFzZTEuYWRkSGFuZGxlcihuZXcgVGVtcEhhbmRsZXIoNSkpOwotICAgICAgICBwaGFzZTEuYWRkSGFuZGxlcihuZXcgVGVtcEhhbmRsZXIoNikpOwotICAgICAgICBwaGFzZTEuYWRkSGFuZGxlcihuZXcgVGVtcEhhbmRsZXIoNykpOwotICAgICAgICBwaGFzZTEuYWRkSGFuZGxlcihuZXcgVGVtcEhhbmRsZXIoOCkpOwotICAgICAgICBwaGFzZTEuYWRkSGFuZGxlcihuZXcgVGVtcEhhbmRsZXIoOSkpOwotCi0gICAgICAgIHBoYXNlMiA9IG5ldyBQaGFzZSgibWlkZGxlUGhhc2UyIik7Ci0gICAgICAgIHBoYXNlMi5hZGRIYW5kbGVyKG5ldyBUZW1wSGFuZGxlcigxMCkpOwotICAgICAgICBwaGFzZTIuYWRkSGFuZGxlcihuZXcgVGVtcEhhbmRsZXIoMTEpKTsKLSAgICAgICAgcGhhc2UyLmFkZEhhbmRsZXIobmV3IFRlbXBIYW5kbGVyKDEyKSk7Ci0gICAgICAgIHBoYXNlMi5hZGRIYW5kbGVyKG5ldyBUZW1wSGFuZGxlcigxMykpOwotICAgICAgICBwaGFzZTIuYWRkSGFuZGxlcihuZXcgVGVtcEhhbmRsZXIoMTQpKTsKLSAgICAgICAgcGhhc2UyLmFkZEhhbmRsZXIobmV3IFRlbXBIYW5kbGVyKDE1LCB0cnVlKSk7Ci0gICAgICAgIHBoYXNlMi5hZGRIYW5kbGVyKG5ldyBUZW1wSGFuZGxlcigxNikpOwotICAgICAgICBwaGFzZTIuYWRkSGFuZGxlcihuZXcgVGVtcEhhbmRsZXIoMTcpKTsKLSAgICAgICAgcGhhc2UyLmFkZEhhbmRsZXIobmV3IFRlbXBIYW5kbGVyKDE4KSk7Ci0KLSAgICAgICAgcGhhc2UzID0gbmV3IFBoYXNlKCJsYXN0UGhhc2UzIik7Ci0gICAgICAgIHBoYXNlMy5hZGRIYW5kbGVyKG5ldyBUZW1wSGFuZGxlcigxOSkpOwotICAgICAgICBwaGFzZTMuYWRkSGFuZGxlcihuZXcgVGVtcEhhbmRsZXIoMjApKTsKLSAgICAgICAgcGhhc2UzLmFkZEhhbmRsZXIobmV3IFRlbXBIYW5kbGVyKDIxKSk7Ci0gICAgICAgIHBoYXNlMy5hZGRIYW5kbGVyKG5ldyBUZW1wSGFuZGxlcigyMikpOwotICAgICAgICBwaGFzZTMuYWRkSGFuZGxlcihuZXcgVGVtcEhhbmRsZXIoMjMpKTsKLSAgICAgICAgcGhhc2UzLmFkZEhhbmRsZXIobmV3IFRlbXBIYW5kbGVyKDI0KSk7Ci0gICAgICAgIHBoYXNlMy5hZGRIYW5kbGVyKG5ldyBUZW1wSGFuZGxlcigyNSkpOwotICAgICAgICBwaGFzZTMuYWRkSGFuZGxlcihuZXcgVGVtcEhhbmRsZXIoMjYpKTsKLSAgICAgICAgcGhhc2UzLmFkZEhhbmRsZXIobmV3IFRlbXBIYW5kbGVyKDI3KSk7Ci0KLSAgICAgICAgcGhhc2U0ID0gbmV3IFBoYXNlKCJleHRyYVBoYXNlMSIpOwotICAgICAgICBwaGFzZTQuYWRkSGFuZGxlcihuZXcgVGVtcEhhbmRsZXIoMjgpKTsKLSAgICAgICAgcGhhc2U0LmFkZEhhbmRsZXIobmV3IFRlbXBIYW5kbGVyKDI5KSk7Ci0KLSAgICAgICAgcGhhc2U1ID0gbmV3IFBoYXNlKCJleHRyYVBoYXNlMiIpOwotICAgICAgICBwaGFzZTUuYWRkSGFuZGxlcihuZXcgVGVtcEhhbmRsZXIoMzApKTsKLQotICAgICAgICBwaGFzZTYgPSBuZXcgUGhhc2UoImV4dHJhUGhhc2UzIik7Ci0gICAgICAgIHBoYXNlNi5hZGRIYW5kbGVyKG5ldyBUZW1wSGFuZGxlcigzMSwgdHJ1ZSkpOwotICAgICAgICBwaGFzZTYuYWRkSGFuZGxlcihuZXcgVGVtcEhhbmRsZXIoMzIpKTsKLQotICAgICAgICBwaGFzZTcgPSBuZXcgUGhhc2UoImV4dHJhUGhhc2U0Iik7Ci0gICAgICAgIHBoYXNlNy5hZGRIYW5kbGVyKG5ldyBUZW1wSGFuZGxlcigzMykpOwotICAgICAgICBwaGFzZTcuYWRkSGFuZGxlcihuZXcgVGVtcEhhbmRsZXIoMzQpKTsKLSAgICAgICAgcGhhc2U3LmFkZEhhbmRsZXIobmV3IFRlbXBIYW5kbGVyKDM1KSk7Ci0KLSAgICAgICAgYXhpc09wZXJhdGlvbi5nZXRSZW1haW5pbmdQaGFzZXNJbkZsb3coKS5hZGQocGhhc2UxKTsKLSAgICAgICAgYXhpc09wZXJhdGlvbi5nZXRSZW1haW5pbmdQaGFzZXNJbkZsb3coKS5hZGQocGhhc2UyKTsKLSAgICAgICAgYXhpc09wZXJhdGlvbi5nZXRSZW1haW5pbmdQaGFzZXNJbkZsb3coKS5hZGQocGhhc2UzKTsKLSAgICAgICAgYXhpc09wZXJhdGlvbi5nZXRSZW1haW5pbmdQaGFzZXNJbkZsb3coKS5hZGQocGhhc2U0KTsKLSAgICAgICAgYXhpc09wZXJhdGlvbi5nZXRSZW1haW5pbmdQaGFzZXNJbkZsb3coKS5hZGQocGhhc2U1KTsKLSAgICAgICAgYXhpc09wZXJhdGlvbi5nZXRSZW1haW5pbmdQaGFzZXNJbkZsb3coKS5hZGQocGhhc2U2KTsKLSAgICAgICAgYXhpc09wZXJhdGlvbi5nZXRSZW1haW5pbmdQaGFzZXNJbkZsb3coKS5hZGQocGhhc2U3KTsKLQotICAgICAgICBBcnJheUxpc3QgcGhhc2VzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBwaGFzZXMuYWRkKHBoYXNlMSk7Ci0gICAgICAgIHBoYXNlcy5hZGQocGhhc2UyKTsKLSAgICAgICAgcGhhc2VzLmFkZChwaGFzZTMpOwotICAgICAgICBwaGFzZXMuYWRkKHBoYXNlNCk7Ci0gICAgICAgIHBoYXNlcy5hZGQocGhhc2U1KTsKLSAgICAgICAgcGhhc2VzLmFkZChwaGFzZTYpOwotICAgICAgICBwaGFzZXMuYWRkKHBoYXNlNyk7Ci0gICAgICAgIGF4aXNDb25maWd1cmF0aW9uLnNldEluUGhhc2VzVXB0b0FuZEluY2x1ZGluZ1Bvc3REaXNwYXRjaChwaGFzZXMpOwotCi0gICAgICAgIG1jLnNldFdTQUFjdGlvbihvcGVyYXRpb25OYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgbWMuc2V0U29hcEFjdGlvbihvcGVyYXRpb25OYW1lLmdldExvY2FsUGFydCgpKTsKLS8vICAgICAgICBTeXN0ZW0ub3V0LmZsdXNoKCk7Ci0KLSAgICAgICAgbWMuc2V0TWVzc2FnZUlEKFVVSURHZW5lcmF0b3IuZ2V0VVVJRCgpKTsKLQotICAgICAgICAvL29wZXJhdGlvbkNvbnRleHQuYWRkTWVzc2FnZUNvbnRleHQobWMpOyAgZ2V0cyBkb25lIHZpYSB0aGUgcmVnaXN0ZXIKLSAgICAgICAgYXhpc09wZXJhdGlvbi5yZWdpc3Rlck9wZXJhdGlvbkNvbnRleHQobWMsIG9wZXJhdGlvbkNvbnRleHQpOwotICAgICAgICBtYy5zZXRPcGVyYXRpb25Db250ZXh0KG9wZXJhdGlvbkNvbnRleHQpOwotICAgICAgICBtYy5zZXRTZXJ2aWNlQ29udGV4dChzZXJ2aWNlQ29udGV4dCk7Ci0KLSAgICAgICAgbWMuc2V0VG8obmV3IEVuZHBvaW50UmVmZXJlbmNlKCJheGlzMi9zZXJ2aWNlcy9OdWxsU2VydmljZSIpKTsKLSAgICAgICAgbWMuc2V0V1NBQWN0aW9uKCJEdW1teU9wIik7Ci0KLSAgICAgICAgYXhpc01lc3NhZ2UgPSBheGlzT3BlcmF0aW9uLmdldE1lc3NhZ2UoV1NETENvbnN0YW50cy5NRVNTQUdFX0xBQkVMX0lOX1ZBTFVFKTsKLSAgICAgICAgbWMuc2V0QXhpc01lc3NhZ2UoYXhpc01lc3NhZ2UpOwotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICBleGVjdXRlZEhhbmRsZXJzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIH0KLQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy9vcmcuYXBhY2hlLmxvZzRqLkJhc2ljQ29uZmlndXJhdG9yLmNvbmZpZ3VyZSgpOwotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgdGVzdFJlY2VpdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICBsb2cuZGVidWcoCi0gICAgICAgICAgICAgICAgIk1lc3NhZ2VDb250ZXh0U2F2ZUFUZXN0OnRlc3RSZWNlaXZlKCk6IHN0YXJ0IC0gLSBlbmdpbmUucmVjZWl2ZShtYykgLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSIpOwotICAgICAgICBBeGlzRW5naW5lLnJlY2VpdmUobWMpOwotCi0gICAgICAgIGxvZy5kZWJ1ZygKLSAgICAgICAgICAgICAgICAiTWVzc2FnZUNvbnRleHRTYXZlQVRlc3Q6dGVzdFJlY2VpdmUoKTogcmVzdW1lIC0gLSBlbmdpbmUucmVzdW1lKG1jKSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIik7Ci0gICAgICAgIEF4aXNFbmdpbmUucmVzdW1lKG1jKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoMzAsIGV4ZWN1dGVkSGFuZGxlcnMuc2l6ZSgpKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDE1OyBpIDwgMzA7IGkrKykgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCgoSW50ZWdlcikgZXhlY3V0ZWRIYW5kbGVycy5nZXQoaSkpLmludFZhbHVlKCksIGkgKyAxKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGdldCB0aGUgcGhhc2UgbGlzdHMgYW5kIHNlZSBpZiB0aGV5IG1hdGNoIHVwCi0gICAgICAgIEFycmF5TGlzdCByZXN0b3JlZFBoYXNlcyA9IG1jMi5nZXRFeGVjdXRpb25DaGFpbigpOwotICAgICAgICBpbnQgaXRfY291bnQgPSAwOwotCi0gICAgICAgIEl0ZXJhdG9yIGl0ID0gcmVzdG9yZWRQaGFzZXMuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgLy8gd2Uga25vdyBldmVyeXRoaW5nIGF0IHRoaXMgbGV2ZWwgaXMgYSBQaGFzZS4gIAotICAgICAgICAgICAgLy8gaWYgeW91IGNoYW5nZSBpdCwgeW91IG1pZ2h0IGdldCBhIENsYXNzQ2FzdEV4Y2VwdGlvbiAKLSAgICAgICAgICAgIFBoYXNlIHJlc3RvcmVkX3BoYXNlID0gKFBoYXNlKSBpdC5uZXh0KCk7Ci0KLSAgICAgICAgICAgIFBoYXNlIG9yaWdpbmFsX3BoYXNlID0gbnVsbDsKLQotICAgICAgICAgICAgaXRfY291bnQrKzsKLQotICAgICAgICAgICAgaWYgKGl0X2NvdW50ID09IDEpIHsKLSAgICAgICAgICAgICAgICBvcmlnaW5hbF9waGFzZSA9IHBoYXNlMTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoaXRfY291bnQgPT0gMikgewotICAgICAgICAgICAgICAgIG9yaWdpbmFsX3BoYXNlID0gcGhhc2UyOwotICAgICAgICAgICAgfSBlbHNlIGlmIChpdF9jb3VudCA9PSAzKSB7Ci0gICAgICAgICAgICAgICAgb3JpZ2luYWxfcGhhc2UgPSBwaGFzZTM7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGl0X2NvdW50ID09IDQpIHsKLSAgICAgICAgICAgICAgICBvcmlnaW5hbF9waGFzZSA9IHBoYXNlNDsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoaXRfY291bnQgPT0gNSkgewotICAgICAgICAgICAgICAgIG9yaWdpbmFsX3BoYXNlID0gcGhhc2U1OwotICAgICAgICAgICAgfSBlbHNlIGlmIChpdF9jb3VudCA9PSA2KSB7Ci0gICAgICAgICAgICAgICAgb3JpZ2luYWxfcGhhc2UgPSBwaGFzZTY7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGl0X2NvdW50ID09IDcpIHsKLSAgICAgICAgICAgICAgICBvcmlnaW5hbF9waGFzZSA9IHBoYXNlNzsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gdW5leHBlY3RlZAotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoZmFsc2UpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBib29sZWFuIGlzT2sgPSBjb21wYXJlUGhhc2VzKHJlc3RvcmVkX3BoYXNlLCBvcmlnaW5hbF9waGFzZSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGlzT2spOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBzZWNvbmQgcmVzdW1lIHRvIHN0YXJ0IHRoZSBzZWNvbmQgcGF1c2UKLSAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICBsb2cuZGVidWcoCi0gICAgICAgICAgICAgICAgIk1lc3NhZ2VDb250ZXh0U2F2ZUFUZXN0OnRlc3RSZWNlaXZlKCk6IHJlc3VtZSAtIC0gZW5naW5lLnJlc3VtZShtYykgLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSIpOwotICAgICAgICBBeGlzRW5naW5lLnJlc3VtZShtYyk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKDM1LCBleGVjdXRlZEhhbmRsZXJzLnNpemUoKSk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAzMTsgaSA8IDM1OyBpKyspIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygoKEludGVnZXIpIGV4ZWN1dGVkSGFuZGxlcnMuZ2V0KGkpKS5pbnRWYWx1ZSgpLCBpICsgMSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBnZXQgdGhlIHBoYXNlIGxpc3RzIGFuZCBzZWUgaWYgdGhleSBtYXRjaCB1cAotICAgICAgICByZXN0b3JlZFBoYXNlcyA9IG1jMi5nZXRFeGVjdXRpb25DaGFpbigpOwotICAgICAgICBpdF9jb3VudCA9IDA7Ci0KLSAgICAgICAgaXQgPSByZXN0b3JlZFBoYXNlcy5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAvLyB3ZSBrbm93IGV2ZXJ5dGhpbmcgYXQgdGhpcyBsZXZlbCBpcyBhIFBoYXNlLiAgCi0gICAgICAgICAgICAvLyBpZiB5b3UgY2hhbmdlIGl0LCB5b3UgbWlnaHQgZ2V0IGEgQ2xhc3NDYXN0RXhjZXB0aW9uIAotICAgICAgICAgICAgUGhhc2UgcmVzdG9yZWRfcGhhc2UgPSAoUGhhc2UpIGl0Lm5leHQoKTsKLQotICAgICAgICAgICAgUGhhc2Ugb3JpZ2luYWxfcGhhc2UgPSBudWxsOwotCi0gICAgICAgICAgICBpdF9jb3VudCsrOwotCi0gICAgICAgICAgICBpZiAoaXRfY291bnQgPT0gMSkgewotICAgICAgICAgICAgICAgIG9yaWdpbmFsX3BoYXNlID0gcGhhc2UxOwotICAgICAgICAgICAgfSBlbHNlIGlmIChpdF9jb3VudCA9PSAyKSB7Ci0gICAgICAgICAgICAgICAgb3JpZ2luYWxfcGhhc2UgPSBwaGFzZTI7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGl0X2NvdW50ID09IDMpIHsKLSAgICAgICAgICAgICAgICBvcmlnaW5hbF9waGFzZSA9IHBoYXNlMzsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoaXRfY291bnQgPT0gNCkgewotICAgICAgICAgICAgICAgIG9yaWdpbmFsX3BoYXNlID0gcGhhc2U0OwotICAgICAgICAgICAgfSBlbHNlIGlmIChpdF9jb3VudCA9PSA1KSB7Ci0gICAgICAgICAgICAgICAgb3JpZ2luYWxfcGhhc2UgPSBwaGFzZTU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGl0X2NvdW50ID09IDYpIHsKLSAgICAgICAgICAgICAgICBvcmlnaW5hbF9waGFzZSA9IHBoYXNlNjsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoaXRfY291bnQgPT0gNykgewotICAgICAgICAgICAgICAgIG9yaWdpbmFsX3BoYXNlID0gcGhhc2U3OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyB1bmV4cGVjdGVkCi0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShmYWxzZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJvb2xlYW4gaXNPayA9IGNvbXBhcmVQaGFzZXMocmVzdG9yZWRfcGhhc2UsIG9yaWdpbmFsX3BoYXNlKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoaXNPayk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgaGFuZGxlciBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbyBUaGUgaGFuZGxlciBvYmplY3QKLSAgICAgKiBAcmV0dXJuIFRoZSBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIGhhbmRsZXIsCi0gICAgICogICAgICAgICAtMSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwcml2YXRlIGludCBnZXRIYW5kbGVySUQoT2JqZWN0IG8pIHsKLSAgICAgICAgaW50IGlkID0gLTE7Ci0KLSAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBUZW1wSGFuZGxlcikgewotICAgICAgICAgICAgaWQgPSAoKFRlbXBIYW5kbGVyKSBvKS5nZXRIYW5kbGVySUQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBpZDsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIENoZWNrIHRoZSBoYW5kbGVyIG9iamVjdHMgdG8gc2VlIGlmIHRoZXkgYXJlIGVxdWl2YWxlbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbzEgVGhlIGZpcnN0IGhhbmRsZXIKLSAgICAgKiBAcGFyYW0gbzIgVGhlIHNlY29uZCBoYW5kbGVyCi0gICAgICogQHJldHVybiBUUlVFIGlmIHRoZSBoYW5kbGVyIG9iamVjdHMgYXJlIGVxdWl2YWxlbnQsCi0gICAgICogICAgICAgICBGQUxTRSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gY29tcGFyZUhhbmRsZXJzKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7Ci0gICAgICAgIGlmICgobzEgPT0gbnVsbCkgJiYgKG8yID09IG51bGwpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICgobzEgIT0gbnVsbCkgJiYgKG8yICE9IG51bGwpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgYzEgPSBvMS5nZXRDbGFzcygpLmdldE5hbWUoKTsKLSAgICAgICAgICAgIFN0cmluZyBjMiA9IG8yLmdldENsYXNzKCkuZ2V0TmFtZSgpOwotCi0gICAgICAgICAgICBpZiAoYzEuZXF1YWxzKGMyKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiTWVzc2FnZUNvbnRleHRTYXZlQVRlc3Q6OmNvbXBhcmVIYW5kbGVyczogIGNsYXNzIFsiICsgYzEgKyAiXSBtYXRjaCAiKTsKLQotICAgICAgICAgICAgICAgIGludCBpZDEgPSBnZXRIYW5kbGVySUQobzEpOwotICAgICAgICAgICAgICAgIGludCBpZDIgPSBnZXRIYW5kbGVySUQobzIpOwotCi0gICAgICAgICAgICAgICAgaWYgKGlkMSA9PSBpZDIpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJNZXNzYWdlQ29udGV4dFNhdmVBVGVzdDo6Y29tcGFyZUhhbmRsZXJzOiAgaWQgWyIgKyBpZDEgKyAiXSBtYXRjaCIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIk1lc3NhZ2VDb250ZXh0U2F2ZUFUZXN0Ojpjb21wYXJlSGFuZGxlcnM6ICBpZDEgWyIgKyBpZDEgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJdICE9IGlkMiBbIiArIGlkMiArICJdICIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIk1lc3NhZ2VDb250ZXh0U2F2ZUFUZXN0Ojpjb21wYXJlSGFuZGxlcnM6ICBjbGFzczEgWyIgKyBjMSArCi0gICAgICAgICAgICAgICAgICAgICAgICAiXSAhPSBjbGFzczIgWyIgKyBjMiArICJdICAgIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQ29tcGFyZSB0d28gcGhhc2VzLgotICAgICAqCi0gICAgICogQHBhcmFtIG8xIFRoZSBmaXJzdCBwaGFzZSBvYmplY3QKLSAgICAgKiBAcGFyYW0gbzIgVGhlIHNlY29uZCBwaGFzZSBvYmplY3QKLSAgICAgKiBAcmV0dXJuIFRSVUUgaWYgdGhlIHBoYXNlcyBhcmUgZXF1aXZhbGVudCwKLSAgICAgKiAgICAgICAgIEZBTFNFIG90aGVyd2lzZQotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBjb21wYXJlUGhhc2VzKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7Ci0gICAgICAgIGlmICgobzEgPT0gbnVsbCkgJiYgKG8yID09IG51bGwpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoCi0gICAgICAgICAgICAgICAgICAgICJNZXNzYWdlQ29udGV4dFNhdmVBVGVzdDogY29tcGFyZVBoYXNlczogIFBoYXNlMVtdID09IFBoYXNlMltdIC0gYm90aCBudWxsIG9iamVjdHMiKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCgobzEgIT0gbnVsbCkgJiYgKG8yICE9IG51bGwpKQotICAgICAgICAgICAgICAgICYmICgobzEgaW5zdGFuY2VvZiBQaGFzZSkgJiYgKG8yIGluc3RhbmNlb2YgUGhhc2UpKQotICAgICAgICAgICAgICAgICkgewotCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIFBoYXNlIHAxID0gKFBoYXNlKSBvMTsKLSAgICAgICAgICAgICAgICBQaGFzZSBwMiA9IChQaGFzZSkgbzI7Ci0KLSAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZTEgPSBwMS5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUyID0gcDIuZ2V0TmFtZSgpOwotCi0gICAgICAgICAgICAgICAgTGlzdCBsaXN0MSA9IHAxLmdldEhhbmRsZXJzKCk7Ci0gICAgICAgICAgICAgICAgTGlzdCBsaXN0MiA9IHAyLmdldEhhbmRsZXJzKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoKGxpc3QxID09IG51bGwpICYmIChsaXN0MiA9PSBudWxsKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIk1lc3NhZ2VDb250ZXh0U2F2ZUFUZXN0OiBjb21wYXJlUGhhc2VzOiAgUGhhc2UxWyIgKyBuYW1lMSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIl0gPT0gUGhhc2UyWyIgKyBuYW1lMiArICJdIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmICgobGlzdDEgIT0gbnVsbCkgJiYgKGxpc3QyICE9IG51bGwpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBzaXplMSA9IGxpc3QxLnNpemUoKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IHNpemUyID0gbGlzdDIuc2l6ZSgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChzaXplMSAhPSBzaXplMikgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJNZXNzYWdlQ29udGV4dFNhdmVBVGVzdDogY29tcGFyZVBoYXNlczogIFBoYXNlMVsiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTEgKyAiXSAhPSBQaGFzZTJbIiArIG5hbWUyICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl0gLSBtaXNtYXRjaGVkIHNpemUgb2YgaGFuZGxlciBsaXN0cyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBzaXplMTsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qgb2JqMSA9IGxpc3QxLmdldChqKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBvYmoyID0gbGlzdDIuZ2V0KGopOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKG9iajEgPT0gbnVsbCkgJiYgKG9iajIgPT0gbnVsbCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvawotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgob2JqMSAhPSBudWxsKSAmJiAob2JqMiAhPSBudWxsKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gY2hlY2s7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob2JqMSBpbnN0YW5jZW9mIFBoYXNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrID0gY29tcGFyZVBoYXNlcyhvYmoxLCBvYmoyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtdXN0IGJlIGEgaGFuZGxlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVjayA9IGNvbXBhcmVIYW5kbGVycyhvYmoxLCBvYmoyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNoZWNrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWVzc2FnZUNvbnRleHRTYXZlQVRlc3Q6IGNvbXBhcmVQaGFzZXM6ICBQaGFzZTFbIiArIG5hbWUxICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJdICE9IFBoYXNlMlsiICsgbmFtZTIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl0gLSBtaXNtYXRjaGVkIGhhbmRsZXIgbGlzdHMiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWlzbWF0Y2gKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIk1lc3NhZ2VDb250ZXh0U2F2ZUFUZXN0OiBjb21wYXJlUGhhc2VzOiAgUGhhc2UxWyIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTEgKyAiXSAhPSBQaGFzZTJbIiArIG5hbWUyICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJdIC0gbWlzbWF0Y2hlZCBoYW5kbGVyIGxpc3RzIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UgZ290IGhlcmUsIHRoZSBjb21wYXJpc29uIGNvbXBsZXRlZCBvawotICAgICAgICAgICAgICAgICAgICAvLyB3aXRoIGEgbWF0Y2gKLQotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIk1lc3NhZ2VDb250ZXh0U2F2ZUFUZXN0OiBjb21wYXJlUGhhc2VzOiAgUGhhc2UxWyIgKyBuYW1lMSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIl0gPT0gUGhhc2UyWyIgKyBuYW1lMiArICJdIC0gbWF0Y2hlZCBoYW5kbGVyIGxpc3RzIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gc29tZSBlcnJvcgotICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBsb2cuZGVidWcoIk1lc3NhZ2VDb250ZXh0U2F2ZUFUZXN0OiBjb21wYXJlUGhhc2VzOiAgUGhhc2UxW10gIT0gUGhhc2UyW10iKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzaG93TWNNYXAoSGFzaE1hcCBtYXApIHsKLSAgICAgICAgaWYgKChtYXAgIT0gbnVsbCkgJiYgKCFtYXAuaXNFbXB0eSgpKSkgewotICAgICAgICAgICAgSXRlcmF0b3IgaXRMaXN0ID0gbWFwLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0KLSAgICAgICAgICAgIHdoaWxlIChpdExpc3QuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9IChTdHJpbmcpIGl0TGlzdC5uZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICBNZXNzYWdlQ29udGV4dCB2YWx1ZSA9IChNZXNzYWdlQ29udGV4dCkgbWFwLmdldChrZXkpOwotICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZUlEID0gbnVsbDsKLQotICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlSUQgPSB2YWx1ZS5nZXRNZXNzYWdlSUQoKTsKLQotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1lc3NhZ2VDb250ZXh0U2F2ZUFUZXN0OiBzaG93TWNNYXA6ICBNZXNzYWdlIGNvbnRleHQgICBJRFsiICsgdmFsdWVJRCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXSAgIEtleSBMYWJlbCBbIiArIGtleSArICJdIik7Ci0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoCi0gICAgICAgICAgICAgICAgICAgICJNZXNzYWdlQ29udGV4dFNhdmVBVGVzdDogc2hvd01jTWFwOiAgTm8gZW50cmllcyB0byBkaXNwbGF5IGZvciBtZXNzYWdlIGNvbnRleHRzIHRhYmxlLiIpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICAvLyB0aGlzIGNoZWNrcyB0aGUgc2F2ZS9yZXN0b3JlIG9mIGEgbWVzc2FnZSBjb250ZXh0IHRoYXQgaGFzbid0IGJlZW4KLSAgICAvLyB0aHJvdWdoIHRoZSBlbmdpbmUgdG8gc2ltdWxhdGUgd2hhdCBzb21lIFdTLVJNIGltcGxlbWVudGF0aW9ucyAKLSAgICAvLyBuZWVkIHRvIGRvIC0gbWFrZSBhIHNpbXBsZSBtZXNzYWdlIGNvbnRleHQgZm9yIGEgUk0gYWNrIG9yIG90aGVyCi0gICAgLy8gc2ltcGxlIG1lc3NhZ2UKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlTUMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHRpdGxlID0gIk1lc3NhZ2VDb250ZXh0U2F2ZUFUZXN0OnRlc3RTaW1wbGVNQygpOiAiOwotICAgICAgICBsb2cuZGVidWcodGl0bGUgKyAic3RhcnQgLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSIpOwotCi0gICAgICAgIE1lc3NhZ2VDb250ZXh0IHNpbXBsZU1zZyA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBNZXNzYWdlQ29udGV4dCByZXN0b3JlZFNpbXBsZU1zZyA9IG51bGw7Ci0KLSAgICAgICAgRmlsZSB0aGVGaWxlID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIHRoZUZpbGVuYW1lID0gbnVsbDsKLQotICAgICAgICBib29sZWFuIHNhdmVkTWVzc2FnZUNvbnRleHQgPSBmYWxzZTsKLSAgICAgICAgYm9vbGVhbiByZXN0b3JlZE1lc3NhZ2VDb250ZXh0ID0gZmFsc2U7Ci0gICAgICAgIGJvb2xlYW4gY29tcGFyZXNPayA9IGZhbHNlOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB0aGVGaWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgiU2ltcGxlIiwgbnVsbCk7Ci0gICAgICAgICAgICB0aGVGaWxlbmFtZSA9IHRoZUZpbGUuZ2V0TmFtZSgpOwotICAgICAgICAgICAgbG9nLmRlYnVnKHRpdGxlICsgInRlbXAgZmlsZSA9IFsiICsgdGhlRmlsZW5hbWUgKyAiXSIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArICJlcnJvciBjcmVhdGluZyB0ZW1wIGZpbGUgPSBbIiArIGV4LmdldE1lc3NhZ2UoKSArICJdIik7Ci0gICAgICAgICAgICB0aGVGaWxlID0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh0aGVGaWxlICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAgICAgLy8gc2F2ZSB0byB0aGUgdGVtcG9yYXJ5IGZpbGUKLSAgICAgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAvLyBzZXR1cCBhbiBvdXRwdXQgc3RyZWFtIHRvIGEgcGh5c2ljYWwgZmlsZQotICAgICAgICAgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gb3V0U3RyZWFtID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0odGhlRmlsZSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBhdHRhY2ggYSBzdHJlYW0gY2FwYWJsZSBvZiB3cml0aW5nIG9iamVjdHMgdG8gdGhlIAotICAgICAgICAgICAgICAgIC8vIHN0cmVhbSBjb25uZWN0ZWQgdG8gdGhlIGZpbGUKLSAgICAgICAgICAgICAgICBPYmplY3RPdXRwdXRTdHJlYW0gb3V0T2JqU3RyZWFtID0gbmV3IE9iamVjdE91dHB1dFN0cmVhbShvdXRTdHJlYW0pOwotCi0gICAgICAgICAgICAgICAgLy8gdHJ5IHRvIHNhdmUgdGhlIG1lc3NhZ2UgY29udGV4dAotICAgICAgICAgICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArICJzYXZpbmcgbWVzc2FnZSBjb250ZXh0Li4uLi4iKTsKLSAgICAgICAgICAgICAgICBzYXZlZE1lc3NhZ2VDb250ZXh0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgb3V0T2JqU3RyZWFtLndyaXRlT2JqZWN0KHNpbXBsZU1zZyk7Ci0KLSAgICAgICAgICAgICAgICAvLyBjbG9zZSBvdXQgdGhlIHN0cmVhbXMKLSAgICAgICAgICAgICAgICBvdXRPYmpTdHJlYW0uZmx1c2goKTsKLSAgICAgICAgICAgICAgICBvdXRPYmpTdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICBvdXRTdHJlYW0uZmx1c2goKTsKLSAgICAgICAgICAgICAgICBvdXRTdHJlYW0uY2xvc2UoKTsKLQotICAgICAgICAgICAgICAgIHNhdmVkTWVzc2FnZUNvbnRleHQgPSB0cnVlOwotICAgICAgICAgICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArICIuLi4uc2F2ZWQgbWVzc2FnZSBjb250ZXh0Li4uLi4iKTsKLQotICAgICAgICAgICAgICAgIGxvbmcgZmlsZXNpemUgPSB0aGVGaWxlLmxlbmd0aCgpOwotICAgICAgICAgICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArICJmaWxlIHNpemUgYWZ0ZXIgc2F2ZSBbIiArIGZpbGVzaXplICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJdICAgdGVtcCBmaWxlID0gWyIgKyB0aGVGaWxlbmFtZSArICJdIik7Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgyKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKHRpdGxlICsgImVycm9yIHdpdGggc2F2aW5nIG1lc3NhZ2UgY29udGV4dCA9IFsiICsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4Mi5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgOiAiICsgZXgyLmdldE1lc3NhZ2UoKSArICJdIik7Ci0gICAgICAgICAgICAgICAgZXgyLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHNhdmVkTWVzc2FnZUNvbnRleHQpOwotCi0gICAgICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgICAgIC8vIHJlc3RvcmUgZnJvbSB0aGUgdGVtcG9yYXJ5IGZpbGUKLSAgICAgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAvLyBzZXR1cCBhbiBpbnB1dCBzdHJlYW0gdG8gdGhlIGZpbGUKLSAgICAgICAgICAgICAgICBGaWxlSW5wdXRTdHJlYW0gaW5TdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKHRoZUZpbGUpOwotCi0gICAgICAgICAgICAgICAgLy8gYXR0YWNoIGEgc3RyZWFtIGNhcGFibGUgb2YgcmVhZGluZyBvYmplY3RzIGZyb20gdGhlIAotICAgICAgICAgICAgICAgIC8vIHN0cmVhbSBjb25uZWN0ZWQgdG8gdGhlIGZpbGUKLSAgICAgICAgICAgICAgICBPYmplY3RJbnB1dFN0cmVhbSBpbk9ialN0cmVhbSA9IG5ldyBPYmplY3RJbnB1dFN0cmVhbShpblN0cmVhbSk7Ci0KLSAgICAgICAgICAgICAgICAvLyB0cnkgdG8gcmVzdG9yZSB0aGUgbWVzc2FnZSBjb250ZXh0Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKHRpdGxlICsgInJlc3RvcmluZyBhIG1lc3NhZ2UgY29udGV4dC4uLi4uIik7Ci0gICAgICAgICAgICAgICAgcmVzdG9yZWRNZXNzYWdlQ29udGV4dCA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgcmVzdG9yZWRTaW1wbGVNc2cgPSAoTWVzc2FnZUNvbnRleHQpIGluT2JqU3RyZWFtLnJlYWRPYmplY3QoKTsKLSAgICAgICAgICAgICAgICBpbk9ialN0cmVhbS5jbG9zZSgpOwotICAgICAgICAgICAgICAgIGluU3RyZWFtLmNsb3NlKCk7Ci0KLSAgICAgICAgICAgICAgICByZXN0b3JlZFNpbXBsZU1zZy5hY3RpdmF0ZShjb25maWd1cmF0aW9uQ29udGV4dCk7Ci0KLSAgICAgICAgICAgICAgICByZXN0b3JlZE1lc3NhZ2VDb250ZXh0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcodGl0bGUgKyAiLi4uLnJlc3RvcmVkIG1lc3NhZ2UgY29udGV4dC4uLi4uIik7Ci0KLSAgICAgICAgICAgICAgICAvLyBjb21wYXJlIHRvIG9yaWdpbmFsIGV4ZWN1dGlvbiBjaGFpbgotICAgICAgICAgICAgICAgIEFycmF5TGlzdCByZXN0b3JlZF9leGVjQ2hhaW4gPSByZXN0b3JlZFNpbXBsZU1zZy5nZXRFeGVjdXRpb25DaGFpbigpOwotICAgICAgICAgICAgICAgIEFycmF5TGlzdCBvcmlnX2V4ZWNDaGFpbiA9IHNpbXBsZU1zZy5nZXRFeGVjdXRpb25DaGFpbigpOwotCi0gICAgICAgICAgICAgICAgY29tcGFyZXNPayA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBBY3RpdmF0ZVV0aWxzLmlzRXF1aXZhbGVudChyZXN0b3JlZF9leGVjQ2hhaW4sIG9yaWdfZXhlY0NoYWluLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKHRpdGxlICsgImV4ZWN1dGlvbiBjaGFpbiBlcXVpdmFsZW5jeSBbIiArIGNvbXBhcmVzT2sgKyAiXSIpOwotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoY29tcGFyZXNPayk7Ci0KLSAgICAgICAgICAgICAgICAvLyBjaGVjayBleGVjdXRlZCBsaXN0Ci0gICAgICAgICAgICAgICAgSXRlcmF0b3IgcmVzdG9yZWRfZXhlY3V0ZWRfaXQgPSByZXN0b3JlZFNpbXBsZU1zZy5nZXRFeGVjdXRlZFBoYXNlcygpOwotICAgICAgICAgICAgICAgIEl0ZXJhdG9yIG9yaWdfZXhlY3V0ZWRfaXQgPSBzaW1wbGVNc2cuZ2V0RXhlY3V0ZWRQaGFzZXMoKTsKLSAgICAgICAgICAgICAgICBpZiAoKHJlc3RvcmVkX2V4ZWN1dGVkX2l0ICE9IG51bGwpICYmIChvcmlnX2V4ZWN1dGVkX2l0ICE9IG51bGwpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlIChyZXN0b3JlZF9leGVjdXRlZF9pdC5oYXNOZXh0KCkgJiYgb3JpZ19leGVjdXRlZF9pdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBwMSA9IHJlc3RvcmVkX2V4ZWN1dGVkX2l0Lm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBwMiA9IG9yaWdfZXhlY3V0ZWRfaXQubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJlc09rID0gY29tcGFyZVBoYXNlcyhwMSwgcDIpOwotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKHRpdGxlICsgImV4ZWN1dGVkIHBoYXNlIGxpc3Q6ICBjb21wYXJlIHBoYXNlcyBbIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmVzT2sgKyAiXSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjb21wYXJlc09rKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHByb2JsZW0gd2l0aCB0aGUgZXhlY3V0ZWQgbGlzdHMKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShmYWxzZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4MikgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArICJlcnJvciB3aXRoIHNhdmluZyBtZXNzYWdlIGNvbnRleHQgPSBbIiArCi0gICAgICAgICAgICAgICAgICAgICAgICBleDIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIDogIiArIGV4Mi5nZXRNZXNzYWdlKCkgKyAiXSIpOwotICAgICAgICAgICAgICAgIGV4Mi5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZXN0b3JlZE1lc3NhZ2VDb250ZXh0KTsKLQotICAgICAgICAgICAgLy8gaWYgdGhlIHNhdmUvcmVzdG9yZSBvZiB0aGUgbWVzc2FnZSBjb250ZXh0IHN1Y2NlZWRlZCwKLSAgICAgICAgICAgIC8vIHRoZW4gZG9uJ3Qga2VlcCB0aGUgdGVtcG9yYXJ5IGZpbGUgYXJvdW5kCi0gICAgICAgICAgICBib29sZWFuIHJlbW92ZVRtcEZpbGUgPSBzYXZlZE1lc3NhZ2VDb250ZXh0ICYmIHJlc3RvcmVkTWVzc2FnZUNvbnRleHQgJiYgY29tcGFyZXNPazsKLSAgICAgICAgICAgIGlmIChyZW1vdmVUbXBGaWxlKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgdGhlRmlsZS5kZWxldGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGp1c3QgYWJzb3JiIGl0Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgbG9nLmRlYnVnKHRpdGxlICsgImVuZCAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIik7Ci0gICAgfQotCi0KLSAgICAvLyB0aGlzIGNoZWNrcyB0aGUgc2F2ZS9yZXN0b3JlIG9mIGEgbWVzc2FnZSBjb250ZXh0IHRoYXQgaGFzCi0gICAgLy8gc29tZSBwcm9wZXJ0aWVzIHNldAotICAgIHB1YmxpYyB2b2lkIHRlc3RNY1Byb3BlcnRpZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHRpdGxlID0gIk1lc3NhZ2VDb250ZXh0U2F2ZUFUZXN0OnRlc3RNY1Byb3BlcnRpZXMoKTogIjsKLSAgICAgICAgbG9nLmRlYnVnKHRpdGxlICsgInN0YXJ0IC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0iKTsKLQotICAgICAgICBNZXNzYWdlQ29udGV4dCBzaW1wbGVNc2cgPSBuZXcgTWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgTWVzc2FnZUNvbnRleHQgcmVzdG9yZWRTaW1wbGVNc2cgPSBudWxsOwotCi0gICAgICAgIHNpbXBsZU1zZy5zZXRQcm9wZXJ0eSgia2V5MSIsICJ2YWx1ZTEiKTsKLSAgICAgICAgc2ltcGxlTXNnLnNldFByb3BlcnR5KCJrZXkyIiwgbnVsbCk7Ci0gICAgICAgIHNpbXBsZU1zZy5zZXRQcm9wZXJ0eSgia2V5MyIsIG5ldyBJbnRlZ2VyKDMpKTsKLSAgICAgICAgc2ltcGxlTXNnLnNldFByb3BlcnR5KCJrZXk0IiwgbmV3IExvbmcoNEwpKTsKLQotCi0gICAgICAgIEZpbGUgdGhlRmlsZSA9IG51bGw7Ci0gICAgICAgIFN0cmluZyB0aGVGaWxlbmFtZSA9IG51bGw7Ci0KLSAgICAgICAgYm9vbGVhbiBwYXVzZSA9IGZhbHNlOwotICAgICAgICBib29sZWFuIHNhdmVkTWVzc2FnZUNvbnRleHQgPSBmYWxzZTsKLSAgICAgICAgYm9vbGVhbiByZXN0b3JlZE1lc3NhZ2VDb250ZXh0ID0gZmFsc2U7Ci0gICAgICAgIGJvb2xlYW4gY29tcGFyZXNPayA9IGZhbHNlOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB0aGVGaWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgiTWNQcm9wcyIsIG51bGwpOwotICAgICAgICAgICAgdGhlRmlsZW5hbWUgPSB0aGVGaWxlLmdldE5hbWUoKTsKLSAgICAgICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArICJ0ZW1wIGZpbGUgPSBbIiArIHRoZUZpbGVuYW1lICsgIl0iKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcodGl0bGUgKyAiZXJyb3IgY3JlYXRpbmcgdGVtcCBmaWxlID0gWyIgKyBleC5nZXRNZXNzYWdlKCkgKyAiXSIpOwotICAgICAgICAgICAgdGhlRmlsZSA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodGhlRmlsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgICAgIC8vIHNhdmUgdG8gdGhlIHRlbXBvcmFyeSBmaWxlCi0gICAgICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgLy8gc2V0dXAgYW4gb3V0cHV0IHN0cmVhbSB0byBhIHBoeXNpY2FsIGZpbGUKLSAgICAgICAgICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIG91dFN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRoZUZpbGUpOwotCi0gICAgICAgICAgICAgICAgLy8gYXR0YWNoIGEgc3RyZWFtIGNhcGFibGUgb2Ygd3JpdGluZyBvYmplY3RzIHRvIHRoZSAKLSAgICAgICAgICAgICAgICAvLyBzdHJlYW0gY29ubmVjdGVkIHRvIHRoZSBmaWxlCi0gICAgICAgICAgICAgICAgT2JqZWN0T3V0cHV0U3RyZWFtIG91dE9ialN0cmVhbSA9IG5ldyBPYmplY3RPdXRwdXRTdHJlYW0ob3V0U3RyZWFtKTsKLQotICAgICAgICAgICAgICAgIC8vIHRyeSB0byBzYXZlIHRoZSBtZXNzYWdlIGNvbnRleHQKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcodGl0bGUgKyAic2F2aW5nIG1lc3NhZ2UgY29udGV4dC4uLi4uIik7Ci0gICAgICAgICAgICAgICAgc2F2ZWRNZXNzYWdlQ29udGV4dCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIG91dE9ialN0cmVhbS53cml0ZU9iamVjdChzaW1wbGVNc2cpOwotCi0gICAgICAgICAgICAgICAgLy8gY2xvc2Ugb3V0IHRoZSBzdHJlYW1zCi0gICAgICAgICAgICAgICAgb3V0T2JqU3RyZWFtLmZsdXNoKCk7Ci0gICAgICAgICAgICAgICAgb3V0T2JqU3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgb3V0U3RyZWFtLmZsdXNoKCk7Ci0gICAgICAgICAgICAgICAgb3V0U3RyZWFtLmNsb3NlKCk7Ci0KLSAgICAgICAgICAgICAgICBzYXZlZE1lc3NhZ2VDb250ZXh0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcodGl0bGUgKyAiLi4uLnNhdmVkIG1lc3NhZ2UgY29udGV4dC4uLi4uIik7Ci0KLSAgICAgICAgICAgICAgICBsb25nIGZpbGVzaXplID0gdGhlRmlsZS5sZW5ndGgoKTsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcodGl0bGUgKyAiZmlsZSBzaXplIGFmdGVyIHNhdmUgWyIgKyBmaWxlc2l6ZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAiXSAgIHRlbXAgZmlsZSA9IFsiICsgdGhlRmlsZW5hbWUgKyAiXSIpOwotCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4MikgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArICJlcnJvciB3aXRoIHNhdmluZyBtZXNzYWdlIGNvbnRleHQgPSBbIiArCi0gICAgICAgICAgICAgICAgICAgICAgICBleDIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIDogIiArIGV4Mi5nZXRNZXNzYWdlKCkgKyAiXSIpOwotICAgICAgICAgICAgICAgIGV4Mi5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzYXZlZE1lc3NhZ2VDb250ZXh0KTsKLQotICAgICAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgICAgICAvLyByZXN0b3JlIGZyb20gdGhlIHRlbXBvcmFyeSBmaWxlCi0gICAgICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgLy8gc2V0dXAgYW4gaW5wdXQgc3RyZWFtIHRvIHRoZSBmaWxlCi0gICAgICAgICAgICAgICAgRmlsZUlucHV0U3RyZWFtIGluU3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbSh0aGVGaWxlKTsKLQotICAgICAgICAgICAgICAgIC8vIGF0dGFjaCBhIHN0cmVhbSBjYXBhYmxlIG9mIHJlYWRpbmcgb2JqZWN0cyBmcm9tIHRoZSAKLSAgICAgICAgICAgICAgICAvLyBzdHJlYW0gY29ubmVjdGVkIHRvIHRoZSBmaWxlCi0gICAgICAgICAgICAgICAgT2JqZWN0SW5wdXRTdHJlYW0gaW5PYmpTdHJlYW0gPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0oaW5TdHJlYW0pOwotCi0gICAgICAgICAgICAgICAgLy8gdHJ5IHRvIHJlc3RvcmUgdGhlIG1lc3NhZ2UgY29udGV4dAotICAgICAgICAgICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArICJyZXN0b3JpbmcgYSBtZXNzYWdlIGNvbnRleHQuLi4uLiIpOwotICAgICAgICAgICAgICAgIHJlc3RvcmVkTWVzc2FnZUNvbnRleHQgPSBmYWxzZTsKLQotICAgICAgICAgICAgICAgIHJlc3RvcmVkU2ltcGxlTXNnID0gKE1lc3NhZ2VDb250ZXh0KSBpbk9ialN0cmVhbS5yZWFkT2JqZWN0KCk7Ci0gICAgICAgICAgICAgICAgaW5PYmpTdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICBpblN0cmVhbS5jbG9zZSgpOwotCi0gICAgICAgICAgICAgICAgcmVzdG9yZWRTaW1wbGVNc2cuYWN0aXZhdGUoY29uZmlndXJhdGlvbkNvbnRleHQpOwotCi0gICAgICAgICAgICAgICAgcmVzdG9yZWRNZXNzYWdlQ29udGV4dCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKHRpdGxlICsgIi4uLi5yZXN0b3JlZCBtZXNzYWdlIGNvbnRleHQuLi4uLiIpOwotCi0gICAgICAgICAgICAgICAgLy8gY29tcGFyZSB0byBvcmlnaW5hbCBleGVjdXRpb24gY2hhaW4KLSAgICAgICAgICAgICAgICBBcnJheUxpc3QgcmVzdG9yZWRfZXhlY0NoYWluID0gcmVzdG9yZWRTaW1wbGVNc2cuZ2V0RXhlY3V0aW9uQ2hhaW4oKTsKLSAgICAgICAgICAgICAgICBBcnJheUxpc3Qgb3JpZ19leGVjQ2hhaW4gPSBzaW1wbGVNc2cuZ2V0RXhlY3V0aW9uQ2hhaW4oKTsKLQotICAgICAgICAgICAgICAgIGNvbXBhcmVzT2sgPQotICAgICAgICAgICAgICAgICAgICBBY3RpdmF0ZVV0aWxzLmlzRXF1aXZhbGVudChyZXN0b3JlZF9leGVjQ2hhaW4sIG9yaWdfZXhlY0NoYWluLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKHRpdGxlICsgImV4ZWN1dGlvbiBjaGFpbiBlcXVpdmFsZW5jeSBbIiArIGNvbXBhcmVzT2sgKyAiXSIpOwotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoY29tcGFyZXNPayk7Ci0KLSAgICAgICAgICAgICAgICAvLyBjaGVjayBleGVjdXRlZCBsaXN0Ci0gICAgICAgICAgICAgICAgSXRlcmF0b3IgcmVzdG9yZWRfZXhlY3V0ZWRfaXQgPSByZXN0b3JlZFNpbXBsZU1zZy5nZXRFeGVjdXRlZFBoYXNlcygpOwotICAgICAgICAgICAgICAgIEl0ZXJhdG9yIG9yaWdfZXhlY3V0ZWRfaXQgPSBzaW1wbGVNc2cuZ2V0RXhlY3V0ZWRQaGFzZXMoKTsKLSAgICAgICAgICAgICAgICBpZiAoKHJlc3RvcmVkX2V4ZWN1dGVkX2l0ICE9IG51bGwpICYmIChvcmlnX2V4ZWN1dGVkX2l0ICE9IG51bGwpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlIChyZXN0b3JlZF9leGVjdXRlZF9pdC5oYXNOZXh0KCkgJiYgb3JpZ19leGVjdXRlZF9pdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBwMSA9IHJlc3RvcmVkX2V4ZWN1dGVkX2l0Lm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBwMiA9IG9yaWdfZXhlY3V0ZWRfaXQubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJlc09rID0gY29tcGFyZVBoYXNlcyhwMSwgcDIpOwotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKHRpdGxlICsgImV4ZWN1dGVkIHBoYXNlIGxpc3Q6ICBjb21wYXJlIHBoYXNlcyBbIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmVzT2sgKyAiXSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjb21wYXJlc09rKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHByb2JsZW0gd2l0aCB0aGUgZXhlY3V0ZWQgbGlzdHMKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShmYWxzZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gY2hlY2sgdGhlIHByb3BlcnRpZXMKLSAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUxID0gKFN0cmluZykgcmVzdG9yZWRTaW1wbGVNc2cuZ2V0UHJvcGVydHkoImtleTEiKTsKLSAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWUyID0gcmVzdG9yZWRTaW1wbGVNc2cuZ2V0UHJvcGVydHkoImtleTIiKTsKLSAgICAgICAgICAgICAgICBJbnRlZ2VyIHZhbHVlMyA9IChJbnRlZ2VyKSByZXN0b3JlZFNpbXBsZU1zZy5nZXRQcm9wZXJ0eSgia2V5MyIpOwotICAgICAgICAgICAgICAgIExvbmcgdmFsdWU0ID0gKExvbmcpIHJlc3RvcmVkU2ltcGxlTXNnLmdldFByb3BlcnR5KCJrZXk0Iik7Ci0KLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoInZhbHVlMSIsIHZhbHVlMSk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0TnVsbCh2YWx1ZTIpOwotCi0gICAgICAgICAgICAgICAgYm9vbGVhbiBpc09rID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgaWYgKCh2YWx1ZTMgIT0gbnVsbCkgJiYgdmFsdWUzLmVxdWFscyhuZXcgSW50ZWdlcigzKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaXNPayA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoaXNPayk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoKHZhbHVlNCAhPSBudWxsKSAmJiB2YWx1ZTQuZXF1YWxzKG5ldyBMb25nKDRMKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaXNPayA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoaXNPayk7Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgyKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKHRpdGxlICsgImVycm9yIHdpdGggcmVzdG9yaW5nIG1lc3NhZ2UgY29udGV4dCA9IFsiICsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4Mi5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgOiAiICsgZXgyLmdldE1lc3NhZ2UoKSArICJdIik7Ci0gICAgICAgICAgICAgICAgZXgyLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHJlc3RvcmVkTWVzc2FnZUNvbnRleHQpOwotCi0gICAgICAgICAgICAvLyBpZiB0aGUgc2F2ZS9yZXN0b3JlIG9mIHRoZSBtZXNzYWdlIGNvbnRleHQgc3VjY2VlZGVkLAotICAgICAgICAgICAgLy8gdGhlbiBkb24ndCBrZWVwIHRoZSB0ZW1wb3JhcnkgZmlsZSBhcm91bmQKLSAgICAgICAgICAgIGJvb2xlYW4gcmVtb3ZlVG1wRmlsZSA9IHNhdmVkTWVzc2FnZUNvbnRleHQgJiYgcmVzdG9yZWRNZXNzYWdlQ29udGV4dCAmJiBjb21wYXJlc09rOwotICAgICAgICAgICAgaWYgKHJlbW92ZVRtcEZpbGUpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICB0aGVGaWxlLmRlbGV0ZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8ganVzdCBhYnNvcmIgaXQKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBsb2cuZGVidWcodGl0bGUgKyAiZW5kIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0iKTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgU3RyaW5nIHRpdGxlID0gIk1lc3NhZ2VDb250ZXh0U2F2ZUFUZXN0OnRlc3RNYXBwaW5nKCk6ICI7Ci0gICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArICJzdGFydCAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIik7Ci0KLSAgICAgICAgTWVzc2FnZUNvbnRleHQgcmVzdG9yZWRNQyA9IG51bGw7Ci0KLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gbWFrZSBzdXJlIHRoYXQgdGhlIG9wZXJhdGlvbiBjb250ZXh0IG1lc3NhZ2VDb250ZXh0cyB0YWJsZSAKLSAgICAgICAgLy8gaGFzIGFuIGVudHJ5IGZvciB0aGUgbWVzc2FnZSBjb250ZXh0IHRoYXQgd2Ugd29ya2luZyB3aXRoCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIGxvb2sgYXQgdGhlIE9wZXJhdGlvbkNvbnRleHQgbWVzc2FnZUNvbnRleHRzIHRhYmxlCi0gICAgICAgIEhhc2hNYXAgbWNNYXAxID0gbWMuZ2V0T3BlcmF0aW9uQ29udGV4dCgpLmdldE1lc3NhZ2VDb250ZXh0cygpOwotCi0gICAgICAgIGlmICgobWNNYXAxID09IG51bGwpIHx8IChtY01hcDEuaXNFbXB0eSgpKSkgewotICAgICAgICAgICAgbWMuZ2V0QXhpc09wZXJhdGlvbigpLmFkZE1lc3NhZ2VDb250ZXh0KG1jLCBtYy5nZXRPcGVyYXRpb25Db250ZXh0KCkpOwotICAgICAgICB9Ci0gICAgICAgIC8vIHVwZGF0ZSB0aGUgdGFibGUKLSAgICAgICAgbWNNYXAxID0gbWMuZ2V0T3BlcmF0aW9uQ29udGV4dCgpLmdldE1lc3NhZ2VDb250ZXh0cygpOwotCi0gICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArICItIC0gLSAtIC0gb3JpZ2luYWwgbWVzc2FnZSBjb250ZXh0cyB0YWJsZS0gLSAtIC0gLSAtIC0gLSAtIC0gLSIpOwotICAgICAgICBzaG93TWNNYXAobWNNYXAxKTsKLQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBzYXZlIGFuZCByZXN0b3JlIHRoZSBtZXNzYWdlIGNvbnRleHQKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICBGaWxlIHRoZUZpbGU7Ci0gICAgICAgIFN0cmluZyB0aGVGaWxlbmFtZSA9IG51bGw7Ci0KLSAgICAgICAgYm9vbGVhbiBwYXVzZSA9IGZhbHNlOwotICAgICAgICBib29sZWFuIHNhdmVkTWVzc2FnZUNvbnRleHQgPSBmYWxzZTsKLSAgICAgICAgYm9vbGVhbiByZXN0b3JlZE1lc3NhZ2VDb250ZXh0ID0gZmFsc2U7Ci0gICAgICAgIGJvb2xlYW4gY29tcGFyZXNPayA9IGZhbHNlOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB0aGVGaWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgiTWNNYXBwaW5ncyIsIG51bGwpOwotICAgICAgICAgICAgdGhlRmlsZW5hbWUgPSB0aGVGaWxlLmdldE5hbWUoKTsKLSAgICAgICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArICJ0ZW1wIGZpbGUgPSBbIiArIHRoZUZpbGVuYW1lICsgIl0iKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcodGl0bGUgKyAiZXJyb3IgY3JlYXRpbmcgdGVtcCBmaWxlID0gWyIgKyBleC5nZXRNZXNzYWdlKCkgKyAiXSIpOwotICAgICAgICAgICAgdGhlRmlsZSA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodGhlRmlsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgICAgIC8vIHNhdmUgdG8gdGhlIHRlbXBvcmFyeSBmaWxlCi0gICAgICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgLy8gc2V0dXAgYW4gb3V0cHV0IHN0cmVhbSB0byBhIHBoeXNpY2FsIGZpbGUKLSAgICAgICAgICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIG91dFN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRoZUZpbGUpOwotCi0gICAgICAgICAgICAgICAgLy8gYXR0YWNoIGEgc3RyZWFtIGNhcGFibGUgb2Ygd3JpdGluZyBvYmplY3RzIHRvIHRoZSAKLSAgICAgICAgICAgICAgICAvLyBzdHJlYW0gY29ubmVjdGVkIHRvIHRoZSBmaWxlCi0gICAgICAgICAgICAgICAgT2JqZWN0T3V0cHV0U3RyZWFtIG91dE9ialN0cmVhbSA9IG5ldyBPYmplY3RPdXRwdXRTdHJlYW0ob3V0U3RyZWFtKTsKLQotICAgICAgICAgICAgICAgIC8vIHRyeSB0byBzYXZlIHRoZSBtZXNzYWdlIGNvbnRleHQKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcodGl0bGUgKyAic2F2aW5nIG1lc3NhZ2UgY29udGV4dC4uLi4uIik7Ci0gICAgICAgICAgICAgICAgc2F2ZWRNZXNzYWdlQ29udGV4dCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIG91dE9ialN0cmVhbS53cml0ZU9iamVjdChtYyk7Ci0KLSAgICAgICAgICAgICAgICAvLyBjbG9zZSBvdXQgdGhlIHN0cmVhbXMKLSAgICAgICAgICAgICAgICBvdXRPYmpTdHJlYW0uZmx1c2goKTsKLSAgICAgICAgICAgICAgICBvdXRPYmpTdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICBvdXRTdHJlYW0uZmx1c2goKTsKLSAgICAgICAgICAgICAgICBvdXRTdHJlYW0uY2xvc2UoKTsKLQotICAgICAgICAgICAgICAgIHNhdmVkTWVzc2FnZUNvbnRleHQgPSB0cnVlOwotICAgICAgICAgICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArICIuLi4uc2F2ZWQgbWVzc2FnZSBjb250ZXh0Li4uLi4iKTsKLQotICAgICAgICAgICAgICAgIGxvbmcgZmlsZXNpemUgPSB0aGVGaWxlLmxlbmd0aCgpOwotICAgICAgICAgICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArICJmaWxlIHNpemUgYWZ0ZXIgc2F2ZSBbIiArIGZpbGVzaXplICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJdICAgdGVtcCBmaWxlID0gWyIgKyB0aGVGaWxlbmFtZSArICJdIik7Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgyKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKHRpdGxlICsgImVycm9yIHdpdGggc2F2aW5nIG1lc3NhZ2UgY29udGV4dCA9IFsiICsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4Mi5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgOiAiICsgZXgyLmdldE1lc3NhZ2UoKSArICJdIik7Ci0gICAgICAgICAgICAgICAgZXgyLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHNhdmVkTWVzc2FnZUNvbnRleHQpOwotCi0gICAgICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgICAgIC8vIHJlc3RvcmUgZnJvbSB0aGUgdGVtcG9yYXJ5IGZpbGUKLSAgICAgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAvLyBzZXR1cCBhbiBpbnB1dCBzdHJlYW0gdG8gdGhlIGZpbGUKLSAgICAgICAgICAgICAgICBGaWxlSW5wdXRTdHJlYW0gaW5TdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKHRoZUZpbGUpOwotCi0gICAgICAgICAgICAgICAgLy8gYXR0YWNoIGEgc3RyZWFtIGNhcGFibGUgb2YgcmVhZGluZyBvYmplY3RzIGZyb20gdGhlIAotICAgICAgICAgICAgICAgIC8vIHN0cmVhbSBjb25uZWN0ZWQgdG8gdGhlIGZpbGUKLSAgICAgICAgICAgICAgICBPYmplY3RJbnB1dFN0cmVhbSBpbk9ialN0cmVhbSA9IG5ldyBPYmplY3RJbnB1dFN0cmVhbShpblN0cmVhbSk7Ci0KLSAgICAgICAgICAgICAgICAvLyB0cnkgdG8gcmVzdG9yZSB0aGUgbWVzc2FnZSBjb250ZXh0Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKHRpdGxlICsgInJlc3RvcmluZyBhIG1lc3NhZ2UgY29udGV4dC4uLi4uIik7Ci0gICAgICAgICAgICAgICAgcmVzdG9yZWRNZXNzYWdlQ29udGV4dCA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgcmVzdG9yZWRNQyA9IChNZXNzYWdlQ29udGV4dCkgaW5PYmpTdHJlYW0ucmVhZE9iamVjdCgpOwotICAgICAgICAgICAgICAgIGluT2JqU3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgaW5TdHJlYW0uY2xvc2UoKTsKLQotICAgICAgICAgICAgICAgIHJlc3RvcmVkTUMuYWN0aXZhdGUoY29uZmlndXJhdGlvbkNvbnRleHQpOwotCi0gICAgICAgICAgICAgICAgcmVzdG9yZWRNZXNzYWdlQ29udGV4dCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKHRpdGxlICsgIi4uLi5yZXN0b3JlZCBtZXNzYWdlIGNvbnRleHQuLi4uLiIpOwotCi0gICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSB0YWJsZSBhZnRlciB0aGUgcmVzdG9yZQotICAgICAgICAgICAgICAgIEhhc2hNYXAgbWNNYXAyID0gcmVzdG9yZWRNQy5nZXRPcGVyYXRpb25Db250ZXh0KCkuZ2V0TWVzc2FnZUNvbnRleHRzKCk7Ci0KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTWVzc2FnZUNvbnRleHRTYXZlQVRlc3Q6dGVzdE1hcHBpbmcoKTogLSAtIC0gLSAtIHJlc3RvcmVkIG1lc3NhZ2UgY29udGV4dHMgdGFibGUtIC0gLSAtIC0gLSAtIC0gLSAtIC0iKTsKLSAgICAgICAgICAgICAgICBzaG93TWNNYXAobWNNYXAyKTsKLQotICAgICAgICAgICAgICAgIGJvb2xlYW4gb2tNYXAgPSBjb21wYXJlTUNNYXBzKG1jTWFwMSwgbWNNYXAyKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKG9rTWFwKTsKLQotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleDIpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcodGl0bGUgKyAiZXJyb3Igd2l0aCByZXN0b3JpbmcgbWVzc2FnZSBjb250ZXh0ID0gWyIgKwotICAgICAgICAgICAgICAgICAgICAgICAgZXgyLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiA6ICIgKyBleDIuZ2V0TWVzc2FnZSgpICsgIl0iKTsKLSAgICAgICAgICAgICAgICBleDIucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUocmVzdG9yZWRNZXNzYWdlQ29udGV4dCk7Ci0KLSAgICAgICAgICAgIC8vIGlmIHRoZSBzYXZlL3Jlc3RvcmUgb2YgdGhlIG1lc3NhZ2UgY29udGV4dCBzdWNjZWVkZWQsCi0gICAgICAgICAgICAvLyB0aGVuIGRvbid0IGtlZXAgdGhlIHRlbXBvcmFyeSBmaWxlIGFyb3VuZAotICAgICAgICAgICAgYm9vbGVhbiByZW1vdmVUbXBGaWxlID0gc2F2ZWRNZXNzYWdlQ29udGV4dCAmJiByZXN0b3JlZE1lc3NhZ2VDb250ZXh0ICYmIGNvbXBhcmVzT2s7Ci0gICAgICAgICAgICBpZiAocmVtb3ZlVG1wRmlsZSkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHRoZUZpbGUuZGVsZXRlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAvLyBqdXN0IGFic29yYiBpdAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArICJlbmQgLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSIpOwotCi0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gY29tcGFyZU1DTWFwcyhIYXNoTWFwIG0xLCBIYXNoTWFwIG0yKSB7Ci0gICAgICAgIFN0cmluZyB0aXRsZSA9ICJNZXNzYWdlQ29udGV4dFNhdmVBVGVzdDpjb21wYXJlTUNNYXBzKCk6ICI7Ci0KLSAgICAgICAgaWYgKChtMSAhPSBudWxsKSAmJiAobTIgIT0gbnVsbCkpIHsKLSAgICAgICAgICAgIGludCBzaXplMSA9IG0xLnNpemUoKTsKLSAgICAgICAgICAgIGludCBzaXplMiA9IG0yLnNpemUoKTsKLQotICAgICAgICAgICAgaWYgKHNpemUxICE9IHNpemUyKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKHRpdGxlICsgIk1JU01BVENIOiAgbWFwMSBzaXplIFsiICsgc2l6ZTEgKwotICAgICAgICAgICAgICAgICAgICAgICAgIl0gICE9ICAgbWFwMiBzaXplIFsiICsgc2l6ZTIgKyAiXSIpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3RyaW5nIGlkMSA9IG51bGw7Ci0gICAgICAgICAgICBTdHJpbmcgaWQyID0gbnVsbDsKLQotICAgICAgICAgICAgLy8gY2hlY2sgdGhlIGtleXMsIG9yZGVyaW5nIGlzIG5vdCBpbXBvcnRhbnQgYmV0d2VlbiB0aGUgdHdvIG1hcHMKLSAgICAgICAgICAgIEl0ZXJhdG9yIGl0MSA9IG0xLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0KLSAgICAgICAgICAgIHdoaWxlIChpdDEuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGtleTEgPSAoU3RyaW5nKSBpdDEubmV4dCgpOwotICAgICAgICAgICAgICAgIE1lc3NhZ2VDb250ZXh0IHZhbHVlMSA9IChNZXNzYWdlQ29udGV4dCkgbTEuZ2V0KGtleTEpOwotCi0gICAgICAgICAgICAgICAgaWYgKHZhbHVlMSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlkMSA9IHZhbHVlMS5nZXRNZXNzYWdlSUQoKTsKLQotICAgICAgICAgICAgICAgICAgICBNZXNzYWdlQ29udGV4dCB2YWx1ZTIgPSAoTWVzc2FnZUNvbnRleHQpIG0yLmdldChrZXkxKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlkMiA9IHZhbHVlMi5nZXRNZXNzYWdlSUQoKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1pc21hdGNoCi0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcodGl0bGUgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTUlTTUFUQ0g6ICBubyBtZXNzYWdlIGNvbnRleHQgaW4gb25lIG9mIHRoZSB0YWJsZXMgZm9yIGtleSBbIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTEgKyAiXSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChpZDEgIT0gbnVsbCkgJiYgKGlkMiAhPSBudWxsKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpZDEuZXF1YWxzKGlkMikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtaXNtYXRjaAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArICJNSVNNQVRDSDogIG1lc3NhZ2VJRF8xIFsiICsgaWQxICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJdICAgIT0gICAgbWVzc2FnZUlEXzIgWyIgKyBpZDIgKyAiXSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIG51bGwgdmFsdWVzLCBjYW4ndCB0ZWxsCi0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcodGl0bGUgKyAiTUlTTUFUQ0g6ICBvbmUgb3IgbW9yZSBudWxsIG1lc3NhZ2UgSURzIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIGlmICgobTEgPT0gbnVsbCkgJiYgKG0yID09IG51bGwpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIG1pc21hdGNoCi0gICAgICAgICAgICBsb2cuZGVidWcodGl0bGUgKyAiTUlTTUFUQ0g6ICBvbmUgb2YgdGhlIHRhYmxlcyBpcyBudWxsIik7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIHB1YmxpYyBjbGFzcyBUZW1wSGFuZGxlciBleHRlbmRzIEFic3RyYWN0SGFuZGxlciB7Ci0gICAgICAgIHByaXZhdGUgSW50ZWdlciBoYW5kbGVySUQgPSBudWxsOwotCi0gICAgICAgIHByaXZhdGUgRmlsZSB0aGVGaWxlID0gbnVsbDsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgdGhlRmlsZW5hbWUgPSBudWxsOwotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBwYXVzZSA9IGZhbHNlOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gc2F2ZWRNZXNzYWdlQ29udGV4dCA9IGZhbHNlOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gcmVzdG9yZWRNZXNzYWdlQ29udGV4dCA9IGZhbHNlOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gY29tcGFyZXNPayA9IGZhbHNlOwotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gY29uc3RydWN0b3JzCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICBwdWJsaWMgVGVtcEhhbmRsZXIoKSB7Ci0gICAgICAgICAgICB0aGlzLmhhbmRsZXJJRCA9IG5ldyBJbnRlZ2VyKC01KTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBUZW1wSGFuZGxlcihpbnQgaW5kZXgsIGJvb2xlYW4gcGF1c2UpIHsKLSAgICAgICAgICAgIHRoaXMuaGFuZGxlcklEID0gbmV3IEludGVnZXIoaW5kZXgpOwotICAgICAgICAgICAgdGhpcy5wYXVzZSA9IHBhdXNlOwotICAgICAgICAgICAgaW5pdChuZXcgSGFuZGxlckRlc2NyaXB0aW9uKCJoYW5kbGVyIiArIGluZGV4KSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgVGVtcEhhbmRsZXIoaW50IGluZGV4KSB7Ci0gICAgICAgICAgICB0aGlzLmhhbmRsZXJJRCA9IG5ldyBJbnRlZ2VyKGluZGV4KTsKLSAgICAgICAgICAgIGluaXQobmV3IEhhbmRsZXJEZXNjcmlwdGlvbigiaGFuZGxlciIgKyBpbmRleCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBtZXRob2RzCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICBwdWJsaWMgaW50IGdldEhhbmRsZXJJRCgpIHsKLSAgICAgICAgICAgIGlmIChoYW5kbGVySUQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBoYW5kbGVySUQuaW50VmFsdWUoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIC01OwotICAgICAgICB9Ci0KLQotICAgICAgICBwdWJsaWMgSW52b2NhdGlvblJlc3BvbnNlIGludm9rZShNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgICAgIFN0cmluZyB0aXRsZSA9ICJUZW1wSGFuZGxlclsiICsgZ2V0SGFuZGxlcklEKCkgKyAiXTppbnZva2UoKTogIjsKLSAgICAgICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArICJwYXVzZSA9IFsiICsgcGF1c2UgKyAiXSIpOwotICAgICAgICAgICAgc2F2ZWRNZXNzYWdlQ29udGV4dCA9IGZhbHNlOwotICAgICAgICAgICAgcmVzdG9yZWRNZXNzYWdlQ29udGV4dCA9IGZhbHNlOwotCi0gICAgICAgICAgICBpZiAocGF1c2UpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcodGl0bGUgKyAibXNnQ29udGV4dC5wYXVzZSgpIik7Ci0gICAgICAgICAgICAgICAgbXNnQ29udGV4dC5wYXVzZSgpOwotICAgICAgICAgICAgICAgIHBhdXNlID0gZmFsc2U7Ci0KLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICB0aGVGaWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgibWNTYXZlIiwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgIHRoZUZpbGVuYW1lID0gdGhlRmlsZS5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArICJ0ZW1wIGZpbGUgPSBbIiArIHRoZUZpbGVuYW1lICsgIl0iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcodGl0bGUgKyAiZXJyb3IgY3JlYXRpbmcgdGVtcCBmaWxlID0gWyIgKyBleC5nZXRNZXNzYWdlKCkgKyAiXSIpOwotICAgICAgICAgICAgICAgICAgICB0aGVGaWxlID0gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAodGhlRmlsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAgICAgICAgICAgICAvLyBzYXZlIHRvIHRoZSB0ZW1wb3JhcnkgZmlsZQotICAgICAgICAgICAgICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldHVwIGFuIG91dHB1dCBzdHJlYW0gdG8gYSBwaHlzaWNhbCBmaWxlCi0gICAgICAgICAgICAgICAgICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIG91dFN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRoZUZpbGUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBhdHRhY2ggYSBzdHJlYW0gY2FwYWJsZSBvZiB3cml0aW5nIG9iamVjdHMgdG8gdGhlIAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RyZWFtIGNvbm5lY3RlZCB0byB0aGUgZmlsZQotICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0T3V0cHV0U3RyZWFtIG91dE9ialN0cmVhbSA9IG5ldyBPYmplY3RPdXRwdXRTdHJlYW0ob3V0U3RyZWFtKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHJ5IHRvIHNhdmUgdGhlIG1lc3NhZ2UgY29udGV4dAotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKHRpdGxlICsgInNhdmluZyBtZXNzYWdlIGNvbnRleHQuLi4uLiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZWRNZXNzYWdlQ29udGV4dCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgb3V0T2JqU3RyZWFtLndyaXRlT2JqZWN0KG1zZ0NvbnRleHQpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBjbG9zZSBvdXQgdGhlIHN0cmVhbXMKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dE9ialN0cmVhbS5mbHVzaCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgb3V0T2JqU3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXRTdHJlYW0uZmx1c2goKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dFN0cmVhbS5jbG9zZSgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBzYXZlZE1lc3NhZ2VDb250ZXh0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArICIuLi4uc2F2ZWQgbWVzc2FnZSBjb250ZXh0Li4uLi4iKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBmaWxlc2l6ZSA9IHRoZUZpbGUubGVuZ3RoKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcodGl0bGUgKyAiZmlsZSBzaXplIGFmdGVyIHNhdmUgWyIgKyBmaWxlc2l6ZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJdICAgdGVtcCBmaWxlID0gWyIgKyB0aGVGaWxlbmFtZSArICJdIik7Ci0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4MikgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKHRpdGxlICsgImVycm9yIHdpdGggc2F2aW5nIG1lc3NhZ2UgY29udGV4dCA9IFsiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXgyLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiA6ICIgKyBleDIuZ2V0TWVzc2FnZSgpICsgIl0iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4Mi5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoc2F2ZWRNZXNzYWdlQ29udGV4dCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgICAgICAgICAgICAgIC8vIHJlc3RvcmUgZnJvbSB0aGUgdGVtcG9yYXJ5IGZpbGUKLSAgICAgICAgICAgICAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXR1cCBhbiBpbnB1dCBzdHJlYW0gdG8gdGhlIGZpbGUKLSAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBpblN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0odGhlRmlsZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF0dGFjaCBhIHN0cmVhbSBjYXBhYmxlIG9mIHJlYWRpbmcgb2JqZWN0cyBmcm9tIHRoZSAKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0cmVhbSBjb25uZWN0ZWQgdG8gdGhlIGZpbGUKLSAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdElucHV0U3RyZWFtIGluT2JqU3RyZWFtID0gbmV3IE9iamVjdElucHV0U3RyZWFtKGluU3RyZWFtKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHJ5IHRvIHJlc3RvcmUgdGhlIG1lc3NhZ2UgY29udGV4dAotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKHRpdGxlICsgInJlc3RvcmluZyBhIG1lc3NhZ2UgY29udGV4dC4uLi4uIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXN0b3JlZE1lc3NhZ2VDb250ZXh0ID0gZmFsc2U7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQyID0gKE1lc3NhZ2VDb250ZXh0KSBpbk9ialN0cmVhbS5yZWFkT2JqZWN0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbk9ialN0cmVhbS5jbG9zZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaW5TdHJlYW0uY2xvc2UoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgbXNnQ29udGV4dDIuYWN0aXZhdGUoY29uZmlndXJhdGlvbkNvbnRleHQpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICByZXN0b3JlZE1lc3NhZ2VDb250ZXh0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArICIuLi4ucmVzdG9yZWQgbWVzc2FnZSBjb250ZXh0Li4uLi4iKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29tcGFyZSB0byBvcmlnaW5hbCBleGVjdXRpb24gY2hhaW4KLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5TGlzdCByZXN0b3JlZF9leGVjQ2hhaW4gPSBtc2dDb250ZXh0Mi5nZXRFeGVjdXRpb25DaGFpbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlMaXN0IG9yaWdfZXhlY0NoYWluID0gbXNnQ29udGV4dC5nZXRFeGVjdXRpb25DaGFpbigpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJlc09rID0gQWN0aXZhdGVVdGlscwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaXNFcXVpdmFsZW50KHJlc3RvcmVkX2V4ZWNDaGFpbiwgb3JpZ19leGVjQ2hhaW4sIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArICJleGVjdXRpb24gY2hhaW4gZXF1aXZhbGVuY3kgWyIgKyBjb21wYXJlc09rICsgIl0iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoY29tcGFyZXNPayk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGV4ZWN1dGVkIGxpc3QKLSAgICAgICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yIHJlc3RvcmVkX2V4ZWN1dGVkX2l0ID0gbXNnQ29udGV4dDIuZ2V0RXhlY3V0ZWRQaGFzZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yIG9yaWdfZXhlY3V0ZWRfaXQgPSBtc2dDb250ZXh0LmdldEV4ZWN1dGVkUGhhc2VzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHJlc3RvcmVkX2V4ZWN1dGVkX2l0ICE9IG51bGwpICYmIChvcmlnX2V4ZWN1dGVkX2l0ICE9IG51bGwpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHJlc3RvcmVkX2V4ZWN1dGVkX2l0Lmhhc05leHQoKSAmJiBvcmlnX2V4ZWN1dGVkX2l0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgcDEgPSByZXN0b3JlZF9leGVjdXRlZF9pdC5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBwMiA9IG9yaWdfZXhlY3V0ZWRfaXQubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmVzT2sgPSBjb21wYXJlUGhhc2VzKHAxLCBwMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4ZWN1dGVkIHBoYXNlIGxpc3Q6ICBjb21wYXJlIHBoYXNlcyBbIiArIGNvbXBhcmVzT2sgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJdIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoY29tcGFyZXNPayk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcm9ibGVtIHdpdGggdGhlIGV4ZWN1dGVkIGxpc3RzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdyBwdXQgdGhlIHJlc3RvcmVkIG1lc3NhZ2UgY29udGV4dCBpbiB0aGUgZ2xvYmFsCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyB2YXJpYWJsZSBmb3IgdGhlIHRlc3QgCi0gICAgICAgICAgICAgICAgICAgICAgICBtYzIgPSBtc2dDb250ZXh0MjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4MikgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKHRpdGxlICsgImVycm9yIHdpdGggc2F2aW5nIG1lc3NhZ2UgY29udGV4dCA9IFsiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXgyLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiA6ICIgKyBleDIuZ2V0TWVzc2FnZSgpICsgIl0iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4Mi5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUocmVzdG9yZWRNZXNzYWdlQ29udGV4dCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHNhdmUvcmVzdG9yZSBvZiB0aGUgbWVzc2FnZSBjb250ZXh0IHN1Y2NlZWRlZCwKLSAgICAgICAgICAgICAgICAgICAgLy8gdGhlbiBkb24ndCBrZWVwIHRoZSB0ZW1wb3JhcnkgZmlsZSBhcm91bmQKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiByZW1vdmVUbXBGaWxlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYXZlZE1lc3NhZ2VDb250ZXh0ICYmIHJlc3RvcmVkTWVzc2FnZUNvbnRleHQgJiYgY29tcGFyZXNPazsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlbW92ZVRtcEZpbGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlRmlsZS5kZWxldGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGp1c3QgYWJzb3JiIGl0Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gSW52b2NhdGlvblJlc3BvbnNlLlNVU1BFTkQ7Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKHRpdGxlICsgImV4ZWN1dGVkSGFuZGxlcnMuYWRkKCIgKyBoYW5kbGVySUQgKyAiKSIpOwotICAgICAgICAgICAgICAgIGV4ZWN1dGVkSGFuZGxlcnMuYWRkKGhhbmRsZXJJRCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBJbnZvY2F0aW9uUmVzcG9uc2UuQ09OVElOVUU7Ci0gICAgICAgIH0KLQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvTWVzc2FnZUNvbnRleHRTYXZlQlRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvTWVzc2FnZUNvbnRleHRTYXZlQlRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWRlZDNlOS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL01lc3NhZ2VDb250ZXh0U2F2ZUJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MTYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5VVUlER2VuZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuT3BlcmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuU2VydmljZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LlNlcnZpY2VHcm91cENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LmV4dGVybmFsaXplLkFjdGl2YXRlVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzTWVzc2FnZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlR3JvdXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5IYW5kbGVyRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5Jbk91dEF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5UcmFuc3BvcnRJbkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uVHJhbnNwb3J0T3V0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5BZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5oYW5kbGVycy5BYnN0cmFjdEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuUmF3WE1MSU5Pbmx5TWVzc2FnZVJlY2VpdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLlJhd1hNTElOT3V0TWVzc2FnZVJlY2VpdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuQ29tbW9uc0hUVFBUcmFuc3BvcnRTZW5kZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5TaW1wbGVIVFRQU2VydmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotcHVibGljIGNsYXNzIE1lc3NhZ2VDb250ZXh0U2F2ZUJUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKE1lc3NhZ2VDb250ZXh0U2F2ZUJUZXN0LmNsYXNzKTsKLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIHRlc3Qga2V5LXZhbHVlIHBhaXJzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHJpdmF0ZSBTdHJpbmcgW10gc2VydmljZUtleXMgPSB7Ci0gICAgICAgICAgICAic2VydmljZUtleTEiLAotICAgICAgICAgICAgInNlcnZpY2VLZXkyIiwKLSAgICAgICAgICAgICJzZXJ2aWNlS2V5MyIKLSAgICB9OwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgW10gc2VydmljZVZhbHVlcyA9IHsKLSAgICAgICAgICAgICJzZXJ2aWNlVmFsdWUxIiwKLSAgICAgICAgICAgICJzZXJ2aWNlVmFsdWUyIiwKLSAgICAgICAgICAgICJzZXJ2aWNlVmFsdWUzIgotICAgIH07Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyB2YXJpYWJsZXMgZm9yIHRoZSBvYmplY3QgZ3JhcGggCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gdXNlZCBvbiBhIHNhdmUvcmVzdG9yZSBvZiB0aGUgbWVzc2FnZSBjb250ZXh0Ci0gICAgLy8gaGFzIGEgZnVsbCBvYmplY3QgZ3JhcGggd2l0aCAzIHNldHMgb2Ygc2VydmljZSBncm91cHMgCi0gICAgLy8gYW5kIGFzc29jaWF0ZWQgb2JqZWN0cwotICAgIHByaXZhdGUgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlndXJhdGlvbkNvbnRleHQgPSBudWxsOwotICAgIHByaXZhdGUgQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZ3VyYXRpb24gPSBudWxsOwotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBzZXJ2aWNlIGdyb3VwIEFCQwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHJpdmF0ZSBTdHJpbmcgc2VydmljZUdyb3VwTmFtZV9BQkMgPSAiQUJDU2VydmljZUdyb3VwIjsKLQotICAgIHByaXZhdGUgU3RyaW5nIHNlcnZpY2VOYW1lX0EgPSAiU2VydmljZUEiOwotICAgIHByaXZhdGUgU3RyaW5nIHNlcnZpY2VOYW1lX0IgPSAiU2VydmljZUIiOwotICAgIHByaXZhdGUgU3RyaW5nIHNlcnZpY2VOYW1lX0MgPSAiU2VydmljZUMiOwotICAgIHByaXZhdGUgUU5hbWUgc2VydmljZV9RTmFtZV9BID0gbmV3IFFOYW1lKHNlcnZpY2VOYW1lX0EpOwotICAgIHByaXZhdGUgUU5hbWUgc2VydmljZV9RTmFtZV9CID0gbmV3IFFOYW1lKHNlcnZpY2VOYW1lX0IpOwotICAgIHByaXZhdGUgUU5hbWUgc2VydmljZV9RTmFtZV9DID0gbmV3IFFOYW1lKHNlcnZpY2VOYW1lX0MpOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgb3BlcmF0aW9uTmFtZV9BMSA9ICJUZXN0T3BlcmF0aW9uQTEiOwotICAgIHByaXZhdGUgU3RyaW5nIG9wZXJhdGlvbk5hbWVfQTIgPSAiVGVzdE9wZXJhdGlvbkEyIjsKLSAgICBwcml2YXRlIFFOYW1lIG9wZXJhdGlvbl9RTmFtZV9BMSA9IG5ldyBRTmFtZShvcGVyYXRpb25OYW1lX0ExKTsKLSAgICBwcml2YXRlIFFOYW1lIG9wZXJhdGlvbl9RTmFtZV9BMiA9IG5ldyBRTmFtZShvcGVyYXRpb25OYW1lX0EyKTsKLQotICAgIHByaXZhdGUgU2VydmljZUdyb3VwQ29udGV4dCBzcnZHcnBDdHhfQUJDID0gbnVsbDsKLSAgICBwcml2YXRlIEF4aXNTZXJ2aWNlR3JvdXAgYXhpc1NydkdycF9BQkMgPSBudWxsOwotCi0gICAgcHJpdmF0ZSBTZXJ2aWNlQ29udGV4dCBzcnZDdHhfQSA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTZXJ2aWNlQ29udGV4dCBzcnZDdHhfQiA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTZXJ2aWNlQ29udGV4dCBzcnZDdHhfQyA9IG51bGw7Ci0gICAgcHJpdmF0ZSBBeGlzU2VydmljZSBheGlzU3J2X0EgPSBudWxsOwotICAgIHByaXZhdGUgQXhpc1NlcnZpY2UgYXhpc1Nydl9CID0gbnVsbDsKLSAgICBwcml2YXRlIEF4aXNTZXJ2aWNlIGF4aXNTcnZfQyA9IG51bGw7Ci0KLSAgICBwcml2YXRlIE9wZXJhdGlvbkNvbnRleHQgb3BDdHhfQTEgPSBudWxsOwotICAgIHByaXZhdGUgT3BlcmF0aW9uQ29udGV4dCBvcEN0eF9BMiA9IG51bGw7Ci0gICAgcHJpdmF0ZSBBeGlzT3BlcmF0aW9uIGF4aXNPcF9BMSA9IG51bGw7Ci0gICAgcHJpdmF0ZSBBeGlzT3BlcmF0aW9uIGF4aXNPcF9BMiA9IG51bGw7Ci0KLSAgICBwcml2YXRlIE1lc3NhZ2VDb250ZXh0IG1zZ0N0eF9BMSA9IG51bGw7Ci0gICAgcHJpdmF0ZSBNZXNzYWdlQ29udGV4dCBtc2dDdHhfQTIgPSBudWxsOwotICAgIC8vcHJpdmF0ZSBBeGlzTWVzc2FnZSAgICAgICAgICBheGlzTXNnX0ExICAgID0gbnVsbDsKLSAgICAvL3ByaXZhdGUgQXhpc01lc3NhZ2UgICAgICAgICAgYXhpc01zZ19BMiAgICA9IG51bGw7Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIHNlcnZpY2UgZ3JvdXAgMTIzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwcml2YXRlIFN0cmluZyBzZXJ2aWNlR3JvdXBOYW1lXzEyMyA9ICIxMjNTZXJ2aWNlR3JvdXAiOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgc2VydmljZU5hbWVfMSA9ICJTZXJ2aWNlMSI7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgc2VydmljZU5hbWVfMiA9ICJTZXJ2aWNlMiI7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgc2VydmljZU5hbWVfMyA9ICJTZXJ2aWNlMyI7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgc2VydmljZU5hbWVfNCA9ICJTZXJ2aWNlNCI7Ci0gICAgcHJpdmF0ZSBRTmFtZSBzZXJ2aWNlX1FOYW1lXzEgPSBuZXcgUU5hbWUoc2VydmljZU5hbWVfMSk7Ci0gICAgcHJpdmF0ZSBRTmFtZSBzZXJ2aWNlX1FOYW1lXzIgPSBuZXcgUU5hbWUoc2VydmljZU5hbWVfMik7Ci0gICAgcHJpdmF0ZSBRTmFtZSBzZXJ2aWNlX1FOYW1lXzMgPSBuZXcgUU5hbWUoc2VydmljZU5hbWVfMyk7Ci0gICAgcHJpdmF0ZSBRTmFtZSBzZXJ2aWNlX1FOYW1lXzQgPSBuZXcgUU5hbWUoc2VydmljZU5hbWVfNCk7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBvcGVyYXRpb25OYW1lXzFfMSA9ICJUZXN0T3BlcmF0aW9uMV8xIjsKLSAgICBwcml2YXRlIFN0cmluZyBvcGVyYXRpb25OYW1lXzFfMiA9ICJUZXN0T3BlcmF0aW9uMV8yIjsKLSAgICBwcml2YXRlIFFOYW1lIG9wZXJhdGlvbl9RTmFtZV8xXzEgPSBuZXcgUU5hbWUob3BlcmF0aW9uTmFtZV8xXzEpOwotICAgIHByaXZhdGUgUU5hbWUgb3BlcmF0aW9uX1FOYW1lXzFfMiA9IG5ldyBRTmFtZShvcGVyYXRpb25OYW1lXzFfMik7Ci0KLSAgICBwcml2YXRlIFNlcnZpY2VHcm91cENvbnRleHQgc3J2R3JwQ3R4XzEyMyA9IG51bGw7Ci0gICAgcHJpdmF0ZSBBeGlzU2VydmljZUdyb3VwIGF4aXNTcnZHcnBfMTIzID0gbnVsbDsKLQotICAgIHByaXZhdGUgU2VydmljZUNvbnRleHQgc3J2Q3R4XzEgPSBudWxsOwotICAgIHByaXZhdGUgU2VydmljZUNvbnRleHQgc3J2Q3R4XzIgPSBudWxsOwotICAgIHByaXZhdGUgU2VydmljZUNvbnRleHQgc3J2Q3R4XzMgPSBudWxsOwotICAgIHByaXZhdGUgU2VydmljZUNvbnRleHQgc3J2Q3R4XzQgPSBudWxsOwotICAgIHByaXZhdGUgQXhpc1NlcnZpY2UgYXhpc1Nydl8xID0gbnVsbDsKLSAgICBwcml2YXRlIEF4aXNTZXJ2aWNlIGF4aXNTcnZfMiA9IG51bGw7Ci0gICAgcHJpdmF0ZSBBeGlzU2VydmljZSBheGlzU3J2XzMgPSBudWxsOwotICAgIHByaXZhdGUgQXhpc1NlcnZpY2UgYXhpc1Nydl80ID0gbnVsbDsKLQotICAgIHByaXZhdGUgT3BlcmF0aW9uQ29udGV4dCBvcEN0eF8xXzEgPSBudWxsOwotICAgIHByaXZhdGUgT3BlcmF0aW9uQ29udGV4dCBvcEN0eF8xXzIgPSBudWxsOwotICAgIHByaXZhdGUgQXhpc09wZXJhdGlvbiBheGlzT3BfMV8xID0gbnVsbDsKLSAgICBwcml2YXRlIEF4aXNPcGVyYXRpb24gYXhpc09wXzFfMiA9IG51bGw7Ci0KLSAgICBwcml2YXRlIE1lc3NhZ2VDb250ZXh0IG1zZ0N0eF8xXzEgPSBudWxsOwotICAgIHByaXZhdGUgTWVzc2FnZUNvbnRleHQgbXNnQ3R4XzFfMiA9IG51bGw7Ci0gICAgLy9wcml2YXRlIEF4aXNNZXNzYWdlICAgICAgICAgIGF4aXNNc2dfMV8xICAgPSBudWxsOwotICAgIC8vcHJpdmF0ZSBBeGlzTWVzc2FnZSAgICAgICAgICBheGlzTXNnXzFfMiAgID0gbnVsbDsKLQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBzZXJ2aWNlIGdyb3VwIERBWQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHJpdmF0ZSBTdHJpbmcgc2VydmljZUdyb3VwTmFtZV9EQVkgPSAiRGF5U2VydmljZUdyb3VwIjsKLQotICAgIHByaXZhdGUgU3RyaW5nIHNlcnZpY2VOYW1lX01vbiA9ICJNb25kYXlTZXJ2aWNlIjsKLSAgICBwcml2YXRlIFN0cmluZyBzZXJ2aWNlTmFtZV9UdWUgPSAiVHVlc2RheVNlcnZpY2UiOwotICAgIHByaXZhdGUgU3RyaW5nIHNlcnZpY2VOYW1lX1dlZCA9ICJXZWRuZXNkYXlTZXJ2aWNlIjsKLSAgICBwcml2YXRlIFN0cmluZyBzZXJ2aWNlTmFtZV9UaHUgPSAiVGh1cnNkYXlTZXJ2aWNlIjsKLSAgICBwcml2YXRlIFN0cmluZyBzZXJ2aWNlTmFtZV9GcmkgPSAiRnJpZGF5U2VydmljZSI7Ci0gICAgcHJpdmF0ZSBRTmFtZSBzZXJ2aWNlX1FOYW1lX01vbiA9IG5ldyBRTmFtZShzZXJ2aWNlTmFtZV9Nb24pOwotICAgIHByaXZhdGUgUU5hbWUgc2VydmljZV9RTmFtZV9UdWUgPSBuZXcgUU5hbWUoc2VydmljZU5hbWVfVHVlKTsKLSAgICBwcml2YXRlIFFOYW1lIHNlcnZpY2VfUU5hbWVfV2VkID0gbmV3IFFOYW1lKHNlcnZpY2VOYW1lX1dlZCk7Ci0gICAgcHJpdmF0ZSBRTmFtZSBzZXJ2aWNlX1FOYW1lX1RodSA9IG5ldyBRTmFtZShzZXJ2aWNlTmFtZV9UaHUpOwotICAgIHByaXZhdGUgUU5hbWUgc2VydmljZV9RTmFtZV9GcmkgPSBuZXcgUU5hbWUoc2VydmljZU5hbWVfRnJpKTsKLQotICAgIHByaXZhdGUgU3RyaW5nIG9wZXJhdGlvbk5hbWVfTW9uXzEgPSAiVGVzdE9wZXJhdGlvbl9Nb25fMSI7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgb3BlcmF0aW9uTmFtZV9Nb25fMiA9ICJUZXN0T3BlcmF0aW9uX01vbl8yIjsKLSAgICBwcml2YXRlIFFOYW1lIG9wZXJhdGlvbl9RTmFtZV9Nb25fMSA9IG5ldyBRTmFtZShvcGVyYXRpb25OYW1lX01vbl8xKTsKLSAgICBwcml2YXRlIFFOYW1lIG9wZXJhdGlvbl9RTmFtZV9Nb25fMiA9IG5ldyBRTmFtZShvcGVyYXRpb25OYW1lX01vbl8yKTsKLQotICAgIHByaXZhdGUgU2VydmljZUdyb3VwQ29udGV4dCBzcnZHcnBDdHhfREFZID0gbnVsbDsKLSAgICBwcml2YXRlIEF4aXNTZXJ2aWNlR3JvdXAgYXhpc1NydkdycF9EQVkgPSBudWxsOwotCi0gICAgcHJpdmF0ZSBTZXJ2aWNlQ29udGV4dCBzcnZDdHhfTW9uID0gbnVsbDsKLSAgICBwcml2YXRlIFNlcnZpY2VDb250ZXh0IHNydkN0eF9UdWUgPSBudWxsOwotICAgIHByaXZhdGUgU2VydmljZUNvbnRleHQgc3J2Q3R4X1dlZCA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTZXJ2aWNlQ29udGV4dCBzcnZDdHhfVGh1ID0gbnVsbDsKLSAgICBwcml2YXRlIFNlcnZpY2VDb250ZXh0IHNydkN0eF9GcmkgPSBudWxsOwotICAgIHByaXZhdGUgQXhpc1NlcnZpY2UgYXhpc1Nydl9Nb24gPSBudWxsOwotICAgIHByaXZhdGUgQXhpc1NlcnZpY2UgYXhpc1Nydl9UdWUgPSBudWxsOwotICAgIHByaXZhdGUgQXhpc1NlcnZpY2UgYXhpc1Nydl9XZWQgPSBudWxsOwotICAgIHByaXZhdGUgQXhpc1NlcnZpY2UgYXhpc1Nydl9UaHUgPSBudWxsOwotICAgIHByaXZhdGUgQXhpc1NlcnZpY2UgYXhpc1Nydl9GcmkgPSBudWxsOwotCi0gICAgcHJpdmF0ZSBPcGVyYXRpb25Db250ZXh0IG9wQ3R4X01vbl8xID0gbnVsbDsKLSAgICBwcml2YXRlIE9wZXJhdGlvbkNvbnRleHQgb3BDdHhfTW9uXzIgPSBudWxsOwotICAgIHByaXZhdGUgQXhpc09wZXJhdGlvbiBheGlzT3BfTW9uXzEgPSBudWxsOwotICAgIHByaXZhdGUgQXhpc09wZXJhdGlvbiBheGlzT3BfTW9uXzIgPSBudWxsOwotCi0gICAgcHJpdmF0ZSBNZXNzYWdlQ29udGV4dCBtc2dDdHhfTW9uXzEgPSBudWxsOwotICAgIHByaXZhdGUgTWVzc2FnZUNvbnRleHQgbXNnQ3R4X01vbl8yID0gbnVsbDsKLSAgICAvL3ByaXZhdGUgQXhpc01lc3NhZ2UgICAgICAgICAgYXhpc01zZ19Nb25fMSA9IG51bGw7Ci0gICAgLy9wcml2YXRlIEF4aXNNZXNzYWdlICAgICAgICAgIGF4aXNNc2dfTW9uXzIgPSBudWxsOwotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gIG9iamVjdHMgbmVlZGVkIGZvciBtZXNzYWdlIGNvbnRleHQKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgcHJpdmF0ZSBUcmFuc3BvcnRPdXREZXNjcmlwdGlvbiB0cmFuc3BvcnRPdXQgPSBudWxsOwotICAgIHByaXZhdGUgVHJhbnNwb3J0T3V0RGVzY3JpcHRpb24gdHJhbnNwb3J0T3V0MiA9IG51bGw7Ci0gICAgcHJpdmF0ZSBUcmFuc3BvcnRPdXREZXNjcmlwdGlvbiB0cmFuc3BvcnRPdXQzID0gbnVsbDsKLSAgICBwcml2YXRlIFRyYW5zcG9ydEluRGVzY3JpcHRpb24gdHJhbnNwb3J0SW4gPSBudWxsOwotICAgIHByaXZhdGUgVHJhbnNwb3J0SW5EZXNjcmlwdGlvbiB0cmFuc3BvcnRJbjIgPSBudWxsOwotICAgIHByaXZhdGUgVHJhbnNwb3J0SW5EZXNjcmlwdGlvbiB0cmFuc3BvcnRJbjMgPSBudWxsOwotCi0gICAgcHJpdmF0ZSBQaGFzZSBwaGFzZTEgPSBudWxsOwotCi0gICAgcHJpdmF0ZSBBcnJheUxpc3QgZXhlY3V0ZWRIYW5kbGVycyA9IG51bGw7Ci0KLSAgICBwcml2YXRlIE1lc3NhZ2VDb250ZXh0IHJlc3RvcmVkTWVzc2FnZUNvbnRleHQgPSBudWxsOwotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gbWV0aG9kcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0KLSAgICBwdWJsaWMgTWVzc2FnZUNvbnRleHRTYXZlQlRlc3QoU3RyaW5nIGFyZzApIHsKLSAgICAgICAgc3VwZXIoYXJnMCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHByZXBhcmUoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiTWVzc2FnZUNvbnRleHRTYXZlQlRlc3Q6Y29uc3RydWN0b3I6ICBlcnJvciBpbiBzZXR0aW5nIHVwIG9iamVjdCBncmFwaCBbIiArCi0gICAgICAgICAgICAgICAgICAgIGUuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIDogIiArIGUuZ2V0TWVzc2FnZSgpICsgIl0iKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLy8KLSAgICAvLyBwcmVwYXJlIHRoZSBvYmplY3QgaGllcmFyY2h5IGZvciB0ZXN0aW5nCi0gICAgLy8KLSAgICBwcml2YXRlIHZvaWQgcHJlcGFyZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIHNldHVwIHRoZSB0b3AtbGV2ZWwgb2JqZWN0cwotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgYXhpc0NvbmZpZ3VyYXRpb24gPSBuZXcgQXhpc0NvbmZpZ3VyYXRpb24oKTsKLQotICAgICAgICBjb25maWd1cmF0aW9uQ29udGV4dCA9IG5ldyBDb25maWd1cmF0aW9uQ29udGV4dChheGlzQ29uZmlndXJhdGlvbik7Ci0KLSAgICAgICAgY29uZmlndXJhdGlvbkNvbnRleHQuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5hZGRNZXNzYWdlUmVjZWl2ZXIoCi0gICAgICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgvd3NkbC9pbi1vbmx5IiwgbmV3IFJhd1hNTElOT25seU1lc3NhZ2VSZWNlaXZlcigpKTsKLSAgICAgICAgY29uZmlndXJhdGlvbkNvbnRleHQuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5hZGRNZXNzYWdlUmVjZWl2ZXIoCi0gICAgICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgvd3NkbC9pbi1vdXQiLCBuZXcgUmF3WE1MSU5PdXRNZXNzYWdlUmVjZWl2ZXIoKSk7Ci0KLSAgICAgICAgRGlzcGF0Y2hQaGFzZSBkaXNwYXRjaFBoYXNlID0gbmV3IERpc3BhdGNoUGhhc2UoKTsKLSAgICAgICAgZGlzcGF0Y2hQaGFzZS5zZXROYW1lKCJEaXNwYXRjaCIpOwotCi0gICAgICAgIEFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIgYWJkID0gbmV3IEFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIoKTsKLSAgICAgICAgYWJkLmluaXREaXNwYXRjaGVyKCk7Ci0KLSAgICAgICAgUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciBydWQgPSBuZXcgUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlcigpOwotICAgICAgICBydWQuaW5pdERpc3BhdGNoZXIoKTsKLQotICAgICAgICBTT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIHNhYmQgPSBuZXcgU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlcigpOwotICAgICAgICBzYWJkLmluaXREaXNwYXRjaGVyKCk7Ci0KLSAgICAgICAgU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIHNtYmQgPSBuZXcgU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyKCk7Ci0gICAgICAgIHNtYmQuaW5pdERpc3BhdGNoZXIoKTsKLQotICAgICAgICBkaXNwYXRjaFBoYXNlLmFkZEhhbmRsZXIoYWJkKTsKLSAgICAgICAgZGlzcGF0Y2hQaGFzZS5hZGRIYW5kbGVyKHJ1ZCk7Ci0gICAgICAgIGRpc3BhdGNoUGhhc2UuYWRkSGFuZGxlcihzYWJkKTsKLSAgICAgICAgZGlzcGF0Y2hQaGFzZS5hZGRIYW5kbGVyKHNtYmQpOwotCi0gICAgICAgIGNvbmZpZ3VyYXRpb25Db250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCkuZ2V0SW5GbG93UGhhc2VzKCkuYWRkKGRpc3BhdGNoUGhhc2UpOwotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyB0cmFuc3BvcnQtcmVsYXRlZCBvYmplY3RzCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICB0cmFuc3BvcnRPdXQgPSBuZXcgVHJhbnNwb3J0T3V0RGVzY3JpcHRpb24oIm51bGwiKTsKLSAgICAgICAgdHJhbnNwb3J0T3V0MiA9IG5ldyBUcmFuc3BvcnRPdXREZXNjcmlwdGlvbigiaGFwcHkiKTsKLSAgICAgICAgdHJhbnNwb3J0T3V0MyA9IG5ldyBUcmFuc3BvcnRPdXREZXNjcmlwdGlvbigiZ29sdWNreSIpOwotICAgICAgICB0cmFuc3BvcnRPdXQuc2V0U2VuZGVyKG5ldyBDb21tb25zSFRUUFRyYW5zcG9ydFNlbmRlcigpKTsKLSAgICAgICAgdHJhbnNwb3J0T3V0Mi5zZXRTZW5kZXIobmV3IENvbW1vbnNIVFRQVHJhbnNwb3J0U2VuZGVyKCkpOwotICAgICAgICB0cmFuc3BvcnRPdXQzLnNldFNlbmRlcihuZXcgQ29tbW9uc0hUVFBUcmFuc3BvcnRTZW5kZXIoKSk7Ci0KLSAgICAgICAgYXhpc0NvbmZpZ3VyYXRpb24uYWRkVHJhbnNwb3J0T3V0KHRyYW5zcG9ydE91dDMpOwotICAgICAgICBheGlzQ29uZmlndXJhdGlvbi5hZGRUcmFuc3BvcnRPdXQodHJhbnNwb3J0T3V0Mik7Ci0gICAgICAgIGF4aXNDb25maWd1cmF0aW9uLmFkZFRyYW5zcG9ydE91dCh0cmFuc3BvcnRPdXQpOwotCi0gICAgICAgIHRyYW5zcG9ydEluID0gbmV3IFRyYW5zcG9ydEluRGVzY3JpcHRpb24oIm51bGwiKTsKLSAgICAgICAgdHJhbnNwb3J0SW4yID0gbmV3IFRyYW5zcG9ydEluRGVzY3JpcHRpb24oImFsd2F5cyIpOwotICAgICAgICB0cmFuc3BvcnRJbjMgPSBuZXcgVHJhbnNwb3J0SW5EZXNjcmlwdGlvbigidGhlYmVzdCIpOwotICAgICAgICB0cmFuc3BvcnRJbi5zZXRSZWNlaXZlcihuZXcgU2ltcGxlSFRUUFNlcnZlcigpKTsKLSAgICAgICAgdHJhbnNwb3J0SW4yLnNldFJlY2VpdmVyKG5ldyBTaW1wbGVIVFRQU2VydmVyKCkpOwotICAgICAgICB0cmFuc3BvcnRJbjMuc2V0UmVjZWl2ZXIobmV3IFNpbXBsZUhUVFBTZXJ2ZXIoKSk7Ci0KLSAgICAgICAgYXhpc0NvbmZpZ3VyYXRpb24uYWRkVHJhbnNwb3J0SW4odHJhbnNwb3J0SW4yKTsKLSAgICAgICAgYXhpc0NvbmZpZ3VyYXRpb24uYWRkVHJhbnNwb3J0SW4odHJhbnNwb3J0SW4pOwotICAgICAgICBheGlzQ29uZmlndXJhdGlvbi5hZGRUcmFuc3BvcnRJbih0cmFuc3BvcnRJbjMpOwotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBwaGFzZS1yZWxhdGVkIG9iamVjdHMKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIHBoYXNlMSA9IG5ldyBQaGFzZSgiUGhhc2UxIik7Ci0gICAgICAgIHBoYXNlMS5hZGRIYW5kbGVyKG5ldyBUZW1wSGFuZGxlcigxLCAyKSk7Ci0gICAgICAgIHBoYXNlMS5hZGRIYW5kbGVyKG5ldyBIYW5kbGVyTUNTKDIsIHRydWUpKTsKLSAgICAgICAgcGhhc2UxLmFkZEhhbmRsZXIobmV3IFRlbXBIYW5kbGVyKDMsIDIpKTsKLQotICAgICAgICBBcnJheUxpc3QgcGhhc2VzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBwaGFzZXMuYWRkKHBoYXNlMSk7Ci0KLSAgICAgICAgYXhpc0NvbmZpZ3VyYXRpb24uc2V0SW5QaGFzZXNVcHRvQW5kSW5jbHVkaW5nUG9zdERpc3BhdGNoKHBoYXNlcyk7Ci0KLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBzZXR1cCB0aGUgYXhpcyBzaWRlIG9mIHRoZSBoaWVyYWNoeQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIEFCQyBncm91cAotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgYXhpc1NydkdycF9BQkMgPSBuZXcgQXhpc1NlcnZpY2VHcm91cChheGlzQ29uZmlndXJhdGlvbik7Ci0gICAgICAgIGF4aXNTcnZHcnBfQUJDLnNldFNlcnZpY2VHcm91cE5hbWUoc2VydmljZUdyb3VwTmFtZV9BQkMpOwotCi0gICAgICAgIGF4aXNTcnZfQSA9IG5ldyBBeGlzU2VydmljZShzZXJ2aWNlX1FOYW1lX0EuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICBheGlzU3J2X0IgPSBuZXcgQXhpc1NlcnZpY2Uoc2VydmljZV9RTmFtZV9CLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgYXhpc1Nydl9DID0gbmV3IEF4aXNTZXJ2aWNlKHNlcnZpY2VfUU5hbWVfQy5nZXRMb2NhbFBhcnQoKSk7Ci0KLSAgICAgICAgYXhpc1NydkdycF9BQkMuYWRkU2VydmljZShheGlzU3J2X0EpOwotICAgICAgICBheGlzU3J2R3JwX0FCQy5hZGRTZXJ2aWNlKGF4aXNTcnZfQik7Ci0gICAgICAgIGF4aXNTcnZHcnBfQUJDLmFkZFNlcnZpY2UoYXhpc1Nydl9DKTsKLQotICAgICAgICBheGlzT3BfQTEgPSBuZXcgSW5PdXRBeGlzT3BlcmF0aW9uKG9wZXJhdGlvbl9RTmFtZV9BMSk7Ci0gICAgICAgIGF4aXNPcF9BMiA9IG5ldyBJbk91dEF4aXNPcGVyYXRpb24ob3BlcmF0aW9uX1FOYW1lX0EyKTsKLQotICAgICAgICBheGlzT3BfQTEuc2V0TWVzc2FnZVJlY2VpdmVyKG5ldyBNZXNzYWdlUmVjZWl2ZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCByZWNlaXZlKE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDdHgpIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgYXhpc09wX0EyLnNldE1lc3NhZ2VSZWNlaXZlcihuZXcgTWVzc2FnZVJlY2VpdmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgcmVjZWl2ZShNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ3R4KSB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIGF4aXNTcnZfQS5hZGRPcGVyYXRpb24oYXhpc09wX0ExKTsKLSAgICAgICAgYXhpc1Nydl9BLm1hcEFjdGlvblRvT3BlcmF0aW9uKG9wZXJhdGlvbl9RTmFtZV9BMS5nZXRMb2NhbFBhcnQoKSwgYXhpc09wX0ExKTsKLQotICAgICAgICBheGlzU3J2X0EuYWRkT3BlcmF0aW9uKGF4aXNPcF9BMik7Ci0gICAgICAgIGF4aXNTcnZfQS5tYXBBY3Rpb25Ub09wZXJhdGlvbihvcGVyYXRpb25fUU5hbWVfQTIuZ2V0TG9jYWxQYXJ0KCksIGF4aXNPcF9BMik7Ci0KLSAgICAgICAgYXhpc0NvbmZpZ3VyYXRpb24uYWRkU2VydmljZShheGlzU3J2X0EpOwotICAgICAgICBheGlzQ29uZmlndXJhdGlvbi5hZGRTZXJ2aWNlKGF4aXNTcnZfQik7Ci0gICAgICAgIGF4aXNDb25maWd1cmF0aW9uLmFkZFNlcnZpY2UoYXhpc1Nydl9DKTsKLQotCi0gICAgICAgIGF4aXNPcF9BMS5nZXRSZW1haW5pbmdQaGFzZXNJbkZsb3coKS5hZGQocGhhc2UxKTsKLSAgICAgICAgYXhpc09wX0EyLmdldFJlbWFpbmluZ1BoYXNlc0luRmxvdygpLmFkZChwaGFzZTEpOwotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyAxMjMgZ3JvdXAKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIGF4aXNTcnZHcnBfMTIzID0gbmV3IEF4aXNTZXJ2aWNlR3JvdXAoYXhpc0NvbmZpZ3VyYXRpb24pOwotICAgICAgICBheGlzU3J2R3JwXzEyMy5zZXRTZXJ2aWNlR3JvdXBOYW1lKHNlcnZpY2VHcm91cE5hbWVfMTIzKTsKLQotICAgICAgICBheGlzU3J2XzEgPSBuZXcgQXhpc1NlcnZpY2Uoc2VydmljZV9RTmFtZV8xLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgYXhpc1Nydl8yID0gbmV3IEF4aXNTZXJ2aWNlKHNlcnZpY2VfUU5hbWVfMi5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgIGF4aXNTcnZfMyA9IG5ldyBBeGlzU2VydmljZShzZXJ2aWNlX1FOYW1lXzMuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICBheGlzU3J2XzQgPSBuZXcgQXhpc1NlcnZpY2Uoc2VydmljZV9RTmFtZV80LmdldExvY2FsUGFydCgpKTsKLQotICAgICAgICBheGlzU3J2R3JwXzEyMy5hZGRTZXJ2aWNlKGF4aXNTcnZfMSk7Ci0gICAgICAgIGF4aXNTcnZHcnBfMTIzLmFkZFNlcnZpY2UoYXhpc1Nydl8yKTsKLSAgICAgICAgYXhpc1NydkdycF8xMjMuYWRkU2VydmljZShheGlzU3J2XzMpOwotICAgICAgICBheGlzU3J2R3JwXzEyMy5hZGRTZXJ2aWNlKGF4aXNTcnZfNCk7Ci0KLSAgICAgICAgYXhpc09wXzFfMSA9IG5ldyBJbk91dEF4aXNPcGVyYXRpb24ob3BlcmF0aW9uX1FOYW1lXzFfMSk7Ci0gICAgICAgIGF4aXNPcF8xXzIgPSBuZXcgSW5PdXRBeGlzT3BlcmF0aW9uKG9wZXJhdGlvbl9RTmFtZV8xXzIpOwotCi0gICAgICAgIGF4aXNPcF8xXzEuc2V0TWVzc2FnZVJlY2VpdmVyKG5ldyBNZXNzYWdlUmVjZWl2ZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCByZWNlaXZlKE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDdHgpIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgYXhpc09wXzFfMi5zZXRNZXNzYWdlUmVjZWl2ZXIobmV3IE1lc3NhZ2VSZWNlaXZlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJlY2VpdmUoTWVzc2FnZUNvbnRleHQgbWVzc2FnZUN0eCkgewotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBheGlzU3J2XzEuYWRkT3BlcmF0aW9uKGF4aXNPcF8xXzEpOwotICAgICAgICBheGlzU3J2XzEubWFwQWN0aW9uVG9PcGVyYXRpb24ob3BlcmF0aW9uX1FOYW1lXzFfMS5nZXRMb2NhbFBhcnQoKSwgYXhpc09wXzFfMSk7Ci0KLSAgICAgICAgYXhpc1Nydl8xLmFkZE9wZXJhdGlvbihheGlzT3BfMV8yKTsKLSAgICAgICAgYXhpc1Nydl8xLm1hcEFjdGlvblRvT3BlcmF0aW9uKG9wZXJhdGlvbl9RTmFtZV8xXzIuZ2V0TG9jYWxQYXJ0KCksIGF4aXNPcF8xXzIpOwotCi0gICAgICAgIGF4aXNDb25maWd1cmF0aW9uLmFkZFNlcnZpY2UoYXhpc1Nydl8xKTsKLSAgICAgICAgYXhpc0NvbmZpZ3VyYXRpb24uYWRkU2VydmljZShheGlzU3J2XzIpOwotICAgICAgICBheGlzQ29uZmlndXJhdGlvbi5hZGRTZXJ2aWNlKGF4aXNTcnZfMyk7Ci0gICAgICAgIGF4aXNDb25maWd1cmF0aW9uLmFkZFNlcnZpY2UoYXhpc1Nydl80KTsKLQotICAgICAgICBheGlzT3BfMV8xLmdldFJlbWFpbmluZ1BoYXNlc0luRmxvdygpLmFkZChwaGFzZTEpOwotICAgICAgICBheGlzT3BfMV8yLmdldFJlbWFpbmluZ1BoYXNlc0luRmxvdygpLmFkZChwaGFzZTEpOwotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBEQVkgZ3JvdXAKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIGF4aXNTcnZHcnBfREFZID0gbmV3IEF4aXNTZXJ2aWNlR3JvdXAoYXhpc0NvbmZpZ3VyYXRpb24pOwotICAgICAgICBheGlzU3J2R3JwX0RBWS5zZXRTZXJ2aWNlR3JvdXBOYW1lKHNlcnZpY2VHcm91cE5hbWVfREFZKTsKLQotICAgICAgICBheGlzU3J2X01vbiA9IG5ldyBBeGlzU2VydmljZShzZXJ2aWNlX1FOYW1lX01vbi5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgIGF4aXNTcnZfVHVlID0gbmV3IEF4aXNTZXJ2aWNlKHNlcnZpY2VfUU5hbWVfVHVlLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgYXhpc1Nydl9XZWQgPSBuZXcgQXhpc1NlcnZpY2Uoc2VydmljZV9RTmFtZV9XZWQuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICBheGlzU3J2X1RodSA9IG5ldyBBeGlzU2VydmljZShzZXJ2aWNlX1FOYW1lX1RodS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgIGF4aXNTcnZfRnJpID0gbmV3IEF4aXNTZXJ2aWNlKHNlcnZpY2VfUU5hbWVfRnJpLmdldExvY2FsUGFydCgpKTsKLQotICAgICAgICBheGlzU3J2R3JwX0RBWS5hZGRTZXJ2aWNlKGF4aXNTcnZfTW9uKTsKLSAgICAgICAgYXhpc1NydkdycF9EQVkuYWRkU2VydmljZShheGlzU3J2X1R1ZSk7Ci0gICAgICAgIGF4aXNTcnZHcnBfREFZLmFkZFNlcnZpY2UoYXhpc1Nydl9XZWQpOwotICAgICAgICBheGlzU3J2R3JwX0RBWS5hZGRTZXJ2aWNlKGF4aXNTcnZfVGh1KTsKLSAgICAgICAgYXhpc1NydkdycF9EQVkuYWRkU2VydmljZShheGlzU3J2X0ZyaSk7Ci0KLSAgICAgICAgYXhpc09wX01vbl8xID0gbmV3IEluT3V0QXhpc09wZXJhdGlvbihvcGVyYXRpb25fUU5hbWVfTW9uXzEpOwotICAgICAgICBheGlzT3BfTW9uXzIgPSBuZXcgSW5PdXRBeGlzT3BlcmF0aW9uKG9wZXJhdGlvbl9RTmFtZV9Nb25fMik7Ci0KLSAgICAgICAgYXhpc09wX01vbl8xLnNldE1lc3NhZ2VSZWNlaXZlcihuZXcgTWVzc2FnZVJlY2VpdmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgcmVjZWl2ZShNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ3R4KSB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIGF4aXNPcF9Nb25fMi5zZXRNZXNzYWdlUmVjZWl2ZXIobmV3IE1lc3NhZ2VSZWNlaXZlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJlY2VpdmUoTWVzc2FnZUNvbnRleHQgbWVzc2FnZUN0eCkgewotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBheGlzU3J2X01vbi5hZGRPcGVyYXRpb24oYXhpc09wX01vbl8xKTsKLSAgICAgICAgYXhpc1Nydl9Nb24ubWFwQWN0aW9uVG9PcGVyYXRpb24ob3BlcmF0aW9uX1FOYW1lX01vbl8xLmdldExvY2FsUGFydCgpLCBheGlzT3BfTW9uXzEpOwotCi0gICAgICAgIGF4aXNTcnZfTW9uLmFkZE9wZXJhdGlvbihheGlzT3BfTW9uXzIpOwotICAgICAgICBheGlzU3J2X01vbi5tYXBBY3Rpb25Ub09wZXJhdGlvbihvcGVyYXRpb25fUU5hbWVfTW9uXzIuZ2V0TG9jYWxQYXJ0KCksIGF4aXNPcF9Nb25fMik7Ci0KLSAgICAgICAgYXhpc0NvbmZpZ3VyYXRpb24uYWRkU2VydmljZShheGlzU3J2X01vbik7Ci0gICAgICAgIGF4aXNDb25maWd1cmF0aW9uLmFkZFNlcnZpY2UoYXhpc1Nydl9UdWUpOwotICAgICAgICBheGlzQ29uZmlndXJhdGlvbi5hZGRTZXJ2aWNlKGF4aXNTcnZfV2VkKTsKLSAgICAgICAgYXhpc0NvbmZpZ3VyYXRpb24uYWRkU2VydmljZShheGlzU3J2X1RodSk7Ci0gICAgICAgIGF4aXNDb25maWd1cmF0aW9uLmFkZFNlcnZpY2UoYXhpc1Nydl9GcmkpOwotCi0gICAgICAgIGF4aXNPcF9Nb25fMS5nZXRSZW1haW5pbmdQaGFzZXNJbkZsb3coKS5hZGQocGhhc2UxKTsKLSAgICAgICAgYXhpc09wX01vbl8yLmdldFJlbWFpbmluZ1BoYXNlc0luRmxvdygpLmFkZChwaGFzZTEpOwotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gc2V0dXAgdGhlIGNvbnRleHQgb2JqZWN0cwotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIHNydkdycEN0eF9BQkMgPSBjb25maWd1cmF0aW9uQ29udGV4dC5jcmVhdGVTZXJ2aWNlR3JvdXBDb250ZXh0KGF4aXNTcnZHcnBfQUJDKTsKLSAgICAgICAgc3J2R3JwQ3R4X0FCQy5zZXRJZChzZXJ2aWNlR3JvdXBOYW1lX0FCQyk7Ci0KLSAgICAgICAgc3J2R3JwQ3R4XzEyMyA9IGNvbmZpZ3VyYXRpb25Db250ZXh0LmNyZWF0ZVNlcnZpY2VHcm91cENvbnRleHQoYXhpc1NydkdycF8xMjMpOwotICAgICAgICBzcnZHcnBDdHhfMTIzLnNldElkKHNlcnZpY2VHcm91cE5hbWVfQUJDKTsKLQotICAgICAgICBzcnZHcnBDdHhfREFZID0gY29uZmlndXJhdGlvbkNvbnRleHQuY3JlYXRlU2VydmljZUdyb3VwQ29udGV4dChheGlzU3J2R3JwX0RBWSk7Ci0gICAgICAgIHNydkdycEN0eF9EQVkuc2V0SWQoc2VydmljZUdyb3VwTmFtZV9EQVkpOwotCi0gICAgICAgIHNydkN0eF9BID0gc3J2R3JwQ3R4X0FCQy5nZXRTZXJ2aWNlQ29udGV4dChheGlzU3J2X0EpOwotICAgICAgICBzcnZDdHhfQiA9IHNydkdycEN0eF9BQkMuZ2V0U2VydmljZUNvbnRleHQoYXhpc1Nydl9CKTsKLSAgICAgICAgc3J2Q3R4X0MgPSBzcnZHcnBDdHhfQUJDLmdldFNlcnZpY2VDb250ZXh0KGF4aXNTcnZfQyk7Ci0KLSAgICAgICAgc3J2Q3R4XzEgPSBzcnZHcnBDdHhfMTIzLmdldFNlcnZpY2VDb250ZXh0KGF4aXNTcnZfMSk7Ci0gICAgICAgIHNydkN0eF8yID0gc3J2R3JwQ3R4XzEyMy5nZXRTZXJ2aWNlQ29udGV4dChheGlzU3J2XzIpOwotICAgICAgICBzcnZDdHhfMyA9IHNydkdycEN0eF8xMjMuZ2V0U2VydmljZUNvbnRleHQoYXhpc1Nydl8zKTsKLSAgICAgICAgc3J2Q3R4XzQgPSBzcnZHcnBDdHhfMTIzLmdldFNlcnZpY2VDb250ZXh0KGF4aXNTcnZfNCk7Ci0KLSAgICAgICAgc3J2Q3R4X01vbiA9IHNydkdycEN0eF9EQVkuZ2V0U2VydmljZUNvbnRleHQoYXhpc1Nydl9Nb24pOwotICAgICAgICBzcnZDdHhfVHVlID0gc3J2R3JwQ3R4X0RBWS5nZXRTZXJ2aWNlQ29udGV4dChheGlzU3J2X1R1ZSk7Ci0gICAgICAgIHNydkN0eF9XZWQgPSBzcnZHcnBDdHhfREFZLmdldFNlcnZpY2VDb250ZXh0KGF4aXNTcnZfV2VkKTsKLSAgICAgICAgc3J2Q3R4X1RodSA9IHNydkdycEN0eF9EQVkuZ2V0U2VydmljZUNvbnRleHQoYXhpc1Nydl9UaHUpOwotICAgICAgICBzcnZDdHhfRnJpID0gc3J2R3JwQ3R4X0RBWS5nZXRTZXJ2aWNlQ29udGV4dChheGlzU3J2X0ZyaSk7Ci0KLSAgICAgICAgb3BDdHhfQTEgPSBzcnZDdHhfQS5jcmVhdGVPcGVyYXRpb25Db250ZXh0KG9wZXJhdGlvbl9RTmFtZV9BMSk7Ci0gICAgICAgIG9wQ3R4X0EyID0gc3J2Q3R4X0EuY3JlYXRlT3BlcmF0aW9uQ29udGV4dChvcGVyYXRpb25fUU5hbWVfQTIpOwotCi0gICAgICAgIG9wQ3R4XzFfMSA9IHNydkN0eF8xLmNyZWF0ZU9wZXJhdGlvbkNvbnRleHQob3BlcmF0aW9uX1FOYW1lXzFfMSk7Ci0gICAgICAgIG9wQ3R4XzFfMiA9IHNydkN0eF8xLmNyZWF0ZU9wZXJhdGlvbkNvbnRleHQob3BlcmF0aW9uX1FOYW1lXzFfMik7Ci0KLSAgICAgICAgb3BDdHhfTW9uXzEgPSBzcnZDdHhfTW9uLmNyZWF0ZU9wZXJhdGlvbkNvbnRleHQob3BlcmF0aW9uX1FOYW1lX01vbl8xKTsKLSAgICAgICAgb3BDdHhfTW9uXzIgPSBzcnZDdHhfTW9uLmNyZWF0ZU9wZXJhdGlvbkNvbnRleHQob3BlcmF0aW9uX1FOYW1lX01vbl8yKTsKLQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gbWVzc2FnZSBjb250ZXh0IG9iamVjdHMKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIG1zZ0N0eF9BMSA9IGNyZWF0ZU1lc3NhZ2VDb250ZXh0KG9wQ3R4X0ExKTsKLSAgICAgICAgbXNnQ3R4X0EyID0gY3JlYXRlTWVzc2FnZUNvbnRleHQob3BDdHhfQTIpOwotCi0gICAgICAgIG1zZ0N0eF8xXzEgPSBjcmVhdGVNZXNzYWdlQ29udGV4dChvcEN0eF8xXzEpOwotICAgICAgICBtc2dDdHhfMV8yID0gY3JlYXRlTWVzc2FnZUNvbnRleHQob3BDdHhfMV8yKTsKLQotICAgICAgICBtc2dDdHhfTW9uXzEgPSBjcmVhdGVNZXNzYWdlQ29udGV4dChvcEN0eF9Nb25fMSk7Ci0gICAgICAgIG1zZ0N0eF9Nb25fMiA9IGNyZWF0ZU1lc3NhZ2VDb250ZXh0KG9wQ3R4X01vbl8yKTsKLQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIG90aGVyIG9iamVjdHMKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICBleGVjdXRlZEhhbmRsZXJzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIH0KLQotCi0gICAgcHJpdmF0ZSBNZXNzYWdlQ29udGV4dCBjcmVhdGVNZXNzYWdlQ29udGV4dChPcGVyYXRpb25Db250ZXh0IG9jKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgTWVzc2FnZUNvbnRleHQgbWMgPSBjb25maWd1cmF0aW9uQ29udGV4dC5jcmVhdGVNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBtYy5zZXRUcmFuc3BvcnRJbih0cmFuc3BvcnRJbik7Ci0gICAgICAgIG1jLnNldFRyYW5zcG9ydE91dCh0cmFuc3BvcnRPdXQpOwotCi0gICAgICAgIG1jLnNldFNlcnZlclNpZGUodHJ1ZSk7Ci0vLyAgICAgICAgbWMuc2V0UHJvcGVydHkoTWVzc2FnZUNvbnRleHQuVFJBTlNQT1JUX09VVCwgU3lzdGVtLm91dCk7Ci0KLSAgICAgICAgU09BUEZhY3Rvcnkgb21GYWMgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTFGYWN0b3J5KCk7Ci0gICAgICAgIG1jLnNldEVudmVsb3BlKG9tRmFjLmdldERlZmF1bHRFbnZlbG9wZSgpKTsKLQotICAgICAgICBBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb24gPSBvYy5nZXRBeGlzT3BlcmF0aW9uKCk7Ci0gICAgICAgIFN0cmluZyBhY3Rpb24gPSBheGlzT3BlcmF0aW9uLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgbWMuc2V0U29hcEFjdGlvbihhY3Rpb24pOwotLy8gICAgICAgIFN5c3RlbS5vdXQuZmx1c2goKTsKLQotICAgICAgICBtYy5zZXRNZXNzYWdlSUQoVVVJREdlbmVyYXRvci5nZXRVVUlEKCkpOwotCi0gICAgICAgIGF4aXNPcGVyYXRpb24ucmVnaXN0ZXJPcGVyYXRpb25Db250ZXh0KG1jLCBvYyk7Ci0gICAgICAgIG1jLnNldE9wZXJhdGlvbkNvbnRleHQob2MpOwotCi0gICAgICAgIFNlcnZpY2VDb250ZXh0IHNjID0gb2MuZ2V0U2VydmljZUNvbnRleHQoKTsKLSAgICAgICAgbWMuc2V0U2VydmljZUNvbnRleHQoc2MpOwotCi0gICAgICAgIG1jLnNldFRvKG5ldyBFbmRwb2ludFJlZmVyZW5jZSgiYXhpczIvc2VydmljZXMvTnVsbFNlcnZpY2UiKSk7Ci0gICAgICAgIG1jLnNldFdTQUFjdGlvbigiRHVtbXlPcCIpOwotCi0gICAgICAgIEF4aXNNZXNzYWdlIGF4aXNNZXNzYWdlID0gYXhpc09wZXJhdGlvbi5nZXRNZXNzYWdlKFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9JTl9WQUxVRSk7Ci0gICAgICAgIG1jLnNldEF4aXNNZXNzYWdlKGF4aXNNZXNzYWdlKTsKLQotICAgICAgICByZXR1cm4gbWM7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy9vcmcuYXBhY2hlLmxvZzRqLkJhc2ljQ29uZmlndXJhdG9yLmNvbmZpZ3VyZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJ2aWNlUHJvcGVydGllcygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgdGl0bGUgPSAiTWVzc2FnZUNvbnRleHRTYXZlQlRlc3Q6IHRlc3RTZXJ2aWNlUHJvcGVydGllcygpOiAiOwotCi0KLSAgICAgICAgTWVzc2FnZUNvbnRleHQgbWMgPSBtc2dDdHhfMV8xOwotCi0gICAgICAgIC8vIGFkZCBzb21lIHNlcnZpY2UtbGV2ZWwgcHJvcGVydGllcwotICAgICAgICBTdHJpbmcgc3VmZml4ID0gIl9iZWZvcmUiOwotICAgICAgICBhZGRTZXJ2aWNlUHJvcGVydGllcyhtYywgc3VmZml4KTsKLQotICAgICAgICAvLyBnZXQgdGhlIHNlcnZpY2UgbGV2ZWwgcHJvcGVydGllcyBpbnRvIGEgc2VwYXJhdGUgdGFibGUKLSAgICAgICAgTWFwIHByb3BlcnRpZXNfb3JpZ2luYWwgPSBuZXcgSGFzaE1hcChnZXRTZXJ2aWNlUHJvcGVydGllcyhtYykpOwotICAgICAgICBzaG93UHJvcGVydGllcyhwcm9wZXJ0aWVzX29yaWdpbmFsLCAib3JpZ2luYWwgcHJvcGVydGllcyIpOwotCi0gICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArICJzdGFydCAtIC0gZW5naW5lLnJlY2VpdmUobWMpIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0iKTsKLSAgICAgICAgQXhpc0VuZ2luZS5yZWNlaXZlKG1jKTsKLQotICAgICAgICAvLyBnZXQgdGhlIHNlcnZpY2UgbGV2ZWwgcHJvcGVydGllcyBpbnRvIGEgc2VwYXJhdGUgdGFibGUKLSAgICAgICAgTWFwIHByb3BlcnRpZXMyID0gbmV3IEhhc2hNYXAoZ2V0U2VydmljZVByb3BlcnRpZXMocmVzdG9yZWRNZXNzYWdlQ29udGV4dCkpOwotICAgICAgICBzaG93UHJvcGVydGllcyhwcm9wZXJ0aWVzMiwgInJlc3RvcmVkIHByb3BlcnRpZXMiKTsKLQotICAgICAgICAvLyBhZGQgc29tZSBtb3JlIHByb3BlcnRpZXMKLSAgICAgICAgc3VmZml4ID0gIl9wb3N0UmVjZWl2ZSI7Ci0gICAgICAgIGFkZFNlcnZpY2VQcm9wZXJ0aWVzKHJlc3RvcmVkTWVzc2FnZUNvbnRleHQsIHN1ZmZpeCk7Ci0KLSAgICAgICAgLy8gcmVzdW1lIHRoZSBwYXVzZWQgbWVzc2FnZSBjb250ZXh0Ci0gICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArICJyZXN1bWUgLSAtIGVuZ2luZS5yZXN1bWUobWMpIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0iKTsKLSAgICAgICAgQXhpc0VuZ2luZS5yZXN1bWUocmVzdG9yZWRNZXNzYWdlQ29udGV4dCk7Ci0KLSAgICAgICAgLy8gZ2V0IHRoZSBzZXJ2aWNlIGxldmVsIHByb3BlcnRpZXMgaW50byBhIHNlcGFyYXRlIHRhYmxlCi0gICAgICAgIE1hcCBwcm9wZXJ0aWVzMyA9IG5ldyBIYXNoTWFwKGdldFNlcnZpY2VQcm9wZXJ0aWVzKHJlc3RvcmVkTWVzc2FnZUNvbnRleHQpKTsKLSAgICAgICAgc2hvd1Byb3BlcnRpZXMocHJvcGVydGllczMsICJyZXN0b3JlZCBzZXJ2aWNlIHByb3BlcnRpZXMgcG9zdC1yZXN1bWUiKTsKLQotICAgICAgICAvLyBnZXQgdGhlIHNlcnZpY2UgbGV2ZWwgcHJvcGVydGllcyBmcm9tIHRoZSBvdGhlciBtZXNzYWdlIGNvbnRleHQKLSAgICAgICAgLy8gaW4gdGhlIHNhbWUgc2VydmljZSAKLSAgICAgICAgTWFwIHByb3BlcnRpZXM0ID0gZ2V0U2VydmljZVByb3BlcnRpZXMobXNnQ3R4XzFfMik7Ci0gICAgICAgIHNob3dQcm9wZXJ0aWVzKHByb3BlcnRpZXM0LCAic2VydmljZSBwcm9wZXJ0aWVzIGZyb20gb3RoZXIgYWN0aXZlIE1zZ0N0eCIpOwotCi0gICAgICAgIC8vIHRoZSBzZXJ2aWNlIGxldmVsIHByb3BlcnRpZXMgc2hvdWxkIGJlIHRoZSBzYW1lCi0gICAgICAgIGJvb2xlYW4gaXNPayA9IEFjdGl2YXRlVXRpbHMuaXNFcXVpdmFsZW50KHByb3BlcnRpZXMzLCBwcm9wZXJ0aWVzNCwgdHJ1ZSk7Ci0gICAgICAgIGFzc2VydFRydWUoaXNPayk7Ci0KLSAgICB9Ci0KLQotICAgIHByaXZhdGUgTWFwIGdldFNlcnZpY2VQcm9wZXJ0aWVzKE1lc3NhZ2VDb250ZXh0IG1jKSB7Ci0gICAgICAgIE1hcCBwcm9wZXJ0aWVzID0gbnVsbDsKLQotICAgICAgICAvLyBnZXQgdGhlIHNlcnZpY2UgY29udGV4dCBmcm9tIHRoZSBtZXNzYWdlIGNvbnRleHQKLSAgICAgICAgU2VydmljZUNvbnRleHQgc2VydmljZUNvbnRleHQgPSBtYy5nZXRTZXJ2aWNlQ29udGV4dCgpOwotCi0gICAgICAgIGlmIChzZXJ2aWNlQ29udGV4dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBnZXQgdGhlIHNlcnZpY2UgY29udGV4dCBmcm9tIHRoZSBvcGVyYXRpb24gY29udGV4dAotICAgICAgICAgICAgT3BlcmF0aW9uQ29udGV4dCBvcGVyYXRpb25Db250ZXh0ID0gbWMuZ2V0T3BlcmF0aW9uQ29udGV4dCgpOwotICAgICAgICAgICAgc2VydmljZUNvbnRleHQgPSBvcGVyYXRpb25Db250ZXh0LmdldFNlcnZpY2VDb250ZXh0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc2VydmljZUNvbnRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgcHJvcGVydGllcyA9IHNlcnZpY2VDb250ZXh0LmdldFByb3BlcnRpZXMoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBwcm9wZXJ0aWVzOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGRTZXJ2aWNlUHJvcGVydGllcyhNZXNzYWdlQ29udGV4dCBtYywgU3RyaW5nIHN1ZmZpeCkgewotICAgICAgICAvLyBnZXQgdGhlIHNlcnZpY2UgY29udGV4dCBmcm9tIHRoZSBtZXNzYWdlIGNvbnRleHQKLSAgICAgICAgU2VydmljZUNvbnRleHQgc2VydmljZUNvbnRleHQgPSBtYy5nZXRTZXJ2aWNlQ29udGV4dCgpOwotCi0gICAgICAgIGlmIChzZXJ2aWNlQ29udGV4dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBnZXQgdGhlIHNlcnZpY2UgY29udGV4dCBmcm9tIHRoZSBvcGVyYXRpb24gY29udGV4dAotICAgICAgICAgICAgT3BlcmF0aW9uQ29udGV4dCBvcGVyYXRpb25Db250ZXh0ID0gbWMuZ2V0T3BlcmF0aW9uQ29udGV4dCgpOwotICAgICAgICAgICAgc2VydmljZUNvbnRleHQgPSBvcGVyYXRpb25Db250ZXh0LmdldFNlcnZpY2VDb250ZXh0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc2VydmljZUNvbnRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCBzZXJ2aWNlS2V5cy5sZW5ndGg7IGsrKykgewotICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSBzZXJ2aWNlS2V5c1trXTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBzZXJ2aWNlVmFsdWVzW2tdICsgc3VmZml4OwotCi0gICAgICAgICAgICAgICAgc2VydmljZUNvbnRleHQuc2V0UHJvcGVydHkoa2V5LCB2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIHByaXZhdGUgdm9pZCBzaG93UHJvcGVydGllcyhNYXAgbWFwLCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKLSAgICAgICAgbG9nLmRlYnVnKGRlc2NyaXB0aW9uICsgIiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOwotICAgICAgICBpZiAoKG1hcCA9PSBudWxsKSB8fCAobWFwLmlzRW1wdHkoKSkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhkZXNjcmlwdGlvbiArICI6IE5vIHByb3BlcnRpZXMiKTsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhkZXNjcmlwdGlvbiArICIgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIEl0ZXJhdG9yIGl0ID0gbWFwLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0KLSAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgU3RyaW5nIGtleSA9IChTdHJpbmcpIGl0Lm5leHQoKTsKLQotICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gKFN0cmluZykgbWFwLmdldChrZXkpOwotCi0gICAgICAgICAgICBsb2cuZGVidWcoZGVzY3JpcHRpb24gKyAiOiBrZXktdmFsdWUgcGFpciBbIiArIGtleSArICJdWyIgKyB2YWx1ZSArICJdIik7Ci0gICAgICAgIH0KLSAgICAgICAgbG9nLmRlYnVnKGRlc2NyaXB0aW9uICsgIiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBoYW5kbGVyIG9iamVjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvIFRoZSBoYW5kbGVyIG9iamVjdAotICAgICAqIEByZXR1cm4gVGhlIElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgaGFuZGxlciwKLSAgICAgKiAgICAgICAgIC0xIG90aGVyd2lzZQotICAgICAqLwotICAgIHByaXZhdGUgaW50IGdldEhhbmRsZXJJRChPYmplY3QgbykgewotICAgICAgICBpbnQgaWQgPSAtMTsKLQotICAgICAgICBpZiAobyBpbnN0YW5jZW9mIFRlbXBIYW5kbGVyKSB7Ci0gICAgICAgICAgICBpZCA9ICgoVGVtcEhhbmRsZXIpIG8pLmdldEhhbmRsZXJJRCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGlkOwotICAgIH0KLQotICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIC8vIEhhbmRsZXIgY2xhc3NlcyAKLSAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAgIC8qKgotICAgICAqIFBlcmZvcm1zIGEgc2F2ZSBhbmQgcmVzdG9yZSBvbiB0aGUgbWVzc2FnZSBjb250ZXh0Ci0gICAgICovCi0gICAgcHVibGljIGNsYXNzIEhhbmRsZXJNQ1MgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIgewotICAgICAgICBwcml2YXRlIEludGVnZXIgaGFuZGxlcklEID0gbnVsbDsKLQotICAgICAgICBwcml2YXRlIEZpbGUgdGhlRmlsZSA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIHRoZUZpbGVuYW1lID0gbnVsbDsKLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gcGF1c2UgPSBmYWxzZTsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIHNhdmVkT2sgPSBmYWxzZTsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIHJlc3RvcmVkT2sgPSBmYWxzZTsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGNvbXBhcmVzT2sgPSBmYWxzZTsKLQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIGNvbnN0cnVjdG9ycwotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgcHVibGljIEhhbmRsZXJNQ1MoKSB7Ci0gICAgICAgICAgICB0aGlzLmhhbmRsZXJJRCA9IG5ldyBJbnRlZ2VyKC01KTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBIYW5kbGVyTUNTKGludCBpbmRleCwgYm9vbGVhbiBwYXVzZSkgewotICAgICAgICAgICAgdGhpcy5oYW5kbGVySUQgPSBuZXcgSW50ZWdlcihpbmRleCk7Ci0gICAgICAgICAgICB0aGlzLnBhdXNlID0gcGF1c2U7Ci0gICAgICAgICAgICBpbml0KG5ldyBIYW5kbGVyRGVzY3JpcHRpb24obmV3IFN0cmluZygiaGFuZGxlciIgKyBpbmRleCkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBIYW5kbGVyTUNTKGludCBpbmRleCkgewotICAgICAgICAgICAgdGhpcy5oYW5kbGVySUQgPSBuZXcgSW50ZWdlcihpbmRleCk7Ci0gICAgICAgICAgICBpbml0KG5ldyBIYW5kbGVyRGVzY3JpcHRpb24obmV3IFN0cmluZygiaGFuZGxlciIgKyBpbmRleCkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gbWV0aG9kcwotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgcHVibGljIGludCBnZXRIYW5kbGVySUQoKSB7Ci0gICAgICAgICAgICBpZiAoaGFuZGxlcklEICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlcklELmludFZhbHVlKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiAtNTsKLSAgICAgICAgfQotCi0KLSAgICAgICAgcHVibGljIEludm9jYXRpb25SZXNwb25zZSBpbnZva2UoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgICAgICBTdHJpbmcgdGl0bGUgPSAiSGFuZGxlck1DU1siICsgZ2V0SGFuZGxlcklEKCkgKyAiXTppbnZva2UoKTogIjsKLSAgICAgICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArICJwYXVzZSA9IFsiICsgcGF1c2UgKyAiXSIpOwotICAgICAgICAgICAgc2F2ZWRPayA9IGZhbHNlOwotICAgICAgICAgICAgcmVzdG9yZWRPayA9IGZhbHNlOwotCi0gICAgICAgICAgICBpZiAocGF1c2UpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcodGl0bGUgKyAibXNnQ29udGV4dC5wYXVzZSgpIik7Ci0gICAgICAgICAgICAgICAgbXNnQ29udGV4dC5wYXVzZSgpOwotICAgICAgICAgICAgICAgIHBhdXNlID0gZmFsc2U7Ci0KLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICB0aGVGaWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgibWNTYXZlIiwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgIHRoZUZpbGVuYW1lID0gdGhlRmlsZS5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArICJ0ZW1wIGZpbGUgPSBbIiArIHRoZUZpbGVuYW1lICsgIl0iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcodGl0bGUgKyAiZXJyb3IgY3JlYXRpbmcgdGVtcCBmaWxlID0gWyIgKyBleC5nZXRNZXNzYWdlKCkgKyAiXSIpOwotICAgICAgICAgICAgICAgICAgICB0aGVGaWxlID0gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAodGhlRmlsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAgICAgICAgICAgICAvLyBzYXZlIHRvIHRoZSB0ZW1wb3JhcnkgZmlsZQotICAgICAgICAgICAgICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldHVwIGFuIG91dHB1dCBzdHJlYW0gdG8gYSBwaHlzaWNhbCBmaWxlCi0gICAgICAgICAgICAgICAgICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIG91dFN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRoZUZpbGUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBhdHRhY2ggYSBzdHJlYW0gY2FwYWJsZSBvZiB3cml0aW5nIG9iamVjdHMgdG8gdGhlIAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RyZWFtIGNvbm5lY3RlZCB0byB0aGUgZmlsZQotICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0T3V0cHV0U3RyZWFtIG91dE9ialN0cmVhbSA9IG5ldyBPYmplY3RPdXRwdXRTdHJlYW0ob3V0U3RyZWFtKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHJ5IHRvIHNhdmUgdGhlIG1lc3NhZ2UgY29udGV4dAotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKHRpdGxlICsgInNhdmluZyBtZXNzYWdlIGNvbnRleHQuLi4uLiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZWRPayA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgb3V0T2JqU3RyZWFtLndyaXRlT2JqZWN0KG1zZ0NvbnRleHQpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBjbG9zZSBvdXQgdGhlIHN0cmVhbXMKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dE9ialN0cmVhbS5mbHVzaCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgb3V0T2JqU3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXRTdHJlYW0uZmx1c2goKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dFN0cmVhbS5jbG9zZSgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBzYXZlZE9rID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArICIuLi4uc2F2ZWQgbWVzc2FnZSBjb250ZXh0Li4uLi4iKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBmaWxlc2l6ZSA9IHRoZUZpbGUubGVuZ3RoKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcodGl0bGUgKyAiZmlsZSBzaXplIGFmdGVyIHNhdmUgWyIgKyBmaWxlc2l6ZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJdICAgdGVtcCBmaWxlID0gWyIgKyB0aGVGaWxlbmFtZSArICJdIik7Ci0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4MikgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKHRpdGxlICsgImVycm9yIHdpdGggc2F2aW5nIG1lc3NhZ2UgY29udGV4dCA9IFsiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXgyLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiA6ICIgKyBleDIuZ2V0TWVzc2FnZSgpICsgIl0iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4Mi5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoc2F2ZWRPayk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgICAgICAgICAgICAgIC8vIHJlc3RvcmUgZnJvbSB0aGUgdGVtcG9yYXJ5IGZpbGUKLSAgICAgICAgICAgICAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXR1cCBhbiBpbnB1dCBzdHJlYW0gdG8gdGhlIGZpbGUKLSAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBpblN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0odGhlRmlsZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF0dGFjaCBhIHN0cmVhbSBjYXBhYmxlIG9mIHJlYWRpbmcgb2JqZWN0cyBmcm9tIHRoZSAKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0cmVhbSBjb25uZWN0ZWQgdG8gdGhlIGZpbGUKLSAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdElucHV0U3RyZWFtIGluT2JqU3RyZWFtID0gbmV3IE9iamVjdElucHV0U3RyZWFtKGluU3RyZWFtKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHJ5IHRvIHJlc3RvcmUgdGhlIG1lc3NhZ2UgY29udGV4dAotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKHRpdGxlICsgInJlc3RvcmluZyBhIG1lc3NhZ2UgY29udGV4dC4uLi4uIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXN0b3JlZE9rID0gZmFsc2U7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQyID0gKE1lc3NhZ2VDb250ZXh0KSBpbk9ialN0cmVhbS5yZWFkT2JqZWN0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbk9ialN0cmVhbS5jbG9zZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaW5TdHJlYW0uY2xvc2UoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgbXNnQ29udGV4dDIuYWN0aXZhdGUoY29uZmlndXJhdGlvbkNvbnRleHQpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICByZXN0b3JlZE9rID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArICIuLi4ucmVzdG9yZWQgbWVzc2FnZSBjb250ZXh0Li4uLi4iKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm93IHB1dCB0aGUgcmVzdG9yZWQgbWVzc2FnZSBjb250ZXh0IGluIHRoZSBnbG9iYWwKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZhcmlhYmxlIGZvciB0aGUgdGVzdCAKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RvcmVkTWVzc2FnZUNvbnRleHQgPSBtc2dDb250ZXh0MjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4MikgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKHRpdGxlICsgImVycm9yIHdpdGggcmVzdG9yaW5nIG1lc3NhZ2UgY29udGV4dCA9IFsiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXgyLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiA6ICIgKyBleDIuZ2V0TWVzc2FnZSgpICsgIl0iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4Mi5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RvcmVkTWVzc2FnZUNvbnRleHQgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZXN0b3JlZE9rKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgc2F2ZS9yZXN0b3JlIG9mIHRoZSBtZXNzYWdlIGNvbnRleHQgc3VjY2VlZGVkLAotICAgICAgICAgICAgICAgICAgICAvLyB0aGVuIGRvbid0IGtlZXAgdGhlIHRlbXBvcmFyeSBmaWxlIGFyb3VuZAotICAgICAgICAgICAgICAgICAgICBib29sZWFuIHJlbW92ZVRtcEZpbGUgPSBzYXZlZE9rICYmIHJlc3RvcmVkT2s7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZW1vdmVUbXBGaWxlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZUZpbGUuZGVsZXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBqdXN0IGFic29yYiBpdAotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIEludm9jYXRpb25SZXNwb25zZS5TVVNQRU5EOwotCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArICJleGVjdXRlZEhhbmRsZXJzLmFkZCgiICsgaGFuZGxlcklEICsgIikiKTsKLSAgICAgICAgICAgICAgICBleGVjdXRlZEhhbmRsZXJzLmFkZChoYW5kbGVySUQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gSW52b2NhdGlvblJlc3BvbnNlLkNPTlRJTlVFOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgY2xhc3MgVGVtcEhhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIgewotICAgICAgICBwcml2YXRlIEludGVnZXIgaGFuZGxlcklEID0gbnVsbDsKLSAgICAgICAgcHJpdmF0ZSBpbnQgY291bnQgPSAwOwotICAgICAgICBwcml2YXRlIGludCBudW1iZXJQcm9wZXJ0aWVzID0gMzsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHlLZXkgPSAiUHJvcGVydHkiOwotICAgICAgICBwcml2YXRlIFN0cmluZyBwcm9wZXJ0eVZhbHVlID0gIlNlcnZpY2VMZXZlbFNldHRpbmciOwotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gY29uc3RydWN0b3JzCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICBwdWJsaWMgVGVtcEhhbmRsZXIoKSB7Ci0gICAgICAgICAgICB0aGlzLmhhbmRsZXJJRCA9IG5ldyBJbnRlZ2VyKC01KTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBUZW1wSGFuZGxlcihpbnQgaW5kZXgpIHsKLSAgICAgICAgICAgIHRoaXMuaGFuZGxlcklEID0gbmV3IEludGVnZXIoaW5kZXgpOwotICAgICAgICAgICAgaW5pdChuZXcgSGFuZGxlckRlc2NyaXB0aW9uKG5ldyBTdHJpbmcoImhhbmRsZXIiICsgaW5kZXgpKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgVGVtcEhhbmRsZXIoaW50IGluZGV4LCBpbnQgbnVtYmVyKSB7Ci0gICAgICAgICAgICB0aGlzLmhhbmRsZXJJRCA9IG5ldyBJbnRlZ2VyKGluZGV4KTsKLSAgICAgICAgICAgIGluaXQobmV3IEhhbmRsZXJEZXNjcmlwdGlvbihuZXcgU3RyaW5nKCJoYW5kbGVyIiArIGluZGV4KSkpOwotICAgICAgICAgICAgbnVtYmVyUHJvcGVydGllcyA9IG51bWJlcjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gbWV0aG9kcwotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgcHVibGljIGludCBnZXRIYW5kbGVySUQoKSB7Ci0gICAgICAgICAgICBpZiAoaGFuZGxlcklEICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlcklELmludFZhbHVlKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiAtNTsKLSAgICAgICAgfQotCi0KLSAgICAgICAgcHVibGljIEludm9jYXRpb25SZXNwb25zZSBpbnZva2UoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgICAgICBTdHJpbmcgdGl0bGUgPSAiVGVtcEhhbmRsZXJbIiArIGdldEhhbmRsZXJJRCgpICsgIl06aW52b2tlKCk6ICI7Ci0KLSAgICAgICAgICAgIC8vIGdldCB0aGUgc2VydmljZSBjb250ZXh0IGZyb20gdGhlIG1lc3NhZ2UgY29udGV4dAotICAgICAgICAgICAgU2VydmljZUNvbnRleHQgc2VydmljZUNvbnRleHQgPSBtc2dDb250ZXh0LmdldFNlcnZpY2VDb250ZXh0KCk7Ci0KLSAgICAgICAgICAgIGlmIChzZXJ2aWNlQ29udGV4dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBzZXJ2aWNlIGNvbnRleHQgZnJvbSB0aGUgb3BlcmF0aW9uIGNvbnRleHQKLSAgICAgICAgICAgICAgICBPcGVyYXRpb25Db250ZXh0IG9wZXJhdGlvbkNvbnRleHQgPSBtc2dDb250ZXh0LmdldE9wZXJhdGlvbkNvbnRleHQoKTsKLSAgICAgICAgICAgICAgICBzZXJ2aWNlQ29udGV4dCA9IG9wZXJhdGlvbkNvbnRleHQuZ2V0U2VydmljZUNvbnRleHQoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHNlcnZpY2VDb250ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG51bWJlclByb3BlcnRpZXM7IGorKykgewotICAgICAgICAgICAgICAgICAgICBjb3VudCsrOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcga2V5ID0gbmV3IFN0cmluZyhwcm9wZXJ0eUtleSArICIuSURbIiArIGdldEhhbmRsZXJJRCgpICsgIl0uIiArIGNvdW50KTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gbmV3IFN0cmluZyhwcm9wZXJ0eVZhbHVlICsgIlsiICsgY291bnQgKyAiXSIpOwotICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlQ29udGV4dC5zZXRQcm9wZXJ0eShrZXksIHZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArICJleGVjdXRlZEhhbmRsZXJzLmFkZCgiICsgaGFuZGxlcklEICsgIikiKTsKLSAgICAgICAgICAgIGV4ZWN1dGVkSGFuZGxlcnMuYWRkKGhhbmRsZXJJRCk7Ci0KLSAgICAgICAgICAgIHJldHVybiBJbnZvY2F0aW9uUmVzcG9uc2UuQ09OVElOVUU7Ci0gICAgICAgIH0KLQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9NZXNzYWdlQ29udGV4dFNhdmVDVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9NZXNzYWdlQ29udGV4dFNhdmVDVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODJiZTc0Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvTWVzc2FnZUNvbnRleHRTYXZlQ1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNzIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5VVUlER2VuZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuT3BlcmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuU2VydmljZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LlNlcnZpY2VHcm91cENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzTWVzc2FnZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlR3JvdXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5IYW5kbGVyRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5Jbk91dEF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5UcmFuc3BvcnRJbkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uVHJhbnNwb3J0T3V0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5BZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5oYW5kbGVycy5BYnN0cmFjdEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuUmF3WE1MSU5Pbmx5TWVzc2FnZVJlY2VpdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLlJhd1hNTElOT3V0TWVzc2FnZVJlY2VpdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuQ29tbW9uc0hUVFBUcmFuc3BvcnRTZW5kZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5TaW1wbGVIVFRQU2VydmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5NZXRhRGF0YUVudHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7Ci0KLS8qKgotICogUHJvdmlkZXMgdGVzdHMgdGhhdCBmb2N1cyBvbiB0aGUgbWVzc2FnZSBjb250ZXh0IG9iamVjdCBncmFwaAotICovCi1wdWJsaWMgY2xhc3MgTWVzc2FnZUNvbnRleHRTYXZlQ1Rlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coTWVzc2FnZUNvbnRleHRTYXZlQ1Rlc3QuY2xhc3MpOwotCi0gICAgcHJpdmF0ZSBGaWxlIHBlcnNpc3RlbnRTdG9yZSA9IG51bGw7Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyB2YXJpYWJsZXMgZm9yIHRoZSBvYmplY3QgZ3JhcGggCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gdXNlZCBvbiBhIHNhdmUgb2YgYSBtZXNzYWdlIGNvbnRleHQsIHVzZXMgdGhlIHNhbWUgc2V0dXAgCi0gICAgLy8gYXMgdGhlIHJlZ3VsYXIgdG9wLWxldmVsIG9iamVjdHMuIHRoZSBkaWZmZXJlbmNlIGlzIHRoYXQKLSAgICAvLyB0aGUgcGhhc2UgY29udGFpbnMgaGFuZGxlcnMgdGhhdCBzcGxpdCB0aGUgYWN0aW9uIGFjcm9zcwotICAgIC8vIHR3byBoYW5kbGVycwotICAgIHByaXZhdGUgQ29uZmlndXJhdGlvbkNvbnRleHQgc2F2ZUNvbmZpZ3VyYXRpb25Db250ZXh0ID0gbnVsbDsKLSAgICBwcml2YXRlIEF4aXNDb25maWd1cmF0aW9uIHNhdmVBeGlzQ29uZmlndXJhdGlvbiA9IG51bGw7Ci0KLSAgICAvLyB1c2VkIG9uIGEgcmVzdG9yZSBvZiBhIG1lc3NhZ2UgY29udGV4dCwgdXNlcyB0aGUgc2FtZSBzZXR1cCAKLSAgICAvLyBhcyB0aGUgcmVndWxhciB0b3AtbGV2ZWwgb2JqZWN0cyB3aXRoIHRoZSBleGNlcHRpb24gdGhhdCB0aGUKLSAgICAvLyBjb250ZXh0IG9iamVjdHMgZG9uJ3QgZXhpc3QuIGFsc28sIHRoZSBwaGFzZSBjb250YWlucyBoYW5kbGVycwotICAgIC8vIHRoYXQgc3BsaXQgdGhlIGFjdGlvbiBhY3Jvc3MgdHdvIGhhbmRsZXJzCi0gICAgcHJpdmF0ZSBDb25maWd1cmF0aW9uQ29udGV4dCByZXN0b3JlQ29uZmlndXJhdGlvbkNvbnRleHQgPSBudWxsOwotICAgIHByaXZhdGUgQXhpc0NvbmZpZ3VyYXRpb24gcmVzdG9yZUF4aXNDb25maWd1cmF0aW9uID0gbnVsbDsKLQotICAgIC8vIHVzZWQgb24gYSByZXN0b3JlIG9mIGEgbWVzc2FnZSBjb250ZXh0LCB1c2VzIHRoZSBzYW1lIHNldHVwIAotICAgIC8vIGFzIHRoZSByZWd1bGFyIHRvcC1sZXZlbCBvYmplY3RzIHdpdGggc2VydmljZS1sZXZlbCBjb250ZXh0IG9iamVjdHMKLSAgICAvLyB3aXRoIHRoZSBuYW1lIHNlcnZpY2UgbmFtZS4gYWxzbywgdGhlIHBoYXNlIGNvbnRhaW5zIGhhbmRsZXJzCi0gICAgLy8gdGhhdCBzcGxpdCB0aGUgYWN0aW9uIGFjcm9zcyB0d28gaGFuZGxlcnMKLSAgICBwcml2YXRlIENvbmZpZ3VyYXRpb25Db250ZXh0IGVxdWl2Q29uZmlndXJhdGlvbkNvbnRleHQgPSBudWxsOwotICAgIHByaXZhdGUgQXhpc0NvbmZpZ3VyYXRpb24gZXF1aXZBeGlzQ29uZmlndXJhdGlvbiA9IG51bGw7Ci0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gc2VydmljZSBncm91cCBBQkMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHByaXZhdGUgU3RyaW5nIHNlcnZpY2VHcm91cE5hbWVfQUJDID0gIkFCQ1NlcnZpY2VHcm91cCI7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBzZXJ2aWNlTmFtZV9BID0gIlNlcnZpY2VBIjsKLSAgICBwcml2YXRlIFN0cmluZyBzZXJ2aWNlTmFtZV9CID0gIlNlcnZpY2VCIjsKLSAgICBwcml2YXRlIFN0cmluZyBzZXJ2aWNlTmFtZV9DID0gIlNlcnZpY2VDIjsKLSAgICBwcml2YXRlIFFOYW1lIHNlcnZpY2VfUU5hbWVfQSA9IG5ldyBRTmFtZShzZXJ2aWNlTmFtZV9BKTsKLSAgICBwcml2YXRlIFFOYW1lIHNlcnZpY2VfUU5hbWVfQiA9IG5ldyBRTmFtZShzZXJ2aWNlTmFtZV9CKTsKLSAgICBwcml2YXRlIFFOYW1lIHNlcnZpY2VfUU5hbWVfQyA9IG5ldyBRTmFtZShzZXJ2aWNlTmFtZV9DKTsKLQotICAgIHByaXZhdGUgU3RyaW5nIG9wZXJhdGlvbk5hbWVfQTEgPSAiVGVzdE9wZXJhdGlvbkExIjsKLSAgICBwcml2YXRlIFN0cmluZyBvcGVyYXRpb25OYW1lX0EyID0gIlRlc3RPcGVyYXRpb25BMiI7Ci0gICAgcHJpdmF0ZSBRTmFtZSBvcGVyYXRpb25fUU5hbWVfQTEgPSBuZXcgUU5hbWUob3BlcmF0aW9uTmFtZV9BMSk7Ci0gICAgcHJpdmF0ZSBRTmFtZSBvcGVyYXRpb25fUU5hbWVfQTIgPSBuZXcgUU5hbWUob3BlcmF0aW9uTmFtZV9BMik7Ci0KLSAgICBwcml2YXRlIFNlcnZpY2VHcm91cENvbnRleHQgc3J2R3JwQ3R4X0FCQ19zYXZlID0gbnVsbDsKLSAgICBwcml2YXRlIEF4aXNTZXJ2aWNlR3JvdXAgYXhpc1NydkdycF9BQkNfc2F2ZSA9IG51bGw7Ci0KLSAgICBwcml2YXRlIEF4aXNTZXJ2aWNlR3JvdXAgYXhpc1NydkdycF9BQkNfcmVzdG9yZSA9IG51bGw7Ci0KLSAgICBwcml2YXRlIFNlcnZpY2VHcm91cENvbnRleHQgc3J2R3JwQ3R4X0FCQ19lcXVpdiA9IG51bGw7Ci0gICAgcHJpdmF0ZSBBeGlzU2VydmljZUdyb3VwIGF4aXNTcnZHcnBfQUJDX2VxdWl2ID0gbnVsbDsKLQotICAgIHByaXZhdGUgU2VydmljZUNvbnRleHQgc3J2Q3R4X0Ffc2F2ZSA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTZXJ2aWNlQ29udGV4dCBzcnZDdHhfQl9zYXZlID0gbnVsbDsKLSAgICBwcml2YXRlIFNlcnZpY2VDb250ZXh0IHNydkN0eF9DX3NhdmUgPSBudWxsOwotICAgIHByaXZhdGUgQXhpc1NlcnZpY2UgYXhpc1Nydl9BX3NhdmUgPSBudWxsOwotICAgIHByaXZhdGUgQXhpc1NlcnZpY2UgYXhpc1Nydl9CX3NhdmUgPSBudWxsOwotICAgIHByaXZhdGUgQXhpc1NlcnZpY2UgYXhpc1Nydl9DX3NhdmUgPSBudWxsOwotCi0gICAgcHJpdmF0ZSBTZXJ2aWNlQ29udGV4dCBzcnZDdHhfQV9yZXN0b3JlID0gbnVsbDsKLSAgICBwcml2YXRlIFNlcnZpY2VDb250ZXh0IHNydkN0eF9CX3Jlc3RvcmUgPSBudWxsOwotICAgIHByaXZhdGUgU2VydmljZUNvbnRleHQgc3J2Q3R4X0NfcmVzdG9yZSA9IG51bGw7Ci0gICAgcHJpdmF0ZSBBeGlzU2VydmljZSBheGlzU3J2X0FfcmVzdG9yZSA9IG51bGw7Ci0gICAgcHJpdmF0ZSBBeGlzU2VydmljZSBheGlzU3J2X0JfcmVzdG9yZSA9IG51bGw7Ci0gICAgcHJpdmF0ZSBBeGlzU2VydmljZSBheGlzU3J2X0NfcmVzdG9yZSA9IG51bGw7Ci0KLSAgICBwcml2YXRlIFNlcnZpY2VDb250ZXh0IHNydkN0eF9BX2VxdWl2ID0gbnVsbDsKLSAgICBwcml2YXRlIFNlcnZpY2VDb250ZXh0IHNydkN0eF9CX2VxdWl2ID0gbnVsbDsKLSAgICBwcml2YXRlIFNlcnZpY2VDb250ZXh0IHNydkN0eF9DX2VxdWl2ID0gbnVsbDsKLSAgICBwcml2YXRlIEF4aXNTZXJ2aWNlIGF4aXNTcnZfQV9lcXVpdiA9IG51bGw7Ci0gICAgcHJpdmF0ZSBBeGlzU2VydmljZSBheGlzU3J2X0JfZXF1aXYgPSBudWxsOwotICAgIHByaXZhdGUgQXhpc1NlcnZpY2UgYXhpc1Nydl9DX2VxdWl2ID0gbnVsbDsKLQotICAgIHByaXZhdGUgT3BlcmF0aW9uQ29udGV4dCBvcEN0eF9BMV9zYXZlID0gbnVsbDsKLSAgICBwcml2YXRlIE9wZXJhdGlvbkNvbnRleHQgb3BDdHhfQTJfc2F2ZSA9IG51bGw7Ci0gICAgcHJpdmF0ZSBBeGlzT3BlcmF0aW9uIGF4aXNPcF9BMV9zYXZlID0gbnVsbDsKLSAgICBwcml2YXRlIEF4aXNPcGVyYXRpb24gYXhpc09wX0EyX3NhdmUgPSBudWxsOwotCi0gICAgcHJpdmF0ZSBPcGVyYXRpb25Db250ZXh0IG9wQ3R4X0ExX3Jlc3RvcmUgPSBudWxsOwotICAgIHByaXZhdGUgT3BlcmF0aW9uQ29udGV4dCBvcEN0eF9BMl9yZXN0b3JlID0gbnVsbDsKLSAgICBwcml2YXRlIEF4aXNPcGVyYXRpb24gYXhpc09wX0ExX3Jlc3RvcmUgPSBudWxsOwotICAgIHByaXZhdGUgQXhpc09wZXJhdGlvbiBheGlzT3BfQTJfcmVzdG9yZSA9IG51bGw7Ci0KLSAgICBwcml2YXRlIE9wZXJhdGlvbkNvbnRleHQgb3BDdHhfQTFfZXF1aXYgPSBudWxsOwotICAgIHByaXZhdGUgT3BlcmF0aW9uQ29udGV4dCBvcEN0eF9BMl9lcXVpdiA9IG51bGw7Ci0gICAgcHJpdmF0ZSBBeGlzT3BlcmF0aW9uIGF4aXNPcF9BMV9lcXVpdiA9IG51bGw7Ci0gICAgcHJpdmF0ZSBBeGlzT3BlcmF0aW9uIGF4aXNPcF9BMl9lcXVpdiA9IG51bGw7Ci0KLSAgICBwcml2YXRlIE1lc3NhZ2VDb250ZXh0IG1zZ0N0eF9BMV8xX3NhdmUgPSBudWxsOwotICAgIHByaXZhdGUgTWVzc2FnZUNvbnRleHQgbXNnQ3R4X0ExXzJfc2F2ZSA9IG51bGw7Ci0gICAgcHJpdmF0ZSBNZXNzYWdlQ29udGV4dCBtc2dDdHhfQTJfc2F2ZSA9IG51bGw7Ci0KLSAgICBwcml2YXRlIE1lc3NhZ2VDb250ZXh0IG1zZ0N0eF9BMV8xX2VxdWl2ID0gbnVsbDsKLSAgICBwcml2YXRlIE1lc3NhZ2VDb250ZXh0IG1zZ0N0eF9BMV8yX2VxdWl2ID0gbnVsbDsKLSAgICBwcml2YXRlIE1lc3NhZ2VDb250ZXh0IG1zZ0N0eF9BMl9lcXVpdiA9IG51bGw7Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyAgb2JqZWN0cyBuZWVkZWQgZm9yIG1lc3NhZ2UgY29udGV4dAotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBwcml2YXRlIFRyYW5zcG9ydE91dERlc2NyaXB0aW9uIHRyYW5zcG9ydE91dCA9IG51bGw7Ci0gICAgcHJpdmF0ZSBUcmFuc3BvcnRPdXREZXNjcmlwdGlvbiB0cmFuc3BvcnRPdXQyID0gbnVsbDsKLSAgICBwcml2YXRlIFRyYW5zcG9ydE91dERlc2NyaXB0aW9uIHRyYW5zcG9ydE91dDMgPSBudWxsOwotICAgIHByaXZhdGUgVHJhbnNwb3J0SW5EZXNjcmlwdGlvbiB0cmFuc3BvcnRJbiA9IG51bGw7Ci0gICAgcHJpdmF0ZSBUcmFuc3BvcnRJbkRlc2NyaXB0aW9uIHRyYW5zcG9ydEluMiA9IG51bGw7Ci0gICAgcHJpdmF0ZSBUcmFuc3BvcnRJbkRlc2NyaXB0aW9uIHRyYW5zcG9ydEluMyA9IG51bGw7Ci0KLSAgICBwcml2YXRlIFBoYXNlIHBoYXNlU2F2ZSA9IG51bGw7Ci0gICAgcHJpdmF0ZSBQaGFzZSBwaGFzZVJlc3RvcmUgPSBudWxsOwotICAgIHByaXZhdGUgUGhhc2UgcGhhc2VFcXVpdiA9IG51bGw7Ci0KLSAgICBwcml2YXRlIEFycmF5TGlzdCBleGVjdXRlZEhhbmRsZXJzID0gbnVsbDsKLQotICAgIHByaXZhdGUgTWVzc2FnZUNvbnRleHQgcmVzdG9yZWRNZXNzYWdlQ29udGV4dCA9IG51bGw7Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBtZXRob2RzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLQotICAgIHB1YmxpYyBNZXNzYWdlQ29udGV4dFNhdmVDVGVzdChTdHJpbmcgYXJnMCkgewotICAgICAgICBzdXBlcihhcmcwKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcHJlcGFyZSgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJNZXNzYWdlQ29udGV4dFNhdmVDVGVzdDpjb25zdHJ1Y3RvcjogIGVycm9yIGluIHNldHRpbmcgdXAgb2JqZWN0IGdyYXBoIFsiICsKLSAgICAgICAgICAgICAgICAgICAgZS5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgOiAiICsgZS5nZXRNZXNzYWdlKCkgKyAiXSIpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICAvLwotICAgIC8vIHByZXBhcmUgdGhlIG9iamVjdCBoaWVyYXJjaHkgZm9yIHRlc3RpbmcKLSAgICAvLwotICAgIHByaXZhdGUgdm9pZCBwcmVwYXJlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gc2V0dXAgdGhlIHRvcC1sZXZlbCBvYmplY3RzCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICBEaXNwYXRjaFBoYXNlIGRpc3BhdGNoUGhhc2UgPSBuZXcgRGlzcGF0Y2hQaGFzZSgpOwotICAgICAgICBkaXNwYXRjaFBoYXNlLnNldE5hbWUoIkRpc3BhdGNoIik7Ci0KLSAgICAgICAgQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciBhYmQgPSBuZXcgQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlcigpOwotICAgICAgICBhYmQuaW5pdERpc3BhdGNoZXIoKTsKLQotICAgICAgICBSZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIHJ1ZCA9IG5ldyBSZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyKCk7Ci0gICAgICAgIHJ1ZC5pbml0RGlzcGF0Y2hlcigpOwotCi0gICAgICAgIFNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIgc2FiZCA9IG5ldyBTT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyKCk7Ci0gICAgICAgIHNhYmQuaW5pdERpc3BhdGNoZXIoKTsKLQotICAgICAgICBTT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIgc21iZCA9IG5ldyBTT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIoKTsKLSAgICAgICAgc21iZC5pbml0RGlzcGF0Y2hlcigpOwotCi0gICAgICAgIGRpc3BhdGNoUGhhc2UuYWRkSGFuZGxlcihhYmQpOwotICAgICAgICBkaXNwYXRjaFBoYXNlLmFkZEhhbmRsZXIocnVkKTsKLSAgICAgICAgZGlzcGF0Y2hQaGFzZS5hZGRIYW5kbGVyKHNhYmQpOwotICAgICAgICBkaXNwYXRjaFBoYXNlLmFkZEhhbmRsZXIoc21iZCk7Ci0KLSAgICAgICAgc2F2ZUF4aXNDb25maWd1cmF0aW9uID0gbmV3IEF4aXNDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgIHNhdmVDb25maWd1cmF0aW9uQ29udGV4dCA9IG5ldyBDb25maWd1cmF0aW9uQ29udGV4dChzYXZlQXhpc0NvbmZpZ3VyYXRpb24pOwotICAgICAgICBzYXZlQ29uZmlndXJhdGlvbkNvbnRleHQuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5hZGRNZXNzYWdlUmVjZWl2ZXIoCi0gICAgICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgvd3NkbC9pbi1vbmx5IiwgbmV3IFJhd1hNTElOT25seU1lc3NhZ2VSZWNlaXZlcigpKTsKLSAgICAgICAgc2F2ZUNvbmZpZ3VyYXRpb25Db250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCkuYWRkTWVzc2FnZVJlY2VpdmVyKAotICAgICAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaW4tb3V0IiwgbmV3IFJhd1hNTElOT3V0TWVzc2FnZVJlY2VpdmVyKCkpOwotICAgICAgICBzYXZlQ29uZmlndXJhdGlvbkNvbnRleHQuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5nZXRJbkZsb3dQaGFzZXMoKS5hZGQoZGlzcGF0Y2hQaGFzZSk7Ci0KLSAgICAgICAgcmVzdG9yZUF4aXNDb25maWd1cmF0aW9uID0gbmV3IEF4aXNDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgIHJlc3RvcmVDb25maWd1cmF0aW9uQ29udGV4dCA9IG5ldyBDb25maWd1cmF0aW9uQ29udGV4dChyZXN0b3JlQXhpc0NvbmZpZ3VyYXRpb24pOwotICAgICAgICByZXN0b3JlQ29uZmlndXJhdGlvbkNvbnRleHQuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5hZGRNZXNzYWdlUmVjZWl2ZXIoCi0gICAgICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgvd3NkbC9pbi1vbmx5IiwgbmV3IFJhd1hNTElOT25seU1lc3NhZ2VSZWNlaXZlcigpKTsKLSAgICAgICAgcmVzdG9yZUNvbmZpZ3VyYXRpb25Db250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCkuYWRkTWVzc2FnZVJlY2VpdmVyKAotICAgICAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaW4tb3V0IiwgbmV3IFJhd1hNTElOT3V0TWVzc2FnZVJlY2VpdmVyKCkpOwotICAgICAgICByZXN0b3JlQ29uZmlndXJhdGlvbkNvbnRleHQuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5nZXRJbkZsb3dQaGFzZXMoKS5hZGQoZGlzcGF0Y2hQaGFzZSk7Ci0KLSAgICAgICAgZXF1aXZBeGlzQ29uZmlndXJhdGlvbiA9IG5ldyBBeGlzQ29uZmlndXJhdGlvbigpOwotICAgICAgICBlcXVpdkNvbmZpZ3VyYXRpb25Db250ZXh0ID0gbmV3IENvbmZpZ3VyYXRpb25Db250ZXh0KGVxdWl2QXhpc0NvbmZpZ3VyYXRpb24pOwotICAgICAgICBlcXVpdkNvbmZpZ3VyYXRpb25Db250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCkuYWRkTWVzc2FnZVJlY2VpdmVyKAotICAgICAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaW4tb25seSIsIG5ldyBSYXdYTUxJTk9ubHlNZXNzYWdlUmVjZWl2ZXIoKSk7Ci0gICAgICAgIGVxdWl2Q29uZmlndXJhdGlvbkNvbnRleHQuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5hZGRNZXNzYWdlUmVjZWl2ZXIoCi0gICAgICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgvd3NkbC9pbi1vdXQiLCBuZXcgUmF3WE1MSU5PdXRNZXNzYWdlUmVjZWl2ZXIoKSk7Ci0gICAgICAgIGVxdWl2Q29uZmlndXJhdGlvbkNvbnRleHQuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5nZXRJbkZsb3dQaGFzZXMoKS5hZGQoZGlzcGF0Y2hQaGFzZSk7Ci0KLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIHRyYW5zcG9ydC1yZWxhdGVkIG9iamVjdHMKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIHRyYW5zcG9ydE91dCA9IG5ldyBUcmFuc3BvcnRPdXREZXNjcmlwdGlvbigibnVsbCIpOwotICAgICAgICB0cmFuc3BvcnRPdXQyID0gbmV3IFRyYW5zcG9ydE91dERlc2NyaXB0aW9uKCJoYXBweSIpOwotICAgICAgICB0cmFuc3BvcnRPdXQzID0gbmV3IFRyYW5zcG9ydE91dERlc2NyaXB0aW9uKCJnb2x1Y2t5Iik7Ci0gICAgICAgIHRyYW5zcG9ydE91dC5zZXRTZW5kZXIobmV3IENvbW1vbnNIVFRQVHJhbnNwb3J0U2VuZGVyKCkpOwotICAgICAgICB0cmFuc3BvcnRPdXQyLnNldFNlbmRlcihuZXcgQ29tbW9uc0hUVFBUcmFuc3BvcnRTZW5kZXIoKSk7Ci0gICAgICAgIHRyYW5zcG9ydE91dDMuc2V0U2VuZGVyKG5ldyBDb21tb25zSFRUUFRyYW5zcG9ydFNlbmRlcigpKTsKLQotICAgICAgICBzYXZlQXhpc0NvbmZpZ3VyYXRpb24uYWRkVHJhbnNwb3J0T3V0KHRyYW5zcG9ydE91dDMpOwotICAgICAgICBzYXZlQXhpc0NvbmZpZ3VyYXRpb24uYWRkVHJhbnNwb3J0T3V0KHRyYW5zcG9ydE91dDIpOwotICAgICAgICBzYXZlQXhpc0NvbmZpZ3VyYXRpb24uYWRkVHJhbnNwb3J0T3V0KHRyYW5zcG9ydE91dCk7Ci0KLSAgICAgICAgcmVzdG9yZUF4aXNDb25maWd1cmF0aW9uLmFkZFRyYW5zcG9ydE91dCh0cmFuc3BvcnRPdXQzKTsKLSAgICAgICAgcmVzdG9yZUF4aXNDb25maWd1cmF0aW9uLmFkZFRyYW5zcG9ydE91dCh0cmFuc3BvcnRPdXQyKTsKLSAgICAgICAgcmVzdG9yZUF4aXNDb25maWd1cmF0aW9uLmFkZFRyYW5zcG9ydE91dCh0cmFuc3BvcnRPdXQpOwotCi0gICAgICAgIGVxdWl2QXhpc0NvbmZpZ3VyYXRpb24uYWRkVHJhbnNwb3J0T3V0KHRyYW5zcG9ydE91dDMpOwotICAgICAgICBlcXVpdkF4aXNDb25maWd1cmF0aW9uLmFkZFRyYW5zcG9ydE91dCh0cmFuc3BvcnRPdXQyKTsKLSAgICAgICAgZXF1aXZBeGlzQ29uZmlndXJhdGlvbi5hZGRUcmFuc3BvcnRPdXQodHJhbnNwb3J0T3V0KTsKLQotCi0gICAgICAgIHRyYW5zcG9ydEluID0gbmV3IFRyYW5zcG9ydEluRGVzY3JpcHRpb24oIm51bGwiKTsKLSAgICAgICAgdHJhbnNwb3J0SW4yID0gbmV3IFRyYW5zcG9ydEluRGVzY3JpcHRpb24oImFsd2F5cyIpOwotICAgICAgICB0cmFuc3BvcnRJbjMgPSBuZXcgVHJhbnNwb3J0SW5EZXNjcmlwdGlvbigidGhlYmVzdCIpOwotICAgICAgICB0cmFuc3BvcnRJbi5zZXRSZWNlaXZlcihuZXcgU2ltcGxlSFRUUFNlcnZlcigpKTsKLSAgICAgICAgdHJhbnNwb3J0SW4yLnNldFJlY2VpdmVyKG5ldyBTaW1wbGVIVFRQU2VydmVyKCkpOwotICAgICAgICB0cmFuc3BvcnRJbjMuc2V0UmVjZWl2ZXIobmV3IFNpbXBsZUhUVFBTZXJ2ZXIoKSk7Ci0KLSAgICAgICAgc2F2ZUF4aXNDb25maWd1cmF0aW9uLmFkZFRyYW5zcG9ydEluKHRyYW5zcG9ydEluMik7Ci0gICAgICAgIHNhdmVBeGlzQ29uZmlndXJhdGlvbi5hZGRUcmFuc3BvcnRJbih0cmFuc3BvcnRJbik7Ci0gICAgICAgIHNhdmVBeGlzQ29uZmlndXJhdGlvbi5hZGRUcmFuc3BvcnRJbih0cmFuc3BvcnRJbjMpOwotCi0gICAgICAgIHJlc3RvcmVBeGlzQ29uZmlndXJhdGlvbi5hZGRUcmFuc3BvcnRJbih0cmFuc3BvcnRJbjIpOwotICAgICAgICByZXN0b3JlQXhpc0NvbmZpZ3VyYXRpb24uYWRkVHJhbnNwb3J0SW4odHJhbnNwb3J0SW4pOwotICAgICAgICByZXN0b3JlQXhpc0NvbmZpZ3VyYXRpb24uYWRkVHJhbnNwb3J0SW4odHJhbnNwb3J0SW4zKTsKLQotICAgICAgICBlcXVpdkF4aXNDb25maWd1cmF0aW9uLmFkZFRyYW5zcG9ydEluKHRyYW5zcG9ydEluMik7Ci0gICAgICAgIGVxdWl2QXhpc0NvbmZpZ3VyYXRpb24uYWRkVHJhbnNwb3J0SW4odHJhbnNwb3J0SW4pOwotICAgICAgICBlcXVpdkF4aXNDb25maWd1cmF0aW9uLmFkZFRyYW5zcG9ydEluKHRyYW5zcG9ydEluMyk7Ci0KLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIHBoYXNlLXJlbGF0ZWQgb2JqZWN0cwotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgcGVyc2lzdGVudFN0b3JlID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgibWNPYmpUZXN0IiwgbnVsbCk7Ci0KLSAgICAgICAgcGhhc2VTYXZlID0gbmV3IFBoYXNlKCJQaGFzZVRlc3QiKTsKLSAgICAgICAgcGhhc2VTYXZlLmFkZEhhbmRsZXIobmV3IFRlbXBIYW5kbGVyKDEsIDEpKTsKLSAgICAgICAgcGhhc2VTYXZlLmFkZEhhbmRsZXIobmV3IFNhdmVIYW5kbGVyKDIsIHBlcnNpc3RlbnRTdG9yZSwgdHJ1ZSkpOwotICAgICAgICBwaGFzZVNhdmUuYWRkSGFuZGxlcihuZXcgVGVtcEhhbmRsZXIoMywgMSkpOwotCi0gICAgICAgIEFycmF5TGlzdCBwaGFzZXNfU2F2ZSA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgcGhhc2VzX1NhdmUuYWRkKHBoYXNlU2F2ZSk7Ci0KLSAgICAgICAgc2F2ZUF4aXNDb25maWd1cmF0aW9uLnNldEluUGhhc2VzVXB0b0FuZEluY2x1ZGluZ1Bvc3REaXNwYXRjaChwaGFzZXNfU2F2ZSk7Ci0KLQotICAgICAgICBwaGFzZVJlc3RvcmUgPSBuZXcgUGhhc2UoIlBoYXNlVGVzdCIpOwotICAgICAgICBwaGFzZVJlc3RvcmUuYWRkSGFuZGxlcihuZXcgVGVtcEhhbmRsZXIoMSwgMSkpOwotICAgICAgICBwaGFzZVJlc3RvcmUuYWRkSGFuZGxlcihuZXcgU2F2ZUhhbmRsZXIoMiwgcGVyc2lzdGVudFN0b3JlLCBmYWxzZSkpOwotICAgICAgICBwaGFzZVJlc3RvcmUuYWRkSGFuZGxlcihuZXcgVGVtcEhhbmRsZXIoMywgMSkpOwotCi0gICAgICAgIEFycmF5TGlzdCBwaGFzZXNfUmVzdG9yZSA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgcGhhc2VzX1Jlc3RvcmUuYWRkKHBoYXNlUmVzdG9yZSk7Ci0KLSAgICAgICAgcmVzdG9yZUF4aXNDb25maWd1cmF0aW9uLnNldEluUGhhc2VzVXB0b0FuZEluY2x1ZGluZ1Bvc3REaXNwYXRjaChwaGFzZXNfUmVzdG9yZSk7Ci0KLSAgICAgICAgcGhhc2VFcXVpdiA9IG5ldyBQaGFzZSgiUGhhc2VUZXN0Iik7Ci0gICAgICAgIHBoYXNlRXF1aXYuYWRkSGFuZGxlcihuZXcgVGVtcEhhbmRsZXIoMSwgMSkpOwotICAgICAgICBwaGFzZUVxdWl2LmFkZEhhbmRsZXIobmV3IFNhdmVIYW5kbGVyKDIsIHBlcnNpc3RlbnRTdG9yZSwgdHJ1ZSkpOwotICAgICAgICBwaGFzZUVxdWl2LmFkZEhhbmRsZXIobmV3IFRlbXBIYW5kbGVyKDMsIDEpKTsKLQotICAgICAgICBBcnJheUxpc3QgcGhhc2VzX0VxdWl2ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBwaGFzZXNfRXF1aXYuYWRkKHBoYXNlRXF1aXYpOwotCi0gICAgICAgIGVxdWl2QXhpc0NvbmZpZ3VyYXRpb24uc2V0SW5QaGFzZXNVcHRvQW5kSW5jbHVkaW5nUG9zdERpc3BhdGNoKHBoYXNlc19FcXVpdik7Ci0KLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBzZXR1cCB0aGUgYXhpcyBzaWRlIG9mIHRoZSBoaWVyYWNoeQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIEFCQyBncm91cAotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICBheGlzU3J2R3JwX0FCQ19zYXZlID0gbmV3IEF4aXNTZXJ2aWNlR3JvdXAoc2F2ZUF4aXNDb25maWd1cmF0aW9uKTsKLSAgICAgICAgYXhpc1NydkdycF9BQkNfc2F2ZS5zZXRTZXJ2aWNlR3JvdXBOYW1lKHNlcnZpY2VHcm91cE5hbWVfQUJDKTsKLQotICAgICAgICBheGlzU3J2X0Ffc2F2ZSA9IG5ldyBBeGlzU2VydmljZShzZXJ2aWNlX1FOYW1lX0EuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICBheGlzU3J2X0Jfc2F2ZSA9IG5ldyBBeGlzU2VydmljZShzZXJ2aWNlX1FOYW1lX0IuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICBheGlzU3J2X0Nfc2F2ZSA9IG5ldyBBeGlzU2VydmljZShzZXJ2aWNlX1FOYW1lX0MuZ2V0TG9jYWxQYXJ0KCkpOwotCi0gICAgICAgIGF4aXNTcnZHcnBfQUJDX3NhdmUuYWRkU2VydmljZShheGlzU3J2X0Ffc2F2ZSk7Ci0gICAgICAgIGF4aXNTcnZHcnBfQUJDX3NhdmUuYWRkU2VydmljZShheGlzU3J2X0Jfc2F2ZSk7Ci0gICAgICAgIGF4aXNTcnZHcnBfQUJDX3NhdmUuYWRkU2VydmljZShheGlzU3J2X0Nfc2F2ZSk7Ci0KLSAgICAgICAgYXhpc09wX0ExX3NhdmUgPSBuZXcgSW5PdXRBeGlzT3BlcmF0aW9uKG9wZXJhdGlvbl9RTmFtZV9BMSk7Ci0gICAgICAgIGF4aXNPcF9BMl9zYXZlID0gbmV3IEluT3V0QXhpc09wZXJhdGlvbihvcGVyYXRpb25fUU5hbWVfQTIpOwotCi0gICAgICAgIGF4aXNPcF9BMV9zYXZlLnNldE1lc3NhZ2VSZWNlaXZlcihuZXcgTWVzc2FnZVJlY2VpdmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgcmVjZWl2ZShNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ3R4KSB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIGF4aXNPcF9BMl9zYXZlLnNldE1lc3NhZ2VSZWNlaXZlcihuZXcgTWVzc2FnZVJlY2VpdmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgcmVjZWl2ZShNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ3R4KSB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIGF4aXNTcnZfQV9zYXZlLmFkZE9wZXJhdGlvbihheGlzT3BfQTFfc2F2ZSk7Ci0gICAgICAgIGF4aXNTcnZfQV9zYXZlLm1hcEFjdGlvblRvT3BlcmF0aW9uKG9wZXJhdGlvbl9RTmFtZV9BMS5nZXRMb2NhbFBhcnQoKSwgYXhpc09wX0ExX3NhdmUpOwotCi0gICAgICAgIGF4aXNTcnZfQV9zYXZlLmFkZE9wZXJhdGlvbihheGlzT3BfQTJfc2F2ZSk7Ci0gICAgICAgIGF4aXNTcnZfQV9zYXZlLm1hcEFjdGlvblRvT3BlcmF0aW9uKG9wZXJhdGlvbl9RTmFtZV9BMi5nZXRMb2NhbFBhcnQoKSwgYXhpc09wX0EyX3NhdmUpOwotCi0gICAgICAgIHNhdmVBeGlzQ29uZmlndXJhdGlvbi5hZGRTZXJ2aWNlKGF4aXNTcnZfQV9zYXZlKTsKLSAgICAgICAgc2F2ZUF4aXNDb25maWd1cmF0aW9uLmFkZFNlcnZpY2UoYXhpc1Nydl9CX3NhdmUpOwotICAgICAgICBzYXZlQXhpc0NvbmZpZ3VyYXRpb24uYWRkU2VydmljZShheGlzU3J2X0Nfc2F2ZSk7Ci0KLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICBheGlzU3J2R3JwX0FCQ19yZXN0b3JlID0gbmV3IEF4aXNTZXJ2aWNlR3JvdXAocmVzdG9yZUF4aXNDb25maWd1cmF0aW9uKTsKLSAgICAgICAgYXhpc1NydkdycF9BQkNfcmVzdG9yZS5zZXRTZXJ2aWNlR3JvdXBOYW1lKHNlcnZpY2VHcm91cE5hbWVfQUJDKTsKLQotICAgICAgICBheGlzU3J2X0FfcmVzdG9yZSA9IG5ldyBBeGlzU2VydmljZShzZXJ2aWNlX1FOYW1lX0EuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICBheGlzU3J2X0JfcmVzdG9yZSA9IG5ldyBBeGlzU2VydmljZShzZXJ2aWNlX1FOYW1lX0IuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICBheGlzU3J2X0NfcmVzdG9yZSA9IG5ldyBBeGlzU2VydmljZShzZXJ2aWNlX1FOYW1lX0MuZ2V0TG9jYWxQYXJ0KCkpOwotCi0gICAgICAgIGF4aXNTcnZHcnBfQUJDX3Jlc3RvcmUuYWRkU2VydmljZShheGlzU3J2X0FfcmVzdG9yZSk7Ci0gICAgICAgIGF4aXNTcnZHcnBfQUJDX3Jlc3RvcmUuYWRkU2VydmljZShheGlzU3J2X0JfcmVzdG9yZSk7Ci0gICAgICAgIGF4aXNTcnZHcnBfQUJDX3Jlc3RvcmUuYWRkU2VydmljZShheGlzU3J2X0NfcmVzdG9yZSk7Ci0KLSAgICAgICAgYXhpc09wX0ExX3Jlc3RvcmUgPSBuZXcgSW5PdXRBeGlzT3BlcmF0aW9uKG9wZXJhdGlvbl9RTmFtZV9BMSk7Ci0gICAgICAgIGF4aXNPcF9BMl9yZXN0b3JlID0gbmV3IEluT3V0QXhpc09wZXJhdGlvbihvcGVyYXRpb25fUU5hbWVfQTIpOwotCi0gICAgICAgIGF4aXNPcF9BMV9yZXN0b3JlLnNldE1lc3NhZ2VSZWNlaXZlcihuZXcgTWVzc2FnZVJlY2VpdmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgcmVjZWl2ZShNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ3R4KSB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIGF4aXNPcF9BMl9yZXN0b3JlLnNldE1lc3NhZ2VSZWNlaXZlcihuZXcgTWVzc2FnZVJlY2VpdmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgcmVjZWl2ZShNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ3R4KSB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIGF4aXNTcnZfQV9yZXN0b3JlLmFkZE9wZXJhdGlvbihheGlzT3BfQTFfcmVzdG9yZSk7Ci0gICAgICAgIGF4aXNTcnZfQV9yZXN0b3JlCi0gICAgICAgICAgICAgICAgLm1hcEFjdGlvblRvT3BlcmF0aW9uKG9wZXJhdGlvbl9RTmFtZV9BMS5nZXRMb2NhbFBhcnQoKSwgYXhpc09wX0ExX3Jlc3RvcmUpOwotCi0gICAgICAgIGF4aXNTcnZfQV9yZXN0b3JlLmFkZE9wZXJhdGlvbihheGlzT3BfQTJfcmVzdG9yZSk7Ci0gICAgICAgIGF4aXNTcnZfQV9yZXN0b3JlCi0gICAgICAgICAgICAgICAgLm1hcEFjdGlvblRvT3BlcmF0aW9uKG9wZXJhdGlvbl9RTmFtZV9BMi5nZXRMb2NhbFBhcnQoKSwgYXhpc09wX0EyX3Jlc3RvcmUpOwotCi0KLSAgICAgICAgcmVzdG9yZUF4aXNDb25maWd1cmF0aW9uLmFkZFNlcnZpY2UoYXhpc1Nydl9BX3Jlc3RvcmUpOwotICAgICAgICByZXN0b3JlQXhpc0NvbmZpZ3VyYXRpb24uYWRkU2VydmljZShheGlzU3J2X0JfcmVzdG9yZSk7Ci0gICAgICAgIHJlc3RvcmVBeGlzQ29uZmlndXJhdGlvbi5hZGRTZXJ2aWNlKGF4aXNTcnZfQ19yZXN0b3JlKTsKLQotCi0gICAgICAgIGF4aXNPcF9BMV9zYXZlLmdldFJlbWFpbmluZ1BoYXNlc0luRmxvdygpLmFkZChwaGFzZVNhdmUpOwotICAgICAgICBheGlzT3BfQTJfc2F2ZS5nZXRSZW1haW5pbmdQaGFzZXNJbkZsb3coKS5hZGQocGhhc2VTYXZlKTsKLQotICAgICAgICBheGlzT3BfQTFfcmVzdG9yZS5nZXRSZW1haW5pbmdQaGFzZXNJbkZsb3coKS5hZGQocGhhc2VSZXN0b3JlKTsKLSAgICAgICAgYXhpc09wX0EyX3Jlc3RvcmUuZ2V0UmVtYWluaW5nUGhhc2VzSW5GbG93KCkuYWRkKHBoYXNlUmVzdG9yZSk7Ci0KLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgYXhpc1NydkdycF9BQkNfZXF1aXYgPSBuZXcgQXhpc1NlcnZpY2VHcm91cChlcXVpdkF4aXNDb25maWd1cmF0aW9uKTsKLSAgICAgICAgYXhpc1NydkdycF9BQkNfZXF1aXYuc2V0U2VydmljZUdyb3VwTmFtZShzZXJ2aWNlR3JvdXBOYW1lX0FCQyk7Ci0KLSAgICAgICAgYXhpc1Nydl9BX2VxdWl2ID0gbmV3IEF4aXNTZXJ2aWNlKHNlcnZpY2VfUU5hbWVfQS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgIGF4aXNTcnZfQl9lcXVpdiA9IG5ldyBBeGlzU2VydmljZShzZXJ2aWNlX1FOYW1lX0IuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICBheGlzU3J2X0NfZXF1aXYgPSBuZXcgQXhpc1NlcnZpY2Uoc2VydmljZV9RTmFtZV9DLmdldExvY2FsUGFydCgpKTsKLQotICAgICAgICBheGlzU3J2R3JwX0FCQ19lcXVpdi5hZGRTZXJ2aWNlKGF4aXNTcnZfQV9lcXVpdik7Ci0gICAgICAgIGF4aXNTcnZHcnBfQUJDX2VxdWl2LmFkZFNlcnZpY2UoYXhpc1Nydl9CX2VxdWl2KTsKLSAgICAgICAgYXhpc1NydkdycF9BQkNfZXF1aXYuYWRkU2VydmljZShheGlzU3J2X0NfZXF1aXYpOwotCi0gICAgICAgIGF4aXNPcF9BMV9lcXVpdiA9IG5ldyBJbk91dEF4aXNPcGVyYXRpb24ob3BlcmF0aW9uX1FOYW1lX0ExKTsKLSAgICAgICAgYXhpc09wX0EyX2VxdWl2ID0gbmV3IEluT3V0QXhpc09wZXJhdGlvbihvcGVyYXRpb25fUU5hbWVfQTIpOwotCi0gICAgICAgIGF4aXNPcF9BMV9lcXVpdi5zZXRNZXNzYWdlUmVjZWl2ZXIobmV3IE1lc3NhZ2VSZWNlaXZlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJlY2VpdmUoTWVzc2FnZUNvbnRleHQgbWVzc2FnZUN0eCkgewotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBheGlzT3BfQTJfZXF1aXYuc2V0TWVzc2FnZVJlY2VpdmVyKG5ldyBNZXNzYWdlUmVjZWl2ZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCByZWNlaXZlKE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDdHgpIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgYXhpc1Nydl9BX2VxdWl2LmFkZE9wZXJhdGlvbihheGlzT3BfQTFfZXF1aXYpOwotICAgICAgICBheGlzU3J2X0FfZXF1aXYubWFwQWN0aW9uVG9PcGVyYXRpb24ob3BlcmF0aW9uX1FOYW1lX0ExLmdldExvY2FsUGFydCgpLCBheGlzT3BfQTFfZXF1aXYpOwotCi0gICAgICAgIGF4aXNTcnZfQV9lcXVpdi5hZGRPcGVyYXRpb24oYXhpc09wX0EyX2VxdWl2KTsKLSAgICAgICAgYXhpc1Nydl9BX2VxdWl2Lm1hcEFjdGlvblRvT3BlcmF0aW9uKG9wZXJhdGlvbl9RTmFtZV9BMi5nZXRMb2NhbFBhcnQoKSwgYXhpc09wX0EyX2VxdWl2KTsKLQotICAgICAgICBlcXVpdkF4aXNDb25maWd1cmF0aW9uLmFkZFNlcnZpY2UoYXhpc1Nydl9BX2VxdWl2KTsKLSAgICAgICAgZXF1aXZBeGlzQ29uZmlndXJhdGlvbi5hZGRTZXJ2aWNlKGF4aXNTcnZfQl9lcXVpdik7Ci0gICAgICAgIGVxdWl2QXhpc0NvbmZpZ3VyYXRpb24uYWRkU2VydmljZShheGlzU3J2X0NfZXF1aXYpOwotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gc2V0dXAgdGhlIGNvbnRleHQgb2JqZWN0cwotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIHNydkdycEN0eF9BQkNfc2F2ZSA9IHNhdmVDb25maWd1cmF0aW9uQ29udGV4dC5jcmVhdGVTZXJ2aWNlR3JvdXBDb250ZXh0KGF4aXNTcnZHcnBfQUJDX3NhdmUpOwotICAgICAgICBzcnZHcnBDdHhfQUJDX3NhdmUuc2V0SWQoc2VydmljZUdyb3VwTmFtZV9BQkMpOwotCi0gICAgICAgIHNydkN0eF9BX3NhdmUgPSBzcnZHcnBDdHhfQUJDX3NhdmUuZ2V0U2VydmljZUNvbnRleHQoYXhpc1Nydl9BX3NhdmUpOwotICAgICAgICBzcnZDdHhfQl9zYXZlID0gc3J2R3JwQ3R4X0FCQ19zYXZlLmdldFNlcnZpY2VDb250ZXh0KGF4aXNTcnZfQl9zYXZlKTsKLSAgICAgICAgc3J2Q3R4X0Nfc2F2ZSA9IHNydkdycEN0eF9BQkNfc2F2ZS5nZXRTZXJ2aWNlQ29udGV4dChheGlzU3J2X0Nfc2F2ZSk7Ci0KLSAgICAgICAgb3BDdHhfQTFfc2F2ZSA9IHNydkN0eF9BX3NhdmUuY3JlYXRlT3BlcmF0aW9uQ29udGV4dChvcGVyYXRpb25fUU5hbWVfQTEpOwotICAgICAgICBvcEN0eF9BMl9zYXZlID0gc3J2Q3R4X0Ffc2F2ZS5jcmVhdGVPcGVyYXRpb25Db250ZXh0KG9wZXJhdGlvbl9RTmFtZV9BMik7Ci0KLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgc3J2R3JwQ3R4X0FCQ19lcXVpdiA9Ci0gICAgICAgICAgICAgICAgZXF1aXZDb25maWd1cmF0aW9uQ29udGV4dC5jcmVhdGVTZXJ2aWNlR3JvdXBDb250ZXh0KGF4aXNTcnZHcnBfQUJDX2VxdWl2KTsKLSAgICAgICAgc3J2R3JwQ3R4X0FCQ19lcXVpdi5zZXRJZChzZXJ2aWNlR3JvdXBOYW1lX0FCQyk7Ci0KLSAgICAgICAgc3J2Q3R4X0FfZXF1aXYgPSBzcnZHcnBDdHhfQUJDX2VxdWl2LmdldFNlcnZpY2VDb250ZXh0KGF4aXNTcnZfQV9lcXVpdik7Ci0gICAgICAgIHNydkN0eF9CX2VxdWl2ID0gc3J2R3JwQ3R4X0FCQ19lcXVpdi5nZXRTZXJ2aWNlQ29udGV4dChheGlzU3J2X0JfZXF1aXYpOwotICAgICAgICBzcnZDdHhfQ19lcXVpdiA9IHNydkdycEN0eF9BQkNfZXF1aXYuZ2V0U2VydmljZUNvbnRleHQoYXhpc1Nydl9DX2VxdWl2KTsKLQotICAgICAgICBvcEN0eF9BMV9lcXVpdiA9IHNydkN0eF9BX2VxdWl2LmNyZWF0ZU9wZXJhdGlvbkNvbnRleHQob3BlcmF0aW9uX1FOYW1lX0ExKTsKLSAgICAgICAgb3BDdHhfQTJfZXF1aXYgPSBzcnZDdHhfQV9lcXVpdi5jcmVhdGVPcGVyYXRpb25Db250ZXh0KG9wZXJhdGlvbl9RTmFtZV9BMik7Ci0KLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIG1lc3NhZ2UgY29udGV4dCBvYmplY3RzCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICBtc2dDdHhfQTFfMV9zYXZlID0gY3JlYXRlTWVzc2FnZUNvbnRleHQob3BDdHhfQTFfc2F2ZSwgc2F2ZUNvbmZpZ3VyYXRpb25Db250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUNvbnRleHQuSU5fRkxPVyk7Ci0gICAgICAgIG1zZ0N0eF9BMV8yX3NhdmUgPSBjcmVhdGVNZXNzYWdlQ29udGV4dChvcEN0eF9BMV9zYXZlLCBzYXZlQ29uZmlndXJhdGlvbkNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlQ29udGV4dC5PVVRfRkxPVyk7Ci0gICAgICAgIG1zZ0N0eF9BMl9zYXZlID0gY3JlYXRlTWVzc2FnZUNvbnRleHQob3BDdHhfQTJfc2F2ZSwgc2F2ZUNvbmZpZ3VyYXRpb25Db250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VDb250ZXh0LklOX0ZMT1cpOwotCi0gICAgICAgIG1zZ0N0eF9BMV8xX2VxdWl2ID0gY3JlYXRlTWVzc2FnZUNvbnRleHQob3BDdHhfQTFfZXF1aXYsIGVxdWl2Q29uZmlndXJhdGlvbkNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUNvbnRleHQuSU5fRkxPVyk7Ci0gICAgICAgIG1zZ0N0eF9BMV8yX2VxdWl2ID0gY3JlYXRlTWVzc2FnZUNvbnRleHQob3BDdHhfQTFfZXF1aXYsIGVxdWl2Q29uZmlndXJhdGlvbkNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUNvbnRleHQuT1VUX0ZMT1cpOwotICAgICAgICBtc2dDdHhfQTJfZXF1aXYgPSBjcmVhdGVNZXNzYWdlQ29udGV4dChvcEN0eF9BMl9lcXVpdiwgZXF1aXZDb25maWd1cmF0aW9uQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUNvbnRleHQuSU5fRkxPVyk7Ci0KLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBvdGhlciBvYmplY3RzCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgZXhlY3V0ZWRIYW5kbGVycyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICB9Ci0KLQotICAgIHByaXZhdGUgTWVzc2FnZUNvbnRleHQgY3JlYXRlTWVzc2FnZUNvbnRleHQoT3BlcmF0aW9uQ29udGV4dCBvYywgQ29uZmlndXJhdGlvbkNvbnRleHQgY2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxvd1R5cGUpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBNZXNzYWdlQ29udGV4dCBtYyA9IGNjLmNyZWF0ZU1lc3NhZ2VDb250ZXh0KCk7Ci0KLSAgICAgICAgbWMuc2V0RkxPVyhmbG93VHlwZSk7Ci0gICAgICAgIG1jLnNldFRyYW5zcG9ydEluKHRyYW5zcG9ydEluKTsKLSAgICAgICAgbWMuc2V0VHJhbnNwb3J0T3V0KHRyYW5zcG9ydE91dCk7Ci0KLSAgICAgICAgbWMuc2V0U2VydmVyU2lkZSh0cnVlKTsKLS8vICAgICAgICBtYy5zZXRQcm9wZXJ0eShNZXNzYWdlQ29udGV4dC5UUkFOU1BPUlRfT1VULCBTeXN0ZW0ub3V0KTsKLQotICAgICAgICBTT0FQRmFjdG9yeSBvbUZhYyA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMUZhY3RvcnkoKTsKLSAgICAgICAgbWMuc2V0RW52ZWxvcGUob21GYWMuZ2V0RGVmYXVsdEVudmVsb3BlKCkpOwotCi0gICAgICAgIEF4aXNPcGVyYXRpb24gYXhpc09wZXJhdGlvbiA9IG9jLmdldEF4aXNPcGVyYXRpb24oKTsKLSAgICAgICAgU3RyaW5nIGFjdGlvbiA9IGF4aXNPcGVyYXRpb24uZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpOwotICAgICAgICBtYy5zZXRTb2FwQWN0aW9uKGFjdGlvbik7Ci0vLyAgICAgICAgU3lzdGVtLm91dC5mbHVzaCgpOwotCi0gICAgICAgIG1jLnNldE1lc3NhZ2VJRChVVUlER2VuZXJhdG9yLmdldFVVSUQoKSk7Ci0KLSAgICAgICAgYXhpc09wZXJhdGlvbi5yZWdpc3Rlck9wZXJhdGlvbkNvbnRleHQobWMsIG9jKTsKLSAgICAgICAgbWMuc2V0T3BlcmF0aW9uQ29udGV4dChvYyk7Ci0KLSAgICAgICAgU2VydmljZUNvbnRleHQgc2MgPSBvYy5nZXRTZXJ2aWNlQ29udGV4dCgpOwotICAgICAgICBtYy5zZXRTZXJ2aWNlQ29udGV4dChzYyk7Ci0KLSAgICAgICAgbWMuc2V0VG8obmV3IEVuZHBvaW50UmVmZXJlbmNlKCJheGlzMi9zZXJ2aWNlcy9OdWxsU2VydmljZSIpKTsKLSAgICAgICAgbWMuc2V0V1NBQWN0aW9uKCJEdW1teU9wIik7Ci0KLSAgICAgICAgQXhpc01lc3NhZ2UgYXhpc01lc3NhZ2UgPSBheGlzT3BlcmF0aW9uLmdldE1lc3NhZ2UoV1NETENvbnN0YW50cy5NRVNTQUdFX0xBQkVMX0lOX1ZBTFVFKTsKLSAgICAgICAgbWMuc2V0QXhpc01lc3NhZ2UoYXhpc01lc3NhZ2UpOwotCi0gICAgICAgIHJldHVybiBtYzsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvL29yZy5hcGFjaGUubG9nNGouQmFzaWNDb25maWd1cmF0b3IuY29uZmlndXJlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEhpZXJhcmNoeU5ld0NvbnRleHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHRpdGxlID0gIk1lc3NhZ2VDb250ZXh0U2F2ZUNUZXN0OnRlc3RIaWVyYXJjaHlOZXdDb250ZXh0KCk6ICI7Ci0KLQotICAgICAgICBNZXNzYWdlQ29udGV4dCBtYyA9IG1zZ0N0eF9BMV8yX3NhdmU7Ci0gICAgICAgIE9wZXJhdGlvbkNvbnRleHQgb2MgPSBtYy5nZXRPcGVyYXRpb25Db250ZXh0KCk7Ci0gICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArICIqKiogT3JpZ2luYWwgT3BlcmF0aW9uQ29udGV4dCBtZXNzYWdlIGNvbnRleHQgdGFibGUgKioqKiIpOwotICAgICAgICBzaG93TUNUYWJsZShvYyk7Ci0KLSAgICAgICAgLy8gcnVuIHRoZSBtZXNzYWdlIHRocm91Z2ggdGhlIG1lc3NhZ2UgcHJvY2Vzc2luZwotICAgICAgICAvLyB0aGlzIGNhdXNlcyB0aGUgbWVzc2FnZSBjb250ZXh0IHRvIGdldCBzYXZlZCAKLSAgICAgICAgbG9nLmRlYnVnKHRpdGxlICsgIi0gLSAtIFNhdmUgdGhlIG1lc3NhZ2UgY29udGV4dCBmcm9tIHRoZSBlbmdpbmUgLSAtIC0gLSIpOwotICAgICAgICBBeGlzRW5naW5lLnJlY2VpdmUobWMpOwotCi0gICAgICAgIExpbmtlZEhhc2hNYXAgb3JpZ2luYWxfb2JqZWN0X2dyYXBoID0gZ2V0T2JqZWN0R3JhcGhJbmZvKG1jKTsKLSAgICAgICAgbG9nLmRlYnVnKHRpdGxlICsgIioqKiBPcmlnaW5pYWwgb2JqZWN0IGdyYXBoICoqKioiKTsKLSAgICAgICAgc2hvd09iamVjdEdyYXBoSW5mbyhvcmlnaW5hbF9vYmplY3RfZ3JhcGgpOwotCi0gICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArCi0gICAgICAgICAgICAgICAgIi0gLSAtIFJlc3RvcmUgdGhlIG1lc3NhZ2UgY29udGV4dCBvbiBhIHNlcGFyYXRlIGVuZ2luZSAgLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSIpOwotICAgICAgICBNZXNzYWdlQ29udGV4dCBtYzIgPSByZXN0b3JlTWVzc2FnZUNvbnRleHQocGVyc2lzdGVudFN0b3JlLCByZXN0b3JlQ29uZmlndXJhdGlvbkNvbnRleHQpOwotCi0gICAgICAgIExpbmtlZEhhc2hNYXAgcmVzdG9yZWRfb2JqZWN0X2dyYXBoID0gZ2V0T2JqZWN0R3JhcGhJbmZvKG1jMik7Ci0gICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArICIqKiogUmVzdG9yZWQgb2JqZWN0IGdyYXBoICoqKioiKTsKLSAgICAgICAgc2hvd09iamVjdEdyYXBoSW5mbyhyZXN0b3JlZF9vYmplY3RfZ3JhcGgpOwotCi0gICAgICAgIE9wZXJhdGlvbkNvbnRleHQgb2MyID0gbWMyLmdldE9wZXJhdGlvbkNvbnRleHQoKTsKLSAgICAgICAgbG9nLmRlYnVnKHRpdGxlICsgIioqKiBSZXN0b3JlZCBPcGVyYXRpb25Db250ZXh0IG1lc3NhZ2UgY29udGV4dCB0YWJsZSAqKioqIik7Ci0gICAgICAgIHNob3dNQ1RhYmxlKG9jMik7Ci0KLSAgICAgICAgYm9vbGVhbiBtY1RhYmxlTWF0Y2ggPSBjb21wYXJlTUNUYWJsZShvYywgb2MyKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShtY1RhYmxlTWF0Y2gpOwotCi0gICAgICAgIC8vIHJlc3VtZSB0aGUgcmVzdG9yZWQgcGF1c2VkIG1lc3NhZ2UgY29udGV4dCBvbiBhbiBlbmdpbmUgdGhhdCBoYXMgdGhlIAotICAgICAgICAvLyBzYW1lIHNldHVwIGFzIHRoZSBlbmdpbmUgd2hlcmUgdGhlIHNhdmUgb2NjdXJyZWQKLSAgICAgICAgLy8gYnV0IGRvZXNuJ3QgaGF2ZSB0aGUgQ29udGV4dCBvYmplY3RzCi0gICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArCi0gICAgICAgICAgICAgICAgIi0gLSAtIFJlc3VtZSB0aGUgcmVzdG9yZWQgbWVzc2FnZSBjb250ZXh0IC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0iKTsKLSAgICAgICAgQXhpc0VuZ2luZS5yZXN1bWUobWMyKTsKLQotICAgICAgICBMaW5rZWRIYXNoTWFwIHJlc3VtZWRfb2JqZWN0X2dyYXBoID0gZ2V0T2JqZWN0R3JhcGhJbmZvKG1jMik7Ci0gICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArICIqKiogUG9zdCBSZXN1bWVkIG9iamVjdCBncmFwaCAqKioqIik7Ci0gICAgICAgIHNob3dPYmplY3RHcmFwaEluZm8ocmVzdW1lZF9vYmplY3RfZ3JhcGgpOwotCi0gICAgICAgIC8vIGNvbXBhcmUgb2JqZWN0IGhhc2hjb2RlcyAtIGV4cGVjdCBkaWZmZXJlbmNlcwotICAgICAgICBib29sZWFuIGV4cGVjdEZhbHNlID0KLSAgICAgICAgICAgICAgICBjb21wYXJlT2JqZWN0R3JhcGhJbmZvKG9yaWdpbmFsX29iamVjdF9ncmFwaCwgcmVzdG9yZWRfb2JqZWN0X2dyYXBoLCB0cnVlKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoZXhwZWN0RmFsc2UpOwotCi0gICAgICAgIGJvb2xlYW4gZXhwZWN0U2FtZU9iamVjdElkcyA9Ci0gICAgICAgICAgICAgICAgY29tcGFyZU9iamVjdEdyYXBoSW5mbyhvcmlnaW5hbF9vYmplY3RfZ3JhcGgsIHJlc3RvcmVkX29iamVjdF9ncmFwaCwgZmFsc2UpOwotICAgICAgICBhc3NlcnRUcnVlKGV4cGVjdFNhbWVPYmplY3RJZHMpOwotCi0gICAgICAgIGJvb2xlYW4gaXNTYW1lID0gY29tcGFyZU9iamVjdEdyYXBoSW5mbyhyZXN0b3JlZF9vYmplY3RfZ3JhcGgsIHJlc3VtZWRfb2JqZWN0X2dyYXBoLCBmYWxzZSk7Ci0gICAgICAgIGFzc2VydFRydWUoaXNTYW1lKTsKLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RIaWVyYXJjaHlSZXVzZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgdGl0bGUgPSAiTWVzc2FnZUNvbnRleHRTYXZlQ1Rlc3Q6dGVzdEhpZXJhcmNoeVJldXNlKCk6ICI7Ci0KLQotICAgICAgICBNZXNzYWdlQ29udGV4dCBtYyA9IG1zZ0N0eF9BMV8xX3NhdmU7Ci0KLSAgICAgICAgLy8gcnVuIHRoZSBtZXNzYWdlIHRocm91Z2ggdGhlIG1lc3NhZ2UgcHJvY2Vzc2luZwotICAgICAgICAvLyB0aGlzIGNhdXNlcyB0aGUgbWVzc2FnZSBjb250ZXh0IHRvIGdldCBzYXZlZCAKLSAgICAgICAgbG9nLmRlYnVnKHRpdGxlICsgIi0gLSAtIFNhdmUgdGhlIG1lc3NhZ2UgY29udGV4dCBmcm9tIHRoZSBlbmdpbmUgLSAtIC0gLSIpOwotICAgICAgICBBeGlzRW5naW5lLnJlY2VpdmUobWMpOwotCi0gICAgICAgIExpbmtlZEhhc2hNYXAgb3JpZ2luYWxfb2JqZWN0X2dyYXBoID0gZ2V0T2JqZWN0R3JhcGhJbmZvKG1jKTsKLSAgICAgICAgbG9nLmRlYnVnKHRpdGxlICsgIioqKiBPcmlnaW5pYWwgb2JqZWN0IGdyYXBoICoqKioiKTsKLSAgICAgICAgc2hvd09iamVjdEdyYXBoSW5mbyhvcmlnaW5hbF9vYmplY3RfZ3JhcGgpOwotCi0gICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArCi0gICAgICAgICAgICAgICAgIi0gLSAtIFJlc3RvcmUgdGhlIG1lc3NhZ2UgY29udGV4dCBvbiBhIHNlcGFyYXRlIGVuZ2luZSAgLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSIpOwotICAgICAgICBNZXNzYWdlQ29udGV4dCBtYzIgPSByZXN0b3JlTWVzc2FnZUNvbnRleHQocGVyc2lzdGVudFN0b3JlLCBlcXVpdkNvbmZpZ3VyYXRpb25Db250ZXh0KTsKLQotICAgICAgICBMaW5rZWRIYXNoTWFwIHJlc3RvcmVkX29iamVjdF9ncmFwaCA9IGdldE9iamVjdEdyYXBoSW5mbyhtYzIpOwotICAgICAgICBsb2cuZGVidWcodGl0bGUgKyAiKioqIFJlc3RvcmVkIG9iamVjdCBncmFwaCAqKioqIik7Ci0gICAgICAgIHNob3dPYmplY3RHcmFwaEluZm8ocmVzdG9yZWRfb2JqZWN0X2dyYXBoKTsKLQotICAgICAgICAvLyB3ZSBkb24ndCB1c2Ugc3RyaWN0IGNoZWNraW5nIGhlcmUgc2luY2UgdGhlIGVuZ2luZSB3aGVyZSB0aGUgCi0gICAgICAgIC8vIHJlc3RvcmF0aW9uIHRha2VzIHBsYWNlIGlzIGEgImNvcHkiLCBpZSwgdGhlcmUgYXJlIG5ldyBvYmplY3RzCi0gICAgICAgIC8vIGZvciB0aGUgc2FtZSBuYW1lcy9pZGVudGlmaWNhdGlvbnMKLSAgICAgICAgYm9vbGVhbiBoYXNFcXVpdmFsZW5jZSA9Ci0gICAgICAgICAgICAgICAgY29tcGFyZU9iamVjdEdyYXBoSW5mbyhvcmlnaW5hbF9vYmplY3RfZ3JhcGgsIHJlc3RvcmVkX29iamVjdF9ncmFwaCwgZmFsc2UpOwotICAgICAgICBhc3NlcnRUcnVlKGhhc0VxdWl2YWxlbmNlKTsKLQotICAgICAgICAvLyBnZXQgYW4gb2JqZWN0IGdyYXBoIGZyb20gYW4gZXF1aXZhbGVudCBtZXNzYWdlIGNvbnRleHQgb24gdGhlIHNlcGFyYXRlIGVuZ2luZQotICAgICAgICAvLyB3ZSB3b3VsZCBleHBlY3QgYSBzdHJpY3QgbWF0Y2ggb2YgdGhlIG9iamVjdCBncmFwaHMgYmV0d2VlbiB0aGUgCi0gICAgICAgIC8vIHJlc3RvcmVkIG1lc3NhZ2UgY29udGV4dCBhbmQgdGhlIG1lc3NhZ2UgY29udGV4dCBvbiB0aGUgc2VwYXJhdGUgZW5naW5lCi0gICAgICAgIExpbmtlZEhhc2hNYXAgc2VwYXJhdGVfb2JqZWN0X2dyYXBoID0gZ2V0T2JqZWN0R3JhcGhJbmZvKG1zZ0N0eF9BMV8xX2VxdWl2KTsKLQotICAgICAgICAvLyBjb21wYXJlIHRoZSByZXN0b3JlZCBvYmplY3QgZ3JhcGggd2l0aCB0aGUgZXhpc3Rpbmcgb2JqZWN0IGdyYXBoCi0gICAgICAgIGJvb2xlYW4gZXhwZWN0U3RyaWN0ID0KLSAgICAgICAgICAgICAgICBjb21wYXJlT2JqZWN0R3JhcGhJbmZvKHJlc3RvcmVkX29iamVjdF9ncmFwaCwgc2VwYXJhdGVfb2JqZWN0X2dyYXBoLCB0cnVlKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShleHBlY3RTdHJpY3QpOwotCi0gICAgICAgIC8vIHJlc3VtZSB0aGUgcmVzdG9yZWQgcGF1c2VkIG1lc3NhZ2UgY29udGV4dCBvbiBhbiBlbmdpbmUgdGhhdCBoYXMgdGhlIAotICAgICAgICAvLyBzYW1lIHNldHVwIGFzIHRoZSBlbmdpbmUgd2hlcmUgdGhlIHNhdmUgb2NjdXJyZWQKLSAgICAgICAgLy8gYW5kIHNhdmUgaGFzIHRoZSBTZXJ2aWNlLWxldmVsIENvbnRleHQgb2JqZWN0cwotICAgICAgICBsb2cuZGVidWcodGl0bGUgKwotICAgICAgICAgICAgICAgICItIC0gLSBSZXN1bWUgdGhlIHJlc3RvcmVkIG1lc3NhZ2UgY29udGV4dCAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIik7Ci0gICAgICAgIEF4aXNFbmdpbmUucmVzdW1lKG1jMik7Ci0KLSAgICAgICAgTGlua2VkSGFzaE1hcCByZXN1bWVkX29iamVjdF9ncmFwaCA9IGdldE9iamVjdEdyYXBoSW5mbyhtYzIpOwotICAgICAgICBsb2cuZGVidWcodGl0bGUgKyAiKioqIFBvc3QgUmVzdW1lZCBvYmplY3QgZ3JhcGggKioqKiIpOwotICAgICAgICBzaG93T2JqZWN0R3JhcGhJbmZvKHJlc3VtZWRfb2JqZWN0X2dyYXBoKTsKLQotICAgICAgICAvLyB0aGVyZSBzaG91bGQgYmUgbm8gY2hhbmdlcyBpbiB0aGUgb2JqZWN0IGdyYXBoIGluIG91ciBjYXNlIGFmdGVyIHRoZSByZXN1bWUKLSAgICAgICAgaGFzRXF1aXZhbGVuY2UgPSBjb21wYXJlT2JqZWN0R3JhcGhJbmZvKHJlc3RvcmVkX29iamVjdF9ncmFwaCwgcmVzdW1lZF9vYmplY3RfZ3JhcGgsIHRydWUpOwotICAgICAgICBhc3NlcnRUcnVlKGhhc0VxdWl2YWxlbmNlKTsKLQotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVzdG9yZXMgYSBwcmV2aW91c2x5IHNhdmVkIG1lc3NhZ2UgY29udGV4dAotICAgICAqLwotICAgIHB1YmxpYyBNZXNzYWdlQ29udGV4dCByZXN0b3JlTWVzc2FnZUNvbnRleHQoRmlsZSByZXN0b3JlRmlsZSwgQ29uZmlndXJhdGlvbkNvbnRleHQgY2MpIHsKLSAgICAgICAgU3RyaW5nIHRpdGxlID0gInJlc3RvcmVNZXNzYWdlQ29udGV4dCgpOiAiOwotCi0gICAgICAgIE1lc3NhZ2VDb250ZXh0IHJlc3RvcmVkTUMgPSBudWxsOwotCi0gICAgICAgIEZpbGUgdGhlRmlsZSA9IHJlc3RvcmVGaWxlOwotICAgICAgICBTdHJpbmcgdGhlRmlsZW5hbWUgPSBudWxsOwotCi0gICAgICAgIC8vIHRoZSBjb25maWd1cmF0aW9uIGNvbnRleHQgdG8gdXNlIGZvciBtZXNzYWdlIGNvbnRleHQgYWN0aXZhdGlvbgotICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBjZmdDdHggPSBjYzsKLQotICAgICAgICBib29sZWFuIHJlc3RvcmVkT2sgPSBmYWxzZTsKLQotICAgICAgICBpZiAoKHRoZUZpbGUgIT0gbnVsbCkgJiYgKHRoZUZpbGUuZXhpc3RzKCkpKSB7Ci0gICAgICAgICAgICB0aGVGaWxlbmFtZSA9IHRoZUZpbGUuZ2V0TmFtZSgpOwotICAgICAgICAgICAgbG9nLmRlYnVnKHRpdGxlICsgInRlbXAgZmlsZSA9IFsiICsgdGhlRmlsZW5hbWUgKyAiXSIpOwotCi0gICAgICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgICAgIC8vIHJlc3RvcmUgZnJvbSB0aGUgdGVtcG9yYXJ5IGZpbGUKLSAgICAgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAvLyBzZXR1cCBhbiBpbnB1dCBzdHJlYW0gdG8gdGhlIGZpbGUKLSAgICAgICAgICAgICAgICBGaWxlSW5wdXRTdHJlYW0gaW5TdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKHRoZUZpbGUpOwotCi0gICAgICAgICAgICAgICAgLy8gYXR0YWNoIGEgc3RyZWFtIGNhcGFibGUgb2YgcmVhZGluZyBvYmplY3RzIGZyb20gdGhlIAotICAgICAgICAgICAgICAgIC8vIHN0cmVhbSBjb25uZWN0ZWQgdG8gdGhlIGZpbGUKLSAgICAgICAgICAgICAgICBPYmplY3RJbnB1dFN0cmVhbSBpbk9ialN0cmVhbSA9IG5ldyBPYmplY3RJbnB1dFN0cmVhbShpblN0cmVhbSk7Ci0KLSAgICAgICAgICAgICAgICAvLyB0cnkgdG8gcmVzdG9yZSB0aGUgbWVzc2FnZSBjb250ZXh0Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKHRpdGxlICsgInJlc3RvcmluZyBhIG1lc3NhZ2UgY29udGV4dC4uLi4uIik7Ci0gICAgICAgICAgICAgICAgcmVzdG9yZWRPayA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dDIgPSAoTWVzc2FnZUNvbnRleHQpIGluT2JqU3RyZWFtLnJlYWRPYmplY3QoKTsKLSAgICAgICAgICAgICAgICBpbk9ialN0cmVhbS5jbG9zZSgpOwotICAgICAgICAgICAgICAgIGluU3RyZWFtLmNsb3NlKCk7Ci0KLSAgICAgICAgICAgICAgICBtc2dDb250ZXh0Mi5hY3RpdmF0ZShjZmdDdHgpOwotCi0gICAgICAgICAgICAgICAgcmVzdG9yZWRPayA9IHRydWU7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKHRpdGxlICsgIi4uLi5yZXN0b3JlZCBtZXNzYWdlIGNvbnRleHQuLi4uLiIpOwotCi0gICAgICAgICAgICAgICAgLy8gbm93IHB1dCB0aGUgcmVzdG9yZWQgbWVzc2FnZSBjb250ZXh0IGluIHRoZSBnbG9iYWwKLSAgICAgICAgICAgICAgICAvLyB2YXJpYWJsZSBmb3IgdGhlIHRlc3QgCi0gICAgICAgICAgICAgICAgcmVzdG9yZWRNQyA9IG1zZ0NvbnRleHQyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleDIpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcodGl0bGUgKyAiZXJyb3Igd2l0aCByZXN0b3JpbmcgbWVzc2FnZSBjb250ZXh0ID0gWyIgKwotICAgICAgICAgICAgICAgICAgICAgICAgZXgyLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiA6ICIgKyBleDIuZ2V0TWVzc2FnZSgpICsgIl0iKTsKLSAgICAgICAgICAgICAgICBleDIucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICAgICAgcmVzdG9yZWRNZXNzYWdlQ29udGV4dCA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUocmVzdG9yZWRPayk7Ci0KLSAgICAgICAgICAgIC8vIGlmIHRoZSByZXN0b3JlIG9mIHRoZSBtZXNzYWdlIGNvbnRleHQgc3VjY2VlZGVkLAotICAgICAgICAgICAgLy8gdGhlbiBkb24ndCBrZWVwIHRoZSB0ZW1wb3JhcnkgZmlsZSBhcm91bmQKLSAgICAgICAgICAgIGJvb2xlYW4gcmVtb3ZlVG1wRmlsZSA9IHJlc3RvcmVkT2s7Ci0gICAgICAgICAgICBpZiAocmVtb3ZlVG1wRmlsZSkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHRoZUZpbGUuZGVsZXRlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAvLyBqdXN0IGFic29yYiBpdAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN0b3JlZE1DOwotICAgIH0KLQotCi0gICAgcHJpdmF0ZSBMaW5rZWRIYXNoTWFwIGdldE9iamVjdEdyYXBoSW5mbyhNZXNzYWdlQ29udGV4dCBtc2dDdHgpIHsKLSAgICAgICAgaWYgKG1zZ0N0eCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YU1DID0gbnVsbDsKLSAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhT0MgPSBudWxsOwotICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFTQyA9IG51bGw7Ci0gICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YVNHQyA9IG51bGw7Ci0gICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YUNDID0gbnVsbDsKLSAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhQU8gPSBudWxsOwotICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFBUyA9IG51bGw7Ci0gICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YUFTRyA9IG51bGw7Ci0gICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YUFDID0gbnVsbDsKLQotICAgICAgICBTdHJpbmcga2V5TUMgPSBudWxsOwotICAgICAgICBTdHJpbmcga2V5T0MgPSBudWxsOwotICAgICAgICBTdHJpbmcga2V5U0MgPSBudWxsOwotICAgICAgICBTdHJpbmcga2V5U0dDID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIGtleUNDID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIGtleUFPID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIGtleUFTID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIGtleUFTRyA9IG51bGw7Ci0gICAgICAgIFN0cmluZyBrZXlBQyA9IG51bGw7Ci0KLSAgICAgICAgTGlua2VkSGFzaE1hcCBvYmpJbmZvID0gbmV3IExpbmtlZEhhc2hNYXAoKTsKLQotICAgICAgICAvLyBnZXQgdGhlIGlkZW50aWZpY2F0aW9uIGluZm8gYWJvdXQgdGhlIHByaW1hcnkgb2JqZWN0cyBpbiB0aGUgb2JqZWN0IGdyYXBoCi0gICAgICAgIC8vICAgICBjbGFzcyBuYW1lCi0gICAgICAgIC8vICAgICBuYW1lIHN0cmluZwotICAgICAgICAvLyAgICAgaGFzaGNvZGUgc3RyaW5nCi0KLSAgICAgICAgLy8gbWVzc2FnZSBjb250ZXh0Ci0gICAgICAgIGtleU1DID0gbXNnQ3R4LmdldENsYXNzKCkuZ2V0TmFtZSgpOwotICAgICAgICBtZXRhTUMgPSBuZXcgTWV0YURhdGFFbnRyeShrZXlNQywgbXNnQ3R4LmdldE1lc3NhZ2VJRCgpLCAiWyIgKyBtc2dDdHguaGFzaENvZGUoKSArICJdIik7Ci0gICAgICAgIG9iakluZm8ucHV0KGtleU1DLCBtZXRhTUMpOwotCi0gICAgICAgIC8vIG9wZXJhdGlvbiBjb250ZXh0Ci0gICAgICAgIE9wZXJhdGlvbkNvbnRleHQgb2MgPSBtc2dDdHguZ2V0T3BlcmF0aW9uQ29udGV4dCgpOwotICAgICAgICBrZXlPQyA9IG9jLmdldENsYXNzKCkuZ2V0TmFtZSgpOwotICAgICAgICBtZXRhT0MgPSBuZXcgTWV0YURhdGFFbnRyeShrZXlPQywgb2MuZ2V0T3BlcmF0aW9uTmFtZSgpLCAiWyIgKyBvYy5oYXNoQ29kZSgpICsgIl0iKTsKLSAgICAgICAgb2JqSW5mby5wdXQoa2V5T0MsIG1ldGFPQyk7Ci0KLSAgICAgICAgLy8gc2VydmljZSBjb250ZXh0Ci0gICAgICAgIFNlcnZpY2VDb250ZXh0IHNjID0gbXNnQ3R4LmdldFNlcnZpY2VDb250ZXh0KCk7Ci0gICAgICAgIGtleVNDID0gc2MuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0gICAgICAgIG1ldGFTQyA9IG5ldyBNZXRhRGF0YUVudHJ5KGtleVNDLCBzYy5nZXROYW1lKCksICJbIiArIHNjLmhhc2hDb2RlKCkgKyAiXSIpOwotICAgICAgICBvYmpJbmZvLnB1dChrZXlTQywgbWV0YVNDKTsKLQotICAgICAgICAvLyBzZXJ2aWNlIGdyb3VwIGNvbnRleHQKLSAgICAgICAgU2VydmljZUdyb3VwQ29udGV4dCBzZ2MgPSBtc2dDdHguZ2V0U2VydmljZUdyb3VwQ29udGV4dCgpOwotICAgICAgICBrZXlTR0MgPSBzZ2MuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0gICAgICAgIG1ldGFTR0MgPSBuZXcgTWV0YURhdGFFbnRyeShrZXlTR0MsIHNnYy5nZXRJZCgpLCAiWyIgKyBzZ2MuaGFzaENvZGUoKSArICJdIik7Ci0gICAgICAgIG9iakluZm8ucHV0KGtleVNHQywgbWV0YVNHQyk7Ci0KLSAgICAgICAgLy8gY29uZmlndXJhdGlvbiBjb250ZXh0Ci0gICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNjID0gbXNnQ3R4LmdldENvbmZpZ3VyYXRpb25Db250ZXh0KCk7Ci0gICAgICAgIGtleUNDID0gY2MuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0gICAgICAgIG1ldGFDQyA9IG5ldyBNZXRhRGF0YUVudHJ5KGtleUNDLCBudWxsLCAiWyIgKyBjYy5oYXNoQ29kZSgpICsgIl0iKTsKLSAgICAgICAgb2JqSW5mby5wdXQoa2V5Q0MsIG1ldGFDQyk7Ci0KLSAgICAgICAgLy8gYXhpcyBvcGVyYXRpb24KLSAgICAgICAgQXhpc09wZXJhdGlvbiBhbyA9IG1zZ0N0eC5nZXRBeGlzT3BlcmF0aW9uKCk7Ci0gICAgICAgIGtleUFPID0gYW8uZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0gICAgICAgIG1ldGFBTyA9IG5ldyBNZXRhRGF0YUVudHJ5KGtleUFPLCBhby5nZXROYW1lKCkudG9TdHJpbmcoKSwgIlsiICsgYW8uaGFzaENvZGUoKSArICJdIik7Ci0gICAgICAgIG9iakluZm8ucHV0KGtleUFPLCBtZXRhQU8pOwotCi0gICAgICAgIC8vIGF4aXMgc2VydmljZQotICAgICAgICBBeGlzU2VydmljZSBhcyA9IG1zZ0N0eC5nZXRBeGlzU2VydmljZSgpOwotICAgICAgICBrZXlBUyA9IGFzLmdldENsYXNzKCkuZ2V0TmFtZSgpOwotICAgICAgICBtZXRhQVMgPSBuZXcgTWV0YURhdGFFbnRyeShrZXlBUywgYXMuZ2V0TmFtZSgpLCAiWyIgKyBhcy5oYXNoQ29kZSgpICsgIl0iKTsKLSAgICAgICAgb2JqSW5mby5wdXQoa2V5QVMsIG1ldGFBUyk7Ci0KLSAgICAgICAgLy8gYXhpcyBzZXJ2aWNlIGdyb3VwCi0gICAgICAgIEF4aXNTZXJ2aWNlR3JvdXAgYXNnID0gbXNnQ3R4LmdldEF4aXNTZXJ2aWNlR3JvdXAoKTsKLSAgICAgICAga2V5QVNHID0gYXNnLmdldENsYXNzKCkuZ2V0TmFtZSgpOwotICAgICAgICBtZXRhQVNHID0gbmV3IE1ldGFEYXRhRW50cnkoa2V5QVNHLCBhc2cuZ2V0U2VydmljZUdyb3VwTmFtZSgpLCAiWyIgKyBhc2cuaGFzaENvZGUoKSArICJdIik7Ci0gICAgICAgIG9iakluZm8ucHV0KGtleUFTRywgbWV0YUFTRyk7Ci0KLSAgICAgICAgLy8gYXhpcyBjb25maWd1cmF0aW9uCi0gICAgICAgIEF4aXNDb25maWd1cmF0aW9uIGFjID0gY2MuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKTsKLSAgICAgICAga2V5QUMgPSBhYy5nZXRDbGFzcygpLmdldE5hbWUoKTsKLSAgICAgICAgbWV0YUFDID0gbmV3IE1ldGFEYXRhRW50cnkoa2V5QUMsIG51bGwsICJbIiArIGFjLmhhc2hDb2RlKCkgKyAiXSIpOwotICAgICAgICBvYmpJbmZvLnB1dChrZXlBQywgbWV0YUFDKTsKLQotICAgICAgICByZXR1cm4gb2JqSW5mbzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb21wYXJlIHR3byBtYXBwaW5ncyBjb250YWluaW5nIG9iamVjdCBncmFwaCBpbmZvLgotICAgICAqIFRoaXMgdXNlcyB0aGUgY2xhc3MgbmFtZSBhbmQgb2JqZWN0IElELgotICAgICAqIDxwLz4KLSAgICAgKiBTdHJpY3QgY29tcGFyaXNvbiBpbmNsdWRlcyB0aGUgb2JqZWN0IGhhc2ggY29kZXMuIElmCi0gICAgICogeW91IGV4cGVjdCB0aGUgc2FtZSBvYmplY3QgdG8gYmUgcmVwcmVzZW50ZWQgaW4KLSAgICAgKiBib3RoIG1hcHMsIHlvdSBtYXkgd2FudCB0byB1c2UgU3RyaWN0IGNoZWNraW5nLgotICAgICAqIDxwLz4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtYXAxICAgVGhlIGZpcnN0IG9iamVjdCBncmFwaCBpbmZvIG1hcAotICAgICAqIEBwYXJhbSBtYXAyICAgVGhlIHNlY29uZCBvYmplY3QgZ3JhcGggaW5mbyBtYXAKLSAgICAgKiBAcGFyYW0gc3RyaWN0IFRSVUUgaWYgc3RyaWN0IGNvbXBhcmlzb24KLSAgICAgKiBAcmV0dXJuIE91dGNvbWUgb2YgdGhlIGNvbXBhcmlzb246IFRSVUUgaWYgZXF1aXZhbGVudCwgRkFMU0Ugb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGNvbXBhcmVPYmplY3RHcmFwaEluZm8oTGlua2VkSGFzaE1hcCBtYXAxLCBMaW5rZWRIYXNoTWFwIG1hcDIsIGJvb2xlYW4gc3RyaWN0KSB7Ci0gICAgICAgIFN0cmluZyB0aXRsZSA9ICJNZXNzYWdlQ29udGV4dFNhdmVDVGVzdDogY29tcGFyZU9iamVjdEdyYXBoSW5mbygpOiAiOwotCi0gICAgICAgIGlmICgobWFwMSAhPSBudWxsKSAmJiAobWFwMiAhPSBudWxsKSkgewotICAgICAgICAgICAgaWYgKG1hcDEuc2l6ZSgpICE9IG1hcDIuc2l6ZSgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKHRpdGxlICsgIk9iamVjdCBncmFwaCBpbmZvIG1hcHBpbmdzIGFyZSBkaWZmZXJlbnQgc2l6ZXMuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBJdGVyYXRvciBpdCA9IG1hcDEua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQotICAgICAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIC8vIHRoZSBrZXkgaXMgdGhlIGNsYXNzIG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBvYmplY3QKLSAgICAgICAgICAgICAgICBTdHJpbmcga2V5ID0gKFN0cmluZykgaXQubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgLy8gc2tpcCBjZXJ0YWluIG9iamVjdHMsIHRob3NlIHdpbGwgYWx3YXlzIGJlIHVuaXF1ZQotICAgICAgICAgICAgICAgIGlmICgoa2V5LmluZGV4T2YoIk1lc3NhZ2VDb250ZXh0IikgPT0gLTEpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAoa2V5LmluZGV4T2YoIk9wZXJhdGlvbkNvbnRleHQiKSA9PSAtMSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIChrZXkuaW5kZXhPZigiQ29uZmlndXJhdGlvbkNvbnRleHQiKSA9PSAtMSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIChrZXkuaW5kZXhPZigiQXhpc0NvbmZpZ3VyYXRpb24iKSA9PSAtMSkKLSAgICAgICAgICAgICAgICAgICAgICAgICkgewotICAgICAgICAgICAgICAgICAgICAvLyB0aGUgY2xhc3MgbmFtZXMgbGlzdGVkIGFib3ZlIHdlcmUgbm90IGZvdW5kCi0gICAgICAgICAgICAgICAgICAgIC8vIHNvIHdlJ3JlIGRlYWxpbmcgd2l0aCB0aGUgb3RoZXIgb2JqZWN0cwotICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IHZhbHVlMSA9IChNZXRhRGF0YUVudHJ5KSBtYXAxLmdldChrZXkpOwotICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IHZhbHVlMiA9IChNZXRhRGF0YUVudHJ5KSBtYXAyLmdldChrZXkpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICgodmFsdWUxICE9IG51bGwpICYmICh2YWx1ZTIgIT0gbnVsbCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIHRoZSBvYmplY3QgaWRlbnRpZmljYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lMSA9IHZhbHVlMS5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZTIgPSB2YWx1ZTIuZ2V0TmFtZSgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWUxICE9IG51bGwpICYmIChuYW1lMiAhPSBudWxsKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lMS5lcXVhbHMobmFtZTIpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArICJuYW1lMSBbIiArIG5hbWUxICsgIl0gICE9ICAgbmFtZTIgWyIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUyICsgIl0iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKG5hbWUxID09IG51bGwpICYmIChuYW1lMiA9PSBudWxsKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9rCi0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1pc21hdGNoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKHRpdGxlICsgIm5hbWUxIFsiICsgbmFtZTEgKyAiXSAgIT0gICBuYW1lMiBbIiArIG5hbWUyICsgIl0iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN0cmljdCB0ZXN0aW5nIG1lYW5zIGNoZWNraW5nIHRoZSBvYmplY3QgaGFzaGNvZGVzLgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXNlIHRoaXMgb3B0aW9uIHdoZW4geW91IGV4cGVjdCB0aGUgc2FtZQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2JqZWN0cyBpbiB0aGUgbWFwLgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmljdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjb2RlMSA9IHZhbHVlMS5nZXRFeHRyYU5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY29kZTIgPSB2YWx1ZTIuZ2V0RXh0cmFOYW1lKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGNvZGUxICE9IG51bGwpICYmIChjb2RlMiAhPSBudWxsKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZTEuZXF1YWxzKGNvZGUyKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKHRpdGxlICsgIm5hbWUgWyIgKyBuYW1lMSArICJdICBjb2RlMSBbIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUxICsgIl0gICE9ICAgY29kZTIgWyIgKyBjb2RlMiArICJdIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChjb2RlMSA9PSBudWxsKSAmJiAoY29kZTIgPT0gbnVsbCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2sKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtaXNtYXRjaAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcodGl0bGUgKyAibmFtZSBbIiArIG5hbWUxICsgIl1jb2RlMSBbIiArIGNvZGUxICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXSAgIT0gICBjb2RlMiBbIiArIGNvZGUyICsgIl0iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgodmFsdWUxID09IG51bGwpICYmICh2YWx1ZTIgPT0gbnVsbCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9rCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBtaXNtYXRjaAotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKHRpdGxlICsgInZhbHVlMSBbIiArIHZhbHVlMSArICJdICAhPSAgIHZhbHVlMiBbIiArIHZhbHVlMiArICJdIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAgIH0gZWxzZSBpZiAoKG1hcDEgPT0gbnVsbCkgJiYgKG1hcDIgPT0gbnVsbCkpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbG9nLmRlYnVnKHRpdGxlICsgIm1pc21hdGNoOiBvbmUgb3IgbW9yZSBvZiB0aGUgbWFwcyBhcmUgbnVsbC4gICIpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLQotICAgIHByaXZhdGUgdm9pZCBzaG93T2JqZWN0R3JhcGhJbmZvKExpbmtlZEhhc2hNYXAgbWFwKSB7Ci0gICAgICAgIGlmIChtYXAgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgSXRlcmF0b3IgaXQgPSBtYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQotICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbWV0YUNsYXNzTmFtZSA9IChTdHJpbmcpIGl0Lm5leHQoKTsKLSAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YSA9IChNZXRhRGF0YUVudHJ5KSBtYXAuZ2V0KG1ldGFDbGFzc05hbWUpOwotCi0gICAgICAgICAgICBpZiAobWV0YSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGNsYXNzbmFtZSA9IG1ldGEuZ2V0Q2xhc3NOYW1lKCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBtZXRhLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgaGFzaGNvZGUgPSBtZXRhLmdldEV4dHJhTmFtZSgpOwotCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJjbGFzc1siICsgY2xhc3NuYW1lICsgIl0gIGlkWyIgKyBuYW1lICsgIl0gIGhhc2hjb2RlIiArIGhhc2hjb2RlICsgIiAiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLSAgICB9Ci0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBjb21wYXJlTUNUYWJsZShPcGVyYXRpb25Db250ZXh0IG9jMSwgT3BlcmF0aW9uQ29udGV4dCBvYzIpIHsKLSAgICAgICAgU3RyaW5nIHRpdGxlID0gImNvbXBhcmVNQ1RhYmxlOiAiOwotCi0gICAgICAgIGlmICgob2MxICE9IG51bGwpICYmIChvYzIgIT0gbnVsbCkpIHsKLSAgICAgICAgICAgIEhhc2hNYXAgbWNUYWJsZTEgPSBvYzEuZ2V0TWVzc2FnZUNvbnRleHRzKCk7Ci0gICAgICAgICAgICBIYXNoTWFwIG1jVGFibGUyID0gb2MyLmdldE1lc3NhZ2VDb250ZXh0cygpOwotCi0gICAgICAgICAgICBpZiAoKG1jVGFibGUxICE9IG51bGwpICYmIChtY1RhYmxlMiAhPSBudWxsKSkgewotICAgICAgICAgICAgICAgIGlmICgoIW1jVGFibGUxLmlzRW1wdHkoKSkgJiYgKCFtY1RhYmxlMi5pc0VtcHR5KCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBzaXplMSA9IG1jVGFibGUxLnNpemUoKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IHNpemUyID0gbWNUYWJsZTIuc2l6ZSgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChzaXplMSAhPSBzaXplMikgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKHRpdGxlICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBSZXR1cm4gRkFMU0U6ICB0YWJsZSBzaXplcyBkb24ndCBtYXRjaCAgIHNpemUxWyIgKyBzaXplMSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJdICE9IHNpemUyIFsiICsgc2l6ZTIgKyAiXSAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGl0MSA9IG1jVGFibGUxLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGl0MS5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBrZXkxID0gKFN0cmluZykgaXQxLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VDb250ZXh0IG1jMSA9IChNZXNzYWdlQ29udGV4dCkgbWNUYWJsZTEuZ2V0KGtleTEpOwotICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUNvbnRleHQgbWMyID0gKE1lc3NhZ2VDb250ZXh0KSBtY1RhYmxlMi5nZXQoa2V5MSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgobWMxICE9IG51bGwpICYmIChtYzIgIT0gbnVsbCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayB0aGUgSURzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGlkMSA9IG1jMS5nZXRNZXNzYWdlSUQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaWQyID0gbWMyLmdldE1lc3NhZ2VJRCgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChpZDEgIT0gbnVsbCkgJiYgKGlkMiAhPSBudWxsKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlkMS5lcXVhbHMoaWQyKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKHRpdGxlICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBSZXR1cm4gRkFMU0U6ICBtZXNzYWdlIElEcyBkb24ndCBtYXRjaCAgIGlkMVsiICsgaWQxICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl0gIT0gaWQyIFsiICsgaWQyICsgIl0gIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChpZDEgPT0gbnVsbCkgJiYgKGlkMiA9PSBudWxsKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjYW4ndCB0ZWxsLCBrZWVwIGdvaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWlzbWF0Y2gKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKHRpdGxlICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIFJldHVybiBGQUxTRTogIG1lc3NhZ2UgSURzIGRvbid0IG1hdGNoICAgaWQxWyIgKyBpZDEgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJdICE9IGlkMiBbIiArIGlkMiArICJdICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChtYzEgPT0gbnVsbCkgJiYgKG1jMiA9PSBudWxsKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVudHJpZXMgbWF0Y2gKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWlzbWF0Y2gKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSArICIgUmV0dXJuIEZBTFNFOiAgbWVzc2FnZSBjb250ZXh0IG9iamVjdHMgZG9uJ3QgbWF0Y2ggIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKHRpdGxlICsgIiBSZXR1cm4gVFJVRTogIG1lc3NhZ2UgY29udGV4dCB0YWJsZXMgbWF0Y2giKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1jVGFibGUxLmlzRW1wdHkoKSAmJiBtY1RhYmxlMi5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKHRpdGxlICsgIiBSZXR1cm4gVFJVRTogIG1lc3NhZ2UgY29udGV4dCB0YWJsZXMgYXJlIGJvdGggZW1wdHkgIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArICIgUmV0dXJuIEZBTFNFOiAgbWVzc2FnZSBjb250ZXh0IHRhYmxlcyBtaXNtYXRjaCIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmICgobWNUYWJsZTEgPT0gbnVsbCkgJiYgKG1jVGFibGUyID09IG51bGwpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKHRpdGxlICsgIiBSZXR1cm4gVFJVRTogIG1lc3NhZ2UgY29udGV4dCB0YWJsZXMgYXJlIG51bGwiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKHRpdGxlICsgIiBSZXR1cm4gRkFMU0U6ICBtZXNzYWdlIGNvbnRleHQgdGFibGVzIGRvbid0IG1hdGNoIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKChvYzEgPT0gbnVsbCkgJiYgKG9jMiA9PSBudWxsKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKHRpdGxlICsgIiBSZXR1cm4gVFJVRTogIG9wZXJhdGlvbiBjb250ZXh0IG9iamVjdHMgYXJlIG51bGwgIik7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArICIgUmV0dXJuIEZBTFNFOiAgb3BlcmF0aW9uIGNvbnRleHQgb2JqZWN0cyBkb24ndCBtYXRjaCAiKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0KLSAgICB9Ci0KLQotICAgIHByaXZhdGUgdm9pZCBzaG93TUNUYWJsZShPcGVyYXRpb25Db250ZXh0IG9jKSB7Ci0gICAgICAgIGlmIChvYyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBIYXNoTWFwIG1jVGFibGUgPSBvYy5nZXRNZXNzYWdlQ29udGV4dHMoKTsKLQotICAgICAgICBpZiAoKG1jVGFibGUgPT0gbnVsbCkgfHwgKG1jVGFibGUuaXNFbXB0eSgpKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgSXRlcmF0b3IgaXQgPSBtY1RhYmxlLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0KLSAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgU3RyaW5nIGtleSA9IChTdHJpbmcpIGl0Lm5leHQoKTsKLSAgICAgICAgICAgIE1lc3NhZ2VDb250ZXh0IG1jID0gKE1lc3NhZ2VDb250ZXh0KSBtY1RhYmxlLmdldChrZXkpOwotCi0gICAgICAgICAgICBpZiAobWMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFN0cmluZyBpZCA9IG1jLmdldE1lc3NhZ2VJRCgpOwotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygibWVzc2FnZSBjb250ZXh0IHRhYmxlIGVudHJ5OiAgIGxhYmVsIFsiICsga2V5ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJdICAgIG1lc3NhZ2UgSUQgWyIgKyBpZCArICJdICAgICIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgaGFuZGxlciBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbyBUaGUgaGFuZGxlciBvYmplY3QKLSAgICAgKiBAcmV0dXJuIFRoZSBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIGhhbmRsZXIsCi0gICAgICogICAgICAgICAtMSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwcml2YXRlIGludCBnZXRIYW5kbGVySUQoT2JqZWN0IG8pIHsKLSAgICAgICAgaW50IGlkID0gLTE7Ci0KLSAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBUZW1wSGFuZGxlcikgewotICAgICAgICAgICAgaWQgPSAoKFRlbXBIYW5kbGVyKSBvKS5nZXRIYW5kbGVySUQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBpZDsKLSAgICB9Ci0KLSAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAvLyBIYW5kbGVyIGNsYXNzZXMgCi0gICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgICAvKioKLSAgICAgKiBQYXVzZXMgYW5kIHNhdmVzIHRoZSBtZXNzYWdlIGNvbnRleHQgdGhlIG1lc3NhZ2UgY29udGV4dAotICAgICAqLwotICAgIHB1YmxpYyBjbGFzcyBTYXZlSGFuZGxlciBleHRlbmRzIEFic3RyYWN0SGFuZGxlciB7Ci0gICAgICAgIHByaXZhdGUgSW50ZWdlciBoYW5kbGVySUQgPSBudWxsOwotCi0gICAgICAgIHByaXZhdGUgRmlsZSB0aGVGaWxlID0gbnVsbDsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgdGhlRmlsZW5hbWUgPSBudWxsOwotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBwZXJmb3JtU2F2ZSA9IHRydWU7Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIHNhdmVkT2sgPSBmYWxzZTsKLQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIGNvbnN0cnVjdG9ycwotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgcHVibGljIFNhdmVIYW5kbGVyKCkgewotICAgICAgICAgICAgdGhpcy5oYW5kbGVySUQgPSBuZXcgSW50ZWdlcigtNSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU2F2ZUhhbmRsZXIoaW50IGluZGV4LCBGaWxlIHNhdmVGaWxlLCBib29sZWFuIGRvSXQpIHsKLSAgICAgICAgICAgIHRoaXMuaGFuZGxlcklEID0gbmV3IEludGVnZXIoaW5kZXgpOwotICAgICAgICAgICAgaW5pdChuZXcgSGFuZGxlckRlc2NyaXB0aW9uKG5ldyBTdHJpbmcoImhhbmRsZXIiICsgaW5kZXgpKSk7Ci0gICAgICAgICAgICB0aGVGaWxlID0gc2F2ZUZpbGU7Ci0gICAgICAgICAgICBwZXJmb3JtU2F2ZSA9IGRvSXQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIG1ldGhvZHMKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0SGFuZGxlcklEKCkgewotICAgICAgICAgICAgaWYgKGhhbmRsZXJJRCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZXJJRC5pbnRWYWx1ZSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gLTU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgSW52b2NhdGlvblJlc3BvbnNlIGludm9rZShNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgICAgIFN0cmluZyB0aXRsZSA9ICJTYXZlSGFuZGxlclsiICsgZ2V0SGFuZGxlcklEKCkgKyAiXTppbnZva2UoKTogIjsKLSAgICAgICAgICAgIHNhdmVkT2sgPSBmYWxzZTsKLQotICAgICAgICAgICAgaWYgKHBlcmZvcm1TYXZlID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKHRpdGxlICsgIkNvbmZpZ3VyZWQgZm9yIG5vIGFjdGlvbiB0byBiZSBwZXJmb3JtZWQuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEludm9jYXRpb25SZXNwb25zZS5DT05USU5VRTsKLSAgICAgICAgICAgIH0KLQotCi0gICAgICAgICAgICBsb2cuZGVidWcodGl0bGUgKyAibXNnQ29udGV4dC5wYXVzZSgpIik7Ci0gICAgICAgICAgICBtc2dDb250ZXh0LnBhdXNlKCk7Ci0KLSAgICAgICAgICAgIGlmICh0aGVGaWxlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcodGl0bGUgKyAiUmVzZXR0aW5nIHRoZSBmaWxlIHRvIHVzZS4iKTsKLSAgICAgICAgICAgICAgICAgICAgdGhlRmlsZS5kZWxldGUoKTsKLSAgICAgICAgICAgICAgICAgICAgdGhlRmlsZS5jcmVhdGVOZXdGaWxlKCk7Ci0gICAgICAgICAgICAgICAgICAgIHRoZUZpbGVuYW1lID0gdGhlRmlsZS5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArICJ0ZW1wIGZpbGUgPSBbIiArIHRoZUZpbGVuYW1lICsgIl0iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcodGl0bGUgKyAiZXJyb3IgY3JlYXRpbmcgbmV3IGZpbGUgPSBbIiArIGV4LmdldE1lc3NhZ2UoKSArICJdIik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHRoZUZpbGUuZXhpc3RzKCkgPT0gdHJ1ZSkgewotICAgICAgICAgICAgICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgICAgICAgICAgICAgLy8gc2F2ZSB0byB0aGUgdGVtcG9yYXJ5IGZpbGUKLSAgICAgICAgICAgICAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXR1cCBhbiBvdXRwdXQgc3RyZWFtIHRvIGEgcGh5c2ljYWwgZmlsZQotICAgICAgICAgICAgICAgICAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBvdXRTdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbSh0aGVGaWxlKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXR0YWNoIGEgc3RyZWFtIGNhcGFibGUgb2Ygd3JpdGluZyBvYmplY3RzIHRvIHRoZSAKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0cmVhbSBjb25uZWN0ZWQgdG8gdGhlIGZpbGUKLSAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdE91dHB1dFN0cmVhbSBvdXRPYmpTdHJlYW0gPSBuZXcgT2JqZWN0T3V0cHV0U3RyZWFtKG91dFN0cmVhbSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRyeSB0byBzYXZlIHRoZSBtZXNzYWdlIGNvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArICJzYXZpbmcgbWVzc2FnZSBjb250ZXh0Li4uLi4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVkT2sgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dE9ialN0cmVhbS53cml0ZU9iamVjdChtc2dDb250ZXh0KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2xvc2Ugb3V0IHRoZSBzdHJlYW1zCi0gICAgICAgICAgICAgICAgICAgICAgICBvdXRPYmpTdHJlYW0uZmx1c2goKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dE9ialN0cmVhbS5jbG9zZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgb3V0U3RyZWFtLmZsdXNoKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXRTdHJlYW0uY2xvc2UoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZWRPayA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcodGl0bGUgKyAiLi4uLnNhdmVkIG1lc3NhZ2UgY29udGV4dC4uLi4uIik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgZmlsZXNpemUgPSB0aGVGaWxlLmxlbmd0aCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKHRpdGxlICsgImZpbGUgc2l6ZSBhZnRlciBzYXZlIFsiICsgZmlsZXNpemUgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXSAgIHRlbXAgZmlsZSA9IFsiICsgdGhlRmlsZW5hbWUgKyAiXSIpOwotCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleDIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArICJlcnJvciB3aXRoIHNhdmluZyBtZXNzYWdlIGNvbnRleHQgPSBbIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Mi5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgOiAiICsgZXgyLmdldE1lc3NhZ2UoKSArICJdIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBleDIucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKHNhdmVkT2spOwotCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBsb2cuZGVidWcodGl0bGUgKyAiZXhlY3V0ZWRIYW5kbGVycy5hZGQoIiArIGhhbmRsZXJJRCArICIpIik7Ci0gICAgICAgICAgICBleGVjdXRlZEhhbmRsZXJzLmFkZChoYW5kbGVySUQpOwotCi0gICAgICAgICAgICByZXR1cm4gSW52b2NhdGlvblJlc3BvbnNlLlNVU1BFTkQ7Ci0KLSAgICAgICAgfQotCi0gICAgfQotCi0KLSAgICBwdWJsaWMgY2xhc3MgVGVtcEhhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIgewotICAgICAgICBwcml2YXRlIEludGVnZXIgaGFuZGxlcklEID0gbnVsbDsKLSAgICAgICAgcHJpdmF0ZSBpbnQgY291bnQgPSAwOwotICAgICAgICBwcml2YXRlIGludCBudW1iZXJQcm9wZXJ0aWVzID0gMzsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHlLZXkgPSAiUHJvcGVydHkiOwotICAgICAgICBwcml2YXRlIFN0cmluZyBwcm9wZXJ0eVZhbHVlID0gIlNlcnZpY2VMZXZlbFNldHRpbmciOwotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gY29uc3RydWN0b3JzCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICBwdWJsaWMgVGVtcEhhbmRsZXIoKSB7Ci0gICAgICAgICAgICB0aGlzLmhhbmRsZXJJRCA9IG5ldyBJbnRlZ2VyKC01KTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBUZW1wSGFuZGxlcihpbnQgaW5kZXgpIHsKLSAgICAgICAgICAgIHRoaXMuaGFuZGxlcklEID0gbmV3IEludGVnZXIoaW5kZXgpOwotICAgICAgICAgICAgaW5pdChuZXcgSGFuZGxlckRlc2NyaXB0aW9uKG5ldyBTdHJpbmcoImhhbmRsZXIiICsgaW5kZXgpKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgVGVtcEhhbmRsZXIoaW50IGluZGV4LCBpbnQgbnVtYmVyKSB7Ci0gICAgICAgICAgICB0aGlzLmhhbmRsZXJJRCA9IG5ldyBJbnRlZ2VyKGluZGV4KTsKLSAgICAgICAgICAgIGluaXQobmV3IEhhbmRsZXJEZXNjcmlwdGlvbihuZXcgU3RyaW5nKCJoYW5kbGVyIiArIGluZGV4KSkpOwotICAgICAgICAgICAgbnVtYmVyUHJvcGVydGllcyA9IG51bWJlcjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gbWV0aG9kcwotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgcHVibGljIGludCBnZXRIYW5kbGVySUQoKSB7Ci0gICAgICAgICAgICBpZiAoaGFuZGxlcklEICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlcklELmludFZhbHVlKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiAtNTsKLSAgICAgICAgfQotCi0KLSAgICAgICAgcHVibGljIEludm9jYXRpb25SZXNwb25zZSBpbnZva2UoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgICAgICBTdHJpbmcgdGl0bGUgPSAiVGVtcEhhbmRsZXJbIiArIGdldEhhbmRsZXJJRCgpICsgIl06aW52b2tlKCk6ICI7Ci0KLSAgICAgICAgICAgIC8vIGdldCB0aGUgc2VydmljZSBjb250ZXh0IGZyb20gdGhlIG1lc3NhZ2UgY29udGV4dAotICAgICAgICAgICAgU2VydmljZUNvbnRleHQgc2VydmljZUNvbnRleHQgPSBtc2dDb250ZXh0LmdldFNlcnZpY2VDb250ZXh0KCk7Ci0KLSAgICAgICAgICAgIGlmIChzZXJ2aWNlQ29udGV4dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBzZXJ2aWNlIGNvbnRleHQgZnJvbSB0aGUgb3BlcmF0aW9uIGNvbnRleHQKLSAgICAgICAgICAgICAgICBPcGVyYXRpb25Db250ZXh0IG9wZXJhdGlvbkNvbnRleHQgPSBtc2dDb250ZXh0LmdldE9wZXJhdGlvbkNvbnRleHQoKTsKLSAgICAgICAgICAgICAgICBzZXJ2aWNlQ29udGV4dCA9IG9wZXJhdGlvbkNvbnRleHQuZ2V0U2VydmljZUNvbnRleHQoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHNlcnZpY2VDb250ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG51bWJlclByb3BlcnRpZXM7IGorKykgewotICAgICAgICAgICAgICAgICAgICBjb3VudCsrOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcga2V5ID0gbmV3IFN0cmluZyhwcm9wZXJ0eUtleSArICIuSURbIiArIGdldEhhbmRsZXJJRCgpICsgIl0uIiArIGNvdW50KTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gbmV3IFN0cmluZyhwcm9wZXJ0eVZhbHVlICsgIlsiICsgY291bnQgKyAiXSIpOwotICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlQ29udGV4dC5zZXRQcm9wZXJ0eShrZXksIHZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArICJleGVjdXRlZEhhbmRsZXJzLmFkZCgiICsgaGFuZGxlcklEICsgIikiKTsKLSAgICAgICAgICAgIGV4ZWN1dGVkSGFuZGxlcnMuYWRkKGhhbmRsZXJJRCk7Ci0KLSAgICAgICAgICAgIHJldHVybiBJbnZvY2F0aW9uUmVzcG9uc2UuQ09OVElOVUU7Ci0gICAgICAgIH0KLQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9NZXNzYWdlQ29udGV4dFNlbGZNYW5hZ2VkRGF0YVRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvTWVzc2FnZUNvbnRleHRTZWxmTWFuYWdlZERhdGFUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhODlmMDMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9NZXNzYWdlQ29udGV4dFNlbGZNYW5hZ2VkRGF0YVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NzAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5VVUlER2VuZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuT3BlcmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuU2VsZk1hbmFnZWREYXRhTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuU2VydmljZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LlNlcnZpY2VHcm91cENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZUdyb3VwOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uSW5PdXRBeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uVHJhbnNwb3J0SW5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlRyYW5zcG9ydE91dERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaGFuZGxlcnMuQWJzdHJhY3RIYW5kbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLlJhd1hNTElOT25seU1lc3NhZ2VSZWNlaXZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5SYXdYTUxJTk91dE1lc3NhZ2VSZWNlaXZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkNvbW1vbnNIVFRQVHJhbnNwb3J0U2VuZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuU2ltcGxlSFRUUFNlcnZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGNsYXNzIE1lc3NhZ2VDb250ZXh0U2VsZk1hbmFnZWREYXRhVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhNZXNzYWdlQ29udGV4dFNlbGZNYW5hZ2VkRGF0YVRlc3QuY2xhc3MpOwotICAgIAotICAgIHByaXZhdGUgRmlsZSB0aGVGaWxlID0gbnVsbDsKLSAgICBib29sZWFuIHNhdmVkTWVzc2FnZUNvbnRleHQgPSBmYWxzZTsKLSAgICBib29sZWFuIHJlc3RvcmVkTWVzc2FnZUNvbnRleHQgPSBmYWxzZTsKLQotICAgIHByaXZhdGUgU3RyaW5nIHNlcnZpY2VHcm91cE5hbWUgPSBuZXcgU3RyaW5nKCJOdWxsU2VydmljZUdyb3VwIik7Ci0gICAgcHJpdmF0ZSBRTmFtZSBzZXJ2aWNlTmFtZSA9IG5ldyBRTmFtZSgiTnVsbFNlcnZpY2UiKTsKLSAgICBwcml2YXRlIFFOYW1lIG9wZXJhdGlvbk5hbWUgPSBuZXcgUU5hbWUoIkR1bW15T3AiKTsKLQotICAgIHByaXZhdGUgQ29uZmlndXJhdGlvbkNvbnRleHQgY2ZnQ29udGV4dCA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTZXJ2aWNlR3JvdXBDb250ZXh0IHNlcnZpY2VHcm91cENvbnRleHQgPSBudWxsOwotICAgIHByaXZhdGUgU2VydmljZUNvbnRleHQgc2VydmljZUNvbnRleHQgPSBudWxsOwotICAgIHByaXZhdGUgT3BlcmF0aW9uQ29udGV4dCBvcGVyYXRpb25Db250ZXh0ID0gbnVsbDsKLQotICAgIHByaXZhdGUgQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZ3VyYXRpb24gPSBudWxsOwotICAgIHByaXZhdGUgQXhpc1NlcnZpY2VHcm91cCBheGlzU2VydmljZUdyb3VwID0gbnVsbDsKLSAgICBwcml2YXRlIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlID0gbnVsbDsKLSAgICBwcml2YXRlIEF4aXNPcGVyYXRpb24gYXhpc09wZXJhdGlvbiA9IG51bGw7Ci0KLSAgICBwcml2YXRlIFRyYW5zcG9ydE91dERlc2NyaXB0aW9uIHRyYW5zcG9ydE91dCA9IG51bGw7Ci0gICAgcHJpdmF0ZSBUcmFuc3BvcnRPdXREZXNjcmlwdGlvbiB0cmFuc3BvcnRPdXQyID0gbnVsbDsKLSAgICBwcml2YXRlIFRyYW5zcG9ydE91dERlc2NyaXB0aW9uIHRyYW5zcG9ydE91dDMgPSBudWxsOwotICAgIHByaXZhdGUgVHJhbnNwb3J0SW5EZXNjcmlwdGlvbiB0cmFuc3BvcnRJbiA9IG51bGw7Ci0gICAgcHJpdmF0ZSBUcmFuc3BvcnRJbkRlc2NyaXB0aW9uIHRyYW5zcG9ydEluMiA9IG51bGw7Ci0gICAgcHJpdmF0ZSBUcmFuc3BvcnRJbkRlc2NyaXB0aW9uIHRyYW5zcG9ydEluMyA9IG51bGw7Ci0KLSAgICBwcml2YXRlIE1lc3NhZ2VDb250ZXh0IG1jID0gbnVsbDsKLQotICAgIHByaXZhdGUgVGVtcEhhbmRsZXIwMSBoYW5kbGVyMDE7Ci0gICAgcHJpdmF0ZSBUZW1wSGFuZGxlcjAyIGhhbmRsZXIwMjsKLSAgICBwcml2YXRlIFRlbXBIYW5kbGVyMDIgc3ViaGFuZGxlcjsgIC8vIHRoaXMgaGFuZGxlciBpcyBpbnRlbmRlZCB0byBiZSBhIGZldyBsZXZlbHMgZG93biBpbiBleGVjdXRpb25DaGFpbgotICAgIHByaXZhdGUgVGVtcEhhbmRsZXIwMyBoYW5kbGVyMDM7Ci0gICAgcHJpdmF0ZSBUZW1wSGFuZGxlcjA0IGhhbmRsZXIwNDsKLSAgICBwcml2YXRlIFBoYXNlIHBoYXNlMTsKLSAgICBwcml2YXRlIFBoYXNlIHBoYXNlMjsKLSAgICBwcml2YXRlIFBoYXNlIHBoYXNlMzsKLSAgICBwcml2YXRlIFBoYXNlIHN1YlBoYXNlOwotCi0gICAgLy8gdXNlIHRoaXMgdG8gY291bnQgaG93IG1hbnkgdGltZXMgbWV0aG9kcyBnZXQgY2FsbGVkIGZvciBhIHBhcnRpY3VsYXIgdGVzdAotICAgIHByaXZhdGUgaW50IGludm9rZWNhbGxjb3VudCA9IDA7Ci0KLSAgICAvLyBrZXktdmFsdWUgcGFpcnMgdG8gYmUgdXNlZCBmb3Igc2VsZiBtYW5hZ2VkIGRhdGEKLQotICAgIHByaXZhdGUgU3RyaW5nIGtleTAxID0gImtleTAxIjsKLSAgICBwcml2YXRlIFN0cmluZyB0ZXN0RGF0YTAxID0gIlRlbXBIYW5kbGVyMDFfMDEiOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcga2V5MDIgPSAia2V5MDIiOwotICAgIHByaXZhdGUgU3RyaW5nIHRlc3REYXRhMDIgPSAiVGVtcEhhbmRsZXIwMV8wMiI7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBrZXkwMyA9ICJrZXkwMyI7Ci0gICAgcHJpdmF0ZSBieXRlIFtdIHRlc3REYXRhMDMgPSB7MHgxQSwgMHgxQiwgMHgxQywgMHgxRCwgMHgxRSwgMHgxQiwgMHgxQywgMHgxRCwgMHgxRSwgMHgxRiwgMHgwMSwKLSAgICAgICAgICAgIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIDB4MDgsIDB4MDksIDB4MEEsIDB4MEIsIDB4MEMsIDB4MEQsIDB4MEUsIDB4MEZ9OwotCi0gICAgcHJpdmF0ZSBTdHJpbmcga2V5MDQgPSAia2V5MDQiOwotICAgIHByaXZhdGUgbG9uZyBbXSB0ZXN0RGF0YTA0ID0gezBMLCAxTCwgLTY2MDE2NjQyMDA2NzMwNjM1MzFMLCAtNzc1MzYzNzA4ODI1NzM5MTg1OEx9OwotCi0gICAgcHJpdmF0ZSBTdHJpbmcga2V5MDUgPSAia2V5MDUiOwotICAgIHByaXZhdGUgaW50IHRlc3REYXRhMDUgPSAxMjM0NTY7Ci0KLQotICAgIHB1YmxpYyBNZXNzYWdlQ29udGV4dFNlbGZNYW5hZ2VkRGF0YVRlc3QoU3RyaW5nIGFyZzApIHsKLSAgICAgICAgc3VwZXIoYXJnMCk7Ci0gICAgICAgIGluaXRBbGwoKTsKLSAgICB9Ci0KLQotICAgIHByb3RlY3RlZCB2b2lkIGluaXRBbGwoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBwcmVwYXJlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoCi0gICAgICAgICAgICAgICAgICAgICJNZXNzYWdlQ29udGV4dFNlbGZNYW5hZ2VkRGF0YVRlc3Q6aW5pdEFsbDogIGVycm9yIGluIHNldHRpbmcgdXAgb2JqZWN0IGdyYXBoIFsiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiA6ICIgKyBlLmdldE1lc3NhZ2UoKSArICJdIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaGFuZGxlcjAxID09IG51bGwpIHsKLSAgICAgICAgICAgIGhhbmRsZXIwMSA9IG5ldyBUZW1wSGFuZGxlcjAxKDEwMSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaGFuZGxlcjAyID09IG51bGwpIHsKLSAgICAgICAgICAgIGhhbmRsZXIwMiA9IG5ldyBUZW1wSGFuZGxlcjAyKDEwMik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaGFuZGxlcjAzID09IG51bGwpIHsKLSAgICAgICAgICAgIGhhbmRsZXIwMyA9IG5ldyBUZW1wSGFuZGxlcjAzKDEwMyk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaGFuZGxlcjA0ID09IG51bGwpIHsKLSAgICAgICAgICAgIGhhbmRsZXIwNCA9IG5ldyBUZW1wSGFuZGxlcjA0KDEwNCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc3ViaGFuZGxlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBzdWJoYW5kbGVyID0gbmV3IFRlbXBIYW5kbGVyMDIoMTAwMCk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotCi0gICAgLy8KLSAgICAvLyBwcmVwYXJlIHRoZSBvYmplY3QgaGllcmFyY2h5IGZvciB0ZXN0aW5nCi0gICAgLy8KLSAgICBwcml2YXRlIHZvaWQgcHJlcGFyZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgYXhpc0NvbmZpZ3VyYXRpb24gPSBuZXcgQXhpc0NvbmZpZ3VyYXRpb24oKTsKLQotICAgICAgICBjZmdDb250ZXh0ID0gbmV3IENvbmZpZ3VyYXRpb25Db250ZXh0KGF4aXNDb25maWd1cmF0aW9uKTsKLQotICAgICAgICBjZmdDb250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCkuYWRkTWVzc2FnZVJlY2VpdmVyKAotICAgICAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaW4tb25seSIsIG5ldyBSYXdYTUxJTk9ubHlNZXNzYWdlUmVjZWl2ZXIoKSk7Ci0gICAgICAgIGNmZ0NvbnRleHQuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5hZGRNZXNzYWdlUmVjZWl2ZXIoCi0gICAgICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgvd3NkbC9pbi1vdXQiLCBuZXcgUmF3WE1MSU5PdXRNZXNzYWdlUmVjZWl2ZXIoKSk7Ci0KLSAgICAgICAgRGlzcGF0Y2hQaGFzZSBkaXNwYXRjaFBoYXNlID0gbmV3IERpc3BhdGNoUGhhc2UoKTsKLSAgICAgICAgZGlzcGF0Y2hQaGFzZS5zZXROYW1lKCJEaXNwYXRjaCIpOwotCi0gICAgICAgIEFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIgYWJkID0gbmV3IEFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIoKTsKLSAgICAgICAgYWJkLmluaXREaXNwYXRjaGVyKCk7Ci0KLSAgICAgICAgUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciBydWQgPSBuZXcgUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlcigpOwotICAgICAgICBydWQuaW5pdERpc3BhdGNoZXIoKTsKLQotICAgICAgICBTT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIHNhYmQgPSBuZXcgU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlcigpOwotICAgICAgICBzYWJkLmluaXREaXNwYXRjaGVyKCk7Ci0KLSAgICAgICAgU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIHNtYmQgPSBuZXcgU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyKCk7Ci0gICAgICAgIHNtYmQuaW5pdERpc3BhdGNoZXIoKTsKLQotICAgICAgICBkaXNwYXRjaFBoYXNlLmFkZEhhbmRsZXIoYWJkKTsKLSAgICAgICAgZGlzcGF0Y2hQaGFzZS5hZGRIYW5kbGVyKHJ1ZCk7Ci0gICAgICAgIGRpc3BhdGNoUGhhc2UuYWRkSGFuZGxlcihzYWJkKTsKLSAgICAgICAgZGlzcGF0Y2hQaGFzZS5hZGRIYW5kbGVyKHNtYmQpOwotCi0gICAgICAgIGNmZ0NvbnRleHQuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5nZXRJbkZsb3dQaGFzZXMoKS5hZGQoZGlzcGF0Y2hQaGFzZSk7Ci0KLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgIGF4aXNTZXJ2aWNlR3JvdXAgPSBuZXcgQXhpc1NlcnZpY2VHcm91cChheGlzQ29uZmlndXJhdGlvbik7Ci0gICAgICAgIGF4aXNTZXJ2aWNlR3JvdXAuc2V0U2VydmljZUdyb3VwTmFtZSgiU2VydmljZUdyb3VwVGVzdCIpOwotCi0KLSAgICAgICAgYXhpc1NlcnZpY2UgPSBuZXcgQXhpc1NlcnZpY2Uoc2VydmljZU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICBheGlzU2VydmljZUdyb3VwLmFkZFNlcnZpY2UoYXhpc1NlcnZpY2UpOwotCi0KLSAgICAgICAgYXhpc09wZXJhdGlvbiA9IG5ldyBJbk91dEF4aXNPcGVyYXRpb24ob3BlcmF0aW9uTmFtZSk7Ci0gICAgICAgIGF4aXNPcGVyYXRpb24uc2V0TWVzc2FnZVJlY2VpdmVyKG5ldyBNZXNzYWdlUmVjZWl2ZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCByZWNlaXZlKE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDdHgpIHsKLQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBheGlzU2VydmljZS5hZGRPcGVyYXRpb24oYXhpc09wZXJhdGlvbik7Ci0gICAgICAgIGF4aXNTZXJ2aWNlLm1hcEFjdGlvblRvT3BlcmF0aW9uKG9wZXJhdGlvbk5hbWUuZ2V0TG9jYWxQYXJ0KCksIGF4aXNPcGVyYXRpb24pOwotCi0KLSAgICAgICAgY2ZnQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpLmFkZFNlcnZpY2UoYXhpc1NlcnZpY2UpOwotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICBzZXJ2aWNlR3JvdXBDb250ZXh0ID0KLSAgICAgICAgICAgICAgICBjZmdDb250ZXh0LmNyZWF0ZVNlcnZpY2VHcm91cENvbnRleHQoYXhpc1NlcnZpY2UuZ2V0QXhpc1NlcnZpY2VHcm91cCgpKTsKLSAgICAgICAgc2VydmljZUdyb3VwQ29udGV4dC5zZXRJZCgiU2VydmljZUdyb3VwQ29udGV4dFRlc3QiKTsKLQotICAgICAgICBzZXJ2aWNlQ29udGV4dCA9IHNlcnZpY2VHcm91cENvbnRleHQuZ2V0U2VydmljZUNvbnRleHQoYXhpc1NlcnZpY2UpOwotCi0gICAgICAgIG9wZXJhdGlvbkNvbnRleHQgPSBzZXJ2aWNlQ29udGV4dC5jcmVhdGVPcGVyYXRpb25Db250ZXh0KG9wZXJhdGlvbk5hbWUpOwotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICB0cmFuc3BvcnRPdXQgPSBuZXcgVHJhbnNwb3J0T3V0RGVzY3JpcHRpb24oIm51bGwiKTsKLSAgICAgICAgdHJhbnNwb3J0T3V0MiA9IG5ldyBUcmFuc3BvcnRPdXREZXNjcmlwdGlvbigiaGFwcHkiKTsKLSAgICAgICAgdHJhbnNwb3J0T3V0MyA9IG5ldyBUcmFuc3BvcnRPdXREZXNjcmlwdGlvbigiZ29sdWNreSIpOwotICAgICAgICB0cmFuc3BvcnRPdXQuc2V0U2VuZGVyKG5ldyBDb21tb25zSFRUUFRyYW5zcG9ydFNlbmRlcigpKTsKLSAgICAgICAgdHJhbnNwb3J0T3V0Mi5zZXRTZW5kZXIobmV3IENvbW1vbnNIVFRQVHJhbnNwb3J0U2VuZGVyKCkpOwotICAgICAgICB0cmFuc3BvcnRPdXQzLnNldFNlbmRlcihuZXcgQ29tbW9uc0hUVFBUcmFuc3BvcnRTZW5kZXIoKSk7Ci0gICAgICAgIGF4aXNDb25maWd1cmF0aW9uLmFkZFRyYW5zcG9ydE91dCh0cmFuc3BvcnRPdXQzKTsKLSAgICAgICAgYXhpc0NvbmZpZ3VyYXRpb24uYWRkVHJhbnNwb3J0T3V0KHRyYW5zcG9ydE91dDIpOwotICAgICAgICBheGlzQ29uZmlndXJhdGlvbi5hZGRUcmFuc3BvcnRPdXQodHJhbnNwb3J0T3V0KTsKLQotICAgICAgICB0cmFuc3BvcnRJbiA9IG5ldyBUcmFuc3BvcnRJbkRlc2NyaXB0aW9uKCJudWxsIik7Ci0gICAgICAgIHRyYW5zcG9ydEluMiA9IG5ldyBUcmFuc3BvcnRJbkRlc2NyaXB0aW9uKCJhbHdheXMiKTsKLSAgICAgICAgdHJhbnNwb3J0SW4zID0gbmV3IFRyYW5zcG9ydEluRGVzY3JpcHRpb24oInRoZWJlc3QiKTsKLSAgICAgICAgdHJhbnNwb3J0SW4uc2V0UmVjZWl2ZXIobmV3IFNpbXBsZUhUVFBTZXJ2ZXIoKSk7Ci0gICAgICAgIHRyYW5zcG9ydEluMi5zZXRSZWNlaXZlcihuZXcgU2ltcGxlSFRUUFNlcnZlcigpKTsKLSAgICAgICAgdHJhbnNwb3J0SW4zLnNldFJlY2VpdmVyKG5ldyBTaW1wbGVIVFRQU2VydmVyKCkpOwotICAgICAgICBheGlzQ29uZmlndXJhdGlvbi5hZGRUcmFuc3BvcnRJbih0cmFuc3BvcnRJbjIpOwotICAgICAgICBheGlzQ29uZmlndXJhdGlvbi5hZGRUcmFuc3BvcnRJbih0cmFuc3BvcnRJbik7Ci0gICAgICAgIGF4aXNDb25maWd1cmF0aW9uLmFkZFRyYW5zcG9ydEluKHRyYW5zcG9ydEluMyk7Ci0KLSAgICB9Ci0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKLSAgICAgKiAKLSAgICAgKiBzZXRVcCBnZXRzIGNhbGxlZCBiZWZvcmUgZWFjaCB0ZXN0KiBtZXRob2QuICBJbiB0aGlzIGNsYXNzLCBhIG5ldwotICAgICAqIE1lc3NhZ2VDb250ZXh0IG9iamVjdCBpcyBjcmVhdGVkIGZvciBlYWNoIHRlc3QqIG1ldGhvZC4gIFRoZSB0ZXN0KgotICAgICAqIG1ldGhvZHMgYXJlIHJlc3BvbnNpYmxlIGZvciBhZGRpbmcgd2hpY2hldmVyIGhhbmRsZXIgdGhleSBtYXkgbmVlZAotICAgICAqIGluIG9yZGVyIHRvIHJ1biB0aGUgZGVzaXJlZCB0ZXN0LiAgU2VlIHRoZSBoYW5kbGVyIGNsYXNzIGNvbW1lbnRzCi0gICAgICogZm9yIHRoZWlyIHJlc3BlY3RpdmUgZnVuY3Rpb25zLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vb3JnLmFwYWNoZS5sb2c0ai5CYXNpY0NvbmZpZ3VyYXRvci5jb25maWd1cmUoKTsKLQotICAgICAgICBpbnZva2VjYWxsY291bnQgPSAwOwotCi0gICAgICAgIG1jID0gY2ZnQ29udGV4dC5jcmVhdGVNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBtYy5zZXRUcmFuc3BvcnRJbih0cmFuc3BvcnRJbik7Ci0gICAgICAgIG1jLnNldFRyYW5zcG9ydE91dCh0cmFuc3BvcnRPdXQpOwotCi0gICAgICAgIG1jLnNldFNlcnZlclNpZGUodHJ1ZSk7Ci0gICAgICAgIG1jLnNldFByb3BlcnR5KE1lc3NhZ2VDb250ZXh0LlRSQU5TUE9SVF9PVVQsIFN5c3RlbS5vdXQpOwotCi0gICAgICAgIFNPQVBGYWN0b3J5IG9tRmFjID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDExRmFjdG9yeSgpOwotICAgICAgICBtYy5zZXRFbnZlbG9wZShvbUZhYy5nZXREZWZhdWx0RW52ZWxvcGUoKSk7Ci0KLSAgICAgICAgcGhhc2UxID0gbmV3IFBoYXNlKCIxIik7Ci0gICAgICAgIHBoYXNlMS5hZGRIYW5kbGVyKG5ldyBUZW1wSGFuZGxlcjAyKDApKTsKLSAgICAgICAgcGhhc2UxLmFkZEhhbmRsZXIobmV3IFRlbXBIYW5kbGVyMDIoMSkpOwotCi0gICAgICAgIHBoYXNlMiA9IG5ldyBQaGFzZSgiMiIpOwotICAgICAgICBwaGFzZTIuYWRkSGFuZGxlcihuZXcgVGVtcEhhbmRsZXIwMigyKSk7Ci0gICAgICAgIHBoYXNlMi5hZGRIYW5kbGVyKGhhbmRsZXIwMik7Ci0gICAgICAgIHBoYXNlMi5hZGRIYW5kbGVyKG5ldyBUZW1wSGFuZGxlcjAyKDMpKTsKLQotICAgICAgICBwaGFzZTMgPSBuZXcgUGhhc2UoIjMiKTsKLSAgICAgICAgcGhhc2UzLmFkZEhhbmRsZXIobmV3IFRlbXBIYW5kbGVyMDIoNCkpOwotICAgICAgICBwaGFzZTMuYWRkSGFuZGxlcihzdWJoYW5kbGVyKTsKLSAgICAgICAgcGhhc2UzLmFkZEhhbmRsZXIoaGFuZGxlcjAyKTsgIC8vIHNhbWUgaW5zdGFuY2UsIHNlY29uZCBpbnNlcnRpb24KLSAgICAgICAgcGhhc2UzLmFkZEhhbmRsZXIobmV3IFRlbXBIYW5kbGVyMDIoNSkpOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFRPRE86ICBXQVJOSU5HIFdBUk5JTkcgV0FSTklORwotICAgICAgICAgKiBJZGVhbGx5IGluc2VydGluZyBzdWJQaGFzZSBoZXJlIHdvdWxkIG1ha2UgdGhlIGF4aXMyIGVuZ2luZSBjYWxsCi0gICAgICAgICAqIHRoZSBpbnZva2Ugb2YgbmVzdGVkIHN1YmhhbmRsZXIuICBJdCBkb2VzIG5vdCBkbyB0aGlzLiAgUGxlYXNlIHNlZSB0aGUKLSAgICAgICAgICogd2FybmluZyBhdCBib3R0b20gb2YgdGVzdFBhdXNlMDYgbWV0aG9kLgotICAgICAgICAgKi8KLSAgICAgICAgc3ViUGhhc2UgPSBuZXcgUGhhc2UoInN1YiIpOwotICAgICAgICBzdWJQaGFzZS5hZGRIYW5kbGVyKHN1YmhhbmRsZXIpOwotICAgICAgICBwaGFzZTMuYWRkSGFuZGxlcihzdWJQaGFzZSk7Ci0gICAgICAgIHBoYXNlMy5hZGRIYW5kbGVyKG5ldyBUZW1wSGFuZGxlcjAyKDYpKTsKLSAgICAgICAgcGhhc2UzLmFkZEhhbmRsZXIobmV3IFRlbXBIYW5kbGVyMDIoNykpOwotCi0gICAgICAgIGF4aXNPcGVyYXRpb24uZ2V0UmVtYWluaW5nUGhhc2VzSW5GbG93KCkuYWRkKHBoYXNlMSk7Ci0gICAgICAgIGF4aXNPcGVyYXRpb24uZ2V0UmVtYWluaW5nUGhhc2VzSW5GbG93KCkuYWRkKHBoYXNlMik7Ci0gICAgICAgIGF4aXNPcGVyYXRpb24uZ2V0UmVtYWluaW5nUGhhc2VzSW5GbG93KCkuYWRkKHBoYXNlMyk7Ci0KLQotICAgICAgICBtYy5zZXRNZXNzYWdlSUQoVVVJREdlbmVyYXRvci5nZXRVVUlEKCkpOwotCi0gICAgICAgIC8vb3BlcmF0aW9uQ29udGV4dC5hZGRNZXNzYWdlQ29udGV4dChtYyk7ICBnZXRzIGRvbmUgdmlhIHRoZSByZWdpc3RlcgotICAgICAgICBheGlzT3BlcmF0aW9uLnJlZ2lzdGVyT3BlcmF0aW9uQ29udGV4dChtYywgb3BlcmF0aW9uQ29udGV4dCk7Ci0gICAgICAgIG1jLnNldE9wZXJhdGlvbkNvbnRleHQob3BlcmF0aW9uQ29udGV4dCk7Ci0gICAgICAgIG1jLnNldFNlcnZpY2VDb250ZXh0KHNlcnZpY2VDb250ZXh0KTsKLQotICAgICAgICBtYy5zZXRUbyhuZXcgRW5kcG9pbnRSZWZlcmVuY2UoImF4aXMyL3NlcnZpY2VzL051bGxTZXJ2aWNlIikpOwotCi0gICAgICAgIG1jLnNldFdTQUFjdGlvbihvcGVyYXRpb25OYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgbWMuc2V0U29hcEFjdGlvbihvcGVyYXRpb25OYW1lLmdldExvY2FsUGFydCgpKTsKLQotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIHRlc3QgY2FzZXMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCi0gICAgLyoqCi0gICAgICogVGVzdCBjYXNlIGZvciBzZXR0aW5nIGFuZCByZW1vdmluZyBkYXRhIGZyb20gYSBtZXNzYWdlIGNvbnRleHQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2VsZk1hbmFnZWREYXRhMDEoKSB7Ci0gICAgICAgIGxvZy5kZWJ1ZygKLSAgICAgICAgICAgICAgICAiTWVzc2FnZUNvbnRleHRTZWxmTWFuYWdlZERhdGFUZXN0Ojp0ZXN0U2VsZk1hbmFnZWREYXRhMDEoKT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgQXJyYXlMaXN0IGhhbmRsZXJzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgaGFuZGxlcnMuYWRkKGhhbmRsZXIwMSk7Ci0gICAgICAgICAgICBjZmdDb250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCkuc2V0SW5QaGFzZXNVcHRvQW5kSW5jbHVkaW5nUG9zdERpc3BhdGNoKGhhbmRsZXJzKTsKLQotICAgICAgICAgICAgbWMuc2V0VG8obmV3IEVuZHBvaW50UmVmZXJlbmNlKCJheGlzMi9zZXJ2aWNlcy9OdWxsU2VydmljZSIpKTsKLSAgICAgICAgICAgIG1jLnNldFdTQUFjdGlvbigiRHVtbXlPcCIpOwotCi0gICAgICAgICAgICBBeGlzRW5naW5lLnJlY2VpdmUobWMpOwotCi0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHRlc3REYXRhMDEsIGhhbmRsZXIwMS5nZXRUZXN0RGF0YTAxRnJvbU1lc3NhZ2VDb250ZXh0KG1jKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyh0ZXN0RGF0YTAyLCBoYW5kbGVyMDEuZ2V0VGVzdERhdGEwMkZyb21NZXNzYWdlQ29udGV4dChtYykpOwotCi0gICAgICAgIGJvb2xlYW4gaXNPazMgPSBpc0VxdWFscyh0ZXN0RGF0YTAzLCBoYW5kbGVyMDEuZ2V0VGVzdERhdGEwM0Zyb21NZXNzYWdlQ29udGV4dChtYykpOwotICAgICAgICBhc3NlcnRUcnVlKGlzT2szKTsKLQotICAgICAgICBib29sZWFuIGlzT2s0ID0gaXNFcXVhbHModGVzdERhdGEwNCwgaGFuZGxlcjAxLmdldFRlc3REYXRhMDRGcm9tTWVzc2FnZUNvbnRleHQobWMpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShpc09rNCk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGludm9rZWNhbGxjb3VudCk7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBUZXN0IGZvciBzZXR0aW5nLCBzYXZpbmcsIHJlc3RvcmluZyBzZWxmIG1hbmFnZWQgZGF0YSB3aXRoIG5vIGV4Y2VwdGlvbnMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGF1c2UwMV9ub0V4Y2VwdGlvbnMoKSB7Ci0gICAgICAgIGxvZy5kZWJ1ZygKLSAgICAgICAgICAgICAgICAiTWVzc2FnZUNvbnRleHRTZWxmTWFuYWdlZERhdGFUZXN0Ojp0ZXN0UGF1c2UwMV9ub0V4Y2VwdGlvbnMoKT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBBcnJheUxpc3QgaGFuZGxlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICBoYW5kbGVycy5hZGQoaGFuZGxlcjAyKTsKLSAgICAgICAgICAgIGNmZ0NvbnRleHQuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5zZXRJblBoYXNlc1VwdG9BbmRJbmNsdWRpbmdQb3N0RGlzcGF0Y2goaGFuZGxlcnMpOwotCi0gICAgICAgICAgICBtYy5zZXRUbyhuZXcgRW5kcG9pbnRSZWZlcmVuY2UoImF4aXMyL3NlcnZpY2VzL051bGxTZXJ2aWNlIikpOwotICAgICAgICAgICAgbWMuc2V0V1NBQWN0aW9uKCJEdW1teU9wIik7Ci0KLSAgICAgICAgICAgIEF4aXNFbmdpbmUucmVjZWl2ZShtYyk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gaWYgd2UgZGlkbid0IGdldCBhbnkgZXhjZXB0aW9ucyBkdXJpbmcgc2F2ZS9yZXN0b3JlLCB0aGVzZSB3aWxsIGJlIHRydWUKLSAgICAgICAgYXNzZXJ0VHJ1ZShzYXZlZE1lc3NhZ2VDb250ZXh0KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN0b3JlZE1lc3NhZ2VDb250ZXh0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGludm9rZWNhbGxjb3VudCk7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBUZXN0IGZvciB2ZXJpZnlpbmcgdGhlIHNlbGYgbWFuYWdlZCBkYXRhIHVzZWQgZHVyaW5nIHRoZSBzYXZlIGFuZCByZXN0b3JlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFBhdXNlMDJfc2F2ZVJlc3RvcmVTZWxmTWFuYWdlZERhdGEoKSB7Ci0gICAgICAgIGxvZy5kZWJ1ZygKLSAgICAgICAgICAgICAgICAiTWVzc2FnZUNvbnRleHRTZWxmTWFuYWdlZERhdGFUZXN0Ojp0ZXN0UGF1c2UwMl9zYXZlUmVzdG9yZVNlbGZNYW5hZ2VkRGF0YSgpPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEFycmF5TGlzdCBoYW5kbGVycyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgIGhhbmRsZXJzLmFkZChoYW5kbGVyMDIpOwotICAgICAgICAgICAgY2ZnQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpLnNldEluUGhhc2VzVXB0b0FuZEluY2x1ZGluZ1Bvc3REaXNwYXRjaChoYW5kbGVycyk7Ci0KLSAgICAgICAgICAgIG1jLnNldFRvKG5ldyBFbmRwb2ludFJlZmVyZW5jZSgiYXhpczIvc2VydmljZXMvTnVsbFNlcnZpY2UiKSk7Ci0gICAgICAgICAgICBtYy5zZXRXU0FBY3Rpb24oIkR1bW15T3AiKTsKLQotICAgICAgICAgICAgQXhpc0VuZ2luZS5yZWNlaXZlKG1jKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBtYWtlIHN1cmUgdGhlIGRhdGEgaW4gb3VyIGhhbmRsZXIgZ290IHJlc3RvcmVkCi0gICAgICAgIGFzc2VydEVxdWFscyhoYW5kbGVyMDIudGVzdERhdGEsIGhhbmRsZXIwMi5nZXRUZXN0RGF0YUZyb21NZXNzYWdlQ29udGV4dChtYykpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgaW52b2tlY2FsbGNvdW50KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IGZvciBzYXZlIGFuZCByZXN0b3JlIG9mIHNlbGYgbWFuYWdlZCBkYXRhIGFuZCB0aGUgQXhpc09wZXJhdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RQYXVzZTAzX3NhdmVSZXN0b3JlT3BlcmF0aW9uKCkgewotICAgICAgICBsb2cuZGVidWcoCi0gICAgICAgICAgICAgICAgIk1lc3NhZ2VDb250ZXh0U2VsZk1hbmFnZWREYXRhVGVzdDo6dGVzdFBhdXNlMDNfc2F2ZVJlc3RvcmVPcGVyYXRpb24oKT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBBcnJheUxpc3QgaGFuZGxlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICBoYW5kbGVycy5hZGQoaGFuZGxlcjAyKTsKLSAgICAgICAgICAgIGNmZ0NvbnRleHQuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5zZXRJblBoYXNlc1VwdG9BbmRJbmNsdWRpbmdQb3N0RGlzcGF0Y2goaGFuZGxlcnMpOwotCi0gICAgICAgICAgICBtYy5zZXRUbyhuZXcgRW5kcG9pbnRSZWZlcmVuY2UoImF4aXMyL3NlcnZpY2VzL051bGxTZXJ2aWNlIikpOwotICAgICAgICAgICAgbWMuc2V0V1NBQWN0aW9uKCJEdW1teU9wIik7Ci0KLSAgICAgICAgICAgIEF4aXNFbmdpbmUucmVjZWl2ZShtYyk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gbWFrZSBzdXJlIHRoZSBvcGVyYXRpb24gZ290IHJlc3RvcmVkIGluIHRoZSBNZXNzYWdlQ29udGV4dCBvYmplY3QKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG9wZXJhdGlvbk5hbWUudG9TdHJpbmcoKSwgbWMuZ2V0QXhpc09wZXJhdGlvbigpLmdldE5hbWUoKS50b1N0cmluZygpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGludm9rZWNhbGxjb3VudCk7Ci0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFRlc3QgZm9yIHNhdmUgYW5kIHJlc3RvcmUgb2Ygc2VsZiBtYW5hZ2VkIGRhdGEgYW5kIHRoZSBBeGlzU2VydmljZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RQYXVzZTA0X3NhdmVSZXN0b3JlQXhpc1NlcnZpY2UoKSB7Ci0gICAgICAgIGxvZy5kZWJ1ZygKLSAgICAgICAgICAgICAgICAiTWVzc2FnZUNvbnRleHRTZWxmTWFuYWdlZERhdGFUZXN0Ojp0ZXN0UGF1c2UwNF9zYXZlUmVzdG9yZUF4aXNTZXJ2aWNlKCk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgQXJyYXlMaXN0IGhhbmRsZXJzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgaGFuZGxlcnMuYWRkKGhhbmRsZXIwMik7Ci0gICAgICAgICAgICBjZmdDb250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCkuc2V0SW5QaGFzZXNVcHRvQW5kSW5jbHVkaW5nUG9zdERpc3BhdGNoKGhhbmRsZXJzKTsKLQotICAgICAgICAgICAgbWMuc2V0VG8obmV3IEVuZHBvaW50UmVmZXJlbmNlKCJheGlzMi9zZXJ2aWNlcy9OdWxsU2VydmljZSIpKTsKLSAgICAgICAgICAgIG1jLnNldFdTQUFjdGlvbigiRHVtbXlPcCIpOwotCi0gICAgICAgICAgICBBeGlzRW5naW5lLnJlY2VpdmUobWMpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIG1ha2Ugc3VyZSB0aGUgc2VydmljZSBnb3QgcmVzdG9yZWQgaW4gdGhlIE1lc3NhZ2VDb250ZXh0IG9iamVjdAotICAgICAgICBhc3NlcnRFcXVhbHMoc2VydmljZU5hbWUudG9TdHJpbmcoKSwgbWMuZ2V0QXhpc1NlcnZpY2UoKS5nZXROYW1lKCkudG9TdHJpbmcoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBpbnZva2VjYWxsY291bnQpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogVGVzdCBmb3Igc2F2ZSBhbmQgcmVzdG9yZSBvZiBzZWxmIG1hbmFnZWQgZGF0YSBhbmQgdGhlIEF4aXNTZXJ2aWNlR3JvdXAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGF1c2UwNV9zYXZlUmVzdG9yZUF4aXNTZXJ2aWNlR3JvdXAoKSB7Ci0gICAgICAgIGxvZy5kZWJ1ZygKLSAgICAgICAgICAgICAgICAiTWVzc2FnZUNvbnRleHRTZWxmTWFuYWdlZERhdGFUZXN0Ojp0ZXN0UGF1c2UwNV9zYXZlUmVzdG9yZUF4aXNTZXJ2aWNlR3JvdXAoKT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBBcnJheUxpc3QgaGFuZGxlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICBoYW5kbGVycy5hZGQoaGFuZGxlcjAyKTsKLSAgICAgICAgICAgIGNmZ0NvbnRleHQuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5zZXRJblBoYXNlc1VwdG9BbmRJbmNsdWRpbmdQb3N0RGlzcGF0Y2goaGFuZGxlcnMpOwotCi0gICAgICAgICAgICBtYy5zZXRUbyhuZXcgRW5kcG9pbnRSZWZlcmVuY2UoImF4aXMyL3NlcnZpY2VzL051bGxTZXJ2aWNlIikpOwotICAgICAgICAgICAgbWMuc2V0V1NBQWN0aW9uKCJEdW1teU9wIik7Ci0KLSAgICAgICAgICAgIEF4aXNFbmdpbmUucmVjZWl2ZShtYyk7Ci0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBtYWtlIHN1cmUgdGhlIHNlcnZpY2VHcm91cCBnb3QgcmVzdG9yZWQgaW4gdGhlIE1lc3NhZ2VDb250ZXh0IG9iamVjdAotICAgICAgICAvL2Fzc2VydEVxdWFscyhzZXJ2aWNlR3JvdXBOYW1lLnRvU3RyaW5nKCksIG1jLmdldEF4aXNTZXJ2aWNlR3JvdXAoKS5nZXRTZXJ2aWNlR3JvdXBOYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgaW52b2tlY2FsbGNvdW50KTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFRlc3QgZm9yIHBoYXNlcwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RQYXVzZTA2X3NhdmVSZXN0b3JlUGhhc2VzKCkgewotICAgICAgICBsb2cuZGVidWcoCi0gICAgICAgICAgICAgICAgIk1lc3NhZ2VDb250ZXh0U2VsZk1hbmFnZWREYXRhVGVzdDo6dGVzdFBhdXNlMDZfc2F2ZVJlc3RvcmVQaGFzZXMoKT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOwotCi0gICAgICAgIFRlbXBIYW5kbGVyMDIgaGFuZGxlckEgPSBuZXcgVGVtcEhhbmRsZXIwMig2NjYpOwotCi0gICAgICAgIFBoYXNlIHBoYXNlNjAxID0gbmV3IFBoYXNlKCIwMSIpOwotICAgICAgICBwaGFzZTYwMS5hZGRIYW5kbGVyKG5ldyBUZW1wSGFuZGxlcjAyKDYxKSk7IC8vIHNsb3QgMQotICAgICAgICBwaGFzZTYwMS5hZGRIYW5kbGVyKG5ldyBUZW1wSGFuZGxlcjAzKDYyKSk7IC8vIHNsb3QgMgotCi0gICAgICAgIFBoYXNlIHBoYXNlNjAyID0gbmV3IFBoYXNlKCIwMiIpOwotICAgICAgICBwaGFzZTYwMi5hZGRIYW5kbGVyKG5ldyBUZW1wSGFuZGxlcjAyKDYzKSk7IC8vIHNsb3QgMwotICAgICAgICBwaGFzZTYwMi5hZGRIYW5kbGVyKGhhbmRsZXJBKTsgICAgICAgICAgICAgIC8vIHNsb3QgNAotICAgICAgICBwaGFzZTYwMi5hZGRIYW5kbGVyKG5ldyBUZW1wSGFuZGxlcjAzKDY0KSk7IC8vIHNsb3QgNQotCi0gICAgICAgIFBoYXNlIHBoYXNlNjAzID0gbmV3IFBoYXNlKCIwMyIpOwotICAgICAgICBwaGFzZTYwMy5hZGRIYW5kbGVyKG5ldyBUZW1wSGFuZGxlcjAyKDY1KSk7IC8vIHNsb3QgNgotICAgICAgICBwaGFzZTYwMy5hZGRIYW5kbGVyKHN1YmhhbmRsZXIpOyAgICAgICAgICAgIC8vIHNsb3QgNwotICAgICAgICBwaGFzZTYwMy5hZGRIYW5kbGVyKGhhbmRsZXJBKTsgICAgICAgICAgICAgIC8vIHNsb3QgOCAtIHNhbWUgaW5zdGFuY2UsIHNlY29uZCBpbnNlcnRpb24KLSAgICAgICAgcGhhc2U2MDMuYWRkSGFuZGxlcihuZXcgVGVtcEhhbmRsZXIwMyg2NikpOyAvLyBzbG90IDkKLQotICAgICAgICAvKgotICAgICAgICAgKiBUT0RPOiAgV0FSTklORyBXQVJOSU5HIFdBUk5JTkcKLSAgICAgICAgICogSWRlYWxseSBpbnNlcnRpbmcgc3ViUGhhc2UgaGVyZSB3b3VsZCBtYWtlIHRoZSBheGlzMiBlbmdpbmUgY2FsbAotICAgICAgICAgKiB0aGUgaW52b2tlIG9mIG5lc3RlZCBzdWJoYW5kbGVyLiAgSXQgZG9lcyBub3QgZG8gdGhpcy4gIAotICAgICAgICAgKiBQbGVhc2Ugc2VlIHRoZSB3YXJuaW5nIGxhdGVyIGluIHRoaXMgbWV0aG9kLgotICAgICAgICAgKi8KLSAgICAgICAgUGhhc2Ugc3ViUGhhc2U2MDEgPSBuZXcgUGhhc2UoInN1YjYiKTsKLSAgICAgICAgc3ViUGhhc2U2MDEuYWRkSGFuZGxlcihzdWJoYW5kbGVyKTsKLSAgICAgICAgcGhhc2U2MDMuYWRkSGFuZGxlcihzdWJQaGFzZTYwMSk7ICAgICAgICAgICAvLyBzbG90IDEwCi0gICAgICAgIHBoYXNlNjAzLmFkZEhhbmRsZXIobmV3IFRlbXBIYW5kbGVyMDIoNjcpKTsgLy8gc2xvdCAxMQotICAgICAgICBwaGFzZTYwMy5hZGRIYW5kbGVyKG5ldyBUZW1wSGFuZGxlcjAzKDY4KSk7IC8vIHNsb3QgMTIKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgQXJyYXlMaXN0IHBoYXNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgIHBoYXNlcy5hZGQocGhhc2U2MDEpOwotICAgICAgICAgICAgcGhhc2VzLmFkZChwaGFzZTYwMik7Ci0gICAgICAgICAgICBwaGFzZXMuYWRkKHBoYXNlNjAzKTsKLQotICAgICAgICAgICAgY2ZnQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpLnNldEluUGhhc2VzVXB0b0FuZEluY2x1ZGluZ1Bvc3REaXNwYXRjaChwaGFzZXMpOwotCi0gICAgICAgICAgICBtYy5zZXRUbyhuZXcgRW5kcG9pbnRSZWZlcmVuY2UoImF4aXMyL3NlcnZpY2VzL051bGxTZXJ2aWNlIikpOwotICAgICAgICAgICAgbWMuc2V0V1NBQWN0aW9uKCJEdW1teU9wIik7Ci0KLSAgICAgICAgICAgIEF4aXNFbmdpbmUucmVjZWl2ZShtYyk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZ2V0IHRoZSBwaGFzZSBsaXN0cyBhbmQgc2VlIGlmIHRoZXkgbWF0Y2ggdXAKLSAgICAgICAgQXJyYXlMaXN0IHJlc3RvcmVkUGhhc2VzID0gbWMuZ2V0RXhlY3V0aW9uQ2hhaW4oKTsKLSAgICAgICAgaW50IGl0X2NvdW50ID0gMDsKLQotICAgICAgICBJdGVyYXRvciBpdCA9IHJlc3RvcmVkUGhhc2VzLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIC8vIHdlIGtub3cgZXZlcnl0aGluZyBhdCB0aGlzIGxldmVsIGlzIGEgUGhhc2UuICAKLSAgICAgICAgICAgIC8vIGlmIHlvdSBjaGFuZ2UgaXQsIHlvdSBtaWdodCBnZXQgYSBDbGFzc0Nhc3RFeGNlcHRpb24gCi0gICAgICAgICAgICBQaGFzZSByZXN0b3JlZF9waGFzZSA9IChQaGFzZSkgaXQubmV4dCgpOwotCi0gICAgICAgICAgICBQaGFzZSBvcmlnaW5hbF9waGFzZSA9IG51bGw7Ci0KLSAgICAgICAgICAgIGl0X2NvdW50Kys7Ci0KLSAgICAgICAgICAgIGlmIChpdF9jb3VudCA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgb3JpZ2luYWxfcGhhc2UgPSBwaGFzZTYwMTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoaXRfY291bnQgPT0gMikgewotICAgICAgICAgICAgICAgIG9yaWdpbmFsX3BoYXNlID0gcGhhc2U2MDI7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGl0X2NvdW50ID09IDMpIHsKLSAgICAgICAgICAgICAgICBvcmlnaW5hbF9waGFzZSA9IHBoYXNlNjAzOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvL2NvbXBhcmVQaGFzZXMocmVzdG9yZWRfcGhhc2UuZ2V0SGFuZGxlcnMoKS5pdGVyYXRvcigpLCBvcmlnaW5hbF9waGFzZS5nZXRIYW5kbGVycygpKTsKLQotICAgICAgICAgICAgYm9vbGVhbiBpc09rID0gY29tcGFyZVBoYXNlcyhyZXN0b3JlZF9waGFzZSwgb3JpZ2luYWxfcGhhc2UpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShpc09rKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFRPRE8gV0FSTklORyBXQVJOSU5HIFdBUk5JTkcKLSAgICAgICAgLy8gVGhlIGF4aXMyIGVuZ2luZSBpcyBub3QgY2FsbGluZyB0aGUgaW52b2tlIG9uIG5lc3RlZCBoYW5kbGVycyEgIAotICAgICAgICAvLyBUaGUgd2F5IHRoaXMgdGVzdGNhc2Ugd29ya3MgaXMgdGhhdCB0aGUgaGFuZGxlcidzIGludm9rZSgpIG1ldGhvZCBpcyAKLSAgICAgICAgLy8gd2hhdCBzZXRzIHRoZSBkYXRhLiAgU28sIGFueSBoYW5kbGVycyB0aGF0IGFyZSBpbiBzdWJQaGFzZSB3aWxsIAotICAgICAgICAvLyBub3QgZ2V0IGNhbGxlZCwgYW5kIHRodXMgd2lsbCBub3Qgc2V0IG9yIHJlc3RvcmUgYW55IGRhdGEuICAKLSAgICAgICAgLy8gTm90aWNlIHdlIGRvIGN1cnJlbnRseSBoYXZlIGEgc3ViaGFuZGxlciBpbiB0aGUgc3ViUGhhc2Ugb2JqZWN0LgotICAgICAgICAvLyBXaGVuIGF4aXMyIGRlY2lkZXMgdG8gc3VwcG9ydCBuZXN0ZWQgaGFuZGxlcnMsIHRoZQotICAgICAgICAvLyBmaXJzdCB0aHJlZSBhc3NlcnRFcXVhbHMgYmVsb3cgd2lsbCBmYWlsLgotICAgICAgICBsb2cuZGVidWcoCi0gICAgICAgICAgICAgICAgIk1lc3NhZ2VDb250ZXh0U2VsZk1hbmFnZWREYXRhVGVzdDo6dGVzdFBhdXNlMDZfc2F2ZVJlc3RvcmVQaGFzZXMoKTo6ICBpbnZva2VjYWxsY291bnQgWyIgKwotICAgICAgICAgICAgICAgICAgICAgICAgaW52b2tlY2FsbGNvdW50ICsgIl0iKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDExLCBpbnZva2VjYWxsY291bnQpOwotCi0gICAgICAgIC8vIGV2ZW4gdGhvdWdoIHRoZXJlIGFyZSB0d28gb2NjdXJyYW5jZXMgb2YgdGhlIHNhbWUgaW5zdGFuY2Ugb2YKLSAgICAgICAgLy8gaGFuZGxlckEgaW4gdGhlIGV4ZWN1dGlvbkNoYWluLCBpdHMgc2VyaWFsaXplIGFuZCBkZXNlcmlhbGl6ZSAKLSAgICAgICAgLy8gc2hvdWxkIG9ubHkgYmUgY2FsbGVkIG9uY2UgcGVyIHVuaXF1ZSBpbnN0YW5jZSBpbiB0aGUgbGlzdAotICAgICAgICBpbnQgY291bnRfcyA9IGhhbmRsZXJBLmdldFNlcmlhbGl6ZWNhbGxjb3VudCgpOwotICAgICAgICBsb2cuZGVidWcoCi0gICAgICAgICAgICAgICAgIk1lc3NhZ2VDb250ZXh0U2VsZk1hbmFnZWREYXRhVGVzdDo6dGVzdFBhdXNlMDZfc2F2ZVJlc3RvcmVQaGFzZXMoKTo6ICBoYW5kbGVyQSBzZXJpYWxpemUgY2FsbCBjb3VudCBbIiArCi0gICAgICAgICAgICAgICAgICAgICAgICBjb3VudF9zICsgIl0iKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDExLCBjb3VudF9zKTsKLQotICAgICAgICAvLyBoZXJlIGNvbWVzIHNvbWUgZnVuIG1hdGguLi4KLSAgICAgICAgLy8gU2luY2UgYSBoYW5kbGVyIChUZW1wSGFuZGxlcjAyKSBpbiB0aGlzIGNhc2UgCi0gICAgICAgIC8vIGRvZXNuJ3QgYWRkIGFueSBkYXRhIHVudGlsIGl0cyBpbnZva2UgbWV0aG9kIGdldHMgY2FsbGVkLCAKLSAgICAgICAgLy8gYW5kIHRoZSBpbnZva2UgaXMgd2hhdCBjYXVzZXMgdGhlIHNhdmUvcmVzdG9yZSAoYW5kIHRodXMgCi0gICAgICAgIC8vIHRoZSBzZXJpYWxpemUvZGVzZXJpYWxpemUpIHRoZXJlIGlzIG5vIGRhdGEgZm9yIGhhbmRsZXJBIAotICAgICAgICAvLyB0byBkZXNlcmlhbGl6ZSB1bnRpbCB0aGUgZmlyc3Qgb2NjdXJhbmNlIG9mIGhhbmRsZXJBIAotICAgICAgICAvLyBpbnZva2UgaXMgY2FsbGVkIGluIHRoZSBleGVjdXRpb25DaGFpbi4gIE9ic2VydmluZyBvdXIgcGhhc2VzLCAKLSAgICAgICAgLy8gd2Ugc2VlIGl0IGlzIGluIHNsb3QgIzMuICAxMSAtIDMgPSA4Ci0gICAgICAgIGludCBjb3VudF9kID0gaGFuZGxlckEuZ2V0RGVzZXJpYWxpemVjYWxsY291bnQoKTsKLSAgICAgICAgbG9nLmRlYnVnKAotICAgICAgICAgICAgICAgICJNZXNzYWdlQ29udGV4dFNlbGZNYW5hZ2VkRGF0YVRlc3Q6OnRlc3RQYXVzZTA2X3NhdmVSZXN0b3JlUGhhc2VzKCk6OiAgaGFuZGxlckEgZGVzZXJpYWxpemUgY2FsbCBjb3VudCBbIiArCi0gICAgICAgICAgICAgICAgICAgICAgICBjb3VudF9kICsgIl0iKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDgsIGNvdW50X2QpOwotICAgICAgICBhc3NlcnRFcXVhbHMoc3ViaGFuZGxlci50ZXN0RGF0YSwgc3ViaGFuZGxlci5nZXRUZXN0RGF0YUZyb21NZXNzYWdlQ29udGV4dChtYykpOwotCi0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBUZXN0IGZvciBzYXZlIGFuZCByZXN0b3JlIG9mIGJpbmFyeSBzZWxmIG1hbmFnZWQgZGF0YQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RTZWxmTWFuYWdlZERhdGEwNygpIHsKLSAgICAgICAgbG9nLmRlYnVnKAotICAgICAgICAgICAgICAgICJNZXNzYWdlQ29udGV4dFNlbGZNYW5hZ2VkRGF0YVRlc3Q6OnRlc3RTZWxmTWFuYWdlZERhdGEwNygpPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBBcnJheUxpc3QgaGFuZGxlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICBoYW5kbGVycy5hZGQoaGFuZGxlcjAzKTsKLSAgICAgICAgICAgIGNmZ0NvbnRleHQuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5zZXRJblBoYXNlc1VwdG9BbmRJbmNsdWRpbmdQb3N0RGlzcGF0Y2goaGFuZGxlcnMpOwotCi0gICAgICAgICAgICBtYy5zZXRUbyhuZXcgRW5kcG9pbnRSZWZlcmVuY2UoImF4aXMyL3NlcnZpY2VzL051bGxTZXJ2aWNlIikpOwotICAgICAgICAgICAgbWMuc2V0V1NBQWN0aW9uKCJEdW1teU9wIik7Ci0KLSAgICAgICAgICAgIEF4aXNFbmdpbmUucmVjZWl2ZShtYyk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbGVhbiBpc09rMyA9IGlzRXF1YWxzKHRlc3REYXRhMDMsIChieXRlIFtdKSBoYW5kbGVyMDMuZ2V0VGVzdERhdGFGcm9tTWVzc2FnZUNvbnRleHQobWMpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShpc09rMyk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGludm9rZWNhbGxjb3VudCk7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBUZXN0IGZvciBoYW5kbGVyMDQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2VsZk1hbmFnZWREYXRhMDgoKSB7Ci0gICAgICAgIGxvZy5kZWJ1ZygKLSAgICAgICAgICAgICAgICAiTWVzc2FnZUNvbnRleHRTZWxmTWFuYWdlZERhdGFUZXN0Ojp0ZXN0U2VsZk1hbmFnZWREYXRhMDgoKT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOwotICAgICAgICB0cnkgewotCi0gICAgICAgICAgICBBcnJheUxpc3QgaGFuZGxlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICBoYW5kbGVycy5hZGQoaGFuZGxlcjA0KTsKLSAgICAgICAgICAgIGNmZ0NvbnRleHQuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5zZXRJblBoYXNlc1VwdG9BbmRJbmNsdWRpbmdQb3N0RGlzcGF0Y2goaGFuZGxlcnMpOwotCi0gICAgICAgICAgICBtYy5zZXRUbyhuZXcgRW5kcG9pbnRSZWZlcmVuY2UoImF4aXMyL3NlcnZpY2VzL051bGxTZXJ2aWNlIikpOwotICAgICAgICAgICAgbWMuc2V0V1NBQWN0aW9uKCJEdW1teU9wIik7Ci0KLSAgICAgICAgICAgIEF4aXNFbmdpbmUucmVjZWl2ZShtYyk7Ci0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBib29sZWFuIGlzT2s0ID0gaXNFcXVhbHModGVzdERhdGEwNCwgKGxvbmcgW10pIGhhbmRsZXIwNC5nZXRUZXN0RGF0YUZyb21NZXNzYWdlQ29udGV4dChtYykpOwotICAgICAgICBhc3NlcnRUcnVlKGlzT2s0KTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgaW52b2tlY2FsbGNvdW50KTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFRlc3QgZm9yIGhhbmRsZXIwMyBhbmQgaGFuZGxlcjA0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFNlbGZNYW5hZ2VkRGF0YTA5KCkgewotICAgICAgICBsb2cuZGVidWcoCi0gICAgICAgICAgICAgICAgIk1lc3NhZ2VDb250ZXh0U2VsZk1hbmFnZWREYXRhVGVzdDo6dGVzdFNlbGZNYW5hZ2VkRGF0YTA5KCk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKTsKLSAgICAgICAgdHJ5IHsKLQotICAgICAgICAgICAgQXJyYXlMaXN0IGhhbmRsZXJzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgaGFuZGxlcnMuYWRkKGhhbmRsZXIwMyk7Ci0gICAgICAgICAgICBoYW5kbGVycy5hZGQoaGFuZGxlcjA0KTsKLSAgICAgICAgICAgIGNmZ0NvbnRleHQuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5zZXRJblBoYXNlc1VwdG9BbmRJbmNsdWRpbmdQb3N0RGlzcGF0Y2goaGFuZGxlcnMpOwotCi0gICAgICAgICAgICBtYy5zZXRUbyhuZXcgRW5kcG9pbnRSZWZlcmVuY2UoImF4aXMyL3NlcnZpY2VzL051bGxTZXJ2aWNlIikpOwotICAgICAgICAgICAgbWMuc2V0V1NBQWN0aW9uKCJEdW1teU9wIik7Ci0KLSAgICAgICAgICAgIEF4aXNFbmdpbmUucmVjZWl2ZShtYyk7Ci0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBib29sZWFuIGlzT2szID0gaXNFcXVhbHModGVzdERhdGEwMywgKGJ5dGUgW10pIGhhbmRsZXIwMy5nZXRUZXN0RGF0YUZyb21NZXNzYWdlQ29udGV4dChtYykpOwotICAgICAgICBhc3NlcnRUcnVlKGlzT2szKTsKLQotICAgICAgICBib29sZWFuIGlzT2s0ID0gaXNFcXVhbHModGVzdERhdGEwNCwgKGxvbmcgW10pIGhhbmRsZXIwNC5nZXRUZXN0RGF0YUZyb21NZXNzYWdlQ29udGV4dChtYykpOwotICAgICAgICBhc3NlcnRUcnVlKGlzT2s0KTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgaW52b2tlY2FsbGNvdW50KTsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBpbnRlcm5hbCBoZWxwZXIgbWV0aG9kcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLyoqCi0gICAgICogU2F2ZXMgdGhlIHNwZWNpZmllZCBtZXNzYWdlIGNvbnRleHQgdG8gYSB0ZW1wb3JhcnkKLSAgICAgKiBmaWxlLCB0aGVuIHJlc3RvcmVzIGl0LgotICAgICAqCi0gICAgICogQHBhcmFtIG1jMSAgICAgIFRoZSBtZXNzYWdlIGNvbnRleHQgb2JqZWN0IHRvIHNhdmUKLSAgICAgKiBAcGFyYW0gZm5wcmVmaXggQSBwcmVmaXggZm9yIHRoZSBmaWxlbmFtZSBvZiB0aGUgdGVtcG9yYXJ5IGZpbGUKLSAgICAgKiBAcGFyYW0gZGVzYyAgICAgVGV4dCB0aGF0IGRlc2NyaWJlcyB0aGUgY2FsbGVyJ3Mgc2l0dWF0aW9uCi0gICAgICogQHJldHVybiBUaGUgcmVzdG9yZWQgbWVzc2FnZSBjb250ZXh0IG9iamVjdCBvciBOVUxMCi0gICAgICovCi0gICAgcHJpdmF0ZSBNZXNzYWdlQ29udGV4dCBzYXZlQW5kUmVzdG9yZShNZXNzYWdlQ29udGV4dCBtYzEsIFN0cmluZyBmbnByZWZpeCwgU3RyaW5nIGRlc2MpIHsKLSAgICAgICAgTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dDIgPSBudWxsOwotICAgICAgICBTdHJpbmcgdGl0bGUgPSAiTWVzc2FnZUNvbnRleHRTZWxmTWFuYWdlZERhdGFUZXN0OjpzYXZlQW5kUmVzdG9yZTo6WyIgKyBkZXNjICsgIl0gICAiOwotICAgICAgICBsb2cuZGVidWcodGl0bGUpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB0aGVGaWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZShmbnByZWZpeCwgbnVsbCk7Ci0gICAgICAgICAgICBsb2cuZGVidWcodGl0bGUgKyAidGVtcCBmaWxlID0gWyIgKyB0aGVGaWxlLmdldE5hbWUoKSArICJdIik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgbG9nLmRlYnVnKHRpdGxlICsgImVycm9yIGNyZWF0aW5nIHRlbXAgZmlsZSA9IFsiICsgZXguZ2V0TWVzc2FnZSgpICsgIl0iKTsKLSAgICAgICAgICAgIHRoZUZpbGUgPSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHRoZUZpbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAvLyBzZXR1cCBhbiBvdXRwdXQgc3RyZWFtIHRvIGEgcGh5c2ljYWwgZmlsZQotICAgICAgICAgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gb3V0U3RyZWFtID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0odGhlRmlsZSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBhdHRhY2ggYSBzdHJlYW0gY2FwYWJsZSBvZiB3cml0aW5nIG9iamVjdHMgdG8gdGhlIAotICAgICAgICAgICAgICAgIC8vIHN0cmVhbSBjb25uZWN0ZWQgdG8gdGhlIGZpbGUKLSAgICAgICAgICAgICAgICBPYmplY3RPdXRwdXRTdHJlYW0gb3V0T2JqU3RyZWFtID0gbmV3IE9iamVjdE91dHB1dFN0cmVhbShvdXRTdHJlYW0pOwotCi0gICAgICAgICAgICAgICAgLy8gdHJ5IHRvIHNhdmUgdGhlIG1lc3NhZ2UgY29udGV4dAotICAgICAgICAgICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArICJzYXZpbmcgbWVzc2FnZSBjb250ZXh0IC4uLi4iKTsKLSAgICAgICAgICAgICAgICBzYXZlZE1lc3NhZ2VDb250ZXh0ID0gZmFsc2U7Ci0KLSAgICAgICAgICAgICAgICBvdXRPYmpTdHJlYW0ud3JpdGVPYmplY3QobWMxKTsKLSAgICAgICAgICAgICAgICBvdXRPYmpTdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICBvdXRTdHJlYW0uY2xvc2UoKTsKLQotICAgICAgICAgICAgICAgIC8vIG5vIGV4Y2VwdGlvbnMsIHNldCBzYXZlZE1lc3NhZ2VDb250ZXh0IHRvIHRydWUKLSAgICAgICAgICAgICAgICBzYXZlZE1lc3NhZ2VDb250ZXh0ID0gdHJ1ZTsKLQotICAgICAgICAgICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArICIuLi4uc2F2ZWQgbWVzc2FnZSBjb250ZXh0IC4uLi4uIik7Ci0KLSAgICAgICAgICAgICAgICAvLyBzZXR1cCBhbiBpbnB1dCBzdHJlYW0gdG8gdGhlIGZpbGUKLSAgICAgICAgICAgICAgICBGaWxlSW5wdXRTdHJlYW0gaW5TdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKHRoZUZpbGUpOwotCi0gICAgICAgICAgICAgICAgLy8gYXR0YWNoIGEgc3RyZWFtIGNhcGFibGUgb2YgcmVhZGluZyBvYmplY3RzIGZyb20gdGhlIAotICAgICAgICAgICAgICAgIC8vIHN0cmVhbSBjb25uZWN0ZWQgdG8gdGhlIGZpbGUKLSAgICAgICAgICAgICAgICBPYmplY3RJbnB1dFN0cmVhbSBpbk9ialN0cmVhbSA9IG5ldyBPYmplY3RJbnB1dFN0cmVhbShpblN0cmVhbSk7Ci0KLSAgICAgICAgICAgICAgICAvLyB0cnkgdG8gcmVzdG9yZSB0aGUgbWVzc2FnZSBjb250ZXh0Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKHRpdGxlICsgInJlc3RvcmluZyBtZXNzYWdlIGNvbnRleHQgLi4uLi4iKTsKLSAgICAgICAgICAgICAgICByZXN0b3JlZE1lc3NhZ2VDb250ZXh0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgbXNnQ29udGV4dDIgPSAoTWVzc2FnZUNvbnRleHQpIGluT2JqU3RyZWFtLnJlYWRPYmplY3QoKTsKLSAgICAgICAgICAgICAgICBpbk9ialN0cmVhbS5jbG9zZSgpOwotICAgICAgICAgICAgICAgIGluU3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgbXNnQ29udGV4dDIuYWN0aXZhdGUobWMxLmdldENvbmZpZ3VyYXRpb25Db250ZXh0KCkpOwotCi0gICAgICAgICAgICAgICAgLy8gbm8gZXhjZXB0aW9ucywgc2V0IHJlc3RvcmVkTWVzc2FnZUNvbnRleHQgdG8gdHJ1ZQotICAgICAgICAgICAgICAgIHJlc3RvcmVkTWVzc2FnZUNvbnRleHQgPSB0cnVlOwotCi0gICAgICAgICAgICAgICAgLy8gVkVSWSBJTVBPUlRBTlQ6IHJlcGxhY2UgdGVzdGNhc2UncyBtZXNzYWdlY29udGV4dCBvYmplY3Qgd2l0aCB0aGUgbmV3IHJlc3RvcmVkIG9uZQotICAgICAgICAgICAgICAgIG1jID0gbXNnQ29udGV4dDI7Ci0KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcodGl0bGUgKyAiLi4uLnJlc3RvcmVkIG1lc3NhZ2UgY29udGV4dCAuLi4uLiIpOwotCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4MikgewotICAgICAgICAgICAgICAgIGlmIChzYXZlZE1lc3NhZ2VDb250ZXh0ICE9IHRydWUpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKHRpdGxlICsgIkVycm9yIHdpdGggc2F2aW5nIG1lc3NhZ2UgY29udGV4dCA9IFsiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBleDIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIDogIiArIGV4Mi5nZXRNZXNzYWdlKCkgKyAiXSIpOwotICAgICAgICAgICAgICAgICAgICBleDIucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKHRpdGxlICsgIkVycm9yIHdpdGggcmVzdG9yaW5nIG1lc3NhZ2UgY29udGV4dCA9IFsiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBleDIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIDogIiArIGV4Mi5nZXRNZXNzYWdlKCkgKyAiXSIpOwotICAgICAgICAgICAgICAgICAgICBleDIucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBpZiB0aGUgc2F2ZS9yZXN0b3JlIG9mIHRoZSBtZXNzYWdlIGNvbnRleHQgc3VjY2VlZGVkLAotICAgICAgICAgICAgLy8gdGhlbiBkb24ndCBrZWVwIHRoZSB0ZW1wb3JhcnkgZmlsZSBhcm91bmQKLSAgICAgICAgICAgIGJvb2xlYW4gcmVtb3ZlVG1wRmlsZSA9IHNhdmVkTWVzc2FnZUNvbnRleHQgJiYgcmVzdG9yZWRNZXNzYWdlQ29udGV4dDsKLSAgICAgICAgICAgIGlmIChyZW1vdmVUbXBGaWxlKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgdGhlRmlsZS5kZWxldGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGp1c3QgYWJzb3JiIGl0Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG1zZ0NvbnRleHQyOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBoYW5kbGVyIG9iamVjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvIFRoZSBoYW5kbGVyIG9iamVjdAotICAgICAqIEByZXR1cm4gVGhlIElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgaGFuZGxlciwKLSAgICAgKiAgICAgICAgIC0xIG90aGVyd2lzZQotICAgICAqLwotICAgIHByaXZhdGUgaW50IGdldEhhbmRsZXJJRChPYmplY3QgbykgewotICAgICAgICBpbnQgaWQgPSAtMTsKLQotICAgICAgICBpZiAobyBpbnN0YW5jZW9mIFRlbXBIYW5kbGVyMDEpIHsKLSAgICAgICAgICAgIGlkID0gKChUZW1wSGFuZGxlcjAxKSBvKS5nZXRJRCgpOwotICAgICAgICB9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBUZW1wSGFuZGxlcjAyKSB7Ci0gICAgICAgICAgICBpZCA9ICgoVGVtcEhhbmRsZXIwMikgbykuZ2V0SUQoKTsKLSAgICAgICAgfSBlbHNlIGlmIChvIGluc3RhbmNlb2YgVGVtcEhhbmRsZXIwMykgewotICAgICAgICAgICAgaWQgPSAoKFRlbXBIYW5kbGVyMDMpIG8pLmdldElEKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAobyBpbnN0YW5jZW9mIFRlbXBIYW5kbGVyMDQpIHsKLSAgICAgICAgICAgIGlkID0gKChUZW1wSGFuZGxlcjA0KSBvKS5nZXRJRCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGlkOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQ2hlY2sgdGhlIGhhbmRsZXIgb2JqZWN0cyB0byBzZWUgaWYgdGhleSBhcmUgZXF1aXZhbGVudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvMSBUaGUgZmlyc3QgaGFuZGxlcgotICAgICAqIEBwYXJhbSBvMiBUaGUgc2Vjb25kIGhhbmRsZXIKLSAgICAgKiBAcmV0dXJuIFRSVUUgaWYgdGhlIGhhbmRsZXIgb2JqZWN0cyBhcmUgZXF1aXZhbGVudCwKLSAgICAgKiAgICAgICAgIEZBTFNFIG90aGVyd2lzZQotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBjb21wYXJlSGFuZGxlcnMoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKLSAgICAgICAgaWYgKChvMSA9PSBudWxsKSAmJiAobzIgPT0gbnVsbCkpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKChvMSAhPSBudWxsKSAmJiAobzIgIT0gbnVsbCkpIHsKLSAgICAgICAgICAgIFN0cmluZyBjMSA9IG8xLmdldENsYXNzKCkuZ2V0TmFtZSgpOwotICAgICAgICAgICAgU3RyaW5nIGMyID0gbzIuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0KLSAgICAgICAgICAgIGlmIChjMS5lcXVhbHMoYzIpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJNZXNzYWdlY29udGV4dFNlbGZNYW5hZ2VkRGF0YVRlc3Q6OmNvbXBhcmVIYW5kbGVyczogIGNsYXNzIFsiICsKLSAgICAgICAgICAgICAgICAgICAgICAgIGMxICsgIl0gbWF0Y2ggIik7Ci0KLSAgICAgICAgICAgICAgICBpbnQgaWQxID0gZ2V0SGFuZGxlcklEKG8xKTsKLSAgICAgICAgICAgICAgICBpbnQgaWQyID0gZ2V0SGFuZGxlcklEKG8yKTsKLQotICAgICAgICAgICAgICAgIGlmIChpZDEgPT0gaWQyKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiTWVzc2FnZWNvbnRleHRTZWxmTWFuYWdlZERhdGFUZXN0Ojpjb21wYXJlSGFuZGxlcnM6ICBpZCBbIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQxICsgIl0gbWF0Y2giKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJNZXNzYWdlY29udGV4dFNlbGZNYW5hZ2VkRGF0YVRlc3Q6OmNvbXBhcmVIYW5kbGVyczogIGlkMSBbIiArIGlkMSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIl0gIT0gaWQyIFsiICsgaWQyICsgIl0gIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiTWVzc2FnZWNvbnRleHRTZWxmTWFuYWdlZERhdGFUZXN0Ojpjb21wYXJlSGFuZGxlcnM6ICBjbGFzczEgWyIgKwotICAgICAgICAgICAgICAgICAgICAgICAgYzEgKyAiXSAhPSBjbGFzczIgWyIgKyBjMiArICJdICAgIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQ29tcGFyZSB0d28gcGhhc2VzLgotICAgICAqCi0gICAgICogQHBhcmFtIG8xIFRoZSBmaXJzdCBwaGFzZSBvYmplY3QKLSAgICAgKiBAcGFyYW0gbzIgVGhlIHNlY29uZCBwaGFzZSBvYmplY3QKLSAgICAgKiBAcmV0dXJuIFRSVUUgaWYgdGhlIHBoYXNlcyBhcmUgZXF1aXZhbGVudCwKLSAgICAgKiAgICAgICAgIEZBTFNFIG90aGVyd2lzZQotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBjb21wYXJlUGhhc2VzKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7Ci0gICAgICAgIGlmICgobzEgPT0gbnVsbCkgJiYgKG8yID09IG51bGwpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoKChvMSAhPSBudWxsKSAmJiAobzIgIT0gbnVsbCkpCi0gICAgICAgICAgICAgICAgICAgICYmICgobzEgaW5zdGFuY2VvZiBQaGFzZSkgJiYgKG8yIGluc3RhbmNlb2YgUGhhc2UpKQotICAgICAgICAgICAgICAgICAgICApIHsKLSAgICAgICAgICAgICAgICBQaGFzZSBwMSA9IChQaGFzZSkgbzE7Ci0gICAgICAgICAgICAgICAgUGhhc2UgcDIgPSAoUGhhc2UpIG8yOwotCi0gICAgICAgICAgICAgICAgTGlzdCBsaXN0MSA9IHAxLmdldEhhbmRsZXJzKCk7Ci0gICAgICAgICAgICAgICAgTGlzdCBsaXN0MiA9IHAyLmdldEhhbmRsZXJzKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoKGxpc3QxID09IG51bGwpICYmIChsaXN0MiA9PSBudWxsKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoKGxpc3QxICE9IG51bGwpICYmIChsaXN0MiAhPSBudWxsKSkgewotICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZTEgPSBsaXN0MS5zaXplKCk7Ci0gICAgICAgICAgICAgICAgICAgIGludCBzaXplMiA9IGxpc3QyLnNpemUoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoc2l6ZTEgIT0gc2l6ZTIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgc2l6ZTE7IGorKykgewotICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IG9iajEgPSBsaXN0MS5nZXQoaik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qgb2JqMiA9IGxpc3QyLmdldChqKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChvYmoxID09IG51bGwpICYmIChvYmoyID09IG51bGwpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2sKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKG9iajEgIT0gbnVsbCkgJiYgKG9iajIgIT0gbnVsbCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGNoZWNrID0gZmFsc2U7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob2JqMSBpbnN0YW5jZW9mIFBoYXNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrID0gY29tcGFyZVBoYXNlcyhvYmoxLCBvYmoyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtdXN0IGJlIGEgaGFuZGxlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVjayA9IGNvbXBhcmVIYW5kbGVycyhvYmoxLCBvYmoyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hlY2sgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWlzbWF0Y2gKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvLyBpZiB3ZSBnb3QgaGVyZSwgdGhlIGNvbXBhcmlzb24gY29tcGxldGVkIG9rCi0gICAgICAgICAgICAgICAgICAgIC8vIHdpdGggYSBtYXRjaAotCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gc29tZSBlcnJvcgotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLS8qCi0gICAgcHJpdmF0ZSB2b2lkIGNvbXBhcmVQaGFzZXMoSXRlcmF0b3IgaXQsIEFycmF5TGlzdCBhbCkKLSAgICB7Ci0gICAgICAgIGludCBpdF9jb3VudCA9IC0xOwotCi0gICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGl0X2NvdW50Kys7Ci0gICAgICAgICAgICBIYW5kbGVyIGhhbmRsZXIgPSAoSGFuZGxlcilpdC5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAoaGFuZGxlciBpbnN0YW5jZW9mIFBoYXNlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbXBhcmVQaGFzZXMoKChQaGFzZSloYW5kbGVyKS5nZXRIYW5kbGVycygpLml0ZXJhdG9yKCksICgoUGhhc2UpYWwuZ2V0KGl0X2NvdW50KSkuZ2V0SGFuZGxlcnMoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGhhbmRsZXIsIChUZW1wSGFuZGxlcjAyKWFsLmdldChpdF9jb3VudCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0qLwotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gaW50ZXJuYWwgaGFuZGxlcnMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCi0gICAgLyoKLSAgICAgKiBUZW1wSGFuZGxlcjAxIHNpbXBseSBzZXRzIGFuZC9vciByZW1vdmVzIGRhdGEgZnJvbSB0aGUgTWVzc2FnZUNvbnRleHQKLSAgICAgKiBvYmplY3QuCi0gICAgICovCi0gICAgcHVibGljIGNsYXNzIFRlbXBIYW5kbGVyMDEgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIgewotICAgICAgICBwcml2YXRlIGludCBpZCA9IC0yOwotCi0gICAgICAgIHB1YmxpYyBUZW1wSGFuZGxlcjAxKCkgewotICAgICAgICAgICAgaWQgPSAtMTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBUZW1wSGFuZGxlcjAxKGludCBpZCkgewotICAgICAgICAgICAgdGhpcy5pZCA9IGlkOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBnZXRJRCgpIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLmlkOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoSW50ZWdlci50b1N0cmluZyhpZCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRUZXN0RGF0YTAxRnJvbU1lc3NhZ2VDb250ZXh0KE1lc3NhZ2VDb250ZXh0IF9tYykgewotICAgICAgICAgICAgcmV0dXJuIChTdHJpbmcpIF9tYy5nZXRTZWxmTWFuYWdlZERhdGEodGhpcy5nZXRDbGFzcygpLCBrZXkwMSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFRlc3REYXRhMDJGcm9tTWVzc2FnZUNvbnRleHQoTWVzc2FnZUNvbnRleHQgX21jKSB7Ci0gICAgICAgICAgICByZXR1cm4gKFN0cmluZykgX21jLmdldFNlbGZNYW5hZ2VkRGF0YSh0aGlzLmdldENsYXNzKCksIGtleTAyKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBieXRlIFtdIGdldFRlc3REYXRhMDNGcm9tTWVzc2FnZUNvbnRleHQoTWVzc2FnZUNvbnRleHQgX21jKSB7Ci0gICAgICAgICAgICByZXR1cm4gKGJ5dGUgW10pIF9tYy5nZXRTZWxmTWFuYWdlZERhdGEodGhpcy5nZXRDbGFzcygpLCBrZXkwMyk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgbG9uZyBbXSBnZXRUZXN0RGF0YTA0RnJvbU1lc3NhZ2VDb250ZXh0KE1lc3NhZ2VDb250ZXh0IF9tYykgewotICAgICAgICAgICAgcmV0dXJuIChsb25nIFtdKSBfbWMuZ2V0U2VsZk1hbmFnZWREYXRhKHRoaXMuZ2V0Q2xhc3MoKSwga2V5MDQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogd2UncmUganVzdCB1c2luZyB0aGUgaW52b2tlIHRvIHNldC9jaGFuZ2UvcmVtb3ZlIGRhdGEKLSAgICAgICAgICogVGVzdHM6Ci0gICAgICAgICAqIGZvciBrZXkwMTogIHNldCwgcmVtb3ZlLCBzZXQsIGdldAotICAgICAgICAgKiBmb3Iga2V5MDI6ICBzZXQsIGdldCwgc2V0Ci0gICAgICAgICAqIGZvciBrZXkwMzogIHNldCwgcmVtb3ZlLCBzZXQsIGdldAotICAgICAgICAgKiBmb3Iga2V5MDQ6ICBzZXQsIGdldCwgc2V0LCBnZXQKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBJbnZvY2F0aW9uUmVzcG9uc2UgaW52b2tlKE1lc3NhZ2VDb250ZXh0IF9tYykgdGhyb3dzIEF4aXNGYXVsdCB7Ci0KLSAgICAgICAgICAgIFN0cmluZyBkZXNjID0gIlRlbXBIYW5kbGVyMDFbaWQ9IiArIGlkICsgIl0uaW52b2tlKCkiOwotICAgICAgICAgICAgU3RyaW5nIHRpdGxlID0gIk1lc3NhZ2VDb250ZXh0U2VsZk1hbmFnZWREYXRhVGVzdDo6IiArIGRlc2M7Ci0gICAgICAgICAgICBsb2cuZGVidWcodGl0bGUpOwotCi0gICAgICAgICAgICBTdHJpbmcgdG1wID0gIndoYWFhPyI7Ci0gICAgICAgICAgICBfbWMuc2V0U2VsZk1hbmFnZWREYXRhKHRoaXMuZ2V0Q2xhc3MoKSwga2V5MDIsIHRtcCk7Ci0gICAgICAgICAgICBTdHJpbmcgZGF0YTIgPSAoU3RyaW5nKSBfbWMuZ2V0U2VsZk1hbmFnZWREYXRhKHRoaXMuZ2V0Q2xhc3MoKSwga2V5MDIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHRtcCwgZGF0YTIpOwotCi0gICAgICAgICAgICBfbWMuc2V0U2VsZk1hbmFnZWREYXRhKHRoaXMuZ2V0Q2xhc3MoKSwga2V5MDEsIHRlc3REYXRhMDEpOwotICAgICAgICAgICAgX21jLnJlbW92ZVNlbGZNYW5hZ2VkRGF0YSh0aGlzLmdldENsYXNzKCksIGtleTAxKTsKLSAgICAgICAgICAgIF9tYy5zZXRTZWxmTWFuYWdlZERhdGEodGhpcy5nZXRDbGFzcygpLCBrZXkwMSwgdGVzdERhdGEwMSk7Ci0gICAgICAgICAgICBTdHJpbmcgZGF0YTEgPSAoU3RyaW5nKSBfbWMuZ2V0U2VsZk1hbmFnZWREYXRhKHRoaXMuZ2V0Q2xhc3MoKSwga2V5MDEpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGRhdGExLCB0ZXN0RGF0YTAxKTsKLQotICAgICAgICAgICAgX21jLnNldFNlbGZNYW5hZ2VkRGF0YSh0aGlzLmdldENsYXNzKCksIGtleTAyLCB0ZXN0RGF0YTAyKTsKLQotICAgICAgICAgICAgX21jLnNldFNlbGZNYW5hZ2VkRGF0YSh0aGlzLmdldENsYXNzKCksIGtleTAzLCB0ZXN0RGF0YTAzKTsKLSAgICAgICAgICAgIGJ5dGUgW10gZGF0YTMgPSAoYnl0ZSBbXSkgX21jLmdldFNlbGZNYW5hZ2VkRGF0YSh0aGlzLmdldENsYXNzKCksIGtleTAzKTsKLSAgICAgICAgICAgIGJvb2xlYW4gaXNPazMgPSBpc0VxdWFscyhkYXRhMywgdGVzdERhdGEwMyk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGlzT2szKTsKLQotICAgICAgICAgICAgX21jLnJlbW92ZVNlbGZNYW5hZ2VkRGF0YSh0aGlzLmdldENsYXNzKCksIGtleTAzKTsKLSAgICAgICAgICAgIF9tYy5zZXRTZWxmTWFuYWdlZERhdGEodGhpcy5nZXRDbGFzcygpLCBrZXkwMywgdGVzdERhdGEwMyk7Ci0KLSAgICAgICAgICAgIF9tYy5zZXRTZWxmTWFuYWdlZERhdGEodGhpcy5nZXRDbGFzcygpLCBrZXkwNCwgdGVzdERhdGEwNCk7Ci0gICAgICAgICAgICBsb25nIFtdIGRhdGE0ID0gKGxvbmcgW10pIF9tYy5nZXRTZWxmTWFuYWdlZERhdGEodGhpcy5nZXRDbGFzcygpLCBrZXkwNCk7Ci0gICAgICAgICAgICBib29sZWFuIGlzT2s0ID0gaXNFcXVhbHMoZGF0YTQsIHRlc3REYXRhMDQpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShpc09rNCk7Ci0KLSAgICAgICAgICAgIGludm9rZWNhbGxjb3VudCsrOwotCi0gICAgICAgICAgICBsb2cuZGVidWcodGl0bGUgKyAiOiBDb21wbGV0ZWQiKTsKLSAgICAgICAgICAgIHJldHVybiBJbnZvY2F0aW9uUmVzcG9uc2UuQ09OVElOVUU7Ci0gICAgICAgIH0KLQotICAgIH0KLQotCi0gICAgLyoKLSAgICAgKiBUZW1wSGFuZGxlcjAyIHNldHMgZGF0YSwgc2F2ZXMgaXQgKHZpYSB0aGUgc2VyaWFsaXplU2VsZk1hbmFnZWREYXRhIG1ldGhvZAotICAgICAqIGNhbGxlZCBieSB0aGUgTWVzc2FnZUNvbnRleHQgb2JqZWN0IHdoZW4gc2F2ZWQgaW4gdGhpcyBoYW5kbGVyJ3MgaW52b2tlKCkpLAotICAgICAqIAotICAgICAqLwotICAgIHB1YmxpYyBjbGFzcyBUZW1wSGFuZGxlcjAyIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyIGltcGxlbWVudHMgU2VsZk1hbmFnZWREYXRhTWFuYWdlciB7Ci0gICAgICAgIHByaXZhdGUgaW50IGlkID0gLTI7Ci0gICAgICAgIHByaXZhdGUgaW50IHNlcmlhbGl6ZWNhbGxjb3VudCA9IDA7Ci0gICAgICAgIHByaXZhdGUgaW50IGRlc2VyaWFsaXplY2FsbGNvdW50ID0gMDsKLSAgICAgICAgcHVibGljIFN0cmluZyB0ZXN0RGF0YSA9IG5ldyBTdHJpbmcoInRoaXMgaXMgc29tZSB0ZXN0IGRhdGEiKTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBjb25zdHJ1Y3RvcgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFRlbXBIYW5kbGVyMDIoKSB7Ci0gICAgICAgICAgICB0aGlzLmlkID0gLTE7Ci0gICAgICAgICAgICB0aGlzLnNlcmlhbGl6ZWNhbGxjb3VudCA9IDA7Ci0gICAgICAgICAgICB0aGlzLmRlc2VyaWFsaXplY2FsbGNvdW50ID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIGNvbnN0cnVjdG9yCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgVGVtcEhhbmRsZXIwMihpbnQgaWQpIHsKLSAgICAgICAgICAgIHRoaXMuaWQgPSBpZDsKLSAgICAgICAgICAgIHRoaXMuc2VyaWFsaXplY2FsbGNvdW50ID0gMDsKLSAgICAgICAgICAgIHRoaXMuZGVzZXJpYWxpemVjYWxsY291bnQgPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBnZXRJRCgpIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLmlkOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoSW50ZWdlci50b1N0cmluZyhpZCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRUZXN0RGF0YUZyb21NZXNzYWdlQ29udGV4dChNZXNzYWdlQ29udGV4dCBfbWMpIHsKLSAgICAgICAgICAgIHJldHVybiAoU3RyaW5nKSBfbWMuZ2V0U2VsZk1hbmFnZWREYXRhKHRoaXMuZ2V0Q2xhc3MoKSwgSW50ZWdlci50b1N0cmluZyhpZCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogIChub24tSmF2YWRvYykKLSAgICAgICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5IYW5kbGVyI2ludm9rZShvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQpCi0gICAgICAgICAqIAotICAgICAgICAgKiBUaGlzIGludm9rZSgpIG1ldGhvZCB3aWxsIHRlc3Qgc2V2ZXJhbCB0aGluZ3M6Ci0gICAgICAgICAqIDEuICB2ZXJpZnkgdGhhdCBzZXJpYWxpemVTZWxmTWFuYWdlZERhdGEgaXMgYWN0dWFsbHkgY2FsbGVkIHdoZW4gc2F2aW5nIHRoZSBNZXNzYWdlQ29udGV4dCBvYmplY3QKLSAgICAgICAgICogMi4gIHZlcmlmeSB0aGF0IGRlc2VyaWFsaXplU2VsZk1hbmFnZWREYXRhIGlzIGFjdHVhbGx5IGNhbGxlZCB3aGVuIHJlc3RvcmluZyB0aGUgTWVzc2FnZUNvbnRleHQgb2JqZWN0Ci0gICAgICAgICAqIDMuICB2ZXJpZnkgdGhhdCBhbnkgU2VsZk1hbmFnZWREYXRhIHN0b3JlZCBpbiB0aGUgTWVzc2FnZUNvbnRleHQgaXMgcHJvcGVybHkgc2F2ZWQvcmVzdG9yZWQgKHZpYSBzZXJpYWxpemVTZWxmTWFuYWdlZERhdGEvZGVzZXJpYWxpemVTZWxmTWFuYWdlZERhdGEpCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgSW52b2NhdGlvblJlc3BvbnNlIGludm9rZShNZXNzYWdlQ29udGV4dCBfbWMpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICAgICAgU3RyaW5nIGRlc2MgPSAiVGVtcEhhbmRsZXIwMltpZD0iICsgaWQgKyAiXS5pbnZva2UoKSI7Ci0gICAgICAgICAgICBTdHJpbmcgdGl0bGUgPSAiTWVzc2FnZUNvbnRleHRTZWxmTWFuYWdlZERhdGFUZXN0OjoiICsgZGVzYzsKLSAgICAgICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSk7Ci0KLSAgICAgICAgICAgIE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQyID0gbnVsbDsgIC8vIHRoaXMgd2lsbCBiZSB0aGUgcmVzdG9yZWQgb25lCi0KLSAgICAgICAgICAgIF9tYy5zZXRTZWxmTWFuYWdlZERhdGEodGhpcy5nZXRDbGFzcygpLCBJbnRlZ2VyLnRvU3RyaW5nKGlkKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdERhdGEgKyBJbnRlZ2VyLnRvU3RyaW5nKGlkKSk7Ci0KLSAgICAgICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArICI6ICAgU2V0dGluZyBzZWxmIG1hbmFnZWQgZGF0YSB1c2luZyBrZXkgWyIgKwotICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKGlkKSArICJdIik7Ci0KLSAgICAgICAgICAgIG1zZ0NvbnRleHQyID0gc2F2ZUFuZFJlc3RvcmUoX21jLCAiVGVtcEhhbmRsZXIwMl8iLCBkZXNjKTsKLQotICAgICAgICAgICAgYm9vbGVhbiByZXN1bHQgPSAobXNnQ29udGV4dDIgIT0gbnVsbCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdCk7Ci0KLSAgICAgICAgICAgIGludm9rZWNhbGxjb3VudCsrOwotCi0gICAgICAgICAgICBsb2cuZGVidWcodGl0bGUgKyAiOiBDb21wbGV0ZWQiKTsKLSAgICAgICAgICAgIHJldHVybiBJbnZvY2F0aW9uUmVzcG9uc2UuQ09OVElOVUU7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGRlc2VyaWFsaXplU2VsZk1hbmFnZWREYXRhKEJ5dGVBcnJheUlucHV0U3RyZWFtIGRhdGEsIE1lc3NhZ2VDb250ZXh0IF9tYykKLSAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgZGVzZXJpYWxpemVjYWxsY291bnQrKzsKLQotICAgICAgICAgICAgU3RyaW5nIGRlc2MgPSAiVGVtcEhhbmRsZXIwMltpZD0iICsgaWQgKyAiXS5kZXNlcmlhbGl6ZVNlbGZNYW5hZ2VkRGF0YSgpICAgY291bnQgWyIgKwotICAgICAgICAgICAgICAgICAgICBkZXNlcmlhbGl6ZWNhbGxjb3VudCArICJdIjsKLSAgICAgICAgICAgIFN0cmluZyB0aXRsZSA9ICJNZXNzYWdlQ29udGV4dFNlbGZNYW5hZ2VkRGF0YVRlc3Q6OiIgKyBkZXNjOwotICAgICAgICAgICAgbG9nLmRlYnVnKHRpdGxlKTsKLQotICAgICAgICAgICAgT2JqZWN0SW5wdXRTdHJlYW0gb2lzID0gbmV3IE9iamVjdElucHV0U3RyZWFtKGRhdGEpOwotICAgICAgICAgICAgdGVzdERhdGEgPSBvaXMucmVhZFVURigpLmNvbmNhdCgiIHdpdGggZXh0cmEgdGV4dCAiICsgSW50ZWdlci50b1N0cmluZyhpZCkpOwotICAgICAgICAgICAgX21jLnNldFNlbGZNYW5hZ2VkRGF0YSh0aGlzLmdldENsYXNzKCksIEludGVnZXIudG9TdHJpbmcoaWQpLCB0ZXN0RGF0YSk7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlc3RvcmVUcmFuc2llbnREYXRhKE1lc3NhZ2VDb250ZXh0IF9tYykgewotICAgICAgICAgICAgLy8gbm90IG5lY2Vzc2FyeSB0byB0ZXN0Ci0gICAgICAgIH0KLQotCi0gICAgICAgIHB1YmxpYyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gc2VyaWFsaXplU2VsZk1hbmFnZWREYXRhKE1lc3NhZ2VDb250ZXh0IF9tYykKLSAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgc2VyaWFsaXplY2FsbGNvdW50Kys7Ci0KLSAgICAgICAgICAgIFN0cmluZyBkZXNjID0gIlRlbXBIYW5kbGVyMDJbaWQ9IiArIGlkICsgIl0uc2VyaWFsaXplU2VsZk1hbmFnZWREYXRhKCkgICBjb3VudCBbIiArCi0gICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWNhbGxjb3VudCArICJdIjsKLSAgICAgICAgICAgIFN0cmluZyB0aXRsZSA9ICJNZXNzYWdlQ29udGV4dFNlbGZNYW5hZ2VkRGF0YVRlc3Q6OiIgKyBkZXNjOwotICAgICAgICAgICAgbG9nLmRlYnVnKHRpdGxlKTsKLQotICAgICAgICAgICAgU3RyaW5nIHN0b3JlZFRlc3REYXRhID0KLSAgICAgICAgICAgICAgICAgICAgKFN0cmluZykgX21jLmdldFNlbGZNYW5hZ2VkRGF0YSh0aGlzLmdldENsYXNzKCksIEludGVnZXIudG9TdHJpbmcoaWQpKTsKLSAgICAgICAgICAgIGlmIChzdG9yZWRUZXN0RGF0YSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKHRpdGxlICsgIjogIE5vIHNlbGYgbWFuYWdlZCBkYXRhIHRvIHNlcmlhbGl6ZSIpOwotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgICAgIE9iamVjdE91dHB1dFN0cmVhbSBvb3MgPSBuZXcgT2JqZWN0T3V0cHV0U3RyZWFtKGJhb3MpOwotICAgICAgICAgICAgb29zLndyaXRlVVRGKHN0b3JlZFRlc3REYXRhKTsKLSAgICAgICAgICAgIG9vcy5jbG9zZSgpOwotICAgICAgICAgICAgaW50IGJhb3Nfc2l6ZSA9IGJhb3Muc2l6ZSgpOwotICAgICAgICAgICAgYmFvcy5jbG9zZSgpOwotCi0gICAgICAgICAgICBsb2cuZGVidWcodGl0bGUgKyAiOiBzYXZlZCBzZWxmIG1hbmFnZWQgZGF0YSBzdHJpbmcgbGVuZ3RoIFsiICsKLSAgICAgICAgICAgICAgICAgICAgc3RvcmVkVGVzdERhdGEubGVuZ3RoKCkgKyAiXSIpOwotICAgICAgICAgICAgbG9nLmRlYnVnKHRpdGxlICsKLSAgICAgICAgICAgICAgICAgICAgIjogc2F2ZWQgc2VsZiBtYW5hZ2VkIGRhdGEgYnl0ZSBhcnJheSBvdXRwdXQgc3RyZWFtIChVVEYpIGxlbmd0aCBbIiArCi0gICAgICAgICAgICAgICAgICAgIGJhb3Nfc2l6ZSArICJdIik7Ci0gICAgICAgICAgICByZXR1cm4gYmFvczsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0RGVzZXJpYWxpemVjYWxsY291bnQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gZGVzZXJpYWxpemVjYWxsY291bnQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IGdldFNlcmlhbGl6ZWNhbGxjb3VudCgpIHsKLSAgICAgICAgICAgIHJldHVybiBzZXJpYWxpemVjYWxsY291bnQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8qCi0gICAgICogVGVtcEhhbmRsZXIwMyBzZXRzIGJpbmFyeSBkYXRhLCBzYXZlcyBpdCAodmlhIHRoZSBzZXJpYWxpemVTZWxmTWFuYWdlZERhdGEgbWV0aG9kCi0gICAgICogY2FsbGVkIGJ5IHRoZSBNZXNzYWdlQ29udGV4dCBvYmplY3Qgd2hlbiBzYXZlZCBpbiB0aGlzIGhhbmRsZXIncyBpbnZva2UoKSksCi0gICAgICogCi0gICAgICovCi0gICAgcHVibGljIGNsYXNzIFRlbXBIYW5kbGVyMDMgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIgaW1wbGVtZW50cyBTZWxmTWFuYWdlZERhdGFNYW5hZ2VyIHsKLSAgICAgICAgcHJpdmF0ZSBpbnQgaWQgPSAtMjsKLSAgICAgICAgcHJpdmF0ZSBpbnQgc2VyaWFsaXplY2FsbGNvdW50ID0gMDsKLSAgICAgICAgcHJpdmF0ZSBpbnQgZGVzZXJpYWxpemVjYWxsY291bnQgPSAwOwotCi0gICAgICAgIHB1YmxpYyBUZW1wSGFuZGxlcjAzKCkgewotICAgICAgICAgICAgaWQgPSAtMTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBUZW1wSGFuZGxlcjAzKGludCBpZCkgewotICAgICAgICAgICAgdGhpcy5pZCA9IGlkOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBnZXRJRCgpIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLmlkOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoSW50ZWdlci50b1N0cmluZyhpZCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCBnZXRUZXN0RGF0YUZyb21NZXNzYWdlQ29udGV4dChNZXNzYWdlQ29udGV4dCBfbWMpIHsKLSAgICAgICAgICAgIHJldHVybiBfbWMuZ2V0U2VsZk1hbmFnZWREYXRhKHRoaXMuZ2V0Q2xhc3MoKSwgSW50ZWdlci50b1N0cmluZyhpZCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogIChub24tSmF2YWRvYykKLSAgICAgICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5IYW5kbGVyI2ludm9rZShvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQpCi0gICAgICAgICAqIAotICAgICAgICAgKiBUaGlzIGludm9rZSgpIG1ldGhvZCB3aWxsIHRlc3Qgc2V2ZXJhbCB0aGluZ3M6Ci0gICAgICAgICAqIDEuICB2ZXJpZnkgdGhhdCBzZXJpYWxpemVTZWxmTWFuYWdlZERhdGEgaXMgYWN0dWFsbHkgY2FsbGVkIHdoZW4gc2F2aW5nIHRoZSBNZXNzYWdlQ29udGV4dCBvYmplY3QKLSAgICAgICAgICogMi4gIHZlcmlmeSB0aGF0IGRlc2VyaWFsaXplU2VsZk1hbmFnZWREYXRhIGlzIGFjdHVhbGx5IGNhbGxlZCB3aGVuIHJlc3RvcmluZyB0aGUgTWVzc2FnZUNvbnRleHQgb2JqZWN0Ci0gICAgICAgICAqIDMuICB2ZXJpZnkgdGhhdCBhbnkgU2VsZk1hbmFnZWREYXRhIHN0b3JlZCBpbiB0aGUgTWVzc2FnZUNvbnRleHQgaXMgcHJvcGVybHkgc2F2ZWQvcmVzdG9yZWQgKHZpYSBzZXJpYWxpemVTZWxmTWFuYWdlZERhdGEvZGVzZXJpYWxpemVTZWxmTWFuYWdlZERhdGEpCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgSW52b2NhdGlvblJlc3BvbnNlIGludm9rZShNZXNzYWdlQ29udGV4dCBfbWMpIHRocm93cyBBeGlzRmF1bHQgewotCi0gICAgICAgICAgICBTdHJpbmcgZGVzYyA9ICJUZW1wSGFuZGxlcjAzW2lkPSIgKyBpZCArICJdLmludm9rZSgpIjsKLSAgICAgICAgICAgIFN0cmluZyB0aXRsZSA9ICJNZXNzYWdlQ29udGV4dFNlbGZNYW5hZ2VkRGF0YVRlc3Q6OiIgKyBkZXNjOwotICAgICAgICAgICAgbG9nLmRlYnVnKHRpdGxlKTsKLQotICAgICAgICAgICAgTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dDIgPSBudWxsOyAgLy8gdGhpcyB3aWxsIGJlIHRoZSByZXN0b3JlZCBvbmUKLQotICAgICAgICAgICAgLy8gYWRkIHRoZSBieXRlIFtdIG9mIGRhdGEKLSAgICAgICAgICAgIF9tYy5zZXRTZWxmTWFuYWdlZERhdGEodGhpcy5nZXRDbGFzcygpLCBJbnRlZ2VyLnRvU3RyaW5nKGlkKSwgdGVzdERhdGEwMyk7Ci0KLSAgICAgICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArICI6ICAgU2V0dGluZyBzZWxmIG1hbmFnZWQgZGF0YSB1c2luZyBrZXkgWyIgKwotICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKGlkKSArICJdIik7Ci0KLSAgICAgICAgICAgIG1zZ0NvbnRleHQyID0gc2F2ZUFuZFJlc3RvcmUoX21jLCAiVGVtcEhhbmRsZXIwM18iLCBkZXNjKTsKLQotICAgICAgICAgICAgYm9vbGVhbiByZXN1bHQgPSAobXNnQ29udGV4dDIgIT0gbnVsbCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdCk7Ci0KLSAgICAgICAgICAgIGludm9rZWNhbGxjb3VudCsrOwotCi0gICAgICAgICAgICBsb2cuZGVidWcodGl0bGUgKyAiOiBDb21wbGV0ZWQiKTsKLSAgICAgICAgICAgIHJldHVybiBJbnZvY2F0aW9uUmVzcG9uc2UuQ09OVElOVUU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBkZXNlcmlhbGl6ZVNlbGZNYW5hZ2VkRGF0YShCeXRlQXJyYXlJbnB1dFN0cmVhbSBkYXRhLCBNZXNzYWdlQ29udGV4dCBfbWMpCi0gICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGJvb2xlYW4gaXNPSyA9IHRydWU7Ci0KLSAgICAgICAgICAgIGRlc2VyaWFsaXplY2FsbGNvdW50Kys7Ci0KLSAgICAgICAgICAgIFN0cmluZyBkZXNjID0gIlRlbXBIYW5kbGVyMDNbaWQ9IiArIGlkICsgIl0uZGVzZXJpYWxpemVTZWxmTWFuYWdlZERhdGEoKSAgIGNvdW50IFsiICsKLSAgICAgICAgICAgICAgICAgICAgZGVzZXJpYWxpemVjYWxsY291bnQgKyAiXSI7Ci0gICAgICAgICAgICBTdHJpbmcgdGl0bGUgPSAiTWVzc2FnZUNvbnRleHRTZWxmTWFuYWdlZERhdGFUZXN0OjoiICsgZGVzYzsKLSAgICAgICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSk7Ci0KLSAgICAgICAgICAgIGludCBleHBlY3RlZCA9IHRlc3REYXRhMDMubGVuZ3RoOwotCi0gICAgICAgICAgICBieXRlIFtdIHRtcCA9IG5ldyBieXRlIFtleHBlY3RlZF07Ci0KLSAgICAgICAgICAgIGJvb2xlYW4ga2VlcEdvaW5nID0gdHJ1ZTsKLSAgICAgICAgICAgIGludCBpbmRleCA9IDA7Ci0KLSAgICAgICAgICAgIHdoaWxlIChrZWVwR29pbmcpIHsKLSAgICAgICAgICAgICAgICBpbnQgdG1wZGF0YSA9IGRhdGEucmVhZCgpOwotCi0gICAgICAgICAgICAgICAgaWYgKHRtcGRhdGEgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgSW50ZWdlciB2YWx1ZSA9IG5ldyBJbnRlZ2VyKHRtcGRhdGEpOwotICAgICAgICAgICAgICAgICAgICB0bXBbaW5kZXhdID0gdmFsdWUuYnl0ZVZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGluZGV4Kys7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID4gZXhwZWN0ZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlzT0sgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoaXNPSyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBrZWVwR29pbmcgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlzT0sgPSBpc0VxdWFscyh0bXAsIHRlc3REYXRhMDMpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShpc09LKTsKLQotICAgICAgICAgICAgX21jLnNldFNlbGZNYW5hZ2VkRGF0YSh0aGlzLmdldENsYXNzKCksIEludGVnZXIudG9TdHJpbmcoaWQpLCB0bXApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcmVzdG9yZVRyYW5zaWVudERhdGEoTWVzc2FnZUNvbnRleHQgX21jKSB7Ci0gICAgICAgICAgICAvLyBub3QgbmVjZXNzYXJ5IHRvIHRlc3QKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gc2VyaWFsaXplU2VsZk1hbmFnZWREYXRhKE1lc3NhZ2VDb250ZXh0IF9tYykKLSAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotCi0gICAgICAgICAgICBzZXJpYWxpemVjYWxsY291bnQrKzsKLQotICAgICAgICAgICAgU3RyaW5nIGRlc2MgPSAiVGVtcEhhbmRsZXIwM1tpZD0iICsgaWQgKyAiXS5zZXJpYWxpemVTZWxmTWFuYWdlZERhdGEoKSAgIGNvdW50IFsiICsKLSAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplY2FsbGNvdW50ICsgIl0iOwotICAgICAgICAgICAgU3RyaW5nIHRpdGxlID0gIk1lc3NhZ2VDb250ZXh0U2VsZk1hbmFnZWREYXRhVGVzdDo6IiArIGRlc2M7Ci0gICAgICAgICAgICBsb2cuZGVidWcodGl0bGUpOwotCi0gICAgICAgICAgICBieXRlIFtdIHRtcCA9IChieXRlIFtdKSBfbWMuZ2V0U2VsZk1hbmFnZWREYXRhKHRoaXMuZ2V0Q2xhc3MoKSwgSW50ZWdlci50b1N0cmluZyhpZCkpOwotCi0gICAgICAgICAgICBpZiAodG1wID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcodGl0bGUgKyAiOiAgTm8gc2VsZiBtYW5hZ2VkIGRhdGEgdG8gc2VyaWFsaXplIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICAgICAgYmFvcy53cml0ZSh0bXAsIDAsIHRtcC5sZW5ndGgpOwotICAgICAgICAgICAgaW50IGJhb3Nfc2l6ZSA9IGJhb3Muc2l6ZSgpOwotICAgICAgICAgICAgYmFvcy5jbG9zZSgpOwotCi0gICAgICAgICAgICBsb2cuZGVidWcodGl0bGUgKyAiOiBzYXZlZCBzZWxmIG1hbmFnZWQgZGF0YSBieXRlIFtdIGxlbmd0aCBbIiArIHRtcC5sZW5ndGggKyAiXSIpOwotICAgICAgICAgICAgbG9nLmRlYnVnKHRpdGxlICsKLSAgICAgICAgICAgICAgICAgICAgIjogc2F2ZWQgc2VsZiBtYW5hZ2VkIGRhdGEgYnl0ZSBhcnJheSBvdXRwdXQgc3RyZWFtIGxlbmd0aCBbIiArIGJhb3Nfc2l6ZSArCi0gICAgICAgICAgICAgICAgICAgICJdIik7Ci0gICAgICAgICAgICByZXR1cm4gYmFvczsKLSAgICAgICAgfQotCi0KLSAgICAgICAgcHVibGljIGludCBnZXREZXNlcmlhbGl6ZWNhbGxjb3V0KCkgewotICAgICAgICAgICAgcmV0dXJuIGRlc2VyaWFsaXplY2FsbGNvdW50OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBnZXRTZXJpYWxpemVjYWxsY291bnQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gc2VyaWFsaXplY2FsbGNvdW50OwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICAvKgotICAgICAqIFRlbXBIYW5kbGVyMDQgc2V0cyBiaW5hcnkgZGF0YSwgc2F2ZXMgaXQgKHZpYSB0aGUgc2VyaWFsaXplU2VsZk1hbmFnZWREYXRhIG1ldGhvZAotICAgICAqIGNhbGxlZCBieSB0aGUgTWVzc2FnZUNvbnRleHQgb2JqZWN0IHdoZW4gc2F2ZWQgaW4gdGhpcyBoYW5kbGVyJ3MgaW52b2tlKCkpLAotICAgICAqIAotICAgICAqLwotICAgIHB1YmxpYyBjbGFzcyBUZW1wSGFuZGxlcjA0IGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyIGltcGxlbWVudHMgU2VsZk1hbmFnZWREYXRhTWFuYWdlciB7Ci0gICAgICAgIHByaXZhdGUgaW50IGlkID0gLTI7Ci0gICAgICAgIHByaXZhdGUgaW50IHNlcmlhbGl6ZWNhbGxjb3VudCA9IDA7Ci0gICAgICAgIHByaXZhdGUgaW50IGRlc2VyaWFsaXplY2FsbGNvdW50ID0gMDsKLQotCi0gICAgICAgIHB1YmxpYyBUZW1wSGFuZGxlcjA0KCkgewotICAgICAgICAgICAgaWQgPSAtMTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBUZW1wSGFuZGxlcjA0KGludCBpZCkgewotICAgICAgICAgICAgdGhpcy5pZCA9IGlkOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBnZXRJRCgpIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLmlkOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoSW50ZWdlci50b1N0cmluZyhpZCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCBnZXRUZXN0RGF0YUZyb21NZXNzYWdlQ29udGV4dChNZXNzYWdlQ29udGV4dCBfbWMpIHsKLSAgICAgICAgICAgIHJldHVybiBfbWMuZ2V0U2VsZk1hbmFnZWREYXRhKHRoaXMuZ2V0Q2xhc3MoKSwgSW50ZWdlci50b1N0cmluZyhpZCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogIChub24tSmF2YWRvYykKLSAgICAgICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5IYW5kbGVyI2ludm9rZShvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQpCi0gICAgICAgICAqIAotICAgICAgICAgKiBUaGlzIGludm9rZSgpIG1ldGhvZCB3aWxsIHRlc3Qgc2V2ZXJhbCB0aGluZ3M6Ci0gICAgICAgICAqIDEuICB2ZXJpZnkgdGhhdCBzZXJpYWxpemVTZWxmTWFuYWdlZERhdGEgaXMgYWN0dWFsbHkgY2FsbGVkIHdoZW4gc2F2aW5nIHRoZSBNZXNzYWdlQ29udGV4dCBvYmplY3QKLSAgICAgICAgICogMi4gIHZlcmlmeSB0aGF0IGRlc2VyaWFsaXplU2VsZk1hbmFnZWREYXRhIGlzIGFjdHVhbGx5IGNhbGxlZCB3aGVuIHJlc3RvcmluZyB0aGUgTWVzc2FnZUNvbnRleHQgb2JqZWN0Ci0gICAgICAgICAqIDMuICB2ZXJpZnkgdGhhdCBhbnkgU2VsZk1hbmFnZWREYXRhIHN0b3JlZCBpbiB0aGUgTWVzc2FnZUNvbnRleHQgaXMgcHJvcGVybHkgc2F2ZWQvcmVzdG9yZWQgKHZpYSBzZXJpYWxpemVTZWxmTWFuYWdlZERhdGEvZGVzZXJpYWxpemVTZWxmTWFuYWdlZERhdGEpCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgSW52b2NhdGlvblJlc3BvbnNlIGludm9rZShNZXNzYWdlQ29udGV4dCBfbWMpIHRocm93cyBBeGlzRmF1bHQgewotCi0gICAgICAgICAgICBTdHJpbmcgZGVzYyA9ICJUZW1wSGFuZGxlcjA0W2lkPSIgKyBpZCArICJdLmludm9rZSgpIjsKLSAgICAgICAgICAgIFN0cmluZyB0aXRsZSA9ICJNZXNzYWdlQ29udGV4dFNlbGZNYW5hZ2VkRGF0YVRlc3Q6OiIgKyBkZXNjOwotICAgICAgICAgICAgbG9nLmRlYnVnKHRpdGxlKTsKLQotICAgICAgICAgICAgTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dDIgPSBudWxsOyAgLy8gdGhpcyB3aWxsIGJlIHRoZSByZXN0b3JlZCBvbmUKLQotICAgICAgICAgICAgLy8gYWRkIHRoZSBieXRlIFtdIG9mIGRhdGEKLSAgICAgICAgICAgIF9tYy5zZXRTZWxmTWFuYWdlZERhdGEodGhpcy5nZXRDbGFzcygpLCBJbnRlZ2VyLnRvU3RyaW5nKGlkKSwgdGVzdERhdGEwNCk7Ci0KLSAgICAgICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArICI6ICAgU2V0dGluZyBzZWxmIG1hbmFnZWQgZGF0YSB1c2luZyBrZXkgWyIgKwotICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKGlkKSArICJdIik7Ci0KLSAgICAgICAgICAgIG1zZ0NvbnRleHQyID0gc2F2ZUFuZFJlc3RvcmUoX21jLCAiVGVtcEhhbmRsZXIwNF8iLCBkZXNjKTsKLQotICAgICAgICAgICAgYm9vbGVhbiByZXN1bHQgPSAobXNnQ29udGV4dDIgIT0gbnVsbCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdCk7Ci0KLSAgICAgICAgICAgIGludm9rZWNhbGxjb3VudCsrOwotCi0gICAgICAgICAgICBsb2cuZGVidWcodGl0bGUgKyAiOiBDb21wbGV0ZWQiKTsKLSAgICAgICAgICAgIHJldHVybiBJbnZvY2F0aW9uUmVzcG9uc2UuQ09OVElOVUU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBkZXNlcmlhbGl6ZVNlbGZNYW5hZ2VkRGF0YShCeXRlQXJyYXlJbnB1dFN0cmVhbSBkYXRhLCBNZXNzYWdlQ29udGV4dCBfbWMpCi0gICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGJvb2xlYW4gaXNPSyA9IHRydWU7Ci0KLSAgICAgICAgICAgIGRlc2VyaWFsaXplY2FsbGNvdW50Kys7Ci0KLSAgICAgICAgICAgIFN0cmluZyBkZXNjID0gIlRlbXBIYW5kbGVyMDRbaWQ9IiArIGlkICsgIl0uZGVzZXJpYWxpemVTZWxmTWFuYWdlZERhdGEoKSAgIGNvdW50IFsiICsKLSAgICAgICAgICAgICAgICAgICAgZGVzZXJpYWxpemVjYWxsY291bnQgKyAiXSI7Ci0gICAgICAgICAgICBTdHJpbmcgdGl0bGUgPSAiTWVzc2FnZUNvbnRleHRTZWxmTWFuYWdlZERhdGFUZXN0OjoiICsgZGVzYzsKLSAgICAgICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSk7Ci0KLSAgICAgICAgICAgIGludCBleHBlY3RlZCA9IHRlc3REYXRhMDQubGVuZ3RoOwotCi0gICAgICAgICAgICBsb25nIFtdIHRtcCA9IG5ldyBsb25nIFtleHBlY3RlZF07Ci0KLSAgICAgICAgICAgIE9iamVjdElucHV0U3RyZWFtIG9pcyA9IG5ldyBPYmplY3RJbnB1dFN0cmVhbShkYXRhKTsKLQotICAgICAgICAgICAgYm9vbGVhbiBrZWVwR29pbmcgPSB0cnVlOwotICAgICAgICAgICAgaW50IGluZGV4ID0gMDsKLQotICAgICAgICAgICAgaW50IHNpemVXcml0dGVuID0gb2lzLnJlYWRJbnQoKTsKLQotICAgICAgICAgICAgaWYgKHNpemVXcml0dGVuID4gMCkgewotICAgICAgICAgICAgICAgIHdoaWxlIChrZWVwR29pbmcpIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgdG1wZGF0YSA9IG9pcy5yZWFkTG9uZygpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICB0bXBbaW5kZXhdID0gdG1wZGF0YTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4Kys7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA+IGV4cGVjdGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNPSyA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoaXNPSyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleGMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGtlZXBHb2luZyA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaXNPSyA9IGlzRXF1YWxzKHRtcCwgdGVzdERhdGEwNCk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShpc09LKTsKLQotICAgICAgICAgICAgICAgIF9tYy5zZXRTZWxmTWFuYWdlZERhdGEodGhpcy5nZXRDbGFzcygpLCBJbnRlZ2VyLnRvU3RyaW5nKGlkKSwgdG1wKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcmVzdG9yZVRyYW5zaWVudERhdGEoTWVzc2FnZUNvbnRleHQgX21jKSB7Ci0gICAgICAgICAgICAvLyBub3QgbmVjZXNzYXJ5IHRvIHRlc3QKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gc2VyaWFsaXplU2VsZk1hbmFnZWREYXRhKE1lc3NhZ2VDb250ZXh0IF9tYykKLSAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotCi0gICAgICAgICAgICBzZXJpYWxpemVjYWxsY291bnQrKzsKLQotICAgICAgICAgICAgU3RyaW5nIGRlc2MgPSAiVGVtcEhhbmRsZXIwNFtpZD0iICsgaWQgKyAiXS5zZXJpYWxpemVTZWxmTWFuYWdlZERhdGEoKSAgIGNvdW50IFsiICsKLSAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplY2FsbGNvdW50ICsgIl0iOwotICAgICAgICAgICAgU3RyaW5nIHRpdGxlID0gIk1lc3NhZ2VDb250ZXh0U2VsZk1hbmFnZWREYXRhVGVzdDo6IiArIGRlc2M7Ci0gICAgICAgICAgICBsb2cuZGVidWcodGl0bGUpOwotCi0gICAgICAgICAgICBsb25nIFtdIHRtcCA9IChsb25nIFtdKSBfbWMuZ2V0U2VsZk1hbmFnZWREYXRhKHRoaXMuZ2V0Q2xhc3MoKSwgSW50ZWdlci50b1N0cmluZyhpZCkpOwotCi0gICAgICAgICAgICBpZiAodG1wID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcodGl0bGUgKyAiOiAgTm8gc2VsZiBtYW5hZ2VkIGRhdGEgdG8gc2VyaWFsaXplIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICAgICAgT2JqZWN0T3V0cHV0U3RyZWFtIG9vcyA9IG5ldyBPYmplY3RPdXRwdXRTdHJlYW0oYmFvcyk7Ci0KLSAgICAgICAgICAgIGludCBzaXplID0gdG1wLmxlbmd0aDsKLQotICAgICAgICAgICAgb29zLndyaXRlSW50KHNpemUpOwotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgICAgICAgIG9vcy53cml0ZUxvbmcodG1wW2ldKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgb29zLmNsb3NlKCk7Ci0gICAgICAgICAgICBpbnQgYmFvc19zaXplID0gYmFvcy5zaXplKCk7Ci0gICAgICAgICAgICBiYW9zLmNsb3NlKCk7Ci0KLSAgICAgICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArICI6IHNhdmVkIHNlbGYgbWFuYWdlZCBkYXRhIGJ5dGUgW10gbGVuZ3RoIFsiICsgdG1wLmxlbmd0aCArICJdIik7Ci0gICAgICAgICAgICBsb2cuZGVidWcodGl0bGUgKwotICAgICAgICAgICAgICAgICAgICAiOiBzYXZlZCBzZWxmIG1hbmFnZWQgZGF0YSBieXRlIGFycmF5IG91dHB1dCBzdHJlYW0gbGVuZ3RoIFsiICsgYmFvc19zaXplICsKLSAgICAgICAgICAgICAgICAgICAgIl0iKTsKLSAgICAgICAgICAgIHJldHVybiBiYW9zOwotICAgICAgICB9Ci0KLQotICAgICAgICBwdWJsaWMgaW50IGdldERlc2VyaWFsaXplY2FsbGNvdW50KCkgewotICAgICAgICAgICAgcmV0dXJuIGRlc2VyaWFsaXplY2FsbGNvdW50OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBnZXRTZXJpYWxpemVjYWxsY291bnQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gc2VyaWFsaXplY2FsbGNvdW50OwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICAvKgotICAgICAqIGNvbXBhcmVzIHRoZSB0d28gYnl0ZSBhcnJheXMgdG8gc2VlIGlmIHRoZXkgYXJlIGVxdWFsCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzRXF1YWxzKGJ5dGUgW10gYjEsIGJ5dGUgW10gYjIpIHsKLSAgICAgICAgaW50IHNpemUxID0gYjEubGVuZ3RoOwotICAgICAgICBpbnQgc2l6ZTIgPSBiMi5sZW5ndGg7Ci0KLSAgICAgICAgaWYgKHNpemUxICE9IHNpemUyKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemUxOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChiMVtpXSAhPSBiMltpXSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qCi0gICAgICogY29tcGFyZXMgdGhlIHR3byBsb25nIGFycmF5cyB0byBzZWUgaWYgdGhleSBhcmUgZXF1YWwKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNFcXVhbHMobG9uZyBbXSBMMSwgbG9uZyBbXSBMMikgewotICAgICAgICBpbnQgc2l6ZTEgPSBMMS5sZW5ndGg7Ci0gICAgICAgIGludCBzaXplMiA9IEwyLmxlbmd0aDsKLQotICAgICAgICBpZiAoc2l6ZTEgIT0gc2l6ZTIpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTE7IGkrKykgewotICAgICAgICAgICAgaWYgKEwxW2ldICE9IEwyW2ldKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvTWVzc2FnZUNvbnRleHRUZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL01lc3NhZ2VDb250ZXh0VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGNjMGQ5Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvTWVzc2FnZUNvbnRleHRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZW5naW5lOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBQcm9jZXNzaW5nRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQWJzdHJhY3RUZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci0KLXB1YmxpYyBjbGFzcyBNZXNzYWdlQ29udGV4dFRlc3QgZXh0ZW5kcyBBYnN0cmFjdFRlc3RDYXNlIHsKLSAgICBwdWJsaWMgTWVzc2FnZUNvbnRleHRUZXN0KFN0cmluZyB0ZXN0TmFtZSkgewotICAgICAgICBzdXBlcih0ZXN0TmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE1lc3NzYWdlQ29udGV4dCgpIHRocm93cyBBeGlzRmF1bHQsCi0gICAgICAgICAgICBTT0FQUHJvY2Vzc2luZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIEF4aXNDb25maWd1cmF0aW9uIGVyID0gbmV3IEF4aXNDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2VzRGVzYyA9IG5ldyBBeGlzU2VydmljZSgpOwotICAgICAgICBzZXJ2aWNlc0Rlc2Muc2V0TmFtZSgidGVzdFNlcnZpY2UiKTsKLSAgICAgICAgZXIuYWRkU2VydmljZShzZXJ2aWNlc0Rlc2MpOwotCi0gICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGVuZ2luZUNvbnRleHQgPSBuZXcgQ29uZmlndXJhdGlvbkNvbnRleHQoZXIpOwotCi0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1zZ2N0eCA9IGVuZ2luZUNvbnRleHQuY3JlYXRlTWVzc2FnZUNvbnRleHQoKTsKLQotICAgICAgICBTT0FQRmFjdG9yeSBvbUZhYyA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMUZhY3RvcnkoKTsKLQotICAgICAgICBtc2djdHguc2V0RW52ZWxvcGUob21GYWMuZ2V0RGVmYXVsdEVudmVsb3BlKCkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKG1zZ2N0eC5nZXRFbnZlbG9wZSgpKTsKLQotICAgICAgICBtc2djdHguc2V0RmF1bHRUbyhudWxsKTsKLSAgICAgICAgYXNzZXJ0TnVsbChtc2djdHguZ2V0RmF1bHRUbygpKTsKLQotICAgICAgICBtc2djdHguc2V0RnJvbShudWxsKTsKLSAgICAgICAgYXNzZXJ0TnVsbChtc2djdHguZ2V0RnJvbSgpKTsKLQotICAgICAgICBtc2djdHguc2V0UmVwbHlUbyhudWxsKTsKLSAgICAgICAgYXNzZXJ0TnVsbChtc2djdHguZ2V0UmVwbHlUbygpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL01lc3NhZ2VTYXZlQW5kUmVzdG9yZVRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvTWVzc2FnZVNhdmVBbmRSZXN0b3JlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzUwNmRmLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvTWVzc2FnZVNhdmVBbmRSZXN0b3JlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5lbmdpbmU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQMTJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuT3B0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5TZXJ2aWNlQ2xpZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUudXRpbC5UZXN0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaGFuZGxlcnMuQWJzdHJhY3RIYW5kbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaW50ZWdyYXRpb24uVGVzdGluZ1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaW50ZWdyYXRpb24uVXRpbFNlcnZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmludGVncmF0aW9uLlV0aWxTZXJ2ZXJCYXNlZFRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucGhhc2VyZXNvbHZlci5QaGFzZU1ldGFkYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5VdGlsczsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLS8qKgotICogVGhpcyB0ZXN0cyB0aGUgc2F2aW5nIGFuZCByZXN0b3Jpbmcgb2YgdGhlIEF4aXMyIGNvbnRleHRzIGZyb20gd2l0aGluIGEgaGFuZGxlci4gIFRoaXMgaXMgYSBtb3JlCi0gKiB0aG9yb3VnaCB0ZXN0IG9mIHRoZSBzZXJpYWxpemF0aW9uIG1lY2hhbmlzbXMgdGhhbiB0aGUgb3RoZXIgdW5pdCB0ZXN0cywgYXMgdGhlIGNvbnRleHRzIGFyZQotICogcG9wdWxhdGVkIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgQXhpczIgZXhlY3V0aW9uIHBhdGguCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXNzYWdlU2F2ZUFuZFJlc3RvcmVUZXN0IGV4dGVuZHMgVXRpbFNlcnZlckJhc2VkVGVzdENhc2UgaW1wbGVtZW50cyBUZXN0Q29uc3RhbnRzIHsKLSAgICBwdWJsaWMgTWVzc2FnZVNhdmVBbmRSZXN0b3JlVGVzdCgpIHsKLSAgICAgICAgc3VwZXIoTWVzc2FnZVNhdmVBbmRSZXN0b3JlVGVzdC5jbGFzcy5nZXROYW1lKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBNZXNzYWdlU2F2ZUFuZFJlc3RvcmVUZXN0KFN0cmluZyB0ZXN0TmFtZSkgewotICAgICAgICBzdXBlcih0ZXN0TmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotICAgICAgICByZXR1cm4gZ2V0VGVzdFNldHVwKG5ldyBUZXN0U3VpdGUoTWVzc2FnZVNhdmVBbmRSZXN0b3JlVGVzdC5jbGFzcykpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2UgPSBVdGlscy5jcmVhdGVTaW1wbGVTZXJ2aWNlKFRlc3RDb25zdGFudHMuc2VydmljZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVjaG8uY2xhc3MuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXN0Q29uc3RhbnRzLm9wZXJhdGlvbk5hbWUpOwotICAgICAgICBVdGlsU2VydmVyLmRlcGxveVNlcnZpY2Uoc2VydmljZSk7Ci0KLSAgICAgICAgQXhpc09wZXJhdGlvbiBvcGVyYXRpb24gPSBzZXJ2aWNlLmdldE9wZXJhdGlvbihUZXN0Q29uc3RhbnRzLm9wZXJhdGlvbk5hbWUpOwotCi0gICAgICAgIEFycmF5TGlzdCBwaGFzZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIHBoYXNlcy5hZGQobmV3IFBoYXNlKFBoYXNlTWV0YWRhdGEuUEhBU0VfUE9MSUNZX0RFVEVSTUlOQVRJT04pKTsKLSAgICAgICAgb3BlcmF0aW9uLnNldFJlbWFpbmluZ1BoYXNlc0luRmxvdyhwaGFzZXMpOwotICAgICAgICBBcnJheUxpc3QgcGhhc2UgPSBvcGVyYXRpb24uZ2V0UmVtYWluaW5nUGhhc2VzSW5GbG93KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGhhc2Uuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIFBoYXNlIHBoYXNlMSA9IChQaGFzZSlwaGFzZS5nZXQoaSk7Ci0gICAgICAgICAgICBpZiAoUGhhc2VNZXRhZGF0YS5QSEFTRV9QT0xJQ1lfREVURVJNSU5BVElPTi5lcXVhbHMocGhhc2UxLmdldFBoYXNlTmFtZSgpKSkgewotICAgICAgICAgICAgICAgIHBoYXNlMS5hZGRIYW5kbGVyKGluYm91bmRIYW5kbGVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHBoYXNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgcGhhc2VzLmFkZChuZXcgUGhhc2UoUGhhc2VNZXRhZGF0YS5QSEFTRV9QT0xJQ1lfREVURVJNSU5BVElPTikpOwotICAgICAgICBvcGVyYXRpb24uc2V0UGhhc2VzT3V0RmxvdyhwaGFzZXMpOwotICAgICAgICBwaGFzZSA9IG9wZXJhdGlvbi5nZXRQaGFzZXNPdXRGbG93KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGhhc2Uuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIFBoYXNlIHBoYXNlMSA9IChQaGFzZSlwaGFzZS5nZXQoaSk7Ci0gICAgICAgICAgICBpZiAoUGhhc2VNZXRhZGF0YS5QSEFTRV9QT0xJQ1lfREVURVJNSU5BVElPTi5lcXVhbHMocGhhc2UxLmdldFBoYXNlTmFtZSgpKSkgewotICAgICAgICAgICAgICAgIHBoYXNlMS5hZGRIYW5kbGVyKG91dGJvdW5kSGFuZGxlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBVdGlsU2VydmVyLnVuRGVwbG95U2VydmljZShUZXN0Q29uc3RhbnRzLnNlcnZpY2VOYW1lKTsKLSAgICAgICAgVXRpbFNlcnZlci51bkRlcGxveUNsaWVudFNlcnZpY2UoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2F2ZUFuZFJlc3RvcmVPZk1lc3NhZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgT01FbGVtZW50IHBheWxvYWQgPSBUZXN0aW5nVXRpbHMuY3JlYXRlRHVtbXlPTUVsZW1lbnQoKTsKLSAgICAgICAgT3B0aW9ucyBvcHRpb25zID0gbmV3IE9wdGlvbnMoKTsKLSAgICAgICAgb3B0aW9ucy5zZXRUbyhUZXN0Q29uc3RhbnRzLnRhcmdldEVQUik7Ci0gICAgICAgIG9wdGlvbnMuc2V0U29hcFZlcnNpb25VUkkoU09BUDEyQ29uc3RhbnRzLlNPQVBfRU5WRUxPUEVfTkFNRVNQQUNFX1VSSSk7Ci0gICAgICAgIG9wdGlvbnMuc2V0VHJhbnNwb3J0SW5Qcm90b2NvbChDb25zdGFudHMuVFJBTlNQT1JUX0hUVFApOwotICAgICAgICBvcHRpb25zLnNldEFjdGlvbihUZXN0Q29uc3RhbnRzLm9wZXJhdGlvbk5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICBvcHRpb25zLnNldFVzZVNlcGFyYXRlTGlzdGVuZXIodHJ1ZSk7Ci0KLSAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ29udGV4dCA9IFV0aWxTZXJ2ZXIuY3JlYXRlQ2xpZW50Q29uZmlndXJhdGlvbkNvbnRleHQoKTsKLQotICAgICAgICBTZXJ2aWNlQ2xpZW50IHNlbmRlciA9IG5ldyBTZXJ2aWNlQ2xpZW50KGNvbmZpZ0NvbnRleHQsIG51bGwpOwotICAgICAgICBzZW5kZXIuc2V0T3B0aW9ucyhvcHRpb25zKTsKLSAgICAgICAgc2VuZGVyLmVuZ2FnZU1vZHVsZSgiYWRkcmVzc2luZyIpOwotCi0gICAgICAgIE9NRWxlbWVudCByZXN1bHQgPSBzZW5kZXIuc2VuZFJlY2VpdmUocGF5bG9hZCk7Ci0KLSAgICAgICAgVGVzdGluZ1V0aWxzLmNvbXBhcmVXaXRoQ3JlYXRlZE9NRWxlbWVudChyZXN1bHQpOwotICAgIH0KLQotICAgIHByaXZhdGUgSGFuZGxlciBpbmJvdW5kSGFuZGxlciA9IG5ldyBBYnN0cmFjdEhhbmRsZXIoKSB7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotICAgICAgICBwcml2YXRlIFN0cmluZyBzdGF0ZVByb3BlcnR5ID0gIkluYm91bmRIYW5kbGVyU3RhdGUiOwotCi0gICAgICAgIHB1YmxpYyBJbnZvY2F0aW9uUmVzcG9uc2UgaW52b2tlKE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTWVzc2FnZVNhdmVBbmRSZXN0b3JlVGVzdDpJbmJvdW5kIGhhbmRsZXIgaW52b2tlZCIpOwotICAgICAgICAgICAgaWYgKG1lc3NhZ2VDb250ZXh0LmdldFByb3BlcnR5KHN0YXRlUHJvcGVydHkpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk1lc3NhZ2VTYXZlQW5kUmVzdG9yZVRlc3Q6U3VzcGVuZGluZyBwcm9jZXNzaW5nIik7Ci0gICAgICAgICAgICAgICAgbWVzc2FnZUNvbnRleHQuc2V0UHJvcGVydHkoc3RhdGVQcm9wZXJ0eSwgbmV3IE9iamVjdCgpKTsKLSAgICAgICAgICAgICAgICBtZXNzYWdlQ29udGV4dC5wYXVzZSgpOwotICAgICAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBieXRlQXJyYXlPdXRwdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgT2JqZWN0T3V0cHV0U3RyZWFtIG9iamVjdE91dHB1dFN0cmVhbSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdE91dHB1dFN0cmVhbShieXRlQXJyYXlPdXRwdXRTdHJlYW0pOwotICAgICAgICAgICAgICAgICAgICBvYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QobWVzc2FnZUNvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICBvYmplY3RPdXRwdXRTdHJlYW0uZmx1c2goKTsKLSAgICAgICAgICAgICAgICAgICAgb2JqZWN0T3V0cHV0U3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJ5dGVBcnJheU91dHB1dFN0cmVhbS5mbHVzaCgpOwotICAgICAgICAgICAgICAgICAgICBieXRlQXJyYXlPdXRwdXRTdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgZmFpbCgiQW4gZXJyb3Igb2NjdXJyZWQgd2hlbiBzZXJpYWxpemluZyB0aGUgTWVzc2FnZUNvbnRleHQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbmV3IFdvcmtlcihieXRlQXJyYXlPdXRwdXRTdHJlYW0udG9CeXRlQXJyYXkoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VDb250ZXh0LmdldENvbmZpZ3VyYXRpb25Db250ZXh0KCkpLnN0YXJ0KCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEludm9jYXRpb25SZXNwb25zZS5TVVNQRU5EOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oCi0gICAgICAgICAgICAgICAgICAgICAgICAiTWVzc2FnZVNhdmVBbmRSZXN0b3JlVGVzdDpTa2lwcGluZyBwcmV2aW91c2x5IGludm9rZWQgSW5ib3VuZCBoYW5kbGVyIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBJbnZvY2F0aW9uUmVzcG9uc2UuQ09OVElOVUU7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSBIYW5kbGVyIG91dGJvdW5kSGFuZGxlciA9IG5ldyBBYnN0cmFjdEhhbmRsZXIoKSB7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgICAgIHB1YmxpYyBJbnZvY2F0aW9uUmVzcG9uc2UgaW52b2tlKE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTWVzc2FnZVNhdmVBbmRSZXN0b3JlVGVzdDpPdXRib3VuZCBoYW5kbGVyIGludm9rZWQiKTsKLSAgICAgICAgICAgIHJldHVybiBJbnZvY2F0aW9uUmVzcG9uc2UuQ09OVElOVUU7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSBjbGFzcyBXb3JrZXIgZXh0ZW5kcyBUaHJlYWQgewotICAgICAgICBwcml2YXRlIGJ5dGVbXSBzZXJpYWxpemVkTWVzc2FnZUNvbnRleHQ7Ci0gICAgICAgIHByaXZhdGUgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlndXJhdGlvbkNvbnRleHQ7Ci0KLSAgICAgICAgcHVibGljIFdvcmtlcihieXRlW10gc2VyaWFsaXplZE1lc3NhZ2VDb250ZXh0LCBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWd1cmF0aW9uQ29udGV4dCkgewotICAgICAgICAgICAgdGhpcy5zZXJpYWxpemVkTWVzc2FnZUNvbnRleHQgPSBzZXJpYWxpemVkTWVzc2FnZUNvbnRleHQ7Ci0gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb25Db250ZXh0ID0gY29uZmlndXJhdGlvbkNvbnRleHQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTWVzc2FnZVNhdmVBbmRSZXN0b3JlVGVzdDpXb3JrZXIgdGhyZWFkIHN0YXJ0ZWQiKTsKLSAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoNTAwMCk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJNZXNzYWdlU2F2ZUFuZFJlc3RvcmVUZXN0OlJlc3VtaW5nIHByb2Nlc3NpbmciKTsKLSAgICAgICAgICAgICAgICBPYmplY3RJbnB1dFN0cmVhbSBvYmplY3RJbnB1dFN0cmVhbSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0SW5wdXRTdHJlYW0obmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHNlcmlhbGl6ZWRNZXNzYWdlQ29udGV4dCkpOwotICAgICAgICAgICAgICAgIE1lc3NhZ2VDb250ZXh0IHJlY29uc3RpdHV0ZWRNZXNzYWdlQ29udGV4dCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoTWVzc2FnZUNvbnRleHQpb2JqZWN0SW5wdXRTdHJlYW0ucmVhZE9iamVjdCgpOwotICAgICAgICAgICAgICAgIHJlY29uc3RpdHV0ZWRNZXNzYWdlQ29udGV4dC5hY3RpdmF0ZShjb25maWd1cmF0aW9uQ29udGV4dCk7Ci0gICAgICAgICAgICAgICAgQXhpc0VuZ2luZS5yZXN1bWUocmVjb25zdGl0dXRlZE1lc3NhZ2VDb250ZXh0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICAgICAgZmFpbCgiQW4gZXJyb3Igb2NjdXJyZWQgaW4gdGhlIHdvcmtlciB0aHJlYWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvTWVzc2FnZVdpdGhTZXJ2ZXJUZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL01lc3NhZ2VXaXRoU2VydmVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDU2ZTVmLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvTWVzc2FnZVdpdGhTZXJ2ZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZTsKLQotLy90b2RvCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc01vZHVsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkhhbmRsZXJEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLk91dEluQXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5SZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmludGVncmF0aW9uLlV0aWxTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pbnRlZ3JhdGlvbi5VdGlsU2VydmVyQmFzZWRUZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5SYXdYTUxJTk9ubHlNZXNzYWdlUmVjZWl2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuUmF3WE1MSU5PdXRNZXNzYWdlUmVjZWl2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLlV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5uZXQuU29ja2V0OwotCi1wdWJsaWMgY2xhc3MgTWVzc2FnZVdpdGhTZXJ2ZXJUZXN0IGV4dGVuZHMgVXRpbFNlcnZlckJhc2VkVGVzdENhc2UgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhNZXNzYWdlV2l0aFNlcnZlclRlc3QuY2xhc3MpOwotICAgIHByaXZhdGUgUU5hbWUgc2VydmljZU5hbWUgPSBuZXcgUU5hbWUoIiIsICJFY2hvU2VydmljZSIpOwotICAgIHByaXZhdGUgUU5hbWUgb3BlcmF0aW9uTmFtZSA9Ci0gICAgICAgICAgICBuZXcgUU5hbWUoImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyIiwgImVjaG9Wb2lkIik7Ci0KLSAgICBwcml2YXRlIENsYXNzTG9hZGVyIGNsOwotCi0gICAgcHVibGljIE1lc3NhZ2VXaXRoU2VydmVyVGVzdChTdHJpbmcgdGVzdE5hbWUpIHsKLSAgICAgICAgc3VwZXIodGVzdE5hbWUpOwotICAgICAgICBjbCA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotICAgICAgICByZXR1cm4gZ2V0VGVzdFNldHVwKG5ldyBUZXN0U3VpdGUoTWVzc2FnZVdpdGhTZXJ2ZXJUZXN0LmNsYXNzKSk7Ci0gICAgfQotCi0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBBeGlzQ29uZmlndXJhdGlvbiBjb25maWcgPSBuZXcgQXhpc0NvbmZpZ3VyYXRpb24oKTsKLQotICAgICAgICBBeGlzU2VydmljZSBzZXJ2aWNlID0gVXRpbHMuY3JlYXRlU2ltcGxlU2VydmljZShzZXJ2aWNlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWNoby5jbGFzcy5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbk5hbWUpOwotICAgICAgICBjb25maWcuYWRkU2VydmljZShzZXJ2aWNlKTsKLQotICAgICAgICAvL3NlcnZpY2Uuc2V0RmF1bHRJbkZsb3cobmV3IE1vY2tGbG93KCJzZXJ2aWNlIGZhdWx0ZmxvdyIsIDEpKTsKLQotICAgICAgICBBeGlzTW9kdWxlIG0xID0gbmV3IEF4aXNNb2R1bGUoIkEgTW9kdWxlIDEiKTsKLSAgICAgICAgbTEuc2V0SW5GbG93KG5ldyBNb2NrRmxvdygic2VydmljZSBtb2R1bGUgaW5mbG93IiwgNCkpOwotCi0gICAgICAgIC8vbTEuc2V0RmF1bHRJbkZsb3cobmV3IE1vY2tGbG93KCJzZXJ2aWNlIG1vZHVsZSBmYXVsdGZsb3ciLCAxKSk7Ci0gICAgICAgIGNvbmZpZy5hZGRNZXNzYWdlUmVjZWl2ZXIoCi0gICAgICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgvd3NkbC9pbi1vbmx5IiwgbmV3IFJhd1hNTElOT25seU1lc3NhZ2VSZWNlaXZlcigpKTsKLSAgICAgICAgY29uZmlnLmFkZE1lc3NhZ2VSZWNlaXZlcigKLSAgICAgICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC93c2RsL2luLW91dCIsIG5ldyBSYXdYTUxJTk91dE1lc3NhZ2VSZWNlaXZlcigpKTsKLQotICAgICAgICBEaXNwYXRjaFBoYXNlIGRpc3BhdGNoUGhhc2UgPSBuZXcgRGlzcGF0Y2hQaGFzZSgpOwotCi0gICAgICAgIGRpc3BhdGNoUGhhc2Uuc2V0TmFtZSgiRGlzcGF0Y2giKTsKLQotICAgICAgICBBZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIGFiZCA9IG5ldyBBZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyKCk7Ci0KLSAgICAgICAgYWJkLmluaXREaXNwYXRjaGVyKCk7Ci0KLSAgICAgICAgUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciBydWQgPSBuZXcgUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlcigpOwotCi0gICAgICAgIHJ1ZC5pbml0RGlzcGF0Y2hlcigpOwotCi0gICAgICAgIFNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIgc2FiZCA9IG5ldyBTT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyKCk7Ci0KLSAgICAgICAgc2FiZC5pbml0RGlzcGF0Y2hlcigpOwotCi0gICAgICAgIFNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciBzbWJkID0gbmV3IFNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlcigpOwotCi0gICAgICAgIHNtYmQuaW5pdERpc3BhdGNoZXIoKTsKLQotICAgICAgICBJbnN0YW5jZURpc3BhdGNoZXIgaWQgPSBuZXcgSW5zdGFuY2VEaXNwYXRjaGVyKCk7Ci0KLSAgICAgICAgaWQuaW5pdChuZXcgSGFuZGxlckRlc2NyaXB0aW9uKCJJbnN0YW5jZURpc3BhdGNoZXIiKSk7Ci0gICAgICAgIGRpc3BhdGNoUGhhc2UuYWRkSGFuZGxlcihhYmQpOwotICAgICAgICBkaXNwYXRjaFBoYXNlLmFkZEhhbmRsZXIocnVkKTsKLSAgICAgICAgZGlzcGF0Y2hQaGFzZS5hZGRIYW5kbGVyKHNhYmQpOwotICAgICAgICBkaXNwYXRjaFBoYXNlLmFkZEhhbmRsZXIoc21iZCk7Ci0gICAgICAgIGRpc3BhdGNoUGhhc2UuYWRkSGFuZGxlcihpZCk7Ci0gICAgICAgIGNvbmZpZy5nZXRJbkZsb3dQaGFzZXMoKS5hZGQoZGlzcGF0Y2hQaGFzZSk7Ci0gICAgICAgIHNlcnZpY2UuZW5nYWdlTW9kdWxlKG0xKTsKLQotICAgICAgICBBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb24gPSBuZXcgT3V0SW5BeGlzT3BlcmF0aW9uKCk7Ci0gICAgICAgIGF4aXNPcGVyYXRpb24uc2V0TmFtZShvcGVyYXRpb25OYW1lKTsKLSAgICAgICAgc2VydmljZS5hZGRPcGVyYXRpb24oYXhpc09wZXJhdGlvbik7Ci0KLSAgICAgICAgVXRpbFNlcnZlci5kZXBsb3lTZXJ2aWNlKHNlcnZpY2UpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFV0aWxTZXJ2ZXIudW5EZXBsb3lTZXJ2aWNlKHNlcnZpY2VOYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RWNob1N0cmluZ1NlcnZlcigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBJbnB1dFN0cmVhbSBpbiA9IGNsLmdldFJlc291cmNlQXNTdHJlYW0oInNvYXAvc29hcG1lc3NhZ2UudHh0Iik7Ci0KLSAgICAgICAgaWYgKGluID09IG51bGwpIHsKLSAgICAgICAgICAgIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShTeXN0ZW0uZ2V0UHJvcGVydHkoImJhc2VkaXIiLCAiLiIpICsKLSAgICAgICAgICAgICAgICAgICAgIi90ZXN0LXJlc291cmNlcy9zb2FwL3NvYXBtZXNzYWdlLnR4dCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgU29ja2V0IHNvY2tldCA9IG5ldyBTb2NrZXQoIjEyNy4wLjAuMSIsIFV0aWxTZXJ2ZXIuVEVTVElOR19QT1JUKTsKLSAgICAgICAgT3V0cHV0U3RyZWFtIG91dCA9IHNvY2tldC5nZXRPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzEwMjRdOwotICAgICAgICBpbnQgaW5kZXg7Ci0gICAgICAgIHdoaWxlICgoaW5kZXggPSBpbi5yZWFkKGJ1ZikpID4gMCkgewotICAgICAgICAgICAgb3V0LndyaXRlKGJ1ZiwgMCwgaW5kZXgpOwotICAgICAgICB9Ci0KLSAgICAgICAgSW5wdXRTdHJlYW0gcmVzcG9zZSA9IHNvY2tldC5nZXRJbnB1dFN0cmVhbSgpOwotICAgICAgICBSZWFkZXIgclJlYWRlciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihyZXNwb3NlKTsKLSAgICAgICAgY2hhcltdIGNoYXJCdWYgPSBuZXcgY2hhclsxMDI0XTsKLSAgICAgICAgd2hpbGUgKChyUmVhZGVyLnJlYWQoY2hhckJ1ZikpID4gMCkgewotICAgICAgICAgICAgbG9nLmluZm8obmV3IFN0cmluZyhjaGFyQnVmKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbi5jbG9zZSgpOwotICAgICAgICBvdXQuY2xvc2UoKTsKLQotICAgICAgICByUmVhZGVyLmNsb3NlKCk7Ci0gICAgICAgIHNvY2tldC5jbG9zZSgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvTW9ja0Zsb3cuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvTW9ja0Zsb3cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRmMjdlZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL01vY2tGbG93LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZW5naW5lOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5GbG93OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotcHVibGljIGNsYXNzIE1vY2tGbG93IGV4dGVuZHMgRmxvdyB7Ci0gICAgcHVibGljIE1vY2tGbG93KFN0cmluZyBtZXNzYWdlLCBpbnQgbGVuZ3RoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFNwZWFraW5nSGFuZGxlcjEgaDEgPSBuZXcgU3BlYWtpbmdIYW5kbGVyMSgKLSAgICAgICAgICAgICAgICAgICAgIkV4ZWN1dGluZyAiICsgaSArICIgaW5zaWRlICIgKyBtZXNzYWdlLCBuZXcgUU5hbWUoIlNwZWFraW5nSGFuZGxlciIgKyBpKSk7Ci0gICAgICAgICAgICBoMS5zZXROYW1lKCJTcGVha2luZ0hhbmRsZXIiICsgaSk7Ci0gICAgICAgICAgICB0aGlzLmFkZEhhbmRsZXIoaDEuZ2V0SGFuZGxlckRlc2NyaXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL01vZHVsZUVuYWdlbWVudFRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvTW9kdWxlRW5hZ2VtZW50VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzNiNzZiLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvTW9kdWxlRW5hZ2VtZW50VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5lbmdpbmU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNNZXNzYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc01vZHVsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkZsb3c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5IYW5kbGVyRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5QaGFzZVJ1bGU7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1wdWJsaWMgY2xhc3MgTW9kdWxlRW5hZ2VtZW50VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICBBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlnOwotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgQXhpc01vZHVsZSBtb2R1bGUgPSBuZXcgQXhpc01vZHVsZSgpOwotICAgICAgICBtb2R1bGUuc2V0TmFtZSgiVGVzdE1vZHVsZSIpOwotICAgICAgICBtb2R1bGUuc2V0SW5GbG93KGdldEZsb3dXaXRoSGFuZGxlcigiSDEiLCAiT3BlcmF0aW9uSW5QaGFzZSIpKTsKLSAgICAgICAgbW9kdWxlLnNldE91dEZsb3coZ2V0Rmxvd1dpdGhIYW5kbGVyKCJIMiIsICJPcGVyYXRpb25PdXRQaGFzZSIpKTsKLSAgICAgICAgbW9kdWxlLnNldEZhdWx0SW5GbG93KGdldEZsb3dXaXRoSGFuZGxlcigiSDMiLCAiT3BlcmF0aW9uSW5GYXVsdFBoYXNlIikpOwotICAgICAgICBtb2R1bGUuc2V0RmF1bHRPdXRGbG93KGdldEZsb3dXaXRoSGFuZGxlcigiSDQiLCAiT3BlcmF0aW9uT3V0RmF1bHRQaGFzZSIpKTsKLSAgICAgICAgYXhpc0NvbmZpZyA9IENvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeS5jcmVhdGVEZWZhdWx0Q29uZmlndXJhdGlvbkNvbnRleHQoKS5nZXRBeGlzQ29uZmlndXJhdGlvbigpOwotICAgICAgICBheGlzQ29uZmlnLmFkZE1vZHVsZShtb2R1bGUpOwotICAgIH0KLQotICAgIHByaXZhdGUgRmxvdyBnZXRGbG93V2l0aEhhbmRsZXIoU3RyaW5nIGhhbmRsZXJuYW1lLCBTdHJpbmcgcGhhc2VOYW1lKSB7Ci0gICAgICAgIEhhbmRsZXJEZXNjcmlwdGlvbiBoYW5kbGVyMSA9IG5ldyBIYW5kbGVyRGVzY3JpcHRpb24oKTsKLSAgICAgICAgVGVzdEhhbmRsZXIgbW9kdWxlSGFuZGxlciA9IG5ldyBUZXN0SGFuZGxlcigpOwotICAgICAgICBtb2R1bGVIYW5kbGVyLnNldE5hbWUoaGFuZGxlcm5hbWUpOwotICAgICAgICBtb2R1bGVIYW5kbGVyLnNldE5hbWUoaGFuZGxlcm5hbWUpOwotICAgICAgICBtb2R1bGVIYW5kbGVyLmluaXQoaGFuZGxlcjEpOwotICAgICAgICBQaGFzZVJ1bGUgcnVsZTEgPSBuZXcgUGhhc2VSdWxlKCk7Ci0gICAgICAgIHJ1bGUxLnNldFBoYXNlTmFtZShwaGFzZU5hbWUpOwotICAgICAgICBoYW5kbGVyMS5zZXRSdWxlcyhydWxlMSk7Ci0gICAgICAgIGhhbmRsZXIxLnNldEhhbmRsZXIobW9kdWxlSGFuZGxlcik7Ci0gICAgICAgIEZsb3cgZmxvdyA9IG5ldyBGbG93KCk7Ci0gICAgICAgIGZsb3cuYWRkSGFuZGxlcihoYW5kbGVyMSk7Ci0gICAgICAgIHJldHVybiBmbG93OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNb2R1bGVFbmdhZ2VGb3JBeGlzU2VydmljZSgpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBBeGlzU2VydmljZSBzZXJ2aWNlID0gQXhpc1NlcnZpY2UuY3JlYXRlU2VydmljZShUZXN0U2VydmljZS5jbGFzcy5nZXROYW1lKCksIGF4aXNDb25maWcpOwotICAgICAgICBheGlzQ29uZmlnLmFkZFNlcnZpY2Uoc2VydmljZSk7Ci0gICAgICAgIEF4aXNNb2R1bGUgbW9kdWxlID0gYXhpc0NvbmZpZy5nZXRNb2R1bGUoIlRlc3RNb2R1bGUiKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChtb2R1bGUpOwotICAgICAgICBzZXJ2aWNlLmVuZ2FnZU1vZHVsZShtb2R1bGUpOwotICAgICAgICBBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb24gPSBzZXJ2aWNlLmdldE9wZXJhdGlvbihuZXcgUU5hbWUoInRlc3RWb2lkIikpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGF4aXNPcGVyYXRpb24pOwotICAgICAgICBBeGlzTWVzc2FnZSBtZXNzYWdlID0gYXhpc09wZXJhdGlvbi5nZXRNZXNzYWdlKCJJbiIpOwotICAgICAgICBhc3NlcnROb3ROdWxsKG1lc3NhZ2UpOwotICAgICAgICBMaXN0IGxpc3QgPSBtZXNzYWdlLmdldE1lc3NhZ2VGbG93KCk7Ci0gICAgICAgIGJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBQaGFzZSBwaGFzZSA9IChQaGFzZSkgbGlzdC5nZXQoaSk7Ci0gICAgICAgICAgICBpZiAocGhhc2UgIT0gbnVsbCAmJiBwaGFzZS5nZXROYW1lKCkuZXF1YWxzKCJPcGVyYXRpb25JblBoYXNlIikpIHsKLSAgICAgICAgICAgICAgICBMaXN0IGhhbmRsZXIgPSBwaGFzZS5nZXRIYW5kbGVycygpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgaGFuZGxlci5zaXplKCk7IGorKykgewotICAgICAgICAgICAgICAgICAgICBIYW5kbGVyIGhhbmRsZXIxID0gKEhhbmRsZXIpIGhhbmRsZXIuZ2V0KGopOwotICAgICAgICAgICAgICAgICAgICBpZiAoaGFuZGxlcjEuZ2V0TmFtZSgpLmVxdWFscygiSDEiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZShmb3VuZCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZW5nYWdlTW9kdWxlVG9BeGlzTWVzc2FnZTEoKSB0aHJvd3MgRXhjZXB0aW9uewotICAgICAgICBBeGlzU2VydmljZSBzZXJ2aWNlID0gQXhpc1NlcnZpY2UuY3JlYXRlU2VydmljZShUZXN0U2VydmljZS5jbGFzcy5nZXROYW1lKCksIGF4aXNDb25maWcpOwotICAgICAgICBheGlzQ29uZmlnLmFkZFNlcnZpY2Uoc2VydmljZSk7Ci0gICAgICAgIEF4aXNNb2R1bGUgbW9kdWxlID0gYXhpc0NvbmZpZy5nZXRNb2R1bGUoIlRlc3RNb2R1bGUiKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChtb2R1bGUpOwotICAgICAgICBBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb24gPSBzZXJ2aWNlLmdldE9wZXJhdGlvbihuZXcgUU5hbWUoInRlc3RWb2lkIikpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGF4aXNPcGVyYXRpb24pOwotICAgICAgICBBeGlzTWVzc2FnZSBtZXNzYWdlID0gYXhpc09wZXJhdGlvbi5nZXRNZXNzYWdlKCJJbiIpOwotICAgICAgICBtZXNzYWdlLmVuZ2FnZU1vZHVsZShtb2R1bGUpOwotICAgICAgICBhc3NlcnROb3ROdWxsKG1lc3NhZ2UpOwotICAgICAgICBMaXN0IGxpc3QgPSBtZXNzYWdlLmdldE1lc3NhZ2VGbG93KCk7Ci0gICAgICAgIGJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBQaGFzZSBwaGFzZSA9IChQaGFzZSkgbGlzdC5nZXQoaSk7Ci0gICAgICAgICAgICBpZiAocGhhc2UgIT0gbnVsbCAmJiBwaGFzZS5nZXROYW1lKCkuZXF1YWxzKCJPcGVyYXRpb25JblBoYXNlIikpIHsKLSAgICAgICAgICAgICAgICBMaXN0IGhhbmRsZXIgPSBwaGFzZS5nZXRIYW5kbGVycygpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgaGFuZGxlci5zaXplKCk7IGorKykgewotICAgICAgICAgICAgICAgICAgICBIYW5kbGVyIGhhbmRsZXIxID0gKEhhbmRsZXIpIGhhbmRsZXIuZ2V0KGopOwotICAgICAgICAgICAgICAgICAgICBpZiAoaGFuZGxlcjEuZ2V0TmFtZSgpLmVxdWFscygiSDEiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZShmb3VuZCk7Ci0gICAgfQotCi0gICAgIHB1YmxpYyB2b2lkIGVuZ2FnZU1vZHVsZVRvQXhpc01lc3NhZ2UyKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLSAgICAgICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2UgPSBBeGlzU2VydmljZS5jcmVhdGVTZXJ2aWNlKFRlc3RTZXJ2aWNlLmNsYXNzLmdldE5hbWUoKSwgYXhpc0NvbmZpZyk7Ci0gICAgICAgICBheGlzQ29uZmlnLmFkZFNlcnZpY2Uoc2VydmljZSk7Ci0gICAgICAgICBBeGlzTW9kdWxlIG1vZHVsZSA9IGF4aXNDb25maWcuZ2V0TW9kdWxlKCJUZXN0TW9kdWxlIik7Ci0gICAgICAgICBhc3NlcnROb3ROdWxsKG1vZHVsZSk7Ci0gICAgICAgICBBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb24gPSBzZXJ2aWNlLmdldE9wZXJhdGlvbihuZXcgUU5hbWUoInRlc3RTdHJpbmciKSk7Ci0gICAgICAgICBhc3NlcnROb3ROdWxsKGF4aXNPcGVyYXRpb24pOwotICAgICAgICAgQXhpc01lc3NhZ2UgbWVzc2FnZSA9IGF4aXNPcGVyYXRpb24uZ2V0TWVzc2FnZSgiSW4iKTsKLSAgICAgICAgIG1lc3NhZ2UuZW5nYWdlTW9kdWxlKG1vZHVsZSk7Ci0gICAgICAgICBhc3NlcnROb3ROdWxsKG1lc3NhZ2UpOwotICAgICAgICAgbWVzc2FnZSA9IGF4aXNPcGVyYXRpb24uZ2V0TWVzc2FnZSgiT3V0Iik7Ci0gICAgICAgICBMaXN0IGxpc3QgPSBtZXNzYWdlLmdldE1lc3NhZ2VGbG93KCk7Ci0gICAgICAgICBib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0gICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICBQaGFzZSBwaGFzZSA9IChQaGFzZSkgbGlzdC5nZXQoaSk7Ci0gICAgICAgICAgICAgaWYgKHBoYXNlICE9IG51bGwgJiYgcGhhc2UuZ2V0TmFtZSgpLmVxdWFscygiT3BlcmF0aW9uT3V0UGhhc2UiKSkgewotICAgICAgICAgICAgICAgICBMaXN0IGhhbmRsZXIgPSBwaGFzZS5nZXRIYW5kbGVycygpOwotICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGhhbmRsZXIuc2l6ZSgpOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgIEhhbmRsZXIgaGFuZGxlcjEgPSAoSGFuZGxlcikgaGFuZGxlci5nZXQoaik7Ci0gICAgICAgICAgICAgICAgICAgICBpZiAoaGFuZGxlcjEuZ2V0TmFtZSgpLmVxdWFscygiSDIiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgICAgYXNzZXJ0RmFsc2UoZm91bmQpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvTXVsdGlwbGVJbnZvY2F0aW9uVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9NdWx0aXBsZUludm9jYXRpb25UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjYTEyMDIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9NdWx0aXBsZUludm9jYXRpb25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZTsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUDEyQ29uc3RhbnRzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuT3B0aW9uczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuU2VydmljZUNsaWVudDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5TZXJ2aWNlQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUudXRpbC5UZXN0Q29uc3RhbnRzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmludGVncmF0aW9uLlRlc3RpbmdVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pbnRlZ3JhdGlvbi5VdGlsU2VydmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmludGVncmF0aW9uLlV0aWxTZXJ2ZXJCYXNlZFRlc3RDYXNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuVXRpbHM7DQotDQotcHVibGljIGNsYXNzIE11bHRpcGxlSW52b2NhdGlvblRlc3QgZXh0ZW5kcyBVdGlsU2VydmVyQmFzZWRUZXN0Q2FzZSBpbXBsZW1lbnRzIFRlc3RDb25zdGFudHMgew0KLSAgICBwcm90ZWN0ZWQgQXhpc0NvbmZpZ3VyYXRpb24gZW5naW5lUmVnaXN0cnk7DQotICAgIHByb3RlY3RlZCBNZXNzYWdlQ29udGV4dCBtYzsNCi0gICAgcHJvdGVjdGVkIFNlcnZpY2VDb250ZXh0IHNlcnZpY2VDb250ZXh0Ow0KLSAgICBwcm90ZWN0ZWQgQXhpc1NlcnZpY2Ugc2VydmljZTsNCi0NCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZmluaXNoID0gZmFsc2U7DQotDQotICAgIHB1YmxpYyBNdWx0aXBsZUludm9jYXRpb25UZXN0KCkgew0KLSAgICAgICAgc3VwZXIoTXVsdGlwbGVJbnZvY2F0aW9uVGVzdC5jbGFzcy5nZXROYW1lKCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBNdWx0aXBsZUludm9jYXRpb25UZXN0KFN0cmluZyB0ZXN0TmFtZSkgew0KLSAgICAgICAgc3VwZXIodGVzdE5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsNCi0gICAgICAgIHJldHVybiBnZXRUZXN0U2V0dXAobmV3IFRlc3RTdWl0ZShNdWx0aXBsZUludm9jYXRpb25UZXN0LmNsYXNzKSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIHNlcnZpY2UgPQ0KLSAgICAgICAgICAgICAgICBVdGlscy5jcmVhdGVTaW1wbGVTZXJ2aWNlKHNlcnZpY2VOYW1lLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIEVjaG8uY2xhc3MuZ2V0TmFtZSgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbk5hbWUpOw0KLSAgICAgICAgVXRpbFNlcnZlci5kZXBsb3lTZXJ2aWNlKHNlcnZpY2UpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBVdGlsU2VydmVyLnVuRGVwbG95U2VydmljZShzZXJ2aWNlTmFtZSk7DQotICAgICAgICBVdGlsU2VydmVyLnVuRGVwbG95Q2xpZW50U2VydmljZSgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RNdXRpcGxlSW52b2NhdGlvbigpIHRocm93cyBFeGNlcHRpb24gew0KLQ0KLSAgICAgICAgT01FbGVtZW50IHBheWxvYWQgPSBUZXN0aW5nVXRpbHMuY3JlYXRlRHVtbXlPTUVsZW1lbnQoKTsNCi0gICAgICAgIE9wdGlvbnMgb3B0aW9ucyA9IG5ldyBPcHRpb25zKCk7DQotICAgICAgICBvcHRpb25zLnNldEFjdGlvbigidXJuOmVjaG9PTSIpOw0KLSAgICAgICAgb3B0aW9ucy5zZXRUbyh0YXJnZXRFUFIpOw0KLSAgICAgICAgb3B0aW9ucy5zZXRTb2FwVmVyc2lvblVSSShTT0FQMTJDb25zdGFudHMuU09BUF9FTlZFTE9QRV9OQU1FU1BBQ0VfVVJJKTsNCi0gICAgICAgIG9wdGlvbnMuc2V0VHJhbnNwb3J0SW5Qcm90b2NvbChDb25zdGFudHMuVFJBTlNQT1JUX0hUVFApOw0KLSAgICAgICAgb3B0aW9ucy5zZXRDYWxsVHJhbnNwb3J0Q2xlYW51cCh0cnVlKTsNCi0NCi0gICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQgPQ0KLSAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkuY3JlYXRlQ29uZmlndXJhdGlvbkNvbnRleHRGcm9tRmlsZVN5c3RlbSgNCi0gICAgICAgICAgICAgICAgICAgICAgICBUZXN0aW5nVXRpbHMucHJlZml4QmFzZURpcmVjdG9yeShDb25zdGFudHMuVEVTVElOR19SRVBPU0lUT1JZKSwgbnVsbCk7DQotICAgICAgICBTZXJ2aWNlQ2xpZW50IHNlbmRlciA9IG5ldyBTZXJ2aWNlQ2xpZW50KGNvbmZpZ0NvbnRleHQsIG51bGwpOw0KLSAgICAgICAgc2VuZGVyLmVuZ2FnZU1vZHVsZSgiYWRkcmVzc2luZyIpOw0KLSAgICAgICAgc2VuZGVyLnNldE9wdGlvbnMob3B0aW9ucyk7DQotICAgICAgICBPTUVsZW1lbnQgcmVzdWx0ID0gc2VuZGVyLnNlbmRSZWNlaXZlKHBheWxvYWQpOw0KLSAgICAgICAgVGVzdGluZ1V0aWxzLmNvbXBhcmVXaXRoQ3JlYXRlZE9NRWxlbWVudChyZXN1bHQpOw0KLSAgICAgICAgcmVzdWx0ID0gc2VuZGVyLnNlbmRSZWNlaXZlKHBheWxvYWQpOw0KLSAgICAgICAgVGVzdGluZ1V0aWxzLmNvbXBhcmVXaXRoQ3JlYXRlZE9NRWxlbWVudChyZXN1bHQpOw0KLSAgICAgICAgcmVzdWx0ID0gc2VuZGVyLnNlbmRSZWNlaXZlKHBheWxvYWQpOw0KLSAgICAgICAgVGVzdGluZ1V0aWxzLmNvbXBhcmVXaXRoQ3JlYXRlZE9NRWxlbWVudChyZXN1bHQpOw0KLSAgICAgICAgcmVzdWx0ID0gc2VuZGVyLnNlbmRSZWNlaXZlKHBheWxvYWQpOw0KLSAgICAgICAgVGVzdGluZ1V0aWxzLmNvbXBhcmVXaXRoQ3JlYXRlZE9NRWxlbWVudChyZXN1bHQpOw0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvTXlTZXJ2aWNlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL015U2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMGY3YjJmLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvTXlTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZW5naW5lOwotCi1wdWJsaWMgY2xhc3MgTXlTZXJ2aWNlIHsKLQotICAgIHB1YmxpYyBpbnQgYWRkKGludCBhLCBpbnQgYikgewotICAgICAgICByZXR1cm4gYSArIGI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHV0VmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL09iamVjdFNhdmUyVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9PYmplY3RTYXZlMlRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzI0ODI0MC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL09iamVjdFNhdmUyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODE3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZW5naW5lOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5leHRlcm5hbGl6ZS5TYWZlT2JqZWN0SW5wdXRTdHJlYW07DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5leHRlcm5hbGl6ZS5TYWZlT2JqZWN0T3V0cHV0U3RyZWFtOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuTWV0YURhdGFFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZhLmlvLkV4dGVybmFsaXphYmxlOw0KLWltcG9ydCBqYXZhLmlvLkZpbGU7DQotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07DQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQotaW1wb3J0IGphdmEuaW8uTm90U2VyaWFsaXphYmxlRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0Ow0KLQ0KLXB1YmxpYyBjbGFzcyBPYmplY3RTYXZlMlRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7DQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKE9iamVjdFNhdmUyVGVzdC5jbGFzcyk7DQotICAgIA0KLSAgICBwcml2YXRlIFN0cmluZyB0ZXN0QXJnID0gbnVsbDsNCi0NCi0JLy8gc2ltcGxlIGNvbnN0cnVjdG9yIG5lZWRlZCBmb3IgbmVzdGVkIGNsYXNzIEV4dGVybmFsaXphYmxlIGludGVyZmFjZQ0KLQlwdWJsaWMgT2JqZWN0U2F2ZTJUZXN0KCkgew0KLQl9DQotDQotCXB1YmxpYyBPYmplY3RTYXZlMlRlc3QoU3RyaW5nIGFyZzApIHsNCi0JCXN1cGVyKGFyZzApOw0KLQkJdGVzdEFyZyA9IG5ldyBTdHJpbmcoYXJnMCk7DQotCX0NCi0NCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0JCS8vIG9yZy5hcGFjaGUubG9nNGouQmFzaWNDb25maWd1cmF0b3IuY29uZmlndXJlKCk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdE9iamVjdFNlcmlhbGl6YWJsZSgpIHRocm93cyBFeGNlcHRpb24gew0KLQkJRmlsZSB0aGVGaWxlID0gbnVsbDsNCi0JCVN0cmluZyB0aGVGaWxlbmFtZSA9IG51bGw7DQotCQlib29sZWFuIHNhdmVkID0gZmFsc2U7DQotCQlib29sZWFuIHJlc3RvcmVkID0gZmFsc2U7DQotCQlib29sZWFuIGRvbmUgPSBmYWxzZTsNCi0NCi0gICAgICAgIGxvZy5kZWJ1ZygiT2JqZWN0U2F2ZVRlc3Q6dGVzdE9iamVjdFNlcmlhbGl6YWJsZSgpOiAgQkVHSU4gLS0tLS0tLS0tLS0tLS0tIik7DQotDQotCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JCS8vIHNldHVwIGFuIG9iamVjdCB0byB1c2UNCi0JCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJTWV0YURhdGFFbnRyeSBvYmogPSBuZXcgTWV0YURhdGFFbnRyeSgib2JqZWN0XzEiLCAib2JqZWN0XzEiKTsNCi0NCi0JCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJLy8gc2V0dXAgYSB0ZW1wb3JhcnkgZmlsZSB0byB1c2UNCi0JCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJdHJ5IHsNCi0JCQl0aGVGaWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgib2JqZWN0VGVzdCIsIG51bGwpOw0KLQkJCXRoZUZpbGVuYW1lID0gdGhlRmlsZS5nZXROYW1lKCk7DQotICAgICAgICAgICAgbG9nLmRlYnVnKCJPYmplY3RTYXZlVGVzdDp0ZXN0T2JqZWN0U2VyaWFsaXphYmxlKCk6IHRlbXAgZmlsZSA9IFsiDQotICAgICAgICAgICAgICAgICAgICArIHRoZUZpbGVuYW1lICsgIl0iKTsNCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiT2JqZWN0U2F2ZVRlc3Q6dGVzdE9iamVjdFNlcmlhbGl6YWJsZSgpOiBlcnJvciBjcmVhdGluZyB0ZW1wIGZpbGUgPSBbIg0KLSAgICAgICAgICAgICAgICAgICAgKyBleC5nZXRNZXNzYWdlKCkgKyAiXSIpOw0KLQkJCXRoZUZpbGUgPSBudWxsOw0KLQkJfQ0KLQ0KLQkJaWYgKHRoZUZpbGUgIT0gbnVsbCkgew0KLQkJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJCS8vIHNhdmUgdG8gdGhlIHRlbXBvcmFyeSBmaWxlDQotCQkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCQkJdHJ5IHsNCi0JCQkJLy8gc2V0dXAgYW4gb3V0cHV0IHN0cmVhbSB0byBhIHBoeXNpY2FsIGZpbGUNCi0JCQkJRmlsZU91dHB1dFN0cmVhbSBvdXRTdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbSh0aGVGaWxlKTsNCi0NCi0JCQkJLy8gYXR0YWNoIGEgc3RyZWFtIGNhcGFibGUgb2Ygd3JpdGluZyBvYmplY3RzIHRvIHRoZQ0KLQkJCQkvLyBzdHJlYW0gY29ubmVjdGVkIHRvIHRoZSBmaWxlDQotCQkJCU9iamVjdE91dHB1dFN0cmVhbSBvdXRPYmpTdHJlYW0gPSBuZXcgT2JqZWN0T3V0cHV0U3RyZWFtKA0KLQkJCQkJCW91dFN0cmVhbSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYWZlT2JqZWN0T3V0cHV0U3RyZWFtIG91dCA9IA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhZmVPYmplY3RPdXRwdXRTdHJlYW0uaW5zdGFsbChvdXRPYmpTdHJlYW0pOw0KLQ0KLQkJCQkvLyB0cnkgdG8gc2F2ZQ0KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIk9iamVjdFNhdmVUZXN0OnRlc3RPYmplY3RTZXJpYWxpemFibGUoKTogc2F2aW5nIC4uLi4uIik7DQotCQkJCXNhdmVkID0gZmFsc2U7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGVPYmplY3Qob2JqKTsNCi0NCi0JCQkJLy8gY2xvc2Ugb3V0IHRoZSBzdHJlYW1zDQotCQkJCW91dE9ialN0cmVhbS5mbHVzaCgpOw0KLQkJCQlvdXRPYmpTdHJlYW0uY2xvc2UoKTsNCi0JCQkJb3V0U3RyZWFtLmZsdXNoKCk7DQotCQkJCW91dFN0cmVhbS5jbG9zZSgpOw0KLQ0KLQkJCQlzYXZlZCA9IHRydWU7DQotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygNCi0gICAgICAgICAgICAgICAgICAgICAgICAiT2JqZWN0U2F2ZVRlc3Q6dGVzdE9iamVjdFNlcmlhbGl6YWJsZSgpOiAiICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAiLi4uLnNhdmUgb3BlcmF0aW9uIGNvbXBsZXRlZC4uLi4uIik7DQotDQotCQkJCWxvbmcgZmlsZXNpemUgPSB0aGVGaWxlLmxlbmd0aCgpOw0KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIk9iamVjdFNhdmVUZXN0OnRlc3RPYmplY3RTZXJpYWxpemFibGUoKTogZmlsZSBzaXplIGFmdGVyIHNhdmUgWyINCi0gICAgICAgICAgICAgICAgICAgICAgICArIGZpbGVzaXplDQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiXSAgIHRlbXAgZmlsZSA9IFsiDQotICAgICAgICAgICAgICAgICAgICAgICAgKyB0aGVGaWxlbmFtZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICsgIl0iKTsNCi0JCQl9IGNhdGNoIChFeGNlcHRpb24gZXgyKSB7DQotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiT2JqZWN0U2F2ZVRlc3Q6dGVzdE9iamVjdFNlcmlhbGl6YWJsZSgpOiBlcnJvciBkdXJpbmcgc2F2ZSBbIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICsgZXgyLmdldENsYXNzKCkuZ2V0TmFtZSgpDQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiIDogIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICsgZXgyLmdldE1lc3NhZ2UoKSArICJdIik7DQotCQkJCWV4Mi5wcmludFN0YWNrVHJhY2UoKTsNCi0JCQl9DQotDQotCQkJYXNzZXJ0VHJ1ZShzYXZlZCk7DQotDQotCQkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCQkJLy8gcmVzdG9yZSBmcm9tIHRoZSB0ZW1wb3JhcnkgZmlsZQ0KLQkJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJCXRyeSB7DQotCQkJCS8vIHNldHVwIGFuIGlucHV0IHN0cmVhbSB0byB0aGUgZmlsZQ0KLQkJCQlGaWxlSW5wdXRTdHJlYW0gaW5TdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKHRoZUZpbGUpOw0KLQ0KLQkJCQkvLyBhdHRhY2ggYSBzdHJlYW0gY2FwYWJsZSBvZiByZWFkaW5nIG9iamVjdHMgZnJvbSB0aGUNCi0JCQkJLy8gc3RyZWFtIGNvbm5lY3RlZCB0byB0aGUgZmlsZQ0KLQkJCQlPYmplY3RJbnB1dFN0cmVhbSBpbk9ialN0cmVhbSA9IG5ldyBPYmplY3RJbnB1dFN0cmVhbShpblN0cmVhbSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYWZlT2JqZWN0SW5wdXRTdHJlYW0gaW4gPSANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYWZlT2JqZWN0SW5wdXRTdHJlYW0uaW5zdGFsbChpbk9ialN0cmVhbSk7DQotDQotCQkJCS8vIHRyeSB0byByZXN0b3JlIHRoZSBvcHRpb25zDQotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiT2JqZWN0U2F2ZVRlc3Q6dGVzdE9iamVjdFNlcmlhbGl6YWJsZSgpOiByZXN0b3JpbmcgLi4uLi4iKTsNCi0JCQkJcmVzdG9yZWQgPSBmYWxzZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgcmVzdG9yZWRfb2JqID0gKE1ldGFEYXRhRW50cnkpIGluLnJlYWRPYmplY3QoKTsNCi0JCQkJaW5PYmpTdHJlYW0uY2xvc2UoKTsNCi0JCQkJaW5TdHJlYW0uY2xvc2UoKTsNCi0NCi0JCQkJcmVzdG9yZWQgPSB0cnVlOw0KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoDQotICAgICAgICAgICAgICAgICAgICAgICAgIk9iamVjdFNhdmVUZXN0OnRlc3RPYmplY3RTZXJpYWxpemFibGUoKTogLi4uLnJlc3RvcmVkIG9wZXJhdGlvbiBjb21wbGV0ZWQuLi4uLiIpOw0KLQ0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleDIpIHsNCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJPYmplY3RTYXZlVGVzdDp0ZXN0T2JqZWN0U2VyaWFsaXphYmxlKCk6IGVycm9yIGR1cmluZyByZXN0b3JlIFsiDQotICAgICAgICAgICAgICAgICAgICAgICAgKyBleDIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkNCi0gICAgICAgICAgICAgICAgICAgICAgICArICIgOiAiDQotICAgICAgICAgICAgICAgICAgICAgICAgKyBleDIuZ2V0TWVzc2FnZSgpICsgIl0iKTsNCi0JCQkJZXgyLnByaW50U3RhY2tUcmFjZSgpOw0KLQkJCX0NCi0NCi0JCQlhc3NlcnRUcnVlKHJlc3RvcmVkKTsNCi0NCi0JCQkvLyBpZiB0aGUgc2F2ZS9yZXN0b3JlIG9mIHRoZSBvYmplY3Qgc3VjY2VlZGVkLA0KLQkJCS8vIHRoZW4gZG9uJ3Qga2VlcCB0aGUgdGVtcG9yYXJ5IGZpbGUgYXJvdW5kDQotCQkJYm9vbGVhbiByZW1vdmVUbXBGaWxlID0gc2F2ZWQgJiYgcmVzdG9yZWQ7DQotCQkJaWYgKHJlbW92ZVRtcEZpbGUpIHsNCi0JCQkJdHJ5IHsNCi0JCQkJCXRoZUZpbGUuZGVsZXRlKCk7DQotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotCQkJCQkvLyBqdXN0IGFic29yYiBpdA0KLQkJCQl9DQotCQkJfQ0KLQ0KLQkJCS8vIGluZGljYXRlIHRoYXQgdGhlIHRlbXAgZmlsZSB3YXMgY3JlYXRlZCBvaw0KLQkJCWRvbmUgPSB0cnVlOw0KLQkJfQ0KLQ0KLQkJLy8gdGhpcyBpcyBmYWxzZSB3aGVuIHRoZXJlIGFyZSBwcm9ibGVtcyB3aXRoIHRoZSB0ZW1wb3JhcnkgZmlsZQ0KLQkJYXNzZXJ0VHJ1ZShkb25lKTsNCi0NCi0gICAgICAgIGxvZy5kZWJ1ZygiT2JqZWN0U2F2ZVRlc3Q6dGVzdE9iamVjdFNlcmlhbGl6YWJsZSgpOiAgRU5EIC0tLS0tLS0tLS0tLS0tLSIpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RPYmplY3ROb3RTZXJpYWxpemFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0JCUZpbGUgdGhlRmlsZSA9IG51bGw7DQotCQlTdHJpbmcgdGhlRmlsZW5hbWUgPSBudWxsOw0KLQkJYm9vbGVhbiBzYXZlZCA9IGZhbHNlOw0KLQkJYm9vbGVhbiByZXN0b3JlZCA9IGZhbHNlOw0KLQkJYm9vbGVhbiBleHBlY3RlZF9leGNlcHRpb24gPSBmYWxzZTsNCi0JCWJvb2xlYW4gZG9uZSA9IGZhbHNlOw0KLQ0KLSAgICAgICAgbG9nLmRlYnVnKCJPYmplY3RTYXZlVGVzdDp0ZXN0T2JqZWN0Tm90U2VyaWFsaXphYmxlKCk6ICBCRUdJTiAtLS0tLS0tLS0tLS0tLS0iKTsNCi0NCi0JCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJLy8gc2V0dXAgYW4gb2JqZWN0IHRvIHVzZQ0KLQkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCQlOb3RTZXJpYWxpemFibGVPYmplY3Qgb2JqID0gbmV3IE5vdFNlcmlhbGl6YWJsZU9iamVjdCgibnNvXzEiKTsNCi0NCi0JCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJLy8gc2V0dXAgYSB0ZW1wb3JhcnkgZmlsZSB0byB1c2UNCi0JCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJdHJ5IHsNCi0JCQl0aGVGaWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgib2JqZWN0VGVzdCIsIG51bGwpOw0KLQkJCXRoZUZpbGVuYW1lID0gdGhlRmlsZS5nZXROYW1lKCk7DQotICAgICAgICAgICAgbG9nLmRlYnVnKCJPYmplY3RTYXZlVGVzdDp0ZXN0T2JqZWN0Tm90U2VyaWFsaXphYmxlKCk6IHRlbXAgZmlsZSA9IFsiDQotICAgICAgICAgICAgICAgICAgICArIHRoZUZpbGVuYW1lICsgIl0iKTsNCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiT2JqZWN0U2F2ZVRlc3Q6dGVzdE9iamVjdE5vdFNlcmlhbGl6YWJsZSgpOiBlcnJvciBjcmVhdGluZyB0ZW1wIGZpbGUgPSBbIg0KLSAgICAgICAgICAgICAgICAgICAgKyBleC5nZXRNZXNzYWdlKCkgKyAiXSIpOw0KLQkJCXRoZUZpbGUgPSBudWxsOw0KLQkJfQ0KLQ0KLQkJaWYgKHRoZUZpbGUgIT0gbnVsbCkgew0KLQkJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJCS8vIHNhdmUgdG8gdGhlIHRlbXBvcmFyeSBmaWxlDQotCQkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCQkJRmlsZU91dHB1dFN0cmVhbSBvdXRTdHJlYW0gPSBudWxsOw0KLQkJCU9iamVjdE91dHB1dFN0cmVhbSBvdXRPYmpTdHJlYW0gPSBudWxsOw0KLQkJCXRyeSB7DQotCQkJCS8vIHNldHVwIGFuIG91dHB1dCBzdHJlYW0gdG8gYSBwaHlzaWNhbCBmaWxlDQotCQkJCW91dFN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRoZUZpbGUpOw0KLQ0KLQkJCQkvLyBhdHRhY2ggYSBzdHJlYW0gY2FwYWJsZSBvZiB3cml0aW5nIG9iamVjdHMgdG8gdGhlDQotCQkJCS8vIHN0cmVhbSBjb25uZWN0ZWQgdG8gdGhlIGZpbGUNCi0JCQkJb3V0T2JqU3RyZWFtID0gbmV3IE9iamVjdE91dHB1dFN0cmVhbShvdXRTdHJlYW0pOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2FmZU9iamVjdE91dHB1dFN0cmVhbSBvdXQgPSANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYWZlT2JqZWN0T3V0cHV0U3RyZWFtLmluc3RhbGwob3V0T2JqU3RyZWFtKTsNCi0NCi0JCQkJLy8gdHJ5IHRvIHNhdmUNCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJPYmplY3RTYXZlVGVzdDp0ZXN0T2JqZWN0Tm90U2VyaWFsaXphYmxlKCk6IHNhdmluZyAuLi4uLiIpOw0KLQkJCQlzYXZlZCA9IGZhbHNlOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlT2JqZWN0KG9iaik7DQotCQkJCXNhdmVkID0gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKA0KLSAgICAgICAgICAgICAgICAgICAgICAgICJPYmplY3RTYXZlVGVzdDp0ZXN0T2JqZWN0Tm90U2VyaWFsaXphYmxlKCk6ICIgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICIuLi4uc2F2ZSBvcGVyYXRpb24gY29tcGxldGVkLi4uLi4iKTsNCi0NCi0JCQkJbG9uZyBmaWxlc2l6ZSA9IHRoZUZpbGUubGVuZ3RoKCk7DQotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiT2JqZWN0U2F2ZVRlc3Q6dGVzdE9iamVjdE5vdFNlcmlhbGl6YWJsZSgpOiBmaWxlIHNpemUgYWZ0ZXIgc2F2ZSBbIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICsgZmlsZXNpemUNCi0gICAgICAgICAgICAgICAgICAgICAgICArICJdICAgdGVtcCBmaWxlID0gWyINCi0gICAgICAgICAgICAgICAgICAgICAgICArIHRoZUZpbGVuYW1lDQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiXSIpOw0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleDIpIHsNCi0JCQkJLy8gZXhwZWN0IGFuIGVycm9yIGhlcmUNCi0JCQkJLy8gT2JqZWN0U3RhdGVVdGlscyBjYXRjaGVzIHRoZSBOb3RTZXJpYWxpemFibGVFeGNlcHRpb24gYW5kDQotCQkJCS8vIGxvZ3MgaXQNCi0JCQkJaWYgKGV4MiBpbnN0YW5jZW9mIE5vdFNlcmlhbGl6YWJsZUV4Y2VwdGlvbikgew0KLQkJCQkJZXhwZWN0ZWRfZXhjZXB0aW9uID0gdHJ1ZTsNCi0JCQkJfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiT2JqZWN0U2F2ZVRlc3Q6dGVzdE9iamVjdE5vdFNlcmlhbGl6YWJsZSgpOiAgc2F2ZSBbIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGV4Mi5nZXRDbGFzcygpLmdldE5hbWUoKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgOiAiDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZXgyLmdldE1lc3NhZ2UoKSArICJdIik7DQotCQkJCX0NCi0JCQl9DQotCQkJLy8gY2xvc2Ugb3V0IHRoZSBzdHJlYW1zDQotCQkJaWYgKG91dE9ialN0cmVhbSAhPSBudWxsKQ0KLQkJCQlvdXRPYmpTdHJlYW0uY2xvc2UoKTsNCi0JCQlpZiAob3V0U3RyZWFtICE9IG51bGwpDQotCQkJCW91dFN0cmVhbS5jbG9zZSgpOw0KLQ0KLQkJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJCS8vIHJlc3RvcmUgZnJvbSB0aGUgdGVtcG9yYXJ5IGZpbGUNCi0JCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JCQl0cnkgew0KLQkJCQkvLyBzZXR1cCBhbiBpbnB1dCBzdHJlYW0gdG8gdGhlIGZpbGUNCi0JCQkJRmlsZUlucHV0U3RyZWFtIGluU3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbSh0aGVGaWxlKTsNCi0NCi0JCQkJLy8gYXR0YWNoIGEgc3RyZWFtIGNhcGFibGUgb2YgcmVhZGluZyBvYmplY3RzIGZyb20gdGhlDQotCQkJCS8vIHN0cmVhbSBjb25uZWN0ZWQgdG8gdGhlIGZpbGUNCi0JCQkJT2JqZWN0SW5wdXRTdHJlYW0gaW5PYmpTdHJlYW0gPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0oaW5TdHJlYW0pOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2FmZU9iamVjdElucHV0U3RyZWFtIGluID0gDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2FmZU9iamVjdElucHV0U3RyZWFtLmluc3RhbGwoaW5PYmpTdHJlYW0pOw0KLQ0KLQkJCQkvLyB0cnkgdG8gcmVzdG9yZSB0aGUgb3B0aW9ucw0KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIk9iamVjdFNhdmVUZXN0OnRlc3RPYmplY3RTZXJpYWxpemFibGUoKTogcmVzdG9yaW5nIC4uLi4uIik7DQotCQkJCXJlc3RvcmVkID0gZmFsc2U7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgcmVzdG9yZWRfb2JqID0gaW4ucmVhZE9iamVjdCgpOw0KLQkJCQlpbk9ialN0cmVhbS5jbG9zZSgpOw0KLQkJCQlpblN0cmVhbS5jbG9zZSgpOw0KLQ0KLQkJCQlyZXN0b3JlZCA9IHRydWU7DQotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygNCi0gICAgICAgICAgICAgICAgICAgICAgICAiT2JqZWN0U2F2ZVRlc3Q6dGVzdE9iamVjdE5vdFNlcmlhbGl6YWJsZSgpOiAiICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAiLi4uLnJlc3RvcmVkIG9wZXJhdGlvbiBjb21wbGV0ZWQuLi4uLiIpOw0KLQ0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgew0KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIk9iamVjdFNhdmVUZXN0OnRlc3RPYmplY3ROb3RTZXJpYWxpemFibGUoKTogZXJyb3IgZHVyaW5nIHJlc3RvcmUgWyINCi0gICAgICAgICAgICAgICAgICAgICAgICArIGV4LmdldENsYXNzKCkuZ2V0TmFtZSgpDQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiIDogIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICsgZXguZ2V0TWVzc2FnZSgpICsgIl0iKTsNCi0JCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7DQotCQkJfQ0KLQ0KLQkJCWFzc2VydFRydWUocmVzdG9yZWQpOw0KLQ0KLQkJCS8vIGlmIHRoZSBzYXZlL3Jlc3RvcmUgb2YgdGhlIG9iamVjdCBzdWNjZWVkZWQsDQotCQkJLy8gdGhlbiBkb24ndCBrZWVwIHRoZSB0ZW1wb3JhcnkgZmlsZSBhcm91bmQNCi0JCQlib29sZWFuIHJlbW92ZVRtcEZpbGUgPSBzYXZlZCAmJiByZXN0b3JlZDsNCi0JCQlpZiAocmVtb3ZlVG1wRmlsZSkgew0KLQkJCQl0cnkgew0KLQkJCQkJdGhlRmlsZS5kZWxldGUoKTsNCi0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0JCQkJCS8vIGp1c3QgYWJzb3JiIGl0DQotCQkJCX0NCi0JCQl9DQotDQotCQkJYXNzZXJ0VHJ1ZShleHBlY3RlZF9leGNlcHRpb24pOw0KLQkJfQ0KLQ0KLSAgICAgICAgbG9nLmRlYnVnKCJPYmplY3RTYXZlVGVzdDp0ZXN0T2JqZWN0Tm90U2VyaWFsaXphYmxlKCk6ICBFTkQgLS0tLS0tLS0tLS0tLS0tIik7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdEFycmF5TGlzdCgpIHRocm93cyBFeGNlcHRpb24gew0KLQkJRmlsZSB0aGVGaWxlID0gbnVsbDsNCi0JCVN0cmluZyB0aGVGaWxlbmFtZSA9IG51bGw7DQotCQlib29sZWFuIHNhdmVkID0gZmFsc2U7DQotCQlib29sZWFuIHJlc3RvcmVkID0gZmFsc2U7DQotCQlib29sZWFuIGRvbmUgPSBmYWxzZTsNCi0JCWJvb2xlYW4gY29tcGFyZXNPSyA9IGZhbHNlOw0KLQ0KLSAgICAgICAgbG9nLmRlYnVnKCJPYmplY3RTYXZlVGVzdDp0ZXN0QXJyYXlMaXN0KCk6ICBCRUdJTiAtLS0tLS0tLS0tLS0tLS0iKTsNCi0NCi0JCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJLy8gc2V0dXAgdGhlIG9iamVjdCB0byB1c2UNCi0JCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJQXJyYXlMaXN0IG9iaiA9IG5ldyBBcnJheUxpc3QoKTsNCi0JCW9iai5hZGQobmV3IEludGVnZXIoMSkpOw0KLQkJb2JqLmFkZChuZXcgSW50ZWdlcigyKSk7DQotCQlvYmouYWRkKG5ldyBJbnRlZ2VyKDMpKTsNCi0JCW9iai5hZGQobmV3IFN0cmluZygic3RyaW5nMSIpKTsNCi0JCW9iai5hZGQobmV3IFN0cmluZygic3RyaW5nMiIpKTsNCi0JCW9iai5hZGQoU3lzdGVtLm91dCk7DQotCQlvYmouYWRkKG5ldyBJbnRlZ2VyKDQpKTsNCi0JCW9iai5hZGQobmV3IEludGVnZXIoNSkpOw0KLQkJb2JqLmFkZChuZXcgSW50ZWdlcig2KSk7DQotDQotCQlpbnQgaW5pdGlhbF9zaXplID0gb2JqLnNpemUoKTsNCi0NCi0JCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJLy8gc2V0dXAgYSB0ZW1wb3JhcnkgZmlsZSB0byB1c2UNCi0JCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJdHJ5IHsNCi0JCQl0aGVGaWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgiYXJyYXlsaXN0VGVzdCIsIG51bGwpOw0KLQkJCXRoZUZpbGVuYW1lID0gdGhlRmlsZS5nZXROYW1lKCk7DQotICAgICAgICAgICAgbG9nLmRlYnVnKCJPYmplY3RTYXZlVGVzdDp0ZXN0QXJyYXlMaXN0KCk6IHRlbXAgZmlsZSA9IFsiDQotICAgICAgICAgICAgICAgICAgICArIHRoZUZpbGVuYW1lICsgIl0iKTsNCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiT2JqZWN0U2F2ZVRlc3Q6dGVzdEFycmF5TGlzdCgpOiBlcnJvciBjcmVhdGluZyB0ZW1wIGZpbGUgPSBbIg0KLSAgICAgICAgICAgICAgICAgICAgKyBleC5nZXRNZXNzYWdlKCkgKyAiXSIpOw0KLQkJCXRoZUZpbGUgPSBudWxsOw0KLQkJfQ0KLQ0KLQkJaWYgKHRoZUZpbGUgIT0gbnVsbCkgew0KLQkJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJCS8vIHNhdmUgdG8gdGhlIHRlbXBvcmFyeSBmaWxlDQotCQkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCQkJdHJ5IHsNCi0JCQkJLy8gc2V0dXAgYW4gb3V0cHV0IHN0cmVhbSB0byBhIHBoeXNpY2FsIGZpbGUNCi0JCQkJRmlsZU91dHB1dFN0cmVhbSBvdXRTdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbSh0aGVGaWxlKTsNCi0NCi0JCQkJLy8gYXR0YWNoIGEgc3RyZWFtIGNhcGFibGUgb2Ygd3JpdGluZyBvYmplY3RzIHRvIHRoZQ0KLQkJCQkvLyBzdHJlYW0gY29ubmVjdGVkIHRvIHRoZSBmaWxlDQotCQkJCU9iamVjdE91dHB1dFN0cmVhbSBvdXRPYmpTdHJlYW0gPSBuZXcgT2JqZWN0T3V0cHV0U3RyZWFtKA0KLQkJCQkJCW91dFN0cmVhbSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYWZlT2JqZWN0T3V0cHV0U3RyZWFtIG91dCA9IA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhZmVPYmplY3RPdXRwdXRTdHJlYW0uaW5zdGFsbChvdXRPYmpTdHJlYW0pOw0KLQ0KLQkJCQkvLyB0cnkgdG8gc2F2ZQ0KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIk9iamVjdFNhdmVUZXN0OnRlc3RBcnJheUxpc3QoKTogc2F2aW5nIC4uLi4uIik7DQotCQkJCXNhdmVkID0gZmFsc2U7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGVMaXN0KG9iaik7DQotDQotCQkJCS8vIGNsb3NlIG91dCB0aGUgc3RyZWFtcw0KLQkJCQlvdXRPYmpTdHJlYW0uZmx1c2goKTsNCi0JCQkJb3V0T2JqU3RyZWFtLmNsb3NlKCk7DQotCQkJCW91dFN0cmVhbS5mbHVzaCgpOw0KLQkJCQlvdXRTdHJlYW0uY2xvc2UoKTsNCi0NCi0JCQkJc2F2ZWQgPSB0cnVlOw0KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIk9iamVjdFNhdmVUZXN0OnRlc3RBcnJheUxpc3QoKTogLi4uLnNhdmUgb3BlcmF0aW9uIGNvbXBsZXRlZC4uLi4uIik7DQotDQotCQkJCWxvbmcgZmlsZXNpemUgPSB0aGVGaWxlLmxlbmd0aCgpOw0KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIk9iamVjdFNhdmVUZXN0OnRlc3RBcnJheUxpc3QoKTogZmlsZSBzaXplIGFmdGVyIHNhdmUgWyINCi0gICAgICAgICAgICAgICAgICAgICAgICArIGZpbGVzaXplDQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiXSAgIHRlbXAgZmlsZSA9IFsiDQotICAgICAgICAgICAgICAgICAgICAgICAgKyB0aGVGaWxlbmFtZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICsgIl0iKTsNCi0JCQl9IGNhdGNoIChFeGNlcHRpb24gZXgyKSB7DQotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiT2JqZWN0U2F2ZVRlc3Q6dGVzdEFycmF5TGlzdCgpOiBlcnJvciBkdXJpbmcgc2F2ZSBbIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICsgZXgyLmdldENsYXNzKCkuZ2V0TmFtZSgpDQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiIDogIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICsgZXgyLmdldE1lc3NhZ2UoKSArICJdIik7DQotCQkJCWV4Mi5wcmludFN0YWNrVHJhY2UoKTsNCi0JCQl9DQotDQotCQkJYXNzZXJ0VHJ1ZShzYXZlZCk7DQotDQotCQkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCQkJLy8gcmVzdG9yZSBmcm9tIHRoZSB0ZW1wb3JhcnkgZmlsZQ0KLQkJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJCUFycmF5TGlzdCByZXN0b3JlZF9vYmogPSBudWxsOw0KLQ0KLQkJCXRyeSB7DQotCQkJCS8vIHNldHVwIGFuIGlucHV0IHN0cmVhbSB0byB0aGUgZmlsZQ0KLQkJCQlGaWxlSW5wdXRTdHJlYW0gaW5TdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKHRoZUZpbGUpOw0KLQ0KLQkJCQkvLyBhdHRhY2ggYSBzdHJlYW0gY2FwYWJsZSBvZiByZWFkaW5nIG9iamVjdHMgZnJvbSB0aGUNCi0JCQkJLy8gc3RyZWFtIGNvbm5lY3RlZCB0byB0aGUgZmlsZQ0KLQkJCQlPYmplY3RJbnB1dFN0cmVhbSBpbk9ialN0cmVhbSA9IG5ldyBPYmplY3RJbnB1dFN0cmVhbShpblN0cmVhbSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYWZlT2JqZWN0SW5wdXRTdHJlYW0gaW4gPSANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYWZlT2JqZWN0SW5wdXRTdHJlYW0uaW5zdGFsbChpbk9ialN0cmVhbSk7DQotDQotCQkJCS8vIHRyeSB0byByZXN0b3JlIHRoZSBvcHRpb25zDQotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiT2JqZWN0U2F2ZVRlc3Q6dGVzdEFycmF5TGlzdCgpOiByZXN0b3JpbmcgLi4uLi4iKTsNCi0JCQkJcmVzdG9yZWQgPSBmYWxzZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RvcmVkX29iaiA9IGluLnJlYWRBcnJheUxpc3QoKTsNCi0JCQkJaW5PYmpTdHJlYW0uY2xvc2UoKTsNCi0JCQkJaW5TdHJlYW0uY2xvc2UoKTsNCi0NCi0JCQkJcmVzdG9yZWQgPSB0cnVlOw0KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIk9iamVjdFNhdmVUZXN0OnRlc3RBcnJheUxpc3QoKTogLi4uLnJlc3RvcmVkIG9wZXJhdGlvbiBjb21wbGV0ZWQuLi4uLiIpOw0KLQ0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleDIpIHsNCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJPYmplY3RTYXZlVGVzdDp0ZXN0QXJyYXlMaXN0KCk6IGVycm9yIGR1cmluZyByZXN0b3JlIFsiDQotICAgICAgICAgICAgICAgICAgICAgICAgKyBleDIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkNCi0gICAgICAgICAgICAgICAgICAgICAgICArICIgOiAiDQotICAgICAgICAgICAgICAgICAgICAgICAgKyBleDIuZ2V0TWVzc2FnZSgpICsgIl0iKTsNCi0JCQkJZXgyLnByaW50U3RhY2tUcmFjZSgpOw0KLQkJCX0NCi0NCi0JCQkvLyBpZiB0aGUgc2F2ZS9yZXN0b3JlIG9mIHRoZSBvYmplY3Qgc3VjY2VlZGVkLA0KLQkJCS8vIHRoZW4gZG9uJ3Qga2VlcCB0aGUgdGVtcG9yYXJ5IGZpbGUgYXJvdW5kDQotCQkJYm9vbGVhbiByZW1vdmVUbXBGaWxlID0gc2F2ZWQgJiYgcmVzdG9yZWQ7DQotCQkJaWYgKHJlbW92ZVRtcEZpbGUpIHsNCi0JCQkJdHJ5IHsNCi0JCQkJCXRoZUZpbGUuZGVsZXRlKCk7DQotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotCQkJCQkvLyBqdXN0IGFic29yYiBpdA0KLQkJCQl9DQotCQkJfQ0KLQ0KLQkJCWFzc2VydFRydWUocmVzdG9yZWQpOw0KLQ0KLQkJCWlmIChyZXN0b3JlZF9vYmogIT0gbnVsbCkgew0KLQkJCQlpbnQgcmVzdG9yZWRfc2l6ZSA9IHJlc3RvcmVkX29iai5zaXplKCk7DQotCQkJCWlmIChyZXN0b3JlZF9zaXplID09IChpbml0aWFsX3NpemUgLSAxKSkgew0KLQkJCQkJY29tcGFyZXNPSyA9IHRydWU7DQotCQkJCX0NCi0JCQl9DQotDQotCQkJLy8gVE9ETzogY2hlY2sgZm9yIGV4YWN0IGVudHJpZXMNCi0NCi0JCQlhc3NlcnRUcnVlKGNvbXBhcmVzT0spOw0KLQ0KLQkJCS8vIGluZGljYXRlIHRoYXQgdGhlIHRlbXAgZmlsZSB3YXMgY3JlYXRlZCBvaw0KLQkJCWRvbmUgPSB0cnVlOw0KLQkJfQ0KLQ0KLQkJLy8gdGhpcyBpcyBmYWxzZSB3aGVuIHRoZXJlIGFyZSBwcm9ibGVtcyB3aXRoIHRoZSB0ZW1wb3JhcnkgZmlsZQ0KLQkJYXNzZXJ0VHJ1ZShkb25lKTsNCi0NCi0gICAgICAgIGxvZy5kZWJ1ZygiT2JqZWN0U2F2ZVRlc3Q6dGVzdEFycmF5TGlzdCgpOiAgRU5EIC0tLS0tLS0tLS0tLS0tLSIpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RIYXNoTWFwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotCQlGaWxlIHRoZUZpbGUgPSBudWxsOw0KLQkJU3RyaW5nIHRoZUZpbGVuYW1lID0gbnVsbDsNCi0JCWJvb2xlYW4gc2F2ZWQgPSBmYWxzZTsNCi0JCWJvb2xlYW4gcmVzdG9yZWQgPSBmYWxzZTsNCi0JCWJvb2xlYW4gZG9uZSA9IGZhbHNlOw0KLQkJYm9vbGVhbiBjb21wYXJlc09LID0gZmFsc2U7DQotDQotICAgICAgICBsb2cuZGVidWcoIk9iamVjdFNhdmVUZXN0OnRlc3RIYXNoTWFwKCk6ICBCRUdJTiAtLS0tLS0tLS0tLS0tLS0iKTsNCi0NCi0JCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJLy8gc2V0dXAgdGhlIG9iamVjdCB0byB1c2UNCi0JCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJSGFzaE1hcCBvYmogPSBuZXcgSGFzaE1hcCgpOw0KLQkJb2JqLnB1dChuZXcgU3RyaW5nKCJrZXkxIiksIG5ldyBJbnRlZ2VyKDEpKTsNCi0JCW9iai5wdXQobmV3IFN0cmluZygia2V5MiIpLCBuZXcgSW50ZWdlcigyKSk7DQotCQlvYmoucHV0KG5ldyBTdHJpbmcoImtleTMiKSwgbmV3IFN0cmluZygidmFsdWUxIikpOw0KLQkJb2JqLnB1dChuZXcgU3RyaW5nKCJrZXk0IiksIFN5c3RlbS5vdXQpOw0KLQkJb2JqLnB1dChuZXcgU3RyaW5nKCJrZXk1IiksIG5ldyBJbnRlZ2VyKDMpKTsNCi0JCW9iai5wdXQobmV3IFN0cmluZygia2V5NiIpLCBuZXcgSW50ZWdlcig0KSk7DQotCQlvYmoucHV0KG5ldyBTdHJpbmcoImtleTciKSwgU3lzdGVtLmVycik7DQotCQlvYmoucHV0KG5ldyBTdHJpbmcoImtleTgiKSwgbmV3IEludGVnZXIoNSkpOw0KLQkJb2JqLnB1dChuZXcgU3RyaW5nKCJrZXk5IiksIG5ldyBJbnRlZ2VyKDYpKTsNCi0JCW9iai5wdXQobmV3IE5vdFNlcmlhbGl6YWJsZU9iamVjdCgiVGVzdEZvckhhc2hNYXBLZXkiKSwgbmV3IEludGVnZXIoNykpOw0KLQkJb2JqLnB1dChuZXcgU3RyaW5nKCJrZXkxMCIpLCBuZXcgSW50ZWdlcig4KSk7DQotDQotCQlpbnQgaW5pdGlhbF9zaXplID0gb2JqLnNpemUoKTsNCi0NCi0JCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJLy8gc2V0dXAgYSB0ZW1wb3JhcnkgZmlsZSB0byB1c2UNCi0JCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJdHJ5IHsNCi0JCQl0aGVGaWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgiaGFzaG1hcFRlc3QiLCBudWxsKTsNCi0JCQl0aGVGaWxlbmFtZSA9IHRoZUZpbGUuZ2V0TmFtZSgpOw0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiT2JqZWN0U2F2ZVRlc3Q6dGVzdEhhc2hNYXAoKTogdGVtcCBmaWxlID0gWyINCi0gICAgICAgICAgICAgICAgICAgICsgdGhlRmlsZW5hbWUgKyAiXSIpOw0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKCJPYmplY3RTYXZlVGVzdDp0ZXN0SGFzaE1hcCgpOiBlcnJvciBjcmVhdGluZyB0ZW1wIGZpbGUgPSBbIg0KLSAgICAgICAgICAgICAgICAgICAgKyBleC5nZXRNZXNzYWdlKCkgKyAiXSIpOw0KLQkJCXRoZUZpbGUgPSBudWxsOw0KLQkJfQ0KLQ0KLQkJaWYgKHRoZUZpbGUgIT0gbnVsbCkgew0KLQkJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJCS8vIHNhdmUgdG8gdGhlIHRlbXBvcmFyeSBmaWxlDQotCQkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCQkJdHJ5IHsNCi0JCQkJLy8gc2V0dXAgYW4gb3V0cHV0IHN0cmVhbSB0byBhIHBoeXNpY2FsIGZpbGUNCi0JCQkJRmlsZU91dHB1dFN0cmVhbSBvdXRTdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbSh0aGVGaWxlKTsNCi0NCi0JCQkJLy8gYXR0YWNoIGEgc3RyZWFtIGNhcGFibGUgb2Ygd3JpdGluZyBvYmplY3RzIHRvIHRoZQ0KLQkJCQkvLyBzdHJlYW0gY29ubmVjdGVkIHRvIHRoZSBmaWxlDQotCQkJCU9iamVjdE91dHB1dFN0cmVhbSBvdXRPYmpTdHJlYW0gPSBuZXcgT2JqZWN0T3V0cHV0U3RyZWFtKA0KLQkJCQkJCW91dFN0cmVhbSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYWZlT2JqZWN0T3V0cHV0U3RyZWFtIG91dCA9IA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhZmVPYmplY3RPdXRwdXRTdHJlYW0uaW5zdGFsbChvdXRPYmpTdHJlYW0pOw0KLQ0KLQkJCQkvLyB0cnkgdG8gc2F2ZQ0KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIk9iamVjdFNhdmVUZXN0OnRlc3RIYXNoTWFwKCk6IHNhdmluZyAuLi4uLiIpOw0KLQkJCQlzYXZlZCA9IGZhbHNlOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlTWFwKG9iaik7DQotDQotCQkJCS8vIGNsb3NlIG91dCB0aGUgc3RyZWFtcw0KLQkJCQlvdXRPYmpTdHJlYW0uZmx1c2goKTsNCi0JCQkJb3V0T2JqU3RyZWFtLmNsb3NlKCk7DQotCQkJCW91dFN0cmVhbS5mbHVzaCgpOw0KLQkJCQlvdXRTdHJlYW0uY2xvc2UoKTsNCi0NCi0JCQkJc2F2ZWQgPSB0cnVlOw0KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIk9iamVjdFNhdmVUZXN0OnRlc3RIYXNoTWFwKCk6IC4uLi5zYXZlIG9wZXJhdGlvbiBjb21wbGV0ZWQuLi4uLiIpOw0KLQ0KLQkJCQlsb25nIGZpbGVzaXplID0gdGhlRmlsZS5sZW5ndGgoKTsNCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJPYmplY3RTYXZlVGVzdDp0ZXN0SGFzaE1hcCgpOiBmaWxlIHNpemUgYWZ0ZXIgc2F2ZSBbIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICsgZmlsZXNpemUNCi0gICAgICAgICAgICAgICAgICAgICAgICArICJdICAgdGVtcCBmaWxlID0gWyINCi0gICAgICAgICAgICAgICAgICAgICAgICArIHRoZUZpbGVuYW1lDQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiXSIpOw0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleDIpIHsNCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJPYmplY3RTYXZlVGVzdDp0ZXN0SGFzaE1hcCgpOiBlcnJvciBkdXJpbmcgc2F2ZSBbIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICsgZXgyLmdldENsYXNzKCkuZ2V0TmFtZSgpDQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiIDogIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICsgZXgyLmdldE1lc3NhZ2UoKSArICJdIik7DQotCQkJCWV4Mi5wcmludFN0YWNrVHJhY2UoKTsNCi0JCQl9DQotDQotCQkJYXNzZXJ0VHJ1ZShzYXZlZCk7DQotDQotCQkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCQkJLy8gcmVzdG9yZSBmcm9tIHRoZSB0ZW1wb3JhcnkgZmlsZQ0KLQkJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJCUhhc2hNYXAgcmVzdG9yZWRfb2JqID0gbnVsbDsNCi0NCi0JCQl0cnkgew0KLQkJCQkvLyBzZXR1cCBhbiBpbnB1dCBzdHJlYW0gdG8gdGhlIGZpbGUNCi0JCQkJRmlsZUlucHV0U3RyZWFtIGluU3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbSh0aGVGaWxlKTsNCi0NCi0JCQkJLy8gYXR0YWNoIGEgc3RyZWFtIGNhcGFibGUgb2YgcmVhZGluZyBvYmplY3RzIGZyb20gdGhlDQotCQkJCS8vIHN0cmVhbSBjb25uZWN0ZWQgdG8gdGhlIGZpbGUNCi0JCQkJT2JqZWN0SW5wdXRTdHJlYW0gaW5PYmpTdHJlYW0gPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0oaW5TdHJlYW0pOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2FmZU9iamVjdElucHV0U3RyZWFtIGluID0gDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2FmZU9iamVjdElucHV0U3RyZWFtLmluc3RhbGwoaW5PYmpTdHJlYW0pOw0KLQ0KLQkJCQkvLyB0cnkgdG8gcmVzdG9yZSB0aGUgb3B0aW9ucw0KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIk9iamVjdFNhdmVUZXN0OnRlc3RIYXNoTWFwKCk6IHJlc3RvcmluZyAuLi4uLiIpOw0KLQkJCQlyZXN0b3JlZCA9IGZhbHNlOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdG9yZWRfb2JqID0gaW4ucmVhZEhhc2hNYXAoKTsNCi0JCQkJaW5PYmpTdHJlYW0uY2xvc2UoKTsNCi0JCQkJaW5TdHJlYW0uY2xvc2UoKTsNCi0NCi0JCQkJcmVzdG9yZWQgPSB0cnVlOw0KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIk9iamVjdFNhdmVUZXN0OnRlc3RIYXNoTWFwKCk6IC4uLi5yZXN0b3JlZCBvcGVyYXRpb24gY29tcGxldGVkLi4uLi4iKTsNCi0NCi0JCQl9IGNhdGNoIChFeGNlcHRpb24gZXgyKSB7DQotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiT2JqZWN0U2F2ZVRlc3Q6dGVzdEhhc2hNYXAoKTogZXJyb3IgZHVyaW5nIHJlc3RvcmUgWyINCi0gICAgICAgICAgICAgICAgICAgICAgICArIGV4Mi5nZXRDbGFzcygpLmdldE5hbWUoKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiA6ICINCi0gICAgICAgICAgICAgICAgICAgICAgICArIGV4Mi5nZXRNZXNzYWdlKCkgKyAiXSIpOw0KLQkJCQlleDIucHJpbnRTdGFja1RyYWNlKCk7DQotCQkJfQ0KLQ0KLQkJCS8vIGlmIHRoZSBzYXZlL3Jlc3RvcmUgb2YgdGhlIG9iamVjdCBzdWNjZWVkZWQsDQotCQkJLy8gdGhlbiBkb24ndCBrZWVwIHRoZSB0ZW1wb3JhcnkgZmlsZSBhcm91bmQNCi0JCQlib29sZWFuIHJlbW92ZVRtcEZpbGUgPSBzYXZlZCAmJiByZXN0b3JlZDsNCi0JCQlpZiAocmVtb3ZlVG1wRmlsZSkgew0KLQkJCQl0cnkgew0KLQkJCQkJdGhlRmlsZS5kZWxldGUoKTsNCi0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0JCQkJCS8vIGp1c3QgYWJzb3JiIGl0DQotCQkJCX0NCi0JCQl9DQotDQotCQkJYXNzZXJ0VHJ1ZShyZXN0b3JlZCk7DQotDQotCQkJaWYgKHJlc3RvcmVkX29iaiAhPSBudWxsKSB7DQotCQkJCWludCByZXN0b3JlZF9zaXplID0gcmVzdG9yZWRfb2JqLnNpemUoKTsNCi0JCQkJaWYgKHJlc3RvcmVkX3NpemUgPT0gKGluaXRpYWxfc2l6ZSAtIDMpKSB7DQotCQkJCQkvLyB0aGVyZSBhcmUgZW50cmllcyBpbiB0aGUgbWFwIHRoYXQgYXJlIG5vdCBzZXJpYWxpemFibGUNCi0JCQkJCWNvbXBhcmVzT0sgPSB0cnVlOw0KLQkJCQl9DQotCQkJfQ0KLQ0KLQkJCS8vIFRPRE86IGNoZWNrIGZvciBleGFjdCBlbnRyaWVzDQotDQotCQkJYXNzZXJ0VHJ1ZShjb21wYXJlc09LKTsNCi0NCi0JCQkvLyBpbmRpY2F0ZSB0aGF0IHRoZSB0ZW1wIGZpbGUgd2FzIGNyZWF0ZWQgb2sNCi0JCQlkb25lID0gdHJ1ZTsNCi0JCX0NCi0NCi0JCS8vIHRoaXMgaXMgZmFsc2Ugd2hlbiB0aGVyZSBhcmUgcHJvYmxlbXMgd2l0aCB0aGUgdGVtcG9yYXJ5IGZpbGUNCi0JCWFzc2VydFRydWUoZG9uZSk7DQotDQotICAgICAgICBsb2cuZGVidWcoIk9iamVjdFNhdmVUZXN0OnRlc3RIYXNoTWFwKCk6ICBFTkQgLS0tLS0tLS0tLS0tLS0tIik7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdExpbmtlZExpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0JCUZpbGUgdGhlRmlsZSA9IG51bGw7DQotCQlTdHJpbmcgdGhlRmlsZW5hbWUgPSBudWxsOw0KLQkJYm9vbGVhbiBzYXZlZCA9IGZhbHNlOw0KLQkJYm9vbGVhbiByZXN0b3JlZCA9IGZhbHNlOw0KLQkJYm9vbGVhbiBkb25lID0gZmFsc2U7DQotCQlib29sZWFuIGNvbXBhcmVzT0sgPSBmYWxzZTsNCi0NCi0gICAgICAgIGxvZy5kZWJ1ZygiT2JqZWN0U2F2ZVRlc3Q6dGVzdExpbmtlZExpc3QoKTogIEJFR0lOIC0tLS0tLS0tLS0tLS0tLSIpOw0KLQ0KLQkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCQkvLyBzZXR1cCB0aGUgb2JqZWN0IHRvIHVzZQ0KLQkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCQlMaW5rZWRMaXN0IG9iaiA9IG5ldyBMaW5rZWRMaXN0KCk7DQotCQlvYmouYWRkKG5ldyBJbnRlZ2VyKDEpKTsNCi0JCW9iai5hZGQobmV3IEludGVnZXIoMikpOw0KLQkJb2JqLmFkZChuZXcgSW50ZWdlcigzKSk7DQotCQlvYmouYWRkKG5ldyBTdHJpbmcoInN0cmluZzEiKSk7DQotCQlvYmouYWRkKG5ldyBTdHJpbmcoInN0cmluZzIiKSk7DQotCQlvYmouYWRkKFN5c3RlbS5pbik7DQotCQlvYmouYWRkKG5ldyBJbnRlZ2VyKDQpKTsNCi0JCW9iai5hZGQobmV3IEludGVnZXIoNSkpOw0KLQkJb2JqLmFkZChuZXcgSW50ZWdlcig2KSk7DQotDQotCQlpbnQgaW5pdGlhbF9zaXplID0gb2JqLnNpemUoKTsNCi0NCi0JCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJLy8gc2V0dXAgYSB0ZW1wb3JhcnkgZmlsZSB0byB1c2UNCi0JCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJdHJ5IHsNCi0JCQl0aGVGaWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgibGlua2VkbGlzdFRlc3QiLCBudWxsKTsNCi0JCQl0aGVGaWxlbmFtZSA9IHRoZUZpbGUuZ2V0TmFtZSgpOw0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiT2JqZWN0U2F2ZVRlc3Q6dGVzdExpbmtlZExpc3QoKTogdGVtcCBmaWxlID0gWyINCi0gICAgICAgICAgICAgICAgICAgICsgdGhlRmlsZW5hbWUgKyAiXSIpOw0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKCJPYmplY3RTYXZlVGVzdDp0ZXN0TGlua2VkTGlzdCgpOiBlcnJvciBjcmVhdGluZyB0ZW1wIGZpbGUgPSBbIg0KLSAgICAgICAgICAgICAgICAgICAgKyBleC5nZXRNZXNzYWdlKCkgKyAiXSIpOw0KLQkJCXRoZUZpbGUgPSBudWxsOw0KLQkJfQ0KLQ0KLQkJaWYgKHRoZUZpbGUgIT0gbnVsbCkgew0KLQkJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJCS8vIHNhdmUgdG8gdGhlIHRlbXBvcmFyeSBmaWxlDQotCQkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCQkJdHJ5IHsNCi0JCQkJLy8gc2V0dXAgYW4gb3V0cHV0IHN0cmVhbSB0byBhIHBoeXNpY2FsIGZpbGUNCi0JCQkJRmlsZU91dHB1dFN0cmVhbSBvdXRTdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbSh0aGVGaWxlKTsNCi0NCi0JCQkJLy8gYXR0YWNoIGEgc3RyZWFtIGNhcGFibGUgb2Ygd3JpdGluZyBvYmplY3RzIHRvIHRoZQ0KLQkJCQkvLyBzdHJlYW0gY29ubmVjdGVkIHRvIHRoZSBmaWxlDQotCQkJCU9iamVjdE91dHB1dFN0cmVhbSBvdXRPYmpTdHJlYW0gPSBuZXcgT2JqZWN0T3V0cHV0U3RyZWFtKA0KLQkJCQkJCW91dFN0cmVhbSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYWZlT2JqZWN0T3V0cHV0U3RyZWFtIG91dCA9IA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhZmVPYmplY3RPdXRwdXRTdHJlYW0uaW5zdGFsbChvdXRPYmpTdHJlYW0pOw0KLQ0KLQkJCQkvLyB0cnkgdG8gc2F2ZQ0KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIk9iamVjdFNhdmVUZXN0OnRlc3RMaW5rZWRMaXN0KCk6IHNhdmluZyAuLi4uLiIpOw0KLQkJCQlzYXZlZCA9IGZhbHNlOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlTGlzdChvYmopOw0KLQ0KLQkJCQkvLyBjbG9zZSBvdXQgdGhlIHN0cmVhbXMNCi0JCQkJb3V0T2JqU3RyZWFtLmZsdXNoKCk7DQotCQkJCW91dE9ialN0cmVhbS5jbG9zZSgpOw0KLQkJCQlvdXRTdHJlYW0uZmx1c2goKTsNCi0JCQkJb3V0U3RyZWFtLmNsb3NlKCk7DQotDQotCQkJCXNhdmVkID0gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJPYmplY3RTYXZlVGVzdDp0ZXN0TGlua2VkTGlzdCgpOiAuLi4uc2F2ZSBvcGVyYXRpb24gY29tcGxldGVkLi4uLi4iKTsNCi0NCi0JCQkJbG9uZyBmaWxlc2l6ZSA9IHRoZUZpbGUubGVuZ3RoKCk7DQotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiT2JqZWN0U2F2ZVRlc3Q6dGVzdExpbmtlZExpc3QoKTogZmlsZSBzaXplIGFmdGVyIHNhdmUgWyINCi0gICAgICAgICAgICAgICAgICAgICAgICArIGZpbGVzaXplDQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiXSAgIHRlbXAgZmlsZSA9IFsiDQotICAgICAgICAgICAgICAgICAgICAgICAgKyB0aGVGaWxlbmFtZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICsgIl0iKTsNCi0JCQl9IGNhdGNoIChFeGNlcHRpb24gZXgyKSB7DQotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiT2JqZWN0U2F2ZVRlc3Q6dGVzdExpbmtlZExpc3QoKTogZXJyb3IgZHVyaW5nIHNhdmUgWyINCi0gICAgICAgICAgICAgICAgICAgICAgICArIGV4Mi5nZXRDbGFzcygpLmdldE5hbWUoKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiA6ICINCi0gICAgICAgICAgICAgICAgICAgICAgICArIGV4Mi5nZXRNZXNzYWdlKCkgKyAiXSIpOw0KLQkJCQlleDIucHJpbnRTdGFja1RyYWNlKCk7DQotCQkJfQ0KLQ0KLQkJCWFzc2VydFRydWUoc2F2ZWQpOw0KLQ0KLQkJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJCS8vIHJlc3RvcmUgZnJvbSB0aGUgdGVtcG9yYXJ5IGZpbGUNCi0JCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JCQlMaW5rZWRMaXN0IHJlc3RvcmVkX29iaiA9IG51bGw7DQotDQotCQkJdHJ5IHsNCi0JCQkJLy8gc2V0dXAgYW4gaW5wdXQgc3RyZWFtIHRvIHRoZSBmaWxlDQotCQkJCUZpbGVJbnB1dFN0cmVhbSBpblN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0odGhlRmlsZSk7DQotDQotCQkJCS8vIGF0dGFjaCBhIHN0cmVhbSBjYXBhYmxlIG9mIHJlYWRpbmcgb2JqZWN0cyBmcm9tIHRoZQ0KLQkJCQkvLyBzdHJlYW0gY29ubmVjdGVkIHRvIHRoZSBmaWxlDQotCQkJCU9iamVjdElucHV0U3RyZWFtIGluT2JqU3RyZWFtID0gbmV3IE9iamVjdElucHV0U3RyZWFtKGluU3RyZWFtKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhZmVPYmplY3RJbnB1dFN0cmVhbSBpbiA9IA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhZmVPYmplY3RJbnB1dFN0cmVhbS5pbnN0YWxsKGluT2JqU3RyZWFtKTsNCi0NCi0JCQkJLy8gdHJ5IHRvIHJlc3RvcmUgdGhlIG9wdGlvbnMNCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJPYmplY3RTYXZlVGVzdDp0ZXN0TGlua2VkTGlzdCgpOiByZXN0b3JpbmcgLi4uLi4iKTsNCi0JCQkJcmVzdG9yZWQgPSBmYWxzZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RvcmVkX29iaiA9IGluLnJlYWRMaW5rZWRMaXN0KCk7DQotCQkJCWluT2JqU3RyZWFtLmNsb3NlKCk7DQotCQkJCWluU3RyZWFtLmNsb3NlKCk7DQotDQotCQkJCXJlc3RvcmVkID0gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJPYmplY3RTYXZlVGVzdDp0ZXN0TGlua2VkTGlzdCgpOiAuLi4ucmVzdG9yZWQgb3BlcmF0aW9uIGNvbXBsZXRlZC4uLi4uIik7DQotDQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4Mikgew0KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIk9iamVjdFNhdmVUZXN0OnRlc3RMaW5rZWRMaXN0KCk6IGVycm9yIGR1cmluZyByZXN0b3JlIFsiDQotICAgICAgICAgICAgICAgICAgICAgICAgKyBleDIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkNCi0gICAgICAgICAgICAgICAgICAgICAgICArICIgOiAiDQotICAgICAgICAgICAgICAgICAgICAgICAgKyBleDIuZ2V0TWVzc2FnZSgpICsgIl0iKTsNCi0JCQkJZXgyLnByaW50U3RhY2tUcmFjZSgpOw0KLQkJCX0NCi0NCi0JCQkvLyBpZiB0aGUgc2F2ZS9yZXN0b3JlIG9mIHRoZSBvYmplY3Qgc3VjY2VlZGVkLA0KLQkJCS8vIHRoZW4gZG9uJ3Qga2VlcCB0aGUgdGVtcG9yYXJ5IGZpbGUgYXJvdW5kDQotCQkJYm9vbGVhbiByZW1vdmVUbXBGaWxlID0gc2F2ZWQgJiYgcmVzdG9yZWQ7DQotCQkJaWYgKHJlbW92ZVRtcEZpbGUpIHsNCi0JCQkJdHJ5IHsNCi0JCQkJCXRoZUZpbGUuZGVsZXRlKCk7DQotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotCQkJCQkvLyBqdXN0IGFic29yYiBpdA0KLQkJCQl9DQotCQkJfQ0KLQ0KLQkJCWFzc2VydFRydWUocmVzdG9yZWQpOw0KLQ0KLQkJCWlmIChyZXN0b3JlZF9vYmogIT0gbnVsbCkgew0KLQkJCQlpbnQgcmVzdG9yZWRfc2l6ZSA9IHJlc3RvcmVkX29iai5zaXplKCk7DQotCQkJCWlmIChyZXN0b3JlZF9zaXplID09IChpbml0aWFsX3NpemUgLSAxKSkgew0KLQkJCQkJY29tcGFyZXNPSyA9IHRydWU7DQotCQkJCX0NCi0JCQl9DQotDQotCQkJLy8gVE9ETzogY2hlY2sgZm9yIGV4YWN0IGVudHJpZXMNCi0NCi0JCQlhc3NlcnRUcnVlKGNvbXBhcmVzT0spOw0KLQ0KLQkJCS8vIGluZGljYXRlIHRoYXQgdGhlIHRlbXAgZmlsZSB3YXMgY3JlYXRlZCBvaw0KLQkJCWRvbmUgPSB0cnVlOw0KLQkJfQ0KLQ0KLQkJLy8gdGhpcyBpcyBmYWxzZSB3aGVuIHRoZXJlIGFyZSBwcm9ibGVtcyB3aXRoIHRoZSB0ZW1wb3JhcnkgZmlsZQ0KLQkJYXNzZXJ0VHJ1ZShkb25lKTsNCi0NCi0gICAgICAgIGxvZy5kZWJ1ZygiT2JqZWN0U2F2ZVRlc3Q6dGVzdExpbmtlZExpc3QoKTogIEVORCAtLS0tLS0tLS0tLS0tLS0iKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgY2xhc3MgTm90U2VyaWFsaXphYmxlT2JqZWN0IGltcGxlbWVudHMgRXh0ZXJuYWxpemFibGUgew0KLQkJcHJpdmF0ZSBTdHJpbmcgbGFiZWwgPSAiVGVzdE9iamVjdCI7DQotDQotCQlwcml2YXRlIFN0cmluZyBJRCA9IG51bGw7DQotDQotCQkvLyBtYWtlIHN1cmUgd2UgaGF2ZSBzb21lIG9iamVjdHMgdGhhdCBkb24ndCBzZXJpYWxpemUNCi0JCXByaXZhdGUgUHJpbnRTdHJlYW0gcHMgPSBTeXN0ZW0ub3V0Ow0KLQ0KLQkJLy8gZGVmYXVsdCBjb25zdHJ1Y3RvciBuZWVkZWQgZm9yIEV4dGVybmFsaXphYmxlIGludGVyZmFjZQ0KLQkJcHVibGljIE5vdFNlcmlhbGl6YWJsZU9iamVjdCgpIHsNCi0JCX0NCi0NCi0JCXB1YmxpYyBOb3RTZXJpYWxpemFibGVPYmplY3QoU3RyaW5nIGlkZW50aWZpZXIpIHsNCi0JCQlJRCA9IGlkZW50aWZpZXI7DQotCQkJcHMgPSBTeXN0ZW0ub3V0Ow0KLQkJfQ0KLQ0KLQkJcHVibGljIHZvaWQgc2V0SUQoU3RyaW5nIHMpIHsNCi0JCQlJRCA9IHM7DQotCQl9DQotDQotCQlwdWJsaWMgU3RyaW5nIGdldElEKCkgew0KLQkJCXJldHVybiBJRDsNCi0JCX0NCi0NCi0JCXB1YmxpYyB2b2lkIHdyaXRlRXh0ZXJuYWwoamF2YS5pby5PYmplY3RPdXRwdXQgb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLQkJCXRocm93IG5ldyBOb3RTZXJpYWxpemFibGVFeGNlcHRpb24oDQotCQkJCQkiVGVzdCBPYmplY3QgaXMgbm90IHNlcmlhbGl6YWJsZSIpOw0KLQkJfQ0KLQ0KLQkJcHVibGljIHZvaWQgcmVhZEV4dGVybmFsKGphdmEuaW8uT2JqZWN0SW5wdXQgaW4pIHRocm93cyBJT0V4Y2VwdGlvbiwNCi0JCQkJQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7DQotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJUZXN0IG9iamVjdCBpcyBub3Qgc2VyaWFsaXphYmxlIik7DQotCQl9DQotDQotCX0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9PYmplY3RTYXZlVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9PYmplY3RTYXZlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTM2N2UxLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvT2JqZWN0U2F2ZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZW5naW5lOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5NZXRhRGF0YUVudHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5PYmplY3RTdGF0ZVV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YS5pby5FeHRlcm5hbGl6YWJsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5Ob3RTZXJpYWxpemFibGVFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBPYmplY3RTYXZlVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhPYmplY3RTYXZlVGVzdC5jbGFzcyk7Ci0gICAgCi0gICAgcHJpdmF0ZSBTdHJpbmcgdGVzdEFyZyA9IG51bGw7Ci0KLQkvLyBzaW1wbGUgY29uc3RydWN0b3IgbmVlZGVkIGZvciBuZXN0ZWQgY2xhc3MgRXh0ZXJuYWxpemFibGUgaW50ZXJmYWNlCi0JcHVibGljIE9iamVjdFNhdmVUZXN0KCkgewotCX0KLQotCXB1YmxpYyBPYmplY3RTYXZlVGVzdChTdHJpbmcgYXJnMCkgewotCQlzdXBlcihhcmcwKTsKLQkJdGVzdEFyZyA9IG5ldyBTdHJpbmcoYXJnMCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gb3JnLmFwYWNoZS5sb2c0ai5CYXNpY0NvbmZpZ3VyYXRvci5jb25maWd1cmUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0T2JqZWN0U2VyaWFsaXphYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUZpbGUgdGhlRmlsZSA9IG51bGw7Ci0JCVN0cmluZyB0aGVGaWxlbmFtZSA9IG51bGw7Ci0JCWJvb2xlYW4gc2F2ZWQgPSBmYWxzZTsKLQkJYm9vbGVhbiByZXN0b3JlZCA9IGZhbHNlOwotCQlib29sZWFuIGRvbmUgPSBmYWxzZTsKLQotICAgICAgICBsb2cuZGVidWcoIk9iamVjdFNhdmVUZXN0OnRlc3RPYmplY3RTZXJpYWxpemFibGUoKTogIEJFR0lOIC0tLS0tLS0tLS0tLS0tLSIpOwotCi0JCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQkvLyBzZXR1cCBhbiBvYmplY3QgdG8gdXNlCi0JCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQlNZXRhRGF0YUVudHJ5IG9iaiA9IG5ldyBNZXRhRGF0YUVudHJ5KCJvYmplY3RfMSIsICJvYmplY3RfMSIpOwotCi0JCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQkvLyBzZXR1cCBhIHRlbXBvcmFyeSBmaWxlIHRvIHVzZQotCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJdHJ5IHsKLQkJCXRoZUZpbGUgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJvYmplY3RUZXN0IiwgbnVsbCk7Ci0JCQl0aGVGaWxlbmFtZSA9IHRoZUZpbGUuZ2V0TmFtZSgpOwotICAgICAgICAgICAgbG9nLmRlYnVnKCJPYmplY3RTYXZlVGVzdDp0ZXN0T2JqZWN0U2VyaWFsaXphYmxlKCk6IHRlbXAgZmlsZSA9IFsiCi0gICAgICAgICAgICAgICAgICAgICsgdGhlRmlsZW5hbWUgKyAiXSIpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiT2JqZWN0U2F2ZVRlc3Q6dGVzdE9iamVjdFNlcmlhbGl6YWJsZSgpOiBlcnJvciBjcmVhdGluZyB0ZW1wIGZpbGUgPSBbIgotICAgICAgICAgICAgICAgICAgICArIGV4LmdldE1lc3NhZ2UoKSArICJdIik7Ci0JCQl0aGVGaWxlID0gbnVsbDsKLQkJfQotCi0JCWlmICh0aGVGaWxlICE9IG51bGwpIHsKLQkJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQkJLy8gc2F2ZSB0byB0aGUgdGVtcG9yYXJ5IGZpbGUKLQkJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQkJdHJ5IHsKLQkJCQkvLyBzZXR1cCBhbiBvdXRwdXQgc3RyZWFtIHRvIGEgcGh5c2ljYWwgZmlsZQotCQkJCUZpbGVPdXRwdXRTdHJlYW0gb3V0U3RyZWFtID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0odGhlRmlsZSk7Ci0KLQkJCQkvLyBhdHRhY2ggYSBzdHJlYW0gY2FwYWJsZSBvZiB3cml0aW5nIG9iamVjdHMgdG8gdGhlCi0JCQkJLy8gc3RyZWFtIGNvbm5lY3RlZCB0byB0aGUgZmlsZQotCQkJCU9iamVjdE91dHB1dFN0cmVhbSBvdXRPYmpTdHJlYW0gPSBuZXcgT2JqZWN0T3V0cHV0U3RyZWFtKAotCQkJCQkJb3V0U3RyZWFtKTsKLQotCQkJCS8vIHRyeSB0byBzYXZlCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJPYmplY3RTYXZlVGVzdDp0ZXN0T2JqZWN0U2VyaWFsaXphYmxlKCk6IHNhdmluZyAuLi4uLiIpOwotCQkJCXNhdmVkID0gZmFsc2U7Ci0JCQkJT2JqZWN0U3RhdGVVdGlscy53cml0ZU9iamVjdChvdXRPYmpTdHJlYW0sIG9iaiwKLQkJCQkJCSJ0ZXN0T2JqZWN0OlNlcmlhbGl6YWJsZSIpOwotCi0JCQkJLy8gY2xvc2Ugb3V0IHRoZSBzdHJlYW1zCi0JCQkJb3V0T2JqU3RyZWFtLmZsdXNoKCk7Ci0JCQkJb3V0T2JqU3RyZWFtLmNsb3NlKCk7Ci0JCQkJb3V0U3RyZWFtLmZsdXNoKCk7Ci0JCQkJb3V0U3RyZWFtLmNsb3NlKCk7Ci0KLQkJCQlzYXZlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKAotICAgICAgICAgICAgICAgICAgICAgICAgIk9iamVjdFNhdmVUZXN0OnRlc3RPYmplY3RTZXJpYWxpemFibGUoKTogLi4uLnNhdmUgb3BlcmF0aW9uIGNvbXBsZXRlZC4uLi4uIik7Ci0KLQkJCQlsb25nIGZpbGVzaXplID0gdGhlRmlsZS5sZW5ndGgoKTsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIk9iamVjdFNhdmVUZXN0OnRlc3RPYmplY3RTZXJpYWxpemFibGUoKTogZmlsZSBzaXplIGFmdGVyIHNhdmUgWyIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgZmlsZXNpemUKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIl0gICB0ZW1wIGZpbGUgPSBbIgotICAgICAgICAgICAgICAgICAgICAgICAgKyB0aGVGaWxlbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiXSIpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4MikgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiT2JqZWN0U2F2ZVRlc3Q6dGVzdE9iamVjdFNlcmlhbGl6YWJsZSgpOiBlcnJvciBkdXJpbmcgc2F2ZSBbIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBleDIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiA6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgZXgyLmdldE1lc3NhZ2UoKSArICJdIik7Ci0JCQkJZXgyLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCi0JCQlhc3NlcnRUcnVlKHNhdmVkKTsKLQotCQkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCQkvLyByZXN0b3JlIGZyb20gdGhlIHRlbXBvcmFyeSBmaWxlCi0JCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJCXRyeSB7Ci0JCQkJLy8gc2V0dXAgYW4gaW5wdXQgc3RyZWFtIHRvIHRoZSBmaWxlCi0JCQkJRmlsZUlucHV0U3RyZWFtIGluU3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbSh0aGVGaWxlKTsKLQotCQkJCS8vIGF0dGFjaCBhIHN0cmVhbSBjYXBhYmxlIG9mIHJlYWRpbmcgb2JqZWN0cyBmcm9tIHRoZQotCQkJCS8vIHN0cmVhbSBjb25uZWN0ZWQgdG8gdGhlIGZpbGUKLQkJCQlPYmplY3RJbnB1dFN0cmVhbSBpbk9ialN0cmVhbSA9IG5ldyBPYmplY3RJbnB1dFN0cmVhbShpblN0cmVhbSk7Ci0KLQkJCQkvLyB0cnkgdG8gcmVzdG9yZSB0aGUgb3B0aW9ucwotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiT2JqZWN0U2F2ZVRlc3Q6dGVzdE9iamVjdFNlcmlhbGl6YWJsZSgpOiByZXN0b3JpbmcgLi4uLi4iKTsKLQkJCQlyZXN0b3JlZCA9IGZhbHNlOwotCQkJCU1ldGFEYXRhRW50cnkgcmVzdG9yZWRfb2JqID0gKE1ldGFEYXRhRW50cnkpIE9iamVjdFN0YXRlVXRpbHMKLQkJCQkJCS5yZWFkT2JqZWN0KGluT2JqU3RyZWFtLCAidGVzdE9iamVjdDpzZXJpYWxpemFibGUiKTsKLQkJCQlpbk9ialN0cmVhbS5jbG9zZSgpOwotCQkJCWluU3RyZWFtLmNsb3NlKCk7Ci0KLQkJCQlyZXN0b3JlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKAotICAgICAgICAgICAgICAgICAgICAgICAgIk9iamVjdFNhdmVUZXN0OnRlc3RPYmplY3RTZXJpYWxpemFibGUoKTogLi4uLnJlc3RvcmVkIG9wZXJhdGlvbiBjb21wbGV0ZWQuLi4uLiIpOwotCi0JCQl9IGNhdGNoIChFeGNlcHRpb24gZXgyKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJPYmplY3RTYXZlVGVzdDp0ZXN0T2JqZWN0U2VyaWFsaXphYmxlKCk6IGVycm9yIGR1cmluZyByZXN0b3JlIFsiCi0gICAgICAgICAgICAgICAgICAgICAgICArIGV4Mi5nZXRDbGFzcygpLmdldE5hbWUoKQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiIDogIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBleDIuZ2V0TWVzc2FnZSgpICsgIl0iKTsKLQkJCQlleDIucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0KLQkJCWFzc2VydFRydWUocmVzdG9yZWQpOwotCi0JCQkvLyBpZiB0aGUgc2F2ZS9yZXN0b3JlIG9mIHRoZSBvYmplY3Qgc3VjY2VlZGVkLAotCQkJLy8gdGhlbiBkb24ndCBrZWVwIHRoZSB0ZW1wb3JhcnkgZmlsZSBhcm91bmQKLQkJCWJvb2xlYW4gcmVtb3ZlVG1wRmlsZSA9IHNhdmVkICYmIHJlc3RvcmVkOwotCQkJaWYgKHJlbW92ZVRtcEZpbGUpIHsKLQkJCQl0cnkgewotCQkJCQl0aGVGaWxlLmRlbGV0ZSgpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIGp1c3QgYWJzb3JiIGl0Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBpbmRpY2F0ZSB0aGF0IHRoZSB0ZW1wIGZpbGUgd2FzIGNyZWF0ZWQgb2sKLQkJCWRvbmUgPSB0cnVlOwotCQl9Ci0KLQkJLy8gdGhpcyBpcyBmYWxzZSB3aGVuIHRoZXJlIGFyZSBwcm9ibGVtcyB3aXRoIHRoZSB0ZW1wb3JhcnkgZmlsZQotCQlhc3NlcnRUcnVlKGRvbmUpOwotCi0gICAgICAgIGxvZy5kZWJ1ZygiT2JqZWN0U2F2ZVRlc3Q6dGVzdE9iamVjdFNlcmlhbGl6YWJsZSgpOiAgRU5EIC0tLS0tLS0tLS0tLS0tLSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RPYmplY3ROb3RTZXJpYWxpemFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJRmlsZSB0aGVGaWxlID0gbnVsbDsKLQkJU3RyaW5nIHRoZUZpbGVuYW1lID0gbnVsbDsKLQkJYm9vbGVhbiBzYXZlZCA9IGZhbHNlOwotCQlib29sZWFuIHJlc3RvcmVkID0gZmFsc2U7Ci0JCWJvb2xlYW4gZXhwZWN0ZWRfZXhjZXB0aW9uID0gZmFsc2U7Ci0JCWJvb2xlYW4gZG9uZSA9IGZhbHNlOwotCi0gICAgICAgIGxvZy5kZWJ1ZygiT2JqZWN0U2F2ZVRlc3Q6dGVzdE9iamVjdE5vdFNlcmlhbGl6YWJsZSgpOiAgQkVHSU4gLS0tLS0tLS0tLS0tLS0tIik7Ci0KLQkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCS8vIHNldHVwIGFuIG9iamVjdCB0byB1c2UKLQkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCU5vdFNlcmlhbGl6YWJsZU9iamVjdCBvYmogPSBuZXcgTm90U2VyaWFsaXphYmxlT2JqZWN0KCJuc29fMSIpOwotCi0JCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQkvLyBzZXR1cCBhIHRlbXBvcmFyeSBmaWxlIHRvIHVzZQotCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJdHJ5IHsKLQkJCXRoZUZpbGUgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJvYmplY3RUZXN0IiwgbnVsbCk7Ci0JCQl0aGVGaWxlbmFtZSA9IHRoZUZpbGUuZ2V0TmFtZSgpOwotICAgICAgICAgICAgbG9nLmRlYnVnKCJPYmplY3RTYXZlVGVzdDp0ZXN0T2JqZWN0Tm90U2VyaWFsaXphYmxlKCk6IHRlbXAgZmlsZSA9IFsiCi0gICAgICAgICAgICAgICAgICAgICsgdGhlRmlsZW5hbWUgKyAiXSIpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiT2JqZWN0U2F2ZVRlc3Q6dGVzdE9iamVjdE5vdFNlcmlhbGl6YWJsZSgpOiBlcnJvciBjcmVhdGluZyB0ZW1wIGZpbGUgPSBbIgotICAgICAgICAgICAgICAgICAgICArIGV4LmdldE1lc3NhZ2UoKSArICJdIik7Ci0JCQl0aGVGaWxlID0gbnVsbDsKLQkJfQotCi0JCWlmICh0aGVGaWxlICE9IG51bGwpIHsKLQkJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQkJLy8gc2F2ZSB0byB0aGUgdGVtcG9yYXJ5IGZpbGUKLQkJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQkJRmlsZU91dHB1dFN0cmVhbSBvdXRTdHJlYW0gPSBudWxsOwotCQkJT2JqZWN0T3V0cHV0U3RyZWFtIG91dE9ialN0cmVhbSA9IG51bGw7Ci0JCQl0cnkgewotCQkJCS8vIHNldHVwIGFuIG91dHB1dCBzdHJlYW0gdG8gYSBwaHlzaWNhbCBmaWxlCi0JCQkJb3V0U3RyZWFtID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0odGhlRmlsZSk7Ci0KLQkJCQkvLyBhdHRhY2ggYSBzdHJlYW0gY2FwYWJsZSBvZiB3cml0aW5nIG9iamVjdHMgdG8gdGhlCi0JCQkJLy8gc3RyZWFtIGNvbm5lY3RlZCB0byB0aGUgZmlsZQotCQkJCW91dE9ialN0cmVhbSA9IG5ldyBPYmplY3RPdXRwdXRTdHJlYW0ob3V0U3RyZWFtKTsKLQotCQkJCS8vIHRyeSB0byBzYXZlCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJPYmplY3RTYXZlVGVzdDp0ZXN0T2JqZWN0Tm90U2VyaWFsaXphYmxlKCk6IHNhdmluZyAuLi4uLiIpOwotCQkJCXNhdmVkID0gZmFsc2U7Ci0JCQkJT2JqZWN0U3RhdGVVdGlscy53cml0ZU9iamVjdChvdXRPYmpTdHJlYW0sIG9iaiwKLQkJCQkJCSJ0ZXN0T2JqZWN0Ok5vdFNlcmlhbGl6YWJsZSIpOwotCi0JCQkJc2F2ZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygKLSAgICAgICAgICAgICAgICAgICAgICAgICJPYmplY3RTYXZlVGVzdDp0ZXN0T2JqZWN0Tm90U2VyaWFsaXphYmxlKCk6IC4uLi5zYXZlIG9wZXJhdGlvbiBjb21wbGV0ZWQuLi4uLiIpOwotCi0JCQkJbG9uZyBmaWxlc2l6ZSA9IHRoZUZpbGUubGVuZ3RoKCk7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJPYmplY3RTYXZlVGVzdDp0ZXN0T2JqZWN0Tm90U2VyaWFsaXphYmxlKCk6IGZpbGUgc2l6ZSBhZnRlciBzYXZlIFsiCi0gICAgICAgICAgICAgICAgICAgICAgICArIGZpbGVzaXplCi0gICAgICAgICAgICAgICAgICAgICAgICArICJdICAgdGVtcCBmaWxlID0gWyIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgdGhlRmlsZW5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIl0iKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleDIpIHsKLQkJCQkvLyBleHBlY3QgYW4gZXJyb3IgaGVyZQotCQkJCS8vIE9iamVjdFN0YXRlVXRpbHMgY2F0Y2hlcyB0aGUgTm90U2VyaWFsaXphYmxlRXhjZXB0aW9uIGFuZAotCQkJCS8vIGxvZ3MgaXQKLQkJCQlpZiAoZXgyIGluc3RhbmNlb2YgTm90U2VyaWFsaXphYmxlRXhjZXB0aW9uKSB7Ci0JCQkJCWV4cGVjdGVkX2V4Y2VwdGlvbiA9IHRydWU7Ci0JCQkJfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJPYmplY3RTYXZlVGVzdDp0ZXN0T2JqZWN0Tm90U2VyaWFsaXphYmxlKCk6ICBzYXZlIFsiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBleDIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBleDIuZ2V0TWVzc2FnZSgpICsgIl0iKTsKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBjbG9zZSBvdXQgdGhlIHN0cmVhbXMKLQkJCWlmIChvdXRPYmpTdHJlYW0gIT0gbnVsbCkKLQkJCQlvdXRPYmpTdHJlYW0uY2xvc2UoKTsKLQkJCWlmIChvdXRTdHJlYW0gIT0gbnVsbCkKLQkJCQlvdXRTdHJlYW0uY2xvc2UoKTsKLQotCQkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCQkvLyByZXN0b3JlIGZyb20gdGhlIHRlbXBvcmFyeSBmaWxlCi0JCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJCXRyeSB7Ci0JCQkJLy8gc2V0dXAgYW4gaW5wdXQgc3RyZWFtIHRvIHRoZSBmaWxlCi0JCQkJRmlsZUlucHV0U3RyZWFtIGluU3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbSh0aGVGaWxlKTsKLQotCQkJCS8vIGF0dGFjaCBhIHN0cmVhbSBjYXBhYmxlIG9mIHJlYWRpbmcgb2JqZWN0cyBmcm9tIHRoZQotCQkJCS8vIHN0cmVhbSBjb25uZWN0ZWQgdG8gdGhlIGZpbGUKLQkJCQlPYmplY3RJbnB1dFN0cmVhbSBpbk9ialN0cmVhbSA9IG5ldyBPYmplY3RJbnB1dFN0cmVhbShpblN0cmVhbSk7Ci0KLQkJCQkvLyB0cnkgdG8gcmVzdG9yZSB0aGUgb3B0aW9ucwotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiT2JqZWN0U2F2ZVRlc3Q6dGVzdE9iamVjdFNlcmlhbGl6YWJsZSgpOiByZXN0b3JpbmcgLi4uLi4iKTsKLQkJCQlyZXN0b3JlZCA9IGZhbHNlOwotCQkJCU9iamVjdCByZXN0b3JlZF9vYmogPSBPYmplY3RTdGF0ZVV0aWxzLnJlYWRPYmplY3QoaW5PYmpTdHJlYW0sCi0JCQkJCQkidGVzdE9iamVjdDpOb3RTZXJpYWxpemFibGUiKTsKLQkJCQlpbk9ialN0cmVhbS5jbG9zZSgpOwotCQkJCWluU3RyZWFtLmNsb3NlKCk7Ci0KLQkJCQlyZXN0b3JlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKAotICAgICAgICAgICAgICAgICAgICAgICAgIk9iamVjdFNhdmVUZXN0OnRlc3RPYmplY3ROb3RTZXJpYWxpemFibGUoKTogLi4uLnJlc3RvcmVkIG9wZXJhdGlvbiBjb21wbGV0ZWQuLi4uLiIpOwotCi0JCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIk9iamVjdFNhdmVUZXN0OnRlc3RPYmplY3ROb3RTZXJpYWxpemFibGUoKTogZXJyb3IgZHVyaW5nIHJlc3RvcmUgWyIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgZXguZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiA6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgZXguZ2V0TWVzc2FnZSgpICsgIl0iKTsKLQkJCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQotCQkJYXNzZXJ0VHJ1ZShyZXN0b3JlZCk7Ci0KLQkJCS8vIGlmIHRoZSBzYXZlL3Jlc3RvcmUgb2YgdGhlIG9iamVjdCBzdWNjZWVkZWQsCi0JCQkvLyB0aGVuIGRvbid0IGtlZXAgdGhlIHRlbXBvcmFyeSBmaWxlIGFyb3VuZAotCQkJYm9vbGVhbiByZW1vdmVUbXBGaWxlID0gc2F2ZWQgJiYgcmVzdG9yZWQ7Ci0JCQlpZiAocmVtb3ZlVG1wRmlsZSkgewotCQkJCXRyeSB7Ci0JCQkJCXRoZUZpbGUuZGVsZXRlKCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8ganVzdCBhYnNvcmIgaXQKLQkJCQl9Ci0JCQl9Ci0KLQkJCWFzc2VydFRydWUoZXhwZWN0ZWRfZXhjZXB0aW9uKTsKLQkJfQotCi0gICAgICAgIGxvZy5kZWJ1ZygiT2JqZWN0U2F2ZVRlc3Q6dGVzdE9iamVjdE5vdFNlcmlhbGl6YWJsZSgpOiAgRU5EIC0tLS0tLS0tLS0tLS0tLSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBcnJheUxpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJRmlsZSB0aGVGaWxlID0gbnVsbDsKLQkJU3RyaW5nIHRoZUZpbGVuYW1lID0gbnVsbDsKLQkJYm9vbGVhbiBzYXZlZCA9IGZhbHNlOwotCQlib29sZWFuIHJlc3RvcmVkID0gZmFsc2U7Ci0JCWJvb2xlYW4gZG9uZSA9IGZhbHNlOwotCQlib29sZWFuIGNvbXBhcmVzT0sgPSBmYWxzZTsKLQotICAgICAgICBsb2cuZGVidWcoIk9iamVjdFNhdmVUZXN0OnRlc3RBcnJheUxpc3QoKTogIEJFR0lOIC0tLS0tLS0tLS0tLS0tLSIpOwotCi0JCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQkvLyBzZXR1cCB0aGUgb2JqZWN0IHRvIHVzZQotCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJQXJyYXlMaXN0IG9iaiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJb2JqLmFkZChuZXcgSW50ZWdlcigxKSk7Ci0JCW9iai5hZGQobmV3IEludGVnZXIoMikpOwotCQlvYmouYWRkKG5ldyBJbnRlZ2VyKDMpKTsKLQkJb2JqLmFkZChuZXcgU3RyaW5nKCJzdHJpbmcxIikpOwotCQlvYmouYWRkKG5ldyBTdHJpbmcoInN0cmluZzIiKSk7Ci0JCW9iai5hZGQoU3lzdGVtLm91dCk7Ci0JCW9iai5hZGQobmV3IEludGVnZXIoNCkpOwotCQlvYmouYWRkKG5ldyBJbnRlZ2VyKDUpKTsKLQkJb2JqLmFkZChuZXcgSW50ZWdlcig2KSk7Ci0KLQkJaW50IGluaXRpYWxfc2l6ZSA9IG9iai5zaXplKCk7Ci0KLQkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCS8vIHNldHVwIGEgdGVtcG9yYXJ5IGZpbGUgdG8gdXNlCi0JCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQl0cnkgewotCQkJdGhlRmlsZSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoImFycmF5bGlzdFRlc3QiLCBudWxsKTsKLQkJCXRoZUZpbGVuYW1lID0gdGhlRmlsZS5nZXROYW1lKCk7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIk9iamVjdFNhdmVUZXN0OnRlc3RBcnJheUxpc3QoKTogdGVtcCBmaWxlID0gWyIKLSAgICAgICAgICAgICAgICAgICAgKyB0aGVGaWxlbmFtZSArICJdIik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJPYmplY3RTYXZlVGVzdDp0ZXN0QXJyYXlMaXN0KCk6IGVycm9yIGNyZWF0aW5nIHRlbXAgZmlsZSA9IFsiCi0gICAgICAgICAgICAgICAgICAgICsgZXguZ2V0TWVzc2FnZSgpICsgIl0iKTsKLQkJCXRoZUZpbGUgPSBudWxsOwotCQl9Ci0KLQkJaWYgKHRoZUZpbGUgIT0gbnVsbCkgewotCQkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCQkvLyBzYXZlIHRvIHRoZSB0ZW1wb3JhcnkgZmlsZQotCQkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCQl0cnkgewotCQkJCS8vIHNldHVwIGFuIG91dHB1dCBzdHJlYW0gdG8gYSBwaHlzaWNhbCBmaWxlCi0JCQkJRmlsZU91dHB1dFN0cmVhbSBvdXRTdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbSh0aGVGaWxlKTsKLQotCQkJCS8vIGF0dGFjaCBhIHN0cmVhbSBjYXBhYmxlIG9mIHdyaXRpbmcgb2JqZWN0cyB0byB0aGUKLQkJCQkvLyBzdHJlYW0gY29ubmVjdGVkIHRvIHRoZSBmaWxlCi0JCQkJT2JqZWN0T3V0cHV0U3RyZWFtIG91dE9ialN0cmVhbSA9IG5ldyBPYmplY3RPdXRwdXRTdHJlYW0oCi0JCQkJCQlvdXRTdHJlYW0pOwotCi0JCQkJLy8gdHJ5IHRvIHNhdmUKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIk9iamVjdFNhdmVUZXN0OnRlc3RBcnJheUxpc3QoKTogc2F2aW5nIC4uLi4uIik7Ci0JCQkJc2F2ZWQgPSBmYWxzZTsKLQkJCQlPYmplY3RTdGF0ZVV0aWxzLndyaXRlQXJyYXlMaXN0KG91dE9ialN0cmVhbSwgb2JqLAotCQkJCQkJInRlc3RPYmplY3Q6QXJyYXlMaXN0Iik7Ci0KLQkJCQkvLyBjbG9zZSBvdXQgdGhlIHN0cmVhbXMKLQkJCQlvdXRPYmpTdHJlYW0uZmx1c2goKTsKLQkJCQlvdXRPYmpTdHJlYW0uY2xvc2UoKTsKLQkJCQlvdXRTdHJlYW0uZmx1c2goKTsKLQkJCQlvdXRTdHJlYW0uY2xvc2UoKTsKLQotCQkJCXNhdmVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIk9iamVjdFNhdmVUZXN0OnRlc3RBcnJheUxpc3QoKTogLi4uLnNhdmUgb3BlcmF0aW9uIGNvbXBsZXRlZC4uLi4uIik7Ci0KLQkJCQlsb25nIGZpbGVzaXplID0gdGhlRmlsZS5sZW5ndGgoKTsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIk9iamVjdFNhdmVUZXN0OnRlc3RBcnJheUxpc3QoKTogZmlsZSBzaXplIGFmdGVyIHNhdmUgWyIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgZmlsZXNpemUKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIl0gICB0ZW1wIGZpbGUgPSBbIgotICAgICAgICAgICAgICAgICAgICAgICAgKyB0aGVGaWxlbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiXSIpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4MikgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiT2JqZWN0U2F2ZVRlc3Q6dGVzdEFycmF5TGlzdCgpOiBlcnJvciBkdXJpbmcgc2F2ZSBbIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBleDIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiA6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgZXgyLmdldE1lc3NhZ2UoKSArICJdIik7Ci0JCQkJZXgyLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCi0JCQlhc3NlcnRUcnVlKHNhdmVkKTsKLQotCQkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCQkvLyByZXN0b3JlIGZyb20gdGhlIHRlbXBvcmFyeSBmaWxlCi0JCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJCUFycmF5TGlzdCByZXN0b3JlZF9vYmogPSBudWxsOwotCi0JCQl0cnkgewotCQkJCS8vIHNldHVwIGFuIGlucHV0IHN0cmVhbSB0byB0aGUgZmlsZQotCQkJCUZpbGVJbnB1dFN0cmVhbSBpblN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0odGhlRmlsZSk7Ci0KLQkJCQkvLyBhdHRhY2ggYSBzdHJlYW0gY2FwYWJsZSBvZiByZWFkaW5nIG9iamVjdHMgZnJvbSB0aGUKLQkJCQkvLyBzdHJlYW0gY29ubmVjdGVkIHRvIHRoZSBmaWxlCi0JCQkJT2JqZWN0SW5wdXRTdHJlYW0gaW5PYmpTdHJlYW0gPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0oaW5TdHJlYW0pOwotCi0JCQkJLy8gdHJ5IHRvIHJlc3RvcmUgdGhlIG9wdGlvbnMKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIk9iamVjdFNhdmVUZXN0OnRlc3RBcnJheUxpc3QoKTogcmVzdG9yaW5nIC4uLi4uIik7Ci0JCQkJcmVzdG9yZWQgPSBmYWxzZTsKLQkJCQlyZXN0b3JlZF9vYmogPSBPYmplY3RTdGF0ZVV0aWxzLnJlYWRBcnJheUxpc3QoaW5PYmpTdHJlYW0sCi0JCQkJCQkidGVzdE9iamVjdDpBcnJheUxpc3QiKTsKLQkJCQlpbk9ialN0cmVhbS5jbG9zZSgpOwotCQkJCWluU3RyZWFtLmNsb3NlKCk7Ci0KLQkJCQlyZXN0b3JlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJPYmplY3RTYXZlVGVzdDp0ZXN0QXJyYXlMaXN0KCk6IC4uLi5yZXN0b3JlZCBvcGVyYXRpb24gY29tcGxldGVkLi4uLi4iKTsKLQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4MikgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiT2JqZWN0U2F2ZVRlc3Q6dGVzdEFycmF5TGlzdCgpOiBlcnJvciBkdXJpbmcgcmVzdG9yZSBbIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBleDIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiA6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgZXgyLmdldE1lc3NhZ2UoKSArICJdIik7Ci0JCQkJZXgyLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCi0JCQkvLyBpZiB0aGUgc2F2ZS9yZXN0b3JlIG9mIHRoZSBvYmplY3Qgc3VjY2VlZGVkLAotCQkJLy8gdGhlbiBkb24ndCBrZWVwIHRoZSB0ZW1wb3JhcnkgZmlsZSBhcm91bmQKLQkJCWJvb2xlYW4gcmVtb3ZlVG1wRmlsZSA9IHNhdmVkICYmIHJlc3RvcmVkOwotCQkJaWYgKHJlbW92ZVRtcEZpbGUpIHsKLQkJCQl0cnkgewotCQkJCQl0aGVGaWxlLmRlbGV0ZSgpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIGp1c3QgYWJzb3JiIGl0Ci0JCQkJfQotCQkJfQotCi0JCQlhc3NlcnRUcnVlKHJlc3RvcmVkKTsKLQotCQkJaWYgKHJlc3RvcmVkX29iaiAhPSBudWxsKSB7Ci0JCQkJaW50IHJlc3RvcmVkX3NpemUgPSByZXN0b3JlZF9vYmouc2l6ZSgpOwotCQkJCWlmIChyZXN0b3JlZF9zaXplID09IChpbml0aWFsX3NpemUgLSAxKSkgewotCQkJCQljb21wYXJlc09LID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIFRPRE86IGNoZWNrIGZvciBleGFjdCBlbnRyaWVzCi0KLQkJCWFzc2VydFRydWUoY29tcGFyZXNPSyk7Ci0KLQkJCS8vIGluZGljYXRlIHRoYXQgdGhlIHRlbXAgZmlsZSB3YXMgY3JlYXRlZCBvawotCQkJZG9uZSA9IHRydWU7Ci0JCX0KLQotCQkvLyB0aGlzIGlzIGZhbHNlIHdoZW4gdGhlcmUgYXJlIHByb2JsZW1zIHdpdGggdGhlIHRlbXBvcmFyeSBmaWxlCi0JCWFzc2VydFRydWUoZG9uZSk7Ci0KLSAgICAgICAgbG9nLmRlYnVnKCJPYmplY3RTYXZlVGVzdDp0ZXN0QXJyYXlMaXN0KCk6ICBFTkQgLS0tLS0tLS0tLS0tLS0tIik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc2hNYXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJRmlsZSB0aGVGaWxlID0gbnVsbDsKLQkJU3RyaW5nIHRoZUZpbGVuYW1lID0gbnVsbDsKLQkJYm9vbGVhbiBzYXZlZCA9IGZhbHNlOwotCQlib29sZWFuIHJlc3RvcmVkID0gZmFsc2U7Ci0JCWJvb2xlYW4gZG9uZSA9IGZhbHNlOwotCQlib29sZWFuIGNvbXBhcmVzT0sgPSBmYWxzZTsKLQotICAgICAgICBsb2cuZGVidWcoIk9iamVjdFNhdmVUZXN0OnRlc3RIYXNoTWFwKCk6ICBCRUdJTiAtLS0tLS0tLS0tLS0tLS0iKTsKLQotCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJLy8gc2V0dXAgdGhlIG9iamVjdCB0byB1c2UKLQkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCUhhc2hNYXAgb2JqID0gbmV3IEhhc2hNYXAoKTsKLQkJb2JqLnB1dChuZXcgU3RyaW5nKCJrZXkxIiksIG5ldyBJbnRlZ2VyKDEpKTsKLQkJb2JqLnB1dChuZXcgU3RyaW5nKCJrZXkyIiksIG5ldyBJbnRlZ2VyKDIpKTsKLQkJb2JqLnB1dChuZXcgU3RyaW5nKCJrZXkzIiksIG5ldyBTdHJpbmcoInZhbHVlMSIpKTsKLQkJb2JqLnB1dChuZXcgU3RyaW5nKCJrZXk0IiksIFN5c3RlbS5vdXQpOwotCQlvYmoucHV0KG5ldyBTdHJpbmcoImtleTUiKSwgbmV3IEludGVnZXIoMykpOwotCQlvYmoucHV0KG5ldyBTdHJpbmcoImtleTYiKSwgbmV3IEludGVnZXIoNCkpOwotCQlvYmoucHV0KG5ldyBTdHJpbmcoImtleTciKSwgU3lzdGVtLmVycik7Ci0JCW9iai5wdXQobmV3IFN0cmluZygia2V5OCIpLCBuZXcgSW50ZWdlcig1KSk7Ci0JCW9iai5wdXQobmV3IFN0cmluZygia2V5OSIpLCBuZXcgSW50ZWdlcig2KSk7Ci0JCW9iai5wdXQobmV3IE5vdFNlcmlhbGl6YWJsZU9iamVjdCgiVGVzdEZvckhhc2hNYXBLZXkiKSwgbmV3IEludGVnZXIoNykpOwotCQlvYmoucHV0KG5ldyBTdHJpbmcoImtleTEwIiksIG5ldyBJbnRlZ2VyKDgpKTsKLQotCQlpbnQgaW5pdGlhbF9zaXplID0gb2JqLnNpemUoKTsKLQotCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJLy8gc2V0dXAgYSB0ZW1wb3JhcnkgZmlsZSB0byB1c2UKLQkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCXRyeSB7Ci0JCQl0aGVGaWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgiaGFzaG1hcFRlc3QiLCBudWxsKTsKLQkJCXRoZUZpbGVuYW1lID0gdGhlRmlsZS5nZXROYW1lKCk7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIk9iamVjdFNhdmVUZXN0OnRlc3RIYXNoTWFwKCk6IHRlbXAgZmlsZSA9IFsiCi0gICAgICAgICAgICAgICAgICAgICsgdGhlRmlsZW5hbWUgKyAiXSIpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiT2JqZWN0U2F2ZVRlc3Q6dGVzdEhhc2hNYXAoKTogZXJyb3IgY3JlYXRpbmcgdGVtcCBmaWxlID0gWyIKLSAgICAgICAgICAgICAgICAgICAgKyBleC5nZXRNZXNzYWdlKCkgKyAiXSIpOwotCQkJdGhlRmlsZSA9IG51bGw7Ci0JCX0KLQotCQlpZiAodGhlRmlsZSAhPSBudWxsKSB7Ci0JCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJCS8vIHNhdmUgdG8gdGhlIHRlbXBvcmFyeSBmaWxlCi0JCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJCXRyeSB7Ci0JCQkJLy8gc2V0dXAgYW4gb3V0cHV0IHN0cmVhbSB0byBhIHBoeXNpY2FsIGZpbGUKLQkJCQlGaWxlT3V0cHV0U3RyZWFtIG91dFN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRoZUZpbGUpOwotCi0JCQkJLy8gYXR0YWNoIGEgc3RyZWFtIGNhcGFibGUgb2Ygd3JpdGluZyBvYmplY3RzIHRvIHRoZQotCQkJCS8vIHN0cmVhbSBjb25uZWN0ZWQgdG8gdGhlIGZpbGUKLQkJCQlPYmplY3RPdXRwdXRTdHJlYW0gb3V0T2JqU3RyZWFtID0gbmV3IE9iamVjdE91dHB1dFN0cmVhbSgKLQkJCQkJCW91dFN0cmVhbSk7Ci0KLQkJCQkvLyB0cnkgdG8gc2F2ZQotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiT2JqZWN0U2F2ZVRlc3Q6dGVzdEhhc2hNYXAoKTogc2F2aW5nIC4uLi4uIik7Ci0JCQkJc2F2ZWQgPSBmYWxzZTsKLQkJCQlPYmplY3RTdGF0ZVV0aWxzLndyaXRlSGFzaE1hcChvdXRPYmpTdHJlYW0sIG9iaiwKLQkJCQkJCSJ0ZXN0T2JqZWN0Okhhc2hNYXAiKTsKLQotCQkJCS8vIGNsb3NlIG91dCB0aGUgc3RyZWFtcwotCQkJCW91dE9ialN0cmVhbS5mbHVzaCgpOwotCQkJCW91dE9ialN0cmVhbS5jbG9zZSgpOwotCQkJCW91dFN0cmVhbS5mbHVzaCgpOwotCQkJCW91dFN0cmVhbS5jbG9zZSgpOwotCi0JCQkJc2F2ZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiT2JqZWN0U2F2ZVRlc3Q6dGVzdEhhc2hNYXAoKTogLi4uLnNhdmUgb3BlcmF0aW9uIGNvbXBsZXRlZC4uLi4uIik7Ci0KLQkJCQlsb25nIGZpbGVzaXplID0gdGhlRmlsZS5sZW5ndGgoKTsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIk9iamVjdFNhdmVUZXN0OnRlc3RIYXNoTWFwKCk6IGZpbGUgc2l6ZSBhZnRlciBzYXZlIFsiCi0gICAgICAgICAgICAgICAgICAgICAgICArIGZpbGVzaXplCi0gICAgICAgICAgICAgICAgICAgICAgICArICJdICAgdGVtcCBmaWxlID0gWyIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgdGhlRmlsZW5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIl0iKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleDIpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIk9iamVjdFNhdmVUZXN0OnRlc3RIYXNoTWFwKCk6IGVycm9yIGR1cmluZyBzYXZlIFsiCi0gICAgICAgICAgICAgICAgICAgICAgICArIGV4Mi5nZXRDbGFzcygpLmdldE5hbWUoKQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiIDogIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBleDIuZ2V0TWVzc2FnZSgpICsgIl0iKTsKLQkJCQlleDIucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0KLQkJCWFzc2VydFRydWUoc2F2ZWQpOwotCi0JCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJCS8vIHJlc3RvcmUgZnJvbSB0aGUgdGVtcG9yYXJ5IGZpbGUKLQkJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQkJSGFzaE1hcCByZXN0b3JlZF9vYmogPSBudWxsOwotCi0JCQl0cnkgewotCQkJCS8vIHNldHVwIGFuIGlucHV0IHN0cmVhbSB0byB0aGUgZmlsZQotCQkJCUZpbGVJbnB1dFN0cmVhbSBpblN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0odGhlRmlsZSk7Ci0KLQkJCQkvLyBhdHRhY2ggYSBzdHJlYW0gY2FwYWJsZSBvZiByZWFkaW5nIG9iamVjdHMgZnJvbSB0aGUKLQkJCQkvLyBzdHJlYW0gY29ubmVjdGVkIHRvIHRoZSBmaWxlCi0JCQkJT2JqZWN0SW5wdXRTdHJlYW0gaW5PYmpTdHJlYW0gPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0oaW5TdHJlYW0pOwotCi0JCQkJLy8gdHJ5IHRvIHJlc3RvcmUgdGhlIG9wdGlvbnMKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIk9iamVjdFNhdmVUZXN0OnRlc3RIYXNoTWFwKCk6IHJlc3RvcmluZyAuLi4uLiIpOwotCQkJCXJlc3RvcmVkID0gZmFsc2U7Ci0JCQkJcmVzdG9yZWRfb2JqID0gT2JqZWN0U3RhdGVVdGlscy5yZWFkSGFzaE1hcChpbk9ialN0cmVhbSwKLQkJCQkJCSJ0ZXN0T2JqZWN0Okhhc2hNYXAiKTsKLQkJCQlpbk9ialN0cmVhbS5jbG9zZSgpOwotCQkJCWluU3RyZWFtLmNsb3NlKCk7Ci0KLQkJCQlyZXN0b3JlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJPYmplY3RTYXZlVGVzdDp0ZXN0SGFzaE1hcCgpOiAuLi4ucmVzdG9yZWQgb3BlcmF0aW9uIGNvbXBsZXRlZC4uLi4uIik7Ci0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleDIpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIk9iamVjdFNhdmVUZXN0OnRlc3RIYXNoTWFwKCk6IGVycm9yIGR1cmluZyByZXN0b3JlIFsiCi0gICAgICAgICAgICAgICAgICAgICAgICArIGV4Mi5nZXRDbGFzcygpLmdldE5hbWUoKQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiIDogIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBleDIuZ2V0TWVzc2FnZSgpICsgIl0iKTsKLQkJCQlleDIucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0KLQkJCS8vIGlmIHRoZSBzYXZlL3Jlc3RvcmUgb2YgdGhlIG9iamVjdCBzdWNjZWVkZWQsCi0JCQkvLyB0aGVuIGRvbid0IGtlZXAgdGhlIHRlbXBvcmFyeSBmaWxlIGFyb3VuZAotCQkJYm9vbGVhbiByZW1vdmVUbXBGaWxlID0gc2F2ZWQgJiYgcmVzdG9yZWQ7Ci0JCQlpZiAocmVtb3ZlVG1wRmlsZSkgewotCQkJCXRyeSB7Ci0JCQkJCXRoZUZpbGUuZGVsZXRlKCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8ganVzdCBhYnNvcmIgaXQKLQkJCQl9Ci0JCQl9Ci0KLQkJCWFzc2VydFRydWUocmVzdG9yZWQpOwotCi0JCQlpZiAocmVzdG9yZWRfb2JqICE9IG51bGwpIHsKLQkJCQlpbnQgcmVzdG9yZWRfc2l6ZSA9IHJlc3RvcmVkX29iai5zaXplKCk7Ci0JCQkJaWYgKHJlc3RvcmVkX3NpemUgPT0gKGluaXRpYWxfc2l6ZSAtIDMpKSB7Ci0JCQkJCS8vIHRoZXJlIGFyZSBlbnRyaWVzIGluIHRoZSBtYXAgdGhhdCBhcmUgbm90IHNlcmlhbGl6YWJsZQotCQkJCQljb21wYXJlc09LID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIFRPRE86IGNoZWNrIGZvciBleGFjdCBlbnRyaWVzCi0KLQkJCWFzc2VydFRydWUoY29tcGFyZXNPSyk7Ci0KLQkJCS8vIGluZGljYXRlIHRoYXQgdGhlIHRlbXAgZmlsZSB3YXMgY3JlYXRlZCBvawotCQkJZG9uZSA9IHRydWU7Ci0JCX0KLQotCQkvLyB0aGlzIGlzIGZhbHNlIHdoZW4gdGhlcmUgYXJlIHByb2JsZW1zIHdpdGggdGhlIHRlbXBvcmFyeSBmaWxlCi0JCWFzc2VydFRydWUoZG9uZSk7Ci0KLSAgICAgICAgbG9nLmRlYnVnKCJPYmplY3RTYXZlVGVzdDp0ZXN0SGFzaE1hcCgpOiAgRU5EIC0tLS0tLS0tLS0tLS0tLSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaW5rZWRMaXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUZpbGUgdGhlRmlsZSA9IG51bGw7Ci0JCVN0cmluZyB0aGVGaWxlbmFtZSA9IG51bGw7Ci0JCWJvb2xlYW4gc2F2ZWQgPSBmYWxzZTsKLQkJYm9vbGVhbiByZXN0b3JlZCA9IGZhbHNlOwotCQlib29sZWFuIGRvbmUgPSBmYWxzZTsKLQkJYm9vbGVhbiBjb21wYXJlc09LID0gZmFsc2U7Ci0KLSAgICAgICAgbG9nLmRlYnVnKCJPYmplY3RTYXZlVGVzdDp0ZXN0TGlua2VkTGlzdCgpOiAgQkVHSU4gLS0tLS0tLS0tLS0tLS0tIik7Ci0KLQkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCS8vIHNldHVwIHRoZSBvYmplY3QgdG8gdXNlCi0JCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQlMaW5rZWRMaXN0IG9iaiA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCW9iai5hZGQobmV3IEludGVnZXIoMSkpOwotCQlvYmouYWRkKG5ldyBJbnRlZ2VyKDIpKTsKLQkJb2JqLmFkZChuZXcgSW50ZWdlcigzKSk7Ci0JCW9iai5hZGQobmV3IFN0cmluZygic3RyaW5nMSIpKTsKLQkJb2JqLmFkZChuZXcgU3RyaW5nKCJzdHJpbmcyIikpOwotCQlvYmouYWRkKFN5c3RlbS5pbik7Ci0JCW9iai5hZGQobmV3IEludGVnZXIoNCkpOwotCQlvYmouYWRkKG5ldyBJbnRlZ2VyKDUpKTsKLQkJb2JqLmFkZChuZXcgSW50ZWdlcig2KSk7Ci0KLQkJaW50IGluaXRpYWxfc2l6ZSA9IG9iai5zaXplKCk7Ci0KLQkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCS8vIHNldHVwIGEgdGVtcG9yYXJ5IGZpbGUgdG8gdXNlCi0JCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQl0cnkgewotCQkJdGhlRmlsZSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoImxpbmtlZGxpc3RUZXN0IiwgbnVsbCk7Ci0JCQl0aGVGaWxlbmFtZSA9IHRoZUZpbGUuZ2V0TmFtZSgpOwotICAgICAgICAgICAgbG9nLmRlYnVnKCJPYmplY3RTYXZlVGVzdDp0ZXN0TGlua2VkTGlzdCgpOiB0ZW1wIGZpbGUgPSBbIgotICAgICAgICAgICAgICAgICAgICArIHRoZUZpbGVuYW1lICsgIl0iKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIk9iamVjdFNhdmVUZXN0OnRlc3RMaW5rZWRMaXN0KCk6IGVycm9yIGNyZWF0aW5nIHRlbXAgZmlsZSA9IFsiCi0gICAgICAgICAgICAgICAgICAgICsgZXguZ2V0TWVzc2FnZSgpICsgIl0iKTsKLQkJCXRoZUZpbGUgPSBudWxsOwotCQl9Ci0KLQkJaWYgKHRoZUZpbGUgIT0gbnVsbCkgewotCQkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCQkvLyBzYXZlIHRvIHRoZSB0ZW1wb3JhcnkgZmlsZQotCQkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCQl0cnkgewotCQkJCS8vIHNldHVwIGFuIG91dHB1dCBzdHJlYW0gdG8gYSBwaHlzaWNhbCBmaWxlCi0JCQkJRmlsZU91dHB1dFN0cmVhbSBvdXRTdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbSh0aGVGaWxlKTsKLQotCQkJCS8vIGF0dGFjaCBhIHN0cmVhbSBjYXBhYmxlIG9mIHdyaXRpbmcgb2JqZWN0cyB0byB0aGUKLQkJCQkvLyBzdHJlYW0gY29ubmVjdGVkIHRvIHRoZSBmaWxlCi0JCQkJT2JqZWN0T3V0cHV0U3RyZWFtIG91dE9ialN0cmVhbSA9IG5ldyBPYmplY3RPdXRwdXRTdHJlYW0oCi0JCQkJCQlvdXRTdHJlYW0pOwotCi0JCQkJLy8gdHJ5IHRvIHNhdmUKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIk9iamVjdFNhdmVUZXN0OnRlc3RMaW5rZWRMaXN0KCk6IHNhdmluZyAuLi4uLiIpOwotCQkJCXNhdmVkID0gZmFsc2U7Ci0JCQkJT2JqZWN0U3RhdGVVdGlscy53cml0ZUxpbmtlZExpc3Qob3V0T2JqU3RyZWFtLCBvYmosCi0JCQkJCQkidGVzdE9iamVjdDpMaW5rZWRMaXN0Iik7Ci0KLQkJCQkvLyBjbG9zZSBvdXQgdGhlIHN0cmVhbXMKLQkJCQlvdXRPYmpTdHJlYW0uZmx1c2goKTsKLQkJCQlvdXRPYmpTdHJlYW0uY2xvc2UoKTsKLQkJCQlvdXRTdHJlYW0uZmx1c2goKTsKLQkJCQlvdXRTdHJlYW0uY2xvc2UoKTsKLQotCQkJCXNhdmVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIk9iamVjdFNhdmVUZXN0OnRlc3RMaW5rZWRMaXN0KCk6IC4uLi5zYXZlIG9wZXJhdGlvbiBjb21wbGV0ZWQuLi4uLiIpOwotCi0JCQkJbG9uZyBmaWxlc2l6ZSA9IHRoZUZpbGUubGVuZ3RoKCk7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJPYmplY3RTYXZlVGVzdDp0ZXN0TGlua2VkTGlzdCgpOiBmaWxlIHNpemUgYWZ0ZXIgc2F2ZSBbIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBmaWxlc2l6ZQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiXSAgIHRlbXAgZmlsZSA9IFsiCi0gICAgICAgICAgICAgICAgICAgICAgICArIHRoZUZpbGVuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICArICJdIik7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZXgyKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJPYmplY3RTYXZlVGVzdDp0ZXN0TGlua2VkTGlzdCgpOiBlcnJvciBkdXJpbmcgc2F2ZSBbIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBleDIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiA6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgZXgyLmdldE1lc3NhZ2UoKSArICJdIik7Ci0JCQkJZXgyLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCi0JCQlhc3NlcnRUcnVlKHNhdmVkKTsKLQotCQkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCQkvLyByZXN0b3JlIGZyb20gdGhlIHRlbXBvcmFyeSBmaWxlCi0JCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJCUxpbmtlZExpc3QgcmVzdG9yZWRfb2JqID0gbnVsbDsKLQotCQkJdHJ5IHsKLQkJCQkvLyBzZXR1cCBhbiBpbnB1dCBzdHJlYW0gdG8gdGhlIGZpbGUKLQkJCQlGaWxlSW5wdXRTdHJlYW0gaW5TdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKHRoZUZpbGUpOwotCi0JCQkJLy8gYXR0YWNoIGEgc3RyZWFtIGNhcGFibGUgb2YgcmVhZGluZyBvYmplY3RzIGZyb20gdGhlCi0JCQkJLy8gc3RyZWFtIGNvbm5lY3RlZCB0byB0aGUgZmlsZQotCQkJCU9iamVjdElucHV0U3RyZWFtIGluT2JqU3RyZWFtID0gbmV3IE9iamVjdElucHV0U3RyZWFtKGluU3RyZWFtKTsKLQotCQkJCS8vIHRyeSB0byByZXN0b3JlIHRoZSBvcHRpb25zCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJPYmplY3RTYXZlVGVzdDp0ZXN0TGlua2VkTGlzdCgpOiByZXN0b3JpbmcgLi4uLi4iKTsKLQkJCQlyZXN0b3JlZCA9IGZhbHNlOwotCQkJCXJlc3RvcmVkX29iaiA9IE9iamVjdFN0YXRlVXRpbHMucmVhZExpbmtlZExpc3QoaW5PYmpTdHJlYW0sCi0JCQkJCQkidGVzdE9iamVjdDpMaW5rZWRMaXN0Iik7Ci0JCQkJaW5PYmpTdHJlYW0uY2xvc2UoKTsKLQkJCQlpblN0cmVhbS5jbG9zZSgpOwotCi0JCQkJcmVzdG9yZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiT2JqZWN0U2F2ZVRlc3Q6dGVzdExpbmtlZExpc3QoKTogLi4uLnJlc3RvcmVkIG9wZXJhdGlvbiBjb21wbGV0ZWQuLi4uLiIpOwotCi0JCQl9IGNhdGNoIChFeGNlcHRpb24gZXgyKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJPYmplY3RTYXZlVGVzdDp0ZXN0TGlua2VkTGlzdCgpOiBlcnJvciBkdXJpbmcgcmVzdG9yZSBbIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBleDIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiA6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgZXgyLmdldE1lc3NhZ2UoKSArICJdIik7Ci0JCQkJZXgyLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCi0JCQkvLyBpZiB0aGUgc2F2ZS9yZXN0b3JlIG9mIHRoZSBvYmplY3Qgc3VjY2VlZGVkLAotCQkJLy8gdGhlbiBkb24ndCBrZWVwIHRoZSB0ZW1wb3JhcnkgZmlsZSBhcm91bmQKLQkJCWJvb2xlYW4gcmVtb3ZlVG1wRmlsZSA9IHNhdmVkICYmIHJlc3RvcmVkOwotCQkJaWYgKHJlbW92ZVRtcEZpbGUpIHsKLQkJCQl0cnkgewotCQkJCQl0aGVGaWxlLmRlbGV0ZSgpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIGp1c3QgYWJzb3JiIGl0Ci0JCQkJfQotCQkJfQotCi0JCQlhc3NlcnRUcnVlKHJlc3RvcmVkKTsKLQotCQkJaWYgKHJlc3RvcmVkX29iaiAhPSBudWxsKSB7Ci0JCQkJaW50IHJlc3RvcmVkX3NpemUgPSByZXN0b3JlZF9vYmouc2l6ZSgpOwotCQkJCWlmIChyZXN0b3JlZF9zaXplID09IChpbml0aWFsX3NpemUgLSAxKSkgewotCQkJCQljb21wYXJlc09LID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIFRPRE86IGNoZWNrIGZvciBleGFjdCBlbnRyaWVzCi0KLQkJCWFzc2VydFRydWUoY29tcGFyZXNPSyk7Ci0KLQkJCS8vIGluZGljYXRlIHRoYXQgdGhlIHRlbXAgZmlsZSB3YXMgY3JlYXRlZCBvawotCQkJZG9uZSA9IHRydWU7Ci0JCX0KLQotCQkvLyB0aGlzIGlzIGZhbHNlIHdoZW4gdGhlcmUgYXJlIHByb2JsZW1zIHdpdGggdGhlIHRlbXBvcmFyeSBmaWxlCi0JCWFzc2VydFRydWUoZG9uZSk7Ci0KLSAgICAgICAgbG9nLmRlYnVnKCJPYmplY3RTYXZlVGVzdDp0ZXN0TGlua2VkTGlzdCgpOiAgRU5EIC0tLS0tLS0tLS0tLS0tLSIpOwotCX0KLQotCXB1YmxpYyBjbGFzcyBOb3RTZXJpYWxpemFibGVPYmplY3QgaW1wbGVtZW50cyBFeHRlcm5hbGl6YWJsZSB7Ci0JCXByaXZhdGUgU3RyaW5nIGxhYmVsID0gIlRlc3RPYmplY3QiOwotCi0JCXByaXZhdGUgU3RyaW5nIElEID0gbnVsbDsKLQotCQkvLyBtYWtlIHN1cmUgd2UgaGF2ZSBzb21lIG9iamVjdHMgdGhhdCBkb24ndCBzZXJpYWxpemUKLQkJcHJpdmF0ZSBQcmludFN0cmVhbSBwcyA9IFN5c3RlbS5vdXQ7Ci0KLQkJLy8gZGVmYXVsdCBjb25zdHJ1Y3RvciBuZWVkZWQgZm9yIEV4dGVybmFsaXphYmxlIGludGVyZmFjZQotCQlwdWJsaWMgTm90U2VyaWFsaXphYmxlT2JqZWN0KCkgewotCQl9Ci0KLQkJcHVibGljIE5vdFNlcmlhbGl6YWJsZU9iamVjdChTdHJpbmcgaWRlbnRpZmllcikgewotCQkJSUQgPSBpZGVudGlmaWVyOwotCQkJcHMgPSBTeXN0ZW0ub3V0OwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0SUQoU3RyaW5nIHMpIHsKLQkJCUlEID0gczsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0SUQoKSB7Ci0JCQlyZXR1cm4gSUQ7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB3cml0ZUV4dGVybmFsKGphdmEuaW8uT2JqZWN0T3V0cHV0IG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCXRocm93IG5ldyBOb3RTZXJpYWxpemFibGVFeGNlcHRpb24oCi0JCQkJCSJUZXN0IE9iamVjdCBpcyBub3Qgc2VyaWFsaXphYmxlIik7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZWFkRXh0ZXJuYWwoamF2YS5pby5PYmplY3RJbnB1dCBpbikgdGhyb3dzIElPRXhjZXB0aW9uLAotCQkJCUNsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJUZXN0IG9iamVjdCBpcyBub3Qgc2VyaWFsaXphYmxlIik7Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9PbmVXYXlSYXdYTUxUZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL09uZVdheVJhd1hNTFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE3MGJmMy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL09uZVdheVJhd1hNTFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5lbmdpbmU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuT3B0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5TZXJ2aWNlQ2xpZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLnV0aWwuVGVzdENvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmludGVncmF0aW9uLlRlc3RpbmdVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmludGVncmF0aW9uLlV0aWxTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pbnRlZ3JhdGlvbi5VdGlsU2VydmVyQmFzZWRUZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuVXRpbHM7Ci0KLXB1YmxpYyBjbGFzcyBPbmVXYXlSYXdYTUxUZXN0IGV4dGVuZHMgVXRpbFNlcnZlckJhc2VkVGVzdENhc2UgaW1wbGVtZW50cyBUZXN0Q29uc3RhbnRzIHsKLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIHJldHVybiBnZXRUZXN0U2V0dXAobmV3IFRlc3RTdWl0ZShPbmVXYXlSYXdYTUxUZXN0LmNsYXNzKSk7Ci0gICAgfQotICAgIAotCXByaXZhdGUgYm9vbGVhbiByZWNlaXZlZDsKLSAgICBwcm90ZWN0ZWQgQXhpc1NlcnZpY2Ugc2VydmljZTsKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIAlzZXJ2aWNlID0gVXRpbHMuY3JlYXRlU2ltcGxlSW5Pbmx5U2VydmljZShzZXJ2aWNlTmFtZSxuZXcgTWVzc2FnZVJlY2VpdmVyKCl7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCByZWNlaXZlKE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDdHgpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICAgICAgICAgIFNPQVBFbnZlbG9wZSBlbnZlbG9wZSA9IG1lc3NhZ2VDdHguZ2V0RW52ZWxvcGUoKTsKLSAgICAgICAgICAgICAgICBUZXN0aW5nVXRpbHMuY29tcGFyZVdpdGhDcmVhdGVkT01FbGVtZW50KGVudmVsb3BlLmdldEJvZHkoKS5nZXRGaXJzdEVsZW1lbnQoKSk7Ci0gICAgICAgICAgICAgICAgcmVjZWl2ZWQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9LAotICAgICAgICAgICAgICAgIG9wZXJhdGlvbk5hbWUpOwotICAgICAgICBVdGlsU2VydmVyLmRlcGxveVNlcnZpY2Uoc2VydmljZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE9uZVdheSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0ID0KLSAgICAgICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeS5jcmVhdGVDb25maWd1cmF0aW9uQ29udGV4dEZyb21GaWxlU3lzdGVtKAotICAgICAgICAgICAgICAgICAgICBUZXN0aW5nVXRpbHMucHJlZml4QmFzZURpcmVjdG9yeShDb25zdGFudHMuVEVTVElOR19QQVRIICsgImludGVncmF0aW9uUmVwby8iKSwgbnVsbCk7Ci0gICAgICAgIFNlcnZpY2VDbGllbnQgc2VuZGVyID0gbmV3IFNlcnZpY2VDbGllbnQoY29uZmlnQ29udGV4dCwgbnVsbCk7Ci0gICAgICAgIE9wdGlvbnMgb3AgPSBuZXcgT3B0aW9ucygpOwotLy8gICAgICAgIG9wLnNldFRvKG5ldyBFbmRwb2ludFJlZmVyZW5jZSgKLS8vIC8vICAgICAgICAgICAgICAgImh0dHA6Ly8xMjcuMC4wLjE6IiArIChVdGlsU2VydmVyLlRFU1RJTkdfUE9SVCkKLS8vICAgICAgICAgICAgICAgICJodHRwOi8vMTI3LjAuMC4xOiIgKyA1NTU2Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgICsgIi9heGlzMi9zZXJ2aWNlcy8iK3NlcnZpY2UuZ2V0TmFtZSgpKyIvIitvcGVyYXRpb25OYW1lLmdldExvY2FsUGFydCgpKSk7Ci0gICAgICAgIG9wLnNldFRvKHRhcmdldEVQUik7Ci0gICAgICAgIG9wLnNldEFjdGlvbigidXJuOlNvbWVBY3Rpb24iKTsKLSAgICAgICAgc2VuZGVyLnNldE9wdGlvbnMob3ApOwotICAgICAgICBzZW5kZXIuZmlyZUFuZEZvcmdldChUZXN0aW5nVXRpbHMuY3JlYXRlRHVtbXlPTUVsZW1lbnQoKSk7Ci0gICAgICAgIGludCBpbmRleCA9IDA7Ci0gICAgICAgIHdoaWxlICghcmVjZWl2ZWQpIHsKLSAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsKLSAgICAgICAgICAgIGluZGV4Kys7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPT0gMjApIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJlcnJvciBPY2N1cmVkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvT3BlcmF0aW9uQ29udGV4dFNhdmVUZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL09wZXJhdGlvbkNvbnRleHRTYXZlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2I2ZTEzLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvT3BlcmF0aW9uQ29udGV4dFNhdmVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5VVUlER2VuZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuT3BlcmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuU2VydmljZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LlNlcnZpY2VHcm91cENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZUdyb3VwOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uSGFuZGxlckRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uSW5PdXRBeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uVHJhbnNwb3J0SW5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlRyYW5zcG9ydE91dERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaGFuZGxlcnMuQWJzdHJhY3RIYW5kbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLlJhd1hNTElOT25seU1lc3NhZ2VSZWNlaXZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5SYXdYTUxJTk91dE1lc3NhZ2VSZWNlaXZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkNvbW1vbnNIVFRQVHJhbnNwb3J0U2VuZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotcHVibGljIGNsYXNzIE9wZXJhdGlvbkNvbnRleHRTYXZlVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhPcGVyYXRpb25Db250ZXh0U2F2ZVRlc3QuY2xhc3MpOwotCi0gICAgcHJpdmF0ZSBRTmFtZSBzZXJ2aWNlTmFtZSA9IG5ldyBRTmFtZSgiVGVzdFNlcnZpY2UiKTsKLSAgICBwcml2YXRlIFFOYW1lIG9wZXJhdGlvbk5hbWUgPSBuZXcgUU5hbWUoIk9wZXJhdGlvbl8xIik7Ci0KLSAgICBwcml2YXRlIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ3VyYXRpb25Db250ZXh0ID0gbnVsbDsKLSAgICBwcml2YXRlIFNlcnZpY2VHcm91cENvbnRleHQgc2VydmljZUdyb3VwQ29udGV4dCA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTZXJ2aWNlQ29udGV4dCBzZXJ2aWNlQ29udGV4dCA9IG51bGw7Ci0gICAgcHJpdmF0ZSBPcGVyYXRpb25Db250ZXh0IG9wZXJhdGlvbkNvbnRleHQgPSBudWxsOwotCi0gICAgcHJpdmF0ZSBBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlndXJhdGlvbiA9IG51bGw7Ci0gICAgcHJpdmF0ZSBBeGlzU2VydmljZUdyb3VwIGF4aXNTZXJ2aWNlR3JvdXAgPSBudWxsOwotICAgIHByaXZhdGUgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UgPSBudWxsOwotICAgIHByaXZhdGUgQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uID0gbnVsbDsKLQotICAgIHByaXZhdGUgVHJhbnNwb3J0T3V0RGVzY3JpcHRpb24gdHJhbnNwb3J0T3V0ID0gbnVsbDsKLSAgICBwcml2YXRlIFRyYW5zcG9ydEluRGVzY3JpcHRpb24gdHJhbnNwb3J0SW4gPSBudWxsOwotCi0gICAgcHJpdmF0ZSBNZXNzYWdlQ29udGV4dCBtYyA9IG51bGw7Ci0KLSAgICBwcml2YXRlIEFycmF5TGlzdCBleGVjdXRlZEhhbmRsZXJzID0gbnVsbDsKLQotICAgIHByaXZhdGUgU3RyaW5nIHRlc3RBcmcgPSBudWxsOwotCi0KLSAgICBwdWJsaWMgT3BlcmF0aW9uQ29udGV4dFNhdmVUZXN0KFN0cmluZyBhcmcwKSB7Ci0gICAgICAgIHN1cGVyKGFyZzApOwotICAgICAgICB0ZXN0QXJnID0gbmV3IFN0cmluZyhhcmcwKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcHJlcGFyZSgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJPcGVyYXRpb25Db250ZXh0U2F2ZVRlc3Q6Y29uc3RydWN0b3I6ICBlcnJvciBpbiBzZXR0aW5nIHVwIG9iamVjdCBncmFwaCBbIiArCi0gICAgICAgICAgICAgICAgICAgIGUuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIDogIiArIGUuZ2V0TWVzc2FnZSgpICsgIl0iKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLy8KLSAgICAvLyBwcmVwYXJlIHRoZSBvYmplY3QgaGllcmFyY2h5IGZvciB0ZXN0aW5nCi0gICAgLy8KLSAgICBwcml2YXRlIHZvaWQgcHJlcGFyZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgYXhpc0NvbmZpZ3VyYXRpb24gPSBuZXcgQXhpc0NvbmZpZ3VyYXRpb24oKTsKLQotICAgICAgICBjb25maWd1cmF0aW9uQ29udGV4dCA9IG5ldyBDb25maWd1cmF0aW9uQ29udGV4dChheGlzQ29uZmlndXJhdGlvbik7Ci0KLSAgICAgICAgY29uZmlndXJhdGlvbkNvbnRleHQuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5hZGRNZXNzYWdlUmVjZWl2ZXIoCi0gICAgICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgvd3NkbC9pbi1vbmx5IiwgbmV3IFJhd1hNTElOT25seU1lc3NhZ2VSZWNlaXZlcigpKTsKLSAgICAgICAgY29uZmlndXJhdGlvbkNvbnRleHQuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5hZGRNZXNzYWdlUmVjZWl2ZXIoCi0gICAgICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgvd3NkbC9pbi1vdXQiLCBuZXcgUmF3WE1MSU5PdXRNZXNzYWdlUmVjZWl2ZXIoKSk7Ci0KLSAgICAgICAgRGlzcGF0Y2hQaGFzZSBkaXNwYXRjaFBoYXNlID0gbmV3IERpc3BhdGNoUGhhc2UoKTsKLSAgICAgICAgZGlzcGF0Y2hQaGFzZS5zZXROYW1lKCJEaXNwYXRjaCIpOwotCi0gICAgICAgIEFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIgYWJkID0gbmV3IEFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIoKTsKLSAgICAgICAgYWJkLmluaXREaXNwYXRjaGVyKCk7Ci0KLSAgICAgICAgUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciBydWQgPSBuZXcgUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlcigpOwotICAgICAgICBydWQuaW5pdERpc3BhdGNoZXIoKTsKLQotICAgICAgICBTT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIHNhYmQgPSBuZXcgU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlcigpOwotICAgICAgICBzYWJkLmluaXREaXNwYXRjaGVyKCk7Ci0KLSAgICAgICAgU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIHNtYmQgPSBuZXcgU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyKCk7Ci0gICAgICAgIHNtYmQuaW5pdERpc3BhdGNoZXIoKTsKLQotICAgICAgICBkaXNwYXRjaFBoYXNlLmFkZEhhbmRsZXIoYWJkKTsKLSAgICAgICAgZGlzcGF0Y2hQaGFzZS5hZGRIYW5kbGVyKHJ1ZCk7Ci0gICAgICAgIGRpc3BhdGNoUGhhc2UuYWRkSGFuZGxlcihzYWJkKTsKLSAgICAgICAgZGlzcGF0Y2hQaGFzZS5hZGRIYW5kbGVyKHNtYmQpOwotCi0gICAgICAgIGNvbmZpZ3VyYXRpb25Db250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCkuZ2V0SW5GbG93UGhhc2VzKCkuYWRkKGRpc3BhdGNoUGhhc2UpOwotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICBheGlzU2VydmljZUdyb3VwID0gbmV3IEF4aXNTZXJ2aWNlR3JvdXAoYXhpc0NvbmZpZ3VyYXRpb24pOwotICAgICAgICBheGlzU2VydmljZUdyb3VwLnNldFNlcnZpY2VHcm91cE5hbWUoIlNlcnZpY2VHcm91cFRlc3QiKTsKLQotCi0gICAgICAgIGF4aXNTZXJ2aWNlID0gbmV3IEF4aXNTZXJ2aWNlKHNlcnZpY2VOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgYXhpc1NlcnZpY2VHcm91cC5hZGRTZXJ2aWNlKGF4aXNTZXJ2aWNlKTsKLQotCi0gICAgICAgIGF4aXNPcGVyYXRpb24gPSBuZXcgSW5PdXRBeGlzT3BlcmF0aW9uKG9wZXJhdGlvbk5hbWUpOwotICAgICAgICBheGlzT3BlcmF0aW9uLnNldE1lc3NhZ2VSZWNlaXZlcihuZXcgTWVzc2FnZVJlY2VpdmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgcmVjZWl2ZShNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ3R4KSB7Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgYXhpc1NlcnZpY2UuYWRkT3BlcmF0aW9uKGF4aXNPcGVyYXRpb24pOwotICAgICAgICBheGlzU2VydmljZS5tYXBBY3Rpb25Ub09wZXJhdGlvbihvcGVyYXRpb25OYW1lLmdldExvY2FsUGFydCgpLCBheGlzT3BlcmF0aW9uKTsKLQotCi0gICAgICAgIGNvbmZpZ3VyYXRpb25Db250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCkuYWRkU2VydmljZShheGlzU2VydmljZSk7Ci0KLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgIHNlcnZpY2VHcm91cENvbnRleHQgPQotICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb25Db250ZXh0LmNyZWF0ZVNlcnZpY2VHcm91cENvbnRleHQoYXhpc1NlcnZpY2UuZ2V0QXhpc1NlcnZpY2VHcm91cCgpKTsKLSAgICAgICAgc2VydmljZUdyb3VwQ29udGV4dC5zZXRJZCgiU2VydmljZUdyb3VwQ29udGV4dFRlc3QiKTsKLQotICAgICAgICBzZXJ2aWNlQ29udGV4dCA9IHNlcnZpY2VHcm91cENvbnRleHQuZ2V0U2VydmljZUNvbnRleHQoYXhpc1NlcnZpY2UpOwotCi0gICAgICAgIG9wZXJhdGlvbkNvbnRleHQgPSBzZXJ2aWNlQ29udGV4dC5jcmVhdGVPcGVyYXRpb25Db250ZXh0KG9wZXJhdGlvbk5hbWUpOwotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICB0cmFuc3BvcnRPdXQgPSBuZXcgVHJhbnNwb3J0T3V0RGVzY3JpcHRpb24oIm51bGwiKTsKLSAgICAgICAgdHJhbnNwb3J0T3V0LnNldFNlbmRlcihuZXcgQ29tbW9uc0hUVFBUcmFuc3BvcnRTZW5kZXIoKSk7Ci0KLSAgICAgICAgdHJhbnNwb3J0SW4gPSBuZXcgVHJhbnNwb3J0SW5EZXNjcmlwdGlvbigibnVsbCIpOwotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICBtYyA9IGNvbmZpZ3VyYXRpb25Db250ZXh0LmNyZWF0ZU1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIG1jLnNldFRyYW5zcG9ydEluKHRyYW5zcG9ydEluKTsKLSAgICAgICAgbWMuc2V0VHJhbnNwb3J0T3V0KHRyYW5zcG9ydE91dCk7Ci0gICAgICAgIG1jLnNldFRyYW5zcG9ydE91dCh0cmFuc3BvcnRPdXQpOwotCi0gICAgICAgIG1jLnNldFNlcnZlclNpZGUodHJ1ZSk7Ci0gICAgICAgIG1jLnNldFByb3BlcnR5KE1lc3NhZ2VDb250ZXh0LlRSQU5TUE9SVF9PVVQsIFN5c3RlbS5vdXQpOwotICAgICAgICBTT0FQRmFjdG9yeSBvbUZhYyA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMUZhY3RvcnkoKTsKLSAgICAgICAgbWMuc2V0RW52ZWxvcGUob21GYWMuZ2V0RGVmYXVsdEVudmVsb3BlKCkpOwotCi0gICAgICAgIFBoYXNlIHBoYXNlMSA9IG5ldyBQaGFzZSgiYmVnaW5QaGFzZTEiKTsKLSAgICAgICAgcGhhc2UxLmFkZEhhbmRsZXIobmV3IFRlbXBIYW5kbGVyKDEpKTsKLSAgICAgICAgcGhhc2UxLmFkZEhhbmRsZXIobmV3IFRlbXBIYW5kbGVyKDIpKTsKLSAgICAgICAgcGhhc2UxLmFkZEhhbmRsZXIobmV3IFRlbXBIYW5kbGVyKDMpKTsKLQotICAgICAgICBQaGFzZSBwaGFzZTIgPSBuZXcgUGhhc2UoIm1pZGRsZVBoYXNlMiIpOwotICAgICAgICBwaGFzZTIuYWRkSGFuZGxlcihuZXcgVGVtcEhhbmRsZXIoNCkpOwotICAgICAgICBwaGFzZTIuYWRkSGFuZGxlcihuZXcgVGVtcEhhbmRsZXIoNSkpOwotICAgICAgICBwaGFzZTIuYWRkSGFuZGxlcihuZXcgVGVtcEhhbmRsZXIoNikpOwotICAgICAgICBwaGFzZTIuYWRkSGFuZGxlcihuZXcgVGVtcEhhbmRsZXIoNykpOwotICAgICAgICBwaGFzZTIuYWRkSGFuZGxlcihuZXcgVGVtcEhhbmRsZXIoOCkpOwotCi0gICAgICAgIFBoYXNlIHBoYXNlMyA9IG5ldyBQaGFzZSgibGFzdFBoYXNlMyIpOwotICAgICAgICBwaGFzZTMuYWRkSGFuZGxlcihuZXcgVGVtcEhhbmRsZXIoOSkpOwotICAgICAgICBwaGFzZTMuYWRkSGFuZGxlcihuZXcgVGVtcEhhbmRsZXIoMTApKTsKLQotICAgICAgICBheGlzT3BlcmF0aW9uLmdldFJlbWFpbmluZ1BoYXNlc0luRmxvdygpLmFkZChwaGFzZTEpOwotICAgICAgICBheGlzT3BlcmF0aW9uLmdldFJlbWFpbmluZ1BoYXNlc0luRmxvdygpLmFkZChwaGFzZTIpOwotICAgICAgICBheGlzT3BlcmF0aW9uLmdldFJlbWFpbmluZ1BoYXNlc0luRmxvdygpLmFkZChwaGFzZTMpOwotCi0gICAgICAgIG1jLnNldFdTQUFjdGlvbihvcGVyYXRpb25OYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgbWMuc2V0U29hcEFjdGlvbihvcGVyYXRpb25OYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgU3lzdGVtLm91dC5mbHVzaCgpOwotCi0gICAgICAgIG1jLnNldE1lc3NhZ2VJRChVVUlER2VuZXJhdG9yLmdldFVVSUQoKSk7Ci0KLSAgICAgICAgLy9vcGVyYXRpb25Db250ZXh0LmFkZE1lc3NhZ2VDb250ZXh0KG1jKTsgIGdldHMgZG9uZSB2aWEgdGhlIHJlZ2lzdGVyCi0gICAgICAgIGF4aXNPcGVyYXRpb24ucmVnaXN0ZXJPcGVyYXRpb25Db250ZXh0KG1jLCBvcGVyYXRpb25Db250ZXh0KTsKLSAgICAgICAgbWMuc2V0T3BlcmF0aW9uQ29udGV4dChvcGVyYXRpb25Db250ZXh0KTsKLSAgICAgICAgbWMuc2V0U2VydmljZUNvbnRleHQoc2VydmljZUNvbnRleHQpOwotCi0gICAgICAgIG1jLnNldFRvKG5ldyBFbmRwb2ludFJlZmVyZW5jZSgiYXhpczIvc2VydmljZXMvTnVsbFNlcnZpY2UiKSk7Ci0gICAgICAgIG1jLnNldFdTQUFjdGlvbigiRHVtbXlPcCIpOwotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICBleGVjdXRlZEhhbmRsZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgfQotCi0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvL29yZy5hcGFjaGUubG9nNGouQmFzaWNDb25maWd1cmF0b3IuY29uZmlndXJlKCk7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2F2ZUFuZFJlc3RvcmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgRmlsZSB0aGVGaWxlID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIHRoZUZpbGVuYW1lID0gbnVsbDsKLSAgICAgICAgYm9vbGVhbiBzYXZlZCA9IGZhbHNlOwotICAgICAgICBib29sZWFuIHJlc3RvcmVkID0gZmFsc2U7Ci0gICAgICAgIGJvb2xlYW4gZG9uZSA9IGZhbHNlOwotICAgICAgICBib29sZWFuIGNvbXBhcmVzT2sgPSBmYWxzZTsKLQotICAgICAgICBsb2cuZGVidWcoIk9wZXJhdGlvbkNvbnRleHRTYXZlVGVzdDp0ZXN0U2F2ZUFuZFJlc3RvcmUoKTogIEJFR0lOIC0tLS0tLS0tLS0tLS0tLSIpOwotCi0gICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBzZXR1cCBhIHRlbXBvcmFyeSBmaWxlIHRvIHVzZQotICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHRoZUZpbGUgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJPcEN0eFNhdmUiLCBudWxsKTsKLSAgICAgICAgICAgIHRoZUZpbGVuYW1lID0gdGhlRmlsZS5nZXROYW1lKCk7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIk9wZXJhdGlvbkNvbnRleHRTYXZlVGVzdDp0ZXN0U2F2ZUFuZFJlc3RvcmUoKTogdGVtcCBmaWxlID0gWyIgKwotICAgICAgICAgICAgICAgICAgICB0aGVGaWxlbmFtZSArICJdIik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgbG9nLmRlYnVnKAotICAgICAgICAgICAgICAgICAgICAiT3BlcmF0aW9uQ29udGV4dFNhdmVUZXN0OnRlc3RTYXZlQW5kUmVzdG9yZSgpOiBlcnJvciBjcmVhdGluZyB0ZW1wIGZpbGUgPSBbIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXguZ2V0TWVzc2FnZSgpICsgIl0iKTsKLSAgICAgICAgICAgIHRoZUZpbGUgPSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHRoZUZpbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgICAgICAvLyBzYXZlIHRvIHRoZSB0ZW1wb3JhcnkgZmlsZQotICAgICAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIC8vIHNldHVwIGFuIG91dHB1dCBzdHJlYW0gdG8gYSBwaHlzaWNhbCBmaWxlCi0gICAgICAgICAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBvdXRTdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbSh0aGVGaWxlKTsKLQotICAgICAgICAgICAgICAgIC8vIGF0dGFjaCBhIHN0cmVhbSBjYXBhYmxlIG9mIHdyaXRpbmcgb2JqZWN0cyB0byB0aGUgCi0gICAgICAgICAgICAgICAgLy8gc3RyZWFtIGNvbm5lY3RlZCB0byB0aGUgZmlsZQotICAgICAgICAgICAgICAgIE9iamVjdE91dHB1dFN0cmVhbSBvdXRPYmpTdHJlYW0gPSBuZXcgT2JqZWN0T3V0cHV0U3RyZWFtKG91dFN0cmVhbSk7Ci0KLSAgICAgICAgICAgICAgICAvLyB0cnkgdG8gc2F2ZSB0aGUgbWVzc2FnZSBjb250ZXh0Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJPcGVyYXRpb25Db250ZXh0U2F2ZVRlc3Q6dGVzdFNhdmVBbmRSZXN0b3JlKCk6IHNhdmluZyAuLi4uLiIpOwotICAgICAgICAgICAgICAgIHNhdmVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgb3V0T2JqU3RyZWFtLndyaXRlT2JqZWN0KG9wZXJhdGlvbkNvbnRleHQpOwotCi0gICAgICAgICAgICAgICAgLy8gY2xvc2Ugb3V0IHRoZSBzdHJlYW1zCi0gICAgICAgICAgICAgICAgb3V0T2JqU3RyZWFtLmZsdXNoKCk7Ci0gICAgICAgICAgICAgICAgb3V0T2JqU3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgb3V0U3RyZWFtLmZsdXNoKCk7Ci0gICAgICAgICAgICAgICAgb3V0U3RyZWFtLmNsb3NlKCk7Ci0KLSAgICAgICAgICAgICAgICBzYXZlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKAotICAgICAgICAgICAgICAgICAgICAgICAgIk9wZXJhdGlvbkNvbnRleHRTYXZlVGVzdDp0ZXN0U2F2ZUFuZFJlc3RvcmUoKTogLi4uLnNhdmUgb3BlcmF0aW9uIGNvbXBsZXRlZC4uLi4uIik7Ci0KLSAgICAgICAgICAgICAgICBsb25nIGZpbGVzaXplID0gdGhlRmlsZS5sZW5ndGgoKTsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIk9wZXJhdGlvbkNvbnRleHRTYXZlVGVzdDp0ZXN0U2F2ZUFuZFJlc3RvcmUoKTogZmlsZSBzaXplIGFmdGVyIHNhdmUgWyIgKwotICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXNpemUgKyAiXSAgIHRlbXAgZmlsZSA9IFsiICsgdGhlRmlsZW5hbWUgKyAiXSIpOwotCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4MikgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiT3BlcmF0aW9uQ29udGV4dFNhdmVUZXN0OnRlc3RTYXZlQW5kUmVzdG9yZSgpOiBlcnJvciBkdXJpbmcgc2F2ZSBbIiArCi0gICAgICAgICAgICAgICAgICAgICAgICBleDIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIDogIiArIGV4Mi5nZXRNZXNzYWdlKCkgKyAiXSIpOwotICAgICAgICAgICAgICAgIGV4Mi5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzYXZlZCk7Ci0KLSAgICAgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAgICAgLy8gcmVzdG9yZSBmcm9tIHRoZSB0ZW1wb3JhcnkgZmlsZQotICAgICAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIC8vIHNldHVwIGFuIGlucHV0IHN0cmVhbSB0byB0aGUgZmlsZQotICAgICAgICAgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBpblN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0odGhlRmlsZSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBhdHRhY2ggYSBzdHJlYW0gY2FwYWJsZSBvZiByZWFkaW5nIG9iamVjdHMgZnJvbSB0aGUgCi0gICAgICAgICAgICAgICAgLy8gc3RyZWFtIGNvbm5lY3RlZCB0byB0aGUgZmlsZQotICAgICAgICAgICAgICAgIE9iamVjdElucHV0U3RyZWFtIGluT2JqU3RyZWFtID0gbmV3IE9iamVjdElucHV0U3RyZWFtKGluU3RyZWFtKTsKLQotICAgICAgICAgICAgICAgIC8vIHRyeSB0byByZXN0b3JlIHRoZSBjb250ZXh0Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJPcGVyYXRpb25Db250ZXh0U2F2ZVRlc3Q6dGVzdFNhdmVBbmRSZXN0b3JlKCk6IHJlc3RvcmluZyAuLi4uLiIpOwotICAgICAgICAgICAgICAgIHJlc3RvcmVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgT3BlcmF0aW9uQ29udGV4dCBvcGN0eF9yZXN0b3JlZCA9IChPcGVyYXRpb25Db250ZXh0KSBpbk9ialN0cmVhbS5yZWFkT2JqZWN0KCk7Ci0gICAgICAgICAgICAgICAgaW5PYmpTdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICBpblN0cmVhbS5jbG9zZSgpOwotCi0gICAgICAgICAgICAgICAgb3BjdHhfcmVzdG9yZWQuYWN0aXZhdGUoY29uZmlndXJhdGlvbkNvbnRleHQpOwotCi0gICAgICAgICAgICAgICAgcmVzdG9yZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygKLSAgICAgICAgICAgICAgICAgICAgICAgICJPcGVyYXRpb25Db250ZXh0U2F2ZVRlc3Q6dGVzdFNhdmVBbmRSZXN0b3JlKCk6IC4uLi5yZXN0b3JlZCBvcGVyYXRpb24gY29tcGxldGVkLi4uLi4iKTsKLQotICAgICAgICAgICAgICAgIC8vIGNvbXBhcmUgdG8gb3JpZ2luYWwKLSAgICAgICAgICAgICAgICBjb21wYXJlc09rID0gb3BjdHhfcmVzdG9yZWQuaXNFcXVpdmFsZW50KG9wZXJhdGlvbkNvbnRleHQpOwotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygKLSAgICAgICAgICAgICAgICAgICAgICAgICJPcGVyYXRpb25Db250ZXh0U2F2ZVRlc3Q6dGVzdFNhdmVBbmRSZXN0b3JlKCk6ICBPcGVyYXRpb25Db250ZXh0IGVxdWl2YWxlbmN5IFsiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyZXNPayArICJdIik7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjb21wYXJlc09rKTsKLQotICAgICAgICAgICAgICAgIFNlcnZpY2VDb250ZXh0IHJlc3RvcmVkX3NydkN0eCA9IG9wY3R4X3Jlc3RvcmVkLmdldFNlcnZpY2VDb250ZXh0KCk7Ci0gICAgICAgICAgICAgICAgY29tcGFyZXNPayA9IHJlc3RvcmVkX3NydkN0eC5pc0VxdWl2YWxlbnQoc2VydmljZUNvbnRleHQpOwotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygKLSAgICAgICAgICAgICAgICAgICAgICAgICJPcGVyYXRpb25Db250ZXh0U2F2ZVRlc3Q6dGVzdFNhdmVBbmRSZXN0b3JlKCk6ICBTZXJ2aWNlQ29udGV4dCBlcXVpdmFsZW5jeSBbIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmVzT2sgKyAiXSIpOwotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoY29tcGFyZXNPayk7Ci0KLSAgICAgICAgICAgICAgICBTZXJ2aWNlR3JvdXBDb250ZXh0IHJlc3RvcmVkX3NnQ3R4ID0gcmVzdG9yZWRfc3J2Q3R4LmdldFNlcnZpY2VHcm91cENvbnRleHQoKTsKLSAgICAgICAgICAgICAgICBjb21wYXJlc09rID0gcmVzdG9yZWRfc2dDdHguaXNFcXVpdmFsZW50KHNlcnZpY2VHcm91cENvbnRleHQpOwotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygKLSAgICAgICAgICAgICAgICAgICAgICAgICJPcGVyYXRpb25Db250ZXh0U2F2ZVRlc3Q6dGVzdFNhdmVBbmRSZXN0b3JlKCk6ICBTZXJ2aWNlR3JvdXBDb250ZXh0IGVxdWl2YWxlbmN5IFsiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyZXNPayArICJdIik7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjb21wYXJlc09rKTsKLQotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleDIpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIk9wZXJhdGlvbkNvbnRleHRTYXZlVGVzdDp0ZXN0U2F2ZUFuZFJlc3RvcmUoKTogZXJyb3IgZHVyaW5nIHJlc3RvcmUgWyIgKwotICAgICAgICAgICAgICAgICAgICAgICAgZXgyLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiA6ICIgKyBleDIuZ2V0TWVzc2FnZSgpICsgIl0iKTsKLSAgICAgICAgICAgICAgICBleDIucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUocmVzdG9yZWQpOwotCi0gICAgICAgICAgICAvLyBpZiB0aGUgc2F2ZS9yZXN0b3JlIG9mIHRoZSBvcGVyYXRpb24gY29udGV4dCBzdWNjZWVkZWQsCi0gICAgICAgICAgICAvLyB0aGVuIGRvbid0IGtlZXAgdGhlIHRlbXBvcmFyeSBmaWxlIGFyb3VuZAotICAgICAgICAgICAgYm9vbGVhbiByZW1vdmVUbXBGaWxlID0gc2F2ZWQgJiYgcmVzdG9yZWQgJiYgY29tcGFyZXNPazsKLSAgICAgICAgICAgIGlmIChyZW1vdmVUbXBGaWxlKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgdGhlRmlsZS5kZWxldGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGp1c3QgYWJzb3JiIGl0Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBpbmRpY2F0ZSB0aGF0IHRoZSB0ZW1wIGZpbGUgd2FzIGNyZWF0ZWQgb2sKLSAgICAgICAgICAgIGRvbmUgPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gdGhpcyBpcyBmYWxzZSB3aGVuIHRoZXJlIGFyZSBwcm9ibGVtcyB3aXRoIHRoZSB0ZW1wb3JhcnkgZmlsZQotICAgICAgICBhc3NlcnRUcnVlKGRvbmUpOwotCi0gICAgICAgIGxvZy5kZWJ1ZygiT3BlcmF0aW9uQ29udGV4dFNhdmVUZXN0OnRlc3RTYXZlQW5kUmVzdG9yZSgpOiAgRU5EIC0tLS0tLS0tLS0tLS0tLSIpOwotICAgIH0KLQotCi0gICAgcHVibGljIGNsYXNzIFRlbXBIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyIHsKLSAgICAgICAgcHJpdmF0ZSBJbnRlZ2VyIGluZGV4OwotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gY29uc3RydWN0b3JzCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICBwdWJsaWMgVGVtcEhhbmRsZXIoaW50IGluZGV4KSB7Ci0gICAgICAgICAgICB0aGlzLmluZGV4ID0gbmV3IEludGVnZXIoaW5kZXgpOwotICAgICAgICAgICAgaW5pdChuZXcgSGFuZGxlckRlc2NyaXB0aW9uKG5ldyBTdHJpbmcoImhhbmRsZXIiICsgaW5kZXgpKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIG1ldGhvZHMKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgIHB1YmxpYyBJbnZvY2F0aW9uUmVzcG9uc2UgaW52b2tlKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJUZW1wSGFuZGxlcjppbnZva2UoKTogaW5kZXggPSBbIiArIGluZGV4ICsgIl0iKTsKLSAgICAgICAgICAgIGV4ZWN1dGVkSGFuZGxlcnMuYWRkKGluZGV4KTsKLSAgICAgICAgICAgIHJldHVybiBJbnZvY2F0aW9uUmVzcG9uc2UuQ09OVElOVUU7Ci0gICAgICAgIH0KLQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9PcHRpb25zU2F2ZVRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvT3B0aW9uc1NhdmVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0MmZjYjkuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9PcHRpb25zU2F2ZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZW5naW5lOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQMTJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkFkZHJlc3NpbmdDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50Lk9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uVHJhbnNwb3J0SW5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlRyYW5zcG9ydE91dERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuQ29tbW9uc0hUVFBUcmFuc3BvcnRTZW5kZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5TaW1wbGVIVFRQU2VydmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW07Ci0KLXB1YmxpYyBjbGFzcyBPcHRpb25zU2F2ZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coT3B0aW9uc1NhdmVUZXN0LmNsYXNzKTsKLQotICAgIHByaXZhdGUgdHJhbnNpZW50IFFOYW1lIHNlcnZpY2VOYW1lID0gbmV3IFFOYW1lKCJOdWxsU2VydmljZSIpOwotICAgIHByaXZhdGUgdHJhbnNpZW50IFFOYW1lIG9wZXJhdGlvbk5hbWUgPSBuZXcgUU5hbWUoIkR1bW15T3AiKTsKLQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgdGVzdEFyZyA9IG51bGw7Ci0KLQotICAgIHB1YmxpYyBPcHRpb25zU2F2ZVRlc3QoU3RyaW5nIGFyZzApIHsKLSAgICAgICAgc3VwZXIoYXJnMCk7Ci0gICAgICAgIHRlc3RBcmcgPSBuZXcgU3RyaW5nKGFyZzApOwotCi0gICAgICAgIGluaXRBbGwoKTsKLSAgICB9Ci0KLQotICAgIHByb3RlY3RlZCB2b2lkIGluaXRBbGwoKSB7Ci0gICAgfQotCi0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvL29yZy5hcGFjaGUubG9nNGouQmFzaWNDb25maWd1cmF0b3IuY29uZmlndXJlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNhdmVBbmRSZXN0b3JlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEZpbGUgdGhlRmlsZSA9IG51bGw7Ci0gICAgICAgIFN0cmluZyB0aGVGaWxlbmFtZSA9IG51bGw7Ci0gICAgICAgIGJvb2xlYW4gc2F2ZWQgPSBmYWxzZTsKLSAgICAgICAgYm9vbGVhbiByZXN0b3JlZCA9IGZhbHNlOwotICAgICAgICBib29sZWFuIGRvbmUgPSBmYWxzZTsKLSAgICAgICAgYm9vbGVhbiBjb21wYXJlc09rID0gZmFsc2U7Ci0KLSAgICAgICAgQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZ3VyYXRpb24gPSBuZXcgQXhpc0NvbmZpZ3VyYXRpb24oKTsKLSAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlndXJhdGlvbkNvbnRleHQgPSBuZXcgQ29uZmlndXJhdGlvbkNvbnRleHQoYXhpc0NvbmZpZ3VyYXRpb24pOwotCi0KLSAgICAgICAgbG9nLmRlYnVnKCJPcHRpb25zU2F2ZVRlc3Q6dGVzdFNhdmVBbmRSZXN0b3JlKCk6ICBCRUdJTiAtLS0tLS0tLS0tLS0tLS0iKTsKLQotICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gc2V0dXAgYW4gb3B0aW9ucyBvYmplY3QgdG8gdXNlCi0gICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICBPcHRpb25zIG9wdGlvbnMgPSBuZXcgT3B0aW9ucygpOwotCi0gICAgICAgIG9wdGlvbnMuc2V0U29hcFZlcnNpb25VUkkoU09BUDEyQ29uc3RhbnRzLlNPQVBfRU5WRUxPUEVfTkFNRVNQQUNFX1VSSSk7Ci0gICAgICAgIG9wdGlvbnMuc2V0RXhjZXB0aW9uVG9CZVRocm93bk9uU09BUEZhdWx0KHRydWUpOwotICAgICAgICBvcHRpb25zLnNldFRpbWVPdXRJbk1pbGxpU2Vjb25kcyg1MDAwTCk7Ci0gICAgICAgIG9wdGlvbnMuc2V0VXNlU2VwYXJhdGVMaXN0ZW5lcihmYWxzZSk7Ci0gICAgICAgIG9wdGlvbnMuc2V0QWN0aW9uKCJTb2FwQWN0aW9uIik7Ci0gICAgICAgIG9wdGlvbnMuc2V0RmF1bHRUbyhuZXcgRW5kcG9pbnRSZWZlcmVuY2UoImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL2ZhdWx0VG8iKSk7Ci0gICAgICAgIG9wdGlvbnMuc2V0RnJvbShuZXcgRW5kcG9pbnRSZWZlcmVuY2UoImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL2Zyb20iKSk7Ci0gICAgICAgIG9wdGlvbnMuc2V0VG8obmV3IEVuZHBvaW50UmVmZXJlbmNlKCJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi90byIpKTsKLSAgICAgICAgb3B0aW9ucy5zZXRSZXBseVRvKG5ldyBFbmRwb2ludFJlZmVyZW5jZShBZGRyZXNzaW5nQ29uc3RhbnRzLkZpbmFsLldTQV9BTk9OWU1PVVNfVVJMKSk7Ci0KLSAgICAgICAgVHJhbnNwb3J0T3V0RGVzY3JpcHRpb24gdHJhbnNwb3J0T3V0ID0gbmV3IFRyYW5zcG9ydE91dERlc2NyaXB0aW9uKCJudWxsIik7Ci0gICAgICAgIFRyYW5zcG9ydE91dERlc2NyaXB0aW9uIHRyYW5zcG9ydE91dDIgPSBuZXcgVHJhbnNwb3J0T3V0RGVzY3JpcHRpb24oImhhcHB5Iik7Ci0gICAgICAgIFRyYW5zcG9ydE91dERlc2NyaXB0aW9uIHRyYW5zcG9ydE91dDMgPSBuZXcgVHJhbnNwb3J0T3V0RGVzY3JpcHRpb24oImdvbHVja3kiKTsKLSAgICAgICAgdHJhbnNwb3J0T3V0LnNldFNlbmRlcihuZXcgQ29tbW9uc0hUVFBUcmFuc3BvcnRTZW5kZXIoKSk7Ci0gICAgICAgIHRyYW5zcG9ydE91dDIuc2V0U2VuZGVyKG5ldyBDb21tb25zSFRUUFRyYW5zcG9ydFNlbmRlcigpKTsKLSAgICAgICAgdHJhbnNwb3J0T3V0My5zZXRTZW5kZXIobmV3IENvbW1vbnNIVFRQVHJhbnNwb3J0U2VuZGVyKCkpOwotICAgICAgICBvcHRpb25zLnNldFRyYW5zcG9ydE91dCh0cmFuc3BvcnRPdXQpOwotICAgICAgICBheGlzQ29uZmlndXJhdGlvbi5hZGRUcmFuc3BvcnRPdXQodHJhbnNwb3J0T3V0Myk7Ci0gICAgICAgIGF4aXNDb25maWd1cmF0aW9uLmFkZFRyYW5zcG9ydE91dCh0cmFuc3BvcnRPdXQyKTsKLSAgICAgICAgYXhpc0NvbmZpZ3VyYXRpb24uYWRkVHJhbnNwb3J0T3V0KHRyYW5zcG9ydE91dCk7Ci0KLSAgICAgICAgVHJhbnNwb3J0SW5EZXNjcmlwdGlvbiB0cmFuc3BvcnRJbiA9IG5ldyBUcmFuc3BvcnRJbkRlc2NyaXB0aW9uKCJudWxsIik7Ci0gICAgICAgIFRyYW5zcG9ydEluRGVzY3JpcHRpb24gdHJhbnNwb3J0SW4yID0gbmV3IFRyYW5zcG9ydEluRGVzY3JpcHRpb24oImFsd2F5cyIpOwotICAgICAgICBUcmFuc3BvcnRJbkRlc2NyaXB0aW9uIHRyYW5zcG9ydEluMyA9IG5ldyBUcmFuc3BvcnRJbkRlc2NyaXB0aW9uKCJ0aGViZXN0Iik7Ci0gICAgICAgIHRyYW5zcG9ydEluLnNldFJlY2VpdmVyKG5ldyBTaW1wbGVIVFRQU2VydmVyKCkpOwotICAgICAgICB0cmFuc3BvcnRJbjIuc2V0UmVjZWl2ZXIobmV3IFNpbXBsZUhUVFBTZXJ2ZXIoKSk7Ci0gICAgICAgIHRyYW5zcG9ydEluMy5zZXRSZWNlaXZlcihuZXcgU2ltcGxlSFRUUFNlcnZlcigpKTsKLSAgICAgICAgb3B0aW9ucy5zZXRUcmFuc3BvcnRJbih0cmFuc3BvcnRJbik7Ci0gICAgICAgIGF4aXNDb25maWd1cmF0aW9uLmFkZFRyYW5zcG9ydEluKHRyYW5zcG9ydEluMik7Ci0gICAgICAgIGF4aXNDb25maWd1cmF0aW9uLmFkZFRyYW5zcG9ydEluKHRyYW5zcG9ydEluKTsKLSAgICAgICAgYXhpc0NvbmZpZ3VyYXRpb24uYWRkVHJhbnNwb3J0SW4odHJhbnNwb3J0SW4zKTsKLQotICAgICAgICBvcHRpb25zLnNldE1lc3NhZ2VJZCgibXNnSWQwMTIzNDUiKTsKLQotICAgICAgICBvcHRpb25zLnNldFByb3BlcnR5KCJrZXkwMSIsICJ2YWx1ZTAxIik7Ci0gICAgICAgIG9wdGlvbnMuc2V0UHJvcGVydHkoImtleTAyIiwgInZhbHVlMDIiKTsKLSAgICAgICAgb3B0aW9ucy5zZXRQcm9wZXJ0eSgia2V5MDMiLCAidmFsdWUwMyIpOwotICAgICAgICBvcHRpb25zLnNldFByb3BlcnR5KCJrZXkwNCIsICJ2YWx1ZTA0Iik7Ci0gICAgICAgIG9wdGlvbnMuc2V0UHJvcGVydHkoImtleTA1IiwgInZhbHVlMDUiKTsKLSAgICAgICAgb3B0aW9ucy5zZXRQcm9wZXJ0eSgia2V5MDYiLCAidmFsdWUwNiIpOwotICAgICAgICBvcHRpb25zLnNldFByb3BlcnR5KCJrZXkwNyIsICJ2YWx1ZTA3Iik7Ci0gICAgICAgIG9wdGlvbnMuc2V0UHJvcGVydHkoImtleTA4IiwgInZhbHVlMDgiKTsKLSAgICAgICAgb3B0aW9ucy5zZXRQcm9wZXJ0eSgia2V5MDkiLCAidmFsdWUwOSIpOwotICAgICAgICBvcHRpb25zLnNldFByb3BlcnR5KCJrZXkxMCIsICJ2YWx1ZTEwIik7Ci0KLSAgICAgICAgLy8gVE9ETzogc2V0dXAgYSBwYXJlbnQKLQotICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gc2V0dXAgYSB0ZW1wb3JhcnkgZmlsZSB0byB1c2UKLSAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB0aGVGaWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgib3B0aW9uc1NhdmUiLCBudWxsKTsKLSAgICAgICAgICAgIHRoZUZpbGVuYW1lID0gdGhlRmlsZS5nZXROYW1lKCk7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIk9wdGlvbnNTYXZlVGVzdDp0ZXN0U2F2ZUFuZFJlc3RvcmUoKTogdGVtcCBmaWxlID0gWyIgKyB0aGVGaWxlbmFtZSArICJdIik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJPcHRpb25zU2F2ZVRlc3Q6dGVzdFNhdmVBbmRSZXN0b3JlKCk6IGVycm9yIGNyZWF0aW5nIHRlbXAgZmlsZSA9IFsiICsKLSAgICAgICAgICAgICAgICAgICAgZXguZ2V0TWVzc2FnZSgpICsgIl0iKTsKLSAgICAgICAgICAgIHRoZUZpbGUgPSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHRoZUZpbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgICAgICAvLyBzYXZlIHRvIHRoZSB0ZW1wb3JhcnkgZmlsZQotICAgICAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIC8vIHNldHVwIGFuIG91dHB1dCBzdHJlYW0gdG8gYSBwaHlzaWNhbCBmaWxlCi0gICAgICAgICAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBvdXRTdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbSh0aGVGaWxlKTsKLQotICAgICAgICAgICAgICAgIC8vIGF0dGFjaCBhIHN0cmVhbSBjYXBhYmxlIG9mIHdyaXRpbmcgb2JqZWN0cyB0byB0aGUgCi0gICAgICAgICAgICAgICAgLy8gc3RyZWFtIGNvbm5lY3RlZCB0byB0aGUgZmlsZQotICAgICAgICAgICAgICAgIE9iamVjdE91dHB1dFN0cmVhbSBvdXRPYmpTdHJlYW0gPSBuZXcgT2JqZWN0T3V0cHV0U3RyZWFtKG91dFN0cmVhbSk7Ci0KLSAgICAgICAgICAgICAgICAvLyB0cnkgdG8gc2F2ZSB0aGUgbWVzc2FnZSBjb250ZXh0Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJPcHRpb25zU2F2ZVRlc3Q6dGVzdFNhdmVBbmRSZXN0b3JlKCk6IHNhdmluZyAuLi4uLiIpOwotICAgICAgICAgICAgICAgIHNhdmVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgb3V0T2JqU3RyZWFtLndyaXRlT2JqZWN0KG9wdGlvbnMpOwotCi0gICAgICAgICAgICAgICAgLy8gY2xvc2Ugb3V0IHRoZSBzdHJlYW1zCi0gICAgICAgICAgICAgICAgb3V0T2JqU3RyZWFtLmZsdXNoKCk7Ci0gICAgICAgICAgICAgICAgb3V0T2JqU3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgb3V0U3RyZWFtLmZsdXNoKCk7Ci0gICAgICAgICAgICAgICAgb3V0U3RyZWFtLmNsb3NlKCk7Ci0KLSAgICAgICAgICAgICAgICBzYXZlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKAotICAgICAgICAgICAgICAgICAgICAgICAgIk9wdGlvbnNTYXZlVGVzdDp0ZXN0U2F2ZUFuZFJlc3RvcmUoKTogLi4uLnNhdmUgb3BlcmF0aW9uIGNvbXBsZXRlZC4uLi4uIik7Ci0KLSAgICAgICAgICAgICAgICBsb25nIGZpbGVzaXplID0gdGhlRmlsZS5sZW5ndGgoKTsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIk9wdGlvbnNTYXZlVGVzdDp0ZXN0U2F2ZUFuZFJlc3RvcmUoKTogZmlsZSBzaXplIGFmdGVyIHNhdmUgWyIgKwotICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXNpemUgKyAiXSAgIHRlbXAgZmlsZSA9IFsiICsgdGhlRmlsZW5hbWUgKyAiXSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleDIpIHsKLSAgICAgICAgICAgICAgICBpZiAoc2F2ZWQgIT0gdHJ1ZSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIk9wdGlvbnNTYXZlVGVzdDp0ZXN0U2F2ZUFuZFJlc3RvcmUoKTogZXJyb3IgZHVyaW5nIHNhdmUgWyIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Mi5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgOiAiICsgZXgyLmdldE1lc3NhZ2UoKSArICJdIik7Ci0gICAgICAgICAgICAgICAgICAgIGV4Mi5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIk9wdGlvbnNTYXZlVGVzdDp0ZXN0U2F2ZUFuZFJlc3RvcmUoKTogZXJyb3IgZHVyaW5nIHJlc3RvcmUgWyIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Mi5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgOiAiICsgZXgyLmdldE1lc3NhZ2UoKSArICJdIik7Ci0gICAgICAgICAgICAgICAgICAgIGV4Mi5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoc2F2ZWQpOwotCi0gICAgICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgICAgIC8vIHJlc3RvcmUgZnJvbSB0aGUgdGVtcG9yYXJ5IGZpbGUKLSAgICAgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAvLyBzZXR1cCBhbiBpbnB1dCBzdHJlYW0gdG8gdGhlIGZpbGUKLSAgICAgICAgICAgICAgICBGaWxlSW5wdXRTdHJlYW0gaW5TdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKHRoZUZpbGUpOwotCi0gICAgICAgICAgICAgICAgLy8gYXR0YWNoIGEgc3RyZWFtIGNhcGFibGUgb2YgcmVhZGluZyBvYmplY3RzIGZyb20gdGhlIAotICAgICAgICAgICAgICAgIC8vIHN0cmVhbSBjb25uZWN0ZWQgdG8gdGhlIGZpbGUKLSAgICAgICAgICAgICAgICBPYmplY3RJbnB1dFN0cmVhbSBpbk9ialN0cmVhbSA9IG5ldyBPYmplY3RJbnB1dFN0cmVhbShpblN0cmVhbSk7Ci0KLSAgICAgICAgICAgICAgICAvLyB0cnkgdG8gcmVzdG9yZSB0aGUgb3B0aW9ucwotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiT3B0aW9uc1NhdmVUZXN0OnRlc3RTYXZlQW5kUmVzdG9yZSgpOiByZXN0b3JpbmcgLi4uLi4iKTsKLSAgICAgICAgICAgICAgICByZXN0b3JlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIE9wdGlvbnMgb3B0aW9uc19yZXN0b3JlZCA9IChPcHRpb25zKSBpbk9ialN0cmVhbS5yZWFkT2JqZWN0KCk7Ci0gICAgICAgICAgICAgICAgaW5PYmpTdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICBpblN0cmVhbS5jbG9zZSgpOwotCi0gICAgICAgICAgICAgICAgb3B0aW9uc19yZXN0b3JlZC5hY3RpdmF0ZShjb25maWd1cmF0aW9uQ29udGV4dCk7Ci0KLSAgICAgICAgICAgICAgICByZXN0b3JlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKAotICAgICAgICAgICAgICAgICAgICAgICAgIk9wdGlvbnNTYXZlVGVzdDp0ZXN0U2F2ZUFuZFJlc3RvcmUoKTogLi4uLnJlc3RvcmVkIG9wZXJhdGlvbiBjb21wbGV0ZWQuLi4uLiIpOwotCi0gICAgICAgICAgICAgICAgY29tcGFyZXNPayA9IG9wdGlvbnNfcmVzdG9yZWQuaXNFcXVpdmFsZW50KG9wdGlvbnMpOwotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiT3B0aW9uc1NhdmVUZXN0OnRlc3RTYXZlQW5kUmVzdG9yZSgpOiAgIE9wdGlvbnMgZXF1aXZhbGVuY3kgWyIgKwotICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyZXNPayArICJdIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4MikgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiT3B0aW9uc1NhdmVUZXN0OnRlc3RTYXZlQW5kUmVzdG9yZSgpOiBlcnJvciBkdXJpbmcgcmVzdG9yZSBbIiArCi0gICAgICAgICAgICAgICAgICAgICAgICBleDIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIDogIiArIGV4Mi5nZXRNZXNzYWdlKCkgKyAiXSIpOwotICAgICAgICAgICAgICAgIGV4Mi5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZXN0b3JlZCk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoY29tcGFyZXNPayk7Ci0KLSAgICAgICAgICAgIC8vIGlmIHRoZSBzYXZlL3Jlc3RvcmUgb2YgdGhlIG9iamVjdCBzdWNjZWVkZWQsCi0gICAgICAgICAgICAvLyB0aGVuIGRvbid0IGtlZXAgdGhlIHRlbXBvcmFyeSBmaWxlIGFyb3VuZAotICAgICAgICAgICAgYm9vbGVhbiByZW1vdmVUbXBGaWxlID0gc2F2ZWQgJiYgcmVzdG9yZWQgJiYgY29tcGFyZXNPazsKLSAgICAgICAgICAgIGlmIChyZW1vdmVUbXBGaWxlKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgdGhlRmlsZS5kZWxldGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGp1c3QgYWJzb3JiIGl0Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBpbmRpY2F0ZSB0aGF0IHRoZSB0ZW1wIGZpbGUgd2FzIGNyZWF0ZWQgb2sKLSAgICAgICAgICAgIGRvbmUgPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gdGhpcyBpcyBmYWxzZSB3aGVuIHRoZXJlIGFyZSBwcm9ibGVtcyB3aXRoIHRoZSB0ZW1wb3JhcnkgZmlsZQotICAgICAgICBhc3NlcnRUcnVlKGRvbmUpOwotCi0gICAgICAgIGxvZy5kZWJ1ZygiT3B0aW9uc1NhdmVUZXN0OnRlc3RTYXZlQW5kUmVzdG9yZSgpOiAgRU5EIC0tLS0tLS0tLS0tLS0tLSIpOwotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL1BhdXNpbmdIYW5kbGVyRXhlY3V0aW9uVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9QYXVzaW5nSGFuZGxlckV4ZWN1dGlvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE4MGFmNy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL1BhdXNpbmdIYW5kbGVyRXhlY3V0aW9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDU3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5lbmdpbmU7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVAxMkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5PcHRpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50LlNlcnZpY2VDbGllbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS51dGlsLlRlc3RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5oYW5kbGVycy5BYnN0cmFjdEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pbnRlZ3JhdGlvbi5UZXN0aW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pbnRlZ3JhdGlvbi5VdGlsU2VydmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaW50ZWdyYXRpb24uVXRpbFNlcnZlckJhc2VkVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5waGFzZXJlc29sdmVyLlBoYXNlTWV0YWRhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLlV0aWxzOwotCi1wdWJsaWMgY2xhc3MgUGF1c2luZ0hhbmRsZXJFeGVjdXRpb25UZXN0IGV4dGVuZHMgVXRpbFNlcnZlckJhc2VkVGVzdENhc2UgaW1wbGVtZW50cyBUZXN0Q29uc3RhbnRzIHsKLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGluaXREb25lID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgQXJyYXlMaXN0IHRlc3RSZXN1bHRzOwotICAgIHByaXZhdGUgQXhpc1NlcnZpY2UgdGVzdFNlcnZpY2U7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgVGVzdEhhbmRsZXIgbWlkZGxlR2xvYmFsSW5IYW5kbGVyOwotICAgIHByaXZhdGUgVGVzdEhhbmRsZXIgZmlyc3RPcGVyYXRpb25JbkhhbmRsZXI7Ci0gICAgcHJpdmF0ZSBUZXN0SGFuZGxlciBtaWRkbGVPcGVyYXRpb25JbkhhbmRsZXI7Ci0gICAgcHJpdmF0ZSBUZXN0SGFuZGxlciBtaWRkbGVPcGVyYXRpb25PdXRIYW5kbGVyOwotCi0gICAgcHVibGljIFBhdXNpbmdIYW5kbGVyRXhlY3V0aW9uVGVzdCgpIHsKLSAgICAgICAgc3VwZXIoUGF1c2luZ0hhbmRsZXJFeGVjdXRpb25UZXN0LmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIFBhdXNpbmdIYW5kbGVyRXhlY3V0aW9uVGVzdChTdHJpbmcgdGVzdE5hbWUpIHsKLSAgICAgICAgc3VwZXIodGVzdE5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgcmV0dXJuIGdldFRlc3RTZXR1cChuZXcgVGVzdFN1aXRlKFBhdXNpbmdIYW5kbGVyRXhlY3V0aW9uVGVzdC5jbGFzcykpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vb3JnLmFwYWNoZS5sb2c0ai5CYXNpY0NvbmZpZ3VyYXRvci5jb25maWd1cmUoKTsKLQotICAgICAgICB0ZXN0UmVzdWx0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgICAgICBpZiAoIWluaXREb25lKSB7Ci0gICAgICAgICAgICBpbml0RG9uZSA9IHRydWU7Ci0gICAgICAgICAgICBMaXN0IGdsb2JhbEluUGhhc2VzID0KLSAgICAgICAgICAgICAgICAgICAgVXRpbFNlcnZlci5nZXRDb25maWd1cmF0aW9uQ29udGV4dCgpLmdldEF4aXNDb25maWd1cmF0aW9uKCkuZ2V0SW5GbG93UGhhc2VzKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGdsb2JhbEluUGhhc2VzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgUGhhc2UgZ2xvYmFsSW5QaGFzZSA9IChQaGFzZSlnbG9iYWxJblBoYXNlcy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgaWYgKFBoYXNlTWV0YWRhdGEuUEhBU0VfUFJFX0RJU1BBVENILmVxdWFscyhnbG9iYWxJblBoYXNlLmdldFBoYXNlTmFtZSgpKSkgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkFkZGluZyBoYW5kbGVycyB0byAgZ2xvYmFsSW5QaGFzZSAgIG5hbWUgWyIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbEluUGhhc2UuZ2V0UGhhc2VOYW1lKCkgKyAiXSAgLi4uIik7Ci0gICAgICAgICAgICAgICAgICAgIGdsb2JhbEluUGhhc2UuYWRkSGFuZGxlcihuZXcgVGVzdEhhbmRsZXIoIkluMSIpKTsKLSAgICAgICAgICAgICAgICAgICAgbWlkZGxlR2xvYmFsSW5IYW5kbGVyID0gbmV3IFRlc3RIYW5kbGVyKCJJbjIiKTsKLSAgICAgICAgICAgICAgICAgICAgZ2xvYmFsSW5QaGFzZS5hZGRIYW5kbGVyKG1pZGRsZUdsb2JhbEluSGFuZGxlcik7Ci0gICAgICAgICAgICAgICAgICAgIGdsb2JhbEluUGhhc2UuYWRkSGFuZGxlcihuZXcgVGVzdEhhbmRsZXIoIkluMyIpKTsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIuLi5kb25lIGFkZGluZyBoYW5kbGVycyB0byAgZ2xvYmFsSW5QaGFzZSAgIG5hbWUgWyIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbEluUGhhc2UuZ2V0UGhhc2VOYW1lKCkgKyAiXSAgLi4uIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdGVzdFNlcnZpY2UgPSBVdGlscy5jcmVhdGVTaW1wbGVTZXJ2aWNlKHNlcnZpY2VOYW1lLCBFY2hvLmNsYXNzLmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbk5hbWUpOwotICAgICAgICBVdGlsU2VydmVyLmRlcGxveVNlcnZpY2UodGVzdFNlcnZpY2UpOwotICAgICAgICBBeGlzT3BlcmF0aW9uIG9wZXJhdGlvbiA9IHRlc3RTZXJ2aWNlLmdldE9wZXJhdGlvbihvcGVyYXRpb25OYW1lKTsKLQotICAgICAgICBBcnJheUxpc3Qgb3BlcmF0aW9uU3BlY2lmaWNQaGFzZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIG9wZXJhdGlvblNwZWNpZmljUGhhc2VzLmFkZChuZXcgUGhhc2UoCi0gICAgICAgICAgICAgICAgUGhhc2VNZXRhZGF0YS5QSEFTRV9QT0xJQ1lfREVURVJNSU5BVElPTikpOwotICAgICAgICBvcGVyYXRpb24uc2V0UmVtYWluaW5nUGhhc2VzSW5GbG93KG9wZXJhdGlvblNwZWNpZmljUGhhc2VzKTsKLSAgICAgICAgQXJyYXlMaXN0IHBoYXNlTGlzdCA9IG9wZXJhdGlvbi5nZXRSZW1haW5pbmdQaGFzZXNJbkZsb3coKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwaGFzZUxpc3Quc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIFBoYXNlIG9wZXJhdGlvblNwZWNpZmljUGhhc2UgPSAoUGhhc2UpcGhhc2VMaXN0LmdldChpKTsKLSAgICAgICAgICAgIGlmIChQaGFzZU1ldGFkYXRhLlBIQVNFX1BPTElDWV9ERVRFUk1JTkFUSU9OCi0gICAgICAgICAgICAgICAgICAgIC5lcXVhbHMob3BlcmF0aW9uU3BlY2lmaWNQaGFzZS5nZXRQaGFzZU5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICBmaXJzdE9wZXJhdGlvbkluSGFuZGxlciA9IG5ldyBUZXN0SGFuZGxlcigiSW40Iik7Ci0gICAgICAgICAgICAgICAgb3BlcmF0aW9uU3BlY2lmaWNQaGFzZS5hZGRIYW5kbGVyKGZpcnN0T3BlcmF0aW9uSW5IYW5kbGVyKTsKLSAgICAgICAgICAgICAgICBtaWRkbGVPcGVyYXRpb25JbkhhbmRsZXIgPSBuZXcgVGVzdEhhbmRsZXIoIkluNSIpOwotICAgICAgICAgICAgICAgIG9wZXJhdGlvblNwZWNpZmljUGhhc2UuYWRkSGFuZGxlcihtaWRkbGVPcGVyYXRpb25JbkhhbmRsZXIpOwotICAgICAgICAgICAgICAgIG9wZXJhdGlvblNwZWNpZmljUGhhc2UuYWRkSGFuZGxlcihuZXcgVGVzdEhhbmRsZXIoIkluNiIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIG9wZXJhdGlvblNwZWNpZmljUGhhc2VzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBvcGVyYXRpb25TcGVjaWZpY1BoYXNlcy5hZGQobmV3IFBoYXNlKAotICAgICAgICAgICAgICAgIFBoYXNlTWV0YWRhdGEuUEhBU0VfUE9MSUNZX0RFVEVSTUlOQVRJT04pKTsKLSAgICAgICAgb3BlcmF0aW9uLnNldFBoYXNlc091dEZsb3cob3BlcmF0aW9uU3BlY2lmaWNQaGFzZXMpOwotICAgICAgICBwaGFzZUxpc3QgPSBvcGVyYXRpb24uZ2V0UGhhc2VzT3V0RmxvdygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBoYXNlTGlzdC5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgUGhhc2Ugb3BlcmF0aW9uU3BlY2lmaWNQaGFzZSA9IChQaGFzZSlwaGFzZUxpc3QuZ2V0KGkpOwotICAgICAgICAgICAgaWYgKFBoYXNlTWV0YWRhdGEuUEhBU0VfUE9MSUNZX0RFVEVSTUlOQVRJT04KLSAgICAgICAgICAgICAgICAgICAgLmVxdWFscyhvcGVyYXRpb25TcGVjaWZpY1BoYXNlLmdldFBoYXNlTmFtZSgpKSkgewotICAgICAgICAgICAgICAgIG9wZXJhdGlvblNwZWNpZmljUGhhc2UuYWRkSGFuZGxlcihuZXcgVGVzdEhhbmRsZXIoIk91dDEiKSk7Ci0gICAgICAgICAgICAgICAgbWlkZGxlT3BlcmF0aW9uT3V0SGFuZGxlciA9IG5ldyBUZXN0SGFuZGxlcigiT3V0MiIpOwotICAgICAgICAgICAgICAgIG9wZXJhdGlvblNwZWNpZmljUGhhc2UuYWRkSGFuZGxlcihtaWRkbGVPcGVyYXRpb25PdXRIYW5kbGVyKTsKLSAgICAgICAgICAgICAgICBvcGVyYXRpb25TcGVjaWZpY1BoYXNlLmFkZEhhbmRsZXIobmV3IFRlc3RIYW5kbGVyKCJPdXQzIikpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgVXRpbFNlcnZlci51bkRlcGxveVNlcnZpY2Uoc2VydmljZU5hbWUpOwotICAgICAgICBVdGlsU2VydmVyLnVuRGVwbG95Q2xpZW50U2VydmljZSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgU2VydmljZUNsaWVudCBjcmVhdGVDbGllbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgT3B0aW9ucyBvcHRpb25zID0gbmV3IE9wdGlvbnMoKTsKLSAgICAgICAgb3B0aW9ucy5zZXRUbyh0YXJnZXRFUFIpOwotICAgICAgICBvcHRpb25zLnNldFNvYXBWZXJzaW9uVVJJKFNPQVAxMkNvbnN0YW50cy5TT0FQX0VOVkVMT1BFX05BTUVTUEFDRV9VUkkpOwotICAgICAgICBvcHRpb25zLnNldFRyYW5zcG9ydEluUHJvdG9jb2woQ29uc3RhbnRzLlRSQU5TUE9SVF9IVFRQKTsKLSAgICAgICAgb3B0aW9ucy5zZXRBY3Rpb24ob3BlcmF0aW9uTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgIG9wdGlvbnMuc2V0VXNlU2VwYXJhdGVMaXN0ZW5lcih0cnVlKTsKLSAgICAgICAgb3B0aW9ucy5zZXRUaW1lT3V0SW5NaWxsaVNlY29uZHMoNTAwMDApOwotCi0gICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQgPSBVdGlsU2VydmVyLmNyZWF0ZUNsaWVudENvbmZpZ3VyYXRpb25Db250ZXh0KCk7Ci0KLSAgICAgICAgU2VydmljZUNsaWVudCBzZW5kZXIgPSBuZXcgU2VydmljZUNsaWVudChjb25maWdDb250ZXh0LCBudWxsKTsKLSAgICAgICAgc2VuZGVyLnNldE9wdGlvbnMob3B0aW9ucyk7Ci0gICAgICAgIHNlbmRlci5lbmdhZ2VNb2R1bGUoImFkZHJlc3NpbmciKTsKLSAgICAgICAgcmV0dXJuIHNlbmRlcjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZXhlY3V0ZUNsaWVudCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBPTUVsZW1lbnQgcGF5bG9hZCA9IFRlc3RpbmdVdGlscy5jcmVhdGVEdW1teU9NRWxlbWVudCgpOwotICAgICAgICBPTUVsZW1lbnQgcmVzdWx0ID0gY3JlYXRlQ2xpZW50KCkuc2VuZFJlY2VpdmUocGF5bG9hZCk7Ci0KLSAgICAgICAgVGVzdGluZ1V0aWxzLmNvbXBhcmVXaXRoQ3JlYXRlZE9NRWxlbWVudChyZXN1bHQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTdWNjZXNzZnVsSW52b2NhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlN0YXJ0aW5nIHRlc3RTdWNjZXNzZnVsSW52b2NhdGlvbiIpOwotICAgICAgICBtaWRkbGVHbG9iYWxJbkhhbmRsZXIuc2hvdWxkUGF1c2UodHJ1ZSk7Ci0gICAgICAgIGV4ZWN1dGVDbGllbnQoKTsKLQotICAgICAgICAvKlNpbmNlIHRoZSByZXNwb25zZSBpcyBnb2luZyBiYWNrIHNlcGFyYXRlbHksIHdlIG5lZWQgdG8gZ2l2ZSB0aGUgc2VydmVyCi0gKnRpbWUgdG8gdW53aW5kIHRoZSByZXN0IG9mIHRoZSBpbnZvY2F0aW9uLiovCi0gICAgICAgIC8vVGhyZWFkLnNsZWVwKDUwMDApOwotICAgICAgICBUaHJlYWQuc2xlZXAoNzAwMCk7Ci0KLSAgICAgICAgSXRlcmF0b3IgaXQgPSB0ZXN0UmVzdWx0cy5pdGVyYXRvcigpOwotICAgICAgICBpbnQgY291bnQgPSAwOwotICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBjb3VudCArKzsKLSAgICAgICAgICAgIFN0cmluZyB0bXAgPSAoU3RyaW5nKWl0Lm5leHQoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGVzdCBSZXN1bHRzIFsiICsgY291bnQgKyAiXSA9IFsiICsgdG1wICsgIl0iKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gdW5jb21tZW50L2NvbW1lbnQgb3V0IHRoZSBkZXNpcmVkIHJlc3VsdHMgYmFzZWQgb24gd2hldGhlciBwYXVzaW5nCi0gICAgICAgIC8vIHRoZSBtZXNzYWdlIGNvbnRleHQKLQotICAgICAgICAvLyBleHBlY3RlZCByZXN1bHRzIHdoZW4gbm90IHBhdXNpbmcKLSAgICAgICAgLy9MaXN0IGV4cGVjdGVkRXhlY3V0aW9uU3RhdGUgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7IkluMSIsICJJbjIiLCAiSW4zIiwgIkluNCIsICJJbjUiLCAiSW42IiwgIk91dDEiLCAiT3V0MiIsICJPdXQzIiwgIkZDT3V0MyIsICJGQ091dDIiLCAiRkNPdXQxIiwgIkZDSW42IiwgIkZDSW41IiwgIkZDSW40IiwgIkZDSW4zIiwgIkZDSW4yIiwgIkZDSW4xIn0pOwotCi0gICAgICAgIC8vIGV4cGVjdGVkIHJlc3VsdHMgd2hlbiBwYXVzaW5nCi0gICAgICAgIExpc3QgZXhwZWN0ZWRFeGVjdXRpb25TdGF0ZSA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIkluMSIsICJJbjIiLCAiSW4yIiwgIkluMyIsCi0gICAgICAgICAgICAgICAgIkluNCIsICJJbjUiLCAiSW42IiwgIk91dDEiLCAiT3V0MiIsICJPdXQzIiwgIkZDT3V0MyIsICJGQ091dDIiLCAiRkNPdXQxIiwgIkZDSW42IiwKLSAgICAgICAgICAgICAgICAiRkNJbjUiLCAiRkNJbjQiLCAiRkNJbjMiLCAiRkNJbjIiLCAiRkNJbjEiIH0pOwotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZEV4ZWN1dGlvblN0YXRlLCB0ZXN0UmVzdWx0cyk7Ci0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIFRlc3RIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyIHsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgaGFuZGxlck5hbWU7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBzaG91bGRGYWlsID0gZmFsc2U7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBzaG91bGRQYXVzZSA9IGZhbHNlOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gc2hvdWxkU2F2ZSA9IHRydWU7Ci0KLSAgICAgICAgcHVibGljIFRlc3RIYW5kbGVyKFN0cmluZyBoYW5kbGVyTmFtZSkgewotICAgICAgICAgICAgdGhpcy5oYW5kbGVyTmFtZSA9IGhhbmRsZXJOYW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2hvdWxkRmFpbChib29sZWFuIGZhaWwpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU2V0dGluZyBzaG91bGRGYWlsIHRvICIgKyBmYWlsICsgIiBmb3IgIiArIGhhbmRsZXJOYW1lKTsKLSAgICAgICAgICAgIHRoaXMuc2hvdWxkRmFpbCA9IGZhaWw7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzaG91bGRQYXVzZShib29sZWFuIHBhdXNlKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlNldHRpbmcgc2hvdWxkUGF1c2UgdG8gIiArIHBhdXNlICsgIiBmb3IgIiArIGhhbmRsZXJOYW1lKTsKLSAgICAgICAgICAgIHRoaXMuc2hvdWxkUGF1c2UgPSBwYXVzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBJbnZvY2F0aW9uUmVzcG9uc2UgaW52b2tlKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICAgICAgU3RyaW5nIHRpdGxlID0gIlRlc3RIYW5kbGVyWyIgKyBoYW5kbGVyTmFtZSArICJdICI7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4odGl0bGUgKyAiIGludm9rZWQ6Iik7Ci0KLSAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoZSBoYW5kbGVyIHNob3VsZCBmYWlsCi0gICAgICAgICAgICBpZiAoc2hvdWxkRmFpbCkgewotICAgICAgICAgICAgICAgIFN0cmluZyBmYWlsbXNnID0gdGl0bGUgKyAiIGthYm9vbSI7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHRpdGxlICsgIiBhZGRpbmcgWyIgKyBmYWlsbXNnICsgIl0gdG8gdGVzdFJlc3VsdHMgbGlzdCIpOwotICAgICAgICAgICAgICAgIHRlc3RSZXN1bHRzLmFkZChmYWlsbXNnKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZmFpbG1zZyk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdChmYWlsbXNnICsgIiAgIEhhbmRsZXIgZmFpbGVkIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGFkZCB0aGlzIGhhbmRsZXIgdG8gdGhlIGxpc3Qgb2YgaW52b2tlZCBoYW5kbGVycwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHRpdGxlICsgIiBhZGRpbmcgdGhpcyBoYW5kbGVyIHRvIHRlc3RSZXN1bHRzIGxpc3QiKTsKLSAgICAgICAgICAgIHRlc3RSZXN1bHRzLmFkZChoYW5kbGVyTmFtZSk7Ci0KLSAgICAgICAgICAgIGJvb2xlYW4gaXNQYXVzZWQgPSBtc2dDb250ZXh0LmlzUGF1c2VkKCk7Ci0gICAgICAgICAgICBpZiAoaXNQYXVzZWQpIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4odGl0bGUgKyAiICAgbWVzc2FnZSBjb250ZXh0IGlzIHBhdXNlZCAgICoqKioqIik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbih0aXRsZSArICIgICBtZXNzYWdlIGNvbnRleHQgaXMgbm90IHBhdXNlZCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjaGVja0xpc3RzKG1zZ0NvbnRleHQpOwotCi0gICAgICAgICAgICAvLyBjaGVjayBpZiB0aGUgaGFuZGxlciBzaG91bGQgcGF1c2UKLSAgICAgICAgICAgIGlmIChzaG91bGRQYXVzZSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBwYXVzZW1zZyA9IHRpdGxlICsgIiAtIHBhdXNpbmcgdGhlIG1lc3NhZ2UgY29udGV4dCI7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHBhdXNlbXNnKTsKLSAgICAgICAgICAgICAgICBtc2dDb250ZXh0LnBhdXNlKCk7Ci0gICAgICAgICAgICAgICAgc2hvdWxkUGF1c2UgPSBmYWxzZTsKLQotICAgICAgICAgICAgICAgIEZpbGUgdGhlRmlsZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHRoZUZpbGVuYW1lID0gbnVsbDsKLQotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHRoZUZpbGUgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJwSGV4ZWMiLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgdGhlRmlsZW5hbWUgPSB0aGVGaWxlLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHRpdGxlICsgInRlbXAgZmlsZSA9IFsiICsgdGhlRmlsZW5hbWUgKyAiXSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSArICJlcnJvciBjcmVhdGluZyB0ZW1wIGZpbGUgPSBbIiArIGV4LmdldE1lc3NhZ2UoKSArICJdIik7Ci0gICAgICAgICAgICAgICAgICAgIHRoZUZpbGUgPSBudWxsOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmICh0aGVGaWxlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gc2F2ZSB0byB0aGUgdGVtcG9yYXJ5IGZpbGUKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldHVwIGFuIG91dHB1dCBzdHJlYW0gdG8gYSBwaHlzaWNhbCBmaWxlCi0gICAgICAgICAgICAgICAgICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIG91dFN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRoZUZpbGUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBhdHRhY2ggYSBzdHJlYW0gY2FwYWJsZSBvZiB3cml0aW5nIG9iamVjdHMgdG8gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdHJlYW0gY29ubmVjdGVkIHRvIHRoZSBmaWxlCi0gICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RPdXRwdXRTdHJlYW0gb3V0T2JqU3RyZWFtID0gbmV3IE9iamVjdE91dHB1dFN0cmVhbShvdXRTdHJlYW0pOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyB0cnkgdG8gc2F2ZSB0aGUgbWVzc2FnZSBjb250ZXh0Ci0gICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4odGl0bGUgKyAic2F2aW5nIG1lc3NhZ2UgY29udGV4dC4uLi4uIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXRPYmpTdHJlYW0ud3JpdGVPYmplY3QobXNnQ29udGV4dCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNsb3NlIG91dCB0aGUgc3RyZWFtcwotICAgICAgICAgICAgICAgICAgICAgICAgb3V0T2JqU3RyZWFtLmZsdXNoKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXRPYmpTdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dFN0cmVhbS5mbHVzaCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgb3V0U3RyZWFtLmNsb3NlKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbih0aXRsZSArICIuLi4uc2F2ZWQgbWVzc2FnZSBjb250ZXh0Li4uLi4iKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBmaWxlc2l6ZSA9IHRoZUZpbGUubGVuZ3RoKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4odGl0bGUgKyAiZmlsZSBzaXplIGFmdGVyIHNhdmUgWyIgKyBmaWxlc2l6ZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJdICAgdGVtcCBmaWxlID0gWyIgKyB0aGVGaWxlbmFtZSArICJdIik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBXb3JrZXIodGhlRmlsZSwgbXNnQ29udGV4dC5nZXRDb25maWd1cmF0aW9uQ29udGV4dCgpKS5zdGFydCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgZmFpbCgiQW4gZXJyb3Igb2NjdXJyZWQgd2hlbiBzZXJpYWxpemluZyB0aGUgTWVzc2FnZUNvbnRleHQiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGNvdWxkbid0IGdldCBhIHRlbXBvcmFyeSBmaWxlCi0gICAgICAgICAgICAgICAgICAgIG5ldyBXb3JrZXIobXNnQ29udGV4dCwgbXNnQ29udGV4dC5nZXRDb25maWd1cmF0aW9uQ29udGV4dCgpKS5zdGFydCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gSW52b2NhdGlvblJlc3BvbnNlLlNVU1BFTkQ7Ci0gICAgICAgICAgICB9IC8vIGVuZCBpZiBzaG91bGQgcGF1c2UKLQotICAgICAgICAgICAgcmV0dXJuIEludm9jYXRpb25SZXNwb25zZS5DT05USU5VRTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGZsb3dDb21wbGV0ZShNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB7Ci0gICAgICAgICAgICBTdHJpbmcgdGl0bGUgPSAiVGVzdEhhbmRsZXJbIiArIGhhbmRsZXJOYW1lICsgIl0gIjsKLSAgICAgICAgICAgIFN0cmluZyBsYWJlbCA9ICJGQyIgKyBoYW5kbGVyTmFtZTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQKLSAgICAgICAgICAgICAgICAgICAgLnByaW50bG4odGl0bGUgKyAiIGZsb3dDb21wbGV0ZSgpOiBhZGRpbmcgWyIgKyBsYWJlbCArICJdIHRvIHRlc3RSZXN1bHRzIGxpc3QiKTsKLSAgICAgICAgICAgIHRlc3RSZXN1bHRzLmFkZCgiRkMiICsgaGFuZGxlck5hbWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGNoZWNrTGlzdHMoTWVzc2FnZUNvbnRleHQgbWMpIHsKLSAgICAgICAgICAgIGlmIChtYyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTdHJpbmcgdGl0bGUgPSAiVGVzdEhhbmRsZXJbIiArIGhhbmRsZXJOYW1lICsgIl0gIjsKLQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHRpdGxlICsgIkNoZWNraW5nIGV4ZWN1dGlvbiBjaGFpbi4uLi4uIik7Ci0gICAgICAgICAgICBBcnJheUxpc3QgZXhlY0xpc3QgPSBtYy5nZXRFeGVjdXRpb25DaGFpbigpOwotICAgICAgICAgICAgSXRlcmF0b3IgZXhlY0l0ID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChleGVjTGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZXhlY0l0ID0gZXhlY0xpc3QuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNoZWNrSGFuZGxlcihleGVjSXQpOwotCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4odGl0bGUgKyAiQ2hlY2tpbmcgaW5ib3VuZCBleGVjdXRlZCBwaGFzZXMgbGlzdC4uLi4uIik7Ci0gICAgICAgICAgICBJdGVyYXRvciBpbmJvdW5kSXQgPSBtYy5nZXRFeGVjdXRlZFBoYXNlcygpOwotICAgICAgICAgICAgY2hlY2tIYW5kbGVyKGluYm91bmRJdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgY2hlY2tIYW5kbGVyKEl0ZXJhdG9yIGl0KSB7Ci0gICAgICAgICAgICBpZiAoaXQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIEhhbmRsZXIgaGFuZGxlciA9IChIYW5kbGVyKWl0Lm5leHQoKTsKLQotICAgICAgICAgICAgICAgIGlmIChoYW5kbGVyIGluc3RhbmNlb2YgSGFuZGxlcikgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkhhbmRsZXIgbmFtZSBbIiArIGhhbmRsZXIuZ2V0TmFtZSgpICsgIl0iKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGhhbmRsZXIgaW5zdGFuY2VvZiBQaGFzZSkgewotICAgICAgICAgICAgICAgICAgICBQaGFzZSBwaGFzZSA9IChQaGFzZSloYW5kbGVyOwotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlBoYXNlIG5hbWUgWyIgKyBwaGFzZS5nZXROYW1lKCkgKyAiXSIpOwotCi0gICAgICAgICAgICAgICAgICAgIExpc3QgbGlzdDIgPSBwaGFzZS5nZXRIYW5kbGVycygpOwotICAgICAgICAgICAgICAgICAgICBJdGVyYXRvciBpdDIgPSBsaXN0Mi5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgICAgICBjaGVja0hhbmRsZXIoaXQyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIFdvcmtlciBleHRlbmRzIFRocmVhZCB7Ci0gICAgICAgIHByaXZhdGUgYnl0ZVtdIHNlcmlhbGl6ZWRNZXNzYWdlQ29udGV4dCA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlndXJhdGlvbkNvbnRleHQgPSBudWxsOwotICAgICAgICBwcml2YXRlIEZpbGUgdGhlRmlsZSA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIHRoZUZpbGVuYW1lID0gbnVsbDsKLSAgICAgICAgcHJpdmF0ZSBNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0ID0gbnVsbDsKLQotICAgICAgICBwdWJsaWMgV29ya2VyKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHsKLSAgICAgICAgICAgIHRoaXMubXNnQ29udGV4dCA9IG1zZ0NvbnRleHQ7Ci0gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb25Db250ZXh0ID0gbXNnQ29udGV4dC5nZXRDb25maWd1cmF0aW9uQ29udGV4dCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFdvcmtlcihieXRlW10gc2VyaWFsaXplZE1lc3NhZ2VDb250ZXh0LCBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWd1cmF0aW9uQ29udGV4dCkgewotICAgICAgICAgICAgdGhpcy5zZXJpYWxpemVkTWVzc2FnZUNvbnRleHQgPSBzZXJpYWxpemVkTWVzc2FnZUNvbnRleHQ7Ci0gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb25Db250ZXh0ID0gY29uZmlndXJhdGlvbkNvbnRleHQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgV29ya2VyKEZpbGUgdGhlRmlsZSwgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlndXJhdGlvbkNvbnRleHQpIHsKLSAgICAgICAgICAgIHRoaXMudGhlRmlsZSA9IHRoZUZpbGU7Ci0gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb25Db250ZXh0ID0gY29uZmlndXJhdGlvbkNvbnRleHQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgV29ya2VyKE1lc3NhZ2VDb250ZXh0IG1jLCBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWd1cmF0aW9uQ29udGV4dCkgewotICAgICAgICAgICAgdGhpcy5tc2dDb250ZXh0ID0gbWM7Ci0gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb25Db250ZXh0ID0gY29uZmlndXJhdGlvbkNvbnRleHQ7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJXb3JrZXIgdGhyZWFkIHN0YXJ0ZWQiKTsKLSAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoNTAwMCk7Ci0KLSAgICAgICAgICAgICAgICBGaWxlSW5wdXRTdHJlYW0gaW5TdHJlYW0gPSBudWxsOwotICAgICAgICAgICAgICAgIE9iamVjdElucHV0U3RyZWFtIG9iamVjdElucHV0U3RyZWFtID0gbnVsbDsKLSAgICAgICAgICAgICAgICBNZXNzYWdlQ29udGV4dCByZWNvbnN0aXR1dGVkTWVzc2FnZUNvbnRleHQgPSBudWxsOwotCi0gICAgICAgICAgICAgICAgaWYgKHRoZUZpbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAvLyBzZXR1cCBhbiBpbnB1dCBzdHJlYW0gdG8gdGhlIGZpbGUKLSAgICAgICAgICAgICAgICAgICAgaW5TdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKHRoZUZpbGUpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIGF0dGFjaCBhIHN0cmVhbSBjYXBhYmxlIG9mIHJlYWRpbmcgb2JqZWN0cyBmcm9tIHRoZQotICAgICAgICAgICAgICAgICAgICAvLyBzdHJlYW0gY29ubmVjdGVkIHRvIHRoZSBmaWxlCi0gICAgICAgICAgICAgICAgICAgIG9iamVjdElucHV0U3RyZWFtID0gbmV3IE9iamVjdElucHV0U3RyZWFtKGluU3RyZWFtKTsKLQotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIldvcmtlciB0aHJlYWQgcmVzdG9yaW5nIG1lc3NhZ2UgY29udGV4dCBmcm9tIGZpbGUiKTsKLSAgICAgICAgICAgICAgICAgICAgcmVjb25zdGl0dXRlZE1lc3NhZ2VDb250ZXh0ID0gKE1lc3NhZ2VDb250ZXh0KW9iamVjdElucHV0U3RyZWFtLnJlYWRPYmplY3QoKTsKLSAgICAgICAgICAgICAgICAgICAgcmVjb25zdGl0dXRlZE1lc3NhZ2VDb250ZXh0LmFjdGl2YXRlKGNvbmZpZ3VyYXRpb25Db250ZXh0KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNlcmlhbGl6ZWRNZXNzYWdlQ29udGV4dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHVzZSB0aGUgYnl0ZSBhcnJheQotICAgICAgICAgICAgICAgICAgICBvYmplY3RJbnB1dFN0cmVhbSA9IG5ldyBPYmplY3RJbnB1dFN0cmVhbSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oc2VyaWFsaXplZE1lc3NhZ2VDb250ZXh0KSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJXb3JrZXIgdGhyZWFkIHJlc3RvcmluZyBtZXNzYWdlIGNvbnRleHQgZnJvbSBieXRlIGFycmF5Iik7Ci0gICAgICAgICAgICAgICAgICAgIHJlY29uc3RpdHV0ZWRNZXNzYWdlQ29udGV4dCA9IChNZXNzYWdlQ29udGV4dClvYmplY3RJbnB1dFN0cmVhbS5yZWFkT2JqZWN0KCk7Ci0gICAgICAgICAgICAgICAgICAgIHJlY29uc3RpdHV0ZWRNZXNzYWdlQ29udGV4dC5hY3RpdmF0ZShjb25maWd1cmF0aW9uQ29udGV4dCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtc2dDb250ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJXb3JrZXIgdGhyZWFkIHVzaW5nIG1lc3NhZ2UgY29udGV4dCIpOwotICAgICAgICAgICAgICAgICAgICByZWNvbnN0aXR1dGVkTWVzc2FnZUNvbnRleHQgPSBtc2dDb250ZXh0OwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChpblN0cmVhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGluU3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG9iamVjdElucHV0U3RyZWFtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgb2JqZWN0SW5wdXRTdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAodGhlRmlsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSB0aGUgdGVtcG9yYXJ5IGZpbGUKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoZUZpbGUuZGVsZXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBqdXN0IGFic29yYiBpdAotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHJlY29uc3RpdHV0ZWRNZXNzYWdlQ29udGV4dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiV29ya2VyIHRocmVhZCByZXN1bWluZyBtZXNzYWdlIGNvbnRleHQiKTsKLSAgICAgICAgICAgICAgICAgICAgQXhpc0VuZ2luZS5yZXN1bWUocmVjb25zdGl0dXRlZE1lc3NhZ2VDb250ZXh0KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBmYWlsKCJBbiBlcnJvciBvY2N1cnJlZCBpbiB0aGUgd29ya2VyIHRocmVhZCAtIG5vIG1lc3NhZ2UgY29udGV4dCIpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgICAgICBmYWlsKCJBbiBlcnJvciBvY2N1cnJlZCBpbiB0aGUgd29ya2VyIHRocmVhZCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9TT0FQdmVyc2lvblRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvU09BUHZlcnNpb25UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0ODczOGEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9TT0FQdmVyc2lvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5lbmdpbmU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUDExQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQMTJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5TZXJ2aWNlQ2xpZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaW50ZWdyYXRpb24uTG9jYWxUZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmludGVncmF0aW9uLlRlc3RpbmdVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuV1NETENvbnN0YW50czsKLQotcHVibGljIGNsYXNzIFNPQVB2ZXJzaW9uVGVzdCBleHRlbmRzIExvY2FsVGVzdENhc2UgewotCQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgCXN1cGVyLnNldFVwKCk7Ci0gICAgCWRlcGxveUNsYXNzQXNTZXJ2aWNlKEVjaG8uU0VSVklDRV9OQU1FLCBFY2hvLmNsYXNzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U09BUDExKCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIFNlcnZpY2VDbGllbnQgc2VydmljZUNsaWVudCA9IGdldENsaWVudChFY2hvLlNFUlZJQ0VfTkFNRSwgRWNoby5FQ0hPX09NX0VMRU1FTlRfT1BfTkFNRSk7Ci0gICAgICAgIHNlcnZpY2VDbGllbnQuZ2V0T3B0aW9ucygpLnNldFNvYXBWZXJzaW9uVVJJKAotICAgICAgICAgICAgICAgIFNPQVAxMUNvbnN0YW50cy5TT0FQX0VOVkVMT1BFX05BTUVTUEFDRV9VUkkpOwotICAgICAgICBzZXJ2aWNlQ2xpZW50LnNldENhY2hpbmdPcGVyYXRpb25Db250ZXh0KHRydWUpOwotICAgICAgICBzZXJ2aWNlQ2xpZW50LnNlbmRSZWNlaXZlKFRlc3RpbmdVdGlscy5jcmVhdGVEdW1teU9NRWxlbWVudCgpKTsKLSAgICAgICAgU09BUEVudmVsb3BlIHJlc3VsdCA9IHNlcnZpY2VDbGllbnQuZ2V0TGFzdE9wZXJhdGlvbkNvbnRleHQoKS5nZXRNZXNzYWdlQ29udGV4dChXU0RMQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfSU5fVkFMVUUpLmdldEVudmVsb3BlKCk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJTT0FQIFZlcnNpb24gcmVjZWl2ZWQgaXMgbm90IGNvbXBhdGlibGUiLAotICAgICAgICAgICAgICAgICAgICAgU09BUDExQ29uc3RhbnRzLlNPQVBfRU5WRUxPUEVfTkFNRVNQQUNFX1VSSSwKLSAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5nZXROYW1lc3BhY2UoKS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNPQVAxMigpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBTZXJ2aWNlQ2xpZW50IHNlcnZpY2VDbGllbnQgPSBnZXRDbGllbnQoRWNoby5TRVJWSUNFX05BTUUsIEVjaG8uRUNIT19PTV9FTEVNRU5UX09QX05BTUUpOwotICAgICAgICBzZXJ2aWNlQ2xpZW50LmdldE9wdGlvbnMoKS5zZXRTb2FwVmVyc2lvblVSSSgKLSAgICAgICAgCQlTT0FQMTJDb25zdGFudHMuU09BUF9FTlZFTE9QRV9OQU1FU1BBQ0VfVVJJKTsKLSAgICAgICAgc2VydmljZUNsaWVudC5zZXRDYWNoaW5nT3BlcmF0aW9uQ29udGV4dCh0cnVlKTsKLSAgICAgICAgc2VydmljZUNsaWVudC5zZW5kUmVjZWl2ZShUZXN0aW5nVXRpbHMuY3JlYXRlRHVtbXlPTUVsZW1lbnQoKSk7Ci0gICAgICAgIFNPQVBFbnZlbG9wZSByZXN1bHQgPSBzZXJ2aWNlQ2xpZW50LmdldExhc3RPcGVyYXRpb25Db250ZXh0KCkuZ2V0TWVzc2FnZUNvbnRleHQoV1NETENvbnN0YW50cy5NRVNTQUdFX0xBQkVMX0lOX1ZBTFVFKS5nZXRFbnZlbG9wZSgpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJTT0FQIFZlcnNpb24gcmVjZWl2ZWQgaXMgbm90IGNvbXBhdGlibGUiLAotICAgICAgICAgICAgICAgICAgICAgU09BUDEyQ29uc3RhbnRzLlNPQVBfRU5WRUxPUEVfTkFNRVNQQUNFX1VSSSwKLSAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5nZXROYW1lc3BhY2UoKS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9TZXJ2aWNlQ3JlYXRlVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9TZXJ2aWNlQ3JlYXRlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmQ2M2RjLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvU2VydmljZUNyZWF0ZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5lbmdpbmU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5PcHRpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc01lc3NhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pbnRlZ3JhdGlvbi5VdGlsU2VydmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaW50ZWdyYXRpb24uVXRpbFNlcnZlckJhc2VkVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ycGMuY2xpZW50LlJQQ1NlcnZpY2VDbGllbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLldTRExDb25zdGFudHM7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlQ3JlYXRlVGVzdCBleHRlbmRzIFV0aWxTZXJ2ZXJCYXNlZFRlc3RDYXNlIHsKLQotICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQ7Ci0gICAgQ29uZmlndXJhdGlvbkNvbnRleHQgY2xpbmV0Q29uZmlndXJhdGlvbmN0eDsKLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgcmV0dXJuIGdldFRlc3RTZXR1cChuZXcgVGVzdFN1aXRlKFNlcnZpY2VDcmVhdGVUZXN0LmNsYXNzKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgY29uZmlnQ29udGV4dCA9IFV0aWxTZXJ2ZXIuZ2V0Q29uZmlndXJhdGlvbkNvbnRleHQoKTsKLSAgICAgICAgY2xpbmV0Q29uZmlndXJhdGlvbmN0eCA9IENvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeS4KLSAgICAgICAgICAgICAgICBjcmVhdGVDb25maWd1cmF0aW9uQ29udGV4dEZyb21GaWxlU3lzdGVtKG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJ2aWNlQ3JlYXRlKCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIEF4aXNDb25maWd1cmF0aW9uIGF4aXNDb25maWcgPSBjb25maWdDb250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2UgPQotICAgICAgICAgICAgICAgIEF4aXNTZXJ2aWNlLmNyZWF0ZVNlcnZpY2UoIm9yZy5hcGFjaGUuYXhpczIuZW5naW5lLk15U2VydmljZSIsIGF4aXNDb25maWcpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2UpOwotICAgICAgICBheGlzQ29uZmlnLmFkZFNlcnZpY2Uoc2VydmljZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiTXlTZXJ2aWNlIiwgc2VydmljZS5nZXROYW1lKCkpOwotICAgICAgICBBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb24gPSBzZXJ2aWNlLmdldE9wZXJhdGlvbihuZXcgUU5hbWUoImFkZCIpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChheGlzT3BlcmF0aW9uKTsKLSAgICAgICAgQXhpc01lc3NhZ2UgbWVzc2dlID0gYXhpc09wZXJhdGlvbi5nZXRNZXNzYWdlKFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9JTl9WQUxVRSk7Ci0gICAgICAgIC8vIG1lc3NnZS5nZXRTY2hlbWFFbGVtZW50KCkudG9TdHJpbmcoKQotICAgICAgICBhc3NlcnROb3ROdWxsKG1lc3NnZSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwobWVzc2dlLmdldFNjaGVtYUVsZW1lbnQoKSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZS5nZXRPcGVyYXRpb24obmV3IFFOYW1lKCJwdXRWYWx1ZSIpKSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoYXhpc0NvbmZpZy5nZXRTZXJ2aWNlKCJNeVNlcnZpY2UiKSk7Ci0KLSAgICAgICAgUlBDU2VydmljZUNsaWVudCBjbGllbnQgPSBuZXcgUlBDU2VydmljZUNsaWVudChjbGluZXRDb25maWd1cmF0aW9uY3R4LCBudWxsKTsKLQotICAgICAgICBFbmRwb2ludFJlZmVyZW5jZSB0YXJnZXRFUFIgPSBuZXcgRW5kcG9pbnRSZWZlcmVuY2UoCi0gICAgICAgICAgICAgICAgImh0dHA6Ly8xMjcuMC4wLjE6IiArIChVdGlsU2VydmVyLlRFU1RJTkdfUE9SVCkKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIi9heGlzMi9zZXJ2aWNlcy9NeVNlcnZpY2UvYWRkIik7Ci0gICAgICAgIE9wdGlvbnMgb3B0aW9ucyA9IG5ldyBPcHRpb25zKCk7Ci0KLSAgICAgICAgb3B0aW9ucy5zZXRUbyh0YXJnZXRFUFIpOwotICAgICAgICBvcHRpb25zLnNldFRyYW5zcG9ydEluUHJvdG9jb2woQ29uc3RhbnRzLlRSQU5TUE9SVF9IVFRQKTsKLSAgICAgICAgY2xpZW50LnNldE9wdGlvbnMob3B0aW9ucyk7Ci0gICAgICAgIEFycmF5TGlzdCBhcmdzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBhcmdzLmFkZCgiMTAwIik7Ci0gICAgICAgIGFyZ3MuYWRkKCIyMDAiKTsKLQotICAgICAgICBPTUVsZW1lbnQgcmVzcG9uc2UgPSBjbGllbnQuaW52b2tlQmxvY2tpbmcoCi0gICAgICAgICAgICAgICAgbmV3IFFOYW1lKCJodHRwOi8vZW5naW5lLmF4aXMyLmFwYWNoZS5vcmciLCAiYWRkIiwgIm5zMSIpLCBhcmdzLnRvQXJyYXkoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhJbnRlZ2VyLnBhcnNlSW50KHJlc3BvbnNlLmdldEZpcnN0RWxlbWVudCgpLmdldFRleHQoKSksIDMwMCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9TZXJ2aWNlRGlzcGF0Y2hpbmdUZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL1NlcnZpY2VEaXNwYXRjaGluZ1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ2NDk5Mi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL1NlcnZpY2VEaXNwYXRjaGluZ1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5lbmdpbmU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5TZXJ2aWNlQ2xpZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklCYXNlZE9wZXJhdGlvbkRpc3BhdGNoZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pbnRlZ3JhdGlvbi5Mb2NhbFRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaW50ZWdyYXRpb24uVGVzdGluZ1V0aWxzOwotCi1wdWJsaWMgY2xhc3MgU2VydmljZURpc3BhdGNoaW5nVGVzdCBleHRlbmRzIExvY2FsVGVzdENhc2UgewotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAJc3VwZXIuc2V0VXAoKTsKLSAgICAJZGVwbG95Q2xhc3NBc1NlcnZpY2UoRWNoby5TRVJWSUNFX05BTUUsIEVjaG8uY2xhc3MpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3REaXNwYXRjaFdpdGhVUkxPbmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgCURpc3BhdGNoUGhhc2UgZHAgPSBuZXcgRGlzcGF0Y2hQaGFzZSgpOwotICAgIAlkcC5hZGRIYW5kbGVyKG5ldyBSZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyKCkpOwotICAgIAlkcC5hZGRIYW5kbGVyKG5ldyBSZXF1ZXN0VVJJQmFzZWRPcGVyYXRpb25EaXNwYXRjaGVyKCkpOwotICAgIAlzZXJ2ZXJDb25maWcuZ2V0SW5GbG93UGhhc2VzKCkuc2V0KDEsIGRwKTsKLSAgICAJCi0gICAgICAgIFNlcnZpY2VDbGllbnQgc2VuZGVyID0gZ2V0Q2xpZW50KEVjaG8uU0VSVklDRV9OQU1FLCBFY2hvLkVDSE9fT01fRUxFTUVOVF9PUF9OQU1FKTsKLSAgICAgICAgU3RyaW5nIG9sZEFkZHJlc3MgPSBzZW5kZXIuZ2V0T3B0aW9ucygpLmdldFRvKCkuZ2V0QWRkcmVzcygpOwotICAgICAgICBTdHJpbmcgbmV3QWRkcmVzcyA9IG9sZEFkZHJlc3MrIi8iK0VjaG8uRUNIT19PTV9FTEVNRU5UX09QX05BTUU7Ci0gICAgICAgIHNlbmRlci5nZXRPcHRpb25zKCkuZ2V0VG8oKS5zZXRBZGRyZXNzKG5ld0FkZHJlc3MpOwotICAgICAgICBzZW5kZXIuZ2V0T3B0aW9ucygpLnNldEFjdGlvbihudWxsKTsKLQotICAgICAgICBPTUVsZW1lbnQgcmVzdWx0ID0gc2VuZGVyLnNlbmRSZWNlaXZlKFRlc3RpbmdVdGlscy5jcmVhdGVEdW1teU9NRWxlbWVudCgpKTsKLQotICAgICAgICBUZXN0aW5nVXRpbHMuY29tcGFyZVdpdGhDcmVhdGVkT01FbGVtZW50KHJlc3VsdCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdERpc3BhdGNoV2l0aFVSTEFuZFNPQVBBY3Rpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU2VydmljZUNsaWVudCBzZW5kZXIgPSBnZXRDbGllbnQoRWNoby5TRVJWSUNFX05BTUUsIEVjaG8uRUNIT19PTV9FTEVNRU5UX09QX05BTUUpOwotICAgICAgICBPTUVsZW1lbnQgcmVzdWx0ID0gc2VuZGVyLnNlbmRSZWNlaXZlKFRlc3RpbmdVdGlscy5jcmVhdGVEdW1teU9NRWxlbWVudCgpKTsKLSAgICAgICAgVGVzdGluZ1V0aWxzLmNvbXBhcmVXaXRoQ3JlYXRlZE9NRWxlbWVudChyZXN1bHQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3REaXNwYXRjaFdpdGhTT0FQQm9keSgpIHRocm93cyBFeGNlcHRpb24gewotICAgIAlEaXNwYXRjaFBoYXNlIGRwID0gbmV3IERpc3BhdGNoUGhhc2UoKTsKLSAgICAJZHAuYWRkSGFuZGxlcihuZXcgU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyKCkpOwotICAgIAlzZXJ2ZXJDb25maWcuZ2V0SW5GbG93UGhhc2VzKCkuc2V0KDEsIGRwKTsKLSAgICAJCi0gICAgCVNlcnZpY2VDbGllbnQgc2VuZGVyID0gZ2V0Q2xpZW50KEVjaG8uU0VSVklDRV9OQU1FLCBFY2hvLkVDSE9fT01fRUxFTUVOVF9PUF9OQU1FKTsKLSAgICAJT01FbGVtZW50IHBheWxvYWQgPSBUZXN0aW5nVXRpbHMuY3JlYXRlRHVtbXlPTUVsZW1lbnQoc2VuZGVyLmdldE9wdGlvbnMoKS5nZXRUbygpLmdldEFkZHJlc3MoKSk7Ci0gICAgICAgIE9NRWxlbWVudCByZXN1bHQgPSBzZW5kZXIuc2VuZFJlY2VpdmUocGF5bG9hZCk7Ci0gICAgICAgIFRlc3RpbmdVdGlscy5jb21wYXJlV2l0aENyZWF0ZWRPTUVsZW1lbnQocmVzdWx0KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL1NlcnZpY2VGYXVsdFRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvU2VydmljZUZhdWx0VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDVkZWNmLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvU2VydmljZUZhdWx0VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5lbmdpbmU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVAxMkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuT3B0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5TZXJ2aWNlQ2xpZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUudXRpbC5GYXVsdFRocm93aW5nU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS51dGlsLlRlc3RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pbnRlZ3JhdGlvbi5VdGlsU2VydmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaW50ZWdyYXRpb24uVXRpbFNlcnZlckJhc2VkVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLlV0aWxzOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotLyoqIFRoaXMgdGVzdCB3aWxsIG1ha2Ugc3VyZSwgZmF1bHRzIHRocm93biBieSBzZXJ2aWNlcyBhcmUgaGFuZGxlZCBwcm9wZXJseS4gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlRmF1bHRUZXN0IGV4dGVuZHMgVXRpbFNlcnZlckJhc2VkVGVzdENhc2UgaW1wbGVtZW50cyBUZXN0Q29uc3RhbnRzIHsKLQotICAgIHByb3RlY3RlZCBTdHJpbmcgdGVzdFJlc291cmNlRGlyID0gInRlc3QtcmVzb3VyY2VzIjsKLSAgICBwcml2YXRlIEF4aXNTZXJ2aWNlIHNlcnZpY2U7Ci0KLSAgICBwcml2YXRlIFFOYW1lIHNlcnZpY2VOYW1lID0gbmV3IFFOYW1lKCJGYXVsdFRocm93aW5nU2VydmljZSIpOwotICAgIHByaXZhdGUgUU5hbWUgb3BlcmF0aW9uTmFtZSA9IG5ldyBRTmFtZSgiZWNob1dpdGhGYXVsdCIpOwotCi0gICAgcHJpdmF0ZSBFbmRwb2ludFJlZmVyZW5jZSB0YXJnZXRFUFI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIHJldHVybiBnZXRUZXN0U2V0dXAobmV3IFRlc3RTdWl0ZShTZXJ2aWNlRmF1bHRUZXN0LmNsYXNzKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc2VydmljZSA9Ci0gICAgICAgICAgICAgICAgVXRpbHMuY3JlYXRlU2ltcGxlU2VydmljZShzZXJ2aWNlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZhdWx0VGhyb3dpbmdTZXJ2aWNlLmNsYXNzLmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbk5hbWUpOwotICAgICAgICBVdGlsU2VydmVyLmRlcGxveVNlcnZpY2Uoc2VydmljZSk7Ci0gICAgICAgIHRhcmdldEVQUiA9IG5ldyBFbmRwb2ludFJlZmVyZW5jZSgKLSAgICAgICAgICAgICAgICAiaHR0cDovLzEyNy4wLjAuMToiICsgKFV0aWxTZXJ2ZXIuVEVTVElOR19QT1JUKQotLy8gICAgICAgICAgICAgICAgImh0dHA6Ly8xMjcuMC4wLjE6NTU1NiIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIi9heGlzMi9zZXJ2aWNlcy8iICsgc2VydmljZU5hbWUuZ2V0TG9jYWxQYXJ0KCkgKyAiLyIgKwotICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgVXRpbFNlcnZlci51bkRlcGxveVNlcnZpY2Uoc2VydmljZU5hbWUpOwotICAgICAgICBVdGlsU2VydmVyLnVuRGVwbG95Q2xpZW50U2VydmljZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlcnZpY2UgdGhyb3dzIGEgZmF1bHQgZnJvbSB0aGUgc2VydmljZSBpbXBsLCBieSBqdXN0IGNyZWF0aW5nIGFuIEF4aXNGYXVsdCBmcm9tIGFsbCB0aGUKLSAgICAgKiBmYXVsdCBpbmZvcm1hdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmF1bHRUaHJvd25CeVNlcnZpY2VVc2luZ0F4aXNGYXVsdE9ubHkoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgcGF5bG9hZCA9Ci0gICAgICAgICAgICAgICAgICAgIGdldE9NRWxlbWVudFdpdGhUZXh0KEZhdWx0VGhyb3dpbmdTZXJ2aWNlLlRIUk9XX0ZBVUxUX0FTX0FYSVNfRkFVTFQpOwotICAgICAgICAgICAgT3B0aW9ucyBvcHRpb25zID0gbmV3IE9wdGlvbnMoKTsKLSAgICAgICAgICAgIG9wdGlvbnMuc2V0VG8odGFyZ2V0RVBSKTsKLSAgICAgICAgICAgIG9wdGlvbnMuc2V0U29hcFZlcnNpb25VUkkoU09BUDEyQ29uc3RhbnRzLlNPQVBfRU5WRUxPUEVfTkFNRVNQQUNFX1VSSSk7Ci0gICAgICAgICAgICBvcHRpb25zLnNldFRyYW5zcG9ydEluUHJvdG9jb2woQ29uc3RhbnRzLlRSQU5TUE9SVF9IVFRQKTsKLSAgICAgICAgICAgIG9wdGlvbnMuc2V0RXhjZXB0aW9uVG9CZVRocm93bk9uU09BUEZhdWx0KGZhbHNlKTsKLQotICAgICAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ29udGV4dCA9Ci0gICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jcmVhdGVDb25maWd1cmF0aW9uQ29udGV4dEZyb21GaWxlU3lzdGVtKG51bGwsIG51bGwpOwotICAgICAgICAgICAgU2VydmljZUNsaWVudCBzZW5kZXIgPSBuZXcgU2VydmljZUNsaWVudChjb25maWdDb250ZXh0LCBudWxsKTsKLSAgICAgICAgICAgIHNlbmRlci5zZXRPcHRpb25zKG9wdGlvbnMpOwotCi0gICAgICAgICAgICBTdHJpbmcgcmVzdWx0ID0gc2VuZGVyLnNlbmRSZWNlaXZlKHBheWxvYWQpLnRvU3RyaW5nKCk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUocmVzdWx0LmluZGV4T2YoInRlc3Q6VGVzdEZhdWx0IikgPiAtMSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdC5pbmRleE9mKCJGYXVsdFJlYXNvbjwvc29hcGVudjpUZXh0PiIpID4gLTEpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHQuaW5kZXhPZigiVGhpcyBpcyBhIHRlc3QgRXhjZXB0aW9uIikgPiAtMSk7Ci0gICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBheGlzRmF1bHQpIHsKLSAgICAgICAgICAgIGF4aXNGYXVsdC5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKiBTZXJ2aWNlIHNlbmRzIG91dCBhIGZhdWx0LCBmaWxsaW5nIGFsbCB0aGUgaW5mb3JtYXRpb24gdG8gdGhlIG1lc3NhZ2UgY29udGV4dCAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RGYXVsdFRocm93bkJ5U2VydmljZVVzaW5nTWVzc2FnZUNvbnRleHQoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgcGF5bG9hZCA9Ci0gICAgICAgICAgICAgICAgICAgIGdldE9NRWxlbWVudFdpdGhUZXh0KEZhdWx0VGhyb3dpbmdTZXJ2aWNlLlRIUk9XX0ZBVUxUX1dJVEhfTVNHX0NUWFQpOwotICAgICAgICAgICAgT3B0aW9ucyBvcHRpb25zID0gbmV3IE9wdGlvbnMoKTsKLSAgICAgICAgICAgIG9wdGlvbnMuc2V0VG8odGFyZ2V0RVBSKTsKLSAgICAgICAgICAgIG9wdGlvbnMuc2V0U29hcFZlcnNpb25VUkkoU09BUDEyQ29uc3RhbnRzLlNPQVBfRU5WRUxPUEVfTkFNRVNQQUNFX1VSSSk7Ci0gICAgICAgICAgICBvcHRpb25zLnNldFRyYW5zcG9ydEluUHJvdG9jb2woQ29uc3RhbnRzLlRSQU5TUE9SVF9IVFRQKTsKLSAgICAgICAgICAgIG9wdGlvbnMuc2V0RXhjZXB0aW9uVG9CZVRocm93bk9uU09BUEZhdWx0KGZhbHNlKTsKLQotICAgICAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ29udGV4dCA9Ci0gICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jcmVhdGVDb25maWd1cmF0aW9uQ29udGV4dEZyb21GaWxlU3lzdGVtKG51bGwsIG51bGwpOwotICAgICAgICAgICAgU2VydmljZUNsaWVudCBzZW5kZXIgPSBuZXcgU2VydmljZUNsaWVudChjb25maWdDb250ZXh0LCBudWxsKTsKLSAgICAgICAgICAgIHNlbmRlci5zZXRPcHRpb25zKG9wdGlvbnMpOwotCi0gICAgICAgICAgICBTdHJpbmcgcmVzdWx0ID0gc2VuZGVyLnNlbmRSZWNlaXZlKHBheWxvYWQpLnRvU3RyaW5nKCk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUocmVzdWx0LmluZGV4T2YoInRlc3Q6VGVzdEZhdWx0IikgPiAtMSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdC5pbmRleE9mKCJGYXVsdFJlYXNvbjwvc29hcGVudjpUZXh0PiIpID4gLTEpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHQuaW5kZXhPZigiVGhpcyBpcyBhIHRlc3QgRXhjZXB0aW9uIikgPiAtMSk7Ci0gICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBheGlzRmF1bHQpIHsKLSAgICAgICAgICAgIGF4aXNGYXVsdC5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgT01FbGVtZW50IGdldE9NRWxlbWVudFdpdGhUZXh0KFN0cmluZyB0ZXh0KSB7Ci0gICAgICAgIE9NRmFjdG9yeSBvbUZhY3RvcnkgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKTsKLSAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IG9tRmFjdG9yeS5jcmVhdGVPTUVsZW1lbnQoIkVjaG9PTUVsZW1lbnQiLCBudWxsKTsKLSAgICAgICAgb21FbGVtZW50LnNldFRleHQodGV4dCk7Ci0gICAgICAgIHJldHVybiBvbUVsZW1lbnQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9TZXJ2aWNlR3JvdXBDb250ZXh0VGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9TZXJ2aWNlR3JvdXBDb250ZXh0VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjFlODFlLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvU2VydmljZUdyb3VwQ29udGV4dFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5lbmdpbmU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5TZXJ2aWNlQ2xpZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUudXRpbC5SZXF1ZXN0Q291bnRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmludGVncmF0aW9uLkxvY2FsV2l0aEFkZHJlc3NpbmdUZXN0Q2FzZTsKLQotLyoqCi0gKiBUaGlzIHRlc3Qgd2lsbCBmaXJzdCBzZW5kcyBhIHJlcXVlc3QgdG8gYSBkdW1teSBzZXJ2aWNlIGRlcGxveWVkLiBUaGF0IHNlcnZpY2Ugd2lsbCBnZXQKLSAqIG1lc3NhZ2UgY29udGV4dHMgYXMgaW5wdXRzIGFuZCB3aWxsIHB1dCBhIHByb3BlcnR5IGluIHRoZSBzZXJ2aWNlIGdyb3VwIGNvbnRleHQgdG8gY291bnQgdGhlCi0gKiBudW1iZXIgb2YgcmVxdWVzdHMuIFRoZW4gdGhlIGNsaWVudCwgdXBvbiByZWNlaXZpbmcgdGhlIHJlc3BvbnNlLCBleHRyYWN0cyB0aGUgc2djIGlkIGZyb20KLSAqIHRoZSByZWNlaXZlZCBtZXNzYWdlICh0aGlzIHdpbGwgY29tZSBhcyBhIHJlZmVyZW5jZSBwYXJhbWV0ZXIgaW4gdGhlIFJlcGx5VG8gRVBSKSBhbmQgc2V0cwotICogdGhhdCBhcyBhIHRvcCBsZXZlbCBzb2FwIGhlYWRlciBpbiB0aGUgbmV4dCByZXF1ZXN0IHRvIHRoZSBzYW1lIHNlcnZpY2UgZ3JvdXAuIFNlcnZlciB3aWxsCi0gKiBjb3JyZWN0bHkgaWRlbnRpZnkgdGhlIHNlcnZpY2UgZ3JvdXAgZnJvbSB0aGUgaW5mb3JtYXRpb24gc2VudCBieSB0aGUgY2xpZW50IGFuZCByZXRyaWV2ZSB0aGUKLSAqIHNnYyBlYXJsaWVyIHVzZWQgYW5kIHdpbGwgdXNlIHRoYXQgZm9yIHRoZSBjdXJyZW50IHJlcXVlc3QgYXMgd2VsbC4gVGhlIHNlcnZpY2Ugd2lsbCByZXRyaWV2ZQotICogdGhlIHJlcXVlc3QgY291bnQgZnJvbSB0aGUgc2djIGFuZCBpbmNyZWFzZSB0aGF0IGJ5IG9uZS4KLSAqIDxwLz4KLSAqIFRlc3Qgd2lsbCBhc3NlcnRzIHdoZXRoZXIgdGhlIGNsaWVudCBnZXRzIHRoZSBudW1iZXIgb2YgcmVxdWVzdHMgYXMgMiwgd2hlbiBoZSBpbnZva2VzIHR3bwotICogdGltZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlR3JvdXBDb250ZXh0VGVzdCBleHRlbmRzIExvY2FsV2l0aEFkZHJlc3NpbmdUZXN0Q2FzZSB7Ci0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAJc3VwZXIuc2V0VXAoKTsKLSAgICAJQXhpc1NlcnZpY2Ugc2VydmljZSA9IGRlcGxveUNsYXNzQXNTZXJ2aWNlKCJSZXF1ZXN0Q291bnRlciIsIFJlcXVlc3RDb3VudGVyLmNsYXNzKTsKLSAgICAgICAgc2VydmljZS5zZXRTY29wZShDb25zdGFudHMuU0NPUEVfU09BUF9TRVNTSU9OKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RWNob1hNTFN5bmMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU2VydmljZUNsaWVudCBzZW5kZXIgPSBnZXRDbGllbnQoIlJlcXVlc3RDb3VudGVyIiwgImdldFJlcXVlc3RDb3VudCIpOwotICAgICAgICBzZW5kZXIuZ2V0T3B0aW9ucygpLnNldE1hbmFnZVNlc3Npb24odHJ1ZSk7Ci0gICAgICAgIAotICAgICAgICBzZW5kZXIuc2VuZFJlY2VpdmUobnVsbCk7Ci0KLSAgICAgICAgT01FbGVtZW50IHJlc3VsdDIgPSBzZW5kZXIuc2VuZFJlY2VpdmUobnVsbCk7Ci0gICAgICAgIFN0cmluZyB0ZXh0ID0gcmVzdWx0Mi5nZXRUZXh0KCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiTnVtYmVyIG9mIHJlcXVlc3RzIHNob3VsZCBiZSAyIiwgMiwgSW50ZWdlci5wYXJzZUludCh0ZXh0KSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9TcGVha2luZ0hhbmRsZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvU3BlYWtpbmdIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzN2E1YWQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9TcGVha2luZ0hhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5lbmdpbmU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5oYW5kbGVycy5BYnN0cmFjdEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBTcGVha2luZ0hhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIgaW1wbGVtZW50cyBIYW5kbGVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coU3BlYWtpbmdIYW5kbGVyLmNsYXNzKTsKLSAgICBwcml2YXRlIFN0cmluZyBtZXNzYWdlOwotICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0KLSAgICBwdWJsaWMgU3BlYWtpbmdIYW5kbGVyKCkgewotICAgICAgICB0aGlzLm1lc3NhZ2UgPSAiSGkgSSBhbXRlc3RpbmcgIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBJbnZvY2F0aW9uUmVzcG9uc2UgaW52b2tlKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBsb2cuaW5mbygiSSBhbSAiICsgbWVzc2FnZSArICIgSGFuZGxlciBSdW5uaW5nIDopIik7Ci0gICAgICAgIHJldHVybiBJbnZvY2F0aW9uUmVzcG9uc2UuQ09OVElOVUU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmV2b2tlKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHsKLSAgICAgICAgbG9nLmluZm8oIkkgYW0gIiArIG1lc3NhZ2UgKyAiIEhhbmRsZXIgUnVubmluZyA6KSIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvU3BlYWtpbmdIYW5kbGVyMS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9TcGVha2luZ0hhbmRsZXIxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwZjExZmMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9TcGVha2luZ0hhbmRsZXIxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZW5naW5lOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uSGFuZGxlckRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGhhc2VSdWxlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaGFuZGxlcnMuQWJzdHJhY3RIYW5kbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucGhhc2VyZXNvbHZlci5QaGFzZU1ldGFkYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotcHVibGljIGNsYXNzIFNwZWFraW5nSGFuZGxlcjEgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIgaW1wbGVtZW50cyBIYW5kbGVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coU3BlYWtpbmdIYW5kbGVyMS5jbGFzcyk7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbWVzc2FnZTsKLSAgICBwcml2YXRlIFN0cmluZyBuYW1lOwotCi0gICAgcHVibGljIFNwZWFraW5nSGFuZGxlcjEoU3RyaW5nIG1lc3NhZ2UsIFFOYW1lIG5hbWUpIHsKLSAgICAgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKLSAgICAgICAgSGFuZGxlckRlc2NyaXB0aW9uIGhhbmRsZXJEZXNjID0gbmV3IEhhbmRsZXJEZXNjcmlwdGlvbigpOwotICAgICAgICBoYW5kbGVyRGVzYy5zZXROYW1lKCJTcGVha2luZ0hhbmRsZXIxIik7Ci0gICAgICAgIFBoYXNlUnVsZSBydWxlID0gbmV3IFBoYXNlUnVsZSgpOwotICAgICAgICBydWxlLnNldFBoYXNlTmFtZShQaGFzZU1ldGFkYXRhLlBIQVNFX0RJU1BBVENIKTsKLSAgICAgICAgaGFuZGxlckRlc2Muc2V0UnVsZXMocnVsZSk7Ci0gICAgICAgIGhhbmRsZXJEZXNjLnNldEhhbmRsZXIodGhpcyk7Ci0gICAgICAgIGhhbmRsZXJEZXNjLnNldE5hbWUobmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgIGluaXQoaGFuZGxlckRlc2MpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIEludm9jYXRpb25SZXNwb25zZSBpbnZva2UoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIGxvZy5pbmZvKCJJIGFtICIgKyBtZXNzYWdlICsgIiBIYW5kbGVyIFJ1bm5pbmcgOikiKTsKLSAgICAgICAgcmV0dXJuIEludm9jYXRpb25SZXNwb25zZS5DT05USU5VRTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZXZva2UoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgewotICAgICAgICBsb2cuaW5mbygiSSBhbSAiICsgbWVzc2FnZSArICIgSGFuZGxlciBSdW5uaW5nIDopIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBIYW5kbGVyRGVzY3JpcHRpb24gZ2V0SGFuZGxlckRlc2NyaXB0aW9uKCkgewotICAgICAgICByZXR1cm4gaGFuZGxlckRlc2M7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL1Rlc3RIYW5kbGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL1Rlc3RIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyYmYyOTcuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9UZXN0SGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmhhbmRsZXJzLkFic3RyYWN0SGFuZGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotcHVibGljIGNsYXNzIFRlc3RIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coVGVzdEhhbmRsZXIgLmNsYXNzKTsKLSAgICBwcml2YXRlIFN0cmluZyBtZXNzYWdlOwotICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0KLSAgICBwdWJsaWMgVGVzdEhhbmRsZXIoKSB7Ci0gICAgICAgIHRoaXMubWVzc2FnZSA9ICJpbnNpZGUgaW52YWxpZCBtb2R1bGUiOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIEludm9jYXRpb25SZXNwb25zZSBpbnZva2UoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIGxvZy5pbmZvKCJJIGFtICIgKyBtZXNzYWdlICsgIiBIYW5kbGVyIFJ1bm5pbmcgOikiKTsKLSAgICAgICAgcmV0dXJuIEludm9jYXRpb25SZXNwb25zZS5DT05USU5VRTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZXZva2UoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgewotICAgICAgICBsb2cuaW5mbygiSSBhbSAiICsgbWVzc2FnZSArICIgSGFuZGxlciBSdW5uaW5nIDopIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvVGVzdFNlcnZpY2UuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvVGVzdFNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmVlNmJiNC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL1Rlc3RTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZW5naW5lOwotCi1wdWJsaWMgY2xhc3MgVGVzdFNlcnZpY2UgewotICAgIHB1YmxpYyB2b2lkIHRlc3RWb2lkKCl7Ci0KLSAgICB9Ci0gICAgcHVibGljIFN0cmluZyB0ZXN0U3RyaW5nKFN0cmluZyBhKXsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyAgdGVzdEZhdWx0KFN0cmluZyBmb28pIHRocm93cyBFeGNlcHRpb257Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvVGhpcmRQYXJ0eVJlc3BvbnNlUmF3WE1MVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9UaGlyZFBhcnR5UmVzcG9uc2VSYXdYTUxUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4NWI2YTc1Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvVGhpcmRQYXJ0eVJlc3BvbnNlUmF3WE1MVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5lbmdpbmU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50Lk9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuU2VydmljZUNsaWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS51dGlsLlRlc3RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pbnRlZ3JhdGlvbi5UZXN0aW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pbnRlZ3JhdGlvbi5VdGlsU2VydmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaW50ZWdyYXRpb24uVXRpbFNlcnZlckJhc2VkVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5TaW1wbGVIVFRQU2VydmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5VdGlsczsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLXB1YmxpYyBjbGFzcyBUaGlyZFBhcnR5UmVzcG9uc2VSYXdYTUxUZXN0IGV4dGVuZHMgVXRpbFNlcnZlckJhc2VkVGVzdENhc2UgaW1wbGVtZW50cyBUZXN0Q29uc3RhbnRzIHsKLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIHJldHVybiBnZXRUZXN0U2V0dXAobmV3IFRlc3RTdWl0ZShUaGlyZFBhcnR5UmVzcG9uc2VSYXdYTUxUZXN0LmNsYXNzKSk7Ci0gICAgfQotICAgIAotCXByaXZhdGUgYm9vbGVhbiByZWNlaXZlZDsKLSAgICBwcm90ZWN0ZWQgQXhpc1NlcnZpY2Ugc2VydmljZTsKLSAgICBwcml2YXRlIFNpbXBsZUhUVFBTZXJ2ZXIgcmVjZWl2ZXI7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgY2FsbGJhY2tPcGVyYXRpb247Ci0gICAgcHJpdmF0ZSBTdHJpbmcgY2FsbGJhY2tTZXJ2aWNlTmFtZSA9ICJDYWxsYmFja1NlcnZpY2UiOwotICAgIHByaXZhdGUgaW50IGNhbGxiYWNrc2VydmVyUG9ydCA9IDE3NDU4OwotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHNlcnZpY2UgPSBVdGlscy5jcmVhdGVTaW1wbGVTZXJ2aWNlKHNlcnZpY2VOYW1lLAotICAgICAgICAgICAgICAgIEVjaG8uY2xhc3MuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgIG9wZXJhdGlvbk5hbWUpOwotICAgICAgICBVdGlsU2VydmVyLmRlcGxveVNlcnZpY2Uoc2VydmljZSk7Ci0gICAgICAgIAotICAgICAgICBjYWxsYmFja09wZXJhdGlvbiA9ICJjYWxsYmFjayI7Ci0gICAgCUF4aXNTZXJ2aWNlIGNhbGxiYWNrU2VydmljZSAgPSBVdGlscy5jcmVhdGVTaW1wbGVJbk9ubHlTZXJ2aWNlKG5ldyBRTmFtZShjYWxsYmFja1NlcnZpY2VOYW1lKSxuZXcgTWVzc2FnZVJlY2VpdmVyKCl7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCByZWNlaXZlKE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDdHgpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICAgICAgICAgIFNPQVBFbnZlbG9wZSBlbnZlbG9wZSA9IG1lc3NhZ2VDdHguZ2V0RW52ZWxvcGUoKTsKLSAgICAgICAgICAgICAgICBUZXN0aW5nVXRpbHMuY29tcGFyZVdpdGhDcmVhdGVkT01FbGVtZW50KGVudmVsb3BlLmdldEJvZHkoKS5nZXRGaXJzdEVsZW1lbnQoKSk7Ci0gICAgICAgICAgICAgICAgcmVjZWl2ZWQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9LG5ldyBRTmFtZShjYWxsYmFja09wZXJhdGlvbikpOwotICAgICAgICBVdGlsU2VydmVyLmRlcGxveVNlcnZpY2UoY2FsbGJhY2tTZXJ2aWNlKTsKLSAgICAgICAgCi0gICAgICAgIHJlY2VpdmVyID0gbmV3IFNpbXBsZUhUVFBTZXJ2ZXIoVXRpbFNlcnZlci5nZXRDb25maWd1cmF0aW9uQ29udGV4dCgpLCBjYWxsYmFja3NlcnZlclBvcnQpOwotICAgICAgICByZWNlaXZlci5zdGFydCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RPbmVXYXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ29udGV4dCA9Ci0gICAgICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkuY3JlYXRlQ29uZmlndXJhdGlvbkNvbnRleHRGcm9tRmlsZVN5c3RlbSgKLSAgICAgICAgICAgICAgICAgICAgVGVzdGluZ1V0aWxzLnByZWZpeEJhc2VEaXJlY3RvcnkoQ29uc3RhbnRzLlRFU1RJTkdfUEFUSCArICJpbnRlZ3JhdGlvblJlcG8vIiksIG51bGwpOwotICAgICAgICBTZXJ2aWNlQ2xpZW50IHNlbmRlciA9IG5ldyBTZXJ2aWNlQ2xpZW50KGNvbmZpZ0NvbnRleHQsIG51bGwpOwotICAgICAgICBPcHRpb25zIG9wID0gbmV3IE9wdGlvbnMoKTsKLSAgICAgICAgb3Auc2V0VG8odGFyZ2V0RVBSKTsKLSAgICAgICAgCi0gICAgICAgIG9wLnNldFJlcGx5VG8obmV3IEVuZHBvaW50UmVmZXJlbmNlKCJodHRwOi8vMTI3LjAuMC4xOiIrKGNhbGxiYWNrc2VydmVyUG9ydCkrIi9heGlzMi9zZXJ2aWNlcy8iK2NhbGxiYWNrU2VydmljZU5hbWUrICIvIitjYWxsYmFja09wZXJhdGlvbikpOwotICAgICAgICBvcC5zZXRBY3Rpb24oInVybjpTb21lQWN0aW9uIik7Ci0gICAgICAgIHNlbmRlci5zZXRPcHRpb25zKG9wKTsKLSAgICAgICAgc2VuZGVyLmVuZ2FnZU1vZHVsZShDb25zdGFudHMuTU9EVUxFX0FERFJFU1NJTkcpOwotICAgICAgICBzZW5kZXIuZmlyZUFuZEZvcmdldChUZXN0aW5nVXRpbHMuY3JlYXRlRHVtbXlPTUVsZW1lbnQoKSk7Ci0gICAgICAgIGludCBpbmRleCA9IDA7Ci0gICAgICAgIHdoaWxlICghcmVjZWl2ZWQpIHsKLSAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsKLSAgICAgICAgICAgIGluZGV4Kys7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPT0gMjApIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJlcnJvciBPY2N1cmVkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICByZWNlaXZlci5zdG9wKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL1RocmVhZGluZ1Rlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvVGhyZWFkaW5nVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTYwYzg4Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvVGhyZWFkaW5nVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5lbmdpbmU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuU2VydmljZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS51dGlsLkludm9rZXJUaHJlYWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUudXRpbC5UZXN0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaW50ZWdyYXRpb24uVXRpbFNlcnZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmludGVncmF0aW9uLlV0aWxTZXJ2ZXJCYXNlZFRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOwotaW1wb3J0IGphdmEudXRpbC5HcmVnb3JpYW5DYWxlbmRhcjsKLQotcHVibGljIGNsYXNzIFRocmVhZGluZ1Rlc3QgZXh0ZW5kcyBVdGlsU2VydmVyQmFzZWRUZXN0Q2FzZSBpbXBsZW1lbnRzIFRlc3RDb25zdGFudHMgewotCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coVGhyZWFkaW5nVGVzdC5jbGFzcyk7Ci0KLSAgICBwcm90ZWN0ZWQgUU5hbWUgdHJhbnNwb3J0TmFtZSA9IG5ldyBRTmFtZSgiaHR0cDovL2xvY2FsaG9zdC9teSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk51bGxUcmFuc3BvcnQiKTsKLQotICAgIHByb3RlY3RlZCBBeGlzQ29uZmlndXJhdGlvbiBlbmdpbmVSZWdpc3RyeTsKLSAgICBwcm90ZWN0ZWQgTWVzc2FnZUNvbnRleHQgbWM7Ci0gICAgcHJvdGVjdGVkIFNlcnZpY2VDb250ZXh0IHNlcnZpY2VDb250ZXh0OwotICAgIHByb3RlY3RlZCBBeGlzU2VydmljZSBzZXJ2aWNlOwotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZmluaXNoID0gZmFsc2U7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIHJldHVybiBnZXRUZXN0U2V0dXAobmV3IFRlc3RTdWl0ZShUaHJlYWRpbmdUZXN0LmNsYXNzKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc2VydmljZSA9Ci0gICAgICAgICAgICAgICAgVXRpbHMuY3JlYXRlU2ltcGxlU2VydmljZShzZXJ2aWNlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVjaG8uY2xhc3MuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uTmFtZSk7Ci0gICAgICAgIFV0aWxTZXJ2ZXIuZGVwbG95U2VydmljZShzZXJ2aWNlKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBVdGlsU2VydmVyLnVuRGVwbG95U2VydmljZShzZXJ2aWNlTmFtZSk7Ci0gICAgICAgIFV0aWxTZXJ2ZXIudW5EZXBsb3lDbGllbnRTZXJ2aWNlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEVjaG9YTUxTeW5jKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGludCBudW1iZXJPZlRocmVhZHMgPSA1OwotICAgICAgICBJbnZva2VyVGhyZWFkW10gaW52b2tlclRocmVhZHMgPSBuZXcgSW52b2tlclRocmVhZFtudW1iZXJPZlRocmVhZHNdOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyT2ZUaHJlYWRzOyBpKyspIHsKLSAgICAgICAgICAgIEludm9rZXJUaHJlYWQgaW52b2tlclRocmVhZCA9IG5ldyBJbnZva2VyVGhyZWFkKGkgKyAxKTsKLSAgICAgICAgICAgIGludm9rZXJUaHJlYWRzW2ldID0gaW52b2tlclRocmVhZDsKLSAgICAgICAgICAgIGludm9rZXJUaHJlYWQuc3RhcnQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gdGhyZWFkc0FyZVJ1bm5pbmc7Ci0gICAgICAgIENhbGVuZGFyIGNhbCA9IG5ldyBHcmVnb3JpYW5DYWxlbmRhcigpOwotICAgICAgICBpbnQgbWluID0gY2FsLmdldChDYWxlbmRhci5NSU5VVEUpOwotCi0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIHRocmVhZHNBcmVSdW5uaW5nID0gZmFsc2U7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bWJlck9mVGhyZWFkczsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGludm9rZXJUaHJlYWRzW2ldLmlzQWxpdmUoKSkgewotICAgICAgICAgICAgICAgICAgICB0aHJlYWRzQXJlUnVubmluZyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBFeGNlcHRpb24gZXhjZXB0aW9uID0gaW52b2tlclRocmVhZHNbaV0uZ2V0VGhyb3duRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGV4Y2VwdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIkV4Y2VwdGlvbiB0aHJvd24gaW4gdGhyZWFkICIgKyBpICsgIiAuLi4uIiwgZXhjZXB0aW9uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHdhaXRpbmcgMyBzZWNvbmRzLCBpZiBub3QgZmluaXNoLCB0aW1lIG91dC4KLSAgICAgICAgICAgIGlmIChNYXRoLmFicyhtaW4gLSBuZXcgR3JlZ29yaWFuQ2FsZW5kYXIoKS5nZXQoQ2FsZW5kYXIuTUlOVVRFKSkgPiAxKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmluZm8oIkknbSB0aW1pbmcgb3V0LiBDYW4ndCB3YWl0IG1vcmUgdGhhbiB0aGlzIHRvIGZpbmlzaC4iKTsKLSAgICAgICAgICAgICAgICBmYWlsKCJUaW1pbmcgb3V0Iik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDApOwotICAgICAgICB9IHdoaWxlICh0aHJlYWRzQXJlUnVubmluZyk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZSh0cnVlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL1VzaW5nVHJhbnNwb3J0VGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9Vc2luZ1RyYW5zcG9ydFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY1MjFkNi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL1VzaW5nVHJhbnNwb3J0VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQMTJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5TZXJ2aWNlQ2xpZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaW50ZWdyYXRpb24uTG9jYWxUZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmludGVncmF0aW9uLlRlc3RpbmdVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuV1NETENvbnN0YW50czsKLQotcHVibGljIGNsYXNzIFVzaW5nVHJhbnNwb3J0VGVzdCBleHRlbmRzIExvY2FsVGVzdENhc2UgewotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICAgICAgZGVwbG95Q2xhc3NBc1NlcnZpY2UoRWNoby5TRVJWSUNFX05BTUUsIEVjaG8uY2xhc3MpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTT0FQVmVyc2lvbmluZygpIHRocm93cyBFeGNlcHRpb257Ci0gICAgCVNlcnZpY2VDbGllbnQgc2VuZGVyID0gZ2V0Q2xpZW50KEVjaG8uU0VSVklDRV9OQU1FLCBFY2hvLkVDSE9fT01fRUxFTUVOVF9PUF9OQU1FKTsKLSAgICAJc2VuZGVyLmdldE9wdGlvbnMoKS5zZXRTb2FwVmVyc2lvblVSSShTT0FQMTJDb25zdGFudHMuU09BUF9FTlZFTE9QRV9OQU1FU1BBQ0VfVVJJKTsKLSAgICAJc2VuZGVyLnNldENhY2hpbmdPcGVyYXRpb25Db250ZXh0KHRydWUpOwotICAgIAlPTUVsZW1lbnQgcmVzcG9uc2UgPSBzZW5kZXIuc2VuZFJlY2VpdmUoVGVzdGluZ1V0aWxzLmNyZWF0ZUR1bW15T01FbGVtZW50KCkpOwotICAgIAlUZXN0aW5nVXRpbHMuY29tcGFyZVdpdGhDcmVhdGVkT01FbGVtZW50KHJlc3BvbnNlKTsKLSAgICAJU09BUEVudmVsb3BlIHJlc3VsdCA9Ci0gICAgICAgICAgICBzZW5kZXIuZ2V0TGFzdE9wZXJhdGlvbkNvbnRleHQoKS5nZXRNZXNzYWdlQ29udGV4dChXU0RMQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfSU5fVkFMVUUpLmdldEVudmVsb3BlKCk7Ci0gICAgCSBhc3NlcnRFcXVhbHMoIlNPQVAgVmVyc2lvbiByZWNlaXZlZCBpcyBub3QgY29tcGF0aWJsZSIsCi0gICAgICAgICAgICAgICAgIFNPQVAxMkNvbnN0YW50cy5TT0FQX0VOVkVMT1BFX05BTUVTUEFDRV9VUkksCi0gICAgICAgICAgICAgICAgIHJlc3VsdC5nZXROYW1lc3BhY2UoKS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgfQotICAgIAotICAgIC8vIFRoZSB2YWxpZCBjYXNlIGlzIGNvdmVyZWQgYnkgbG9hZHMgb2Ygb3RoZXIgdGVzdHMuLi4KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZFRyYW5zcG9ydCgpIHRocm93cyBBeGlzRmF1bHQgewotICAgIAlTZXJ2aWNlQ2xpZW50IHNlbmRlciA9IGdldENsaWVudChFY2hvLlNFUlZJQ0VfTkFNRSwgRWNoby5FQ0hPX09NX0VMRU1FTlRfT1BfTkFNRSk7Ci0gICAgCVN0cmluZyBvbGRBZGRyZXNzID0gc2VuZGVyLmdldE9wdGlvbnMoKS5nZXRUbygpLmdldEFkZHJlc3MoKTsKLSAgICAJU3RyaW5nIG5ld0FkZHJlc3MgPSAibGNsIitvbGRBZGRyZXNzLnN1YnN0cmluZyg1KTsKLSAgICAJc2VuZGVyLmdldE9wdGlvbnMoKS5nZXRUbygpLnNldEFkZHJlc3MobmV3QWRkcmVzcyk7Ci0gICAgCXNlbmRlci5nZXRPcHRpb25zKCkuc2V0VHJhbnNwb3J0T3V0KG51bGwpOwotICAgIAl0cnkgewotICAgICAgICAgICAgc2VuZGVyLnNlbmRSZWNlaXZlKFRlc3RpbmdVdGlscy5jcmVhdGVEdW1teU9NRWxlbWVudCgpKTsKLSAgICAgICAgICAgIGZhaWwoIkV4cGVjdGluZyBhIGZhaWx1cmUgLSBzaG91bGRuJ3QgYmUgYWJsZSB0byBkZXRlcm1pbmUgdGhlIG91dCB0cmFuc3BvcnQgZnJvbSAnbGNsJyIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUoIkV4cGVjdGluZyBhbiBleGNlcHRpb24gb2YgdHlwZSBbb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHRdIiwKLSAgICAgICAgICAgICAgICAgICAgICAgKGV4IGluc3RhbmNlb2Ygb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQpKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvV1NETENsaWVudFRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvV1NETENsaWVudFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDRhZmU0NS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL1dTRExDbGllbnRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZW5naW5lOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuU2VydmljZUNsaWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLnV0aWwuVGVzdENvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmludGVncmF0aW9uLlRlc3RpbmdVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmludGVncmF0aW9uLlV0aWxTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pbnRlZ3JhdGlvbi5VdGlsU2VydmVyQmFzZWRUZXN0Q2FzZTsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1wdWJsaWMgY2xhc3MgV1NETENsaWVudFRlc3QgZXh0ZW5kcyBVdGlsU2VydmVyQmFzZWRUZXN0Q2FzZSBpbXBsZW1lbnRzIFRlc3RDb25zdGFudHMgewotCi0gICAgcHJvdGVjdGVkIEF4aXNTZXJ2aWNlIHNlcnZpY2U7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIHJldHVybiBnZXRUZXN0U2V0dXAobmV3IFRlc3RTdWl0ZShXU0RMQ2xpZW50VGVzdC5jbGFzcykpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHNlcnZpY2UgPSBBeGlzU2VydmljZS5jcmVhdGVTZXJ2aWNlKEVjaG8uY2xhc3MuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVdGlsU2VydmVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldENvbmZpZ3VyYXRpb25Db250ZXh0KCkuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKSk7Ci0gICAgICAgIHNlcnZpY2Uuc2V0TmFtZShzZXJ2aWNlTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgIFV0aWxTZXJ2ZXIuZGVwbG95U2VydmljZShzZXJ2aWNlKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBVdGlsU2VydmVyLnVuRGVwbG95U2VydmljZShzZXJ2aWNlTmFtZSk7Ci0gICAgICAgIFV0aWxTZXJ2ZXIudW5EZXBsb3lDbGllbnRTZXJ2aWNlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFdTRExDbGllbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgVVJMIHdzZGxVUkwgPSBuZXcgVVJMKCJodHRwOi8vbG9jYWxob3N0OiIgKyBVdGlsU2VydmVyLlRFU1RJTkdfUE9SVCArCi0gICAgICAgICAgICAgICAgIi9heGlzMi9zZXJ2aWNlcy9FY2hvWE1MU2VydmljZT93c2RsIik7Ci0gICAgICAgIFNlcnZpY2VDbGllbnQgc2VydmljZUNsaWVudCA9IG5ldyBTZXJ2aWNlQ2xpZW50KG51bGwsIHdzZGxVUkwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBRTmFtZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL2VuZ2luZS5heGlzMi5hcGFjaGUub3JnIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRWNob1hNTFNlcnZpY2UiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVjaG9IdHRwU29hcDExRW5kcG9pbnQiKTsKLSAgICAgICAgT01FbGVtZW50IHBheWxvYWQgPQotICAgICAgICAgICAgICAgIFRlc3RpbmdVdGlscy5jcmVhdGVEdW1teU9NRWxlbWVudCgiaHR0cDovL2VuZ2luZS5heGlzMi5hcGFjaGUub3JnIik7Ci0gICAgICAgIFN0cmluZyBlcHIgPSAiaHR0cDovLzEyNy4wLjAuMToiICsgVXRpbFNlcnZlci5URVNUSU5HX1BPUlQgKwotICAgICAgICAgICAgICAgICIvYXhpczIvc2VydmljZXMvRWNob1hNTFNlcnZpY2UiOwotICAgICAgICAvL1RoaXMgaXMgbm90IHNtdCB3ZSBuZWVkIHRvIGRvIGJ1dCAsIG15IGJ1aWxkIGlzIGZhaWwgaWYgSSBkb250IGRvIHRoYXQgOikKLSAgICAgICAgc2VydmljZUNsaWVudC5nZXRPcHRpb25zKCkuc2V0VG8obmV3IEVuZHBvaW50UmVmZXJlbmNlKGVwcikpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oc2VydmljZUNsaWVudC5nZXRPcHRpb25zKCkuZ2V0VG8oKS5nZXRBZGRyZXNzKCkpOwotICAgICAgICBPTUVsZW1lbnQgcmVzcG9uc2UgPSBzZXJ2aWNlQ2xpZW50LnNlbmRSZWNlaXZlKG5ldyBRTmFtZSgiaHR0cDovL2VuZ2luZS5heGlzMi5hcGFjaGUub3JnIiwgImVjaG9PTSIpLCBwYXlsb2FkKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXNwb25zZSk7Ci0gICAgICAgIFN0cmluZyB0ZXh0VmFsdWUgPSByZXNwb25zZS5nZXRGaXJzdEVsZW1lbnQoKS5nZXRGaXJzdEVsZW1lbnQoKS5nZXRUZXh0KCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyh0ZXh0VmFsdWUsICJJc2FhYyBBc2ltb3YsIFRoZSBGb3VuZGF0aW9uIFRyaWxvZ3kiKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL2NodW5raW5nLWRpc2FibGVkLWF4aXMyLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvY2h1bmtpbmctZGlzYWJsZWQtYXhpczIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTQ3OWRmZjkuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9jaHVua2luZy1kaXNhYmxlZC1heGlzMi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08YXhpc2NvbmZpZyBuYW1lPSJBeGlzSmF2YTIuMCI+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gUGFyYW1ldGVycyAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJob3RkZXBsb3ltZW50Ij50cnVlPC9wYXJhbWV0ZXI+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJob3R1cGRhdGUiPmZhbHNlPC9wYXJhbWV0ZXI+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJlbmFibGVNVE9NIj5mYWxzZTwvcGFyYW1ldGVyPgotCi0gICAgPHBhcmFtZXRlciBuYW1lPSJ1c2VyTmFtZSI+YWRtaW48L3BhcmFtZXRlcj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9InBhc3N3b3JkIj5heGlzMjwvcGFyYW1ldGVyPgotCi0gICAgPHBhcmFtZXRlciBuYW1lPSJzZXJhbGl6ZUxvY2F0aW9uIj4uPC9wYXJhbWV0ZXI+Ci0gICAgPGhvc3RDb25maWd1cmF0aW9uPgotICAgICAgICA8aXA+MTI3LjAuMC4xPC9pcD4KLSAgICAgICAgPHBvcnQ+NTU1NTwvcG9ydD4KLSAgICA8L2hvc3RDb25maWd1cmF0aW9uPgotCi0KLSAgICA8IS0taWYgeW91IHdhbnQgdG8gZXh0cmFjdCB0aGUgc2VydmljZSBhcmNoaXZlIGZpbGUgYW5kIHdvcmsgd2l0aCB0aGF0IHBsZWFzZSB1bmNvbW1lbnQgdGhpcy0tPgotICAgIDwhLS1lbHNlICwgaXQgd29udCBleHRyYWN0IGFyY2hpdmUgZmlsZSBvciBkb2VzIG5vdCB0YWtlIGludG8gY29uc2lkZXJhdGlvbiBpZiBzb21lb25lIGRyb3AtLT4KLSAgICA8IS0tZXhwbG9kZWQgZGlyZWN0b3J5IGludG8gL3NlcnZpY2UgZGlyZWN0b3J5LS0+Ci0gICAgPCEtLTxwYXJhbWV0ZXIgbmFtZT0iZXh0cmFjdFNlcnZpY2VBcmNoaXZlIj50cnVlPC9wYXJhbWV0ZXI+LS0+Ci0KLQotICAgIDwhLS0gICAgVGhlIHdheSBvZiBhZGRpbmcgbGlzdGVuZXIgdG8gdGhlIHN5c3RlbS0tPgotICAgIDwhLS0gICAgPGxpc3RlbmVyIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLk9ic2VydmVySU1QTCI+LS0+Ci0gICAgPCEtLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJSU1NfVVJMIj5odHRwOi8vMTI3LjAuMC4xL3JzczwvcGFyYW1ldGVyPi0tPgotICAgIDwhLS0gICAgPC9saXN0ZW5lcj4tLT4KLQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIE1lc3NhZ2UgUmVjZWl2ZXJzIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tVGhpcyBpcyB0aGUgRGVhZnVsdCBNZXNzYWdlIFJlY2VpdmVyIGZvciB0aGUgc3lzdGVtICwgaWYgeW91IHdhbnQgdG8gaGF2ZSBNZXNzYWdlUmVjZWl2ZXJzIGZvciAtLT4KLSAgICA8IS0tYWxsIHRoZSBvdGhlciBNRVAgaW1wbGVtZW50IGl0IGFuZCBhZGQgdGhlIGNvcnJlY3QgZW50cnkgdG8gaGVyZSAsIHNvIHRoYXQgeW91IGNhbiByZWZlciBmcm9tLS0+Ci0gICAgPCEtLWFueSBvcGVyYXRpb24gLS0+Ci0gICAgPCEtLU5vdGUgOiBZb3UgY2FuIG92cmlkZSB0aGlzIGZvciBwYXJ0aWN1bGFyIHNlcnZpY2UgYnkgYWRkaW5nIHRoZSBzYW1lIGVsZW1lbnQgd2l0aCB5b3VyIHJlcXVpcmVtZW50LS0+Ci0gICAgPG1lc3NhZ2VSZWNlaXZlcnM+Ci0gICAgICAgIDxtZXNzYWdlUmVjZWl2ZXIgbWVwPSJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaW4tb25seSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuUmF3WE1MSU5Pbmx5TWVzc2FnZVJlY2VpdmVyIi8+Ci0gICAgICAgIDxtZXNzYWdlUmVjZWl2ZXIgbWVwPSJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaW4tb3V0IgotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5SYXdYTUxJTk91dE1lc3NhZ2VSZWNlaXZlciIvPgotICAgIDwvbWVzc2FnZVJlY2VpdmVycz4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBUcmFuc3BvcnQgSW5zIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8dHJhbnNwb3J0UmVjZWl2ZXIgbmFtZT0iaHR0cCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuU2ltcGxlSFRUUFNlcnZlciI+Ci0gICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icG9ydCI+NjA2MDwvcGFyYW1ldGVyPgotICAgIDwvdHJhbnNwb3J0UmVjZWl2ZXI+Ci0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBUcmFuc3BvcnQgT3V0cyAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0KLSAgICA8dHJhbnNwb3J0U2VuZGVyIG5hbWU9ImxvY2FsIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQubG9jYWwuTG9jYWxUcmFuc3BvcnRTZW5kZXIiLz4KLSAgICA8dHJhbnNwb3J0U2VuZGVyIG5hbWU9Imh0dHAiIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkNvbW1vbnNIVFRQVHJhbnNwb3J0U2VuZGVyIj4KLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJQUk9UT0NPTCI+SFRUUC8xLjE8L3BhcmFtZXRlcj4KLSAgICA8L3RyYW5zcG9ydFNlbmRlcj4KLSAgICA8dHJhbnNwb3J0U2VuZGVyIG5hbWU9Imh0dHBzIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuQ29tbW9uc0hUVFBUcmFuc3BvcnRTZW5kZXIiPgotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9IlBST1RPQ09MIj5IVFRQLzEuMTwvcGFyYW1ldGVyPgotICAgIDwvdHJhbnNwb3J0U2VuZGVyPgotCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gR2xvYmFsIE1vZHVsZXMgIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIENvbW1lbnQgdGhpcyB0byBkaXNhYmxlIEFkZHJlc3NpbmcgLS0+Ci0gICAgPG1vZHVsZSByZWY9ImFkZHJlc3NpbmciLz4KLQotCi0gICAgPCEtLUNvbmZpZ3VyaW5nIG1vZHVsZSAsIHByb3ZpZGluZyBwYXJhbWV0ZXJzIGZvciBtb2R1bGVzIHdoZXRoZXIgdGhleSByZWZlciBvciBub3QtLT4KLSAgICA8IS0tPG1vZHVsZUNvbmZpZyBuYW1lPSJhZGRyZXNzaW5nIj4tLT4KLSAgICA8IS0tPHBhcmFtZXRlciBuYW1lPSJhZGRyZXNzaW5nUGFyYSI+Ti9BPC9wYXJhbWV0ZXI+LS0+Ci0gICAgPCEtLTwvbW9kdWxlQ29uZmlnPi0tPgotCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gUGhhc2VzICAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPHBoYXNlT3JkZXIgdHlwZT0iSW5GbG93Ij4KLSAgICAgICAgPCEtLSAgU3lzdGVtIHByZSBkZWZpbmVkIHBoYXNlcyAgICAgICAtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlRyYW5zcG9ydEluIi8+Ci0gICAgICAgICA8cGhhc2UgbmFtZT0iQWRkcmVzc2luZyI+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJBZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciI+Ci0gICAgICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJBZGRyZXNzaW5nIi8+Ci0gICAgICAgICAgICA8L2hhbmRsZXI+Ci0gICAgICAgIDwvcGhhc2U+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJTZWN1cml0eSIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iUHJlRGlzcGF0Y2giLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9IkRpc3BhdGNoIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuRGlzcGF0Y2hQaGFzZSI+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJSZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciIvPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiLz4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlJlcXVlc3RVUklPcGVyYXRpb25EaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSU9wZXJhdGlvbkRpc3BhdGNoZXIiLz4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciIvPgotCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJIVFRQTG9jYXRpb25CYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5IVFRQTG9jYXRpb25CYXNlZERpc3BhdGNoZXIiLz4KLSAgICAgICAgPC9waGFzZT4KLSAgICAgICAgPCEtLSAgU3lzdGVtIHByZSBkZWZpbmVkIHBoYXNlcyAgICAgICAtLT4KLSAgICAgICAgPCEtLSAgIEFmdGVyIFBvc3RkaXNwYXRjaCBwaGFzZSBtb2R1bGUgYXV0aG9yIG9yIG9yIHNlcnZpY2UgYXV0aG9yIGNhbiBhZGQgYW55IHBoYXNlIGhlIHdhbnQgICAgICAtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9InVzZXJwaGFzZTEiLz4KLSAgICA8L3BoYXNlT3JkZXI+Ci0gICAgPHBoYXNlT3JkZXIgdHlwZT0iT3V0RmxvdyI+Ci0gICAgICAgIDwhLS0gICAgICB1c2VyIGNhbiBhZGQgaGlzIG93biBwaGFzZXMgdG8gdGhpcyBhcmVhICAtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9InVzZXJwaGFzZTEiLz4KLSAgICAgICAgPCEtLXN5c3RlbSBwcmVkZWZpbmVkIHBoYXNlLS0+Ci0gICAgICAgIDwhLS10aGVzZSBwaGFzZSB3aWxsIHJ1biBpcnJlc3BlY3RpdmUgb2YgdGhlIHNlcnZpY2UtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlBvbGljeURldGVybWluYXRpb24iLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik1lc3NhZ2VPdXQiLz4KLSAgICA8L3BoYXNlT3JkZXI+Ci0gICAgPHBoYXNlT3JkZXIgdHlwZT0iSW5GYXVsdEZsb3ciPgotICAgICAgIDxwaGFzZSBuYW1lPSJUcmFuc3BvcnRJbiIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iQWRkcmVzc2luZyI+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJBZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciI+Ci0gICAgICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJBZGRyZXNzaW5nIi8+Ci0gICAgICAgICAgICA8L2hhbmRsZXI+Ci0gICAgICAgIDwvcGhhc2U+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJTZWN1cml0eSIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iUHJlRGlzcGF0Y2giLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9IkRpc3BhdGNoIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuRGlzcGF0Y2hQaGFzZSI+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJSZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciIvPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiLz4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlJlcXVlc3RVUklPcGVyYXRpb25EaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSU9wZXJhdGlvbkRpc3BhdGNoZXIiLz4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciIvPgotCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJIVFRQTG9jYXRpb25CYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5IVFRQTG9jYXRpb25CYXNlZERpc3BhdGNoZXIiLz4KLSAgICAgICAgPC9waGFzZT4KLSAgICAgICAgPCEtLSAgU3lzdGVtIHByZSBkZWZpbmVkIHBoYXNlcyAgICAgICAtLT4KLSAgICAgICAgPCEtLSAgIEFmdGVyIFBvc3RkaXNwYXRjaCBwaGFzZSBtb2R1bGUgYXV0aG9yIG9yIG9yIHNlcnZpY2UgYXV0aG9yIGNhbiBhZGQgYW55IHBoYXNlIGhlIHdhbnQgICAgICAtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9InVzZXJwaGFzZTEiLz4KLSAgICA8L3BoYXNlT3JkZXI+Ci0gICAgPHBoYXNlT3JkZXIgdHlwZT0iT3V0RmF1bHRGbG93Ij4KLSAgICAgICAgPCEtLSAgICAgIHVzZXIgY2FuIGFkZCBoaXMgb3duIHBoYXNlcyB0byB0aGlzIGFyZWEgIC0tPgotICAgICAgICA8cGhhc2UgbmFtZT0idXNlcnBoYXNlMSIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iUG9saWN5RGV0ZXJtaW5hdGlvbiIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iTWVzc2FnZU91dCIvPgotICAgIDwvcGhhc2VPcmRlcj4KLTwvYXhpc2NvbmZpZz4KLQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9jaHVua2luZy1lbmFibGVkLWF4aXMyLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvY2h1bmtpbmctZW5hYmxlZC1heGlzMi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2MzRlMmIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9jaHVua2luZy1lbmFibGVkLWF4aXMyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxheGlzY29uZmlnIG5hbWU9IkF4aXNKYXZhMi4wIj4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBQYXJhbWV0ZXJzIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImhvdGRlcGxveW1lbnQiPnRydWU8L3BhcmFtZXRlcj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImhvdHVwZGF0ZSI+ZmFsc2U8L3BhcmFtZXRlcj4KLQotCi0gICAgPHBhcmFtZXRlciBuYW1lPSJ1c2VyTmFtZSI+YWRtaW48L3BhcmFtZXRlcj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9InBhc3N3b3JkIj5heGlzMjwvcGFyYW1ldGVyPgotCi0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBNZXNzYWdlIFJlY2VpdmVycyAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBUaGlzIGlzIHRoZSBEZWFmdWx0IE1lc3NhZ2UgUmVjZWl2ZXIgZm9yIHRoZSBSZXF1ZXN0IFJlc3BvbnNlIHN0eWxlIE9wZXJhdGlvbnMgLS0+Ci0gICAgPG1lc3NhZ2VSZWNlaXZlciBtZXA9IklOT1VUIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuUmF3WE1MSU5PdXRNZXNzYWdlUmVjZWl2ZXIiLz4KLQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIFRyYW5zcG9ydCBJbnMgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDx0cmFuc3BvcnRSZWNlaXZlciBuYW1lPSJodHRwIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5TaW1wbGVIVFRQU2VydmVyIj4KLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJwb3J0Ij42MDYwPC9wYXJhbWV0ZXI+Ci0gICAgPC90cmFuc3BvcnRSZWNlaXZlcj4KLQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIFRyYW5zcG9ydCBPdXRzIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotICAgIDx0cmFuc3BvcnRTZW5kZXIgbmFtZT0iaHR0cCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuQ29tbW9uc0hUVFBUcmFuc3BvcnRTZW5kZXIiPgotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9IlBST1RPQ09MIj5IVFRQLzEuMTwvcGFyYW1ldGVyPgotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9IlRyYW5zZmVyLUVuY29kaW5nIj5jaHVua2VkPC9wYXJhbWV0ZXI+Ci0gICAgPC90cmFuc3BvcnRTZW5kZXI+Ci0KLSAgICA8dHJhbnNwb3J0U2VuZGVyIG5hbWU9ImxvY2FsIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQubG9jYWwuTG9jYWxUcmFuc3BvcnRTZW5kZXIiLz4KLQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIEdsb2JhbCBNb2R1bGVzICAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBVbmNvbW1lbnQgdGhpcyB0byBlbmFibGUgQWRkcmVzc2luZwotICAgIDxtb2R1bGUgcmVmPSJhZGRyZXNzaW5nIi8+IC0tPgotCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gUGhhc2VzICAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPHBoYXNlT3JkZXIgdHlwZT0iSW5GbG93Ij4KLSAgICAgICAgPCEtLSAgU3lzdGVtIHByZSBkZWZpbmVkIHBoYXNlcyAgICAgICAtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlRyYW5zcG9ydEluIi8+Ci0gICAgICAgICA8cGhhc2UgbmFtZT0iQWRkcmVzc2luZyI+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJBZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciI+Ci0gICAgICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJBZGRyZXNzaW5nIi8+Ci0gICAgICAgICAgICA8L2hhbmRsZXI+Ci0gICAgICAgIDwvcGhhc2U+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJTZWN1cml0eSIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iUHJlRGlzcGF0Y2giLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9IkRpc3BhdGNoIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuRGlzcGF0Y2hQaGFzZSI+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJSZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciIvPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiLz4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlJlcXVlc3RVUklPcGVyYXRpb25EaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSU9wZXJhdGlvbkRpc3BhdGNoZXIiLz4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciIvPgotCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJIVFRQTG9jYXRpb25CYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5IVFRQTG9jYXRpb25CYXNlZERpc3BhdGNoZXIiLz4KLSAgICAgICAgPC9waGFzZT4KLSAgICAgICAgPCEtLSAgU3lzdGVtIHByZSBkZWZpbmVkIHBoYXNlcyAgICAgICAtLT4KLSAgICAgICAgPCEtLSAgIEFmdGVyIFBvc3RkaXNwYXRjaCBwaGFzZSBtb2R1bGUgYXV0aG9yIG9yIG9yIHNlcnZpY2UgYXV0aG9yIGNhbiBhZGQgYW55IHBoYXNlIGhlIHdhbnQgICAgICAtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9InVzZXJwaGFzZTEiLz4KLSAgICA8L3BoYXNlT3JkZXI+Ci0gICAgPHBoYXNlT3JkZXIgdHlwZT0iT3V0RmxvdyI+Ci0gICAgICAgIDwhLS0gICAgICB1c2VyIGNhbiBhZGQgaGlzIG93biBwaGFzZXMgdG8gdGhpcyBhcmVhICAtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9InVzZXJwaGFzZTEiLz4KLSAgICAgICAgPCEtLXN5c3RlbSBwcmVkZWZpbmVkIHBoYXNlLS0+Ci0gICAgICAgIDwhLS10aGVzZSBwaGFzZSB3aWxsIHJ1biBpcnJlc3BlY3RpdmUgb2YgdGhlIHNlcnZpY2UtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlBvbGljeURldGVybWluYXRpb24iLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik1lc3NhZ2VPdXQiLz4KLSAgICA8L3BoYXNlT3JkZXI+Ci0gICAgPHBoYXNlT3JkZXIgdHlwZT0iSW5GYXVsdEZsb3ciPgotICAgICAgIDxwaGFzZSBuYW1lPSJUcmFuc3BvcnRJbiIvPgotICAgICAgICAgPHBoYXNlIG5hbWU9IkFkZHJlc3NpbmciPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiPgotICAgICAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iQWRkcmVzc2luZyIvPgotICAgICAgICAgICAgPC9oYW5kbGVyPgotICAgICAgICA8L3BoYXNlPgotICAgICAgICA8cGhhc2UgbmFtZT0iU2VjdXJpdHkiLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlByZURpc3BhdGNoIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJEaXNwYXRjaCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkRpc3BhdGNoUGhhc2UiPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiLz4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIi8+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJSZXF1ZXN0VVJJT3BlcmF0aW9uRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklPcGVyYXRpb25EaXNwYXRjaGVyIi8+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiLz4KLQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iSFRUUExvY2F0aW9uQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuSFRUUExvY2F0aW9uQmFzZWREaXNwYXRjaGVyIi8+Ci0gICAgICAgIDwvcGhhc2U+Ci0gICAgICAgIDwhLS0gIFN5c3RlbSBwcmUgZGVmaW5lZCBwaGFzZXMgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gICBBZnRlciBQb3N0ZGlzcGF0Y2ggcGhhc2UgbW9kdWxlIGF1dGhvciBvciBvciBzZXJ2aWNlIGF1dGhvciBjYW4gYWRkIGFueSBwaGFzZSBoZSB3YW50ICAgICAgLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJ1c2VycGhhc2UxIi8+Ci0gICAgPC9waGFzZU9yZGVyPgotICAgIDxwaGFzZU9yZGVyIHR5cGU9Ik91dEZhdWx0RmxvdyI+Ci0gICAgICAgIDwhLS0gICAgICB1c2VyIGNhbiBhZGQgaGlzIG93biBwaGFzZXMgdG8gdGhpcyBhcmVhICAtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9InVzZXJwaGFzZTEiLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlBvbGljeURldGVybWluYXRpb24iLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik1lc3NhZ2VPdXQiLz4KLSAgICA8L3BoYXNlT3JkZXI+Ci08L2F4aXNjb25maWc+Ci0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvY29tbW9ucy1odHRwLWVuYWJsZWQtYXhpczIueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9jb21tb25zLWh0dHAtZW5hYmxlZC1heGlzMi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkYzRiYzkuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9jb21tb25zLWh0dHAtZW5hYmxlZC1heGlzMi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08YXhpc2NvbmZpZyBuYW1lPSJBeGlzSmF2YTIuMCI+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gUGFyYW1ldGVycyAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJob3RkZXBsb3ltZW50Ij50cnVlPC9wYXJhbWV0ZXI+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJob3R1cGRhdGUiPmZhbHNlPC9wYXJhbWV0ZXI+Ci0KLQotICAgIDxwYXJhbWV0ZXIgbmFtZT0idXNlck5hbWUiPmFkbWluPC9wYXJhbWV0ZXI+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJwYXNzd29yZCI+YXhpczI8L3BhcmFtZXRlcj4KLQotCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gTWVzc2FnZSBSZWNlaXZlcnMgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gVGhpcyBpcyB0aGUgRGVhZnVsdCBNZXNzYWdlIFJlY2VpdmVyIGZvciB0aGUgUmVxdWVzdCBSZXNwb25zZSBzdHlsZSBPcGVyYXRpb25zIC0tPgotICAgIDxtZXNzYWdlUmVjZWl2ZXIgbWVwPSJJTk9VVCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLlJhd1hNTElOT3V0TWVzc2FnZVJlY2VpdmVyIi8+Ci0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBUcmFuc3BvcnQgSW5zIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8dHJhbnNwb3J0UmVjZWl2ZXIgbmFtZT0iaHR0cCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuU2ltcGxlSFRUUFNlcnZlciI+Ci0gICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icG9ydCI+NjA2MDwvcGFyYW1ldGVyPgotICAgIDwvdHJhbnNwb3J0UmVjZWl2ZXI+Ci0KLQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIFRyYW5zcG9ydCBPdXRzIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotICAgIDx0cmFuc3BvcnRTZW5kZXIgbmFtZT0ibG9jYWwiIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5sb2NhbC5Mb2NhbFRyYW5zcG9ydFNlbmRlciIvPgotCi0gICAgPHRyYW5zcG9ydFNlbmRlciBuYW1lPSJodHRwIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5Db21tb25zSFRUUFRyYW5zcG9ydFNlbmRlciI+Ci0gICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iUFJPVE9DT0wiPkhUVFAvMS4xPC9wYXJhbWV0ZXI+Ci0gICAgPC90cmFuc3BvcnRTZW5kZXI+Ci0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBHbG9iYWwgTW9kdWxlcyAgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gVW5jb21tZW50IHRoaXMgdG8gZW5hYmxlIEFkZHJlc3NpbmcKLSAgICA8bW9kdWxlIHJlZj0iYWRkcmVzc2luZyIvPiAtLT4KLQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIFBoYXNlcyAgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDxwaGFzZU9yZGVyIHR5cGU9IkluRmxvdyI+Ci0gICAgICAgIDwhLS0gIFN5c3RlbSBwcmUgZGVmaW5lZCBwaGFzZXMgICAgICAgLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJUcmFuc3BvcnRJbiIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iQWRkcmVzc2luZyI+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJBZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciI+Ci0gICAgICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJBZGRyZXNzaW5nIi8+Ci0gICAgICAgICAgICA8L2hhbmRsZXI+Ci0gICAgICAgIDwvcGhhc2U+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJTZWN1cml0eSIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iUHJlRGlzcGF0Y2giLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9IkRpc3BhdGNoIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuRGlzcGF0Y2hQaGFzZSI+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJSZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciIvPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiLz4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlJlcXVlc3RVUklPcGVyYXRpb25EaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSU9wZXJhdGlvbkRpc3BhdGNoZXIiLz4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciIvPgotCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJIVFRQTG9jYXRpb25CYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5IVFRQTG9jYXRpb25CYXNlZERpc3BhdGNoZXIiLz4KLSAgICAgICAgPC9waGFzZT4KLSAgICAgICAgPCEtLSAgU3lzdGVtIHByZSBkZWZpbmVkIHBoYXNlcyAgICAgICAtLT4KLSAgICAgICAgPCEtLSAgIEFmdGVyIFBvc3RkaXNwYXRjaCBwaGFzZSBtb2R1bGUgYXV0aG9yIG9yIG9yIHNlcnZpY2UgYXV0aG9yIGNhbiBhZGQgYW55IHBoYXNlIGhlIHdhbnQgICAgICAtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9InVzZXJwaGFzZTEiLz4KLSAgICA8L3BoYXNlT3JkZXI+Ci0gICAgPHBoYXNlT3JkZXIgdHlwZT0iT3V0RmxvdyI+Ci0gICAgICAgIDwhLS0gICAgICB1c2VyIGNhbiBhZGQgaGlzIG93biBwaGFzZXMgdG8gdGhpcyBhcmVhICAtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9InVzZXJwaGFzZTEiLz4KLSAgICAgICAgPCEtLXN5c3RlbSBwcmVkZWZpbmVkIHBoYXNlLS0+Ci0gICAgICAgIDwhLS10aGVzZSBwaGFzZSB3aWxsIHJ1biBpcnJlc3BlY3RpdmUgb2YgdGhlIHNlcnZpY2UtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlBvbGljeURldGVybWluYXRpb24iLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik1lc3NhZ2VPdXQiLz4KLSAgICA8L3BoYXNlT3JkZXI+Ci0gICAgPHBoYXNlT3JkZXIgdHlwZT0iSW5GYXVsdEZsb3ciPgotICAgICAgIDxwaGFzZSBuYW1lPSJUcmFuc3BvcnRJbiIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iQWRkcmVzc2luZyI+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJBZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciI+Ci0gICAgICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJBZGRyZXNzaW5nIi8+Ci0gICAgICAgICAgICA8L2hhbmRsZXI+Ci0gICAgICAgIDwvcGhhc2U+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJTZWN1cml0eSIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iUHJlRGlzcGF0Y2giLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9IkRpc3BhdGNoIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuRGlzcGF0Y2hQaGFzZSI+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJSZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciIvPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiLz4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlJlcXVlc3RVUklPcGVyYXRpb25EaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSU9wZXJhdGlvbkRpc3BhdGNoZXIiLz4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciIvPgotCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJIVFRQTG9jYXRpb25CYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5IVFRQTG9jYXRpb25CYXNlZERpc3BhdGNoZXIiLz4KLSAgICAgICAgPC9waGFzZT4KLSAgICAgICAgPCEtLSAgU3lzdGVtIHByZSBkZWZpbmVkIHBoYXNlcyAgICAgICAtLT4KLSAgICAgICAgPCEtLSAgIEFmdGVyIFBvc3RkaXNwYXRjaCBwaGFzZSBtb2R1bGUgYXV0aG9yIG9yIG9yIHNlcnZpY2UgYXV0aG9yIGNhbiBhZGQgYW55IHBoYXNlIGhlIHdhbnQgICAgICAtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9InVzZXJwaGFzZTEiLz4KLSAgICA8L3BoYXNlT3JkZXI+Ci0gICAgPHBoYXNlT3JkZXIgdHlwZT0iT3V0RmF1bHRGbG93Ij4KLSAgICAgICAgPCEtLSAgICAgIHVzZXIgY2FuIGFkZCBoaXMgb3duIHBoYXNlcyB0byB0aGlzIGFyZWEgIC0tPgotICAgICAgICA8cGhhc2UgbmFtZT0idXNlcnBoYXNlMSIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iUG9saWN5RGV0ZXJtaW5hdGlvbiIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iTWVzc2FnZU91dCIvPgotICAgIDwvcGhhc2VPcmRlcj4KLTwvYXhpc2NvbmZpZz4KLQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS91dGlsL0ZhdWx0SGFuZGxlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS91dGlsL0ZhdWx0SGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWE5MjUxLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvdXRpbC9GYXVsdEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUudXRpbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVAxMkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYXVsdENvZGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYXVsdERldGFpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhdWx0UmVhc29uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmF1bHRUZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmF1bHRWYWx1ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5oYW5kbGVycy5BYnN0cmFjdEhhbmRsZXI7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1wdWJsaWMgY2xhc3MgRmF1bHRIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyIHsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGQVVMVF9SRUFTT04gPQotICAgICAgICAgICAgIlRoaXMgaXMgYSB0ZXN0IGZhdWx0IG1lc3NhZ2Ugd2hpY2ggaGFwcGVuZWQgc3VkZGVubHkiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFVEFJTF9NT1JFX0lORk8gPQotICAgICAgICAgICAgIlRoaXMgZXJyb3IgaXMgYSByZXN1bHQgZHVlIHRvIGEgZmFrZSBwcm9ibGVtIGluIEF4aXMyIGVuZ2luZS4gRG8gbm90IHdvcnJ5IDspIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNX0ZBVUxUX0VYQ0VQVElPTiA9ICJtOkZhdWx0RXhjZXB0aW9uIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUl9IQU5ETElOR19XSVRIX01TR19DVFhUID0gIkVycm9ySGFuZGxpbmdXaXRoUGFyYW1zU2V0VG9Nc2dDdHh0IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJfSEFORExJTkdfV0lUSF9BWElTX0ZBVUxUID0KLSAgICAgICAgICAgICJFcnJvckhhbmRsaW5nV2l0aFBhcmFtc1NldFRvQXhpc0ZhdWx0IjsKLQotICAgIHB1YmxpYyBJbnZvY2F0aW9uUmVzcG9uc2UgaW52b2tlKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICAvLyB0aGlzIGhhbmRsZXIgd2lsbCBiZSB1c2VkIHRvIGNoZWNrIHRoZSBmYXVsdCBoYW5kbGluZyBvZiBBeGlzMi4KLSAgICAgICAgLy8gdGhpcyB3aWxsIGNyZWF0ZSBzb21lIGR1bW15IGZhdWx0cyBhbmQgc2VuZAotCi0gICAgICAgIFNPQVBGYWN0b3J5IHNvYXBGYWMgPSBtc2dDb250ZXh0LmlzU09BUDExKCkgPyBPTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTFGYWN0b3J5KCkgOgotICAgICAgICAgICAgICAgIE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMkZhY3RvcnkoKTsKLQotICAgICAgICAvLyBJIGhhdmUgYSBzdWRkZW4gZmFrZSBlcnJvciA7KQotICAgICAgICBPTUVsZW1lbnQgZmlyc3RFbGVtZW50ID0gbXNnQ29udGV4dC5nZXRFbnZlbG9wZSgpLmdldEJvZHkoKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQotICAgICAgICBPTUVsZW1lbnQgZGV0YWlsRW50cnkgPSBzb2FwRmFjLmNyZWF0ZU9NRWxlbWVudCgiTW9yZUluZm8iLCBudWxsKTsKLSAgICAgICAgZGV0YWlsRW50cnkuc2V0VGV4dChERVRBSUxfTU9SRV9JTkZPKTsKLQotICAgICAgICBpZiAoRVJSX0hBTkRMSU5HX1dJVEhfTVNHX0NUWFQuZXF1YWxzKGZpcnN0RWxlbWVudC5nZXRMb2NhbE5hbWUoKSkpIHsKLSAgICAgICAgICAgIFNPQVBGYXVsdENvZGUgc29hcEZhdWx0Q29kZSA9IHNvYXBGYWMuY3JlYXRlU09BUEZhdWx0Q29kZSgpOwotICAgICAgICAgICAgc29hcEZhdWx0Q29kZS5kZWNsYXJlTmFtZXNwYWNlKCJodHRwOi8vc29tZXVyaS5vcmciLCAibSIpOwotICAgICAgICAgICAgaWYgKG1zZ0NvbnRleHQuaXNTT0FQMTEoKSkgewotICAgICAgICAgICAgICAgIHNvYXBGYXVsdENvZGUuc2V0VGV4dChNX0ZBVUxUX0VYQ0VQVElPTik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFNPQVBGYXVsdFZhbHVlIHNvYXBGYXVsdFZhbHVlID0gc29hcEZhYy5jcmVhdGVTT0FQRmF1bHRWYWx1ZShzb2FwRmF1bHRDb2RlKTsKLSAgICAgICAgICAgICAgICBzb2FwRmF1bHRWYWx1ZS5zZXRUZXh0KE1fRkFVTFRfRVhDRVBUSU9OKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU09BUEZhdWx0UmVhc29uIHNvYXBGYXVsdFJlYXNvbiA9IHNvYXBGYWMuY3JlYXRlU09BUEZhdWx0UmVhc29uKCk7Ci0KLSAgICAgICAgICAgIGlmIChtc2dDb250ZXh0LmlzU09BUDExKCkpIHsKLSAgICAgICAgICAgICAgICBzb2FwRmF1bHRSZWFzb24uc2V0VGV4dChGQVVMVF9SRUFTT04pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBTT0FQRmF1bHRUZXh0IHNvYXBGYXVsdFRleHQgPSBzb2FwRmFjLmNyZWF0ZVNPQVBGYXVsdFRleHQoKTsKLSAgICAgICAgICAgICAgICBzb2FwRmF1bHRUZXh0LnNldExhbmcoImVuIik7Ci0gICAgICAgICAgICAgICAgc29hcEZhdWx0VGV4dC5zZXRUZXh0KEZBVUxUX1JFQVNPTik7Ci0gICAgICAgICAgICAgICAgc29hcEZhdWx0UmVhc29uLmFkZFNPQVBUZXh0KHNvYXBGYXVsdFRleHQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTT0FQRmF1bHREZXRhaWwgZmF1bHREZXRhaWwgPSBzb2FwRmFjLmNyZWF0ZVNPQVBGYXVsdERldGFpbCgpOwotICAgICAgICAgICAgZmF1bHREZXRhaWwuYWRkRGV0YWlsRW50cnkoZGV0YWlsRW50cnkpOwotCi0gICAgICAgICAgICBtc2dDb250ZXh0LnNldFByb3BlcnR5KFNPQVAxMkNvbnN0YW50cy5TT0FQX0ZBVUxUX0NPREVfTE9DQUxfTkFNRSwgc29hcEZhdWx0Q29kZSk7Ci0gICAgICAgICAgICBtc2dDb250ZXh0LnNldFByb3BlcnR5KFNPQVAxMkNvbnN0YW50cy5TT0FQX0ZBVUxUX1JFQVNPTl9MT0NBTF9OQU1FLCBzb2FwRmF1bHRSZWFzb24pOwotICAgICAgICAgICAgbXNnQ29udGV4dC5zZXRQcm9wZXJ0eShTT0FQMTJDb25zdGFudHMuU09BUF9GQVVMVF9ERVRBSUxfTE9DQUxfTkFNRSwgZmF1bHREZXRhaWwpOwotCi0gICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJBIGR1bW15IGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQiKTsKLSAgICAgICAgfSBlbHNlIGlmIChFUlJfSEFORExJTkdfV0lUSF9BWElTX0ZBVUxULmVxdWFscyhmaXJzdEVsZW1lbnQuZ2V0TG9jYWxOYW1lKCkpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KG5ldyBRTmFtZShNX0ZBVUxUX0VYQ0VQVElPTiksIEZBVUxUX1JFQVNPTiwgbnVsbCwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV0YWlsRW50cnkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBJbnZvY2F0aW9uUmVzcG9uc2UuQ09OVElOVUU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS91dGlsL0ZhdWx0VGhyb3dpbmdTZXJ2aWNlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL3V0aWwvRmF1bHRUaHJvd2luZ1NlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjJkNjIyMi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL3V0aWwvRmF1bHRUaHJvd2luZ1NlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUudXRpbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVAxMkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYXVsdENvZGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYXVsdERldGFpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhdWx0UmVhc29uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmF1bHRUZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmF1bHRWYWx1ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1wdWJsaWMgY2xhc3MgRmF1bHRUaHJvd2luZ1NlcnZpY2UgewotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEhST1dfRkFVTFRfQVNfQVhJU19GQVVMVCA9ICJUaHJvd0ZhdWx0QXNBeGlzRmF1bHQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRIUk9XX0ZBVUxUX1dJVEhfTVNHX0NUWFQgPSAiVGhyb3dGYXVsdFdpdGhNc2dDdHh0IjsKLQotICAgIHByaXZhdGUgU09BUEZhdWx0Q29kZSBzb2FwRmF1bHRDb2RlOwotICAgIHByaXZhdGUgU09BUEZhdWx0UmVhc29uIHNvYXBGYXVsdFJlYXNvbjsKLSAgICBwcml2YXRlIFNPQVBGYXVsdERldGFpbCBzb2FwRmF1bHREZXRhaWw7Ci0KLSAgICBwdWJsaWMgT01FbGVtZW50IGVjaG9XaXRoRmF1bHQoT01FbGVtZW50IGVjaG9PTUVsZW1lbnQpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBTdHJpbmcgdGV4dCA9IGVjaG9PTUVsZW1lbnQuZ2V0VGV4dCgpOwotICAgICAgICBpZiAoVEhST1dfRkFVTFRfQVNfQVhJU19GQVVMVC5lcXVhbHNJZ25vcmVDYXNlKHRleHQpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KG5ldyBRTmFtZSgiaHR0cDovL3Rlc3Qub3JnIiwgIlRlc3RGYXVsdCIsICJ0ZXN0IiksICJGYXVsdFJlYXNvbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBFeGNlcHRpb24oIlRoaXMgaXMgYSB0ZXN0IEV4Y2VwdGlvbiIpKTsKLSAgICAgICAgfSBlbHNlIGlmIChUSFJPV19GQVVMVF9XSVRIX01TR19DVFhULmVxdWFsc0lnbm9yZUNhc2UodGV4dCkpIHsKLSAgICAgICAgICAgIE1lc3NhZ2VDb250ZXh0IGluTWVzc2FnZUNvbnRleHQgPSBNZXNzYWdlQ29udGV4dC5nZXRDdXJyZW50TWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgICAgIGluaXRGYXVsdEluZm9ybWF0aW9uKGluTWVzc2FnZUNvbnRleHQpOwotCi0gICAgICAgICAgICBpbk1lc3NhZ2VDb250ZXh0LnNldFByb3BlcnR5KFNPQVAxMkNvbnN0YW50cy5TT0FQX0ZBVUxUX0NPREVfTE9DQUxfTkFNRSwgc29hcEZhdWx0Q29kZSk7Ci0gICAgICAgICAgICBpbk1lc3NhZ2VDb250ZXh0Ci0gICAgICAgICAgICAgICAgICAgIC5zZXRQcm9wZXJ0eShTT0FQMTJDb25zdGFudHMuU09BUF9GQVVMVF9SRUFTT05fTE9DQUxfTkFNRSwgc29hcEZhdWx0UmVhc29uKTsKLSAgICAgICAgICAgIGluTWVzc2FnZUNvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgLnNldFByb3BlcnR5KFNPQVAxMkNvbnN0YW50cy5TT0FQX0ZBVUxUX0RFVEFJTF9MT0NBTF9OQU1FLCBzb2FwRmF1bHREZXRhaWwpOwotICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiRmFrZSBleGNlcHRpb24gb2NjdXJyZWQgISEiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBlY2hvT01FbGVtZW50OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRGYXVsdEluZm9ybWF0aW9uKE1lc3NhZ2VDb250ZXh0IGluTWVzc2FnZUNvbnRleHQpIHsKLSAgICAgICAgU09BUEZhY3Rvcnkgc29hcEZhY3Rvcnk7Ci0gICAgICAgIGlmIChpbk1lc3NhZ2VDb250ZXh0LmlzU09BUDExKCkpIHsKLSAgICAgICAgICAgIHNvYXBGYWN0b3J5ID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDExRmFjdG9yeSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc29hcEZhY3RvcnkgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTJGYWN0b3J5KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBzb2FwRmF1bHRDb2RlID0gc29hcEZhY3RvcnkuY3JlYXRlU09BUEZhdWx0Q29kZSgpOwotICAgICAgICBTT0FQRmF1bHRWYWx1ZSBzb2FwRmF1bHRWYWx1ZSA9IHNvYXBGYWN0b3J5LmNyZWF0ZVNPQVBGYXVsdFZhbHVlKHNvYXBGYXVsdENvZGUpOwotICAgICAgICBzb2FwRmF1bHRWYWx1ZS5zZXRUZXh0KG5ldyBRTmFtZSgiaHR0cDovL3Rlc3Qub3JnIiwgIlRlc3RGYXVsdCIsICJ0ZXN0IikpOwotCi0gICAgICAgIHNvYXBGYXVsdFJlYXNvbiA9IHNvYXBGYWN0b3J5LmNyZWF0ZVNPQVBGYXVsdFJlYXNvbigpOwotICAgICAgICBTT0FQRmF1bHRUZXh0IHNvYXBGYXVsdFRleHQgPSBzb2FwRmFjdG9yeS5jcmVhdGVTT0FQRmF1bHRUZXh0KHNvYXBGYXVsdFJlYXNvbik7Ci0gICAgICAgIHNvYXBGYXVsdFRleHQuc2V0VGV4dCgiVGhpcyBpcyBzb21lIEZhdWx0UmVhc29uIik7Ci0KLSAgICAgICAgc29hcEZhdWx0RGV0YWlsID0gc29hcEZhY3RvcnkuY3JlYXRlU09BUEZhdWx0RGV0YWlsKCk7Ci0gICAgICAgIFFOYW1lIHFOYW1lID0gbmV3IFFOYW1lKCJodHRwOi8vc29tZXVyaS5vcmciLCAiRmF1bHRFeGNlcHRpb24iKTsKLSAgICAgICAgT01FbGVtZW50IGRldGFpbCA9IHNvYXBGYWN0b3J5LmNyZWF0ZU9NRWxlbWVudChxTmFtZSwgc29hcEZhdWx0RGV0YWlsKTsKLSAgICAgICAgcU5hbWUgPSBuZXcgUU5hbWUoImh0dHA6Ly9zb21ldXJpLm9yZyIsICJFeGNlcHRpb25NZXNzYWdlIik7Ci0gICAgICAgIFRocm93YWJsZSBlID0gbmV3IEV4Y2VwdGlvbigiVGhpcyBpcyBhIHRlc3QgRXhjZXB0aW9uIik7Ci0gICAgICAgIHdoaWxlIChlICE9IG51bGwpIHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBleGNlcHRpb24gPSBzb2FwRmFjdG9yeS5jcmVhdGVPTUVsZW1lbnQocU5hbWUsIG51bGwpOwotICAgICAgICAgICAgZXhjZXB0aW9uLnNldFRleHQoZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgZGV0YWlsLmFkZENoaWxkKGV4Y2VwdGlvbik7Ci0gICAgICAgICAgICBlID0gZS5nZXRDYXVzZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvdXRpbC9JbnZva2VyVGhyZWFkLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL3V0aWwvSW52b2tlclRocmVhZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NGUwN2UyLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvdXRpbC9JbnZva2VyVGhyZWFkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLnV0aWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuT3B0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5TZXJ2aWNlQ2xpZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaW50ZWdyYXRpb24uVGVzdGluZ1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaW50ZWdyYXRpb24uVXRpbFNlcnZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLXB1YmxpYyBjbGFzcyBJbnZva2VyVGhyZWFkIGV4dGVuZHMgVGhyZWFkIHsKLQotICAgIHByaXZhdGUgaW50IHRocmVhZE51bWJlcjsKLSAgICBwcm90ZWN0ZWQgRW5kcG9pbnRSZWZlcmVuY2UgdGFyZ2V0RVBSID0KLSAgICAgICAgICAgIG5ldyBFbmRwb2ludFJlZmVyZW5jZSgiaHR0cDovLzEyNy4wLjAuMToiCi0gICAgICAgICAgICAgICAgICAgICsgKFV0aWxTZXJ2ZXIuVEVTVElOR19QT1JUKQotICAgICAgICAgICAgICAgICAgICArICIvYXhpczIvc2VydmljZXMvRWNob1hNTFNlcnZpY2UvZWNob09NRWxlbWVudCIpOwotICAgIHByb3RlY3RlZCBRTmFtZSBvcGVyYXRpb25OYW1lID0gbmV3IFFOYW1lKCJlY2hvT01FbGVtZW50Iik7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEludm9rZXJUaHJlYWQuY2xhc3MpOwotICAgIHByaXZhdGUgRXhjZXB0aW9uIHRocm93bkV4Y2VwdGlvbiA9IG51bGw7Ci0gICAgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ29udGV4dDsKLQotICAgIHB1YmxpYyBJbnZva2VyVGhyZWFkKGludCB0aHJlYWROdW1iZXIpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICB0aGlzLnRocmVhZE51bWJlciA9IHRocmVhZE51bWJlcjsKLSAgICAgICAgY29uZmlnQ29udGV4dCA9Ci0gICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5LmNyZWF0ZUNvbmZpZ3VyYXRpb25Db250ZXh0RnJvbUZpbGVTeXN0ZW0oCi0gICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBsb2cuaW5mbygiU3RhcnRpbmcgVGhyZWFkIG51bWJlciAiICsgdGhyZWFkTnVtYmVyICsgIiAuLi4uLi4uLi4uLi4uIik7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgcGF5bG9hZCA9IFRlc3RpbmdVdGlscy5jcmVhdGVEdW1teU9NRWxlbWVudCgpOwotCi0gICAgICAgICAgICBPcHRpb25zIG9wdGlvbnMgPSBuZXcgT3B0aW9ucygpOwotICAgICAgICAgICAgb3B0aW9ucy5zZXRUbyh0YXJnZXRFUFIpOwotICAgICAgICAgICAgb3B0aW9ucy5zZXRUcmFuc3BvcnRJblByb3RvY29sKENvbnN0YW50cy5UUkFOU1BPUlRfSFRUUCk7Ci0gICAgICAgICAgICBTZXJ2aWNlQ2xpZW50IHNlbmRlciA9IG5ldyBTZXJ2aWNlQ2xpZW50KGNvbmZpZ0NvbnRleHQsIG51bGwpOwotICAgICAgICAgICAgc2VuZGVyLnNldE9wdGlvbnMob3B0aW9ucyk7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgcmVzdWx0ID0gc2VuZGVyLnNlbmRSZWNlaXZlKHBheWxvYWQpOwotCi0gICAgICAgICAgICBUZXN0aW5nVXRpbHMuY29tcGFyZVdpdGhDcmVhdGVkT01FbGVtZW50KHJlc3VsdCk7Ci0gICAgICAgICAgICBsb2cuaW5mbygiRmluaXNoaW5nIFRocmVhZCBudW1iZXIgIiArIHRocmVhZE51bWJlciArICIgLi4uLi4iKTsKLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGF4aXNGYXVsdCkgewotICAgICAgICAgICAgdGhyb3duRXhjZXB0aW9uID0gYXhpc0ZhdWx0OwotICAgICAgICAgICAgbG9nLmVycm9yKCJFcnJvciBoYXMgb2NjdXJlZCBpbnZva2luZyB0aGUgc2VydmljZSAiLCBheGlzRmF1bHQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIEV4Y2VwdGlvbiBnZXRUaHJvd25FeGNlcHRpb24oKSB7Ci0gICAgICAgIHJldHVybiB0aHJvd25FeGNlcHRpb247Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS91dGlsL1JlcXVlc3RDb3VudGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL3V0aWwvUmVxdWVzdENvdW50ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk2YjdkZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL3V0aWwvUmVxdWVzdENvdW50ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUudXRpbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5TZXJ2aWNlQ29udGV4dDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLXB1YmxpYyBjbGFzcyBSZXF1ZXN0Q291bnRlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVRVUVTVF9DT1VOVCA9ICJSZXF1ZXN0X0NvdW50IjsKLQotCXB1YmxpYyBPTUVsZW1lbnQgZ2V0UmVxdWVzdENvdW50KE9NRWxlbWVudCBvZSkgewotCQlNZXNzYWdlQ29udGV4dCBtc2cgPSBNZXNzYWdlQ29udGV4dC5nZXRDdXJyZW50TWVzc2FnZUNvbnRleHQoKTsKLQkJCi0JCUludGVnZXIgcmVxdWVzdENvdW50ID0gKEludGVnZXIpbXNnLmdldFByb3BlcnR5KFJFUVVFU1RfQ09VTlQpOwotCQlpZiAocmVxdWVzdENvdW50ID09IG51bGwpIHsKLQkJCXJlcXVlc3RDb3VudCA9IG5ldyBJbnRlZ2VyKDEpOwotCQl9IGVsc2UgewotCQkJcmVxdWVzdENvdW50ID0gbmV3IEludGVnZXIocmVxdWVzdENvdW50LmludFZhbHVlKCkgKyAxKTsKLQkJfQotICAgICAgICBTZXJ2aWNlQ29udGV4dCBzZ2MgPSBtc2cuZ2V0U2VydmljZUNvbnRleHQoKTsKLQkJc2djLnNldFByb3BlcnR5KFJFUVVFU1RfQ09VTlQsIHJlcXVlc3RDb3VudCk7Ci0JCQotCQlRTmFtZSBxbiA9IG5ldyBRTmFtZSgiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvbmFtZXNwYWNlcy8iLCAiUmVxdWVzdENvdW50IiwiYXhpczIiKTsKLQkJT01FbGVtZW50IHJlc3BvbnNlID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCkuY3JlYXRlT01FbGVtZW50KHFuKTsKLQkJcmVzcG9uc2Uuc2V0VGV4dChyZXF1ZXN0Q291bnQudG9TdHJpbmcoKSk7Ci0JCQotCQlyZXR1cm4gcmVzcG9uc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL3V0aWwvVGVzdENvbnN0YW50cy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS91dGlsL1Rlc3RDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmUxMGU5My4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL3V0aWwvVGVzdENvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS51dGlsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaW50ZWdyYXRpb24uVXRpbFNlcnZlcjsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLS8qKiBUaGlzIHdpbGwgY29udGFpbiB0aGUgaW5mb3JtYXRpb24gc2hhcmVkIGFjcm9zcyB0aGUgaW50ZWdyYXRpb24gdGVzdCBjYXNlcy4gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVGVzdENvbnN0YW50cyB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBFbmRwb2ludFJlZmVyZW5jZSB0YXJnZXRFUFIgPSBuZXcgRW5kcG9pbnRSZWZlcmVuY2UoCi0gICAgICAgICAgICAiaHR0cDovLzEyNy4wLjAuMToiICsgKFV0aWxTZXJ2ZXIuVEVTVElOR19QT1JUKQotLy8gICAgICAgICAgICAiaHR0cDovLzEyNy4wLjAuMToiICsgNTU1NgotICAgICAgICAgICAgICAgICAgICArICIvYXhpczIvc2VydmljZXMvRWNob1hNTFNlcnZpY2UvZWNob09NRWxlbWVudCIpOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBzZXJ2aWNlTmFtZSA9IG5ldyBRTmFtZSgiRWNob1hNTFNlcnZpY2UiKTsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgb3BlcmF0aW9uTmFtZSA9IG5ldyBRTmFtZSgiZWNob09NRWxlbWVudCIpOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBzd2FTZXJ2aWNlTmFtZSA9IG5ldyBRTmFtZSgiRWNob1N3QVNlcnZpY2UiKTsKLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvdXRpbC9wcm9maWxpbmcvQ2xpZW50LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL3V0aWwvcHJvZmlsaW5nL0NsaWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTY0N2VjLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvdXRpbC9wcm9maWxpbmcvQ2xpZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLnV0aWwucHJvZmlsaW5nOwotCi1wdWJsaWMgY2xhc3MgQ2xpZW50IHsKLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgQ29udGV4dE1lbW9yeUhhbmRsaW5nVXRpbCBjb250ZXh0TWVtb3J5SGFuZGxpbmdUZXN0ID0gbmV3IENvbnRleHRNZW1vcnlIYW5kbGluZ1V0aWwoKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgbG9uZyBpbml0aWFsTWVtb3J5ID0gUnVudGltZS5nZXRSdW50aW1lKCkuZnJlZU1lbW9yeSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJpbml0aWFsTWVtb3J5ID0gIiArIGluaXRpYWxNZW1vcnkpOwotICAgICAgICAgICAgaW50IG51bWJlck9mVGltZXMgPSAwOwotCi0gICAgICAgICAgICB3aGlsZSAodHJ1ZSkgewotLy8gICAgICAgICAgICB3aGlsZSAobnVtYmVyT2ZUaW1lcyA8IDUwKSB7Ci0KLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkl0ZXJhdGlvbnMgIyA9ICIgKyArK251bWJlck9mVGltZXMpOwotICAgICAgICAgICAgICAgIGNvbnRleHRNZW1vcnlIYW5kbGluZ1Rlc3QucnVuT25jZSgpOwotICAgICAgICAgICAgICAgIFJ1bnRpbWUuZ2V0UnVudGltZSgpLmdjKCk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKAotICAgICAgICAgICAgICAgICAgICAgICAgIk1lbW9yeSBVc2FnZSA9ICIgKyAoaW5pdGlhbE1lbW9yeSAtIFJ1bnRpbWUuZ2V0UnVudGltZSgpLmZyZWVNZW1vcnkoKSkpOwotCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgU3lzdGVtLmV4aXQoLTEpOwotICAgICAgICB9Ci0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL3V0aWwvcHJvZmlsaW5nL0NvbnRleHRNZW1vcnlIYW5kbGluZ1V0aWwuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvdXRpbC9wcm9maWxpbmcvQ29udGV4dE1lbW9yeUhhbmRsaW5nVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjJhNDYwLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvdXRpbC9wcm9maWxpbmcvQ29udGV4dE1lbW9yeUhhbmRsaW5nVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS51dGlsLnByb2ZpbGluZzsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50Lk9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuU2VydmljZUNsaWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS51dGlsLlRlc3RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pbnRlZ3JhdGlvbi5UZXN0aW5nVXRpbHM7Ci0KLXB1YmxpYyBjbGFzcyBDb250ZXh0TWVtb3J5SGFuZGxpbmdVdGlsIGltcGxlbWVudHMgVGVzdENvbnN0YW50cyB7Ci0KLS8vICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRW5kcG9pbnRSZWZlcmVuY2UgdGFyZ2V0RVBSID0gbmV3IEVuZHBvaW50UmVmZXJlbmNlKAotLy8gICAgICAgICAgICAiaHR0cDovLzE5Mi4xNjguMS4yMTk6IiArIDgwODAKLS8vICAgICAgICAgICAgICAgICAgICArICIvYXhpczIvc2VydmljZXMvZWNoby9lY2hvT01FbGVtZW50Iik7Ci0vLwotLy8gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBzZXJ2aWNlTmFtZSA9IG5ldyBRTmFtZSgiZWNobyIpOwotLy8gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBvcGVyYXRpb25OYW1lID0gbmV3IFFOYW1lKCJlY2hvT01FbGVtZW50Iik7Ci0KLSAgICBwdWJsaWMgQ29udGV4dE1lbW9yeUhhbmRsaW5nVXRpbCgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBydW5PbmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE9NRWxlbWVudCBwYXlsb2FkID0gVGVzdGluZ1V0aWxzLmNyZWF0ZUR1bW15T01FbGVtZW50KCk7Ci0gICAgICAgIE9wdGlvbnMgb3B0aW9ucyA9IG5ldyBPcHRpb25zKCk7Ci0gICAgICAgIG9wdGlvbnMuc2V0VHJhbnNwb3J0SW5Qcm90b2NvbChDb25zdGFudHMuVFJBTlNQT1JUX0hUVFApOwotICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0ID0KLSAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkuY3JlYXRlQ29uZmlndXJhdGlvbkNvbnRleHRGcm9tRmlsZVN5c3RlbSgKLSAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RpbmdVdGlscy5wcmVmaXhCYXNlRGlyZWN0b3J5KCJ0YXJnZXQvdGVzdC1yZXNvdXJjZXMvaW50ZWdyYXRpb25SZXBvIiksIG51bGwpOwotICAgICAgICBTZXJ2aWNlQ2xpZW50IHNlbmRlciA9IG5ldyBTZXJ2aWNlQ2xpZW50KGNvbmZpZ0NvbnRleHQsIG51bGwpOwotICAgICAgICBzZW5kZXIuc2V0T3B0aW9ucyhvcHRpb25zKTsKLSAgICAgICAgb3B0aW9ucy5zZXRUbyh0YXJnZXRFUFIpOwotICAgICAgICBPTUVsZW1lbnQgcmVzdWx0ID0gc2VuZGVyLnNlbmRSZWNlaXZlKHBheWxvYWQpOwotCi0gICAgICAgIFRlc3RpbmdVdGlscy5jb21wYXJlV2l0aENyZWF0ZWRPTUVsZW1lbnQocmVzdWx0KTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBDb250ZXh0TWVtb3J5SGFuZGxpbmdVdGlsIGNvbnRleHRNZW1vcnlIYW5kbGluZ1Rlc3QgPSBuZXcgQ29udGV4dE1lbW9yeUhhbmRsaW5nVXRpbCgpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBsb25nIGluaXRpYWxNZW1vcnkgPSBSdW50aW1lLmdldFJ1bnRpbWUoKS5mcmVlTWVtb3J5KCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImluaXRpYWxNZW1vcnkgPSAiICsgaW5pdGlhbE1lbW9yeSk7Ci0gICAgICAgICAgICBpbnQgbnVtYmVyT2ZUaW1lcyA9IDA7Ci0KLSAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJJdGVyYXRpb25zICMgPSAiICsgKytudW1iZXJPZlRpbWVzKTsKLSAgICAgICAgICAgICAgICBjb250ZXh0TWVtb3J5SGFuZGxpbmdUZXN0LnJ1bk9uY2UoKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oCi0gICAgICAgICAgICAgICAgICAgICAgICAiTWVtb3J5IFVzYWdlID0gIiArIChpbml0aWFsTWVtb3J5IC0gUnVudGltZS5nZXRSdW50aW1lKCkuZnJlZU1lbW9yeSgpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgU3lzdGVtLmV4aXQoLTEpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS91dGlsL3Byb2ZpbGluZy9TZXJ2ZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvdXRpbC9wcm9maWxpbmcvU2VydmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4YTlkOTQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS91dGlsL3Byb2ZpbGluZy9TZXJ2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUudXRpbC5wcm9maWxpbmc7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkVjaG87Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUudXRpbC5UZXN0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaW50ZWdyYXRpb24uVXRpbFNlcnZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuVXRpbHM7Ci0KLXB1YmxpYyBjbGFzcyBTZXJ2ZXIgaW1wbGVtZW50cyBUZXN0Q29uc3RhbnRzIHsKLSAgICBwcm90ZWN0ZWQgQXhpc1NlcnZpY2Ugc2VydmljZTsKLQotICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFV0aWxTZXJ2ZXIuc3RhcnQoKTsKLSAgICAgICAgc2VydmljZSA9Ci0gICAgICAgICAgICAgICAgVXRpbHMuY3JlYXRlU2ltcGxlU2VydmljZShzZXJ2aWNlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVjaG8uY2xhc3MuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uTmFtZSk7Ci0gICAgICAgIFV0aWxTZXJ2ZXIuZGVwbG95U2VydmljZShzZXJ2aWNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzaHV0ZG93bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBVdGlsU2VydmVyLnVuRGVwbG95U2VydmljZShzZXJ2aWNlTmFtZSk7Ci0gICAgICAgIFV0aWxTZXJ2ZXIuc3RvcCgpOwotICAgICAgICBVdGlsU2VydmVyLnVuRGVwbG95Q2xpZW50U2VydmljZSgpOwotICAgIH0KLQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFNlcnZlciBzZXJ2ZXIgPSBuZXcgU2VydmVyKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzZXJ2ZXIuc3RhcnQoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICBzZXJ2ZXIuc2h1dGRvd24oKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2ZhdWx0cy9GYXVsdFNlcmlhbGl6YXRpb25UZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZmF1bHRzL0ZhdWx0U2VyaWFsaXphdGlvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI2NTc2OS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZmF1bHRzL0ZhdWx0U2VyaWFsaXphdGlvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZmF1bHRzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVAxMkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYXVsdENvZGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYXVsdERldGFpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhdWx0UmVhc29uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmF1bHRUZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmF1bHRWYWx1ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuVHJhbnNwb3J0VXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLk1lc3NhZ2VDb250ZXh0QnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuVXRpbHM7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotCi1wdWJsaWMgY2xhc3MgRmF1bHRTZXJpYWxpemF0aW9uVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmF1bHRTZXJpYWxpemF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBSRUFTT04gPSAiUmVhc29uVmFsdWUiOwotCi0gICAgICAgIFNPQVBGYWN0b3J5IHNvYXBGYWN0b3J5ID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDEyRmFjdG9yeSgpOwotICAgICAgICBTT0FQRmF1bHRDb2RlIHNvYXBGYXVsdENvZGUgPSBzb2FwRmFjdG9yeS5jcmVhdGVTT0FQRmF1bHRDb2RlKCk7Ci0gICAgICAgIFNPQVBGYXVsdFZhbHVlIHNvYXBGYXVsdFZhbHVlID0gc29hcEZhY3RvcnkKLSAgICAgICAgICAgICAgICAuY3JlYXRlU09BUEZhdWx0VmFsdWUoc29hcEZhdWx0Q29kZSk7Ci0gICAgICAgIHNvYXBGYXVsdFZhbHVlLnNldFRleHQobmV3IFFOYW1lKAotICAgICAgICAgICAgICAgIFNPQVAxMkNvbnN0YW50cy5TT0FQX0VOVkVMT1BFX05BTUVTUEFDRV9VUkksICJTZW5kZXIiKSk7Ci0KLSAgICAgICAgU09BUEZhdWx0UmVhc29uIHNvYXBGYXVsdFJlYXNvbiA9IHNvYXBGYWN0b3J5LmNyZWF0ZVNPQVBGYXVsdFJlYXNvbigpOwotICAgICAgICBTT0FQRmF1bHRUZXh0IHNvYXBGYXVsdFRleHQgPSBzb2FwRmFjdG9yeQotICAgICAgICAgICAgICAgIC5jcmVhdGVTT0FQRmF1bHRUZXh0KHNvYXBGYXVsdFJlYXNvbik7Ci0gICAgICAgIHNvYXBGYXVsdFRleHQuc2V0VGV4dChSRUFTT04pOwotCi0gICAgICAgIFNPQVBGYXVsdERldGFpbCBzb2FwRmF1bHREZXRhaWwgPSBzb2FwRmFjdG9yeS5jcmVhdGVTT0FQRmF1bHREZXRhaWwoKTsKLSAgICAgICAgUU5hbWUgcU5hbWUgPSBuZXcgUU5hbWUoImh0dHA6Ly9teWNvbXBhbnkuY29tIiwgIkZhdWx0RXhjZXB0aW9uIiwgImV4Iik7Ci0gICAgICAgIE9NRWxlbWVudCBleGNlcHRpb24gPSBzb2FwRmFjdG9yeS5jcmVhdGVPTUVsZW1lbnQocU5hbWUsCi0gICAgICAgICAgICAgICAgc29hcEZhdWx0RGV0YWlsKTsKLSAgICAgICAgZXhjZXB0aW9uLnNldFRleHQoIkRldGFpbCB0ZXh0Iik7Ci0gICAgICAgIEF4aXNGYXVsdCBmYXVsdCA9IG5ldyBBeGlzRmF1bHQoc29hcEZhdWx0Q29kZSwgc29hcEZhdWx0UmVhc29uLCBudWxsLAotICAgICAgICAgICAgICAgIG51bGwsIHNvYXBGYXVsdERldGFpbCk7Ci0KLSAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHQgY2MgPSBDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkKLSAgICAgICAgICAgICAgICAuY3JlYXRlRGVmYXVsdENvbmZpZ3VyYXRpb25Db250ZXh0KCk7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IGN0eCA9IGNjLmNyZWF0ZU1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIFNPQVBGYWN0b3J5IGZhYyA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMkZhY3RvcnkoKTsKLSAgICAgICAgY3R4LnNldEVudmVsb3BlKGZhYy5nZXREZWZhdWx0RW52ZWxvcGUoKSk7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IGZhdWx0Q3R4ID0gTWVzc2FnZUNvbnRleHRCdWlsZGVyCi0gICAgICAgICAgICAgICAgLmNyZWF0ZUZhdWx0TWVzc2FnZUNvbnRleHQoY3R4LCBmYXVsdCk7Ci0KLSAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgVHJhbnNwb3J0VXRpbHMud3JpdGVNZXNzYWdlKGZhdWx0Q3R4LCBib3MpOwotCi0gICAgICAgIFN0cmluZyByZXN1bHQgPSBuZXcgU3RyaW5nKGJvcy50b0J5dGVBcnJheSgpKTsKLQotICAgICAgICAvLyBGb3IgcmlnaHQgbm93LCBqdXN0IG1ha2luZyBzdXJlIHdlIGhhdmUgYSB0ZXN0IGZvciBBWElTMi0yNzUyCi0gICAgICAgIC8vIENvbmZpcm0gcmVhc29uIHdhcyBjb3JyZWN0bHkgcHJvY2Vzc2VkCi0gICAgICAgIGFzc2VydFRydWUoIkluY29ycmVjdCBvciBtaXNzaW5nIHJlYXNvbiEiLCByZXN1bHQuaW5kZXhPZihSRUFTT04pID4gLTEpOwotICAgIH0KLQotICAgIC8vIHRlc3QgZm9yIGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvQVhJUzItMTcwMwotICAgIHB1YmxpYyB2b2lkIHRlc3RGYXVsdFJlYXNvbigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTT0FQRmFjdG9yeSBzb2FwRmFjdG9yeSA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMkZhY3RvcnkoKTsKLSAgICAgICAgT01FbGVtZW50IHJlc3BvbnNlID0gc29hcEZhY3RvcnkuY3JlYXRlT01FbGVtZW50KG5ldyBRTmFtZSgidGVzdE5zIiwKLSAgICAgICAgICAgICAgICAidGVzdCIpKTsKLSAgICAgICAgU3RyaW5nIGZhdWx0UmVhc29uID0gIm15RmF1bHRSZWFzb24iOwotICAgICAgICBBeGlzRmF1bHQgZmF1bHQgPSBuZXcgQXhpc0ZhdWx0KG5ldyBRTmFtZSgibXlRbmFtZSIpLCBmYXVsdFJlYXNvbiwKLSAgICAgICAgICAgICAgICAibXlGYXVsdE5vZGUiLCAibXlGYXVsdFJvbGUiLCByZXNwb25zZSk7Ci0KLSAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHQgY2MgPSBDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkKLSAgICAgICAgICAgICAgICAuY3JlYXRlRGVmYXVsdENvbmZpZ3VyYXRpb25Db250ZXh0KCk7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IGN0eCA9IGNjLmNyZWF0ZU1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIFNPQVBGYWN0b3J5IGZhYyA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMkZhY3RvcnkoKTsKLSAgICAgICAgY3R4LnNldEVudmVsb3BlKGZhYy5nZXREZWZhdWx0RW52ZWxvcGUoKSk7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IGZhdWx0Q3R4ID0gTWVzc2FnZUNvbnRleHRCdWlsZGVyCi0gICAgICAgICAgICAgICAgLmNyZWF0ZUZhdWx0TWVzc2FnZUNvbnRleHQoY3R4LCBmYXVsdCk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKGZhdWx0UmVhc29uLCBVdGlscy5nZXRJbmJvdW5kRmF1bHRGcm9tTWVzc2FnZUNvbnRleHQoCi0gICAgICAgICAgICAgICAgZmF1bHRDdHgpLmdldFJlYXNvbigpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZmF1bHRzL1NlbmRpbmdSZXNwb25zZUZhdWx0VGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2ZhdWx0cy9TZW5kaW5nUmVzcG9uc2VGYXVsdFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTI4NTBlMC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZmF1bHRzL1NlbmRpbmdSZXNwb25zZUZhdWx0VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmZhdWx0czsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pbnRlZ3JhdGlvbi5Mb2NhbFRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50LlNlcnZpY2VDbGllbnQ7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1wdWJsaWMgY2xhc3MgU2VuZGluZ1Jlc3BvbnNlRmF1bHRUZXN0IGV4dGVuZHMgTG9jYWxUZXN0Q2FzZSB7Ci0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBTZXJ2aWNlIHsKLSAgICAgICAgcHVibGljIE9NRWxlbWVudCBnZXRCYWRSZXNwb25zZShPTUVsZW1lbnQgZSkgewotICAgICAgICAgICAgT01GYWN0b3J5IGZhYyA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpOwotICAgICAgICAgICAgT01FbGVtZW50IGVsZW0gPSBmYWMuY3JlYXRlT01FbGVtZW50KG5ldyBRTmFtZSgiaHR0cDovL25zIiwgInRleHQiKSk7Ci0gICAgICAgICAgICBTdHJpbmcgYmFkVGV4dCA9ICJ0aGlzIGNoYXIgaXMgYmFkIC0gIiArICdcMTAnOwotICAgICAgICAgICAgZWxlbS5zZXRUZXh0KGJhZFRleHQpOwotICAgICAgICAgICAgcmV0dXJuIGVsZW07Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QmFkUmVzcG9uc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIFNFUlZJQ0UgPSAic2VydmljZSI7Ci0gICAgICAgIGRlcGxveUNsYXNzQXNTZXJ2aWNlKFNFUlZJQ0UsIFNlcnZpY2UuY2xhc3MpOwotICAgICAgICBTZXJ2aWNlQ2xpZW50IGNsaWVudCA9IGdldENsaWVudChTRVJWSUNFLCAiZ2V0QmFkUmVzcG9uc2UiKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNsaWVudC5zZW5kUmVjZWl2ZShudWxsKTsKLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGF4aXNGYXVsdCkgewotICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoaXMgaXMgTk9UIHRoZSAicmVhbCIgZmF1bHQgKHdoaWNoIHNob3VsZCBoYXZlIGJlZW4gc3dhbGxvd2VkIHdoaWxlCi0gICAgICAgICAgICAvLyB3cml0aW5nIHRoZSByZXNwb25zZSkKLSAgICAgICAgICAgIGFzc2VydEZhbHNlKCJHb3QgdW5leHBlY3RlZCBmYXVsdCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBheGlzRmF1bHQuZ2V0TWVzc2FnZSgpLmNvbnRlbnRFcXVhbHMobmV3IFN0cmluZ0J1ZmZlcigiSW52YWxpZCB3aGl0ZSBzcGFjZSBjaGFyYWN0ZXIiKSkpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2ludGVncmF0aW9uL0xvY2FsVGVzdENhc2UuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9pbnRlZ3JhdGlvbi9Mb2NhbFRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxYzcwNzcuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2ludGVncmF0aW9uL0xvY2FsVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuaW50ZWdyYXRpb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVAxMkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuT3B0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5TZXJ2aWNlQ2xpZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC51dGlsLlV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5UcmFuc3BvcnRPdXREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLldTREwyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkRpc3BhdGNoUGhhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuUGhhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuUmF3WE1MSU5Pbmx5TWVzc2FnZVJlY2VpdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLlJhd1hNTElOT3V0TWVzc2FnZVJlY2VpdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucnBjLmNsaWVudC5SUENTZXJ2aWNlQ2xpZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0LmxvY2FsLkxvY2FsVHJhbnNwb3J0UmVjZWl2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQubG9jYWwuTG9jYWxUcmFuc3BvcnRTZW5kZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi0vKioKLSAqIExvY2FsVGVzdENhc2UgaXMgYW4gZXh0ZW5kYWJsZSBiYXNlIGNsYXNzIHdoaWNoIHByb3ZpZGVzIGNvbW1vbiBmdW5jdGlvbmFsaXR5Ci0gKiBmb3IgYnVpbGRpbmcgSlVuaXQgdGVzdHMgd2hpY2ggZXhlcmNpc2UgQXhpczIgdXNpbmcgdGhlIChmYXN0LCBpbi1wcm9jZXNzKQotICogImxvY2FsIiB0cmFuc3BvcnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2NhbFRlc3RDYXNlIGV4dGVuZHMgVGVzdENhc2UgewotICAgIC8qKiBPdXIgc2VydmVyIEF4aXNDb25maWd1cmF0aW9uICovCi0gICAgcHJvdGVjdGVkIEF4aXNDb25maWd1cmF0aW9uIHNlcnZlckNvbmZpZzsKLQotICAgIC8qKiBPdXIgY2xpZW50IENvbmZpZ3VyYXRpb25Db250ZXh0ICovCi0gICAgcHJvdGVjdGVkIENvbmZpZ3VyYXRpb25Db250ZXh0IGNsaWVudEN0eDsKLQotICAgIHByb3RlY3RlZCBDb25maWd1cmF0aW9uQ29udGV4dCBzZXJ2ZXJDdHg7Ci0KLSAgICBMb2NhbFRyYW5zcG9ydFNlbmRlciBzZW5kZXIgPSBuZXcgTG9jYWxUcmFuc3BvcnRTZW5kZXIoKTsKLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIENvbmZpZ3VyYXRpb24gLSBzZXJ2ZXIgc2lkZQotICAgICAgICBzZXJ2ZXJDdHggPSBDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkuCi0gICAgICAgICAgICAgICAgY3JlYXRlQ29uZmlndXJhdGlvbkNvbnRleHRGcm9tRmlsZVN5c3RlbShudWxsKTsKLSAgICAgICAgc2VydmVyQ29uZmlnID0gc2VydmVyQ3R4LmdldEF4aXNDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgIExvY2FsVHJhbnNwb3J0UmVjZWl2ZXIuQ09ORklHX0NPTlRFWFQgPSBuZXcgQ29uZmlndXJhdGlvbkNvbnRleHQoc2VydmVyQ29uZmlnKTsKLSAgICAgICAgTG9jYWxUcmFuc3BvcnRSZWNlaXZlci5DT05GSUdfQ09OVEVYVC5zZXRTZXJ2aWNlUGF0aCgic2VydmljZXMiKTsKLSAgICAgICAgTG9jYWxUcmFuc3BvcnRSZWNlaXZlci5DT05GSUdfQ09OVEVYVC5zZXRDb250ZXh0Um9vdCgibG9jYWw6LyIpOwotICAgICAgICBUcmFuc3BvcnRPdXREZXNjcmlwdGlvbiB0T3V0ID0gbmV3IFRyYW5zcG9ydE91dERlc2NyaXB0aW9uKENvbnN0YW50cy5UUkFOU1BPUlRfTE9DQUwpOwotICAgICAgICB0T3V0LnNldFNlbmRlcihuZXcgTG9jYWxUcmFuc3BvcnRTZW5kZXIoKSk7Ci0gICAgICAgIHNlcnZlckNvbmZpZy5hZGRUcmFuc3BvcnRPdXQodE91dCk7Ci0KLS8vICAgICAgICBhZGRJblBoYXNlcyhzZXJ2ZXJDb25maWcuZ2V0SW5GbG93UGhhc2VzKCkpOwotLy8gICAgICAgIERpc3BhdGNoUGhhc2UgZHAgPSAoRGlzcGF0Y2hQaGFzZSlzZXJ2ZXJDb25maWcuZ2V0SW5GbG93UGhhc2VzKCkuZ2V0KDEpOwotLy8gICAgICAgIGRwLmFkZEhhbmRsZXIobmV3IEFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIoKSk7Ci0vLwotLy8gICAgICAgIGFkZEluUGhhc2VzKHNlcnZlckNvbmZpZy5nZXRJbkZhdWx0Rmxvd1BoYXNlcygpKTsKLS8vCi0vLyAgICAgICAgYWRkT3V0UGhhc2VzKHNlcnZlckNvbmZpZy5nZXRPdXRGbG93UGhhc2VzKCkpOwotLy8gICAgICAgIGFkZE91dFBoYXNlcyhzZXJ2ZXJDb25maWcuZ2V0T3V0RmF1bHRGbG93UGhhc2VzKCkpOwotCi0gICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgICAgIC8vIFNldCB1cCByYXcgbWVzc2FnZSByZWNlaXZlcnMgZm9yIE9NRWxlbWVudCBiYXNlZCB0ZXN0cwotCi0gICAgICAgIHNlcnZlckNvbmZpZy5hZGRNZXNzYWdlUmVjZWl2ZXIoV1NETDJDb25zdGFudHMuTUVQX1VSSV9JTl9PTkxZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBSYXdYTUxJTk9ubHlNZXNzYWdlUmVjZWl2ZXIoKSk7Ci0gICAgICAgIHNlcnZlckNvbmZpZy5hZGRNZXNzYWdlUmVjZWl2ZXIoV1NETDJDb25zdGFudHMuTUVQX1VSSV9JTl9PVVQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFJhd1hNTElOT3V0TWVzc2FnZVJlY2VpdmVyKCkpOwotICAgICAgICBzZXJ2ZXJDb25maWcuYWRkTWVzc2FnZVJlY2VpdmVyKFdTREwyQ29uc3RhbnRzLk1FUF9VUklfUk9CVVNUX0lOX09OTFksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFJhd1hNTElOT3V0TWVzc2FnZVJlY2VpdmVyKCkpOwotCi0gICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgICAgIC8vIEFuZCBjbGllbnQgc2lkZQotICAgICAgICBjbGllbnRDdHggPSBDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkuY3JlYXRlQ29uZmlndXJhdGlvbkNvbnRleHRGcm9tRmlsZVN5c3RlbShudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgd2VsbC1rbm93biBQaGFzZXMgb24gdGhlIGluIHNpZGUKLSAgICAgKgotICAgICAqIEBwYXJhbSBmbG93IHRoZSBGbG93IGluIHdoaWNoIHRvIGFkZCB0aGVzZSBQaGFzZXMKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYWRkSW5QaGFzZXMoQXJyYXlMaXN0IGZsb3cpIHsKLSAgICAgICAgZmxvdy5hZGQobmV3IFBoYXNlKCJQcmVEaXNwYXRjaCIpKTsKLSAgICAgICAgUGhhc2UgZGlzcGF0Y2hQaGFzZSA9IG5ldyBEaXNwYXRjaFBoYXNlKCJEaXNwYXRjaCIpOwotICAgICAgICBmbG93LmFkZChkaXNwYXRjaFBoYXNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgd2VsbC1rbm93biBQaGFzZXMgb24gdGhlIG91dCBzaWRlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZmxvdyB0aGUgRmxvdyBpbiB3aGljaCB0byBhZGQgdGhlc2UgUGhhc2VzCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGFkZE91dFBoYXNlcyhBcnJheUxpc3QgZmxvdykgewotICAgICAgICBmbG93LmFkZChuZXcgUGhhc2UoIk1lc3NhZ2VPdXQiKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGVwbG95IGEgY2xhc3MgYXMgYSBzZXJ2aWNlLgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIHNlcnZpY2UgbmFtZQotICAgICAqIEBwYXJhbSBteUNsYXNzIHRoZSBKYXZhIGNsYXNzIHRvIGRlcGxveSAoYWxsIG1ldGhvZHMgZXhwb3NlZCBieSBkZWZhdWx0KQotICAgICAqIEByZXR1cm4gYSBmdWxseSBjb25maWd1cmVkIEF4aXNTZXJ2aWNlLCBhbHJlYWR5IGRlcGxveWVkIGludG8gdGhlIHNlcnZlcgotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIGluIGNhc2Ugb2YgcHJvYmxlbXMKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQXhpc1NlcnZpY2UgZGVwbG95Q2xhc3NBc1NlcnZpY2UoU3RyaW5nIG5hbWUsIENsYXNzIG15Q2xhc3MpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBBeGlzU2VydmljZSBzZXJ2aWNlID0gbmV3IEF4aXNTZXJ2aWNlKG5hbWUpOwotICAgICAgICBzZXJ2aWNlLmFkZFBhcmFtZXRlcihDb25zdGFudHMuU0VSVklDRV9DTEFTUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15Q2xhc3MuZ2V0TmFtZSgpKTsKLQotICAgICAgICBVdGlscy5maWxsQXhpc1NlcnZpY2Uoc2VydmljZSwgc2VydmVyQ29uZmlnLCBudWxsLCBudWxsKTsKLQotICAgICAgICBzZXJ2ZXJDb25maWcuYWRkU2VydmljZShzZXJ2aWNlKTsKLSAgICAgICAgcmV0dXJuIHNlcnZpY2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGVwbG95IGEgY2xhc3MgYXMgYSBzZXJ2aWNlLgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIHNlcnZpY2UgbmFtZQotICAgICAqIEBwYXJhbSBteUNsYXNzIHRoZSBKYXZhIGNsYXNzIHRvIGRlcGxveSAoYWxsIG1ldGhvZHMgZXhwb3NlZCBieSBkZWZhdWx0KQotICAgICAqIEByZXR1cm4gYSBmdWxseSBjb25maWd1cmVkIEF4aXNTZXJ2aWNlLCBhbHJlYWR5IGRlcGxveWVkIGludG8gdGhlIHNlcnZlcgotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIGluIGNhc2Ugb2YgcHJvYmxlbXMKLSAgICAgKi8KLSAgICAvKioKLSAgICAgKiBEZXBsb3kgYSBjbGFzcyBhcyBhIHNlcnZpY2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgc2VydmljZSBuYW1lCi0gICAgICogQHBhcmFtIG15Q2xhc3MgdGhlIEphdmEgY2xhc3MgdG8gZGVwbG95IChhbGwgbWV0aG9kcyBleHBvc2VkIGJ5IGRlZmF1bHQpCi0gICAgICogQHBhcmFtIHNjb3BlIHRoZSBzZXJ2aWNlIHNjb3BlCi0gICAgICogQHJldHVybiBhIGZ1bGx5IGNvbmZpZ3VyZWQgQXhpc1NlcnZpY2UsIGFscmVhZHkgZGVwbG95ZWQgaW50byB0aGUgc2VydmVyCi0gICAgICogQHRocm93cyBFeGNlcHRpb24gaW4gY2FzZSBvZiBwcm9ibGVtcwotICAgICAqLwotICAgIHByb3RlY3RlZCBBeGlzU2VydmljZSBkZXBsb3lDbGFzc0FzU2VydmljZShTdHJpbmcgbmFtZSwgQ2xhc3MgbXlDbGFzcywgU3RyaW5nIHNjb3BlKQotICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgQXhpc1NlcnZpY2UobmFtZSk7Ci0gICAgICAgIGlmIChzY29wZSAhPSBudWxsKSBzZXJ2aWNlLnNldFNjb3BlKHNjb3BlKTsKLQotICAgICAgICBzZXJ2aWNlLmFkZFBhcmFtZXRlcihDb25zdGFudHMuU0VSVklDRV9DTEFTUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15Q2xhc3MuZ2V0TmFtZSgpKTsKLQotICAgICAgICBVdGlscy5maWxsQXhpc1NlcnZpY2Uoc2VydmljZSwgc2VydmVyQ29uZmlnLCBudWxsLCBudWxsKTsKLQotICAgICAgICBzZXJ2ZXJDdHguZGVwbG95U2VydmljZShzZXJ2aWNlKTsKLSAgICAgICAgcmV0dXJuIHNlcnZpY2U7Ci0gICAgfQotCi0KLQotICAgIC8qKgotICAgICAqIEdldCBhIHByZS1pbml0aWFsaXplZCBTZXJ2aWNlQ2xpZW50IHNldCB1cCB0byB0YWxrIHRvIG91ciBsb2NhbAotICAgICAqIHNlcnZlci4gIElmIHlvdSB3YW50IHRvIHNldCBvcHRpb25zLCBjYWxsIHRoaXMgYW5kIHRoZW4gdXNlIGdldE9wdGlvbnMoKQotICAgICAqIG9uIHRoZSByZXR1cm4uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGEgU2VydmljZUNsaWVudCwgcHJlLWluaXRpYWxpemVkIHRvIHRhbGsgdXNpbmcgb3VyIGxvY2FsIHNlbmRlcgotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0IGlmIHRoZXJlJ3MgYSBwcm9ibGVtCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFNlcnZpY2VDbGllbnQgZ2V0Q2xpZW50KCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIE9wdGlvbnMgb3B0cyA9IGdldE9wdGlvbnMoKTsKLSAgICAgICAgU2VydmljZUNsaWVudCBjbGllbnQgPSBuZXcgU2VydmljZUNsaWVudChjbGllbnRDdHgsIG51bGwpOwotICAgICAgICBjbGllbnQuc2V0T3B0aW9ucyhvcHRzKTsKLSAgICAgICAgcmV0dXJuIGNsaWVudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYSBwcmUtaW5pdGlhbGl6ZWQgU2VydmljZUNsaWVudCBzZXQgdXAgdG8gdGFsayB0byBvdXIgbG9jYWwKLSAgICAgKiBzZXJ2ZXIuICBJZiB5b3Ugd2FudCB0byBzZXQgb3B0aW9ucywgY2FsbCB0aGlzIGFuZCB0aGVuIHVzZSBnZXRPcHRpb25zKCkKLSAgICAgKiBvbiB0aGUgcmV0dXJuLgotICAgICAqCi0gICAgICogQHJldHVybiBhIFNlcnZpY2VDbGllbnQsIHByZS1pbml0aWFsaXplZCB0byB0YWxrIHVzaW5nIG91ciBsb2NhbCBzZW5kZXIKLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdCBpZiB0aGVyZSdzIGEgcHJvYmxlbQotICAgICAqLwotICAgIHByb3RlY3RlZCBSUENTZXJ2aWNlQ2xpZW50IGdldFJQQ0NsaWVudCgpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBPcHRpb25zIG9wdHMgPSBnZXRPcHRpb25zKCk7Ci0gICAgICAgIFJQQ1NlcnZpY2VDbGllbnQgY2xpZW50ID0gbmV3IFJQQ1NlcnZpY2VDbGllbnQoY2xpZW50Q3R4LCBudWxsKTsKLSAgICAgICAgY2xpZW50LnNldE9wdGlvbnMob3B0cyk7Ci0gICAgICAgIHJldHVybiBjbGllbnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGEgcHJlLWluaXRpYWxpemVkIFNlcnZpY2VDbGllbnQgc2V0IHVwIHRvIHRhbGsgdG8gb3VyIGxvY2FsCi0gICAgICogc2VydmVyLiAgSWYgeW91IHdhbnQgdG8gc2V0IG9wdGlvbnMsIGNhbGwgdGhpcyBhbmQgdGhlbiB1c2UgZ2V0T3B0aW9ucygpCi0gICAgICogb24gdGhlIHJldHVybi4gQ2xpZW50cyBjcmVhdGVkIHVzaW5nIHRoaXMgbWV0aG9kIGhhdmUgdGhlaXIgVG8gRVBSCi0gICAgICogcHJlc2V0IHRvIGluY2x1ZGUgdGhlIGFkZHJlc3MgZm9yIHRoZSBzZXJ2aWNlK29wZXJhdGlvbi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYSBTZXJ2aWNlQ2xpZW50LCBwcmUtaW5pdGlhbGl6ZWQgdG8gdGFsayB1c2luZyBvdXIgbG9jYWwgc2VuZGVyCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQgaWYgdGhlcmUncyBhIHByb2JsZW0KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU2VydmljZUNsaWVudCBnZXRDbGllbnQoU3RyaW5nIHNlcnZpY2VOYW1lLCBTdHJpbmcgb3BlcmF0aW9uTmFtZSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIFN0cmluZyB1cmwgPSBMb2NhbFRyYW5zcG9ydFJlY2VpdmVyLkNPTkZJR19DT05URVhULmdldFNlcnZpY2VDb250ZXh0UGF0aCgpKyIvIitzZXJ2aWNlTmFtZTsKLQotICAgICAgICBPcHRpb25zIG9wdHMgPSBnZXRPcHRpb25zKCk7Ci0gICAgICAgIG9wdHMuc2V0VG8obmV3IEVuZHBvaW50UmVmZXJlbmNlKHVybCkpOwotICAgICAgICBvcHRzLnNldEFjdGlvbihvcGVyYXRpb25OYW1lKTsKLSAgICAgICAgU2VydmljZUNsaWVudCBjbGllbnQgPSBuZXcgU2VydmljZUNsaWVudChjbGllbnRDdHgsIG51bGwpOwotICAgICAgICBjbGllbnQuc2V0T3B0aW9ucyhvcHRzKTsKLSAgICAgICAgcmV0dXJuIGNsaWVudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYW4gT3B0aW9ucyBvYmplY3QgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgcmlnaHQgdHJhbnNwb3J0IGluZm8sIGRlZmF1bHRpbmcgdG8gU09BUCAxLjIKLSAgICAgKgotICAgICAqIEByZXR1cm4gcHJlLWluaXRpYWxpemVkIE9wdGlvbnMgb2JqZWN0Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIE9wdGlvbnMgZ2V0T3B0aW9ucygpIHsKLSAgICAgICAgVHJhbnNwb3J0T3V0RGVzY3JpcHRpb24gdGQgPSBuZXcgVHJhbnNwb3J0T3V0RGVzY3JpcHRpb24oImxvY2FsIik7Ci0gICAgICAgIHRkLnNldFNlbmRlcihzZW5kZXIpOwotCi0gICAgICAgIE9wdGlvbnMgb3B0cyA9IG5ldyBPcHRpb25zKCk7Ci0gICAgICAgIG9wdHMuc2V0VHJhbnNwb3J0T3V0KHRkKTsKLSAgICAgICAgb3B0cy5zZXRTb2FwVmVyc2lvblVSSShTT0FQMTJDb25zdGFudHMuU09BUF9FTlZFTE9QRV9OQU1FU1BBQ0VfVVJJKTsKLSAgICAgICAgcmV0dXJuIG9wdHM7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2ludGVncmF0aW9uL0xvY2FsV2l0aEFkZHJlc3NpbmdUZXN0Q2FzZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2ludGVncmF0aW9uL0xvY2FsV2l0aEFkZHJlc3NpbmdUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMGY5MDM1Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9pbnRlZ3JhdGlvbi9Mb2NhbFdpdGhBZGRyZXNzaW5nVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5pbnRlZ3JhdGlvbjsKLQotCi0vKioKLSAqIExvY2FsV2l0aEFkZHJlc3NpbmdUZXN0Q2FzZSBpcyBhbiBleHRlbmRhYmxlIGJhc2UgY2xhc3Mgd2hpY2ggcHJvdmlkZXMgY29tbW9uIGZ1bmN0aW9uYWxpdHkKLSAqIGZvciBidWlsZGluZyBKVW5pdCB0ZXN0cyB3aGljaCBleGVyY2lzZSBBeGlzMiB1c2luZyB0aGUgKGZhc3QsIGluLXByb2Nlc3MpCi0gKiAibG9jYWwiIHRyYW5zcG9ydCAod2l0aCB0aGUgYWRkcmVzc2luZyBtb2R1bGUgZW5nYWdlZCkuCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2NhbFdpdGhBZGRyZXNzaW5nVGVzdENhc2UgZXh0ZW5kcyBMb2NhbFRlc3RDYXNlIHsKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIAlzdXBlci5zZXRVcCgpOwotICAgICAgICAvLyBOT1RFIDogSWYgeW91IHdhbnQgYWRkcmVzc2luZyAod2hpY2ggeW91IHByb2JhYmx5IGRvKSwgd2UgY2FuIGRvIHNvbWV0aGluZwotICAgICAgICAvLyBsaWtlIHRoaXMsIG9yIHdlIGNhbiBwdWxsIGl0IG9mZiB0aGUgY2xhc3NwYXRoIChiZXR0ZXIgc29sdXRpb24/KQotICAgICAgICAKLSAgICAJU3RyaW5nIGFkZHJlc3NpbmdNb2R1bGVMb2NhdGlvbiA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiYmFzZWRpciIsIi4iKSsiL3RhcmdldC90ZXN0LXJlc291cmNlcy9sb2NhbC9hZGRyZXNzaW5nLm1hciI7Ci0gICAgCQotICAgICAgICBzZXJ2ZXJDb25maWcuZGVwbG95TW9kdWxlKGFkZHJlc3NpbmdNb2R1bGVMb2NhdGlvbik7Ci0gICAgICAgIHNlcnZlckNvbmZpZy5lbmdhZ2VNb2R1bGUoImFkZHJlc3NpbmciKTsKLSAgICAgICAgCi0gICAgICAgIGNsaWVudEN0eC5nZXRBeGlzQ29uZmlndXJhdGlvbigpLmRlcGxveU1vZHVsZShhZGRyZXNzaW5nTW9kdWxlTG9jYXRpb24pOwotICAgICAgICBjbGllbnRDdHguZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5lbmdhZ2VNb2R1bGUoImFkZHJlc3NpbmciKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvaW50ZWdyYXRpb24vUlBDTG9jYWxUZXN0Q2FzZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2ludGVncmF0aW9uL1JQQ0xvY2FsVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTVhZTM4OC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvaW50ZWdyYXRpb24vUlBDTG9jYWxUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmludGVncmF0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50Lk9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5XU0RMMkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJwYy5jbGllbnQuUlBDU2VydmljZUNsaWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJwYy5yZWNlaXZlcnMuUlBDSW5Pbmx5TWVzc2FnZVJlY2VpdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucnBjLnJlY2VpdmVycy5SUENNZXNzYWdlUmVjZWl2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQubG9jYWwuTG9jYWxUcmFuc3BvcnRSZWNlaXZlcjsKLQotLyoqCi0gKiBMb2NhbFRlc3RDYXNlIGlzIGFuIGV4dGVuZGFibGUgYmFzZSBjbGFzcyB3aGljaCBwcm92aWRlcyBjb21tb24gZnVuY3Rpb25hbGl0eQotICogZm9yIGJ1aWxkaW5nIEpVbml0IHRlc3RzIHdoaWNoIGV4ZXJjaXNlIEF4aXMyIHVzaW5nIHRoZSAoZmFzdCwgaW4tcHJvY2VzcykKLSAqICJsb2NhbCIgdHJhbnNwb3J0LgotICovCi1wdWJsaWMgY2xhc3MgUlBDTG9jYWxUZXN0Q2FzZSBleHRlbmRzIExvY2FsVGVzdENhc2UgewotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgICAgIC8vIFNldCB1cCByYXcgbWVzc2FnZSByZWNlaXZlcnMgZm9yIFJQQyBiYXNlZCB0ZXN0cwotCi0gICAgICAgIHNlcnZlckNvbmZpZy5hZGRNZXNzYWdlUmVjZWl2ZXIoV1NETDJDb25zdGFudHMuTUVQX1VSSV9JTl9PTkxZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBSUENJbk9ubHlNZXNzYWdlUmVjZWl2ZXIoKSk7Ci0gICAgICAgIHNlcnZlckNvbmZpZy5hZGRNZXNzYWdlUmVjZWl2ZXIoV1NETDJDb25zdGFudHMuTUVQX1VSSV9JTl9PVVQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFJQQ01lc3NhZ2VSZWNlaXZlcigpKTsKLSAgICAgICAgc2VydmVyQ29uZmlnLmFkZE1lc3NhZ2VSZWNlaXZlcihXU0RMMkNvbnN0YW50cy5NRVBfVVJJX1JPQlVTVF9JTl9PTkxZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBSUENNZXNzYWdlUmVjZWl2ZXIoKSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEdldCBhIHByZS1pbml0aWFsaXplZCBTZXJ2aWNlQ2xpZW50IHNldCB1cCB0byB0YWxrIHRvIG91ciBsb2NhbAotICAgICAqIHNlcnZlci4gIElmIHlvdSB3YW50IHRvIHNldCBvcHRpb25zLCBjYWxsIHRoaXMgYW5kIHRoZW4gdXNlIGdldE9wdGlvbnMoKQotICAgICAqIG9uIHRoZSByZXR1cm4uIENsaWVudHMgY3JlYXRlZCB1c2luZyB0aGlzIG1ldGhvZCBoYXZlIHRoZWlyIFRvIEVQUgotICAgICAqIHByZXNldCB0byBpbmNsdWRlIHRoZSBhZGRyZXNzIGZvciB0aGUgc2VydmljZStvcGVyYXRpb24uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGEgU2VydmljZUNsaWVudCwgcHJlLWluaXRpYWxpemVkIHRvIHRhbGsgdXNpbmcgb3VyIGxvY2FsIHNlbmRlcgotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0IGlmIHRoZXJlJ3MgYSBwcm9ibGVtCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFJQQ1NlcnZpY2VDbGllbnQgZ2V0UlBDQ2xpZW50KFN0cmluZyBzZXJ2aWNlTmFtZSwgU3RyaW5nIG9wZXJhdGlvbk5hbWUpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBTdHJpbmcgdXJsID0gTG9jYWxUcmFuc3BvcnRSZWNlaXZlci5DT05GSUdfQ09OVEVYVC5nZXRTZXJ2aWNlQ29udGV4dFBhdGgoKSsiLyIrc2VydmljZU5hbWU7Ci0KLSAgICAgICAgT3B0aW9ucyBvcHRzID0gZ2V0T3B0aW9ucygpOwotICAgICAgICBvcHRzLnNldFRvKG5ldyBFbmRwb2ludFJlZmVyZW5jZSh1cmwpKTsKLSAgICAgICAgb3B0cy5zZXRBY3Rpb24ob3BlcmF0aW9uTmFtZSk7Ci0gICAgICAgIFJQQ1NlcnZpY2VDbGllbnQgY2xpZW50ID0gbmV3IFJQQ1NlcnZpY2VDbGllbnQoY2xpZW50Q3R4LCBudWxsKTsKLSAgICAgICAgY2xpZW50LnNldE9wdGlvbnMob3B0cyk7Ci0gICAgICAgIHJldHVybiBjbGllbnQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2ludGVncmF0aW9uL1Rlc3RpbmdVdGlscy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2ludGVncmF0aW9uL1Rlc3RpbmdVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzIxZDVkLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9pbnRlZ3JhdGlvbi9UZXN0aW5nVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5pbnRlZ3JhdGlvbjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01OYW1lc3BhY2U7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIFRlc3RpbmdVdGlscyB7Ci0gICAgcHVibGljIHN0YXRpYyBPTUVsZW1lbnQgY3JlYXRlRHVtbXlPTUVsZW1lbnQoKSB7Ci0gICAgICAgIE9NRmFjdG9yeSBmYWMgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKTsKLSAgICAgICAgT01OYW1lc3BhY2Ugb21OcyA9IGZhYy5jcmVhdGVPTU5hbWVzcGFjZSgiaHR0cDovL29yZy5hcGFjaGUuYXhpczIveHNkIiwgIm5zMSIpOwotICAgICAgICBPTUVsZW1lbnQgbWV0aG9kID0gZmFjLmNyZWF0ZU9NRWxlbWVudCgiZWNob09NIiwgb21Ocyk7Ci0gICAgICAgIE9NRWxlbWVudCB2YWx1ZSA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoIm15VmFsdWUiLCBvbU5zKTsKLSAgICAgICAgdmFsdWUuYWRkQ2hpbGQoCi0gICAgICAgICAgICAgICAgZmFjLmNyZWF0ZU9NVGV4dCh2YWx1ZSwgIklzYWFjIEFzaW1vdiwgVGhlIEZvdW5kYXRpb24gVHJpbG9neSIpKTsKLSAgICAgICAgbWV0aG9kLmFkZENoaWxkKHZhbHVlKTsKLSAgICAgICAgcmV0dXJuIG1ldGhvZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9NRWxlbWVudCBjcmVhdGVEdW1teU9NRWxlbWVudChTdHJpbmcgbmFtZVNwYWNlKSB7Ci0gICAgICAgIE9NRmFjdG9yeSBmYWMgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKTsKLSAgICAgICAgT01OYW1lc3BhY2Ugb21OcyA9IGZhYy5jcmVhdGVPTU5hbWVzcGFjZShuYW1lU3BhY2UsICJuczEiKTsKLSAgICAgICAgT01FbGVtZW50IG1ldGhvZCA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoImVjaG9PTSIsIG9tTnMpOwotICAgICAgICBPTUVsZW1lbnQgdmFsdWUgPSBmYWMuY3JlYXRlT01FbGVtZW50KCJteVZhbHVlIiwgb21Ocyk7Ci0gICAgICAgIHZhbHVlLmFkZENoaWxkKAotICAgICAgICAgICAgICAgIGZhYy5jcmVhdGVPTVRleHQodmFsdWUsICJJc2FhYyBBc2ltb3YsIFRoZSBGb3VuZGF0aW9uIFRyaWxvZ3kiKSk7Ci0gICAgICAgIG1ldGhvZC5hZGRDaGlsZCh2YWx1ZSk7Ci0gICAgICAgIHJldHVybiBtZXRob2Q7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY29tcGFyZVdpdGhDcmVhdGVkT01FbGVtZW50KE9NRWxlbWVudCBlbGVtZW50KSB7Ci0gICAgICAgIE9NRWxlbWVudCBmaXJzdENoaWxkID0gZWxlbWVudC5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgICAgVGVzdENhc2UuYXNzZXJ0Tm90TnVsbChmaXJzdENoaWxkKTsKLSAgICAgICAgU3RyaW5nIHRleHRWYWx1ZSA9IGZpcnN0Q2hpbGQuZ2V0VGV4dCgpOwotICAgICAgICBUZXN0Q2FzZS5hc3NlcnRFcXVhbHModGV4dFZhbHVlLCAiSXNhYWMgQXNpbW92LCBUaGUgRm91bmRhdGlvbiBUcmlsb2d5Iik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcHJlZml4QmFzZURpcmVjdG9yeShTdHJpbmcgcGF0aCkgewotICAgICAgICBTdHJpbmcgYmFzZURpcjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJhc2VEaXIgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoImJhc2VkaXIiLCAiLiIpKS5nZXRDYW5vbmljYWxQYXRoKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBiYXNlRGlyICsgIi8iICsgcGF0aDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvaW50ZWdyYXRpb24vVXRpbFNlcnZlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2ludGVncmF0aW9uL1V0aWxTZXJ2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmYxODJlMC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvaW50ZWdyYXRpb24vVXRpbFNlcnZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5pbnRlZ3JhdGlvbjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuU2VydmljZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LlNlcnZpY2VHcm91cENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LkRlcGxveW1lbnRFbmdpbmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzTW9kdWxlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5UcmFuc3BvcnRJbkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkxpc3RlbmVyTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLlNpbXBsZUhUVFBTZXJ2ZXI7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVuYW1lRmlsdGVyOwotCi1wdWJsaWMgY2xhc3MgVXRpbFNlcnZlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IGNvdW50ID0gMDsKLQotICAgIHByaXZhdGUgc3RhdGljIFNpbXBsZUhUVFBTZXJ2ZXIgcmVjZWl2ZXI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBURVNUSU5HX1BPUlQgPSA1NTU1OwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFJTFVSRV9NRVNTQUdFID0gIkludGVudGlvbmFsIEZhaWx1cmUiOwotCi0KLSAgICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIGRlcGxveVNlcnZpY2UoQXhpc1NlcnZpY2Ugc2VydmljZSkKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICByZWNlaXZlci5nZXRDb25maWd1cmF0aW9uQ29udGV4dCgpLmdldEF4aXNDb25maWd1cmF0aW9uKCkuYWRkU2VydmljZSgKLSAgICAgICAgICAgICAgICBzZXJ2aWNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIHVuRGVwbG95U2VydmljZShRTmFtZSBzZXJ2aWNlKQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIHJlY2VpdmVyLmdldENvbmZpZ3VyYXRpb25Db250ZXh0KCkuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKQotICAgICAgICAgICAgICAgIC5yZW1vdmVTZXJ2aWNlKHNlcnZpY2UuZ2V0TG9jYWxQYXJ0KCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgdW5EZXBsb3lDbGllbnRTZXJ2aWNlKCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIGlmIChyZWNlaXZlci5nZXRDb25maWd1cmF0aW9uQ29udGV4dCgpLmdldEF4aXNDb25maWd1cmF0aW9uKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgcmVjZWl2ZXIuZ2V0Q29uZmlndXJhdGlvbkNvbnRleHQoKS5nZXRBeGlzQ29uZmlndXJhdGlvbigpCi0gICAgICAgICAgICAgICAgICAgIC5yZW1vdmVTZXJ2aWNlKCJBbm9ueW1vdXNTZXJ2aWNlIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIHN0YXJ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN0YXJ0KFRlc3RpbmdVdGlscy5wcmVmaXhCYXNlRGlyZWN0b3J5KENvbnN0YW50cy5URVNUSU5HX1JFUE9TSVRPUlkpKTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgc3RhcnQoU3RyaW5nIHJlcG9zaXRvcnkpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoY291bnQgPT0gMCkgewotICAgICAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHQgZXIgPSBnZXROZXdDb25maWd1cmF0aW9uQ29udGV4dChyZXBvc2l0b3J5KTsKLQotICAgICAgICAgICAgcmVjZWl2ZXIgPSBuZXcgU2ltcGxlSFRUUFNlcnZlcihlciwgVEVTVElOR19QT1JUKTsKLQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByZWNlaXZlci5zdGFydCgpOwotICAgICAgICAgICAgICAgIExpc3RlbmVyTWFuYWdlciBsaXN0ZW5lck1hbmFnZXIgPSBlci5nZXRMaXN0ZW5lck1hbmFnZXIoKTsKLSAgICAgICAgICAgICAgICBUcmFuc3BvcnRJbkRlc2NyaXB0aW9uIHRyc0luID0gbmV3IFRyYW5zcG9ydEluRGVzY3JpcHRpb24oQ29uc3RhbnRzLlRSQU5TUE9SVF9IVFRQKTsKLSAgICAgICAgICAgICAgICB0cnNJbi5zZXRSZWNlaXZlcihyZWNlaXZlcik7Ci0gICAgICAgICAgICAgICAgbGlzdGVuZXJNYW5hZ2VyLmFkZExpc3RlbmVyKHRyc0luLCB0cnVlKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJTZXJ2ZXIgc3RhcnRlZCBvbiBwb3J0ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgVEVTVElOR19QT1JUICsgIi4uLi4uIik7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDIwMDApOwotICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlMSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiVGhyZWFkIGludGVydXB0dGVkIiwgZTEpOwotICAgICAgICB9Ci0KLQotICAgICAgICBjb3VudCsrOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgc3RhcnQoU3RyaW5nIHJlcG9zaXRvcnksIFN0cmluZyBheGlzMnhtbCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChjb3VudCA9PSAwKSB7Ci0gICAgICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBlciA9IGdldE5ld0NvbmZpZ3VyYXRpb25Db250ZXh0KHJlcG9zaXRvcnksIGF4aXMyeG1sKTsKLQotICAgICAgICAgICAgcmVjZWl2ZXIgPSBuZXcgU2ltcGxlSFRUUFNlcnZlcihlciwgVEVTVElOR19QT1JUKTsKLQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByZWNlaXZlci5zdGFydCgpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIlNlcnZlciBzdGFydGVkIG9uIHBvcnQgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBURVNUSU5HX1BPUlQgKyAiLi4uLi4iKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMjAwMCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlMSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoIlRocmVhZCBpbnRlcnVwdHRlZCIsIGUxKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICAgIGNvdW50Kys7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBDb25maWd1cmF0aW9uQ29udGV4dCBnZXROZXdDb25maWd1cmF0aW9uQ29udGV4dCgKLSAgICAgICAgICAgIFN0cmluZyByZXBvc2l0b3J5KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUocmVwb3NpdG9yeSk7Ci0gICAgICAgIGlmICghZmlsZS5leGlzdHMoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigicmVwb3NpdG9yeSBkaXJlY3RvcnkgIgotICAgICAgICAgICAgICAgICAgICArIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiIGRvZXMgbm90IGV4aXN0cyIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkKLSAgICAgICAgICAgICAgICAuY3JlYXRlQ29uZmlndXJhdGlvbkNvbnRleHRGcm9tRmlsZVN5c3RlbShmaWxlLmdldEFic29sdXRlUGF0aCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9jb25mL2F4aXMyLnhtbCIpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQ29uZmlndXJhdGlvbkNvbnRleHQgZ2V0TmV3Q29uZmlndXJhdGlvbkNvbnRleHQoCi0gICAgICAgICAgICBTdHJpbmcgcmVwb3NpdG9yeSwgU3RyaW5nIGF4aXMyeG1sKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoVGVzdGluZ1V0aWxzLnByZWZpeEJhc2VEaXJlY3RvcnkocmVwb3NpdG9yeSkpOwotICAgICAgICBpZiAoIWZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oInJlcG9zaXRvcnkgZGlyZWN0b3J5ICIKLSAgICAgICAgICAgICAgICAgICAgKyBmaWxlLmdldEFic29sdXRlUGF0aCgpICsgIiBkb2VzIG5vdCBleGlzdHMiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5Ci0gICAgICAgICAgICAgICAgLmNyZWF0ZUNvbmZpZ3VyYXRpb25Db250ZXh0RnJvbUZpbGVTeXN0ZW0oZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzMnhtbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdG9wKCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIGlmIChjb3VudCA9PSAxKSB7Ci0gICAgICAgICAgICByZWNlaXZlci5zdG9wKCk7Ci0gICAgICAgICAgICB3aGlsZSAocmVjZWl2ZXIuaXNSdW5uaW5nKCkpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZTEpIHsKLSAgICAgICAgICAgICAgICAgICAgLy9ub3RoaW5nIHRvIGRvIGhlcmUKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjb3VudCA9IDA7Ci0vLyB0cC5kb1N0b3AoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIlNlcnZlciBzdG9wcGVkIC4uLi4uIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjb3VudC0tOwotICAgICAgICB9Ci0gICAgICAgIHJlY2VpdmVyLmdldENvbmZpZ3VyYXRpb25Db250ZXh0KCkudGVybWluYXRlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBDb25maWd1cmF0aW9uQ29udGV4dCBnZXRDb25maWd1cmF0aW9uQ29udGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIHJlY2VpdmVyLmdldENvbmZpZ3VyYXRpb25Db250ZXh0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTZXJ2aWNlQ29udGV4dCBjcmVhdGVBZHJlc3NlZEVuYWJsZWRDbGllbnRTaWRlKAotICAgICAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIEZpbGUgZmlsZSA9IGdldEFkZHJlc3NpbmdNQVJGaWxlKCk7Ci0gICAgICAgIFRlc3RDYXNlLmFzc2VydFRydWUoZmlsZS5leGlzdHMoKSk7Ci0gICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQgPSBDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkKLSAgICAgICAgICAgICAgICAuY3JlYXRlQ29uZmlndXJhdGlvbkNvbnRleHRGcm9tRmlsZVN5c3RlbSgKLSAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RpbmdVdGlscy5wcmVmaXhCYXNlRGlyZWN0b3J5KCJ0YXJnZXQvdGVzdC1yZXNvdXJjZXMvaW50ZWdyYXRpb25SZXBvIiksIG51bGwpOwotICAgICAgICBBeGlzTW9kdWxlIGF4aXNNb2R1bGUgPSBEZXBsb3ltZW50RW5naW5lLmJ1aWxkTW9kdWxlKGZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpKTsKLSAgICAgICAgY29uZmlnQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpLmFkZE1vZHVsZShheGlzTW9kdWxlKTsKLQotICAgICAgICBjb25maWdDb250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCkuYWRkU2VydmljZShzZXJ2aWNlKTsKLQotCi0gICAgICAgIFNlcnZpY2VHcm91cENvbnRleHQgc2VydmljZUdyb3VwQ29udGV4dCA9Ci0gICAgICAgICAgICAgICAgY29uZmlnQ29udGV4dC5jcmVhdGVTZXJ2aWNlR3JvdXBDb250ZXh0KHNlcnZpY2UuZ2V0QXhpc1NlcnZpY2VHcm91cCgpKTsKLSAgICAgICAgcmV0dXJuIHNlcnZpY2VHcm91cENvbnRleHQuZ2V0U2VydmljZUNvbnRleHQoc2VydmljZSk7Ci0gICAgfQotCi0gICAgc3RhdGljIGNsYXNzIEFkZHJlc3NpbmdGaWx0ZXIgaW1wbGVtZW50cyBGaWxlbmFtZUZpbHRlciB7Ci0gICAgICAgIHB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGRpciwgU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgICAgIHJldHVybiBuYW1lLnN0YXJ0c1dpdGgoImFkZHJlc3NpbmciKSAmJiBuYW1lLmVuZHNXaXRoKCIubWFyIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBGaWxlIGdldEFkZHJlc3NpbmdNQVJGaWxlKCkgewotICAgICAgICBGaWxlIGRpciA9IG5ldyBGaWxlKFRlc3RpbmdVdGlscy5wcmVmaXhCYXNlRGlyZWN0b3J5KENvbnN0YW50cy5URVNUSU5HX1JFUE9TSVRPUlkgKyAiL21vZHVsZXMiKSk7Ci0gICAgICAgIEZpbGVbXSBmaWxlcyA9IGRpci5saXN0RmlsZXMobmV3IEFkZHJlc3NpbmdGaWx0ZXIoKSk7Ci0gICAgICAgIFRlc3RDYXNlLmFzc2VydFRydWUoZmlsZXMubGVuZ3RoID09IDEpOwotICAgICAgICBGaWxlIGZpbGUgPSBmaWxlc1swXTsKLSAgICAgICAgVGVzdENhc2UuYXNzZXJ0VHJ1ZShmaWxlLmV4aXN0cygpKTsKLSAgICAgICAgcmV0dXJuIGZpbGU7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBDb25maWd1cmF0aW9uQ29udGV4dCBjcmVhdGVDbGllbnRDb25maWd1cmF0aW9uQ29udGV4dCgpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBGaWxlIGZpbGUgPSBnZXRBZGRyZXNzaW5nTUFSRmlsZSgpOwotICAgICAgICBUZXN0Q2FzZS5hc3NlcnRUcnVlKGZpbGUuZXhpc3RzKCkpOwotCi0gICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQgPQotICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeSAuY3JlYXRlQ29uZmlndXJhdGlvbkNvbnRleHRGcm9tRmlsZVN5c3RlbSgKLSAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RpbmdVdGlscy5wcmVmaXhCYXNlRGlyZWN0b3J5KENvbnN0YW50cy5URVNUSU5HX1BBVEggKyIvaW50ZWdyYXRpb25SZXBvIiksCi0gICAgICAgICAgICAgICAgICAgICAgICBUZXN0aW5nVXRpbHMucHJlZml4QmFzZURpcmVjdG9yeShDb25zdGFudHMuVEVTVElOR19QQVRIICsgIi9pbnRlZ3JhdGlvblJlcG8vY29uZi9heGlzMi54bWwiKSk7Ci0gICAgICAgIEF4aXNNb2R1bGUgYXhpc01vZHVsZSA9IERlcGxveW1lbnRFbmdpbmUuYnVpbGRNb2R1bGUoZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWdDb250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCkpOwotICAgICAgICBjb25maWdDb250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCkuYWRkTW9kdWxlKGF4aXNNb2R1bGUpOwotICAgICAgICByZXR1cm4gY29uZmlnQ29udGV4dDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIENvbmZpZ3VyYXRpb25Db250ZXh0IGNyZWF0ZUNsaWVudENvbmZpZ3VyYXRpb25Db250ZXh0KFN0cmluZyByZXBvKQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIHJldHVybiBDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkgLmNyZWF0ZUNvbmZpZ3VyYXRpb25Db250ZXh0RnJvbUZpbGVTeXN0ZW0oCi0gICAgICAgICAgICAgICAgcmVwbywKLSAgICAgICAgICAgICAgICByZXBvICsgIi9jb25mL2F4aXMyLnhtbCIpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU2VydmljZUNvbnRleHQgY3JlYXRlQWRyZXNzZWRFbmFibGVkQ2xpZW50U2lkZSgKLSAgICAgICAgICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2UsIFN0cmluZyBjbGllbnRIb21lKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgRmlsZSBmaWxlID0gZ2V0QWRkcmVzc2luZ01BUkZpbGUoKTsKLSAgICAgICAgVGVzdENhc2UuYXNzZXJ0VHJ1ZShmaWxlLmV4aXN0cygpKTsKLQotICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0ID0gQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5Ci0gICAgICAgICAgICAgICAgLmNyZWF0ZUNvbmZpZ3VyYXRpb25Db250ZXh0RnJvbUZpbGVTeXN0ZW0oY2xpZW50SG9tZSwgbnVsbCk7Ci0gICAgICAgIEF4aXNNb2R1bGUgYXhpc01vZHVsZSA9IERlcGxveW1lbnRFbmdpbmUuYnVpbGRNb2R1bGUoZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWdDb250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCkpOwotCi0gICAgICAgIGNvbmZpZ0NvbnRleHQuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5hZGRNb2R1bGUoYXhpc01vZHVsZSk7Ci0vLyBzeXNDb250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCkuZW5nYWdlTW9kdWxlKG1vZHVsZURlc2MuZ2V0TmFtZSgpKTsKLQotICAgICAgICBjb25maWdDb250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCkuYWRkU2VydmljZShzZXJ2aWNlKTsKLSAgICAgICAgU2VydmljZUdyb3VwQ29udGV4dCBzZXJ2aWNlR3JvdXBDb250ZXh0ID0KLSAgICAgICAgICAgICAgICBjb25maWdDb250ZXh0LmNyZWF0ZVNlcnZpY2VHcm91cENvbnRleHQoc2VydmljZS5nZXRBeGlzU2VydmljZUdyb3VwKCkpOwotICAgICAgICByZXR1cm4gc2VydmljZUdyb3VwQ29udGV4dC5nZXRTZXJ2aWNlQ29udGV4dChzZXJ2aWNlKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9pbnRlZ3JhdGlvbi9VdGlsU2VydmVyQmFzZWRUZXN0Q2FzZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2ludGVncmF0aW9uL1V0aWxTZXJ2ZXJCYXNlZFRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0Yjc3OTEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2ludGVncmF0aW9uL1V0aWxTZXJ2ZXJCYXNlZFRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuaW50ZWdyYXRpb247Ci0KLWltcG9ydCBqdW5pdC5leHRlbnNpb25zLlRlc3RTZXR1cDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBVdGlsU2VydmVyQmFzZWRUZXN0Q2FzZSBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHB1YmxpYyBVdGlsU2VydmVyQmFzZWRUZXN0Q2FzZSgpIHsKLSAgICAgICAgc3VwZXIoVXRpbFNlcnZlckJhc2VkVGVzdENhc2UuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVXRpbFNlcnZlckJhc2VkVGVzdENhc2UoamF2YS5sYW5nLlN0cmluZyBzdHJpbmcpIHsKLSAgICAgICAgc3VwZXIoc3RyaW5nKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIFRlc3QgZ2V0VGVzdFNldHVwKFRlc3QgdGVzdCkgewotICAgICAgICByZXR1cm4gbmV3IFRlc3RTZXR1cCh0ZXN0KSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAgICAgICAgIFV0aWxTZXJ2ZXIuc3RhcnQoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBVdGlsU2VydmVyLnN0b3AoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIFRlc3QgZ2V0VGVzdFNldHVwMihUZXN0IHRlc3QsIGZpbmFsIFN0cmluZyBwYXJhbSkgewotICAgICAgICByZXR1cm4gbmV3IFRlc3RTZXR1cCh0ZXN0KSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAgICAgICAgIFV0aWxTZXJ2ZXIuc3RhcnQocGFyYW0pOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAgICAgICAgIFV0aWxTZXJ2ZXIuc3RvcCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgIH0KLQotICAgIHByb3RlY3RlZCBzdGF0aWMgVGVzdCBnZXRUZXN0U2V0dXAzKFRlc3QgdGVzdCwgZmluYWwgU3RyaW5nIHBhcmFtMSwgZmluYWwgU3RyaW5nIHBhcmFtMikgewotICAgICAgICByZXR1cm4gbmV3IFRlc3RTZXR1cCh0ZXN0KSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAgICAgICAgIFV0aWxTZXJ2ZXIuc3RhcnQocGFyYW0xLCBwYXJhbTIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAgICAgICAgIFV0aWxTZXJ2ZXIuc3RvcCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9tdG9tL0VjaG9SYXdNVE9NQ29tbW9uc0NodW5raW5nVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL210b20vRWNob1Jhd01UT01Db21tb25zQ2h1bmtpbmdUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI0MTc5NDQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL210b20vRWNob1Jhd01UT01Db21tb25zQ2h1bmtpbmdUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLm10b207Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01OYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTVRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmxsb20uT01UZXh0SW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUDEyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50Lk9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuU2VydmljZUNsaWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkVjaG87Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUudXRpbC5UZXN0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaW50ZWdyYXRpb24uVGVzdGluZ1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaW50ZWdyYXRpb24uVXRpbFNlcnZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmludGVncmF0aW9uLlV0aWxTZXJ2ZXJCYXNlZFRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5VdGlsczsKLQotaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXI7Ci1pbXBvcnQgamF2YXguYWN0aXZhdGlvbi5GaWxlRGF0YVNvdXJjZTsKLQotcHVibGljIGNsYXNzIEVjaG9SYXdNVE9NQ29tbW9uc0NodW5raW5nVGVzdCBleHRlbmRzIFV0aWxTZXJ2ZXJCYXNlZFRlc3RDYXNlCi0gICAgICAgIGltcGxlbWVudHMgVGVzdENvbnN0YW50cyB7Ci0KLSAgICBwcml2YXRlIE9NRWxlbWVudCBkYXRhOwotICAgIHByaXZhdGUgU3RyaW5nIGZpbGVOYW1lID0gVGVzdGluZ1V0aWxzLnByZWZpeEJhc2VEaXJlY3RvcnkoInRlc3QtcmVzb3VyY2VzL210b20vdGVzdC5qcGciKTsKLQotICAgIHB1YmxpYyBFY2hvUmF3TVRPTUNvbW1vbnNDaHVua2luZ1Rlc3QoKSB7Ci0gICAgICAgIHN1cGVyKEVjaG9SYXdNVE9NQ29tbW9uc0NodW5raW5nVGVzdC5jbGFzcy5nZXROYW1lKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBFY2hvUmF3TVRPTUNvbW1vbnNDaHVua2luZ1Rlc3QoU3RyaW5nIHRlc3ROYW1lKSB7Ci0gICAgICAgIHN1cGVyKHRlc3ROYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIHJldHVybiBnZXRUZXN0U2V0dXAyKG5ldyBUZXN0U3VpdGUoRWNob1Jhd01UT01Db21tb25zQ2h1bmtpbmdUZXN0LmNsYXNzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVzdGluZ1V0aWxzLnByZWZpeEJhc2VEaXJlY3RvcnkoQ29uc3RhbnRzLlRFU1RJTkdfUEFUSCArICJNVE9NLWVuYWJsZWRSZXBvc2l0b3J5IikpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2UgPSBVdGlscy5jcmVhdGVTaW1wbGVTZXJ2aWNlKHNlcnZpY2VOYW1lLCBFY2hvLmNsYXNzLmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uTmFtZSk7Ci0gICAgICAgIFV0aWxTZXJ2ZXIuZGVwbG95U2VydmljZShzZXJ2aWNlKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBVdGlsU2VydmVyLnVuRGVwbG95U2VydmljZShzZXJ2aWNlTmFtZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBPTUVsZW1lbnQgY3JlYXRlRW52ZWxvcGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICBEYXRhSGFuZGxlciBleHBlY3RlZERIOwotICAgICAgICBPTUZhY3RvcnkgZmFjID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCk7Ci0gICAgICAgIE9NTmFtZXNwYWNlIG9tTnMgPSBmYWMuY3JlYXRlT01OYW1lc3BhY2UoImh0dHA6Ly9sb2NhbGhvc3QvbXkiLCAibXkiKTsKLSAgICAgICAgT01FbGVtZW50IHJwY1dyYXBFbGUgPSBmYWMuY3JlYXRlT01FbGVtZW50KCJlY2hvT01FbGVtZW50Iiwgb21Ocyk7Ci0gICAgICAgIGRhdGEgPSBmYWMuY3JlYXRlT01FbGVtZW50KCJkYXRhIiwgb21Ocyk7Ci0gICAgICAgIEZpbGVEYXRhU291cmNlIGRhdGFTb3VyY2UgPSBuZXcgRmlsZURhdGFTb3VyY2UoZmlsZU5hbWUpOwotICAgICAgICBleHBlY3RlZERIID0gbmV3IERhdGFIYW5kbGVyKGRhdGFTb3VyY2UpOwotICAgICAgICBPTUVsZW1lbnQgc3ViRGF0YSA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoInN1YkRhdGEiLCBvbU5zKTsKLSAgICAgICAgT01UZXh0IHRleHREYXRhID0gbmV3IE9NVGV4dEltcGwoZXhwZWN0ZWRESCwgZmFjKTsKLSAgICAgICAgc3ViRGF0YS5hZGRDaGlsZCh0ZXh0RGF0YSk7Ci0gICAgICAgIGRhdGEuYWRkQ2hpbGQoc3ViRGF0YSk7Ci0gICAgICAgIHJwY1dyYXBFbGUuYWRkQ2hpbGQoZGF0YSk7Ci0gICAgICAgIHJldHVybiBycGNXcmFwRWxlOwotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEVjaG9YTUxTeW5jKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgT01FbGVtZW50IHBheWxvYWQgPSBjcmVhdGVFbnZlbG9wZSgpOwotCi0gICAgICAgIE9wdGlvbnMgb3B0aW9ucyA9IG5ldyBPcHRpb25zKCk7Ci0gICAgICAgIG9wdGlvbnMuc2V0VG8odGFyZ2V0RVBSKTsKLSAgICAgICAgb3B0aW9ucy5zZXRQcm9wZXJ0eShDb25zdGFudHMuQ29uZmlndXJhdGlvbi5FTkFCTEVfTVRPTSwgQ29uc3RhbnRzLlZBTFVFX1RSVUUpOwotICAgICAgICBvcHRpb25zLnNldFRyYW5zcG9ydEluUHJvdG9jb2woQ29uc3RhbnRzLlRSQU5TUE9SVF9IVFRQKTsKLQotICAgICAgICBvcHRpb25zLnNldFNvYXBWZXJzaW9uVVJJKFNPQVAxMkNvbnN0YW50cy5TT0FQX0VOVkVMT1BFX05BTUVTUEFDRV9VUkkpOwotCi0gICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQgPQotICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeS5jcmVhdGVDb25maWd1cmF0aW9uQ29udGV4dEZyb21GaWxlU3lzdGVtKAotICAgICAgICAgICAgICAgICAgICAgICAgVGVzdGluZ1V0aWxzLnByZWZpeEJhc2VEaXJlY3RvcnkoQ29uc3RhbnRzLlRFU1RJTkdfUEFUSCArICJjb21tb25zLWh0dHAtZW5hYmxlZFJlcG9zaXRvcnkiKSwgbnVsbCk7Ci0gICAgICAgIFNlcnZpY2VDbGllbnQgc2VuZGVyID0gbmV3IFNlcnZpY2VDbGllbnQoY29uZmlnQ29udGV4dCwgbnVsbCk7Ci0gICAgICAgIHNlbmRlci5zZXRPcHRpb25zKG9wdGlvbnMpOwotICAgICAgICBvcHRpb25zLnNldFRvKHRhcmdldEVQUik7Ci0KLSAgICAgICAgT01FbGVtZW50IHJldCA9IHNlbmRlci5zZW5kUmVjZWl2ZShwYXlsb2FkKTsKLSAgICAgICAgcmV0LmJ1aWxkKCk7Ci0gICAgICAgIHRoaXMuY29tcGFyZVdpdGhDcmVhdGVkT01FbGVtZW50KHJldCk7Ci0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY29tcGFyZVdpdGhDcmVhdGVkT01FbGVtZW50KE9NRWxlbWVudCBlbGVtZW50KSB7Ci0gICAgICAgIE9NRWxlbWVudCBmaXJzdENoaWxkID0gZWxlbWVudC5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgICAgVGVzdENhc2UuYXNzZXJ0Tm90TnVsbChmaXJzdENoaWxkKTsKLSAgICAgICAgU3RyaW5nIG9yaWdpbmFsVGV4dFZhbHVlID0gZGF0YS5nZXRGaXJzdEVsZW1lbnQoKS5nZXRUZXh0KCk7Ci0gICAgICAgIFN0cmluZyByZXR1cm5lZFRleHRWYWx1ZSA9IGZpcnN0Q2hpbGQuZ2V0Rmlyc3RFbGVtZW50KCkuZ2V0VGV4dCgpOwotICAgICAgICBUZXN0Q2FzZS5hc3NlcnRFcXVhbHMocmV0dXJuZWRUZXh0VmFsdWUsIG9yaWdpbmFsVGV4dFZhbHVlKTsKLSAgICB9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvbXRvbS9FY2hvUmF3TVRPTUZhdWx0UmVwb3J0VGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL210b20vRWNob1Jhd01UT01GYXVsdFJlcG9ydFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNlMjM3My4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvbXRvbS9FY2hvUmF3TVRPTUZhdWx0UmVwb3J0VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5tdG9tOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLk91dEluQXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmludGVncmF0aW9uLlRlc3RpbmdVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmludGVncmF0aW9uLlV0aWxTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pbnRlZ3JhdGlvbi5VdGlsU2VydmVyQmFzZWRUZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5SYXdYTUxJTk91dE1lc3NhZ2VSZWNlaXZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuV1NETENvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5IdHRwQ2xpZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50Lkh0dHBNZXRob2Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQuSHR0cE1ldGhvZFJldHJ5SGFuZGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5IdHRwU3RhdHVzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50Lk5vSHR0cFJlc3BvbnNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50Lm1ldGhvZHMuSW5wdXRTdHJlYW1SZXF1ZXN0RW50aXR5OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50Lm1ldGhvZHMuUG9zdE1ldGhvZDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5wYXJhbXMuSHR0cE1ldGhvZFBhcmFtczsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIEVjaG9SYXdNVE9NRmF1bHRSZXBvcnRUZXN0IGV4dGVuZHMgVXRpbFNlcnZlckJhc2VkVGVzdENhc2UgewotCi0gICAgcHJpdmF0ZSBRTmFtZSBzZXJ2aWNlTmFtZSA9IG5ldyBRTmFtZSgiRWNob1NlcnZpY2UiKTsKLQotICAgIHByaXZhdGUgUU5hbWUgb3BlcmF0aW9uTmFtZSA9IG5ldyBRTmFtZSgibXRvbVNhbXBsZSIpOwotCi0gICAgcHVibGljIEVjaG9SYXdNVE9NRmF1bHRSZXBvcnRUZXN0KCkgewotICAgICAgICBzdXBlcihFY2hvUmF3TVRPTUZhdWx0UmVwb3J0VGVzdC5jbGFzcy5nZXROYW1lKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBFY2hvUmF3TVRPTUZhdWx0UmVwb3J0VGVzdChTdHJpbmcgdGVzdE5hbWUpIHsKLSAgICAgICAgc3VwZXIodGVzdE5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgcmV0dXJuIGdldFRlc3RTZXR1cDIobmV3IFRlc3RTdWl0ZShFY2hvUmF3TVRPTUZhdWx0UmVwb3J0VGVzdC5jbGFzcyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RpbmdVdGlscy5wcmVmaXhCYXNlRGlyZWN0b3J5KENvbnN0YW50cy5URVNUSU5HX1BBVEggKyAiTVRPTS1lbmFibGVkUmVwb3NpdG9yeSIpKTsKLSAgICB9Ci0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgQXhpc1NlcnZpY2Uoc2VydmljZU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICBzZXJ2aWNlLnNldENsYXNzTG9hZGVyKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkpOwotICAgICAgICBzZXJ2aWNlLmFkZFBhcmFtZXRlcihuZXcgUGFyYW1ldGVyKENvbnN0YW50cy5TRVJWSUNFX0NMQVNTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVjaG9TZXJ2aWNlLmNsYXNzLmdldE5hbWUoKSkpOwotCi0gICAgICAgIEF4aXNPcGVyYXRpb24gYXhpc09wID0gbmV3IE91dEluQXhpc09wZXJhdGlvbihvcGVyYXRpb25OYW1lKTsKLSAgICAgICAgYXhpc09wLnNldE1lc3NhZ2VSZWNlaXZlcihuZXcgUmF3WE1MSU5PdXRNZXNzYWdlUmVjZWl2ZXIoKSk7Ci0gICAgICAgIGF4aXNPcC5zZXRTdHlsZShXU0RMQ29uc3RhbnRzLlNUWUxFX0RPQyk7Ci0gICAgICAgIHNlcnZpY2UuYWRkT3BlcmF0aW9uKGF4aXNPcCk7Ci0gICAgICAgIFV0aWxTZXJ2ZXIuZGVwbG95U2VydmljZShzZXJ2aWNlKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBVdGlsU2VydmVyLnVuRGVwbG95U2VydmljZShzZXJ2aWNlTmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEVjaG9GYXVsdFN5bmMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgSHR0cENsaWVudCBjbGllbnQgPSBuZXcgSHR0cENsaWVudCgpOwotCi0gICAgICAgIFBvc3RNZXRob2QgaHR0cHBvc3QgPSBuZXcgUG9zdE1ldGhvZCgiaHR0cDovLzEyNy4wLjAuMToiCi0gICAgICAgICAgICAgICAgKyAoVXRpbFNlcnZlci5URVNUSU5HX1BPUlQpCi0gICAgICAgICAgICAgICAgKyAiL2F4aXMyL3NlcnZpY2VzL0VjaG9TZXJ2aWNlL210b21TYW1wbGUiKTsKLQotICAgICAgICBIdHRwTWV0aG9kUmV0cnlIYW5kbGVyIG15cmV0cnloYW5kbGVyID0gbmV3IEh0dHBNZXRob2RSZXRyeUhhbmRsZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiByZXRyeU1ldGhvZChmaW5hbCBIdHRwTWV0aG9kIG1ldGhvZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElPRXhjZXB0aW9uIGV4Y2VwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBleGVjdXRpb25Db3VudCkgewotICAgICAgICAgICAgICAgIGlmIChleGVjdXRpb25Db3VudCA+PSAxMCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChleGNlcHRpb24gaW5zdGFuY2VvZiBOb0h0dHBSZXNwb25zZUV4Y2VwdGlvbikgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCFtZXRob2QuaXNSZXF1ZXN0U2VudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBvdGhlcndpc2UgZG8gbm90IHJldHJ5Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICBodHRwcG9zdC5nZXRQYXJhbXMoKS5zZXRQYXJhbWV0ZXIoSHR0cE1ldGhvZFBhcmFtcy5SRVRSWV9IQU5ETEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXlyZXRyeWhhbmRsZXIpOwotICAgICAgICBodHRwcG9zdC5zZXRSZXF1ZXN0RW50aXR5KG5ldyBJbnB1dFN0cmVhbVJlcXVlc3RFbnRpdHkoCi0gICAgICAgICAgICAgICAgbmV3IEZpbGVJbnB1dFN0cmVhbShUZXN0aW5nVXRpbHMucHJlZml4QmFzZURpcmVjdG9yeSgidGVzdC1yZXNvdXJjZXMvbXRvbS93bXRvbS5iaW4iKSkpKTsKLQotICAgICAgICBodHRwcG9zdC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LVR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtdWx0aXBhcnQvcmVsYXRlZDsgYm91bmRhcnk9LS1NSU1FQm91bmRhcnkyNThERTJEMTA1Mjk4Qjc1NkQ7IHR5cGU9XCJhcHBsaWNhdGlvbi94b3AreG1sXCI7IHN0YXJ0PVwiPDAuMTVCNTBFRjQ5MzE3NTE4QjAxQGFwYWNoZS5vcmc+XCI7IHN0YXJ0LWluZm89XCJhcHBsaWNhdGlvbi9zb2FwK3htbFwiIik7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjbGllbnQuZXhlY3V0ZU1ldGhvZChodHRwcG9zdCk7Ci0KLSAgICAgICAgICAgIGlmIChodHRwcG9zdC5nZXRTdGF0dXNDb2RlKCkgPT0KLSAgICAgICAgICAgICAgICAgICAgSHR0cFN0YXR1cy5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IpIHsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBUT0RPOiBUaGVyZSBpcyBhIG1pc3Npbmcgd3NhOkFjdGlvbiBoZWFkZXIgaW4gdGhlIFNPQVAgbWVzc2FnZS4gIEZpeCBvciBsb29rIGZvciBjb3JyZWN0IGZhdWx0IHRleHQhCi0KLS8vICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygiSFRUUC8xLjEgNTAwIEludGVybmFsIHNlcnZlciBlcnJvciIsCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cHBvc3QuZ2V0U3RhdHVzTGluZSgpLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChOb0h0dHBSZXNwb25zZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBodHRwcG9zdC5yZWxlYXNlQ29ubmVjdGlvbigpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL210b20vRWNob1Jhd01UT01GaWxlQ2FjaGVMb2FkVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL210b20vRWNob1Jhd01UT01GaWxlQ2FjaGVMb2FkVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjMxNjhiLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9tdG9tL0VjaG9SYXdNVE9NRmlsZUNhY2hlTG9hZFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5tdG9tOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkVjaG87Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pbnRlZ3JhdGlvbi5UZXN0aW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pbnRlZ3JhdGlvbi5VdGlsU2VydmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5VdGlsczsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLXB1YmxpYyBjbGFzcyBFY2hvUmF3TVRPTUZpbGVDYWNoZUxvYWRUZXN0IGV4dGVuZHMgRWNob1Jhd01UT01Mb2FkVGVzdCB7Ci0KLSAgICBwcml2YXRlIFFOYW1lIHNlcnZpY2VOYW1lID0gbmV3IFFOYW1lKCJFY2hvWE1MU2VydmljZSIpOwotCi0gICAgcHJpdmF0ZSBRTmFtZSBvcGVyYXRpb25OYW1lID0gbmV3IFFOYW1lKCJlY2hvT01FbGVtZW50Iik7Ci0KLSAgICBwcml2YXRlIEF4aXNTZXJ2aWNlIHNlcnZpY2U7Ci0KLSAgICBwdWJsaWMgRWNob1Jhd01UT01GaWxlQ2FjaGVMb2FkVGVzdCgpIHsKLSAgICAgICAgc3VwZXIoRWNob1Jhd01UT01GaWxlQ2FjaGVMb2FkVGVzdC5jbGFzcy5nZXROYW1lKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBFY2hvUmF3TVRPTUZpbGVDYWNoZUxvYWRUZXN0KFN0cmluZyB0ZXN0TmFtZSkgewotICAgICAgICBzdXBlcih0ZXN0TmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotICAgICAgICByZXR1cm4gZ2V0VGVzdFNldHVwMihuZXcgVGVzdFN1aXRlKEVjaG9SYXdNVE9NRmlsZUNhY2hlTG9hZFRlc3QuY2xhc3MpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXN0aW5nVXRpbHMucHJlZml4QmFzZURpcmVjdG9yeShDb25zdGFudHMuVEVTVElOR19QQVRIICsgIk1UT00tZmlsZUNhY2hlLWVuYWJsZWRSZXBvc2l0b3J5IikpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHNlcnZpY2UgPSBVdGlscy5jcmVhdGVTaW1wbGVTZXJ2aWNlKHNlcnZpY2VOYW1lLCBFY2hvLmNsYXNzLmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uTmFtZSk7Ci0gICAgICAgIFV0aWxTZXJ2ZXIuZGVwbG95U2VydmljZShzZXJ2aWNlKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBVdGlsU2VydmVyLnVuRGVwbG95U2VydmljZShzZXJ2aWNlTmFtZSk7Ci0gICAgICAgIFV0aWxTZXJ2ZXIudW5EZXBsb3lDbGllbnRTZXJ2aWNlKCk7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RWNob1hNTFN5bmMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIudGVzdEVjaG9YTUxTeW5jKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL210b20vRWNob1Jhd01UT01GaWxlQ2FjaGVUZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvbXRvbS9FY2hvUmF3TVRPTUZpbGVDYWNoZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRiNWY5YS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvbXRvbS9FY2hvUmF3TVRPTUZpbGVDYWNoZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5tdG9tOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkVjaG87Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pbnRlZ3JhdGlvbi5UZXN0aW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pbnRlZ3JhdGlvbi5VdGlsU2VydmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5VdGlsczsKLQotcHVibGljIGNsYXNzIEVjaG9SYXdNVE9NRmlsZUNhY2hlVGVzdCBleHRlbmRzIEVjaG9SYXdNVE9NVGVzdCB7Ci0KLSAgICBwcml2YXRlIEF4aXNTZXJ2aWNlIHNlcnZpY2U7Ci0KLQotICAgIHB1YmxpYyBFY2hvUmF3TVRPTUZpbGVDYWNoZVRlc3QoKSB7Ci0gICAgICAgIHN1cGVyKEVjaG9SYXdNVE9NRmlsZUNhY2hlVGVzdC5jbGFzcy5nZXROYW1lKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBFY2hvUmF3TVRPTUZpbGVDYWNoZVRlc3QoU3RyaW5nIHRlc3ROYW1lKSB7Ci0gICAgICAgIHN1cGVyKHRlc3ROYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIHJldHVybiBnZXRUZXN0U2V0dXAyKG5ldyBUZXN0U3VpdGUoRWNob1Jhd01UT01GaWxlQ2FjaGVUZXN0LmNsYXNzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVzdGluZ1V0aWxzLnByZWZpeEJhc2VEaXJlY3RvcnkoQ29uc3RhbnRzLlRFU1RJTkdfUEFUSCArICJNVE9NLWZpbGVDYWNoZS1lbmFibGVkUmVwb3NpdG9yeSIpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzZXJ2aWNlID0gVXRpbHMuY3JlYXRlU2ltcGxlU2VydmljZShzZXJ2aWNlTmFtZSwgRWNoby5jbGFzcy5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbk5hbWUpOwotICAgICAgICBVdGlsU2VydmVyLmRlcGxveVNlcnZpY2Uoc2VydmljZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgVXRpbFNlcnZlci51bkRlcGxveVNlcnZpY2Uoc2VydmljZU5hbWUpOwotICAgICAgICBVdGlsU2VydmVyLnVuRGVwbG95Q2xpZW50U2VydmljZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFY2hvWE1MQVN5bmMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIudGVzdEVjaG9YTUxBU3luYygpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFY2hvWE1MU3luYygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci50ZXN0RWNob1hNTFN5bmMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RWNob1hNTFN5bmNTZXBlcmF0ZUxpc3RlbmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnRlc3RFY2hvWE1MU3luY1NlcGVyYXRlTGlzdGVuZXIoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvbXRvbS9FY2hvUmF3TVRPTUxvYWRUZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvbXRvbS9FY2hvUmF3TVRPTUxvYWRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwNmZhNjkuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL210b20vRWNob1Jhd01UT01Mb2FkVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5tdG9tOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01OYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTVRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmxsb20uT01UZXh0SW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUDEyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50Lk9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuU2VydmljZUNsaWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuU2VydmljZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5FY2hvOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLnV0aWwuVGVzdENvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmludGVncmF0aW9uLlRlc3RpbmdVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmludGVncmF0aW9uLlV0aWxTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pbnRlZ3JhdGlvbi5VdGlsU2VydmVyQmFzZWRUZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC5hY3RpdmF0aW9uLkRhdGFIYW5kbGVyOwotCi1wdWJsaWMgY2xhc3MgRWNob1Jhd01UT01Mb2FkVGVzdCBleHRlbmRzIFV0aWxTZXJ2ZXJCYXNlZFRlc3RDYXNlIGltcGxlbWVudHMgVGVzdENvbnN0YW50cyB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coRWNob1Jhd01UT01Mb2FkVGVzdC5jbGFzcyk7Ci0KLSAgICBwcml2YXRlIFNlcnZpY2VDb250ZXh0IHNlcnZpY2VDb250ZXh0OwotCi0gICAgcHJpdmF0ZSBBeGlzU2VydmljZSBzZXJ2aWNlOwotCi0gICAgcHJpdmF0ZSBPTVRleHQgdGV4dERhdGE7Ci0KLQotICAgIGJ5dGVbXSBleHBlY3RlZEJ5dGVBcnJheTsKLQotICAgIHB1YmxpYyBFY2hvUmF3TVRPTUxvYWRUZXN0KCkgewotICAgICAgICBzdXBlcihFY2hvUmF3TVRPTUxvYWRUZXN0LmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIEVjaG9SYXdNVE9NTG9hZFRlc3QoU3RyaW5nIHRlc3ROYW1lKSB7Ci0gICAgICAgIHN1cGVyKHRlc3ROYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIHJldHVybiBnZXRUZXN0U2V0dXAyKG5ldyBUZXN0U3VpdGUoRWNob1Jhd01UT01Mb2FkVGVzdC5jbGFzcyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RpbmdVdGlscy5wcmVmaXhCYXNlRGlyZWN0b3J5KENvbnN0YW50cy5URVNUSU5HX1BBVEggKyAiTVRPTS1lbmFibGVkUmVwb3NpdG9yeSIpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzZXJ2aWNlID0gVXRpbHMuY3JlYXRlU2ltcGxlU2VydmljZShzZXJ2aWNlTmFtZSwgRWNoby5jbGFzcy5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbk5hbWUpOwotICAgICAgICBVdGlsU2VydmVyLmRlcGxveVNlcnZpY2Uoc2VydmljZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgVXRpbFNlcnZlci51bkRlcGxveVNlcnZpY2Uoc2VydmljZU5hbWUpOwotICAgICAgICBVdGlsU2VydmVyLnVuRGVwbG95Q2xpZW50U2VydmljZSgpOwotICAgIH0KLQotCi0gICAgcHJvdGVjdGVkIE9NRWxlbWVudCBjcmVhdGVFbnZlbG9wZSgpIHsKLQotICAgICAgICBPTUZhY3RvcnkgZmFjID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCk7Ci0gICAgICAgIE9NTmFtZXNwYWNlIG9tTnMgPSBmYWMuY3JlYXRlT01OYW1lc3BhY2UoImh0dHA6Ly9sb2NhbGhvc3QvbXkiLCAibXkiKTsKLSAgICAgICAgT01FbGVtZW50IHJwY1dyYXBFbGUgPSBmYWMuY3JlYXRlT01FbGVtZW50KCJlY2hvT01FbGVtZW50Iiwgb21Ocyk7Ci0gICAgICAgIE9NRWxlbWVudCBkYXRhID0gZmFjLmNyZWF0ZU9NRWxlbWVudCgiZGF0YSIsIG9tTnMpOwotICAgICAgICBleHBlY3RlZEJ5dGVBcnJheSA9IG5ldyBieXRlW10geyAxMywgNTYsIDY1LCAzMiwgMTIsIDEyLCA3LCAtMywgLTIsIC0xLAotICAgICAgICAgICAgICAgIDk4IH07Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgc3ViRGF0YSA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoInN1YkRhdGEiLCBvbU5zKTsKLSAgICAgICAgICAgIERhdGFIYW5kbGVyIGRhdGFIYW5kbGVyID0gbmV3IERhdGFIYW5kbGVyKCJUaGlsaW5hIiwgInRleHQvcGxhaW4iKTsKLSAgICAgICAgICAgIC8vbmV3IEJ5dGVBcnJheURhdGFTb3VyY2UoZXhwZWN0ZWRCeXRlQXJyYXkpKTsKLSAgICAgICAgICAgIHRleHREYXRhID0gbmV3IE9NVGV4dEltcGwoZGF0YUhhbmRsZXIsIHRydWUsIGZhYyk7Ci0gICAgICAgICAgICBzdWJEYXRhLmFkZENoaWxkKHRleHREYXRhKTsKLSAgICAgICAgICAgIGRhdGEuYWRkQ2hpbGQoc3ViRGF0YSk7Ci0KLSAgICAgICAgfQotCi0gICAgICAgIHJwY1dyYXBFbGUuYWRkQ2hpbGQoZGF0YSk7Ci0gICAgICAgIHJldHVybiBycGNXcmFwRWxlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFY2hvWE1MU3luYygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBwYXlsb2FkID0gY3JlYXRlRW52ZWxvcGUoKTsKLSAgICAgICAgICAgIE9wdGlvbnMgb3B0aW9ucyA9IG5ldyBPcHRpb25zKCk7Ci0gICAgICAgICAgICBvcHRpb25zLnNldFRvKHRhcmdldEVQUik7Ci0gICAgICAgICAgICBvcHRpb25zLnNldFByb3BlcnR5KENvbnN0YW50cy5Db25maWd1cmF0aW9uLkVOQUJMRV9NVE9NLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuVkFMVUVfVFJVRSk7Ci0gICAgICAgICAgICBvcHRpb25zLnNldFRyYW5zcG9ydEluUHJvdG9jb2woQ29uc3RhbnRzLlRSQU5TUE9SVF9IVFRQKTsKLSAgICAgICAgICAgIG9wdGlvbnMuc2V0U29hcFZlcnNpb25VUkkoU09BUDEyQ29uc3RhbnRzLlNPQVBfRU5WRUxPUEVfTkFNRVNQQUNFX1VSSSk7Ci0gICAgICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0ID0KLSAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5LmNyZWF0ZUNvbmZpZ3VyYXRpb25Db250ZXh0RnJvbUZpbGVTeXN0ZW0oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVzdGluZ1V0aWxzLnByZWZpeEJhc2VEaXJlY3RvcnkoInRhcmdldC90ZXN0LXJlc291cmNlcy9pbnRlZ3JhdGlvblJlcG8iKSwgbnVsbCk7Ci0gICAgICAgICAgICBTZXJ2aWNlQ2xpZW50IHNlbmRlciA9IG5ldyBTZXJ2aWNlQ2xpZW50KGNvbmZpZ0NvbnRleHQsIG51bGwpOwotICAgICAgICAgICAgc2VuZGVyLnNldE9wdGlvbnMob3B0aW9ucyk7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgcmVzdWx0ID0gc2VuZGVyLnNlbmRSZWNlaXZlKHBheWxvYWQpOwotCi0gICAgICAgICAgICBPTUVsZW1lbnQgZWxlID0gKE9NRWxlbWVudClyZXN1bHQuZ2V0Rmlyc3RPTUNoaWxkKCk7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgZWxlMSA9IChPTUVsZW1lbnQpZWxlLmdldEZpcnN0T01DaGlsZCgpOwotICAgICAgICAgICAgT01UZXh0IGJpbmFyeU5vZGUgPSAoT01UZXh0KWVsZTEuZ2V0Rmlyc3RPTUNoaWxkKCk7Ci0gICAgICAgICAgICBjb21wYXJlV2l0aEFjdHVhbE9NVGV4dChiaW5hcnlOb2RlKTsKLSAgICAgICAgICAgIE9NRWxlbWVudCBlbGUyID0gKE9NRWxlbWVudCllbGUxLmdldE5leHRPTVNpYmxpbmcoKTsKLSAgICAgICAgICAgIGJpbmFyeU5vZGUgPSAoT01UZXh0KWVsZTIuZ2V0Rmlyc3RPTUNoaWxkKCk7Ci0gICAgICAgICAgICBjb21wYXJlV2l0aEFjdHVhbE9NVGV4dChiaW5hcnlOb2RlKTsKLSAgICAgICAgICAgIGxvZy5pbmZvKCIiICsgaSk7Ci0gICAgICAgICAgICBVdGlsU2VydmVyLnVuRGVwbG95Q2xpZW50U2VydmljZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgY29tcGFyZVdpdGhBY3R1YWxPTVRleHQoT01UZXh0IGJpbmFyeU5vZGUpIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHRleHREYXRhLmdldFRleHQoKSwgYmluYXJ5Tm9kZS5nZXRUZXh0KCkpOwotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9tdG9tL0VjaG9SYXdNVE9NU3RyZWFtaW5nVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL210b20vRWNob1Jhd01UT01TdHJlYW1pbmdUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxZGY3MTIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL210b20vRWNob1Jhd01UT01TdHJlYW1pbmdUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLm10b207Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLmF0dGFjaG1lbnRzLkJ5dGVBcnJheURhdGFTb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01UZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5sbG9tLk9NVGV4dEltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVAxMkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuT3B0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5TZXJ2aWNlQ2xpZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUudXRpbC5UZXN0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaW50ZWdyYXRpb24uVGVzdGluZ1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaW50ZWdyYXRpb24uVXRpbFNlcnZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmludGVncmF0aW9uLlV0aWxTZXJ2ZXJCYXNlZFRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5VdGlsczsKLQotaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXI7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi1wdWJsaWMgY2xhc3MgRWNob1Jhd01UT01TdHJlYW1pbmdUZXN0IGV4dGVuZHMgVXRpbFNlcnZlckJhc2VkVGVzdENhc2UgaW1wbGVtZW50cyBUZXN0Q29uc3RhbnRzIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRW5kcG9pbnRSZWZlcmVuY2UgdGFyZ2V0RVBSID0gbmV3IEVuZHBvaW50UmVmZXJlbmNlKAotICAgICAgICAgICAgImh0dHA6Ly8xMjcuMC4wLjE6IiArIChVdGlsU2VydmVyLlRFU1RJTkdfUE9SVCkKLS8vICAgICAgICAgICAgImh0dHA6Ly8xMjcuMC4wLjE6IiArIDU1NTYKLSAgICAgICAgICAgICAgICAgICAgKyAiL2F4aXMyL3NlcnZpY2VzL0VjaG9TZXJ2aWNlMi9tdG9tU2FtcGxlIik7Ci0KLSAgICBwcml2YXRlIFFOYW1lIHNlcnZpY2VOYW1lID0gbmV3IFFOYW1lKCJFY2hvU2VydmljZTIiKTsKLQotICAgIHByaXZhdGUgUU5hbWUgb3BlcmF0aW9uTmFtZSA9IG5ldyBRTmFtZSgibXRvbVNhbXBsZSIpOwotCi0gICAgcHJpdmF0ZSBPTUVsZW1lbnQgZGF0YTsKLQotICAgIHB1YmxpYyBFY2hvUmF3TVRPTVN0cmVhbWluZ1Rlc3QoKSB7Ci0gICAgICAgIHN1cGVyKEVjaG9SYXdNVE9NU3RyZWFtaW5nVGVzdC5jbGFzcy5nZXROYW1lKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBFY2hvUmF3TVRPTVN0cmVhbWluZ1Rlc3QoU3RyaW5nIHRlc3ROYW1lKSB7Ci0gICAgICAgIHN1cGVyKHRlc3ROYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIHJldHVybiBnZXRUZXN0U2V0dXAyKG5ldyBUZXN0U3VpdGUoRWNob1Jhd01UT01TdHJlYW1pbmdUZXN0LmNsYXNzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVzdGluZ1V0aWxzLnByZWZpeEJhc2VEaXJlY3RvcnkoQ29uc3RhbnRzLlRFU1RJTkdfUEFUSCArICJNVE9NLWVuYWJsZWRSZXBvc2l0b3J5IikpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2UgPSBVdGlscy5jcmVhdGVTaW1wbGVTZXJ2aWNlKHNlcnZpY2VOYW1lLCBFY2hvU2VydmljZTIuY2xhc3MuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25OYW1lKTsKLSAgICAgICAgVXRpbFNlcnZlci5kZXBsb3lTZXJ2aWNlKHNlcnZpY2UpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFV0aWxTZXJ2ZXIudW5EZXBsb3lTZXJ2aWNlKHNlcnZpY2VOYW1lKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE9NRWxlbWVudCBjcmVhdGVFbnZlbG9wZSgpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIERhdGFIYW5kbGVyIGV4cGVjdGVkREg7Ci0gICAgICAgIE9NRmFjdG9yeSBmYWMgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKTsKLSAgICAgICAgT01OYW1lc3BhY2Ugb21OcyA9IGZhYy5jcmVhdGVPTU5hbWVzcGFjZSgiaHR0cDovL2xvY2FsaG9zdC9teSIsICJteSIpOwotICAgICAgICBPTUVsZW1lbnQgcnBjV3JhcEVsZSA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoIm10b21TYW1wbGUiLCBvbU5zKTsKLSAgICAgICAgZGF0YSA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoImRhdGEiLCBvbU5zKTsKLSAgICAgICAgZXhwZWN0ZWRESCA9IG5ldyBEYXRhSGFuZGxlcigKLSAgICAgICAgICAgICAgICBuZXcgQnl0ZUFycmF5RGF0YVNvdXJjZShuZXcgYnl0ZVtdIHsgMTMsIDU2LCA2NSwgMzIsIDEyLCAxMiwgNywgLTMsIC0yLCAtMSwKLSAgICAgICAgICAgICAgICAgICAgICAgIDk4IH0pKTsKLSAgICAgICAgT01FbGVtZW50IHN1YkRhdGEgPSBmYWMuY3JlYXRlT01FbGVtZW50KCJzdWJEYXRhIiwgb21Ocyk7Ci0gICAgICAgIE9NVGV4dCB0ZXh0RGF0YSA9IG5ldyBPTVRleHRJbXBsKGV4cGVjdGVkREgsIGZhYyk7Ci0gICAgICAgIHN1YkRhdGEuYWRkQ2hpbGQodGV4dERhdGEpOwotICAgICAgICBkYXRhLmFkZENoaWxkKHN1YkRhdGEpOwotICAgICAgICBycGNXcmFwRWxlLmFkZENoaWxkKGRhdGEpOwotICAgICAgICByZXR1cm4gcnBjV3JhcEVsZTsKLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFY2hvWE1MU3luYygpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIE9NRWxlbWVudCBwYXlsb2FkID0gY3JlYXRlRW52ZWxvcGUoKTsKLQotICAgICAgICBPcHRpb25zIG9wdGlvbnMgPSBuZXcgT3B0aW9ucygpOwotICAgICAgICBvcHRpb25zLnNldFRvKHRhcmdldEVQUik7Ci0gICAgICAgIG9wdGlvbnMuc2V0UHJvcGVydHkoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uRU5BQkxFX01UT00sIENvbnN0YW50cy5WQUxVRV9UUlVFKTsKLSAgICAgICAgb3B0aW9ucy5zZXRUcmFuc3BvcnRJblByb3RvY29sKENvbnN0YW50cy5UUkFOU1BPUlRfSFRUUCk7Ci0KLSAgICAgICAgb3B0aW9ucy5zZXRTb2FwVmVyc2lvblVSSShTT0FQMTJDb25zdGFudHMuU09BUF9FTlZFTE9QRV9OQU1FU1BBQ0VfVVJJKTsKLQotICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0ID0KLSAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkuY3JlYXRlQ29uZmlndXJhdGlvbkNvbnRleHRGcm9tRmlsZVN5c3RlbSgKLSAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5URVNUSU5HX1BBVEggKyAiY29tbW9ucy1odHRwLWVuYWJsZWRSZXBvc2l0b3J5IiwgbnVsbCk7Ci0gICAgICAgIFNlcnZpY2VDbGllbnQgc2VuZGVyID0gbmV3IFNlcnZpY2VDbGllbnQoY29uZmlnQ29udGV4dCwgbnVsbCk7Ci0gICAgICAgIHNlbmRlci5zZXRPcHRpb25zKG9wdGlvbnMpOwotICAgICAgICBvcHRpb25zLnNldFRvKHRhcmdldEVQUik7Ci0KLSAgICAgICAgT01FbGVtZW50IHJlc3VsdCA9IHNlbmRlci5zZW5kUmVjZWl2ZShwYXlsb2FkKTsKLSAgICAgICAgdGhpcy5jYW1wYXJlV2l0aENyZWF0ZWRPTUVsZW1lbnQocmVzdWx0KTsKLQotICAgIH0KLQotICAgIHByaXZhdGUgSW5wdXRTdHJlYW0gZ2V0UmVzb3VyY2VBc1N0cmVhbShTdHJpbmcgcGF0aCkgewotICAgICAgICBDbGFzc0xvYWRlciBjbCA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7Ci0gICAgICAgIHJldHVybiBjbC5nZXRSZXNvdXJjZUFzU3RyZWFtKHBhdGgpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjYW1wYXJlV2l0aENyZWF0ZWRPTUVsZW1lbnQoT01FbGVtZW50IGVsZW1lbnQpIHsKLSAgICAgICAgT01FbGVtZW50IGZpcnN0Q2hpbGQgPSBlbGVtZW50LmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgICBUZXN0Q2FzZS5hc3NlcnROb3ROdWxsKGZpcnN0Q2hpbGQpOwotICAgICAgICBTdHJpbmcgb3JpZ2luYWxUZXh0VmFsdWUgPSBkYXRhLmdldEZpcnN0RWxlbWVudCgpLmdldFRleHQoKTsKLSAgICAgICAgU3RyaW5nIHJldHVybmVkVGV4dFZhbHVlID0gZmlyc3RDaGlsZC5nZXRUZXh0KCk7Ci0gICAgICAgIFRlc3RDYXNlLmFzc2VydEVxdWFscyhyZXR1cm5lZFRleHRWYWx1ZSwgb3JpZ2luYWxUZXh0VmFsdWUpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL210b20vRWNob1Jhd01UT01UZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvbXRvbS9FY2hvUmF3TVRPTVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE2NjlhMi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvbXRvbS9FY2hvUmF3TVRPTVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIubXRvbTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NVGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5PTVRleHRJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQMTJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5PcHRpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50LlNlcnZpY2VDbGllbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuYXN5bmMuQXN5bmNSZXN1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuYXN5bmMuQ2FsbGJhY2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuRWNobzsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS51dGlsLlRlc3RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pbnRlZ3JhdGlvbi5UZXN0aW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pbnRlZ3JhdGlvbi5VdGlsU2VydmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaW50ZWdyYXRpb24uVXRpbFNlcnZlckJhc2VkVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLlV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXguYWN0aXZhdGlvbi5EYXRhSGFuZGxlcjsKLWltcG9ydCBqYXZheC5hY3RpdmF0aW9uLkZpbGVEYXRhU291cmNlOwotaW1wb3J0IGphdmF4LmltYWdlaW8uSW1hZ2VJTzsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLXB1YmxpYyBjbGFzcyBFY2hvUmF3TVRPTVRlc3QgZXh0ZW5kcyBVdGlsU2VydmVyQmFzZWRUZXN0Q2FzZSBpbXBsZW1lbnRzIFRlc3RDb25zdGFudHMgewotCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coRWNob1Jhd01UT01UZXN0LmNsYXNzKTsKLQotICAgIHByaXZhdGUgQXhpc1NlcnZpY2Ugc2VydmljZTsKLQotICAgIHByaXZhdGUgT01UZXh0SW1wbCBleHBlY3RlZFRleHREYXRhOwotCi0gICAgcHJpdmF0ZSBib29sZWFuIGZpbmlzaCA9IGZhbHNlOwotCi0gICAgcHVibGljIEVjaG9SYXdNVE9NVGVzdCgpIHsKLSAgICAgICAgc3VwZXIoRWNob1Jhd01UT01UZXN0LmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIEVjaG9SYXdNVE9NVGVzdChTdHJpbmcgdGVzdE5hbWUpIHsKLSAgICAgICAgc3VwZXIodGVzdE5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgcmV0dXJuIGdldFRlc3RTZXR1cDIobmV3IFRlc3RTdWl0ZShFY2hvUmF3TVRPTVRlc3QuY2xhc3MpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXN0aW5nVXRpbHMucHJlZml4QmFzZURpcmVjdG9yeShDb25zdGFudHMuVEVTVElOR19QQVRIICsgIk1UT00tZW5hYmxlZFJlcG9zaXRvcnkiKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc2VydmljZSA9IFV0aWxzLmNyZWF0ZVNpbXBsZVNlcnZpY2Uoc2VydmljZU5hbWUsIEVjaG8uY2xhc3MuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25OYW1lKTsKLSAgICAgICAgVXRpbFNlcnZlci5kZXBsb3lTZXJ2aWNlKHNlcnZpY2UpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFV0aWxTZXJ2ZXIudW5EZXBsb3lTZXJ2aWNlKHNlcnZpY2VOYW1lKTsKLSAgICAgICAgVXRpbFNlcnZlci51bkRlcGxveUNsaWVudFNlcnZpY2UoKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgT01FbGVtZW50IGNyZWF0ZUVudmVsb3BlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgRGF0YUhhbmRsZXIgZXhwZWN0ZWRESDsKLSAgICAgICAgT01GYWN0b3J5IGZhYyA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpOwotICAgICAgICBPTU5hbWVzcGFjZSBvbU5zID0gZmFjLmNyZWF0ZU9NTmFtZXNwYWNlKCJodHRwOi8vbG9jYWxob3N0L215IiwgIm15Iik7Ci0gICAgICAgIE9NRWxlbWVudCBycGNXcmFwRWxlID0gZmFjLmNyZWF0ZU9NRWxlbWVudCgiZWNob09NRWxlbWVudCIsIG9tTnMpOwotICAgICAgICBPTUVsZW1lbnQgZGF0YSA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoImRhdGEiLCBvbU5zKTsKLSAgICAgICAgRmlsZURhdGFTb3VyY2UgZmlsZURhdGFTb3VyY2UgPSBuZXcgRmlsZURhdGFTb3VyY2UoVGVzdGluZ1V0aWxzLnByZWZpeEJhc2VEaXJlY3RvcnkoInRlc3QtcmVzb3VyY2VzL210b20vdGVzdC5qcGciKSk7Ci0gICAgICAgIGV4cGVjdGVkREggPSBuZXcgRGF0YUhhbmRsZXIoZmlsZURhdGFTb3VyY2UpOwotICAgICAgICBleHBlY3RlZFRleHREYXRhID0gbmV3IE9NVGV4dEltcGwoZXhwZWN0ZWRESCwgdHJ1ZSwgZmFjKTsKLSAgICAgICAgZGF0YS5hZGRDaGlsZChleHBlY3RlZFRleHREYXRhKTsKLSAgICAgICAgcnBjV3JhcEVsZS5hZGRDaGlsZChkYXRhKTsKLSAgICAgICAgcmV0dXJuIHJwY1dyYXBFbGU7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RWNob1hNTEFTeW5jKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE9NRWxlbWVudCBwYXlsb2FkID0gY3JlYXRlRW52ZWxvcGUoKTsKLSAgICAgICAgT3B0aW9ucyBvcHRpb25zID0gbmV3IE9wdGlvbnMoKTsKLSAgICAgICAgb3B0aW9ucy5zZXRUbyh0YXJnZXRFUFIpOwotICAgICAgICBvcHRpb25zLnNldFRyYW5zcG9ydEluUHJvdG9jb2woQ29uc3RhbnRzLlRSQU5TUE9SVF9IVFRQKTsKLSAgICAgICAgb3B0aW9ucy5zZXRQcm9wZXJ0eShDb25zdGFudHMuQ29uZmlndXJhdGlvbi5DSEFSQUNURVJfU0VUX0VOQ09ESU5HLCBNZXNzYWdlQ29udGV4dC5VVEZfMTYpOwotCi0gICAgICAgIENhbGxiYWNrIGNhbGxiYWNrID0gbmV3IENhbGxiYWNrKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgb25Db21wbGV0ZShBc3luY1Jlc3VsdCByZXN1bHQpIHsKLSAgICAgICAgICAgICAgICBTT0FQRW52ZWxvcGUgZW52ZWxvcGUgPSByZXN1bHQuZ2V0UmVzcG9uc2VFbnZlbG9wZSgpOwotCi0gICAgICAgICAgICAgICAgT01FbGVtZW50IGVsZSA9IChPTUVsZW1lbnQpZW52ZWxvcGUuZ2V0Qm9keSgpLmdldEZpcnN0RWxlbWVudCgpLmdldEZpcnN0T01DaGlsZCgpOwotICAgICAgICAgICAgICAgIE9NVGV4dCBiaW5hcnlOb2RlID0gKE9NVGV4dCllbGUuZ2V0Rmlyc3RPTUNoaWxkKCk7Ci0KLSAgICAgICAgICAgICAgICAvLyB0byB0aGUgYXNzZXJ0IGVxdWFsCi0gICAgICAgICAgICAgICAgY29tcGFyZVdpdGhDcmVhdGVkT01UZXh0KGJpbmFyeU5vZGUpOwotICAgICAgICAgICAgICAgIGZpbmlzaCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uRXJyb3IoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBsb2cuaW5mbyhlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgZmluaXNoID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ29udGV4dCA9Ci0gICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5LmNyZWF0ZUNvbmZpZ3VyYXRpb25Db250ZXh0RnJvbUZpbGVTeXN0ZW0oCi0gICAgICAgICAgICAgICAgICAgICAgICBUZXN0aW5nVXRpbHMucHJlZml4QmFzZURpcmVjdG9yeSgidGFyZ2V0L3Rlc3QtcmVzb3VyY2VzL2ludGVncmF0aW9uUmVwbyIpLCBudWxsKTsKLSAgICAgICAgU2VydmljZUNsaWVudCBzZW5kZXIgPSBuZXcgU2VydmljZUNsaWVudChjb25maWdDb250ZXh0LCBudWxsKTsKLSAgICAgICAgb3B0aW9ucy5zZXRBY3Rpb24oQ29uc3RhbnRzLkFYSVMyX05BTUVTUEFDRV9VUkkgKyAiLyIgKyBvcGVyYXRpb25OYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgc2VuZGVyLnNldE9wdGlvbnMob3B0aW9ucyk7Ci0KLSAgICAgICAgc2VuZGVyLnNlbmRSZWNlaXZlTm9uQmxvY2tpbmcocGF5bG9hZCwgY2FsbGJhY2spOwotCi0gICAgICAgIGludCBpbmRleCA9IDA7Ci0gICAgICAgIHdoaWxlICghZmluaXNoKSB7Ci0gICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7Ci0gICAgICAgICAgICBpbmRleCsrOwotICAgICAgICAgICAgaWYgKGluZGV4ID4gMTApIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KAotICAgICAgICAgICAgICAgICAgICAgICAgIlNlcnZlciB3YXMgc2h1dGRvd24gYXMgdGhlIGFzeW5jIHJlc3BvbnNlIHRha2UgdG9vIGxvbmcgdG8gY29tcGxldGUiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFY2hvWE1MU3luYygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBPTUVsZW1lbnQgcGF5bG9hZCA9IGNyZWF0ZUVudmVsb3BlKCk7Ci0gICAgICAgIE9wdGlvbnMgb3B0aW9ucyA9IG5ldyBPcHRpb25zKCk7Ci0gICAgICAgIG9wdGlvbnMuc2V0VG8odGFyZ2V0RVBSKTsKLSAgICAgICAgb3B0aW9ucy5zZXRQcm9wZXJ0eShDb25zdGFudHMuQ29uZmlndXJhdGlvbi5FTkFCTEVfTVRPTSwgQ29uc3RhbnRzLlZBTFVFX1RSVUUpOwotICAgICAgICBvcHRpb25zLnNldFRyYW5zcG9ydEluUHJvdG9jb2woQ29uc3RhbnRzLlRSQU5TUE9SVF9IVFRQKTsKLSAgICAgICAgb3B0aW9ucy5zZXRTb2FwVmVyc2lvblVSSShTT0FQMTJDb25zdGFudHMuU09BUF9FTlZFTE9QRV9OQU1FU1BBQ0VfVVJJKTsKLSAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ29udGV4dCA9Ci0gICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5LmNyZWF0ZUNvbmZpZ3VyYXRpb25Db250ZXh0RnJvbUZpbGVTeXN0ZW0oCi0gICAgICAgICAgICAgICAgICAgICAgICBUZXN0aW5nVXRpbHMucHJlZml4QmFzZURpcmVjdG9yeSgidGFyZ2V0L3Rlc3QtcmVzb3VyY2VzL2ludGVncmF0aW9uUmVwbyIpLCBudWxsKTsKLQotICAgICAgICBTZXJ2aWNlQ2xpZW50IHNlbmRlciA9IG5ldyBTZXJ2aWNlQ2xpZW50KGNvbmZpZ0NvbnRleHQsIG51bGwpOwotICAgICAgICBvcHRpb25zLnNldEFjdGlvbihDb25zdGFudHMuQVhJUzJfTkFNRVNQQUNFX1VSSSArICIvIiArIG9wZXJhdGlvbk5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICBzZW5kZXIuc2V0T3B0aW9ucyhvcHRpb25zKTsKLSAgICAgICAgb3B0aW9ucy5zZXRUbyh0YXJnZXRFUFIpOwotICAgICAgICBPTUVsZW1lbnQgcmVzdWx0ID0gc2VuZGVyLnNlbmRSZWNlaXZlKHBheWxvYWQpOwotCi0gICAgICAgIE9NRWxlbWVudCBlbGUgPSAoT01FbGVtZW50KXJlc3VsdC5nZXRGaXJzdE9NQ2hpbGQoKTsKLSAgICAgICAgT01UZXh0IGJpbmFyeU5vZGUgPSAoT01UZXh0KWVsZS5nZXRGaXJzdE9NQ2hpbGQoKTsKLQotICAgICAgICAvLyB0byB0aGUgYXNzZXJ0IGVxdWFsCi0gICAgICAgIGNvbXBhcmVXaXRoQ3JlYXRlZE9NVGV4dChiaW5hcnlOb2RlKTsKLQotICAgICAgICAvLyBTYXZlIHRoZSBpbWFnZQotICAgICAgICBEYXRhSGFuZGxlciBhY3R1YWxESDsKLSAgICAgICAgYWN0dWFsREggPSAoRGF0YUhhbmRsZXIpYmluYXJ5Tm9kZS5nZXREYXRhSGFuZGxlcigpOwotICAgICAgICBJbWFnZUlPLnJlYWQoYWN0dWFsREguZ2V0RGF0YVNvdXJjZSgpCi0gICAgICAgICAgICAgICAgLmdldElucHV0U3RyZWFtKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFY2hvWE1MU3luY1NlcGVyYXRlTGlzdGVuZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgT01FbGVtZW50IHBheWxvYWQgPSBjcmVhdGVFbnZlbG9wZSgpOwotICAgICAgICBPcHRpb25zIG9wdGlvbnMgPSBuZXcgT3B0aW9ucygpOwotICAgICAgICBvcHRpb25zLnNldFRvKHRhcmdldEVQUik7Ci0gICAgICAgIG9wdGlvbnMuc2V0UHJvcGVydHkoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uRU5BQkxFX01UT00sIENvbnN0YW50cy5WQUxVRV9UUlVFKTsKLSAgICAgICAgb3B0aW9ucy5zZXRUcmFuc3BvcnRJblByb3RvY29sKENvbnN0YW50cy5UUkFOU1BPUlRfSFRUUCk7Ci0gICAgICAgIG9wdGlvbnMuc2V0U29hcFZlcnNpb25VUkkoU09BUDEyQ29uc3RhbnRzLlNPQVBfRU5WRUxPUEVfTkFNRVNQQUNFX1VSSSk7Ci0gICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQgPQotICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeS5jcmVhdGVDb25maWd1cmF0aW9uQ29udGV4dEZyb21GaWxlU3lzdGVtKAotICAgICAgICAgICAgICAgICAgICAgICAgVGVzdGluZ1V0aWxzLnByZWZpeEJhc2VEaXJlY3RvcnkoInRhcmdldC90ZXN0LXJlc291cmNlcy9pbnRlZ3JhdGlvblJlcG8iKSwgbnVsbCk7Ci0KLSAgICAgICAgU2VydmljZUNsaWVudCBzZW5kZXIgPSBuZXcgU2VydmljZUNsaWVudChjb25maWdDb250ZXh0LCBudWxsKTsKLSAgICAgICAgc2VuZGVyLmVuZ2FnZU1vZHVsZShuZXcgUU5hbWUoImFkZHJlc3NpbmciKSk7Ci0gICAgICAgIG9wdGlvbnMuc2V0QWN0aW9uKENvbnN0YW50cy5BWElTMl9OQU1FU1BBQ0VfVVJJICsgIi8iICsgb3BlcmF0aW9uTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgIHNlbmRlci5zZXRPcHRpb25zKG9wdGlvbnMpOwotICAgICAgICBvcHRpb25zLnNldFVzZVNlcGFyYXRlTGlzdGVuZXIodHJ1ZSk7Ci0gICAgICAgIG9wdGlvbnMuc2V0VG8odGFyZ2V0RVBSKTsKLSAgICAgICAgT01FbGVtZW50IHJlc3VsdCA9IHNlbmRlci5zZW5kUmVjZWl2ZShwYXlsb2FkKTsKLQotICAgICAgICBPTUVsZW1lbnQgZWxlID0gKE9NRWxlbWVudClyZXN1bHQuZ2V0Rmlyc3RPTUNoaWxkKCk7Ci0gICAgICAgIE9NVGV4dCBiaW5hcnlOb2RlID0gKE9NVGV4dCllbGUuZ2V0Rmlyc3RPTUNoaWxkKCk7Ci0gICAgICAgIC8vIHRvIHRoZSBhc3NlcnQgZXF1YWwKLSAgICAgICAgY29tcGFyZVdpdGhDcmVhdGVkT01UZXh0KGJpbmFyeU5vZGUpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBJbnB1dFN0cmVhbSBnZXRSZXNvdXJjZUFzU3RyZWFtKFN0cmluZyBwYXRoKSB7Ci0gICAgICAgIENsYXNzTG9hZGVyIGNsID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKLSAgICAgICAgcmV0dXJuIGNsLmdldFJlc291cmNlQXNTdHJlYW0ocGF0aCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgY29tcGFyZVdpdGhDcmVhdGVkT01UZXh0KE9NVGV4dCBhY3R1YWxUZXh0RGF0YSkgewotICAgICAgICBTdHJpbmcgb3JpZ2luYWxUZXh0VmFsdWUgPSBleHBlY3RlZFRleHREYXRhLmdldFRleHQoKTsKLSAgICAgICAgU3RyaW5nIHJldHVybmVkVGV4dFZhbHVlID0gYWN0dWFsVGV4dERhdGEuZ2V0VGV4dCgpOwotICAgICAgICBUZXN0Q2FzZS5hc3NlcnRFcXVhbHMocmV0dXJuZWRUZXh0VmFsdWUsIG9yaWdpbmFsVGV4dFZhbHVlKTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL210b20vRWNob1Jhd01UT01Ub0Jhc2U2NFRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9tdG9tL0VjaG9SYXdNVE9NVG9CYXNlNjRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5ZDlmZDYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL210b20vRWNob1Jhd01UT01Ub0Jhc2U2NFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIubXRvbTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uYXR0YWNobWVudHMuQnl0ZUFycmF5RGF0YVNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01OYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTVRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmxsb20uT01UZXh0SW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUDEyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50Lk9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuU2VydmljZUNsaWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5hc3luYy5Bc3luY1Jlc3VsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5hc3luYy5DYWxsYmFjazsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkVjaG87Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pbnRlZ3JhdGlvbi5UZXN0aW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pbnRlZ3JhdGlvbi5VdGlsU2VydmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaW50ZWdyYXRpb24uVXRpbFNlcnZlckJhc2VkVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLlV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXguYWN0aXZhdGlvbi5EYXRhSGFuZGxlcjsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1wdWJsaWMgY2xhc3MgRWNob1Jhd01UT01Ub0Jhc2U2NFRlc3QgZXh0ZW5kcyBVdGlsU2VydmVyQmFzZWRUZXN0Q2FzZSB7Ci0gICAgcHJpdmF0ZSBFbmRwb2ludFJlZmVyZW5jZSB0YXJnZXRFUFIgPSBuZXcgRW5kcG9pbnRSZWZlcmVuY2UoImh0dHA6Ly8xMjcuMC4wLjE6IgotICAgICAgICAgICAgKyAoVXRpbFNlcnZlci5URVNUSU5HX1BPUlQpCi0gICAgICAgICAgICArICIvYXhpczIvc2VydmljZXMvRWNob1hNTFNlcnZpY2UvZWNob01UT010b0Jhc2U2NCIpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEVjaG9SYXdNVE9NVG9CYXNlNjRUZXN0LmNsYXNzKTsKLQotICAgIHByaXZhdGUgUU5hbWUgc2VydmljZU5hbWUgPSBuZXcgUU5hbWUoIkVjaG9YTUxTZXJ2aWNlIik7Ci0KLSAgICBwcml2YXRlIFFOYW1lIG9wZXJhdGlvbk5hbWUgPSBuZXcgUU5hbWUoImVjaG9NVE9NdG9CYXNlNjQiKTsKLQotICAgIE9NVGV4dCBleHBlY3RlZFRleHREYXRhOwotCi0gICAgcHJpdmF0ZSBib29sZWFuIGZpbmlzaCA9IGZhbHNlOwotCi0gICAgcHVibGljIEVjaG9SYXdNVE9NVG9CYXNlNjRUZXN0KCkgewotICAgICAgICBzdXBlcihFY2hvUmF3TVRPTVRvQmFzZTY0VGVzdC5jbGFzcy5nZXROYW1lKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBFY2hvUmF3TVRPTVRvQmFzZTY0VGVzdChTdHJpbmcgdGVzdE5hbWUpIHsKLSAgICAgICAgc3VwZXIodGVzdE5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgcmV0dXJuIGdldFRlc3RTZXR1cChuZXcgVGVzdFN1aXRlKEVjaG9SYXdNVE9NVG9CYXNlNjRUZXN0LmNsYXNzKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSA9IFV0aWxzLmNyZWF0ZVNpbXBsZVNlcnZpY2Uoc2VydmljZU5hbWUsIEVjaG8uY2xhc3MuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25OYW1lKTsKLSAgICAgICAgVXRpbFNlcnZlci5kZXBsb3lTZXJ2aWNlKHNlcnZpY2UpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFV0aWxTZXJ2ZXIudW5EZXBsb3lTZXJ2aWNlKHNlcnZpY2VOYW1lKTsKLSAgICAgICAgVXRpbFNlcnZlci51bkRlcGxveUNsaWVudFNlcnZpY2UoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE9NRWxlbWVudCBjcmVhdGVQYXlsb2FkKCkgewotCi0gICAgICAgIE9NRmFjdG9yeSBmYWMgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKTsKLSAgICAgICAgT01OYW1lc3BhY2Ugb21OcyA9IGZhYy5jcmVhdGVPTU5hbWVzcGFjZSgiaHR0cDovL2xvY2FsaG9zdC9teSIsICJteSIpOwotICAgICAgICBPTUVsZW1lbnQgcnBjV3JhcEVsZSA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoImVjaG9NVE9NdG9CYXNlNjQiLCBvbU5zKTsKLSAgICAgICAgT01FbGVtZW50IGRhdGEgPSBmYWMuY3JlYXRlT01FbGVtZW50KCJkYXRhIiwgb21Ocyk7Ci0gICAgICAgIGJ5dGVbXSBieXRlQXJyYXkgPSBuZXcgYnl0ZVtdIHsgMTMsIDU2LCA2NSwgMzIsIDEyLCAxMiwgNywgOTggfTsKLSAgICAgICAgRGF0YUhhbmRsZXIgZGF0YUhhbmRsZXIgPSBuZXcgRGF0YUhhbmRsZXIobmV3IEJ5dGVBcnJheURhdGFTb3VyY2UoYnl0ZUFycmF5KSk7Ci0gICAgICAgIGV4cGVjdGVkVGV4dERhdGEgPSBuZXcgT01UZXh0SW1wbChkYXRhSGFuZGxlciwgdHJ1ZSwgZmFjKTsKLSAgICAgICAgZGF0YS5hZGRDaGlsZChleHBlY3RlZFRleHREYXRhKTsKLSAgICAgICAgcnBjV3JhcEVsZS5hZGRDaGlsZChkYXRhKTsKLSAgICAgICAgcmV0dXJuIHJwY1dyYXBFbGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEVjaG9YTUxBU3luYygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBPTUVsZW1lbnQgcGF5bG9hZCA9IGNyZWF0ZVBheWxvYWQoKTsKLSAgICAgICAgT3B0aW9ucyBjbGllbnRPcHRpb25zID0gbmV3IE9wdGlvbnMoKTsKLSAgICAgICAgY2xpZW50T3B0aW9ucy5zZXRUbyh0YXJnZXRFUFIpOwotICAgICAgICBjbGllbnRPcHRpb25zLnNldFRyYW5zcG9ydEluUHJvdG9jb2woQ29uc3RhbnRzLlRSQU5TUE9SVF9IVFRQKTsKLQotCi0gICAgICAgIENhbGxiYWNrIGNhbGxiYWNrID0gbmV3IENhbGxiYWNrKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgb25Db21wbGV0ZShBc3luY1Jlc3VsdCByZXN1bHQpIHsKLSAgICAgICAgICAgICAgICBTT0FQRW52ZWxvcGUgZW52ZWxvcGUgPSByZXN1bHQuZ2V0UmVzcG9uc2VFbnZlbG9wZSgpOwotCi0gICAgICAgICAgICAgICAgT01FbGVtZW50IGRhdGEgPSAoT01FbGVtZW50KWVudmVsb3BlLmdldEJvZHkoKS5nZXRGaXJzdEVsZW1lbnQoKS5nZXRGaXJzdE9NQ2hpbGQoKTsKLSAgICAgICAgICAgICAgICBjb21wYXJlV2l0aENyZWF0ZWRPTVRleHQoZGF0YS5nZXRUZXh0KCkpOwotICAgICAgICAgICAgICAgIGZpbmlzaCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uRXJyb3IoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBsb2cuaW5mbyhlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgZmluaXNoID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLQotICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0ID0KLSAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkuY3JlYXRlQ29uZmlndXJhdGlvbkNvbnRleHRGcm9tRmlsZVN5c3RlbSgKLSAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RpbmdVdGlscy5wcmVmaXhCYXNlRGlyZWN0b3J5KCJ0YXJnZXQvdGVzdC1yZXNvdXJjZXMvaW50ZWdyYXRpb25SZXBvIiksIG51bGwpOwotICAgICAgICBTZXJ2aWNlQ2xpZW50IHNlbmRlciA9IG5ldyBTZXJ2aWNlQ2xpZW50KGNvbmZpZ0NvbnRleHQsIG51bGwpOwotICAgICAgICBzZW5kZXIuc2V0T3B0aW9ucyhjbGllbnRPcHRpb25zKTsKLQotICAgICAgICBzZW5kZXIuc2VuZFJlY2VpdmVOb25CbG9ja2luZyhwYXlsb2FkLCBjYWxsYmFjayk7Ci0KLSAgICAgICAgaW50IGluZGV4ID0gMDsKLSAgICAgICAgd2hpbGUgKCFmaW5pc2gpIHsKLSAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsKLSAgICAgICAgICAgIGluZGV4Kys7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPiAxMCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoCi0gICAgICAgICAgICAgICAgICAgICAgICAiU2VydmVyIHdhcyBzaHV0ZG93biBhcyB0aGUgYXN5bmMgcmVzcG9uc2UgdGFrZSB0b28gbG9uZyB0byBjb21wbGV0ZSIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEVjaG9YTUxTeW5jKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgewotICAgICAgICAgICAgT01FbGVtZW50IHBheWxvYWQgPSBjcmVhdGVQYXlsb2FkKCk7Ci0KLSAgICAgICAgICAgIE9wdGlvbnMgY2xpZW50T3B0aW9ucyA9IG5ldyBPcHRpb25zKCk7Ci0gICAgICAgICAgICBjbGllbnRPcHRpb25zLnNldFRvKHRhcmdldEVQUik7Ci0gICAgICAgICAgICBjbGllbnRPcHRpb25zLnNldFByb3BlcnR5KENvbnN0YW50cy5Db25maWd1cmF0aW9uLkVOQUJMRV9NVE9NLCBDb25zdGFudHMuVkFMVUVfVFJVRSk7Ci0gICAgICAgICAgICBjbGllbnRPcHRpb25zLnNldFRyYW5zcG9ydEluUHJvdG9jb2woQ29uc3RhbnRzLlRSQU5TUE9SVF9IVFRQKTsKLSAgICAgICAgICAgIGNsaWVudE9wdGlvbnMuc2V0U29hcFZlcnNpb25VUkkoU09BUDEyQ29uc3RhbnRzLlNPQVBfRU5WRUxPUEVfTkFNRVNQQUNFX1VSSSk7Ci0KLSAgICAgICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQgPQotICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlQ29uZmlndXJhdGlvbkNvbnRleHRGcm9tRmlsZVN5c3RlbShudWxsLCBudWxsKTsKLSAgICAgICAgICAgIFNlcnZpY2VDbGllbnQgc2VuZGVyID0gbmV3IFNlcnZpY2VDbGllbnQoY29uZmlnQ29udGV4dCwgbnVsbCk7Ci0gICAgICAgICAgICBzZW5kZXIuc2V0T3B0aW9ucyhjbGllbnRPcHRpb25zKTsKLQotICAgICAgICAgICAgT01FbGVtZW50IHJlc3VsdCA9IHNlbmRlci5zZW5kUmVjZWl2ZShwYXlsb2FkKTsKLQotICAgICAgICAgICAgT01FbGVtZW50IGRhdGEgPSAoT01FbGVtZW50KXJlc3VsdC5nZXRGaXJzdE9NQ2hpbGQoKTsKLSAgICAgICAgICAgIGNvbXBhcmVXaXRoQ3JlYXRlZE9NVGV4dChkYXRhLmdldFRleHQoKSk7Ci0gICAgICAgICAgICBsb2cuaW5mbygiIiArIGkpOwotICAgICAgICAgICAgVXRpbFNlcnZlci51bkRlcGxveUNsaWVudFNlcnZpY2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjb21wYXJlV2l0aENyZWF0ZWRPTVRleHQoU3RyaW5nIGFjdHVhbFRleHQpIHsKLSAgICAgICAgU3RyaW5nIG9yaWdpbmFsVGV4dFZhbHVlID0gZXhwZWN0ZWRUZXh0RGF0YS5nZXRUZXh0KCk7Ci0gICAgICAgIFRlc3RDYXNlLmFzc2VydEVxdWFscyhhY3R1YWxUZXh0LCBvcmlnaW5hbFRleHRWYWx1ZSk7Ci0gICAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL210b20vRWNob1NlcnZpY2UuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9tdG9tL0VjaG9TZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0MTk3MzYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL210b20vRWNob1NlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5tdG9tOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTVRleHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLQotcHVibGljIGNsYXNzIEVjaG9TZXJ2aWNlIHsKLSAgICBwdWJsaWMgT01FbGVtZW50IG10b21TYW1wbGUoT01FbGVtZW50IGVsZW1lbnQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoZWxlbWVudC5nZXRMb2NhbE5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKCJEYXRhIikKLSAgICAgICAgICAgICAgICAmJiBlbGVtZW50LmdldE5hbWVzcGFjZSgpLmdldE5hbWVzcGFjZVVSSSgpLmVxdWFsc0lnbm9yZUNhc2UoCi0gICAgICAgICAgICAgICAgImh0dHA6Ly9leGFtcGxlLm9yZy9tdG9tL2RhdGEiKSkgewotICAgICAgICAgICAgT01UZXh0IGJpbmFyeU5vZGUgPSAoT01UZXh0KWVsZW1lbnQuZ2V0Rmlyc3RPTUNoaWxkKCk7Ci0gICAgICAgICAgICBiaW5hcnlOb2RlLnNldE9wdGltaXplKCFiaW5hcnlOb2RlLmlzT3B0aW1pemVkKCkpOwotICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnQuZ2V0TG9jYWxOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSgiRWNob1Rlc3QiKSAmJiBlbGVtZW50LmdldE5hbWVzcGFjZSgpCi0gICAgICAgICAgICAgICAgLmdldE5hbWVzcGFjZVVSSSgpLmVxdWFsc0lnbm9yZUNhc2UoImh0dHA6Ly9leGFtcGxlLm9yZy9tdG9tL2RhdGEiKSkgewotICAgICAgICAgICAgSXRlcmF0b3IgY2hpbGRyZW5JdGVyYXRvciA9IGVsZW1lbnQuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgICAgICAgIHdoaWxlIChjaGlsZHJlbkl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIE9NRWxlbWVudCBkYXRhRWxlbWVudCA9IChPTUVsZW1lbnQpY2hpbGRyZW5JdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgT01UZXh0IGJpbmFyeU5vZGUgPSAoT01UZXh0KWRhdGFFbGVtZW50LmdldEZpcnN0T01DaGlsZCgpOwotICAgICAgICAgICAgICAgIGJpbmFyeU5vZGUuc2V0T3B0aW1pemUoIWJpbmFyeU5vZGUuaXNPcHRpbWl6ZWQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVsZW1lbnQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL210b20vRWNob1NlcnZpY2UyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvbXRvbS9FY2hvU2VydmljZTIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NkMTczNi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvbXRvbS9FY2hvU2VydmljZTIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5tdG9tOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5hdHRhY2htZW50cy5BdHRhY2htZW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLmF0dGFjaG1lbnRzLkluY29taW5nQXR0YWNobWVudElucHV0U3RyZWFtOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uYXR0YWNobWVudHMuSW5jb21pbmdBdHRhY2htZW50U3RyZWFtczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLmF0dGFjaG1lbnRzLnV0aWxzLklPVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5NVE9NQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5CYXNlNjQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotCi1wdWJsaWMgY2xhc3MgRWNob1NlcnZpY2UyIHsKLQotCi0gICAgcHVibGljIE9NRWxlbWVudCBtdG9tU2FtcGxlKE9NRWxlbWVudCBlbGVtZW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICBBdHRhY2htZW50cyBhdHRhY2htZW50cyA9IG51bGw7Ci0gICAgICAgIGF0dGFjaG1lbnRzID0gKEF0dGFjaG1lbnRzKU1lc3NhZ2VDb250ZXh0LmdldEN1cnJlbnRNZXNzYWdlQ29udGV4dCgpCi0gICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KE1UT01Db25zdGFudHMuQVRUQUNITUVOVFMpOwotICAgICAgICAvLyBHZXQgaW1hZ2UgZGF0YQotICAgICAgICBJbmNvbWluZ0F0dGFjaG1lbnRTdHJlYW1zIHN0cmVhbXMgPSBhdHRhY2htZW50cy5nZXRJbmNvbWluZ0F0dGFjaG1lbnRTdHJlYW1zKCk7Ci0gICAgICAgIEluY29taW5nQXR0YWNobWVudElucHV0U3RyZWFtIHN0cmVhbSA9IHN0cmVhbXMuZ2V0TmV4dFN0cmVhbSgpOwotCi0gICAgICAgIGJ5dGVbXSBkYXRhID0gSU9VdGlscy5nZXRTdHJlYW1Bc0J5dGVBcnJheShzdHJlYW0pOwotCi0gICAgICAgIC8vc2V0dGluZyByZXNwb25zZQotICAgICAgICBPTUZhY3RvcnkgZmFjID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCk7Ci0gICAgICAgIE9NTmFtZXNwYWNlIG5zID0gZmFjLmNyZWF0ZU9NTmFtZXNwYWNlKCJ1cm46Ly9mYWtlbmFtZXNwYWNlIiwgIm5zIik7Ci0gICAgICAgIE9NRWxlbWVudCByZXNwb25zZSwgZWxlbTsKLQotICAgICAgICByZXNwb25zZSA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoInJlc3BvbnNlIiwgbnMpOwotCi0gICAgICAgIGVsZW0gPSBmYWMuY3JlYXRlT01FbGVtZW50KCJkYXRhIiwgbnMpOwotICAgICAgICBlbGVtLnNldFRleHQoQmFzZTY0LmVuY29kZShkYXRhKSk7Ci0gICAgICAgIHJlc3BvbnNlLmFkZENoaWxkKGVsZW0pOwotCi0gICAgICAgIHJldHVybiByZXNwb25zZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvbXRvbS9NZXNzYWdlU2F2ZUFuZFJlc3RvcmVXaXRoTVRPTVRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9tdG9tL01lc3NhZ2VTYXZlQW5kUmVzdG9yZVdpdGhNVE9NVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjQxOWI2Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9tdG9tL01lc3NhZ2VTYXZlQW5kUmVzdG9yZVdpdGhNVE9NVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5tdG9tOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01UZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5sbG9tLk9NVGV4dEltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVAxMkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5PcHRpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50LlNlcnZpY2VDbGllbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNFbmdpbmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuRWNobzsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5IYW5kbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLlBoYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLnV0aWwuVGVzdENvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmhhbmRsZXJzLkFic3RyYWN0SGFuZGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmludGVncmF0aW9uLlRlc3RpbmdVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmludGVncmF0aW9uLlV0aWxTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pbnRlZ3JhdGlvbi5VdGlsU2VydmVyQmFzZWRUZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnBoYXNlcmVzb2x2ZXIuUGhhc2VNZXRhZGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuVXRpbHM7Ci0KLWltcG9ydCBqYXZheC5hY3RpdmF0aW9uLkRhdGFIYW5kbGVyOwotaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRmlsZURhdGFTb3VyY2U7Ci1pbXBvcnQgamF2YXguaW1hZ2Vpby5JbWFnZUlPOwotaW1wb3J0IGphdmEuYXd0LmltYWdlLkJ1ZmZlcmVkSW1hZ2U7Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi0vKioKLSAqIFRoaXMgdGVzdHMgdGhlIHNhdmluZyBhbmQgcmVzdG9yaW5nIG9mIHRoZSBBeGlzMiBjb250ZXh0cyBmcm9tIHdpdGhpbiBhIGhhbmRsZXIgd2hlbiBNVE9NIGlzCi0gKiB1c2VkLiAgVGhpcyBpcyBhIG1vcmUgdGhvcm91Z2ggdGVzdCBvZiB0aGUgc2VyaWFsaXphdGlvbiBtZWNoYW5pc21zIHRoYW4gdGhlIG90aGVyIHVuaXQgdGVzdHMsIGFzCi0gKiB0aGUgY29udGV4dHMgYXJlIHBvcHVsYXRlZCBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIEF4aXMyIGNvZGVwYXRoLgotICovCi1wdWJsaWMgY2xhc3MgTWVzc2FnZVNhdmVBbmRSZXN0b3JlV2l0aE1UT01UZXN0IGV4dGVuZHMgVXRpbFNlcnZlckJhc2VkVGVzdENhc2UKLSAgICAgICAgaW1wbGVtZW50cyBUZXN0Q29uc3RhbnRzIHsKLSAgICBwcml2YXRlIE9NVGV4dEltcGwgZXhwZWN0ZWRUZXh0RGF0YSA9IG51bGw7Ci0KLSAgICBwdWJsaWMgTWVzc2FnZVNhdmVBbmRSZXN0b3JlV2l0aE1UT01UZXN0KCkgewotICAgICAgICBzdXBlcihNZXNzYWdlU2F2ZUFuZFJlc3RvcmVXaXRoTVRPTVRlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKLQotICAgICAgICBvcmcuYXBhY2hlLmxvZzRqLkJhc2ljQ29uZmlndXJhdG9yLmNvbmZpZ3VyZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBNZXNzYWdlU2F2ZUFuZFJlc3RvcmVXaXRoTVRPTVRlc3QoU3RyaW5nIHRlc3ROYW1lKSB7Ci0gICAgICAgIHN1cGVyKHRlc3ROYW1lKTsKLQotICAgICAgICBvcmcuYXBhY2hlLmxvZzRqLkJhc2ljQ29uZmlndXJhdG9yLmNvbmZpZ3VyZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgcmV0dXJuIGdldFRlc3RTZXR1cDIobmV3IFRlc3RTdWl0ZShNZXNzYWdlU2F2ZUFuZFJlc3RvcmVXaXRoTVRPTVRlc3QuY2xhc3MpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXN0aW5nVXRpbHMucHJlZml4QmFzZURpcmVjdG9yeShDb25zdGFudHMuVEVTVElOR19QQVRIICsgIk1UT00tZW5hYmxlZFJlcG9zaXRvcnkiKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICBBeGlzU2VydmljZSBzZXJ2aWNlID0gVXRpbHMuY3JlYXRlU2ltcGxlU2VydmljZShUZXN0Q29uc3RhbnRzLnNlcnZpY2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFY2hvLmNsYXNzLmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVzdENvbnN0YW50cy5vcGVyYXRpb25OYW1lKTsKLSAgICAgICAgVXRpbFNlcnZlci5kZXBsb3lTZXJ2aWNlKHNlcnZpY2UpOwotCi0gICAgICAgIEF4aXNPcGVyYXRpb24gb3BlcmF0aW9uID0gc2VydmljZS5nZXRPcGVyYXRpb24oVGVzdENvbnN0YW50cy5vcGVyYXRpb25OYW1lKTsKLQotICAgICAgICBBcnJheUxpc3QgcGhhc2VzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBwaGFzZXMuYWRkKG5ldyBQaGFzZShQaGFzZU1ldGFkYXRhLlBIQVNFX1BPTElDWV9ERVRFUk1JTkFUSU9OKSk7Ci0gICAgICAgIG9wZXJhdGlvbi5zZXRSZW1haW5pbmdQaGFzZXNJbkZsb3cocGhhc2VzKTsKLSAgICAgICAgQXJyYXlMaXN0IHBoYXNlID0gb3BlcmF0aW9uLmdldFJlbWFpbmluZ1BoYXNlc0luRmxvdygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBoYXNlLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBQaGFzZSBwaGFzZTEgPSAoUGhhc2UpcGhhc2UuZ2V0KGkpOwotICAgICAgICAgICAgaWYgKFBoYXNlTWV0YWRhdGEuUEhBU0VfUE9MSUNZX0RFVEVSTUlOQVRJT04uZXF1YWxzKHBoYXNlMS5nZXRQaGFzZU5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICBwaGFzZTEuYWRkSGFuZGxlcihpbmJvdW5kSGFuZGxlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwaGFzZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIHBoYXNlcy5hZGQobmV3IFBoYXNlKFBoYXNlTWV0YWRhdGEuUEhBU0VfUE9MSUNZX0RFVEVSTUlOQVRJT04pKTsKLSAgICAgICAgb3BlcmF0aW9uLnNldFBoYXNlc091dEZsb3cocGhhc2VzKTsKLSAgICAgICAgcGhhc2UgPSBvcGVyYXRpb24uZ2V0UGhhc2VzT3V0RmxvdygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBoYXNlLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBQaGFzZSBwaGFzZTEgPSAoUGhhc2UpcGhhc2UuZ2V0KGkpOwotICAgICAgICAgICAgaWYgKFBoYXNlTWV0YWRhdGEuUEhBU0VfUE9MSUNZX0RFVEVSTUlOQVRJT04uZXF1YWxzKHBoYXNlMS5nZXRQaGFzZU5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICBwaGFzZTEuYWRkSGFuZGxlcihvdXRib3VuZEhhbmRsZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgVXRpbFNlcnZlci51bkRlcGxveVNlcnZpY2UoVGVzdENvbnN0YW50cy5zZXJ2aWNlTmFtZSk7Ci0gICAgICAgIFV0aWxTZXJ2ZXIudW5EZXBsb3lDbGllbnRTZXJ2aWNlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNhdmVBbmRSZXN0b3JlT2ZNZXNzYWdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE9NRWxlbWVudCBwYXlsb2FkID0gY3JlYXRlRW52ZWxvcGUoKTsKLQotICAgICAgICBPcHRpb25zIG9wdGlvbnMgPSBuZXcgT3B0aW9ucygpOwotICAgICAgICBvcHRpb25zLnNldFRvKFRlc3RDb25zdGFudHMudGFyZ2V0RVBSKTsKLSAgICAgICAgb3B0aW9ucy5zZXRQcm9wZXJ0eShDb25zdGFudHMuQ29uZmlndXJhdGlvbi5FTkFCTEVfTVRPTSwgQ29uc3RhbnRzLlZBTFVFX1RSVUUpOwotICAgICAgICBvcHRpb25zLnNldFRyYW5zcG9ydEluUHJvdG9jb2woQ29uc3RhbnRzLlRSQU5TUE9SVF9IVFRQKTsKLSAgICAgICAgb3B0aW9ucy5zZXRTb2FwVmVyc2lvblVSSShTT0FQMTJDb25zdGFudHMuU09BUF9FTlZFTE9QRV9OQU1FU1BBQ0VfVVJJKTsKLSAgICAgICAgb3B0aW9ucy5zZXRBY3Rpb24oCi0gICAgICAgICAgICAgICAgQ29uc3RhbnRzLkFYSVMyX05BTUVTUEFDRV9VUkkgKyAiLyIgKyBUZXN0Q29uc3RhbnRzLm9wZXJhdGlvbk5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICBvcHRpb25zLnNldFVzZVNlcGFyYXRlTGlzdGVuZXIodHJ1ZSk7Ci0gICAgICAgIG9wdGlvbnMuc2V0VGltZU91dEluTWlsbGlTZWNvbmRzKDUwMDAwKTsKLQotICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWd1cmF0aW9uQ29udGV4dCA9IENvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeQotICAgICAgICAgICAgICAgIC5jcmVhdGVDb25maWd1cmF0aW9uQ29udGV4dEZyb21GaWxlU3lzdGVtKFRlc3RpbmdVdGlscy5wcmVmaXhCYXNlRGlyZWN0b3J5KCJ0YXJnZXQvdGVzdC1yZXNvdXJjZXMvaW50ZWdyYXRpb25SZXBvIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCk7Ci0KLSAgICAgICAgU2VydmljZUNsaWVudCBzZW5kZXIgPSBuZXcgU2VydmljZUNsaWVudChjb25maWd1cmF0aW9uQ29udGV4dCwgbnVsbCk7Ci0gICAgICAgIHNlbmRlci5zZXRPcHRpb25zKG9wdGlvbnMpOwotICAgICAgICBzZW5kZXIuZW5nYWdlTW9kdWxlKCJhZGRyZXNzaW5nIik7Ci0KLSAgICAgICAgT01FbGVtZW50IHJlc3VsdCA9IHNlbmRlci5zZW5kUmVjZWl2ZShwYXlsb2FkKTsKLQotICAgICAgICBPTUVsZW1lbnQgZWxlbWVudCA9IChPTUVsZW1lbnQpcmVzdWx0LmdldEZpcnN0T01DaGlsZCgpOwotICAgICAgICBPTVRleHQgYmluYXJ5Tm9kZSA9IChPTVRleHQpZWxlbWVudC5nZXRGaXJzdE9NQ2hpbGQoKTsKLQotICAgICAgICBjb21wYXJlV2l0aENyZWF0ZWRPTVRleHQoYmluYXJ5Tm9kZSk7Ci0KLSAgICAgICAgRGF0YUhhbmRsZXIgYWN0dWFsREggPSAoRGF0YUhhbmRsZXIpYmluYXJ5Tm9kZS5nZXREYXRhSGFuZGxlcigpOwotICAgICAgICBCdWZmZXJlZEltYWdlIGJpID0gSW1hZ2VJTy5yZWFkKGFjdHVhbERILmdldERhdGFTb3VyY2UoKS5nZXRJbnB1dFN0cmVhbSgpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgT01FbGVtZW50IGNyZWF0ZUVudmVsb3BlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE9NRmFjdG9yeSBvbUZhY3RvcnkgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKTsKLSAgICAgICAgT01OYW1lc3BhY2Ugb21OYW1lc3BhY2UgPSBvbUZhY3RvcnkuY3JlYXRlT01OYW1lc3BhY2UoImh0dHA6Ly9sb2NhbGhvc3QvbXkiLCAibXkiKTsKLSAgICAgICAgT01FbGVtZW50IHJwY1dyYXBwZXJFbGVtZW50ID0gb21GYWN0b3J5LmNyZWF0ZU9NRWxlbWVudCgiZWNob09NRWxlbWVudCIsIG9tTmFtZXNwYWNlKTsKLSAgICAgICAgT01FbGVtZW50IGRhdGEgPSBvbUZhY3RvcnkuY3JlYXRlT01FbGVtZW50KCJkYXRhIiwgb21OYW1lc3BhY2UpOwotCi0gICAgICAgIEZpbGVEYXRhU291cmNlIGZpbGVEYXRhU291cmNlID0gbmV3IEZpbGVEYXRhU291cmNlKFRlc3RpbmdVdGlscy5wcmVmaXhCYXNlRGlyZWN0b3J5KCJ0ZXN0LXJlc291cmNlcy9tdG9tL3Rlc3QuanBnIikpOwotICAgICAgICBEYXRhSGFuZGxlciBleHBlY3RlZERhdGFIYW5kbGVyID0gbmV3IERhdGFIYW5kbGVyKGZpbGVEYXRhU291cmNlKTsKLSAgICAgICAgZXhwZWN0ZWRUZXh0RGF0YSA9IG5ldyBPTVRleHRJbXBsKGV4cGVjdGVkRGF0YUhhbmRsZXIsIHRydWUsIG9tRmFjdG9yeSk7Ci0gICAgICAgIGRhdGEuYWRkQ2hpbGQoZXhwZWN0ZWRUZXh0RGF0YSk7Ci0gICAgICAgIHJwY1dyYXBwZXJFbGVtZW50LmFkZENoaWxkKGRhdGEpOwotICAgICAgICByZXR1cm4gcnBjV3JhcHBlckVsZW1lbnQ7Ci0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgSW5wdXRTdHJlYW0gZ2V0UmVzb3VyY2VBc1N0cmVhbShTdHJpbmcgcGF0aCkgewotICAgICAgICByZXR1cm4gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKHBhdGgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGNvbXBhcmVXaXRoQ3JlYXRlZE9NVGV4dChPTVRleHQgYWN0dWFsVGV4dERhdGEpIHsKLSAgICAgICAgU3RyaW5nIG9yaWdpbmFsVGV4dFZhbHVlID0gZXhwZWN0ZWRUZXh0RGF0YS5nZXRUZXh0KCk7Ci0gICAgICAgIFN0cmluZyByZXR1cm5lZFRleHRWYWx1ZSA9IGFjdHVhbFRleHREYXRhLmdldFRleHQoKTsKLSAgICAgICAgVGVzdENhc2UuYXNzZXJ0RXF1YWxzKHJldHVybmVkVGV4dFZhbHVlLCBvcmlnaW5hbFRleHRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBIYW5kbGVyIGluYm91bmRIYW5kbGVyID0gbmV3IEFic3RyYWN0SGFuZGxlcigpIHsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIHN0YXRlUHJvcGVydHkgPSAiSW5ib3VuZEhhbmRsZXJTdGF0ZSI7Ci0KLSAgICAgICAgcHVibGljIEludm9jYXRpb25SZXNwb25zZSBpbnZva2UoTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJNZXNzYWdlU2F2ZUFuZFJlc3RvcmVXaXRoTVRPTVRlc3Q6SW5ib3VuZCBoYW5kbGVyIGludm9rZWQiKTsKLSAgICAgICAgICAgIGlmIChtZXNzYWdlQ29udGV4dC5nZXRQcm9wZXJ0eShzdGF0ZVByb3BlcnR5KSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJNZXNzYWdlU2F2ZUFuZFJlc3RvcmVXaXRoTVRPTVRlc3Q6U3VzcGVuZGluZyBwcm9jZXNzaW5nIik7Ci0gICAgICAgICAgICAgICAgbWVzc2FnZUNvbnRleHQuc2V0UHJvcGVydHkoc3RhdGVQcm9wZXJ0eSwgbmV3IE9iamVjdCgpKTsKLSAgICAgICAgICAgICAgICBtZXNzYWdlQ29udGV4dC5wYXVzZSgpOwotICAgICAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBieXRlQXJyYXlPdXRwdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgT2JqZWN0T3V0cHV0U3RyZWFtIG9iamVjdE91dHB1dFN0cmVhbSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdE91dHB1dFN0cmVhbShieXRlQXJyYXlPdXRwdXRTdHJlYW0pOwotICAgICAgICAgICAgICAgICAgICBvYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVPYmplY3QobWVzc2FnZUNvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICBvYmplY3RPdXRwdXRTdHJlYW0uZmx1c2goKTsKLSAgICAgICAgICAgICAgICAgICAgb2JqZWN0T3V0cHV0U3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJ5dGVBcnJheU91dHB1dFN0cmVhbS5mbHVzaCgpOwotICAgICAgICAgICAgICAgICAgICBieXRlQXJyYXlPdXRwdXRTdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgZmFpbCgiQW4gZXJyb3Igb2NjdXJyZWQgd2hlbiBzZXJpYWxpemluZyB0aGUgTWVzc2FnZUNvbnRleHQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbmV3IFdvcmtlcihieXRlQXJyYXlPdXRwdXRTdHJlYW0udG9CeXRlQXJyYXkoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VDb250ZXh0LmdldENvbmZpZ3VyYXRpb25Db250ZXh0KCkpLnN0YXJ0KCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigKLSAgICAgICAgICAgICAgICAgICAgICAgICJNZXNzYWdlU2F2ZUFuZFJlc3RvcmVXaXRoTVRPTVRlc3Q6U2tpcHBpbmcgcHJldmlvdXNseSBpbnZva2VkIEluYm91bmQgaGFuZGxlciIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIEludm9jYXRpb25SZXNwb25zZS5DT05USU5VRTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwcml2YXRlIEhhbmRsZXIgb3V0Ym91bmRIYW5kbGVyID0gbmV3IEFic3RyYWN0SGFuZGxlcigpIHsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICAgICAgcHVibGljIEludm9jYXRpb25SZXNwb25zZSBpbnZva2UoTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJNZXNzYWdlU2F2ZUFuZFJlc3RvcmVXaXRoTVRPTVRlc3Q6T3V0Ym91bmQgaGFuZGxlciBpbnZva2VkIik7Ci0gICAgICAgICAgICByZXR1cm4gSW52b2NhdGlvblJlc3BvbnNlLkNPTlRJTlVFOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgY2xhc3MgV29ya2VyIGV4dGVuZHMgVGhyZWFkIHsKLSAgICAgICAgcHJpdmF0ZSBieXRlW10gc2VyaWFsaXplZE1lc3NhZ2VDb250ZXh0OwotICAgICAgICBwcml2YXRlIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ3VyYXRpb25Db250ZXh0OwotCi0gICAgICAgIHB1YmxpYyBXb3JrZXIoYnl0ZVtdIHNlcmlhbGl6ZWRNZXNzYWdlQ29udGV4dCwgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlndXJhdGlvbkNvbnRleHQpIHsKLSAgICAgICAgICAgIHRoaXMuc2VyaWFsaXplZE1lc3NhZ2VDb250ZXh0ID0gc2VyaWFsaXplZE1lc3NhZ2VDb250ZXh0OwotICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uQ29udGV4dCA9IGNvbmZpZ3VyYXRpb25Db250ZXh0OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk1lc3NhZ2VTYXZlQW5kUmVzdG9yZVdpdGhNVE9NVGVzdDpXb3JrZXIgdGhyZWFkIHN0YXJ0ZWQiKTsKLSAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoNTAwMCk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJNZXNzYWdlU2F2ZUFuZFJlc3RvcmVXaXRoTVRPTVRlc3Q6UmVzdW1pbmcgcHJvY2Vzc2luZyIpOwotICAgICAgICAgICAgICAgIE9iamVjdElucHV0U3RyZWFtIG9iamVjdElucHV0U3RyZWFtID0KLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RJbnB1dFN0cmVhbShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oc2VyaWFsaXplZE1lc3NhZ2VDb250ZXh0KSk7Ci0gICAgICAgICAgICAgICAgTWVzc2FnZUNvbnRleHQgcmVjb25zdGl0dXRlZE1lc3NhZ2VDb250ZXh0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChNZXNzYWdlQ29udGV4dClvYmplY3RJbnB1dFN0cmVhbS5yZWFkT2JqZWN0KCk7Ci0gICAgICAgICAgICAgICAgcmVjb25zdGl0dXRlZE1lc3NhZ2VDb250ZXh0LmFjdGl2YXRlKGNvbmZpZ3VyYXRpb25Db250ZXh0KTsKLSAgICAgICAgICAgICAgICBBeGlzRW5naW5lLnJlc3VtZShyZWNvbnN0aXR1dGVkTWVzc2FnZUNvbnRleHQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgICAgICBmYWlsKCJBbiBlcnJvciBvY2N1cnJlZCBpbiB0aGUgd29ya2VyIHRocmVhZCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL29tL09NQXR0cmlidXRlVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL29tL09NQXR0cmlidXRlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjk3ZjM0Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9vbS9PTUF0dHJpYnV0ZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5vbTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmJ1aWxkZXIuU3RBWE9NQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuU3RyZWFtV3JhcHBlcjsKLWltcG9ydCB6YS5jby5lc2tvbS5ucnMueG1sdmVuZC5iYXNlLngyMC5zY2hlbWEuQWR2aWNlUmVxRG9jdW1lbnQ7Ci1pbXBvcnQgemEuY28uZXNrb20ubnJzLnhtbHZlbmQuYmFzZS54MjAuc2NoZW1hLkNvbmZpcm1hdGlvbkFkdmljZVJlcTsKLWltcG9ydCB6YS5jby5lc2tvbS5ucnMueG1sdmVuZC5iYXNlLngyMC5zY2hlbWEuTXNnSUQ7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi0vKioKLSAqIFRvIHJ1biB0aGlzIHRlc3QsbWF2ZW4gYnVpbGQgc2hvdWxkIGhhdmUgYmVlbiBydW4gYW5kIHRoZSByZWxldmFudCB0eXBlIGNsYXNzZXMgbmVlZCB0byBiZQotICogZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBPTUF0dHJpYnV0ZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXR0cmliTmFtZXNwYWNlKCkgewotCi0gICAgICAgIC8vY3JlYXRlIGEgZG9jdW1lbnRUeXBlCi0gICAgICAgIEFkdmljZVJlcURvY3VtZW50IGRvYyA9IEFkdmljZVJlcURvY3VtZW50LkZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgQ29uZmlybWF0aW9uQWR2aWNlUmVxIHJlcSA9IENvbmZpcm1hdGlvbkFkdmljZVJlcS5GYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIE1zZ0lEIG1zZ0lEID0gcmVxLmFkZE5ld0FkdmljZVJlcU1zZ0lEKCk7Ci0gICAgICAgIG1zZ0lELnNldFVuaXF1ZU51bWJlcigxMSk7Ci0gICAgICAgIHJlcS5hZGROZXdDbGllbnRJRCgpOwotICAgICAgICBkb2Muc2V0QWR2aWNlUmVxKHJlcSk7Ci0KLSAgICAgICAgLy9nZXQgdGhlIHB1bGwgcGFyc2VyIGFuZCBjb25zdHJ1Y3QgdGhlIE9NRWxlbWVudAotICAgICAgICBTdEFYT01CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RBWE9NQnVpbGRlcigKLSAgICAgICAgICAgICAgICBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKSwKLSAgICAgICAgICAgICAgICBuZXcgU3RyZWFtV3JhcHBlcihkb2MubmV3WE1MU3RyZWFtUmVhZGVyKCkpCi0gICAgICAgICk7Ci0gICAgICAgIE9NRWxlbWVudCBlbHQgPSBidWlsZGVyLmdldERvY3VtZW50RWxlbWVudCgpOwotCi0gICAgICAgIC8vdHJhdmVyc2UgdGhlIGVsZW1lbnQgYW5kIGxvb2sgYXQgdGhlIG5hbWVzcGFjZSBvZiB0aGUgYXR0cmlidXRlCi0gICAgICAgIE9NQXR0cmlidXRlIGF0dCA9Ci0gICAgICAgICAgICAgICAgZWx0LmdldEF0dHJpYnV0ZShuZXcgUU5hbWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwgInR5cGUiKSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoYXR0KTsKLQotICAgICAgICBTdHJpbmcgcHJlZml4ID0gYXR0LmdldE5hbWVzcGFjZSgpLmdldFByZWZpeCgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHByZWZpeCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhwcmVmaXgsICJ4c2kiKTsKLQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3Byb2Nlc3NpbmdNb2RlbC9Tb2FwUHJvY2Vzc2luZ01vZGVsVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3Byb2Nlc3NpbmdNb2RlbC9Tb2FwUHJvY2Vzc2luZ01vZGVsVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmY0ZjhlLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9wcm9jZXNzaW5nTW9kZWwvU29hcFByb2Nlc3NpbmdNb2RlbFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5wcm9jZXNzaW5nTW9kZWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01OYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVAxMkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBIZWFkZXJCbG9jazsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5TZXJ2aWNlQ2xpZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkVjaG87Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pbnRlZ3JhdGlvbi5Mb2NhbFRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaW50ZWdyYXRpb24uVGVzdGluZ1V0aWxzOwotCi1wdWJsaWMgY2xhc3MgU29hcFByb2Nlc3NpbmdNb2RlbFRlc3QgZXh0ZW5kcyBMb2NhbFRlc3RDYXNlIHsKLQkKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIAlzdXBlci5zZXRVcCgpOwotICAgIAlkZXBsb3lDbGFzc0FzU2VydmljZShFY2hvLlNFUlZJQ0VfTkFNRSwgRWNoby5jbGFzcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNlbmRpbmdNdXN0VW5kZXJzdGFuZFdpdGhOZXh0Um9sZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTZXJ2aWNlQ2xpZW50IHNlcnZpY2VDbGllbnQgPSBnZXRDbGllbnQoRWNoby5TRVJWSUNFX05BTUUsIEVjaG8uRUNIT19PTV9FTEVNRU5UX09QX05BTUUpOwotICAgICAgICAKLSAgICAgICAgU09BUEZhY3RvcnkgZmFjID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDEyRmFjdG9yeSgpOwotICAgICAgICBPTU5hbWVzcGFjZSBoZWFkZXJOcyA9IGZhYy5jcmVhdGVPTU5hbWVzcGFjZSgiaHR0cDovL2R1bW15SGVhZGVyIiwgImRoIik7Ci0gICAgICAgIFNPQVBIZWFkZXJCbG9jayBoMSA9IGZhYy5jcmVhdGVTT0FQSGVhZGVyQmxvY2soIkR1bW15SGVhZGVyIiwgaGVhZGVyTnMpOwotICAgICAgICBoMS5zZXRNdXN0VW5kZXJzdGFuZCh0cnVlKTsKLSAgICAgICAgaDEuYWRkQ2hpbGQoZmFjLmNyZWF0ZU9NVGV4dCgiRHVtbXkgU3RyaW5nIikpOwotICAgICAgICBoMS5zZXRSb2xlKFNPQVAxMkNvbnN0YW50cy5TT0FQX1JPTEVfTkVYVCk7Ci0gICAgICAgIAotICAgICAgICBzZXJ2aWNlQ2xpZW50LmFkZEhlYWRlcihoMSk7Ci0gICAgICAgIAotICAgICAgICBPTUVsZW1lbnQgcGF5bG9hZCA9IFRlc3RpbmdVdGlscy5jcmVhdGVEdW1teU9NRWxlbWVudCgpOwotCi0gICAgICAgIHNlcnZpY2VDbGllbnQuZ2V0T3B0aW9ucygpLnNldFNvYXBWZXJzaW9uVVJJKFNPQVAxMkNvbnN0YW50cy5TT0FQX0VOVkVMT1BFX05BTUVTUEFDRV9VUkkpOwotICAgICAgICAKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgCXNlcnZpY2VDbGllbnQuc2VuZFJlY2VpdmUocGF5bG9hZCk7Ci0gICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBmYXVsdCkgewotICAgICAgICAgICAgLy8gVGhpcyBzaG91bGQgYmUgYSBNdXN0VW5kZXJzdGFuZCBmYXVsdAotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGZhdWx0LmdldEZhdWx0Q29kZSgpLCBTT0FQMTJDb25zdGFudHMuUU5BTUVfTVVfRkFVTFRDT0RFKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBmYWlsKCJNVSBoZWFkZXIgd2FzIHByb2Nlc3NlZCIpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ycGMvQWRkcmVzc0JlYW4uamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ycGMvQWRkcmVzc0JlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTkyYTQxYS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvcnBjL0FkZHJlc3NCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucnBjOwotCi1wdWJsaWMgY2xhc3MgQWRkcmVzc0JlYW4gewotICAgIHByaXZhdGUgU3RyaW5nIHRvd247Ci0gICAgcHJpdmF0ZSBpbnQgbnVtYmVyOwotCi0gICAgcHVibGljIFN0cmluZyBnZXRUb3duKCkgewotICAgICAgICByZXR1cm4gdG93bjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRUb3duKFN0cmluZyB0b3duKSB7Ci0gICAgICAgIHRoaXMudG93biA9IHRvd247Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXROdW1iZXIoKSB7Ci0gICAgICAgIHJldHVybiBudW1iZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TnVtYmVyKGludCBudW1iZXIpIHsKLSAgICAgICAgdGhpcy5udW1iZXIgPSBudW1iZXI7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuICgidG93bjogIiArIHRvd24gKyAiIG51bWJlciA6IiArIG51bWJlcik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JwYy9BZGRyZXNzQm9va1NlcnZpY2UuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ycGMvQWRkcmVzc0Jvb2tTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmYjk5YTMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JwYy9BZGRyZXNzQm9va1NlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5ycGM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotcHVibGljIGNsYXNzIEFkZHJlc3NCb29rU2VydmljZSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBIYXNoTWFwIGVudHJpZXMgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgLyoqCi0gICAgICogQWRkIGFuIEVudHJ5IHRvIHRoZSBBZGRyZXNzIEJvb2sKLSAgICAgKgotICAgICAqIEBwYXJhbSBlbnRyeQotICAgICAqLwotICAgIHB1YmxpYyBpbnQgYWRkRW50cnkoRW50cnkgZW50cnkpIHsKLSAgICAgICAgdGhpcy5lbnRyaWVzLnB1dChlbnRyeS5nZXROYW1lKCksIGVudHJ5KTsKLSAgICAgICAgcmV0dXJuIGVudHJpZXMuc2l6ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlYXJjaCBhbiBhZGRyZXNzIG9mIGEgcGVyc29uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcGVyc29uIHdob3NlIGFkZHJlc3MgbmVlZHMgdG8gYmUgZm91bmQKLSAgICAgKiBAcmV0dXJuIHJldHVybiB0aGUgYWRkcmVzcyBlbnRyeSBvZiB0aGUgcGVyc29uLgotICAgICAqLwotICAgIHB1YmxpYyBFbnRyeSBmaW5kRW50cnkoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgcmV0dXJuIChFbnRyeSkgdGhpcy5lbnRyaWVzLmdldChuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRW50cnlbXSBnZXRFbnRyaWVzMSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBFbnRyeVtde2NyZWF0ZUVudHJ5KCksIGNyZWF0ZUVudHJ5KCl9OwotICAgIH0KLQotICAgIHB1YmxpYyBFbnRyeVtdIGdldEVudHJpZXMyKCkgewotICAgICAgICByZXR1cm4gbmV3IEVudHJ5WzBdOwotICAgIH0KLQotICAgIHB1YmxpYyBFbnRyeVtdIGdldEVudHJpZXMzKCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEVudHJ5IGNyZWF0ZUVudHJ5KCkgewotICAgICAgICBFbnRyeSBlbnRyeSA9IG5ldyBFbnRyeSgpOwotICAgICAgICBlbnRyeS5zZXROYW1lKCJKb2huIE5vcm1hbmR5Iik7Ci0gICAgICAgIGVudHJ5LnNldFN0cmVldCgiNTU1IEJyb2Fkd2F5Iik7Ci0gICAgICAgIGVudHJ5LnNldENpdHkoIkNhbWJyaWRnZSIpOwotICAgICAgICBlbnRyeS5zZXRTdGF0ZSgiTUEiKTsKLSAgICAgICAgZW50cnkuc2V0UG9zdGFsQ29kZSgiMDEyMzQiKTsKLSAgICAgICAgcmV0dXJuIGVudHJ5OwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JwYy9BZGRyZXNzU2VydmljZVRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ycGMvQWRkcmVzc1NlcnZpY2VUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhMTgyNzIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JwYy9BZGRyZXNzU2VydmljZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucnBjOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50Lk9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5XU0RMMkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmludGVncmF0aW9uLkxvY2FsVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ycGMuY2xpZW50LlJQQ1NlcnZpY2VDbGllbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ycGMucmVjZWl2ZXJzLlJQQ0luT25seU1lc3NhZ2VSZWNlaXZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJwYy5yZWNlaXZlcnMuUlBDTWVzc2FnZVJlY2VpdmVyOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotcHVibGljIGNsYXNzIEFkZHJlc3NTZXJ2aWNlVGVzdCBleHRlbmRzIExvY2FsVGVzdENhc2UKLXsKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgICAgICBzZXJ2ZXJDb25maWcuYWRkTWVzc2FnZVJlY2VpdmVyKFdTREwyQ29uc3RhbnRzLk1FUF9VUklfSU5fT05MWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUlBDSW5Pbmx5TWVzc2FnZVJlY2VpdmVyKCkpOwotICAgICAgICBzZXJ2ZXJDb25maWcuYWRkTWVzc2FnZVJlY2VpdmVyKFdTREwyQ29uc3RhbnRzLk1FUF9VUklfSU5fT1VULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBSUENNZXNzYWdlUmVjZWl2ZXIoKSk7Ci0gICAgICAgIGRlcGxveUNsYXNzQXNTZXJ2aWNlKCJBZGRyZXNzQm9va1NlcnZpY2UiLCBBZGRyZXNzQm9va1NlcnZpY2UuY2xhc3MpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkQW5kRmV0Y2hFbnRyeSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBRTmFtZSBvcEFkZEVudHJ5ID0gbmV3IFFOYW1lKCJodHRwOi8vcnBjLmF4aXMyLmFwYWNoZS5vcmciLCAiYWRkRW50cnkiKTsKLQotICAgICAgICBFbnRyeSBlbnRyeSA9IG5ldyBFbnRyeSgpOwotCi0gICAgICAgIGVudHJ5LnNldE5hbWUoIkFiYnkgQ2FkYWJieSIpOwotICAgICAgICBlbnRyeS5zZXRTdHJlZXQoIlNlc2FtZSBTdHJlZXQiKTsKLSAgICAgICAgZW50cnkuc2V0Q2l0eSgiU2VzYW1lIENpdHkiKTsKLSAgICAgICAgZW50cnkuc2V0U3RhdGUoIlNlc2FtZSBTdGF0ZSIpOwotICAgICAgICBlbnRyeS5zZXRQb3N0YWxDb2RlKCIxMTExMSIpOwotCi0gICAgICAgIC8vIENvbnN0cnVjdGluZyB0aGUgYXJndW1lbnRzIGFycmF5IGZvciB0aGUgbWV0aG9kIGludm9jYXRpb24KLSAgICAgICAgT2JqZWN0W10gb3BBZGRFbnRyeUFyZ3MgPSBuZXcgT2JqZWN0W10geyBlbnRyeSB9OwotCi0gICAgICAgIC8vIEludm9raW5nIHRoZSBtZXRob2QKLSAgICAgICAgUlBDU2VydmljZUNsaWVudCBzZXJ2aWNlQ2xpZW50ID0gZ2V0UlBDQ2xpZW50KCk7Ci0gICAgICAgIE9wdGlvbnMgb3B0aW9ucyA9IHNlcnZpY2VDbGllbnQuZ2V0T3B0aW9ucygpOwotICAgICAgICBFbmRwb2ludFJlZmVyZW5jZSB0YXJnZXRFUFIgPSBuZXcgRW5kcG9pbnRSZWZlcmVuY2UoCi0gICAgICAgICAgICAgICAgImxvY2FsOi8vc2VydmljZXMvQWRkcmVzc0Jvb2tTZXJ2aWNlIik7Ci0gICAgICAgIG9wdGlvbnMuc2V0VG8odGFyZ2V0RVBSKTsKLSAgICAgICAgb3B0aW9ucy5zZXRBY3Rpb24oImFkZEVudHJ5Iik7Ci0KLSAgICAgICAgT2JqZWN0W10gcmV0ID0gc2VydmljZUNsaWVudC5pbnZva2VCbG9ja2luZyhvcEFkZEVudHJ5LCBvcEFkZEVudHJ5QXJncywgbmV3IENsYXNzW117SW50ZWdlci5jbGFzc30pOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0WzBdLCBuZXcgSW50ZWdlcigxKSk7Ci0KLSAgICAgICAgUU5hbWUgb3BGaW5kRW50cnkgPSBuZXcgUU5hbWUoImh0dHA6Ly9ycGMuYXhpczIuYXBhY2hlLm9yZyIsICJmaW5kRW50cnkiKTsKLSAgICAgICAgU3RyaW5nIG5hbWUgPSAiQWJieSBDYWRhYmJ5IjsKLQotICAgICAgICBPYmplY3RbXSBvcEZpbmRFbnRyeUFyZ3MgPSBuZXcgT2JqZWN0W10geyBuYW1lIH07Ci0gICAgICAgIENsYXNzW10gcmV0dXJuVHlwZXMgPSBuZXcgQ2xhc3NbXSB7IEVudHJ5LmNsYXNzIH07Ci0KLSAgICAgICAgUlBDU2VydmljZUNsaWVudCBzZXJ2aWNlQ2xpZW50MiA9IGdldFJQQ0NsaWVudCgpOwotICAgICAgICBPcHRpb25zIG9wdGlvbnMyID0gc2VydmljZUNsaWVudDIuZ2V0T3B0aW9ucygpOwotICAgICAgICBFbmRwb2ludFJlZmVyZW5jZSB0YXJnZXRFUFIyID0gbmV3IEVuZHBvaW50UmVmZXJlbmNlKAotICAgICAgICAgICAgICAgICJsb2NhbDovL3NlcnZpY2VzL0FkZHJlc3NCb29rU2VydmljZSIpOwotICAgICAgICBvcHRpb25zMi5zZXRUbyh0YXJnZXRFUFIyKTsKLSAgICAgICAgb3B0aW9uczIuc2V0QWN0aW9uKCJmaW5kRW50cnkiKTsKLSAgICAgICAgT2JqZWN0W10gcmVzcG9uc2UgPSBzZXJ2aWNlQ2xpZW50Mi5pbnZva2VCbG9ja2luZyhvcEZpbmRFbnRyeSwKLSAgICAgICAgICAgICAgICBvcEZpbmRFbnRyeUFyZ3MsIHJldHVyblR5cGVzKTsKLQotICAgICAgICBFbnRyeSByZXN1bHQgPSAoRW50cnkpIHJlc3BvbnNlWzBdOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJOYW1lICAgOiIgKyByZXN1bHQuZ2V0TmFtZSgpKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTdHJlZXQgOiIgKyByZXN1bHQuZ2V0U3RyZWV0KCkpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNpdHkgICA6IiArIHJlc3VsdC5nZXRDaXR5KCkpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlN0YXRlICA6IiArIHJlc3VsdC5nZXRTdGF0ZSgpKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJQb3N0YWwgQ29kZSA6IiArIHJlc3VsdC5nZXRQb3N0YWxDb2RlKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFbnRyeTEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgUU5hbWUgb3BBZGRFbnRyeSA9IG5ldyBRTmFtZSgiaHR0cDovL3JwYy5heGlzMi5hcGFjaGUub3JnIiwgImdldEVudHJpZXMxIik7Ci0KLSAgICAgICAgT2JqZWN0W10gb3BBZGRFbnRyeUFyZ3MgPSBuZXcgT2JqZWN0W10geyB9OwotCi0gICAgICAgIC8vIEludm9raW5nIHRoZSBtZXRob2QKLSAgICAgICAgUlBDU2VydmljZUNsaWVudCBzZXJ2aWNlQ2xpZW50ID0gZ2V0UlBDQ2xpZW50KCk7Ci0gICAgICAgIE9wdGlvbnMgb3B0aW9ucyA9IHNlcnZpY2VDbGllbnQuZ2V0T3B0aW9ucygpOwotICAgICAgICBFbmRwb2ludFJlZmVyZW5jZSB0YXJnZXRFUFIgPSBuZXcgRW5kcG9pbnRSZWZlcmVuY2UoCi0gICAgICAgICAgICAgICAgImxvY2FsOi8vc2VydmljZXMvQWRkcmVzc0Jvb2tTZXJ2aWNlIik7Ci0gICAgICAgIG9wdGlvbnMuc2V0VG8odGFyZ2V0RVBSKTsKLSAgICAgICAgb3B0aW9ucy5zZXRBY3Rpb24oImdldEVudHJpZXMxIik7Ci0KLSAgICAgICAgT2JqZWN0W10gcmVzdWx0ID0gc2VydmljZUNsaWVudC5pbnZva2VCbG9ja2luZyhvcEFkZEVudHJ5LCBvcEFkZEVudHJ5QXJncywgbmV3IENsYXNzW117RW50cnlbXS5jbGFzc30pOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0gICAgICAgIEVudHJ5W10gZW50cmllcyA9IChFbnRyeVtdKSByZXN1bHRbMF07Ci0gICAgICAgIGFzc2VydEVxdWFscyhlbnRyaWVzLmxlbmd0aCwgMik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEVudHJ5MigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBRTmFtZSBvcEFkZEVudHJ5ID0gbmV3IFFOYW1lKCJodHRwOi8vcnBjLmF4aXMyLmFwYWNoZS5vcmciLCAiZ2V0RW50cmllczIiKTsKLQotICAgICAgICBPYmplY3RbXSBvcEFkZEVudHJ5QXJncyA9IG5ldyBPYmplY3RbXSB7IH07Ci0KLSAgICAgICAgLy8gSW52b2tpbmcgdGhlIG1ldGhvZAotICAgICAgICBSUENTZXJ2aWNlQ2xpZW50IHNlcnZpY2VDbGllbnQgPSBnZXRSUENDbGllbnQoKTsKLSAgICAgICAgT3B0aW9ucyBvcHRpb25zID0gc2VydmljZUNsaWVudC5nZXRPcHRpb25zKCk7Ci0gICAgICAgIEVuZHBvaW50UmVmZXJlbmNlIHRhcmdldEVQUiA9IG5ldyBFbmRwb2ludFJlZmVyZW5jZSgKLSAgICAgICAgICAgICAgICAibG9jYWw6Ly9zZXJ2aWNlcy9BZGRyZXNzQm9va1NlcnZpY2UiKTsKLSAgICAgICAgb3B0aW9ucy5zZXRUbyh0YXJnZXRFUFIpOwotICAgICAgICBvcHRpb25zLnNldEFjdGlvbigiZ2V0RW50cmllczIiKTsKLQotICAgICAgICBPYmplY3RbXSByZXN1bHQgPSBzZXJ2aWNlQ2xpZW50Lmludm9rZUJsb2NraW5nKG9wQWRkRW50cnksIG9wQWRkRW50cnlBcmdzLCBuZXcgQ2xhc3NbXXtFbnRyeVtdLmNsYXNzfSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmVzdWx0KTsKLSAgICAgICAgRW50cnlbXSBlbnRyaWVzID0gKEVudHJ5W10pIHJlc3VsdFswXTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGVudHJpZXMubGVuZ3RoLCAwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RW50cnkzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFFOYW1lIG9wQWRkRW50cnkgPSBuZXcgUU5hbWUoImh0dHA6Ly9ycGMuYXhpczIuYXBhY2hlLm9yZyIsICJnZXRFbnRyaWVzMyIpOwotCi0gICAgICAgIE9iamVjdFtdIG9wQWRkRW50cnlBcmdzID0gbmV3IE9iamVjdFtdIHsgfTsKLQotICAgICAgICAvLyBJbnZva2luZyB0aGUgbWV0aG9kCi0gICAgICAgIFJQQ1NlcnZpY2VDbGllbnQgc2VydmljZUNsaWVudCA9IGdldFJQQ0NsaWVudCgpOwotICAgICAgICBPcHRpb25zIG9wdGlvbnMgPSBzZXJ2aWNlQ2xpZW50LmdldE9wdGlvbnMoKTsKLSAgICAgICAgRW5kcG9pbnRSZWZlcmVuY2UgdGFyZ2V0RVBSID0gbmV3IEVuZHBvaW50UmVmZXJlbmNlKAotICAgICAgICAgICAgICAgICJsb2NhbDovL3NlcnZpY2VzL0FkZHJlc3NCb29rU2VydmljZSIpOwotICAgICAgICBvcHRpb25zLnNldFRvKHRhcmdldEVQUik7Ci0gICAgICAgIG9wdGlvbnMuc2V0QWN0aW9uKCJnZXRFbnRyaWVzMyIpOwotCi0gICAgICAgIE9iamVjdFtdIHJlc3VsdCA9IHNlcnZpY2VDbGllbnQuaW52b2tlQmxvY2tpbmcob3BBZGRFbnRyeSwgb3BBZGRFbnRyeUFyZ3MsIG5ldyBDbGFzc1tde0VudHJ5W10uY2xhc3N9KTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotICAgICAgICBFbnRyeVtdIGVudHJpZXMgPSAoRW50cnlbXSkgcmVzdWx0WzBdOwotICAgICAgICBhc3NlcnRFcXVhbHMoZW50cmllcy5sZW5ndGgsIDApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ycGMvQ29tcGFueS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JwYy9Db21wYW55LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhYTU2MjYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JwYy9Db21wYW55LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucnBjOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotcHVibGljIGNsYXNzIENvbXBhbnkgewotCi0gICAgcHJpdmF0ZSBBcnJheUxpc3QgcGVyc29uczsKLSAgICBwcml2YXRlIFN0cmluZyBuYW1lOwotCi0gICAgcHVibGljIEFycmF5TGlzdCBnZXRQZXJzb25zKCkgewotICAgICAgICByZXR1cm4gcGVyc29uczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQZXJzb25zKEFycmF5TGlzdCBwZXJzb25zKSB7Ci0gICAgICAgIHRoaXMucGVyc29ucyA9IHBlcnNvbnM7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JwYy9FbXBsb3llZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JwYy9FbXBsb3llZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWIyZWE4Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ycGMvRW1wbG95ZWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5ycGM7Ci0KLXB1YmxpYyBjbGFzcyBFbXBsb3llZSBleHRlbmRzIFBlcnNvbiB7Ci0KLSAgICBwcm90ZWN0ZWQgUGVyc29uIGVtcGx5ZXI7Ci0gICAgcHJvdGVjdGVkIEFkZHJlc3NCZWFuIGFkZHJlc3M7Ci0KLSAgICBwdWJsaWMgUGVyc29uIGdldEVtcGx5ZXIoKSB7Ci0gICAgICAgIHJldHVybiBlbXBseWVyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEVtcGx5ZXIoUGVyc29uIGVtcGx5ZXIpIHsKLSAgICAgICAgdGhpcy5lbXBseWVyID0gZW1wbHllcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQWRkcmVzc0JlYW4gZ2V0QWRkcmVzcygpIHsKLSAgICAgICAgcmV0dXJuIGFkZHJlc3M7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QWRkcmVzcyhBZGRyZXNzQmVhbiBhZGRyZXNzKSB7Ci0gICAgICAgIHRoaXMuYWRkcmVzcyA9IGFkZHJlc3M7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgU3RyaW5nIHN0ciA9ICJOYW1lOiIgKyBnZXROYW1lKCkgKyAiIEFnZTogIiArIGdldEFnZSgpOwotICAgICAgICByZXR1cm4gc3RyOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ycGMvRW50cnkuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ycGMvRW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzFjMzI2Zi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvcnBjL0VudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucnBjOwotCi1wdWJsaWMgY2xhc3MgRW50cnkgewotCi0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZSA9IG51bGw7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBzdHJlZXQgPSBudWxsOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgY2l0eSA9IG51bGw7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBzdGF0ZSA9IG51bGw7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBwb3N0YWxDb2RlID0gbnVsbDsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2l0eSgpIHsKLSAgICAgICAgcmV0dXJuIGNpdHk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q2l0eShTdHJpbmcgY2l0eSkgewotICAgICAgICB0aGlzLmNpdHkgPSBjaXR5OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UG9zdGFsQ29kZSgpIHsKLSAgICAgICAgcmV0dXJuIHBvc3RhbENvZGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UG9zdGFsQ29kZShTdHJpbmcgcG9zdGFsQ29kZSkgewotICAgICAgICB0aGlzLnBvc3RhbENvZGUgPSBwb3N0YWxDb2RlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RhdGUoKSB7Ci0gICAgICAgIHJldHVybiBzdGF0ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTdGF0ZShTdHJpbmcgc3RhdGUpIHsKLSAgICAgICAgdGhpcy5zdGF0ZSA9IHN0YXRlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RyZWV0KCkgewotICAgICAgICByZXR1cm4gc3RyZWV0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFN0cmVldChTdHJpbmcgc3RyZWV0KSB7Ci0gICAgICAgIHRoaXMuc3RyZWV0ID0gc3RyZWV0OwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JwYy9NYWlsLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvcnBjL01haWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk0YzQ3Ny4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvcnBjL01haWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5ycGM7Ci0KLXB1YmxpYyBjbGFzcyBNYWlsIHsKLQotICAgIHByaXZhdGUgU3RyaW5nIGlkID0gbnVsbDsKLSAgICBwcml2YXRlIFN0cmluZyBmcm9tID0gbnVsbDsKLSAgICBwcml2YXRlIFN0cmluZyB0byA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgc3ViamVjdCA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgYm9keSA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgY29udGVudFR5cGUgPSBudWxsOwotCi0gICAgcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLSAgICAgICAgcmV0dXJuIGlkOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBpZCkgewotICAgICAgICB0aGlzLmlkID0gaWQ7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRCb2R5KCkgewotICAgICAgICByZXR1cm4gYm9keTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRCb2R5KFN0cmluZyBib2R5KSB7Ci0gICAgICAgIHRoaXMuYm9keSA9IGJvZHk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRGcm9tKCkgewotICAgICAgICByZXR1cm4gZnJvbTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRGcm9tKFN0cmluZyBmcm9tKSB7Ci0gICAgICAgIHRoaXMuZnJvbSA9IGZyb207Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRTdWJqZWN0KCkgewotICAgICAgICByZXR1cm4gc3ViamVjdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTdWJqZWN0KFN0cmluZyBzdWJqZWN0KSB7Ci0gICAgICAgIHRoaXMuc3ViamVjdCA9IHN1YmplY3Q7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRUbygpIHsKLSAgICAgICAgcmV0dXJuIHRvOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFRvKFN0cmluZyB0bykgewotICAgICAgICB0aGlzLnRvID0gdG87Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRDb250ZW50VHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIGNvbnRlbnRUeXBlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENvbnRlbnRUeXBlKFN0cmluZyBjb250ZW50VHlwZSkgewotICAgICAgICB0aGlzLmNvbnRlbnRUeXBlID0gY29udGVudFR5cGU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JwYy9NdWx0aXJlZlRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ycGMvTXVsdGlyZWZUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhZjRhZjEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JwYy9NdWx0aXJlZlRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucnBjOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5idWlsZGVyLlN0QVhPTUJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS51dGlsLlN0QVhVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5PcGVyYXRpb25DbGllbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuU2VydmljZUNsaWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5EZWZhdWx0T2JqZWN0U3VwcGxpZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pbnRlZ3JhdGlvbi5SUENMb2NhbFRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucnBjLmNsaWVudC5SUENTZXJ2aWNlQ2xpZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMQ29uc3RhbnRzOwotCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5GYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotcHVibGljIGNsYXNzIE11bHRpcmVmVGVzdCBleHRlbmRzIFJQQ0xvY2FsVGVzdENhc2UgewotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZmluaXNoID0gZmFsc2U7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRVNQQUNFID0gImh0dHA6Ly9ycGMuYXhpczIuYXBhY2hlLm9yZyI7Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlkZXBsb3lDbGFzc0FzU2VydmljZSgiRWNob1hNTFNlcnZpY2UiLCBSUENTZXJ2aWNlQ2xhc3MuY2xhc3MpOwotCX0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsaXRyZWYxKCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIFJQQ1NlcnZpY2VDbGllbnQgc2VuZGVyID0gZ2V0UlBDQ2xpZW50KCJFY2hvWE1MU2VydmljZSIsICJlY2hvU3RyaW5nIik7Ci0gICAgICAgIE9NRmFjdG9yeSBmYWMgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKTsKLQotICAgICAgICBPTU5hbWVzcGFjZSBvbU5zID0gZmFjLmNyZWF0ZU9NTmFtZXNwYWNlKE5BTUVTUEFDRSwgIm15Iik7Ci0gICAgICAgIE9NRWxlbWVudCBtZXRob2QgPSBmYWMuY3JlYXRlT01FbGVtZW50KCJlY2hvU3RyaW5nIiwgb21Ocyk7Ci0gICAgICAgIE9NRWxlbWVudCB2YWx1ZSA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoImFyZzAiLCBudWxsKTsKLSAgICAgICAgdmFsdWUuYWRkQXR0cmlidXRlKGZhYy5jcmVhdGVPTUF0dHJpYnV0ZSgiaHJlZiIsIG51bGwsICIjMSIpKTsKLSAgICAgICAgbWV0aG9kLmFkZENoaWxkKHZhbHVlKTsKLSAgICAgICAgU09BUEZhY3RvcnkgZmFjdG9yeSA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMUZhY3RvcnkoKTsKLSAgICAgICAgU09BUEVudmVsb3BlIGVudmVsb3BlID0gZmFjdG9yeS5nZXREZWZhdWx0RW52ZWxvcGUoKTsKLSAgICAgICAgZW52ZWxvcGUuZ2V0Qm9keSgpLmFkZENoaWxkKG1ldGhvZCk7Ci0KLSAgICAgICAgT01FbGVtZW50IHJlZiA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoInJlZmVyZW5jZSIsIG51bGwpOwotICAgICAgICByZWYuYWRkQXR0cmlidXRlKGZhYy5jcmVhdGVPTUF0dHJpYnV0ZSgiaWQiLCBudWxsLCAiMSIpKTsKLSAgICAgICAgcmVmLnNldFRleHQoImhlbGxvIEF4aXMyIik7Ci0gICAgICAgIGVudmVsb3BlLmdldEJvZHkoKS5hZGRDaGlsZChyZWYpOwotCi0gICAgICAgIE1lc3NhZ2VDb250ZXh0IHJlcU1lc3NhZ2VDb250ZXh0ID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIE9wZXJhdGlvbkNsaWVudCBvcENsaW5ldCA9IHNlbmRlci5jcmVhdGVDbGllbnQoU2VydmljZUNsaWVudC5BTk9OX09VVF9JTl9PUCk7Ci0gICAgICAKLSAgICAgICAgcmVxTWVzc2FnZUNvbnRleHQuc2V0RW52ZWxvcGUoZW52ZWxvcGUpOwotCi0gICAgICAgIG9wQ2xpbmV0LmFkZE1lc3NhZ2VDb250ZXh0KHJlcU1lc3NhZ2VDb250ZXh0KTsKLSAgICAgICAgb3BDbGluZXQuZXhlY3V0ZSh0cnVlKTsKLQotICAgICAgICBNZXNzYWdlQ29udGV4dCByZXNwb25zZU1lc3NhZ2VDb250eCA9Ci0gICAgICAgICAgICAgICAgb3BDbGluZXQuZ2V0TWVzc2FnZUNvbnRleHQoV1NETENvbnN0YW50cy5NRVNTQUdFX0xBQkVMX0lOX1ZBTFVFKTsKLQotICAgICAgICBTT0FQRW52ZWxvcGUgZW52ID0gcmVzcG9uc2VNZXNzYWdlQ29udHguZ2V0RW52ZWxvcGUoKTsKLQotCi0gICAgICAgIGFzc2VydEVxdWFscyhlbnYuZ2V0Qm9keSgpLmdldEZpcnN0RWxlbWVudCgpLmdldEZpcnN0RWxlbWVudCgpLmdldFRleHQoKSwgImhlbGxvIEF4aXMyIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdGFkZCgpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBSUENTZXJ2aWNlQ2xpZW50IHNlbmRlciA9IGdldFJQQ0NsaWVudCgiRWNob1hNTFNlcnZpY2UiLCAiYWRkIik7Ci0gICAgICAgIE9NRmFjdG9yeSBmYWMgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKTsKLQotICAgICAgICBPTU5hbWVzcGFjZSBvbU5zID0gZmFjLmNyZWF0ZU9NTmFtZXNwYWNlKE5BTUVTUEFDRSwgIm15Iik7Ci0gICAgICAgIE9NRWxlbWVudCBtZXRob2QgPSBmYWMuY3JlYXRlT01FbGVtZW50KCJhZGQiLCBvbU5zKTsKLSAgICAgICAgT01FbGVtZW50IHZhbHVlID0gZmFjLmNyZWF0ZU9NRWxlbWVudCgiYXJnMCIsIG51bGwpOwotICAgICAgICB2YWx1ZS5hZGRBdHRyaWJ1dGUoZmFjLmNyZWF0ZU9NQXR0cmlidXRlKCJocmVmIiwgbnVsbCwgIiMxIikpOwotICAgICAgICBtZXRob2QuYWRkQ2hpbGQodmFsdWUpOwotCi0gICAgICAgIE9NRWxlbWVudCB2YWx1ZTIgPSBmYWMuY3JlYXRlT01FbGVtZW50KCJhcmcxIiwgbnVsbCk7Ci0gICAgICAgIHZhbHVlMi5hZGRBdHRyaWJ1dGUoZmFjLmNyZWF0ZU9NQXR0cmlidXRlKCJocmVmIiwgbnVsbCwgIiMyIikpOwotICAgICAgICBtZXRob2QuYWRkQ2hpbGQodmFsdWUyKTsKLQotICAgICAgICBTT0FQRmFjdG9yeSBmYWN0b3J5ID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDExRmFjdG9yeSgpOwotICAgICAgICBTT0FQRW52ZWxvcGUgZW52ZWxvcGUgPSBmYWN0b3J5LmdldERlZmF1bHRFbnZlbG9wZSgpOwotICAgICAgICBlbnZlbG9wZS5nZXRCb2R5KCkuYWRkQ2hpbGQobWV0aG9kKTsKLQotICAgICAgICBPTUVsZW1lbnQgcmVmID0gZmFjLmNyZWF0ZU9NRWxlbWVudCgicmVmZXJlbmNlIiwgbnVsbCk7Ci0gICAgICAgIHJlZi5hZGRBdHRyaWJ1dGUoZmFjLmNyZWF0ZU9NQXR0cmlidXRlKCJpZCIsIG51bGwsICIxIikpOwotICAgICAgICByZWYuc2V0VGV4dCgiMTAiKTsKLSAgICAgICAgZW52ZWxvcGUuZ2V0Qm9keSgpLmFkZENoaWxkKHJlZik7Ci0KLSAgICAgICAgT01FbGVtZW50IHJlZjIgPSBmYWMuY3JlYXRlT01FbGVtZW50KCJyZWZlcmVuY2UiLCBudWxsKTsKLSAgICAgICAgcmVmMi5hZGRBdHRyaWJ1dGUoZmFjLmNyZWF0ZU9NQXR0cmlidXRlKCJpZCIsIG51bGwsICIyIikpOwotICAgICAgICByZWYyLnNldFRleHQoIjEwIik7Ci0gICAgICAgIGVudmVsb3BlLmdldEJvZHkoKS5hZGRDaGlsZChyZWYyKTsKLQotICAgICAgICBNZXNzYWdlQ29udGV4dCByZXFNZXNzYWdlQ29udGV4dCA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBPcGVyYXRpb25DbGllbnQgb3BDbGluZXQgPSBzZW5kZXIuY3JlYXRlQ2xpZW50KFNlcnZpY2VDbGllbnQuQU5PTl9PVVRfSU5fT1ApOwotICAgICAgICAKLSAgICAgICAgcmVxTWVzc2FnZUNvbnRleHQuc2V0RW52ZWxvcGUoZW52ZWxvcGUpOwotCi0gICAgICAgIG9wQ2xpbmV0LmFkZE1lc3NhZ2VDb250ZXh0KHJlcU1lc3NhZ2VDb250ZXh0KTsKLSAgICAgICAgb3BDbGluZXQuZXhlY3V0ZSh0cnVlKTsKLQotICAgICAgICBNZXNzYWdlQ29udGV4dCByZXNwb25zZU1lc3NhZ2VDb250eCA9Ci0gICAgICAgICAgICAgICAgb3BDbGluZXQuZ2V0TWVzc2FnZUNvbnRleHQoV1NETENvbnN0YW50cy5NRVNTQUdFX0xBQkVMX0lOX1ZBTFVFKTsKLQotICAgICAgICBTT0FQRW52ZWxvcGUgZW52ID0gcmVzcG9uc2VNZXNzYWdlQ29udHguZ2V0RW52ZWxvcGUoKTsKLQotCi0gICAgICAgIGFzc2VydEVxdWFscyhlbnYuZ2V0Qm9keSgpLmdldEZpcnN0RWxlbWVudCgpLmdldEZpcnN0RWxlbWVudCgpLmdldFRleHQoKSwgIjIwIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdGFkZFNhbWVSZWYoKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgUlBDU2VydmljZUNsaWVudCBzZW5kZXIgPSBnZXRSUENDbGllbnQoIkVjaG9YTUxTZXJ2aWNlIiwgImFkZCIpOwotICAgICAgICBPTUZhY3RvcnkgZmFjID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCk7Ci0KLSAgICAgICAgT01OYW1lc3BhY2Ugb21OcyA9IGZhYy5jcmVhdGVPTU5hbWVzcGFjZShOQU1FU1BBQ0UsICJteSIpOwotICAgICAgICBPTUVsZW1lbnQgbWV0aG9kID0gZmFjLmNyZWF0ZU9NRWxlbWVudCgiYWRkIiwgb21Ocyk7Ci0gICAgICAgIE9NRWxlbWVudCB2YWx1ZSA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoImFyZzAiLCBudWxsKTsKLSAgICAgICAgdmFsdWUuYWRkQXR0cmlidXRlKGZhYy5jcmVhdGVPTUF0dHJpYnV0ZSgiaHJlZiIsIG51bGwsICIjMSIpKTsKLSAgICAgICAgbWV0aG9kLmFkZENoaWxkKHZhbHVlKTsKLQotICAgICAgICBPTUVsZW1lbnQgdmFsdWUyID0gZmFjLmNyZWF0ZU9NRWxlbWVudCgiYXJnMSIsIG51bGwpOwotICAgICAgICB2YWx1ZTIuYWRkQXR0cmlidXRlKGZhYy5jcmVhdGVPTUF0dHJpYnV0ZSgiaHJlZiIsIG51bGwsICIjMSIpKTsKLSAgICAgICAgbWV0aG9kLmFkZENoaWxkKHZhbHVlMik7Ci0KLSAgICAgICAgU09BUEZhY3RvcnkgZmFjdG9yeSA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMUZhY3RvcnkoKTsKLSAgICAgICAgU09BUEVudmVsb3BlIGVudmVsb3BlID0gZmFjdG9yeS5nZXREZWZhdWx0RW52ZWxvcGUoKTsKLSAgICAgICAgZW52ZWxvcGUuZ2V0Qm9keSgpLmFkZENoaWxkKG1ldGhvZCk7Ci0KLSAgICAgICAgT01FbGVtZW50IHJlZiA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoInJlZmVyZW5jZSIsIG51bGwpOwotICAgICAgICByZWYuYWRkQXR0cmlidXRlKGZhYy5jcmVhdGVPTUF0dHJpYnV0ZSgiaWQiLCBudWxsLCAiMSIpKTsKLSAgICAgICAgcmVmLnNldFRleHQoIjEwIik7Ci0gICAgICAgIGVudmVsb3BlLmdldEJvZHkoKS5hZGRDaGlsZChyZWYpOwotCi0gICAgICAgIE1lc3NhZ2VDb250ZXh0IHJlcU1lc3NhZ2VDb250ZXh0ID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIE9wZXJhdGlvbkNsaWVudCBvcENsaW5ldCA9IHNlbmRlci5jcmVhdGVDbGllbnQoU2VydmljZUNsaWVudC5BTk9OX09VVF9JTl9PUCk7Ci0gICAgICAgIAotICAgICAgICByZXFNZXNzYWdlQ29udGV4dC5zZXRFbnZlbG9wZShlbnZlbG9wZSk7Ci0KLSAgICAgICAgb3BDbGluZXQuYWRkTWVzc2FnZUNvbnRleHQocmVxTWVzc2FnZUNvbnRleHQpOwotICAgICAgICBvcENsaW5ldC5leGVjdXRlKHRydWUpOwotCi0gICAgICAgIE1lc3NhZ2VDb250ZXh0IHJlc3BvbnNlTWVzc2FnZUNvbnR4ID0KLSAgICAgICAgICAgICAgICBvcENsaW5ldC5nZXRNZXNzYWdlQ29udGV4dChXU0RMQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfSU5fVkFMVUUpOwotICAgICAgICBTT0FQRW52ZWxvcGUgZW52ID0gcmVzcG9uc2VNZXNzYWdlQ29udHguZ2V0RW52ZWxvcGUoKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoZW52LmdldEJvZHkoKS5nZXRGaXJzdEVsZW1lbnQoKS5nZXRGaXJzdEVsZW1lbnQoKS5nZXRUZXh0KCksICIyMCIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RhZGRFcnJvcigpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFJQQ1NlcnZpY2VDbGllbnQgc2VuZGVyID0gZ2V0UlBDQ2xpZW50KCJFY2hvWE1MU2VydmljZSIsICJhZGQiKTsKLSAgICAgICAgICAgIE9NRmFjdG9yeSBmYWMgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKTsKLQotICAgICAgICAgICAgT01OYW1lc3BhY2Ugb21OcyA9IGZhYy5jcmVhdGVPTU5hbWVzcGFjZShOQU1FU1BBQ0UsICJteSIpOwotICAgICAgICAgICAgT01FbGVtZW50IG1ldGhvZCA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoImFkZCIsIG9tTnMpOwotICAgICAgICAgICAgT01FbGVtZW50IHZhbHVlID0gZmFjLmNyZWF0ZU9NRWxlbWVudCgiYXJnMCIsIG51bGwpOwotICAgICAgICAgICAgdmFsdWUuYWRkQXR0cmlidXRlKGZhYy5jcmVhdGVPTUF0dHJpYnV0ZSgiaHJlZiIsIG51bGwsICIjMSIpKTsKLSAgICAgICAgICAgIG1ldGhvZC5hZGRDaGlsZCh2YWx1ZSk7Ci0KLSAgICAgICAgICAgIE9NRWxlbWVudCB2YWx1ZTIgPSBmYWMuY3JlYXRlT01FbGVtZW50KCJhcmcxIiwgbnVsbCk7Ci0gICAgICAgICAgICB2YWx1ZTIuYWRkQXR0cmlidXRlKGZhYy5jcmVhdGVPTUF0dHJpYnV0ZSgiaHJlZiIsIG51bGwsICIjMiIpKTsKLSAgICAgICAgICAgIG1ldGhvZC5hZGRDaGlsZCh2YWx1ZTIpOwotCi0gICAgICAgICAgICBTT0FQRmFjdG9yeSBmYWN0b3J5ID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDExRmFjdG9yeSgpOwotICAgICAgICAgICAgU09BUEVudmVsb3BlIGVudmVsb3BlID0gZmFjdG9yeS5nZXREZWZhdWx0RW52ZWxvcGUoKTsKLSAgICAgICAgICAgIGVudmVsb3BlLmdldEJvZHkoKS5hZGRDaGlsZChtZXRob2QpOwotCi0gICAgICAgICAgICBPTUVsZW1lbnQgcmVmID0gZmFjLmNyZWF0ZU9NRWxlbWVudCgicmVmZXJlbmNlIiwgbnVsbCk7Ci0gICAgICAgICAgICByZWYuYWRkQXR0cmlidXRlKGZhYy5jcmVhdGVPTUF0dHJpYnV0ZSgiaWQiLCBudWxsLCAiMSIpKTsKLSAgICAgICAgICAgIHJlZi5zZXRUZXh0KCIxMCIpOwotICAgICAgICAgICAgZW52ZWxvcGUuZ2V0Qm9keSgpLmFkZENoaWxkKHJlZik7Ci0KLSAgICAgICAgICAgIE9NRWxlbWVudCByZWYyID0gZmFjLmNyZWF0ZU9NRWxlbWVudCgicmVmZXJlbmNlIiwgbnVsbCk7Ci0gICAgICAgICAgICByZWYyLmFkZEF0dHJpYnV0ZShmYWMuY3JlYXRlT01BdHRyaWJ1dGUoImlkIiwgbnVsbCwgIjMiKSk7Ci0gICAgICAgICAgICByZWYyLnNldFRleHQoIjEwIik7Ci0gICAgICAgICAgICBlbnZlbG9wZS5nZXRCb2R5KCkuYWRkQ2hpbGQocmVmMik7Ci0KLSAgICAgICAgICAgIE1lc3NhZ2VDb250ZXh0IHJlcU1lc3NhZ2VDb250ZXh0ID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7OwotICAgICAgICAgICAgT3BlcmF0aW9uQ2xpZW50IG9wQ2xpbmV0ID0gc2VuZGVyLmNyZWF0ZUNsaWVudChTZXJ2aWNlQ2xpZW50LkFOT05fT1VUX0lOX09QKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmVxTWVzc2FnZUNvbnRleHQuc2V0RW52ZWxvcGUoZW52ZWxvcGUpOwotCi0gICAgICAgICAgICBvcENsaW5ldC5hZGRNZXNzYWdlQ29udGV4dChyZXFNZXNzYWdlQ29udGV4dCk7Ci0gICAgICAgICAgICBvcENsaW5ldC5leGVjdXRlKHRydWUpOwotCi0gICAgICAgICAgICBmYWlsKCJUaGlzIHNob3VsZCBmYWlsIHdpdGggOiAiICsgIm9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OiBJbnZhbGlkIHJlZmVyZW5jZSA6MiIpOwotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgYXhpc0ZhdWx0KSB7Ci0gICAgICAgICAgICBTdHJpbmcgdmFsID0gYXhpc0ZhdWx0LmdldEZhdWx0RGV0YWlsRWxlbWVudCgpLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInZhbCA9ICIgKyB2YWwpOwotICAgICAgICAgICAgaW50IGluZGV4ID0gdmFsLmluZGV4T2YoIm9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OiBJbnZhbGlkIHJlZmVyZW5jZSA6MiIpOwotICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICAgICAgICAgIGZhaWwoIlRoaXMgc2hvdWxkIGZhaWwgd2l0aCA6ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OiBJbnZhbGlkIHJlZmVyZW5jZSA6MiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsaXRyZWZCZWFuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFJQQ1NlcnZpY2VDbGllbnQgc2VuZGVyID0gZ2V0UlBDQ2xpZW50KCJFY2hvWE1MU2VydmljZSIsICJlZGl0QmVhbiIpOwotICAgICAgICBPTUZhY3RvcnkgZmFjID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCk7Ci0KLSAgICAgICAgT01OYW1lc3BhY2Ugb21OcyA9IGZhYy5jcmVhdGVPTU5hbWVzcGFjZShOQU1FU1BBQ0UsICJteSIpOwotICAgICAgICBPTUVsZW1lbnQgbWV0aG9kID0gZmFjLmNyZWF0ZU9NRWxlbWVudCgiZWRpdEJlYW4iLCBvbU5zKTsKLSAgICAgICAgT01FbGVtZW50IHZhbHVlID0gZmFjLmNyZWF0ZU9NRWxlbWVudCgiYXJnMCIsIG51bGwpOwotICAgICAgICB2YWx1ZS5hZGRBdHRyaWJ1dGUoZmFjLmNyZWF0ZU9NQXR0cmlidXRlKCJocmVmIiwgbnVsbCwgIiMxIikpOwotICAgICAgICBtZXRob2QuYWRkQ2hpbGQodmFsdWUpOwotICAgICAgICBPTUVsZW1lbnQgdmFsdWUyID0gZmFjLmNyZWF0ZU9NRWxlbWVudCgiYXJnMSIsIG51bGwpOwotICAgICAgICB2YWx1ZTIuc2V0VGV4dCgiMTU5Iik7Ci0gICAgICAgIG1ldGhvZC5hZGRDaGlsZCh2YWx1ZTIpOwotCi0KLSAgICAgICAgU09BUEZhY3RvcnkgZmFjdG9yeSA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMUZhY3RvcnkoKTsKLSAgICAgICAgU09BUEVudmVsb3BlIGVudmVsb3BlID0gZmFjdG9yeS5nZXREZWZhdWx0RW52ZWxvcGUoKTsKLSAgICAgICAgZW52ZWxvcGUuZ2V0Qm9keSgpLmFkZENoaWxkKG1ldGhvZCk7Ci0KLQotICAgICAgICBTdHJpbmcgcmVmMSA9Ci0gICAgICAgICAgICAgICAgIjxyZWZlcmVuY2UgaWQ9XCIxXCI+PG5hbWU+RGVlcGFsPC9uYW1lPjx2YWx1ZSBocmVmPVwiIzJcIi8+PGFkZHJlc3MgaHJlZj1cIiMzXCIvPjwvcmVmZXJlbmNlPiI7Ci0gICAgICAgIE9NRWxlbWVudCBvbTEgPSBnZXRPTUVsZW1lbnQocmVmMSwgZmFjKTsKLSAgICAgICAgZW52ZWxvcGUuZ2V0Qm9keSgpLmFkZENoaWxkKG9tMSk7Ci0gICAgICAgIFN0cmluZyByZWYyID0gIjxyZWZlcmVuY2UgaWQ9XCIyXCI+ZmFsc2U8L3JlZmVyZW5jZT4iOwotICAgICAgICBPTUVsZW1lbnQgb20yID0gZ2V0T01FbGVtZW50KHJlZjIsIGZhYyk7Ci0gICAgICAgIGVudmVsb3BlLmdldEJvZHkoKS5hZGRDaGlsZChvbTIpOwotICAgICAgICBTdHJpbmcgcmVmMyA9ICI8cmVmZXJlbmNlIGlkPVwiM1wiPjx0b3duIGhyZWY9XCIjNFwiLz48bnVtYmVyPjEwMTA8L251bWJlcj48L3JlZmVyZW5jZT4iOwotICAgICAgICBPTUVsZW1lbnQgb20zID0gZ2V0T01FbGVtZW50KHJlZjMsIGZhYyk7Ci0gICAgICAgIGVudmVsb3BlLmdldEJvZHkoKS5hZGRDaGlsZChvbTMpOwotICAgICAgICBTdHJpbmcgcmVmNCA9ICI8cmVmZXJlbmNlIGlkPVwiNFwiPkNvbG9tYm8zPC9yZWZlcmVuY2U+IjsKLSAgICAgICAgT01FbGVtZW50IG9tNCA9IGdldE9NRWxlbWVudChyZWY0LCBmYWMpOwotICAgICAgICBlbnZlbG9wZS5nZXRCb2R5KCkuYWRkQ2hpbGQob200KTsKLQotICAgICAgICBNZXNzYWdlQ29udGV4dCByZXFNZXNzYWdlQ29udGV4dCA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBPcGVyYXRpb25DbGllbnQgb3BDbGluZXQgPSBzZW5kZXIuY3JlYXRlQ2xpZW50KFNlcnZpY2VDbGllbnQuQU5PTl9PVVRfSU5fT1ApOwotICAgICAgICAKLSAgICAgICAgcmVxTWVzc2FnZUNvbnRleHQuc2V0RW52ZWxvcGUoZW52ZWxvcGUpOwotCi0gICAgICAgIG9wQ2xpbmV0LmFkZE1lc3NhZ2VDb250ZXh0KHJlcU1lc3NhZ2VDb250ZXh0KTsKLSAgICAgICAgb3BDbGluZXQuZXhlY3V0ZSh0cnVlKTsKLQotICAgICAgICBNZXNzYWdlQ29udGV4dCByZXNwb25zZU1lc3NhZ2VDb250eCA9Ci0gICAgICAgICAgICAgICAgb3BDbGluZXQuZ2V0TWVzc2FnZUNvbnRleHQoV1NETENvbnN0YW50cy5NRVNTQUdFX0xBQkVMX0lOX1ZBTFVFKTsKLQotICAgICAgICBTT0FQRW52ZWxvcGUgZW52ID0gcmVzcG9uc2VNZXNzYWdlQ29udHguZ2V0RW52ZWxvcGUoKTsKLQotICAgICAgICBPTUVsZW1lbnQgcmVzcG9uc2UgPSBlbnYuZ2V0Qm9keSgpLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgICBNeUJlYW4gcmVzQmVhbiA9IChNeUJlYW4pQmVhblV0aWwuZGVzZXJpYWxpemUoTXlCZWFuLmNsYXNzLCByZXNwb25zZS5nZXRGaXJzdEVsZW1lbnQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBEZWZhdWx0T2JqZWN0U3VwcGxpZXIoKSwgbnVsbCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmVzQmVhbik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXNCZWFuLmdldEFnZSgpLCAxNTkpOwotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgdGVzdGJlYW5PTSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBSUENTZXJ2aWNlQ2xpZW50IHNlbmRlciA9IGdldFJQQ0NsaWVudCgiRWNob1hNTFNlcnZpY2UiLCAiYmVhbk9NIik7Ci0gICAgICAgIE9NRmFjdG9yeSBmYWMgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKTsKLQotICAgICAgICBPTU5hbWVzcGFjZSBvbU5zID0gZmFjLmNyZWF0ZU9NTmFtZXNwYWNlKE5BTUVTUEFDRSwgIm15Iik7Ci0gICAgICAgIE9NRWxlbWVudCBtZXRob2QgPSBmYWMuY3JlYXRlT01FbGVtZW50KCJiZWFuT00iLCBvbU5zKTsKLSAgICAgICAgT01FbGVtZW50IHZhbHVlID0gZmFjLmNyZWF0ZU9NRWxlbWVudCgiYXJnMCIsIG51bGwpOwotICAgICAgICB2YWx1ZS5hZGRBdHRyaWJ1dGUoZmFjLmNyZWF0ZU9NQXR0cmlidXRlKCJocmVmIiwgbnVsbCwgIiMxIikpOwotICAgICAgICBtZXRob2QuYWRkQ2hpbGQodmFsdWUpOwotICAgICAgICBPTUVsZW1lbnQgdmFsdWUyID0gZmFjLmNyZWF0ZU9NRWxlbWVudCgiYXJnMSIsIG51bGwpOwotICAgICAgICB2YWx1ZTIuc2V0VGV4dCgiMTU5Iik7Ci0gICAgICAgIG1ldGhvZC5hZGRDaGlsZCh2YWx1ZTIpOwotCi0KLSAgICAgICAgU09BUEZhY3RvcnkgZmFjdG9yeSA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMUZhY3RvcnkoKTsKLSAgICAgICAgU09BUEVudmVsb3BlIGVudmVsb3BlID0gZmFjdG9yeS5nZXREZWZhdWx0RW52ZWxvcGUoKTsKLSAgICAgICAgZW52ZWxvcGUuZ2V0Qm9keSgpLmFkZENoaWxkKG1ldGhvZCk7Ci0KLQotICAgICAgICBTdHJpbmcgcmVmMSA9Ci0gICAgICAgICAgICAgICAgIjxyZWZlcmVuY2UgaWQ9XCIxXCI+PG5hbWU+RGVlcGFsPC9uYW1lPjx2YWx1ZSBocmVmPVwiIzJcIi8+PGFkZHJlc3MgaHJlZj1cIiMzXCIvPjwvcmVmZXJlbmNlPiI7Ci0gICAgICAgIE9NRWxlbWVudCBvbTEgPSBnZXRPTUVsZW1lbnQocmVmMSwgZmFjKTsKLSAgICAgICAgZW52ZWxvcGUuZ2V0Qm9keSgpLmFkZENoaWxkKG9tMSk7Ci0gICAgICAgIFN0cmluZyByZWYyID0gIjxyZWZlcmVuY2UgaWQ9XCIyXCI+ZmFsc2U8L3JlZmVyZW5jZT4iOwotICAgICAgICBPTUVsZW1lbnQgb20yID0gZ2V0T01FbGVtZW50KHJlZjIsIGZhYyk7Ci0gICAgICAgIGVudmVsb3BlLmdldEJvZHkoKS5hZGRDaGlsZChvbTIpOwotICAgICAgICBTdHJpbmcgcmVmMyA9ICI8cmVmZXJlbmNlIGlkPVwiM1wiPjx0b3duIGhyZWY9XCIjNFwiLz48bnVtYmVyPjEwMTA8L251bWJlcj48L3JlZmVyZW5jZT4iOwotICAgICAgICBPTUVsZW1lbnQgb20zID0gZ2V0T01FbGVtZW50KHJlZjMsIGZhYyk7Ci0gICAgICAgIGVudmVsb3BlLmdldEJvZHkoKS5hZGRDaGlsZChvbTMpOwotICAgICAgICBTdHJpbmcgcmVmNCA9ICI8cmVmZXJlbmNlIGlkPVwiNFwiPkNvbG9tYm8zPC9yZWZlcmVuY2U+IjsKLSAgICAgICAgT01FbGVtZW50IG9tNCA9IGdldE9NRWxlbWVudChyZWY0LCBmYWMpOwotICAgICAgICBlbnZlbG9wZS5nZXRCb2R5KCkuYWRkQ2hpbGQob200KTsKLQotICAgICAgICBNZXNzYWdlQ29udGV4dCByZXFNZXNzYWdlQ29udGV4dCA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOzsKLSAgICAgICAgT3BlcmF0aW9uQ2xpZW50IG9wQ2xpbmV0ID0gc2VuZGVyLmNyZWF0ZUNsaWVudChTZXJ2aWNlQ2xpZW50LkFOT05fT1VUX0lOX09QKTsKLSAgICAgICAgCi0gICAgICAgIHJlcU1lc3NhZ2VDb250ZXh0LnNldEVudmVsb3BlKGVudmVsb3BlKTsKLQotICAgICAgICBvcENsaW5ldC5hZGRNZXNzYWdlQ29udGV4dChyZXFNZXNzYWdlQ29udGV4dCk7Ci0gICAgICAgIG9wQ2xpbmV0LmV4ZWN1dGUodHJ1ZSk7Ci0KLSAgICAgICAgTWVzc2FnZUNvbnRleHQgcmVzcG9uc2VNZXNzYWdlQ29udHggPQotICAgICAgICAgICAgICAgIG9wQ2xpbmV0LmdldE1lc3NhZ2VDb250ZXh0KFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9JTl9WQUxVRSk7Ci0KLSAgICAgICAgU09BUEVudmVsb3BlIGVudiA9IHJlc3BvbnNlTWVzc2FnZUNvbnR4LmdldEVudmVsb3BlKCk7Ci0KLSAgICAgICAgT01FbGVtZW50IHJlc3BvbnNlID0gZW52LmdldEJvZHkoKS5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgICAgTXlCZWFuIHJlc0JlYW4gPSAoTXlCZWFuKUJlYW5VdGlsLmRlc2VyaWFsaXplKE15QmVhbi5jbGFzcywgcmVzcG9uc2UuZ2V0Rmlyc3RFbGVtZW50KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRGVmYXVsdE9iamVjdFN1cHBsaWVyKCksIG51bGwpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJlc0JlYW4pOwotICAgICAgICBhc3NlcnRFcXVhbHMocmVzQmVhbi5nZXRBZ2UoKSwgMTU5KTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RvbXJlZnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgUlBDU2VydmljZUNsaWVudCBzZW5kZXIgPSBnZXRSUENDbGllbnQoIkVjaG9YTUxTZXJ2aWNlIiwgIm9tcmVmcyIpOwotICAgICAgICBPTUZhY3RvcnkgZmFjID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCk7Ci0KLSAgICAgICAgT01OYW1lc3BhY2Ugb21OcyA9IGZhYy5jcmVhdGVPTU5hbWVzcGFjZShOQU1FU1BBQ0UsICJteSIpOwotICAgICAgICBPTUVsZW1lbnQgbWV0aG9kID0gZmFjLmNyZWF0ZU9NRWxlbWVudCgib21yZWZzIiwgb21Ocyk7Ci0KLSAgICAgICAgT01FbGVtZW50IHZhbHVlID0gZmFjLmNyZWF0ZU9NRWxlbWVudCgiYXJnMCIsIG51bGwpOwotICAgICAgICB2YWx1ZS5hZGRBdHRyaWJ1dGUoZmFjLmNyZWF0ZU9NQXR0cmlidXRlKCJocmVmIiwgbnVsbCwgIiMxIikpOwotICAgICAgICBtZXRob2QuYWRkQ2hpbGQodmFsdWUpOwotCi0gICAgICAgIE9NRWxlbWVudCB2YWx1ZTIgPSBmYWMuY3JlYXRlT01FbGVtZW50KCJhcmcxIiwgbnVsbCk7Ci0gICAgICAgIHZhbHVlMi5hZGRBdHRyaWJ1dGUoZmFjLmNyZWF0ZU9NQXR0cmlidXRlKCJocmVmIiwgbnVsbCwgIiMxIikpOwotICAgICAgICBtZXRob2QuYWRkQ2hpbGQodmFsdWUyKTsKLQotCi0gICAgICAgIFNPQVBGYWN0b3J5IGZhY3RvcnkgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTFGYWN0b3J5KCk7Ci0gICAgICAgIFNPQVBFbnZlbG9wZSBlbnZlbG9wZSA9IGZhY3RvcnkuZ2V0RGVmYXVsdEVudmVsb3BlKCk7Ci0gICAgICAgIGVudmVsb3BlLmdldEJvZHkoKS5hZGRDaGlsZChtZXRob2QpOwotCi0KLSAgICAgICAgU3RyaW5nIHJlZjEgPQotICAgICAgICAgICAgICAgICI8cmVmZXJlbmNlIGlkPVwiMVwiPjxuYW1lPkRlZXBhbDwvbmFtZT48dmFsdWUgaHJlZj1cIiMyXCIvPjxhZGRyZXNzIGhyZWY9XCIjM1wiLz48L3JlZmVyZW5jZT4iOwotICAgICAgICBPTUVsZW1lbnQgb20xID0gZ2V0T01FbGVtZW50KHJlZjEsIGZhYyk7Ci0gICAgICAgIGVudmVsb3BlLmdldEJvZHkoKS5hZGRDaGlsZChvbTEpOwotICAgICAgICBTdHJpbmcgcmVmMiA9ICI8cmVmZXJlbmNlIGlkPVwiMlwiPmZhbHNlPC9yZWZlcmVuY2U+IjsKLSAgICAgICAgT01FbGVtZW50IG9tMiA9IGdldE9NRWxlbWVudChyZWYyLCBmYWMpOwotICAgICAgICBlbnZlbG9wZS5nZXRCb2R5KCkuYWRkQ2hpbGQob20yKTsKLSAgICAgICAgU3RyaW5nIHJlZjMgPSAiPHJlZmVyZW5jZSBpZD1cIjNcIj48dG93biBocmVmPVwiIzRcIi8+PG51bWJlcj4xMDEwPC9udW1iZXI+PC9yZWZlcmVuY2U+IjsKLSAgICAgICAgT01FbGVtZW50IG9tMyA9IGdldE9NRWxlbWVudChyZWYzLCBmYWMpOwotICAgICAgICBlbnZlbG9wZS5nZXRCb2R5KCkuYWRkQ2hpbGQob20zKTsKLSAgICAgICAgU3RyaW5nIHJlZjQgPSAiPHJlZmVyZW5jZSBpZD1cIjRcIj5Db2xvbWJvMzwvcmVmZXJlbmNlPiI7Ci0gICAgICAgIE9NRWxlbWVudCBvbTQgPSBnZXRPTUVsZW1lbnQocmVmNCwgZmFjKTsKLSAgICAgICAgZW52ZWxvcGUuZ2V0Qm9keSgpLmFkZENoaWxkKG9tNCk7Ci0gICAgICAgIAotICAgICAgICBNZXNzYWdlQ29udGV4dCByZXFNZXNzYWdlQ29udGV4dCA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOzsKLSAgICAgICAgT3BlcmF0aW9uQ2xpZW50IG9wQ2xpbmV0ID0gc2VuZGVyLmNyZWF0ZUNsaWVudChTZXJ2aWNlQ2xpZW50LkFOT05fT1VUX0lOX09QKTsKLSAgICAgICAgCi0gICAgICAgIHJlcU1lc3NhZ2VDb250ZXh0LnNldEVudmVsb3BlKGVudmVsb3BlKTsKLQotICAgICAgICBvcENsaW5ldC5hZGRNZXNzYWdlQ29udGV4dChyZXFNZXNzYWdlQ29udGV4dCk7Ci0gICAgICAgIG9wQ2xpbmV0LmV4ZWN1dGUodHJ1ZSk7Ci0KLSAgICAgICAgTWVzc2FnZUNvbnRleHQgcmVzcG9uc2VNZXNzYWdlQ29udHggPQotICAgICAgICAgICAgICAgIG9wQ2xpbmV0LmdldE1lc3NhZ2VDb250ZXh0KFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9JTl9WQUxVRSk7Ci0KLSAgICAgICAgU09BUEVudmVsb3BlIGVudiA9IHJlc3BvbnNlTWVzc2FnZUNvbnR4LmdldEVudmVsb3BlKCk7Ci0KLSAgICAgICAgT01FbGVtZW50IHJlc3BvbnNlID0gZW52LmdldEJvZHkoKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQotICAgICAgICBBcnJheUxpc3QgYXJncyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgYXJncy5hZGQoYm9vbGVhbi5jbGFzcyk7Ci0KLSAgICAgICAgT2JqZWN0IFtdIHJlc0JlYW4gPQotICAgICAgICAgICAgICAgIEJlYW5VdGlsLmRlc2VyaWFsaXplKHJlc3BvbnNlLCBhcmdzLnRvQXJyYXkoKSwgbmV3IERlZmF1bHRPYmplY3RTdXBwbGllcigpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXNCZWFuKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCgoQm9vbGVhbilyZXNCZWFuWzBdKS5ib29sZWFuVmFsdWUoKSwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBPTUVsZW1lbnQgZ2V0T01FbGVtZW50KFN0cmluZyBzdHIsIE9NRmFjdG9yeSBmYWMpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdEFYT01CdWlsZGVyIHN0YXhPTUJ1aWxkZXI7Ci0gICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldwotICAgICAgICAgICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtKHN0ci5nZXRCeXRlcygpKSk7Ci0gICAgICAgIHN0YXhPTUJ1aWxkZXIgPSBuZXcgU3RBWE9NQnVpbGRlcihmYWMsIHhtbFJlYWRlcik7Ci0gICAgICAgIHJldHVybiBzdGF4T01CdWlsZGVyLmdldERvY3VtZW50RWxlbWVudCgpOwotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgdGVzdGVjaG9FbXBsb3llZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBSUENTZXJ2aWNlQ2xpZW50IHNlbmRlciA9IGdldFJQQ0NsaWVudCgiRWNob1hNTFNlcnZpY2UiLCAiZWNob0VtcGxveWVlIik7Ci0gICAgICAgIE9NRmFjdG9yeSBmYWMgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKTsKLQotICAgICAgICBPTU5hbWVzcGFjZSBvbU5zID0gZmFjLmNyZWF0ZU9NTmFtZXNwYWNlKE5BTUVTUEFDRSwgIm15Iik7Ci0gICAgICAgIE9NRWxlbWVudCBtZXRob2QgPSBmYWMuY3JlYXRlT01FbGVtZW50KCJlY2hvRW1wbG95ZWUiLCBvbU5zKTsKLQotICAgICAgICBPTUVsZW1lbnQgdmFsdWUgPSBmYWMuY3JlYXRlT01FbGVtZW50KCJhcmcwIiwgbnVsbCk7Ci0gICAgICAgIHZhbHVlLmFkZEF0dHJpYnV0ZShmYWMuY3JlYXRlT01BdHRyaWJ1dGUoImhyZWYiLCBudWxsLCAiIzEiKSk7Ci0gICAgICAgIG1ldGhvZC5hZGRDaGlsZCh2YWx1ZSk7Ci0KLQotICAgICAgICBTT0FQRmFjdG9yeSBmYWN0b3J5ID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDExRmFjdG9yeSgpOwotICAgICAgICBTT0FQRW52ZWxvcGUgZW52ZWxvcGUgPSBmYWN0b3J5LmdldERlZmF1bHRFbnZlbG9wZSgpOwotICAgICAgICBlbnZlbG9wZS5nZXRCb2R5KCkuYWRkQ2hpbGQobWV0aG9kKTsKLQotCi0gICAgICAgIFN0cmluZyBzdHIgPSAiPHJlZmVyZW5jZSBpZD1cIjFcIj5cbiIgKwotICAgICAgICAgICAgICAgICIgPG5hbWU+Sm9objwvbmFtZT5cbiIgKwotICAgICAgICAgICAgICAgICIgPGFnZT41MDwvYWdlPlxuIiArCi0gICAgICAgICAgICAgICAgIiA8ZW1wbHllciBocmVmPVwiIzFcIi8+XG4iICsKLSAgICAgICAgICAgICAgICAiIDxhZGRyZXNzIGhyZWY9XCIjMlwiLz5cbiIgKwotICAgICAgICAgICAgICAgICI8L3JlZmVyZW5jZT4iOwotICAgICAgICBlbnZlbG9wZS5nZXRCb2R5KCkuYWRkQ2hpbGQoZ2V0T01FbGVtZW50KHN0ciwgZmFjKSk7Ci0gICAgICAgIHN0ciA9ICI8cmVmZXJlbmNlIGlkPVwiMlwiPlxuIiArCi0gICAgICAgICAgICAgICAgIjx0b3duPkNvbG9tYm8zPC90b3duPjxudW1iZXI+MTAxMDwvbnVtYmVyPlxuIiArCi0gICAgICAgICAgICAgICAgIjwvcmVmZXJlbmNlPiI7Ci0gICAgICAgIGVudmVsb3BlLmdldEJvZHkoKS5hZGRDaGlsZChnZXRPTUVsZW1lbnQoc3RyLCBmYWMpKTsKLQotICAgICAgICBNZXNzYWdlQ29udGV4dCByZXFNZXNzYWdlQ29udGV4dCA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBPcGVyYXRpb25DbGllbnQgb3BDbGluZXQgPSBzZW5kZXIuY3JlYXRlQ2xpZW50KFNlcnZpY2VDbGllbnQuQU5PTl9PVVRfSU5fT1ApOwotICAgICAgICAKLSAgICAgICAgcmVxTWVzc2FnZUNvbnRleHQuc2V0RW52ZWxvcGUoZW52ZWxvcGUpOwotCi0gICAgICAgIG9wQ2xpbmV0LmFkZE1lc3NhZ2VDb250ZXh0KHJlcU1lc3NhZ2VDb250ZXh0KTsKLSAgICAgICAgb3BDbGluZXQuZXhlY3V0ZSh0cnVlKTsKLQotICAgICAgICBNZXNzYWdlQ29udGV4dCByZXNwb25zZU1lc3NhZ2VDb250eCA9Ci0gICAgICAgICAgICAgICAgb3BDbGluZXQuZ2V0TWVzc2FnZUNvbnRleHQoV1NETENvbnN0YW50cy5NRVNTQUdFX0xBQkVMX0lOX1ZBTFVFKTsKLQotICAgICAgICBTT0FQRW52ZWxvcGUgZW52ID0gcmVzcG9uc2VNZXNzYWdlQ29udHguZ2V0RW52ZWxvcGUoKTsKLQotICAgICAgICBFbXBsb3llZSBlbXAgPSAoRW1wbG95ZWUpQmVhblV0aWwuZGVzZXJpYWxpemUoRW1wbG95ZWUuY2xhc3MsIGVudi5nZXRCb2R5KCkKLSAgICAgICAgICAgICAgICAuZ2V0Rmlyc3RFbGVtZW50KCkuZ2V0Rmlyc3RFbGVtZW50KCksIG5ldyBEZWZhdWx0T2JqZWN0U3VwcGxpZXIoKSwgbnVsbCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZW1wKTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNdWxpdHJlZkFycmF5KCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIFJQQ1NlcnZpY2VDbGllbnQgc2VuZGVyID0gZ2V0UlBDQ2xpZW50KCJFY2hvWE1MU2VydmljZSIsICJoYW5kbGVBcnJheUxpc3QiKTsKLSAgICAgICAgT01GYWN0b3J5IGZhYyA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpOwotCi0gICAgICAgIE9NTmFtZXNwYWNlIG9tTnMgPSBmYWMuY3JlYXRlT01OYW1lc3BhY2UoTkFNRVNQQUNFLCAibXkiKTsKLSAgICAgICAgT01FbGVtZW50IG1ldGhvZCA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoImhhbmRsZUFycmF5TGlzdCIsIG9tTnMpOwotCi0gICAgICAgIE9NRWxlbWVudCB2YWx1ZSA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoImFyZzAiLCBudWxsKTsKLSAgICAgICAgdmFsdWUuYWRkQXR0cmlidXRlKGZhYy5jcmVhdGVPTUF0dHJpYnV0ZSgiaHJlZiIsIG51bGwsICIjMSIpKTsKLSAgICAgICAgbWV0aG9kLmFkZENoaWxkKHZhbHVlKTsKLQotICAgICAgICBPTUVsZW1lbnQgdmFsdWUyID0gZmFjLmNyZWF0ZU9NRWxlbWVudCgiYXJnMSIsIG51bGwpOwotICAgICAgICB2YWx1ZTIuc2V0VGV4dCgiMTAiKTsKLSAgICAgICAgbWV0aG9kLmFkZENoaWxkKHZhbHVlMik7Ci0KLQotICAgICAgICBTT0FQRmFjdG9yeSBmYWN0b3J5ID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDExRmFjdG9yeSgpOwotICAgICAgICBTT0FQRW52ZWxvcGUgZW52ZWxvcGUgPSBmYWN0b3J5LmdldERlZmF1bHRFbnZlbG9wZSgpOwotICAgICAgICBlbnZlbG9wZS5nZXRCb2R5KCkuYWRkQ2hpbGQobWV0aG9kKTsKLQotCi0gICAgICAgIFN0cmluZyBzdHIgPSAiPHJlZmVyZW5jZSBpZD1cIjFcIj5cbiIgKwotICAgICAgICAgICAgICAgICIgICAgPGl0ZW0wPmFiYzwvaXRlbTA+XG4iICsKLSAgICAgICAgICAgICAgICAiICAgIDxpdGVtMD5kZWY8L2l0ZW0wPlxuIiArCi0gICAgICAgICAgICAgICAgIiAgICA8aXRlbTA+Z2hpPC9pdGVtMD5cbiIgKwotICAgICAgICAgICAgICAgICIgICAgPGl0ZW0wPmtsbTwvaXRlbTA+XG4iICsKLSAgICAgICAgICAgICAgICAiPC9yZWZlcmVuY2U+IjsKLSAgICAgICAgU3RBWE9NQnVpbGRlciBzdGF4T01CdWlsZGVyOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3Ci0gICAgICAgICAgICAgICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtKHN0ci5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICBzdGF4T01CdWlsZGVyID0gbmV3Ci0gICAgICAgICAgICAgICAgICAgIFN0QVhPTUJ1aWxkZXIoZmFjLCB4bWxSZWFkZXIpOwotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKTsKLSAgICAgICAgfSBjYXRjaCAoRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvciBmYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yKSB7Ci0gICAgICAgICAgICB0aHJvdyBBeGlzRmF1bHQubWFrZUZhdWx0KGZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3IpOwotICAgICAgICB9Ci0gICAgICAgIGVudmVsb3BlLmdldEJvZHkoKS5hZGRDaGlsZChzdGF4T01CdWlsZGVyLmdldERvY3VtZW50RWxlbWVudCgpKTsKLQotICAgICAgICBNZXNzYWdlQ29udGV4dCByZXFNZXNzYWdlQ29udGV4dCA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBPcGVyYXRpb25DbGllbnQgb3BDbGluZXQgPSBzZW5kZXIuY3JlYXRlQ2xpZW50KFNlcnZpY2VDbGllbnQuQU5PTl9PVVRfSU5fT1ApOwotICAgICAgICAKLSAgICAgICAgcmVxTWVzc2FnZUNvbnRleHQuc2V0RW52ZWxvcGUoZW52ZWxvcGUpOwotCi0gICAgICAgIG9wQ2xpbmV0LmFkZE1lc3NhZ2VDb250ZXh0KHJlcU1lc3NhZ2VDb250ZXh0KTsKLSAgICAgICAgb3BDbGluZXQuZXhlY3V0ZSh0cnVlKTsKLQotICAgICAgICBNZXNzYWdlQ29udGV4dCByZXNwb25zZU1lc3NhZ2VDb250eCA9Ci0gICAgICAgICAgICAgICAgb3BDbGluZXQuZ2V0TWVzc2FnZUNvbnRleHQoV1NETENvbnN0YW50cy5NRVNTQUdFX0xBQkVMX0lOX1ZBTFVFKTsKLQotICAgICAgICBTT0FQRW52ZWxvcGUgZW52ID0gcmVzcG9uc2VNZXNzYWdlQ29udHguZ2V0RW52ZWxvcGUoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGVudi5nZXRCb2R5KCkuZ2V0Rmlyc3RFbGVtZW50KCkuZ2V0Rmlyc3RFbGVtZW50KCkuZ2V0VGV4dCgpLCAiYWJjZGVmZ2hpa2xtMTAiKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ycGMvTXlCZWFuLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvcnBjL015QmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjVjMmIxLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ycGMvTXlCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucnBjOwotCi1wdWJsaWMgY2xhc3MgTXlCZWFuIHsKLSAgICBwcml2YXRlIFN0cmluZyBuYW1lOwotICAgIHByaXZhdGUgaW50IGFnZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gdmFsdWU7Ci0gICAgcHJpdmF0ZSBBZGRyZXNzQmVhbiBhZGRyZXNzOwotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRBZ2UoKSB7Ci0gICAgICAgIHJldHVybiBhZ2U7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QWdlKGludCBhZ2UpIHsKLSAgICAgICAgdGhpcy5hZ2UgPSBhZ2U7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNWYWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKGJvb2xlYW4gdmFsdWUpIHsKLSAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyBBZGRyZXNzQmVhbiBnZXRBZGRyZXNzKCkgewotICAgICAgICByZXR1cm4gYWRkcmVzczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRBZGRyZXNzKEFkZHJlc3NCZWFuIGFkZHJlc3MpIHsKLSAgICAgICAgdGhpcy5hZGRyZXNzID0gYWRkcmVzczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gKCJuYW1lOiIgKyBuYW1lICsgIiBBZ2UgOiAiICsgYWdlICsgIiBWYWx1ZSA6ICIgKyB2YWx1ZSArICIgQWRkcmVzcyA6ICIpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ycGMvUGVyc29uLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvcnBjL1BlcnNvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNmU1MDFkLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ycGMvUGVyc29uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucnBjOwotCi1wdWJsaWMgY2xhc3MgUGVyc29uIHsKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIG5hbWU7Ci0gICAgcHJvdGVjdGVkIGludCBhZ2U7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldEFnZSgpIHsKLSAgICAgICAgcmV0dXJuIGFnZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRBZ2UoaW50IGFnZSkgewotICAgICAgICB0aGlzLmFnZSA9IGFnZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvcnBjL1JQQ0NhbGxUZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvcnBjL1JQQ0NhbGxUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiMTk1YWYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JwYy9SUENDYWxsVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDg4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5ycGM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5idWlsZGVyLlN0QVhPTUJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS51dGlsLlN0QVhVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkRlZmF1bHRPYmplY3RTdXBwbGllcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmludGVncmF0aW9uLlJQQ0xvY2FsVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ycGMuY2xpZW50LlJQQ1NlcnZpY2VDbGllbnQ7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci1pbXBvcnQgamF2YS51dGlsLlRpbWVab25lOwotCi1wdWJsaWMgY2xhc3MgUlBDQ2FsbFRlc3QgZXh0ZW5kcyBSUENMb2NhbFRlc3RDYXNlIHsKLQotICAgIHByaXZhdGUgU2ltcGxlRGF0ZUZvcm1hdCB6dWx1ID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoInl5eXktTU0tZGQnVCdISDptbTpzcy5TU1MnWiciKTsKLSAgICAvLyAgMDEyMzQ1Njc4OSAwIDEyMzQ1Njc4OQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZmluaXNoID0gZmFsc2U7Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlkZXBsb3lDbGFzc0FzU2VydmljZSgiRWNob1hNTFNlcnZpY2UiLCBSUENTZXJ2aWNlQ2xhc3MuY2xhc3MpOwotCX0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFZGl0QmVhbigpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBSUENTZXJ2aWNlQ2xpZW50IHNlbmRlciA9IGdldFJQQ0NsaWVudCgiRWNob1hNTFNlcnZpY2UiLCAiZWRpdEJlYW4iKTsKLQotICAgICAgICBNeUJlYW4gYmVhbiA9IG5ldyBNeUJlYW4oKTsKLSAgICAgICAgYmVhbi5zZXRBZ2UoMTAwKTsKLSAgICAgICAgYmVhbi5zZXROYW1lKCJEZWVwYWwiKTsKLSAgICAgICAgYmVhbi5zZXRWYWx1ZShmYWxzZSk7Ci0gICAgICAgIEFkZHJlc3NCZWFuIGFiID0gbmV3IEFkZHJlc3NCZWFuKCk7Ci0gICAgICAgIGFiLnNldE51bWJlcigxMDEwKTsKLSAgICAgICAgYWIuc2V0VG93bigiQ29sb21ibzMiKTsKLSAgICAgICAgYmVhbi5zZXRBZGRyZXNzKGFiKTsKLQotCi0gICAgICAgIEFycmF5TGlzdCBhcmdzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBhcmdzLmFkZChiZWFuKTsKLSAgICAgICAgYXJncy5hZGQoIjE1OSIpOwotCi0gICAgICAgIE9NRWxlbWVudCByZXNwb25zZSA9IHNlbmRlci5pbnZva2VCbG9ja2luZyhuZXcgUU5hbWUoImh0dHA6Ly9ycGMuYXhpczIuYXBhY2hlLm9yZyIsICJlZGl0QmVhbiIsICJyZXEiKSwgYXJncy50b0FycmF5KCkpOwotICAgICAgICBNeUJlYW4gcmVzQmVhbiA9IChNeUJlYW4pQmVhblV0aWwuZGVzZXJpYWxpemUoTXlCZWFuLmNsYXNzLCByZXNwb25zZS5nZXRGaXJzdEVsZW1lbnQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBEZWZhdWx0T2JqZWN0U3VwcGxpZXIoKSwgbnVsbCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmVzQmVhbik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXNCZWFuLmdldEFnZSgpLCAxNTkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFY2hvQmVhbigpIHRocm93cyBBeGlzRmF1bHQgewotICAgIAlSUENTZXJ2aWNlQ2xpZW50IHNlbmRlciA9IGdldFJQQ0NsaWVudCgiRWNob1hNTFNlcnZpY2UiLCAiZWNob0JlYW4iKTsKLQotICAgICAgICBNeUJlYW4gYmVhbiA9IG5ldyBNeUJlYW4oKTsKLSAgICAgICAgYmVhbi5zZXRBZ2UoMTAwKTsKLSAgICAgICAgYmVhbi5zZXROYW1lKCJEZWVwYWwiKTsKLSAgICAgICAgYmVhbi5zZXRWYWx1ZShmYWxzZSk7Ci0gICAgICAgIEFkZHJlc3NCZWFuIGFiID0gbmV3IEFkZHJlc3NCZWFuKCk7Ci0gICAgICAgIGFiLnNldE51bWJlcigxMDEwKTsKLSAgICAgICAgYWIuc2V0VG93bigiQ29sb21ibzMiKTsKLSAgICAgICAgYmVhbi5zZXRBZGRyZXNzKGFiKTsKLQotICAgICAgICBBcnJheUxpc3QgYXJncyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgYXJncy5hZGQoYmVhbik7Ci0KLQotICAgICAgICBPTUVsZW1lbnQgcmVzcG9uc2UgPSBzZW5kZXIuaW52b2tlQmxvY2tpbmcobmV3IFFOYW1lKCJodHRwOi8vcnBjLmF4aXMyLmFwYWNoZS5vcmciLCAiZWNob0JlYW4iLCAicmVxIiksIGFyZ3MudG9BcnJheSgpKTsKLSAgICAgICAgTXlCZWFuIHJlc0JlYW4gPSAoTXlCZWFuKUJlYW5VdGlsLmRlc2VyaWFsaXplKE15QmVhbi5jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmdldEZpcnN0RWxlbWVudCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERlZmF1bHRPYmplY3RTdXBwbGllcigpLCBudWxsKTsKLS8vICAgICAgICBNeUJlYW4gcmVzQmVhbiA9KE15QmVhbikgbmV3ICBCZWFuU2VyaWFsaXplcihNeUJlYW4uY2xhc3MscmVzcG9uc2UpLmRlc2VyaWx6ZSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJlc0JlYW4pOwotICAgICAgICBhc3NlcnRFcXVhbHMocmVzQmVhbi5nZXRBZ2UoKSwgMTAwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0ZWNob01haWwoKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAJUlBDU2VydmljZUNsaWVudCBzZW5kZXIgPSBnZXRSUENDbGllbnQoIkVjaG9YTUxTZXJ2aWNlIiwgImVjaG9NYWlsIik7Ci0KLSAgICAgICAgTWFpbCBtYWlsID0gbmV3IE1haWwoKTsKLSAgICAgICAgbWFpbC5zZXRCb2R5KCJNeSBCb2R5Iik7Ci0gICAgICAgIG1haWwuc2V0Q29udGVudFR5cGUoIkNvbnRlbnRUeXBlIik7Ci0gICAgICAgIG1haWwuc2V0RnJvbSgiRnJvbSIpOwotICAgICAgICBtYWlsLnNldElkKCJJRCIpOwotICAgICAgICBtYWlsLnNldFN1YmplY3QoIlN1YmplY3QiKTsKLSAgICAgICAgbWFpbC5zZXRUbygiVG8iKTsKLQotICAgICAgICBBcnJheUxpc3QgYXJncyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgYXJncy5hZGQobWFpbCk7Ci0KLQotICAgICAgICBPTUVsZW1lbnQgcmVzcG9uc2UgPSBzZW5kZXIuaW52b2tlQmxvY2tpbmcobmV3IFFOYW1lKCJodHRwOi8vcnBjLmF4aXMyLmFwYWNoZS5vcmciLCAiZWNob01haWwiLCAicmVxIiksIGFyZ3MudG9BcnJheSgpKTsKLSAgICAgICAgTWFpbCByZXNCZWFuID0gKE1haWwpQmVhblV0aWwuZGVzZXJpYWxpemUoTWFpbC5jbGFzcywgcmVzcG9uc2UuZ2V0Rmlyc3RFbGVtZW50KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBEZWZhdWx0T2JqZWN0U3VwcGxpZXIoKSwgbnVsbCk7Ci0vLyAgICAgICAgTXlCZWFuIHJlc0JlYW4gPShNeUJlYW4pIG5ldyAgQmVhblNlcmlhbGl6ZXIoTXlCZWFuLmNsYXNzLHJlc3BvbnNlKS5kZXNlcmlsemUoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXNCZWFuKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc0JlYW4uZ2V0Qm9keSgpLCAiTXkgQm9keSIpOwotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgdGVzdEVjaG9TdHJpbmcoKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAJUlBDU2VydmljZUNsaWVudCBzZW5kZXIgPSBnZXRSUENDbGllbnQoIkVjaG9YTUxTZXJ2aWNlIiwgImVjaG9TdHJpbmciKTsKLQotICAgICAgICBBcnJheUxpc3QgYXJncyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgYXJncy5hZGQoImZvbyIpOwotICAgICAgICBPTUVsZW1lbnQgcmVzcG9uc2UgPSBzZW5kZXIuaW52b2tlQmxvY2tpbmcobmV3IFFOYW1lKCJodHRwOi8vcnBjLmF4aXMyLmFwYWNoZS5vcmciLCAiZWNob1N0cmluZyIsICJyZXEiKSwgYXJncy50b0FycmF5KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmVzcG9uc2UuZ2V0Rmlyc3RFbGVtZW50KCkuZ2V0VGV4dCgpLCAiZm9vIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEVjaG9JbnQoKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAJUlBDU2VydmljZUNsaWVudCBzZW5kZXIgPSBnZXRSUENDbGllbnQoIkVjaG9YTUxTZXJ2aWNlIiwgImVjaG9JbnQiKTsKLQotICAgICAgICBBcnJheUxpc3QgYXJncyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgYXJncy5hZGQoIjEwMCIpOwotCi0gICAgICAgIE9NRWxlbWVudCByZXNwb25zZSA9IHNlbmRlci5pbnZva2VCbG9ja2luZyhuZXcgUU5hbWUoImh0dHA6Ly9ycGMuYXhpczIuYXBhY2hlLm9yZyIsICJlY2hvSW50IiwgInJlcSIpLCBhcmdzLnRvQXJyYXkoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhJbnRlZ2VyLnBhcnNlSW50KHJlc3BvbnNlLmdldEZpcnN0RWxlbWVudCgpLmdldFRleHQoKSksIDEwMCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEFkZCgpIHRocm93cyBBeGlzRmF1bHQgewotICAgIAlSUENTZXJ2aWNlQ2xpZW50IHNlbmRlciA9IGdldFJQQ0NsaWVudCgiRWNob1hNTFNlcnZpY2UiLCAiYWRkIik7Ci0gICAgCQotICAgICAgICBBcnJheUxpc3QgYXJncyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgYXJncy5hZGQoIjEwMCIpOwotICAgICAgICBhcmdzLmFkZCgiMjAwIik7Ci0KLSAgICAgICAgT01FbGVtZW50IHJlc3BvbnNlID0gc2VuZGVyLmludm9rZUJsb2NraW5nKG5ldyBRTmFtZSgiaHR0cDovL3JwYy5heGlzMi5hcGFjaGUub3JnIiwgImFkZCIsICJyZXEiKSwgYXJncy50b0FycmF5KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoSW50ZWdlci5wYXJzZUludChyZXNwb25zZS5nZXRGaXJzdEVsZW1lbnQoKS5nZXRUZXh0KCkpLCAzMDApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RCeXRlQXJyYXkoKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAJUlBDU2VydmljZUNsaWVudCBzZW5kZXIgPSBnZXRSUENDbGllbnQoIkVjaG9YTUxTZXJ2aWNlIiwgInRlc3RCeXRlQXJyYXkiKTsKLSAgICAJCi0gICAgICAgIEFycmF5TGlzdCBhcmdzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBTdHJpbmcgaGVsbG8gPSAiaGVsbG8iOwotICAgICAgICBhcmdzLmFkZChoZWxsby5nZXRCeXRlcygpKTsKLQotICAgICAgICBPTUVsZW1lbnQgcmVzcG9uc2UgPSBzZW5kZXIuaW52b2tlQmxvY2tpbmcobmV3IFFOYW1lKCJodHRwOi8vcnBjLmF4aXMyLmFwYWNoZS5vcmciLCAidGVzdEJ5dGVBcnJheSIsICJyZXEiKSwgYXJncy50b0FycmF5KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmVzcG9uc2UuZ2V0Rmlyc3RFbGVtZW50KCkuZ2V0VGV4dCgpLCBoZWxsbyk7Ci0gICAgfQotCi0gICAgLy8KLQotICAgIHB1YmxpYyB2b2lkIHRlc3REaXZpZGUoKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAJUlBDU2VydmljZUNsaWVudCBzZW5kZXIgPSBnZXRSUENDbGllbnQoIkVjaG9YTUxTZXJ2aWNlIiwgImRpdmlkZSIpOwotCi0gICAgICAgIEFycmF5TGlzdCBhcmdzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBhcmdzLmFkZCgiMTAiKTsKLSAgICAgICAgYXJncy5hZGQoIjAiKTsKLSAgICAgICAgT01FbGVtZW50IHJlc3BvbnNlID0gc2VuZGVyLmludm9rZUJsb2NraW5nKG5ldyBRTmFtZSgiaHR0cDovL3JwYy5heGlzMi5hcGFjaGUub3JnIiwgImRpdmlkZSIsICJyZXEiKSwgYXJncy50b0FycmF5KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmVzcG9uc2UuZ2V0Rmlyc3RFbGVtZW50KCkuZ2V0VGV4dCgpLCAiSU5GIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEVjaG9Cb29sKCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIFJQQ1NlcnZpY2VDbGllbnQgc2VuZGVyID0gZ2V0UlBDQ2xpZW50KCJFY2hvWE1MU2VydmljZSIsICJlY2hvQm9vbCIpOwotCi0gICAgICAgIEFycmF5TGlzdCBhcmdzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBhcmdzLmFkZCgidHJ1ZSIpOwotCi0gICAgICAgIE9NRWxlbWVudCByZXNwb25zZSA9IHNlbmRlci5pbnZva2VCbG9ja2luZyhuZXcgUU5hbWUoImh0dHA6Ly9ycGMuYXhpczIuYXBhY2hlLm9yZyIsICJlY2hvQm9vbCIsICJyZXEiKSwgYXJncy50b0FycmF5KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoQm9vbGVhbi52YWx1ZU9mKHJlc3BvbnNlLmdldEZpcnN0RWxlbWVudCgpLmdldFRleHQoKSkuYm9vbGVhblZhbHVlKCksIHRydWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFY2hvQnl0ZSgpIHRocm93cyBBeGlzRmF1bHQgewotICAgIAlSUENTZXJ2aWNlQ2xpZW50IHNlbmRlciA9IGdldFJQQ0NsaWVudCgiRWNob1hNTFNlcnZpY2UiLCAiZWNob0J5dGUiKTsKLQotICAgICAgICBBcnJheUxpc3QgYXJncyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgYXJncy5hZGQoIjEiKTsKLSAgICAgICAgT01FbGVtZW50IHJlc3BvbnNlID0gc2VuZGVyLmludm9rZUJsb2NraW5nKG5ldyBRTmFtZSgiaHR0cDovL3JwYy5heGlzMi5hcGFjaGUub3JnIiwgImVjaG9CeXRlIiwgInJlcSIpLCBhcmdzLnRvQXJyYXkoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhCeXRlLnBhcnNlQnl0ZShyZXNwb25zZS5nZXRGaXJzdEVsZW1lbnQoKS5nZXRUZXh0KCkpLCAxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcGFueSgpIHRocm93cyBBeGlzRmF1bHQgewotICAgIAlSUENTZXJ2aWNlQ2xpZW50IHNlbmRlciA9IGdldFJQQ0NsaWVudCgiRWNob1hNTFNlcnZpY2UiLCAiZWNob0NvbXBhbnkiKTsKLQotICAgICAgICBDb21wYW55IGNvbSA9IG5ldyBDb21wYW55KCk7Ci0gICAgICAgIGNvbS5zZXROYW1lKCJNeUNvbXBhbnkiKTsKLQotICAgICAgICBBcnJheUxpc3QgcHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgUGVyc29uIHAxID0gbmV3IFBlcnNvbigpOwotICAgICAgICBwMS5zZXRBZ2UoMTApOwotICAgICAgICBwMS5zZXROYW1lKCJQMSIpOwotICAgICAgICBwcy5hZGQocDEpOwotCi0gICAgICAgIFBlcnNvbiBwMiA9IG5ldyBQZXJzb24oKTsKLSAgICAgICAgcDIuc2V0QWdlKDE1KTsKLSAgICAgICAgcDIuc2V0TmFtZSgiUDIiKTsKLSAgICAgICAgcHMuYWRkKHAyKTsKLQotICAgICAgICBQZXJzb24gcDMgPSBuZXcgUGVyc29uKCk7Ci0gICAgICAgIHAzLnNldEFnZSgyMCk7Ci0gICAgICAgIHAzLnNldE5hbWUoIlAzIik7Ci0gICAgICAgIHBzLmFkZChwMyk7Ci0KLSAgICAgICAgY29tLnNldFBlcnNvbnMocHMpOwotICAgICAgICBBcnJheUxpc3QgYXJncyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgYXJncy5hZGQoY29tKTsKLSAgICAgICAgc2VuZGVyLmludm9rZUJsb2NraW5nKG5ldyBRTmFtZSgiaHR0cDovL3JwYy5heGlzMi5hcGFjaGUub3JnIiwgImVjaG9Db21wYW55IiwgInJlcSIpLCBhcmdzLnRvQXJyYXkoKSk7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0dGVzdENvbXBhbnkoKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAJUlBDU2VydmljZUNsaWVudCBzZW5kZXIgPSBnZXRSUENDbGllbnQoIkVjaG9YTUxTZXJ2aWNlIiwgInRlc3RDb21wYW55QXJyYXkiKTsKLQotICAgICAgICBDb21wYW55IGNvbSA9IG5ldyBDb21wYW55KCk7Ci0gICAgICAgIGNvbS5zZXROYW1lKCJNeUNvbXBhbnkiKTsKLQotICAgICAgICBBcnJheUxpc3QgcHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgUGVyc29uIHAxID0gbmV3IFBlcnNvbigpOwotICAgICAgICBwMS5zZXRBZ2UoMTApOwotICAgICAgICBwMS5zZXROYW1lKCJQMSIpOwotICAgICAgICBwcy5hZGQocDEpOwotCi0gICAgICAgIFBlcnNvbiBwMiA9IG5ldyBQZXJzb24oKTsKLSAgICAgICAgcDIuc2V0QWdlKDE1KTsKLSAgICAgICAgcDIuc2V0TmFtZSgiUDIiKTsKLSAgICAgICAgcHMuYWRkKHAyKTsKLQotICAgICAgICBQZXJzb24gcDMgPSBuZXcgUGVyc29uKCk7Ci0gICAgICAgIHAzLnNldEFnZSgyMCk7Ci0gICAgICAgIHAzLnNldE5hbWUoIlAzIik7Ci0gICAgICAgIHBzLmFkZChwMyk7Ci0KLSAgICAgICAgY29tLnNldFBlcnNvbnMocHMpOwotICAgICAgICBBcnJheUxpc3QgYXJncyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgYXJncy5hZGQoY29tKTsKLSAgICAgICAgYXJncy5hZGQoY29tKTsKLSAgICAgICAgYXJncy5hZGQoY29tKTsKLSAgICAgICAgYXJncy5hZGQoY29tKTsKLQotICAgICAgICBBcnJheUxpc3QgcmVxID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICByZXEuYWRkKGFyZ3MudG9BcnJheSgpKTsKLSAgICAgICAgT01FbGVtZW50IHZhbHVlID0gc2VuZGVyLmludm9rZUJsb2NraW5nKG5ldyBRTmFtZSgiaHR0cDovL3JwYy5heGlzMi5hcGFjaGUub3JnIiwgInRlc3RDb21wYW55QXJyYXkiLCAicmVxIiksIHJlcS50b0FycmF5KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjQiLCB2YWx1ZS5nZXRGaXJzdEVsZW1lbnQoKS5nZXRUZXh0KCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDb21wYW55QXJyYXkoKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAJUlBDU2VydmljZUNsaWVudCBzZW5kZXIgPSBnZXRSUENDbGllbnQoIkVjaG9YTUxTZXJ2aWNlIiwgIkNvbXBhbnlBcnJheSIpOwotCi0gICAgICAgIENvbXBhbnkgY29tID0gbmV3IENvbXBhbnkoKTsKLSAgICAgICAgY29tLnNldE5hbWUoIk15Q29tcGFueSIpOwotCi0gICAgICAgIEFycmF5TGlzdCBwcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgICAgICBQZXJzb24gcDEgPSBuZXcgUGVyc29uKCk7Ci0gICAgICAgIHAxLnNldEFnZSgxMCk7Ci0gICAgICAgIHAxLnNldE5hbWUoIlAxIik7Ci0gICAgICAgIHBzLmFkZChwMSk7Ci0KLSAgICAgICAgUGVyc29uIHAyID0gbmV3IFBlcnNvbigpOwotICAgICAgICBwMi5zZXRBZ2UoMTUpOwotICAgICAgICBwMi5zZXROYW1lKCJQMiIpOwotICAgICAgICBwcy5hZGQocDIpOwotCi0gICAgICAgIFBlcnNvbiBwMyA9IG5ldyBQZXJzb24oKTsKLSAgICAgICAgcDMuc2V0QWdlKDIwKTsKLSAgICAgICAgcDMuc2V0TmFtZSgiUDMiKTsKLSAgICAgICAgcHMuYWRkKHAzKTsKLQotICAgICAgICBjb20uc2V0UGVyc29ucyhwcyk7Ci0gICAgICAgIEFycmF5TGlzdCBhcmdzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBhcmdzLmFkZChjb20pOwotICAgICAgICBhcmdzLmFkZChjb20pOwotICAgICAgICBhcmdzLmFkZChjb20pOwotICAgICAgICBhcmdzLmFkZChjb20pOwotCi0gICAgICAgIEFycmF5TGlzdCByZXEgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIHJlcS5hZGQoYXJncy50b0FycmF5KCkpOwotICAgICAgICBBcnJheUxpc3QgcmVzb2JqID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICByZXNvYmouYWRkKENvbXBhbnkuY2xhc3MpOwotICAgICAgICByZXNvYmouYWRkKENvbXBhbnkuY2xhc3MpOwotICAgICAgICByZXNvYmouYWRkKENvbXBhbnkuY2xhc3MpOwotICAgICAgICByZXNvYmouYWRkKENvbXBhbnkuY2xhc3MpOwotICAgICAgICBPYmplY3QgW10gdmFsdWUgPSBzZW5kZXIuaW52b2tlQmxvY2tpbmcobmV3IFFOYW1lKCJodHRwOi8vcnBjLmF4aXMyLmFwYWNoZS5vcmciLCAiQ29tcGFueUFycmF5IiwgInJlcSIpLCByZXEudG9BcnJheSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKENsYXNzW10pcmVzb2JqLnRvQXJyYXkobmV3IENsYXNzW3Jlc29iai5zaXplKCldKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyg0LCB2YWx1ZS5sZW5ndGgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoKChDb21wYW55KXZhbHVlWzBdKS5nZXROYW1lKCksICJNeUNvbXBhbnkiKTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFY2hvT00oKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAJUlBDU2VydmljZUNsaWVudCBzZW5kZXIgPSBnZXRSUENDbGllbnQoIkVjaG9YTUxTZXJ2aWNlIiwgImVjaG9PTSIpOwotCi0gICAgICAgIEFycmF5TGlzdCBhcmdzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBhcmdzLmFkZCgiMSIpOwotICAgICAgICBPTUVsZW1lbnQgcmVzcG9uc2UgPSBzZW5kZXIuaW52b2tlQmxvY2tpbmcobmV3IFFOYW1lKCJodHRwOi8vcnBjLmF4aXMyLmFwYWNoZS5vcmciLCAiZWNob09NIiwgInJlcSIpLCBhcmdzLnRvQXJyYXkoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhCeXRlLnBhcnNlQnl0ZShyZXNwb25zZS5nZXRGaXJzdEVsZW1lbnQoKS5nZXRGaXJzdEVsZW1lbnQoKS5nZXRUZXh0KCkpLCAxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FsZW5kZXIoKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgenVsdS5zZXRUaW1lWm9uZShUaW1lWm9uZS5nZXRUaW1lWm9uZSgiR01UIikpOwotICAgICAgICBSUENTZXJ2aWNlQ2xpZW50IHNlbmRlciA9IGdldFJQQ0NsaWVudCgiRWNob1hNTFNlcnZpY2UiLCAiZWNob0NhbGFuZGVyIik7Ci0KLSAgICAgICAgQXJyYXlMaXN0IGFyZ3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIERhdGUgZGF0ZSA9IENhbGVuZGFyLmdldEluc3RhbmNlKCkuZ2V0VGltZSgpOwotICAgICAgICBhcmdzLmFkZCh6dWx1LmZvcm1hdChkYXRlKSk7Ci0gICAgICAgIE9NRWxlbWVudCByZXNwb25zZSA9IHNlbmRlci5pbnZva2VCbG9ja2luZyhuZXcgUU5hbWUoImh0dHA6Ly9ycGMuYXhpczIuYXBhY2hlLm9yZyIsICJlY2hvQ2FsYW5kZXIiLCAicmVxIiksIGFyZ3MudG9BcnJheSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3BvbnNlLmdldEZpcnN0RWxlbWVudCgpLmdldFRleHQoKSwgenVsdS5mb3JtYXQoZGF0ZSkpOwotICAgIH0KLQotCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gSW52b2tpbmcgYnkgUGFzc2luZyBSZXR1cm4gdHlwZXMgLy8vLy8vLy8vLwotICAgIHB1YmxpYyB2b2lkIHRlc3RlY2hvQmVhbjIoKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAJUlBDU2VydmljZUNsaWVudCBzZW5kZXIgPSBnZXRSUENDbGllbnQoIkVjaG9YTUxTZXJ2aWNlIiwgImVjaG9CZWFuIik7Ci0KLSAgICAgICAgTXlCZWFuIGJlYW4gPSBuZXcgTXlCZWFuKCk7Ci0gICAgICAgIGJlYW4uc2V0QWdlKDEwMCk7Ci0gICAgICAgIGJlYW4uc2V0TmFtZSgiRGVlcGFsIik7Ci0gICAgICAgIGJlYW4uc2V0VmFsdWUoZmFsc2UpOwotICAgICAgICBBZGRyZXNzQmVhbiBhYiA9IG5ldyBBZGRyZXNzQmVhbigpOwotICAgICAgICBhYi5zZXROdW1iZXIoMTAxMCk7Ci0gICAgICAgIGFiLnNldFRvd24oIkNvbG9tYm8zIik7Ci0gICAgICAgIGJlYW4uc2V0QWRkcmVzcyhhYik7Ci0KLSAgICAgICAgQXJyYXlMaXN0IGFyZ3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGFyZ3MuYWRkKGJlYW4pOwotCi0gICAgICAgIEFycmF5TGlzdCByZXQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIHJldC5hZGQoTXlCZWFuLmNsYXNzKTsKLQotICAgICAgICBPYmplY3QgW10gcmVzcG9uc2UgPSBzZW5kZXIuaW52b2tlQmxvY2tpbmcobmV3IFFOYW1lKCJodHRwOi8vcnBjLmF4aXMyLmFwYWNoZS5vcmciLCAiZWNob0JlYW4iLCAicmVxIiksIGFyZ3MudG9BcnJheSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKENsYXNzW10pcmV0LnRvQXJyYXkobmV3IENsYXNzW3JldC5zaXplKCldKSk7Ci0gICAgICAgIE15QmVhbiByZXNCZWFuID0gKE15QmVhbilyZXNwb25zZVswXTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXNCZWFuKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc0JlYW4uZ2V0QWdlKCksIDEwMCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdGVjaG9JbnQyKCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgCVJQQ1NlcnZpY2VDbGllbnQgc2VuZGVyID0gZ2V0UlBDQ2xpZW50KCJFY2hvWE1MU2VydmljZSIsICJlY2hvSW50Iik7Ci0KLSAgICAgICAgQXJyYXlMaXN0IGFyZ3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGFyZ3MuYWRkKCIxMDAiKTsKLQotICAgICAgICBBcnJheUxpc3QgcmV0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICByZXQuYWRkKEludGVnZXIuY2xhc3MpOwotCi0gICAgICAgIE9iamVjdCBbXSByZXNwb25zZSA9IHNlbmRlci5pbnZva2VCbG9ja2luZyhuZXcgUU5hbWUoImh0dHA6Ly9ycGMuYXhpczIuYXBhY2hlLm9yZyIsICJlY2hvSW50IiwgInJlcSIpLCBhcmdzLnRvQXJyYXkoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDbGFzc1tdKXJldC50b0FycmF5KG5ldyBDbGFzc1tyZXQuc2l6ZSgpXSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoKChJbnRlZ2VyKXJlc3BvbnNlWzBdKS5pbnRWYWx1ZSgpLCAxMDApOwotICAgIH0KLQotLy8gICAgcHVibGljIHZvaWQgdGVzdG11bHRpcmV0dXJuKCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0vLyAgICAgICAgY29uZmlndXJlU3lzdGVtKCJtdWx0aXJldHVybiIpOwotLy8KLS8vICAgICAgICBPcHRpb25zIG9wdGlvbnMgPSBuZXcgT3B0aW9ucygpOwotLy8gICAgICAgIG9wdGlvbnMuc2V0VG8odGFyZ2V0RVBSKTsKLS8vICAgICAgICBvcHRpb25zLnNldFRyYW5zcG9ydEluUHJvdG9jb2woQ29uc3RhbnRzLlRSQU5TUE9SVF9IVFRQKTsKLS8vCi0vLyAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ29udGV4dCA9Ci0vLyAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkuY3JlYXRlQ29uZmlndXJhdGlvbkNvbnRleHRGcm9tRmlsZVN5c3RlbShudWxsLCBudWxsKTsKLS8vICAgICAgICBSUENTZXJ2aWNlQ2xpZW50IHNlbmRlciA9IG5ldyBSUENTZXJ2aWNlQ2xpZW50KGNvbmZpZ0NvbnRleHQsIG51bGwpOwotLy8gICAgICAgIHNlbmRlci5zZXRPcHRpb25zKG9wdGlvbnMpOwotLy8KLS8vICAgICAgICBBcnJheUxpc3QgYXJncyA9IG5ldyBBcnJheUxpc3QoKTsKLS8vICAgICAgICBhcmdzLmFkZCgiMSIpOwotLy8KLS8vICAgICAgICBBcnJheUxpc3QgcmV0ID0gbmV3IEFycmF5TGlzdCgpOwotLy8gICAgICAgIHJldC5hZGQoSW50ZWdlci5jbGFzcyk7Ci0vLyAgICAgICAgcmV0LmFkZChTdHJpbmcuY2xhc3MpOwotLy8KLS8vICAgICAgICBPYmplY3QgW10gcmVzcG9uc2UgPSBzZW5kZXIuaW52b2tlQmxvY2tpbmcob3BlcmF0aW9uTmFtZSwgYXJncy50b0FycmF5KCksIHJldC50b0FycmF5KCkpOwotLy8gICAgICAgIGFzc2VydEVxdWFscygoKEludGVnZXIpIHJlc3BvbnNlWzBdKS5pbnRWYWx1ZSgpLCAxMCk7Ci0vLyAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3BvbnNlWzFdLCAiZm9vIik7Ci0vLyAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nQXJyYXkoKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAJUlBDU2VydmljZUNsaWVudCBzZW5kZXIgPSBnZXRSUENDbGllbnQoIkVjaG9YTUxTZXJ2aWNlIiwgImhhbmRsZVN0cmluZ0FycmF5Iik7Ci0KLSAgICAgICAgQXJyYXlMaXN0IGFyZ3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIFN0cmluZyBbXSB2YWx1ZXMgPSBuZXcgU3RyaW5nW10geyAiYWJjIiwgImNkZSIsICJlZmciIH07Ci0gICAgICAgIGFyZ3MuYWRkKHZhbHVlcyk7Ci0gICAgICAgIEFycmF5TGlzdCByZXQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIHJldC5hZGQoQm9vbGVhbi5jbGFzcyk7Ci0gICAgICAgIE9iamVjdCBbXSBvYmpzID0gc2VuZGVyLmludm9rZUJsb2NraW5nKG5ldyBRTmFtZSgiaHR0cDovL3JwYy5heGlzMi5hcGFjaGUub3JnIiwgImhhbmRsZVN0cmluZ0FycmF5IiwgInJlcSIpLCBhcmdzLnRvQXJyYXkoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKENsYXNzW10pcmV0LnRvQXJyYXkobmV3IENsYXNzW3JldC5zaXplKCldKSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwob2Jqcyk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIEJvb2xlYW4udmFsdWVPZihvYmpzWzBdLnRvU3RyaW5nKCkpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0bXVsdGlBcnJheXMoKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAJUlBDU2VydmljZUNsaWVudCBzZW5kZXIgPSBnZXRSUENDbGllbnQoIkVjaG9YTUxTZXJ2aWNlIiwgIm11bHRpQXJyYXlzIik7Ci0gICAgCQotICAgICAgICBBcnJheUxpc3QgYXJncyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgU3RyaW5nIFtdIHZhbHVlcyA9IG5ldyBTdHJpbmdbXSB7ICJhYmMiLCAiY2RlIiwgImVmZyIgfTsKLSAgICAgICAgYXJncy5hZGQodmFsdWVzKTsKLQotICAgICAgICBTdHJpbmcgW10gdmFsdWVzMiA9IG5ldyBTdHJpbmdbXSB7ICJhYmMiLCAiY2RlIiwgImVmZyIgfTsKLSAgICAgICAgYXJncy5hZGQodmFsdWVzMik7Ci0gICAgICAgIFN0cmluZyBbXSB2YWx1ZXMzID0gbmV3IFN0cmluZ1tdIHsgImFiYyIsICJjZGUiLCAiZWZnIiB9OwotICAgICAgICBhcmdzLmFkZCh2YWx1ZXMzKTsKLSAgICAgICAgYXJncy5hZGQoIjEwIik7Ci0KLSAgICAgICAgQXJyYXlMaXN0IHJldCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgcmV0LmFkZChJbnRlZ2VyLmNsYXNzKTsKLSAgICAgICAgT2JqZWN0IFtdIG9ianMgPSBzZW5kZXIuaW52b2tlQmxvY2tpbmcobmV3IFFOYW1lKCJodHRwOi8vcnBjLmF4aXMyLmFwYWNoZS5vcmciLCAibXVsdGlBcnJheXMiLCAicmVxIiksIGFyZ3MudG9BcnJheSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ2xhc3NbXSlyZXQudG9BcnJheShuZXcgQ2xhc3NbcmV0LnNpemUoKV0pKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChvYmpzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDE5LCBJbnRlZ2VyLnBhcnNlSW50KG9ianNbMF0udG9TdHJpbmcoKSkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RtdWxSZXR1cm4oKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAJUlBDU2VydmljZUNsaWVudCBzZW5kZXIgPSBnZXRSUENDbGllbnQoIkVjaG9YTUxTZXJ2aWNlIiwgIm11bFJldHVybiIpOwotCi0gICAgICAgIEFycmF5TGlzdCBhcmdzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBhcmdzLmFkZCgiZm9vIik7Ci0KLQotICAgICAgICBPTUVsZW1lbnQgZWxlbWVudCA9IHNlbmRlci5pbnZva2VCbG9ja2luZyhuZXcgUU5hbWUoImh0dHA6Ly9ycGMuYXhpczIuYXBhY2hlLm9yZyIsICJtdWxSZXR1cm4iLCAicmVxIiksIGFyZ3MudG9BcnJheSgpKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJlbGVtZW50ID0gIiArIGVsZW1lbnQpOwotLy8gICAgICAgIGFzc2VydEVxdWFscyhyZXNwb25zZS5nZXRGaXJzdEVsZW1lbnQoKS5nZXRUZXh0KCksICJmb28iKTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RoYW5kbGVBcnJheUxpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAJUlBDU2VydmljZUNsaWVudCBzZW5kZXIgPSBnZXRSUENDbGllbnQoIkVjaG9YTUxTZXJ2aWNlIiwgImhhbmRsZUFycmF5TGlzdCIpOwotCi0gICAgICAgIE9NRWxlbWVudCBlbGVtID0gc2VuZGVyLnNlbmRSZWNlaXZlKGdldFBheWxvYWQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhlbGVtLmdldEZpcnN0RWxlbWVudCgpLmdldFRleHQoKSwgImFiY2RlZmdoaWtsbTEwIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdG9tRWxlbWVudEFycmF5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFJQQ1NlcnZpY2VDbGllbnQgc2VuZGVyID0gZ2V0UlBDQ2xpZW50KCJFY2hvWE1MU2VydmljZSIsICJvbUVsZW1lbnRBcnJheSIpOwotICAgICAgICAKLSAgICAgICAgU3RyaW5nIHN0ciA9ICI8cmVxOm9tRWxlbWVudEFycmF5IHhtbG5zOnJlcT1cImh0dHA6Ly9ycGMuYXhpczIuYXBhY2hlLm9yZ1wiPlxuIiArCi0gICAgICAgICAgICAgICAgIiAgICA8YXJnMD48YWJjPnZhdWUxPC9hYmM+PC9hcmcwPlxuIiArCi0gICAgICAgICAgICAgICAgIiAgICA8YXJnMD48YWJjPnZhdWUyPC9hYmM+PC9hcmcwPlxuIiArCi0gICAgICAgICAgICAgICAgIiAgICA8YXJnMD48YWJjPnZhdWUzPC9hYmM+PC9hcmcwPlxuIiArCi0gICAgICAgICAgICAgICAgIiAgICA8YXJnMD48YWJjPnZhdWU0PC9hYmM+PC9hcmcwPlxuIiArCi0gICAgICAgICAgICAgICAgIjwvcmVxOm9tRWxlbWVudEFycmF5PiI7Ci0gICAgICAgIFN0QVhPTUJ1aWxkZXIgc3RheE9NQnVpbGRlcjsKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3Ci0gICAgICAgICAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0oc3RyLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgT01GYWN0b3J5IGZhYyA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpOwotCi0gICAgICAgIHN0YXhPTUJ1aWxkZXIgPSBuZXcgU3RBWE9NQnVpbGRlcihmYWMsIHhtbFJlYWRlcik7Ci0KLSAgICAgICAgT01FbGVtZW50IGVsZW0gPSBzZW5kZXIuc2VuZFJlY2VpdmUoc3RheE9NQnVpbGRlci5nZXREb2N1bWVudEVsZW1lbnQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiNCIsIGVsZW0uZ2V0Rmlyc3RFbGVtZW50KCkuZ2V0VGV4dCgpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE9NRWxlbWVudCBnZXRQYXlsb2FkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBzdHIgPSAiPHJlcTpoYW5kbGVBcnJheUxpc3QgeG1sbnM6cmVxPVwiaHR0cDovL3JwYy5heGlzMi5hcGFjaGUub3JnXCI+XG4iICsKLSAgICAgICAgICAgICAgICAiICA8YXJnMD5cbiIgKwotICAgICAgICAgICAgICAgICIgICAgPGl0ZW0wPmFiYzwvaXRlbTA+XG4iICsKLSAgICAgICAgICAgICAgICAiICAgIDxpdGVtMD5kZWY8L2l0ZW0wPlxuIiArCi0gICAgICAgICAgICAgICAgIiAgICA8aXRlbTA+Z2hpPC9pdGVtMD5cbiIgKwotICAgICAgICAgICAgICAgICIgICAgPGl0ZW0wPmtsbTwvaXRlbTA+XG4iICsKLSAgICAgICAgICAgICAgICAiICA8L2FyZzA+PGFyZzE+MTA8L2FyZzE+IiArCi0gICAgICAgICAgICAgICAgIjwvcmVxOmhhbmRsZUFycmF5TGlzdD4iOwotICAgICAgICBTdEFYT01CdWlsZGVyIHN0YXhPTUJ1aWxkZXI7Ci0gICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKAotICAgICAgICAgICAgICAgIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShzdHIuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICBPTUZhY3RvcnkgZmFjID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCk7Ci0KLSAgICAgICAgc3RheE9NQnVpbGRlciA9IG5ldyBTdEFYT01CdWlsZGVyKGZhYywgeG1sUmVhZGVyKTsKLSAgICAgICAgcmV0dXJuIHN0YXhPTUJ1aWxkZXIuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ycGMvUlBDU2VydmljZUNsYXNzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvcnBjL1JQQ1NlcnZpY2VDbGFzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDk5MjBlLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ycGMvUlBDU2VydmljZUNsYXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJwYzsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5EZWZhdWx0T2JqZWN0U3VwcGxpZXI7Ci0KLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLQotcHVibGljIGNsYXNzIFJQQ1NlcnZpY2VDbGFzcyB7Ci0KLSAgICBwdWJsaWMgTXlCZWFuIGVkaXRCZWFuKE15QmVhbiBiZWFuLCBpbnQgYSkgewotICAgICAgICBiZWFuLnNldEFnZShhKTsKLSAgICAgICAgcmV0dXJuIGJlYW47Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgTXlCZWFuIGVjaG9CZWFuKE15QmVhbiBiZWFuKSB7Ci0gICAgICAgIHJldHVybiBiZWFuOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZWNob1N0cmluZyhTdHJpbmcgaW4pIHsKLSAgICAgICAgcmV0dXJuIGluOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZWNob0ludChpbnQgaSkgewotICAgICAgICByZXR1cm4gaTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGFkZChpbnQgYSwgaW50IGIpIHsKLSAgICAgICAgcmV0dXJuIGEgKyBiOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGVjaG9Cb29sKGJvb2xlYW4gYikgewotICAgICAgICByZXR1cm4gYjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYnl0ZSBlY2hvQnl0ZShieXRlIGIpIHsKLSAgICAgICAgcmV0dXJuIGI7Ci0gICAgfQotCi0gICAgcHVibGljIE9NRWxlbWVudCBlY2hvT00oT01FbGVtZW50IGIpIHsKLSAgICAgICAgYi5idWlsZCgpOwotLy8gICAgICAgIFNPQVBGYWN0b3J5IGZhYyA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMkZhY3RvcnkoKTsKLS8vICAgICAgICBPTU5hbWVzcGFjZSBucyA9IGZhYy5jcmVhdGVPTU5hbWVzcGFjZSgKLS8vICAgICAgICAgICAgICAgICJodHRwOi8vc29hcGVuYy8iLCAicmVzIik7Ci0vLyAgICAgICAgT01FbGVtZW50IGJvZHlDb250ZW50ID0gZmFjLmNyZWF0ZU9NRWxlbWVudCgKLS8vICAgICAgICAgICAgICAgICJlY2hvT01SZXNwb25zZSIsIG5zKTsKLS8vICAgICAgICBPTUVsZW1lbnQgY2hpbGQgPSBmYWMuY3JlYXRlT01FbGVtZW50KCJyZXR1cm4iLCBudWxsKTsKLS8vICAgICAgICBjaGlsZC5hZGRDaGlsZChmYWMuY3JlYXRlT01UZXh0KGNoaWxkLCBiLmdldFRleHQoKSkpOwotLy8gICAgICAgIGJvZHlDb250ZW50LmFkZENoaWxkKGNoaWxkKTsKLS8vLy8gICAgICAgIGJvZHlDb250ZW50LmFkZENoaWxkKGIpOwotICAgICAgICByZXR1cm4gKE9NRWxlbWVudCliLmRldGFjaCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBkb3VibGUgZGl2aWRlKGRvdWJsZSBhLCBkb3VibGUgYikgewotICAgICAgICByZXR1cm4gKGEgLyBiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2FsZW5kYXIgZWNob0NhbGFuZGVyKENhbGVuZGFyIGluKSB7Ci0gICAgICAgIHJldHVybiBpbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT01FbGVtZW50IG11bHRpcmV0dXJuKE9NRWxlbWVudCBlbGUpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBTT0FQRmFjdG9yeSBmYWMgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTJGYWN0b3J5KCk7Ci0gICAgICAgIE9NTmFtZXNwYWNlIG9tTnMgPSBmYWMuY3JlYXRlT01OYW1lc3BhY2UoImh0dHA6Ly9sb2NhbGhvc3QvbXkiLCAicmVzIik7Ci0gICAgICAgIE9NRWxlbWVudCBtZXRob2QgPSBmYWMuY3JlYXRlT01FbGVtZW50KCJtdWx0aXJldHVlblJlc3BvbnNlIiwgb21Ocyk7Ci0gICAgICAgIE9NRWxlbWVudCB2YWx1ZTEgPSBmYWMuY3JlYXRlT01FbGVtZW50KCJyZXR1cm4wIiwgbnVsbCk7Ci0gICAgICAgIHZhbHVlMS5hZGRDaGlsZCgKLSAgICAgICAgICAgICAgICBmYWMuY3JlYXRlT01UZXh0KHZhbHVlMSwgIjEwIikpOwotICAgICAgICBtZXRob2QuYWRkQ2hpbGQodmFsdWUxKTsKLSAgICAgICAgT01FbGVtZW50IHZhbHVlMiA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoInJldHVybjEiLCBudWxsKTsKLSAgICAgICAgdmFsdWUyLmFkZENoaWxkKAotICAgICAgICAgICAgICAgIGZhYy5jcmVhdGVPTVRleHQodmFsdWUyLCAiZm9vIikpOwotICAgICAgICBtZXRob2QuYWRkQ2hpbGQodmFsdWUyKTsKLSAgICAgICAgcmV0dXJuIG1ldGhvZDsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kcyByZXR1cm4gbXV0aXBsZSBvYmplY3QgLCBzbyBpdCBjcmVhdCBhbiBPYmplY3QgYXJyYXkgYW5kIHJldHVlbiB0aGF0IHNvICwgaWYgYQotICAgICAqIG1ldGhvZCB3YW50IHRvIHJldHVybiBtdXRpcGxlIHZhbHVlICwgdGhpcyB3YXkgY2FuIGJlIHVzZWQKLSAgICAgKgotICAgICAqIEBwYXJhbSBvYmoKLSAgICAgKiBAcmV0dXJuIE9iamVjdCBbXQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3RbXSBtdWxSZXR1cm4oT01FbGVtZW50IG9iaikgewotICAgICAgICBBcnJheUxpc3Qgb2JqcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgb2Jqcy5hZGQobmV3IEludGVnZXIoMTAwKSk7Ci0gICAgICAgIE15QmVhbiBiZWFuID0gbmV3IE15QmVhbigpOwotICAgICAgICBiZWFuLnNldEFnZSgxMDApOwotICAgICAgICBiZWFuLnNldE5hbWUoIkRlZXBhbCIpOwotICAgICAgICBiZWFuLnNldFZhbHVlKGZhbHNlKTsKLSAgICAgICAgQWRkcmVzc0JlYW4gYWIgPSBuZXcgQWRkcmVzc0JlYW4oKTsKLSAgICAgICAgYWIuc2V0TnVtYmVyKDEwMTApOwotICAgICAgICBhYi5zZXRUb3duKCJDb2xvbWJvMyIpOwotICAgICAgICBiZWFuLnNldEFkZHJlc3MoYWIpOwotICAgICAgICBvYmpzLmFkZChiZWFuKTsKLSAgICAgICAgcmV0dXJuIG9ianMudG9BcnJheSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBNeUJlYW4gYmVhbk9NKE9NRWxlbWVudCBlbGVtZW50LCBpbnQgdmFsKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgTXlCZWFuIGJlYW4gPSAoTXlCZWFuKUJlYW5VdGlsCi0gICAgICAgICAgICAgICAgLmRlc2VyaWFsaXplKE15QmVhbi5jbGFzcywgZWxlbWVudCwgbmV3IERlZmF1bHRPYmplY3RTdXBwbGllcigpLCBudWxsKTsKLSAgICAgICAgYmVhbi5zZXRBZ2UodmFsKTsKLSAgICAgICAgcmV0dXJuIGJlYW47Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gb21yZWZzKE9NRWxlbWVudCBlbGVtZW50LCBPTUVsZW1lbnQgZWxlbWVudDIpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBNeUJlYW4gYmVhbiA9IChNeUJlYW4pQmVhblV0aWwKLSAgICAgICAgICAgICAgICAuZGVzZXJpYWxpemUoTXlCZWFuLmNsYXNzLCBlbGVtZW50LCBuZXcgRGVmYXVsdE9iamVjdFN1cHBsaWVyKCksIG51bGwpOwotICAgICAgICBNeUJlYW4gYmVhbjIgPSAoTXlCZWFuKUJlYW5VdGlsCi0gICAgICAgICAgICAgICAgLmRlc2VyaWFsaXplKE15QmVhbi5jbGFzcywgZWxlbWVudDIsIG5ldyBEZWZhdWx0T2JqZWN0U3VwcGxpZXIoKSwgbnVsbCk7Ci0gICAgICAgIHJldHVybiBiZWFuMiAhPSBudWxsICYmIGJlYW4gIT0gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGhhbmRsZUFycmF5TGlzdChBcnJheUxpc3QgbGlzdCwgaW50IGIpIHsKLSAgICAgICAgU3RyaW5nIHN0ciA9ICIiOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIE9iamVjdCBvYmogPSBsaXN0LmdldChpKTsKLSAgICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBPTUVsZW1lbnQpIHsKLSAgICAgICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gKE9NRWxlbWVudClvYmo7Ci0gICAgICAgICAgICAgICAgc3RyID0gc3RyICsgb21FbGVtZW50LmdldFRleHQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RyICsgYjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRW1wbG95ZWUgZWNob0VtcGxveWVlKEVtcGxveWVlIGVtKSB7Ci0gICAgICAgIHJldHVybiBlbTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IHRlc3RDb21wYW55QXJyYXkoQ29tcGFueSBbXSBjb20pIHsKLSAgICAgICAgcmV0dXJuIGNvbS5sZW5ndGg7Ci0gICAgfQotCi0gICAgcHVibGljIENvbXBhbnkgW10gQ29tcGFueUFycmF5KENvbXBhbnkgW10gY29tKSB7Ci0gICAgICAgIEFycmF5TGlzdCByZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29tLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBDb21wYW55IGNvbXBhbnkgPSBjb21baV07Ci0gICAgICAgICAgICByZXMuYWRkKGNvbXBhbnkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAoQ29tcGFueSBbXSlyZXMudG9BcnJheShuZXcgQ29tcGFueVtyZXMuc2l6ZSgpXSk7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgQ29tcGFueSBlY2hvQ29tcGFueShDb21wYW55IGNvbSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIEFycmF5TGlzdCBwc3MgPSBjb20uZ2V0UGVyc29ucygpOwotICAgICAgICBBcnJheUxpc3QgdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwc3Muc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSAoT01FbGVtZW50KXBzcy5nZXQoaSk7Ci0gICAgICAgICAgICBQZXJzb24gcCA9IChQZXJzb24pQmVhblV0aWwKLSAgICAgICAgICAgICAgICAgICAgLmRlc2VyaWFsaXplKFBlcnNvbi5jbGFzcywgb21FbGVtZW50LCBuZXcgRGVmYXVsdE9iamVjdFN1cHBsaWVyKCksIG51bGwpOwotICAgICAgICAgICAgdGVtcy5hZGQocCk7Ci0gICAgICAgIH0KLSAgICAgICAgY29tLnNldFBlcnNvbnModGVtcyk7Ci0gICAgICAgIHJldHVybiBjb207Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaGFuZGxBbnlUaGluZyhTdHJpbmcgdmFsdWUxLCBpbnQgYWJjLCBEYXRlIGRhdGUpIHsKLQotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGhhbmRsZVN0cmluZ0FycmF5KFN0cmluZyBbXSB2YWx1ZSkgewotICAgICAgICByZXR1cm4gdmFsdWUubGVuZ3RoID4gMDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IG9tRWxlbWVudEFycmF5KE9NRWxlbWVudCBbXSBvbUVsZW1lbnQpIHsKLSAgICAgICAgcmV0dXJuIG9tRWxlbWVudC5sZW5ndGg7Ci0gICAgfQotCi0gICAgcHVibGljIE1haWwgZWNob01haWwoTWFpbCBtYWlsKSB7Ci0gICAgICAgIHJldHVybiBtYWlsOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgbXVsdGlBcnJheXMoU3RyaW5nIFtdIGEsIFN0cmluZyBiIFtdLCBTdHJpbmcgZCBbXSwgaW50IGMpIHsKLSAgICAgICAgcmV0dXJuIGEubGVuZ3RoICsgYi5sZW5ndGggKyBkLmxlbmd0aCArIGM7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB0ZXN0Qnl0ZUFycmF5KGJ5dGUgW10gdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcodmFsdWUpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ycGMvY29tcGxleC9Db21wbGV4RGF0YVR5cGVzQ29tcGxleERhdGFUeXBlc1NPQVAxMVRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ycGMvY29tcGxleC9Db21wbGV4RGF0YVR5cGVzQ29tcGxleERhdGFUeXBlc1NPQVAxMVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJkNTdmNy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvcnBjL2NvbXBsZXgvQ29tcGxleERhdGFUeXBlc0NvbXBsZXhEYXRhVHlwZXNTT0FQMTFUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MTMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBDb21wbGV4RGF0YVR5cGVzQ29tcGxleERhdGFUeXBlc1NPQVAxMVRlc3QuamF2YQotICoKLSAqIFRoaXMgZmlsZSB3YXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBXU0RMCi0gKiBieSB0aGUgQXBhY2hlIEF4aXMyIHZlcnNpb246IFNOQVBTSE9UIE1heSAzMCwgMjAwNyAoMTE6NTY6MDIgRURUKQotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucnBjLmNvbXBsZXg7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uYXR0YWNobWVudHMuQnl0ZUFycmF5RGF0YVNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLmF0dGFjaG1lbnRzLnV0aWxzLklPVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaW50ZWdyYXRpb24uVXRpbFNlcnZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmludGVncmF0aW9uLlV0aWxTZXJ2ZXJCYXNlZFRlc3RDYXNlOwotaW1wb3J0IG9yZy50ZW1wdXJpLmNvbXBsZXguZGF0YS5hcnJheXMueHNkLkFycmF5T2ZBcnJheU9mc3RyaW5nOwotaW1wb3J0IG9yZy50ZW1wdXJpLmNvbXBsZXguZGF0YS5hcnJheXMueHNkLkFycmF5T2ZOdWxsYWJsZU9mZGF0ZVRpbWU7Ci1pbXBvcnQgb3JnLnRlbXB1cmkuY29tcGxleC5kYXRhLmFycmF5cy54c2QuQXJyYXlPZk51bGxhYmxlT2ZkZWNpbWFsOwotaW1wb3J0IG9yZy50ZW1wdXJpLmNvbXBsZXguZGF0YS5hcnJheXMueHNkLkFycmF5T2ZQZXJzb247Ci1pbXBvcnQgb3JnLnRlbXB1cmkuY29tcGxleC5kYXRhLmFycmF5cy54c2QuQXJyYXlPZmFueVR5cGU7Ci1pbXBvcnQgb3JnLnRlbXB1cmkuY29tcGxleC5kYXRhLmFycmF5cy54c2QuQXJyYXlPZmludDsKLWltcG9ydCBvcmcudGVtcHVyaS5jb21wbGV4LmRhdGEuYXJyYXlzLnhzZC5BcnJheU9mc2hvcnQ7Ci1pbXBvcnQgb3JnLnRlbXB1cmkuY29tcGxleC5kYXRhLmFycmF5cy54c2QuQXJyYXlPZnN0cmluZzsKLWltcG9ydCBvcmcudGVtcHVyaS5jb21wbGV4LmRhdGEueHNkLio7Ci0KLWltcG9ydCBqYXZheC5hY3RpdmF0aW9uLkRhdGFIYW5kbGVyOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci1pbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7Ci1pbXBvcnQgamF2YS51dGlsLlRpbWVab25lOwotCi0KLQotcHVibGljIGNsYXNzIENvbXBsZXhEYXRhVHlwZXNDb21wbGV4RGF0YVR5cGVzU09BUDExVGVzdCBleHRlbmRzIFV0aWxTZXJ2ZXJCYXNlZFRlc3RDYXNlIHsKLQotIHByb3RlY3RlZCBFbmRwb2ludFJlZmVyZW5jZSB0YXJnZXRFUFI7Ci0gICAgcHJvdGVjdGVkIFFOYW1lIHNlcnZpY2VOYW1lID0gbmV3IFFOYW1lKCJDb21wbGV4RGF0YVR5cGVzIik7Ci0KLSAgICBwcm90ZWN0ZWQgQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZ3VyYXRpb247Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBmaW5pc2ggPSBmYWxzZTsKLSAgICBvcmcudGVtcHVyaS5jb21wbGV4LkNvbXBsZXhEYXRhVHlwZXNDb21wbGV4RGF0YVR5cGVzSHR0cFNvYXAxMUVuZHBvaW50U3R1YiBzdHViOwotCi0gICAgcHVibGljIENvbXBsZXhEYXRhVHlwZXNDb21wbGV4RGF0YVR5cGVzU09BUDExVGVzdCgpIHsKLSAgICAgICAgc3VwZXIoQ29tcGxleERhdGFUeXBlc0NvbXBsZXhEYXRhVHlwZXNTT0FQMTFUZXN0LmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIENvbXBsZXhEYXRhVHlwZXNDb21wbGV4RGF0YVR5cGVzU09BUDExVGVzdChTdHJpbmcgdGVzdE5hbWUpIHsKLSAgICAgICAgc3VwZXIodGVzdE5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgcmV0dXJuIGdldFRlc3RTZXR1cChuZXcgVGVzdFN1aXRlKENvbXBsZXhEYXRhVHlwZXNDb21wbGV4RGF0YVR5cGVzU09BUDExVGVzdC5jbGFzcykpOwotICAgIH0KLQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9ICJvcmcudGVtcHVyaS5jb21wbGV4LkNvbXBsZXhEYXRhVHlwZXMiOwotICAgICAgICBVdGlsU2VydmVyLnN0YXJ0KCk7Ci0gICAgICAgIEF4aXNTZXJ2aWNlICAgc2VydmljZSA9IEF4aXNTZXJ2aWNlLmNyZWF0ZVNlcnZpY2UoCi0gICAgICAgICAgICAgICAgY2xhc3NOYW1lLCBVdGlsU2VydmVyLmdldENvbmZpZ3VyYXRpb25Db250ZXh0KCkuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKSk7Ci0gICAgICAgIHNlcnZpY2Uuc2V0RWxlbWVudEZvcm1EZWZhdWx0KHRydWUpOwotICAgICAgICBzZXJ2aWNlLnNldE5hbWUoIkNvbXBsZXhEYXRhVHlwZXMiKTsKLSAgICAgICAgc2VydmljZS5zZXRDbGFzc0xvYWRlcihUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpKTsKLQotICAgICAgICBVdGlsU2VydmVyLmRlcGxveVNlcnZpY2Uoc2VydmljZSk7Ci0gICAgICAgICB0YXJnZXRFUFIgPQotICAgICAgICAgICAgICAgIG5ldyBFbmRwb2ludFJlZmVyZW5jZSgiaHR0cDovLzEyNy4wLjAuMToiCi0gICAgICAgICAgICAgICAgICAgICAgICArIChVdGlsU2VydmVyLlRFU1RJTkdfUE9SVCkKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIi9heGlzMi9zZXJ2aWNlcy9Db21wbGV4RGF0YVR5cGVzIik7Ci0gICAgICAgIHN0dWIgID0gbmV3IG9yZy50ZW1wdXJpLmNvbXBsZXguQ29tcGxleERhdGFUeXBlc0NvbXBsZXhEYXRhVHlwZXNIdHRwU29hcDExRW5kcG9pbnRTdHViKG51bGwsdGFyZ2V0RVBSLmdldEFkZHJlc3MoKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgVXRpbFNlcnZlci51bkRlcGxveVNlcnZpY2Uoc2VydmljZU5hbWUpOwotICAgICAgICBVdGlsU2VydmVyLnVuRGVwbG95Q2xpZW50U2VydmljZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RyZXRBcnJheUludDFEKCkgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24gewotCi0KLSAgICAgICAgYXNzZXJ0TnVsbChzdHViLnJldEFycmF5SW50MUQobnVsbCkpOwotICAgICAgICBzdHViLl9nZXRTZXJ2aWNlQ2xpZW50KCkuY2xlYW51cFRyYW5zcG9ydCgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHN0dWIucmV0QXJyYXlJbnQxRChuZXcgQXJyYXlPZmludCgpKSk7Ci0gICAgICAgIHN0dWIuX2dldFNlcnZpY2VDbGllbnQoKS5jbGVhbnVwVHJhbnNwb3J0KCk7Ci0gICAgICAgIEFycmF5T2ZpbnQgaW5wdXQgPSBuZXcgQXJyYXlPZmludCgpOwotICAgICAgICBpbnB1dC5zZXRfaW50KG5ldyBpbnRbXXswLCAxLCAyfSk7Ci0gICAgICAgIEFycmF5T2ZpbnQgcmV0ID0gc3R1Yi5yZXRBcnJheUludDFEKGlucHV0KTsKLSAgICAgICAgc3R1Yi5fZ2V0U2VydmljZUNsaWVudCgpLmNsZWFudXBUcmFuc3BvcnQoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXQpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldC5nZXRfaW50KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0LmdldF9pbnQoKS5sZW5ndGgsIDMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEF1dG8gZ2VuZXJhdGVkIHRlc3QgbWV0aG9kCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdHJldFN0cnVjdFNOU0FTKCkgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24gewotICAgICAgICBhc3NlcnROdWxsKHN0dWIucmV0U3RydWN0U05TQVMobnVsbCkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHN0dWIucmV0U3RydWN0U05TQVMobmV3IEdyb3VwKCkpKTsKLSAgICAgICAgR3JvdXAgaW5wdXQgPSBuZXcgR3JvdXAoKTsKLSAgICAgICAgaW5wdXQuc2V0TmFtZSgieHl6Iik7Ci0gICAgICAgIGlucHV0LnNldE1lbWJlcnMobmV3IEFycmF5T2ZQZXJzb24oKSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc3R1Yi5yZXRTdHJ1Y3RTTlNBUyhpbnB1dCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEF1dG8gZ2VuZXJhdGVkIHRlc3QgbWV0aG9kCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdHJldEFycmF5RGF0ZVRpbWUxRCgpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uIHsKLQotICAgICAgICBhc3NlcnROdWxsKHN0dWIucmV0QXJyYXlEYXRlVGltZTFEKG51bGwpKTsKLQotICAgICAgICBhc3NlcnROb3ROdWxsKHN0dWIucmV0QXJyYXlEYXRlVGltZTFEKG5ldyBBcnJheU9mTnVsbGFibGVPZmRhdGVUaW1lKCkpKTsKLQotICAgICAgICBBcnJheU9mTnVsbGFibGVPZmRhdGVUaW1lIGlucHV0ID0gbmV3IEFycmF5T2ZOdWxsYWJsZU9mZGF0ZVRpbWUoKTsKLSAgICAgICAgaW5wdXQuc2V0RGF0ZVRpbWUobmV3IENhbGVuZGFyW117Q2FsZW5kYXIuZ2V0SW5zdGFuY2UoKSwgQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKX0pOwotICAgICAgICBhc3NlcnROb3ROdWxsKHN0dWIucmV0QXJyYXlEYXRlVGltZTFEKGlucHV0KSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXV0byBnZW5lcmF0ZWQgdGVzdCBtZXRob2QKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0cmV0QXJyYXlTdHJpbmcyRCgpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uIHsKLQotICAgICAgICBhc3NlcnROdWxsKHN0dWIucmV0QXJyYXlTdHJpbmcyRChudWxsKSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc3R1Yi5yZXRBcnJheVN0cmluZzJEKG5ldyBBcnJheU9mQXJyYXlPZnN0cmluZygpKSk7Ci0KLSAgICAgICAgQXJyYXlPZkFycmF5T2ZzdHJpbmcgaW5wdXQgPSBuZXcgQXJyYXlPZkFycmF5T2ZzdHJpbmcoKTsKLSAgICAgICAgQXJyYXlPZnN0cmluZyBhMiA9IG5ldyBBcnJheU9mc3RyaW5nKCk7Ci0gICAgICAgIEFycmF5T2ZzdHJpbmcgYTEgPSBuZXcgQXJyYXlPZnN0cmluZygpOwotICAgICAgICBhMS5zZXRTdHJpbmcobmV3IFN0cmluZ1tdeyJmb28iLCAiYmFyIn0pOwotICAgICAgICBpbnB1dC5zZXRBcnJheU9mc3RyaW5nKG5ldyBBcnJheU9mc3RyaW5nW117YTEsIGEyfSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc3R1Yi5yZXRBcnJheVN0cmluZzJEKGlucHV0KSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXV0byBnZW5lcmF0ZWQgdGVzdCBtZXRob2QKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0cmV0QXJyYXlEZWNpbWFsMUQoKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgYXNzZXJ0TnVsbChzdHViLnJldEFycmF5RGVjaW1hbDFEKG51bGwpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzdHViLnJldEFycmF5RGVjaW1hbDFEKG5ldyBBcnJheU9mTnVsbGFibGVPZmRlY2ltYWwoKSkpOwotCi0gICAgICAgIEFycmF5T2ZOdWxsYWJsZU9mZGVjaW1hbCBpbnB1dCA9IG5ldyBBcnJheU9mTnVsbGFibGVPZmRlY2ltYWwoKTsKLSAgICAgICAgaW5wdXQuc2V0RGVjaW1hbChuZXcgQmlnRGVjaW1hbFtde25ldyBCaWdEZWNpbWFsKDEpLCBuZXcgQmlnRGVjaW1hbCgyKX0pOwotICAgICAgICBhc3NlcnROb3ROdWxsKHN0dWIucmV0QXJyYXlEZWNpbWFsMUQoaW5wdXQpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBdXRvIGdlbmVyYXRlZCB0ZXN0IG1ldGhvZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RyZXRTdHJ1Y3RTTlNBKCkgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24gewotCi0gICAgICAgIGFzc2VydE51bGwoc3R1Yi5yZXRTdHJ1Y3RTTlNBKG51bGwpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzdHViLnJldFN0cnVjdFNOU0EobmV3IEVtcGxveWVlKCkpKTsKLSAgICAgICAgRW1wbG95ZWUgaW5wdXQgPSBuZXcgRW1wbG95ZWUoKTsKLSAgICAgICAgaW5wdXQuc2V0Sm9iSUQoMzQpOwotICAgICAgICBpbnB1dC5zZXRCYXNlRGV0YWlscyhuZXcgUGVyc29uKCkpOwotICAgICAgICBpbnB1dC5zZXROdW1iZXJzKG5ldyBBcnJheU9mc2hvcnQoKSk7Ci0gICAgICAgIGlucHV0LnNldEhpcmVEYXRlKENhbGVuZGFyLmdldEluc3RhbmNlKCkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHN0dWIucmV0U3RydWN0U05TQShpbnB1dCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEF1dG8gZ2VuZXJhdGVkIHRlc3QgbWV0aG9kCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdHJldEFycmF5QW55VHlwZTFEKCkgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24gewotCi0gICAgICAgIGFzc2VydE51bGwoc3R1Yi5yZXRBcnJheUFueVR5cGUxRChudWxsKSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc3R1Yi5yZXRBcnJheUFueVR5cGUxRChuZXcgQXJyYXlPZmFueVR5cGUoKSkpOwotCi0gICAgICAgIEFycmF5T2ZhbnlUeXBlIGlucHV0ID0gbmV3IEFycmF5T2ZhbnlUeXBlKCk7Ci0KLSAgICAgICAgT01GYWN0b3J5IGZhY3RvcnkgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKTsKLSAgICAgICAgLy8gbGV0cyBjcmVhdGUgdGhlIG5hbWVzcGFjZSBvYmplY3Qgb2YgdGhlIEFydGljbGUgZWxlbWVudAotICAgICAgICBPTU5hbWVzcGFjZSBucyA9IGZhY3RvcnkuY3JlYXRlT01OYW1lc3BhY2UoImh0dHA6Ly93d3cuc2VydmVyc2lkZS5jb20vYXJ0aWNsZXMvaW50cm9kdWNpbmdBeGlvbSIsICJhcnRpY2xlIik7Ci0gICAgICAgIC8vIG5vdyBjcmVhdGUgdGhlIEFydGljbGUgZWxlbWVudCB3aXRoIHRoZSBhYm92ZSBuYW1lc3BhY2UKLSAgICAgICAgT01FbGVtZW50IGFydGljbGVFbGVtZW50ID0gZmFjdG9yeS5jcmVhdGVPTUVsZW1lbnQoIkFydGljbGUiLCBucyk7Ci0KLSAgICAgICAvLyBjb21tZW50IG91dCB0ZXN0IGNhc2Ugc2luY2Ugbm93IGFkYiB1c2VzIGFuIG9iamVjdCB0byByZXByZXNlbnQgYW4gYW55IHR5cGUKLSAgICAgICAvLyBpbnB1dC5zZXRBbnlUeXBlKG5ldyBPTUVsZW1lbnRbXXthcnRpY2xlRWxlbWVudH0pOwotICAgICAgIC8vIGFzc2VydE5vdE51bGwoc3R1Yi5yZXRBcnJheUFueVR5cGUxRChpbnB1dCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEF1dG8gZ2VuZXJhdGVkIHRlc3QgbWV0aG9kCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdHJldERlcml2ZWRDbGFzczIoKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgYXNzZXJ0TnVsbChzdHViLnJldERlcml2ZWRDbGFzczIobnVsbCkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHN0dWIucmV0RGVyaXZlZENsYXNzMihuZXcgVGFibGUoKSkpOwotCi0gICAgICAgIFRhYmxlIGlucHV0ID0gbmV3IFRhYmxlKCk7Ci0gICAgICAgIGlucHV0LnNldFNlYXRpbmdDYXBhY2l0eSg1MCk7Ci0gICAgICAgIGlucHV0LnNldENvbG9yKCJzZGZzZCIpOwotICAgICAgICBpbnB1dC5zZXRQcmljZSg0NSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc3R1Yi5yZXREZXJpdmVkQ2xhc3MyKGlucHV0KSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXV0byBnZW5lcmF0ZWQgdGVzdCBtZXRob2QKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0cmV0U3RydWN0U04oKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgYXNzZXJ0TnVsbChzdHViLnJldFN0cnVjdFNOKG51bGwpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzdHViLnJldFN0cnVjdFNOKG5ldyBQZXJzb24oKSkpOwotCi0gICAgICAgIFBlcnNvbiBpbnB1dCA9IG5ldyBQZXJzb24oKTsKLSAgICAgICAgaW5wdXQuc2V0QWdlKDIzKTsKLSAgICAgICAgaW5wdXQuc2V0SWQoMzQ1KTsKLSAgICAgICAgaW5wdXQuc2V0TWFsZShmYWxzZSk7Ci0gICAgICAgIGlucHV0LnNldE5hbWUoIldoeT8iKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzdHViLnJldFN0cnVjdFNOKGlucHV0KSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXV0byBnZW5lcmF0ZWQgdGVzdCBtZXRob2QKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0cmV0QXJyYXkxRFNOKCkgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24gewotCi0gICAgICAgIGFzc2VydE51bGwoc3R1Yi5yZXRBcnJheTFEU04obnVsbCkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHN0dWIucmV0QXJyYXkxRFNOKG5ldyBBcnJheU9mUGVyc29uKCkpKTsKLQotICAgICAgICBBcnJheU9mUGVyc29uIGlucHV0ID0gbmV3IEFycmF5T2ZQZXJzb24oKTsKLSAgICAgICAgUGVyc29uIHAxID0gbmV3IFBlcnNvbigpOwotICAgICAgICBwMS5zZXRBZ2UoMzQpOwotICAgICAgICBwMS5zZXRJZCgyMzQ1KTsKLSAgICAgICAgcDEuc2V0TWFsZSh0cnVlKTsKLSAgICAgICAgcDEuc2V0TmFtZSgiSEpISkgiKTsKLSAgICAgICAgaW5wdXQuc2V0UGVyc29uKG5ldyBQZXJzb25bXXtwMX0pOwotICAgICAgICBhc3NlcnROb3ROdWxsKHN0dWIucmV0QXJyYXkxRFNOKGlucHV0KSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXV0byBnZW5lcmF0ZWQgdGVzdCBtZXRob2QKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0cmV0RGVyaXZlZENsYXNzKCkgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24gewotCi0KLSAgICAgICAgYXNzZXJ0TnVsbChzdHViLnJldERlcml2ZWRDbGFzcyhudWxsKSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc3R1Yi5yZXREZXJpdmVkQ2xhc3MobmV3IEZ1cm5pdHVyZSgpKSk7Ci0KLSAgICAgICAgRnVybml0dXJlIGlucHV0ID0gbmV3IEZ1cm5pdHVyZSgpOwotICAgICAgICBpbnB1dC5zZXRDb2xvcigid2hpdGUiKTsKLSAgICAgICAgaW5wdXQuc2V0UHJpY2UoNjcpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHN0dWIucmV0RGVyaXZlZENsYXNzKGlucHV0KSk7Ci0gICAgICAgIGFzc2VydFRydWUoaW5wdXQgaW5zdGFuY2VvZiBGdXJuaXR1cmUpOwotCi0gICAgICAgIGlucHV0ID0gbmV3IFRhYmxlKCk7Ci0gICAgICAgIGlucHV0LnNldENvbG9yKCJibGFjayIpOwotICAgICAgICBpbnB1dC5zZXRQcmljZSg4OSk7Ci0gICAgICAgICgoVGFibGUpIGlucHV0KS5zZXRTZWF0aW5nQ2FwYWNpdHkoMTAwKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShpbnB1dCBpbnN0YW5jZW9mIFRhYmxlKTsKLSAgICB9Ci0KLS8vIFRPRE86IFdlIG5lZWQgdG8gZmlndXJlIG91dCBob3cgdG8gZGVhbCB3aXRoIEVOVU0ncy4gUGxlYXNlIGRvbid0IHJlbW92ZSB0aGlzIHNlY3Rpb24uICAgIAotLy8gICAgLyoqCi0vLyAgICAgKiBBdXRvIGdlbmVyYXRlZCB0ZXN0IG1ldGhvZAotLy8gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdHJldEVudW1JbnQoKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbiB7Ci0KLQotICAgICAgICBhc3NlcnROdWxsKHN0dWIucmV0RW51bUludChudWxsKSk7Ci0gICAgICAgIFN0cmluZyBpbnB1dCA9ICIiOwotICAgICAgICBhc3NlcnROb3ROdWxsKHN0dWIucmV0RW51bUludChuZXcgU3RyaW5nKCkpKTsKLSAgICB9Ci0KLS8vIFRPRE86IFdlIG5lZWQgdG8gZmlndXJlIG91dCBob3cgdG8gZGVhbCB3aXRoIEVOVU0ncy4gUGxlYXNlIGRvbid0IHJlbW92ZSB0aGlzIHNlY3Rpb24uCi0vLyAgICAvKioKLS8vICAgICAqIEF1dG8gZ2VuZXJhdGVkIHRlc3QgbWV0aG9kCi0vLyAgICAgKi8KLS8vICAgIHB1YmxpYyB2b2lkIHRlc3RyZXRFbnVtU3RyaW5nKCkgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24gewotLy8KLS8vICAgICAgICBvcmcudGVtcHVyaS5jb21wbGV4LnhzZC5Db21wbGV4RGF0YVR5cGVzQ29tcGxleERhdGFUeXBlc1NPQVAxMVBvcnRfaHR0cFN0dWIgc3R1YiA9Ci0vLyAgICAgICAgICAgICAgICBuZXcgb3JnLnRlbXB1cmkuY29tcGxleC54c2QuQ29tcGxleERhdGFUeXBlc0NvbXBsZXhEYXRhVHlwZXNTT0FQMTFQb3J0X2h0dHBTdHViKCk7Ci0vLwotLy8gICAgICAgIGFzc2VydE51bGwoc3R1Yi5yZXRFbnVtU3RyaW5nKG51bGwpKTsKLS8vICAgICAgICBCaXRNYXNrIGlucHV0ID0gbmV3IEJpdE1hc2soKTsKLS8vICAgICAgICBhc3NlcnROdWxsKHN0dWIucmV0RW51bVN0cmluZyhuZXcgQml0TWFzaygpKSk7Ci0vLyAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIEF1dG8gZ2VuZXJhdGVkIHRlc3QgbWV0aG9kCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdHJldFN0cnVjdFMxKCkgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24gewotCi0gICAgICAgIGFzc2VydE51bGwoc3R1Yi5yZXRTdHJ1Y3RTMShudWxsKSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc3R1Yi5yZXRTdHJ1Y3RTMShuZXcgTmFtZSgpKSk7Ci0gICAgICAgIE5hbWUgaW5wdXQgPSBuZXcgTmFtZSgpOwotICAgICAgICBpbnB1dC5zZXROYW1lKCJld3J0ZXJ0eSIpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHN0dWIucmV0U3RydWN0UzEoaW5wdXQpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBdXRvIGdlbmVyYXRlZCB0ZXN0IG1ldGhvZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RyZXRBcnJheVN0cmluZzFEKCkgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24gewotCi0KLSAgICAgICAgYXNzZXJ0TnVsbChzdHViLnJldEFycmF5U3RyaW5nMUQobnVsbCkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHN0dWIucmV0QXJyYXlTdHJpbmcxRChuZXcgQXJyYXlPZnN0cmluZygpKSk7Ci0gICAgICAgIEFycmF5T2ZzdHJpbmcgaW5wdXQgPSBuZXcgQXJyYXlPZnN0cmluZygpOwotICAgICAgICBpbnB1dC5zZXRTdHJpbmcobmV3IFN0cmluZ1tdeyJmb28iLCAiYmFyIn0pOwotICAgICAgICBBcnJheU9mc3RyaW5nIHJldCA9IHN0dWIucmV0QXJyYXlTdHJpbmcxRChpbnB1dCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0KTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXQuZ2V0U3RyaW5nKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0LmdldFN0cmluZygpLmxlbmd0aCwgMik7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBBdXRvIGdlbmVyYXRlZCB0ZXN0IG1ldGhvZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RyZXRTaW5nbGUoKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbiB7Ci0gICAgICAgIGZsb2F0IHJldCA9IHN0dWIucmV0U2luZ2xlKDQzLjBmKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXQ9PTQzLjBmKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFNpbXBsZURhdGVGb3JtYXQgenVsdSA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KCJ5eXl5LU1NLWRkJ1QnSEg6bW06c3MuU1NTJ1onIik7Ci0KLSAgICAvKioKLSAgICAgKiBBdXRvIGdlbmVyYXRlZCB0ZXN0IG1ldGhvZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RyZXREYXRlVGltZSgpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uIHsKLSAgICAgICAgenVsdS5zZXRUaW1lWm9uZShUaW1lWm9uZS5nZXRUaW1lWm9uZSgiR01UIikpOwotICAgICAgICBDYWxlbmRhciBpbnB1dCA9IENhbGVuZGFyLmdldEluc3RhbmNlKCk7Ci0gICAgICAgIENhbGVuZGFyIHJldCA9IHN0dWIucmV0RGF0ZVRpbWUoaW5wdXQpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyh6dWx1LmZvcm1hdChpbnB1dC5nZXRUaW1lKCkpLCB6dWx1LmZvcm1hdChyZXQuZ2V0VGltZSgpKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXV0byBnZW5lcmF0ZWQgdGVzdCBtZXRob2QKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0cmV0R3VpZCgpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uIHsKLQotICAgICAgICBTdHJpbmcgaW5wdXQgPSAiMTIzNDUiOwotICAgICAgICBTdHJpbmcgcmV0ID0gc3R1Yi5yZXRHdWlkKGlucHV0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldCwgaW5wdXQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEF1dG8gZ2VuZXJhdGVkIHRlc3QgbWV0aG9kCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdHJldEJ5dGVBcnJheSgpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uIHsKLQotCi0gICAgICAgIGJ5dGVbXSBpbnB1dCA9IG5ldyBieXRlW117KGJ5dGUpIDB4REUsIChieXRlKSAweEFELCAoYnl0ZSkgMHhCRSwgKGJ5dGUpIDB4RUZ9OwotICAgICAgICBEYXRhSGFuZGxlciByZXQgPSBzdHViLnJldEJ5dGVBcnJheShuZXcgRGF0YUhhbmRsZXIobmV3IEJ5dGVBcnJheURhdGFTb3VyY2UoaW5wdXQpKSk7Ci0gICAgICAgIGJ5dGVbXSBieXRlcyA9IElPVXRpbHMuZ2V0U3RyZWFtQXNCeXRlQXJyYXkocmV0LmdldElucHV0U3RyZWFtKCkpOwotICAgICAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoYnl0ZXMsIGlucHV0KSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXV0byBnZW5lcmF0ZWQgdGVzdCBtZXRob2QKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0cmV0VXJpKCkgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24gewotCi0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzdHViLnJldFVyaSgiMTI0IikpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEF1dG8gZ2VuZXJhdGVkIHRlc3QgbWV0aG9kCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdHJldFFOYW1lKCkgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24gewotCi0KLSAgICAgICAgLy9GSVhNRTogV2h5IGlzIFFOYW1lIGJlaW5nIG1hcHBlZCB0byBPTUVsZW1lbnQ/Ci0gICAgICAgIGFzc2VydE51bGwoc3R1Yi5yZXRRTmFtZShudWxsKSk7Ci0gICAgfQotCi0vLyBUT0RPOiBGSVhNRTogTmVlZCB0byBmaWd1cmUgb3V0IGhvdyB0byBkbyBlbnVtJ3MuIFBsZWFzZSBkb24ndCByZW1vdmUgdGhpcyBmb2xsb3dpbmcgc2VjdGlvbgotLy8gICAgLyoqCi0vLyAgICAgKiBBdXRvIGdlbmVyYXRlZCB0ZXN0IG1ldGhvZAotLy8gICAgICovCi0vLyAgICBwdWJsaWMgdm9pZCB0ZXN0cmV0RW51bUludCgpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uIHsKLS8vCi0vLyAgICAgICAgb3JnLnRlbXB1cmkuY29tcGxleC54c2QuQ29tcGxleERhdGFUeXBlc0NvbXBsZXhEYXRhVHlwZXNTT0FQMTFQb3J0X2h0dHBTdHViIHN0dWIgPQotLy8gICAgICAgICAgICAgICAgbmV3IG9yZy50ZW1wdXJpLmNvbXBsZXgueHNkLkNvbXBsZXhEYXRhVHlwZXNDb21wbGV4RGF0YVR5cGVzU09BUDExUG9ydF9odHRwU3R1YigpOwotLy8KLS8vICAgICAgICBvcmcudGVtcHVyaS5jb21wbGV4LnhzZC54c2QuUmV0RW51bUludCByZXRFbnVtSW50MTI2ID0KLS8vICAgICAgICAgICAgICAgIChvcmcudGVtcHVyaS5jb21wbGV4LnhzZC54c2QuUmV0RW51bUludCkgZ2V0VGVzdE9iamVjdChvcmcudGVtcHVyaS5jb21wbGV4LnhzZC54c2QuUmV0RW51bUludC5jbGFzcyk7Ci0vLyAgICAgICAgLy8gdG9kbyBGaWxsIGluIHRoZSByZXRFbnVtSW50MTI2IGhlcmUKLS8vCi0vLyAgICAgICAgYXNzZXJ0Tm90TnVsbChzdHViLnJldEVudW1JbnQoCi0vLyAgICAgICAgICAgICAgICBnZXRQYXJhbTAocmV0RW51bUludDEyNikKLS8vICAgICAgICApKTsKLS8vCi0vLwotLy8gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdHJldExvbmcoKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbiB7Ci0gICAgICAgIGxvbmcgcmV0ID0gc3R1Yi5yZXRMb25nKDM0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDM0LCByZXQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEF1dG8gZ2VuZXJhdGVkIHRlc3QgbWV0aG9kCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdHJldFVTaG9ydCgpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uIHsKLSAgICAgICAgaW50IHJldCA9IHN0dWIucmV0VVNob3J0KDM0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDM0LCByZXQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEF1dG8gZ2VuZXJhdGVkIHRlc3QgbWV0aG9kCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdHJldFVJbnQoKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbiB7Ci0gICAgICAgIGxvbmcgcmV0ID0gc3R1Yi5yZXRVSW50KDM0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDM0LCByZXQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEF1dG8gZ2VuZXJhdGVkIHRlc3QgbWV0aG9kCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdHJldEJ5dGUoKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbiB7Ci0gICAgICAgIHNob3J0IHJldCA9IHN0dWIucmV0Qnl0ZSgoc2hvcnQpMzQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoKHNob3J0KTM0LCByZXQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEF1dG8gZ2VuZXJhdGVkIHRlc3QgbWV0aG9kCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdHJldFNCeXRlKCkgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24gewotICAgICAgICBieXRlIHJldCA9IHN0dWIucmV0U0J5dGUoKGJ5dGUpMzQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoKGJ5dGUpMzQsIHJldCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXV0byBnZW5lcmF0ZWQgdGVzdCBtZXRob2QKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0cmV0U2hvcnQoKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbiB7Ci0gICAgICAgIHNob3J0IHJldCA9IHN0dWIucmV0U2hvcnQoKHNob3J0KTM0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKChzaG9ydCkzNCwgcmV0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBdXRvIGdlbmVyYXRlZCB0ZXN0IG1ldGhvZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RyZXRPYmplY3QoKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgT01GYWN0b3J5IGZhY3RvcnkgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKTsKLSAgICAgICAgLy8gbGV0cyBjcmVhdGUgdGhlIG5hbWVzcGFjZSBvYmplY3Qgb2YgdGhlIEFydGljbGUgZWxlbWVudAotICAgICAgICBPTU5hbWVzcGFjZSBucyA9IGZhY3RvcnkuY3JlYXRlT01OYW1lc3BhY2UoImh0dHA6Ly93d3cuc2VydmVyc2lkZS5jb20vYXJ0aWNsZXMvaW50cm9kdWNpbmdBeGlvbSIsICJhcnRpY2xlIik7Ci0gICAgICAgIC8vIG5vdyBjcmVhdGUgdGhlIEFydGljbGUgZWxlbWVudCB3aXRoIHRoZSBhYm92ZSBuYW1lc3BhY2UKLSAgICAgICAgT01FbGVtZW50IGFydGljbGVFbGVtZW50ID0gZmFjdG9yeS5jcmVhdGVPTUVsZW1lbnQoIkFydGljbGUiLCBucyk7Ci0KLSAgICAgICAgLy8gY29tbWVudCBvdXQgdGhpcyB0ZXN0IGNhc2Ugc2luY2UgYWRiIG5vdyB1c2VzIGFuIG9iamVjdCB0byByZXByZXNlbnRzIHRoZSBhbnkgdHlwZQotICAgICAgICAvLyBPTUVsZW1lbnQgcmV0ID0gc3R1Yi5yZXRPYmplY3QoYXJ0aWNsZUVsZW1lbnQpOwotICAgICAgICAvLyBhc3NlcnROb3ROdWxsKHJldCk7Ci0gICAgICAgIC8vIGFzc2VydEVxdWFscyhyZXQudG9TdHJpbmcoKSwgYXJ0aWNsZUVsZW1lbnQudG9TdHJpbmcoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXV0byBnZW5lcmF0ZWQgdGVzdCBtZXRob2QKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0cmV0RmxvYXQoKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgZmxvYXQgcmV0ID0gc3R1Yi5yZXRGbG9hdCgoZmxvYXQpMzQpOwotICAgICAgICBhc3NlcnRUcnVlKHJldD09MzQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEF1dG8gZ2VuZXJhdGVkIHRlc3QgbWV0aG9kCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdHJldERvdWJsZSgpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uIHsKLQotICAgICAgICBkb3VibGUgcmV0ID0gc3R1Yi5yZXREb3VibGUoKGRvdWJsZSkzNCk7Ci0gICAgICAgIGFzc2VydFRydWUocmV0PT0zNCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXV0byBnZW5lcmF0ZWQgdGVzdCBtZXRob2QKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0cmV0Qm9vbCgpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uIHsKLQotICAgICAgICBib29sZWFuIHJldCA9IHN0dWIucmV0Qm9vbCh0cnVlKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEF1dG8gZ2VuZXJhdGVkIHRlc3QgbWV0aG9kCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdHJldERlY2ltYWwoKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgQmlnRGVjaW1hbCBpbnB1dCA9IG5ldyBCaWdEZWNpbWFsKDEyMzM0KTsKLSAgICAgICAgQmlnRGVjaW1hbCByZXQgPSBzdHViLnJldERlY2ltYWwoaW5wdXQpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXQsIGlucHV0KTsKLSAgICB9Ci0KLS8vIFRPRE86IEZJWE1FOiBOZWVkIHRvIGZpZ3VyZSBvdXQgaG93IHRvIGRvIGVudW0ncy4gUGxlYXNlIGRvbid0IHJlbW92ZSB0aGlzIGZvbGxvd2luZyBzZWN0aW9uCi0vLyAgICAvKioKLS8vICAgICAqIEF1dG8gZ2VuZXJhdGVkIHRlc3QgbWV0aG9kCi0vLyAgICAgKi8KLS8vICAgIHB1YmxpYyB2b2lkIHRlc3RyZXRFbnVtU3RyaW5nKCkgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24gewotLy8KLS8vICAgICAgICBvcmcudGVtcHVyaS5jb21wbGV4LnhzZC5Db21wbGV4RGF0YVR5cGVzQ29tcGxleERhdGFUeXBlc1NPQVAxMVBvcnRfaHR0cFN0dWIgc3R1YiA9Ci0vLyAgICAgICAgICAgICAgICBuZXcgb3JnLnRlbXB1cmkuY29tcGxleC54c2QuQ29tcGxleERhdGFUeXBlc0NvbXBsZXhEYXRhVHlwZXNTT0FQMTFQb3J0X2h0dHBTdHViKCk7Ci0vLwotLy8gICAgICAgIG9yZy50ZW1wdXJpLmNvbXBsZXgueHNkLnhzZC5SZXRFbnVtU3RyaW5nIHJldEVudW1TdHJpbmcxOTggPQotLy8gICAgICAgICAgICAgICAgKG9yZy50ZW1wdXJpLmNvbXBsZXgueHNkLnhzZC5SZXRFbnVtU3RyaW5nKSBnZXRUZXN0T2JqZWN0KG9yZy50ZW1wdXJpLmNvbXBsZXgueHNkLnhzZC5SZXRFbnVtU3RyaW5nLmNsYXNzKTsKLS8vICAgICAgICAvLyB0b2RvIEZpbGwgaW4gdGhlIHJldEVudW1TdHJpbmcxOTggaGVyZQotLy8KLS8vICAgICAgICBhc3NlcnROb3ROdWxsKHN0dWIucmV0RW51bVN0cmluZygKLS8vICAgICAgICAgICAgICAgIGdldFBhcmFtMChyZXRFbnVtU3RyaW5nMTk4KQotLy8gICAgICAgICkpOwotLy8KLS8vCi0vLyAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBdXRvIGdlbmVyYXRlZCB0ZXN0IG1ldGhvZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RyZXRJbnQoKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbiB7Ci0gICAgICAgIGludCByZXQgPSBzdHViLnJldEludCgoaW50KTM0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKChpbnQpMzQsIHJldCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXV0byBnZW5lcmF0ZWQgdGVzdCBtZXRob2QKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0cmV0SW50cygpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uIHsKLQotICAgICAgICBpbnRbXSBpbnB1dCA9IG5ldyBpbnRbXXszNCwgNDV9OwotICAgICAgICBpbnQgcmV0W10gPSBzdHViLnJldEludHMoaW5wdXQpOwotICAgICAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoaW5wdXQsIHJldCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEF1dG8gZ2VuZXJhdGVkIHRlc3QgbWV0aG9kCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdHJldENoYXIoKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgaW50IHJldCA9IHN0dWIucmV0Q2hhcigzNCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygzNCwgcmV0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBdXRvIGdlbmVyYXRlZCB0ZXN0IG1ldGhvZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RyZXRTdHJpbmcoKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgU3RyaW5nIGlucHV0ID0gIkFicmFjYWRhYnJhIjsKLSAgICAgICAgU3RyaW5nIHJldCA9IHN0dWIucmV0U3RyaW5nKGlucHV0KTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoaW5wdXQsIHJldCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXV0byBnZW5lcmF0ZWQgdGVzdCBtZXRob2QKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0cmV0U3RyaW5ncygpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uIHsKLQotU3RyaW5nW10gcmV0OwotICAgICAgICBTdHJpbmdbXSBpbnB1dCA9IG5ldyBTdHJpbmdbXXsiQWJyYWNhZGFicmEifTsKLSAgICAgICAgcmV0ID0gc3R1Yi5yZXRTdHJpbmdzKG51bGwpOwotICAgICAgICBhc3NlcnROdWxsKHJldCk7Ci0gICAgICAgIHJldCA9IHN0dWIucmV0U3RyaW5ncyhpbnB1dCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGlucHV0LCByZXQpKTsKLSAgICAgICAgaW5wdXQgPSBuZXcgU3RyaW5nW117IkFicmFjYWRhYnJhIiwgbnVsbCwgImFiYyJ9OwotICAgICAgICByZXQgPSBzdHViLnJldFN0cmluZ3MoaW5wdXQpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldCk7Ci0gICAgICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhpbnB1dCwgcmV0KSk7Ci0KLSAgICAgICAgaW5wdXQgPSBuZXcgU3RyaW5nW117fTsKLSAgICAgICAgcmV0ID0gc3R1Yi5yZXRTdHJpbmdzKGlucHV0KTsKLSAgICAgICAgYXNzZXJ0TnVsbChyZXQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEF1dG8gZ2VuZXJhdGVkIHRlc3QgbWV0aG9kCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdHJldFVMb25nKCkgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24gewotCi0gICAgICAgIEJpZ0ludGVnZXIgaW5wdXQgPSBuZXcgQmlnSW50ZWdlcigiMzQiKTsKLSAgICAgICAgQmlnSW50ZWdlciByZXQgPSBzdHViLnJldFVMb25nKGlucHV0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGlucHV0LCByZXQpOwotICAgIH0KLX0KLSAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvcnBjL2NvbXBsZXgvQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmVUZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvcnBjL2NvbXBsZXgvQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzNTRmYWUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JwYy9jb21wbGV4L0NvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjU4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5ycGMuY29tcGxleDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5hdHRhY2htZW50cy5CeXRlQXJyYXlEYXRhU291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uYXR0YWNobWVudHMudXRpbHMuSU9VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01OYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5QYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5qYXZhMndzZGwuSmF2YTJXU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaW50ZWdyYXRpb24uVXRpbFNlcnZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmludGVncmF0aW9uLlV0aWxTZXJ2ZXJCYXNlZFRlc3RDYXNlOwotaW1wb3J0IG9yZy50ZW1wdXJpLmNvbXBsZXguQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmVTdHViOwotCi1pbXBvcnQgamF2YXguYWN0aXZhdGlvbi5EYXRhSGFuZGxlcjsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOwotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOwotaW1wb3J0IGphdmEudXRpbC5UaW1lWm9uZTsKLQotLyoKLSAqICBDb21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZVRlc3QgSnVuaXQgdGVzdCBjYXNlCi0qLwotCi1wdWJsaWMgY2xhc3MgQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmVUZXN0IGV4dGVuZHMKLSAgICAgICAgVXRpbFNlcnZlckJhc2VkVGVzdENhc2UgewotCi0gICAgcHJvdGVjdGVkIFFOYW1lIHNlcnZpY2VOYW1lID0gbmV3IFFOYW1lKCJDb21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZSIpOwotICAgIHByb3RlY3RlZCBBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlndXJhdGlvbjsKLSAgICBwcm90ZWN0ZWQgRW5kcG9pbnRSZWZlcmVuY2UgdGFyZ2V0RVBSOwotICAgIENvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlU3R1YiBzdHViOwotCi0gICAgcHVibGljIENvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlVGVzdCgpIHsKLSAgICAgICAgc3VwZXIoQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmVUZXN0LmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIENvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlVGVzdChTdHJpbmcgdGVzdE5hbWUpIHsKLSAgICAgICAgc3VwZXIodGVzdE5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgcmV0dXJuIGdldFRlc3RTZXR1cChuZXcgVGVzdFN1aXRlKENvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlVGVzdC5jbGFzcykpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRhcmdldEVQUiA9Ci0gICAgICAgICAgICAgICAgbmV3IEVuZHBvaW50UmVmZXJlbmNlKCJodHRwOi8vMTI3LjAuMC4xOiIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgKFV0aWxTZXJ2ZXIuVEVTVElOR19QT1JUKQotLy8gICAgICAgICAgICAgICAgICAgICAgICArIDgwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIi9heGlzMi9zZXJ2aWNlcy9Db21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZSIpOwotICAgICAgICBzdHViID0gbmV3IG9yZy50ZW1wdXJpLmNvbXBsZXguQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmVTdHViKG51bGwsIHRhcmdldEVQUi5nZXRBZGRyZXNzKCkpOwotICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gIm9yZy50ZW1wdXJpLmNvbXBsZXguQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmUiOwotICAgICAgICBVdGlsU2VydmVyLnN0YXJ0KCk7Ci0gICAgICAgIFBhcmFtZXRlciBnZW5lcmF0ZUJhcmUgPSBuZXcgUGFyYW1ldGVyKCk7Ci0gICAgICAgIGdlbmVyYXRlQmFyZS5zZXROYW1lKEphdmEyV1NETENvbnN0YW50cy5ET0NfTElUX0JBUkVfUEFSQU1FVEVSKTsKLSAgICAgICAgZ2VuZXJhdGVCYXJlLnNldFZhbHVlKCJ0cnVlIik7Ci0gICAgICAgIFV0aWxTZXJ2ZXIuZ2V0Q29uZmlndXJhdGlvbkNvbnRleHQoKS5nZXRBeGlzQ29uZmlndXJhdGlvbigpLmFkZFBhcmFtZXRlcihnZW5lcmF0ZUJhcmUpOwotICAgICAgICBBeGlzU2VydmljZSBzZXJ2aWNlID0gQXhpc1NlcnZpY2UuY3JlYXRlU2VydmljZSgKLSAgICAgICAgICAgICAgICBjbGFzc05hbWUsIFV0aWxTZXJ2ZXIuZ2V0Q29uZmlndXJhdGlvbkNvbnRleHQoKS5nZXRBeGlzQ29uZmlndXJhdGlvbigpKTsKLSAgICAgICAgc2VydmljZS5hZGRQYXJhbWV0ZXIoZ2VuZXJhdGVCYXJlKTsKLSAgICAgICAgc2VydmljZS5zZXROYW1lKCJDb21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZSIpOwotICAgICAgICBzZXJ2aWNlLnNldENsYXNzTG9hZGVyKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkpOwotICAgICAgICBVdGlsU2VydmVyLmRlcGxveVNlcnZpY2Uoc2VydmljZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgVXRpbFNlcnZlci51bkRlcGxveVNlcnZpY2Uoc2VydmljZU5hbWUpOwotICAgICAgICBVdGlsU2VydmVyLnVuRGVwbG95Q2xpZW50U2VydmljZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RyZXRBcnJheUludDFEKCkgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24gewotLy8gICAgICAgIGFzc2VydE51bGwoc3R1Yi5yZXRBcnJheUludDFEKG51bGwpKTsKLSAgICAgICAgc3R1Yi5fZ2V0U2VydmljZUNsaWVudCgpLmNsZWFudXBUcmFuc3BvcnQoKTsKLSAgICAgICAgQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmVTdHViLkluQXJyYXlJbnQxRCByZXEgPSBuZXcKLSAgICAgICAgICAgICAgICBDb21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZVN0dWIuSW5BcnJheUludDFEKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc3R1Yi5yZXRBcnJheUludDFEKHJlcSkpOwotICAgICAgICBzdHViLl9nZXRTZXJ2aWNlQ2xpZW50KCkuY2xlYW51cFRyYW5zcG9ydCgpOwotICAgICAgICBDb21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZVN0dWIuQXJyYXlPZmludCBpbnB1dCA9IG5ldyBDb21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZVN0dWIuQXJyYXlPZmludCgpOwotICAgICAgICBpbnB1dC5zZXRfaW50KG5ldyBpbnRbXXswLCAxLCAyfSk7Ci0gICAgICAgIHJlcS5zZXRJbkFycmF5SW50MUQoaW5wdXQpOwotICAgICAgICBDb21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZVN0dWIuUmV0QXJyYXlJbnQxRFJlc3VsdCByZXQgPSBzdHViLnJldEFycmF5SW50MUQocmVxKTsKLSAgICAgICAgc3R1Yi5fZ2V0U2VydmljZUNsaWVudCgpLmNsZWFudXBUcmFuc3BvcnQoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXQpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldC5nZXRSZXRBcnJheUludDFEUmVzdWx0KCkuZ2V0X2ludCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldC5nZXRSZXRBcnJheUludDFEUmVzdWx0KCkuZ2V0X2ludCgpLmxlbmd0aCwgMyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXV0byBnZW5lcmF0ZWQgdGVzdCBtZXRob2QKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0cmV0U3RydWN0U05TQVMoKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vVE9ETyBDb2RlZ2VuIGlzc3VlCi0vLyAgICAgICAgYXNzZXJ0TnVsbChzdHViLnJldFN0cnVjdFNOU0FTKG51bGwpKTsKLSAgICAgICAgQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmVTdHViLkluU3RydWN0U05TQVMgcmVxID0KLSAgICAgICAgICAgICAgICBuZXcgQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmVTdHViLkluU3RydWN0U05TQVMoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzdHViLnJldFN0cnVjdFNOU0FTKHJlcSkpOwotCi0gICAgICAgIENvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlU3R1Yi5Hcm91cCBpbnB1dCA9Ci0gICAgICAgICAgICAgICAgbmV3IENvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlU3R1Yi5Hcm91cCgpOwotICAgICAgICBpbnB1dC5zZXROYW1lKCJ4eXoiKTsKLSAgICAgICAgaW5wdXQuc2V0TWVtYmVycyhuZXcgQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmVTdHViLkFycmF5T2ZQZXJzb24oKSk7Ci0gICAgICAgIHJlcS5zZXRJblN0cnVjdFNOU0FTKGlucHV0KTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzdHViLnJldFN0cnVjdFNOU0FTKHJlcSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEF1dG8gZ2VuZXJhdGVkIHRlc3QgbWV0aG9kCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdHJldEFycmF5RGF0ZVRpbWUxRCgpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uIHsKLSAgICAgICAgLy9UT0RPICwgdGhpcyBpcyBhIGNvZGVnZW4gYnVnCi0vLyAgICAgICAgYXNzZXJ0TnVsbChzdHViLnJldEFycmF5RGF0ZVRpbWUxRChudWxsKSk7Ci0gICAgICAgIENvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlU3R1Yi5JbkFycmF5RGF0ZVRpbWUxRCByZXEgPSBuZXcgQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmVTdHViLkluQXJyYXlEYXRlVGltZTFEKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc3R1Yi5yZXRBcnJheURhdGVUaW1lMUQocmVxKSk7Ci0gICAgICAgIENvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlU3R1Yi5BcnJheU9mTnVsbGFibGVPZmRhdGVUaW1lIGlucHV0ID0gbmV3IENvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlU3R1Yi5BcnJheU9mTnVsbGFibGVPZmRhdGVUaW1lKCk7Ci0gICAgICAgIGlucHV0LnNldERhdGVUaW1lKG5ldyBDYWxlbmRhcltde0NhbGVuZGFyLmdldEluc3RhbmNlKCksIENhbGVuZGFyLmdldEluc3RhbmNlKCl9KTsKLSAgICAgICAgcmVxLnNldEluQXJyYXlEYXRlVGltZTFEKGlucHV0KTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzdHViLnJldEFycmF5RGF0ZVRpbWUxRChyZXEpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBdXRvIGdlbmVyYXRlZCB0ZXN0IG1ldGhvZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RyZXRBcnJheVN0cmluZzJEKCkgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24gewotICAgICAgICAvL1RPRE8gY29kZWdlbiBpc3N1ZQotLy8gICAgICAgIGFzc2VydE51bGwoc3R1Yi5yZXRBcnJheVN0cmluZzJEKG51bGwpKTsKLSAgICAgICAgQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmVTdHViLkluQXJyYXlTdHJpbmcyRCByZXEgPQotICAgICAgICAgICAgICAgIG5ldyBDb21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZVN0dWIuSW5BcnJheVN0cmluZzJEKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc3R1Yi5yZXRBcnJheVN0cmluZzJEKHJlcSkpOwotCi0gICAgICAgIENvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlU3R1Yi5BcnJheU9mQXJyYXlPZnN0cmluZyBpbnB1dCA9IG5ldyBDb21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZVN0dWIuQXJyYXlPZkFycmF5T2ZzdHJpbmcoKTsKLSAgICAgICAgQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmVTdHViLkFycmF5T2ZzdHJpbmcgYTIgPSBuZXcgQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmVTdHViLkFycmF5T2ZzdHJpbmcoKTsKLSAgICAgICAgQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmVTdHViLkFycmF5T2ZzdHJpbmcgYTEgPSBuZXcgQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmVTdHViLkFycmF5T2ZzdHJpbmcoKTsKLSAgICAgICAgYTEuc2V0U3RyaW5nKG5ldyBTdHJpbmdbXXsiZm9vIiwgImJhciJ9KTsKLSAgICAgICAgaW5wdXQuc2V0QXJyYXlPZnN0cmluZyhuZXcgQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmVTdHViLkFycmF5T2ZzdHJpbmdbXXthMSwgYTJ9KTsKLSAgICAgICAgcmVxLnNldEluQXJyYXlTdHJpbmcyRChpbnB1dCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc3R1Yi5yZXRBcnJheVN0cmluZzJEKHJlcSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEF1dG8gZ2VuZXJhdGVkIHRlc3QgbWV0aG9kCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdHJldEFycmF5RGVjaW1hbDFEKCkgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24gewotCi0vLyAgICAgICAgYXNzZXJ0TnVsbChzdHViLnJldEFycmF5RGVjaW1hbDFEKG51bGwpKTsKLSAgICAgICAgQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmVTdHViLkluQXJyYXlEZWNpbWFsMUQgcmVxID0KLSAgICAgICAgICAgICAgICBuZXcgQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmVTdHViLkluQXJyYXlEZWNpbWFsMUQoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzdHViLnJldEFycmF5RGVjaW1hbDFEKHJlcSkpOwotCi0gICAgICAgIENvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlU3R1Yi5BcnJheU9mTnVsbGFibGVPZmRlY2ltYWwgaW5wdXQgPSBuZXcgQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmVTdHViLkFycmF5T2ZOdWxsYWJsZU9mZGVjaW1hbCgpOwotICAgICAgICBpbnB1dC5zZXREZWNpbWFsKG5ldyBCaWdEZWNpbWFsW117bmV3IEJpZ0RlY2ltYWwoMSksIG5ldyBCaWdEZWNpbWFsKDIpfSk7Ci0gICAgICAgIHJlcS5zZXRJbkFycmF5RGVjaW1hbDFEKGlucHV0KTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzdHViLnJldEFycmF5RGVjaW1hbDFEKHJlcSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEF1dG8gZ2VuZXJhdGVkIHRlc3QgbWV0aG9kCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdHJldFN0cnVjdFNOU0EoKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbiB7Ci0KLS8vICAgICAgICBhc3NlcnROdWxsKHN0dWIucmV0U3RydWN0U05TQShudWxsKSk7Ci0gICAgICAgIENvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlU3R1Yi5JblN0cnVjdFNOU0EgcmVxID0gbmV3IENvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlU3R1Yi5JblN0cnVjdFNOU0EoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzdHViLnJldFN0cnVjdFNOU0EocmVxKSk7Ci0gICAgICAgIENvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlU3R1Yi5FbXBsb3llZSBpbnB1dCA9IG5ldyBDb21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZVN0dWIuRW1wbG95ZWUoKTsKLSAgICAgICAgaW5wdXQuc2V0Sm9iSUQoMzQpOwotICAgICAgICBpbnB1dC5zZXRCYXNlRGV0YWlscyhuZXcgQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmVTdHViLlBlcnNvbigpKTsKLSAgICAgICAgaW5wdXQuc2V0TnVtYmVycyhuZXcgQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmVTdHViLkFycmF5T2ZzaG9ydCgpKTsKLSAgICAgICAgaW5wdXQuc2V0SGlyZURhdGUoQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKSk7Ci0gICAgICAgIHJlcS5zZXRJblN0cnVjdFNOU0EoaW5wdXQpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHN0dWIucmV0U3RydWN0U05TQShyZXEpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBdXRvIGdlbmVyYXRlZCB0ZXN0IG1ldGhvZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RyZXRBcnJheUFueVR5cGUxRCgpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uIHsKLQotLy8gICAgICAgIGFzc2VydE51bGwoc3R1Yi5yZXRBcnJheUFueVR5cGUxRChudWxsKSk7Ci0gICAgICAgIENvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlU3R1Yi5JbkFycmF5QW55VHlwZTFEIHJlcSA9IG5ldyBDb21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZVN0dWIuSW5BcnJheUFueVR5cGUxRCgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHN0dWIucmV0QXJyYXlBbnlUeXBlMUQocmVxKSk7Ci0gICAgICAgIENvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlU3R1Yi5BcnJheU9mYW55VHlwZSBpbnB1dCA9IG5ldyBDb21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZVN0dWIuQXJyYXlPZmFueVR5cGUoKTsKLQotICAgICAgICBPTUZhY3RvcnkgZmFjdG9yeSA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpOwotICAgICAgICAvLyBsZXRzIGNyZWF0ZSB0aGUgbmFtZXNwYWNlIG9iamVjdCBvZiB0aGUgQXJ0aWNsZSBlbGVtZW50Ci0gICAgICAgIE9NTmFtZXNwYWNlIG5zID0gZmFjdG9yeS5jcmVhdGVPTU5hbWVzcGFjZSgiaHR0cDovL3d3dy5pYm0uY29tL2RldmVsb3BlcndvcmtzL2xpYnJhcnkvd3MtYXhpczJzb2FwL2luZGV4Lmh0bWwiLCAiYXJ0aWNsZSIpOwotICAgICAgICAvLyBub3cgY3JlYXRlIHRoZSBBcnRpY2xlIGVsZW1lbnQgd2l0aCB0aGUgYWJvdmUgbmFtZXNwYWNlCi0gICAgICAgIE9NRWxlbWVudCBhcnRpY2xlRWxlbWVudCA9IGZhY3RvcnkuY3JlYXRlT01FbGVtZW50KCJBcnRpY2xlIiwgbnMpOwotCi0gICAgICAgIC8vIGNvbW1lbnQgb3V0IHRoaXMgdGVzdCBjYXNlIHNpbmNlIG5vdyBhZGIgdXNlcyBPYmplY3QgdG8gcmVwcmVzZW50IGFueSB0eXBlCi0gICAgICAgIAotICAgICAgICAvLyBpbnB1dC5zZXRBbnlUeXBlKG5ldyBPTUVsZW1lbnRbXXthcnRpY2xlRWxlbWVudH0pOwotICAgICAgICAvLyByZXEuc2V0SW5BcnJheUFueVR5cGUxRChpbnB1dCk7Ci0gICAgICAgIC8vIGFzc2VydE5vdE51bGwoc3R1Yi5yZXRBcnJheUFueVR5cGUxRChyZXEpKTsKLSAgICAgICAgLy9UT0RPRCA6IE5lZWQgdG8gZml4IHRoaXMgLCBzZWVtcyBsaWtlIHdlIGFyZSBub3QgZ2V0dGluZyB0aGUgY29ycmNldCByZXNwb25zZQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQXV0byBnZW5lcmF0ZWQgdGVzdCBtZXRob2QKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0cmV0U3RydWN0U04oKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbiB7Ci0KLS8vICAgICAgICBhc3NlcnROdWxsKHN0dWIucmV0U3RydWN0U04obnVsbCkpOwotICAgICAgICBDb21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZVN0dWIuSW5TdHJ1Y3RTTiByZXEgPSBuZXcgQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmVTdHViLkluU3RydWN0U04oKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzdHViLnJldFN0cnVjdFNOKHJlcSkpOwotCi0gICAgICAgIENvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlU3R1Yi5QZXJzb24gaW5wdXQgPSBuZXcgQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmVTdHViLlBlcnNvbigpOwotICAgICAgICBpbnB1dC5zZXRBZ2UoMjMpOwotICAgICAgICBpbnB1dC5zZXRJZCgzNDUpOwotICAgICAgICBpbnB1dC5zZXRNYWxlKGZhbHNlKTsKLSAgICAgICAgaW5wdXQuc2V0TmFtZSgiV2h5PyIpOwotICAgICAgICByZXEuc2V0SW5TdHJ1Y3RTTihpbnB1dCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc3R1Yi5yZXRTdHJ1Y3RTTihyZXEpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBdXRvIGdlbmVyYXRlZCB0ZXN0IG1ldGhvZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RyZXRBcnJheTFEU04oKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbiB7Ci0vL1RPRE8gQ29kZWdlbiBpc3N1ZQotLy8gICAgICAgIGFzc2VydE51bGwoc3R1Yi5yZXRBcnJheTFEU04obnVsbCkpOwotCi0gICAgICAgIENvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlU3R1Yi5JbkFycmF5MURTTiByZXEgPSBuZXcgQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmVTdHViLkluQXJyYXkxRFNOKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc3R1Yi5yZXRBcnJheTFEU04ocmVxKSk7Ci0KLSAgICAgICAgQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmVTdHViLkFycmF5T2ZQZXJzb24gaW5wdXQgPSBuZXcgQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmVTdHViLkFycmF5T2ZQZXJzb24oKTsKLSAgICAgICAgQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmVTdHViLlBlcnNvbiBwMSA9IG5ldyBDb21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZVN0dWIuUGVyc29uKCk7Ci0gICAgICAgIHAxLnNldEFnZSgzNCk7Ci0gICAgICAgIHAxLnNldElkKDIzNDUpOwotICAgICAgICBwMS5zZXRNYWxlKHRydWUpOwotICAgICAgICBwMS5zZXROYW1lKCJISkhKSCIpOwotICAgICAgICBpbnB1dC5zZXRQZXJzb24obmV3IENvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlU3R1Yi5QZXJzb25bXXtwMX0pOwotICAgICAgICByZXEuc2V0SW5BcnJheTFEU04oaW5wdXQpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHN0dWIucmV0QXJyYXkxRFNOKHJlcSkpOwotICAgICAgICAvL1RPRE8gOiBOZWVkIHRvIGZpeCB0aGlzICwgd2UgYXJlIG5vdCBnZXR0aW4gY29ycmNldCByZXBvbnNlCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXV0byBnZW5lcmF0ZWQgdGVzdCBtZXRob2QKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0cmV0RGVyaXZlZENsYXNzKCkgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24gewotLy8gICAgICAgIGFzc2VydE51bGwoc3R1Yi5yZXREZXJpdmVkQ2xhc3MobnVsbCkpOwotICAgICAgICBDb21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZVN0dWIuSW5EZXJpdmVkQ2xhc3MgcmVxID0KLSAgICAgICAgICAgICAgICBuZXcgQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmVTdHViLkluRGVyaXZlZENsYXNzKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc3R1Yi5yZXREZXJpdmVkQ2xhc3MocmVxKSk7Ci0KLSAgICAgICAgQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmVTdHViLkZ1cm5pdHVyZSBpbnB1dCA9IG5ldyBDb21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZVN0dWIuRnVybml0dXJlKCk7Ci0gICAgICAgIGlucHV0LnNldENvbG9yKCJ3aGl0ZSIpOwotICAgICAgICBpbnB1dC5zZXRQcmljZSg2Nyk7Ci0gICAgICAgIHJlcS5zZXRJbkRlcml2ZWRDbGFzcyhpbnB1dCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc3R1Yi5yZXREZXJpdmVkQ2xhc3MocmVxKSk7Ci0gICAgICAgIC8vVE9ETyA6IE5lZWQgdG8gZml4IHRoaXMgdG9vCi0gICAgfQotLy8KLS8vLy8gVE9ETzogV2UgbmVlZCB0byBmaWd1cmUgb3V0IGhvdyB0byBkZWFsIHdpdGggRU5VTSdzLiBQbGVhc2UgZG9uJ3QgcmVtb3ZlIHRoaXMgc2VjdGlvbi4KLS8vLy8gICAgLyoqCi0vLy8vICAgICAqIEF1dG8gZ2VuZXJhdGVkIHRlc3QgbWV0aG9kCi0vLy8vICAgICAqLwotLy8gICAgcHVibGljIHZvaWQgdGVzdHJldEVudW1JbnQoKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbiB7Ci0vLwotLy8KLS8vICAgICAgICBhc3NlcnROdWxsKHN0dWIucmV0RW51bUludChudWxsKSk7Ci0vLyAgICAgICAgU3RyaW5nIGlucHV0ID0gIiI7Ci0vLyAgICAgICAgYXNzZXJ0Tm90TnVsbChzdHViLnJldEVudW1JbnQobmV3IFN0cmluZygpKSk7Ci0vLyAgICB9Ci0vLwotLy8vLyBUT0RPOiBXZSBuZWVkIHRvIGZpZ3VyZSBvdXQgaG93IHRvIGRlYWwgd2l0aCBFTlVNJ3MuIFBsZWFzZSBkb24ndCByZW1vdmUgdGhpcyBzZWN0aW9uLgotLy8vLyAgICAvKioKLS8vLy8gICAgICogQXV0byBnZW5lcmF0ZWQgdGVzdCBtZXRob2QKLS8vLy8gICAgICovCi0vLy8vICAgIHB1YmxpYyB2b2lkIHRlc3RyZXRFbnVtU3RyaW5nKCkgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24gewotLy8vLwotLy8vLyAgICAgICAgb3JnLnRlbXB1cmkuY29tcGxleC54c2QuQ29tcGxleERhdGFUeXBlc0NvbXBsZXhEYXRhVHlwZXNTT0FQMTFQb3J0X2h0dHBTdHViIHN0dWIgPQotLy8vLyAgICAgICAgICAgICAgICBuZXcgb3JnLnRlbXB1cmkuY29tcGxleC54c2QuQ29tcGxleERhdGFUeXBlc0NvbXBsZXhEYXRhVHlwZXNTT0FQMTFQb3J0X2h0dHBTdHViKCk7Ci0vLy8vCi0vLy8vICAgICAgICBhc3NlcnROdWxsKHN0dWIucmV0RW51bVN0cmluZyhudWxsKSk7Ci0vLy8vICAgICAgICBCaXRNYXNrIGlucHV0ID0gbmV3IEJpdE1hc2soKTsKLS8vLy8gICAgICAgIGFzc2VydE51bGwoc3R1Yi5yZXRFbnVtU3RyaW5nKG5ldyBCaXRNYXNrKCkpKTsKLS8vLy8gICAgfQotLy8KLQotICAgIC8vCi0KLSAgICAvKioKLSAgICAgKiBBdXRvIGdlbmVyYXRlZCB0ZXN0IG1ldGhvZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RyZXRTdHJ1Y3RTMSgpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uIHsKLS8vICAgICAgICBhc3NlcnROdWxsKHN0dWIucmV0U3RydWN0UzEobnVsbCkpOwotICAgICAgICBDb21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZVN0dWIuSW5TdHJ1Y3RTMSByZXEgPSBuZXcgQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmVTdHViLkluU3RydWN0UzEoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzdHViLnJldFN0cnVjdFMxKHJlcSkpOwotICAgICAgICBDb21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZVN0dWIuTmFtZSBpbnB1dCA9IG5ldyBDb21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZVN0dWIuTmFtZSgpOwotICAgICAgICBpbnB1dC5zZXROYW1lKCJld3J0ZXJ0eSIpOwotICAgICAgICByZXEuc2V0SW5TdHJ1Y3RTMShpbnB1dCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc3R1Yi5yZXRTdHJ1Y3RTMShyZXEpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBdXRvIGdlbmVyYXRlZCB0ZXN0IG1ldGhvZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RyZXRBcnJheVN0cmluZzFEKCkgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24gewotLy8gICAgICAgIGFzc2VydE51bGwoc3R1Yi5yZXRBcnJheVN0cmluZzFEKG51bGwpKTsKLSAgICAgICAgQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmVTdHViLkluQXJyYXlTdHJpbmcxRCByZXEgPSBuZXcgQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmVTdHViLkluQXJyYXlTdHJpbmcxRCgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHN0dWIucmV0QXJyYXlTdHJpbmcxRChyZXEpKTsKLSAgICAgICAgQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmVTdHViLkFycmF5T2ZzdHJpbmcgaW5wdXQgPSBuZXcgQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmVTdHViLkFycmF5T2ZzdHJpbmcoKTsKLSAgICAgICAgaW5wdXQuc2V0U3RyaW5nKG5ldyBTdHJpbmdbXXsiZm9vIiwgImJhciJ9KTsKLSAgICAgICAgcmVxLnNldEluQXJyYXlTdHJpbmcxRChpbnB1dCk7Ci0gICAgICAgIENvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlU3R1Yi5SZXRBcnJheVN0cmluZzFEUmVzdWx0IHJldCA9IHN0dWIucmV0QXJyYXlTdHJpbmcxRChyZXEpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0LmdldFJldEFycmF5U3RyaW5nMURSZXN1bHQoKS5nZXRTdHJpbmcoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXQuZ2V0UmV0QXJyYXlTdHJpbmcxRFJlc3VsdCgpLmdldFN0cmluZygpLmxlbmd0aCwgMik7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBBdXRvIGdlbmVyYXRlZCB0ZXN0IG1ldGhvZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RyZXRTaW5nbGUoKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbiB7Ci0gICAgICAgIENvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlU3R1Yi5JblNpbmdsZSByZXEgPSBuZXcgQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmVTdHViLkluU2luZ2xlKCk7Ci0gICAgICAgIHJlcS5zZXRJblNpbmdsZSg0My4wZik7Ci0gICAgICAgIGZsb2F0IHJldCA9IHN0dWIucmV0U2luZ2xlKHJlcSkuZ2V0UmV0U2luZ2xlUmVzdWx0KCk7Ci0gICAgICAgIGFzc2VydFRydWUocmV0ID09IDQzLjBmKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFNpbXBsZURhdGVGb3JtYXQgenVsdSA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KCJ5eXl5LU1NLWRkJ1QnSEg6bW06c3MuU1NTJ1onIik7Ci0KLSAgICAvKioKLSAgICAgKiBBdXRvIGdlbmVyYXRlZCB0ZXN0IG1ldGhvZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RyZXREYXRlVGltZSgpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uIHsKLSAgICAgICAgenVsdS5zZXRUaW1lWm9uZShUaW1lWm9uZS5nZXRUaW1lWm9uZSgiR01UIikpOwotICAgICAgICBDYWxlbmRhciBpbnB1dCA9IENhbGVuZGFyLmdldEluc3RhbmNlKCk7Ci0gICAgICAgIENvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlU3R1Yi5JbkRhdGVUaW1lIHJlcSA9IG5ldyBDb21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZVN0dWIuSW5EYXRlVGltZSgpOwotICAgICAgICByZXEuc2V0SW5EYXRlVGltZShpbnB1dCk7Ci0gICAgICAgIENhbGVuZGFyIHJldCA9IHN0dWIucmV0RGF0ZVRpbWUocmVxKS5nZXRSZXREYXRlVGltZVJlc3VsdCgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyh6dWx1LmZvcm1hdChpbnB1dC5nZXRUaW1lKCkpLCB6dWx1LmZvcm1hdChyZXQuZ2V0VGltZSgpKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXV0byBnZW5lcmF0ZWQgdGVzdCBtZXRob2QKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0cmV0R3VpZCgpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uIHsKLQotICAgICAgICBTdHJpbmcgaW5wdXQgPSAiMTIzNDUiOwotICAgICAgICBDb21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZVN0dWIuSW5HdWlkIHJlcSA9IG5ldyBDb21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZVN0dWIuSW5HdWlkKCk7Ci0gICAgICAgIHJlcS5zZXRJbkd1aWQoaW5wdXQpOwotICAgICAgICBTdHJpbmcgcmV0ID0gc3R1Yi5yZXRHdWlkKHJlcSkuZ2V0UmV0R3VpZFJlc3VsdCgpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0LCBpbnB1dCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXV0byBnZW5lcmF0ZWQgdGVzdCBtZXRob2QKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0cmV0Qnl0ZUFycmF5KCkgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24gewotCi0KLSAgICAgICAgYnl0ZVtdIGlucHV0ID0gbmV3IGJ5dGVbXXsoYnl0ZSkgMHhERSwgKGJ5dGUpIDB4QUQsIChieXRlKSAweEJFLCAoYnl0ZSkgMHhFRn07Ci0gICAgICAgIENvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlU3R1Yi5SZXRCeXRlQXJyYXkgcmVxID0gbmV3IENvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlU3R1Yi5SZXRCeXRlQXJyYXkoKTsKLSAgICAgICAgcmVxLnNldEluQnl0ZUFycmF5KG5ldyBEYXRhSGFuZGxlcihuZXcgQnl0ZUFycmF5RGF0YVNvdXJjZShpbnB1dCkpKTsKLSAgICAgICAgRGF0YUhhbmRsZXIgcmV0ID0gc3R1Yi5yZXRCeXRlQXJyYXkocmVxKS5nZXRfcmV0dXJuKCk7Ci0gICAgICAgIGJ5dGVbXSBieXRlcyA9IElPVXRpbHMuZ2V0U3RyZWFtQXNCeXRlQXJyYXkocmV0LmdldElucHV0U3RyZWFtKCkpOwotICAgICAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoYnl0ZXMsIGlucHV0KSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXV0byBnZW5lcmF0ZWQgdGVzdCBtZXRob2QKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0cmV0VXJpKCkgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24gewotICAgICAgICBDb21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZVN0dWIuSW5VcmkgcmVxID0KLSAgICAgICAgICAgICAgICBuZXcgQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmVTdHViLkluVXJpKCk7Ci0gICAgICAgIHJlcS5zZXRJblVyaSgiMTI0Iik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc3R1Yi5yZXRVcmkocmVxKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXV0byBnZW5lcmF0ZWQgdGVzdCBtZXRob2QKLSAgICAgKi8KLS8vICAgIHB1YmxpYyB2b2lkIHRlc3RyZXRRTmFtZSgpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uIHsKLS8vICAgICAgICBGSVhNRTogV2h5IGlzIFFOYW1lIGJlaW5nIG1hcHBlZCB0byBPTUVsZW1lbnQ/Ci0vLyAgICAgICAgYXNzZXJ0TnVsbChzdHViLnJldFFOYW1lKG51bGwpKTsKLS8vICAgIH0KLQotLy8vLyBUT0RPOiBGSVhNRTogTmVlZCB0byBmaWd1cmUgb3V0IGhvdyB0byBkbyBlbnVtJ3MuIFBsZWFzZSBkb24ndCByZW1vdmUgdGhpcyBmb2xsb3dpbmcgc2VjdGlvbgotLy8vLyAgICAvKioKLS8vLy8gICAgICogQXV0byBnZW5lcmF0ZWQgdGVzdCBtZXRob2QKLS8vLy8gICAgICovCi0vLy8vICAgIHB1YmxpYyB2b2lkIHRlc3RyZXRFbnVtSW50KCkgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24gewotLy8vLwotLy8vLyAgICAgICAgb3JnLnRlbXB1cmkuY29tcGxleC54c2QuQ29tcGxleERhdGFUeXBlc0NvbXBsZXhEYXRhVHlwZXNTT0FQMTFQb3J0X2h0dHBTdHViIHN0dWIgPQotLy8vLyAgICAgICAgICAgICAgICBuZXcgb3JnLnRlbXB1cmkuY29tcGxleC54c2QuQ29tcGxleERhdGFUeXBlc0NvbXBsZXhEYXRhVHlwZXNTT0FQMTFQb3J0X2h0dHBTdHViKCk7Ci0vLy8vCi0vLy8vICAgICAgICBvcmcudGVtcHVyaS5jb21wbGV4LnhzZC54c2QuUmV0RW51bUludCByZXRFbnVtSW50MTI2ID0KLS8vLy8gICAgICAgICAgICAgICAgKG9yZy50ZW1wdXJpLmNvbXBsZXgueHNkLnhzZC5SZXRFbnVtSW50KSBnZXRUZXN0T2JqZWN0KG9yZy50ZW1wdXJpLmNvbXBsZXgueHNkLnhzZC5SZXRFbnVtSW50LmNsYXNzKTsKLS8vLy8gICAgICAgIC8vIHRvZG8gRmlsbCBpbiB0aGUgcmV0RW51bUludDEyNiBoZXJlCi0vLy8vCi0vLy8vICAgICAgICBhc3NlcnROb3ROdWxsKHN0dWIucmV0RW51bUludCgKLS8vLy8gICAgICAgICAgICAgICAgZ2V0UGFyYW0wKHJldEVudW1JbnQxMjYpCi0vLy8vICAgICAgICApKTsKLS8vLy8KLS8vLy8KLS8vLy8gICAgfQotLy8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0cmV0TG9uZygpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uIHsKLSAgICAgICAgQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmVTdHViLkluTG9uZyByZXEgPSBuZXcgQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmVTdHViLkluTG9uZygpOwotICAgICAgICByZXEuc2V0SW5Mb25nKDM0KTsKLSAgICAgICAgbG9uZyByZXQgPSBzdHViLnJldExvbmcocmVxKS5nZXRSZXRMb25nUmVzdWx0KCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygzNCwgcmV0KTsKLSAgICB9Ci0KLSAgICAvLwotICAgIC8qKgotICAgICAqIEF1dG8gZ2VuZXJhdGVkIHRlc3QgbWV0aG9kCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdHJldFVTaG9ydCgpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uIHsKLSAgICAgICAgQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmVTdHViLkluVVNob3J0IHJlcSA9IG5ldyBDb21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZVN0dWIuSW5VU2hvcnQoKTsKLSAgICAgICAgcmVxLnNldEluVVNob3J0KDM0KTsKLSAgICAgICAgaW50IHJldCA9IHN0dWIucmV0VVNob3J0KHJlcSkuZ2V0UmV0VVNob3J0UmVzdWx0KCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygzNCwgcmV0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBdXRvIGdlbmVyYXRlZCB0ZXN0IG1ldGhvZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RyZXRVSW50KCkgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24gewotICAgICAgICBDb21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZVN0dWIuSW5VSW50IHJlcSA9IG5ldyBDb21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZVN0dWIuSW5VSW50KCk7Ci0gICAgICAgIHJlcS5zZXRJblVJbnQoMzQpOwotICAgICAgICBsb25nIHJldCA9IHN0dWIucmV0VUludChyZXEpLmdldFJldFVJbnRSZXN1bHQoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDM0LCByZXQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEF1dG8gZ2VuZXJhdGVkIHRlc3QgbWV0aG9kCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdHJldEJ5dGUoKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbiB7Ci0gICAgICAgIENvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlU3R1Yi5JbkJ5dGUgcmVxID0gbmV3IENvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlU3R1Yi5JbkJ5dGUoKTsKLSAgICAgICAgcmVxLnNldEluQnl0ZSgoc2hvcnQpIDM0KTsKLSAgICAgICAgc2hvcnQgcmV0ID0gc3R1Yi5yZXRCeXRlKHJlcSkuZ2V0UmV0Qnl0ZVJlc3VsdCgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoKHNob3J0KSAzNCwgcmV0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBdXRvIGdlbmVyYXRlZCB0ZXN0IG1ldGhvZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RyZXRTQnl0ZSgpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uIHsKLSAgICAgICAgQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmVTdHViLkluU0J5dGUgcmVxID0gbmV3IENvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlU3R1Yi5JblNCeXRlKCk7Ci0gICAgICAgIHJlcS5zZXRJblNCeXRlKChieXRlKSAzNCk7Ci0gICAgICAgIGJ5dGUgcmV0ID0gc3R1Yi5yZXRTQnl0ZShyZXEpLmdldFJldFNCeXRlUmVzdWx0KCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygoYnl0ZSkgMzQsIHJldCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXV0byBnZW5lcmF0ZWQgdGVzdCBtZXRob2QKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0cmV0U2hvcnQoKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbiB7Ci0gICAgICAgIENvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlU3R1Yi5JblNob3J0IHJlcSA9IG5ldyBDb21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZVN0dWIuSW5TaG9ydCgpOwotICAgICAgICByZXEuc2V0SW5TaG9ydCgoc2hvcnQpIDM0KTsKLSAgICAgICAgc2hvcnQgcmV0ID0gc3R1Yi5yZXRTaG9ydChyZXEpLmdldFJldFNob3J0UmVzdWx0KCk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKChzaG9ydCkgMzQsIHJldCk7Ci0gICAgfQotCi0gICAgLy8KLSAgICAvKioKLSAgICAgKiBBdXRvIGdlbmVyYXRlZCB0ZXN0IG1ldGhvZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RyZXRPYmplY3QoKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgT01GYWN0b3J5IGZhY3RvcnkgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKTsKLSAgICAgICAgLy8gbGV0cyBjcmVhdGUgdGhlIG5hbWVzcGFjZSBvYmplY3Qgb2YgdGhlIEFydGljbGUgZWxlbWVudAotICAgICAgICBPTU5hbWVzcGFjZSBucyA9IGZhY3RvcnkuY3JlYXRlT01OYW1lc3BhY2UoImh0dHA6Ly93d3cuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9saWJyYXJ5L3dzLWF4aXMyc29hcC9pbmRleC5odG1sIiwgImFydGljbGUiKTsKLSAgICAgICAgLy8gbm93IGNyZWF0ZSB0aGUgQXJ0aWNsZSBlbGVtZW50IHdpdGggdGhlIGFib3ZlIG5hbWVzcGFjZQotICAgICAgICBPTUVsZW1lbnQgYXJ0aWNsZUVsZW1lbnQgPSBmYWN0b3J5LmNyZWF0ZU9NRWxlbWVudCgiQXJ0aWNsZSIsIG5zKTsKLQotICAgICAgICAvLyByZXByZXNlbnRpbmcgdGhlIGFueSB0eXBlIHdpdGggYSBPTUVsZW1lbnQgaXMgd3JvbmcuIGl0IHNob3VsZCBiZSBhbiBPYmplY3QKLSAgICAgICAgLy8gYWRiIGhhcyBmaXhlZCB0aGlzIG5vdyBjb21tZW50IHRoaXMgdGVzdCB0byBmaXggdGhpcyBmb3IgamF2YTJ3c2RsIGFzIHdlbGwKLQotICAgICAgICAvLyBDb21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZVN0dWIuSW5PYmplY3QgcmVxID0gbmV3IENvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlU3R1Yi5Jbk9iamVjdCgpOwotICAgICAgICAvLyByZXEuc2V0SW5PYmplY3QoYXJ0aWNsZUVsZW1lbnQpOwotICAgICAgICAvLyBPTUVsZW1lbnQgcmV0ID0gc3R1Yi5yZXRPYmplY3QocmVxKS5nZXRSZXRPYmplY3RSZXN1bHQoKTsKLSAgICAgICAgLy8gYXNzZXJ0Tm90TnVsbChyZXQpOwotICAgICAgICAvLyBhc3NlcnRFcXVhbHMocmV0LnRvU3RyaW5nKCksIGFydGljbGVFbGVtZW50LnRvU3RyaW5nKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEF1dG8gZ2VuZXJhdGVkIHRlc3QgbWV0aG9kCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdHJldEZsb2F0KCkgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24gewotICAgICAgICBDb21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZVN0dWIuSW5GbG9hdCByZXEgPSBuZXcgQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmVTdHViLkluRmxvYXQoKTsKLSAgICAgICAgcmVxLnNldEluRmxvYXQoKGZsb2F0KSAzNCk7Ci0gICAgICAgIGZsb2F0IHJldCA9IHN0dWIucmV0RmxvYXQocmVxKS5nZXRSZXRGbG9hdFJlc3VsdCgpOwotICAgICAgICBhc3NlcnRUcnVlKHJldCA9PSAzNCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXV0byBnZW5lcmF0ZWQgdGVzdCBtZXRob2QKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0cmV0RG91YmxlKCkgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24gewotICAgICAgICBDb21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZVN0dWIuSW5Eb3VibGUgcmVxID0gbmV3IENvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlU3R1Yi5JbkRvdWJsZSgpOwotICAgICAgICByZXEuc2V0SW5Eb3VibGUoMzQpOwotICAgICAgICBkb3VibGUgcmV0ID0gc3R1Yi5yZXREb3VibGUocmVxKS5nZXRSZXREb3VibGVSZXN1bHQoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXQgPT0gMzQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEF1dG8gZ2VuZXJhdGVkIHRlc3QgbWV0aG9kCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdHJldEJvb2woKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbiB7Ci0gICAgICAgIENvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlU3R1Yi5JbkJvb2wgcmVxID0KLSAgICAgICAgICAgICAgICBuZXcgQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmVTdHViLkluQm9vbCgpOwotICAgICAgICByZXEuc2V0SW5Cb29sKHRydWUpOwotICAgICAgICBib29sZWFuIHJldCA9IHN0dWIucmV0Qm9vbChyZXEpLmdldFJldEJvb2xSZXN1bHQoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEF1dG8gZ2VuZXJhdGVkIHRlc3QgbWV0aG9kCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdHJldERlY2ltYWwoKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgQmlnRGVjaW1hbCBpbnB1dCA9IG5ldyBCaWdEZWNpbWFsKDEyMzM0KTsKLSAgICAgICAgQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmVTdHViLkluRGVjaW1hbCByZXEgPSBuZXcgQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmVTdHViLkluRGVjaW1hbCgpOwotICAgICAgICByZXEuc2V0SW5EZWNpbWFsKGlucHV0KTsKLSAgICAgICAgQmlnRGVjaW1hbCByZXQgPSBzdHViLnJldERlY2ltYWwocmVxKS5nZXRSZXREZWNpbWFsUmVzdWx0KCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldCwgaW5wdXQpOwotICAgIH0KLQotLy8gVE9ETzogRklYTUU6IE5lZWQgdG8gZmlndXJlIG91dCBob3cgdG8gZG8gZW51bSdzLiBQbGVhc2UgZG9uJ3QgcmVtb3ZlIHRoaXMgZm9sbG93aW5nIHNlY3Rpb24KLS8vLy8gICAgLyoqCi0vLy8vICAgICAqIEF1dG8gZ2VuZXJhdGVkIHRlc3QgbWV0aG9kCi0vLy8vICAgICAqLwotLy8vLyAgICBwdWJsaWMgdm9pZCB0ZXN0cmV0RW51bVN0cmluZygpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uIHsKLS8vLy8KLS8vLy8gICAgICAgIG9yZy50ZW1wdXJpLmNvbXBsZXgueHNkLkNvbXBsZXhEYXRhVHlwZXNDb21wbGV4RGF0YVR5cGVzU09BUDExUG9ydF9odHRwU3R1YiBzdHViID0KLS8vLy8gICAgICAgICAgICAgICAgbmV3IG9yZy50ZW1wdXJpLmNvbXBsZXgueHNkLkNvbXBsZXhEYXRhVHlwZXNDb21wbGV4RGF0YVR5cGVzU09BUDExUG9ydF9odHRwU3R1YigpOwotLy8vLwotLy8vLyAgICAgICAgb3JnLnRlbXB1cmkuY29tcGxleC54c2QueHNkLlJldEVudW1TdHJpbmcgcmV0RW51bVN0cmluZzE5OCA9Ci0vLy8vICAgICAgICAgICAgICAgIChvcmcudGVtcHVyaS5jb21wbGV4LnhzZC54c2QuUmV0RW51bVN0cmluZykgZ2V0VGVzdE9iamVjdChvcmcudGVtcHVyaS5jb21wbGV4LnhzZC54c2QuUmV0RW51bVN0cmluZy5jbGFzcyk7Ci0vLy8vICAgICAgICAvLyB0b2RvIEZpbGwgaW4gdGhlIHJldEVudW1TdHJpbmcxOTggaGVyZQotLy8vLwotLy8vLyAgICAgICAgYXNzZXJ0Tm90TnVsbChzdHViLnJldEVudW1TdHJpbmcoCi0vLy8vICAgICAgICAgICAgICAgIGdldFBhcmFtMChyZXRFbnVtU3RyaW5nMTk4KQotLy8vLyAgICAgICAgKSk7Ci0vLy8vCi0vLy8vCi0vLy8vICAgIH0KLQotICAgIC8vCi0gICAgLyoqCi0gICAgICogQXV0byBnZW5lcmF0ZWQgdGVzdCBtZXRob2QKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0cmV0SW50KCkgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24gewotICAgICAgICBDb21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZVN0dWIuSW5JbnQgcmVxID0gbmV3IENvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlU3R1Yi5JbkludCgpOwotICAgICAgICByZXEuc2V0SW5JbnQoMzQpOwotICAgICAgICBpbnQgcmV0ID0gc3R1Yi5yZXRJbnQocmVxKS5nZXRSZXRJbnRSZXN1bHQoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKChpbnQpIDM0LCByZXQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEF1dG8gZ2VuZXJhdGVkIHRlc3QgbWV0aG9kCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdHJldEludHMoKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgaW50W10gaW5wdXQgPSBuZXcgaW50W117MzQsIDQ1fTsKLSAgICAgICAgQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmVTdHViLlJldEludHMgcmVxID0gbmV3IENvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlU3R1Yi5SZXRJbnRzKCk7Ci0gICAgICAgIHJlcS5zZXRJbkludChpbnB1dCk7Ci0gICAgICAgIGludCByZXRbXSA9IHN0dWIucmV0SW50cyhyZXEpLmdldF9yZXR1cm4oKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGlucHV0LCByZXQpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBdXRvIGdlbmVyYXRlZCB0ZXN0IG1ldGhvZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RyZXRDaGFyKCkgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24gewotICAgICAgICBDb21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZVN0dWIuSW5DaGFyIHJlcSA9IG5ldyBDb21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZVN0dWIuSW5DaGFyKCk7Ci0gICAgICAgIHJlcS5zZXRJbkNoYXIoMzQpOwotICAgICAgICBpbnQgcmV0ID0gc3R1Yi5yZXRDaGFyKHJlcSkuZ2V0UmV0Q2hhclJlc3VsdCgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMzQsIHJldCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXV0byBnZW5lcmF0ZWQgdGVzdCBtZXRob2QKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0cmV0U3RyaW5nKCkgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgaW5wdXQgPSAiQWJyYWNhZGFicmEiOwotICAgICAgICBDb21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZVN0dWIuSW5TdHJpbmcgcmVxID0gbmV3IENvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlU3R1Yi5JblN0cmluZygpOwotICAgICAgICByZXEuc2V0SW5TdHJpbmcoaW5wdXQpOwotICAgICAgICBTdHJpbmcgcmV0ID0gc3R1Yi5yZXRTdHJpbmcocmVxKS5nZXRSZXRTdHJpbmdSZXN1bHQoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoaW5wdXQsIHJldCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXV0byBnZW5lcmF0ZWQgdGVzdCBtZXRob2QKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0cmV0U3RyaW5ncygpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uIHsKLQotICAgICAgICBTdHJpbmdbXSByZXQ7Ci0gICAgICAgIFN0cmluZ1tdIGlucHV0ID0gbmV3IFN0cmluZ1tdeyJBYnJhY2FkYWJyYSJ9OwotICAgICAgICBDb21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZVN0dWIuUmV0U3RyaW5ncyByZXEgPSBuZXcgQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmVTdHViLlJldFN0cmluZ3MoKTsKLSAgICAgICAgcmVxLnNldEluU3RyaW5nKGlucHV0KTsKLSAgICAgICAgcmV0ID0gc3R1Yi5yZXRTdHJpbmdzKHJlcSkuZ2V0X3JldHVybigpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldCk7Ci0gICAgICAgIHJldCA9IHN0dWIucmV0U3RyaW5ncyhyZXEpLmdldF9yZXR1cm4oKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXQpOwotICAgICAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoaW5wdXQsIHJldCkpOwotICAgICAgICBpbnB1dCA9IG5ldyBTdHJpbmdbXXsiQWJyYWNhZGFicmEiLCBudWxsLCAiYWJjIn07Ci0gICAgICAgIHJlcS5zZXRJblN0cmluZyhpbnB1dCk7Ci0gICAgICAgIHJldCA9IHN0dWIucmV0U3RyaW5ncyhyZXEpLmdldF9yZXR1cm4oKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXQpOwotICAgICAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoaW5wdXQsIHJldCkpOwotCi0gICAgICAgIGlucHV0ID0gbmV3IFN0cmluZ1tde307Ci0gICAgICAgIHJlcS5zZXRJblN0cmluZyhpbnB1dCk7Ci0gICAgICAgIHJldCA9IHN0dWIucmV0U3RyaW5ncyhyZXEpLmdldF9yZXR1cm4oKTsKLSAgICAgICAgYXNzZXJ0TnVsbChyZXQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEF1dG8gZ2VuZXJhdGVkIHRlc3QgbWV0aG9kCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdHJldFVMb25nKCkgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24gewotCi0gICAgICAgIEJpZ0ludGVnZXIgaW5wdXQgPSBuZXcgQmlnSW50ZWdlcigiMzQiKTsKLSAgICAgICAgQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmVTdHViLkluVUxvbmcgcmVxID0gbmV3IENvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlU3R1Yi5JblVMb25nKCk7Ci0gICAgICAgIHJlcS5zZXRJblVMb25nKGlucHV0KTsKLSAgICAgICAgQmlnSW50ZWdlciByZXQgPSBzdHViLnJldFVMb25nKHJlcSkuZ2V0UmV0VUxvbmdSZXN1bHQoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGlucHV0LCByZXQpOwotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc3ByaW5nL015QmVhbi5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NwcmluZy9NeUJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM2ZWQxZi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc3ByaW5nL015QmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNwcmluZzsKLQotLyoqIEludGVyZmFjZSBmb3IgU3ByaW5nIGF3YXJlIEJlYW4gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTXlCZWFuIHsKLSAgICBTdHJpbmcgZW1lcmdlKCk7Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc3ByaW5nL015QmVhbkltcGwuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zcHJpbmcvTXlCZWFuSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMmRmNmJhLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zcHJpbmcvTXlCZWFuSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNwcmluZzsKLQotLyoqIFNwcmluZyB3aXJlZCBpbXBsZW1lbnRhdGlvbiAqLwotcHVibGljIGNsYXNzIE15QmVhbkltcGwgaW1wbGVtZW50cyBNeUJlYW4gewotCi0gICAgU3RyaW5nIHN0ciA9IG51bGw7Ci0KLSAgICAvLyBzcHJpbmcgJ2luamVjdHMnIHRoaXMgdmFsdWUKLSAgICBwdWJsaWMgdm9pZCBzZXRWYWwoU3RyaW5nIHMpIHsKLSAgICAgICAgc3RyID0gczsKLSAgICB9Ci0KLSAgICAvLyB3ZWIgc2VydmljZSBnZXRzIHRoaXMgdmFsdWUKLSAgICBwdWJsaWMgU3RyaW5nIGVtZXJnZSgpIHsKLSAgICAgICAgcmV0dXJuIHN0cjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc3ByaW5nL1NwcmluZ0F3YXJlU2VydmljZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NwcmluZy9TcHJpbmdBd2FyZVNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2IxNmQ5ZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc3ByaW5nL1NwcmluZ0F3YXJlU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNwcmluZzsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NVGV4dDsKLQotcHVibGljIGNsYXNzIFNwcmluZ0F3YXJlU2VydmljZSB7Ci0KLSAgICBwcml2YXRlIE15QmVhbiBteUJlYW4gPSBudWxsOwotCi0gICAgLy9zcHJpbmcgJ2luamVjdHMnIHRoaXMgaW1wbGVtZW50YXRpb24KLSAgICBwdWJsaWMgdm9pZCBzZXRNeUJlYW4oTXlCZWFuIG15QmVhbikgewotICAgICAgICB0aGlzLm15QmVhbiA9IG15QmVhbjsKLSAgICB9Ci0KLSAgICAvLyBUaGUgd2ViIHNlcnZpY2UKLSAgICBwdWJsaWMgT01FbGVtZW50IGdldFZhbHVlKE9NRWxlbWVudCBpZ25vcmUpIHsKLSAgICAgICAgT01GYWN0b3J5IGZhY3RvcnkgPQotICAgICAgICAgICAgICAgIE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpOwotICAgICAgICBPTU5hbWVzcGFjZSBwYXlsb2FkTnMgPSBmYWN0b3J5LmNyZWF0ZU9NTmFtZXNwYWNlKAotICAgICAgICAgICAgICAgICJodHRwOi8vc3ByaW5nRXhhbXBsZS5vcmcvZXhhbXBsZTEiLCAiZXhhbXBsZTEiKTsKLSAgICAgICAgT01FbGVtZW50IHBheWxvYWQgPQotICAgICAgICAgICAgICAgIGZhY3RvcnkuY3JlYXRlT01FbGVtZW50KCJzdHJpbmciLCBwYXlsb2FkTnMpOwotICAgICAgICBPTVRleHQgcmVzcG9uc2UgPSBmYWN0b3J5LmNyZWF0ZU9NVGV4dCh0aGlzLm15QmVhbi5lbWVyZ2UoKSk7Ci0gICAgICAgIHBheWxvYWQuYWRkQ2hpbGQocmVzcG9uc2UpOwotICAgICAgICByZXR1cm4gcGF5bG9hZDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc3ByaW5nL1NwcmluZ1NlcnZpY2VUZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc3ByaW5nL1NwcmluZ1NlcnZpY2VUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiNzI4YWMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NwcmluZy9TcHJpbmdTZXJ2aWNlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zcHJpbmc7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuT3B0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5TZXJ2aWNlQ2xpZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LlNlcnZpY2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uSW5PdXRBeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uT3V0SW5BeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLk1lc3NhZ2VSZWNlaXZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmV4dGVuc2lvbnMuc3ByaW5nLnJlY2VpdmVycy5TcHJpbmdBcHBDb250ZXh0QXdhcmVPYmplY3RTdXBwbGllcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmludGVncmF0aW9uLlV0aWxTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pbnRlZ3JhdGlvbi5VdGlsU2VydmVyQmFzZWRUZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5SYXdYTUxJTk91dE1lc3NhZ2VSZWNlaXZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuV1NETENvbnN0YW50czsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmNvbnRleHQuc3VwcG9ydC5DbGFzc1BhdGhYbWxBcHBsaWNhdGlvbkNvbnRleHQ7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MT3V0cHV0RmFjdG9yeTsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLQotcHVibGljIGNsYXNzIFNwcmluZ1NlcnZpY2VUZXN0IGV4dGVuZHMgVXRpbFNlcnZlckJhc2VkVGVzdENhc2UgewotCi0gICAgcHJvdGVjdGVkIFFOYW1lIHRyYW5zcG9ydE5hbWUgPSBuZXcgUU5hbWUoImh0dHA6Ly9zcHJpbmdFeGFtcGxlLm9yZy9leGFtcGxlMSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk51bGxUcmFuc3BvcnQiKTsKLSAgICBFbmRwb2ludFJlZmVyZW5jZSB0YXJnZXRFUFIgPSBuZXcgRW5kcG9pbnRSZWZlcmVuY2UoCi0gICAgICAgICAgICAiaHR0cDovLzEyNy4wLjAuMToiICsgKFV0aWxTZXJ2ZXIuVEVTVElOR19QT1JUKQotLy8gICAgICAgICAgICAiaHR0cDovLzEyNy4wLjAuMToiICsgNTU1NgotICAgICAgICAgICAgICAgICAgICAvLyAgKyAiL2F4aXMyL3NlcnZpY2VzL0VjaG9YTUxTZXJ2aWNlL2VjaG9PTUVsZW1lbnQiKTsKLSAgICAgICAgICAgICAgICAgICAgKyAiL2F4aXMyL3NlcnZpY2VzL1NwcmluZ0V4YW1wbGUvZ2V0VmFsdWUiKTsKLQotICAgIHByb3RlY3RlZCBBeGlzQ29uZmlndXJhdGlvbiBlbmdpbmVSZWdpc3RyeTsKLSAgICBwcm90ZWN0ZWQgTWVzc2FnZUNvbnRleHQgbWM7Ci0gICAgcHJvdGVjdGVkIFNlcnZpY2VDb250ZXh0IHNlcnZpY2VDb250ZXh0OwotICAgIHByb3RlY3RlZCBBeGlzU2VydmljZSBzZXJ2aWNlOwotICAgIHByaXZhdGUgUU5hbWUgc3ByaW5nU2VydmljZU5hbWUgPSBuZXcgUU5hbWUoIlNwcmluZ0V4YW1wbGUiKTsKLQotICAgIHByaXZhdGUgUU5hbWUgc3ByaW5nT3BlcmF0aW9uTmFtZSA9IG5ldyBRTmFtZSgiZ2V0VmFsdWUiKTsKLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgcmV0dXJuIGdldFRlc3RTZXR1cChuZXcgVGVzdFN1aXRlKFNwcmluZ1NlcnZpY2VUZXN0LmNsYXNzKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICBBeGlzU2VydmljZSBzZXJ2aWNlID0KLSAgICAgICAgICAgICAgICBjcmVhdGVTcHJpbmdTZXJ2aWNlKHNwcmluZ1NlcnZpY2VOYW1lLCBuZXcgUmF3WE1MSU5PdXRNZXNzYWdlUmVjZWl2ZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmF4aXMyLmV4dGVuc2lvbnMuc3ByaW5nLnJlY2VpdmVycy5TcHJpbmdBcHBDb250ZXh0QXdhcmVPYmplY3RTdXBwbGllciIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3ByaW5nQXdhcmVTZXJ2aWNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmluZ09wZXJhdGlvbk5hbWUpOwotICAgICAgICBjcmVhdGVTcHJpbmdBcHBDdHgoc2VydmljZS5nZXRDbGFzc0xvYWRlcigpKTsKLSAgICAgICAgVXRpbFNlcnZlci5kZXBsb3lTZXJ2aWNlKHNlcnZpY2UpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFV0aWxTZXJ2ZXIudW5EZXBsb3lTZXJ2aWNlKHNwcmluZ1NlcnZpY2VOYW1lKTsKLSAgICAgICAgVXRpbFNlcnZlci51bkRlcGxveUNsaWVudFNlcnZpY2UoKTsKLSAgICB9Ci0KLSAgICAvLyBDYW4ndCB0ZXN0IFNwcmluZ1NlcnZsZXRDb250ZXh0U3VwcGxpZXIgQUZBSUsgY3V6IG5vdCBzdXJlIGhvdyB0byBnZXQgU2VydmxldENvbnRleHQKLSAgICAvLyB3aXRoIHRoaXMgdGVzdCBoYXJuZXNzLiBUaGUgaWRlYSBoZXJlIHRoZW4gaXMgdG8gdGVzdCB0aGUgYmFzaWMgaWRlYSB3aXRoIHRoZSAKLSAgICAvLyBhbHRlcm5hdGl2ZSBtZXRob2QsIFNwcmluZ0FwcENvbnRleHRBd2FyZU9iamVjdFN1cHBsaWVyLCB3aG9zZSBwdXJwb3NlIGlzIHRvCi0gICAgLy8gcnVuIGluIGEgbm9uLXNlcnZsZXQgY29udGFpbmVyIGVudmlyb25tZW50Ci0gICAgcHVibGljIHZvaWQgdGVzdFNwcmluZ0FwcENvbnRleHRBd2FyZU9iamVjdFN1cHBsaWVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgQXhpc1NlcnZpY2UgY2xpZW50U2VydmljZSA9Ci0gICAgICAgICAgICAgICAgY3JlYXRlU3ByaW5nU2VydmljZWZvckNsaWVudChzcHJpbmdTZXJ2aWNlTmFtZSwgbmV3IFJhd1hNTElOT3V0TWVzc2FnZVJlY2VpdmVyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5heGlzMi5leHRlbnNpb25zLnNwcmluZy5yZWNlaXZlcnMuU3ByaW5nQXBwQ29udGV4dEF3YXJlT2JqZWN0U3VwcGxpZXIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNwcmluZ0F3YXJlU2VydmljZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbmdPcGVyYXRpb25OYW1lKTsKLSAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnY29udGV4dCA9IFV0aWxTZXJ2ZXIuY3JlYXRlQ2xpZW50Q29uZmlndXJhdGlvbkNvbnRleHQoKTsKLSAgICAgICAgU2VydmljZUNsaWVudCBzZW5kZXIgPSBuZXcgU2VydmljZUNsaWVudChjb25maWdjb250ZXh0LCBjbGllbnRTZXJ2aWNlKTsKLQotICAgICAgICBPTUZhY3RvcnkgZmFjdG9yeSA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpOwotICAgICAgICBPTU5hbWVzcGFjZSBvbU5zID0gZmFjdG9yeS5jcmVhdGVPTU5hbWVzcGFjZSgKLSAgICAgICAgICAgICAgICAiaHR0cDovL3NwcmluZ0V4YW1wbGUub3JnL2V4YW1wbGUxIiwgImV4YW1wbGUxIik7Ci0KLSAgICAgICAgT01FbGVtZW50IG1ldGhvZCA9IGZhY3RvcnkuY3JlYXRlT01FbGVtZW50KCJnZXRWYWx1ZSIsIG9tTnMpOwotICAgICAgICBPTUVsZW1lbnQgdmFsdWUgPSBmYWN0b3J5LmNyZWF0ZU9NRWxlbWVudCgiVGV4dCIsIG9tTnMpOwotICAgICAgICB2YWx1ZS5hZGRDaGlsZChmYWN0b3J5LmNyZWF0ZU9NVGV4dCh2YWx1ZSwgIlRlc3QgU3RyaW5nICIpKTsKLSAgICAgICAgbWV0aG9kLmFkZENoaWxkKHZhbHVlKTsKLQotICAgICAgICBPcHRpb25zIG9wdGlvbnMgPSBuZXcgT3B0aW9ucygpOwotICAgICAgICBvcHRpb25zLnNldFRyYW5zcG9ydEluUHJvdG9jb2woQ29uc3RhbnRzLlRSQU5TUE9SVF9IVFRQKTsKLSAgICAgICAgb3B0aW9ucy5zZXRUbyh0YXJnZXRFUFIpOwotICAgICAgICBvcHRpb25zLnNldEFjdGlvbihzcHJpbmdPcGVyYXRpb25OYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgc2VuZGVyLnNldE9wdGlvbnMob3B0aW9ucyk7Ci0KLSAgICAgICAgT01FbGVtZW50IHJlc3VsdCA9IHNlbmRlci5zZW5kUmVjZWl2ZShzcHJpbmdPcGVyYXRpb25OYW1lLCBtZXRob2QpOwotCi0gICAgICAgIFN0cmluZ1dyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgICAgIHJlc3VsdC5zZXJpYWxpemUoWE1MT3V0cHV0RmFjdG9yeS5uZXdJbnN0YW5jZSgpCi0gICAgICAgICAgICAgICAgLmNyZWF0ZVhNTFN0cmVhbVdyaXRlcih3cml0ZXIpKTsKLSAgICAgICAgd3JpdGVyLmZsdXNoKCk7Ci0gICAgICAgIFN0cmluZyB0ZXN0U3RyID0gd3JpdGVyLnRvU3RyaW5nKCk7Ci0gICAgICAgIC8vIHdyaXRlIHRvIHJlcG9ydAotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxudGVzdFNwcmluZ0FwcENvbnRleHRBd2FyZU9iamVjdFN1cHBsaWVyIHJlc3VsdDogIiArIHRlc3RTdHIpOwotICAgICAgICBhc3NlcnROb3RTYW1lKG5ldyBJbnRlZ2VyKHRlc3RTdHIuaW5kZXhPZigiZW1lcmdlIHRoeXNlbGYiKSksIG5ldyBJbnRlZ2VyKC0xKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBBeGlzU2VydmljZSBjcmVhdGVTcHJpbmdTZXJ2aWNlKFFOYW1lIHNwcmluZ1NlcnZpY2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlUmVjZWl2ZXIgbWVzc2FnZVJlY2VpdmVyLCBTdHJpbmcgc3VwcGxpZXJOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYmVhbk5hbWUsIFFOYW1lIG9wTmFtZSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0KLSAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSA9IG5ldyBBeGlzU2VydmljZShzcHJpbmdTZXJ2aWNlTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0KLSAgICAgICAgc2VydmljZS5zZXRDbGFzc0xvYWRlcihUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpKTsKLSAgICAgICAgc2VydmljZS5hZGRQYXJhbWV0ZXIobmV3IFBhcmFtZXRlcihDb25zdGFudHMuU0VSVklDRV9PQkpFQ1RfU1VQUExJRVIsIHN1cHBsaWVyTmFtZSkpOwotICAgICAgICBzZXJ2aWNlLmFkZFBhcmFtZXRlcihuZXcgUGFyYW1ldGVyKENvbnN0YW50cy5TRVJWSUNFX1RDQ0wsIENvbnN0YW50cy5UQ0NMX0NPTVBPU0lURSkpOwotICAgICAgICBzZXJ2aWNlLmFkZFBhcmFtZXRlcihuZXcgUGFyYW1ldGVyKAotICAgICAgICAgICAgICAgIFNwcmluZ0FwcENvbnRleHRBd2FyZU9iamVjdFN1cHBsaWVyLlNFUlZJQ0VfU1BSSU5HX0JFQU5OQU1FLCBiZWFuTmFtZSkpOwotCi0gICAgICAgIEF4aXNPcGVyYXRpb24gYXhpc09wID0gbmV3IEluT3V0QXhpc09wZXJhdGlvbihvcE5hbWUpOwotCi0gICAgICAgIGF4aXNPcC5zZXRNZXNzYWdlUmVjZWl2ZXIobWVzc2FnZVJlY2VpdmVyKTsKLSAgICAgICAgYXhpc09wLnNldFN0eWxlKFdTRExDb25zdGFudHMuU1RZTEVfUlBDKTsKLSAgICAgICAgc2VydmljZS5hZGRPcGVyYXRpb24oYXhpc09wKTsKLSAgICAgICAgc2VydmljZS5tYXBBY3Rpb25Ub09wZXJhdGlvbihDb25zdGFudHMuQVhJUzJfTkFNRVNQQUNFX1VSSSArICIvIiArIG9wTmFtZS5nZXRMb2NhbFBhcnQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzT3ApOwotCi0gICAgICAgIHJldHVybiBzZXJ2aWNlOwotICAgIH0KLQotICAgIHB1YmxpYyBBeGlzU2VydmljZSBjcmVhdGVTcHJpbmdTZXJ2aWNlZm9yQ2xpZW50KFFOYW1lIHNwcmluZ1NlcnZpY2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VSZWNlaXZlciBtZXNzYWdlUmVjZWl2ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHN1cHBsaWVyTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYmVhbk5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUU5hbWUgb3BOYW1lKQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgQXhpc1NlcnZpY2Uoc3ByaW5nU2VydmljZU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotCi0gICAgICAgIHNlcnZpY2Uuc2V0Q2xhc3NMb2FkZXIoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKSk7Ci0gICAgICAgIHNlcnZpY2UuYWRkUGFyYW1ldGVyKG5ldyBQYXJhbWV0ZXIoQ29uc3RhbnRzLlNFUlZJQ0VfT0JKRUNUX1NVUFBMSUVSLCBzdXBwbGllck5hbWUpKTsKLSAgICAgICAgc2VydmljZS5hZGRQYXJhbWV0ZXIobmV3IFBhcmFtZXRlcihDb25zdGFudHMuU0VSVklDRV9UQ0NMLCBDb25zdGFudHMuVENDTF9DT01QT1NJVEUpKTsKLSAgICAgICAgc2VydmljZS5hZGRQYXJhbWV0ZXIobmV3IFBhcmFtZXRlcigKLSAgICAgICAgICAgICAgICBTcHJpbmdBcHBDb250ZXh0QXdhcmVPYmplY3RTdXBwbGllci5TRVJWSUNFX1NQUklOR19CRUFOTkFNRSwgYmVhbk5hbWUpKTsKLQotICAgICAgICBBeGlzT3BlcmF0aW9uIGF4aXNPcCA9IG5ldyBPdXRJbkF4aXNPcGVyYXRpb24ob3BOYW1lKTsKLQotICAgICAgICBheGlzT3Auc2V0TWVzc2FnZVJlY2VpdmVyKG1lc3NhZ2VSZWNlaXZlcik7Ci0gICAgICAgIGF4aXNPcC5zZXRTdHlsZShXU0RMQ29uc3RhbnRzLlNUWUxFX1JQQyk7Ci0gICAgICAgIHNlcnZpY2UuYWRkT3BlcmF0aW9uKGF4aXNPcCk7Ci0KLSAgICAgICAgcmV0dXJuIHNlcnZpY2U7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY3JlYXRlU3ByaW5nQXBwQ3R4KENsYXNzTG9hZGVyIGNsKQotICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgQ2xhc3NQYXRoWG1sQXBwbGljYXRpb25Db250ZXh0IGN0eCA9IG5ldyBDbGFzc1BhdGhYbWxBcHBsaWNhdGlvbkNvbnRleHQoCi0gICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgIi9zcHJpbmcvYXBwbGljYXRpb25Db250ZXh0LnhtbCIgfSwgZmFsc2UpOwotICAgICAgICBjdHguc2V0Q2xhc3NMb2FkZXIoY2wpOwotICAgICAgICBjdHgucmVmcmVzaCgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zd2EvRWNob1Jhd1N3QUZpbGVDYWNoZVRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zd2EvRWNob1Jhd1N3QUZpbGVDYWNoZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGE3NGJhZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc3dhL0VjaG9SYXdTd0FGaWxlQ2FjaGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc3dhOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaW50ZWdyYXRpb24uVGVzdGluZ1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaW50ZWdyYXRpb24uVXRpbFNlcnZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuVXRpbHM7Ci0KLXB1YmxpYyBjbGFzcyBFY2hvUmF3U3dBRmlsZUNhY2hlVGVzdCBleHRlbmRzIEVjaG9SYXdTd0FUZXN0IHsKLQotICAgIHByaXZhdGUgQXhpc1NlcnZpY2Ugc2VydmljZTsKLQotCi0gICAgcHVibGljIEVjaG9SYXdTd0FGaWxlQ2FjaGVUZXN0KCkgewotICAgICAgICBzdXBlcihFY2hvUmF3U3dBRmlsZUNhY2hlVGVzdC5jbGFzcy5nZXROYW1lKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBFY2hvUmF3U3dBRmlsZUNhY2hlVGVzdChTdHJpbmcgdGVzdE5hbWUpIHsKLSAgICAgICAgc3VwZXIodGVzdE5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgcmV0dXJuIGdldFRlc3RTZXR1cDIobmV3IFRlc3RTdWl0ZShFY2hvUmF3U3dBRmlsZUNhY2hlVGVzdC5jbGFzcyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RpbmdVdGlscy5wcmVmaXhCYXNlRGlyZWN0b3J5KENvbnN0YW50cy5URVNUSU5HX1BBVEggKyAiU3dBLWZpbGVDYWNoZS1lbmFibGVkUmVwb3NpdG9yeSIpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzZXJ2aWNlID0gVXRpbHMuY3JlYXRlU2ltcGxlU2VydmljZShzZXJ2aWNlTmFtZSwgRWNob1N3QS5jbGFzcy5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbk5hbWUpOwotICAgICAgICBVdGlsU2VydmVyLmRlcGxveVNlcnZpY2Uoc2VydmljZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgVXRpbFNlcnZlci51bkRlcGxveVNlcnZpY2Uoc2VydmljZU5hbWUpOwotICAgICAgICBVdGlsU2VydmVyLnVuRGVwbG95Q2xpZW50U2VydmljZSgpOwotICAgIH0KLQotLy8gICAgcHVibGljIHZvaWQgdGVzdEVjaG9YTUxBU3luYygpIHRocm93cyBFeGNlcHRpb24gewotLy8gICAgICAgIHN1cGVyLnRlc3RFY2hvWE1MQVN5bmMoKTsKLS8vICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFY2hvWE1MU3luYygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci50ZXN0RWNob1hNTFN5bmMoKTsKLSAgICB9Ci0KLS8vICAgIHB1YmxpYyB2b2lkIHRlc3RFY2hvWE1MU3luY1NlcGVyYXRlTGlzdGVuZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vICAgICAgICBzdXBlci50ZXN0RWNob1hNTFN5bmNTZXBlcmF0ZUxpc3RlbmVyKCk7Ci0vLyAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc3dhL0VjaG9SYXdTd0FGaWxlSW5wdXRUZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc3dhL0VjaG9SYXdTd0FGaWxlSW5wdXRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAzYmIxM2QuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3N3YS9FY2hvUmF3U3dBRmlsZUlucHV0VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zd2E7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uSW5PdXRBeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaW50ZWdyYXRpb24uVGVzdGluZ1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaW50ZWdyYXRpb24uVXRpbFNlcnZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmludGVncmF0aW9uLlV0aWxTZXJ2ZXJCYXNlZFRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLlJhd1hNTElOT3V0TWVzc2FnZVJlY2VpdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMQ29uc3RhbnRzOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5Tb2NrZXQ7Ci1pbXBvcnQgamF2YS5uZXQuU29ja2V0RXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgRWNob1Jhd1N3QUZpbGVJbnB1dFRlc3QgZXh0ZW5kcyBVdGlsU2VydmVyQmFzZWRUZXN0Q2FzZSB7Ci0KLSAgICBwcml2YXRlIFFOYW1lIHNlcnZpY2VOYW1lID0gbmV3IFFOYW1lKCJFY2hvU3dBU2VydmljZSIpOwotCi0gICAgcHJpdmF0ZSBRTmFtZSBvcGVyYXRpb25OYW1lID0gbmV3IFFOYW1lKCJlY2hvQXR0YWNobWVudCIpOwotCi0gICAgcHVibGljIEVjaG9SYXdTd0FGaWxlSW5wdXRUZXN0KCkgewotICAgICAgICBzdXBlcihFY2hvUmF3U3dBRmlsZUlucHV0VGVzdC5jbGFzcy5nZXROYW1lKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBFY2hvUmF3U3dBRmlsZUlucHV0VGVzdChTdHJpbmcgdGVzdE5hbWUpIHsKLSAgICAgICAgc3VwZXIodGVzdE5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgcmV0dXJuIGdldFRlc3RTZXR1cDIobmV3IFRlc3RTdWl0ZShFY2hvUmF3U3dBRmlsZUlucHV0VGVzdC5jbGFzcyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RpbmdVdGlscy5wcmVmaXhCYXNlRGlyZWN0b3J5KENvbnN0YW50cy5URVNUSU5HX1BBVEggKyAiTVRPTS1lbmFibGVkUmVwb3NpdG9yeSIpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBBeGlzU2VydmljZSBzZXJ2aWNlID0gbmV3IEF4aXNTZXJ2aWNlKHNlcnZpY2VOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgc2VydmljZS5zZXRDbGFzc0xvYWRlcihUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpKTsKLSAgICAgICAgc2VydmljZS5hZGRQYXJhbWV0ZXIobmV3IFBhcmFtZXRlcigKLSAgICAgICAgICAgICAgICBDb25zdGFudHMuU0VSVklDRV9DTEFTUywgRWNob1N3QS5jbGFzcwotICAgICAgICAgICAgICAgIC5nZXROYW1lKCkpKTsKLSAgICAgICAgQXhpc09wZXJhdGlvbiBheGlzT3AgPSBuZXcgSW5PdXRBeGlzT3BlcmF0aW9uKG9wZXJhdGlvbk5hbWUpOwotICAgICAgICBheGlzT3Auc2V0TWVzc2FnZVJlY2VpdmVyKG5ldyBSYXdYTUxJTk91dE1lc3NhZ2VSZWNlaXZlcigpKTsKLSAgICAgICAgYXhpc09wLnNldFN0eWxlKFdTRExDb25zdGFudHMuU1RZTEVfRE9DKTsKLSAgICAgICAgc2VydmljZS5hZGRPcGVyYXRpb24oYXhpc09wKTsKLSAgICAgICAgVXRpbFNlcnZlci5kZXBsb3lTZXJ2aWNlKHNlcnZpY2UpOwotCi0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgVXRpbFNlcnZlci51bkRlcGxveVNlcnZpY2Uoc2VydmljZU5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFY2hvWE1MU3luYygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTb2NrZXQgc29ja2V0ID0gbmV3IFNvY2tldCgiMTI3LjAuMC4xIiwgNTU1NSk7Ci0gICAgICAgIE91dHB1dFN0cmVhbSBvdXRTdHJlYW0gPSBzb2NrZXQuZ2V0T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgIHNvY2tldC5nZXRJbnB1dFN0cmVhbSgpOwotICAgICAgICBJbnB1dFN0cmVhbSByZXF1ZXN0TXNnSW5TdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKFRlc3RpbmdVdGlscy5wcmVmaXhCYXNlRGlyZWN0b3J5KCJ0ZXN0LXJlc291cmNlcy9zd2Evc3dhaW5wdXQuYmluIikpOwotICAgICAgICBpbnQgZGF0YTsKLSAgICAgICAgd2hpbGUgKChkYXRhID0gcmVxdWVzdE1zZ0luU3RyZWFtLnJlYWQoKSkgIT0gLTEpIHsKLSAgICAgICAgICAgIG91dFN0cmVhbS53cml0ZShkYXRhKTsKLSAgICAgICAgfQotICAgICAgICBvdXRTdHJlYW0uZmx1c2goKTsKLSAgICAgICAgc29ja2V0LnNodXRkb3duT3V0cHV0KCk7Ci0gICAgICAgIEJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoc29ja2V0Ci0gICAgICAgICAgICAgICAgLmdldElucHV0U3RyZWFtKCkpKTsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0gICAgICAgIFN0cmluZyByZXNwb25zZSA9IHJlYWRlci5yZWFkTGluZSgpOwotICAgICAgICB3aGlsZSAobnVsbCAhPSByZXNwb25zZSkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQocmVzcG9uc2UudHJpbSgpKTsKLSAgICAgICAgICAgICAgICByZXNwb25zZSA9IHJlYWRlci5yZWFkTGluZSgpOwotICAgICAgICAgICAgfSBjYXRjaCAoU29ja2V0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGFzc2VydFRydWUoc2IudG9TdHJpbmcoKS5pbmRleE9mKAotICAgICAgICAgICAgICAgICJBcGFjaGUgQXhpczIgLSBUaGUgTkV4dCBHZW5lcmF0aW9uIFdlYiBTZXJ2aWNlcyBFbmdpbmUiKSA+IDApOwotICAgICAgICBhc3NlcnRUcnVlKHNiLnRvU3RyaW5nKCkuaW5kZXhPZigibXVsdGlwYXJ0L3JlbGF0ZWQiKSA+IDApOwotICAgIH0KLQotICAgIHByaXZhdGUgSW5wdXRTdHJlYW0gZ2V0UmVzb3VyY2VBc1N0cmVhbShTdHJpbmcgcGF0aCkgewotICAgICAgICByZXR1cm4gdGhpcy5nZXRDbGFzcygpLmdldFJlc291cmNlQXNTdHJlYW0ocGF0aCk7Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zd2EvRWNob1Jhd1N3QVRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zd2EvRWNob1Jhd1N3QVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRlMTQzYS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc3dhL0VjaG9SYXdTd0FUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnN3YTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01UZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5sbG9tLk9NVGV4dEltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVAxMUNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5PcGVyYXRpb25DbGllbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuT3B0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5TZXJ2aWNlQ2xpZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLnV0aWwuVGVzdENvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmludGVncmF0aW9uLlRlc3RpbmdVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmludGVncmF0aW9uLlV0aWxTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pbnRlZ3JhdGlvbi5VdGlsU2VydmVyQmFzZWRUZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC5hY3RpdmF0aW9uLkRhdGFIYW5kbGVyOwotaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRmlsZURhdGFTb3VyY2U7Ci0KLXB1YmxpYyBjbGFzcyBFY2hvUmF3U3dBVGVzdCBleHRlbmRzIFV0aWxTZXJ2ZXJCYXNlZFRlc3RDYXNlIGltcGxlbWVudHMgVGVzdENvbnN0YW50cyB7Ci0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhFY2hvUmF3U3dBVGVzdC5jbGFzcyk7Ci0KLSAgICBwcml2YXRlIEF4aXNTZXJ2aWNlIHNlcnZpY2U7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gZmluaXNoID0gZmFsc2U7Ci0KLSAgICBwdWJsaWMgRWNob1Jhd1N3QVRlc3QoKSB7Ci0gICAgICAgIHN1cGVyKEVjaG9SYXdTd0FUZXN0LmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIEVjaG9SYXdTd0FUZXN0KFN0cmluZyB0ZXN0TmFtZSkgewotICAgICAgICBzdXBlcih0ZXN0TmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotICAgICAgICByZXR1cm4gZ2V0VGVzdFNldHVwMihuZXcgVGVzdFN1aXRlKEVjaG9SYXdTd0FUZXN0LmNsYXNzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVzdGluZ1V0aWxzLnByZWZpeEJhc2VEaXJlY3RvcnkoQ29uc3RhbnRzLlRFU1RJTkdfUEFUSCArICJTd0EtZW5hYmxlZFJlcG9zaXRvcnkiKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc2VydmljZSA9IFV0aWxzLmNyZWF0ZVNpbXBsZVNlcnZpY2Uoc2VydmljZU5hbWUsIEVjaG9Td0EuY2xhc3MuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25OYW1lKTsKLSAgICAgICAgVXRpbFNlcnZlci5kZXBsb3lTZXJ2aWNlKHNlcnZpY2UpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFV0aWxTZXJ2ZXIudW5EZXBsb3lTZXJ2aWNlKHNlcnZpY2VOYW1lKTsKLSAgICAgICAgVXRpbFNlcnZlci51bkRlcGxveUNsaWVudFNlcnZpY2UoKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU09BUEVudmVsb3BlIGNyZWF0ZUVudmVsb3BlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFNPQVBGYWN0b3J5IGZhYyA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMUZhY3RvcnkoKTsKLSAgICAgICAgU09BUEVudmVsb3BlIGVudiA9IGZhYy5nZXREZWZhdWx0RW52ZWxvcGUoKTsKLQotICAgICAgICBPTU5hbWVzcGFjZSBvbU5zID0gZmFjLmNyZWF0ZU9NTmFtZXNwYWNlKCJodHA6Ly9sb2NhbGhvc3QvbXkiLCAibXkiKTsKLSAgICAgICAgT01FbGVtZW50IHJwY1dyYXBFbGUgPSBmYWMuY3JlYXRlT01FbGVtZW50KCJlY2hvT01FbGVtZW50Iiwgb21Ocyk7Ci0gICAgICAgIE9NRWxlbWVudCBkYXRhID0gZmFjLmNyZWF0ZU9NRWxlbWVudCgiZGF0YSIsIG9tTnMpOwotICAgICAgICBPTVRleHQgdGV4dERhdGEgPSBmYWMuY3JlYXRlT01UZXh0KCJBcGFjaGUgQXhpczIgUm9ja3MgISEhIik7Ci0gICAgICAgIGRhdGEuYWRkQ2hpbGQodGV4dERhdGEpOwotICAgICAgICBycGNXcmFwRWxlLmFkZENoaWxkKGRhdGEpOwotCi0gICAgICAgIGVudi5nZXRCb2R5KCkuYWRkQ2hpbGQocnBjV3JhcEVsZSk7Ci0gICAgICAgIHJldHVybiBlbnY7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RWNob1hNTFN5bmMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICBPcHRpb25zIG9wdGlvbnMgPSBuZXcgT3B0aW9ucygpOwotICAgICAgICBvcHRpb25zLnNldFRvKHRhcmdldEVQUik7Ci0gICAgICAgIG9wdGlvbnMuc2V0UHJvcGVydHkoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uRU5BQkxFX1NXQSwgQ29uc3RhbnRzLlZBTFVFX1RSVUUpOwotICAgICAgICBvcHRpb25zLnNldFRyYW5zcG9ydEluUHJvdG9jb2woQ29uc3RhbnRzLlRSQU5TUE9SVF9IVFRQKTsKLSAgICAgICAgb3B0aW9ucy5zZXRTb2FwVmVyc2lvblVSSShTT0FQMTFDb25zdGFudHMuU09BUF9FTlZFTE9QRV9OQU1FU1BBQ0VfVVJJKTsKLSAgICAgICAgb3B0aW9ucy5zZXRUaW1lT3V0SW5NaWxsaVNlY29uZHMoMTAwMDAwKTsKLSAgICAgICAgb3B0aW9ucy5zZXRBY3Rpb24oQ29uc3RhbnRzLkFYSVMyX05BTUVTUEFDRV9VUkkgKyAiLyIgKyBvcGVyYXRpb25OYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgb3B0aW9ucy5zZXRUbyh0YXJnZXRFUFIpOwotCi0gICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQgPQotICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeS5jcmVhdGVDb25maWd1cmF0aW9uQ29udGV4dEZyb21GaWxlU3lzdGVtKAotICAgICAgICAgICAgICAgICAgICAgICAgVGVzdGluZ1V0aWxzLnByZWZpeEJhc2VEaXJlY3RvcnkoInRhcmdldC90ZXN0LXJlc291cmNlcy9pbnRlZ3JhdGlvblJlcG8iKSwgbnVsbCk7Ci0KLSAgICAgICAgU2VydmljZUNsaWVudCBzZW5kZXIgPSBuZXcgU2VydmljZUNsaWVudChjb25maWdDb250ZXh0LCBudWxsKTsKLSAgICAgICAgc2VuZGVyLnNldE9wdGlvbnMob3B0aW9ucyk7Ci0gICAgICAgIE9wZXJhdGlvbkNsaWVudCBtZXBDbGllbnQgPSBzZW5kZXIuY3JlYXRlQ2xpZW50KFNlcnZpY2VDbGllbnQuQU5PTl9PVVRfSU5fT1ApOwotCi0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1jID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIG1jLnNldEVudmVsb3BlKGNyZWF0ZUVudmVsb3BlKCkpOwotICAgICAgICBGaWxlRGF0YVNvdXJjZSBmaWxlRGF0YVNvdXJjZSA9IG5ldyBGaWxlRGF0YVNvdXJjZShUZXN0aW5nVXRpbHMucHJlZml4QmFzZURpcmVjdG9yeSgidGVzdC1yZXNvdXJjZXMvbXRvbS90ZXN0LmpwZyIpKTsKLSAgICAgICAgRGF0YUhhbmRsZXIgZGF0YUhhbmRsZXIgPSBuZXcgRGF0YUhhbmRsZXIoZmlsZURhdGFTb3VyY2UpOwotICAgICAgICBtYy5hZGRBdHRhY2htZW50KCJGaXJzdEF0dGFjaG1lbnQiLCBkYXRhSGFuZGxlcik7Ci0KLSAgICAgICAgbWVwQ2xpZW50LmFkZE1lc3NhZ2VDb250ZXh0KG1jKTsKLSAgICAgICAgbWVwQ2xpZW50LmV4ZWN1dGUodHJ1ZSk7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IHJlc3BvbnNlID0gbWVwQ2xpZW50LmdldE1lc3NhZ2VDb250ZXh0KFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9JTl9WQUxVRSk7Ci0gICAgICAgIERhdGFIYW5kbGVyIGRhdGFIYW5kbGVyMiA9IHJlc3BvbnNlLmdldEF0dGFjaG1lbnQoIkZpcnN0QXR0YWNobWVudCIpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGRhdGFIYW5kbGVyKTsKLSAgICAgICAgY29tcGFyZURhdGFIYW5kbGVycyhkYXRhSGFuZGxlciwgZGF0YUhhbmRsZXIyKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjb21wYXJlRGF0YUhhbmRsZXJzKERhdGFIYW5kbGVyIGRhdGFIYW5kbGVyLCBEYXRhSGFuZGxlciBkYXRhSGFuZGxlcjIpIHsKLSAgICAgICAgU3RyaW5nIG9yaWdpbmFsVGV4dFZhbHVlID0gbmV3IE9NVGV4dEltcGwoZGF0YUhhbmRsZXIsIHRydWUsIG51bGwpLmdldFRleHQoKTsKLSAgICAgICAgU3RyaW5nIHJldHVybmVkVGV4dFZhbHVlID0gbmV3IE9NVGV4dEltcGwoZGF0YUhhbmRsZXIyLCB0cnVlLCBudWxsKS5nZXRUZXh0KCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXR1cm5lZFRleHRWYWx1ZSwgb3JpZ2luYWxUZXh0VmFsdWUpOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc3dhL0VjaG9Td0EuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zd2EvRWNob1N3QS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzEwOTgxLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zd2EvRWNob1N3QS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnN3YTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uYXR0YWNobWVudHMuQXR0YWNobWVudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NVGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5PTVRleHRJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuV1NETENvbnN0YW50czsKLQotaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXI7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotLyoqIEB2ZXJzaW9uICRSZXY6ICQgJERhdGU6ICQgKi8KLQotcHVibGljIGNsYXNzIEVjaG9Td0EgewotCi0gICAgcHVibGljIEVjaG9Td0EoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIE9NRWxlbWVudCBlY2hvQXR0YWNobWVudChPTUVsZW1lbnQgb21FbGUpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBPTUVsZW1lbnQgY2hpbGQgPSAoT01FbGVtZW50KW9tRWxlLmdldEZpcnN0T01DaGlsZCgpOwotICAgICAgICBPTUF0dHJpYnV0ZSBhdHRyID0gY2hpbGQuZ2V0QXR0cmlidXRlKG5ldyBRTmFtZSgiaHJlZiIpKTsKLSAgICAgICAgU3RyaW5nIGNvbnRlbnRJRCA9IGF0dHIuZ2V0QXR0cmlidXRlVmFsdWUoKTsKLSAgICAgICAgY29udGVudElEID0gY29udGVudElELnRyaW0oKTsKLSAgICAgICAgaWYgKGNvbnRlbnRJRC5zdWJzdHJpbmcoMCwgMykuZXF1YWxzSWdub3JlQ2FzZSgiY2lkIikpIHsKLSAgICAgICAgICAgIGNvbnRlbnRJRCA9IGNvbnRlbnRJRC5zdWJzdHJpbmcoNCk7Ci0gICAgICAgIH0KLQotICAgICAgICBNZXNzYWdlQ29udGV4dCBtc2dDdHggPSBNZXNzYWdlQ29udGV4dC5nZXRDdXJyZW50TWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgQXR0YWNobWVudHMgYXR0YWNobWVudCA9IChtc2dDdHgpLmdldEF0dGFjaG1lbnRNYXAoKTsKLQotICAgICAgICBEYXRhSGFuZGxlciBkYXRhSGFuZGxlciA9IGF0dGFjaG1lbnQuZ2V0RGF0YUhhbmRsZXIoY29udGVudElEKTsKLSAgICAgICAgT01UZXh0IHRleHROb2RlID0gbmV3IE9NVGV4dEltcGwoZGF0YUhhbmRsZXIsIG9tRWxlLmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgb21FbGUuYnVpbGQoKTsKLSAgICAgICAgY2hpbGQuZGV0YWNoKCk7Ci0gICAgICAgIG9tRWxlLmFkZENoaWxkKHRleHROb2RlKTsKLSAgICAgICAgcmV0dXJuIG9tRWxlOwotICAgIH0KLQotICAgIHB1YmxpYyBPTUVsZW1lbnQgZWNob09NRWxlbWVudChPTUVsZW1lbnQgb21FbGUpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBPTUVsZW1lbnQgY2hpbGQgPSAoT01FbGVtZW50KW9tRWxlLmdldEZpcnN0T01DaGlsZCgpOwotICAgICAgICBNZXNzYWdlQ29udGV4dCBtc2dDdHggPSBNZXNzYWdlQ29udGV4dC5nZXRDdXJyZW50TWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgQXR0YWNobWVudHMgYXR0YWNobWVudCA9IChtc2dDdHgpLmdldEF0dGFjaG1lbnRNYXAoKTsKLSAgICAgICAgbXNnQ3R4LnJlbW92ZUF0dGFjaG1lbnQoYXR0YWNobWVudC5nZXRTT0FQUGFydENvbnRlbnRJRCgpKTsKLSAgICAgICAgbXNnQ3R4LmdldE9wZXJhdGlvbkNvbnRleHQoKS5nZXRNZXNzYWdlQ29udGV4dCgKLSAgICAgICAgICAgICAgICBXU0RMQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfT1VUX1ZBTFVFKS5zZXRBdHRhY2htZW50TWFwKGF0dGFjaG1lbnQpOwotCi0gICAgICAgIG9tRWxlLmJ1aWxkKCk7Ci0gICAgICAgIHJldHVybiBvbUVsZTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3N3YS9zd2FpbnB1dC5iaW4gYi92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc3dhL3N3YWlucHV0LmJpbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM1Nzc5Ni4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc3dhL3N3YWlucHV0LmJpbgorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLVBPU1QgL2F4aXMyL3NlcnZpY2VzL0VjaG9Td0FTZXJ2aWNlL2VjaG9BdHRhY2htZW50IEhUVFAvMS4wDQotQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvcmVsYXRlZDsgdHlwZT0idGV4dC94bWwiOyBzdGFydD0iPDlENjQ1QzhFQkI4MzdDRTU0QUJEMDI3QTM2NTk1MzVEPiI7IAlib3VuZGFyeT0iLS0tLT1fUGFydF8wXzE5Nzc1MTEuMTEyMzE2MzU3MTEzOCINCi1BY2NlcHQ6IGFwcGxpY2F0aW9uL3NvYXAreG1sLCBhcHBsaWNhdGlvbi9kaW1lLCBtdWx0aXBhcnQvcmVsYXRlZCwgdGV4dC8qDQotVXNlci1BZ2VudDogQXhpcy8xLjIuMQ0KLUhvc3Q6IDEyNy4wLjAuMTo4MDgxDQotQ2FjaGUtQ29udHJvbDogbm8tY2FjaGUNCi1QcmFnbWE6IG5vLWNhY2hlDQotQ29ubmVjdGlvbjogY2xvc2UNCi1TT0FQQWN0aW9uOiAiIg0KLQ0KLQ0KLS0tLS0tLT1fUGFydF8wXzE5Nzc1MTEuMTEyMzE2MzU3MTEzOA0KLUNvbnRlbnQtVHlwZTogdGV4dC94bWw7IGNoYXJzZXQ9VVRGLTgNCi1Db250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBiaW5hcnkNCi1Db250ZW50LUlkOiA8OUQ2NDVDOEVCQjgzN0NFNTRBQkQwMjdBMzY1OTUzNUQ+DQotDQotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c29hcGVudjpFbnZlbG9wZSB4bWxuczpzb2FwZW52PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyIgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI+PHNvYXBlbnY6Qm9keT48ZWNob0F0dGFjaG1lbnQgeG1sbnM9IiI+PHNvdXJjZSBocmVmPSJjaWQ6MzkzNkFFMTlGQkVENTVBRTQ2MjBCODFDNzNCREQ3NkUiIHhtbG5zPSIiLz48L2VjaG9BdHRhY2htZW50Pjwvc29hcGVudjpCb2R5Pjwvc29hcGVudjpFbnZlbG9wZT4NCi0tLS0tLS09X1BhcnRfMF8xOTc3NTExLjExMjMxNjM1NzExMzgNCi1Db250ZW50LVR5cGU6IHRleHQvcGxhaW4NCi1Db250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBiaW5hcnkNCi1Db250ZW50LUlkOiA8MzkzNkFFMTlGQkVENTVBRTQ2MjBCODFDNzNCREQ3NkU+DQotDQotQXBhY2hlIEF4aXMyIC0gVGhlIE5FeHQgR2VuZXJhdGlvbiBXZWIgU2VydmljZXMgRW5naW5lDQotDQotLS0tLS0tPV9QYXJ0XzBfMTk3NzUxMS4xMTIzMTYzNTcxMTM4LS0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvTm9uUHJveHlIb3N0VGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL05vblByb3h5SG9zdFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjk1Y2M2NS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvTm9uUHJveHlIb3N0VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cDsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOw0KLQ0KLXB1YmxpYyBjbGFzcyBOb25Qcm94eUhvc3RUZXN0IGV4dGVuZHMgVGVzdENhc2Ugew0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Rm9yQXhpczJfMzQ1MygpIHsNCi0gICAgICAgIFN0cmluZyBub25Qcm94eUhvc3RzID0gInNlYWxib29rLm5jbC5hYy51a3wqLnNlYWxib29rLm5jbC5hYy51a3xlc2tkYWxlLm5jbC5hYy51a3wqLmVza2RhbGUubmNsLmFjLnVrfGdpZ2EyNS5uY2wuYWMudWt8Ki5naWdhMjUubmNsLmFjLnVrIjsNCi0gICAgICAgIGFzc2VydFRydWUoUHJveHlDb25maWd1cmF0aW9uLmlzSG9zdEluTm9uUHJveHlMaXN0KCJzZWFsYm9vay5uY2wuYWMudWsiLCBub25Qcm94eUhvc3RzKSk7DQotICAgICAgICBhc3NlcnRGYWxzZShQcm94eUNvbmZpZ3VyYXRpb24uaXNIb3N0SW5Ob25Qcm94eUxpc3QoInhzZWFsYm9vay5uY2wuYWMudWsiLCBub25Qcm94eUhvc3RzKSk7DQotICAgICAgICBhc3NlcnRUcnVlKFByb3h5Q29uZmlndXJhdGlvbi5pc0hvc3RJbk5vblByb3h5TGlzdCgibG9jYWwiLCJsb2NhbHwqLmxvY2FsfDE2OS4yNTQvMTZ8Ki4xNjkuMjU0LzE2IikpOw0KLSAgICAgICAgYXNzZXJ0RmFsc2UoUHJveHlDb25maWd1cmF0aW9uLmlzSG9zdEluTm9uUHJveHlMaXN0KCJsb2NhbGhvc3QiLCJsb2NhbHwqLmxvY2FsfDE2OS4yNTQvMTZ8Ki4xNjkuMjU0LzE2IikpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9UZXN0U2VydmxldFJlcXVlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9UZXN0U2VydmxldFJlcXVlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZhZDIxYS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvVGVzdFNlcnZsZXRSZXF1ZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cDsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOw0KLQ0KLWltcG9ydCBqYXZheC5zZXJ2bGV0LlJlcXVlc3REaXNwYXRjaGVyOw0KLWltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRJbnB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkNvb2tpZTsNCi1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsNCi1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uOw0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOw0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247DQotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpbmNpcGFsOw0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247DQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7DQotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoNCi0gKiBOb3RlIHRoYXQgT05MWSB0aGUgbWV0aG9kcyB1c2VkIGJ5IFRyYW5zcG9ydEhlYWRlcnMgYXJlIGltcGxlbWVudGVkIQ0KLSAqLw0KLWNsYXNzIFRlc3RTZXJ2bGV0UmVxdWVzdCBpbXBsZW1lbnRzIEh0dHBTZXJ2bGV0UmVxdWVzdCB7DQotDQotICAgIHByaXZhdGUgSGFzaHRhYmxlIGhlYWRlcnMgPSBudWxsOw0KLQ0KLSAgICBUZXN0U2VydmxldFJlcXVlc3QoKSB7DQotICAgICAgICBoZWFkZXJzID0gbmV3IEhhc2h0YWJsZSgpOw0KLSAgICAgICAgaGVhZGVycy5wdXQoImhlYWRlcjEiLCAiaDFWYWx1ZSIpOw0KLSAgICAgICAgaGVhZGVycy5wdXQoImhlYWRlcjIiLCAiaDJWYWx1ZSIpOw0KLSAgICAgICAgaGVhZGVycy5wdXQoImhlYWRlcjMiLCAiaDNWYWx1ZSIpOw0KLSAgICB9DQotDQotDQotICAgIHB1YmxpYyBpbnQgZ2V0UmVtb3RlUG9ydCgpIHsNCi0gICAgICAgIHJldHVybiAwOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxBZGRyKCkgew0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRMb2NhbE5hbWUoKSB7DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgaW50IGdldExvY2FsUG9ydCgpIHsNCi0gICAgICAgIHJldHVybiAwOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXV0aFR5cGUoKSB7DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENvbnRleHRQYXRoKCkgew0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIENvb2tpZVtdIGdldENvb2tpZXMoKSB7DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgbG9uZyBnZXREYXRlSGVhZGVyKFN0cmluZyBzKSB7DQotICAgICAgICByZXR1cm4gMDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEhlYWRlcihTdHJpbmcgcykgew0KLSAgICAgICAgcmV0dXJuIChTdHJpbmcpIGhlYWRlcnMuZ2V0KHMpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRIZWFkZXJOYW1lcygpIHsNCi0gICAgICAgIHJldHVybiBoZWFkZXJzLmtleXMoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0SGVhZGVycyhTdHJpbmcgcykgew0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGludCBnZXRJbnRIZWFkZXIoU3RyaW5nIHMpIHsNCi0gICAgICAgIHJldHVybiAwOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWV0aG9kKCkgew0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRQYXRoSW5mbygpIHsNCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aFRyYW5zbGF0ZWQoKSB7DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFF1ZXJ5U3RyaW5nKCkgew0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRSZW1vdGVVc2VyKCkgew0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRSZXF1ZXN0VVJJKCkgew0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZ0J1ZmZlciBnZXRSZXF1ZXN0VVJMKCkgew0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRSZXF1ZXN0ZWRTZXNzaW9uSWQoKSB7DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNlcnZsZXRQYXRoKCkgew0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEh0dHBTZXNzaW9uIGdldFNlc3Npb24oKSB7DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgSHR0cFNlc3Npb24gZ2V0U2Vzc2lvbihib29sZWFuIGZsYWcpIHsNCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBQcmluY2lwYWwgZ2V0VXNlclByaW5jaXBhbCgpIHsNCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzUmVxdWVzdGVkU2Vzc2lvbklkRnJvbUNvb2tpZSgpIHsNCi0gICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1JlcXVlc3RlZFNlc3Npb25JZEZyb21VUkwoKSB7DQotICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaXNSZXF1ZXN0ZWRTZXNzaW9uSWRGcm9tVXJsKCkgew0KLSAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzUmVxdWVzdGVkU2Vzc2lvbklkVmFsaWQoKSB7DQotICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaXNVc2VySW5Sb2xlKFN0cmluZyBzKSB7DQotICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE9iamVjdCBnZXRBdHRyaWJ1dGUoU3RyaW5nIHMpIHsNCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRBdHRyaWJ1dGVOYW1lcygpIHsNCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2hhcmFjdGVyRW5jb2RpbmcoKSB7DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgaW50IGdldENvbnRlbnRMZW5ndGgoKSB7DQotICAgICAgICByZXR1cm4gMDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRUeXBlKCkgew0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFNlcnZsZXRJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTG9jYWxlIGdldExvY2FsZSgpIHsNCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRMb2NhbGVzKCkgew0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRQYXJhbWV0ZXIoU3RyaW5nIHMpIHsNCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBNYXAgZ2V0UGFyYW1ldGVyTWFwKCkgew0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEVudW1lcmF0aW9uIGdldFBhcmFtZXRlck5hbWVzKCkgew0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZ1tdIGdldFBhcmFtZXRlclZhbHVlcyhTdHJpbmcgcykgew0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm90b2NvbCgpIHsNCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBCdWZmZXJlZFJlYWRlciBnZXRSZWFkZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRSZWFsUGF0aChTdHJpbmcgcykgew0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRSZW1vdGVBZGRyKCkgew0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRSZW1vdGVIb3N0KCkgew0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFJlcXVlc3REaXNwYXRjaGVyIGdldFJlcXVlc3REaXNwYXRjaGVyKFN0cmluZyBzKSB7DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNjaGVtZSgpIHsNCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmVyTmFtZSgpIHsNCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBpbnQgZ2V0U2VydmVyUG9ydCgpIHsNCi0gICAgICAgIHJldHVybiAwOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzU2VjdXJlKCkgew0KLSAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZUF0dHJpYnV0ZShTdHJpbmcgcykgew0KLQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShTdHJpbmcgcywgT2JqZWN0IG9iaikgew0KLQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldENoYXJhY3RlckVuY29kaW5nKFN0cmluZyBzKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7DQotDQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL1RyYW5zcG9ydEhlYWRlcnNUZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvVHJhbnNwb3J0SGVhZGVyc1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjk4ZWVhNC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvVHJhbnNwb3J0SGVhZGVyc1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQotDQotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7DQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsNCi0NCi0vKioNCi0gKg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBUcmFuc3BvcnRIZWFkZXJzVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsNCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFNlcnZsZXRSZXF1ZXN0KCkgew0KLSAgICAgICAgLy8gVGhpcyBqdXN0IHZhbGlkYXRlcyB0aGF0IHRoZSBIdHRwU2VydmxldFJlcXVlc3QgdGVzdCBjbGFzcyBiZWxvdyB3b3JrcyBhcyBleHBlY3RlZA0KLSAgICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSA9IG5ldyBUZXN0U2VydmxldFJlcXVlc3QoKTsNCi0gICAgICAgIGFzc2VydEVxdWFscygiaDFWYWx1ZSIsIHJlcS5nZXRIZWFkZXIoImhlYWRlcjEiKSk7DQotICAgICAgICBhc3NlcnRFcXVhbHMoImgyVmFsdWUiLCByZXEuZ2V0SGVhZGVyKCJoZWFkZXIyIikpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJoM1ZhbHVlIiwgcmVxLmdldEhlYWRlcigiaGVhZGVyMyIpKTsNCi0gICAgICAgIGFzc2VydE51bGwocmVxLmdldEhlYWRlcigibmV3SGVhZGVyMSIpKTsNCi0gICAgICAgIGFzc2VydE51bGwocmVxLmdldEhlYWRlcigibmV3SGVhZGVyMiIpKTsNCi0NCi0gICAgICAgIEVudW1lcmF0aW9uIGhlYWRlcnMgPSByZXEuZ2V0SGVhZGVyTmFtZXMoKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwoaGVhZGVycyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdExvY2FsTWFwKCkgew0KLSAgICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSA9IG5ldyBUZXN0U2VydmxldFJlcXVlc3QoKTsNCi0gICAgICAgIFRyYW5zcG9ydEhlYWRlcnMgaGVhZGVycyA9IG5ldyBUcmFuc3BvcnRIZWFkZXJzKHJlcSk7DQotICAgICAgICBTdHJpbmcgY2hlY2tWYWx1ZSA9IG51bGw7DQotICAgICAgICBhc3NlcnROdWxsKGhlYWRlcnMuaGVhZGVyTWFwKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwoaGVhZGVycy5sb2NhbEhlYWRlck1hcCk7DQotICAgICAgICBhc3NlcnRUcnVlKGhlYWRlcnMubG9jYWxIZWFkZXJNYXAuaXNFbXB0eSgpKTsNCi0NCi0gICAgICAgIC8vIEFkZCBhIGhlYWRlciB0aGF0IGRvZXNuJ3QgZXhpc3QgaW4gdGhlIHNlcnZsZXQgcmVxdWVzdCBhbmQgbWFrZSBzdXJlIGl0IGRvZXNuJ3QNCi0gICAgICAgIC8vIHBvcHVsYXRlIHRoZSBoZWFkZXJNYXANCi0gICAgICAgIGhlYWRlcnMucHV0KCJuZXdIZWFkZXIxIiwgIm5ld0hlYWRlcjFWYWx1ZSIpOw0KLSAgICAgICAgY2hlY2tWYWx1ZSA9IChTdHJpbmcpIGhlYWRlcnMuZ2V0KCJuZXdIZWFkZXIxIik7DQotICAgICAgICBhc3NlcnROdWxsKGhlYWRlcnMuaGVhZGVyTWFwKTsNCi0gICAgICAgIGFzc2VydEZhbHNlKGhlYWRlcnMubG9jYWxIZWFkZXJNYXAuaXNFbXB0eSgpKTsNCi0gICAgICAgIGFzc2VydEVxdWFscygxLCBoZWFkZXJzLmxvY2FsSGVhZGVyTWFwLnNpemUoKSk7DQotICAgICAgICBhc3NlcnRFcXVhbHMoIm5ld0hlYWRlcjFWYWx1ZSIsIGNoZWNrVmFsdWUpOw0KLQ0KLSAgICAgICAgLy8gQWRkIGEgaGVhZGVyIHRoYXQgZG9lcyBleGlzdCBpbiB0aGUgc2VydmxldCByZXF1ZXN0IHdpdGggYSBuZXcgdmFsdWUgc3RpbGwgc2hvdWxkbid0DQotICAgICAgICAvLyBwb3B1bGF0ZQ0KLSAgICAgICAgaGVhZGVycy5wdXQoImhlYWRlcjMiLCAiaDNWYWx1ZU5ldyIpOw0KLSAgICAgICAgY2hlY2tWYWx1ZSA9IChTdHJpbmcpIGhlYWRlcnMuZ2V0KCJoZWFkZXIzIik7DQotICAgICAgICBhc3NlcnROdWxsKGhlYWRlcnMuaGVhZGVyTWFwKTsNCi0gICAgICAgIGFzc2VydEZhbHNlKGhlYWRlcnMubG9jYWxIZWFkZXJNYXAuaXNFbXB0eSgpKTsNCi0gICAgICAgIGFzc2VydEVxdWFscygyLCBoZWFkZXJzLmxvY2FsSGVhZGVyTWFwLnNpemUoKSk7DQotICAgICAgICBhc3NlcnRFcXVhbHMoImgzVmFsdWVOZXciLCBjaGVja1ZhbHVlKTsNCi0NCi0gICAgICAgIC8vIE5vdyBjYXVzZSB0aGUgbWFwIHRvIGJlIHBvcHVsYXRlZCBmcm9tIHRoZSBzZXJ2bGV0IHJlcXVlc3QNCi0gICAgICAgIGludCBzaXplID0gaGVhZGVycy5zaXplKCk7DQotICAgICAgICBhc3NlcnRFcXVhbHMoNCwgc2l6ZSk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKGhlYWRlcnMuaGVhZGVyTWFwKTsNCi0gICAgICAgIGFzc2VydE51bGwoaGVhZGVycy5sb2NhbEhlYWRlck1hcCk7DQotDQotICAgICAgICBhc3NlcnRFcXVhbHMoImgxVmFsdWUiLCAoU3RyaW5nKSBoZWFkZXJzLmdldCgiaGVhZGVyMSIpKTsNCi0gICAgICAgIGFzc2VydEVxdWFscygiaDJWYWx1ZSIsIChTdHJpbmcpIGhlYWRlcnMuZ2V0KCJoZWFkZXIyIikpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJoM1ZhbHVlTmV3IiwgKFN0cmluZykgaGVhZGVycy5nZXQoImhlYWRlcjMiKSk7DQotICAgICAgICBhc3NlcnRFcXVhbHMoIm5ld0hlYWRlcjFWYWx1ZSIsIChTdHJpbmcpIGhlYWRlcnMuZ2V0KCJuZXdIZWFkZXIxIikpOw0KLQ0KLSAgICAgICAgLy8gTm93IGRvIGFub3RoZXIgcHV0IG9mIGEgbmV3IHZhbHVlIGFuZCBtYWtlIHN1cmUgaXQgaXMgcHV0IGluIHRoZSBuZXdseSBwb3B1bGF0ZWQgaGFzaG1hcA0KLSAgICAgICAgaGVhZGVycy5wdXQoIm5ld0hlYWRlcjIiLCAibmV3SGVhZGVyMlZhbHVlIik7DQotICAgICAgICBjaGVja1ZhbHVlID0gKFN0cmluZykgaGVhZGVycy5nZXQoIm5ld0hlYWRlcjIiKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwoaGVhZGVycy5oZWFkZXJNYXApOw0KLSAgICAgICAgYXNzZXJ0TnVsbChoZWFkZXJzLmxvY2FsSGVhZGVyTWFwKTsNCi0gICAgICAgIHNpemUgPSBoZWFkZXJzLnNpemUoKTsNCi0gICAgICAgIGFzc2VydEVxdWFscyg1LCBzaXplKTsNCi0gICAgICAgIGFzc2VydEVxdWFscygibmV3SGVhZGVyMlZhbHVlIiwgY2hlY2tWYWx1ZSk7DQotDQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdE5vUG9wdWxhdGVPbkdldCgpIHsNCi0gICAgICAgIC8vIERvaW5nIGEgZ2V0IGJlZm9yZSBhIHB1dCBzaG91bGRuJ3QgZXhwYW5kIHRoZSBoZWFkZXJNYXAuDQotICAgICAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxID0gbmV3IFRlc3RTZXJ2bGV0UmVxdWVzdCgpOw0KLSAgICAgICAgVHJhbnNwb3J0SGVhZGVycyBoZWFkZXJzID0gbmV3IFRyYW5zcG9ydEhlYWRlcnMocmVxKTsNCi0gICAgICAgIFN0cmluZyBjaGVja1ZhbHVlID0gbnVsbDsNCi0gICAgICAgIGFzc2VydE51bGwoaGVhZGVycy5oZWFkZXJNYXApOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChoZWFkZXJzLmxvY2FsSGVhZGVyTWFwKTsNCi0gICAgICAgIGFzc2VydFRydWUoaGVhZGVycy5sb2NhbEhlYWRlck1hcC5pc0VtcHR5KCkpOw0KLQ0KLSAgICAgICAgY2hlY2tWYWx1ZSA9IChTdHJpbmcpIGhlYWRlcnMuZ2V0KCJoZWFkZXIxIik7DQotICAgICAgICBhc3NlcnROb3ROdWxsKGNoZWNrVmFsdWUpOw0KLSAgICAgICAgYXNzZXJ0TnVsbChoZWFkZXJzLmhlYWRlck1hcCk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKGhlYWRlcnMubG9jYWxIZWFkZXJNYXApOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJoMVZhbHVlIiwgY2hlY2tWYWx1ZSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvdGVtcHVyaS9CYXNlRGF0YVR5cGVzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy90ZW1wdXJpL0Jhc2VEYXRhVHlwZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTVkMTI3NC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy90ZW1wdXJpL0Jhc2VEYXRhVHlwZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy50ZW1wdXJpOwotCi1pbXBvcnQgamF2YXgueG1sLmRhdGF0eXBlLkR1cmF0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci1pbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOwotCi1wdWJsaWMgY2xhc3MgQmFzZURhdGFUeXBlcyB7Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiByZXRCb29sKAotICAgICAgICAgICAgYm9vbGVhbiBpbkJvb2wpIHsKLSAgICAgICAgcmV0dXJuIGluQm9vbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc2hvcnQgcmV0Qnl0ZSgKLSAgICAgICAgICAgIHNob3J0IGluQnl0ZSkgewotICAgICAgICByZXR1cm4gaW5CeXRlOwotICAgIH0KLQotICAgIHB1YmxpYyBieXRlIHJldFNCeXRlKAotICAgICAgICAgICAgYnl0ZSBpblNCeXRlKSB7Ci0gICAgICAgIHJldHVybiBpblNCeXRlOwotICAgIH0KLQotICAgIHB1YmxpYyBieXRlW10gcmV0Qnl0ZUFycmF5KAotICAgICAgICAgICAgYnl0ZVtdIGluQnl0ZUFycmF5KSB7Ci0gICAgICAgIHJldHVybiBpbkJ5dGVBcnJheTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IHJldENoYXIoCi0gICAgICAgICAgICBpbnQgaW5DaGFyKSB7Ci0gICAgICAgIHJldHVybiBpbkNoYXI7Ci0gICAgfQotCi0gICAgcHVibGljIEJpZ0RlY2ltYWwgcmV0RGVjaW1hbCgKLSAgICAgICAgICAgIEJpZ0RlY2ltYWwgaW5EZWNpbWFsKSB7Ci0gICAgICAgIHJldHVybiBpbkRlY2ltYWw7Ci0gICAgfQotCi0gICAgcHVibGljIGZsb2F0IHJldEZsb2F0KAotICAgICAgICAgICAgZmxvYXQgaW5GbG9hdCkgewotICAgICAgICByZXR1cm4gaW5GbG9hdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZG91YmxlIHJldERvdWJsZSgKLSAgICAgICAgICAgIGRvdWJsZSBpbkRvdWJsZSkgewotICAgICAgICByZXR1cm4gaW5Eb3VibGU7Ci0gICAgfQotCi0gICAgcHVibGljIGZsb2F0IHJldFNpbmdsZSgKLSAgICAgICAgICAgIGZsb2F0IGluU2luZ2xlKSB7Ci0gICAgICAgIHJldHVybiBpblNpbmdsZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IHJldEludCgKLSAgICAgICAgICAgIGludCBpbkludCkgewotICAgICAgICByZXR1cm4gaW5JbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIHNob3J0IHJldFNob3J0KAotICAgICAgICAgICAgc2hvcnQgaW5TaG9ydCkgewotICAgICAgICByZXR1cm4gaW5TaG9ydDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgbG9uZyByZXRMb25nKAotICAgICAgICAgICAgbG9uZyBpbkxvbmcpIHsKLSAgICAgICAgcmV0dXJuIGluTG9uZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IHJldE9iamVjdCgKLSAgICAgICAgICAgIE9iamVjdCBpbk9iamVjdCkgewotICAgICAgICByZXR1cm4gaW5PYmplY3Q7Ci0gICAgfQotCi0gICAgcHVibGljIGxvbmcgcmV0VUludCgKLSAgICAgICAgICAgIGxvbmcgaW5VSW50KSB7Ci0gICAgICAgIHJldHVybiBpblVJbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIGludCByZXRVU2hvcnQoCi0gICAgICAgICAgICBpbnQgaW5VU2hvcnQpIHsKLSAgICAgICAgcmV0dXJuIGluVVNob3J0OwotICAgIH0KLQotICAgIHB1YmxpYyBCaWdJbnRlZ2VyIHJldFVMb25nKAotICAgICAgICAgICAgQmlnSW50ZWdlciBpblVMb25nKSB7Ci0gICAgICAgIHJldHVybiBpblVMb25nOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgcmV0U3RyaW5nKAotICAgICAgICAgICAgU3RyaW5nIGluU3RyaW5nKSB7Ci0gICAgICAgIHJldHVybiBpblN0cmluZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHJldEd1aWQoCi0gICAgICAgICAgICBTdHJpbmcgaW5HdWlkKSB7Ci0gICAgICAgIHJldHVybiBpbkd1aWQ7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyByZXRVcmkoCi0gICAgICAgICAgICBTdHJpbmcgaW5VcmkpIHsKLSAgICAgICAgcmV0dXJuIGluVXJpOwotICAgIH0KLQotICAgIHB1YmxpYyBDYWxlbmRhciByZXREYXRlVGltZSgKLSAgICAgICAgICAgIENhbGVuZGFyIGluRGF0ZVRpbWUpIHsKLSAgICAgICAgcmV0dXJuIGluRGF0ZVRpbWU7Ci0gICAgfQotCi0gICAgcHVibGljIER1cmF0aW9uIHJldFRpbWVTcGFuKAotICAgICAgICAgICAgRHVyYXRpb24gaW5UaW1lU3BhbikgewotICAgICAgICByZXR1cm4gaW5UaW1lU3BhbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUU5hbWUgcmV0UU5hbWUoCi0gICAgICAgICAgICBRTmFtZSBpblFOYW1lKSB7Ci0gICAgICAgIHJldHVybiBpblFOYW1lOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL3RlbXB1cmkvQmFzZURhdGFUeXBlc1Rlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL3RlbXB1cmkvQmFzZURhdGFUeXBlc1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODA3ZThlYy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy90ZW1wdXJpL0Jhc2VEYXRhVHlwZXNUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy50ZW1wdXJpOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pbnRlZ3JhdGlvbi5UZXN0aW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5qYXZhMndzZGwuSmF2YTJXU0RMQnVpbGRlcjsKLWltcG9ydCBvcmcuY3VzdG9tbW9ua2V5LnhtbHVuaXQuRGlmZjsKLWltcG9ydCBvcmcuY3VzdG9tbW9ua2V5LnhtbHVuaXQuRGlmZmVyZW5jZUVuZ2luZTsKLWltcG9ydCBvcmcuY3VzdG9tbW9ua2V5LnhtbHVuaXQuWE1MVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmN1c3RvbW1vbmtleS54bWx1bml0LlhNTFVuaXQ7Ci1pbXBvcnQgb3JnLnRlbXB1cmkuZWxlbWVudFF1YWxpZmllci5XU0RMRWxlbWVudFF1YWxpZmllcjsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKLQotcHVibGljIGNsYXNzIEJhc2VEYXRhVHlwZXNUZXN0IGV4dGVuZHMgWE1MVGVzdENhc2UgewotCi0gICAgcHJpdmF0ZSBTdHJpbmcgd3NkbExvY2F0aW9uID0gVGVzdGluZ1V0aWxzLnByZWZpeEJhc2VEaXJlY3RvcnkoInRlc3QtcmVzb3VyY2VzL0Jhc2VEYXRhVHlwZXMud3NkbCIpOwotCi0gICAgcHVibGljIHZvaWQgdGVzdDEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgWE1MVW5pdC5zZXRJZ25vcmVXaGl0ZXNwYWNlKHRydWUpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgICAgIEphdmEyV1NETEJ1aWxkZXIgYnVpbGRlciA9IG5ldyBKYXZhMldTRExCdWlsZGVyKG91dCwgQmFzZURhdGFUeXBlcy5jbGFzcy5nZXROYW1lKCksIEJhc2VEYXRhVHlwZXMuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSk7Ci0gICAgICAgICAgICBidWlsZGVyLmdlbmVyYXRlV1NETCgpOwotICAgICAgICAgICAgRmlsZVJlYWRlciBjb250cm9sID0gbmV3IEZpbGVSZWFkZXIod3NkbExvY2F0aW9uKTsKLSAgICAgICAgICAgIFN0cmluZ1JlYWRlciB0ZXN0ID0gbmV3IFN0cmluZ1JlYWRlcihuZXcgU3RyaW5nKG91dC50b0J5dGVBcnJheSgpKSk7Ci0gICAgICAgICAgICBEaWZmIG15RGlmZiA9IG5ldyBEaWZmKFhNTFVuaXQuYnVpbGREb2N1bWVudChYTUxVbml0LmdldENvbnRyb2xQYXJzZXIoKSwgY29udHJvbCksIAotCQkgICAgICAgICAgICAgICBYTUxVbml0LmJ1aWxkRG9jdW1lbnQoWE1MVW5pdC5nZXRDb250cm9sUGFyc2VyKCksIHRlc3QpLCAKLQkJICAgICAgICAgICAgICAgKERpZmZlcmVuY2VFbmdpbmUpIG51bGwsIG5ldyBXU0RMRWxlbWVudFF1YWxpZmllcigpKTsKLSAgICAgICAgICAgIGlmICghbXlEaWZmLnNpbWlsYXIoKSkgCi0JICAgICAgICAgICAgZmFpbChteURpZmYudG9TdHJpbmcoKSk7IAotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgWE1MVW5pdC5zZXRJZ25vcmVXaGl0ZXNwYWNlKGZhbHNlKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL3RlbXB1cmkvY29tcGxleC9Db21wbGV4RGF0YVR5cGVzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy90ZW1wdXJpL2NvbXBsZXgvQ29tcGxleERhdGFUeXBlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWUwOGUxLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL3RlbXB1cmkvY29tcGxleC9Db21wbGV4RGF0YVR5cGVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcudGVtcHVyaS5jb21wbGV4OwotCi1pbXBvcnQgb3JnLnRlbXB1cmkuY29tcGxleC5kYXRhLkJpdE1hc2s7Ci1pbXBvcnQgb3JnLnRlbXB1cmkuY29tcGxleC5kYXRhLkVtcGxveWVlOwotaW1wb3J0IG9yZy50ZW1wdXJpLmNvbXBsZXguZGF0YS5GdXJuaXR1cmU7Ci1pbXBvcnQgb3JnLnRlbXB1cmkuY29tcGxleC5kYXRhLkdyb3VwOwotaW1wb3J0IG9yZy50ZW1wdXJpLmNvbXBsZXguZGF0YS5OYW1lOwotaW1wb3J0IG9yZy50ZW1wdXJpLmNvbXBsZXguZGF0YS5QZXJzb247Ci1pbXBvcnQgb3JnLnRlbXB1cmkuY29tcGxleC5kYXRhLlRhYmxlOwotaW1wb3J0IG9yZy50ZW1wdXJpLmNvbXBsZXguZGF0YS5hcnJheXMuQXJyYXlPZkFycmF5T2ZzdHJpbmc7Ci1pbXBvcnQgb3JnLnRlbXB1cmkuY29tcGxleC5kYXRhLmFycmF5cy5BcnJheU9mTnVsbGFibGVPZmRhdGVUaW1lOwotaW1wb3J0IG9yZy50ZW1wdXJpLmNvbXBsZXguZGF0YS5hcnJheXMuQXJyYXlPZk51bGxhYmxlT2ZkZWNpbWFsOwotaW1wb3J0IG9yZy50ZW1wdXJpLmNvbXBsZXguZGF0YS5hcnJheXMuQXJyYXlPZlBlcnNvbjsKLWltcG9ydCBvcmcudGVtcHVyaS5jb21wbGV4LmRhdGEuYXJyYXlzLkFycmF5T2ZhbnlUeXBlOwotaW1wb3J0IG9yZy50ZW1wdXJpLmNvbXBsZXguZGF0YS5hcnJheXMuQXJyYXlPZmludDsKLWltcG9ydCBvcmcudGVtcHVyaS5jb21wbGV4LmRhdGEuYXJyYXlzLkFycmF5T2ZzdHJpbmc7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOwotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKLQotCi1wdWJsaWMgY2xhc3MgQ29tcGxleERhdGFUeXBlcyB7Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiByZXRCb29sKAotICAgICAgICAgICAgYm9vbGVhbiBpbkJvb2wpIHsKLSAgICAgICAgcmV0dXJuIGluQm9vbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc2hvcnQgcmV0Qnl0ZSgKLSAgICAgICAgICAgIHNob3J0IGluQnl0ZSkgewotICAgICAgICByZXR1cm4gaW5CeXRlOwotICAgIH0KLQotICAgIHB1YmxpYyBieXRlIHJldFNCeXRlKAotICAgICAgICAgICAgYnl0ZSBpblNCeXRlKSB7Ci0gICAgICAgIHJldHVybiBpblNCeXRlOwotICAgIH0KLQotICAgIHB1YmxpYyBieXRlW10gcmV0Qnl0ZUFycmF5KAotICAgICAgICAgICAgYnl0ZVtdIGluQnl0ZUFycmF5KSB7Ci0gICAgICAgIHJldHVybiBpbkJ5dGVBcnJheTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IHJldENoYXIoCi0gICAgICAgICAgICBpbnQgaW5DaGFyKSB7Ci0gICAgICAgIHJldHVybiBpbkNoYXI7Ci0gICAgfQotCi0gICAgcHVibGljIEJpZ0RlY2ltYWwgcmV0RGVjaW1hbCgKLSAgICAgICAgICAgIEJpZ0RlY2ltYWwgaW5EZWNpbWFsKSB7Ci0gICAgICAgIHJldHVybiBpbkRlY2ltYWw7Ci0gICAgfQotCi0gICAgcHVibGljIGZsb2F0IHJldEZsb2F0KAotICAgICAgICAgICAgZmxvYXQgaW5GbG9hdCkgewotICAgICAgICByZXR1cm4gaW5GbG9hdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZG91YmxlIHJldERvdWJsZSgKLSAgICAgICAgICAgIGRvdWJsZSBpbkRvdWJsZSkgewotICAgICAgICByZXR1cm4gaW5Eb3VibGU7Ci0gICAgfQotCi0gICAgcHVibGljIGZsb2F0IHJldFNpbmdsZSgKLSAgICAgICAgICAgIGZsb2F0IGluU2luZ2xlKSB7Ci0gICAgICAgIHJldHVybiBpblNpbmdsZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IHJldEludCgKLSAgICAgICAgICAgIGludCBpbkludCkgewotICAgICAgICByZXR1cm4gaW5JbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIGludFtdIHJldEludHMoCi0gICAgICAgICAgICBpbnRbXSBpbkludCkgewotICAgICAgICByZXR1cm4gaW5JbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIHNob3J0IHJldFNob3J0KAotICAgICAgICAgICAgc2hvcnQgaW5TaG9ydCkgewotICAgICAgICByZXR1cm4gaW5TaG9ydDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgbG9uZyByZXRMb25nKAotICAgICAgICAgICAgbG9uZyBpbkxvbmcpIHsKLSAgICAgICAgcmV0dXJuIGluTG9uZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IHJldE9iamVjdCgKLSAgICAgICAgICAgIE9iamVjdCBpbk9iamVjdCkgewotICAgICAgICByZXR1cm4gaW5PYmplY3Q7Ci0gICAgfQotCi0gICAgcHVibGljIGxvbmcgcmV0VUludCgKLSAgICAgICAgICAgIGxvbmcgaW5VSW50KSB7Ci0gICAgICAgIHJldHVybiBpblVJbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIGludCByZXRVU2hvcnQoCi0gICAgICAgICAgICBpbnQgaW5VU2hvcnQpIHsKLSAgICAgICAgcmV0dXJuIGluVVNob3J0OwotICAgIH0KLQotICAgIHB1YmxpYyBCaWdJbnRlZ2VyIHJldFVMb25nKAotICAgICAgICAgICAgQmlnSW50ZWdlciBpblVMb25nKSB7Ci0gICAgICAgIHJldHVybiBpblVMb25nOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgcmV0U3RyaW5nKAotICAgICAgICAgICAgU3RyaW5nIGluU3RyaW5nKSB7Ci0gICAgICAgIHJldHVybiBpblN0cmluZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nW10gcmV0U3RyaW5ncygKLSAgICAgICAgICAgIFN0cmluZ1tdIGluU3RyaW5nKSB7Ci0gICAgICAgIHJldHVybiBpblN0cmluZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHJldEd1aWQoCi0gICAgICAgICAgICBTdHJpbmcgaW5HdWlkKSB7Ci0gICAgICAgIHJldHVybiBpbkd1aWQ7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyByZXRVcmkoCi0gICAgICAgICAgICBTdHJpbmcgaW5VcmkpIHsKLSAgICAgICAgcmV0dXJuIGluVXJpOwotICAgIH0KLQotICAgIHB1YmxpYyBDYWxlbmRhciByZXREYXRlVGltZSgKLSAgICAgICAgICAgIENhbGVuZGFyIGluRGF0ZVRpbWUpIHsKLSAgICAgICAgcmV0dXJuIGluRGF0ZVRpbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFFOYW1lIHJldFFOYW1lKAotICAgICAgICAgICAgUU5hbWUgaW5RTmFtZSkgewotICAgICAgICByZXR1cm4gaW5RTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXJyYXlPZnN0cmluZyByZXRBcnJheVN0cmluZzFEKAotICAgICAgICAgICAgQXJyYXlPZnN0cmluZyBpbkFycmF5U3RyaW5nMUQpIHsKLSAgICAgICAgcmV0dXJuIGluQXJyYXlTdHJpbmcxRDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXJyYXlPZmludCByZXRBcnJheUludDFEKAotICAgICAgICAgICAgQXJyYXlPZmludCBpbkFycmF5SW50MUQpIHsKLSAgICAgICAgcmV0dXJuIGluQXJyYXlJbnQxRDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXJyYXlPZk51bGxhYmxlT2ZkZWNpbWFsIHJldEFycmF5RGVjaW1hbDFEKAotICAgICAgICAgICAgQXJyYXlPZk51bGxhYmxlT2ZkZWNpbWFsIGluQXJyYXlEZWNpbWFsMUQpIHsKLSAgICAgICAgcmV0dXJuIGluQXJyYXlEZWNpbWFsMUQ7Ci0gICAgfQotCi0gICAgcHVibGljIEFycmF5T2ZOdWxsYWJsZU9mZGF0ZVRpbWUgcmV0QXJyYXlEYXRlVGltZTFEKAotICAgICAgICAgICAgQXJyYXlPZk51bGxhYmxlT2ZkYXRlVGltZSBpbkFycmF5RGF0ZVRpbWUxRCkgewotICAgICAgICByZXR1cm4gaW5BcnJheURhdGVUaW1lMUQ7Ci0gICAgfQotCi0gICAgcHVibGljIEFycmF5T2ZBcnJheU9mc3RyaW5nIHJldEFycmF5U3RyaW5nMkQoCi0gICAgICAgICAgICBBcnJheU9mQXJyYXlPZnN0cmluZyBpbkFycmF5U3RyaW5nMkQpIHsKLSAgICAgICAgcmV0dXJuIGluQXJyYXlTdHJpbmcyRDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXJyYXlPZlBlcnNvbiByZXRBcnJheTFEU04oCi0gICAgICAgICAgICBBcnJheU9mUGVyc29uIGluQXJyYXkxRFNOKSB7Ci0gICAgICAgIHJldHVybiBpbkFycmF5MURTTjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXJyYXlPZmFueVR5cGUgcmV0QXJyYXlBbnlUeXBlMUQoCi0gICAgICAgICAgICBBcnJheU9mYW55VHlwZSBpbkFycmF5QW55VHlwZTFEKSB7Ci0gICAgICAgIHJldHVybiBpbkFycmF5QW55VHlwZTFEOwotICAgIH0KLQotICAgIHB1YmxpYyBOYW1lIHJldFN0cnVjdFMxKAotICAgICAgICAgICAgTmFtZSBpblN0cnVjdFMxKSB7Ci0gICAgICAgIHJldHVybiBpblN0cnVjdFMxOwotICAgIH0KLQotICAgIHB1YmxpYyBQZXJzb24gcmV0U3RydWN0U04oCi0gICAgICAgICAgICBQZXJzb24gaW5TdHJ1Y3RTTikgewotICAgICAgICByZXR1cm4gaW5TdHJ1Y3RTTjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRW1wbG95ZWUgcmV0U3RydWN0U05TQSgKLSAgICAgICAgICAgIEVtcGxveWVlIGluU3RydWN0U05TQSkgewotICAgICAgICByZXR1cm4gaW5TdHJ1Y3RTTlNBOwotICAgIH0KLQotICAgIHB1YmxpYyBHcm91cCByZXRTdHJ1Y3RTTlNBUygKLSAgICAgICAgICAgIEdyb3VwIGluU3RydWN0U05TQVMpIHsKLSAgICAgICAgcmV0dXJuIGluU3RydWN0U05TQVM7Ci0gICAgfQotCi0gICAgcHVibGljIEJpdE1hc2sgcmV0RW51bVN0cmluZygKLSAgICAgICAgICAgIEJpdE1hc2sgaW5FbnVtU3RyaW5nKSB7Ci0gICAgICAgIHJldHVybiBpbkVudW1TdHJpbmc7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyByZXRFbnVtSW50KAotICAgICAgICAgICAgU3RyaW5nIGluRW51bUludCkgewotICAgICAgICByZXR1cm4gaW5FbnVtSW50OwotICAgIH0KLQotICAgIHB1YmxpYyBGdXJuaXR1cmUgcmV0RGVyaXZlZENsYXNzKAotICAgICAgICAgICAgRnVybml0dXJlIGluRGVyaXZlZENsYXNzKSB7Ci0gICAgICAgIHJldHVybiBpbkRlcml2ZWRDbGFzczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVGFibGUgcmV0RGVyaXZlZENsYXNzMigKLSAgICAgICAgICAgIFRhYmxlIGluRGVyaXZlZENsYXNzKSB7Ci0gICAgICAgIHJldHVybiBpbkRlcml2ZWRDbGFzczsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy90ZW1wdXJpL2NvbXBsZXgvQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmUuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL3RlbXB1cmkvY29tcGxleC9Db21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDYzMjNkLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL3RlbXB1cmkvY29tcGxleC9Db21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLnRlbXB1cmkuY29tcGxleDsKLQotaW1wb3J0IG9yZy50ZW1wdXJpLmNvbXBsZXguZGF0YS5CaXRNYXNrOwotaW1wb3J0IG9yZy50ZW1wdXJpLmNvbXBsZXguZGF0YS5FbXBsb3llZTsKLWltcG9ydCBvcmcudGVtcHVyaS5jb21wbGV4LmRhdGEuRnVybml0dXJlOwotaW1wb3J0IG9yZy50ZW1wdXJpLmNvbXBsZXguZGF0YS5Hcm91cDsKLWltcG9ydCBvcmcudGVtcHVyaS5jb21wbGV4LmRhdGEuTmFtZTsKLWltcG9ydCBvcmcudGVtcHVyaS5jb21wbGV4LmRhdGEuUGVyc29uOwotaW1wb3J0IG9yZy50ZW1wdXJpLmNvbXBsZXguZGF0YS5hcnJheXMuQXJyYXlPZkFycmF5T2ZzdHJpbmc7Ci1pbXBvcnQgb3JnLnRlbXB1cmkuY29tcGxleC5kYXRhLmFycmF5cy5BcnJheU9mTnVsbGFibGVPZmRhdGVUaW1lOwotaW1wb3J0IG9yZy50ZW1wdXJpLmNvbXBsZXguZGF0YS5hcnJheXMuQXJyYXlPZk51bGxhYmxlT2ZkZWNpbWFsOwotaW1wb3J0IG9yZy50ZW1wdXJpLmNvbXBsZXguZGF0YS5hcnJheXMuQXJyYXlPZlBlcnNvbjsKLWltcG9ydCBvcmcudGVtcHVyaS5jb21wbGV4LmRhdGEuYXJyYXlzLkFycmF5T2ZhbnlUeXBlOwotaW1wb3J0IG9yZy50ZW1wdXJpLmNvbXBsZXguZGF0YS5hcnJheXMuQXJyYXlPZmludDsKLWltcG9ydCBvcmcudGVtcHVyaS5jb21wbGV4LmRhdGEuYXJyYXlzLkFycmF5T2ZzdHJpbmc7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOwotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKLQotcHVibGljIGNsYXNzIENvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlIHsKLSAgICAgcHVibGljIGJvb2xlYW4gcmV0Qm9vbCgKLSAgICAgICAgICAgIGJvb2xlYW4gaW5Cb29sKSB7Ci0gICAgICAgIHJldHVybiBpbkJvb2w7Ci0gICAgfQotCi0gICAgcHVibGljIHNob3J0IHJldEJ5dGUoCi0gICAgICAgICAgICBzaG9ydCBpbkJ5dGUpIHsKLSAgICAgICAgcmV0dXJuIGluQnl0ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYnl0ZSByZXRTQnl0ZSgKLSAgICAgICAgICAgIGJ5dGUgaW5TQnl0ZSkgewotICAgICAgICByZXR1cm4gaW5TQnl0ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYnl0ZVtdIHJldEJ5dGVBcnJheSgKLSAgICAgICAgICAgIGJ5dGVbXSBpbkJ5dGVBcnJheSkgewotICAgICAgICByZXR1cm4gaW5CeXRlQXJyYXk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCByZXRDaGFyKAotICAgICAgICAgICAgaW50IGluQ2hhcikgewotICAgICAgICByZXR1cm4gaW5DaGFyOwotICAgIH0KLQotICAgIHB1YmxpYyBCaWdEZWNpbWFsIHJldERlY2ltYWwoCi0gICAgICAgICAgICBCaWdEZWNpbWFsIGluRGVjaW1hbCkgewotICAgICAgICByZXR1cm4gaW5EZWNpbWFsOwotICAgIH0KLQotICAgIHB1YmxpYyBmbG9hdCByZXRGbG9hdCgKLSAgICAgICAgICAgIGZsb2F0IGluRmxvYXQpIHsKLSAgICAgICAgcmV0dXJuIGluRmxvYXQ7Ci0gICAgfQotCi0gICAgcHVibGljIGRvdWJsZSByZXREb3VibGUoCi0gICAgICAgICAgICBkb3VibGUgaW5Eb3VibGUpIHsKLSAgICAgICAgcmV0dXJuIGluRG91YmxlOwotICAgIH0KLQotICAgIHB1YmxpYyBmbG9hdCByZXRTaW5nbGUoCi0gICAgICAgICAgICBmbG9hdCBpblNpbmdsZSkgewotICAgICAgICByZXR1cm4gaW5TaW5nbGU7Ci0gICAgfQotCi0gICAgcHVibGljIGludCByZXRJbnQoCi0gICAgICAgICAgICBpbnQgaW5JbnQpIHsKLSAgICAgICAgcmV0dXJuIGluSW50OwotICAgIH0KLQotICAgIHB1YmxpYyBpbnRbXSByZXRJbnRzKAotICAgICAgICAgICAgaW50W10gaW5JbnQpIHsKLSAgICAgICAgcmV0dXJuIGluSW50OwotICAgIH0KLQotICAgIHB1YmxpYyBzaG9ydCByZXRTaG9ydCgKLSAgICAgICAgICAgIHNob3J0IGluU2hvcnQpIHsKLSAgICAgICAgcmV0dXJuIGluU2hvcnQ7Ci0gICAgfQotCi0gICAgcHVibGljIGxvbmcgcmV0TG9uZygKLSAgICAgICAgICAgIGxvbmcgaW5Mb25nKSB7Ci0gICAgICAgIHJldHVybiBpbkxvbmc7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCByZXRPYmplY3QoCi0gICAgICAgICAgICBPYmplY3QgaW5PYmplY3QpIHsKLSAgICAgICAgcmV0dXJuIGluT2JqZWN0OwotICAgIH0KLQotICAgIHB1YmxpYyBsb25nIHJldFVJbnQoCi0gICAgICAgICAgICBsb25nIGluVUludCkgewotICAgICAgICByZXR1cm4gaW5VSW50OwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgcmV0VVNob3J0KAotICAgICAgICAgICAgaW50IGluVVNob3J0KSB7Ci0gICAgICAgIHJldHVybiBpblVTaG9ydDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQmlnSW50ZWdlciByZXRVTG9uZygKLSAgICAgICAgICAgIEJpZ0ludGVnZXIgaW5VTG9uZykgewotICAgICAgICByZXR1cm4gaW5VTG9uZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHJldFN0cmluZygKLSAgICAgICAgICAgIFN0cmluZyBpblN0cmluZykgewotICAgICAgICByZXR1cm4gaW5TdHJpbmc7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZ1tdIHJldFN0cmluZ3MoCi0gICAgICAgICAgICBTdHJpbmdbXSBpblN0cmluZykgewotICAgICAgICByZXR1cm4gaW5TdHJpbmc7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyByZXRHdWlkKAotICAgICAgICAgICAgU3RyaW5nIGluR3VpZCkgewotICAgICAgICByZXR1cm4gaW5HdWlkOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgcmV0VXJpKAotICAgICAgICAgICAgU3RyaW5nIGluVXJpKSB7Ci0gICAgICAgIHJldHVybiBpblVyaTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2FsZW5kYXIgcmV0RGF0ZVRpbWUoCi0gICAgICAgICAgICBDYWxlbmRhciBpbkRhdGVUaW1lKSB7Ci0gICAgICAgIHJldHVybiBpbkRhdGVUaW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBRTmFtZSByZXRRTmFtZSgKLSAgICAgICAgICAgIFFOYW1lIGluUU5hbWUpIHsKLSAgICAgICAgcmV0dXJuIGluUU5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIEFycmF5T2ZzdHJpbmcgcmV0QXJyYXlTdHJpbmcxRCgKLSAgICAgICAgICAgIEFycmF5T2ZzdHJpbmcgaW5BcnJheVN0cmluZzFEKSB7Ci0gICAgICAgIHJldHVybiBpbkFycmF5U3RyaW5nMUQ7Ci0gICAgfQotCi0gICAgcHVibGljIEFycmF5T2ZpbnQgcmV0QXJyYXlJbnQxRCgKLSAgICAgICAgICAgIEFycmF5T2ZpbnQgaW5BcnJheUludDFEKSB7Ci0gICAgICAgIHJldHVybiBpbkFycmF5SW50MUQ7Ci0gICAgfQotCi0gICAgcHVibGljIEFycmF5T2ZOdWxsYWJsZU9mZGVjaW1hbCByZXRBcnJheURlY2ltYWwxRCgKLSAgICAgICAgICAgIEFycmF5T2ZOdWxsYWJsZU9mZGVjaW1hbCBpbkFycmF5RGVjaW1hbDFEKSB7Ci0gICAgICAgIHJldHVybiBpbkFycmF5RGVjaW1hbDFEOwotICAgIH0KLQotICAgIHB1YmxpYyBBcnJheU9mTnVsbGFibGVPZmRhdGVUaW1lIHJldEFycmF5RGF0ZVRpbWUxRCgKLSAgICAgICAgICAgIEFycmF5T2ZOdWxsYWJsZU9mZGF0ZVRpbWUgaW5BcnJheURhdGVUaW1lMUQpIHsKLSAgICAgICAgcmV0dXJuIGluQXJyYXlEYXRlVGltZTFEOwotICAgIH0KLQotICAgIHB1YmxpYyBBcnJheU9mQXJyYXlPZnN0cmluZyByZXRBcnJheVN0cmluZzJEKAotICAgICAgICAgICAgQXJyYXlPZkFycmF5T2ZzdHJpbmcgaW5BcnJheVN0cmluZzJEKSB7Ci0gICAgICAgIHJldHVybiBpbkFycmF5U3RyaW5nMkQ7Ci0gICAgfQotCi0gICAgcHVibGljIEFycmF5T2ZQZXJzb24gcmV0QXJyYXkxRFNOKAotICAgICAgICAgICAgQXJyYXlPZlBlcnNvbiBpbkFycmF5MURTTikgewotICAgICAgICByZXR1cm4gaW5BcnJheTFEU047Ci0gICAgfQotCi0gICAgcHVibGljIEFycmF5T2ZhbnlUeXBlIHJldEFycmF5QW55VHlwZTFEKAotICAgICAgICAgICAgQXJyYXlPZmFueVR5cGUgaW5BcnJheUFueVR5cGUxRCkgewotICAgICAgICByZXR1cm4gaW5BcnJheUFueVR5cGUxRDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTmFtZSByZXRTdHJ1Y3RTMSgKLSAgICAgICAgICAgIE5hbWUgaW5TdHJ1Y3RTMSkgewotICAgICAgICByZXR1cm4gaW5TdHJ1Y3RTMTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUGVyc29uIHJldFN0cnVjdFNOKAotICAgICAgICAgICAgUGVyc29uIGluU3RydWN0U04pIHsKLSAgICAgICAgcmV0dXJuIGluU3RydWN0U047Ci0gICAgfQotCi0gICAgcHVibGljIEVtcGxveWVlIHJldFN0cnVjdFNOU0EoCi0gICAgICAgICAgICBFbXBsb3llZSBpblN0cnVjdFNOU0EpIHsKLSAgICAgICAgcmV0dXJuIGluU3RydWN0U05TQTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgR3JvdXAgcmV0U3RydWN0U05TQVMoCi0gICAgICAgICAgICBHcm91cCBpblN0cnVjdFNOU0FTKSB7Ci0gICAgICAgIHJldHVybiBpblN0cnVjdFNOU0FTOwotICAgIH0KLQotICAgIHB1YmxpYyBCaXRNYXNrIHJldEVudW1TdHJpbmcoCi0gICAgICAgICAgICBCaXRNYXNrIGluRW51bVN0cmluZykgewotICAgICAgICByZXR1cm4gaW5FbnVtU3RyaW5nOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgcmV0RW51bUludCgKLSAgICAgICAgICAgIFN0cmluZyBpbkVudW1JbnQpIHsKLSAgICAgICAgcmV0dXJuIGluRW51bUludDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRnVybml0dXJlIHJldERlcml2ZWRDbGFzcygKLSAgICAgICAgICAgIEZ1cm5pdHVyZSBpbkRlcml2ZWRDbGFzcykgewotICAgICAgICByZXR1cm4gaW5EZXJpdmVkQ2xhc3M7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy90ZW1wdXJpL2NvbXBsZXgvQ29tcGxleERhdGFUeXBlc1Rlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL3RlbXB1cmkvY29tcGxleC9Db21wbGV4RGF0YVR5cGVzVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2FjZjllLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL3RlbXB1cmkvY29tcGxleC9Db21wbGV4RGF0YVR5cGVzVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcudGVtcHVyaS5jb21wbGV4OwotCi1pbXBvcnQgb3JnLmFwYWNoZS53cy5qYXZhMndzZGwuSmF2YTJXU0RMQnVpbGRlcjsKLWltcG9ydCBvcmcuY3VzdG9tbW9ua2V5LnhtbHVuaXQuRGlmZjsKLWltcG9ydCBvcmcuY3VzdG9tbW9ua2V5LnhtbHVuaXQuWE1MVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmN1c3RvbW1vbmtleS54bWx1bml0LlhNTFVuaXQ7Ci1pbXBvcnQgb3JnLnRlbXB1cmkuZGlmZmVyZW5jZUVuZ2luZS5XU0RMQ29udHJvbGxlcjsKLWltcG9ydCBvcmcudGVtcHVyaS5kaWZmZXJlbmNlRW5naW5lLldTRExEaWZmZXJlbmNlRW5naW5lOwotaW1wb3J0IG9yZy50ZW1wdXJpLmVsZW1lbnRRdWFsaWZpZXIuV1NETEVsZW1lbnRRdWFsaWZpZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7Ci0KLQotcHVibGljIGNsYXNzIENvbXBsZXhEYXRhVHlwZXNUZXN0IGV4dGVuZHMgWE1MVGVzdENhc2UgewotCi0gICAgcHJpdmF0ZSBTdHJpbmcgd3NkbExvY2F0aW9uID0gU3lzdGVtLmdldFByb3BlcnR5KCJiYXNlZGlyIiwgIi4iKSArICIvIiArICJ0ZXN0LXJlc291cmNlcy9Db21wbGV4RGF0YVR5cGVzL0NvbXBsZXhEYXRhVHlwZXMud3NkbCI7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0MSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBYTUxVbml0LnNldElnbm9yZVdoaXRlc3BhY2UodHJ1ZSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICAgICAgSmF2YTJXU0RMQnVpbGRlciBidWlsZGVyID0gbmV3IEphdmEyV1NETEJ1aWxkZXIob3V0LCBDb21wbGV4RGF0YVR5cGVzLmNsYXNzLmdldE5hbWUoKSwgQ29tcGxleERhdGFUeXBlcy5jbGFzcy5nZXRDbGFzc0xvYWRlcigpKTsKLSAgICAgICAgICAgIGJ1aWxkZXIuZ2VuZXJhdGVXU0RMKCk7Ci0gICAgICAgICAgICBGaWxlUmVhZGVyIGNvbnRyb2wgPSBuZXcgRmlsZVJlYWRlcih3c2RsTG9jYXRpb24pOwotICAgICAgICAgICAgU3RyaW5nUmVhZGVyIHRlc3QgPSBuZXcgU3RyaW5nUmVhZGVyKG5ldyBTdHJpbmcob3V0LnRvQnl0ZUFycmF5KCkpKTsKLSAgICAgICAgICAgIERpZmYgbXlEaWZmID0gbmV3IERpZmYoWE1MVW5pdC5idWlsZERvY3VtZW50KFhNTFVuaXQuZ2V0Q29udHJvbFBhcnNlcigpLCBjb250cm9sKSwgCi0JCSAgICAgICAgICAgICAgIFhNTFVuaXQuYnVpbGREb2N1bWVudChYTUxVbml0LmdldENvbnRyb2xQYXJzZXIoKSwgdGVzdCksIAotCQkgICAgICAgICAgICAgICBuZXcgV1NETERpZmZlcmVuY2VFbmdpbmUobmV3IFdTRExDb250cm9sbGVyKCkpLCBuZXcgV1NETEVsZW1lbnRRdWFsaWZpZXIoKSk7Ci0gICAgICAgICAgICBpZiAoIW15RGlmZi5zaW1pbGFyKCkpIAotCSAgICAgICAgICAgIGZhaWwobXlEaWZmLnRvU3RyaW5nKCkpOyAKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIFhNTFVuaXQuc2V0SWdub3JlV2hpdGVzcGFjZShmYWxzZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy90ZW1wdXJpL2NvbXBsZXgvZGF0YS9CaXRNYXNrLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy90ZW1wdXJpL2NvbXBsZXgvZGF0YS9CaXRNYXNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjZDkyNjAuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvdGVtcHVyaS9jb21wbGV4L2RhdGEvQml0TWFzay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcudGVtcHVyaS5jb21wbGV4LmRhdGE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGNsYXNzIEJpdE1hc2sgewotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRNYXNrIEJJVF9PTkUgPSBuZXcgQml0TWFzaygiQml0T25lIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRNYXNrIEJJVF9UV08gPSBuZXcgQml0TWFzaygiQml0VHdvIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRNYXNrIEJJVF9USFJFRSA9IG5ldyBCaXRNYXNrKCJCaXRUaHJlZSIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0TWFzayBCSVRfRk9VUiA9IG5ldyBCaXRNYXNrKCJCaXRGb3VyIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRNYXNrIEJJVF9GSVZFID0gbmV3IEJpdE1hc2soIkJpdEZpdmUiKTsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyB2YWx1ZTsKLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0IHZhbHVlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgIEJpdE1hc2soU3RyaW5nIHYpIHsKLSAgICAgICAgdmFsdWUgPSB2OwotICAgICAgICB2YWx1ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIHZhbHVlcy5hZGQodGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB2YWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQml0TWFzayBmcm9tVmFsdWUoU3RyaW5nIHYpIHsKLSAgICAgICAgSXRlcmF0b3IgaXRlcmF0b3IgPSB2YWx1ZXMuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgQml0TWFzayBjID0gKEJpdE1hc2spIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgIGlmIChjLnZhbHVlLmVxdWFscyh2KSkgewotICAgICAgICAgICAgICAgIHJldHVybiBjOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24odik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvdGVtcHVyaS9jb21wbGV4L2RhdGEvRW1wbG95ZWUuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL3RlbXB1cmkvY29tcGxleC9kYXRhL0VtcGxveWVlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0NTdkN2MuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvdGVtcHVyaS9jb21wbGV4L2RhdGEvRW1wbG95ZWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy50ZW1wdXJpLmNvbXBsZXguZGF0YTsKLQotaW1wb3J0IG9yZy50ZW1wdXJpLmNvbXBsZXguZGF0YS5hcnJheXMuQXJyYXlPZnNob3J0OwotCi1pbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOwotCi0KLXB1YmxpYyBjbGFzcyBFbXBsb3llZSB7Ci0KLSAgICBwcm90ZWN0ZWQgUGVyc29uIGJhc2VEZXRhaWxzOwotICAgIHByb3RlY3RlZCBDYWxlbmRhciBoaXJlRGF0ZTsKLSAgICBwcm90ZWN0ZWQgTG9uZyBqb2JJRDsKLSAgICBwcm90ZWN0ZWQgQXJyYXlPZnNob3J0IG51bWJlcnM7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgYmFzZURldGFpbHMgcHJvcGVydHkuCi0gICAgICovCi0gICAgcHVibGljIFBlcnNvbiBnZXRCYXNlRGV0YWlscygpIHsKLSAgICAgICAgcmV0dXJuIGJhc2VEZXRhaWxzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBiYXNlRGV0YWlscyBwcm9wZXJ0eS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRCYXNlRGV0YWlscyhQZXJzb24gdmFsdWUpIHsKLSAgICAgICAgdGhpcy5iYXNlRGV0YWlscyA9ICgoUGVyc29uKSB2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGhpcmVEYXRlIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiBwb3NzaWJsZSBvYmplY3QgaXMKLSAgICAgKiAgICAgICAgIHtAbGluayBDYWxlbmRhciB9Ci0gICAgICovCi0gICAgcHVibGljIENhbGVuZGFyIGdldEhpcmVEYXRlKCkgewotICAgICAgICByZXR1cm4gaGlyZURhdGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGhpcmVEYXRlIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIGFsbG93ZWQgb2JqZWN0IGlzCi0gICAgICogICAgICAgICAgICAgIHtAbGluayBDYWxlbmRhciB9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SGlyZURhdGUoQ2FsZW5kYXIgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5oaXJlRGF0ZSA9IHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBqb2JJRCBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzCi0gICAgICogICAgICAgICB7QGxpbmsgTG9uZyB9Ci0gICAgICovCi0gICAgcHVibGljIExvbmcgZ2V0Sm9iSUQoKSB7Ci0gICAgICAgIHJldHVybiBqb2JJRDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgam9iSUQgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgYWxsb3dlZCBvYmplY3QgaXMKLSAgICAgKiAgICAgICAgICAgICAge0BsaW5rIExvbmcgfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEpvYklEKExvbmcgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5qb2JJRCA9IHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBudW1iZXJzIHByb3BlcnR5LgotICAgICAqLwotICAgIHB1YmxpYyBBcnJheU9mc2hvcnQgZ2V0TnVtYmVycygpIHsKLSAgICAgICAgcmV0dXJuIG51bWJlcnM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIG51bWJlcnMgcHJvcGVydHkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TnVtYmVycyhBcnJheU9mc2hvcnQgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5udW1iZXJzID0gdmFsdWU7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy90ZW1wdXJpL2NvbXBsZXgvZGF0YS9GdXJuaXR1cmUuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL3RlbXB1cmkvY29tcGxleC9kYXRhL0Z1cm5pdHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmY1NDI0Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL3RlbXB1cmkvY29tcGxleC9kYXRhL0Z1cm5pdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcudGVtcHVyaS5jb21wbGV4LmRhdGE7Ci0KLXB1YmxpYyBjbGFzcyBGdXJuaXR1cmUgewotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBjb2xvcjsKLSAgICBwcm90ZWN0ZWQgRmxvYXQgcHJpY2U7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgY29sb3IgcHJvcGVydHkuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRDb2xvcigpIHsKLSAgICAgICAgcmV0dXJuIGNvbG9yOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBjb2xvciBwcm9wZXJ0eS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDb2xvcihTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5jb2xvciA9ICgoU3RyaW5nKSB2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIHByaWNlIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiBwb3NzaWJsZSBvYmplY3QgaXMKLSAgICAgKiAgICAgICAgIHtAbGluayBGbG9hdCB9Ci0gICAgICovCi0gICAgcHVibGljIEZsb2F0IGdldFByaWNlKCkgewotICAgICAgICByZXR1cm4gcHJpY2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHByaWNlIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIGFsbG93ZWQgb2JqZWN0IGlzCi0gICAgICogICAgICAgICAgICAgIHtAbGluayBGbG9hdCB9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UHJpY2UoRmxvYXQgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5wcmljZSA9IHZhbHVlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvdGVtcHVyaS9jb21wbGV4L2RhdGEvR3JvdXAuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL3RlbXB1cmkvY29tcGxleC9kYXRhL0dyb3VwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyOTQ2MjUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvdGVtcHVyaS9jb21wbGV4L2RhdGEvR3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLnRlbXB1cmkuY29tcGxleC5kYXRhOwotCi1pbXBvcnQgb3JnLnRlbXB1cmkuY29tcGxleC5kYXRhLmFycmF5cy5BcnJheU9mUGVyc29uOwotCi1wdWJsaWMgY2xhc3MgR3JvdXAgewotCi0gICAgcHJvdGVjdGVkIEFycmF5T2ZQZXJzb24gbWVtYmVyczsKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIG5hbWU7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgbWVtYmVycyBwcm9wZXJ0eS4KLSAgICAgKi8KLSAgICBwdWJsaWMgQXJyYXlPZlBlcnNvbiBnZXRNZW1iZXJzKCkgewotICAgICAgICByZXR1cm4gbWVtYmVyczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgbWVtYmVycyBwcm9wZXJ0eS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRNZW1iZXJzKEFycmF5T2ZQZXJzb24gdmFsdWUpIHsKLSAgICAgICAgdGhpcy5tZW1iZXJzID0gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIG5hbWUgcHJvcGVydHkuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgbmFtZSBwcm9wZXJ0eS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSkgewotICAgICAgICB0aGlzLm5hbWUgPSB2YWx1ZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL3RlbXB1cmkvY29tcGxleC9kYXRhL05hbWUuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL3RlbXB1cmkvY29tcGxleC9kYXRhL05hbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M0M2E2Ny4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy90ZW1wdXJpL2NvbXBsZXgvZGF0YS9OYW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy50ZW1wdXJpLmNvbXBsZXguZGF0YTsKLQotcHVibGljIGNsYXNzIE5hbWUgewotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBuYW1lOwotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIG5hbWUgcHJvcGVydHkuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgbmFtZSBwcm9wZXJ0eS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSkgewotICAgICAgICB0aGlzLm5hbWUgPSB2YWx1ZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL3RlbXB1cmkvY29tcGxleC9kYXRhL1BlcnNvbi5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvdGVtcHVyaS9jb21wbGV4L2RhdGEvUGVyc29uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyNzkxNzQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvdGVtcHVyaS9jb21wbGV4L2RhdGEvUGVyc29uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcudGVtcHVyaS5jb21wbGV4LmRhdGE7Ci0KLXB1YmxpYyBjbGFzcyBQZXJzb24gewotCi0gICAgcHJvdGVjdGVkIERvdWJsZSBhZ2U7Ci0gICAgcHJvdGVjdGVkIEZsb2F0IGlkOwotICAgIHByb3RlY3RlZCBCb29sZWFuIG1hbGU7Ci0gICAgcHJvdGVjdGVkIFN0cmluZyBuYW1lOwotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGFnZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzCi0gICAgICogICAgICAgICB7QGxpbmsgRG91YmxlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgRG91YmxlIGdldEFnZSgpIHsKLSAgICAgICAgcmV0dXJuIGFnZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgYWdlIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIGFsbG93ZWQgb2JqZWN0IGlzCi0gICAgICogICAgICAgICAgICAgIHtAbGluayBEb3VibGUgfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEFnZShEb3VibGUgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5hZ2UgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgaWQgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHBvc3NpYmxlIG9iamVjdCBpcwotICAgICAqICAgICAgICAge0BsaW5rIEZsb2F0IH0KLSAgICAgKi8KLSAgICBwdWJsaWMgRmxvYXQgZ2V0SWQoKSB7Ci0gICAgICAgIHJldHVybiBpZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgaWQgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiAgICAgICAgICAgICAge0BsaW5rIEZsb2F0IH0KLSAgICAgKi8KLQotCi0gICAgcHVibGljIHZvaWQgc2V0SWQoRmxvYXQgaWQpIHsKLSAgICAgICAgdGhpcy5pZCA9IGlkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBtYWxlIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiBwb3NzaWJsZSBvYmplY3QgaXMKLSAgICAgKiAgICAgICAgIHtAbGluayBCb29sZWFuIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgQm9vbGVhbiBnZXRNYWxlKCkgewotICAgICAgICByZXR1cm4gbWFsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgbWFsZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcwotICAgICAqICAgICAgICAgICAgICB7QGxpbmsgQm9vbGVhbiB9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TWFsZShCb29sZWFuIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMubWFsZSA9IHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBuYW1lIHByb3BlcnR5LgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIG5hbWUgcHJvcGVydHkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5uYW1lID0gdmFsdWU7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy90ZW1wdXJpL2NvbXBsZXgvZGF0YS9UYWJsZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvdGVtcHVyaS9jb21wbGV4L2RhdGEvVGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg5ZTdmYy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy90ZW1wdXJpL2NvbXBsZXgvZGF0YS9UYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcudGVtcHVyaS5jb21wbGV4LmRhdGE7Ci0KLXB1YmxpYyBjbGFzcyBUYWJsZQotICAgICAgICBleHRlbmRzIEZ1cm5pdHVyZSB7Ci0KLSAgICBwcm90ZWN0ZWQgSW50ZWdlciBzZWF0aW5nQ2FwYWNpdHk7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgc2VhdGluZ0NhcGFjaXR5IHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiBwb3NzaWJsZSBvYmplY3QgaXMKLSAgICAgKiAgICAgICAgIHtAbGluayBJbnRlZ2VyIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgSW50ZWdlciBnZXRTZWF0aW5nQ2FwYWNpdHkoKSB7Ci0gICAgICAgIHJldHVybiBzZWF0aW5nQ2FwYWNpdHk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHNlYXRpbmdDYXBhY2l0eSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcwotICAgICAqICAgICAgICAgICAgICB7QGxpbmsgSW50ZWdlciB9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U2VhdGluZ0NhcGFjaXR5KEludGVnZXIgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5zZWF0aW5nQ2FwYWNpdHkgPSB2YWx1ZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL3RlbXB1cmkvY29tcGxleC9kYXRhL2FycmF5cy9BcnJheU9mQXJyYXlPZnN0cmluZy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvdGVtcHVyaS9jb21wbGV4L2RhdGEvYXJyYXlzL0FycmF5T2ZBcnJheU9mc3RyaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkNmFkYzcuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvdGVtcHVyaS9jb21wbGV4L2RhdGEvYXJyYXlzL0FycmF5T2ZBcnJheU9mc3RyaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy50ZW1wdXJpLmNvbXBsZXguZGF0YS5hcnJheXM7Ci0KLXB1YmxpYyBjbGFzcyBBcnJheU9mQXJyYXlPZnN0cmluZyB7Ci0KLSAgICBwcm90ZWN0ZWQgQXJyYXlPZnN0cmluZ1tdIGFycmF5T2ZzdHJpbmc7Ci0KLSAgICBwdWJsaWMgQXJyYXlPZnN0cmluZ1tdIGdldEFycmF5T2ZzdHJpbmcoKSB7Ci0gICAgICAgIGlmIChhcnJheU9mc3RyaW5nID09IG51bGwpIHsKLSAgICAgICAgICAgIGFycmF5T2ZzdHJpbmcgPSBuZXcgQXJyYXlPZnN0cmluZ1swXTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpcy5hcnJheU9mc3RyaW5nOwotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgc2V0QXJyYXlPZnN0cmluZyhBcnJheU9mc3RyaW5nW10gYXJyYXlPZnN0cmluZykgewotICAgICAgICB0aGlzLmFycmF5T2ZzdHJpbmcgPSBhcnJheU9mc3RyaW5nOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL3RlbXB1cmkvY29tcGxleC9kYXRhL2FycmF5cy9BcnJheU9mTnVsbGFibGVPZmRhdGVUaW1lLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy90ZW1wdXJpL2NvbXBsZXgvZGF0YS9hcnJheXMvQXJyYXlPZk51bGxhYmxlT2ZkYXRlVGltZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmRkMzRjLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL3RlbXB1cmkvY29tcGxleC9kYXRhL2FycmF5cy9BcnJheU9mTnVsbGFibGVPZmRhdGVUaW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy50ZW1wdXJpLmNvbXBsZXguZGF0YS5hcnJheXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7Ci0KLXB1YmxpYyBjbGFzcyBBcnJheU9mTnVsbGFibGVPZmRhdGVUaW1lIHsKLQotICAgIHByb3RlY3RlZCBDYWxlbmRhcltdIGRhdGVUaW1lOwotCi0gICAgcHVibGljIENhbGVuZGFyW10gZ2V0RGF0ZVRpbWUoKSB7Ci0gICAgICAgIGlmIChkYXRlVGltZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBkYXRlVGltZSA9IG5ldyBDYWxlbmRhclswXTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpcy5kYXRlVGltZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL3RlbXB1cmkvY29tcGxleC9kYXRhL2FycmF5cy9BcnJheU9mTnVsbGFibGVPZmRlY2ltYWwuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL3RlbXB1cmkvY29tcGxleC9kYXRhL2FycmF5cy9BcnJheU9mTnVsbGFibGVPZmRlY2ltYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2E3ODc0Yi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy90ZW1wdXJpL2NvbXBsZXgvZGF0YS9hcnJheXMvQXJyYXlPZk51bGxhYmxlT2ZkZWNpbWFsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy50ZW1wdXJpLmNvbXBsZXguZGF0YS5hcnJheXM7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKLQotcHVibGljIGNsYXNzIEFycmF5T2ZOdWxsYWJsZU9mZGVjaW1hbCB7Ci0KLSAgICBwcm90ZWN0ZWQgQmlnRGVjaW1hbFtdIGRlY2ltYWw7Ci0KLSAgICBwdWJsaWMgQmlnRGVjaW1hbFtdIGdldERlY2ltYWwoKSB7Ci0gICAgICAgIGlmIChkZWNpbWFsID09IG51bGwpIHsKLSAgICAgICAgICAgIGRlY2ltYWwgPSBuZXcgQmlnRGVjaW1hbFswXTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpcy5kZWNpbWFsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERlY2ltYWwoQmlnRGVjaW1hbFtdIGRlY2ltYWwpIHsKLSAgICAgICAgdGhpcy5kZWNpbWFsID0gZGVjaW1hbDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy90ZW1wdXJpL2NvbXBsZXgvZGF0YS9hcnJheXMvQXJyYXlPZlBlcnNvbi5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvdGVtcHVyaS9jb21wbGV4L2RhdGEvYXJyYXlzL0FycmF5T2ZQZXJzb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBlN2NkNS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy90ZW1wdXJpL2NvbXBsZXgvZGF0YS9hcnJheXMvQXJyYXlPZlBlcnNvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcudGVtcHVyaS5jb21wbGV4LmRhdGEuYXJyYXlzOwotCi1pbXBvcnQgb3JnLnRlbXB1cmkuY29tcGxleC5kYXRhLlBlcnNvbjsKLQotcHVibGljIGNsYXNzIEFycmF5T2ZQZXJzb24gewotCi0gICAgcHJvdGVjdGVkIFBlcnNvbltdIHBlcnNvbjsKLQotICAgIHB1YmxpYyBQZXJzb25bXSBnZXRQZXJzb24oKSB7Ci0gICAgICAgIGlmIChwZXJzb24gPT0gbnVsbCkgewotICAgICAgICAgICAgcGVyc29uID0gbmV3IFBlcnNvblswXTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpcy5wZXJzb247Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGVyc29uKFBlcnNvbltdIHBlcnNvbil7Ci0gICAgICAgIHRoaXMucGVyc29uID1wZXJzb247Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy90ZW1wdXJpL2NvbXBsZXgvZGF0YS9hcnJheXMvQXJyYXlPZmFueVR5cGUuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL3RlbXB1cmkvY29tcGxleC9kYXRhL2FycmF5cy9BcnJheU9mYW55VHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2I3NjJkLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL3RlbXB1cmkvY29tcGxleC9kYXRhL2FycmF5cy9BcnJheU9mYW55VHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcudGVtcHVyaS5jb21wbGV4LmRhdGEuYXJyYXlzOwotCi1wdWJsaWMgY2xhc3MgQXJyYXlPZmFueVR5cGUgewotCi0gICAgcHJpdmF0ZSBPYmplY3RbXSBhbnlUeXBlOwotCi0gICAgcHVibGljIE9iamVjdFtdIGdldEFueVR5cGUoKSB7Ci0gICAgICAgIGlmIChhbnlUeXBlID09IG51bGwpIHsKLSAgICAgICAgICAgIGFueVR5cGUgPSBuZXcgT2JqZWN0WzBdOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzLmFueVR5cGU7Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL3RlbXB1cmkvY29tcGxleC9kYXRhL2FycmF5cy9BcnJheU9maW50LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy90ZW1wdXJpL2NvbXBsZXgvZGF0YS9hcnJheXMvQXJyYXlPZmludC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWZhZDBkLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL3RlbXB1cmkvY29tcGxleC9kYXRhL2FycmF5cy9BcnJheU9maW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy50ZW1wdXJpLmNvbXBsZXguZGF0YS5hcnJheXM7Ci0KLQotcHVibGljIGNsYXNzIEFycmF5T2ZpbnQgewotCi0gICAgcHJvdGVjdGVkIEludGVnZXJbXSBfaW50OwotCi0gICAgcHVibGljIEludGVnZXJbXSBnZXRfaW50KCkgewotICAgICAgICBpZiAoX2ludCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBfaW50ID0gbmV3IEludGVnZXJbMF07Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMuX2ludDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRfaW50KEludGVnZXJbXSBfaW50KSB7Ci0gICAgICAgIHRoaXMuX2ludCA9IF9pbnQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvdGVtcHVyaS9jb21wbGV4L2RhdGEvYXJyYXlzL0FycmF5T2ZzaG9ydC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvdGVtcHVyaS9jb21wbGV4L2RhdGEvYXJyYXlzL0FycmF5T2ZzaG9ydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDZhNjViLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL3RlbXB1cmkvY29tcGxleC9kYXRhL2FycmF5cy9BcnJheU9mc2hvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLnRlbXB1cmkuY29tcGxleC5kYXRhLmFycmF5czsKLQotcHVibGljIGNsYXNzIEFycmF5T2ZzaG9ydCB7Ci0KLSAgICBwcm90ZWN0ZWQgU2hvcnRbXSBfc2hvcnQ7Ci0KLSAgICBwdWJsaWMgU2hvcnRbXSBnZXRfc2hvcnQoKSB7Ci0gICAgICAgIGlmIChfc2hvcnQgPT0gbnVsbCkgewotICAgICAgICAgICAgX3Nob3J0ID0gbmV3IFNob3J0WzBdOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzLl9zaG9ydDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRfc2hvcnQoU2hvcnRbXSBfc2hvcnQpIHsKLSAgICAgICAgdGhpcy5fc2hvcnQgPSBfc2hvcnQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvdGVtcHVyaS9jb21wbGV4L2RhdGEvYXJyYXlzL0FycmF5T2ZzdHJpbmcuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL3RlbXB1cmkvY29tcGxleC9kYXRhL2FycmF5cy9BcnJheU9mc3RyaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0OGU0NjMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvdGVtcHVyaS9jb21wbGV4L2RhdGEvYXJyYXlzL0FycmF5T2ZzdHJpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLnRlbXB1cmkuY29tcGxleC5kYXRhLmFycmF5czsKLQotcHVibGljIGNsYXNzIEFycmF5T2ZzdHJpbmcgewotCi0gICAgcHJvdGVjdGVkIFN0cmluZ1tdIHN0cmluZzsKLQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRTdHJpbmcoKSB7Ci0gICAgICAgIGlmIChzdHJpbmcgPT0gbnVsbCkgewotICAgICAgICAgICAgc3RyaW5nID0gbmV3IFN0cmluZ1swXTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpcy5zdHJpbmc7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCBzZXRTdHJpbmcoU3RyaW5nW10gc3RyaW5nKSB7Ci0gICAgICAgIHRoaXMuc3RyaW5nID0gc3RyaW5nOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL3RlbXB1cmkvZGlmZmVyZW5jZUVuZ2luZS9XU0RMQ29udHJvbGxlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvdGVtcHVyaS9kaWZmZXJlbmNlRW5naW5lL1dTRExDb250cm9sbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0YjQ4NzAuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvdGVtcHVyaS9kaWZmZXJlbmNlRW5naW5lL1dTRExDb250cm9sbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcudGVtcHVyaS5kaWZmZXJlbmNlRW5naW5lOw0KLQ0KLWltcG9ydCBvcmcuY3VzdG9tbW9ua2V5LnhtbHVuaXQuQ29tcGFyaXNvbkNvbnRyb2xsZXI7DQotaW1wb3J0IG9yZy5jdXN0b21tb25rZXkueG1sdW5pdC5EaWZmZXJlbmNlOw0KLQ0KLXB1YmxpYyBjbGFzcyBXU0RMQ29udHJvbGxlciBpbXBsZW1lbnRzIENvbXBhcmlzb25Db250cm9sbGVyIHsgICANCi0gICAgcHVibGljIFdTRExDb250cm9sbGVyICgpIHsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogRGV0ZXJtaW5lIHdoZXRoZXIgYSBEaWZmZXJlbmNlIHRoYXQgdGhpcyBsaXN0ZW5lciBoYXMgYmVlbiBub3RpZmllZCBvZg0KLSAgICAgKiAgc2hvdWxkIGhhbHQgZnVydGhlciBYTUwgY29tcGFyaXNvbi4gVGhpcyBpbXBsZW1lbnRhdGlvbiBoYWx0cyANCi0gICAgICogIGlmIHRoZSBEaWZmZXJlbmNlIGlzIG5vdCByZWNvdmVyYWJsZS4NCi0gICAgICogQHBhcmFtIGFmdGVyRGlmZmVyZW5jZSB0aGUgbGFzdCBEaWZmZXJlbmNlIHBhc3NlZCB0byA8Y29kZT5kaWZmZXJlbmNlRm91bmQ8L2NvZGU+DQotICAgICAqIEByZXR1cm4gZmFsc2UgaWYgdGhlIGRpZmZlcmVuY2UgaXMgcmVjb3ZlcmFibGUsIG90aGVyd2lzZSByZXR1cm4gdHJ1ZQ0KLSAgICAgKi8NCi0gICAgcHVibGljIGJvb2xlYW4gaGFsdENvbXBhcmlzb24oRGlmZmVyZW5jZSBhZnRlckRpZmZlcmVuY2UpIHsNCi0gICAgICAgIGlmIChhZnRlckRpZmZlcmVuY2UuaXNSZWNvdmVyYWJsZSgpKSB7DQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy90ZW1wdXJpL2RpZmZlcmVuY2VFbmdpbmUvV1NETERpZmZlcmVuY2VFbmdpbmUuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL3RlbXB1cmkvZGlmZmVyZW5jZUVuZ2luZS9XU0RMRGlmZmVyZW5jZUVuZ2luZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzYwN2Q0Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL3RlbXB1cmkvZGlmZmVyZW5jZUVuZ2luZS9XU0RMRGlmZmVyZW5jZUVuZ2luZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy50ZW1wdXJpLmRpZmZlcmVuY2VFbmdpbmU7DQotDQotaW1wb3J0IG9yZy5jdXN0b21tb25rZXkueG1sdW5pdC5Db21wYXJpc29uQ29udHJvbGxlcjsNCi1pbXBvcnQgb3JnLmN1c3RvbW1vbmtleS54bWx1bml0LkRpZmZlcmVuY2VFbmdpbmU7DQotaW1wb3J0IG9yZy5jdXN0b21tb25rZXkueG1sdW5pdC5EaWZmZXJlbmNlTGlzdGVuZXI7DQotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7DQotDQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsNCi0NCi0vKioNCi0gKiBUaGlzIGNsYXNzIGV4dGVuZHMgdGhlIERpZmZlcmVuY2VFbmdpbmUgY2xhc3MgdG8gb3ZlcndyaXRlIHRoZSBtZXRob2RzIHRoYXQNCi0gKiBpbmNvcnJlY3RseSBmYWlsIERpZmYuc2ltaWxhcigpIGZvciBjZXJ0YWluIGVxdWl2YWxlbnQgYnV0IG5vdCBpZGVudGljYWwNCi0gKiBYTUwgZmlsZSBjb21wYXJpc29ucy4NCi0gKi8NCi1wdWJsaWMgY2xhc3MgV1NETERpZmZlcmVuY2VFbmdpbmUgZXh0ZW5kcyBEaWZmZXJlbmNlRW5naW5lIHsNCi0gICAgLyoqDQotICAgICAqIFNpbXBsZSBjb25zdHJ1Y3Rvcg0KLSAgICAgKiBAcGFyYW0gY29udHJvbGxlciB0aGUgaW5zdGFuY2UgdXNlZCB0byBkZXRlcm1pbmUgd2hldGhlciBhIERpZmZlcmVuY2UNCi0gICAgICogIGRldGVjdGVkIGJ5IHRoaXMgY2xhc3Mgc2hvdWxkIGhhbHQgZnVydGhlciBjb21wYXJpc29uIG9yIG5vdA0KLSAgICAgKiBAc2VlIENvbXBhcmlzb25Db250cm9sbGVyI2hhbHRDb21wYXJpc29uKERpZmZlcmVuY2UpDQotICAgICAqLw0KLSAgICBwdWJsaWMgV1NETERpZmZlcmVuY2VFbmdpbmUoQ29tcGFyaXNvbkNvbnRyb2xsZXIgY29udHJvbGxlcikgew0KLSAgICAJc3VwZXIoY29udHJvbGxlcik7DQotICAgIH0NCi0gICAgICAgIA0KLSAgICAvKioNCi0gICAgICogQ29tcGFyZSB0d28gYXR0cmlidXRlcyB0byBkZXRlcm1pbmUgaWYgdGhleSBhcmUgZXF1aXZhbGVudA0KLSAgICAgKiBAcGFyYW0gY29udHJvbCBhIGtub3duIGF0dHJpYnV0ZSBhZ2FpbnN0IHdoaWNoIGEgdGVzdCBhdHRyaWJ1dGUgaXMgYmVpbmcgY29tcGFyZWQNCi0gICAgICogQHBhcmFtIHRlc3QgdGhlIGdlbmVyYXRlZCBhdHRyaWJ1dGUgdGhhdCBpcyBiZWluZyB0ZXN0ZWQgYWdhaW5zdCBhIGtub3duIGF0dHJpYnV0ZQ0KLSAgICAgKiBAcGFyYW0gbGlzdGVuZXIgDQotICAgICAqIEB0aHJvd3MgRGlmZmVyZW5jZUZvdW5kRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgZGlmZmVyZW5jZSBkZXRlY3RlZCBiZXR3ZWVuDQotICAgICAqICB0aGUgdHdvIGF0dHJpYnV0ZXMNCi0gICAgICovDQotICAgIHByb3RlY3RlZCB2b2lkIGNvbXBhcmVBdHRyaWJ1dGUoQXR0ciBjb250cm9sLCBBdHRyIHRlc3QsDQotICAgIERpZmZlcmVuY2VMaXN0ZW5lciBsaXN0ZW5lcikgdGhyb3dzIERpZmZlcmVuY2VGb3VuZEV4Y2VwdGlvbiB7ICAgIAkNCi0gICAgCS8vIFRoZXJlIGFyZSBubyBnZXR0ZXIgbWV0aG9kcyBmb3IgdGhlc2UgcHJpdmF0ZSBmaWVsZHMgaW4gRGlmZmVyZW5jZUVuZ2luZQ0KLSAgICAJLy8gY29udHJvbFRyYWNrZXIudmlzaXRlZChjb250cm9sKTsNCi0gICAgCS8vIHRlc3RUcmFja2VyLnZpc2l0ZWQodGVzdCk7DQotICAgIAkNCi0gICAgCWNvbXBhcmUoY29udHJvbC5nZXRQcmVmaXgoKSwgdGVzdC5nZXRQcmVmaXgoKSwgY29udHJvbCwgdGVzdCwgDQotICAgIAkJbGlzdGVuZXIsIE5BTUVTUEFDRV9QUkVGSVgpOw0KLQ0KLSAgICAgICAgY29tcGFyZShnZXRWYWx1ZVdpdGhvdXROYW1lc3BhY2UoY29udHJvbCksIGdldFZhbHVlV2l0aG91dE5hbWVzcGFjZSh0ZXN0KSwgY29udHJvbCwgdGVzdCwNCi0gICAgICAgICAgICBsaXN0ZW5lciwgQVRUUl9WQUxVRSk7DQotICAgICAgICANCi0gICAgICAgIGNvbXBhcmUoZ2V0VmFsdWVOYW1lc3BhY2VVUkkoY29udHJvbCksIGdldFZhbHVlTmFtZXNwYWNlVVJJKHRlc3QpLCBjb250cm9sLCB0ZXN0LA0KLSAgICAgICAgICAgICAgICBsaXN0ZW5lciwgQVRUUl9WQUxVRSk7ICAgICAgICANCi0gICAgICAgIA0KLSAgICAgICAgY29tcGFyZShjb250cm9sLmdldFNwZWNpZmllZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRSwNCi0gICAgICAgICAgICB0ZXN0LmdldFNwZWNpZmllZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRSwNCi0gICAgICAgICAgICBjb250cm9sLCB0ZXN0LCBsaXN0ZW5lciwgQVRUUl9WQUxVRV9FWFBMSUNJVExZX1NQRUNJRklFRCk7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBPYnRhaW4gdGhlIHZhbHVlIG9mIHRoaXMgYXR0cmlidXRlIHdpdGggdGhlIG5hbWVzcGFjZSBwcmVmaXggcmVtb3ZlZCAoaWYgcHJlc2VudCkNCi0gICAgICogQHBhcmFtIGF0dHIgdGhlIGF0dHJpYnV0ZSBmb3Igd2hpY2ggdGhlIG5vbiBuYW1lc3BhY2VkIHZhbHVlIGlzIHNvdWdodA0KLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGlzIGF0dHJpYnV0ZSB3aXRob3V0IGEgbmFtZXNwYWNlIHByZWZpeA0KLSAgICAgKi8NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRWYWx1ZVdpdGhvdXROYW1lc3BhY2UoQXR0ciBhdHRyKSB7DQotICAgIAlTdHJpbmcgdmFsdWUgPSBhdHRyLmdldFZhbHVlKCk7DQotICAgIAlpbnQgaW5kZXggPSB2YWx1ZS5pbmRleE9mKCc6Jyk7DQotICAgIAlpbnQgcHJvdG9jb2wgPSB2YWx1ZS5pbmRleE9mKCI6Ly8iKTsNCi0gICAgCQ0KLSAgICAJaWYgKHZhbHVlID09IG51bGwpDQotICAgIAkJcmV0dXJuIG51bGw7DQotICAgIAkNCi0gICAgCWlmIChpbmRleCA9PSAtMSB8fCBpbmRleCA9PSBwcm90b2NvbCkNCi0gICAgCQlyZXR1cm4gdmFsdWU7DQotICAgIAkNCi0gICAgCXJldHVybiB2YWx1ZS5zdWJzdHJpbmcoaW5kZXggKyAxKTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIE9idGFpbiB0aGUgbmFtZXNwYWNlIFVSSSBmb3IgdGhlIHZhbHVlIG9mIHRoaXMgYXR0ciAoaWYgYSBuYW1lc3BhY2UgcHJlZml4IGlzIHByZXNlbnQpDQotICAgICAqIEBwYXJhbSBhdHRyIHRoZSBhdHRyaWJ1dGUgZm9yIHdoaWNoIHRoZSBuYW1lc3BhY2UgVVJJIG9mIHRoZSB2YWx1ZSBpcyBzb3VnaHQNCi0gICAgICogQHJldHVybiB0aGUgbmFtZXNwYWNlIFVSSSBvZiB0aGUgYXR0cmlidXRlJ3MgdmFsdWUgaWYgYSBuYW1lc3BhY2UgcHJlZml4IGlzIA0KLSAgICAgKiAgcHJlc2VudCwgb3RoZXJ3aXNlIHJldHVybiBudWxsDQotICAgICAqLw0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFZhbHVlTmFtZXNwYWNlVVJJKEF0dHIgYXR0cikgew0KLSAgICAJU3RyaW5nIHZhbHVlID0gYXR0ci5nZXRWYWx1ZSgpOw0KLSAgICAJaW50IGluZGV4ID0gdmFsdWUuaW5kZXhPZignOicpOw0KLSAgICAJaW50IHByb3RvY29sID0gdmFsdWUuaW5kZXhPZigiOi8vIik7DQotICAgIAkNCi0gICAgCWlmICh2YWx1ZSA9PSBudWxsIHx8IGluZGV4ID09IC0xIHx8IGluZGV4ID09IHByb3RvY29sKQ0KLSAgICAJCXJldHVybiBudWxsOw0KLQ0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBNZXRob2QgbSA9IEF0dHIuY2xhc3MuZ2V0TWV0aG9kKCJsb29rdXBOYW1lc3BhY2VVUkkiLCBuZXcgQ2xhc3NbXXtTdHJpbmcuY2xhc3N9KTsNCi0gICAgICAgICAgICByZXR1cm4gKFN0cmluZykgbS5pbnZva2UoYXR0ciwgbmV3IE9iamVjdFtde3ZhbHVlLnN1YnN0cmluZygwLCBpbmRleCl9KTsNCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvdGVtcHVyaS9lbGVtZW50UXVhbGlmaWVyL1dTRExFbGVtZW50UXVhbGlmaWVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy90ZW1wdXJpL2VsZW1lbnRRdWFsaWZpZXIvV1NETEVsZW1lbnRRdWFsaWZpZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDIzNDFhOC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy90ZW1wdXJpL2VsZW1lbnRRdWFsaWZpZXIvV1NETEVsZW1lbnRRdWFsaWZpZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcudGVtcHVyaS5lbGVtZW50UXVhbGlmaWVyOw0KLQ0KLWltcG9ydCBvcmcuY3VzdG9tbW9ua2V5LnhtbHVuaXQuRWxlbWVudFF1YWxpZmllcjsNCi1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsNCi1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOw0KLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOw0KLQ0KLS8qKg0KLSAqIFRoaXMgaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uIGRldGVybWluZXMgd2hldGhlciB0d28gZWxlbWVudHMgc2hvdWxkIGJlIGNvbXBhcmVkDQotICogd2hlbiBjb21wYXJpbmcgV1NETCBmaWxlcy4gIFRoZSBub2RlcyBhcmUgaW50ZW5kZWQgZm9yIGNvbXBhcmlzb24gd2hlbiB0aGV5IGFyZSANCi0gKiBkZWZpbmVkIGJ5IHRoZSBzYW1lIG5hbWVzcGFjZSBVUkksIGhhdmUgdGhlIHNhbWUgdGFnIG5hbWUgKHdpdGhvdXQgbmFtZXNwYWNlKSwgDQotICogYW5kIGhhdmUgdGhlIHNhbWUgbmFtZSBhdHRyaWJ1dGUuDQotICovDQotcHVibGljIGNsYXNzIFdTRExFbGVtZW50UXVhbGlmaWVyIGltcGxlbWVudHMgRWxlbWVudFF1YWxpZmllciB7DQotICAgIA0KLSAgICAvKioNCi0gICAgICogRGV0ZXJtaW5lIHdoZXRoZXIgdHdvIGVsZW1lbnRzIGFyZSBjb21wYXJhYmxlDQotICAgICAqIEBwYXJhbSBjb250cm9sIGFuIEVsZW1lbnQgZnJvbSB0aGUgY29udHJvbCBYTUwgTm9kZUxpc3QNCi0gICAgICogQHBhcmFtIHRlc3QgYW4gRWxlbWVudCBmcm9tIHRoZSB0ZXN0IFhNTCBOb2RlTGlzdA0KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGVsZW1lbnRzIGFyZSBjb21wYXJhYmxlLCBvdGhlcndpc2UgcmV0dXJuIGZhbHNlLiAgVHdvIA0KLSAgICAgKiAgZWxlbWVudHMgc2hvdWxkIGJlIGNvbXBhcmVkIGlmIHRoZXkgaGF2ZSB0aGUgc2FtZSBuYW1lc3BhY2UgVVJJLCB0aGUgc2FtZQ0KLSAgICAgKiAgdGFnIG5hbWUgKHdpdGggbmFtZXNwYWNlIG5vdCBwcmVzZW50KSBhbmQgdGhlIHNhbWUgbmFtZSBhdHRyaWJ1dGUuDQotICAgICAqLw0KLSAgICBwdWJsaWMgYm9vbGVhbiBxdWFsaWZ5Rm9yQ29tcGFyaXNvbihFbGVtZW50IGNvbnRyb2wsIEVsZW1lbnQgdGVzdCkgew0KLSAgICAgICAgcmV0dXJuIGNvbnRyb2wgIT0gbnVsbCANCi0gICAgICAgICAgICAmJiB0ZXN0ICE9IG51bGwgDQotICAgICAgICAgICAgJiYgc2FtZU5hbWVzcGFjZVVSSShjb250cm9sLCB0ZXN0KQ0KLSAgICAgICAgICAgICYmIHNhbWVUYWdOYW1lKGNvbnRyb2wsIHRlc3QpDQotICAgICAgICAgICAgJiYgc2FtZU5hbWVBdHRyaWJ1dGUoY29udHJvbCwgdGVzdCk7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBEZXRlcm1pbmUgd2hldGhlciB0d28gbm9kZXMgYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2FtZSBuYW1lc3BhY2UgVVJJIA0KLSAgICAgKiBAcGFyYW0gY29udHJvbCBhbiBFbGVtZW50IGZyb20gdGhlIGNvbnRyb2wgWE1MIE5vZGVMaXN0DQotICAgICAqIEBwYXJhbSB0ZXN0IGFuIEVsZW1lbnQgZnJvbSB0aGUgdGVzdCBYTUwgTm9kZUxpc3QNCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSB0d28gbm9kZXMgYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2FtZSBuYW1lc3BhY2UgVVJJLA0KLSAgICAgKiAgb3RoZXJ3aXNlIHJldHVybiBmYWxzZQ0KLSAgICAgKi8NCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gc2FtZU5hbWVzcGFjZVVSSShOb2RlIGNvbnRyb2wsIE5vZGUgdGVzdCkgew0KLSAgICAgICAgU3RyaW5nIGNvbnRyb2xOUyA9IGNvbnRyb2wuZ2V0TmFtZXNwYWNlVVJJKCk7DQotICAgICAgICBTdHJpbmcgdGVzdE5TID0gdGVzdC5nZXROYW1lc3BhY2VVUkkoKTsNCi0gICAgICAgIA0KLSAgICAgICAgaWYgKGNvbnRyb2xOUyA9PSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuIHRlc3ROUyA9PSBudWxsOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICByZXR1cm4gY29udHJvbE5TLmVxdWFscyh0ZXN0TlMpOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogRGV0ZXJtaW5lIHdoZXRoZXIgdHdvIG5vZGVzIGhhdmUgdGhlIHNhbWUgdGFnIG5hbWUgb25jZSBhbnkgDQotICAgICAqIG5hbWVzcGFjZSBpbmZvcm1hdGlvbiBpcyByZW1vdmVkDQotICAgICAqIEBwYXJhbSBjb250cm9sIGFuIEVsZW1lbnQgZnJvbSB0aGUgY29udHJvbCBYTUwgTm9kZUxpc3QNCi0gICAgICogQHBhcmFtIHRlc3QgYW4gRWxlbWVudCBmcm9tIHRoZSB0ZXN0IFhNTCBOb2RlTGlzdA0KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHR3byBub2RlcyBoYXZlIHRoZSBzYW1lIHRhZyBuYW1lIG5vdCBpbmNsdWRpbmcgDQotICAgICAqICBuYW1lc3BhY2UgaW5mb3JtYXRpb24gKGlmIHByZXNlbnQpLCBvdGhlcndpc2UgcmV0dXJuIGZhbHNlDQotICAgICAqLw0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBzYW1lVGFnTmFtZShOb2RlIGNvbnRyb2wsIE5vZGUgdGVzdCkgew0KLSAgICAJcmV0dXJuIGdldFRhZ1dpdGhvdXROYW1lc3BhY2UoY29udHJvbCkuZXF1YWxzKGdldFRhZ1dpdGhvdXROYW1lc3BhY2UodGVzdCkpOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogUmVtb3ZlIGFueSBuYW1lc3BhY2UgaW5mb3JtYXRpb24gZnJvbSBhIHRhZyBuYW1lDQotICAgICAqIEBwYXJhbSBub2RlIGFuIEVsZW1lbnQgZnJvbSBhbiBYTUwgTm9kZUxpc3QNCi0gICAgICogQHJldHVybiB0aGUgbG9jYWxOYW1lIGlmIHRoZSBub2RlIGluY2x1ZGVzIG5hbWVzcGFjZSBpbmZvcm1hdGlvbiwgDQotICAgICAqICBvdGhlcndpc2UgcmV0dXJuIHRoZSBub2RlTmFtZQ0KLSAgICAgKi8NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRUYWdXaXRob3V0TmFtZXNwYWNlKE5vZGUgbm9kZSkgew0KLSAgICAgICAgU3RyaW5nIG5hbWUgPSBub2RlLmdldExvY2FsTmFtZSgpOw0KLSAgICAgICAgDQotICAgICAgICBpZiAobmFtZSA9PSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuIG5vZGUuZ2V0Tm9kZU5hbWUoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgcmV0dXJuIG5hbWU7DQotICAgIH0gDQotICAgIA0KLSAgICAvKioNCi0gICAgICogRGV0ZXJtaW5lIHdoZXRoZXIgdHdvIG5vZGVzIGhhdmUgdGhlIHNhbWUgbmFtZSBhdHRyaWJ1dGUgDQotICAgICAqIEBwYXJhbSBjb250cm9sIGFuIEVsZW1lbnQgZnJvbSB0aGUgY29udHJvbCBYTUwgTm9kZUxpc3QNCi0gICAgICogQHBhcmFtIHRlc3QgYW4gRWxlbWVudCBmcm9tIHRoZSB0ZXN0IFhNTCBOb2RlTGlzdA0KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHR3byBub2RlcyBoYXZlIHRoZSBzYW1lIG5hbWUgYXR0cmlidXRlIA0KLSAgICAgKiAgKHdpdGggdGhlIGFic2VuY2Ugb2YgYSBuYW1lIGF0dHJpYnV0ZSBjb25zaWRlcmVkIGEgc3BlY2lmaWMNCi0gICAgICogIG5hbWUgYXR0cmlidXRlKSwgb3RoZXJ3aXNlIHJldHVybiBmYWxzZQ0KLSAgICAgKi8NCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gc2FtZU5hbWVBdHRyaWJ1dGUoTm9kZSBjb250cm9sLCBOb2RlIHRlc3QpIHsNCi0gICAgCXJldHVybiBnZXROYW1lQXR0cmlidXRlKGNvbnRyb2wpLmVxdWFscyhnZXROYW1lQXR0cmlidXRlKHRlc3QpKTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIE9idGFpbiB0aGUgbmFtZSBhdHRyaWJ1dGUgZm9yIHRoZSBub2RlDQotICAgICAqIEBwYXJhbSBub2RlIGFuIEVsZW1lbnQgZm9yIHdoaWNoIHRoZSBOYW1lIGF0dHJpYnV0ZSBpcyBzb3VnaHQNCi0gICAgICogQHJldHVybiB0aGUgbmFtZSBhdHRyaWJ1dGUgZm9yIHRoZSBub2RlIGlmIHRoZSAibmFtZSIgYXR0cmlidXRlDQotICAgICAqICBleGlzdHMsIG90aGVyd2lzZSByZXR1cm4gIiINCi0gICAgICovDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0TmFtZUF0dHJpYnV0ZShOb2RlIG5vZGUpIHsNCi0gICAgICAgIE5hbWVkTm9kZU1hcCBubk1hcCA9IG5vZGUuZ2V0QXR0cmlidXRlcygpOw0KLSAgICAgICAgDQotICAgICAgICBpZiAobm5NYXAuZ2V0TGVuZ3RoKCkgPT0gMCkgew0KLSAgICAgICAgICAgIHJldHVybiAiIjsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgTm9kZSBuYW1lQXR0ck5vZGUgPSBubk1hcC5nZXROYW1lZEl0ZW0oIm5hbWUiKTsNCi0gICAgICAgIGlmIChuYW1lQXR0ck5vZGUgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiAiIjsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgcmV0dXJuIG5hbWVBdHRyTm9kZS5nZXROb2RlVmFsdWUoKTsNCi0gICAgfSANCi0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF2YTJ3c2RsL3BvbS54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9qYXZhMndzZGwvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWMzZTJkYy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXZhMndzZGwvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItcGFyZW50PC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4xLjUuMTwvdmVyc2lvbj4KLSAgICAgICAgPHJlbGF0aXZlUGF0aD4uLi9wYXJlbnQvcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgotICAgIDwvcGFyZW50PgotICAgIDxhcnRpZmFjdElkPmF4aXMyLWphdmEyd3NkbDwvYXJ0aWZhY3RJZD4KLSAgICA8bmFtZT5BcGFjaGUgQXhpczIgLSBKYXZhMldTREw8L25hbWU+Ci0gICAgPGRlc2NyaXB0aW9uPlRvIGdlbmVyYXRlIFdTREwgZmlsZSBmb3IgYSBnaXZlbiBKYXZhIGNsYXNzPC9kZXNjcmlwdGlvbj4KLSAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1rZXJuZWw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3ZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLXRyYW5zcG9ydC1odHRwPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHt2ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi10cmFuc3BvcnQtbG9jYWw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3ZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5hbnQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5hbnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPCEtLSBleHRlcm5hbCBKQVJzIC0tPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmNvbW1vbnMtbG9nZ2luZzwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtbG9nZ2luZzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDwhLS1hZGRlZCB0aGlzIHRvIHN1cHBvcnQgdG8ga2VlcCBXU0RMIGluZm9ybWF0aW9uIGluIEF4aXNTZXJ2aWNlLS0+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPlhtbFNjaGVtYTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZ2Vyb25pbW8uc3BlY3M8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5nZXJvbmltby1qYXZhbWFpbF8xLjRfc3BlYzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmpheGVuPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF4ZW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD54YWxhbjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnhhbGFuPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPC9kZXBlbmRlbmNpZXM+Ci0gICAgPGJ1aWxkPgotICAgICAgICA8c291cmNlRGlyZWN0b3J5PnNyYzwvc291cmNlRGlyZWN0b3J5PgotICAgICAgICA8dGVzdFNvdXJjZURpcmVjdG9yeT50ZXN0PC90ZXN0U291cmNlRGlyZWN0b3J5PgotICAgICAgICA8cmVzb3VyY2VzPgotICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+Y29uZjwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxleGNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovKi5wcm9wZXJ0aWVzPC9leGNsdWRlPgotICAgICAgICAgICAgICAgIDwvZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgPGZpbHRlcmluZz5mYWxzZTwvZmlsdGVyaW5nPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYzwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxleGNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovKi5qYXZhPC9leGNsdWRlPgotICAgICAgICAgICAgICAgIDwvZXhjbHVkZXM+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+Li4vLi48L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPk5PVElDRS50eHQ8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPkxJQ0VOU0UudHh0PC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgPGZpbHRlcmluZz5mYWxzZTwvZmlsdGVyaW5nPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgPC9yZXNvdXJjZXM+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxza2lwPmZhbHNlPC9za2lwPgotICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi8qQWJzdHJhY3QqLmphdmE8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLypUZXN0LmphdmE8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgIDwvcGx1Z2lucz4KLSAgICA8L2J1aWxkPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF2YTJ3c2RsL3NyYy9vcmcvYXBhY2hlL3dzL2phdmEyd3NkbC9KYXZhMldTREwuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2phdmEyd3NkbC9zcmMvb3JnL2FwYWNoZS93cy9qYXZhMndzZGwvSmF2YTJXU0RMLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxZjM1OTIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF2YTJ3c2RsL3NyYy9vcmcvYXBhY2hlL3dzL2phdmEyd3NkbC9KYXZhMldTREwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS53cy5qYXZhMndzZGw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLndzLmphdmEyd3NkbC51dGlscy5KYXZhMldTRExDb21tYW5kTGluZU9wdGlvblBhcnNlcjsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmphdmEyd3NkbC51dGlscy5KYXZhMldTRExPcHRpb25zVmFsaWRhdG9yOwotCi1wdWJsaWMgY2xhc3MgSmF2YTJXU0RMIHsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgSmF2YTJXU0RMQ29tbWFuZExpbmVPcHRpb25QYXJzZXIgY29tbWFuZExpbmVPcHRpb25QYXJzZXIgPSBuZXcgSmF2YTJXU0RMQ29tbWFuZExpbmVPcHRpb25QYXJzZXIoCi0gICAgICAgICAgICAgICAgYXJncyk7Ci0gICAgICAgIC8vICB2YWxpZGF0ZSB0aGUgYXJndW1lbnRzCi0gICAgICAgIHZhbGlkYXRlQ29tbWFuZExpbmVPcHRpb25zKGNvbW1hbmRMaW5lT3B0aW9uUGFyc2VyKTsKLSAgICAgICAgSmF2YTJXU0RMQ29kZWdlbkVuZ2luZSBlbmdpbmUgPSBuZXcgSmF2YTJXU0RMQ29kZWdlbkVuZ2luZShjb21tYW5kTGluZU9wdGlvblBhcnNlci5nZXRBbGxPcHRpb25zKCkpOwotICAgICAgICBlbmdpbmUuZ2VuZXJhdGUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnRVc2FnZSgpIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJVc2FnZTogamF2YTJ3c2RsIFtvcHRpb25zXSAtY24gPGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lPiIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxud2hlcmUgW29wdGlvbnNdIGluY2x1ZGU6Iik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAtbyA8b3V0cHV0IGxvY2F0aW9uPiAgICAgICAgICAgICAgICAgICAgb3V0cHV0IGRpcmVjdG9yeSIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgLW9mIDxvdXRwdXQgZmlsZSBuYW1lPiAgICAgICAgICAgICAgICAgIG91dHB1dCBmaWxlIG5hbWUgZm9yIHRoZSBXU0RMIik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAtc24gPHNlcnZpY2UgbmFtZT4gICAgICAgICAgICAgICAgICAgICAgc2VydmljZSBuYW1lIik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAtbCA8c29hcCBhZGRyZXNzPiAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcyBvZiB0aGUgcG9ydCBmb3IgdGhlIFdTREwiKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIC1jcCA8Y2xhc3MgcGF0aCB1cmk+ICAgICAgICAgICAgICAgICAgICBsaXN0IG9mIGNsYXNzcGF0aCBlbnRyaWVzIC0gKHVybHMpIik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAtdG4gPHRhcmdldCBuYW1lc3BhY2U+ICAgICAgICAgICAgICAgICAgdGFyZ2V0IG5hbWVzcGFjZSBmb3Igc2VydmljZSIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgLXRwIDx0YXJnZXQgbmFtZXNwYWNlIHByZWZpeD4gICAgICAgICAgIHRhcmdldCBuYW1lc3BhY2UgcHJlZml4IGZvciBzZXJ2aWNlIik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAtc3RuIDxzY2hlbWEgdGFyZ2V0IG5hbWVzcGFjZT4gICAgICAgICAgdGFyZ2V0IG5hbWVzcGFjZSBmb3Igc2NoZW1hIik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAtc3RwIDxzY2hlbWEgdGFyZ2V0IG5hbWVzcGFjZSBwcmVmaXg+ICAgdGFyZ2V0IG5hbWVzcGFjZSBwcmVmaXggZm9yIHNjaGVtYSIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgLXN0IDxiaW5kaW5nIHN0eWxlPiAgICAgICAgICAgICAgICAgICAgIHN0eWxlIGZvciB0aGUgV1NETCIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgLXUgPGJpbmRpbmcgdXNlPiAgICAgICAgICAgICAgICAgICAgICAgIHVzZSBmb3IgdGhlIFdTREwiKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIC1uc2cgPGNsYXNzIG5hbWU+ICAgICAgICAgICAgICAgICAgICAgICBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyBOYW1lc3BhY2VHZW5lcmF0b3IiKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIC1zZyA8Y2xhc3MgbmFtZT4gICAgICAgICAgICAgICAgICAgICAgICBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyBTY2hlbWFHZW5lcmF0b3IiKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIC1wMm4gWzxqYXZhIHBhY2thZ2U+LDxuYW1lc3BhY2VdIFs8amF2YSBwYWNrYWdlPiw8bmFtZXNwYWNlXS4uLiAiKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhIHBhY2thZ2UgdG8gbmFtZXNwYWNlIG1hcHBpbmcgZm9yIGFyZ3VtZW50IGFuZCByZXR1cm4gdHlwZXMiKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIC1wMm4gW2FsbCwgPG5hbWVzcGFjZT5dICAgICAgICAgICAgICAgICB0byBhc3NpZ24gYWxsIHR5cGVzIHRvIGEgc2luZ2xlIG5hbWVzcGFjZSIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgLWVmZCA8cXVhbGlmaWVkL3VucXVhbGlmaWVkPiAgICAgICAgICAgIHNldHRpbmcgZm9yIGVsZW1lbnRGb3JtRGVmYXVsdCAoZGVmYXVsdHMgdG8gcXVhbGlmaWVkKSIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgLWFmZCA8cXVhbGlmaWVkL3VucXVhbGlmaWVkPiAgICAgICAgICAgIHNldHRpbmcgZm9yIGF0dHJpYnV0ZUZvcm1EZWZhdWx0IChkZWZhdWx0cyB0byBxdWFsaWZpZWQpIik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAteGMgY2xhc3MxIC14YyBjbGFzczIuLi4gICAgICAgICAgICAgICAgZXh0cmEgY2xhc3MoZXMpIGZvciB3aGljaCBzY2hlbWF0eXBlIG11c3QgYmUgZ2VuZXJhdGVkLiAgIik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAtd3YgPDEuMS8yLjA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NkbCB2ZXJzaW9uIC0gZGVmYXVsdHMgdG8gMS4xIGlmIG5vdCBzcGVjaWZpZWQiKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIC1kbGIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZSBzY2hlbWFzIGNvbmZvcm1pbmcgdG8gZG9jL2xpdC9iYXJlIHN0eWxlIik7Ci0gICAgICAgIFN5c3RlbS5leGl0KDApOwotICAgIH0KLQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB2YWxpZGF0ZUNvbW1hbmRMaW5lT3B0aW9ucygKLSAgICAgICAgICAgIEphdmEyV1NETENvbW1hbmRMaW5lT3B0aW9uUGFyc2VyIHBhcnNlcikgewotICAgICAgICBpZiAocGFyc2VyLmdldEFsbE9wdGlvbnMoKS5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgcHJpbnRVc2FnZSgpOwotICAgICAgICB9IGVsc2UgaWYgKHBhcnNlci5nZXRJbnZhbGlkT3B0aW9ucyhuZXcgSmF2YTJXU0RMT3B0aW9uc1ZhbGlkYXRvcigpKS5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBwcmludFVzYWdlKCk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotfQotCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXZhMndzZGwvc3JjL29yZy9hcGFjaGUvd3MvamF2YTJ3c2RsL0phdmEyV1NETEJ1aWxkZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2phdmEyd3NkbC9zcmMvb3JnL2FwYWNoZS93cy9qYXZhMndzZGwvSmF2YTJXU0RMQnVpbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWI3NGRkLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2phdmEyd3NkbC9zcmMvb3JnL2FwYWNoZS93cy9qYXZhMndzZGwvSmF2YTJXU0RMQnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS53cy5qYXZhMndzZGw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQudXRpbC5VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2UyV1NETDExOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2UyV1NETDIwOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uV1NETDJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5qYXZhMndzZGwuRGVmYXVsdE5hbWVzcGFjZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLmphdmEyd3NkbC5EZWZhdWx0U2NoZW1hR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uamF2YTJ3c2RsLkRvY0xpdEJhcmVTY2hlbWFHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5qYXZhMndzZGwuSmF2YTJXU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uamF2YTJ3c2RsLkphdmEyV1NETFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uamF2YTJ3c2RsLk5hbWVzcGFjZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLmphdmEyd3NkbC5TY2hlbWFHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0NvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuTWVzc2FnZVJlY2VpdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5Mb2FkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLlhNTFByZXR0eVByaW50ZXI7Ci0KLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1wdWJsaWMgY2xhc3MgSmF2YTJXU0RMQnVpbGRlciBpbXBsZW1lbnRzIEphdmEyV1NETENvbnN0YW50cyB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTEwgPSAiYWxsIjsKLQlwcml2YXRlIE91dHB1dFN0cmVhbSBvdXQ7Ci0JcHJpdmF0ZSBTdHJpbmcgY2xhc3NOYW1lOwotCXByaXZhdGUgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXI7Ci0JcHJpdmF0ZSBTdHJpbmcgd3NkbFByZWZpeCA9ICJ3c2RsIjsKLQotCXByaXZhdGUgU3RyaW5nIHNlcnZpY2VOYW1lID0gbnVsbDsKLQotCS8vIHRoZXNlIGFwcGx5IGZvciB0aGUgV1NETAotCXByaXZhdGUgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlUHJlZml4ID0gbnVsbDsKLQotCXByaXZhdGUgU3RyaW5nIGF0dHJGb3JtRGVmYXVsdCA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgZWxlbWVudEZvcm1EZWZhdWx0ID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBzY2hlbWFUYXJnZXROYW1lc3BhY2UgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIHNjaGVtYVRhcmdldE5hbWVzcGFjZVByZWZpeCA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgc3R5bGUgPSBKYXZhMldTRExDb25zdGFudHMuRE9DVU1FTlQ7Ci0JcHJpdmF0ZSBTdHJpbmcgdXNlID0gSmF2YTJXU0RMQ29uc3RhbnRzLkxJVEVSQUw7Ci0JcHJpdmF0ZSBTdHJpbmcgbG9jYXRpb25Vcmk7Ci0JcHJpdmF0ZSBBcnJheUxpc3QgZXh0cmFDbGFzc2VzOwotCi0JcHJpdmF0ZSBTdHJpbmcgbnNHZW5DbGFzc05hbWUgPSBudWxsOwotCXByaXZhdGUgTWFwIHBrZzJuc01hcCA9IG51bGw7Ci0JcHJpdmF0ZSBib29sZWFuIHByZXR0eSA9IHRydWU7Ci0JcHJpdmF0ZSBTdHJpbmcgd3NkbFZlcnNpb24gPSBXU0RMX1ZFUlNJT05fMTsKLQlwcml2YXRlIFN0cmluZyBzY2hlbWFHZW5DbGFzc05hbWUgPSBudWxsOwotCXByaXZhdGUgYm9vbGVhbiBnZW5lcmF0ZURvY0xpdEJhcmUgPSBmYWxzZTsKLQlwcml2YXRlIEF4aXNDb25maWd1cmF0aW9uIGF4aXNDb25maWc7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgY3VzdG9tU2NoZW1hTG9jYXRpb247Ci0gICAgLy8gbG9jYXRpb24gb2YgdGhlIGNsYXNzIG5hbWUgdG8gcGFja2FnZSBtYXBwaW5nIGZpbGUKLSAgICAvLyBGaWxlIGlzIHNpbXBsZSBmaWxlIHdpdGggcXVhbGlmaWVkQ2xhc3NOYW1lOlNjaGVtYVFOYW1lCi0gICAgcHJpdmF0ZSBTdHJpbmcgbWFwcGluZ0ZpbGVMb2NhdGlvbjsKLSAgICBwcml2YXRlIEhhc2hNYXAgbWVzc2FnZVJlY2VpdmVycyA9IG51bGw7Ci0KLSAgICBwdWJsaWMgSmF2YTJXU0RMQnVpbGRlcigpIHsKLQkJdHJ5IHsKLQkJCUNvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0N0eCA9IENvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeQotCQkJCQkuY3JlYXRlRGVmYXVsdENvbmZpZ3VyYXRpb25Db250ZXh0KCk7Ci0JCQlheGlzQ29uZmlnID0gY29uZmlnQ3R4LmdldEF4aXNDb25maWd1cmF0aW9uKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQotCXB1YmxpYyBKYXZhMldTRExCdWlsZGVyKEF4aXNDb25maWd1cmF0aW9uIGF4aXNDb25maWcpIHsKLQkJdGhpcy5heGlzQ29uZmlnID0gYXhpc0NvbmZpZzsKLQl9Ci0KLQlwdWJsaWMgSmF2YTJXU0RMQnVpbGRlcihPdXRwdXRTdHJlYW0gb3V0LCBTdHJpbmcgY2xhc3NOYW1lLAotCQkJQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpIHsKLQkJdHJ5IHsKLQkJCUNvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0N0eCA9IENvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeQotCQkJCQkuY3JlYXRlRGVmYXVsdENvbmZpZ3VyYXRpb25Db250ZXh0KCk7Ci0JCQlheGlzQ29uZmlnID0gY29uZmlnQ3R4LmdldEF4aXNDb25maWd1cmF0aW9uKCk7Ci0JCQl0aGlzLm91dCA9IG91dDsKLQkJCXRoaXMuY2xhc3NOYW1lID0gY2xhc3NOYW1lOwotCQkJdGhpcy5jbGFzc0xvYWRlciA9IGNsYXNzTG9hZGVyOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0KLSAgICBwdWJsaWMgSmF2YTJXU0RMQnVpbGRlcihPdXRwdXRTdHJlYW0gb3V0LCBTdHJpbmcgY2xhc3NOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyLCBIYXNoTWFwIG1lc3NhZ2VSZWNlaXZlcnMpIHsKLSAgICAgICAgdGhpcyhvdXQsIGNsYXNzTmFtZSwgY2xhc3NMb2FkZXIpOwotICAgICAgICB0aGlzLm1lc3NhZ2VSZWNlaXZlcnMgPSBtZXNzYWdlUmVjZWl2ZXJzOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2NoZW1hVGFyZ2V0TmFtZXNwYWNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmIChzY2hlbWFUYXJnZXROYW1lc3BhY2UgPT0gbnVsbCkgewotCQkJc2NoZW1hVGFyZ2V0TmFtZXNwYWNlID0gSmF2YTJXU0RMVXRpbHMKLQkJCQkJLnNjaGVtYU5hbWVzcGFjZUZyb21DbGFzc05hbWUoY2xhc3NOYW1lLCBjbGFzc0xvYWRlciwKLQkJCQkJCQlyZXNvbHZlTlNHZW4oKSkudG9TdHJpbmcoKTsKLQkJfQotCQlyZXR1cm4gc2NoZW1hVGFyZ2V0TmFtZXNwYWNlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3R5bGUoKSB7Ci0JCXJldHVybiBzdHlsZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExvY2F0aW9uVXJpKCkgewotCQlyZXR1cm4gbG9jYXRpb25Vcmk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TG9jYXRpb25VcmkoU3RyaW5nIGxvY2F0aW9uVXJpKSB7Ci0JCXRoaXMubG9jYXRpb25VcmkgPSBsb2NhdGlvblVyaTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTdHlsZShTdHJpbmcgc3R5bGUpIHsKLQkJdGhpcy5zdHlsZSA9IHN0eWxlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VXNlKCkgewotCQlyZXR1cm4gdXNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFVzZShTdHJpbmcgdXNlKSB7Ci0JCXRoaXMudXNlID0gdXNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNjaGVtYVRhcmdldE5hbWVzcGFjZShTdHJpbmcgc2NoZW1hVGFyZ2V0TmFtZXNwYWNlKSB7Ci0JCXRoaXMuc2NoZW1hVGFyZ2V0TmFtZXNwYWNlID0gc2NoZW1hVGFyZ2V0TmFtZXNwYWNlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U2NoZW1hVGFyZ2V0TmFtZXNwYWNlUHJlZml4KCkgewotCQlpZiAoc2NoZW1hVGFyZ2V0TmFtZXNwYWNlUHJlZml4ID09IG51bGwpIHsKLQkJCXRoaXMuc2NoZW1hVGFyZ2V0TmFtZXNwYWNlUHJlZml4ID0gU0NIRU1BX05BTUVTUEFDRV9QUkZJWDsKLQkJfQotCQlyZXR1cm4gc2NoZW1hVGFyZ2V0TmFtZXNwYWNlUHJlZml4OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNjaGVtYVRhcmdldE5hbWVzcGFjZVByZWZpeCgKLQkJCVN0cmluZyBzY2hlbWFUYXJnZXROYW1lc3BhY2VQcmVmaXgpIHsKLQkJdGhpcy5zY2hlbWFUYXJnZXROYW1lc3BhY2VQcmVmaXggPSBzY2hlbWFUYXJnZXROYW1lc3BhY2VQcmVmaXg7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUYXJnZXROYW1lc3BhY2UoKSB7Ci0JCXJldHVybiB0YXJnZXROYW1lc3BhY2U7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VGFyZ2V0TmFtZXNwYWNlKFN0cmluZyB0YXJnZXROYW1lc3BhY2UpIHsKLQkJdGhpcy50YXJnZXROYW1lc3BhY2UgPSB0YXJnZXROYW1lc3BhY2U7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUYXJnZXROYW1lc3BhY2VQcmVmaXgoKSB7Ci0JCWlmICh0YXJnZXROYW1lc3BhY2VQcmVmaXggPT0gbnVsbCkgewotCQkJdGhpcy50YXJnZXROYW1lc3BhY2VQcmVmaXggPSBUQVJHRVROQU1FU1BBQ0VfUFJFRklYOwotCQl9Ci0JCXJldHVybiB0YXJnZXROYW1lc3BhY2VQcmVmaXg7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VGFyZ2V0TmFtZXNwYWNlUHJlZml4KFN0cmluZyB0YXJnZXROYW1lc3BhY2VQcmVmaXgpIHsKLQkJdGhpcy50YXJnZXROYW1lc3BhY2VQcmVmaXggPSB0YXJnZXROYW1lc3BhY2VQcmVmaXg7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTZXJ2aWNlTmFtZSgpIHsKLQkJcmV0dXJuIHNlcnZpY2VOYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNlcnZpY2VOYW1lKFN0cmluZyBzZXJ2aWNlTmFtZSkgewotCQl0aGlzLnNlcnZpY2VOYW1lID0gc2VydmljZU5hbWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRXc2RsUHJlZml4KCkgewotCQlyZXR1cm4gd3NkbFByZWZpeDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRXc2RsUHJlZml4KFN0cmluZyB3c2RsUHJlZml4KSB7Ci0JCXRoaXMud3NkbFByZWZpeCA9IHdzZGxQcmVmaXg7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNHZW5lcmF0ZURvY0xpdEJhcmUoKSB7Ci0JCXJldHVybiBnZW5lcmF0ZURvY0xpdEJhcmU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0R2VuZXJhdGVEb2NMaXRCYXJlKGJvb2xlYW4gZ2VuZXJhdGVEb2NMaXRCYXJlKSB7Ci0JCXRoaXMuZ2VuZXJhdGVEb2NMaXRCYXJlID0gZ2VuZXJhdGVEb2NMaXRCYXJlOwotCX0KLQotCXB1YmxpYyB2b2lkIGdlbmVyYXRlV1NETCgpIHRocm93cyBFeGNlcHRpb24gewotCQlTY2hlbWFHZW5lcmF0b3Igc2NoZW1hR2VuZXJhdG9yID0gcmVzb2x2ZVNjaGVtYUdlbihjbGFzc0xvYWRlciwKLQkJCQljbGFzc05hbWUsIGdldFNjaGVtYVRhcmdldE5hbWVzcGFjZSgpLAotCQkJCWdldFNjaGVtYVRhcmdldE5hbWVzcGFjZVByZWZpeCgpKTsKLQotCQlBcnJheUxpc3QgZXhjbHVkZWRPcGVyYXRpb24gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCVV0aWxzLmFkZEV4Y2x1ZGVNZXRob2RzKGV4Y2x1ZGVkT3BlcmF0aW9uKTsKLQkJc2NoZW1hR2VuZXJhdG9yLnNldEV4Y2x1ZGVNZXRob2RzKGV4Y2x1ZGVkT3BlcmF0aW9uKTsKLQkJc2NoZW1hR2VuZXJhdG9yLnNldEF0dHJGb3JtRGVmYXVsdChnZXRBdHRyRm9ybURlZmF1bHQoKSk7Ci0JCXNjaGVtYUdlbmVyYXRvci5zZXRFbGVtZW50Rm9ybURlZmF1bHQoZ2V0RWxlbWVudEZvcm1EZWZhdWx0KCkpOwotCQlzY2hlbWFHZW5lcmF0b3Iuc2V0RXh0cmFDbGFzc2VzKGdldEV4dHJhQ2xhc3NlcygpKTsKLQkJc2NoZW1hR2VuZXJhdG9yLnNldE5zR2VuKHJlc29sdmVOU0dlbigpKTsKLQkJc2NoZW1hR2VuZXJhdG9yLnNldFBrZzJuc21hcChnZXRQa2cybnNNYXAoKSk7Ci0gICAgICAgIHNjaGVtYUdlbmVyYXRvci5zZXRNYXBwaW5nRmlsZUxvY2F0aW9uKGdldE1hcHBpbmdGaWxlTG9jYXRpb24oKSk7Ci0gICAgICAgIHNjaGVtYUdlbmVyYXRvci5zZXRDdXN0b21TY2hlbWFMb2NhdGlvbihnZXRDdXN0b21TY2hlbWFMb2NhdGlvbigpKTsKLSAgICAgICAgaWYgKGdldFBrZzJuc01hcCgpICE9IG51bGwKLQkJCQkmJiAhZ2V0UGtnMm5zTWFwKCkuaXNFbXB0eSgpCi0JCQkJJiYgKGdldFBrZzJuc01hcCgpLmNvbnRhaW5zS2V5KEFMTCkgfHwgZ2V0UGtnMm5zTWFwKCkKLQkJCQkJCS5jb250YWluc0tleShBTEwudG9VcHBlckNhc2UoKSkpKSB7Ci0JCQlzY2hlbWFHZW5lcmF0b3Iuc2V0VXNlV1NETFR5cGVzTmFtZXNwYWNlKHRydWUpOwotCQl9Ci0KLSAgICAgICAgaWYobWVzc2FnZVJlY2VpdmVycyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtZXNzYWdlUmVjZWl2ZXJzID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgICAgIENsYXNzIGluT25seU1lc3NhZ2VSZWNlaXZlciA9IExvYWRlcgotICAgICAgICAgICAgICAgICAgICAubG9hZENsYXNzKCJvcmcuYXBhY2hlLmF4aXMyLnJwYy5yZWNlaXZlcnMuUlBDSW5Pbmx5TWVzc2FnZVJlY2VpdmVyIik7Ci0gICAgICAgICAgICBNZXNzYWdlUmVjZWl2ZXIgbWVzc2FnZVJlY2VpdmVyID0gKE1lc3NhZ2VSZWNlaXZlcikgaW5Pbmx5TWVzc2FnZVJlY2VpdmVyCi0gICAgICAgICAgICAgICAgICAgIC5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgbWVzc2FnZVJlY2VpdmVycy5wdXQoV1NETDJDb25zdGFudHMuTUVQX1VSSV9JTl9PTkxZLCBtZXNzYWdlUmVjZWl2ZXIpOwotICAgICAgICAgICAgQ2xhc3MgaW5vdXRNZXNzYWdlUmVjZWl2ZXIgPSBMb2FkZXIKLSAgICAgICAgICAgICAgICAgICAgLmxvYWRDbGFzcygib3JnLmFwYWNoZS5heGlzMi5ycGMucmVjZWl2ZXJzLlJQQ01lc3NhZ2VSZWNlaXZlciIpOwotICAgICAgICAgICAgTWVzc2FnZVJlY2VpdmVyIGluT3V0bWVzc2FnZVJlY2VpdmVyID0gKE1lc3NhZ2VSZWNlaXZlcikgaW5vdXRNZXNzYWdlUmVjZWl2ZXIKLSAgICAgICAgICAgICAgICAgICAgLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICBtZXNzYWdlUmVjZWl2ZXJzLnB1dChXU0RMMkNvbnN0YW50cy5NRVBfVVJJX0lOX09VVCwKLSAgICAgICAgICAgICAgICAgICAgaW5PdXRtZXNzYWdlUmVjZWl2ZXIpOwotICAgICAgICB9Ci0gICAgICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgQXhpc1NlcnZpY2UoKTsKLQkJc2NoZW1hR2VuZXJhdG9yLnNldEF4aXNTZXJ2aWNlKHNlcnZpY2UpOwotCQlBeGlzU2VydmljZSBheGlzU2VydmljZSA9IEF4aXNTZXJ2aWNlLmNyZWF0ZVNlcnZpY2UoY2xhc3NOYW1lLAotCQkJCXNlcnZpY2VOYW1lID09IG51bGwgPyBKYXZhMldTRExVdGlscwotCQkJCQkJLmdldFNpbXBsZUNsYXNzTmFtZShjbGFzc05hbWUpIDogc2VydmljZU5hbWUsCi0JCQkJYXhpc0NvbmZpZywgbWVzc2FnZVJlY2VpdmVycywKLQkJCQl0YXJnZXROYW1lc3BhY2UgPT0gbnVsbCA/IEphdmEyV1NETFV0aWxzCi0JCQkJCQkubmFtZXNwYWNlRnJvbUNsYXNzTmFtZShjbGFzc05hbWUsIGNsYXNzTG9hZGVyLAotCQkJCQkJCQlyZXNvbHZlTlNHZW4oKSkudG9TdHJpbmcoKSA6IHRhcmdldE5hbWVzcGFjZSwKLQkJCQljbGFzc0xvYWRlciwgc2NoZW1hR2VuZXJhdG9yLCBzZXJ2aWNlKTsKLQkJc2NoZW1hR2VuZXJhdG9yLnNldEF4aXNTZXJ2aWNlKGF4aXNTZXJ2aWNlKTsKLQkJYXhpc1NlcnZpY2Uuc2V0VGFyZ2V0TmFtZXNwYWNlUHJlZml4KGdldFRhcmdldE5hbWVzcGFjZVByZWZpeCgpKTsKLQkJYXhpc1NlcnZpY2Uuc2V0U2NoZW1hVGFyZ2V0TmFtZXNwYWNlKGdldFNjaGVtYVRhcmdldE5hbWVzcGFjZSgpKTsKLQkJYXhpc1NlcnZpY2UKLQkJCQkuc2V0U2NoZW1hVGFyZ2V0TmFtZXNwYWNlUHJlZml4KGdldFNjaGVtYVRhcmdldE5hbWVzcGFjZVByZWZpeCgpKTsKLQkJU3RyaW5nIHVyaSA9IGxvY2F0aW9uVXJpOwotCQlpZiAodXJpID09IG51bGwpIHsKLQkJCXVyaSA9IERFRkFVTFRfTE9DQVRJT05fVVJMCi0JCQkJCSsgKHNlcnZpY2VOYW1lID09IG51bGwgPyBKYXZhMldTRExVdGlscwotCQkJCQkJCS5nZXRTaW1wbGVDbGFzc05hbWUoY2xhc3NOYW1lKSA6IHNlcnZpY2VOYW1lKTsKLQkJfQotCQkvLyBheGlzU2VydmljZS5zZXRFUFJzKG5ldyBTdHJpbmdbXXt1cml9KTsKLQkJc2V0U2VydmljZUVQUihheGlzU2VydmljZSwgdXJpKTsKLQkJYXhpc0NvbmZpZy5hZGRTZXJ2aWNlKGF4aXNTZXJ2aWNlKTsKLQotCQlpZiAoV1NETF9WRVJTSU9OXzEuZXF1YWxzKHdzZGxWZXJzaW9uKSkgewotCQkJQXhpc1NlcnZpY2UyV1NETDExIGcgPSBuZXcgQXhpc1NlcnZpY2UyV1NETDExKGF4aXNTZXJ2aWNlKTsKLQkJCWcuc2V0U3R5bGUodGhpcy5zdHlsZSk7Ci0JCQlnLnNldFVzZSh0aGlzLnVzZSk7Ci0JCQlPTUVsZW1lbnQgd3NkbEVsZW1lbnQgPSBnLmdlbmVyYXRlT00oKTsKLQkJCWlmICghaXNQcmV0dHkoKSkgewotCQkJCXdzZGxFbGVtZW50LnNlcmlhbGl6ZShvdXQpOwotCQkJfSBlbHNlIHsKLQkJCQlYTUxQcmV0dHlQcmludGVyLnByZXR0aWZ5KHdzZGxFbGVtZW50LCBvdXQpOwotCQkJfQotCQl9IGVsc2UgewotCQkJQXhpc1NlcnZpY2UyV1NETDIwIGcgPSBuZXcgQXhpc1NlcnZpY2UyV1NETDIwKGF4aXNTZXJ2aWNlKTsKLQkJCU9NRWxlbWVudCB3c2RsRWxlbWVudCA9IGcuZ2VuZXJhdGVPTSgpOwotCQkJaWYgKCFpc1ByZXR0eSgpKSB7Ci0JCQkJd3NkbEVsZW1lbnQuc2VyaWFsaXplKG91dCk7Ci0JCQl9IGVsc2UgewotCQkJCVhNTFByZXR0eVByaW50ZXIucHJldHRpZnkod3NkbEVsZW1lbnQsIG91dCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCW91dC5mbHVzaCgpOwotCQlvdXQuY2xvc2UoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJGb3JtRGVmYXVsdCgpIHsKLQkJcmV0dXJuIGF0dHJGb3JtRGVmYXVsdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBdHRyRm9ybURlZmF1bHQoU3RyaW5nIGF0dHJGb3JtRGVmYXVsdCkgewotCQl0aGlzLmF0dHJGb3JtRGVmYXVsdCA9IGF0dHJGb3JtRGVmYXVsdDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnRGb3JtRGVmYXVsdCgpIHsKLQkJcmV0dXJuIGVsZW1lbnRGb3JtRGVmYXVsdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFbGVtZW50Rm9ybURlZmF1bHQoU3RyaW5nIGVsZW1lbnRGb3JtRGVmYXVsdCkgewotCQl0aGlzLmVsZW1lbnRGb3JtRGVmYXVsdCA9IGVsZW1lbnRGb3JtRGVmYXVsdDsKLQl9Ci0KLQlwdWJsaWMgQXJyYXlMaXN0IGdldEV4dHJhQ2xhc3NlcygpIHsKLQkJcmV0dXJuIGV4dHJhQ2xhc3NlczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFeHRyYUNsYXNzZXMoQXJyYXlMaXN0IGV4dHJhQ2xhc3NlcykgewotCQl0aGlzLmV4dHJhQ2xhc3NlcyA9IGV4dHJhQ2xhc3NlczsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5zR2VuQ2xhc3NOYW1lKCkgewotCQlyZXR1cm4gbnNHZW5DbGFzc05hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TnNHZW5DbGFzc05hbWUoU3RyaW5nIG5zR2VuQ2xhc3NOYW1lKSB7Ci0JCXRoaXMubnNHZW5DbGFzc05hbWUgPSBuc0dlbkNsYXNzTmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNjaGVtYUdlbkNsYXNzTmFtZSgpIHsKLQkJcmV0dXJuIHNjaGVtYUdlbkNsYXNzTmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTY2hlbWFHZW5DbGFzc05hbWUoU3RyaW5nIHNjaGVtYUdlbkNsYXNzTmFtZSkgewotCQl0aGlzLnNjaGVtYUdlbkNsYXNzTmFtZSA9IHNjaGVtYUdlbkNsYXNzTmFtZTsKLQl9Ci0KLQlwdWJsaWMgTWFwIGdldFBrZzJuc01hcCgpIHsKLQkJcmV0dXJuIHBrZzJuc01hcDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQa2cybnNNYXAoTWFwIHBrZzJuc01hcCkgewotCQl0aGlzLnBrZzJuc01hcCA9IHBrZzJuc01hcDsKLQl9Ci0KLQlwcml2YXRlIE5hbWVzcGFjZUdlbmVyYXRvciByZXNvbHZlTlNHZW4oKSB7Ci0JCU5hbWVzcGFjZUdlbmVyYXRvciBuc0dlbjsKLQkJaWYgKHRoaXMubnNHZW5DbGFzc05hbWUgPT0gbnVsbCkgewotCQkJbnNHZW4gPSBuZXcgRGVmYXVsdE5hbWVzcGFjZUdlbmVyYXRvcigpOwotCQl9IGVsc2UgewotCQkJdHJ5IHsKLQkJCQluc0dlbiA9IChOYW1lc3BhY2VHZW5lcmF0b3IpIENsYXNzLmZvck5hbWUodGhpcy5uc0dlbkNsYXNzTmFtZSkKLQkJCQkJCS5uZXdJbnN0YW5jZSgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQluc0dlbiA9IG5ldyBEZWZhdWx0TmFtZXNwYWNlR2VuZXJhdG9yKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5zR2VuOwotCX0KLQotCXByaXZhdGUgU2NoZW1hR2VuZXJhdG9yIHJlc29sdmVTY2hlbWFHZW4oQ2xhc3NMb2FkZXIgbG9hZGVyLAotCQkJU3RyaW5nIGNsYXNzTmFtZSwgU3RyaW5nIHNjaGVtYXRhcmdldE5hbWVzcGFjZSwKLQkJCVN0cmluZyBzY2hlbWF0YXJnZXROYW1lc3BhY2VQcmVmaXgpIHRocm93cyBFeGNlcHRpb24gewotCQlTY2hlbWFHZW5lcmF0b3Igc2NoZW1hR2VuOwotCQlpZiAodGhpcy5zY2hlbWFHZW5DbGFzc05hbWUgPT0gbnVsbCkgewotCQkJaWYgKGdlbmVyYXRlRG9jTGl0QmFyZSkgewotCQkJCXNjaGVtYUdlbiA9IG5ldyBEb2NMaXRCYXJlU2NoZW1hR2VuZXJhdG9yKGxvYWRlciwgY2xhc3NOYW1lLAotCQkJCQkJc2NoZW1hdGFyZ2V0TmFtZXNwYWNlLCBzY2hlbWF0YXJnZXROYW1lc3BhY2VQcmVmaXgsCi0JCQkJCQludWxsKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc2NoZW1hR2VuID0gbmV3IERlZmF1bHRTY2hlbWFHZW5lcmF0b3IobG9hZGVyLCBjbGFzc05hbWUsCi0JCQkJCQlzY2hlbWF0YXJnZXROYW1lc3BhY2UsIHNjaGVtYXRhcmdldE5hbWVzcGFjZVByZWZpeCwKLQkJCQkJCW51bGwpOwotCQkJfQotCi0JCX0gZWxzZSB7Ci0JCQl0cnkgewotCQkJCUNsYXNzIGNsYXp6ID0gQ2xhc3MuZm9yTmFtZSh0aGlzLnNjaGVtYUdlbkNsYXNzTmFtZSk7Ci0JCQkJQ29uc3RydWN0b3IgY29uc3RydWN0b3IgPSBjbGF6ei5nZXRDb25zdHJ1Y3RvcihuZXcgQ2xhc3NbXSB7Ci0JCQkJCQlDbGFzc0xvYWRlci5jbGFzcywgU3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3MsCi0JCQkJCQlTdHJpbmcuY2xhc3MgfSk7Ci0JCQkJc2NoZW1hR2VuID0gKFNjaGVtYUdlbmVyYXRvcikgY29uc3RydWN0b3IKLQkJCQkJCS5uZXdJbnN0YW5jZShuZXcgT2JqZWN0W10geyBsb2FkZXIsIGNsYXNzTmFtZSwKLQkJCQkJCQkJc2NoZW1hdGFyZ2V0TmFtZXNwYWNlLAotCQkJCQkJCQlzY2hlbWF0YXJnZXROYW1lc3BhY2VQcmVmaXggfSk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWlmIChnZW5lcmF0ZURvY0xpdEJhcmUpIHsKLQkJCQkJc2NoZW1hR2VuID0gbmV3IERvY0xpdEJhcmVTY2hlbWFHZW5lcmF0b3IobG9hZGVyLAotCQkJCQkJCWNsYXNzTmFtZSwgc2NoZW1hdGFyZ2V0TmFtZXNwYWNlLAotCQkJCQkJCXNjaGVtYXRhcmdldE5hbWVzcGFjZVByZWZpeCwgbnVsbCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJc2NoZW1hR2VuID0gbmV3IERlZmF1bHRTY2hlbWFHZW5lcmF0b3IobG9hZGVyLCBjbGFzc05hbWUsCi0JCQkJCQkJc2NoZW1hdGFyZ2V0TmFtZXNwYWNlLCBzY2hlbWF0YXJnZXROYW1lc3BhY2VQcmVmaXgsCi0JCQkJCQkJbnVsbCk7Ci0JCQkJfQotCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIHNjaGVtYUdlbjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1ByZXR0eSgpIHsKLQkJcmV0dXJuIHByZXR0eTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQcmV0dHkoYm9vbGVhbiBwcmV0dHkpIHsKLQkJdGhpcy5wcmV0dHkgPSBwcmV0dHk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0V1NETFZlcnNpb24oU3RyaW5nIHdzZGxWZXJzaW9uKSB7Ci0JCXRoaXMud3NkbFZlcnNpb24gPSB3c2RsVmVyc2lvbjsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0U2VydmljZUVQUihBeGlzU2VydmljZSBheGlzU2VydmljZSwgU3RyaW5nIHVybFN0cmluZykKLQkJCXRocm93cyBFeGNlcHRpb24gewotCQlVUkwgdXJsID0gbmV3IFVSTCh1cmxTdHJpbmcpOwotCQlVdGlscy5hZGRTb2FwMTFFbmRwb2ludChheGlzU2VydmljZSwgdXJsKTsKLQkJVXRpbHMuYWRkU29hcDEyRW5kcG9pbnQoYXhpc1NlcnZpY2UsIHVybCk7Ci0JCQotCQlTdHJpbmcgcHJvdG9jb2wgPSB1cmwuZ2V0UHJvdG9jb2woKTsKLQkJaWYgKCJodHRwIi5lcXVhbHMocHJvdG9jb2wpKSB7Ci0JCQlVdGlscy5hZGRIdHRwRW5kcG9pbnQoYXhpc1NlcnZpY2UsIHVybCk7Ci0JCX0KLQl9Ci0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q3VzdG9tU2NoZW1hTG9jYXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBjdXN0b21TY2hlbWFMb2NhdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDdXN0b21TY2hlbWFMb2NhdGlvbihTdHJpbmcgY3VzdG9tU2NoZW1hTG9jYXRpb24pIHsKLSAgICAgICAgdGhpcy5jdXN0b21TY2hlbWFMb2NhdGlvbiA9IGN1c3RvbVNjaGVtYUxvY2F0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWFwcGluZ0ZpbGVMb2NhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIG1hcHBpbmdGaWxlTG9jYXRpb247Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TWFwcGluZ0ZpbGVMb2NhdGlvbihTdHJpbmcgbWFwcGluZ0ZpbGVMb2NhdGlvbikgewotICAgICAgICB0aGlzLm1hcHBpbmdGaWxlTG9jYXRpb24gPSBtYXBwaW5nRmlsZUxvY2F0aW9uOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2phdmEyd3NkbC9zcmMvb3JnL2FwYWNoZS93cy9qYXZhMndzZGwvSmF2YTJXU0RMQ29kZWdlbkVuZ2luZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF2YTJ3c2RsL3NyYy9vcmcvYXBhY2hlL3dzL2phdmEyd3NkbC9KYXZhMldTRExDb2RlZ2VuRW5naW5lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzOTNkMTEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF2YTJ3c2RsL3NyYy9vcmcvYXBhY2hlL3dzL2phdmEyd3NkbC9KYXZhMldTRExDb2RlZ2VuRW5naW5lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLndzLmphdmEyd3NkbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uamF2YTJ3c2RsLkphdmEyV1NETENvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLmphdmEyd3NkbC5KYXZhMldTRExVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmphdmEyd3NkbC51dGlscy5KYXZhMldTRExDb21tYW5kTGluZU9wdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmV0LlVSTENsYXNzTG9hZGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1wdWJsaWMgY2xhc3MgSmF2YTJXU0RMQ29kZWdlbkVuZ2luZSBpbXBsZW1lbnRzIEphdmEyV1NETENvbnN0YW50cyB7Ci0gICAgcHJpdmF0ZSBKYXZhMldTRExCdWlsZGVyIGphdmEyV3NkbEJ1aWxkZXI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NETF9GSUxFTkFNRV9TVUZGSVggPSAiLndzZGwiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1BID0gIiwiOwotCi0gICAgcHVibGljIEphdmEyV1NETENvZGVnZW5FbmdpbmUoTWFwIG9wdGlvbnNNYXApIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvL2NyZWF0ZSBhIG5ldyAgSmF2YTJXU0RMQnVpbGRlciBhbmQgcG9wdWxhdGUgaXQKLSAgICAgICAgSmF2YTJXU0RMQ29tbWFuZExpbmVPcHRpb24gb3B0aW9uID0gbG9hZE9wdGlvbihKYXZhMldTRExDb25zdGFudHMuQ0xBU1NOQU1FX09QVElPTiwgSmF2YTJXU0RMQ29uc3RhbnRzLkNMQVNTTkFNRV9PUFRJT05fTE9ORywgb3B0aW9uc01hcCk7Ci0gICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBvcHRpb24gPT0gbnVsbCA/IG51bGwgOiBvcHRpb24uZ2V0T3B0aW9uVmFsdWUoKTsKLQotICAgICAgICBpZiAoY2xhc3NOYW1lID09IG51bGwgfHwgY2xhc3NOYW1lLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oImNsYXNzIG5hbWUgbXVzdCBiZSBwcmVzZW50ISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy9Ob3cgd2UgYXJlIGRvbmUgd2l0aCBsb2FkaW5nIHRoZSBiYXNpYyB2YWx1ZXMgLSB0aW1lIHRvIGNyZWF0ZSB0aGUgYnVpbGRlcgotICAgICAgICBqYXZhMldzZGxCdWlsZGVyID0gbmV3IEphdmEyV1NETEJ1aWxkZXIocmVzb2x2ZU91dHB1dFN0cmVhbShjbGFzc05hbWUsIG9wdGlvbnNNYXApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZUNsYXNzTG9hZGVyKG9wdGlvbnNNYXApKTsKLSAgICAgICAgCi0gICAgICAgIGNvbmZpZ3VyZUphdmEyV1NETEJ1aWxkZXIob3B0aW9uc01hcCwgY2xhc3NOYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBnZW5lcmF0ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBqYXZhMldzZGxCdWlsZGVyLmdlbmVyYXRlV1NETCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgRmlsZU91dHB1dFN0cmVhbSByZXNvbHZlT3V0cHV0U3RyZWFtKFN0cmluZyBjbGFzc05hbWUsIE1hcCBvcHRpb25zTWFwKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBKYXZhMldTRExDb21tYW5kTGluZU9wdGlvbiBvcHRpb24gPSBsb2FkT3B0aW9uKEphdmEyV1NETENvbnN0YW50cy5PVVRQVVRfTE9DQVRJT05fT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEphdmEyV1NETENvbnN0YW50cy5PVVRQVVRfTE9DQVRJT05fT1BUSU9OX0xPTkcsIG9wdGlvbnNNYXApOwotICAgICAgICBTdHJpbmcgb3V0cHV0Rm9sZGVyTmFtZSA9IG9wdGlvbiA9PSBudWxsID8gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmRpciIpIDogb3B0aW9uLmdldE9wdGlvblZhbHVlKCk7Ci0KLSAgICAgICAgRmlsZSBvdXRwdXRGb2xkZXI7Ci0gICAgICAgIG91dHB1dEZvbGRlciA9IG5ldyBGaWxlKG91dHB1dEZvbGRlck5hbWUpOwotICAgICAgICBpZiAoIW91dHB1dEZvbGRlci5leGlzdHMoKSkgewotICAgICAgICAgICAgb3V0cHV0Rm9sZGVyLm1rZGlycygpOwotICAgICAgICB9IGVsc2UgaWYgKCFvdXRwdXRGb2xkZXIuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiVGhlIHNwZWNpdmllZCBsb2NhdGlvbiAiICsgb3V0cHV0Rm9sZGVyTmFtZSArICJpcyBub3QgYSBmb2xkZXIiKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgb3B0aW9uID0gbG9hZE9wdGlvbihKYXZhMldTRExDb25zdGFudHMuT1VUUFVUX0ZJTEVOQU1FX09QVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBKYXZhMldTRExDb25zdGFudHMuT1VUUFVUX0ZJTEVOQU1FX09QVElPTl9MT05HLCBvcHRpb25zTWFwKTsKLSAgICAgICAgU3RyaW5nIG91dHB1dEZpbGVOYW1lID0gb3B0aW9uID09IG51bGwgPyBudWxsIDogb3B0aW9uLmdldE9wdGlvblZhbHVlKCk7Ci0gICAgICAgIC8vZGVyaXZlIGEgZmlsZSBuYW1lIGZyb20gdGhlIGNsYXNzIG5hbWUgaWYgdGhlIGZpbGVuYW1lIGlzIG5vdCBzcGVjaWZpZWQKLSAgICAgICAgaWYgKG91dHB1dEZpbGVOYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIG91dHB1dEZpbGVOYW1lID0gSmF2YTJXU0RMVXRpbHMuZ2V0U2ltcGxlQ2xhc3NOYW1lKGNsYXNzTmFtZSkgKyBXU0RMX0ZJTEVOQU1FX1NVRkZJWDsKLSAgICAgICAgfQotICAgIAotICAgICAgICAvL2ZpcnN0IGNyZWF0ZSBhIGZpbGUgaW4gdGhlIGdpdmVuIGxvY2F0aW9uCi0gICAgICAgIEZpbGUgb3V0cHV0RmlsZSA9IG5ldyBGaWxlKG91dHB1dEZvbGRlciwgb3V0cHV0RmlsZU5hbWUpOwotICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIG91dDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmICghb3V0cHV0RmlsZS5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgIG91dHB1dEZpbGUuY3JlYXRlTmV3RmlsZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgb3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0ob3V0cHV0RmlsZSk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBvdXQ7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgQ2xhc3NMb2FkZXIgcmVzb2x2ZUNsYXNzTG9hZGVyKE1hcCBvcHRpb25zTWFwKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICAvLyBpZiB0aGUgY2xhc3MgcGF0aCBpcyBwcmVzZW50LCBjcmVhdGUgYSBVUkwgY2xhc3MgbG9hZGVyIHdpdGggdGhvc2UKLSAgICAgICAgLy9jbGFzcyBwYXRoIGVudHJpZXMgcHJlc2VudC4gaWYgbm90IGp1c3QgdGFrZSB0aGUgIFRDQ0wKLSAgICAgICAgSmF2YTJXU0RMQ29tbWFuZExpbmVPcHRpb24gb3B0aW9uID0gbG9hZE9wdGlvbihKYXZhMldTRExDb25zdGFudHMuQ0xBU1NQQVRIX09QVElPTiwKLSAgICAgICAgICAgICAgICBKYXZhMldTRExDb25zdGFudHMuQ0xBU1NQQVRIX09QVElPTl9MT05HLCBvcHRpb25zTWFwKTsKLQotICAgICAgICBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcjsKLQotICAgICAgICBpZiAob3B0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIEFycmF5TGlzdCBvcHRpb25WYWx1ZXMgPSBvcHRpb24uZ2V0T3B0aW9uVmFsdWVzKCk7Ci0gICAgICAgICAgICBVUkxbXSB1cmxzID0gbmV3IFVSTFtvcHRpb25WYWx1ZXMuc2l6ZSgpXTsKLSAgICAgICAgICAgIFN0cmluZ1tdIGNsYXNzUGF0aEVudHJpZXMgPSAoU3RyaW5nW10pIG9wdGlvblZhbHVlcy50b0FycmF5KG5ldyBTdHJpbmdbb3B0aW9uVmFsdWVzLnNpemUoKV0pOwotCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2xhc3NQYXRoRW50cmllcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY2xhc3NQYXRoRW50cnkgPSBjbGFzc1BhdGhFbnRyaWVzW2ldOwotICAgICAgICAgICAgICAgICAgICBpZihjbGFzc1BhdGhFbnRyeSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvL3RoaXMgc2hvdWxkIGJlIGEgZmlsZShvciBhIFVSTCkKLSAgICAgICAgICAgICAgICAgICAgaWYgKEphdmEyV1NETFV0aWxzLmlzVVJMKGNsYXNzUGF0aEVudHJ5KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdXJsc1tpXSA9IG5ldyBVUkwoY2xhc3NQYXRoRW50cnkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgdXJsc1tpXSA9IG5ldyBGaWxlKGNsYXNzUGF0aEVudHJ5KS50b1VSTCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjbGFzc0xvYWRlciA9IG5ldyBVUkxDbGFzc0xvYWRlcih1cmxzLCBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpKTsKLQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY2xhc3NMb2FkZXIgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gY2xhc3NMb2FkZXI7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNvbmZpZ3VyZUphdmEyV1NETEJ1aWxkZXIoTWFwIG9wdGlvbnNNYXAsIFN0cmluZyBjbGFzc05hbWUpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIC8vc2V0IHRoZSBvdGhlciBwYXJhbWV0ZXJzIHRvIHRoZSBidWlsZGVyCi0gICAgICAgIEphdmEyV1NETENvbW1hbmRMaW5lT3B0aW9uIG9wdGlvbiA9IGxvYWRPcHRpb24oSmF2YTJXU0RMQ29uc3RhbnRzLlNDSEVNQV9UQVJHRVRfTkFNRVNQQUNFX09QVElPTiwKLSAgICAgICAgICAgICAgICBKYXZhMldTRExDb25zdGFudHMuU0NIRU1BX1RBUkdFVF9OQU1FU1BBQ0VfT1BUSU9OX0xPTkcsIG9wdGlvbnNNYXApOwotICAgICAgICBqYXZhMldzZGxCdWlsZGVyLnNldFNjaGVtYVRhcmdldE5hbWVzcGFjZShvcHRpb24gPT0gbnVsbCA/IG51bGwgOiBvcHRpb24uZ2V0T3B0aW9uVmFsdWUoKSk7Ci0KLSAgICAgICAgb3B0aW9uID0gbG9hZE9wdGlvbihKYXZhMldTRExDb25zdGFudHMuU0NIRU1BX1RBUkdFVF9OQU1FU1BBQ0VfUFJFRklYX09QVElPTiwKLSAgICAgICAgICAgICAgICBKYXZhMldTRExDb25zdGFudHMuU0NIRU1BX1RBUkdFVF9OQU1FU1BBQ0VfUFJFRklYX09QVElPTl9MT05HLCBvcHRpb25zTWFwKTsKLSAgICAgICAgamF2YTJXc2RsQnVpbGRlci5zZXRTY2hlbWFUYXJnZXROYW1lc3BhY2VQcmVmaXgob3B0aW9uID09IG51bGwgPyBudWxsIDogb3B0aW9uLmdldE9wdGlvblZhbHVlKCkpOwotCi0gICAgICAgIG9wdGlvbiA9IGxvYWRPcHRpb24oSmF2YTJXU0RMQ29uc3RhbnRzLlRBUkdFVF9OQU1FU1BBQ0VfT1BUSU9OLAotICAgICAgICAgICAgICAgIEphdmEyV1NETENvbnN0YW50cy5UQVJHRVRfTkFNRVNQQUNFX09QVElPTl9MT05HLCBvcHRpb25zTWFwKTsKLSAgICAgICAgamF2YTJXc2RsQnVpbGRlci5zZXRUYXJnZXROYW1lc3BhY2Uob3B0aW9uID09IG51bGwgPyBudWxsIDogb3B0aW9uLmdldE9wdGlvblZhbHVlKCkpOwotCi0gICAgICAgIG9wdGlvbiA9IGxvYWRPcHRpb24oSmF2YTJXU0RMQ29uc3RhbnRzLlRBUkdFVF9OQU1FU1BBQ0VfUFJFRklYX09QVElPTiwKLSAgICAgICAgICAgICAgICBKYXZhMldTRExDb25zdGFudHMuVEFSR0VUX05BTUVTUEFDRV9QUkVGSVhfT1BUSU9OX0xPTkcsIG9wdGlvbnNNYXApOwotICAgICAgICBqYXZhMldzZGxCdWlsZGVyLnNldFRhcmdldE5hbWVzcGFjZVByZWZpeChvcHRpb24gPT0gbnVsbCA/IG51bGwgOiBvcHRpb24uZ2V0T3B0aW9uVmFsdWUoKSk7Ci0KLSAgICAgICAgb3B0aW9uID0gbG9hZE9wdGlvbihKYXZhMldTRExDb25zdGFudHMuU0VSVklDRV9OQU1FX09QVElPTiwKLSAgICAgICAgICAgICAgICBKYXZhMldTRExDb25zdGFudHMuU0VSVklDRV9OQU1FX09QVElPTl9MT05HLCBvcHRpb25zTWFwKTsKLSAgICAgICAgamF2YTJXc2RsQnVpbGRlci5zZXRTZXJ2aWNlTmFtZShvcHRpb24gPT0gbnVsbCA/IEphdmEyV1NETFV0aWxzLmdldFNpbXBsZUNsYXNzTmFtZShjbGFzc05hbWUpIDogb3B0aW9uLmdldE9wdGlvblZhbHVlKCkpOwotCi0gICAgICAgIG9wdGlvbiA9IGxvYWRPcHRpb24oSmF2YTJXU0RMQ29uc3RhbnRzLlNUWUxFX09QVElPTiwKLSAgICAgICAgICAgICAgICBKYXZhMldTRExDb25zdGFudHMuU1RZTEVfT1BUSU9OLCBvcHRpb25zTWFwKTsKLSAgICAgICAgaWYgKG9wdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBqYXZhMldzZGxCdWlsZGVyLnNldFN0eWxlKG9wdGlvbi5nZXRPcHRpb25WYWx1ZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIG9wdGlvbiA9IGxvYWRPcHRpb24oSmF2YTJXU0RMQ29uc3RhbnRzLkxPQ0FUSU9OX09QVElPTiwKLSAgICAgICAgICAgICAgICBKYXZhMldTRExDb25zdGFudHMuTE9DQVRJT05fT1BUSU9OLCBvcHRpb25zTWFwKTsKLSAgICAgICAgaWYgKG9wdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBqYXZhMldzZGxCdWlsZGVyLnNldExvY2F0aW9uVXJpKG9wdGlvbi5nZXRPcHRpb25WYWx1ZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIG9wdGlvbiA9IGxvYWRPcHRpb24oSmF2YTJXU0RMQ29uc3RhbnRzLlVTRV9PUFRJT04sCi0gICAgICAgICAgICAgICAgSmF2YTJXU0RMQ29uc3RhbnRzLlVTRV9PUFRJT04sIG9wdGlvbnNNYXApOwotICAgICAgICBpZiAob3B0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIGphdmEyV3NkbEJ1aWxkZXIuc2V0VXNlKG9wdGlvbi5nZXRPcHRpb25WYWx1ZSgpKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgb3B0aW9uID0gbG9hZE9wdGlvbihKYXZhMldTRExDb25zdGFudHMuQVRUUl9GT1JNX0RFRkFVTFRfT1BUSU9OLAotICAgICAgICAgICAgICAgIEphdmEyV1NETENvbnN0YW50cy5BVFRSX0ZPUk1fREVGQVVMVF9PUFRJT05fTE9ORywgb3B0aW9uc01hcCk7Ci0gICAgICAgIGphdmEyV3NkbEJ1aWxkZXIuc2V0QXR0ckZvcm1EZWZhdWx0KG9wdGlvbiA9PSBudWxsID8gbnVsbCA6IG9wdGlvbi5nZXRPcHRpb25WYWx1ZSgpKTsKLSAgICAgICAgCi0gICAgICAgIG9wdGlvbiA9IGxvYWRPcHRpb24oSmF2YTJXU0RMQ29uc3RhbnRzLkVMRU1FTlRfRk9STV9ERUZBVUxUX09QVElPTiwKLSAgICAgICAgICAgICAgICBKYXZhMldTRExDb25zdGFudHMuRUxFTUVOVF9GT1JNX0RFRkFVTFRfT1BUSU9OX0xPTkcsIG9wdGlvbnNNYXApOwotICAgICAgICBqYXZhMldzZGxCdWlsZGVyLnNldEVsZW1lbnRGb3JtRGVmYXVsdChvcHRpb24gPT0gbnVsbCA/IG51bGwgOiBvcHRpb24uZ2V0T3B0aW9uVmFsdWUoKSk7Ci0gICAgICAgIAotICAgICAgICBvcHRpb24gPSBsb2FkT3B0aW9uKEphdmEyV1NETENvbnN0YW50cy5FWFRSQV9DTEFTU0VTX0RFRkFVTFRfT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEphdmEyV1NETENvbnN0YW50cy5FWFRSQV9DTEFTU0VTX0RFRkFVTFRfT1BUSU9OX0xPTkcsIG9wdGlvbnNNYXApOwotICAgICAgICBqYXZhMldzZGxCdWlsZGVyLnNldEV4dHJhQ2xhc3NlcyhvcHRpb24gPT0gbnVsbCA/IG5ldyBBcnJheUxpc3QoKSA6IG9wdGlvbi5nZXRPcHRpb25WYWx1ZXMoKSk7Ci0gICAgICAgIAotICAgICAgICBvcHRpb24gPSBsb2FkT3B0aW9uKEphdmEyV1NETENvbnN0YW50cy5OQU1FU1BBQ0VfR0VORVJBVE9SX09QVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBKYXZhMldTRExDb25zdGFudHMuTkFNRVNQQUNFX0dFTkVSQVRPUl9PUFRJT05fTE9ORywgb3B0aW9uc01hcCk7Ci0gICAgICAgIGlmICggb3B0aW9uICE9IG51bGwgKSB7Ci0gICAgICAgICAgICBqYXZhMldzZGxCdWlsZGVyLnNldE5zR2VuQ2xhc3NOYW1lKG9wdGlvbi5nZXRPcHRpb25WYWx1ZSgpKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgb3B0aW9uID0gbG9hZE9wdGlvbihKYXZhMldTRExDb25zdGFudHMuU0NIRU1BX0dFTkVSQVRPUl9PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSmF2YTJXU0RMQ29uc3RhbnRzLlNDSEVNQV9HRU5FUkFUT1JfT1BUSU9OX0xPTkcsIG9wdGlvbnNNYXApOwotICAgICAgICBpZiAoIG9wdGlvbiAhPSBudWxsICkgewotICAgICAgICAgICAgamF2YTJXc2RsQnVpbGRlci5zZXRTY2hlbWFHZW5DbGFzc05hbWUob3B0aW9uLmdldE9wdGlvblZhbHVlKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgb3B0aW9uID0gbG9hZE9wdGlvbihKYXZhMldTRExDb25zdGFudHMuSkFWQV9QS0dfMl9OU01BUF9PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSmF2YTJXU0RMQ29uc3RhbnRzLkpBVkFfUEtHXzJfTlNNQVBfT1BUSU9OX0xPTkcsIG9wdGlvbnNNYXApOwotICAgICAgICBqYXZhMldzZGxCdWlsZGVyLnNldFBrZzJuc01hcChsb2FkSmF2YVBrZzJOYW1lc3BhY2VNYXAob3B0aW9uKSk7Ci0KLSAgICAgICAgb3B0aW9uID0gbG9hZE9wdGlvbihKYXZhMldTRExDb25zdGFudHMuV1NETF9WRVJTSU9OX09QVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEphdmEyV1NETENvbnN0YW50cy5XU0RMX1ZFUlNJT05fT1BUSU9OX0xPTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zTWFwKTsKLSAgICAgICAgaWYgKG9wdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgb3B0aW9uVmFsdWUgPSBvcHRpb24uZ2V0T3B0aW9uVmFsdWUoKTsKLSAgICAgICAgICAgIGlmIChKYXZhMldTRExDb25zdGFudHMuV1NETF9WRVJTSU9OXzIuZXF1YWxzKG9wdGlvblZhbHVlKSB8fAotICAgICAgICAgICAgICAgICAgICBKYXZhMldTRExDb25zdGFudHMuV1NETF9WRVJTSU9OXzJfT1BUSU9OQUwuZXF1YWxzKG9wdGlvblZhbHVlKSkgewotICAgICAgICAgICAgICAgIC8vdXNlcnMgY2FuIHNheSBlaXRoZXIgMi4wIG9yIDIgLSB3ZSAganVzdCBzZXQgaXQgdG8gdGhlIGNvbnN0YW50Ci0gICAgICAgICAgICAgICAgamF2YTJXc2RsQnVpbGRlci5zZXRXU0RMVmVyc2lvbihKYXZhMldTRExDb25zdGFudHMuV1NETF9WRVJTSU9OXzIpOwotICAgICAgICAgICAgfSAvL2lnbm9yZSB0aGUgb3RoZXIgY2FzZXMgLSB0aGV5J2xsIGJlIHRha2VuIGFzIDEuMQotICAgICAgICB9Ci0KLSAgICAgICAgb3B0aW9uID0gbG9hZE9wdGlvbihKYXZhMldTRExDb25zdGFudHMuRE9DX0xJVF9CQVJFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgSmF2YTJXU0RMQ29uc3RhbnRzLkRPQ19MSVRfQkFSRV9MT05HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uc01hcCk7Ci0gICAgICAgIGlmIChvcHRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgamF2YTJXc2RsQnVpbGRlci5zZXRHZW5lcmF0ZURvY0xpdEJhcmUodHJ1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBvcHRpb24gPSBsb2FkT3B0aW9uKEphdmEyV1NETENvbnN0YW50cy5DVVNUT01fU0NIRU1BX0xPQ0FUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgSmF2YTJXU0RMQ29uc3RhbnRzLkNVU1RPTV9TQ0hFTUFfTE9DQVRJT05fTE9ORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnNNYXApOwotICAgICAgICBpZiAob3B0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIGphdmEyV3NkbEJ1aWxkZXIuc2V0Q3VzdG9tU2NoZW1hTG9jYXRpb24ob3B0aW9uLmdldE9wdGlvblZhbHVlKCkpOwotICAgICAgICB9Ci0gICAgICAgIG9wdGlvbiA9IGxvYWRPcHRpb24oSmF2YTJXU0RMQ29uc3RhbnRzLlNDSEVNQV9NQVBQSU5HX0ZJTEVfTE9DQVRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBKYXZhMldTRExDb25zdGFudHMuU0NIRU1BX01BUFBJTkdfRklMRV9MT0NBVElPTl9MT05HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uc01hcCk7Ci0gICAgICAgIGlmIChvcHRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgamF2YTJXc2RsQnVpbGRlci5zZXRNYXBwaW5nRmlsZUxvY2F0aW9uKG9wdGlvbi5nZXRPcHRpb25WYWx1ZSgpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIEphdmEyV1NETENvbW1hbmRMaW5lT3B0aW9uIGxvYWRPcHRpb24oU3RyaW5nIHNob3J0T3B0aW9uLCBTdHJpbmcgbG9uZ09wdGlvbiwgTWFwIG9wdGlvbnMpIHsKLSAgICAgICAgLy9zaG9ydCBvcHRpb24gZ2V0cyBwcmVjZWRlbmNlCi0gICAgICAgIEphdmEyV1NETENvbW1hbmRMaW5lT3B0aW9uIG9wdGlvbiA9IG51bGw7Ci0gICAgICAgIGlmIChsb25nT3B0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIG9wdGlvbiA9IChKYXZhMldTRExDb21tYW5kTGluZU9wdGlvbikgb3B0aW9ucy5nZXQobG9uZ09wdGlvbik7Ci0gICAgICAgICAgICBpZiAob3B0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gb3B0aW9uOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChzaG9ydE9wdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBvcHRpb24gPSAoSmF2YTJXU0RMQ29tbWFuZExpbmVPcHRpb24pIG9wdGlvbnMuZ2V0KHNob3J0T3B0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBvcHRpb247Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIGFkZFRvU2NoZW1hTG9jYXRpb25NYXAoU3RyaW5nIG9wdGlvblZhbHVlKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIAotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgTWFwIGxvYWRKYXZhUGtnMk5hbWVzcGFjZU1hcChKYXZhMldTRExDb21tYW5kTGluZU9wdGlvbiBvcHRpb24pIAotICAgIHsgCi0gICAgICAgIE1hcCBwa2cybnNNYXAgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgICAgIGlmIChvcHRpb24gIT0gbnVsbCkgCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFycmF5TGlzdCBvcHRpb25WYWx1ZXMgPSBvcHRpb24uZ2V0T3B0aW9uVmFsdWVzKCk7Ci0gICAgICAgICAgICBTdHJpbmcgYW5PcHRpb25WYWx1ZSA7Ci0gICAgICAgICAgICBmb3IgKCBpbnQgY291bnQgPSAwIDsgY291bnQgPCBvcHRpb25WYWx1ZXMuc2l6ZSgpIDsgKytjb3VudCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYW5PcHRpb25WYWx1ZSA9ICgoU3RyaW5nKW9wdGlvblZhbHVlcy5nZXQoY291bnQpKS50cmltKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy9hbiBvcHRpb24gdmFsdWUgd2lsbCBiZSBvZiB0aGUgZm9ybSBbamF2YSBwYWNrYWdlLCBuYW1lc3BhY2VdCi0gICAgICAgICAgICAgICAgLy9oZW5jZSB3ZSB0YWtlIHRoZSB0d28gc3Vic3RyaW5ncyBzdGFydGluZyBhZnRlciAnWycgYW5kIHVwdG8gJywnIGFuZAotICAgICAgICAgICAgICAgIC8vc3RhcnRpbmcgYWZ0ZXIgJywnIGFuZCB1cHRvICddJwotICAgICAgICAgICAgICAgIHBrZzJuc01hcC5wdXQoYW5PcHRpb25WYWx1ZS5zdWJzdHJpbmcoMSwgYW5PcHRpb25WYWx1ZS5pbmRleE9mKENPTU1BKSkudHJpbSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuT3B0aW9uVmFsdWUuc3Vic3RyaW5nKGFuT3B0aW9uVmFsdWUuaW5kZXhPZihDT01NQSkgKyAxLCBhbk9wdGlvblZhbHVlLmxlbmd0aCgpIC0gMSkudHJpbSgpKTsgCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHBrZzJuc01hcDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXZhMndzZGwvc3JjL29yZy9hcGFjaGUvd3MvamF2YTJ3c2RsL01hcHBlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF2YTJ3c2RsL3NyYy9vcmcvYXBhY2hlL3dzL2phdmEyd3NkbC9NYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk1MjdhZC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXZhMndzZGwvc3JjL29yZy9hcGFjaGUvd3MvamF2YTJ3c2RsL01hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLndzLmphdmEyd3NkbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLS8qKgotICogaW50ZXJmYWNlIHRoYXQgbmFtZXNwYWNlIG1hcHBlcnMgYXJlIGV4cGVjdGVkIHRvIGltcGxlbWVudAotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgTWFwcGVyIHsKLSAgICAvKioKLSAgICAgKiBleGVjdXRlIHRoZSBtYXBwaW5nCi0gICAgICogQHBhcmFtIG1hcCBtYXAgdG8gbWFwIHRvCi0gICAgICogQHBhcmFtIHBhY2thZ2VJc0tleSBpZiB0aGUgcGFja2FnZSBpcyB0byBiZSB0aGUga2V5IGZvciB0aGUgbWFwCi0gICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpbiBjYXNlIG9mIGVtZXJnZW5jeQotICAgICAqLwotICAgIHZvaWQgZXhlY3V0ZShIYXNoTWFwIG1hcCwgYm9vbGVhbiBwYWNrYWdlSXNLZXkpIHRocm93cyBCdWlsZEV4Y2VwdGlvbjsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXZhMndzZGwvc3JjL29yZy9hcGFjaGUvd3MvamF2YTJ3c2RsL01hcHBpbmdTZXQuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2phdmEyd3NkbC9zcmMvb3JnL2FwYWNoZS93cy9qYXZhMndzZGwvTWFwcGluZ1NldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjVlMDQyLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2phdmEyd3NkbC9zcmMvb3JnL2FwYWNoZS93cy9qYXZhMndzZGwvTWFwcGluZ1NldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLndzLmphdmEyd3NkbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKmEgbWFwcGluZ3NldCBpcyBhIHNldCBvZiBtYXBwaW5ncwotICovCi1wdWJsaWMgY2xhc3MgTWFwcGluZ1NldCBpbXBsZW1lbnRzIE1hcHBlciB7Ci0KLSAgICBMaXN0IG1hcHBpbmdzID0gbmV3IExpbmtlZExpc3QoKTsKLQotICAgIC8qKgotICAgICAqIGFkZCBhIG5ldyBtYXBwaW5nCi0gICAgICogQHBhcmFtIG1hcHBpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRNYXBwaW5nKE5hbWVzcGFjZU1hcHBpbmcgbWFwcGluZykgewotICAgICAgICBtYXBwaW5ncy5hZGQobWFwcGluZyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogYWRkIGEgbWFwcGluZ3NldCBpbnNpZGUgdGhpcyBvbmUKLSAgICAgKiBAcGFyYW0gbWFwcGluZ3NldAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZE1hcHBpbmdTZXQoTWFwcGluZ1NldCBtYXBwaW5nc2V0KSB7Ci0gICAgICAgIG1hcHBpbmdzLmFkZChtYXBwaW5nc2V0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBleGVjdXRlIGJ5IG1hcHBpbmcgZXZlcnl0aGluZyBpdGVyYXRpdmVseSBhbmQgcmVjdXJzaXZlbHkKLSAgICAgKiBAcGFyYW0gbWFwIG1hcCB0byBtYXAgaW50bwotICAgICAqIEBwYXJhbSBwYWNrYWdlSXNLZXkgaWYgdGhlIHBhY2thZ2UgaXMgdG8gYmUgdGhlIGtleSBmb3IgdGhlIG1hcAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoSGFzaE1hcCBtYXAsIGJvb2xlYW4gcGFja2FnZUlzS2V5KSB7Ci0gICAgICAgIEl0ZXJhdG9yIGl0PW1hcHBpbmdzLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIE1hcHBlciBtYXBwZXIgPSAoTWFwcGVyKSBpdC5uZXh0KCk7Ci0gICAgICAgICAgICBtYXBwZXIuZXhlY3V0ZShtYXAsIHBhY2thZ2VJc0tleSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXZhMndzZGwvc3JjL29yZy9hcGFjaGUvd3MvamF2YTJ3c2RsL05hbWVzcGFjZU1hcHBpbmcuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2phdmEyd3NkbC9zcmMvb3JnL2FwYWNoZS93cy9qYXZhMndzZGwvTmFtZXNwYWNlTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjc1YTZjLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2phdmEyd3NkbC9zcmMvb3JnL2FwYWNoZS93cy9qYXZhMndzZGwvTmFtZXNwYWNlTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS53cy5qYXZhMndzZGw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLnV0aWwuU3RBWFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUNvbnN0YW50czsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotLyoqCi0gKiBVc2VkIGZvciBuZXN0ZWQgcGFja2FnZSBkZWZpbml0aW9ucy4KLSAqIFRoZSBmaWxlIGZvcm1hdCB1c2VkIGZvciBzdG9yaW5nIG1hcHBpbmdzIGlzIGEgbGlzdCBvZiBwYWNrYWdlPW5hbWVzcGFjZQotICovCi1wdWJsaWMgY2xhc3MgTmFtZXNwYWNlTWFwcGluZyBpbXBsZW1lbnRzIE1hcHBlciB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBQS0cyTlNfTUFQUElOR1MgPSBuZXcgUU5hbWUoImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyIiwgInBrZzJuc19tYXBwaW5nIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBNQVBQSU5HID0gbmV3IFFOYW1lKCJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMiIsICJtYXBwaW5nIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRVNQQUNFID0gIm5hbWVzcGFjZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFDS0FHRSA9ICJwYWNrYWdlIjsKLQotICAgIHByaXZhdGUgU3RyaW5nIG5hbWVzcGFjZSA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgcGFja2FnZU5hbWUgPSBudWxsOwotICAgIHByaXZhdGUgRmlsZSBtYXBwaW5nRmlsZTsKLSAgICBwcml2YXRlIElucHV0U3RyZWFtIG1hcElucHV0U3RyZWFtID0gbnVsbDsKLSAgICBwcml2YXRlIFhNTFN0cmVhbVJlYWRlciBtYXBYbWxSZWFkZXIgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogcGFzcyBpbiB0aGUgbmFtZXNwYWNlIHRvIG1hcCB0bwotICAgICAqLwotICAgIHB1YmxpYyBOYW1lc3BhY2VNYXBwaW5nKCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIHRoZSBuYW1lc3BhY2UgaW4gdGhlIFdTREwuIFJlcXVpcmVkLgotICAgICAqIEBwYXJhbSB2YWx1ZSBuZXcgdXJpIG9mIHRoZSBtYXBwaW5nCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZXNwYWNlKFN0cmluZyB2YWx1ZSkgewotICAgICAgICBuYW1lc3BhY2UgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB0aGUgSmF2YSBwYWNrYWdlIHRvIGJpbmQgdG8uIFJlcXVpcmVkLgotICAgICAqIEBwYXJhbSB2YWx1ZSBqYXZhIHBhY2thZ2UgbmFtZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFBhY2thZ2UoU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIHBhY2thZ2VOYW1lID0gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogbmFtZSBvZiBhIHByb3BlcnR5IGZpbGUgdGhhdCBjb250YWlucyBtYXBwaW5ncyBpbgotICAgICAqIHBhY2thZ2U9bmFtZXNwYWNlIGZvcm1hdAotICAgICAqIEBwYXJhbSBmaWxlIGZpbGUgdG8gbG9hZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEZpbGUoRmlsZSBmaWxlKSB7Ci0gICAgICAgIG1hcHBpbmdGaWxlID0gZmlsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBtYXAgYSBuYW1lc3BhY2UgdG8gYSBwYWNrYWdlCi0gICAgICogQHBhcmFtIG1hcCBtYXAgdG8gYXNzaWduIHRvCi0gICAgICogQHBhcmFtIHBhY2tOYW1lIHBhY2thZ2UgbmFtZQotICAgICAqIEBwYXJhbSBuc3BhY2UgbmFtZXNwYWNlCi0gICAgICogQHBhcmFtIHBhY2thZ2VJc0tleSBpZiB0aGUgcGFja2FnZSBpcyB0byBiZSB0aGUga2V5IGZvciB0aGUgbWFwCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgbWFwKEhhc2hNYXAgbWFwLAotICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGFja05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuc3BhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gcGFja2FnZUlzS2V5KSB7Ci0gICAgICAgIGlmKHBhY2thZ2VJc0tleSkgewotICAgICAgICAgICAgbWFwLnB1dChwYWNrTmFtZSxuc3BhY2UpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbWFwLnB1dChuc3BhY2UsIHBhY2tOYW1lKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIHZhbGlkYXRlIHRoZSBvcHRpb24gc2V0Ci0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlKCkgewotICAgICAgICBpZiAobWFwcGluZ0ZpbGUgIT0gbnVsbCB8fCBtYXBJbnB1dFN0cmVhbSAhPSBudWxsIHx8IG1hcFhtbFJlYWRlciAhPSBudWxsICkgewotICAgICAgICAgICAgaWYgKG5hbWVzcGFjZSAhPSBudWxsIHx8IHBhY2thZ2VOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAiTmFtZXNwYWNlIG9yIFBhY2thZ2UgY2Fubm90IGJlIHVzZWQgd2l0aCBhIEZpbGUgYXR0cmlidXRlIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAobmFtZXNwYWNlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIm5hbWVzcGFjZSBtdXN0IGJlIGRlZmluZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwYWNrYWdlTmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJwYWNrYWdlIG11c3QgYmUgZGVmaW5lZCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTG9hZCBhIG1hcHBpbmcgeG1sIHJlYWRlciBhbmQgc2F2ZSBpdCB0byB0aGUgbWFwCi0gICAgICogQHBhcmFtIG1hcCB0YXJnZXQgbWFwIGZpbGUKLSAgICAgKiBAcGFyYW0gcGFja2FnZUlzS2V5IGlmIHRoZSBwYWNrYWdlIGlzIHRvIGJlIHRoZSBrZXkgZm9yIHRoZSBtYXAKLSAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIGFuIElPRXhjZXB0aW9uIG5lZWRlZCBzd2FsbG93aW5nCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgbWFwWG1sUmVhZGVyKEhhc2hNYXAgbWFwLCBib29sZWFuIHBhY2thZ2VJc0tleSkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGxvYWRNYXBwaW5nRnJvbVhNTFJlYWRlcihtYXAsIHBhY2thZ2VJc0tleSk7IAotICAgICAgICB9IGNhdGNoICggRXhjZXB0aW9uIGUgKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAKLSAgICAKLSAgICAvKioKLSAgICAgKiBMb2FkIGEgbWFwcGluZyBpbnB1dCBzdHJlYW0gIGFuZCBzYXZlIGl0IHRvIHRoZSBtYXAKLSAgICAgKiBAcGFyYW0gbWFwIHRhcmdldCBtYXAgZmlsZQotICAgICAqIEBwYXJhbSBwYWNrYWdlSXNLZXkgaWYgdGhlIHBhY2thZ2UgaXMgdG8gYmUgdGhlIGtleSBmb3IgdGhlIG1hcAotICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgYW4gSU9FeGNlcHRpb24gbmVlZGVkIHN3YWxsb3dpbmcKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBtYXBYbWxTdHJlYW0oSGFzaE1hcCBtYXAsIGJvb2xlYW4gcGFja2FnZUlzS2V5KSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgbWFwWG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihtYXBJbnB1dFN0cmVhbSk7Ci0gICAgICAgICAgICBtYXBYbWxSZWFkZXIobWFwLCBwYWNrYWdlSXNLZXkpOwotICAgICAgICAgICAgLy9lbnN1cmUgdGhpcyBjbGVhbiB1cCBzbyB0aGF0IHRoZSBuZXh0IGludm9jYXRpb24gZG9lcyBub3QgaGF2ZSBhbnkgc3RhbGUgc3RhdGUKLSAgICAgICAgICAgIG1hcFhtbFJlYWRlciA9IG51bGw7Ci0gICAgICAgIH0gY2F0Y2ggKCBFeGNlcHRpb24gZSApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBMb2FkIGEgbWFwcGluZyBmaWxlIGFuZCBzYXZlIGl0IHRvIHRoZSBtYXAKLSAgICAgKiBAcGFyYW0gbWFwIHRhcmdldCBtYXAgZmlsZQotICAgICAqIEBwYXJhbSBwYWNrYWdlSXNLZXkgaWYgdGhlIHBhY2thZ2UgaXMgdG8gYmUgdGhlIGtleSBmb3IgdGhlIG1hcAotICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgYW4gSU9FeGNlcHRpb24gbmVlZGVkIHN3YWxsb3dpbmcKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBtYXBGaWxlKEhhc2hNYXAgbWFwLCBib29sZWFuIHBhY2thZ2VJc0tleSkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1hcElucHV0U3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShtYXBwaW5nRmlsZSk7Ci0gICAgICAgICAgICBtYXBYbWxTdHJlYW0obWFwLCBwYWNrYWdlSXNLZXkpOyAKLSAgICAgICAgICAgIC8vbmVlZCB0byBkbyB0aGlzIHNpbmNlIHRoZSBmaWxlIHdhcyBvcGVuZWQgaGVyZQotICAgICAgICAgICAgbWFwSW5wdXRTdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgIC8vZW5zdXJlIHRoaXMgY2xlYW4gdXAgc28gdGhhdCB0aGUgbmV4dCBpbnZvY2F0aW9uIGRvZXMgbm90IGhhdmUgYW55IHN0YWxlIHN0YXRlCi0gICAgICAgICAgICBtYXBJbnB1dFN0cmVhbSA9IG51bGw7Ci0gICAgICAgIH0gY2F0Y2ggKCBFeGNlcHRpb24gZSApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBsb2FkIGZyb20gYW4geG1sIHJlYWRlciBjb250YWluaW5nIG1hcHBpbmcgaW5mbwotICAgICAqIEByZXR1cm4gYSBwcm9wZXJ0aWVzIGZpbGUgd2l0aCB6ZXJvIG9yIG1vcmUgbWFwcGluZ3MKLSAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZSBsb2FkIGZhaWxlZAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBsb2FkTWFwcGluZ0Zyb21YTUxSZWFkZXIoSGFzaE1hcCBtYXAsIGJvb2xlYW4gcGFja2FnZUlzS2V5KSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIFFOYW1lIHBhcmVudEVsZW1lbnQgPSBudWxsOwotICAgICAgICAgICAgICAgIC8vaWYgdGhlIHJlYWRlciBpcyBpbiB0aGUgZnJhZ21lbnQgdGhhdCBkZWFscyB3aXRoIHBhY2thZ2UgdG8gbmFtZXNwYWNlIG1hcHBpbmdzCi0gICAgICAgICAgICAgICAgd2hpbGUgKG1hcFhtbFJlYWRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAvLyBtYXBYbWxSZWFkZXIubmV4dCgpO21hcFhtbFJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgLy8gIGlmICggbWFwWG1sUmVhZGVyLmdldE5hbWUoKS5lcXVhbHMoUEtHMk5TX01BUFBJTkdTKSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobWFwWG1sUmVhZGVyLm5leHQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgWE1MU3RyZWFtQ29uc3RhbnRzLlNUQVJUX0VMRU1FTlQgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRTmFtZSBxbmFtZSA9IG1hcFhtbFJlYWRlci5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChNQVBQSU5HLmVxdWFscyhxbmFtZSkgJiYgcGFyZW50RWxlbWVudC5lcXVhbHMoUEtHMk5TX01BUFBJTkdTKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwKG1hcCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwWG1sUmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsIFBBQ0tBR0UpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBYbWxSZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgTkFNRVNQQUNFKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZUlzS2V5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudEVsZW1lbnQgPSBxbmFtZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwWG1sUmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBYTUxTdHJlYW1Db25zdGFudHMuRU5EX0VMRU1FTlQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXBYbWxSZWFkZXIuZ2V0TmFtZSgpLmVxdWFscyhQS0cyTlNfTUFQUElOR1MpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2Vuc3VyZSB0aGlzIGNsZWFuIHVwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgLy8gICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKCBFeGNlcHRpb24gZSApIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXhjZXB0aW9uIHdoaWxlIGxvYWRpbmcgcGFja2FnZSB0byBuYW1lc3BhY2UgbWFwcGluZ3MuLi4gIiArIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogZXhlY3V0ZSB0aGUgbWFwcGluZwotICAgICAqIEBwYXJhbSBtYXAgbWFwIHRvIG1hcCB0bwotICAgICAqIEBwYXJhbSBwYWNrYWdlSXNLZXkgaWYgdGhlIHBhY2thZ2UgaXMgdG8gYmUgdGhlIGtleSBmb3IgdGhlIG1hcAotICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaW4gY2FzZSBvZiBlbWVyZ2VuY3kKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKEhhc2hNYXAgbWFwLCBib29sZWFuIHBhY2thZ2VJc0tleSkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgdmFsaWRhdGUoKTsKLSAgICAgICAgaWYgKG1hcHBpbmdGaWxlICE9IG51bGwgKSB7Ci0gICAgICAgICAgICBtYXBGaWxlKG1hcCxwYWNrYWdlSXNLZXkpOwotICAgICAgICAgICAgLy9lbnN1cmUgdGhpcyBjbGVhbiB1cCBzbyB0aGF0IHRoZSBuZXh0IGludm9jYXRpb24gZG9lcyBub3QgaGF2ZSBhbnkgc3RhbGUgc3RhdGUKLSAgICAgICAgICAgIG1hcHBpbmdGaWxlID0gbnVsbDsKLSAgICAgICAgfSBlbHNlIGlmICggbWFwSW5wdXRTdHJlYW0gIT0gbnVsbCApIHsKLSAgICAgICAgICAgIG1hcFhtbFN0cmVhbShtYXAsIHBhY2thZ2VJc0tleSk7ICAgCi0gICAgICAgIH0gZWxzZSBpZiAoIG1hcFhtbFJlYWRlciAhPSBudWxsICkgewotICAgICAgICAgICAgbWFwWG1sUmVhZGVyKG1hcCwgcGFja2FnZUlzS2V5KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1hcChtYXAsIHBhY2thZ2VOYW1lLCBuYW1lc3BhY2UsIHBhY2thZ2VJc0tleSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0TWFwSW5wdXRTdHJlYW0oKSB7Ci0gICAgICAgIHJldHVybiBtYXBJbnB1dFN0cmVhbTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRNYXBJbnB1dFN0cmVhbShJbnB1dFN0cmVhbSBtYXBJbnB1dFN0cmVhbSkgewotICAgICAgICB0aGlzLm1hcElucHV0U3RyZWFtID0gbWFwSW5wdXRTdHJlYW07Ci0gICAgfQotCi0gICAgcHVibGljIEZpbGUgZ2V0TWFwcGluZ0ZpbGUoKSB7Ci0gICAgICAgIHJldHVybiBtYXBwaW5nRmlsZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRNYXBwaW5nRmlsZShGaWxlIG1hcHBpbmdGaWxlKSB7Ci0gICAgICAgIHRoaXMubWFwcGluZ0ZpbGUgPSBtYXBwaW5nRmlsZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgWE1MU3RyZWFtUmVhZGVyIGdldFhtbFJlYWRlcigpIHsKLSAgICAgICAgcmV0dXJuIG1hcFhtbFJlYWRlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRYbWxSZWFkZXIoWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlcikgewotICAgICAgICB0aGlzLm1hcFhtbFJlYWRlciA9IHhtbFJlYWRlcjsKLSAgICB9Ci0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2phdmEyd3NkbC9zcmMvb3JnL2FwYWNoZS93cy9qYXZhMndzZGwvdXRpbHMvSmF2YTJXU0RMQ29tbWFuZExpbmVPcHRpb24uamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2phdmEyd3NkbC9zcmMvb3JnL2FwYWNoZS93cy9qYXZhMndzZGwvdXRpbHMvSmF2YTJXU0RMQ29tbWFuZExpbmVPcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA4YTc1Ni4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXZhMndzZGwvc3JjL29yZy9hcGFjaGUvd3MvamF2YTJ3c2RsL3V0aWxzL0phdmEyV1NETENvbW1hbmRMaW5lT3B0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUud3MuamF2YTJ3c2RsLnV0aWxzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5qYXZhMndzZGwuSmF2YTJXU0RMQ29uc3RhbnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotcHVibGljIGNsYXNzIEphdmEyV1NETENvbW1hbmRMaW5lT3B0aW9uIGltcGxlbWVudHMgSmF2YTJXU0RMQ29uc3RhbnRzIHsKLQotICAgIHByaXZhdGUgU3RyaW5nIHR5cGU7Ci0gICAgICAgcHJpdmF0ZSBBcnJheUxpc3Qgb3B0aW9uVmFsdWVzOwotCi0gICAgICAgcHVibGljIEphdmEyV1NETENvbW1hbmRMaW5lT3B0aW9uKFN0cmluZyB0eXBlLCBTdHJpbmdbXSB2YWx1ZXMpIHsKLSAgICAgICAgICAgc2V0T3B0aW9uVHlwZSh0eXBlKTsKLSAgICAgICAgICAgQXJyYXlMaXN0IGFycmF5TGlzdCA9IG5ldyBBcnJheUxpc3QodmFsdWVzLmxlbmd0aCk7Ci0gICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICBhcnJheUxpc3QuYWRkKHZhbHVlc1tpXSk7Ci0gICAgICAgICAgIH0KLSAgICAgICAgICAgdGhpcy5vcHRpb25WYWx1ZXMgPSBhcnJheUxpc3Q7Ci0gICAgICAgfQotCi0gICAgICAgcHJpdmF0ZSB2b2lkIHNldE9wdGlvblR5cGUoU3RyaW5nIHR5cGUpIHsKLSAgICAgICAgICAgLy9jYXRlciBmb3IgdGhlIGxvbmcgb3B0aW9ucyBmaXJzdAotICAgICAgICAgICBpZiAodHlwZS5zdGFydHNXaXRoKCItLSIpKSB0eXBlID0gdHlwZS5yZXBsYWNlRmlyc3QoIi0tIiwgIiIpOwotICAgICAgICAgICBpZiAodHlwZS5zdGFydHNXaXRoKCItIikpIHR5cGUgPSB0eXBlLnJlcGxhY2VGaXJzdCgiLSIsICIiKTsKLSAgICAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKLSAgICAgICB9Ci0KLSAgICAgICAvKioKLSAgICAgICAgKiBAcGFyYW0gdHlwZQotICAgICAgICAqLwotICAgICAgIHB1YmxpYyBKYXZhMldTRExDb21tYW5kTGluZU9wdGlvbihTdHJpbmcgdHlwZSwgQXJyYXlMaXN0IHZhbHVlcykgewotICAgICAgICAgICBzZXRPcHRpb25UeXBlKHR5cGUpOwotCi0gICAgICAgICAgIGlmIChudWxsICE9IHZhbHVlcykgewotICAgICAgICAgICAgICAgdGhpcy5vcHRpb25WYWx1ZXMgPSB2YWx1ZXM7Ci0gICAgICAgICAgIH0KLSAgICAgICB9Ci0KLQotICAgICAgIC8qKgotICAgICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgdHlwZS4KLSAgICAgICAgKi8KLSAgICAgICBwdWJsaWMgU3RyaW5nIGdldE9wdGlvblR5cGUoKSB7Ci0gICAgICAgICAgIHJldHVybiB0eXBlOwotICAgICAgIH0KLQotCi0gICAgICAgLyoqCi0gICAgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBvcHRpb25WYWx1ZXMuCi0gICAgICAgICovCi0gICAgICAgcHVibGljIFN0cmluZyBnZXRPcHRpb25WYWx1ZSgpIHsKLSAgICAgICAgICAgaWYgKG9wdGlvblZhbHVlcyAhPSBudWxsKQotICAgICAgICAgICAgICAgcmV0dXJuIChTdHJpbmcpIG9wdGlvblZhbHVlcy5nZXQoMCk7Ci0gICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgIH0KLQotCi0KLSAgICAgICAvKioKLSAgICAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIG9wdGlvblZhbHVlcy4KLSAgICAgICAgKi8KLSAgICAgICBwdWJsaWMgQXJyYXlMaXN0IGdldE9wdGlvblZhbHVlcygpIHsKLSAgICAgICAgICAgcmV0dXJuIG9wdGlvblZhbHVlczsKLSAgICAgICB9Ci0KLQotICAgfQotCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXZhMndzZGwvc3JjL29yZy9hcGFjaGUvd3MvamF2YTJ3c2RsL3V0aWxzL0phdmEyV1NETENvbW1hbmRMaW5lT3B0aW9uUGFyc2VyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXZhMndzZGwvc3JjL29yZy9hcGFjaGUvd3MvamF2YTJ3c2RsL3V0aWxzL0phdmEyV1NETENvbW1hbmRMaW5lT3B0aW9uUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3MmU1ZjYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF2YTJ3c2RsL3NyYy9vcmcvYXBhY2hlL3dzL2phdmEyd3NkbC91dGlscy9KYXZhMldTRExDb21tYW5kTGluZU9wdGlvblBhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS53cy5qYXZhMndzZGwudXRpbHM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLmphdmEyd3NkbC5KYXZhMldTRExDb25zdGFudHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1wdWJsaWMgY2xhc3MgSmF2YTJXU0RMQ29tbWFuZExpbmVPcHRpb25QYXJzZXIgaW1wbGVtZW50cyBKYXZhMldTRExDb25zdGFudHMgewotICAgIHByaXZhdGUgc3RhdGljIGludCBTVEFSVEVEID0gMDsKLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgTkVXX09QVElPTiA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IFNVQl9QQVJBTV9PRl9PUFRJT04gPSAyOwotCi0gICAgcHJpdmF0ZSBNYXAgY29tbWFuZExpbmVPcHRpb25zOwotCi0gICAgcHVibGljIEphdmEyV1NETENvbW1hbmRMaW5lT3B0aW9uUGFyc2VyKE1hcCBjb21tYW5kTGluZU9wdGlvbnMpIHsKLSAgICAgICAgdGhpcy5jb21tYW5kTGluZU9wdGlvbnMgPSBjb21tYW5kTGluZU9wdGlvbnM7Ci0gICAgfQotCi0gICAgcHVibGljIEphdmEyV1NETENvbW1hbmRMaW5lT3B0aW9uUGFyc2VyKFN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgdGhpcy5jb21tYW5kTGluZU9wdGlvbnMgPSB0aGlzLnBhcnNlKGFyZ3MpOwotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIGEgbGlzdCB3aXRoIDxjb2RlPkNvbW1hbmRMaW5lT3B0aW9uPC9jb2RlPiBvYmplY3RzCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYXJncwotICAgICAqIEByZXR1cm4gQ29tbWFuZExpbmVPcHRpb24gTGlzdAotICAgICAqLwotICAgIHByaXZhdGUgTWFwIHBhcnNlKFN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgTWFwIGNvbW1hbmRMaW5lT3B0aW9ucyA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICAgICAgaWYgKDAgPT0gYXJncy5sZW5ndGgpCi0gICAgICAgICAgICByZXR1cm4gY29tbWFuZExpbmVPcHRpb25zOwotCi0gICAgICAgIC8vU3RhdGUgMCBtZWFucyBzdGFydGVkCi0gICAgICAgIC8vU3RhdGUgMSBtZWFucyBlYXJsaWVyIG9uZSB3YXMgYSBuZXcgLW9wdGlvbgotICAgICAgICAvL1N0YXRlIDIgbWVhbnMgZWFybGllciBvbmUgd2FzIGEgc3ViIHBhcmFtIG9mIGEgLW9wdGlvbgotCi0gICAgICAgIGludCBzdGF0ZSA9IFNUQVJURUQ7Ci0gICAgICAgIEFycmF5TGlzdCBvcHRpb25CdW5kbGUgPSBudWxsOwotICAgICAgICBTdHJpbmcgb3B0aW9uVHlwZSA9IG51bGw7Ci0gICAgICAgIEphdmEyV1NETENvbW1hbmRMaW5lT3B0aW9uIGNvbW1hbmRMaW5lT3B0aW9uOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgewotCi0gICAgICAgICAgICBpZiAoYXJnc1tpXS5zdGFydHNXaXRoKCItIikpIHsKLSAgICAgICAgICAgICAgICBpZiAoU1RBUlRFRCA9PSBzdGF0ZSkgewotICAgICAgICAgICAgICAgICAgICAvLyBmcmVzaCBvbmUKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBORVdfT1BUSU9OOwotICAgICAgICAgICAgICAgICAgICBvcHRpb25UeXBlID0gYXJnc1tpXTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFNVQl9QQVJBTV9PRl9PUFRJT04gPT0gc3RhdGUgfHwgTkVXX09QVElPTiA9PSBzdGF0ZSkgewotICAgICAgICAgICAgICAgICAgICAvLyBuZXcgb25lIGJ1dCBvbGQgb25lIHNob3VsZCBiZSBzYXZlZAotICAgICAgICAgICAgICAgICAgICBjb21tYW5kTGluZU9wdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEphdmEyV1NETENvbW1hbmRMaW5lT3B0aW9uKG9wdGlvblR5cGUsIG9wdGlvbkJ1bmRsZSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbW1hbmRMaW5lT3B0aW9ucy5wdXQoY29tbWFuZExpbmVPcHRpb24uZ2V0T3B0aW9uVHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRMaW5lT3B0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBORVdfT1BUSU9OOwotICAgICAgICAgICAgICAgICAgICBvcHRpb25UeXBlID0gYXJnc1tpXTsKLSAgICAgICAgICAgICAgICAgICAgb3B0aW9uQnVuZGxlID0gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChTVEFSVEVEID09IHN0YXRlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbW1hbmRMaW5lT3B0aW9uID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSmF2YTJXU0RMQ29tbWFuZExpbmVPcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT0xFX0lOUFVULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncyk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbW1hbmRMaW5lT3B0aW9ucy5wdXQoY29tbWFuZExpbmVPcHRpb24uZ2V0T3B0aW9uVHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRMaW5lT3B0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbW1hbmRMaW5lT3B0aW9uczsKLQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoTkVXX09QVElPTiA9PSBzdGF0ZSkgewotICAgICAgICAgICAgICAgICAgICBKYXZhMldTRExDb21tYW5kTGluZU9wdGlvbiBvbGQgPSAoSmF2YTJXU0RMQ29tbWFuZExpbmVPcHRpb24pY29tbWFuZExpbmVPcHRpb25zLmdldChnZXRPcHRpb25UeXBlKG9wdGlvblR5cGUpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYob2xkICE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvbGQuZ2V0T3B0aW9uVmFsdWVzKCkuYWRkKGFyZ3NbaV0pOwotICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uQnVuZGxlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gU1RBUlRFRDsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbkJ1bmRsZSA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbkJ1bmRsZS5hZGQoYXJnc1tpXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IFNVQl9QQVJBTV9PRl9PUFRJT047Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFNVQl9QQVJBTV9PRl9PUFRJT04gPT0gc3RhdGUpIHsKLSAgICAgICAgICAgICAgICAgICAgb3B0aW9uQnVuZGxlLmFkZChhcmdzW2ldKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0KLQotCi0gICAgICAgIH0KLQotICAgICAgICBpZihzdGF0ZSAhPSBTVEFSVEVEKSB7IAotICAgICAgICAgICAgY29tbWFuZExpbmVPcHRpb24gPSBuZXcgSmF2YTJXU0RMQ29tbWFuZExpbmVPcHRpb24ob3B0aW9uVHlwZSwgb3B0aW9uQnVuZGxlKTsKLSAgICAgICAgICAgIGNvbW1hbmRMaW5lT3B0aW9ucy5wdXQoY29tbWFuZExpbmVPcHRpb24uZ2V0T3B0aW9uVHlwZSgpLCBjb21tYW5kTGluZU9wdGlvbik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNvbW1hbmRMaW5lT3B0aW9uczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRPcHRpb25UeXBlKFN0cmluZyB0eXBlKSB7Ci0gICAgICAgIC8vY2F0ZXIgZm9yIHRoZSBsb25nIG9wdGlvbnMgZmlyc3QKLSAgICAgICAgaWYgKHR5cGUuc3RhcnRzV2l0aCgiLS0iKSkgdHlwZSA9IHR5cGUucmVwbGFjZUZpcnN0KCItLSIsICIiKTsKLSAgICAgICAgaWYgKHR5cGUuc3RhcnRzV2l0aCgiLSIpKSB0eXBlID0gdHlwZS5yZXBsYWNlRmlyc3QoIi0iLCAiIik7Ci0gICAgICAgIHJldHVybiB0eXBlOwotICAgIH0KLQotICAgIHB1YmxpYyBNYXAgZ2V0QWxsT3B0aW9ucygpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuY29tbWFuZExpbmVPcHRpb25zOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0IGdldEludmFsaWRPcHRpb25zKEphdmEyV1NETE9wdGlvbnNWYWxpZGF0b3IgdmFsaWRhdG9yKSB7Ci0gICAgICAgIExpc3QgZmF1bHRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBJdGVyYXRvciBpdGVyYXRvciA9IHRoaXMuY29tbWFuZExpbmVPcHRpb25zLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIEphdmEyV1NETENvbW1hbmRMaW5lT3B0aW9uIGNvbW1hbmRMaW5lT3B0aW9uID0gKChKYXZhMldTRExDb21tYW5kTGluZU9wdGlvbikgKGl0ZXJhdG9yCi0gICAgICAgICAgICAgICAgICAgIC5uZXh0KCkpKTsKLSAgICAgICAgICAgIGlmICh2YWxpZGF0b3IuaXNJbnZhbGlkKGNvbW1hbmRMaW5lT3B0aW9uKSkgewotICAgICAgICAgICAgICAgIGZhdWx0TGlzdC5hZGQoY29tbWFuZExpbmVPcHRpb24pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhdWx0TGlzdDsKLSAgICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF2YTJ3c2RsL3NyYy9vcmcvYXBhY2hlL3dzL2phdmEyd3NkbC91dGlscy9KYXZhMldTRExPcHRpb25zVmFsaWRhdG9yLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXZhMndzZGwvc3JjL29yZy9hcGFjaGUvd3MvamF2YTJ3c2RsL3V0aWxzL0phdmEyV1NETE9wdGlvbnNWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY4YmEwYy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXZhMndzZGwvc3JjL29yZy9hcGFjaGUvd3MvamF2YTJ3c2RsL3V0aWxzL0phdmEyV1NETE9wdGlvbnNWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS53cy5qYXZhMndzZGwudXRpbHM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLmphdmEyd3NkbC5KYXZhMldTRExDb25zdGFudHM7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhMldTRExPcHRpb25zVmFsaWRhdG9yIGltcGxlbWVudHMgSmF2YTJXU0RMQ29uc3RhbnRzIHsKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0ludmFsaWQoSmF2YTJXU0RMQ29tbWFuZExpbmVPcHRpb24gb3B0aW9uKSB7Ci0gICAgICAgIGJvb2xlYW4gaW52YWxpZDsKLSAgICAgICAgU3RyaW5nIG9wdGlvblR5cGUgPSBvcHRpb24uZ2V0T3B0aW9uVHlwZSgpOwotCi0gICAgICAgIGludmFsaWQgPSAhKAotICAgICAgICAgICAgICAgIEphdmEyV1NETENvbnN0YW50cy5BVFRSX0ZPUk1fREVGQVVMVF9PUFRJT04uZXF1YWxzSWdub3JlQ2FzZShvcHRpb25UeXBlKSB8fAotICAgICAgICAgICAgICAgIEphdmEyV1NETENvbnN0YW50cy5BVFRSX0ZPUk1fREVGQVVMVF9PUFRJT05fTE9ORy5lcXVhbHNJZ25vcmVDYXNlKG9wdGlvblR5cGUpIHx8Ci0gICAgICAgICAgICAgICAgSmF2YTJXU0RMQ29uc3RhbnRzLkNMQVNTTkFNRV9PUFRJT04uZXF1YWxzSWdub3JlQ2FzZShvcHRpb25UeXBlKSB8fAotICAgICAgICAgICAgICAgIEphdmEyV1NETENvbnN0YW50cy5DTEFTU05BTUVfT1BUSU9OX0xPTkcuZXF1YWxzSWdub3JlQ2FzZShvcHRpb25UeXBlKSB8fAotICAgICAgICAgICAgICAgIEphdmEyV1NETENvbnN0YW50cy5DTEFTU1BBVEhfT1BUSU9OLmVxdWFsc0lnbm9yZUNhc2Uob3B0aW9uVHlwZSkgfHwKLSAgICAgICAgICAgICAgICBKYXZhMldTRExDb25zdGFudHMuQ0xBU1NQQVRIX09QVElPTl9MT05HLmVxdWFsc0lnbm9yZUNhc2Uob3B0aW9uVHlwZSkgfHwKLSAgICAgICAgICAgICAgICBKYXZhMldTRExDb25zdGFudHMuRE9DX0xJVF9CQVJFLmVxdWFsc0lnbm9yZUNhc2Uob3B0aW9uVHlwZSkgfHwKLSAgICAgICAgICAgICAgICBKYXZhMldTRExDb25zdGFudHMuRE9DX0xJVF9CQVJFX0xPTkcuZXF1YWxzSWdub3JlQ2FzZShvcHRpb25UeXBlKSB8fAotICAgICAgICAgICAgICAgIEphdmEyV1NETENvbnN0YW50cy5FTEVNRU5UX0ZPUk1fREVGQVVMVF9PUFRJT04uZXF1YWxzSWdub3JlQ2FzZShvcHRpb25UeXBlKSB8fAotICAgICAgICAgICAgICAgIEphdmEyV1NETENvbnN0YW50cy5FTEVNRU5UX0ZPUk1fREVGQVVMVF9PUFRJT05fTE9ORy5lcXVhbHNJZ25vcmVDYXNlKG9wdGlvblR5cGUpIHx8Ci0gICAgICAgICAgICAgICAgSmF2YTJXU0RMQ29uc3RhbnRzLkVYVFJBX0NMQVNTRVNfREVGQVVMVF9PUFRJT04uZXF1YWxzSWdub3JlQ2FzZShvcHRpb25UeXBlKSB8fAotICAgICAgICAgICAgICAgIEphdmEyV1NETENvbnN0YW50cy5FWFRSQV9DTEFTU0VTX0RFRkFVTFRfT1BUSU9OX0xPTkcuZXF1YWxzSWdub3JlQ2FzZShvcHRpb25UeXBlKSB8fAotICAgICAgICAgICAgICAgIEphdmEyV1NETENvbnN0YW50cy5KQVZBX1BLR18yX05TTUFQX09QVElPTi5lcXVhbHNJZ25vcmVDYXNlKG9wdGlvblR5cGUpIHx8Ci0gICAgICAgICAgICAgICAgSmF2YTJXU0RMQ29uc3RhbnRzLkpBVkFfUEtHXzJfTlNNQVBfT1BUSU9OX0xPTkcuZXF1YWxzSWdub3JlQ2FzZShvcHRpb25UeXBlKSB8fAotICAgICAgICAgICAgICAgIEphdmEyV1NETENvbnN0YW50cy5MT0NBVElPTl9PUFRJT04uZXF1YWxzSWdub3JlQ2FzZShvcHRpb25UeXBlKSB8fAotICAgICAgICAgICAgICAgIEphdmEyV1NETENvbnN0YW50cy5MT0NBVElPTl9PUFRJT05fTE9ORy5lcXVhbHNJZ25vcmVDYXNlKG9wdGlvblR5cGUpIHx8Ci0gICAgICAgICAgICAgICAgSmF2YTJXU0RMQ29uc3RhbnRzLk5BTUVTUEFDRV9HRU5FUkFUT1JfT1BUSU9OLmVxdWFsc0lnbm9yZUNhc2Uob3B0aW9uVHlwZSkgfHwKLSAgICAgICAgICAgICAgICBKYXZhMldTRExDb25zdGFudHMuTkFNRVNQQUNFX0dFTkVSQVRPUl9PUFRJT05fTE9ORy5lcXVhbHNJZ25vcmVDYXNlKG9wdGlvblR5cGUpIHx8Ci0gICAgICAgICAgICAgICAgSmF2YTJXU0RMQ29uc3RhbnRzLk9VVFBVVF9GSUxFTkFNRV9PUFRJT04uZXF1YWxzSWdub3JlQ2FzZShvcHRpb25UeXBlKSB8fAotICAgICAgICAgICAgICAgIEphdmEyV1NETENvbnN0YW50cy5PVVRQVVRfRklMRU5BTUVfT1BUSU9OX0xPTkcuZXF1YWxzSWdub3JlQ2FzZShvcHRpb25UeXBlKSB8fAotICAgICAgICAgICAgICAgIEphdmEyV1NETENvbnN0YW50cy5PVVRQVVRfTE9DQVRJT05fT1BUSU9OLmVxdWFsc0lnbm9yZUNhc2Uob3B0aW9uVHlwZSkgfHwKLSAgICAgICAgICAgICAgICBKYXZhMldTRExDb25zdGFudHMuT1VUUFVUX0xPQ0FUSU9OX09QVElPTl9MT05HLmVxdWFsc0lnbm9yZUNhc2Uob3B0aW9uVHlwZSkgfHwKLSAgICAgICAgICAgICAgICBKYXZhMldTRExDb25zdGFudHMuU0NIRU1BX0dFTkVSQVRPUl9PUFRJT04uZXF1YWxzSWdub3JlQ2FzZShvcHRpb25UeXBlKSB8fAotICAgICAgICAgICAgICAgIEphdmEyV1NETENvbnN0YW50cy5TQ0hFTUFfR0VORVJBVE9SX09QVElPTl9MT05HLmVxdWFsc0lnbm9yZUNhc2Uob3B0aW9uVHlwZSkgfHwKLSAgICAgICAgICAgICAgICBKYXZhMldTRExDb25zdGFudHMuU0NIRU1BX1RBUkdFVF9OQU1FU1BBQ0VfT1BUSU9OLmVxdWFsc0lnbm9yZUNhc2Uob3B0aW9uVHlwZSkgfHwKLSAgICAgICAgICAgICAgICBKYXZhMldTRExDb25zdGFudHMuU0NIRU1BX1RBUkdFVF9OQU1FU1BBQ0VfT1BUSU9OX0xPTkcuZXF1YWxzSWdub3JlQ2FzZShvcHRpb25UeXBlKSB8fAotICAgICAgICAgICAgICAgIEphdmEyV1NETENvbnN0YW50cy5TQ0hFTUFfVEFSR0VUX05BTUVTUEFDRV9QUkVGSVhfT1BUSU9OLmVxdWFsc0lnbm9yZUNhc2Uob3B0aW9uVHlwZSkgfHwKLSAgICAgICAgICAgICAgICBKYXZhMldTRExDb25zdGFudHMuU0NIRU1BX1RBUkdFVF9OQU1FU1BBQ0VfUFJFRklYX09QVElPTl9MT05HLmVxdWFsc0lnbm9yZUNhc2Uob3B0aW9uVHlwZSkgfHwKLSAgICAgICAgICAgICAgICBKYXZhMldTRExDb25zdGFudHMuU0VSVklDRV9OQU1FX09QVElPTi5lcXVhbHNJZ25vcmVDYXNlKG9wdGlvblR5cGUpIHx8Ci0gICAgICAgICAgICAgICAgSmF2YTJXU0RMQ29uc3RhbnRzLlNFUlZJQ0VfTkFNRV9PUFRJT05fTE9ORy5lcXVhbHNJZ25vcmVDYXNlKG9wdGlvblR5cGUpfHwKLSAgICAgICAgICAgICAgICBKYXZhMldTRExDb25zdGFudHMuU1RZTEVfT1BUSU9OLmVxdWFsc0lnbm9yZUNhc2Uob3B0aW9uVHlwZSkgfHwKLSAgICAgICAgICAgICAgICBKYXZhMldTRExDb25zdGFudHMuU1RZTEVfT1BUSU9OX0xPTkcuZXF1YWxzSWdub3JlQ2FzZShvcHRpb25UeXBlKXx8Ci0gICAgICAgICAgICAgICAgSmF2YTJXU0RMQ29uc3RhbnRzLlRBUkdFVF9OQU1FU1BBQ0VfT1BUSU9OLmVxdWFsc0lnbm9yZUNhc2Uob3B0aW9uVHlwZSkgfHwKLSAgICAgICAgICAgICAgICBKYXZhMldTRExDb25zdGFudHMuVEFSR0VUX05BTUVTUEFDRV9PUFRJT05fTE9ORy5lcXVhbHNJZ25vcmVDYXNlKG9wdGlvblR5cGUpIHx8Ci0gICAgICAgICAgICAgICAgSmF2YTJXU0RMQ29uc3RhbnRzLlRBUkdFVF9OQU1FU1BBQ0VfUFJFRklYX09QVElPTi5lcXVhbHNJZ25vcmVDYXNlKG9wdGlvblR5cGUpIHx8Ci0gICAgICAgICAgICAgICAgSmF2YTJXU0RMQ29uc3RhbnRzLlRBUkdFVF9OQU1FU1BBQ0VfUFJFRklYX09QVElPTl9MT05HLmVxdWFsc0lnbm9yZUNhc2Uob3B0aW9uVHlwZSkgfHwKLSAgICAgICAgICAgICAgICBKYXZhMldTRExDb25zdGFudHMuVVNFX09QVElPTi5lcXVhbHNJZ25vcmVDYXNlKG9wdGlvblR5cGUpIHx8Ci0gICAgICAgICAgICAgICAgSmF2YTJXU0RMQ29uc3RhbnRzLlVTRV9PUFRJT05fTE9ORy5lcXVhbHNJZ25vcmVDYXNlKG9wdGlvblR5cGUpfHwKLSAgICAgICAgICAgICAgICBKYXZhMldTRExDb25zdGFudHMuV1NETF9WRVJTSU9OX09QVElPTi5lcXVhbHNJZ25vcmVDYXNlKG9wdGlvblR5cGUpfHwKLSAgICAgICAgICAgICAgICBKYXZhMldTRExDb25zdGFudHMuQ1VTVE9NX1NDSEVNQV9MT0NBVElPTi5lcXVhbHNJZ25vcmVDYXNlKG9wdGlvblR5cGUpfHwKLSAgICAgICAgICAgICAgICBKYXZhMldTRExDb25zdGFudHMuQ1VTVE9NX1NDSEVNQV9MT0NBVElPTl9MT05HLmVxdWFsc0lnbm9yZUNhc2Uob3B0aW9uVHlwZSl8fAotICAgICAgICAgICAgICAgIEphdmEyV1NETENvbnN0YW50cy5TQ0hFTUFfTUFQUElOR19GSUxFX0xPQ0FUSU9OLmVxdWFsc0lnbm9yZUNhc2Uob3B0aW9uVHlwZSl8fAotICAgICAgICAgICAgICAgIEphdmEyV1NETENvbnN0YW50cy5TQ0hFTUFfTUFQUElOR19GSUxFX0xPQ0FUSU9OX0xPTkcuZXF1YWxzSWdub3JlQ2FzZShvcHRpb25UeXBlKXx8Ci0gICAgICAgICAgICAgICAgSmF2YTJXU0RMQ29uc3RhbnRzLldTRExfVkVSU0lPTl9PUFRJT05fTE9ORy5lcXVhbHNJZ25vcmVDYXNlKG9wdGlvblR5cGUpCi0gICAgICAgICk7Ci0gICAgICAgIHJldHVybiBpbnZhbGlkOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2phdmEyd3NkbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vQ2FsY3VsYXRvclNlcnZpY2UuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2phdmEyd3NkbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vQ2FsY3VsYXRvclNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTZmMmM1MC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXZhMndzZGwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL0NhbGN1bGF0b3JTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uOw0KLQ0KLXB1YmxpYyBjbGFzcyBDYWxjdWxhdG9yU2VydmljZSB7DQotICAgIHB1YmxpYyB2b2lkIG11bHRpcGx5KGludCBudW1iZXIpew0KLSAgICAgICAgcnVubmluZ1RvdGFsICo9IG51bWJlcjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZGQoaW50IG51bWJlcil7DQotICAgICAgICBydW5uaW5nVG90YWwgKz0gbnVtYmVyOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGRpdmlkZShpbnQgbnVtYmVyKXRocm93cyBEaXZpZGVCeVplcm9FeGNlcHRpb257DQotICAgICAgICBpZihudW1iZXIgPT0gMCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgRGl2aWRlQnlaZXJvRXhjZXB0aW9uKCJDYWxjdWxhdG9yU2VydmljZSB0cmllZCB0byBkaXZpZGUgYnkgemVybyIsIHJ1bm5pbmdUb3RhbCk7DQotICAgICAgICB9IGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBydW5uaW5nVG90YWwgPSBydW5uaW5nVG90YWwgLyAgbnVtYmVyOw0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzdWJ0cmFjdChpbnQgbnVtYmVyKXsNCi0gICAgICAgIHJ1bm5pbmdUb3RhbCA9IHJ1bm5pbmdUb3RhbCAtIG51bWJlcjsgDQotICAgIH0NCi0NCi0gICAgcHVibGljIGludCBnZXRUb3RhbCgpew0KLSAgICAgICAgcmV0dXJuIHJ1bm5pbmdUb3RhbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBjbGVhcigpew0KLSAgICAgICAgcnVubmluZ1RvdGFsID0gMDsNCi0gICAgfQ0KLSAgICBwcml2YXRlIGludCBydW5uaW5nVG90YWw7DQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2phdmEyd3NkbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vRGl2aWRlQnlaZXJvRXhjZXB0aW9uLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXZhMndzZGwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL0RpdmlkZUJ5WmVyb0V4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWJmZjc5Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2phdmEyd3NkbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vRGl2aWRlQnlaZXJvRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uOw0KLQ0KLXB1YmxpYyBjbGFzcyBEaXZpZGVCeVplcm9FeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24NCi17DQotDQotICAgIHB1YmxpYyBEaXZpZGVCeVplcm9FeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkNCi0gICAgew0KLSAgICAgICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBEaXZpZGVCeVplcm9FeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIGludCBmYXVsdCkNCi0gICAgew0KLSAgICAgICAgc3VwZXIobWVzc2FnZSk7DQotICAgICAgICB0aGlzLmZhdWx0ID0gZmF1bHQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIERpdmlkZUJ5WmVyb0V4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgaW50IGZhdWx0LCBUaHJvd2FibGUgY2F1c2UpDQotICAgIHsNCi0gICAgICAgIHN1cGVyKG1lc3NhZ2UsIGNhdXNlKTsNCi0gICAgICAgIHRoaXMuZmF1bHQgPSBmYXVsdDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgaW50IGdldEZhdWx0SW5mbygpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBmYXVsdDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGludCBmYXVsdDsNCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF2YTJ3c2RsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9KYXZhMldTRExUZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXZhMndzZGwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL0phdmEyV1NETFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI2ZTk1Ny4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXZhMndzZGwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL0phdmEyV1NETFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb247DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS53cy5qYXZhMndzZGwuSmF2YTJXU0RMQnVpbGRlcjsNCi1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7DQotDQotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsNCi1pbXBvcnQgamF2YXgud3NkbC54bWwuV1NETFJlYWRlcjsNCi1pbXBvcnQgamF2YXgud3NkbC5mYWN0b3J5LldTRExGYWN0b3J5Ow0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotDQotcHVibGljIGNsYXNzIEphdmEyV1NETFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7DQotICAgIHB1YmxpYyB2b2lkIHRlc3QxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOw0KLSAgICAgICAgSmF2YTJXU0RMQnVpbGRlciBidWlsZGVyID0gbmV3IEphdmEyV1NETEJ1aWxkZXIob3V0LCBDYWxjdWxhdG9yU2VydmljZS5jbGFzcy5nZXROYW1lKCksIENhbGN1bGF0b3JTZXJ2aWNlLmNsYXNzLmdldENsYXNzTG9hZGVyKCksIG5ldyBIYXNoTWFwKCkpOw0KLSAgICAgICAgYnVpbGRlci5nZW5lcmF0ZVdTREwoKTsNCi0gICAgICAgIElucHV0U291cmNlIGlucHV0U291cmNlID0gbmV3IElucHV0U291cmNlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvdXQudG9CeXRlQXJyYXkoKSkpOw0KLSAgICAgICAgV1NETFJlYWRlciB3c2RsUmVhZGVyID0gV1NETEZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdXU0RMUmVhZGVyKCk7DQotICAgICAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSB3c2RsUmVhZGVyLnJlYWRXU0RMKG51bGwsIGlucHV0U291cmNlKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwoZGVmaW5pdGlvbik7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4YnJpL3BvbS54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9qYXhicmkvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGI2Y2UzYi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXhicmkvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE4MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItcGFyZW50PC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4xLjUuMTwvdmVyc2lvbj4KLSAgICAgICAgPHJlbGF0aXZlUGF0aD4uLi9wYXJlbnQvcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgotICAgIDwvcGFyZW50PgotICAgIDxhcnRpZmFjdElkPmF4aXMyLWpheGJyaTwvYXJ0aWZhY3RJZD4KLSAgICA8bmFtZT5BcGFjaGUgQXhpczIgLSBKQVhCLVJJIERhdGEgQmluZGluZzwvbmFtZT4KLSAgICA8ZGVzY3JpcHRpb24+SkFYQi1SSSBkYXRhIGJpbmRpbmcgc3VwcG9ydCBmb3IgQXhpcyAyLjA8L2Rlc2NyaXB0aW9uPgotICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLWNvZGVnZW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3ZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLWphdmEyd3NkbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7dmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5jb20uc3VuLnhtbC5iaW5kPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF4Yi1pbXBsPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLnN1bi54bWwuYmluZDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmpheGIteGpjPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXgueG1sLmJpbmQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXhiLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1sb2dnaW5nPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtbG9nZ2luZzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8L2RlcGVuZGVuY2llcz4KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxzb3VyY2VEaXJlY3Rvcnk+c3JjPC9zb3VyY2VEaXJlY3Rvcnk+Ci0gICAgICAgIDx0ZXN0U291cmNlRGlyZWN0b3J5PnRlc3Q8L3Rlc3RTb3VyY2VEaXJlY3Rvcnk+Ci0gICAgICAgIDxyZXNvdXJjZXM+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5jb25mPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi8qLnByb3BlcnRpZXM8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9leGNsdWRlcz4KLSAgICAgICAgICAgICAgICA8ZmlsdGVyaW5nPmZhbHNlPC9maWx0ZXJpbmc+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi8qLmphdmE8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9leGNsdWRlcz4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT4uLi8uLjwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+Tk9USUNFLnR4dDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+TElDRU5TRS50eHQ8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgICAgICA8ZmlsdGVyaW5nPmZhbHNlPC9maWx0ZXJpbmc+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICA8L3Jlc291cmNlcz4KLSAgICAgICAgPHRlc3RSZXNvdXJjZXM+Ci0gICAgICAgICAgICA8dGVzdFJlc291cmNlPgotICAgICAgICAgICAgICAgIDx0YXJnZXRQYXRoPi4uL3Rlc3QtcmVzb3VyY2VzPC90YXJnZXRQYXRoPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+dGVzdC1yZXNvdXJjZXM8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLyoqPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICA8L3Rlc3RSZXNvdXJjZT4KLSAgICAgICAgPC90ZXN0UmVzb3VyY2VzPgotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8c291cmNlPjEuNTwvc291cmNlPgotICAgICAgICAgICAgICAgICAgICA8dGFyZ2V0PjEuNTwvdGFyZ2V0PgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYW50cnVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5nZW4tdHM8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPmdlbmVyYXRlLXRlc3Qtc291cmNlczwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFza3M+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJheGlzMi5ob21lIiB2YWx1ZT0iJHtiYXNlZGlyfS90YXJnZXQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im1hdmVuLmNsYXNzLnBhdGgiIHJlZmlkPSJtYXZlbi5ydW50aW1lLmNsYXNzcGF0aCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFRoZXJlcyBnb3QgdG8gYmUgYSBiZXR0ZXIgd2F5IHRvIGRvIHRoaXMgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzY2hlbWEuc291cmNlLmRpciIgdmFsdWU9InRlc3QtcmVzb3VyY2VzL3hzZCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0id3NkbC5zb3VyY2UuZGlyIiB2YWx1ZT0idGVzdC1yZXNvdXJjZXMvd3NkbCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ic2NoZW1hLm91dHB1dC5iYXNlLmRpciIgdmFsdWU9InRhcmdldC9zY2hlbWEiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InNjaGVtYS5nZW5lcmF0ZWQuc3JjLmRpciIgdmFsdWU9IiR7c2NoZW1hLm91dHB1dC5iYXNlLmRpcn0vc3JjIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzY2hlbWEuZ2VuZXJhdGVkLmNsYXNzZXMuZGlyIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9IiR7c2NoZW1hLm91dHB1dC5iYXNlLmRpcn0vY2xhc3NlcyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIG1ha2UgdGhlIGRpcnMgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxta2RpciBkaXI9IiR7c2NoZW1hLm91dHB1dC5iYXNlLmRpcn0iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1rZGlyIGRpcj0iJHtzY2hlbWEuZ2VuZXJhdGVkLnNyYy5kaXJ9Ii8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxta2RpciBkaXI9IiR7c2NoZW1hLmdlbmVyYXRlZC5jbGFzc2VzLmRpcn0iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBSdW4gSkFYQiBzY2hlbWEgY29tcGlsZXIgd2l0aCBkZXNpZ25hdGVkIHNjaGVtYXMgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlY2hvPkdlbmVyYXRpbmcgSkFYLUIgY2xhc3NlcyBmb3IgRG9jTGl0QmFyZVNlcnZpY2UgdGVzdDwvZWNobz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGphdmEgY2xhc3NuYW1lPSJjb20uc3VuLnRvb2xzLnhqYy5Ecml2ZXIiIGZvcms9InRydWUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzcGF0aCByZWZpZD0ibWF2ZW4ucnVudGltZS5jbGFzc3BhdGgiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc3BhdGggbG9jYXRpb249IiR7Y29tcGlsZWQuY2xhc3Nlcy5kaXJ9Ii8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJnIGxpbmU9Ii1kICR7c2NoZW1hLmdlbmVyYXRlZC5zcmMuZGlyfSAtcXVpZXQgLXdzZGwgJHt3c2RsLnNvdXJjZS5kaXJ9L0RvY0xpdEJhcmVTZXJ2aWNlLndzZGwiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9qYXZhPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWNobz5HZW5lcmF0aW5nIFNlcnZpY2UgLyBTZXJ2aWNlIENsaWVudCBmb3IgVGVzdDAxIHRlc3Q8L2VjaG8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxqYXZhIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5heGlzMi53c2RsLldTREwySmF2YSIgZm9yaz0idHJ1ZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJtYXZlbi5ydW50aW1lLmNsYXNzcGF0aCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzcGF0aCBsb2NhdGlvbj0iJHtjb21waWxlZC5jbGFzc2VzLmRpcn0iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcmcgbGluZT0iLWQgamF4YnJpIC1zcyAtc2QgLXQgLW8gdGFyZ2V0L3dzZGwvVGVzdDAxIC11IC11cmkgJHt3c2RsLnNvdXJjZS5kaXJ9L1Rlc3QwMS53c2RsIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvamF2YT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFudCBkaXI9InRhcmdldC93c2RsL1Rlc3QwMSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFza3M+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+cnVuPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmJ1aWxkLWhlbHBlci1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+YWRkLXRlc3Qtc291cmNlPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wcm9jZXNzLXRlc3QtcmVzb3VyY2VzPC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5hZGQtdGVzdC1zb3VyY2U8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNvdXJjZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzb3VyY2U+JHtiYXNlZGlyfS90YXJnZXQvc2NoZW1hL3NyYzwvc291cmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc291cmNlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHNraXA+ZmFsc2U8L3NraXA+Ci0gICAgICAgICAgICAgICAgICAgIDxmb3JrTW9kZT5vbmNlPC9mb3JrTW9kZT4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKlRlc3QuamF2YTwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotCi0gICAgPC9idWlsZD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheGJyaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXhicmkvQ29kZUdlbmVyYXRpb25VdGlsaXR5LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXhicmkvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4YnJpL0NvZGVHZW5lcmF0aW9uVXRpbGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzJjMzdhLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheGJyaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXhicmkvQ29kZUdlbmVyYXRpb25VdGlsaXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheGJyaTsKLQotaW1wb3J0IGNvbS5zdW4uY29kZW1vZGVsLkpDb2RlTW9kZWw7Ci1pbXBvcnQgY29tLnN1bi5jb2RlbW9kZWwud3JpdGVyLkZpbGVDb2RlV3JpdGVyOwotaW1wb3J0IGNvbS5zdW4udG9vbHMueGpjLmFwaS5FcnJvckxpc3RlbmVyOwotaW1wb3J0IGNvbS5zdW4udG9vbHMueGpjLmFwaS5NYXBwaW5nOwotaW1wb3J0IGNvbS5zdW4udG9vbHMueGpjLmFwaS5Qcm9wZXJ0eTsKLWltcG9ydCBjb20uc3VuLnRvb2xzLnhqYy5hcGkuUzJKSkFYQk1vZGVsOwotaW1wb3J0IGNvbS5zdW4udG9vbHMueGpjLmFwaS5TY2hlbWFDb21waWxlcjsKLWltcG9ydCBjb20uc3VuLnRvb2xzLnhqYy5hcGkuWEpDOwotaW1wb3J0IGNvbS5zdW4udG9vbHMueGpjLkJhZENvbW1hbmRMaW5lRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc01lc3NhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLlNjaGVtYVV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLlVSTFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuWE1MVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLldTRExVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLkNvZGVHZW5Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5kYXRhYmluZGluZy5EZWZhdWx0VHlwZU1hcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuZGF0YWJpbmRpbmcuSmF2YVR5cGVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLmRhdGFiaW5kaW5nLlR5cGVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLnV0aWwuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlJlc3VsdDsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7Ci1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEubmV0LlVSTENsYXNzTG9hZGVyOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotcHVibGljIGNsYXNzIENvZGVHZW5lcmF0aW9uVXRpbGl0eSB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKENvZGVHZW5lcmF0aW9uVXRpbGl0eS5jbGFzcyk7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCSU5ESU5HX0ZJTEVfTkFNRSA9ICJiaW5kaW5nRmlsZU5hbWUiOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGFkZGl0aW9uYWxTY2hlbWFzCi0gICAgICogQHRocm93cyBSdW50aW1lRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBUeXBlTWFwcGVyIHByb2Nlc3NTY2hlbWFzKGZpbmFsIExpc3Qgc2NoZW1hcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWxlbWVudFtdIGFkZGl0aW9uYWxTY2hlbWFzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlR2VuQ29uZmlndXJhdGlvbiBjZ2NvbmZpZykKLSAgICAgICAgICAgIHRocm93cyBSdW50aW1lRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLQotICAgICAgICAgICAgLy9jaGVjayBmb3IgdGhlIGltcG9ydGVkIHR5cGVzLiBBbnkgaW1wb3J0ZWQgdHlwZXMgYXJlIHN1cHBvc2VkIHRvIGJlIGhlcmUgYWxzbwotICAgICAgICAgICAgaWYgKHNjaGVtYXMgPT0gbnVsbCB8fCBzY2hlbWFzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIC8vdGhlcmUgYXJlIG5vIHR5cGVzIHRvIGJlIGNvZGUgZ2VuZXJhdGVkCi0gICAgICAgICAgICAgICAgLy9Ib3dldmVyIGlmIHRoZSB0eXBlIG1hcHBlciBpcyBsZWZ0IGVtcHR5IGl0IHdpbGwgYmUgYSBwcm9ibGVtIGZvciB0aGUgb3RoZXIKLSAgICAgICAgICAgICAgICAvL3Byb2Nlc3Nlcy4gSGVuY2UgdGhlIGRlZmF1bHQgdHlwZSBtYXBwZXIgaXMgc2V0IHRvIHRoZSBjb25maWd1cmF0aW9uCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEZWZhdWx0VHlwZU1hcHBlcigpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmaW5hbCBNYXAgc2NoZW1hVG9JbnB1dFNvdXJjZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICAgICAgICAgIC8vY3JlYXRlIHRoZSB0eXBlIG1hcHBlcgotICAgICAgICAgICAgSmF2YVR5cGVNYXBwZXIgbWFwcGVyID0gbmV3IEphdmFUeXBlTWFwcGVyKCk7Ci0KLSAgICAgICAgICAgIFN0cmluZyBiYXNlVVJJID0gY2djb25maWcuZ2V0QmFzZVVSSSgpOwotICAgICAgICAgICAgaWYgKCFiYXNlVVJJLmVuZHNXaXRoKCIvIikpewotICAgICAgICAgICAgICAgYmFzZVVSSSA9IGJhc2VVUkkgKyAiLyI7Ci0gICAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzY2hlbWFzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgWG1sU2NoZW1hIHNjaGVtYSA9IChYbWxTY2hlbWEpc2NoZW1hcy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgSW5wdXRTb3VyY2UgaW5wdXRTb3VyY2UgPQotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IElucHV0U291cmNlKG5ldyBTdHJpbmdSZWFkZXIoZ2V0U2NoZW1hQXNTdHJpbmcoc2NoZW1hKSkpOwotICAgICAgICAgICAgICAgIC8vaGVyZSB3ZSBoYXZlIHRvIHNldCBhIHByb3BlciBzeXN0ZW0gSUQuIG90aGVyd2lzZSB3aGVuIHByb2Nlc3NpbmcgdGhlCi0gICAgICAgICAgICAgICAgLy8gaW5jbHVkZWQgc2NoYWVtYXMgZm9yIHRoaXMgc2NoZW1hIHdlIGhhdmUgYSBwcm9ibGVtCi0gICAgICAgICAgICAgICAgLy8gaXQgY3JlYXRlcyB0aGUgc3lzdGVtIElEIHVzaW5nIHRoaXMgdGFyZ2V0IG5hbWVzcGFjZSB2YWx1ZQotCi0gICAgICAgICAgICAgICAgaW5wdXRTb3VyY2Uuc2V0U3lzdGVtSWQoYmFzZVVSSSArICJ4c2QiICsgaSArICIueHNkIik7Ci0gICAgICAgICAgICAgICAgaW5wdXRTb3VyY2Uuc2V0UHVibGljSWQoc2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgICAgICAgICBzY2hlbWFUb0lucHV0U291cmNlTWFwLnB1dChzY2hlbWEsaW5wdXRTb3VyY2UpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBGaWxlIG91dHB1dERpciA9IG5ldyBGaWxlKGNnY29uZmlnLmdldE91dHB1dExvY2F0aW9uKCksICJzcmMiKTsKLSAgICAgICAgICAgIG91dHB1dERpci5ta2RpcigpOwotCi0gICAgICAgICAgICBNYXAgbnNNYXAgPSBjZ2NvbmZpZy5nZXRVcmkyUGFja2FnZU5hbWVNYXAoKTsKLSAgICAgICAgICAgIEVudGl0eVJlc29sdmVyIHJlc29sdmVyID0gbmV3IEVudGl0eVJlc29sdmVyKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyBJbnB1dFNvdXJjZSByZXNvbHZlRW50aXR5KFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKSB0aHJvd3MgU0FYRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgIElucHV0U291cmNlIHJldHVybklucHV0U291cmNlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgWG1sU2NoZW1hIGtleSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHNjaGVtYVRvSW5wdXRTb3VyY2VNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTtpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9IChYbWxTY2hlbWEpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5zcCA9IGtleS5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuc3AgIT0gbnVsbCAmJiBuc3AuZXF1YWxzKHB1YmxpY0lkKSkgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hlbiByZXR1cm5pbmcgdGhlIGlucHV0IHN0cmVhbSB3ZSBoYXZlIHRvIGFsd2F5cyByZXR1cm4gYSBuZXcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnB1dCBzdHJlYW0uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2luYyBqYXhicmkgaW50ZXJuYWxseSBjb25zdW1lcyB0aGUgaW5wdXQgc3RyZWFtIGl0IGdpdmVzIGFuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhjZXB0aW9uLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybklucHV0U291cmNlID0gbmV3IElucHV0U291cmNlKG5ldyBTdHJpbmdSZWFkZXIoZ2V0U2NoZW1hQXNTdHJpbmcoa2V5KSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElucHV0U291cmNlIGV4aXN0aW5nSW5wdXRTb3VyY2UgPSAoSW5wdXRTb3VyY2UpIHNjaGVtYVRvSW5wdXRTb3VyY2VNYXAuZ2V0KGtleSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuSW5wdXRTb3VyY2Uuc2V0U3lzdGVtSWQoZXhpc3RpbmdJbnB1dFNvdXJjZS5nZXRTeXN0ZW1JZCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5JbnB1dFNvdXJjZS5zZXRQdWJsaWNJZChleGlzdGluZ0lucHV0U291cmNlLmdldFB1YmxpY0lkKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXR1cm5JbnB1dFNvdXJjZSA9PSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZW4gd2UgaGF2ZSB0byBmaW5kIHRoaXMgdXNpbmcgdGhlIGZpbGUgc3lzdGVtCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3lzdGVtSWQgIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuSW5wdXRTb3VyY2UgPSBuZXcgSW5wdXRTb3VyY2Uoc3lzdGVtSWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybklucHV0U291cmNlLnNldFN5c3RlbUlkKHN5c3RlbUlkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuSW5wdXRTb3VyY2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLQotCi0gICAgICAgICAgICBNYXAgcHJvcGVydGllcyA9IGNnY29uZmlnLmdldFByb3BlcnRpZXMoKTsKLSAgICAgICAgICAgIFN0cmluZyBiaW5kaW5nRmlsZU5hbWUgPSAoU3RyaW5nKSBwcm9wZXJ0aWVzLmdldChCSU5ESU5HX0ZJTEVfTkFNRSk7Ci0KLSAgICAgICAgICAgIFhtbFNjaGVtYSBrZXkgPSBudWxsOwotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBzY2hlbWFJdGVyID0gc2NoZW1hVG9JbnB1dFNvdXJjZU1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgICBzY2hlbWFJdGVyLmhhc05leHQoKTspIHsKLQotICAgICAgICAgICAgICAgIFNjaGVtYUNvbXBpbGVyIHNjID0gWEpDLmNyZWF0ZVNjaGVtYUNvbXBpbGVyKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGJpbmRpbmdGaWxlTmFtZSAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGJpbmRpbmdGaWxlTmFtZS5lbmRzV2l0aCgiLmphciIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzY2FuRXBpc29kZUZpbGUobmV3IEZpbGUoYmluZGluZ0ZpbGVOYW1lKSwgc2MpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXRTb3VyY2UgaW5wdXRTb3J1Y2UgPSBuZXcgSW5wdXRTb3VyY2UobmV3IEZpbGVJbnB1dFN0cmVhbShiaW5kaW5nRmlsZU5hbWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0U29ydWNlLnNldFN5c3RlbUlkKG5ldyBGaWxlKGJpbmRpbmdGaWxlTmFtZSkudG9VUkkoKS50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNjLmdldE9wdGlvbnMoKS5hZGRCaW5kRmlsZShpbnB1dFNvcnVjZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGtleSA9IChYbWxTY2hlbWEpIHNjaGVtYUl0ZXIubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgaWYgKG5zTWFwICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBuc01hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZXNwYWNlID0gKFN0cmluZykgZW50cnkuZ2V0S2V5KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGtnID0gKFN0cmluZyluc01hcC5nZXQobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyTmFtZXNwYWNlKHNjLCBuYW1lc3BhY2UsIHBrZyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBzYy5zZXRFbnRpdHlSZXNvbHZlcihyZXNvbHZlcik7Ci0KLSAgICAgICAgICAgICAgICBzYy5zZXRFcnJvckxpc3RlbmVyKG5ldyBFcnJvckxpc3RlbmVyKCl7Ci0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIHNheFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3Ioc2F4UGFyc2VFeGNlcHRpb24uZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhzYXhQYXJzZUV4Y2VwdGlvbi5nZXRNZXNzYWdlKCksIHNheFBhcnNlRXhjZXB0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGZhdGFsRXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gc2F4UGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcihzYXhQYXJzZUV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKHNheFBhcnNlRXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwgc2F4UGFyc2VFeGNlcHRpb24pOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgd2FybmluZyhTQVhQYXJzZUV4Y2VwdGlvbiBzYXhQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLndhcm4oc2F4UGFyc2VFeGNlcHRpb24uZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhzYXhQYXJzZUV4Y2VwdGlvbi5nZXRNZXNzYWdlKCksIHNheFBhcnNlRXhjZXB0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGluZm8oU0FYUGFyc2VFeGNlcHRpb24gc2F4UGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5pbmZvKHNheFBhcnNlRXhjZXB0aW9uLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoc2F4UGFyc2VFeGNlcHRpb24uZ2V0TWVzc2FnZSgpLCBzYXhQYXJzZUV4Y2VwdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KTsKLQotICAgICAgICAgICAgICAgIHNjLnBhcnNlU2NoZW1hKChJbnB1dFNvdXJjZSkgc2NoZW1hVG9JbnB1dFNvdXJjZU1hcC5nZXQoa2V5KSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBCaW5kIHRoZSBYTUwKLSAgICAgICAgICAgICAgICBTMkpKQVhCTW9kZWwgamF4Yk1vZGVsID0gc2MuYmluZCgpOwotCi0gICAgICAgICAgICAgICAgaWYoamF4Yk1vZGVsID09IG51bGwpewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVW5hYmxlIHRvIGdlbmVyYXRlIGNvZGUgdXNpbmcgamF4YnJpIik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gRW1pdCB0aGUgY29kZSBhcnRpZmFjdHMKLSAgICAgICAgICAgICAgICBKQ29kZU1vZGVsIGNvZGVNb2RlbCA9IGpheGJNb2RlbC5nZW5lcmF0ZUNvZGUobnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgRmlsZUNvZGVXcml0ZXIgd3JpdGVyID0gbmV3IEZpbGVDb2RlV3JpdGVyKG91dHB1dERpcik7Ci0gICAgICAgICAgICAgICAgY29kZU1vZGVsLmJ1aWxkKHdyaXRlcik7Ci0KLSAgICAgICAgICAgICAgICBDb2xsZWN0aW9uIG1hcHBpbmdzID0gamF4Yk1vZGVsLmdldE1hcHBpbmdzKCk7Ci0KLSAgICAgICAgICAgICAgICBJdGVyYXRvciBpdGVyID0gbWFwcGluZ3MuaXRlcmF0b3IoKTsKLQotICAgICAgICAgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICBNYXBwaW5nIG1hcHBpbmcgPSAoTWFwcGluZylpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgUU5hbWUgcW4gPSBtYXBwaW5nLmdldEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHR5cGVOYW1lID0gbWFwcGluZy5nZXRUeXBlKCkuZ2V0VHlwZUNsYXNzKCkuZnVsbE5hbWUoKTsKLQotICAgICAgICAgICAgICAgICAgICBtYXBwZXIuYWRkVHlwZU1hcHBpbmdOYW1lKHFuLCB0eXBlTmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy9wcm9jZXNzIHRoZSB1bndyYXBwZWQgcGFyYW1ldGVycwotICAgICAgICAgICAgICAgIGlmICghY2djb25maWcuaXNQYXJhbWV0ZXJzV3JhcHBlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vZmlndXJlIG91dCB0aGUgdW53cmFwcGVkIG9wZXJhdGlvbnMKLSAgICAgICAgICAgICAgICAgICAgTGlzdCBheGlzU2VydmljZXMgPSBjZ2NvbmZpZy5nZXRBeGlzU2VydmljZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBzZXJ2aWNlc0l0ZXIgPSBheGlzU2VydmljZXMuaXRlcmF0b3IoKTsgc2VydmljZXNJdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlID0gKEF4aXNTZXJ2aWNlKXNlcnZpY2VzSXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIG9wZXJhdGlvbnMgPSBheGlzU2VydmljZS5nZXRPcGVyYXRpb25zKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbnMuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF4aXNPcGVyYXRpb24gb3AgPSAoQXhpc09wZXJhdGlvbilvcGVyYXRpb25zLm5leHQoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChXU0RMVXRpbC5pc0lucHV0UHJlc2VudEZvck1FUChvcC5nZXRNZXNzYWdlRXhjaGFuZ2VQYXR0ZXJuKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF4aXNNZXNzYWdlIG1lc3NhZ2UgPSBvcC5nZXRNZXNzYWdlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9JTl9WQUxVRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmdldFBhcmFtZXRlcihDb25zdGFudHMuVU5XUkFQUEVEX0tFWSkgIT0gbnVsbCkgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nIG1hcHBpbmcgPSBqYXhiTW9kZWwuZ2V0KG1lc3NhZ2UuZ2V0RWxlbWVudFFOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdCBlbGVtZW50UHJvcGVydGllcyA9IG1hcHBpbmcuZ2V0V3JhcHBlclN0eWxlRHJpbGxkb3duKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IoaW50IGogPSAwOyBqIDwgZWxlbWVudFByb3BlcnRpZXMuc2l6ZSgpOyBqKyspewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5IGVsZW1lbnRQcm9wZXJ0eSA9IChQcm9wZXJ0eSkgZWxlbWVudFByb3BlcnRpZXMuZ2V0KGopOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUU5hbWUgcGFydFFOYW1lID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU0RMVXRpbC5nZXRQYXJ0UU5hbWUob3AuZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU0RMQ29uc3RhbnRzLklOUFVUX1BBUlRfUU5BTUVfU1VGRklYLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50UHJvcGVydHkuZWxlbWVudE5hbWUoKS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy90aGlzIHR5cGUgaXMgYmFzZWQgb24gYSBwcmltaXRpdmUgdHlwZS0gdXNlIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vcHJpbWl0aXZlIHR5cGUgbmFtZSBpbiB0aGlzIGNhc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZnVsbEphdmVOYW1lID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRQcm9wZXJ0eS50eXBlKCkuZnVsbE5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudFByb3BlcnR5LnR5cGUoKS5pc0FycmF5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVsbEphdmVOYW1lID0gZnVsbEphdmVOYW1lLmNvbmNhdCgiW10iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGVyLmFkZFR5cGVNYXBwaW5nTmFtZShwYXJ0UU5hbWUsIGZ1bGxKYXZlTmFtZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudFByb3BlcnR5LnR5cGUoKS5pc1ByaW1pdGl2ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBlci5hZGRUeXBlTWFwcGluZ1N0YXR1cyhwYXJ0UU5hbWUsIEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50UHJvcGVydHkudHlwZSgpLmlzQXJyYXkoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBwZXIuYWRkVHlwZU1hcHBpbmdTdGF0dXMocGFydFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLkFSUkFZX1RZUEUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChXU0RMVXRpbC5pc091dHB1dFByZXNlbnRGb3JNRVAob3AuZ2V0TWVzc2FnZUV4Y2hhbmdlUGF0dGVybigpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBeGlzTWVzc2FnZSBtZXNzYWdlID0gb3AuZ2V0TWVzc2FnZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU0RMQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfT1VUX1ZBTFVFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZ2V0UGFyYW1ldGVyKENvbnN0YW50cy5VTldSQVBQRURfS0VZKSAhPSBudWxsKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmcgbWFwcGluZyA9IGpheGJNb2RlbC5nZXQobWVzc2FnZS5nZXRFbGVtZW50UU5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0IGVsZW1lbnRQcm9wZXJ0aWVzID0gbWFwcGluZy5nZXRXcmFwcGVyU3R5bGVEcmlsbGRvd24oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcihpbnQgaiA9IDA7IGogPCBlbGVtZW50UHJvcGVydGllcy5zaXplKCk7IGorKyl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHkgZWxlbWVudFByb3BlcnR5ID0gKFByb3BlcnR5KSBlbGVtZW50UHJvcGVydGllcy5nZXQoaik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRTmFtZSBwYXJ0UU5hbWUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdTRExVdGlsLmdldFBhcnRRTmFtZShvcC5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdTRExDb25zdGFudHMuT1VUUFVUX1BBUlRfUU5BTUVfU1VGRklYLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50UHJvcGVydHkuZWxlbWVudE5hbWUoKS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy90aGlzIHR5cGUgaXMgYmFzZWQgb24gYSBwcmltaXRpdmUgdHlwZS0gdXNlIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vcHJpbWl0aXZlIHR5cGUgbmFtZSBpbiB0aGlzIGNhc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZnVsbEphdmVOYW1lID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRQcm9wZXJ0eS50eXBlKCkuZnVsbE5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudFByb3BlcnR5LnR5cGUoKS5pc0FycmF5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVsbEphdmVOYW1lID0gZnVsbEphdmVOYW1lLmNvbmNhdCgiW10iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGVyLmFkZFR5cGVNYXBwaW5nTmFtZShwYXJ0UU5hbWUsIGZ1bGxKYXZlTmFtZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudFByb3BlcnR5LnR5cGUoKS5pc1ByaW1pdGl2ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBlci5hZGRUeXBlTWFwcGluZ1N0YXR1cyhwYXJ0UU5hbWUsIEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50UHJvcGVydHkudHlwZSgpLmlzQXJyYXkoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBwZXIuYWRkVHlwZU1hcHBpbmdTdGF0dXMocGFydFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLkFSUkFZX1RZUEUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gUmV0dXJuIHRoZSB0eXBlIG1hcHBlcgotICAgICAgICAgICAgcmV0dXJuIG1hcHBlcjsKLQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHNjYW5FcGlzb2RlRmlsZShGaWxlIGphciwgU2NoZW1hQ29tcGlsZXIgc2MpCi0gICAgICAgICAgICB0aHJvd3MgQmFkQ29tbWFuZExpbmVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQotICAgICAgICBVUkxDbGFzc0xvYWRlciB1Y2wgPSBuZXcgVVJMQ2xhc3NMb2FkZXIobmV3IFVSTFtde2phci50b1VSTCgpfSk7Ci0gICAgICAgIEVudW1lcmF0aW9uPFVSTD4gcmVzb3VyY2VzID0gdWNsLmZpbmRSZXNvdXJjZXMoIk1FVEEtSU5GL3N1bi1qYXhiLmVwaXNvZGUiKTsKLSAgICAgICAgd2hpbGUgKHJlc291cmNlcy5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgVVJMIHVybCA9IHJlc291cmNlcy5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgc2MuZ2V0T3B0aW9ucygpLmFkZEJpbmRGaWxlKG5ldyBJbnB1dFNvdXJjZSh1cmwudG9FeHRlcm5hbEZvcm0oKSkpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcmVnaXN0ZXJOYW1lc3BhY2UoU2NoZW1hQ29tcGlsZXIgc2MsIFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBwa2dOYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgRG9jdW1lbnQgZG9jID0gWE1MVXRpbHMubmV3RG9jdW1lbnQoKTsKLSAgICAgICAgRWxlbWVudCByb290RWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50KCJzY2hlbWEiKTsKLSAgICAgICAgcm9vdEVsZW1lbnQuc2V0QXR0cmlidXRlKCJ4bWxucyIsICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpOwotICAgICAgICByb290RWxlbWVudC5zZXRBdHRyaWJ1dGUoInhtbG5zOmpheGIiLCAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF4YiIpOwotICAgICAgICByb290RWxlbWVudC5zZXRBdHRyaWJ1dGUoImpheGI6dmVyc2lvbiIsICIyLjAiKTsKLSAgICAgICAgcm9vdEVsZW1lbnQuc2V0QXR0cmlidXRlKCJ0YXJnZXROYW1lc3BhY2UiLCBuYW1lc3BhY2UpOwotICAgICAgICBFbGVtZW50IGFubm9FbGVtZW50ID0gZG9jLmNyZWF0ZUVsZW1lbnQoImFubm90YXRpb24iKTsKLSAgICAgICAgRWxlbWVudCBhcHBJbmZvID0gZG9jLmNyZWF0ZUVsZW1lbnQoImFwcGluZm8iKTsKLSAgICAgICAgRWxlbWVudCBzY2hlbWFCaW5kaW5ncyA9IGRvYy5jcmVhdGVFbGVtZW50KCJqYXhiOnNjaGVtYUJpbmRpbmdzIik7Ci0gICAgICAgIEVsZW1lbnQgcGtnRWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50KCJqYXhiOnBhY2thZ2UiKTsKLSAgICAgICAgcGtnRWxlbWVudC5zZXRBdHRyaWJ1dGUoIm5hbWUiLCBwa2dOYW1lKTsKLSAgICAgICAgYW5ub0VsZW1lbnQuYXBwZW5kQ2hpbGQoYXBwSW5mbyk7Ci0gICAgICAgIGFwcEluZm8uYXBwZW5kQ2hpbGQoc2NoZW1hQmluZGluZ3MpOwotICAgICAgICBzY2hlbWFCaW5kaW5ncy5hcHBlbmRDaGlsZChwa2dFbGVtZW50KTsKLSAgICAgICAgcm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQoYW5ub0VsZW1lbnQpOwotICAgICAgICBGaWxlIGZpbGUgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJjdXN0b21pemVkIiwiLnhzZCIpOwotICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIHN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgUmVzdWx0IHJlc3VsdCA9IG5ldyBTdHJlYW1SZXN1bHQoc3RyZWFtKTsKLSAgICAgICAgICAgIFRyYW5zZm9ybWVyIHhmb3JtZXIgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdUcmFuc2Zvcm1lcigpOwotICAgICAgICAgICAgeGZvcm1lci50cmFuc2Zvcm0obmV3IERPTVNvdXJjZShyb290RWxlbWVudCksIHJlc3VsdCk7Ci0gICAgICAgICAgICBzdHJlYW0uZmx1c2goKTsKLSAgICAgICAgICAgIHN0cmVhbS5jbG9zZSgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgICAgICBJbnB1dFNvdXJjZSBpbnMgPSBuZXcgSW5wdXRTb3VyY2UoZmlsZS50b1VSSSgpLnRvU3RyaW5nKCkpOwotICAgICAgICBzYy5wYXJzZVNjaGVtYShpbnMpOwotICAgICAgICBmaWxlLmRlbGV0ZSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBleHRyYWN0TmFtZXNwYWNlKFhtbFNjaGVtYSBzY2hlbWEpIHsKLSAgICAgICAgU3RyaW5nIHBrZzsKLSAgICAgICAgcGtnID0gc2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgICBpZiAocGtnID09IG51bGwpIHsKLSAgICAgICAgICAgIFhtbFNjaGVtYVtdIHNjaGVtYXMyID0gU2NoZW1hVXRpbC5nZXRBbGxTY2hlbWFzKHNjaGVtYSk7Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gMDsgc2NoZW1hczIgIT0gbnVsbCAmJiBqIDwgc2NoZW1hczIubGVuZ3RoOyBqKyspIHsKLSAgICAgICAgICAgICAgICBwa2cgPSBzY2hlbWFzMltqXS5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICAgICAgICAgICAgICBpZiAocGtnICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChwa2cgPT0gbnVsbCkgewotICAgICAgICAgICAgcGtnID0gVVJMUHJvY2Vzc29yLkRFRkFVTFRfUEFDS0FHRTsKLSAgICAgICAgfQotICAgICAgICBwa2cgPSBVUkxQcm9jZXNzb3IubWFrZVBhY2thZ2VOYW1lKHBrZyk7Ci0gICAgICAgIHJldHVybiBwa2c7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFNjaGVtYUFzU3RyaW5nKFhtbFNjaGVtYSBzY2hlbWEpIHsKLSAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgIHNjaGVtYS53cml0ZShiYW9zKTsKLSAgICAgICAgcmV0dXJuIGJhb3MudG9TdHJpbmcoKTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4YnJpL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheGJyaS9Eb2NMaXRCYXJlSmF4YlNjaGVtYUdlbmVyYXRvci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4YnJpL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheGJyaS9Eb2NMaXRCYXJlSmF4YlNjaGVtYUdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmQwZjVlLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheGJyaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXhicmkvRG9jTGl0QmFyZUpheGJTY2hlbWFHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXhicmk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLmphdmEyd3NkbC5Eb2NMaXRCYXJlU2NoZW1hR2VuZXJhdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLXB1YmxpYyBjbGFzcyBEb2NMaXRCYXJlSmF4YlNjaGVtYUdlbmVyYXRvciBleHRlbmRzIERvY0xpdEJhcmVTY2hlbWFHZW5lcmF0b3IgewotCi0gICAgcHJpdmF0ZSBKYXhiU2NoZW1hR2VuZXJhdG9yIGpheGJTY2hlbWFHZW5lcmF0b3I7Ci0KLSAgICBwdWJsaWMgRG9jTGl0QmFyZUpheGJTY2hlbWFHZW5lcmF0b3IoQ2xhc3NMb2FkZXIgbG9hZGVyLCBTdHJpbmcgY2xhc3NOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzY2hlbWF0YXJnZXROYW1lc3BhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNjaGVtYXRhcmdldE5hbWVzcGFjZVByZWZpeCkKLSAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlcihsb2FkZXIsIGNsYXNzTmFtZSwgc2NoZW1hdGFyZ2V0TmFtZXNwYWNlLCBzY2hlbWF0YXJnZXROYW1lc3BhY2VQcmVmaXgsbnVsbCk7Ci0gICAgICAgIGpheGJTY2hlbWFHZW5lcmF0b3IgPSBuZXcgSmF4YlNjaGVtYUdlbmVyYXRvcihsb2FkZXIsY2xhc3NOYW1lLHNjaGVtYXRhcmdldE5hbWVzcGFjZSxzY2hlbWF0YXJnZXROYW1lc3BhY2VQcmVmaXgpOwotICAgIH0KLQotCi0gICAgcHVibGljIENvbGxlY3Rpb24gZ2VuZXJhdGVTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICBqYXhiU2NoZW1hR2VuZXJhdG9yLmdlbmVyYXRlU2NoZW1hRm9yUGFyYW1ldGVycygpOwotICAgICAgICByZXR1cm4gc3VwZXIuZ2VuZXJhdGVTY2hlbWEoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXhicmkvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4YnJpL0pheGJTY2hlbWFHZW5lcmF0b3IuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheGJyaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXhicmkvSmF4YlNjaGVtYUdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmI2ZDNmLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheGJyaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXhicmkvSmF4YlNjaGVtYUdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXhicmk7Ci0KLWltcG9ydCBjb20uc3VuLnhtbC5iaW5kLnYyLnJ1bnRpbWUuSkFYQkNvbnRleHRJbXBsOwotaW1wb3J0IGNvbS5zdW4ueG1sLmJpbmQudjIucnVudGltZS5KYXhCZWFuSW5mbzsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLmphdmEyd3NkbC5EZWZhdWx0U2NoZW1hR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5Mb2FkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWE7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkNvbnRleHQ7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuYmluZC5TY2hlbWFPdXRwdXRSZXNvbHZlcjsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uUmVzdWx0OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVJlc3VsdDsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLXB1YmxpYyBjbGFzcyBKYXhiU2NoZW1hR2VuZXJhdG9yIGV4dGVuZHMgRGVmYXVsdFNjaGVtYUdlbmVyYXRvciB7Ci0gICAgcHVibGljIEpheGJTY2hlbWFHZW5lcmF0b3IoQ2xhc3NMb2FkZXIgbG9hZGVyLCBTdHJpbmcgY2xhc3NOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzY2hlbWF0YXJnZXROYW1lc3BhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNjaGVtYXRhcmdldE5hbWVzcGFjZVByZWZpeCkKLSAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlcihsb2FkZXIsIGNsYXNzTmFtZSwgc2NoZW1hdGFyZ2V0TmFtZXNwYWNlLCBzY2hlbWF0YXJnZXROYW1lc3BhY2VQcmVmaXgsbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIENvbGxlY3Rpb24gZ2VuZXJhdGVTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZ2VuZXJhdGVTY2hlbWFGb3JQYXJhbWV0ZXJzKCk7Ci0gICAgICAgIHJldHVybiBzdXBlci5nZW5lcmF0ZVNjaGVtYSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGNvbGxlY3RzIGFsbCB0aGUgbWV0aG9kIHBhcmFtZXRlcnMgYW5kIHRoZSBleHRyYSBjbGFzc2VzIGZyb20gdGhlIGNvbW1hbmQgbGluZQotICAgICAqIGNyZWF0ZXMgYSBKQVhCQ29udGV4dCBhbmQgZ2VuZXJhdGVzIHNjaGVtYXMgZnJvbSB0aGUgSkFYQkNvbnRleHQKLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGdlbmVyYXRlU2NoZW1hRm9yUGFyYW1ldGVycygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTZXQ8Q2xhc3M8Pz4+IGNsYXNzZXMgPSBuZXcgSGFzaFNldDxDbGFzczw/Pj4oKTsKLSAgICAgICAgY2xhc3Nlcy5hZGRBbGwocHJvY2Vzc0pheEJlTWV0aG9kcyhzZXJ2aWNlQ2xhc3MuZ2V0TWV0aG9kcygpKSk7Ci0KLSAgICAgICAgaWYgKGV4dHJhQ2xhc3NlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKE9iamVjdCBleHRyYUNsYXNzIDogZXh0cmFDbGFzc2VzKSB7Ci0gICAgICAgICAgICAgICAgY2xhc3Nlcy5hZGQoTG9hZGVyLmxvYWRDbGFzcyhjbGFzc0xvYWRlciwgKFN0cmluZykgZXh0cmFDbGFzcykpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGpheGJOYW1lc3BhY2UgPSBudWxsOwotICAgICAgICBpZihpc1VzZVdTRExUeXBlc05hbWVzcGFjZSgpKXsKLSAgICAgICAgICAgIGpheGJOYW1lc3BhY2UgPSAoU3RyaW5nKSBwa2cybnNtYXAuZ2V0KCJhbGwiKTsKLSAgICAgICAgfQotICAgICAgICBpZihqYXhiTmFtZXNwYWNlID09IG51bGwpIHsKLSAgICAgICAgICAgIGpheGJOYW1lc3BhY2UgPSB0aGlzLmdldFNjaGVtYVRhcmdldE5hbWVTcGFjZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgSkFYQkNvbnRleHRJbXBsIGNvbnRleHQgPSAoSkFYQkNvbnRleHRJbXBsKSBjcmVhdGVKQVhCQ29udGV4dChjbGFzc2VzLCBqYXhiTmFtZXNwYWNlKTsKLQotICAgICAgICBmb3IgKERPTVJlc3VsdCByIDogZ2VuZXJhdGVKYXhiU2NoZW1hcyhjb250ZXh0KSkgewotICAgICAgICAgICAgRG9jdW1lbnQgZCA9IChEb2N1bWVudCkgci5nZXROb2RlKCk7Ci0gICAgICAgICAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0gZC5nZXREb2N1bWVudEVsZW1lbnQoKS5nZXRBdHRyaWJ1dGUoInRhcmdldE5hbWVzcGFjZSIpOwotICAgICAgICAgICAgaWYgKCIiLmVxdWFscyh0YXJnZXROYW1lc3BhY2UpKSB7Ci0gICAgICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlID0gdGhpcy5nZXRTY2hlbWFUYXJnZXROYW1lU3BhY2UoKTsKLSAgICAgICAgICAgICAgICBkLmdldERvY3VtZW50RWxlbWVudCgpLnNldEF0dHJpYnV0ZSgidGFyZ2V0TmFtZXNwYWNlIiwgdGFyZ2V0TmFtZXNwYWNlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgTm9kZUxpc3Qgbm9kZXMgPSBkLmdldERvY3VtZW50RWxlbWVudCgpLmdldENoaWxkTm9kZXMoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbm9kZXMuZ2V0TGVuZ3RoKCk7IGkrKykgewotICAgICAgICAgICAgICAgIE5vZGUgbiA9IG5vZGVzLml0ZW0oaSk7Ci0gICAgICAgICAgICAgICAgaWYgKG4gaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgZSA9IChFbGVtZW50KSBuOwotICAgICAgICAgICAgICAgICAgICBpZiAoZS5nZXRMb2NhbE5hbWUoKS5lcXVhbHMoImltcG9ydCIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkLmdldERvY3VtZW50RWxlbWVudCgpLnJlbW92ZUNoaWxkKGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBYbWxTY2hlbWEgeG1sU2NoZW1hID0geG1sU2NoZW1hQ29sbGVjdGlvbi5yZWFkKGQuZ2V0RG9jdW1lbnRFbGVtZW50KCkpOwotCi0gICAgICAgICAgICBmb3IgKENsYXNzIGNsYXp6IDogY2xhc3NlcykgewotICAgICAgICAgICAgICAgIEpheEJlYW5JbmZvPD8+IGJlYW5JbmZvID0gY29udGV4dC5nZXRCZWFuSW5mbyhjbGF6eik7Ci0gICAgICAgICAgICAgICAgUU5hbWUgcU5hbWUgPSBnZXRUeXBlTmFtZShiZWFuSW5mbyk7Ci0gICAgICAgICAgICAgICAgaWYocU5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0eXBlVGFibGUuYWRkQ29tcGxleFNjaGVtYShjbGF6ei5nZXROYW1lKCksIHFOYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzY2hlbWFNYXAucHV0KHRhcmdldE5hbWVzcGFjZSwgeG1sU2NoZW1hKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgUU5hbWUgZ2V0VHlwZU5hbWUoSmF4QmVhbkluZm88Pz4gYmVhbkluZm8pIHsKLSAgICAgICAgSXRlcmF0b3I8UU5hbWU+IGl0ciA9IGJlYW5JbmZvLmdldFR5cGVOYW1lcygpLml0ZXJhdG9yKCk7Ci0gICAgICAgIGlmICghaXRyLmhhc05leHQoKSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gaXRyLm5leHQoKTsKLSAgICB9Ci0KLQotICAgIHByb3RlY3RlZCBMaXN0PENsYXNzPD8+PiBwcm9jZXNzSmF4QmVNZXRob2RzKE1ldGhvZFtdIGRlY2xhcmVkTWV0aG9kcykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIExpc3Q8Q2xhc3M8Pz4+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PENsYXNzPD8+PigpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVjbGFyZWRNZXRob2RzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBNZXRob2Qgak1ldGhvZCA9IGRlY2xhcmVkTWV0aG9kc1tpXTsKLQotICAgICAgICAgICAgaWYgKGpNZXRob2QuZ2V0RXhjZXB0aW9uVHlwZXMoKS5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICAgICAgQ2xhc3NbXSBleHR5cGVzID0gak1ldGhvZC5nZXRFeGNlcHRpb25UeXBlcygpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgZXh0eXBlcy5sZW5ndGg7IGorKykgewotICAgICAgICAgICAgICAgICAgICBDbGFzcyBleHR5cGUgPSBleHR5cGVzW2pdOwotICAgICAgICAgICAgICAgICAgICBpZighZXh0eXBlLmdldE5hbWUoKS5zdGFydHNXaXRoKCJqYXZhIil8fGV4dHlwZS5nZXROYW1lKCkuc3RhcnRzV2l0aCgiamF2YXguIikpewotICAgICAgICAgICAgICAgICAgICAgICAgbGlzdC5hZGQoZXh0eXBlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZVNjaGVtYUZvclR5cGUobGlzdCwgZXh0eXBlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBDbGFzc1tdIHBhcmFzID0gak1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpOwotICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBwYXJhcy5sZW5ndGg7IGorKykgewotICAgICAgICAgICAgICAgIENsYXNzIHBhcmFUeXBlID0gcGFyYXNbal07Ci0gICAgICAgICAgICAgICAgZ2VuZXJhdGVTY2hlbWFGb3JUeXBlKGxpc3QsIHBhcmFUeXBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIGZvciBpdHMgcmV0dXJuIHR5cGUKLSAgICAgICAgICAgIENsYXNzIHJldHVyblR5cGUgPSBqTWV0aG9kLmdldFJldHVyblR5cGUoKTsKLQotICAgICAgICAgICAgaWYgKCEocmV0dXJuVHlwZSA9PSB2b2lkLmNsYXNzKSkgewotICAgICAgICAgICAgICAgIGdlbmVyYXRlU2NoZW1hRm9yVHlwZShsaXN0LCByZXR1cm5UeXBlKTsKLQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBsaXN0OwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBnZW5lcmF0ZVNjaGVtYUZvclR5cGUoTGlzdDxDbGFzczw/Pj4gbGlzdCwgQ2xhc3MgdHlwZSkKLSAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIGJvb2xlYW4gaXNBcnJheVR5cGUgPSBmYWxzZTsKLSAgICAgICAgaWYgKHR5cGUgIT0gbnVsbCkgewotICAgICAgICAgICAgaXNBcnJheVR5cGUgPSB0eXBlLmlzQXJyYXkoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaXNBcnJheVR5cGUpIHsKLSAgICAgICAgICAgIHR5cGUgPSB0eXBlLmdldENvbXBvbmVudFR5cGUoKTsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgY2xhc3NUeXBlTmFtZTsKLSAgICAgICAgaWYgKHR5cGUgPT0gbnVsbCkgewotICAgICAgICAgICAgY2xhc3NUeXBlTmFtZSA9ICJqYXZhLmxhbmcuT2JqZWN0IjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNsYXNzVHlwZU5hbWUgPSB0eXBlLmdldE5hbWUoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaXNBcnJheVR5cGUgJiYgImJ5dGUiLmVxdWFscyhjbGFzc1R5cGVOYW1lKSkgewotICAgICAgICAgICAgY2xhc3NUeXBlTmFtZSA9ICJiYXNlNjRCaW5hcnkiOwotICAgICAgICAgICAgaXNBcnJheVR5cGUgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoImphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXIiLmVxdWFscyhjbGFzc1R5cGVOYW1lKSkgewotICAgICAgICAgICAgY2xhc3NUeXBlTmFtZSA9ICJiYXNlNjRCaW5hcnkiOwotICAgICAgICB9Ci0gICAgICAgIFFOYW1lIHNjaGVtYVR5cGVOYW1lID0gdHlwZVRhYmxlLmdldFNpbXBsZVNjaGVtYVR5cGVOYW1lKGNsYXNzVHlwZU5hbWUpOwotICAgICAgICBpZiAoc2NoZW1hVHlwZU5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgbGlzdC5hZGQodHlwZSk7Ci0gICAgICAgIH0KLSAgICAgICAgYWRkSW1wb3J0KGdldFhtbFNjaGVtYShzY2hlbWFUYXJnZXROYW1lU3BhY2UpLCBzY2hlbWFUeXBlTmFtZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIExpc3Q8RE9NUmVzdWx0PiBnZW5lcmF0ZUpheGJTY2hlbWFzKEpBWEJDb250ZXh0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIExpc3Q8RE9NUmVzdWx0PiByZXN1bHRzID0gbmV3IEFycmF5TGlzdDxET01SZXN1bHQ+KCk7Ci0KLSAgICAgICAgY29udGV4dC5nZW5lcmF0ZVNjaGVtYShuZXcgU2NoZW1hT3V0cHV0UmVzb2x2ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBSZXN1bHQgY3JlYXRlT3V0cHV0KFN0cmluZyBucywgU3RyaW5nIGZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgRE9NUmVzdWx0IHJlc3VsdCA9IG5ldyBET01SZXN1bHQoKTsKLSAgICAgICAgICAgICAgICByZXN1bHQuc2V0U3lzdGVtSWQoZmlsZSk7Ci0gICAgICAgICAgICAgICAgcmVzdWx0cy5hZGQocmVzdWx0KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICByZXR1cm4gcmVzdWx0czsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIEpBWEJDb250ZXh0IGNyZWF0ZUpBWEJDb250ZXh0KFNldDxDbGFzczw/Pj4gY2xhc3NlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBkZWZhdWx0TnMpIHRocm93cyBKQVhCRXhjZXB0aW9uIHsKLSAgICAgICAgSXRlcmF0b3IgaXQgPSBjbGFzc2VzLml0ZXJhdG9yKCk7Ci0gICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSAiIjsKLSAgICAgICAgT2JqZWN0IHJlbW90ZUV4Y2VwdGlvbk9iamVjdDsKLSAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgcmVtb3RlRXhjZXB0aW9uT2JqZWN0ID0gaXQubmV4dCgpOwotICAgICAgICAgICAgY2xhc3NOYW1lID0gcmVtb3RlRXhjZXB0aW9uT2JqZWN0LnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICBpZiAoISgiIi5lcXVhbHMoY2xhc3NOYW1lKSkgJiYgY2xhc3NOYW1lLmNvbnRhaW5zKCJSZW1vdGVFeGNlcHRpb24iKSkgewotICAgICAgICAgICAgICAgIGl0LnJlbW92ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChDbGFzczw/PiBjbHMgOiBjbGFzc2VzKSB7Ci0gICAgICAgICAgICBpZiAoY2xzLmdldE5hbWUoKS5lbmRzV2l0aCgiT2JqZWN0RmFjdG9yeSIpKSB7Ci0gICAgICAgICAgICAgICAgLy9raW5kIG9mIGEgaGFjaywgYnV0IE9iamVjdEZhY3RvcmllcyBtYXkgYmUgY3JlYXRlZCB3aXRoIGVtcHR5IG5hbWVzcGFjZXMKLSAgICAgICAgICAgICAgICBkZWZhdWx0TnMgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLSAgICAgICAgaWYgKGRlZmF1bHROcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtYXAucHV0KCJjb20uc3VuLnhtbC5iaW5kLmRlZmF1bHROYW1lc3BhY2VSZW1hcCIsIGRlZmF1bHROcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKENsYXNzPD8+IGNscyA6IGNsYXNzZXMpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiPj4+PiA6IiArIGNscyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEpBWEJDb250ZXh0Lm5ld0luc3RhbmNlKGNsYXNzZXMudG9BcnJheShuZXcgQ2xhc3NbY2xhc3Nlcy5zaXplKCldKSwgbWFwKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheGJyaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXhicmkvdGVtcGxhdGUvSmF4YlJJRGF0YWJpbmRpbmdUZW1wbGF0ZS54c2wgYi92MS41LjFSQzMvbW9kdWxlcy9qYXhicmkvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4YnJpL3RlbXBsYXRlL0pheGJSSURhdGFiaW5kaW5nVGVtcGxhdGUueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTZiOTVjLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheGJyaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXhicmkvdGVtcGxhdGUvSmF4YlJJRGF0YWJpbmRpbmdUZW1wbGF0ZS54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwzMjMgKzAsMCBAQAotPCEtLQotICB+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+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXhicmkvdGVzdC1yZXNvdXJjZXMvd3NkbC9Eb2NMaXRCYXJlU2VydmljZS53c2RsIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4YnJpL3Rlc3QtcmVzb3VyY2VzL3dzZGwvRG9jTGl0QmFyZVNlcnZpY2Uud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2UzMTc2Ny4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXhicmkvdGVzdC1yZXNvdXJjZXMvd3NkbC9Eb2NMaXRCYXJlU2VydmljZS53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsMTUxNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/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+Ci0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheGJyaS90ZXN0LXJlc291cmNlcy93c2RsL1Rlc3QwMS53c2RsIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4YnJpL3Rlc3QtcmVzb3VyY2VzL3dzZGwvVGVzdDAxLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjZjEyMjQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4YnJpL3Rlc3QtcmVzb3VyY2VzL3dzZGwvVGVzdDAxLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08ZGVmaW5pdGlvbnMgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiB4bWxuczp0bnM9Imh0dHA6Ly93c25zLmZvby5jb20vYXhpczIvdGVzdDAxIiB4bWxuczp0eXA9Imh0dHA6Ly94bWxucy5mb28uY29tL2F4aXMyL3Rlc3QwMSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyBodHRwOi8vd3d3LmZvby5jb20vd3NkbC54c2QiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3dzbnMuZm9vLmNvbS9heGlzMi90ZXN0MDEiIG5hbWU9IlRlc3QwMSI+Ci0gICAgPHR5cGVzPgotICAgICAgICA8eHM6c2NoZW1hIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8veG1sbnMuZm9vLmNvbS9heGlzMi90ZXN0MDEiIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIj4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9IkFkZCI+Ci0gICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJBcmcxIiB0eXBlPSJ4czppbnQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9IkFyZzIiIHR5cGU9InhzOmludCIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJBZGRSZXR1cm4iIHR5cGU9InhzOmludCIvPgotICAgICAgICA8L3hzOnNjaGVtYT4KLSAgICA8L3R5cGVzPgotICAgIDxtZXNzYWdlIG5hbWU9IkFkZCI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9InBhcmFtcyIgZWxlbWVudD0idHlwOkFkZCIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJBZGRSZXNwb25zZSI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9InJlc3VsdCIgZWxlbWVudD0idHlwOkFkZFJldHVybiIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8cG9ydFR5cGUgbmFtZT0iVGVzdDAxUG9ydFR5cGUiPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9IkFkZCI+Ci0gICAgICAgICAgICA8aW5wdXQgbmFtZT0iQWRkIiBtZXNzYWdlPSJ0bnM6QWRkIi8+Ci0gICAgICAgICAgICA8b3V0cHV0IG5hbWU9IkFkZFJlc3BvbnNlIiBtZXNzYWdlPSJ0bnM6QWRkUmVzcG9uc2UiLz4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgPC9wb3J0VHlwZT4KLSAgICA8YmluZGluZyBuYW1lPSJUZXN0MDFQb3J0QmluZGluZyIgdHlwZT0idG5zOlRlc3QwMVBvcnRUeXBlIj4KLSAgICAgICAgPHNvYXA6YmluZGluZyBzdHlsZT0iZG9jdW1lbnQiIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIi8+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iQWRkIj4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJBZGQiIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPGlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9Imh0dHA6Ly93c25zLmZvby5jb20vYXhpczIvdGVzdDAxIi8+Ci0gICAgICAgICAgICA8L2lucHV0PgotICAgICAgICAgICAgPG91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgbmFtZXNwYWNlPSJodHRwOi8vd3Nucy5mb28uY29tL2F4aXMyL3Rlc3QwMSIvPgotICAgICAgICAgICAgPC9vdXRwdXQ+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotICAgIDwvYmluZGluZz4KLSAgICA8c2VydmljZSBuYW1lPSJUZXN0MDEiPgotICAgICAgICA8cG9ydCBuYW1lPSJBeGlzMlNhbXBsZURvY0xpdFBvcnQiIGJpbmRpbmc9InRuczpUZXN0MDFQb3J0QmluZGluZyI+Ci0gICAgICAgICAgICA8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vcmVxdWllbS5mb28uY29tOjgwODAvYXhpczIvc2VydmljZXMvVGVzdDAxIi8+Ci0gICAgICAgIDwvcG9ydD4KLSAgICA8L3NlcnZpY2U+Ci08L2RlZmluaXRpb25zPgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4YnJpL3Rlc3Qvb3JnL3RlbXAvZG9jbGl0YmFyZS9Eb2NMaXRCYXJlU2VydmljZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4YnJpL3Rlc3Qvb3JnL3RlbXAvZG9jbGl0YmFyZS9Eb2NMaXRCYXJlU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzEyOGJlLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheGJyaS90ZXN0L29yZy90ZW1wL2RvY2xpdGJhcmUvRG9jTGl0QmFyZVNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy50ZW1wLmRvY2xpdGJhcmU7Ci0KLWltcG9ydCBvcmcudGVtcC5kb2NsaXRiYXJlLmpheGIueHNkLkNoYW5nZVR5cGU7Ci1pbXBvcnQgb3JnLnRlbXAuZG9jbGl0YmFyZS5qYXhiLnhzZC5HZXRTdG9ja1F1b3RlOwotaW1wb3J0IG9yZy50ZW1wLmRvY2xpdGJhcmUuamF4Yi54c2QuTGFzdFRyYWRlVHlwZTsKLWltcG9ydCBvcmcudGVtcC5kb2NsaXRiYXJlLmpheGIueHNkLk9iamVjdEZhY3RvcnkyOwotaW1wb3J0IG9yZy50ZW1wLmRvY2xpdGJhcmUucG9qby5hcnJheXMueHNkLkNhckFycmF5OwotaW1wb3J0IG9yZy50ZW1wLmRvY2xpdGJhcmUucG9qby5hcnJheXMueHNkLkZsb2F0QXJyYXk7Ci1pbXBvcnQgb3JnLnRlbXAuZG9jbGl0YmFyZS5wb2pvLmFycmF5cy54c2QuT2JqZWN0QXJyYXk7Ci1pbXBvcnQgb3JnLnRlbXAuZG9jbGl0YmFyZS5wb2pvLmFycmF5cy54c2QuU3RyaW5nQXJyYXk7Ci1pbXBvcnQgb3JnLnRlbXAuZG9jbGl0YmFyZS5wb2pvLnhzZC5DYXI7Ci1pbXBvcnQgb3JnLnRlbXAuZG9jbGl0YmFyZS5wb2pvLnhzZC5EaWFibG87Ci1pbXBvcnQgb3JnLnRlbXAuZG9jbGl0YmFyZS5wb2pvLnhzZC5GaWdodGVyOwotaW1wb3J0IG9yZy50ZW1wLmRvY2xpdGJhcmUueHNkLkNhbGVuZGFyU3RyaW5nQXJyYXk7Ci1pbXBvcnQgb3JnLnRlbXAuZG9jbGl0YmFyZS54c2QuSW50QXJyYXlPYmplY3RBcnJheVJlc3VsdDsKLQotaW1wb3J0IGphdmF4LnhtbC5kYXRhdHlwZS5YTUxHcmVnb3JpYW5DYWxlbmRhcjsKLWltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKLQotCi1wdWJsaWMgY2xhc3MgRG9jTGl0QmFyZVNlcnZpY2UgewotCi0gICAgcHVibGljIFN0cmluZyBzdHJpbmdDYXIoCi0gICAgICAgICAgICBDYXIgY2FyQXJnKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgaW50RmxvYXQoCi0gICAgICAgICAgICBmbG9hdCBmbG9hdEFyZ0IpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gYm9vbGVhbkJvb2xlYW4oCi0gICAgICAgICAgICBib29sZWFuIGJvb2xBcmcpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBHZXRTdG9ja1F1b3RlIGdldFN0b2NrUXVvdGVJbnQoCi0gICAgICAgICAgICBpbnQgaW50QXJnQykgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRmxvYXRBcnJheSBmbG9hdEFycmF5RmlnaHRlcigKLSAgICAgICAgICAgIEZpZ2h0ZXIgZmlnaHRlckFyZykgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2b2lkSW50KAotICAgICAgICAgICAgaW50IGludEFyZ0EpIHsKLQotICAgIH0KLQotICAgIHB1YmxpYyBieXRlW10gYnl0ZUFycmF5SW50QXJyYXkoCi0gICAgICAgICAgICBpbnRbXSBpbnRBcnJheUFyZykgewotICAgICAgICByZXR1cm4gbmV3IGJ5dGVbMF07Ci0gICAgfQotCi0gICAgcHVibGljIFhNTEdyZWdvcmlhbkNhbGVuZGFyIGNhbGVuZGFyU3RyaW5nQXJyYXkoCi0gICAgICAgICAgICBDYWxlbmRhclN0cmluZ0FycmF5IGNhbGVuZGFyU3RyaW5nQXJyYXkpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdEZhY3RvcnkyIG9iamVjdEZhY3RvcnlDYXIoCi0gICAgICAgICAgICBDYXIgY2FyQXJnQikgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nQXJyYXkgc3RyaW5nQXJyYXlJbnQoCi0gICAgICAgICAgICBpbnQgaW50QXJnQikgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYnl0ZSBieXRlQnl0ZSgKLSAgICAgICAgICAgIGJ5dGUgYnl0ZUFyZykgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHN0cmluZ1ZvaWQoKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgaW50U3RyaW5nKAotICAgICAgICAgICAgU3RyaW5nIHN0cmluZ0FyZ0EpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdEFycmF5IG9iamVjdEFycmF5Q2FyQXJyYXkoCi0gICAgICAgICAgICBDYXJBcnJheSBjYXJBcnJheUFyZykgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IG9iamVjdEZsb2F0KAotICAgICAgICAgICAgZmxvYXQgZmxvYXRBcmcpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdm9pZExhc3RUcmFkZVR5cGUoCi0gICAgICAgICAgICBMYXN0VHJhZGVUeXBlIGx0dEFyZykgewotCi0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBzdHJpbmdTdHJpbmcoCi0gICAgICAgICAgICBTdHJpbmcgc3RyaW5nQXJnQikgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSW50QXJyYXlPYmplY3RBcnJheVJlc3VsdCBpbnRBcnJheU9iamVjdEFycmF5KAotICAgICAgICAgICAgT2JqZWN0QXJyYXkgb2JqZWN0QXJyYXlBcmcpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBxTmFtZVFOYW1lKAotICAgICAgICAgICAgT2JqZWN0IHFOYW1lQXJnKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBCaWdEZWNpbWFsIGJpZ0RlY2ltYWxCaWdEZWNpbWFsKAotICAgICAgICAgICAgQmlnRGVjaW1hbCBiaWdEZWNpbWFsQXJnKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBYTUxHcmVnb3JpYW5DYWxlbmRhciBjYWxlbmRhckRpYWJsbygKLSAgICAgICAgICAgIERpYWJsbyBkYWJsb0FyZykgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmxvYXQgZmxvYXRGbG9hdCgKLSAgICAgICAgICAgIGZsb2F0IGZsb2F0QXJnQykgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nQXJyYXkgc3RyaW5nQXJyYXlTdHJpbmdBcnJheSgKLSAgICAgICAgICAgIFN0cmluZ0FycmF5IHN0cmluZ0FycmF5QXJnKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgaW50RGlhYmxvKAotICAgICAgICAgICAgRGlhYmxvIGRpYWJsb0FyZ0EpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgcHVibGljIHNob3J0IHNob3J0Q2hhbmdlVHlwZSgKLSAgICAgICAgICAgIENoYW5nZVR5cGUgY3RBcmcpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgcHVibGljIHNob3J0IHNob3J0U2hvcnQoCi0gICAgICAgICAgICBzaG9ydCBzaG9ydEFyZykgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXhicmkvdGVzdC9vcmcvdGVtcC9kb2NsaXRiYXJlL0RvY0xpdEJhcmVXU0RMVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4YnJpL3Rlc3Qvb3JnL3RlbXAvZG9jbGl0YmFyZS9Eb2NMaXRCYXJlV1NETFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTVlYTcwZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXhicmkvdGVzdC9vcmcvdGVtcC9kb2NsaXRiYXJlL0RvY0xpdEJhcmVXU0RMVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcudGVtcC5kb2NsaXRiYXJlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXhicmkuSmF4YlNjaGVtYUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmphdmEyd3NkbC5KYXZhMldTRExCdWlsZGVyOwotaW1wb3J0IG9yZy5jdXN0b21tb25rZXkueG1sdW5pdC5YTUxUZXN0Q2FzZTsKLWltcG9ydCBvcmcuY3VzdG9tbW9ua2V5LnhtbHVuaXQuWE1MVW5pdDsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotcHVibGljIGNsYXNzIERvY0xpdEJhcmVXU0RMVGVzdCBleHRlbmRzIFhNTFRlc3RDYXNlIHsKLSAgICBwcml2YXRlIFN0cmluZyB3c2RsTG9jYXRpb24gPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImJhc2VkaXIiLCAiLiIpICsgIi8iICsgInRlc3QtcmVzb3VyY2VzL3dzZGwvRG9jTGl0QmFyZVNlcnZpY2Uud3NkbCI7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VmVyc2lvbigpIHsKLSAgICAgICAgWE1MVW5pdC5zZXRJZ25vcmVXaGl0ZXNwYWNlKHRydWUpOwotICAgICAgICBGaWxlIHRlc3RSZXNvdXJjZUZpbGUgPSBuZXcgRmlsZSh3c2RsTG9jYXRpb24pOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICBKYXZhMldTRExCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgSmF2YTJXU0RMQnVpbGRlcihiYW9zLCBEb2NMaXRCYXJlU2VydmljZS5jbGFzcy5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkpOwotICAgICAgICAgICAgYnVpbGRlci5zZXRTY2hlbWFHZW5DbGFzc05hbWUoSmF4YlNjaGVtYUdlbmVyYXRvci5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICAgICAgYnVpbGRlci5nZW5lcmF0ZVdTREwoKTsKLSAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKG5ldyBTdHJpbmcoYmFvcy50b0J5dGVBcnJheSgpKSk7Ci0gICAgICAgICAgICAvL2Fzc2VydFhNTEVxdWFsKG5ldyBGaWxlUmVhZGVyKHRlc3RSZXNvdXJjZUZpbGUpLCBuZXcgU3RyaW5nUmVhZGVyKG5ldyBTdHJpbmcoYmFvcy50b0J5dGVBcnJheSgpKSkpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciBpbiBXU0RMIDogIiArIHRlc3RSZXNvdXJjZUZpbGUuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXhjZXB0aW9uOiAiICsgZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICBmYWlsKCJDYXVnaHQgZXhjZXB0aW9uICIgKyBlLnRvU3RyaW5nKCkpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgWE1MVW5pdC5zZXRJZ25vcmVXaGl0ZXNwYWNlKGZhbHNlKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vYnVpbGQueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjQ4OTZhLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL2J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pg0KLQ0KLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTxwcm9qZWN0IG5hbWU9Iml0ZXN0IiBkZWZhdWx0PSJidWlsZC1yZXBvIiBiYXNlZGlyPSIuIj4NCi0NCi0JPHRhcmdldCBuYW1lPSJidWlsZC1yZXBvIiB1bmxlc3M9InRlc3Quc2tpcCI+DQotDQotCQk8IS0tIFN0YW5kYXJkIHJlcG9zaXRvcnkgLS0+DQotCQk8bWtkaXIgZGlyPSJ0YXJnZXQvcmVwb3NpdG9yeSIvPg0KLQkJPG1rZGlyIGRpcj0idGFyZ2V0L3JlcG9zaXRvcnkvY29uZiIvPg0KLQkJPG1rZGlyIGRpcj0idGFyZ2V0L3JlcG9zaXRvcnkvc2VydmljZXMiLz4NCi0JCTxta2RpciBkaXI9InRhcmdldC9yZXBvc2l0b3J5L21vZHVsZXMiLz4NCi0JCTxjb3B5IGZpbGU9Ii4uL2FkZHJlc3NpbmcvdGFyZ2V0L2FkZHJlc3NpbmctJHthZGRyZXNzaW5nX3ZlcnNpb259Lm1hciINCi0gICAgCSAgICAgICAgICAgICAgICAgIHRvZmlsZT0idGFyZ2V0L3JlcG9zaXRvcnkvbW9kdWxlcy9hZGRyZXNzaW5nLSR7YWRkcmVzc2luZ192ZXJzaW9ufS5tYXIiLz4NCi0JCTxjb3B5IGZpbGU9Ii4uL2tlcm5lbC9jb25mL2F4aXMyLnhtbCINCi0gICAgCSAgICAgICAgICAgICAgICAgIHRvZmlsZT0idGFyZ2V0L3JlcG9zaXRvcnkvY29uZi9heGlzMi54bWwiLz4NCi0NCi0JPC90YXJnZXQ+DQotDQotPC9wcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3BvbS54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjJiMzNkLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjEuNS4xPC92ZXJzaW9uPgotICAgICAgICA8cmVsYXRpdmVQYXRoPi4uL3BhcmVudC9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+Ci0gICAgPC9wYXJlbnQ+Ci0gICAgPGFydGlmYWN0SWQ+YXhpczItamF4d3MtaW50ZWdyYXRpb248L2FydGlmYWN0SWQ+Ci0gICAgPG5hbWU+QXBhY2hlIEF4aXMyIC0gSkFYV1MgSW50ZWdyYXRpb24gVGVzdHM8L25hbWU+Ci0gICAgPGRlc2NyaXB0aW9uPkF4aXMyIEpBWFdTIEludGVncmF0aW9uIFRlc3RzPC9kZXNjcmlwdGlvbj4KLSAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZ2Vyb25pbW8uc3BlY3M8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5nZXJvbmltby1hbm5vdGF0aW9uXzEuMF9zcGVjPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLWtlcm5lbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7dmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YWRkcmVzc2luZzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7dmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8dHlwZT5tYXI8L3R5cGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItYWRiPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHt2ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1zYWFqPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHt2ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1tZXRhZGF0YTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7dmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLXRyYW5zcG9ydC1odHRwPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHt2ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItdHJhbnNwb3J0LWxvY2FsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHt2ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1qYXh3czwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7dmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD54bWwtcmVzb2x2ZXI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD54bWwtcmVzb2x2ZXI8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5qYXhlbjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmpheGVuPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLnN1bi54bWwuYmluZDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmpheGItaW1wbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDxleGNsdXNpb25zPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpzcjE3MzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXgueG1sPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgPC9leGNsdXNpb25zPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLnN1bi54bWwuYmluZDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmpheGIteGpjPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+eGFsYW48L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD54YWxhbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmphdmF4LnhtbC5iaW5kPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF4Yi1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8ZXhjbHVzaW9ucz4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qc3IxNzM8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPmphdmF4LnhtbDwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgIDwvZXhjbHVzaW9ucz4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgIDwvZGVwZW5kZW5jaWVzPgotICAgIDxidWlsZD4KLSAgICAgICAgPHNvdXJjZURpcmVjdG9yeT5zcmM8L3NvdXJjZURpcmVjdG9yeT4KLSAgICAgICAgPHRlc3RTb3VyY2VEaXJlY3Rvcnk+dGVzdDwvdGVzdFNvdXJjZURpcmVjdG9yeT4KLSAgICAgICAgPHJlc291cmNlcz4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PmNvbmY8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLyoucHJvcGVydGllczwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYzwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKi5wcm9wZXJ0aWVzPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qLnhtbDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnJlc291cmNlczwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKjwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgPC9yZXNvdXJjZXM+Ci0gICAgICAgIDx0ZXN0UmVzb3VyY2VzPgotICAgICAgICAgICAgPHRlc3RSZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnRlc3Q8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLyoueG1sPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qLndzZGw8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLyoucHJvcGVydGllczwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgPC90ZXN0UmVzb3VyY2U+Ci0gICAgICAgIDwvdGVzdFJlc291cmNlcz4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGNvbXBpbGVyQXJndW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAtWGJvb3RjbGFzc3BhdGgvcDoke2Jhc2VkaXJ9Ly4uL2pheHdzLWFwaS90YXJnZXQvY2xhc3NlcyR7cGF0aC5zZXBhcmF0b3J9JHtiYXNlZGlyfS8uLi9qd3MtYXBpL3RhcmdldC9jbGFzc2VzCi0gICAgICAgICAgICAgICAgICAgIDwvY29tcGlsZXJBcmd1bWVudD4KLSAgICAgICAgICAgICAgICAgICAgPGNvbXBpbGVyVmVyc2lvbj4xLjU8L2NvbXBpbGVyVmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPHNvdXJjZT4xLjU8L3NvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgPHRhcmdldD4xLjU8L3RhcmdldD4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFudHJ1bi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+Z2VuLXRzPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5nZW5lcmF0ZS10ZXN0LXNvdXJjZXM8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhc2tzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFRoZXJlcyBnb3QgdG8gYmUgYSBiZXR0ZXIgd2F5IHRvIGRvIHRoaXMgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzY2hlbWEuc291cmNlLmRpciIgdmFsdWU9InRlc3QtcmVzb3VyY2VzL3hzZCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0id3NkbC5zb3VyY2UuZGlyIiB2YWx1ZT0idGVzdC1yZXNvdXJjZXMvd3NkbCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ic2NoZW1hLm91dHB1dC5iYXNlLmRpciIgdmFsdWU9InRhcmdldC9zY2hlbWEiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InNjaGVtYS5nZW5lcmF0ZWQuc3JjLmRpciIgdmFsdWU9IiR7c2NoZW1hLm91dHB1dC5iYXNlLmRpcn0vc3JjIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzY2hlbWEuZ2VuZXJhdGVkLmNsYXNzZXMuZGlyIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9IiR7c2NoZW1hLm91dHB1dC5iYXNlLmRpcn0vY2xhc3NlcyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIG1ha2UgdGhlIGRpcnMgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxta2RpciBkaXI9IiR7c2NoZW1hLm91dHB1dC5iYXNlLmRpcn0iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1rZGlyIGRpcj0iJHtzY2hlbWEuZ2VuZXJhdGVkLnNyYy5kaXJ9Ii8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxta2RpciBkaXI9IiR7c2NoZW1hLmdlbmVyYXRlZC5jbGFzc2VzLmRpcn0iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBSdW4gSkFYQiBzY2hlbWEgY29tcGlsZXIgd2l0aCBkZXNpZ25hdGVkIHNjaGVtYXMgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlY2hvPkdlbmVyYXRpbmcgSkFYLUIgY2xhc3NlcyBmcm9tIFhTRHM8L2VjaG8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlY2hvPkdlbmVyYXRpbmcgamF2YSBmcm9tIHNvYXAgMTE8L2VjaG8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxqYXZhIGNsYXNzbmFtZT0iY29tLnN1bi50b29scy54amMuRHJpdmVyIiBmb3JrPSJ0cnVlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc3BhdGggcmVmaWQ9Im1hdmVuLnJ1bnRpbWUuY2xhc3NwYXRoIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoIGxvY2F0aW9uPSIke2NvbXBpbGVkLmNsYXNzZXMuZGlyfSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFyZyBsaW5lPSItZCAke3NjaGVtYS5nZW5lcmF0ZWQuc3JjLmRpcn0gLXF1aWV0ICAke3NjaGVtYS5zb3VyY2UuZGlyfS9zb2FwMTEueHNkIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvamF2YT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVjaG8+R2VuZXJhdGluZyBqYXZhIGZyb20gZWNoby54c2Q8L2VjaG8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxqYXZhIGNsYXNzbmFtZT0iY29tLnN1bi50b29scy54amMuRHJpdmVyIiBmb3JrPSJ0cnVlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc3BhdGggcmVmaWQ9Im1hdmVuLnJ1bnRpbWUuY2xhc3NwYXRoIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoIGxvY2F0aW9uPSIke2NvbXBpbGVkLmNsYXNzZXMuZGlyfSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFyZyBsaW5lPSItZCAke3NjaGVtYS5nZW5lcmF0ZWQuc3JjLmRpcn0gLXF1aWV0ICAke3NjaGVtYS5zb3VyY2UuZGlyfS9lY2hvLnhzZCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2phdmE+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlY2hvPkdlbmVyYXRpbmcgamF2YSBmcm9tIHN0b2NrMS54c2Q8L2VjaG8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxqYXZhIGNsYXNzbmFtZT0iY29tLnN1bi50b29scy54amMuRHJpdmVyIiBmb3JrPSJ0cnVlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc3BhdGggcmVmaWQ9Im1hdmVuLnJ1bnRpbWUuY2xhc3NwYXRoIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoIGxvY2F0aW9uPSIke2NvbXBpbGVkLmNsYXNzZXMuZGlyfSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFyZyBsaW5lPSItZCAke3NjaGVtYS5nZW5lcmF0ZWQuc3JjLmRpcn0gLXF1aWV0ICR7c2NoZW1hLnNvdXJjZS5kaXJ9L3N0b2NrMS54c2QiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9qYXZhPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWNobz5HZW5lcmF0aW5nIGphdmEgZnJvbSBzdG9jazIueHNkPC9lY2hvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8amF2YSBjbGFzc25hbWU9ImNvbS5zdW4udG9vbHMueGpjLkRyaXZlciIgZm9yaz0idHJ1ZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJtYXZlbi5ydW50aW1lLmNsYXNzcGF0aCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzcGF0aCBsb2NhdGlvbj0iJHtjb21waWxlZC5jbGFzc2VzLmRpcn0iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcmcgbGluZT0iLWQgJHtzY2hlbWEuZ2VuZXJhdGVkLnNyYy5kaXJ9IC1xdWlldCAke3NjaGVtYS5zb3VyY2UuZGlyfS9zdG9jazIueHNkIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvamF2YT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVjaG8+R2VuZXJhdGluZyBqYXZhIGZyb20gc2FtcGxlbXRvbS54c2Q8L2VjaG8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxqYXZhIGNsYXNzbmFtZT0iY29tLnN1bi50b29scy54amMuRHJpdmVyIiBmb3JrPSJ0cnVlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc3BhdGggcmVmaWQ9Im1hdmVuLnJ1bnRpbWUuY2xhc3NwYXRoIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoIGxvY2F0aW9uPSIke2NvbXBpbGVkLmNsYXNzZXMuZGlyfSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFyZyBsaW5lPSItZCAke3NjaGVtYS5nZW5lcmF0ZWQuc3JjLmRpcn0gLXF1aWV0ICR7c2NoZW1hLnNvdXJjZS5kaXJ9L3NhbXBsZW10b20ueHNkIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvamF2YT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVjaG8+R2VuZXJhdGluZyBqYXZhIGZyb20gZ3JlZXRlclR5cGVzLnhzZDwvZWNobz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGphdmEgY2xhc3NuYW1lPSJjb20uc3VuLnRvb2xzLnhqYy5Ecml2ZXIiIGZvcms9InRydWUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzcGF0aCByZWZpZD0ibWF2ZW4ucnVudGltZS5jbGFzc3BhdGgiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc3BhdGggbG9jYXRpb249IiR7Y29tcGlsZWQuY2xhc3Nlcy5kaXJ9Ii8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJnIGxpbmU9Ii1kICR7c2NoZW1hLmdlbmVyYXRlZC5zcmMuZGlyfSAtcXVpZXQgJHtzY2hlbWEuc291cmNlLmRpcn0vZ3JlZXRlclR5cGVzLnhzZCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2phdmE+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlY2hvPkdlbmVyYXRpbmcgamF2YSBmcm9tIFByb3h5RG9jTGl0V3JhcHBlZC53c2RsPC9lY2hvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8amF2YSBjbGFzc25hbWU9ImNvbS5zdW4udG9vbHMueGpjLkRyaXZlciIgZm9yaz0idHJ1ZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJtYXZlbi5ydW50aW1lLmNsYXNzcGF0aCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzcGF0aCBsb2NhdGlvbj0iJHtjb21waWxlZC5jbGFzc2VzLmRpcn0iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcmcgbGluZT0iLWQgJHtzY2hlbWEuZ2VuZXJhdGVkLnNyYy5kaXJ9IC1xdWlldCAtcCBvcmcudGVzdC5wcm94eS5kb2NsaXR3cmFwcGVkIC1xdWlldCAtd3NkbCAke3dzZGwuc291cmNlLmRpcn0vUHJveHlEb2NMaXRXcmFwcGVkLndzZGwiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9qYXZhPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWNobz5HZW5lcmF0aW5nIGphdmEgZnJvbSBBZGROdW1iZXJzLndzZGw8L2VjaG8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxqYXZhIGNsYXNzbmFtZT0iY29tLnN1bi50b29scy54amMuRHJpdmVyIiBmb3JrPSJ0cnVlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc3BhdGggcmVmaWQ9Im1hdmVuLnJ1bnRpbWUuY2xhc3NwYXRoIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoIGxvY2F0aW9uPSIke2NvbXBpbGVkLmNsYXNzZXMuZGlyfSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFyZyBsaW5lPSItZCAke3NjaGVtYS5nZW5lcmF0ZWQuc3JjLmRpcn0gLXF1aWV0IC13c2RsICR7d3NkbC5zb3VyY2UuZGlyfS9BZGROdW1iZXJzLndzZGwiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9qYXZhPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWNobz5HZW5lcmF0aW5nIGphdmEgZnJvbSBQcm94eURvY0xpdG5vbldyYXBwZWQud3NkbDwvZWNobz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGphdmEgY2xhc3NuYW1lPSJjb20uc3VuLnRvb2xzLnhqYy5Ecml2ZXIiIGZvcms9InRydWUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzcGF0aCByZWZpZD0ibWF2ZW4ucnVudGltZS5jbGFzc3BhdGgiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc3BhdGggbG9jYXRpb249IiR7Y29tcGlsZWQuY2xhc3Nlcy5kaXJ9Ii8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJnIGxpbmU9Ii1kICR7c2NoZW1hLmdlbmVyYXRlZC5zcmMuZGlyfSAtcXVpZXQgLXdzZGwgJHt3c2RsLnNvdXJjZS5kaXJ9L1Byb3h5RG9jTGl0bm9uV3JhcHBlZC53c2RsIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvamF2YT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVjaG8+R2VuZXJhdGluZyBqYXZhIGZyb20gc2FtcGxlbXRvbWpwZWcud3NkbDwvZWNobz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGphdmEgY2xhc3NuYW1lPSJjb20uc3VuLnRvb2xzLnhqYy5Ecml2ZXIiIGZvcms9InRydWUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzcGF0aCByZWZpZD0ibWF2ZW4ucnVudGltZS5jbGFzc3BhdGgiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc3BhdGggbG9jYXRpb249IiR7Y29tcGlsZWQuY2xhc3Nlcy5kaXJ9Ii8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJnIGxpbmU9Ii1kICR7c2NoZW1hLmdlbmVyYXRlZC5zcmMuZGlyfSAtcXVpZXQgLXdzZGwgJHt3c2RsLnNvdXJjZS5kaXJ9L3NhbXBsZW10b21qcGVnLndzZGwiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9qYXZhPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWNobz5HZW5lcmF0aW5nIGphdmEgZnJvbSBSUENMaXQud3NkbDwvZWNobz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGphdmEgY2xhc3NuYW1lPSJjb20uc3VuLnRvb2xzLnhqYy5Ecml2ZXIiIGZvcms9InRydWUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzcGF0aCByZWZpZD0ibWF2ZW4ucnVudGltZS5jbGFzc3BhdGgiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc3BhdGggbG9jYXRpb249IiR7Y29tcGlsZWQuY2xhc3Nlcy5kaXJ9Ii8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJnIGxpbmU9Ii1kICR7c2NoZW1hLmdlbmVyYXRlZC5zcmMuZGlyfSAtcCBvcmcudGVzdC5wcm94eS5ycGNsaXQgLXF1aWV0IC13c2RsICR7d3NkbC5zb3VyY2UuZGlyfS9SUENMaXQud3NkbCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2phdmE+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlY2hvPkdlbmVyYXRpbmcgamF2YSBmcm9tIFJQQ0xpdFNXQS53c2RsPC9lY2hvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8amF2YSBjbGFzc25hbWU9ImNvbS5zdW4udG9vbHMueGpjLkRyaXZlciIgZm9yaz0idHJ1ZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJtYXZlbi5ydW50aW1lLmNsYXNzcGF0aCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzcGF0aCBsb2NhdGlvbj0iJHtjb21waWxlZC5jbGFzc2VzLmRpcn0iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcmcgbGluZT0iLWQgJHtzY2hlbWEuZ2VuZXJhdGVkLnNyYy5kaXJ9IC1wIG9yZy50ZXN0LnByb3h5LnJwY2xpdHN3YSAtcXVpZXQgLXdzZGwgJHt3c2RsLnNvdXJjZS5kaXJ9L1JQQ0xpdFNXQS53c2RsIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvamF2YT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVjaG8+R2VuZXJhdGluZyBqYXZhIGZyb20gZ29yaWxsYV9kbHcud3NkbDwvZWNobz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGphdmEgY2xhc3NuYW1lPSJjb20uc3VuLnRvb2xzLnhqYy5Ecml2ZXIiIGZvcms9InRydWUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzcGF0aCByZWZpZD0ibWF2ZW4ucnVudGltZS5jbGFzc3BhdGgiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc3BhdGggbG9jYXRpb249IiR7Y29tcGlsZWQuY2xhc3Nlcy5kaXJ9Ii8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJnIGxpbmU9Ii1kICR7c2NoZW1hLmdlbmVyYXRlZC5zcmMuZGlyfSAtcXVpZXQgLXdzZGwgJHt3c2RsLnNvdXJjZS5kaXJ9L2dvcmlsbGFfZGx3LndzZGwiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9qYXZhPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWNobz5HZW5lcmF0aW5nIGphdmEgZnJvbSBTT0FQMTJFY2hvLndzZGw8L2VjaG8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxqYXZhIGNsYXNzbmFtZT0iY29tLnN1bi50b29scy54amMuRHJpdmVyIiBmb3JrPSJ0cnVlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc3BhdGggcmVmaWQ9Im1hdmVuLnJ1bnRpbWUuY2xhc3NwYXRoIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoIGxvY2F0aW9uPSIke2NvbXBpbGVkLmNsYXNzZXMuZGlyfSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFyZyBsaW5lPSItZCAke3NjaGVtYS5nZW5lcmF0ZWQuc3JjLmRpcn0gLXF1aWV0IC13c2RsICR7d3NkbC5zb3VyY2UuZGlyfS9TT0FQMTJFY2hvLndzZGwiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9qYXZhPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWNobz5HZW5lcmF0aW5nIGphdmEgZnJvbSBBZGROdW1iZXJzSGFuZGxlci53c2RsPC9lY2hvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8amF2YSBjbGFzc25hbWU9ImNvbS5zdW4udG9vbHMueGpjLkRyaXZlciIgZm9yaz0idHJ1ZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJtYXZlbi5ydW50aW1lLmNsYXNzcGF0aCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzcGF0aCBsb2NhdGlvbj0iJHtjb21waWxlZC5jbGFzc2VzLmRpcn0iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcmcgbGluZT0iLWQgJHtzY2hlbWEuZ2VuZXJhdGVkLnNyYy5kaXJ9IC1xdWlldCAtd3NkbCAke3dzZGwuc291cmNlLmRpcn0vQWRkTnVtYmVyc0hhbmRsZXIud3NkbCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2phdmE+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlY2hvPkdlbmVyYXRpbmcgamF2YSBmcm9tIGFzeW5jX2RvY2xpdHdyLndzZGw8L2VjaG8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxqYXZhIGNsYXNzbmFtZT0iY29tLnN1bi50b29scy54amMuRHJpdmVyIiBmb3JrPSJ0cnVlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc3BhdGggcmVmaWQ9Im1hdmVuLnJ1bnRpbWUuY2xhc3NwYXRoIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoIGxvY2F0aW9uPSIke2NvbXBpbGVkLmNsYXNzZXMuZGlyfSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFyZyBsaW5lPSItZCAke3NjaGVtYS5nZW5lcmF0ZWQuc3JjLmRpcn0gLXF1aWV0IC13c2RsICR7d3NkbC5zb3VyY2UuZGlyfS9hc3luY19kb2NsaXR3ci53c2RsIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvamF2YT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVjaG8+R2VuZXJhdGluZyBqYXZhIGZyb20gYXN5bmNfZG9jbGl0d3IyLndzZGw8L2VjaG8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxqYXZhIGNsYXNzbmFtZT0iY29tLnN1bi50b29scy54amMuRHJpdmVyIiBmb3JrPSJ0cnVlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc3BhdGggcmVmaWQ9Im1hdmVuLnJ1bnRpbWUuY2xhc3NwYXRoIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoIGxvY2F0aW9uPSIke2NvbXBpbGVkLmNsYXNzZXMuZGlyfSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFyZyBsaW5lPSItZCAke3NjaGVtYS5nZW5lcmF0ZWQuc3JjLmRpcn0gLXF1aWV0IC13c2RsICR7d3NkbC5zb3VyY2UuZGlyfS9hc3luY19kb2NsaXR3cjIud3NkbCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2phdmE+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlY2hvPkdlbmVyYXRpbmcgamF2YSBmcm9tIEZhdWx0eVdlYlNlcnZpY2Uud3NkbDwvZWNobz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGphdmEgY2xhc3NuYW1lPSJjb20uc3VuLnRvb2xzLnhqYy5Ecml2ZXIiIGZvcms9InRydWUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzcGF0aCByZWZpZD0ibWF2ZW4ucnVudGltZS5jbGFzc3BhdGgiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc3BhdGggbG9jYXRpb249IiR7Y29tcGlsZWQuY2xhc3Nlcy5kaXJ9Ii8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJnIGxpbmU9Ii1kICR7c2NoZW1hLmdlbmVyYXRlZC5zcmMuZGlyfSAtcXVpZXQgLXdzZGwgJHt3c2RsLnNvdXJjZS5kaXJ9L0ZhdWx0eVdlYlNlcnZpY2Uud3NkbCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2phdmE+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlY2hvPkdlbmVyYXRpbmcgamF2YSBmcm9tIEZhdWx0c1NlcnZpY2Uud3NkbDwvZWNobz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGphdmEgY2xhc3NuYW1lPSJjb20uc3VuLnRvb2xzLnhqYy5Ecml2ZXIiIGZvcms9InRydWUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzcGF0aCByZWZpZD0ibWF2ZW4ucnVudGltZS5jbGFzc3BhdGgiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc3BhdGggbG9jYXRpb249IiR7Y29tcGlsZWQuY2xhc3Nlcy5kaXJ9Ii8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJnIGxpbmU9Ii1kICR7c2NoZW1hLmdlbmVyYXRlZC5zcmMuZGlyfSAtcXVpZXQgLXdzZGwgJHt3c2RsLnNvdXJjZS5kaXJ9L0ZhdWx0c1NlcnZpY2Uud3NkbCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2phdmE+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlY2hvPkdlbmVyYXRpbmcgamF2YSBmcm9tIGpheGJzb3VyY2U8L2VjaG8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxqYXZhIGNsYXNzbmFtZT0iY29tLnN1bi50b29scy54amMuRHJpdmVyIiBmb3JrPSJ0cnVlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc3BhdGggcmVmaWQ9Im1hdmVuLnJ1bnRpbWUuY2xhc3NwYXRoIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoIGxvY2F0aW9uPSIke2NvbXBpbGVkLmNsYXNzZXMuZGlyfSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFyZyBsaW5lPSItZCAke3NjaGVtYS5nZW5lcmF0ZWQuc3JjLmRpcn0gLXF1aWV0IC1wIG9yZy50ZXN0LmRpc3BhdGNoLmpheGJzb3VyY2UgJHtzY2hlbWEuc291cmNlLmRpcn0vamF4YnNvdXJjZS54c2QiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9qYXZhPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWNobz5HZW5lcmF0aW5nIGphdmEgZnJvbSBkb2NsaXRfbm9ud3JhcC53c2RsIGZvciBqYXZhYmVhbiBlbmRwb2ludAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2VjaG8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxqYXZhIGNsYXNzbmFtZT0iY29tLnN1bi50b29scy54amMuRHJpdmVyIiBmb3JrPSJ0cnVlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc3BhdGggcmVmaWQ9Im1hdmVuLnJ1bnRpbWUuY2xhc3NwYXRoIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoIGxvY2F0aW9uPSIke2NvbXBpbGVkLmNsYXNzZXMuZGlyfSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFyZyBsaW5lPSItZCAke3NjaGVtYS5nZW5lcmF0ZWQuc3JjLmRpcn0gLXF1aWV0IC13c2RsICR7d3NkbC5zb3VyY2UuZGlyfS9kb2NsaXRfbm9ud3JhcC53c2RsIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvamF2YT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVjaG8+R2VuZXJhdGluZyBqYXZhIGZyb20gZG9jbGl0d3JhcC53c2RsIGZvciBqYXZhYmVhbiBlbmRwb2ludAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2VjaG8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxqYXZhIGNsYXNzbmFtZT0iY29tLnN1bi50b29scy54amMuRHJpdmVyIiBmb3JrPSJ0cnVlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc3BhdGggcmVmaWQ9Im1hdmVuLnJ1bnRpbWUuY2xhc3NwYXRoIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoIGxvY2F0aW9uPSIke2NvbXBpbGVkLmNsYXNzZXMuZGlyfSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFyZyBsaW5lPSItZCAke3NjaGVtYS5nZW5lcmF0ZWQuc3JjLmRpcn0gLXF1aWV0IC13c2RsICR7d3NkbC5zb3VyY2UuZGlyfS9kb2NsaXR3cmFwLndzZGwiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9qYXZhPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWNobz5HZW5lcmF0aW5nIGphdmEgZnJvbSBkb2NsaXRiYXJlLndzZGwgZm9yIGphdmFiZWFuIGVuZHBvaW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZWNobz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGphdmEgY2xhc3NuYW1lPSJjb20uc3VuLnRvb2xzLnhqYy5Ecml2ZXIiIGZvcms9InRydWUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzcGF0aCByZWZpZD0ibWF2ZW4ucnVudGltZS5jbGFzc3BhdGgiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc3BhdGggbG9jYXRpb249IiR7Y29tcGlsZWQuY2xhc3Nlcy5kaXJ9Ii8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJnIGxpbmU9Ii1kICR7c2NoZW1hLmdlbmVyYXRlZC5zcmMuZGlyfSAtcXVpZXQgLXdzZGwgJHt3c2RsLnNvdXJjZS5kaXJ9L2RvY2xpdGJhcmUud3NkbCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2phdmE+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWNobz5HZW5lcmF0aW5nIGphdmEgZnJvbSBFY2hvTWVzc2FnZS53c2RsIGZvciBqYXZhYmVhbiBlbmRwb2ludAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2VjaG8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxqYXZhIGNsYXNzbmFtZT0iY29tLnN1bi50b29scy54amMuRHJpdmVyIiBmb3JrPSJ0cnVlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc3BhdGggcmVmaWQ9Im1hdmVuLnJ1bnRpbWUuY2xhc3NwYXRoIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoIGxvY2F0aW9uPSIke2NvbXBpbGVkLmNsYXNzZXMuZGlyfSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFyZyBsaW5lPSItZCAke3NjaGVtYS5nZW5lcmF0ZWQuc3JjLmRpcn0gLXF1aWV0IC13c2RsICR7d3NkbC5zb3VyY2UuZGlyfS9FY2hvTWVzc2FnZS53c2RsIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvamF2YT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlY2hvPkdlbmVyYXRpbmcgamF2YSBmcm9tIHJlc291cmNlaW5qZWN0aW9uLndzZGwgZm9yIGphdmFiZWFuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRwb2ludCBSZXNvdXJjZSBJbmplY3Rpb24gc3VwcG9ydAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2VjaG8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxqYXZhIGNsYXNzbmFtZT0iY29tLnN1bi50b29scy54amMuRHJpdmVyIiBmb3JrPSJ0cnVlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc3BhdGggcmVmaWQ9Im1hdmVuLnJ1bnRpbWUuY2xhc3NwYXRoIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoIGxvY2F0aW9uPSIke2NvbXBpbGVkLmNsYXNzZXMuZGlyfSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFyZyBsaW5lPSItZCAke3NjaGVtYS5nZW5lcmF0ZWQuc3JjLmRpcn0gLXF1aWV0IC13c2RsICR7d3NkbC5zb3VyY2UuZGlyfS9yZXNvdXJjZWluamVjdGlvbi53c2RsIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvamF2YT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVjaG8+R2VuZXJhdGluZyBqYXZhIGZyb20gQW55VHlwZS53c2RsIGZvciBqYXZhYmVhbiBlbmRwb2ludAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW55VHlwZSBzdXBwb3J0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZWNobz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGphdmEgY2xhc3NuYW1lPSJjb20uc3VuLnRvb2xzLnhqYy5Ecml2ZXIiIGZvcms9InRydWUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzcGF0aCByZWZpZD0ibWF2ZW4ucnVudGltZS5jbGFzc3BhdGgiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc3BhdGggbG9jYXRpb249IiR7Y29tcGlsZWQuY2xhc3Nlcy5kaXJ9Ii8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJnIGxpbmU9Ii1kICR7c2NoZW1hLmdlbmVyYXRlZC5zcmMuZGlyfSAtcXVpZXQgLXdzZGwgJHt3c2RsLnNvdXJjZS5kaXJ9L0FueVR5cGUud3NkbCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2phdmE+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlY2hvPkdlbmVyYXRpbmcgamF2YSBmcm9tIE1lc3NhZ2VDb250ZXh0LndzZGwgZm9yIG1lc3NhZ2UgY29udGV4dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcyBzdXBwb3J0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZWNobz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGphdmEgY2xhc3NuYW1lPSJjb20uc3VuLnRvb2xzLnhqYy5Ecml2ZXIiIGZvcms9InRydWUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzcGF0aCByZWZpZD0ibWF2ZW4ucnVudGltZS5jbGFzc3BhdGgiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc3BhdGggbG9jYXRpb249IiR7Y29tcGlsZWQuY2xhc3Nlcy5kaXJ9Ii8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJnIGxpbmU9Ii1kICR7c2NoZW1hLmdlbmVyYXRlZC5zcmMuZGlyfSAtcXVpZXQgLXdzZGwgJHt3c2RsLnNvdXJjZS5kaXJ9L01lc3NhZ2VDb250ZXh0LndzZGwiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9qYXZhPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWNobz5HZW5lcmF0aW5nIGphdmEgZnJvbSBXU0RMTXVsdGlUZXN0cy53c2RsPC9lY2hvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8amF2YSBjbGFzc25hbWU9ImNvbS5zdW4udG9vbHMueGpjLkRyaXZlciIgZm9yaz0idHJ1ZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJtYXZlbi5ydW50aW1lLmNsYXNzcGF0aCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzcGF0aCBsb2NhdGlvbj0iJHtjb21waWxlZC5jbGFzc2VzLmRpcn0iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcmcgbGluZT0iLWQgJHtzY2hlbWEuZ2VuZXJhdGVkLnNyYy5kaXJ9IC1xdWlldCAtd3NkbCAke3dzZGwuc291cmNlLmRpcn0vV1NETE11bHRpVGVzdHMud3NkbCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2phdmE+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlY2hvPkdlbmVyYXRpbmcgamF2YSBmcm9tIFBvbHltb3JwaGljIHNoYXBlcy53c2RsIGZvciBqYXZhYmVhbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kcG9pbnQgc3VwcG9ydAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2VjaG8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxqYXZhIGNsYXNzbmFtZT0iY29tLnN1bi50b29scy54amMuRHJpdmVyIiBmb3JrPSJ0cnVlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc3BhdGggcmVmaWQ9Im1hdmVuLnJ1bnRpbWUuY2xhc3NwYXRoIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoIGxvY2F0aW9uPSIke2NvbXBpbGVkLmNsYXNzZXMuZGlyfSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFyZyBsaW5lPSItZCAke3NjaGVtYS5nZW5lcmF0ZWQuc3JjLmRpcn0gLXF1aWV0IC13c2RsICR7d3NkbC5zb3VyY2UuZGlyfS9zaGFwZXMud3NkbCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2phdmE+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlY2hvPkdlbmVyYXRpbmcgamF2YSBmcm9tIFNPQVBBY3Rpb25UZXN0LndzZGw8L2VjaG8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxqYXZhIGNsYXNzbmFtZT0iY29tLnN1bi50b29scy54amMuRHJpdmVyIiBmb3JrPSJ0cnVlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc3BhdGggcmVmaWQ9Im1hdmVuLnJ1bnRpbWUuY2xhc3NwYXRoIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoIGxvY2F0aW9uPSIke2NvbXBpbGVkLmNsYXNzZXMuZGlyfSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFyZyBsaW5lPSItZCAke3NjaGVtYS5nZW5lcmF0ZWQuc3JjLmRpcn0gLXF1aWV0IC13c2RsICR7d3NkbC5zb3VyY2UuZGlyfS9TT0FQQWN0aW9uVGVzdC53c2RsIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvamF2YT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVjaG8+R2VuZXJhdGluZyBqYXZhIGZyb20gcnBjbGl0ZW51bS53c2RsPC9lY2hvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8amF2YSBjbGFzc25hbWU9ImNvbS5zdW4udG9vbHMueGpjLkRyaXZlciIgZm9yaz0idHJ1ZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJtYXZlbi5ydW50aW1lLmNsYXNzcGF0aCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzcGF0aCBsb2NhdGlvbj0iJHtjb21waWxlZC5jbGFzc2VzLmRpcn0iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcmcgbGluZT0iLWQgJHtzY2hlbWEuZ2VuZXJhdGVkLnNyYy5kaXJ9IC1xdWlldCAtd3NkbCAke3dzZGwuc291cmNlLmRpcn0vcnBjbGl0ZW51bS53c2RsIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvamF2YT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVjaG8+R2VuZXJhdGluZyBqYXZhIGZyb20gQWRkTnVtYmVyc0hhbmRsZXIud3NkbDwvZWNobz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGphdmEgY2xhc3NuYW1lPSJjb20uc3VuLnRvb2xzLnhqYy5Ecml2ZXIiIGZvcms9InRydWUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzcGF0aCByZWZpZD0ibWF2ZW4ucnVudGltZS5jbGFzc3BhdGgiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc3BhdGggbG9jYXRpb249IiR7Y29tcGlsZWQuY2xhc3Nlcy5kaXJ9Ii8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJnIGxpbmU9Ii1kICR7c2NoZW1hLmdlbmVyYXRlZC5zcmMuZGlyfSAtcXVpZXQgLXdzZGwgJHt3c2RsLnNvdXJjZS5kaXJ9L0FkZE51bWJlcnNIYW5kbGVyLndzZGwiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9qYXZhPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWNobz5HZW5lcmF0aW5nIGphdmEgZnJvbSBycGNsaXRzdHJpbmdhcnJheS53c2RsPC9lY2hvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8amF2YSBjbGFzc25hbWU9ImNvbS5zdW4udG9vbHMueGpjLkRyaXZlciIgZm9yaz0idHJ1ZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJtYXZlbi5ydW50aW1lLmNsYXNzcGF0aCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzcGF0aCBsb2NhdGlvbj0iJHtjb21waWxlZC5jbGFzc2VzLmRpcn0iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcmcgbGluZT0iLWQgJHtzY2hlbWEuZ2VuZXJhdGVkLnNyYy5kaXJ9IC1xdWlldCAtd3NkbCAke3dzZGwuc291cmNlLmRpcn0vcnBjbGl0c3RyaW5nYXJyYXkud3NkbCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2phdmE+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlY2hvPkdlbmVyYXRpbmcgamF2YSBmcm9tIHN3YW10b21zZXJ2aWNlLndzZGw8L2VjaG8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxqYXZhIGNsYXNzbmFtZT0iY29tLnN1bi50b29scy54amMuRHJpdmVyIiBmb3JrPSJ0cnVlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc3BhdGggcmVmaWQ9Im1hdmVuLnJ1bnRpbWUuY2xhc3NwYXRoIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoIGxvY2F0aW9uPSIke2NvbXBpbGVkLmNsYXNzZXMuZGlyfSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFyZyBsaW5lPSItZCAke3NjaGVtYS5nZW5lcmF0ZWQuc3JjLmRpcn0gLXF1aWV0IC13c2RsICR7d3NkbC5zb3VyY2UuZGlyfS9zd2FtdG9tc2VydmljZS53c2RsIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvamF2YT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rhc2tzPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnJ1bjwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmJ1aWxkLXJlcG88L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnRlc3QtY29tcGlsZTwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFza3M+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBFbmFibGUgQWRkcmVzc2luZyBvbiB0aGUgY2xpZW50IHNpZGUgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxta2RpciBkaXI9Ii4vdGFyZ2V0L2NsaWVudC1yZXBvL21vZHVsZXMvIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3B5IGZpbGU9Ii4uL2FkZHJlc3NpbmcvdGFyZ2V0L2FkZHJlc3NpbmctJHt2ZXJzaW9ufS5tYXIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvZmlsZT0iLi90YXJnZXQvY2xpZW50LXJlcG8vbW9kdWxlcy9hZGRyZXNzaW5nLSR7dmVyc2lvbn0ubWFyIi8+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBFbmFibGUgQWRkcmVzc2luZyBvbiB0aGUgc2VydmVyIHNpZGUgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxta2RpciBkaXI9Ii4vdGFyZ2V0L3Rlc3QtY2xhc3Nlcy9tb2R1bGVzLyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29weSBmaWxlPSIuLi9hZGRyZXNzaW5nL3RhcmdldC9hZGRyZXNzaW5nLSR7dmVyc2lvbn0ubWFyIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2ZpbGU9Ii4vdGFyZ2V0L3Rlc3QtY2xhc3Nlcy9tb2R1bGVzL2FkZHJlc3NpbmctJHt2ZXJzaW9ufS5tYXIiLz4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gTm9uLUpBWFdTIHNlcnZpY2VzIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvcHkgdG9EaXI9InRhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZXMvRWNob1NlcnZpY2UvIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0idGFyZ2V0L3Rlc3QtY2xhc3NlcyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0ic2VydmVyLyoqIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9InRlc3Qvc2VydmVyIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSIqKi8qLmphdmEiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb3B5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29weSB0b0Rpcj0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlcy9Cb29rU3RvcmVTZXJ2aWNlLyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9InRhcmdldC90ZXN0LWNsYXNzZXMiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvYXhpczIvamF4d3MvY2xpZW50L3NvYXBhY3Rpb24vKioiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0idGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NsaWVudC9zb2FwYWN0aW9uL3NlcnZlciI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iTUVUQS1JTkYvKioiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb3B5PgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxta2RpciBkaXI9Ii4vdGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gSkFYV1Mgc2VydmljZXMgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFByb3ZpZGVyIGVuZHBvaW50IFNlcnZpY2UgU2FtcGxlcyAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29weSB0b0Rpcj0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9XU0dlblNlcnZpY2UvIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0idGFyZ2V0L3Rlc3QtY2xhc3NlcyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvd3NnZW4vV1NHZW5JbnRlcmZhY2UuY2xhc3MiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS93c2dlbi9XU0dlbkltcGwuY2xhc3MiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS93c2dlbi9qYXh3cy8qKiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJ0ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL3dzZ2VuIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJNRVRBLUlORi8qKiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9Ik1FVEEtSU5GL3NlcnZpY2VzLnhtbCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvcHk+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHppcCBkZXN0ZmlsZT0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9XU0dlblNlcnZpY2UuamFyIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VkaXI9IiR7cG9tLmJhc2VkaXJ9L3RhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvV1NHZW5TZXJ2aWNlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZWxldGUgZGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL1dTR2VuU2VydmljZSIvPgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3B5IHRvRGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL0Jhc2ljQXV0aFNlY3VyaXR5U2VydmljZS8iPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NlY3VyaXR5L3NlcnZlci8qKiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2VjdXJpdHkvc2VydmVyL01FVEEtSU5GL3NlcnZpY2VzLnhtbCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJ0ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2VjdXJpdHkvc2VydmVyIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJNRVRBLUlORi8qKiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9Ik1FVEEtSU5GL3NlcnZpY2VzLnhtbCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvcHk+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHppcCBkZXN0ZmlsZT0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9CYXNpY0F1dGhTZWN1cml0eVNlcnZpY2UuamFyIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VkaXI9IiR7cG9tLmJhc2VkaXJ9L3RhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvQmFzaWNBdXRoU2VjdXJpdHlTZXJ2aWNlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZWxldGUgZGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL0Jhc2ljQXV0aFNlY3VyaXR5U2VydmljZSIvPgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3B5IHRvRGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL1N0cmluZ1Byb3ZpZGVyU2VydmljZS8iPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyL3N0cmluZy8qKiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvc3RyaW5nL01FVEEtSU5GL3NlcnZpY2VzLnhtbCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJ0ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvc3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJNRVRBLUlORi8qKiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9Ik1FVEEtSU5GL3NlcnZpY2VzLnhtbCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvcHk+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHppcCBkZXN0ZmlsZT0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9TdHJpbmdQcm92aWRlclNlcnZpY2UuamFyIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VkaXI9IiR7cG9tLmJhc2VkaXJ9L3RhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvU3RyaW5nUHJvdmlkZXJTZXJ2aWNlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZWxldGUgZGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL1N0cmluZ1Byb3ZpZGVyU2VydmljZSIvPgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3B5IHRvRGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL1N0cmluZ01lc3NhZ2VQcm92aWRlclNlcnZpY2UvIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0idGFyZ2V0L3Rlc3QtY2xhc3NlcyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9zdHJpbmdtc2cvKioiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0ib3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9zdHJpbmdtc2cvTUVUQS1JTkYvc2VydmljZXMueG1sIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9InRlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9zdHJpbmdtc2ciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Ik1FVEEtSU5GLyoqIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iTUVUQS1JTkYvc2VydmljZXMueG1sIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29weT4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8emlwIGRlc3RmaWxlPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL1N0cmluZ01lc3NhZ2VQcm92aWRlclNlcnZpY2UuamFyIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VkaXI9IiR7cG9tLmJhc2VkaXJ9L3RhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvU3RyaW5nTWVzc2FnZVByb3ZpZGVyU2VydmljZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVsZXRlIGRpcj0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9TdHJpbmdNZXNzYWdlUHJvdmlkZXJTZXJ2aWNlIi8+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvcHkgdG9EaXI9InRhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvU291cmNlUHJvdmlkZXJTZXJ2aWNlLyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9InRhcmdldC90ZXN0LWNsYXNzZXMiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvc291cmNlLyoqIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9zb3VyY2UvTUVUQS1JTkYvc2VydmljZXMueG1sIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9InRlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9zb3VyY2UiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Ik1FVEEtSU5GLyoqIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iTUVUQS1JTkYvc2VydmljZXMueG1sIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29weT4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8emlwIGRlc3RmaWxlPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL1NvdXJjZVByb3ZpZGVyU2VydmljZS5qYXIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZWRpcj0iJHtwb20uYmFzZWRpcn0vdGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9Tb3VyY2VQcm92aWRlclNlcnZpY2UiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlbGV0ZSBkaXI9InRhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvU291cmNlUHJvdmlkZXJTZXJ2aWNlIi8+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvcHkgdG9EaXI9InRhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvU291cmNlTWVzc2FnZVByb3ZpZGVyU2VydmljZS8iPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyL3NvdXJjZW1zZy8qKiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJvcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyL3NvdXJjZW1zZy9NRVRBLUlORi9zZXJ2aWNlcy54bWwiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0idGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyL3NvdXJjZW1zZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iTUVUQS1JTkYvKioiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJNRVRBLUlORi9zZXJ2aWNlcy54bWwiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb3B5PgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx6aXAgZGVzdGZpbGU9InRhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvU291cmNlTWVzc2FnZVByb3ZpZGVyU2VydmljZS5qYXIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZWRpcj0iJHtwb20uYmFzZWRpcn0vdGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9Tb3VyY2VNZXNzYWdlUHJvdmlkZXJTZXJ2aWNlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZWxldGUgZGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL1NvdXJjZU1lc3NhZ2VQcm92aWRlclNlcnZpY2UiLz4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29weSB0b0Rpcj0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9Tb2FwTWVzc2FnZVByb3ZpZGVyU2VydmljZS8iPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyL3NvYXBtc2cvKioiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyL3NvYXBtc2cvTUVUQS1JTkYvc2VydmljZXMueG1sIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9InRlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9zb2FwbXNnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJNRVRBLUlORi8qKiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9Ik1FVEEtSU5GL3NlcnZpY2VzLnhtbCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvcHk+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHppcCBkZXN0ZmlsZT0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9Tb2FwTWVzc2FnZVByb3ZpZGVyU2VydmljZS5qYXIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZWRpcj0iJHtwb20uYmFzZWRpcn0vdGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9Tb2FwTWVzc2FnZVByb3ZpZGVyU2VydmljZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVsZXRlIGRpcj0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9Tb2FwTWVzc2FnZVByb3ZpZGVyU2VydmljZSIvPgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3B5IHRvRGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL1NvYXBNZXNzYWdlQ2hlY2tNVE9NUHJvdmlkZXJTZXJ2aWNlLyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9InRhcmdldC90ZXN0LWNsYXNzZXMiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvc29hcG1zZ2NoZWNrbXRvbS8qKiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvc29hcG1zZ2NoZWNrbXRvbS9NRVRBLUlORi9zZXJ2aWNlcy54bWwiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0idGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyL3NvYXBtc2djaGVja210b20iPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Ik1FVEEtSU5GLyoqIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iTUVUQS1JTkYvc2VydmljZXMueG1sIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29weT4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8emlwIGRlc3RmaWxlPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL1NvYXBNZXNzYWdlQ2hlY2tNVE9NUHJvdmlkZXJTZXJ2aWNlLmphciIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlZGlyPSIke3BvbS5iYXNlZGlyfS90YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL1NvYXBNZXNzYWdlQ2hlY2tNVE9NUHJvdmlkZXJTZXJ2aWNlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZWxldGUgZGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL1NvYXBNZXNzYWdlQ2hlY2tNVE9NUHJvdmlkZXJTZXJ2aWNlIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29weSB0b0Rpcj0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9Tb2FwTWVzc2FnZU1VUHJvdmlkZXJTZXJ2aWNlLyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9InRhcmdldC90ZXN0LWNsYXNzZXMiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvc29hcG1zZ211LyoqIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9Im9yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvc29hcG1zZ211L01FVEEtSU5GL3NlcnZpY2VzLnhtbCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJ0ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvc29hcG1zZ211Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJNRVRBLUlORi8qKiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9Ik1FVEEtSU5GL3NlcnZpY2VzLnhtbCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvcHk+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHppcCBkZXN0ZmlsZT0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9Tb2FwTWVzc2FnZU1VUHJvdmlkZXJTZXJ2aWNlLmphciIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlZGlyPSIke3BvbS5iYXNlZGlyfS90YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL1NvYXBNZXNzYWdlTVVQcm92aWRlclNlcnZpY2UiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlbGV0ZSBkaXI9InRhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvU29hcE1lc3NhZ2VNVVByb3ZpZGVyU2VydmljZSIvPgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3B5IHRvRGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL0pBWEJQcm92aWRlclNlcnZpY2UvIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0idGFyZ2V0L3Rlc3QtY2xhc3NlcyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9qYXhiLyoqIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9qYXhiL01FVEEtSU5GL3NlcnZpY2VzLnhtbCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJ0ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvamF4YiI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iTUVUQS1JTkYvKioiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJNRVRBLUlORi9zZXJ2aWNlcy54bWwiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0idGFyZ2V0L3NjaGVtYS9jbGFzc2VzIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvdGVzdC9tdG9tLyoqIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29weT4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8emlwIGRlc3RmaWxlPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL0pBWEJQcm92aWRlclNlcnZpY2UuamFyIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VkaXI9IiR7cG9tLmJhc2VkaXJ9L3RhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvSkFYQlByb3ZpZGVyU2VydmljZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVsZXRlIGRpcj0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9KQVhCUHJvdmlkZXJTZXJ2aWNlIi8+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvcHkgdG9EaXI9InRhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvU2VuZEltYWdlU2VydmljZS8iPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9tdG9tMS8qKiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL210b20xL01FVEEtSU5GL3NlcnZpY2VzLnhtbCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJ0ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL210b20xIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJNRVRBLUlORi8qKiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9Ik1FVEEtSU5GL3NlcnZpY2VzLnhtbCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJ0YXJnZXQvc2NoZW1hL2NsYXNzZXMiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL210b20xLyoqIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29weT4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8emlwIGRlc3RmaWxlPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL1NlbmRJbWFnZVNlcnZpY2UuamFyIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VkaXI9IiR7cG9tLmJhc2VkaXJ9L3RhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvU2VuZEltYWdlU2VydmljZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVsZXRlIGRpcj0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9TZW5kSW1hZ2VTZXJ2aWNlIi8+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvcHkgdG9EaXI9InRhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvU09BUDEyU2VydmljZS8iPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rpc3BhdGNoL3NlcnZlci8qKiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvYXhpczIvamF4d3MvZGlzcGF0Y2gvc2VydmVyL01FVEEtSU5GL3NlcnZpY2VzLnhtbCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJ0ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGlzcGF0Y2gvc2VydmVyIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJNRVRBLUlORi8qKiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9Ik1FVEEtSU5GL3NlcnZpY2VzLnhtbCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvcHk+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHppcCBkZXN0ZmlsZT0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9TT0FQMTJTZXJ2aWNlLmphciIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlZGlyPSIke3BvbS5iYXNlZGlyfS90YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL1NPQVAxMlNlcnZpY2UiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlbGV0ZSBkaXI9InRhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvU09BUDEyU2VydmljZSIvPgotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29weSB0b0Rpcj0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9TV0FNVE9NU2VydmljZS8iPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2F4aXMyL2pheHdzL3N3YW10b20vc2VydmVyLyoqIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zd2FtdG9tL3NlcnZlci9NRVRBLUlORi9zZXJ2aWNlcy54bWwiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0idGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3N3YW10b20vc2VydmVyIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJNRVRBLUlORi8qKiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9Ik1FVEEtSU5GL3NlcnZpY2VzLnhtbCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvcHk+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHppcCBkZXN0ZmlsZT0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9TV0FNVE9NU2VydmljZS5qYXIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZWRpcj0iJHtwb20uYmFzZWRpcn0vdGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9TV0FNVE9NU2VydmljZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVsZXRlIGRpcj0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9TV0FNVE9NU2VydmljZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gUHJveHkgZW5kcG9pbnQgU2VydmljZSBTYW1wbGVzIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3B5IHRvRGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL1Byb3h5RG9jTGl0V3JhcHBlZC8iPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2RvY2xpdHdyYXBwZWQvKioiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0ib3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9kb2NsaXR3cmFwcGVkL01FVEEtSU5GL3NlcnZpY2VzLnhtbCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJ0ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvZG9jbGl0d3JhcHBlZCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iTUVUQS1JTkYvKioiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJNRVRBLUlORi9zZXJ2aWNlcy54bWwiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb3B5PgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx6aXAgZGVzdGZpbGU9InRhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvUHJveHlEb2NMaXRXcmFwcGVkLmphciIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlZGlyPSIke3BvbS5iYXNlZGlyfS90YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL1Byb3h5RG9jTGl0V3JhcHBlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVsZXRlIGRpcj0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9Qcm94eURvY0xpdFdyYXBwZWQiLz4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29weSB0b0Rpcj0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9Qcm94eURvY0xpdG5vbldyYXBwZWQvIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0idGFyZ2V0L3Rlc3QtY2xhc3NlcyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9kb2NsaXRub253cmFwcGVkLyoqIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9Im9yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvZG9jbGl0bm9ud3JhcHBlZC9NRVRBLUlORi9zZXJ2aWNlcy54bWwiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0idGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2RvY2xpdG5vbndyYXBwZWQiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Ik1FVEEtSU5GLyoqIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iTUVUQS1JTkYvc2VydmljZXMueG1sIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29weT4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8emlwIGRlc3RmaWxlPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL1Byb3h5RG9jTGl0bm9uV3JhcHBlZC5qYXIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZWRpcj0iJHtwb20uYmFzZWRpcn0vdGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9Qcm94eURvY0xpdG5vbldyYXBwZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlbGV0ZSBkaXI9InRhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvUHJveHlEb2NMaXRub25XcmFwcGVkIi8+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvcHkgdG9EaXI9InRhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvUlBDTGl0LyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9InRhcmdldC90ZXN0LWNsYXNzZXMiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvcnBjbGl0LyoqIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9ycGNsaXQvTUVUQS1JTkYvc2VydmljZXMueG1sIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9InRlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9ycGNsaXQiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Ik1FVEEtSU5GLyoqIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iTUVUQS1JTkYvc2VydmljZXMueG1sIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29weT4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8emlwIGRlc3RmaWxlPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL1JQQ0xpdC5qYXIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZWRpcj0iJHtwb20uYmFzZWRpcn0vdGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9SUENMaXQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlbGV0ZSBkaXI9InRhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvUlBDTGl0Ii8+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvcHkgdG9EaXI9InRhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvUlBDTGl0U1dBLyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9InRhcmdldC90ZXN0LWNsYXNzZXMiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvcnBjbGl0c3dhLyoqIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9ycGNsaXRzd2EvTUVUQS1JTkYvc2VydmljZXMueG1sIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9InRlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9ycGNsaXRzd2EiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Ik1FVEEtSU5GLyoqIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iTUVUQS1JTkYvc2VydmljZXMueG1sIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29weT4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8emlwIGRlc3RmaWxlPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL1JQQ0xpdFNXQS5qYXIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZWRpcj0iJHtwb20uYmFzZWRpcn0vdGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9SUENMaXRTV0EiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlbGV0ZSBkaXI9InRhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvUlBDTGl0U1dBIi8+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvcHkgdG9EaXI9InRhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvQWRkcmVzc2luZ1Byb3ZpZGVyLyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9InRhcmdldC90ZXN0LWNsYXNzZXMiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvYWRkcmVzc2luZy8qKiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJ0ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvYWRkcmVzc2luZy8iPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Ik1FVEEtSU5GLyoqIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29weT4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8emlwIGRlc3RmaWxlPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL0FkZHJlc3NpbmdQcm92aWRlci5qYXIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZWRpcj0iJHtwb20uYmFzZWRpcn0vdGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9BZGRyZXNzaW5nUHJvdmlkZXIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlbGV0ZSBkaXI9InRhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvQWRkcmVzc2luZ1Byb3ZpZGVyIi8+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvcHkgdG9EaXI9InRhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvU09BUDEyRWNob1NlcnZpY2UvIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0idGFyZ2V0L3Rlc3QtY2xhc3NlcyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9zb2FwMTIvKioiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0ib3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9zb2FwMTIvc2VydmVyL01FVEEtSU5GL3NlcnZpY2VzLnhtbCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJ0ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvc29hcDEyL3NlcnZlciI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iTUVUQS1JTkYvKioiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJNRVRBLUlORi9zZXJ2aWNlcy54bWwiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb3B5PgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx6aXAgZGVzdGZpbGU9InRhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvU09BUDEyRWNob1NlcnZpY2UuamFyIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VkaXI9IiR7cG9tLmJhc2VkaXJ9L3RhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvU09BUDEyRWNob1NlcnZpY2UiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlbGV0ZSBkaXI9InRhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvU09BUDEyRWNob1NlcnZpY2UiLz4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29weSB0b0Rpcj0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9nb3JpbGxhX2Rsdy8iPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2dvcmlsbGFfZGx3LyoqIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9nb3JpbGxhX2Rsdy9NRVRBLUlORi9zZXJ2aWNlcy54bWwiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0idGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2dvcmlsbGFfZGx3Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJNRVRBLUlORi8qKiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9Ik1FVEEtSU5GL3NlcnZpY2VzLnhtbCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvcHk+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHppcCBkZXN0ZmlsZT0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9nb3JpbGxhX2Rsdy5qYXIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZWRpcj0iJHtwb20uYmFzZWRpcn0vdGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9nb3JpbGxhX2RsdyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVsZXRlIGRpcj0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9nb3JpbGxhX2RsdyIvPgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBYTUwgSFRUUCBUZXN0cyAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29weSB0b0Rpcj0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9YUGF5bG9hZFN0cmluZ1Byb3ZpZGVyLyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9InRhcmdldC90ZXN0LWNsYXNzZXMiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvYXhpczIvamF4d3MveG1saHR0cC9wcm92aWRlci9wYXlsb2FkL3N0cmluZy8qLmNsYXNzIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9InRlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy94bWxodHRwL3Byb3ZpZGVyL3BheWxvYWQvc3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJNRVRBLUlORi8qKiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9Ik1FVEEtSU5GL3NlcnZpY2VzLnhtbCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvcHk+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHppcCBkZXN0ZmlsZT0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9YUGF5bG9hZFN0cmluZ1Byb3ZpZGVyLmphciIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlZGlyPSIke3BvbS5iYXNlZGlyfS90YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL1hQYXlsb2FkU3RyaW5nUHJvdmlkZXIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlbGV0ZSBkaXI9InRhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvWFBheWxvYWRTdHJpbmdQcm92aWRlciIvPgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3B5IHRvRGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL1hNZXNzYWdlU3RyaW5nUHJvdmlkZXIvIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0idGFyZ2V0L3Rlc3QtY2xhc3NlcyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9heGlzMi9qYXh3cy94bWxodHRwL3Byb3ZpZGVyL21lc3NhZ2Uvc3RyaW5nLyouY2xhc3MiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0idGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3htbGh0dHAvcHJvdmlkZXIvbWVzc2FnZS9zdHJpbmciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Ik1FVEEtSU5GLyoqIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iTUVUQS1JTkYvc2VydmljZXMueG1sIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29weT4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8emlwIGRlc3RmaWxlPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL1hNZXNzYWdlU3RyaW5nUHJvdmlkZXIuamFyIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VkaXI9IiR7cG9tLmJhc2VkaXJ9L3RhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvWE1lc3NhZ2VTdHJpbmdQcm92aWRlciIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVsZXRlIGRpcj0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9YTWVzc2FnZVN0cmluZ1Byb3ZpZGVyIi8+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvcHkgdG9EaXI9InRhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvWFBheWxvYWRTb3VyY2VQcm92aWRlci8iPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2F4aXMyL2pheHdzL3htbGh0dHAvcHJvdmlkZXIvcGF5bG9hZC9zb3VyY2UvKi5jbGFzcyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJ0ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MveG1saHR0cC9wcm92aWRlci9wYXlsb2FkL3NvdXJjZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iTUVUQS1JTkYvKioiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJNRVRBLUlORi9zZXJ2aWNlcy54bWwiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb3B5PgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx6aXAgZGVzdGZpbGU9InRhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvWFBheWxvYWRTb3VyY2VQcm92aWRlci5qYXIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZWRpcj0iJHtwb20uYmFzZWRpcn0vdGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9YUGF5bG9hZFNvdXJjZVByb3ZpZGVyIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZWxldGUgZGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL1hQYXlsb2FkU291cmNlUHJvdmlkZXIiLz4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29weSB0b0Rpcj0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9YTWVzc2FnZVNvdXJjZVByb3ZpZGVyLyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9InRhcmdldC90ZXN0LWNsYXNzZXMiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvYXhpczIvamF4d3MveG1saHR0cC9wcm92aWRlci9tZXNzYWdlL3NvdXJjZS8qLmNsYXNzIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9InRlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy94bWxodHRwL3Byb3ZpZGVyL21lc3NhZ2Uvc291cmNlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJNRVRBLUlORi8qKiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9Ik1FVEEtSU5GL3NlcnZpY2VzLnhtbCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvcHk+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHppcCBkZXN0ZmlsZT0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9YTWVzc2FnZVNvdXJjZVByb3ZpZGVyLmphciIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlZGlyPSIke3BvbS5iYXNlZGlyfS90YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL1hNZXNzYWdlU291cmNlUHJvdmlkZXIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlbGV0ZSBkaXI9InRhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvWE1lc3NhZ2VTb3VyY2VQcm92aWRlciIvPgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3B5IHRvRGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL1hNZXNzYWdlRGF0YVNvdXJjZVByb3ZpZGVyLyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9InRhcmdldC90ZXN0LWNsYXNzZXMiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJvcmcvYXBhY2hlL2F4aXMyL2pheHdzL3htbGh0dHAvcHJvdmlkZXIvbWVzc2FnZS9kYXRhc291cmNlLyouY2xhc3MiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0idGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3htbGh0dHAvcHJvdmlkZXIvbWVzc2FnZS9kYXRhc291cmNlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJNRVRBLUlORi8qKiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9Ik1FVEEtSU5GL3NlcnZpY2VzLnhtbCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvcHk+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHppcCBkZXN0ZmlsZT0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9YTWVzc2FnZURhdGFTb3VyY2VQcm92aWRlci5qYXIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZWRpcj0iJHtwb20uYmFzZWRpcn0vdGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9YTWVzc2FnZURhdGFTb3VyY2VQcm92aWRlciIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVsZXRlIGRpcj0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9YTWVzc2FnZURhdGFTb3VyY2VQcm92aWRlciIvPgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBKYXZhIEJlYW4gRW5kcG9pbnQgU2FtcGxlcyAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29weSB0b0Rpcj0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9BZGRyZXNzQm9va1NlcnZpY2UvIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0idGFyZ2V0L3Rlc3QtY2xhc3NlcyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkcmVzc2Jvb2svKioiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0ib3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkcmVzc2Jvb2svTUVUQS1JTkYvc2VydmljZXMueG1sIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9InRlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkcmVzc2Jvb2siPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Ik1FVEEtSU5GLyoqIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iTUVUQS1JTkYvc2VydmljZXMueG1sIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29weT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHppcCBkZXN0ZmlsZT0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9BZGRyZXNzQm9va1NlcnZpY2UuamFyIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VkaXI9IiR7cG9tLmJhc2VkaXJ9L3RhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvQWRkcmVzc0Jvb2tTZXJ2aWNlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZWxldGUgZGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL0FkZHJlc3NCb29rU2VydmljZSIvPgotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvcHkgdG9EaXI9InRhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvQXBwbGVGaW5kZXJTZXJ2aWNlLyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9InRhcmdldC90ZXN0LWNsYXNzZXMiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvYXhpczIvamF4d3MvdHlwZV9zdWJzdGl0dXRpb24vKiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvYXhpczIvamF4d3MvdHlwZV9zdWJzdGl0dXRpb24vamF4d3MvKiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvcHk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx6aXAgZGVzdGZpbGU9InRhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvQXBwbGVGaW5kZXJTZXJ2aWNlLmphciIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlZGlyPSIke3BvbS5iYXNlZGlyfS90YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL0FwcGxlRmluZGVyU2VydmljZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVsZXRlIGRpcj0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9BcHBsZUZpbmRlclNlcnZpY2UiLz4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29weSB0b0Rpcj0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9NdG9tU2FtcGxlU2VydmljZS8iPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9tdG9tLyoqIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvbXRvbS9NRVRBLUlORi9zZXJ2aWNlcy54bWwiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJ0ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL210b20iPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Ik1FVEEtSU5GLyoqIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iTUVUQS1JTkYvc2VydmljZXMueG1sIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb3B5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8emlwIGRlc3RmaWxlPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL010b21TYW1wbGVTZXJ2aWNlLmphciIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlZGlyPSIke3BvbS5iYXNlZGlyfS90YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL010b21TYW1wbGVTZXJ2aWNlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZWxldGUgZGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL010b21TYW1wbGVTZXJ2aWNlIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3B5IHRvRGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL0RvY0xpdE5vbldyYXBTZXJ2aWNlLyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9InRhcmdldC90ZXN0LWNsYXNzZXMiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL25vbndyYXAvKioiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9ub253cmFwL01FVEEtSU5GL3NlcnZpY2VzLnhtbCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJ0ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL25vbndyYXAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Ik1FVEEtSU5GLyoqIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iTUVUQS1JTkYvc2VydmljZXMueG1sIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29weT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHppcCBkZXN0ZmlsZT0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9Eb2NMaXROb25XcmFwU2VydmljZS5qYXIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZWRpcj0iJHtwb20uYmFzZWRpcn0vdGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9Eb2NMaXROb25XcmFwU2VydmljZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVsZXRlIGRpcj0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9Eb2NMaXROb25XcmFwU2VydmljZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29weSB0b0Rpcj0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9Eb2NMaXRXcmFwU2VydmljZS8iPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS93cmFwLyoqIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvd3JhcC9NRVRBLUlORi9zZXJ2aWNlcy54bWwiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0idGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS93cmFwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJNRVRBLUlORi8qKiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9Ik1FVEEtSU5GL3NlcnZpY2VzLnhtbCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvcHk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx6aXAgZGVzdGZpbGU9InRhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvRG9jTGl0V3JhcFNlcnZpY2UuamFyIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VkaXI9IiR7cG9tLmJhc2VkaXJ9L3RhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvRG9jTGl0V3JhcFNlcnZpY2UiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlbGV0ZSBkaXI9InRhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvRG9jTGl0V3JhcFNlcnZpY2UiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvcHkgdG9EaXI9InRhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvQWRkTnVtYmVyc1NlcnZpY2UvIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0idGFyZ2V0L3Rlc3QtY2xhc3NlcyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkbnVtYmVycy8qKiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FkZG51bWJlcnMvTUVUQS1JTkYvc2VydmljZXMueG1sIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9InRlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkbnVtYmVycyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iTUVUQS1JTkYvKioiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJNRVRBLUlORi9zZXJ2aWNlcy54bWwiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb3B5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8emlwIGRlc3RmaWxlPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL0FkZE51bWJlcnNTZXJ2aWNlLmphciIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlZGlyPSIke3BvbS5iYXNlZGlyfS90YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL0FkZE51bWJlcnNTZXJ2aWNlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZWxldGUgZGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL0FkZE51bWJlcnNTZXJ2aWNlIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3B5IHRvRGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL0FkZE51bWJlcnNIYW5kbGVyU2VydmljZS8iPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hZGRudW1iZXJzaGFuZGxlci8qKiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJvcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hZGRudW1iZXJzaGFuZGxlci9NRVRBLUlORi9zZXJ2aWNlcy54bWwiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0idGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hZGRudW1iZXJzaGFuZGxlciI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iTUVUQS1JTkYvKioiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJNRVRBLUlORi9zZXJ2aWNlcy54bWwiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb3B5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8emlwIGRlc3RmaWxlPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL0FkZE51bWJlcnNIYW5kbGVyU2VydmljZS5qYXIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZWRpcj0iJHtwb20uYmFzZWRpcn0vdGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9BZGROdW1iZXJzSGFuZGxlclNlcnZpY2UiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlbGV0ZSBkaXI9InRhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvQWRkTnVtYmVyc0hhbmRsZXJTZXJ2aWNlIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3B5IHRvRGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL0dyZWV0ZXJTZXJ2aWNlLyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9InRhcmdldC90ZXN0LWNsYXNzZXMiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2Rsd21pbi8qKiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2Rsd21pbi9NRVRBLUlORi9zZXJ2aWNlcy54bWwiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0idGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9kbHdtaW4iPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Ik1FVEEtSU5GLyoqIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iTUVUQS1JTkYvc2VydmljZXMueG1sIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29weT4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8emlwIGRlc3RmaWxlPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL0dyZWV0ZXJTZXJ2aWNlLmphciIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlZGlyPSIke3BvbS5iYXNlZGlyfS90YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL0dyZWV0ZXJTZXJ2aWNlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZWxldGUgZGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL0dyZWV0ZXJTZXJ2aWNlIi8+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvcHkgdG9EaXI9InRhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvQXN5bmNTZXJ2aWNlLyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9InRhcmdldC90ZXN0LWNsYXNzZXMiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL3BhcmFsbGVsYXN5bmMvKioiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0ib3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvcGFyYWxsZWxhc3luYy9zZXJ2ZXIvTUVUQS1JTkYvc2VydmljZXMueG1sIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9InRlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvcGFyYWxsZWxhc3luYy9zZXJ2ZXIiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Ik1FVEEtSU5GLyoqIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iTUVUQS1JTkYvc2VydmljZXMueG1sIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29weT4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8emlwIGRlc3RmaWxlPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL0FzeW5jU2VydmljZS5qYXIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZWRpcj0iJHtwb20uYmFzZWRpcn0vdGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9Bc3luY1NlcnZpY2UiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlbGV0ZSBkaXI9InRhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvQXN5bmNTZXJ2aWNlIi8+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvcHkgdG9EaXI9InRhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvQXN5bmNTZXJ2aWNlMi8iPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hc3luY2RvY2xpdC8qKiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJvcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hc3luY2RvY2xpdC9zZXJ2ZXIvTUVUQS1JTkYvc2VydmljZXMueG1sIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9InRlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYXN5bmNkb2NsaXQvc2VydmVyIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJNRVRBLUlORi8qKiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9Ik1FVEEtSU5GL3NlcnZpY2VzLnhtbCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvcHk+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHppcCBkZXN0ZmlsZT0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9Bc3luY1NlcnZpY2UyLmphciIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlZGlyPSIke3BvbS5iYXNlZGlyfS90YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL0FzeW5jU2VydmljZTIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlbGV0ZSBkaXI9InRhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvQXN5bmNTZXJ2aWNlMiIvPgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3B5IHRvRGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL0ZhdWx0eVdlYlNlcnZpY2VTZXJ2aWNlLyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9InRhcmdldC90ZXN0LWNsYXNzZXMiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2ZhdWx0cy8qKiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2ZhdWx0cy9NRVRBLUlORi9zZXJ2aWNlcy54bWwiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0idGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9mYXVsdHMiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Ik1FVEEtSU5GLyoqIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iTUVUQS1JTkYvc2VydmljZXMueG1sIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29weT4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8emlwIGRlc3RmaWxlPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL0ZhdWx0eVdlYlNlcnZpY2VTZXJ2aWNlLmphciIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlZGlyPSIke3BvbS5iYXNlZGlyfS90YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL0ZhdWx0eVdlYlNlcnZpY2VTZXJ2aWNlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZWxldGUgZGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL0ZhdWx0eVdlYlNlcnZpY2VTZXJ2aWNlIi8+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvcHkgdG9EaXI9InRhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvRmF1bHRzU2VydmljZS8iPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9mYXVsdHNzZXJ2aWNlLyoqIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9Im9yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2ZhdWx0c3NlcnZpY2UvTUVUQS1JTkYvc2VydmljZXMueG1sIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9InRlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvZmF1bHRzc2VydmljZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iTUVUQS1JTkYvKioiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJNRVRBLUlORi9zZXJ2aWNlcy54bWwiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb3B5PgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx6aXAgZGVzdGZpbGU9InRhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvRmF1bHRzU2VydmljZS5qYXIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZWRpcj0iJHtwb20uYmFzZWRpcn0vdGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9GYXVsdHNTZXJ2aWNlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZWxldGUgZGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL0ZhdWx0c1NlcnZpY2UiLz4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29weSB0b0Rpcj0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9CYXJlRG9jTGl0U2VydmljZS8iPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9kb2NsaXRiYXJlLyoqIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvZG9jbGl0YmFyZS9NRVRBLUlORi9zZXJ2aWNlcy54bWwiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0idGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9kb2NsaXRiYXJlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJNRVRBLUlORi8qKiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9Ik1FVEEtSU5GL3NlcnZpY2VzLnhtbCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvcHk+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHppcCBkZXN0ZmlsZT0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9CYXJlRG9jTGl0U2VydmljZS5qYXIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZWRpcj0iJHtwb20uYmFzZWRpcn0vdGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9CYXJlRG9jTGl0U2VydmljZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVsZXRlIGRpcj0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9CYXJlRG9jTGl0U2VydmljZSIvPgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3B5IHRvRGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL0VjaG9NZXNzYWdlU2VydmljZS8iPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2F4aXMyL2pheHdzL25vbmFub255bW91cy9jb21wbGV4dHlwZS8qKiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJvcmcvYXBhY2hlL2F4aXMyL2pheHdzL25vbmFub255bW91cy9jb21wbGV4dHlwZS9NRVRBLUlORi9zZXJ2aWNlcy54bWwiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0idGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL25vbmFub255bW91cy9jb21wbGV4dHlwZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iTUVUQS1JTkYvKioiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJNRVRBLUlORi9zZXJ2aWNlcy54bWwiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb3B5PgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx6aXAgZGVzdGZpbGU9InRhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvRWNob01lc3NhZ2VTZXJ2aWNlLmphciIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlZGlyPSIke3BvbS5iYXNlZGlyfS90YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL0VjaG9NZXNzYWdlU2VydmljZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVsZXRlIGRpcj0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9FY2hvTWVzc2FnZVNlcnZpY2UiLz4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29weSB0b0Rpcj0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9SZXNvdXJjZUluamVjdGlvblNlcnZpY2UvIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0idGFyZ2V0L3Rlc3QtY2xhc3NlcyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvcmVzb3VyY2VpbmplY3Rpb24vKioiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9yZXNvdXJjZWluamVjdGlvbi9NRVRBLUlORi9zZXJ2aWNlcy54bWwiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0idGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9yZXNvdXJjZWluamVjdGlvbiI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iTUVUQS1JTkYvKioiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJNRVRBLUlORi9zZXJ2aWNlcy54bWwiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb3B5PgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx6aXAgZGVzdGZpbGU9InRhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvUmVzb3VyY2VJbmplY3Rpb25TZXJ2aWNlLmphciIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlZGlyPSIke3BvbS5iYXNlZGlyfS90YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL1Jlc291cmNlSW5qZWN0aW9uU2VydmljZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVsZXRlIGRpcj0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9SZXNvdXJjZUluamVjdGlvblNlcnZpY2UiLz4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29weSB0b0Rpcj0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9BbnlUeXBlTWVzc2FnZVNlcnZpY2UvIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0idGFyZ2V0L3Rlc3QtY2xhc3NlcyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9heGlzMi9qYXh3cy9hbnl0eXBlLyoqIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9heGlzMi9qYXh3cy9hbnl0eXBlL01FVEEtSU5GL3NlcnZpY2VzLnhtbCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJ0ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvYW55dHlwZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iTUVUQS1JTkYvKioiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJNRVRBLUlORi9zZXJ2aWNlcy54bWwiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb3B5PgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx6aXAgZGVzdGZpbGU9InRhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvQW55VHlwZU1lc3NhZ2VTZXJ2aWNlLmphciIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlZGlyPSIke3BvbS5iYXNlZGlyfS90YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL0FueVR5cGVNZXNzYWdlU2VydmljZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVsZXRlIGRpcj0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9BbnlUeXBlTWVzc2FnZVNlcnZpY2UiLz4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29weSB0b0Rpcj0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9NZXNzYWdlQ29udGV4dFNlcnZpY2UvIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0idGFyZ2V0L3Rlc3QtY2xhc3NlcyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jb250ZXh0LyoqIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jb250ZXh0L01FVEEtSU5GL3NlcnZpY2VzLnhtbCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJ0ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvY29udGV4dCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iTUVUQS1JTkYvKioiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJNRVRBLUlORi9zZXJ2aWNlcy54bWwiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb3B5PgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx6aXAgZGVzdGZpbGU9InRhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvTWVzc2FnZUNvbnRleHRTZXJ2aWNlLmphciIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlZGlyPSIke3BvbS5iYXNlZGlyfS90YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL01lc3NhZ2VDb250ZXh0U2VydmljZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVsZXRlIGRpcj0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9NZXNzYWdlQ29udGV4dFNlcnZpY2UiLz4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29weSB0b0Rpcj0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9Qb2x5bW9ycGhpY1NoYXBlU2VydmljZS8iPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2F4aXMyL2pheHdzL3BvbHltb3JwaGljL3NoYXBlLyoqIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wb2x5bW9ycGhpYy9zaGFwZS9NRVRBLUlORi9zZXJ2aWNlcy54bWwiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0idGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3BvbHltb3JwaGljL3NoYXBlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJNRVRBLUlORi8qKiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9Ik1FVEEtSU5GL3NlcnZpY2VzLnhtbCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvcHk+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHppcCBkZXN0ZmlsZT0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9Qb2x5bW9ycGhpY1NoYXBlU2VydmljZS5qYXIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZWRpcj0iJHtwb20uYmFzZWRpcn0vdGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9Qb2x5bW9ycGhpY1NoYXBlU2VydmljZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVsZXRlIGRpcj0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9Qb2x5bW9ycGhpY1NoYXBlU2VydmljZSIvPgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3B5IHRvRGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL1JQQ0xpdEVudW1TZXJ2aWNlLyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9InRhcmdldC90ZXN0LWNsYXNzZXMiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvYXhpczIvamF4d3MvcnBjbGl0L2VudW10eXBlLyoqIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9heGlzMi9qYXh3cy9ycGNsaXQvZW51bXR5cGUvTUVUQS1JTkYvc2VydmljZXMueG1sIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9InRlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9ycGNsaXQvZW51bXR5cGUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Ik1FVEEtSU5GLyoqIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iTUVUQS1JTkYvc2VydmljZXMueG1sIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29weT4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8emlwIGRlc3RmaWxlPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL1JQQ0xpdEVudW1TZXJ2aWNlLmphciIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlZGlyPSIke3BvbS5iYXNlZGlyfS90YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL1JQQ0xpdEVudW1TZXJ2aWNlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZWxldGUgZGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL1JQQ0xpdEVudW1TZXJ2aWNlIi8+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvcHkgdG9EaXI9InRhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvUlBDTGl0U3RyaW5nQXJyYXlTZXJ2aWNlLyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9InRhcmdldC90ZXN0LWNsYXNzZXMiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvYXhpczIvamF4d3MvcnBjbGl0L3N0cmluZ2FycmF5LyoqIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9Im9yZy9hcGFjaGUvYXhpczIvamF4d3MvcnBjbGl0L3N0cmluZ2FycmF5L01FVEEtSU5GL3NlcnZpY2VzLnhtbCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy90ZXN0L3JwY2xpdC9zdHJpbmdhcnJheS8qKiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJ0ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcnBjbGl0L3N0cmluZ2FycmF5LyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iTUVUQS1JTkYvKioiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJNRVRBLUlORi9zZXJ2aWNlcy54bWwiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb3B5PgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx6aXAgZGVzdGZpbGU9InRhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvUlBDTGl0U3RyaW5nQXJyYXlTZXJ2aWNlLmphciIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlZGlyPSIke3BvbS5iYXNlZGlyfS90YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL1JQQ0xpdFN0cmluZ0FycmF5U2VydmljZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVsZXRlIGRpcj0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9SUENMaXRTdHJpbmdBcnJheVNlcnZpY2UiLz4KLQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3B5IHRvRGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL0JhcmVEb2NMaXRNaW5TZXJ2aWNlLyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9InRhcmdldC90ZXN0LWNsYXNzZXMiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2RvY2xpdGJhcmVtaW4vKioiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0ib3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvZG9jbGl0YmFyZW1pbi9NRVRBLUlORi9zZXJ2aWNlcy54bWwiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0idGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9kb2NsaXRiYXJlbWluLyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iTUVUQS1JTkYvKioiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJNRVRBLUlORi9zZXJ2aWNlcy54bWwiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb3B5PgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx6aXAgZGVzdGZpbGU9InRhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvQmFyZURvY0xpdE1pblNlcnZpY2UuamFyIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VkaXI9IiR7cG9tLmJhc2VkaXJ9L3RhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvQmFyZURvY0xpdE1pblNlcnZpY2UiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlbGV0ZSBkaXI9InRhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvQmFyZURvY0xpdE1pblNlcnZpY2UiLz4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29weSB0b0Rpcj0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9TdHJpbmdMaXN0U2VydmljZS8iPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9zdHJpbmdsaXN0LyoqIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9InRlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvc3RyaW5nbGlzdC8iPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Ik1FVEEtSU5GLyoqIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29weT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHppcCBkZXN0ZmlsZT0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9TdHJpbmdMaXN0U2VydmljZS5qYXIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZWRpcj0iJHtwb20uYmFzZWRpcn0vdGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9TdHJpbmdMaXN0U2VydmljZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVsZXRlIGRpcj0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9TdHJpbmdMaXN0U2VydmljZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkJCQkJCQkJPGNvcHkgdG9EaXI9InRhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvU09BUEJpbmRpbmdQcm92aWRlclNlcnZpY2UvIj4KLQkJCQkJCQkJCTxmaWxlc2V0IGRpcj0idGFyZ2V0L3Rlc3QtY2xhc3NlcyI+Ci0JCQkJCQkJCQkgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyL3NvYXBiaW5kaW5nL1NPQVBCaW5kaW5nUHJvdmlkZXIqKiIvPgotCQkJCQkJCQkJICAgPGV4Y2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9zb2FwYmluZGluZy9NRVRBLUlORi9zZXJ2aWNlcy54bWwiIC8+Ci0JCQkJCQkJCQk8L2ZpbGVzZXQ+Ci0JCQkJCQkJCQk8ZmlsZXNldCBkaXI9InRlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9zb2FwYmluZGluZyI+Ci0JCQkJCQkJCQkgICA8aW5jbHVkZSBuYW1lPSJNRVRBLUlORi8qKiIvPgotCQkJCQkJCQkJICAgPGV4Y2x1ZGUgbmFtZSA9ICJzZXJ2aWNlcy54bWwiIC8+Ci0JCQkJCQkJCQk8L2ZpbGVzZXQ+Ci0JCQkJCQkJCTwvY29weT4KLQkJCQkJCQkJPHppcCBkZXN0ZmlsZT0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9TT0FQQmluZGluZ1Byb3ZpZGVyU2VydmljZS5qYXIiCi0JCQkJCQkgICAgICAgICAgICAgYmFzZWRpcj0iJHtwb20uYmFzZWRpcn0vdGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9TT0FQQmluZGluZ1Byb3ZpZGVyU2VydmljZSIKLQkJCQkJCSAgICAgICAgLz4KLQkJCQkJCSAgICAgICAgCi0JCQkJCQkgICAgICAgIDxkZWxldGUgZGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL1NPQVBCaW5kaW5nUHJvdmlkZXJTZXJ2aWNlIi8+Ci0JCQkJCQkgICAgICAgIAotCQkJCQkJCQk8Y29weSB0b0Rpcj0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9TT0FQQmluZGluZ1N0cmluZ1Byb3ZpZGVyU2VydmljZS8iPgotCQkJCQkJCQkJPGZpbGVzZXQgZGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzIj4KLQkJCQkJCQkJCSAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvc29hcGJpbmRpbmcvc3RyaW5nLyoqIi8+Ci0JCQkJCQkJCQkgICA8ZXhjbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyL3NvYXBiaW5kaW5nL3N0cmluZy9NRVRBLUlORi9zZXJ2aWNlcy54bWwiIC8+Ci0JCQkJCQkJCQk8L2ZpbGVzZXQ+Ci0JCQkJCQkJCQk8ZmlsZXNldCBkaXI9InRlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9zb2FwYmluZGluZy9zdHJpbmciPgotCQkJCQkJCQkJICAgPGluY2x1ZGUgbmFtZT0iTUVUQS1JTkYvKioiLz4KLQkJCQkJCQkJCSAgICA8ZXhjbHVkZSBuYW1lID0gInNlcnZpY2VzLnhtbCIgLz4KLQkJCQkJCQkJCTwvZmlsZXNldD4KLQkJCQkJCQkJPC9jb3B5PgotCQkJCQkJCQkKLQkJCQkJCQkJPHppcCBkZXN0ZmlsZT0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9TT0FQQmluZGluZ1N0cmluZ1Byb3ZpZGVyU2VydmljZS5qYXIiCi0JCQkJCQkgICAgICAgICAgICAgYmFzZWRpcj0iJHtwb20uYmFzZWRpcn0vdGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9TT0FQQmluZGluZ1N0cmluZ1Byb3ZpZGVyU2VydmljZSIKLQkJCQkJCSAgICAgICAgLz4KLQkJCQkJCSAgICAgICAgPGRlbGV0ZSBkaXI9InRhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvU09BUEJpbmRpbmdTdHJpbmdQcm92aWRlclNlcnZpY2UiLz4KLQkJCQkJCSAgICAgICAgCi0JCQkJCQkJCTxjb3B5IHRvRGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL1NvYXBNZXNzYWdlUHJvdmlkZXJTZXJ2aWNlLyI+Ci0JCQkJCQkJCQk8ZmlsZXNldCBkaXI9InRhcmdldC90ZXN0LWNsYXNzZXMiPgotCQkJCQkJCQkJICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9zb2FwYmluZGluZy9zb2FwbXNnLyoqIi8+Ci0JCQkJCQkJCQkgICA8ZXhjbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyL3NvYXBiaW5kaW5nL3NvYXBtc2cvTUVUQS1JTkYvc2VydmljZXMueG1sIiAvPgotCQkJCQkJCQkJPC9maWxlc2V0PgotCQkJCQkJCQkJPGZpbGVzZXQgZGlyPSJ0ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvc29hcGJpbmRpbmcvc29hcG1zZyI+Ci0JCQkJCQkJCQkgICA8aW5jbHVkZSBuYW1lPSJNRVRBLUlORi8qKiIvPgotCQkJCQkJCQkJICAgIDxleGNsdWRlIG5hbWUgPSAic2VydmljZXMueG1sIiAvPgotCQkJCQkJCQkJPC9maWxlc2V0PgotCQkJCQkJCQk8L2NvcHk+Ci0JCQkJCQkJCTx6aXAgZGVzdGZpbGU9InRhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvU29hcE1lc3NhZ2VQcm92aWRlclNlcnZpY2UuamFyIgotCQkJCQkJICAgICAgICAgICAgIGJhc2VkaXI9IiR7cG9tLmJhc2VkaXJ9L3RhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvU29hcE1lc3NhZ2VQcm92aWRlclNlcnZpY2UiCi0JCQkJCQkgICAgICAgIC8+Ci0JCQkJCQkgICAgICAgIDxkZWxldGUgZGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL1NvYXBNZXNzYWdlUHJvdmlkZXJTZXJ2aWNlIi8+Ci0JCQkJCQkgICAgICAgIAotCQkJCQkJCQk8Y29weSB0b0Rpcj0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9IYW5kbGVySGVhZGVyU2VydmljZS8iPgotCQkJCQkJCQkJPGZpbGVzZXQgZGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzIj4KLQkJCQkJCQkJCSAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvYXhpczIvamF4d3MvaGFuZGxlci9oZWFkZXIvKioiLz4KLQkJCQkJCQkJCTwvZmlsZXNldD4KLQkJCQkJCQkJCTxmaWxlc2V0IGRpcj0idGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2hhbmRsZXIvaGVhZGVyIj4KLQkJCQkJCQkJCSAgIDxpbmNsdWRlIG5hbWU9Ik1FVEEtSU5GLyoqIi8+Ci0JCQkJCQkJCQkgICA8aW5jbHVkZSBuYW1lPSJoYW5kbGVyLnhtbCIvPgkJCQkJCQkJCSAgIAotCQkJCQkJCQkJPC9maWxlc2V0PgotCQkJCQkJCQkJCi0JCQkJCQkJCTwvY29weT4JCi0JCQkJCQkJCTwhLS0gV2UgaGF2ZSB0byBleHBsaWNpdGx5IGNvcHkgdGhlIHhtbCBmaWxlIHJlZmVyZWQgdG8gYnkgdGhlIGNsaWVudCBpbnRlcmZhY2UgSGFuZGxlckNoYWluIGFubm90YXRpb24gLS0+Ci0JCQkJCQkJCTxjb3B5IHRvRGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzLyI+Ci0JCQkJCQkJCQk8ZmlsZXNldCBkaXI9InRlc3QiPgotCQkJCQkJCQkJCTxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvYXhpczIvamF4d3MvaGFuZGxlci9oZWFkZXIvaGFuZGxlci54bWwiLz4KLQkJCQkJCQkJCTwvZmlsZXNldD4KLQkJCQkJCQkJPC9jb3B5PgotCQkJCQkJCQkKLQkJCQkJCQkJPHppcCBkZXN0ZmlsZT0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9IYW5kbGVySGVhZGVyU2VydmljZS5qYXIiCi0JCQkJCQkJCQliYXNlZGlyPSIke3BvbS5iYXNlZGlyfS90YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL0hhbmRsZXJIZWFkZXJTZXJ2aWNlIgotCQkJCQkJCQkvPgotCQkJCQkJCQk8ZGVsZXRlIGRpcj0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9IYW5kbGVySGVhZGVyU2VydmljZSIvPgotCQkJCQkJCQkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvcHkgdG9EaXI9InRhcmdldC90ZXN0LWNsYXNzZXMvIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0idGVzdC1yZXNvdXJjZXMvIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLnByb3BlcnRpZXMiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi9heGlzMi54bWwiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb3B5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFza3M+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+cnVuPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmJ1aWxkLWhlbHBlci1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+YWRkLXRlc3Qtc291cmNlPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wcm9jZXNzLXRlc3QtcmVzb3VyY2VzPC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5hZGQtdGVzdC1zb3VyY2U8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNvdXJjZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzb3VyY2U+JHtiYXNlZGlyfS90YXJnZXQvc2NoZW1hL3NyYzwvc291cmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc291cmNlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHNraXA+ZmFsc2U8L3NraXA+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+Li90YXJnZXQvY2xpZW50LXJlcG88L3ZhbHVlPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KLSAgICAgICAgICAgICAgICAgICAgPC9zeXN0ZW1Qcm9wZXJ0aWVzPgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgPC9idWlsZD4KLSAgICA8cmVwb3J0aW5nPgotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXJlcG9ydC1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvcmVwb3J0aW5nPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvYXhpczIueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvYXhpczIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0N2JmMjQwLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL2F4aXMyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMxOCArMCwwIEBACi08IS0tDQotICB+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+DQotICAgICAgICA8bWVzc2FnZUJ1aWxkZXIgY29udGVudFR5cGU9Ii4qIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5idWlsZGVyLkRhdGFTb3VyY2VCdWlsZGVyIi8+DQotICAgICAgICA8IS0tTGVmdCBjb21tZW50ZWQgYmVjYXVzZSBpdCBhZGRzIHRoZSBkZXBhbmRhbmN5IG9mIHNlcnZsZXQtYXBpIHRvIG90aGVyIG1vZHVsZXMuDQotICAgICAgICBQbGVhc2UgdW5jb21tZW50IHRvIFJlY2VpdmUgbWVzc2FnZXMgaW4gbXVsdGlwYXJ0L2Zvcm0tZGF0YSBmb3JtYXQtLT4NCi0gICAgICAgIDwhLS08bWVzc2FnZUJ1aWxkZXIgY29udGVudFR5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiLS0+DQotICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS1jbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5idWlsZGVyLk11bHRpcGFydEZvcm1EYXRhQnVpbGRlciIvPi0tPg0KLSAgICA8L21lc3NhZ2VCdWlsZGVycz4NCi0NCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPg0KLSAgICA8IS0tIFRhcmdldCBSZXNvbHZlcnMgLS0+DQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4NCi0gICAgPCEtLSBVbmNvbW1lbnQgdGhlIGZvbGxvd2luZyBhbmQgc3BlY2lmeSB0aGUgY2xhc3MgbmFtZSBmb3IgeW91ciBUYXJnZXRSZXNvbHZlciB0byBhZGQgLS0+DQotICAgIDwhLS0gYSBUYXJnZXRSZXNvbHZlci4gVGFyZ2V0UmVzb2x2ZXJzIGFyZSB1c2VkIHRvIHByb2Nlc3MgdGhlIFRvIEVQUiBmb3IgZXhhbXBsZSB0byAtLT4NCi0gICAgPCEtLSBjaG9vc2UgYSBzZXJ2ZXIgaW4gYSBjbHVzdGVyIC0tPg0KLSAgICA8IS0tPHRhcmdldFJlc29sdmVycz4tLT4NCi0gICAgPCEtLTx0YXJnZXRSZXNvbHZlciBjbGFzcz0iIiAvPi0tPg0KLSAgICA8IS0tPC90YXJnZXRSZXNvbHZlcnM+LS0+DQotDQotDQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4NCi0gICAgPCEtLSBUcmFuc3BvcnQgSW5zIC0tPg0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+DQotICAgIDx0cmFuc3BvcnRSZWNlaXZlciBuYW1lPSJodHRwIg0KLSAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuU2ltcGxlSFRUUFNlcnZlciI+DQotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9InBvcnQiPjYwNjA8L3BhcmFtZXRlcj4NCi0gICAgICAgIDwhLS1JZiB5b3Ugd2FudCB0byBnaXZlIHlvdXIgb3duIGhvc3QgYWRkcmVzcyBmb3IgRVBSIGdlbmVyYXRpb24tLT4NCi0gICAgICAgIDwhLS11bmNvbW1lbnQgZm9sbG93aW5nIHBhcmFtZXRlciAsIGFuZCBzZXQgYXMgeW91IHJlcXVpcmVkLi0tPg0KLSAgICAgICAgPCEtLTxwYXJhbWV0ZXIgbmFtZT0iaG9zdG5hbWUiPmh0dHA6Ly9teUFwcC5jb20vd3M8L3BhcmFtZXRlcj4tLT4NCi0gICAgPC90cmFuc3BvcnRSZWNlaXZlcj4NCi0NCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPg0KLSAgICA8IS0tIFRyYW5zcG9ydCBPdXRzIC0tPg0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+DQotDQotICAgIDx0cmFuc3BvcnRTZW5kZXIgbmFtZT0ibG9jYWwiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0LmxvY2FsLkxvY2FsVHJhbnNwb3J0U2VuZGVyIi8+DQotICAgIDx0cmFuc3BvcnRTZW5kZXIgbmFtZT0iaHR0cCINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5Db21tb25zSFRUUFRyYW5zcG9ydFNlbmRlciI+DQotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9IlBST1RPQ09MIj5IVFRQLzEuMTwvcGFyYW1ldGVyPg0KLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJUcmFuc2Zlci1FbmNvZGluZyI+Y2h1bmtlZDwvcGFyYW1ldGVyPg0KLSAgICA8L3RyYW5zcG9ydFNlbmRlcj4NCi0gICAgPHRyYW5zcG9ydFNlbmRlciBuYW1lPSJodHRwcyINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5Db21tb25zSFRUUFRyYW5zcG9ydFNlbmRlciI+DQotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9IlBST1RPQ09MIj5IVFRQLzEuMTwvcGFyYW1ldGVyPg0KLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJUcmFuc2Zlci1FbmNvZGluZyI+Y2h1bmtlZDwvcGFyYW1ldGVyPg0KLSAgICA8L3RyYW5zcG9ydFNlbmRlcj4NCi0NCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPg0KLSAgICA8IS0tIFBoYXNlcyAgLS0+DQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4NCi0gICAgPHBoYXNlT3JkZXIgdHlwZT0iSW5GbG93Ij4NCi0gICAgICAgIDwhLS0gIFN5c3RlbSBwcmUtZGVmaW5lZCBwaGFzZXMgICAgICAgLS0+DQotICAgICAgICAgPHBoYXNlIG5hbWU9IlRyYW5zcG9ydCI+DQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5SZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIj4NCi0gICAgICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJUcmFuc3BvcnQiLz4NCi0gICAgICAgICAgICA8L2hhbmRsZXI+DQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIj4NCi0gICAgICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJUcmFuc3BvcnQiLz4NCi0gICAgICAgICAgICA8L2hhbmRsZXI+DQotICAgICAgICA8L3BoYXNlPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9IkFkZHJlc3NpbmciPg0KLSAgICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJBZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiPg0KLSAgICAgICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJBZGRyZXNzaW5nIi8+DQotICAgICAgICAgICAgPC9oYW5kbGVyPg0KLSAgICAgICAgPC9waGFzZT4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJTZWN1cml0eSIvPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9IlByZURpc3BhdGNoIi8+DQotICAgICAgICA8cGhhc2UgbmFtZT0iRGlzcGF0Y2giIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5EaXNwYXRjaFBoYXNlIj4NCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJSZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiPg0KLSAgICAgICAgICAgICAgICA8b3JkZXIgcGhhc2U9IkRpc3BhdGNoIi8+DQotICAgICAgICAgICAgPC9oYW5kbGVyPg0KLQ0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciI+DQotICAgICAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iRGlzcGF0Y2giLz4NCi0gICAgICAgICAgICA8L2hhbmRsZXI+DQotDQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5BZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIj4NCi0gICAgICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJEaXNwYXRjaCIvPg0KLSAgICAgICAgICAgIDwvaGFuZGxlcj4NCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJSZXF1ZXN0VVJJT3BlcmF0aW9uRGlzcGF0Y2hlciINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5SZXF1ZXN0VVJJT3BlcmF0aW9uRGlzcGF0Y2hlciI+DQotICAgICAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iRGlzcGF0Y2giLz4NCi0gICAgICAgICAgICA8L2hhbmRsZXI+DQotDQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciI+DQotICAgICAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iRGlzcGF0Y2giLz4NCi0gICAgICAgICAgICA8L2hhbmRsZXI+DQotDQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iSFRUUExvY2F0aW9uQmFzZWREaXNwYXRjaGVyIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLkhUVFBMb2NhdGlvbkJhc2VkRGlzcGF0Y2hlciI+DQotICAgICAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iRGlzcGF0Y2giLz4NCi0gICAgICAgICAgICA8L2hhbmRsZXI+DQotDQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iR2VuZXJpY1Byb3ZpZGVyRGlzcGF0Y2hlciINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kaXNwYXRjaGVycy5HZW5lcmljUHJvdmlkZXJEaXNwYXRjaGVyIj4NCi0gICAgICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJEaXNwYXRjaCIvPg0KLSAgICAgICAgICAgIDwvaGFuZGxlcj4NCi0NCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJNdXN0VW5kZXJzdGFuZFZhbGlkYXRpb25EaXNwYXRjaGVyIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRpc3BhdGNoZXJzLk11c3RVbmRlcnN0YW5kVmFsaWRhdGlvbkRpc3BhdGNoZXIiPg0KLSAgICAgICAgICAgICAgICA8b3JkZXIgcGhhc2U9IkRpc3BhdGNoIi8+DQotICAgICAgICAgICAgPC9oYW5kbGVyPg0KLSAgICAgICAgPC9waGFzZT4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJSTVBoYXNlIi8+DQotICAgICAgICA8IS0tICBTeXN0ZW0gcHJlIGRlZmluZWQgcGhhc2VzICAgICAgIC0tPg0KLSAgICAgICAgPCEtLSAgIEFmdGVyIFBvc3RkaXNwYXRjaCBwaGFzZSBtb2R1bGUgYXV0aG9yIG9yIG9yIHNlcnZpY2UgYXV0aG9yIGNhbiBhZGQgYW55IHBoYXNlIGhlIHdhbnQgICAgICAtLT4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJPcGVyYXRpb25JblBoYXNlIj4NCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTb2FwTWVzc2FnZU1VUHJvdmlkZXJDaGVja2VyIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnByb3ZpZGVyLlNvYXBNZXNzYWdlTVVQcm92aWRlckNoZWNrZXIiPg0KLSAgICAgICAgICAgICAgICA8b3JkZXIgcGhhc2U9Ik9wZXJhdGlvbkluUGhhc2UiLz4NCi0gICAgICAgICAgICA8L2hhbmRsZXI+DQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iTXVzdFVuZGVyc3RhbmRDaGVja2VyIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRpc3BhdGNoZXJzLk11c3RVbmRlcnN0YW5kQ2hlY2tlciI+DQotICAgICAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iT3BlcmF0aW9uSW5QaGFzZSIvPg0KLSAgICAgICAgICAgIDwvaGFuZGxlcj4NCi0gICAgICAgIDwvcGhhc2U+DQotICAgIDwvcGhhc2VPcmRlcj4NCi0gICAgPHBoYXNlT3JkZXIgdHlwZT0iT3V0RmxvdyI+DQotICAgICAgICA8IS0tICAgICAgdXNlciBjYW4gYWRkIGhpcyBvd24gcGhhc2VzIHRvIHRoaXMgYXJlYSAgLS0+DQotICAgICAgICA8cGhhc2UgbmFtZT0iT3BlcmF0aW9uT3V0UGhhc2UiPg0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IkRpc3BhdGNoT3BlcmF0aW9uSGFuZGxlciINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jbGllbnQuZGlzcGF0Y2guRGlzcGF0Y2hPcGVyYXRpb25IYW5kbGVyIj4NCi0gICAgICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJPcGVyYXRpb25PdXRQaGFzZSIvPg0KLSAgICAgICAgICAgIDwvaGFuZGxlcj4NCi0gICAgICAgIDwvcGhhc2U+DQotICAgICAgICA8IS0tc3lzdGVtIHByZWRlZmluZWQgcGhhc2UtLT4NCi0gICAgICAgIDwhLS10aGVzZSBwaGFzZSB3aWxsIHJ1biBpcnJlc3BlY3RpdmUgb2YgdGhlIHNlcnZpY2UtLT4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJSTVBoYXNlIi8+DQotICAgICAgICA8cGhhc2UgbmFtZT0iUG9saWN5RGV0ZXJtaW5hdGlvbiIvPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik1lc3NhZ2VPdXQiLz4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJTZWN1cml0eSIvPg0KLSAgICA8L3BoYXNlT3JkZXI+DQotICAgIDxwaGFzZU9yZGVyIHR5cGU9IkluRmF1bHRGbG93Ij4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJBZGRyZXNzaW5nIj4NCi0gICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5BZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIj4NCi0gICAgICAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iQWRkcmVzc2luZyIvPg0KLSAgICAgICAgICAgIDwvaGFuZGxlcj4NCi0gICAgICAgIDwvcGhhc2U+DQotICAgICAgICA8cGhhc2UgbmFtZT0iUHJlRGlzcGF0Y2giLz4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJEaXNwYXRjaCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkRpc3BhdGNoUGhhc2UiPg0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciI+DQotICAgICAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iRGlzcGF0Y2giLz4NCi0gICAgICAgICAgICA8L2hhbmRsZXI+DQotDQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIj4NCi0gICAgICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJEaXNwYXRjaCIvPg0KLSAgICAgICAgICAgIDwvaGFuZGxlcj4NCi0NCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJBZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiPg0KLSAgICAgICAgICAgICAgICA8b3JkZXIgcGhhc2U9IkRpc3BhdGNoIi8+DQotICAgICAgICAgICAgPC9oYW5kbGVyPg0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlJlcXVlc3RVUklPcGVyYXRpb25EaXNwYXRjaGVyIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklPcGVyYXRpb25EaXNwYXRjaGVyIj4NCi0gICAgICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJEaXNwYXRjaCIvPg0KLSAgICAgICAgICAgIDwvaGFuZGxlcj4NCi0NCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIj4NCi0gICAgICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJEaXNwYXRjaCIvPg0KLSAgICAgICAgICAgIDwvaGFuZGxlcj4NCi0NCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJIVFRQTG9jYXRpb25CYXNlZERpc3BhdGNoZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuSFRUUExvY2F0aW9uQmFzZWREaXNwYXRjaGVyIj4NCi0gICAgICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJEaXNwYXRjaCIvPg0KLSAgICAgICAgICAgIDwvaGFuZGxlcj4NCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJHZW5lcmljUHJvdmlkZXJEaXNwYXRjaGVyIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRpc3BhdGNoZXJzLkdlbmVyaWNQcm92aWRlckRpc3BhdGNoZXIiPg0KLSAgICAgICAgICAgICAgICA8b3JkZXIgcGhhc2U9IkRpc3BhdGNoIi8+DQotICAgICAgICAgICAgPC9oYW5kbGVyPg0KLQ0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9Ik11c3RVbmRlcnN0YW5kVmFsaWRhdGlvbkRpc3BhdGNoZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGlzcGF0Y2hlcnMuTXVzdFVuZGVyc3RhbmRWYWxpZGF0aW9uRGlzcGF0Y2hlciI+DQotICAgICAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iRGlzcGF0Y2giLz4NCi0gICAgICAgICAgICA8L2hhbmRsZXI+DQotICAgICAgICA8L3BoYXNlPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9IlJNUGhhc2UiLz4NCi0gICAgICAgIDwhLS0gICAgICB1c2VyIGNhbiBhZGQgaGlzIG93biBwaGFzZXMgdG8gdGhpcyBhcmVhICAtLT4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJPcGVyYXRpb25JblBoYXNlIj4NCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTb2FwTWVzc2FnZU1VUHJvdmlkZXJDaGVja2VyIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnByb3ZpZGVyLlNvYXBNZXNzYWdlTVVQcm92aWRlckNoZWNrZXIiPg0KLSAgICAgICAgICAgICAgICA8b3JkZXIgcGhhc2U9Ik9wZXJhdGlvbkluUGhhc2UiLz4NCi0gICAgICAgICAgICA8L2hhbmRsZXI+DQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iTXVzdFVuZGVyc3RhbmRDaGVja2VyIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRpc3BhdGNoZXJzLk11c3RVbmRlcnN0YW5kQ2hlY2tlciI+DQotICAgICAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iT3BlcmF0aW9uSW5QaGFzZSIvPg0KLSAgICAgICAgICAgIDwvaGFuZGxlcj4NCi0gICAgICAgIDwvcGhhc2U+DQotICAgIDwvcGhhc2VPcmRlcj4NCi0gICAgPHBoYXNlT3JkZXIgdHlwZT0iT3V0RmF1bHRGbG93Ij4NCi0gICAgICAgIDwhLS0gICAgICB1c2VyIGNhbiBhZGQgaGlzIG93biBwaGFzZXMgdG8gdGhpcyBhcmVhICAtLT4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJPcGVyYXRpb25PdXRGYXVsdFBoYXNlIi8+DQotICAgICAgICA8cGhhc2UgbmFtZT0iUk1QaGFzZSIvPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9IlBvbGljeURldGVybWluYXRpb24iLz4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJNZXNzYWdlT3V0Ii8+DQotICAgIDwvcGhhc2VPcmRlcj4NCi08L2F4aXNjb25maWc+DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvYXhpczJfYWRkcmVzc2luZy54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9heGlzMl9hZGRyZXNzaW5nLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzY0YTE1Ny4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9heGlzMl9hZGRyZXNzaW5nLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0NyArMCwwIEBACi08IS0tDQotICB+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+DQotICAgIDwhLS0tV2hlbiBjcmVhdGluZyBVUkwgQmFzZWQgY29uZmlndXJhdG9yIHdpdGggVVJMIGZpbGU6Ly8gLS0+DQotICAgIDwhLS0tIFdhciBiYXNlZCBjb25maWd1cmF0b3Igd2l0aCBleHBhbmRlZCBjYXNlICwgLS0+DQotDQotICAgIDwhLS1BbGwgdGhlIG90aGVyIHNjZW5hcmlvcyBpdCB3aWxsIGJlIGlnbm9yZWQuLS0+DQotICAgIDwhLS08cGFyYW1ldGVyIG5hbWU9IlNlcnZpY2VzRGlyZWN0b3J5Ij5zZXJ2aWNlPC9wYXJhbWV0ZXI+LS0+DQotICAgIDwhLS1UbyBvdmVycmlkZSByZXBvc2l0b3J5L21vZHVsZXMgeW91IG5lZWQgdG8gdW5jb21tZW50IGZvbGxvd2luZyBwYXJhbWV0ZXIgYW5kIHZhbHVlIFNIT1VMRCBiZSBhYnNvbHV0ZSBmaWxlIHBhdGgtLT4NCi0gICAgPCEtLTxwYXJhbWV0ZXIgbmFtZT0iTW9kdWxlc0RpcmVjdG9yeSI+bW9kdWxlczwvcGFyYW1ldGVyPi0tPg0KLQ0KLQ0KLQ0KLSAgICA8IS0tRm9sbG93aW5nIHBhcmFtcyB3aWxsIHNldCB0aGUgcHJvcGVyIGNvbnRleHQgcGF0aHMgZm9yIGludm9jYXRpb25zLiBBbGwgdGhlIGVuZHBvaW50cyB3aWxsIGhhdmUgYSBjb21tb25zIGNvbnRleHQtLT4NCi0gICAgPCEtLXJvb3Qgd2hpY2ggY2FuIGNvbmZpZ3VyZWQgdXNpbmcgdGhlIGZvbGxvd2luZyBjb250ZXh0Um9vdCBwYXJhbWV0ZXItLT4NCi0gICAgPCEtLTxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dFJvb3QiPmF4aXMyPC9wYXJhbWV0ZXI+LS0+DQotDQotICAgIDwhLS1PdXIgSFRUUCBlbmRwb2ludHMgY2FuIGhhbmRsZSBib3RoIFJFU1QgYW5kIFNPQVAuIEZvbGxvd2luZyBwYXJhbWV0ZXJzIGNhbiBiZSB1c2VkIHRvIGRpc3Rpbmd1aXVzaCB0aG9zZSBlbmRwb2ludHMtLT4NCi0gICAgPCEtLUluIGNhc2Ugb2YgYSBzZXJ2bGV0LCBpZiB5b3UgY2hhbmdlIHRoaXMgeW91IGhhdmUgdG8gbWFudWFsbHkgY2hhbmdlIHRoZSBzZXR0aW5ncyBvZiB5b3VyIHNlcnZsZXQgY29udGFpbmVyIHRvIG1hcCB0aGlzIC0tPg0KLSAgICA8IS0tY29udGV4dCBwYXRoIHRvIHByb3BlciBBeGlzMiBzZXJ2bGV0cy0tPg0KLSAgICA8IS0tPHBhcmFtZXRlciBuYW1lPSJzZXJ2aWNlUGF0aCI+c2VydmljZXM8L3BhcmFtZXRlcj4tLT4NCi0gICAgPCEtLTxwYXJhbWV0ZXIgbmFtZT0icmVzdFBhdGgiPnJlc3Q8L3BhcmFtZXRlcj4tLT4NCi0NCi0gICAgPCEtLSBGb2xsb3dpbmcgcGFyYW1ldGVyIHdpbGwgY29tcGxldGVseSBkaXNhYmxlIFJFU1QgaGFuZGxpbmcgaW4gQXhpczItLT4NCi0gICAgPHBhcmFtZXRlciBuYW1lPSJkaXNhYmxlUkVTVCIgbG9ja2VkPSJ0cnVlIj5mYWxzZTwvcGFyYW1ldGVyPg0KLSAgICANCi0gICAgPCEtLSBGb2xsb3dpbmcgcGFyYW1ldGVyIHdpbGwgc3VwcHJlc3MgZ2VuZXJhdGlvbiBvZiBTT0FQIDEuMiBiaW5kaW5ncyBpbiBhdXRvLWdlbmVyYXRlZCBXU0RMIGZpbGVzIC0tPg0KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImRpc2FibGVTT0FQMTIiIGxvY2tlZD0idHJ1ZSI+ZmFsc2U8L3BhcmFtZXRlcj4NCi0NCi0gICAgPCEtLVBPSk8gZGVwbG95ZXIgLCB0aGlzIHdpbGwgYWxvdyB1c2VycyB0byBkcm9wIC5jbGFzcyBmaWxlIGFuZCBtYWtlIHRoYXQgaW50byBhIHNlcnZpY2UtLT4NCi0gICAgPGRlcGxveWVyIGV4dGVuc2lvbj0iLmNsYXNzIiBkaXJlY3Rvcnk9InBvam8iIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQuUE9KT0RlcGxveWVyIi8+DQotICAgIDxkZXBsb3llciBleHRlbnNpb249Ii5qYXIiIGRpcmVjdG9yeT0ic2VydmljZWphcnMiIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmZyYW1ld29yay5KQVhXU0RlcGxveWVyIi8+DQotDQotICAgIDwhLS08ZGVwbG95ZXIgZXh0ZW5zaW9uPSIuanNhIiBkaXJlY3Rvcnk9InJtaXNlcnZpY2VzIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5ybWkuZGVwbG95LlJNSVNlcnZpY2VEZXBsb3llciIvPi0tPg0KLSAgICANCi0NCi0gICAgPCEtLSBGb2xsb3dpbmcgcGFyYW1ldGVyIHdpbGwgc2V0IHRoZSBob3N0IG5hbWUgZm9yIHRoZSBlcHItLT4NCi0gICAgPCEtLTxwYXJhbWV0ZXIgbmFtZT0iaG9zdG5hbWUiIGxvY2tlZD0idHJ1ZSI+bXlob3N0LmNvbTwvcGFyYW1ldGVyPi0tPg0KLQ0KLSAgICA8IS0tIElmIHlvdSBoYXZlIGEgZnJvbnQgZW5kIGhvc3Qgd2hpY2ggZXhwb3NlcyB0aGlzIHdlYnNlcnZpY2UgdXNpbmcgYSBkaWZmZXJlbnQgcHVibGljIFVSTCAgLS0+DQotICAgIDwhLS0gdXNlIHRoaXMgcGFyYW1ldGVyIHRvIG92ZXJyaWRlIGF1dG9kZXRlY3RlZCB1cmwgLS0+DQotICAgIDwhLS08cGFyYW1ldGVyIG5hbWU9Imh0dHBGcm9udGVuZEhvc3RVcmwiPmh0dHBzOi8vc29tZW90aGVyaG9zdC9jb250ZXh0PC9wYXJhbWV0ZXI+LS0+DQotDQotDQotICAgIDwhLS0gICAgVGhlIHdheSBvZiBhZGRpbmcgbGlzdGVuZXIgdG8gdGhlIHN5c3RlbS0tPg0KLSAgICA8IS0tICAgIDxsaXN0ZW5lciBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5PYnNlcnZlcklNUEwiPi0tPg0KLSAgICA8IS0tICAgICAgICA8cGFyYW1ldGVyIG5hbWU9IlJTU19VUkwiPmh0dHA6Ly8xMjcuMC4wLjEvcnNzPC9wYXJhbWV0ZXI+LS0+DQotICAgIDwhLS0gICAgPC9saXN0ZW5lcj4tLT4NCi0gICAgDQotICAgIDx0aHJlYWRDb250ZXh0TWlncmF0b3JzPg0KLSAgICAgICAgPHRocmVhZENvbnRleHRNaWdyYXRvciBsaXN0SWQ9IkpBWFdTLVRocmVhZENvbnRleHRNaWdyYXRvci1MaXN0IiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5hZGRyZXNzaW5nLm1pZ3JhdG9yLkVuZHBvaW50Q29udGV4dE1hcE1pZ3JhdG9yIi8+DQotICAgIDwvdGhyZWFkQ29udGV4dE1pZ3JhdG9ycz4NCi0NCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPg0KLSAgICA8IS0tIE1lc3NhZ2UgUmVjZWl2ZXJzIC0tPg0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+DQotICAgIDwhLS1UaGlzIGlzIHRoZSBkZWFmdWx0IE1lc3NhZ2VSZWNlaXZlciBmb3IgdGhlIHN5c3RlbSAsIGlmIHlvdSB3YW50IHRvIGhhdmUgTWVzc2FnZVJlY2VpdmVycyBmb3IgLS0+DQotICAgIDwhLS1hbGwgdGhlIG90aGVyIE1FUCBpbXBsZW1lbnQgaXQgYW5kIGFkZCB0aGUgY29ycmVjdCBlbnRyeSB0byBoZXJlICwgc28gdGhhdCB5b3UgY2FuIHJlZmVyIGZyb20tLT4NCi0gICAgPCEtLWFueSBvcGVyYXRpb24gLS0+DQotICAgIDwhLS1Ob3RlIDogWW91IGNhbiBvdnJyaWRlIHRoaXMgZm9yIGEgcGFydGljdWxhciBzZXJ2aWNlIGJ5IGFkZGluZyB0aGUgc2FtZSBlbGVtZW50IHdpdGggeW91ciByZXF1aXJlbWVudC0tPg0KLSAgICAgPG1lc3NhZ2VSZWNlaXZlcnM+DQotICAgICAgICA8bWVzc2FnZVJlY2VpdmVyIG1lcD0iaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC93c2RsL2luLW9ubHkiDQotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5SYXdYTUxJTk9ubHlNZXNzYWdlUmVjZWl2ZXIiLz4NCi0gICAgICAgIDxtZXNzYWdlUmVjZWl2ZXIgbWVwPSJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaW4tb3V0Ig0KLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuUmF3WE1MSU5PdXRNZXNzYWdlUmVjZWl2ZXIiLz4NCi0gICAgICAgIDxtZXNzYWdlUmVjZWl2ZXIgbWVwPSJodHRwOi8vd3d3LnczLm9yZy8yMDA2LzAxL3dzZGwvaW4tb25seSINCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLlJhd1hNTElOT25seU1lc3NhZ2VSZWNlaXZlciIvPg0KLSAgICAgICAgPG1lc3NhZ2VSZWNlaXZlciBtZXA9Imh0dHA6Ly93d3cudzMub3JnLzIwMDYvMDEvd3NkbC9pbi1vdXQiDQotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5SYXdYTUxJTk91dE1lc3NhZ2VSZWNlaXZlciIvPg0KLSAgICA8L21lc3NhZ2VSZWNlaXZlcnM+DQotDQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4NCi0gICAgPCEtLSBNZXNzYWdlIEZvcm1hdHRlciAtLT4NCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPg0KLSAgICA8IS0tRm9sbG93aW5nIGNvbnRlbnQgdHlwZSB0byBtZXNzYWdlIGZvcm1hdHRlciBtYXBwaW5nIGNhbiBiZSB1c2VkIHRvIGltcGxlbWVudCBzdXBwb3J0IGZvciBkaWZmZXJlbnQgbWVzc2FnZSAtLT4NCi0gICAgPCEtLWZvcm1hdCAgc2VyaWFsaXphdGlvbiBpbiBBeGlzMi4gVGhlc2UgbWVzc2FnZSBmb3JtYXRzIGFyZSBleHBlY3RlZCB0byBiZSByZXNvbHZlZCBiYXNlZCBvbiB0aGUgY29udGVudCB0eXBlLiAtLT4NCi0gICAgPG1lc3NhZ2VGb3JtYXR0ZXJzPg0KLSAgICAgICAgPG1lc3NhZ2VGb3JtYXR0ZXIgY29udGVudFR5cGU9ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCINCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuWEZvcm1VUkxFbmNvZGVkRm9ybWF0dGVyIi8+DQotICAgICAgICA8bWVzc2FnZUZvcm1hdHRlciBjb250ZW50VHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSINCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuTXVsdGlwYXJ0Rm9ybURhdGFGb3JtYXR0ZXIiLz4NCi0gICAgICAgIDxtZXNzYWdlRm9ybWF0dGVyIGNvbnRlbnRUeXBlPSJhcHBsaWNhdGlvbi94bWwiDQotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkFwcGxpY2F0aW9uWE1MRm9ybWF0dGVyIi8+DQotICAgICAgICA8bWVzc2FnZUZvcm1hdHRlciBjb250ZW50VHlwZT0idGV4dC94bWwiDQotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLlNPQVBNZXNzYWdlRm9ybWF0dGVyIi8+DQotICAgICAgICA8bWVzc2FnZUZvcm1hdHRlciBjb250ZW50VHlwZT0iYXBwbGljYXRpb24vc29hcCt4bWwiDQotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLlNPQVBNZXNzYWdlRm9ybWF0dGVyIi8+DQotICAgIDwvbWVzc2FnZUZvcm1hdHRlcnM+DQotDQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4NCi0gICAgPCEtLSBNZXNzYWdlIEJ1aWxkZXJzIC0tPg0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+DQotICAgIDwhLS1Gb2xsb3dpbmcgY29udGVudCB0eXBlIHRvIGJ1aWxkZXIgbWFwcGluZyBjYW4gYmUgdXNlZCB0byBpbXBsZW1lbnQgc3VwcG9ydCBmb3IgZGlmZmVyZW50IG1lc3NhZ2UgLS0+DQotICAgIDwhLS1mb3JtYXRzIGluIEF4aXMyLiBUaGVzZSBtZXNzYWdlIGZvcm1hdHMgYXJlIGV4cGVjdGVkIHRvIGJlIHJlc29sdmVkIGJhc2VkIG9uIHRoZSBjb250ZW50IHR5cGUuIC0tPg0KLSAgICA8bWVzc2FnZUJ1aWxkZXJzPg0KLSAgICAgICAgPG1lc3NhZ2VCdWlsZGVyIGNvbnRlbnRUeXBlPSJhcHBsaWNhdGlvbi94bWwiDQotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmJ1aWxkZXIuQXBwbGljYXRpb25YTUxCdWlsZGVyIi8+DQotICAgICAgICA8bWVzc2FnZUJ1aWxkZXIgY29udGVudFR5cGU9ImFwcGxpY2F0aW9uL3htbCINCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuYnVpbGRlci5BcHBsaWNhdGlvblhNTEJ1aWxkZXIiLz4NCi0gICAgICAgIDxtZXNzYWdlQnVpbGRlciBjb250ZW50VHlwZT0iYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5idWlsZGVyLlhGb3JtVVJMRW5jb2RlZEJ1aWxkZXIiLz4NCi0gICAgICAgIDxtZXNzYWdlQnVpbGRlciBjb250ZW50VHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSINCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuYnVpbGRlci5NdWx0aXBhcnRGb3JtRGF0YUJ1aWxkZXIiLz4NCi0gICAgPC9tZXNzYWdlQnVpbGRlcnM+DQotDQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4NCi0gICAgPCEtLSBUcmFuc3BvcnQgSW5zIC0tPg0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+DQotICAgIDx0cmFuc3BvcnRSZWNlaXZlciBuYW1lPSJodHRwIg0KLSAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuU2ltcGxlSFRUUFNlcnZlciI+DQotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9InBvcnQiPjkwOTA8L3BhcmFtZXRlcj4NCi0gICAgICAgIDwhLS0gSGVyZSBpcyB0aGUgY29tcGxldGUgbGlzdCBvZiBzdXBwb3J0ZWQgcGFyYW1ldGVycyAoc2VlIGV4YW1wbGUgc2V0dGluZ3MgZnVydGhlciBiZWxvdyk6DQotICAgICAgICAgICAgcG9ydDogdGhlIHBvcnQgdG8gbGlzdGVuIG9uIChkZWZhdWx0IDYwNjApDQotICAgICAgICAgICAgaG9zdG5hbWU6ICBpZiBub24tbnVsbCwgdXJsIHByZWZpeCB1c2VkIGluIHJlcGx5LXRvIGVuZHBvaW50IHJlZmVyZW5jZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdCBudWxsKQ0KLSAgICAgICAgICAgIG9yaWdpblNlcnZlcjogIHZhbHVlIG9mIGh0dHAgU2VydmVyIGhlYWRlciBpbiBvdXRnb2luZyBtZXNzYWdlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQgIlNpbXBsZS1TZXJ2ZXIvMS4xIikNCi0gICAgICAgICAgICByZXF1ZXN0VGltZW91dDogIHZhbHVlIGluIG1pbGxpcyBvZiB0aW1lIHRoYXQgcmVxdWVzdHMgY2FuIHdhaXQgZm9yIGRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkZWZhdWx0IDIwMDAwKQ0KLSAgICAgICAgICAgIHJlcXVlc3RUY3BOb0RlbGF5OiAgdHJ1ZSB0byBtYXhpbWl6ZSBwZXJmb3JtYW5jZSBhbmQgbWluaW1pemUgbGF0ZW5jeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQgdHJ1ZSkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIHRvIG1pbmltaXplIGJhbmR3aWR0aCBjb25zdW1wdGlvbiBieSBjb21iaW5pbmcgc2VnbWVudHMNCi0gICAgICAgICAgICByZXF1ZXN0Q29yZVRocmVhZFBvb2xTaXplOiAgbnVtYmVyIG9mIHRocmVhZHMgYXZhaWxhYmxlIGZvciByZXF1ZXN0IHByb2Nlc3NpbmcgKHVubGVzcyBxdWV1ZSBmaWxscyB1cCkgIChkZWZhdWx0IDI1KQ0KLSAgICAgICAgICAgIHJlcXVlc3RNYXhUaHJlYWRQb29sU2l6ZTogIG51bWJlciBvZiB0aHJlYWRzIGF2YWlsYWJsZSBmb3IgcmVxdWVzdCBwcm9jZXNzaW5nIGlmIHF1ZXVlIGZpbGxzIHVwICAgICAgICAgKGRlZmF1bHQgMTUwKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGUgdGhhdCBkZWZhdWx0IHF1ZXVlIG5ldmVyIGZpbGxzIHVwOiAgc2VlIEh0dHBGYWN0b3J5DQotICAgICAgICAgICAgdGhyZWFkS2VlcEFsaXZlVGltZTogIHRpbWUgdG8ga2VlcCB0aHJlYWRzIGluIGV4Y2VzcyBvZiBjb3JlIHNpemUgYWxpdmUgd2hpbGUgaW5hY3RpdmUgICAgICAgICAgICAgICAgICAoZGVmYXVsdCAxODApDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGUgdGhhdCBubyBzdWNoIHRocmVhZHMgY2FuIGV4aXN0IHdpdGggZGVmYXVsdCB1bmJvdW5kZWQgcmVxdWVzdCBxdWV1ZQ0KLSAgICAgICAgICAgIHRocmVhZEtlZXBBbGl2ZVRpbWVVbml0OiAgVGltZVVuaXQgb2YgdmFsdWUgaW4gdGhyZWFkS2VlcEFsaXZlVGltZSAoZGVmYXVsdCBTRUNPTkRTKSAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQgU0VDT05EUykNCi0gICAgICAgIC0tPg0KLSAgICAgICAgPCEtLSA8cGFyYW1ldGVyIG5hbWU9Imhvc3RuYW1lIj5odHRwOi8vd3d3Lm15QXBwLmNvbS93czwvcGFyYW1ldGVyPiAtLT4NCi0gICAgICAgIDwhLS0gPHBhcmFtZXRlciBuYW1lPSJvcmlnaW5TZXJ2ZXIiPk15LVNlcnZlci8xLjE8L3BhcmFtZXRlcj4gICAgICAgICAgIC0tPg0KLSAgICAgICAgPCEtLSA8cGFyYW1ldGVyIG5hbWU9InJlcXVlc3RUaW1lb3V0Ij4xMDAwMDwvcGFyYW1ldGVyPiAgICAgICAgICAgICAgICAgICAtLT4NCi0gICAgICAgIDwhLS0gPHBhcmFtZXRlciBuYW1lPSJyZXF1ZXN0VGNwTm9EZWxheSI+ZmFsc2U8L3BhcmFtZXRlcj4gICAgICAgICAgICAgICAgICAgLS0+DQotICAgICAgICA8IS0tIDxwYXJhbWV0ZXIgbmFtZT0icmVxdWVzdENvcmVUaHJlYWRQb29sU2l6ZSI+NTA8L3BhcmFtZXRlcj4gICAgICAgICAgICAgICAgICAgICAgLS0+DQotICAgICAgICA8IS0tIDxwYXJhbWV0ZXIgbmFtZT0icmVxdWVzdE1heFRocmVhZFBvb2xTaXplIj4xMDA8L3BhcmFtZXRlcj4gICAgICAgICAgICAgICAgICAgICAtLT4NCi0gICAgICAgIDwhLS0gPHBhcmFtZXRlciBuYW1lPSJ0aHJlYWRLZWVwQWxpdmVUaW1lIj4yNDAwMDA8L3BhcmFtZXRlcj4gICAgICAgICAgICAgICAgICAtLT4NCi0gICAgICAgIDwhLS0gPHBhcmFtZXRlciBuYW1lPSJ0aHJlYWRLZWVwQWxpdmVUaW1lVW5pdCI+TUlMTElTRUNPTkRTPC9wYXJhbWV0ZXI+ICAgICAgICAgICAgLS0+DQotICAgIDwvdHJhbnNwb3J0UmVjZWl2ZXI+DQotDQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4NCi0gICAgPCEtLSBUcmFuc3BvcnQgT3V0cyAtLT4NCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPg0KLQ0KLSAgICA8dHJhbnNwb3J0U2VuZGVyIG5hbWU9ImxvY2FsIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5sb2NhbC5Mb2NhbFRyYW5zcG9ydFNlbmRlciIvPg0KLSAgICA8dHJhbnNwb3J0U2VuZGVyIG5hbWU9Imh0dHAiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuQ29tbW9uc0hUVFBUcmFuc3BvcnRTZW5kZXIiPg0KLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJQUk9UT0NPTCI+SFRUUC8xLjE8L3BhcmFtZXRlcj4NCi0gICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iVHJhbnNmZXItRW5jb2RpbmciPmNodW5rZWQ8L3BhcmFtZXRlcj4NCi0NCi0gICAgICAgIDwhLS0gSWYgZm9sbG93aW5nIGlzIHNldCB0byAndHJ1ZScsIG9wdGlvbmFsIGFjdGlvbiBwYXJ0IG9mIHRoZSBDb250ZW50LVR5cGUgd2lsbCBub3QgYmUgYWRkZWQgdG8gdGhlIFNPQVAgMS4yIG1lc3NhZ2VzIC0tPg0KLSAgICAgICAgPCEtLSAgPHBhcmFtZXRlciBuYW1lPSJPbWl0U09BUDEyQWN0aW9uIj50cnVlPC9wYXJhbWV0ZXI+ICAtLT4NCi0gICAgPC90cmFuc3BvcnRTZW5kZXI+DQotDQotICAgIDx0cmFuc3BvcnRTZW5kZXIgbmFtZT0iaHR0cHMiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuQ29tbW9uc0hUVFBUcmFuc3BvcnRTZW5kZXIiPg0KLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJQUk9UT0NPTCI+SFRUUC8xLjE8L3BhcmFtZXRlcj4NCi0gICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iVHJhbnNmZXItRW5jb2RpbmciPmNodW5rZWQ8L3BhcmFtZXRlcj4NCi0gICAgPC90cmFuc3BvcnRTZW5kZXI+DQotICAgIA0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+DQotICAgIDwhLS0gR2xvYmFsIE1vZHVsZXMgIC0tPg0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+DQotICAgIDwhLS0gQ29tbWVudCB0aGlzIHRvIGRpc2FibGUgQWRkcmVzc2luZyAtLT4NCi0gICAgPG1vZHVsZSByZWY9ImFkZHJlc3NpbmciLz4NCi0NCi0gICAgPCEtLUNvbmZpZ3VyaW5nIG1vZHVsZSAsIHByb3ZpZGluZyBwYXJhbWV0ZXJzIGZvciBtb2R1bGVzIHdoZXRoZXIgdGhleSByZWZlciBvciBub3QtLT4NCi0gICAgPCEtLTxtb2R1bGVDb25maWcgbmFtZT0iYWRkcmVzc2luZyI+LS0+DQotICAgIDwhLS08cGFyYW1ldGVyIG5hbWU9ImFkZHJlc3NpbmdQYXJhIj5OL0E8L3BhcmFtZXRlcj4tLT4NCi0gICAgPCEtLTwvbW9kdWxlQ29uZmlnPi0tPg0KLQ0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+DQotICAgIDwhLS0gQ2x1c3RlcmluZyAgLS0+DQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4NCi0gICAgPCEtLSBDb25maWd1cmUgYW5kIHVuY29tbWVudCBmb2xsb3dpbmcgZm9yIHByZXBhcmluZyBBeGlzMiB0byBhIGNsdXN0ZXJlZCBlbnZpcm9ubWVudCAtLT4NCi0gICAgPCEtLQ0KLSAgICA8Y2x1c3RlciBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyLnRyaWJlcy5UcmliZXNDbHVzdGVyTWFuYWdlciI+DQotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9InBhcmFtMSI+dmFsdWUxPC9wYXJhbWV0ZXI+DQotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9ImRvbWFpbiI+YXBhY2hlLmF4aXMyLmRvbWFpbjwvcGFyYW1ldGVyPg0KLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJzeW5jaHJvbml6ZUFsbCI+dHJ1ZTwvcGFyYW1ldGVyPg0KLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJtYXhSZXRyaWVzIj4xMDwvcGFyYW1ldGVyPg0KLSAgICAJPGNvbmZpZ3VyYXRpb25NYW5hZ2VyIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXIuY29uZmlndXJhdGlvbi5UcmliZXNDb25maWd1cmF0aW9uTWFuYWdlciI+DQotICAgIAkgICAgPGxpc3RlbmVyIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXIuY29uZmlndXJhdGlvbi5EZWZhdWx0Q29uZmlndXJhdGlvbk1hbmFnZXJMaXN0ZW5lciIvPg0KLSAgICAJPC9jb25maWd1cmF0aW9uTWFuYWdlcj4NCi0gICAgCTxjb250ZXh0TWFuYWdlciBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyLmNvbnRleHQuVHJpYmVzQ29udGV4dE1hbmFnZXIiPg0KLSAgICAJICAgIDxsaXN0ZW5lciBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyLmNvbnRleHQuRGVmYXVsdENvbnRleHRNYW5hZ2VyTGlzdGVuZXIiLz4NCi0gICAgCTwvY29udGV4dE1hbmFnZXI+DQotICAgIDwvY2x1c3Rlcj4NCi0gICAgLS0+DQotDQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4NCi0gICAgPCEtLSBQaGFzZXMgIC0tPg0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+DQotICAgIDxwaGFzZU9yZGVyIHR5cGU9IkluRmxvdyI+DQotICAgICAgICA8IS0tICBTeXN0ZW0gcHJlZGVmaW5lZCBwaGFzZXMgICAgICAgLS0+DQotICAgICAgICA8cGhhc2UgbmFtZT0iVHJhbnNwb3J0Ij4NCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJSZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiPg0KLSAgICAgICAgICAgICAgICA8b3JkZXIgcGhhc2U9IlRyYW5zcG9ydCIvPg0KLSAgICAgICAgICAgIDwvaGFuZGxlcj4NCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiPg0KLSAgICAgICAgICAgICAgICA8b3JkZXIgcGhhc2U9IlRyYW5zcG9ydCIvPg0KLSAgICAgICAgICAgIDwvaGFuZGxlcj4NCi0gICAgICAgIDwvcGhhc2U+DQotICAgICAgICA8cGhhc2UgbmFtZT0iQWRkcmVzc2luZyI+DQotICAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciI+DQotICAgICAgICAgICAgICAgICA8b3JkZXIgcGhhc2U9IkFkZHJlc3NpbmciLz4NCi0gICAgICAgICAgICA8L2hhbmRsZXI+DQotICAgICAgICA8L3BoYXNlPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9IlNlY3VyaXR5Ii8+DQotICAgICAgICA8cGhhc2UgbmFtZT0iUHJlRGlzcGF0Y2giLz4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJEaXNwYXRjaCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkRpc3BhdGNoUGhhc2UiPg0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciIvPg0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciIvPg0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlJlcXVlc3RVUklPcGVyYXRpb25EaXNwYXRjaGVyIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklPcGVyYXRpb25EaXNwYXRjaGVyIi8+DQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciIvPg0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IkhUVFBMb2NhdGlvbkJhc2VkRGlzcGF0Y2hlciINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5IVFRQTG9jYXRpb25CYXNlZERpc3BhdGNoZXIiLz4NCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJHZW5lcmljUHJvdmlkZXJEaXNwYXRjaGVyIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRpc3BhdGNoZXJzLkdlbmVyaWNQcm92aWRlckRpc3BhdGNoZXIiLz4NCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJNdXN0VW5kZXJzdGFuZFZhbGlkYXRpb25EaXNwYXRjaGVyIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRpc3BhdGNoZXJzLk11c3RVbmRlcnN0YW5kVmFsaWRhdGlvbkRpc3BhdGNoZXIiLz4NCi0gICAgICAgIDwvcGhhc2U+DQotICAgICAgICA8cGhhc2UgbmFtZT0iUk1QaGFzZSIvPg0KLSAgICAgICAgPCEtLSAgU3lzdGVtIHByZWRlZmluZWQgcGhhc2VzICAgICAgIC0tPg0KLSAgICAgICAgPCEtLSAgIEFmdGVyIFBvc3RkaXNwYXRjaCBwaGFzZSBtb2R1bGUgYXV0aG9yIG9yIHNlcnZpY2UgYXV0aG9yIGNhbiBhZGQgYW55IHBoYXNlIGhlIHdhbnQgICAgICAtLT4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJPcGVyYXRpb25JblBoYXNlIj4NCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJNdXN0VW5kZXJzdGFuZENoZWNrZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGlzcGF0Y2hlcnMuTXVzdFVuZGVyc3RhbmRDaGVja2VyIj4NCi0gICAgICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJPcGVyYXRpb25JblBoYXNlIi8+DQotICAgICAgICAgICAgPC9oYW5kbGVyPg0KLSAgICAgICAgPC9waGFzZT4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJzb2FwbW9uaXRvclBoYXNlIi8+DQotICAgIDwvcGhhc2VPcmRlcj4NCi0gICAgPHBoYXNlT3JkZXIgdHlwZT0iT3V0RmxvdyI+DQotICAgICAgICA8IS0tICAgICAgdXNlciBjYW4gYWRkIGhpcyBvd24gcGhhc2VzIHRvIHRoaXMgYXJlYSAgLS0+DQotICAgICAgICA8cGhhc2UgbmFtZT0ic29hcG1vbml0b3JQaGFzZSIvPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik9wZXJhdGlvbk91dFBoYXNlIi8+DQotICAgICAgICA8IS0tc3lzdGVtIHByZWRlZmluZWQgcGhhc2UtLT4NCi0gICAgICAgIDwhLS10aGVzZSBwaGFzZSB3aWxsIHJ1biBpcnJlc3BlY3RpdmUgb2YgdGhlIHNlcnZpY2UtLT4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJSTVBoYXNlIi8+DQotICAgICAgICA8cGhhc2UgbmFtZT0iUG9saWN5RGV0ZXJtaW5hdGlvbiIvPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik1lc3NhZ2VPdXQiLz4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJTZWN1cml0eSIvPg0KLSAgICA8L3BoYXNlT3JkZXI+DQotICAgIDxwaGFzZU9yZGVyIHR5cGU9IkluRmF1bHRGbG93Ij4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJBZGRyZXNzaW5nIj4NCi0gICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5BZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIj4NCi0gICAgICAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iQWRkcmVzc2luZyIvPg0KLSAgICAgICAgICAgIDwvaGFuZGxlcj4NCi0gICAgICAgIDwvcGhhc2U+DQotICAgICAgICA8cGhhc2UgbmFtZT0iU2VjdXJpdHkiLz4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJQcmVEaXNwYXRjaCIvPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9IkRpc3BhdGNoIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuRGlzcGF0Y2hQaGFzZSI+DQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5SZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIi8+DQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIi8+DQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iUmVxdWVzdFVSSU9wZXJhdGlvbkRpc3BhdGNoZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSU9wZXJhdGlvbkRpc3BhdGNoZXIiLz4NCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIi8+DQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iSFRUUExvY2F0aW9uQmFzZWREaXNwYXRjaGVyIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLkhUVFBMb2NhdGlvbkJhc2VkRGlzcGF0Y2hlciIvPg0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IkdlbmVyaWNQcm92aWRlckRpc3BhdGNoZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGlzcGF0Y2hlcnMuR2VuZXJpY1Byb3ZpZGVyRGlzcGF0Y2hlciIvPg0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9Ik11c3RVbmRlcnN0YW5kVmFsaWRhdGlvbkRpc3BhdGNoZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGlzcGF0Y2hlcnMuTXVzdFVuZGVyc3RhbmRWYWxpZGF0aW9uRGlzcGF0Y2hlciIvPg0KLSAgICAgICAgPC9waGFzZT4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJSTVBoYXNlIi8+DQotICAgICAgICA8IS0tICAgICAgdXNlciBjYW4gYWRkIGhpcyBvd24gcGhhc2VzIHRvIHRoaXMgYXJlYSAgLS0+DQotICAgICAgICA8cGhhc2UgbmFtZT0iT3BlcmF0aW9uSW5GYXVsdFBoYXNlIi8+DQotICAgICAgICA8cGhhc2UgbmFtZT0ic29hcG1vbml0b3JQaGFzZSIvPg0KLSAgICA8L3BoYXNlT3JkZXI+DQotICAgIDxwaGFzZU9yZGVyIHR5cGU9Ik91dEZhdWx0RmxvdyI+DQotICAgICAgICA8IS0tICAgICAgdXNlciBjYW4gYWRkIGhpcyBvd24gcGhhc2VzIHRvIHRoaXMgYXJlYSAgLS0+DQotICAgICAgICA8cGhhc2UgbmFtZT0ic29hcG1vbml0b3JQaGFzZSIvPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik9wZXJhdGlvbk91dEZhdWx0UGhhc2UiLz4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJSTVBoYXNlIi8+DQotICAgICAgICA8cGhhc2UgbmFtZT0iUG9saWN5RGV0ZXJtaW5hdGlvbiIvPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik1lc3NhZ2VPdXQiLz4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJTZWN1cml0eSIvPg0KLSAgICA8L3BoYXNlT3JkZXI+DQotPC9heGlzY29uZmlnPg0KLQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL2NhdGFsb2cvYmFzaWMtY2F0YWxvZy54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9jYXRhbG9nL2Jhc2ljLWNhdGFsb2cueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzQyYTM4Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL2NhdGFsb2cvYmFzaWMtY2F0YWxvZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxjYXRhbG9nIHhtbG5zPSJ1cm46b2FzaXM6bmFtZXM6dGM6ZW50aXR5OnhtbG5zOnhtbDpjYXRhbG9nIj4KLSAgIDxzeXN0ZW0KLSAgICAgICBzeXN0ZW1JZD0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS9hcHBsaWNhdGlvbl8xXzQueHNkIgotICAgICAgIHVyaT0iY2F0YWxvZy9zY2hlbWEvYXBwbGljYXRpb25fMV80LnhzZCIgLz4KLSAgIDxzeXN0ZW0KLSAgICAgICBzeXN0ZW1JZD0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2QyIgotICAgICAgIHVyaT0iaW1wb3J0QXV4LnhzZCIgLz4KLSAgIDxzeXN0ZW0KLSAgICAgICBzeXN0ZW1JZD0iaHR0cDovL2V4YW1wbGUuY29tL3Rlc3QvZG9lc25vdGV4aXN0LndzZGwiCi0gICAgICAgdXJpPSJkaXIxL2Fic3RyYWN0LndzZGwiIC8+Ci0gICA8c3lzdGVtCi0gICAgICAgc3lzdGVtSWQ9ImRvZXNub3RleGlzdC54c2QiCi0gICAgICAgdXJpPSJkaXIyL2ltcG9ydGVkMS54c2QiIC8+Ci0gICA8c3lzdGVtCi0gICAgICAgc3lzdGVtSWQ9Imh0dHA6Ly9leGFtcGxlLmNvbS9uZXZlckV4aXN0ZWQueHNkIgotICAgICAgIHVyaT0iZGlyMy9pbXBvcnRlZDIueHNkIiAvPgotICAgPHB1YmxpYwotICAgICAgIHB1YmxpY0lkPSItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgRW50ZXJwcmlzZSBKYXZhQmVhbnMgMS4xLy9FTiIKLSAgICAgICB1cmk9ImNhdGFsb2cvZHRkL2VqYi1qYXIuZHRkIiAvPgotICAgPHB1YmxpYwotICAgICAgIHB1YmxpY0lkPSItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgRW50ZXJwcmlzZSBKYXZhQmVhbnMgMi4wLy9FTiIKLSAgICAgICB1cmk9ImNhdGFsb2cvZHRkL2VqYi1qYXJfMl8wLmR0ZCIgLz4KLTwvY2F0YWxvZz4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL2NhdGFsb2cvY2hpbGQtY2F0YWxvZy54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9jYXRhbG9nL2NoaWxkLWNhdGFsb2cueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzAzNGZhLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL2NhdGFsb2cvY2hpbGQtY2F0YWxvZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxjYXRhbG9nIHhtbG5zPSJ1cm46b2FzaXM6bmFtZXM6dGM6ZW50aXR5OnhtbG5zOnhtbDpjYXRhbG9nIj4KLSAgIDxzeXN0ZW0KLSAgICAgICBzeXN0ZW1JZD0iaHR0cDovL2V4YW1wbGUuY29tL3Rlc3QvZG9lc25vdGV4aXN0LndzZGwiCi0gICAgICAgdXJpPSJkaXIxL2Fic3RyYWN0LndzZGwiIC8+Ci0gICA8c3lzdGVtCi0gICAgICAgc3lzdGVtSWQ9ImRvZXNub3RleGlzdC54c2QiCi0gICAgICAgdXJpPSJkaXIyL2ltcG9ydGVkMS54c2QiIC8+Ci0gICA8c3lzdGVtCi0gICAgICAgc3lzdGVtSWQ9Imh0dHA6Ly9leGFtcGxlLmNvbS9uZXZlckV4aXN0ZWQueHNkIgotICAgICAgIHVyaT0iZGlyMy9pbXBvcnRlZDIueHNkIiAvPgotICAgPHB1YmxpYwotICAgICAgIHB1YmxpY0lkPSItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgRW50ZXJwcmlzZSBKYXZhQmVhbnMgMS4xLy9FTiIKLSAgICAgICB1cmk9ImNhdGFsb2cvZHRkL2VqYi1qYXIuZHRkIiAvPgotICAgPG5leHRDYXRhbG9nIGNhdGFsb2c9Im5leHQueG1sIi8+Ci08L2NhdGFsb2c+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9jYXRhbG9nL2RpcjEvYWJzdHJhY3Qud3NkbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL2NhdGFsb2cvZGlyMS9hYnN0cmFjdC53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjBkMTZjLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL2NhdGFsb2cvZGlyMS9hYnN0cmFjdC53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+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+Ci0gIAotPC93c2RsOmRlZmluaXRpb25zPgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvY2F0YWxvZy9kaXIyL2ltcG9ydGVkMS54c2QgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9jYXRhbG9nL2RpcjIvaW1wb3J0ZWQxLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDU4ZmYzMS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9jYXRhbG9nL2RpcjIvaW1wb3J0ZWQxLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTx4c2Q6c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0idXJuOnR5cGVzMSIKLSAgICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPgotICAgICAgPHhzZDppbXBvcnQgbmFtZXNwYWNlPSJ1cm46dHlwZXMyIiBzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2V4YW1wbGUuY29tL25ldmVyRXhpc3RlZC54c2QiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhZGQiPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFyYW0wIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhZGRSZXNwb25zZSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZS8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbGVhciI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZS8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbGVhclJlc3BvbnNlIj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpdmlkZSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJhbTAiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpdmlkZVJlc3BvbnNlIj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpdmlkZUJ5WmVyb0ZhdWx0IiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibXVsdGlwbHkiPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFyYW0wIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgPC94c2Q6c2NoZW1hPgotICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9jYXRhbG9nL2RpcjMvaW1wb3J0ZWQyLnhzZCBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL2NhdGFsb2cvZGlyMy9pbXBvcnRlZDIueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmZiNzQxLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL2NhdGFsb2cvZGlyMy9pbXBvcnRlZDIueHNkCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHhzZDpzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJ1cm46dHlwZXMyIgotICAgICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibXVsdGlwbHlSZXNwb25zZSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZS8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdWJ0cmFjdCI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJhbTAiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN1YnRyYWN0UmVzcG9uc2UiPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2UvPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gIDwveHNkOnNjaGVtYT4KLSAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvY2F0YWxvZy9mYWlsL2ZpcnN0SW1wb3J0RmFpbC54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9jYXRhbG9nL2ZhaWwvZmlyc3RJbXBvcnRGYWlsLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNjY2Q4ZC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9jYXRhbG9nL2ZhaWwvZmlyc3RJbXBvcnRGYWlsLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGNhdGFsb2cgeG1sbnM9InVybjpvYXNpczpuYW1lczp0YzplbnRpdHk6eG1sbnM6eG1sOmNhdGFsb2ciPgotICAgPHN5c3RlbQotICAgICAgIHN5c3RlbUlkPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL2FwcGxpY2F0aW9uXzFfNC54c2QiCi0gICAgICAgdXJpPSJjYXRhbG9nL3NjaGVtYS9hcHBsaWNhdGlvbl8xXzQueHNkIiAvPgotICAgPHN5c3RlbQotICAgICAgIHN5c3RlbUlkPSJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZDIiCi0gICAgICAgdXJpPSJpbXBvcnRBdXgueHNkIiAvPgotICAgPCEtLXN5c3RlbQotICAgICAgIHN5c3RlbUlkPSJodHRwOi8vZXhhbXBsZS5jb20vdGVzdC9kb2Vzbm90ZXhpc3Qud3NkbCIKLSAgICAgICB1cmk9ImRpcjEvYWJzdHJhY3Qud3NkbCIgLy0tPgotICAgPHN5c3RlbQotICAgICAgIHN5c3RlbUlkPSJkb2Vzbm90ZXhpc3QueHNkIgotICAgICAgIHVyaT0iZGlyMi9pbXBvcnRlZDEueHNkIiAvPgotICAgPHN5c3RlbQotICAgICAgIHN5c3RlbUlkPSJodHRwOi8vZXhhbXBsZS5jb20vbmV2ZXJFeGlzdGVkLnhzZCIKLSAgICAgICB1cmk9ImRpcjMvaW1wb3J0ZWQyLnhzZCIgLz4KLSAgIDxwdWJsaWMKLSAgICAgICBwdWJsaWNJZD0iLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEVudGVycHJpc2UgSmF2YUJlYW5zIDEuMS8vRU4iCi0gICAgICAgdXJpPSJjYXRhbG9nL2R0ZC9lamItamFyLmR0ZCIgLz4KLSAgIDxwdWJsaWMKLSAgICAgICBwdWJsaWNJZD0iLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEVudGVycHJpc2UgSmF2YUJlYW5zIDIuMC8vRU4iCi0gICAgICAgdXJpPSJjYXRhbG9nL2R0ZC9lamItamFyXzJfMC5kdGQiIC8+Ci08L2NhdGFsb2c+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9jYXRhbG9nL2ZhaWwvcm9vdC1jYXRhbG9nLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL2NhdGFsb2cvZmFpbC9yb290LWNhdGFsb2cueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMWY3ZGEyLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL2NhdGFsb2cvZmFpbC9yb290LWNhdGFsb2cueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08Y2F0YWxvZyB4bWxucz0idXJuOm9hc2lzOm5hbWVzOnRjOmVudGl0eTp4bWxuczp4bWw6Y2F0YWxvZyI+Ci0gICA8c3lzdGVtCi0gICAgICAgc3lzdGVtSWQ9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvYXBwbGljYXRpb25fMV80LnhzZCIKLSAgICAgICB1cmk9ImNhdGFsb2cvc2NoZW1hL2FwcGxpY2F0aW9uXzFfNC54c2QiIC8+Ci0gICA8c3lzdGVtCi0gICAgICAgc3lzdGVtSWQ9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkMiIKLSAgICAgICB1cmk9ImltcG9ydEF1eC54c2QiIC8+Ci0gICA8cHVibGljCi0gICAgICAgcHVibGljSWQ9Ii0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBFbnRlcnByaXNlIEphdmFCZWFucyAxLjEvL0VOIgotICAgICAgIHVyaT0iY2F0YWxvZy9kdGQvZWpiLWphci5kdGQiIC8+Ci0gICA8cHVibGljCi0gICAgICAgcHVibGljSWQ9Ii0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBFbnRlcnByaXNlIEphdmFCZWFucyAyLjAvL0VOIgotICAgICAgIHVyaT0iY2F0YWxvZy9kdGQvZWpiLWphcl8yXzAuZHRkIiAvPgotICAgPG5leHRDYXRhbG9nIGNhdGFsb2c9InRoaXJkSW1wb3J0RmFpbC54bWwiLz4KLTwvY2F0YWxvZz4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL2NhdGFsb2cvZmFpbC9zZWNvbmRJbXBvcnRGYWlsLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL2NhdGFsb2cvZmFpbC9zZWNvbmRJbXBvcnRGYWlsLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE5ZmI2My4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9jYXRhbG9nL2ZhaWwvc2Vjb25kSW1wb3J0RmFpbC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxjYXRhbG9nIHhtbG5zPSJ1cm46b2FzaXM6bmFtZXM6dGM6ZW50aXR5OnhtbG5zOnhtbDpjYXRhbG9nIj4KLSAgIDxzeXN0ZW0KLSAgICAgICBzeXN0ZW1JZD0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS9hcHBsaWNhdGlvbl8xXzQueHNkIgotICAgICAgIHVyaT0iY2F0YWxvZy9zY2hlbWEvYXBwbGljYXRpb25fMV80LnhzZCIgLz4KLSAgIDxzeXN0ZW0KLSAgICAgICBzeXN0ZW1JZD0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2QyIgotICAgICAgIHVyaT0iaW1wb3J0QXV4LnhzZCIgLz4KLSAgIDxzeXN0ZW0KLSAgICAgICBzeXN0ZW1JZD0iaHR0cDovL2V4YW1wbGUuY29tL3Rlc3QvZG9lc25vdGV4aXN0LndzZGwiCi0gICAgICAgdXJpPSJkaXIxL2Fic3RyYWN0LndzZGwiIC8+Ci0gICA8IS0tc3lzdGVtCi0gICAgICAgc3lzdGVtSWQ9ImRvZXNub3RleGlzdC54c2QiCi0gICAgICAgdXJpPSJkaXIyL2ltcG9ydGVkMS54c2QiIC8tLT4KLSAgIDxzeXN0ZW0KLSAgICAgICBzeXN0ZW1JZD0iaHR0cDovL2V4YW1wbGUuY29tL25ldmVyRXhpc3RlZC54c2QiCi0gICAgICAgdXJpPSJkaXIzL2ltcG9ydGVkMi54c2QiIC8+Ci0gICA8cHVibGljCi0gICAgICAgcHVibGljSWQ9Ii0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBFbnRlcnByaXNlIEphdmFCZWFucyAxLjEvL0VOIgotICAgICAgIHVyaT0iY2F0YWxvZy9kdGQvZWpiLWphci5kdGQiIC8+Ci0gICA8cHVibGljCi0gICAgICAgcHVibGljSWQ9Ii0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBFbnRlcnByaXNlIEphdmFCZWFucyAyLjAvL0VOIgotICAgICAgIHVyaT0iY2F0YWxvZy9kdGQvZWpiLWphcl8yXzAuZHRkIiAvPgotPC9jYXRhbG9nPgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvY2F0YWxvZy9mYWlsL3RoaXJkSW1wb3J0RmFpbC54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9jYXRhbG9nL2ZhaWwvdGhpcmRJbXBvcnRGYWlsLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWI5Y2JlZi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9jYXRhbG9nL2ZhaWwvdGhpcmRJbXBvcnRGYWlsLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGNhdGFsb2cgeG1sbnM9InVybjpvYXNpczpuYW1lczp0YzplbnRpdHk6eG1sbnM6eG1sOmNhdGFsb2ciPgotICAgPHN5c3RlbQotICAgICAgIHN5c3RlbUlkPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL2FwcGxpY2F0aW9uXzFfNC54c2QiCi0gICAgICAgdXJpPSJjYXRhbG9nL3NjaGVtYS9hcHBsaWNhdGlvbl8xXzQueHNkIiAvPgotICAgPHN5c3RlbQotICAgICAgIHN5c3RlbUlkPSJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZDIiCi0gICAgICAgdXJpPSJpbXBvcnRBdXgueHNkIiAvPgotICAgPHN5c3RlbQotICAgICAgIHN5c3RlbUlkPSJodHRwOi8vZXhhbXBsZS5jb20vdGVzdC9kb2Vzbm90ZXhpc3Qud3NkbCIKLSAgICAgICB1cmk9ImRpcjEvYWJzdHJhY3Qud3NkbCIgLz4KLSAgIDxzeXN0ZW0KLSAgICAgICBzeXN0ZW1JZD0iZG9lc25vdGV4aXN0LnhzZCIKLSAgICAgICB1cmk9ImRpcjIvaW1wb3J0ZWQxLnhzZCIgLz4KLSAgIDwhLS0gc3lzdGVtCi0gICAgICAgc3lzdGVtSWQ9Imh0dHA6Ly9leGFtcGxlLmNvbS9uZXZlckV4aXN0ZWQueHNkIgotICAgICAgIHVyaT0iZGlyMy9pbXBvcnRlZDIueHNkIiAvLS0+Ci0gICA8cHVibGljCi0gICAgICAgcHVibGljSWQ9Ii0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBFbnRlcnByaXNlIEphdmFCZWFucyAxLjEvL0VOIgotICAgICAgIHVyaT0iY2F0YWxvZy9kdGQvZWpiLWphci5kdGQiIC8+Ci0gICA8cHVibGljCi0gICAgICAgcHVibGljSWQ9Ii0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBFbnRlcnByaXNlIEphdmFCZWFucyAyLjAvL0VOIgotICAgICAgIHVyaT0iY2F0YWxvZy9kdGQvZWpiLWphcl8yXzAuZHRkIiAvPgotPC9jYXRhbG9nPgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvY2F0YWxvZy9pbXBvcnRBdXgueHNkIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvY2F0YWxvZy9pbXBvcnRBdXgueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTI2NDVmLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL2NhdGFsb2cvaW1wb3J0QXV4LnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkMiIKLSAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIKLSAgICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgeG1sbnM6eHNkMT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2QyIgotICAgICAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+Ci0gICAgPGNvbXBsZXhUeXBlIG5hbWU9IlNPQVBTdHJ1Y3QiPgotICAgICAgICA8YWxsPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0idmFyRmxvYXQiIHR5cGU9InhzZDpmbG9hdCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0idmFySW50IiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ2YXJTdHJpbmciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC9hbGw+Ci0gICAgPC9jb21wbGV4VHlwZT4KLSAgICA8ZWxlbWVudCBuYW1lPSJTT0FQV3JhcHBlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9jYXRhbG9nL2ltcG9ydEF1eDIueHNkIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvY2F0YWxvZy9pbXBvcnRBdXgyLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGUzYWJhNC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9jYXRhbG9nL2ltcG9ydEF1eDIueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2QyIgotICAgICAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIgotICAgICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICB4bWxuczp4c2QxPSJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZDIiCi0gICAgICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIj4KLSAgICA8Y29tcGxleFR5cGUgbmFtZT0iU09BUFN0cnVjdCI+Ci0gICAgICAgIDxhbGw+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ2YXJGbG9hdCIgdHlwZT0ieHNkOmZsb2F0Ii8+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ2YXJJbnQiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InZhclN0cmluZyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L2FsbD4KLSAgICA8L2NvbXBsZXhUeXBlPgotICAgIDxlbGVtZW50IG5hbWU9IlNPQVBXcmFwcGVyMiIgdHlwZT0ieHNkOnN0cmluZyIvPgotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9jYXRhbG9nL2ltcG9ydEJhZC54c2QgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9jYXRhbG9nL2ltcG9ydEJhZC54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3ZjJhYjIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvY2F0YWxvZy9pbXBvcnRCYWQueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2QiCi0gICAgICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iCi0gICAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgIHhtbG5zOnhzZDE9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkIgotICAgICAgICB4bWxuczp4c2QyPSJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZDIiCi0gICAgICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIj4KLSAgICA8aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2QyIiBzY2hlbWFMb2NhdGlvbj0iaW1wb3J0QXV4Mi54c2QiPjwvaW1wb3J0PgotICAgIDxlbGVtZW50IG5hbWU9ImVjaG9TdHJ1Y3RQYXJhbSIgdHlwZT0ieHNkMjpTT0FQU3RydWN0Ii8+Ci08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL2NhdGFsb2cvaW1wb3J0QmFzZS54c2QgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9jYXRhbG9nL2ltcG9ydEJhc2UueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDhkODcwLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL2NhdGFsb2cvaW1wb3J0QmFzZS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZCIKLSAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIKLSAgICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgeG1sbnM6eHNkMT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2QiCi0gICAgICAgIHhtbG5zOnhzZDI9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkMiIKLSAgICAgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPgotICAgIDxpbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZDIiIHNjaGVtYUxvY2F0aW9uPSJpbXBvcnRBdXgueHNkIj48L2ltcG9ydD4KLSAgICA8ZWxlbWVudCBuYW1lPSJlY2hvU3RydWN0UGFyYW0iIHR5cGU9InhzZDI6U09BUFN0cnVjdCIvPgotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9jYXRhbG9nL3Jvb3QtY2F0YWxvZy54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9jYXRhbG9nL3Jvb3QtY2F0YWxvZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2Yjg4ZmMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvY2F0YWxvZy9yb290LWNhdGFsb2cueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08Y2F0YWxvZyB4bWxucz0idXJuOm9hc2lzOm5hbWVzOnRjOmVudGl0eTp4bWxuczp4bWw6Y2F0YWxvZyI+Ci0gICA8c3lzdGVtCi0gICAgICAgc3lzdGVtSWQ9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvYXBwbGljYXRpb25fMV80LnhzZCIKLSAgICAgICB1cmk9ImNhdGFsb2cvc2NoZW1hL2FwcGxpY2F0aW9uXzFfNC54c2QiIC8+Ci0gICA8c3lzdGVtCi0gICAgICAgc3lzdGVtSWQ9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkMiIKLSAgICAgICB1cmk9ImltcG9ydEF1eC54c2QiIC8+Ci0gICA8cHVibGljCi0gICAgICAgcHVibGljSWQ9Ii0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBFbnRlcnByaXNlIEphdmFCZWFucyAxLjEvL0VOIgotICAgICAgIHVyaT0iY2F0YWxvZy9kdGQvZWpiLWphci5kdGQiIC8+Ci0gICA8cHVibGljCi0gICAgICAgcHVibGljSWQ9Ii0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBFbnRlcnByaXNlIEphdmFCZWFucyAyLjAvL0VOIgotICAgICAgIHVyaT0iY2F0YWxvZy9kdGQvZWpiLWphcl8yXzAuZHRkIiAvPgotICAgPG5leHRDYXRhbG9nIGNhdGFsb2c9ImNoaWxkLWNhdGFsb2cueG1sIi8+Ci08L2NhdGFsb2c+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9jYXRhbG9nL3Jvb3Qud3NkbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL2NhdGFsb2cvcm9vdC53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDEwOTg4Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL2NhdGFsb2cvcm9vdC53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsMTg1ICswLDAgQEAKLTw/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+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9jYXRhbG9nL3VuaXF1ZS1jYXRhbG9nLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL2NhdGFsb2cvdW5pcXVlLWNhdGFsb2cueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWZmZjM5Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL2NhdGFsb2cvdW5pcXVlLWNhdGFsb2cueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08Y2F0YWxvZyB4bWxucz0idXJuOm9hc2lzOm5hbWVzOnRjOmVudGl0eTp4bWxuczp4bWw6Y2F0YWxvZyI+Ci0KLTxwdWJsaWMgcHVibGljSWQ9Ii0vL09BU0lTLy9EVEQgWE1MIERvY0Jvb2sgVjQuMS4yLy9FTiIKLSAgICAgICAgdXJpPSJkb2Nib29rL3htbC9kb2Nib29reC5kdGQiLz4KLQotPHN5c3RlbSBzeXN0ZW1JZD0idXJuOngtb2FzaXM6ZG9jYm9vay14bWwtdjQuMS4yIgotICAgICAgICB1cmk9ImRvY2Jvb2sveG1sL2RvY2Jvb2t4LmR0ZCIvPgotCi08ZGVsZWdhdGVQdWJsaWMgcHVibGljSWRTdGFydFN0cmluZz0iLS8vRXhhbXBsZS8vIgotICAgICAgICAgIGNhdGFsb2c9Imh0dHA6Ly93d3cuZXhhbXBsZS5jb20vY2F0YWxvZyIvPgotPC9jYXRhbG9nPgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvY29tbW9ucy1sb2dnaW5nLnByb3BlcnRpZXMgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9jb21tb25zLWxvZ2dpbmcucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGNiOTVjOC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9jb21tb25zLWxvZ2dpbmcucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLSMNCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotIw0KLQ0KLSMgVGhpcyBpcyB0aGUgbG9nZ2luZyBwcm9wZXJ0aWVzIHRoYXQgZ29lcyB0byB0aGUgd2FyLCB0aGVyZSBhcmUgdHdvIGxvZ2dpbmcgY29uZiBrZXB0IGF0IHRoZSANCi0jIHN2biwgb25lIGZvciBkZXZlbG9wZW1lbnQgKG9uZSBhdCBzcmMvdGVzdC1yZXNvdXJjZXMpIGFuZCBvdGhlciBmb3IgcHJvZHVjYXRpb24NCi0gDQotIyBVbmNvbW1lbnQgdGhlIG5leHQgbGluZSB0byBkaXNhYmxlIGFsbCBsb2dnaW5nLg0KLSNvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c9b3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuaW1wbC5Ob09wTG9nDQotDQotIyBVbmNvbW1lbnQgdGhlIG5leHQgbGluZSB0byBlbmFibGUgdGhlIHNpbXBsZSBsb2cgYmFzZWQgbG9nZ2luZw0KLSNvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c9b3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuaW1wbC5TaW1wbGVMb2cNCi0NCi0jIFVuY29tbWVudCB0aGUgbmV4dCBsaW5lIHRvIGVuYWJsZSBsb2c0aiBiYXNlZCBsb2dnaW5nDQotb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nPW9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLmltcGwuTG9nNEpMb2dnZXINCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9jb25maWd1cmF0aW9uL2hhbmRsZXJzL0NsaWVudE1ldGFkYXRhSGFuZGxlckNoYWluVGVzdC54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9jb25maWd1cmF0aW9uL2hhbmRsZXJzL0NsaWVudE1ldGFkYXRhSGFuZGxlckNoYWluVGVzdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMWM4ZTIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvY29uZmlndXJhdGlvbi9oYW5kbGVycy9DbGllbnRNZXRhZGF0YUhhbmRsZXJDaGFpblRlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi0NCi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08andzOmhhbmRsZXItY2hhaW5zIHhtbG5zOmp3cz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIj4NCi0NCi0JPGp3czpoYW5kbGVyLWNoYWluIG5hbWU9IkxvZ2dpbmdIYW5kbGVyQ2hhaW4iPg0KLQkJPGp3czpoYW5kbGVyPg0KLQkJCTxqd3M6aGFuZGxlci1jbGFzcz5vcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNwaS5DbGllbnRNZXRhZGF0YUhhbmRsZXJDaGFpbkhhbmRsZXI8L2p3czpoYW5kbGVyLWNsYXNzPg0KLQkJPC9qd3M6aGFuZGxlcj4NCi0JPC9qd3M6aGFuZGxlci1jaGFpbj4NCi0JDQotPC9qd3M6aGFuZGxlci1jaGFpbnM+DQotDQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvY29uZmlndXJhdGlvbi9oYW5kbGVycy9oYW5kbGVyLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL2NvbmZpZ3VyYXRpb24vaGFuZGxlcnMvaGFuZGxlci54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxMWJjZGIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvY29uZmlndXJhdGlvbi9oYW5kbGVycy9oYW5kbGVyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTxqd3M6aGFuZGxlci1jaGFpbnMgeG1sbnM6andzPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiPg0KLSAgPGp3czpoYW5kbGVyLWNoYWluPg0KLSAgICA8andzOmhhbmRsZXI+DQotICAgICAgPGp3czpoYW5kbGVyLWNsYXNzPm9yZy5hcGFjaGUuYXhpczIuamF4d3Muc3BpLmhhbmRsZXIuRHVtbXlTT0FQSGFuZGxlcjwvandzOmhhbmRsZXItY2xhc3M+DQotICAgIDwvandzOmhhbmRsZXI+DQotICAgIDxqd3M6aGFuZGxlcj4NCi0gICAgICA8andzOmhhbmRsZXItY2xhc3M+b3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zcGkuaGFuZGxlci5EdW1teUxvZ2ljYWxIYW5kbGVyPC9qd3M6aGFuZGxlci1jbGFzcz4NCi0gICAgPC9qd3M6aGFuZGxlcj4NCi0gIDwvandzOmhhbmRsZXItY2hhaW4+DQotPC9qd3M6aGFuZGxlci1jaGFpbnM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvaW1hZ2UvdGVzdC5qcGcgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9pbWFnZS90ZXN0LmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFkMjk1ZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9pbWFnZS90ZXN0LmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL2xvZzRqLnByb3BlcnRpZXMgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9sb2c0ai5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGExMTMxLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL2xvZzRqLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0jDQotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSMNCi0NCi0jIFNldCByb290IGNhdGVnb3J5IHByaW9yaXR5IHRvIElORk8gYW5kIGl0cyBvbmx5IGFwcGVuZGVyIHRvIENPTlNPTEUuDQotI2xvZzRqLnJvb3RDYXRlZ29yeT1ERUJVRywgQ09OU09MRQ0KLSNsb2c0ai5yb290Q2F0ZWdvcnk9REVCVUcsIENPTlNPTEUsIExPR0ZJTEUNCi0jbG9nNGoucm9vdENhdGVnb3J5PURFQlVHLCBMT0dGSUxFDQotbG9nNGoucm9vdENhdGVnb3J5PUVSUk9SLCBDT05TT0xFDQotDQotIyBTZXQgc2VsZWN0ZWQgbG9nZ2luZw0KLSMgKFlvdSBtaWdodCB3YW50IHRvIGRvIHRoaXMgdG8gY3V0IGRvd24gb24gdGhlIHNpemUgb2YgdGhlIGZpbGUpDQotIyBUaGUgZXhhbXBsZSBiZWxvdyBhZGRzIGRlYnVnIHRyYWNlIGZvciBTdEFYVXRpbHMgb3IgamF4d3Mgc2VydmVyIHRvIA0KLSMgdGhlIGF4aXMyLnNtYWxsLmxvZy4NCi0jIFlvdSBjYW4gYWRkIHRoaXMgd2l0aG91dCBjaGFuZ2luZyB0aGUgcm9vdCBjYXRlZ29yeS4NCi0jbG9nNGouY2F0ZWdvcnkub3JnLmFwYWNoZS5heGlvbS5vbS51dGlsLlN0QVhVdGlscz1ERUJVRywgU01BTEwNCi0jbG9nNGouY2F0ZWdvcnkub3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmRhdGFiaW5kaW5nLkpBWEJVdGlscz1ERUJVRywgU01BTEwNCi0NCi0jIEVuYWJsZSB0aGUgZm9sbG93aW5nIHRvIGdldCBKQVhXUyBUZXN0TG9nZ2VyIHRyYWNlLg0KLSNsb2c0ai5jYXRlZ29yeS5KQVhXUy1UZXN0cz1ERUJVRywgU01BTEwNCi0NCi0jIFNldCB0aGUgZW50ZXJwcmlzZSBsb2dnZXIgcHJpb3JpdHkgdG8gRkFUQUwNCi1sb2c0ai5sb2dnZXIub3JnLmFwYWNoZS5heGlzMi5lbnRlcnByaXNlPUZBVEFMDQotbG9nNGoubG9nZ2VyLmRlLmh1bnNpY2tlci5qYWxvcHkuaW89RkFUQUwNCi1sb2c0ai5sb2dnZXIuaHR0cGNsaWVudC53aXJlLmhlYWRlcj1GQVRBTA0KLWxvZzRqLmxvZ2dlci5vcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudD1GQVRBTA0KLQ0KLQ0KLSMgQ09OU09MRSBpcyBzZXQgdG8gYmUgYSBDb25zb2xlQXBwZW5kZXIgdXNpbmcgYSBQYXR0ZXJuTGF5b3V0Lg0KLWxvZzRqLmFwcGVuZGVyLkNPTlNPTEU9b3JnLmFwYWNoZS5sb2c0ai5Db25zb2xlQXBwZW5kZXINCi1sb2c0ai5hcHBlbmRlci5DT05TT0xFLmxheW91dD1vcmcuYXBhY2hlLmxvZzRqLlBhdHRlcm5MYXlvdXQNCi1sb2c0ai5hcHBlbmRlci5DT05TT0xFLmxheW91dC5Db252ZXJzaW9uUGF0dGVybj0lZCAlLTVwICVjIC0gJW0lbg0KLQ0KLSMgTE9HRklMRSBpcyBzZXQgdG8gYmUgYSBGaWxlIGFwcGVuZGVyIHVzaW5nIGEgUGF0dGVybkxheW91dC4NCi1sb2c0ai5hcHBlbmRlci5MT0dGSUxFPW9yZy5hcGFjaGUubG9nNGouRmlsZUFwcGVuZGVyDQotbG9nNGouYXBwZW5kZXIuTE9HRklMRS5GaWxlPWF4aXMyLmxvZw0KLWxvZzRqLmFwcGVuZGVyLkxPR0ZJTEUuQXBwZW5kPXRydWUNCi1sb2c0ai5hcHBlbmRlci5MT0dGSUxFLmxheW91dD1vcmcuYXBhY2hlLmxvZzRqLlBhdHRlcm5MYXlvdXQNCi1sb2c0ai5hcHBlbmRlci5MT0dGSUxFLmxheW91dC5Db252ZXJzaW9uUGF0dGVybj0lZCBbJXRdICUtNXAgJWMgJXggLSAlbSVuDQotDQotIyBTTUFMTCBpcyBzZXQgdG8gYmUgYSBGaWxlIGFwcGVuZGVyIHVzaW5nIGEgUGF0dGVybkxheW91dC4NCi1sb2c0ai5hcHBlbmRlci5TTUFMTD1vcmcuYXBhY2hlLmxvZzRqLkZpbGVBcHBlbmRlcg0KLWxvZzRqLmFwcGVuZGVyLlNNQUxMLkZpbGU9YXhpczIuc21hbGwubG9nDQotbG9nNGouYXBwZW5kZXIuU01BTEwuQXBwZW5kPXRydWUNCi1sb2c0ai5hcHBlbmRlci5TTUFMTC5sYXlvdXQ9b3JnLmFwYWNoZS5sb2c0ai5QYXR0ZXJuTGF5b3V0DQotbG9nNGouYXBwZW5kZXIuU01BTEwubGF5b3V0LkNvbnZlcnNpb25QYXR0ZXJuPSVkIFsldF0gJS01cCAlYyAleCAtICVtJW4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9wcm92aWRlci94bWwvd2ViLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3Byb3ZpZGVyL3htbC93ZWIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmE5MGNkLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3Byb3ZpZGVyL3htbC93ZWIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPHRlc3RPcGVyYXRpb24+DQotICA8dGVzdFBhcmFtPkhlbGxvIFdvcmxkPC90ZXN0UGFyYW0+DQotPC90ZXN0T3BlcmF0aW9uPg0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3dzZGwvQWRkTnVtYmVycy53c2RsIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9BZGROdW1iZXJzLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwN2QxODYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9BZGROdW1iZXJzLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi0NCi0NCi08IS0tDQotICB+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+DQotCQk8b3BlcmF0aW9uIG5hbWU9ImFkZE51bWJlcnMiPg0KLQkJCSANCi0JCQk8aW5wdXQ+DQotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPg0KLQkJCTwvaW5wdXQ+DQotCQkJPG91dHB1dD4NCi0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+DQotCQkJPC9vdXRwdXQ+DQotCQkJPGZhdWx0IG5hbWU9ImFkZE51bWJlcnNGYXVsdCI+DQotCQkJCTxzb2FwOmZhdWx0IG5hbWU9ImFkZE51bWJlcnNGYXVsdCIgdXNlPSJsaXRlcmFsIiAvPg0KLQkJCTwvZmF1bHQ+DQotCQk8L29wZXJhdGlvbj4NCi0JCTxvcGVyYXRpb24gbmFtZT0ib25lV2F5SW50Ij4NCi0JCQkgDQotCQkJPGlucHV0Pg0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0JCQk8L2lucHV0Pg0KLQkJPC9vcGVyYXRpb24+DQotCTwvYmluZGluZz4NCi0JPHNlcnZpY2UgbmFtZT0iQWRkTnVtYmVyc1NlcnZpY2UiPg0KLQkJPHBvcnQgbmFtZT0iQWRkTnVtYmVyc1BvcnQiIGJpbmRpbmc9InRuczpBZGROdW1iZXJzQmluZGluZyI+DQotCQkJPHNvYXA6YWRkcmVzcw0KLQkJCQlsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo5MDgwL0FkZE51bWJlci9BZGROdW1iZXJzSW1wbFNlcnZpY2UiIC8+DQotCQk8L3BvcnQ+DQotCTwvc2VydmljZT4NCi08L2RlZmluaXRpb25zPg0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3dzZGwvQWRkTnVtYmVyc0hhbmRsZXIud3NkbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3dzZGwvQWRkTnVtYmVyc0hhbmRsZXIud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRmOWY4YS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy93c2RsL0FkZE51bWJlcnNIYW5kbGVyLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi0NCi0NCi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi0NCi08ZGVmaW5pdGlvbnMgbmFtZT0iQWRkTnVtYmVyc0hhbmRsZXIiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL29yZy90ZXN0L2FkZG51bWJlcnNoYW5kbGVyIg0KLQl4bWxuczp0bnM9Imh0dHA6Ly9vcmcvdGVzdC9hZGRudW1iZXJzaGFuZGxlciIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIg0KLQl4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIg0KLQl4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIj4NCi0NCi0NCi0JPHR5cGVzPg0KLQkJPHhzZDpzY2hlbWEgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIg0KLQkJCWVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9vcmcvdGVzdC9hZGRudW1iZXJzaGFuZGxlciI+DQotCQkJPGVsZW1lbnQgbmFtZT0ibXlIZWFkZXIiIHR5cGU9InhzZDpzdHJpbmciIC8+DQotCQkJDQotCQkJPGVsZW1lbnQgbmFtZT0iYWRkTnVtYmVyc0hhbmRsZXJSZXNwb25zZSI+DQotCQkJCTxjb21wbGV4VHlwZT4NCi0JCQkJCTxzZXF1ZW5jZT4NCi0JCQkJCQk8ZWxlbWVudCBuYW1lPSJyZXR1cm4iIHR5cGU9InhzZDppbnQiIC8+DQotCQkJCQk8L3NlcXVlbmNlPg0KLQkJCQk8L2NvbXBsZXhUeXBlPg0KLQkJCTwvZWxlbWVudD4NCi0NCi0JCQk8ZWxlbWVudCBuYW1lPSJhZGROdW1iZXJzSGFuZGxlciI+DQotCQkJCTxjb21wbGV4VHlwZT4NCi0JCQkJCTxzZXF1ZW5jZT4NCi0JCQkJCQk8ZWxlbWVudCBuYW1lPSJhcmcwIiB0eXBlPSJ4c2Q6aW50IiAvPg0KLQkJCQkJCTxlbGVtZW50IG5hbWU9ImFyZzEiIHR5cGU9InhzZDppbnQiIC8+DQotCQkJCQk8L3NlcXVlbmNlPg0KLQkJCQk8L2NvbXBsZXhUeXBlPg0KLQkJCTwvZWxlbWVudD4NCi0NCi0JCQk8ZWxlbWVudCBuYW1lPSJBZGROdW1iZXJzSGFuZGxlckZhdWx0Ij4NCi0JCQkJPGNvbXBsZXhUeXBlPg0KLQkJCQkJPHNlcXVlbmNlPg0KLQkJCQkJCTxlbGVtZW50IG5hbWU9ImZhdWx0SW5mbyIgdHlwZT0ieHNkOnN0cmluZyIgLz4NCi0JCQkJCQk8ZWxlbWVudCBuYW1lPSJtZXNzYWdlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPg0KLQkJCQkJPC9zZXF1ZW5jZT4NCi0JCQkJPC9jb21wbGV4VHlwZT4NCi0JCQk8L2VsZW1lbnQ+DQotDQotCQkJPGVsZW1lbnQgbmFtZT0ib25lV2F5SW50Ij4NCi0JCQkJPGNvbXBsZXhUeXBlPg0KLQkJCQkJPHNlcXVlbmNlPg0KLQkJCQkJCTxlbGVtZW50IG5hbWU9ImFyZzAiIHR5cGU9InhzZDppbnQiIC8+DQotCQkJCQk8L3NlcXVlbmNlPg0KLQkJCQk8L2NvbXBsZXhUeXBlPg0KLQkJCTwvZWxlbWVudD4NCi0NCi0JCTwveHNkOnNjaGVtYT4NCi0JPC90eXBlcz4NCi0NCi0JPG1lc3NhZ2UgbmFtZT0iYWRkTnVtYmVyc0hhbmRsZXIiPg0KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0idG5zOmFkZE51bWJlcnNIYW5kbGVyIiAvPg0KLQk8L21lc3NhZ2U+DQotCTxtZXNzYWdlIG5hbWU9ImFkZE51bWJlcnNIYW5kbGVyUmVzcG9uc2UiPg0KLQkJPHBhcnQgbmFtZT0icmVzdWx0IiBlbGVtZW50PSJ0bnM6YWRkTnVtYmVyc0hhbmRsZXJSZXNwb25zZSIgLz4NCi0JPC9tZXNzYWdlPg0KLQk8bWVzc2FnZSBuYW1lPSJhZGROdW1iZXJzSGFuZGxlckZhdWx0Ij4NCi0JCTxwYXJ0IG5hbWU9IkFkZE51bWJlcnNIYW5kbGVyRmF1bHQiIGVsZW1lbnQ9InRuczpBZGROdW1iZXJzSGFuZGxlckZhdWx0IiAvPg0KLQk8L21lc3NhZ2U+DQotCTxtZXNzYWdlIG5hbWU9Im9uZVdheUludCI+DQotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJ0bnM6b25lV2F5SW50IiAvPg0KLQk8L21lc3NhZ2U+DQotDQotCTxwb3J0VHlwZSBuYW1lPSJBZGROdW1iZXJzSGFuZGxlclBvcnRUeXBlIj4NCi0JCTxvcGVyYXRpb24gbmFtZT0iYWRkTnVtYmVyc0hhbmRsZXIiPg0KLQkJCTxpbnB1dCBtZXNzYWdlPSJ0bnM6YWRkTnVtYmVyc0hhbmRsZXIiIG5hbWU9ImFkZCIgLz4NCi0JCQk8b3V0cHV0IG1lc3NhZ2U9InRuczphZGROdW1iZXJzSGFuZGxlclJlc3BvbnNlIiBuYW1lPSJhZGRSZXNwb25zZSIgLz4NCi0JCQk8ZmF1bHQgbmFtZT0iYWRkTnVtYmVyc0hhbmRsZXJGYXVsdCIgbWVzc2FnZT0idG5zOmFkZE51bWJlcnNIYW5kbGVyRmF1bHQiIC8+DQotCQk8L29wZXJhdGlvbj4NCi0JCTxvcGVyYXRpb24gbmFtZT0ib25lV2F5SW50Ij4NCi0JCQk8aW5wdXQgbWVzc2FnZT0idG5zOm9uZVdheUludCIgLz4NCi0JCTwvb3BlcmF0aW9uPg0KLQk8L3BvcnRUeXBlPg0KLQk8YmluZGluZyBuYW1lPSJBZGROdW1iZXJzSGFuZGxlckJpbmRpbmciIHR5cGU9InRuczpBZGROdW1iZXJzSGFuZGxlclBvcnRUeXBlIj4NCi0JCTxzb2FwOmJpbmRpbmcgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiDQotCQkJc3R5bGU9ImRvY3VtZW50IiAvPg0KLQkJPG9wZXJhdGlvbiBuYW1lPSJhZGROdW1iZXJzSGFuZGxlciI+DQotCQkJDQotCQkJPGlucHV0Pg0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0JCQk8L2lucHV0Pg0KLQkJCTxvdXRwdXQ+DQotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPg0KLQkJCTwvb3V0cHV0Pg0KLQkJCTxmYXVsdCBuYW1lPSJhZGROdW1iZXJzSGFuZGxlckZhdWx0Ij4NCi0JCQkJPHNvYXA6ZmF1bHQgbmFtZT0iYWRkTnVtYmVyc0hhbmRsZXJGYXVsdCIgdXNlPSJsaXRlcmFsIiAvPg0KLQkJCTwvZmF1bHQ+DQotCQk8L29wZXJhdGlvbj4NCi0JCTxvcGVyYXRpb24gbmFtZT0ib25lV2F5SW50Ij4NCi0JCQkNCi0JCQk8aW5wdXQ+DQotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPg0KLQkJCTwvaW5wdXQ+DQotCQk8L29wZXJhdGlvbj4NCi0JPC9iaW5kaW5nPg0KLQk8c2VydmljZSBuYW1lPSJBZGROdW1iZXJzSGFuZGxlclNlcnZpY2UiPg0KLQkJPHBvcnQgbmFtZT0iQWRkTnVtYmVyc0hhbmRsZXJQb3J0IiBiaW5kaW5nPSJ0bnM6QWRkTnVtYmVyc0hhbmRsZXJCaW5kaW5nIj4NCi0JCQk8c29hcDphZGRyZXNzDQotCQkJCWxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjkwODAvQWRkTnVtYmVySGFuZGxlci9BZGROdW1iZXJzSGFuZGxlckltcGxTZXJ2aWNlIiAvPg0KLQkJPC9wb3J0Pg0KLQk8L3NlcnZpY2U+DQotPC9kZWZpbml0aW9ucz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy93c2RsL0FueVR5cGUud3NkbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3dzZGwvQW55VHlwZS53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGYyMzVjLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3dzZGwvQW55VHlwZS53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi0NCi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08ZGVmaW5pdGlvbnMgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vYW55dHlwZS50ZXN0Lm9yZyINCi0gICAgICB4bWxuczp0bnM9Imh0dHA6Ly9hbnl0eXBlLnRlc3Qub3JnIg0KLSAgICAgIHhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIgDQotICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSINCi0gICAgICB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIj4NCi0NCi0gICA8dHlwZXM+DQotICAgICAgPHhzZDpzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vYW55dHlwZS50ZXN0Lm9yZyINCi0gICAgICAgICB4bWxuczp0cz0iaHR0cDovL2FueXR5cGUudGVzdC5vcmcveHNkIg0KLSAgICAgICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSINCi0gICAgICAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+DQotDQotICAgICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9ImVjaG9NZXNzYWdlIj4NCi0gICAgICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0icmVxdWVzdCIgdHlwZT0ieHNkOmFueVR5cGUiLz4NCi0gICAgICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDwvY29tcGxleFR5cGU+DQotDQotICAgICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9ImVjaG9NZXNzYWdlUmVzcG9uc2UiPg0KLSAgICAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJyZXNwb25zZSIgdHlwZT0ieHNkOmFueVR5cGUiLz4NCi0gICAgICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDwvY29tcGxleFR5cGU+DQotDQotICAgICAgICAgPGVsZW1lbnQgbmFtZT0iZWNob01lc3NhZ2UiIHR5cGU9InRuczplY2hvTWVzc2FnZSIvPg0KLSAgICAgICAgIDxlbGVtZW50IG5hbWU9ImVjaG9NZXNzYWdlUmVzcG9uc2UiIHR5cGU9InRuczplY2hvTWVzc2FnZVJlc3BvbnNlIi8+DQotDQotICAgICAgPC94c2Q6c2NoZW1hPg0KLSAgIDwvdHlwZXM+DQotDQotICAgPG1lc3NhZ2UgbmFtZT0iZWNob01lc3NhZ2UiPg0KLSAgICAgIDxwYXJ0IG5hbWU9Im1lc3NhZ2UiIGVsZW1lbnQ9InRuczplY2hvTWVzc2FnZSIvPg0KLSAgIDwvbWVzc2FnZT4NCi0NCi0gICA8bWVzc2FnZSBuYW1lPSJlY2hvTWVzc2FnZVJlc3BvbnNlIj4NCi0gICAgICA8cGFydCBuYW1lPSJyZXN1bHQiIGVsZW1lbnQ9InRuczplY2hvTWVzc2FnZVJlc3BvbnNlIi8+DQotICAgPC9tZXNzYWdlPg0KLQ0KLSAgIDxwb3J0VHlwZSBuYW1lPSJBbnlUeXBlTWVzc2FnZVBvcnRUeXBlIj4NCi0gICAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9NZXNzYWdlIj4NCi0gICAgICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmVjaG9NZXNzYWdlIiAvPg0KLSAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmVjaG9NZXNzYWdlUmVzcG9uc2UiIC8+DQotICAgICAgPC9vcGVyYXRpb24+DQotICAgPC9wb3J0VHlwZT4NCi0NCi0gICA8YmluZGluZyBuYW1lPSJBbnlUeXBlTWVzc2FnZUJpbmRpbmciIHR5cGU9InRuczpBbnlUeXBlTWVzc2FnZVBvcnRUeXBlIj4NCi0gICAgICA8c29hcDpiaW5kaW5nIHN0eWxlPSJkb2N1bWVudCIgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiLz4NCi0gICAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9NZXNzYWdlIj4NCi0gICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+DQotICAgICAgICAgPGlucHV0Pg0KLSAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgICAgPC9pbnB1dD4NCi0NCi0gICAgICAgICA8b3V0cHV0Pg0KLSAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgICAgPC9vdXRwdXQ+DQotICAgICAgPC9vcGVyYXRpb24+DQotICAgPC9iaW5kaW5nPg0KLQ0KLSAgIDxzZXJ2aWNlIG5hbWU9IkFueVR5cGVNZXNzYWdlU2VydmljZSI+DQotICAgICAgPHBvcnQgYmluZGluZz0idG5zOkFueVR5cGVNZXNzYWdlQmluZGluZyIgbmFtZT0iQW55VHlwZVBvcnQiPg0KLSAgICAgICAgIDxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6NjA2MC9heGlzMi9TZXJ2aWNlcy9BbnlUeXBlTWVzc2FnZVNlcnZpY2UiLz4NCi0gICAgICA8L3BvcnQ+DQotDQotICAgPC9zZXJ2aWNlPg0KLQ0KLTwvZGVmaW5pdGlvbnM+DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9CYWRFbmRwb2ludEFkZHJlc3Mud3NkbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3dzZGwvQmFkRW5kcG9pbnRBZGRyZXNzLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2ZTk4YzguLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9CYWRFbmRwb2ludEFkZHJlc3Mud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotDQotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPGRlZmluaXRpb25zIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2pheHdzLmF4aXMyLmFwYWNoZS5vcmciDQotICAgICAgeG1sbnM6dG5zPSJodHRwOi8vamF4d3MuYXhpczIuYXBhY2hlLm9yZyINCi0gICAgICB4bWxucz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIA0KLSAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiDQotICAgICAgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyI+DQotDQotICAgPHR5cGVzPg0KLSAgICAgIDx4c2Q6c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2pheHdzLmF4aXMyLmFwYWNoZS5vcmciDQotICAgICAgICAgeG1sbnM6dG5zPSJodHRwOi8vamF4d3MuYXhpczIuYXBhY2hlLm9yZyINCi0gICAgICAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiDQotICAgICAgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPg0KLQ0KLSAgICAgICAgIDxjb21wbGV4VHlwZSBuYW1lPSJlY2hvVHlwZSI+DQotICAgICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InJlcXVlc3QiIHR5cGU9InhzZDpzdHJpbmciLz4NCi0gICAgICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDwvY29tcGxleFR5cGU+DQotDQotICAgICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9ImVjaG9SZXNwb25zZVR5cGUiPg0KLSAgICAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJyZXNwb25zZSIgdHlwZT0ieHNkOnN0cmluZyIvPg0KLSAgICAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgPC9jb21wbGV4VHlwZT4NCi0NCi0gICAgICAgICA8ZWxlbWVudCBuYW1lPSJlY2hvIiB0eXBlPSJ0bnM6ZWNob1R5cGUiLz4NCi0gICAgICAgICA8ZWxlbWVudCBuYW1lPSJlY2hvUmVzcG9uc2UiIHR5cGU9InRuczplY2hvUmVzcG9uc2VUeXBlIi8+DQotDQotICAgICAgPC94c2Q6c2NoZW1hPg0KLSAgIDwvdHlwZXM+DQotDQotICAgPG1lc3NhZ2UgbmFtZT0iZWNobyI+DQotICAgICAgPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0idG5zOmVjaG8iLz4NCi0gICA8L21lc3NhZ2U+DQotDQotICAgPG1lc3NhZ2UgbmFtZT0iZWNob1Jlc3BvbnNlIj4NCi0gICAgICA8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJ0bnM6ZWNob1Jlc3BvbnNlIi8+DQotICAgPC9tZXNzYWdlPg0KLQ0KLSAgIDxwb3J0VHlwZSBuYW1lPSJFY2hvIj4NCi0gICAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG8iPg0KLSAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6ZWNobyIgLz4NCi0gICAgICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczplY2hvUmVzcG9uc2UiIC8+DQotICAgICAgPC9vcGVyYXRpb24+DQotICAgPC9wb3J0VHlwZT4NCi0NCi0gICA8YmluZGluZyBuYW1lPSJFY2hvQmluZGluZyIgdHlwZT0idG5zOkVjaG8iPg0KLSAgICAgIDxzb2FwOmJpbmRpbmcgc3R5bGU9ImRvY3VtZW50IiB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIvPg0KLSAgICAgIDxvcGVyYXRpb24gbmFtZT0iZWNobyI+DQotICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPg0KLSAgICAgICAgIDxpbnB1dD4NCi0gICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgICAgIDwvaW5wdXQ+DQotDQotICAgICAgICAgPG91dHB1dD4NCi0gICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgICAgIDwvb3V0cHV0Pg0KLSAgICAgIDwvb3BlcmF0aW9uPg0KLSAgIDwvYmluZGluZz4NCi0NCi0gICA8c2VydmljZSBuYW1lPSJFY2hvU2VydmljZSI+DQotICAgICAgPHBvcnQgYmluZGluZz0idG5zOkVjaG9CaW5kaW5nIiBuYW1lPSJFY2hvUG9ydCI+DQotICAgICAgICAgPHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0idGhpcyBpcyBhbiBpbnZhbGlkIHN0cmluZyIvPg0KLSAgICAgIDwvcG9ydD4NCi0gICA8L3NlcnZpY2U+DQotPC9kZWZpbml0aW9ucz4NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy93c2RsL0NsaWVudE1ldGFkYXRhLndzZGwgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy93c2RsL0NsaWVudE1ldGFkYXRhLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4ODZhYWQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9DbGllbnRNZXRhZGF0YS53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4gIA0KLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTxkZWZpbml0aW9ucyB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9kZXNjcmlwdGlvbi5qYXh3cy5heGlzMi5hcGFjaGUub3JnIg0KLSAgICAgICAgICAgICB4bWxuczp0bnM9Imh0dHA6Ly9kZXNjcmlwdGlvbi5qYXh3cy5heGlzMi5hcGFjaGUub3JnIg0KLSAgICAgICAgICAgICB4bWxucz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iDQotICAgICAgICAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiDQotICAgICAgICAgICAgIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iPiAgICAgDQotICA8dHlwZXM+ICAgICAgDQotICAgIDx4c2Q6c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2Rlc2NyaXB0aW9uLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciIA0KLSAgICAgICAgICAgICAgICB4bWxuczp0cz0iaHR0cDovL2Rlc2NyaXB0aW9uLmpheHdzLmF4aXMyLmFwYWNoZS5vcmcveHNkIg0KLSAgICAgICAgICAgICAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIj4gICAgICAgICAgIA0KLSAgICAgIDxjb21wbGV4VHlwZSBuYW1lPSJlY2hvTWVzc2FnZSI+DQotICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgIDxlbGVtZW50IG5hbWU9InJlcXVlc3QiIHR5cGU9InhzZDpzdHJpbmciLz4NCi0gICAgICAgIDwvc2VxdWVuY2U+ICAgICAgICAgIA0KLSAgICAgIDwvY29tcGxleFR5cGU+ICAgICAgICAgICANCi0gICAgICA8Y29tcGxleFR5cGUgbmFtZT0iZWNob01lc3NhZ2VSZXNwb25zZSI+ICAgICAgICAgICAgIA0KLSAgICAgICAgPHNlcXVlbmNlPiAgICAgICAgICAgICAgICANCi0gICAgICAgICAgPGVsZW1lbnQgbmFtZT0icmVzcG9uc2UiIHR5cGU9InhzZDpzdHJpbmciLz4gICAgICAgICAgICANCi0gICAgICAgIDwvc2VxdWVuY2U+ICAgICAgICAgIA0KLSAgICAgIDwvY29tcGxleFR5cGU+ICAgICAgICAgICANCi0gICAgICA8ZWxlbWVudCBuYW1lPSJlY2hvTWVzc2FnZSIgdHlwZT0idG5zOmVjaG9NZXNzYWdlIi8+ICAgICAgICAgIA0KLSAgICAgIDxlbGVtZW50IG5hbWU9ImVjaG9NZXNzYWdlUmVzcG9uc2UiIHR5cGU9InRuczplY2hvTWVzc2FnZVJlc3BvbnNlIi8+ICAgICAgICANCi0gICAgPC94c2Q6c2NoZW1hPiAgICANCi0gIDwvdHlwZXM+ICAgICANCi0NCi0gIDxtZXNzYWdlIG5hbWU9ImVjaG9NZXNzYWdlIj4gICAgICAgDQotICAgIDxwYXJ0IG5hbWU9Im1lc3NhZ2UiIGVsZW1lbnQ9InRuczplY2hvTWVzc2FnZSIvPiAgICANCi0gIDwvbWVzc2FnZT4gICAgIA0KLQ0KLSAgPG1lc3NhZ2UgbmFtZT0iZWNob01lc3NhZ2VSZXNwb25zZSI+ICAgICAgIA0KLSAgICA8cGFydCBuYW1lPSJyZXN1bHQiIGVsZW1lbnQ9InRuczplY2hvTWVzc2FnZVJlc3BvbnNlIi8+ICAgIA0KLSAgPC9tZXNzYWdlPiAgICAgDQotDQotICA8cG9ydFR5cGUgbmFtZT0iRWNob01lc3NhZ2VQb3J0VHlwZSI+ICAgICAgIA0KLSAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9NZXNzYWdlIj4gICAgICAgICAgDQotICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczplY2hvTWVzc2FnZSIgLz4gICAgICAgICAgDQotICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6ZWNob01lc3NhZ2VSZXNwb25zZSIgLz4gICAgICAgDQotICAgIDwvb3BlcmF0aW9uPiAgICANCi0gIDwvcG9ydFR5cGU+ICAgICANCi0NCi0gIDxiaW5kaW5nIG5hbWU9IkVjaG9NZXNzYWdlQmluZGluZyIgdHlwZT0idG5zOkVjaG9NZXNzYWdlUG9ydFR5cGUiPiAgICAgICANCi0gICAgPHNvYXA6YmluZGluZyBzdHlsZT0iZG9jdW1lbnQiIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIi8+ICAgICAgIA0KLSAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9NZXNzYWdlIj4gICAgICAgICAgDQotICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPiAgICAgICAgIA0KLSAgICAgIDxpbnB1dD4gICAgICAgICAgICAgDQotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgbmFtZXNwYWNlPSJodHRwOi8vb3JnLmFwYWNoZS5iaW5kaW5nLm5zIi8+ICAgICAgICAgIA0KLSAgICAgIDwvaW5wdXQ+ICAgICAgICAgICANCi0gICAgICA8b3V0cHV0PiAgICAgICAgICAgICANCi0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9Imh0dHA6Ly9vcmcuYXBhY2hlLmJpbmRpbmcubnMiLz4gICAgICAgICANCi0gICAgICA8L291dHB1dD4gICAgICAgDQotICAgIDwvb3BlcmF0aW9uPiAgICANCi0gIDwvYmluZGluZz4gICAgIA0KLQ0KLSAgPHNlcnZpY2UgbmFtZT0ic3ZjTG9jYWxQYXJ0Ij4gICAgICAgDQotICAgIDxwb3J0IGJpbmRpbmc9InRuczpFY2hvTWVzc2FnZUJpbmRpbmciIG5hbWU9InBvcnRMb2NhbFBhcnQiPiAgICAgICAgICANCi0gICAgICA8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjYwNjAvRWNob01lc3NhZ2VTZXJ2aWNlL0VjaG9NZXNzYWdlU2VydmljZSIvPiAgICAgICANCi0gICAgPC9wb3J0PiAgICAgDQotICA8L3NlcnZpY2U+ICANCi08L2RlZmluaXRpb25zPg0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3dzZGwvQ2xpZW50TWV0YWRhdGFNdWx0aVBvcnQud3NkbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3dzZGwvQ2xpZW50TWV0YWRhdGFNdWx0aVBvcnQud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2IyYWVkNy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy93c2RsL0NsaWVudE1ldGFkYXRhTXVsdGlQb3J0LndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PiAgDQotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPGRlZmluaXRpb25zIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2Rlc2NyaXB0aW9uLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciDQotICAgICAgICAgICAgIHhtbG5zOnRucz0iaHR0cDovL2Rlc2NyaXB0aW9uLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciDQotICAgICAgICAgICAgIHhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyINCi0gICAgICAgICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSINCi0gICAgICAgICAgICAgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyI+ICAgICANCi0gIDx0eXBlcz4gICAgICANCi0gICAgPHhzZDpzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vZGVzY3JpcHRpb24uamF4d3MuYXhpczIuYXBhY2hlLm9yZyIgDQotICAgICAgICAgICAgICAgIHhtbG5zOnRzPSJodHRwOi8vZGVzY3JpcHRpb24uamF4d3MuYXhpczIuYXBhY2hlLm9yZy94c2QiDQotICAgICAgICAgICAgICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPiAgICAgICAgICAgDQotICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9ImVjaG9NZXNzYWdlIj4NCi0gICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgPGVsZW1lbnQgbmFtZT0icmVxdWVzdCIgdHlwZT0ieHNkOnN0cmluZyIvPg0KLSAgICAgICAgPC9zZXF1ZW5jZT4gICAgICAgICAgDQotICAgICAgPC9jb21wbGV4VHlwZT4gICAgICAgICAgIA0KLSAgICAgIDxjb21wbGV4VHlwZSBuYW1lPSJlY2hvTWVzc2FnZVJlc3BvbnNlIj4gICAgICAgICAgICAgDQotICAgICAgICA8c2VxdWVuY2U+ICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJyZXNwb25zZSIgdHlwZT0ieHNkOnN0cmluZyIvPiAgICAgICAgICAgIA0KLSAgICAgICAgPC9zZXF1ZW5jZT4gICAgICAgICAgDQotICAgICAgPC9jb21wbGV4VHlwZT4gICAgICAgICAgIA0KLSAgICAgIDxlbGVtZW50IG5hbWU9ImVjaG9NZXNzYWdlIiB0eXBlPSJ0bnM6ZWNob01lc3NhZ2UiLz4gICAgICAgICAgDQotICAgICAgPGVsZW1lbnQgbmFtZT0iZWNob01lc3NhZ2VSZXNwb25zZSIgdHlwZT0idG5zOmVjaG9NZXNzYWdlUmVzcG9uc2UiLz4gICAgICAgIA0KLSAgICA8L3hzZDpzY2hlbWE+ICAgIA0KLSAgPC90eXBlcz4gICAgIA0KLQ0KLSAgPG1lc3NhZ2UgbmFtZT0iZWNob01lc3NhZ2UiPiAgICAgICANCi0gICAgPHBhcnQgbmFtZT0ibWVzc2FnZSIgZWxlbWVudD0idG5zOmVjaG9NZXNzYWdlIi8+ICAgIA0KLSAgPC9tZXNzYWdlPiAgICAgDQotDQotICA8bWVzc2FnZSBuYW1lPSJlY2hvTWVzc2FnZVJlc3BvbnNlIj4gICAgICAgDQotICAgIDxwYXJ0IG5hbWU9InJlc3VsdCIgZWxlbWVudD0idG5zOmVjaG9NZXNzYWdlUmVzcG9uc2UiLz4gICAgDQotICA8L21lc3NhZ2U+ICAgICANCi0NCi0gIDxwb3J0VHlwZSBuYW1lPSJFY2hvTWVzc2FnZVBvcnRUeXBlIj4gICAgICAgDQotICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob01lc3NhZ2UiPiAgICAgICAgICANCi0gICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmVjaG9NZXNzYWdlIiAvPiAgICAgICAgICANCi0gICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczplY2hvTWVzc2FnZVJlc3BvbnNlIiAvPiAgICAgICANCi0gICAgPC9vcGVyYXRpb24+ICAgIA0KLSAgPC9wb3J0VHlwZT4gICAgIA0KLQ0KLSAgPGJpbmRpbmcgbmFtZT0iRWNob01lc3NhZ2VCaW5kaW5nIiB0eXBlPSJ0bnM6RWNob01lc3NhZ2VQb3J0VHlwZSI+ICAgICAgIA0KLSAgICA8c29hcDpiaW5kaW5nIHN0eWxlPSJkb2N1bWVudCIgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiLz4gICAgICAgDQotICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob01lc3NhZ2UiPiAgICAgICAgICANCi0gICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+ICAgICAgICAgDQotICAgICAgPGlucHV0PiAgICAgICAgICAgICANCi0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9Imh0dHA6Ly9vcmcuYXBhY2hlLmJpbmRpbmcubnMiLz4gICAgICAgICAgDQotICAgICAgPC9pbnB1dD4gICAgICAgICAgIA0KLSAgICAgIDxvdXRwdXQ+ICAgICAgICAgICAgIA0KLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIG5hbWVzcGFjZT0iaHR0cDovL29yZy5hcGFjaGUuYmluZGluZy5ucyIvPiAgICAgICAgIA0KLSAgICAgIDwvb3V0cHV0PiAgICAgICANCi0gICAgPC9vcGVyYXRpb24+ICAgIA0KLSAgPC9iaW5kaW5nPiAgICAgDQotDQotICA8c2VydmljZSBuYW1lPSJzdmNMb2NhbFBhcnQiPiAgICAgICANCi0gICAgPHBvcnQgYmluZGluZz0idG5zOkVjaG9NZXNzYWdlQmluZGluZyIgbmFtZT0icG9ydExvY2FsUGFydE11bHRpMSI+ICAgICAgICAgIA0KLSAgICAgIDxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6NjA2MC9FY2hvTWVzc2FnZVNlcnZpY2UvRWNob01lc3NhZ2VTZXJ2aWNlL3BvcnRMb2NhbFBhcnRNdWx0aTEiLz4gICAgICAgDQotICAgIDwvcG9ydD4gICAgIA0KLSAgICA8cG9ydCBiaW5kaW5nPSJ0bnM6RWNob01lc3NhZ2VCaW5kaW5nIiBuYW1lPSJwb3J0TG9jYWxQYXJ0TXVsdGkyIj4gICAgICAgICAgDQotICAgICAgPHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo2MDYwL0VjaG9NZXNzYWdlU2VydmljZS9FY2hvTWVzc2FnZVNlcnZpY2UvcG9ydExvY2FsUGFydE11bHRpMiIvPiAgICAgICANCi0gICAgPC9wb3J0PiAgICAgDQotICAgIDxwb3J0IGJpbmRpbmc9InRuczpFY2hvTWVzc2FnZUJpbmRpbmciIG5hbWU9InBvcnRMb2NhbFBhcnRNdWx0aTMiPiAgICAgICAgICANCi0gICAgICA8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjYwNjAvRWNob01lc3NhZ2VTZXJ2aWNlL0VjaG9NZXNzYWdlU2VydmljZS9wb3J0TG9jYWxQYXJ0TXVsdGkzIi8+ICAgICAgIA0KLSAgICA8L3BvcnQ+ICAgICANCi0gIDwvc2VydmljZT4gIA0KLTwvZGVmaW5pdGlvbnM+DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9DbGllbnRNZXRhZGF0YU90aGVyLndzZGwgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy93c2RsL0NsaWVudE1ldGFkYXRhT3RoZXIud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFlMmQxNS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy93c2RsL0NsaWVudE1ldGFkYXRhT3RoZXIud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+ICANCi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08ZGVmaW5pdGlvbnMgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vZGVzY3JpcHRpb24uamF4d3MuYXhpczIuYXBhY2hlLm9yZyINCi0gICAgICAgICAgICAgeG1sbnM6dG5zPSJodHRwOi8vZGVzY3JpcHRpb24uamF4d3MuYXhpczIuYXBhY2hlLm9yZyINCi0gICAgICAgICAgICAgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIg0KLSAgICAgICAgICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIg0KLSAgICAgICAgICAgICB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIj4gICAgIA0KLSAgPHR5cGVzPiAgICAgIA0KLSAgICA8eHNkOnNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9kZXNjcmlwdGlvbi5qYXh3cy5heGlzMi5hcGFjaGUub3JnIiANCi0gICAgICAgICAgICAgICAgeG1sbnM6dHM9Imh0dHA6Ly9kZXNjcmlwdGlvbi5qYXh3cy5heGlzMi5hcGFjaGUub3JnL3hzZCINCi0gICAgICAgICAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+ICAgICAgICAgICANCi0gICAgICA8Y29tcGxleFR5cGUgbmFtZT0iZWNob01lc3NhZ2UiPg0KLSAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJyZXF1ZXN0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+DQotICAgICAgICA8L3NlcXVlbmNlPiAgICAgICAgICANCi0gICAgICA8L2NvbXBsZXhUeXBlPiAgICAgICAgICAgDQotICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9ImVjaG9NZXNzYWdlUmVzcG9uc2UiPiAgICAgICAgICAgICANCi0gICAgICAgIDxzZXF1ZW5jZT4gICAgICAgICAgICAgICAgDQotICAgICAgICAgIDxlbGVtZW50IG5hbWU9InJlc3BvbnNlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+ICAgICAgICAgICAgDQotICAgICAgICA8L3NlcXVlbmNlPiAgICAgICAgICANCi0gICAgICA8L2NvbXBsZXhUeXBlPiAgICAgICAgICAgDQotICAgICAgPGVsZW1lbnQgbmFtZT0iZWNob01lc3NhZ2UiIHR5cGU9InRuczplY2hvTWVzc2FnZSIvPiAgICAgICAgICANCi0gICAgICA8ZWxlbWVudCBuYW1lPSJlY2hvTWVzc2FnZVJlc3BvbnNlIiB0eXBlPSJ0bnM6ZWNob01lc3NhZ2VSZXNwb25zZSIvPiAgICAgICAgDQotICAgIDwveHNkOnNjaGVtYT4gICAgDQotICA8L3R5cGVzPiAgICAgDQotDQotICA8bWVzc2FnZSBuYW1lPSJlY2hvTWVzc2FnZSI+ICAgICAgIA0KLSAgICA8cGFydCBuYW1lPSJtZXNzYWdlIiBlbGVtZW50PSJ0bnM6ZWNob01lc3NhZ2UiLz4gICAgDQotICA8L21lc3NhZ2U+ICAgICANCi0NCi0gIDxtZXNzYWdlIG5hbWU9ImVjaG9NZXNzYWdlUmVzcG9uc2UiPiAgICAgICANCi0gICAgPHBhcnQgbmFtZT0icmVzdWx0IiBlbGVtZW50PSJ0bnM6ZWNob01lc3NhZ2VSZXNwb25zZSIvPiAgICANCi0gIDwvbWVzc2FnZT4gICAgIA0KLQ0KLSAgPHBvcnRUeXBlIG5hbWU9IkVjaG9NZXNzYWdlUG9ydFR5cGUiPiAgICAgICANCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvTWVzc2FnZSI+ICAgICAgICAgIA0KLSAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6ZWNob01lc3NhZ2UiIC8+ICAgICAgICAgIA0KLSAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmVjaG9NZXNzYWdlUmVzcG9uc2UiIC8+ICAgICAgIA0KLSAgICA8L29wZXJhdGlvbj4gICAgDQotICA8L3BvcnRUeXBlPiAgICAgDQotDQotICA8YmluZGluZyBuYW1lPSJFY2hvTWVzc2FnZUJpbmRpbmciIHR5cGU9InRuczpFY2hvTWVzc2FnZVBvcnRUeXBlIj4gICAgICAgDQotICAgIDxzb2FwOmJpbmRpbmcgc3R5bGU9ImRvY3VtZW50IiB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIvPiAgICAgICANCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvTWVzc2FnZSI+ICAgICAgICAgIA0KLSAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4gICAgICAgICANCi0gICAgICA8aW5wdXQ+ICAgICAgICAgICAgIA0KLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIG5hbWVzcGFjZT0iaHR0cDovL29yZy5hcGFjaGUuYmluZGluZy5ucyIvPiAgICAgICAgICANCi0gICAgICA8L2lucHV0PiAgICAgICAgICAgDQotICAgICAgPG91dHB1dD4gICAgICAgICAgICAgDQotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgbmFtZXNwYWNlPSJodHRwOi8vb3JnLmFwYWNoZS5iaW5kaW5nLm5zIi8+ICAgICAgICAgDQotICAgICAgPC9vdXRwdXQ+ICAgICAgIA0KLSAgICA8L29wZXJhdGlvbj4gICAgDQotICA8L2JpbmRpbmc+ICAgICANCi0NCi0gIDxzZXJ2aWNlIG5hbWU9InN2Y0xvY2FsUGFydCI+ICAgICAgIA0KLSAgICA8cG9ydCBiaW5kaW5nPSJ0bnM6RWNob01lc3NhZ2VCaW5kaW5nIiBuYW1lPSJwb3J0TG9jYWxQYXJ0T3RoZXIiPiAgICAgICAgICANCi0gICAgICA8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjYwNjAvRWNob01lc3NhZ2VTZXJ2aWNlL0VjaG9NZXNzYWdlU2VydmljZSIvPiAgICAgICANCi0gICAgPC9wb3J0PiAgICAgDQotICA8L3NlcnZpY2U+ICANCi08L2RlZmluaXRpb25zPg0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3dzZGwvQ2xpZW50TWV0YWRhdGFPdmVycmlkZW4ud3NkbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3dzZGwvQ2xpZW50TWV0YWRhdGFPdmVycmlkZW4ud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ5ZDUzNi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy93c2RsL0NsaWVudE1ldGFkYXRhT3ZlcnJpZGVuLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PiAgDQotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPGRlZmluaXRpb25zIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2Rlc2NyaXB0aW9uLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciDQotICAgICAgICAgICAgIHhtbG5zOnRucz0iaHR0cDovL2Rlc2NyaXB0aW9uLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciDQotICAgICAgICAgICAgIHhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyINCi0gICAgICAgICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSINCi0gICAgICAgICAgICAgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyI+ICAgICANCi0gIDx0eXBlcz4gICAgICANCi0gICAgPHhzZDpzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vZGVzY3JpcHRpb24uamF4d3MuYXhpczIuYXBhY2hlLm9yZyIgDQotICAgICAgICAgICAgICAgIHhtbG5zOnRzPSJodHRwOi8vZGVzY3JpcHRpb24uamF4d3MuYXhpczIuYXBhY2hlLm9yZy94c2QiDQotICAgICAgICAgICAgICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPiAgICAgICAgICAgDQotICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9ImVjaG9NZXNzYWdlIj4NCi0gICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgPGVsZW1lbnQgbmFtZT0icmVxdWVzdCIgdHlwZT0ieHNkOnN0cmluZyIvPg0KLSAgICAgICAgPC9zZXF1ZW5jZT4gICAgICAgICAgDQotICAgICAgPC9jb21wbGV4VHlwZT4gICAgICAgICAgIA0KLSAgICAgIDxjb21wbGV4VHlwZSBuYW1lPSJlY2hvTWVzc2FnZVJlc3BvbnNlIj4gICAgICAgICAgICAgDQotICAgICAgICA8c2VxdWVuY2U+ICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJyZXNwb25zZSIgdHlwZT0ieHNkOnN0cmluZyIvPiAgICAgICAgICAgIA0KLSAgICAgICAgPC9zZXF1ZW5jZT4gICAgICAgICAgDQotICAgICAgPC9jb21wbGV4VHlwZT4gICAgICAgICAgIA0KLSAgICAgIDxlbGVtZW50IG5hbWU9ImVjaG9NZXNzYWdlIiB0eXBlPSJ0bnM6ZWNob01lc3NhZ2UiLz4gICAgICAgICAgDQotICAgICAgPGVsZW1lbnQgbmFtZT0iZWNob01lc3NhZ2VSZXNwb25zZSIgdHlwZT0idG5zOmVjaG9NZXNzYWdlUmVzcG9uc2UiLz4gICAgICAgIA0KLSAgICA8L3hzZDpzY2hlbWE+ICAgIA0KLSAgPC90eXBlcz4gICAgIA0KLQ0KLSAgPG1lc3NhZ2UgbmFtZT0iZWNob01lc3NhZ2UiPiAgICAgICANCi0gICAgPHBhcnQgbmFtZT0ibWVzc2FnZSIgZWxlbWVudD0idG5zOmVjaG9NZXNzYWdlIi8+ICAgIA0KLSAgPC9tZXNzYWdlPiAgICAgDQotDQotICA8bWVzc2FnZSBuYW1lPSJlY2hvTWVzc2FnZVJlc3BvbnNlIj4gICAgICAgDQotICAgIDxwYXJ0IG5hbWU9InJlc3VsdCIgZWxlbWVudD0idG5zOmVjaG9NZXNzYWdlUmVzcG9uc2UiLz4gICAgDQotICA8L21lc3NhZ2U+ICAgICANCi0NCi0gIDxwb3J0VHlwZSBuYW1lPSJFY2hvTWVzc2FnZVBvcnRUeXBlIj4gICAgICAgDQotICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob01lc3NhZ2UiPiAgICAgICAgICANCi0gICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmVjaG9NZXNzYWdlIiAvPiAgICAgICAgICANCi0gICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczplY2hvTWVzc2FnZVJlc3BvbnNlIiAvPiAgICAgICANCi0gICAgPC9vcGVyYXRpb24+ICAgIA0KLSAgPC9wb3J0VHlwZT4gICAgIA0KLQ0KLSAgPGJpbmRpbmcgbmFtZT0iRWNob01lc3NhZ2VCaW5kaW5nIiB0eXBlPSJ0bnM6RWNob01lc3NhZ2VQb3J0VHlwZSI+ICAgICAgIA0KLSAgICA8c29hcDpiaW5kaW5nIHN0eWxlPSJkb2N1bWVudCIgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiLz4gICAgICAgDQotICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob01lc3NhZ2UiPiAgICAgICAgICANCi0gICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+ICAgICAgICAgDQotICAgICAgPGlucHV0PiAgICAgICAgICAgICANCi0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9Imh0dHA6Ly9vcmcuYXBhY2hlLmJpbmRpbmcubnMiLz4gICAgICAgICAgDQotICAgICAgPC9pbnB1dD4gICAgICAgICAgIA0KLSAgICAgIDxvdXRwdXQ+ICAgICAgICAgICAgIA0KLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIG5hbWVzcGFjZT0iaHR0cDovL29yZy5hcGFjaGUuYmluZGluZy5ucyIvPiAgICAgICAgIA0KLSAgICAgIDwvb3V0cHV0PiAgICAgICANCi0gICAgPC9vcGVyYXRpb24+ICAgIA0KLSAgPC9iaW5kaW5nPiAgICAgDQotDQotICA8c2VydmljZSBuYW1lPSJzdmNMb2NhbFBhcnQiPiAgICAgICANCi0gICAgPHBvcnQgYmluZGluZz0idG5zOkVjaG9NZXNzYWdlQmluZGluZyIgbmFtZT0icG9ydExvY2FsUGFydE92ZXJyaWRlbiI+ICAgICAgICAgIA0KLSAgICAgIDxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6NjA2MC9FY2hvTWVzc2FnZVNlcnZpY2UvRWNob01lc3NhZ2VTZXJ2aWNlIi8+ICAgICAgIA0KLSAgICA8L3BvcnQ+ICAgICANCi0gIDwvc2VydmljZT4gIA0KLTwvZGVmaW5pdGlvbnM+DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9FY2hvTWVzc2FnZS53c2RsIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9FY2hvTWVzc2FnZS53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOGJjNGVlLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3dzZGwvRWNob01lc3NhZ2Uud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLTw/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+DQotICAgICAgICAgPHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo2MDYwL0VjaG9NZXNzYWdlU2VydmljZS9FY2hvTWVzc2FnZVNlcnZpY2UiLz4NCi0gICAgICA8L3BvcnQ+DQotDQotICAgPC9zZXJ2aWNlPg0KLQ0KLTwvZGVmaW5pdGlvbnM+DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9GYXVsdHNTZXJ2aWNlLndzZGwgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy93c2RsL0ZhdWx0c1NlcnZpY2Uud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzgwZjljYS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy93c2RsL0ZhdWx0c1NlcnZpY2Uud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDI4MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLQ0KLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTxkZWZpbml0aW9ucyBuYW1lPSJGYXVsdHNTZXJ2aWNlIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9vcmcvdGVzdC9wb2x5bW9ycGhpY2ZhdWx0cyINCi0gICAgIHhtbG5zOnRucz0iaHR0cDovL29yZy90ZXN0L3BvbHltb3JwaGljZmF1bHRzIg0KLSAgICAgeG1sbnM6dHM9Imh0dHA6Ly9vcmcvdGVzdC9wb2x5bW9ycGhpY2ZhdWx0cyINCi0gICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIA0KLSAgICAgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIgDQotICAgICB4bWxucz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iPg0KLQ0KLSAgPHR5cGVzPg0KLSAgICA8eHNkOnNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9vcmcvdGVzdC9wb2x5bW9ycGhpY2ZhdWx0cyI+DQotICAgICAgICANCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU2ltcGxlRmF1bHQiIHR5cGU9InhzZDppbnQiLz4NCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iSW52YWxpZFRpY2tlckZhdWx0IiB0eXBlPSJ0czpJbnZhbGlkVGlja2VyRmF1bHRfRXhjZXB0aW9uQmVhbiIvPg0KLSAgICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iSW52YWxpZFRpY2tlckZhdWx0X0V4Y2VwdGlvbkJlYW4iPg0KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4NCi0gICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsZWdhY3lEYXRhMSIgdHlwZT0ieHNkOnN0cmluZyIgLz4NCi0gICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsZWdhY3lEYXRhMiIgdHlwZT0ieHNkOmludCIgLz4NCi0gICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXNzYWdlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPg0KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+DQotICAgICAgPC94c2Q6Y29tcGxleFR5cGU+DQotDQotDQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkJhc2VGYXVsdCIgdHlwZT0idHM6QmFzZUZhdWx0Ii8+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+DQotICAgIDwvcG9ydD4NCi0gIDwvc2VydmljZT4NCi08L2RlZmluaXRpb25zPg0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3dzZGwvRmF1bHR5V2ViU2VydmljZS53c2RsIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9GYXVsdHlXZWJTZXJ2aWNlLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwYWJlOWEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9GYXVsdHlXZWJTZXJ2aWNlLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi0NCi0NCi08IS0tDQotICB+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+DQotCTwvc2VydmljZT4NCi08L2RlZmluaXRpb25zPg0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3dzZGwvSkFYQl9DdXN0b21pemF0aW9uX1NhbXBsZS53c2RsIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9KQVhCX0N1c3RvbWl6YXRpb25fU2FtcGxlLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyMzY4NzcuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9KQVhCX0N1c3RvbWl6YXRpb25fU2FtcGxlLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLQ0KLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTxkZWZpbml0aW9ucyB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9ub25hbm9ueW1vdXMuY29tcGxleHR5cGUudGVzdC5vcmciDQotICAgICAgeG1sbnM6dG5zPSJodHRwOi8vbm9uYW5vbnltb3VzLmNvbXBsZXh0eXBlLnRlc3Qub3JnIg0KLSAgICAgIHhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIgDQotICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSINCi0gICAgICB4bWxuczpqYXhiPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXhiIiAgamF4Yjp2ZXJzaW9uPSIyLjAiDQotICAgICAgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyI+DQotCSANCi0NCi0gICA8dHlwZXM+DQotICAgICAgPHhzZDpzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vbm9uYW5vbnltb3VzLmNvbXBsZXh0eXBlLnRlc3Qub3JnIg0KLSAgICAgICAgIHhtbG5zOnRzPSJodHRwOi8vbm9uYW5vbnltb3VzLmNvbXBsZXh0eXBlLnRlc3Qub3JnL3hzZCINCi0gICAgICAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiDQotICAgICAgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPg0KLQ0KLSAgICAgICAgIDxjb21wbGV4VHlwZSBuYW1lPSJlY2hvTWVzc2FnZSI+DQotICAgICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InJlcXVlc3QiIHR5cGU9InhzZDpzdHJpbmciLz4NCi0gICAgICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDwvY29tcGxleFR5cGU+DQotDQotICAgICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9ImVjaG9NZXNzYWdlUmVzcG9uc2UiPg0KLSAgICAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJyZXNwb25zZSIgdHlwZT0ieHNkOnN0cmluZyIvPg0KLSAgICAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgPC9jb21wbGV4VHlwZT4NCi0NCi0gICAgICAgICA8ZWxlbWVudCBuYW1lPSJlY2hvTWVzc2FnZSIgdHlwZT0idG5zOmVjaG9NZXNzYWdlIi8+DQotICAgICAgICAgPGVsZW1lbnQgbmFtZT0iZWNob01lc3NhZ2VSZXNwb25zZSIgdHlwZT0idG5zOmVjaG9NZXNzYWdlUmVzcG9uc2UiLz4NCi0gICAgICAgICANCi08IS0tIFVzaW5nIHNjaGVtYSBiaW5kaW5nIHRvIGNoYW5nZSB0aGUgcGFja2FnZSBuYW1lIGZvciBqYXhiIGFydCBlZmZlY3RzIC0tPgkJDQotCQk8amF4YjpzY2hlbWFCaW5kaW5ncz4NCi0JCQk8amF4YjpwYWNrYWdlIG5hbWUgPSAib3JnLnRlc3QuZWNob21lc3NhZ2UiIC8+DQotCQk8L2pheGI6c2NoZW1hQmluZGluZ3M+DQotICAgICAgPC94c2Q6c2NoZW1hPg0KLSAgIDwvdHlwZXM+DQotDQotICAgPG1lc3NhZ2UgbmFtZT0iZWNob01lc3NhZ2UiPg0KLSAgICAgIDxwYXJ0IG5hbWU9Im1lc3NhZ2UiIGVsZW1lbnQ9InRuczplY2hvTWVzc2FnZSIvPg0KLSAgIDwvbWVzc2FnZT4NCi0NCi0gICA8bWVzc2FnZSBuYW1lPSJlY2hvTWVzc2FnZVJlc3BvbnNlIj4NCi0gICAgICA8cGFydCBuYW1lPSJyZXN1bHQiIGVsZW1lbnQ9InRuczplY2hvTWVzc2FnZVJlc3BvbnNlIi8+DQotICAgPC9tZXNzYWdlPg0KLQ0KLSAgIDxwb3J0VHlwZSBuYW1lPSJFY2hvTWVzc2FnZVBvcnRUeXBlIj4NCi0gICAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9NZXNzYWdlIj4NCi0gICAgICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmVjaG9NZXNzYWdlIiAvPg0KLSAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmVjaG9NZXNzYWdlUmVzcG9uc2UiIC8+DQotICAgICAgPC9vcGVyYXRpb24+DQotICAgPC9wb3J0VHlwZT4NCi0NCi0gICA8YmluZGluZyBuYW1lPSJFY2hvTWVzc2FnZUJpbmRpbmciIHR5cGU9InRuczpFY2hvTWVzc2FnZVBvcnRUeXBlIj4NCi0gICAgICA8c29hcDpiaW5kaW5nIHN0eWxlPSJkb2N1bWVudCIgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiLz4NCi0gICAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9NZXNzYWdlIj4NCi0gICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+DQotICAgICAgICAgPGlucHV0Pg0KLSAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgICAgPC9pbnB1dD4NCi0NCi0gICAgICAgICA8b3V0cHV0Pg0KLSAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgICAgPC9vdXRwdXQ+DQotICAgICAgPC9vcGVyYXRpb24+DQotICAgPC9iaW5kaW5nPg0KLQ0KLSAgIDxzZXJ2aWNlIG5hbWU9IkVjaG9NZXNzYWdlU2VydmljZSI+DQotICAgICAgPHBvcnQgYmluZGluZz0idG5zOkVjaG9NZXNzYWdlQmluZGluZyIgbmFtZT0iRWNob01lc3NhZ2VQb3J0Ij4NCi0gICAgICAgICA8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjYwNjAvRWNob01lc3NhZ2VTZXJ2aWNlL0VjaG9NZXNzYWdlU2VydmljZSIvPg0KLSAgICAgIDwvcG9ydD4NCi0NCi0gICA8L3NlcnZpY2U+DQotDQotPC9kZWZpbml0aW9ucz4NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy93c2RsL01lc3NhZ2VDb250ZXh0LndzZGwgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy93c2RsL01lc3NhZ2VDb250ZXh0LndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhNzA1N2EuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9NZXNzYWdlQ29udGV4dC53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI/Pg0KLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTxkZWZpbml0aW9ucyB4bWxuczp0bnM9Imh0dHA6Ly9jb250ZXh0LmpheHdzLmF4aXMyLmFwYWNoZS5vcmcvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIg0KLSAgICAgICAgICAgICB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiB4bWxucz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iDQotICAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2NvbnRleHQuamF4d3MuYXhpczIuYXBhY2hlLm9yZy8iIG5hbWU9Ik1lc3NhZ2VDb250ZXh0U2VydmljZSI+DQotICAgIDx0eXBlcz4NCi0gICAgICAgIDx4czpzY2hlbWEgeG1sbnM6dG5zPSJodHRwOi8vY29udGV4dC5qYXh3cy5heGlzMi5hcGFjaGUub3JnLyIgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIg0KLSAgICAgICAgICAgICAgICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9jb250ZXh0LmpheHdzLmF4aXMyLmFwYWNoZS5vcmcvIiB2ZXJzaW9uPSIxLjAiPg0KLSAgICAgICAgICAgIDwhLS0gcmVhZCB0aGUgdmFsdWUgb2YgYSBwcm9wZXJ0eSAtLT4NCi0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJpc1Byb3BlcnR5UHJlc2VudCI+DQotICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4NCi0gICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eU5hbWUiIHR5cGU9InhzOnN0cmluZyIvPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InZhbHVlIiB0eXBlPSJ4czpzdHJpbmciLz4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJ0eXBlIiB0eXBlPSJ4czpzdHJpbmciLz4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJpc0ZvdW5kIiB0eXBlPSJ4czpib29sZWFuIi8+DQotICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPg0KLSAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPg0KLSAgICAgICAgICAgIDwveHM6ZWxlbWVudD4NCi0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJpc1Byb3BlcnR5UHJlc2VudFJlc3BvbnNlIj4NCi0gICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InByb3BlcnR5TmFtZSIgdHlwZT0ieHM6c3RyaW5nIi8+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0idmFsdWUiIHR5cGU9InhzOnN0cmluZyIvPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InR5cGUiIHR5cGU9InhzOnN0cmluZyIvPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9ImlzRm91bmQiIHR5cGU9InhzOmJvb2xlYW4iLz4NCi0gICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+DQotICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+DQotICAgICAgICAgICAgPC94czplbGVtZW50Pg0KLSAgICAgICAgPC94czpzY2hlbWE+DQotICAgIDwvdHlwZXM+DQotICAgIDxtZXNzYWdlIG5hbWU9ImlzUHJvcGVydHlQcmVzZW50Ij4NCi0gICAgICAgIDxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9InRuczppc1Byb3BlcnR5UHJlc2VudCIvPg0KLSAgICA8L21lc3NhZ2U+DQotICAgIDxtZXNzYWdlIG5hbWU9ImlzUHJvcGVydHlQcmVzZW50UmVzcG9uc2UiPg0KLSAgICAgICAgPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0idG5zOmlzUHJvcGVydHlQcmVzZW50UmVzcG9uc2UiLz4NCi0gICAgPC9tZXNzYWdlPg0KLSAgICA8cG9ydFR5cGUgbmFtZT0iTWVzc2FnZUNvbnRleHQiPg0KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJpc1Byb3BlcnR5UHJlc2VudCI+DQotICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczppc1Byb3BlcnR5UHJlc2VudCIvPg0KLSAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmlzUHJvcGVydHlQcmVzZW50UmVzcG9uc2UiLz4NCi0gICAgICAgIDwvb3BlcmF0aW9uPg0KLSAgICA8L3BvcnRUeXBlPg0KLSAgICA8YmluZGluZyBuYW1lPSJNZXNzYWdlQ29udGV4dFBvcnRCaW5kaW5nIiB0eXBlPSJ0bnM6TWVzc2FnZUNvbnRleHQiPg0KLSAgICAgICAgPHNvYXA6YmluZGluZyBzdHlsZT0iZG9jdW1lbnQiIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIi8+DQotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImlzUHJvcGVydHlQcmVzZW50Ij4NCi0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24vPg0KLSAgICAgICAgICAgIDxpbnB1dD4NCi0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4NCi0gICAgICAgICAgICA8L2lucHV0Pg0KLSAgICAgICAgICAgIDxvdXRwdXQ+DQotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgICAgICAgPC9vdXRwdXQ+DQotICAgICAgICA8L29wZXJhdGlvbj4NCi0gICAgPC9iaW5kaW5nPg0KLSAgICA8c2VydmljZSBuYW1lPSJNZXNzYWdlQ29udGV4dFNlcnZpY2UiPg0KLSAgICAgICAgPHBvcnQgbmFtZT0iTWVzc2FnZUNvbnRleHRQb3J0IiBiaW5kaW5nPSJ0bnM6TWVzc2FnZUNvbnRleHRQb3J0QmluZGluZyI+DQotICAgICAgICAgICAgPHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo2MDYwL2F4aXMyL3NlcnZpY2VzL01lc3NhZ2VDb250ZXh0U2VydmljZSIvPg0KLSAgICAgICAgPC9wb3J0Pg0KLSAgICA8L3NlcnZpY2U+DQotPC9kZWZpbml0aW9ucz4NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy93c2RsL1BhcnRpYWxXU0RMMS53c2RsIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9QYXJ0aWFsV1NETDEud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRmMTlmYi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy93c2RsL1BhcnRpYWxXU0RMMS53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI/Pg0KLQ0KLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTxkZWZpbml0aW9ucyB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9zZXJ2ZXJQYXJ0aWFsMS5jaGVja2V4Y2VwdGlvbi53ZWJmYXVsdC5hbm5vdGF0aW9ucy8iIG5hbWU9IkFkZE51bWJlcnNJbXBsUGFydGlhbDFTZXJ2aWNlIiB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczp0bnM9Imh0dHA6Ly9zZXJ2ZXJQYXJ0aWFsMS5jaGVja2V4Y2VwdGlvbi53ZWJmYXVsdC5hbm5vdGF0aW9ucy8iIHhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+DQotICA8dHlwZXM+DQotICAgIDx4c2Q6c2NoZW1hPg0KLSAgICAgIDx4c2Q6aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3NlcnZlclBhcnRpYWwxLmNoZWNrZXhjZXB0aW9uLndlYmZhdWx0LmFubm90YXRpb25zLyIgc2NoZW1hTG9jYXRpb249IlBhcnRpYWxXU0RMMV9zY2hlbWEueHNkIi8+DQotICAgIDwveHNkOnNjaGVtYT4NCi0gIDwvdHlwZXM+DQotICA8bWVzc2FnZSBuYW1lPSJhZGRUd29OdW1iZXJzIj4NCi0gICAgPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0idG5zOmFkZFR3b051bWJlcnMiLz4NCi0gIDwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIG5hbWU9ImFkZFR3b051bWJlcnNSZXNwb25zZSI+DQotICAgIDxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9InRuczphZGRUd29OdW1iZXJzUmVzcG9uc2UiLz4NCi0gIDwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIG5hbWU9IkFkZE5lZ2F0aXZlTnVtYmVyc0V4Y2VwdGlvbiI+DQotICAgIDxwYXJ0IG5hbWU9ImZhdWx0IiBlbGVtZW50PSJ0bnM6QWRkTmVnYXRpdmVOdW1iZXJzRXhjZXB0aW9uIi8+DQotICA8L21lc3NhZ2U+DQotICA8cG9ydFR5cGUgbmFtZT0iQWRkTnVtYmVyc0ltcGxQYXJ0aWFsMSI+DQotICAgIDxvcGVyYXRpb24gbmFtZT0iYWRkVHdvTnVtYmVycyI+DQotICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczphZGRUd29OdW1iZXJzIi8+DQotICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6YWRkVHdvTnVtYmVyc1Jlc3BvbnNlIi8+DQotICAgICAgPGZhdWx0IG5hbWU9IkFkZE5lZ2F0aXZlTnVtYmVyc0V4Y2VwdGlvbiIgbWVzc2FnZT0idG5zOkFkZE5lZ2F0aXZlTnVtYmVyc0V4Y2VwdGlvbiIvPg0KLSAgICA8L29wZXJhdGlvbj4NCi0gIDwvcG9ydFR5cGU+DQotDQotPCEtLSAgUGFydGlhbCBXU0RMIDE6IE5vIGJpbmRpbmcsIHNlcnZpY2UsIG9yIHBvcnQgaW5mb3JtYXRpb24NCi0gICAgPGJpbmRpbmcgbmFtZT0iQWRkTnVtYmVyc0ltcGxQYXJ0aWFsMVBvcnRCaW5kaW5nIiB0eXBlPSJ0bnM6QWRkTnVtYmVyc0ltcGxQYXJ0aWFsMSI+DQotICAgIDxzb2FwOmJpbmRpbmcgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiIHN0eWxlPSJkb2N1bWVudCIvPg0KLSAgICA8b3BlcmF0aW9uIG5hbWU9ImFkZFR3b051bWJlcnMiPg0KLSAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4NCi0gICAgICA8aW5wdXQ+DQotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgIDwvaW5wdXQ+DQotICAgICAgPG91dHB1dD4NCi0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgPC9vdXRwdXQ+DQotICAgICAgPGZhdWx0IG5hbWU9IkFkZE5lZ2F0aXZlTnVtYmVyc0V4Y2VwdGlvbiI+DQotICAgICAgICA8c29hcDpmYXVsdCBuYW1lPSJBZGROZWdhdGl2ZU51bWJlcnNFeGNlcHRpb24iIHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgIDwvZmF1bHQ+DQotICAgIDwvb3BlcmF0aW9uPg0KLSAgPC9iaW5kaW5nPg0KLSAgPHNlcnZpY2UgbmFtZT0iQWRkTnVtYmVyc0ltcGxQYXJ0aWFsMVNlcnZpY2UiPg0KLSAgICA8cG9ydCBuYW1lPSJBZGROdW1iZXJzSW1wbFBhcnRpYWwxUG9ydCIgYmluZGluZz0idG5zOkFkZE51bWJlcnNJbXBsUGFydGlhbDFQb3J0QmluZGluZyI+DQotICAgICAgPHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL0BSRVBMQUNFX1dJVEhfSE9TVF9OQU1FQDpAUkVQTEFDRV9XSVRIX1BPUlRfTlVNQC93ZWJmYXVsdGNoa2V4Yy93ZWJmYXVsdGNoa2V4Y3AxIi8+DQotICAgIDwvcG9ydD4NCi0gIDwvc2VydmljZT4NCi0tLT4NCi0gIA0KLTwvZGVmaW5pdGlvbnM+DQotDQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9QYXJ0aWFsV1NETDFfc2NoZW1hLnhzZCBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3dzZGwvUGFydGlhbFdTREwxX3NjaGVtYS54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwMzE3NDcuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9QYXJ0aWFsV1NETDFfc2NoZW1hLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4NCi0NCi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08eHM6c2NoZW1hIHZlcnNpb249IjEuMCIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vc2VydmVyUGFydGlhbDEuY2hlY2tleGNlcHRpb24ud2ViZmF1bHQuYW5ub3RhdGlvbnMvIiB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPg0KLQ0KLSAgPHhzOmVsZW1lbnQgbmFtZT0iQWRkTmVnYXRpdmVOdW1iZXJzRXhjZXB0aW9uIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHM6c3RyaW5nIi8+DQotDQotICA8eHM6ZWxlbWVudCBuYW1lPSJhZGRUd29OdW1iZXJzIiB0eXBlPSJuczE6YWRkVHdvTnVtYmVycyIgeG1sbnM6bnMxPSJodHRwOi8vc2VydmVyUGFydGlhbDEuY2hlY2tleGNlcHRpb24ud2ViZmF1bHQuYW5ub3RhdGlvbnMvIi8+DQotDQotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iYWRkVHdvTnVtYmVycyI+DQotICAgIDx4czpzZXF1ZW5jZT4NCi0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJhcmcwIiB0eXBlPSJ4czppbnQiLz4NCi0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJhcmcxIiB0eXBlPSJ4czppbnQiLz4NCi0gICAgPC94czpzZXF1ZW5jZT4NCi0gIDwveHM6Y29tcGxleFR5cGU+DQotDQotICA8eHM6ZWxlbWVudCBuYW1lPSJhZGRUd29OdW1iZXJzUmVzcG9uc2UiIHR5cGU9Im5zMjphZGRUd29OdW1iZXJzUmVzcG9uc2UiIHhtbG5zOm5zMj0iaHR0cDovL3NlcnZlclBhcnRpYWwxLmNoZWNrZXhjZXB0aW9uLndlYmZhdWx0LmFubm90YXRpb25zLyIvPg0KLQ0KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImFkZFR3b051bWJlcnNSZXNwb25zZSI+DQotICAgIDx4czpzZXF1ZW5jZT4NCi0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJyZXR1cm4iIHR5cGU9InhzOmludCIvPg0KLSAgICA8L3hzOnNlcXVlbmNlPg0KLSAgPC94czpjb21wbGV4VHlwZT4NCi08L3hzOnNjaGVtYT4NCi0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy93c2RsL1BhcnRpYWxXU0RMMi53c2RsIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9QYXJ0aWFsV1NETDIud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZmODdmZi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy93c2RsL1BhcnRpYWxXU0RMMi53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI/Pg0KLQ0KLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTxkZWZpbml0aW9ucyB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9zZXJ2ZXJQYXJ0aWFsMS5jaGVja2V4Y2VwdGlvbi53ZWJmYXVsdC5hbm5vdGF0aW9ucy8iIG5hbWU9IkFkZE51bWJlcnNJbXBsUGFydGlhbDFTZXJ2aWNlIiB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczp0bnM9Imh0dHA6Ly9zZXJ2ZXJQYXJ0aWFsMS5jaGVja2V4Y2VwdGlvbi53ZWJmYXVsdC5hbm5vdGF0aW9ucy8iIHhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+DQotICA8dHlwZXM+DQotICAgIDx4c2Q6c2NoZW1hPg0KLSAgICAgIDx4c2Q6aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3NlcnZlclBhcnRpYWwxLmNoZWNrZXhjZXB0aW9uLndlYmZhdWx0LmFubm90YXRpb25zLyIgc2NoZW1hTG9jYXRpb249IlBhcnRpYWxXU0RMMV9zY2hlbWEueHNkIi8+DQotICAgIDwveHNkOnNjaGVtYT4NCi0gIDwvdHlwZXM+DQotDQotPCEtLSAgUGFydGlhbCBXU0RMIDI6IE9ubHkgdHlwZXMgc3BlY2lmaWVkDQotICA8bWVzc2FnZSBuYW1lPSJhZGRUd29OdW1iZXJzIj4NCi0gICAgPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0idG5zOmFkZFR3b051bWJlcnMiLz4NCi0gIDwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIG5hbWU9ImFkZFR3b051bWJlcnNSZXNwb25zZSI+DQotICAgIDxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9InRuczphZGRUd29OdW1iZXJzUmVzcG9uc2UiLz4NCi0gIDwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIG5hbWU9IkFkZE5lZ2F0aXZlTnVtYmVyc0V4Y2VwdGlvbiI+DQotICAgIDxwYXJ0IG5hbWU9ImZhdWx0IiBlbGVtZW50PSJ0bnM6QWRkTmVnYXRpdmVOdW1iZXJzRXhjZXB0aW9uIi8+DQotICA8L21lc3NhZ2U+DQotICA8cG9ydFR5cGUgbmFtZT0iQWRkTnVtYmVyc0ltcGxQYXJ0aWFsMSI+DQotICAgIDxvcGVyYXRpb24gbmFtZT0iYWRkVHdvTnVtYmVycyI+DQotICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczphZGRUd29OdW1iZXJzIi8+DQotICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6YWRkVHdvTnVtYmVyc1Jlc3BvbnNlIi8+DQotICAgICAgPGZhdWx0IG5hbWU9IkFkZE5lZ2F0aXZlTnVtYmVyc0V4Y2VwdGlvbiIgbWVzc2FnZT0idG5zOkFkZE5lZ2F0aXZlTnVtYmVyc0V4Y2VwdGlvbiIvPg0KLSAgICA8L29wZXJhdGlvbj4NCi0gIDwvcG9ydFR5cGU+DQotDQotICAgIDxiaW5kaW5nIG5hbWU9IkFkZE51bWJlcnNJbXBsUGFydGlhbDFQb3J0QmluZGluZyIgdHlwZT0idG5zOkFkZE51bWJlcnNJbXBsUGFydGlhbDEiPg0KLSAgICA8c29hcDpiaW5kaW5nIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIiBzdHlsZT0iZG9jdW1lbnQiLz4NCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJhZGRUd29OdW1iZXJzIj4NCi0gICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+DQotICAgICAgPGlucHV0Pg0KLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4NCi0gICAgICA8L2lucHV0Pg0KLSAgICAgIDxvdXRwdXQ+DQotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgIDwvb3V0cHV0Pg0KLSAgICAgIDxmYXVsdCBuYW1lPSJBZGROZWdhdGl2ZU51bWJlcnNFeGNlcHRpb24iPg0KLSAgICAgICAgPHNvYXA6ZmF1bHQgbmFtZT0iQWRkTmVnYXRpdmVOdW1iZXJzRXhjZXB0aW9uIiB1c2U9ImxpdGVyYWwiLz4NCi0gICAgICA8L2ZhdWx0Pg0KLSAgICA8L29wZXJhdGlvbj4NCi0gIDwvYmluZGluZz4NCi0gIDxzZXJ2aWNlIG5hbWU9IkFkZE51bWJlcnNJbXBsUGFydGlhbDFTZXJ2aWNlIj4NCi0gICAgPHBvcnQgbmFtZT0iQWRkTnVtYmVyc0ltcGxQYXJ0aWFsMVBvcnQiIGJpbmRpbmc9InRuczpBZGROdW1iZXJzSW1wbFBhcnRpYWwxUG9ydEJpbmRpbmciPg0KLSAgICAgIDxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9AUkVQTEFDRV9XSVRIX0hPU1RfTkFNRUA6QFJFUExBQ0VfV0lUSF9QT1JUX05VTUAvd2ViZmF1bHRjaGtleGMvd2ViZmF1bHRjaGtleGNwMSIvPg0KLSAgICA8L3BvcnQ+DQotICA8L3NlcnZpY2U+DQotLS0+DQotICANCi08L2RlZmluaXRpb25zPg0KLQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3dzZGwvUHJveHlEb2NMaXRXcmFwcGVkLndzZGwgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy93c2RsL1Byb3h5RG9jTGl0V3JhcHBlZC53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmFmNzBhLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3dzZGwvUHJveHlEb2NMaXRXcmFwcGVkLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSwzMDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi0NCi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08d3NkbDpkZWZpbml0aW9ucyB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyINCi0JeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyINCi0JeG1sbnM6dG5zPSJodHRwOi8vZG9jbGl0d3JhcHBlZC5wcm94eS50ZXN0Lm9yZyINCi0JeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0icHJveHkiDQotCXRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2RvY2xpdHdyYXBwZWQucHJveHkudGVzdC5vcmciPg0KLQ0KLQk8d3NkbDp0eXBlcz4NCi0JCTx4c2Q6c2NoZW1hDQotCQkJdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vZG9jbGl0d3JhcHBlZC5wcm94eS50ZXN0Lm9yZyINCi0JCQl4bWxuczp0bnM9Imh0dHA6Ly9kb2NsaXR3cmFwcGVkLnByb3h5LnRlc3Qub3JnIg0KLQkJCXhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPg0KLQ0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJNeUZhdWx0IiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPg0KLQ0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJvbmVXYXlWb2lkIj4NCi0JCQkJPHhzZDpjb21wbGV4VHlwZT4NCi0JCQkJCTx4c2Q6c2VxdWVuY2UgLz4NCi0JCQkJPC94c2Q6Y29tcGxleFR5cGU+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+DQotDQotCQk8L3hzZDpzY2hlbWE+DQotCTwvd3NkbDp0eXBlcz4NCi0NCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJvbmVXYXlWb2lkUmVxdWVzdCI+DQotCQk8d3NkbDpwYXJ0IG5hbWU9ImFsbEJ5TXlzZWxmIiBlbGVtZW50PSJ0bnM6b25lV2F5Vm9pZCIgLz4NCi0JPC93c2RsOm1lc3NhZ2U+DQotDQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0ib25lV2F5UmVxdWVzdCI+DQotCQk8d3NkbDpwYXJ0IG5hbWU9ImFsbEJ5TXlzZWxmIiBlbGVtZW50PSJ0bnM6b25lV2F5IiAvPg0KLQk8L3dzZGw6bWVzc2FnZT4NCi0NCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJ0d29XYXlIb2xkZXJSZXF1ZXN0Ij4NCi0JCTx3c2RsOnBhcnQgbmFtZT0iYWxsQnlNeXNlbGYiIGVsZW1lbnQ9InRuczp0d29XYXlIb2xkZXIiIC8+DQotCTwvd3NkbDptZXNzYWdlPg0KLQ0KLQk8d3NkbDptZXNzYWdlIG5hbWU9InR3b1dheUhvbGRlclJlc3BvbnNlIj4NCi0JCTx3c2RsOnBhcnQgbmFtZT0iYWxsQnlNeXNlbGYiIGVsZW1lbnQ9InRuczp0d29XYXlIb2xkZXIiIC8+DQotCTwvd3NkbDptZXNzYWdlPg0KLQ0KLQk8d3NkbDptZXNzYWdlIG5hbWU9InR3b1dheVJlcXVlc3QiPg0KLQkJPHdzZGw6cGFydCBuYW1lPSJhbGxCeU15c2VsZiIgZWxlbWVudD0idG5zOnR3b1dheSIgLz4NCi0JPC93c2RsOm1lc3NhZ2U+DQotDQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0idHdvV2F5UmVzcG9uc2UiPg0KLQkJPHdzZGw6cGFydCBuYW1lPSJhbGxCeU15c2VsZiIgZWxlbWVudD0idG5zOlJldHVyblR5cGUiIC8+DQotCTwvd3NkbDptZXNzYWdlPg0KLQ0KLQk8d3NkbDptZXNzYWdlIG5hbWU9Imludm9rZVJlcXVlc3QiPg0KLQkJPHdzZGw6cGFydCBuYW1lPSJhbGxCeU15c2VsZiIgZWxlbWVudD0idG5zOmludm9rZSIgLz4NCi0JPC93c2RsOm1lc3NhZ2U+DQotDQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0iaW52b2tlUmVzcG9uc2UiPg0KLQkJPHdzZGw6cGFydCBuYW1lPSJhbGxCeU15c2VsZiIgZWxlbWVudD0idG5zOlJldHVyblR5cGUiIC8+DQotCTwvd3NkbDptZXNzYWdlPg0KLQ0KLQk8d3NkbDptZXNzYWdlIG5hbWU9ImZpbk9wUmVxdWVzdCI+DQotCQk8d3NkbDpwYXJ0IG5hbWU9Im9wIiBlbGVtZW50PSJ0bnM6ZmluT3AiIC8+DQotCTwvd3NkbDptZXNzYWdlPg0KLQ0KLQk8d3NkbDptZXNzYWdlIG5hbWU9ImZpbk9wUmVzcG9uc2UiPg0KLQkJPHdzZGw6cGFydCBuYW1lPSJvcCIgZWxlbWVudD0idG5zOmZpbk9wUmVzcG9uc2UiIC8+DQotCTwvd3NkbDptZXNzYWdlPg0KLQ0KLQk8d3NkbDpwb3J0VHlwZSBuYW1lPSJEb2NMaXRXcmFwcGVkUHJveHkiPg0KLQ0KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9Im9uZVdheVZvaWQiPg0KLQkJCTx3c2RsOmlucHV0IG1lc3NhZ2U9InRuczpvbmVXYXlWb2lkUmVxdWVzdCIgLz4NCi0JCTwvd3NkbDpvcGVyYXRpb24+DQotDQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0ib25lV2F5Ij4NCi0JCQk8d3NkbDppbnB1dCBtZXNzYWdlPSJ0bnM6b25lV2F5UmVxdWVzdCIgLz4NCi0JCTwvd3NkbDpvcGVyYXRpb24+DQotDQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0idHdvV2F5SG9sZGVyIj4NCi0JCQk8d3NkbDppbnB1dCBtZXNzYWdlPSJ0bnM6dHdvV2F5SG9sZGVyUmVxdWVzdCIgLz4NCi0JCQk8d3NkbDpvdXRwdXQgbWVzc2FnZT0idG5zOnR3b1dheUhvbGRlclJlc3BvbnNlIiAvPg0KLQkJPC93c2RsOm9wZXJhdGlvbj4NCi0NCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJ0d29XYXkiPg0KLQkJCTx3c2RsOmlucHV0IG1lc3NhZ2U9InRuczp0d29XYXlSZXF1ZXN0IiAvPg0KLQkJCTx3c2RsOm91dHB1dCBtZXNzYWdlPSJ0bnM6dHdvV2F5UmVzcG9uc2UiIC8+DQotCQk8L3dzZGw6b3BlcmF0aW9uPg0KLQkJDQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iaW52b2tlIj4NCi0JCQk8d3NkbDppbnB1dCBtZXNzYWdlPSJ0bnM6aW52b2tlUmVxdWVzdCIgLz4NCi0JCQk8d3NkbDpvdXRwdXQgbWVzc2FnZT0idG5zOmludm9rZVJlc3BvbnNlIiAvPg0KLQkJPC93c2RsOm9wZXJhdGlvbj4NCi0JCQ0KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImZpbk9wIj4NCi0JCQk8d3NkbDppbnB1dCBtZXNzYWdlPSJ0bnM6ZmluT3BSZXF1ZXN0IiAvPg0KLQkJCTx3c2RsOm91dHB1dCBtZXNzYWdlPSJ0bnM6ZmluT3BSZXNwb25zZSIgLz4NCi0JCTwvd3NkbDpvcGVyYXRpb24+DQotDQotCTwvd3NkbDpwb3J0VHlwZT4NCi0NCi0JPHdzZGw6YmluZGluZyBuYW1lPSJQcm94eURvY0xpdFdyYXBwZWQiDQotCQl0eXBlPSJ0bnM6RG9jTGl0V3JhcHBlZFByb3h5Ij4NCi0JCTxzb2FwOmJpbmRpbmcgc3R5bGU9ImRvY3VtZW50Ig0KLQkJCXRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIiAvPg0KLQ0KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9Im9uZVdheVZvaWQiPg0KLQkJCTxzb2FwOm9wZXJhdGlvbg0KLQkJCQlzb2FwQWN0aW9uPSJodHRwOi8vZG9jbGl0d3JhcHBlZC5wcm94eS50ZXN0Lm9yZy90d29XYXlSZXR1cm4iIC8+DQotCQkJPHdzZGw6aW5wdXQ+DQotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPg0KLQkJCTwvd3NkbDppbnB1dD4NCi0JCTwvd3NkbDpvcGVyYXRpb24+DQotDQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0ib25lV2F5Ij4NCi0JCQk8c29hcDpvcGVyYXRpb24NCi0JCQkJc29hcEFjdGlvbj0iaHR0cDovL2RvY2xpdHdyYXBwZWQucHJveHkudGVzdC5vcmcvdHdvV2F5UmV0dXJuIiAvPg0KLQkJCTx3c2RsOmlucHV0Pg0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0JCQk8L3dzZGw6aW5wdXQ+DQotCQk8L3dzZGw6b3BlcmF0aW9uPg0KLQ0KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9InR3b1dheUhvbGRlciI+DQotCQkJPHNvYXA6b3BlcmF0aW9uDQotCQkJCXNvYXBBY3Rpb249Imh0dHA6Ly9kb2NsaXR3cmFwcGVkLnByb3h5LnRlc3Qub3JnL3R3b1dheVJldHVybiIgLz4NCi0JCQk8d3NkbDppbnB1dD4NCi0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+DQotCQkJPC93c2RsOmlucHV0Pg0KLQkJCTx3c2RsOm91dHB1dD4NCi0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+DQotCQkJPC93c2RsOm91dHB1dD4NCi0NCi0JCTwvd3NkbDpvcGVyYXRpb24+DQotDQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0idHdvV2F5Ij4NCi0JCQk8c29hcDpvcGVyYXRpb24NCi0JCQkJc29hcEFjdGlvbj0iaHR0cDovL2RvY2xpdHdyYXBwZWQucHJveHkudGVzdC5vcmcvdHdvV2F5UmV0dXJuIiAvPg0KLQkJCTx3c2RsOmlucHV0Pg0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0JCQk8L3dzZGw6aW5wdXQ+DQotCQkJPHdzZGw6b3V0cHV0Pg0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0JCQk8L3dzZGw6b3V0cHV0Pg0KLQ0KLQkJPC93c2RsOm9wZXJhdGlvbj4NCi0JCQ0KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9Imludm9rZSI+DQotCQkJPHNvYXA6b3BlcmF0aW9uDQotCQkJCXNvYXBBY3Rpb249Imh0dHA6Ly9kb2NsaXR3cmFwcGVkLnByb3h5LnRlc3Qub3JnL3R3b1dheVJldHVybiIgLz4NCi0JCQk8d3NkbDppbnB1dD4NCi0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+DQotCQkJPC93c2RsOmlucHV0Pg0KLQkJCTx3c2RsOm91dHB1dD4NCi0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+DQotCQkJPC93c2RsOm91dHB1dD4NCi0NCi0JCTwvd3NkbDpvcGVyYXRpb24+DQotCQkNCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJmaW5PcCI+DQotCQkJPHNvYXA6b3BlcmF0aW9uDQotCQkJCXNvYXBBY3Rpb249Imh0dHA6Ly9kb2NsaXR3cmFwcGVkLnByb3h5LnRlc3Qub3JnL2Zpbk9wIiAvPg0KLQkJCTx3c2RsOmlucHV0Pg0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0JCQk8L3dzZGw6aW5wdXQ+DQotCQkJPHdzZGw6b3V0cHV0Pg0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0JCQk8L3dzZGw6b3V0cHV0Pg0KLQ0KLQkJPC93c2RsOm9wZXJhdGlvbj4NCi0NCi0JPC93c2RsOmJpbmRpbmc+DQotDQotCTx3c2RsOnNlcnZpY2UgbmFtZT0iUHJveHlEb2NMaXRXcmFwcGVkU2VydmljZSI+DQotCQk8d3NkbDpwb3J0IGJpbmRpbmc9InRuczpQcm94eURvY0xpdFdyYXBwZWQiDQotCQkJbmFtZT0iUHJveHlEb2NMaXRXcmFwcGVkUG9ydCI+DQotCQkJPHNvYXA6YWRkcmVzcw0KLQkJCQlsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo5MDgwL2F4aXMyL3NlcnZpY2VzL1Byb3h5RG9jTGl0V3JhcHBlZFNlcnZpY2UvaW52b2tlIiAvPg0KLQkJPC93c2RsOnBvcnQ+DQotCTwvd3NkbDpzZXJ2aWNlPg0KLQ0KLTwvd3NkbDpkZWZpbml0aW9ucz4NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy93c2RsL1Byb3h5RG9jTGl0bm9uV3JhcHBlZC53c2RsIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9Qcm94eURvY0xpdG5vbldyYXBwZWQud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhiMjk3YS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy93c2RsL1Byb3h5RG9jTGl0bm9uV3JhcHBlZC53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPCEtLQ0KLQlUaGlzIGlzIGEgY29weSBvZiBwcm94eV9kb2NsaXR3ci53c2RsLiBTZXJ2aWNlIGFuZCBwb3J0IG5hbWVzDQotCWhhdmUgYmVlbiBjaG5hZ2VkIHRvIGJlIEFscGhhIGNvbXBhdGlibGUgYW5kIGVuZHBvaW50IGFkZHJlc3MNCi0JaGFzIGJlZW4gY2hhbmdlZA0KLS0tPg0KLTx3c2RsOmRlZmluaXRpb25zIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIg0KLQl4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIg0KLQl4bWxuczp0bnM9Imh0dHA6Ly9kb2NsaXRub253cmFwcGVkLnByb3h5LnRlc3Qub3JnIg0KLQl4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJwcm94eSINCi0JdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vZG9jbGl0bm9ud3JhcHBlZC5wcm94eS50ZXN0Lm9yZyI+DQotCQ0KLQk8d3NkbDp0eXBlcz4NCi0JCTx4c2Q6c2NoZW1hDQotCQkJdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vZG9jbGl0bm9ud3JhcHBlZC5wcm94eS50ZXN0Lm9yZyINCi0JCQl4bWxuczp0bnM9Imh0dHA6Ly9kb2NsaXRub253cmFwcGVkLnByb3h5LnRlc3Qub3JnIg0KLQkJCXhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPg0KLQ0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJNeUZhdWx0IiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPg0KLQkJCQ0KLQkJCQ0KLQkJCQ0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJpbnZva2UiIG5pbGxhYmxlPSJ0cnVlIj4NCi0JCQkJPHhzZDpjb21wbGV4VHlwZT4NCi0JCQkJCTx4c2Q6c2VxdWVuY2U+DQotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Imludm9rZV9zdHIiIHR5cGU9InhzZDpzdHJpbmciIC8+DQotCQkJCQk8L3hzZDpzZXF1ZW5jZT4NCi0JCQkJPC94c2Q6Y29tcGxleFR5cGU+DQotCQkJPC94c2Q6ZWxlbWVudD4JCQkNCi0JCQkNCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iUmV0dXJuVHlwZSIgbmlsbGFibGU9InRydWUiPg0KLQkJCQk8eHNkOmNvbXBsZXhUeXBlPg0KLQkJCQkJPHhzZDpzZXF1ZW5jZT4NCi0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0icmV0dXJuX3N0ciIgdHlwZT0ieHNkOnN0cmluZyIgLz4NCi0JCQkJCTwveHNkOnNlcXVlbmNlPg0KLQkJCQk8L3hzZDpjb21wbGV4VHlwZT4NCi0JCQk8L3hzZDplbGVtZW50PgkJCQkNCi0NCi0JCTwveHNkOnNjaGVtYT4NCi0JPC93c2RsOnR5cGVzPg0KLQ0KLQkNCi0JDQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0iaW52b2tlUmVxdWVzdCI+DQotCQk8d3NkbDpwYXJ0IG5hbWU9ImFsbEJ5TXlzZWxmIiBlbGVtZW50PSJ0bnM6aW52b2tlIiAvPg0KLQk8L3dzZGw6bWVzc2FnZT4NCi0NCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJpbnZva2VSZXNwb25zZSI+DQotCQk8d3NkbDpwYXJ0IG5hbWU9ImFsbEJ5TXlzZWxmIiBlbGVtZW50PSJ0bnM6UmV0dXJuVHlwZSIgLz4NCi0JPC93c2RsOm1lc3NhZ2U+CQ0KLQkNCi0JPHdzZGw6cG9ydFR5cGUgbmFtZT0iRG9jTGl0bm9uV3JhcHBlZFByb3h5Ij4NCi0NCi0JCQ0KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9Imludm9rZSI+DQotCQkJPHdzZGw6aW5wdXQgbWVzc2FnZT0idG5zOmludm9rZVJlcXVlc3QiIC8+DQotCQkJPHdzZGw6b3V0cHV0IG1lc3NhZ2U9InRuczppbnZva2VSZXNwb25zZSIgLz4NCi0JCTwvd3NkbDpvcGVyYXRpb24+CQkNCi0JCQkNCi0JPC93c2RsOnBvcnRUeXBlPg0KLQkNCi0JPHdzZGw6YmluZGluZyBuYW1lPSJQcm94eURvY0xpdG5vbldyYXBwZWQiIHR5cGU9InRuczpEb2NMaXRub25XcmFwcGVkUHJveHkiPg0KLQkJPHNvYXA6YmluZGluZyBzdHlsZT0iZG9jdW1lbnQiIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIiAvPgkJDQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iaW52b2tlIj4NCi0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL2RvY2xpdG5vbndyYXBwZWQucHJveHkudGVzdC5vcmcvaW52b2tlUmV0dXJuIiAvPg0KLQkJCTx3c2RsOmlucHV0Pg0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgIC8+DQotCQkJPC93c2RsOmlucHV0Pg0KLQkJCTx3c2RsOm91dHB1dD4NCi0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiICAvPg0KLQkJCTwvd3NkbDpvdXRwdXQ+DQotCQ0KLQkJPC93c2RsOm9wZXJhdGlvbj4JCQ0KLQkNCi0JPC93c2RsOmJpbmRpbmc+DQotCQ0KLQk8d3NkbDpzZXJ2aWNlIG5hbWU9IlByb3h5RG9jTGl0VW53cmFwcGVkU2VydmljZSI+DQotCQk8d3NkbDpwb3J0IGJpbmRpbmc9InRuczpQcm94eURvY0xpdG5vbldyYXBwZWQiIG5hbWU9IlByb3h5RG9jTGl0bm9uV3JhcHBlZFBvcnQiPg0KLQkJCTxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9ASE9TVEA6QFBPUlRAL2pheHdzLnByb3h5L3NlcnZpY2VzL1Byb3h5RG9jTGl0VW53cmFwcGVkU2VydmljZSIgLz4NCi0JCTwvd3NkbDpwb3J0Pg0KLQk8L3dzZGw6c2VydmljZT4NCi0JDQotPC93c2RsOmRlZmluaXRpb25zPg0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3dzZGwvUlBDTGl0LndzZGwgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy93c2RsL1JQQ0xpdC53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODc2YjYxLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3dzZGwvUlBDTGl0LndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSw2MjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi0NCi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08d3NkbDpkZWZpbml0aW9ucyB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L3JwY2xpdCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB4bWxuczphcGFjaGVzb2FwPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveG1sLXNvYXAiIHhtbG5zOmltcGw9Imh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L3JwY2xpdCIgeG1sbnM6aW50Zj0iaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvcnBjbGl0IiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIgeG1sbnM6d3NkbHNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPg0KLSA8d3NkbDp0eXBlcz4NCi0gIDxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9ycGNsaXQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+DQotICANCi0gIDwhLS0gRXhhbXBsZSBvZiBhIFFOYW1lIGxpc3QuICBUaGlzIHNob3VsZCBtYXAgdG8gamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZVtdIC0tPg0KLSAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJRTmFtZUxpc3QiPg0KLSAgICAgIDx4c2Q6bGlzdCBpdGVtVHlwZT0ieHNkOlFOYW1lIi8+DQotICAgPC94c2Q6c2ltcGxlVHlwZT4NCi0gICA8ZWxlbWVudCBuYW1lPSJRTmFtZUxpc3QiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJpbXBsOlFOYW1lTGlzdCIvPg0KLQ0KLSAgPCEtLSBFeGFtcGxlIG9mIGEgQ2FsZW5kYXIgbGlzdC4gIFRoaXMgc2hvdWxkIG1hcCB0byBqYXZhLnV0aWwuQ2FsZW5kYXJbXSAtLT4NCi0gICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iQ2FsZW5kYXJMaXN0Ij4gICANCi0gICAgICA8eHNkOmxpc3QgaXRlbVR5cGU9InhzZDpkYXRlVGltZSIvPiANCi0gICA8L3hzZDpzaW1wbGVUeXBlPiAgICAgICAgICAgICAgICAgDQotICAgPGVsZW1lbnQgbmFtZT0iQ2FsZW5kYXJMaXN0IiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0iaW1wbDpDYWxlbmRhckxpc3QiLz4NCi0gIA0KLSAgPCEtLSBFeGFtcGxlIG9mIGEgU3RyaW5nIGxpc3QuICBUaGlzIHNob3VsZCBtYXAgdG8gamF2YS5sYW5nLlN0cmluZ1tdIC0tPg0KLSAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJTdHJpbmdMaXN0Ij4gICANCi0gICAgICA8eHNkOmxpc3QgaXRlbVR5cGU9InhzZDpzdHJpbmciLz4gDQotICAgPC94c2Q6c2ltcGxlVHlwZT4NCi0gICA8ZWxlbWVudCBuYW1lPSJTdHJpbmdMaXN0IiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0iaW1wbDpTdHJpbmdMaXN0Ii8+DQotICANCi0gIDwhLS0gRXhhbXBsZSBvZiBhIHhzZDpuZWdhdGl2ZUludGVnZXIgbGlzdC4gIFRoaXMgc2hvdWxkIG1hcCB0byBqYXZhLm1hdGguQmlnSW50ZWdlcltdIC0tPg0KLSAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJCaWdJbnRlZ2VyTGlzdCI+DQotICAgICAgPHhzZDpyZXN0cmljdGlvbj4gICAgIA0KLSAgICAgICAgICA8eHNkOnNpbXBsZVR5cGU+IA0KLSAgICAgICAgICAgICA8eHNkOmxpc3QgaXRlbVR5cGU9InhzZDpuZWdhdGl2ZUludGVnZXIiLz4NCi0gICAgICAgICAgPC94c2Q6c2ltcGxlVHlwZT4NCi0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4NCi0gICA8L3hzZDpzaW1wbGVUeXBlPg0KLSAgIDxlbGVtZW50IG5hbWU9IkJpZ0ludGVnZXJMaXN0IiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0iaW1wbDpCaWdJbnRlZ2VyTGlzdCIvPg0KLSAgDQotICA8IS0tIEV4YW1wbGUgb2YgYSB4c2Q6dW5zaWduZWRJbnQgbGlzdC4gIFRoaXMgc2hvdWxkIG1hcCB0byBsb25nW10gLS0+DQotICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkxvbmdMaXN0Ij4NCi0gICAgICA8eHNkOmxpc3Q+DQotICAgICAgICAgIDx4c2Q6c2ltcGxlVHlwZT4NCi0gICAgICAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dW5zaWduZWRJbnQiLz4NCi0gICAgICAgICAgPC94c2Q6c2ltcGxlVHlwZT4NCi0gICAgICA8L3hzZDpsaXN0Pg0KLSAgIDwveHNkOnNpbXBsZVR5cGU+DQotICAgPGVsZW1lbnQgbmFtZT0iTG9uZ0xpc3QiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJpbXBsOkxvbmdMaXN0Ii8+DQotICAgDQotICA8IS0tIEV4YW1wbGUgb2YgYW4gRW51bWVyYXRpb24gdHlwZS4gIFRoaXMgc2hvdWxkIG1hcCB0byBFbnVtLmphdmEgLS0+ICANCi0gICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iRW51bSI+DQotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4NCi0gICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ib25lIi8+ICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ0d28iLz4gICAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ0aHJlZSIvPiAgICAgICAgICAgICAgICAgICAgDQotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+DQotICAgPC94c2Q6c2ltcGxlVHlwZT4NCi0gICA8ZWxlbWVudCBuYW1lPSJFbnVtIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0iaW1wbDpFbnVtIi8+DQotIA0KLSAgPCEtLSBFeGFtcGxlIG9mIGEgeHNkOmVudW1lcmF0aW9uIGxpc3QuICBUaGlzIHNob3VsZCBtYXAgdG8gRW51bVtdIC0tPiAgDQotICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkVudW1MaXN0Ij4NCi0gICAgICA8eHNkOmxpc3QgaXRlbVR5cGU9ImltcGw6RW51bSIvPiANCi0gICA8L3hzZDpzaW1wbGVUeXBlPg0KLSAgIDxlbGVtZW50IG5hbWU9IkVudW1MaXN0IiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0iaW1wbDpFbnVtTGlzdCIvPg0KLSAgDQotICA8IS0tIEV4YW1wbGUgb2YgYSB4c2Q6ZW51bWVyYXRpb24gZW1iZWRkZWQgbGlzdC4gIFRoaXMgc2hvdWxkIG1hcCB0byBFbnVtTGlzdDJbXSAtLT4gDQotICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkVudW1MaXN0MiI+DQotICAgICAgPHhzZDpsaXN0Pg0KLSAgICAgICAgICA8eHNkOnNpbXBsZVR5cGU+DQotICAgICAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4NCi0gICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxlIiAvPg0KLSAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JhbmdlIiAvPg0KLSAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JhcGUiIC8+DQotICAgICAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+DQotICAgICAgICAgIDwveHNkOnNpbXBsZVR5cGU+DQotICAgICAgPC94c2Q6bGlzdD4NCi0gICA8L3hzZDpzaW1wbGVUeXBlPg0KLSAgIDxlbGVtZW50IG5hbWU9IkVudW1MaXN0MiIgbmlsbGFibGU9InRydWUiIHR5cGU9ImltcGw6RW51bUxpc3QyIi8+IA0KLQ0KLSAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29tcGxleEFsbCI+DQotICAgICAgPHhzZDphbGw+DQotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJteUludCIgdHlwZT0ieHNkOmludCIvPg0KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibXlTdHJpbmciIHR5cGU9InhzZDpzdHJpbmciLz4NCi0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkVudW0iIHR5cGU9ImltcGw6RW51bSIvPg0KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibXlRTmFtZUxpc3QiIHR5cGU9ImltcGw6UU5hbWVMaXN0Ii8+DQotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJteUNhbGVuZGFyTGlzdCIgdHlwZT0iaW1wbDpDYWxlbmRhckxpc3QiLz4NCi0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im15U3RyaW5nTGlzdCIgdHlwZT0iaW1wbDpTdHJpbmdMaXN0Ii8+DQotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJteUJpZ0ludGVnZXJMaXN0IiB0eXBlPSJpbXBsOkJpZ0ludGVnZXJMaXN0Ii8+DQotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJteUxvbmdMaXN0IiB0eXBlPSJpbXBsOkxvbmdMaXN0Ii8+DQotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJteUVudW1MaXN0IiB0eXBlPSJpbXBsOkVudW1MaXN0Ii8+DQotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJteUVudW1MaXN0MiIgdHlwZT0iaW1wbDpFbnVtTGlzdDIiLz4NCi0gICAgICA8L3hzZDphbGw+DQotICAgPC94c2Q6Y29tcGxleFR5cGU+DQotICAgDQotICAgPHhzZDplbGVtZW50IG5hbWU9ImhlYWRlclBhcmFtIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPg0KLSAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJoZWFkZXJSZXR1cm4iIHR5cGU9InhzZDpzdHJpbmciIC8+DQotICAgDQotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJteUZhdWx0IiB0eXBlPSJ4c2Q6aW50IiAvPg0KLSAgPC9zY2hlbWE+DQotIDwvd3NkbDp0eXBlcz4NCi0NCi0gICA8d3NkbDptZXNzYWdlIG5hbWU9InRlc3RMaXN0c1Jlc3BvbnNlIj4NCi0NCi0gICAgICA8d3NkbDpwYXJ0IG5hbWU9InRlc3RMaXN0c1JldHVybiIgdHlwZT0iaW1wbDpRTmFtZUxpc3QiLz4NCi0NCi0gICA8L3dzZGw6bWVzc2FnZT4NCi0NCi0gICA8d3NkbDptZXNzYWdlIG5hbWU9InRlc3RMaXN0c1JlcXVlc3QiPg0KLQ0KLSAgICAgIDx3c2RsOnBhcnQgbmFtZT0iYXJnXzBfMCIgdHlwZT0iaW1wbDpRTmFtZUxpc3QiLz4NCi0NCi0gICAgICA8d3NkbDpwYXJ0IG5hbWU9ImFyZ18xXzAiIHR5cGU9ImltcGw6Q2FsZW5kYXJMaXN0Ii8+DQotDQotICAgICAgPHdzZGw6cGFydCBuYW1lPSJhcmdfMl8wIiB0eXBlPSJpbXBsOlN0cmluZ0xpc3QiLz4NCi0gICAgICANCi0gICAgICA8d3NkbDpwYXJ0IG5hbWU9ImFyZ18zXzAiIHR5cGU9ImltcGw6QmlnSW50ZWdlckxpc3QiLz4NCi0gICAgICANCi0gICAgICA8d3NkbDpwYXJ0IG5hbWU9ImFyZ180XzAiIHR5cGU9ImltcGw6TG9uZ0xpc3QiLz4NCi0gICAgICANCi0gICAgICA8d3NkbDpwYXJ0IG5hbWU9ImFyZ181XzAiIHR5cGU9ImltcGw6RW51bUxpc3QiLz4NCi0gICAgICANCi0gICAgICA8d3NkbDpwYXJ0IG5hbWU9ImFyZ183XzAiIHR5cGU9ImltcGw6RW51bUxpc3QyIi8+DQotICAgICAgDQotICAgICAgPHdzZGw6cGFydCBuYW1lPSJhcmdfNl8wIiB0eXBlPSJpbXBsOmNvbXBsZXhBbGwiLz4NCi0NCi0gICA8L3dzZGw6bWVzc2FnZT4NCi0gICANCi0gICANCi0gICA8d3NkbDptZXNzYWdlIG5hbWU9InRlc3RDYWxlbmRhckxpc3QxUmVzcG9uc2UiPg0KLQ0KLSAgICAgIDx3c2RsOnBhcnQgbmFtZT0idGVzdENhbGVuZGFyTGlzdDFSZXR1cm4iIHR5cGU9ImltcGw6Q2FsZW5kYXJMaXN0Ii8+DQotDQotICAgPC93c2RsOm1lc3NhZ2U+DQotDQotICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJ0ZXN0Q2FsZW5kYXJMaXN0MVJlcXVlc3QiPg0KLQ0KLSAgICAgIDx3c2RsOnBhcnQgbmFtZT0iYXJnXzFfMCIgdHlwZT0iaW1wbDpDYWxlbmRhckxpc3QiLz4NCi0NCi0gICA8L3dzZGw6bWVzc2FnZT4NCi0gICANCi0gICA8d3NkbDptZXNzYWdlIG5hbWU9InRlc3RTdHJpbmdMaXN0MlJlc3BvbnNlIj4NCi0NCi0gICAgICA8d3NkbDpwYXJ0IG5hbWU9InRlc3RTdHJpbmdMaXN0MlJldHVybiIgdHlwZT0iaW1wbDpTdHJpbmdMaXN0Ii8+DQotDQotICAgPC93c2RsOm1lc3NhZ2U+DQotDQotICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJ0ZXN0U3RyaW5nTGlzdDJSZXF1ZXN0Ij4NCi0NCi0gICAgICA8d3NkbDpwYXJ0IG5hbWU9ImFyZ18yXzAiIHR5cGU9ImltcGw6U3RyaW5nTGlzdCIvPg0KLQ0KLSAgIDwvd3NkbDptZXNzYWdlPg0KLSAgIA0KLSAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0idGVzdEJpZ0ludGVnZXJMaXN0M1Jlc3BvbnNlIj4NCi0NCi0gICAgICA8d3NkbDpwYXJ0IG5hbWU9InRlc3RCaWdJbnRlZ2VyTGlzdDNSZXR1cm4iIHR5cGU9ImltcGw6QmlnSW50ZWdlckxpc3QiLz4NCi0NCi0gICA8L3dzZGw6bWVzc2FnZT4NCi0NCi0gICA8d3NkbDptZXNzYWdlIG5hbWU9InRlc3RCaWdJbnRlZ2VyTGlzdDNSZXF1ZXN0Ij4NCi0NCi0gICAgICA8d3NkbDpwYXJ0IG5hbWU9ImFyZ18zXzAiIHR5cGU9ImltcGw6QmlnSW50ZWdlckxpc3QiLz4NCi0NCi0gICA8L3dzZGw6bWVzc2FnZT4NCi0gICANCi0gICA8d3NkbDptZXNzYWdlIG5hbWU9InRlc3RMb25nTGlzdDRSZXNwb25zZSI+DQotDQotICAgICAgPHdzZGw6cGFydCBuYW1lPSJ0ZXN0TG9uZ0xpc3Q0UmV0dXJuIiB0eXBlPSJpbXBsOkxvbmdMaXN0Ii8+DQotDQotICAgPC93c2RsOm1lc3NhZ2U+DQotDQotICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJ0ZXN0TG9uZ0xpc3Q0UmVxdWVzdCI+DQotDQotICAgICAgPHdzZGw6cGFydCBuYW1lPSJhcmdfNF8wIiB0eXBlPSJpbXBsOkxvbmdMaXN0Ii8+DQotDQotICAgPC93c2RsOm1lc3NhZ2U+DQotICAgDQotICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJ0ZXN0RW51bUxpc3Q1UmVzcG9uc2UiPg0KLQ0KLSAgICAgIDx3c2RsOnBhcnQgbmFtZT0idGVzdEVudW1MaXN0NVJldHVybiIgdHlwZT0iaW1wbDpFbnVtTGlzdCIvPg0KLQ0KLSAgIDwvd3NkbDptZXNzYWdlPg0KLQ0KLSAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0idGVzdEVudW1MaXN0NVJlcXVlc3QiPg0KLQ0KLSAgICAgIDx3c2RsOnBhcnQgbmFtZT0iYXJnXzVfMCIgdHlwZT0iaW1wbDpFbnVtTGlzdCIvPg0KLQ0KLSAgIDwvd3NkbDptZXNzYWdlPg0KLSAgIA0KLSAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0idGVzdEVudW1MaXN0N1Jlc3BvbnNlIj4NCi0NCi0gICAgICA8d3NkbDpwYXJ0IG5hbWU9InRlc3RFbnVtTGlzdDdSZXR1cm4iIHR5cGU9ImltcGw6RW51bUxpc3QyIi8+DQotDQotICAgPC93c2RsOm1lc3NhZ2U+DQotDQotICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJ0ZXN0RW51bUxpc3Q3UmVxdWVzdCI+DQotDQotICAgICAgPHdzZGw6cGFydCBuYW1lPSJhcmdfN18wIiB0eXBlPSJpbXBsOkVudW1MaXN0MiIvPg0KLQ0KLSAgIDwvd3NkbDptZXNzYWdlPg0KLQ0KLSAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0idGVzdENvbXBsZXhBbGw2UmVzcG9uc2UiPg0KLQ0KLSAgICAgIDx3c2RsOnBhcnQgbmFtZT0idGVzdENvbXBsZXhBbGw2UmV0dXJuIiB0eXBlPSJpbXBsOmNvbXBsZXhBbGwiLz4NCi0NCi0gICA8L3dzZGw6bWVzc2FnZT4NCi0NCi0gICA8d3NkbDptZXNzYWdlIG5hbWU9InRlc3RDb21wbGV4QWxsNlJlcXVlc3QiPg0KLQ0KLSAgICAgIDx3c2RsOnBhcnQgbmFtZT0iYXJnXzZfMCIgdHlwZT0iaW1wbDpjb21wbGV4QWxsIi8+DQotDQotICAgPC93c2RsOm1lc3NhZ2U+DQotDQotICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJ0ZXN0U2ltcGxlUmVxdWVzdCI+DQotDQotICAgICAgPHdzZGw6cGFydCBuYW1lPSJzaW1wbGVJbiIgdHlwZT0ieHNkOnN0cmluZyIvPg0KLQ0KLSAgIDwvd3NkbDptZXNzYWdlPg0KLQ0KLSAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0idGVzdFNpbXBsZVJlc3BvbnNlIj4NCi0NCi0gICAgICA8d3NkbDpwYXJ0IG5hbWU9InNpbXBsZU91dCIgdHlwZT0ieHNkOnN0cmluZyIvPg0KLQ0KLSAgIDwvd3NkbDptZXNzYWdlPg0KLSAgIA0KLSAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0idGVzdFNpbXBsZUluT3V0UmVxdWVzdCI+DQotDQotICAgICAgPHdzZGw6cGFydCBuYW1lPSJzaW1wbGVJbk91dCIgdHlwZT0ieHNkOnN0cmluZyIvPg0KLQ0KLSAgIDwvd3NkbDptZXNzYWdlPg0KLQ0KLSAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0idGVzdFNpbXBsZUluT3V0UmVzcG9uc2UiPg0KLQ0KLSAgICAgIDx3c2RsOnBhcnQgbmFtZT0ic2ltcGxlT3V0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+DQotICAgICAgPHdzZGw6cGFydCBuYW1lPSJzaW1wbGVJbk91dCIgdHlwZT0ieHNkOnN0cmluZyIvPg0KLQ0KLSAgIDwvd3NkbDptZXNzYWdlPg0KLSAgIA0KLSAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0idGVzdFNpbXBsZTJSZXF1ZXN0Ij4NCi0NCi0gICAgICA8d3NkbDpwYXJ0IG5hbWU9InNpbXBsZTJJbjEiIHR5cGU9InhzZDpzdHJpbmciLz4NCi0gICAgICA8d3NkbDpwYXJ0IG5hbWU9InNpbXBsZTJJbjEiIHR5cGU9InhzZDpzdHJpbmciLz4NCi0NCi0gICA8L3dzZGw6bWVzc2FnZT4NCi0NCi0gICA8d3NkbDptZXNzYWdlIG5hbWU9InRlc3RTaW1wbGUyUmVzcG9uc2UiPg0KLQ0KLSAgICAgIDx3c2RsOnBhcnQgbmFtZT0ic2ltcGxlMk91dCIgdHlwZT0ieHNkOnN0cmluZyIvPg0KLQ0KLSAgIDwvd3NkbDptZXNzYWdlPg0KLSAgIA0KLSAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0idGVzdEhlYWRlclJlcXVlc3QiPg0KLQ0KLSAgICAgIDx3c2RsOnBhcnQgbmFtZT0iYm9keVBhcmFtIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+DQotICAgICAgPHdzZGw6cGFydCBuYW1lPSJoZWFkZXJQYXJhbSIgZWxlbWVudD0iaW1wbDpoZWFkZXJQYXJhbSIvPg0KLQ0KLSAgIDwvd3NkbDptZXNzYWdlPg0KLQ0KLSAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0idGVzdEhlYWRlclJlc3BvbnNlIj4NCi0NCi0gICAgICA8d3NkbDpwYXJ0IG5hbWU9ImhlYWRlclJldHVybiIgdHlwZT0iaW1wbDpoZWFkZXJSZXR1cm4iIC8+DQotDQotICAgPC93c2RsOm1lc3NhZ2U+DQotICAgDQotICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJ0ZXN0RmF1bHRSZXF1ZXN0IiAvPg0KLSAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0idGVzdEZhdWx0UmVzcG9uc2UiIC8+DQotICAgDQotICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJycGNGYXVsdCI+DQotICAgICA8d3NkbDpwYXJ0IG5hbWU9InJwY0ZhdWx0IiBlbGVtZW50PSJpbXBsOm15RmF1bHQiIC8+DQotICAgPC93c2RsOm1lc3NhZ2U+DQotDQotICAgPHdzZGw6cG9ydFR5cGUgbmFtZT0iUlBDTGl0Ij4NCi0gICAgIA0KLSAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJ0ZXN0U2ltcGxlIiBwYXJhbWV0ZXJPcmRlcj0ic2ltcGxlSW4iPg0KLQ0KLSAgICAgICAgIDx3c2RsOmlucHV0IG1lc3NhZ2U9ImltcGw6dGVzdFNpbXBsZVJlcXVlc3QiIG5hbWU9InRlc3RTaW1wbGVSZXF1ZXN0Ii8+DQotDQotICAgICAgICAgPHdzZGw6b3V0cHV0IG1lc3NhZ2U9ImltcGw6dGVzdFNpbXBsZVJlc3BvbnNlIiBuYW1lPSJ0ZXN0U2ltcGxlUmVzcG9uc2UiLz4NCi0NCi0gICAgICA8L3dzZGw6b3BlcmF0aW9uPg0KLSAgICAgIA0KLSAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0idGVzdFNpbXBsZUluT3V0IiBwYXJhbWV0ZXJPcmRlcj0ic2ltcGxlSW5PdXQiPg0KLQ0KLSAgICAgICAgIDx3c2RsOmlucHV0IG1lc3NhZ2U9ImltcGw6dGVzdFNpbXBsZUluT3V0UmVxdWVzdCIgbmFtZT0idGVzdFNpbXBsZUluT3V0UmVxdWVzdCIvPg0KLQ0KLSAgICAgICAgIDx3c2RsOm91dHB1dCBtZXNzYWdlPSJpbXBsOnRlc3RTaW1wbGVJbk91dFJlc3BvbnNlIiBuYW1lPSJ0ZXN0U2ltcGxlSW5PdXRSZXNwb25zZSIvPg0KLQ0KLSAgICAgIDwvd3NkbDpvcGVyYXRpb24+DQotICAgICAgDQotICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InRlc3RTaW1wbGUyIiBwYXJhbWV0ZXJPcmRlcj0ic2ltcGxlMkluMSBzaW1wbGUySW4yIj4NCi0NCi0gICAgICAgICA8d3NkbDppbnB1dCBtZXNzYWdlPSJpbXBsOnRlc3RTaW1wbGUyUmVxdWVzdCIgbmFtZT0idGVzdFNpbXBsZTJSZXF1ZXN0Ii8+DQotDQotICAgICAgICAgPHdzZGw6b3V0cHV0IG1lc3NhZ2U9ImltcGw6dGVzdFNpbXBsZTJSZXNwb25zZSIgbmFtZT0idGVzdFNpbXBsZTJSZXNwb25zZSIvPg0KLQ0KLSAgICAgIDwvd3NkbDpvcGVyYXRpb24+DQotICAgICAgDQotICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InRlc3RIZWFkZXIiIHBhcmFtZXRlck9yZGVyPSJib2R5UGFyYW0gaGVhZGVyUGFyYW0iPg0KLQ0KLSAgICAgICAgIDx3c2RsOmlucHV0IG1lc3NhZ2U9ImltcGw6dGVzdEhlYWRlclJlcXVlc3QiIG5hbWU9InRlc3RIZWFkZXJSZXF1ZXN0Ii8+DQotDQotICAgICAgICAgPHdzZGw6b3V0cHV0IG1lc3NhZ2U9ImltcGw6dGVzdEhlYWRlclJlc3BvbnNlIiBuYW1lPSJ0ZXN0SGVhZGVyUmVzcG9uc2UiLz4NCi0NCi0gICAgICA8L3dzZGw6b3BlcmF0aW9uPg0KLQ0KLSAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJ0ZXN0TGlzdHMiIHBhcmFtZXRlck9yZGVyPSJhcmdfMF8wIGFyZ18xXzAgYXJnXzJfMCBhcmdfM18wIGFyZ180XzAgYXJnXzVfMCBhcmdfN18wIGFyZ182XzAiPg0KLQ0KLSAgICAgICAgIDx3c2RsOmlucHV0IG1lc3NhZ2U9ImltcGw6dGVzdExpc3RzUmVxdWVzdCIgbmFtZT0idGVzdExpc3RzUmVxdWVzdCIvPg0KLQ0KLSAgICAgICAgIDx3c2RsOm91dHB1dCBtZXNzYWdlPSJpbXBsOnRlc3RMaXN0c1Jlc3BvbnNlIiBuYW1lPSJ0ZXN0TGlzdHNSZXNwb25zZSIvPg0KLQ0KLSAgICAgIDwvd3NkbDpvcGVyYXRpb24+DQotICAgICAgDQotICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InRlc3RDYWxlbmRhckxpc3QxIiBwYXJhbWV0ZXJPcmRlcj0iYXJnXzFfMCI+DQotDQotICAgICAgICAgPHdzZGw6aW5wdXQgbWVzc2FnZT0iaW1wbDp0ZXN0Q2FsZW5kYXJMaXN0MVJlcXVlc3QiIG5hbWU9InRlc3RDYWxlbmRhckxpc3QxUmVxdWVzdCIvPg0KLQ0KLSAgICAgICAgIDx3c2RsOm91dHB1dCBtZXNzYWdlPSJpbXBsOnRlc3RDYWxlbmRhckxpc3QxUmVzcG9uc2UiIG5hbWU9InRlc3RDYWxlbmRhckxpc3QxUmVzcG9uc2UiLz4NCi0NCi0gICAgICA8L3dzZGw6b3BlcmF0aW9uPg0KLSAgICAgIA0KLSAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJ0ZXN0U3RyaW5nTGlzdDIiIHBhcmFtZXRlck9yZGVyPSJhcmdfMl8wIj4NCi0NCi0gICAgICAgICA8d3NkbDppbnB1dCBtZXNzYWdlPSJpbXBsOnRlc3RTdHJpbmdMaXN0MlJlcXVlc3QiIG5hbWU9InRlc3RTdHJpbmdMaXN0MlJlcXVlc3QiLz4NCi0NCi0gICAgICAgICA8d3NkbDpvdXRwdXQgbWVzc2FnZT0iaW1wbDp0ZXN0U3RyaW5nTGlzdDJSZXNwb25zZSIgbmFtZT0idGVzdFN0cmluZ0xpc3QyUmVzcG9uc2UiLz4NCi0NCi0gICAgICA8L3dzZGw6b3BlcmF0aW9uPg0KLSAgICAgIA0KLSAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJ0ZXN0QmlnSW50ZWdlckxpc3QzIiBwYXJhbWV0ZXJPcmRlcj0iYXJnXzNfMCI+DQotDQotICAgICAgICAgPHdzZGw6aW5wdXQgbWVzc2FnZT0iaW1wbDp0ZXN0QmlnSW50ZWdlckxpc3QzUmVxdWVzdCIgbmFtZT0idGVzdEJpZ0ludGVnZXJMaXN0M1JlcXVlc3QiLz4NCi0NCi0gICAgICAgICA8d3NkbDpvdXRwdXQgbWVzc2FnZT0iaW1wbDp0ZXN0QmlnSW50ZWdlckxpc3QzUmVzcG9uc2UiIG5hbWU9InRlc3RCaWdJbnRlZ2VyTGlzdDNSZXNwb25zZSIvPg0KLQ0KLSAgICAgIDwvd3NkbDpvcGVyYXRpb24+DQotICAgICAgDQotICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InRlc3RMb25nTGlzdDQiIHBhcmFtZXRlck9yZGVyPSJhcmdfNF8wIj4NCi0NCi0gICAgICAgICA8d3NkbDppbnB1dCBtZXNzYWdlPSJpbXBsOnRlc3RMb25nTGlzdDRSZXF1ZXN0IiBuYW1lPSJ0ZXN0TG9uZ0xpc3Q0UmVxdWVzdCIvPg0KLQ0KLSAgICAgICAgIDx3c2RsOm91dHB1dCBtZXNzYWdlPSJpbXBsOnRlc3RMb25nTGlzdDRSZXNwb25zZSIgbmFtZT0idGVzdExvbmdMaXN0NFJlc3BvbnNlIi8+DQotDQotICAgICAgPC93c2RsOm9wZXJhdGlvbj4NCi0gICAgICANCi0gICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0idGVzdEVudW1MaXN0NSIgcGFyYW1ldGVyT3JkZXI9ImFyZ181XzAiPg0KLQ0KLSAgICAgICAgIDx3c2RsOmlucHV0IG1lc3NhZ2U9ImltcGw6dGVzdEVudW1MaXN0NVJlcXVlc3QiIG5hbWU9InRlc3RFbnVtTGlzdDVSZXF1ZXN0Ii8+DQotDQotICAgICAgICAgPHdzZGw6b3V0cHV0IG1lc3NhZ2U9ImltcGw6dGVzdEVudW1MaXN0NVJlc3BvbnNlIiBuYW1lPSJ0ZXN0RW51bUxpc3Q1UmVzcG9uc2UiLz4NCi0NCi0gICAgICA8L3dzZGw6b3BlcmF0aW9uPg0KLSAgICAgIA0KLSAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJ0ZXN0RW51bUxpc3Q3IiBwYXJhbWV0ZXJPcmRlcj0iYXJnXzdfMCI+DQotDQotICAgICAgICAgPHdzZGw6aW5wdXQgbWVzc2FnZT0iaW1wbDp0ZXN0RW51bUxpc3Q3UmVxdWVzdCIgbmFtZT0idGVzdEVudW1MaXN0N1JlcXVlc3QiLz4NCi0NCi0gICAgICAgICA8d3NkbDpvdXRwdXQgbWVzc2FnZT0iaW1wbDp0ZXN0RW51bUxpc3Q3UmVzcG9uc2UiIG5hbWU9InRlc3RFbnVtTGlzdDdSZXNwb25zZSIvPg0KLQ0KLSAgICAgIDwvd3NkbDpvcGVyYXRpb24+DQotICAgICAgDQotICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InRlc3RDb21wbGV4QWxsNiIgcGFyYW1ldGVyT3JkZXI9ImFyZ182XzAiPg0KLQ0KLSAgICAgICAgIDx3c2RsOmlucHV0IG1lc3NhZ2U9ImltcGw6dGVzdENvbXBsZXhBbGw2UmVxdWVzdCIgbmFtZT0idGVzdENvbXBsZXhBbGw2UmVxdWVzdCIvPg0KLQ0KLSAgICAgICAgIDx3c2RsOm91dHB1dCBtZXNzYWdlPSJpbXBsOnRlc3RDb21wbGV4QWxsNlJlc3BvbnNlIiBuYW1lPSJ0ZXN0Q29tcGxleEFsbDZSZXNwb25zZSIvPg0KLQ0KLSAgICAgIDwvd3NkbDpvcGVyYXRpb24+DQotICAgICAgDQotICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InRlc3RGYXVsdCI+DQotDQotICAgICAgICAgPHdzZGw6aW5wdXQgbWVzc2FnZT0iaW1wbDp0ZXN0RmF1bHRSZXF1ZXN0IiBuYW1lPSJ0ZXN0RmF1bHRSZXF1ZXN0Ii8+DQotDQotICAgICAgICAgPHdzZGw6b3V0cHV0IG1lc3NhZ2U9ImltcGw6dGVzdEZhdWx0UmVzcG9uc2UiIG5hbWU9InRlc3RGYXVsdFJlc3BvbnNlIi8+DQotICAgICAgICAgPHdzZGw6ZmF1bHQgbmFtZT0icnBjRmF1bHQiIG1lc3NhZ2U9ImltcGw6cnBjRmF1bHQiIC8+DQotICAgICAgPC93c2RsOm9wZXJhdGlvbj4NCi0gICAgICANCi0gICA8L3dzZGw6cG9ydFR5cGU+DQotDQotICAgPHdzZGw6YmluZGluZyBuYW1lPSJSUENMaXRTb2FwQmluZGluZyIgdHlwZT0iaW1wbDpSUENMaXQiPg0KLQ0KLSAgICAgIDx3c2Rsc29hcDpiaW5kaW5nIHN0eWxlPSJycGMiIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIi8+DQotDQotICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0idGVzdFNpbXBsZSI+DQotDQotICAgICAgICAgPHdzZGw6aW5wdXQgbmFtZT0idGVzdFNpbXBsZVJlcXVlc3QiPg0KLSAgICAgICAgICAgICAgIDx3c2Rsc29hcDpib2R5IG5hbWVzcGFjZT0iaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvcnBjbGl0IiB1c2U9ImxpdGVyYWwiLz4NCi0gICAgICAgICA8L3dzZGw6aW5wdXQ+DQotDQotICAgICAgICAgPHdzZGw6b3V0cHV0IG5hbWU9InRlc3RTaW1wbGVSZXNwb25zZSI+DQotICAgICAgICAgICAgICAgPHdzZGxzb2FwOmJvZHkgbmFtZXNwYWNlPSJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9ycGNsaXQiIHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgICAgIDwvd3NkbDpvdXRwdXQ+DQotDQotICAgICAgPC93c2RsOm9wZXJhdGlvbj4NCi0gICAgICANCi0gICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0idGVzdFNpbXBsZUluT3V0Ij4NCi0NCi0gICAgICAgICA8d3NkbDppbnB1dCBuYW1lPSJ0ZXN0U2ltcGxlSW5PdXRSZXF1ZXN0Ij4NCi0gICAgICAgICAgICAgICA8d3NkbHNvYXA6Ym9keSBuYW1lc3BhY2U9Imh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L3JwY2xpdCIgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgICAgPC93c2RsOmlucHV0Pg0KLQ0KLSAgICAgICAgIDx3c2RsOm91dHB1dCBuYW1lPSJ0ZXN0U2ltcGxlSW5PdXRSZXNwb25zZSI+DQotICAgICAgICAgICAgICAgPHdzZGxzb2FwOmJvZHkgbmFtZXNwYWNlPSJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9ycGNsaXQiIHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgICAgIDwvd3NkbDpvdXRwdXQ+DQotDQotICAgICAgPC93c2RsOm9wZXJhdGlvbj4NCi0gICAgICANCi0gICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0idGVzdFNpbXBsZTIiPg0KLQ0KLSAgICAgICAgIDx3c2RsOmlucHV0IG5hbWU9InRlc3RTaW1wbGUyUmVxdWVzdCI+DQotICAgICAgICAgICAgICAgPHdzZGxzb2FwOmJvZHkgbmFtZXNwYWNlPSJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9ycGNsaXQiIHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgICAgIDwvd3NkbDppbnB1dD4NCi0NCi0gICAgICAgICA8d3NkbDpvdXRwdXQgbmFtZT0idGVzdFNpbXBsZTJSZXNwb25zZSI+DQotICAgICAgICAgICAgICAgPHdzZGxzb2FwOmJvZHkgbmFtZXNwYWNlPSJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9ycGNsaXQiIHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgICAgIDwvd3NkbDpvdXRwdXQ+DQotDQotICAgICAgPC93c2RsOm9wZXJhdGlvbj4NCi0gICAgICANCi0gICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0idGVzdEhlYWRlciI+DQotCQkJDQotICAgICAgICAgPHdzZGw6aW5wdXQgbmFtZT0idGVzdEhlYWRlclJlcXVlc3QiPg0KLSAgICAgICAgICAgICAgIDx3c2Rsc29hcDpib2R5IHBhcnRzPSJib2R5UGFyYW0iIHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgICAgICAgICAgIDx3c2Rsc29hcDpoZWFkZXIgbWVzc2FnZT0iaW1wbDp0ZXN0SGVhZGVyUmVxdWVzdCIgcGFydD0iaGVhZGVyUGFyYW0iIHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgICAgIDwvd3NkbDppbnB1dD4NCi0NCi0gICAgICAgICA8d3NkbDpvdXRwdXQgbmFtZT0idGVzdEhlYWRlclJlc3BvbnNlIj4NCi0gICAgICAgICAgICAgICA8d3NkbHNvYXA6aGVhZGVyIG1lc3NhZ2U9ImltcGw6dGVzdEhlYWRlclJlc3BvbnNlIiBwYXJ0PSJoZWFkZXJSZXR1cm4iIHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgICAgIDwvd3NkbDpvdXRwdXQ+DQotDQotICAgICAgPC93c2RsOm9wZXJhdGlvbj4NCi0NCi0gICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0idGVzdExpc3RzIj4NCi0NCi0gICAgICAgICA8d3NkbHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPg0KLQ0KLSAgICAgICAgIDx3c2RsOmlucHV0IG5hbWU9InRlc3RMaXN0c1JlcXVlc3QiPg0KLQ0KLSAgICAgICAgICAgIDx3c2Rsc29hcDpib2R5IG5hbWVzcGFjZT0iaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvcnBjbGl0IiB1c2U9ImxpdGVyYWwiLz4NCi0NCi0gICAgICAgICA8L3dzZGw6aW5wdXQ+DQotDQotICAgICAgICAgPHdzZGw6b3V0cHV0IG5hbWU9InRlc3RMaXN0c1Jlc3BvbnNlIj4NCi0NCi0gICAgICAgICAgICA8d3NkbHNvYXA6Ym9keSBuYW1lc3BhY2U9Imh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L3JwY2xpdCIgdXNlPSJsaXRlcmFsIi8+DQotDQotICAgICAgICAgPC93c2RsOm91dHB1dD4NCi0NCi0gICAgICA8L3dzZGw6b3BlcmF0aW9uPg0KLSAgICAgIA0KLSAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJ0ZXN0Q2FsZW5kYXJMaXN0MSI+DQotDQotICAgICAgICAgPHdzZGxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4NCi0NCi0gICAgICAgICA8d3NkbDppbnB1dCBuYW1lPSJ0ZXN0Q2FsZW5kYXJMaXN0MVJlcXVlc3QiPg0KLQ0KLSAgICAgICAgICAgIDx3c2Rsc29hcDpib2R5IG5hbWVzcGFjZT0iaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvcnBjbGl0IiB1c2U9ImxpdGVyYWwiLz4NCi0NCi0gICAgICAgICA8L3dzZGw6aW5wdXQ+DQotDQotICAgICAgICAgPHdzZGw6b3V0cHV0IG5hbWU9InRlc3RDYWxlbmRhckxpc3QxUmVzcG9uc2UiPg0KLQ0KLSAgICAgICAgICAgIDx3c2Rsc29hcDpib2R5IG5hbWVzcGFjZT0iaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvcnBjbGl0IiB1c2U9ImxpdGVyYWwiLz4NCi0NCi0gICAgICAgICA8L3dzZGw6b3V0cHV0Pg0KLQ0KLSAgICAgIDwvd3NkbDpvcGVyYXRpb24+DQotICAgICAgDQotICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InRlc3RTdHJpbmdMaXN0MiI+DQotDQotICAgICAgICAgPHdzZGxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4NCi0NCi0gICAgICAgICA8d3NkbDppbnB1dCBuYW1lPSJ0ZXN0U3RyaW5nTGlzdDJSZXF1ZXN0Ij4NCi0NCi0gICAgICAgICAgICA8d3NkbHNvYXA6Ym9keSBuYW1lc3BhY2U9Imh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L3JwY2xpdCIgdXNlPSJsaXRlcmFsIi8+DQotDQotICAgICAgICAgPC93c2RsOmlucHV0Pg0KLQ0KLSAgICAgICAgIDx3c2RsOm91dHB1dCBuYW1lPSJ0ZXN0U3RyaW5nTGlzdDJSZXNwb25zZSI+DQotDQotICAgICAgICAgICAgPHdzZGxzb2FwOmJvZHkgbmFtZXNwYWNlPSJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9ycGNsaXQiIHVzZT0ibGl0ZXJhbCIvPg0KLQ0KLSAgICAgICAgIDwvd3NkbDpvdXRwdXQ+DQotDQotICAgICAgPC93c2RsOm9wZXJhdGlvbj4NCi0gICAgICANCi0gICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0idGVzdEJpZ0ludGVnZXJMaXN0MyI+DQotDQotICAgICAgICAgPHdzZGxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4NCi0NCi0gICAgICAgICA8d3NkbDppbnB1dCBuYW1lPSJ0ZXN0QmlnSW50ZWdlckxpc3QzUmVxdWVzdCI+DQotDQotICAgICAgICAgICAgPHdzZGxzb2FwOmJvZHkgbmFtZXNwYWNlPSJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9ycGNsaXQiIHVzZT0ibGl0ZXJhbCIvPg0KLQ0KLSAgICAgICAgIDwvd3NkbDppbnB1dD4NCi0NCi0gICAgICAgICA8d3NkbDpvdXRwdXQgbmFtZT0idGVzdEJpZ0ludGVnZXJMaXN0M1Jlc3BvbnNlIj4NCi0NCi0gICAgICAgICAgICA8d3NkbHNvYXA6Ym9keSBuYW1lc3BhY2U9Imh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L3JwY2xpdCIgdXNlPSJsaXRlcmFsIi8+DQotDQotICAgICAgICAgPC93c2RsOm91dHB1dD4NCi0NCi0gICAgICA8L3dzZGw6b3BlcmF0aW9uPg0KLSAgICAgIA0KLSAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJ0ZXN0TG9uZ0xpc3Q0Ij4NCi0NCi0gICAgICAgICA8d3NkbHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPg0KLQ0KLSAgICAgICAgIDx3c2RsOmlucHV0IG5hbWU9InRlc3RMb25nTGlzdDRSZXF1ZXN0Ij4NCi0NCi0gICAgICAgICAgICA8d3NkbHNvYXA6Ym9keSBuYW1lc3BhY2U9Imh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L3JwY2xpdCIgdXNlPSJsaXRlcmFsIi8+DQotDQotICAgICAgICAgPC93c2RsOmlucHV0Pg0KLQ0KLSAgICAgICAgIDx3c2RsOm91dHB1dCBuYW1lPSJ0ZXN0TG9uZ0xpc3Q0UmVzcG9uc2UiPg0KLQ0KLSAgICAgICAgICAgIDx3c2Rsc29hcDpib2R5IG5hbWVzcGFjZT0iaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvcnBjbGl0IiB1c2U9ImxpdGVyYWwiLz4NCi0NCi0gICAgICAgICA8L3dzZGw6b3V0cHV0Pg0KLQ0KLSAgICAgIDwvd3NkbDpvcGVyYXRpb24+DQotICAgICAgDQotICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InRlc3RFbnVtTGlzdDUiPg0KLQ0KLSAgICAgICAgIDx3c2Rsc29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+DQotDQotICAgICAgICAgPHdzZGw6aW5wdXQgbmFtZT0idGVzdEVudW1MaXN0NVJlcXVlc3QiPg0KLQ0KLSAgICAgICAgICAgIDx3c2Rsc29hcDpib2R5IG5hbWVzcGFjZT0iaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvcnBjbGl0IiB1c2U9ImxpdGVyYWwiLz4NCi0NCi0gICAgICAgICA8L3dzZGw6aW5wdXQ+DQotDQotICAgICAgICAgPHdzZGw6b3V0cHV0IG5hbWU9InRlc3RFbnVtTGlzdDVSZXNwb25zZSI+DQotDQotICAgICAgICAgICAgPHdzZGxzb2FwOmJvZHkgbmFtZXNwYWNlPSJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9ycGNsaXQiIHVzZT0ibGl0ZXJhbCIvPg0KLQ0KLSAgICAgICAgIDwvd3NkbDpvdXRwdXQ+DQotDQotICAgICAgPC93c2RsOm9wZXJhdGlvbj4NCi0gICAgICANCi0gICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0idGVzdEVudW1MaXN0NyI+DQotDQotICAgICAgICAgPHdzZGxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4NCi0NCi0gICAgICAgICA8d3NkbDppbnB1dCBuYW1lPSJ0ZXN0RW51bUxpc3Q3UmVxdWVzdCI+DQotDQotICAgICAgICAgICAgPHdzZGxzb2FwOmJvZHkgbmFtZXNwYWNlPSJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9ycGNsaXQiIHVzZT0ibGl0ZXJhbCIvPg0KLQ0KLSAgICAgICAgIDwvd3NkbDppbnB1dD4NCi0NCi0gICAgICAgICA8d3NkbDpvdXRwdXQgbmFtZT0idGVzdEVudW1MaXN0N1Jlc3BvbnNlIj4NCi0NCi0gICAgICAgICAgICA8d3NkbHNvYXA6Ym9keSBuYW1lc3BhY2U9Imh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L3JwY2xpdCIgdXNlPSJsaXRlcmFsIi8+DQotDQotICAgICAgICAgPC93c2RsOm91dHB1dD4NCi0NCi0gICAgICA8L3dzZGw6b3BlcmF0aW9uPg0KLSAgICAgIA0KLSAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJ0ZXN0Q29tcGxleEFsbDYiPg0KLQ0KLSAgICAgICAgIDx3c2Rsc29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+DQotDQotICAgICAgICAgPHdzZGw6aW5wdXQgbmFtZT0idGVzdENvbXBsZXhBbGw2UmVxdWVzdCI+DQotDQotICAgICAgICAgICAgPHdzZGxzb2FwOmJvZHkgbmFtZXNwYWNlPSJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9ycGNsaXQiIHVzZT0ibGl0ZXJhbCIvPg0KLQ0KLSAgICAgICAgIDwvd3NkbDppbnB1dD4NCi0NCi0gICAgICAgICA8d3NkbDpvdXRwdXQgbmFtZT0idGVzdENvbXBsZXhBbGw2UmVzcG9uc2UiPg0KLQ0KLSAgICAgICAgICAgIDx3c2Rsc29hcDpib2R5IG5hbWVzcGFjZT0iaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvcnBjbGl0IiB1c2U9ImxpdGVyYWwiLz4NCi0NCi0gICAgICAgICA8L3dzZGw6b3V0cHV0Pg0KLQ0KLSAgICAgIDwvd3NkbDpvcGVyYXRpb24+IA0KLSAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJ0ZXN0RmF1bHQiPg0KLQ0KLSAgICAgICAgIDx3c2Rsc29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0idGVzdEZhdWx0Ii8+DQotDQotICAgICAgICAgPHdzZGw6aW5wdXQgbmFtZT0idGVzdEZhdWx0UmVxdWVzdCI+DQotDQotICAgICAgICAgICAgPHdzZGxzb2FwOmJvZHkgbmFtZXNwYWNlPSJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9ycGNsaXQiIHVzZT0ibGl0ZXJhbCIvPg0KLQ0KLSAgICAgICAgIDwvd3NkbDppbnB1dD4NCi0NCi0gICAgICAgICA8d3NkbDpvdXRwdXQgbmFtZT0idGVzdEZhdWx0UmVzcG9uc2UiPg0KLQ0KLSAgICAgICAgICAgIDx3c2Rsc29hcDpib2R5IG5hbWVzcGFjZT0iaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvcnBjbGl0IiB1c2U9ImxpdGVyYWwiLz4NCi0NCi0gICAgICAgICA8L3dzZGw6b3V0cHV0Pg0KLSAgICAgICAgIDx3c2RsOmZhdWx0IG5hbWU9InJwY0ZhdWx0Ij4NCi0gICAgICAgICAgICA8d3NkbHNvYXA6ZmF1bHQgbmFtZT0icnBjRmF1bHQiIHVzZT0ibGl0ZXJhbCIgLz4NCi0gICAgICAgICA8L3dzZGw6ZmF1bHQ+DQotDQotICAgICAgPC93c2RsOm9wZXJhdGlvbj4gICAgICANCi0NCi0gICA8L3dzZGw6YmluZGluZz4NCi0NCi0gICA8d3NkbDpzZXJ2aWNlIG5hbWU9IlJQQ0xpdFNlcnZpY2UiPg0KLQ0KLSAgICAgIDx3c2RsOnBvcnQgYmluZGluZz0iaW1wbDpSUENMaXRTb2FwQmluZGluZyIgbmFtZT0iUlBDTGl0Ij4NCi0NCi0gICAgICAgICA8d3NkbHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo5MDgwL2F4aXMyL3NlcnZpY2VzL1JQQ0xpdFNlcnZpY2UiLz4NCi0NCi0gICAgICA8L3dzZGw6cG9ydD4NCi0NCi0gICA8L3dzZGw6c2VydmljZT4NCi0NCi08L3dzZGw6ZGVmaW5pdGlvbnM+DQotDQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9SUENMaXRTV0Eud3NkbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3dzZGwvUlBDTGl0U1dBLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlNTZmMGEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9SUENMaXRTV0Eud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTx3c2RsOmRlZmluaXRpb25zIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvcnBjbGl0c3dhIiANCi14bWxucz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIA0KLXhtbG5zOmFwYWNoZXNvYXA9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94bWwtc29hcCIgDQoteG1sbnM6aW1wbD0iaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvcnBjbGl0c3dhIiANCi14bWxuczppbnRmPSJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9ycGNsaXRzd2EiIA0KLXhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiANCi14bWxuczp3c2Rsc29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIgDQoteG1sbnM6bWltZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9taW1lLyINCi14bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4NCi0gICA8d3NkbDptZXNzYWdlIG5hbWU9ImVjaG9SZXF1ZXN0Ij4NCi0gICAgICA8d3NkbDpwYXJ0IG5hbWU9InJlcXVlc3QiIHR5cGU9InhzZDpzdHJpbmciLz4NCi0gICAgICA8d3NkbDpwYXJ0IG5hbWU9ImR1bW15QXR0YWNobWVudElOIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPg0KLSAgICAgIDx3c2RsOnBhcnQgbmFtZT0iZHVtbXlBdHRhY2htZW50SU5PVVQiIHR5cGU9InhzZDpiYXNlNjRCaW5hcnkiIC8+DQotICAgPC93c2RsOm1lc3NhZ2U+DQotICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJlY2hvUmVzcG9uc2UiPg0KLSAgICAgIDx3c2RsOnBhcnQgbmFtZT0icmVzcG9uc2UiIHR5cGU9InhzZDpzdHJpbmciLz4NCi0gICAgICA8d3NkbDpwYXJ0IG5hbWU9ImR1bW15QXR0YWNobWVudElOT1VUIiB0eXBlPSJ4c2Q6YmFzZTY0QmluYXJ5IiAvPg0KLSAgICAgIDx3c2RsOnBhcnQgbmFtZT0iZHVtbXlBdHRhY2htZW50T1VUIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+DQotICAgPC93c2RsOm1lc3NhZ2U+DQotDQotDQotICAgPHdzZGw6cG9ydFR5cGUgbmFtZT0iUlBDTGl0U1dBIj4NCi0gICAgIA0KLSAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJlY2hvIj4NCi0NCi0gICAgICAgICA8d3NkbDppbnB1dCBtZXNzYWdlPSJpbXBsOmVjaG9SZXF1ZXN0IiBuYW1lPSJlY2hvUmVxdWVzdCIvPg0KLQ0KLSAgICAgICAgIDx3c2RsOm91dHB1dCBtZXNzYWdlPSJpbXBsOmVjaG9SZXNwb25zZSIgbmFtZT0iZWNob1Jlc3BvbnNlIi8+DQotDQotICAgICAgPC93c2RsOm9wZXJhdGlvbj4NCi0gICAgICAgICAgIA0KLSAgIDwvd3NkbDpwb3J0VHlwZT4NCi0NCi0gICA8d3NkbDpiaW5kaW5nIG5hbWU9IlJQQ0xpdFNXQVNvYXBCaW5kaW5nIiB0eXBlPSJpbXBsOlJQQ0xpdFNXQSI+DQotDQotICAgICAgPHdzZGxzb2FwOmJpbmRpbmcgc3R5bGU9InJwYyIgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiLz4NCi0NCi0gICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iZWNobyI+DQotICAgICAgICAgPHdzZGxzb2FwOm9wZXJhdGlvbi8+DQotICAgICAgICAgPHdzZGw6aW5wdXQ+DQotICAgICAgICAgICAgPG1pbWU6bXVsdGlwYXJ0UmVsYXRlZD4NCi0gICAgICAgICAgICAgICA8bWltZTpwYXJ0Pg0KLSAgICAgICAgICAgICAgICAgPHdzZGxzb2FwOmJvZHkgcGFydHM9InJlcXVlc3QiIHVzZT0ibGl0ZXJhbCIgbmFtZXNwYWNlPSJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9ycGNsaXRzd2EiLz4gDQotICAgICAgICAgICAgICAgPC9taW1lOnBhcnQ+DQotICAgICAgICAgICAgICAgPG1pbWU6cGFydD4NCi0gICAgICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgcGFydD0iZHVtbXlBdHRhY2htZW50SU4iIHR5cGU9InRleHQvcGxhaW4iLz4NCi0gICAgICAgICAgICAgICA8L21pbWU6cGFydD4NCi0gICAgICAgICAgICAgICA8bWltZTpwYXJ0Pg0KLSAgICAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCBwYXJ0PSJkdW1teUF0dGFjaG1lbnRJTk9VVCIgdHlwZT0iaW1hZ2UvanBlZyIvPg0KLSAgICAgICAgICAgICAgIDwvbWltZTpwYXJ0Pg0KLSAgICAgICAgICAgIDwvbWltZTptdWx0aXBhcnRSZWxhdGVkPg0KLSAgICAgICAgIDwvd3NkbDppbnB1dD4NCi0gICAgICAgICA8d3NkbDpvdXRwdXQ+DQotICAgICAgICAgICAgPG1pbWU6bXVsdGlwYXJ0UmVsYXRlZD4NCi0gICAgICAgICAgICAgICA8bWltZTpwYXJ0Pg0KLSAgICAgICAgICAgICAgICAgIDx3c2Rsc29hcDpib2R5IHBhcnRzPSJyZXNwb25zZSIgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9Imh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L3JwY2xpdHN3YSIgIC8+DQotICAgICAgICAgICAgICAgPC9taW1lOnBhcnQ+DQotICAgICAgICAgICAgICAgPG1pbWU6cGFydD4NCi0gICAgICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgcGFydD0iZHVtbXlBdHRhY2htZW50SU5PVVQiIHR5cGU9ImltYWdlL2pwZWciLz4NCi0gICAgICAgICAgICAgICA8L21pbWU6cGFydD4NCi0gICAgICAgICAgICAgICA8bWltZTpwYXJ0Pg0KLSAgICAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCBwYXJ0PSJkdW1teUF0dGFjaG1lbnRPVVQiIHR5cGU9InRleHQvcGxhaW4iLz4NCi0gICAgICAgICAgICAgICA8L21pbWU6cGFydD4NCi0gICAgICAgICAgICA8L21pbWU6bXVsdGlwYXJ0UmVsYXRlZD4NCi0gICAgICAgICA8L3dzZGw6b3V0cHV0Pg0KLSAgICAgIDwvd3NkbDpvcGVyYXRpb24+DQotICAgPC93c2RsOmJpbmRpbmc+DQotDQotICAgPHdzZGw6c2VydmljZSBuYW1lPSJSUENMaXRTV0FTZXJ2aWNlIj4NCi0NCi0gICAgICA8d3NkbDpwb3J0IGJpbmRpbmc9ImltcGw6UlBDTGl0U1dBU29hcEJpbmRpbmciIG5hbWU9IlJQQ0xpdFNXQSI+DQotDQotICAgICAgICAgPHdzZGxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6OTA4MC9heGlzMi9zZXJ2aWNlcy9SUENMaXRTV0FTZXJ2aWNlIi8+DQotDQotICAgICAgPC93c2RsOnBvcnQ+DQotDQotICAgPC93c2RsOnNlcnZpY2U+DQotDQotPC93c2RsOmRlZmluaXRpb25zPg0KLQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3dzZGwvU09BUDExQmluZGluZy1KQVhXUy53c2RsIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9TT0FQMTFCaW5kaW5nLUpBWFdTLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzY2Q3ZDQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9TT0FQMTFCaW5kaW5nLUpBWFdTLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLQ0KLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTxkZWZpbml0aW9ucyB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9qYXh3cy5heGlzMi5hcGFjaGUub3JnL2JpbmRpbmd0ZXN0L3NvYXAxMSINCi0gICAgICB4bWxuczp0bnM9Imh0dHA6Ly9qYXh3cy5heGlzMi5hcGFjaGUub3JnL2JpbmRpbmd0ZXN0L3NvYXAxMSINCi0gICAgICB4bWxucz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIA0KLSAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiDQotICAgICAgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyI+DQotDQotICAgPHR5cGVzPg0KLSAgICAgIDx4c2Q6c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2pheHdzLmF4aXMyLmFwYWNoZS5vcmcvYmluZGluZ3Rlc3Qvc29hcDExIg0KLSAgICAgICAgIHhtbG5zOnRucz0iaHR0cDovL2pheHdzLmF4aXMyLmFwYWNoZS5vcmcvYmluZGluZ3Rlc3Qvc29hcDExIg0KLSAgICAgICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSINCi0gICAgICAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+DQotDQotICAgICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9ImVjaG9UeXBlIj4NCi0gICAgICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0icmVxdWVzdCIgdHlwZT0ieHNkOnN0cmluZyIvPg0KLSAgICAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgPC9jb21wbGV4VHlwZT4NCi0NCi0gICAgICAgICA8Y29tcGxleFR5cGUgbmFtZT0iZWNob1Jlc3BvbnNlVHlwZSI+DQotICAgICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InJlc3BvbnNlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+DQotICAgICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8L2NvbXBsZXhUeXBlPg0KLQ0KLSAgICAgICAgIDxlbGVtZW50IG5hbWU9ImVjaG8iIHR5cGU9InRuczplY2hvVHlwZSIvPg0KLSAgICAgICAgIDxlbGVtZW50IG5hbWU9ImVjaG9SZXNwb25zZSIgdHlwZT0idG5zOmVjaG9SZXNwb25zZVR5cGUiLz4NCi0NCi0gICAgICA8L3hzZDpzY2hlbWE+DQotICAgPC90eXBlcz4NCi0NCi0gICA8bWVzc2FnZSBuYW1lPSJlY2hvIj4NCi0gICAgICA8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJ0bnM6ZWNobyIvPg0KLSAgIDwvbWVzc2FnZT4NCi0NCi0gICA8bWVzc2FnZSBuYW1lPSJlY2hvUmVzcG9uc2UiPg0KLSAgICAgIDxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9InRuczplY2hvUmVzcG9uc2UiLz4NCi0gICA8L21lc3NhZ2U+DQotDQotICAgPHBvcnRUeXBlIG5hbWU9IkVjaG8iPg0KLSAgICAgIDxvcGVyYXRpb24gbmFtZT0iZWNobyI+DQotICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczplY2hvIiAvPg0KLSAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmVjaG9SZXNwb25zZSIgLz4NCi0gICAgICA8L29wZXJhdGlvbj4NCi0gICA8L3BvcnRUeXBlPg0KLQ0KLSAgIDxiaW5kaW5nIG5hbWU9IkVjaG9CaW5kaW5nIiB0eXBlPSJ0bnM6RWNobyI+DQotICAgICAgPHNvYXA6YmluZGluZyBzdHlsZT0iZG9jdW1lbnQiIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIi8+DQotICAgICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvIj4NCi0gICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+DQotICAgICAgICAgPGlucHV0Pg0KLSAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgICAgPC9pbnB1dD4NCi0NCi0gICAgICAgICA8b3V0cHV0Pg0KLSAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgICAgPC9vdXRwdXQ+DQotICAgICAgPC9vcGVyYXRpb24+DQotICAgPC9iaW5kaW5nPg0KLQ0KLSAgIDxzZXJ2aWNlIG5hbWU9IlNPQVAxMUVjaG9TZXJ2aWNlIj4NCi0gICAgICA8cG9ydCBiaW5kaW5nPSJ0bnM6RWNob0JpbmRpbmciIG5hbWU9IkVjaG9Qb3J0Ij4NCi0gICAgICAgICA8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjYwNjAvYXhpczIvc2VydmljZXMvU09BUDExRWNob1NlcnZpY2UiLz4NCi0gICAgICA8L3BvcnQ+DQotICAgPC9zZXJ2aWNlPg0KLTwvZGVmaW5pdGlvbnM+DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9TT0FQMTFCaW5kaW5nLVdTSS53c2RsIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9TT0FQMTFCaW5kaW5nLVdTSS53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmY4NGNjLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3dzZGwvU09BUDExQmluZGluZy1XU0kud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotDQotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPGRlZmluaXRpb25zIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2pheHdzLmF4aXMyLmFwYWNoZS5vcmcvYmluZGluZ3Rlc3Qvc29hcDExIg0KLSAgICAgIHhtbG5zOnRucz0iaHR0cDovL2pheHdzLmF4aXMyLmFwYWNoZS5vcmcvYmluZGluZ3Rlc3Qvc29hcDExIg0KLSAgICAgIHhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIgDQotICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSINCi0gICAgICB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIj4NCi0NCi0gICA8dHlwZXM+DQotICAgICAgPHhzZDpzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vamF4d3MuYXhpczIuYXBhY2hlLm9yZy9iaW5kaW5ndGVzdC9zb2FwMTEiDQotICAgICAgICAgeG1sbnM6dG5zPSJodHRwOi8vamF4d3MuYXhpczIuYXBhY2hlLm9yZy9iaW5kaW5ndGVzdC9zb2FwMTEiDQotICAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIg0KLSAgICAgICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIj4NCi0NCi0gICAgICAgICA8Y29tcGxleFR5cGUgbmFtZT0iZWNob1R5cGUiPg0KLSAgICAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJyZXF1ZXN0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+DQotICAgICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8L2NvbXBsZXhUeXBlPg0KLQ0KLSAgICAgICAgIDxjb21wbGV4VHlwZSBuYW1lPSJlY2hvUmVzcG9uc2VUeXBlIj4NCi0gICAgICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0icmVzcG9uc2UiIHR5cGU9InhzZDpzdHJpbmciLz4NCi0gICAgICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDwvY29tcGxleFR5cGU+DQotDQotICAgICAgICAgPGVsZW1lbnQgbmFtZT0iZWNobyIgdHlwZT0idG5zOmVjaG9UeXBlIi8+DQotICAgICAgICAgPGVsZW1lbnQgbmFtZT0iZWNob1Jlc3BvbnNlIiB0eXBlPSJ0bnM6ZWNob1Jlc3BvbnNlVHlwZSIvPg0KLQ0KLSAgICAgIDwveHNkOnNjaGVtYT4NCi0gICA8L3R5cGVzPg0KLQ0KLSAgIDxtZXNzYWdlIG5hbWU9ImVjaG8iPg0KLSAgICAgIDxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9InRuczplY2hvIi8+DQotICAgPC9tZXNzYWdlPg0KLQ0KLSAgIDxtZXNzYWdlIG5hbWU9ImVjaG9SZXNwb25zZSI+DQotICAgICAgPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0idG5zOmVjaG9SZXNwb25zZSIvPg0KLSAgIDwvbWVzc2FnZT4NCi0NCi0gICA8cG9ydFR5cGUgbmFtZT0iRWNobyI+DQotICAgICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvIj4NCi0gICAgICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmVjaG8iIC8+DQotICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6ZWNob1Jlc3BvbnNlIiAvPg0KLSAgICAgIDwvb3BlcmF0aW9uPg0KLSAgIDwvcG9ydFR5cGU+DQotDQotICAgPGJpbmRpbmcgbmFtZT0iRWNob0JpbmRpbmciIHR5cGU9InRuczpFY2hvIj4NCi0gICAgICA8c29hcDpiaW5kaW5nIHN0eWxlPSJkb2N1bWVudCIgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiLz4NCi0gICAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG8iPg0KLSAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4NCi0gICAgICAgICA8aW5wdXQ+DQotICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4NCi0gICAgICAgICA8L2lucHV0Pg0KLQ0KLSAgICAgICAgIDxvdXRwdXQ+DQotICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4NCi0gICAgICAgICA8L291dHB1dD4NCi0gICAgICA8L29wZXJhdGlvbj4NCi0gICA8L2JpbmRpbmc+DQotDQotICAgPHNlcnZpY2UgbmFtZT0iU09BUDExRWNob1NlcnZpY2UiPg0KLSAgICAgIDxwb3J0IGJpbmRpbmc9InRuczpFY2hvQmluZGluZyIgbmFtZT0iRWNob1BvcnQiPg0KLSAgICAgICAgIDxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6NjA2MC9heGlzMi9zZXJ2aWNlcy9TT0FQMTJFY2hvU2VydmljZSIvPg0KLSAgICAgIDwvcG9ydD4NCi0gICA8L3NlcnZpY2U+DQotPC9kZWZpbml0aW9ucz4NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy93c2RsL1NPQVAxMkJpbmRpbmctSkFYV1Mud3NkbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3dzZGwvU09BUDEyQmluZGluZy1KQVhXUy53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMWYxNzRiLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3dzZGwvU09BUDEyQmluZGluZy1KQVhXUy53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi0NCi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08ZGVmaW5pdGlvbnMgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vamF4d3MuYXhpczIuYXBhY2hlLm9yZy9iaW5kaW5ndGVzdC9zb2FwMTIiDQotICAgICAgeG1sbnM6dG5zPSJodHRwOi8vamF4d3MuYXhpczIuYXBhY2hlLm9yZy9iaW5kaW5ndGVzdC9zb2FwMTIiDQotICAgICAgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiANCi0gICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIg0KLSAgICAgIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcDEyLyI+DQotDQotICAgPHR5cGVzPg0KLSAgICAgIDx4c2Q6c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2pheHdzLmF4aXMyLmFwYWNoZS5vcmcvYmluZGluZ3Rlc3Qvc29hcDEyIg0KLSAgICAgICAgIHhtbG5zOnRucz0iaHR0cDovL2pheHdzLmF4aXMyLmFwYWNoZS5vcmcvYmluZGluZ3Rlc3Qvc29hcDEyIg0KLSAgICAgICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSINCi0gICAgICAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+DQotDQotICAgICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9ImVjaG9UeXBlIj4NCi0gICAgICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0icmVxdWVzdCIgdHlwZT0ieHNkOnN0cmluZyIvPg0KLSAgICAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgPC9jb21wbGV4VHlwZT4NCi0NCi0gICAgICAgICA8Y29tcGxleFR5cGUgbmFtZT0iZWNob1Jlc3BvbnNlVHlwZSI+DQotICAgICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InJlc3BvbnNlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+DQotICAgICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8L2NvbXBsZXhUeXBlPg0KLQ0KLSAgICAgICAgIDxlbGVtZW50IG5hbWU9ImVjaG8iIHR5cGU9InRuczplY2hvVHlwZSIvPg0KLSAgICAgICAgIDxlbGVtZW50IG5hbWU9ImVjaG9SZXNwb25zZSIgdHlwZT0idG5zOmVjaG9SZXNwb25zZVR5cGUiLz4NCi0NCi0gICAgICA8L3hzZDpzY2hlbWE+DQotICAgPC90eXBlcz4NCi0NCi0gICA8bWVzc2FnZSBuYW1lPSJlY2hvIj4NCi0gICAgICA8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJ0bnM6ZWNobyIvPg0KLSAgIDwvbWVzc2FnZT4NCi0NCi0gICA8bWVzc2FnZSBuYW1lPSJlY2hvUmVzcG9uc2UiPg0KLSAgICAgIDxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9InRuczplY2hvUmVzcG9uc2UiLz4NCi0gICA8L21lc3NhZ2U+DQotDQotICAgPHBvcnRUeXBlIG5hbWU9IkVjaG8iPg0KLSAgICAgIDxvcGVyYXRpb24gbmFtZT0iZWNobyI+DQotICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczplY2hvIiAvPg0KLSAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmVjaG9SZXNwb25zZSIgLz4NCi0gICAgICA8L29wZXJhdGlvbj4NCi0gICA8L3BvcnRUeXBlPg0KLQ0KLSAgIDxiaW5kaW5nIG5hbWU9IkVjaG9CaW5kaW5nIiB0eXBlPSJ0bnM6RWNobyI+DQotICAgICAgPHNvYXA6YmluZGluZyBzdHlsZT0iZG9jdW1lbnQiIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIi8+DQotICAgICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvIj4NCi0gICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+DQotICAgICAgICAgPGlucHV0Pg0KLSAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgICAgPC9pbnB1dD4NCi0NCi0gICAgICAgICA8b3V0cHV0Pg0KLSAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgICAgPC9vdXRwdXQ+DQotICAgICAgPC9vcGVyYXRpb24+DQotICAgPC9iaW5kaW5nPg0KLQ0KLSAgIDxzZXJ2aWNlIG5hbWU9IlNPQVAxMkVjaG9TZXJ2aWNlIj4NCi0gICAgICA8cG9ydCBiaW5kaW5nPSJ0bnM6RWNob0JpbmRpbmciIG5hbWU9IkVjaG9Qb3J0Ij4NCi0gICAgICAgICA8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjYwNjAvYXhpczIvc2VydmljZXMvU09BUDEyRWNob1NlcnZpY2UiLz4NCi0gICAgICA8L3BvcnQ+DQotICAgPC9zZXJ2aWNlPg0KLTwvZGVmaW5pdGlvbnM+DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9TT0FQMTJFY2hvLndzZGwgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy93c2RsL1NPQVAxMkVjaG8ud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTgzMTEyZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy93c2RsL1NPQVAxMkVjaG8ud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotDQotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPGRlZmluaXRpb25zIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2pheHdzLmF4aXMyLmFwYWNoZS5vcmcvcHJveHkvc29hcDEyIg0KLSAgICAgIHhtbG5zOnRucz0iaHR0cDovL2pheHdzLmF4aXMyLmFwYWNoZS5vcmcvcHJveHkvc29hcDEyIg0KLSAgICAgIHhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIgDQotICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSINCi0gICAgICB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAxMi8iPg0KLQ0KLSAgIDx0eXBlcz4NCi0gICAgICA8eHNkOnNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9qYXh3cy5heGlzMi5hcGFjaGUub3JnL3Byb3h5L3NvYXAxMiINCi0gICAgICAgICB4bWxuczp0bnM9Imh0dHA6Ly9qYXh3cy5heGlzMi5hcGFjaGUub3JnL3Byb3h5L3NvYXAxMiINCi0gICAgICAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiDQotICAgICAgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPg0KLQ0KLSAgICAgICAgIDxjb21wbGV4VHlwZSBuYW1lPSJlY2hvVHlwZSI+DQotICAgICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InJlcXVlc3QiIHR5cGU9InhzZDpzdHJpbmciLz4NCi0gICAgICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDwvY29tcGxleFR5cGU+DQotDQotICAgICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9ImVjaG9SZXNwb25zZVR5cGUiPg0KLSAgICAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJyZXNwb25zZSIgdHlwZT0ieHNkOnN0cmluZyIvPg0KLSAgICAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgPC9jb21wbGV4VHlwZT4NCi0NCi0gICAgICAgICA8ZWxlbWVudCBuYW1lPSJlY2hvIiB0eXBlPSJ0bnM6ZWNob1R5cGUiLz4NCi0gICAgICAgICA8ZWxlbWVudCBuYW1lPSJlY2hvUmVzcG9uc2UiIHR5cGU9InRuczplY2hvUmVzcG9uc2VUeXBlIi8+DQotDQotICAgICAgPC94c2Q6c2NoZW1hPg0KLSAgIDwvdHlwZXM+DQotDQotICAgPG1lc3NhZ2UgbmFtZT0iZWNobyI+DQotICAgICAgPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0idG5zOmVjaG8iLz4NCi0gICA8L21lc3NhZ2U+DQotDQotICAgPG1lc3NhZ2UgbmFtZT0iZWNob1Jlc3BvbnNlIj4NCi0gICAgICA8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJ0bnM6ZWNob1Jlc3BvbnNlIi8+DQotICAgPC9tZXNzYWdlPg0KLQ0KLSAgIDxwb3J0VHlwZSBuYW1lPSJFY2hvIj4NCi0gICAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG8iPg0KLSAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6ZWNobyIgLz4NCi0gICAgICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczplY2hvUmVzcG9uc2UiIC8+DQotICAgICAgPC9vcGVyYXRpb24+DQotICAgPC9wb3J0VHlwZT4NCi0NCi0gICA8YmluZGluZyBuYW1lPSJFY2hvQmluZGluZyIgdHlwZT0idG5zOkVjaG8iPg0KLSAgICAgIDxzb2FwOmJpbmRpbmcgc3R5bGU9ImRvY3VtZW50IiB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIvPg0KLSAgICAgIDxvcGVyYXRpb24gbmFtZT0iZWNobyI+DQotICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPg0KLSAgICAgICAgIDxpbnB1dD4NCi0gICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgICAgIDwvaW5wdXQ+DQotDQotICAgICAgICAgPG91dHB1dD4NCi0gICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgICAgIDwvb3V0cHV0Pg0KLSAgICAgIDwvb3BlcmF0aW9uPg0KLSAgIDwvYmluZGluZz4NCi0NCi0gICA8c2VydmljZSBuYW1lPSJTT0FQMTJFY2hvU2VydmljZSI+DQotICAgICAgPHBvcnQgYmluZGluZz0idG5zOkVjaG9CaW5kaW5nIiBuYW1lPSJFY2hvUG9ydCI+DQotICAgICAgICAgPHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo2MDYwL2F4aXMyL3NlcnZpY2VzL1NPQVAxMkVjaG9TZXJ2aWNlIi8+DQotICAgICAgPC9wb3J0Pg0KLSAgIDwvc2VydmljZT4NCi08L2RlZmluaXRpb25zPg0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3dzZGwvU09BUEFjdGlvblRlc3Qud3NkbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3dzZGwvU09BUEFjdGlvblRlc3Qud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGMwYzYzYy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy93c2RsL1NPQVBBY3Rpb25UZXN0LndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi0NCi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08ZGVmaW5pdGlvbnMgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vamF4d3MuYXhpczIuYXBhY2hlLm9yZy9jbGllbnQvc29hcGFjdGlvbiINCi0gICAgICB4bWxuczp0bnM9Imh0dHA6Ly9qYXh3cy5heGlzMi5hcGFjaGUub3JnL2NsaWVudC9zb2FwYWN0aW9uIg0KLSAgICAgIHhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIgDQotICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSINCi0gICAgICB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIj4NCi0gICA8dHlwZXM+DQotICAgICAgPHhzZDpzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vamF4d3MuYXhpczIuYXBhY2hlLm9yZy9jbGllbnQvc29hcGFjdGlvbiINCi0gICAgICAgICB4bWxuczp0bnM9Imh0dHA6Ly9qYXh3cy5heGlzMi5hcGFjaGUub3JnL2NsaWVudC9zb2FwYWN0aW9uIg0KLSAgICAgICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSINCi0gICAgICAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+DQotICAgICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9IkdldFByaWNlVHlwZSI+DQotICAgICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Iml0ZW0iIHR5cGU9InhzZDpzdHJpbmciLz4NCi0gICAgICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDwvY29tcGxleFR5cGU+DQotICAgICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9IkdldFByaWNlUmVzcG9uc2VUeXBlIj4NCi0gICAgICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0icHJpY2UiIHR5cGU9InhzZDpmbG9hdCIvPg0KLSAgICAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgPC9jb21wbGV4VHlwZT4NCi0NCi0gICAgICAgICA8ZWxlbWVudCBuYW1lPSJnZXRQcmljZSIgdHlwZT0idG5zOkdldFByaWNlVHlwZSIvPg0KLSAgICAgICAgIDxlbGVtZW50IG5hbWU9ImdldFByaWNlUmVzcG9uc2UiIHR5cGU9InRuczpHZXRQcmljZVJlc3BvbnNlVHlwZSIvPg0KLSAgIA0KLSAgICAgICAgIDxlbGVtZW50IG5hbWU9ImdldFByaWNlV2l0aEFjdGlvbiIgdHlwZT0idG5zOkdldFByaWNlVHlwZSIvPg0KLSAgICAgICAgIDxlbGVtZW50IG5hbWU9ImdldFByaWNlV2l0aEFjdGlvblJlc3BvbnNlIiB0eXBlPSJ0bnM6R2V0UHJpY2VSZXNwb25zZVR5cGUiLz4NCi0NCi0gICAgICAgICA8ZWxlbWVudCBuYW1lPSJpdGVtIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+DQotICAgICAgICAgPGVsZW1lbnQgbmFtZT0iaW52ZW50b3J5IiB0eXBlPSJ4c2Q6aW50Ii8+DQotDQotICAgICAgICAgPGVsZW1lbnQgbmFtZT0iaXRlbVdpdGhBY3Rpb24iIHR5cGU9InhzZDpzdHJpbmciLz4NCi0gICAgICAgICA8ZWxlbWVudCBuYW1lPSJpbnZlbnRvcnlXaXRoQWN0aW9uIiB0eXBlPSJ4c2Q6aW50Ii8+DQotICAgICAgPC94c2Q6c2NoZW1hPg0KLSAgIDwvdHlwZXM+DQotDQotICAgPG1lc3NhZ2UgbmFtZT0iZ2V0UHJpY2VSZXF1ZXN0Ij4NCi0gICAgICA8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJ0bnM6Z2V0UHJpY2UiLz4NCi0gICA8L21lc3NhZ2U+DQotDQotICAgPG1lc3NhZ2UgbmFtZT0iZ2V0UHJpY2VSZXNwb25zZSI+DQotICAgICAgPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0idG5zOmdldFByaWNlUmVzcG9uc2UiLz4NCi0gICA8L21lc3NhZ2U+DQotICANCi0gICA8bWVzc2FnZSBuYW1lPSJnZXRQcmljZVdpdGhBY3Rpb25SZXF1ZXN0Ij4NCi0gICAgICA8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJ0bnM6Z2V0UHJpY2VXaXRoQWN0aW9uIi8+DQotICAgPC9tZXNzYWdlPg0KLQ0KLSAgIDxtZXNzYWdlIG5hbWU9ImdldFByaWNlV2l0aEFjdGlvblJlc3BvbnNlIj4NCi0gICAgICA8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJ0bnM6Z2V0UHJpY2VXaXRoQWN0aW9uUmVzcG9uc2UiLz4NCi0gICA8L21lc3NhZ2U+DQotIA0KLSAgIDxtZXNzYWdlIG5hbWU9ImdldEludmVudG9yeVJlcXVlc3QiPg0KLSAgICAgIDxwYXJ0IG5hbWU9Iml0ZW0iIGVsZW1lbnQ9InRuczppdGVtIi8+DQotICAgPC9tZXNzYWdlPg0KLSAgIA0KLSAgIDxtZXNzYWdlIG5hbWU9ImdldEludmVudG9yeVJlc3BvbnNlIj4NCi0gICAgICA8cGFydCBuYW1lPSJpbnZlbnRvcnkiIGVsZW1lbnQ9InRuczppbnZlbnRvcnkiLz4NCi0gICA8L21lc3NhZ2U+DQotDQotICAgPG1lc3NhZ2UgbmFtZT0iZ2V0SW52ZW50b3J5V2l0aEFjdGlvblJlcXVlc3QiPg0KLSAgICAgIDxwYXJ0IG5hbWU9Iml0ZW0iIGVsZW1lbnQ9InRuczppdGVtV2l0aEFjdGlvbiIvPg0KLSAgIDwvbWVzc2FnZT4NCi0NCi0gICA8bWVzc2FnZSBuYW1lPSJnZXRJbnZlbnRvcnlXaXRoQWN0aW9uUmVzcG9uc2UiPg0KLSAgICAgIDxwYXJ0IG5hbWU9ImludmVudG9yeSIgZWxlbWVudD0idG5zOmludmVudG9yeVdpdGhBY3Rpb24iLz4NCi0gICA8L21lc3NhZ2U+DQotDQotICAgPHBvcnRUeXBlIG5hbWU9IkJvb2tTdG9yZSI+DQotICAgICAgPG9wZXJhdGlvbiBuYW1lPSJnZXRQcmljZSI+DQotICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczpnZXRQcmljZVJlcXVlc3QiIC8+DQotICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6Z2V0UHJpY2VSZXNwb25zZSIgLz4NCi0gICAgICA8L29wZXJhdGlvbj4NCi0gICAgICA8b3BlcmF0aW9uIG5hbWU9ImdldFByaWNlV2l0aEFjdGlvbiI+DQotICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczpnZXRQcmljZVdpdGhBY3Rpb25SZXF1ZXN0IiAvPg0KLSAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmdldFByaWNlV2l0aEFjdGlvblJlc3BvbnNlIiAvPg0KLSAgICAgIDwvb3BlcmF0aW9uPg0KLSAgICAgIDxvcGVyYXRpb24gbmFtZT0iZ2V0SW52ZW50b3J5Ij4NCi0gICAgICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmdldEludmVudG9yeVJlcXVlc3QiIC8+DQotICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6Z2V0SW52ZW50b3J5UmVzcG9uc2UiIC8+DQotICAgICAgPC9vcGVyYXRpb24+DQotICAgICAgPG9wZXJhdGlvbiBuYW1lPSJnZXRJbnZlbnRvcnlXaXRoQWN0aW9uIj4NCi0gICAgICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmdldEludmVudG9yeVdpdGhBY3Rpb25SZXF1ZXN0IiAvPg0KLSAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmdldEludmVudG9yeVdpdGhBY3Rpb25SZXNwb25zZSIgLz4NCi0gICAgICA8L29wZXJhdGlvbj4NCi0gICA8L3BvcnRUeXBlPg0KLQ0KLSAgIDxiaW5kaW5nIG5hbWU9IkJvb2tTdG9yZUJpbmRpbmciIHR5cGU9InRuczpCb29rU3RvcmUiPg0KLSAgICAgIDxzb2FwOmJpbmRpbmcgc3R5bGU9ImRvY3VtZW50IiB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIvPg0KLSAgICAgIDxvcGVyYXRpb24gbmFtZT0iZ2V0UHJpY2UiPg0KLSAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4NCi0gICAgICAgICA8aW5wdXQ+DQotICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4NCi0gICAgICAgICA8L2lucHV0Pg0KLSAgICAgICAgIDxvdXRwdXQ+DQotICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4NCi0gICAgICAgICA8L291dHB1dD4NCi0gICAgICA8L29wZXJhdGlvbj4NCi0gICAgICA8b3BlcmF0aW9uIG5hbWU9ImdldFByaWNlV2l0aEFjdGlvbiI+DQotICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly9qYXh3cy5heGlzMi5hcGFjaGUub3JnL2NsaWVudC9zb2FwYWN0aW9uL2dldFByaWNlIi8+DQotICAgICAgICAgPGlucHV0Pg0KLSAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgICAgPC9pbnB1dD4NCi0gICAgICAgICA8b3V0cHV0Pg0KLSAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgICAgPC9vdXRwdXQ+DQotICAgICAgPC9vcGVyYXRpb24+DQotICAgICAgPG9wZXJhdGlvbiBuYW1lPSJnZXRJbnZlbnRvcnkiPg0KLSAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4NCi0gICAgICAgICA8aW5wdXQ+DQotICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4NCi0gICAgICAgICA8L2lucHV0Pg0KLSAgICAgICAgIDxvdXRwdXQ+DQotICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4NCi0gICAgICAgICA8L291dHB1dD4NCi0gICAgICA8L29wZXJhdGlvbj4NCi0gICAgICA8b3BlcmF0aW9uIG5hbWU9ImdldEludmVudG9yeVdpdGhBY3Rpb24iPg0KLSAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vamF4d3MuYXhpczIuYXBhY2hlLm9yZy9jbGllbnQvc29hcGFjdGlvbi9nZXRJbnZlbnRvcnkiLz4NCi0gICAgICAgICA8aW5wdXQ+DQotICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4NCi0gICAgICAgICA8L2lucHV0Pg0KLSAgICAgICAgIDxvdXRwdXQ+DQotICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4NCi0gICAgICAgICA8L291dHB1dD4NCi0gICAgICA8L29wZXJhdGlvbj4NCi0gICA8L2JpbmRpbmc+DQotDQotICAgPHNlcnZpY2UgbmFtZT0iQm9va1N0b3JlU2VydmljZSI+DQotICAgICAgPHBvcnQgYmluZGluZz0idG5zOkJvb2tTdG9yZUJpbmRpbmciIG5hbWU9IkJvb2tTdG9yZVBvcnQiPg0KLSAgICAgICAgIDxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6NjA2MC9heGlzMi9zZXJ2aWNlcy9Cb29rU3RvcmVTZXJ2aWNlIi8+DQotICAgICAgPC9wb3J0Pg0KLSAgIDwvc2VydmljZT4NCi08L2RlZmluaXRpb25zPg0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3dzZGwvU3RyaW5nTGlzdC53c2RsIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9TdHJpbmdMaXN0LndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyMzA5NDEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9TdHJpbmdMaXN0LndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLQ0KLQ0KLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLQ0KLTxkZWZpbml0aW9ucyBuYW1lPSJTdHJpbmdMaXN0IiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9vcmcvdGVzdC9TdHJpbmdMaXN0Ig0KLQl4bWxuczp0bnM9Imh0dHA6Ly9vcmcvdGVzdC9TdHJpbmdMaXN0IiB4bWxucz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iDQotCXhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiDQotCXhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iPg0KLQ0KLQ0KLQk8dHlwZXM+DQotCQk8eHNkOnNjaGVtYSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiDQotCQkJZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL29yZy90ZXN0L1N0cmluZ0xpc3QiPg0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTdHJpbmdMaXN0IiB0eXBlPSJ0bnM6U3RyaW5nTGlzdFR5cGUiIC8+DQotCQkJPHhzZDplbGVtZW50IG5hbWU9IlN0cmluZ0xpc3RSZXNwb25zZSIgdHlwZT0idG5zOlN0cmluZ0xpc3RUeXBlIiAvPg0KLSAgICANCi0JCQk8eHNkOnNpbXBsZVR5cGUgbmFtZT0iU3RyaW5nTGlzdFR5cGUiPg0KLQkJCQk8eHNkOmxpc3QgaXRlbVR5cGU9InhzZDpzdHJpbmciLz4NCi0JCQk8L3hzZDpzaW1wbGVUeXBlPg0KLQkJCQ0KLQkJPC94c2Q6c2NoZW1hPg0KLQk8L3R5cGVzPg0KLQ0KLQk8bWVzc2FnZSBuYW1lPSJTdHJpbmdMaXN0Ij4NCi0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9InRuczpTdHJpbmdMaXN0IiAvPg0KLQk8L21lc3NhZ2U+DQotCTxtZXNzYWdlIG5hbWU9IlN0cmluZ0xpc3RSZXNwb25zZSI+DQotCQk8cGFydCBuYW1lPSJyZXN1bHQiIGVsZW1lbnQ9InRuczpTdHJpbmdMaXN0UmVzcG9uc2UiIC8+DQotCTwvbWVzc2FnZT4NCi0JDQotCTxwb3J0VHlwZSBuYW1lPSJTdHJpbmdMaXN0UG9ydFR5cGUiPg0KLQkJPG9wZXJhdGlvbiBuYW1lPSJTdHJpbmdMaXN0Ij4NCi0JCQk8aW5wdXQgbWVzc2FnZT0idG5zOlN0cmluZ0xpc3QiIG5hbWU9ImFkZCIgLz4NCi0JCQk8b3V0cHV0IG1lc3NhZ2U9InRuczpTdHJpbmdMaXN0UmVzcG9uc2UiIG5hbWU9ImFkZFJlc3BvbnNlIiAvPg0KLQkJCQ0KLQkJPC9vcGVyYXRpb24+DQotCTwvcG9ydFR5cGU+DQotCTxiaW5kaW5nIG5hbWU9IlN0cmluZ0xpc3RCaW5kaW5nIiB0eXBlPSJ0bnM6U3RyaW5nTGlzdFBvcnRUeXBlIj4NCi0JCTxzb2FwOmJpbmRpbmcgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiDQotCQkJc3R5bGU9ImRvY3VtZW50IiAvPg0KLQkJPG9wZXJhdGlvbiBuYW1lPSJTdHJpbmdMaXN0Ij4NCi0JCQk8aW5wdXQ+DQotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPg0KLQkJCTwvaW5wdXQ+DQotCQkJPG91dHB1dD4NCi0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+DQotCQkJPC9vdXRwdXQ+DQotCQkJDQotCQk8L29wZXJhdGlvbj4NCi0JCQ0KLQk8L2JpbmRpbmc+DQotCTxzZXJ2aWNlIG5hbWU9IlN0cmluZ0xpc3RTZXJ2aWNlIj4NCi0JCTxwb3J0IG5hbWU9IlN0cmluZ0xpc3RQb3J0IiBiaW5kaW5nPSJ0bnM6U3RyaW5nTGlzdEJpbmRpbmciPg0KLQkJCTxzb2FwOmFkZHJlc3MNCi0JCQkJbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6NjA2MC9heGlzMi9zZXJ2aWNlcy9TdHJpbmdMaXN0U2VydmljZSIgLz4NCi0JCTwvcG9ydD4NCi0JPC9zZXJ2aWNlPg0KLTwvZGVmaW5pdGlvbnM+DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9XU0RMTXVsdGlUZXN0cy53c2RsIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9XU0RMTXVsdGlUZXN0cy53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzBmYTdiLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3dzZGwvV1NETE11bHRpVGVzdHMud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDIzMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLQ0KLQ0KLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLQ0KLTxkZWZpbml0aW9ucyBuYW1lPSJBZGROdW1iZXJzIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9vcmcvdGVzdC9hZGRudW1iZXJzIg0KLQl4bWxuczp0bnM9Imh0dHA6Ly9vcmcvdGVzdC9hZGRudW1iZXJzIiB4bWxucz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iDQotCXhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiDQotCXhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iDQotCXhtbG5zOnNvYXAxMj0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwMTIvIg0KLQl4bWxuczpub3Rzb2FwPSJodHRwOi8vbm90LmEuc29hcC5hZGRyZXNzL3dzZGwvbm90c29hcC8iPg0KLQ0KLQ0KLQk8dHlwZXM+DQotCQk8eHNkOnNjaGVtYSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiDQotCQkJZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL29yZy90ZXN0L2FkZG51bWJlcnMiPg0KLQkJCTxlbGVtZW50IG5hbWU9ImFkZE51bWJlcnNSZXNwb25zZSI+DQotCQkJCTxjb21wbGV4VHlwZT4NCi0JCQkJCTxzZXF1ZW5jZT4NCi0JCQkJCQk8ZWxlbWVudCBuYW1lPSJyZXR1cm4iIHR5cGU9InhzZDppbnQiIC8+DQotCQkJCQk8L3NlcXVlbmNlPg0KLQkJCQk8L2NvbXBsZXhUeXBlPg0KLQkJCTwvZWxlbWVudD4NCi0NCi0JCQk8ZWxlbWVudCBuYW1lPSJhZGROdW1iZXJzIj4NCi0JCQkJPGNvbXBsZXhUeXBlPg0KLQkJCQkJPHNlcXVlbmNlPg0KLQkJCQkJCTxlbGVtZW50IG5hbWU9ImFyZzAiIHR5cGU9InhzZDppbnQiIC8+DQotCQkJCQkJPGVsZW1lbnQgbmFtZT0iYXJnMSIgdHlwZT0ieHNkOmludCIgLz4NCi0JCQkJCTwvc2VxdWVuY2U+DQotCQkJCTwvY29tcGxleFR5cGU+DQotCQkJPC9lbGVtZW50Pg0KLQ0KLQkJCTxlbGVtZW50IG5hbWU9IkFkZE51bWJlcnNGYXVsdCI+DQotCQkJCTxjb21wbGV4VHlwZT4NCi0JCQkJCTxzZXF1ZW5jZT4NCi0JCQkJCQk8ZWxlbWVudCBuYW1lPSJmYXVsdEluZm8iIHR5cGU9InhzZDpzdHJpbmciIC8+DQotCQkJCQkJPGVsZW1lbnQgbmFtZT0ibWVzc2FnZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4NCi0JCQkJCTwvc2VxdWVuY2U+DQotCQkJCTwvY29tcGxleFR5cGU+DQotCQkJPC9lbGVtZW50Pg0KLQ0KLQkJCTxlbGVtZW50IG5hbWU9Im9uZVdheUludCI+DQotCQkJCTxjb21wbGV4VHlwZT4NCi0JCQkJCTxzZXF1ZW5jZT4NCi0JCQkJCQk8ZWxlbWVudCBuYW1lPSJhcmcwIiB0eXBlPSJ4c2Q6aW50IiAvPg0KLQkJCQkJPC9zZXF1ZW5jZT4NCi0JCQkJPC9jb21wbGV4VHlwZT4NCi0JCQk8L2VsZW1lbnQ+DQotDQotCQk8L3hzZDpzY2hlbWE+DQotCTwvdHlwZXM+DQotDQotCTxtZXNzYWdlIG5hbWU9ImFkZE51bWJlcnMiPg0KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0idG5zOmFkZE51bWJlcnMiIC8+DQotCTwvbWVzc2FnZT4NCi0JPG1lc3NhZ2UgbmFtZT0iYWRkTnVtYmVyc1Jlc3BvbnNlIj4NCi0JCTxwYXJ0IG5hbWU9InJlc3VsdCIgZWxlbWVudD0idG5zOmFkZE51bWJlcnNSZXNwb25zZSIgLz4NCi0JPC9tZXNzYWdlPg0KLQk8bWVzc2FnZSBuYW1lPSJhZGROdW1iZXJzRmF1bHQiPg0KLQkJPHBhcnQgbmFtZT0iQWRkTnVtYmVyc0ZhdWx0IiBlbGVtZW50PSJ0bnM6QWRkTnVtYmVyc0ZhdWx0IiAvPg0KLQk8L21lc3NhZ2U+DQotCTxtZXNzYWdlIG5hbWU9Im9uZVdheUludCI+DQotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJ0bnM6b25lV2F5SW50IiAvPg0KLQk8L21lc3NhZ2U+DQotDQotCTxwb3J0VHlwZSBuYW1lPSJBZGROdW1iZXJzUG9ydFR5cGUiPg0KLQkJPG9wZXJhdGlvbiBuYW1lPSJhZGROdW1iZXJzIj4NCi0JCQk8aW5wdXQgbWVzc2FnZT0idG5zOmFkZE51bWJlcnMiIG5hbWU9ImFkZCIgLz4NCi0JCQk8b3V0cHV0IG1lc3NhZ2U9InRuczphZGROdW1iZXJzUmVzcG9uc2UiIG5hbWU9ImFkZFJlc3BvbnNlIiAvPg0KLQkJCTxmYXVsdCBuYW1lPSJhZGROdW1iZXJzRmF1bHQiIG1lc3NhZ2U9InRuczphZGROdW1iZXJzRmF1bHQiIC8+DQotCQk8L29wZXJhdGlvbj4NCi0JCTxvcGVyYXRpb24gbmFtZT0ib25lV2F5SW50Ij4NCi0JCQk8aW5wdXQgbWVzc2FnZT0idG5zOm9uZVdheUludCIgLz4NCi0JCTwvb3BlcmF0aW9uPg0KLQk8L3BvcnRUeXBlPg0KLQk8cG9ydFR5cGUgbmFtZT0iQWRkTnVtYmVyc1BvcnRUeXBlT3RoZXJQVCI+DQotCQk8b3BlcmF0aW9uIG5hbWU9ImFkZE51bWJlcnMiPg0KLQkJCTxpbnB1dCBtZXNzYWdlPSJ0bnM6YWRkTnVtYmVycyIgbmFtZT0iYWRkIiAvPg0KLQkJCTxvdXRwdXQgbWVzc2FnZT0idG5zOmFkZE51bWJlcnNSZXNwb25zZSIgbmFtZT0iYWRkUmVzcG9uc2UiIC8+DQotCQkJPGZhdWx0IG5hbWU9ImFkZE51bWJlcnNGYXVsdCIgbWVzc2FnZT0idG5zOmFkZE51bWJlcnNGYXVsdCIgLz4NCi0JCTwvb3BlcmF0aW9uPg0KLQkJPG9wZXJhdGlvbiBuYW1lPSJvbmVXYXlJbnQiPg0KLQkJCTxpbnB1dCBtZXNzYWdlPSJ0bnM6b25lV2F5SW50IiAvPg0KLQkJPC9vcGVyYXRpb24+DQotCTwvcG9ydFR5cGU+DQotCQ0KLQk8YmluZGluZyBuYW1lPSJBZGROdW1iZXJzQmluZGluZyIgdHlwZT0idG5zOkFkZE51bWJlcnNQb3J0VHlwZSI+DQotCQk8c29hcDpiaW5kaW5nIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIg0KLQkJCXN0eWxlPSJkb2N1bWVudCIgLz4NCi0JCTxvcGVyYXRpb24gbmFtZT0iYWRkTnVtYmVycyI+DQotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIgLz4NCi0JCQk8aW5wdXQ+DQotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPg0KLQkJCTwvaW5wdXQ+DQotCQkJPG91dHB1dD4NCi0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+DQotCQkJPC9vdXRwdXQ+DQotCQkJPGZhdWx0IG5hbWU9ImFkZE51bWJlcnNGYXVsdCI+DQotCQkJCTxzb2FwOmZhdWx0IG5hbWU9ImFkZE51bWJlcnNGYXVsdCIgdXNlPSJsaXRlcmFsIiAvPg0KLQkJCTwvZmF1bHQ+DQotCQk8L29wZXJhdGlvbj4NCi0JCTxvcGVyYXRpb24gbmFtZT0ib25lV2F5SW50Ij4NCi0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIiAvPg0KLQkJCTxpbnB1dD4NCi0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+DQotCQkJPC9pbnB1dD4NCi0JCTwvb3BlcmF0aW9uPg0KLQk8L2JpbmRpbmc+DQotCTxiaW5kaW5nIG5hbWU9IkFkZE51bWJlcnNCaW5kaW5nU2FtZVBUIiB0eXBlPSJ0bnM6QWRkTnVtYmVyc1BvcnRUeXBlIj4NCi0JCTxzb2FwOmJpbmRpbmcgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiDQotCQkJc3R5bGU9ImRvY3VtZW50IiAvPg0KLQkJPG9wZXJhdGlvbiBuYW1lPSJhZGROdW1iZXJzIj4NCi0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIiAvPg0KLQkJCTxpbnB1dD4NCi0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+DQotCQkJPC9pbnB1dD4NCi0JCQk8b3V0cHV0Pg0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0JCQk8L291dHB1dD4NCi0JCQk8ZmF1bHQgbmFtZT0iYWRkTnVtYmVyc0ZhdWx0Ij4NCi0JCQkJPHNvYXA6ZmF1bHQgbmFtZT0iYWRkTnVtYmVyc0ZhdWx0IiB1c2U9ImxpdGVyYWwiIC8+DQotCQkJPC9mYXVsdD4NCi0JCTwvb3BlcmF0aW9uPg0KLQkJPG9wZXJhdGlvbiBuYW1lPSJvbmVXYXlJbnQiPg0KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiIC8+DQotCQkJPGlucHV0Pg0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0JCQk8L2lucHV0Pg0KLQkJPC9vcGVyYXRpb24+DQotCTwvYmluZGluZz4NCi0JPGJpbmRpbmcgbmFtZT0iQWRkTnVtYmVyc0JpbmRpbmdPdGhlclBUIiB0eXBlPSJ0bnM6QWRkTnVtYmVyc1BvcnRUeXBlT3RoZXJQVCI+DQotCQk8c29hcDpiaW5kaW5nIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIg0KLQkJCXN0eWxlPSJkb2N1bWVudCIgLz4NCi0JCTxvcGVyYXRpb24gbmFtZT0iYWRkTnVtYmVycyI+DQotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIgLz4NCi0JCQk8aW5wdXQ+DQotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPg0KLQkJCTwvaW5wdXQ+DQotCQkJPG91dHB1dD4NCi0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+DQotCQkJPC9vdXRwdXQ+DQotCQkJPGZhdWx0IG5hbWU9ImFkZE51bWJlcnNGYXVsdCI+DQotCQkJCTxzb2FwOmZhdWx0IG5hbWU9ImFkZE51bWJlcnNGYXVsdCIgdXNlPSJsaXRlcmFsIiAvPg0KLQkJCTwvZmF1bHQ+DQotCQk8L29wZXJhdGlvbj4NCi0JCTxvcGVyYXRpb24gbmFtZT0ib25lV2F5SW50Ij4NCi0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIiAvPg0KLQkJCTxpbnB1dD4NCi0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+DQotCQkJPC9pbnB1dD4NCi0JCTwvb3BlcmF0aW9uPg0KLQk8L2JpbmRpbmc+DQotCQ0KLQk8IS0tDQotCQlJTVBPUlRBTlQgTk9URTogVGhlc2UgcG9ydHMgYXJlIG5vdCBpbnRlbmRlZCB0byBiZSBjb25uZWN0ZWQgdG9vISAgVGhpcyB0ZXN0IGlzIHNpbXBseSBmb3INCi0JCVdTREwgcHJvY2Vzc2luZyBhbmQgU2VydmljZS5hZGRQb3J0KC4uLikgYW5kIFNlcnZpY2UuZ2V0UG9ydCguLi4pIHZhbGlkYXRpb247IG5vIGF0dGVtcHQgaXMNCi0JCW1hZGUgdG8gYWN0dWFsbHkgY29ubmVjdCB0byB0aGUgZW5kcG9pbnRzIGRlZmluZWQgYmVsb3c7IHRoZXJlIGlzIG5vIGltcGxlbWVudGF0aW9uIGFuZCBubw0KLQkJdmFsaWQgZW5kcG9pbnQgYXQgdGhvc2UgYWRkcmVzc2VzLgkNCi0JLS0+DQotCQ0KLQk8c2VydmljZSBuYW1lPSJBZGROdW1iZXJzU2VydmljZTEiPg0KLQkJPHBvcnQgbmFtZT0iQWRkTnVtYmVyc1BvcnRTMVAxIiBiaW5kaW5nPSJ0bnM6QWRkTnVtYmVyc0JpbmRpbmciPg0KLQkJCTxzb2FwOmFkZHJlc3MNCi0JCQkJbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6OTA4MC9BZGROdW1iZXIvQWRkTnVtYmVyc0ltcGxTZXJ2aWNlUzFQMSIgLz4NCi0JCTwvcG9ydD4NCi0JCTxwb3J0IG5hbWU9IkFkZE51bWJlcnNQb3J0UzFQMiIgYmluZGluZz0idG5zOkFkZE51bWJlcnNCaW5kaW5nIj4NCi0JCQk8c29hcDphZGRyZXNzDQotCQkJCWxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjkwODAvQWRkTnVtYmVyL0FkZE51bWJlcnNJbXBsU2VydmljZVMxUDIiIC8+DQotCQk8L3BvcnQ+DQotCQk8cG9ydCBuYW1lPSJBZGROdW1iZXJzUG9ydFMxUDMiIGJpbmRpbmc9InRuczpBZGROdW1iZXJzQmluZGluZyI+DQotCQkJPHNvYXA6YWRkcmVzcw0KLQkJCQlsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo5MDgwL0FkZE51bWJlci9BZGROdW1iZXJzSW1wbFNlcnZpY2VTMVAzIiAvPg0KLQkJPC9wb3J0Pg0KLQk8L3NlcnZpY2U+DQotCTxzZXJ2aWNlIG5hbWU9IkFkZE51bWJlcnNTZXJ2aWNlMiI+DQotCQk8cG9ydCBuYW1lPSJBZGROdW1iZXJzUG9ydFMyUDEiIGJpbmRpbmc9InRuczpBZGROdW1iZXJzQmluZGluZyI+DQotCQkJPHNvYXA6YWRkcmVzcw0KLQkJCQlsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo5MDgwL0FkZE51bWJlci9BZGROdW1iZXJzSW1wbFNlcnZpY2VTMlAxIiAvPg0KLQkJPC9wb3J0Pg0KLQkJPHBvcnQgbmFtZT0iQWRkTnVtYmVyc1BvcnRTMlAyIiBiaW5kaW5nPSJ0bnM6QWRkTnVtYmVyc0JpbmRpbmciPg0KLQkJCTxzb2FwOmFkZHJlc3MNCi0JCQkJbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6OTA4MC9BZGROdW1iZXIvQWRkTnVtYmVyc0ltcGxTZXJ2aWNlUzJQMiIgLz4NCi0JCTwvcG9ydD4NCi0JCTxwb3J0IG5hbWU9IkFkZE51bWJlcnNQb3J0UzJQMyIgYmluZGluZz0idG5zOkFkZE51bWJlcnNCaW5kaW5nIj4NCi0JCQk8c29hcDphZGRyZXNzDQotCQkJCWxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjkwODAvQWRkTnVtYmVyL0FkZE51bWJlcnNJbXBsU2VydmljZVMyUDMiIC8+DQotCQk8L3BvcnQ+DQotCQkJCTxwb3J0IG5hbWU9IkFkZE51bWJlcnNQb3J0UzJQNCIgYmluZGluZz0idG5zOkFkZE51bWJlcnNCaW5kaW5nIj4NCi0JCQk8c29hcDphZGRyZXNzDQotCQkJCWxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjkwODAvQWRkTnVtYmVyL0FkZE51bWJlcnNJbXBsU2VydmljZVMyUDQiIC8+DQotCQk8L3BvcnQ+DQotCQkNCi0JPC9zZXJ2aWNlPg0KLQkJPHNlcnZpY2UgbmFtZT0iQWRkTnVtYmVyc1NlcnZpY2UzIj4NCi0JCTxwb3J0IG5hbWU9IkFkZE51bWJlcnNQb3J0UzNQMSIgYmluZGluZz0idG5zOkFkZE51bWJlcnNCaW5kaW5nT3RoZXJQVCI+DQotCQkJPHNvYXA6YWRkcmVzcw0KLQkJCQlsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo5MDgwL0FkZE51bWJlci9BZGROdW1iZXJzSW1wbFNlcnZpY2VTM1AxIiAvPg0KLQkJPC9wb3J0Pg0KLQkJPHBvcnQgbmFtZT0iQWRkTnVtYmVyc1BvcnRTM1AyIiBiaW5kaW5nPSJ0bnM6QWRkTnVtYmVyc0JpbmRpbmciPg0KLQkJCTxzb2FwOmFkZHJlc3MNCi0JCQkJbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6OTA4MC9BZGROdW1iZXIvQWRkTnVtYmVyc0ltcGxTZXJ2aWNlUzNQMiIgLz4NCi0JCTwvcG9ydD4NCi0JCTxwb3J0IG5hbWU9IkFkZE51bWJlcnNQb3J0UzNQMyIgYmluZGluZz0idG5zOkFkZE51bWJlcnNCaW5kaW5nU2FtZVBUIj4NCi0JCQk8bm90c29hcDphZGRyZXNzDQotCQkJCWxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjkwODAvQWRkTnVtYmVyL0FkZE51bWJlcnNJbXBsU2VydmljZVMzUDMiIC8+DQotCQk8L3BvcnQ+DQotCQkJCTxwb3J0IG5hbWU9IkFkZE51bWJlcnNQb3J0UzNQNCIgYmluZGluZz0idG5zOkFkZE51bWJlcnNCaW5kaW5nIj4NCi0JCQk8c29hcDEyOmFkZHJlc3MNCi0JCQkJbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6OTA4MC9BZGROdW1iZXIvQWRkTnVtYmVyc0ltcGxTZXJ2aWNlUzNQNCIgLz4NCi0JCTwvcG9ydD4NCi0JCQ0KLQk8L3NlcnZpY2U+DQotCQ0KLTwvZGVmaW5pdGlvbnM+DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9XU0RMVGVzdHMud3NkbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3dzZGwvV1NETFRlc3RzLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1NmJlYTMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9XU0RMVGVzdHMud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotDQotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPCEtLSBXU0RMIGRlc2NyaXB0aW9uIG9mIHRoZSBXU1MgUGluZyBpbnRlcm9wIHNjZW5hcmlvcyAtLT4NCi0NCi08ZGVmaW5pdGlvbnMgbmFtZT0iRWNobyINCi0gICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi90ZXN0cyINCi0gICAgeG1sbnM6d3N1PSJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c3MvMjAwNC8wMS9vYXNpcy0yMDA0MDEtd3NzLXdzc2VjdXJpdHktdXRpbGl0eS0xLjAueHNkIiANCi0gICAgeG1sbnM6dG5zPSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi90ZXN0cyINCi0gICAgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIg0KLSAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIg0KLSAgICB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIg0KLSAgICB4bWxuczp3c3A9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDkvcG9saWN5Ig0KLSAgICB4bWxuczp3c2E9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDgvYWRkcmVzc2luZyINCi0gICAgeG1sbnM6aW50Zj0iaHR0cDovL3dzLXBvbGljeS50ZXN0cyI+DQotICAgIAkgIA0KLSAgPHR5cGVzPg0KLSAgICA8c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvdGVzdHMiDQotICAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4NCi0gICAgICA8Y29tcGxleFR5cGUgbmFtZT0iZWNobyI+DQotICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgIDxlbGVtZW50IG5hbWU9InRleHQiIHR5cGU9InhzZDpzdHJpbmciIG5pbGxhYmxlPSJ0cnVlIi8+DQotICAgICAgICAgICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9ImVjaG9SZXNwb25zZSI+DQotICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgIDxlbGVtZW50IG5hbWU9InRleHQiIHR5cGU9InhzZDpzdHJpbmciIG5pbGxhYmxlPSJ0cnVlIi8+DQotICAgICAgICAgICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgICAgPGVsZW1lbnQgbmFtZT0iRWNobyIgdHlwZT0idG5zOmVjaG8iLz4NCi0gICAgICA8ZWxlbWVudCBuYW1lPSJFY2hvUmVzcG9uc2UiIHR5cGU9InRuczplY2hvUmVzcG9uc2UiLz4NCi0gICAgPC9zY2hlbWE+DQotICA8L3R5cGVzPg0KLQ0KLSAgPG1lc3NhZ2UgbmFtZT0iRWNob1JlcXVlc3QiPg0KLSAgICA8cGFydCBuYW1lPSJlY2hvIiBlbGVtZW50PSJ0bnM6RWNobyIvPg0KLSAgPC9tZXNzYWdlPg0KLQ0KLSAgPG1lc3NhZ2UgbmFtZT0iRWNob1Jlc3BvbnNlIj4NCi0gICAgPHBhcnQgbmFtZT0iZWNob1Jlc3BvbnNlIiBlbGVtZW50PSJ0bnM6RWNob1Jlc3BvbnNlIi8+DQotICA8L21lc3NhZ2U+DQotDQotICA8cG9ydFR5cGUgbmFtZT0iRWNob1BvcnQiPg0KLSAgICA8b3BlcmF0aW9uIG5hbWU9IkVjaG8iPg0KLSAgICAgIDxpbnB1dCAgbWVzc2FnZT0idG5zOkVjaG9SZXF1ZXN0IiB3c2E6QWN0aW9uPSJodHRwOi8vdGVzdHMub3JnL2VjaG8vaW4iIC8+DQotICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6RWNob1Jlc3BvbnNlIiB3c2E6QWN0aW9uPSJodHRwOi8vdGVzdHMub3JnL2VjaG8vb3V0IiAvPg0KLSAgICA8L29wZXJhdGlvbj4NCi0gIDwvcG9ydFR5cGU+DQotDQotICA8YmluZGluZyBuYW1lPSJFY2hvQmluZGluZyIgdHlwZT0idG5zOkVjaG9Qb3J0Ij4NCi0gICAgPHNvYXA6YmluZGluZyB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCINCi1zdHlsZT0iZG9jdW1lbnQiLz4NCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJFY2hvIj4NCi0gICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvdGVzdHMvZWNobyIvPg0KLSAgICAgIDxpbnB1dD4gDQotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgIDwvaW5wdXQ+DQotICAgICAgPG91dHB1dD4NCi0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgPC9vdXRwdXQ+DQotICAgIDwvb3BlcmF0aW9uPg0KLSAgPC9iaW5kaW5nPg0KLSAgIA0KLSAgPHNlcnZpY2UgbmFtZT0iRWNob1NlcnZpY2UiPg0KLSAgICA8cG9ydCBuYW1lPSJFY2hvUG9ydCIgYmluZGluZz0idG5zOkVjaG9CaW5kaW5nIj4NCi0gICAgICA8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjYwNjAvYXhpczIvc2VydmljZXMvRWNob1NlcnZpY2UiLz4NCi0gICAgPC9wb3J0Pg0KLSAgPC9zZXJ2aWNlPg0KLQ0KLTwvZGVmaW5pdGlvbnM+DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9XU0dlblNlcnZpY2Uud3NkbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3dzZGwvV1NHZW5TZXJ2aWNlLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3ZGY0NzguLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9XU0dlblNlcnZpY2Uud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4NCi0NCi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08ZGVmaW5pdGlvbnMgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3NnZW4uc2FtcGxlLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciIG5hbWU9IldTR2VuU2VydmljZSIgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6dG5zPSJodHRwOi8vd3NnZW4uc2FtcGxlLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciIHhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+DQotICA8dHlwZXM+DQotICAgIDx4c2Q6c2NoZW1hPg0KLSAgICAgIDx4c2Q6aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3dzZ2VuLnNhbXBsZS5qYXh3cy5heGlzMi5hcGFjaGUub3JnIiBzY2hlbWFMb2NhdGlvbj0iV1NHZW5TZXJ2aWNlX3NjaGVtYTEueHNkIi8+DQotICAgIDwveHNkOnNjaGVtYT4NCi0gIDwvdHlwZXM+DQotICA8bWVzc2FnZSBuYW1lPSJlY2hvU3RyaW5nIj4NCi0gICAgPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0idG5zOmVjaG9TdHJpbmciLz4NCi0gIDwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIG5hbWU9ImVjaG9TdHJpbmdSZXNwb25zZSI+DQotICAgIDxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9InRuczplY2hvU3RyaW5nUmVzcG9uc2UiLz4NCi0gIDwvbWVzc2FnZT4NCi0gIDxwb3J0VHlwZSBuYW1lPSJXU0dlbkludGVyZmFjZSI+DQotICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob1N0cmluZyI+DQotICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczplY2hvU3RyaW5nIi8+DQotICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6ZWNob1N0cmluZ1Jlc3BvbnNlIi8+DQotICAgIDwvb3BlcmF0aW9uPg0KLSAgPC9wb3J0VHlwZT4NCi0gIDxiaW5kaW5nIG5hbWU9IldTR2VuUG9ydEJpbmRpbmciIHR5cGU9InRuczpXU0dlbkludGVyZmFjZSI+DQotICAgIDxzb2FwOmJpbmRpbmcgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiIHN0eWxlPSJkb2N1bWVudCIvPg0KLSAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9TdHJpbmciPg0KLSAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46RWNob1N0cmluZyIvPg0KLSAgICAgIDxpbnB1dD4NCi0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgPC9pbnB1dD4NCi0gICAgICA8b3V0cHV0Pg0KLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4NCi0gICAgICA8L291dHB1dD4NCi0gICAgPC9vcGVyYXRpb24+DQotICA8L2JpbmRpbmc+DQotICA8c2VydmljZSBuYW1lPSJXU0dlblNlcnZpY2UiPg0KLSAgICA8cG9ydCBuYW1lPSJXU0dlblBvcnQiIGJpbmRpbmc9InRuczpXU0dlblBvcnRCaW5kaW5nIj4NCi0gICAgICA8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjYwNjAvYXhpczIvc2VydmljZXMvV1NHZW5TZXJ2aWNlIi8+DQotICAgIDwvcG9ydD4NCi0gIDwvc2VydmljZT4NCi08L2RlZmluaXRpb25zPg0KLQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3dzZGwvV1NHZW5TZXJ2aWNlX3NjaGVtYTEueHNkIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9XU0dlblNlcnZpY2Vfc2NoZW1hMS54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0OWY3YmYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9XU0dlblNlcnZpY2Vfc2NoZW1hMS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ieWVzIj8+DQotDQotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPHhzOnNjaGVtYSB2ZXJzaW9uPSIxLjAiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3dzZ2VuLnNhbXBsZS5qYXh3cy5heGlzMi5hcGFjaGUub3JnIiB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPg0KLQ0KLSAgPHhzOmVsZW1lbnQgbmFtZT0iZWNob1N0cmluZyIgdHlwZT0ibnMxOmVjaG9TdHJpbmciIHhtbG5zOm5zMT0iaHR0cDovL3dzZ2VuLnNhbXBsZS5qYXh3cy5heGlzMi5hcGFjaGUub3JnIi8+DQotDQotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iZWNob1N0cmluZyI+DQotICAgIDx4czpzZXF1ZW5jZT4NCi0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJhcmcwIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPg0KLSAgICA8L3hzOnNlcXVlbmNlPg0KLSAgPC94czpjb21wbGV4VHlwZT4NCi0NCi0gIDx4czplbGVtZW50IG5hbWU9ImVjaG9TdHJpbmdSZXNwb25zZSIgdHlwZT0ibnMyOmVjaG9TdHJpbmdSZXNwb25zZSIgeG1sbnM6bnMyPSJodHRwOi8vd3NnZW4uc2FtcGxlLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciLz4NCi0NCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJlY2hvU3RyaW5nUmVzcG9uc2UiPg0KLSAgICA8eHM6c2VxdWVuY2U+DQotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0icmV0dXJuIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPg0KLSAgICA8L3hzOnNlcXVlbmNlPg0KLSAgPC94czpjb21wbGV4VHlwZT4NCi08L3hzOnNjaGVtYT4NCi0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy93c2RsL2FzeW5jX2RvY2xpdHdyLndzZGwgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy93c2RsL2FzeW5jX2RvY2xpdHdyLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2M2NjNmIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9hc3luY19kb2NsaXR3ci53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsMzQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotDQotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPHdzZGw6ZGVmaW5pdGlvbnMgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iDQotCXhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iDQotCXhtbG5zOnRucz0iaHR0cDovL29yZy90ZXN0L3BhcmFsbGVsYXN5bmMiDQotCXhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9ImFzeW5jIg0KLQl0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9vcmcvdGVzdC9wYXJhbGxlbGFzeW5jIj4NCi0JDQotCTx3c2RsOnR5cGVzPg0KLQkJPHhzZDpzY2hlbWENCi0JCQl0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9vcmcvdGVzdC9wYXJhbGxlbGFzeW5jIg0KLQkJCXhtbG5zOnRucz0iaHR0cDovL29yZy90ZXN0L3BhcmFsbGVsYXN5bmMiDQotCQkJeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+CQkNCi0JCQkNCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0icGluZyI+DQotCQkJCTx4c2Q6Y29tcGxleFR5cGU+DQotCQkJCQk8eHNkOnNlcXVlbmNlPg0KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJtZXNzYWdlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgkJCQkJCQ0KLQkJCQkJPC94c2Q6c2VxdWVuY2U+DQotCQkJCTwveHNkOmNvbXBsZXhUeXBlPg0KLQkJCTwveHNkOmVsZW1lbnQ+CQkNCi0JCQkNCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0icGluZ1Jlc3BvbnNlIj4NCi0JCQkJPHhzZDpjb21wbGV4VHlwZT4NCi0JCQkJCTx4c2Q6c2VxdWVuY2U+DQotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9InJlc3BvbnNlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPg0KLQkJCQkJPC94c2Q6c2VxdWVuY2U+DQotCQkJCTwveHNkOmNvbXBsZXhUeXBlPg0KLQkJCTwveHNkOmVsZW1lbnQ+CQkJDQotCQkJDQotCQkJPHhzZDplbGVtZW50IG5hbWU9InNsZWVwIj4NCi0JCQkJPHhzZDpjb21wbGV4VHlwZT4NCi0JCQkJCTx4c2Q6c2VxdWVuY2U+DQotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Im1lc3NhZ2UiIHR5cGU9InhzZDpzdHJpbmciIC8+CQkJCQkJDQotCQkJCQk8L3hzZDpzZXF1ZW5jZT4NCi0JCQkJPC94c2Q6Y29tcGxleFR5cGU+DQotCQkJPC94c2Q6ZWxlbWVudD4JCQ0KLQkJCQ0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJzbGVlcFJlc3BvbnNlIj4NCi0JCQkJPHhzZDpjb21wbGV4VHlwZT4NCi0JCQkJCTx4c2Q6c2VxdWVuY2U+DQotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Im1lc3NhZ2UiIHR5cGU9InhzZDpzdHJpbmciIC8+DQotCQkJCQk8L3hzZDpzZXF1ZW5jZT4NCi0JCQkJPC94c2Q6Y29tcGxleFR5cGU+DQotCQkJPC94c2Q6ZWxlbWVudD4JCQ0KLQ0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJpc0FzbGVlcCI+DQotCQkJCTx4c2Q6Y29tcGxleFR5cGU+DQotCQkJCQk8eHNkOnNlcXVlbmNlPg0KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJyZXF1ZXN0IiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPg0KLQkJCQkJPC94c2Q6c2VxdWVuY2U+DQotCQkJCTwveHNkOmNvbXBsZXhUeXBlPg0KLQkJCTwveHNkOmVsZW1lbnQ+CQ0KLQ0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJpc0FzbGVlcFJlc3BvbnNlIj4NCi0JCQkJPHhzZDpjb21wbGV4VHlwZT4NCi0JCQkJCTx4c2Q6c2VxdWVuY2U+DQotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9InJlc3BvbnNlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPg0KLQkJCQkJPC94c2Q6c2VxdWVuY2U+DQotCQkJCTwveHNkOmNvbXBsZXhUeXBlPg0KLQkJCTwveHNkOmVsZW1lbnQ+CQ0KLQ0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJ3YWtlVXAiPg0KLQkJCQk8eHNkOmNvbXBsZXhUeXBlPg0KLQkJCQkJPHhzZDpzZXF1ZW5jZT4NCi0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0icmVxdWVzdCIgdHlwZT0ieHNkOnN0cmluZyIgLz4NCi0JCQkJCTwveHNkOnNlcXVlbmNlPg0KLQkJCQk8L3hzZDpjb21wbGV4VHlwZT4NCi0JCQk8L3hzZDplbGVtZW50PgkNCi0NCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0id2FrZVVwUmVzcG9uc2UiPg0KLQkJCQk8eHNkOmNvbXBsZXhUeXBlPg0KLQkJCQkJPHhzZDpzZXF1ZW5jZT4NCi0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0icmVzcG9uc2UiIHR5cGU9InhzZDpzdHJpbmciIC8+CQkJCQkJDQotCQkJCQk8L3hzZDpzZXF1ZW5jZT4NCi0JCQkJPC94c2Q6Y29tcGxleFR5cGU+DQotCQkJPC94c2Q6ZWxlbWVudD4JDQotDQotCQkJPHhzZDplbGVtZW50IG5hbWU9Imludm9rZUFzeW5jIj4NCi0JCQkJPHhzZDpjb21wbGV4VHlwZT4NCi0JCQkJCTx4c2Q6c2VxdWVuY2U+DQotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9InJlcXVlc3QiIHR5cGU9InhzZDpzdHJpbmciIC8+CQkJCQkJDQotCQkJCQk8L3hzZDpzZXF1ZW5jZT4NCi0JCQkJPC94c2Q6Y29tcGxleFR5cGU+DQotCQkJPC94c2Q6ZWxlbWVudD4NCi0NCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iaW52b2tlQXN5bmNSZXNwb25zZSI+DQotCQkJCTx4c2Q6Y29tcGxleFR5cGU+DQotCQkJCQk8eHNkOnNlcXVlbmNlPg0KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJyZXNwb25zZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4JCQkJCQkNCi0JCQkJCTwveHNkOnNlcXVlbmNlPg0KLQkJCQk8L3hzZDpjb21wbGV4VHlwZT4NCi0JCQk8L3hzZDplbGVtZW50Pg0KLQ0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJjdXN0b21Bc3luYyI+DQotCQkJCTx4c2Q6Y29tcGxleFR5cGU+DQotCQkJCQk8eHNkOnNlcXVlbmNlPg0KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJyZXF1ZXN0IiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgkJCQkJCQ0KLQkJCQkJPC94c2Q6c2VxdWVuY2U+DQotCQkJCTwveHNkOmNvbXBsZXhUeXBlPg0KLQkJCTwveHNkOmVsZW1lbnQ+DQotDQotCQkJPHhzZDplbGVtZW50IG5hbWU9ImN1c3RvbUFzeW5jUmVzcG9uc2UiPg0KLQkJCQk8eHNkOmNvbXBsZXhUeXBlPg0KLQkJCQkJPHhzZDpzZXF1ZW5jZT4NCi0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0icmVzcG9uc2UiIHR5cGU9InhzZDpzdHJpbmciIC8+CQkJCQkJDQotCQkJCQk8L3hzZDpzZXF1ZW5jZT4NCi0JCQkJPC94c2Q6Y29tcGxleFR5cGU+DQotCQkJPC94c2Q6ZWxlbWVudD4NCi0NCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iYW5vdGhlciI+DQotCQkJCTx4c2Q6Y29tcGxleFR5cGU+DQotCQkJCQk8eHNkOnNlcXVlbmNlPg0KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJyZXF1ZXN0IiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgkJCQkJCQ0KLQkJCQkJPC94c2Q6c2VxdWVuY2U+DQotCQkJCTwveHNkOmNvbXBsZXhUeXBlPg0KLQkJCTwveHNkOmVsZW1lbnQ+DQotDQotCQkJPHhzZDplbGVtZW50IG5hbWU9ImFub3RoZXJSZXNwb25zZSI+DQotCQkJCTx4c2Q6Y29tcGxleFR5cGU+DQotCQkJCQk8eHNkOnNlcXVlbmNlPg0KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJyZXNwb25zZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4JCQkJCQkNCi0JCQkJCTwveHNkOnNlcXVlbmNlPg0KLQkJCQk8L3hzZDpjb21wbGV4VHlwZT4NCi0JCQk8L3hzZDplbGVtZW50Pg0KLQ0KLQkJPC94c2Q6c2NoZW1hPg0KLQk8L3dzZGw6dHlwZXM+DQotDQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0icGluZ1JlcXVlc3QiPg0KLQkJPHdzZGw6cGFydCBuYW1lPSJyZXF1ZXN0IiBlbGVtZW50PSJ0bnM6cGluZyIgLz4NCi0JPC93c2RsOm1lc3NhZ2U+DQotDQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0icGluZ1Jlc3BvbnNlIj4NCi0JCTx3c2RsOnBhcnQgbmFtZT0icmVzcG9uc2UiIGVsZW1lbnQ9InRuczpwaW5nUmVzcG9uc2UiIC8+DQotCTwvd3NkbDptZXNzYWdlPg0KLQ0KLQk8d3NkbDptZXNzYWdlIG5hbWU9InNsZWVwUmVxdWVzdCI+DQotCQk8d3NkbDpwYXJ0IG5hbWU9InJlcXVlc3QiIGVsZW1lbnQ9InRuczpzbGVlcCIgLz4NCi0JPC93c2RsOm1lc3NhZ2U+DQotDQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0ic2xlZXBSZXNwb25zZSI+DQotCQk8d3NkbDpwYXJ0IG5hbWU9InJlc3BvbnNlIiBlbGVtZW50PSJ0bnM6c2xlZXBSZXNwb25zZSIgLz4NCi0JPC93c2RsOm1lc3NhZ2U+DQotCQ0KLQk8d3NkbDptZXNzYWdlIG5hbWU9Indha2VVcFJlcXVlc3QiPg0KLQkJPHdzZGw6cGFydCBuYW1lPSJyZXF1ZXN0IiBlbGVtZW50PSJ0bnM6d2FrZVVwIiAvPgkNCi0JPC93c2RsOm1lc3NhZ2U+DQotDQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0id2FrZVVwUmVzcG9uc2UiPg0KLQkJPHdzZGw6cGFydCBuYW1lPSJyZXNwb25zZSIgZWxlbWVudD0idG5zOndha2VVcFJlc3BvbnNlIiAvPgkNCi0JPC93c2RsOm1lc3NhZ2U+CQ0KLQkNCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJpc0FzbGVlcFJlcXVlc3QiPg0KLQk8d3NkbDpwYXJ0IG5hbWU9InJlcXVlc3QiIGVsZW1lbnQ9InRuczppc0FzbGVlcCIgLz4NCi0JPC93c2RsOm1lc3NhZ2U+DQotDQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0iaXNBc2xlZXBSZXNwb25zZSI+DQotCQk8d3NkbDpwYXJ0IG5hbWU9InJlc3BvbnNlIiBlbGVtZW50PSJ0bnM6aXNBc2xlZXBSZXNwb25zZSIgLz4JDQotCTwvd3NkbDptZXNzYWdlPgkJDQotCQ0KLQk8d3NkbDptZXNzYWdlIG5hbWU9Imludm9rZUFzeW5jUmVxdWVzdCI+DQotCQk8d3NkbDpwYXJ0IG5hbWU9InJlcXVlc3QiIGVsZW1lbnQ9InRuczppbnZva2VBc3luYyIgLz4NCi0JPC93c2RsOm1lc3NhZ2U+DQotDQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0iaW52b2tlQXN5bmNSZXNwb25zZSI+DQotCQk8d3NkbDpwYXJ0IG5hbWU9InJlc3BvbnNlIiBlbGVtZW50PSJ0bnM6aW52b2tlQXN5bmNSZXNwb25zZSIgLz4NCi0JPC93c2RsOm1lc3NhZ2U+CQ0KLQkNCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJjdXN0b21Bc3luY1JlcXVlc3QiPg0KLQkJPHdzZGw6cGFydCBuYW1lPSJyZXF1ZXN0IiBlbGVtZW50PSJ0bnM6Y3VzdG9tQXN5bmMiIC8+DQotCTwvd3NkbDptZXNzYWdlPg0KLQ0KLQk8d3NkbDptZXNzYWdlIG5hbWU9ImN1c3RvbUFzeW5jUmVzcG9uc2UiPg0KLQkJPHdzZGw6cGFydCBuYW1lPSJyZXNwb25zZSIgZWxlbWVudD0idG5zOmN1c3RvbUFzeW5jUmVzcG9uc2UiIC8+DQotCTwvd3NkbDptZXNzYWdlPgkJDQotCQ0KLQk8d3NkbDptZXNzYWdlIG5hbWU9ImFub3RoZXJSZXF1ZXN0Ij4NCi0JCTx3c2RsOnBhcnQgbmFtZT0icmVxdWVzdCIgZWxlbWVudD0idG5zOmFub3RoZXIiIC8+DQotCTwvd3NkbDptZXNzYWdlPg0KLQ0KLQk8d3NkbDptZXNzYWdlIG5hbWU9ImFub3RoZXJSZXNwb25zZSI+DQotCQk8d3NkbDpwYXJ0IG5hbWU9InJlc3BvbnNlIiBlbGVtZW50PSJ0bnM6YW5vdGhlclJlc3BvbnNlIiAvPg0KLQk8L3dzZGw6bWVzc2FnZT4JCQ0KLQkNCi0JPHdzZGw6cG9ydFR5cGUgbmFtZT0iQXN5bmNQb3J0Ij4NCi0JCQ0KLQkJPCEtLSBzaW1wbGUgcGluZyBvcGVyYXRpb24gdGhhdCB3aWxsIGJlIHVzZWQgZm9yIERvY0xpdFdyYXBwZWQgYXN5bmMgdGVzdC0tPg0KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9InBpbmciPg0KLQkJCTx3c2RsOmlucHV0ICBtZXNzYWdlPSJ0bnM6cGluZ1JlcXVlc3QiIC8+DQotCQkJPHdzZGw6b3V0cHV0IG1lc3NhZ2U9InRuczpwaW5nUmVzcG9uc2UiIC8+DQotCQk8L3dzZGw6b3BlcmF0aW9uPgkJDQotCQkNCi0JCTwhLS0gcmVxdWVzdCBmb3IgdGhlIHNlcnZlciB0byBnb3RvIHNsZWVwIHVudGlsIHJlbGVhc2UgaXMgY2FsbGVkLS0+DQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0ic2xlZXAiPg0KLQkJCTx3c2RsOmlucHV0ICBtZXNzYWdlPSJ0bnM6c2xlZXBSZXF1ZXN0IiAvPg0KLQkJCTx3c2RsOm91dHB1dCBtZXNzYWdlPSJ0bnM6c2xlZXBSZXNwb25zZSIgLz4NCi0JCTwvd3NkbDpvcGVyYXRpb24+DQotCQkNCi0JCTwhLS0gY2hlY2sgdG8gc2VlIGlmIHRoZSBzbGVlcCBvcGVyYXRpb24gaGFzIGJlZW4gY2FsbGVkIHlldCAtLT4NCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJpc0FzbGVlcCI+DQotCQkJPHdzZGw6aW5wdXQgIG1lc3NhZ2U9InRuczppc0FzbGVlcFJlcXVlc3QiIC8+DQotCQkJPHdzZGw6b3V0cHV0IG1lc3NhZ2U9InRuczppc0FzbGVlcFJlc3BvbnNlIiAvPg0KLQkJPC93c2RsOm9wZXJhdGlvbj4JCQkNCi0JCQ0KLQkJPCEtLSBmb3JjZSB0aGUgc2xlZXAgb3BlcmF0aW9uIHRvIHN0b3Agc2xlZXBpbmcgLS0+DQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0id2FrZVVwIj4NCi0JCQk8d3NkbDppbnB1dCAgbWVzc2FnZT0idG5zOndha2VVcFJlcXVlc3QiIC8+DQotCQkJPHdzZGw6b3V0cHV0IG1lc3NhZ2U9InRuczp3YWtlVXBSZXNwb25zZSIgLz4NCi0JCTwvd3NkbDpvcGVyYXRpb24+CQkNCi0JCQkNCi0JCQkNCi0JCQkNCi0JCTwhLS0gU2Vjb25kIHN1aXRlIG9mIHRlc3RzIGZvciBBc3luYyBvcGVyYXRpb24gbmFtaW5nOg0KLQkJCSB3aWxsIHRlc3QgZm9yIGhvdyB0aGUgaW1wbGVtZW50YXRpb24gcmVzcG9uZHMgdG8NCi0JCSAgICAgbWV0aG9kcyBlbmRpbmcgaW4gQXN5bmMgd2l0aCBhc3luYyBiaW5kaW5nIGVuYWJsZWQNCi0JCSAtLT4NCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJpbnZva2VBc3luYyI+DQotCQkJPHdzZGw6aW5wdXQgIG1lc3NhZ2U9InRuczppbnZva2VBc3luY1JlcXVlc3QiIC8+DQotCQkJPHdzZGw6b3V0cHV0IG1lc3NhZ2U9InRuczppbnZva2VBc3luY1Jlc3BvbnNlIiAvPg0KLQkJPC93c2RsOm9wZXJhdGlvbj4JCQkNCi0JCQkNCi0JCTwhLS0gd2lsbCB0ZXN0IGZvciBob3cgdGhlIGltcGxlbWVudGF0aW9uIHJlc3BvbmRzIHRvDQotCQkgICAgIG1ldGhvZHMgZW5kaW5nIGluIGFzeW5jIHdpdGggYXN5bmMgYmluZGluZyBlbmFibGVkDQotCQkgLS0+CQkJDQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iY3VzdG9tQXN5bmMiPg0KLQkJCTx3c2RsOmlucHV0ICBtZXNzYWdlPSJ0bnM6Y3VzdG9tQXN5bmNSZXF1ZXN0IiAvPg0KLQkJCTx3c2RsOm91dHB1dCBtZXNzYWdlPSJ0bnM6Y3VzdG9tQXN5bmNSZXNwb25zZSIgLz4NCi0JCTwvd3NkbDpvcGVyYXRpb24+DQotCQkNCi0JCTwhLS0gd2Ugd2lsbCBtYXAgdGhpcyBvcGVyYXRpb24gdG8gYSBqYXZhIG1ldGhvZCBlbmRpbmcgaW4gQXN5bmMNCi0JCSAtLT4JCQ0KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImFub3RoZXIiPg0KLQkJCTx3c2RsOmlucHV0ICBtZXNzYWdlPSJ0bnM6YW5vdGhlclJlcXVlc3QiIC8+DQotCQkJPHdzZGw6b3V0cHV0IG1lc3NhZ2U9InRuczphbm90aGVyUmVzcG9uc2UiIC8+DQotCQk8L3dzZGw6b3BlcmF0aW9uPgkJCQkJDQotCQkJDQotCTwvd3NkbDpwb3J0VHlwZT4NCi0JDQotCTx3c2RsOmJpbmRpbmcgbmFtZT0iQXN5bmMiIHR5cGU9InRuczpBc3luY1BvcnQiPg0KLQkJPHNvYXA6YmluZGluZyBzdHlsZT0iZG9jdW1lbnQiIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIiAvPg0KLQkJDQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0icGluZyI+DQotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly9vcmcvdGVzdC9wYXJhbGxlbGFzeW5jL3BpbmciIC8+DQotCQkJPHdzZGw6aW5wdXQ+DQotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAgLz4NCi0JCQk8L3dzZGw6aW5wdXQ+DQotCQkJPHdzZGw6b3V0cHV0Pg0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgIC8+DQotCQkJPC93c2RsOm91dHB1dD4NCi0JCTwvd3NkbDpvcGVyYXRpb24+CQkNCi0JCQ0KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9InNsZWVwIj4NCi0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL29yZy90ZXN0L3BhcmFsbGVsYXN5bmMvc2xlZXAiIC8+DQotCQkJPHdzZGw6aW5wdXQ+DQotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAgLz4NCi0JCQk8L3dzZGw6aW5wdXQ+DQotCQkJPHdzZGw6b3V0cHV0Pg0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgIC8+DQotCQkJPC93c2RsOm91dHB1dD4NCi0JCTwvd3NkbDpvcGVyYXRpb24+DQotCQ0KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImlzQXNsZWVwIj4NCi0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL29yZy90ZXN0L3BhcmFsbGVsYXN5bmMvaXNBc2xlZXAiIC8+DQotCQkJPHdzZGw6aW5wdXQ+DQotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAgLz4NCi0JCQk8L3dzZGw6aW5wdXQ+DQotCQkJPHdzZGw6b3V0cHV0Pg0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgIC8+DQotCQkJPC93c2RsOm91dHB1dD4NCi0JCTwvd3NkbDpvcGVyYXRpb24+CQ0KLQkNCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJ3YWtlVXAiPg0KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vb3JnL3Rlc3QvcGFyYWxsZWxhc3luYy93YWtlVXAiIC8+DQotCQkJPHdzZGw6aW5wdXQ+DQotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAgLz4NCi0JCQk8L3dzZGw6aW5wdXQ+DQotCQkJPHdzZGw6b3V0cHV0Pg0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgIC8+DQotCQkJPC93c2RsOm91dHB1dD4NCi0JCTwvd3NkbDpvcGVyYXRpb24+DQotCQ0KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9Imludm9rZUFzeW5jIj4NCi0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL29yZy90ZXN0L3BhcmFsbGVsYXN5bmMvaW52b2tlQXN5bmMiIC8+DQotCQkJPHdzZGw6aW5wdXQ+DQotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAgLz4NCi0JCQk8L3dzZGw6aW5wdXQ+DQotCQkJPHdzZGw6b3V0cHV0Pg0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgIC8+DQotCQkJPC93c2RsOm91dHB1dD4NCi0JCTwvd3NkbDpvcGVyYXRpb24+CQkNCi0JDQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iY3VzdG9tQXN5bmMiPg0KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vb3JnL3Rlc3QvcGFyYWxsZWxhc3luYy9jdXN0b21Bc3luYyIgLz4NCi0JCQk8d3NkbDppbnB1dD4NCi0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiICAvPg0KLQkJCTwvd3NkbDppbnB1dD4NCi0JCQk8d3NkbDpvdXRwdXQ+DQotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAgLz4NCi0JCQk8L3dzZGw6b3V0cHV0Pg0KLQkJPC93c2RsOm9wZXJhdGlvbj4JCQ0KLQkNCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJhbm90aGVyIj4NCi0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL29yZy90ZXN0L3BhcmFsbGVsYXN5bmMvYW5vdGhlciIgLz4NCi0JCQk8d3NkbDppbnB1dD4NCi0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiICAvPg0KLQkJCTwvd3NkbDppbnB1dD4NCi0JCQk8d3NkbDpvdXRwdXQ+DQotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAgLz4NCi0JCQk8L3dzZGw6b3V0cHV0Pg0KLQkJPC93c2RsOm9wZXJhdGlvbj4JDQotCQ0KLQk8L3dzZGw6YmluZGluZz4NCi0JDQotCTx3c2RsOnNlcnZpY2UgbmFtZT0iQXN5bmNTZXJ2aWNlIj4NCi0JCTx3c2RsOnBvcnQgYmluZGluZz0idG5zOkFzeW5jIiBuYW1lPSJBc3luY1BvcnQiPg0KLQkJCTxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6OTA4MC9qYXh3cy5hc3luYy9zZXJ2aWNlcy9Bc3luY0RvY0xpdFdyYXBwZWRTZXJ2aWNlIiAvPg0KLQkJPC93c2RsOnBvcnQ+DQotCTwvd3NkbDpzZXJ2aWNlPg0KLQkNCi08L3dzZGw6ZGVmaW5pdGlvbnM+DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9hc3luY19kb2NsaXR3cjIud3NkbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3dzZGwvYXN5bmNfZG9jbGl0d3IyLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5OTM0NTguLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9hc3luY19kb2NsaXR3cjIud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDQwMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTx3c2RsOmRlZmluaXRpb25zIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIgotCXhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iCi0JeG1sbnM6dG5zPSJodHRwOi8vb3JnL3Rlc3QvYXN5bmNkb2NsaXQiCi0JeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iYXN5bmMiCi0JdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vb3JnL3Rlc3QvYXN5bmNkb2NsaXQiPgotCQotCTx3c2RsOnR5cGVzPgotCQk8eHNkOnNjaGVtYQotCQkJdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vb3JnL3Rlc3QvYXN5bmNkb2NsaXQiCi0JCQl4bWxuczp0bnM9Imh0dHA6Ly9vcmcvdGVzdC9hc3luY2RvY2xpdCIKLQkJCXhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPgkJCi0JCQkKLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJwaW5nIj4KLQkJCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Im1lc3NhZ2UiIHR5cGU9InhzZDpzdHJpbmciIC8+CQkJCQkJCi0JCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTwveHNkOmNvbXBsZXhUeXBlPgotCQkJPC94c2Q6ZWxlbWVudD4JCQotCQkJCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0icGluZ1Jlc3BvbnNlIj4KLQkJCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9InJlc3BvbnNlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotCQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8L3hzZDpjb21wbGV4VHlwZT4KLQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkKLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJzbGVlcCI+Ci0JCQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJtZXNzYWdlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgkJCQkJCQotCQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8L3hzZDpjb21wbGV4VHlwZT4KLQkJCTwveHNkOmVsZW1lbnQ+CQkKLQkJCQotCQkJPHhzZDplbGVtZW50IG5hbWU9InNsZWVwUmVzcG9uc2UiPgotCQkJCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLQkJCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JCQk8L3hzZDplbGVtZW50PgkJCi0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJpc0FzbGVlcCI+Ci0JCQkJPHhzZDpjb21wbGV4VHlwZSAvPgotCQkJPC94c2Q6ZWxlbWVudD4JCi0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJpc0FzbGVlcFJlc3BvbnNlIj4KLQkJCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Im1lc3NhZ2UiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0JCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTwveHNkOmNvbXBsZXhUeXBlPgotCQkJPC94c2Q6ZWxlbWVudD4JCi0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJ3YWtlVXAiPgotCQkJCTx4c2Q6Y29tcGxleFR5cGUgLz4KLQkJCTwveHNkOmVsZW1lbnQ+CQotCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0id2FrZVVwUmVzcG9uc2UiPgotCQkJCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4JCQkJCQkKLQkJCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JCQk8L3hzZDplbGVtZW50PgkKLQotCQkJPHhzZDplbGVtZW50IG5hbWU9Imludm9rZUFzeW5jIj4KLQkJCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9InJlcXVlc3QiIHR5cGU9InhzZDpzdHJpbmciIC8+CQkJCQkJCi0JCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTwveHNkOmNvbXBsZXhUeXBlPgotCQkJPC94c2Q6ZWxlbWVudD4KLQotCQkJPHhzZDplbGVtZW50IG5hbWU9Imludm9rZUFzeW5jUmVzcG9uc2UiPgotCQkJCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0icmVzcG9uc2UiIHR5cGU9InhzZDpzdHJpbmciIC8+CQkJCQkJCi0JCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTwveHNkOmNvbXBsZXhUeXBlPgotCQkJPC94c2Q6ZWxlbWVudD4KLQotCQkJPHhzZDplbGVtZW50IG5hbWU9ImN1c3RvbUFzeW5jIj4KLQkJCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9InJlcXVlc3QiIHR5cGU9InhzZDpzdHJpbmciIC8+CQkJCQkJCi0JCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTwveHNkOmNvbXBsZXhUeXBlPgotCQkJPC94c2Q6ZWxlbWVudD4KLQotCQkJPHhzZDplbGVtZW50IG5hbWU9ImN1c3RvbUFzeW5jUmVzcG9uc2UiPgotCQkJCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0icmVzcG9uc2UiIHR5cGU9InhzZDpzdHJpbmciIC8+CQkJCQkJCi0JCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTwveHNkOmNvbXBsZXhUeXBlPgotCQkJPC94c2Q6ZWxlbWVudD4KLQotCQkJPHhzZDplbGVtZW50IG5hbWU9ImFub3RoZXIiPgotCQkJCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0icmVxdWVzdCIgdHlwZT0ieHNkOnN0cmluZyIgLz4JCQkJCQkKLQkJCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JCQk8L3hzZDplbGVtZW50PgotCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iYW5vdGhlclJlc3BvbnNlIj4KLQkJCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9InJlc3BvbnNlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgkJCQkJCQotCQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8L3hzZDpjb21wbGV4VHlwZT4KLQkJCTwveHNkOmVsZW1lbnQ+Ci0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJ0aHJvd0V4Y2VwdGlvbiI+Ci0JCQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJleGNlcHRpb25UeXBlIiB0eXBlPSJ0bnM6RXhjZXB0aW9uVHlwZUVudW0iIC8+Ci0JCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTwveHNkOmNvbXBsZXhUeXBlPgotCQkJPC94c2Q6ZWxlbWVudD4JCQotCi0JCQk8eHNkOnNpbXBsZVR5cGUgbmFtZT0iRXhjZXB0aW9uVHlwZUVudW0iPgotCQkJCTx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5QRSIgLz4KLQkJCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGl2aWRlQnlaZXJvIiAvPgotCQkJCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXU0UiIC8+Ci0JCQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvYXBGYXVsdCIgLz4KLQkJCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV3NkbEZhdWx0IiAvPgotCQkJCTwveHNkOnJlc3RyaWN0aW9uPgotCQkJPC94c2Q6c2ltcGxlVHlwZT4JCi0JCQkKLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJ0aHJvd0V4Y2VwdGlvbkZhdWx0QmVhbiI+Ci0JCQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJ0ZXh0IiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotCQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8L3hzZDpjb21wbGV4VHlwZT4KLQkJCTwveHNkOmVsZW1lbnQ+CQkJCi0JCQkKLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJ0aHJvd0V4Y2VwdGlvblJlc3BvbnNlIj4KLQkJCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9InJlc3BvbnNlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotCQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8L3hzZDpjb21wbGV4VHlwZT4KLQkJCTwveHNkOmVsZW1lbnQ+Ci0KLQkJPC94c2Q6c2NoZW1hPgotCTwvd3NkbDp0eXBlcz4KLQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0icGluZ1JlcXVlc3QiPgotCQk8d3NkbDpwYXJ0IG5hbWU9InJlcXVlc3QiIGVsZW1lbnQ9InRuczpwaW5nIiAvPgotCTwvd3NkbDptZXNzYWdlPgotCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJwaW5nUmVzcG9uc2UiPgotCQk8d3NkbDpwYXJ0IG5hbWU9InJlc3BvbnNlIiBlbGVtZW50PSJ0bnM6cGluZ1Jlc3BvbnNlIiAvPgotCTwvd3NkbDptZXNzYWdlPgotCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJ0aHJvd0V4Y2VwdGlvblJlcXVlc3QiPgotCQk8d3NkbDpwYXJ0IG5hbWU9InJlcXVlc3QiIGVsZW1lbnQ9InRuczp0aHJvd0V4Y2VwdGlvbiIgLz4KLQk8L3dzZGw6bWVzc2FnZT4KLQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0idGhyb3dFeGNlcHRpb25SZXNwb25zZSI+Ci0JCTx3c2RsOnBhcnQgbmFtZT0icmVzcG9uc2UiIGVsZW1lbnQ9InRuczp0aHJvd0V4Y2VwdGlvblJlc3BvbnNlIiAvPgotCTwvd3NkbDptZXNzYWdlPgotCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJ0aHJvd0V4Y2VwdGlvbkZhdWx0Ij4KLQkJPHdzZGw6cGFydCBuYW1lPSJmYXVsdCIgZWxlbWVudD0idG5zOnRocm93RXhjZXB0aW9uRmF1bHRCZWFuIiAvPgotCTwvd3NkbDptZXNzYWdlPgotCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJzbGVlcFJlcXVlc3QiPgotCQk8d3NkbDpwYXJ0IG5hbWU9InJlcXVlc3QiIGVsZW1lbnQ9InRuczpzbGVlcCIgLz4KLQk8L3dzZGw6bWVzc2FnZT4KLQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0ic2xlZXBSZXNwb25zZSI+Ci0JCTx3c2RsOnBhcnQgbmFtZT0icmVzcG9uc2UiIGVsZW1lbnQ9InRuczpzbGVlcFJlc3BvbnNlIiAvPgotCTwvd3NkbDptZXNzYWdlPgotCQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0id2FrZVVwUmVxdWVzdCI+Ci0JCTx3c2RsOnBhcnQgbmFtZT0icmVzcG9uc2UiIGVsZW1lbnQ9InRuczp3YWtlVXAiIC8+CQotCTwvd3NkbDptZXNzYWdlPgotCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJ3YWtlVXBSZXNwb25zZSI+Ci0JCTx3c2RsOnBhcnQgbmFtZT0icmVzcG9uc2UiIGVsZW1lbnQ9InRuczp3YWtlVXBSZXNwb25zZSIgLz4JCi0JPC93c2RsOm1lc3NhZ2U+CQotCQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0iaXNBc2xlZXBSZXF1ZXN0Ij4KLQk8d3NkbDpwYXJ0IG5hbWU9InJlc3BvbnNlIiBlbGVtZW50PSJ0bnM6aXNBc2xlZXAiIC8+Ci0JPC93c2RsOm1lc3NhZ2U+Ci0KLQk8d3NkbDptZXNzYWdlIG5hbWU9ImlzQXNsZWVwUmVzcG9uc2UiPgotCQk8d3NkbDpwYXJ0IG5hbWU9InJlc3BvbnNlIiBlbGVtZW50PSJ0bnM6aXNBc2xlZXBSZXNwb25zZSIgLz4JCi0JPC93c2RsOm1lc3NhZ2U+CQkKLQkKLQk8d3NkbDptZXNzYWdlIG5hbWU9Imludm9rZUFzeW5jUmVxdWVzdCI+Ci0JCTx3c2RsOnBhcnQgbmFtZT0icmVxdWVzdCIgZWxlbWVudD0idG5zOmludm9rZUFzeW5jIiAvPgotCTwvd3NkbDptZXNzYWdlPgotCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJpbnZva2VBc3luY1Jlc3BvbnNlIj4KLQkJPHdzZGw6cGFydCBuYW1lPSJyZXNwb25zZSIgZWxlbWVudD0idG5zOmludm9rZUFzeW5jUmVzcG9uc2UiIC8+Ci0JPC93c2RsOm1lc3NhZ2U+CQotCQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0iY3VzdG9tQXN5bmNSZXF1ZXN0Ij4KLQkJPHdzZGw6cGFydCBuYW1lPSJyZXF1ZXN0IiBlbGVtZW50PSJ0bnM6Y3VzdG9tQXN5bmMiIC8+Ci0JPC93c2RsOm1lc3NhZ2U+Ci0KLQk8d3NkbDptZXNzYWdlIG5hbWU9ImN1c3RvbUFzeW5jUmVzcG9uc2UiPgotCQk8d3NkbDpwYXJ0IG5hbWU9InJlc3BvbnNlIiBlbGVtZW50PSJ0bnM6Y3VzdG9tQXN5bmNSZXNwb25zZSIgLz4KLQk8L3dzZGw6bWVzc2FnZT4JCQotCQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0iYW5vdGhlclJlcXVlc3QiPgotCQk8d3NkbDpwYXJ0IG5hbWU9InJlcXVlc3QiIGVsZW1lbnQ9InRuczphbm90aGVyIiAvPgotCTwvd3NkbDptZXNzYWdlPgotCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJhbm90aGVyUmVzcG9uc2UiPgotCQk8d3NkbDpwYXJ0IG5hbWU9InJlc3BvbnNlIiBlbGVtZW50PSJ0bnM6YW5vdGhlclJlc3BvbnNlIiAvPgotCTwvd3NkbDptZXNzYWdlPgkJCi0JCi0JPHdzZGw6cG9ydFR5cGUgbmFtZT0iQXN5bmNQb3J0Ij4KLQkJCi0JCTwhLS0gc2ltcGxlIHBpbmcgb3BlcmF0aW9uIHRoYXQgd2lsbCBiZSB1c2VkIGZvciBEb2NMaXRXcmFwcGVkIGFzeW5jIHRlc3QtLT4KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9InBpbmciPgotCQkJPHdzZGw6aW5wdXQgIG1lc3NhZ2U9InRuczpwaW5nUmVxdWVzdCIgLz4KLQkJCTx3c2RsOm91dHB1dCBtZXNzYWdlPSJ0bnM6cGluZ1Jlc3BvbnNlIiAvPgotCQk8L3dzZGw6b3BlcmF0aW9uPgkJCi0JCQotCQk8IS0tIHJlcXVlc3QgZm9yIHRoZSBzZXJ2ZXIgdG8gZ290byBzbGVlcCB1bnRpbCByZWxlYXNlIGlzIGNhbGxlZC0tPgotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0ic2xlZXAiPgotCQkJPHdzZGw6aW5wdXQgIG1lc3NhZ2U9InRuczpzbGVlcFJlcXVlc3QiIC8+Ci0JCQk8d3NkbDpvdXRwdXQgbWVzc2FnZT0idG5zOnNsZWVwUmVzcG9uc2UiIC8+Ci0JCTwvd3NkbDpvcGVyYXRpb24+Ci0JCQotCQk8IS0tIGNoZWNrIHRvIHNlZSBpZiB0aGUgc2xlZXAgb3BlcmF0aW9uIGhhcyBiZWVuIGNhbGxlZCB5ZXQgLS0+Ci0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJpc0FzbGVlcCI+Ci0JCQk8d3NkbDppbnB1dCAgbWVzc2FnZT0idG5zOmlzQXNsZWVwUmVxdWVzdCIgLz4KLQkJCTx3c2RsOm91dHB1dCBtZXNzYWdlPSJ0bnM6aXNBc2xlZXBSZXNwb25zZSIgLz4KLQkJPC93c2RsOm9wZXJhdGlvbj4JCQkKLQkJCi0JCTwhLS0gZm9yY2UgdGhlIHNsZWVwIG9wZXJhdGlvbiB0byBzdG9wIHNsZWVwaW5nIC0tPgotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0id2FrZVVwIj4KLQkJCTx3c2RsOmlucHV0ICBtZXNzYWdlPSJ0bnM6d2FrZVVwUmVxdWVzdCIgLz4KLQkJCTx3c2RsOm91dHB1dCBtZXNzYWdlPSJ0bnM6d2FrZVVwUmVzcG9uc2UiIC8+Ci0JCTwvd3NkbDpvcGVyYXRpb24+CQkKLQkJCQotCQkJCi0JCQkKLQkJPCEtLSBTZWNvbmQgc3VpdGUgb2YgdGVzdHMgZm9yIEFzeW5jIG9wZXJhdGlvbiBuYW1pbmc6Ci0JCQkgd2lsbCB0ZXN0IGZvciBob3cgdGhlIGltcGxlbWVudGF0aW9uIHJlc3BvbmRzIHRvCi0JCSAgICAgbWV0aG9kcyBlbmRpbmcgaW4gQXN5bmMgd2l0aCBhc3luYyBiaW5kaW5nIGVuYWJsZWQKLQkJIC0tPgotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iaW52b2tlQXN5bmMiPgotCQkJPHdzZGw6aW5wdXQgIG1lc3NhZ2U9InRuczppbnZva2VBc3luY1JlcXVlc3QiIC8+Ci0JCQk8d3NkbDpvdXRwdXQgbWVzc2FnZT0idG5zOmludm9rZUFzeW5jUmVzcG9uc2UiIC8+Ci0JCTwvd3NkbDpvcGVyYXRpb24+CQkJCi0JCQkKLQkJPCEtLSB3aWxsIHRlc3QgZm9yIGhvdyB0aGUgaW1wbGVtZW50YXRpb24gcmVzcG9uZHMgdG8KLQkJICAgICBtZXRob2RzIGVuZGluZyBpbiBhc3luYyB3aXRoIGFzeW5jIGJpbmRpbmcgZW5hYmxlZAotCQkgLS0+CQkJCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJjdXN0b21Bc3luYyI+Ci0JCQk8d3NkbDppbnB1dCAgbWVzc2FnZT0idG5zOmN1c3RvbUFzeW5jUmVxdWVzdCIgLz4KLQkJCTx3c2RsOm91dHB1dCBtZXNzYWdlPSJ0bnM6Y3VzdG9tQXN5bmNSZXNwb25zZSIgLz4KLQkJPC93c2RsOm9wZXJhdGlvbj4KLQkJCi0JCTwhLS0gd2Ugd2lsbCBtYXAgdGhpcyBvcGVyYXRpb24gdG8gYSBqYXZhIG1ldGhvZCBlbmRpbmcgaW4gQXN5bmMKLQkJIC0tPgkJCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJhbm90aGVyIj4KLQkJCTx3c2RsOmlucHV0ICBtZXNzYWdlPSJ0bnM6YW5vdGhlclJlcXVlc3QiIC8+Ci0JCQk8d3NkbDpvdXRwdXQgbWVzc2FnZT0idG5zOmFub3RoZXJSZXNwb25zZSIgLz4KLQkJPC93c2RsOm9wZXJhdGlvbj4KLQkJCi0JCTwhLS0gdGVzdCBmb3IgdmFyaW9zIGV4Y2VwdGlvbnMsIHRvIHRlc3QgZXhjZXB0aW9uIGhhbmRsaW5nIHdpdGggYXN5bmNNRVAKLQkJCSBlbmFibGVkCi0JCSAtLT4JCQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0idGhyb3dFeGNlcHRpb24iPgotCQkJPHdzZGw6aW5wdXQgIG1lc3NhZ2U9InRuczp0aHJvd0V4Y2VwdGlvblJlcXVlc3QiIC8+Ci0JCQk8d3NkbDpvdXRwdXQgbWVzc2FnZT0idG5zOnRocm93RXhjZXB0aW9uUmVzcG9uc2UiIC8+Ci0JCQk8d3NkbDpmYXVsdCBuYW1lPSJ0aHJvd0V4Y2VwdGlvbkZhdWx0IiBtZXNzYWdlPSJ0bnM6dGhyb3dFeGNlcHRpb25GYXVsdCIgLz4JCQkKLQkJPC93c2RsOm9wZXJhdGlvbj4JCQkKLQkJCQotCTwvd3NkbDpwb3J0VHlwZT4KLQkKLQk8d3NkbDpiaW5kaW5nIG5hbWU9IkFzeW5jIiB0eXBlPSJ0bnM6QXN5bmNQb3J0Ij4KLQkJPHNvYXA6YmluZGluZyBzdHlsZT0iZG9jdW1lbnQiIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIiAvPgotCQkKLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9InBpbmciPgotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly9vcmcvdGVzdC9hc3luY2RvY2xpdC9waW5nIiAvPgotCQkJPHdzZGw6aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiICAvPgotCQkJPC93c2RsOmlucHV0PgotCQkJPHdzZGw6b3V0cHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAgLz4KLQkJCTwvd3NkbDpvdXRwdXQ+Ci0JCTwvd3NkbDpvcGVyYXRpb24+CQkKLQkJCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJzbGVlcCI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL29yZy90ZXN0L2FzeW5jZG9jbGl0L3NsZWVwIiAvPgotCQkJPHdzZGw6aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiICAvPgotCQkJPC93c2RsOmlucHV0PgotCQkJPHdzZGw6b3V0cHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAgLz4KLQkJCTwvd3NkbDpvdXRwdXQ+Ci0JCTwvd3NkbDpvcGVyYXRpb24+Ci0JCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJpc0FzbGVlcCI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL29yZy90ZXN0L2FzeW5jZG9jbGl0L2lzQXNsZWVwIiAvPgotCQkJPHdzZGw6aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiICAvPgotCQkJPC93c2RsOmlucHV0PgotCQkJPHdzZGw6b3V0cHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAgLz4KLQkJCTwvd3NkbDpvdXRwdXQ+Ci0JCTwvd3NkbDpvcGVyYXRpb24+CQotCQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0id2FrZVVwIj4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vb3JnL3Rlc3QvYXN5bmNkb2NsaXQvd2FrZVVwIiAvPgotCQkJPHdzZGw6aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiICAvPgotCQkJPC93c2RsOmlucHV0PgotCQkJPHdzZGw6b3V0cHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAgLz4KLQkJCTwvd3NkbDpvdXRwdXQ+Ci0JCTwvd3NkbDpvcGVyYXRpb24+Ci0JCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJpbnZva2VBc3luYyI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL29yZy90ZXN0L2FzeW5jZG9jbGl0L2ludm9rZUFzeW5jIiAvPgotCQkJPHdzZGw6aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiICAvPgotCQkJPC93c2RsOmlucHV0PgotCQkJPHdzZGw6b3V0cHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAgLz4KLQkJCTwvd3NkbDpvdXRwdXQ+Ci0JCTwvd3NkbDpvcGVyYXRpb24+CQkKLQkKLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImN1c3RvbUFzeW5jIj4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vb3JnL3Rlc3QvYXN5bmNkb2NsaXQvY3VzdG9tQXN5bmMiIC8+Ci0JCQk8d3NkbDppbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgIC8+Ci0JCQk8L3dzZGw6aW5wdXQ+Ci0JCQk8d3NkbDpvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiICAvPgotCQkJPC93c2RsOm91dHB1dD4KLQkJPC93c2RsOm9wZXJhdGlvbj4JCQotCQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iYW5vdGhlciI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL29yZy90ZXN0L2FzeW5jZG9jbGl0L2Fub3RoZXIiIC8+Ci0JCQk8d3NkbDppbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgIC8+Ci0JCQk8L3dzZGw6aW5wdXQ+Ci0JCQk8d3NkbDpvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiICAvPgotCQkJPC93c2RsOm91dHB1dD4KLQkJPC93c2RsOm9wZXJhdGlvbj4KLQkJCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJ0aHJvd0V4Y2VwdGlvbiI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL29yZy90ZXN0L2FzeW5jZG9jbGl0L3Rocm93RXhjZXB0aW9uIiAvPgotCQkJPHdzZGw6aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiICAvPgotCQkJPC93c2RsOmlucHV0PgotCQkJPHdzZGw6b3V0cHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAgLz4KLQkJCTwvd3NkbDpvdXRwdXQ+Ci0JCQk8d3NkbDpmYXVsdCBuYW1lPSJ0aHJvd0V4Y2VwdGlvbkZhdWx0Ij4KLQkJCQk8c29hcDpmYXVsdCB1c2U9ImxpdGVyYWwiIG5hbWU9InRocm93RXhjZXB0aW9uRmF1bHQiIC8+Ci0JCQk8L3dzZGw6ZmF1bHQ+CQkJCQotCQk8L3dzZGw6b3BlcmF0aW9uPgkJCQotCQotCTwvd3NkbDpiaW5kaW5nPgotCQotCTx3c2RsOnNlcnZpY2UgbmFtZT0iQXN5bmNTZXJ2aWNlIj4KLQkJPHdzZGw6cG9ydCBiaW5kaW5nPSJ0bnM6QXN5bmMiIG5hbWU9IkFzeW5jUG9ydCI+Ci0JCQk8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjkwODAvamF4d3MuYXN5bmNkb2NsaXQvc2VydmljZXMvQXN5bmNEb2NMaXRXcmFwcGVkU2VydmljZSIgLz4KLQkJPC93c2RsOnBvcnQ+Ci0JPC93c2RsOnNlcnZpY2U+Ci0JCi08L3dzZGw6ZGVmaW5pdGlvbnM+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy93c2RsL2RvY2xpdF9ub253cmFwLndzZGwgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy93c2RsL2RvY2xpdF9ub253cmFwLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxZWM4OTAuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9kb2NsaXRfbm9ud3JhcC53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsMjE1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotDQotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPHdzZGw6ZGVmaW5pdGlvbnMgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iDQotCXhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iDQotCXhtbG5zOnRucz0iaHR0cDovL25vbndyYXAuc2FtcGxlLnRlc3Qub3JnIg0KLQl4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJwcm94eSINCi0JdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vbm9ud3JhcC5zYW1wbGUudGVzdC5vcmciPg0KLQkNCi0JPHdzZGw6dHlwZXM+DQotCQk8eHNkOnNjaGVtYQ0KLQkJCXRhcmdldE5hbWVzcGFjZT0iaHR0cDovL25vbndyYXAuc2FtcGxlLnRlc3Qub3JnIg0KLQkJCXhtbG5zOnRucz0iaHR0cDovL25vbndyYXAuc2FtcGxlLnRlc3Qub3JnIg0KLQkJCXhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPg0KLQ0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJNeUZhdWx0IiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPg0KLQkJCQ0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJvbmVXYXlWb2lkIj4NCi0JCQkJPHhzZDpjb21wbGV4VHlwZT4NCi0JCQkJCTx4c2Q6c2VxdWVuY2UvPg0KLQkJCQk8L3hzZDpjb21wbGV4VHlwZT4NCi0JCQk8L3hzZDplbGVtZW50PgkJCQkNCi0JCQkNCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0ib25lV2F5Ij4NCi0JCQkJPHhzZDpjb21wbGV4VHlwZT4NCi0JCQkJCTx4c2Q6c2VxdWVuY2U+DQotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Im9uZXdheV9zdHIiIHR5cGU9InhzZDpzdHJpbmciIC8+DQotCQkJCQk8L3hzZDpzZXF1ZW5jZT4NCi0JCQkJPC94c2Q6Y29tcGxleFR5cGU+DQotCQkJPC94c2Q6ZWxlbWVudD4JCQkJDQotCQkJDQotCQkJPHhzZDplbGVtZW50IG5hbWU9InR3b1dheUhvbGRlciI+DQotCQkJCTx4c2Q6Y29tcGxleFR5cGU+DQotCQkJCQk8eHNkOnNlcXVlbmNlPg0KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJ0d29XYXlIb2xkZXJfc3RyIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPg0KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJ0d29XYXlIb2xkZXJfaW50IiB0eXBlPSJ4c2Q6aW50IiAvPgkJCQkJCQ0KLQkJCQkJPC94c2Q6c2VxdWVuY2U+DQotCQkJCTwveHNkOmNvbXBsZXhUeXBlPg0KLQkJCTwveHNkOmVsZW1lbnQ+DQotCQkJDQotCQkJPHhzZDplbGVtZW50IG5hbWU9InR3b1dheSI+DQotCQkJCTx4c2Q6Y29tcGxleFR5cGU+DQotCQkJCQk8eHNkOnNlcXVlbmNlPg0KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJ0d293YXlfc3RyIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPg0KLQkJCQkJPC94c2Q6c2VxdWVuY2U+DQotCQkJCTwveHNkOmNvbXBsZXhUeXBlPg0KLQkJCTwveHNkOmVsZW1lbnQ+CQkJDQotCQkJDQotCQkJPHhzZDplbGVtZW50IG5hbWU9IlJldHVyblR5cGUiPg0KLQkJCQk8eHNkOmNvbXBsZXhUeXBlPg0KLQkJCQkJPHhzZDpzZXF1ZW5jZT4NCi0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0icmV0dXJuX3N0ciIgdHlwZT0ieHNkOnN0cmluZyIgLz4NCi0JCQkJCTwveHNkOnNlcXVlbmNlPg0KLQkJCQk8L3hzZDpjb21wbGV4VHlwZT4NCi0JCQk8L3hzZDplbGVtZW50PgkJCQkNCi0NCi0JCQk8IS0tIGZpbiBvcCBkZWZpbml0aW9uIC0tPg0KLQkJCQ0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJmaW5PcCI+DQotCQkJCTx4c2Q6Y29tcGxleFR5cGU+DQotCQkJCQk8eHNkOnNlcXVlbmNlPg0KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJvcCIgdHlwZT0idG5zOkZpbmFuY2lhbE9wZXJhdGlvbiIgLz4NCi0JCQkJCTwveHNkOnNlcXVlbmNlPg0KLQkJCQk8L3hzZDpjb21wbGV4VHlwZT4NCi0JCQk8L3hzZDplbGVtZW50PgkJCQ0KLQ0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJmaW5PcFJlc3BvbnNlIj4NCi0JCQkJPHhzZDpjb21wbGV4VHlwZT4NCi0JCQkJPHhzZDpzZXF1ZW5jZT4NCi0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJyZXNwb25zZSIgdHlwZT0idG5zOkZpbmFuY2lhbE9wZXJhdGlvbiIgLz4NCi0JCQkJPC94c2Q6c2VxdWVuY2U+DQotCQkJCTwveHNkOmNvbXBsZXhUeXBlPg0KLQkJCTwveHNkOmVsZW1lbnQ+DQotDQotCQkJPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJGaW5hbmNpYWxPcGVyYXRpb24iPg0KLQkJCQk8eHNkOnNlcXVlbmNlPg0KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9ImFtb3VudCIgdHlwZT0ieHNkOmZsb2F0IiAvPg0KLQkJCQk8L3hzZDpzZXF1ZW5jZT4NCi0JCQk8L3hzZDpjb21wbGV4VHlwZT4NCi0NCi0JCQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IldpdGhkcmF3Ij4NCi0JCQkgIDx4c2Q6Y29tcGxleENvbnRlbnQ+DQotCQkJICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InRuczpGaW5hbmNpYWxPcGVyYXRpb24iPg0KLQkJCSAgICAgIDx4c2Q6c2VxdWVuY2U+DQotCQkJICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWVtbyIgdHlwZT0ieHNkOnN0cmluZyIgLz4NCi0JCQkgICAgICA8L3hzZDpzZXF1ZW5jZT4NCi0JCQkgICAgPC94c2Q6ZXh0ZW5zaW9uPg0KLQkJCSAgPC94c2Q6Y29tcGxleENvbnRlbnQ+DQotCQkJPC94c2Q6Y29tcGxleFR5cGU+DQotCQkJDQotCQkJPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJEZXBvc2l0Ij4NCi0JCQkgIDx4c2Q6Y29tcGxleENvbnRlbnQ+DQotCQkJICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InRuczpGaW5hbmNpYWxPcGVyYXRpb24iPg0KLQkJCSAgICAgIDx4c2Q6c2VxdWVuY2U+DQotCQkJICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RhdHVzIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPg0KLQkJCSAgICAgIDwveHNkOnNlcXVlbmNlPg0KLQkJCSAgICAgPC94c2Q6ZXh0ZW5zaW9uPg0KLQkJCSAgPC94c2Q6Y29tcGxleENvbnRlbnQ+DQotCQkJPC94c2Q6Y29tcGxleFR5cGU+CQ0KLQ0KLQkJPC94c2Q6c2NoZW1hPg0KLQk8L3dzZGw6dHlwZXM+DQotDQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0ib25lV2F5Vm9pZFJlcXVlc3QiPg0KLQkJPHdzZGw6cGFydCBuYW1lPSJhbGxCeU15c2VsZiIgZWxlbWVudD0idG5zOm9uZVdheVZvaWQiIC8+DQotCTwvd3NkbDptZXNzYWdlPg0KLQ0KLQk8d3NkbDptZXNzYWdlIG5hbWU9Im9uZVdheVJlcXVlc3QiPg0KLQkJPHdzZGw6cGFydCBuYW1lPSJhbGxCeU15c2VsZiIgZWxlbWVudD0idG5zOm9uZVdheSIgLz4NCi0JPC93c2RsOm1lc3NhZ2U+DQotDQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0idHdvV2F5SG9sZGVyUmVxdWVzdCI+DQotCQk8d3NkbDpwYXJ0IG5hbWU9ImFsbEJ5TXlzZWxmIiBlbGVtZW50PSJ0bnM6dHdvV2F5SG9sZGVyIiAvPg0KLQk8L3dzZGw6bWVzc2FnZT4NCi0NCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJ0d29XYXlIb2xkZXJSZXNwb25zZSI+DQotCQk8d3NkbDpwYXJ0IG5hbWU9ImFsbEJ5TXlzZWxmIiBlbGVtZW50PSJ0bnM6dHdvV2F5SG9sZGVyIiAvPg0KLQk8L3dzZGw6bWVzc2FnZT4NCi0JDQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0idHdvV2F5UmVxdWVzdCI+DQotCQk8d3NkbDpwYXJ0IG5hbWU9ImFsbEJ5TXlzZWxmIiBlbGVtZW50PSJ0bnM6dHdvV2F5IiAvPg0KLQk8L3dzZGw6bWVzc2FnZT4NCi0NCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJ0d29XYXlSZXNwb25zZSI+DQotCQk8d3NkbDpwYXJ0IG5hbWU9ImFsbEJ5TXlzZWxmIiBlbGVtZW50PSJ0bnM6UmV0dXJuVHlwZSIgLz4NCi0JPC93c2RsOm1lc3NhZ2U+CQ0KLQkNCi0JPHdzZGw6cG9ydFR5cGUgbmFtZT0iRG9jTGl0Tm9uV3JhcFBvcnRUeXBlIj4NCi0NCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJvbmVXYXlWb2lkIj4NCi0JCQk8d3NkbDppbnB1dCBtZXNzYWdlPSJ0bnM6b25lV2F5Vm9pZFJlcXVlc3QiIC8+DQotCQk8L3dzZGw6b3BlcmF0aW9uPg0KLQ0KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9Im9uZVdheSI+DQotCQkJPHdzZGw6aW5wdXQgbWVzc2FnZT0idG5zOm9uZVdheVJlcXVlc3QiIC8+DQotCQk8L3dzZGw6b3BlcmF0aW9uPg0KLQkJDQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0idHdvV2F5SG9sZGVyIj4NCi0JCQk8d3NkbDppbnB1dCBtZXNzYWdlPSJ0bnM6dHdvV2F5SG9sZGVyUmVxdWVzdCIgLz4NCi0JCQk8d3NkbDpvdXRwdXQgbWVzc2FnZT0idG5zOnR3b1dheUhvbGRlclJlc3BvbnNlIiAvPg0KLQkJPC93c2RsOm9wZXJhdGlvbj4NCi0JCQ0KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9InR3b1dheSI+DQotCQkJPHdzZGw6aW5wdXQgbWVzc2FnZT0idG5zOnR3b1dheVJlcXVlc3QiIC8+DQotCQkJPHdzZGw6b3V0cHV0IG1lc3NhZ2U9InRuczp0d29XYXlSZXNwb25zZSIgLz4NCi0JCTwvd3NkbDpvcGVyYXRpb24+CQkNCi0JCQkNCi0JPC93c2RsOnBvcnRUeXBlPg0KLQkNCi0JPHdzZGw6YmluZGluZyBuYW1lPSJEb2NMaXROb25XcmFwIiB0eXBlPSJ0bnM6RG9jTGl0Tm9uV3JhcFBvcnRUeXBlIj4NCi0JCTxzb2FwOmJpbmRpbmcgc3R5bGU9ImRvY3VtZW50IiB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIgLz4NCi0NCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJvbmVXYXlWb2lkIj4NCi0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL25vbndyYXAuc2FtcGxlLnRlc3Qub3JnL29uZVdheVZvaWQiIC8+DQotCQkJPHdzZGw6aW5wdXQ+DQotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAgLz4NCi0JCQk8L3dzZGw6aW5wdXQ+DQotCQk8L3dzZGw6b3BlcmF0aW9uPg0KLQ0KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9Im9uZVdheSI+DQotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly9ub253cmFwLnNhbXBsZS50ZXN0Lm9yZy9vbmVXYXkiIC8+DQotCQkJPHdzZGw6aW5wdXQ+DQotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAgLz4NCi0JCQk8L3dzZGw6aW5wdXQ+DQotCQk8L3dzZGw6b3BlcmF0aW9uPg0KLQkJDQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0idHdvV2F5SG9sZGVyIj4NCi0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL25vbndyYXAuc2FtcGxlLnRlc3Qub3JnL3R3b1dheUhvbGRlciIgLz4NCi0JCQk8d3NkbDppbnB1dD4NCi0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiICAvPg0KLQkJCTwvd3NkbDppbnB1dD4NCi0JCQk8d3NkbDpvdXRwdXQ+DQotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAgLz4NCi0JCQk8L3dzZGw6b3V0cHV0Pg0KLQkNCi0JCTwvd3NkbDpvcGVyYXRpb24+DQotCQkNCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJ0d29XYXkiPg0KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vbm9ud3JhcC5zYW1wbGUudGVzdC5vcmcvdHdvV2F5IiAvPg0KLQkJCTx3c2RsOmlucHV0Pg0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgIC8+DQotCQkJPC93c2RsOmlucHV0Pg0KLQkJCTx3c2RsOm91dHB1dD4NCi0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiICAvPg0KLQkJCTwvd3NkbDpvdXRwdXQ+DQotCQ0KLQkJPC93c2RsOm9wZXJhdGlvbj4JCQ0KLQkNCi0JPC93c2RsOmJpbmRpbmc+DQotCQ0KLQk8d3NkbDpzZXJ2aWNlIG5hbWU9IkRvY0xpdE5vbldyYXBTZXJ2aWNlIj4NCi0JCTx3c2RsOnBvcnQgYmluZGluZz0idG5zOkRvY0xpdE5vbldyYXAiIG5hbWU9IlByb3h5RG9jTGl0V3JhcHBlZFBvcnQiPg0KLQkJCTxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6NjA2MC9heGlzMi9zZXJ2aWNlcy9Eb2NMaXROb25XcmFwU2VydmljZSIgLz4NCi0JCTwvd3NkbDpwb3J0Pg0KLQk8L3dzZGw6c2VydmljZT4NCi0JDQotPC93c2RsOmRlZmluaXRpb25zPg0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3dzZGwvZG9jbGl0YmFyZS53c2RsIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9kb2NsaXRiYXJlLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzNGJiMzIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9kb2NsaXRiYXJlLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSwxOTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi0NCi08IS0tDQotICB+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+DQotCQ0KLTwvd3NkbDpkZWZpbml0aW9ucz4NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy93c2RsL2RvY2xpdGJhcmVtaW4ud3NkbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3dzZGwvZG9jbGl0YmFyZW1pbi53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZmFjY2E5Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3dzZGwvZG9jbGl0YmFyZW1pbi53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi0NCi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08d3NkbDpkZWZpbml0aW9ucyB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyINCi0JeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyINCi0JeG1sbnM6dG5zPSJodHRwOi8vZG9jbGl0YmFyZW1pbi5zYW1wbGUudGVzdC5vcmciDQotCXhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9IkRvY2xpdEJhcmVNaW4iDQotCXRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2RvY2xpdGJhcmVtaW4uc2FtcGxlLnRlc3Qub3JnIj4NCi0JDQotCTx3c2RsOnR5cGVzPg0KLQkJPHhzZDpzY2hlbWENCi0JCQl0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9kb2NsaXRiYXJlbWluLnNhbXBsZS50ZXN0Lm9yZyINCi0JCQl4bWxuczp0bnM9Imh0dHA6Ly9kb2NsaXRiYXJlbWluLnNhbXBsZS50ZXN0Lm9yZyINCi0JCQl4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4NCi0JCQ0KLQkJPHhzZDplbGVtZW50IG5hbWU9IlN0cmluZyIgdHlwZT0ieHNkOnN0cmluZyIgLz4NCi0NCi0JCTwveHNkOnNjaGVtYT4NCi0JPC93c2RsOnR5cGVzPg0KLQ0KLQk8d3NkbDptZXNzYWdlIG5hbWU9IlNpbmdsZVBhcmFtIj4NCi0JCTx3c2RsOnBhcnQgbmFtZT0iYWxsQnlNeXNlbGYiIGVsZW1lbnQ9InRuczpTdHJpbmciIC8+DQotCTwvd3NkbDptZXNzYWdlPg0KLQ0KLQk8d3NkbDpwb3J0VHlwZSBuYW1lPSJEb2NMaXRCYXJlTWluUG9ydFR5cGUiPg0KLQkJDQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iZWNobyI+DQotCQkJPHdzZGw6aW5wdXQgbWVzc2FnZT0idG5zOlNpbmdsZVBhcmFtIiAvPg0KLQkJCTx3c2RsOm91dHB1dCBtZXNzYWdlPSJ0bnM6U2luZ2xlUGFyYW0iIC8+DQotCQk8L3dzZGw6b3BlcmF0aW9uPg0KLQkJCQ0KLQk8L3dzZGw6cG9ydFR5cGU+DQotCQ0KLQk8d3NkbDpiaW5kaW5nIG5hbWU9IkRvY0xpdEJhcmVNaW4iIHR5cGU9InRuczpEb2NMaXRCYXJlTWluUG9ydFR5cGUiPg0KLQkJPHNvYXA6YmluZGluZyBzdHlsZT0iZG9jdW1lbnQiIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIiAvPg0KLQkJDQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iZWNobyI+DQotCQkJPHdzZGw6aW5wdXQ+DQotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAgLz4NCi0JCQk8L3dzZGw6aW5wdXQ+DQotCQkJPHdzZGw6b3V0cHV0Pg0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgIC8+DQotCQkJPC93c2RsOm91dHB1dD4NCi0JCTwvd3NkbDpvcGVyYXRpb24+CQ0KLQkJDQotCQ0KLQk8L3dzZGw6YmluZGluZz4NCi0JDQotCTx3c2RsOnNlcnZpY2UgbmFtZT0iQmFyZURvY0xpdE1pblNlcnZpY2UiPg0KLQkJPHdzZGw6cG9ydCBiaW5kaW5nPSJ0bnM6RG9jTGl0QmFyZU1pbiIgbmFtZT0iQmFyZURvY0xpdE1pblBvcnQiPg0KLQkJCTxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6NjA2MC9heGlzMi9zZXJ2aWNlcy9CYXJlRG9jTGl0TWluU2VydmljZSIgLz4NCi0JCTwvd3NkbDpwb3J0Pg0KLQk8L3dzZGw6c2VydmljZT4NCi0JDQotPC93c2RsOmRlZmluaXRpb25zPg0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3dzZGwvZG9jbGl0d3JhcC53c2RsIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9kb2NsaXR3cmFwLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzMGExOGQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9kb2NsaXR3cmFwLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSw0NDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi0NCi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08d3NkbDpkZWZpbml0aW9ucyB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyINCi0JeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyINCi0JeG1sbnM6dG5zPSJodHRwOi8vd3JhcC5zYW1wbGUudGVzdC5vcmciDQotCXhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9IndyYXBqYXZhYmVhbnRlc3QiDQotCXRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3dyYXAuc2FtcGxlLnRlc3Qub3JnIj4NCi0NCi0JPHdzZGw6dHlwZXM+DQotCQk8eHNkOnNjaGVtYQ0KLQkJCXRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3dyYXAuc2FtcGxlLnRlc3Qub3JnIg0KLQkJCXhtbG5zOnRucz0iaHR0cDovL3dyYXAuc2FtcGxlLnRlc3Qub3JnIg0KLQkJCXhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPg0KLQ0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJNeUZhdWx0IiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPg0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJoZWFkZXJWYWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4NCi0NCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0ib25lV2F5Vm9pZCI+DQotCQkJCTx4c2Q6Y29tcGxleFR5cGU+DQotCQkJCQk8eHNkOnNlcXVlbmNlIC8+DQotCQkJCTwveHNkOmNvbXBsZXhUeXBlPg0KLQkJCTwveHNkOmVsZW1lbnQ+DQotDQotCQkJPHhzZDplbGVtZW50IG5hbWU9Im9uZVdheSI+DQotCQkJCTx4c2Q6Y29tcGxleFR5cGU+DQotCQkJCQk8eHNkOnNlcXVlbmNlPg0KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJvbmV3YXlfc3RyIg0KLQkJCQkJCQl0eXBlPSJ4c2Q6c3RyaW5nIiAvPg0KLQkJCQkJPC94c2Q6c2VxdWVuY2U+DQotCQkJCTwveHNkOmNvbXBsZXhUeXBlPg0KLQkJCTwveHNkOmVsZW1lbnQ+DQotDQotCQkJPHhzZDplbGVtZW50IG5hbWU9InR3b1dheUhvbGRlciI+DQotCQkJCTx4c2Q6Y29tcGxleFR5cGU+DQotCQkJCQk8eHNkOnNlcXVlbmNlPg0KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJ0d29XYXlIb2xkZXJfc3RyIg0KLQkJCQkJCQl0eXBlPSJ4c2Q6c3RyaW5nIiAvPg0KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJ0d29XYXlIb2xkZXJfaW50Ig0KLQkJCQkJCQl0eXBlPSJ4c2Q6aW50IiAvPg0KLQkJCQkJPC94c2Q6c2VxdWVuY2U+DQotCQkJCTwveHNkOmNvbXBsZXhUeXBlPg0KLQkJCTwveHNkOmVsZW1lbnQ+DQotDQotCQkJPHhzZDplbGVtZW50IG5hbWU9InR3b1dheSI+DQotCQkJCTx4c2Q6Y29tcGxleFR5cGU+DQotCQkJCQk8eHNkOnNlcXVlbmNlPg0KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJ0d293YXlfc3RyIg0KLQkJCQkJCQl0eXBlPSJ4c2Q6c3RyaW5nIiAvPg0KLQkJCQkJPC94c2Q6c2VxdWVuY2U+DQotCQkJCTwveHNkOmNvbXBsZXhUeXBlPg0KLQkJCTwveHNkOmVsZW1lbnQ+DQotCQkJDQotCQkJPHhzZDplbGVtZW50IG5hbWU9IlJldHVyblR5cGUiPg0KLQkJCQk8eHNkOmNvbXBsZXhUeXBlPg0KLQkJCQkJPHhzZDpzZXF1ZW5jZT4NCi0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0icmV0dXJuX3N0ciINCi0JCQkJCQkJdHlwZT0ieHNkOnN0cmluZyIgLz4NCi0JCQkJCTwveHNkOnNlcXVlbmNlPg0KLQkJCQk8L3hzZDpjb21wbGV4VHlwZT4NCi0JCQk8L3hzZDplbGVtZW50Pg0KLQ0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJpbnZva2UiPg0KLQkJCQk8eHNkOmNvbXBsZXhUeXBlPg0KLQkJCQkJPHhzZDpzZXF1ZW5jZT4NCi0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iaW52b2tlX3N0ciINCi0JCQkJCQkJdHlwZT0ieHNkOnN0cmluZyIgLz4NCi0JCQkJCTwveHNkOnNlcXVlbmNlPg0KLQkJCQk8L3hzZDpjb21wbGV4VHlwZT4NCi0JCQk8L3hzZDplbGVtZW50Pg0KLQ0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJpbnZva2VSZXR1cm5UeXBlIj4NCi0JCQkJPHhzZDpjb21wbGV4VHlwZT4NCi0JCQkJCTx4c2Q6c2VxdWVuY2U+DQotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9InJldHVybl9zdHIiDQotCQkJCQkJCXR5cGU9InhzZDpzdHJpbmciIC8+DQotCQkJCQk8L3hzZDpzZXF1ZW5jZT4NCi0JCQkJPC94c2Q6Y29tcGxleFR5cGU+DQotCQkJPC94c2Q6ZWxlbWVudD4NCi0NCi0NCi0JCQkNCi0NCi0JCQk8IS0tIGZpbiBvcCBkZWZpbml0aW9uIC0tPg0KLQ0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJmaW5PcCI+DQotCQkJCTx4c2Q6Y29tcGxleFR5cGU+DQotCQkJCQk8eHNkOnNlcXVlbmNlPg0KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJvcCINCi0JCQkJCQkJdHlwZT0idG5zOkZpbmFuY2lhbE9wZXJhdGlvbiIgLz4NCi0JCQkJCTwveHNkOnNlcXVlbmNlPg0KLQkJCQk8L3hzZDpjb21wbGV4VHlwZT4NCi0JCQk8L3hzZDplbGVtZW50Pg0KLQ0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJmaW5PcFJlc3BvbnNlIj4NCi0JCQkJPHhzZDpjb21wbGV4VHlwZT4NCi0JCQkJCTx4c2Q6c2VxdWVuY2U+DQotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9InJlc3BvbnNlIg0KLQkJCQkJCQl0eXBlPSJ0bnM6RmluYW5jaWFsT3BlcmF0aW9uIiAvPg0KLQkJCQkJPC94c2Q6c2VxdWVuY2U+DQotCQkJCTwveHNkOmNvbXBsZXhUeXBlPg0KLQkJCTwveHNkOmVsZW1lbnQ+DQotDQotCQkJPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJGaW5hbmNpYWxPcGVyYXRpb24iPg0KLQkJCQk8eHNkOnNlcXVlbmNlPg0KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9ImFtb3VudCIgdHlwZT0ieHNkOmZsb2F0IiAvPg0KLQkJCQk8L3hzZDpzZXF1ZW5jZT4NCi0JCQk8L3hzZDpjb21wbGV4VHlwZT4NCi0NCi0JCQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IldpdGhkcmF3Ij4NCi0JCQkJPHhzZDpjb21wbGV4Q29udGVudD4NCi0JCQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InRuczpGaW5hbmNpYWxPcGVyYXRpb24iPg0KLQkJCQkJCTx4c2Q6c2VxdWVuY2U+DQotCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJtZW1vIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPg0KLQkJCQkJCTwveHNkOnNlcXVlbmNlPg0KLQkJCQkJPC94c2Q6ZXh0ZW5zaW9uPg0KLQkJCQk8L3hzZDpjb21wbGV4Q29udGVudD4NCi0JCQk8L3hzZDpjb21wbGV4VHlwZT4NCi0NCi0JCQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkRlcG9zaXQiPg0KLQkJCQk8eHNkOmNvbXBsZXhDb250ZW50Pg0KLQkJCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idG5zOkZpbmFuY2lhbE9wZXJhdGlvbiI+DQotCQkJCQkJPHhzZDpzZXF1ZW5jZT4NCi0JCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9InN0YXR1cyINCi0JCQkJCQkJCXR5cGU9InhzZDpzdHJpbmciIC8+DQotCQkJCQkJPC94c2Q6c2VxdWVuY2U+DQotCQkJCQk8L3hzZDpleHRlbnNpb24+DQotCQkJCTwveHNkOmNvbXBsZXhDb250ZW50Pg0KLQkJCTwveHNkOmNvbXBsZXhUeXBlPg0KLQ0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJoZWFkZXJQYXJ0MCI+DQotCQkJCTx4c2Q6Y29tcGxleFR5cGU+DQotCQkJCQk8eHNkOnNlcXVlbmNlPg0KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJoZWFkZXJUeXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPg0KLQkJCQkJPC94c2Q6c2VxdWVuY2U+DQotCQkJCTwveHNkOmNvbXBsZXhUeXBlPg0KLQkJCTwveHNkOmVsZW1lbnQ+DQotDQotCQkJPHhzZDplbGVtZW50IG5hbWU9ImhlYWRlclBhcnQxIj4NCi0JCQkJPHhzZDpjb21wbGV4VHlwZT4NCi0JCQkJCTx4c2Q6c2VxdWVuY2U+DQotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9ImhlYWRlclR5cGUiIHR5cGU9InhzZDpzdHJpbmciIC8+DQotCQkJCQk8L3hzZDpzZXF1ZW5jZT4NCi0JCQkJPC94c2Q6Y29tcGxleFR5cGU+DQotCQkJPC94c2Q6ZWxlbWVudD4NCi0NCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iaGVhZGVyIj4NCi0JCQkJPHhzZDpjb21wbGV4VHlwZT4NCi0JCQkJCTx4c2Q6c2VxdWVuY2U+DQotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9ImluIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPg0KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJvdXQiIHR5cGU9InhzZDpsb25nIiAvPg0KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJpbm91dCIgdHlwZT0ieHNkOmludGVnZXIiIC8+DQotCQkJCQk8L3hzZDpzZXF1ZW5jZT4NCi0JCQkJPC94c2Q6Y29tcGxleFR5cGU+DQotCQkJPC94c2Q6ZWxlbWVudD4NCi0NCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iaGVhZGVyUmVzcG9uc2UiPg0KLQkJCQk8eHNkOmNvbXBsZXhUeXBlPg0KLQkJCQkJPHhzZDpzZXF1ZW5jZT4NCi0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0ib3V0IiB0eXBlPSJ4c2Q6bG9uZyIgLz4NCi0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iaW5vdXQiIHR5cGU9InhzZDppbnRlZ2VyIiAvPg0KLQkJCQkJPC94c2Q6c2VxdWVuY2U+DQotCQkJCTwveHNkOmNvbXBsZXhUeXBlPg0KLQkJCTwveHNkOmVsZW1lbnQ+DQotCQkJDQotCQkJPHhzZDplbGVtZW50IG5hbWU9ImVjaG9TdHJpbmdXU0dFTjEiPg0KLQkJCQk8eHNkOmNvbXBsZXhUeXBlIC8+DQotCQkJPC94c2Q6ZWxlbWVudD4NCi0NCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iZWNob1N0cmluZ1dTR0VOMVJlc3BvbnNlIj4NCi0JCQkJPHhzZDpjb21wbGV4VHlwZT4NCi0JCQkJCTx4c2Q6c2VxdWVuY2U+DQotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9InJldHVybiIgdHlwZT0ieHNkOnN0cmluZyIgLz4NCi0JCQkJCTwveHNkOnNlcXVlbmNlPg0KLQkJCQk8L3hzZDpjb21wbGV4VHlwZT4NCi0JCQk8L3hzZDplbGVtZW50Pg0KLQkJCQ0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJlY2hvU3RyaW5nV1NHRU4yIj4NCi0JCQkgICAgPHhzZDpjb21wbGV4VHlwZT4NCi0JCQkJCTx4c2Q6c2VxdWVuY2U+DQotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9ImRhdGEiIHR5cGU9InhzZDpzdHJpbmciIC8+DQotCQkJCQk8L3hzZDpzZXF1ZW5jZT4NCi0JCQkJPC94c2Q6Y29tcGxleFR5cGU+DQotCQkJPC94c2Q6ZWxlbWVudD4NCi0NCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iZWNob1N0cmluZ1dTR0VOMlJlc3BvbnNlIj4NCi0JCQkJPHhzZDpjb21wbGV4VHlwZSAvPg0KLQkJCTwveHNkOmVsZW1lbnQ+DQotCQkJDQotCQk8L3hzZDpzY2hlbWE+DQotCTwvd3NkbDp0eXBlcz4NCi0NCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJvbmVXYXlWb2lkUmVxdWVzdCI+DQotCQk8d3NkbDpwYXJ0IG5hbWU9ImFsbEJ5TXlzZWxmIiBlbGVtZW50PSJ0bnM6b25lV2F5Vm9pZCIgLz4NCi0JPC93c2RsOm1lc3NhZ2U+DQotDQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0ib25lV2F5UmVxdWVzdCI+DQotCQk8d3NkbDpwYXJ0IG5hbWU9ImFsbEJ5TXlzZWxmIiBlbGVtZW50PSJ0bnM6b25lV2F5IiAvPg0KLQk8L3dzZGw6bWVzc2FnZT4NCi0NCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJ0d29XYXlIb2xkZXJSZXF1ZXN0Ij4NCi0JCTx3c2RsOnBhcnQgbmFtZT0iYWxsQnlNeXNlbGYiIGVsZW1lbnQ9InRuczp0d29XYXlIb2xkZXIiIC8+DQotCTwvd3NkbDptZXNzYWdlPg0KLQ0KLQk8d3NkbDptZXNzYWdlIG5hbWU9InR3b1dheUhvbGRlclJlc3BvbnNlIj4NCi0JCTx3c2RsOnBhcnQgbmFtZT0iYWxsQnlNeXNlbGYiIGVsZW1lbnQ9InRuczp0d29XYXlIb2xkZXIiIC8+DQotCTwvd3NkbDptZXNzYWdlPg0KLQ0KLQk8d3NkbDptZXNzYWdlIG5hbWU9InR3b1dheVJlcXVlc3QiPg0KLQkJPHdzZGw6cGFydCBuYW1lPSJhbGxCeU15c2VsZiIgZWxlbWVudD0idG5zOnR3b1dheSIgLz4NCi0JPC93c2RsOm1lc3NhZ2U+DQotDQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0idHdvV2F5UmVzcG9uc2UiPg0KLQkJPHdzZGw6cGFydCBuYW1lPSJhbGxCeU15c2VsZiIgZWxlbWVudD0idG5zOlJldHVyblR5cGUiIC8+DQotCTwvd3NkbDptZXNzYWdlPg0KLQ0KLQk8d3NkbDptZXNzYWdlIG5hbWU9Imludm9rZVJlcXVlc3QiPg0KLQkJPHdzZGw6cGFydCBuYW1lPSJhbGxCeU15c2VsZiIgZWxlbWVudD0idG5zOmludm9rZSIgLz4NCi0JPC93c2RsOm1lc3NhZ2U+DQotDQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0iaW52b2tlUmVzcG9uc2UiPg0KLQkJPHdzZGw6cGFydCBuYW1lPSJhbGxCeU15c2VsZiIgZWxlbWVudD0idG5zOlJldHVyblR5cGUiIC8+DQotCTwvd3NkbDptZXNzYWdlPg0KLQ0KLQk8d3NkbDptZXNzYWdlIG5hbWU9ImZpbk9wUmVxdWVzdCI+DQotCQk8d3NkbDpwYXJ0IG5hbWU9Im9wIiBlbGVtZW50PSJ0bnM6ZmluT3AiIC8+DQotCTwvd3NkbDptZXNzYWdlPg0KLQ0KLQk8d3NkbDptZXNzYWdlIG5hbWU9ImZpbk9wUmVzcG9uc2UiPg0KLQkJPHdzZGw6cGFydCBuYW1lPSJvcCIgZWxlbWVudD0idG5zOmZpbk9wUmVzcG9uc2UiIC8+DQotCTwvd3NkbDptZXNzYWdlPg0KLQ0KLQk8d3NkbDptZXNzYWdlIG5hbWU9ImhlYWRlclJlcXVlc3QiPg0KLQkJPHdzZGw6cGFydCBuYW1lPSJwYXlsb2FkIiBlbGVtZW50PSJ0bnM6aGVhZGVyIiAvPg0KLQkJPHdzZGw6cGFydCBuYW1lPSJoZWFkZXIwIiBlbGVtZW50PSJ0bnM6aGVhZGVyUGFydDAiIC8+DQotCQk8d3NkbDpwYXJ0IG5hbWU9ImhlYWRlcjEiIGVsZW1lbnQ9InRuczpoZWFkZXJQYXJ0MSIgLz4NCi0JPC93c2RsOm1lc3NhZ2U+DQotDQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0iaGVhZGVyUmVzcG9uc2UiPg0KLQkJPHdzZGw6cGFydCBuYW1lPSJwYXlsb2FkIiBlbGVtZW50PSJ0bnM6aGVhZGVyUmVzcG9uc2UiIC8+DQotCQk8d3NkbDpwYXJ0IG5hbWU9ImhlYWRlcjAiIGVsZW1lbnQ9InRuczpoZWFkZXJQYXJ0MCIgLz4NCi0JPC93c2RsOm1lc3NhZ2U+DQotCQ0KLQk8d3NkbDptZXNzYWdlIG5hbWU9ImVjaG9TdHJpbmdXU0dFTjFSZXF1ZXN0Ij4NCi0JCTx3c2RsOnBhcnQgbmFtZT0iYm9keVBhcnQiIGVsZW1lbnQ9InRuczplY2hvU3RyaW5nV1NHRU4xIiAvPg0KLQkJPHdzZGw6cGFydCBuYW1lPSJoZWFkZXJQYXJ0IiBlbGVtZW50PSJ0bnM6aGVhZGVyVmFsdWUiIC8+DQotCTwvd3NkbDptZXNzYWdlPg0KLQ0KLQk8d3NkbDptZXNzYWdlIG5hbWU9ImVjaG9TdHJpbmdXU0dFTjFSZXNwb25zZSI+DQotCQk8d3NkbDpwYXJ0IG5hbWU9ImJvZHlQYXJ0IiBlbGVtZW50PSJ0bnM6ZWNob1N0cmluZ1dTR0VOMVJlc3BvbnNlIiAvPg0KLQk8L3dzZGw6bWVzc2FnZT4NCi0JDQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0iZWNob1N0cmluZ1dTR0VOMlJlcXVlc3QiPg0KLQkJPHdzZGw6cGFydCBuYW1lPSJib2R5UGFydCIgZWxlbWVudD0idG5zOmVjaG9TdHJpbmdXU0dFTjIiIC8+DQotCTwvd3NkbDptZXNzYWdlPg0KLQ0KLQk8d3NkbDptZXNzYWdlIG5hbWU9ImVjaG9TdHJpbmdXU0dFTjJSZXNwb25zZSI+DQotCQk8d3NkbDpwYXJ0IG5hbWU9ImJvZHlQYXJ0IiBlbGVtZW50PSJ0bnM6ZWNob1N0cmluZ1dTR0VOMlJlc3BvbnNlIiAvPg0KLQkgICAgPHdzZGw6cGFydCBuYW1lPSJoZWFkZXJQYXJ0IiBlbGVtZW50PSJ0bnM6aGVhZGVyVmFsdWUiIC8+DQotCTwvd3NkbDptZXNzYWdlPg0KLQkNCi0JDQotCTx3c2RsOnBvcnRUeXBlIG5hbWU9IkRvY0xpdFdyYXAiPg0KLQ0KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9Im9uZVdheVZvaWQiPg0KLQkJCTx3c2RsOmlucHV0IG1lc3NhZ2U9InRuczpvbmVXYXlWb2lkUmVxdWVzdCIgLz4NCi0JCTwvd3NkbDpvcGVyYXRpb24+DQotDQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0ib25lV2F5Ij4NCi0JCQk8d3NkbDppbnB1dCBtZXNzYWdlPSJ0bnM6b25lV2F5UmVxdWVzdCIgLz4NCi0JCTwvd3NkbDpvcGVyYXRpb24+DQotDQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0idHdvV2F5SG9sZGVyIj4NCi0JCQk8d3NkbDppbnB1dCBtZXNzYWdlPSJ0bnM6dHdvV2F5SG9sZGVyUmVxdWVzdCIgLz4NCi0JCQk8d3NkbDpvdXRwdXQgbWVzc2FnZT0idG5zOnR3b1dheUhvbGRlclJlc3BvbnNlIiAvPg0KLQkJPC93c2RsOm9wZXJhdGlvbj4NCi0NCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJ0d29XYXkiPg0KLQkJCTx3c2RsOmlucHV0IG1lc3NhZ2U9InRuczp0d29XYXlSZXF1ZXN0IiAvPg0KLQkJCTx3c2RsOm91dHB1dCBtZXNzYWdlPSJ0bnM6dHdvV2F5UmVzcG9uc2UiIC8+DQotCQk8L3dzZGw6b3BlcmF0aW9uPg0KLQkJDQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iaGVhZGVyIj4NCi0JCQk8d3NkbDppbnB1dCBtZXNzYWdlPSJ0bnM6aGVhZGVyUmVxdWVzdCIgLz4NCi0JCQk8d3NkbDpvdXRwdXQgbWVzc2FnZT0idG5zOmhlYWRlclJlc3BvbnNlIiAvPg0KLQkJPC93c2RsOm9wZXJhdGlvbj4JCQ0KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9Imludm9rZSI+DQotCQkJPHdzZGw6aW5wdXQgbWVzc2FnZT0idG5zOmludm9rZVJlcXVlc3QiIC8+DQotCQkJPHdzZGw6b3V0cHV0IG1lc3NhZ2U9InRuczppbnZva2VSZXNwb25zZSIgLz4NCi0JCTwvd3NkbDpvcGVyYXRpb24+DQotCQkNCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJmaW5PcCI+DQotCQkJPHdzZGw6aW5wdXQgbWVzc2FnZT0idG5zOmZpbk9wUmVxdWVzdCIgLz4NCi0JCQk8d3NkbDpvdXRwdXQgbWVzc2FnZT0idG5zOmZpbk9wUmVzcG9uc2UiIC8+DQotCQk8L3dzZGw6b3BlcmF0aW9uPg0KLQkJDQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iZWNob1N0cmluZ1dTR0VOMSI+DQotCQkJPHdzZGw6aW5wdXQgbWVzc2FnZT0idG5zOmVjaG9TdHJpbmdXU0dFTjFSZXF1ZXN0IiAvPg0KLQkJCTx3c2RsOm91dHB1dCBtZXNzYWdlPSJ0bnM6ZWNob1N0cmluZ1dTR0VOMVJlc3BvbnNlIiAvPg0KLQkJPC93c2RsOm9wZXJhdGlvbj4NCi0JCQ0KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImVjaG9TdHJpbmdXU0dFTjIiPg0KLQkJCTx3c2RsOmlucHV0IG1lc3NhZ2U9InRuczplY2hvU3RyaW5nV1NHRU4yUmVxdWVzdCIgLz4NCi0JCQk8d3NkbDpvdXRwdXQgbWVzc2FnZT0idG5zOmVjaG9TdHJpbmdXU0dFTjJSZXNwb25zZSIgLz4NCi0JCTwvd3NkbDpvcGVyYXRpb24+DQotDQotCTwvd3NkbDpwb3J0VHlwZT4NCi0NCi0JPHdzZGw6YmluZGluZyBuYW1lPSJEb2NMaXRXcmFwIg0KLQkJdHlwZT0idG5zOkRvY0xpdFdyYXAiPg0KLQkJPHNvYXA6YmluZGluZyBzdHlsZT0iZG9jdW1lbnQiDQotCQkJdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiIC8+DQotDQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0ib25lV2F5Vm9pZCI+DQotCQkJPHNvYXA6b3BlcmF0aW9uDQotCQkJCXNvYXBBY3Rpb249Imh0dHA6Ly93cmFwLnNhbXBsZS50ZXN0Lm9yZy9vbmVXYXlWb2lkIiAvPg0KLQkJCTx3c2RsOmlucHV0Pg0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0JCQk8L3dzZGw6aW5wdXQ+DQotCQk8L3dzZGw6b3BlcmF0aW9uPg0KLQ0KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9Im9uZVdheSI+DQotCQkJPHNvYXA6b3BlcmF0aW9uDQotCQkJCXNvYXBBY3Rpb249Imh0dHA6Ly93cmFwLnNhbXBsZS50ZXN0Lm9yZy9vbmVXYXkiIC8+DQotCQkJPHdzZGw6aW5wdXQ+DQotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPg0KLQkJCTwvd3NkbDppbnB1dD4NCi0JCTwvd3NkbDpvcGVyYXRpb24+DQotDQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0idHdvV2F5SG9sZGVyIj4NCi0JCQk8c29hcDpvcGVyYXRpb24NCi0JCQkJc29hcEFjdGlvbj0iaHR0cDovL3dyYXAuc2FtcGxlLnRlc3Qub3JnL3R3b1dheUhvbGRlciIgLz4NCi0JCQk8d3NkbDppbnB1dD4NCi0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+DQotCQkJPC93c2RsOmlucHV0Pg0KLQkJCTx3c2RsOm91dHB1dD4NCi0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+DQotCQkJPC93c2RsOm91dHB1dD4NCi0JCTwvd3NkbDpvcGVyYXRpb24+DQotDQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iaGVhZGVyIj4NCi0JCQk8c29hcDpvcGVyYXRpb24NCi0JCQkJc29hcEFjdGlvbj0iaHR0cDovL2FkZGhlYWRlcnMuc2FtcGxlLnRlc3Qub3JnL2hlYWRlciIgLz4NCi0gICAgICAgIA0KLQkJCTx3c2RsOmlucHV0Pg0KLQkJCQk8c29hcDpoZWFkZXIgdXNlPSJsaXRlcmFsIiBtZXNzYWdlPSJ0bnM6aGVhZGVyUmVxdWVzdCIgcGFydD0iaGVhZGVyMCIvPgkJCQ0KLQkJCQk8c29hcDpoZWFkZXIgdXNlPSJsaXRlcmFsIiBtZXNzYWdlPSJ0bnM6aGVhZGVyUmVxdWVzdCIgcGFydD0iaGVhZGVyMSIvPgkJCQ0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgcGFydHM9InBheWxvYWQiLz4NCi0JCQk8L3dzZGw6aW5wdXQ+DQotCQkJPHdzZGw6b3V0cHV0Pg0KLQkJCQk8c29hcDpoZWFkZXIgdXNlPSJsaXRlcmFsIiBtZXNzYWdlPSJ0bnM6aGVhZGVyUmVzcG9uc2UiIHBhcnQ9ImhlYWRlcjAiLz4JCQkNCi0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIHBhcnRzPSJwYXlsb2FkIi8+CQkJDQotCQkJPC93c2RsOm91dHB1dD4NCi0JCTwvd3NkbDpvcGVyYXRpb24+DQotDQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0idHdvV2F5Ij4NCi0JCQk8c29hcDpvcGVyYXRpb24NCi0JCQkJc29hcEFjdGlvbj0iaHR0cDovL3dyYXAuc2FtcGxlLnRlc3Qub3JnL3R3b1dheSIgLz4NCi0JCQk8d3NkbDppbnB1dD4NCi0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+DQotCQkJPC93c2RsOmlucHV0Pg0KLQkJCTx3c2RsOm91dHB1dD4NCi0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+DQotCQkJPC93c2RsOm91dHB1dD4NCi0NCi0JCTwvd3NkbDpvcGVyYXRpb24+DQotCQkNCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJpbnZva2UiPg0KLQkJCTxzb2FwOm9wZXJhdGlvbg0KLQkJCQlzb2FwQWN0aW9uPSJodHRwOi8vd3JhcC5zYW1wbGUudGVzdC5vcmcvaW52b2tlIiAvPg0KLQkJCTx3c2RsOmlucHV0Pg0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0JCQk8L3dzZGw6aW5wdXQ+DQotCQkJPHdzZGw6b3V0cHV0Pg0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0JCQk8L3dzZGw6b3V0cHV0Pg0KLQ0KLQkJPC93c2RsOm9wZXJhdGlvbj4NCi0JCQ0KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImZpbk9wIj4NCi0JCQk8c29hcDpvcGVyYXRpb24NCi0JCQkJc29hcEFjdGlvbj0iaHR0cDovL3dyYXAuc2FtcGxlLnRlc3Qub3JnL2Zpbk9wIiAvPg0KLQkJCTx3c2RsOmlucHV0Pg0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0JCQk8L3dzZGw6aW5wdXQ+DQotCQkJPHdzZGw6b3V0cHV0Pg0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0JCQk8L3dzZGw6b3V0cHV0Pg0KLQ0KLQkJPC93c2RsOm9wZXJhdGlvbj4NCi0JCQ0KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImVjaG9TdHJpbmdXU0dFTjEiPg0KLQkJCTxzb2FwOm9wZXJhdGlvbg0KLQkJCQlzb2FwQWN0aW9uPSJodHRwOi8vYWRkaGVhZGVycy5zYW1wbGUudGVzdC5vcmcvZWNob1N0cmluZ1dTR0VOMSIgLz4NCi0gICAgICAgIA0KLQkJCTx3c2RsOmlucHV0Pg0KLQkJCQk8c29hcDpoZWFkZXIgdXNlPSJsaXRlcmFsIiBtZXNzYWdlPSJ0bnM6ZWNob1N0cmluZ1dTR0VOMVJlcXVlc3QiIHBhcnQ9ImhlYWRlclBhcnQiLz4JCQkNCi0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIG1lc3NhZ2U9InRuczplY2hvU3RyaW5nV1NHRU4xUmVxdWVzdCIgcGFydHM9ImJvZHlQYXJ0Ii8+DQotCQkJPC93c2RsOmlucHV0Pg0KLQkJCTx3c2RsOm91dHB1dD4NCi0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+DQotCQkJPC93c2RsOm91dHB1dD4NCi0JCTwvd3NkbDpvcGVyYXRpb24+DQotDQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iZWNob1N0cmluZ1dTR0VOMiI+DQotCQkJPHNvYXA6b3BlcmF0aW9uDQotCQkJCXNvYXBBY3Rpb249Imh0dHA6Ly9hZGRoZWFkZXJzLnNhbXBsZS50ZXN0Lm9yZy9lY2hvU3RyaW5nV1NHRU4yIiAvPg0KLQ0KLQkJCTx3c2RsOmlucHV0Pg0KLSAgICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+DQotCQkJPC93c2RsOmlucHV0Pg0KLQkJCTx3c2RsOm91dHB1dD4NCi0JCQkgICAgPHNvYXA6aGVhZGVyIHVzZT0ibGl0ZXJhbCIgbWVzc2FnZT0idG5zOmVjaG9TdHJpbmdXU0dFTjJSZXNwb25zZSIgcGFydD0iaGVhZGVyUGFydCIvPg0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgbWVzc2FnZT0idG5zOmVjaG9TdHJpbmdXU0dFTjJSZXNwb25zZSIgcGFydHM9ImJvZHlQYXJ0Ii8+DQotCQkJPC93c2RsOm91dHB1dD4NCi0JCTwvd3NkbDpvcGVyYXRpb24+DQotDQotCTwvd3NkbDpiaW5kaW5nPg0KLQ0KLQk8d3NkbDpzZXJ2aWNlIG5hbWU9IkRvY0xpdFdyYXBTZXJ2aWNlIj4NCi0JCTx3c2RsOnBvcnQgYmluZGluZz0idG5zOkRvY0xpdFdyYXAiDQotCQkJbmFtZT0iRG9jTGl0V3JhcFBvcnQiPg0KLQkJCTxzb2FwOmFkZHJlc3MNCi0JCQkJbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6NjA2MC9heGlzMi9zZXJ2aWNlcy9Eb2NMaXRXcmFwU2VydmljZSIgLz4NCi0JCTwvd3NkbDpwb3J0Pg0KLQk8L3dzZGw6c2VydmljZT4NCi0NCi08L3dzZGw6ZGVmaW5pdGlvbnM+DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9nb3JpbGxhX2Rsdy53c2RsIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9nb3JpbGxhX2Rsdy53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDZmNjU0Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3dzZGwvZ29yaWxsYV9kbHcud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDkwNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLQ0KLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTxkZWZpbml0aW9ucyB4bWxuczpodHRwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL2h0dHAvIg0KLSAgICB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiANCi0gICAgeG1sbnM6cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIA0KLSAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2dvcmlsbGFfZGx3IiANCi0gICAgeG1sbnM6dG5zPSJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9nb3JpbGxhX2RsdyIgDQotICAgIHhtbG5zOmRhdGE9Imh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2dvcmlsbGFfZGx3L2RhdGEiDQotICAgIHhtbG5zOmpheGI9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2pheGIiICBqYXhiOnZlcnNpb249IjIuMCINCi0gICAgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4NCi0gIDx0eXBlcz4NCi0gICAgPCEtLSBVc2UgZWxlbWVudEZvcm1EZWZhdWx0PXF1YWxpZmllZC4gIE1hbnkgdXNlcnMgdXNlIHRoaXMgc2V0dGluZyBmb3IgaW50ZXJvcCBjb21wYXRpYmlsaXR5IC0tPg0KLSAgICA8czpzY2hlbWEgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIA0KLSAgICAgICAgeG1sbnM6amF4Yj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF4YiIgIGpheGI6dmVyc2lvbj0iMi4wIg0KLSAgICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9nb3JpbGxhX2Rsdy9kYXRhIiA+DQotDQotICAgICAgPHM6aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvZ29yaWxsYV9kbHcvZGF0YTIiICAvPg0KLQ0KLSAgICAgIDxzOmVsZW1lbnQgbmFtZT0iYXNzZXJ0RmF1bHQiPg0KLSAgICAgICAgPHM6Y29tcGxleFR5cGU+DQotICAgICAgICAgICA8czpzZXF1ZW5jZT4NCi0gICAgICAgICAgICAgPHM6ZWxlbWVudCBuYW1lPSJmYXVsdERhdGEiIHR5cGU9InM6c3RyaW5nIiAvPg0KLSAgICAgICAgICAgPC9zOnNlcXVlbmNlPg0KLSAgICAgICAgPC9zOmNvbXBsZXhUeXBlPg0KLSAgICAgIDwvczplbGVtZW50Pg0KLQ0KLSAgICAgIDxzOnNpbXBsZVR5cGUgbmFtZT0ic3RyaW5nTGlzdCI+ICAgDQotICAgICAgICA8czpsaXN0IGl0ZW1UeXBlPSJzOnN0cmluZyIvPiANCi0gICAgICA8L3M6c2ltcGxlVHlwZT4NCi0NCi0gICAgICA8czpzaW1wbGVUeXBlIG5hbWU9ImZydWl0Ij4NCi0gICAgICAgICA8czpyZXN0cmljdGlvbiBiYXNlPSJzOnN0cmluZyI+DQotICAgICAgICAgICAgPHM6ZW51bWVyYXRpb24gdmFsdWU9ImFwcGxlIi8+ICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgIDxzOmVudW1lcmF0aW9uIHZhbHVlPSJvcmFuZ2UiLz4gICAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgIDxzOmVudW1lcmF0aW9uIHZhbHVlPSJwZWFyIi8+ICAgICAgICAgICAgICAgICAgICANCi0gICAgICAgICA8L3M6cmVzdHJpY3Rpb24+DQotICAgICAgPC9zOnNpbXBsZVR5cGU+DQotDQotICAgICAgPHM6Y29tcGxleFR5cGUgbmFtZT0iT2JqZWN0MCI+DQotICAgICAgICAgPHM6c2VxdWVuY2U+DQotICAgICAgICAgICA8czplbGVtZW50IG5hbWU9ImRhdGEwIiB0eXBlPSJzOnN0cmluZyIgLz4NCi0gICAgICAgICA8L3M6c2VxdWVuY2U+DQotICAgICAgPC9zOmNvbXBsZXhUeXBlPg0KLQ0KLSAgICAgIDwhLS0gRWNobyBhIFN0cmluZy4gIFRoaXMgYWxzbyBzdXBwb3J0cyB0aGUgc2l0dWF0aW9uIHdoZXJlIHRoZXJlIGlzIG5vIHN0cmluZyAtLT4NCi0gICAgICA8czplbGVtZW50IG5hbWU9ImVjaG9TdHJpbmciPg0KLSAgICAgICAgPHM6Y29tcGxleFR5cGU+DQotICAgICAgICAgIDxzOnNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9ImRhdGEiIHR5cGU9InM6c3RyaW5nIiAvPg0KLSAgICAgICAgICA8L3M6c2VxdWVuY2U+DQotICAgICAgICA8L3M6Y29tcGxleFR5cGU+DQotICAgICAgPC9zOmVsZW1lbnQ+DQotICAgICAgPHM6ZWxlbWVudCBuYW1lPSJlY2hvU3RyaW5nUmVzcG9uc2UiPg0KLSAgICAgICAgPHM6Y29tcGxleFR5cGU+DQotICAgICAgICAgIDxzOnNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9InJlc3VsdCIgdHlwZT0iczpzdHJpbmciIC8+DQotICAgICAgICAgIDwvczpzZXF1ZW5jZT4NCi0gICAgICAgIDwvczpjb21wbGV4VHlwZT4NCi0gICAgICA8L3M6ZWxlbWVudD4NCi0NCi0gICAgICA8IS0tIEVjaG8gY29tYmluZWQgU3RyaW5nLS0+DQotICAgICAgPHM6ZWxlbWVudCBuYW1lPSJlY2hvU3RyaW5nMiI+DQotICAgICAgICA8czpjb21wbGV4VHlwZT4NCi0gICAgICAgICAgPHM6c2VxdWVuY2U+DQotICAgICAgICAgICAgPHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0iZGF0YSIgdHlwZT0iczpzdHJpbmciIC8+DQotICAgICAgICAgICAgPHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0iaW5vdXQiIHR5cGU9InM6c3RyaW5nIiAvPg0KLSAgICAgICAgICA8L3M6c2VxdWVuY2U+DQotICAgICAgICA8L3M6Y29tcGxleFR5cGU+DQotICAgICAgPC9zOmVsZW1lbnQ+DQotICAgICAgPHM6ZWxlbWVudCBuYW1lPSJlY2hvU3RyaW5nMlJlc3BvbnNlIj4NCi0gICAgICAgIDxzOmNvbXBsZXhUeXBlPg0KLSAgICAgICAgICA8czpzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJpbm91dCIgdHlwZT0iczpzdHJpbmciIC8+DQotICAgICAgICAgIDwvczpzZXF1ZW5jZT4NCi0gICAgICAgIDwvczpjb21wbGV4VHlwZT4NCi0gICAgICA8L3M6ZWxlbWVudD4NCi0NCi0gICAgICA8IS0tIEVjaG8gaW50IC0tPg0KLSAgICAgIDxzOmVsZW1lbnQgbmFtZT0iZWNob0ludCI+DQotICAgICAgICA8czpjb21wbGV4VHlwZT4NCi0gICAgICAgICAgPHM6c2VxdWVuY2U+DQotICAgICAgICAgICAgPHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0iZGF0YSIgdHlwZT0iczppbnQiIC8+DQotICAgICAgICAgIDwvczpzZXF1ZW5jZT4NCi0gICAgICAgIDwvczpjb21wbGV4VHlwZT4NCi0gICAgICA8L3M6ZWxlbWVudD4NCi0gICAgICA8czplbGVtZW50IG5hbWU9ImVjaG9JbnRSZXNwb25zZSI+DQotICAgICAgICA8czpjb21wbGV4VHlwZT4NCi0gICAgICAgICAgPHM6c2VxdWVuY2U+DQotICAgICAgICAgICAgPHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0icmVzdWx0IiB0eXBlPSJzOmludCIgLz4NCi0gICAgICAgICAgPC9zOnNlcXVlbmNlPg0KLSAgICAgICAgPC9zOmNvbXBsZXhUeXBlPg0KLSAgICAgIDwvczplbGVtZW50Pg0KLQ0KLSAgICAgIDwhLS0gRWNobyBlbnVtIC0tPg0KLSAgICAgIDxzOmVsZW1lbnQgbmFtZT0iZWNob0VudW0iPg0KLSAgICAgICAgPHM6Y29tcGxleFR5cGU+DQotICAgICAgICAgIDxzOnNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9ImRhdGEiIHR5cGU9ImRhdGE6ZnJ1aXQiIC8+DQotICAgICAgICAgIDwvczpzZXF1ZW5jZT4NCi0gICAgICAgIDwvczpjb21wbGV4VHlwZT4NCi0gICAgICA8L3M6ZWxlbWVudD4NCi0gICAgICA8czplbGVtZW50IG5hbWU9ImVjaG9FbnVtUmVzcG9uc2UiPg0KLSAgICAgICAgPHM6Y29tcGxleFR5cGU+DQotICAgICAgICAgIDxzOnNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9InJlc3VsdCIgdHlwZT0iZGF0YTpmcnVpdCIgLz4NCi0gICAgICAgICAgPC9zOnNlcXVlbmNlPg0KLSAgICAgICAgPC9zOmNvbXBsZXhUeXBlPg0KLSAgICAgIDwvczplbGVtZW50Pg0KLQ0KLSAgICAgIDwhLS0gRWNobyBhbnlUeXBlLiAgVGVzdCBwb2x5bW9ycGhpc20gLS0+DQotICAgICAgPHM6ZWxlbWVudCBuYW1lPSJlY2hvQW55VHlwZSI+DQotICAgICAgICA8czpjb21wbGV4VHlwZT4NCi0gICAgICAgICAgPHM6c2VxdWVuY2U+DQotICAgICAgICAgICAgPHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0iZGF0YSIgdHlwZT0iczphbnlUeXBlIiAvPg0KLSAgICAgICAgICA8L3M6c2VxdWVuY2U+DQotICAgICAgICA8L3M6Y29tcGxleFR5cGU+DQotICAgICAgPC9zOmVsZW1lbnQ+DQotICAgICAgPHM6ZWxlbWVudCBuYW1lPSJlY2hvQW55VHlwZVJlc3BvbnNlIj4NCi0gICAgICAgIDxzOmNvbXBsZXhUeXBlPg0KLSAgICAgICAgICA8czpzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJyZXN1bHQiIHR5cGU9InM6YW55VHlwZSIgLz4NCi0gICAgICAgICAgPC9zOnNlcXVlbmNlPg0KLSAgICAgICAgPC9zOmNvbXBsZXhUeXBlPg0KLSAgICAgIDwvczplbGVtZW50Pg0KLQ0KLSAgICAgIDwhLS0gRWNobyBzdHJpbmdMaXN0LiAgVGVzdHMgeHNkOmxpc3QtLT4NCi0gICAgICA8IS0tIEJvdGggdGhlIFNFSSBhbmQgdGhlIGJlYW4gdXNlIExpc3QgU3RyaW5nIHRvIHJlcHJlc2VudCB0aGUgZGF0YS4gIC0tPg0KLSAgICAgIDwhLS0gQnV0IHRoZXJlIGFyZSBzb21lIHNlbWFudGljIGRpZmZlcmVuY2VzIGJldHdlZW4gdGhpcyBhbmQgZWNob1N0cmluZ0FycmF5IC0tPg0KLSAgICAgIDwhLS0gZHVlIHRvIHhtbCBkaWZmZXJlbmNlcyBiZXR3ZWVuIHhzZDpsaXN0IGFuZCBtYXhPY2N1cnMgdW5ib3VuZGVkIC0tPg0KLSAgICAgIDxzOmVsZW1lbnQgbmFtZT0iZWNob1N0cmluZ0xpc3QiPg0KLSAgICAgICAgPHM6Y29tcGxleFR5cGU+DQotICAgICAgICAgIDxzOnNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9ImRhdGEiIHR5cGU9ImRhdGE6c3RyaW5nTGlzdCIgLz4NCi0gICAgICAgICAgPC9zOnNlcXVlbmNlPg0KLSAgICAgICAgPC9zOmNvbXBsZXhUeXBlPg0KLSAgICAgIDwvczplbGVtZW50Pg0KLQ0KLSAgICAgIDxzOmVsZW1lbnQgbmFtZT0iZWNob1N0cmluZ0xpc3RSZXNwb25zZSI+DQotICAgICAgICA8czpjb21wbGV4VHlwZT4NCi0gICAgICAgICAgPHM6c2VxdWVuY2U+DQotICAgICAgICAgICAgPHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0icmVzdWx0IiB0eXBlPSJkYXRhOnN0cmluZ0xpc3QiIC8+DQotICAgICAgICAgIDwvczpzZXF1ZW5jZT4NCi0gICAgICAgIDwvczpjb21wbGV4VHlwZT4NCi0gICAgICA8L3M6ZWxlbWVudD4NCi0NCi0gICAgICA8IS0tIEp1c3QgbGlrZSBzdHJpbmdMaXN0LCBleGNlcHQgdGhlIFNFSSBwYXJhbWV0ZXIgaXMgbWFudWFsbHkgY2hhbmdlZCB0byBTdHJpbmdbXSAtLT4NCi0gICAgICA8IS0tIFRoaXMgd2lsbCB0ZXN0IExpc3QgPC0+IGphdmEgQXJyYXkgcHJvY2Vzc2luZyAtLT4NCi0gICAgICA8czplbGVtZW50IG5hbWU9ImVjaG9TdHJpbmdMaXN0QWx0Ij4NCi0gICAgICAgIDxzOmNvbXBsZXhUeXBlPg0KLSAgICAgICAgICA8czpzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJkYXRhIiB0eXBlPSJkYXRhOnN0cmluZ0xpc3QiIC8+DQotICAgICAgICAgIDwvczpzZXF1ZW5jZT4NCi0gICAgICAgIDwvczpjb21wbGV4VHlwZT4NCi0gICAgICA8L3M6ZWxlbWVudD4NCi0NCi0gICAgICA8czplbGVtZW50IG5hbWU9ImVjaG9TdHJpbmdMaXN0QWx0UmVzcG9uc2UiPg0KLSAgICAgICAgPHM6Y29tcGxleFR5cGU+DQotICAgICAgICAgIDxzOnNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9InJlc3VsdCIgdHlwZT0iZGF0YTpzdHJpbmdMaXN0IiAvPg0KLSAgICAgICAgICA8L3M6c2VxdWVuY2U+DQotICAgICAgICA8L3M6Y29tcGxleFR5cGU+DQotICAgICAgPC9zOmVsZW1lbnQ+DQotDQotICAgICAgPCEtLSBKdXN0IGxpa2Ugc3RyaW5nTGlzdCwgZXhjZXB0IHRoZSBTRUkgcGFyYW1ldGVyIGlzIG1hbnVhbGx5IGNoYW5nZWQgdG8gTGlua2VkTGlzdCBTdHJpbmcgLS0+DQotICAgICAgPCEtLSBUaGlzIHdpbGwgdGVzdCBMaXN0IDwtPiBqYXZhIEFycmF5IHByb2Nlc3NpbmcgLS0+DQotICAgICAgPHM6ZWxlbWVudCBuYW1lPSJlY2hvU3RyaW5nTGlzdEFzTGlua2VkTGlzdCI+DQotICAgICAgICA8czpjb21wbGV4VHlwZT4NCi0gICAgICAgICAgPHM6c2VxdWVuY2U+DQotICAgICAgICAgICAgPHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0iZGF0YSIgdHlwZT0iZGF0YTpzdHJpbmdMaXN0IiAvPg0KLSAgICAgICAgICA8L3M6c2VxdWVuY2U+DQotICAgICAgICA8L3M6Y29tcGxleFR5cGU+DQotICAgICAgPC9zOmVsZW1lbnQ+DQotCSAgDQotCSAgPHM6ZWxlbWVudCBuYW1lPSJlY2hvU3RyaW5nTGlzdEFzTGlua2VkTGlzdFJlc3BvbnNlIj4NCi0gICAgICAgIDxzOmNvbXBsZXhUeXBlPg0KLSAgICAgICAgICA8czpzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJkYXRhIiB0eXBlPSJkYXRhOnN0cmluZ0xpc3QiIC8+DQotICAgICAgICAgIDwvczpzZXF1ZW5jZT4NCi0gICAgICAgIDwvczpjb21wbGV4VHlwZT4NCi0gICAgICA8L3M6ZWxlbWVudD4NCi0NCi0gICAgICA8czplbGVtZW50IG5hbWU9ImVjaG9TdHJpbmdMaXN0QWx0QXNMaW5rZWRMaXN0UmVzcG9uc2UiPg0KLSAgICAgICAgPHM6Y29tcGxleFR5cGU+DQotICAgICAgICAgIDxzOnNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9InJlc3VsdCIgdHlwZT0iZGF0YTpzdHJpbmdMaXN0IiAvPg0KLSAgICAgICAgICA8L3M6c2VxdWVuY2U+DQotICAgICAgICA8L3M6Y29tcGxleFR5cGU+DQotICAgICAgPC9zOmVsZW1lbnQ+DQotDQotICAgICAgPCEtLSBUaGUgU0VJIGFuZCBiZWFuIHByb3BlcnR5IG1hcCB0byBMaXN0IExpc3QgU3RyaW5nIC0tPg0KLSAgICAgIDxzOmVsZW1lbnQgbmFtZT0iZWNob1N0cmluZ0xpc3RBcnJheSI+DQotICAgICAgICA8czpjb21wbGV4VHlwZT4NCi0gICAgICAgICAgPHM6c2VxdWVuY2U+DQotICAgICAgICAgICAgPHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJkYXRhIiB0eXBlPSJkYXRhOnN0cmluZ0xpc3QiIC8+DQotICAgICAgICAgIDwvczpzZXF1ZW5jZT4NCi0gICAgICAgIDwvczpjb21wbGV4VHlwZT4NCi0gICAgICA8L3M6ZWxlbWVudD4NCi0NCi0gICAgICA8czplbGVtZW50IG5hbWU9ImVjaG9TdHJpbmdMaXN0QXJyYXlSZXNwb25zZSI+DQotICAgICAgICA8czpjb21wbGV4VHlwZT4NCi0gICAgICAgICAgPHM6c2VxdWVuY2U+DQotICAgICAgICAgICAgPHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJyZXN1bHQiIHR5cGU9ImRhdGE6c3RyaW5nTGlzdCIgLz4NCi0gICAgICAgICAgPC9zOnNlcXVlbmNlPg0KLSAgICAgICAgPC9zOmNvbXBsZXhUeXBlPg0KLSAgICAgIDwvczplbGVtZW50Pg0KLQ0KLSAgICAgIDwhLS0gRWNobyBhIFN0cmluZyBhcmF5LiAtLT4NCi0gICAgICA8IS0tIFByb2JhYmx5IHRoZSBtb3N0IGNvbW1vbiBjYXNlLiAgQm90aCB0aGUgU0VJIGFuZCBiZWFuIGFyZSBtYXBwZWQgdG8gTGlzdCBTdHJpbmcgLS0+DQotICAgICAgPCEtLSBUaGUgeG1sIG1heE9jY3VycyBzZW1hbnRpY3MgYXJlIHVzZWQgdG8gbWFyc2hhbCBhbmQgdW5tYXJzaGFsIHRoZSB2YWx1ZXMuLi4gLS0+DQotICAgICAgPCEtLSBXaGljaCBtYWtlcyB0aGlzIGEgbGl0dGxlIGRpZmZlcmVudCB0aGFuIHRoZSBlY2hvU3RyaW5nTGlzdCBjYXNlIC0tPg0KLSAgICAgIDxzOmVsZW1lbnQgbmFtZT0iZWNob1N0cmluZ0FycmF5Ij4NCi0gICAgICAgIDxzOmNvbXBsZXhUeXBlPg0KLSAgICAgICAgICA8czpzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImRhdGEiIHR5cGU9InM6c3RyaW5nIiAvPg0KLSAgICAgICAgICA8L3M6c2VxdWVuY2U+DQotICAgICAgICA8L3M6Y29tcGxleFR5cGU+DQotICAgICAgPC9zOmVsZW1lbnQ+DQotICAgICAgPHM6ZWxlbWVudCBuYW1lPSJlY2hvU3RyaW5nQXJyYXlSZXNwb25zZSI+DQotICAgICAgICA8czpjb21wbGV4VHlwZT4NCi0gICAgICAgICAgPHM6c2VxdWVuY2U+DQotICAgICAgICAgICAgPHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJyZXN1bHQiIHR5cGU9InM6c3RyaW5nIiAvPg0KLSAgICAgICAgICA8L3M6c2VxdWVuY2U+DQotICAgICAgICA8L3M6Y29tcGxleFR5cGU+DQotICAgICAgPC9zOmVsZW1lbnQ+DQotDQotICAgICAgPCEtLSBTYW1lIGFzIGVjaG9TdHJpbmdBcnJheSwgZXhjZXB0IHRoZSBTRUkgaXMgbWFudWFsbHkgY2hhbmdlZCB0byBTdHJpbmdbXSAtLT4NCi0gICAgICA8czplbGVtZW50IG5hbWU9ImVjaG9TdHJpbmdBcnJheUFsdCI+DQotICAgICAgICA8czpjb21wbGV4VHlwZT4NCi0gICAgICAgICAgPHM6c2VxdWVuY2U+DQotICAgICAgICAgICAgPHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJkYXRhIiB0eXBlPSJzOnN0cmluZyIgLz4NCi0gICAgICAgICAgPC9zOnNlcXVlbmNlPg0KLSAgICAgICAgPC9zOmNvbXBsZXhUeXBlPg0KLSAgICAgIDwvczplbGVtZW50Pg0KLSAgICAgIDxzOmVsZW1lbnQgbmFtZT0iZWNob1N0cmluZ0FycmF5QWx0UmVzcG9uc2UiPg0KLSAgICAgICAgPHM6Y29tcGxleFR5cGU+DQotICAgICAgICAgIDxzOnNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0icmVzdWx0IiB0eXBlPSJzOnN0cmluZyIgLz4NCi0gICAgICAgICAgPC9zOnNlcXVlbmNlPg0KLSAgICAgICAgPC9zOmNvbXBsZXhUeXBlPg0KLSAgICAgIDwvczplbGVtZW50Pg0KLQ0KLSAgICAgIDwhLS0gU2FtZSBhcyBlY2hvU3RyaW5nQXJyYXksIGV4Y2VwdCB0aGUgU0VJIGlzIG1hbnVhbGx5IGNoYW5nZWQgdG8gTGlua2VkTGlzdCBTdHJpbmcgLS0+DQotICAgICAgPHM6ZWxlbWVudCBuYW1lPSJlY2hvU3RyaW5nQXJyYXlBc0xpbmtlZExpc3QiPg0KLSAgICAgICAgPHM6Y29tcGxleFR5cGU+DQotICAgICAgICAgIDxzOnNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZGF0YSIgdHlwZT0iczpzdHJpbmciIC8+DQotICAgICAgICAgIDwvczpzZXF1ZW5jZT4NCi0gICAgICAgIDwvczpjb21wbGV4VHlwZT4NCi0gICAgICA8L3M6ZWxlbWVudD4NCi0gICAgICA8czplbGVtZW50IG5hbWU9ImVjaG9TdHJpbmdBcnJheUFzTGlua2VkTGlzdFJlc3BvbnNlIj4NCi0gICAgICAgIDxzOmNvbXBsZXhUeXBlPg0KLSAgICAgICAgICA8czpzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InJlc3VsdCIgdHlwZT0iczpzdHJpbmciIC8+DQotICAgICAgICAgIDwvczpzZXF1ZW5jZT4NCi0gICAgICAgIDwvczpjb21wbGV4VHlwZT4NCi0gICAgICA8L3M6ZWxlbWVudD4NCi0NCi0gICAgICA8IS0tIEVjaG8gSW5kZXhlZCBTdHJpbmcgQXJyYXkgLS0+DQotICAgICAgPCEtLSBJbiB0aGlzIGNhc2UgdGhlIHBhcmFtZXRlciBpcyBhIExpc3QgU3RyaW5nLCBidXQgdGhlIGJlYW4gcHJvcGVydHkgdXNlcyB0aGUgaW5kZXhlZCAtLT4NCi0gICAgICA8IS0tIHNldHRlci9nZXR0ZXIgc3R5bGUgbWV0aG9kcyAtLT4NCi0gICAgICA8czplbGVtZW50IG5hbWU9ImVjaG9JbmRleGVkU3RyaW5nQXJyYXkiPg0KLSAgICAgICAgPHM6Y29tcGxleFR5cGU+DQotICAgICAgICAgIDxzOnNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZGF0YSIgdHlwZT0iczpzdHJpbmciID4NCi0gICAgICAgICAgICAgIDxzOmFubm90YXRpb24+DQotICAgICAgICAgICAgICAgIDxzOmFwcGluZm8+DQotICAgICAgICAgICAgICAgICAgPGpheGI6cHJvcGVydHkgY29sbGVjdGlvblR5cGU9ImluZGV4ZWQiIC8+DQotICAgICAgICAgICAgICAgIDwvczphcHBpbmZvPg0KLSAgICAgICAgICAgICAgPC9zOmFubm90YXRpb24+DQotICAgICAgICAgICAgPC9zOmVsZW1lbnQ+DQotICAgICAgICAgIDwvczpzZXF1ZW5jZT4NCi0gICAgICAgIDwvczpjb21wbGV4VHlwZT4NCi0gICAgICA8L3M6ZWxlbWVudD4NCi0gICAgICA8czplbGVtZW50IG5hbWU9ImVjaG9JbmRleGVkU3RyaW5nQXJyYXlSZXNwb25zZSI+DQotICAgICAgICA8czpjb21wbGV4VHlwZT4NCi0gICAgICAgICAgPHM6c2VxdWVuY2U+DQotICAgICAgICAgICAgPHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJyZXN1bHQiIHR5cGU9InM6c3RyaW5nIiA+DQotICAgICAgICAgICAgICA8czphbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgICA8czphcHBpbmZvPg0KLSAgICAgICAgICAgICAgICAgIDxqYXhiOnByb3BlcnR5IGNvbGxlY3Rpb25UeXBlPSJpbmRleGVkIiAvPg0KLSAgICAgICAgICAgICAgICA8L3M6YXBwaW5mbz4NCi0gICAgICAgICAgICAgIDwvczphbm5vdGF0aW9uPg0KLSAgICAgICAgICAgIDwvczplbGVtZW50Pg0KLSAgICAgICAgICA8L3M6c2VxdWVuY2U+DQotICAgICAgICA8L3M6Y29tcGxleFR5cGU+DQotICAgICAgPC9zOmVsZW1lbnQ+DQotDQotICAgICAgPCEtLSBFY2hvIGNvbWJpbmVkIFN0cmluZy0tPg0KLSAgICAgIDxzOmVsZW1lbnQgbmFtZT0iZWNob1N0cmluZzJBcnJheSI+DQotICAgICAgICA8czpjb21wbGV4VHlwZT4NCi0gICAgICAgICAgPHM6c2VxdWVuY2U+DQotICAgICAgICAgICAgPHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJkYXRhIiB0eXBlPSJzOnN0cmluZyIgLz4NCi0gICAgICAgICAgICA8czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9Imlub3V0IiB0eXBlPSJzOnN0cmluZyIgLz4NCi0gICAgICAgICAgPC9zOnNlcXVlbmNlPg0KLSAgICAgICAgPC9zOmNvbXBsZXhUeXBlPg0KLSAgICAgIDwvczplbGVtZW50Pg0KLSAgICAgIDxzOmVsZW1lbnQgbmFtZT0iZWNob1N0cmluZzJBcnJheVJlc3BvbnNlIj4NCi0gICAgICAgIDxzOmNvbXBsZXhUeXBlPg0KLSAgICAgICAgICA8czpzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9Imlub3V0IiB0eXBlPSJzOnN0cmluZyIgLz4NCi0gICAgICAgICAgPC9zOnNlcXVlbmNlPg0KLSAgICAgICAgPC9zOmNvbXBsZXhUeXBlPg0KLSAgICAgIDwvczplbGVtZW50Pg0KLQ0KLSAgICAgIDwhLS0gRWNobyBpbnQgLS0+DQotICAgICAgPHM6ZWxlbWVudCBuYW1lPSJlY2hvSW50QXJyYXkiPg0KLSAgICAgICAgPHM6Y29tcGxleFR5cGU+DQotICAgICAgICAgIDxzOnNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZGF0YSIgdHlwZT0iczppbnQiIC8+DQotICAgICAgICAgIDwvczpzZXF1ZW5jZT4NCi0gICAgICAgIDwvczpjb21wbGV4VHlwZT4NCi0gICAgICA8L3M6ZWxlbWVudD4NCi0gICAgICA8czplbGVtZW50IG5hbWU9ImVjaG9JbnRBcnJheVJlc3BvbnNlIj4NCi0gICAgICAgIDxzOmNvbXBsZXhUeXBlPg0KLSAgICAgICAgICA8czpzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InJlc3VsdCIgdHlwZT0iczppbnQiIC8+DQotICAgICAgICAgIDwvczpzZXF1ZW5jZT4NCi0gICAgICAgIDwvczpjb21wbGV4VHlwZT4NCi0gICAgICA8L3M6ZWxlbWVudD4NCi0NCi0gICAgICA8IS0tIEVjaG8gZW51bSAtLT4NCi0gICAgICA8czplbGVtZW50IG5hbWU9ImVjaG9FbnVtQXJyYXkiPg0KLSAgICAgICAgPHM6Y29tcGxleFR5cGU+DQotICAgICAgICAgIDxzOnNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZGF0YSIgdHlwZT0iZGF0YTpmcnVpdCIgLz4NCi0gICAgICAgICAgPC9zOnNlcXVlbmNlPg0KLSAgICAgICAgPC9zOmNvbXBsZXhUeXBlPg0KLSAgICAgIDwvczplbGVtZW50Pg0KLSAgICAgIDxzOmVsZW1lbnQgbmFtZT0iZWNob0VudW1BcnJheVJlc3BvbnNlIj4NCi0gICAgICAgIDxzOmNvbXBsZXhUeXBlPg0KLSAgICAgICAgICA8czpzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InJlc3VsdCIgdHlwZT0iZGF0YTpmcnVpdCIgLz4NCi0gICAgICAgICAgPC9zOnNlcXVlbmNlPg0KLSAgICAgICAgPC9zOmNvbXBsZXhUeXBlPg0KLSAgICAgIDwvczplbGVtZW50Pg0KLQ0KLSAgICAgIDwhLS0gRWNobyBhbnlUeXBlLiAgVGVzdCBwb2x5bW9ycGhpc20gLS0+DQotICAgICAgPHM6ZWxlbWVudCBuYW1lPSJlY2hvQW55VHlwZUFycmF5Ij4NCi0gICAgICAgIDxzOmNvbXBsZXhUeXBlPg0KLSAgICAgICAgICA8czpzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImRhdGEiIHR5cGU9InM6YW55VHlwZSIgLz4NCi0gICAgICAgICAgPC9zOnNlcXVlbmNlPg0KLSAgICAgICAgPC9zOmNvbXBsZXhUeXBlPg0KLSAgICAgIDwvczplbGVtZW50Pg0KLSAgICAgIDxzOmVsZW1lbnQgbmFtZT0iZWNob0FueVR5cGVBcnJheVJlc3BvbnNlIj4NCi0gICAgICAgIDxzOmNvbXBsZXhUeXBlPg0KLSAgICAgICAgICA8czpzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InJlc3VsdCIgdHlwZT0iczphbnlUeXBlIiAvPg0KLSAgICAgICAgICA8L3M6c2VxdWVuY2U+DQotICAgICAgICA8L3M6Y29tcGxleFR5cGU+DQotICAgICAgPC9zOmVsZW1lbnQ+DQotCSAgDQotICAgICA8czplbGVtZW50IG5hbWU9ImVjaG9EYXRlIj4gICAgIAkgDQotICAgICAgICAgICA8czpjb21wbGV4VHlwZT4NCi0JCSAgIDxzOmNob2ljZT4NCi0JCQkJPHM6ZWxlbWVudCBuYW1lPSJSZXF1ZXN0ZWRUZXJtaW5hdGlvblRpbWUiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJzOmRhdGVUaW1lIiAvPg0KLQkJCQk8czplbGVtZW50IG5hbWU9IlJlcXVlc3RlZExpZmV0aW1lRHVyYXRpb24iIHR5cGU9InM6ZHVyYXRpb24iIC8+DQotCQkJPC9zOmNob2ljZT4NCi0JCQkNCi0gICAgICAgICAgICAgPCEtLTxzOnNlcXVlbmNlPg0KLSAgICAgICAgICAgICAgIDxzOmVsZW1lbnQgbmFtZT0icmVxdWVzdCIgbmlsbGFibGU9InRydWUiIHR5cGU9InM6ZGF0ZSIgLz4NCi0gICAgICAgICAgICAgPC9zOnNlcXVlbmNlPiAtLT4NCi0JCQkgDQotICAgICAgICAgICA8L3M6Y29tcGxleFR5cGU+DQotCSAgPC9zOmVsZW1lbnQ+DQotDQotCSAgPHM6ZWxlbWVudCBuYW1lPSJlY2hvRGF0ZVJlc3BvbnNlIj4NCi0gICAgICAgICAgIDxzOmNvbXBsZXhUeXBlPg0KLSAgICAgICAgICAgICA8czpzZXF1ZW5jZT4NCi0gICAgICAgICAgICAgICA8czplbGVtZW50IG5hbWU9InJlc3BvbnNlIiB0eXBlPSJzOmRhdGUiIC8+DQotICAgICAgICAgICAgIDwvczpzZXF1ZW5jZT4NCi0gICAgICAgICAgIDwvczpjb21wbGV4VHlwZT4NCi0JICA8L3M6ZWxlbWVudD4NCi0JICANCi0JICA8czpjb21wbGV4VHlwZSBuYW1lPSJlY2hvQmFzZXR5cGUiPg0KLQkgICAgICAgICAgICA8czpzZXF1ZW5jZT4NCi0JICAgICAgICAgICAgICAgPHM6ZWxlbWVudCBuYW1lPSJyZXF1ZXN0IiB0eXBlPSJzOmRhdGUiIC8+DQotCSAgICAgICAgICAgIDwvczpzZXF1ZW5jZT4NCi0JICAgICAgICAgPC9zOmNvbXBsZXhUeXBlPg0KLQkJCSANCi0JICAJIDxzOmVsZW1lbnQgbmFtZT0iZWNob1BvbHltb3JwaGljRGF0ZSI+DQotCQkJIDxzOmNvbXBsZXhUeXBlPg0KLQkJCQk8czpjb21wbGV4Q29udGVudD4NCi0JCQkJCTxzOmV4dGVuc2lvbiBiYXNlPSJkYXRhOmVjaG9CYXNldHlwZSIvPg0KLQkJCQk8L3M6Y29tcGxleENvbnRlbnQ+DQotCQkJPC9zOmNvbXBsZXhUeXBlPg0KLQkJIDwvczplbGVtZW50Pg0KLQkJIAkgIA0KLSAgICA8L3M6c2NoZW1hPg0KLQ0KLSAgICA8czpzY2hlbWEgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIA0KLSAgICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9nb3JpbGxhX2Rsdy9kYXRhMiIgPg0KLSAgICAgICAgDQotICAgICAgICA8IS0tIEZvciBhbnlUeXBlIHByb2Nlc3NpbmcsICBPYmplY3QxIGlzIGluIGFuIGltcG9ydGVkIHNjaGVtYSwgdGh1cyBpdCBzaG91bGQgYmUgYWxsb3dlZCBpbiB0aGUgYW55VHlwZSAtLT4NCi0gICAgICAgIDxzOmNvbXBsZXhUeXBlIG5hbWU9Ik9iamVjdDEiPg0KLSAgICAgICAgICAgPHM6c2VxdWVuY2U+DQotICAgICAgICAgICAgIDxzOmVsZW1lbnQgbmFtZT0iZGF0YTEiIHR5cGU9InM6c3RyaW5nIiAvPg0KLSAgICAgICAgICAgPC9zOnNlcXVlbmNlPg0KLSAgICAgICAgPC9zOmNvbXBsZXhUeXBlPg0KLSAgICA8L3M6c2NoZW1hPg0KLQ0KLSAgIDxzOnNjaGVtYSBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIgDQotICAgICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2dvcmlsbGFfZGx3L2RhdGFVbnJlZiIgPg0KLSAgICAgICAgDQotICAgICAgICA8IS0tIEZvciBhbnlUeXBlIHByb2Nlc3NpbmcsICBPYmplY3QyIGlzIGluIGFuIHVucmVmZXJlbmNlZCBzY2hlbWEsIHRodXMgbWF5IGZhaWwgd2hlbiB1c2VkIHdpdGggYW55VHlwZSAtLT4NCi0gICAgICAgIDxzOmNvbXBsZXhUeXBlIG5hbWU9Ik9iamVjdDIiPg0KLSAgICAgICAgICAgPHM6c2VxdWVuY2U+DQotICAgICAgICAgICAgIDxzOmVsZW1lbnQgbmFtZT0iZGF0YTIiIHR5cGU9InM6c3RyaW5nIiAvPg0KLSAgICAgICAgICAgPC9zOnNlcXVlbmNlPg0KLSAgICAgICAgPC9zOmNvbXBsZXhUeXBlPg0KLSAgICA8L3M6c2NoZW1hPg0KLSANCi0gIDwvdHlwZXM+DQotDQotICA8IS0tIG1lc3NhZ2VzIC0tPg0KLSAgPG1lc3NhZ2UgbmFtZT0iYXNzZXJ0RmF1bHQiPg0KLSAgICA8cGFydCBuYW1lPSJ4IiBlbGVtZW50PSJkYXRhOmFzc2VydEZhdWx0IiAvPg0KLSAgPC9tZXNzYWdlPg0KLQ0KLSAgPG1lc3NhZ2UgbmFtZT0iZWNob1N0cmluZyI+DQotICAgIDxwYXJ0IG5hbWU9IngiIGVsZW1lbnQ9ImRhdGE6ZWNob1N0cmluZyIgLz4NCi0gIDwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIG5hbWU9ImVjaG9TdHJpbmdSZXNwb25zZSI+DQotICAgIDxwYXJ0IG5hbWU9IngiIGVsZW1lbnQ9ImRhdGE6ZWNob1N0cmluZ1Jlc3BvbnNlIiAvPg0KLSAgPC9tZXNzYWdlPg0KLQ0KLSAgPG1lc3NhZ2UgbmFtZT0iZWNob1N0cmluZzIiPg0KLSAgICA8cGFydCBuYW1lPSJ4IiBlbGVtZW50PSJkYXRhOmVjaG9TdHJpbmcyIiAvPg0KLSAgPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2UgbmFtZT0iZWNob1N0cmluZzJSZXNwb25zZSI+DQotICAgIDxwYXJ0IG5hbWU9IngiIGVsZW1lbnQ9ImRhdGE6ZWNob1N0cmluZzJSZXNwb25zZSIgLz4NCi0gIDwvbWVzc2FnZT4NCi0NCi0gIDxtZXNzYWdlIG5hbWU9ImVjaG9JbnQiPg0KLSAgICA8cGFydCBuYW1lPSJ4IiBlbGVtZW50PSJkYXRhOmVjaG9JbnQiIC8+DQotICA8L21lc3NhZ2U+DQotICA8bWVzc2FnZSBuYW1lPSJlY2hvSW50UmVzcG9uc2UiPg0KLSAgICA8cGFydCBuYW1lPSJ4IiBlbGVtZW50PSJkYXRhOmVjaG9JbnRSZXNwb25zZSIgLz4NCi0gIDwvbWVzc2FnZT4NCi0NCi0gIDxtZXNzYWdlIG5hbWU9ImVjaG9FbnVtIj4NCi0gICAgPHBhcnQgbmFtZT0ieCIgZWxlbWVudD0iZGF0YTplY2hvRW51bSIgLz4NCi0gIDwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIG5hbWU9ImVjaG9FbnVtUmVzcG9uc2UiPg0KLSAgICA8cGFydCBuYW1lPSJ4IiBlbGVtZW50PSJkYXRhOmVjaG9FbnVtUmVzcG9uc2UiIC8+DQotICA8L21lc3NhZ2U+DQotDQotICA8bWVzc2FnZSBuYW1lPSJlY2hvQW55VHlwZSI+DQotICAgIDxwYXJ0IG5hbWU9IngiIGVsZW1lbnQ9ImRhdGE6ZWNob0FueVR5cGUiIC8+DQotICA8L21lc3NhZ2U+DQotICA8bWVzc2FnZSBuYW1lPSJlY2hvQW55VHlwZVJlc3BvbnNlIj4NCi0gICAgPHBhcnQgbmFtZT0ieCIgZWxlbWVudD0iZGF0YTplY2hvQW55VHlwZVJlc3BvbnNlIiAvPg0KLSAgPC9tZXNzYWdlPg0KLQ0KLSAgPG1lc3NhZ2UgbmFtZT0iZWNob1N0cmluZ0xpc3QiPg0KLSAgICA8cGFydCBuYW1lPSJ4IiBlbGVtZW50PSJkYXRhOmVjaG9TdHJpbmdMaXN0IiAvPg0KLSAgPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2UgbmFtZT0iZWNob1N0cmluZ0xpc3RSZXNwb25zZSI+DQotICAgIDxwYXJ0IG5hbWU9IngiIGVsZW1lbnQ9ImRhdGE6ZWNob1N0cmluZ0xpc3RSZXNwb25zZSIgLz4NCi0gIDwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIG5hbWU9ImVjaG9TdHJpbmdMaXN0QWx0Ij4NCi0gICAgPHBhcnQgbmFtZT0ieCIgZWxlbWVudD0iZGF0YTplY2hvU3RyaW5nTGlzdEFsdCIgLz4NCi0gIDwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIG5hbWU9ImVjaG9TdHJpbmdMaXN0QWx0UmVzcG9uc2UiPg0KLSAgICA8cGFydCBuYW1lPSJ4IiBlbGVtZW50PSJkYXRhOmVjaG9TdHJpbmdMaXN0QWx0UmVzcG9uc2UiIC8+DQotICA8L21lc3NhZ2U+DQotICA8bWVzc2FnZSBuYW1lPSJlY2hvU3RyaW5nTGlzdEFzTGlua2VkTGlzdCI+DQotICAgIDxwYXJ0IG5hbWU9IngiIGVsZW1lbnQ9ImRhdGE6ZWNob1N0cmluZ0xpc3RBc0xpbmtlZExpc3QiIC8+DQotICA8L21lc3NhZ2U+DQotICA8bWVzc2FnZSBuYW1lPSJlY2hvU3RyaW5nTGlzdEFzTGlua2VkTGlzdFJlc3BvbnNlIj4NCi0gICAgPHBhcnQgbmFtZT0ieCIgZWxlbWVudD0iZGF0YTplY2hvU3RyaW5nTGlzdEFzTGlua2VkTGlzdFJlc3BvbnNlIiAvPg0KLSAgPC9tZXNzYWdlPg0KLQ0KLSAgPG1lc3NhZ2UgbmFtZT0iZWNob1N0cmluZ0xpc3RBcnJheSI+DQotICAgIDxwYXJ0IG5hbWU9IngiIGVsZW1lbnQ9ImRhdGE6ZWNob1N0cmluZ0xpc3RBcnJheSIgLz4NCi0gIDwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIG5hbWU9ImVjaG9TdHJpbmdMaXN0QXJyYXlSZXNwb25zZSI+DQotICAgIDxwYXJ0IG5hbWU9IngiIGVsZW1lbnQ9ImRhdGE6ZWNob1N0cmluZ0xpc3RBcnJheVJlc3BvbnNlIiAvPg0KLSAgPC9tZXNzYWdlPg0KLQ0KLSAgPG1lc3NhZ2UgbmFtZT0iZWNob1N0cmluZ0FycmF5Ij4NCi0gICAgPHBhcnQgbmFtZT0ieCIgZWxlbWVudD0iZGF0YTplY2hvU3RyaW5nQXJyYXkiIC8+DQotICA8L21lc3NhZ2U+DQotICA8bWVzc2FnZSBuYW1lPSJlY2hvU3RyaW5nQXJyYXlSZXNwb25zZSI+DQotICAgIDxwYXJ0IG5hbWU9IngiIGVsZW1lbnQ9ImRhdGE6ZWNob1N0cmluZ0FycmF5UmVzcG9uc2UiIC8+DQotICA8L21lc3NhZ2U+DQotDQotICA8bWVzc2FnZSBuYW1lPSJlY2hvU3RyaW5nQXJyYXlBbHQiPg0KLSAgICA8cGFydCBuYW1lPSJ4IiBlbGVtZW50PSJkYXRhOmVjaG9TdHJpbmdBcnJheUFsdCIgLz4NCi0gIDwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIG5hbWU9ImVjaG9TdHJpbmdBcnJheUFsdFJlc3BvbnNlIj4NCi0gICAgPHBhcnQgbmFtZT0ieCIgZWxlbWVudD0iZGF0YTplY2hvU3RyaW5nQXJyYXlBbHRSZXNwb25zZSIgLz4NCi0gIDwvbWVzc2FnZT4NCi0NCi0gIDxtZXNzYWdlIG5hbWU9ImVjaG9TdHJpbmdBcnJheUFzTGlua2VkTGlzdCI+DQotICAgIDxwYXJ0IG5hbWU9IngiIGVsZW1lbnQ9ImRhdGE6ZWNob1N0cmluZ0FycmF5QXNMaW5rZWRMaXN0IiAvPg0KLSAgPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2UgbmFtZT0iZWNob1N0cmluZ0FycmF5QXNMaW5rZWRMaXN0UmVzcG9uc2UiPg0KLSAgICA8cGFydCBuYW1lPSJ4IiBlbGVtZW50PSJkYXRhOmVjaG9TdHJpbmdBcnJheUFzTGlua2VkTGlzdFJlc3BvbnNlIiAvPg0KLSAgPC9tZXNzYWdlPg0KLSAgDQotICA8bWVzc2FnZSBuYW1lPSJlY2hvSW5kZXhlZFN0cmluZ0FycmF5Ij4NCi0gICAgPHBhcnQgbmFtZT0ieCIgZWxlbWVudD0iZGF0YTplY2hvSW5kZXhlZFN0cmluZ0FycmF5IiAvPg0KLSAgPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2UgbmFtZT0iZWNob0luZGV4ZWRTdHJpbmdBcnJheVJlc3BvbnNlIj4NCi0gICAgPHBhcnQgbmFtZT0ieCIgZWxlbWVudD0iZGF0YTplY2hvSW5kZXhlZFN0cmluZ0FycmF5UmVzcG9uc2UiIC8+DQotICA8L21lc3NhZ2U+DQotDQotICA8bWVzc2FnZSBuYW1lPSJlY2hvU3RyaW5nMkFycmF5Ij4NCi0gICAgPHBhcnQgbmFtZT0ieCIgZWxlbWVudD0iZGF0YTplY2hvU3RyaW5nMkFycmF5IiAvPg0KLSAgPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2UgbmFtZT0iZWNob1N0cmluZzJBcnJheVJlc3BvbnNlIj4NCi0gICAgPHBhcnQgbmFtZT0ieCIgZWxlbWVudD0iZGF0YTplY2hvU3RyaW5nMkFycmF5UmVzcG9uc2UiIC8+DQotICA8L21lc3NhZ2U+DQotDQotICA8bWVzc2FnZSBuYW1lPSJlY2hvSW50QXJyYXkiPg0KLSAgICA8cGFydCBuYW1lPSJ4IiBlbGVtZW50PSJkYXRhOmVjaG9JbnRBcnJheSIgLz4NCi0gIDwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIG5hbWU9ImVjaG9JbnRBcnJheVJlc3BvbnNlIj4NCi0gICAgPHBhcnQgbmFtZT0ieCIgZWxlbWVudD0iZGF0YTplY2hvSW50QXJyYXlSZXNwb25zZSIgLz4NCi0gIDwvbWVzc2FnZT4NCi0NCi0gIDxtZXNzYWdlIG5hbWU9ImVjaG9FbnVtQXJyYXkiPg0KLSAgICA8cGFydCBuYW1lPSJ4IiBlbGVtZW50PSJkYXRhOmVjaG9FbnVtQXJyYXkiIC8+DQotICA8L21lc3NhZ2U+DQotICA8bWVzc2FnZSBuYW1lPSJlY2hvRW51bUFycmF5UmVzcG9uc2UiPg0KLSAgICA8cGFydCBuYW1lPSJ4IiBlbGVtZW50PSJkYXRhOmVjaG9FbnVtQXJyYXlSZXNwb25zZSIgLz4NCi0gIDwvbWVzc2FnZT4NCi0NCi0gIDxtZXNzYWdlIG5hbWU9ImVjaG9BbnlUeXBlQXJyYXkiPg0KLSAgICA8cGFydCBuYW1lPSJ4IiBlbGVtZW50PSJkYXRhOmVjaG9BbnlUeXBlQXJyYXkiIC8+DQotICA8L21lc3NhZ2U+DQotICA8bWVzc2FnZSBuYW1lPSJlY2hvQW55VHlwZUFycmF5UmVzcG9uc2UiPg0KLSAgICA8cGFydCBuYW1lPSJ4IiBlbGVtZW50PSJkYXRhOmVjaG9BbnlUeXBlQXJyYXlSZXNwb25zZSIgLz4NCi0gIDwvbWVzc2FnZT4NCi0gIA0KLSAgDQotICAgPG1lc3NhZ2UgbmFtZT0iZWNob1BvbHltb3JwaGljRGF0ZU1lc3NhZ2UiPg0KLSAgICAgIDxwYXJ0IG5hbWU9ImRhdGVSZXF1ZXN0IiBlbGVtZW50PSJkYXRhOmVjaG9Qb2x5bW9ycGhpY0RhdGUiLz4NCi0gICA8L21lc3NhZ2U+DQotICAgDQotICAgPG1lc3NhZ2UgbmFtZT0iZWNob0RhdGVNZXNzYWdlIj4NCi0gICAgICA8cGFydCBuYW1lPSJkYXRlUmVxdWVzdCIgZWxlbWVudD0iZGF0YTplY2hvRGF0ZSIvPg0KLSAgIDwvbWVzc2FnZT4NCi0NCi0gICA8bWVzc2FnZSBuYW1lPSJlY2hvRGF0ZVJlc3BvbnNlTWVzc2FnZSI+DQotICAgICAgPHBhcnQgbmFtZT0iZGF0ZVJlc3BvbnNlIiBlbGVtZW50PSJkYXRhOmVjaG9EYXRlUmVzcG9uc2UiLz4NCi0gICA8L21lc3NhZ2U+DQotDQotICA8IS0tIG9wZXJhdGlvbiAtLT4NCi0gIDxwb3J0VHlwZSBuYW1lPSJHb3JpbGxhSW50ZXJmYWNlIj4NCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvU3RyaW5nIj4NCi0gICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmVjaG9TdHJpbmciIC8+DQotICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6ZWNob1N0cmluZ1Jlc3BvbnNlIiAvPg0KLSAgICAgIDxmYXVsdCBuYW1lPSJhc3NlcnRGYXVsdCIgbWVzc2FnZT0idG5zOmFzc2VydEZhdWx0IiAvPg0KLSAgICA8L29wZXJhdGlvbj4NCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvU3RyaW5nMiI+DQotICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczplY2hvU3RyaW5nMiIgLz4NCi0gICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczplY2hvU3RyaW5nMlJlc3BvbnNlIiAvPg0KLSAgICAgIDxmYXVsdCAgbmFtZT0iYXNzZXJ0RmF1bHQiIG1lc3NhZ2U9InRuczphc3NlcnRGYXVsdCIgLz4NCi0gICAgPC9vcGVyYXRpb24+DQotICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob0ludCI+DQotICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczplY2hvSW50IiAvPg0KLSAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmVjaG9JbnRSZXNwb25zZSIgLz4NCi0gICAgICA8ZmF1bHQgIG5hbWU9ImFzc2VydEZhdWx0IiBtZXNzYWdlPSJ0bnM6YXNzZXJ0RmF1bHQiIC8+DQotICAgIDwvb3BlcmF0aW9uPg0KLSAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9FbnVtIj4NCi0gICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmVjaG9FbnVtIiAvPg0KLSAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmVjaG9FbnVtUmVzcG9uc2UiIC8+DQotICAgICAgPGZhdWx0ICBuYW1lPSJhc3NlcnRGYXVsdCIgbWVzc2FnZT0idG5zOmFzc2VydEZhdWx0IiAvPg0KLSAgICA8L29wZXJhdGlvbj4NCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvQW55VHlwZSI+DQotICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczplY2hvQW55VHlwZSIgLz4NCi0gICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczplY2hvQW55VHlwZVJlc3BvbnNlIiAvPg0KLSAgICAgIDxmYXVsdCAgbmFtZT0iYXNzZXJ0RmF1bHQiIG1lc3NhZ2U9InRuczphc3NlcnRGYXVsdCIgLz4NCi0gICAgPC9vcGVyYXRpb24+DQotDQotICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob1N0cmluZ0xpc3QiPg0KLSAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6ZWNob1N0cmluZ0xpc3QiIC8+DQotICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6ZWNob1N0cmluZ0xpc3RSZXNwb25zZSIgLz4NCi0gICAgICA8ZmF1bHQgIG5hbWU9ImFzc2VydEZhdWx0IiBtZXNzYWdlPSJ0bnM6YXNzZXJ0RmF1bHQiIC8+DQotICAgIDwvb3BlcmF0aW9uPg0KLSAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9TdHJpbmdMaXN0QWx0Ij4NCi0gICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmVjaG9TdHJpbmdMaXN0QWx0IiAvPg0KLSAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmVjaG9TdHJpbmdMaXN0QWx0UmVzcG9uc2UiIC8+DQotICAgICAgPGZhdWx0ICBuYW1lPSJhc3NlcnRGYXVsdCIgbWVzc2FnZT0idG5zOmFzc2VydEZhdWx0IiAvPg0KLSAgICA8L29wZXJhdGlvbj4NCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvU3RyaW5nTGlzdEFzTGlua2VkTGlzdCI+DQotICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczplY2hvU3RyaW5nTGlzdEFzTGlua2VkTGlzdCIgLz4NCi0gICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczplY2hvU3RyaW5nTGlzdEFzTGlua2VkTGlzdFJlc3BvbnNlIiAvPg0KLSAgICAgIDxmYXVsdCAgbmFtZT0iYXNzZXJ0RmF1bHQiIG1lc3NhZ2U9InRuczphc3NlcnRGYXVsdCIgLz4NCi0gICAgPC9vcGVyYXRpb24+DQotICAgDQotICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob1N0cmluZ0xpc3RBcnJheSI+DQotICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczplY2hvU3RyaW5nTGlzdEFycmF5IiAvPg0KLSAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmVjaG9TdHJpbmdMaXN0QXJyYXlSZXNwb25zZSIgLz4NCi0gICAgICA8ZmF1bHQgIG5hbWU9ImFzc2VydEZhdWx0IiBtZXNzYWdlPSJ0bnM6YXNzZXJ0RmF1bHQiIC8+DQotICAgIDwvb3BlcmF0aW9uPg0KLQ0KLSAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9TdHJpbmdBcnJheSI+DQotICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczplY2hvU3RyaW5nQXJyYXkiIC8+DQotICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6ZWNob1N0cmluZ0FycmF5UmVzcG9uc2UiIC8+DQotICAgICAgPGZhdWx0IG5hbWU9ImFzc2VydEZhdWx0IiBtZXNzYWdlPSJ0bnM6YXNzZXJ0RmF1bHQiIC8+DQotICAgIDwvb3BlcmF0aW9uPg0KLSAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9TdHJpbmdBcnJheUFsdCI+DQotICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczplY2hvU3RyaW5nQXJyYXlBbHQiIC8+DQotICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6ZWNob1N0cmluZ0FycmF5QWx0UmVzcG9uc2UiIC8+DQotICAgICAgPGZhdWx0IG5hbWU9ImFzc2VydEZhdWx0IiBtZXNzYWdlPSJ0bnM6YXNzZXJ0RmF1bHQiIC8+DQotICAgIDwvb3BlcmF0aW9uPg0KLQ0KLSAgIDxvcGVyYXRpb24gbmFtZT0iZWNob1N0cmluZ0FycmF5QXNMaW5rZWRMaXN0Ij4NCi0gICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmVjaG9TdHJpbmdBcnJheUFzTGlua2VkTGlzdCIgLz4NCi0gICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczplY2hvU3RyaW5nQXJyYXlBc0xpbmtlZExpc3RSZXNwb25zZSIgLz4NCi0gICAgICA8ZmF1bHQgbmFtZT0iYXNzZXJ0RmF1bHQiIG1lc3NhZ2U9InRuczphc3NlcnRGYXVsdCIgLz4NCi0gICAgPC9vcGVyYXRpb24+DQotDQotDQotICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob0luZGV4ZWRTdHJpbmdBcnJheSI+DQotICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczplY2hvSW5kZXhlZFN0cmluZ0FycmF5IiAvPg0KLSAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmVjaG9JbmRleGVkU3RyaW5nQXJyYXlSZXNwb25zZSIgLz4NCi0gICAgICA8ZmF1bHQgbmFtZT0iYXNzZXJ0RmF1bHQiIG1lc3NhZ2U9InRuczphc3NlcnRGYXVsdCIgLz4NCi0gICAgPC9vcGVyYXRpb24+DQotDQotICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob1N0cmluZzJBcnJheSI+DQotICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczplY2hvU3RyaW5nMkFycmF5IiAvPg0KLSAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmVjaG9TdHJpbmcyQXJyYXlSZXNwb25zZSIgLz4NCi0gICAgICA8ZmF1bHQgIG5hbWU9ImFzc2VydEZhdWx0IiBtZXNzYWdlPSJ0bnM6YXNzZXJ0RmF1bHQiIC8+DQotICAgIDwvb3BlcmF0aW9uPg0KLSAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9JbnRBcnJheSI+DQotICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczplY2hvSW50QXJyYXkiIC8+DQotICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6ZWNob0ludEFycmF5UmVzcG9uc2UiIC8+DQotICAgICAgPGZhdWx0ICBuYW1lPSJhc3NlcnRGYXVsdCIgbWVzc2FnZT0idG5zOmFzc2VydEZhdWx0IiAvPg0KLSAgICA8L29wZXJhdGlvbj4NCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvRW51bUFycmF5Ij4NCi0gICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmVjaG9FbnVtQXJyYXkiIC8+DQotICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6ZWNob0VudW1BcnJheVJlc3BvbnNlIiAvPg0KLSAgICAgIDxmYXVsdCAgbmFtZT0iYXNzZXJ0RmF1bHQiIG1lc3NhZ2U9InRuczphc3NlcnRGYXVsdCIgLz4NCi0gICAgPC9vcGVyYXRpb24+DQotICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob0FueVR5cGVBcnJheSI+DQotICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczplY2hvQW55VHlwZUFycmF5IiAvPg0KLSAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmVjaG9BbnlUeXBlQXJyYXlSZXNwb25zZSIgLz4NCi0gICAgICA8ZmF1bHQgIG5hbWU9ImFzc2VydEZhdWx0IiBtZXNzYWdlPSJ0bnM6YXNzZXJ0RmF1bHQiIC8+DQotICAgIDwvb3BlcmF0aW9uPg0KLSAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9Qb2x5bW9ycGhpY0RhdGUiPg0KLSAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6ZWNob1BvbHltb3JwaGljRGF0ZU1lc3NhZ2UiIC8+DQotICAgIDwvb3BlcmF0aW9uPg0KLQk8b3BlcmF0aW9uIG5hbWU9ImVjaG9EYXRlIj4NCi0gICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmVjaG9EYXRlTWVzc2FnZSIgLz4NCi0gICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczplY2hvRGF0ZVJlc3BvbnNlTWVzc2FnZSIgLz4NCi0JPC9vcGVyYXRpb24+DQotICA8L3BvcnRUeXBlPg0KLQ0KLSAgPCEtLSBiaW5kaW5nIC0tPg0KLSAgPGJpbmRpbmcgbmFtZT0iR29yaWxsYVNPQVAiIHR5cGU9InRuczpHb3JpbGxhSW50ZXJmYWNlIj4NCi0gICAgPHNvYXA6YmluZGluZyB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIgc3R5bGU9ImRvY3VtZW50IiAvPg0KLSAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9TdHJpbmciPg0KLSAgICAgIDxzb2FwOm9wZXJhdGlvbiBzdHlsZT0iZG9jdW1lbnQiIC8+DQotICAgICAgPGlucHV0Pg0KLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+DQotICAgICAgPC9pbnB1dD4NCi0gICAgICA8b3V0cHV0Pg0KLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+DQotICAgICAgPC9vdXRwdXQ+DQotICAgICAgPGZhdWx0IG5hbWU9ImFzc2VydEZhdWx0Ij4NCi0gICAgICAgIDxzb2FwOmZhdWx0IG5hbWU9ImFzc2VydEZhdWx0IiB1c2U9ImxpdGVyYWwiIC8+DQotICAgICAgPC9mYXVsdD4NCi0gICAgPC9vcGVyYXRpb24+DQotICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob1N0cmluZzIiPg0KLSAgICAgIDxzb2FwOm9wZXJhdGlvbiBzdHlsZT0iZG9jdW1lbnQiIC8+DQotICAgICAgPGlucHV0Pg0KLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+DQotICAgICAgPC9pbnB1dD4NCi0gICAgICA8b3V0cHV0Pg0KLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+DQotICAgICAgPC9vdXRwdXQ+DQotICAgICAgPGZhdWx0IG5hbWU9ImFzc2VydEZhdWx0Ij4NCi0gICAgICAgIDxzb2FwOmZhdWx0IG5hbWU9ImFzc2VydEZhdWx0IiB1c2U9ImxpdGVyYWwiIC8+DQotICAgICAgPC9mYXVsdD4NCi0gICAgPC9vcGVyYXRpb24+DQotICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob0ludCI+DQotICAgICAgPHNvYXA6b3BlcmF0aW9uIHN0eWxlPSJkb2N1bWVudCIgLz4NCi0gICAgICA8aW5wdXQ+DQotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0gICAgICA8L2lucHV0Pg0KLSAgICAgIDxvdXRwdXQ+DQotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0gICAgICA8L291dHB1dD4NCi0gICAgICA8ZmF1bHQgbmFtZT0iYXNzZXJ0RmF1bHQiPg0KLSAgICAgICAgPHNvYXA6ZmF1bHQgbmFtZT0iYXNzZXJ0RmF1bHQiIHVzZT0ibGl0ZXJhbCIgLz4NCi0gICAgICA8L2ZhdWx0Pg0KLSAgICA8L29wZXJhdGlvbj4NCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvRW51bSI+DQotICAgICAgPHNvYXA6b3BlcmF0aW9uIHN0eWxlPSJkb2N1bWVudCIgLz4NCi0gICAgICA8aW5wdXQ+DQotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0gICAgICA8L2lucHV0Pg0KLSAgICAgIDxvdXRwdXQ+DQotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0gICAgICA8L291dHB1dD4NCi0gICAgICA8ZmF1bHQgbmFtZT0iYXNzZXJ0RmF1bHQiPg0KLSAgICAgICAgPHNvYXA6ZmF1bHQgbmFtZT0iYXNzZXJ0RmF1bHQiIHVzZT0ibGl0ZXJhbCIgLz4NCi0gICAgICA8L2ZhdWx0Pg0KLSAgICA8L29wZXJhdGlvbj4NCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvQW55VHlwZSI+DQotICAgICAgPHNvYXA6b3BlcmF0aW9uIHN0eWxlPSJkb2N1bWVudCIgLz4NCi0gICAgICA8aW5wdXQ+DQotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0gICAgICA8L2lucHV0Pg0KLSAgICAgIDxvdXRwdXQ+DQotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0gICAgICA8L291dHB1dD4NCi0gICAgICA8ZmF1bHQgbmFtZT0iYXNzZXJ0RmF1bHQiPg0KLSAgICAgICAgPHNvYXA6ZmF1bHQgbmFtZT0iYXNzZXJ0RmF1bHQiIHVzZT0ibGl0ZXJhbCIgLz4NCi0gICAgICA8L2ZhdWx0Pg0KLSAgICA8L29wZXJhdGlvbj4NCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvU3RyaW5nTGlzdCI+DQotICAgICAgPHNvYXA6b3BlcmF0aW9uIHN0eWxlPSJkb2N1bWVudCIgLz4NCi0gICAgICA8aW5wdXQ+DQotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0gICAgICA8L2lucHV0Pg0KLSAgICAgIDxvdXRwdXQ+DQotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0gICAgICA8L291dHB1dD4NCi0gICAgICA8ZmF1bHQgbmFtZT0iYXNzZXJ0RmF1bHQiPg0KLSAgICAgICAgPHNvYXA6ZmF1bHQgbmFtZT0iYXNzZXJ0RmF1bHQiIHVzZT0ibGl0ZXJhbCIgLz4NCi0gICAgICA8L2ZhdWx0Pg0KLSAgICA8L29wZXJhdGlvbj4NCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvU3RyaW5nTGlzdEFsdCI+DQotICAgICAgPHNvYXA6b3BlcmF0aW9uIHN0eWxlPSJkb2N1bWVudCIgLz4NCi0gICAgICA8aW5wdXQ+DQotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0gICAgICA8L2lucHV0Pg0KLSAgICAgIDxvdXRwdXQ+DQotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0gICAgICA8L291dHB1dD4NCi0gICAgICA8ZmF1bHQgbmFtZT0iYXNzZXJ0RmF1bHQiPg0KLSAgICAgICAgPHNvYXA6ZmF1bHQgbmFtZT0iYXNzZXJ0RmF1bHQiIHVzZT0ibGl0ZXJhbCIgLz4NCi0gICAgICA8L2ZhdWx0Pg0KLSAgICA8L29wZXJhdGlvbj4NCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvU3RyaW5nTGlzdEFzTGlua2VkTGlzdCI+DQotICAgICAgPHNvYXA6b3BlcmF0aW9uIHN0eWxlPSJkb2N1bWVudCIgLz4NCi0gICAgICA8aW5wdXQ+DQotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0gICAgICA8L2lucHV0Pg0KLSAgICAgIDxvdXRwdXQ+DQotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0gICAgICA8L291dHB1dD4NCi0gICAgICA8ZmF1bHQgbmFtZT0iYXNzZXJ0RmF1bHQiPg0KLSAgICAgICAgPHNvYXA6ZmF1bHQgbmFtZT0iYXNzZXJ0RmF1bHQiIHVzZT0ibGl0ZXJhbCIgLz4NCi0gICAgICA8L2ZhdWx0Pg0KLSAgICA8L29wZXJhdGlvbj4NCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvU3RyaW5nTGlzdEFycmF5Ij4NCi0gICAgICA8c29hcDpvcGVyYXRpb24gc3R5bGU9ImRvY3VtZW50IiAvPg0KLSAgICAgIDxpbnB1dD4NCi0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPg0KLSAgICAgIDwvaW5wdXQ+DQotICAgICAgPG91dHB1dD4NCi0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPg0KLSAgICAgIDwvb3V0cHV0Pg0KLSAgICAgIDxmYXVsdCBuYW1lPSJhc3NlcnRGYXVsdCI+DQotICAgICAgICA8c29hcDpmYXVsdCBuYW1lPSJhc3NlcnRGYXVsdCIgdXNlPSJsaXRlcmFsIiAvPg0KLSAgICAgIDwvZmF1bHQ+DQotICAgIDwvb3BlcmF0aW9uPg0KLQ0KLSAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9TdHJpbmdBcnJheSI+DQotICAgICAgPHNvYXA6b3BlcmF0aW9uIHN0eWxlPSJkb2N1bWVudCIgLz4NCi0gICAgICA8aW5wdXQ+DQotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0gICAgICA8L2lucHV0Pg0KLSAgICAgIDxvdXRwdXQ+DQotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0gICAgICA8L291dHB1dD4NCi0gICAgICA8ZmF1bHQgbmFtZT0iYXNzZXJ0RmF1bHQiPg0KLSAgICAgICAgPHNvYXA6ZmF1bHQgbmFtZT0iYXNzZXJ0RmF1bHQiIHVzZT0ibGl0ZXJhbCIgLz4NCi0gICAgICA8L2ZhdWx0Pg0KLSAgICA8L29wZXJhdGlvbj4NCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvU3RyaW5nQXJyYXlBbHQiPg0KLSAgICAgIDxzb2FwOm9wZXJhdGlvbiBzdHlsZT0iZG9jdW1lbnQiIC8+DQotICAgICAgPGlucHV0Pg0KLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+DQotICAgICAgPC9pbnB1dD4NCi0gICAgICA8b3V0cHV0Pg0KLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+DQotICAgICAgPC9vdXRwdXQ+DQotICAgICAgPGZhdWx0IG5hbWU9ImFzc2VydEZhdWx0Ij4NCi0gICAgICAgIDxzb2FwOmZhdWx0IG5hbWU9ImFzc2VydEZhdWx0IiB1c2U9ImxpdGVyYWwiIC8+DQotICAgICAgPC9mYXVsdD4NCi0gICAgPC9vcGVyYXRpb24+DQotICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob1N0cmluZ0FycmF5QXNMaW5rZWRMaXN0Ij4NCi0gICAgICA8c29hcDpvcGVyYXRpb24gc3R5bGU9ImRvY3VtZW50IiAvPg0KLSAgICAgIDxpbnB1dD4NCi0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPg0KLSAgICAgIDwvaW5wdXQ+DQotICAgICAgPG91dHB1dD4NCi0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPg0KLSAgICAgIDwvb3V0cHV0Pg0KLSAgICAgIDxmYXVsdCBuYW1lPSJhc3NlcnRGYXVsdCI+DQotICAgICAgICA8c29hcDpmYXVsdCBuYW1lPSJhc3NlcnRGYXVsdCIgdXNlPSJsaXRlcmFsIiAvPg0KLSAgICAgIDwvZmF1bHQ+DQotICAgIDwvb3BlcmF0aW9uPg0KLQ0KLSAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9JbmRleGVkU3RyaW5nQXJyYXkiPg0KLSAgICAgIDxzb2FwOm9wZXJhdGlvbiBzdHlsZT0iZG9jdW1lbnQiIC8+DQotICAgICAgPGlucHV0Pg0KLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+DQotICAgICAgPC9pbnB1dD4NCi0gICAgICA8b3V0cHV0Pg0KLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+DQotICAgICAgPC9vdXRwdXQ+DQotICAgICAgPGZhdWx0IG5hbWU9ImFzc2VydEZhdWx0Ij4NCi0gICAgICAgIDxzb2FwOmZhdWx0IG5hbWU9ImFzc2VydEZhdWx0IiB1c2U9ImxpdGVyYWwiIC8+DQotICAgICAgPC9mYXVsdD4NCi0gICAgPC9vcGVyYXRpb24+DQotDQotICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob1N0cmluZzJBcnJheSI+DQotICAgICAgPHNvYXA6b3BlcmF0aW9uIHN0eWxlPSJkb2N1bWVudCIgLz4NCi0gICAgICA8aW5wdXQ+DQotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0gICAgICA8L2lucHV0Pg0KLSAgICAgIDxvdXRwdXQ+DQotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0gICAgICA8L291dHB1dD4NCi0gICAgICA8ZmF1bHQgbmFtZT0iYXNzZXJ0RmF1bHQiPg0KLSAgICAgICAgPHNvYXA6ZmF1bHQgbmFtZT0iYXNzZXJ0RmF1bHQiIHVzZT0ibGl0ZXJhbCIgLz4NCi0gICAgICA8L2ZhdWx0Pg0KLSAgICA8L29wZXJhdGlvbj4NCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvSW50QXJyYXkiPg0KLSAgICAgIDxzb2FwOm9wZXJhdGlvbiBzdHlsZT0iZG9jdW1lbnQiIC8+DQotICAgICAgPGlucHV0Pg0KLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+DQotICAgICAgPC9pbnB1dD4NCi0gICAgICA8b3V0cHV0Pg0KLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+DQotICAgICAgPC9vdXRwdXQ+DQotICAgICAgPGZhdWx0IG5hbWU9ImFzc2VydEZhdWx0Ij4NCi0gICAgICAgIDxzb2FwOmZhdWx0IG5hbWU9ImFzc2VydEZhdWx0IiB1c2U9ImxpdGVyYWwiIC8+DQotICAgICAgPC9mYXVsdD4NCi0gICAgPC9vcGVyYXRpb24+DQotICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob0VudW1BcnJheSI+DQotICAgICAgPHNvYXA6b3BlcmF0aW9uIHN0eWxlPSJkb2N1bWVudCIgLz4NCi0gICAgICA8aW5wdXQ+DQotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0gICAgICA8L2lucHV0Pg0KLSAgICAgIDxvdXRwdXQ+DQotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0gICAgICA8L291dHB1dD4NCi0gICAgICA8ZmF1bHQgbmFtZT0iYXNzZXJ0RmF1bHQiPg0KLSAgICAgICAgPHNvYXA6ZmF1bHQgbmFtZT0iYXNzZXJ0RmF1bHQiIHVzZT0ibGl0ZXJhbCIgLz4NCi0gICAgICA8L2ZhdWx0Pg0KLSAgICA8L29wZXJhdGlvbj4NCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvQW55VHlwZUFycmF5Ij4NCi0gICAgICA8c29hcDpvcGVyYXRpb24gc3R5bGU9ImRvY3VtZW50IiAvPg0KLSAgICAgIDxpbnB1dD4NCi0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPg0KLSAgICAgIDwvaW5wdXQ+DQotICAgICAgPG91dHB1dD4NCi0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPg0KLSAgICAgIDwvb3V0cHV0Pg0KLSAgICAgIDxmYXVsdCBuYW1lPSJhc3NlcnRGYXVsdCI+DQotICAgICAgICA8c29hcDpmYXVsdCBuYW1lPSJhc3NlcnRGYXVsdCIgdXNlPSJsaXRlcmFsIiAvPg0KLSAgICAgIDwvZmF1bHQ+DQotICAgIDwvb3BlcmF0aW9uPg0KLSAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9EYXRlIj4NCi0gICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+DQotICAgICAgPGlucHV0Pg0KLSAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgPC9pbnB1dD4NCi0gICAgICA8b3V0cHV0Pg0KLSAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgPC9vdXRwdXQ+DQotICAgIDwvb3BlcmF0aW9uPiAgDQotCTxvcGVyYXRpb24gbmFtZT0iZWNob1BvbHltb3JwaGljRGF0ZSI+DQotICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPg0KLSAgICAgIDxpbnB1dD4NCi0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgPC9pbnB1dD4NCi0gICAgPC9vcGVyYXRpb24+DQotIDwvYmluZGluZz4NCi0NCi0gIDxzZXJ2aWNlIG5hbWU9IkdvcmlsbGFTZXJ2aWNlIj4NCi0gICAgPHBvcnQgbmFtZT0iR29yaWxsYVBvcnQiIGJpbmRpbmc9InRuczpHb3JpbGxhU09BUCI+DQotICAgICAgPHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo5MDgwL2F4aXMyL3NlcnZpY2VzL0dvcmlsbGFTZXJ2aWNlIiAvPg0KLSAgICA8L3BvcnQ+DQotICA8L3NlcnZpY2U+DQotPC9kZWZpbml0aW9ucz4NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy93c2RsL3Jlc291cmNlaW5qZWN0aW9uLndzZGwgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy93c2RsL3Jlc291cmNlaW5qZWN0aW9uLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3YTUxMDIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9yZXNvdXJjZWluamVjdGlvbi53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi0NCi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08d3NkbDpkZWZpbml0aW9ucyB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiB4bWxuczp0bnM9Imh0dHA6Ly9yZXNvdXJjZWluamVjdGlvbi5zYW1wbGUudGVzdC5vcmciIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiBuYW1lPSJSZXNvdXJjZUluamVjdGlvbiIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vcmVzb3VyY2VpbmplY3Rpb24uc2FtcGxlLnRlc3Qub3JnIj4NCi0gIDx3c2RsOnR5cGVzPg0KLSAgICA8eHNkOnNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9yZXNvdXJjZWluamVjdGlvbi5zYW1wbGUudGVzdC5vcmciIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPg0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlY2hvUmVzcG9uc2UiPg0KLSAgICAgIAk8eHNkOmNvbXBsZXhUeXBlPg0KLSAgICAgIAkJPHhzZDpzZXF1ZW5jZT4NCi0gICAgICAJCQk8eHNkOmVsZW1lbnQgbmFtZT0icmVzcG9uc2UiIHR5cGU9InhzZDpzdHJpbmciPjwveHNkOmVsZW1lbnQ+DQotICAgICAgCQk8L3hzZDpzZXF1ZW5jZT4NCi0gICAgICAJPC94c2Q6Y29tcGxleFR5cGU+DQotICAgICAgPC94c2Q6ZWxlbWVudD4NCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWNobyI+DQotICAgICAgCTx4c2Q6Y29tcGxleFR5cGU+DQotICAgICAgCQk8eHNkOnNlcXVlbmNlPg0KLSAgICAgIAkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJhcmciIHR5cGU9InhzZDpzdHJpbmciPjwveHNkOmVsZW1lbnQ+DQotICAgICAgCQk8L3hzZDpzZXF1ZW5jZT4NCi0gICAgICAJPC94c2Q6Y29tcGxleFR5cGU+DQotICAgICAgPC94c2Q6ZWxlbWVudD4NCi0gICAgPC94c2Q6c2NoZW1hPg0KLSAgPC93c2RsOnR5cGVzPg0KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJlY2hvUmVzcG9uc2UiPg0KLSAgICA8d3NkbDpwYXJ0IGVsZW1lbnQ9InRuczplY2hvUmVzcG9uc2UiIG5hbWU9ImVjaG9SZXNwb25zZSIvPg0KLSAgPC93c2RsOm1lc3NhZ2U+DQotICA8d3NkbDptZXNzYWdlIG5hbWU9ImVjaG8iPg0KLSAgICA8d3NkbDpwYXJ0IGVsZW1lbnQ9InRuczplY2hvIiBuYW1lPSJlY2hvIi8+DQotICA8L3dzZGw6bWVzc2FnZT4NCi0gIDx3c2RsOnBvcnRUeXBlIG5hbWU9IlJlc291cmNlSW5qZWN0aW9uUG9ydFR5cGUiPg0KLSAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iZWNobyI+DQotICAgICAgPHdzZGw6aW5wdXQgbWVzc2FnZT0idG5zOmVjaG8iLz4NCi0gICAgICA8d3NkbDpvdXRwdXQgbWVzc2FnZT0idG5zOmVjaG9SZXNwb25zZSIvPg0KLSAgICA8L3dzZGw6b3BlcmF0aW9uPg0KLSAgPC93c2RsOnBvcnRUeXBlPg0KLSAgPHdzZGw6YmluZGluZyBuYW1lPSJSZXNvdXJjZUluamVjdGlvbkJpbmRpbmciIHR5cGU9InRuczpSZXNvdXJjZUluamVjdGlvblBvcnRUeXBlIj4NCi0gICAgPHNvYXA6YmluZGluZyBzdHlsZT0iZG9jdW1lbnQiIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIi8+DQotICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJlY2hvIj4NCi0gICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3Jlc291cmNlaW5qZWN0aW9uLnNhbXBsZS50ZXN0Lm9yZy9OZXdPcGVyYXRpb24iLz4NCi0gICAgICA8d3NkbDppbnB1dD4NCi0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgPC93c2RsOmlucHV0Pg0KLSAgICAgIDx3c2RsOm91dHB1dD4NCi0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgPC93c2RsOm91dHB1dD4NCi0gICAgPC93c2RsOm9wZXJhdGlvbj4NCi0gIDwvd3NkbDpiaW5kaW5nPg0KLSAgPHdzZGw6c2VydmljZSBuYW1lPSJSZXNvdXJjZUluamVjdGlvblNlcnZpY2UiPg0KLSAgICA8d3NkbDpwb3J0IGJpbmRpbmc9InRuczpSZXNvdXJjZUluamVjdGlvbkJpbmRpbmciIG5hbWU9IlJlc291cmNlSW5qZWN0aW9uUG9ydCI+DQotICAgICAgPHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo2MDYwL2F4aXMyL3NlcnZpY2VzL1Jlc291cmNlSW5qZWN0aW9uU2VydmljZSIvPg0KLSAgICA8L3dzZGw6cG9ydD4NCi0gIDwvd3NkbDpzZXJ2aWNlPg0KLTwvd3NkbDpkZWZpbml0aW9ucz4NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy93c2RsL3JwY2xpdGVudW0ud3NkbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3dzZGwvcnBjbGl0ZW51bS53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDZiMzA1Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3dzZGwvcnBjbGl0ZW51bS53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi0NCi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08d3NkbDpkZWZpbml0aW9ucyB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9ycGNsaXQudGVzdC5vcmciDQotICB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIgDQotICB4bWxuczp0bnM9Imh0dHA6Ly9ycGNsaXQudGVzdC5vcmciIA0KLSAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgDQotICB4bWxuczp3c2Rsc29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIgDQotICB4bWxuczppbnRmPSJodHRwOi8vc2NoZW1hLnJwY2xpdC50ZXN0Lm9yZyIgDQotICB4bWxuczppbXBsPSJodHRwOi8vc2NoZW1hLnJwY2xpdC50ZXN0Lm9yZyIgDQotICB4bWxuczphcGFjaGVzb2FwPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveG1sLXNvYXAiIA0KLSAgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4NCi0NCi0gIDx0eXBlcz4NCi0gICAgPHNjaGVtYSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIA0KLSAgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3NjaGVtYS5ycGNsaXQudGVzdC5vcmciIA0KLSAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPg0KLSAgICAgIDwhLS0gPGVsZW1lbnQgbmFtZT0iZWxlbWVudFN0cmluZyI+IC0tPg0KLSAgICAgICAgPHNpbXBsZVR5cGUgbmFtZT0iZWxlbWVudFN0cmluZyI+DQotICAgICAgICAgIDxyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4NCi0gICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IkEiLz4NCi0gICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IkIiLz4NCi0gICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IkMiLz4NCi0gICAgICAgICAgPC9yZXN0cmljdGlvbj4NCi0gICAgICAgIDwvc2ltcGxlVHlwZT4NCi0gICAgICA8IS0tIDwvZWxlbWVudD4gLS0+DQotICAgIDwvc2NoZW1hPg0KLSAgPC90eXBlcz4NCi0NCi0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0iZWNob1N0cmluZ1JlcXVlc3QiPg0KLSAgICA8d3NkbDpwYXJ0IG5hbWU9InBTdHJpbmciIHR5cGU9ImludGY6ZWxlbWVudFN0cmluZyIvPg0KLSAgPC93c2RsOm1lc3NhZ2U+DQotICA8d3NkbDptZXNzYWdlIG5hbWU9ImVjaG9TdHJpbmdSZXNwb25zZSI+DQotICAgIDx3c2RsOnBhcnQgbmFtZT0icFN0cmluZyIgdHlwZT0iaW50ZjplbGVtZW50U3RyaW5nIi8+DQotICA8L3dzZGw6bWVzc2FnZT4NCi0NCi0gIDx3c2RsOnBvcnRUeXBlIG5hbWU9IlBvcnRUeXBlIj4NCi0gICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImVjaG9TdHJpbmciPg0KLSAgICAgIDx3c2RsOmlucHV0IG5hbWU9ImVjaG9TdHJpbmdSZXF1ZXN0IiBtZXNzYWdlPSJ0bnM6ZWNob1N0cmluZ1JlcXVlc3QiLz4NCi0gICAgICA8d3NkbDpvdXRwdXQgbmFtZT0iZWNob1N0cmluZ1Jlc3BvbnNlIiBtZXNzYWdlPSJ0bnM6ZWNob1N0cmluZ1Jlc3BvbnNlIi8+DQotICAgIDwvd3NkbDpvcGVyYXRpb24+DQotICA8L3dzZGw6cG9ydFR5cGU+DQotDQotICA8d3NkbDpiaW5kaW5nIG5hbWU9IkJpbmRpbmciIHR5cGU9InRuczpQb3J0VHlwZSI+DQotICAgIDx3c2Rsc29hcDpiaW5kaW5nIHN0eWxlPSJycGMiIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIi8+DQotICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJlY2hvU3RyaW5nIj4NCi0gICAgICA8d3NkbHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPg0KLSAgICAgIDx3c2RsOmlucHV0IG5hbWU9ImVjaG9TdHJpbmdSZXF1ZXN0Ij4NCi0gICAgICAgIDx3c2Rsc29hcDpib2R5DQotICAgICAgICAgIG5hbWVzcGFjZT0iaHR0cDovL3JwY2xpdC50ZXN0Lm9yZyINCi0gICAgICAgICAgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgPC93c2RsOmlucHV0Pg0KLSAgICAgIDx3c2RsOm91dHB1dCBuYW1lPSJlY2hvU3RyaW5nUmVzcG9uc2UiPg0KLSAgICAgICAgPHdzZGxzb2FwOmJvZHkNCi0gICAgICAgICAgbmFtZXNwYWNlPSJodHRwOi8vcnBjbGl0LnRlc3Qub3JnIg0KLSAgICAgICAgICB1c2U9ImxpdGVyYWwiLz4NCi0gICAgICA8L3dzZGw6b3V0cHV0Pg0KLSAgICA8L3dzZGw6b3BlcmF0aW9uPg0KLSAgPC93c2RsOmJpbmRpbmc+DQotDQotICA8d3NkbDpzZXJ2aWNlIG5hbWU9IlNlcnZpY2UiPg0KLSAgICA8d3NkbDpwb3J0IG5hbWU9IlBvcnQiIGJpbmRpbmc9InRuczpCaW5kaW5nIj4NCi0gICAgICA8d3NkbHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo2MDYwL2F4aXMyL3NlcnZpY2VzL1JQQ0xpdEVudW1TZXJ2aWNlIi8+DQotICAgIDwvd3NkbDpwb3J0Pg0KLSAgPC93c2RsOnNlcnZpY2U+DQotDQotICANCi08L3dzZGw6ZGVmaW5pdGlvbnM+DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9ycGNsaXRzdHJpbmdhcnJheS53c2RsIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9ycGNsaXRzdHJpbmdhcnJheS53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWJhMWQ1Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3dzZGwvcnBjbGl0c3RyaW5nYXJyYXkud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLTw/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+DQotICAgIDwvcG9ydD4NCi0gIDwvc2VydmljZT4NCi08L2RlZmluaXRpb25zPg0KLQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3dzZGwvc2FtcGxlbXRvbWpwZWcud3NkbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3dzZGwvc2FtcGxlbXRvbWpwZWcud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWI2Y2I1Ny4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy93c2RsL3NhbXBsZW10b21qcGVnLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08IS0tDQotTmFtZTogc2FtcGxlbXRvbWpwZWcud3NkbA0KLS0tPg0KLTxkZWZpbml0aW9ucyB4bWxuczpodHRwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL2h0dHAvIiANCi0gICAgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIgDQotICAgIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgDQotICAgIHhtbG5zOnNvYXBlbmM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIiAgDQotICAgIHhtbG5zOm1pbWU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvbWltZS8iIA0KLSAgICB4bWxuczpzMD0idXJuOi8vbXRvbTEuc2FtcGxlLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciDQotICAgIHRhcmdldE5hbWVzcGFjZT0idXJuOi8vbXRvbTEuc2FtcGxlLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciDQotICAgIHhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+DQotICAgIA0KLSAgPHR5cGVzPg0KLSAgIDx4czpzY2hlbWEgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiDQotICAgIHhtbG5zOnhtaW1lPSJodHRwOi8vd3d3LnczLm9yZy8yMDA1LzA1L3htbG1pbWUiDQotICAgIHhtbG5zOnRucz0idXJuOi8vbXRvbTEuc2FtcGxlLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciDQotICAgIHRhcmdldE5hbWVzcGFjZT0idXJuOi8vbXRvbTEuc2FtcGxlLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciPg0KLSAgICANCi0gICAgPHhzOmltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDUveG1sbWltZSINCi0gICAgICAgICAgICAgICBzY2hlbWFMb2NhdGlvbj0iLi4veHNkL3htbG1pbWUueHNkIi8+DQotICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJJbWFnZURlcG90Ij4NCi0gICAgICAgPHhzOnNlcXVlbmNlPg0KLSAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iaW1hZ2VEYXRhIiANCi0gICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzOmJhc2U2NEJpbmFyeSIgICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgICAgICAgIHhtaW1lOmV4cGVjdGVkQ29udGVudFR5cGVzPSJpbWFnZS9qcGVnIi8+DQotICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0idGV4dERhdGEiIA0KLSAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieG1pbWU6YmFzZTY0QmluYXJ5IiAgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICAgICAgICAgeG1pbWU6Y29udGVudFR5cGU9InRleHQveG1sIi8+DQotICAgICAgICAgIA0KLSAgICAgICA8L3hzOnNlcXVlbmNlPg0KLSAgICA8L3hzOmNvbXBsZXhUeXBlPg0KLSAgICANCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0iaW52b2tlIj4NCi0gICAgICAgPHhzOmNvbXBsZXhUeXBlPg0KLSAgICAgICAgICA8eHM6c2VxdWVuY2U+DQotICAgICAgICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJpbnB1dCIgdHlwZT0idG5zOkltYWdlRGVwb3QiLz4NCi0gICAgICAgICAgPC94czpzZXF1ZW5jZT4NCi0gICAgICAgPC94czpjb21wbGV4VHlwZT4NCi0gICAgPC94czplbGVtZW50Pg0KLSAgICANCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0ic2VuZEltYWdlUmVzcG9uc2UiPg0KLSAgICAgICA8eHM6Y29tcGxleFR5cGU+DQotICAgICAgICAgIDx4czpzZXF1ZW5jZT4NCi0gICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9Im91dHB1dCIgdHlwZT0idG5zOkltYWdlRGVwb3QiLz4NCi0gICAgICAgICAgPC94czpzZXF1ZW5jZT4NCi0gICAgICAgPC94czpjb21wbGV4VHlwZT4NCi0gICAgPC94czplbGVtZW50Pg0KLSAgICANCi0gICA8L3hzOnNjaGVtYT4NCi0gIDwvdHlwZXM+DQotDQotICA8bWVzc2FnZSBuYW1lPSJlbXB0eU1lc3NhZ2UiLz4NCi0gIDxtZXNzYWdlIG5hbWU9InNlbmRJbWFnZSI+DQotICAgIDxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9InMwOmludm9rZSIgLz4NCi0gIDwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIG5hbWU9InNlbmRJbWFnZVJlc3BvbnNlIj4NCi0gICAgPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iczA6c2VuZEltYWdlUmVzcG9uc2UiIC8+DQotICA8L21lc3NhZ2U+DQotDQotICA8cG9ydFR5cGUgbmFtZT0ic2VuZEltYWdlSW50ZXJmYWNlIj4NCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJpbnZva2UiPg0KLSAgICAgIDxpbnB1dCBtZXNzYWdlPSJzMDpzZW5kSW1hZ2UiIC8+DQotICAgICAgPG91dHB1dCBtZXNzYWdlPSJzMDpzZW5kSW1hZ2VSZXNwb25zZSIgLz4NCi0gICAgPC9vcGVyYXRpb24+ICANCi0gIDwvcG9ydFR5cGU+DQotDQotICA8YmluZGluZyBuYW1lPSJzZW5kSW1hZ2VTb2FwIiB0eXBlPSJzMDpzZW5kSW1hZ2VJbnRlcmZhY2UiPg0KLSAgICA8c29hcDpiaW5kaW5nIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIiBzdHlsZT0iZG9jdW1lbnQiIC8+DQotICAgIDxvcGVyYXRpb24gbmFtZT0iaW52b2tlIj4NCi0gICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0ic2VuZEltYWdlIiBzdHlsZT0iZG9jdW1lbnQiIC8+DQotICAgICAgPGlucHV0Pg0KLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+DQotICAgICAgPC9pbnB1dD4NCi0gICAgICA8b3V0cHV0Pg0KLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+DQotICAgICAgPC9vdXRwdXQ+DQotICAgIDwvb3BlcmF0aW9uPg0KLSAgPC9iaW5kaW5nPg0KLQ0KLSAgPHNlcnZpY2UgbmFtZT0iU2VuZEltYWdlU2VydmljZSI+DQotICAgIDxwb3J0IG5hbWU9IlNlbmRJbWFnZVBvcnQiIGJpbmRpbmc9InMwOnNlbmRJbWFnZVNvYXAiPg0KLSAgICAgIDxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6OTA4MC9NVE9NQnl0ZUFycmF5L1NlbmRJbWFnZVNlcnZpY2UiIC8+DQotICAgIDwvcG9ydD4NCi0gIDwvc2VydmljZT4NCi0NCi08L2RlZmluaXRpb25zPg0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3dzZGwvc2hhcGVzLndzZGwgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy93c2RsL3NoYXBlcy53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzhiNzc4Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3dzZGwvc2hhcGVzLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi0NCi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08d3NkbDpkZWZpbml0aW9ucw0KLQl0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9zZWkuc2hhcGUucG9seW1vcnBoaWMuamF4d3MuYXhpczIuYXBhY2hlLm9yZyINCi0JeG1sbnM9Imh0dHA6Ly9zZWkuc2hhcGUucG9seW1vcnBoaWMuamF4d3MuYXhpczIuYXBhY2hlLm9yZyINCi0JDQotCXhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIg0KLQl4bWxuczp0bnM9Imh0dHA6Ly9zZWkuc2hhcGUucG9seW1vcnBoaWMuamF4d3MuYXhpczIuYXBhY2hlLm9yZyINCi0JeG1sbnM6dG5zMT0iaHR0cDovL3NoYXBlLnRlc3Qub3JnIg0KLQl4bWxuczp0bnMyPSJodHRwOi8vdGhyZWVkLnNoYXBlLnRlc3Qub3JnIg0KLQl4bWxuczp0bnMzPSJodHRwOi8vd3JhcHBlci5zaGFwZS50ZXN0Lm9yZyINCi0JeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSINCi0JDQotCXhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iPg0KLQ0KLQk8d3NkbDp0eXBlcz4NCi0JICAgIDx4c2Q6c2NoZW1hPg0KLQkJICAgICAgPHhzZDppbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vc2hhcGUudGVzdC5vcmciDQotCQkgICAgICAgICAgICAgICAgICBzY2hlbWFMb2NhdGlvbj0iLi4veHNkL3NoYXBlLnhzZCIvPg0KLQkJICAgICAgPHhzZDppbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vdGhyZWVkLnNoYXBlLnRlc3Qub3JnIg0KLQkJICAgICAgICAgICAgICAgICAgc2NoZW1hTG9jYXRpb249Ii4uL3hzZC8zRFNoYXBlLnhzZCIvPg0KLQkJICAgICAgPHhzZDppbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vd3JhcHBlci5zaGFwZS50ZXN0Lm9yZyINCi0JCSAgICAgICAgICAgICAgICAgIHNjaGVtYUxvY2F0aW9uPSIuLi94c2Qvc2hhcGVfd3JhcHBlcnMueHNkIi8+DQotCSAgICA8L3hzZDpzY2hlbWE+DQotCSAgICANCi0JPC93c2RsOnR5cGVzPg0KLQk8d3NkbDptZXNzYWdlIG5hbWU9ImRyYXczRFJlcXVlc3QiPg0KLQkJPHdzZGw6cGFydCBuYW1lPSJyZXF1ZXN0IiBlbGVtZW50PSJ0bnMzOmRyYXczRCI+DQotCQk8L3dzZGw6cGFydD4NCi0JPC93c2RsOm1lc3NhZ2U+DQotCQ0KLQk8d3NkbDptZXNzYWdlIG5hbWU9ImRyYXdSZXF1ZXN0Ij4NCi0JCTx3c2RsOnBhcnQgbmFtZT0icmVxdWVzdCIgZWxlbWVudD0idG5zMzpkcmF3Ij4NCi0JCTwvd3NkbDpwYXJ0Pg0KLQk8L3dzZGw6bWVzc2FnZT4NCi0JDQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0iZHJhd1Jlc3BvbnNlIj4NCi0JCTx3c2RsOnBhcnQgbmFtZT0idHlwZXNRTmFtZVJlc3BvbnNlIiBlbGVtZW50PSJ0bnMzOmRyYXdSZXNwb25zZSI+DQotCQk8L3dzZGw6cGFydD4NCi0JPC93c2RsOm1lc3NhZ2U+DQotCQ0KLQk8d3NkbDpwb3J0VHlwZSBuYW1lPSJQb2x5bW9ycGhpY1NoYXBlUG9ydFR5cGUiPg0KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImRyYXciPg0KLQkJCTx3c2RsOmlucHV0IG1lc3NhZ2U9InRuczpkcmF3UmVxdWVzdCIgLz4NCi0JCQk8d3NkbDpvdXRwdXQgbWVzc2FnZT0idG5zOmRyYXdSZXNwb25zZSIgLz4NCi0JCTwvd3NkbDpvcGVyYXRpb24+DQotCQ0KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImRyYXczRCI+DQotCQkJPHdzZGw6aW5wdXQgbWVzc2FnZT0idG5zOmRyYXczRFJlcXVlc3QiIC8+DQotCQkJPHdzZGw6b3V0cHV0IG1lc3NhZ2U9InRuczpkcmF3UmVzcG9uc2UiIC8+DQotCQk8L3dzZGw6b3BlcmF0aW9uPg0KLQk8L3dzZGw6cG9ydFR5cGU+DQotCQ0KLQk8d3NkbDpiaW5kaW5nIG5hbWU9IlBvbHltb3JwaGljU2hhcGVCaW5kaW5nIiB0eXBlPSJ0bnM6UG9seW1vcnBoaWNTaGFwZVBvcnRUeXBlIj4NCi0JCTxzb2FwOmJpbmRpbmcgc3R5bGU9ImRvY3VtZW50Ig0KLQkJCXRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIiAvPg0KLQ0KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImRyYXciPgkJCQ0KLQkJCTxzb2FwOm9wZXJhdGlvbg0KLQkJCQlzb2FwQWN0aW9uPSJodHRwOi8vc2VpLnBvbHltb3JwaGljc2hhcGUuamF4d3MuYXhpczIuYXBhY2hlLm9yZy9kcmF3IiAvPg0KLQkJCTx3c2RsOmlucHV0Pg0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0JCQk8L3dzZGw6aW5wdXQ+DQotCQkJPHdzZGw6b3V0cHV0Pg0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0JCQk8L3dzZGw6b3V0cHV0Pg0KLQkJPC93c2RsOm9wZXJhdGlvbj4NCi0JCQ0KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImRyYXczRCI+DQotCQkJPHNvYXA6b3BlcmF0aW9uDQotCQkJCXNvYXBBY3Rpb249Imh0dHA6Ly9zZWkucG9seW1vcnBoaWNzaGFwZS5qYXh3cy5heGlzMi5hcGFjaGUub3JnL2RyYXczRCIgLz4NCi0JCQk8d3NkbDppbnB1dD4NCi0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+DQotCQkJPC93c2RsOmlucHV0Pg0KLQkJCTx3c2RsOm91dHB1dD4NCi0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+DQotCQkJPC93c2RsOm91dHB1dD4NCi0JCTwvd3NkbDpvcGVyYXRpb24+DQotCTwvd3NkbDpiaW5kaW5nPg0KLQkNCi0JPHdzZGw6c2VydmljZSBuYW1lPSJQb2x5bW9ycGhpY1NoYXBlU2VydmljZSI+DQotCQk8d3NkbDpwb3J0IG5hbWU9IlBvbHltb3JwaGljU2hhcGVQb3J0Ig0KLQkJCWJpbmRpbmc9InRuczpQb2x5bW9ycGhpY1NoYXBlQmluZGluZyI+DQotCQkJPHNvYXA6YWRkcmVzcw0KLQkJCQlsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo2MDYwL2F4aXMyL3NlcnZpY2VzL1BvbHltb3JwaGljU2hhcGVTZXJ2aWNlIiAvPg0KLQkJPC93c2RsOnBvcnQ+DQotCTwvd3NkbDpzZXJ2aWNlPg0KLQkNCi08L3dzZGw6ZGVmaW5pdGlvbnM+DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9zd2FtdG9tc2VydmljZS53c2RsIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9zd2FtdG9tc2VydmljZS53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjA2MWU2Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3dzZGwvc3dhbXRvbXNlcnZpY2Uud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDE3OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLTx3c2RsOmRlZmluaXRpb25zDQotCXRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3N3YW10b21zZXJ2aWNlLnRlc3Qub3JnIg0KLQl4bWxucz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iDQotCXhtbG5zOm1pbWU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvbWltZS8iDQotCXhtbG5zOnRucz0iaHR0cDovL3N3YW10b21zZXJ2aWNlLnRlc3Qub3JnIg0KLQl4bWxuczp0eXBlbnM9Imh0dHA6Ly9zd2FtdG9tc2VydmljZS50eXBlcy50ZXN0Lm9yZyINCi0JeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iDQotCXhtbG5zOndzZGxzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIg0KLQl4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4NCi0JIDx3c2RsOnR5cGVzPg0KLQkJPHhzZDpzY2hlbWENCi0JCSAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIg0KLQkJICB4bWxuczp0bnM9Imh0dHA6Ly9zd2FtdG9tc2VydmljZS50eXBlcy50ZXN0Lm9yZyINCi0JCSAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vc3dhbXRvbXNlcnZpY2UudHlwZXMudGVzdC5vcmciPg0KLQ0KLQkJPGVsZW1lbnQgbmFtZT0ibXRvbUF0dGFjaG1lbnQiID4NCi0JCQk8Y29tcGxleFR5cGU+DQotCQkJCTxzZXF1ZW5jZT4NCi0JCQkJCTxlbGVtZW50IG5hbWU9Im1lc3NhZ2UiIHR5cGU9InhzZDpiYXNlNjRCaW5hcnkiIC8+DQotCQkJCTwvc2VxdWVuY2U+DQotCQkJPC9jb21wbGV4VHlwZT4NCi0JCTwvZWxlbWVudD4NCi0NCi0JCTxlbGVtZW50IG5hbWU9Im10b21BdHRhY2htZW50UmVzcG9uc2UiID4NCi0JCQk8Y29tcGxleFR5cGU+DQotCQkJCTxzZXF1ZW5jZT4NCi0JCQkJCTxlbGVtZW50IG5hbWU9Im1lc3NhZ2UiIHR5cGU9InhzZDpiYXNlNjRCaW5hcnkiIC8+DQotCQkJCTwvc2VxdWVuY2U+DQotCQkJPC9jb21wbGV4VHlwZT4NCi0JCTwvZWxlbWVudD4NCi0JCTwveHNkOnNjaGVtYT4NCi0JPC93c2RsOnR5cGVzPg0KLQ0KLQ0KLSAgPCEtLSBhdHRhY2htZW50Li4ubm90ZSBubyBib2R5IHBhcnQgLS0+DQotICA8d3NkbDptZXNzYWdlIG5hbWU9InN3YUF0dGFjaG1lbnRSZXF1ZXN0Ij4NCi0gICAgPHBhcnQgbmFtZT0ianBlZ0ltYWdlUmVxdWVzdCIgdHlwZT0ieHNkOmhleEJpbmFyeSIvPg0KLSAgPC93c2RsOm1lc3NhZ2U+DQotICA8d3NkbDptZXNzYWdlIG5hbWU9InN3YUF0dGFjaG1lbnRSZXNwb25zZSI+DQotICAgIDxwYXJ0IG5hbWU9ImpwZWdJbWFnZVJlc3BvbnNlIiB0eXBlPSJ4c2Q6aGV4QmluYXJ5Ii8+DQotICA8L3dzZGw6bWVzc2FnZT4NCi0NCi0gIA0KLSAgPCEtLSB0d28gYXR0YWNobWVudHMuLi5hbmQgbm8gYm9keSBwYXJ0IC0tPg0KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJzd2FBdHRhY2htZW50MlJlcXVlc3QiPg0KLSAgICA8cGFydCBuYW1lPSJqcGVnSW1hZ2UxUmVxdWVzdCIgdHlwZT0ieHNkOmhleEJpbmFyeSIvPg0KLSAgICA8cGFydCBuYW1lPSJqcGVnSW1hZ2UyUmVxdWVzdCIgdHlwZT0ieHNkOmhleEJpbmFyeSIvPg0KLSAgPC93c2RsOm1lc3NhZ2U+DQotICA8d3NkbDptZXNzYWdlIG5hbWU9InN3YUF0dGFjaG1lbnQyUmVzcG9uc2UiPg0KLSAgICA8cGFydCBuYW1lPSJqcGVnSW1hZ2UxUmVzcG9uc2UiIHR5cGU9InhzZDpoZXhCaW5hcnkiLz4NCi0gICAgPHBhcnQgbmFtZT0ianBlZ0ltYWdlMlJlc3BvbnNlIiB0eXBlPSJ4c2Q6aGV4QmluYXJ5Ii8+DQotICA8L3dzZGw6bWVzc2FnZT4NCi0gIA0KLQ0KLSAgIDwhLS0gbXRvbSAtLT4NCi0NCi0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0ibXRvbUF0dGFjaG1lbnRSZXF1ZXN0Ij4NCi0gICAgPHBhcnQgbmFtZT0ibXRvbV9pbiIgZWxlbWVudD0idHlwZW5zOm10b20iLz4NCi0gIDwvd3NkbDptZXNzYWdlPg0KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJtdG9tQXR0YWNobWVudFJlc3BvbnNlIj4NCi0gICAgPHBhcnQgbmFtZT0ibXRvbV9vdXQiIGVsZW1lbnQ9InR5cGVuczptdG9tUmVzcG9uc2UiLz4NCi0gIDwvd3NkbDptZXNzYWdlPg0KLQ0KLSAgIDx3c2RsOnBvcnRUeXBlIG5hbWU9IlNXQU1UT01Qb3J0VHlwZSI+DQotICAgICAgDQotICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InN3YUF0dGFjaG1lbnQiPg0KLSAgICAgICAgIDx3c2RsOmlucHV0IG1lc3NhZ2U9InRuczpzd2FBdHRhY2htZW50UmVxdWVzdCIgLz4NCi0gICAgICAgICA8d3NkbDpvdXRwdXQgbWVzc2FnZT0idG5zOnN3YUF0dGFjaG1lbnRSZXNwb25zZSIgLz4NCi0gICAgICA8L3dzZGw6b3BlcmF0aW9uPg0KLSAgICAgIA0KLSAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJzd2FBdHRhY2htZW50MiI+DQotICAgICAgICAgPHdzZGw6aW5wdXQgbWVzc2FnZT0idG5zOnN3YUF0dGFjaG1lbnQyUmVxdWVzdCIgLz4NCi0gICAgICAgICA8d3NkbDpvdXRwdXQgbWVzc2FnZT0idG5zOnN3YUF0dGFjaG1lbnQyUmVzcG9uc2UiIC8+DQotICAgICAgPC93c2RsOm9wZXJhdGlvbj4NCi0gICAgICANCi0gICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0ibXRvbUF0dGFjaG1lbnQiPg0KLSAgICAgICAgIDx3c2RsOmlucHV0IG1lc3NhZ2U9InRuczptdG9tQXR0YWNobWVudFJlcXVlc3QiIC8+DQotDQotICAgICAgICAgPHdzZGw6b3V0cHV0IG1lc3NhZ2U9InRuczptdG9tQXR0YWNobWVudFJlc3BvbnNlIiAvPg0KLQ0KLSAgICAgIDwvd3NkbDpvcGVyYXRpb24+DQotICAgPC93c2RsOnBvcnRUeXBlPg0KLQ0KLSAgIDx3c2RsOmJpbmRpbmcgbmFtZT0iU1dBTVRPTUJpbmRpbmciIHR5cGU9InRuczpTV0FNVE9NUG9ydFR5cGUiPg0KLSAgICAgIDx3c2Rsc29hcDpiaW5kaW5nIHN0eWxlPSJkb2N1bWVudCIgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiLz4NCi0gICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0ic3dhQXR0YWNobWVudCI+DQotICAgICAgICA8d3NkbHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249InN3YUF0dGFjaG1lbnQiLz4NCi0gICAgICAgIDx3c2RsOmlucHV0ID4NCi0gICAgICAgICAgPG1pbWU6bXVsdGlwYXJ0UmVsYXRlZD4NCi0gICAgICAgICAgICA8bWltZTpwYXJ0Pg0KLSAgICAgICAgICAgICAgPHdzZGxzb2FwOmJvZHkgcGFydHM9IiIgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgICAgICAgPC9taW1lOnBhcnQ+DQotDQotICAgICAgICAgICAgPG1pbWU6cGFydD4NCi0gICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgcGFydD0ianBlZ0ltYWdlUmVxdWVzdCIgdHlwZT0idGV4dC9wbGFpbiIvPg0KLSAgICAgICAgICAgIDwvbWltZTpwYXJ0Pg0KLSAgICAgICAgICA8L21pbWU6bXVsdGlwYXJ0UmVsYXRlZD4NCi0gICAgICAgIDwvd3NkbDppbnB1dD4NCi0gICAgICAgIDx3c2RsOm91dHB1dCA+DQotICAgICAgICAgIDxtaW1lOm11bHRpcGFydFJlbGF0ZWQ+DQotICAgICAgICAgICAgPG1pbWU6cGFydD4NCi0gICAgICAgICAgICAgIDx3c2Rsc29hcDpib2R5IHBhcnRzPSIiIHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgICAgICAgIDwvbWltZTpwYXJ0Pg0KLSAgICAgICAgICAgIDxtaW1lOnBhcnQ+DQotICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHBhcnQ9ImpwZWdJbWFnZVJlc3BvbnNlIiB0eXBlPSJ0ZXh0L3BsYWluIi8+DQotICAgICAgICAgICAgPC9taW1lOnBhcnQ+DQotICAgICAgICAgIDwvbWltZTptdWx0aXBhcnRSZWxhdGVkPg0KLSAgICAgICAgPC93c2RsOm91dHB1dD4NCi0gICAgICA8L3dzZGw6b3BlcmF0aW9uPg0KLSAgICAgIA0KLSAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJzd2FBdHRhY2htZW50MiI+DQotICAgICAgICA8d3NkbHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249InN3YUF0dGFjaG1lbnQyIi8+DQotICAgICAgICA8d3NkbDppbnB1dCA+DQotICAgICAgICAgIDxtaW1lOm11bHRpcGFydFJlbGF0ZWQ+DQotICAgICAgICAgICAgPG1pbWU6cGFydD4NCi0gICAgICAgICAgICAgIDx3c2Rsc29hcDpib2R5IHBhcnRzPSIiIHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgICAgICAgIDwvbWltZTpwYXJ0Pg0KLQ0KLSAgICAgICAgICAgIDxtaW1lOnBhcnQ+DQotICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHBhcnQ9ImpwZWdJbWFnZTFSZXF1ZXN0IiB0eXBlPSJ0ZXh0L3BsYWluIi8+DQotICAgICAgICAgICAgPC9taW1lOnBhcnQ+DQotICAgICAgICAgICAgPG1pbWU6cGFydD4NCi0gICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgcGFydD0ianBlZ0ltYWdlMlJlcXVlc3QiIHR5cGU9InRleHQvcGxhaW4iLz4NCi0gICAgICAgICAgICA8L21pbWU6cGFydD4NCi0gICAgICAgICAgPC9taW1lOm11bHRpcGFydFJlbGF0ZWQ+DQotICAgICAgICA8L3dzZGw6aW5wdXQ+DQotICAgICAgICA8d3NkbDpvdXRwdXQgPg0KLSAgICAgICAgICA8bWltZTptdWx0aXBhcnRSZWxhdGVkPg0KLSAgICAgICAgICAgIDxtaW1lOnBhcnQ+DQotICAgICAgICAgICAgICA8d3NkbHNvYXA6Ym9keSBwYXJ0cz0iIiB1c2U9ImxpdGVyYWwiLz4NCi0gICAgICAgICAgICA8L21pbWU6cGFydD4NCi0gICAgICAgICAgICA8bWltZTpwYXJ0Pg0KLSAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCBwYXJ0PSJqcGVnSW1hZ2UxUmVzcG9uc2UiIHR5cGU9InRleHQvcGxhaW4iLz4NCi0gICAgICAgICAgICA8L21pbWU6cGFydD4NCi0gICAgICAgICAgICA8bWltZTpwYXJ0Pg0KLSAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCBwYXJ0PSJqcGVnSW1hZ2UyUmVzcG9uc2UiIHR5cGU9InRleHQvcGxhaW4iLz4NCi0gICAgICAgICAgICA8L21pbWU6cGFydD4NCi0gICAgICAgICAgPC9taW1lOm11bHRpcGFydFJlbGF0ZWQ+DQotICAgICAgICA8L3dzZGw6b3V0cHV0Pg0KLSAgICAgIDwvd3NkbDpvcGVyYXRpb24+DQotDQotICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9Im10b21BdHRhY2htZW50Ij4NCi0gICAgICAgICA8d3NkbHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Im10b21BdHRhY2htZW50Ii8+DQotICAgICAgICAgPHdzZGw6aW5wdXQ+DQotICAgICAgICAgICAgPHdzZGxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgICAgPC93c2RsOmlucHV0Pg0KLSAgICAgICAgIDx3c2RsOm91dHB1dCA+DQotICAgICAgICAgICAgPHdzZGxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgICAgPC93c2RsOm91dHB1dD4NCi0gICAgICA8L3dzZGw6b3BlcmF0aW9uPg0KLSAgIDwvd3NkbDpiaW5kaW5nPg0KLQ0KLSAgIDx3c2RsOnNlcnZpY2UgbmFtZT0iU1dBTVRPTVNlcnZpY2UiPg0KLSAgICAgPHdzZGw6cG9ydCBuYW1lPSJTV0FNVE9NUG9ydFR5cGVQb3J0IiBiaW5kaW5nPSJ0bnM6U1dBTVRPTUJpbmRpbmciPg0KLSAgICAgICAgPHdzZGxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9ASE9TVEA6QFBPUlRAL2pheHdzLnN3YW10b20vc2VydmljZXMvU1dBTVRPTVNlcnZpY2UiIC8+DQotICAgICA8L3dzZGw6cG9ydD4NCi0gICA8L3dzZGw6c2VydmljZT4NCi0gICAgICAgICAgDQotPC93c2RsOmRlZmluaXRpb25zPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3htbC9hZGRudW1iZXJzdGVzdC54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy94bWwvYWRkbnVtYmVyc3Rlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzc1Y2RiLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3htbC9hZGRudW1iZXJzdGVzdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08c29hcDpFbnZlbG9wZSB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyI+DQotICAgICAgICA8c29hcDpIZWFkZXI+IA0KLQkJCTxuczE6bXlIZWFkZXIgeG1sbnM6bnMxPSJodHRwOi8vb3JnL3Rlc3QvYWRkbnVtYmVyc2hhbmRsZXIiPkdvb2QxPC9uczE6bXlIZWFkZXI+DQotCQkJPG5zMTpteUhlYWRlciB4bWxuczpuczE9Imh0dHA6Ly9vcmcvdGVzdC9hZGRudW1iZXJzaGFuZGxlciIgc29hcDphY3Rvcj0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9hY3Rvci9uZXh0Ij5Hb29kMjwvbnMxOm15SGVhZGVyPg0KLQkJCTxuczE6bXlIZWFkZXIgeG1sbnM6bnMxPSJodHRwOi8vb3JnL3Rlc3QvYWRkbnVtYmVyc2hhbmRsZXIiIHNvYXA6YWN0b3I9Imh0dHA6Ly9iYWRBY3RvciI+QmFkPC9uczE6bXlIZWFkZXI+DQotCQk8L3NvYXA6SGVhZGVyPg0KLSAJCTxzb2FwOkJvZHk+IA0KLQkJCTxuczI6YWRkTnVtYmVyc0hhbmRsZXIgeG1sbnM6bnMyPSJodHRwOi8vb3JnL3Rlc3QvYWRkbnVtYmVyc2hhbmRsZXIiPg0KLQkJCTxuczI6YXJnMD4xMDwvbnMyOmFyZzA+DQotCQkJPG5zMjphcmcxPjEwPC9uczI6YXJnMT4NCi0JCQk8L25zMjphZGROdW1iZXJzSGFuZGxlcj4NCi0JCTwvc29hcDpCb2R5Pg0KLQk8L3NvYXA6RW52ZWxvcGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMveG1sL3JlZmVyZW5jZXBhcmFtZXRlcnMueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMveG1sL3JlZmVyZW5jZXBhcmFtZXRlcnMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmQ3ZDYyLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3htbC9yZWZlcmVuY2VwYXJhbWV0ZXJzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTxzb2FwZW52OkVudmVsb3BlIHhtbG5zOnNvYXBlbnY9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIg0KLSAgICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSINCi0gICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQotICAgICAgICB4bWxuczp3c2E9Imh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDgvYWRkcmVzc2luZyI+DQotICAgIDxzb2FwZW52OkhlYWRlciB4bWxuczpmYWJyaWthbT0iaHR0cDovL2V4YW1wbGUuY29tL2ZhYnJpa2FtIiB4bWxuczpheGlzMj0iaHR0cDovL3dzLmFwYWNoZS5vcmcvbmFtZXNwYWNlcy9heGlzMiI+DQotICAgICAgICA8d3NhOk1lc3NhZ2VJRCBheGlzMjpBdHRyRXh0PSIxMjM0NTY3ODkiIHNvYXBlbnY6bXVzdFVuZGVyc3RhbmQ9IjAiPg0KLSAgICAgICAgICAgIHV1aWQ6OTIwQzUxOTAtMEI4Ri0xMUQ5LThDRUQtRjIyRURFRUJGN0U1PC93c2E6TWVzc2FnZUlEPg0KLSAgICAgICAgPHdzYTpUbyBheGlzMjpBdHRyRXh0PSIxMjM0NTY3ODkiIHNvYXBlbnY6bXVzdFVuZGVyc3RhbmQ9IjAiPmh0dHA6Ly9sb2NhbGhvc3Q6ODA4MS9heGlzL3NlcnZpY2VzL0JhbmtQb3J0PC93c2E6VG8+DQotICAgICAgICA8YXhpczI6UGFyYW1PbmUgd3NhOklzUmVmZXJlbmNlUGFyYW1ldGVyPSd0cnVlJz4wMTIzNDU2Nzg5PC9heGlzMjpQYXJhbU9uZT4NCi0gICAgICAgIDxheGlzMjpQYXJhbVR3byB3c2E6SXNSZWZlcmVuY2VQYXJhbWV0ZXI9J3RydWUnPkFCQ0RFRkc8L2F4aXMyOlBhcmFtVHdvPg0KLSAgICAgICAgPGF4aXMyOlBhcmFtVGhyZWUgd3NhOklzUmVmZXJlbmNlUGFyYW1ldGVyPSd0cnVlJz5hYmNkZWZnPC9heGlzMjpQYXJhbVRocmVlPg0KLSAgICAgICAgPHdzYTpBY3Rpb24gYXhpczI6QXR0ckV4dD0iMTIzNDU2Nzg5Ij5odHRwOi8vd3MuYXBhY2hlLm9yZy90ZXN0cy9hY3Rpb248L3dzYTpBY3Rpb24+DQotICAgICAgICA8d3NhOlJlcGx5VG8gYXhpczI6QXR0ckV4dD0iMTIzNDU2Nzg5Ij4NCi0gICAgICAgICAgICA8d3NhOkFkZHJlc3M+aHR0cDovL2V4YW1wbGUuY29tL2ZhYnJpa2FtL2FjY3Q8L3dzYTpBZGRyZXNzPg0KLSAgICAgICAgICAgIDx3c2E6UmVmZXJlbmNlUGFyYW1ldGVycz4NCi0gICAgICAgICAgICAgICAgPGZhYnJpa2FtOkN1c3RvbWVyS2V5PjEyMzQ1Njc4OTwvZmFicmlrYW06Q3VzdG9tZXJLZXk+DQotICAgICAgICAgICAgICAgIDxmYWJyaWthbTpTaG9wcGluZ0NhcnQ+QUJDREVGRzwvZmFicmlrYW06U2hvcHBpbmdDYXJ0Pg0KLSAgICAgICAgICAgIDwvd3NhOlJlZmVyZW5jZVBhcmFtZXRlcnM+DQotICAgICAgICAgICAgPHdzYTpNZXRhZGF0YT4NCi0gICAgICAgICAgICAgICAgPGF4aXMyOk1ldGFFeHQgYXhpczI6QXR0ckV4dD0iMTIzNDU2Nzg5Ij4xMjM0NTY3ODk8L2F4aXMyOk1ldGFFeHQ+DQotICAgICAgICAgICAgPC93c2E6TWV0YWRhdGE+DQotICAgICAgICAgICAgPGF4aXMyOkVQUkV4dCBheGlzMjpBdHRyRXh0PSIxMjM0NTY3ODkiPjEyMzQ1Njc4OTwvYXhpczI6RVBSRXh0Pg0KLSAgICAgICAgPC93c2E6UmVwbHlUbz4NCi0gICAgPC9zb2FwZW52OkhlYWRlcj4NCi0gICAgPHNvYXBlbnY6Qm9keT4NCi0gICAgICAgIDxuczE6Z2V0QmFsYW5jZSBzb2FwZW52OmVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIg0KLSAgICAgICAgICAgICAgICB4bWxuczpuczE9Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MS9heGlzL3NlcnZpY2VzL0JhbmtQb3J0Ij4NCi0gICAgICAgICAgICA8YWNjb3VudE5vIGhyZWY9IiNpZDAiLz4NCi0gICAgICAgIDwvbnMxOmdldEJhbGFuY2U+DQotICAgICAgICA8bXVsdGlSZWYgaWQ9ImlkMCIgc29hcGVuYzpyb290PSIwIg0KLSAgICAgICAgICAgICAgICBzb2FwZW52OmVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIg0KLSAgICAgICAgICAgICAgICB4c2k6dHlwZT0ieHNkOmludCIgeG1sbnM6c29hcGVuYz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iPg0KLSAgICAgICAgICAgIDEwMDE8L211bHRpUmVmPg0KLSAgICA8L3NvYXBlbnY6Qm9keT4NCi08L3NvYXBlbnY6RW52ZWxvcGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMveG1sL3NvYXBtZXNzYWdlLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3htbC9zb2FwbWVzc2FnZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwOTdkYWIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMveG1sL3NvYXBtZXNzYWdlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotIA0KLQk8IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0gDQotCTxzb2FwOkVudmVsb3BlIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIj4NCi0gCQk8c29hcDpCb2R5PiANCi0JCQk8bnMyOmludm9rZSB4bWxuczpuczI9Imh0dHA6Ly9vcmcudGVzdC5zb2FwbWVzc2FnZSI+PGludm9rZV9zdHI+c29tZSByZXF1ZXN0PC9pbnZva2Vfc3RyPjwvbnMyOmludm9rZT4NCi0JCTwvc29hcDpCb2R5Pg0KLQk8L3NvYXA6RW52ZWxvcGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMveHNkLzNEU2hhcGUueHNkIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMveHNkLzNEU2hhcGUueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWQ0ZmQxLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3hzZC8zRFNoYXBlLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTx4c2Q6c2NoZW1hIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiDQotCQl4bWxuczp0bnMxPSJodHRwOi8vc2hhcGUudGVzdC5vcmciDQotCQl4bWxuczp0bnM9Imh0dHA6Ly90aHJlZWQuc2hhcGUudGVzdC5vcmciIA0KLQkJeG1sbnM6amF4Yj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF4YiIgIGpheGI6dmVyc2lvbj0iMi4wIg0KLQkJdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vdGhyZWVkLnNoYXBlLnRlc3Qub3JnIj4NCi0JCQ0KLQkJPHhzZDppbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vc2hhcGUudGVzdC5vcmciDQotCQkJICAgIHNjaGVtYUxvY2F0aW9uPSJzaGFwZS54c2QiIC8+DQotCQkNCi0JCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVGhyZWVEU3F1YXJlIj4NCi0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+DQotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idG5zMTpTcXVhcmUiPg0KLQkJCQk8eHNkOnNlcXVlbmNlPg0KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9ImJyZWR0aCIgdHlwZT0ieHNkOmludCIgLz4NCi0JCQkJPC94c2Q6c2VxdWVuY2U+DQotCQkJPC94c2Q6ZXh0ZW5zaW9uPg0KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+DQotCQk8L3hzZDpjb21wbGV4VHlwZT4NCi0JCQ0KLQkJDQotPC94c2Q6c2NoZW1hPgkJDQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMveHNkL2VjaG8ueHNkIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMveHNkL2VjaG8ueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTlhZmQ0Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3hzZC9lY2hvLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTwhLS0gVGhpcyBzY2hlbWEgaXMgdXNlZCB0byBnZW5lcmF0ZSB0aGUgSkFYLUIgYXJ0aWZhY3RzDQotICAgICB1c2VkIGJ5IHRoZSBKQVgtQiBEaXNwYXRjaCB0ZXN0cyAtLT4NCi08czpzY2hlbWEgeG1sbnM6cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiDQotCWVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiANCi0JdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vdGVzdCI+DQotICA8czplbGVtZW50IG5hbWU9ImVjaG9TdHJpbmciPg0KLSAgICA8czpjb21wbGV4VHlwZT4NCi0gICAgICA8czpzZXF1ZW5jZT4NCi0gICAgICAgIDxzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9ImlucHV0IiB0eXBlPSJzOnN0cmluZyIgLz4NCi0gICAgICA8L3M6c2VxdWVuY2U+DQotICAgIDwvczpjb21wbGV4VHlwZT4NCi0gIDwvczplbGVtZW50Pg0KLSAgPHM6ZWxlbWVudCBuYW1lPSJlY2hvU3RyaW5nUmVzcG9uc2UiPg0KLSAgICA8czpjb21wbGV4VHlwZT4NCi0gICAgICA8czpzZXF1ZW5jZT4NCi0gICAgICAgIDxzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9ImVjaG9TdHJpbmdSZXR1cm4iIHR5cGU9InM6c3RyaW5nIiAvPg0KLSAgICAgIDwvczpzZXF1ZW5jZT4NCi0gICAgPC9zOmNvbXBsZXhUeXBlPg0KLSAgPC9zOmVsZW1lbnQ+DQotPC9zOnNjaGVtYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy94c2QvZ3JlZXRlclR5cGVzLnhzZCBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3hzZC9ncmVldGVyVHlwZXMueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2MxODgzLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3hzZC9ncmVldGVyVHlwZXMueHNkCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9hcGFjaGUub3JnL2F4aXMyL2pheHdzL3NhbXBsZS9kbHdtaW4vdHlwZXMiDQotICAgICAgICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSINCi0gICAgICAgICAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIj4NCi0gICAgIDxjb21wbGV4VHlwZSBuYW1lPSJ0ZXN0QmVhbiI+DQotICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICA8ZWxlbWVudCBuYW1lPSJkYXRhMSIgdHlwZT0ieHNkOnN0cmluZyIvPg0KLSAgICAgICAgIDxlbGVtZW50IG5hbWU9ImRhdGEyIiB0eXBlPSJ4c2Q6aW50Ii8+DQotICAgICAgIDwvc2VxdWVuY2U+DQotICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgICAgPGVsZW1lbnQgbmFtZT0icHJvY2Vzc0ZhdWx0MiI+DQotICAgICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgICAgICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iZmxhZyIgICAgZm9ybT0idW5xdWFsaWZpZWQiIHR5cGU9InhzZDppbnQiLz4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJtZXNzYWdlIiBmb3JtPSJ1bnF1YWxpZmllZCIgdHlwZT0ieHNkOnN0cmluZyIvPg0KLSAgICAgICAgICAgICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgIDwvY29tcGxleFR5cGU+DQotICAgICA8L2VsZW1lbnQ+DQotICAgICA8ZWxlbWVudCBuYW1lPSJwcm9jZXNzRmF1bHQzIj4NCi0gICAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICAgICAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJmbGFnIiAgICBmb3JtPSJ1bnF1YWxpZmllZCIgdHlwZT0ieHNkOmludCIvPg0KLSAgICAgICAgICAgICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgIDwvY29tcGxleFR5cGU+DQotICAgICA8L2VsZW1lbnQ+DQotPC9zY2hlbWE+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMveHNkL2pheGJzb3VyY2UueHNkIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMveHNkL2pheGJzb3VyY2UueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDMxODgxLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3hzZC9qYXhic291cmNlLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTx4c2Q6c2NoZW1hDQotCXRhcmdldE5hbWVzcGFjZT0iaHR0cDovL29yZy50ZXN0LmRpc3BhdGNoLmpheGJzb3VyY2UiDQotCXhtbG5zOnRucz0iaHR0cDovL29yZy50ZXN0LmRpc3BhdGNoLmpheGJzb3VyY2UiDQotCXhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPg0KLQkJCQ0KLQk8eHNkOmVsZW1lbnQgbmFtZT0iUmV0dXJuVHlwZSI+DQotCQk8eHNkOmNvbXBsZXhUeXBlPg0KLQkJCTx4c2Q6c2VxdWVuY2U+DQotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJyZXR1cm5fc3RyIg0KLQkJCQkJdHlwZT0ieHNkOnN0cmluZyIgLz4NCi0JCQk8L3hzZDpzZXF1ZW5jZT4NCi0JCTwveHNkOmNvbXBsZXhUeXBlPg0KLQk8L3hzZDplbGVtZW50Pg0KLQk8eHNkOmVsZW1lbnQgbmFtZT0iaW52b2tlIj4NCi0JCTx4c2Q6Y29tcGxleFR5cGU+DQotCQkJPHhzZDpzZXF1ZW5jZT4NCi0JCQkJPHhzZDplbGVtZW50IG5hbWU9Imludm9rZV9zdHIiDQotCQkJCQl0eXBlPSJ4c2Q6c3RyaW5nIiAvPg0KLQkJCTwveHNkOnNlcXVlbmNlPg0KLQkJPC94c2Q6Y29tcGxleFR5cGU+DQotCTwveHNkOmVsZW1lbnQ+DQotPC94c2Q6c2NoZW1hPg0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3hzZC9zYW1wbGVtdG9tLnhzZCBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3hzZC9zYW1wbGVtdG9tLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQ3Y2JhNC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy94c2Qvc2FtcGxlbXRvbS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgPz4NCi0NCi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08eHM6c2NoZW1hIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIg0KLSAgICB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiDQotICAgIHhtbG5zOnhtaW1lPSJodHRwOi8vd3d3LnczLm9yZy8yMDA1LzA1L3htbG1pbWUiDQotICAgIHhtbG5zOnRucz0idXJuOi8vbXRvbS50ZXN0Lm9yZyINCi0gICAgdGFyZ2V0TmFtZXNwYWNlPSJ1cm46Ly9tdG9tLnRlc3Qub3JnIj4NCi0gICAgPCEtLSBVc2UgbG9jYWwgZmlsZSBmb3Igc3BlZWQgLS0+DQotICAgIDwhLS0gPHhzOmltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDUveG1sbWltZSINCi0gICAgICAgICAgICAgICBzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy53My5vcmcvMjAwNS8wNS94bWxtaW1lIi8+LS0+DQotICAgIDx4czppbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vd3d3LnczLm9yZy8yMDA1LzA1L3htbG1pbWUiDQotICAgICAgICAgICAgICAgc2NoZW1hTG9jYXRpb249InhtbG1pbWUueHNkIi8+DQotICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJJbWFnZURlcG90Ij4NCi0gICAgICAgPHhzOnNlcXVlbmNlPg0KLSAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iaW1hZ2VEYXRhIiANCi0gICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzOmJhc2U2NEJpbmFyeSINCi0gICAgICAgICAgICAgICAgICAgICAgIHhtaW1lOmV4cGVjdGVkQ29udGVudFR5cGVzPSJtdWx0aXBhcnQvKiIvPg0KLSAgICAgICA8L3hzOnNlcXVlbmNlPg0KLSAgICA8L3hzOmNvbXBsZXhUeXBlPg0KLSAgICANCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0ic2VuZEltYWdlIj4NCi0gICAgICAgPHhzOmNvbXBsZXhUeXBlPg0KLSAgICAgICAgICA8eHM6c2VxdWVuY2U+DQotICAgICAgICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJpbnB1dCIgdHlwZT0idG5zOkltYWdlRGVwb3QiLz4NCi0gICAgICAgICAgPC94czpzZXF1ZW5jZT4NCi0gICAgICAgPC94czpjb21wbGV4VHlwZT4NCi0gICAgPC94czplbGVtZW50Pg0KLSAgICANCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0ic2VuZEltYWdlUmVzcG9uc2UiPg0KLSAgICAgICA8eHM6Y29tcGxleFR5cGU+DQotICAgICAgICAgIDx4czpzZXF1ZW5jZT4NCi0gICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9Im91dHB1dCIgdHlwZT0idG5zOkltYWdlRGVwb3QiLz4NCi0gICAgICAgICAgPC94czpzZXF1ZW5jZT4NCi0gICAgICAgPC94czpjb21wbGV4VHlwZT4NCi0gICAgPC94czplbGVtZW50Pg0KLSAgICANCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0ic2VuZFRleHQiPg0KLSAgICAgICA8eHM6Y29tcGxleFR5cGU+DQotICAgICAgICAgIDx4czpzZXF1ZW5jZT4NCi0gICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmlsbGFibGU9ImZhbHNlIiBuYW1lPSJpbnB1dCIgDQotICAgICAgICAgICAgICAgIHR5cGU9InhzOmJhc2U2NEJpbmFyeSIgeG1pbWU6ZXhwZWN0ZWRDb250ZW50VHlwZT0idGV4dC94bWwiLz4NCi0gICAgICAgICAgPC94czpzZXF1ZW5jZT4NCi0gICAgICAgPC94czpjb21wbGV4VHlwZT4NCi0gICAgPC94czplbGVtZW50Pg0KLSAgICANCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0ic2VuZFRleHRSZXNwb25zZSI+DQotICAgICAgIDx4czpjb21wbGV4VHlwZT4NCi0gICAgICAgICAgPHhzOnNlcXVlbmNlPg0KLSAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0ib3V0cHV0IiB0eXBlPSJ0bnM6SW1hZ2VEZXBvdCIvPg0KLSAgICAgICAgICA8L3hzOnNlcXVlbmNlPg0KLSAgICAgICA8L3hzOmNvbXBsZXhUeXBlPg0KLSAgICA8L3hzOmVsZW1lbnQ+DQotDQotPC94czpzY2hlbWE+DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMveHNkL3NoYXBlLnhzZCBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3hzZC9zaGFwZS54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjZmIyMjUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMveHNkL3NoYXBlLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotDQotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPHhzZDpzY2hlbWEgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSINCi0JCXhtbG5zOnRucz0iaHR0cDovL3NoYXBlLnRlc3Qub3JnIiANCi0JCXhtbG5zOmpheGI9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2pheGIiICBqYXhiOnZlcnNpb249IjIuMCINCi0JCXRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3NoYXBlLnRlc3Qub3JnIj4NCi0JCQ0KLQkJPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJTaGFwZSIgYWJzdHJhY3Q9InRydWUiPg0KLQkJCTx4c2Q6c2VxdWVuY2U+DQotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJ4QXhpcyIgdHlwZT0ieHNkOmZsb2F0IiAvPg0KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0ieUF4aXMiIHR5cGU9InhzZDpmbG9hdCIgLz4NCi0JCQk8L3hzZDpzZXF1ZW5jZT4NCi0JCTwveHNkOmNvbXBsZXhUeXBlPg0KLQkJDQotCQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlNxdWFyZSIgPg0KLQkJCTx4c2Q6Y29tcGxleENvbnRlbnQ+DQotCQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InRuczpTaGFwZSI+DQotCQkJCQk8eHNkOnNlcXVlbmNlPg0KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJsZW5ndGgiIHR5cGU9InhzZDppbnQiIC8+DQotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IndpZHRoIiB0eXBlPSJ4c2Q6aW50IiAvPg0KLQkJCQkJPC94c2Q6c2VxdWVuY2U+DQotCQkJCTwveHNkOmV4dGVuc2lvbj4NCi0JCQk8L3hzZDpjb21wbGV4Q29udGVudD4NCi0JCTwveHNkOmNvbXBsZXhUeXBlPg0KLQkJDQotCQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNpcmNsZSIgPg0KLQkJCTx4c2Q6Y29tcGxleENvbnRlbnQ+DQotCQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InRuczpTaGFwZSI+DQotCQkJCQk8eHNkOnNlcXVlbmNlPg0KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJyYWRpdXMiIHR5cGU9InhzZDppbnQiIC8+DQotCQkJCQk8L3hzZDpzZXF1ZW5jZT4NCi0JCQkJPC94c2Q6ZXh0ZW5zaW9uPg0KLQkJCTwveHNkOmNvbXBsZXhDb250ZW50Pg0KLQkJPC94c2Q6Y29tcGxleFR5cGU+CQ0KLQkJDQotPC94c2Q6c2NoZW1hPg0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3hzZC9zaGFwZV93cmFwcGVycy54c2QgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy94c2Qvc2hhcGVfd3JhcHBlcnMueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWNlODMxLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3hzZC9zaGFwZV93cmFwcGVycy54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLQ0KLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTx4c2Q6c2NoZW1hIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiDQotCQl4bWxuczp0bnM9Imh0dHA6Ly93cmFwcGVyLnNoYXBlLnRlc3Qub3JnIiANCi0JCXhtbG5zOnRuczE9Imh0dHA6Ly9zaGFwZS50ZXN0Lm9yZyINCi0JCXhtbG5zOmpheGI9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2pheGIiICBqYXhiOnZlcnNpb249IjIuMCINCi0JCXRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3dyYXBwZXIuc2hhcGUudGVzdC5vcmciPg0KLQkJDQotCQk8eHNkOmltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly9zaGFwZS50ZXN0Lm9yZyINCi0JCQkgICAgc2NoZW1hTG9jYXRpb249InNoYXBlLnhzZCIgLz4NCi0JCQ0KLQkJPHhzZDplbGVtZW50IG5hbWU9ImRyYXczRCI+DQotCQkJPHhzZDpjb21wbGV4VHlwZT4NCi0JCQkJPHhzZDpzZXF1ZW5jZT4NCi0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJyZXF1ZXN0IiB0eXBlPSJ0bnMxOlNoYXBlIiAvPg0KLQkJCQk8L3hzZDpzZXF1ZW5jZT4NCi0JCQk8L3hzZDpjb21wbGV4VHlwZT4NCi0JCTwveHNkOmVsZW1lbnQ+DQotCQkNCi0JCTx4c2Q6ZWxlbWVudCBuYW1lPSJkcmF3Ij4NCi0JCQk8eHNkOmNvbXBsZXhUeXBlPg0KLQkJCQk8eHNkOnNlcXVlbmNlPg0KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9InJlcXVlc3QiIHR5cGU9InRuczE6U2hhcGUiIC8+DQotCQkJCTwveHNkOnNlcXVlbmNlPg0KLQkJCTwveHNkOmNvbXBsZXhUeXBlPg0KLQkJPC94c2Q6ZWxlbWVudD4NCi0JCQ0KLQkJPHhzZDplbGVtZW50IG5hbWU9ImRyYXdSZXNwb25zZSI+DQotCQkJPHhzZDpjb21wbGV4VHlwZT4NCi0JCQkJPHhzZDpzZXF1ZW5jZT4NCi0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJyZXNwb25zZSIgdHlwZT0idG5zMTpTaGFwZSIgLz4NCi0JCQkJPC94c2Q6c2VxdWVuY2U+DQotCQkJPC94c2Q6Y29tcGxleFR5cGU+DQotCQk8L3hzZDplbGVtZW50Pg0KLQkJDQotPC94c2Q6c2NoZW1hPgkJDQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMveHNkL3NvYXAxMS54c2QgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy94c2Qvc29hcDExLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZhNWZlMy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy94c2Qvc29hcDExLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCcgPz4NCi0NCi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08eHM6c2NoZW1hIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSINCi0gICAgICAgICAgIHhtbG5zOnRucz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iDQotICAgICAgICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIiA+DQotDQotICAgICANCi0gIDwhLS0gRW52ZWxvcGUsIGhlYWRlciBhbmQgYm9keSAtLT4NCi0gIDx4czplbGVtZW50IG5hbWU9IkVudmVsb3BlIiB0eXBlPSJ0bnM6RW52ZWxvcGUiIC8+DQotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iRW52ZWxvcGUiID4NCi0gICAgPHhzOnNlcXVlbmNlPg0KLSAgICAgIDx4czplbGVtZW50IHJlZj0idG5zOkhlYWRlciIgbWluT2NjdXJzPSIwIiAvPg0KLSAgICAgIDx4czplbGVtZW50IHJlZj0idG5zOkJvZHkiIG1pbk9jY3Vycz0iMSIgLz4NCi0NCi0gICAgICA8eHM6YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIC8+DQotICAgIDwveHM6c2VxdWVuY2U+DQotICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIgLz4NCi0gIDwveHM6Y29tcGxleFR5cGU+DQotDQotICA8eHM6ZWxlbWVudCBuYW1lPSJIZWFkZXIiIHR5cGU9InRuczpIZWFkZXIiIC8+DQotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iSGVhZGVyIiA+DQotICAgIDx4czpzZXF1ZW5jZT4NCi0gICAgICA8eHM6YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIC8+DQotDQotICAgIDwveHM6c2VxdWVuY2U+DQotICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIgLz4NCi0gIDwveHM6Y29tcGxleFR5cGU+DQotICANCi0gIDx4czplbGVtZW50IG5hbWU9IkJvZHkiIHR5cGU9InRuczpCb2R5IiAvPg0KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IkJvZHkiID4NCi0gICAgPHhzOnNlcXVlbmNlPg0KLSAgICAgIDx4czphbnkgbmFtZXNwYWNlPSIjI2FueSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIC8+DQotICAgIDwveHM6c2VxdWVuY2U+DQotICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI2FueSIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiID4NCi0NCi0JICA8eHM6YW5ub3RhdGlvbj4NCi0JICAgIDx4czpkb2N1bWVudGF0aW9uPg0KLQkJICBQcm9zZSBpbiB0aGUgc3BlYyBkb2VzIG5vdCBzcGVjaWZ5IHRoYXQgYXR0cmlidXRlcyBhcmUgYWxsb3dlZCBvbiB0aGUgQm9keSBlbGVtZW50DQotCQk8L3hzOmRvY3VtZW50YXRpb24+DQotCSAgPC94czphbm5vdGF0aW9uPg0KLQk8L3hzOmFueUF0dHJpYnV0ZT4NCi0gIDwveHM6Y29tcGxleFR5cGU+DQotDQotICAgICAgIA0KLSAgPCEtLSBHbG9iYWwgQXR0cmlidXRlcy4gIFRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyBhcmUgaW50ZW5kZWQgdG8gYmUgdXNhYmxlIHZpYSBxdWFsaWZpZWQgYXR0cmlidXRlIG5hbWVzIG9uIGFueSBjb21wbGV4IHR5cGUgcmVmZXJlbmNpbmcgdGhlbS4gIC0tPg0KLSAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtdXN0VW5kZXJzdGFuZCIgPgkNCi0gICAgIDx4czpzaW1wbGVUeXBlPg0KLQ0KLSAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9J3hzOmJvb2xlYW4nPg0KLQkgICA8eHM6cGF0dGVybiB2YWx1ZT0nMHwxJyAvPg0KLQkgPC94czpyZXN0cmljdGlvbj4NCi0gICA8L3hzOnNpbXBsZVR5cGU+DQotICA8L3hzOmF0dHJpYnV0ZT4NCi0gIDx4czphdHRyaWJ1dGUgbmFtZT0iYWN0b3IiIHR5cGU9InhzOmFueVVSSSIgLz4NCi0NCi0gIDx4czpzaW1wbGVUeXBlIG5hbWU9ImVuY29kaW5nU3R5bGUiID4NCi0gICAgPHhzOmFubm90YXRpb24+DQotDQotCSAgPHhzOmRvY3VtZW50YXRpb24+DQotCSAgICAnZW5jb2RpbmdTdHlsZScgaW5kaWNhdGVzIGFueSBjYW5vbmljYWxpemF0aW9uIGNvbnZlbnRpb25zIGZvbGxvd2VkIGluIHRoZSBjb250ZW50cyBvZiB0aGUgY29udGFpbmluZyBlbGVtZW50LiAgRm9yIGV4YW1wbGUsIHRoZSB2YWx1ZSAnaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8nIGluZGljYXRlcyB0aGUgcGF0dGVybiBkZXNjcmliZWQgaW4gU09BUCBzcGVjaWZpY2F0aW9uDQotCSAgPC94czpkb2N1bWVudGF0aW9uPg0KLQk8L3hzOmFubm90YXRpb24+DQotICAgIDx4czpsaXN0IGl0ZW1UeXBlPSJ4czphbnlVUkkiIC8+DQotICA8L3hzOnNpbXBsZVR5cGU+DQotDQotICA8eHM6YXR0cmlidXRlIG5hbWU9ImVuY29kaW5nU3R5bGUiIHR5cGU9InRuczplbmNvZGluZ1N0eWxlIiAvPg0KLSAgPHhzOmF0dHJpYnV0ZUdyb3VwIG5hbWU9ImVuY29kaW5nU3R5bGUiID4NCi0gICAgPHhzOmF0dHJpYnV0ZSByZWY9InRuczplbmNvZGluZ1N0eWxlIiAvPg0KLQ0KLSAgPC94czphdHRyaWJ1dGVHcm91cD4NCi0NCi0gIDx4czplbGVtZW50IG5hbWU9IkZhdWx0IiB0eXBlPSJ0bnM6RmF1bHQiIC8+DQotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iRmF1bHQiIGZpbmFsPSJleHRlbnNpb24iID4NCi0gICAgPHhzOmFubm90YXRpb24+DQotCSAgPHhzOmRvY3VtZW50YXRpb24+DQotCSAgICBGYXVsdCByZXBvcnRpbmcgc3RydWN0dXJlDQotCSAgPC94czpkb2N1bWVudGF0aW9uPg0KLQk8L3hzOmFubm90YXRpb24+DQotICAgIDx4czpzZXF1ZW5jZT4NCi0NCi0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJmYXVsdGNvZGUiIHR5cGU9InhzOlFOYW1lIiAvPg0KLSAgICAgIDx4czplbGVtZW50IG5hbWU9ImZhdWx0c3RyaW5nIiB0eXBlPSJ4czpzdHJpbmciIC8+DQotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iZmF1bHRhY3RvciIgdHlwZT0ieHM6YW55VVJJIiBtaW5PY2N1cnM9IjAiIC8+DQotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iZGV0YWlsIiB0eXBlPSJ0bnM6ZGV0YWlsIiBtaW5PY2N1cnM9IjAiIC8+ICAgICAgDQotICAgIDwveHM6c2VxdWVuY2U+DQotICA8L3hzOmNvbXBsZXhUeXBlPg0KLQ0KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImRldGFpbCI+DQotICAgIDx4czpzZXF1ZW5jZT4NCi0gICAgICA8eHM6YW55IG5hbWVzcGFjZT0iIyNhbnkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHByb2Nlc3NDb250ZW50cz0ibGF4IiAvPg0KLQ0KLSAgICA8L3hzOnNlcXVlbmNlPg0KLSAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNhbnkiIHByb2Nlc3NDb250ZW50cz0ibGF4IiAvPiANCi0gIDwveHM6Y29tcGxleFR5cGU+DQotDQotPC94czpzY2hlbWE+DQotDQotDQotDQotDQotDQotDQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMveHNkL3N0b2NrMS54c2QgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy94c2Qvc3RvY2sxLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODcyNzNiMy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy94c2Qvc3RvY2sxLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTwhLS0gVGhpcyBzY2hlbWEgaXMgdXNlZCB0byBnZW5lcmF0ZSB0aGUgSkFYLUIgYXJ0aWZhY3RzIGZvciB0aGUgSkFYQldyYXBwZXJUZXN0cyAtLT4NCi08czpzY2hlbWEgeG1sbnM6cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiDQotCXRhcmdldE5hbWVzcGFjZT0idXJuOi8vc3RvY2sxLnRlc3Qub3JnIg0KLQl4bWxuczp0bnM9InVybjovL3N0b2NrMS50ZXN0Lm9yZyIgPg0KLQk8czplbGVtZW50IG5hbWU9ImdldFByaWNlIiB0eXBlPSJ0bnM6Z2V0UHJpY2UiIC8+DQotCTxzOmNvbXBsZXhUeXBlIG5hbWU9ImdldFByaWNlIj4NCi0gICAgICA8czpjb21wbGV4Q29udGVudD4NCi0gICAgICAgIDxzOnJlc3RyaWN0aW9uIGJhc2U9InM6YW55VHlwZSI+DQotICAgICAgICAgIDxzOnNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxzOmVsZW1lbnQgbmFtZT0iZnVuZCIgdHlwZT0iczpzdHJpbmciLz4NCi0gICAgICAgICAgICA8czplbGVtZW50IG5hbWU9ImhvbGRpbmdzLiIgdHlwZT0iczpzdHJpbmciLz4NCi0gICAgICAgICAgICA8czplbGVtZW50IG5hbWU9Im5hdiIgdHlwZT0iczpzdHJpbmciLz4NCi0gICAgICAgICAgPC9zOnNlcXVlbmNlPg0KLSAgICAgICAgPC9zOnJlc3RyaWN0aW9uPg0KLSAgICAgIDwvczpjb21wbGV4Q29udGVudD4NCi0gICAgPC9zOmNvbXBsZXhUeXBlPg0KLSAgICANCi0gICAgPHM6ZWxlbWVudCBuYW1lPSJnZXRQcmljZVJlc3BvbnNlIiB0eXBlPSJ0bnM6U3RvY2tQcmljZSIgLz4NCi0JPHM6Y29tcGxleFR5cGUgbmFtZT0iU3RvY2tQcmljZSI+DQotICAgICAgPHM6Y29tcGxleENvbnRlbnQ+DQotICAgICAgICA8czpyZXN0cmljdGlvbiBiYXNlPSJzOmFueVR5cGUiPg0KLSAgICAgICAgICA8czpzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8czplbGVtZW50IG5hbWU9InByaWNlIiB0eXBlPSJzOnN0cmluZyIvPg0KLSAgICAgICAgICA8L3M6c2VxdWVuY2U+DQotICAgICAgICA8L3M6cmVzdHJpY3Rpb24+DQotICAgICAgPC9zOmNvbXBsZXhDb250ZW50Pg0KLSAgICA8L3M6Y29tcGxleFR5cGU+DQotPC9zOnNjaGVtYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy94c2Qvc3RvY2syLnhzZCBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3hzZC9zdG9jazIueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDE0NjMwLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3hzZC9zdG9jazIueHNkCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPCEtLSBUaGlzIHNjaGVtYSBpcyB1c2VkIHRvIGdlbmVyYXRlIHRoZSBKQVgtQiBhcnRpZmFjdHMgZm9yIHRoZSBKQVhCV3JhcHBlclRlc3RzLS0+DQotPHM6c2NoZW1hIHhtbG5zOnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIg0KLQl0YXJnZXROYW1lc3BhY2U9InVybjovL3N0b2NrMi50ZXN0Lm9yZyINCi0JeG1sbnM6dG5zPSJ1cm46Ly9zdG9jazIudGVzdC5vcmciID4NCi0JPHM6ZWxlbWVudCBuYW1lPSJnZXRQcmljZSIgdHlwZT0idG5zOmdldFByaWNlIiAvPg0KLQk8czpjb21wbGV4VHlwZSBuYW1lPSJnZXRQcmljZSI+DQotICAgICAgPHM6Y29tcGxleENvbnRlbnQ+DQotICAgICAgICA8czpyZXN0cmljdGlvbiBiYXNlPSJzOmFueVR5cGUiPg0KLSAgICAgICAgICA8czpzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8czplbGVtZW50IG5hbWU9InN5bWJvbCIgdHlwZT0iczpzdHJpbmciLz4NCi0gICAgICAgICAgPC9zOnNlcXVlbmNlPg0KLSAgICAgICAgPC9zOnJlc3RyaWN0aW9uPg0KLSAgICAgIDwvczpjb21wbGV4Q29udGVudD4NCi0gICAgPC9zOmNvbXBsZXhUeXBlPg0KLSAgICANCi0gICAgPHM6ZWxlbWVudCBuYW1lPSJnZXRQcmljZVJlc3BvbnNlIiB0eXBlPSJ0bnM6U3RvY2tQcmljZSIvPg0KLQk8czpjb21wbGV4VHlwZSBuYW1lPSJTdG9ja1ByaWNlIj4NCi0gICAgICA8czpjb21wbGV4Q29udGVudD4NCi0gICAgICAgIDxzOnJlc3RyaWN0aW9uIGJhc2U9InM6YW55VHlwZSI+DQotICAgICAgICAgIDxzOnNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxzOmVsZW1lbnQgbmFtZT0icHJpY2UiIHR5cGU9InM6c3RyaW5nIi8+DQotICAgICAgICAgIDwvczpzZXF1ZW5jZT4NCi0gICAgICAgIDwvczpyZXN0cmljdGlvbj4NCi0gICAgICA8L3M6Y29tcGxleENvbnRlbnQ+DQotICAgIDwvczpjb21wbGV4VHlwZT4NCi08L3M6c2NoZW1hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3hzZC94bWxtaW1lLnhzZCBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3hzZC94bWxtaW1lLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc3MjM4Zi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy94c2QveG1sbWltZS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiID8+DQotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPCEtLQ0KLSAgIFczQyBYTUwgU2NoZW1hIGRlZmluZWQgaW4gdGhlIERlc2NyaWJpbmcgTWVkaWEgQ29udGVudCBvZiBCaW5hcnkgRGF0YSBpbiBYTUwNCi0gICBzcGVjaWZpY2F0aW9uDQotICAgICBodHRwOi8vd3d3LnczLm9yZy9UUi94bWwtbWVkaWEtdHlwZXMNCi0NCi0gICBDb3B5cmlnaHQgKEMpIDIwMDUgV29ybGQgV2lkZSBXZWIgQ29uc29ydGl1bSwNCi0gIA0KLSAgIChNYXNzYWNodXNldHRzIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LCBFdXJvcGVhbiBSZXNlYXJjaCBDb25zb3J0aXVtIGZvcg0KLSAgIEluZm9ybWF0aWNzIGFuZCBNYXRoZW1hdGljcywgS2VpbyBVbml2ZXJzaXR5KS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gVGhpcw0KLSAgIHdvcmsgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFczQyhSKSBTb2Z0d2FyZSBMaWNlbnNlIFsxXSBpbiB0aGUgaG9wZSB0aGF0DQotICAgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkDQotICAgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLg0KLSAgDQotICAgWzFdIGh0dHA6Ly93d3cudzMub3JnL0NvbnNvcnRpdW0vTGVnYWwvMjAwMi9jb3B5cmlnaHQtc29mdHdhcmUtMjAwMjEyMzENCi0NCi0gICAkSWQ6IHhtbG1pbWUueHNkLHYgMS4xIDIwMDUvMDQvMjUgMTc6MDg6MzUgaHVnbyBFeHAgJA0KLS0tPg0KLTx4czpzY2hlbWEgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIg0KLSAgICAgICAgICAgeG1sbnM6eG1pbWU9Imh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDUveG1sbWltZSINCi0gICAgICAgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy53My5vcmcvMjAwNS8wNS94bWxtaW1lIiA+DQotDQotICA8eHM6YXR0cmlidXRlIG5hbWU9ImNvbnRlbnRUeXBlIj4NCi0gICAgPHhzOnNpbXBsZVR5cGU+DQotICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyIgPg0KLSAgICAgIDx4czptaW5MZW5ndGggdmFsdWU9IjMiIC8+DQotICAgICAgPC94czpyZXN0cmljdGlvbj4NCi0gICAgPC94czpzaW1wbGVUeXBlPg0KLSAgPC94czphdHRyaWJ1dGU+DQotDQotICA8eHM6YXR0cmlidXRlIG5hbWU9ImV4cGVjdGVkQ29udGVudFR5cGVzIiB0eXBlPSJ4czpzdHJpbmciIC8+DQotDQotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iYmFzZTY0QmluYXJ5IiA+DQotICAgIDx4czpzaW1wbGVDb250ZW50Pg0KLSAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpiYXNlNjRCaW5hcnkiID4NCi0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIHJlZj0ieG1pbWU6Y29udGVudFR5cGUiIC8+DQotICAgICAgICA8L3hzOmV4dGVuc2lvbj4NCi0gICAgPC94czpzaW1wbGVDb250ZW50Pg0KLSAgPC94czpjb21wbGV4VHlwZT4NCi0NCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJoZXhCaW5hcnkiID4NCi0gICAgPHhzOnNpbXBsZUNvbnRlbnQ+DQotICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmhleEJpbmFyeSIgPg0KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgcmVmPSJ4bWltZTpjb250ZW50VHlwZSIgLz4NCi0gICAgICAgIDwveHM6ZXh0ZW5zaW9uPg0KLSAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+DQotICA8L3hzOmNvbXBsZXhUeXBlPg0KLQ0KLTwveHM6c2NoZW1hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjVjYWU2MS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMA0KLUFudC1WZXJzaW9uOiBBcGFjaGUgQW50IDEuNi41DQotQ3JlYXRlZC1CeTogMi4zIChJQk0gQ29ycG9yYXRpb24pDQotDQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL01FVEEtSU5GL3NlcnZpY2VzLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9NRVRBLUlORi9zZXJ2aWNlcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyYjI5YmQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL01FVEEtSU5GL3NlcnZpY2VzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTxzZXJ2aWNlR3JvdXA+DQotIDxzZXJ2aWNlIG5hbWU9IkVjaG9TZXJ2aWNlIj4NCi0gIDxtZXNzYWdlUmVjZWl2ZXJzPg0KLSAgIDxtZXNzYWdlUmVjZWl2ZXIgbWVwPSJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaW4tb3V0IiBjbGFzcz0ic2VydmVyLkVjaG9TZXJ2aWNlTWVzc2FnZVJlY2VpdmVySW5PdXQiLz4NCi0gIDwvbWVzc2FnZVJlY2VpdmVycz4NCi0gIDxwYXJhbWV0ZXIgbmFtZT0iU2VydmljZUNsYXNzIj5zZXJ2ZXIuRWNob1NlcnZpY2VTa2VsZXRvbjwvcGFyYW1ldGVyPg0KLSAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvU3RyaW5nIiBtZXA9Imh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgvd3NkbC9pbi1vdXQiPg0KLSAgICA8YWN0aW9uTWFwcGluZy8+DQotICA8L29wZXJhdGlvbj4NCi0gPC9zZXJ2aWNlPg0KLTwvc2VydmljZUdyb3VwPg0KLQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9UZXN0TG9nZ2VyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvVGVzdExvZ2dlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWE0N2NkLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9UZXN0TG9nZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotcHVibGljIGNsYXNzIFRlc3RMb2dnZXIgew0KLSAgICAvLyBKdXN0IGEgcGxhY2Vob2xkZXIgZm9yIHRoaXMgc2hhcmVkIGxvZ2dlciBvYmplY3QNCi0gICAgcHVibGljIHN0YXRpYyBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coIkpBWFdTLVRlc3RzIik7DQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9hbnl0eXBlL0FueVR5cGVNZXNzYWdlUG9ydFR5cGVJbXBsLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvYW55dHlwZS9BbnlUeXBlTWVzc2FnZVBvcnRUeXBlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzBhNGIxLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9hbnl0eXBlL0FueVR5cGVNZXNzYWdlUG9ydFR5cGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmFueXR5cGU7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuYW55dHlwZS5zZWkuQW55VHlwZU1lc3NhZ2VQb3J0VHlwZTsNCi0NCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7DQotDQotQFdlYlNlcnZpY2Uoc2VydmljZU5hbWU9IkFueVR5cGVNZXNzYWdlU2VydmljZSIsDQotCQl0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9hbnl0eXBlLnRlc3Qub3JnIiwNCi0JCWVuZHBvaW50SW50ZXJmYWNlPSJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmFueXR5cGUuc2VpLkFueVR5cGVNZXNzYWdlUG9ydFR5cGUiKQ0KLXB1YmxpYyBjbGFzcyBBbnlUeXBlTWVzc2FnZVBvcnRUeXBlSW1wbCBpbXBsZW1lbnRzIEFueVR5cGVNZXNzYWdlUG9ydFR5cGUgew0KLQ0KLQkvKiAobm9uLUphdmFkb2MpDQotCSAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5hbnl0eXBlLnNlaS5BbnlUeXBlTWVzc2FnZVBvcnRUeXBlI2VjaG9NZXNzYWdlKGphdmEubGFuZy5PYmplY3QpDQotCSAqLw0KLQlwdWJsaWMgT2JqZWN0IGVjaG9NZXNzYWdlKE9iamVjdCByZXF1ZXN0KSB7DQotCQlPYmplY3QgcmVzcG9uc2UgPSBuZXcgU3RyaW5nKCJSZXF1ZXN0IFJlY2VpdmVkLCBUaGlzIGlzIFJlc3BvbnNlIGZyb20gU2VydmVyIik7DQotCQlyZXR1cm4gcmVzcG9uc2U7DQotCX0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2FueXR5cGUvTUVUQS1JTkYvQW55VHlwZS53c2RsIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2FueXR5cGUvTUVUQS1JTkYvQW55VHlwZS53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOGE1ZWYxLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9hbnl0eXBlL01FVEEtSU5GL0FueVR5cGUud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotDQotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPGRlZmluaXRpb25zIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2FueXR5cGUudGVzdC5vcmciDQotICAgICAgeG1sbnM6dG5zPSJodHRwOi8vYW55dHlwZS50ZXN0Lm9yZyINCi0gICAgICB4bWxucz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIA0KLSAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiDQotICAgICAgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyI+DQotDQotICAgPHR5cGVzPg0KLSAgICAgIDx4c2Q6c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2FueXR5cGUudGVzdC5vcmciDQotICAgICAgICAgeG1sbnM6dHM9Imh0dHA6Ly9hbnl0eXBlLnRlc3Qub3JnL3hzZCINCi0gICAgICAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiDQotICAgICAgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPg0KLQ0KLSAgICAgICAgIDxjb21wbGV4VHlwZSBuYW1lPSJlY2hvTWVzc2FnZSI+DQotICAgICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InJlcXVlc3QiIHR5cGU9InhzZDphbnlUeXBlIi8+DQotICAgICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8L2NvbXBsZXhUeXBlPg0KLQ0KLSAgICAgICAgIDxjb21wbGV4VHlwZSBuYW1lPSJlY2hvTWVzc2FnZVJlc3BvbnNlIj4NCi0gICAgICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0icmVzcG9uc2UiIHR5cGU9InhzZDphbnlUeXBlIi8+DQotICAgICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8L2NvbXBsZXhUeXBlPg0KLQ0KLSAgICAgICAgIDxlbGVtZW50IG5hbWU9ImVjaG9NZXNzYWdlIiB0eXBlPSJ0bnM6ZWNob01lc3NhZ2UiLz4NCi0gICAgICAgICA8ZWxlbWVudCBuYW1lPSJlY2hvTWVzc2FnZVJlc3BvbnNlIiB0eXBlPSJ0bnM6ZWNob01lc3NhZ2VSZXNwb25zZSIvPg0KLQ0KLSAgICAgIDwveHNkOnNjaGVtYT4NCi0gICA8L3R5cGVzPg0KLQ0KLSAgIDxtZXNzYWdlIG5hbWU9ImVjaG9NZXNzYWdlIj4NCi0gICAgICA8cGFydCBuYW1lPSJtZXNzYWdlIiBlbGVtZW50PSJ0bnM6ZWNob01lc3NhZ2UiLz4NCi0gICA8L21lc3NhZ2U+DQotDQotICAgPG1lc3NhZ2UgbmFtZT0iZWNob01lc3NhZ2VSZXNwb25zZSI+DQotICAgICAgPHBhcnQgbmFtZT0icmVzdWx0IiBlbGVtZW50PSJ0bnM6ZWNob01lc3NhZ2VSZXNwb25zZSIvPg0KLSAgIDwvbWVzc2FnZT4NCi0NCi0gICA8cG9ydFR5cGUgbmFtZT0iQW55VHlwZU1lc3NhZ2VQb3J0VHlwZSI+DQotICAgICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvTWVzc2FnZSI+DQotICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczplY2hvTWVzc2FnZSIgLz4NCi0gICAgICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczplY2hvTWVzc2FnZVJlc3BvbnNlIiAvPg0KLSAgICAgIDwvb3BlcmF0aW9uPg0KLSAgIDwvcG9ydFR5cGU+DQotDQotICAgPGJpbmRpbmcgbmFtZT0iQW55VHlwZU1lc3NhZ2VCaW5kaW5nIiB0eXBlPSJ0bnM6QW55VHlwZU1lc3NhZ2VQb3J0VHlwZSI+DQotICAgICAgPHNvYXA6YmluZGluZyBzdHlsZT0iZG9jdW1lbnQiIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIi8+DQotICAgICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvTWVzc2FnZSI+DQotICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPg0KLSAgICAgICAgIDxpbnB1dD4NCi0gICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgICAgIDwvaW5wdXQ+DQotDQotICAgICAgICAgPG91dHB1dD4NCi0gICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgICAgIDwvb3V0cHV0Pg0KLSAgICAgIDwvb3BlcmF0aW9uPg0KLSAgIDwvYmluZGluZz4NCi0NCi0gICA8c2VydmljZSBuYW1lPSJBbnlUeXBlTWVzc2FnZVNlcnZpY2UiPg0KLSAgICAgIDxwb3J0IGJpbmRpbmc9InRuczpBbnlUeXBlTWVzc2FnZUJpbmRpbmciIG5hbWU9IkFueVR5cGVQb3J0Ij4NCi0gICAgICAgICA8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjYwNjAvYXhpczIvc2VydmljZXMvQW55VHlwZU1lc3NhZ2VTZXJ2aWNlIi8+DQotICAgICAgPC9wb3J0Pg0KLQ0KLSAgIDwvc2VydmljZT4NCi0NCi08L2RlZmluaXRpb25zPg0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9hbnl0eXBlL3NlaS9BbnlUeXBlTWVzc2FnZVBvcnRUeXBlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvYW55dHlwZS9zZWkvQW55VHlwZU1lc3NhZ2VQb3J0VHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmUyOTA0Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9hbnl0eXBlL3NlaS9BbnlUeXBlTWVzc2FnZVBvcnRUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0NCi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmFueXR5cGUuc2VpOw0KLQ0KLWltcG9ydCBqYXZheC5qd3MuV2ViTWV0aG9kOw0KLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW07DQotaW1wb3J0IGphdmF4Lmp3cy5XZWJSZXN1bHQ7DQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuUmVxdWVzdFdyYXBwZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5SZXNwb25zZVdyYXBwZXI7DQotDQotDQotLyoqDQotICogVGhpcyBjbGFzcyB3YXMgZ2VuZXJhdGVkIGJ5IHRoZSBKQVhXUyBTSS4NCi0gKiBKQVgtV1MgUkkgMi4wXzAxLWIxNS1mY3MNCi0gKiBHZW5lcmF0ZWQgc291cmNlIHZlcnNpb246IDIuMA0KLSAqIA0KLSAqLw0KLUBXZWJTZXJ2aWNlKG5hbWUgPSAiQW55VHlwZU1lc3NhZ2VQb3J0VHlwZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vYW55dHlwZS50ZXN0Lm9yZyIpDQotcHVibGljIGludGVyZmFjZSBBbnlUeXBlTWVzc2FnZVBvcnRUeXBlIHsNCi0NCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gcmVxdWVzdA0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIGphdmEubGFuZy5PYmplY3QNCi0gICAgICovDQotICAgIEBXZWJNZXRob2QNCi0gICAgQFdlYlJlc3VsdChuYW1lID0gInJlc3BvbnNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9hbnl0eXBlLnRlc3Qub3JnIikNCi0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJlY2hvTWVzc2FnZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vYW55dHlwZS50ZXN0Lm9yZyIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5hbnl0eXBlLkVjaG9NZXNzYWdlIikNCi0gICAgQFJlc3BvbnNlV3JhcHBlcihsb2NhbE5hbWUgPSAiZWNob01lc3NhZ2VSZXNwb25zZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vYW55dHlwZS50ZXN0Lm9yZyIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5hbnl0eXBlLkVjaG9NZXNzYWdlUmVzcG9uc2UiKQ0KLSAgICBwdWJsaWMgT2JqZWN0IGVjaG9NZXNzYWdlKA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAicmVxdWVzdCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vYW55dHlwZS50ZXN0Lm9yZyIpDQotICAgICAgICBPYmplY3QgcmVxdWVzdCk7DQotDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9hbnl0eXBlL3NlaS9BbnlUeXBlTWVzc2FnZVNlcnZpY2UuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9hbnl0eXBlL3NlaS9BbnlUeXBlTWVzc2FnZVNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJhMjhiMC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvYW55dHlwZS9zZWkvQW55VHlwZU1lc3NhZ2VTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0NCi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmFueXR5cGUuc2VpOw0KLQ0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOw0KLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLldlYkVuZHBvaW50Ow0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUNsaWVudDsNCi1pbXBvcnQgamF2YS5pby5GaWxlOw0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247DQotaW1wb3J0IGphdmEubmV0LlVSTDsNCi0NCi0vKioNCi0gKiBUaGlzIGNsYXNzIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIEpBWFdTIFNJLg0KLSAqIEpBWC1XUyBSSSAyLjBfMDEtYjE1LWZjcw0KLSAqIEdlbmVyYXRlZCBzb3VyY2UgdmVyc2lvbjogMi4wDQotICogDQotICovDQotQFdlYlNlcnZpY2VDbGllbnQobmFtZSA9ICJBbnlUeXBlTWVzc2FnZVNlcnZpY2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL2FueXR5cGUudGVzdC5vcmciLCB3c2RsTG9jYXRpb24gPSAiQW55VHlwZS53c2RsIikNCi1wdWJsaWMgY2xhc3MgQW55VHlwZU1lc3NhZ2VTZXJ2aWNlDQotICAgIGV4dGVuZHMgU2VydmljZQ0KLXsNCi0NCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgVVJMIEFOWVRZUEVNRVNTQUdFU0VSVklDRV9XU0RMX0xPQ0FUSU9OOw0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgd3NkbExvY2F0aW9uPSIvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2FueXR5cGUvTUVUQS1JTkYvQW55VHlwZS53c2RsIjsNCi0gICAgc3RhdGljIHsNCi0gICAgICAgIFVSTCB1cmwgPSBudWxsOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgIAl0cnl7DQotCSAgICAgICAgCVN0cmluZyBiYXNlRGlyID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJiYXNlZGlyIiwiLiIpKS5nZXRDYW5vbmljYWxQYXRoKCk7DQotCSAgICAgICAgCXdzZGxMb2NhdGlvbiA9IG5ldyBGaWxlKGJhc2VEaXIgKyB3c2RsTG9jYXRpb24pLmdldEFic29sdXRlUGF0aCgpOw0KLSAgICAgICAgCX1jYXRjaChFeGNlcHRpb24gZSl7DQotICAgICAgICAJCWUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAJfQ0KLSAgICAgICAgCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHdzZGxMb2NhdGlvbik7DQotICAgICAgICAJdXJsID0gZmlsZS50b1VSTCgpOw0KLSAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgQU5ZVFlQRU1FU1NBR0VTRVJWSUNFX1dTRExfTE9DQVRJT04gPSB1cmw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEFueVR5cGVNZXNzYWdlU2VydmljZShVUkwgd3NkbExvY2F0aW9uLCBRTmFtZSBzZXJ2aWNlTmFtZSkgew0KLSAgICAgICAgc3VwZXIod3NkbExvY2F0aW9uLCBzZXJ2aWNlTmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEFueVR5cGVNZXNzYWdlU2VydmljZSgpIHsNCi0gICAgICAgIHN1cGVyKEFOWVRZUEVNRVNTQUdFU0VSVklDRV9XU0RMX0xPQ0FUSU9OLCBuZXcgUU5hbWUoImh0dHA6Ly9hbnl0eXBlLnRlc3Qub3JnIiwgIkFueVR5cGVNZXNzYWdlU2VydmljZSIpKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgQW55VHlwZU1lc3NhZ2VQb3J0VHlwZQ0KLSAgICAgKi8NCi0gICAgQFdlYkVuZHBvaW50KG5hbWUgPSAiQW55VHlwZVBvcnQiKQ0KLSAgICBwdWJsaWMgQW55VHlwZU1lc3NhZ2VQb3J0VHlwZSBnZXRBbnlUeXBlUG9ydCgpIHsNCi0gICAgICAgIHJldHVybiAoQW55VHlwZU1lc3NhZ2VQb3J0VHlwZSlzdXBlci5nZXRQb3J0KG5ldyBRTmFtZSgiaHR0cDovL2FueXR5cGUudGVzdC5vcmciLCAiQW55VHlwZVBvcnQiKSwgQW55VHlwZU1lc3NhZ2VQb3J0VHlwZS5jbGFzcyk7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2FueXR5cGUvdGVzdHMvQW55VHlwZVRlc3RzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvYW55dHlwZS90ZXN0cy9BbnlUeXBlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM1OTUzNS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvYW55dHlwZS90ZXN0cy9BbnlUeXBlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuYW55dHlwZS50ZXN0czsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuVGVzdExvZ2dlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5hbnl0eXBlLnNlaS5BbnlUeXBlTWVzc2FnZVBvcnRUeXBlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmFueXR5cGUuc2VpLkFueVR5cGVNZXNzYWdlU2VydmljZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5mcmFtZXdvcmsuQWJzdHJhY3RUZXN0Q2FzZTsNCi0NCi1pbXBvcnQgamF2YXgueG1sLndzLkJpbmRpbmdQcm92aWRlcjsNCi0NCi1wdWJsaWMgY2xhc3MgQW55VHlwZVRlc3RzIGV4dGVuZHMgQWJzdHJhY3RUZXN0Q2FzZSB7DQotICAgIA0KLQlTdHJpbmcgYXhpc0VuZHBvaW50ID0gImh0dHA6Ly9sb2NhbGhvc3Q6NjA2MC9heGlzMi9zZXJ2aWNlcy9BbnlUeXBlTWVzc2FnZVNlcnZpY2UuQW55VHlwZU1lc3NhZ2VQb3J0VHlwZUltcGxQb3J0IjsNCi0JDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsNCi0gICAgICAgIHJldHVybiBnZXRUZXN0U2V0dXAobmV3IFRlc3RTdWl0ZShBbnlUeXBlVGVzdHMuY2xhc3MpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QW55VHlwZUVsZW1lbnRpbldyYXBwZWRXU0RMKCl7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiVGVzdCA6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBSdW4gdGVzdCBhIGZldyB0aW1lcyB0byBlbnN1cmUgY29ycmVjdCANCi0gICAgICAgIF90ZXN0QW55VHlwZUVsZW1lbnRpbldyYXBwZWRXU0RMKCk7DQotICAgICAgICBfdGVzdEFueVR5cGVFbGVtZW50aW5XcmFwcGVkV1NETCgpOw0KLSAgICAgICAgX3Rlc3RBbnlUeXBlRWxlbWVudGluV3JhcHBlZFdTREwoKTsNCi0gICAgICAgIA0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludCgiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIF90ZXN0QW55VHlwZUVsZW1lbnRpbldyYXBwZWRXU0RMKCl7DQotICAgICAgICB0cnl7DQotICAgICAgICAgICAgQW55VHlwZU1lc3NhZ2VTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgQW55VHlwZU1lc3NhZ2VTZXJ2aWNlKCk7DQotICAgICAgICAgICAgQW55VHlwZU1lc3NhZ2VQb3J0VHlwZSBwb3J0VHlwZSA9IHNlcnZpY2UuZ2V0QW55VHlwZVBvcnQoKTsNCi0gICAgICAgICAgICBCaW5kaW5nUHJvdmlkZXIgcCA9IChCaW5kaW5nUHJvdmlkZXIpIHBvcnRUeXBlOw0KLSAgICAgICAgICAgIHAuZ2V0UmVxdWVzdENvbnRleHQoKS5wdXQoQmluZGluZ1Byb3ZpZGVyLkVORFBPSU5UX0FERFJFU1NfUFJPUEVSVFksIGF4aXNFbmRwb2ludCk7DQotDQotICAgICAgICAgICAgU3RyaW5nIHJlcSA9IG5ldyBTdHJpbmcoIlJlcXVlc3QgYXMgU3RyaW5nIik7DQotICAgICAgICAgICAgT2JqZWN0IHJlc3BvbnNlID0gcG9ydFR5cGUuZWNob01lc3NhZ2UocmVxKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlIGluc3RhbmNlb2YgU3RyaW5nKTsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiUmVzcG9uc2UgPSIgKyByZXNwb25zZSk7DQotICAgICAgICB9Y2F0Y2goRXhjZXB0aW9uIGUpew0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAgICAgZmFpbCgpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jbGllbnQvUHJveHlTb2FwQWN0aW9uVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NsaWVudC9Qcm94eVNvYXBBY3Rpb25UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5YTEyZDIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NsaWVudC9Qcm94eVNvYXBBY3Rpb25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNsaWVudDsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuVGVzdExvZ2dlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jbGllbnQuc29hcGFjdGlvbi5Cb29rU3RvcmU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY2xpZW50LnNvYXBhY3Rpb24uQm9va1N0b3JlU2VydmljZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5mcmFtZXdvcmsuQWJzdHJhY3RUZXN0Q2FzZTsNCi0NCi0vKioNCi0gKiBBIHN1aXRlIG9mIFNPQVBBY3Rpb24gcmVsYXRlZCB0ZXN0cyBmb3IgdGhlIGR5bmFtaWMgcHJveHkgY2xpZW50IA0KLSAqLw0KLXB1YmxpYyBjbGFzcyBQcm94eVNvYXBBY3Rpb25UZXN0IGV4dGVuZHMgQWJzdHJhY3RUZXN0Q2FzZSB7DQotICAgIA0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7DQotICAgICAgICByZXR1cm4gZ2V0VGVzdFNldHVwKG5ldyBUZXN0U3VpdGUoUHJveHlTb2FwQWN0aW9uVGVzdC5jbGFzcykpOw0KLSAgICB9DQotICAgICAgICANCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFNlbmRSZXF1ZXN0V2l0aFNvYXBBY3Rpb24oKSB7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoInRlc3Q6ICIgKyBnZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgQm9va1N0b3JlU2VydmljZSBzZXJ2aWNlID0gbmV3IEJvb2tTdG9yZVNlcnZpY2UoKTsNCi0gICAgICAgIEJvb2tTdG9yZSBicyA9IHNlcnZpY2UuZ2V0Qm9va1N0b3JlUG9ydCgpOw0KLSAgICAgICAgDQotICAgICAgICBmbG9hdCBwcmljZSA9IGJzLmdldFByaWNlV2l0aEFjdGlvbigidGVzdCBpdGVtIik7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygicmV0dXJuIHZhbHVlIFsiICsgcHJpY2UgKyAiXSIpOw0KLSAgICAgICAgLy9hc3NlcnRUcnVlKCJUaGUgcmV0dXJuIHZhbHVlIHdhcyBpbnZhbGlkIiwgcHJpY2UgPiAwKTsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2xpZW50L3NvYXBhY3Rpb24vQm9va1N0b3JlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2xpZW50L3NvYXBhY3Rpb24vQm9va1N0b3JlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzNTZmYTYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NsaWVudC9zb2FwYWN0aW9uL0Jvb2tTdG9yZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jbGllbnQuc29hcGFjdGlvbjsNCi0NCi1pbXBvcnQgamF2YXguandzLldlYk1ldGhvZDsNCi1pbXBvcnQgamF2YXguandzLldlYlBhcmFtOw0KLWltcG9ydCBqYXZheC5qd3MuV2ViUmVzdWx0Ow0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsNCi1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmc7DQotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlBhcmFtZXRlclN0eWxlOw0KLWltcG9ydCBqYXZheC54bWwud3MuUmVxdWVzdFdyYXBwZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5SZXNwb25zZVdyYXBwZXI7DQotDQotQFdlYlNlcnZpY2UobmFtZSA9ICJCb29rU3RvcmUiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL2pheHdzLmF4aXMyLmFwYWNoZS5vcmcvY2xpZW50L3NvYXBhY3Rpb24iKQ0KLXB1YmxpYyBpbnRlcmZhY2UgQm9va1N0b3JlIHsNCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gaXRlbQ0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIGZsb2F0DQotICAgICAqLw0KLSAgICBAV2ViTWV0aG9kDQotICAgIEBXZWJSZXN1bHQobmFtZSA9ICJwcmljZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vamF4d3MuYXhpczIuYXBhY2hlLm9yZy9jbGllbnQvc29hcGFjdGlvbiIpDQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAiZ2V0UHJpY2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL2pheHdzLmF4aXMyLmFwYWNoZS5vcmcvY2xpZW50L3NvYXBhY3Rpb24iLCBjbGFzc05hbWUgPSAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jbGllbnQuc29hcGFjdGlvbi5HZXRQcmljZVR5cGUiKQ0KLSAgICBAUmVzcG9uc2VXcmFwcGVyKGxvY2FsTmFtZSA9ICJnZXRQcmljZVJlc3BvbnNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9qYXh3cy5heGlzMi5hcGFjaGUub3JnL2NsaWVudC9zb2FwYWN0aW9uIiwgY2xhc3NOYW1lID0gIm9yZy5hcGFjaGUuYXhpczIuamF4d3MuY2xpZW50LnNvYXBhY3Rpb24uR2V0UHJpY2VSZXNwb25zZVR5cGUiKQ0KLSAgICBwdWJsaWMgZmxvYXQgZ2V0UHJpY2UoDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJpdGVtIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9qYXh3cy5heGlzMi5hcGFjaGUub3JnL2NsaWVudC9zb2FwYWN0aW9uIikNCi0gICAgICAgIFN0cmluZyBpdGVtKTsNCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gaXRlbQ0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIGZsb2F0DQotICAgICAqLw0KLSAgICBAV2ViTWV0aG9kKGFjdGlvbiA9ICJodHRwOi8vamF4d3MuYXhpczIuYXBhY2hlLm9yZy9jbGllbnQvc29hcGFjdGlvbi9nZXRQcmljZSIpDQotICAgIEBXZWJSZXN1bHQobmFtZSA9ICJwcmljZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vamF4d3MuYXhpczIuYXBhY2hlLm9yZy9jbGllbnQvc29hcGFjdGlvbiIpDQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAiZ2V0UHJpY2VXaXRoQWN0aW9uIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9qYXh3cy5heGlzMi5hcGFjaGUub3JnL2NsaWVudC9zb2FwYWN0aW9uIiwgY2xhc3NOYW1lID0gIm9yZy5hcGFjaGUuYXhpczIuamF4d3MuY2xpZW50LnNvYXBhY3Rpb24uR2V0UHJpY2VUeXBlIikNCi0gICAgQFJlc3BvbnNlV3JhcHBlcihsb2NhbE5hbWUgPSAiZ2V0UHJpY2VXaXRoQWN0aW9uUmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL2pheHdzLmF4aXMyLmFwYWNoZS5vcmcvY2xpZW50L3NvYXBhY3Rpb24iLCBjbGFzc05hbWUgPSAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jbGllbnQuc29hcGFjdGlvbi5HZXRQcmljZVJlc3BvbnNlVHlwZSIpDQotICAgIHB1YmxpYyBmbG9hdCBnZXRQcmljZVdpdGhBY3Rpb24oDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJpdGVtIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9qYXh3cy5heGlzMi5hcGFjaGUub3JnL2NsaWVudC9zb2FwYWN0aW9uIikNCi0gICAgICAgIFN0cmluZyBpdGVtKTsNCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gaXRlbQ0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIGludA0KLSAgICAgKi8NCi0gICAgQFdlYk1ldGhvZA0KLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAiaW52ZW50b3J5IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9qYXh3cy5heGlzMi5hcGFjaGUub3JnL2NsaWVudC9zb2FwYWN0aW9uIiwgcGFydE5hbWUgPSAiaW52ZW50b3J5IikNCi0gICAgQFNPQVBCaW5kaW5nKHBhcmFtZXRlclN0eWxlID0gUGFyYW1ldGVyU3R5bGUuQkFSRSkNCi0gICAgcHVibGljIGludCBnZXRJbnZlbnRvcnkoDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJpdGVtIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9qYXh3cy5heGlzMi5hcGFjaGUub3JnL2NsaWVudC9zb2FwYWN0aW9uIiwgcGFydE5hbWUgPSAiaXRlbSIpDQotICAgICAgICBTdHJpbmcgaXRlbSk7DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGl0ZW0NCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBpbnQNCi0gICAgICovDQotICAgIEBXZWJNZXRob2QoYWN0aW9uID0gImh0dHA6Ly9qYXh3cy5heGlzMi5hcGFjaGUub3JnL2NsaWVudC9zb2FwYWN0aW9uL2dldEludmVudG9yeSIpDQotICAgIEBXZWJSZXN1bHQobmFtZSA9ICJpbnZlbnRvcnlXaXRoQWN0aW9uIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9qYXh3cy5heGlzMi5hcGFjaGUub3JnL2NsaWVudC9zb2FwYWN0aW9uIiwgcGFydE5hbWUgPSAiaW52ZW50b3J5IikNCi0gICAgQFNPQVBCaW5kaW5nKHBhcmFtZXRlclN0eWxlID0gUGFyYW1ldGVyU3R5bGUuQkFSRSkNCi0gICAgcHVibGljIGludCBnZXRJbnZlbnRvcnlXaXRoQWN0aW9uKA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiaXRlbVdpdGhBY3Rpb24iLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL2pheHdzLmF4aXMyLmFwYWNoZS5vcmcvY2xpZW50L3NvYXBhY3Rpb24iLCBwYXJ0TmFtZSA9ICJpdGVtIikNCi0gICAgICAgIFN0cmluZyBpdGVtKTsNCi0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NsaWVudC9zb2FwYWN0aW9uL0Jvb2tTdG9yZVNlcnZpY2UuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jbGllbnQvc29hcGFjdGlvbi9Cb29rU3RvcmVTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyNWViYjcuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NsaWVudC9zb2FwYWN0aW9uL0Jvb2tTdG9yZVNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY2xpZW50LnNvYXBhY3Rpb247DQotDQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViRW5kcG9pbnQ7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlQ2xpZW50Ow0KLWltcG9ydCBqYXZhLmlvLkZpbGU7DQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLQ0KLUBXZWJTZXJ2aWNlQ2xpZW50KG5hbWUgPSAiQm9va1N0b3JlU2VydmljZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vamF4d3MuYXhpczIuYXBhY2hlLm9yZy9jbGllbnQvc29hcGFjdGlvbiIsIHdzZGxMb2NhdGlvbiA9ICJTT0FQQWN0aW9uVGVzdC53c2RsIikNCi1wdWJsaWMgY2xhc3MgQm9va1N0b3JlU2VydmljZQ0KLSAgICBleHRlbmRzIFNlcnZpY2UNCi17DQotDQotICAgIHByaXZhdGUgc3RhdGljIFVSTCBCT09LU1RPUkVTRVJWSUNFX1dTRExfTE9DQVRJT047DQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyB3c2RsTG9jYXRpb249Ii90YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VzL0Jvb2tTdG9yZVNlcnZpY2UvTUVUQS1JTkYvU09BUEFjdGlvblRlc3Qud3NkbCI7DQotICAgIHN0YXRpYyB7DQotICAgICAgICBVUkwgdXJsID0gbnVsbDsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgdHJ5ew0KLSAgICAgICAgICAgICAgICBTdHJpbmcgYmFzZURpciA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiYmFzZWRpciIsIi4iKSkuZ2V0Q2Fub25pY2FsUGF0aCgpOw0KLSAgICAgICAgICAgICAgICB3c2RsTG9jYXRpb24gPSBuZXcgRmlsZShiYXNlRGlyICsgd3NkbExvY2F0aW9uKS5nZXRBYnNvbHV0ZVBhdGgoKTsNCi0gICAgICAgICAgICB9Y2F0Y2goRXhjZXB0aW9uIGUpew0KLSAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZSh3c2RsTG9jYXRpb24pOw0KLSAgICAgICAgICAgIHVybCA9IGZpbGUudG9VUkwoKTsNCi0gICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIEJPT0tTVE9SRVNFUlZJQ0VfV1NETF9MT0NBVElPTiA9IHVybDsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIEJvb2tTdG9yZVNlcnZpY2UoVVJMIHdzZGxMb2NhdGlvbiwgUU5hbWUgc2VydmljZU5hbWUpIHsNCi0gICAgICAgIHN1cGVyKHdzZGxMb2NhdGlvbiwgc2VydmljZU5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBCb29rU3RvcmVTZXJ2aWNlKCkgew0KLSAgICAgICAgc3VwZXIoQk9PS1NUT1JFU0VSVklDRV9XU0RMX0xPQ0FUSU9OLCBuZXcgUU5hbWUoImh0dHA6Ly9qYXh3cy5heGlzMi5hcGFjaGUub3JnL2NsaWVudC9zb2FwYWN0aW9uIiwgIkJvb2tTdG9yZVNlcnZpY2UiKSk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIEJvb2tTdG9yZQ0KLSAgICAgKi8NCi0gICAgQFdlYkVuZHBvaW50KG5hbWUgPSAiQm9va1N0b3JlUG9ydCIpDQotICAgIHB1YmxpYyBCb29rU3RvcmUgZ2V0Qm9va1N0b3JlUG9ydCgpIHsNCi0gICAgICAgIHJldHVybiAoQm9va1N0b3JlKXN1cGVyLmdldFBvcnQobmV3IFFOYW1lKCJodHRwOi8vamF4d3MuYXhpczIuYXBhY2hlLm9yZy9jbGllbnQvc29hcGFjdGlvbiIsICJCb29rU3RvcmVQb3J0IiksIEJvb2tTdG9yZS5jbGFzcyk7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NsaWVudC9zb2FwYWN0aW9uL3NlcnZlci9NRVRBLUlORi9TT0FQQWN0aW9uVGVzdC53c2RsIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NsaWVudC9zb2FwYWN0aW9uL3NlcnZlci9NRVRBLUlORi9TT0FQQWN0aW9uVGVzdC53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzBjNjNjLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jbGllbnQvc29hcGFjdGlvbi9zZXJ2ZXIvTUVUQS1JTkYvU09BUEFjdGlvblRlc3Qud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/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+DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NsaWVudC9zb2FwYWN0aW9uL3NlcnZlci9NRVRBLUlORi9zZXJ2aWNlcy54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2xpZW50L3NvYXBhY3Rpb24vc2VydmVyL01FVEEtSU5GL3NlcnZpY2VzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNlZjljYi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2xpZW50L3NvYXBhY3Rpb24vc2VydmVyL01FVEEtSU5GL3NlcnZpY2VzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTxzZXJ2aWNlR3JvdXA+DQotIDxzZXJ2aWNlIG5hbWU9IkJvb2tTdG9yZVNlcnZpY2UiPg0KLSAgPG1lc3NhZ2VSZWNlaXZlcnM+DQotICAgPG1lc3NhZ2VSZWNlaXZlciBtZXA9Imh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgvd3NkbC9pbi1vdXQiIA0KLSAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jbGllbnQuc29hcGFjdGlvbi5zZXJ2ZXIuU09BUEFjdGlvblRlc3RzTWVzc2FnZVJlY2VpdmVyIi8+DQotICA8L21lc3NhZ2VSZWNlaXZlcnM+DQotIDwvc2VydmljZT4NCi08L3NlcnZpY2VHcm91cD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2xpZW50L3NvYXBhY3Rpb24vc2VydmVyL1NPQVBBY3Rpb25UZXN0c01lc3NhZ2VSZWNlaXZlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NsaWVudC9zb2FwYWN0aW9uL3NlcnZlci9TT0FQQWN0aW9uVGVzdHNNZXNzYWdlUmVjZWl2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODRmZGUzZC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2xpZW50L3NvYXBhY3Rpb24vc2VydmVyL1NPQVBBY3Rpb25UZXN0c01lc3NhZ2VSZWNlaXZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY2xpZW50LnNvYXBhY3Rpb24uc2VydmVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTVRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzRW5naW5lOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5NZXNzYWdlUmVjZWl2ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuVGVzdExvZ2dlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLk1lc3NhZ2VDb250ZXh0QnVpbGRlcjsNCi0NCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KLQ0KLS8qKg0KLSAqIFRoaXMgTWVzc2FnZVJlY2VpdmVyIGlzIHVzZWQgZm9yIGEgc2VyaWVzIG9mIHRlc3RzIHJlbGF0aW5nIHRvIHRoZQ0KLSAqIFNPQVAgYWN0aW9uLiAgVGhpcyBpcyBtb3N0bHkgZm9yIHRlc3RpbmcgdGhhdCB0aGUgY29ycmVjdCBvcGVyYXRpb24NCi0gKiB3YXMgcmVzb2x2ZWQgYmFzZWQgb24gdGhlIFNPQVAgYWN0aW9uIHRoYXQgd2FzIHNlbnQgYnkgdGhlIGNsaWVudC4gIA0KLSAqLw0KLXB1YmxpYyBjbGFzcyBTT0FQQWN0aW9uVGVzdHNNZXNzYWdlUmVjZWl2ZXIgaW1wbGVtZW50cyBNZXNzYWdlUmVjZWl2ZXIgew0KLSAgICANCi0gICAgcHVibGljIHZvaWQgcmVjZWl2ZShNZXNzYWdlQ29udGV4dCByZXF1ZXN0KSB0aHJvd3MgQXhpc0ZhdWx0IHsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJbc2VydmVyXSBTT0FQQWN0aW9uVGVzdHNNZXNzYWdlUmVjZWl2ZXI6IG5ldyByZXF1ZXN0IHJlY2VpdmVkIik7DQotICAgICAgICANCi0gICAgICAgIFNPQVBFbnZlbG9wZSBlbnYgPSByZXF1ZXN0LmdldEVudmVsb3BlKCk7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiW3NlcnZlcl0gcmVxdWVzdCBtZXNzYWdlIFsiICsgZW52ICsgIl0iKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gR2V0IHRoZSBmaXJzdCBjaGlsZCBlbGVtZW50DQotICAgICAgICBJdGVyYXRvciBpdHIgPSBlbnYuZ2V0Qm9keSgpLmdldENoaWxkRWxlbWVudHMoKTsNCi0gICAgICAgIE9NRWxlbWVudCBjaGlsZCA9IChPTUVsZW1lbnQpIGl0ci5uZXh0KCk7DQotDQotICAgICAgICAvLyBDcmVhdGUgdGhlIGVudmVsb3BlIGZvciB0aGUgcmVzcG9uc2UNCi0gICAgICAgIFNPQVBGYWN0b3J5IHNmID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDExRmFjdG9yeSgpOw0KLSAgICAgICAgU09BUEVudmVsb3BlIHJlc3BvbnNlRW52ID0gc2YuY3JlYXRlU09BUEVudmVsb3BlKCk7DQotICAgICAgICBzZi5jcmVhdGVTT0FQQm9keShyZXNwb25zZUVudik7DQotICAgICAgICBPTUVsZW1lbnQgcmVzcG9uc2VCb2R5Q29udGVudCA9IG51bGw7DQotICAgICAgICANCi0gICAgICAgIC8vIENoZWNrIHRvIHNlZSB3aGljaCBvcGVyYXRpb24gd2FzIGludm9rZWQgYW5kIHRoZW4gdmFsaWRhdGUgdGhlIGNvbnRlbnRzIA0KLSAgICAgICAgLy8gb2YgdGhlIHJlcXVlc3QgKHJlc29sdmVkIEF4aXNPcGVyYXRpb24gYW5kIHRoZSBzb2FwIGFjdGlvbikgdG8gc2VlIGlmIHRoZXkgYXJlIGNvcnJlY3QuDQotICAgICAgICBTdHJpbmcgbmFtZSA9IGNoaWxkLmdldExvY2FsTmFtZSgpOw0KLSAgICAgICAgaWYgKG5hbWUuZXF1YWxzKCJnZXRQcmljZSIpKSB7DQotICAgICAgICAgICAgZmxvYXQgc3RhdHVzID0gMDsNCi0gICAgICAgICAgICBpZiAoY2hlY2tPcGVyYXRpb24oImdldFByaWNlIiwgcmVxdWVzdCkgJiYNCi0gICAgICAgICAgICAgICAgY2hlY2tTT0FQQWN0aW9uKCIiLCByZXF1ZXN0KSkgew0KLSAgICAgICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiW3NlcnZlcl0gYWxsIGNoZWNrcyBwYXNzZWQiKTsNCi0gICAgICAgICAgICAgICAgc3RhdHVzID0gMTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZSB7DQotICAgICAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJbc2VydmVyXSBzb21lIGNoZWNrcyBmYWlsZWQiKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgcmVzcG9uc2VCb2R5Q29udGVudCA9IHNmLmNyZWF0ZU9NRWxlbWVudChuZXcgUU5hbWUoImh0dHA6Ly9qYXh3cy5heGlzMi5hcGFjaGUub3JnL2NsaWVudC9zb2FwYWN0aW9uIiwgImdldFByaWNlV2l0aEFjdGlvblJlc3BvbnNlIiksIHJlc3BvbnNlRW52LmdldEJvZHkoKSk7DQotICAgICAgICAgICAgT01FbGVtZW50IGVsZW0gPSBzZi5jcmVhdGVPTUVsZW1lbnQobmV3IFFOYW1lKCIiLCAicHJpY2UiKSwgcmVzcG9uc2VCb2R5Q29udGVudCk7DQotICAgICAgICAgICAgT01UZXh0IHRleHQgPSBzZi5jcmVhdGVPTVRleHQoRmxvYXQudG9TdHJpbmcoc3RhdHVzKSk7DQotICAgICAgICAgICAgZWxlbS5hZGRDaGlsZCh0ZXh0KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYgKG5hbWUuZXF1YWxzKCJnZXRQcmljZVdpdGhBY3Rpb24iKSkgew0KLSAgICAgICAgICAgIGZsb2F0IHN0YXR1cyA9IDA7DQotICAgICAgICAgICAgaWYgKGNoZWNrT3BlcmF0aW9uKCJnZXRQcmljZVdpdGhBY3Rpb24iLCByZXF1ZXN0KSAmJg0KLSAgICAgICAgICAgICAgICBjaGVja1NPQVBBY3Rpb24oImh0dHA6Ly9qYXh3cy5heGlzMi5hcGFjaGUub3JnL2NsaWVudC9zb2FwYWN0aW9uL2dldFByaWNlIiwgcmVxdWVzdCkpIHsNCi0gICAgICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIltzZXJ2ZXJdIGFsbCBjaGVja3MgcGFzc2VkIik7DQotICAgICAgICAgICAgICAgIHN0YXR1cyA9IDE7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2Ugew0KLSAgICAgICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiW3NlcnZlcl0gc29tZSBjaGVja3MgZmFpbGVkIik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIHJlc3BvbnNlQm9keUNvbnRlbnQgPSBzZi5jcmVhdGVPTUVsZW1lbnQobmV3IFFOYW1lKCJodHRwOi8vamF4d3MuYXhpczIuYXBhY2hlLm9yZy9jbGllbnQvc29hcGFjdGlvbiIsICJnZXRQcmljZVdpdGhBY3Rpb25SZXNwb25zZSIpLCByZXNwb25zZUVudi5nZXRCb2R5KCkpOw0KLSAgICAgICAgICAgIE9NRWxlbWVudCBlbGVtID0gc2YuY3JlYXRlT01FbGVtZW50KG5ldyBRTmFtZSgiIiwgInByaWNlIiksIHJlc3BvbnNlQm9keUNvbnRlbnQpOw0KLSAgICAgICAgICAgIE9NVGV4dCB0ZXh0ID0gc2YuY3JlYXRlT01UZXh0KEZsb2F0LnRvU3RyaW5nKHN0YXR1cykpOw0KLSAgICAgICAgICAgIGVsZW0uYWRkQ2hpbGQodGV4dCk7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIC8qDQotICAgICAgICBlbHNlIGlmIChuYW1lLmVxdWFscygiaXRlbSIpKSB7DQotICAgICAgICAgICAgaWYgKGNoZWNrT3BlcmF0aW9uKCJnZXRJbnZlbnRvcnkiLCByZXF1ZXN0KSAmJg0KLSAgICAgICAgICAgICAgICBjaGVja1NPQVBBY3Rpb24oIiIsIHJlcXVlc3QpKSB7DQotICAgICAgICAgICAgICAgIHN0YXR1cyA9IFNUQVRVU19QQVNTOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYgKG5hbWUuZXF1YWxzKCJpdGVtV2l0aEFjdGlvbiIpKSB7DQotICAgICAgICAgICAgaWYgKGNoZWNrT3BlcmF0aW9uKCJnZXRJbnZlbnRvcnlXaXRoQWN0aW9uIiwgcmVxdWVzdCkgJiYNCi0gICAgICAgICAgICAgICAgY2hlY2tTT0FQQWN0aW9uKCJodHRwOi8vamF4d3MuYXhpczIuYXBhY2hlLm9yZy9jbGllbnQvc29hcGFjdGlvbi9nZXRJbnZlbnRvcnkiLCByZXF1ZXN0KSkgew0KLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBTVEFUVVNfUEFTUzsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICAqLw0KLSAgICAgICAgDQotICAgICAgICAvLyBGaWxsIGluIHRoZSBjb250ZW50cyBvZiB0aGUgcmVzcG9uc2UgYW5kIHNlbmQgaXQgYmFjaw0KLSAgICAgICAgTWVzc2FnZUNvbnRleHQgcmVzcG9uc2UgPSBNZXNzYWdlQ29udGV4dEJ1aWxkZXIuY3JlYXRlT3V0TWVzc2FnZUNvbnRleHQocmVxdWVzdCk7DQotICAgICAgICByZXNwb25zZUVudi5nZXRCb2R5KCkuYWRkQ2hpbGQocmVzcG9uc2VCb2R5Q29udGVudCk7DQotICAgICAgICByZXNwb25zZS5zZXRFbnZlbG9wZShyZXNwb25zZUVudik7DQotDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiW3NlcnZlcl0gcmVzcG9uc2UgbWVzc2FnZSBbIiArIHJlc3BvbnNlRW52LnRvU3RyaW5nKCkgKyAiXSIpOw0KLSAgICAgICAgDQotICAgICAgICByZXNwb25zZS5nZXRPcGVyYXRpb25Db250ZXh0KCkuYWRkTWVzc2FnZUNvbnRleHQocmVzcG9uc2UpOw0KLSAgICAgICAgQXhpc0VuZ2luZS5zZW5kKHJlc3BvbnNlKTsgICAgDQotICAgIH0NCi0gICAgDQotICAgIC8qDQotICAgICAqIFZlcmlmeSB0aGF0IHRoZSBBeGlzT3BlcmF0aW9uIG9uIHRoZSBNZXNzYWdlQ29udGV4dCBpcyB0aGUgDQotICAgICAqIG9uZSB0aGF0IHdlIHdlcmUgZXhwZWN0aW5nIGJhc2VkIG9uIHRoZSByZXF1ZXN0Lg0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBib29sZWFuIGNoZWNrT3BlcmF0aW9uKFN0cmluZyBleHBlY3RlZE9wZXJhdGlvbk5hbWUsIE1lc3NhZ2VDb250ZXh0IG1jKSB7DQotICAgICAgICBBeGlzT3BlcmF0aW9uIG9wID0gbWMuZ2V0QXhpc09wZXJhdGlvbigpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIltzZXJ2ZXJdIGNoZWNraW5nIGV4cGVjdGVkIG9wZXJhdGlvbiBbIiArIGV4cGVjdGVkT3BlcmF0aW9uTmFtZSArDQotICAgICAgICAgICAgICAgICJdIGFnYWluc3QgcmVzb2x2ZWQgb3BlcmF0aW9uIFsiICsgb3AuZ2V0TmFtZSgpICsgIl0iKTsNCi0gICAgICAgIGlmIChvcC5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCkuZXF1YWxzKGV4cGVjdGVkT3BlcmF0aW9uTmFtZSkpIHsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiW3NlcnZlcl0gb3BlcmF0aW9uIG5hbWUgaXMgY29ycmVjdCIpOw0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSB7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIltzZXJ2ZXJdIG9wZXJhdGlvbiBuYW1lIGlzIGluY29ycmVjdCIpOw0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICANCi0gICAgLyoNCi0gICAgICogVmVyaWZ5IHRoYXQgdGhlIFNPQVBBY3Rpb24gcHJlc2VudCBvbiB0aGUgTWVzc2FnZUNvbnRleHQgaXMNCi0gICAgICogdGhlIG9uZSB0aGF0IHdlIHdlcmUgZXhwZWN0aW5nIGJhc2VkIG9uIHRoZSByZXF1ZXN0Lg0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBib29sZWFuIGNoZWNrU09BUEFjdGlvbihTdHJpbmcgZXhwZWN0ZWRBY3Rpb24sIE1lc3NhZ2VDb250ZXh0IG1jKSB7DQotICAgICAgIFN0cmluZyBhY3Rpb24gPSBtYy5nZXRTb2FwQWN0aW9uKCk7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiW3NlcnZlcl0gY2hlY2tpbmcgZXhwZWN0ZWQgYWN0aW9uIFsiICsgZXhwZWN0ZWRBY3Rpb24gKw0KLSAgICAgICAgICAgICAgICAiXSBhZ2FpbnN0IHJlY2VpdmVkIGFjdGlvbiBbIiArIGFjdGlvbiArICJdIik7DQotICAgICAgIGlmIChhY3Rpb24gIT0gbnVsbCAmJiBhY3Rpb24uZXF1YWxzKGV4cGVjdGVkQWN0aW9uKSkgew0KLSAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIltzZXJ2ZXJdIHNvYXAgYWN0aW9uIGlzIGNvcnJlY3QiKTsNCi0gICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICB9ICAgICAgICAgICANCi0gICAgICAgZWxzZSB7DQotICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiW3NlcnZlcl0gc29hcCBhY3Rpb24gaXMgaW5jb3JyZWN0Iik7DQotICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgIH0gICANCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvY29udGV4dC9NRVRBLUlORi9NZXNzYWdlQ29udGV4dC53c2RsIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NvbnRleHQvTUVUQS1JTkYvTWVzc2FnZUNvbnRleHQud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE3MDU3YS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvY29udGV4dC9NRVRBLUlORi9NZXNzYWdlQ29udGV4dC53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI/Pg0KLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTxkZWZpbml0aW9ucyB4bWxuczp0bnM9Imh0dHA6Ly9jb250ZXh0LmpheHdzLmF4aXMyLmFwYWNoZS5vcmcvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIg0KLSAgICAgICAgICAgICB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiB4bWxucz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iDQotICAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2NvbnRleHQuamF4d3MuYXhpczIuYXBhY2hlLm9yZy8iIG5hbWU9Ik1lc3NhZ2VDb250ZXh0U2VydmljZSI+DQotICAgIDx0eXBlcz4NCi0gICAgICAgIDx4czpzY2hlbWEgeG1sbnM6dG5zPSJodHRwOi8vY29udGV4dC5qYXh3cy5heGlzMi5hcGFjaGUub3JnLyIgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIg0KLSAgICAgICAgICAgICAgICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9jb250ZXh0LmpheHdzLmF4aXMyLmFwYWNoZS5vcmcvIiB2ZXJzaW9uPSIxLjAiPg0KLSAgICAgICAgICAgIDwhLS0gcmVhZCB0aGUgdmFsdWUgb2YgYSBwcm9wZXJ0eSAtLT4NCi0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJpc1Byb3BlcnR5UHJlc2VudCI+DQotICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4NCi0gICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eU5hbWUiIHR5cGU9InhzOnN0cmluZyIvPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InZhbHVlIiB0eXBlPSJ4czpzdHJpbmciLz4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJ0eXBlIiB0eXBlPSJ4czpzdHJpbmciLz4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJpc0ZvdW5kIiB0eXBlPSJ4czpib29sZWFuIi8+DQotICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPg0KLSAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPg0KLSAgICAgICAgICAgIDwveHM6ZWxlbWVudD4NCi0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJpc1Byb3BlcnR5UHJlc2VudFJlc3BvbnNlIj4NCi0gICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InByb3BlcnR5TmFtZSIgdHlwZT0ieHM6c3RyaW5nIi8+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0idmFsdWUiIHR5cGU9InhzOnN0cmluZyIvPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InR5cGUiIHR5cGU9InhzOnN0cmluZyIvPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9ImlzRm91bmQiIHR5cGU9InhzOmJvb2xlYW4iLz4NCi0gICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+DQotICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+DQotICAgICAgICAgICAgPC94czplbGVtZW50Pg0KLSAgICAgICAgPC94czpzY2hlbWE+DQotICAgIDwvdHlwZXM+DQotICAgIDxtZXNzYWdlIG5hbWU9ImlzUHJvcGVydHlQcmVzZW50Ij4NCi0gICAgICAgIDxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9InRuczppc1Byb3BlcnR5UHJlc2VudCIvPg0KLSAgICA8L21lc3NhZ2U+DQotICAgIDxtZXNzYWdlIG5hbWU9ImlzUHJvcGVydHlQcmVzZW50UmVzcG9uc2UiPg0KLSAgICAgICAgPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0idG5zOmlzUHJvcGVydHlQcmVzZW50UmVzcG9uc2UiLz4NCi0gICAgPC9tZXNzYWdlPg0KLSAgICA8cG9ydFR5cGUgbmFtZT0iTWVzc2FnZUNvbnRleHQiPg0KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJpc1Byb3BlcnR5UHJlc2VudCI+DQotICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczppc1Byb3BlcnR5UHJlc2VudCIvPg0KLSAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmlzUHJvcGVydHlQcmVzZW50UmVzcG9uc2UiLz4NCi0gICAgICAgIDwvb3BlcmF0aW9uPg0KLSAgICA8L3BvcnRUeXBlPg0KLSAgICA8YmluZGluZyBuYW1lPSJNZXNzYWdlQ29udGV4dFBvcnRCaW5kaW5nIiB0eXBlPSJ0bnM6TWVzc2FnZUNvbnRleHQiPg0KLSAgICAgICAgPHNvYXA6YmluZGluZyBzdHlsZT0iZG9jdW1lbnQiIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIi8+DQotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImlzUHJvcGVydHlQcmVzZW50Ij4NCi0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24vPg0KLSAgICAgICAgICAgIDxpbnB1dD4NCi0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4NCi0gICAgICAgICAgICA8L2lucHV0Pg0KLSAgICAgICAgICAgIDxvdXRwdXQ+DQotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgICAgICAgPC9vdXRwdXQ+DQotICAgICAgICA8L29wZXJhdGlvbj4NCi0gICAgPC9iaW5kaW5nPg0KLSAgICA8c2VydmljZSBuYW1lPSJNZXNzYWdlQ29udGV4dFNlcnZpY2UiPg0KLSAgICAgICAgPHBvcnQgbmFtZT0iTWVzc2FnZUNvbnRleHRQb3J0IiBiaW5kaW5nPSJ0bnM6TWVzc2FnZUNvbnRleHRQb3J0QmluZGluZyI+DQotICAgICAgICAgICAgPHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo2MDYwL2F4aXMyL3NlcnZpY2VzL01lc3NhZ2VDb250ZXh0U2VydmljZSIvPg0KLSAgICAgICAgPC9wb3J0Pg0KLSAgICA8L3NlcnZpY2U+DQotPC9kZWZpbml0aW9ucz4NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvY29udGV4dC9NZXNzYWdlQ29udGV4dEltcGwuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jb250ZXh0L01lc3NhZ2VDb250ZXh0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmNjNDA5Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jb250ZXh0L01lc3NhZ2VDb250ZXh0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb250ZXh0Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvbnRleHQuc2VpLk1lc3NhZ2VDb250ZXh0Ow0KLQ0KLWltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlJlc291cmNlOw0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLkhvbGRlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VDb250ZXh0Ow0KLQ0KLUBXZWJTZXJ2aWNlKHNlcnZpY2VOYW1lPSJNZXNzYWdlQ29udGV4dFNlcnZpY2UiLA0KLSAgICAgICAgcG9ydE5hbWU9Ik1lc3NhZ2VDb250ZXh0UG9ydCIsDQotICAgICAgICB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL2NvbnRleHQuamF4d3MuYXhpczIuYXBhY2hlLm9yZy8iLA0KLSAgICAgICAgZW5kcG9pbnRJbnRlcmZhY2UgPSAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb250ZXh0LnNlaS5NZXNzYWdlQ29udGV4dCIpDQotcHVibGljIGNsYXNzIE1lc3NhZ2VDb250ZXh0SW1wbCBpbXBsZW1lbnRzIE1lc3NhZ2VDb250ZXh0IHsNCi0NCi0gICAgQFJlc291cmNlDQotICAgIFdlYlNlcnZpY2VDb250ZXh0IGN0eHQ7DQotDQotICAgIHB1YmxpYyB2b2lkIGlzUHJvcGVydHlQcmVzZW50KA0KLSAgICAgICAgICAgIEhvbGRlcjxTdHJpbmc+IHByb3BlcnR5TmFtZSwNCi0gICAgICAgICAgICBIb2xkZXI8U3RyaW5nPiB2YWx1ZSwNCi0gICAgICAgICAgICBIb2xkZXI8U3RyaW5nPiB0eXBlLA0KLSAgICAgICAgICAgIEhvbGRlcjxCb29sZWFuPiBpc0ZvdW5kKSB7DQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIj4+IGlzUHJvcGVydHlQcmVzZW50KCIgKyBwcm9wZXJ0eU5hbWUudmFsdWUgKyAiKSIpOw0KLSAgICAgICAgamF2YXgueG1sLndzLmhhbmRsZXIuTWVzc2FnZUNvbnRleHQgbXNnQ3R4dCA9IGN0eHQuZ2V0TWVzc2FnZUNvbnRleHQoKTsNCi0gICAgICAgIGlmIChtc2dDdHh0ICE9IG51bGwpIHsNCi0gICAgICAgICAgICBpc0ZvdW5kLnZhbHVlID0gbXNnQ3R4dC5jb250YWluc0tleShwcm9wZXJ0eU5hbWUudmFsdWUpOw0KLSAgICAgICAgICAgIE9iamVjdCB2YWwgPSBtc2dDdHh0LmdldChwcm9wZXJ0eU5hbWUudmFsdWUpOw0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigibXNnQ3R4dC5jb250YWluc0tleT0iICsgaXNGb3VuZC52YWx1ZSk7DQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJtc2dDdHh0LmdldD0iICsgdmFsKTsNCi0NCi0gICAgICAgICAgICBpZiAodmFsICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgdHlwZS52YWx1ZSA9IHZhbC5nZXRDbGFzcygpLmdldE5hbWUoKTsNCi0gICAgICAgICAgICAgICAgdmFsdWUudmFsdWUgPSB2YWwudG9TdHJpbmcoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIjw8IGlzUHJvcGVydHlQcmVzZW50KCkiKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvY29udGV4dC9zZWkvTWVzc2FnZUNvbnRleHQuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jb250ZXh0L3NlaS9NZXNzYWdlQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjNkZGVhLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jb250ZXh0L3NlaS9NZXNzYWdlQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb250ZXh0LnNlaTsNCi0NCi1pbXBvcnQgamF2YXguandzLldlYk1ldGhvZDsNCi1pbXBvcnQgamF2YXguandzLldlYlBhcmFtOw0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLkhvbGRlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLlJlcXVlc3RXcmFwcGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuUmVzcG9uc2VXcmFwcGVyOw0KLQ0KLQ0KLUBXZWJTZXJ2aWNlKG5hbWUgPSAiTWVzc2FnZUNvbnRleHQiLCANCi0gICAgICAgIHBvcnROYW1lPSJNZXNzYWdlQ29udGV4dFBvcnQiLA0KLSAgICAgICAgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9jb250ZXh0LmpheHdzLmF4aXMyLmFwYWNoZS5vcmcvIiwgDQotICAgICAgICB3c2RsTG9jYXRpb24gPSAiTUVUQS1JTkYvTWVzc2FnZUNvbnRleHQud3NkbCIpDQotcHVibGljIGludGVyZmFjZSBNZXNzYWdlQ29udGV4dCB7DQotICAgIC8qKg0KLSAgICAgKiBAcGFyYW0gdmFsdWUNCi0gICAgICogQHBhcmFtIHR5cGUNCi0gICAgICogQHBhcmFtIHByb3BlcnR5TmFtZQ0KLSAgICAgKiBAcGFyYW0gaXNGb3VuZA0KLSAgICAgKi8NCi0gICAgQFdlYk1ldGhvZA0KLSAgICBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gImlzUHJvcGVydHlQcmVzZW50IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9jb250ZXh0LmpheHdzLmF4aXMyLmFwYWNoZS5vcmcvIiwgY2xhc3NOYW1lID0gIm9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29udGV4dC5zZWkuSXNQcm9wZXJ0eVByZXNlbnQiKQ0KLSAgICBAUmVzcG9uc2VXcmFwcGVyKGxvY2FsTmFtZSA9ICJpc1Byb3BlcnR5UHJlc2VudFJlc3BvbnNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9jb250ZXh0LmpheHdzLmF4aXMyLmFwYWNoZS5vcmcvIiwgY2xhc3NOYW1lID0gIm9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29udGV4dC5zZWkuSXNQcm9wZXJ0eVByZXNlbnRSZXNwb25zZSIpDQotICAgIHB1YmxpYyB2b2lkIGlzUHJvcGVydHlQcmVzZW50KA0KLSAgICAgICAgICAgIEBXZWJQYXJhbShuYW1lID0gInByb3BlcnR5TmFtZSIsIHRhcmdldE5hbWVzcGFjZSA9ICIiLCBtb2RlID0gV2ViUGFyYW0uTW9kZS5JTk9VVCkNCi0gICAgICAgICAgICBIb2xkZXI8U3RyaW5nPiBwcm9wZXJ0eU5hbWUsDQotICAgICAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAidmFsdWUiLCB0YXJnZXROYW1lc3BhY2UgPSAiIiwgbW9kZSA9IFdlYlBhcmFtLk1vZGUuSU5PVVQpDQotICAgICAgICAgICAgSG9sZGVyPFN0cmluZz4gdmFsdWUsDQotICAgICAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAidHlwZSIsIHRhcmdldE5hbWVzcGFjZSA9ICIiLCBtb2RlID0gV2ViUGFyYW0uTW9kZS5JTk9VVCkNCi0gICAgICAgICAgICBIb2xkZXI8U3RyaW5nPiB0eXBlLA0KLSAgICAgICAgICAgIEBXZWJQYXJhbShuYW1lID0gImlzRm91bmQiLCB0YXJnZXROYW1lc3BhY2UgPSAiIiwgbW9kZSA9IFdlYlBhcmFtLk1vZGUuSU5PVVQpDQotICAgICAgICAgICAgSG9sZGVyPEJvb2xlYW4+IGlzRm91bmQpOw0KLQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvY29udGV4dC9zZWkvTWVzc2FnZUNvbnRleHRTZXJ2aWNlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvY29udGV4dC9zZWkvTWVzc2FnZUNvbnRleHRTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjMzM2NzcuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NvbnRleHQvc2VpL01lc3NhZ2VDb250ZXh0U2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb250ZXh0LnNlaTsNCi0NCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJFbmRwb2ludDsNCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VDbGllbnQ7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRmVhdHVyZTsNCi1pbXBvcnQgamF2YS5pby5GaWxlOw0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247DQotaW1wb3J0IGphdmEubmV0LlVSTDsNCi1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOw0KLQ0KLQ0KLUBXZWJTZXJ2aWNlQ2xpZW50KG5hbWUgPSAiTWVzc2FnZUNvbnRleHRTZXJ2aWNlIiwgDQotICAgICAgICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9jb250ZXh0LmpheHdzLmF4aXMyLmFwYWNoZS5vcmcvIiwgDQotICAgICAgICAgICAgICAgICAgd3NkbExvY2F0aW9uID0gIk1lc3NhZ2VDb250ZXh0LndzZGwiKQ0KLXB1YmxpYyBjbGFzcyBNZXNzYWdlQ29udGV4dFNlcnZpY2UNCi0gICAgICAgIGV4dGVuZHMgU2VydmljZSB7DQotDQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFVSTCBNRVNTQUdFQ09OVEVYVFNFUlZJQ0VfV1NETF9MT0NBVElPTjsNCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIob3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb250ZXh0LnNlaS5NZXNzYWdlQ29udGV4dFNlcnZpY2UuY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHdzZGxMb2NhdGlvbiA9ICIvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NvbnRleHQvTUVUQS1JTkYvTWVzc2FnZUNvbnRleHQud3NkbCI7DQotDQotICAgIHN0YXRpYyB7DQotICAgICAgICBVUkwgdXJsID0gbnVsbDsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICAgICAgU3RyaW5nIGJhc2VEaXIgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoImJhc2VkaXIiLCAiLiIpKS5nZXRDYW5vbmljYWxQYXRoKCk7DQotICAgICAgICAgICAgICAgIHdzZGxMb2NhdGlvbiA9IG5ldyBGaWxlKGJhc2VEaXIgKyB3c2RsTG9jYXRpb24pLmdldEFic29sdXRlUGF0aCgpOw0KLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKHdzZGxMb2NhdGlvbik7DQotICAgICAgICAgICAgdXJsID0gZmlsZS50b1VSTCgpOw0KLSAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgTUVTU0FHRUNPTlRFWFRTRVJWSUNFX1dTRExfTE9DQVRJT04gPSB1cmw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE1lc3NhZ2VDb250ZXh0U2VydmljZShVUkwgd3NkbExvY2F0aW9uLCBRTmFtZSBzZXJ2aWNlTmFtZSkgew0KLSAgICAgICAgc3VwZXIod3NkbExvY2F0aW9uLCBzZXJ2aWNlTmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE1lc3NhZ2VDb250ZXh0U2VydmljZSgpIHsNCi0gICAgICAgIHN1cGVyKE1FU1NBR0VDT05URVhUU0VSVklDRV9XU0RMX0xPQ0FUSU9OLCBuZXcgUU5hbWUoImh0dHA6Ly9jb250ZXh0LmpheHdzLmF4aXMyLmFwYWNoZS5vcmcvIiwgIk1lc3NhZ2VDb250ZXh0U2VydmljZSIpKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogQHJldHVybiByZXR1cm5zIE1lc3NhZ2VDb250ZXh0DQotICAgICAqLw0KLSAgICBAV2ViRW5kcG9pbnQobmFtZSA9ICJNZXNzYWdlQ29udGV4dFBvcnQiKQ0KLSAgICBwdWJsaWMgTWVzc2FnZUNvbnRleHQgZ2V0TWVzc2FnZUNvbnRleHRQb3J0KCkgew0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldFBvcnQobmV3IFFOYW1lKCJodHRwOi8vY29udGV4dC5qYXh3cy5heGlzMi5hcGFjaGUub3JnLyIsICJNZXNzYWdlQ29udGV4dFBvcnQiKSwgTWVzc2FnZUNvbnRleHQuY2xhc3MpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBAcGFyYW0gZmVhdHVyZXMgQSBsaXN0IG9mIHtAbGluayBqYXZheC54bWwud3MuV2ViU2VydmljZUZlYXR1cmV9IHRvIGNvbmZpZ3VyZSBvbiB0aGUgcHJveHkuICBTdXBwb3J0ZWQgZmVhdHVyZXMgbm90IGluIHRoZSA8Y29kZT5mZWF0dXJlczwvY29kZT4gcGFyYW1ldGVyIHdpbGwgaGF2ZSB0aGVpciBkZWZhdWx0IHZhbHVlcy4NCi0gICAgICogQHJldHVybiByZXR1cm5zIE1lc3NhZ2VDb250ZXh0DQotICAgICAqLw0KLSAgICBAV2ViRW5kcG9pbnQobmFtZSA9ICJNZXNzYWdlQ29udGV4dFBvcnQiKQ0KLSAgICBwdWJsaWMgTWVzc2FnZUNvbnRleHQgZ2V0TWVzc2FnZUNvbnRleHRQb3J0KFdlYlNlcnZpY2VGZWF0dXJlLi4uIGZlYXR1cmVzKSB7DQotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0UG9ydChuZXcgUU5hbWUoImh0dHA6Ly9jb250ZXh0LmpheHdzLmF4aXMyLmFwYWNoZS5vcmcvIiwgIk1lc3NhZ2VDb250ZXh0UG9ydCIpLCBNZXNzYWdlQ29udGV4dC5jbGFzcywgZmVhdHVyZXMpOw0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jb250ZXh0L3Rlc3RzL01lc3NhZ2VDb250ZXh0VGVzdHMuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jb250ZXh0L3Rlc3RzL01lc3NhZ2VDb250ZXh0VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTE1ZGU2YS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvY29udGV4dC90ZXN0cy9NZXNzYWdlQ29udGV4dFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb250ZXh0LnRlc3RzOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb250ZXh0LnNlaS5NZXNzYWdlQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb250ZXh0LnNlaS5NZXNzYWdlQ29udGV4dFNlcnZpY2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZnJhbWV3b3JrLkFic3RyYWN0VGVzdENhc2U7DQotDQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5CaW5kaW5nUHJvdmlkZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5Ib2xkZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlQ2xpZW50Ow0KLQ0KLXB1YmxpYyBjbGFzcyBNZXNzYWdlQ29udGV4dFRlc3RzIGV4dGVuZHMgQWJzdHJhY3RUZXN0Q2FzZSB7DQotDQotICAgIHN0YXRpYyBmaW5hbCBXZWJTZXJ2aWNlQ2xpZW50IHdzYyA9IE1lc3NhZ2VDb250ZXh0U2VydmljZS5jbGFzcy5nZXRBbm5vdGF0aW9uKFdlYlNlcnZpY2VDbGllbnQuY2xhc3MpOw0KLSAgICANCi0gICAgU3RyaW5nIGF4aXNFbmRwb2ludCA9ICJodHRwOi8vbG9jYWxob3N0OjYwNjAvYXhpczIvc2VydmljZXMvTWVzc2FnZUNvbnRleHRTZXJ2aWNlLk1lc3NhZ2VDb250ZXh0UG9ydCI7DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsNCi0gICAgICAgIHJldHVybiBnZXRUZXN0U2V0dXAobmV3IFRlc3RTdWl0ZShNZXNzYWdlQ29udGV4dFRlc3RzLmNsYXNzKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFdTQ3R4dF9XU0RMX1NFUlZJQ0VfcmVhZCgpIHsNCi0gICAgICAgIFN0cmluZyB0eXBlX2V4cGVjdGVkID0gUU5hbWUuY2xhc3MuZ2V0TmFtZSgpOw0KLSAgICAgICAgU3RyaW5nIHZhbHVlX2V4cGVjdGVkID0gInsiICsgd3NjLnRhcmdldE5hbWVzcGFjZSgpICsgIn0iICsgd3NjLm5hbWUoKTsNCi0gICAgICAgIHJ1blRlc3QoamF2YXgueG1sLndzLmhhbmRsZXIuTWVzc2FnZUNvbnRleHQuV1NETF9TRVJWSUNFLCB0eXBlX2V4cGVjdGVkLCB2YWx1ZV9leHBlY3RlZCwgZmFsc2UpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RXU0N0eHRfV1NETF9QT1JUX3JlYWQoKSB7DQotICAgICAgICBTdHJpbmcgdHlwZV9leHBlY3RlZCA9IFFOYW1lLmNsYXNzLmdldE5hbWUoKTsNCi0gICAgICAgIFN0cmluZyB2YWx1ZV9leHBlY3RlZCA9ICJ7IiArIHdzYy50YXJnZXROYW1lc3BhY2UoKSArICJ9TWVzc2FnZUNvbnRleHRQb3J0IjsNCi0gICAgICAgIHJ1blRlc3QoamF2YXgueG1sLndzLmhhbmRsZXIuTWVzc2FnZUNvbnRleHQuV1NETF9QT1JULCB0eXBlX2V4cGVjdGVkLCB2YWx1ZV9leHBlY3RlZCwgZmFsc2UpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RXU0N0eHRfV1NETF9PUEVSQVRJT05fcmVhZCgpIHsNCi0gICAgICAgIFN0cmluZyB0eXBlX2V4cGVjdGVkID0gUU5hbWUuY2xhc3MuZ2V0TmFtZSgpOw0KLSAgICAgICAgU3RyaW5nIHZhbHVlX2V4cGVjdGVkID0gImlzUHJvcGVydHlQcmVzZW50IjsNCi0gICAgICAgIHJ1blRlc3QoamF2YXgueG1sLndzLmhhbmRsZXIuTWVzc2FnZUNvbnRleHQuV1NETF9PUEVSQVRJT04sIHR5cGVfZXhwZWN0ZWQsIHZhbHVlX2V4cGVjdGVkLCBmYWxzZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFdTQ3R4dF9XU0RMX0lOVEVSRkFDRV9yZWFkKCkgew0KLSAgICAgICAgU3RyaW5nIHR5cGVfZXhwZWN0ZWQgPSBRTmFtZS5jbGFzcy5nZXROYW1lKCk7DQotICAgICAgICBTdHJpbmcgdmFsdWVfZXhwZWN0ZWQgPSAieyIgKyB3c2MudGFyZ2V0TmFtZXNwYWNlKCkgKyAifU1lc3NhZ2VDb250ZXh0IjsNCi0gICAgICAgIHJ1blRlc3QoamF2YXgueG1sLndzLmhhbmRsZXIuTWVzc2FnZUNvbnRleHQuV1NETF9JTlRFUkZBQ0UsIHR5cGVfZXhwZWN0ZWQsIHZhbHVlX2V4cGVjdGVkLCBmYWxzZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFdTQ3R4dF9XU0RMX0RFU0NSSVBUSU9OX3JlYWQoKSB7DQotICAgICAgICBTdHJpbmcgdHlwZV9leHBlY3RlZCA9IGphdmEubmV0LlVSSS5jbGFzcy5nZXROYW1lKCk7DQotICAgICAgICBTdHJpbmcgdmFsdWVfZXhwZWN0ZWQgPSAiTUVUQS1JTkYvTWVzc2FnZUNvbnRleHQud3NkbCI7DQotICAgICAgICBydW5UZXN0KGphdmF4LnhtbC53cy5oYW5kbGVyLk1lc3NhZ2VDb250ZXh0LldTRExfREVTQ1JJUFRJT04sIHR5cGVfZXhwZWN0ZWQsIHZhbHVlX2V4cGVjdGVkLCBmYWxzZSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHJ1blRlc3QoU3RyaW5nIHByb3BOYW1lLCBTdHJpbmcgZXhUeXBlLCBTdHJpbmcgZXhWYWx1ZSwgYm9vbGVhbiBpc1ZhbHVlRnVsbHlTcGVjaWZpZWQpIHsNCi0gICAgICAgIE1lc3NhZ2VDb250ZXh0IHBvcnQgPSBnZXRQb3J0KCk7DQotDQotICAgICAgICBIb2xkZXI8U3RyaW5nPiB0eXBlID0gbmV3IEhvbGRlcjxTdHJpbmc+KCk7DQotICAgICAgICBIb2xkZXI8U3RyaW5nPiB2YWx1ZSA9IG5ldyBIb2xkZXI8U3RyaW5nPigpOw0KLSAgICAgICAgSG9sZGVyPEJvb2xlYW4+IGlzRm91bmQgPSBuZXcgSG9sZGVyPEJvb2xlYW4+KCk7DQotICAgICAgICBIb2xkZXI8U3RyaW5nPiBwcm9wZXJ0eU5hbWUgPSBuZXcgSG9sZGVyPFN0cmluZz4ocHJvcE5hbWUpOw0KLQ0KLSAgICAgICAgcG9ydC5pc1Byb3BlcnR5UHJlc2VudChwcm9wZXJ0eU5hbWUsIHZhbHVlLCB0eXBlLCBpc0ZvdW5kKTsNCi0NCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUHJvcGVydHkgPSAiICsgcHJvcE5hbWUgKyAiIGZvdW5kPSIgKyBpc0ZvdW5kLnZhbHVlKTsNCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVmFsdWUgPSAiICsgdmFsdWUudmFsdWUgKyAiLyIgKyBleFZhbHVlKTsNCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVHlwZSA9ICIgKyB0eXBlLnZhbHVlICsgIi8iICsgZXhUeXBlKTsNCi0NCi0gICAgICAgIGFzc2VydFRydWUoIldlYlNlcnZpY2VDb250ZXh0IGRpZCBub3QgZXhwb3NlICIgKyBwcm9wZXJ0eU5hbWUudmFsdWUsIGlzRm91bmQudmFsdWUpOw0KLQ0KLSAgICAgICAgaWYgKGV4VHlwZSAhPSBudWxsKQ0KLSAgICAgICAgICAgIGFzc2VydFRydWUoIlR5cGUgb2YgIiArIHByb3BlcnR5TmFtZS52YWx1ZSArICIgZG9lcyBub3QgbWF0Y2ggWyIgKyB0eXBlLnZhbHVlICsgIiwgIiArIGV4VHlwZSArICJdIiwNCi0gICAgICAgICAgICAgICAgICAgIHR5cGUudmFsdWUgIT0gbnVsbCAmJiB0eXBlLnZhbHVlLmluZGV4T2YoZXhUeXBlKSA+IC0xKTsNCi0NCi0gICAgICAgIGlmIChleFZhbHVlICE9IG51bGwpIHsNCi0gICAgICAgICAgICBpZiAoaXNWYWx1ZUZ1bGx5U3BlY2lmaWVkKSB7DQotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygiVmFsdWUgb2YgIiArIHByb3BlcnR5TmFtZS52YWx1ZSArICIgZG9lcyBub3QgbWF0Y2giLCBleFZhbHVlLCB2YWx1ZS52YWx1ZSk7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiVmFsdWUgb2YgIiArIHByb3BlcnR5TmFtZS52YWx1ZSArICIgZG9lcyBub3QgY29udGFpbiAiICsgZXhWYWx1ZSwgdmFsdWUudmFsdWUuaW5kZXhPZihleFZhbHVlKSAhPSAtMSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBNZXNzYWdlQ29udGV4dCBnZXRQb3J0KCkgew0KLSAgICAgICAgTWVzc2FnZUNvbnRleHRTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgTWVzc2FnZUNvbnRleHRTZXJ2aWNlKCk7DQotICAgICAgICBNZXNzYWdlQ29udGV4dCBwb3J0ID0gc2VydmljZS5nZXRNZXNzYWdlQ29udGV4dFBvcnQoKTsNCi0gICAgICAgIEJpbmRpbmdQcm92aWRlciBwID0gKEJpbmRpbmdQcm92aWRlcikgcG9ydDsNCi0gICAgICAgIHAuZ2V0UmVxdWVzdENvbnRleHQoKS5wdXQoQmluZGluZ1Byb3ZpZGVyLkVORFBPSU5UX0FERFJFU1NfUFJPUEVSVFksIGF4aXNFbmRwb2ludCk7DQotICAgICAgICByZXR1cm4gcG9ydDsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGlzcGF0Y2gvQXN5bmNDYWxsYmFjay5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rpc3BhdGNoL0FzeW5jQ2FsbGJhY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQ1NDQ1YS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGlzcGF0Y2gvQXN5bmNDYWxsYmFjay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kaXNwYXRjaDsNCi0NCi1pbXBvcnQgamF2YXgueG1sLndzLkFzeW5jSGFuZGxlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLlJlc3BvbnNlOw0KLQ0KLXB1YmxpYyBjbGFzcyBBc3luY0NhbGxiYWNrPFQ+IGltcGxlbWVudHMgQXN5bmNIYW5kbGVyPFQ+IHsNCi0NCi0gICAgcHJpdmF0ZSBUIHZhbHVlOw0KLSAgICBwcml2YXRlIFRocm93YWJsZSBleGNlcHRpb247DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCBoYW5kbGVSZXNwb25zZShSZXNwb25zZTxUPiByZXNwb25zZSkgew0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICB2YWx1ZSA9IHJlc3BvbnNlLmdldCgpOw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsNCi0gICAgICAgICAgICBleGNlcHRpb24gPSB0Ow0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNFcnJvcigpIHsNCi0gICAgICAgIHJldHVybiAoZXhjZXB0aW9uICE9IG51bGwpOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgVGhyb3dhYmxlIGdldEVycm9yKCkgew0KLSAgICAgICAgcmV0dXJuIGV4Y2VwdGlvbjsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIFQgZ2V0VmFsdWUoKSB7DQotICAgICAgICByZXR1cm4gdmFsdWU7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rpc3BhdGNoL0NhbGxiYWNrSGFuZGxlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rpc3BhdGNoL0NhbGxiYWNrSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDgyZDQ0Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kaXNwYXRjaC9DYWxsYmFja0hhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGlzcGF0Y2g7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuVGVzdExvZ2dlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLnV0aWwuUmVhZGVyMldyaXRlcjsNCi0NCi1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUE1lc3NhZ2U7DQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MSW5wdXRGYWN0b3J5Ow0KLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsNCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5Bc3luY0hhbmRsZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5SZXNwb25zZTsNCi0NCi1wdWJsaWMgY2xhc3MgQ2FsbGJhY2tIYW5kbGVyPFQ+IGltcGxlbWVudHMgQXN5bmNIYW5kbGVyIDxUPiB7DQotDQotICAgIHB1YmxpYyB2b2lkIGhhbmRsZVJlc3BvbnNlKFJlc3BvbnNlIHJlc3BvbnNlKSB7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gUHJvY2Vzc2luZyBhc3luYyByZXBvbnNlIik7DQotICAgICAgICB0cnl7DQotICAgICAgICAgICAgVCByZXMgPSAoVCkgcmVzcG9uc2UuZ2V0KCk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgaWYocmVzIGluc3RhbmNlb2YgU09BUE1lc3NhZ2Upew0KLSAgICAgICAgICAgIAlTT0FQTWVzc2FnZSBtZXNzYWdlID0gKFNPQVBNZXNzYWdlKSByZXM7DQotICAgICAgICAgICAgCW1lc3NhZ2Uud3JpdGVUbyhTeXN0ZW0ub3V0KTsNCi0gICAgICAgICAgICAJDQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIGlmKHJlcyBpbnN0YW5jZW9mIFN0cmluZyl7DQotICAgICAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJSZXNwb25zZSBbIiArIHJlcyArICJdIik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UgaWYoU291cmNlLmNsYXNzLmlzQXNzaWduYWJsZUZyb20ocmVzLmdldENsYXNzKCkpKXsNCi0gICAgICAgICAgICAgICAgU291cmNlIHNvdXJjZSA9IChTb3VyY2UpIHJlczsNCi0gICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgIFhNTElucHV0RmFjdG9yeSBpbnB1dEZhY3RvcnkgPSBYTUxJbnB1dEZhY3RvcnkubmV3SW5zdGFuY2UoKTsNCi0gICAgICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHJlYWRlciA9IGlucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoc291cmNlKTsNCi0gICAgICAgICAgICAgICAgUmVhZGVyMldyaXRlciByMncgPSBuZXcgUmVhZGVyMldyaXRlcihyZWFkZXIpOw0KLSAgICAgICAgICAgICAgICBTdHJpbmcgcmVzcG9uc2VUZXh0ID0gcjJ3LmdldEFzU3RyaW5nKCk7DQotDQotICAgICAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKHJlc3BvbnNlVGV4dCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIH1jYXRjaChFeGNlcHRpb24gZSl7DQotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGlzcGF0Y2gvRE9NU291cmNlRGlzcGF0Y2hUZXN0cy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rpc3BhdGNoL0RPTVNvdXJjZURpc3BhdGNoVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJmMDRlOC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGlzcGF0Y2gvRE9NU291cmNlRGlzcGF0Y2hUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDc1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGlzcGF0Y2g7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLlRlc3RMb2dnZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZnJhbWV3b3JrLkFic3RyYWN0VGVzdENhc2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS51dGlsLlJlYWRlcjJXcml0ZXI7DQotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50Ow0KLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOw0KLQ0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7DQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7DQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MSW5wdXRGYWN0b3J5Ow0KLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsNCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7DQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVNvdXJjZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLkRpc3BhdGNoOw0KLWltcG9ydCBqYXZheC54bWwud3MuUmVzcG9uc2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOw0KLQ0KLS8qKg0KLSAqIFRoaXMgY2xhc3MgdGVzdHMgdGhlIEpBWC1XUyBEaXNwYXRjaCB3aXRoIHZhcmlvdXMgZm9ybXMgb2YgdGhlIA0KLSAqIGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVNvdXJjZSANCi0gKi8NCi1wdWJsaWMgY2xhc3MgRE9NU291cmNlRGlzcGF0Y2hUZXN0cyBleHRlbmRzIEFic3RyYWN0VGVzdENhc2V7DQotDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFhNTElucHV0RmFjdG9yeSBpbnB1dEZhY3RvcnkgPSBYTUxJbnB1dEZhY3RvcnkubmV3SW5zdGFuY2UoKTsNCi0NCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgew0KLSAgICAgICAgcmV0dXJuIGdldFRlc3RTZXR1cChuZXcgVGVzdFN1aXRlKERPTVNvdXJjZURpc3BhdGNoVGVzdHMuY2xhc3MpKTsNCi0gICAgfQ0KLSAgDQotICAgIHB1YmxpYyB2b2lkIHRlc3RTeW5jUGF5bG9hZE1vZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJ0ZXN0OiAiICsgZ2V0TmFtZSgpKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgSkFYLVdTIGNsaWVudCBhcnRpZmFjdHMNCi0gICAgICAgIFNlcnZpY2Ugc3ZjID0gU2VydmljZS5jcmVhdGUoRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlFOQU1FX1NFUlZJQ0UpOw0KLSAgICAgICAgc3ZjLmFkZFBvcnQoRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlFOQU1FX1BPUlQsIG51bGwsIERpc3BhdGNoVGVzdENvbnN0YW50cy5VUkwpOw0KLSAgICAgICAgRGlzcGF0Y2g8U291cmNlPiBkaXNwYXRjaCA9IHN2Yy5jcmVhdGVEaXNwYXRjaChEaXNwYXRjaFRlc3RDb25zdGFudHMuUU5BTUVfUE9SVCwgDQotICAgICAgICAgICAgICAgIFNvdXJjZS5jbGFzcywgU2VydmljZS5Nb2RlLlBBWUxPQUQpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBDcmVhdGUgdGhlIERPTVNvdXJjZQ0KLSAgICAgICAgRE9NU291cmNlIHJlcXVlc3QgPSBjcmVhdGVET01Tb3VyY2VGcm9tU3RyaW5nKERpc3BhdGNoVGVzdENvbnN0YW50cy5zYW1wbGVCb2R5Q29udGVudCk7DQotDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gSW52b2tpbmcgc3luYyBEaXNwYXRjaCIpOw0KLQkJU291cmNlIHJlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLQkJYXNzZXJ0Tm90TnVsbCgiZGlzcGF0Y2ggaW52b2tlIHJldHVybmVkIG51bGwiLHJlc3BvbnNlKTsNCi0JCQ0KLSAgICAgICAgLy8gVHVybiB0aGUgU291cmNlIGludG8gYSBTdHJpbmcgc28gd2UgY2FuIGNoZWNrIGl0DQotICAgICAgICBTdHJpbmcgcmVzcG9uc2VUZXh0ID0gY3JlYXRlU3RyaW5nRnJvbVNvdXJjZShyZXNwb25zZSk7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZyhyZXNwb25zZVRleHQpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIGNvbnRlbnQgaXMgY29ycmVjdA0KLSAgICAgICAgYXNzZXJ0VHJ1ZSghcmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJzb2FwIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSghcmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJFbnZlbG9wZSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlVGV4dC5jb250YWlucygiQm9keSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJlY2hvU3RyaW5nUmVzcG9uc2UiKSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdFN5bmNNZXNzYWdlTW9kZSgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoInRlc3Q6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBKQVgtV1MgY2xpZW50IGFydGlmYWN0cw0KLSAgICAgICAgU2VydmljZSBzdmMgPSBTZXJ2aWNlLmNyZWF0ZShEaXNwYXRjaFRlc3RDb25zdGFudHMuUU5BTUVfU0VSVklDRSk7DQotICAgICAgICBzdmMuYWRkUG9ydChEaXNwYXRjaFRlc3RDb25zdGFudHMuUU5BTUVfUE9SVCwgbnVsbCwgRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlVSTCk7DQotICAgICAgICBEaXNwYXRjaDxTb3VyY2U+IGRpc3BhdGNoID0gc3ZjLmNyZWF0ZURpc3BhdGNoKERpc3BhdGNoVGVzdENvbnN0YW50cy5RTkFNRV9QT1JULCANCi0gICAgICAgICAgICAgICAgU291cmNlLmNsYXNzLCBTZXJ2aWNlLk1vZGUuTUVTU0FHRSk7DQotICAgICAgICANCi0gICAgICAgIC8vIENyZWF0ZSB0aGUgRE9NU291cmNlDQotICAgICAgICBET01Tb3VyY2UgcmVxdWVzdCA9IGNyZWF0ZURPTVNvdXJjZUZyb21TdHJpbmcoRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLnNhbXBsZVNvYXBNZXNzYWdlKTsNCi0NCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBJbnZva2luZyBzeW5jIERpc3BhdGNoIik7DQotICAgICAgICBTb3VyY2UgcmVzcG9uc2UgPSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKCJkaXNwYXRjaCBpbnZva2UgcmV0dXJuZWQgbnVsbCIscmVzcG9uc2UpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBUdXJuIHRoZSBTb3VyY2UgaW50byBhIFN0cmluZyBzbyB3ZSBjYW4gY2hlY2sgaXQNCi0gICAgICAgIFN0cmluZyByZXNwb25zZVRleHQgPSBjcmVhdGVTdHJpbmdGcm9tU291cmNlKHJlc3BvbnNlKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKHJlc3BvbnNlVGV4dCk7DQotICAgICAgICANCi0gICAgICAgIC8vIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgY29udGVudCBpcyBjb3JyZWN0DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlVGV4dC5jb250YWlucygic29hcCIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJFbnZlbG9wZSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJCb2R5IikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZVRleHQuY29udGFpbnMoImVjaG9TdHJpbmdSZXNwb25zZSIpKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gSW52b2tlIGEgc2Vjb25kIHRpbWUNCi0gICAgICAgIHJlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgiZGlzcGF0Y2ggaW52b2tlIHJldHVybmVkIG51bGwiLHJlc3BvbnNlKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gVHVybiB0aGUgU291cmNlIGludG8gYSBTdHJpbmcgc28gd2UgY2FuIGNoZWNrIGl0DQotICAgICAgICByZXNwb25zZVRleHQgPSBjcmVhdGVTdHJpbmdGcm9tU291cmNlKHJlc3BvbnNlKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKHJlc3BvbnNlVGV4dCk7DQotICAgICAgICANCi0gICAgICAgIC8vIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgY29udGVudCBpcyBjb3JyZWN0DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlVGV4dC5jb250YWlucygic29hcCIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJFbnZlbG9wZSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJCb2R5IikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZVRleHQuY29udGFpbnMoImVjaG9TdHJpbmdSZXNwb25zZSIpKTsNCi0JfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXN5bmNDYWxsYmFja1BheWxvYWRNb2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygidGVzdDogIiArIGdldE5hbWUoKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIEluaXRpYWxpemUgdGhlIEpBWC1XUyBjbGllbnQgYXJ0aWZhY3RzDQotICAgICAgICBTZXJ2aWNlIHN2YyA9IFNlcnZpY2UuY3JlYXRlKERpc3BhdGNoVGVzdENvbnN0YW50cy5RTkFNRV9TRVJWSUNFKTsNCi0gICAgICAgIHN2Yy5hZGRQb3J0KERpc3BhdGNoVGVzdENvbnN0YW50cy5RTkFNRV9QT1JULCBudWxsLCBEaXNwYXRjaFRlc3RDb25zdGFudHMuVVJMKTsNCi0gICAgICAgIERpc3BhdGNoPFNvdXJjZT4gZGlzcGF0Y2ggPSBzdmMuY3JlYXRlRGlzcGF0Y2goRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlFOQU1FX1BPUlQsIA0KLSAgICAgICAgICAgICAgICBTb3VyY2UuY2xhc3MsIFNlcnZpY2UuTW9kZS5QQVlMT0FEKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQ3JlYXRlIHRoZSBET01Tb3VyY2UNCi0gICAgICAgIERPTVNvdXJjZSByZXF1ZXN0ID0gY3JlYXRlRE9NU291cmNlRnJvbVN0cmluZyhEaXNwYXRjaFRlc3RDb25zdGFudHMuc2FtcGxlQm9keUNvbnRlbnQpOw0KLQ0KLSAgICAgICAgLy8gU2V0dXAgdGhlIGNhbGxiYWNrIGZvciBhc3luYyByZXNwb25zZXMNCi0gICAgICAgIEFzeW5jQ2FsbGJhY2s8U291cmNlPiBjYWxsYmFja0hhbmRsZXIgPSBuZXcgQXN5bmNDYWxsYmFjazxTb3VyY2U+KCk7DQotDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gSW52b2tpbmcgYXN5bmMgKGNhbGxiYWNrKSBEaXNwYXRjaCIpOw0KLSAgICAgICAgRnV0dXJlPD8+IG1vbml0b3IgPSBkaXNwYXRjaC5pbnZva2VBc3luYyhyZXF1ZXN0LCBjYWxsYmFja0hhbmRsZXIpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgd2hpbGUgKCFtb25pdG9yLmlzRG9uZSgpKSB7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEFzeW5jIGludm9jYXRpb24gc3RpbGwgbm90IGNvbXBsZXRlIik7DQotICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDApOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICBTb3VyY2UgcmVzcG9uc2UgPSBjYWxsYmFja0hhbmRsZXIuZ2V0VmFsdWUoKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwocmVzcG9uc2UpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBUdXJuIHRoZSBTb3VyY2UgaW50byBhIFN0cmluZyBzbyB3ZSBjYW4gY2hlY2sgaXQNCi0gICAgICAgIFN0cmluZyByZXNwb25zZVRleHQgPSBjcmVhdGVTdHJpbmdGcm9tU291cmNlKHJlc3BvbnNlKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKHJlc3BvbnNlVGV4dCk7DQotICAgICAgICANCi0gICAgICAgIC8vIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgY29udGVudCBpcyBjb3JyZWN0DQotICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZVRleHQuY29udGFpbnMoInNvYXAiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZVRleHQuY29udGFpbnMoIkVudmVsb3BlIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSghcmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJCb2R5IikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZVRleHQuY29udGFpbnMoImVjaG9TdHJpbmdSZXNwb25zZSIpKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gSW52b2tlIGEgc2Vjb25kIHRpbWUNCi0gICAgICAgIC8vIFNldHVwIHRoZSBjYWxsYmFjayBmb3IgYXN5bmMgcmVzcG9uc2VzDQotICAgICAgICBjYWxsYmFja0hhbmRsZXIgPSBuZXcgQXN5bmNDYWxsYmFjazxTb3VyY2U+KCk7DQotDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gSW52b2tpbmcgYXN5bmMgKGNhbGxiYWNrKSBEaXNwYXRjaCIpOw0KLSAgICAgICAgbW9uaXRvciA9IGRpc3BhdGNoLmludm9rZUFzeW5jKHJlcXVlc3QsIGNhbGxiYWNrSGFuZGxlcik7DQotICAgICAgICAgICAgDQotICAgICAgICB3aGlsZSAoIW1vbml0b3IuaXNEb25lKCkpIHsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gQXN5bmMgaW52b2NhdGlvbiBzdGlsbCBub3QgY29tcGxldGUiKTsNCi0gICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIHJlc3BvbnNlID0gY2FsbGJhY2tIYW5kbGVyLmdldFZhbHVlKCk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3BvbnNlKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gVHVybiB0aGUgU291cmNlIGludG8gYSBTdHJpbmcgc28gd2UgY2FuIGNoZWNrIGl0DQotICAgICAgICByZXNwb25zZVRleHQgPSBjcmVhdGVTdHJpbmdGcm9tU291cmNlKHJlc3BvbnNlKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKHJlc3BvbnNlVGV4dCk7DQotICAgICAgICANCi0gICAgICAgIC8vIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgY29udGVudCBpcyBjb3JyZWN0DQotICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZVRleHQuY29udGFpbnMoInNvYXAiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZVRleHQuY29udGFpbnMoIkVudmVsb3BlIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSghcmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJCb2R5IikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZVRleHQuY29udGFpbnMoImVjaG9TdHJpbmdSZXNwb25zZSIpKTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIHZvaWQgdGVzdEFzeW5jQ2FsbGJhY2tNZXNzYWdlTW9kZSgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoInRlc3Q6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBKQVgtV1MgY2xpZW50IGFydGlmYWN0cw0KLSAgICAgICAgU2VydmljZSBzdmMgPSBTZXJ2aWNlLmNyZWF0ZShEaXNwYXRjaFRlc3RDb25zdGFudHMuUU5BTUVfU0VSVklDRSk7DQotICAgICAgICBzdmMuYWRkUG9ydChEaXNwYXRjaFRlc3RDb25zdGFudHMuUU5BTUVfUE9SVCwgbnVsbCwgRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlVSTCk7DQotICAgICAgICBEaXNwYXRjaDxTb3VyY2U+IGRpc3BhdGNoID0gc3ZjLmNyZWF0ZURpc3BhdGNoKERpc3BhdGNoVGVzdENvbnN0YW50cy5RTkFNRV9QT1JULCANCi0gICAgICAgICAgICAgICAgU291cmNlLmNsYXNzLCBTZXJ2aWNlLk1vZGUuTUVTU0FHRSk7DQotICAgICAgICANCi0gICAgICAgIC8vIENyZWF0ZSB0aGUgRE9NU291cmNlDQotICAgICAgICBET01Tb3VyY2UgcmVxdWVzdCA9IGNyZWF0ZURPTVNvdXJjZUZyb21TdHJpbmcoRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLnNhbXBsZVNvYXBNZXNzYWdlKTsNCi0NCi0gICAgICAgIC8vIFNldHVwIHRoZSBjYWxsYmFjayBmb3IgYXN5bmMgcmVzcG9uc2VzDQotICAgICAgICBBc3luY0NhbGxiYWNrPFNvdXJjZT4gY2FsbGJhY2tIYW5kbGVyID0gbmV3IEFzeW5jQ2FsbGJhY2s8U291cmNlPigpOw0KLQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEludm9raW5nIGFzeW5jIChjYWxsYmFjaykgRGlzcGF0Y2giKTsNCi0gICAgICAgIEZ1dHVyZTw/PiBtb25pdG9yID0gZGlzcGF0Y2guaW52b2tlQXN5bmMocmVxdWVzdCwgY2FsbGJhY2tIYW5kbGVyKTsNCi0JICAgICAgICANCi0gICAgICAgIHdoaWxlICghbW9uaXRvci5pc0RvbmUoKSkgew0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBBc3luYyBpbnZvY2F0aW9uIHN0aWxsIG5vdCBjb21wbGV0ZSIpOw0KLSAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgU291cmNlIHJlc3BvbnNlID0gY2FsbGJhY2tIYW5kbGVyLmdldFZhbHVlKCk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3BvbnNlKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gVHVybiB0aGUgU291cmNlIGludG8gYSBTdHJpbmcgc28gd2UgY2FuIGNoZWNrIGl0DQotICAgICAgICBTdHJpbmcgcmVzcG9uc2VUZXh0ID0gY3JlYXRlU3RyaW5nRnJvbVNvdXJjZShyZXNwb25zZSk7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZyhyZXNwb25zZVRleHQpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIGNvbnRlbnQgaXMgY29ycmVjdA0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZVRleHQuY29udGFpbnMoInNvYXAiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlVGV4dC5jb250YWlucygiRW52ZWxvcGUiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlVGV4dC5jb250YWlucygiQm9keSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJlY2hvU3RyaW5nUmVzcG9uc2UiKSk7DQotICAgICAgICANCi0gICAgICAgIA0KLSAgICAgICAgDQotICAgICAgICAvLyBJbnZva2UgYSBzZWNvbmQgdGltZQ0KLSAgICAgICAgLy8gU2V0dXAgdGhlIGNhbGxiYWNrIGZvciBhc3luYyByZXNwb25zZXMNCi0gICAgICAgIGNhbGxiYWNrSGFuZGxlciA9IG5ldyBBc3luY0NhbGxiYWNrPFNvdXJjZT4oKTsNCi0NCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBJbnZva2luZyBhc3luYyAoY2FsbGJhY2spIERpc3BhdGNoIik7DQotICAgICAgICBtb25pdG9yID0gZGlzcGF0Y2guaW52b2tlQXN5bmMocmVxdWVzdCwgY2FsbGJhY2tIYW5kbGVyKTsNCi0gICAgICAgICAgICAgICAgDQotICAgICAgICB3aGlsZSAoIW1vbml0b3IuaXNEb25lKCkpIHsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gQXN5bmMgaW52b2NhdGlvbiBzdGlsbCBub3QgY29tcGxldGUiKTsNCi0gICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIHJlc3BvbnNlID0gY2FsbGJhY2tIYW5kbGVyLmdldFZhbHVlKCk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3BvbnNlKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gVHVybiB0aGUgU291cmNlIGludG8gYSBTdHJpbmcgc28gd2UgY2FuIGNoZWNrIGl0DQotICAgICAgICByZXNwb25zZVRleHQgPSBjcmVhdGVTdHJpbmdGcm9tU291cmNlKHJlc3BvbnNlKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKHJlc3BvbnNlVGV4dCk7DQotICAgICAgICANCi0gICAgICAgIC8vIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgY29udGVudCBpcyBjb3JyZWN0DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlVGV4dC5jb250YWlucygic29hcCIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJFbnZlbG9wZSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJCb2R5IikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZVRleHQuY29udGFpbnMoImVjaG9TdHJpbmdSZXNwb25zZSIpKTsNCi0JfQ0KLSAgICANCi0gICAgcHVibGljIHZvaWQgdGVzdEFzeW5jUG9sbGluZ1BheWxvYWRNb2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygidGVzdDogIiArIGdldE5hbWUoKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIEluaXRpYWxpemUgdGhlIEpBWC1XUyBjbGllbnQgYXJ0aWZhY3RzDQotICAgICAgICBTZXJ2aWNlIHN2YyA9IFNlcnZpY2UuY3JlYXRlKERpc3BhdGNoVGVzdENvbnN0YW50cy5RTkFNRV9TRVJWSUNFKTsNCi0gICAgICAgIHN2Yy5hZGRQb3J0KERpc3BhdGNoVGVzdENvbnN0YW50cy5RTkFNRV9QT1JULCBudWxsLCBEaXNwYXRjaFRlc3RDb25zdGFudHMuVVJMKTsNCi0gICAgICAgIERpc3BhdGNoPFNvdXJjZT4gZGlzcGF0Y2ggPSBzdmMuY3JlYXRlRGlzcGF0Y2goRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlFOQU1FX1BPUlQsIA0KLSAgICAgICAgICAgICAgICBTb3VyY2UuY2xhc3MsIFNlcnZpY2UuTW9kZS5QQVlMT0FEKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQ3JlYXRlIHRoZSBET01Tb3VyY2UNCi0gICAgICAgIERPTVNvdXJjZSByZXF1ZXN0ID0gY3JlYXRlRE9NU291cmNlRnJvbVN0cmluZyhEaXNwYXRjaFRlc3RDb25zdGFudHMuc2FtcGxlQm9keUNvbnRlbnQpOw0KLQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEludm9raW5nIGFzeW5jIChwb2xsaW5nKSBEaXNwYXRjaCIpOw0KLSAgICAgICAgUmVzcG9uc2U8U291cmNlPiBhc3luY1Jlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlQXN5bmMocmVxdWVzdCk7DQotICAgICAgICAgICAgDQotICAgICAgICB3aGlsZSAoIWFzeW5jUmVzcG9uc2UuaXNEb25lKCkpIHsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gQXN5bmMgaW52b2NhdGlvbiBzdGlsbCBub3QgY29tcGxldGUiKTsNCi0gICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIFNvdXJjZSByZXNwb25zZSA9IGFzeW5jUmVzcG9uc2UuZ2V0KCk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3BvbnNlKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gVHVybiB0aGUgU291cmNlIGludG8gYSBTdHJpbmcgc28gd2UgY2FuIGNoZWNrIGl0DQotICAgICAgICBTdHJpbmcgcmVzcG9uc2VUZXh0ID0gY3JlYXRlU3RyaW5nRnJvbVNvdXJjZShyZXNwb25zZSk7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZyhyZXNwb25zZVRleHQpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIGNvbnRlbnQgaXMgY29ycmVjdA0KLSAgICAgICAgYXNzZXJ0VHJ1ZSghcmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJzb2FwIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSghcmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJFbnZlbG9wZSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlVGV4dC5jb250YWlucygiQm9keSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJlY2hvU3RyaW5nUmVzcG9uc2UiKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIEludm9rZSBhIHNlY29uZCB0aW1lDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gSW52b2tpbmcgYXN5bmMgKHBvbGxpbmcpIERpc3BhdGNoIik7DQotICAgICAgICBhc3luY1Jlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlQXN5bmMocmVxdWVzdCk7DQotICAgICAgICAgICAgDQotICAgICAgICB3aGlsZSAoIWFzeW5jUmVzcG9uc2UuaXNEb25lKCkpIHsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gQXN5bmMgaW52b2NhdGlvbiBzdGlsbCBub3QgY29tcGxldGUiKTsNCi0gICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIHJlc3BvbnNlID0gYXN5bmNSZXNwb25zZS5nZXQoKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwocmVzcG9uc2UpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBUdXJuIHRoZSBTb3VyY2UgaW50byBhIFN0cmluZyBzbyB3ZSBjYW4gY2hlY2sgaXQNCi0gICAgICAgIHJlc3BvbnNlVGV4dCA9IGNyZWF0ZVN0cmluZ0Zyb21Tb3VyY2UocmVzcG9uc2UpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcocmVzcG9uc2VUZXh0KTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBjb250ZW50IGlzIGNvcnJlY3QNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlVGV4dC5jb250YWlucygic29hcCIpKTsNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlVGV4dC5jb250YWlucygiRW52ZWxvcGUiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZVRleHQuY29udGFpbnMoIkJvZHkiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlVGV4dC5jb250YWlucygiZWNob1N0cmluZ1Jlc3BvbnNlIikpOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXN5bmNQb2xsaW5nTWVzc2FnZU1vZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJ0ZXN0OiAiICsgZ2V0TmFtZSgpKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgSkFYLVdTIGNsaWVudCBhcnRpZmFjdHMNCi0gICAgICAgIFNlcnZpY2Ugc3ZjID0gU2VydmljZS5jcmVhdGUoRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlFOQU1FX1NFUlZJQ0UpOw0KLSAgICAgICAgc3ZjLmFkZFBvcnQoRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlFOQU1FX1BPUlQsIG51bGwsIERpc3BhdGNoVGVzdENvbnN0YW50cy5VUkwpOw0KLSAgICAgICAgRGlzcGF0Y2g8U291cmNlPiBkaXNwYXRjaCA9IHN2Yy5jcmVhdGVEaXNwYXRjaChEaXNwYXRjaFRlc3RDb25zdGFudHMuUU5BTUVfUE9SVCwgDQotICAgICAgICAgICAgICAgIFNvdXJjZS5jbGFzcywgU2VydmljZS5Nb2RlLk1FU1NBR0UpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBDcmVhdGUgdGhlIERPTVNvdXJjZQ0KLSAgICAgICAgRE9NU291cmNlIHJlcXVlc3QgPSBjcmVhdGVET01Tb3VyY2VGcm9tU3RyaW5nKERpc3BhdGNoVGVzdENvbnN0YW50cy5zYW1wbGVTb2FwTWVzc2FnZSk7DQotDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gSW52b2tpbmcgYXN5bmMgKGNhbGxiYWNrKSBEaXNwYXRjaCIpOw0KLSAgICAgICAgUmVzcG9uc2U8U291cmNlPiBhc3luY1Jlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlQXN5bmMocmVxdWVzdCk7DQotICAgICAgICAgICAgDQotICAgICAgICB3aGlsZSAoIWFzeW5jUmVzcG9uc2UuaXNEb25lKCkpIHsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gQXN5bmMgaW52b2NhdGlvbiBzdGlsbCBub3QgY29tcGxldGUiKTsNCi0gICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIFNvdXJjZSByZXNwb25zZSA9IGFzeW5jUmVzcG9uc2UuZ2V0KCk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3BvbnNlKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gVHVybiB0aGUgU291cmNlIGludG8gYSBTdHJpbmcgc28gd2UgY2FuIGNoZWNrIGl0DQotICAgICAgICBTdHJpbmcgcmVzcG9uc2VUZXh0ID0gY3JlYXRlU3RyaW5nRnJvbVNvdXJjZShyZXNwb25zZSk7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZyhyZXNwb25zZVRleHQpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIGNvbnRlbnQgaXMgY29ycmVjdA0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZVRleHQuY29udGFpbnMoInNvYXAiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlVGV4dC5jb250YWlucygiRW52ZWxvcGUiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlVGV4dC5jb250YWlucygiQm9keSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJlY2hvU3RyaW5nUmVzcG9uc2UiKSk7DQotICAgICAgICANCi0gICAgICAgIA0KLSAgICAgICAgLy8gSW52b2tlIGEgc2Vjb25kIHRpbWUNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBJbnZva2luZyBhc3luYyAoY2FsbGJhY2spIERpc3BhdGNoIik7DQotICAgICAgICBhc3luY1Jlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlQXN5bmMocmVxdWVzdCk7DQotICAgICAgICAgICAgDQotICAgICAgICB3aGlsZSAoIWFzeW5jUmVzcG9uc2UuaXNEb25lKCkpIHsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gQXN5bmMgaW52b2NhdGlvbiBzdGlsbCBub3QgY29tcGxldGUiKTsNCi0gICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIHJlc3BvbnNlID0gYXN5bmNSZXNwb25zZS5nZXQoKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwocmVzcG9uc2UpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBUdXJuIHRoZSBTb3VyY2UgaW50byBhIFN0cmluZyBzbyB3ZSBjYW4gY2hlY2sgaXQNCi0gICAgICAgIHJlc3BvbnNlVGV4dCA9IGNyZWF0ZVN0cmluZ0Zyb21Tb3VyY2UocmVzcG9uc2UpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcocmVzcG9uc2VUZXh0KTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBjb250ZW50IGlzIGNvcnJlY3QNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJzb2FwIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZVRleHQuY29udGFpbnMoIkVudmVsb3BlIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZVRleHQuY29udGFpbnMoIkJvZHkiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlVGV4dC5jb250YWlucygiZWNob1N0cmluZ1Jlc3BvbnNlIikpOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0T25lV2F5UGF5bG9hZE1vZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJ0ZXN0OiAiICsgZ2V0TmFtZSgpKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgSkFYLVdTIGNsaWVudCBhcnRpZmFjdHMNCi0gICAgICAgIFNlcnZpY2Ugc3ZjID0gU2VydmljZS5jcmVhdGUoRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlFOQU1FX1NFUlZJQ0UpOw0KLSAgICAgICAgc3ZjLmFkZFBvcnQoRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlFOQU1FX1BPUlQsIG51bGwsIERpc3BhdGNoVGVzdENvbnN0YW50cy5VUkwpOw0KLSAgICAgICAgRGlzcGF0Y2g8U291cmNlPiBkaXNwYXRjaCA9IHN2Yy5jcmVhdGVEaXNwYXRjaChEaXNwYXRjaFRlc3RDb25zdGFudHMuUU5BTUVfUE9SVCwgDQotICAgICAgICAgICAgICAgIFNvdXJjZS5jbGFzcywgU2VydmljZS5Nb2RlLlBBWUxPQUQpOw0KLQ0KLSAgICAgICAgLy8gQ3JlYXRlIHRoZSBET01Tb3VyY2UNCi0gICAgICAgIERPTVNvdXJjZSByZXF1ZXN0ID0gY3JlYXRlRE9NU291cmNlRnJvbVN0cmluZyhEaXNwYXRjaFRlc3RDb25zdGFudHMuc2FtcGxlQm9keUNvbnRlbnQpOw0KLQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEludm9raW5nIE9uZSBXYXkgRGlzcGF0Y2giKTsNCi0gICAgICAgIGRpc3BhdGNoLmludm9rZU9uZVdheShyZXF1ZXN0KTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gSW52b2tlIGEgc2Vjb25kIHRpbWUNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBJbnZva2luZyBPbmUgV2F5IERpc3BhdGNoIik7DQotICAgICAgICBkaXNwYXRjaC5pbnZva2VPbmVXYXkocmVxdWVzdCk7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHRlc3RPbmVXYXlNZXNzYWdlTW9kZSgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoInRlc3Q6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBKQVgtV1MgY2xpZW50IGFydGlmYWN0cw0KLSAgICAgICAgU2VydmljZSBzdmMgPSBTZXJ2aWNlLmNyZWF0ZShEaXNwYXRjaFRlc3RDb25zdGFudHMuUU5BTUVfU0VSVklDRSk7DQotICAgICAgICBzdmMuYWRkUG9ydChEaXNwYXRjaFRlc3RDb25zdGFudHMuUU5BTUVfUE9SVCwgbnVsbCwgRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlVSTCk7DQotICAgICAgICBEaXNwYXRjaDxTb3VyY2U+IGRpc3BhdGNoID0gc3ZjLmNyZWF0ZURpc3BhdGNoKERpc3BhdGNoVGVzdENvbnN0YW50cy5RTkFNRV9QT1JULCANCi0gICAgICAgICAgICAgICAgU291cmNlLmNsYXNzLCBTZXJ2aWNlLk1vZGUuTUVTU0FHRSk7DQotDQotICAgICAgICAvLyBDcmVhdGUgdGhlIERPTVNvdXJjZQ0KLSAgICAgICAgRE9NU291cmNlIHJlcXVlc3QgPSBjcmVhdGVET01Tb3VyY2VGcm9tU3RyaW5nKERpc3BhdGNoVGVzdENvbnN0YW50cy5zYW1wbGVTb2FwTWVzc2FnZSk7DQotDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gSW52b2tpbmcgT25lIFdheSBEaXNwYXRjaCIpOw0KLSAgICAgICAgZGlzcGF0Y2guaW52b2tlT25lV2F5KHJlcXVlc3QpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBJbnZva2UgYSBzZWNvbmQgdGltZQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEludm9raW5nIE9uZSBXYXkgRGlzcGF0Y2giKTsNCi0gICAgICAgIGRpc3BhdGNoLmludm9rZU9uZVdheShyZXF1ZXN0KTsNCi0JfQ0KLSAgICANCi0gICAgcHVibGljIHZvaWQgdGVzdEJhZERPTVNvdXJjZSgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoInRlc3Q6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBKQVgtV1MgY2xpZW50IGFydGlmYWN0cw0KLSAgICAgICAgU2VydmljZSBzdmMgPSBTZXJ2aWNlLmNyZWF0ZShEaXNwYXRjaFRlc3RDb25zdGFudHMuUU5BTUVfU0VSVklDRSk7DQotICAgICAgICBzdmMuYWRkUG9ydChEaXNwYXRjaFRlc3RDb25zdGFudHMuUU5BTUVfUE9SVCwgbnVsbCwgRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlVSTCk7DQotICAgICAgICBEaXNwYXRjaDxTb3VyY2U+IGRpc3BhdGNoID0gc3ZjLmNyZWF0ZURpc3BhdGNoKERpc3BhdGNoVGVzdENvbnN0YW50cy5RTkFNRV9QT1JULCANCi0gICAgICAgICAgICAgICAgU291cmNlLmNsYXNzLCBTZXJ2aWNlLk1vZGUuUEFZTE9BRCk7DQotDQotICAgICAgICAvLyBDcmVhdGUgdGhlIERPTVNvdXJjZQ0KLSAgICAgICAgRE9NU291cmNlIHJlcXVlc3QgPSBuZXcgRE9NU291cmNlKCk7DQotDQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIGRpc3BhdGNoLmludm9rZU9uZVdheShyZXF1ZXN0KTsNCi0gICAgICAgICAgICBmYWlsKCJXZWJTZXJ2aWNlRXhjZXB0aW9uIHdhcyBleHBlY3RlZCIpOw0KLSAgICAgICAgfSBjYXRjaCAoV2ViU2VydmljZUV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIkEgV2ViIFNlcnZpY2UgRXhjZXB0aW9uIHdhcyBleHBlY3RlZDogIiArIGUudG9TdHJpbmcoKSk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShlLmdldE1lc3NhZ2UoKSAhPSBudWxsKTsNCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgZmFpbCgiV2ViU2VydmljZUV4Y2VwdGlvbiB3YXMgZXhwZWN0ZWQsIGJ1dCByZWNlaXZlZCAiICsgZSk7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIC8vIEludm9rZSBhIHNlY29uZCB0aW1lDQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIGRpc3BhdGNoLmludm9rZU9uZVdheShyZXF1ZXN0KTsNCi0gICAgICAgICAgICBmYWlsKCJXZWJTZXJ2aWNlRXhjZXB0aW9uIHdhcyBleHBlY3RlZCIpOw0KLSAgICAgICAgfSBjYXRjaCAoV2ViU2VydmljZUV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIkEgV2ViIFNlcnZpY2UgRXhjZXB0aW9uIHdhcyBleHBlY3RlZDogIiArIGUudG9TdHJpbmcoKSk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShlLmdldE1lc3NhZ2UoKSAhPSBudWxsKTsNCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgZmFpbCgiV2ViU2VydmljZUV4Y2VwdGlvbiB3YXMgZXhwZWN0ZWQsIGJ1dCByZWNlaXZlZCAiICsgZSk7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgfQ0KLQkvKioNCi0gICAgICogQ3JlYXRlIGEgRE9NU291cmNlIHdpdGggdGhlIHByb3ZpZGVkIFN0cmluZyBhcyB0aGUgY29udGVudA0KLSAgICAgKiBAcGFyYW0gaW5wdXQNCi0gICAgICogQHJldHVybg0KLQkgKi8NCi0gICAgcHJpdmF0ZSBET01Tb3VyY2UgY3JlYXRlRE9NU291cmNlRnJvbVN0cmluZyhTdHJpbmcgaW5wdXQpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgYnl0ZVtdIGJ5dGVzID0gaW5wdXQuZ2V0Qnl0ZXMoKTsNCi0gICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIHN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlcyk7DQotICAgICAgICANCi0gICAgICAgIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZG9tRmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsNCi0gICAgICAgIGRvbUZhY3Rvcnkuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7DQotICAgICAgICBEb2N1bWVudEJ1aWxkZXIgZG9tQnVpbGRlciA9IGRvbUZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7DQotICAgICAgICBEb2N1bWVudCBkb21UcmVlID0gZG9tQnVpbGRlci5wYXJzZShzdHJlYW0pOw0KLSAgICAgICAgTm9kZSBub2RlID0gZG9tVHJlZS5nZXREb2N1bWVudEVsZW1lbnQoKTsNCi0gICAgICAgIA0KLSAgICAgICAgRE9NU291cmNlIGRvbVNvdXJjZSA9IG5ldyBET01Tb3VyY2Uobm9kZSk7DQotICAgICAgICByZXR1cm4gZG9tU291cmNlOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogQ3JlYXRlIGEgU3RyaW5nIGZyb20gdGhlIHByb3ZpZGVkIFNvdXJjZQ0KLSAgICAgKiBAcGFyYW0gaW5wdXQNCi0gICAgICogQHJldHVybg0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBTdHJpbmcgY3JlYXRlU3RyaW5nRnJvbVNvdXJjZShTb3VyY2UgaW5wdXQpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHJlYWRlciA9IGlucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoaW5wdXQpOw0KLSAgICAgICAgUmVhZGVyMldyaXRlciByMncgPSBuZXcgUmVhZGVyMldyaXRlcihyZWFkZXIpOw0KLSAgICAgICAgU3RyaW5nIHRleHQgPSByMncuZ2V0QXNTdHJpbmcoKTsNCi0gICAgICAgIHJldHVybiB0ZXh0Ow0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kaXNwYXRjaC9EaXNwYXRjaFRlc3RDb25zdGFudHMuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kaXNwYXRjaC9EaXNwYXRjaFRlc3RDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGVmNjQxYy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGlzcGF0Y2gvRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRpc3BhdGNoOw0KLQ0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOw0KLQ0KLXB1YmxpYyBjbGFzcyBEaXNwYXRjaFRlc3RDb25zdGFudHMgew0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUkwgPSAiaHR0cDovL2xvY2FsaG9zdDo2MDYwL2F4aXMyL3NlcnZpY2VzL0VjaG9TZXJ2aWNlIjsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFEVVJMID0gImh0dHA6Ly90aGlzLmlzLm5vdC5hLnZhbGlkLmhvc3RuYW1lLmF0LmFsbC5uby53YXk6OTk5OS93YWNreSI7DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgUU5BTUVfU0VSVklDRSA9IG5ldyBRTmFtZSgiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIiLCAiRWNob1NlcnZpY2UiKTsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBRTkFNRV9QT1JUID0gbmV3IFFOYW1lKCJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMiIsICJFY2hvU2VydmljZVNPQVAxMXBvcnQwIik7DQotDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBzYW1wbGVTb2FwRW52ZWxvcGVIZWFkZXIgPSANCi0gICAgICAgICI8c29hcDpFbnZlbG9wZSB4bWxuczpzb2FwPVwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS9cIj4iICsgDQotICAgICAgICAiPHNvYXA6Qm9keT4iOw0KLSAgICANCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHNhbXBsZVNvYXBFbnZlbG9wZUZvb3RlciA9DQotICAgICAgICAiPC9zb2FwOkJvZHk+IiArIA0KLSAgICAgICAgIjwvc29hcDpFbnZlbG9wZT4iOw0KLSAgICANCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgc2FtcGxlQm9keUNvbnRlbnQgPSANCi0gICAgICAgICI8bnMxOmVjaG9TdHJpbmcgeG1sbnM6bnMxPVwiaHR0cDovL3Rlc3RcIj4iICsgDQotICAgICAgICAiPG5zMTppbnB1dCB4bWxucz1cImh0dHA6Ly90ZXN0XCI+SEVMTE8gVEhFUkUhISE8L25zMTppbnB1dD4iICsgDQotICAgICAgICAiPC9uczE6ZWNob1N0cmluZz4iOw0KLSAgICANCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgc2FtcGxlQm9keUNvbnRlbnRfYmFkID0gDQotICAgICAgICAiPG5zMTplY2hvU3RyaW5nIHhtbG5zOm5zMT1cImh0dHA6Ly90ZXN0XCI+IiArIA0KLSAgICAgICAgIjxuczE6aW5wdXQgeG1sbnM9XCJodHRwOi8vdGVzdFwiPlRIUk9XIEVYQ0VQVElPTjwvbnMxOmlucHV0PiIgKyANCi0gICAgICAgICI8L25zMTplY2hvU3RyaW5nPiI7DQotICAgIA0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBzYW1wbGVTb2FwTWVzc2FnZSA9IA0KLSAgICAgICAgc2FtcGxlU29hcEVudmVsb3BlSGVhZGVyICsNCi0gICAgICAgIHNhbXBsZUJvZHlDb250ZW50ICsgDQotICAgICAgICBzYW1wbGVTb2FwRW52ZWxvcGVGb290ZXI7DQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kaXNwYXRjaC9KQVhCQ2FsbGJhY2tIYW5kbGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGlzcGF0Y2gvSkFYQkNhbGxiYWNrSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDMwMTkwLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kaXNwYXRjaC9KQVhCQ2FsbGJhY2tIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRpc3BhdGNoOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLlRlc3RMb2dnZXI7DQotaW1wb3J0IHRlc3QuRWNob1N0cmluZ1Jlc3BvbnNlOw0KLQ0KLWltcG9ydCBqYXZheC54bWwud3MuQXN5bmNIYW5kbGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuUmVzcG9uc2U7DQotDQotcHVibGljIGNsYXNzIEpBWEJDYWxsYmFja0hhbmRsZXI8VD4gaW1wbGVtZW50cyBBc3luY0hhbmRsZXI8VD4gew0KLQ0KLSAgICBUIGRhdGEgPSBudWxsOw0KLSAgICBwdWJsaWMgdm9pZCBoYW5kbGVSZXNwb25zZShSZXNwb25zZSByZXNwb25zZSkgew0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBkYXRhID0gKFQpIHJlc3BvbnNlLmdldCgpOw0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBBc3luYyByZXNwb25zZSByZWNlaXZlZDogIiArIGRhdGEpOw0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgVCBnZXREYXRhKCkgew0KLSAgICAgICAgcmV0dXJuIGRhdGE7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rpc3BhdGNoL0pBWEJEaXNwYXRjaFRlc3RzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGlzcGF0Y2gvSkFYQkRpc3BhdGNoVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdhYWViZi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGlzcGF0Y2gvSkFYQkRpc3BhdGNoVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxNCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRpc3BhdGNoOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5UZXN0TG9nZ2VyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmZyYW1ld29yay5BYnN0cmFjdFRlc3RDYXNlOw0KLWltcG9ydCBvcmcueG1sc29hcC5zY2hlbWFzLnNvYXAuZW52ZWxvcGUuQm9keTsNCi1pbXBvcnQgb3JnLnhtbHNvYXAuc2NoZW1hcy5zb2FwLmVudmVsb3BlLkVudmVsb3BlOw0KLWltcG9ydCB0ZXN0LkVjaG9TdHJpbmc7DQotaW1wb3J0IHRlc3QuRWNob1N0cmluZ1Jlc3BvbnNlOw0KLWltcG9ydCB0ZXN0Lk9iamVjdEZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJDb250ZXh0Ow0KLWltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCRWxlbWVudDsNCi1pbXBvcnQgamF2YXgueG1sLndzLkRpc3BhdGNoOw0KLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsNCi1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOw0KLQ0KLXB1YmxpYyBjbGFzcyBKQVhCRGlzcGF0Y2hUZXN0cyBleHRlbmRzIEFic3RyYWN0VGVzdENhc2Ugew0KLQ0KLSAgICBwcml2YXRlIERpc3BhdGNoPE9iamVjdD4gZGlzcGF0Y2hQYXlsb2FkOw0KLSAgICBwcml2YXRlIERpc3BhdGNoPE9iamVjdD4gZGlzcGF0Y2hNZXNzYWdlOw0KLSAgICBwcml2YXRlIEpBWEJDb250ZXh0IGpiYzsNCi0gICAgDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsNCi0gICAgICAgIHJldHVybiBnZXRUZXN0U2V0dXAobmV3IFRlc3RTdWl0ZShKQVhCRGlzcGF0Y2hUZXN0cy5jbGFzcykpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICAvL0NyZWF0ZSB0aGUgU2VydmljZSBvYmplY3QNCi0gICAgICAgIFNlcnZpY2Ugc3ZjID0gU2VydmljZS5jcmVhdGUoRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlFOQU1FX1NFUlZJQ0UpOw0KLSAgICAgICAgc3ZjLmFkZFBvcnQoRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlFOQU1FX1BPUlQsIG51bGwsIERpc3BhdGNoVGVzdENvbnN0YW50cy5VUkwpOw0KLSAgICAgICAgDQotICAgICAgICAvL0NyZWF0ZSB0aGUgSkFYLUIgRGlzcGF0Y2ggb2JqZWN0IHRvIHJlY29nbml6ZSB0aGUgdGVzdCBhbmQgc29hcCBwYWNrYWdlcw0KLSAgICAgICAgamJjID0gSkFYQkNvbnRleHQubmV3SW5zdGFuY2UoInRlc3Q6b3JnLnhtbHNvYXAuc2NoZW1hcy5zb2FwLmVudmVsb3BlIik7DQotICAgICAgICANCi0gICAgICAgIC8vIENyZWF0ZSBQYXlsb2FkIGFuZCBNZXNzYWdlIERpc3BhdGNoDQotICAgICAgICBkaXNwYXRjaFBheWxvYWQgPSBzdmMuY3JlYXRlRGlzcGF0Y2goRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlFOQU1FX1BPUlQsIA0KLSAgICAgICAgICAgICAgICBqYmMsIFNlcnZpY2UuTW9kZS5QQVlMT0FEKTsNCi0gICAgICAgIGRpc3BhdGNoTWVzc2FnZSA9IHN2Yy5jcmVhdGVEaXNwYXRjaChEaXNwYXRjaFRlc3RDb25zdGFudHMuUU5BTUVfUE9SVCwgDQotICAgICAgICAgICAgICAgIGpiYywgU2VydmljZS5Nb2RlLk1FU1NBR0UpOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3luY1BheWxvYWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJ0ZXN0OiAiICsgZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIC8vIENyZWF0ZSB0aGUgaW5wdXQgcGFyYW0NCi0gICAgICAgIE9iamVjdEZhY3RvcnkgZmFjdG9yeSA9IG5ldyBPYmplY3RGYWN0b3J5KCk7DQotICAgICAgICBFY2hvU3RyaW5nIHJlcXVlc3QgPSBmYWN0b3J5LmNyZWF0ZUVjaG9TdHJpbmcoKTsgICAgICAgICANCi0gICAgICAgIHJlcXVlc3Quc2V0SW5wdXQoIlNZTkMgSkFYQiBQQVlMT0FEIFRFU1QiKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gSW52b2tlIHRoZSBEaXNwYXRjaDxPYmplY3Q+DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gSW52b2tpbmcgc3luYyBEaXNwYXRjaCB3aXRoIEpBWC1CIFBhcmFtZXRlciIpOw0KLSAgICAgICAgRWNob1N0cmluZ1Jlc3BvbnNlIHJlc3BvbnNlID0gKEVjaG9TdHJpbmdSZXNwb25zZSkgZGlzcGF0Y2hQYXlsb2FkLmludm9rZShyZXF1ZXN0KTsNCi0gICAgICAgIA0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXNwb25zZSk7DQotDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gUmVzcG9uc2UgY29udGVudDogIiArIHJlc3BvbnNlLmdldEVjaG9TdHJpbmdSZXR1cm4oKSk7DQotICAgICAgICANCi0gICAgICAgIGFzc2VydFRydWUoIltFUlJPUl0gLSBSZXNwb25zZSBvYmplY3Qgd2FzIG51bGwiLCByZXNwb25zZSAhPSBudWxsKTsNCi0gICAgICAgIGFzc2VydFRydWUoIltFUlJPUl0gLSBObyBjb250ZW50IGluIHJlc3BvbnNlIG9iamVjdCIsIHJlc3BvbnNlLmdldEVjaG9TdHJpbmdSZXR1cm4oKSAhPSBudWxsKTsNCi0gICAgICAgIGFzc2VydFRydWUoIltFUlJPUl0gLSBaZXJvIGxlbmd0aCBjb250ZW50IGluIHJlc3BvbnNlIiwgcmVzcG9uc2UuZ2V0RWNob1N0cmluZ1JldHVybigpLmxlbmd0aCgpID4gMCk7DQotICAgICAgICANCi0gICAgICAgIC8vIEludm9rZSB0aGUgRGlzcGF0Y2g8T2JqZWN0PiBhIHNlY29uZCB0aW1lDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gSW52b2tpbmcgc3luYyBEaXNwYXRjaCB3aXRoIEpBWC1CIFBhcmFtZXRlciIpOw0KLSAgICAgICAgcmVzcG9uc2UgPSAoRWNob1N0cmluZ1Jlc3BvbnNlKSBkaXNwYXRjaFBheWxvYWQuaW52b2tlKHJlcXVlc3QpOw0KLSAgICAgICAgDQotICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3BvbnNlKTsNCi0NCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBSZXNwb25zZSBjb250ZW50OiAiICsgcmVzcG9uc2UuZ2V0RWNob1N0cmluZ1JldHVybigpKTsNCi0gICAgICAgIA0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiW0VSUk9SXSAtIFJlc3BvbnNlIG9iamVjdCB3YXMgbnVsbCIsIHJlc3BvbnNlICE9IG51bGwpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiW0VSUk9SXSAtIE5vIGNvbnRlbnQgaW4gcmVzcG9uc2Ugb2JqZWN0IiwgcmVzcG9uc2UuZ2V0RWNob1N0cmluZ1JldHVybigpICE9IG51bGwpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiW0VSUk9SXSAtIFplcm8gbGVuZ3RoIGNvbnRlbnQgaW4gcmVzcG9uc2UiLCByZXNwb25zZS5nZXRFY2hvU3RyaW5nUmV0dXJuKCkubGVuZ3RoKCkgPiAwKTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIHZvaWQgdGVzdEF5c25jUGF5bG9hZCgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoInRlc3Q6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBDcmVhdGUgdGhlIGlucHV0IHBhcmFtDQotICAgICAgICBPYmplY3RGYWN0b3J5IGZhY3RvcnkgPSBuZXcgT2JqZWN0RmFjdG9yeSgpOw0KLSAgICAgICAgRWNob1N0cmluZyByZXF1ZXN0ID0gZmFjdG9yeS5jcmVhdGVFY2hvU3RyaW5nKCk7ICAgICAgICAgDQotICAgICAgICByZXF1ZXN0LnNldElucHV0KCJBU1lOQyhDQUxMQkFDSykgSkFYQiBQQVlMT0FEIFRFU1QiKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQ3JlYXRlIHRoZSBjYWxsYmFjayBmb3IgYXN5bmMgcmVzcG9uc2VzDQotICAgICAgICBKQVhCQ2FsbGJhY2tIYW5kbGVyPE9iamVjdD4gY2FsbGJhY2sgPSBuZXcgSkFYQkNhbGxiYWNrSGFuZGxlcjxPYmplY3Q+KCk7DQotICAgICAgICANCi0gICAgICAgIC8vIEludm9rZSB0aGUgRGlzcGF0Y2g8T2JqZWN0PiBhc3luY2hyb25vdXNseQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEludm9raW5nIGFzeW5jKGNhbGxiYWNrKSBEaXNwYXRjaCB3aXRoIEpBWC1CIFBhcmFtZXRlciIpOw0KLSAgICAgICAgRnV0dXJlPD8+IG1vbml0b3IgPSBkaXNwYXRjaFBheWxvYWQuaW52b2tlQXN5bmMocmVxdWVzdCwgY2FsbGJhY2spOw0KLSAgICAgICAgDQotICAgICAgICB3aGlsZSAoIW1vbml0b3IuaXNEb25lKCkpIHsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gQXN5bmMgaW52b2NhdGlvbiBzdGlsbCBub3QgY29tcGxldGUiKTsNCi0gICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDApOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICBFY2hvU3RyaW5nUmVzcG9uc2UgcmVzcG9uc2UgPSAoRWNob1N0cmluZ1Jlc3BvbnNlKSBjYWxsYmFjay5nZXREYXRhKCk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3BvbnNlKTsNCi0NCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBSZXNwb25zZSBjb250ZW50OiAiICsgcmVzcG9uc2UuZ2V0RWNob1N0cmluZ1JldHVybigpKTsNCi0gICAgICAgIA0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiW0VSUk9SXSAtIFJlc3BvbnNlIG9iamVjdCB3YXMgbnVsbCIsIHJlc3BvbnNlICE9IG51bGwpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiW0VSUk9SXSAtIE5vIGNvbnRlbnQgaW4gcmVzcG9uc2Ugb2JqZWN0IiwgcmVzcG9uc2UuZ2V0RWNob1N0cmluZ1JldHVybigpICE9IG51bGwpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiW0VSUk9SXSAtIFplcm8gbGVuZ3RoIGNvbnRlbnQgaW4gcmVzcG9uc2UiLCByZXNwb25zZS5nZXRFY2hvU3RyaW5nUmV0dXJuKCkubGVuZ3RoKCkgPiAwKTsNCi0NCi0gICAgICAgIA0KLSAgICAgICAgLy8gSW52b2tlIGEgc2Vjb25kIHRpbWUNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQ3JlYXRlIHRoZSBjYWxsYmFjayBmb3IgYXN5bmMgcmVzcG9uc2VzDQotICAgICAgICBjYWxsYmFjayA9IG5ldyBKQVhCQ2FsbGJhY2tIYW5kbGVyPE9iamVjdD4oKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gSW52b2tlIHRoZSBEaXNwYXRjaDxPYmplY3Q+IGFzeW5jaHJvbm91c2x5DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gSW52b2tpbmcgYXN5bmMoY2FsbGJhY2spIERpc3BhdGNoIHdpdGggSkFYLUIgUGFyYW1ldGVyIik7DQotICAgICAgICBtb25pdG9yID0gZGlzcGF0Y2hQYXlsb2FkLmludm9rZUFzeW5jKHJlcXVlc3QsIGNhbGxiYWNrKTsNCi0gICAgICAgIA0KLSAgICAgICAgd2hpbGUgKCFtb25pdG9yLmlzRG9uZSgpKSB7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEFzeW5jIGludm9jYXRpb24gc3RpbGwgbm90IGNvbXBsZXRlIik7DQotICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgcmVzcG9uc2UgPSAoRWNob1N0cmluZ1Jlc3BvbnNlKSBjYWxsYmFjay5nZXREYXRhKCk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3BvbnNlKTsNCi0NCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBSZXNwb25zZSBjb250ZW50OiAiICsgcmVzcG9uc2UuZ2V0RWNob1N0cmluZ1JldHVybigpKTsNCi0gICAgICAgIA0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiW0VSUk9SXSAtIFJlc3BvbnNlIG9iamVjdCB3YXMgbnVsbCIsIHJlc3BvbnNlICE9IG51bGwpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiW0VSUk9SXSAtIE5vIGNvbnRlbnQgaW4gcmVzcG9uc2Ugb2JqZWN0IiwgcmVzcG9uc2UuZ2V0RWNob1N0cmluZ1JldHVybigpICE9IG51bGwpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiW0VSUk9SXSAtIFplcm8gbGVuZ3RoIGNvbnRlbnQgaW4gcmVzcG9uc2UiLCByZXNwb25zZS5nZXRFY2hvU3RyaW5nUmV0dXJuKCkubGVuZ3RoKCkgPiAwKTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIHZvaWQgdGVzdE9uZVdheVBheWxvYWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJ0ZXN0OiAiICsgZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIC8vIENyZWF0ZSB0aGUgaW5wdXQgcGFyYW0NCi0gICAgICAgIE9iamVjdEZhY3RvcnkgZmFjdG9yeSA9IG5ldyBPYmplY3RGYWN0b3J5KCk7DQotICAgICAgICBFY2hvU3RyaW5nIHJlcXVlc3QgPSBmYWN0b3J5LmNyZWF0ZUVjaG9TdHJpbmcoKTsgICAgICAgICANCi0gICAgICAgIHJlcXVlc3Quc2V0SW5wdXQoIk9ORS1XQVkgSkFYQiBQQVlMT0FEIFRFU1QiKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gSW52b2tlIHRoZSBEaXNwYXRjaDxPYmplY3Q+IG9uZS13YXkNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBJbnZva2luZyBvbmUtd2F5IERpc3BhdGNoIHdpdGggSkFYLUIgUGFyYW1ldGVyIik7DQotICAgICAgICBkaXNwYXRjaFBheWxvYWQuaW52b2tlT25lV2F5KHJlcXVlc3QpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBJbnZva2UgdGhlIERpc3BhdGNoPE9iamVjdD4gb25lLXdheSBhIHNlY29uZCB0aW1lDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gSW52b2tpbmcgb25lLXdheSBEaXNwYXRjaCB3aXRoIEpBWC1CIFBhcmFtZXRlciIpOw0KLSAgICAgICAgZGlzcGF0Y2hQYXlsb2FkLmludm9rZU9uZVdheShyZXF1ZXN0KTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIHZvaWQgdGVzdFN5bmNNZXNzYWdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygidGVzdDogIiArIGdldE5hbWUoKSk7DQotDQotICAgICAgICAvLyBDcmVhdGUgdGhlIGlucHV0IHBhcmFtDQotICAgICAgICBPYmplY3RGYWN0b3J5IGZhY3RvcnkgPSBuZXcgT2JqZWN0RmFjdG9yeSgpOw0KLSAgICAgICAgRWNob1N0cmluZyBlY2hvU3RyaW5nID0gZmFjdG9yeS5jcmVhdGVFY2hvU3RyaW5nKCk7ICAgICAgICAgDQotICAgICAgICBlY2hvU3RyaW5nLnNldElucHV0KCJTWU5DIEpBWEIgTUVTU0FHRVRFU1QiKTsNCi0gICAgICAgIA0KLSAgICAgICAgSkFYQkVsZW1lbnQ8RW52ZWxvcGU+IHJlcXVlc3QgPSBjcmVhdGVKQVhCRW52ZWxvcGUoKTsNCi0gICAgICAgIHJlcXVlc3QuZ2V0VmFsdWUoKS5nZXRCb2R5KCkuZ2V0QW55KCkuYWRkKGVjaG9TdHJpbmcpOw0KLSAgICAgICAgDQotICAgICAgICBqYmMuY3JlYXRlTWFyc2hhbGxlcigpLm1hcnNoYWwocmVxdWVzdCxTeXN0ZW0ub3V0KTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gSW52b2tlIHRoZSBEaXNwYXRjaDxPYmplY3Q+DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gSW52b2tpbmcgc3luYyBEaXNwYXRjaCB3aXRoIEpBWC1CIFBhcmFtZXRlciIpOw0KLSAgICAgICAgSkFYQkVsZW1lbnQ8RW52ZWxvcGU+IGpheGJSZXNwb25zZSA9IChKQVhCRWxlbWVudDxFbnZlbG9wZT4pIGRpc3BhdGNoTWVzc2FnZS5pbnZva2UocmVxdWVzdCk7DQotICAgICAgICANCi0gICAgICAgIGFzc2VydE5vdE51bGwoamF4YlJlc3BvbnNlKTsNCi0gICAgICAgIEVudmVsb3BlIHJlc3BvbnNlID0gamF4YlJlc3BvbnNlLmdldFZhbHVlKCk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3BvbnNlKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwocmVzcG9uc2UuZ2V0Qm9keSgpKTsNCi0gICAgICAgIEVjaG9TdHJpbmdSZXNwb25zZSBlY2hvU3RyaW5nUmVzcG9uc2UgPSAoRWNob1N0cmluZ1Jlc3BvbnNlKSByZXNwb25zZS5nZXRCb2R5KCkuZ2V0QW55KCkuZ2V0KDApOw0KLQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IFJlc3BvbnNlIGNvbnRlbnQ6ICIgKyBlY2hvU3RyaW5nUmVzcG9uc2UuZ2V0RWNob1N0cmluZ1JldHVybigpKTsNCi0gICAgICAgIGFzc2VydFRydWUoIltFUlJPUl0gLSBObyBjb250ZW50IGluIHJlc3BvbnNlIG9iamVjdCIsIGVjaG9TdHJpbmdSZXNwb25zZS5nZXRFY2hvU3RyaW5nUmV0dXJuKCkgIT0gbnVsbCk7DQotICAgICAgICBhc3NlcnRUcnVlKCJbRVJST1JdIC0gWmVybyBsZW5ndGggY29udGVudCBpbiByZXNwb25zZSIsIGVjaG9TdHJpbmdSZXNwb25zZS5nZXRFY2hvU3RyaW5nUmV0dXJuKCkubGVuZ3RoKCkgPiAwKTsNCi0gICAgDQotICAgICAgICANCi0gICAgICAgIA0KLSAgICAgICAgLy8gSW52b2tlIHRoZSBEaXNwYXRjaDxPYmplY3Q+IGEgc2Vjb25kIHRpbWUNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBJbnZva2luZyBzeW5jIERpc3BhdGNoIHdpdGggSkFYLUIgUGFyYW1ldGVyIik7DQotICAgICAgICBqYXhiUmVzcG9uc2UgPSAoSkFYQkVsZW1lbnQ8RW52ZWxvcGU+KSBkaXNwYXRjaE1lc3NhZ2UuaW52b2tlKHJlcXVlc3QpOw0KLSAgICAgICAgDQotICAgICAgICBhc3NlcnROb3ROdWxsKGpheGJSZXNwb25zZSk7DQotICAgICAgICByZXNwb25zZSA9IGpheGJSZXNwb25zZS5nZXRWYWx1ZSgpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXNwb25zZSk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3BvbnNlLmdldEJvZHkoKSk7DQotICAgICAgICBlY2hvU3RyaW5nUmVzcG9uc2UgPSAoRWNob1N0cmluZ1Jlc3BvbnNlKSByZXNwb25zZS5nZXRCb2R5KCkuZ2V0QW55KCkuZ2V0KDApOw0KLQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IFJlc3BvbnNlIGNvbnRlbnQ6ICIgKyBlY2hvU3RyaW5nUmVzcG9uc2UuZ2V0RWNob1N0cmluZ1JldHVybigpKTsNCi0gICAgICAgIGFzc2VydFRydWUoIltFUlJPUl0gLSBObyBjb250ZW50IGluIHJlc3BvbnNlIG9iamVjdCIsIGVjaG9TdHJpbmdSZXNwb25zZS5nZXRFY2hvU3RyaW5nUmV0dXJuKCkgIT0gbnVsbCk7DQotICAgICAgICBhc3NlcnRUcnVlKCJbRVJST1JdIC0gWmVybyBsZW5ndGggY29udGVudCBpbiByZXNwb25zZSIsIGVjaG9TdHJpbmdSZXNwb25zZS5nZXRFY2hvU3RyaW5nUmV0dXJuKCkubGVuZ3RoKCkgPiAwKTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIHZvaWQgdGVzdEF5c25jTWVzc2FnZSgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoInRlc3Q6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBDcmVhdGUgdGhlIGlucHV0IHBhcmFtDQotICAgICAgICBPYmplY3RGYWN0b3J5IGZhY3RvcnkgPSBuZXcgT2JqZWN0RmFjdG9yeSgpOw0KLSAgICAgICAgRWNob1N0cmluZyBlY2hvU3RyaW5nID0gZmFjdG9yeS5jcmVhdGVFY2hvU3RyaW5nKCk7ICAgICAgICAgDQotICAgICAgICBlY2hvU3RyaW5nLnNldElucHV0KCJBU1lOQyhDQUxMQkFDSykgSkFYQiBNRVNTQUdFIFRFU1QiKTsNCi0gICAgICAgIA0KLSAgICAgICAgSkFYQkVsZW1lbnQ8RW52ZWxvcGU+IHJlcXVlc3QgPSBjcmVhdGVKQVhCRW52ZWxvcGUoKTsNCi0gICAgICAgIHJlcXVlc3QuZ2V0VmFsdWUoKS5nZXRCb2R5KCkuZ2V0QW55KCkuYWRkKGVjaG9TdHJpbmcpOw0KLSAgICAgICAgDQotICAgICAgICANCi0gICAgICAgIC8vIENyZWF0ZSB0aGUgY2FsbGJhY2sgZm9yIGFzeW5jIHJlc3BvbnNlcw0KLSAgICAgICAgSkFYQkNhbGxiYWNrSGFuZGxlcjxPYmplY3Q+IGNhbGxiYWNrID0gbmV3IEpBWEJDYWxsYmFja0hhbmRsZXI8T2JqZWN0PigpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBJbnZva2UgdGhlIERpc3BhdGNoPE9iamVjdD4gYXN5bmNocm9ub3VzbHkNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBJbnZva2luZyBhc3luYyhjYWxsYmFjaykgRGlzcGF0Y2ggd2l0aCBKQVgtQiBQYXJhbWV0ZXIiKTsNCi0gICAgICAgIEZ1dHVyZTw/PiBtb25pdG9yID0gZGlzcGF0Y2hNZXNzYWdlLmludm9rZUFzeW5jKHJlcXVlc3QsIGNhbGxiYWNrKTsNCi0gICAgICAgIA0KLSAgICAgICAgd2hpbGUgKCFtb25pdG9yLmlzRG9uZSgpKSB7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEFzeW5jIGludm9jYXRpb24gc3RpbGwgbm90IGNvbXBsZXRlIik7DQotICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgSkFYQkVsZW1lbnQ8RW52ZWxvcGU+IGpheGJSZXNwb25zZSA9IChKQVhCRWxlbWVudDxFbnZlbG9wZT4pIGNhbGxiYWNrLmdldERhdGEoKTsNCi0gICAgICAgIA0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChqYXhiUmVzcG9uc2UpOw0KLSAgICAgICAgRW52ZWxvcGUgcmVzcG9uc2UgPSBqYXhiUmVzcG9uc2UuZ2V0VmFsdWUoKTsNCi0gICAgICAgIA0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXNwb25zZSk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3BvbnNlLmdldEJvZHkoKSk7DQotICAgICAgICBFY2hvU3RyaW5nUmVzcG9uc2UgZWNob1N0cmluZ1Jlc3BvbnNlID0gKEVjaG9TdHJpbmdSZXNwb25zZSkgcmVzcG9uc2UuZ2V0Qm9keSgpLmdldEFueSgpLmdldCgwKTsNCi0NCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBSZXNwb25zZSBjb250ZW50OiAiICsgZWNob1N0cmluZ1Jlc3BvbnNlLmdldEVjaG9TdHJpbmdSZXR1cm4oKSk7DQotICAgICAgICBhc3NlcnRUcnVlKCJbRVJST1JdIC0gTm8gY29udGVudCBpbiByZXNwb25zZSBvYmplY3QiLCBlY2hvU3RyaW5nUmVzcG9uc2UuZ2V0RWNob1N0cmluZ1JldHVybigpICE9IG51bGwpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiW0VSUk9SXSAtIFplcm8gbGVuZ3RoIGNvbnRlbnQgaW4gcmVzcG9uc2UiLCBlY2hvU3RyaW5nUmVzcG9uc2UuZ2V0RWNob1N0cmluZ1JldHVybigpLmxlbmd0aCgpID4gMCk7DQotDQotICAgICAgICAvLyBJbnZva2UgYSBzZWNvbmQgdGltZQ0KLSAgICAgICAgLy8gQ3JlYXRlIHRoZSBjYWxsYmFjayBmb3IgYXN5bmMgcmVzcG9uc2VzDQotICAgICAgICBjYWxsYmFjayA9IG5ldyBKQVhCQ2FsbGJhY2tIYW5kbGVyPE9iamVjdD4oKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gSW52b2tlIHRoZSBEaXNwYXRjaDxPYmplY3Q+IGFzeW5jaHJvbm91c2x5DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gSW52b2tpbmcgYXN5bmMoY2FsbGJhY2spIERpc3BhdGNoIHdpdGggSkFYLUIgUGFyYW1ldGVyIik7DQotICAgICAgICBtb25pdG9yID0gZGlzcGF0Y2hNZXNzYWdlLmludm9rZUFzeW5jKHJlcXVlc3QsIGNhbGxiYWNrKTsNCi0gICAgICAgIA0KLSAgICAgICAgd2hpbGUgKCFtb25pdG9yLmlzRG9uZSgpKSB7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEFzeW5jIGludm9jYXRpb24gc3RpbGwgbm90IGNvbXBsZXRlIik7DQotICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgamF4YlJlc3BvbnNlID0gKEpBWEJFbGVtZW50PEVudmVsb3BlPikgY2FsbGJhY2suZ2V0RGF0YSgpOw0KLSAgICAgICAgDQotICAgICAgICBhc3NlcnROb3ROdWxsKGpheGJSZXNwb25zZSk7DQotICAgICAgICByZXNwb25zZSA9IGpheGJSZXNwb25zZS5nZXRWYWx1ZSgpOw0KLSAgICAgICAgDQotICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3BvbnNlKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwocmVzcG9uc2UuZ2V0Qm9keSgpKTsNCi0gICAgICAgIGVjaG9TdHJpbmdSZXNwb25zZSA9IChFY2hvU3RyaW5nUmVzcG9uc2UpIHJlc3BvbnNlLmdldEJvZHkoKS5nZXRBbnkoKS5nZXQoMCk7DQotDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gUmVzcG9uc2UgY29udGVudDogIiArIGVjaG9TdHJpbmdSZXNwb25zZS5nZXRFY2hvU3RyaW5nUmV0dXJuKCkpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiW0VSUk9SXSAtIE5vIGNvbnRlbnQgaW4gcmVzcG9uc2Ugb2JqZWN0IiwgZWNob1N0cmluZ1Jlc3BvbnNlLmdldEVjaG9TdHJpbmdSZXR1cm4oKSAhPSBudWxsKTsNCi0gICAgICAgIGFzc2VydFRydWUoIltFUlJPUl0gLSBaZXJvIGxlbmd0aCBjb250ZW50IGluIHJlc3BvbnNlIiwgZWNob1N0cmluZ1Jlc3BvbnNlLmdldEVjaG9TdHJpbmdSZXR1cm4oKS5sZW5ndGgoKSA+IDApOw0KLQ0KLSAgICAgICAgDQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHRlc3RPbmVXYXlNZXNzZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJ0ZXN0OiAiICsgZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIC8vIENyZWF0ZSB0aGUgaW5wdXQgcGFyYW0NCi0gICAgICAgIE9iamVjdEZhY3RvcnkgZmFjdG9yeSA9IG5ldyBPYmplY3RGYWN0b3J5KCk7DQotICAgICAgICBFY2hvU3RyaW5nIGVjaG9TdHJpbmcgPSBmYWN0b3J5LmNyZWF0ZUVjaG9TdHJpbmcoKTsgICAgICAgICANCi0gICAgICAgIGVjaG9TdHJpbmcuc2V0SW5wdXQoIk9ORS1XQVkgSkFYQiBNRVNTQUdFIFRFU1QiKTsNCi0gICAgICAgIA0KLSAgICAgICAgSkFYQkVsZW1lbnQ8RW52ZWxvcGU+IHJlcXVlc3QgPSBjcmVhdGVKQVhCRW52ZWxvcGUoKTsNCi0gICAgICAgIHJlcXVlc3QuZ2V0VmFsdWUoKS5nZXRCb2R5KCkuZ2V0QW55KCkuYWRkKGVjaG9TdHJpbmcpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBJbnZva2UgdGhlIERpc3BhdGNoPE9iamVjdD4gb25lLXdheQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEludm9raW5nIG9uZS13YXkgRGlzcGF0Y2ggd2l0aCBKQVgtQiBQYXJhbWV0ZXIiKTsNCi0gICAgICAgIGRpc3BhdGNoTWVzc2FnZS5pbnZva2VPbmVXYXkocmVxdWVzdCk7DQotICAgICAgICANCi0gICAgICAgIC8vIEludm9rZSB0aGUgRGlzcGF0Y2g8T2JqZWN0PiBvbmUtd2F5IGEgc2Vjb25kIHRpbWUNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBJbnZva2luZyBvbmUtd2F5IERpc3BhdGNoIHdpdGggSkFYLUIgUGFyYW1ldGVyIik7DQotICAgICAgICBkaXNwYXRjaE1lc3NhZ2UuaW52b2tlT25lV2F5KHJlcXVlc3QpOw0KLSAgICB9DQotICAgIA0KLSAgICBwcml2YXRlIEpBWEJFbGVtZW50PEVudmVsb3BlPiBjcmVhdGVKQVhCRW52ZWxvcGUoKSB7DQotICAgICAgICBvcmcueG1sc29hcC5zY2hlbWFzLnNvYXAuZW52ZWxvcGUuT2JqZWN0RmFjdG9yeSBmYWN0b3J5ID0gDQotICAgICAgICAgICAgbmV3IG9yZy54bWxzb2FwLnNjaGVtYXMuc29hcC5lbnZlbG9wZS5PYmplY3RGYWN0b3J5KCk7DQotICAgICAgICBFbnZlbG9wZSBlbnYgPSBuZXcgRW52ZWxvcGUoKTsNCi0gICAgICAgIA0KLSAgICAgICAgQm9keSBib2R5ID0gbmV3IEJvZHkoKTsNCi0gICAgICAgIGVudi5zZXRCb2R5KGJvZHkpOw0KLSAgICAgICAgDQotICAgICAgICBKQVhCRWxlbWVudDxFbnZlbG9wZT4gamF4YkVudiA9IGZhY3RvcnkuY3JlYXRlRW52ZWxvcGUoZW52KTsNCi0gICAgICAgIHJldHVybiBqYXhiRW52Ow0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kaXNwYXRjaC9KQVhCU291cmNlRGlzcGF0Y2hUZXN0cy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rpc3BhdGNoL0pBWEJTb3VyY2VEaXNwYXRjaFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmNTAyOTUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rpc3BhdGNoL0pBWEJTb3VyY2VEaXNwYXRjaFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kaXNwYXRjaDsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuVGVzdExvZ2dlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5mcmFtZXdvcmsuQWJzdHJhY3RUZXN0Q2FzZTsNCi1pbXBvcnQgb3JnLnRlc3QuZGlzcGF0Y2guamF4YnNvdXJjZS5JbnZva2U7DQotaW1wb3J0IG9yZy50ZXN0LmRpc3BhdGNoLmpheGJzb3VyY2UuT2JqZWN0RmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkNvbnRleHQ7DQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLnV0aWwuSkFYQlNvdXJjZTsNCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5SZXN1bHQ7DQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOw0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyOw0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeTsNCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0Ow0KLWltcG9ydCBqYXZheC54bWwud3MuRGlzcGF0Y2g7DQotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlOw0KLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsNCi0NCi0vKg0KLSogVGhpcyBpcyBhIHRlc3QgY2FzZSBmb3IgSW52b2tpbmcgRGlzcGF0Y2ggd2l0aCBhIEpBWEJTb3VyY2UuDQotKiB0ZXN0IHVzZXMgSkFYQiBPYmplY3RzIGZyb20gb3JnLnRlc3QuZGlzcGF0Y2guamF4YnNvdXJjZSBwYWNrYWdlLCBjcmVhdGUgYSByZXF1ZXN0IG9mIEpBWEJTb3VyY2UgdHlwZQ0KLSogYW5kIGludm9rZXMgdGhlIHNlcnZpY2UgZW5kcG9pbnQgYW5kIHJlYWRzIHRoZSByZXNwb25zZSBvZiB0eXBlIFNvdXJjZS4gQXNzZXJ0IGZhaWx1cmUgaWYgcmVzcG9uc2Ugbm90IHJlY2VpdmVkLg0KLSovDQotDQotDQotcHVibGljIGNsYXNzIEpBWEJTb3VyY2VEaXNwYXRjaFRlc3RzIGV4dGVuZHMgQWJzdHJhY3RUZXN0Q2FzZSB7DQotCS8qKg0KLSAgICAgKiBJbnZva2UgYSBzeW5jIERpc3BhdGNoPEpBWEJTb3VyY2U+IGluIFBBWUxPQUQgbW9kZQ0KLSAgICAgKi8NCi0JDQotCXByaXZhdGUgU3RyaW5nIHVybCA9ICJodHRwOi8vbG9jYWxob3N0OjYwNjAvYXhpczIvc2VydmljZXMvU291cmNlUHJvdmlkZXJTZXJ2aWNlIjsNCi0JcHJpdmF0ZSBRTmFtZSBzZXJ2aWNlTmFtZSA9IG5ldyBRTmFtZSgiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIiLCAiU291cmNlUHJvdmlkZXJTZXJ2aWNlIik7DQotCXByaXZhdGUgUU5hbWUgcG9ydE5hbWUgPW5ldyBRTmFtZSgiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIiLCAiU2ltcGxlUHJvdmlkZXJTZXJ2aWNlU09BUDExcG9ydDAiKTsNCi0gICAgDQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsNCi0gICAgICAgIHJldHVybiBnZXRUZXN0U2V0dXAobmV3IFRlc3RTdWl0ZShKQVhCU291cmNlRGlzcGF0Y2hUZXN0cy5jbGFzcykpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RKQVhCU291cmNlU3luY1BheWxvYWRNb2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygidGVzdDogIiArIGdldE5hbWUoKSk7DQotICAgICAgICB0cnl7DQotICAgICAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgSkFYLVdTIGNsaWVudCBhcnRpZmFjdHMNCi0gICAgICAgICAgICBTZXJ2aWNlIHN2YyA9IFNlcnZpY2UuY3JlYXRlKHNlcnZpY2VOYW1lKTsNCi0gICAgICAgICAgICBzdmMuYWRkUG9ydChwb3J0TmFtZSwgbnVsbCwgdXJsKTsNCi0gICAgICAgICAgICBEaXNwYXRjaDxTb3VyY2U+IGRpc3BhdGNoID0gc3ZjLmNyZWF0ZURpc3BhdGNoKHBvcnROYW1lLCBTb3VyY2UuY2xhc3MsIFNlcnZpY2UuTW9kZS5QQVlMT0FEKTsNCi0NCi0gICAgICAgICAgICAvL0NyZWF0ZSBKQVhCQ29udGV4dCBhbmQgSkFYQlNvdXJjZSBoZXJlLg0KLSAgICAgICAgICAgIE9iamVjdEZhY3RvcnkgZmFjdG9yeSA9IG5ldyBPYmplY3RGYWN0b3J5KCk7DQotICAgICAgICAgICAgSW52b2tlIGludm9rZU9iaiA9IGZhY3RvcnkuY3JlYXRlSW52b2tlKCk7DQotICAgICAgICAgICAgaW52b2tlT2JqLnNldEludm9rZVN0cigiU29tZSBSZXF1ZXN0Iik7DQotICAgICAgICAgICAgSkFYQkNvbnRleHQgY3R4ID0gSkFYQkNvbnRleHQubmV3SW5zdGFuY2UoIm9yZy50ZXN0LmRpc3BhdGNoLmpheGJzb3VyY2UiKTsNCi0NCi0gICAgICAgICAgICBKQVhCU291cmNlIGpiU3JjID0gbmV3IEpBWEJTb3VyY2UoY3R4LmNyZWF0ZU1hcnNoYWxsZXIoKSwgaW52b2tlT2JqKTsNCi0gICAgICAgICAgICAvLyBJbnZva2UgdGhlIERpc3BhdGNoDQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEludm9raW5nIHN5bmMgRGlzcGF0Y2giKTsNCi0gICAgICAgICAgICAvL0ludm9rZSBTZXJ2ZXIgZW5kcG9pbnQgYW5kIHJlYWQgcmVzcG9uc2UNCi0gICAgICAgICAgICBTb3VyY2UgcmVzcG9uc2UgPSBkaXNwYXRjaC5pbnZva2UoamJTcmMpOw0KLQ0KLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoImRpc3BhdGNoIGludm9rZSByZXR1cm5lZCBudWxsIiwgcmVzcG9uc2UpOw0KLSAgICAgICAgICAgIC8vUHJpbnQgdGhlIHJlc3BvbnNlIGFzIHN0cmluZy4NCi0gICAgICAgICAgICBTdHJpbmdXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOw0KLSAgICAgICAgICAgIFRyYW5zZm9ybWVyIHQgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdUcmFuc2Zvcm1lcigpOw0KLSAgICAgICAgICAgIFJlc3VsdCByZXN1bHQgPSBuZXcgU3RyZWFtUmVzdWx0KHdyaXRlcik7DQotICAgICAgICAgICAgdC50cmFuc2Zvcm0ocmVzcG9uc2UsIHJlc3VsdCk7DQotDQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIlJlc3BvbnNlIE9uIENsaWVudDogXG4iICsgd3JpdGVyLmdldEJ1ZmZlcigpLnRvU3RyaW5nKCkpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIEludm9rZSBhIHNlY29uZCB0aW1lDQotICAgICAgICAgICAgamJTcmMgPSBuZXcgSkFYQlNvdXJjZShjdHguY3JlYXRlTWFyc2hhbGxlcigpLCBpbnZva2VPYmopOw0KLSAgICAgICAgICAgIC8vIEludm9rZSB0aGUgRGlzcGF0Y2gNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gSW52b2tpbmcgc3luYyBEaXNwYXRjaCIpOw0KLSAgICAgICAgICAgIC8vSW52b2tlIFNlcnZlciBlbmRwb2ludCBhbmQgcmVhZCByZXNwb25zZQ0KLSAgICAgICAgICAgIHJlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlKGpiU3JjKTsNCi0NCi0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKCJkaXNwYXRjaCBpbnZva2UgcmV0dXJuZWQgbnVsbCIsIHJlc3BvbnNlKTsNCi0gICAgICAgICAgICAvL1ByaW50IHRoZSByZXNwb25zZSBhcyBzdHJpbmcuDQotICAgICAgICAgICAgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOw0KLSAgICAgICAgICAgIHQgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdUcmFuc2Zvcm1lcigpOw0KLSAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBTdHJlYW1SZXN1bHQod3JpdGVyKTsNCi0gICAgICAgICAgICB0LnRyYW5zZm9ybShyZXNwb25zZSwgcmVzdWx0KTsNCi0NCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiUmVzcG9uc2UgT24gQ2xpZW50OiBcbiIgKyB3cml0ZXIuZ2V0QnVmZmVyKCkudG9TdHJpbmcoKSk7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgfWNhdGNoKEV4Y2VwdGlvbiBlKXsNCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgIH0NCi0gICAgDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kaXNwYXRjaC9PTUVsZW1lbnREaXNwYXRjaFRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kaXNwYXRjaC9PTUVsZW1lbnREaXNwYXRjaFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU1ZmI4ZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGlzcGF0Y2gvT01FbGVtZW50RGlzcGF0Y2hUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kaXNwYXRjaDsNCi0NCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07DQotaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOw0KLQ0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOw0KLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTElucHV0RmFjdG9yeTsNCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7DQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOw0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyOw0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeTsNCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0Ow0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1Tb3VyY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5EaXNwYXRjaDsNCi1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlLk1vZGU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5zb2FwLlNPQVBCaW5kaW5nOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5idWlsZGVyLlN0QVhPTUJ1aWxkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZnJhbWV3b3JrLkFic3RyYWN0VGVzdENhc2U7DQotDQotLyoqDQotICogVGhpcyBjbGFzcyB1c2VzIHRoZSBKQVgtV1MgRGlzcGF0Y2ggQVBJIHRvIHRlc3Qgc2VuZGluZyBhbmQgcmVjZWl2aW5nDQotICogbWVzc2FnZXMgdXNpbmcgU09BUCAxLjIuDQotICovDQotcHVibGljIGNsYXNzIE9NRWxlbWVudERpc3BhdGNoVGVzdCBleHRlbmRzIEFic3RyYWN0VGVzdENhc2Ugew0KLSAgICANCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUU5hbWUgUU5BTUVfU0VSVklDRSA9IG5ldyBRTmFtZSgNCi0gICAgICAgICAgICAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvdGVzdC9PTUVMRU1FTlQiLCAiT01FbGVtZW50U2VydmljZSIpOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBRTmFtZSBRTkFNRV9QT1JUID0gbmV3IFFOYW1lKA0KLSAgICAgICAgICAgICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy90ZXN0L09NRUxFTUVOVCIsICJPTUVsZW1lbnRQb3J0Iik7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVUkxfRU5EUE9JTlQgPSAiaHR0cDovL2xvY2FsaG9zdDo2MDYwL2F4aXMyL3NlcnZpY2VzL09NRWxlbWVudFByb3ZpZGVyU2VydmljZS5PTUVsZW1lbnRQcm92aWRlclBvcnQiOyAgICANCi0gICAgDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBzYW1wbGVSZXF1ZXN0ID0gDQotICAgICAgICAiPHRlc3Q6ZWNob09NRWxlbWVudCB4bWxuczp0ZXN0PVwiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvdGVzdC9PTUVMRU1FTlRcIj4iICsNCi0gICAgICAgICI8dGVzdDppbnB1dD5TQU1QTEUgUkVRVUVTVCBNRVNTQUdFPC90ZXN0OmlucHV0PiIgKw0KLSAgICAgICAgIjwvdGVzdDplY2hvT01FbGVtZW50PiI7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBzYW1wbGVFbnZlbG9wZUhlYWQgPSANCi0gICAgICAgICI8c29hcGVudjpFbnZlbG9wZSB4bWxuczpzb2FwZW52PVwiaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlXCI+IiArDQotICAgICAgICAiPHNvYXBlbnY6SGVhZGVyIC8+PHNvYXBlbnY6Qm9keT4iOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgc2FtcGxlRW52ZWxvcGVUYWlsID0gDQotICAgICAgICAiPC9zb2FwZW52OkJvZHk+PC9zb2FwZW52OkVudmVsb3BlPiI7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBzYW1wbGVFbnZlbG9wZSA9IA0KLSAgICAgICAgc2FtcGxlRW52ZWxvcGVIZWFkICsgDQotICAgICAgICBzYW1wbGVSZXF1ZXN0ICsgDQotICAgICAgICBzYW1wbGVFbnZlbG9wZVRhaWw7DQotDQotICAgIHByaXZhdGUgc3RhdGljIFhNTElucHV0RmFjdG9yeSBpbnB1dEZhY3RvcnkgPSBYTUxJbnB1dEZhY3RvcnkubmV3SW5zdGFuY2UoKTsNCi0gICAgDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsNCi0gICAgICAgIHJldHVybiBnZXRUZXN0U2V0dXAobmV3IFRlc3RTdWl0ZShPTUVsZW1lbnREaXNwYXRjaFRlc3QuY2xhc3MpKTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFRlc3Qgc2VuZGluZyBhIFNPQVAgMS4yIHJlcXVlc3QgaW4gUEFZTE9BRCBtb2RlDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U291cmNlRGlzcGF0Y2hQYXlsb2FkTW9kZSgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgLy8gQ3JlYXRlIHRoZSBKQVgtV1MgY2xpZW50IG5lZWRlZCB0byBzZW5kIHRoZSByZXF1ZXN0DQotICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSBTZXJ2aWNlLmNyZWF0ZShRTkFNRV9TRVJWSUNFKTsNCi0gICAgICAgIHNlcnZpY2UuYWRkUG9ydChRTkFNRV9QT1JULCBTT0FQQmluZGluZy5TT0FQMTJIVFRQX0JJTkRJTkcsIFVSTF9FTkRQT0lOVCk7DQotICAgICAgICBEaXNwYXRjaDxTb3VyY2U+IGRpc3BhdGNoID0gc2VydmljZS5jcmVhdGVEaXNwYXRjaCgNCi0gICAgICAgICAgICAgICAgUU5BTUVfUE9SVCwgU291cmNlLmNsYXNzLCBNb2RlLlBBWUxPQUQpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBDcmVhdGUgdGhlIFNvdXJjZSBvYmplY3Qgd2l0aCB0aGUgcGF5bG9hZCBjb250ZW50cy4gIFNpbmNlDQotICAgICAgICAvLyB3ZSdyZSBpbiBQQVlMT0FEIG1vZGUsIHdlIGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgdGhlIGVudmVsb3BlLg0KLSAgICAgICAgYnl0ZVtdIGJ5dGVzID0gc2FtcGxlUmVxdWVzdC5nZXRCeXRlcygpOw0KLSAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmFpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlcyk7DQotICAgICAgICBTdHJlYW1Tb3VyY2UgcmVxdWVzdCA9IG5ldyBTdHJlYW1Tb3VyY2UoYmFpcyk7DQotICAgICAgICANCi0gICAgICAgIC8vIFNlbmQgdGhlIFNPQVAgMS4yIHJlcXVlc3QNCi0gICAgICAgIFNvdXJjZSByZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0NCi0gICAgICAgIGFzc2VydFRydWUoIlRoZSByZXNwb25zZSB3YXMgbnVsbC4gIFdlIGV4cGVjdGVkIGNvbnRlbnQgdG8gYmUgcmV0dXJuZWQuIiwgcmVzcG9uc2UgIT0gbnVsbCk7DQotICAgICAgICANCi0gICAgICAgIC8vIENvbnZlcnQgdGhlIHJlc3BvbnNlIHRvIGEgbW9yZSBjb25zdW1hYmxlIGZvcm1hdA0KLSAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7DQotICAgICAgICBTdHJlYW1SZXN1bHQgcmVzdWx0ID0gbmV3IFN0cmVhbVJlc3VsdChiYW9zKTsNCi0gICAgICAgIA0KLSAgICAgICAgVHJhbnNmb3JtZXJGYWN0b3J5IGZhY3RvcnkgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKTsNCi0gICAgICAgIFRyYW5zZm9ybWVyIHRyYW5zID0gZmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOw0KLSAgICAgICAgdHJhbnMudHJhbnNmb3JtKHJlc3BvbnNlLCByZXN1bHQpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIGNvbnRlbnRzIGFyZSBjb3JyZWN0LiAgQWdhaW4sIHNpbmNlIHdlJ3JlDQotICAgICAgICAvLyBpbiBQQVlMT0FEIG1vZGUsIHdlIHNob3VsZG4ndCBoYXZlIGFueXRoaW5nIHJlbGF0ZWQgdG8gdGhlIGVudmVsb3BlDQotICAgICAgICAvLyBpbiB0aGUgcmV0dXJuLCBqdXN0IHRoZSBjb250ZW50cyBvZiB0aGUgQm9keS4NCi0gICAgICAgIFN0cmluZyByZXNwb25zZVRleHQgPSBiYW9zLnRvU3RyaW5nKCk7DQotICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZVRleHQuY29udGFpbnMoInNvYXAiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZVRleHQuY29udGFpbnMoIkVudmVsb3BlIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSghcmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJCb2R5IikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZVRleHQuY29udGFpbnMoIlNBTVBMRSBSRVNQT05TRSBNRVNTQUdFIikpOyAgIA0KLSAgICAgICAgDQotICAgICAgICAvLyBJbnZva2UgYSBzZWNvbmQgdGltZSB0byB2ZXJpZnkNCi0gICAgICAgIGJhaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZXMpOw0KLSAgICAgICAgcmVxdWVzdCA9IG5ldyBTdHJlYW1Tb3VyY2UoYmFpcyk7DQotICAgICAgICANCi0gICAgICAgIC8vIFNlbmQgdGhlIFNPQVAgMS4yIHJlcXVlc3QNCi0gICAgICAgIHJlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLQ0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIHJlc3BvbnNlIHdhcyBudWxsLiAgV2UgZXhwZWN0ZWQgY29udGVudCB0byBiZSByZXR1cm5lZC4iLCByZXNwb25zZSAhPSBudWxsKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQ29udmVydCB0aGUgcmVzcG9uc2UgdG8gYSBtb3JlIGNvbnN1bWFibGUgZm9ybWF0DQotICAgICAgICBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOw0KLSAgICAgICAgcmVzdWx0ID0gbmV3IFN0cmVhbVJlc3VsdChiYW9zKTsNCi0gICAgICAgIA0KLSAgICAgICAgZmFjdG9yeSA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOw0KLSAgICAgICAgdHJhbnMgPSBmYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKCk7DQotICAgICAgICB0cmFucy50cmFuc2Zvcm0ocmVzcG9uc2UsIHJlc3VsdCk7DQotICAgICAgICANCi0gICAgICAgIC8vIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgY29udGVudHMgYXJlIGNvcnJlY3QuICBBZ2Fpbiwgc2luY2Ugd2UncmUNCi0gICAgICAgIC8vIGluIFBBWUxPQUQgbW9kZSwgd2Ugc2hvdWxkbid0IGhhdmUgYW55dGhpbmcgcmVsYXRlZCB0byB0aGUgZW52ZWxvcGUNCi0gICAgICAgIC8vIGluIHRoZSByZXR1cm4sIGp1c3QgdGhlIGNvbnRlbnRzIG9mIHRoZSBCb2R5Lg0KLSAgICAgICAgcmVzcG9uc2VUZXh0ID0gYmFvcy50b1N0cmluZygpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSghcmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJzb2FwIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSghcmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJFbnZlbG9wZSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlVGV4dC5jb250YWlucygiQm9keSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJTQU1QTEUgUkVTUE9OU0UgTUVTU0FHRSIpKTsgICAgDQotICAgIH0NCi0gICAgDQotDQotDQotICAgIC8qKg0KLSAgICAgKiBUZXN0IHNlbmRpbmcgYSBTT0FQIDEuMiByZXF1ZXN0IGluIE1FU1NBR0UgbW9kZQ0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdFNvdXJjZURpc3BhdGNoTWVzc2FnZU1vZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIC8vIENyZWF0ZSB0aGUgSkFYLVdTIGNsaWVudCBuZWVkZWQgdG8gc2VuZCB0aGUgcmVxdWVzdA0KLSAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gU2VydmljZS5jcmVhdGUoUU5BTUVfU0VSVklDRSk7DQotICAgICAgICBzZXJ2aWNlLmFkZFBvcnQoUU5BTUVfUE9SVCwgU09BUEJpbmRpbmcuU09BUDEySFRUUF9CSU5ESU5HLCBVUkxfRU5EUE9JTlQpOw0KLSAgICAgICAgRGlzcGF0Y2g8U291cmNlPiBkaXNwYXRjaCA9IHNlcnZpY2UuY3JlYXRlRGlzcGF0Y2goDQotICAgICAgICAgICAgICAgIFFOQU1FX1BPUlQsIFNvdXJjZS5jbGFzcywgTW9kZS5NRVNTQUdFKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQ3JlYXRlIHRoZSBTb3VyY2Ugb2JqZWN0IHdpdGggdGhlIG1lc3NhZ2UgY29udGVudHMuICBTaW5jZQ0KLSAgICAgICAgLy8gd2UncmUgaW4gTUVTU0FHRSBtb2RlLCB3ZSdsbCBuZWVkIHRvIG1ha2Ugc3VyZSB3ZSBjcmVhdGUgdGhpcw0KLSAgICAgICAgLy8gd2l0aCB0aGUgcmlnaHQgcHJvdG9jb2wuDQotICAgICAgICBieXRlW10gYnl0ZXMgPSBzYW1wbGVFbnZlbG9wZS5nZXRCeXRlcygpOw0KLSAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmFpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlcyk7DQotICAgICAgICBTdHJlYW1Tb3VyY2UgcmVxdWVzdCA9IG5ldyBTdHJlYW1Tb3VyY2UoYmFpcyk7DQotICAgICAgICANCi0gICAgICAgIFNvdXJjZSByZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQ29udmVydCB0aGUgcmVzcG9uc2UgdG8gYSBtb3JlIGNvbnN1bWFibGUgZm9ybWF0DQotICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsNCi0gICAgICAgIFN0cmVhbVJlc3VsdCByZXN1bHQgPSBuZXcgU3RyZWFtUmVzdWx0KGJhb3MpOw0KLSAgICAgICAgDQotICAgICAgICBUcmFuc2Zvcm1lckZhY3RvcnkgZmFjdG9yeSA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOw0KLSAgICAgICAgVHJhbnNmb3JtZXIgdHJhbnMgPSBmYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKCk7DQotICAgICAgICB0cmFucy50cmFuc2Zvcm0ocmVzcG9uc2UsIHJlc3VsdCk7DQotICAgICAgICANCi0gICAgICAgIC8vIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgY29udGVudHMgb2YgdGhlIG1lc3NhZ2UgYXJlIGNvcnJlY3QNCi0gICAgICAgIFN0cmluZyByZXNwb25zZVRleHQgPSBiYW9zLnRvU3RyaW5nKCk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlVGV4dC5jb250YWlucygic29hcCIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJCb2R5IikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZVRleHQuY29udGFpbnMoIkVudmVsb3BlIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZVRleHQuY29udGFpbnMoIlNBTVBMRSBSRVNQT05TRSBNRVNTQUdFIikpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIG1lc3NhZ2UgcmV0dXJuZWQgaGFkIHRoZSByaWdodCBwcm90b2NvbCB2ZXJzaW9uDQotICAgICAgICAvLyBUT0RPOiBOZWVkIHRvIGRldGVybWluZSB3aGV0aGVyIG9yIG5vdCB3ZSBzaG91bGQgYmUgdXNpbmcgdGhlIGhhcmQgDQotICAgICAgICAvLyBjb2RlZCBVUkxzIGhlcmUsIG9yIHdoZXRoZXIgd2Ugc2hvdWxkIGJlIHVzaW5nIGEgY29uc3RhbnQgZm9yIHRoZSANCi0gICAgICAgIC8vIHB1cnBvc2VzIG9mIHRoZSB0ZXN0Lg0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZVRleHQuY29udGFpbnMoImh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlVGV4dC5jb250YWlucygiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZSIpKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gSW52b2tlIGEgc2Vjb25kIHRpbWUgdG8gdmVyaWZ5DQotICAgICAgICBiYWlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVzKTsNCi0gICAgICAgIHJlcXVlc3QgPSBuZXcgU3RyZWFtU291cmNlKGJhaXMpOw0KLSAgICAgICAgDQotICAgICAgICByZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQ29udmVydCB0aGUgcmVzcG9uc2UgdG8gYSBtb3JlIGNvbnN1bWFibGUgZm9ybWF0DQotICAgICAgICBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOw0KLSAgICAgICAgcmVzdWx0ID0gbmV3IFN0cmVhbVJlc3VsdChiYW9zKTsNCi0gICAgICAgIA0KLSAgICAgICAgZmFjdG9yeSA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOw0KLSAgICAgICAgdHJhbnMgPSBmYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKCk7DQotICAgICAgICB0cmFucy50cmFuc2Zvcm0ocmVzcG9uc2UsIHJlc3VsdCk7DQotICAgICAgICANCi0gICAgICAgIC8vIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgY29udGVudHMgb2YgdGhlIG1lc3NhZ2UgYXJlIGNvcnJlY3QNCi0gICAgICAgIHJlc3BvbnNlVGV4dCA9IGJhb3MudG9TdHJpbmcoKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJzb2FwIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZVRleHQuY29udGFpbnMoIkJvZHkiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlVGV4dC5jb250YWlucygiRW52ZWxvcGUiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlVGV4dC5jb250YWlucygiU0FNUExFIFJFU1BPTlNFIE1FU1NBR0UiKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgbWVzc2FnZSByZXR1cm5lZCBoYWQgdGhlIHJpZ2h0IHByb3RvY29sIHZlcnNpb24NCi0gICAgICAgIC8vIFRPRE86IE5lZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IHdlIHNob3VsZCBiZSB1c2luZyB0aGUgaGFyZCANCi0gICAgICAgIC8vIGNvZGVkIFVSTHMgaGVyZSwgb3Igd2hldGhlciB3ZSBzaG91bGQgYmUgdXNpbmcgYSBjb25zdGFudCBmb3IgdGhlIA0KLSAgICAgICAgLy8gcHVycG9zZXMgb2YgdGhlIHRlc3QuDQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlVGV4dC5jb250YWlucygiaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSghcmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlIikpOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogVGVzdCBzZW5kaW5nIGEgU09BUCAxLjIgcmVxdWVzdCBpbiBQQVlMT0FEIG1vZGUNCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RPTUVsZW1lbnREaXNwYXRjaFBheWxvYWRNb2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICAvLyBDcmVhdGUgdGhlIEpBWC1XUyBjbGllbnQgbmVlZGVkIHRvIHNlbmQgdGhlIHJlcXVlc3QNCi0gICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IFNlcnZpY2UuY3JlYXRlKFFOQU1FX1NFUlZJQ0UpOw0KLSAgICAgICAgc2VydmljZS5hZGRQb3J0KFFOQU1FX1BPUlQsIFNPQVBCaW5kaW5nLlNPQVAxMkhUVFBfQklORElORywgVVJMX0VORFBPSU5UKTsNCi0gICAgICAgIERpc3BhdGNoPE9NRWxlbWVudD4gZGlzcGF0Y2ggPSBzZXJ2aWNlLmNyZWF0ZURpc3BhdGNoKA0KLSAgICAgICAgICAgICAgICBRTkFNRV9QT1JULCBPTUVsZW1lbnQuY2xhc3MsIE1vZGUuUEFZTE9BRCk7DQotICAgICAgICANCi0gICAgICAgIC8vIENyZWF0ZSB0aGUgT01FbGVtZW50IG9iamVjdCB3aXRoIHRoZSBwYXlsb2FkIGNvbnRlbnRzLiAgU2luY2UNCi0gICAgICAgIC8vIHdlJ3JlIGluIFBBWUxPQUQgbW9kZSwgd2UgZG9uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCB0aGUgZW52ZWxvcGUuDQotICAgICAgICBTdHJpbmdSZWFkZXIgc3IgPSBuZXcgU3RyaW5nUmVhZGVyKHNhbXBsZVJlcXVlc3QpOw0KLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIGlucHV0UmVhZGVyID0gaW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihzcik7DQotICAgICAgICBTdEFYT01CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RBWE9NQnVpbGRlcihpbnB1dFJlYWRlcik7ICANCi0gICAgICAgIE9NRWxlbWVudCBvbSA9IGJ1aWxkZXIuZ2V0RG9jdW1lbnRFbGVtZW50KCk7DQotICAgICAgICANCi0gICAgICAgIC8vIFNlbmQgdGhlIFNPQVAgMS4yIHJlcXVlc3QNCi0gICAgICAgIE9NRWxlbWVudCByZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZShvbSk7DQotDQotICAgICAgICBhc3NlcnRUcnVlKCJUaGUgcmVzcG9uc2Ugd2FzIG51bGwuICBXZSBleHBlY3RlZCBjb250ZW50IHRvIGJlIHJldHVybmVkLiIsIHJlc3BvbnNlICE9IG51bGwpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIGNvbnRlbnRzIGFyZSBjb3JyZWN0LiAgQWdhaW4sIHNpbmNlIHdlJ3JlDQotICAgICAgICAvLyBpbiBQQVlMT0FEIG1vZGUsIHdlIHNob3VsZG4ndCBoYXZlIGFueXRoaW5nIHJlbGF0ZWQgdG8gdGhlIGVudmVsb3BlDQotICAgICAgICAvLyBpbiB0aGUgcmV0dXJuLCBqdXN0IHRoZSBjb250ZW50cyBvZiB0aGUgQm9keS4NCi0gICAgICAgIFN0cmluZyByZXNwb25zZVRleHQgPSByZXNwb25zZS50b1N0cmluZ1dpdGhDb25zdW1lKCk7DQotICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZVRleHQuY29udGFpbnMoInNvYXAiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZVRleHQuY29udGFpbnMoIkVudmVsb3BlIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSghcmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJCb2R5IikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZVRleHQuY29udGFpbnMoIlNBTVBMRSBSRVNQT05TRSBNRVNTQUdFIikpOyAgIA0KLSAgICAgICAgDQotICAgICAgICAvLyBTZW5kIHRoZSBTT0FQIDEuMiByZXF1ZXN0DQotICAgICAgICByZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZShvbSk7DQotDQotICAgICAgICBhc3NlcnRUcnVlKCJUaGUgcmVzcG9uc2Ugd2FzIG51bGwuICBXZSBleHBlY3RlZCBjb250ZW50IHRvIGJlIHJldHVybmVkLiIsIHJlc3BvbnNlICE9IG51bGwpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIGNvbnRlbnRzIGFyZSBjb3JyZWN0LiAgQWdhaW4sIHNpbmNlIHdlJ3JlDQotICAgICAgICAvLyBpbiBQQVlMT0FEIG1vZGUsIHdlIHNob3VsZG4ndCBoYXZlIGFueXRoaW5nIHJlbGF0ZWQgdG8gdGhlIGVudmVsb3BlDQotICAgICAgICAvLyBpbiB0aGUgcmV0dXJuLCBqdXN0IHRoZSBjb250ZW50cyBvZiB0aGUgQm9keS4NCi0gICAgICAgIHJlc3BvbnNlVGV4dCA9IHJlc3BvbnNlLnRvU3RyaW5nV2l0aENvbnN1bWUoKTsNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlVGV4dC5jb250YWlucygic29hcCIpKTsNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlVGV4dC5jb250YWlucygiRW52ZWxvcGUiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZVRleHQuY29udGFpbnMoIkJvZHkiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlVGV4dC5jb250YWlucygiU0FNUExFIFJFU1BPTlNFIE1FU1NBR0UiKSk7ICAgIA0KLSAgICB9DQotICAgIA0KLQ0KLQ0KLSAgICAvKioNCi0gICAgICogVGVzdCBzZW5kaW5nIGEgU09BUCAxLjIgcmVxdWVzdCBpbiBNRVNTQUdFIG1vZGUNCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RPTUVsZW1lbnREaXNwYXRjaE1lc3NhZ2VNb2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICAvLyBDcmVhdGUgdGhlIEpBWC1XUyBjbGllbnQgbmVlZGVkIHRvIHNlbmQgdGhlIHJlcXVlc3QNCi0gICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IFNlcnZpY2UuY3JlYXRlKFFOQU1FX1NFUlZJQ0UpOw0KLSAgICAgICAgc2VydmljZS5hZGRQb3J0KFFOQU1FX1BPUlQsIFNPQVBCaW5kaW5nLlNPQVAxMkhUVFBfQklORElORywgVVJMX0VORFBPSU5UKTsNCi0gICAgICAgIERpc3BhdGNoPE9NRWxlbWVudD4gZGlzcGF0Y2ggPSBzZXJ2aWNlLmNyZWF0ZURpc3BhdGNoKA0KLSAgICAgICAgICAgICAgICBRTkFNRV9QT1JULCBPTUVsZW1lbnQuY2xhc3MsIE1vZGUuTUVTU0FHRSk7DQotICAgICAgICANCi0gICAgICAgIC8vIENyZWF0ZSB0aGUgT01FbGVtZW50IG9iamVjdCB3aXRoIHRoZSBwYXlsb2FkIGNvbnRlbnRzLiAgU2luY2UNCi0gICAgICAgIC8vIHdlJ3JlIGluIFBBWUxPQUQgbW9kZSwgd2UgZG9uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCB0aGUgZW52ZWxvcGUuDQotICAgICAgICBTdHJpbmdSZWFkZXIgc3IgPSBuZXcgU3RyaW5nUmVhZGVyKHNhbXBsZUVudmVsb3BlKTsNCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlciBpbnB1dFJlYWRlciA9IGlucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoc3IpOw0KLSAgICAgICAgU3RBWE9NQnVpbGRlciBidWlsZGVyID0gbmV3IFN0QVhPTUJ1aWxkZXIoaW5wdXRSZWFkZXIpOyAgDQotICAgICAgICBPTUVsZW1lbnQgb20gPSBidWlsZGVyLmdldERvY3VtZW50RWxlbWVudCgpOw0KLSAgICAgICAgDQotICAgICAgICBPTUVsZW1lbnQgcmVzcG9uc2UgPSBkaXNwYXRjaC5pbnZva2Uob20pOw0KLSAgICAgICAgDQotICAgICAgICAvLyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIGNvbnRlbnRzIG9mIHRoZSBtZXNzYWdlIGFyZSBjb3JyZWN0DQotICAgICAgICAvL1N0cmluZyByZXNwb25zZVRleHQgPSBiYW9zLnRvU3RyaW5nKCk7DQotICAgICAgICBTdHJpbmcgcmVzcG9uc2VUZXh0ID0gcmVzcG9uc2UudG9TdHJpbmdXaXRoQ29uc3VtZSgpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZVRleHQuY29udGFpbnMoInNvYXAiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlVGV4dC5jb250YWlucygiQm9keSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJFbnZlbG9wZSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJTQU1QTEUgUkVTUE9OU0UgTUVTU0FHRSIpKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBtZXNzYWdlIHJldHVybmVkIGhhZCB0aGUgcmlnaHQgcHJvdG9jb2wgdmVyc2lvbg0KLSAgICAgICAgLy8gVE9ETzogTmVlZCB0byBkZXRlcm1pbmUgd2hldGhlciBvciBub3Qgd2Ugc2hvdWxkIGJlIHVzaW5nIHRoZSBoYXJkIA0KLSAgICAgICAgLy8gY29kZWQgVVJMcyBoZXJlLCBvciB3aGV0aGVyIHdlIHNob3VsZCBiZSB1c2luZyBhIGNvbnN0YW50IGZvciB0aGUgDQotICAgICAgICAvLyBwdXJwb3NlcyBvZiB0aGUgdGVzdC4NCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZVRleHQuY29udGFpbnMoImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUiKSk7DQotICAgICAgICANCi0gICAgICAgIFN0cmluZ1JlYWRlciBzcjIgPSBuZXcgU3RyaW5nUmVhZGVyKHNhbXBsZUVudmVsb3BlKTsNCi0gICAgICAgIGlucHV0UmVhZGVyID0gaW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihzcjIpOw0KLSAgICAgICAgYnVpbGRlciA9IG5ldyBTdEFYT01CdWlsZGVyKGlucHV0UmVhZGVyKTsgIA0KLSAgICAgICAgb20gPSBidWlsZGVyLmdldERvY3VtZW50RWxlbWVudCgpOw0KLSAgICAgICAgcmVzcG9uc2UgPSBkaXNwYXRjaC5pbnZva2Uob20pOw0KLSAgICAgICAgDQotICAgICAgICAvLyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIGNvbnRlbnRzIG9mIHRoZSBtZXNzYWdlIGFyZSBjb3JyZWN0DQotICAgICAgICByZXNwb25zZVRleHQgPSByZXNwb25zZS50b1N0cmluZ1dpdGhDb25zdW1lKCk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlVGV4dC5jb250YWlucygic29hcCIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJCb2R5IikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZVRleHQuY29udGFpbnMoIkVudmVsb3BlIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZVRleHQuY29udGFpbnMoIlNBTVBMRSBSRVNQT05TRSBNRVNTQUdFIikpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIG1lc3NhZ2UgcmV0dXJuZWQgaGFkIHRoZSByaWdodCBwcm90b2NvbCB2ZXJzaW9uDQotICAgICAgICAvLyBUT0RPOiBOZWVkIHRvIGRldGVybWluZSB3aGV0aGVyIG9yIG5vdCB3ZSBzaG91bGQgYmUgdXNpbmcgdGhlIGhhcmQgDQotICAgICAgICAvLyBjb2RlZCBVUkxzIGhlcmUsIG9yIHdoZXRoZXIgd2Ugc2hvdWxkIGJlIHVzaW5nIGEgY29uc3RhbnQgZm9yIHRoZSANCi0gICAgICAgIC8vIHB1cnBvc2VzIG9mIHRoZSB0ZXN0Lg0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZVRleHQuY29udGFpbnMoImh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlVGV4dC5jb250YWlucygiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZSIpKTsNCi0gICAgfQ0KLSAgICANCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rpc3BhdGNoL1BhcmFtVGVzdHMuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kaXNwYXRjaC9QYXJhbVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyOTBhNTguLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rpc3BhdGNoL1BhcmFtVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGlzcGF0Y2g7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmZyYW1ld29yay5BYnN0cmFjdFRlc3RDYXNlOw0KLQ0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOw0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLkRpc3BhdGNoOw0KLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2UuTW9kZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247DQotaW1wb3J0IGphdmF4LnhtbC53cy5zb2FwLlNPQVBCaW5kaW5nOw0KLQ0KLS8qKg0KLSAqIEEgc3VpdGUgZm9yIHNvbWUgdGVzdHMgZm9yIHNwZWNpZmljIGJlaGF2aW9yIGluIHRoZSBEaXNwYXRjaCB3aXRoIA0KLSAqIG51bGwgYW5kIGludmFsaWQgcGFyYW1zLg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBQYXJhbVRlc3RzIGV4dGVuZHMgQWJzdHJhY3RUZXN0Q2FzZSB7DQotICAgIA0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7DQotICAgICAgICByZXR1cm4gZ2V0VGVzdFNldHVwKG5ldyBUZXN0U3VpdGUoUGFyYW1UZXN0cy5jbGFzcykpOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TnVsbFNvYXBQYXJhbVdpdGhNZXNzYWdlTW9kZSgpIHsNCi0gICAgICAgIFFOYW1lIHNlcnZpY2VOYW1lID0gbmV3IFFOYW1lKCJodHRwOi8vdGVzdCIsICJNeVNlcnZpY2UiKTsNCi0gICAgICAgIFFOYW1lIHBvcnROYW1lID0gbmV3IFFOYW1lKCJodHRwOi8vdGVzdCIsICJNeVBvcnQiKTsNCi0gICAgICAgIA0KLSAgICAgICAgU2VydmljZSBzdmMgPSBTZXJ2aWNlLmNyZWF0ZShzZXJ2aWNlTmFtZSk7DQotICAgICAgICBzdmMuYWRkUG9ydChwb3J0TmFtZSwgU09BUEJpbmRpbmcuU09BUDExSFRUUF9CSU5ESU5HLCAiaHR0cDovL2xvY2FsaG9zdCIpOw0KLSAgICAgICAgDQotICAgICAgICBEaXNwYXRjaDxTb3VyY2U+IGRpc3BhdGNoID0gc3ZjLmNyZWF0ZURpc3BhdGNoKHBvcnROYW1lLCANCi0gICAgICAgICAgICAgICAgU291cmNlLmNsYXNzLCBNb2RlLlBBWUxPQUQpOw0KLSAgICAgICAgDQotICAgICAgICBib29sZWFuIGhhbmRsZWQgPSBmYWxzZTsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgZGlzcGF0Y2guaW52b2tlKG51bGwpOyAgICANCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChXZWJTZXJ2aWNlRXhjZXB0aW9uIHdzZSkgew0KLSAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlOw0KLSAgICAgICAgfSAgICAgICAgDQotICAgICAgICANCi0gICAgICAgIGFzc2VydFRydWUoIkEgV2ViU2VydmljZUV4Y2VwdGlvbiBzaG91bGQgYmUgdGhyb3duIGZvciB0aGlzIG51bGwgcGFyYW0iLCBoYW5kbGVkKTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIHZvaWQgdGVzdE51bGxIdHRwUGFyYW1XaXRoUGF5bG9hZE1vZGUoKSB7DQotICAgICAgICAvLyBmaWxsIGluIHRoaXMgdGVzdCB3aGVuIHdlIGFkZCBYTUwvSFRUUCBCaW5kaW5nIHN1cHBvcnQNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIHZvaWQgdGVzdE51bGxIdHRwUGFyYW1XaXRoTWVzc2FnZU1vZGUoKSB7DQotICAgICAgICAvLyBmaWxsIGluIHRoaXMgdGVzdCB3aGVuIHdlIGFkZCBYTUwvSFRUUCBCaW5kaW5nIHN1cHBvcnQgICAgICAgIA0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kaXNwYXRjaC9TQVhTb3VyY2VEaXNwYXRjaFRlc3RzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGlzcGF0Y2gvU0FYU291cmNlRGlzcGF0Y2hUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjhmNzA1Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kaXNwYXRjaC9TQVhTb3VyY2VEaXNwYXRjaFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NTUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kaXNwYXRjaDsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuVGVzdExvZ2dlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5mcmFtZXdvcmsuQWJzdHJhY3RUZXN0Q2FzZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLnV0aWwuUmVhZGVyMldyaXRlcjsNCi1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7DQotDQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MSW5wdXRGYWN0b3J5Ow0KLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsNCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7DQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc2F4LlNBWFNvdXJjZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLkRpc3BhdGNoOw0KLWltcG9ydCBqYXZheC54bWwud3MuUmVzcG9uc2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOw0KLQ0KLS8qKg0KLSAqIFRoaXMgY2xhc3MgdGVzdHMgdGhlIEpBWC1XUyBEaXNwYXRjaDxTb3VyY2U+IHdpdGggY29udGVudCBpbiB2YXJpb3VzIA0KLSAqIGZvcm1zIG9mIGEgamF2YXgueG1sLnRyYW5zZm9ybS5zYXguU0FYU291cmNlLg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBTQVhTb3VyY2VEaXNwYXRjaFRlc3RzIGV4dGVuZHMgQWJzdHJhY3RUZXN0Q2FzZXsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgWE1MSW5wdXRGYWN0b3J5IGlucHV0RmFjdG9yeSA9IFhNTElucHV0RmFjdG9yeS5uZXdJbnN0YW5jZSgpOw0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7DQotICAgICAgICByZXR1cm4gZ2V0VGVzdFNldHVwKG5ldyBUZXN0U3VpdGUoU0FYU291cmNlRGlzcGF0Y2hUZXN0cy5jbGFzcykpOw0KLSAgICB9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RTeW5jUGF5bG9hZE1vZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJ0ZXN0OiAiICsgZ2V0TmFtZSgpKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgSkFYLVdTIGNsaWVudCBhcnRpZmFjdHMNCi0gICAgICAgIFNlcnZpY2Ugc3ZjID0gU2VydmljZS5jcmVhdGUoRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlFOQU1FX1NFUlZJQ0UpOw0KLSAgICAgICAgc3ZjLmFkZFBvcnQoRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlFOQU1FX1BPUlQsIG51bGwsIERpc3BhdGNoVGVzdENvbnN0YW50cy5VUkwpOw0KLSAgICAgICAgRGlzcGF0Y2g8U291cmNlPiBkaXNwYXRjaCA9IHN2Yy5jcmVhdGVEaXNwYXRjaChEaXNwYXRjaFRlc3RDb25zdGFudHMuUU5BTUVfUE9SVCwgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZS5jbGFzcywgU2VydmljZS5Nb2RlLlBBWUxPQUQpOw0KLQ0KLSAgICAgICAgLy8gQ3JlYXRlIGEgU0FYU291cmNlIG91dCBvZiB0aGUgc3RyaW5nIGNvbnRlbnQNCi0gICAgICAgIGJ5dGVbXSBieXRlcyA9IERpc3BhdGNoVGVzdENvbnN0YW50cy5zYW1wbGVCb2R5Q29udGVudC5nZXRCeXRlcygpOw0KLSAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gc3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVzKTsNCi0gICAgICAgIElucHV0U291cmNlIGlucHV0ID0gbmV3IElucHV0U291cmNlKHN0cmVhbSk7DQotICAgICAgICBTb3VyY2UgcmVxdWVzdCA9IG5ldyBTQVhTb3VyY2UoaW5wdXQpOw0KLQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEludm9raW5nIHN5bmMgRGlzcGF0Y2giKTsNCi0gICAgICAgIFNvdXJjZSByZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0NCi0gICAgICAgIGFzc2VydE5vdE51bGwoImRpc3BhdGNoIGludm9rZSByZXR1cm5lZCBudWxsIiwgcmVzcG9uc2UpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBQcmVwYXJlIHRoZSByZXNwb25zZSBjb250ZW50IGZvciBjaGVja2luZw0KLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHJlYWRlciA9IGlucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIocmVzcG9uc2UpOw0KLSAgICAgICAgUmVhZGVyMldyaXRlciByMncgPSBuZXcgUmVhZGVyMldyaXRlcihyZWFkZXIpOw0KLSAgICAgICAgU3RyaW5nIHJlc3BvbnNlVGV4dCA9IHIydy5nZXRBc1N0cmluZygpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcocmVzcG9uc2VUZXh0KTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBjb250ZW50IGlzIGNvcnJlY3QNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlVGV4dC5jb250YWlucygic29hcCIpKTsNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlVGV4dC5jb250YWlucygiRW52ZWxvcGUiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZVRleHQuY29udGFpbnMoIkJvZHkiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlVGV4dC5jb250YWlucygiZWNob1N0cmluZ1Jlc3BvbnNlIikpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBJbnZva2UgYSBzZWNvbmQgdGltZQ0KLSAgICAgICAgc3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVzKTsNCi0gICAgICAgIGlucHV0ID0gbmV3IElucHV0U291cmNlKHN0cmVhbSk7DQotICAgICAgICByZXF1ZXN0ID0gbmV3IFNBWFNvdXJjZShpbnB1dCk7DQotDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gSW52b2tpbmcgc3luYyBEaXNwYXRjaCIpOw0KLSAgICAgICAgcmVzcG9uc2UgPSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7DQotDQotICAgICAgICBhc3NlcnROb3ROdWxsKCJkaXNwYXRjaCBpbnZva2UgcmV0dXJuZWQgbnVsbCIsIHJlc3BvbnNlKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gUHJlcGFyZSB0aGUgcmVzcG9uc2UgY29udGVudCBmb3IgY2hlY2tpbmcNCi0gICAgICAgIHJlYWRlciA9IGlucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIocmVzcG9uc2UpOw0KLSAgICAgICAgcjJ3ID0gbmV3IFJlYWRlcjJXcml0ZXIocmVhZGVyKTsNCi0gICAgICAgIHJlc3BvbnNlVGV4dCA9IHIydy5nZXRBc1N0cmluZygpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcocmVzcG9uc2VUZXh0KTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBjb250ZW50IGlzIGNvcnJlY3QNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlVGV4dC5jb250YWlucygic29hcCIpKTsNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlVGV4dC5jb250YWlucygiRW52ZWxvcGUiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZVRleHQuY29udGFpbnMoIkJvZHkiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlVGV4dC5jb250YWlucygiZWNob1N0cmluZ1Jlc3BvbnNlIikpOw0KLSAgICAgICAgDQotICAgICB9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RTeW5jTWVzc2FnZU1vZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJ0ZXN0OiAiICsgZ2V0TmFtZSgpKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgSkFYLVdTIGNsaWVudCBhcnRpZmFjdHMNCi0gICAgICAgIFNlcnZpY2Ugc3ZjID0gU2VydmljZS5jcmVhdGUoRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlFOQU1FX1NFUlZJQ0UpOw0KLSAgICAgICAgc3ZjLmFkZFBvcnQoRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlFOQU1FX1BPUlQsIG51bGwsIERpc3BhdGNoVGVzdENvbnN0YW50cy5VUkwpOw0KLSAgICAgICAgRGlzcGF0Y2g8U291cmNlPiBkaXNwYXRjaCA9IHN2Yy5jcmVhdGVEaXNwYXRjaChEaXNwYXRjaFRlc3RDb25zdGFudHMuUU5BTUVfUE9SVCwgDQotICAgICAgICAgICAgICAgIFNvdXJjZS5jbGFzcywgU2VydmljZS5Nb2RlLk1FU1NBR0UpOw0KLQkJDQotICAgICAgICAvLyBDcmVhdGUgYSBTQVhTb3VyY2Ugb3V0IG9mIHRoZSBzdHJpbmcgY29udGVudA0KLSAgICAgICAgYnl0ZVtdIGJ5dGVzID0gRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLnNhbXBsZVNvYXBNZXNzYWdlLmdldEJ5dGVzKCk7DQotICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBzdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZXMpOw0KLSAgICAgICAgSW5wdXRTb3VyY2UgaW5wdXQgPSBuZXcgSW5wdXRTb3VyY2Uoc3RyZWFtKTsNCi0gICAgICAgIFNvdXJjZSByZXF1ZXN0ID0gbmV3IFNBWFNvdXJjZShpbnB1dCk7DQotDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gSW52b2tpbmcgc3luYyBEaXNwYXRjaCB3aXRoIE1lc3NhZ2UgTW9kZSIpOw0KLQkJU291cmNlIHJlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLQ0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgiZGlzcGF0Y2ggaW52b2tlIHJldHVybmVkIG51bGwiLCByZXNwb25zZSk7DQotICAgICAgICANCi0gICAgICAgIC8vIFByZXBhcmUgdGhlIHJlc3BvbnNlIGNvbnRlbnQgZm9yIGNoZWNraW5nDQotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyID0gaW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihyZXNwb25zZSk7DQotICAgICAgICBSZWFkZXIyV3JpdGVyIHIydyA9IG5ldyBSZWFkZXIyV3JpdGVyKHJlYWRlcik7DQotICAgICAgICBTdHJpbmcgcmVzcG9uc2VUZXh0ID0gcjJ3LmdldEFzU3RyaW5nKCk7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZyhyZXNwb25zZVRleHQpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIGNvbnRlbnQgaXMgY29ycmVjdA0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZVRleHQuY29udGFpbnMoInNvYXAiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlVGV4dC5jb250YWlucygiRW52ZWxvcGUiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlVGV4dC5jb250YWlucygiQm9keSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJlY2hvU3RyaW5nUmVzcG9uc2UiKSk7DQotICAgICAgICANCi0gICAgICAgIA0KLSAgICAgICAgLy8gSW52b2tlIGEgc2Vjb25kIHRpbWUNCi0gICAgICAgIHN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlcyk7DQotICAgICAgICBpbnB1dCA9IG5ldyBJbnB1dFNvdXJjZShzdHJlYW0pOw0KLSAgICAgICAgcmVxdWVzdCA9IG5ldyBTQVhTb3VyY2UoaW5wdXQpOw0KLQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEludm9raW5nIHN5bmMgRGlzcGF0Y2ggd2l0aCBNZXNzYWdlIE1vZGUiKTsNCi0gICAgICAgIHJlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLQ0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgiZGlzcGF0Y2ggaW52b2tlIHJldHVybmVkIG51bGwiLCByZXNwb25zZSk7DQotICAgICAgICANCi0gICAgICAgIC8vIFByZXBhcmUgdGhlIHJlc3BvbnNlIGNvbnRlbnQgZm9yIGNoZWNraW5nDQotICAgICAgICByZWFkZXIgPSBpbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKHJlc3BvbnNlKTsNCi0gICAgICAgIHIydyA9IG5ldyBSZWFkZXIyV3JpdGVyKHJlYWRlcik7DQotICAgICAgICByZXNwb25zZVRleHQgPSByMncuZ2V0QXNTdHJpbmcoKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKHJlc3BvbnNlVGV4dCk7DQotICAgICAgICANCi0gICAgICAgIC8vIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgY29udGVudCBpcyBjb3JyZWN0DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlVGV4dC5jb250YWlucygic29hcCIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJFbnZlbG9wZSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJCb2R5IikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZVRleHQuY29udGFpbnMoImVjaG9TdHJpbmdSZXNwb25zZSIpKTsNCi0JfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXN5bmNDYWxsYmFja1BheWxvYWRNb2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygidGVzdDogIiArIGdldE5hbWUoKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIEluaXRpYWxpemUgdGhlIEpBWC1XUyBjbGllbnQgYXJ0aWZhY3RzDQotICAgICAgICBTZXJ2aWNlIHN2YyA9IFNlcnZpY2UuY3JlYXRlKERpc3BhdGNoVGVzdENvbnN0YW50cy5RTkFNRV9TRVJWSUNFKTsNCi0gICAgICAgIHN2Yy5hZGRQb3J0KERpc3BhdGNoVGVzdENvbnN0YW50cy5RTkFNRV9QT1JULCBudWxsLCBEaXNwYXRjaFRlc3RDb25zdGFudHMuVVJMKTsNCi0gICAgICAgIERpc3BhdGNoPFNvdXJjZT4gZGlzcGF0Y2ggPSBzdmMuY3JlYXRlRGlzcGF0Y2goRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlFOQU1FX1BPUlQsIA0KLSAgICAgICAgICAgICAgICBTb3VyY2UuY2xhc3MsIFNlcnZpY2UuTW9kZS5QQVlMT0FEKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gU2V0dXAgdGhlIGNhbGxiYWNrIGZvciBhc3luYyByZXNwb25zZXMNCi0gICAgICAgIEFzeW5jQ2FsbGJhY2s8U291cmNlPiBjYWxsYmFja0hhbmRsZXIgPSBuZXcgQXN5bmNDYWxsYmFjazxTb3VyY2U+KCk7DQotICAgICAgICANCi0gICAgICAgIC8vIENyZWF0ZSBhIFNBWFNvdXJjZSBvdXQgb2YgdGhlIHN0cmluZyBjb250ZW50DQotICAgICAgICBieXRlW10gYnl0ZXMgPSBEaXNwYXRjaFRlc3RDb25zdGFudHMuc2FtcGxlQm9keUNvbnRlbnQuZ2V0Qnl0ZXMoKTsNCi0gICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIHN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlcyk7DQotICAgICAgICBJbnB1dFNvdXJjZSBpbnB1dCA9IG5ldyBJbnB1dFNvdXJjZShzdHJlYW0pOw0KLSAgICAgICAgU291cmNlIHJlcXVlc3QgPSBuZXcgU0FYU291cmNlKGlucHV0KTsNCi0NCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBJbnZva2luZyBhc3luYyAoY2FsbGJhY2spIERpc3BhdGNoIik7DQotICAgICAgICBGdXR1cmU8Pz4gbW9uaXRvciA9IGRpc3BhdGNoLmludm9rZUFzeW5jKHJlcXVlc3QsIGNhbGxiYWNrSGFuZGxlcik7DQotDQotICAgICAgICB3aGlsZSAoIW1vbml0b3IuaXNEb25lKCkpIHsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gQXN5bmMgaW52b2NhdGlvbiBzdGlsbCBub3QgY29tcGxldGUiKTsNCi0gICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIFNvdXJjZSByZXNwb25zZSA9IGNhbGxiYWNrSGFuZGxlci5nZXRWYWx1ZSgpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgiZGlzcGF0Y2ggaW52b2tlIHJldHVybmVkIG51bGwiLCByZXNwb25zZSk7DQotICAgICAgICANCi0gICAgICAgIC8vIFByZXBhcmUgdGhlIHJlc3BvbnNlIGNvbnRlbnQgZm9yIGNoZWNraW5nDQotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyID0gaW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihyZXNwb25zZSk7DQotICAgICAgICBSZWFkZXIyV3JpdGVyIHIydyA9IG5ldyBSZWFkZXIyV3JpdGVyKHJlYWRlcik7DQotICAgICAgICBTdHJpbmcgcmVzcG9uc2VUZXh0ID0gcjJ3LmdldEFzU3RyaW5nKCk7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZyhyZXNwb25zZVRleHQpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIGNvbnRlbnQgaXMgY29ycmVjdA0KLSAgICAgICAgYXNzZXJ0VHJ1ZSghcmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJzb2FwIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSghcmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJFbnZlbG9wZSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlVGV4dC5jb250YWlucygiQm9keSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJlY2hvU3RyaW5nUmVzcG9uc2UiKSk7DQotICAgICAgICANCi0gICAgICAgIA0KLSAgICAgICAgDQotICAgICAgICAvLyBJbnZva2UgYSBzZWNvbmQgdGltZQ0KLSAgICAgICAgY2FsbGJhY2tIYW5kbGVyID0gbmV3IEFzeW5jQ2FsbGJhY2s8U291cmNlPigpOw0KLSAgICAgICAgc3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVzKTsNCi0gICAgICAgIGlucHV0ID0gbmV3IElucHV0U291cmNlKHN0cmVhbSk7DQotICAgICAgICByZXF1ZXN0ID0gbmV3IFNBWFNvdXJjZShpbnB1dCk7DQotDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gSW52b2tpbmcgYXN5bmMgKGNhbGxiYWNrKSBEaXNwYXRjaCIpOw0KLSAgICAgICAgbW9uaXRvciA9IGRpc3BhdGNoLmludm9rZUFzeW5jKHJlcXVlc3QsIGNhbGxiYWNrSGFuZGxlcik7DQotDQotICAgICAgICB3aGlsZSAoIW1vbml0b3IuaXNEb25lKCkpIHsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gQXN5bmMgaW52b2NhdGlvbiBzdGlsbCBub3QgY29tcGxldGUiKTsNCi0gICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIHJlc3BvbnNlID0gY2FsbGJhY2tIYW5kbGVyLmdldFZhbHVlKCk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKCJkaXNwYXRjaCBpbnZva2UgcmV0dXJuZWQgbnVsbCIsIHJlc3BvbnNlKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gUHJlcGFyZSB0aGUgcmVzcG9uc2UgY29udGVudCBmb3IgY2hlY2tpbmcNCi0gICAgICAgIHJlYWRlciA9IGlucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIocmVzcG9uc2UpOw0KLSAgICAgICAgcjJ3ID0gbmV3IFJlYWRlcjJXcml0ZXIocmVhZGVyKTsNCi0gICAgICAgIHJlc3BvbnNlVGV4dCA9IHIydy5nZXRBc1N0cmluZygpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcocmVzcG9uc2VUZXh0KTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBjb250ZW50IGlzIGNvcnJlY3QNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlVGV4dC5jb250YWlucygic29hcCIpKTsNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlVGV4dC5jb250YWlucygiRW52ZWxvcGUiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZVRleHQuY29udGFpbnMoIkJvZHkiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlVGV4dC5jb250YWlucygiZWNob1N0cmluZ1Jlc3BvbnNlIikpOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXN5bmNDYWxsYmFja01lc3NhZ2VNb2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygidGVzdDogIiArIGdldE5hbWUoKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIEluaXRpYWxpemUgdGhlIEpBWC1XUyBjbGllbnQgYXJ0aWZhY3RzDQotICAgICAgICBTZXJ2aWNlIHN2YyA9IFNlcnZpY2UuY3JlYXRlKERpc3BhdGNoVGVzdENvbnN0YW50cy5RTkFNRV9TRVJWSUNFKTsNCi0gICAgICAgIHN2Yy5hZGRQb3J0KERpc3BhdGNoVGVzdENvbnN0YW50cy5RTkFNRV9QT1JULCBudWxsLCBEaXNwYXRjaFRlc3RDb25zdGFudHMuVVJMKTsNCi0gICAgICAgIERpc3BhdGNoPFNvdXJjZT4gZGlzcGF0Y2ggPSBzdmMuY3JlYXRlRGlzcGF0Y2goRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlFOQU1FX1BPUlQsIA0KLSAgICAgICAgICAgICAgICBTb3VyY2UuY2xhc3MsIFNlcnZpY2UuTW9kZS5NRVNTQUdFKTsNCi0JCQ0KLSAgICAgICAgLy8gU2V0dXAgdGhlIGNhbGxiYWNrIGZvciBhc3luYyByZXNwb25zZXMNCi0gICAgICAgIEFzeW5jQ2FsbGJhY2s8U291cmNlPiBjYWxsYmFja0hhbmRsZXIgPSBuZXcgQXN5bmNDYWxsYmFjazxTb3VyY2U+KCk7DQotICAgICAgICANCi0gICAgICAgIC8vIENyZWF0ZSBhIFNBWFNvdXJjZSBvdXQgb2YgdGhlIHN0cmluZyBjb250ZW50DQotICAgICAgICBieXRlW10gYnl0ZXMgPSBEaXNwYXRjaFRlc3RDb25zdGFudHMuc2FtcGxlU29hcE1lc3NhZ2UuZ2V0Qnl0ZXMoKTsNCi0gICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIHN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlcyk7DQotICAgICAgICBJbnB1dFNvdXJjZSBpbnB1dCA9IG5ldyBJbnB1dFNvdXJjZShzdHJlYW0pOw0KLSAgICAgICAgU291cmNlIHJlcXVlc3QgPSBuZXcgU0FYU291cmNlKGlucHV0KTsNCi0NCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBJbnZva2luZyBhc3luYyAoY2FsbGJhY2spIERpc3BhdGNoIik7DQotICAgICAgICBGdXR1cmU8Pz4gbW9uaXRvciA9IGRpc3BhdGNoLmludm9rZUFzeW5jKHJlcXVlc3QsIGNhbGxiYWNrSGFuZGxlcik7DQotDQotICAgICAgICB3aGlsZSAoIW1vbml0b3IuaXNEb25lKCkpIHsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gQXN5bmMgaW52b2NhdGlvbiBzdGlsbCBub3QgY29tcGxldGUiKTsNCi0gICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIFNvdXJjZSByZXNwb25zZSA9IGNhbGxiYWNrSGFuZGxlci5nZXRWYWx1ZSgpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgiZGlzcGF0Y2ggaW52b2tlIHJldHVybmVkIG51bGwiLCByZXNwb25zZSk7DQotICAgICAgICANCi0gICAgICAgIC8vIFByZXBhcmUgdGhlIHJlc3BvbnNlIGNvbnRlbnQgZm9yIGNoZWNraW5nDQotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyID0gaW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihyZXNwb25zZSk7DQotICAgICAgICBSZWFkZXIyV3JpdGVyIHIydyA9IG5ldyBSZWFkZXIyV3JpdGVyKHJlYWRlcik7DQotICAgICAgICBTdHJpbmcgcmVzcG9uc2VUZXh0ID0gcjJ3LmdldEFzU3RyaW5nKCk7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZyhyZXNwb25zZVRleHQpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIGNvbnRlbnQgaXMgY29ycmVjdA0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZVRleHQuY29udGFpbnMoInNvYXAiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlVGV4dC5jb250YWlucygiRW52ZWxvcGUiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlVGV4dC5jb250YWlucygiQm9keSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJlY2hvU3RyaW5nUmVzcG9uc2UiKSk7DQotICAgICAgICANCi0gICAgICAgIA0KLSAgICAgICAgLy8gSW52b2tlIGEgc2Vjb25kIHRpbWUgdG8gdmVyaWZ5DQotICAgICAgICBjYWxsYmFja0hhbmRsZXIgPSBuZXcgQXN5bmNDYWxsYmFjazxTb3VyY2U+KCk7DQotICAgICAgICANCi0gICAgICAgIHN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlcyk7DQotICAgICAgICBpbnB1dCA9IG5ldyBJbnB1dFNvdXJjZShzdHJlYW0pOw0KLSAgICAgICAgcmVxdWVzdCA9IG5ldyBTQVhTb3VyY2UoaW5wdXQpOw0KLQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEludm9raW5nIGFzeW5jIChjYWxsYmFjaykgRGlzcGF0Y2giKTsNCi0gICAgICAgIG1vbml0b3IgPSBkaXNwYXRjaC5pbnZva2VBc3luYyhyZXF1ZXN0LCBjYWxsYmFja0hhbmRsZXIpOw0KLQ0KLSAgICAgICAgd2hpbGUgKCFtb25pdG9yLmlzRG9uZSgpKSB7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEFzeW5jIGludm9jYXRpb24gc3RpbGwgbm90IGNvbXBsZXRlIik7DQotICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDApOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICByZXNwb25zZSA9IGNhbGxiYWNrSGFuZGxlci5nZXRWYWx1ZSgpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgiZGlzcGF0Y2ggaW52b2tlIHJldHVybmVkIG51bGwiLCByZXNwb25zZSk7DQotICAgICAgICANCi0gICAgICAgIC8vIFByZXBhcmUgdGhlIHJlc3BvbnNlIGNvbnRlbnQgZm9yIGNoZWNraW5nDQotICAgICAgICByZWFkZXIgPSBpbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKHJlc3BvbnNlKTsNCi0gICAgICAgIHIydyA9IG5ldyBSZWFkZXIyV3JpdGVyKHJlYWRlcik7DQotICAgICAgICByZXNwb25zZVRleHQgPSByMncuZ2V0QXNTdHJpbmcoKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKHJlc3BvbnNlVGV4dCk7DQotICAgICAgICANCi0gICAgICAgIC8vIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgY29udGVudCBpcyBjb3JyZWN0DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlVGV4dC5jb250YWlucygic29hcCIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJFbnZlbG9wZSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJCb2R5IikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZVRleHQuY29udGFpbnMoImVjaG9TdHJpbmdSZXNwb25zZSIpKTsNCi0JfQ0KLSAgICANCi0gICAgcHVibGljIHZvaWQgdGVzdEFzeW5jUG9sbGluZ1BheWxvYWRNb2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygidGVzdDogIiArIGdldE5hbWUoKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIEluaXRpYWxpemUgdGhlIEpBWC1XUyBjbGllbnQgYXJ0aWZhY3RzDQotICAgICAgICBTZXJ2aWNlIHN2YyA9IFNlcnZpY2UuY3JlYXRlKERpc3BhdGNoVGVzdENvbnN0YW50cy5RTkFNRV9TRVJWSUNFKTsNCi0gICAgICAgIHN2Yy5hZGRQb3J0KERpc3BhdGNoVGVzdENvbnN0YW50cy5RTkFNRV9QT1JULCBudWxsLCBEaXNwYXRjaFRlc3RDb25zdGFudHMuVVJMKTsNCi0gICAgICAgIERpc3BhdGNoPFNvdXJjZT4gZGlzcGF0Y2ggPSBzdmMuY3JlYXRlRGlzcGF0Y2goRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlFOQU1FX1BPUlQsIA0KLSAgICAgICAgICAgICAgICBTb3VyY2UuY2xhc3MsIFNlcnZpY2UuTW9kZS5QQVlMT0FEKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQ3JlYXRlIGEgU0FYU291cmNlIG91dCBvZiB0aGUgc3RyaW5nIGNvbnRlbnQNCi0gICAgICAgIGJ5dGVbXSBieXRlcyA9IERpc3BhdGNoVGVzdENvbnN0YW50cy5zYW1wbGVCb2R5Q29udGVudC5nZXRCeXRlcygpOw0KLSAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gc3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVzKTsNCi0gICAgICAgIElucHV0U291cmNlIGlucHV0ID0gbmV3IElucHV0U291cmNlKHN0cmVhbSk7DQotICAgICAgICBTb3VyY2UgcmVxdWVzdCA9IG5ldyBTQVhTb3VyY2UoaW5wdXQpOw0KLQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEludm9raW5nIGFzeW5jIChwb2xsaW5nKSBEaXNwYXRjaCIpOw0KLSAgICAgICAgUmVzcG9uc2U8U291cmNlPiBhc3luY1Jlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlQXN5bmMocmVxdWVzdCk7DQotDQotICAgICAgICB3aGlsZSAoIWFzeW5jUmVzcG9uc2UuaXNEb25lKCkpIHsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gQXN5bmMgaW52b2NhdGlvbiBzdGlsbCBub3QgY29tcGxldGUiKTsNCi0gICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIFNvdXJjZSByZXNwb25zZSA9IGFzeW5jUmVzcG9uc2UuZ2V0KCk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKCJkaXNwYXRjaCBpbnZva2UgcmV0dXJuZWQgbnVsbCIsIHJlc3BvbnNlKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gUHJlcGFyZSB0aGUgcmVzcG9uc2UgY29udGVudCBmb3IgY2hlY2tpbmcNCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlciByZWFkZXIgPSBpbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKHJlc3BvbnNlKTsNCi0gICAgICAgIFJlYWRlcjJXcml0ZXIgcjJ3ID0gbmV3IFJlYWRlcjJXcml0ZXIocmVhZGVyKTsNCi0gICAgICAgIFN0cmluZyByZXNwb25zZVRleHQgPSByMncuZ2V0QXNTdHJpbmcoKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKHJlc3BvbnNlVGV4dCk7DQotICAgICAgICANCi0gICAgICAgIC8vIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgY29udGVudCBpcyBjb3JyZWN0DQotICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZVRleHQuY29udGFpbnMoInNvYXAiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZVRleHQuY29udGFpbnMoIkVudmVsb3BlIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSghcmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJCb2R5IikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZVRleHQuY29udGFpbnMoImVjaG9TdHJpbmdSZXNwb25zZSIpKTsNCi0gICAgICAgIA0KLSAgICAgICAgDQotICAgICAgICAvLyBJbnZva2UgYSBzZWNvbmQgdGltZSB0byB2ZXJpZnkNCi0gICAgICAgIHN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlcyk7DQotICAgICAgICBpbnB1dCA9IG5ldyBJbnB1dFNvdXJjZShzdHJlYW0pOw0KLSAgICAgICAgcmVxdWVzdCA9IG5ldyBTQVhTb3VyY2UoaW5wdXQpOw0KLQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEludm9raW5nIGFzeW5jIChwb2xsaW5nKSBEaXNwYXRjaCIpOw0KLSAgICAgICAgYXN5bmNSZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZUFzeW5jKHJlcXVlc3QpOw0KLQ0KLSAgICAgICAgd2hpbGUgKCFhc3luY1Jlc3BvbnNlLmlzRG9uZSgpKSB7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEFzeW5jIGludm9jYXRpb24gc3RpbGwgbm90IGNvbXBsZXRlIik7DQotICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDApOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICByZXNwb25zZSA9IGFzeW5jUmVzcG9uc2UuZ2V0KCk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKCJkaXNwYXRjaCBpbnZva2UgcmV0dXJuZWQgbnVsbCIsIHJlc3BvbnNlKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gUHJlcGFyZSB0aGUgcmVzcG9uc2UgY29udGVudCBmb3IgY2hlY2tpbmcNCi0gICAgICAgIHJlYWRlciA9IGlucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIocmVzcG9uc2UpOw0KLSAgICAgICAgcjJ3ID0gbmV3IFJlYWRlcjJXcml0ZXIocmVhZGVyKTsNCi0gICAgICAgIHJlc3BvbnNlVGV4dCA9IHIydy5nZXRBc1N0cmluZygpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcocmVzcG9uc2VUZXh0KTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBjb250ZW50IGlzIGNvcnJlY3QNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlVGV4dC5jb250YWlucygic29hcCIpKTsNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlVGV4dC5jb250YWlucygiRW52ZWxvcGUiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZVRleHQuY29udGFpbnMoIkJvZHkiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlVGV4dC5jb250YWlucygiZWNob1N0cmluZ1Jlc3BvbnNlIikpOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXN5bmNQb2xsaW5nTWVzc2FnZU1vZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJ0ZXN0OiAiICsgZ2V0TmFtZSgpKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgSkFYLVdTIGNsaWVudCBhcnRpZmFjdHMNCi0gICAgICAgIFNlcnZpY2Ugc3ZjID0gU2VydmljZS5jcmVhdGUoRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlFOQU1FX1NFUlZJQ0UpOw0KLSAgICAgICAgc3ZjLmFkZFBvcnQoRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlFOQU1FX1BPUlQsIG51bGwsIERpc3BhdGNoVGVzdENvbnN0YW50cy5VUkwpOw0KLSAgICAgICAgRGlzcGF0Y2g8U291cmNlPiBkaXNwYXRjaCA9IHN2Yy5jcmVhdGVEaXNwYXRjaChEaXNwYXRjaFRlc3RDb25zdGFudHMuUU5BTUVfUE9SVCwgDQotICAgICAgICAgICAgICAgIFNvdXJjZS5jbGFzcywgU2VydmljZS5Nb2RlLk1FU1NBR0UpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBDcmVhdGUgYSBTQVhTb3VyY2Ugb3V0IG9mIHRoZSBzdHJpbmcgY29udGVudA0KLSAgICAgICAgYnl0ZVtdIGJ5dGVzID0gRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLnNhbXBsZVNvYXBNZXNzYWdlLmdldEJ5dGVzKCk7DQotICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBzdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZXMpOw0KLSAgICAgICAgSW5wdXRTb3VyY2UgaW5wdXQgPSBuZXcgSW5wdXRTb3VyY2Uoc3RyZWFtKTsNCi0gICAgICAgIFNvdXJjZSByZXF1ZXN0ID0gbmV3IFNBWFNvdXJjZShpbnB1dCk7DQotDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gSW52b2tpbmcgYXN5bmMgKGNhbGxiYWNrKSBEaXNwYXRjaCIpOw0KLSAgICAgICAgUmVzcG9uc2U8U291cmNlPiBhc3luY1Jlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlQXN5bmMocmVxdWVzdCk7DQotDQotICAgICAgICB3aGlsZSAoIWFzeW5jUmVzcG9uc2UuaXNEb25lKCkpIHsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gQXN5bmMgaW52b2NhdGlvbiBzdGlsbCBub3QgY29tcGxldGUiKTsNCi0gICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIFNvdXJjZSByZXNwb25zZSA9IGFzeW5jUmVzcG9uc2UuZ2V0KCk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKCJkaXNwYXRjaCBpbnZva2UgcmV0dXJuZWQgbnVsbCIsIHJlc3BvbnNlKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gUHJlcGFyZSB0aGUgcmVzcG9uc2UgY29udGVudCBmb3IgY2hlY2tpbmcNCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlciByZWFkZXIgPSBpbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKHJlc3BvbnNlKTsNCi0gICAgICAgIFJlYWRlcjJXcml0ZXIgcjJ3ID0gbmV3IFJlYWRlcjJXcml0ZXIocmVhZGVyKTsNCi0gICAgICAgIFN0cmluZyByZXNwb25zZVRleHQgPSByMncuZ2V0QXNTdHJpbmcoKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKHJlc3BvbnNlVGV4dCk7DQotICAgICAgICANCi0gICAgICAgIC8vIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgY29udGVudCBpcyBjb3JyZWN0DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlVGV4dC5jb250YWlucygic29hcCIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJFbnZlbG9wZSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJCb2R5IikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZVRleHQuY29udGFpbnMoImVjaG9TdHJpbmdSZXNwb25zZSIpKTsNCi0gICAgICAgIA0KLSAgICAgICAgDQotICAgICAgICAvLyBJbnZva2UgYSBzZWNvbmQgdGltZSB0byB2ZXJpZnkNCi0gICAgICAgIHN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlcyk7DQotICAgICAgICBpbnB1dCA9IG5ldyBJbnB1dFNvdXJjZShzdHJlYW0pOw0KLSAgICAgICAgcmVxdWVzdCA9IG5ldyBTQVhTb3VyY2UoaW5wdXQpOw0KLQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEludm9raW5nIGFzeW5jIChjYWxsYmFjaykgRGlzcGF0Y2giKTsNCi0gICAgICAgIGFzeW5jUmVzcG9uc2UgPSBkaXNwYXRjaC5pbnZva2VBc3luYyhyZXF1ZXN0KTsNCi0NCi0gICAgICAgIHdoaWxlICghYXN5bmNSZXNwb25zZS5pc0RvbmUoKSkgew0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBBc3luYyBpbnZvY2F0aW9uIHN0aWxsIG5vdCBjb21wbGV0ZSIpOw0KLSAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgcmVzcG9uc2UgPSBhc3luY1Jlc3BvbnNlLmdldCgpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgiZGlzcGF0Y2ggaW52b2tlIHJldHVybmVkIG51bGwiLCByZXNwb25zZSk7DQotICAgICAgICANCi0gICAgICAgIC8vIFByZXBhcmUgdGhlIHJlc3BvbnNlIGNvbnRlbnQgZm9yIGNoZWNraW5nDQotICAgICAgICByZWFkZXIgPSBpbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKHJlc3BvbnNlKTsNCi0gICAgICAgIHIydyA9IG5ldyBSZWFkZXIyV3JpdGVyKHJlYWRlcik7DQotICAgICAgICByZXNwb25zZVRleHQgPSByMncuZ2V0QXNTdHJpbmcoKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKHJlc3BvbnNlVGV4dCk7DQotICAgICAgICANCi0gICAgICAgIC8vIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgY29udGVudCBpcyBjb3JyZWN0DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlVGV4dC5jb250YWlucygic29hcCIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJFbnZlbG9wZSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJCb2R5IikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZVRleHQuY29udGFpbnMoImVjaG9TdHJpbmdSZXNwb25zZSIpKTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIHZvaWQgdGVzdE9uZVdheVBheWxvYWRNb2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygidGVzdDogIiArIGdldE5hbWUoKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIEluaXRpYWxpemUgdGhlIEpBWC1XUyBjbGllbnQgYXJ0aWZhY3RzDQotICAgICAgICBTZXJ2aWNlIHN2YyA9IFNlcnZpY2UuY3JlYXRlKERpc3BhdGNoVGVzdENvbnN0YW50cy5RTkFNRV9TRVJWSUNFKTsNCi0gICAgICAgIHN2Yy5hZGRQb3J0KERpc3BhdGNoVGVzdENvbnN0YW50cy5RTkFNRV9QT1JULCBudWxsLCBEaXNwYXRjaFRlc3RDb25zdGFudHMuVVJMKTsNCi0gICAgICAgIERpc3BhdGNoPFNvdXJjZT4gZGlzcGF0Y2ggPSBzdmMuY3JlYXRlRGlzcGF0Y2goRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlFOQU1FX1BPUlQsIA0KLSAgICAgICAgICAgICAgICBTb3VyY2UuY2xhc3MsIFNlcnZpY2UuTW9kZS5QQVlMT0FEKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQ3JlYXRlIGEgU0FYU291cmNlIG91dCBvZiB0aGUgc3RyaW5nIGNvbnRlbnQNCi0gICAgICAgIGJ5dGVbXSBieXRlcyA9IERpc3BhdGNoVGVzdENvbnN0YW50cy5zYW1wbGVCb2R5Q29udGVudC5nZXRCeXRlcygpOw0KLSAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gc3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVzKTsNCi0gICAgICAgIElucHV0U291cmNlIGlucHV0ID0gbmV3IElucHV0U291cmNlKHN0cmVhbSk7DQotICAgICAgICBTb3VyY2UgcmVxdWVzdCA9IG5ldyBTQVhTb3VyY2UoaW5wdXQpOw0KLQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEludm9raW5nIE9uZSBXYXkgRGlzcGF0Y2giKTsNCi0gICAgICAgIGRpc3BhdGNoLmludm9rZU9uZVdheShyZXF1ZXN0KTsNCi0gICAgICAgIA0KLSAgICAgICAgDQotICAgICAgICAvLyBJbnZva2UgYSBzZWNvbmQgdGltZSB0byB2ZXJpZnkNCi0gICAgICAgIHN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlcyk7DQotICAgICAgICBpbnB1dCA9IG5ldyBJbnB1dFNvdXJjZShzdHJlYW0pOw0KLSAgICAgICAgcmVxdWVzdCA9IG5ldyBTQVhTb3VyY2UoaW5wdXQpOw0KLQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEludm9raW5nIE9uZSBXYXkgRGlzcGF0Y2giKTsNCi0gICAgICAgIGRpc3BhdGNoLmludm9rZU9uZVdheShyZXF1ZXN0KTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIHZvaWQgdGVzdE9uZVdheU1lc3NhZ2VNb2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygidGVzdDogIiArIGdldE5hbWUoKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIEluaXRpYWxpemUgdGhlIEpBWC1XUyBjbGllbnQgYXJ0aWZhY3RzDQotICAgICAgICBTZXJ2aWNlIHN2YyA9IFNlcnZpY2UuY3JlYXRlKERpc3BhdGNoVGVzdENvbnN0YW50cy5RTkFNRV9TRVJWSUNFKTsNCi0gICAgICAgIHN2Yy5hZGRQb3J0KERpc3BhdGNoVGVzdENvbnN0YW50cy5RTkFNRV9QT1JULCBudWxsLCBEaXNwYXRjaFRlc3RDb25zdGFudHMuVVJMKTsNCi0gICAgICAgIERpc3BhdGNoPFNvdXJjZT4gZGlzcGF0Y2ggPSBzdmMuY3JlYXRlRGlzcGF0Y2goRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlFOQU1FX1BPUlQsIA0KLSAgICAgICAgICAgICAgICBTb3VyY2UuY2xhc3MsIFNlcnZpY2UuTW9kZS5NRVNTQUdFKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQ3JlYXRlIGEgU0FYU291cmNlIG91dCBvZiB0aGUgc3RyaW5nIGNvbnRlbnQNCi0gICAgICAgIGJ5dGVbXSBieXRlcyA9IERpc3BhdGNoVGVzdENvbnN0YW50cy5zYW1wbGVTb2FwTWVzc2FnZS5nZXRCeXRlcygpOw0KLSAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gc3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVzKTsNCi0gICAgICAgIElucHV0U291cmNlIGlucHV0ID0gbmV3IElucHV0U291cmNlKHN0cmVhbSk7DQotICAgICAgICBTb3VyY2UgcmVxdWVzdCA9IG5ldyBTQVhTb3VyY2UoaW5wdXQpOw0KLQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEludm9raW5nIE9uZSBXYXkgRGlzcGF0Y2giKTsNCi0JZGlzcGF0Y2guaW52b2tlT25lV2F5KHJlcXVlc3QpOw0KLSAgICAgICAgICAgICAgICANCi0gICAgICAgIC8vIEludm9rZSBhIHNlY29uZCB0aW1lIHRvIHZlcmlmeQ0KLSAgICAgICAgc3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVzKTsNCi0gICAgICAgIGlucHV0ID0gbmV3IElucHV0U291cmNlKHN0cmVhbSk7DQotICAgICAgICByZXF1ZXN0ID0gbmV3IFNBWFNvdXJjZShpbnB1dCk7DQotDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gSW52b2tpbmcgT25lIFdheSBEaXNwYXRjaCIpOw0KLSAgICAgICAgZGlzcGF0Y2guaW52b2tlT25lV2F5KHJlcXVlc3QpOw0KLQl9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QmFkU0FYU291cmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygidGVzdDogIiArIGdldE5hbWUoKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIEluaXRpYWxpemUgdGhlIEpBWC1XUyBjbGllbnQgYXJ0aWZhY3RzDQotICAgICAgICBTZXJ2aWNlIHN2YyA9IFNlcnZpY2UuY3JlYXRlKERpc3BhdGNoVGVzdENvbnN0YW50cy5RTkFNRV9TRVJWSUNFKTsNCi0gICAgICAgIHN2Yy5hZGRQb3J0KERpc3BhdGNoVGVzdENvbnN0YW50cy5RTkFNRV9QT1JULCBudWxsLCBEaXNwYXRjaFRlc3RDb25zdGFudHMuVVJMKTsNCi0gICAgICAgIERpc3BhdGNoPFNvdXJjZT4gZGlzcGF0Y2ggPSBzdmMuY3JlYXRlRGlzcGF0Y2goRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlFOQU1FX1BPUlQsIA0KLSAgICAgICAgICAgICAgICBTb3VyY2UuY2xhc3MsIFNlcnZpY2UuTW9kZS5NRVNTQUdFKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQ3JlYXRlIGFuIGVtcHR5IChpbnZhbGlkKSBTQVhTb3VyY2UNCi0gICAgICAgIFNvdXJjZSByZXF1ZXN0ID0gbmV3IFNBWFNvdXJjZSgpOw0KLSAgICAgICAgDQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0gICAgICAgICAgICBmYWlsKCJXZWJTZXJ2aWNlRXhjZXB0aW9uIHdhcyBleHBlY3RlZCIpOw0KLSAgICAgICAgfSBjYXRjaCAoV2ViU2VydmljZUV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIkEgV2ViIFNlcnZpY2UgRXhjZXB0aW9uIHdhcyBleHBlY3RlZDogIiArIGUudG9TdHJpbmcoKSk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShlLmdldE1lc3NhZ2UoKSAhPSBudWxsKTsNCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgZmFpbCgiV2ViU2VydmljZUV4Y2VwdGlvbiB3YXMgZXhwZWN0ZWQsIGJ1dCByZWNlaXZlZDoiICsgZSk7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIC8vIEludm9rZSBhIHNlY29uZCB0aW1lIHRvIHZlcmlmeQ0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7DQotICAgICAgICAgICAgZmFpbCgiV2ViU2VydmljZUV4Y2VwdGlvbiB3YXMgZXhwZWN0ZWQiKTsNCi0gICAgICAgIH0gY2F0Y2ggKFdlYlNlcnZpY2VFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJBIFdlYiBTZXJ2aWNlIEV4Y2VwdGlvbiB3YXMgZXhwZWN0ZWQ6ICIgKyBlLnRvU3RyaW5nKCkpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZS5nZXRNZXNzYWdlKCkgIT0gbnVsbCk7DQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGZhaWwoIldlYlNlcnZpY2VFeGNlcHRpb24gd2FzIGV4cGVjdGVkLCBidXQgcmVjZWl2ZWQ6IiArIGUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIGRpc3BhdGNoLmludm9rZU9uZVdheShyZXF1ZXN0KTsNCi0gICAgICAgICAgICBmYWlsKCJXZWJTZXJ2aWNlRXhjZXB0aW9uIHdhcyBleHBlY3RlZCIpOw0KLSAgICAgICAgfSBjYXRjaCAoV2ViU2VydmljZUV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIkEgV2ViIFNlcnZpY2UgRXhjZXB0aW9uIHdhcyBleHBlY3RlZDogIiArIGUudG9TdHJpbmcoKSk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShlLmdldE1lc3NhZ2UoKSAhPSBudWxsKTsNCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgZmFpbCgiV2ViU2VydmljZUV4Y2VwdGlvbiB3YXMgZXhwZWN0ZWQsIGJ1dCByZWNlaXZlZDoiICsgZSk7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgfQ0KLSAgICANCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rpc3BhdGNoL1NPQVAxMkRpc3BhdGNoVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rpc3BhdGNoL1NPQVAxMkRpc3BhdGNoVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWZjYzAwLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kaXNwYXRjaC9TT0FQMTJEaXNwYXRjaFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyOSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRpc3BhdGNoOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLk1EUUNvbnN0YW50czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5mcmFtZXdvcmsuQWJzdHJhY3RUZXN0Q2FzZTsNCi0NCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7DQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXI7DQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5Ow0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7DQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVNvdXJjZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLkRpc3BhdGNoOw0KLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2UuTW9kZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuU09BUEJpbmRpbmc7DQotaW1wb3J0IGphdmF4LnhtbC53cy5zb2FwLlNPQVBGYXVsdEV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07DQotDQotLyoqDQotICogVGhpcyBjbGFzcyB1c2VzIHRoZSBKQVgtV1MgRGlzcGF0Y2ggQVBJIHRvIHRlc3Qgc2VuZGluZyBhbmQgcmVjZWl2aW5nDQotICogbWVzc2FnZXMgdXNpbmcgU09BUCAxLjIuDQotICovDQotcHVibGljIGNsYXNzIFNPQVAxMkRpc3BhdGNoVGVzdCBleHRlbmRzIEFic3RyYWN0VGVzdENhc2Ugew0KLSAgICANCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUU5hbWUgUU5BTUVfU0VSVklDRSA9IG5ldyBRTmFtZSgNCi0gICAgICAgICAgICAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvdGVzdC9TT0FQMTIiLCAiU09BUDEyU2VydmljZSIpOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBRTmFtZSBRTkFNRV9QT1JUID0gbmV3IFFOYW1lKA0KLSAgICAgICAgICAgICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy90ZXN0L1NPQVAxMiIsICJTT0FQMTJQb3J0Iik7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVUkxfRU5EUE9JTlQgPSAiaHR0cDovL2xvY2FsaG9zdDo2MDYwL2F4aXMyL3NlcnZpY2VzL1NPQVAxMlByb3ZpZGVyU2VydmljZS5TT0FQMTJQcm92aWRlclBvcnQiOyAgICANCi0gICAgDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBzYW1wbGVSZXF1ZXN0ID0gDQotICAgICAgICAiPHRlc3Q6ZWNob1N0cmluZyB4bWxuczp0ZXN0PVwiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvdGVzdC9TT0FQMTJcIj4iICsNCi0gICAgICAgICI8dGVzdDppbnB1dD5TQU1QTEUgUkVRVUVTVCBNRVNTQUdFPC90ZXN0OmlucHV0PiIgKw0KLSAgICAgICAgIjwvdGVzdDplY2hvU3RyaW5nPiI7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBzYW1wbGVFbnZlbG9wZUhlYWQgPSANCi0gICAgICAgICI8c29hcGVudjpFbnZlbG9wZSB4bWxuczpzb2FwZW52PVwiaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlXCI+IiArDQotICAgICAgICAiPHNvYXBlbnY6SGVhZGVyIC8+PHNvYXBlbnY6Qm9keT4iOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgc2FtcGxlRW52ZWxvcGVIZWFkX011c3RVbmRlcnN0YW5kID0gDQotICAgICAgICAiPHNvYXBlbnY6RW52ZWxvcGUgeG1sbnM6c29hcGVudj1cImh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZVwiPiIgKw0KLSAgICAgICAgIjxzb2FwZW52OkhlYWRlcj4iICsNCi0gICAgICAgICI8c29hcGVudjpjb2RlSGVhZGVyU09BUDEyIHNvYXBlbnY6bXVzdFVuZGVyc3RhbmQ9XCJ0cnVlXCI+IiArDQotICAgICAgICAiPGNvZGU+ZGVmYXVsdDwvY29kZT4iICsNCi0gICAgICAgICI8L3NvYXBlbnY6Y29kZUhlYWRlclNPQVAxMj4iICsNCi0gICAgICAgICI8L3NvYXBlbnY6SGVhZGVyPiIgKw0KLSAgICAgICAgIjxzb2FwZW52OkJvZHk+IjsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHNhbXBsZUVudmVsb3BlVGFpbCA9IA0KLSAgICAgICAgIjwvc29hcGVudjpCb2R5Pjwvc29hcGVudjpFbnZlbG9wZT4iOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgc2FtcGxlRW52ZWxvcGUgPSANCi0gICAgICAgIHNhbXBsZUVudmVsb3BlSGVhZCArIA0KLSAgICAgICAgc2FtcGxlUmVxdWVzdCArIA0KLSAgICAgICAgc2FtcGxlRW52ZWxvcGVUYWlsOw0KLSAgICANCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHNhbXBsZUVudmVsb3BlX011c3RVbmRlcnN0YW5kID0gDQotICAgICAgICBzYW1wbGVFbnZlbG9wZUhlYWRfTXVzdFVuZGVyc3RhbmQgKyANCi0gICAgICAgIHNhbXBsZVJlcXVlc3QgKyANCi0gICAgICAgIHNhbXBsZUVudmVsb3BlVGFpbDsNCi0gICAgDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsNCi0gICAgICAgIHJldHVybiBnZXRUZXN0U2V0dXAobmV3IFRlc3RTdWl0ZShTT0FQMTJEaXNwYXRjaFRlc3QuY2xhc3MpKTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFRlc3Qgc2VuZGluZyBhIFNPQVAgMS4yIHJlcXVlc3QgaW4gUEFZTE9BRCBtb2RlDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U09BUDEyRGlzcGF0Y2hQYXlsb2FkTW9kZSgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgLy8gQ3JlYXRlIHRoZSBKQVgtV1MgY2xpZW50IG5lZWRlZCB0byBzZW5kIHRoZSByZXF1ZXN0DQotICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSBTZXJ2aWNlLmNyZWF0ZShRTkFNRV9TRVJWSUNFKTsNCi0gICAgICAgIHNlcnZpY2UuYWRkUG9ydChRTkFNRV9QT1JULCBTT0FQQmluZGluZy5TT0FQMTJIVFRQX0JJTkRJTkcsIFVSTF9FTkRQT0lOVCk7DQotICAgICAgICBEaXNwYXRjaDxTb3VyY2U+IGRpc3BhdGNoID0gc2VydmljZS5jcmVhdGVEaXNwYXRjaCgNCi0gICAgICAgICAgICAgICAgUU5BTUVfUE9SVCwgU291cmNlLmNsYXNzLCBNb2RlLlBBWUxPQUQpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBDcmVhdGUgdGhlIFNvdXJjZSBvYmplY3Qgd2l0aCB0aGUgcGF5bG9hZCBjb250ZW50cy4gIFNpbmNlDQotICAgICAgICAvLyB3ZSdyZSBpbiBQQVlMT0FEIG1vZGUsIHdlIGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgdGhlIGVudmVsb3BlLg0KLSAgICAgICAgYnl0ZVtdIGJ5dGVzID0gc2FtcGxlUmVxdWVzdC5nZXRCeXRlcygpOw0KLSAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmFpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlcyk7DQotICAgICAgICBTdHJlYW1Tb3VyY2UgcmVxdWVzdCA9IG5ldyBTdHJlYW1Tb3VyY2UoYmFpcyk7DQotICAgICAgICANCi0gICAgICAgIC8vIFNlbmQgdGhlIFNPQVAgMS4yIHJlcXVlc3QNCi0gICAgICAgIFNvdXJjZSByZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0NCi0gICAgICAgIGFzc2VydFRydWUoIlRoZSByZXNwb25zZSB3YXMgbnVsbC4gIFdlIGV4cGVjdGVkIGNvbnRlbnQgdG8gYmUgcmV0dXJuZWQuIiwgcmVzcG9uc2UgIT0gbnVsbCk7DQotICAgICAgICANCi0gICAgICAgIC8vIENvbnZlcnQgdGhlIHJlc3BvbnNlIHRvIGEgbW9yZSBjb25zdW1hYmxlIGZvcm1hdA0KLSAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7DQotICAgICAgICBTdHJlYW1SZXN1bHQgcmVzdWx0ID0gbmV3IFN0cmVhbVJlc3VsdChiYW9zKTsNCi0gICAgICAgIA0KLSAgICAgICAgVHJhbnNmb3JtZXJGYWN0b3J5IGZhY3RvcnkgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKTsNCi0gICAgICAgIFRyYW5zZm9ybWVyIHRyYW5zID0gZmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOw0KLSAgICAgICAgdHJhbnMudHJhbnNmb3JtKHJlc3BvbnNlLCByZXN1bHQpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIGNvbnRlbnRzIGFyZSBjb3JyZWN0LiAgQWdhaW4sIHNpbmNlIHdlJ3JlDQotICAgICAgICAvLyBpbiBQQVlMT0FEIG1vZGUsIHdlIHNob3VsZG4ndCBoYXZlIGFueXRoaW5nIHJlbGF0ZWQgdG8gdGhlIGVudmVsb3BlDQotICAgICAgICAvLyBpbiB0aGUgcmV0dXJuLCBqdXN0IHRoZSBjb250ZW50cyBvZiB0aGUgQm9keS4NCi0gICAgICAgIFN0cmluZyByZXNwb25zZVRleHQgPSBiYW9zLnRvU3RyaW5nKCk7DQotICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZVRleHQuY29udGFpbnMoInNvYXAiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZVRleHQuY29udGFpbnMoIkVudmVsb3BlIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSghcmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJCb2R5IikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZVRleHQuY29udGFpbnMoImVjaG9TdHJpbmdSZXNwb25zZSIpKTsgICANCi0gICAgICAgIA0KLSAgICAgICAgLy8gSW52b2tlIGEgc2Vjb25kIHRpbWUgdG8gdmVyaWZ5DQotICAgICAgICBiYWlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVzKTsNCi0gICAgICAgIHJlcXVlc3QgPSBuZXcgU3RyZWFtU291cmNlKGJhaXMpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBTZW5kIHRoZSBTT0FQIDEuMiByZXF1ZXN0DQotICAgICAgICByZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0NCi0gICAgICAgIGFzc2VydFRydWUoIlRoZSByZXNwb25zZSB3YXMgbnVsbC4gIFdlIGV4cGVjdGVkIGNvbnRlbnQgdG8gYmUgcmV0dXJuZWQuIiwgcmVzcG9uc2UgIT0gbnVsbCk7DQotICAgICAgICANCi0gICAgICAgIC8vIENvbnZlcnQgdGhlIHJlc3BvbnNlIHRvIGEgbW9yZSBjb25zdW1hYmxlIGZvcm1hdA0KLSAgICAgICAgYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsNCi0gICAgICAgIHJlc3VsdCA9IG5ldyBTdHJlYW1SZXN1bHQoYmFvcyk7DQotICAgICAgICANCi0gICAgICAgIGZhY3RvcnkgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKTsNCi0gICAgICAgIHRyYW5zID0gZmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOw0KLSAgICAgICAgdHJhbnMudHJhbnNmb3JtKHJlc3BvbnNlLCByZXN1bHQpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIGNvbnRlbnRzIGFyZSBjb3JyZWN0LiAgQWdhaW4sIHNpbmNlIHdlJ3JlDQotICAgICAgICAvLyBpbiBQQVlMT0FEIG1vZGUsIHdlIHNob3VsZG4ndCBoYXZlIGFueXRoaW5nIHJlbGF0ZWQgdG8gdGhlIGVudmVsb3BlDQotICAgICAgICAvLyBpbiB0aGUgcmV0dXJuLCBqdXN0IHRoZSBjb250ZW50cyBvZiB0aGUgQm9keS4NCi0gICAgICAgIHJlc3BvbnNlVGV4dCA9IGJhb3MudG9TdHJpbmcoKTsNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlVGV4dC5jb250YWlucygic29hcCIpKTsNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlVGV4dC5jb250YWlucygiRW52ZWxvcGUiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZVRleHQuY29udGFpbnMoIkJvZHkiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlVGV4dC5jb250YWlucygiZWNob1N0cmluZ1Jlc3BvbnNlIikpOyAgICANCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFRlc3Qgc2VuZGluZyBhIFNPQVAgMS4yIHJlcXVlc3QgaW4gUEFZTE9BRCBtb2RlIHVzaW5nIFNPQVAvSk1TDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U09BUDEySk1TRGlzcGF0Y2hQYXlsb2FkTW9kZSgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgLy8gQ3JlYXRlIHRoZSBKQVgtV1MgY2xpZW50IG5lZWRlZCB0byBzZW5kIHRoZSByZXF1ZXN0DQotICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSBTZXJ2aWNlLmNyZWF0ZShRTkFNRV9TRVJWSUNFKTsNCi0JCXNlcnZpY2UuYWRkUG9ydChRTkFNRV9QT1JULCBNRFFDb25zdGFudHMuU09BUDEySk1TX0JJTkRJTkcsIFVSTF9FTkRQT0lOVCk7DQotICAgICAgICBEaXNwYXRjaDxTb3VyY2U+IGRpc3BhdGNoID0gc2VydmljZS5jcmVhdGVEaXNwYXRjaCgNCi0gICAgICAgICAgICAgICAgUU5BTUVfUE9SVCwgU291cmNlLmNsYXNzLCBNb2RlLlBBWUxPQUQpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBDcmVhdGUgdGhlIFNvdXJjZSBvYmplY3Qgd2l0aCB0aGUgcGF5bG9hZCBjb250ZW50cy4gIFNpbmNlDQotICAgICAgICAvLyB3ZSdyZSBpbiBQQVlMT0FEIG1vZGUsIHdlIGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgdGhlIGVudmVsb3BlLg0KLSAgICAgICAgYnl0ZVtdIGJ5dGVzID0gc2FtcGxlUmVxdWVzdC5nZXRCeXRlcygpOw0KLSAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmFpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlcyk7DQotICAgICAgICBTdHJlYW1Tb3VyY2UgcmVxdWVzdCA9IG5ldyBTdHJlYW1Tb3VyY2UoYmFpcyk7DQotICAgICAgICANCi0gICAgICAgIC8vIFNlbmQgdGhlIFNPQVAgMS4yIHJlcXVlc3QNCi0gICAgICAgIFNvdXJjZSByZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0NCi0gICAgICAgIGFzc2VydFRydWUoIlRoZSByZXNwb25zZSB3YXMgbnVsbC4gIFdlIGV4cGVjdGVkIGNvbnRlbnQgdG8gYmUgcmV0dXJuZWQuIiwgcmVzcG9uc2UgIT0gbnVsbCk7DQotICAgICAgICANCi0gICAgICAgIC8vIENvbnZlcnQgdGhlIHJlc3BvbnNlIHRvIGEgbW9yZSBjb25zdW1hYmxlIGZvcm1hdA0KLSAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7DQotICAgICAgICBTdHJlYW1SZXN1bHQgcmVzdWx0ID0gbmV3IFN0cmVhbVJlc3VsdChiYW9zKTsNCi0gICAgICAgIA0KLSAgICAgICAgVHJhbnNmb3JtZXJGYWN0b3J5IGZhY3RvcnkgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKTsNCi0gICAgICAgIFRyYW5zZm9ybWVyIHRyYW5zID0gZmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOw0KLSAgICAgICAgdHJhbnMudHJhbnNmb3JtKHJlc3BvbnNlLCByZXN1bHQpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIGNvbnRlbnRzIGFyZSBjb3JyZWN0LiAgQWdhaW4sIHNpbmNlIHdlJ3JlDQotICAgICAgICAvLyBpbiBQQVlMT0FEIG1vZGUsIHdlIHNob3VsZG4ndCBoYXZlIGFueXRoaW5nIHJlbGF0ZWQgdG8gdGhlIGVudmVsb3BlDQotICAgICAgICAvLyBpbiB0aGUgcmV0dXJuLCBqdXN0IHRoZSBjb250ZW50cyBvZiB0aGUgQm9keS4NCi0gICAgICAgIFN0cmluZyByZXNwb25zZVRleHQgPSBiYW9zLnRvU3RyaW5nKCk7DQotICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZVRleHQuY29udGFpbnMoInNvYXAiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZVRleHQuY29udGFpbnMoIkVudmVsb3BlIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSghcmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJCb2R5IikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZVRleHQuY29udGFpbnMoImVjaG9TdHJpbmdSZXNwb25zZSIpKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gSW52b2tlIGEgc2Vjb25kIHRpbWUgdG8gdmVyaWZ5DQotICAgICAgICBiYWlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVzKTsNCi0gICAgICAgIHJlcXVlc3QgPSBuZXcgU3RyZWFtU291cmNlKGJhaXMpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBTZW5kIHRoZSBTT0FQIDEuMiByZXF1ZXN0DQotICAgICAgICByZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0NCi0gICAgICAgIGFzc2VydFRydWUoIlRoZSByZXNwb25zZSB3YXMgbnVsbC4gIFdlIGV4cGVjdGVkIGNvbnRlbnQgdG8gYmUgcmV0dXJuZWQuIiwgcmVzcG9uc2UgIT0gbnVsbCk7DQotICAgICAgICANCi0gICAgICAgIC8vIENvbnZlcnQgdGhlIHJlc3BvbnNlIHRvIGEgbW9yZSBjb25zdW1hYmxlIGZvcm1hdA0KLSAgICAgICAgYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsNCi0gICAgICAgIHJlc3VsdCA9IG5ldyBTdHJlYW1SZXN1bHQoYmFvcyk7DQotICAgICAgICANCi0gICAgICAgIGZhY3RvcnkgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKTsNCi0gICAgICAgIHRyYW5zID0gZmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOw0KLSAgICAgICAgdHJhbnMudHJhbnNmb3JtKHJlc3BvbnNlLCByZXN1bHQpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIGNvbnRlbnRzIGFyZSBjb3JyZWN0LiAgQWdhaW4sIHNpbmNlIHdlJ3JlDQotICAgICAgICAvLyBpbiBQQVlMT0FEIG1vZGUsIHdlIHNob3VsZG4ndCBoYXZlIGFueXRoaW5nIHJlbGF0ZWQgdG8gdGhlIGVudmVsb3BlDQotICAgICAgICAvLyBpbiB0aGUgcmV0dXJuLCBqdXN0IHRoZSBjb250ZW50cyBvZiB0aGUgQm9keS4NCi0gICAgICAgIHJlc3BvbnNlVGV4dCA9IGJhb3MudG9TdHJpbmcoKTsNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlVGV4dC5jb250YWlucygic29hcCIpKTsNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlVGV4dC5jb250YWlucygiRW52ZWxvcGUiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZVRleHQuY29udGFpbnMoIkJvZHkiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlVGV4dC5jb250YWlucygiZWNob1N0cmluZ1Jlc3BvbnNlIikpOw0KLQ0KLSAgICB9DQotICAgIA0KLQ0KLSAgICAvKioNCi0gICAgICogVGVzdCBzZW5kaW5nIGEgU09BUCAxLjIgcmVxdWVzdCBpbiBNRVNTQUdFIG1vZGUNCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RTT0FQMTJEaXNwYXRjaE1lc3NhZ2VNb2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICAvLyBDcmVhdGUgdGhlIEpBWC1XUyBjbGllbnQgbmVlZGVkIHRvIHNlbmQgdGhlIHJlcXVlc3QNCi0gICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IFNlcnZpY2UuY3JlYXRlKFFOQU1FX1NFUlZJQ0UpOw0KLSAgICAgICAgc2VydmljZS5hZGRQb3J0KFFOQU1FX1BPUlQsIFNPQVBCaW5kaW5nLlNPQVAxMkhUVFBfQklORElORywgVVJMX0VORFBPSU5UKTsNCi0gICAgICAgIERpc3BhdGNoPFNvdXJjZT4gZGlzcGF0Y2ggPSBzZXJ2aWNlLmNyZWF0ZURpc3BhdGNoKA0KLSAgICAgICAgICAgICAgICBRTkFNRV9QT1JULCBTb3VyY2UuY2xhc3MsIE1vZGUuTUVTU0FHRSk7DQotICAgICAgICANCi0gICAgICAgIC8vIENyZWF0ZSB0aGUgU291cmNlIG9iamVjdCB3aXRoIHRoZSBtZXNzYWdlIGNvbnRlbnRzLiAgU2luY2UNCi0gICAgICAgIC8vIHdlJ3JlIGluIE1FU1NBR0UgbW9kZSwgd2UnbGwgbmVlZCB0byBtYWtlIHN1cmUgd2UgY3JlYXRlIHRoaXMNCi0gICAgICAgIC8vIHdpdGggdGhlIHJpZ2h0IHByb3RvY29sLg0KLSAgICAgICAgYnl0ZVtdIGJ5dGVzID0gc2FtcGxlRW52ZWxvcGUuZ2V0Qnl0ZXMoKTsNCi0gICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGJhaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZXMpOw0KLSAgICAgICAgU3RyZWFtU291cmNlIHJlcXVlc3QgPSBuZXcgU3RyZWFtU291cmNlKGJhaXMpOw0KLSAgICAgICAgDQotICAgICAgICBTb3VyY2UgcmVzcG9uc2UgPSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7DQotICAgICAgICANCi0gICAgICAgIC8vIENvbnZlcnQgdGhlIHJlc3BvbnNlIHRvIGEgbW9yZSBjb25zdW1hYmxlIGZvcm1hdA0KLSAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7DQotICAgICAgICBTdHJlYW1SZXN1bHQgcmVzdWx0ID0gbmV3IFN0cmVhbVJlc3VsdChiYW9zKTsNCi0gICAgICAgIA0KLSAgICAgICAgVHJhbnNmb3JtZXJGYWN0b3J5IGZhY3RvcnkgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKTsNCi0gICAgICAgIFRyYW5zZm9ybWVyIHRyYW5zID0gZmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOw0KLSAgICAgICAgdHJhbnMudHJhbnNmb3JtKHJlc3BvbnNlLCByZXN1bHQpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIGNvbnRlbnRzIG9mIHRoZSBtZXNzYWdlIGFyZSBjb3JyZWN0DQotICAgICAgICBTdHJpbmcgcmVzcG9uc2VUZXh0ID0gYmFvcy50b1N0cmluZygpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZVRleHQuY29udGFpbnMoInNvYXAiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlVGV4dC5jb250YWlucygiQm9keSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJFbnZlbG9wZSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJlY2hvU3RyaW5nUmVzcG9uc2UiKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgbWVzc2FnZSByZXR1cm5lZCBoYWQgdGhlIHJpZ2h0IHByb3RvY29sIHZlcnNpb24NCi0gICAgICAgIC8vIFRPRE86IE5lZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IHdlIHNob3VsZCBiZSB1c2luZyB0aGUgaGFyZCANCi0gICAgICAgIC8vIGNvZGVkIFVSTHMgaGVyZSwgb3Igd2hldGhlciB3ZSBzaG91bGQgYmUgdXNpbmcgYSBjb25zdGFudCBmb3IgdGhlIA0KLSAgICAgICAgLy8gcHVycG9zZXMgb2YgdGhlIHRlc3QuDQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlVGV4dC5jb250YWlucygiaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSghcmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlIikpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBJbnZva2UgYSBzZWNvbmQgdGltZSB0byB2ZXJpZnkNCi0gICAgICAgIGJhaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZXMpOw0KLSAgICAgICAgcmVxdWVzdCA9IG5ldyBTdHJlYW1Tb3VyY2UoYmFpcyk7DQotICAgICAgICANCi0gICAgICAgIHJlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBDb252ZXJ0IHRoZSByZXNwb25zZSB0byBhIG1vcmUgY29uc3VtYWJsZSBmb3JtYXQNCi0gICAgICAgIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7DQotICAgICAgICByZXN1bHQgPSBuZXcgU3RyZWFtUmVzdWx0KGJhb3MpOw0KLSAgICAgICAgDQotICAgICAgICBmYWN0b3J5ID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7DQotICAgICAgICB0cmFucyA9IGZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsNCi0gICAgICAgIHRyYW5zLnRyYW5zZm9ybShyZXNwb25zZSwgcmVzdWx0KTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBjb250ZW50cyBvZiB0aGUgbWVzc2FnZSBhcmUgY29ycmVjdA0KLSAgICAgICAgcmVzcG9uc2VUZXh0ID0gYmFvcy50b1N0cmluZygpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZVRleHQuY29udGFpbnMoInNvYXAiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlVGV4dC5jb250YWlucygiQm9keSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJFbnZlbG9wZSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJlY2hvU3RyaW5nUmVzcG9uc2UiKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgbWVzc2FnZSByZXR1cm5lZCBoYWQgdGhlIHJpZ2h0IHByb3RvY29sIHZlcnNpb24NCi0gICAgICAgIC8vIFRPRE86IE5lZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IHdlIHNob3VsZCBiZSB1c2luZyB0aGUgaGFyZCANCi0gICAgICAgIC8vIGNvZGVkIFVSTHMgaGVyZSwgb3Igd2hldGhlciB3ZSBzaG91bGQgYmUgdXNpbmcgYSBjb25zdGFudCBmb3IgdGhlIA0KLSAgICAgICAgLy8gcHVycG9zZXMgb2YgdGhlIHRlc3QuDQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlVGV4dC5jb250YWlucygiaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSghcmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlIikpOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogVGVzdCBzZW5kaW5nIGEgU09BUCAxLjIgcmVxdWVzdCBpbiBNRVNTQUdFIG1vZGUNCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RTT0FQMTJEaXNwYXRjaE1lc3NhZ2VNb2RlX011c3RVbmRlcnN0YW5kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICAvLyBDcmVhdGUgdGhlIEpBWC1XUyBjbGllbnQgbmVlZGVkIHRvIHNlbmQgdGhlIHJlcXVlc3QNCi0gICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IFNlcnZpY2UuY3JlYXRlKFFOQU1FX1NFUlZJQ0UpOw0KLSAgICAgICAgc2VydmljZS5hZGRQb3J0KFFOQU1FX1BPUlQsIFNPQVBCaW5kaW5nLlNPQVAxMkhUVFBfQklORElORywgVVJMX0VORFBPSU5UKTsNCi0gICAgICAgIERpc3BhdGNoPFNvdXJjZT4gZGlzcGF0Y2ggPSBzZXJ2aWNlLmNyZWF0ZURpc3BhdGNoKA0KLSAgICAgICAgICAgICAgICBRTkFNRV9QT1JULCBTb3VyY2UuY2xhc3MsIE1vZGUuTUVTU0FHRSk7DQotICAgICAgICANCi0gICAgICAgIC8vIENyZWF0ZSB0aGUgU291cmNlIG9iamVjdCB3aXRoIHRoZSBtZXNzYWdlIGNvbnRlbnRzLiAgU2luY2UNCi0gICAgICAgIC8vIHdlJ3JlIGluIE1FU1NBR0UgbW9kZSwgd2UnbGwgbmVlZCB0byBtYWtlIHN1cmUgd2UgY3JlYXRlIHRoaXMNCi0gICAgICAgIC8vIHdpdGggdGhlIHJpZ2h0IHByb3RvY29sLg0KLSAgICAgICAgYnl0ZVtdIGJ5dGVzID0gc2FtcGxlRW52ZWxvcGVfTXVzdFVuZGVyc3RhbmQuZ2V0Qnl0ZXMoKTsNCi0gICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGJhaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZXMpOw0KLSAgICAgICAgU3RyZWFtU291cmNlIHJlcXVlc3QgPSBuZXcgU3RyZWFtU291cmNlKGJhaXMpOw0KLSAgICAgICAgDQotICAgICAgICBTT0FQRmF1bHRFeGNlcHRpb24gZSA9IG51bGw7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIFNvdXJjZSByZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0gICAgICAgIH0gY2F0Y2ggKFNPQVBGYXVsdEV4Y2VwdGlvbiBleCkgew0KLSAgICAgICAgICAgIGUgPSBleDsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgiV2Ugc2hvdWxkIGhhdmUgYW4gZXhjZXB0aW9uLCBidXQgbm9uZSB3YXMgdGhyb3duLiIsIGUpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJGYXVsdENvZGUgc2hvdWxkIGJlIFwiTXVzdFVuZGVyc3RhbmRcIiIsICJNdXN0VW5kZXJzdGFuZCIsIGUuZ2V0RmF1bHQoKS5nZXRGYXVsdENvZGVBc1FOYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBJbnZva2UgYSBzZWNvbmQgdGltZSB0byB2ZXJpZnkNCi0gICAgICAgIGJhaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZXMpOw0KLSAgICAgICAgcmVxdWVzdCA9IG5ldyBTdHJlYW1Tb3VyY2UoYmFpcyk7DQotICAgICAgICANCi0gICAgICAgIGUgPSBudWxsOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBTb3VyY2UgcmVzcG9uc2UgPSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7DQotICAgICAgICB9IGNhdGNoIChTT0FQRmF1bHRFeGNlcHRpb24gZXgpIHsNCi0gICAgICAgICAgICBlID0gZXg7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIGFzc2VydE5vdE51bGwoIldlIHNob3VsZCBoYXZlIGFuIGV4Y2VwdGlvbiwgYnV0IG5vbmUgd2FzIHRocm93bi4iLCBlKTsNCi0gICAgICAgIGFzc2VydEVxdWFscygiRmF1bHRDb2RlIHNob3VsZCBiZSBcIk11c3RVbmRlcnN0YW5kXCIiLCAiTXVzdFVuZGVyc3RhbmQiLCBlLmdldEZhdWx0KCkuZ2V0RmF1bHRDb2RlQXNRTmFtZSgpLmdldExvY2FsUGFydCgpKTsNCi0gICAgICAgIA0KLSAgICAgICAgDQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rpc3BhdGNoL1NPQVBNZXNzYWdlRGlzcGF0Y2hUZXN0cy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rpc3BhdGNoL1NPQVBNZXNzYWdlRGlzcGF0Y2hUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDJlMDg2Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kaXNwYXRjaC9TT0FQTWVzc2FnZURpc3BhdGNoVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRpc3BhdGNoOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5UZXN0TG9nZ2VyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmZyYW1ld29yay5BYnN0cmFjdFRlc3RDYXNlOw0KLQ0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOw0KLWltcG9ydCBqYXZheC54bWwuc29hcC5NZXNzYWdlRmFjdG9yeTsNCi1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUE1lc3NhZ2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5EaXNwYXRjaDsNCi1pbXBvcnQgamF2YXgueG1sLndzLlJlc3BvbnNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsNCi1pbXBvcnQgamF2YS5pby5GaWxlOw0KLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOw0KLQ0KLXB1YmxpYyBjbGFzcyBTT0FQTWVzc2FnZURpc3BhdGNoVGVzdHMgZXh0ZW5kcyBBYnN0cmFjdFRlc3RDYXNlIHsNCi0JcHJpdmF0ZSBTdHJpbmcgdXJsID0gImh0dHA6Ly9sb2NhbGhvc3Q6NjA2MC9heGlzMi9zZXJ2aWNlcy9Qcm94eURvY0xpdFdyYXBwZWRTZXJ2aWNlLkRvY0xpdFdyYXBwZWRQcm94eUltcGxQb3J0IjsNCi0JcHJpdmF0ZSBRTmFtZSBzZXJ2aWNlTmFtZSA9IG5ldyBRTmFtZSgNCi0JCQkiaHR0cDovL29yZy5hcGFjaGUuYXhpczIucHJveHkuZG9jbGl0d3JhcHBlZCIsICJQcm94eURvY0xpdFdyYXBwZWRTZXJ2aWNlIik7DQotCXByaXZhdGUgUU5hbWUgcG9ydE5hbWUgPSBuZXcgUU5hbWUoImh0dHA6Ly9vcmcuYXBhY2hlLmF4aXMyLnByb3h5LmRvY2xpdHdyYXBwZWQiLA0KLQkiUHJveHlEb2NMaXRXcmFwcGVkUG9ydCIpOw0KLQkNCi0JU3RyaW5nIG1lc3NhZ2VSZXNvdXJjZSA9ICJ0ZXN0LXJlc291cmNlcyIgKyBGaWxlLnNlcGFyYXRvciAgKyAieG1sIiArIEZpbGUuc2VwYXJhdG9yICsic29hcG1lc3NhZ2UueG1sIjsNCi0JDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsNCi0gICAgICAgIHJldHVybiBnZXRUZXN0U2V0dXAobmV3IFRlc3RTdWl0ZShTT0FQTWVzc2FnZURpc3BhdGNoVGVzdHMuY2xhc3MpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U09BUE1lc3NhZ2VTeW5jTWVzc2FnZU1vZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0NCi0gICAgICAgIFN0cmluZyBiYXNlZGlyID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJiYXNlZGlyIiwiLiIpKS5nZXRBYnNvbHV0ZVBhdGgoKTsNCi0gICAgICAgIFN0cmluZyBtZXNzYWdlUmVzb3VyY2UgPSBuZXcgRmlsZShiYXNlZGlyLCB0aGlzLm1lc3NhZ2VSZXNvdXJjZSkuZ2V0QWJzb2x1dGVQYXRoKCk7DQotDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygidGVzdDogIiArIGdldE5hbWUoKSk7DQotICAgICAgICAvL0luaXRpYWxpemUgdGhlIEpBWC1XUyBjbGllbnQgYXJ0aWZhY3RzDQotICAgICAgICBTZXJ2aWNlIHN2YyA9IFNlcnZpY2UuY3JlYXRlKHNlcnZpY2VOYW1lKTsNCi0gICAgICAgIHN2Yy5hZGRQb3J0KHBvcnROYW1lLCBudWxsLCB1cmwpOw0KLSAgICAgICAgRGlzcGF0Y2g8U09BUE1lc3NhZ2U+IGRpc3BhdGNoID0gc3ZjLmNyZWF0ZURpc3BhdGNoKHBvcnROYW1lLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPQVBNZXNzYWdlLmNsYXNzLCBTZXJ2aWNlLk1vZGUuTUVTU0FHRSk7DQotDQotICAgICAgICAvL0NyZWF0ZSBTT0FQTWVzc2FnZSBPYmplY3Qgbm8gYXR0YWNobWVudHMgaGVyZS4NCi0gICAgICAgIEZpbGVJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0obWVzc2FnZVJlc291cmNlKTsNCi0gICAgICAgIE1lc3NhZ2VGYWN0b3J5IGZhY3RvcnkgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpOw0KLSAgICAgICAgU09BUE1lc3NhZ2UgbXNnT2JqZWN0ID0gZmFjdG9yeS5jcmVhdGVNZXNzYWdlKG51bGwsIGlucHV0U3RyZWFtKTsNCi0NCi0gICAgICAgIC8vSW52b2tlIHRoZSBEaXNwYXRjaA0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEludm9raW5nIEFzeW5jIERpc3BhdGNoIik7DQotICAgICAgICBTT0FQTWVzc2FnZSByZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZShtc2dPYmplY3QpOw0KLQ0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgiZGlzcGF0Y2ggaW52b2tlIHJldHVybmVkIG51bGwiLCByZXNwb25zZSk7DQotICAgICAgICByZXNwb25zZS53cml0ZVRvKFN5c3RlbS5vdXQpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBJbnZva2UgYSBzZWNvbmQgdGltZSB0byB2ZXJpZnkNCi0gICAgICAgIC8vIEludm9rZSB0aGUgRGlzcGF0Y2gNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBJbnZva2luZyBBc3luYyBEaXNwYXRjaCIpOw0KLSAgICAgICAgcmVzcG9uc2UgPSBkaXNwYXRjaC5pbnZva2UobXNnT2JqZWN0KTsNCi0NCi0gICAgICAgIGFzc2VydE5vdE51bGwoImRpc3BhdGNoIGludm9rZSByZXR1cm5lZCBudWxsIiwgcmVzcG9uc2UpOw0KLSAgICAgICAgcmVzcG9uc2Uud3JpdGVUbyhTeXN0ZW0ub3V0KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U09BUE1lc3NhZ2VBc3luY0NhbGxiYWNrTWVzc2FnZU1vZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0NCi0gICAgICAgIFN0cmluZyBiYXNlZGlyID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJiYXNlZGlyIiwiLiIpKS5nZXRBYnNvbHV0ZVBhdGgoKTsNCi0gICAgICAgIFN0cmluZyBtZXNzYWdlUmVzb3VyY2UgPSBuZXcgRmlsZShiYXNlZGlyLCB0aGlzLm1lc3NhZ2VSZXNvdXJjZSkuZ2V0QWJzb2x1dGVQYXRoKCk7DQotDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygidGVzdDogIiArIGdldE5hbWUoKSk7DQotICAgICAgICAvL0luaXRpYWxpemUgdGhlIEpBWC1XUyBjbGllbnQgYXJ0aWZhY3RzDQotICAgICAgICBTZXJ2aWNlIHN2YyA9IFNlcnZpY2UuY3JlYXRlKHNlcnZpY2VOYW1lKTsNCi0gICAgICAgIHN2Yy5hZGRQb3J0KHBvcnROYW1lLCBudWxsLCB1cmwpOw0KLSAgICAgICAgRGlzcGF0Y2g8U09BUE1lc3NhZ2U+IGRpc3BhdGNoID0gc3ZjLmNyZWF0ZURpc3BhdGNoKHBvcnROYW1lLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPQVBNZXNzYWdlLmNsYXNzLCBTZXJ2aWNlLk1vZGUuTUVTU0FHRSk7DQotDQotICAgICAgICAvL0NyZWF0ZSBTT0FQTWVzc2FnZSBPYmplY3Qgbm8gYXR0YWNobWVudHMgaGVyZS4NCi0gICAgICAgIEZpbGVJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0obWVzc2FnZVJlc291cmNlKTsNCi0gICAgICAgIE1lc3NhZ2VGYWN0b3J5IGZhY3RvcnkgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpOw0KLSAgICAgICAgU09BUE1lc3NhZ2UgbXNnT2JqZWN0ID0gZmFjdG9yeS5jcmVhdGVNZXNzYWdlKG51bGwsIGlucHV0U3RyZWFtKTsNCi0NCi0gICAgICAgIEFzeW5jQ2FsbGJhY2s8U09BUE1lc3NhZ2U+IGFjID0gbmV3IEFzeW5jQ2FsbGJhY2s8U09BUE1lc3NhZ2U+KCk7DQotICAgICAgICAvL0ludm9rZSB0aGUgRGlzcGF0Y2gNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBJbnZva2luZyBzeW5jIERpc3BhdGNoIik7DQotICAgICAgICBGdXR1cmU8Pz4gbW9uaXRvciA9IGRpc3BhdGNoLmludm9rZUFzeW5jKG1zZ09iamVjdCwgYWMpOw0KLQ0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgiZGlzcGF0Y2ggaW52b2tlQXN5bmMgcmV0dXJuZWQgbnVsbCBGdXR1cmU8Pz4iLCBtb25pdG9yKTsNCi0gICAgICAgIHdoaWxlICghbW9uaXRvci5pc0RvbmUoKSkgew0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBBc3luYyBpbnZvY2F0aW9uIHN0aWxsIG5vdCBjb21wbGV0ZSIpOw0KLSAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFNPQVBNZXNzYWdlIHJlc3BvbnNlID0gYWMuZ2V0VmFsdWUoKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwoImRpc3BhdGNoIGludm9rZSByZXR1cm5lZCBudWxsIiwgcmVzcG9uc2UpOw0KLSAgICAgICAgcmVzcG9uc2Uud3JpdGVUbyhTeXN0ZW0ub3V0KTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gSW52b2tlIGEgc2Vjb25kIHRpbWUgdG8gdmVyaWZ5DQotICAgICAgICBhYyA9IG5ldyBBc3luY0NhbGxiYWNrPFNPQVBNZXNzYWdlPigpOw0KLSAgICAgICAgLy9JbnZva2UgdGhlIERpc3BhdGNoDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gSW52b2tpbmcgc3luYyBEaXNwYXRjaCIpOw0KLSAgICAgICAgbW9uaXRvciA9IGRpc3BhdGNoLmludm9rZUFzeW5jKG1zZ09iamVjdCwgYWMpOw0KLQ0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgiZGlzcGF0Y2ggaW52b2tlQXN5bmMgcmV0dXJuZWQgbnVsbCBGdXR1cmU8Pz4iLCBtb25pdG9yKTsNCi0gICAgICAgIHdoaWxlICghbW9uaXRvci5pc0RvbmUoKSkgew0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBBc3luYyBpbnZvY2F0aW9uIHN0aWxsIG5vdCBjb21wbGV0ZSIpOw0KLSAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJlc3BvbnNlID0gYWMuZ2V0VmFsdWUoKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwoImRpc3BhdGNoIGludm9rZSByZXR1cm5lZCBudWxsIiwgcmVzcG9uc2UpOw0KLSAgICAgICAgcmVzcG9uc2Uud3JpdGVUbyhTeXN0ZW0ub3V0KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U09BUE1lc3NhZ2VBc3luY1BvbGxpbmdNZXNzYWdlTW9kZSgpIHRocm93cyBFeGNlcHRpb24gew0KLQ0KLSAgICAgICAgU3RyaW5nIGJhc2VkaXIgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoImJhc2VkaXIiLCIuIikpLmdldEFic29sdXRlUGF0aCgpOw0KLSAgICAgICAgU3RyaW5nIG1lc3NhZ2VSZXNvdXJjZSA9IG5ldyBGaWxlKGJhc2VkaXIsIHRoaXMubWVzc2FnZVJlc291cmNlKS5nZXRBYnNvbHV0ZVBhdGgoKTsNCi0NCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJ0ZXN0OiAiICsgZ2V0TmFtZSgpKTsNCi0gICAgICAgIC8vSW5pdGlhbGl6ZSB0aGUgSkFYLVdTIGNsaWVudCBhcnRpZmFjdHMNCi0gICAgICAgIFNlcnZpY2Ugc3ZjID0gU2VydmljZS5jcmVhdGUoc2VydmljZU5hbWUpOw0KLSAgICAgICAgc3ZjLmFkZFBvcnQocG9ydE5hbWUsIG51bGwsIHVybCk7DQotICAgICAgICBEaXNwYXRjaDxTT0FQTWVzc2FnZT4gZGlzcGF0Y2ggPSBzdmMuY3JlYXRlRGlzcGF0Y2gocG9ydE5hbWUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09BUE1lc3NhZ2UuY2xhc3MsIFNlcnZpY2UuTW9kZS5NRVNTQUdFKTsNCi0NCi0gICAgICAgIC8vQ3JlYXRlIFNPQVBNZXNzYWdlIE9iamVjdCBubyBhdHRhY2htZW50cyBoZXJlLg0KLSAgICAgICAgRmlsZUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShtZXNzYWdlUmVzb3VyY2UpOw0KLSAgICAgICAgTWVzc2FnZUZhY3RvcnkgZmFjdG9yeSA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKCk7DQotICAgICAgICBTT0FQTWVzc2FnZSBtc2dPYmplY3QgPSBmYWN0b3J5LmNyZWF0ZU1lc3NhZ2UobnVsbCwgaW5wdXRTdHJlYW0pOw0KLQ0KLSAgICAgICAgLy9JbnZva2UgdGhlIERpc3BhdGNoDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gSW52b2tpbmcgc3luYyBEaXNwYXRjaCIpOw0KLSAgICAgICAgUmVzcG9uc2U8U09BUE1lc3NhZ2U+IGFzeW5jUmVzcG9uc2UgPSBkaXNwYXRjaC5pbnZva2VBc3luYyhtc2dPYmplY3QpOw0KLQ0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgiZGlzcGF0Y2ggaW52b2tlQXN5bmMgcmV0dXJuZWQgbnVsbCBSZXNwb25zZSIsIGFzeW5jUmVzcG9uc2UpOw0KLSAgICAgICAgd2hpbGUgKCFhc3luY1Jlc3BvbnNlLmlzRG9uZSgpKSB7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEFzeW5jIGludm9jYXRpb24gc3RpbGwgbm90IGNvbXBsZXRlIik7DQotICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDApOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgU09BUE1lc3NhZ2UgcmVzcG9uc2UgPSBhc3luY1Jlc3BvbnNlLmdldCgpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgiZGlzcGF0Y2ggaW52b2tlIHJldHVybmVkIG51bGwiLCByZXNwb25zZSk7DQotICAgICAgICByZXNwb25zZS53cml0ZVRvKFN5c3RlbS5vdXQpOw0KLSAgICAgICAgDQotICAgICAgICANCi0gICAgICAgIC8vIEludm9rZSBhIHNlY29uZCB0aW1lIHRvIHZlcmlmeQ0KLSAgICAgICAgLy8gSW52b2tlIHRoZSBEaXNwYXRjaA0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEludm9raW5nIHN5bmMgRGlzcGF0Y2giKTsNCi0gICAgICAgIGFzeW5jUmVzcG9uc2UgPSBkaXNwYXRjaC5pbnZva2VBc3luYyhtc2dPYmplY3QpOw0KLQ0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgiZGlzcGF0Y2ggaW52b2tlQXN5bmMgcmV0dXJuZWQgbnVsbCBSZXNwb25zZSIsIGFzeW5jUmVzcG9uc2UpOw0KLSAgICAgICAgd2hpbGUgKCFhc3luY1Jlc3BvbnNlLmlzRG9uZSgpKSB7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEFzeW5jIGludm9jYXRpb24gc3RpbGwgbm90IGNvbXBsZXRlIik7DQotICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDApOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmVzcG9uc2UgPSBhc3luY1Jlc3BvbnNlLmdldCgpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgiZGlzcGF0Y2ggaW52b2tlIHJldHVybmVkIG51bGwiLCByZXNwb25zZSk7DQotICAgICAgICByZXNwb25zZS53cml0ZVRvKFN5c3RlbS5vdXQpOw0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kaXNwYXRjaC9TdHJlYW1Tb3VyY2VEaXNwYXRjaFRlc3RzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGlzcGF0Y2gvU3RyZWFtU291cmNlRGlzcGF0Y2hUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWZhMWNlLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kaXNwYXRjaC9TdHJlYW1Tb3VyY2VEaXNwYXRjaFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OTEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kaXNwYXRjaDsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuVGVzdExvZ2dlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5mcmFtZXdvcmsuQWJzdHJhY3RUZXN0Q2FzZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLnV0aWwuUmVhZGVyMldyaXRlcjsNCi0NCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxJbnB1dEZhY3Rvcnk7DQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOw0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsNCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtU291cmNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuRGlzcGF0Y2g7DQotaW1wb3J0IGphdmF4LnhtbC53cy5SZXNwb25zZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlLk1vZGU7DQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07DQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07DQotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTsNCi0NCi0vKioNCi0gKiBUaGlzIGNsYXNzIHRlc3RzIHRoZSBKQVgtV1MgRGlzcGF0Y2g8U291cmNlPiBmdW5jdGlvbmFsaXR5IHdpdGggdmFyaW91cw0KLSAqIGZvcm1zIG9mIGEgU3RyZWFtU291cmNlIG9iamVjdC4gDQotICoNCi0gKi8NCi1wdWJsaWMgY2xhc3MgU3RyZWFtU291cmNlRGlzcGF0Y2hUZXN0cyBleHRlbmRzIEFic3RyYWN0VGVzdENhc2Ugew0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBYTUxJbnB1dEZhY3RvcnkgaW5wdXRGYWN0b3J5ID0gWE1MSW5wdXRGYWN0b3J5Lm5ld0luc3RhbmNlKCk7DQotICAgIA0KLSAgICANCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgew0KLSAgICAgICAgcmV0dXJuIGdldFRlc3RTZXR1cChuZXcgVGVzdFN1aXRlKFN0cmVhbVNvdXJjZURpc3BhdGNoVGVzdHMuY2xhc3MpKTsNCi0gICAgfQ0KLQ0KLQkvKioNCi0gICAgICogSW52b2tlIGEgRGlzcGF0Y2g8U291cmNlPiBzeW5jaHJvbm91c2x5IHdpdGggdGhlIGNvbnRlbnQgaW4gUEFZTE9BRCBtb2RlLg0KLQkgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdFN5bmNQYXlsb2FkTW9kZSgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoInRlc3Q6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBKQVgtV1MgY2xpZW50IGFydGlmYWN0cw0KLSAgICAgICAgU2VydmljZSBzdmMgPSBTZXJ2aWNlLmNyZWF0ZShEaXNwYXRjaFRlc3RDb25zdGFudHMuUU5BTUVfU0VSVklDRSk7DQotCQlzdmMuYWRkUG9ydChEaXNwYXRjaFRlc3RDb25zdGFudHMuUU5BTUVfUE9SVCwgbnVsbCwgRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlVSTCk7DQotCQlEaXNwYXRjaDxTb3VyY2U+IGRpc3BhdGNoID0gc3ZjLmNyZWF0ZURpc3BhdGNoKERpc3BhdGNoVGVzdENvbnN0YW50cy5RTkFNRV9QT1JULCBTb3VyY2UuY2xhc3MsIA0KLSAgICAgICAgICAgICAgICBTZXJ2aWNlLk1vZGUuUEFZTE9BRCk7DQotCQkNCi0gICAgICAgIC8vIENyZWF0ZSBhIFN0cmVhbVNvdXJjZSB3aXRoIHRoZSBkZXNpcmVkIGNvbnRlbnQNCi0gICAgICAgIGJ5dGVbXSBieXRlcyA9IERpc3BhdGNoVGVzdENvbnN0YW50cy5zYW1wbGVCb2R5Q29udGVudC5nZXRCeXRlcygpOw0KLSAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gc3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVzKTsNCi0gICAgICAgIFNvdXJjZSBzcmNTdHJlYW0gPSBuZXcgU3RyZWFtU291cmNlKChJbnB1dFN0cmVhbSkgc3RyZWFtKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gSW52b2tlIHRoZSBEaXNwYXRjaDxTb3VyY2U+DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gSW52b2tpbmcgc3luYyBEaXNwYXRjaCB3aXRoIFBBWUxPQUQgbW9kZSIpOw0KLQkJU291cmNlIHJlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlKHNyY1N0cmVhbSk7DQotCQlhc3NlcnROb3ROdWxsKHJlc3BvbnNlKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gUHJlcGFyZSB0aGUgcmVzcG9uc2UgY29udGVudCBmb3IgY2hlY2tpbmcNCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlciByZWFkZXIgPSBpbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKHJlc3BvbnNlKTsNCi0gICAgICAgIFJlYWRlcjJXcml0ZXIgcjJ3ID0gbmV3IFJlYWRlcjJXcml0ZXIocmVhZGVyKTsNCi0gICAgICAgIFN0cmluZyByZXNwb25zZVRleHQgPSByMncuZ2V0QXNTdHJpbmcoKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKHJlc3BvbnNlVGV4dCk7DQotICAgICAgICANCi0gICAgICAgIC8vIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgY29udGVudCBpcyBjb3JyZWN0DQotICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZVRleHQuY29udGFpbnMoInNvYXAiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZVRleHQuY29udGFpbnMoIkVudmVsb3BlIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSghcmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJCb2R5IikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZVRleHQuY29udGFpbnMoImVjaG9TdHJpbmdSZXNwb25zZSIpKTsgICAgIA0KLQ0KLSAgICAgICAgLy8gSW52b2tlIGEgc2Vjb25kIHRpbWUgdG8gdmVyaWZ5DQotICAgICAgICBzdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZXMpOw0KLSAgICAgICAgc3JjU3RyZWFtID0gbmV3IFN0cmVhbVNvdXJjZSgoSW5wdXRTdHJlYW0pIHN0cmVhbSk7DQotICAgICAgICANCi0gICAgICAgIC8vIEludm9rZSB0aGUgRGlzcGF0Y2g8U291cmNlPg0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEludm9raW5nIHN5bmMgRGlzcGF0Y2ggd2l0aCBQQVlMT0FEIG1vZGUiKTsNCi0gICAgICAgIHJlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlKHNyY1N0cmVhbSk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3BvbnNlKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gUHJlcGFyZSB0aGUgcmVzcG9uc2UgY29udGVudCBmb3IgY2hlY2tpbmcNCi0gICAgICAgIHJlYWRlciA9IGlucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIocmVzcG9uc2UpOw0KLSAgICAgICAgcjJ3ID0gbmV3IFJlYWRlcjJXcml0ZXIocmVhZGVyKTsNCi0gICAgICAgIHJlc3BvbnNlVGV4dCA9IHIydy5nZXRBc1N0cmluZygpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcocmVzcG9uc2VUZXh0KTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBjb250ZW50IGlzIGNvcnJlY3QNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlVGV4dC5jb250YWlucygic29hcCIpKTsNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlVGV4dC5jb250YWlucygiRW52ZWxvcGUiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZVRleHQuY29udGFpbnMoIkJvZHkiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlVGV4dC5jb250YWlucygiZWNob1N0cmluZ1Jlc3BvbnNlIikpOyAgICAgICANCi0JfQ0KLQ0KLSAgICAvKioNCi0gICAgICogSW52b2tlIGEgRGlzcGF0Y2g8U291cmNlPiBzeW5jaHJvbm91c2x5IHdpdGggdGhlIGNvbnRlbnQgaW4gTUVTU0FHRSBtb2RlLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdFN5bmNNZXNzYWdlTW9kZSgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoInRlc3Q6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBKQVgtV1MgY2xpZW50IGFydGlmYWN0cw0KLQkJU2VydmljZSBzdmMgPSBTZXJ2aWNlLmNyZWF0ZShEaXNwYXRjaFRlc3RDb25zdGFudHMuUU5BTUVfU0VSVklDRSk7DQotCQlzdmMuYWRkUG9ydChEaXNwYXRjaFRlc3RDb25zdGFudHMuUU5BTUVfUE9SVCwgbnVsbCwgRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlVSTCk7DQotCQlEaXNwYXRjaDxTb3VyY2U+IGRpc3BhdGNoID0gc3ZjLmNyZWF0ZURpc3BhdGNoKERpc3BhdGNoVGVzdENvbnN0YW50cy5RTkFNRV9QT1JULCBTb3VyY2UuY2xhc3MsDQotCQkJCU1vZGUuTUVTU0FHRSk7DQotCQkNCi0JCS8vIENyZWF0ZSBhIFN0cmVhbVNvdXJjZSB3aXRoIHRoZSBkZXNpcmVkIGNvbnRlbnQNCi0gICAgICAgIGJ5dGVbXSBieXRlcyA9IERpc3BhdGNoVGVzdENvbnN0YW50cy5zYW1wbGVTb2FwTWVzc2FnZS5nZXRCeXRlcygpOw0KLSAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gc3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVzKTsNCi0gICAgICAgIFNvdXJjZSBzcmNTdHJlYW0gPSBuZXcgU3RyZWFtU291cmNlKChJbnB1dFN0cmVhbSkgc3RyZWFtKTsNCi0NCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBJbnZva2luZyBzeW5jIERpc3BhdGNoIHdpdGggTUVTU0FHRSBNb2RlIik7DQotCQlTdHJlYW1Tb3VyY2UgcmVzcG9uc2UgPSAoU3RyZWFtU291cmNlKSBkaXNwYXRjaC5pbnZva2Uoc3JjU3RyZWFtKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwocmVzcG9uc2UpOw0KLQ0KLSAgICAgICAgLy8gUHJlcGFyZSB0aGUgcmVzcG9uc2UgY29udGVudCBmb3IgY2hlY2tpbmcNCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlciByZWFkZXIgPSBpbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKHJlc3BvbnNlKTsNCi0gICAgICAgIFJlYWRlcjJXcml0ZXIgcjJ3ID0gbmV3IFJlYWRlcjJXcml0ZXIocmVhZGVyKTsNCi0gICAgICAgIFN0cmluZyByZXNwb25zZVRleHQgPSByMncuZ2V0QXNTdHJpbmcoKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKHJlc3BvbnNlVGV4dCk7DQotICAgICAgICANCi0gICAgICAgIC8vIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgY29udGVudCBpcyBjb3JyZWN0DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlVGV4dC5jb250YWlucygic29hcCIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJFbnZlbG9wZSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJCb2R5IikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZVRleHQuY29udGFpbnMoImVjaG9TdHJpbmdSZXNwb25zZSIpKTsgIA0KLSAgICAgICAgDQotICAgICAgICAvLyBJbnZva2UgYSBzZWNvbmQgdGltZSB0byB2ZXJpZnkNCi0gICAgICAgIHN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlcyk7DQotICAgICAgICBzcmNTdHJlYW0gPSBuZXcgU3RyZWFtU291cmNlKChJbnB1dFN0cmVhbSkgc3RyZWFtKTsNCi0NCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBJbnZva2luZyBzeW5jIERpc3BhdGNoIHdpdGggTUVTU0FHRSBNb2RlIik7DQotICAgICAgICByZXNwb25zZSA9IChTdHJlYW1Tb3VyY2UpIGRpc3BhdGNoLmludm9rZShzcmNTdHJlYW0pOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXNwb25zZSk7DQotDQotICAgICAgICAvLyBQcmVwYXJlIHRoZSByZXNwb25zZSBjb250ZW50IGZvciBjaGVja2luZw0KLSAgICAgICAgcmVhZGVyID0gaW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihyZXNwb25zZSk7DQotICAgICAgICByMncgPSBuZXcgUmVhZGVyMldyaXRlcihyZWFkZXIpOw0KLSAgICAgICAgcmVzcG9uc2VUZXh0ID0gcjJ3LmdldEFzU3RyaW5nKCk7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZyhyZXNwb25zZVRleHQpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIGNvbnRlbnQgaXMgY29ycmVjdA0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZVRleHQuY29udGFpbnMoInNvYXAiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlVGV4dC5jb250YWlucygiRW52ZWxvcGUiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlVGV4dC5jb250YWlucygiQm9keSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJlY2hvU3RyaW5nUmVzcG9uc2UiKSk7ICANCi0JfQ0KLQ0KLSAgICAvKioNCi0gICAgICogSW52b2tlIGEgRGlzcGF0Y2g8U291cmNlPiBhc3luY2hyb25vdXNseSB3aXRoIHRoZSBjb250ZW50IGluIFBBWUxPQUQgbW9kZS4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RBc3luY0NhbGxiYWNrUGF5bG9hZE1vZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJ0ZXN0OiAiICsgZ2V0TmFtZSgpKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgSkFYLVdTIGNsaWVudCBhcnRpZmFjdHMNCi0gICAgICAgIFNlcnZpY2Ugc3ZjID0gU2VydmljZS5jcmVhdGUoRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlFOQU1FX1NFUlZJQ0UpOw0KLSAgICAgICAgc3ZjLmFkZFBvcnQoRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlFOQU1FX1BPUlQsIG51bGwsIERpc3BhdGNoVGVzdENvbnN0YW50cy5VUkwpOw0KLSAgICAgICAgRGlzcGF0Y2g8U291cmNlPiBkaXNwYXRjaCA9IHN2Yy5jcmVhdGVEaXNwYXRjaChEaXNwYXRjaFRlc3RDb25zdGFudHMuUU5BTUVfUE9SVCwgU291cmNlLmNsYXNzLA0KLSAgICAgICAgICAgICAgICBTZXJ2aWNlLk1vZGUuUEFZTE9BRCk7DQotICAgICAgICANCi0gICAgICAgIC8vIFdlJ2xsIG5lZWQgYSBjYWxsYmFjayBpbnN0YW5jZSB0byBoYW5kbGUgdGhlIGFzeW5jIHJlc3BvbnNlcw0KLSAgICAgICAgQXN5bmNDYWxsYmFjazxTb3VyY2U+IGNhbGxiYWNrSGFuZGxlciA9IG5ldyBBc3luY0NhbGxiYWNrPFNvdXJjZT4oKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQ3JlYXRlIGEgU3RyZWFtU291cmNlIHdpdGggdGhlIGRlc2lyZWQgY29udGVudA0KLSAgICAgICAgYnl0ZVtdIGJ5dGVzID0gRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLnNhbXBsZUJvZHlDb250ZW50LmdldEJ5dGVzKCk7DQotICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBzdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZXMpOw0KLSAgICAgICAgU291cmNlIHNyY1N0cmVhbSA9IG5ldyBTdHJlYW1Tb3VyY2UoKElucHV0U3RyZWFtKSBzdHJlYW0pOw0KLQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEludm9raW5nIGFzeW5jIChjYWxsYmFjaykgRGlzcGF0Y2ggd2l0aCBQQVlMT0FEIG1vZGUiKTsNCi0gICAgICAgIEZ1dHVyZTw/PiBtb25pdG9yID0gZGlzcGF0Y2guaW52b2tlQXN5bmMoc3JjU3RyZWFtLCBjYWxsYmFja0hhbmRsZXIpOw0KLQ0KLSAgICAgICAgLy8gV2FpdCBmb3IgdGhlIGFzeW5jIHJlc3BvbnNlIHRvIGJlIHJldHVybmVkDQotICAgICAgICB3aGlsZSAoIW1vbml0b3IuaXNEb25lKCkpIHsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gQXN5bmMgaW52b2NhdGlvbiBzdGlsbCBub3QgY29tcGxldGUiKTsNCi0gICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIFNvdXJjZSByZXNwb25zZSA9IGNhbGxiYWNrSGFuZGxlci5nZXRWYWx1ZSgpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXNwb25zZSk7DQotICAgICAgICANCi0gICAgICAgIC8vIFByZXBhcmUgdGhlIHJlc3BvbnNlIGNvbnRlbnQgZm9yIGNoZWNraW5nDQotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyID0gaW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihyZXNwb25zZSk7DQotICAgICAgICBSZWFkZXIyV3JpdGVyIHIydyA9IG5ldyBSZWFkZXIyV3JpdGVyKHJlYWRlcik7DQotICAgICAgICBTdHJpbmcgcmVzcG9uc2VUZXh0ID0gcjJ3LmdldEFzU3RyaW5nKCk7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZyhyZXNwb25zZVRleHQpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIGNvbnRlbnQgaXMgY29ycmVjdA0KLSAgICAgICAgYXNzZXJ0VHJ1ZSghcmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJzb2FwIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSghcmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJFbnZlbG9wZSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlVGV4dC5jb250YWlucygiQm9keSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJlY2hvU3RyaW5nUmVzcG9uc2UiKSk7DQotICAgICAgICANCi0gICAgICAgIA0KLSAgICAgICAgLy8gSW52b2tlIGEgc2Vjb25kIHRpbWUgdG8gdmVyaWZ5DQotICAgICAgICBzdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZXMpOw0KLSAgICAgICAgc3JjU3RyZWFtID0gbmV3IFN0cmVhbVNvdXJjZSgoSW5wdXRTdHJlYW0pIHN0cmVhbSk7DQotDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gSW52b2tpbmcgYXN5bmMgKGNhbGxiYWNrKSBEaXNwYXRjaCB3aXRoIFBBWUxPQUQgbW9kZSIpOw0KLSAgICAgICAgbW9uaXRvciA9IGRpc3BhdGNoLmludm9rZUFzeW5jKHNyY1N0cmVhbSwgY2FsbGJhY2tIYW5kbGVyKTsNCi0NCi0gICAgICAgIC8vIFdhaXQgZm9yIHRoZSBhc3luYyByZXNwb25zZSB0byBiZSByZXR1cm5lZA0KLSAgICAgICAgd2hpbGUgKCFtb25pdG9yLmlzRG9uZSgpKSB7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEFzeW5jIGludm9jYXRpb24gc3RpbGwgbm90IGNvbXBsZXRlIik7DQotICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDApOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICByZXNwb25zZSA9IGNhbGxiYWNrSGFuZGxlci5nZXRWYWx1ZSgpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXNwb25zZSk7DQotICAgICAgICANCi0gICAgICAgIC8vIFByZXBhcmUgdGhlIHJlc3BvbnNlIGNvbnRlbnQgZm9yIGNoZWNraW5nDQotICAgICAgICByZWFkZXIgPSBpbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKHJlc3BvbnNlKTsNCi0gICAgICAgIHIydyA9IG5ldyBSZWFkZXIyV3JpdGVyKHJlYWRlcik7DQotICAgICAgICByZXNwb25zZVRleHQgPSByMncuZ2V0QXNTdHJpbmcoKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKHJlc3BvbnNlVGV4dCk7DQotICAgICAgICANCi0gICAgICAgIC8vIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgY29udGVudCBpcyBjb3JyZWN0DQotICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZVRleHQuY29udGFpbnMoInNvYXAiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZVRleHQuY29udGFpbnMoIkVudmVsb3BlIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSghcmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJCb2R5IikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZVRleHQuY29udGFpbnMoImVjaG9TdHJpbmdSZXNwb25zZSIpKTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIEludm9rZSBhIERpc3BhdGNoPFNvdXJjZT4gYXN5bmNocm9ub3VzbHkgd2l0aCB0aGUgY29udGVudCBpbiBNRVNTQUdFIG1vZGUuDQotICAgICAqLw0KLQlwdWJsaWMgdm9pZCB0ZXN0QXN5bmNDYWxsYmFja01lc3NhZ2VNb2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygidGVzdDogIiArIGdldE5hbWUoKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIEluaXRpYWxpemUgdGhlIEpBWC1XUyBjbGllbnQgYXJ0aWZhY3RzIA0KLSAgICAgICAgU2VydmljZSBzdmMgPSBTZXJ2aWNlLmNyZWF0ZShEaXNwYXRjaFRlc3RDb25zdGFudHMuUU5BTUVfU0VSVklDRSk7DQotCQlzdmMuYWRkUG9ydChEaXNwYXRjaFRlc3RDb25zdGFudHMuUU5BTUVfUE9SVCwgbnVsbCwgRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlVSTCk7DQotICAgICAgICBEaXNwYXRjaDxTb3VyY2U+IGRpc3BhdGNoID0gc3ZjLmNyZWF0ZURpc3BhdGNoKERpc3BhdGNoVGVzdENvbnN0YW50cy5RTkFNRV9QT1JULCBTb3VyY2UuY2xhc3MsDQotICAgICAgICAgICAgICAgIE1vZGUuTUVTU0FHRSk7DQotICAgICAgICANCi0gICAgICAgIC8vIFdlJ2xsIG5lZWQgYSBjYWxsYmFjayBpbnN0YW5jZSB0byBoYW5kbGUgdGhlIGFzeW5jIHJlc3BvbnNlcw0KLSAgICAgICAgQXN5bmNDYWxsYmFjazxTb3VyY2U+IGNhbGxiYWNrSGFuZGxlciA9IG5ldyBBc3luY0NhbGxiYWNrPFNvdXJjZT4oKTsNCi0NCi0gICAgICAgIC8vIENyZWF0ZSBhIFN0cmVhbVNvdXJjZSB3aXRoIHRoZSBkZXNpcmVkIGNvbnRlbnQNCi0gICAgICAgIGJ5dGVbXSBieXRlcyA9IERpc3BhdGNoVGVzdENvbnN0YW50cy5zYW1wbGVTb2FwTWVzc2FnZS5nZXRCeXRlcygpOw0KLSAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gc3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVzKTsNCi0JCVNvdXJjZSBzcmNTdHJlYW0gPSBuZXcgU3RyZWFtU291cmNlKChJbnB1dFN0cmVhbSkgc3RyZWFtKTsNCi0NCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBJbnZva2luZyBhc3luYyAoY2FsbGJhY2spIERpc3BhdGNoIHdpdGggTUVTU0FHRSBtb2RlIik7DQotICAgICAgICBGdXR1cmU8Pz4gbW9uaXRvciA9IGRpc3BhdGNoLmludm9rZUFzeW5jKHNyY1N0cmVhbSwgY2FsbGJhY2tIYW5kbGVyKTsNCi0NCi0gICAgICAgIC8vIFdhaXQgZm9yIHRoZSBhc3luYyByZXNwb25zZSB0byBiZSByZXR1cm5lZA0KLSAgICAgICAgd2hpbGUgKCFtb25pdG9yLmlzRG9uZSgpKSB7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEFzeW5jIGludm9jYXRpb24gc3RpbGwgbm90IGNvbXBsZXRlIik7DQotICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDApOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICBTb3VyY2UgcmVzcG9uc2UgPSBjYWxsYmFja0hhbmRsZXIuZ2V0VmFsdWUoKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwocmVzcG9uc2UpOw0KLQ0KLSAgICAgICAgLy8gUHJlcGFyZSB0aGUgcmVzcG9uc2UgY29udGVudCBmb3IgY2hlY2tpbmcNCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlciByZWFkZXIgPSBpbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKHJlc3BvbnNlKTsNCi0gICAgICAgIFJlYWRlcjJXcml0ZXIgcjJ3ID0gbmV3IFJlYWRlcjJXcml0ZXIocmVhZGVyKTsNCi0gICAgICAgIFN0cmluZyByZXNwb25zZVRleHQgPSByMncuZ2V0QXNTdHJpbmcoKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKHJlc3BvbnNlVGV4dCk7DQotICAgICAgICANCi0gICAgICAgIC8vIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgY29udGVudCBpcyBjb3JyZWN0DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlVGV4dC5jb250YWlucygic29hcCIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJFbnZlbG9wZSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJCb2R5IikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZVRleHQuY29udGFpbnMoImVjaG9TdHJpbmdSZXNwb25zZSIpKTsNCi0gICAgICAgIA0KLSAgICAgICAgDQotICAgICAgICAvLyBJbnZva2UgYSBzZWNvbmQgdGltZSB0byB2ZXJpZnkNCi0gICAgICAgIC8vIFdlJ2xsIG5lZWQgYSBjYWxsYmFjayBpbnN0YW5jZSB0byBoYW5kbGUgdGhlIGFzeW5jIHJlc3BvbnNlcw0KLSAgICAgICAgY2FsbGJhY2tIYW5kbGVyID0gbmV3IEFzeW5jQ2FsbGJhY2s8U291cmNlPigpOw0KLQ0KLSAgICAgICAgLy8gQ3JlYXRlIGEgU3RyZWFtU291cmNlIHdpdGggdGhlIGRlc2lyZWQgY29udGVudA0KLSAgICAgICAgYnl0ZXMgPSBEaXNwYXRjaFRlc3RDb25zdGFudHMuc2FtcGxlU29hcE1lc3NhZ2UuZ2V0Qnl0ZXMoKTsNCi0gICAgICAgIHN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlcyk7DQotICAgICAgICBzcmNTdHJlYW0gPSBuZXcgU3RyZWFtU291cmNlKChJbnB1dFN0cmVhbSkgc3RyZWFtKTsNCi0NCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBJbnZva2luZyBhc3luYyAoY2FsbGJhY2spIERpc3BhdGNoIHdpdGggTUVTU0FHRSBtb2RlIik7DQotICAgICAgICBtb25pdG9yID0gZGlzcGF0Y2guaW52b2tlQXN5bmMoc3JjU3RyZWFtLCBjYWxsYmFja0hhbmRsZXIpOw0KLQ0KLSAgICAgICAgLy8gV2FpdCBmb3IgdGhlIGFzeW5jIHJlc3BvbnNlIHRvIGJlIHJldHVybmVkDQotICAgICAgICB3aGlsZSAoIW1vbml0b3IuaXNEb25lKCkpIHsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gQXN5bmMgaW52b2NhdGlvbiBzdGlsbCBub3QgY29tcGxldGUiKTsNCi0gICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIHJlc3BvbnNlID0gY2FsbGJhY2tIYW5kbGVyLmdldFZhbHVlKCk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3BvbnNlKTsNCi0NCi0gICAgICAgIC8vIFByZXBhcmUgdGhlIHJlc3BvbnNlIGNvbnRlbnQgZm9yIGNoZWNraW5nDQotICAgICAgICByZWFkZXIgPSBpbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKHJlc3BvbnNlKTsNCi0gICAgICAgIHIydyA9IG5ldyBSZWFkZXIyV3JpdGVyKHJlYWRlcik7DQotICAgICAgICByZXNwb25zZVRleHQgPSByMncuZ2V0QXNTdHJpbmcoKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKHJlc3BvbnNlVGV4dCk7DQotICAgICAgICANCi0gICAgICAgIC8vIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgY29udGVudCBpcyBjb3JyZWN0DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlVGV4dC5jb250YWlucygic29hcCIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJFbnZlbG9wZSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJCb2R5IikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZVRleHQuY29udGFpbnMoImVjaG9TdHJpbmdSZXNwb25zZSIpKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogSW52b2tlIGEgRGlzcGF0Y2g8U291cmNlPiBhc3luY2hyb25vdXNseSB3aXRoIHRoZSBjb250ZW50IGluIFBBWUxPQUQgbW9kZS4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RBc3luY1BvbGxpbmdQYXlsb2FkTW9kZSgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoInRlc3Q6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBKQVgtV1MgY2xpZW50IGFydGlmYWN0cw0KLSAgICAgICAgU2VydmljZSBzdmMgPSBTZXJ2aWNlLmNyZWF0ZShEaXNwYXRjaFRlc3RDb25zdGFudHMuUU5BTUVfU0VSVklDRSk7DQotICAgICAgICBzdmMuYWRkUG9ydChEaXNwYXRjaFRlc3RDb25zdGFudHMuUU5BTUVfUE9SVCwgbnVsbCwgRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlVSTCk7DQotICAgICAgICBEaXNwYXRjaDxTb3VyY2U+IGRpc3BhdGNoID0gc3ZjLmNyZWF0ZURpc3BhdGNoKERpc3BhdGNoVGVzdENvbnN0YW50cy5RTkFNRV9QT1JULCBTb3VyY2UuY2xhc3MsDQotICAgICAgICAgICAgICAgIFNlcnZpY2UuTW9kZS5QQVlMT0FEKTsNCi0gICAgICAgIC8vIENyZWF0ZSBhIFN0cmVhbVNvdXJjZSB3aXRoIHRoZSBkZXNpcmVkIGNvbnRlbnQNCi0gICAgICAgIGJ5dGVbXSBieXRlcyA9IERpc3BhdGNoVGVzdENvbnN0YW50cy5zYW1wbGVCb2R5Q29udGVudC5nZXRCeXRlcygpOw0KLSAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gc3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVzKTsNCi0gICAgICAgIFNvdXJjZSBzcmNTdHJlYW0gPSBuZXcgU3RyZWFtU291cmNlKChJbnB1dFN0cmVhbSkgc3RyZWFtKTsNCi0NCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBJbnZva2luZyBhc3luYyAoY2FsbGJhY2spIERpc3BhdGNoIHdpdGggUEFZTE9BRCBtb2RlIik7DQotICAgICAgICBSZXNwb25zZTxTb3VyY2U+IGFzeW5jUmVzcG9uc2UgPSBkaXNwYXRjaC5pbnZva2VBc3luYyhzcmNTdHJlYW0pOw0KLQ0KLSAgICAgICAgLy8gV2FpdCBmb3IgdGhlIGFzeW5jIHJlc3BvbnNlIHRvIGJlIHJldHVybmVkDQotICAgICAgICB3aGlsZSAoIWFzeW5jUmVzcG9uc2UuaXNEb25lKCkpIHsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gQXN5bmMgaW52b2NhdGlvbiBzdGlsbCBub3QgY29tcGxldGUiKTsNCi0gICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIFNvdXJjZSByZXNwb25zZSA9IGFzeW5jUmVzcG9uc2UuZ2V0KCk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3BvbnNlKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gUHJlcGFyZSB0aGUgcmVzcG9uc2UgY29udGVudCBmb3IgY2hlY2tpbmcNCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlciByZWFkZXIgPSBpbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKHJlc3BvbnNlKTsNCi0gICAgICAgIFJlYWRlcjJXcml0ZXIgcjJ3ID0gbmV3IFJlYWRlcjJXcml0ZXIocmVhZGVyKTsNCi0gICAgICAgIFN0cmluZyByZXNwb25zZVRleHQgPSByMncuZ2V0QXNTdHJpbmcoKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKHJlc3BvbnNlVGV4dCk7DQotICAgICAgICANCi0gICAgICAgIC8vIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgY29udGVudCBpcyBjb3JyZWN0DQotICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZVRleHQuY29udGFpbnMoInNvYXAiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZVRleHQuY29udGFpbnMoIkVudmVsb3BlIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSghcmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJCb2R5IikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZVRleHQuY29udGFpbnMoImVjaG9TdHJpbmdSZXNwb25zZSIpKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gSW52b2tlIGEgc2Vjb25kIHRpbWUgdG8gdmVyaWZ5DQotICAgICAgICBzdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZXMpOw0KLSAgICAgICAgc3JjU3RyZWFtID0gbmV3IFN0cmVhbVNvdXJjZSgoSW5wdXRTdHJlYW0pIHN0cmVhbSk7DQotDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gSW52b2tpbmcgYXN5bmMgKGNhbGxiYWNrKSBEaXNwYXRjaCB3aXRoIFBBWUxPQUQgbW9kZSIpOw0KLSAgICAgICAgYXN5bmNSZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZUFzeW5jKHNyY1N0cmVhbSk7DQotDQotICAgICAgICAvLyBXYWl0IGZvciB0aGUgYXN5bmMgcmVzcG9uc2UgdG8gYmUgcmV0dXJuZWQNCi0gICAgICAgIHdoaWxlICghYXN5bmNSZXNwb25zZS5pc0RvbmUoKSkgew0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBBc3luYyBpbnZvY2F0aW9uIHN0aWxsIG5vdCBjb21wbGV0ZSIpOw0KLSAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgcmVzcG9uc2UgPSBhc3luY1Jlc3BvbnNlLmdldCgpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXNwb25zZSk7DQotICAgICAgICANCi0gICAgICAgIC8vIFByZXBhcmUgdGhlIHJlc3BvbnNlIGNvbnRlbnQgZm9yIGNoZWNraW5nDQotICAgICAgICByZWFkZXIgPSBpbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKHJlc3BvbnNlKTsNCi0gICAgICAgIHIydyA9IG5ldyBSZWFkZXIyV3JpdGVyKHJlYWRlcik7DQotICAgICAgICByZXNwb25zZVRleHQgPSByMncuZ2V0QXNTdHJpbmcoKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKHJlc3BvbnNlVGV4dCk7DQotICAgICAgICANCi0gICAgICAgIC8vIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgY29udGVudCBpcyBjb3JyZWN0DQotICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZVRleHQuY29udGFpbnMoInNvYXAiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZVRleHQuY29udGFpbnMoIkVudmVsb3BlIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSghcmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJCb2R5IikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZVRleHQuY29udGFpbnMoImVjaG9TdHJpbmdSZXNwb25zZSIpKTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIEludm9rZSBhIERpc3BhdGNoPFNvdXJjZT4gYXN5bmNocm9ub3VzbHkgd2l0aCB0aGUgY29udGVudCBpbiBNRVNTQUdFIG1vZGUuDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXN5bmNQb2xsaW5nTWVzc2FnZU1vZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJ0ZXN0OiAiICsgZ2V0TmFtZSgpKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgSkFYLVdTIGNsaWVudCBhcnRpZmFjdHMgDQotICAgICAgICBTZXJ2aWNlIHN2YyA9IFNlcnZpY2UuY3JlYXRlKERpc3BhdGNoVGVzdENvbnN0YW50cy5RTkFNRV9TRVJWSUNFKTsNCi0gICAgICAgIHN2Yy5hZGRQb3J0KERpc3BhdGNoVGVzdENvbnN0YW50cy5RTkFNRV9QT1JULCBudWxsLCBEaXNwYXRjaFRlc3RDb25zdGFudHMuVVJMKTsNCi0gICAgICAgIERpc3BhdGNoPFNvdXJjZT4gZGlzcGF0Y2ggPSBzdmMuY3JlYXRlRGlzcGF0Y2goRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlFOQU1FX1BPUlQsIFNvdXJjZS5jbGFzcywNCi0gICAgICAgICAgICAgICAgTW9kZS5NRVNTQUdFKTsNCi0NCi0gICAgICAgIC8vIENyZWF0ZSBhIFN0cmVhbVNvdXJjZSB3aXRoIHRoZSBkZXNpcmVkIGNvbnRlbnQNCi0gICAgICAgIGJ5dGVbXSBieXRlcyA9IERpc3BhdGNoVGVzdENvbnN0YW50cy5zYW1wbGVTb2FwTWVzc2FnZS5nZXRCeXRlcygpOw0KLSAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gc3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVzKTsNCi0gICAgICAgIFNvdXJjZSBzcmNTdHJlYW0gPSBuZXcgU3RyZWFtU291cmNlKChJbnB1dFN0cmVhbSkgc3RyZWFtKTsNCi0NCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBJbnZva2luZyBhc3luYyAoY2FsbGJhY2spIERpc3BhdGNoIHdpdGggTUVTU0FHRSBtb2RlIik7DQotICAgICAgICBSZXNwb25zZTxTb3VyY2U+IGFzeW5jUmVzcG9uc2UgPSBkaXNwYXRjaC5pbnZva2VBc3luYyhzcmNTdHJlYW0pOw0KLQ0KLSAgICAgICAgLy8gV2FpdCBmb3IgdGhlIGFzeW5jIHJlc3BvbnNlIHRvIGJlIHJldHVybmVkDQotICAgICAgICB3aGlsZSAoIWFzeW5jUmVzcG9uc2UuaXNEb25lKCkpIHsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gQXN5bmMgaW52b2NhdGlvbiBzdGlsbCBub3QgY29tcGxldGUiKTsNCi0gICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIFNvdXJjZSByZXNwb25zZSA9IGFzeW5jUmVzcG9uc2UuZ2V0KCk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3BvbnNlKTsNCi0NCi0gICAgICAgIC8vIFByZXBhcmUgdGhlIHJlc3BvbnNlIGNvbnRlbnQgZm9yIGNoZWNraW5nDQotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyID0gaW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihyZXNwb25zZSk7DQotICAgICAgICBSZWFkZXIyV3JpdGVyIHIydyA9IG5ldyBSZWFkZXIyV3JpdGVyKHJlYWRlcik7DQotICAgICAgICBTdHJpbmcgcmVzcG9uc2VUZXh0ID0gcjJ3LmdldEFzU3RyaW5nKCk7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZyhyZXNwb25zZVRleHQpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIGNvbnRlbnQgaXMgY29ycmVjdA0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZVRleHQuY29udGFpbnMoInNvYXAiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlVGV4dC5jb250YWlucygiRW52ZWxvcGUiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlVGV4dC5jb250YWlucygiQm9keSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJlY2hvU3RyaW5nUmVzcG9uc2UiKSk7DQotICAgICAgICANCi0gICAgICAgIA0KLSAgICAgICAgLy8gSW52b2tlIGEgc2Vjb25kIHRpbWUgdG8gdmVyaWZ5DQotICAgICAgICBzdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZXMpOw0KLSAgICAgICAgc3JjU3RyZWFtID0gbmV3IFN0cmVhbVNvdXJjZSgoSW5wdXRTdHJlYW0pIHN0cmVhbSk7DQotDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gSW52b2tpbmcgYXN5bmMgKGNhbGxiYWNrKSBEaXNwYXRjaCB3aXRoIE1FU1NBR0UgbW9kZSIpOw0KLSAgICAgICAgYXN5bmNSZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZUFzeW5jKHNyY1N0cmVhbSk7DQotDQotICAgICAgICAvLyBXYWl0IGZvciB0aGUgYXN5bmMgcmVzcG9uc2UgdG8gYmUgcmV0dXJuZWQNCi0gICAgICAgIHdoaWxlICghYXN5bmNSZXNwb25zZS5pc0RvbmUoKSkgew0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBBc3luYyBpbnZvY2F0aW9uIHN0aWxsIG5vdCBjb21wbGV0ZSIpOw0KLSAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgcmVzcG9uc2UgPSBhc3luY1Jlc3BvbnNlLmdldCgpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXNwb25zZSk7DQotDQotICAgICAgICAvLyBQcmVwYXJlIHRoZSByZXNwb25zZSBjb250ZW50IGZvciBjaGVja2luZw0KLSAgICAgICAgcmVhZGVyID0gaW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihyZXNwb25zZSk7DQotICAgICAgICByMncgPSBuZXcgUmVhZGVyMldyaXRlcihyZWFkZXIpOw0KLSAgICAgICAgcmVzcG9uc2VUZXh0ID0gcjJ3LmdldEFzU3RyaW5nKCk7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZyhyZXNwb25zZVRleHQpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIGNvbnRlbnQgaXMgY29ycmVjdA0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZVRleHQuY29udGFpbnMoInNvYXAiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlVGV4dC5jb250YWlucygiRW52ZWxvcGUiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlVGV4dC5jb250YWlucygiQm9keSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJlY2hvU3RyaW5nUmVzcG9uc2UiKSk7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBJbnZva2UgYSBEaXNwYXRjaDxTb3VyY2U+IG9uZS13YXkgb3BlcmF0aW9uDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0T25lV2F5UGF5bG9hZE1vZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJ0ZXN0OiAiICsgZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIC8vIEluaXRpYWxpemUgdGhlIEpBWC1XUyBjbGllbnQgYXJ0aWZhY3RzDQotICAgICAgICBTZXJ2aWNlIHN2YyA9IFNlcnZpY2UuY3JlYXRlKERpc3BhdGNoVGVzdENvbnN0YW50cy5RTkFNRV9TRVJWSUNFKTsNCi0gICAgICAgIHN2Yy5hZGRQb3J0KERpc3BhdGNoVGVzdENvbnN0YW50cy5RTkFNRV9QT1JULCBudWxsLCBEaXNwYXRjaFRlc3RDb25zdGFudHMuVVJMKTsNCi0gICAgICAgIERpc3BhdGNoPFNvdXJjZT4gZGlzcGF0Y2ggPSBzdmMuY3JlYXRlRGlzcGF0Y2goRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlFOQU1FX1BPUlQsIFNvdXJjZS5jbGFzcywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VydmljZS5Nb2RlLlBBWUxPQUQpOw0KLQ0KLSAgICAgICAgLy8gQ3JlYXRlIGEgU3RyZWFtU291cmNlIHdpdGggdGhlIGRlc2lyZWQgY29udGVudA0KLSAgICAgICAgYnl0ZVtdIGJ5dGVzID0gRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLnNhbXBsZUJvZHlDb250ZW50LmdldEJ5dGVzKCk7DQotICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBzdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZXMpOw0KLSAgICAgICAgU291cmNlIHNyY1N0cmVhbSA9IG5ldyBTdHJlYW1Tb3VyY2UoKElucHV0U3RyZWFtKSBzdHJlYW0pOw0KLQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEludm9raW5nIE9uZSBXYXkgRGlzcGF0Y2giKTsNCi0gICAgICAgIGRpc3BhdGNoLmludm9rZU9uZVdheShzcmNTdHJlYW0pOw0KLSAgICAgICAgDQotICAgICAgICAvLyBJbnZva2UgYSBzZWNvbmQgdGltZSB0byB2ZXJpZnkNCi0gICAgICAgIHN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlcyk7DQotICAgICAgICBzcmNTdHJlYW0gPSBuZXcgU3RyZWFtU291cmNlKChJbnB1dFN0cmVhbSkgc3RyZWFtKTsNCi0NCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBJbnZva2luZyBPbmUgV2F5IERpc3BhdGNoIik7DQotICAgICAgICBkaXNwYXRjaC5pbnZva2VPbmVXYXkoc3JjU3RyZWFtKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGlzcGF0Y2gvU3RyaW5nRGlzcGF0Y2hUZXN0cy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rpc3BhdGNoL1N0cmluZ0Rpc3BhdGNoVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQxNTk2MS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGlzcGF0Y2gvU3RyaW5nRGlzcGF0Y2hUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGlzcGF0Y2g7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLlRlc3RMb2dnZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZnJhbWV3b3JrLkFic3RyYWN0VGVzdENhc2U7DQotDQotaW1wb3J0IGphdmF4LnhtbC53cy5EaXNwYXRjaDsNCi1pbXBvcnQgamF2YXgueG1sLndzLlByb3RvY29sRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC54bWwud3MuUmVzcG9uc2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5uZXQuVW5rbm93bkhvc3RFeGNlcHRpb247DQotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dGlvbkV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOw0KLQ0KLXB1YmxpYyBjbGFzcyBTdHJpbmdEaXNwYXRjaFRlc3RzIGV4dGVuZHMgQWJzdHJhY3RUZXN0Q2FzZSB7DQotDQotICAgIA0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7DQotICAgICAgICByZXR1cm4gZ2V0VGVzdFNldHVwKG5ldyBUZXN0U3VpdGUoU3RyaW5nRGlzcGF0Y2hUZXN0cy5jbGFzcykpOw0KLSAgICB9DQotCQ0KLQkvKioNCi0gICAgICogSW52b2tlIGEgc3luYyBEaXNwYXRjaDxTdHJpbmc+IGluIFBBWUxPQUQgbW9kZQ0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdFN5bmNQYXlsb2FkTW9kZSgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoInRlc3Q6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBKQVgtV1MgY2xpZW50IGFydGlmYWN0cw0KLSAgICAgICAgU2VydmljZSBzdmMgPSBTZXJ2aWNlLmNyZWF0ZShEaXNwYXRjaFRlc3RDb25zdGFudHMuUU5BTUVfU0VSVklDRSk7DQotICAgICAgICBzdmMuYWRkUG9ydChEaXNwYXRjaFRlc3RDb25zdGFudHMuUU5BTUVfUE9SVCwgbnVsbCwgRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlVSTCk7DQotICAgICAgICBEaXNwYXRjaDxTdHJpbmc+IGRpc3BhdGNoID0gc3ZjLmNyZWF0ZURpc3BhdGNoKERpc3BhdGNoVGVzdENvbnN0YW50cy5RTkFNRV9QT1JULCANCi0gICAgICAgICAgICAgICAgU3RyaW5nLmNsYXNzLCBTZXJ2aWNlLk1vZGUuUEFZTE9BRCk7DQotICAgICAgICANCi0gICAgICAgIC8vIEludm9rZSB0aGUgRGlzcGF0Y2gNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBJbnZva2luZyBzeW5jIERpc3BhdGNoIik7DQotICAgICAgICBTdHJpbmcgcmVzcG9uc2UgPSBkaXNwYXRjaC5pbnZva2UoRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLnNhbXBsZUJvZHlDb250ZW50KTsNCi0NCi0gICAgICAgIGFzc2VydE5vdE51bGwoImRpc3BhdGNoIGludm9rZSByZXR1cm5lZCBudWxsIiwgcmVzcG9uc2UpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcocmVzcG9uc2UpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIGNvbnRlbnQgaXMgY29ycmVjdA0KLSAgICAgICAgYXNzZXJ0VHJ1ZSghcmVzcG9uc2UuY29udGFpbnMoInNvYXAiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZS5jb250YWlucygiRW52ZWxvcGUiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZS5jb250YWlucygiQm9keSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UuY29udGFpbnMoImVjaG9TdHJpbmdSZXNwb25zZSIpKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gSW52b2tlIGEgc2Vjb25kIHRpbWUgdG8gdmVyaWZ5DQotICAgICAgICAvLyBJbnZva2UgdGhlIERpc3BhdGNoDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gSW52b2tpbmcgc3luYyBEaXNwYXRjaCIpOw0KLSAgICAgICAgcmVzcG9uc2UgPSBkaXNwYXRjaC5pbnZva2UoRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLnNhbXBsZUJvZHlDb250ZW50KTsNCi0NCi0gICAgICAgIGFzc2VydE5vdE51bGwoImRpc3BhdGNoIGludm9rZSByZXR1cm5lZCBudWxsIiwgcmVzcG9uc2UpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcocmVzcG9uc2UpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIGNvbnRlbnQgaXMgY29ycmVjdA0KLSAgICAgICAgYXNzZXJ0VHJ1ZSghcmVzcG9uc2UuY29udGFpbnMoInNvYXAiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZS5jb250YWlucygiRW52ZWxvcGUiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZS5jb250YWlucygiQm9keSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UuY29udGFpbnMoImVjaG9TdHJpbmdSZXNwb25zZSIpKTsNCi0JfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIEludm9rZSBhIHN5bmMgRGlzcGF0Y2g8U3RyaW5nPiBpbiBQQVlMT0FEIG1vZGUNCi0gICAgICogU2VydmVyIHJlc3BvbnNlIHdpdGggZXhjZXB0aW9uLiAgU2VjdGlvbiA0LjMuMg0KLSAgICAgKiBzYXlzIHdlIHNob3VsZCBnZXQgYSBQcm90b2NvbEV4Y2VwdGlvbiwgbm90IGENCi0gICAgICogV2ViU2VydmljZUV4Y2VwdGlvbi4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RTeW5jUGF5bG9hZE1vZGVfZXhjZXB0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygidGVzdDogIiArIGdldE5hbWUoKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIEluaXRpYWxpemUgdGhlIEpBWC1XUyBjbGllbnQgYXJ0aWZhY3RzDQotICAgICAgICBTZXJ2aWNlIHN2YyA9IFNlcnZpY2UuY3JlYXRlKERpc3BhdGNoVGVzdENvbnN0YW50cy5RTkFNRV9TRVJWSUNFKTsNCi0gICAgICAgIHN2Yy5hZGRQb3J0KERpc3BhdGNoVGVzdENvbnN0YW50cy5RTkFNRV9QT1JULCBudWxsLCBEaXNwYXRjaFRlc3RDb25zdGFudHMuVVJMKTsNCi0gICAgICAgIERpc3BhdGNoPFN0cmluZz4gZGlzcGF0Y2ggPSBzdmMuY3JlYXRlRGlzcGF0Y2goRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlFOQU1FX1BPUlQsIA0KLSAgICAgICAgICAgICAgICBTdHJpbmcuY2xhc3MsIFNlcnZpY2UuTW9kZS5QQVlMT0FEKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gSW52b2tlIHRoZSBEaXNwYXRjaA0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEludm9raW5nIHN5bmMgRGlzcGF0Y2giKTsNCi0gICAgICAgIEV4Y2VwdGlvbiBlID0gbnVsbDsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgLy8gVGhlIF9iYWQgc3RyaW5nIHBhc3NlcyAiVEhST1cgRVhDRVBUSU9OIiwgd2hpY2ggY2F1c2VzIHRoZSBlY2hvIGZ1bmN0aW9uIG9uIHRoZQ0KLSAgICAgICAgICAgIC8vIHNlcnZlciB0byB0aHJvdyBhIFJ1bnRpbWVFeGNlcHRpb24uICBXZSBzaG91bGQgZ2V0IGEgUHJvdG9jb2xFeGNlcHRpb24gaGVyZSBvbiB0aGUgY2xpZW50DQotICAgICAgICAgICAgU3RyaW5nIHJlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlKERpc3BhdGNoVGVzdENvbnN0YW50cy5zYW1wbGVCb2R5Q29udGVudF9iYWQpOw0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7DQotICAgICAgICAgICAgZSA9IGV4Ow0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgiTm8gZXhjZXB0aW9uIHJlY2VpdmVkIiwgZSk7DQotICAgICAgICBhc3NlcnRUcnVlKCInZScgc2hvdWxkIGJlIG9mIHR5cGUgUHJvdG9jb2xFeGNlcHRpb24iLCBlIGluc3RhbmNlb2YgUHJvdG9jb2xFeGNlcHRpb24pOw0KLSAgICAgICAgDQotICAgICAgICAvLyBJbnZva2UgYSBzZWNvbmQgdGltZSB0byB2ZXJpZnkNCi0gICAgICAgIA0KLSAgICAgICAgLy8gSW52b2tlIHRoZSBEaXNwYXRjaA0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEludm9raW5nIHN5bmMgRGlzcGF0Y2giKTsNCi0gICAgICAgIGUgPSBudWxsOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICAvLyBUaGUgX2JhZCBzdHJpbmcgcGFzc2VzICJUSFJPVyBFWENFUFRJT04iLCB3aGljaCBjYXVzZXMgdGhlIGVjaG8gZnVuY3Rpb24gb24gdGhlDQotICAgICAgICAgICAgLy8gc2VydmVyIHRvIHRocm93IGEgUnVudGltZUV4Y2VwdGlvbi4gIFdlIHNob3VsZCBnZXQgYSBQcm90b2NvbEV4Y2VwdGlvbiBoZXJlIG9uIHRoZSBjbGllbnQNCi0gICAgICAgICAgICBTdHJpbmcgcmVzcG9uc2UgPSBkaXNwYXRjaC5pbnZva2UoRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLnNhbXBsZUJvZHlDb250ZW50X2JhZCk7DQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsNCi0gICAgICAgICAgICBlID0gZXg7DQotICAgICAgICB9DQotDQotICAgICAgICBhc3NlcnROb3ROdWxsKCJObyBleGNlcHRpb24gcmVjZWl2ZWQiLCBlKTsNCi0gICAgICAgIGFzc2VydFRydWUoIidlJyBzaG91bGQgYmUgb2YgdHlwZSBQcm90b2NvbEV4Y2VwdGlvbiIsIGUgaW5zdGFuY2VvZiBQcm90b2NvbEV4Y2VwdGlvbik7DQotDQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBJbnZva2UgYSBzeW5jIERpc3BhdGNoPFN0cmluZz4gaW4gTUVTU0FHRSBtb2RlDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3luY1dpdGhNZXNzYWdlTW9kZSgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoInRlc3Q6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBKQVgtV1MgY2xpZW50IGFydGlmYWN0cw0KLSAgICAgICAgU2VydmljZSBzdmMgPSBTZXJ2aWNlLmNyZWF0ZShEaXNwYXRjaFRlc3RDb25zdGFudHMuUU5BTUVfU0VSVklDRSk7DQotICAgICAgICBzdmMuYWRkUG9ydChEaXNwYXRjaFRlc3RDb25zdGFudHMuUU5BTUVfUE9SVCwgbnVsbCwgRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlVSTCk7DQotICAgICAgICBEaXNwYXRjaDxTdHJpbmc+IGRpc3BhdGNoID0gc3ZjLmNyZWF0ZURpc3BhdGNoKERpc3BhdGNoVGVzdENvbnN0YW50cy5RTkFNRV9QT1JULCANCi0gICAgICAgICAgICAgICAgU3RyaW5nLmNsYXNzLCBTZXJ2aWNlLk1vZGUuTUVTU0FHRSk7DQotICAgICAgICANCi0gICAgICAgIC8vIEludm9rZSB0aGUgRGlzcGF0Y2gNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBJbnZva2luZyBzeW5jIERpc3BhdGNoIik7DQotICAgICAgICBTdHJpbmcgcmVzcG9uc2UgPSBkaXNwYXRjaC5pbnZva2UoRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLnNhbXBsZVNvYXBNZXNzYWdlKTsNCi0NCi0gICAgICAgIGFzc2VydE5vdE51bGwoImRpc3BhdGNoIGludm9rZSByZXR1cm5lZCBudWxsIiwgcmVzcG9uc2UpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcocmVzcG9uc2UpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIGNvbnRlbnQgaXMgY29ycmVjdA0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZS5jb250YWlucygic29hcCIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UuY29udGFpbnMoIkVudmVsb3BlIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZS5jb250YWlucygiQm9keSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UuY29udGFpbnMoImVjaG9TdHJpbmdSZXNwb25zZSIpKTsNCi0gICAgICAgIA0KLSAgICAgICAgDQotICAgICAgICAvLyBJbnZva2UgYSBzZWNvbmQgdGltZSB0byB2ZXJpZnkNCi0gICAgICAgIC8vIEludm9rZSB0aGUgRGlzcGF0Y2gNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBJbnZva2luZyBzeW5jIERpc3BhdGNoIik7DQotICAgICAgICByZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZShEaXNwYXRjaFRlc3RDb25zdGFudHMuc2FtcGxlU29hcE1lc3NhZ2UpOw0KLQ0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgiZGlzcGF0Y2ggaW52b2tlIHJldHVybmVkIG51bGwiLCByZXNwb25zZSk7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZyhyZXNwb25zZSk7DQotICAgICAgICANCi0gICAgICAgIC8vIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgY29udGVudCBpcyBjb3JyZWN0DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlLmNvbnRhaW5zKCJzb2FwIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZS5jb250YWlucygiRW52ZWxvcGUiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlLmNvbnRhaW5zKCJCb2R5IikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZS5jb250YWlucygiZWNob1N0cmluZ1Jlc3BvbnNlIikpOw0KLQl9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogSW52b2tlIGEgRGlzcGF0Y2g8U3RyaW5nPiB1c2luZyB0aGUgYXN5bmMgY2FsbGJhY2sgQVBJIGluIFBBWUxPQUQgbW9kZQ0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdEFzeW5jQ2FsbGJhY2tQYXlsb2FkTW9kZSgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoInRlc3Q6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBKQVgtV1MgY2xpZW50IGFydGlmYWN0cw0KLSAgICAgICAgU2VydmljZSBzdmMgPSBTZXJ2aWNlLmNyZWF0ZShEaXNwYXRjaFRlc3RDb25zdGFudHMuUU5BTUVfU0VSVklDRSk7DQotICAgICAgICBzdmMuYWRkUG9ydChEaXNwYXRjaFRlc3RDb25zdGFudHMuUU5BTUVfUE9SVCwgbnVsbCwgRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlVSTCk7DQotICAgICAgICBEaXNwYXRjaDxTdHJpbmc+IGRpc3BhdGNoID0gc3ZjLmNyZWF0ZURpc3BhdGNoKERpc3BhdGNoVGVzdENvbnN0YW50cy5RTkFNRV9QT1JULCANCi0gICAgICAgICAgICAgICAgU3RyaW5nLmNsYXNzLCBTZXJ2aWNlLk1vZGUuUEFZTE9BRCk7DQotDQotICAgICAgICAvLyBDcmVhdGUgdGhlIGNhbGxiYWNrIGZvciBhc3luYyByZXNwb25zZXMNCi0gICAgICAgIEFzeW5jQ2FsbGJhY2s8U3RyaW5nPiBjYWxsYmFjayA9IG5ldyBBc3luY0NhbGxiYWNrPFN0cmluZz4oKTsNCi0NCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBJbnZva2luZyBhc3luYyAoY2FsbGJhY2spIERpc3BhdGNoIik7DQotICAgICAgICBGdXR1cmU8Pz4gbW9uaXRvciA9IGRpc3BhdGNoLmludm9rZUFzeW5jKERpc3BhdGNoVGVzdENvbnN0YW50cy5zYW1wbGVCb2R5Q29udGVudCwgY2FsbGJhY2spOw0KLQkgICAgICAgIA0KLSAgICAgICAgd2hpbGUgKCFtb25pdG9yLmlzRG9uZSgpKSB7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEFzeW5jIGludm9jYXRpb24gc3RpbGwgbm90IGNvbXBsZXRlIik7DQotICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDApOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICBTdHJpbmcgcmVzcG9uc2UgPSBjYWxsYmFjay5nZXRWYWx1ZSgpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgiZGlzcGF0Y2ggaW52b2tlIHJldHVybmVkIG51bGwiLCByZXNwb25zZSk7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZyhyZXNwb25zZSk7DQotICAgICAgICANCi0gICAgICAgIC8vIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgY29udGVudCBpcyBjb3JyZWN0DQotICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZS5jb250YWlucygic29hcCIpKTsNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlLmNvbnRhaW5zKCJFbnZlbG9wZSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlLmNvbnRhaW5zKCJCb2R5IikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZS5jb250YWlucygiZWNob1N0cmluZ1Jlc3BvbnNlIikpOw0KLSAgICAgICAgDQotICAgICAgICANCi0gICAgICAgIC8vIEludm9rZSBhIHNlY29uZCB0aW1lIHRvIHZlcmlmeQ0KLSAgICAgICAgLy8gQ3JlYXRlIHRoZSBjYWxsYmFjayBmb3IgYXN5bmMgcmVzcG9uc2VzDQotICAgICAgICBjYWxsYmFjayA9IG5ldyBBc3luY0NhbGxiYWNrPFN0cmluZz4oKTsNCi0NCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBJbnZva2luZyBhc3luYyAoY2FsbGJhY2spIERpc3BhdGNoIik7DQotICAgICAgICBtb25pdG9yID0gZGlzcGF0Y2guaW52b2tlQXN5bmMoRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLnNhbXBsZUJvZHlDb250ZW50LCBjYWxsYmFjayk7DQotICAgICAgICAgICAgICAgIA0KLSAgICAgICAgd2hpbGUgKCFtb25pdG9yLmlzRG9uZSgpKSB7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEFzeW5jIGludm9jYXRpb24gc3RpbGwgbm90IGNvbXBsZXRlIik7DQotICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDApOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICByZXNwb25zZSA9IGNhbGxiYWNrLmdldFZhbHVlKCk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKCJkaXNwYXRjaCBpbnZva2UgcmV0dXJuZWQgbnVsbCIsIHJlc3BvbnNlKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKHJlc3BvbnNlKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBjb250ZW50IGlzIGNvcnJlY3QNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlLmNvbnRhaW5zKCJzb2FwIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSghcmVzcG9uc2UuY29udGFpbnMoIkVudmVsb3BlIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSghcmVzcG9uc2UuY29udGFpbnMoIkJvZHkiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlLmNvbnRhaW5zKCJlY2hvU3RyaW5nUmVzcG9uc2UiKSk7DQotCX0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBJbnZva2UgYSBEaXNwYXRjaDxTdHJpbmc+IHVzaW5nIHRoZSBhc3luYyBjYWxsYmFjayBBUEkgaW4gTUVTU0FHRSBtb2RlDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXN5bmNDYWxsYmFja01lc3NhZ2VNb2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygidGVzdDogIiArIGdldE5hbWUoKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIEluaXRpYWxpemUgdGhlIEpBWC1XUyBjbGllbnQgYXJ0aWZhY3RzDQotICAgICAgICBTZXJ2aWNlIHN2YyA9IFNlcnZpY2UuY3JlYXRlKERpc3BhdGNoVGVzdENvbnN0YW50cy5RTkFNRV9TRVJWSUNFKTsNCi0gICAgICAgIHN2Yy5hZGRQb3J0KERpc3BhdGNoVGVzdENvbnN0YW50cy5RTkFNRV9QT1JULCBudWxsLCBEaXNwYXRjaFRlc3RDb25zdGFudHMuVVJMKTsNCi0gICAgICAgIERpc3BhdGNoPFN0cmluZz4gZGlzcGF0Y2ggPSBzdmMuY3JlYXRlRGlzcGF0Y2goRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlFOQU1FX1BPUlQsIA0KLSAgICAgICAgICAgICAgICBTdHJpbmcuY2xhc3MsIFNlcnZpY2UuTW9kZS5NRVNTQUdFKTsNCi0NCi0gICAgICAgIC8vIENyZWF0ZSB0aGUgY2FsbGJhY2sgZm9yIGFzeW5jIHJlc3BvbnNlcw0KLSAgICAgICAgQXN5bmNDYWxsYmFjazxTdHJpbmc+IGNhbGxiYWNrID0gbmV3IEFzeW5jQ2FsbGJhY2s8U3RyaW5nPigpOw0KLQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEludm9raW5nIGFzeW5jIChjYWxsYmFjaykgRGlzcGF0Y2ggd2l0aCBNZXNzYWdlIE1vZGUiKTsNCi0gICAgICAgIEZ1dHVyZTw/PiBtb25pdG9yID0gZGlzcGF0Y2guaW52b2tlQXN5bmMoRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLnNhbXBsZVNvYXBNZXNzYWdlLCBjYWxsYmFjayk7DQotICAgIA0KLSAgICAgICAgd2hpbGUgKCFtb25pdG9yLmlzRG9uZSgpKSB7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEFzeW5jIGludm9jYXRpb24gc3RpbGwgbm90IGNvbXBsZXRlIik7DQotICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDApOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICBTdHJpbmcgcmVzcG9uc2UgPSBjYWxsYmFjay5nZXRWYWx1ZSgpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgiZGlzcGF0Y2ggaW52b2tlIHJldHVybmVkIG51bGwiLCByZXNwb25zZSk7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZyhyZXNwb25zZSk7DQotICAgICAgICANCi0gICAgICAgIC8vIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgY29udGVudCBpcyBjb3JyZWN0DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlLmNvbnRhaW5zKCJzb2FwIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZS5jb250YWlucygiRW52ZWxvcGUiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlLmNvbnRhaW5zKCJCb2R5IikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZS5jb250YWlucygiZWNob1N0cmluZ1Jlc3BvbnNlIikpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBJbnZva2UgYSBzZWNvbmQgdGltZSB0byB2ZXJpZnkNCi0gICAgICAgIC8vIENyZWF0ZSB0aGUgY2FsbGJhY2sgZm9yIGFzeW5jIHJlc3BvbnNlcw0KLSAgICAgICAgY2FsbGJhY2sgPSBuZXcgQXN5bmNDYWxsYmFjazxTdHJpbmc+KCk7DQotDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gSW52b2tpbmcgYXN5bmMgKGNhbGxiYWNrKSBEaXNwYXRjaCB3aXRoIE1lc3NhZ2UgTW9kZSIpOw0KLSAgICAgICAgbW9uaXRvciA9IGRpc3BhdGNoLmludm9rZUFzeW5jKERpc3BhdGNoVGVzdENvbnN0YW50cy5zYW1wbGVTb2FwTWVzc2FnZSwgY2FsbGJhY2spOw0KLSAgICANCi0gICAgICAgIHdoaWxlICghbW9uaXRvci5pc0RvbmUoKSkgew0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBBc3luYyBpbnZvY2F0aW9uIHN0aWxsIG5vdCBjb21wbGV0ZSIpOw0KLSAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgcmVzcG9uc2UgPSBjYWxsYmFjay5nZXRWYWx1ZSgpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgiZGlzcGF0Y2ggaW52b2tlIHJldHVybmVkIG51bGwiLCByZXNwb25zZSk7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZyhyZXNwb25zZSk7DQotICAgICAgICANCi0gICAgICAgIC8vIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgY29udGVudCBpcyBjb3JyZWN0DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlLmNvbnRhaW5zKCJzb2FwIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZS5jb250YWlucygiRW52ZWxvcGUiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlLmNvbnRhaW5zKCJCb2R5IikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZS5jb250YWlucygiZWNob1N0cmluZ1Jlc3BvbnNlIikpOw0KLQl9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogSW52b2tlIGEgRGlzcGF0Y2g8U3RyaW5nPiB1c2luZyB0aGUgYXN5bmMgcG9sbGluZyBBUEkgaW4gUEFZTE9BRCBtb2RlDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXN5bmNQb2xsaW5nUGF5bG9hZE1vZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJ0ZXN0OiAiICsgZ2V0TmFtZSgpKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgSkFYLVdTIGNsaWVudCBhcnRpZmFjdHMNCi0gICAgICAgIFNlcnZpY2Ugc3ZjID0gU2VydmljZS5jcmVhdGUoRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlFOQU1FX1NFUlZJQ0UpOw0KLSAgICAgICAgc3ZjLmFkZFBvcnQoRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlFOQU1FX1BPUlQsIG51bGwsIERpc3BhdGNoVGVzdENvbnN0YW50cy5VUkwpOw0KLSAgICAgICAgRGlzcGF0Y2g8U3RyaW5nPiBkaXNwYXRjaCA9IHN2Yy5jcmVhdGVEaXNwYXRjaChEaXNwYXRjaFRlc3RDb25zdGFudHMuUU5BTUVfUE9SVCwgDQotICAgICAgICAgICAgICAgIFN0cmluZy5jbGFzcywgU2VydmljZS5Nb2RlLlBBWUxPQUQpOw0KLQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEludm9raW5nIGFzeW5jIChwb2xsaW5nKSBEaXNwYXRjaCIpOw0KLSAgICAgICAgUmVzcG9uc2U8U3RyaW5nPiBhc3luY1Jlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlQXN5bmMoRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLnNhbXBsZUJvZHlDb250ZW50KTsNCi0gICAgICAgICAgICANCi0gICAgICAgIHdoaWxlICghYXN5bmNSZXNwb25zZS5pc0RvbmUoKSkgew0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBBc3luYyBpbnZvY2F0aW9uIHN0aWxsIG5vdCBjb21wbGV0ZSIpOw0KLSAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgU3RyaW5nIHJlc3BvbnNlID0gYXN5bmNSZXNwb25zZS5nZXQoKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwoImRpc3BhdGNoIGludm9rZSByZXR1cm5lZCBudWxsIiwgcmVzcG9uc2UpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcocmVzcG9uc2UpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIGNvbnRlbnQgaXMgY29ycmVjdA0KLSAgICAgICAgYXNzZXJ0VHJ1ZSghcmVzcG9uc2UuY29udGFpbnMoInNvYXAiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZS5jb250YWlucygiRW52ZWxvcGUiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZS5jb250YWlucygiQm9keSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UuY29udGFpbnMoImVjaG9TdHJpbmdSZXNwb25zZSIpKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gSW52b2tlIGEgc2Vjb25kIHRpbWUgdG8gdmVyaWZ5DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gSW52b2tpbmcgYXN5bmMgKHBvbGxpbmcpIERpc3BhdGNoIik7DQotICAgICAgICBhc3luY1Jlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlQXN5bmMoRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLnNhbXBsZUJvZHlDb250ZW50KTsNCi0gICAgICAgICAgICANCi0gICAgICAgIHdoaWxlICghYXN5bmNSZXNwb25zZS5pc0RvbmUoKSkgew0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBBc3luYyBpbnZvY2F0aW9uIHN0aWxsIG5vdCBjb21wbGV0ZSIpOw0KLSAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgcmVzcG9uc2UgPSBhc3luY1Jlc3BvbnNlLmdldCgpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgiZGlzcGF0Y2ggaW52b2tlIHJldHVybmVkIG51bGwiLCByZXNwb25zZSk7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZyhyZXNwb25zZSk7DQotICAgICAgICANCi0gICAgICAgIC8vIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgY29udGVudCBpcyBjb3JyZWN0DQotICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZS5jb250YWlucygic29hcCIpKTsNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlLmNvbnRhaW5zKCJFbnZlbG9wZSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlLmNvbnRhaW5zKCJCb2R5IikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZS5jb250YWlucygiZWNob1N0cmluZ1Jlc3BvbnNlIikpOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogSW52b2tlIGEgRGlzcGF0Y2g8U3RyaW5nPiB1c2luZyB0aGUgYXN5bmMgcG9sbGluZyBBUEkgaW4gTUVTU0FHRSBtb2RlDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXN5bmNQb2xsaW5nTWVzc2FnZU1vZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJ0ZXN0OiAiICsgZ2V0TmFtZSgpKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgSkFYLVdTIGNsaWVudCBhcnRpZmFjdHMNCi0gICAgICAgIFNlcnZpY2Ugc3ZjID0gU2VydmljZS5jcmVhdGUoRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlFOQU1FX1NFUlZJQ0UpOw0KLSAgICAgICAgc3ZjLmFkZFBvcnQoRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlFOQU1FX1BPUlQsIG51bGwsIERpc3BhdGNoVGVzdENvbnN0YW50cy5VUkwpOw0KLSAgICAgICAgRGlzcGF0Y2g8U3RyaW5nPiBkaXNwYXRjaCA9IHN2Yy5jcmVhdGVEaXNwYXRjaChEaXNwYXRjaFRlc3RDb25zdGFudHMuUU5BTUVfUE9SVCwgDQotICAgICAgICAgICAgICAgIFN0cmluZy5jbGFzcywgU2VydmljZS5Nb2RlLk1FU1NBR0UpOw0KLQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEludm9raW5nIGFzeW5jIChwb2xsaW5nKSBEaXNwYXRjaCB3aXRoIE1lc3NhZ2UgTW9kZSIpOw0KLSAgICAgICAgUmVzcG9uc2U8U3RyaW5nPiBhc3luY1Jlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlQXN5bmMoRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLnNhbXBsZVNvYXBNZXNzYWdlKTsNCi0gICAgDQotICAgICAgICB3aGlsZSAoIWFzeW5jUmVzcG9uc2UuaXNEb25lKCkpIHsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gQXN5bmMgaW52b2NhdGlvbiBzdGlsbCBub3QgY29tcGxldGUiKTsNCi0gICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIFN0cmluZyByZXNwb25zZSA9IGFzeW5jUmVzcG9uc2UuZ2V0KCk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKCJkaXNwYXRjaCBpbnZva2UgcmV0dXJuZWQgbnVsbCIsIHJlc3BvbnNlKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKHJlc3BvbnNlKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBjb250ZW50IGlzIGNvcnJlY3QNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UuY29udGFpbnMoInNvYXAiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlLmNvbnRhaW5zKCJFbnZlbG9wZSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UuY29udGFpbnMoIkJvZHkiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlLmNvbnRhaW5zKCJlY2hvU3RyaW5nUmVzcG9uc2UiKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIEludm9rZSBhIHNlY29uZCB0aW1lIHRvIHZlcmlmeQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEludm9raW5nIGFzeW5jIChwb2xsaW5nKSBEaXNwYXRjaCB3aXRoIE1lc3NhZ2UgTW9kZSIpOw0KLSAgICAgICAgYXN5bmNSZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZUFzeW5jKERpc3BhdGNoVGVzdENvbnN0YW50cy5zYW1wbGVTb2FwTWVzc2FnZSk7DQotICAgIA0KLSAgICAgICAgd2hpbGUgKCFhc3luY1Jlc3BvbnNlLmlzRG9uZSgpKSB7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEFzeW5jIGludm9jYXRpb24gc3RpbGwgbm90IGNvbXBsZXRlIik7DQotICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDApOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICByZXNwb25zZSA9IGFzeW5jUmVzcG9uc2UuZ2V0KCk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKCJkaXNwYXRjaCBpbnZva2UgcmV0dXJuZWQgbnVsbCIsIHJlc3BvbnNlKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKHJlc3BvbnNlKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBjb250ZW50IGlzIGNvcnJlY3QNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UuY29udGFpbnMoInNvYXAiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlLmNvbnRhaW5zKCJFbnZlbG9wZSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UuY29udGFpbnMoIkJvZHkiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlLmNvbnRhaW5zKCJlY2hvU3RyaW5nUmVzcG9uc2UiKSk7DQotICAgIH0NCi0JDQotICAgIC8qKg0KLSAgICAgKiBJbnZva2UgYSBEaXNwYXRjaDxTdHJpbmc+IG9uZS13YXkgaW4gUEFZTE9BRCBtb2RlIA0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdE9uZVdheVBheWxvYWRNb2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygidGVzdDogIiArIGdldE5hbWUoKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIEluaXRpYWxpemUgdGhlIEpBWC1XUyBjbGllbnQgYXJ0aWZhY3RzDQotICAgICAgICBTZXJ2aWNlIHN2YyA9IFNlcnZpY2UuY3JlYXRlKERpc3BhdGNoVGVzdENvbnN0YW50cy5RTkFNRV9TRVJWSUNFKTsNCi0gICAgICAgIHN2Yy5hZGRQb3J0KERpc3BhdGNoVGVzdENvbnN0YW50cy5RTkFNRV9QT1JULCBudWxsLCBEaXNwYXRjaFRlc3RDb25zdGFudHMuVVJMKTsNCi0gICAgICAgIERpc3BhdGNoPFN0cmluZz4gZGlzcGF0Y2ggPSBzdmMuY3JlYXRlRGlzcGF0Y2goRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlFOQU1FX1BPUlQsIA0KLSAgICAgICAgICAgICAgICBTdHJpbmcuY2xhc3MsIFNlcnZpY2UuTW9kZS5QQVlMT0FEKTsNCi0NCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBJbnZva2luZyBvbmUtd2F5IERpc3BhdGNoIik7DQotICAgICAgICBkaXNwYXRjaC5pbnZva2VPbmVXYXkoRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLnNhbXBsZUJvZHlDb250ZW50KTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gSW52b2tlIGEgc2Vjb25kIHRpbWUgdG8gdmVyaWZ5DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gSW52b2tpbmcgb25lLXdheSBEaXNwYXRjaCIpOw0KLSAgICAgICAgZGlzcGF0Y2guaW52b2tlT25lV2F5KERpc3BhdGNoVGVzdENvbnN0YW50cy5zYW1wbGVCb2R5Q29udGVudCk7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBJbnZva2UgYSBEaXNwYXRjaDxTdHJpbmc+IG9uZS13YXkgaW4gTUVTU0FHRSBtb2RlIA0KLQkgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdE9uZVdheU1lc3NhZ2VNb2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygidGVzdDogIiArIGdldE5hbWUoKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIEluaXRpYWxpemUgdGhlIEpBWC1XUyBjbGllbnQgYXJ0aWZhY3RzDQotICAgICAgICBTZXJ2aWNlIHN2YyA9IFNlcnZpY2UuY3JlYXRlKERpc3BhdGNoVGVzdENvbnN0YW50cy5RTkFNRV9TRVJWSUNFKTsNCi0gICAgICAgIHN2Yy5hZGRQb3J0KERpc3BhdGNoVGVzdENvbnN0YW50cy5RTkFNRV9QT1JULCBudWxsLCBEaXNwYXRjaFRlc3RDb25zdGFudHMuVVJMKTsNCi0gICAgICAgIERpc3BhdGNoPFN0cmluZz4gZGlzcGF0Y2ggPSBzdmMuY3JlYXRlRGlzcGF0Y2goRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlFOQU1FX1BPUlQsIA0KLSAgICAgICAgICAgICAgICBTdHJpbmcuY2xhc3MsIFNlcnZpY2UuTW9kZS5NRVNTQUdFKTsNCi0NCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBJbnZva2luZyBvbmUtd2F5IERpc3BhdGNoIik7DQotICAgICAgICBkaXNwYXRjaC5pbnZva2VPbmVXYXkoRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLnNhbXBsZVNvYXBNZXNzYWdlKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gSW52b2tlIGEgc2Vjb25kIHRpbWUgdG8gdmVyaWZ5DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gSW52b2tpbmcgb25lLXdheSBEaXNwYXRjaCIpOw0KLSAgICAgICAgZGlzcGF0Y2guaW52b2tlT25lV2F5KERpc3BhdGNoVGVzdENvbnN0YW50cy5zYW1wbGVTb2FwTWVzc2FnZSk7DQotCX0NCi0gICAgDQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3luY1BheWxvYWRNb2RlX2JhZEhvc3ROYW1lKCkgew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoInRlc3Q6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBKQVgtV1MgY2xpZW50IGFydGlmYWN0cw0KLSAgICAgICAgU2VydmljZSBzdmMgPSBTZXJ2aWNlLmNyZWF0ZShEaXNwYXRjaFRlc3RDb25zdGFudHMuUU5BTUVfU0VSVklDRSk7DQotICAgICAgICBzdmMuYWRkUG9ydChEaXNwYXRjaFRlc3RDb25zdGFudHMuUU5BTUVfUE9SVCwgbnVsbCwgRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLkJBRFVSTCk7DQotICAgICAgICBEaXNwYXRjaDxTdHJpbmc+IGRpc3BhdGNoID0gc3ZjLmNyZWF0ZURpc3BhdGNoKERpc3BhdGNoVGVzdENvbnN0YW50cy5RTkFNRV9QT1JULCANCi0gICAgICAgICAgICAgICAgU3RyaW5nLmNsYXNzLCBTZXJ2aWNlLk1vZGUuUEFZTE9BRCk7DQotICAgICAgICANCi0gICAgICAgIC8vIEludm9rZSB0aGUgRGlzcGF0Y2gNCi0gICAgICAgIFRocm93YWJsZSB0dGVtcCA9IG51bGw7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBJbnZva2luZyBzeW5jIERpc3BhdGNoIik7DQotICAgICAgICAgICAgU3RyaW5nIHJlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlKERpc3BhdGNoVGVzdENvbnN0YW50cy5zYW1wbGVCb2R5Q29udGVudCk7DQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgew0KLSAgICAgICAgICAgIGFzc2VydFRydWUodCBpbnN0YW5jZW9mIFdlYlNlcnZpY2VFeGNlcHRpb24pOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUodC5nZXRDYXVzZSgpIGluc3RhbmNlb2YgVW5rbm93bkhvc3RFeGNlcHRpb24pOw0KLSAgICAgICAgICAgIHR0ZW1wID0gdDsNCi0gICAgICAgIH0NCi0gICAgICAgIGFzc2VydE5vdE51bGwodHRlbXApOw0KLSAgICAgICAgDQotICAgICAgICAvLyBJbnZva2UgYSBzZWNvbmQgdGltZSB0byB2ZXJpZnkNCi0gICAgICAgIC8vIEludm9rZSB0aGUgRGlzcGF0Y2gNCi0gICAgICAgIHR0ZW1wID0gbnVsbDsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEludm9raW5nIHN5bmMgRGlzcGF0Y2giKTsNCi0gICAgICAgICAgICBTdHJpbmcgcmVzcG9uc2UgPSBkaXNwYXRjaC5pbnZva2UoRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLnNhbXBsZUJvZHlDb250ZW50KTsNCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh0IGluc3RhbmNlb2YgV2ViU2VydmljZUV4Y2VwdGlvbik7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh0LmdldENhdXNlKCkgaW5zdGFuY2VvZiBVbmtub3duSG9zdEV4Y2VwdGlvbik7DQotICAgICAgICAgICAgdHRlbXAgPSB0Ow0KLSAgICAgICAgfQ0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh0dGVtcCk7DQotDQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHRlc3RBc3luY0NhbGxiYWNrTWVzc2FnZU1vZGVfYmFkSG9zdE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJ0ZXN0OiAiICsgZ2V0TmFtZSgpKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgSkFYLVdTIGNsaWVudCBhcnRpZmFjdHMNCi0gICAgICAgIFNlcnZpY2Ugc3ZjID0gU2VydmljZS5jcmVhdGUoRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlFOQU1FX1NFUlZJQ0UpOw0KLSAgICAgICAgc3ZjLmFkZFBvcnQoRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlFOQU1FX1BPUlQsIG51bGwsIERpc3BhdGNoVGVzdENvbnN0YW50cy5CQURVUkwpOw0KLSAgICAgICAgRGlzcGF0Y2g8U3RyaW5nPiBkaXNwYXRjaCA9IHN2Yy5jcmVhdGVEaXNwYXRjaChEaXNwYXRjaFRlc3RDb25zdGFudHMuUU5BTUVfUE9SVCwgDQotICAgICAgICAgICAgICAgIFN0cmluZy5jbGFzcywgU2VydmljZS5Nb2RlLk1FU1NBR0UpOw0KLQ0KLSAgICAgICAgLy8gQ3JlYXRlIHRoZSBjYWxsYmFjayBmb3IgYXN5bmMgcmVzcG9uc2VzDQotICAgICAgICBBc3luY0NhbGxiYWNrPFN0cmluZz4gY2FsbGJhY2sgPSBuZXcgQXN5bmNDYWxsYmFjazxTdHJpbmc+KCk7DQotDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gSW52b2tpbmcgYXN5bmMgKGNhbGxiYWNrKSBEaXNwYXRjaCB3aXRoIE1lc3NhZ2UgTW9kZSIpOw0KLSAgICAgICAgRnV0dXJlPD8+IG1vbml0b3IgPSBkaXNwYXRjaC5pbnZva2VBc3luYyhEaXNwYXRjaFRlc3RDb25zdGFudHMuc2FtcGxlU29hcE1lc3NhZ2UsIGNhbGxiYWNrKTsNCi0gICAgDQotICAgICAgICB3aGlsZSAoIW1vbml0b3IuaXNEb25lKCkpIHsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gQXN5bmMgaW52b2NhdGlvbiBzdGlsbCBub3QgY29tcGxldGUiKTsNCi0gICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIGlmIChjYWxsYmFjay5oYXNFcnJvcigpKSB7DQotICAgICAgICAgICAgVGhyb3dhYmxlIHQgPSBjYWxsYmFjay5nZXRFcnJvcigpOw0KLSAgICAgICAgICAgIHQucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh0LmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBkb2VzIG5vdCBtYXRjaCBleHBlY3RlZCB0eXBlIEV4ZWN1dGlvbkV4Y2VwdGlvbiIsIHQgaW5zdGFuY2VvZiBFeGVjdXRpb25FeGNlcHRpb24pOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIFRocm93YWJsZSBjYXVzZSA9IHQuZ2V0Q2F1c2UoKTsNCi0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKCJUaGVyZSBtdXN0IGJlIGEgY2F1c2UgdW5kZXIgdGhlIEV4ZWN1dGlvbkV4Y2VwdGlvbiIsIGNhdXNlKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGNhdXNlLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBkb2VzIG5vdCBtYXRjaCBleHBlY3RlZCB0eXBlIFdlYlNlcnZpY2VFeGNlcHRpb24iICxjYXVzZSBpbnN0YW5jZW9mIFdlYlNlcnZpY2VFeGNlcHRpb24pOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIFRocm93YWJsZSBob3N0RXhjZXB0aW9uID0gdC5nZXRDYXVzZSgpLmdldENhdXNlKCk7DQotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCgiVGhlcmUgbXVzdCBiZSBhIGNhdXNlIHVuZGVyIHRoZSBXZWJTZXJ2aWNlRXhjZXB0aW9uIiwgaG9zdEV4Y2VwdGlvbik7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShob3N0RXhjZXB0aW9uLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBkb2VzIG5vdCBtYXRjaCBleHBlY3RlZCB0eXBlIFVua25vd25Ib3N0RXhjZXB0aW9uIiwgaG9zdEV4Y2VwdGlvbiBpbnN0YW5jZW9mIFVua25vd25Ib3N0RXhjZXB0aW9uKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgZmFpbCgiTm8gZmF1bHQgdGhyb3duLiAgU2hvdWxkIGhhdmUgcmV0cmlldmVkIGFuIFVua25vd25Ib3N0RXhjZXB0aW9uIGZyb20gY2FsbGJhY2siKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgLy8gSW52b2tlIGEgc2Vjb25kIHRpbWUgdG8gdmVyaWZ5DQotICAgICAgICAvLyBDcmVhdGUgdGhlIGNhbGxiYWNrIGZvciBhc3luYyByZXNwb25zZXMNCi0gICAgICAgIGNhbGxiYWNrID0gbmV3IEFzeW5jQ2FsbGJhY2s8U3RyaW5nPigpOw0KLQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEludm9raW5nIGFzeW5jIChjYWxsYmFjaykgRGlzcGF0Y2ggd2l0aCBNZXNzYWdlIE1vZGUiKTsNCi0gICAgICAgIG1vbml0b3IgPSBkaXNwYXRjaC5pbnZva2VBc3luYyhEaXNwYXRjaFRlc3RDb25zdGFudHMuc2FtcGxlU29hcE1lc3NhZ2UsIGNhbGxiYWNrKTsNCi0gICAgDQotICAgICAgICB3aGlsZSAoIW1vbml0b3IuaXNEb25lKCkpIHsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gQXN5bmMgaW52b2NhdGlvbiBzdGlsbCBub3QgY29tcGxldGUiKTsNCi0gICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIGlmIChjYWxsYmFjay5oYXNFcnJvcigpKSB7DQotICAgICAgICAgICAgVGhyb3dhYmxlIHQgPSBjYWxsYmFjay5nZXRFcnJvcigpOw0KLSAgICAgICAgICAgIHQucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh0LmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBkb2VzIG5vdCBtYXRjaCBleHBlY3RlZCB0eXBlIEV4ZWN1dGlvbkV4Y2VwdGlvbiIsIHQgaW5zdGFuY2VvZiBFeGVjdXRpb25FeGNlcHRpb24pOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIFRocm93YWJsZSBjYXVzZSA9IHQuZ2V0Q2F1c2UoKTsNCi0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKCJUaGVyZSBtdXN0IGJlIGEgY2F1c2UgdW5kZXIgdGhlIEV4ZWN1dGlvbkV4Y2VwdGlvbiIsIGNhdXNlKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGNhdXNlLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBkb2VzIG5vdCBtYXRjaCBleHBlY3RlZCB0eXBlIFdlYlNlcnZpY2VFeGNlcHRpb24iICxjYXVzZSBpbnN0YW5jZW9mIFdlYlNlcnZpY2VFeGNlcHRpb24pOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIFRocm93YWJsZSBob3N0RXhjZXB0aW9uID0gdC5nZXRDYXVzZSgpLmdldENhdXNlKCk7DQotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCgiVGhlcmUgbXVzdCBiZSBhIGNhdXNlIHVuZGVyIHRoZSBXZWJTZXJ2aWNlRXhjZXB0aW9uIiwgaG9zdEV4Y2VwdGlvbik7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShob3N0RXhjZXB0aW9uLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBkb2VzIG5vdCBtYXRjaCBleHBlY3RlZCB0eXBlIFVua25vd25Ib3N0RXhjZXB0aW9uIiwgaG9zdEV4Y2VwdGlvbiBpbnN0YW5jZW9mIFVua25vd25Ib3N0RXhjZXB0aW9uKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgZmFpbCgiTm8gZmF1bHQgdGhyb3duLiAgU2hvdWxkIGhhdmUgcmV0cmlldmVkIGFuIFVua25vd25Ib3N0RXhjZXB0aW9uIGZyb20gY2FsbGJhY2siKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIHZvaWQgdGVzdEFzeW5jUG9sbGluZ1BheWxvYWRNb2RlX2JhZEhvc3ROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygidGVzdDogIiArIGdldE5hbWUoKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIEluaXRpYWxpemUgdGhlIEpBWC1XUyBjbGllbnQgYXJ0aWZhY3RzDQotICAgICAgICBTZXJ2aWNlIHN2YyA9IFNlcnZpY2UuY3JlYXRlKERpc3BhdGNoVGVzdENvbnN0YW50cy5RTkFNRV9TRVJWSUNFKTsNCi0gICAgICAgIHN2Yy5hZGRQb3J0KERpc3BhdGNoVGVzdENvbnN0YW50cy5RTkFNRV9QT1JULCBudWxsLCBEaXNwYXRjaFRlc3RDb25zdGFudHMuQkFEVVJMKTsNCi0gICAgICAgIERpc3BhdGNoPFN0cmluZz4gZGlzcGF0Y2ggPSBzdmMuY3JlYXRlRGlzcGF0Y2goRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlFOQU1FX1BPUlQsIA0KLSAgICAgICAgICAgICAgICBTdHJpbmcuY2xhc3MsIFNlcnZpY2UuTW9kZS5QQVlMT0FEKTsNCi0NCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBJbnZva2luZyBhc3luYyAocG9sbGluZykgRGlzcGF0Y2giKTsNCi0gICAgICAgIFJlc3BvbnNlPFN0cmluZz4gYXN5bmNSZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZUFzeW5jKERpc3BhdGNoVGVzdENvbnN0YW50cy5zYW1wbGVCb2R5Q29udGVudCk7DQotICAgICAgICAgICAgDQotICAgICAgICB3aGlsZSAoIWFzeW5jUmVzcG9uc2UuaXNEb25lKCkpIHsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gQXN5bmMgaW52b2NhdGlvbiBzdGlsbCBub3QgY29tcGxldGUiKTsNCi0gICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIFRocm93YWJsZSB0dGVtcCA9IG51bGw7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIGFzeW5jUmVzcG9uc2UuZ2V0KCk7DQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgew0KLSAgICAgICAgICAgIGFzc2VydFRydWUodCBpbnN0YW5jZW9mIEV4ZWN1dGlvbkV4Y2VwdGlvbik7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh0LmdldENhdXNlKCkgaW5zdGFuY2VvZiBXZWJTZXJ2aWNlRXhjZXB0aW9uKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHQuZ2V0Q2F1c2UoKS5nZXRDYXVzZSgpIGluc3RhbmNlb2YgVW5rbm93bkhvc3RFeGNlcHRpb24pOw0KLSAgICAgICAgICAgIHR0ZW1wID0gdDsNCi0gICAgICAgIH0NCi0gICAgICAgIGFzc2VydE5vdE51bGwodHRlbXApOw0KLSAgICAgICAgDQotICAgICAgICANCi0gICAgICAgIC8vIEludm9rZSBhIHNlY29uZCB0aW1lIHRvIHZlcmlmeQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEludm9raW5nIGFzeW5jIChwb2xsaW5nKSBEaXNwYXRjaCIpOw0KLSAgICAgICAgYXN5bmNSZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZUFzeW5jKERpc3BhdGNoVGVzdENvbnN0YW50cy5zYW1wbGVCb2R5Q29udGVudCk7DQotICAgICAgICAgICAgDQotICAgICAgICB3aGlsZSAoIWFzeW5jUmVzcG9uc2UuaXNEb25lKCkpIHsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gQXN5bmMgaW52b2NhdGlvbiBzdGlsbCBub3QgY29tcGxldGUiKTsNCi0gICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIHR0ZW1wID0gbnVsbDsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgYXN5bmNSZXNwb25zZS5nZXQoKTsNCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh0IGluc3RhbmNlb2YgRXhlY3V0aW9uRXhjZXB0aW9uKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHQuZ2V0Q2F1c2UoKSBpbnN0YW5jZW9mIFdlYlNlcnZpY2VFeGNlcHRpb24pOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUodC5nZXRDYXVzZSgpLmdldENhdXNlKCkgaW5zdGFuY2VvZiBVbmtub3duSG9zdEV4Y2VwdGlvbik7DQotICAgICAgICAgICAgdHRlbXAgPSB0Ow0KLSAgICAgICAgfQ0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh0dGVtcCk7DQotICAgIH0NCi0gICAgDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kaXNwYXRjaC9zZXJ2ZXIvTUVUQS1JTkYvT01FbGVtZW50UHJvdmlkZXJTZXJ2aWNlLndzZGwgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGlzcGF0Y2gvc2VydmVyL01FVEEtSU5GL09NRWxlbWVudFByb3ZpZGVyU2VydmljZS53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGEzZjIwLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kaXNwYXRjaC9zZXJ2ZXIvTUVUQS1JTkYvT01FbGVtZW50UHJvdmlkZXJTZXJ2aWNlLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi0NCi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08d3NkbDpkZWZpbml0aW9ucyB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Rlc3QvT01FTEVNRU5UIg0KLSAgICB4bWxuczppbXBsPSJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy90ZXN0L09NRUxFTUVOVCIgDQotICAgIHhtbG5zOmludGY9Imh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Rlc3QvT01FTEVNRU5UIiANCi0gICAgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIA0KLSAgICB4bWxuczp3c2Rsc29hcDEyPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAxMi8iIA0KLSAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4NCi0gPHdzZGw6dHlwZXM+DQotICA8c2NoZW1hIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Rlc3QvT01FTEVNRU5UIiANCi0gICAgICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgDQotICAgICAgICB4bWxuczppbXBsPSJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy90ZXN0L09NRUxFTUVOVCIgDQotICAgICAgICB4bWxuczppbnRmPSJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy90ZXN0L09NRUxFTUVOVCIgDQotICAgICAgICB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIgDQotICAgICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJlY2hvT01FbGVtZW50Ij4NCi0gICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgPHNlcXVlbmNlPg0KLSAgICAgIDxlbGVtZW50IG5hbWU9ImlucHV0IiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHNkOmFueVR5cGUiLz4NCi0gICAgIDwvc2VxdWVuY2U+DQotICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLSAgIDxlbGVtZW50IG5hbWU9ImVjaG9PTUVsZW1lbnRSZXNwb25zZSI+DQotICAgIDxjb21wbGV4VHlwZT4NCi0gICAgIDxzZXF1ZW5jZT4NCi0gICAgICA8ZWxlbWVudCBuYW1lPSJlY2hvT01FbGVtZW50UmV0dXJuIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHNkOmFueVR5cGUiLz4NCi0gICAgIDwvc2VxdWVuY2U+DQotICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLSAgICAgICAgPC9zY2hlbWE+DQotIDwvd3NkbDp0eXBlcz4NCi0NCi0gICA8d3NkbDptZXNzYWdlIG5hbWU9ImVjaG9PTUVsZW1lbnRSZXNwb25zZSI+DQotDQotICAgICAgPHdzZGw6cGFydCBlbGVtZW50PSJpbXBsOmVjaG9PTUVsZW1lbnRSZXNwb25zZSIgbmFtZT0icGFyYW1ldGVycyIvPg0KLQ0KLSAgIDwvd3NkbDptZXNzYWdlPg0KLQ0KLSAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0iZWNob09NRWxlbWVudFJlcXVlc3QiPg0KLQ0KLSAgICAgIDx3c2RsOnBhcnQgZWxlbWVudD0iaW1wbDplY2hvT01FbGVtZW50IiBuYW1lPSJwYXJhbWV0ZXJzIi8+DQotDQotICAgPC93c2RsOm1lc3NhZ2U+DQotDQotICAgPHdzZGw6cG9ydFR5cGUgbmFtZT0iRWNobyI+DQotDQotICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImVjaG9PTUVsZW1lbnQiPg0KLQ0KLSAgICAgICAgIDx3c2RsOmlucHV0IG1lc3NhZ2U9ImltcGw6ZWNob09NRWxlbWVudFJlcXVlc3QiIG5hbWU9ImVjaG9PTUVsZW1lbnRSZXF1ZXN0Ii8+DQotDQotICAgICAgICAgPHdzZGw6b3V0cHV0IG1lc3NhZ2U9ImltcGw6ZWNob09NRWxlbWVudFJlc3BvbnNlIiBuYW1lPSJlY2hvT01FbGVtZW50UmVzcG9uc2UiLz4NCi0NCi0gICAgICA8L3dzZGw6b3BlcmF0aW9uPg0KLQ0KLSAgIDwvd3NkbDpwb3J0VHlwZT4NCi0NCi0gICA8d3NkbDpiaW5kaW5nIG5hbWU9Ik9NRWxlbWVudEJpbmRpbmciIHR5cGU9ImltcGw6RWNobyI+DQotDQotICAgICAgPHdzZGxzb2FwMTI6YmluZGluZyBzdHlsZT0iZG9jdW1lbnQiIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIi8+DQotDQotICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImVjaG9PTUVsZW1lbnQiPg0KLQ0KLSAgICAgICAgIDx3c2Rsc29hcDEyOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4NCi0NCi0gICAgICAgICA8d3NkbDppbnB1dCBuYW1lPSJlY2hvT01FbGVtZW50UmVxdWVzdCI+DQotDQotICAgICAgICAgICAgPHdzZGxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiLz4NCi0NCi0gICAgICAgICA8L3dzZGw6aW5wdXQ+DQotDQotICAgICAgICAgPHdzZGw6b3V0cHV0IG5hbWU9ImVjaG9PTUVsZW1lbnRSZXNwb25zZSI+DQotDQotICAgICAgICAgICAgPHdzZGxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiLz4NCi0NCi0gICAgICAgICA8L3dzZGw6b3V0cHV0Pg0KLQ0KLSAgICAgIDwvd3NkbDpvcGVyYXRpb24+DQotDQotICAgPC93c2RsOmJpbmRpbmc+DQotDQotICAgPHdzZGw6c2VydmljZSBuYW1lPSJPTUVsZW1lbnRQcm92aWRlclNlcnZpY2UiPg0KLQ0KLSAgICAgIDx3c2RsOnBvcnQgYmluZGluZz0iaW1wbDpPTUVsZW1lbnRCaW5kaW5nIiBuYW1lPSJPTUVsZW1lbnRQcm92aWRlclBvcnQiPg0KLQ0KLSAgICAgICAgIDx3c2Rsc29hcDEyOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6OTA4MC9heGlzMi9zZXJ2aWNlcy9PTUVsZW1lbnRQcm92aWRlclNlcnZpY2UiLz4NCi0NCi0gICAgICA8L3dzZGw6cG9ydD4NCi0NCi0gICA8L3dzZGw6c2VydmljZT4NCi0NCi08L3dzZGw6ZGVmaW5pdGlvbnM+DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rpc3BhdGNoL3NlcnZlci9NRVRBLUlORi9TT0FQMTJQcm92aWRlclNlcnZpY2Uud3NkbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kaXNwYXRjaC9zZXJ2ZXIvTUVUQS1JTkYvU09BUDEyUHJvdmlkZXJTZXJ2aWNlLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4M2UxNTguLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rpc3BhdGNoL3NlcnZlci9NRVRBLUlORi9TT0FQMTJQcm92aWRlclNlcnZpY2Uud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLQ0KLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTx3c2RsOmRlZmluaXRpb25zIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvdGVzdC9TT0FQMTIiDQotICAgIHhtbG5zOmltcGw9Imh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Rlc3QvU09BUDEyIiANCi0gICAgeG1sbnM6aW50Zj0iaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvdGVzdC9TT0FQMTIiIA0KLSAgICB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIgDQotICAgIHhtbG5zOndzZGxzb2FwMTI9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcDEyLyIgDQotICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPg0KLSA8d3NkbDp0eXBlcz4NCi0gIDxzY2hlbWEgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvdGVzdC9TT0FQMTIiIA0KLSAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiANCi0gICAgICAgIHhtbG5zOmltcGw9Imh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Rlc3QvU09BUDEyIiANCi0gICAgICAgIHhtbG5zOmludGY9Imh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Rlc3QvU09BUDEyIiANCi0gICAgICAgIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiANCi0gICAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9ImVjaG9TdHJpbmciPg0KLSAgICA8Y29tcGxleFR5cGU+DQotICAgICA8c2VxdWVuY2U+DQotICAgICAgPGVsZW1lbnQgbmFtZT0iaW5wdXQiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+DQotICAgICA8L3NlcXVlbmNlPg0KLSAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0gICA8ZWxlbWVudCBuYW1lPSJlY2hvU3RyaW5nUmVzcG9uc2UiPg0KLSAgICA8Y29tcGxleFR5cGU+DQotICAgICA8c2VxdWVuY2U+DQotICAgICAgPGVsZW1lbnQgbmFtZT0iZWNob1N0cmluZ1JldHVybiIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzZDpzdHJpbmciLz4NCi0gICAgIDwvc2VxdWVuY2U+DQotICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLSAgIA0KLSAgIDwhLS0NCi0gICA8ZWxlbWVudCBuYW1lPSJlY2hvU3RyaW5nUmVxdWVzdCI+DQotICAgIDxjb21wbGV4VHlwZT4NCi0gICAgIDxzZXF1ZW5jZT4NCi0gICAgICA8ZWxlbWVudCBuYW1lPSJlY2hvU3RyaW5nSW5wdXQiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+DQotICAgICA8L3NlcXVlbmNlPg0KLSAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0gICAtLT4NCi0gICAgICAgIDwvc2NoZW1hPg0KLSA8L3dzZGw6dHlwZXM+DQotDQotICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJlY2hvU3RyaW5nUmVzcG9uc2UiPg0KLQ0KLSAgICAgIDx3c2RsOnBhcnQgZWxlbWVudD0iaW1wbDplY2hvU3RyaW5nUmVzcG9uc2UiIG5hbWU9InBhcmFtZXRlcnMiLz4NCi0NCi0gICA8L3dzZGw6bWVzc2FnZT4NCi0NCi0gICA8d3NkbDptZXNzYWdlIG5hbWU9ImVjaG9TdHJpbmdSZXF1ZXN0Ij4NCi0NCi0gICAgICA8d3NkbDpwYXJ0IGVsZW1lbnQ9ImltcGw6ZWNob1N0cmluZyIgbmFtZT0icGFyYW1ldGVycyIvPg0KLQ0KLSAgIDwvd3NkbDptZXNzYWdlPg0KLQ0KLSAgIDx3c2RsOnBvcnRUeXBlIG5hbWU9IkVjaG8iPg0KLQ0KLSAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJlY2hvU3RyaW5nIj4NCi0NCi0gICAgICAgICA8d3NkbDppbnB1dCBtZXNzYWdlPSJpbXBsOmVjaG9TdHJpbmdSZXF1ZXN0IiBuYW1lPSJlY2hvU3RyaW5nUmVxdWVzdCIvPg0KLQ0KLSAgICAgICAgIDx3c2RsOm91dHB1dCBtZXNzYWdlPSJpbXBsOmVjaG9TdHJpbmdSZXNwb25zZSIgbmFtZT0iZWNob1N0cmluZ1Jlc3BvbnNlIi8+DQotDQotICAgICAgPC93c2RsOm9wZXJhdGlvbj4NCi0NCi0gICA8L3dzZGw6cG9ydFR5cGU+DQotDQotICAgPHdzZGw6YmluZGluZyBuYW1lPSJTT0FQMTJCaW5kaW5nIiB0eXBlPSJpbXBsOkVjaG8iPg0KLQ0KLSAgICAgIDx3c2Rsc29hcDEyOmJpbmRpbmcgc3R5bGU9ImRvY3VtZW50IiB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIvPg0KLQ0KLSAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJlY2hvU3RyaW5nIj4NCi0NCi0gICAgICAgICA8d3NkbHNvYXAxMjpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+DQotDQotICAgICAgICAgPHdzZGw6aW5wdXQgbmFtZT0iZWNob1N0cmluZ1JlcXVlc3QiPg0KLQ0KLSAgICAgICAgICAgIDx3c2Rsc29hcDEyOmJvZHkgdXNlPSJsaXRlcmFsIi8+DQotDQotICAgICAgICAgPC93c2RsOmlucHV0Pg0KLQ0KLSAgICAgICAgIDx3c2RsOm91dHB1dCBuYW1lPSJlY2hvU3RyaW5nUmVzcG9uc2UiPg0KLQ0KLSAgICAgICAgICAgIDx3c2Rsc29hcDEyOmJvZHkgdXNlPSJsaXRlcmFsIi8+DQotDQotICAgICAgICAgPC93c2RsOm91dHB1dD4NCi0NCi0gICAgICA8L3dzZGw6b3BlcmF0aW9uPg0KLQ0KLSAgIDwvd3NkbDpiaW5kaW5nPg0KLQ0KLSAgIDx3c2RsOnNlcnZpY2UgbmFtZT0iU09BUDEyUHJvdmlkZXJTZXJ2aWNlIj4NCi0NCi0gICAgICA8d3NkbDpwb3J0IGJpbmRpbmc9ImltcGw6U09BUDEyQmluZGluZyIgbmFtZT0iU09BUDEyUHJvdmlkZXJQb3J0Ij4NCi0NCi0gICAgICAgICA8d3NkbHNvYXAxMjphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjkwODAvYXhpczIvc2VydmljZXMvU09BUDEyU2VydmljZSIvPg0KLQ0KLSAgICAgIDwvd3NkbDpwb3J0Pg0KLQ0KLSAgIDwvd3NkbDpzZXJ2aWNlPg0KLQ0KLTwvd3NkbDpkZWZpbml0aW9ucz4NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGlzcGF0Y2gvc2VydmVyL09NRWxlbWVudFByb3ZpZGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGlzcGF0Y2gvc2VydmVyL09NRWxlbWVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhMzkwNzguLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rpc3BhdGNoL3NlcnZlci9PTUVsZW1lbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGlzcGF0Y2guc2VydmVyOw0KLQ0KLWltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsNCi0NCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxJbnB1dEZhY3Rvcnk7DQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLkJpbmRpbmdUeXBlOw0KLWltcG9ydCBqYXZheC54bWwud3MuUHJvdmlkZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZU1vZGU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlUHJvdmlkZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5zb2FwLlNPQVBCaW5kaW5nOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01OYW1lc3BhY2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01UZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuYnVpbGRlci5TdEFYT01CdWlsZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEJvZHk7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLmltcGwubGxvbS5zb2FwMTIuU09BUDEyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5FeGNlcHRpb25GYWN0b3J5Ow0KLQ0KLS8qKg0KLSAqIEEgUHJvdmlkZXImbHQ7T01FbGVtZW50Jmd0OyBpbXBsZW1lbnRhdGlvbiB1c2VkIHRvIHRlc3Qgc2VuZGluZyBhbmQgDQotICogcmVjZWl2aW5nIFNPQVAgMS4yIG1lc3NhZ2VzLg0KLSAqLw0KLUBXZWJTZXJ2aWNlUHJvdmlkZXIoDQotICAgICAgICBzZXJ2aWNlTmFtZT0iT01FbGVtZW50UHJvdmlkZXJTZXJ2aWNlIiwgDQotICAgICAgICB3c2RsTG9jYXRpb249Ik1FVEEtSU5GL09NRWxlbWVudFByb3ZpZGVyU2VydmljZS53c2RsIiwgDQotICAgICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Rlc3QvT01FTEVNRU5UIikNCi1AQmluZGluZ1R5cGUoU09BUEJpbmRpbmcuU09BUDEySFRUUF9CSU5ESU5HKQ0KLUBTZXJ2aWNlTW9kZSh2YWx1ZT1TZXJ2aWNlLk1vZGUuTUVTU0FHRSkNCi1wdWJsaWMgY2xhc3MgT01FbGVtZW50UHJvdmlkZXIgaW1wbGVtZW50cyBQcm92aWRlcjxPTUVsZW1lbnQ+IHsNCi0gICAgDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBzYW1wbGVSZXNwb25zZSA9IA0KLSAgICAgICAgIjx0ZXN0OmVjaG9PTUVsZW1lbnQgeG1sbnM6dGVzdD1cImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Rlc3QvT01FTEVNRU5UXCI+IiArDQotICAgICAgICAiPHRlc3Q6aW5wdXQ+U0FNUExFIFJFU1BPTlNFIE1FU1NBR0U8L3Rlc3Q6aW5wdXQ+IiArDQotICAgICAgICAiPC90ZXN0OmVjaG9PTUVsZW1lbnQ+IjsNCi0gICAgDQotICAgIHByaXZhdGUgc3RhdGljIFhNTElucHV0RmFjdG9yeSBpbnB1dEZhY3RvcnkgPSBYTUxJbnB1dEZhY3RvcnkubmV3SW5zdGFuY2UoKTsNCi0gICAgDQotICAgIHB1YmxpYyBPTUVsZW1lbnQgaW52b2tlKE9NRWxlbWVudCBvYmopIHsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJNSUtFOiAiICsgb2JqLnRvU3RyaW5nV2l0aENvbnN1bWUoKSk7DQotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTUlLRTogUFJPQkxFTSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgT01FbGVtZW50IHBheWxvYWQgPSBjcmVhdGVQYXlsb2FkKCk7DQotICAgICAgICANCi0gICAgICAgIFNPQVBGYWN0b3J5IGZhY3RvcnkgPSBuZXcgU09BUDEyRmFjdG9yeSgpOw0KLSAgICAgICAgU09BUEVudmVsb3BlIGVudiA9IGZhY3RvcnkuY3JlYXRlU09BUEVudmVsb3BlKCk7DQotICAgICAgICBTT0FQQm9keSBib2R5ID0gZmFjdG9yeS5jcmVhdGVTT0FQQm9keShlbnYpOw0KLSAgICAgICAgDQotICAgICAgICBib2R5LmFkZENoaWxkKHBheWxvYWQpOw0KLSAgICAgICAgDQotICAgICAgICByZXR1cm4gZW52Ow0KLSAgICB9DQotICAgIA0KLSAgICBwcml2YXRlIE9NRWxlbWVudCBjcmVhdGVQYXlsb2FkKCkgew0KLSAgICAgICAgT01GYWN0b3J5IGZhYyA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpOw0KLSAgICAgICAgT01OYW1lc3BhY2Ugb21OcyA9IGZhYy5jcmVhdGVPTU5hbWVzcGFjZSgiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvdGVzdC9TT0FQRU5WRUxPUEUiLCAidGVzdCIpOw0KLSAgICAgICAgDQotICAgICAgICBPTUVsZW1lbnQgcmVzcG9uc2UgPSBmYWMuY3JlYXRlT01FbGVtZW50KCJlY2hvT01FbGVtZW50Iiwgb21Ocyk7DQotICAgICAgICANCi0gICAgICAgIE9NRWxlbWVudCBvdXRwdXQgPSBmYWMuY3JlYXRlT01FbGVtZW50KCJvdXRwdXQiLCBvbU5zKTsNCi0gICAgICAgIHJlc3BvbnNlLmFkZENoaWxkKG91dHB1dCk7DQotICAgICAgICANCi0gICAgICAgIE9NRWxlbWVudCBkYXRhID0gZmFjLmNyZWF0ZU9NRWxlbWVudCgiZGF0YSIsIG9tTnMpOw0KLSAgICAgICAgb3V0cHV0LmFkZENoaWxkKGRhdGEpOw0KLSAgICAgICAgDQotICAgICAgICBPTVRleHQgYmluYXJ5RGF0YSA9IGZhYy5jcmVhdGVPTVRleHQoIlNBTVBMRSBSRVNQT05TRSBNRVNTQUdFIik7DQotICAgICAgICBkYXRhLmFkZENoaWxkKGJpbmFyeURhdGEpOw0KLSAgICAgICAgDQotICAgICAgICByZXR1cm4gcmVzcG9uc2U7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rpc3BhdGNoL3NlcnZlci9TT0FQMTJQcm92aWRlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rpc3BhdGNoL3NlcnZlci9TT0FQMTJQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWEwZDFlLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kaXNwYXRjaC9zZXJ2ZXIvU09BUDEyUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGlzcGF0Y2guc2VydmVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLlRlc3RMb2dnZXI7DQotDQotaW1wb3J0IGphdmF4LnhtbC53cy5CaW5kaW5nVHlwZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLlByb3ZpZGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZVByb3ZpZGVyOw0KLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5TT0FQQmluZGluZzsNCi0NCi0vKioNCi0gKiBBIFByb3ZpZGVyJmx0O1N0cmluZyZndDsgaW1wbGVtZW50YXRpb24gdXNlZCB0byB0ZXN0IHNlbmRpbmcgYW5kIA0KLSAqIHJlY2VpdmluZyBTT0FQIDEuMiBtZXNzYWdlcy4NCi0gKi8NCi1AV2ViU2VydmljZVByb3ZpZGVyKA0KLSAgICAgICAgc2VydmljZU5hbWU9IlNPQVAxMlByb3ZpZGVyU2VydmljZSIsIA0KLSAgICAgICAgd3NkbExvY2F0aW9uPSJNRVRBLUlORi9TT0FQMTJQcm92aWRlclNlcnZpY2Uud3NkbCIsIA0KLSAgICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy90ZXN0L1NPQVAxMiIpDQotQEJpbmRpbmdUeXBlKFNPQVBCaW5kaW5nLlNPQVAxMkhUVFBfQklORElORykNCi1wdWJsaWMgY2xhc3MgU09BUDEyUHJvdmlkZXIgaW1wbGVtZW50cyBQcm92aWRlcjxTdHJpbmc+IHsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHNhbXBsZVJlc3BvbnNlID0gDQotICAgICAgICAiPHRlc3Q6ZWNob1N0cmluZ1Jlc3BvbnNlIHhtbG5zOnRlc3Q9XCJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy90ZXN0L1NPQVAxMlwiPiIgKw0KLSAgICAgICAgIjx0ZXN0Om91dHB1dD5TQU1QTEUgUkVRVUVTVCBNRVNTQUdFPC90ZXN0Om91dHB1dD4iICsNCi0gICAgICAgICI8L3Rlc3Q6ZWNob1N0cmluZ1Jlc3BvbnNlPiI7DQotICAgIA0KLSAgICBwdWJsaWMgU3RyaW5nIGludm9rZShTdHJpbmcgb2JqKSB7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gcmVxdWVzdCByZWNlaXZlZCIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcob2JqKTsNCi0gICAgICAgIHJldHVybiBzYW1wbGVSZXNwb25zZTsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZnJhbWV3b3JrL0Fic3RyYWN0VGVzdENhc2UuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9mcmFtZXdvcmsvQWJzdHJhY3RUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWNkMzkyLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9mcmFtZXdvcmsvQWJzdHJhY3RUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5mcmFtZXdvcms7DQotDQotaW1wb3J0IGp1bml0LmV4dGVuc2lvbnMuVGVzdFNldHVwOw0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLlRlc3RMb2dnZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouQmFzaWNDb25maWd1cmF0b3I7DQotDQotcHVibGljIGNsYXNzIEFic3RyYWN0VGVzdENhc2UgZXh0ZW5kcyBUZXN0Q2FzZSB7DQotICAgIHB1YmxpYyBBYnN0cmFjdFRlc3RDYXNlKCkgew0KLSAgICAgICAgc3VwZXIoKTsNCi0gICAgfQ0KLQ0KLSAgICBzdGF0aWMgew0KLSAgICAgICAgQmFzaWNDb25maWd1cmF0b3IuY29uZmlndXJlKCk7DQotICAgIH0NCi0gICAgDQotICAgIC8qDQotICAgICAqIHVzZXJzIG1heSBwYXNzIGluIHRoZWlyIG93biByZXBvc2l0b3J5RGlyIHBhdGggYW5kIHBhdGggdG8gY3VzdG9tIGNvbmZpZ3VyYXRpb24gZmlsZS4NCi0gICAgICogUGFzc2luZyAnbnVsbCcgZm9yIGVpdGhlciBwYXJhbSB3aWxsIHVzZSB0aGUgZGVmYXVsdA0KLSAgICAgKi8NCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBUZXN0IGdldFRlc3RTZXR1cChUZXN0IHRlc3QsIGZpbmFsIFN0cmluZyByZXBvc2l0b3J5RGlyLCBmaW5hbCBTdHJpbmcgYXhpczJ4bWwpIHsNCi0gICAgICAgIHJldHVybiBuZXcgVGVzdFNldHVwKHRlc3QpIHsNCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiU3RhcnRpbmcgdGhlIHNlcnZlciBmb3I6ICIgK3RoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOw0KLSAgICAgICAgICAgICAgICBTdGFydFNlcnZlciBzdGFydFNlcnZlciA9IG5ldyBTdGFydFNlcnZlcigic2VydmVyMSIpOw0KLSAgICAgICAgICAgICAgICBzdGFydFNlcnZlci50ZXN0U3RhcnRTZXJ2ZXIocmVwb3NpdG9yeURpciwgYXhpczJ4bWwpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiU3RvcHBpbmcgdGhlIHNlcnZlciBmb3I6ICIgK3RoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOw0KLSAgICAgICAgICAgICAgICBTdG9wU2VydmVyIHN0b3BTZXJ2ZXIgPSBuZXcgU3RvcFNlcnZlcigic2VydmVyMSIpOw0KLSAgICAgICAgICAgICAgICBzdG9wU2VydmVyLnRlc3RTdG9wU2VydmVyKCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIFRlc3QgZ2V0VGVzdFNldHVwKFRlc3QgdGVzdCkgew0KLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U2V0dXAodGVzdCkgew0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJTdGFydGluZyB0aGUgc2VydmVyIGZvcjogIiArdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSk7DQotICAgICAgICAgICAgICAgIFN0YXJ0U2VydmVyIHN0YXJ0U2VydmVyID0gbmV3IFN0YXJ0U2VydmVyKCJzZXJ2ZXIxIik7DQotICAgICAgICAgICAgICAgIHN0YXJ0U2VydmVyLnRlc3RTdGFydFNlcnZlcigpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiU3RvcHBpbmcgdGhlIHNlcnZlciBmb3I6ICIgK3RoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOw0KLSAgICAgICAgICAgICAgICBTdG9wU2VydmVyIHN0b3BTZXJ2ZXIgPSBuZXcgU3RvcFNlcnZlcigic2VydmVyMSIpOw0KLSAgICAgICAgICAgICAgICBzdG9wU2VydmVyLnRlc3RTdG9wU2VydmVyKCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZnJhbWV3b3JrL1N0YXJ0U2VydmVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZnJhbWV3b3JrL1N0YXJ0U2VydmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwNmQ2ZTcuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2ZyYW1ld29yay9TdGFydFNlcnZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5mcmFtZXdvcms7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51dGlsaXR5LlNpbXBsZVNlcnZlcjsNCi0NCi1wdWJsaWMgY2xhc3MgU3RhcnRTZXJ2ZXIgZXh0ZW5kcyBUZXN0Q2FzZSB7DQotDQotICAgIHB1YmxpYyBTdGFydFNlcnZlcihTdHJpbmcgbmFtZSkgew0KLSAgICAgICAgc3VwZXIobmFtZSk7DQotICAgIH0NCi0gICAgDQotICAgIC8qDQotICAgICAqIHVzZXJzIG1heSBwYXNzIGluIHRoZWlyIG93biByZXBvc2l0b3J5RGlyIHBhdGggYW5kIHBhdGggdG8gY3VzdG9tIGNvbmZpZ3VyYXRpb24gZmlsZS4NCi0gICAgICogUGFzc2luZyAnbnVsbCcgZm9yIGVpdGhlciBwYXJhbSB3aWxsIHVzZSB0aGUgZGVmYXVsdA0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdFN0YXJ0U2VydmVyKFN0cmluZyByZXBvc2l0b3J5RGlyLCBTdHJpbmcgYXhpczJ4bWwpIHsNCi0gICAgICAgIFNpbXBsZVNlcnZlciBzZXJ2ZXIgPSBuZXcgU2ltcGxlU2VydmVyKHJlcG9zaXRvcnlEaXIsIGF4aXMyeG1sKTsNCi0gICAgICAgIHNlcnZlci5zdGFydCgpOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhcnRTZXJ2ZXIoKSB7DQotICAgICAgICBTaW1wbGVTZXJ2ZXIgc2VydmVyID0gbmV3IFNpbXBsZVNlcnZlcigpOw0KLSAgICAgICAgc2VydmVyLnN0YXJ0KCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2ZyYW1ld29yay9TdG9wU2VydmVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZnJhbWV3b3JrL1N0b3BTZXJ2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk0Y2JmNS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZnJhbWV3b3JrL1N0b3BTZXJ2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZnJhbWV3b3JrOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MudXRpbGl0eS5TaW1wbGVTZXJ2ZXI7DQotDQotcHVibGljIGNsYXNzIFN0b3BTZXJ2ZXIgZXh0ZW5kcyBUZXN0Q2FzZSB7DQotDQotICAgIHB1YmxpYyBTdG9wU2VydmVyKFN0cmluZyBuYW1lKSB7DQotICAgICAgICBzdXBlcihuYW1lKTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIHZvaWQgdGVzdFN0b3BTZXJ2ZXIoKSB7DQotICAgICAgICBTaW1wbGVTZXJ2ZXIgc2VydmVyID0gbmV3IFNpbXBsZVNlcnZlcigpOw0KLSAgICAgICAgc2VydmVyLnN0b3AoKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvaGFuZGxlci9oZWFkZXIvRGVtb0hhbmRsZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9oYW5kbGVyL2hlYWRlci9EZW1vSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjEyN2E5Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9oYW5kbGVyL2hlYWRlci9EZW1vSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5oYW5kbGVyLmhlYWRlcjsNCi0NCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuTWVzc2FnZUNvbnRleHQ7DQotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLnNvYXAuU09BUEhhbmRsZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLnNvYXAuU09BUE1lc3NhZ2VDb250ZXh0Ow0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsNCi1pbXBvcnQgamF2YS51dGlsLlNldDsNCi0NCi1wdWJsaWMgY2xhc3MgRGVtb0hhbmRsZXIgaW1wbGVtZW50cyBTT0FQSGFuZGxlcjxTT0FQTWVzc2FnZUNvbnRleHQ+IHsNCi0NCi0gICAgcHVibGljIFNldDxRTmFtZT4gZ2V0SGVhZGVycygpIHsNCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRGVtb0hhbmRsZXIuZ2V0SGVhZGVycyBJbnZva2VkIGJ5IEpBWFdTIik7DQotICAgICAgICBTZXQ8UU5hbWU+IHJlc3VsdCA9IG5ldyBIYXNoU2V0PFFOYW1lPigpOw0KLSAgICAgICAgcmVzdWx0LmFkZChuZXcgUU5hbWUoImh0dHA6Ly9kZW1vLyIsICJteWhlYWRlciIpKTsNCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgY2xvc2UoTWVzc2FnZUNvbnRleHQgYXJnMCkgew0KLQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGhhbmRsZUZhdWx0KFNPQVBNZXNzYWdlQ29udGV4dCBhcmcwKSB7DQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYW5kbGVNZXNzYWdlKFNPQVBNZXNzYWdlQ29udGV4dCBhcmcwKSB7DQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkRlbW9IYW5kbGVyLmhhbmRsZU1lc3NhZ2UiKTsNCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotDQotDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9oYW5kbGVyL2hlYWRlci9EZW1vU2VydmljZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2hhbmRsZXIvaGVhZGVyL0RlbW9TZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwNmE2ZjYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2hhbmRsZXIvaGVhZGVyL0RlbW9TZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmhhbmRsZXIuaGVhZGVyOw0KLQ0KLWltcG9ydCBqYXZheC5qd3MuSGFuZGxlckNoYWluOw0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsNCi0NCi1AV2ViU2VydmljZShzZXJ2aWNlTmFtZT0iRGVtb1NlcnZpY2UiLA0KLQkJdGFyZ2V0TmFtZXNwYWNlPSJodHRwOmRlbW8vIiwNCi0JCXBvcnROYW1lID0gIkRlbW9TZXJ2aWNlUG9ydCIpDQotQEhhbmRsZXJDaGFpbihmaWxlPSJoYW5kbGVyLnhtbCIpDQotcHVibGljIGNsYXNzIERlbW9TZXJ2aWNlIHsNCi0NCi0gICAgcHVibGljIFN0cmluZyBlY2hvKFN0cmluZyBtc2cpICB7DQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkRlbW9TZXJ2aWNlLmVjaG8gY2FsbGVkIHdpdGggbXNnOiAiICsgbXNnKTsNCi0gICAgICAgIHJldHVybiAiSGVsbG8sICIgKyBtc2c7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2hhbmRsZXIvaGVhZGVyL01FVEEtSU5GL0RlbW9TZXJ2aWNlU2VydmljZS53c2RsIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2hhbmRsZXIvaGVhZGVyL01FVEEtSU5GL0RlbW9TZXJ2aWNlU2VydmljZS53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTk2NmQ4Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9oYW5kbGVyL2hlYWRlci9NRVRBLUlORi9EZW1vU2VydmljZVNlcnZpY2Uud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4NCi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08ZGVmaW5pdGlvbnMgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vZGVtby8iIG5hbWU9IkRlbW9TZXJ2aWNlU2VydmljZSIgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6dG5zPSJodHRwOi8vZGVtby8iIHhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+DQotICA8dHlwZXM+DQotICAgIDx4c2Q6c2NoZW1hPg0KLSAgICAgIDx4c2Q6aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL2RlbW8vIiBzY2hlbWFMb2NhdGlvbj0iRGVtb1NlcnZpY2VTZXJ2aWNlX3NjaGVtYTEueHNkIi8+DQotICAgIDwveHNkOnNjaGVtYT4NCi0gIDwvdHlwZXM+DQotICA8bWVzc2FnZSBuYW1lPSJlY2hvIj4NCi0gICAgPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0idG5zOmVjaG8iLz4NCi0gIDwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIG5hbWU9ImVjaG9SZXNwb25zZSI+DQotICAgIDxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9InRuczplY2hvUmVzcG9uc2UiLz4NCi0gIDwvbWVzc2FnZT4NCi0gIDxwb3J0VHlwZSBuYW1lPSJEZW1vU2VydmljZSI+DQotICAgIDxvcGVyYXRpb24gbmFtZT0iZWNobyI+DQotICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczplY2hvIi8+DQotICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6ZWNob1Jlc3BvbnNlIi8+DQotICAgIDwvb3BlcmF0aW9uPg0KLSAgPC9wb3J0VHlwZT4NCi0gIDxiaW5kaW5nIG5hbWU9IkRlbW9TZXJ2aWNlUG9ydEJpbmRpbmciIHR5cGU9InRuczpEZW1vU2VydmljZSI+DQotICAgIDxzb2FwOmJpbmRpbmcgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiIHN0eWxlPSJkb2N1bWVudCIvPg0KLSAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG8iPg0KLSAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4NCi0gICAgICA8aW5wdXQ+DQotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgIDwvaW5wdXQ+DQotICAgICAgPG91dHB1dD4NCi0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgPC9vdXRwdXQ+DQotICAgIDwvb3BlcmF0aW9uPg0KLSAgPC9iaW5kaW5nPg0KLSAgPHNlcnZpY2UgbmFtZT0iRGVtb1NlcnZpY2VTZXJ2aWNlIj4NCi0gICAgPHBvcnQgbmFtZT0iRGVtb1NlcnZpY2VQb3J0IiBiaW5kaW5nPSJ0bnM6RGVtb1NlcnZpY2VQb3J0QmluZGluZyI+DQotICAgICAgPHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo4MDgwL2F4aXMyL3NlcnZpY2VzL0RlbW9TZXJ2aWNlU2VydmljZSIvPg0KLSAgICA8L3BvcnQ+DQotICA8L3NlcnZpY2U+DQotPC9kZWZpbml0aW9ucz4NCi0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvaGFuZGxlci9oZWFkZXIvTUVUQS1JTkYvRGVtb1NlcnZpY2VTZXJ2aWNlX3NjaGVtYTEueHNkIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2hhbmRsZXIvaGVhZGVyL01FVEEtSU5GL0RlbW9TZXJ2aWNlU2VydmljZV9zY2hlbWExLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2EyZmQ4Yy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvaGFuZGxlci9oZWFkZXIvTUVUQS1JTkYvRGVtb1NlcnZpY2VTZXJ2aWNlX3NjaGVtYTEueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI/Pg0KLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTx4czpzY2hlbWEgdmVyc2lvbj0iMS4wIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9kZW1vLyIgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczp0bnM9Imh0dHA6Ly9kZW1vLyI+DQotDQotICA8eHM6ZWxlbWVudCBuYW1lPSJlY2hvIiB0eXBlPSJ0bnM6ZWNobyIvPg0KLQ0KLSAgPHhzOmVsZW1lbnQgbmFtZT0iZWNob1Jlc3BvbnNlIiB0eXBlPSJ0bnM6ZWNob1Jlc3BvbnNlIi8+DQotDQotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iZWNobyI+DQotICAgIDx4czpzZXF1ZW5jZT4NCi0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJhcmcwIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPg0KLSAgICA8L3hzOnNlcXVlbmNlPg0KLSAgPC94czpjb21wbGV4VHlwZT4NCi0NCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJlY2hvUmVzcG9uc2UiPg0KLSAgICA8eHM6c2VxdWVuY2U+DQotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0icmV0dXJuIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPg0KLSAgICA8L3hzOnNlcXVlbmNlPg0KLSAgPC94czpjb21wbGV4VHlwZT4NCi08L3hzOnNjaGVtYT4NCi0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvaGFuZGxlci9oZWFkZXIvTUVUQS1JTkYvc2VydmljZXMueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2hhbmRsZXIvaGVhZGVyL01FVEEtSU5GL3NlcnZpY2VzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTg4NTJhOC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvaGFuZGxlci9oZWFkZXIvTUVUQS1JTkYvc2VydmljZXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPHNlcnZpY2VHcm91cD4NCi0gPHNlcnZpY2UgbmFtZT0iRGVtb1NlcnZpY2VTZXJ2aWNlIj4NCi0gIDxtZXNzYWdlUmVjZWl2ZXJzPg0KLSAgIDxtZXNzYWdlUmVjZWl2ZXIgbWVwPSJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaW4tb3V0IiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zZXJ2ZXIuSkFYV1NNZXNzYWdlUmVjZWl2ZXIiLz4NCi0gIDwvbWVzc2FnZVJlY2VpdmVycz4NCi0gIDxwYXJhbWV0ZXIgbG9ja2VkPSJmYWxzZSIgbmFtZT0iU2VydmljZUNsYXNzIj5vcmcuYXBhY2hlLmF4aXMyLmpheHdzLmhhbmRsZXIuaGVhZGVyLkRlbW9TZXJ2aWNlPC9wYXJhbWV0ZXI+DQotICA8b3BlcmF0aW9uIG5hbWU9ImFkZE51bWJlcnMiIG1lcD0iaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC93c2RsL2luLW91dCI+DQotICAgIDxhY3Rpb25NYXBwaW5nLz4NCi0gIDwvb3BlcmF0aW9uPg0KLSAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvIiBtZXA9Imh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgvd3NkbC9pbi1vbmx5Ij4NCi0gICAgPGFjdGlvbk1hcHBpbmcvPg0KLSAgPC9vcGVyYXRpb24+DQotIDwvc2VydmljZT4NCi08L3NlcnZpY2VHcm91cD4NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvaGFuZGxlci9oZWFkZXIvaGFuZGxlci54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvaGFuZGxlci9oZWFkZXIvaGFuZGxlci54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliN2Q5YzYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2hhbmRsZXIvaGVhZGVyL2hhbmRsZXIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08andzOmhhbmRsZXItY2hhaW5zIHhtbG5zOmp3cz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIj4NCi0JPGp3czpoYW5kbGVyLWNoYWluIG5hbWU9ImRlbW8iPg0KLQkJPGp3czpoYW5kbGVyPg0KLQkJCTxqd3M6aGFuZGxlci1jbGFzcz4NCi0JCQkJb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5oYW5kbGVyLmhlYWRlci5EZW1vSGFuZGxlcg0KLQkJCTwvandzOmhhbmRsZXItY2xhc3M+DQotCQkJPGp3czpzb2FwLXJvbGU+aHR0cDovL0RlbW9IYW5kbGVyL1JvbGU8L2p3czpzb2FwLXJvbGU+DQotCQk8L2p3czpoYW5kbGVyPg0KLQk8L2p3czpoYW5kbGVyLWNoYWluPgkNCi08L2p3czpoYW5kbGVyLWNoYWlucz4NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvaGFuZGxlci9oZWFkZXIvdGVzdHMvSGFuZGxlclRlc3RzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvaGFuZGxlci9oZWFkZXIvdGVzdHMvSGFuZGxlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwZjcxODUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2hhbmRsZXIvaGVhZGVyL3Rlc3RzL0hhbmRsZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaGFuZGxlci5oZWFkZXIudGVzdHM7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLlRlc3RMb2dnZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZnJhbWV3b3JrLkFic3RyYWN0VGVzdENhc2U7DQotDQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5EaXNwYXRjaDsNCi1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5zb2FwLlNPQVBGYXVsdEV4Y2VwdGlvbjsNCi0NCi1wdWJsaWMgY2xhc3MgSGFuZGxlclRlc3RzIGV4dGVuZHMgQWJzdHJhY3RUZXN0Q2FzZSB7DQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsNCi0gICAgICAgIHJldHVybiBnZXRUZXN0U2V0dXAobmV3IFRlc3RTdWl0ZShIYW5kbGVyVGVzdHMuY2xhc3MpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SGFuZGxlcl9nZXRIZWFkZXJfaW52b2NhdGlvbigpIHsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygidGVzdDogIiArIGdldE5hbWUoKSk7DQotICAgICAgICBPYmplY3QgcmVzOw0KLSAgICAgICAgLy9BZGQgbXlIZWFkZXIgdG8gU09BUE1lc3NhZ2UgdGhhdCB3aWxsIGJlIGluamVjdGVkIGJ5IGhhbmRsZXIuZ2V0SGVhZGVyKCkuDQotICAgICAgICBTdHJpbmcgc29hcE1lc3NhZ2UgPQ0KLSAgICAgICAgICAgICAgICAiPHNvYXA6RW52ZWxvcGUgeG1sbnM6c29hcD1cImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvXCIgeG1sbnM6eHNpPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2VcIiB4bWxuczp4c2Q9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYVwiIHhtbG5zOmRlbW89XCJodHRwOi8vZGVtby9cIj48c29hcDpIZWFkZXI+IDxkZW1vOm15aGVhZGVyIHNvYXA6bXVzdFVuZGVyc3RhbmQ9XCIxXCIvPjwvc29hcDpIZWFkZXI+PHNvYXA6Qm9keT48ZGVtbzplY2hvPjxhcmcwPnRlc3Q8L2FyZzA+PC9kZW1vOmVjaG8+PC9zb2FwOkJvZHk+PC9zb2FwOkVudmVsb3BlPiI7DQotICAgICAgICBTdHJpbmcgdXJsID0gImh0dHA6Ly9sb2NhbGhvc3Q6NjA2MC9heGlzMi9zZXJ2aWNlcy9EZW1vU2VydmljZS5EZW1vU2VydmljZVBvcnQiOw0KLSAgICAgICAgUU5hbWUgbmFtZSA9IG5ldyBRTmFtZSgiaHR0cDovL2RlbW8vIiwgIkRlbW9TZXJ2aWNlIik7DQotICAgICAgICBRTmFtZSBwb3J0TmFtZSA9IG5ldyBRTmFtZSgiaHR0cDovL2RlbW8vIiwgIkRlbW9TZXJ2aWNlUG9ydCIpOw0KLSAgICAgICAgLy9DcmVhdGUgU2VydmljZQ0KLSAgICAgICAgU2VydmljZSBzID0gU2VydmljZS5jcmVhdGUobmFtZSk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHMpOw0KLSAgICAgICAgLy9hZGQgcG9ydA0KLSAgICAgICAgcy5hZGRQb3J0KHBvcnROYW1lLCBudWxsLCB1cmwpOw0KLQ0KLSAgICAgICAgLy9DcmVhdGUgRGlzcGF0Y2gNCi0gICAgICAgIERpc3BhdGNoPFN0cmluZz4gZGlzcGF0Y2ggPSBzLmNyZWF0ZURpc3BhdGNoKHBvcnROYW1lLCBTdHJpbmcuY2xhc3MsIFNlcnZpY2UuTW9kZS5NRVNTQUdFKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwoZGlzcGF0Y2gpOw0KLSAgICAgICAgcmVzID0gZGlzcGF0Y2guaW52b2tlKHNvYXBNZXNzYWdlKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwocmVzKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdF9NVV9GYWlsdXJlKCkgew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJ0ZXN0OiAiICsgZ2V0TmFtZSgpKTsNCi0gICAgICAgIC8vQWRkIGJhZCBoZWFkZXIgdG8gU09BUE1lc3NhZ2UsIHdlIGV4cGVjdCBNVSB0byBmYWlsDQotICAgICAgICBTdHJpbmcgc29hcE1lc3NhZ2UgPQ0KLSAgICAgICAgICAgICAgICAiPHNvYXA6RW52ZWxvcGUgeG1sbnM6c29hcD1cImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvXCIgeG1sbnM6eHNpPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2VcIiB4bWxuczp4c2Q9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYVwiIHhtbG5zOmRlbW89XCJodHRwOi8vZGVtby9cIj48c29hcDpIZWFkZXI+IDxkZW1vOmJhZEhlYWRlciBzb2FwOm11c3RVbmRlcnN0YW5kPVwiMVwiLz48L3NvYXA6SGVhZGVyPjxzb2FwOkJvZHk+PGRlbW86ZWNobz48YXJnMD50ZXN0PC9hcmcwPjwvZGVtbzplY2hvPjwvc29hcDpCb2R5Pjwvc29hcDpFbnZlbG9wZT4iOw0KLSAgICAgICAgU3RyaW5nIHVybCA9ICJodHRwOi8vbG9jYWxob3N0OjYwNjAvYXhpczIvc2VydmljZXMvRGVtb1NlcnZpY2UuRGVtb1NlcnZpY2VQb3J0IjsNCi0gICAgICAgIFFOYW1lIG5hbWUgPSBuZXcgUU5hbWUoImh0dHA6Ly9kZW1vLyIsICJEZW1vU2VydmljZSIpOw0KLSAgICAgICAgUU5hbWUgcG9ydE5hbWUgPSBuZXcgUU5hbWUoImh0dHA6Ly9kZW1vLyIsICJEZW1vU2VydmljZVBvcnQiKTsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgLy9DcmVhdGUgU2VydmljZQ0KLSAgICAgICAgICAgIFNlcnZpY2UgcyA9IFNlcnZpY2UuY3JlYXRlKG5hbWUpOw0KLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwocyk7DQotICAgICAgICAgICAgLy9hZGQgcG9ydA0KLSAgICAgICAgICAgIHMuYWRkUG9ydChwb3J0TmFtZSwgbnVsbCwgdXJsKTsNCi0gICAgICAgICAgICAvL0NyZWF0ZSBEaXNwYXRjaA0KLSAgICAgICAgICAgIERpc3BhdGNoPFN0cmluZz4gZGlzcGF0Y2ggPQ0KLSAgICAgICAgICAgICAgICAgICAgcy5jcmVhdGVEaXNwYXRjaChwb3J0TmFtZSwgU3RyaW5nLmNsYXNzLCBTZXJ2aWNlLk1vZGUuTUVTU0FHRSk7DQotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChkaXNwYXRjaCk7DQotICAgICAgICAgICAgZGlzcGF0Y2guaW52b2tlKHNvYXBNZXNzYWdlKTsNCi0gICAgICAgICAgICBmYWlsKCJEaWQgbm90IGdldCBleHBlY3RlZCBTT0FQRmF1bHRFeGNlcHRpb24gZm9yIG5vdCB1bmRlcnN0b29kIE11c3RVbmRlcnN0YW5kIGhlYWRlciIpOw0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICB9IGNhdGNoIChTT0FQRmF1bHRFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJHb3QgZXhwZWN0ZWQgU09BUEZhdWx0IiwgZSk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShlLnRvU3RyaW5nKCkuaW5kZXhPZigNCi0gICAgICAgICAgICAgICAgICAgICJNdXN0IFVuZGVyc3RhbmQgY2hlY2sgZmFpbGVkIGZvciBoZWFkZXIgc29hcCA6IHtodHRwOi8vZGVtby99YmFkSGVhZGVyIikgIT0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEpOw0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJNdXN0VW5kZXJzdGFuZCBmYWlsZWQgYXMgZXhwdGVjdGVkIik7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogVGVzdCB0aGF0IGEgbXVzdFVuZGVyc3RhbmQgaGVhZGVyIHdpdGggYSBzcGVjaWZpYyBTT0FQIHJvbGUgdGhhdCB0aGUgZW5kcG9pbnQgaXMgYWN0aW5nIGluDQotICAgICAqIGRvZXNuJ3QgY2F1c2UgYSBOb3RVbmRlcnN0b29kIGZhdWx0IGlmIHRoZSBoZWFkZXIgUU5hbWUgaXMgb25lIHRoYXQgdGhlIGhhbmRsZXIgdW5kZXJzdGFuZHMuDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U29hcFJvbGVBY3RlZEluKCkgew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJ0ZXN0OiAiICsgZ2V0TmFtZSgpKTsNCi0gICAgICAgIE9iamVjdCByZXM7DQotICAgICAgICAvL0FkZCBteUhlYWRlciB0byBTT0FQTWVzc2FnZSB0aGF0IHdpbGwgYmUgaW5qZWN0ZWQgYnkgaGFuZGxlci5nZXRIZWFkZXIoKS4NCi0gICAgICAgIFN0cmluZyBzb2FwTWVzc2FnZSA9DQotICAgICAgICAgICAgICAgICI8c29hcDpFbnZlbG9wZSB4bWxuczpzb2FwPVwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS9cIiB4bWxuczp4c2k9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZVwiIHhtbG5zOnhzZD1cImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hXCIgeG1sbnM6ZGVtbz1cImh0dHA6Ly9kZW1vL1wiPjxzb2FwOkhlYWRlcj4gPGRlbW86bXloZWFkZXIgc29hcDphY3Rvcj1cImh0dHA6Ly9EZW1vSGFuZGxlci9Sb2xlXCIgc29hcDptdXN0VW5kZXJzdGFuZD1cIjFcIi8+PC9zb2FwOkhlYWRlcj48c29hcDpCb2R5PjxkZW1vOmVjaG8+PGFyZzA+dGVzdDwvYXJnMD48L2RlbW86ZWNobz48L3NvYXA6Qm9keT48L3NvYXA6RW52ZWxvcGU+IjsNCi0gICAgICAgIFN0cmluZyB1cmwgPSAiaHR0cDovL2xvY2FsaG9zdDo2MDYwL2F4aXMyL3NlcnZpY2VzL0RlbW9TZXJ2aWNlLkRlbW9TZXJ2aWNlUG9ydCI7DQotICAgICAgICBRTmFtZSBuYW1lID0gbmV3IFFOYW1lKCJodHRwOi8vZGVtby8iLCAiRGVtb1NlcnZpY2UiKTsNCi0gICAgICAgIFFOYW1lIHBvcnROYW1lID0gbmV3IFFOYW1lKCJodHRwOi8vZGVtby8iLCAiRGVtb1NlcnZpY2VQb3J0Iik7DQotICAgICAgICAvL0NyZWF0ZSBTZXJ2aWNlDQotICAgICAgICBTZXJ2aWNlIHMgPSBTZXJ2aWNlLmNyZWF0ZShuYW1lKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwocyk7DQotICAgICAgICAvL2FkZCBwb3J0DQotICAgICAgICBzLmFkZFBvcnQocG9ydE5hbWUsIG51bGwsIHVybCk7DQotDQotICAgICAgICAvL0NyZWF0ZSBEaXNwYXRjaA0KLSAgICAgICAgRGlzcGF0Y2g8U3RyaW5nPiBkaXNwYXRjaCA9IHMuY3JlYXRlRGlzcGF0Y2gocG9ydE5hbWUsIFN0cmluZy5jbGFzcywgU2VydmljZS5Nb2RlLk1FU1NBR0UpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChkaXNwYXRjaCk7DQotICAgICAgICByZXMgPSBkaXNwYXRjaC5pbnZva2Uoc29hcE1lc3NhZ2UpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXMpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogVGVzdCB0aGF0IGEgbXVzdFVuZGVyc3RhbmQgaGVhZGVyIHdpdGggYSBzcGVjaWZpYyBTT0FQIHJvbGUgdGhhdCB0aGUgZW5kcG9pbnQgaXMgYWN0aW5nIGluDQotICAgICAqIGRvZXNuJ3QgY2F1c2UgYSBOb3RVbmRlcnN0b29kIGZhdWx0IGlmIHRoZSBoZWFkZXIgUU5hbWUgaXMgb25lIHRoYXQgdGhlIGhhbmRsZXIgdW5kZXJzdGFuZHMuDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U29hcFJvbGVOb3RBY3RlZEluKCkgew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJ0ZXN0OiAiICsgZ2V0TmFtZSgpKTsNCi0gICAgICAgIE9iamVjdCByZXM7DQotICAgICAgICAvL0FkZCBteUhlYWRlciB0byBTT0FQTWVzc2FnZSB0aGF0IHdpbGwgYmUgaW5qZWN0ZWQgYnkgaGFuZGxlci5nZXRIZWFkZXIoKS4NCi0gICAgICAgIFN0cmluZyBzb2FwTWVzc2FnZSA9DQotICAgICAgICAgICAgICAgICI8c29hcDpFbnZlbG9wZSB4bWxuczpzb2FwPVwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS9cIiB4bWxuczp4c2k9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZVwiIHhtbG5zOnhzZD1cImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hXCIgeG1sbnM6ZGVtbz1cImh0dHA6Ly9kZW1vL1wiPjxzb2FwOkhlYWRlcj4gPGRlbW86bXloZWFkZXIgc29hcDphY3Rvcj1cImh0dHA6Ly9EZW1vSGFuZGxlci9Ob3RBY3RlZEluXCIgc29hcDptdXN0VW5kZXJzdGFuZD1cIjFcIi8+PC9zb2FwOkhlYWRlcj48c29hcDpCb2R5PjxkZW1vOmVjaG8+PGFyZzA+dGVzdDwvYXJnMD48L2RlbW86ZWNobz48L3NvYXA6Qm9keT48L3NvYXA6RW52ZWxvcGU+IjsNCi0gICAgICAgIFN0cmluZyB1cmwgPSAiaHR0cDovL2xvY2FsaG9zdDo2MDYwL2F4aXMyL3NlcnZpY2VzL0RlbW9TZXJ2aWNlLkRlbW9TZXJ2aWNlUG9ydCI7DQotICAgICAgICBRTmFtZSBuYW1lID0gbmV3IFFOYW1lKCJodHRwOi8vZGVtby8iLCAiRGVtb1NlcnZpY2UiKTsNCi0gICAgICAgIFFOYW1lIHBvcnROYW1lID0gbmV3IFFOYW1lKCJodHRwOi8vZGVtby8iLCAiRGVtb1NlcnZpY2VQb3J0Iik7DQotICAgICAgICAvL0NyZWF0ZSBTZXJ2aWNlDQotICAgICAgICBTZXJ2aWNlIHMgPSBTZXJ2aWNlLmNyZWF0ZShuYW1lKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwocyk7DQotICAgICAgICAvL2FkZCBwb3J0DQotICAgICAgICBzLmFkZFBvcnQocG9ydE5hbWUsIG51bGwsIHVybCk7DQotDQotICAgICAgICAvL0NyZWF0ZSBEaXNwYXRjaA0KLSAgICAgICAgRGlzcGF0Y2g8U3RyaW5nPiBkaXNwYXRjaCA9IHMuY3JlYXRlRGlzcGF0Y2gocG9ydE5hbWUsIFN0cmluZy5jbGFzcywgU2VydmljZS5Nb2RlLk1FU1NBR0UpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChkaXNwYXRjaCk7DQotICAgICAgICByZXMgPSBkaXNwYXRjaC5pbnZva2Uoc29hcE1lc3NhZ2UpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXMpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogVGVzdCB0aGF0IGEgbXVzdFVuZGVyc3RhbmQgaGVhZGVyIHdpdGggYSBzcGVjaWZpYyBTT0FQIHJvbGUgdGhhdCB0aGUgZW5kcG9pbnQgaXMgYWN0aW5nIGluDQotICAgICAqIHdoaWNoIGhhcyBhIG11c3RVbmRlcnN0YW5kIGhlYWRlciB0aGF0IHdpbGwgbm90IGJlIHByb2Nlc3NlZCBieSB0aGUgaGFuZGxlciBjYXVzZXMgYSBmYXVsdC4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RTb2FwUm9sZUFjdGVkSW5Ob3RVbmRlcnN0b29kRmF1bHQoKSB7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoInRlc3Q6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgLy9BZGQgbXlIZWFkZXIgdG8gU09BUE1lc3NhZ2UgdGhhdCB3aWxsIGJlIGluamVjdGVkIGJ5IGhhbmRsZXIuZ2V0SGVhZGVyKCkuDQotICAgICAgICBTdHJpbmcgc29hcE1lc3NhZ2UgPQ0KLSAgICAgICAgICAgICAgICAiPHNvYXA6RW52ZWxvcGUgeG1sbnM6c29hcD1cImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvXCIgeG1sbnM6eHNpPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2VcIiB4bWxuczp4c2Q9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYVwiIHhtbG5zOmRlbW89XCJodHRwOi8vZGVtby9cIj48c29hcDpIZWFkZXI+IDxkZW1vOm15Tk9UVU5ERVJTVE9PRGhlYWRlciBzb2FwOmFjdG9yPVwiaHR0cDovL0RlbW9IYW5kbGVyL1JvbGVcIiBzb2FwOm11c3RVbmRlcnN0YW5kPVwiMVwiLz48L3NvYXA6SGVhZGVyPjxzb2FwOkJvZHk+PGRlbW86ZWNobz48YXJnMD50ZXN0PC9hcmcwPjwvZGVtbzplY2hvPjwvc29hcDpCb2R5Pjwvc29hcDpFbnZlbG9wZT4iOw0KLSAgICAgICAgU3RyaW5nIHVybCA9ICJodHRwOi8vbG9jYWxob3N0OjYwNjAvYXhpczIvc2VydmljZXMvRGVtb1NlcnZpY2UuRGVtb1NlcnZpY2VQb3J0IjsNCi0gICAgICAgIFFOYW1lIG5hbWUgPSBuZXcgUU5hbWUoImh0dHA6Ly9kZW1vLyIsICJEZW1vU2VydmljZSIpOw0KLSAgICAgICAgUU5hbWUgcG9ydE5hbWUgPSBuZXcgUU5hbWUoImh0dHA6Ly9kZW1vLyIsICJEZW1vU2VydmljZVBvcnQiKTsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgLy9DcmVhdGUgU2VydmljZQ0KLSAgICAgICAgICAgIFNlcnZpY2UgcyA9IFNlcnZpY2UuY3JlYXRlKG5hbWUpOw0KLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwocyk7DQotICAgICAgICAgICAgLy9hZGQgcG9ydA0KLSAgICAgICAgICAgIHMuYWRkUG9ydChwb3J0TmFtZSwgbnVsbCwgdXJsKTsNCi0NCi0gICAgICAgICAgICAvL0NyZWF0ZSBEaXNwYXRjaA0KLSAgICAgICAgICAgIERpc3BhdGNoPFN0cmluZz4gZGlzcGF0Y2ggPQ0KLSAgICAgICAgICAgICAgICAgICAgcy5jcmVhdGVEaXNwYXRjaChwb3J0TmFtZSwgU3RyaW5nLmNsYXNzLCBTZXJ2aWNlLk1vZGUuTUVTU0FHRSk7DQotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChkaXNwYXRjaCk7DQotICAgICAgICAgICAgZGlzcGF0Y2guaW52b2tlKHNvYXBNZXNzYWdlKTsNCi0gICAgICAgICAgICBmYWlsKCJEaWQgbm90IHJlY2VpdmVkIGV4cGVjdGVkIG5vdFVuZGVyc3Rvb2QgZmF1bHQiKTsNCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIkNhdWdodCBleHBlY3RlZCBleGNlcHRpb24iLCBlKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGUudG9TdHJpbmcoKS5pbmRleE9mKA0KLSAgICAgICAgICAgICAgICAgICAgIk11c3QgVW5kZXJzdGFuZCBjaGVjayBmYWlsZWQgZm9yIGhlYWRlciBzb2FwIDoge2h0dHA6Ly9kZW1vL31teU5PVFVOREVSU1RPT0RoZWFkZXIiKSAhPQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSk7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWlzYy9KQVhCQ29udGV4dFRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9taXNjL0pBWEJDb250ZXh0VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjE2MGM4Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9taXNjL0pBWEJDb250ZXh0VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi0vKioNCi0gKiANCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWlzYzsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZnJhbWV3b3JrLkFic3RyYWN0VGVzdENhc2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5kYXRhYmluZGluZy5KQVhCVXRpbHM7DQotDQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJDb250ZXh0Ow0KLWltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsNCi0NCi0vKioNCi0gKiBUZXN0cyBOYW1lc3BhY2UgdG8gUGFja2FnZSBBbGdvcml0aG0NCi0gKg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBKQVhCQ29udGV4dFRlc3QgZXh0ZW5kcyBBYnN0cmFjdFRlc3RDYXNlIHsNCi0NCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgew0KLSAgICAgICAgcmV0dXJuIGdldFRlc3RTZXR1cChuZXcgVGVzdFN1aXRlKEpBWEJDb250ZXh0VGVzdC5jbGFzcykpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBUZXN0IGJhc2ljIGZ1bmN0aW9uYWxpdHkgb2YgSkFYQlV0aWxzIHBvb2xpbmcNCi0gICAgICogQHRocm93cyBFeGNlcHRpb24NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3QwMSgpIHRocm93cyBKQVhCRXhjZXB0aW9uIHsNCi0gICAgCS8vIEdldCBhIEpBWEJDb250ZXh0DQotICAgIAlUcmVlU2V0PFN0cmluZz4gY29udGV4dDEgPSBuZXcgVHJlZVNldDxTdHJpbmc+KCk7DQotICAgIAljb250ZXh0MS5hZGQoIm9yZy50ZXN0LmFkZG51bWJlcnMiKTsNCi0gICAgCWNvbnRleHQxLmFkZCgib3JnLnRlc3QuYW55dHlwZSIpOw0KLQ0KLSAgICAJSkFYQkNvbnRleHQgamF4YkNvbnRleHQxID0gSkFYQlV0aWxzLmdldEpBWEJDb250ZXh0KGNvbnRleHQxKTsNCi0NCi0gICAgCS8vIEFzc2VydCB0aGF0IHRoZSBKQVhCQ29udGV4dCB3YXMgZm91bmQgYW5kIHRoZSBjb250ZXh0IGNvbnRhaW5zIHRoZSB0d28gdmFsaWQgcGFja2FnZXMNCi0gICAgCWFzc2VydFRydWUoamF4YkNvbnRleHQxICE9IG51bGwpOw0KLSAgICAJYXNzZXJ0VHJ1ZShjb250ZXh0MS5jb250YWlucygib3JnLnRlc3QuYWRkbnVtYmVycyIpKTsNCi0gICAgCWFzc2VydFRydWUoY29udGV4dDEuY29udGFpbnMoIm9yZy50ZXN0LmFueXR5cGUiKSk7DQotDQotICAgIAkvLyBSZXBlYXQgd2l0aCB0aGUgc2FtZSBwYWNrYWdlcw0KLSAgICAJVHJlZVNldDxTdHJpbmc+IGNvbnRleHQyID0gbmV3IFRyZWVTZXQ8U3RyaW5nPigpOw0KLSAgICAJY29udGV4dDIuYWRkKCJvcmcudGVzdC5hZGRudW1iZXJzIik7DQotICAgIAljb250ZXh0Mi5hZGQoIm9yZy50ZXN0LmFueXR5cGUiKTsNCi0NCi0gICAgCUpBWEJDb250ZXh0IGpheGJDb250ZXh0MiA9IEpBWEJVdGlscy5nZXRKQVhCQ29udGV4dChjb250ZXh0Mik7DQotDQotICAgIAkvLyBUaGUgZm9sbG93aW5nIGFzc2VydGlvbiBpcyBwcm9iYWJseSB0cnVlLGJ1dCBHQyBtYXkgaGF2ZSB3aXBlZCBvdXQgdGhlIHdlYWsgcmVmZXJlbmNlDQotICAgIAkvL2Fzc2VydFRydWUoamF4YkNvbnRleHQyID09IGpheGJDb250ZXh0MSk7DQotICAgIAlhc3NlcnRUcnVlKGpheGJDb250ZXh0MiAhPSBudWxsKTsNCi0gICAgCWFzc2VydFRydWUoamF4YkNvbnRleHQyLnRvU3RyaW5nKCkuZXF1YWxzKGpheGJDb250ZXh0MS50b1N0cmluZygpKSk7DQotICAgIAlhc3NlcnRUcnVlKGNvbnRleHQyLmNvbnRhaW5zKCJvcmcudGVzdC5hZGRudW1iZXJzIikpOw0KLSAgICAJYXNzZXJ0VHJ1ZShjb250ZXh0Mi5jb250YWlucygib3JnLnRlc3QuYW55dHlwZSIpKTsNCi0NCi0gICAgCS8vIFJlcGVhdCB3aXRoIHRoZSBzYW1lIHBhY2thZ2VzICsgYW4gaW52YWxpZCBwYWNrYWdlDQotICAgIAlUcmVlU2V0PFN0cmluZz4gY29udGV4dDMgPSBuZXcgVHJlZVNldDxTdHJpbmc+KCk7DQotICAgIAljb250ZXh0My5hZGQoIm9yZy50ZXN0LmFkZG51bWJlcnMiKTsNCi0gICAgCWNvbnRleHQzLmFkZCgib3JnLnRlc3QuYW55dHlwZSIpOw0KLSAgICAJY29udGV4dDMuYWRkKCJteS5ncmFuZG1hLmxvdmVzLmpheHdzIik7DQotDQotICAgIAlKQVhCQ29udGV4dCBqYXhiQ29udGV4dDMgPSBKQVhCVXRpbHMuZ2V0SkFYQkNvbnRleHQoY29udGV4dDMpOw0KLQ0KLSAgICAJLy8gVGhlIGZvbGxvd2luZyBhc3NlcnRpb24gaXMgcHJvYmFibHkgdHJ1ZSxidXQgR0MgbWF5IGhhdmUgd2lwZWQgb3V0IHRoZSB3ZWFrIHJlZmVyZW5jZQ0KLSAgICAJLy9hc3NlcnRUcnVlKGpheGJDb250ZXh0MyA9PSBqYXhiQ29udGV4dDEpOw0KLSAgICAJYXNzZXJ0VHJ1ZShqYXhiQ29udGV4dDMgIT0gbnVsbCk7DQotICAgIAlhc3NlcnRUcnVlKGpheGJDb250ZXh0MS50b1N0cmluZygpLmVxdWFscyhqYXhiQ29udGV4dDEudG9TdHJpbmcoKSkpOw0KLSAgICAJYXNzZXJ0VHJ1ZShjb250ZXh0My5jb250YWlucygib3JnLnRlc3QuYWRkbnVtYmVycyIpKTsNCi0gICAgCWFzc2VydFRydWUoY29udGV4dDMuY29udGFpbnMoIm9yZy50ZXN0LmFueXR5cGUiKSk7IA0KLSAgICAJLy8gVGhlIGludmFsaWQgcGFja2FnZSBzaG91bGQgbm93IGJlIHJldGFpbmVkLi4udGhpcyBpcyBkdWUNCi0gICAgCS8vIGEgbWlub3Igc2VtYW50aWMgY2hhbmdlIHRvIGF2b2lkIHRoaXMgc2lkZSBlZmZlY3QuDQotICAgIAlhc3NlcnRUcnVlKGNvbnRleHQzLmNvbnRhaW5zKCJteS5ncmFuZG1hLmxvdmVzLmpheHdzIikpOyAgDQotDQotICAgIAkvLyBSZXBlYXQgd2l0aCBhIHN1YnNldCBvZiBwYWNrYWdlcw0KLSAgICAJVHJlZVNldDxTdHJpbmc+IGNvbnRleHQ0ID0gbmV3IFRyZWVTZXQ8U3RyaW5nPigpOw0KLSAgICAJY29udGV4dDQuYWRkKCJvcmcudGVzdC5hZGRudW1iZXJzIik7DQotDQotDQotICAgIAlKQVhCQ29udGV4dCBqYXhiQ29udGV4dDQgPSBKQVhCVXRpbHMuZ2V0SkFYQkNvbnRleHQoY29udGV4dDQpOw0KLQ0KLSAgICAJYXNzZXJ0VHJ1ZShqYXhiQ29udGV4dDQgIT0gbnVsbCk7DQotICAgIAlhc3NlcnRUcnVlKGpheGJDb250ZXh0NCAhPSBqYXhiQ29udGV4dDMpOw0KLSAgICAJYXNzZXJ0VHJ1ZShjb250ZXh0NC5jb250YWlucygib3JnLnRlc3QuYWRkbnVtYmVycyIpKTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvbm9uYW5vbnltb3VzL2NvbXBsZXh0eXBlL0VjaG9NZXNzYWdlSW1wbC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL25vbmFub255bW91cy9jb21wbGV4dHlwZS9FY2hvTWVzc2FnZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzBhZGIzYy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvbm9uYW5vbnltb3VzL2NvbXBsZXh0eXBlL0VjaG9NZXNzYWdlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLS8qKg0KLSAqIA0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5ub25hbm9ueW1vdXMuY29tcGxleHR5cGU7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuVGVzdExvZ2dlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5ub25hbm9ueW1vdXMuY29tcGxleHR5cGUuc2VpLkVjaG9NZXNzYWdlUG9ydFR5cGU7DQotDQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOw0KLQ0KLUBXZWJTZXJ2aWNlKHNlcnZpY2VOYW1lPSJFY2hvTWVzc2FnZVNlcnZpY2UiLA0KLQkgCXRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3Rlc3RBcHAuamF4d3MiLA0KLSAgICAgICAgZW5kcG9pbnRJbnRlcmZhY2U9Im9yZy5hcGFjaGUuYXhpczIuamF4d3Mubm9uYW5vbnltb3VzLmNvbXBsZXh0eXBlLnNlaS5FY2hvTWVzc2FnZVBvcnRUeXBlIikNCi0NCi1wdWJsaWMgY2xhc3MgRWNob01lc3NhZ2VJbXBsIGltcGxlbWVudHMgRWNob01lc3NhZ2VQb3J0VHlwZSB7DQotDQotCS8qKg0KLQkgKiANCi0JICovDQotCXB1YmxpYyBFY2hvTWVzc2FnZUltcGwoKSB7DQotCQlzdXBlcigpOw0KLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViDQotCX0NCi0NCi0JLyogKG5vbi1KYXZhZG9jKQ0KLQkgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Mubm9uYW5vbnltb3VzLmNvbXBsZXh0eXBlLnNlaS5FY2hvTWVzc2FnZVBvcnRUeXBlI2VjaG9NZXNzYWdlKGphdmEubGFuZy5TdHJpbmcpDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGVjaG9NZXNzYWdlKFN0cmluZyByZXF1ZXN0KSB7DQotCQlTdHJpbmcgcmVzcG9uc2UgPSBudWxsOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoImVjaG9NZXNzYWdlIHJlY2VpdmVkOiAiICsgcmVxdWVzdCk7DQotICAgICAgICByZXNwb25zZSA9IHJlcXVlc3QucmVwbGFjZUFsbCgiU2VydmVyIiwgIkNsaWVudCIpOw0KLSAgICAgICAgcmV0dXJuIHJlc3BvbnNlOw0KLQ0KLQl9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9ub25hbm9ueW1vdXMvY29tcGxleHR5cGUvTUVUQS1JTkYvRWNob01lc3NhZ2Uud3NkbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9ub25hbm9ueW1vdXMvY29tcGxleHR5cGUvTUVUQS1JTkYvRWNob01lc3NhZ2Uud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjYxMzg0My4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvbm9uYW5vbnltb3VzL2NvbXBsZXh0eXBlL01FVEEtSU5GL0VjaG9NZXNzYWdlLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLQ0KLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTxkZWZpbml0aW9ucyB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9ub25hbm9ueW1vdXMuY29tcGxleHR5cGUudGVzdC5vcmciDQotICAgICAgeG1sbnM6dG5zPSJodHRwOi8vbm9uYW5vbnltb3VzLmNvbXBsZXh0eXBlLnRlc3Qub3JnIg0KLSAgICAgIHhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIgDQotICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSINCi0gICAgICB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIj4NCi0NCi0gICA8dHlwZXM+DQotICAgICAgPHhzZDpzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vbm9uYW5vbnltb3VzLmNvbXBsZXh0eXBlLnRlc3Qub3JnIg0KLSAgICAgICAgIHhtbG5zOnRzPSJodHRwOi8vbm9uYW5vbnltb3VzLmNvbXBsZXh0eXBlLnRlc3Qub3JnL3hzZCINCi0gICAgICAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiDQotICAgICAgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPg0KLQ0KLSAgICAgICAgIDxjb21wbGV4VHlwZSBuYW1lPSJlY2hvTWVzc2FnZSI+DQotICAgICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InJlcXVlc3QiIHR5cGU9InhzZDpzdHJpbmciLz4NCi0gICAgICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDwvY29tcGxleFR5cGU+DQotDQotICAgICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9ImVjaG9NZXNzYWdlUmVzcG9uc2UiPg0KLSAgICAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJyZXNwb25zZSIgdHlwZT0ieHNkOnN0cmluZyIvPg0KLSAgICAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgPC9jb21wbGV4VHlwZT4NCi0NCi0gICAgICAgICA8ZWxlbWVudCBuYW1lPSJlY2hvTWVzc2FnZSIgdHlwZT0idG5zOmVjaG9NZXNzYWdlIi8+DQotICAgICAgICAgPGVsZW1lbnQgbmFtZT0iZWNob01lc3NhZ2VSZXNwb25zZSIgdHlwZT0idG5zOmVjaG9NZXNzYWdlUmVzcG9uc2UiLz4NCi0NCi0gICAgICA8L3hzZDpzY2hlbWE+DQotICAgPC90eXBlcz4NCi0NCi0gICA8bWVzc2FnZSBuYW1lPSJlY2hvTWVzc2FnZSI+DQotICAgICAgPHBhcnQgbmFtZT0ibWVzc2FnZSIgZWxlbWVudD0idG5zOmVjaG9NZXNzYWdlIi8+DQotICAgPC9tZXNzYWdlPg0KLQ0KLSAgIDxtZXNzYWdlIG5hbWU9ImVjaG9NZXNzYWdlUmVzcG9uc2UiPg0KLSAgICAgIDxwYXJ0IG5hbWU9InJlc3VsdCIgZWxlbWVudD0idG5zOmVjaG9NZXNzYWdlUmVzcG9uc2UiLz4NCi0gICA8L21lc3NhZ2U+DQotDQotICAgPHBvcnRUeXBlIG5hbWU9IkVjaG9NZXNzYWdlUG9ydFR5cGUiPg0KLSAgICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob01lc3NhZ2UiPg0KLSAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6ZWNob01lc3NhZ2UiIC8+DQotICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6ZWNob01lc3NhZ2VSZXNwb25zZSIgLz4NCi0gICAgICA8L29wZXJhdGlvbj4NCi0gICA8L3BvcnRUeXBlPg0KLQ0KLSAgIDxiaW5kaW5nIG5hbWU9IkVjaG9NZXNzYWdlQmluZGluZyIgdHlwZT0idG5zOkVjaG9NZXNzYWdlUG9ydFR5cGUiPg0KLSAgICAgIDxzb2FwOmJpbmRpbmcgc3R5bGU9ImRvY3VtZW50IiB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIvPg0KLSAgICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob01lc3NhZ2UiPg0KLSAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4NCi0gICAgICAgICA8aW5wdXQ+DQotICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4NCi0gICAgICAgICA8L2lucHV0Pg0KLQ0KLSAgICAgICAgIDxvdXRwdXQ+DQotICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4NCi0gICAgICAgICA8L291dHB1dD4NCi0gICAgICA8L29wZXJhdGlvbj4NCi0gICA8L2JpbmRpbmc+DQotDQotICAgPHNlcnZpY2UgbmFtZT0iRWNob01lc3NhZ2VTZXJ2aWNlIj4NCi0gICAgICA8cG9ydCBiaW5kaW5nPSJ0bnM6RWNob01lc3NhZ2VCaW5kaW5nIiBuYW1lPSJFY2hvTWVzc2FnZVBvcnQiPg0KLSAgICAgICAgIDxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6NjA2MC9heGlzMi9zZXJ2aWNlcy9FY2hvTWVzc2FnZVNlcnZpY2UiLz4NCi0gICAgICA8L3BvcnQ+DQotDQotICAgPC9zZXJ2aWNlPg0KLQ0KLTwvZGVmaW5pdGlvbnM+DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL25vbmFub255bW91cy9jb21wbGV4dHlwZS9Ob25Bbm9ueW1vdXNDb21wbGV4VHlwZVRlc3RzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvbm9uYW5vbnltb3VzL2NvbXBsZXh0eXBlL05vbkFub255bW91c0NvbXBsZXhUeXBlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2YyZmJhNi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvbm9uYW5vbnltb3VzL2NvbXBsZXh0eXBlL05vbkFub255bW91c0NvbXBsZXhUeXBlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi0vKioNCi0gKiANCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Mubm9uYW5vbnltb3VzLmNvbXBsZXh0eXBlOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5UZXN0TG9nZ2VyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmZyYW1ld29yay5BYnN0cmFjdFRlc3RDYXNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm5vbmFub255bW91cy5jb21wbGV4dHlwZS5zZWkuRWNob01lc3NhZ2VQb3J0VHlwZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5ub25hbm9ueW1vdXMuY29tcGxleHR5cGUuc2VpLkVjaG9NZXNzYWdlU2VydmljZTsNCi0NCi1pbXBvcnQgamF2YXgueG1sLndzLkJpbmRpbmdQcm92aWRlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247DQotDQotcHVibGljIGNsYXNzIE5vbkFub255bW91c0NvbXBsZXhUeXBlVGVzdHMgZXh0ZW5kcyBBYnN0cmFjdFRlc3RDYXNlIHsNCi0NCi0gICAgU3RyaW5nIGF4aXNFbmRwb2ludCA9ICJodHRwOi8vbG9jYWxob3N0OjYwNjAvYXhpczIvc2VydmljZXMvRWNob01lc3NhZ2VTZXJ2aWNlLkVjaG9NZXNzYWdlSW1wbFBvcnQiOw0KLQkNCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgew0KLSAgICAgICAgcmV0dXJuIGdldFRlc3RTZXR1cChuZXcgVGVzdFN1aXRlKE5vbkFub255bW91c0NvbXBsZXhUeXBlVGVzdHMuY2xhc3MpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlUHJveHkoKSB7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiVGVzdCA6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBTdHJpbmcgbXNnID0gIkhlbGxvIFNlcnZlciI7DQotICAgICAgICAgICAgRWNob01lc3NhZ2VQb3J0VHlwZSBteVBvcnQgPSAobmV3IEVjaG9NZXNzYWdlU2VydmljZSgpKS5nZXRFY2hvTWVzc2FnZVBvcnQoKTsNCi0gICAgICAgICAgICBCaW5kaW5nUHJvdmlkZXIgcCA9IChCaW5kaW5nUHJvdmlkZXIpIG15UG9ydDsNCi0gICAgICAgICAgICBwLmdldFJlcXVlc3RDb250ZXh0KCkucHV0KEJpbmRpbmdQcm92aWRlci5FTkRQT0lOVF9BRERSRVNTX1BST1BFUlRZLCBheGlzRW5kcG9pbnQpOw0KLQ0KLSAgICAgICAgICAgIFN0cmluZyByZXNwb25zZSA9IG15UG9ydC5lY2hvTWVzc2FnZShtc2cpOw0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKHJlc3BvbnNlKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBUcnkgYSBzZWNvbmQgdGltZSB0byB2ZXJpZnkNCi0gICAgICAgICAgICByZXNwb25zZSA9IG15UG9ydC5lY2hvTWVzc2FnZShtc2cpOw0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKHJlc3BvbnNlKTsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICB9IGNhdGNoIChXZWJTZXJ2aWNlRXhjZXB0aW9uIHdlYkV4KSB7DQotICAgICAgICAgICAgd2ViRXgucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAgICAgZmFpbCgpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotCQkgICAgDQotDQotDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9ub25hbm9ueW1vdXMvY29tcGxleHR5cGUvc2VpL0VjaG9NZXNzYWdlUG9ydFR5cGUuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9ub25hbm9ueW1vdXMvY29tcGxleHR5cGUvc2VpL0VjaG9NZXNzYWdlUG9ydFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY0ZjhmOC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvbm9uYW5vbnltb3VzL2NvbXBsZXh0eXBlL3NlaS9FY2hvTWVzc2FnZVBvcnRUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0NCi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm5vbmFub255bW91cy5jb21wbGV4dHlwZS5zZWk7DQotDQotaW1wb3J0IGphdmF4Lmp3cy5XZWJNZXRob2Q7DQotaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbTsNCi1pbXBvcnQgamF2YXguandzLldlYlJlc3VsdDsNCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5SZXF1ZXN0V3JhcHBlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLlJlc3BvbnNlV3JhcHBlcjsNCi0NCi0NCi0vKioNCi0gKiBUaGlzIGNsYXNzIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIEpBWFdTIFNJLg0KLSAqIEpBWC1XUyBSSSAyLjBfMDEtYjE1LWZjcw0KLSAqIEdlbmVyYXRlZCBzb3VyY2UgdmVyc2lvbjogMi4wDQotICogDQotICovDQotQFdlYlNlcnZpY2UobmFtZSA9ICJFY2hvTWVzc2FnZVBvcnRUeXBlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9ub25hbm9ueW1vdXMuY29tcGxleHR5cGUudGVzdC5vcmciKQ0KLXB1YmxpYyBpbnRlcmZhY2UgRWNob01lc3NhZ2VQb3J0VHlwZSB7DQotDQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIHJlcXVlc3QNCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBqYXZhLmxhbmcuU3RyaW5nDQotICAgICAqLw0KLSAgICBAV2ViTWV0aG9kDQotICAgIEBXZWJSZXN1bHQobmFtZSA9ICJyZXNwb25zZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vbm9uYW5vbnltb3VzLmNvbXBsZXh0eXBlLnRlc3Qub3JnIikNCi0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJlY2hvTWVzc2FnZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vbm9uYW5vbnltb3VzLmNvbXBsZXh0eXBlLnRlc3Qub3JnIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LmNvbXBsZXh0eXBlLm5vbmFub255bW91cy5FY2hvTWVzc2FnZSIpDQotICAgIEBSZXNwb25zZVdyYXBwZXIobG9jYWxOYW1lID0gImVjaG9NZXNzYWdlUmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL25vbmFub255bW91cy5jb21wbGV4dHlwZS50ZXN0Lm9yZyIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5jb21wbGV4dHlwZS5ub25hbm9ueW1vdXMuRWNob01lc3NhZ2VSZXNwb25zZSIpDQotICAgIHB1YmxpYyBTdHJpbmcgZWNob01lc3NhZ2UoDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJyZXF1ZXN0IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9ub25hbm9ueW1vdXMuY29tcGxleHR5cGUudGVzdC5vcmciKQ0KLSAgICAgICAgU3RyaW5nIHJlcXVlc3QpOw0KLQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvbm9uYW5vbnltb3VzL2NvbXBsZXh0eXBlL3NlaS9FY2hvTWVzc2FnZVNlcnZpY2UuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9ub25hbm9ueW1vdXMvY29tcGxleHR5cGUvc2VpL0VjaG9NZXNzYWdlU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTAyMzAzLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9ub25hbm9ueW1vdXMvY29tcGxleHR5cGUvc2VpL0VjaG9NZXNzYWdlU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotDQotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5ub25hbm9ueW1vdXMuY29tcGxleHR5cGUuc2VpOw0KLQ0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOw0KLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLldlYkVuZHBvaW50Ow0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUNsaWVudDsNCi1pbXBvcnQgamF2YS5pby5GaWxlOw0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247DQotaW1wb3J0IGphdmEubmV0LlVSTDsNCi0NCi0vKioNCi0gKiBUaGlzIGNsYXNzIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIEpBWFdTIFNJLg0KLSAqIEpBWC1XUyBSSSAyLjBfMDEtYjE1LWZjcw0KLSAqIEdlbmVyYXRlZCBzb3VyY2UgdmVyc2lvbjogMi4wDQotICogDQotICovDQotQFdlYlNlcnZpY2VDbGllbnQobmFtZSA9ICJFY2hvTWVzc2FnZVNlcnZpY2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL25vbmFub255bW91cy5jb21wbGV4dHlwZS50ZXN0Lm9yZyIsIHdzZGxMb2NhdGlvbiA9ICJFY2hvTWVzc2FnZS53c2RsIikNCi1wdWJsaWMgY2xhc3MgRWNob01lc3NhZ2VTZXJ2aWNlDQotICAgIGV4dGVuZHMgU2VydmljZQ0KLXsNCi0NCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgVVJMIEVDSE9NRVNTQUdFU0VSVklDRV9XU0RMX0xPQ0FUSU9OOw0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgd3NkbExvY2F0aW9uPSIvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL25vbmFub255bW91cy9jb21wbGV4dHlwZS9NRVRBLUlORi9FY2hvTWVzc2FnZS53c2RsIjsNCi0gICAgc3RhdGljIHsNCi0gICAgICAgIFVSTCB1cmwgPSBudWxsOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgIAl0cnl7DQotCSAgICAgICAgCVN0cmluZyBiYXNlRGlyID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJiYXNlZGlyIiwiLiIpKS5nZXRDYW5vbmljYWxQYXRoKCk7DQotCSAgICAgICAgCXdzZGxMb2NhdGlvbiA9IG5ldyBGaWxlKGJhc2VEaXIgKyB3c2RsTG9jYXRpb24pLmdldEFic29sdXRlUGF0aCgpOw0KLSAgICAgICAgCX1jYXRjaChFeGNlcHRpb24gZSl7DQotICAgICAgICAJCWUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAJfQ0KLSAgICAgICAgCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHdzZGxMb2NhdGlvbik7DQotICAgICAgICAJdXJsID0gZmlsZS50b1VSTCgpOw0KLSAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgRUNIT01FU1NBR0VTRVJWSUNFX1dTRExfTE9DQVRJT04gPSB1cmw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEVjaG9NZXNzYWdlU2VydmljZShVUkwgd3NkbExvY2F0aW9uLCBRTmFtZSBzZXJ2aWNlTmFtZSkgew0KLSAgICAgICAgc3VwZXIod3NkbExvY2F0aW9uLCBzZXJ2aWNlTmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEVjaG9NZXNzYWdlU2VydmljZSgpIHsNCi0gICAgICAgIHN1cGVyKEVDSE9NRVNTQUdFU0VSVklDRV9XU0RMX0xPQ0FUSU9OLCBuZXcgUU5hbWUoImh0dHA6Ly9ub25hbm9ueW1vdXMuY29tcGxleHR5cGUudGVzdC5vcmciLCAiRWNob01lc3NhZ2VTZXJ2aWNlIikpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBFY2hvTWVzc2FnZVBvcnRUeXBlDQotICAgICAqLw0KLSAgICBAV2ViRW5kcG9pbnQobmFtZSA9ICJFY2hvTWVzc2FnZVBvcnQiKQ0KLSAgICBwdWJsaWMgRWNob01lc3NhZ2VQb3J0VHlwZSBnZXRFY2hvTWVzc2FnZVBvcnQoKSB7DQotICAgICAgICByZXR1cm4gKEVjaG9NZXNzYWdlUG9ydFR5cGUpc3VwZXIuZ2V0UG9ydChuZXcgUU5hbWUoImh0dHA6Ly9ub25hbm9ueW1vdXMuY29tcGxleHR5cGUudGVzdC5vcmciLCAiRWNob01lc3NhZ2VQb3J0IiksIEVjaG9NZXNzYWdlUG9ydFR5cGUuY2xhc3MpOw0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wb2x5bW9ycGhpYy9zaGFwZS9NRVRBLUlORi8zRFNoYXBlLnhzZCBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wb2x5bW9ycGhpYy9zaGFwZS9NRVRBLUlORi8zRFNoYXBlLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWExMjY2MC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcG9seW1vcnBoaWMvc2hhcGUvTUVUQS1JTkYvM0RTaGFwZS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08eHNkOnNjaGVtYSB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIg0KLQkJeG1sbnM6dG5zMT0iaHR0cDovL3NoYXBlLnRlc3Qub3JnIg0KLQkJeG1sbnM6dG5zPSJodHRwOi8vdGhyZWVkLnNoYXBlLnRlc3Qub3JnIiANCi0JCXhtbG5zOmpheGI9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2pheGIiICBqYXhiOnZlcnNpb249IjIuMCINCi0JCXRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RocmVlZC5zaGFwZS50ZXN0Lm9yZyI+DQotCQkNCi0JCTx4c2Q6aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3NoYXBlLnRlc3Qub3JnIg0KLQkJCSAgICBzY2hlbWFMb2NhdGlvbj0ic2hhcGUueHNkIiAvPg0KLQkJDQotCQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlRocmVlRFNxdWFyZSI+DQotCQk8eHNkOmNvbXBsZXhDb250ZW50Pg0KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InRuczE6U3F1YXJlIj4NCi0JCQkJPHhzZDpzZXF1ZW5jZT4NCi0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJicmVkdGgiIHR5cGU9InhzZDppbnQiIC8+DQotCQkJCTwveHNkOnNlcXVlbmNlPg0KLQkJCTwveHNkOmV4dGVuc2lvbj4NCi0JCTwveHNkOmNvbXBsZXhDb250ZW50Pg0KLQkJPC94c2Q6Y29tcGxleFR5cGU+DQotPC94c2Q6c2NoZW1hPgkJDQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3BvbHltb3JwaGljL3NoYXBlL01FVEEtSU5GL3NoYXBlLnhzZCBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wb2x5bW9ycGhpYy9zaGFwZS9NRVRBLUlORi9zaGFwZS54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4OTMxZTYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3BvbHltb3JwaGljL3NoYXBlL01FVEEtSU5GL3NoYXBlLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotDQotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPHhzZDpzY2hlbWEgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSINCi0JCXhtbG5zOnRucz0iaHR0cDovL3NoYXBlLnRlc3Qub3JnIiANCi0JCXhtbG5zOmpheGI9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2pheGIiICBqYXhiOnZlcnNpb249IjIuMCINCi0JCXRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3NoYXBlLnRlc3Qub3JnIj4NCi0JCQkNCi0JCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iU2hhcGUiIGFic3RyYWN0PSJ0cnVlIj4NCi0JCQk8eHNkOnNlcXVlbmNlPg0KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0ieEF4aXMiIHR5cGU9InhzZDpmbG9hdCIgLz4NCi0JCQkJPHhzZDplbGVtZW50IG5hbWU9InlBeGlzIiB0eXBlPSJ4c2Q6ZmxvYXQiIC8+DQotCQkJPC94c2Q6c2VxdWVuY2U+DQotCQk8L3hzZDpjb21wbGV4VHlwZT4NCi0JCQ0KLQkJPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJTcXVhcmUiID4NCi0JCQk8eHNkOmNvbXBsZXhDb250ZW50Pg0KLQkJCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ0bnM6U2hhcGUiPg0KLQkJCQkJPHhzZDpzZXF1ZW5jZT4NCi0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0ibGVuZ3RoIiB0eXBlPSJ4c2Q6aW50IiAvPg0KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJ3aWR0aCIgdHlwZT0ieHNkOmludCIgLz4NCi0JCQkJCTwveHNkOnNlcXVlbmNlPg0KLQkJCQk8L3hzZDpleHRlbnNpb24+DQotCQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+DQotCQk8L3hzZDpjb21wbGV4VHlwZT4NCi0JCQ0KLQkJPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDaXJjbGUiID4NCi0JCQk8eHNkOmNvbXBsZXhDb250ZW50Pg0KLQkJCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ0bnM6U2hhcGUiPg0KLQkJCQkJPHhzZDpzZXF1ZW5jZT4NCi0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0icmFkaXVzIiB0eXBlPSJ4c2Q6aW50IiAvPg0KLQkJCQkJPC94c2Q6c2VxdWVuY2U+DQotCQkJCTwveHNkOmV4dGVuc2lvbj4NCi0JCQk8L3hzZDpjb21wbGV4Q29udGVudD4NCi0JCTwveHNkOmNvbXBsZXhUeXBlPgkNCi08L3hzZDpzY2hlbWE+DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3BvbHltb3JwaGljL3NoYXBlL01FVEEtSU5GL3NoYXBlX3dyYXBwZXJzLnhzZCBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wb2x5bW9ycGhpYy9zaGFwZS9NRVRBLUlORi9zaGFwZV93cmFwcGVycy54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxY2U4MzEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3BvbHltb3JwaGljL3NoYXBlL01FVEEtSU5GL3NoYXBlX3dyYXBwZXJzLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotDQotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPHhzZDpzY2hlbWEgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSINCi0JCXhtbG5zOnRucz0iaHR0cDovL3dyYXBwZXIuc2hhcGUudGVzdC5vcmciIA0KLQkJeG1sbnM6dG5zMT0iaHR0cDovL3NoYXBlLnRlc3Qub3JnIg0KLQkJeG1sbnM6amF4Yj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF4YiIgIGpheGI6dmVyc2lvbj0iMi4wIg0KLQkJdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3JhcHBlci5zaGFwZS50ZXN0Lm9yZyI+DQotCQkNCi0JCTx4c2Q6aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3NoYXBlLnRlc3Qub3JnIg0KLQkJCSAgICBzY2hlbWFMb2NhdGlvbj0ic2hhcGUueHNkIiAvPg0KLQkJDQotCQk8eHNkOmVsZW1lbnQgbmFtZT0iZHJhdzNEIj4NCi0JCQk8eHNkOmNvbXBsZXhUeXBlPg0KLQkJCQk8eHNkOnNlcXVlbmNlPg0KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9InJlcXVlc3QiIHR5cGU9InRuczE6U2hhcGUiIC8+DQotCQkJCTwveHNkOnNlcXVlbmNlPg0KLQkJCTwveHNkOmNvbXBsZXhUeXBlPg0KLQkJPC94c2Q6ZWxlbWVudD4NCi0JCQ0KLQkJPHhzZDplbGVtZW50IG5hbWU9ImRyYXciPg0KLQkJCTx4c2Q6Y29tcGxleFR5cGU+DQotCQkJCTx4c2Q6c2VxdWVuY2U+DQotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0icmVxdWVzdCIgdHlwZT0idG5zMTpTaGFwZSIgLz4NCi0JCQkJPC94c2Q6c2VxdWVuY2U+DQotCQkJPC94c2Q6Y29tcGxleFR5cGU+DQotCQk8L3hzZDplbGVtZW50Pg0KLQkJDQotCQk8eHNkOmVsZW1lbnQgbmFtZT0iZHJhd1Jlc3BvbnNlIj4NCi0JCQk8eHNkOmNvbXBsZXhUeXBlPg0KLQkJCQk8eHNkOnNlcXVlbmNlPg0KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9InJlc3BvbnNlIiB0eXBlPSJ0bnMxOlNoYXBlIiAvPg0KLQkJCQk8L3hzZDpzZXF1ZW5jZT4NCi0JCQk8L3hzZDpjb21wbGV4VHlwZT4NCi0JCTwveHNkOmVsZW1lbnQ+DQotCQkNCi08L3hzZDpzY2hlbWE+CQkNCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcG9seW1vcnBoaWMvc2hhcGUvTUVUQS1JTkYvc2hhcGVzLndzZGwgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcG9seW1vcnBoaWMvc2hhcGUvTUVUQS1JTkYvc2hhcGVzLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzMWJlNTIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3BvbHltb3JwaGljL3NoYXBlL01FVEEtSU5GL3NoYXBlcy53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotDQotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPHdzZGw6ZGVmaW5pdGlvbnMNCi0JdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vc2VpLnNoYXBlLnBvbHltb3JwaGljLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciDQotCXhtbG5zPSJodHRwOi8vc2VpLnNoYXBlLnBvbHltb3JwaGljLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciDQotCQ0KLQl4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyINCi0JeG1sbnM6dG5zPSJodHRwOi8vc2VpLnNoYXBlLnBvbHltb3JwaGljLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciDQotCXhtbG5zOnRuczE9Imh0dHA6Ly9zaGFwZS50ZXN0Lm9yZyINCi0JeG1sbnM6dG5zMj0iaHR0cDovL3RocmVlZC5zaGFwZS50ZXN0Lm9yZyINCi0JeG1sbnM6dG5zMz0iaHR0cDovL3dyYXBwZXIuc2hhcGUudGVzdC5vcmciDQotCXhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiDQotCQ0KLQl4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIj4NCi0NCi0JPHdzZGw6dHlwZXM+DQotCSAgICA8eHNkOnNjaGVtYT4NCi0JCSAgICAgIDx4c2Q6aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3NoYXBlLnRlc3Qub3JnIg0KLQkJICAgICAgICAgICAgICAgICAgc2NoZW1hTG9jYXRpb249InNoYXBlLnhzZCIvPg0KLQkJICAgICAgPHhzZDppbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vdGhyZWVkLnNoYXBlLnRlc3Qub3JnIg0KLQkJICAgICAgICAgICAgICAgICAgc2NoZW1hTG9jYXRpb249IjNEU2hhcGUueHNkIi8+DQotCQkgICAgICA8eHNkOmltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly93cmFwcGVyLnNoYXBlLnRlc3Qub3JnIg0KLQkJICAgICAgICAgICAgICAgICAgc2NoZW1hTG9jYXRpb249InNoYXBlX3dyYXBwZXJzLnhzZCIvPg0KLQkgICAgPC94c2Q6c2NoZW1hPg0KLQkgICAgDQotCTwvd3NkbDp0eXBlcz4NCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJkcmF3M0RSZXF1ZXN0Ij4NCi0JCTx3c2RsOnBhcnQgbmFtZT0icmVxdWVzdCIgZWxlbWVudD0idG5zMzpkcmF3M0QiPg0KLQkJPC93c2RsOnBhcnQ+DQotCTwvd3NkbDptZXNzYWdlPg0KLQkNCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJkcmF3UmVxdWVzdCI+DQotCQk8d3NkbDpwYXJ0IG5hbWU9InJlcXVlc3QiIGVsZW1lbnQ9InRuczM6ZHJhdyI+DQotCQk8L3dzZGw6cGFydD4NCi0JPC93c2RsOm1lc3NhZ2U+DQotCQ0KLQk8d3NkbDptZXNzYWdlIG5hbWU9ImRyYXdSZXNwb25zZSI+DQotCQk8d3NkbDpwYXJ0IG5hbWU9InR5cGVzUU5hbWVSZXNwb25zZSIgZWxlbWVudD0idG5zMzpkcmF3UmVzcG9uc2UiPg0KLQkJPC93c2RsOnBhcnQ+DQotCTwvd3NkbDptZXNzYWdlPg0KLQkNCi0JPHdzZGw6cG9ydFR5cGUgbmFtZT0iUG9seW1vcnBoaWNTaGFwZVBvcnRUeXBlIj4NCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJkcmF3Ij4NCi0JCQk8d3NkbDppbnB1dCBtZXNzYWdlPSJ0bnM6ZHJhd1JlcXVlc3QiIC8+DQotCQkJPHdzZGw6b3V0cHV0IG1lc3NhZ2U9InRuczpkcmF3UmVzcG9uc2UiIC8+DQotCQk8L3dzZGw6b3BlcmF0aW9uPg0KLQkNCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJkcmF3M0QiPg0KLQkJCTx3c2RsOmlucHV0IG1lc3NhZ2U9InRuczpkcmF3M0RSZXF1ZXN0IiAvPg0KLQkJCTx3c2RsOm91dHB1dCBtZXNzYWdlPSJ0bnM6ZHJhd1Jlc3BvbnNlIiAvPg0KLQkJPC93c2RsOm9wZXJhdGlvbj4NCi0JPC93c2RsOnBvcnRUeXBlPg0KLQkNCi0JPHdzZGw6YmluZGluZyBuYW1lPSJQb2x5bW9ycGhpY1NoYXBlQmluZGluZyIgdHlwZT0idG5zOlBvbHltb3JwaGljU2hhcGVQb3J0VHlwZSI+DQotCQk8c29hcDpiaW5kaW5nIHN0eWxlPSJkb2N1bWVudCINCi0JCQl0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIgLz4NCi0NCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJkcmF3Ij4JCQkNCi0JCQk8c29hcDpvcGVyYXRpb24NCi0JCQkJc29hcEFjdGlvbj0iaHR0cDovL3NlaS5wb2x5bW9ycGhpY3NoYXBlLmpheHdzLmF4aXMyLmFwYWNoZS5vcmcvZHJhdyIgLz4NCi0JCQk8d3NkbDppbnB1dD4NCi0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+DQotCQkJPC93c2RsOmlucHV0Pg0KLQkJCTx3c2RsOm91dHB1dD4NCi0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+DQotCQkJPC93c2RsOm91dHB1dD4NCi0JCTwvd3NkbDpvcGVyYXRpb24+DQotCQkNCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJkcmF3M0QiPg0KLQkJCTxzb2FwOm9wZXJhdGlvbg0KLQkJCQlzb2FwQWN0aW9uPSJodHRwOi8vc2VpLnBvbHltb3JwaGljc2hhcGUuamF4d3MuYXhpczIuYXBhY2hlLm9yZy9kcmF3M0QiIC8+DQotCQkJPHdzZGw6aW5wdXQ+DQotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPg0KLQkJCTwvd3NkbDppbnB1dD4NCi0JCQk8d3NkbDpvdXRwdXQ+DQotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPg0KLQkJCTwvd3NkbDpvdXRwdXQ+DQotCQk8L3dzZGw6b3BlcmF0aW9uPg0KLQk8L3dzZGw6YmluZGluZz4NCi0JDQotCTx3c2RsOnNlcnZpY2UgbmFtZT0iUG9seW1vcnBoaWNTaGFwZVNlcnZpY2UiPg0KLQkJPHdzZGw6cG9ydCBuYW1lPSJQb2x5bW9ycGhpY1NoYXBlUG9ydCINCi0JCQliaW5kaW5nPSJ0bnM6UG9seW1vcnBoaWNTaGFwZUJpbmRpbmciPg0KLQkJCTxzb2FwOmFkZHJlc3MNCi0JCQkJbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6NjA2MC9heGlzMi9zZXJ2aWNlcy9Qb2x5bW9ycGhpY1NoYXBlU2VydmljZSIgLz4NCi0JCTwvd3NkbDpwb3J0Pg0KLQk8L3dzZGw6c2VydmljZT4NCi0JDQotPC93c2RsOmRlZmluaXRpb25zPg0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wb2x5bW9ycGhpYy9zaGFwZS9Qb2x5bW9ycGhpY1NoYXBlUG9ydFR5cGVJbXBsLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcG9seW1vcnBoaWMvc2hhcGUvUG9seW1vcnBoaWNTaGFwZVBvcnRUeXBlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGEwNTJkLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wb2x5bW9ycGhpYy9zaGFwZS9Qb2x5bW9ycGhpY1NoYXBlUG9ydFR5cGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnBvbHltb3JwaGljLnNoYXBlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLlRlc3RMb2dnZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MucG9seW1vcnBoaWMuc2hhcGUuc2VpLlBvbHltb3JwaGljU2hhcGVQb3J0VHlwZTsNCi1pbXBvcnQgb3JnLnRlc3Quc2hhcGUuQ2lyY2xlOw0KLWltcG9ydCBvcmcudGVzdC5zaGFwZS5TaGFwZTsNCi1pbXBvcnQgb3JnLnRlc3Quc2hhcGUuU3F1YXJlOw0KLWltcG9ydCBvcmcudGVzdC5zaGFwZS50aHJlZWQuVGhyZWVEU3F1YXJlOw0KLQ0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsNCi0NCi1AV2ViU2VydmljZShzZXJ2aWNlTmFtZT0iUG9seW1vcnBoaWNTaGFwZVNlcnZpY2UiLA0KLSAgICAgICAgcG9ydE5hbWU9IlBvbHltb3JwaGljU2hhcGVQb3J0IiwNCi0gICAgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3NlaS5zaGFwZS5wb2x5bW9ycGhpYy5qYXh3cy5heGlzMi5hcGFjaGUub3JnIiwNCi0gICAgICAgIGVuZHBvaW50SW50ZXJmYWNlPSJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnBvbHltb3JwaGljLnNoYXBlLnNlaS5Qb2x5bW9ycGhpY1NoYXBlUG9ydFR5cGUiLCANCi0JCXdzZGxMb2NhdGlvbj0idGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3BvbHltb3JwaGljL3NoYXBlL01FVEEtSU5GL3NoYXBlcy53c2RsIikNCi1wdWJsaWMgY2xhc3MgUG9seW1vcnBoaWNTaGFwZVBvcnRUeXBlSW1wbCBpbXBsZW1lbnRzIFBvbHltb3JwaGljU2hhcGVQb3J0VHlwZSB7DQotDQotCXB1YmxpYyBTaGFwZSBkcmF3KFNoYXBlIHJlcXVlc3QpIHsNCi0JCWlmKHJlcXVlc3QgaW5zdGFuY2VvZiBDaXJjbGUpew0KLQkJCUNpcmNsZSBjaXJjbGUgPShDaXJjbGUpIHJlcXVlc3Q7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIkRyYXdpbmcgQ2lyY2xlIG9uIHggPSIgKyByZXF1ZXN0LmdldFhBeGlzKCkgKyAiIHk9IiArDQotICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmdldFlBeGlzKCkgKyAiIFdpdGggUmFkaXVzID0iICsgY2lyY2xlLmdldFJhZGl1cygpKTsNCi0JCQlyZXR1cm4gcmVxdWVzdDsNCi0JCX0NCi0JCWlmKHJlcXVlc3QgaW5zdGFuY2VvZiBTcXVhcmUpew0KLQkJCVNxdWFyZSBzcXVhcmUgPShTcXVhcmUpIHJlcXVlc3Q7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIkRyYXdpbmcgU3F1YXJlIG9uIHggPSIgKyByZXF1ZXN0LmdldFhBeGlzKCkgKyAiIHk9IiArDQotICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmdldFlBeGlzKCkgKyAiIFdpdGggU2lkZXMgPSIgKyBzcXVhcmUuZ2V0TGVuZ3RoKCkpOw0KLQkJCXJldHVybiByZXF1ZXN0Ow0KLQkJfQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JcHVibGljIFNoYXBlIGRyYXczRChTaGFwZSByZXF1ZXN0KSB7DQotCQlpZihyZXF1ZXN0IGluc3RhbmNlb2YgVGhyZWVEU3F1YXJlKXsNCi0JCQlUaHJlZURTcXVhcmUgdGhyZWVEc3F1YXJlID0oVGhyZWVEU3F1YXJlKSByZXF1ZXN0Ow0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJEcmF3aW5nIDNEU3F1YXJlIG9uIHggPSIgKyByZXF1ZXN0LmdldFhBeGlzKCkgKyAiIHk9IiArDQotICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmdldFlBeGlzKCkgKyAiIFdpdGggQnJlZHRoID0iICsgdGhyZWVEc3F1YXJlLmdldEJyZWR0aCgpKTsNCi0JCQlyZXR1cm4gcmVxdWVzdDsNCi0JCX0NCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wb2x5bW9ycGhpYy9zaGFwZS9zZWkvUG9seW1vcnBoaWNTaGFwZVBvcnRUeXBlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcG9seW1vcnBoaWMvc2hhcGUvc2VpL1BvbHltb3JwaGljU2hhcGVQb3J0VHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzRhYWFkLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wb2x5bW9ycGhpYy9zaGFwZS9zZWkvUG9seW1vcnBoaWNTaGFwZVBvcnRUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0NCi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnBvbHltb3JwaGljLnNoYXBlLnNlaTsNCi0NCi1pbXBvcnQgb3JnLnRlc3Quc2hhcGUuU2hhcGU7DQotDQotaW1wb3J0IGphdmF4Lmp3cy5XZWJNZXRob2Q7DQotaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbTsNCi1pbXBvcnQgamF2YXguandzLldlYlJlc3VsdDsNCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5SZXF1ZXN0V3JhcHBlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLlJlc3BvbnNlV3JhcHBlcjsNCi0NCi0vKioNCi0gKiBUaGlzIGNsYXNzIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIEpBWFdTIFNJLg0KLSAqIEpBWC1XUyBSSSAyLjBfMDEtYjE1LWZjcw0KLSAqIEdlbmVyYXRlZCBzb3VyY2UgdmVyc2lvbjogMi4wDQotICogDQotICovDQotQFdlYlNlcnZpY2UobmFtZSA9ICJQb2x5bW9ycGhpY1NoYXBlUG9ydFR5cGUiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3NlaS5zaGFwZS5wb2x5bW9ycGhpYy5qYXh3cy5heGlzMi5hcGFjaGUub3JnIikNCi1wdWJsaWMgaW50ZXJmYWNlIFBvbHltb3JwaGljU2hhcGVQb3J0VHlwZSB7DQotDQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIHJlcXVlc3QNCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBvcmcudGVzdC5zaGFwZS5TaGFwZQ0KLSAgICAgKi8NCi0gICAgQFdlYk1ldGhvZChhY3Rpb24gPSAiaHR0cDovL3NlaS5wb2x5bW9ycGhpY3NoYXBlLmpheHdzLmF4aXMyLmFwYWNoZS5vcmcvdHlwZXNFeHRlbnNpb24iKQ0KLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAicmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikNCi0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJkcmF3IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly93cmFwcGVyLnNoYXBlLnRlc3Qub3JnIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LnNoYXBlLndyYXBwZXIuRHJhdyIpDQotICAgIEBSZXNwb25zZVdyYXBwZXIobG9jYWxOYW1lID0gImRyYXdSZXNwb25zZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vd3JhcHBlci5zaGFwZS50ZXN0Lm9yZyIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5zaGFwZS53cmFwcGVyLkRyYXdSZXNwb25zZSIpDQotICAgIHB1YmxpYyBTaGFwZSBkcmF3KA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAicmVxdWVzdCIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQ0KLSAgICAgICAgU2hhcGUgcmVxdWVzdCk7DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIHJlcXVlc3QNCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBvcmcudGVzdC5zaGFwZS5TaGFwZQ0KLSAgICAgKi8NCi0gICAgQFdlYk1ldGhvZChhY3Rpb24gPSAiaHR0cDovL3NlaS5wb2x5bW9ycGhpY3NoYXBlLmpheHdzLmF4aXMyLmFwYWNoZS5vcmcvdHlwZXNFeHRlbnNpb24iKQ0KLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAicmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikNCi0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJkcmF3M0QiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3dyYXBwZXIuc2hhcGUudGVzdC5vcmciLCBjbGFzc05hbWUgPSAib3JnLnRlc3Quc2hhcGUud3JhcHBlci5EcmF3M0QiKQ0KLSAgICBAUmVzcG9uc2VXcmFwcGVyKGxvY2FsTmFtZSA9ICJkcmF3UmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3dyYXBwZXIuc2hhcGUudGVzdC5vcmciLCBjbGFzc05hbWUgPSAib3JnLnRlc3Quc2hhcGUud3JhcHBlci5EcmF3UmVzcG9uc2UiKQ0KLSAgICBwdWJsaWMgU2hhcGUgZHJhdzNEKA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAicmVxdWVzdCIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQ0KLSAgICAgICAgU2hhcGUgcmVxdWVzdCk7DQotDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wb2x5bW9ycGhpYy9zaGFwZS9zZWkvUG9seW1vcnBoaWNTaGFwZVNlcnZpY2UuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wb2x5bW9ycGhpYy9zaGFwZS9zZWkvUG9seW1vcnBoaWNTaGFwZVNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQ5NzEzMC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcG9seW1vcnBoaWMvc2hhcGUvc2VpL1BvbHltb3JwaGljU2hhcGVTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0NCi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnBvbHltb3JwaGljLnNoYXBlLnNlaTsNCi0NCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJFbmRwb2ludDsNCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VDbGllbnQ7DQotaW1wb3J0IGphdmEuaW8uRmlsZTsNCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLm5ldC5VUkw7DQotDQotLyoqDQotICogVGhpcyBjbGFzcyB3YXMgZ2VuZXJhdGVkIGJ5IHRoZSBKQVhXUyBTSS4NCi0gKiBKQVgtV1MgUkkgMi4wXzAxLWIxNS1mY3MNCi0gKiBHZW5lcmF0ZWQgc291cmNlIHZlcnNpb246IDIuMA0KLSAqIA0KLSAqLw0KLUBXZWJTZXJ2aWNlQ2xpZW50KG5hbWUgPSAiUG9seW1vcnBoaWNTaGFwZVNlcnZpY2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3NlaS5zaGFwZS5wb2x5bW9ycGhpYy5qYXh3cy5heGlzMi5hcGFjaGUub3JnIiwgd3NkbExvY2F0aW9uID0gInNoYXBlcy53c2RsIikNCi1wdWJsaWMgY2xhc3MgUG9seW1vcnBoaWNTaGFwZVNlcnZpY2UNCi0gICAgZXh0ZW5kcyBTZXJ2aWNlDQotew0KLQ0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBVUkwgUE9MWU1PUlBISUNTSEFQRVNFUlZJQ0VfV1NETF9MT0NBVElPTjsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHdzZGxMb2NhdGlvbj0iL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wb2x5bW9ycGhpYy9zaGFwZS9NRVRBLUlORi9zaGFwZXMud3NkbCI7DQotICAgIHN0YXRpYyB7DQotICAgICAgICBVUkwgdXJsID0gbnVsbDsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAJdHJ5ew0KLQkgICAgICAgIAlTdHJpbmcgYmFzZURpciA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiYmFzZWRpciIsIi4iKSkuZ2V0Q2Fub25pY2FsUGF0aCgpOw0KLQkgICAgICAgIAl3c2RsTG9jYXRpb24gPSBuZXcgRmlsZShiYXNlRGlyICsgd3NkbExvY2F0aW9uKS5nZXRBYnNvbHV0ZVBhdGgoKTsNCi0gICAgICAgIAl9Y2F0Y2goRXhjZXB0aW9uIGUpew0KLSAgICAgICAgCQllLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgCX0NCi0gICAgICAgIAlGaWxlIGZpbGUgPSBuZXcgRmlsZSh3c2RsTG9jYXRpb24pOw0KLSAgICAgICAgCXVybCA9IGZpbGUudG9VUkwoKTsNCi0gICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIFBPTFlNT1JQSElDU0hBUEVTRVJWSUNFX1dTRExfTE9DQVRJT04gPSB1cmw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFBvbHltb3JwaGljU2hhcGVTZXJ2aWNlKFVSTCB3c2RsTG9jYXRpb24sIFFOYW1lIHNlcnZpY2VOYW1lKSB7DQotICAgICAgICBzdXBlcih3c2RsTG9jYXRpb24sIHNlcnZpY2VOYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUG9seW1vcnBoaWNTaGFwZVNlcnZpY2UoKSB7DQotICAgICAgICBzdXBlcihQT0xZTU9SUEhJQ1NIQVBFU0VSVklDRV9XU0RMX0xPQ0FUSU9OLCBuZXcgUU5hbWUoImh0dHA6Ly9zZWkuc2hhcGUucG9seW1vcnBoaWMuamF4d3MuYXhpczIuYXBhY2hlLm9yZyIsICJQb2x5bW9ycGhpY1NoYXBlU2VydmljZSIpKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgUG9seW1vcnBoaWNTaGFwZVBvcnRUeXBlDQotICAgICAqLw0KLSAgICBAV2ViRW5kcG9pbnQobmFtZSA9ICJQb2x5bW9ycGhpY1NoYXBlUG9ydCIpDQotICAgIHB1YmxpYyBQb2x5bW9ycGhpY1NoYXBlUG9ydFR5cGUgZ2V0UG9seW1vcnBoaWNTaGFwZVBvcnQoKSB7DQotICAgICAgICByZXR1cm4gKFBvbHltb3JwaGljU2hhcGVQb3J0VHlwZSlzdXBlci5nZXRQb3J0KG5ldyBRTmFtZSgiaHR0cDovL3NlaS5zaGFwZS5wb2x5bW9ycGhpYy5qYXh3cy5heGlzMi5hcGFjaGUub3JnIiwgIlBvbHltb3JwaGljU2hhcGVQb3J0IiksIFBvbHltb3JwaGljU2hhcGVQb3J0VHlwZS5jbGFzcyk7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3BvbHltb3JwaGljL3NoYXBlL3Rlc3RzL1BvbHltb3JwaGljVGVzdHMuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wb2x5bW9ycGhpYy9zaGFwZS90ZXN0cy9Qb2x5bW9ycGhpY1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiNjQ4ZmQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3BvbHltb3JwaGljL3NoYXBlL3Rlc3RzL1BvbHltb3JwaGljVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnBvbHltb3JwaGljLnNoYXBlLnRlc3RzOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5UZXN0TG9nZ2VyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmZyYW1ld29yay5BYnN0cmFjdFRlc3RDYXNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnBvbHltb3JwaGljLnNoYXBlLnNlaS5Qb2x5bW9ycGhpY1NoYXBlUG9ydFR5cGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MucG9seW1vcnBoaWMuc2hhcGUuc2VpLlBvbHltb3JwaGljU2hhcGVTZXJ2aWNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnV0aWwuV1NETDRKV3JhcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51dGlsLldTRExXcmFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLndzZGwuU2NoZW1hUmVhZGVyRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLndzZGwuaW1wbC5TY2hlbWFSZWFkZXJJbXBsOw0KLWltcG9ydCBvcmcudGVzdC5zaGFwZS5TaGFwZTsNCi1pbXBvcnQgb3JnLnRlc3Quc2hhcGUuU3F1YXJlOw0KLWltcG9ydCBvcmcudGVzdC5zaGFwZS50aHJlZWQuVGhyZWVEU3F1YXJlOw0KLQ0KLWltcG9ydCBqYXZheC53c2RsLldTRExFeGNlcHRpb247DQotaW1wb3J0IGphdmF4LnhtbC53cy5CaW5kaW5nUHJvdmlkZXI7DQotaW1wb3J0IGphdmEuaW8uRmlsZTsNCi1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247DQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQotaW1wb3J0IGphdmEubmV0LkNvbm5lY3RFeGNlcHRpb247DQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLWltcG9ydCBqYXZhLm5ldC5Vbmtub3duSG9zdEV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLQ0KLXB1YmxpYyBjbGFzcyBQb2x5bW9ycGhpY1Rlc3RzIGV4dGVuZHMgQWJzdHJhY3RUZXN0Q2FzZSB7DQotICAgIFN0cmluZyBheGlzRW5kcG9pbnQgPSAiaHR0cDovL2xvY2FsaG9zdDo2MDYwL2F4aXMyL3NlcnZpY2VzL1BvbHltb3JwaGljU2hhcGVTZXJ2aWNlLlBvbHltb3JwaGljU2hhcGVQb3J0IjsNCi0JDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsNCi0gICAgICAgIHJldHVybiBnZXRUZXN0U2V0dXAobmV3IFRlc3RTdWl0ZShQb2x5bW9ycGhpY1Rlc3RzLmNsYXNzKSk7DQotICAgIH0NCi0NCi0JcHVibGljIHZvaWQgdGVzdEZvcm1hbEFuZEFjdHVhbFR5cGVJbkRpZmZlcmVudFBhY2thZ2VzKCl7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiVGVzdCA6ICIgKyBnZXROYW1lKCkpOw0KLQkJUG9seW1vcnBoaWNTaGFwZVNlcnZpY2Ugc2VydmljZSA9IG5ldyBQb2x5bW9ycGhpY1NoYXBlU2VydmljZSgpOw0KLQkJUG9seW1vcnBoaWNTaGFwZVBvcnRUeXBlIHBvcnQgPSBzZXJ2aWNlLmdldFBvbHltb3JwaGljU2hhcGVQb3J0KCk7DQotICAgICAgICBCaW5kaW5nUHJvdmlkZXIgcCA9IChCaW5kaW5nUHJvdmlkZXIpIHBvcnQ7DQotICAgICAgICBwLmdldFJlcXVlc3RDb250ZXh0KCkucHV0KEJpbmRpbmdQcm92aWRlci5FTkRQT0lOVF9BRERSRVNTX1BST1BFUlRZLCBheGlzRW5kcG9pbnQpOw0KLQ0KLQkJU2hhcGUgc2hhcGVUeXBlOw0KLQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIlNlbmRpbmcgUmVxdWVzdCB0byBkcmF3IFNxdWFyZSIpOw0KLQkJU3F1YXJlIHNoYXBlID0gbmV3IFNxdWFyZSgpOw0KLQkJc2hhcGUuc2V0WEF4aXMoMSk7DQotCQlzaGFwZS5zZXRZQXhpcygxKTsNCi0JCXNoYXBlLnNldExlbmd0aCgxMCk7DQotCQlzaGFwZVR5cGUgPSBwb3J0LmRyYXcoc2hhcGUpOw0KLQkJYXNzZXJ0VHJ1ZShzaGFwZVR5cGUgaW5zdGFuY2VvZiBTcXVhcmUpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIlNxdWFyZSB3YXMgZHJhd24iKTsNCi0NCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJTZW5kaW5nIFJlcXVlc3QgdG8gZHJhdyAzRCBTcXVhcmUiKTsNCi0JCVRocmVlRFNxdWFyZSB0aHJlZURzaGFwZSA9IG5ldyBUaHJlZURTcXVhcmUoKTsNCi0JCXRocmVlRHNoYXBlLnNldFhBeGlzKDEpOw0KLQkJdGhyZWVEc2hhcGUuc2V0WUF4aXMoMSk7DQotCQl0aHJlZURzaGFwZS5zZXRMZW5ndGgoMTApOw0KLQkJdGhyZWVEc2hhcGUuc2V0V2lkdGgoMTApOw0KLQkJdGhyZWVEc2hhcGUuc2V0QnJlZHRoKDEwKTsNCi0JCXNoYXBlVHlwZSA9IHBvcnQuZHJhdzNEKHRocmVlRHNoYXBlKTsNCi0JCWFzc2VydFRydWUoc2hhcGVUeXBlIGluc3RhbmNlb2YgVGhyZWVEU3F1YXJlKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCIzRCBTcXVhcmUgd2FzIGRyYXduIik7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5saW5lVXNlT2ZKQVhCQmluZGluZygpew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIlRlc3QgOiAiICsgZ2V0TmFtZSgpKTsNCi0JCVN0cmluZyBzY2hlbWFCaW5kaW5nUGtnTmFtZSA9ICJvcmcudGVzdC5lY2hvbWVzc2FnZSI7DQotCQlTdHJpbmcgc3RhbmRhcmRQa2dOYW1lPSAib3JnLnRlc3QuY29tcGxleHR5cGUubm9uYW5vbnltb3VzIjsNCi0JCVN0cmluZyB3c2RsTG9jYXRpb249InRlc3QtcmVzb3VyY2VzL3dzZGwvSkFYQl9DdXN0b21pemF0aW9uX1NhbXBsZS53c2RsIjsNCi0JCVVSTCB1cmwgPSBudWxsOw0KLQkJdHJ5ew0KLQkJCXRyeXsNCi0JCQkJU3RyaW5nIGJhc2VEaXIgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoImJhc2VkaXIiLCIuIikpLmdldENhbm9uaWNhbFBhdGgoKTsNCi0JCQkJd3NkbExvY2F0aW9uID0gbmV3IEZpbGUoYmFzZURpciArRmlsZS5zZXBhcmF0b3IrIHdzZGxMb2NhdGlvbikuZ2V0QWJzb2x1dGVQYXRoKCk7DQotCQkJfWNhdGNoKEV4Y2VwdGlvbiBlKXsNCi0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsNCi0JCQkJZmFpbCgpOw0KLQkJCX0NCi0JCQlGaWxlIGZpbGUgPSBuZXcgRmlsZSh3c2RsTG9jYXRpb24pOw0KLQkJCXVybCA9IGZpbGUudG9VUkwoKTsNCi0JCQlXU0RMV3JhcHBlciB3c2RsV3JhcHBlciA9IG5ldyBXU0RMNEpXcmFwcGVyKHVybCk7DQotCQkJb3JnLmFwYWNoZS5heGlzMi5qYXh3cy53c2RsLlNjaGVtYVJlYWRlciBzcj0gbmV3IFNjaGVtYVJlYWRlckltcGwoKTsNCi0JCQlTZXQ8U3RyaW5nPiBzZXQ9IHNyLnJlYWRQYWNrYWdlc0Zyb21TY2hlbWEod3NkbFdyYXBwZXIuZ2V0RGVmaW5pdGlvbigpKTsNCi0JCQlhc3NlcnROb3ROdWxsKHNldCk7DQotCQkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyID0gc2V0Lml0ZXJhdG9yKCk7DQotCQkJd2hpbGUoaXRlci5oYXNOZXh0KCkpew0KLQkJCQlTdHJpbmcgcGtnID0gaXRlci5uZXh0KCk7DQotICAgICAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJQYWNrYWdlID0gIiArIHBrZyk7DQotCQkJfQ0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7DQotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsNCi0JCQlmYWlsKCk7DQotCQl9Y2F0Y2goRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsNCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOw0KLQkJCWZhaWwoKTsNCi0JCX1jYXRjaChVbmtub3duSG9zdEV4Y2VwdGlvbiBlKSB7DQotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsNCi0JCQlmYWlsKCk7DQotCQl9Y2F0Y2goQ29ubmVjdEV4Y2VwdGlvbiBlKSB7DQotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsNCi0JCQlmYWlsKCk7DQotCQl9Y2F0Y2goSU9FeGNlcHRpb24gZSkgew0KLQkJICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAgICAgZmFpbCgpOw0KLSAgICAgICAgfWNhdGNoKFdTRExFeGNlcHRpb24gZSl7DQotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsNCi0JCQlmYWlsKCk7DQotCQl9Y2F0Y2goU2NoZW1hUmVhZGVyRXhjZXB0aW9uIGUpew0KLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7DQotCQkJZmFpbCgpOw0KLQkJfQ0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0U2NoZW1hUmVhZGVyKCl7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiVGVzdCA6ICIgKyBnZXROYW1lKCkpOw0KLQkJU3RyaW5nIHdzZGxMb2NhdGlvbj0idGVzdC1yZXNvdXJjZXMvd3NkbC9zaGFwZXMud3NkbCI7DQotCQlVUkwgdXJsID0gbnVsbDsNCi0JCXRyeXsNCi0JCQl0cnl7DQotCQkJCVN0cmluZyBiYXNlRGlyID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJiYXNlZGlyIiwiLiIpKS5nZXRDYW5vbmljYWxQYXRoKCk7DQotCQkJCXdzZGxMb2NhdGlvbiA9IG5ldyBGaWxlKGJhc2VEaXIgK0ZpbGUuc2VwYXJhdG9yKyB3c2RsTG9jYXRpb24pLmdldEFic29sdXRlUGF0aCgpOw0KLQkJCX1jYXRjaChFeGNlcHRpb24gZSl7DQotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7DQotCQkJCWZhaWwoKTsNCi0JCQl9DQotCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUod3NkbExvY2F0aW9uKTsNCi0JCQl1cmwgPSBmaWxlLnRvVVJMKCk7DQotCQkJV1NETFdyYXBwZXIgd3NkbFdyYXBwZXIgPSBuZXcgV1NETDRKV3JhcHBlcih1cmwpOw0KLQkJCW9yZy5hcGFjaGUuYXhpczIuamF4d3Mud3NkbC5TY2hlbWFSZWFkZXIgc3I9IG5ldyBTY2hlbWFSZWFkZXJJbXBsKCk7DQotCQkJU2V0PFN0cmluZz4gc2V0PSBzci5yZWFkUGFja2FnZXNGcm9tU2NoZW1hKHdzZGxXcmFwcGVyLmdldERlZmluaXRpb24oKSk7DQotCQkJYXNzZXJ0Tm90TnVsbChzZXQpOw0KLQkJCUl0ZXJhdG9yPFN0cmluZz4gaXRlciA9IHNldC5pdGVyYXRvcigpOw0KLQkJCXdoaWxlKGl0ZXIuaGFzTmV4dCgpKXsNCi0gICAgICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIlBhY2thZ2UgPSIgKyBpdGVyLm5leHQoKSk7DQotCQkJfQ0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7DQotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsNCi0JCQlmYWlsKCk7DQotCQl9Y2F0Y2goRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsNCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOw0KLQkJCWZhaWwoKTsNCi0JCX1jYXRjaChVbmtub3duSG9zdEV4Y2VwdGlvbiBlKSB7DQotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsNCi0JCQlmYWlsKCk7DQotCQl9Y2F0Y2goQ29ubmVjdEV4Y2VwdGlvbiBlKSB7DQotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsNCi0JCQlmYWlsKCk7DQotICAgICAgICB9Y2F0Y2goSU9FeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAgICAgZmFpbCgpOw0KLQkJfWNhdGNoKFdTRExFeGNlcHRpb24gZSl7DQotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsNCi0JCQlmYWlsKCk7DQotCQl9Y2F0Y2goU2NoZW1hUmVhZGVyRXhjZXB0aW9uIGUpew0KLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7DQotCQkJZmFpbCgpOw0KLQkJfQ0KLQkJDQotCQkNCi0JCSAgICAgICAgDQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyL0FkZHJlc3NpbmdQcm92aWRlclRlc3RzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvQWRkcmVzc2luZ1Byb3ZpZGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg1N2FhYS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvQWRkcmVzc2luZ1Byb3ZpZGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLlVVSUQ7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLk1lc3NhZ2VGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLk5vZGU7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEJvZHk7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUE1lc3NhZ2U7Ci1pbXBvcnQgamF2YXgueG1sLndzLkJpbmRpbmdQcm92aWRlcjsKLWltcG9ydCBqYXZheC54bWwud3MuRGlzcGF0Y2g7Ci1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VGZWF0dXJlOwotaW1wb3J0IGphdmF4LnhtbC53cy5zb2FwLkFkZHJlc3NpbmdGZWF0dXJlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZnJhbWV3b3JrLkFic3RyYWN0VGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBBZGRyZXNzaW5nUHJvdmlkZXJUZXN0cyBleHRlbmRzIEFic3RyYWN0VGVzdENhc2UgewotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZW5kcG9pbnRVcmwgPSAiaHR0cDovL2xvY2FsaG9zdDo2MDYwL2F4aXMyL3NlcnZpY2VzL0FkZHJlc3NpbmdQcm92aWRlclNlcnZpY2UuQWRkcmVzc2luZ1Byb3ZpZGVyUG9ydCI7ICAgIAotICAgIHByaXZhdGUgUU5hbWUgc2VydmljZU5hbWUgPSBuZXcgUU5hbWUoImh0dHA6Ly9hZGRyZXNzaW5nLnByb3ZpZGVyLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciLCAiQWRkcmVzc2luZ1Byb3ZpZGVyU2VydmljZSIpOwotICAgIHByaXZhdGUgUU5hbWUgcG9ydE5hbWUgPSBuZXcgUU5hbWUoImh0dHA6Ly9hZGRyZXNzaW5nLnByb3ZpZGVyLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciLCAiQWRkcmVzc2luZ1Byb3ZpZGVyUG9ydCIpOwotICAgICAgICAKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVJUX1NPQVAgPSAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiPHNvYXA6RW52ZWxvcGUgeG1sbnM6c29hcD1cImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvXCI+IjsKLSAgICAgIAotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5EX1NPQVAgPSAiPC9zb2FwOkJvZHk+PC9zb2FwOkVudmVsb3BlPiI7Ci0gICAgCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfTUVTU0FHRSA9ICI8bnMyOmluTWVzc2FnZSB4bWxuczpuczI9XCJodHRwOi8vYWRkcmVzc2luZy5wcm92aWRlci5qYXh3cy5heGlzMi5hcGFjaGUub3JnXCI+SGVsbG88L25zMjppbk1lc3NhZ2U+IjsKLSAgICAgICAgCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBTT0FQX01FU1NBR0VfMSA9IFNUQVJUX1NPQVAgKwotICAgICAgICAgICAgICAgICAgICAgICI8c29hcDpCb2R5PiIgKwotICAgICAgICAgICAgICAgICAgICAgIFhNTF9NRVNTQUdFICsKLSAgICAgICAgICAgICAgICAgICAgICBFTkRfU09BUDsKLSAgICAKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFNPQVBfTUVTU0FHRV8yID0gU1RBUlRfU09BUCArICAKLSAgICAgICAgICAgICAgICAgICAgICAiPHNvYXA6SGVhZGVyIHhtbG5zOndzYT1cImh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDgvYWRkcmVzc2luZ1wiPjx3c2E6VG8+ezB9PC93c2E6VG8+PHdzYTpNZXNzYWdlSUQ+ezF9PC93c2E6TWVzc2FnZUlEPjx3c2E6QWN0aW9uPnsyfTwvd3NhOkFjdGlvbj48L3NvYXA6SGVhZGVyPiIgKwotICAgICAgICAgICAgICAgICAgICAgICI8c29hcDpCb2R5PiIgKwotICAgICAgICAgICAgICAgICAgICAgIFhNTF9NRVNTQUdFICsKLSAgICAgICAgICAgICAgICAgICAgICBFTkRfU09BUDsKLSAgICAgICAgICAgICAgICAgICAgICAKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTiA9ICJodHRwOi8vYWRkcmVzc2luZy5wcm92aWRlci5qYXh3cy5heGlzMi5hcGFjaGUub3JnL0FkZHJlc3NpbmdQcm92aWRlckludGVyZmFjZS9JbiI7Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotICAgICAgICByZXR1cm4gZ2V0VGVzdFNldHVwKG5ldyBUZXN0U3VpdGUoQWRkcmVzc2luZ1Byb3ZpZGVyVGVzdHMuY2xhc3MpLCBudWxsLAotICAgICAgICAgICAgICAgICJ0ZXN0LXJlc291cmNlcy9heGlzMl9hZGRyZXNzaW5nLnhtbCIpOwotICAgIH0KLSAgIAotICAgIC8qKgotICAgICAqIEluamVjdCBjb3JyZWN0IHdzYSBoZWFkZXIgKHdzYTpBY3Rpb24gbXVzdCBiZSBzZXQgdGhlIHRoZSBhY3Rpb24gb2YgaGVsbG8gb3BlcmF0aW9uKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RJbmplY3RBZGRyZXNzaW5nSGVhZGVycygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAgIAotICAgICAgICBEaXNwYXRjaDxTT0FQTWVzc2FnZT4gZGlzcGF0Y2ggPSBjcmVhdGVEaXNwYXRjaCgpOwotICAgICAgICAgICAgIAotICAgICAgICBTdHJpbmcgbXNnID0gU09BUF9NRVNTQUdFXzE7Ci0gICAgICAgIE1lc3NhZ2VGYWN0b3J5IGZhY3RvcnkgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICBTT0FQTWVzc2FnZSByZXF1ZXN0ID0gZmFjdG9yeS5jcmVhdGVNZXNzYWdlKG51bGwsIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShtc2cuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIFNPQVBNZXNzYWdlIHJlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOwotICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIGFzc2VydFJlc3BvbnNlWE1MKHJlc3BvbnNlLCAiSGVsbG8gUmVzcG9uc2UiKTsKLSAgICAgICAgCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihyZXNwb25zZS50b1N0cmluZygpKTsgCi0gICAgICAgIAotICAgICAgICAvLyBUcnkgQWdhaW4gdG8gdmVyaWZ5Ci0gICAgICAgIHJlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0UmVzcG9uc2VYTUwocmVzcG9uc2UsICJIZWxsbyBSZXNwb25zZSIpOwotICAgICAgICAKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHJlc3BvbnNlLnRvU3RyaW5nKCkpOyAKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogTWVzc2FnZSBhbHJlYWR5IGNvbnRhaW5zIHdzYSBoZWFkZXJzLiBNYWtlIHN1cmUgdGhlcmUgaXMgbm8gbWlzbWF0Y2ggYmV0d2VlbiAKLSAgICAgKiBTT0FQQWN0aW9uIGFuZCB3c2E6QWN0aW9uLiAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0V2l0aEFkZHJlc3NpbmdIZWFkZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgRGlzcGF0Y2g8U09BUE1lc3NhZ2U+IGRpc3BhdGNoID0gY3JlYXRlRGlzcGF0Y2goKTsKLSAgICAgICAgICAgICAKLSAgICAgICAgU3RyaW5nIG1zZyA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KFNPQVBfTUVTU0FHRV8yLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZHBvaW50VXJsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVybjoiICsgVVVJRC5yYW5kb21VVUlEKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQ1RJT04pOwotICAgICAgICAKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG1zZyk7Ci0gICAgICAgIAotICAgICAgICBNZXNzYWdlRmFjdG9yeSBmYWN0b3J5ID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgU09BUE1lc3NhZ2UgcmVxdWVzdCA9IGZhY3RvcnkuY3JlYXRlTWVzc2FnZShudWxsLCBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0obXNnLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBTT0FQTWVzc2FnZSByZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsKLSAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBhc3NlcnRSZXNwb25zZVhNTChyZXNwb25zZSwgIkhlbGxvIFJlc3BvbnNlIik7Ci0gICAgICAgIAotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4ocmVzcG9uc2UudG9TdHJpbmcoKSk7Ci0gICAgICAgIAotICAgICAgICAvLyBUcnkgYWdhaW4gdG8gdmVyaWZ5Ci0gICAgICAgIHJlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0UmVzcG9uc2VYTUwocmVzcG9uc2UsICJIZWxsbyBSZXNwb25zZSIpOwotICAgICAgICAKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHJlc3BvbnNlLnRvU3RyaW5nKCkpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIFNPQVBFbGVtZW50IGFzc2VydFJlc3BvbnNlWE1MKFNPQVBNZXNzYWdlIG1zZywgU3RyaW5nIGV4cGVjdGVkVGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydFRydWUobXNnICE9IG51bGwpOwotICAgICAgICBTT0FQQm9keSBib2R5ID0gbXNnLmdldFNPQVBCb2R5KCk7Ci0gICAgICAgIGFzc2VydFRydWUoYm9keSAhPSBudWxsKTsKLSAgICAgICAgCi0gICAgICAgIE5vZGUgaW52b2tlRWxlbWVudCA9IChOb2RlKSBib2R5LmdldEZpcnN0Q2hpbGQoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShpbnZva2VFbGVtZW50IGluc3RhbmNlb2YgU09BUEVsZW1lbnQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIm91dE1lc3NhZ2UiLCBpbnZva2VFbGVtZW50LmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgU3RyaW5nIHRleHQgPSBpbnZva2VFbGVtZW50LmdldFZhbHVlKCk7Ci0gICAgICAgIAotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlJlY2VpdmVkOiAiICsgdGV4dCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiRm91bmQgKCIrIHRleHQgKyAiKSBidXQgZXhwZWN0ZWQgKCIgKyBleHBlY3RlZFRleHQgKyAiKSIsIGV4cGVjdGVkVGV4dCwgdGV4dCk7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gKFNPQVBFbGVtZW50KSBpbnZva2VFbGVtZW50OwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIERpc3BhdGNoPFNPQVBNZXNzYWdlPiBjcmVhdGVEaXNwYXRjaCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBVUkwgd3NkbFVSTCA9IGdldFdzZGwoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh3c2RsVVJMKTsKLSAgICAgICAgU2VydmljZSBzdmMgPSBTZXJ2aWNlLmNyZWF0ZSh3c2RsVVJMLCBzZXJ2aWNlTmFtZSk7Ci0gICAgICAgIAotICAgICAgICBXZWJTZXJ2aWNlRmVhdHVyZVtdIHdzZiA9IHtuZXcgQWRkcmVzc2luZ0ZlYXR1cmUodHJ1ZSl9OwotICAgICAgICAKLSAgICAgICAgRGlzcGF0Y2g8U09BUE1lc3NhZ2U+IGRpc3BhdGNoID0KLSAgICAgICAgICAgIHN2Yy5jcmVhdGVEaXNwYXRjaChwb3J0TmFtZSwgU09BUE1lc3NhZ2UuY2xhc3MsIFNlcnZpY2UuTW9kZS5NRVNTQUdFLCB3c2YpOwotICAgICAgICAKLSAgICAgICAgQmluZGluZ1Byb3ZpZGVyIHAgPSAoQmluZGluZ1Byb3ZpZGVyKSBkaXNwYXRjaDsKLSAgICAgICAgcC5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dChCaW5kaW5nUHJvdmlkZXIuRU5EUE9JTlRfQUREUkVTU19QUk9QRVJUWSwgZW5kcG9pbnRVcmwpOwotCi0gICAgICAgIHJldHVybiBkaXNwYXRjaDsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBVUkwgZ2V0V3NkbCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgd3NkbExvY2F0aW9uID0gIi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvYWRkcmVzc2luZy9NRVRBLUlORi9BZGRyZXNzaW5nUHJvdmlkZXIud3NkbCI7Ci0gICAgICAgIFN0cmluZyBiYXNlRGlyID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJiYXNlZGlyIiwiLiIpKS5nZXRDYW5vbmljYWxQYXRoKCk7Ci0gICAgICAgIHdzZGxMb2NhdGlvbiA9IG5ldyBGaWxlKGJhc2VEaXIgKyB3c2RsTG9jYXRpb24pLmdldEFic29sdXRlUGF0aCgpOyAgICAKLSAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUod3NkbExvY2F0aW9uKTsKLSAgICAgICAgcmV0dXJuIGZpbGUudG9VUkwoKTsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvQXR0YWNobWVudFV0aWwuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9BdHRhY2htZW50VXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGNiZmQ1Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9BdHRhY2htZW50VXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJvdmlkZXI7DQotDQotaW1wb3J0IGphdmF4LmltYWdlaW8uSUlPSW1hZ2U7DQotaW1wb3J0IGphdmF4LmltYWdlaW8uSW1hZ2VXcml0ZXI7DQotaW1wb3J0IGphdmF4LmltYWdlaW8uc3RyZWFtLkltYWdlT3V0cHV0U3RyZWFtOw0KLWltcG9ydCBqYXZheC54bWwuc29hcC5NZXNzYWdlRmFjdG9yeTsNCi1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUENvbnN0YW50czsNCi1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUE1lc3NhZ2U7DQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uUmVzdWx0Ow0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsNCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjsNCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk7DQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdDsNCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtU291cmNlOw0KLWltcG9ydCBqYXZhLmF3dC4qOw0KLWltcG9ydCBqYXZhLmF3dC5pbWFnZS5CdWZmZXJlZEltYWdlOw0KLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7DQotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOw0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQotDQotLyoqDQotICogVGhpcyB3aWxsIHNlcnZlIGFzIGEgaGVscGVyIGNsYXNzIGZvciBhdHRhY2htZW50cyB1dGlsaXR5IG1ldGhvZHMuIEFsbCBtZXRob2RzDQotICogYXJlIGludGVuZGVkIHRvIGJlIHJlZmVyZW5jZWQgc3RhdGljbHkuDQotICoNCi0gKi8NCi1wdWJsaWMgY2xhc3MgQXR0YWNobWVudFV0aWwgew0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTT0FQMTFfTkFNRVNQQUNFID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUiOw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTT0FQMTJfTkFNRVNQQUNFID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZSI7DQotDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1VX1RFWFQgPSAic29hcCBtZXNzYWdlIG11c3RVbmRlcnN0YW5kIGhlYWRlciByZXF1ZXN0IjsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU5ERVJTVE9PRF9NVV9URVhUID0gInVuZGVyc3Rvb2QgaGVhZGVycyBzb2FwIG1lc3NhZ2UgbXVzdFVuZGVyc3RhbmQgaGVhZGVyIHJlcXVlc3QiOw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUID0gInNvYXAgbWVzc2FnZSByZXF1ZXN0IjsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUUgPSAidmFsdWUiOw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9OT0RFID0gIjwiK1ZBTFVFKyI+IjsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfTk9ERV9TTEFTSCA9ICI8LyIrVkFMVUUrIj4iOw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfSEVBREVSID0gIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PiI7DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1VSEVBREVSX0NMSUVOVCA9ICJuczE6bXVjbGllbnQiOw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNVUhFQURFUl9TRVJWRVIgPSAibnMxOm11c2VydmVyIjsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVVIRUFERVJfQ0xJRU5UX1VOREVSU1RPT0QgPSAibnMxOm11Y2xpZW50dW5kZXJzdG9vZCI7DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1VSEVBREVSX1NFUlZFUl9VTkRFUlNUT09EID0gIm5zMTptdXNlcnZlcnVuZGVyc3Rvb2QiOw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBtc2dFbnZNVSA9IA0KLSAgICAgICAgIjxzb2FwZW52OkVudmVsb3BlIHhtbG5zOnNvYXBlbnY9XCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlL1wiPiIgKw0KLSAgICAgICAgICAgICI8c29hcGVudjpIZWFkZXI+IiArDQotICAgICAgICAgICAgICAgICI8IitNVUhFQURFUl9DTElFTlQrIiB4bWxuczpuczE9XCJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMlwiIHNvYXBlbnY6bXVzdFVuZGVyc3RhbmQ9XCIxXCI+TVVpbmZvPC8iK01VSEVBREVSX0NMSUVOVCsiPiIgKw0KLSAgICAgICAgICAgICI8L3NvYXBlbnY6SGVhZGVyPiIgKw0KLSAgICAgICAgICAgICI8c29hcGVudjpCb2R5PiIgKw0KLSAgICAgICAgICAgICAgICAiPG5zMTppbnZva2UgeG1sbnM6bnMxPVwiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczJcIj4iICsNCi0gICAgICAgICAgICAgICAgICAgIFZBTFVFX05PREUgKw0KLSAgICAgICAgICAgICAgICAgICAgTVVfVEVYVCArDQotICAgICAgICAgICAgICAgICAgICBWQUxVRV9OT0RFX1NMQVNIICsNCi0gICAgICAgICAgICAgICAgIjwvbnMxOmludm9rZT4iICsNCi0gICAgICAgICAgICAiPC9zb2FwZW52OkJvZHk+IiArDQotICAgICAgICAiPC9zb2FwZW52OkVudmVsb3BlPiI7DQotICAgIA0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBtc2dFbnYgPSANCi0gICAgICAgICI8c29hcGVudjpFbnZlbG9wZSB4bWxuczpzb2FwZW52PVwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS9cIj4iICsNCi0gICAgICAgICAgICAiPHNvYXBlbnY6Qm9keT4iICsNCi0gICAgICAgICAgICAgICAgIjxuczE6aW52b2tlIHhtbG5zOm5zMT1cImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyXCI+IiArDQotICAgICAgICAgICAgICAgICAgICBWQUxVRV9OT0RFICsNCi0gICAgICAgICAgICAgICAgICAgIE1VX1RFWFQgKw0KLSAgICAgICAgICAgICAgICAgICAgVkFMVUVfTk9ERV9TTEFTSCArDQotICAgICAgICAgICAgICAgICI8L25zMTppbnZva2U+IiArDQotICAgICAgICAgICAgIjwvc29hcGVudjpCb2R5PiIgKw0KLSAgICAgICAgIjwvc29hcGVudjpFbnZlbG9wZT4iOw0KLSAgICANCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgbXNnRW52UGxhaW4gPSANCi0gICAgICAgICI8c29hcGVudjpFbnZlbG9wZSB4bWxuczpzb2FwZW52PVwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS9cIj4iICsNCi0gICAgICAgICAgICAiPHNvYXBlbnY6Qm9keT4iICsNCi0gICAgICAgICAgICAgICAgIjxuczE6aW52b2tlIHhtbG5zOm5zMT1cImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyXCI+IiArDQotICAgICAgICAgICAgICAgICAgICBWQUxVRV9OT0RFICsNCi0gICAgICAgICAgICAgICAgICAgIFRFWFQgKw0KLSAgICAgICAgICAgICAgICAgICAgVkFMVUVfTk9ERV9TTEFTSCArDQotICAgICAgICAgICAgICAgICI8L25zMTppbnZva2U+IiArDQotICAgICAgICAgICAgIjwvc29hcGVudjpCb2R5PiIgKw0KLSAgICAgICAgIjwvc29hcGVudjpFbnZlbG9wZT4iOw0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBtc2dFbnZNVV91bmRlcnN0b29kID0gDQotICAgICAgICAiPHNvYXBlbnY6RW52ZWxvcGUgeG1sbnM6c29hcGVudj1cImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvXCI+IiArDQotICAgICAgICAgICAgIjxzb2FwZW52OkhlYWRlcj4iICsNCi0gICAgICAgICAgICAgICAgIjwiK01VSEVBREVSX0NMSUVOVF9VTkRFUlNUT09EKyIgeG1sbnM6bnMxPVwiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczJcIiBzb2FwZW52Om11c3RVbmRlcnN0YW5kPVwiMVwiPk1VaW5mbzwvIitNVUhFQURFUl9DTElFTlRfVU5ERVJTVE9PRCsiPiIgKw0KLSAgICAgICAgICAgICI8L3NvYXBlbnY6SGVhZGVyPiIgKw0KLSAgICAgICAgICAgICI8c29hcGVudjpCb2R5PiIgKw0KLSAgICAgICAgICAgICAgICAiPG5zMTppbnZva2UgeG1sbnM6bnMxPVwiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczJcIj4iICsNCi0gICAgICAgICAgICAgICAgICAgIFZBTFVFX05PREUgKw0KLSAgICAgICAgICAgICAgICAgICAgVU5ERVJTVE9PRF9NVV9URVhUICsNCi0gICAgICAgICAgICAgICAgICAgIFZBTFVFX05PREVfU0xBU0ggKw0KLSAgICAgICAgICAgICAgICAiPC9uczE6aW52b2tlPiIgKw0KLSAgICAgICAgICAgICI8L3NvYXBlbnY6Qm9keT4iICsNCi0gICAgICAgICI8L3NvYXBlbnY6RW52ZWxvcGU+IjsNCi0gICAgDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIG1zZ0Vudl91bmRlcnN0b29kID0gDQotICAgICAgICAiPHNvYXBlbnY6RW52ZWxvcGUgeG1sbnM6c29hcGVudj1cImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvXCI+IiArDQotICAgICAgICAgICAgIjxzb2FwZW52OkJvZHk+IiArDQotICAgICAgICAgICAgICAgICI8bnMxOmludm9rZSB4bWxuczpuczE9XCJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMlwiPiIgKw0KLSAgICAgICAgICAgICAgICAgICAgVkFMVUVfTk9ERSArDQotICAgICAgICAgICAgICAgICAgICBVTkRFUlNUT09EX01VX1RFWFQgKw0KLSAgICAgICAgICAgICAgICAgICAgVkFMVUVfTk9ERV9TTEFTSCArDQotICAgICAgICAgICAgICAgICI8L25zMTppbnZva2U+IiArDQotICAgICAgICAgICAgIjwvc29hcGVudjpCb2R5PiIgKw0KLSAgICAgICAgIjwvc29hcGVudjpFbnZlbG9wZT4iOw0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFN0b3JlIGEgZ2l2ZW4gaW1hZ2UgdG8gYW4gSW1hZ2Ugb3V0cHV0IHN0cmVhbQ0KLSAgICAgKiBAcGFyYW0gbWltZVR5cGUNCi0gICAgICogQHBhcmFtIGltYWdlDQotICAgICAqIEBwYXJhbSBvcw0KLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHN0b3JlSW1hZ2UoU3RyaW5nIG1pbWVUeXBlLCBJbWFnZSBpbWFnZSwgT3V0cHV0U3RyZWFtIG9zKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIEltYWdlV3JpdGVyIGltYWdlV3JpdGVyID0gbnVsbDsNCi0gICAgICAgIEJ1ZmZlcmVkSW1hZ2UgYnVmZmVyZWRJbWFnZSA9IChCdWZmZXJlZEltYWdlKSBpbWFnZTsNCi0gICAgICAgIA0KLSAgICAgICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBqYXZheC5pbWFnZWlvLkltYWdlSU8uZ2V0SW1hZ2VXcml0ZXJzQnlNSU1FVHlwZShtaW1lVHlwZSk7DQotICAgICAgICBpZiAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7DQotICAgICAgICAJaW1hZ2VXcml0ZXIgPSAoSW1hZ2VXcml0ZXIpIGl0ZXJhdG9yLm5leHQoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIEltYWdlT3V0cHV0U3RyZWFtIGlvcyA9IGphdmF4LmltYWdlaW8uSW1hZ2VJTy5jcmVhdGVJbWFnZU91dHB1dFN0cmVhbShvcyk7DQotICAgICAgICBpbWFnZVdyaXRlci5zZXRPdXRwdXQoaW9zKTsNCi0NCi0gICAgICAgIGltYWdlV3JpdGVyLndyaXRlKG5ldyBJSU9JbWFnZShidWZmZXJlZEltYWdlLCBudWxsLCBudWxsKSk7DQotICAgICAgICBpb3MuZmx1c2goKTsNCi0gICAgICAgIGltYWdlV3JpdGVyLmRpc3Bvc2UoKTsNCi0gICAgfQ0KLSAgICANCi0JLyoqDQotCSAqIEFkYXB0ZXIgbWV0aG9kIHVzZWQgdG8gY29udmVydCBhbnkgdHlwZSBvZiBTb3VyY2UgdG8gYSBTdHJpbmcNCi0JICogDQotCSAqIEBwYXJhbSBpbnB1dA0KLQkgKiBAcmV0dXJuDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b1N0cmluZyhTb3VyY2UgaW5wdXQpIHsNCi0NCi0JCWlmIChpbnB1dCA9PSBudWxsKQ0KLQkJCXJldHVybiBudWxsOw0KLQ0KLQkJU3RyaW5nV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsNCi0JCVRyYW5zZm9ybWVyIHRyYXNmb3JtZXI7DQotCQl0cnkgew0KLQkJCXRyYXNmb3JtZXIgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdUcmFuc2Zvcm1lcigpOw0KLQkJCVJlc3VsdCByZXN1bHQgPSBuZXcgU3RyZWFtUmVzdWx0KHdyaXRlcik7DQotCQkJdHJhc2Zvcm1lci50cmFuc2Zvcm0oaW5wdXQsIHJlc3VsdCk7DQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLQkJCXJldHVybiBudWxsOw0KLQkJfQ0KLQ0KLQkJcmV0dXJuIHdyaXRlci5nZXRCdWZmZXIoKS50b1N0cmluZygpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBBZGFwdGVyIG1ldGhvZCB1c2VkIHRvIGNvbnZlcnQgYW55IHR5cGUgb2YgU09BUE1lc3NhZ2UgdG8gYSBTdHJpbmcNCi0JICogDQotCSAqIEBwYXJhbSBpbnB1dA0KLQkgKiBAcmV0dXJuDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b1N0cmluZyhTT0FQTWVzc2FnZSBpbnB1dCkgew0KLQ0KLQkJaWYgKGlucHV0ID09IG51bGwpDQotCQkJcmV0dXJuIG51bGw7DQotDQotCQlTb3VyY2UgcmVzdWx0ID0gbnVsbDsNCi0JCXRyeSB7DQotCQkJcmVzdWx0ID0gaW5wdXQuZ2V0U09BUFBhcnQoKS5nZXRDb250ZW50KCk7DQotCQl9IGNhdGNoIChTT0FQRXhjZXB0aW9uIGUpIHsNCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOw0KLQkJfQ0KLQ0KLQkJcmV0dXJuIHRvU3RyaW5nKHJlc3VsdCk7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBNZXRob2QgdXNlZCB0byBjb252ZXJ0IFN0cmluZ3MgdG8gU09BUE1lc3NhZ2VzDQotCSAqIA0KLQkgKiBAcGFyYW0gbXNnU3RyaW5nDQotCSAqIEByZXR1cm4NCi0JICovDQotICAgICAgICBwdWJsaWMgc3RhdGljIFNPQVBNZXNzYWdlIHRvU09BUE1lc3NhZ2UoU3RyaW5nIG1zZ1N0cmluZykgew0KLQ0KLSAgICAgICAgIGlmIChtc2dTdHJpbmcgPT0gbnVsbCkgcmV0dXJuIG51bGw7DQotDQotICAgICAgICAgU09BUE1lc3NhZ2UgbWVzc2FnZSA9IG51bGw7DQotICAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5IGZhY3RvcnkgPSBudWxsOw0KLQ0KLSAgICAgICAgICAgICAgICAgLy8gRm9yY2UgdGhlIHVzYWdlIG9mIHNwZWNpZmljIE1lc2FzZ2VGYWN0b3JpZXMNCi0gICAgICAgICAgICAgICAgIGlmIChtc2dTdHJpbmcuaW5kZXhPZihTT0FQMTFfTkFNRVNQQUNFKSA+PSAwKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3RvcnkgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZShTT0FQQ29uc3RhbnRzLlNPQVBfMV8xX1BST1RPQ09MKTsNCi0gICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3RvcnkgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZShTT0FQQ29uc3RhbnRzLlNPQVBfMV8yX1BST1RPQ09MKTsNCi0gICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBmYWN0b3J5LmNyZWF0ZU1lc3NhZ2UoKTsNCi0gICAgICAgICAgICAgICAgIG1lc3NhZ2UuZ2V0U09BUFBhcnQoKS5zZXRDb250ZW50KChTb3VyY2UpIG5ldyBTdHJlYW1Tb3VyY2UobmV3IFN0cmluZ1JlYWRlcihtc2dTdHJpbmcpKSk7DQotICAgICAgICAgICAgICAgICBtZXNzYWdlLnNhdmVDaGFuZ2VzKCk7DQotICAgICAgICAgfSBjYXRjaCAoU09BUEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInRvU09BUE1lc3NhZ2UgRXhjZXB0aW9uIGVuY291bnRlcmVkOiAiICsgZSk7DQotICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgIH0NCi0gICAgICAgICByZXR1cm4gbWVzc2FnZTsgICAgIA0KLSAgICB9DQotICAgIA0KLX0NCi0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvRGF0YVNvdXJjZUltcGwuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9EYXRhU291cmNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDEwYzgzLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9EYXRhU291cmNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJvdmlkZXI7DQotDQotaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRGF0YVNvdXJjZTsNCi1pbXBvcnQgamF2YS5hd3QuKjsNCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07DQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07DQotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOw0KLQ0KLS8qKg0KLSAqIEFuIGltcGwgY2xhc3MgZm9yIGphdmF4LmFjdGl2YXRpb24uRGF0YVNvdXJjZSBpbnRlcmZhY2UuDQotICoNCi0gKi8NCi1wdWJsaWMgY2xhc3MgRGF0YVNvdXJjZUltcGwgaW1wbGVtZW50cyBEYXRhU291cmNlIHsNCi0NCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZmlsZU5hbWU7DQotDQotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGNvbnRlbnRUeXBlOw0KLQ0KLSAgICBwcml2YXRlIGJ5dGVbXSBieXRlQXJyYXk7DQotDQotICAgIHByaXZhdGUgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJ5dGVBcnJheU9TOw0KLSAgICANCi0JLyoqDQotCSAqIENvbnN0cnVjdG9yDQotCSAqIA0KLQkgKiBAcGFyYW0gX2NvbnRlbnRUeXBlDQotCSAqIEBwYXJhbSBfZmlsZU5hbWUNCi0JICogQHBhcmFtIGltYWdlDQotCSAqIEB0aHJvd3MgRXhjZXB0aW9uDQotCSAqLw0KLQlwdWJsaWMgRGF0YVNvdXJjZUltcGwoU3RyaW5nIF9jb250ZW50VHlwZSwgU3RyaW5nIF9maWxlTmFtZSwgSW1hZ2UgaW1hZ2UpIHRocm93cyBFeGNlcHRpb257DQotCQlzdXBlcigpOw0KLSAgICAgICAgDQotICAgICAgICB0cnkgew0KLSAgICAgICAgCWlmKChfY29udGVudFR5cGUgPT0gbnVsbCkgfHwgKF9jb250ZW50VHlwZSA9PSAiIikpew0KLSAgICAgICAgCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIlR5cGUgaXMgTlVMTDogTXVzdCBwcm92aWRlIGNvbnRlbnQgdHlwZSIpOw0KLSAgICAgICAgCX0NCi0gICAgICAgIAlpZigoX2ZpbGVOYW1lID09IG51bGwpIHx8IChfY29udGVudFR5cGUgPT0gIiIpKXsNCi0gICAgICAgIAkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJGaWxlIG5hbWUgaXMgTlVMTDogTXVzdCBwcm92aWRlIGNvbnRlbnQgZmlsZSBuYW1lIik7DQotICAgICAgICAJfQ0KLSAgICAgICAgCQ0KLSAgICAgICAgCXRoaXMuZmlsZU5hbWUgPSBfZmlsZU5hbWU7DQotICAgIAkJdGhpcy5jb250ZW50VHlwZSA9IF9jb250ZW50VHlwZTsNCi0gICAgICAgIAkNCi0gICAgICAgICAgICBpZiAoaW1hZ2UgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIAlieXRlQXJyYXlPUyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsNCi0gICAgICAgICAgICAgICAgQXR0YWNobWVudFV0aWwuc3RvcmVJbWFnZSh0aGlzLmNvbnRlbnRUeXBlLCBpbWFnZSwgYnl0ZUFycmF5T1MpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgdGhyb3cgZTsNCi0gICAgICAgIH0NCi0NCi0JfQ0KLQ0KLQkvKiAobm9uLUphdmFkb2MpDQotCSAqIEBzZWUgamF2YXguYWN0aXZhdGlvbi5EYXRhU291cmNlI2dldENvbnRlbnRUeXBlKCkNCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudFR5cGUoKSB7DQotCQlyZXR1cm4gdGhpcy5jb250ZW50VHlwZTsNCi0JfQ0KLQ0KLQkvKiAobm9uLUphdmFkb2MpDQotCSAqIEBzZWUgamF2YXguYWN0aXZhdGlvbi5EYXRhU291cmNlI2dldElucHV0U3RyZWFtKCkNCi0JICovDQotCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotCQlpZiAodGhpcy5ieXRlQXJyYXlPUy5zaXplKCkgIT0gMCkgew0KLQkJCXRoaXMuYnl0ZUFycmF5ID0gdGhpcy5ieXRlQXJyYXlPUy50b0J5dGVBcnJheSgpOw0KLSAgICAgICAgICAgIHRoaXMuYnl0ZUFycmF5T1MucmVzZXQoKTsNCi0gICAgICAgIH0NCi0JCQ0KLQkJaWYodGhpcy5ieXRlQXJyYXkgPT0gbnVsbCl7DQotCQkJcmV0dXJuIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShuZXcgYnl0ZVswXSk7DQotCQkJDQotCQl9DQotICAgICAgICByZXR1cm4gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHRoaXMuYnl0ZUFycmF5KTsNCi0JfQ0KLQ0KLQkvKiAobm9uLUphdmFkb2MpDQotCSAqIEBzZWUgamF2YXguYWN0aXZhdGlvbi5EYXRhU291cmNlI2dldE5hbWUoKQ0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgew0KLQkJcmV0dXJuIHRoaXMuZmlsZU5hbWU7DQotCX0NCi0NCi0JLyogKG5vbi1KYXZhZG9jKQ0KLQkgKiBAc2VlIGphdmF4LmFjdGl2YXRpb24uRGF0YVNvdXJjZSNnZXRPdXRwdXRTdHJlYW0oKQ0KLQkgKi8NCi0JcHVibGljIE91dHB1dFN0cmVhbSBnZXRPdXRwdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLQkJaWYgKHRoaXMuYnl0ZUFycmF5T1Muc2l6ZSgpICE9IDApIHsNCi0JCQl0aGlzLmJ5dGVBcnJheSA9IHRoaXMuYnl0ZUFycmF5T1MudG9CeXRlQXJyYXkoKTsNCi0gICAgICAgICAgICB0aGlzLmJ5dGVBcnJheU9TLnJlc2V0KCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gdGhpcy5ieXRlQXJyYXlPUzsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvSkFYQlByb3ZpZGVyVGVzdHMuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9KQVhCUHJvdmlkZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODZkNzQ0Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9KQVhCUHJvdmlkZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJvdmlkZXI7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLmF0dGFjaG1lbnRzLkJ5dGVBcnJheURhdGFTb3VyY2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuVGVzdExvZ2dlcjsNCi1pbXBvcnQgb3JnLnRlc3QubXRvbS5JbWFnZURlcG90Ow0KLWltcG9ydCBvcmcudGVzdC5tdG9tLk9iamVjdEZhY3Rvcnk7DQotaW1wb3J0IG9yZy50ZXN0Lm10b20uU2VuZEltYWdlOw0KLWltcG9ydCBvcmcudGVzdC5tdG9tLlNlbmRJbWFnZVJlc3BvbnNlOw0KLQ0KLWltcG9ydCBqYXZheC5hY3RpdmF0aW9uLkRhdGFIYW5kbGVyOw0KLWltcG9ydCBqYXZheC5hY3RpdmF0aW9uLkRhdGFTb3VyY2U7DQotaW1wb3J0IGphdmF4LmltYWdlaW8uSW1hZ2VJTzsNCi1pbXBvcnQgamF2YXguaW1hZ2Vpby5zdHJlYW0uRmlsZUltYWdlSW5wdXRTdHJlYW07DQotaW1wb3J0IGphdmF4LmltYWdlaW8uc3RyZWFtLkltYWdlSW5wdXRTdHJlYW07DQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJDb250ZXh0Ow0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOw0KLWltcG9ydCBqYXZheC54bWwud3MuRGlzcGF0Y2g7DQotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5NVE9NRmVhdHVyZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuU09BUEJpbmRpbmc7DQotDQotaW1wb3J0IGphdmEuYXd0Lio7DQotaW1wb3J0IGphdmEuaW8uRmlsZTsNCi0NCi0vKioNCi0gKiBUaGUgaW50ZW5kZWQgcHVycG9zZSBvZiB0aGlzIHRlc3RjYXNlIGlzIHRvIHRlc3QgdGhlIE1UT00gZnVuY3Rpb25zIGluIEF4aXMyLiANCi0gKiBJdCBkZW1vc3RyYXRlIGFuIGFsdGVybmF0aXZlIHdheSBvZiBzZW5kaW5nIGFuIGF0dGFjaG1lbnQgdXNpbmcgRGF0YUhhbmRsZXIuDQotICogDQotICogVGhpcyB0ZXN0Y2FzZSB1c2VzIGEgSkFYV1MgRGlzcGF0Y2ggaW52b2NhdGlvbiB3aXRoIEpBWEIgZ2VuZXJhdGVkIHJlcXVlc3Qgb2JqZWN0DQotICogYXMgcGFyYW1ldGVyLiBUaGUgZW5kcG9pbnQgZm9yIHRoZXNlIHRlc3RjYXNlIGlzIGEgSkFYV1MgU291cmNlIFByb3ZpZGVyLg0KLSAqIA0KLSAqIFRoZXNlIEpBWEIgZ2VuZXJhdGVkIGFydGlmYWN0cyBpcyBiYXNlZCBvbiBqYXh3c1x0ZXN0LXJlc291cmNlc1x4c2Rcc2FtcGxlbXRvbS54c2QNCi0gKiBzY2hlbWEuDQotICogDQotICogQXZhaWxhYmxlIENvbnRlbnQgdHlwZXMgYXJlOg0KLSAqICAgICAgICJpbWFnZS9naWYiDQotICogICAgICAgImltYWdlL2pwZWciDQotICogICAgICAgInRleHQvcGxhaW4iDQotICogICAgICAgIm11bHRpcGFydC8qIg0KLSAqICAgICAgICJ0ZXh0L3htbCINCi0gKiAgICAgICAiYXBwbGljYXRpb24veG1sIg0KLSAqIFRoaXMgaW5pdGlhbCB0ZXN0Y2FzZSBvbmx5IGNvdmVycyB0aGUgIm11bHRpcGFydC8qIiBhbmQgICJ0ZXh0L3BsYWluIiBtaW1lIHR5cGVzLg0KLSAqIFRoZSB1bHRpbWF0ZSBnb2FsIGlzIHRvIHByb3ZpZGUgdGVzdGNhc2VzIGZvciB0aGUgcmVtYWluaW5nIG1pbWUgdHlwZXMuIA0KLSAqDQotICovDQotcHVibGljIGNsYXNzIEpBWEJQcm92aWRlclRlc3RzIGV4dGVuZHMgUHJvdmlkZXJUZXN0Q2FzZSB7DQotDQotICAgIFN0cmluZyBlbmRwb2ludFVybCA9ICJodHRwOi8vbG9jYWxob3N0OjYwNjAvYXhpczIvc2VydmljZXMvSkFYQlByb3ZpZGVyU2VydmljZS5KQVhCUHJvdmlkZXJQb3J0IjsNCi0gICAgcHJpdmF0ZSBRTmFtZSBzZXJ2aWNlTmFtZSA9IG5ldyBRTmFtZSgiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIiLCAiSkFYQlByb3ZpZGVyU2VydmljZSIpOw0KLSAgICANCi0gICAgU3RyaW5nIFBST1ZJREVSX0VORFBPSU5UX1VSTCA9ICJodHRwOi8vbG9jYWxob3N0OjYwNjAvYXhpczIvc2VydmljZXMvU29hcE1lc3NhZ2VDaGVja01UT01Qcm92aWRlclNlcnZpY2UuU29hcE1lc3NhZ2VDaGVja01UT01Qcm92aWRlclBvcnQiOw0KLSAgICBwcml2YXRlIFFOYW1lIFBST1ZJREVSX1NFUlZJQ0VfTkFNRSA9IG5ldyBRTmFtZSgiaHR0cDovL3NvYXBtc2djaGVja210b20ucHJvdmlkZXIuamF4d3MuYXhpczIuYXBhY2hlLm9yZyIsICJTb2FwTWVzc2FnZUNoZWNrTVRPTVByb3ZpZGVyU2VydmljZSIpOw0KLQ0KLSAgICBEYXRhU291cmNlIHN0cmluZ0RTLCBpbWFnZURTOw0KLSAgICANCi0gICAgcHVibGljIEpBWEJQcm92aWRlclRlc3RzKCkgew0KLSAgICAgICAgc3VwZXIoKTsNCi0gICAgICAgIC8vQ3JlYXRlIGEgRGF0YVNvdXJjZSBmcm9tIGEgU3RyaW5nDQotICAgICAgICBTdHJpbmcgc3RyaW5nID0gIlNlbmRpbmcgYSBKQVhCIGdlbmVyYXRlZCBzdHJpbmcgb2JqZWN0IHRvIFNvdXJjZSBQcm92aWRlciBlbmRwb2ludCI7DQotICAgICAgICBzdHJpbmdEUyA9IG5ldyBCeXRlQXJyYXlEYXRhU291cmNlKHN0cmluZy5nZXRCeXRlcygpLCJ0ZXh0L3BsYWluIik7DQotDQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIC8vQ3JlYXRlIGEgRGF0YVNvdXJjZSBmcm9tIGFuIGltYWdlIA0KLSAgICAgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGltYWdlUmVzb3VyY2VEaXIgKyBGaWxlLnNlcGFyYXRvciArICJ0ZXN0LmpwZyIpOw0KLSAgICAgICAgICAgIEltYWdlSW5wdXRTdHJlYW0gZmlpcyA9IG5ldyBGaWxlSW1hZ2VJbnB1dFN0cmVhbShmaWxlKTsNCi0gICAgICAgICAgICBJbWFnZSBpbWFnZSA9IEltYWdlSU8ucmVhZChmaWlzKTsNCi0gICAgICAgICAgICBpbWFnZURTID0gbmV3IERhdGFTb3VyY2VJbXBsKCJpbWFnZS9qcGVnIiwgInRlc3QuanBnIiwgaW1hZ2UpOw0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7DQotICAgICAgICByZXR1cm4gZ2V0VGVzdFNldHVwKG5ldyBUZXN0U3VpdGUoSkFYQlByb3ZpZGVyVGVzdHMuY2xhc3MpKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogdGVzdCBTdHJpbmcNCi0gICAgICogQHRocm93cyBFeGNlcHRpb24NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RNVE9NQXR0YWNobWVudFN0cmluZygpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoInRlc3Q6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgDQotICAgICAgICAvL0NyZWF0ZSBhIERhdGFIYW5kbGVyIHdpdGggdGhlIFN0cmluZyBEYXRhU291cmNlIG9iamVjdA0KLSAgICAgICAgRGF0YUhhbmRsZXIgZGF0YUhhbmRsZXIgPSBuZXcgRGF0YUhhbmRsZXIoc3RyaW5nRFMpOw0KLSAgICAJDQotICAgICAgICAvL1N0b3JlIHRoZSBkYXRhIGhhbmRsZXIgaW4gSW1hZ2VEZXBvdCBiZWFuDQotICAgIAlJbWFnZURlcG90IGltYWdlRGVwb3QgPSBuZXcgT2JqZWN0RmFjdG9yeSgpLmNyZWF0ZUltYWdlRGVwb3QoKTsNCi0gICAgCWltYWdlRGVwb3Quc2V0SW1hZ2VEYXRhKGRhdGFIYW5kbGVyKTsNCi0gICAgICAgIA0KLSAgICAgICAgU2VydmljZSBzdmMgPSBTZXJ2aWNlLmNyZWF0ZShzZXJ2aWNlTmFtZSk7DQotICAgICAgICBzdmMuYWRkUG9ydChwb3J0TmFtZSwgbnVsbCwgZW5kcG9pbnRVcmwpOw0KLSAgICAgICAgDQotICAgICAgICBKQVhCQ29udGV4dCBqYmMgPSBKQVhCQ29udGV4dC5uZXdJbnN0YW5jZSgib3JnLnRlc3QubXRvbSIpOw0KLSAgICAgICAgDQotICAgICAgICBEaXNwYXRjaDxPYmplY3Q+IGRpc3BhdGNoID0gc3ZjDQotICAgICAgICAgICAgICAgIC5jcmVhdGVEaXNwYXRjaChwb3J0TmFtZSwgamJjLCBTZXJ2aWNlLk1vZGUuUEFZTE9BRCk7DQotICAgICAgICANCi0gICAgICAgIC8vQ3JlYXRlIGEgcmVxdWVzdCBiZWFuIHdpdGggaW1hZ2VkZXBvdCBiZWFuIGFzIHZhbHVlDQotICAgICAgICBPYmplY3RGYWN0b3J5IGZhY3RvcnkgPSBuZXcgT2JqZWN0RmFjdG9yeSgpOw0KLSAgICAgICAgU2VuZEltYWdlIHJlcXVlc3QgPSBmYWN0b3J5LmNyZWF0ZVNlbmRJbWFnZSgpOw0KLSAgICAgICAgcmVxdWVzdC5zZXRJbnB1dChpbWFnZURlcG90KTsNCi0NCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBJbnZva2luZyBEaXNwYXRjaDxPYmplY3Q+IEpBWEJQcm92aWRlclNlcnZpY2UiKTsNCi0gICAgICAgIA0KLSAgICAgICAgU2VuZEltYWdlUmVzcG9uc2UgcmVzcG9uc2UgPSAoU2VuZEltYWdlUmVzcG9uc2UpIGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0NCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBSZXNwb25zZSBbIiArIHJlc3BvbnNlLnRvU3RyaW5nKCkgKyAiXSIpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBUcnkgYWdhaW4gdG8gdmVyaWZ5DQotICAgICAgICByZXNwb25zZSA9IChTZW5kSW1hZ2VSZXNwb25zZSkgZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IFJlc3BvbnNlIFsiICsgcmVzcG9uc2UudG9TdHJpbmcoKSArICJdIik7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiB0ZXN0IEltYWdlDQotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TVRPTUF0dGFjaG1lbnRJbWFnZSgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoInRlc3Q6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgDQotICAgICAgICAvL0NyZWF0ZSBhIERhdGFIYW5kbGVyIHdpdGggdGhlIFN0cmluZyBEYXRhU291cmNlIG9iamVjdA0KLSAgICAgICAgRGF0YUhhbmRsZXIgZGF0YUhhbmRsZXIgPSBuZXcgRGF0YUhhbmRsZXIoaW1hZ2VEUyk7DQotICAgIAkNCi0gICAgICAgIC8vU3RvcmUgdGhlIGRhdGEgaGFuZGxlciBpbiBJbWFnZURlcG90IGJlYW4NCi0gICAgCUltYWdlRGVwb3QgaW1hZ2VEZXBvdCA9IG5ldyBPYmplY3RGYWN0b3J5KCkuY3JlYXRlSW1hZ2VEZXBvdCgpOw0KLSAgICAJaW1hZ2VEZXBvdC5zZXRJbWFnZURhdGEoZGF0YUhhbmRsZXIpOw0KLSAgICAgICAgDQotICAgICAgICBTZXJ2aWNlIHN2YyA9IFNlcnZpY2UuY3JlYXRlKHNlcnZpY2VOYW1lKTsNCi0gICAgICAgIHN2Yy5hZGRQb3J0KHBvcnROYW1lLCBudWxsLCBlbmRwb2ludFVybCk7DQotICAgICAgICANCi0gICAgICAgIEpBWEJDb250ZXh0IGpiYyA9IEpBWEJDb250ZXh0Lm5ld0luc3RhbmNlKCJvcmcudGVzdC5tdG9tIik7DQotICAgICAgICANCi0gICAgICAgIERpc3BhdGNoPE9iamVjdD4gZGlzcGF0Y2ggPSBzdmMNCi0gICAgICAgICAgICAgICAgLmNyZWF0ZURpc3BhdGNoKHBvcnROYW1lLCBqYmMsIFNlcnZpY2UuTW9kZS5QQVlMT0FEKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gRW5hYmxlIGF0dGFjaG1lbnQgb3B0aW1pemF0aW9uDQotICAgICAgICBTT0FQQmluZGluZyBiaW5kaW5nID0gKFNPQVBCaW5kaW5nKSBkaXNwYXRjaC5nZXRCaW5kaW5nKCk7DQotICAgICAgICBiaW5kaW5nLnNldE1UT01FbmFibGVkKHRydWUpOw0KLSAgICAgICAgDQotICAgICAgICAvL0NyZWF0ZSBhIHJlcXVlc3QgYmVhbiB3aXRoIGltYWdlZGVwb3QgYmVhbiBhcyB2YWx1ZQ0KLSAgICAgICAgT2JqZWN0RmFjdG9yeSBmYWN0b3J5ID0gbmV3IE9iamVjdEZhY3RvcnkoKTsNCi0gICAgICAgIFNlbmRJbWFnZSByZXF1ZXN0ID0gZmFjdG9yeS5jcmVhdGVTZW5kSW1hZ2UoKTsNCi0gICAgICAgIHJlcXVlc3Quc2V0SW5wdXQoaW1hZ2VEZXBvdCk7DQotDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gSW52b2tpbmcgRGlzcGF0Y2g8T2JqZWN0PiBKQVhCUHJvdmlkZXJTZXJ2aWNlIik7DQotICAgICAgICANCi0gICAgICAgIFNlbmRJbWFnZVJlc3BvbnNlIHJlc3BvbnNlID0gKFNlbmRJbWFnZVJlc3BvbnNlKSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7DQotDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gUmVzcG9uc2UgWyIgKyByZXNwb25zZS50b1N0cmluZygpICsgIl0iKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gVHJ5IGFnYWluIHRvIHZlcmlmeQ0KLSAgICAgICAgcmVzcG9uc2UgPSAoU2VuZEltYWdlUmVzcG9uc2UpIGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0NCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBSZXNwb25zZSBbIiArIHJlc3BvbnNlLnRvU3RyaW5nKCkgKyAiXSIpOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogVGhpcyB0ZXN0IGRpc3BhdGNoZXMgdG8gdGhlIFNPQVBNZXNzYWdlIENoZWNrTVRPTSBlbmRwb2ludA0KLSAgICAgKiB3aGljaCB2ZXJpZmllcyB0aGF0IGFuIGF0dGFjaG1lbnQgd2FzIHNlbnQgKHZlcnN1cyBpbmxpbmUpDQotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TVRPTUF0dGFjaG1lbnRJbWFnZVByb3ZpZGVyX0FQSSgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoInRlc3Q6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgDQotICAgICAgICAvL0NyZWF0ZSBhIERhdGFIYW5kbGVyIHdpdGggdGhlIFN0cmluZyBEYXRhU291cmNlIG9iamVjdA0KLSAgICAgICAgRGF0YUhhbmRsZXIgZGF0YUhhbmRsZXIgPSBuZXcgRGF0YUhhbmRsZXIoaW1hZ2VEUyk7DQotICAgICAgICANCi0gICAgICAgIC8vU3RvcmUgdGhlIGRhdGEgaGFuZGxlciBpbiBJbWFnZURlcG90IGJlYW4NCi0gICAgICAgIEltYWdlRGVwb3QgaW1hZ2VEZXBvdCA9IG5ldyBPYmplY3RGYWN0b3J5KCkuY3JlYXRlSW1hZ2VEZXBvdCgpOw0KLSAgICAgICAgaW1hZ2VEZXBvdC5zZXRJbWFnZURhdGEoZGF0YUhhbmRsZXIpOw0KLSAgICAgICAgDQotICAgICAgICBTZXJ2aWNlIHN2YyA9IFNlcnZpY2UuY3JlYXRlKFBST1ZJREVSX1NFUlZJQ0VfTkFNRSk7DQotICAgICAgICBzdmMuYWRkUG9ydChwb3J0TmFtZSwgbnVsbCwgUFJPVklERVJfRU5EUE9JTlRfVVJMKTsNCi0gICAgICAgIA0KLSAgICAgICAgSkFYQkNvbnRleHQgamJjID0gSkFYQkNvbnRleHQubmV3SW5zdGFuY2UoIm9yZy50ZXN0Lm10b20iKTsNCi0gICAgICAgIA0KLSAgICAgICAgDQotICAgICAgICBEaXNwYXRjaDxPYmplY3Q+IGRpc3BhdGNoID0gc3ZjDQotICAgICAgICAgICAgICAgIC5jcmVhdGVEaXNwYXRjaChwb3J0TmFtZSwgamJjLCBTZXJ2aWNlLk1vZGUuUEFZTE9BRCk7DQotICAgICAgICANCi0gICAgICAgIC8vIEVuYWJsZSBhdHRhY2htZW50IG9wdGltaXphdGlvbg0KLSAgICAgICAgU09BUEJpbmRpbmcgYmluZGluZyA9IChTT0FQQmluZGluZykgZGlzcGF0Y2guZ2V0QmluZGluZygpOw0KLSAgICAgICAgYmluZGluZy5zZXRNVE9NRW5hYmxlZCh0cnVlKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy9DcmVhdGUgYSByZXF1ZXN0IGJlYW4gd2l0aCBpbWFnZWRlcG90IGJlYW4gYXMgdmFsdWUNCi0gICAgICAgIE9iamVjdEZhY3RvcnkgZmFjdG9yeSA9IG5ldyBPYmplY3RGYWN0b3J5KCk7DQotICAgICAgICBTZW5kSW1hZ2UgcmVxdWVzdCA9IGZhY3RvcnkuY3JlYXRlU2VuZEltYWdlKCk7DQotICAgICAgICByZXF1ZXN0LnNldElucHV0KGltYWdlRGVwb3QpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBUaGUgcHJvdmlkZXIgc2VydmljZSByZXR1cm5zIHRoZSBzYW1lIGltYWdlIGJhY2sgaWYgc3VjY2Vzc2Z1bA0KLSAgICAgICAgU2VuZEltYWdlIHJlc3BvbnNlID0gKFNlbmRJbWFnZSkgZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLQ0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZSAhPSBudWxsKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gVHJ5IGFnYWluIHRvIHZlcmlmeQ0KLSAgICAgICAgcmVzcG9uc2UgPSAoU2VuZEltYWdlKSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7DQotDQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlICE9IG51bGwpOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogVGhpcyB0ZXN0IGRpc3BhdGNoZXMgdG8gdGhlIFNPQVBNZXNzYWdlIENoZWNrTVRPTSBlbmRwb2ludA0KLSAgICAgKiB3aGljaCB2ZXJpZmllcyB0aGF0IGFuIGF0dGFjaG1lbnQgd2FzIHNlbnQgKHZlcnN1cyBpbmxpbmUpDQotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TVRPTUF0dGFjaG1lbnRJbWFnZVByb3ZpZGVyX01UT01GZWF0dXJlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygidGVzdDogIiArIGdldE5hbWUoKSk7DQotICAgICAgICANCi0gICAgICAgIC8vQ3JlYXRlIGEgRGF0YUhhbmRsZXIgd2l0aCB0aGUgU3RyaW5nIERhdGFTb3VyY2Ugb2JqZWN0DQotICAgICAgICBEYXRhSGFuZGxlciBkYXRhSGFuZGxlciA9IG5ldyBEYXRhSGFuZGxlcihpbWFnZURTKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy9TdG9yZSB0aGUgZGF0YSBoYW5kbGVyIGluIEltYWdlRGVwb3QgYmVhbg0KLSAgICAgICAgSW1hZ2VEZXBvdCBpbWFnZURlcG90ID0gbmV3IE9iamVjdEZhY3RvcnkoKS5jcmVhdGVJbWFnZURlcG90KCk7DQotICAgICAgICBpbWFnZURlcG90LnNldEltYWdlRGF0YShkYXRhSGFuZGxlcik7DQotICAgICAgICANCi0gICAgICAgIFNlcnZpY2Ugc3ZjID0gU2VydmljZS5jcmVhdGUoUFJPVklERVJfU0VSVklDRV9OQU1FKTsNCi0gICAgICAgIHN2Yy5hZGRQb3J0KHBvcnROYW1lLCBudWxsLCBQUk9WSURFUl9FTkRQT0lOVF9VUkwpOw0KLSAgICAgICAgDQotICAgICAgICBKQVhCQ29udGV4dCBqYmMgPSBKQVhCQ29udGV4dC5uZXdJbnN0YW5jZSgib3JnLnRlc3QubXRvbSIpOw0KLSAgICAgICAgDQotICAgICAgICBNVE9NRmVhdHVyZSBtdG9tID0gbmV3IE1UT01GZWF0dXJlKCk7DQotICAgICAgICANCi0gICAgICAgIERpc3BhdGNoPE9iamVjdD4gZGlzcGF0Y2ggPSBzdmMNCi0gICAgICAgICAgICAgICAgLmNyZWF0ZURpc3BhdGNoKHBvcnROYW1lLCBqYmMsIFNlcnZpY2UuTW9kZS5QQVlMT0FELCBtdG9tKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy9DcmVhdGUgYSByZXF1ZXN0IGJlYW4gd2l0aCBpbWFnZWRlcG90IGJlYW4gYXMgdmFsdWUNCi0gICAgICAgIE9iamVjdEZhY3RvcnkgZmFjdG9yeSA9IG5ldyBPYmplY3RGYWN0b3J5KCk7DQotICAgICAgICBTZW5kSW1hZ2UgcmVxdWVzdCA9IGZhY3RvcnkuY3JlYXRlU2VuZEltYWdlKCk7DQotICAgICAgICByZXF1ZXN0LnNldElucHV0KGltYWdlRGVwb3QpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBUaGUgcHJvdmlkZXIgc2VydmljZSByZXR1cm5zIHRoZSBzYW1lIGltYWdlIGJhY2sgaWYgc3VjY2Vzc2Z1bA0KLSAgICAgICAgU2VuZEltYWdlIHJlc3BvbnNlID0gKFNlbmRJbWFnZSkgZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLQ0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZSAhPSBudWxsKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gVHJ5IGFnYWluIHRvIHZlcmlmeQ0KLSAgICAgICAgcmVzcG9uc2UgPSAoU2VuZEltYWdlKSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7DQotDQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlICE9IG51bGwpOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogVGhpcyB0ZXN0IGRpc3BhdGNoZXMgdG8gdGhlIFNPQVBNZXNzYWdlIENoZWNrTVRPTSBlbmRwb2ludA0KLSAgICAgKiB3aGljaCB2ZXJpZmllcyB0aGF0IGFuIGF0dGFjaG1lbnQgd2FzIHNlbnQgKHZlcnN1cyBpbmxpbmUpDQotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TVRPTUF0dGFjaG1lbnRJbWFnZVByb3ZpZGVyX01UT01GZWF0dXJlVGhyZXNoaG9sZCgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoInRlc3Q6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgDQotICAgICAgICAvL0NyZWF0ZSBhIERhdGFIYW5kbGVyIHdpdGggdGhlIFN0cmluZyBEYXRhU291cmNlIG9iamVjdA0KLSAgICAgICAgRGF0YUhhbmRsZXIgZGF0YUhhbmRsZXIgPSBuZXcgRGF0YUhhbmRsZXIoaW1hZ2VEUyk7DQotICAgICAgICANCi0gICAgICAgIC8vU3RvcmUgdGhlIGRhdGEgaGFuZGxlciBpbiBJbWFnZURlcG90IGJlYW4NCi0gICAgICAgIEltYWdlRGVwb3QgaW1hZ2VEZXBvdCA9IG5ldyBPYmplY3RGYWN0b3J5KCkuY3JlYXRlSW1hZ2VEZXBvdCgpOw0KLSAgICAgICAgaW1hZ2VEZXBvdC5zZXRJbWFnZURhdGEoZGF0YUhhbmRsZXIpOw0KLSAgICAgICAgDQotICAgICAgICBTZXJ2aWNlIHN2YyA9IFNlcnZpY2UuY3JlYXRlKFBST1ZJREVSX1NFUlZJQ0VfTkFNRSk7DQotICAgICAgICBzdmMuYWRkUG9ydChwb3J0TmFtZSwgbnVsbCwgUFJPVklERVJfRU5EUE9JTlRfVVJMKTsNCi0gICAgICAgIA0KLSAgICAgICAgSkFYQkNvbnRleHQgamJjID0gSkFYQkNvbnRleHQubmV3SW5zdGFuY2UoIm9yZy50ZXN0Lm10b20iKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gTWFrZSBzdXJlIE1UT01GZWF0dXJlIHdpdGggYSBzbWFsbCB0aHJlc2hob2xkICgxKSB3b3JrcyBjb3JyZWN0bHkNCi0gICAgICAgIC8vIGJ5IHNlbmRpbmcgYW4gb3B0aW1pemVkIE1UT00gbWVzc2FnZS4NCi0gICAgICAgIE1UT01GZWF0dXJlIG10b20gPSBuZXcgTVRPTUZlYXR1cmUoMSk7DQotICAgICAgICANCi0gICAgICAgIERpc3BhdGNoPE9iamVjdD4gZGlzcGF0Y2ggPSBzdmMNCi0gICAgICAgICAgICAgICAgLmNyZWF0ZURpc3BhdGNoKHBvcnROYW1lLCBqYmMsIFNlcnZpY2UuTW9kZS5QQVlMT0FELCBtdG9tKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy9DcmVhdGUgYSByZXF1ZXN0IGJlYW4gd2l0aCBpbWFnZWRlcG90IGJlYW4gYXMgdmFsdWUNCi0gICAgICAgIE9iamVjdEZhY3RvcnkgZmFjdG9yeSA9IG5ldyBPYmplY3RGYWN0b3J5KCk7DQotICAgICAgICBTZW5kSW1hZ2UgcmVxdWVzdCA9IGZhY3RvcnkuY3JlYXRlU2VuZEltYWdlKCk7DQotICAgICAgICByZXF1ZXN0LnNldElucHV0KGltYWdlRGVwb3QpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBUaGUgcHJvdmlkZXIgc2VydmljZSByZXR1cm5zIHRoZSBzYW1lIGltYWdlIGJhY2sgaWYgc3VjY2Vzc2Z1bA0KLSAgICAgICAgU2VuZEltYWdlIHJlc3BvbnNlID0gKFNlbmRJbWFnZSkgZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLQ0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZSAhPSBudWxsKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gVHJ5IGFnYWluIHRvIHZlcmlmeQ0KLSAgICAgICAgcmVzcG9uc2UgPSAoU2VuZEltYWdlKSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7DQotDQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlICE9IG51bGwpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9Qcm92aWRlclRlc3RDYXNlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvUHJvdmlkZXJUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDk3YTk2Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9Qcm92aWRlclRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnByb3ZpZGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmZyYW1ld29yay5BYnN0cmFjdFRlc3RDYXNlOw0KLQ0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOw0KLWltcG9ydCBqYXZhLmlvLkZpbGU7DQotDQotcHVibGljIGFic3RyYWN0IGNsYXNzIFByb3ZpZGVyVGVzdENhc2UgZXh0ZW5kcyBBYnN0cmFjdFRlc3RDYXNlIHsNCi0NCi0gICAgcHVibGljIFFOYW1lIHBvcnROYW1lID0gbmV3IFFOYW1lKCJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMiIsICJTaW1wbGVQcm92aWRlclNlcnZpY2VTT0FQMTFwb3J0MCIpOw0KLSAgICBwdWJsaWMgU3RyaW5nIHByb3ZpZGVyUmVzb3VyY2VEaXIgPSAidGVzdC1yZXNvdXJjZXMiK0ZpbGUuc2VwYXJhdG9yKyJwcm92aWRlciI7DQotICAgIHB1YmxpYyBTdHJpbmcgaW1hZ2VSZXNvdXJjZURpciA9ICJ0ZXN0LXJlc291cmNlcyIrRmlsZS5zZXBhcmF0b3IrImltYWdlIjsNCi0gICAgcHVibGljIFN0cmluZyBiYXNlZGlyID0gbnVsbDsNCi0gICAgDQotICAgIHB1YmxpYyBQcm92aWRlclRlc3RDYXNlKCkgew0KLSAgICAgICAgaWYoYmFzZWRpciA9PSBudWxsKXsNCi0gICAgICAgICAgICBiYXNlZGlyID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJiYXNlZGlyIiwiLiIpKS5nZXRBYnNvbHV0ZVBhdGgoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHByb3ZpZGVyUmVzb3VyY2VEaXIgPSBuZXcgRmlsZShiYXNlZGlyLCBwcm92aWRlclJlc291cmNlRGlyKS5nZXRBYnNvbHV0ZVBhdGgoKTsNCi0gICAgICAgIGltYWdlUmVzb3VyY2VEaXIgPSBuZXcgRmlsZShiYXNlZGlyLCBpbWFnZVJlc291cmNlRGlyKS5nZXRBYnNvbHV0ZVBhdGgoKTsNCi0gICAgfQ0KLSAgICANCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyL1NPQVBGYXVsdFByb3ZpZGVyVGVzdHMuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9TT0FQRmF1bHRQcm92aWRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjZTVkN2IuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyL1NPQVBGYXVsdFByb3ZpZGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnByb3ZpZGVyOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi0NCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLkJpbmRpbmdQcm92aWRlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLkRpc3BhdGNoOw0KLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuU09BUEJpbmRpbmc7DQotDQotLyoqDQotICogDQotICovDQotcHVibGljIGNsYXNzIFNPQVBGYXVsdFByb3ZpZGVyVGVzdHMgZXh0ZW5kcyBQcm92aWRlclRlc3RDYXNlIHsNCi0gICAgcHVibGljIFFOYW1lIHBvcnROYW1lID0NCi0gICAgICAgIG5ldyBRTmFtZSgiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIiLCAiU2ltcGxlUHJvdmlkZXJTZXJ2aWNlU09BUDExcG9ydDAiKTsNCi0gICAgcHJpdmF0ZSBRTmFtZSBzZXJ2aWNlTmFtZSA9IG5ldyBRTmFtZSgiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIiLCAiU3RyaW5nUHJvdmlkZXJTZXJ2aWNlIik7DQotDQotICAgIFN0cmluZyBlbmRwb2ludFVybCA9ICJodHRwOi8vbG9jYWxob3N0OjYwNjAvYXhpczIvc2VydmljZXMvU3RyaW5nUHJvdmlkZXJTZXJ2aWNlLlN0cmluZ1Byb3ZpZGVyUG9ydCI7DQotDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBzYW1wbGVTb2FwRW52ZWxvcGVIZWFkZXIgPQ0KLSAgICAgICAgIjxzb2FwOkVudmVsb3BlIHhtbG5zOnNvYXA9XCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlL1wiPiINCi0gICAgICAgICAgICAgICAgKyAiPHNvYXA6Qm9keT4iOw0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgc2FtcGxlU29hcEVudmVsb3BlRm9vdGVyID0gIjwvc29hcDpCb2R5PiIgKyAiPC9zb2FwOkVudmVsb3BlPiI7DQotDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBzb2FwRmF1bHRCb2R5Q29udGVudCA9IA0KLSAgICAgICAgIjxzb2FwOkZhdWx0PiINCi0gICAgICAgICsgIjxmYXVsdGNvZGU+c29hcDpTT0FQRmF1bHRQcm92aWRlclRlc3RzPC9mYXVsdGNvZGU+Ig0KLSAgICAgICAgKyAiPGZhdWx0c3RyaW5nPldTQS1DUDItR0VORVJBVEVELUZBVUxUOiBGQVVMVDAxPC9mYXVsdHN0cmluZz4iDQotICAgICAgICArICI8L3NvYXA6RmF1bHQ+IjsNCi0gICAgDQotDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsNCi0gICAgICAgIHJldHVybiBnZXRUZXN0U2V0dXAobmV3IFRlc3RTdWl0ZShTT0FQRmF1bHRQcm92aWRlclRlc3RzLmNsYXNzKSk7DQotICAgIH0NCi0gICAgICAgIA0KLSAgICBwdWJsaWMgU09BUEZhdWx0UHJvdmlkZXJUZXN0cygpIHsNCi0gICAgICAgIHN1cGVyKCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBEaXNwYXRjaDxTdHJpbmc+IGdldERpc3BhdGNoKCkgew0KLSAgICAgICAgU2VydmljZSBzdmMgPSBTZXJ2aWNlLmNyZWF0ZShzZXJ2aWNlTmFtZSk7DQotICAgICAgICBzdmMuYWRkUG9ydChwb3J0TmFtZSwgU09BUEJpbmRpbmcuU09BUDExSFRUUF9CSU5ESU5HLCBlbmRwb2ludFVybCk7DQotDQotICAgICAgICAvLyBVc2UgTWVzc2FnZSBtb2RlIHNvIHdlIGNhbiBidWlsZCB1cCB0aGUgZW50aXJlIFNPQVAgZW52ZWxvcGUgY29udGFpbmluZyB0aGUgZmF1bHQNCi0gICAgICAgIERpc3BhdGNoPFN0cmluZz4gZGlzcGF0Y2ggPQ0KLSAgICAgICAgICAgICAgICBzdmMuY3JlYXRlRGlzcGF0Y2gocG9ydE5hbWUsIFN0cmluZy5jbGFzcywgU2VydmljZS5Nb2RlLk1FU1NBR0UpOw0KLQ0KLSAgICAgICAgLy8gRm9yY2Ugc29hcCBhY3Rpb24gYmVjYXVzZSB3ZSBhcmUgcGFzc2luZyBqdW5rIG92ZXIgdGhlIHdpcmUNCi0gICAgICAgIGRpc3BhdGNoLmdldFJlcXVlc3RDb250ZXh0KCkucHV0KEJpbmRpbmdQcm92aWRlci5TT0FQQUNUSU9OX1VTRV9QUk9QRVJUWSwgQm9vbGVhbi5UUlVFKTsNCi0gICAgICAgIGRpc3BhdGNoLmdldFJlcXVlc3RDb250ZXh0KCkucHV0KEJpbmRpbmdQcm92aWRlci5TT0FQQUNUSU9OX1VSSV9QUk9QRVJUWSwgImh0dHA6Ly9zdHJpbmdwcm92aWRlci5zYW1wbGUudGVzdC5vcmcvZWNob1N0cmluZyIpOw0KLQ0KLSAgICAgICAgcmV0dXJuIGRpc3BhdGNoOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RGYXVsdCgpIHsNCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInRlc3Q6ICIgKyBnZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgRGlzcGF0Y2g8U3RyaW5nPiBkaXNwYXRjaCA9IGdldERpc3BhdGNoKCk7DQotICAgICAgICBTdHJpbmcgcmVxdWVzdCA9IHNhbXBsZVNvYXBFbnZlbG9wZUhlYWRlciArIHNvYXBGYXVsdEJvZHlDb250ZW50ICsgc2FtcGxlU29hcEVudmVsb3BlRm9vdGVyOw0KLSAgICAgICAgLy8gVGVzdCB0aGF0IGEgUHJvdmlkZXIgcmVjZWl2ZXMgdGhlIGZ1bGwgZmF1bHQuICBJZiBub3QsIGl0IHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uDQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIFN0cmluZyByZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGZhaWwoIkNhdWdodCB1bmV4cGVjdGVkIGV4Y2VwdGlvbiAiICsgZS50b1N0cmluZygpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgLy8gVHJ5IGFnYWluDQotICAgICAgICAvLyBUZXN0IHRoYXQgYSBQcm92aWRlciByZWNlaXZlcyB0aGUgZnVsbCBmYXVsdC4gIElmIG5vdCwgaXQgd2lsbCB0aHJvdyBhbiBleGNlcHRpb24NCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgU3RyaW5nIHJlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgZmFpbCgiQ2F1Z2h0IHVuZXhwZWN0ZWQgZXhjZXB0aW9uICIgKyBlLnRvU3RyaW5nKCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9Tb2FwTWVzc2FnZU1VUHJvdmlkZXJDaGVja2VyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvU29hcE1lc3NhZ2VNVVByb3ZpZGVyQ2hlY2tlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDhiMTdlLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9Tb2FwTWVzc2FnZU1VUHJvdmlkZXJDaGVja2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnByb3ZpZGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEhlYWRlckJsb2NrOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0Ow0KLQ0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOw0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQotDQotLyoqDQotICogUGx1Z2luIHRvIHJlbW92ZSAidW5kZXJzdG9vZCIgaGVhZGVycyBmb3IgdGhlIFNvYXBNZXNzYWdlTVVQcm92aWRlclRlc3RzLiAgVGhpcyBjbGFzcyBtdXN0DQotICogYmUgY29uZmlndXJlZCBpbiB0aGUgYXhpczIueG1sIGZpbGUgb24gYm90aCB0aGUgY2xpZW50IGFuZCB0aGUgc2VydmVyLiANCi0gKi8NCi1wdWJsaWMgY2xhc3MgU29hcE1lc3NhZ2VNVVByb3ZpZGVyQ2hlY2tlciBleHRlbmRzIG9yZy5hcGFjaGUuYXhpczIuaGFuZGxlcnMuQWJzdHJhY3RIYW5kbGVyIHsNCi0NCi0gICAgcHVibGljIEludm9jYXRpb25SZXNwb25zZSBpbnZva2UoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdCB7DQotICAgICAgICAvLyBHZXQgdGhlIGxpc3Qgb2YgaGVhZGVycyBmb3IgdGhlIHJvbGVzIHdlJ3JlIGFjdGluZyBpbiwgdGhlbiBtYXJrIGFueSB3ZSB1bmRlcnN0YW5kDQotICAgICAgICAvLyBhcyBwcm9jZXNzZWQuDQotICAgICAgICBTT0FQRW52ZWxvcGUgZW52ZWxvcGUgPSBtc2dDb250ZXh0LmdldEVudmVsb3BlKCk7DQotICAgICAgICBpZiAoZW52ZWxvcGUuZ2V0SGVhZGVyKCkgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiBJbnZvY2F0aW9uUmVzcG9uc2UuQ09OVElOVUU7DQotICAgICAgICB9DQotICAgICAgICAvLyBUaGVzZSBhcmUgdGhlIGhlYWRlcnMgdGhlIHRlc3QgZXhwZWN0cyB0byBiZSB1bmRlcnN0b29kDQotICAgICAgICBTdHJpbmcgbnMxID0gImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyIjsNCi0gICAgICAgIFN0cmluZyBjbGllbnRMb2NhbE5hbWUgPSAibXVjbGllbnR1bmRlcnN0b29kIjsNCi0gICAgICAgIFN0cmluZyBzZXJ2ZXJMb2NhbE5hbWUgPSAibXVzZXJ2ZXJ1bmRlcnN0b29kIjsNCi0NCi0gICAgICAgIFFOYW1lIGNsaWVudFFOID0gbmV3IFFOYW1lKG5zMSwgY2xpZW50TG9jYWxOYW1lKTsNCi0gICAgICAgIFFOYW1lIHNlcnZlclFOID0gbmV3IFFOYW1lKG5zMSwgc2VydmVyTG9jYWxOYW1lKTsNCi0NCi0gICAgICAgIEl0ZXJhdG9yIGhlYWRlckJsb2NrcyA9IGVudmVsb3BlLmdldEhlYWRlcigpLmdldEhlYWRlcnNUb1Byb2Nlc3MobnVsbCk7DQotICAgICAgICB3aGlsZSAoaGVhZGVyQmxvY2tzLmhhc05leHQoKSkgew0KLSAgICAgICAgICAgIFNPQVBIZWFkZXJCbG9jayBoZWFkZXJCbG9jayA9IChTT0FQSGVhZGVyQmxvY2spIGhlYWRlckJsb2Nrcy5uZXh0KCk7DQotICAgICAgICAgICAgUU5hbWUgaGVhZGVyUU4gPSBoZWFkZXJCbG9jay5nZXRRTmFtZSgpOw0KLSAgICAgICAgICAgIGlmIChjbGllbnRRTi5lcXVhbHMoaGVhZGVyUU4pKSB7DQotLy8gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJNYXJraW5nIGFzIHByb2Nlc3NlZCBDTElFTlQgUU46ICIgKyBjbGllbnRRTik7DQotICAgICAgICAgICAgICAgIGhlYWRlckJsb2NrLnNldFByb2Nlc3NlZCgpOw0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VydmVyUU4uZXF1YWxzKGhlYWRlclFOKSkgew0KLS8vICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTWFya2luZyBhcyBwcm9jZXNzZWQgU0VSVkVSIFFOOiAiICsgc2VydmVyUU4pOw0KLSAgICAgICAgICAgICAgICBoZWFkZXJCbG9jay5zZXRQcm9jZXNzZWQoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gSW52b2NhdGlvblJlc3BvbnNlLkNPTlRJTlVFOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9Tb2FwTWVzc2FnZU1VUHJvdmlkZXJUZXN0cy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyL1NvYXBNZXNzYWdlTVVQcm92aWRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjMjgzYzEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyL1NvYXBNZXNzYWdlTVVQcm92aWRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm92aWRlcjsNCi0NCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZnJhbWV3b3JrLkFic3RyYWN0VGVzdENhc2U7DQotDQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBNZXNzYWdlOw0KLWltcG9ydCBqYXZheC54bWwud3MuQmluZGluZ1Byb3ZpZGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuU09BUEJpbmRpbmc7DQotDQotLyoqDQotICogVGVzdHMgRGlzcGF0Y2g8U09BUE1lc3NhZ2U+IGNsaWVudCBhbmQgYSBQcm92aWRlcjxTT0FQTWVzc2FnZT4gc2VydmljZQ0KLSAqIHdpdGggbXVzdFVuZGVyc3RhbmQgYXR0cmlidXRlIGhlYWRlci4NCi0gKi8NCi1wdWJsaWMgY2xhc3MgU29hcE1lc3NhZ2VNVVByb3ZpZGVyVGVzdHMgZXh0ZW5kcyBBYnN0cmFjdFRlc3RDYXNlIHsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBzZXJ2aWNlTmFtZSA9DQotICAgICAgICAgICAgbmV3IFFOYW1lKCJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMiIsICJTb2FwTWVzc2FnZU1VUHJvdmlkZXJTZXJ2aWNlIik7DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgcG9ydE5hbWUgPQ0KLSAgICAgICAgICAgIG5ldyBRTmFtZSgiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIiLCAiU2ltcGxlUHJvdmlkZXJTZXJ2aWNlU09BUDExcG9ydDAiKTsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZW5kcG9pbnRVcmwgPQ0KLSAgICAgICAgICAgICJodHRwOi8vbG9jYWxob3N0OjYwNjAvYXhpczIvc2VydmljZXMvU29hcE1lc3NhZ2VNVVByb3ZpZGVyU2VydmljZS5TaW1wbGVQcm92aWRlclNlcnZpY2VTT0FQMTFwb3J0MCI7DQotDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGJpbmRpbmdJRCA9IFNPQVBCaW5kaW5nLlNPQVAxMUhUVFBfQklORElORzsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTZXJ2aWNlLk1vZGUgbW9kZSA9IFNlcnZpY2UuTW9kZS5NRVNTQUdFOw0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7DQotICAgICAgICByZXR1cm4gZ2V0VGVzdFNldHVwKG5ldyBUZXN0U3VpdGUoU29hcE1lc3NhZ2VNVVByb3ZpZGVyVGVzdHMuY2xhc3MpKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogVGVzdCBzb2FwIG1lc3NhZ2Ugd2l0aCBubyBNVSBoZWFkZXJzDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9NdXN0VW5kZXJzdGFuZEhlYWRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigidGVzdE5vTXVzdFVuZGVyc3RhbmRIZWFkZXJzIik7DQotICAgICAgICAvLyBjcmVhdGUgYSBzZXJ2aWNlDQotICAgICAgICBTZXJ2aWNlIHN2YyA9IFNlcnZpY2UuY3JlYXRlKHNlcnZpY2VOYW1lKTsNCi0gICAgICAgIHN2Yy5hZGRQb3J0KHBvcnROYW1lLCBiaW5kaW5nSUQsIGVuZHBvaW50VXJsKTsNCi0NCi0gICAgICAgIGphdmF4LnhtbC53cy5EaXNwYXRjaDxTT0FQTWVzc2FnZT4gZGlzcGF0Y2ggPSBudWxsOw0KLSAgICAgICAgZGlzcGF0Y2ggPSBzdmMuY3JlYXRlRGlzcGF0Y2gocG9ydE5hbWUsIFNPQVBNZXNzYWdlLmNsYXNzLCBtb2RlKTsNCi0NCi0gICAgICAgICgoQmluZGluZ1Byb3ZpZGVyKSBkaXNwYXRjaCkuZ2V0UmVxdWVzdENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wdXQoQmluZGluZ1Byb3ZpZGVyLlNPQVBBQ1RJT05fVVNFX1BST1BFUlRZLCB0cnVlKTsNCi0gICAgICAgICgoQmluZGluZ1Byb3ZpZGVyKSBkaXNwYXRjaCkuZ2V0UmVxdWVzdENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wdXQoQmluZGluZ1Byb3ZpZGVyLlNPQVBBQ1RJT05fVVJJX1BST1BFUlRZLCAiZWNob1N0cmluZyIpOw0KLQ0KLSAgICAgICAgU09BUE1lc3NhZ2UgbWVzc2FnZSA9IEF0dGFjaG1lbnRVdGlsLnRvU09BUE1lc3NhZ2UoQXR0YWNobWVudFV0aWwubXNnRW52UGxhaW4pOw0KLQ0KLSAgICAgICAgU09BUE1lc3NhZ2UgcmVzcG9uc2UgPSBkaXNwYXRjaC5pbnZva2UobWVzc2FnZSk7DQotDQotICAgICAgICBTdHJpbmcgc3RyaW5nID0gQXR0YWNobWVudFV0aWwudG9TdHJpbmcocmVzcG9uc2UpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShzdHJpbmcuZXF1YWxzSWdub3JlQ2FzZShBdHRhY2htZW50VXRpbC5YTUxfSEVBREVSDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgQXR0YWNobWVudFV0aWwubXNnRW52UGxhaW4pKTsNCi0gICAgICAgICAgICANCi0gICAgICAgIC8vIFRyeSBhIHNlY29uZCB0aW1lDQotICAgICAgICByZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZShtZXNzYWdlKTsNCi0NCi0gICAgICAgIHN0cmluZyA9IEF0dGFjaG1lbnRVdGlsLnRvU3RyaW5nKHJlc3BvbnNlKTsNCi0gICAgICAgIGFzc2VydFRydWUoc3RyaW5nLmVxdWFsc0lnbm9yZUNhc2UoQXR0YWNobWVudFV0aWwuWE1MX0hFQURFUg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEF0dGFjaG1lbnRVdGlsLm1zZ0VudlBsYWluKSk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFRlc3QgdGhlIG11c3RVbmRlcnN0YW5kIHNvYXAgaGVhZGVyIGF0dHJpYnV0ZSBvbiB0aGUgY2xpZW50J3MNCi0gICAgICogb3V0Ym91bmQgc29hcCBtZXNzYWdlIGZvciBoZWFkZXJzIHRoYXQgYXJlIG5vdCB1bmRlcnN0b29kLiAgU2hvdWxkIGNhdXNlIGFuIA0KLSAgICAgKiBleGNlcHRpb24uDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xpZW50UmVxdWVzdE5vdFVuZGVyc3Rvb2RIZWFkZXJzKCkgew0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJ0ZXN0Q2xpZW50UmVxdWVzdE5vdFVuZGVyc3Rvb2RIZWFkZXJzIik7DQotICAgICAgICAvLyBjcmVhdGUgYSBzZXJ2aWNlDQotICAgICAgICBTZXJ2aWNlIHN2YyA9IFNlcnZpY2UuY3JlYXRlKHNlcnZpY2VOYW1lKTsNCi0gICAgICAgIHN2Yy5hZGRQb3J0KHBvcnROYW1lLCBiaW5kaW5nSUQsIGVuZHBvaW50VXJsKTsNCi0NCi0gICAgICAgIGphdmF4LnhtbC53cy5EaXNwYXRjaDxTT0FQTWVzc2FnZT4gZGlzcGF0Y2ggPSBudWxsOw0KLSAgICAgICAgZGlzcGF0Y2ggPSBzdmMuY3JlYXRlRGlzcGF0Y2gocG9ydE5hbWUsIFNPQVBNZXNzYWdlLmNsYXNzLCBtb2RlKTsNCi0NCi0gICAgICAgIC8vZm9yY2UgU09BUEFjdGlvbiB0byBtYXRjaCB3aXRoIHdzZGwgYWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgDQotICAgICAgICAoKEJpbmRpbmdQcm92aWRlcikgZGlzcGF0Y2gpLmdldFJlcXVlc3RDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucHV0KEJpbmRpbmdQcm92aWRlci5TT0FQQUNUSU9OX1VTRV9QUk9QRVJUWSwgdHJ1ZSk7DQotICAgICAgICAoKEJpbmRpbmdQcm92aWRlcikgZGlzcGF0Y2gpLmdldFJlcXVlc3RDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucHV0KEJpbmRpbmdQcm92aWRlci5TT0FQQUNUSU9OX1VSSV9QUk9QRVJUWSwgImVjaG9TdHJpbmciKTsNCi0NCi0gICAgICAgIFNPQVBNZXNzYWdlIG1lc3NhZ2UgPSBBdHRhY2htZW50VXRpbC50b1NPQVBNZXNzYWdlKEF0dGFjaG1lbnRVdGlsLm1zZ0Vudk1VKTsNCi0NCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgZGlzcGF0Y2guaW52b2tlKG1lc3NhZ2UpOw0KLSAgICAgICAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHJlY2VpdmVkIGZhdWx0IGZvciBub3QgdW5kZXJzdG9vZCBoZWFkZXJzIG9uIHJlcXVlc3QiKTsNCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgLy8gRXhwZWN0ZWQgcGF0aA0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICAvLyBUcnkgYSBzZWNvbmQgdGltZQ0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBkaXNwYXRjaC5pbnZva2UobWVzc2FnZSk7DQotICAgICAgICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgcmVjZWl2ZWQgZmF1bHQgZm9yIG5vdCB1bmRlcnN0b29kIGhlYWRlcnMgb24gcmVxdWVzdCIpOw0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICAvLyBFeHBlY3RlZCBwYXRoDQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFRlc3QgdGhlIG11c3RVbmRlcnN0YW5kIHNvYXAgaGVhZGVyIGF0dHJpYnV0ZSBvbiB0aGUgc2VydmVyJ3MNCi0gICAgICogb3V0Ym91bmQgc29hcCBtZXNzYWdlIChpLmUuIHRoZSBpbmJvdW5kIHJlc3BvbnNlIHRvIHRoZSBjbGllbnQpIGZvciBoZWFkZXJzIHRoYXQNCi0gICAgICogYXJlIG5vdCB1bmRlcnN0b29kLiAgU2hvdWxkIGNhdXNlIGFuIGV4Y2VwdGlvbi4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RDbGllbnRSZXNwb25zZU5vdFVuZGVyc3Rvb2RIZWFkZXJzKCkgew0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJ0ZXN0Q2xpZW50UmVzcG9uc2VOb3RVbmRlcnN0b29kSGVhZGVycyIpOw0KLSAgICAgICAgLy8gY3JlYXRlIGEgc2VydmljZQ0KLSAgICAgICAgU2VydmljZSBzdmMgPSBTZXJ2aWNlLmNyZWF0ZShzZXJ2aWNlTmFtZSk7DQotICAgICAgICBzdmMuYWRkUG9ydChwb3J0TmFtZSwgYmluZGluZ0lELCBlbmRwb2ludFVybCk7DQotDQotICAgICAgICBqYXZheC54bWwud3MuRGlzcGF0Y2g8U09BUE1lc3NhZ2U+IGRpc3BhdGNoID0gbnVsbDsNCi0gICAgICAgIGRpc3BhdGNoID0gc3ZjLmNyZWF0ZURpc3BhdGNoKHBvcnROYW1lLCBTT0FQTWVzc2FnZS5jbGFzcywgbW9kZSk7DQotDQotICAgICAgICAvL2ZvcmNlIFNPQVBBY3Rpb24gdG8gbWF0Y2ggd2l0aCB3c2RsIGFjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgKChCaW5kaW5nUHJvdmlkZXIpIGRpc3BhdGNoKS5nZXRSZXF1ZXN0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnB1dChCaW5kaW5nUHJvdmlkZXIuU09BUEFDVElPTl9VU0VfUFJPUEVSVFksIHRydWUpOw0KLSAgICAgICAgKChCaW5kaW5nUHJvdmlkZXIpIGRpc3BhdGNoKS5nZXRSZXF1ZXN0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnB1dChCaW5kaW5nUHJvdmlkZXIuU09BUEFDVElPTl9VUklfUFJPUEVSVFksICJlY2hvU3RyaW5nIik7DQotDQotICAgICAgICBTT0FQTWVzc2FnZSBtZXNzYWdlID0gQXR0YWNobWVudFV0aWwudG9TT0FQTWVzc2FnZShBdHRhY2htZW50VXRpbC5tc2dFbnYpOw0KLQ0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBkaXNwYXRjaC5pbnZva2UobWVzc2FnZSk7DQotICAgICAgICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgcmVjZWl2ZWQgZmF1bHQgZm9yIG5vdCB1bmRlcnN0b29kIGhlYWRlcnMgb24gcmVzcG9uc2UiKTsNCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgLy8gRXhwZWN0ZWQgcGF0aA0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICAvLyBUcnkgYSBzZWNvbmQgdGltZQ0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBkaXNwYXRjaC5pbnZva2UobWVzc2FnZSk7DQotICAgICAgICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgcmVjZWl2ZWQgZmF1bHQgZm9yIG5vdCB1bmRlcnN0b29kIGhlYWRlcnMgb24gcmVzcG9uc2UiKTsNCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgLy8gRXhwZWN0ZWQgcGF0aA0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBUZXN0IHRoZSBtdXN0VW5kZXJzdGFuZCBzb2FwIGhlYWRlciBhdHRyaWJ1dGUgb24gdGhlIGNsaWVudCdzDQotICAgICAqIG91dGJvdW5kIHNvYXAgbWVzc2FnZSBmb3IgaGVhZGVycyB0aGF0IHNob3VsZCBiZSB1bmRlcnN0b29kLiAgU2hvdWxkIG5vdCBjYXVzZSBhbiANCi0gICAgICogZXhjZXB0aW9uLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdENsaWVudFJlcXVlc3RVbmRlcnN0b29kSGVhZGVycygpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJ0ZXN0Q2xpZW50UmVxdWVzdFVuZGVyc3Rvb2RIZWFkZXJzIik7DQotICAgICAgICAvLyBjcmVhdGUgYSBzZXJ2aWNlDQotICAgICAgICBTZXJ2aWNlIHN2YyA9IFNlcnZpY2UuY3JlYXRlKHNlcnZpY2VOYW1lKTsNCi0gICAgICAgIHN2Yy5hZGRQb3J0KHBvcnROYW1lLCBiaW5kaW5nSUQsIGVuZHBvaW50VXJsKTsNCi0NCi0gICAgICAgIGphdmF4LnhtbC53cy5EaXNwYXRjaDxTT0FQTWVzc2FnZT4gZGlzcGF0Y2ggPSBudWxsOw0KLSAgICAgICAgZGlzcGF0Y2ggPSBzdmMuY3JlYXRlRGlzcGF0Y2gocG9ydE5hbWUsIFNPQVBNZXNzYWdlLmNsYXNzLCBtb2RlKTsNCi0NCi0gICAgICAgIC8vZm9yY2UgU09BUEFjdGlvbiB0byBtYXRjaCB3aXRoIHdzZGwgYWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgDQotICAgICAgICAoKEJpbmRpbmdQcm92aWRlcikgZGlzcGF0Y2gpLmdldFJlcXVlc3RDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucHV0KEJpbmRpbmdQcm92aWRlci5TT0FQQUNUSU9OX1VTRV9QUk9QRVJUWSwgdHJ1ZSk7DQotICAgICAgICAoKEJpbmRpbmdQcm92aWRlcikgZGlzcGF0Y2gpLmdldFJlcXVlc3RDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucHV0KEJpbmRpbmdQcm92aWRlci5TT0FQQUNUSU9OX1VSSV9QUk9QRVJUWSwgImVjaG9TdHJpbmciKTsNCi0NCi0gICAgICAgIFNPQVBNZXNzYWdlIG1lc3NhZ2UgPSBBdHRhY2htZW50VXRpbC50b1NPQVBNZXNzYWdlKEF0dGFjaG1lbnRVdGlsLm1zZ0Vudk1VX3VuZGVyc3Rvb2QpOw0KLQ0KLSAgICAgICAgZGlzcGF0Y2guaW52b2tlKG1lc3NhZ2UpOw0KLQ0KLSAgICAgICAgLy8gVHJ5IGEgc2Vjb25kIHRpbWUNCi0gICAgICAgIGRpc3BhdGNoLmludm9rZShtZXNzYWdlKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogVGVzdCB0aGUgbXVzdFVuZGVyc3RhbmQgc29hcCBoZWFkZXIgYXR0cmlidXRlIG9uIHRoZSBzZXJ2ZXIncw0KLSAgICAgKiBvdXRib3VuZCBzb2FwIG1lc3NhZ2UgKGkuZS4gdGhlIGluYm91bmQgcmVzcG9uc2UgdG8gdGhlIGNsaWVudCkgZm9yIGhlYWRlcnMgdGhhdA0KLSAgICAgKiBhcmUgdW5kZXJzdG9vZC4gIFNob3VsZCBub3QgY2F1c2UgYW4gZXhjZXB0aW9uLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdENsaWVudFJlc3BvbnNlVW5kZXJzdG9vZEhlYWRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigidGVzdENsaWVudFJlc3BvbnNlVW5kZXJzdG9vZEhlYWRlcnMiKTsNCi0gICAgICAgIC8vIGNyZWF0ZSBhIHNlcnZpY2UNCi0gICAgICAgIFNlcnZpY2Ugc3ZjID0gU2VydmljZS5jcmVhdGUoc2VydmljZU5hbWUpOw0KLSAgICAgICAgc3ZjLmFkZFBvcnQocG9ydE5hbWUsIGJpbmRpbmdJRCwgZW5kcG9pbnRVcmwpOw0KLQ0KLSAgICAgICAgamF2YXgueG1sLndzLkRpc3BhdGNoPFNPQVBNZXNzYWdlPiBkaXNwYXRjaCA9IG51bGw7DQotICAgICAgICBkaXNwYXRjaCA9IHN2Yy5jcmVhdGVEaXNwYXRjaChwb3J0TmFtZSwgU09BUE1lc3NhZ2UuY2xhc3MsIG1vZGUpOw0KLQ0KLSAgICAgICAgLy9mb3JjZSBTT0FQQWN0aW9uIHRvIG1hdGNoIHdpdGggd3NkbCBhY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgICAgICgoQmluZGluZ1Byb3ZpZGVyKSBkaXNwYXRjaCkuZ2V0UmVxdWVzdENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wdXQoQmluZGluZ1Byb3ZpZGVyLlNPQVBBQ1RJT05fVVNFX1BST1BFUlRZLCB0cnVlKTsNCi0gICAgICAgICgoQmluZGluZ1Byb3ZpZGVyKSBkaXNwYXRjaCkuZ2V0UmVxdWVzdENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wdXQoQmluZGluZ1Byb3ZpZGVyLlNPQVBBQ1RJT05fVVJJX1BST1BFUlRZLCAiZWNob1N0cmluZyIpOw0KLQ0KLSAgICAgICAgU09BUE1lc3NhZ2UgbWVzc2FnZSA9IEF0dGFjaG1lbnRVdGlsLnRvU09BUE1lc3NhZ2UoQXR0YWNobWVudFV0aWwubXNnRW52X3VuZGVyc3Rvb2QpOw0KLQ0KLSAgICAgICAgZGlzcGF0Y2guaW52b2tlKG1lc3NhZ2UpOw0KLQ0KLSAgICAgICAgLy8gVHJ5IGEgc2Vjb25kIHRpbWUNCi0gICAgICAgIGRpc3BhdGNoLmludm9rZShtZXNzYWdlKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvU29hcE1lc3NhZ2VQcm92aWRlclRlc3RzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvU29hcE1lc3NhZ2VQcm92aWRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwZTJkZjIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyL1NvYXBNZXNzYWdlUHJvdmlkZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODE1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJvdmlkZXI7DQotDQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5UZXN0TG9nZ2VyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnByb3ZpZGVyLnNvYXBtc2cuU29hcE1lc3NhZ2VQcm92aWRlcjsNCi0NCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi1pbXBvcnQgamF2YXgueG1sLnNvYXAuQXR0YWNobWVudFBhcnQ7DQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLkRldGFpbEVudHJ5Ow0KLWltcG9ydCBqYXZheC54bWwuc29hcC5NZXNzYWdlRmFjdG9yeTsNCi1pbXBvcnQgamF2YXgueG1sLnNvYXAuTm9kZTsNCi1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEJvZHk7DQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBDb25zdGFudHM7DQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBFbGVtZW50Ow0KLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRmFjdG9yeTsNCi1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEZhdWx0Ow0KLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQTWVzc2FnZTsNCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtU291cmNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuQmluZGluZzsNCi1pbXBvcnQgamF2YXgueG1sLndzLkRpc3BhdGNoOw0KLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuU09BUEZhdWx0RXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiBUZXN0cyBEaXNwYXRjaDxTT0FQTWVzc2FnZT4gY2xpZW50IGFuZCBhIFByb3ZpZGVyPFNPQVBNZXNzYWdlPiBzZXJ2aWNlLg0KLSAqIFRoZSBjbGllbnQgYW5kIHNlcnZpY2UgaW50ZXJhY3Rpb24gdGVzdHMgdmFyaW91cyB4bWwgYW5kIGF0dGFjaG1lbnQgc2NlbmFyaW9zDQotICoNCi0gKi8NCi1wdWJsaWMgY2xhc3MgU29hcE1lc3NhZ2VQcm92aWRlclRlc3RzIGV4dGVuZHMgUHJvdmlkZXJUZXN0Q2FzZSB7DQotDQotICAgIHByaXZhdGUgU3RyaW5nIGVuZHBvaW50VXJsID0gImh0dHA6Ly9sb2NhbGhvc3Q6NjA2MC9heGlzMi9zZXJ2aWNlcy9Tb2FwTWVzc2FnZVByb3ZpZGVyU2VydmljZS5Tb2FwTWVzc2FnZVByb3ZpZGVyUG9ydCI7DQotICAgIHByaXZhdGUgUU5hbWUgc2VydmljZU5hbWUgPSBuZXcgUU5hbWUoImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyIiwgIlNvYXBNZXNzYWdlUHJvdmlkZXJTZXJ2aWNlIik7DQotICAgIA0KLSAgICBwcml2YXRlIFN0cmluZyByZXFNc2dTdGFydCA9ICI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz4iICsNCi0gICAgIjxzb2FwOkVudmVsb3BlIHhtbG5zOnNvYXA9XCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlL1wiPjxzb2FwOkJvZHk+IjsNCi0gICAgOw0KLSAgICANCi0gICAgcHJpdmF0ZSBTdHJpbmcgcmVxTXNnRW5kID0gIjwvc29hcDpCb2R5Pjwvc29hcDpFbnZlbG9wZT4iOw0KLSAgIA0KLSAgICBwcml2YXRlIFN0cmluZyBYTUxfSU5WT0tFID0gIjxuczI6aW52b2tlT3AgeG1sbnM6bnMyPVwiaHR0cDovL29yZy50ZXN0LnNvYXBtZXNzYWdlXCI+PGludm9rZV9zdHI+IiArIA0KLSAgICAgICAgU29hcE1lc3NhZ2VQcm92aWRlci5YTUxfUkVRVUVTVCArDQotICAgICAgICAiPC9pbnZva2Vfc3RyPjwvbnMyOmludm9rZU9wPiI7DQotICAgIHByaXZhdGUgU3RyaW5nIEVNUFRZQk9EWV9JTlZPS0UgPSAiPG5zMjppbnZva2VPcCB4bWxuczpuczI9XCJodHRwOi8vb3JnLnRlc3Quc29hcG1lc3NhZ2VcIj48aW52b2tlX3N0cj4iICsgDQotICAgICAgICBTb2FwTWVzc2FnZVByb3ZpZGVyLlhNTF9FTVBUWUJPRFlfUkVRVUVTVCArDQotICAgICAgICAiPC9pbnZva2Vfc3RyPjwvbnMyOmludm9rZU9wPiI7DQotICAgIHByaXZhdGUgU3RyaW5nIENIRUNLSEVBREVSU19JTlZPS0UgPSAiPG5zMjppbnZva2VPcCB4bWxuczpuczI9XCJodHRwOi8vb3JnLnRlc3Quc29hcG1lc3NhZ2VcIj48aW52b2tlX3N0cj4iICsgDQotICAgICAgICBTb2FwTWVzc2FnZVByb3ZpZGVyLlhNTF9DSEVDS0hFQURFUlNfUkVRVUVTVCArDQotICAgICAgICAiPC9pbnZva2Vfc3RyPjwvbnMyOmludm9rZU9wPiI7DQotICAgIHByaXZhdGUgU3RyaW5nIEFUVEFDSE1FTlRfSU5WT0tFID0gIjxuczI6aW52b2tlT3AgeG1sbnM6bnMyPVwiaHR0cDovL29yZy50ZXN0LnNvYXBtZXNzYWdlXCI+PGludm9rZV9zdHI+IiArIA0KLSAgICAgICAgU29hcE1lc3NhZ2VQcm92aWRlci5YTUxfQVRUQUNITUVOVF9SRVFVRVNUICsNCi0gICAgICAgICI8L2ludm9rZV9zdHI+PC9uczI6aW52b2tlT3A+IjsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgTVRPTV9JTlZPS0UgPSAiPG5zMjppbnZva2VPcCB4bWxuczpuczI9XCJodHRwOi8vb3JnLnRlc3Quc29hcG1lc3NhZ2VcIj48aW52b2tlX3N0cj4iICsgDQotICAgICAgICBTb2FwTWVzc2FnZVByb3ZpZGVyLlhNTF9NVE9NX1JFUVVFU1QgKw0KLSAgICAgICAgIjwvaW52b2tlX3N0cj4iICsgDQotICAgICAgICBTb2FwTWVzc2FnZVByb3ZpZGVyLk1UT01fUkVGICsNCi0gICAgICAgICI8L25zMjppbnZva2VPcD4iOw0KLSAgICBwcml2YXRlIFN0cmluZyBTV0FSRUZfSU5WT0tFID0gIjxuczI6aW52b2tlT3AgeG1sbnM6bnMyPVwiaHR0cDovL29yZy50ZXN0LnNvYXBtZXNzYWdlXCI+PGludm9rZV9zdHI+IiArIA0KLSAgICAgICAgU29hcE1lc3NhZ2VQcm92aWRlci5YTUxfU1dBUkVGX1JFUVVFU1QgKw0KLSAgICAgICAgIjwvaW52b2tlX3N0cj4iICsgDQotICAgICAgICBTb2FwTWVzc2FnZVByb3ZpZGVyLlNXQVJFRl9SRUYgKw0KLSAgICAgICAgIjwvbnMyOmludm9rZU9wPiI7ICAgDQotICAgIHByaXZhdGUgU3RyaW5nIFhNTF9GQVVMVF9JTlZPS0UgPSAiPG5zMjppbnZva2VPcCB4bWxuczpuczI9XCJodHRwOi8vb3JnLnRlc3Quc29hcG1lc3NhZ2VcIj48aW52b2tlX3N0cj4iICsgDQotICAgICAgICBTb2FwTWVzc2FnZVByb3ZpZGVyLlhNTF9GQVVMVF9SRVFVRVNUICsNCi0gICAgICAgICI8L2ludm9rZV9zdHI+PC9uczI6aW52b2tlT3A+IjsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgWE1MX1dTRV9JTlZPS0UgPSAiPG5zMjppbnZva2VPcCB4bWxuczpuczI9XCJodHRwOi8vb3JnLnRlc3Quc29hcG1lc3NhZ2VcIj48aW52b2tlX3N0cj4iICsgDQotICAgICAgICBTb2FwTWVzc2FnZVByb3ZpZGVyLlhNTF9XU0VfUkVRVUVTVCArDQotICAgICAgICAiPC9pbnZva2Vfc3RyPjwvbnMyOmludm9rZU9wPiI7DQotICAgICAgICAgICAgICAgIA0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7DQotICAgICAgICByZXR1cm4gZ2V0VGVzdFNldHVwKG5ldyBUZXN0U3VpdGUoU29hcE1lc3NhZ2VQcm92aWRlclRlc3RzLmNsYXNzKSk7DQotICAgIH0NCi0gICANCi0gICAgLyoqDQotICAgICAqIFNlbmRzIGFuIFNPQVBNZXNzYWdlIGNvbnRhaW5pbmcgb25seSB4bWwgZGF0YSB0byB0aGUgd2ViIHNlcnZpY2UuICANCi0gICAgICogUmVjZWl2ZXMgYSByZXNwb25zZSBjb250YWluaW5nIGp1c3QgeG1sIGRhdGEuDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvdmlkZXJTT0FQTWVzc2FnZVhNTE9ubHkoKXsNCi0gICAgICAgIHRyeXsgICAgICAgDQotICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBkaXNwYXRjaA0KLSAgICAgICAgICAgIERpc3BhdGNoPFNPQVBNZXNzYWdlPiBkaXNwYXRjaCA9IGNyZWF0ZURpc3BhdGNoKCk7DQotICAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgU09BUE1lc3NhZ2UNCi0gICAgICAgICAgICBTdHJpbmcgbXNnID0gcmVxTXNnU3RhcnQgKyBYTUxfSU5WT0tFICsgcmVxTXNnRW5kOw0KLSAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5IGZhY3RvcnkgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpOw0KLSAgICAgICAgICAgIFNPQVBNZXNzYWdlIHJlcXVlc3QgPSBmYWN0b3J5LmNyZWF0ZU1lc3NhZ2UobnVsbCwgDQotICAgICAgICAgICAgICAgICAgICBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0obXNnLmdldEJ5dGVzKCkpKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBUZXN0IHRoZSB0cmFuc3BvcnQgaGVhZGVycyBieSBzZW5kaW5nIGEgY29udGVudCBkZXNjcmlwdGlvbg0KLSAgICAgICAgICAgIHJlcXVlc3Quc2V0Q29udGVudERlc2NyaXB0aW9uKFNvYXBNZXNzYWdlUHJvdmlkZXIuWE1MX1JFUVVFU1QpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIERpc3BhdGNoDQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEludm9raW5nIFNPQVBNZXNzYWdlUHJvdmlkZXJEaXNwYXRjaCIpOw0KLSAgICAgICAgICAgIFNPQVBNZXNzYWdlIHJlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLQ0KLSAgICAgICAgICAgIC8vIENoZWNrIGZvciB2YWxpZCBjb250ZW50IGRlc2NyaXB0aW9uDQotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXNwb25zZS5nZXRDb250ZW50RGVzY3JpcHRpb24oKSk7DQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFNvYXBNZXNzYWdlUHJvdmlkZXIuWE1MX1JFU1BPTlNFLCByZXNwb25zZS5nZXRDb250ZW50RGVzY3JpcHRpb24oKSk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gQ2hlY2sgYXNzZXJ0aW9ucyBhbmQgZ2V0IHRoZSBkYXRhIGVsZW1lbnQNCi0gICAgICAgICAgICBTT0FQRWxlbWVudCBkYXRhRWxlbWVudCA9IGFzc2VydFJlc3BvbnNlWE1MKHJlc3BvbnNlLCBTb2FwTWVzc2FnZVByb3ZpZGVyLlhNTF9SRVNQT05TRSk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjb3VudEF0dGFjaG1lbnRzKHJlc3BvbnNlKSA9PSAwKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBQcmludCBvdXQgdGhlIHJlc3BvbnNlDQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IFJlc3BvbnNlIFsiICsgcmVzcG9uc2UudG9TdHJpbmcoKSArICJdIik7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgDQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gVHJ5IGEgc2Vjb25kIHRpbWUNCi0gICAgICAgICAgICAvLyBEaXNwYXRjaA0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBJbnZva2luZyBTT0FQTWVzc2FnZVByb3ZpZGVyRGlzcGF0Y2giKTsNCi0gICAgICAgICAgICByZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0NCi0gICAgICAgICAgICAvLyBDaGVjayBmb3IgdmFsaWQgY29udGVudCBkZXNjcmlwdGlvbg0KLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwocmVzcG9uc2UuZ2V0Q29udGVudERlc2NyaXB0aW9uKCkpOw0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhTb2FwTWVzc2FnZVByb3ZpZGVyLlhNTF9SRVNQT05TRSwgcmVzcG9uc2UuZ2V0Q29udGVudERlc2NyaXB0aW9uKCkpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIENoZWNrIGFzc2VydGlvbnMgYW5kIGdldCB0aGUgZGF0YSBlbGVtZW50DQotICAgICAgICAgICAgZGF0YUVsZW1lbnQgPSBhc3NlcnRSZXNwb25zZVhNTChyZXNwb25zZSwgU29hcE1lc3NhZ2VQcm92aWRlci5YTUxfUkVTUE9OU0UpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIGFzc2VydFRydWUoY291bnRBdHRhY2htZW50cyhyZXNwb25zZSkgPT0gMCk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gUHJpbnQgb3V0IHRoZSByZXNwb25zZQ0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBSZXNwb25zZSBbIiArIHJlc3BvbnNlLnRvU3RyaW5nKCkgKyAiXSIpOw0KLSAgICAgICAgCQ0KLSAgICAgICAgfWNhdGNoKEV4Y2VwdGlvbiBlKXsNCi0gICAgICAgIAllLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgICAgIGZhaWwoIkNhdWdodCBleGNlcHRpb24gIiArIGUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBTZW5kcyBhbiBTT0FQTWVzc2FnZSBjb250YWluaW5nIG9ubHkgeG1sIGRhdGEgdG8gdGhlIHdlYiBzZXJ2aWNlLiAgDQotICAgICAqIFJlY2VpdmVzIGEgcmVzcG9uc2UgY29udGFpbmluZyBhbiBlbXB0eSBib2R5DQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvdmlkZXJTT0FQTWVzc2FnZVhNTEVtcHR5Qm9keSgpew0KLSAgICAgICAgdHJ5eyAgICAgICANCi0gICAgICAgICAgICAvLyBDcmVhdGUgdGhlIGRpc3BhdGNoDQotICAgICAgICAgICAgRGlzcGF0Y2g8U09BUE1lc3NhZ2U+IGRpc3BhdGNoID0gY3JlYXRlRGlzcGF0Y2goKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBDcmVhdGUgdGhlIFNPQVBNZXNzYWdlDQotICAgICAgICAgICAgU3RyaW5nIG1zZyA9IHJlcU1zZ1N0YXJ0ICsgRU1QVFlCT0RZX0lOVk9LRSArIHJlcU1zZ0VuZDsNCi0gICAgICAgICAgICBNZXNzYWdlRmFjdG9yeSBmYWN0b3J5ID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoKTsNCi0gICAgICAgICAgICBTT0FQTWVzc2FnZSByZXF1ZXN0ID0gZmFjdG9yeS5jcmVhdGVNZXNzYWdlKG51bGwsIA0KLSAgICAgICAgICAgICAgICAgICAgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG1zZy5nZXRCeXRlcygpKSk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gVGVzdCB0aGUgdHJhbnNwb3J0IGhlYWRlcnMgYnkgc2VuZGluZyBhIGNvbnRlbnQgZGVzY3JpcHRpb24NCi0gICAgICAgICAgICByZXF1ZXN0LnNldENvbnRlbnREZXNjcmlwdGlvbihTb2FwTWVzc2FnZVByb3ZpZGVyLlhNTF9FTVBUWUJPRFlfUkVRVUVTVCk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gRGlzcGF0Y2gNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gSW52b2tpbmcgU09BUE1lc3NhZ2VQcm92aWRlckRpc3BhdGNoIik7DQotICAgICAgICAgICAgU09BUE1lc3NhZ2UgcmVzcG9uc2UgPSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gQ2hlY2sgYXNzZXJ0aW9ucw0KLSAgICAgICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UgIT1udWxsKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlLmdldFNPQVBCb2R5KCkgIT0gbnVsbCk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZS5nZXRTT0FQQm9keSgpLmdldEZpcnN0Q2hpbGQoKSA9PSBudWxsKTsgIC8vIFRoZXJlIHNob3VsZCBiZSBub3RoaW5nIGluIHRoZSBib2R5DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjb3VudEF0dGFjaG1lbnRzKHJlc3BvbnNlKSA9PSAwKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBQcmludCBvdXQgdGhlIHJlc3BvbnNlDQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IFJlc3BvbnNlIFsiICsgcmVzcG9uc2UudG9TdHJpbmcoKSArICJdIik7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gVHJ5IGEgc2Vjb25kIHRpbWUNCi0gICAgICAgICAgICAvLyBEaXNwYXRjaA0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBJbnZva2luZyBTT0FQTWVzc2FnZVByb3ZpZGVyRGlzcGF0Y2giKTsNCi0gICAgICAgICAgICByZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBDaGVjayBhc3NlcnRpb25zDQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZSAhPW51bGwpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UuZ2V0U09BUEJvZHkoKSAhPSBudWxsKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlLmdldFNPQVBCb2R5KCkuZ2V0Rmlyc3RDaGlsZCgpID09IG51bGwpOyAgLy8gVGhlcmUgc2hvdWxkIGJlIG5vdGhpbmcgaW4gdGhlIGJvZHkNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGNvdW50QXR0YWNobWVudHMocmVzcG9uc2UpID09IDApOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIFByaW50IG91dCB0aGUgcmVzcG9uc2UNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gUmVzcG9uc2UgWyIgKyByZXNwb25zZS50b1N0cmluZygpICsgIl0iKTsNCi0gICAgICAgICAgICANCi0gICAgICAgIH1jYXRjaChFeGNlcHRpb24gZSl7DQotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgICAgICBmYWlsKCJDYXVnaHQgZXhjZXB0aW9uICIgKyBlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogU2VuZHMgYW4gU09BUE1lc3NhZ2UgY29udGFpbmluZyBvbmx5IHhtbCBkYXRhIA0KLSAgICAgKiBQcm92aWRlciB3aWxsIHRocm93IGEgRmF1bHQNCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RQcm92aWRlclNPQVBNZXNzYWdlU09BUEZhdWx0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgZGlzcGF0Y2gNCi0gICAgICAgICAgICBEaXNwYXRjaDxTT0FQTWVzc2FnZT4gZGlzcGF0Y2ggPSBjcmVhdGVEaXNwYXRjaCgpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgU09BUE1lc3NhZ2UNCi0gICAgICAgICAgICBTdHJpbmcgbXNnID0gcmVxTXNnU3RhcnQgKyBYTUxfRkFVTFRfSU5WT0tFICsgcmVxTXNnRW5kOw0KLSAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5IGZhY3RvcnkgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpOw0KLSAgICAgICAgICAgIFNPQVBNZXNzYWdlIHJlcXVlc3QgPSBmYWN0b3J5LmNyZWF0ZU1lc3NhZ2UobnVsbCwgDQotICAgICAgICAgICAgICAgICAgICBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0obXNnLmdldEJ5dGVzKCkpKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBUZXN0IHRoZSB0cmFuc3BvcnQgaGVhZGVycyBieSBzZW5kaW5nIGEgY29udGVudCBkZXNjcmlwdGlvbg0KLSAgICAgICAgICAgIHJlcXVlc3Quc2V0Q29udGVudERlc2NyaXB0aW9uKFNvYXBNZXNzYWdlUHJvdmlkZXIuWE1MX0ZBVUxUX1JFUVVFU1QpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgIC8vIERpc3BhdGNoDQotICAgICAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBJbnZva2luZyBTT0FQTWVzc2FnZVByb3ZpZGVyRGlzcGF0Y2giKTsNCi0gICAgICAgICAgICAgICAgU09BUE1lc3NhZ2UgcmVzcG9uc2UgPSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7DQotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIkV4cGVjdGVkIGZhaWx1cmUiLCBmYWxzZSk7DQotICAgICAgICAgICAgfSBjYXRjaCAoU09BUEZhdWx0RXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICAgICAgLy8gT2theQ0KLSAgICAgICAgICAgICAgICBTT0FQRmF1bHQgZmF1bHQgPSBlLmdldEZhdWx0KCk7DQotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoZmF1bHQgIT0gbnVsbCk7DQotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoZmF1bHQuZ2V0RmF1bHRTdHJpbmcoKS5lcXVhbHMoInNhbXBsZSBmYXVsdCIpKTsNCi0gICAgICAgICAgICAgICAgUU5hbWUgZXhwZWN0ZWRGYXVsdENvZGUgPSBuZXcgUU5hbWUoU09BUENvbnN0YW50cy5VUklfTlNfU09BUF8xXzFfRU5WRUxPUEUsICJDbGllbnQiKTsgDQotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoZmF1bHQuZ2V0RmF1bHRDb2RlQXNRTmFtZSgpLmVxdWFscyhleHBlY3RlZEZhdWx0Q29kZSkpOw0KLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGZhdWx0LmdldERldGFpbCgpICE9IG51bGwpOw0KLSAgICAgICAgICAgICAgICBEZXRhaWxFbnRyeSBkZSA9IChEZXRhaWxFbnRyeSkgZmF1bHQuZ2V0RGV0YWlsKCkuZ2V0RGV0YWlsRW50cmllcygpLm5leHQoKTsNCi0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShkZSAhPSBudWxsKTsNCi0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShkZS5nZXRMb2NhbE5hbWUoKS5lcXVhbHMoImRldGFpbEVudHJ5IikpOw0KLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGRlLmdldFZhbHVlKCkuZXF1YWxzKCJzYW1wbGUgZGV0YWlsIikpOw0KLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGZhdWx0LmdldEZhdWx0QWN0b3IoKS5lcXVhbHMoInNhbXBsZSBhY3RvciIpKTsNCi0gICAgICAgICAgICB9ICAgIA0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIFRyeSBhIHNlY29uZCB0aW1lDQotICAgICAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICAgICAgLy8gRGlzcGF0Y2gNCi0gICAgICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEludm9raW5nIFNPQVBNZXNzYWdlUHJvdmlkZXJEaXNwYXRjaCIpOw0KLSAgICAgICAgICAgICAgICBTT0FQTWVzc2FnZSByZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgZmFpbHVyZSIsIGZhbHNlKTsNCi0gICAgICAgICAgICB9IGNhdGNoIChTT0FQRmF1bHRFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgICAgICAvLyBPa2F5DQotICAgICAgICAgICAgICAgIFNPQVBGYXVsdCBmYXVsdCA9IGUuZ2V0RmF1bHQoKTsNCi0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShmYXVsdCAhPSBudWxsKTsNCi0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShmYXVsdC5nZXRGYXVsdFN0cmluZygpLmVxdWFscygic2FtcGxlIGZhdWx0IikpOw0KLSAgICAgICAgICAgICAgICBRTmFtZSBleHBlY3RlZEZhdWx0Q29kZSA9IG5ldyBRTmFtZShTT0FQQ29uc3RhbnRzLlVSSV9OU19TT0FQXzFfMV9FTlZFTE9QRSwgIkNsaWVudCIpOyANCi0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShmYXVsdC5nZXRGYXVsdENvZGVBc1FOYW1lKCkuZXF1YWxzKGV4cGVjdGVkRmF1bHRDb2RlKSk7DQotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoZmF1bHQuZ2V0RGV0YWlsKCkgIT0gbnVsbCk7DQotICAgICAgICAgICAgICAgIERldGFpbEVudHJ5IGRlID0gKERldGFpbEVudHJ5KSBmYXVsdC5nZXREZXRhaWwoKS5nZXREZXRhaWxFbnRyaWVzKCkubmV4dCgpOw0KLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGRlICE9IG51bGwpOw0KLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGRlLmdldExvY2FsTmFtZSgpLmVxdWFscygiZGV0YWlsRW50cnkiKSk7DQotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoZGUuZ2V0VmFsdWUoKS5lcXVhbHMoInNhbXBsZSBkZXRhaWwiKSk7DQotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoZmF1bHQuZ2V0RmF1bHRBY3RvcigpLmVxdWFscygic2FtcGxlIGFjdG9yIikpOw0KLSAgICAgICAgICAgIH0gICAgDQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBTZW5kcyBhbiBTT0FQTWVzc2FnZSBjb250YWluaW5nIG9ubHkgeG1sIGRhdGEgDQotICAgICAqIFByb3ZpZGVyIHdpbGwgdGhyb3cgYSBnZW5lcmljIFdlYlNlcnZpY2VzRXhjZXB0aW9uDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvdmlkZXJTT0FQTWVzc2FnZVdlYlNlcnZpY2VFeGNlcHRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBkaXNwYXRjaA0KLSAgICAgICAgICAgIERpc3BhdGNoPFNPQVBNZXNzYWdlPiBkaXNwYXRjaCA9IGNyZWF0ZURpc3BhdGNoKCk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBTT0FQTWVzc2FnZQ0KLSAgICAgICAgICAgIFN0cmluZyBtc2cgPSByZXFNc2dTdGFydCArIFhNTF9XU0VfSU5WT0tFICsgcmVxTXNnRW5kOw0KLSAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5IGZhY3RvcnkgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpOw0KLSAgICAgICAgICAgIFNPQVBNZXNzYWdlIHJlcXVlc3QgPSBmYWN0b3J5LmNyZWF0ZU1lc3NhZ2UobnVsbCwgDQotICAgICAgICAgICAgICAgICAgICBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0obXNnLmdldEJ5dGVzKCkpKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBUZXN0IHRoZSB0cmFuc3BvcnQgaGVhZGVycyBieSBzZW5kaW5nIGEgY29udGVudCBkZXNjcmlwdGlvbg0KLSAgICAgICAgICAgIHJlcXVlc3Quc2V0Q29udGVudERlc2NyaXB0aW9uKFNvYXBNZXNzYWdlUHJvdmlkZXIuWE1MX1dTRV9SRVFVRVNUKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICB0cnkgew0KLSAgICAgICAgICAgICAgICAvLyBEaXNwYXRjaA0KLSAgICAgICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gSW52b2tpbmcgU09BUE1lc3NhZ2VQcm92aWRlckRpc3BhdGNoIik7DQotICAgICAgICAgICAgICAgIFNPQVBNZXNzYWdlIHJlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJFeHBlY3RlZCBmYWlsdXJlIiwgZmFsc2UpOw0KLSAgICAgICAgICAgIH0gY2F0Y2ggKFNPQVBGYXVsdEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgICAgIC8vIE9rYXkuLi5TT0FQRmF1bHRFeGNlcHRpb24gc2hvdWxkIGJlIHRocm93bg0KLSAgICAgICAgICAgICAgICBTT0FQRmF1bHQgZmF1bHQgPSBlLmdldEZhdWx0KCk7DQotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoZmF1bHQgIT0gbnVsbCk7DQotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoZmF1bHQuZ2V0RmF1bHRTdHJpbmcoKS5lcXVhbHMoIkEgV1NFIHdhcyB0aHJvd24iKSk7DQotICAgICAgICAgICAgfSAgIA0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIFRyeSBhIHNlY29uZCB0aW1lDQotICAgICAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICAgICAgLy8gRGlzcGF0Y2gNCi0gICAgICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEludm9raW5nIFNPQVBNZXNzYWdlUHJvdmlkZXJEaXNwYXRjaCIpOw0KLSAgICAgICAgICAgICAgICBTT0FQTWVzc2FnZSByZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgZmFpbHVyZSIsIGZhbHNlKTsNCi0gICAgICAgICAgICB9IGNhdGNoIChTT0FQRmF1bHRFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgICAgICAvLyBPa2F5Li4uU09BUEZhdWx0RXhjZXB0aW9uIHNob3VsZCBiZSB0aHJvd24NCi0gICAgICAgICAgICAgICAgU09BUEZhdWx0IGZhdWx0ID0gZS5nZXRGYXVsdCgpOw0KLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGZhdWx0ICE9IG51bGwpOw0KLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGZhdWx0LmdldEZhdWx0U3RyaW5nKCkuZXF1YWxzKCJBIFdTRSB3YXMgdGhyb3duIikpOw0KLSAgICAgICAgICAgIH0gDQotICAgIH0NCi0gICAgDQotICAgIA0KLSAgICAvKioNCi0gICAgICogU2VuZHMgYW4gU09BUE1lc3NhZ2UgY29udGFpbmluZyB4bWwgZGF0YSBhbmQgcmF3IGF0dGFjaG1lbnRzIHRvIHRoZSB3ZWIgc2VydmljZS4gIA0KLSAgICAgKiBSZWNlaXZlcyBhIHJlc3BvbnNlIGNvbnRhaW5pbmcgeG1sIGRhdGEgYW5kIHRoZSBzYW1lIHJhdyBhdHRhY2htZW50cy4NCi0gICAgICovDQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvdmlkZXJTT0FQTWVzc2FnZVJhd0F0dGFjaG1lbnQoKXsNCi0gICAgICAgIC8vIFJhdyBBdHRhY2htZW50cyBhcmUgYXR0YWNobWVudHMgdGhhdCBhcmUgbm90IHJlZmVyZW5jZWQgaW4gdGhlIHhtbCB3aXRoIE1UT00gb3IgU1dBUmVmLg0KLSAgICAgICAgLy8gQ3VycmVudGx5IHRoZXJlIGlzIG5vIHN1cHBvcnQgaW4gQXhpcyAyIGZvciB0aGVzZSBraW5kcyBvZiBhdHRhY2htZW50cy4NCi0gICAgICAgIC8vIFRoZSBiZWxpZWYgaXMgdGhhdCBtb3N0IGN1c3RvbWVycyB3aWxsIHVzZSBNVE9NLiAgU29tZSBsZWdhY3kgY3VzdG9tZXJzIHdpbGwgdXNlIFNXQVJlZi4NCi0gICAgICAgIC8vIFJhdyBBdHRhY2htZW50cyBtYXkgYmUgc28gb2xkIHRoYXQgbm8gY3VzdG9tZXJzIG5lZWQgdGhpcyBiZWhhdmlvci4NCi0gICAgICAgIHRyeXsgICAgICAgDQotICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBkaXNwYXRjaA0KLSAgICAgICAgICAgIERpc3BhdGNoPFNPQVBNZXNzYWdlPiBkaXNwYXRjaCA9IGNyZWF0ZURpc3BhdGNoKCk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBTT0FQTWVzc2FnZQ0KLSAgICAgICAgICAgIFN0cmluZyBtc2cgPSByZXFNc2dTdGFydCArIEFUVEFDSE1FTlRfSU5WT0tFICsgcmVxTXNnRW5kOw0KLSAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5IGZhY3RvcnkgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpOw0KLSAgICAgICAgICAgIFNPQVBNZXNzYWdlIHJlcXVlc3QgPSBmYWN0b3J5LmNyZWF0ZU1lc3NhZ2UobnVsbCwgDQotICAgICAgICAgICAgICAgICAgICBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0obXNnLmdldEJ5dGVzKCkpKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBBZGQgdGhlIEF0dGFjaG1lbnQNCi0gICAgICAgICAgICBBdHRhY2htZW50UGFydCBhcCA9IHJlcXVlc3QuY3JlYXRlQXR0YWNobWVudFBhcnQoU29hcE1lc3NhZ2VQcm92aWRlci5URVhUX1hNTF9BVFRBQ0hNRU5ULCAidGV4dC94bWwiKTsNCi0gICAgICAgICAgICBhcC5zZXRDb250ZW50SWQoU29hcE1lc3NhZ2VQcm92aWRlci5JRCk7DQotICAgICAgICAgICAgcmVxdWVzdC5hZGRBdHRhY2htZW50UGFydChhcCk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gRGlzcGF0Y2gNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gSW52b2tpbmcgU09BUE1lc3NhZ2VQcm92aWRlckRpc3BhdGNoIik7DQotICAgICAgICAgICAgU09BUE1lc3NhZ2UgcmVzcG9uc2UgPSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7DQotDQotICAgICAgICAgICAgLy8gQ2hlY2sgYXNzZXJ0aW9ucyBhbmQgZ2V0IHRoZSBkYXRhIGVsZW1lbnQNCi0gICAgICAgICAgICBTT0FQRWxlbWVudCBkYXRhRWxlbWVudCA9IGFzc2VydFJlc3BvbnNlWE1MKHJlc3BvbnNlLCBTb2FwTWVzc2FnZVByb3ZpZGVyLlhNTF9BVFRBQ0hNRU5UX1JFU1BPTlNFKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGNvdW50QXR0YWNobWVudHMocmVzcG9uc2UpID09IDEpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIEdldCB0aGUgQXR0YWNobWVudA0KLSAgICAgICAgICAgIEF0dGFjaG1lbnRQYXJ0IGF0dGFjaG1lbnRQYXJ0ID0gKEF0dGFjaG1lbnRQYXJ0KSByZXNwb25zZS5nZXRBdHRhY2htZW50cygpLm5leHQoKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBDaGVjayB0aGUgYXR0YWNobWVudA0KLSAgICAgICAgICAgIFN0cmVhbVNvdXJjZSBjb250ZW50U1MgPSAoU3RyZWFtU291cmNlKSBhdHRhY2htZW50UGFydC5nZXRDb250ZW50KCk7DQotICAgICAgICAgICAgU3RyaW5nIGNvbnRlbnQgPSBTb2FwTWVzc2FnZVByb3ZpZGVyLmdldEFzU3RyaW5nKGNvbnRlbnRTUyk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjb250ZW50ICE9IG51bGwpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUoY29udGVudC5jb250YWlucyhTb2FwTWVzc2FnZVByb3ZpZGVyLlRFWFRfWE1MX0FUVEFDSE1FTlQpKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBQcmludCBvdXQgdGhlIHJlc3BvbnNlDQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IFJlc3BvbnNlIFsiICsgcmVzcG9uc2UudG9TdHJpbmcoKSArICJdIik7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gVHJ5IGEgc2Vjb25kIHRpbWUNCi0gICAgICAgICAgICAvLyBEaXNwYXRjaA0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBJbnZva2luZyBTT0FQTWVzc2FnZVByb3ZpZGVyRGlzcGF0Y2giKTsNCi0gICAgICAgICAgICByZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0NCi0gICAgICAgICAgICAvLyBDaGVjayBhc3NlcnRpb25zIGFuZCBnZXQgdGhlIGRhdGEgZWxlbWVudA0KLSAgICAgICAgICAgIGRhdGFFbGVtZW50ID0gYXNzZXJ0UmVzcG9uc2VYTUwocmVzcG9uc2UsIFNvYXBNZXNzYWdlUHJvdmlkZXIuWE1MX0FUVEFDSE1FTlRfUkVTUE9OU0UpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUoY291bnRBdHRhY2htZW50cyhyZXNwb25zZSkgPT0gMSk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gR2V0IHRoZSBBdHRhY2htZW50DQotICAgICAgICAgICAgYXR0YWNobWVudFBhcnQgPSAoQXR0YWNobWVudFBhcnQpIHJlc3BvbnNlLmdldEF0dGFjaG1lbnRzKCkubmV4dCgpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIENoZWNrIHRoZSBhdHRhY2htZW50DQotICAgICAgICAgICAgY29udGVudFNTID0gKFN0cmVhbVNvdXJjZSkgYXR0YWNobWVudFBhcnQuZ2V0Q29udGVudCgpOw0KLSAgICAgICAgICAgIGNvbnRlbnQgPSBTb2FwTWVzc2FnZVByb3ZpZGVyLmdldEFzU3RyaW5nKGNvbnRlbnRTUyk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjb250ZW50ICE9IG51bGwpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUoY29udGVudC5jb250YWlucyhTb2FwTWVzc2FnZVByb3ZpZGVyLlRFWFRfWE1MX0FUVEFDSE1FTlQpKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBQcmludCBvdXQgdGhlIHJlc3BvbnNlDQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IFJlc3BvbnNlIFsiICsgcmVzcG9uc2UudG9TdHJpbmcoKSArICJdIik7DQotICAgICAgICAgICAgDQotICAgICAgICB9Y2F0Y2goRXhjZXB0aW9uIGUpew0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAgICAgZmFpbCgiQ2F1Z2h0IGV4Y2VwdGlvbiAiICsgZSk7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFNlbmRzIGFuIFNPQVBNZXNzYWdlIGNvbnRhaW5pbmcgeG1sIGRhdGEgYW5kIG10b20gYXR0YWNobWVudC4gIA0KLSAgICAgKiBSZWNlaXZlcyBhIHJlc3BvbnNlIGNvbnRhaW5pbmcgeG1sIGRhdGEgYW5kIHRoZSBtdG9tIGF0dGFjaG1lbnQuDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvdmlkZXJTT0FQTWVzc2FnZU1UT00oKXsNCi0gICAgICAgIHRyeXsgICAgICAgDQotICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBkaXNwYXRjaA0KLSAgICAgICAgICAgIERpc3BhdGNoPFNPQVBNZXNzYWdlPiBkaXNwYXRjaCA9IGNyZWF0ZURpc3BhdGNoKCk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gTVRPTSBzaG91bGQgYmUgYXV0b21hdGljYWxseSBkZXRlY3RlZC4gIFRoZXJlIGlzIG5vIG5lZWQgdG8gc2V0IGl0DQotICAgICAgICAgICAgLy9CaW5kaW5nIGJpbmRpbmcgPSBkaXNwYXRjaC5nZXRCaW5kaW5nKCk7DQotICAgICAgICAgICAgLy9TT0FQQmluZGluZyBzb2FwQmluZGluZyA9IChTT0FQQmluZGluZykgYmluZGluZzsNCi0gICAgICAgICAgICAvL3NvYXBCaW5kaW5nLnNldE1UT01FbmFibGVkKHRydWUpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgU09BUE1lc3NhZ2UNCi0gICAgICAgICAgICBTdHJpbmcgbXNnID0gcmVxTXNnU3RhcnQgKyBNVE9NX0lOVk9LRSArIHJlcU1zZ0VuZDsNCi0gICAgICAgICAgICBNZXNzYWdlRmFjdG9yeSBmYWN0b3J5ID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoKTsNCi0gICAgICAgICAgICBTT0FQTWVzc2FnZSByZXF1ZXN0ID0gZmFjdG9yeS5jcmVhdGVNZXNzYWdlKG51bGwsIA0KLSAgICAgICAgICAgICAgICAgICAgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG1zZy5nZXRCeXRlcygpKSk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gQWRkIHRoZSBBdHRhY2htZW50DQotICAgICAgICAgICAgQXR0YWNobWVudFBhcnQgYXAgPSByZXF1ZXN0LmNyZWF0ZUF0dGFjaG1lbnRQYXJ0KFNvYXBNZXNzYWdlUHJvdmlkZXIuVEVYVF9YTUxfQVRUQUNITUVOVCwgInRleHQveG1sIik7DQotICAgICAgICAgICAgYXAuc2V0Q29udGVudElkKFNvYXBNZXNzYWdlUHJvdmlkZXIuSUQpOw0KLSAgICAgICAgICAgIHJlcXVlc3QuYWRkQXR0YWNobWVudFBhcnQoYXApOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIERpc3BhdGNoDQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEludm9raW5nIFNPQVBNZXNzYWdlUHJvdmlkZXJEaXNwYXRjaCIpOw0KLSAgICAgICAgICAgIFNPQVBNZXNzYWdlIHJlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLQ0KLSAgICAgICAgICAgIC8vIENoZWNrIGFzc2VydGlvbnMgYW5kIGdldCB0aGUgZGF0YSBlbGVtZW50DQotICAgICAgICAgICAgU09BUEVsZW1lbnQgZGF0YUVsZW1lbnQgPSBhc3NlcnRSZXNwb25zZVhNTChyZXNwb25zZSwgU29hcE1lc3NhZ2VQcm92aWRlci5YTUxfTVRPTV9SRVNQT05TRSk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjb3VudEF0dGFjaG1lbnRzKHJlc3BvbnNlKSA9PSAxKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBHZXQgdGhlIEF0dGFjaG1lbnQNCi0gICAgICAgICAgICBBdHRhY2htZW50UGFydCBhdHRhY2htZW50UGFydCA9IChBdHRhY2htZW50UGFydCkgcmVzcG9uc2UuZ2V0QXR0YWNobWVudHMoKS5uZXh0KCk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gQ2hlY2sgdGhlIGF0dGFjaG1lbnQNCi0gICAgICAgICAgICBTdHJlYW1Tb3VyY2UgY29udGVudFNTID0gKFN0cmVhbVNvdXJjZSkgYXR0YWNobWVudFBhcnQuZ2V0Q29udGVudCgpOw0KLSAgICAgICAgICAgIFN0cmluZyBjb250ZW50ID0gU29hcE1lc3NhZ2VQcm92aWRlci5nZXRBc1N0cmluZyhjb250ZW50U1MpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUoY29udGVudCAhPSBudWxsKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGNvbnRlbnQuY29udGFpbnMoU29hcE1lc3NhZ2VQcm92aWRlci5URVhUX1hNTF9BVFRBQ0hNRU5UKSk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gUHJpbnQgb3V0IHRoZSByZXNwb25zZQ0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBSZXNwb25zZSBbIiArIHJlc3BvbnNlLnRvU3RyaW5nKCkgKyAiXSIpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIFRyeSBhIHNlY29uZCB0aW1lDQotICAgICAgICAgICAgLy8gRGlzcGF0Y2gNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gSW52b2tpbmcgU09BUE1lc3NhZ2VQcm92aWRlckRpc3BhdGNoIik7DQotICAgICAgICAgICAgcmVzcG9uc2UgPSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7DQotDQotICAgICAgICAgICAgLy8gQ2hlY2sgYXNzZXJ0aW9ucyBhbmQgZ2V0IHRoZSBkYXRhIGVsZW1lbnQNCi0gICAgICAgICAgICBkYXRhRWxlbWVudCA9IGFzc2VydFJlc3BvbnNlWE1MKHJlc3BvbnNlLCBTb2FwTWVzc2FnZVByb3ZpZGVyLlhNTF9NVE9NX1JFU1BPTlNFKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGNvdW50QXR0YWNobWVudHMocmVzcG9uc2UpID09IDEpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIEdldCB0aGUgQXR0YWNobWVudA0KLSAgICAgICAgICAgIGF0dGFjaG1lbnRQYXJ0ID0gKEF0dGFjaG1lbnRQYXJ0KSByZXNwb25zZS5nZXRBdHRhY2htZW50cygpLm5leHQoKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBDaGVjayB0aGUgYXR0YWNobWVudA0KLSAgICAgICAgICAgIGNvbnRlbnRTUyA9IChTdHJlYW1Tb3VyY2UpIGF0dGFjaG1lbnRQYXJ0LmdldENvbnRlbnQoKTsNCi0gICAgICAgICAgICBjb250ZW50ID0gU29hcE1lc3NhZ2VQcm92aWRlci5nZXRBc1N0cmluZyhjb250ZW50U1MpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUoY29udGVudCAhPSBudWxsKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGNvbnRlbnQuY29udGFpbnMoU29hcE1lc3NhZ2VQcm92aWRlci5URVhUX1hNTF9BVFRBQ0hNRU5UKSk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gUHJpbnQgb3V0IHRoZSByZXNwb25zZQ0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBSZXNwb25zZSBbIiArIHJlc3BvbnNlLnRvU3RyaW5nKCkgKyAiXSIpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgfWNhdGNoKEV4Y2VwdGlvbiBlKXsNCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgICAgIGZhaWwoIkNhdWdodCBleGNlcHRpb24gIiArIGUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBTZW5kcyBhbiBTT0FQTWVzc2FnZSBjb250YWluaW5nIHhtbCBkYXRhIGFuZCBhIHN3YXJlZiBhdHRhY2htZW50IHRvIHRoZSB3ZWIgc2VydmljZS4gIA0KLSAgICAgKiBSZWNlaXZlcyBhIHJlc3BvbnNlIGNvbnRhaW5pbmcgeG1sIGRhdGEgYW5kIHRoZSBzd2FyZWYgYXR0YWNobWVudCBhdHRhY2htZW50Lg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdFByb3ZpZGVyU09BUE1lc3NhZ2VTV0FSZWYoKXsNCi0gICAgICAgIHRyeXsgICAgICAgDQotICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBkaXNwYXRjaA0KLSAgICAgICAgICAgIERpc3BhdGNoPFNPQVBNZXNzYWdlPiBkaXNwYXRjaCA9IGNyZWF0ZURpc3BhdGNoKCk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBTT0FQTWVzc2FnZQ0KLSAgICAgICAgICAgIFN0cmluZyBtc2cgPSByZXFNc2dTdGFydCArIFNXQVJFRl9JTlZPS0UgKyByZXFNc2dFbmQ7DQotICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkgZmFjdG9yeSA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKCk7DQotICAgICAgICAgICAgU09BUE1lc3NhZ2UgcmVxdWVzdCA9IGZhY3RvcnkuY3JlYXRlTWVzc2FnZShudWxsLCANCi0gICAgICAgICAgICAgICAgICAgIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShtc2cuZ2V0Qnl0ZXMoKSkpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIEFkZCB0aGUgQXR0YWNobWVudA0KLSAgICAgICAgICAgIEF0dGFjaG1lbnRQYXJ0IGFwID0gcmVxdWVzdC5jcmVhdGVBdHRhY2htZW50UGFydChTb2FwTWVzc2FnZVByb3ZpZGVyLlRFWFRfWE1MX0FUVEFDSE1FTlQsICJ0ZXh0L3htbCIpOw0KLSAgICAgICAgICAgIGFwLnNldENvbnRlbnRJZChTb2FwTWVzc2FnZVByb3ZpZGVyLklEKTsNCi0gICAgICAgICAgICByZXF1ZXN0LmFkZEF0dGFjaG1lbnRQYXJ0KGFwKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBEaXNwYXRjaA0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBJbnZva2luZyBTT0FQTWVzc2FnZVByb3ZpZGVyRGlzcGF0Y2giKTsNCi0gICAgICAgICAgICBTT0FQTWVzc2FnZSByZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0NCi0gICAgICAgICAgICAvLyBDaGVjayBhc3NlcnRpb25zIGFuZCBnZXQgdGhlIGRhdGEgZWxlbWVudA0KLSAgICAgICAgICAgIFNPQVBFbGVtZW50IGRhdGFFbGVtZW50ID0gYXNzZXJ0UmVzcG9uc2VYTUwocmVzcG9uc2UsIFNvYXBNZXNzYWdlUHJvdmlkZXIuWE1MX1NXQVJFRl9SRVNQT05TRSk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjb3VudEF0dGFjaG1lbnRzKHJlc3BvbnNlKSA9PSAxKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBHZXQgdGhlIEF0dGFjaG1lbnQNCi0gICAgICAgICAgICBBdHRhY2htZW50UGFydCBhdHRhY2htZW50UGFydCA9IChBdHRhY2htZW50UGFydCkgcmVzcG9uc2UuZ2V0QXR0YWNobWVudHMoKS5uZXh0KCk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gQ2hlY2sgdGhlIGF0dGFjaG1lbnQNCi0gICAgICAgICAgICBTdHJlYW1Tb3VyY2UgY29udGVudFNTID0gKFN0cmVhbVNvdXJjZSkgYXR0YWNobWVudFBhcnQuZ2V0Q29udGVudCgpOw0KLSAgICAgICAgICAgIFN0cmluZyBjb250ZW50ID0gU29hcE1lc3NhZ2VQcm92aWRlci5nZXRBc1N0cmluZyhjb250ZW50U1MpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUoY29udGVudCAhPSBudWxsKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGNvbnRlbnQuY29udGFpbnMoU29hcE1lc3NhZ2VQcm92aWRlci5URVhUX1hNTF9BVFRBQ0hNRU5UKSk7DQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFNvYXBNZXNzYWdlUHJvdmlkZXIuSUQsIGF0dGFjaG1lbnRQYXJ0LmdldENvbnRlbnRJZCgpKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBQcmludCBvdXQgdGhlIHJlc3BvbnNlDQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IFJlc3BvbnNlIFsiICsgcmVzcG9uc2UudG9TdHJpbmcoKSArICJdIik7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgDQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gVHJ5IGEgc2Vjb25kIHRpbWUNCi0gICAgICAgICAgICAvLyBEaXNwYXRjaA0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBJbnZva2luZyBTT0FQTWVzc2FnZVByb3ZpZGVyRGlzcGF0Y2giKTsNCi0gICAgICAgICAgICByZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0NCi0gICAgICAgICAgICAvLyBDaGVjayBhc3NlcnRpb25zIGFuZCBnZXQgdGhlIGRhdGEgZWxlbWVudA0KLSAgICAgICAgICAgIGRhdGFFbGVtZW50ID0gYXNzZXJ0UmVzcG9uc2VYTUwocmVzcG9uc2UsIFNvYXBNZXNzYWdlUHJvdmlkZXIuWE1MX1NXQVJFRl9SRVNQT05TRSk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjb3VudEF0dGFjaG1lbnRzKHJlc3BvbnNlKSA9PSAxKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBHZXQgdGhlIEF0dGFjaG1lbnQNCi0gICAgICAgICAgICBhdHRhY2htZW50UGFydCA9IChBdHRhY2htZW50UGFydCkgcmVzcG9uc2UuZ2V0QXR0YWNobWVudHMoKS5uZXh0KCk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gQ2hlY2sgdGhlIGF0dGFjaG1lbnQNCi0gICAgICAgICAgICBjb250ZW50U1MgPSAoU3RyZWFtU291cmNlKSBhdHRhY2htZW50UGFydC5nZXRDb250ZW50KCk7DQotICAgICAgICAgICAgY29udGVudCA9IFNvYXBNZXNzYWdlUHJvdmlkZXIuZ2V0QXNTdHJpbmcoY29udGVudFNTKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGNvbnRlbnQgIT0gbnVsbCk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjb250ZW50LmNvbnRhaW5zKFNvYXBNZXNzYWdlUHJvdmlkZXIuVEVYVF9YTUxfQVRUQUNITUVOVCkpOw0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhTb2FwTWVzc2FnZVByb3ZpZGVyLklELCBhdHRhY2htZW50UGFydC5nZXRDb250ZW50SWQoKSk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gUHJpbnQgb3V0IHRoZSByZXNwb25zZQ0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBSZXNwb25zZSBbIiArIHJlc3BvbnNlLnRvU3RyaW5nKCkgKyAiXSIpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgfWNhdGNoKEV4Y2VwdGlvbiBlKXsNCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgICAgIGZhaWwoIkNhdWdodCBleGNlcHRpb24gIiArIGUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgIH0NCi0gICAgLyoqDQotICAgICAqIFRoaXMgaXMgYSBuZWdhdGl2ZSB0ZXN0IHRvIGluc3VyZSB0aGF0IHdlIGRvbid0IGFsbG93IGNyZWF0aW9uIG9mIGEgZGlzcGF0Y2ggd2l0aA0KLSAgICAgKiB0eXBlIFNvYXAgdXNpbmcgUGF5bG9hZCBtb2RlDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZFR5cGVXaXRoTW9kZSgpew0KLSAgICAgICAgdHJ5eyAgICAgICANCi0gICAgICAgICAgICBTZXJ2aWNlIHN2YyA9IFNlcnZpY2UuY3JlYXRlKHNlcnZpY2VOYW1lKTsNCi0gICAgICAgICAgICBzdmMuYWRkUG9ydChwb3J0TmFtZSwgbnVsbCwgZW5kcG9pbnRVcmwpOw0KLSAgICAgICAgICAgIERpc3BhdGNoPFNPQVBNZXNzYWdlPiBkaXNwYXRjaCA9IA0KLSAgICAgICAgICAgIAlzdmMuY3JlYXRlRGlzcGF0Y2gocG9ydE5hbWUsIFNPQVBNZXNzYWdlLmNsYXNzLCBTZXJ2aWNlLk1vZGUuUEFZTE9BRCk7DQotICAgICAgICAgICAgZmFpbCgiRGlkIG5vdCBjYXRjaCBleGNlcHRpb24gZm9yIGludmFsaWQgRGlzcGF0Y2ggd2l0aCBQYXlsb2FkIE1vZGUiKTsNCi0gICAgICAgICAgICANCi0gICAgICAgIH1jYXRjaChFeGNlcHRpb24gZSl7DQotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogU2VuZHMgYW4gU3RyaW5nIHBheWxvYWQgY29udGFpbmluZyBvbmx5IHhtbCBkYXRhIHRvIHRoZSBQcm92aWRlcjxTT0FQTWVzc2FnZT4NCi0gICAgICogVGhlIGhlYWRlciBpbmZvcm1hdGlvbiBpcyBzZW50IHVzaW5nIGEgamF4d3MucmVxdWVzdC5zb2FwLmhlYWRlciBNYXAgIA0KLSAgICAgKiBSZWNlaXZlcyBhIHJlc3BvbnNlIGNvbnRhaW5pbmcgeG1sIGRhdGENCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RQcm92aWRlclNPQVBNZXNzYWdlX1JlcXVlc3RIZWFkZXJzKCl7DQotICAgICAgICB0cnl7ICAgICAgIA0KLSAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgZGlzcGF0Y2gNCi0gICAgICAgICAgICBEaXNwYXRjaDxTdHJpbmc+IGRpc3BhdGNoID0gY3JlYXRlU3RyaW5nRGlzcGF0Y2goKTsNCi0gICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBTdHJpbmcgUGF5bG9hZA0KLSAgICAgICAgICAgIFN0cmluZyByZXF1ZXN0ID0gQ0hFQ0tIRUFERVJTX0lOVk9LRTsNCi0gICAgICAgICAgICBNZXNzYWdlRmFjdG9yeSBmYWN0b3J5ID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBDcmVhdGUgdGhlIHJlcXVlc3QgaGVhZGVycw0KLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcmVxdWVzdENvbnRleHQgPSBkaXNwYXRjaC5nZXRSZXF1ZXN0Q29udGV4dCgpOw0KLSAgICAgICAgICAgIE1hcDxRTmFtZSwgTGlzdDxTdHJpbmc+PiByZXF1ZXN0SGVhZGVycyA9IG5ldyBIYXNoTWFwPFFOYW1lLCBMaXN0PFN0cmluZz4+KCk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgU09BUEZhY3Rvcnkgc2YgPSBTT0FQRmFjdG9yeS5uZXdJbnN0YW5jZSgpOw0KLSAgICAgICAgICAgIFNPQVBFbGVtZW50IGUgPSBzZi5jcmVhdGVFbGVtZW50KFNvYXBNZXNzYWdlUHJvdmlkZXIuRk9PX0hFQURFUl9RTkFNRSk7DQotICAgICAgICAgICAgZS5hZGRUZXh0Tm9kZShTb2FwTWVzc2FnZVByb3ZpZGVyLkZPT19IRUFERVJfQ09OVEVOVCk7DQotICAgICAgICAgICAgU3RyaW5nIGZvb0hlYWRlciA9IGUudG9TdHJpbmcoKTsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiRm9vIEhlYWRlcjoiICsgZm9vSGVhZGVyKTsNCi0gICAgICAgICAgICBMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLSAgICAgICAgICAgIGxpc3QuYWRkKGZvb0hlYWRlcik7DQotICAgICAgICAgICAgcmVxdWVzdEhlYWRlcnMucHV0KFNvYXBNZXNzYWdlUHJvdmlkZXIuRk9PX0hFQURFUl9RTkFNRSwgbGlzdCk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLSAgICAgICAgICAgIGUgPSBzZi5jcmVhdGVFbGVtZW50KFNvYXBNZXNzYWdlUHJvdmlkZXIuQkFSX0hFQURFUl9RTkFNRSk7DQotICAgICAgICAgICAgZS5hZGRUZXh0Tm9kZShTb2FwTWVzc2FnZVByb3ZpZGVyLkJBUl9IRUFERVJfQ09OVEVOVDEpOw0KLSAgICAgICAgICAgIFN0cmluZyBiYXJIZWFkZXIgPSBlLnRvU3RyaW5nKCk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIkJhciBIZWFkZXI6IiArIGJhckhlYWRlcik7DQotICAgICAgICAgICAgbGlzdC5hZGQoYmFySGVhZGVyKTsNCi0gICAgICAgICAgICBlID0gc2YuY3JlYXRlRWxlbWVudChTb2FwTWVzc2FnZVByb3ZpZGVyLkJBUl9IRUFERVJfUU5BTUUpOw0KLSAgICAgICAgICAgIGUuYWRkVGV4dE5vZGUoU29hcE1lc3NhZ2VQcm92aWRlci5CQVJfSEVBREVSX0NPTlRFTlQyKTsNCi0gICAgICAgICAgICBiYXJIZWFkZXIgPSBlLnRvU3RyaW5nKCk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIkJhciBIZWFkZXI6IiArIGJhckhlYWRlcik7DQotICAgICAgICAgICAgbGlzdC5hZGQoYmFySGVhZGVyKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICANCi0gICAgICAgICAgICByZXF1ZXN0SGVhZGVycy5wdXQoU29hcE1lc3NhZ2VQcm92aWRlci5CQVJfSEVBREVSX1FOQU1FLCBsaXN0KTsNCi0gICAgICAgICAgICByZXF1ZXN0Q29udGV4dC5wdXQoQ29uc3RhbnRzLkpBWFdTX09VVEJPVU5EX1NPQVBfSEVBREVSUywgcmVxdWVzdEhlYWRlcnMpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIERpc3BhdGNoDQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEludm9raW5nIFNPQVBNZXNzYWdlUHJvdmlkZXJEaXNwYXRjaCIpOw0KLSAgICAgICAgICAgIFN0cmluZyByZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBDaGVjayBhc3NlcnRpb25zIGFuZCBnZXQgdGhlIGRhdGEgZWxlbWVudA0KLSAgICAgICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UuY29udGFpbnMoU29hcE1lc3NhZ2VQcm92aWRlci5YTUxfQ0hFQ0tIRUFERVJTX1JFU1BPTlNFKSk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gUHJpbnQgb3V0IHRoZSByZXNwb25zZQ0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBSZXNwb25zZSBbIiArIHJlc3BvbnNlICsgIl0iKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBUcnkgYSBzZWNvbmQgdGltZQ0KLSAgICAgICAgICAgIC8vIERpc3BhdGNoDQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEludm9raW5nIFNPQVBNZXNzYWdlUHJvdmlkZXJEaXNwYXRjaCIpOw0KLSAgICAgICAgICAgIHJlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIENoZWNrIGFzc2VydGlvbnMgYW5kIGdldCB0aGUgZGF0YSBlbGVtZW50DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZS5jb250YWlucyhTb2FwTWVzc2FnZVByb3ZpZGVyLlhNTF9DSEVDS0hFQURFUlNfUkVTUE9OU0UpKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBQcmludCBvdXQgdGhlIHJlc3BvbnNlDQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IFJlc3BvbnNlIFsiICsgcmVzcG9uc2UgKyAiXSIpOw0KLSAgICAgICAgICAgICAgICANCi0gICAgICAgIH1jYXRjaChFeGNlcHRpb24gZSl7DQotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgICAgICBmYWlsKCJDYXVnaHQgZXhjZXB0aW9uICIgKyBlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogU2VuZHMgYW4gU3RyaW5nIHBheWxvYWQgY29udGFpbmluZyBvbmx5IHhtbCBkYXRhIHRvIHRoZSBQcm92aWRlcjxTT0FQTWVzc2FnZT4NCi0gICAgICogVGhlIGhlYWRlciBpbmZvcm1hdGlvbiBpcyBzZW50IHVzaW5nIGEgamF4d3MucmVxdWVzdC5zb2FwLmhlYWRlciBNYXAgIA0KLSAgICAgKiBSZWNlaXZlcyBhIHJlc3BvbnNlIGNvbnRhaW5pbmcgeG1sIGRhdGENCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RQcm92aWRlclNPQVBNZXNzYWdlX1JlcXVlc3RBbmRSZXNwb25zZUhlYWRlcnMoKXsNCi0gICAgICAgIHRyeXsgICAgICAgDQotICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBkaXNwYXRjaA0KLSAgICAgICAgICAgIERpc3BhdGNoPFN0cmluZz4gZGlzcGF0Y2ggPSBjcmVhdGVTdHJpbmdEaXNwYXRjaCgpOw0KLSAgICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBDcmVhdGUgdGhlIFN0cmluZyBQYXlsb2FkDQotICAgICAgICAgICAgU3RyaW5nIHJlcXVlc3QgPSBDSEVDS0hFQURFUlNfSU5WT0tFOw0KLSAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5IGZhY3RvcnkgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgcmVxdWVzdCBoZWFkZXJzDQotICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByZXF1ZXN0Q29udGV4dCA9IGRpc3BhdGNoLmdldFJlcXVlc3RDb250ZXh0KCk7DQotICAgICAgICAgICAgTWFwPFFOYW1lLCBMaXN0PFN0cmluZz4+IHJlcXVlc3RIZWFkZXJzID0gbmV3IEhhc2hNYXA8UU5hbWUsIExpc3Q8U3RyaW5nPj4oKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBTT0FQRmFjdG9yeSBzZiA9IFNPQVBGYWN0b3J5Lm5ld0luc3RhbmNlKCk7DQotICAgICAgICAgICAgU09BUEVsZW1lbnQgZSA9IHNmLmNyZWF0ZUVsZW1lbnQoU29hcE1lc3NhZ2VQcm92aWRlci5GT09fSEVBREVSX1FOQU1FKTsNCi0gICAgICAgICAgICBlLmFkZFRleHROb2RlKFNvYXBNZXNzYWdlUHJvdmlkZXIuRk9PX0hFQURFUl9DT05URU5UKTsNCi0gICAgICAgICAgICBTdHJpbmcgZm9vSGVhZGVyID0gZS50b1N0cmluZygpOw0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJGb28gSGVhZGVyOiIgKyBmb29IZWFkZXIpOw0KLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQotICAgICAgICAgICAgbGlzdC5hZGQoZm9vSGVhZGVyKTsNCi0gICAgICAgICAgICByZXF1ZXN0SGVhZGVycy5wdXQoU29hcE1lc3NhZ2VQcm92aWRlci5GT09fSEVBREVSX1FOQU1FLCBsaXN0KTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQotICAgICAgICAgICAgZSA9IHNmLmNyZWF0ZUVsZW1lbnQoU29hcE1lc3NhZ2VQcm92aWRlci5CQVJfSEVBREVSX1FOQU1FKTsNCi0gICAgICAgICAgICBlLmFkZFRleHROb2RlKFNvYXBNZXNzYWdlUHJvdmlkZXIuQkFSX0hFQURFUl9DT05URU5UMSk7DQotICAgICAgICAgICAgU3RyaW5nIGJhckhlYWRlciA9IGUudG9TdHJpbmcoKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiQmFyIEhlYWRlcjoiICsgYmFySGVhZGVyKTsNCi0gICAgICAgICAgICBsaXN0LmFkZChiYXJIZWFkZXIpOw0KLSAgICAgICAgICAgIGUgPSBzZi5jcmVhdGVFbGVtZW50KFNvYXBNZXNzYWdlUHJvdmlkZXIuQkFSX0hFQURFUl9RTkFNRSk7DQotICAgICAgICAgICAgZS5hZGRUZXh0Tm9kZShTb2FwTWVzc2FnZVByb3ZpZGVyLkJBUl9IRUFERVJfQ09OVEVOVDIpOw0KLSAgICAgICAgICAgIGJhckhlYWRlciA9IGUudG9TdHJpbmcoKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiQmFyIEhlYWRlcjoiICsgYmFySGVhZGVyKTsNCi0gICAgICAgICAgICBsaXN0LmFkZChiYXJIZWFkZXIpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIHJlcXVlc3RIZWFkZXJzLnB1dChTb2FwTWVzc2FnZVByb3ZpZGVyLkJBUl9IRUFERVJfUU5BTUUsIGxpc3QpOw0KLSAgICAgICAgICAgIHJlcXVlc3RDb250ZXh0LnB1dChDb25zdGFudHMuSkFYV1NfT1VUQk9VTkRfU09BUF9IRUFERVJTLCByZXF1ZXN0SGVhZGVycyk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gRGlzcGF0Y2gNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gSW52b2tpbmcgU09BUE1lc3NhZ2VQcm92aWRlckRpc3BhdGNoIik7DQotICAgICAgICAgICAgU3RyaW5nIHJlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIENoZWNrIGFzc2VydGlvbnMgYW5kIGdldCB0aGUgZGF0YSBlbGVtZW50DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZS5jb250YWlucyhTb2FwTWVzc2FnZVByb3ZpZGVyLlhNTF9DSEVDS0hFQURFUlNfUkVTUE9OU0UpKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBDaGVjayBvdXRib3VuZCBoZWFkZXJzDQotICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByZXNwb25zZUNvbnRleHQgPSBkaXNwYXRjaC5nZXRSZXNwb25zZUNvbnRleHQoKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlQ29udGV4dCAhPSBudWxsKTsNCi0gICAgICAgICAgICBNYXA8UU5hbWUsIExpc3Q8U3RyaW5nPj4gcmVzcG9uc2VIZWFkZXJzID0gKE1hcDxRTmFtZSwgTGlzdDxTdHJpbmc+PikgDQotICAgICAgICAgICAgICAgIHJlc3BvbnNlQ29udGV4dC5nZXQoQ29uc3RhbnRzLkpBWFdTX0lOQk9VTkRfU09BUF9IRUFERVJTKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlSGVhZGVycyAhPSBudWxsKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlSGVhZGVycy5zaXplKCkgPj0gMik7DQotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IGJhdEhlYWRlcnMgPSByZXNwb25zZUhlYWRlcnMuZ2V0KFNvYXBNZXNzYWdlUHJvdmlkZXIuQkFUX0hFQURFUl9RTkFNRSk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShiYXRIZWFkZXJzICE9IG51bGwgJiYgYmF0SGVhZGVycy5zaXplKCkgPT0gMSk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShiYXRIZWFkZXJzLmdldCgwKS5jb250YWlucyhTb2FwTWVzc2FnZVByb3ZpZGVyLkJBVF9IRUFERVJfQ09OVEVOVCkpOw0KLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBiYXJIZWFkZXJzID1yZXNwb25zZUhlYWRlcnMuZ2V0KFNvYXBNZXNzYWdlUHJvdmlkZXIuQkFSX0hFQURFUl9RTkFNRSk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShiYXJIZWFkZXJzICE9IG51bGwgJiYgIGJhckhlYWRlcnMuc2l6ZSgpID09IDIpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUoYmFySGVhZGVycy5nZXQoMCkuY29udGFpbnMoU29hcE1lc3NhZ2VQcm92aWRlci5CQVJfSEVBREVSX0NPTlRFTlQxKSk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShiYXJIZWFkZXJzLmdldCgxKS5jb250YWlucyhTb2FwTWVzc2FnZVByb3ZpZGVyLkJBUl9IRUFERVJfQ09OVEVOVDIpKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBUaGVyZSBzaG91bGQgYmUgbm8gZm9vIGhlYWRlciBpbiB0aGUgcmVzcG9uc2UNCi0gICAgICAgICAgICBMaXN0PFN0cmluZz4gZm9vSGVhZGVycyA9IHJlc3BvbnNlSGVhZGVycy5nZXQoU29hcE1lc3NhZ2VQcm92aWRlci5GT09fSEVBREVSX1FOQU1FKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGZvb0hlYWRlcnMgPT0gbnVsbCk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gUHJpbnQgb3V0IHRoZSByZXNwb25zZQ0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBSZXNwb25zZSBbIiArIHJlc3BvbnNlICsgIl0iKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICANCi0gICAgICAgICAgICANCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBUcnkgYSBzZWNvbmQgdGltZQ0KLSAgICAgICAgICAgIC8vIERpc3BhdGNoDQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEludm9raW5nIFNPQVBNZXNzYWdlUHJvdmlkZXJEaXNwYXRjaCIpOw0KLSAgICAgICAgICAgIHJlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIENoZWNrIGFzc2VydGlvbnMgYW5kIGdldCB0aGUgZGF0YSBlbGVtZW50DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZS5jb250YWlucyhTb2FwTWVzc2FnZVByb3ZpZGVyLlhNTF9DSEVDS0hFQURFUlNfUkVTUE9OU0UpKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBDaGVjayBvdXRib3VuZCBoZWFkZXJzDQotICAgICAgICAgICAgcmVzcG9uc2VDb250ZXh0ID0gZGlzcGF0Y2guZ2V0UmVzcG9uc2VDb250ZXh0KCk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZUNvbnRleHQgIT0gbnVsbCk7DQotICAgICAgICAgICAgcmVzcG9uc2VIZWFkZXJzID0gKE1hcDxRTmFtZSwgTGlzdDxTdHJpbmc+PikgDQotICAgICAgICAgICAgICAgIHJlc3BvbnNlQ29udGV4dC5nZXQoQ29uc3RhbnRzLkpBWFdTX0lOQk9VTkRfU09BUF9IRUFERVJTKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlSGVhZGVycyAhPSBudWxsKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlSGVhZGVycy5zaXplKCkgPj0gMik7DQotICAgICAgICAgICAgYmF0SGVhZGVycyA9IHJlc3BvbnNlSGVhZGVycy5nZXQoU29hcE1lc3NhZ2VQcm92aWRlci5CQVRfSEVBREVSX1FOQU1FKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGJhdEhlYWRlcnMgIT0gbnVsbCAmJiBiYXRIZWFkZXJzLnNpemUoKSA9PSAxKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGJhdEhlYWRlcnMuZ2V0KDApLmNvbnRhaW5zKFNvYXBNZXNzYWdlUHJvdmlkZXIuQkFUX0hFQURFUl9DT05URU5UKSk7DQotICAgICAgICAgICAgYmFySGVhZGVycyA9cmVzcG9uc2VIZWFkZXJzLmdldChTb2FwTWVzc2FnZVByb3ZpZGVyLkJBUl9IRUFERVJfUU5BTUUpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUoYmFySGVhZGVycyAhPSBudWxsICYmICBiYXJIZWFkZXJzLnNpemUoKSA9PSAyKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGJhckhlYWRlcnMuZ2V0KDApLmNvbnRhaW5zKFNvYXBNZXNzYWdlUHJvdmlkZXIuQkFSX0hFQURFUl9DT05URU5UMSkpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUoYmFySGVhZGVycy5nZXQoMSkuY29udGFpbnMoU29hcE1lc3NhZ2VQcm92aWRlci5CQVJfSEVBREVSX0NPTlRFTlQyKSk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gVGhlcmUgc2hvdWxkIGJlIG5vIGZvbyBoZWFkZXIgaW4gdGhlIHJlc3BvbnNlDQotICAgICAgICAgICAgZm9vSGVhZGVycyA9IHJlc3BvbnNlSGVhZGVycy5nZXQoU29hcE1lc3NhZ2VQcm92aWRlci5GT09fSEVBREVSX1FOQU1FKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGZvb0hlYWRlcnMgPT0gbnVsbCk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gUHJpbnQgb3V0IHRoZSByZXNwb25zZQ0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBSZXNwb25zZSBbIiArIHJlc3BvbnNlICsgIl0iKTsNCi0gICAgICAgICAgICAgICAgDQotICAgICAgICB9Y2F0Y2goRXhjZXB0aW9uIGUpew0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAgICAgZmFpbCgiQ2F1Z2h0IGV4Y2VwdGlvbiAiICsgZSk7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogQHJldHVybg0KLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBEaXNwYXRjaDxTT0FQTWVzc2FnZT4gY3JlYXRlRGlzcGF0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgCQ0KLSAgICAJDQotICAgICAgICBTZXJ2aWNlIHN2YyA9IFNlcnZpY2UuY3JlYXRlKHNlcnZpY2VOYW1lKTsNCi0gICAgICAgIHN2Yy5hZGRQb3J0KHBvcnROYW1lLG51bGwsIGVuZHBvaW50VXJsKTsNCi0gICAgICAgIERpc3BhdGNoPFNPQVBNZXNzYWdlPiBkaXNwYXRjaCA9IA0KLSAgICAgICAgCXN2Yy5jcmVhdGVEaXNwYXRjaChwb3J0TmFtZSwgU09BUE1lc3NhZ2UuY2xhc3MsIFNlcnZpY2UuTW9kZS5NRVNTQUdFKTsNCi0gICAgICAgIHJldHVybiBkaXNwYXRjaDsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIEByZXR1cm4NCi0gICAgICogQHRocm93cyBFeGNlcHRpb24NCi0gICAgICovDQotICAgIHByaXZhdGUgRGlzcGF0Y2g8U3RyaW5nPiBjcmVhdGVTdHJpbmdEaXNwYXRjaCgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgDQotICAgICAgICANCi0gICAgICAgIFNlcnZpY2Ugc3ZjID0gU2VydmljZS5jcmVhdGUoc2VydmljZU5hbWUpOw0KLSAgICAgICAgc3ZjLmFkZFBvcnQocG9ydE5hbWUsbnVsbCwgZW5kcG9pbnRVcmwpOw0KLSAgICAgICAgRGlzcGF0Y2g8U3RyaW5nPiBkaXNwYXRjaCA9IA0KLSAgICAgICAgICAgICAgICBzdmMuY3JlYXRlRGlzcGF0Y2gocG9ydE5hbWUsIFN0cmluZy5jbGFzcywgU2VydmljZS5Nb2RlLlBBWUxPQUQpOw0KLSAgICAgICAgcmV0dXJuIGRpc3BhdGNoOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogQ29tbW9uIGFzc2VydGlvbiBjaGVja2luZyBvZiB0aGUgcmVzcG9uc2UNCi0gICAgICogQHBhcmFtIG1zZw0KLSAgICAgKiBAcGFyYW0gZXhwZWN0ZWRUZXh0DQotICAgICAqIEByZXR1cm4gU09BUEVsZW1lbnQgcmVwcmVzZW50aW5nIHRoZSBkYXRhIGVsZW1lbnQNCi0gICAgICovDQotICAgIHByaXZhdGUgU09BUEVsZW1lbnQgYXNzZXJ0UmVzcG9uc2VYTUwoU09BUE1lc3NhZ2UgbXNnLCBTdHJpbmcgZXhwZWN0ZWRUZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIGFzc2VydFRydWUobXNnICE9IG51bGwpOw0KLSAgICAgICAgU09BUEJvZHkgYm9keSA9IG1zZy5nZXRTT0FQQm9keSgpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShib2R5ICE9IG51bGwpOw0KLSAgICAgICAgDQotICAgICAgICBOb2RlIGludm9rZUVsZW1lbnQgPSAoTm9kZSkgYm9keS5nZXRGaXJzdENoaWxkKCk7DQotICAgICAgICBhc3NlcnRUcnVlKGludm9rZUVsZW1lbnQgaW5zdGFuY2VvZiBTT0FQRWxlbWVudCk7DQotICAgICAgICBhc3NlcnRFcXVhbHMoU29hcE1lc3NhZ2VQcm92aWRlci5SRVNQT05TRV9OQU1FLCBpbnZva2VFbGVtZW50LmdldExvY2FsTmFtZSgpKTsNCi0gICAgICAgIA0KLSAgICAgICAgTm9kZSBkYXRhRWxlbWVudCA9IChOb2RlKSBpbnZva2VFbGVtZW50LmdldEZpcnN0Q2hpbGQoKTsNCi0gICAgICAgIGFzc2VydFRydWUoZGF0YUVsZW1lbnQgaW5zdGFuY2VvZiBTT0FQRWxlbWVudCk7DQotICAgICAgICBhc3NlcnRFcXVhbHMoU29hcE1lc3NhZ2VQcm92aWRlci5SRVNQT05TRV9EQVRBX05BTUUsIGRhdGFFbGVtZW50LmdldExvY2FsTmFtZSgpKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gVE9ETyBBWElTMiBTQUFKIHNob3VsZCAoYnV0IGRvZXMgbm90KSBzdXBwb3J0IHRoZSBnZXRUZXh0Q29udGVudCgpOw0KLSAgICAgICAgLy8gU3RyaW5nIHRleHQgPSBkYXRhRWxlbWVudC5nZXRUZXh0Q29udGVudCgpOw0KLSAgICAgICAgU3RyaW5nIHRleHQgPSBkYXRhRWxlbWVudC5nZXRWYWx1ZSgpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJGb3VuZCAoIisgdGV4dCArICIpIGJ1dCBleHBlY3RlZCAoIiArIGV4cGVjdGVkVGV4dCArICIpIiwgZXhwZWN0ZWRUZXh0LCB0ZXh0KTsNCi0gICAgICAgIA0KLSAgICAgICAgcmV0dXJuIChTT0FQRWxlbWVudCkgZGF0YUVsZW1lbnQ7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBDb3VudCBBdHRhY2htZW50cw0KLSAgICAgKiBAcGFyYW0gbXNnDQotICAgICAqIEByZXR1cm4NCi0gICAgICovDQotICAgIHByaXZhdGUgaW50IGNvdW50QXR0YWNobWVudHMoU09BUE1lc3NhZ2UgbXNnKSB7DQotICAgICAgICBJdGVyYXRvciBpdCA9IG1zZy5nZXRBdHRhY2htZW50cygpOw0KLSAgICAgICAgaW50IGNvdW50ID0gMDsNCi0gICAgICAgIGFzc2VydFRydWUoaXQgIT0gbnVsbCk7DQotICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7DQotICAgICAgICAgICAgaXQubmV4dCgpOw0KLSAgICAgICAgICAgIGNvdW50Kys7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gY291bnQ7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyL1NvdXJjZU1lc3NhZ2VQcm92aWRlclRlc3RzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvU291cmNlTWVzc2FnZVByb3ZpZGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdmOTYxMS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvU291cmNlTWVzc2FnZVByb3ZpZGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJvdmlkZXI7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLlRlc3RMb2dnZXI7DQotDQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOw0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1Tb3VyY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5EaXNwYXRjaDsNCi1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7DQotaW1wb3J0IGphdmEuaW8uRmlsZTsNCi1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07DQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07DQotDQotcHVibGljIGNsYXNzIFNvdXJjZU1lc3NhZ2VQcm92aWRlclRlc3RzIGV4dGVuZHMgUHJvdmlkZXJUZXN0Q2FzZSB7DQotDQotICAgIHByaXZhdGUgU3RyaW5nIGVuZHBvaW50VXJsID0gImh0dHA6Ly9sb2NhbGhvc3Q6NjA2MC9heGlzMi9zZXJ2aWNlcy9Tb3VyY2VNZXNzYWdlUHJvdmlkZXJTZXJ2aWNlLlNvdXJjZU1lc3NhZ2VQcm92aWRlclBvcnQiOw0KLSAgICBwcml2YXRlIFFOYW1lIHNlcnZpY2VOYW1lID0gbmV3IFFOYW1lKCJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMiIsICJTb3VyY2VNZXNzYWdlUHJvdmlkZXJTZXJ2aWNlIik7DQotICAgIHByaXZhdGUgU3RyaW5nIHhtbERpciA9ICJ4bWwiOw0KLQ0KLSAgICBwdWJsaWMgU291cmNlTWVzc2FnZVByb3ZpZGVyVGVzdHMoKSB7DQotICAgICAgICBzdXBlcigpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsNCi0gICAgICAgIHJldHVybiBnZXRUZXN0U2V0dXAobmV3IFRlc3RTdWl0ZShTb3VyY2VNZXNzYWdlUHJvdmlkZXJUZXN0cy5jbGFzcykpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RQcm92aWRlclNvdXJjZSgpew0KLSAgICAgICAgdHJ5ew0KLSAgICAgICAgICAgIFN0cmluZyByZXNvdXJjZURpciA9IG5ldyBGaWxlKHByb3ZpZGVyUmVzb3VyY2VEaXIsIHhtbERpcikuZ2V0QWJzb2x1dGVQYXRoKCk7DQotICAgICAgICAgICAgU3RyaW5nIGZpbGVOYW1lID0gcmVzb3VyY2VEaXIrRmlsZS5zZXBhcmF0b3IrIndlYi54bWwiOw0KLQ0KLSAgICAgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGZpbGVOYW1lKTsNCi0gICAgICAgICAgICBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSk7DQotICAgICAgICAgICAgU3RyZWFtU291cmNlIHhtbFN0cmVhbVNvdXJjZSA9IG5ldyBTdHJlYW1Tb3VyY2UoaW5wdXRTdHJlYW0pOw0KLQ0KLSAgICAgICAgICAgIFNlcnZpY2Ugc3ZjID0gU2VydmljZS5jcmVhdGUoc2VydmljZU5hbWUpOw0KLSAgICAgICAgICAgIHN2Yy5hZGRQb3J0KHBvcnROYW1lLG51bGwsIGVuZHBvaW50VXJsKTsNCi0gICAgICAgICAgICBEaXNwYXRjaDxTb3VyY2U+IGRpc3BhdGNoID0gc3ZjLmNyZWF0ZURpc3BhdGNoKHBvcnROYW1lLCBTb3VyY2UuY2xhc3MsIG51bGwpOw0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBJbnZva2luZyBTb3VyY2VNZXNzYWdlUHJvdmlkZXJEaXNwYXRjaCIpOw0KLSAgICAgICAgICAgIFNvdXJjZSByZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZSh4bWxTdHJlYW1Tb3VyY2UpOw0KLQ0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBSZXNwb25zZSBbIiArIHJlc3BvbnNlLnRvU3RyaW5nKCkgKyAiXSIpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIFRyeSBhZ2FpbiB0byB2ZXJpZnkNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gSW52b2tpbmcgU291cmNlTWVzc2FnZVByb3ZpZGVyRGlzcGF0Y2giKTsNCi0gICAgICAgICAgICBpbnB1dFN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSk7DQotICAgICAgICAgICAgeG1sU3RyZWFtU291cmNlID0gbmV3IFN0cmVhbVNvdXJjZShpbnB1dFN0cmVhbSk7DQotICAgICAgICAgICAgcmVzcG9uc2UgPSBkaXNwYXRjaC5pbnZva2UoeG1sU3RyZWFtU291cmNlKTsNCi0NCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gUmVzcG9uc2UgWyIgKyByZXNwb25zZS50b1N0cmluZygpICsgIl0iKTsNCi0NCi0gICAgICAgIH1jYXRjaChFeGNlcHRpb24gZSl7DQotICAgICAgICAJZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgICAgICBmYWlsKCJDYXVnaHQgZXhjZXB0aW9uICIgKyBlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9Tb3VyY2VQcm92aWRlclRlc3RzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvU291cmNlUHJvdmlkZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2ZiMWYwLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9Tb3VyY2VQcm92aWRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm92aWRlcjsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuVGVzdExvZ2dlcjsNCi0NCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEZhdWx0Ow0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlJlc3VsdDsNCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7DQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXI7DQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5Ow0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7DQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVNvdXJjZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLkJpbmRpbmdQcm92aWRlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLkRpc3BhdGNoOw0KLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuU09BUEZhdWx0RXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLmlvLkZpbGU7DQotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsNCi0NCi1wdWJsaWMgY2xhc3MgU291cmNlUHJvdmlkZXJUZXN0cyBleHRlbmRzIFByb3ZpZGVyVGVzdENhc2Ugew0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyBlbmRwb2ludFVybCA9ICJodHRwOi8vbG9jYWxob3N0OjYwNjAvYXhpczIvc2VydmljZXMvU291cmNlUHJvdmlkZXJTZXJ2aWNlLlNvdXJjZVByb3ZpZGVyUG9ydCI7DQotICAgIHByaXZhdGUgUU5hbWUgc2VydmljZU5hbWUgPSBuZXcgUU5hbWUoImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyIiwgIlNvdXJjZVByb3ZpZGVyU2VydmljZSIpOw0KLSAgICBwcml2YXRlIFN0cmluZyB4bWxEaXIgPSAieG1sIjsNCi0NCi0gICAgcHVibGljIFNvdXJjZVByb3ZpZGVyVGVzdHMoKSB7DQotICAgICAgICBzdXBlcigpOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7DQotICAgICAgICByZXR1cm4gZ2V0VGVzdFNldHVwKG5ldyBUZXN0U3VpdGUoU291cmNlUHJvdmlkZXJUZXN0cy5jbGFzcykpOw0KLSAgICB9DQotICAgICAgICANCi0gICAgcHJpdmF0ZSBEaXNwYXRjaDxTb3VyY2U+IGdldERpc3BhdGNoKCkgew0KLSAgICAgICAgU2VydmljZSBzdmMgPSBTZXJ2aWNlLmNyZWF0ZShzZXJ2aWNlTmFtZSk7DQotICAgICAgICBzdmMuYWRkUG9ydChwb3J0TmFtZSwgbnVsbCwgZW5kcG9pbnRVcmwpOw0KLSAgICAgICAgDQotICAgICAgICBEaXNwYXRjaDxTb3VyY2U+IGRpc3BhdGNoID0gc3ZjDQotICAgICAgICAgICAgICAgIC5jcmVhdGVEaXNwYXRjaChwb3J0TmFtZSwgU291cmNlLmNsYXNzLCBTZXJ2aWNlLk1vZGUuUEFZTE9BRCk7DQotICAgICAgICANCi0gICAgICAgIC8vIEZvcmNlIHNvYXAgYWN0aW9uIGJlY2F1c2Ugd2UgYXJlIHBhc3NpbmcganVuayBvdmVyIHRoZSB3aXJlDQotICAgICAgICBkaXNwYXRjaC5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dChCaW5kaW5nUHJvdmlkZXIuU09BUEFDVElPTl9VU0VfUFJPUEVSVFksIEJvb2xlYW4uVFJVRSk7DQotICAgICAgICBkaXNwYXRjaC5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dChCaW5kaW5nUHJvdmlkZXIuU09BUEFDVElPTl9VUklfUFJPUEVSVFksInRlc3QiKTsNCi0gICAgICAgIA0KLSAgICAgICAgcmV0dXJuIGRpc3BhdGNoOw0KLSAgICAgICAgDQotICAgIH0NCi0gICAgDQotICAgIHByaXZhdGUgU291cmNlIGdldFNvdXJjZShTdHJpbmcgdGV4dCkgew0KLSAgICAgICAgaWYgKHRleHQgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBzdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0odGV4dC5nZXRCeXRlcygpKTsNCi0gICAgICAgICAgICByZXR1cm4gbmV3IFN0cmVhbVNvdXJjZSgoSW5wdXRTdHJlYW0pIHN0cmVhbSk7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgfQ0KLSAgICANCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0U3RyaW5nKFNvdXJjZSBzb3VyY2UpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgaWYgKHNvdXJjZSA9PSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgICAgICBTdHJpbmdXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOw0KLSAgICAgICAgVHJhbnNmb3JtZXIgdCA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1RyYW5zZm9ybWVyKCk7DQotICAgICAgICBSZXN1bHQgcmVzdWx0ID0gbmV3IFN0cmVhbVJlc3VsdCh3cml0ZXIpOw0KLSAgICAgICAgdC50cmFuc2Zvcm0oc291cmNlLCByZXN1bHQpOw0KLSAgICAgICAgcmV0dXJuIHdyaXRlci5nZXRCdWZmZXIoKS50b1N0cmluZygpOw0KLSAgICAgICAgDQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHRlc3ROb3JtYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJ0ZXN0OiAiICsgZ2V0TmFtZSgpKTsNCi0gICAgICAgIA0KLSAgICAgICAgRGlzcGF0Y2g8U291cmNlPiBkaXNwYXRjaCA9IGdldERpc3BhdGNoKCk7DQotICAgICAgICANCi0gICAgICAgIFN0cmluZyByZXF1ZXN0ID0gIjx0ZXN0PmhlbGxvIHdvcmxkPC90ZXN0PiI7DQotICAgICAgICBTb3VyY2UgcmVxdWVzdFNvdXJjZSA9IGdldFNvdXJjZShyZXF1ZXN0KTsNCi0gICAgICAgIFNvdXJjZSByZXNwb25zZVNvdXJjZSA9IGRpc3BhdGNoLmludm9rZShyZXF1ZXN0U291cmNlKTsNCi0gICAgICAgIFN0cmluZyByZXNwb25zZSA9IGdldFN0cmluZyhyZXNwb25zZVNvdXJjZSk7DQotICAgICAgICANCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UuY29udGFpbnMocmVxdWVzdCkpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBUcnkgYWdhaW4gdG8gdmVyaWZ5DQotICAgICAgICByZXF1ZXN0U291cmNlID0gZ2V0U291cmNlKHJlcXVlc3QpOw0KLSAgICAgICAgcmVzcG9uc2VTb3VyY2UgPSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdFNvdXJjZSk7DQotICAgICAgICByZXNwb25zZSA9IGdldFN0cmluZyhyZXNwb25zZVNvdXJjZSk7DQotICAgICAgICANCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UuY29udGFpbnMocmVxdWVzdCkpOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHlTdHJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJ0ZXN0OiAiICsgZ2V0TmFtZSgpKTsNCi0gICAgICAgIA0KLSAgICAgICAgRGlzcGF0Y2g8U291cmNlPiBkaXNwYXRjaCA9IGdldERpc3BhdGNoKCk7DQotICAgICAgICANCi0gICAgICAgIFN0cmluZyByZXF1ZXN0ID0gIiI7DQotICAgICAgICBTb3VyY2UgcmVxdWVzdFNvdXJjZSA9IGdldFNvdXJjZShyZXF1ZXN0KTsNCi0gICAgICAgIFNvdXJjZSByZXNwb25zZVNvdXJjZSA9IGRpc3BhdGNoLmludm9rZShyZXF1ZXN0U291cmNlKTsNCi0gICAgICAgIFN0cmluZyByZXNwb25zZSA9IGdldFN0cmluZyhyZXNwb25zZVNvdXJjZSk7DQotICAgICAgICANCi0gICAgICAgIC8vIFRoZSBjdXJyZW50IGJlbGllZiBpcyB0aGF0IHRoaXMgc2hvdWxkIHJldHVybiBhIG51bGwgaW5kaWNhdGluZw0KLSAgICAgICAgLy8gdGhlIG5vdGhpbmcgaXMgZWNobydlZCANCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UgPT0gbnVsbCk7DQotICAgICAgICANCi0gICAgICAgIC8vIFRyeSBhZ2FpbiB0byB2ZXJpZnkNCi0gICAgICAgIHJlcXVlc3RTb3VyY2UgPSBnZXRTb3VyY2UocmVxdWVzdCk7DQotICAgICAgICByZXNwb25zZVNvdXJjZSA9IGRpc3BhdGNoLmludm9rZShyZXF1ZXN0U291cmNlKTsNCi0gICAgICAgIHJlc3BvbnNlID0gZ2V0U3RyaW5nKHJlc3BvbnNlU291cmNlKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gVGhlIGN1cnJlbnQgYmVsaWVmIGlzIHRoYXQgdGhpcyBzaG91bGQgcmV0dXJuIGEgbnVsbCBpbmRpY2F0aW5nDQotICAgICAgICAvLyB0aGUgbm90aGluZyBpcyBlY2hvJ2VkIA0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZSA9PSBudWxsKTsNCi0gICAgICAgIA0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TnVsbFNvdXJjZSgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoInRlc3Q6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgDQotICAgICAgICBEaXNwYXRjaDxTb3VyY2U+IGRpc3BhdGNoID0gZ2V0RGlzcGF0Y2goKTsNCi0gICAgICAgIA0KLSAgICAgICAgU291cmNlIHJlc3BvbnNlU291cmNlID0gZGlzcGF0Y2guaW52b2tlKG51bGwpOw0KLSAgICAgICAgU3RyaW5nIHJlc3BvbnNlID0gZ2V0U3RyaW5nKHJlc3BvbnNlU291cmNlKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gVGhlIGN1cnJlbnQgYmVsaWVmIGlzIHRoYXQgdGhpcyBzaG91bGQgcmV0dXJuIGEgbnVsbCBpbmRpY2F0aW5nDQotICAgICAgICAvLyB0aGUgbm90aGluZyBpcyBlY2hvJ2VkIA0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZSA9PSBudWxsKTsNCi0gICAgICAgIA0KLSAgICAgICAgDQotICAgICAgICAvLyBUcnkgYWdhaW4gdG8gdmVyaWZ5DQotICAgICAgICByZXNwb25zZVNvdXJjZSA9IGRpc3BhdGNoLmludm9rZShudWxsKTsNCi0gICAgICAgIHJlc3BvbnNlID0gZ2V0U3RyaW5nKHJlc3BvbnNlU291cmNlKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gVGhlIGN1cnJlbnQgYmVsaWVmIGlzIHRoYXQgdGhpcyBzaG91bGQgcmV0dXJuIGEgbnVsbCBpbmRpY2F0aW5nDQotICAgICAgICAvLyB0aGUgbm90aGluZyBpcyBlY2hvJ2VkIA0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZSA9PSBudWxsKTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIHZvaWQgdGVzdEVtcHR5U291cmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygidGVzdDogIiArIGdldE5hbWUoKSk7DQotICAgICAgICANCi0gICAgICAgIERpc3BhdGNoPFNvdXJjZT4gZGlzcGF0Y2ggPSBnZXREaXNwYXRjaCgpOw0KLSAgICAgICAgDQotICAgICAgICBTb3VyY2UgcmVzcG9uc2VTb3VyY2UgPSBkaXNwYXRjaC5pbnZva2UobmV3IFN0cmVhbVNvdXJjZSgpKTsNCi0gICAgICAgIFN0cmluZyByZXNwb25zZSA9IGdldFN0cmluZyhyZXNwb25zZVNvdXJjZSk7DQotICAgICAgICANCi0gICAgICAgIC8vIFRoZSBjdXJyZW50IGJlbGllZiBpcyB0aGF0IHRoaXMgc2hvdWxkIHJldHVybiBhIG51bGwgaW5kaWNhdGluZw0KLSAgICAgICAgLy8gdGhlIG5vdGhpbmcgaXMgZWNobydlZCANCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UgPT0gbnVsbCk7DQotICAgICAgICANCi0gICAgICAgIA0KLSAgICAgICAgLy8gVHJ5IGFnYWluIHRvIHZlcmlmeQ0KLSAgICAgICAgcmVzcG9uc2VTb3VyY2UgPSBkaXNwYXRjaC5pbnZva2UobmV3IFN0cmVhbVNvdXJjZSgpKTsNCi0gICAgICAgIHJlc3BvbnNlID0gZ2V0U3RyaW5nKHJlc3BvbnNlU291cmNlKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gVGhlIGN1cnJlbnQgYmVsaWVmIGlzIHRoYXQgdGhpcyBzaG91bGQgcmV0dXJuIGEgbnVsbCBpbmRpY2F0aW5nDQotICAgICAgICAvLyB0aGUgbm90aGluZyBpcyBlY2hvJ2VkIA0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZSA9PSBudWxsKTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIHZvaWQgdGVzdE5vbk51bGxTdHJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJ0ZXN0OiAiICsgZ2V0TmFtZSgpKTsNCi0gICAgICAgIA0KLSAgICAgICAgRGlzcGF0Y2g8U291cmNlPiBkaXNwYXRjaCA9IGdldERpc3BhdGNoKCk7DQotICAgICAgICANCi0gICAgICAgIFN0cmluZyByZXF1ZXN0ID0gIm1peGVkQ29udGVudCI7DQotICAgICAgICBTb3VyY2UgcmVxdWVzdFNvdXJjZSA9IGdldFNvdXJjZShyZXF1ZXN0KTsNCi0gICAgICAgIFNvdXJjZSByZXNwb25zZVNvdXJjZSA9IGRpc3BhdGNoLmludm9rZShyZXF1ZXN0U291cmNlKTsNCi0gICAgICAgIFN0cmluZyByZXNwb25zZSA9IGdldFN0cmluZyhyZXNwb25zZVNvdXJjZSk7DQotICAgICAgICANCi0gICAgICAgIC8vIFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIGRvZXMgbm90IHNlbmQgdGhlIG1peGVkQ29udGVudCBvdmVyIHRoZSB3aXJlLCBzbyB0aGUNCi0gICAgICAgIC8vIGV4cGVjdGF0aW9uIGlzIHRoYXQgdGhlIGVjaG8nZCByZXNwb25zZSBpcyBudWxsDQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlID09IG51bGwpOw0KLSAgICAgICAgDQotICAgICAgICANCi0gICAgICAgIC8vIFRyeSBhZ2FpbiB0byB2ZXJpZnkNCi0gICAgICAgIHJlcXVlc3RTb3VyY2UgPSBnZXRTb3VyY2UocmVxdWVzdCk7DQotICAgICAgICByZXNwb25zZVNvdXJjZSA9IGRpc3BhdGNoLmludm9rZShyZXF1ZXN0U291cmNlKTsNCi0gICAgICAgIHJlc3BvbnNlID0gZ2V0U3RyaW5nKHJlc3BvbnNlU291cmNlKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gVGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gZG9lcyBub3Qgc2VuZCB0aGUgbWl4ZWRDb250ZW50IG92ZXIgdGhlIHdpcmUsIHNvIHRoZQ0KLSAgICAgICAgLy8gZXhwZWN0YXRpb24gaXMgdGhhdCB0aGUgZWNobydkIHJlc3BvbnNlIGlzIG51bGwNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UgPT0gbnVsbCk7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHRlc3RDb21tZW50U3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygidGVzdDogIiArIGdldE5hbWUoKSk7DQotICAgICAgICANCi0gICAgICAgIERpc3BhdGNoPFNvdXJjZT4gZGlzcGF0Y2ggPSBnZXREaXNwYXRjaCgpOw0KLSAgICAgICAgDQotICAgICAgICBTdHJpbmcgcmVxdWVzdCA9ICI8IS0tY29tbWVudC0tPiI7DQotICAgICAgICBTb3VyY2UgcmVxdWVzdFNvdXJjZSA9IGdldFNvdXJjZShyZXF1ZXN0KTsNCi0gICAgICAgIFNvdXJjZSByZXNwb25zZVNvdXJjZSA9IGRpc3BhdGNoLmludm9rZShyZXF1ZXN0U291cmNlKTsNCi0gICAgICAgIFN0cmluZyByZXNwb25zZSA9IGdldFN0cmluZyhyZXNwb25zZVNvdXJjZSk7DQotICAgICAgICAvLyBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBzZW5kIHRoZSBjb21tZW50IG92ZXIgdGhlIHdpcmUsIHNvIHRoZQ0KLSAgICAgICAgLy8gZXhwZWN0YXRpb24gaXMgdGhhdCB0aGUgZWNobydkIHJlc3BvbnNlIGlzIG51bGwNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UgPT0gbnVsbCk7DQotICAgICAgICANCi0gICAgICAgIA0KLSAgICAgICAgLy8gVHJ5IGFnYWluIHRvIHZlcmlmeQ0KLSAgICAgICAgcmVxdWVzdFNvdXJjZSA9IGdldFNvdXJjZShyZXF1ZXN0KTsNCi0gICAgICAgIHJlc3BvbnNlU291cmNlID0gZGlzcGF0Y2guaW52b2tlKHJlcXVlc3RTb3VyY2UpOw0KLSAgICAgICAgcmVzcG9uc2UgPSBnZXRTdHJpbmcocmVzcG9uc2VTb3VyY2UpOw0KLSAgICAgICAgLy8gVGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gZG9lcyBub3Qgc2VuZCB0aGUgY29tbWVudCBvdmVyIHRoZSB3aXJlLCBzbyB0aGUNCi0gICAgICAgIC8vIGV4cGVjdGF0aW9uIGlzIHRoYXQgdGhlIGVjaG8nZCByZXNwb25zZSBpcyBudWxsDQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlID09IG51bGwpOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VHdvRWxlbWVudHNTdHJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJ0ZXN0OiAiICsgZ2V0TmFtZSgpKTsNCi0gICAgICAgIA0KLSAgICAgICAgRGlzcGF0Y2g8U291cmNlPiBkaXNwYXRjaCA9IGdldERpc3BhdGNoKCk7DQotICAgICAgICANCi0gICAgICAgIFN0cmluZyByZXF1ZXN0ID0gIjxhPmhlbGxvPC9hPjxiPndvcmxkPC9iPiI7DQotICAgICAgICBTb3VyY2UgcmVxdWVzdFNvdXJjZSA9IGdldFNvdXJjZShyZXF1ZXN0KTsNCi0gICAgICAgIFNvdXJjZSByZXNwb25zZVNvdXJjZSA9IGRpc3BhdGNoLmludm9rZShyZXF1ZXN0U291cmNlKTsNCi0gICAgICAgIFN0cmluZyByZXNwb25zZSA9IGdldFN0cmluZyhyZXNwb25zZVNvdXJjZSk7DQotICAgICAgICANCi0gICAgICAgIC8vIFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW4gb25seSBzZW5kcyB0aGUgZmlyc3QgZWxlbWVudA0KLSAgICAgICAgLy8gU28gdGhlIGVjaG8nZCByZXNwb25zZSBpcyBqdXN0IHRoZSBmaXJzdCBvbmUuDQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlLmNvbnRhaW5zKCI8YT5oZWxsbzwvYT4iKSk7DQotICAgICAgICANCi0gICAgICAgIA0KLSAgICAgICAgLy8gVHJ5IGFnYWluIHRvIHZlcmlmeQ0KLSAgICAgICAgcmVxdWVzdFNvdXJjZSA9IGdldFNvdXJjZShyZXF1ZXN0KTsNCi0gICAgICAgIHJlc3BvbnNlU291cmNlID0gZGlzcGF0Y2guaW52b2tlKHJlcXVlc3RTb3VyY2UpOw0KLSAgICAgICAgcmVzcG9uc2UgPSBnZXRTdHJpbmcocmVzcG9uc2VTb3VyY2UpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGluIG9ubHkgc2VuZHMgdGhlIGZpcnN0IGVsZW1lbnQNCi0gICAgICAgIC8vIFNvIHRoZSBlY2hvJ2QgcmVzcG9uc2UgaXMganVzdCB0aGUgZmlyc3Qgb25lLg0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZS5jb250YWlucygiPGE+aGVsbG88L2E+IikpOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VHdvRWxlbWVudHNBbmRNaXhlZENvbnRlbnRTdHJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJ0ZXN0OiAiICsgZ2V0TmFtZSgpKTsNCi0gICAgICAgIA0KLSAgICAgICAgRGlzcGF0Y2g8U291cmNlPiBkaXNwYXRjaCA9IGdldERpc3BhdGNoKCk7DQotICAgICAgICANCi0gICAgICAgIFN0cmluZyByZXF1ZXN0ID0gIm1peGVkMTxhPmhlbGxvPC9hPm1peGVkMjxiPndvcmxkPC9iPm1peGVkMyI7DQotICAgICAgICBTb3VyY2UgcmVxdWVzdFNvdXJjZSA9IGdldFNvdXJjZShyZXF1ZXN0KTsNCi0gICAgICAgIFNvdXJjZSByZXNwb25zZVNvdXJjZSA9IGRpc3BhdGNoLmludm9rZShyZXF1ZXN0U291cmNlKTsNCi0gICAgICAgIFN0cmluZyByZXNwb25zZSA9IGdldFN0cmluZyhyZXNwb25zZVNvdXJjZSk7DQotICAgICAgICAvLyBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBvbmx5IHNlbmRzIHRoZSBmaXJzdCBlbGVtZW50Lg0KLSAgICAgICAgLy8gVGhlIG1peGVkIGNvbnRlbnQgKG1peGVkMSkgaW50ZXJmZXJlcyBhbmQgdGh1cyBub3RoaW5nIGlzIHNlbnQuDQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlID09IG51bGwpOw0KLSAgICAgICAgDQotICAgICAgICANCi0gICAgICAgIC8vIFRyeSBhZ2FpbiB0byB2ZXJpZnkNCi0gICAgICAgIHJlcXVlc3RTb3VyY2UgPSBnZXRTb3VyY2UocmVxdWVzdCk7DQotICAgICAgICByZXNwb25zZVNvdXJjZSA9IGRpc3BhdGNoLmludm9rZShyZXF1ZXN0U291cmNlKTsNCi0gICAgICAgIHJlc3BvbnNlID0gZ2V0U3RyaW5nKHJlc3BvbnNlU291cmNlKTsNCi0gICAgICAgIC8vIFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIG9ubHkgc2VuZHMgdGhlIGZpcnN0IGVsZW1lbnQuDQotICAgICAgICAvLyBUaGUgbWl4ZWQgY29udGVudCAobWl4ZWQxKSBpbnRlcmZlcmVzIGFuZCB0aHVzIG5vdGhpbmcgaXMgc2VudC4NCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UgPT0gbnVsbCk7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHRlc3RFeGNlcHRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJ0ZXN0OiAiICsgZ2V0TmFtZSgpKTsNCi0gICAgICAgIA0KLSAgICAgICAgRGlzcGF0Y2g8U291cmNlPiBkaXNwYXRjaCA9IGdldERpc3BhdGNoKCk7DQotICAgICAgICANCi0gICAgICAgIFN0cmluZyByZXF1ZXN0ID0gIjx0ZXN0PnRocm93V2ViU2VydmljZUV4Y2VwdGlvbjwvdGVzdD4iOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBTb3VyY2UgcmVxdWVzdFNvdXJjZSA9IGdldFNvdXJjZShyZXF1ZXN0KTsNCi0gICAgICAgICAgICBTb3VyY2UgcmVzcG9uc2VTb3VyY2UgPSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdFNvdXJjZSk7DQotICAgICAgICAgICAgU3RyaW5nIHJlc3BvbnNlID0gZ2V0U3RyaW5nKHJlc3BvbnNlU291cmNlKTsNCi0gICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBFeGNlcHRpb24iKTsNCi0gICAgICAgIH0gY2F0Y2ggKFNPQVBGYXVsdEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgU09BUEZhdWx0IHNmID0gZS5nZXRGYXVsdCgpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUoc2YuZ2V0RmF1bHRTdHJpbmcoKS5lcXVhbHMoInByb3ZpZGVyIikpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICAvLyBUcnkgYWdhaW4gdG8gdmVyaWZ5DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIFNvdXJjZSByZXF1ZXN0U291cmNlID0gZ2V0U291cmNlKHJlcXVlc3QpOw0KLSAgICAgICAgICAgIFNvdXJjZSByZXNwb25zZVNvdXJjZSA9IGRpc3BhdGNoLmludm9rZShyZXF1ZXN0U291cmNlKTsNCi0gICAgICAgICAgICBTdHJpbmcgcmVzcG9uc2UgPSBnZXRTdHJpbmcocmVzcG9uc2VTb3VyY2UpOw0KLSAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIEV4Y2VwdGlvbiIpOw0KLSAgICAgICAgfSBjYXRjaCAoU09BUEZhdWx0RXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBTT0FQRmF1bHQgc2YgPSBlLmdldEZhdWx0KCk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzZi5nZXRGYXVsdFN0cmluZygpLmVxdWFscygicHJvdmlkZXIiKSk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHRlc3RVc2VyR2VuZXJhdGVkU09BUEZhdWx0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJ0ZXN0OiAiICsgZ2V0TmFtZSgpKTsNCi0gICAgICAgIA0KLSAgICAgICAgRGlzcGF0Y2g8U291cmNlPiBkaXNwYXRjaCA9IGdldERpc3BhdGNoKCk7DQotICAgICAgICBTdHJpbmcgcmVxdWVzdCA9ICI8dGVzdD50aHJvd1VzZXJHZW5lcmF0ZWRGYXVsdDwvdGVzdD4iOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBTb3VyY2UgcmVxdWVzdFNvdXJjZSA9IGdldFNvdXJjZShyZXF1ZXN0KTsNCi0gICAgICAgICAgICBTb3VyY2UgcmVzcG9uc2VTb3VyY2UgPSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdFNvdXJjZSk7DQotICAgICAgICAgICAgU3RyaW5nIHJlc3BvbnNlID0gZ2V0U3RyaW5nKHJlc3BvbnNlU291cmNlKTsNCi0gICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBFeGNlcHRpb24iKTsNCi0gICAgICAgIH0gY2F0Y2ggKFNPQVBGYXVsdEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgU09BUEZhdWx0IHNmID0gZS5nZXRGYXVsdCgpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUoc2YuZ2V0RmF1bHRTdHJpbmcoKS5lcXVhbHMoInVzZXJHZW5lcmF0ZWRGYXVsdFRlc3QiKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHRlc3RQcm92aWRlclNvdXJjZSgpew0KLSAgICAgICAgdHJ5ew0KLSAgICAgICAgICAgIFN0cmluZyByZXNvdXJjZURpciA9IG5ldyBGaWxlKHByb3ZpZGVyUmVzb3VyY2VEaXIsIHhtbERpcikuZ2V0QWJzb2x1dGVQYXRoKCk7DQotICAgICAgICAgICAgU3RyaW5nIGZpbGVOYW1lID0gcmVzb3VyY2VEaXIrRmlsZS5zZXBhcmF0b3IrIndlYi54bWwiOw0KLQ0KLSAgICAgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGZpbGVOYW1lKTsNCi0gICAgICAgICAgICBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSk7DQotICAgICAgICAgICAgU3RyZWFtU291cmNlIHhtbFN0cmVhbVNvdXJjZSA9IG5ldyBTdHJlYW1Tb3VyY2UoaW5wdXRTdHJlYW0pOw0KLQ0KLSAgICAgICAgICAgIFNlcnZpY2Ugc3ZjID0gU2VydmljZS5jcmVhdGUoc2VydmljZU5hbWUpOw0KLSAgICAgICAgICAgIHN2Yy5hZGRQb3J0KHBvcnROYW1lLG51bGwsIGVuZHBvaW50VXJsKTsNCi0gICAgICAgICAgICBEaXNwYXRjaDxTb3VyY2U+IGRpc3BhdGNoID0gc3ZjLmNyZWF0ZURpc3BhdGNoKHBvcnROYW1lLCBTb3VyY2UuY2xhc3MsIG51bGwpOw0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBJbnZva2luZyBTb3VyY2UgUHJvdmlkZXIgRGlzcGF0Y2giKTsNCi0gICAgICAgICAgICBTb3VyY2UgcmVzcG9uc2UgPSBkaXNwYXRjaC5pbnZva2UoeG1sU3RyZWFtU291cmNlKTsNCi0NCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gUmVzcG9uc2UgWyIgKyByZXNwb25zZS50b1N0cmluZygpICsgIl0iKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBUcnkgYWdhaW4gdG8gdmVyaWZ5DQotICAgICAgICAgICAgaW5wdXRTdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpOw0KLSAgICAgICAgICAgIHhtbFN0cmVhbVNvdXJjZSA9IG5ldyBTdHJlYW1Tb3VyY2UoaW5wdXRTdHJlYW0pOw0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBJbnZva2luZyBTb3VyY2UgUHJvdmlkZXIgRGlzcGF0Y2giKTsNCi0gICAgICAgICAgICByZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZSh4bWxTdHJlYW1Tb3VyY2UpOw0KLQ0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBSZXNwb25zZSBbIiArIHJlc3BvbnNlLnRvU3RyaW5nKCkgKyAiXSIpOw0KLQ0KLSAgICAgICAgfWNhdGNoKEV4Y2VwdGlvbiBlKXsNCi0gICAgICAgIAllLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgICAgIGZhaWwoIkNhdWdodCBleGNlcHRpb24gIiArIGUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyL1N0cmluZ01lc3NhZ2VQcm92aWRlclRlc3RzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvU3RyaW5nTWVzc2FnZVByb3ZpZGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA5M2E1Yy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvU3RyaW5nTWVzc2FnZVByb3ZpZGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJvdmlkZXI7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLlRlc3RMb2dnZXI7DQotDQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5EaXNwYXRjaDsNCi1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7DQotDQotcHVibGljIGNsYXNzIFN0cmluZ01lc3NhZ2VQcm92aWRlclRlc3RzIGV4dGVuZHMgUHJvdmlkZXJUZXN0Q2FzZSB7DQotDQotICAgIFN0cmluZyBlbmRwb2ludFVybCA9ICJodHRwOi8vbG9jYWxob3N0OjYwNjAvYXhpczIvc2VydmljZXMvU3RyaW5nTWVzc2FnZVByb3ZpZGVyU2VydmljZS5TdHJpbmdNZXNzYWdlUHJvdmlkZXJQb3J0IjsNCi0gICAgU3RyaW5nIHhtbFN0cmluZyA9ICI8dGVzdD50ZXN0IGlucHV0PC90ZXN0PiI7DQotICAgIHByaXZhdGUgUU5hbWUgc2VydmljZU5hbWUgPSBuZXcgUU5hbWUoImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyIiwgIlN0cmluZ01lc3NhZ2VQcm92aWRlclNlcnZpY2UiKTsNCi0NCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgew0KLSAgICAgICAgcmV0dXJuIGdldFRlc3RTZXR1cChuZXcgVGVzdFN1aXRlKFN0cmluZ01lc3NhZ2VQcm92aWRlclRlc3RzLmNsYXNzKSk7DQotICAgIH0NCi0gICAgICAgIA0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvdmlkZXJTdHJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJ0ZXN0OiAiICsgZ2V0TmFtZSgpKTsNCi0gICAgICAgIA0KLSAgICAgICAgU2VydmljZSBzdmMgPSBTZXJ2aWNlLmNyZWF0ZShzZXJ2aWNlTmFtZSk7DQotICAgICAgICBzdmMuYWRkUG9ydChwb3J0TmFtZSwgbnVsbCwgZW5kcG9pbnRVcmwpOw0KLSAgICAgICAgDQotICAgICAgICBEaXNwYXRjaDxTdHJpbmc+IGRpc3BhdGNoID0gc3ZjDQotICAgICAgICAgICAgICAgIC5jcmVhdGVEaXNwYXRjaChwb3J0TmFtZSwgU3RyaW5nLmNsYXNzLCBTZXJ2aWNlLk1vZGUuUEFZTE9BRCk7DQotDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gSW52b2tpbmcgRGlzcGF0Y2g8U3RyaW5nPiBTdHJpbmdNZXNzYWdlUHJvdmlkZXJTZXJ2aWNlIik7DQotICAgICAgICBTdHJpbmcgcmV0VmFsID0gZGlzcGF0Y2guaW52b2tlKHhtbFN0cmluZyk7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gUmVzcG9uc2UgWyIgKyByZXRWYWwgKyAiXSIpOw0KLSAgICAgICAgDQotICAgICAgICANCi0gICAgICAgIC8vIFRyeSBhZ2FpbiB0byB2ZXJpZnkNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBJbnZva2luZyBEaXNwYXRjaDxTdHJpbmc+IFN0cmluZ01lc3NhZ2VQcm92aWRlclNlcnZpY2UiKTsNCi0gICAgICAgIHJldFZhbCA9IGRpc3BhdGNoLmludm9rZSh4bWxTdHJpbmcpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IFJlc3BvbnNlIFsiICsgcmV0VmFsICsgIl0iKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvU3RyaW5nUHJvdmlkZXJUZXN0cy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyL1N0cmluZ1Byb3ZpZGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzEwNDJmZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvU3RyaW5nUHJvdmlkZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJvdmlkZXI7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLlRlc3RMb2dnZXI7DQotDQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBGYXVsdDsNCi1pbXBvcnQgamF2YXgueG1sLndzLkJpbmRpbmdQcm92aWRlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLkRpc3BhdGNoOw0KLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuU09BUEZhdWx0RXhjZXB0aW9uOw0KLQ0KLXB1YmxpYyBjbGFzcyBTdHJpbmdQcm92aWRlclRlc3RzIGV4dGVuZHMgUHJvdmlkZXJUZXN0Q2FzZSB7DQotDQotICAgIFN0cmluZyBlbmRwb2ludFVybCA9ICJodHRwOi8vbG9jYWxob3N0OjYwNjAvYXhpczIvc2VydmljZXMvU3RyaW5nUHJvdmlkZXJTZXJ2aWNlLlN0cmluZ1Byb3ZpZGVyUG9ydCI7DQotICAgIFN0cmluZyB4bWxTdHJpbmcgPSAiPGludm9rZT50ZXN0IGlucHV0PC9pbnZva2U+IjsNCi0gICAgcHJpdmF0ZSBRTmFtZSBzZXJ2aWNlTmFtZSA9IG5ldyBRTmFtZSgiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIiLCAiU3RyaW5nUHJvdmlkZXJTZXJ2aWNlIik7DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsNCi0gICAgICAgIHJldHVybiBnZXRUZXN0U2V0dXAobmV3IFRlc3RTdWl0ZShTdHJpbmdQcm92aWRlclRlc3RzLmNsYXNzKSk7DQotICAgIH0NCi0gICAgICAgIA0KLSAgICBwcml2YXRlIERpc3BhdGNoPFN0cmluZz4gZ2V0RGlzcGF0Y2goKSB7DQotICAgICAgICBTZXJ2aWNlIHN2YyA9IFNlcnZpY2UuY3JlYXRlKHNlcnZpY2VOYW1lKTsNCi0gICAgICAgIHN2Yy5hZGRQb3J0KHBvcnROYW1lLCBudWxsLCBlbmRwb2ludFVybCk7DQotICAgICAgICANCi0gICAgICAgIERpc3BhdGNoPFN0cmluZz4gZGlzcGF0Y2ggPSBzdmMNCi0gICAgICAgICAgICAgICAgLmNyZWF0ZURpc3BhdGNoKHBvcnROYW1lLCBTdHJpbmcuY2xhc3MsIFNlcnZpY2UuTW9kZS5QQVlMT0FEKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gRm9yY2Ugc29hcCBhY3Rpb24gYmVjYXVzZSB3ZSBhcmUgcGFzc2luZyBqdW5rIG92ZXIgdGhlIHdpcmUNCi0gICAgICAgIGRpc3BhdGNoLmdldFJlcXVlc3RDb250ZXh0KCkucHV0KEJpbmRpbmdQcm92aWRlci5TT0FQQUNUSU9OX1VTRV9QUk9QRVJUWSwgQm9vbGVhbi5UUlVFKTsNCi0gICAgICAgIGRpc3BhdGNoLmdldFJlcXVlc3RDb250ZXh0KCkucHV0KEJpbmRpbmdQcm92aWRlci5TT0FQQUNUSU9OX1VSSV9QUk9QRVJUWSwiaHR0cDovL3N0cmluZ3Byb3ZpZGVyLnNhbXBsZS50ZXN0Lm9yZy9lY2hvU3RyaW5nIik7DQotICAgICAgICANCi0gICAgICAgIHJldHVybiBkaXNwYXRjaDsNCi0gICAgICAgIA0KLSAgICB9DQotICAgIHB1YmxpYyB2b2lkIHRlc3ROb3JtYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJ0ZXN0OiAiICsgZ2V0TmFtZSgpKTsNCi0gICAgICAgIA0KLSAgICAgICAgRGlzcGF0Y2g8U3RyaW5nPiBkaXNwYXRjaCA9IGdldERpc3BhdGNoKCk7DQotICAgICAgICANCi0gICAgICAgIFN0cmluZyByZXF1ZXN0ID0gIjxpbnZva2U+aGVsbG8gd29ybGQ8L2ludm9rZT4iOw0KLSAgICAgICAgU3RyaW5nIHJlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXF1ZXN0LmVxdWFscyhyZXNwb25zZSkpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBUcnkgYWdhaW4gdG8gdmVyaWZ5DQotICAgICAgICByZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0gICAgICAgIGFzc2VydFRydWUocmVxdWVzdC5lcXVhbHMocmVzcG9uc2UpKTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIHZvaWQgdGVzdEVtcHR5U3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygidGVzdDogIiArIGdldE5hbWUoKSk7DQotICAgICAgICANCi0gICAgICAgIERpc3BhdGNoPFN0cmluZz4gZGlzcGF0Y2ggPSBnZXREaXNwYXRjaCgpOw0KLSAgICAgICAgDQotICAgICAgICBTdHJpbmcgcmVxdWVzdCA9ICIiOw0KLSAgICAgICAgU3RyaW5nIHJlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBUaGUgY3VycmVudCBiZWxpZWYgaXMgdGhhdCB0aGlzIHNob3VsZCByZXR1cm4gYSBudWxsIGluZGljYXRpbmcNCi0gICAgICAgIC8vIHRoZSBub3RoaW5nIGlzIGVjaG8nZWQgDQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlID09IG51bGwpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBUcnkgYWdhaW4gdG8gdmVyaWZ5DQotICAgICAgICByZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gVGhlIGN1cnJlbnQgYmVsaWVmIGlzIHRoYXQgdGhpcyBzaG91bGQgcmV0dXJuIGEgbnVsbCBpbmRpY2F0aW5nDQotICAgICAgICAvLyB0aGUgbm90aGluZyBpcyBlY2hvJ2VkIA0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZSA9PSBudWxsKTsNCi0gICAgICAgDQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHRlc3ROdWxsU3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygidGVzdDogIiArIGdldE5hbWUoKSk7DQotICAgICAgICANCi0gICAgICAgIERpc3BhdGNoPFN0cmluZz4gZGlzcGF0Y2ggPSBnZXREaXNwYXRjaCgpOw0KLSAgICAgICAgDQotICAgICAgICBTdHJpbmcgcmVxdWVzdCA9IG51bGw7DQotICAgICAgICBTdHJpbmcgcmVzcG9uc2UgPSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7DQotICAgICAgICANCi0gICAgICAgIC8vIFRoZSBjdXJyZW50IGJlbGllZiBpcyB0aGF0IHRoaXMgc2hvdWxkIHJldHVybiBhIG51bGwgaW5kaWNhdGluZw0KLSAgICAgICAgLy8gdGhlIG5vdGhpbmcgaXMgZWNobydlZCANCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UgPT0gbnVsbCk7DQotICAgICAgICANCi0gICAgICAgIC8vIFRyeSBhZ2FpbiB0byB2ZXJpZnkNCi0gICAgICAgIHJlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBUaGUgY3VycmVudCBiZWxpZWYgaXMgdGhhdCB0aGlzIHNob3VsZCByZXR1cm4gYSBudWxsIGluZGljYXRpbmcNCi0gICAgICAgIC8vIHRoZSBub3RoaW5nIGlzIGVjaG8nZWQgDQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlID09IG51bGwpOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9uTnVsbFN0cmluZygpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoInRlc3Q6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgDQotICAgICAgICBEaXNwYXRjaDxTdHJpbmc+IGRpc3BhdGNoID0gZ2V0RGlzcGF0Y2goKTsNCi0gICAgICAgIA0KLSAgICAgICAgU3RyaW5nIHJlcXVlc3QgPSAibWl4ZWRDb250ZW50IjsNCi0gICAgICAgIFN0cmluZyByZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gVGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gZG9lcyBub3Qgc2VuZCB0aGUgbWl4ZWRDb250ZW50IG92ZXIgdGhlIHdpcmUsIHNvIHRoZQ0KLSAgICAgICAgLy8gZXhwZWN0YXRpb24gaXMgdGhhdCB0aGUgZWNobydkIHJlc3BvbnNlIGlzIG51bGwNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UgPT0gbnVsbCk7DQotICAgICAgICANCi0gICAgICAgIC8vIFRyeSBhZ2FpbiB0byB2ZXJpZmlmeQ0KLSAgICAgICAgcmVzcG9uc2UgPSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7DQotICAgICAgICANCi0gICAgICAgIC8vIFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIGRvZXMgbm90IHNlbmQgdGhlIG1peGVkQ29udGVudCBvdmVyIHRoZSB3aXJlLCBzbyB0aGUNCi0gICAgICAgIC8vIGV4cGVjdGF0aW9uIGlzIHRoYXQgdGhlIGVjaG8nZCByZXNwb25zZSBpcyBudWxsDQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlID09IG51bGwpOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tbWVudFN0cmluZygpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoInRlc3Q6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgDQotICAgICAgICBEaXNwYXRjaDxTdHJpbmc+IGRpc3BhdGNoID0gZ2V0RGlzcGF0Y2goKTsNCi0gICAgICAgIA0KLSAgICAgICAgU3RyaW5nIHJlcXVlc3QgPSAiPCEtLWNvbW1lbnQtLT4iOw0KLSAgICAgICAgU3RyaW5nIHJlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLSAgICAgICAgLy8gVGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gZG9lcyBub3Qgc2VuZCB0aGUgY29tbWVudCBvdmVyIHRoZSB3aXJlLCBzbyB0aGUNCi0gICAgICAgIC8vIGV4cGVjdGF0aW9uIGlzIHRoYXQgdGhlIGVjaG8nZCByZXNwb25zZSBpcyBudWxsDQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlID09IG51bGwpOw0KLSAgICAgICAgDQotICAgICAgICANCi0gICAgICAgIC8vIFRyeSBhZ2FpbiB0byB2ZXJpZnkNCi0gICAgICAgIHJlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLSAgICAgICAgLy8gVGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gZG9lcyBub3Qgc2VuZCB0aGUgY29tbWVudCBvdmVyIHRoZSB3aXJlLCBzbyB0aGUNCi0gICAgICAgIC8vIGV4cGVjdGF0aW9uIGlzIHRoYXQgdGhlIGVjaG8nZCByZXNwb25zZSBpcyBudWxsDQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlID09IG51bGwpOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VHdvRWxlbWVudHNTdHJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJ0ZXN0OiAiICsgZ2V0TmFtZSgpKTsNCi0gICAgICAgIA0KLSAgICAgICAgRGlzcGF0Y2g8U3RyaW5nPiBkaXNwYXRjaCA9IGdldERpc3BhdGNoKCk7DQotICAgICAgICANCi0gICAgICAgIFN0cmluZyByZXF1ZXN0ID0gIjxhPmhlbGxvPC9hPjxiPndvcmxkPC9iPiI7DQotICAgICAgICBTdHJpbmcgcmVzcG9uc2UgPSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7DQotICAgICAgICANCi0gICAgICAgIC8vIFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW4gb25seSBzZW5kcyB0aGUgZmlyc3QgZWxlbWVudA0KLSAgICAgICAgLy8gU28gdGhlIGVjaG8nZCByZXNwb25zZSBpcyBqdXN0IHRoZSBmaXJzdCBvbmUuDQotICAgICAgICBhc3NlcnRUcnVlKCI8YT5oZWxsbzwvYT4iLmVxdWFscyhyZXNwb25zZSkpOw0KLSAgICAgICAgDQotICAgICAgICANCi0gICAgICAgIC8vIFRyeSBhZ2FpbiB0byB2ZXJpZnkNCi0gICAgICAgIHJlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGluIG9ubHkgc2VuZHMgdGhlIGZpcnN0IGVsZW1lbnQNCi0gICAgICAgIC8vIFNvIHRoZSBlY2hvJ2QgcmVzcG9uc2UgaXMganVzdCB0aGUgZmlyc3Qgb25lLg0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiPGE+aGVsbG88L2E+Ii5lcXVhbHMocmVzcG9uc2UpKTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIHZvaWQgdGVzdFR3b0VsZW1lbnRzQW5kTWl4ZWRDb250ZW50U3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygidGVzdDogIiArIGdldE5hbWUoKSk7DQotICAgICAgICANCi0gICAgICAgIERpc3BhdGNoPFN0cmluZz4gZGlzcGF0Y2ggPSBnZXREaXNwYXRjaCgpOw0KLSAgICAgICAgDQotICAgICAgICBTdHJpbmcgcmVxdWVzdCA9ICJtaXhlZDE8YT5oZWxsbzwvYT5taXhlZDI8Yj53b3JsZDwvYj5taXhlZDMiOw0KLSAgICAgICAgU3RyaW5nIHJlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLSAgICAgICAgLy8gVGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gb25seSBzZW5kcyB0aGUgZmlyc3QgZWxlbWVudC4NCi0gICAgICAgIC8vIFRoZSBtaXhlZCBjb250ZW50IChtaXhlZDEpIGludGVyZmVyZXMgYW5kIHRodXMgbm90aGluZyBpcyBzZW50Lg0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZSA9PSBudWxsKTsNCi0gICAgICAgIA0KLSAgICAgICAgDQotICAgICAgICAvLyBUcnkgYWdhaW4gdG8gdmVyaWZ5DQotICAgICAgICByZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0gICAgICAgIC8vIFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIG9ubHkgc2VuZHMgdGhlIGZpcnN0IGVsZW1lbnQuDQotICAgICAgICAvLyBUaGUgbWl4ZWQgY29udGVudCAobWl4ZWQxKSBpbnRlcmZlcmVzIGFuZCB0aHVzIG5vdGhpbmcgaXMgc2VudC4NCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UgPT0gbnVsbCk7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHRlc3RFeGNlcHRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJ0ZXN0OiAiICsgZ2V0TmFtZSgpKTsNCi0gICAgICAgIA0KLSAgICAgICAgRGlzcGF0Y2g8U3RyaW5nPiBkaXNwYXRjaCA9IGdldERpc3BhdGNoKCk7DQotICAgICAgICANCi0gICAgICAgIFN0cmluZyByZXF1ZXN0ID0gIjxpbnZva2U+dGhyb3dXZWJTZXJ2aWNlRXhjZXB0aW9uPC9pbnZva2U+IjsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgU3RyaW5nIHJlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLSAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIEV4Y2VwdGlvbiIpOw0KLSAgICAgICAgfSBjYXRjaCAoU09BUEZhdWx0RXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBTT0FQRmF1bHQgc2YgPSBlLmdldEZhdWx0KCk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzZi5nZXRGYXVsdFN0cmluZygpLmVxdWFscygicHJvdmlkZXIiKSk7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIC8vIFRyeSBhZ2FpbiB0byB2ZXJpZnkNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgU3RyaW5nIHJlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLSAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIEV4Y2VwdGlvbiIpOw0KLSAgICAgICAgfSBjYXRjaCAoU09BUEZhdWx0RXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBTT0FQRmF1bHQgc2YgPSBlLmdldEZhdWx0KCk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzZi5nZXRGYXVsdFN0cmluZygpLmVxdWFscygicHJvdmlkZXIiKSk7DQotICAgICAgICB9DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyL2FkZHJlc3NpbmcvQWRkcmVzc2luZ1Byb3ZpZGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvYWRkcmVzc2luZy9BZGRyZXNzaW5nUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdhOTU2ZC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvYWRkcmVzc2luZy9BZGRyZXNzaW5nUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm92aWRlci5hZGRyZXNzaW5nOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLk1lc3NhZ2VGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBNZXNzYWdlOwotaW1wb3J0IGphdmF4LnhtbC53cy5CaW5kaW5nVHlwZTsKLWltcG9ydCBqYXZheC54bWwud3MuUHJvdmlkZXI7Ci1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7Ci1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2VNb2RlOwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlUHJvdmlkZXI7Ci1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuQWRkcmVzc2luZzsKLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5TT0FQQmluZGluZzsKLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5TT0FQRmF1bHRFeGNlcHRpb247Ci0KLUBXZWJTZXJ2aWNlUHJvdmlkZXIoc2VydmljZU5hbWU9IkFkZHJlc3NpbmdQcm92aWRlclNlcnZpY2UiLAotCQkgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vYWRkcmVzc2luZy5wcm92aWRlci5qYXh3cy5heGlzMi5hcGFjaGUub3JnIiwKLQkJICAgIHdzZGxMb2NhdGlvbj0iTUVUQS1JTkYvQWRkcmVzc2luZ1Byb3ZpZGVyLndzZGwiLAotCQkgICAgcG9ydE5hbWU9IkFkZHJlc3NpbmdQcm92aWRlclBvcnQiKQotQEJpbmRpbmdUeXBlKFNPQVBCaW5kaW5nLlNPQVAxMUhUVFBfQklORElORykKLUBBZGRyZXNzaW5nKGVuYWJsZWQ9dHJ1ZSkKLUBTZXJ2aWNlTW9kZSh2YWx1ZT1TZXJ2aWNlLk1vZGUuTUVTU0FHRSkKLXB1YmxpYyBjbGFzcyBBZGRyZXNzaW5nUHJvdmlkZXIgaW1wbGVtZW50cyBQcm92aWRlcjxTT0FQTWVzc2FnZT4gewotICAgICAgCi0gICAgU3RyaW5nIHJlc3BvbnNlTXNnU3RhcnQgPSAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+PHNvYXBlbnY6RW52ZWxvcGUgeG1sbnM6c29hcGVudj1cImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvXCI+PHNvYXBlbnY6SGVhZGVyLz48c29hcGVudjpCb2R5PiI7Ci0gICAgU3RyaW5nIHJlc3BvbnNlTXNnRW5kID0gIjwvc29hcGVudjpCb2R5Pjwvc29hcGVudjpFbnZlbG9wZT4iOyAgIAotICAgIFN0cmluZyBYTUxfUkVUVVJOID0gIjxuczI6b3V0TWVzc2FnZSB4bWxuczpuczI9XCJodHRwOi8vYWRkcmVzc2luZy5wcm92aWRlci5qYXh3cy5heGlzMi5hcGFjaGUub3JnXCI+SGVsbG8gUmVzcG9uc2U8L25zMjpvdXRNZXNzYWdlPiI7Ci0gICAgIAotICAgIHB1YmxpYyBTT0FQTWVzc2FnZSBpbnZva2UoU09BUE1lc3NhZ2Ugc29hcE1lc3NhZ2UpIHRocm93cyBTT0FQRmF1bHRFeGNlcHRpb24gewotICAgIAl0cnkgewotICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkgZmFjdG9yeSA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICBTdHJpbmcgcmVzcG9uc2VYTUwgPSByZXNwb25zZU1zZ1N0YXJ0ICsgWE1MX1JFVFVSTiArIHJlc3BvbnNlTXNnRW5kOwotICAgICAgICAgICAgU09BUE1lc3NhZ2UgcmVzcG9uc2UgPSBmYWN0b3J5LmNyZWF0ZU1lc3NhZ2UobnVsbCwgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHJlc3BvbnNlWE1MLmdldEJ5dGVzKCkpKTsKLQotICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlOwotICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKXsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgCX0KLSAgICAJcmV0dXJuIG51bGw7Ci0gICAgfSAgIAotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyL2FkZHJlc3NpbmcvTUVUQS1JTkYvQWRkcmVzc2luZ1Byb3ZpZGVyLndzZGwgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvYWRkcmVzc2luZy9NRVRBLUlORi9BZGRyZXNzaW5nUHJvdmlkZXIud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRhMDcxNC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvYWRkcmVzc2luZy9NRVRBLUlORi9BZGRyZXNzaW5nUHJvdmlkZXIud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTwhLS0KLS0tPgotCi08ZGVmaW5pdGlvbnMgeG1sbnM6aHR0cD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9odHRwLyIgCi0gICAgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIgCi0gICAgeG1sbnM6cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIAotICAgIHhtbG5zOnRucz0iaHR0cDovL2FkZHJlc3NpbmcucHJvdmlkZXIuamF4d3MuYXhpczIuYXBhY2hlLm9yZyIKLSAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9hZGRyZXNzaW5nLnByb3ZpZGVyLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciCi0gICAgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLSAgPHR5cGVzPgotICAgICAJPHhzZDpzY2hlbWEKLQkJCXRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2FkZHJlc3NpbmcucHJvdmlkZXIuamF4d3MuYXhpczIuYXBhY2hlLm9yZyIKLQkJCXhtbG5zOnRucz0iaHR0cDovL2FkZHJlc3NpbmcucHJvdmlkZXIuamF4d3MuYXhpczIuYXBhY2hlLm9yZyIKLQkJCXhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPgotCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iaW5NZXNzYWdlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotCQkJPHhzZDplbGVtZW50IG5hbWU9Im91dE1lc3NhZ2UiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0JPC94c2Q6c2NoZW1hPgotICAgIAotCi0gIDwvdHlwZXM+Ci0gICAKLSAgPG1lc3NhZ2UgbmFtZT0iaW5NZXNzYWdlIj4KLSAgICA8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJ0bnM6aW5NZXNzYWdlIiAvPgotICA8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIG5hbWU9Im91dE1lc3NhZ2UiPgotICAgIDxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9InRuczpvdXRNZXNzYWdlIiAvPgotICA8L21lc3NhZ2U+Ci0KLSAgPHBvcnRUeXBlIG5hbWU9IkFkZHJlc3NpbmdQcm92aWRlckludGVyZmFjZSI+Ci0gICAgPG9wZXJhdGlvbiBuYW1lPSJoZWxsbyI+Ci0gICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmluTWVzc2FnZSIgbmFtZT0iSW4iIC8+Ci0gICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczpvdXRNZXNzYWdlIiBuYW1lPSJPdXQiIC8+Ci0gICAgPC9vcGVyYXRpb24+ICAKLSAgPC9wb3J0VHlwZT4KLQotICA8YmluZGluZyBuYW1lPSJBZGRyZXNzaW5nUHJvdmlkZXJCaW5kaW5nIiB0eXBlPSJ0bnM6QWRkcmVzc2luZ1Byb3ZpZGVySW50ZXJmYWNlIj4KLSAgICA8c29hcDpiaW5kaW5nIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIiBzdHlsZT0iZG9jdW1lbnQiIC8+Ci0gICAgPG9wZXJhdGlvbiBuYW1lPSJoZWxsbyI+Ci0gICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIiBzdHlsZT0iZG9jdW1lbnQiIC8+Ci0gICAgICA8aW5wdXQ+Ci0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotICAgICAgPC9pbnB1dD4KLSAgICAgIDxvdXRwdXQ+Ci0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotICAgICAgPC9vdXRwdXQ+Ci0gICAgPC9vcGVyYXRpb24+Ci0gIDwvYmluZGluZz4KLQotICA8c2VydmljZSBuYW1lPSJBZGRyZXNzaW5nUHJvdmlkZXJTZXJ2aWNlIj4KLSAgICA8cG9ydCBuYW1lPSJBZGRyZXNzaW5nUHJvdmlkZXJQb3J0IiBiaW5kaW5nPSJ0bnM6QWRkcmVzc2luZ1Byb3ZpZGVyQmluZGluZyI+Ci0gICAgICA8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjYwNjAvYXhpczIvc2VydmljZXMvQWRkcmVzc2luZ1Byb3ZpZGVyU2VydmljZSIgLz4KLSAgICA8L3BvcnQ+Ci0gIDwvc2VydmljZT4KLQotPC9kZWZpbml0aW9ucz4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9hZGRyZXNzaW5nL01FVEEtSU5GL01BTklGRVNULk1GIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyL2FkZHJlc3NpbmcvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0OGYxYmQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyL2FkZHJlc3NpbmcvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvamF4Yi9KQVhCUHJvdmlkZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9qYXhiL0pBWEJQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTc3NGQ5Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9qYXhiL0pBWEJQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm92aWRlci5qYXhiOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLlRlc3RMb2dnZXI7DQotaW1wb3J0IG9yZy50ZXN0Lm10b20uT2JqZWN0RmFjdG9yeTsNCi1pbXBvcnQgb3JnLnRlc3QubXRvbS5TZW5kSW1hZ2U7DQotaW1wb3J0IG9yZy50ZXN0Lm10b20uU2VuZEltYWdlUmVzcG9uc2U7DQotDQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJDb250ZXh0Ow0KLWltcG9ydCBqYXZheC54bWwuYmluZC5NYXJzaGFsbGVyOw0KLWltcG9ydCBqYXZheC54bWwuYmluZC5Vbm1hcnNoYWxsZXI7DQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOw0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1Tb3VyY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5CaW5kaW5nVHlwZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLlByb3ZpZGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZVByb3ZpZGVyOw0KLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5TT0FQQmluZGluZzsNCi1pbXBvcnQgamF2YXgueG1sLndzLmh0dHAuSFRUUEJpbmRpbmc7DQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07DQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOw0KLQ0KLS8qKg0KLSAqIEEgSkFYV1MgU291cmNlIFByb3ZpZGVyIGltcGxlbWVudGF0aW9uDQotICoNCi0gKi8NCi1AV2ViU2VydmljZVByb3ZpZGVyKHNlcnZpY2VOYW1lPSJKQVhCUHJvdmlkZXJTZXJ2aWNlIikNCi1AQmluZGluZ1R5cGUoU09BUEJpbmRpbmcuU09BUDExSFRUUF9CSU5ESU5HKQ0KLXB1YmxpYyBjbGFzcyBKQVhCUHJvdmlkZXIgaW1wbGVtZW50cyBQcm92aWRlcjxTb3VyY2U+IHsNCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBSZXF1aXJlZCBpbXBsIG1ldGhvZCBmcm9tIGphdmF4LnhtbC53cy5Qcm92aWRlciBpbnRlcmZhY2UNCi0gICAgICogQHBhcmFtIG9iag0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqLw0KLSAgICBwdWJsaWMgU291cmNlIGludm9rZShTb3VyY2Ugb2JqKSB7DQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIj4+IEpBWEIgUHJvdmlkZXIgU2VydmljZTogUmVxdWVzdCByZWNlaXZlZC4iKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBKQVhCIFByb3ZpZGVyIFNlcnZpY2U6IFJlcXVlc3QgcmVjZWl2ZWQuXG4iKTsNCi0gICAgICAgIFNlbmRJbWFnZSBzaVJlcXVlc3QgPSBudWxsOw0KLSAgICAgICAgU2VuZEltYWdlUmVzcG9uc2Ugc2lSZXNwb25zZSA9IG51bGw7DQotICAgICAgICBTdHJlYW1Tb3VyY2Ugc3RyZWFtU291cmNlID0gbnVsbDsNCi0gICAgICAgIA0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgIAkvL0NyZWF0ZSBhIHJlcXVlc3Qgb2JqZWN0DQotICAgICAgICAgICAgc2lSZXF1ZXN0ID0gbmV3IE9iamVjdEZhY3RvcnkoKS5jcmVhdGVTZW5kSW1hZ2UoKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvL1VubWFyc2hhbGwgcmVjaWV2ZWQgU291cmNlIHRvIGdldCByZXF1ZXN0IHBhcmFtLg0KLSAgICAgICAgICAgIEpBWEJDb250ZXh0IGpiYyA9IEpBWEJDb250ZXh0Lm5ld0luc3RhbmNlKCJvcmcudGVzdC5tdG9tIik7DQotICAgICAgICAgICAgVW5tYXJzaGFsbGVyIHVtID0gamJjLmNyZWF0ZVVubWFyc2hhbGxlcigpOw0KLSAgICAgICAgICAgIHNpUmVxdWVzdCA9IChTZW5kSW1hZ2UpdW0udW5tYXJzaGFsKG9iaik7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy9DcmVhdGUgYSByZXNwb25zZSBvYmplY3QNCi0gICAgICAgICAgICBzaVJlc3BvbnNlID0gbmV3IE9iamVjdEZhY3RvcnkoKS5jcmVhdGVTZW5kSW1hZ2VSZXNwb25zZSgpOw0KLSAgICAgICAgICAgIHNpUmVzcG9uc2Uuc2V0T3V0cHV0KHNpUmVxdWVzdC5nZXRJbnB1dCgpKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvL01hcnNoYWxsIHRoZSByZXNwb25zZSBvYmplY3QgYW5kIGNyZWF0ZSBhIFN0cmVhbVNvdXJjZSBmcm9tIHRoZSANCi0gICAgICAgICAgICAvL3Jlc3VsdGluZyBieXRlIGFycmF5IGlucHV0IHN0cmVhbQ0KLSAgICAgICAgICAgIE1hcnNoYWxsZXIgbSA9IGpiYy5jcmVhdGVNYXJzaGFsbGVyKCk7DQotICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7DQotICAgICAgICAgICAgbS5tYXJzaGFsKHNpUmVzcG9uc2UsIGJhb3MpOw0KLSAgICAgICAgICAgIGJ5dGUgW11iaXRlID0gYmFvcy50b0J5dGVBcnJheSgpOw0KLSAgICAgICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGJhaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYml0ZSk7DQotICAgICAgICAgICAgc3RyZWFtU291cmNlID0gbmV3IFN0cmVhbVNvdXJjZShiYWlzKTsNCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBzdHJlYW1Tb3VyY2U7DQotDQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyL2pheGIvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvamF4Yi9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY0YjU2OC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvamF4Yi9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMA0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9zb2FwYmluZGluZy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9zb2FwYmluZGluZy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY0YjU2OC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvc29hcGJpbmRpbmcvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjANCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvc29hcGJpbmRpbmcvU09BUEJpbmRpbmdQcm92aWRlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyL3NvYXBiaW5kaW5nL1NPQVBCaW5kaW5nUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI2MTY4Mi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvc29hcGJpbmRpbmcvU09BUEJpbmRpbmdQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJvdmlkZXIuc29hcGJpbmRpbmc7DQotDQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07DQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLk1lc3NhZ2VGYWN0b3J5Ow0KLWltcG9ydCBqYXZheC54bWwuc29hcC5NaW1lSGVhZGVyczsNCi1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUENvbnN0YW50czsNCi1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEVudmVsb3BlOw0KLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQTWVzc2FnZTsNCi1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUFBhcnQ7DQotaW1wb3J0IGphdmF4LnhtbC53cy5CaW5kaW5nVHlwZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLlByb3ZpZGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2VNb2RlOw0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VQcm92aWRlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5Db25zdGFudHM7DQotQFdlYlNlcnZpY2VQcm92aWRlcihzZXJ2aWNlTmFtZT0iU09BUEJpbmRpbmdQcm92aWRlclNlcnZpY2UiLCANCi0JCQkJCXRhcmdldE5hbWVzcGFjZT0iaHR0cDovL1NPQVBCaW5kaW5nUHJvdmlkZXIucHJvdmlkZXIuamF4d3MuYXhpczIuYXBhY2hlLm9yZyIsIA0KLQkJCQkJcG9ydE5hbWU9IlNPQVBCaW5kaW5nUHJvdmlkZXJQb3J0IikNCi1AU2VydmljZU1vZGUodmFsdWU9U2VydmljZS5Nb2RlLk1FU1NBR0UpDQotQEJpbmRpbmdUeXBlKENvbnN0YW50cy5TT0FQX0hUVFBfQklORElORykgDQotcHVibGljIGNsYXNzIFNPQVBCaW5kaW5nUHJvdmlkZXIgaW1wbGVtZW50cyBQcm92aWRlcjxTT0FQTWVzc2FnZT4gew0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09BUDExX05TX1VSSSA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyI7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTT0FQMTJfTlNfVVJJID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZSI7DQotDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNPQVAxMV9FTlZFTE9QRV9IRUFEID0gIjw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J3V0Zi04Jz8+IiArIA0KLQkiPHNvYXBlbnY6RW52ZWxvcGUgeG1sbnM6c29hcGVudj1cIiIgKyBTT0FQMTFfTlNfVVJJICsgIlwiPiIgKw0KLQkiPHNvYXBlbnY6SGVhZGVyIC8+IiArIA0KLQkiPHNvYXBlbnY6Qm9keT4iOw0KLQ0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTT0FQMTJfRU5WRUxPUEVfSEVBRCA9IA0KLQkJIjw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J3V0Zi04Jz8+IiArIA0KLQkJIjxzb2FwZW52OkVudmVsb3BlIHhtbG5zOnNvYXBlbnY9XCIiICsgU09BUDEyX05TX1VSSSArICJcIj4iICsNCi0JCSI8c29hcGVudjpIZWFkZXIgLz4iICsgDQotCQkiPHNvYXBlbnY6Qm9keT4iOw0KLQ0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTT0FQMTFfRU5WRUxPUEVfVEFJTCA9IA0KLQkJIjwvc29hcGVudjpCb2R5PiIgKyANCi0JCSI8L3NvYXBlbnY6RW52ZWxvcGU+IjsNCi0NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09BUDEyX0VOVkVMT1BFX1RBSUwgPSANCi0JCSI8L3NvYXBlbnY6Qm9keT4iICsgDQotCQkiPC9zb2FwZW52OkVudmVsb3BlPiI7DQotDQotDQotCVN0cmluZyBzb2FwMTFSZXNwb25zZVN0ciA9ICJTT0FQMTEgcmVxdWVzdCByZWNlaXZlZCI7DQotCVN0cmluZyBzb2FwMTJSZXNwb25zZVN0ciA9ICJTT0FQMTIgcmVxdWVzdCByZWNlaXZlZCI7DQotCQ0KLQlwdWJsaWMgU09BUE1lc3NhZ2UgaW52b2tlKFNPQVBNZXNzYWdlIHNvYXBNZXNzYWdlKSB7DQotCQl0cnl7DQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJTdGFydCBJbnZva2UoU09BUE1lc3NhZ2UpIik7DQotCQkJU3RyaW5nIG5hbWVzcGFjZVVSSSA9IGdldFNvYXBWZXJzaW9uVVJJKHNvYXBNZXNzYWdlKTsNCi0JCQkvL3JldHVybiBTT0FQMTEgcmVzcG9uc2UgaWYgdGhpcyBpcyBhIFNPQVAxMSBNZXNzYWdlDQotCQkJaWYobmFtZXNwYWNlVVJJLmVxdWFscyhTT0FQMTFfTlNfVVJJKSl7DQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU09BUDExX05TX1VSSSBmb3VuZCBpbiB0aGUgcmVxdWVzdCIpOw0KLQkJICAgICAgICByZXR1cm4gZ2V0U09BUDExUmVzcG9uc2UoKTsNCi0JCQl9DQotCQkJLy9yZXR1cm4gU09BUDEyIHJlc3BvbnNlIGlmIHRoaXMgaXMgYSBTT0FQMTEgTWVzc2FnZQ0KLQkJCWlmKG5hbWVzcGFjZVVSSS5lcXVhbHMoU09BUDEyX05TX1VSSSkpew0KLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlNPQVAxMl9OU19VUkkgZm91bmQgaW4gdGhlIHJlcXVlc3QiKTsNCi0JCQkJcmV0dXJuIGdldFNPQVAxMlJlc3BvbnNlKCk7DQotCQkJfQ0KLQkJfWNhdGNoKEV4Y2VwdGlvbiBlKXsNCi0JCQl0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihlKTsNCi0JCX0NCi0JCXRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKCJSZXF1ZXN0IHJlY2VpdmVkIGJ1dCBjb3VsZCBub3QgaW50ZXJwZXIgdGhlIHByb3RvY29sIik7DQotCX0NCi0NCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0U29hcFZlcnNpb25VUkkoU09BUE1lc3NhZ2Ugc29hcE1lc3NhZ2UpdGhyb3dzIFNPQVBFeGNlcHRpb257DQotCQlTT0FQUGFydCBzcCA9IHNvYXBNZXNzYWdlLmdldFNPQVBQYXJ0KCk7DQotCQlTT0FQRW52ZWxvcGUgZW52ZWxvcGUgPSBzcC5nZXRFbnZlbG9wZSgpOw0KLQkJcmV0dXJuIGVudmVsb3BlLmdldE5hbWVzcGFjZVVSSSgpOw0KLQl9DQotCQ0KLQlwcml2YXRlIFNPQVBNZXNzYWdlIGdldFNPQVAxMVJlc3BvbnNlKCkgdGhyb3dzIFNPQVBFeGNlcHRpb24sIElPRXhjZXB0aW9uew0KLQkJTWVzc2FnZUZhY3RvcnkgZmFjdG9yeSA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKCk7DQotICAgICAgICBTdHJpbmcgcmVzcG9uc2VYTUwgPSBTT0FQMTFfRU5WRUxPUEVfSEVBRCArIjxyZXR1cm4+Iisgc29hcDExUmVzcG9uc2VTdHIrIjwvcmV0dXJuPiIgKyBTT0FQMTFfRU5WRUxPUEVfVEFJTDsNCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ3JlYXRpbmcgU09BUDExIFJlc3BvbnNlIik7DQotICAgICAgICByZXR1cm4gZmFjdG9yeS5jcmVhdGVNZXNzYWdlKG51bGwsIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShyZXNwb25zZVhNTC5nZXRCeXRlcygpKSk7DQotCQkNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBTT0FQTWVzc2FnZSBnZXRTT0FQMTJSZXNwb25zZSgpIHRocm93cyBTT0FQRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbnsNCi0JCU1lc3NhZ2VGYWN0b3J5IGZhY3RvcnkgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZShTT0FQQ29uc3RhbnRzLlNPQVBfMV8yX1BST1RPQ09MKTsNCi0JCU1pbWVIZWFkZXJzIGhlYWRlciA9IG5ldyBNaW1lSGVhZGVycygpOw0KLQkJaGVhZGVyLmFkZEhlYWRlcigiQ29udGVudC1UeXBlIiwgImFwcGxpY2F0aW9uL3NvYXAreG1sIik7DQotICAgICAgICBTdHJpbmcgcmVzcG9uc2VYTUwgPSBTT0FQMTJfRU5WRUxPUEVfSEVBRCArIjxyZXR1cm4+Iisgc29hcDEyUmVzcG9uc2VTdHIrIjwvcmV0dXJuPiIgKyBTT0FQMTJfRU5WRUxPUEVfVEFJTDsNCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ3JlYXRpbmcgU09BUDEyIFJlc3BvbnNlIik7DQotICAgICAgICByZXR1cm4gZmFjdG9yeS5jcmVhdGVNZXNzYWdlKGhlYWRlciwgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHJlc3BvbnNlWE1MLmdldEJ5dGVzKCkpKTsNCi0JfQ0KLX0NCi0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvc29hcGJpbmRpbmcvc29hcG1zZy9Tb2FwTWVzc2FnZVByb3ZpZGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvc29hcGJpbmRpbmcvc29hcG1zZy9Tb2FwTWVzc2FnZVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzNTZiOTguLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyL3NvYXBiaW5kaW5nL3NvYXBtc2cvU29hcE1lc3NhZ2VQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJvdmlkZXIuc29hcGJpbmRpbmcuc29hcG1zZzsNCi0NCi0NCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07DQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi1pbXBvcnQgamF2YXgueG1sLnNvYXAuQXR0YWNobWVudFBhcnQ7DQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLkRldGFpbDsNCi1pbXBvcnQgamF2YXgueG1sLnNvYXAuTWVzc2FnZUZhY3Rvcnk7DQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLk1pbWVIZWFkZXJzOw0KLWltcG9ydCBqYXZheC54bWwuc29hcC5OYW1lOw0KLWltcG9ydCBqYXZheC54bWwuc29hcC5Ob2RlOw0KLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQQm9keTsNCi1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUENvbnN0YW50czsNCi1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEVsZW1lbnQ7DQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBFeGNlcHRpb247DQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBGYWN0b3J5Ow0KLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRmF1bHQ7DQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBIZWFkZXI7DQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBIZWFkZXJFbGVtZW50Ow0KLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQTWVzc2FnZTsNCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5SZXN1bHQ7DQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXI7DQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5Ow0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7DQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVNvdXJjZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLkJpbmRpbmdUeXBlOw0KLWltcG9ydCBqYXZheC54bWwud3MuUHJvdmlkZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZU1vZGU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZVByb3ZpZGVyOw0KLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5TT0FQRmF1bHRFeGNlcHRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuQ29uc3RhbnRzOw0KLQ0KLUBXZWJTZXJ2aWNlUHJvdmlkZXIoc2VydmljZU5hbWU9IlNvYXBNZXNzYWdlUHJvdmlkZXJTZXJ2aWNlIiwgcG9ydE5hbWU9IlNvYXBNZXNzYWdlUHJvdmlkZXJQb3J0IikNCi1AQmluZGluZ1R5cGUoQ29uc3RhbnRzLlNPQVBfSFRUUF9CSU5ESU5HKQ0KLUBTZXJ2aWNlTW9kZSh2YWx1ZT1TZXJ2aWNlLk1vZGUuTUVTU0FHRSkNCi1wdWJsaWMgY2xhc3MgU29hcE1lc3NhZ2VQcm92aWRlciBpbXBsZW1lbnRzIFByb3ZpZGVyPFNPQVBNZXNzYWdlPiB7DQotICAgICAgDQotICAgIFN0cmluZyByZXNwb25zZU1zZ1N0YXJ0ID0gIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/Pjxzb2FwZW52OkVudmVsb3BlIHhtbG5zOnNvYXBlbnY9XCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlL1wiPjxzb2FwZW52OkhlYWRlci8+PHNvYXBlbnY6Qm9keT4iOw0KLSAgICBTdHJpbmcgcmVzcG9uc2VNc2dFbmQgPSAiPC9zb2FwZW52OkJvZHk+PC9zb2FwZW52OkVudmVsb3BlPiI7DQotDQotICAgIC8vIFJlcXVlc3RzIGFuZCBSZXNwb25zZSB2YWx1ZXMgb2YgaW52b2tlX3N0ciBhbmQgcmV0dXJuX3N0cg0KLSAgICAvLyBUaGVzZSBjb25zdGFudHMgYXJlIHJlZmVyZW5jZWQgYnkgdGhlIFNvYXBNZXNzYWdlUHJvdmlkZXJUZXN0IGFuZCBTb2FwTWVzc2FnZVByb3ZpZGVyDQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFJFU1BPTlNFX05BTUUgPSAiUmV0dXJuVHlwZSI7DQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFJFU1BPTlNFX0RBVEFfTkFNRSA9ICJyZXR1cm5fc3RyIjsNCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgUkVRVUVTVF9OQU1FID0gImludm9rZU9wIjsNCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgUkVRVUVTVF9EQVRBX05BTUUgPSAiaW52b2tlX3N0ciI7DQotICAgIA0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBYTUxfUkVRVUVTVCAgICAgICAgICAgICAgPSAieG1sIHJlcXVlc3QiOw0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBYTUxfUkVTUE9OU0UgICAgICAgICAgICAgPSAieG1sIHJlc3BvbnNlIjsNCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgWE1MX0VNUFRZQk9EWV9SRVFVRVNUICAgID0gInhtbCBlbXB0eSBib2R5IHJlcXVlc3QiOw0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBYTUxfQ0hFQ0tIRUFERVJTX1JFUVVFU1QgPSAieG1sIGNoZWNrIGhlYWRlcnMgcmVxdWVzdCI7DQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFhNTF9DSEVDS0hFQURFUlNfUkVTUE9OU0U9ICJ4bWwgY2hlY2sgaGVhZGVycyByZXNwb25zZSI7DQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFhNTF9BVFRBQ0hNRU5UX1JFUVVFU1QgICA9ICJ4bWwgYW5kIGF0dGFjaG1lbnQgcmVxdWVzdCI7DQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFhNTF9BVFRBQ0hNRU5UX1JFU1BPTlNFICA9ICJ4bWwgYW5kIGF0dGFjaG1lbnQgcmVzcG9uc2UiOw0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBYTUxfTVRPTV9SRVFVRVNUICAgICAgICAgPSAieG1sIGFuZCBtdG9tIHJlcXVlc3QiOw0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBYTUxfTVRPTV9SRVNQT05TRSAgICAgICAgPSAieG1sIGFuZCBtdG9tIHJlc3BvbnNlIjsNCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgWE1MX1NXQVJFRl9SRVFVRVNUICAgICAgID0gInhtbCBhbmQgc3dhcmVmIHJlcXVlc3QiOw0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBYTUxfU1dBUkVGX1JFU1BPTlNFICAgICAgPSAieG1sIGFuZCBzd2FyZWYgcmVzcG9uc2UiOw0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBYTUxfRkFVTFRfUkVRVUVTVCAgICAgICAgPSAieG1sIGZhdWx0IjsNCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgWE1MX1NPQVAxMl9GQVVMVF9SRVFVRVNUID0gInhtbCBzb2FwMTIgZmF1bHQiOw0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBYTUxfV1NFX1JFUVVFU1QgICAgICAgID0gInhtbCB3c2UgZmF1bHQiOw0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBYTUxfU09BUDEyX1JFU1BPTlNFID0gInhtbCBzb2FwMTIgcmVzcG9uc2UiOw0KLSAgICANCi0gICAgcHJpdmF0ZSBTdHJpbmcgWE1MX1JFVFVSTiA9ICI8bnMyOlJldHVyblR5cGUgeG1sbnM6bnMyPVwiaHR0cDovL3Rlc3RcIj48cmV0dXJuX3N0cj4iICsgDQotICAgICAgICBTb2FwTWVzc2FnZVByb3ZpZGVyLlhNTF9SRVNQT05TRSArDQotICAgICAgICAiPC9yZXR1cm5fc3RyPjwvbnMyOlJldHVyblR5cGU+IjsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgQVRUQUNITUVOVF9SRVRVUk4gPSAiPG5zMjpSZXR1cm5UeXBlIHhtbG5zOm5zMj1cImh0dHA6Ly90ZXN0XCI+PHJldHVybl9zdHI+IiArIA0KLSAgICAgICAgU29hcE1lc3NhZ2VQcm92aWRlci5YTUxfQVRUQUNITUVOVF9SRVNQT05TRSArDQotICAgICAgICAiPC9yZXR1cm5fc3RyPjwvbnMyOlJldHVyblR5cGU+IjsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgTVRPTV9SRVRVUk4gPSAiPG5zMjpSZXR1cm5UeXBlIHhtbG5zOm5zMj1cImh0dHA6Ly90ZXN0XCI+PHJldHVybl9zdHI+IiArIA0KLSAgICAgICAgU29hcE1lc3NhZ2VQcm92aWRlci5YTUxfTVRPTV9SRVNQT05TRSArDQotICAgICAgICAiPC9yZXR1cm5fc3RyPiIgKyANCi0gICAgICAgIFNvYXBNZXNzYWdlUHJvdmlkZXIuTVRPTV9SRUYgKw0KLSAgICAgICAgIjwvbnMyOlJldHVyblR5cGU+IjsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgU1dBUkVGX1JFVFVSTiA9ICI8bnMyOlJldHVyblR5cGUgeG1sbnM6bnMyPVwiaHR0cDovL3Rlc3RcIj48cmV0dXJuX3N0cj4iICsgDQotICAgICAgICBTb2FwTWVzc2FnZVByb3ZpZGVyLlhNTF9TV0FSRUZfUkVTUE9OU0UgKw0KLSAgICAgICAgIjwvcmV0dXJuX3N0cj4iICsgDQotICAgICAgICBTb2FwTWVzc2FnZVByb3ZpZGVyLlNXQVJFRl9SRUYgKw0KLSAgICAgICAgIjwvbnMyOlJldHVyblR5cGU+IjsgICAgIA0KLSAgICBwcml2YXRlIFN0cmluZyBDSEVDS0hFQURFUlNfUkVUVVJOID0gIjxuczI6UmV0dXJuVHlwZSB4bWxuczpuczI9XCJodHRwOi8vdGVzdFwiPjxyZXR1cm5fc3RyPiIgKyANCi0gICAgICAgIFNvYXBNZXNzYWdlUHJvdmlkZXIuWE1MX0NIRUNLSEVBREVSU19SRVNQT05TRSArDQotICAgICAgICAiPC9yZXR1cm5fc3RyPiIgKyANCi0gICAgICAgICI8L25zMjpSZXR1cm5UeXBlPiI7ICAgICANCi0gICAgDQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFRFWFRfWE1MX0FUVEFDSE1FTlQgPSAiPG15QXR0YWNobWVudD5IZWxsbyBXb3JsZDwvbXlBdHRhY2htZW50PiI7DQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIElEID0gImhlbGxvV29ybGQxMjMiOw0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBNVE9NX1JFRiA9ICI8ZGF0YT4iICsgDQotICAgICAgICAiPHhvcDpJbmNsdWRlIGhyZWY9J2NpZDoiICsgSUQgKyAiJyB4bWxuczp4b3A9J2h0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgveG9wL2luY2x1ZGUnIC8+IiArDQotICAgICAgICAgICAgIjwvZGF0YT4iOw0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBTV0FSRUZfUkVGID0gIjxkYXRhPiIgKyANCi0gICAgICAgICJjaWQ6IiArIElEICsNCi0gICAgICAgICI8L2RhdGE+IjsNCi0gICAgDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgRk9PX0hFQURFUl9RTkFNRSA9IG5ldyBRTmFtZSgiaHR0cDovL3NhbXBsZTEiLCAiZm9vIiwgInByZTEiKTsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBCQVJfSEVBREVSX1FOQU1FID0gbmV3IFFOYW1lKCJodHRwOi8vc2FtcGxlMiIsICJiYXIiLCAicHJlMiIpOw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIEJBVF9IRUFERVJfUU5BTUUgPSBuZXcgUU5hbWUoImh0dHA6Ly9zYW1wbGUzIiwgImJhdCIsICJwcmUzIik7DQotICAgIA0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT09fSEVBREVSX0NPTlRFTlQgPSAiZm9vIGNvbnRlbnQiOw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCQVJfSEVBREVSX0NPTlRFTlQxID0gImJhciBjb250ZW50MSI7DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJBUl9IRUFERVJfQ09OVEVOVDIgPSAiYmFyIGNvbnRlbnQyIjsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFUX0hFQURFUl9DT05URU5UID0gImJhdCBjb250ZW50IjsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNPQVAxMV9OU19VUkkgPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09BUDEyX05TX1VSSSA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUiOw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTT0FQMTFfRU5WRUxPUEVfSEVBRCA9ICI8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSd1dGYtOCc/PiIgKyANCi0JIjxzb2FwZW52OkVudmVsb3BlIHhtbG5zOnNvYXBlbnY9XCIiICsgU09BUDExX05TX1VSSSArICJcIj4iICsNCi0JIjxzb2FwZW52OkhlYWRlciAvPiIgKyANCi0JIjxzb2FwZW52OkJvZHk+IjsNCi0NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09BUDEyX0VOVkVMT1BFX0hFQUQgPSANCi0JCSI8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSd1dGYtOCc/PiIgKyANCi0JCSI8c29hcGVudjpFbnZlbG9wZSB4bWxuczpzb2FwZW52PVwiIiArIFNPQVAxMl9OU19VUkkgKyAiXCI+IiArDQotCQkiPHNvYXBlbnY6SGVhZGVyIC8+IiArIA0KLQkJIjxzb2FwZW52OkJvZHk+IjsNCi0NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09BUDExX0VOVkVMT1BFX1RBSUwgPSANCi0JCSI8L3NvYXBlbnY6Qm9keT4iICsgDQotCQkiPC9zb2FwZW52OkVudmVsb3BlPiI7DQotDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNPQVAxMl9FTlZFTE9QRV9UQUlMID0gDQotCQkiPC9zb2FwZW52OkJvZHk+IiArIA0KLQkJIjwvc29hcGVudjpFbnZlbG9wZT4iOw0KLSAgICANCi0gICAgcHVibGljIFNPQVBNZXNzYWdlIGludm9rZShTT0FQTWVzc2FnZSBzb2FwTWVzc2FnZSkgdGhyb3dzIFNPQVBGYXVsdEV4Y2VwdGlvbiB7DQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIj4+IFNvYXBNZXNzYWdlUHJvdmlkZXI6IFJlcXVlc3QgcmVjZWl2ZWQuIik7DQotICAgIAkNCi0gICAgCXRyeXsNCi0gICAgCSAgICAvLyBMb29rIGF0IHRoZSBpbmNvbWluZyByZXF1ZXN0IG1lc3NhZ2UNCi0gICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiPj4gUmVxdWVzdCBvbiBTZXJ2ZXI6Iik7DQotICAgICAgICAgICAgLy9zb2FwTWVzc2FnZS53cml0ZVRvKFN5c3RlbS5vdXQpOw0KLSAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJcbiIpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIEdldCB0aGUgZGlzY3JpbWluYXRpb24gZWxlbWVudC4gIFRoaXMgcGVyZm9ybXMgYmFzaWMgYXNzZXJ0aW9ucyBvbiB0aGUgcmVjZWl2ZWQgbWVzc2FnZQ0KLSAgICAgICAgICAgIFNPQVBFbGVtZW50IGRpc2NFbGVtZW50ID0gYXNzZXJ0UmVxdWVzdFhNTChzb2FwTWVzc2FnZSk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gVXNlIHRoZSBkYXRhIGVsZW1lbnQgdGV4dCB0byBkZXRlcm1pbmUgdGhlIHR5cGUgb2YgcmVzcG9uc2UgdG8gc2VuZA0KLSAgICAgICAgICAgIFNPQVBNZXNzYWdlIHJlc3BvbnNlID0gbnVsbDsNCi0gICAgICAgICAgICAvLyBUT0RPIEFYSVMyIFNBQUogc2hvdWxkIChidXQgZG9lcyBub3QpIHN1cHBvcnQgdGhlIGdldFRleHRDb250ZW50KCk7DQotICAgICAgICAgICAgLy8gU3RyaW5nIHRleHQgPSBkYXRhRWxlbWVudC5nZXRUZXh0Q29udGVudCgpOw0KLSAgICAgICAgICAgIFN0cmluZyB0ZXh0ID0gZGlzY0VsZW1lbnQuZ2V0VmFsdWUoKTsNCi0gICAgICAgICAgICBpZiAoWE1MX1JFUVVFU1QuZXF1YWxzKHRleHQpKSB7DQotICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gZ2V0WE1MUmVzcG9uc2Uoc29hcE1lc3NhZ2UsIGRpc2NFbGVtZW50KTsNCi0gICAgICAgICAgICB9IGVsc2UgaWYgKFhNTF9FTVBUWUJPRFlfUkVRVUVTVC5lcXVhbHModGV4dCkpIHsNCi0gICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBnZXRYTUxFbXB0eUJvZHlSZXNwb25zZShzb2FwTWVzc2FnZSwgZGlzY0VsZW1lbnQpOw0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoWE1MX0NIRUNLSEVBREVSU19SRVFVRVNULmVxdWFscyh0ZXh0KSkgew0KLSAgICAgICAgICAgICAgICByZXNwb25zZSA9IGdldFhNTENoZWNrSGVhZGVyc1Jlc3BvbnNlKHNvYXBNZXNzYWdlLCBkaXNjRWxlbWVudCk7DQotICAgICAgICAgICAgfSBlbHNlIGlmIChYTUxfQVRUQUNITUVOVF9SRVFVRVNULmVxdWFscyh0ZXh0KSkgew0KLSAgICAgICAgICAgICAgICByZXNwb25zZSA9IGdldFhNTEF0dGFjaG1lbnRSZXNwb25zZShzb2FwTWVzc2FnZSwgZGlzY0VsZW1lbnQpOw0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoWE1MX01UT01fUkVRVUVTVC5lcXVhbHModGV4dCkpIHsNCi0gICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBnZXRYTUxNVE9NUmVzcG9uc2Uoc29hcE1lc3NhZ2UsIGRpc2NFbGVtZW50KTsNCi0gICAgICAgICAgICB9IGVsc2UgaWYgKFhNTF9TV0FSRUZfUkVRVUVTVC5lcXVhbHModGV4dCkpIHsNCi0gICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBnZXRYTUxTV0FSZWZSZXNwb25zZShzb2FwTWVzc2FnZSwgZGlzY0VsZW1lbnQpOw0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoWE1MX0ZBVUxUX1JFUVVFU1QuZXF1YWxzKHRleHQpKSB7DQotICAgICAgICAgICAgICAgIHRocm93U09BUEZhdWx0RXhjZXB0aW9uKCk7DQotICAgICAgICAgICAgfSBlbHNlIGlmIChYTUxfV1NFX1JFUVVFU1QuZXF1YWxzKHRleHQpKSB7DQotICAgICAgICAgICAgICAgIHRocm93V2ViU2VydmljZUV4Y2VwdGlvbigpOw0KLSAgICAgICAgICAgIH0gZWxzZSBpZihYTUxfU09BUDEyX1JFU1BPTlNFLmVxdWFscyh0ZXh0KSl7DQotICAgICAgICAgICAgCXJlc3BvbnNlID0gZ2V0U09BUDEyUmVzcG9uc2UoKTsNCi0gICAgICAgICAgICB9ZWxzZSB7DQotICAgICAgICAgICAgICAgIC8vIFdlIHNob3VsZCBub3QgZ2V0IGhlcmUNCi0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJVbmtub3duIFR5cGUgb2YgTWVzc2FnZSIpOw0KLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGZhbHNlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gV3JpdGUgb3V0IHRoZSBNZXNzYWdlDQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCI+PiBSZXNwb25zZSBiZWluZyBzZW50IGJ5IFNlcnZlcjoiKTsNCi0gICAgICAgICAgICAvL3Jlc3BvbnNlLndyaXRlVG8oU3lzdGVtLm91dCk7DQotICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIlxuIik7DQotICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlOw0KLSAgICAJfSBjYXRjaCAoV2ViU2VydmljZUV4Y2VwdGlvbiB3c2UpIHsNCi0gICAgCSAgICB0aHJvdyB3c2U7DQotICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKXsNCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIioqKkVSUk9SOiBJbiBTb2FwTWVzc2FnZVByb3ZpZGVyLmludm9rZTogQ2F1Z2h0IGV4Y2VwdGlvbiAiICsgZSk7DQotICAgIAkJZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgCX0NCi0gICAgCXJldHVybiBudWxsOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogQ29tbW9uIGFzc2VydGlvbiBjaGVja2luZyBvZiB0aGUgcmVxdWVzdA0KLSAgICAgKiBAcGFyYW0gbXNnDQotICAgICAqIEByZXR1cm4gU09BUEVsZW1lbnQgcmVwcmVzZW50aW5nIHRoZSBkYXRhIGVsZW1lbnQNCi0gICAgICovDQotICAgIHByaXZhdGUgU09BUEVsZW1lbnQgYXNzZXJ0UmVxdWVzdFhNTChTT0FQTWVzc2FnZSBtc2cpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgYXNzZXJ0VHJ1ZShtc2cgIT0gbnVsbCk7DQotICAgICAgICBTT0FQQm9keSBib2R5ID0gbXNnLmdldFNPQVBCb2R5KCk7DQotICAgICAgICBhc3NlcnRUcnVlKGJvZHkgIT0gbnVsbCk7DQotICAgICAgICANCi0gICAgICAgIE5vZGUgaW52b2tlRWxlbWVudCA9IChOb2RlKSBib2R5LmdldEZpcnN0Q2hpbGQoKTsNCi0gICAgICAgIGFzc2VydFRydWUoaW52b2tlRWxlbWVudCBpbnN0YW5jZW9mIFNPQVBFbGVtZW50KTsNCi0gICAgICAgIGFzc2VydFRydWUoU29hcE1lc3NhZ2VQcm92aWRlci5SRVFVRVNUX05BTUUuZXF1YWxzKGludm9rZUVsZW1lbnQuZ2V0TG9jYWxOYW1lKCkpKTsNCi0gICAgICAgIA0KLSAgICAgICAgTm9kZSBkaXNjRWxlbWVudCA9IChOb2RlKSBpbnZva2VFbGVtZW50LmdldEZpcnN0Q2hpbGQoKTsNCi0gICAgICAgIGFzc2VydFRydWUoZGlzY0VsZW1lbnQgaW5zdGFuY2VvZiBTT0FQRWxlbWVudCk7DQotICAgICAgICBhc3NlcnRUcnVlKFNvYXBNZXNzYWdlUHJvdmlkZXIuUkVRVUVTVF9EQVRBX05BTUUuZXF1YWxzKGRpc2NFbGVtZW50LmdldExvY2FsTmFtZSgpKSk7DQotICAgICAgICANCi0gICAgICAgIFN0cmluZyB0ZXh0ID0gZGlzY0VsZW1lbnQuZ2V0VmFsdWUoKTsNCi0gICAgICAgIGFzc2VydFRydWUodGV4dCAhPSBudWxsKTsNCi0gICAgICAgIGFzc2VydFRydWUodGV4dC5sZW5ndGgoKSA+IDApOw0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJSZXF1ZXN0IE1lc3NhZ2UgVHlwZSBpczoiICsgdGV4dCk7DQotICAgICAgICANCi0gICAgICAgIHJldHVybiAoU09BUEVsZW1lbnQpIGRpc2NFbGVtZW50Ow0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogR2V0IHRoZSByZXNwb25zZSBmb3IgYW4gWE1MIG9ubHkgcmVxdWVzdA0KLSAgICAgKiBAcGFyYW0gcmVxdWVzdA0KLSAgICAgKiBAcGFyYW0gZGF0YUVsZW1lbnQNCi0gICAgICogQHJldHVybiBTT0FQTWVzc2FnZQ0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBTT0FQTWVzc2FnZSBnZXRYTUxSZXNwb25zZShTT0FQTWVzc2FnZSByZXF1ZXN0LCBTT0FQRWxlbWVudCBkYXRhRWxlbWVudCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBTT0FQTWVzc2FnZSByZXNwb25zZTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gVHJhbnNwb3J0IGhlYWRlciBjaGVjaw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXF1ZXN0LmdldENvbnRlbnREZXNjcmlwdGlvbigpICE9IG51bGwpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXF1ZXN0LmdldENvbnRlbnREZXNjcmlwdGlvbigpLmVxdWFscyhTb2FwTWVzc2FnZVByb3ZpZGVyLlhNTF9SRVFVRVNUKSk7DQotDQotICAgICAgICAvLyBBZGRpdGlvbmFsIGFzc2VydGlvbiBjaGVja3MNCi0gICAgICAgIGFzc2VydFRydWUoY291bnRBdHRhY2htZW50cyhyZXF1ZXN0KSA9PSAwKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQnVpbGQgdGhlIFJlc3BvbnNlDQotICAgICAgICBNZXNzYWdlRmFjdG9yeSBmYWN0b3J5ID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoKTsNCi0gICAgICAgIFN0cmluZyByZXNwb25zZVhNTCA9IHJlc3BvbnNlTXNnU3RhcnQgKyBYTUxfUkVUVVJOICsgcmVzcG9uc2VNc2dFbmQ7DQotICAgICAgICByZXNwb25zZSA9IGZhY3RvcnkuY3JlYXRlTWVzc2FnZShudWxsLCBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ocmVzcG9uc2VYTUwuZ2V0Qnl0ZXMoKSkpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBTZXQgYSBjb250ZW50IGRlc2NyaXB0aW9uDQotICAgICAgICByZXNwb25zZS5zZXRDb250ZW50RGVzY3JpcHRpb24oU29hcE1lc3NhZ2VQcm92aWRlci5YTUxfUkVTUE9OU0UpOw0KLSAgICAgICAgcmV0dXJuIHJlc3BvbnNlOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogR2V0IHRoZSByZXNwb25zZSBmb3IgYW4gWE1MIG9ubHkgcmVxdWVzdA0KLSAgICAgKiBAcGFyYW0gcmVxdWVzdA0KLSAgICAgKiBAcGFyYW0gZGF0YUVsZW1lbnQNCi0gICAgICogQHJldHVybiBTT0FQTWVzc2FnZQ0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBTT0FQTWVzc2FnZSBnZXRYTUxFbXB0eUJvZHlSZXNwb25zZShTT0FQTWVzc2FnZSByZXF1ZXN0LCBTT0FQRWxlbWVudCBkYXRhRWxlbWVudCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBTT0FQTWVzc2FnZSByZXNwb25zZTsNCi0gICAgICAgDQotDQotICAgICAgICAvLyBBZGRpdGlvbmFsIGFzc2VydGlvbiBjaGVja3MNCi0gICAgICAgIGFzc2VydFRydWUoY291bnRBdHRhY2htZW50cyhyZXF1ZXN0KSA9PSAwKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQnVpbGQgdGhlIFJlc3BvbnNlDQotICAgICAgICBNZXNzYWdlRmFjdG9yeSBmYWN0b3J5ID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoKTsNCi0gICAgICAgIHJlc3BvbnNlID0gZmFjdG9yeS5jcmVhdGVNZXNzYWdlKCk7DQotICAgICANCi0gICAgICAgIHJldHVybiByZXNwb25zZTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIEdldCB0aGUgcmVzcG9uc2UgZm9yIGFuIFhNTCBjaGVjayBoZWFkZXJzIHJlcXVlc3QNCi0gICAgICogQHBhcmFtIHJlcXVlc3QNCi0gICAgICogQHBhcmFtIGRhdGFFbGVtZW50DQotICAgICAqIEByZXR1cm4gU09BUE1lc3NhZ2UNCi0gICAgICovDQotICAgIHByaXZhdGUgU09BUE1lc3NhZ2UgZ2V0WE1MQ2hlY2tIZWFkZXJzUmVzcG9uc2UoU09BUE1lc3NhZ2UgcmVxdWVzdCwgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09BUEVsZW1lbnQgZGF0YUVsZW1lbnQpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgU09BUE1lc3NhZ2UgcmVzcG9uc2U7DQotICAgICAgICANCi0gICAgICAgIC8vIEFkZGl0aW9uYWwgYXNzZXJ0aW9uIGNoZWNrcw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShjb3VudEF0dGFjaG1lbnRzKHJlcXVlc3QpID09IDApOw0KLSAgICAgICAgDQotICAgICAgICAvLyBDaGVjayBmb3Igc3BlY2lmaWMgaGVhZGVycw0KLSAgICAgICAgU09BUEhlYWRlciBzaCA9IHJlcXVlc3QuZ2V0U09BUEhlYWRlcigpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShzaCAhPSBudWxsKTsNCi0gICAgICAgIA0KLSAgICAgICAgU09BUEhlYWRlckVsZW1lbnQgc2hlID0gKFNPQVBIZWFkZXJFbGVtZW50KQ0KLSAgICAgICAgICAgIHNoLmdldENoaWxkRWxlbWVudHMoRk9PX0hFQURFUl9RTkFNRSkubmV4dCgpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShzaGUgIT0gbnVsbCk7DQotICAgICAgICBhc3NlcnRUcnVlKHNoZSBpbnN0YW5jZW9mIFNPQVBIZWFkZXJFbGVtZW50KTsNCi0gICAgICAgIFN0cmluZyB0ZXh0ID0gc2hlLmdldFZhbHVlKCk7DQotICAgICAgICBhc3NlcnRUcnVlKEZPT19IRUFERVJfQ09OVEVOVC5lcXVhbHModGV4dCkpOw0KLSAgICAgICAgDQotICAgICAgICBJdGVyYXRvciBpdCA9IHNoLmdldENoaWxkRWxlbWVudHMoQkFSX0hFQURFUl9RTkFNRSk7DQotICAgICAgICBzaGUgPSAoU09BUEhlYWRlckVsZW1lbnQpIGl0Lm5leHQoKTsNCi0gICAgICAgIGFzc2VydFRydWUoc2hlICE9IG51bGwpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShzaGUgaW5zdGFuY2VvZiBTT0FQSGVhZGVyRWxlbWVudCk7DQotICAgICAgICB0ZXh0ID0gc2hlLmdldFZhbHVlKCk7DQotICAgICAgICBhc3NlcnRUcnVlKEJBUl9IRUFERVJfQ09OVEVOVDEuZXF1YWxzKHRleHQpKTsNCi0gICAgICAgIHNoZSA9IChTT0FQSGVhZGVyRWxlbWVudCkgaXQubmV4dCgpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShzaGUgIT0gbnVsbCk7DQotICAgICAgICBhc3NlcnRUcnVlKHNoZSBpbnN0YW5jZW9mIFNPQVBIZWFkZXJFbGVtZW50KTsNCi0gICAgICAgIHRleHQgPSBzaGUuZ2V0VmFsdWUoKTsNCi0gICAgICAgIGFzc2VydFRydWUoQkFSX0hFQURFUl9DT05URU5UMi5lcXVhbHModGV4dCkpOw0KLSAgICAgICAgDQotICAgICAgICBhc3NlcnRUcnVlKCFzaC5nZXRDaGlsZEVsZW1lbnRzKEJBVF9IRUFERVJfUU5BTUUpLmhhc05leHQoKSk7DQotICAgDQotICAgICAgICANCi0gICAgICAgIC8vIEJ1aWxkIHRoZSBSZXNwb25zZQ0KLSAgICAgICAgTWVzc2FnZUZhY3RvcnkgZmFjdG9yeSA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKCk7DQotICAgICAgICBTdHJpbmcgcmVzcG9uc2VYTUwgPSByZXNwb25zZU1zZ1N0YXJ0ICsgQ0hFQ0tIRUFERVJTX1JFVFVSTiArIHJlc3BvbnNlTXNnRW5kOw0KLSAgICAgICAgcmVzcG9uc2UgPSBmYWN0b3J5LmNyZWF0ZU1lc3NhZ2UobnVsbCwgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHJlc3BvbnNlWE1MLmdldEJ5dGVzKCkpKTsNCi0gICAgICAgIHJlc3BvbnNlLmdldFNPQVBIZWFkZXIoKS5hZGRIZWFkZXJFbGVtZW50KEJBUl9IRUFERVJfUU5BTUUpLg0KLSAgICAgICAgICAgIGFkZFRleHROb2RlKEJBUl9IRUFERVJfQ09OVEVOVDEpOw0KLSAgICAgICAgcmVzcG9uc2UuZ2V0U09BUEhlYWRlcigpLmFkZEhlYWRlckVsZW1lbnQoQkFSX0hFQURFUl9RTkFNRSkuDQotICAgICAgICAgICAgYWRkVGV4dE5vZGUoQkFSX0hFQURFUl9DT05URU5UMik7DQotICAgICAgICByZXNwb25zZS5nZXRTT0FQSGVhZGVyKCkuYWRkSGVhZGVyRWxlbWVudChCQVRfSEVBREVSX1FOQU1FKS4NCi0gICAgICAgICAgICBhZGRUZXh0Tm9kZShCQVRfSEVBREVSX0NPTlRFTlQpOw0KLSAgICAgICAgDQotICAgICAgICByZXR1cm4gcmVzcG9uc2U7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBHZXQgdGhlIHJlc3BvbnNlIGZvciBhbiBYTUwgYW5kIGFuIEF0dGFjaG1lbnQgcmVxdWVzdA0KLSAgICAgKiBAcGFyYW0gcmVxdWVzdA0KLSAgICAgKiBAcGFyYW0gZGF0YUVsZW1lbnQNCi0gICAgICogQHJldHVybiBTT0FQTWVzc2FnZQ0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBTT0FQTWVzc2FnZSBnZXRYTUxBdHRhY2htZW50UmVzcG9uc2UoU09BUE1lc3NhZ2UgcmVxdWVzdCwgU09BUEVsZW1lbnQgZGF0YUVsZW1lbnQpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgU09BUE1lc3NhZ2UgcmVzcG9uc2U7DQotICAgICAgICANCi0gICAgICAgIC8vIEFkZGl0aW9uYWwgYXNzZXJ0aW9uIGNoZWNrcw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShjb3VudEF0dGFjaG1lbnRzKHJlcXVlc3QpID09IDEpOw0KLSAgICAgICAgQXR0YWNobWVudFBhcnQgcmVxdWVzdEFQID0gKEF0dGFjaG1lbnRQYXJ0KSByZXF1ZXN0LmdldEF0dGFjaG1lbnRzKCkubmV4dCgpOw0KLSAgICAgICAgU3RyZWFtU291cmNlIGNvbnRlbnRTUyA9IChTdHJlYW1Tb3VyY2UpIHJlcXVlc3RBUC5nZXRDb250ZW50KCk7DQotICAgICAgICBTdHJpbmcgY29udGVudCA9IGdldEFzU3RyaW5nKGNvbnRlbnRTUyk7DQotICAgICAgICBhc3NlcnRUcnVlKGNvbnRlbnQuY29udGFpbnMoU29hcE1lc3NhZ2VQcm92aWRlci5URVhUX1hNTF9BVFRBQ0hNRU5UKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIEJ1aWxkIHRoZSBSZXNwb25zZQ0KLSAgICAgICAgTWVzc2FnZUZhY3RvcnkgZmFjdG9yeSA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKCk7DQotICAgICAgICBTdHJpbmcgcmVzcG9uc2VYTUwgPSByZXNwb25zZU1zZ1N0YXJ0ICsgQVRUQUNITUVOVF9SRVRVUk4gKyByZXNwb25zZU1zZ0VuZDsNCi0gICAgICAgIHJlc3BvbnNlID0gZmFjdG9yeS5jcmVhdGVNZXNzYWdlKG51bGwsIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShyZXNwb25zZVhNTC5nZXRCeXRlcygpKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIENyZWF0ZSBhbmQgYXR0YWNoIHRoZSBhdHRhY2htZW50DQotICAgICAgICBBdHRhY2htZW50UGFydCBhcCA9IHJlc3BvbnNlLmNyZWF0ZUF0dGFjaG1lbnRQYXJ0KFNvYXBNZXNzYWdlUHJvdmlkZXIuVEVYVF9YTUxfQVRUQUNITUVOVCwgInRleHQveG1sIik7DQotICAgICAgICBhcC5zZXRDb250ZW50SWQoSUQpOw0KLSAgICAgICAgcmVzcG9uc2UuYWRkQXR0YWNobWVudFBhcnQoYXApOw0KLSAgICAgICAgDQotICAgICAgICByZXR1cm4gcmVzcG9uc2U7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBHZXQgdGhlIHJlc3BvbnNlIGZvciBhbiBYTUwgYW5kIGFuIE1UT00gQXR0YWNobWVudCByZXF1ZXN0DQotICAgICAqIEBwYXJhbSByZXF1ZXN0DQotICAgICAqIEBwYXJhbSBkYXRhRWxlbWVudA0KLSAgICAgKiBAcmV0dXJuIFNPQVBNZXNzYWdlDQotICAgICAqLw0KLSAgICBwcml2YXRlIFNPQVBNZXNzYWdlIGdldFhNTE1UT01SZXNwb25zZShTT0FQTWVzc2FnZSByZXF1ZXN0LCBTT0FQRWxlbWVudCBkYXRhRWxlbWVudCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBTT0FQTWVzc2FnZSByZXNwb25zZTsNCi0NCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUmVjZWl2ZWQgTVRPTSBNZXNzYWdlIik7DQotICAgICAgICAvLyBBZGRpdGlvbmFsIGFzc2VydGlvbiBjaGVja3MNCi0gICAgICAgIGFzc2VydFRydWUoY291bnRBdHRhY2htZW50cyhyZXF1ZXN0KSA9PSAxKTsNCi0gICAgICAgIEF0dGFjaG1lbnRQYXJ0IHJlcXVlc3RBUCA9IChBdHRhY2htZW50UGFydCkgcmVxdWVzdC5nZXRBdHRhY2htZW50cygpLm5leHQoKTsNCi0gICAgICAgIFN0cmVhbVNvdXJjZSBjb250ZW50U1MgPSAoU3RyZWFtU291cmNlKSByZXF1ZXN0QVAuZ2V0Q29udGVudCgpOw0KLSAgICAgICAgU3RyaW5nIGNvbnRlbnQgPSBnZXRBc1N0cmluZyhjb250ZW50U1MpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShjb250ZW50LmNvbnRhaW5zKFNvYXBNZXNzYWdlUHJvdmlkZXIuVEVYVF9YTUxfQVRUQUNITUVOVCkpOw0KLQ0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUaGUgTVRPTSBSZXF1ZXN0IE1lc3NhZ2UgYXBwZWFycyBjb3JyZWN0LiIpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBCdWlsZCB0aGUgUmVzcG9uc2UNCi0gICAgICAgIE1lc3NhZ2VGYWN0b3J5IGZhY3RvcnkgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpOw0KLSAgICAgICAgU3RyaW5nIHJlc3BvbnNlWE1MID0gcmVzcG9uc2VNc2dTdGFydCArIE1UT01fUkVUVVJOICsgcmVzcG9uc2VNc2dFbmQ7DQotICAgICAgICByZXNwb25zZSA9IGZhY3RvcnkuY3JlYXRlTWVzc2FnZShudWxsLCBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ocmVzcG9uc2VYTUwuZ2V0Qnl0ZXMoKSkpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBDcmVhdGUgYW5kIGF0dGFjaCB0aGUgYXR0YWNobWVudA0KLSAgICAgICAgQXR0YWNobWVudFBhcnQgYXAgPSByZXNwb25zZS5jcmVhdGVBdHRhY2htZW50UGFydChTb2FwTWVzc2FnZVByb3ZpZGVyLlRFWFRfWE1MX0FUVEFDSE1FTlQsICJ0ZXh0L3htbCIpOw0KLSAgICAgICAgYXAuc2V0Q29udGVudElkKElEKTsNCi0gICAgICAgIHJlc3BvbnNlLmFkZEF0dGFjaG1lbnRQYXJ0KGFwKTsNCi0NCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUmV0dXJuaW5nIHRoZSBSZXNwb25zZSBNZXNzYWdlIik7DQotICAgICAgICByZXR1cm4gcmVzcG9uc2U7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBHZXQgdGhlIHJlc3BvbnNlIGZvciBhbiBYTUwgYW5kIGFuIE1UT00gQXR0YWNobWVudCByZXF1ZXN0DQotICAgICAqIEBwYXJhbSByZXF1ZXN0DQotICAgICAqIEBwYXJhbSBkYXRhRWxlbWVudA0KLSAgICAgKiBAcmV0dXJuIFNPQVBNZXNzYWdlDQotICAgICAqLw0KLSAgICBwcml2YXRlIFNPQVBNZXNzYWdlIGdldFhNTFNXQVJlZlJlc3BvbnNlKFNPQVBNZXNzYWdlIHJlcXVlc3QsIFNPQVBFbGVtZW50IGRhdGFFbGVtZW50KSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIFNPQVBNZXNzYWdlIHJlc3BvbnNlOw0KLSAgICAgICAgDQotICAgICAgICAvLyBBZGRpdGlvbmFsIGFzc2VydGlvbiBjaGVja3MNCi0gICAgICAgIGFzc2VydFRydWUoY291bnRBdHRhY2htZW50cyhyZXF1ZXN0KSA9PSAxKTsNCi0gICAgICAgIEF0dGFjaG1lbnRQYXJ0IHJlcXVlc3RBUCA9IChBdHRhY2htZW50UGFydCkgcmVxdWVzdC5nZXRBdHRhY2htZW50cygpLm5leHQoKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVxdWVzdEFQLmdldENvbnRlbnRJZCgpLmVxdWFscyhJRCkpOw0KLSAgICAgICAgU3RyZWFtU291cmNlIGNvbnRlbnRTUyA9IChTdHJlYW1Tb3VyY2UpIHJlcXVlc3RBUC5nZXRDb250ZW50KCk7DQotICAgICAgICBTdHJpbmcgY29udGVudCA9IGdldEFzU3RyaW5nKGNvbnRlbnRTUyk7DQotICAgICAgICBhc3NlcnRUcnVlKGNvbnRlbnQuY29udGFpbnMoU29hcE1lc3NhZ2VQcm92aWRlci5URVhUX1hNTF9BVFRBQ0hNRU5UKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIEJ1aWxkIHRoZSBSZXNwb25zZQ0KLSAgICAgICAgTWVzc2FnZUZhY3RvcnkgZmFjdG9yeSA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKCk7DQotICAgICAgICBTdHJpbmcgcmVzcG9uc2VYTUwgPSByZXNwb25zZU1zZ1N0YXJ0ICsgU1dBUkVGX1JFVFVSTiArIHJlc3BvbnNlTXNnRW5kOw0KLSAgICAgICAgcmVzcG9uc2UgPSBmYWN0b3J5LmNyZWF0ZU1lc3NhZ2UobnVsbCwgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHJlc3BvbnNlWE1MLmdldEJ5dGVzKCkpKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQ3JlYXRlIGFuZCBhdHRhY2ggdGhlIGF0dGFjaG1lbnQNCi0gICAgICAgIEF0dGFjaG1lbnRQYXJ0IGFwID0gcmVzcG9uc2UuY3JlYXRlQXR0YWNobWVudFBhcnQoU29hcE1lc3NhZ2VQcm92aWRlci5URVhUX1hNTF9BVFRBQ0hNRU5ULCAidGV4dC94bWwiKTsNCi0gICAgICAgIGFwLnNldENvbnRlbnRJZChJRCk7DQotICAgICAgICByZXNwb25zZS5hZGRBdHRhY2htZW50UGFydChhcCk7DQotICAgICAgICANCi0gICAgICAgIHJldHVybiByZXNwb25zZTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHJpdmF0ZSB2b2lkIHRocm93U09BUEZhdWx0RXhjZXB0aW9uKCkgdGhyb3dzIFNPQVBGYXVsdEV4Y2VwdGlvbiB7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5IG1mID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoKTsNCi0gICAgICAgICAgICBTT0FQRmFjdG9yeSBzZiA9IFNPQVBGYWN0b3J5Lm5ld0luc3RhbmNlKCk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgU09BUE1lc3NhZ2UgbSA9IG1mLmNyZWF0ZU1lc3NhZ2UoKTsNCi0gICAgICAgICAgICBTT0FQQm9keSBib2R5ID0gbS5nZXRTT0FQQm9keSgpOw0KLSAgICAgICAgICAgIFNPQVBGYXVsdCBmYXVsdCA9IGJvZHkuYWRkRmF1bHQoKTsNCi0gICAgICAgICAgICBRTmFtZSBmYXVsdENvZGUgPSBuZXcgUU5hbWUoU09BUENvbnN0YW50cy5VUklfTlNfU09BUF8xXzFfRU5WRUxPUEUsICJDbGllbnQiKTsgDQotICAgICAgICAgICAgZmF1bHQuc2V0RmF1bHRDb2RlKGZhdWx0Q29kZSk7DQotICAgICAgICAgICAgZmF1bHQuc2V0RmF1bHRTdHJpbmcoInNhbXBsZSBmYXVsdCIpOw0KLSAgICAgICAgICAgIERldGFpbCBkZXRhaWwgPSBmYXVsdC5hZGREZXRhaWwoKTsNCi0gICAgICAgICAgICBOYW1lIGRlTmFtZSA9IHNmLmNyZWF0ZU5hbWUoImRldGFpbEVudHJ5Iik7DQotICAgICAgICAgICAgU09BUEVsZW1lbnQgZGV0YWlsRW50cnkgPSBkZXRhaWwuYWRkRGV0YWlsRW50cnkoZGVOYW1lKTsNCi0gICAgICAgICAgICBkZXRhaWxFbnRyeS5hZGRUZXh0Tm9kZSgic2FtcGxlIGRldGFpbCIpOw0KLSAgICAgICAgICAgIGZhdWx0LnNldEZhdWx0QWN0b3IoInNhbXBsZSBhY3RvciIpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIFNPQVBGYXVsdEV4Y2VwdGlvbiBzZmUgPSBuZXcgU09BUEZhdWx0RXhjZXB0aW9uKGZhdWx0KTsNCi0gICAgICAgICAgICB0aHJvdyBzZmU7DQotICAgICAgICB9IGNhdGNoIChTT0FQRmF1bHRFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIHRocm93IGU7DQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICANCi0gICAgcHJpdmF0ZSB2b2lkIHRocm93V2ViU2VydmljZUV4Y2VwdGlvbigpIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsNCi0gICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKCJBIFdTRSB3YXMgdGhyb3duIik7DQotICAgIH0NCi0gICAgLyoqDQotICAgICAqIENvdW50IEF0dGFjaG1lbnRzDQotICAgICAqIEBwYXJhbSBtc2cNCi0gICAgICogQHJldHVybg0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBpbnQgY291bnRBdHRhY2htZW50cyhTT0FQTWVzc2FnZSBtc2cpIHsNCi0gICAgICAgIEl0ZXJhdG9yIGl0ID0gbXNnLmdldEF0dGFjaG1lbnRzKCk7DQotICAgICAgICBpbnQgY291bnQgPSAwOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShpdCAhPSBudWxsKTsNCi0gICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsNCi0gICAgICAgICAgICBpdC5uZXh0KCk7DQotICAgICAgICAgICAgY291bnQrKzsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBjb3VudDsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QXNTdHJpbmcoU3RyZWFtU291cmNlIHNzKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIA0KLSAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsNCi0gICAgICAgIFJlc3VsdCByZXN1bHQgPSBuZXcgU3RyZWFtUmVzdWx0KG91dCk7DQotICAgICAgICBUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1RyYW5zZm9ybWVyKCk7DQotICAgICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0oc3MsIHJlc3VsdCk7IA0KLSAgICAgICAgU3RyaW5nIHRleHQgPSBuZXcgU3RyaW5nKG91dC50b0J5dGVBcnJheSgpKTsNCi0gICAgICAgIHJldHVybiB0ZXh0Ow0KLSAgICB9DQotICAgIA0KLSAgICBwcml2YXRlIHZvaWQgYXNzZXJ0VHJ1ZShib29sZWFuIHRlc3RBc3NlcnRpb24pIHsNCi0gICAgICAgIGlmICghdGVzdEFzc2VydGlvbikgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJBc3NlcnRpb24gZmFsc2UiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQlwcml2YXRlIFNPQVBNZXNzYWdlIGdldFNPQVAxMlJlc3BvbnNlKCkgdGhyb3dzIFNPQVBFeGNlcHRpb24sIElPRXhjZXB0aW9uew0KLQkJTWVzc2FnZUZhY3RvcnkgZmFjdG9yeSA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKFNPQVBDb25zdGFudHMuU09BUF8xXzJfUFJPVE9DT0wpOw0KLQkJTWltZUhlYWRlcnMgaGVhZGVyID0gbmV3IE1pbWVIZWFkZXJzKCk7DQotCQloZWFkZXIuYWRkSGVhZGVyKCJDb250ZW50LVR5cGUiLCAiYXBwbGljYXRpb24vc29hcCt4bWwiKTsNCi0gICAgICAgIFN0cmluZyByZXNwb25zZVhNTCA9IFNPQVAxMl9FTlZFTE9QRV9IRUFEICsiPHJldHVybj4iK1hNTF9TT0FQMTJfUkVTUE9OU0UrIjwvcmV0dXJuPiIgKyBTT0FQMTJfRU5WRUxPUEVfVEFJTDsNCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ3JlYXRpbmcgU09BUDEyIFJlc3BvbnNlIik7DQotICAgICAgICByZXR1cm4gZmFjdG9yeS5jcmVhdGVNZXNzYWdlKGhlYWRlciwgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHJlc3BvbnNlWE1MLmdldEJ5dGVzKCkpKTsNCi0JfQ0KLX0NCi0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvc29hcGJpbmRpbmcvc3RyaW5nL1N0cmluZ1Byb3ZpZGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvc29hcGJpbmRpbmcvc3RyaW5nL1N0cmluZ1Byb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlZDNhYjIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyL3NvYXBiaW5kaW5nL3N0cmluZy9TdHJpbmdQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm92aWRlci5zb2FwYmluZGluZy5zdHJpbmc7DQotDQotaW1wb3J0IGphdmF4LnhtbC53cy5CaW5kaW5nVHlwZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLlByb3ZpZGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2VNb2RlOw0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZVByb3ZpZGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLkNvbnN0YW50czsNCi1AV2ViU2VydmljZVByb3ZpZGVyKHNlcnZpY2VOYW1lPSJTT0FQQmluZGluZ1N0cmluZ1Byb3ZpZGVyU2VydmljZSIsIA0KLQkJdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vU3RyaW5nUHJvdmlkZXIuc29hcGJpbmRpbmcucHJvdmlkZXIuamF4d3MuYXhpczIuYXBhY2hlLm9yZyIsDQotCQlwb3J0TmFtZT0iU09BUEJpbmRpbmdTdHJpbmdQcm92aWRlclBvcnQiKQ0KLUBTZXJ2aWNlTW9kZSh2YWx1ZT1TZXJ2aWNlLk1vZGUuUEFZTE9BRCkNCi1AQmluZGluZ1R5cGUoQ29uc3RhbnRzLlNPQVBfSFRUUF9CSU5ESU5HKQ0KLS8qDQotICogUHJvdmlkZXIgd2l0aCBQQVlMT0FEIE1vZGUgb24gU2VydmVyLCB3aWxsIHJlY2VpdmUgc29hcDExIGFuZCBzb2FwMTIgcmVxdWVzdHMuDQotICovDQotcHVibGljIGNsYXNzIFN0cmluZ1Byb3ZpZGVyIGltcGxlbWVudHMgUHJvdmlkZXI8U3RyaW5nPiB7DQotCXB1YmxpYyBTdHJpbmcgaW52b2tlKFN0cmluZyBvYmopIHsNCi0JCWlmKG9iaiA9PSBudWxsKXsNCi0JCQlyZXR1cm4gbnVsbDsNCi0JCX0NCi0JCXJldHVybiAiPHJldHVybj5IZWxsbyBTdHJpbmcgUHJvdmlkZXI8L3JldHVybj4iOw0KLQl9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9zb2FwYmluZGluZy90ZXN0cy9TT0FQQmluZGluZ1Byb3ZpZGVyVGVzdHMuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9zb2FwYmluZGluZy90ZXN0cy9TT0FQQmluZGluZ1Byb3ZpZGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTkyZTQ1Ny4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvc29hcGJpbmRpbmcvdGVzdHMvU09BUEJpbmRpbmdQcm92aWRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm92aWRlci5zb2FwYmluZGluZy50ZXN0czsNCi0NCi0NCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCi0NCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi1pbXBvcnQgamF2YXgueG1sLnNvYXAuTWVzc2FnZUZhY3Rvcnk7DQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLk1pbWVIZWFkZXJzOw0KLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQQ29uc3RhbnRzOw0KLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRW52ZWxvcGU7DQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBFeGNlcHRpb247DQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBNZXNzYWdlOw0KLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQUGFydDsNCi1pbXBvcnQgamF2YXgueG1sLndzLkJpbmRpbmdQcm92aWRlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLkRpc3BhdGNoOw0KLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5mcmFtZXdvcmsuQWJzdHJhY3RUZXN0Q2FzZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wb2x5bW9ycGhpYy5zaGFwZS50ZXN0cy5Qb2x5bW9ycGhpY1Rlc3RzOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOw0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLQ0KLXB1YmxpYyBjbGFzcyBTT0FQQmluZGluZ1Byb3ZpZGVyVGVzdHMgZXh0ZW5kcyBBYnN0cmFjdFRlc3RDYXNlIHsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgZW5kcG9pbnRVcmwgPSAiaHR0cDovL2xvY2FsaG9zdDo2MDYwL2F4aXMyL3NlcnZpY2VzL1NPQVBCaW5kaW5nUHJvdmlkZXJTZXJ2aWNlLlNPQVBCaW5kaW5nUHJvdmlkZXJQb3J0IjsNCi0gICAgcHJpdmF0ZSBRTmFtZSBzZXJ2aWNlTmFtZSA9IG5ldyBRTmFtZSgiaHR0cDovL1NPQVBCaW5kaW5nUHJvdmlkZXIucHJvdmlkZXIuamF4d3MuYXhpczIuYXBhY2hlLm9yZyIsICJTT0FQQmluZGluZ1Byb3ZpZGVyU2VydmljZSIpOw0KLSAgICBwcml2YXRlIFFOYW1lIHBvcnROYW1lID0gIG5ldyBRTmFtZSgiaHR0cDovL1NPQVBCaW5kaW5nUHJvdmlkZXIucHJvdmlkZXIuamF4d3MuYXhpczIuYXBhY2hlLm9yZyIsICJTT0FQQmluZGluZ1Byb3ZpZGVyUG9ydCIpOw0KLSAgICANCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNPQVAxMV9OU19VUkkgPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09BUDEyX05TX1VSSSA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUiOw0KLQ0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTT0FQMTFfRU5WRUxPUEVfSEVBRCA9ICI8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSd1dGYtOCc/PiIgKyANCi0JIjxzb2FwZW52OkVudmVsb3BlIHhtbG5zOnNvYXBlbnY9XCIiICsgU09BUDExX05TX1VSSSArICJcIj4iICsNCi0JIjxzb2FwZW52OkhlYWRlciAvPiIgKyANCi0JIjxzb2FwZW52OkJvZHk+IjsNCi0NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09BUDEyX0VOVkVMT1BFX0hFQUQgPSANCi0JCSI8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSd1dGYtOCc/PiIgKyANCi0JCSI8c29hcGVudjpFbnZlbG9wZSB4bWxuczpzb2FwZW52PVwiIiArIFNPQVAxMl9OU19VUkkgKyAiXCI+IiArDQotCQkiPHNvYXBlbnY6SGVhZGVyIC8+IiArIA0KLQkJIjxzb2FwZW52OkJvZHk+IjsNCi0NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09BUDExX0VOVkVMT1BFX1RBSUwgPSANCi0JCSI8L3NvYXBlbnY6Qm9keT4iICsgDQotCQkiPC9zb2FwZW52OkVudmVsb3BlPiI7DQotDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNPQVAxMl9FTlZFTE9QRV9UQUlMID0gDQotCQkiPC9zb2FwZW52OkJvZHk+IiArIA0KLQkJIjwvc29hcGVudjpFbnZlbG9wZT4iOw0KLQ0KLQ0KLQlTdHJpbmcgcmVxdWVzdCA9ICI8aW52b2tlT3A+SGVsbG8gV29ybGQ8L2ludm9rZU9wPiI7DQotDQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsNCi0gICAgICAgIHJldHVybiBnZXRUZXN0U2V0dXAobmV3IFRlc3RTdWl0ZShTT0FQQmluZGluZ1Byb3ZpZGVyVGVzdHMuY2xhc3MpKTsNCi0gICAgfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdFNvYXAxMVJlcXVlc3QoKXsNCi0JCXRyeXsNCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigidGVzdDogIiArIGdldE5hbWUoKSk7DQotCQkJDQotCQkJRGlzcGF0Y2g8U09BUE1lc3NhZ2U+IGRpc3BhdGNoPWdldERpc3BhdGNoKCk7DQotCQkJU3RyaW5nIHNvYXBNZXNzYWdlID0gZ2V0U09BUDExTWVzc2FnZSgpOw0KLQkJCU1lc3NhZ2VGYWN0b3J5IGZhY3RvcnkgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpOw0KLQkJCVNPQVBNZXNzYWdlIG1lc3NhZ2UgPSBmYWN0b3J5LmNyZWF0ZU1lc3NhZ2UobnVsbCwgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHNvYXBNZXNzYWdlLmdldEJ5dGVzKCkpKTsNCi0JCQlPYmplY3Qgb2JqID0gZGlzcGF0Y2guaW52b2tlKG1lc3NhZ2UpOw0KLQkJCWFzc2VydFRydWUob2JqIT1udWxsICYmIG9iaiBpbnN0YW5jZW9mIFNPQVBNZXNzYWdlKTsNCi0JCQlhc3NlcnRUcnVlKGdldFZlcnNpb25VUkkobWVzc2FnZSkuZXF1YWxzKFNPQVAxMV9OU19VUkkpKTsNCi0JCX1jYXRjaChFeGNlcHRpb24gZSl7DQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJGYWlsdXJlIHdoaWxlIHNlbmRpbmcgc29hcCAxMSByZXF1ZXN0Iik7DQotCQkJU3lzdGVtLm91dC5wcmludGxuKGUuZ2V0TWVzc2FnZSgpKTsNCi0JCQlmYWlsKCk7DQotCQl9DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdFNvYXAxMlJlcXVlc3QoKXsNCi0JCXRyeXsNCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigidGVzdDogIiArIGdldE5hbWUoKSk7DQotCQkJDQotCQkJRGlzcGF0Y2g8U09BUE1lc3NhZ2U+IGRpc3BhdGNoPWdldERpc3BhdGNoKCk7DQotCQkJU3RyaW5nIHNvYXBNZXNzYWdlID0gZ2V0U09BUDEyTWVzc2FnZSgpOw0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigic29hcCBtZXNzYWdlID0iK3NvYXBNZXNzYWdlKTsNCi0JCQlNZXNzYWdlRmFjdG9yeSBmYWN0b3J5ID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoU09BUENvbnN0YW50cy5TT0FQXzFfMl9QUk9UT0NPTCk7DQotCQkJTWltZUhlYWRlcnMgaGVhZGVyID0gbmV3IE1pbWVIZWFkZXJzKCk7DQotCQkJaGVhZGVyLmFkZEhlYWRlcigiQ29udGVudC1UeXBlIiwgImFwcGxpY2F0aW9uL3NvYXAreG1sIik7DQotCQkJU09BUE1lc3NhZ2UgbWVzc2FnZSA9IGZhY3RvcnkuY3JlYXRlTWVzc2FnZShoZWFkZXIsIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShzb2FwTWVzc2FnZS5nZXRCeXRlcygpKSk7DQotCQkJT2JqZWN0IG9iaiA9IGRpc3BhdGNoLmludm9rZShtZXNzYWdlKTsNCi0JCQlhc3NlcnRUcnVlKG9iaiE9bnVsbCAmJiBvYmogaW5zdGFuY2VvZiBTT0FQTWVzc2FnZSk7DQotCQkJYXNzZXJ0VHJ1ZShnZXRWZXJzaW9uVVJJKG1lc3NhZ2UpLmVxdWFscyhTT0FQMTJfTlNfVVJJKSk7DQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJQcm92aWRlciBlbmRwb2ludCB3YXMgYWJsZSB0byByZWNlaXZlIGJvdGggU09BUCAxMSBhbmQgU09BUCAxMiByZXF1ZXN0Iik7DQotCQl9Y2F0Y2goRXhjZXB0aW9uIGUpew0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXhwZWN0aW5nIHRoYXQgZW5kcG9pbnQgd2lsbCBiZSBhYmxlIHRvIHJlY2VpdmUgc29hcCAxMiBhbmQgc29hcCAxMSByZXF1ZXN0Iik7DQotCQkJU3lzdGVtLm91dC5wcmludGxuKGUuZ2V0TWVzc2FnZSgpKTsNCi0JCQlmYWlsKCk7DQotCQkJDQotCQl9DQotCX0NCi0JDQotCXByaXZhdGUgRGlzcGF0Y2g8U09BUE1lc3NhZ2U+IGdldERpc3BhdGNoKCl7DQotCQlTZXJ2aWNlIHN2YyA9IFNlcnZpY2UuY3JlYXRlKHNlcnZpY2VOYW1lKTsNCi0gICAgICAgIHN2Yy5hZGRQb3J0KHBvcnROYW1lLCBudWxsLCBlbmRwb2ludFVybCk7DQotICAgICAgICBEaXNwYXRjaDxTT0FQTWVzc2FnZT4gZGlzcGF0Y2ggPSBzdmMuY3JlYXRlRGlzcGF0Y2gocG9ydE5hbWUsIFNPQVBNZXNzYWdlLmNsYXNzLCBTZXJ2aWNlLk1vZGUuTUVTU0FHRSk7DQotICAgICAgICBCaW5kaW5nUHJvdmlkZXIgcCA9IChCaW5kaW5nUHJvdmlkZXIpIGRpc3BhdGNoOw0KLSAgICAgICAgcC5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dChCaW5kaW5nUHJvdmlkZXIuRU5EUE9JTlRfQUREUkVTU19QUk9QRVJUWSwgZW5kcG9pbnRVcmwpOw0KLSAgICAgICAgcmV0dXJuIGRpc3BhdGNoOw0KLQl9DQotCQ0KLQlwcml2YXRlIFN0cmluZyBnZXRTT0FQMTFNZXNzYWdlKCkgdGhyb3dzIFNPQVBFeGNlcHRpb24sIElPRXhjZXB0aW9uew0KLQkJcmV0dXJuIFNPQVAxMV9FTlZFTE9QRV9IRUFEK3JlcXVlc3QrU09BUDExX0VOVkVMT1BFX1RBSUw7DQotCX0NCi0JDQotCXByaXZhdGUgU3RyaW5nIGdldFNPQVAxMk1lc3NhZ2UoKSB0aHJvd3MgU09BUEV4Y2VwdGlvbiwgSU9FeGNlcHRpb257DQotCQlyZXR1cm4gU09BUDEyX0VOVkVMT1BFX0hFQUQrcmVxdWVzdCtTT0FQMTJfRU5WRUxPUEVfVEFJTDsJDQotCX0NCi0JDQotCXByaXZhdGUgU3RyaW5nIGdldFZlcnNpb25VUkkoU09BUE1lc3NhZ2Ugc29hcE1lc3NhZ2UpdGhyb3dzIFNPQVBFeGNlcHRpb257DQotCQlTT0FQUGFydCBzcCA9IHNvYXBNZXNzYWdlLmdldFNPQVBQYXJ0KCk7DQotCQlTT0FQRW52ZWxvcGUgZW52ZWxvcGUgPSBzcC5nZXRFbnZlbG9wZSgpOw0KLQkJcmV0dXJuIGVudmVsb3BlLmdldE5hbWVzcGFjZVVSSSgpOw0KLQl9DQotfQ0KLQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9zb2FwYmluZGluZy90ZXN0cy9Tb2FwTWVzc2FnZVByb3ZpZGVyVGVzdHMuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9zb2FwYmluZGluZy90ZXN0cy9Tb2FwTWVzc2FnZVByb3ZpZGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTEwNWI3YS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvc29hcGJpbmRpbmcvdGVzdHMvU29hcE1lc3NhZ2VQcm92aWRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MjcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm92aWRlci5zb2FwYmluZGluZy50ZXN0czsNCi0NCi0NCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KLQ0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOw0KLWltcG9ydCBqYXZheC54bWwuc29hcC5BdHRhY2htZW50UGFydDsNCi1pbXBvcnQgamF2YXgueG1sLnNvYXAuRGV0YWlsRW50cnk7DQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLk1lc3NhZ2VGYWN0b3J5Ow0KLWltcG9ydCBqYXZheC54bWwuc29hcC5Ob2RlOw0KLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQQm9keTsNCi1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUENvbnN0YW50czsNCi1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEVsZW1lbnQ7DQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBGYXVsdDsNCi1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUE1lc3NhZ2U7DQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVNvdXJjZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLkRpc3BhdGNoOw0KLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuU09BUEZhdWx0RXhjZXB0aW9uOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOw0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmZyYW1ld29yay5BYnN0cmFjdFRlc3RDYXNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnBvbHltb3JwaGljLnNoYXBlLnRlc3RzLlBvbHltb3JwaGljVGVzdHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJvdmlkZXIuc29hcGJpbmRpbmcuc29hcG1zZy5Tb2FwTWVzc2FnZVByb3ZpZGVyOw0KLQ0KLS8qKg0KLSAqIFRlc3RzIERpc3BhdGNoPFNPQVBNZXNzYWdlPiBjbGllbnQgYW5kIGEgUHJvdmlkZXI8U09BUE1lc3NhZ2U+IHNlcnZpY2UuDQotICogVGhlIGNsaWVudCBhbmQgc2VydmljZSBpbnRlcmFjdGlvbiB0ZXN0cyB2YXJpb3VzIHhtbCBhbmQgYXR0YWNobWVudCBzY2VuYXJpb3MNCi0gKg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBTb2FwTWVzc2FnZVByb3ZpZGVyVGVzdHMgZXh0ZW5kcyBBYnN0cmFjdFRlc3RDYXNlIHsNCi0JcHJpdmF0ZSBTdHJpbmcgZW5kcG9pbnRVcmwgPSAiaHR0cDovL2xvY2FsaG9zdDo2MDYwL2F4aXMyL3NlcnZpY2VzL1NvYXBNZXNzYWdlUHJvdmlkZXJTZXJ2aWNlLlNvYXBNZXNzYWdlUHJvdmlkZXJQb3J0IjsNCi0JcHJpdmF0ZSBRTmFtZSBzZXJ2aWNlTmFtZSA9IG5ldyBRTmFtZSgiaHR0cDovL3NvYXBtc2cuc29hcGJpbmRpbmcucHJvdmlkZXIuamF4d3MuYXhpczIuYXBhY2hlLm9yZyIsICJTT0FQQmluZGluZ1NvYXBNZXNzYWdlUHJvdmlkZXJTZXJ2aWNlIik7DQotCXByaXZhdGUgUU5hbWUgcG9ydE5hbWUgPSAgbmV3IFFOYW1lKCJodHRwOi8vc29hcG1zZy5zb2FwYmluZGluZy5wcm92aWRlci5qYXh3cy5heGlzMi5hcGFjaGUub3JnIiwgIlNvYXBNZXNzYWdlUHJvdmlkZXJQb3J0Iik7DQotDQotCXByaXZhdGUgU3RyaW5nIHJlcU1zZ1N0YXJ0ID0gIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PiIgKw0KLQkiPHNvYXA6RW52ZWxvcGUgeG1sbnM6c29hcD1cImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvXCI+PHNvYXA6Qm9keT4iOw0KLQk7DQotDQotCXByaXZhdGUgU3RyaW5nIHJlcU1zZ0VuZCA9ICI8L3NvYXA6Qm9keT48L3NvYXA6RW52ZWxvcGU+IjsNCi0NCi0JcHJpdmF0ZSBTdHJpbmcgWE1MX0lOVk9LRSA9ICI8bnMyOmludm9rZU9wIHhtbG5zOm5zMj1cImh0dHA6Ly9vcmcudGVzdC5zb2FwbWVzc2FnZVwiPjxpbnZva2Vfc3RyPiIgKyANCi0JU29hcE1lc3NhZ2VQcm92aWRlci5YTUxfUkVRVUVTVCArDQotCSI8L2ludm9rZV9zdHI+PC9uczI6aW52b2tlT3A+IjsNCi0JcHJpdmF0ZSBTdHJpbmcgRU1QVFlCT0RZX0lOVk9LRSA9ICI8bnMyOmludm9rZU9wIHhtbG5zOm5zMj1cImh0dHA6Ly9vcmcudGVzdC5zb2FwbWVzc2FnZVwiPjxpbnZva2Vfc3RyPiIgKyANCi0JU29hcE1lc3NhZ2VQcm92aWRlci5YTUxfRU1QVFlCT0RZX1JFUVVFU1QgKw0KLQkiPC9pbnZva2Vfc3RyPjwvbnMyOmludm9rZU9wPiI7DQotCXByaXZhdGUgU3RyaW5nIENIRUNLSEVBREVSU19JTlZPS0UgPSAiPG5zMjppbnZva2VPcCB4bWxuczpuczI9XCJodHRwOi8vb3JnLnRlc3Quc29hcG1lc3NhZ2VcIj48aW52b2tlX3N0cj4iICsgDQotCVNvYXBNZXNzYWdlUHJvdmlkZXIuWE1MX0NIRUNLSEVBREVSU19SRVFVRVNUICsNCi0JIjwvaW52b2tlX3N0cj48L25zMjppbnZva2VPcD4iOw0KLQlwcml2YXRlIFN0cmluZyBBVFRBQ0hNRU5UX0lOVk9LRSA9ICI8bnMyOmludm9rZU9wIHhtbG5zOm5zMj1cImh0dHA6Ly9vcmcudGVzdC5zb2FwbWVzc2FnZVwiPjxpbnZva2Vfc3RyPiIgKyANCi0JU29hcE1lc3NhZ2VQcm92aWRlci5YTUxfQVRUQUNITUVOVF9SRVFVRVNUICsNCi0JIjwvaW52b2tlX3N0cj48L25zMjppbnZva2VPcD4iOw0KLQlwcml2YXRlIFN0cmluZyBNVE9NX0lOVk9LRSA9ICI8bnMyOmludm9rZU9wIHhtbG5zOm5zMj1cImh0dHA6Ly9vcmcudGVzdC5zb2FwbWVzc2FnZVwiPjxpbnZva2Vfc3RyPiIgKyANCi0JU29hcE1lc3NhZ2VQcm92aWRlci5YTUxfTVRPTV9SRVFVRVNUICsNCi0JIjwvaW52b2tlX3N0cj4iICsgDQotCVNvYXBNZXNzYWdlUHJvdmlkZXIuTVRPTV9SRUYgKw0KLQkiPC9uczI6aW52b2tlT3A+IjsNCi0JcHJpdmF0ZSBTdHJpbmcgU1dBUkVGX0lOVk9LRSA9ICI8bnMyOmludm9rZU9wIHhtbG5zOm5zMj1cImh0dHA6Ly9vcmcudGVzdC5zb2FwbWVzc2FnZVwiPjxpbnZva2Vfc3RyPiIgKyANCi0JU29hcE1lc3NhZ2VQcm92aWRlci5YTUxfU1dBUkVGX1JFUVVFU1QgKw0KLQkiPC9pbnZva2Vfc3RyPiIgKyANCi0JU29hcE1lc3NhZ2VQcm92aWRlci5TV0FSRUZfUkVGICsNCi0JIjwvbnMyOmludm9rZU9wPiI7ICAgDQotCXByaXZhdGUgU3RyaW5nIFhNTF9GQVVMVF9JTlZPS0UgPSAiPG5zMjppbnZva2VPcCB4bWxuczpuczI9XCJodHRwOi8vb3JnLnRlc3Quc29hcG1lc3NhZ2VcIj48aW52b2tlX3N0cj4iICsgDQotCVNvYXBNZXNzYWdlUHJvdmlkZXIuWE1MX0ZBVUxUX1JFUVVFU1QgKw0KLQkiPC9pbnZva2Vfc3RyPjwvbnMyOmludm9rZU9wPiI7DQotCXByaXZhdGUgU3RyaW5nIFhNTF9XU0VfSU5WT0tFID0gIjxuczI6aW52b2tlT3AgeG1sbnM6bnMyPVwiaHR0cDovL29yZy50ZXN0LnNvYXBtZXNzYWdlXCI+PGludm9rZV9zdHI+IiArIA0KLQlTb2FwTWVzc2FnZVByb3ZpZGVyLlhNTF9XU0VfUkVRVUVTVCArDQotCSI8L2ludm9rZV9zdHI+PC9uczI6aW52b2tlT3A+IjsNCi0JcHJpdmF0ZSBTdHJpbmcgWE1MX1NPQVAxMl9GQVVMVF9JTlZPS0UgPSAiPG5zMjppbnZva2VPcCB4bWxuczpuczI9XCJodHRwOi8vb3JnLnRlc3Quc29hcG1lc3NhZ2VcIj48aW52b2tlX3N0cj4iICsgDQotCVNvYXBNZXNzYWdlUHJvdmlkZXIuWE1MX1NPQVAxMl9GQVVMVF9SRVFVRVNUICsNCi0JIjwvaW52b2tlX3N0cj48L25zMjppbnZva2VPcD4iOyAgDQotCXByaXZhdGUgU3RyaW5nIFhNTF9TT0FQMTJfUkVTUE9OU0VfSU5WT0tFID0gIjxuczI6aW52b2tlT3AgeG1sbnM6bnMyPVwiaHR0cDovL29yZy50ZXN0LnNvYXBtZXNzYWdlXCI+PGludm9rZV9zdHI+IiArIA0KLQlTb2FwTWVzc2FnZVByb3ZpZGVyLlhNTF9TT0FQMTJfUkVTUE9OU0UgKw0KLQkiPC9pbnZva2Vfc3RyPjwvbnMyOmludm9rZU9wPiI7DQotCQ0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7DQotICAgICAgICByZXR1cm4gZ2V0VGVzdFNldHVwKG5ldyBUZXN0U3VpdGUoU29hcE1lc3NhZ2VQcm92aWRlclRlc3RzLmNsYXNzKSk7DQotICAgIH0NCi0JLyoqDQotCSAqIFNlbmRzIGFuIFNPQVBNZXNzYWdlIGNvbnRhaW5pbmcgb25seSB4bWwgZGF0YSANCi0JICogUHJvdmlkZXIgd2lsbCB0aHJvdyBhIEZhdWx0DQotCSAqLw0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJvdmlkZXJTT0FQTWVzc2FnZVNPQVBGYXVsdCgpIHRocm93cyBFeGNlcHRpb24gew0KLQ0KLQkJLy8gQ3JlYXRlIHRoZSBkaXNwYXRjaA0KLQkJRGlzcGF0Y2g8U09BUE1lc3NhZ2U+IGRpc3BhdGNoID0gY3JlYXRlRGlzcGF0Y2goKTsNCi0NCi0JCS8vIENyZWF0ZSB0aGUgU09BUE1lc3NhZ2UNCi0JCVN0cmluZyBtc2cgPSByZXFNc2dTdGFydCArIFhNTF9GQVVMVF9JTlZPS0UgKyByZXFNc2dFbmQ7DQotCQlNZXNzYWdlRmFjdG9yeSBmYWN0b3J5ID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoKTsNCi0JCVNPQVBNZXNzYWdlIHJlcXVlc3QgPSBmYWN0b3J5LmNyZWF0ZU1lc3NhZ2UobnVsbCwgDQotCQkJCW5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShtc2cuZ2V0Qnl0ZXMoKSkpOw0KLQ0KLQkJLy8gVGVzdCB0aGUgdHJhbnNwb3J0IGhlYWRlcnMgYnkgc2VuZGluZyBhIGNvbnRlbnQgZGVzY3JpcHRpb24NCi0JCXJlcXVlc3Quc2V0Q29udGVudERlc2NyaXB0aW9uKFNvYXBNZXNzYWdlUHJvdmlkZXIuWE1MX0ZBVUxUX1JFUVVFU1QpOw0KLQ0KLQkJdHJ5IHsNCi0JCQkvLyBEaXNwYXRjaA0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiPj4gSW52b2tpbmcgU09BUE1lc3NhZ2VQcm92aWRlckRpc3BhdGNoIik7DQotCQkJU09BUE1lc3NhZ2UgcmVzcG9uc2UgPSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7DQotCQkJYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgZmFpbHVyZSIsIGZhbHNlKTsNCi0JCX0gY2F0Y2ggKFNPQVBGYXVsdEV4Y2VwdGlvbiBlKSB7DQotCQkJLy8gT2theQ0KLQkJCVNPQVBGYXVsdCBmYXVsdCA9IGUuZ2V0RmF1bHQoKTsNCi0JCQlhc3NlcnRUcnVlKGZhdWx0ICE9IG51bGwpOw0KLQkJCWFzc2VydFRydWUoZmF1bHQuZ2V0RmF1bHRTdHJpbmcoKS5lcXVhbHMoInNhbXBsZSBmYXVsdCIpKTsNCi0JCQlRTmFtZSBleHBlY3RlZEZhdWx0Q29kZSA9IG5ldyBRTmFtZShTT0FQQ29uc3RhbnRzLlVSSV9OU19TT0FQXzFfMV9FTlZFTE9QRSwgIkNsaWVudCIpOyANCi0JCQlhc3NlcnRUcnVlKGZhdWx0LmdldEZhdWx0Q29kZUFzUU5hbWUoKS5lcXVhbHMoZXhwZWN0ZWRGYXVsdENvZGUpKTsNCi0JCQlhc3NlcnRUcnVlKGZhdWx0LmdldERldGFpbCgpICE9IG51bGwpOw0KLQkJCURldGFpbEVudHJ5IGRlID0gKERldGFpbEVudHJ5KSBmYXVsdC5nZXREZXRhaWwoKS5nZXREZXRhaWxFbnRyaWVzKCkubmV4dCgpOw0KLQkJCWFzc2VydFRydWUoZGUgIT0gbnVsbCk7DQotCQkJYXNzZXJ0VHJ1ZShkZS5nZXRMb2NhbE5hbWUoKS5lcXVhbHMoImRldGFpbEVudHJ5IikpOw0KLQkJCWFzc2VydFRydWUoZGUuZ2V0VmFsdWUoKS5lcXVhbHMoInNhbXBsZSBkZXRhaWwiKSk7DQotCQkJYXNzZXJ0VHJ1ZShmYXVsdC5nZXRGYXVsdEFjdG9yKCkuZXF1YWxzKCJzYW1wbGUgYWN0b3IiKSk7DQotCQl9ICAgIA0KLQ0KLQkJLy8gVHJ5IGEgc2Vjb25kIHRpbWUNCi0JCXRyeSB7DQotCQkJLy8gRGlzcGF0Y2gNCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIj4+IEludm9raW5nIFNPQVBNZXNzYWdlUHJvdmlkZXJEaXNwYXRjaCIpOw0KLQkJCVNPQVBNZXNzYWdlIHJlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLQkJCWFzc2VydFRydWUoIkV4cGVjdGVkIGZhaWx1cmUiLCBmYWxzZSk7DQotCQl9IGNhdGNoIChTT0FQRmF1bHRFeGNlcHRpb24gZSkgew0KLQkJCS8vIE9rYXkNCi0JCQlTT0FQRmF1bHQgZmF1bHQgPSBlLmdldEZhdWx0KCk7DQotCQkJYXNzZXJ0VHJ1ZShmYXVsdCAhPSBudWxsKTsNCi0JCQlhc3NlcnRUcnVlKGZhdWx0LmdldEZhdWx0U3RyaW5nKCkuZXF1YWxzKCJzYW1wbGUgZmF1bHQiKSk7DQotCQkJUU5hbWUgZXhwZWN0ZWRGYXVsdENvZGUgPSBuZXcgUU5hbWUoU09BUENvbnN0YW50cy5VUklfTlNfU09BUF8xXzFfRU5WRUxPUEUsICJDbGllbnQiKTsgDQotCQkJYXNzZXJ0VHJ1ZShmYXVsdC5nZXRGYXVsdENvZGVBc1FOYW1lKCkuZXF1YWxzKGV4cGVjdGVkRmF1bHRDb2RlKSk7DQotCQkJYXNzZXJ0VHJ1ZShmYXVsdC5nZXREZXRhaWwoKSAhPSBudWxsKTsNCi0JCQlEZXRhaWxFbnRyeSBkZSA9IChEZXRhaWxFbnRyeSkgZmF1bHQuZ2V0RGV0YWlsKCkuZ2V0RGV0YWlsRW50cmllcygpLm5leHQoKTsNCi0JCQlhc3NlcnRUcnVlKGRlICE9IG51bGwpOw0KLQkJCWFzc2VydFRydWUoZGUuZ2V0TG9jYWxOYW1lKCkuZXF1YWxzKCJkZXRhaWxFbnRyeSIpKTsNCi0JCQlhc3NlcnRUcnVlKGRlLmdldFZhbHVlKCkuZXF1YWxzKCJzYW1wbGUgZGV0YWlsIikpOw0KLQkJCWFzc2VydFRydWUoZmF1bHQuZ2V0RmF1bHRBY3RvcigpLmVxdWFscygic2FtcGxlIGFjdG9yIikpOw0KLQkJfSAgICANCi0JfQ0KLQ0KLQ0KLQkvKioNCi0JICogU2VuZHMgYW4gU09BUE1lc3NhZ2UgY29udGFpbmluZyBvbmx5IHhtbCBkYXRhIA0KLQkgKiBQcm92aWRlciB3aWxsIHRocm93IGEgZ2VuZXJpYyBXZWJTZXJ2aWNlc0V4Y2VwdGlvbg0KLQkgKi8NCi0JcHVibGljIHZvaWQgdGVzdFByb3ZpZGVyU09BUE1lc3NhZ2VXZWJTZXJ2aWNlRXhjZXB0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotDQotCQkvLyBDcmVhdGUgdGhlIGRpc3BhdGNoDQotCQlEaXNwYXRjaDxTT0FQTWVzc2FnZT4gZGlzcGF0Y2ggPSBjcmVhdGVEaXNwYXRjaCgpOw0KLQ0KLQkJLy8gQ3JlYXRlIHRoZSBTT0FQTWVzc2FnZQ0KLQkJU3RyaW5nIG1zZyA9IHJlcU1zZ1N0YXJ0ICsgWE1MX1dTRV9JTlZPS0UgKyByZXFNc2dFbmQ7DQotCQlNZXNzYWdlRmFjdG9yeSBmYWN0b3J5ID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoKTsNCi0JCVNPQVBNZXNzYWdlIHJlcXVlc3QgPSBmYWN0b3J5LmNyZWF0ZU1lc3NhZ2UobnVsbCwgDQotCQkJCW5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShtc2cuZ2V0Qnl0ZXMoKSkpOw0KLQ0KLQkJLy8gVGVzdCB0aGUgdHJhbnNwb3J0IGhlYWRlcnMgYnkgc2VuZGluZyBhIGNvbnRlbnQgZGVzY3JpcHRpb24NCi0JCXJlcXVlc3Quc2V0Q29udGVudERlc2NyaXB0aW9uKFNvYXBNZXNzYWdlUHJvdmlkZXIuWE1MX1dTRV9SRVFVRVNUKTsNCi0NCi0JCXRyeSB7DQotCQkJLy8gRGlzcGF0Y2gNCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIj4+IEludm9raW5nIFNPQVBNZXNzYWdlUHJvdmlkZXJEaXNwYXRjaCIpOw0KLQkJCVNPQVBNZXNzYWdlIHJlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLQkJCWFzc2VydFRydWUoIkV4cGVjdGVkIGZhaWx1cmUiLCBmYWxzZSk7DQotCQl9IGNhdGNoIChTT0FQRmF1bHRFeGNlcHRpb24gZSkgew0KLQkJCS8vIE9rYXkuLi5TT0FQRmF1bHRFeGNlcHRpb24gc2hvdWxkIGJlIHRocm93bg0KLQkJCVNPQVBGYXVsdCBmYXVsdCA9IGUuZ2V0RmF1bHQoKTsNCi0JCQlhc3NlcnRUcnVlKGZhdWx0ICE9IG51bGwpOw0KLQkJCWFzc2VydFRydWUoZmF1bHQuZ2V0RmF1bHRTdHJpbmcoKS5lcXVhbHMoIkEgV1NFIHdhcyB0aHJvd24iKSk7DQotCQl9ICAgDQotDQotCQkvLyBUcnkgYSBzZWNvbmQgdGltZQ0KLQkJdHJ5IHsNCi0JCQkvLyBEaXNwYXRjaA0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiPj4gSW52b2tpbmcgU09BUE1lc3NhZ2VQcm92aWRlckRpc3BhdGNoIik7DQotCQkJU09BUE1lc3NhZ2UgcmVzcG9uc2UgPSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7DQotCQkJYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgZmFpbHVyZSIsIGZhbHNlKTsNCi0JCX0gY2F0Y2ggKFNPQVBGYXVsdEV4Y2VwdGlvbiBlKSB7DQotCQkJLy8gT2theS4uLlNPQVBGYXVsdEV4Y2VwdGlvbiBzaG91bGQgYmUgdGhyb3duDQotCQkJU09BUEZhdWx0IGZhdWx0ID0gZS5nZXRGYXVsdCgpOw0KLQkJCWFzc2VydFRydWUoZmF1bHQgIT0gbnVsbCk7DQotCQkJYXNzZXJ0VHJ1ZShmYXVsdC5nZXRGYXVsdFN0cmluZygpLmVxdWFscygiQSBXU0Ugd2FzIHRocm93biIpKTsNCi0JCX0gDQotCX0NCi0NCi0NCi0JLyoqDQotCSAqIFNlbmRzIGFuIFNPQVBNZXNzYWdlIGNvbnRhaW5pbmcgeG1sIGRhdGEgYW5kIHJhdyBhdHRhY2htZW50cyB0byB0aGUgd2ViIHNlcnZpY2UuICANCi0JICogUmVjZWl2ZXMgYSByZXNwb25zZSBjb250YWluaW5nIHhtbCBkYXRhIGFuZCB0aGUgc2FtZSByYXcgYXR0YWNobWVudHMuDQotCSAqLw0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJvdmlkZXJTT0FQTWVzc2FnZVJhd0F0dGFjaG1lbnQoKXsNCi0JCS8vIFJhdyBBdHRhY2htZW50cyBhcmUgYXR0YWNobWVudHMgdGhhdCBhcmUgbm90IHJlZmVyZW5jZWQgaW4gdGhlIHhtbCB3aXRoIE1UT00gb3IgU1dBUmVmLg0KLQkJLy8gQ3VycmVudGx5IHRoZXJlIGlzIG5vIHN1cHBvcnQgaW4gQXhpcyAyIGZvciB0aGVzZSBraW5kcyBvZiBhdHRhY2htZW50cy4NCi0JCS8vIFRoZSBiZWxpZWYgaXMgdGhhdCBtb3N0IGN1c3RvbWVycyB3aWxsIHVzZSBNVE9NLiAgU29tZSBsZWdhY3kgY3VzdG9tZXJzIHdpbGwgdXNlIFNXQVJlZi4NCi0JCS8vIFJhdyBBdHRhY2htZW50cyBtYXkgYmUgc28gb2xkIHRoYXQgbm8gY3VzdG9tZXJzIG5lZWQgdGhpcyBiZWhhdmlvci4NCi0JCXRyeXsgICAgICAgDQotCQkJLy8gQ3JlYXRlIHRoZSBkaXNwYXRjaA0KLQkJCURpc3BhdGNoPFNPQVBNZXNzYWdlPiBkaXNwYXRjaCA9IGNyZWF0ZURpc3BhdGNoKCk7DQotDQotCQkJLy8gQ3JlYXRlIHRoZSBTT0FQTWVzc2FnZQ0KLQkJCVN0cmluZyBtc2cgPSByZXFNc2dTdGFydCArIEFUVEFDSE1FTlRfSU5WT0tFICsgcmVxTXNnRW5kOw0KLQkJCU1lc3NhZ2VGYWN0b3J5IGZhY3RvcnkgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpOw0KLQkJCVNPQVBNZXNzYWdlIHJlcXVlc3QgPSBmYWN0b3J5LmNyZWF0ZU1lc3NhZ2UobnVsbCwgDQotCQkJCQluZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0obXNnLmdldEJ5dGVzKCkpKTsNCi0NCi0JCQkvLyBBZGQgdGhlIEF0dGFjaG1lbnQNCi0JCQlBdHRhY2htZW50UGFydCBhcCA9IHJlcXVlc3QuY3JlYXRlQXR0YWNobWVudFBhcnQoU29hcE1lc3NhZ2VQcm92aWRlci5URVhUX1hNTF9BVFRBQ0hNRU5ULCAidGV4dC94bWwiKTsNCi0JCQlhcC5zZXRDb250ZW50SWQoU29hcE1lc3NhZ2VQcm92aWRlci5JRCk7DQotCQkJcmVxdWVzdC5hZGRBdHRhY2htZW50UGFydChhcCk7DQotDQotCQkJLy8gRGlzcGF0Y2gNCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIj4+IEludm9raW5nIFNPQVBNZXNzYWdlUHJvdmlkZXJEaXNwYXRjaCIpOw0KLQkJCVNPQVBNZXNzYWdlIHJlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLQ0KLQkJCS8vIENoZWNrIGFzc2VydGlvbnMgYW5kIGdldCB0aGUgZGF0YSBlbGVtZW50DQotCQkJU09BUEVsZW1lbnQgZGF0YUVsZW1lbnQgPSBhc3NlcnRSZXNwb25zZVhNTChyZXNwb25zZSwgU29hcE1lc3NhZ2VQcm92aWRlci5YTUxfQVRUQUNITUVOVF9SRVNQT05TRSk7DQotCQkJYXNzZXJ0VHJ1ZShjb3VudEF0dGFjaG1lbnRzKHJlc3BvbnNlKSA9PSAxKTsNCi0NCi0JCQkvLyBHZXQgdGhlIEF0dGFjaG1lbnQNCi0JCQlBdHRhY2htZW50UGFydCBhdHRhY2htZW50UGFydCA9IChBdHRhY2htZW50UGFydCkgcmVzcG9uc2UuZ2V0QXR0YWNobWVudHMoKS5uZXh0KCk7DQotDQotCQkJLy8gQ2hlY2sgdGhlIGF0dGFjaG1lbnQNCi0JCQlTdHJlYW1Tb3VyY2UgY29udGVudFNTID0gKFN0cmVhbVNvdXJjZSkgYXR0YWNobWVudFBhcnQuZ2V0Q29udGVudCgpOw0KLQkJCVN0cmluZyBjb250ZW50ID0gU29hcE1lc3NhZ2VQcm92aWRlci5nZXRBc1N0cmluZyhjb250ZW50U1MpOw0KLQkJCWFzc2VydFRydWUoY29udGVudCAhPSBudWxsKTsNCi0JCQlhc3NlcnRUcnVlKGNvbnRlbnQuY29udGFpbnMoU29hcE1lc3NhZ2VQcm92aWRlci5URVhUX1hNTF9BVFRBQ0hNRU5UKSk7DQotDQotCQkJLy8gUHJpbnQgb3V0IHRoZSByZXNwb25zZQ0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiPj4gUmVzcG9uc2UgWyIgKyByZXNwb25zZS50b1N0cmluZygpICsgIl0iKTsNCi0NCi0NCi0JCQkvLyBUcnkgYSBzZWNvbmQgdGltZQ0KLQkJCS8vIERpc3BhdGNoDQotCQkJU3lzdGVtLm91dC5wcmludGxuKCI+PiBJbnZva2luZyBTT0FQTWVzc2FnZVByb3ZpZGVyRGlzcGF0Y2giKTsNCi0JCQlyZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0NCi0JCQkvLyBDaGVjayBhc3NlcnRpb25zIGFuZCBnZXQgdGhlIGRhdGEgZWxlbWVudA0KLQkJCWRhdGFFbGVtZW50ID0gYXNzZXJ0UmVzcG9uc2VYTUwocmVzcG9uc2UsIFNvYXBNZXNzYWdlUHJvdmlkZXIuWE1MX0FUVEFDSE1FTlRfUkVTUE9OU0UpOw0KLQkJCWFzc2VydFRydWUoY291bnRBdHRhY2htZW50cyhyZXNwb25zZSkgPT0gMSk7DQotDQotCQkJLy8gR2V0IHRoZSBBdHRhY2htZW50DQotCQkJYXR0YWNobWVudFBhcnQgPSAoQXR0YWNobWVudFBhcnQpIHJlc3BvbnNlLmdldEF0dGFjaG1lbnRzKCkubmV4dCgpOw0KLQ0KLQkJCS8vIENoZWNrIHRoZSBhdHRhY2htZW50DQotCQkJY29udGVudFNTID0gKFN0cmVhbVNvdXJjZSkgYXR0YWNobWVudFBhcnQuZ2V0Q29udGVudCgpOw0KLQkJCWNvbnRlbnQgPSBTb2FwTWVzc2FnZVByb3ZpZGVyLmdldEFzU3RyaW5nKGNvbnRlbnRTUyk7DQotCQkJYXNzZXJ0VHJ1ZShjb250ZW50ICE9IG51bGwpOw0KLQkJCWFzc2VydFRydWUoY29udGVudC5jb250YWlucyhTb2FwTWVzc2FnZVByb3ZpZGVyLlRFWFRfWE1MX0FUVEFDSE1FTlQpKTsNCi0NCi0JCQkvLyBQcmludCBvdXQgdGhlIHJlc3BvbnNlDQotCQkJU3lzdGVtLm91dC5wcmludGxuKCI+PiBSZXNwb25zZSBbIiArIHJlc3BvbnNlLnRvU3RyaW5nKCkgKyAiXSIpOw0KLQ0KLQkJfWNhdGNoKEV4Y2VwdGlvbiBlKXsNCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOw0KLQkJCWZhaWwoIkNhdWdodCBleGNlcHRpb24gIiArIGUpOw0KLQkJfQ0KLQ0KLQl9DQotDQotCS8qKg0KLQkgKiBTZW5kcyBhbiBTT0FQTWVzc2FnZSBjb250YWluaW5nIHhtbCBkYXRhIGFuZCBtdG9tIGF0dGFjaG1lbnQuICANCi0JICogUmVjZWl2ZXMgYSByZXNwb25zZSBjb250YWluaW5nIHhtbCBkYXRhIGFuZCB0aGUgbXRvbSBhdHRhY2htZW50Lg0KLQkgKi8NCi0JcHVibGljIHZvaWQgdGVzdFByb3ZpZGVyU09BUE1lc3NhZ2VNVE9NKCl7DQotCQl0cnl7ICAgICAgIA0KLQkJCS8vIENyZWF0ZSB0aGUgZGlzcGF0Y2gNCi0JCQlEaXNwYXRjaDxTT0FQTWVzc2FnZT4gZGlzcGF0Y2ggPSBjcmVhdGVEaXNwYXRjaCgpOw0KLQ0KLQkJCS8vIE1UT00gc2hvdWxkIGJlIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQuICBUaGVyZSBpcyBubyBuZWVkIHRvIHNldCBpdA0KLQkJCS8vQmluZGluZyBiaW5kaW5nID0gZGlzcGF0Y2guZ2V0QmluZGluZygpOw0KLQkJCS8vU09BUEJpbmRpbmcgc29hcEJpbmRpbmcgPSAoU09BUEJpbmRpbmcpIGJpbmRpbmc7DQotCQkJLy9zb2FwQmluZGluZy5zZXRNVE9NRW5hYmxlZCh0cnVlKTsNCi0NCi0JCQkvLyBDcmVhdGUgdGhlIFNPQVBNZXNzYWdlDQotCQkJU3RyaW5nIG1zZyA9IHJlcU1zZ1N0YXJ0ICsgTVRPTV9JTlZPS0UgKyByZXFNc2dFbmQ7DQotCQkJTWVzc2FnZUZhY3RvcnkgZmFjdG9yeSA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKCk7DQotCQkJU09BUE1lc3NhZ2UgcmVxdWVzdCA9IGZhY3RvcnkuY3JlYXRlTWVzc2FnZShudWxsLCANCi0JCQkJCW5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShtc2cuZ2V0Qnl0ZXMoKSkpOw0KLQ0KLQkJCS8vIEFkZCB0aGUgQXR0YWNobWVudA0KLQkJCUF0dGFjaG1lbnRQYXJ0IGFwID0gcmVxdWVzdC5jcmVhdGVBdHRhY2htZW50UGFydChTb2FwTWVzc2FnZVByb3ZpZGVyLlRFWFRfWE1MX0FUVEFDSE1FTlQsICJ0ZXh0L3htbCIpOw0KLQkJCWFwLnNldENvbnRlbnRJZChTb2FwTWVzc2FnZVByb3ZpZGVyLklEKTsNCi0JCQlyZXF1ZXN0LmFkZEF0dGFjaG1lbnRQYXJ0KGFwKTsNCi0NCi0JCQkvLyBEaXNwYXRjaA0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiPj4gSW52b2tpbmcgU09BUE1lc3NhZ2VQcm92aWRlckRpc3BhdGNoIik7DQotCQkJU09BUE1lc3NhZ2UgcmVzcG9uc2UgPSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7DQotDQotCQkJLy8gQ2hlY2sgYXNzZXJ0aW9ucyBhbmQgZ2V0IHRoZSBkYXRhIGVsZW1lbnQNCi0JCQlTT0FQRWxlbWVudCBkYXRhRWxlbWVudCA9IGFzc2VydFJlc3BvbnNlWE1MKHJlc3BvbnNlLCBTb2FwTWVzc2FnZVByb3ZpZGVyLlhNTF9NVE9NX1JFU1BPTlNFKTsNCi0JCQlhc3NlcnRUcnVlKGNvdW50QXR0YWNobWVudHMocmVzcG9uc2UpID09IDEpOw0KLQ0KLQkJCS8vIEdldCB0aGUgQXR0YWNobWVudA0KLQkJCUF0dGFjaG1lbnRQYXJ0IGF0dGFjaG1lbnRQYXJ0ID0gKEF0dGFjaG1lbnRQYXJ0KSByZXNwb25zZS5nZXRBdHRhY2htZW50cygpLm5leHQoKTsNCi0NCi0JCQkvLyBDaGVjayB0aGUgYXR0YWNobWVudA0KLQkJCVN0cmVhbVNvdXJjZSBjb250ZW50U1MgPSAoU3RyZWFtU291cmNlKSBhdHRhY2htZW50UGFydC5nZXRDb250ZW50KCk7DQotCQkJU3RyaW5nIGNvbnRlbnQgPSBTb2FwTWVzc2FnZVByb3ZpZGVyLmdldEFzU3RyaW5nKGNvbnRlbnRTUyk7DQotCQkJYXNzZXJ0VHJ1ZShjb250ZW50ICE9IG51bGwpOw0KLQkJCWFzc2VydFRydWUoY29udGVudC5jb250YWlucyhTb2FwTWVzc2FnZVByb3ZpZGVyLlRFWFRfWE1MX0FUVEFDSE1FTlQpKTsNCi0NCi0JCQkvLyBQcmludCBvdXQgdGhlIHJlc3BvbnNlDQotCQkJU3lzdGVtLm91dC5wcmludGxuKCI+PiBSZXNwb25zZSBbIiArIHJlc3BvbnNlLnRvU3RyaW5nKCkgKyAiXSIpOw0KLQ0KLQ0KLQkJCS8vIFRyeSBhIHNlY29uZCB0aW1lDQotCQkJLy8gRGlzcGF0Y2gNCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIj4+IEludm9raW5nIFNPQVBNZXNzYWdlUHJvdmlkZXJEaXNwYXRjaCIpOw0KLQkJCXJlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLQ0KLQkJCS8vIENoZWNrIGFzc2VydGlvbnMgYW5kIGdldCB0aGUgZGF0YSBlbGVtZW50DQotCQkJZGF0YUVsZW1lbnQgPSBhc3NlcnRSZXNwb25zZVhNTChyZXNwb25zZSwgU29hcE1lc3NhZ2VQcm92aWRlci5YTUxfTVRPTV9SRVNQT05TRSk7DQotCQkJYXNzZXJ0VHJ1ZShjb3VudEF0dGFjaG1lbnRzKHJlc3BvbnNlKSA9PSAxKTsNCi0NCi0JCQkvLyBHZXQgdGhlIEF0dGFjaG1lbnQNCi0JCQlhdHRhY2htZW50UGFydCA9IChBdHRhY2htZW50UGFydCkgcmVzcG9uc2UuZ2V0QXR0YWNobWVudHMoKS5uZXh0KCk7DQotDQotCQkJLy8gQ2hlY2sgdGhlIGF0dGFjaG1lbnQNCi0JCQljb250ZW50U1MgPSAoU3RyZWFtU291cmNlKSBhdHRhY2htZW50UGFydC5nZXRDb250ZW50KCk7DQotCQkJY29udGVudCA9IFNvYXBNZXNzYWdlUHJvdmlkZXIuZ2V0QXNTdHJpbmcoY29udGVudFNTKTsNCi0JCQlhc3NlcnRUcnVlKGNvbnRlbnQgIT0gbnVsbCk7DQotCQkJYXNzZXJ0VHJ1ZShjb250ZW50LmNvbnRhaW5zKFNvYXBNZXNzYWdlUHJvdmlkZXIuVEVYVF9YTUxfQVRUQUNITUVOVCkpOw0KLQ0KLQkJCS8vIFByaW50IG91dCB0aGUgcmVzcG9uc2UNCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIj4+IFJlc3BvbnNlIFsiICsgcmVzcG9uc2UudG9TdHJpbmcoKSArICJdIik7DQotDQotCQl9Y2F0Y2goRXhjZXB0aW9uIGUpew0KLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7DQotCQkJZmFpbCgiQ2F1Z2h0IGV4Y2VwdGlvbiAiICsgZSk7DQotCQl9DQotDQotCX0NCi0NCi0JLyoqDQotCSAqIFNlbmRzIGFuIFNPQVBNZXNzYWdlIGNvbnRhaW5pbmcgeG1sIGRhdGEgYW5kIGEgc3dhcmVmIGF0dGFjaG1lbnQgdG8gdGhlIHdlYiBzZXJ2aWNlLiAgDQotCSAqIFJlY2VpdmVzIGEgcmVzcG9uc2UgY29udGFpbmluZyB4bWwgZGF0YSBhbmQgdGhlIHN3YXJlZiBhdHRhY2htZW50IGF0dGFjaG1lbnQuDQotCSAqLw0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJvdmlkZXJTT0FQTWVzc2FnZVNXQVJlZigpew0KLQkJdHJ5eyAgICAgICANCi0JCQkvLyBDcmVhdGUgdGhlIGRpc3BhdGNoDQotCQkJRGlzcGF0Y2g8U09BUE1lc3NhZ2U+IGRpc3BhdGNoID0gY3JlYXRlRGlzcGF0Y2goKTsNCi0NCi0JCQkvLyBDcmVhdGUgdGhlIFNPQVBNZXNzYWdlDQotCQkJU3RyaW5nIG1zZyA9IHJlcU1zZ1N0YXJ0ICsgU1dBUkVGX0lOVk9LRSArIHJlcU1zZ0VuZDsNCi0JCQlNZXNzYWdlRmFjdG9yeSBmYWN0b3J5ID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoKTsNCi0JCQlTT0FQTWVzc2FnZSByZXF1ZXN0ID0gZmFjdG9yeS5jcmVhdGVNZXNzYWdlKG51bGwsIA0KLQkJCQkJbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG1zZy5nZXRCeXRlcygpKSk7DQotDQotCQkJLy8gQWRkIHRoZSBBdHRhY2htZW50DQotCQkJQXR0YWNobWVudFBhcnQgYXAgPSByZXF1ZXN0LmNyZWF0ZUF0dGFjaG1lbnRQYXJ0KFNvYXBNZXNzYWdlUHJvdmlkZXIuVEVYVF9YTUxfQVRUQUNITUVOVCwgInRleHQveG1sIik7DQotCQkJYXAuc2V0Q29udGVudElkKFNvYXBNZXNzYWdlUHJvdmlkZXIuSUQpOw0KLQkJCXJlcXVlc3QuYWRkQXR0YWNobWVudFBhcnQoYXApOw0KLQ0KLQkJCS8vIERpc3BhdGNoDQotCQkJU3lzdGVtLm91dC5wcmludGxuKCI+PiBJbnZva2luZyBTT0FQTWVzc2FnZVByb3ZpZGVyRGlzcGF0Y2giKTsNCi0JCQlTT0FQTWVzc2FnZSByZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0NCi0JCQkvLyBDaGVjayBhc3NlcnRpb25zIGFuZCBnZXQgdGhlIGRhdGEgZWxlbWVudA0KLQkJCVNPQVBFbGVtZW50IGRhdGFFbGVtZW50ID0gYXNzZXJ0UmVzcG9uc2VYTUwocmVzcG9uc2UsIFNvYXBNZXNzYWdlUHJvdmlkZXIuWE1MX1NXQVJFRl9SRVNQT05TRSk7DQotCQkJYXNzZXJ0VHJ1ZShjb3VudEF0dGFjaG1lbnRzKHJlc3BvbnNlKSA9PSAxKTsNCi0NCi0JCQkvLyBHZXQgdGhlIEF0dGFjaG1lbnQNCi0JCQlBdHRhY2htZW50UGFydCBhdHRhY2htZW50UGFydCA9IChBdHRhY2htZW50UGFydCkgcmVzcG9uc2UuZ2V0QXR0YWNobWVudHMoKS5uZXh0KCk7DQotDQotCQkJLy8gQ2hlY2sgdGhlIGF0dGFjaG1lbnQNCi0JCQlTdHJlYW1Tb3VyY2UgY29udGVudFNTID0gKFN0cmVhbVNvdXJjZSkgYXR0YWNobWVudFBhcnQuZ2V0Q29udGVudCgpOw0KLQkJCVN0cmluZyBjb250ZW50ID0gU29hcE1lc3NhZ2VQcm92aWRlci5nZXRBc1N0cmluZyhjb250ZW50U1MpOw0KLQkJCWFzc2VydFRydWUoY29udGVudCAhPSBudWxsKTsNCi0JCQlhc3NlcnRUcnVlKGNvbnRlbnQuY29udGFpbnMoU29hcE1lc3NhZ2VQcm92aWRlci5URVhUX1hNTF9BVFRBQ0hNRU5UKSk7DQotCQkJYXNzZXJ0RXF1YWxzKFNvYXBNZXNzYWdlUHJvdmlkZXIuSUQsIGF0dGFjaG1lbnRQYXJ0LmdldENvbnRlbnRJZCgpKTsNCi0NCi0JCQkvLyBQcmludCBvdXQgdGhlIHJlc3BvbnNlDQotCQkJU3lzdGVtLm91dC5wcmludGxuKCI+PiBSZXNwb25zZSBbIiArIHJlc3BvbnNlLnRvU3RyaW5nKCkgKyAiXSIpOw0KLQ0KLQ0KLQ0KLQkJCS8vIFRyeSBhIHNlY29uZCB0aW1lDQotCQkJLy8gRGlzcGF0Y2gNCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIj4+IEludm9raW5nIFNPQVBNZXNzYWdlUHJvdmlkZXJEaXNwYXRjaCIpOw0KLQkJCXJlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLQ0KLQkJCS8vIENoZWNrIGFzc2VydGlvbnMgYW5kIGdldCB0aGUgZGF0YSBlbGVtZW50DQotCQkJZGF0YUVsZW1lbnQgPSBhc3NlcnRSZXNwb25zZVhNTChyZXNwb25zZSwgU29hcE1lc3NhZ2VQcm92aWRlci5YTUxfU1dBUkVGX1JFU1BPTlNFKTsNCi0JCQlhc3NlcnRUcnVlKGNvdW50QXR0YWNobWVudHMocmVzcG9uc2UpID09IDEpOw0KLQ0KLQkJCS8vIEdldCB0aGUgQXR0YWNobWVudA0KLQkJCWF0dGFjaG1lbnRQYXJ0ID0gKEF0dGFjaG1lbnRQYXJ0KSByZXNwb25zZS5nZXRBdHRhY2htZW50cygpLm5leHQoKTsNCi0NCi0JCQkvLyBDaGVjayB0aGUgYXR0YWNobWVudA0KLQkJCWNvbnRlbnRTUyA9IChTdHJlYW1Tb3VyY2UpIGF0dGFjaG1lbnRQYXJ0LmdldENvbnRlbnQoKTsNCi0JCQljb250ZW50ID0gU29hcE1lc3NhZ2VQcm92aWRlci5nZXRBc1N0cmluZyhjb250ZW50U1MpOw0KLQkJCWFzc2VydFRydWUoY29udGVudCAhPSBudWxsKTsNCi0JCQlhc3NlcnRUcnVlKGNvbnRlbnQuY29udGFpbnMoU29hcE1lc3NhZ2VQcm92aWRlci5URVhUX1hNTF9BVFRBQ0hNRU5UKSk7DQotCQkJYXNzZXJ0RXF1YWxzKFNvYXBNZXNzYWdlUHJvdmlkZXIuSUQsIGF0dGFjaG1lbnRQYXJ0LmdldENvbnRlbnRJZCgpKTsNCi0NCi0JCQkvLyBQcmludCBvdXQgdGhlIHJlc3BvbnNlDQotCQkJU3lzdGVtLm91dC5wcmludGxuKCI+PiBSZXNwb25zZSBbIiArIHJlc3BvbnNlLnRvU3RyaW5nKCkgKyAiXSIpOw0KLQ0KLQkJfWNhdGNoKEV4Y2VwdGlvbiBlKXsNCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOw0KLQkJCWZhaWwoIkNhdWdodCBleGNlcHRpb24gIiArIGUpOw0KLQkJfQ0KLQ0KLQl9DQotDQotCS8qIFRoaXMgaXMgYSBuZWdhdGl2ZSB0ZXN0IGNhc2UgZm9yIGEgUHJvdmlkZXIgdGhhdCBoYXMgTk8gU09BUEJpbmRpbmcgcmVzdHJpY3Rpb24NCi0JICogRGlzcGF0Y2ggd2lsbCBzZW5kIGEgU09BUDExIHJlcXVlc3QgYW5kIFByb3ZpZGVyIHdpbGwgc2VuZCBhIFNPQVAxMiBSZXNwb25zZS4NCi0JICovDQotCXB1YmxpYyB2b2lkIHRlc3RTb2FwMTFSZXF1ZXN0V2l0aFNvYXAxMlJlc3BvbnNlKCl7DQotCQlTT0FQTWVzc2FnZSByZXF1ZXN0ID0gbnVsbDsNCi0JCURpc3BhdGNoPFNPQVBNZXNzYWdlPiBkaXNwYXRjaCA9IG51bGw7DQotCQl0cnl7DQotCQkJLy8gQ3JlYXRlIHRoZSBkaXNwYXRjaA0KLQkJCWRpc3BhdGNoID0gY3JlYXRlRGlzcGF0Y2goKTsNCi0JCQkvLyBDcmVhdGUgdGhlIFNPQVBNZXNzYWdlDQotCQkJU3RyaW5nIG1zZyA9IHJlcU1zZ1N0YXJ0ICsgWE1MX1NPQVAxMl9SRVNQT05TRV9JTlZPS0UgKyByZXFNc2dFbmQ7DQotCQkJTWVzc2FnZUZhY3RvcnkgZmFjdG9yeSA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKCk7DQotCQkJcmVxdWVzdCA9IGZhY3RvcnkuY3JlYXRlTWVzc2FnZShudWxsLCANCi0JCQkJCW5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShtc2cuZ2V0Qnl0ZXMoKSkpOw0KLQkJfWNhdGNoKEV4Y2VwdGlvbiBlKXsNCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOw0KLQkJCWZhaWwoIkNhdWdodCBFeGNlcHRpb24gIitlKTsNCi0JCX0NCi0JCXRyeXsNCi0JCQlTT0FQTWVzc2FnZSByZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0JCQlhc3NlcnRUcnVlKCJFeHBlY3RpbmcgRmFpbHVyZSIsIGZhbHNlKTsNCi0JCX1jYXRjaChTT0FQRmF1bHRFeGNlcHRpb24gZSl7DQotCQkJU09BUEZhdWx0IGZhdWx0ID0gZS5nZXRGYXVsdCgpOw0KLQkJCWFzc2VydFRydWUoZmF1bHQgIT0gbnVsbCk7DQotCQkJYXNzZXJ0VHJ1ZShmYXVsdC5nZXRGYXVsdFN0cmluZygpLmVxdWFscygiUmVxdWVzdCBTT0FQIG1lc3NhZ2UgcHJvdG9jb2wgaXMgdmVyc2lvbiAxLjEsIGJ1dCBSZXNwb25zZSBTT0FQIG1lc3NhZ2UgaXMgY29uZmlndXJlZCBmb3IgU09BUCAxLjIuICBUaGlzIGlzIG5vdCBzdXBwb3J0ZWQuIikpOw0KLQkJfQ0KLQkJDQotCX0NCi0JLyoqDQotCSAqIEByZXR1cm4NCi0JICogQHRocm93cyBFeGNlcHRpb24NCi0JICovDQotCXByaXZhdGUgRGlzcGF0Y2g8U09BUE1lc3NhZ2U+IGNyZWF0ZURpc3BhdGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotDQotDQotCQlTZXJ2aWNlIHN2YyA9IFNlcnZpY2UuY3JlYXRlKHNlcnZpY2VOYW1lKTsNCi0JCXN2Yy5hZGRQb3J0KHBvcnROYW1lLG51bGwsIGVuZHBvaW50VXJsKTsNCi0JCURpc3BhdGNoPFNPQVBNZXNzYWdlPiBkaXNwYXRjaCA9IA0KLQkJCXN2Yy5jcmVhdGVEaXNwYXRjaChwb3J0TmFtZSwgU09BUE1lc3NhZ2UuY2xhc3MsIFNlcnZpY2UuTW9kZS5NRVNTQUdFKTsNCi0JCXJldHVybiBkaXNwYXRjaDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQHJldHVybg0KLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbg0KLQkgKi8NCi0JcHJpdmF0ZSBEaXNwYXRjaDxTdHJpbmc+IGNyZWF0ZVN0cmluZ0Rpc3BhdGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotDQotDQotCQlTZXJ2aWNlIHN2YyA9IFNlcnZpY2UuY3JlYXRlKHNlcnZpY2VOYW1lKTsNCi0JCXN2Yy5hZGRQb3J0KHBvcnROYW1lLG51bGwsIGVuZHBvaW50VXJsKTsNCi0JCURpc3BhdGNoPFN0cmluZz4gZGlzcGF0Y2ggPSANCi0JCQlzdmMuY3JlYXRlRGlzcGF0Y2gocG9ydE5hbWUsIFN0cmluZy5jbGFzcywgU2VydmljZS5Nb2RlLlBBWUxPQUQpOw0KLQkJcmV0dXJuIGRpc3BhdGNoOw0KLQl9DQotDQotCS8qKg0KLQkgKiBDb21tb24gYXNzZXJ0aW9uIGNoZWNraW5nIG9mIHRoZSByZXNwb25zZQ0KLQkgKiBAcGFyYW0gbXNnDQotCSAqIEBwYXJhbSBleHBlY3RlZFRleHQNCi0JICogQHJldHVybiBTT0FQRWxlbWVudCByZXByZXNlbnRpbmcgdGhlIGRhdGEgZWxlbWVudA0KLQkgKi8NCi0JcHJpdmF0ZSBTT0FQRWxlbWVudCBhc3NlcnRSZXNwb25zZVhNTChTT0FQTWVzc2FnZSBtc2csIFN0cmluZyBleHBlY3RlZFRleHQpIHRocm93cyBFeGNlcHRpb24gew0KLQkJYXNzZXJ0VHJ1ZShtc2cgIT0gbnVsbCk7DQotCQlTT0FQQm9keSBib2R5ID0gbXNnLmdldFNPQVBCb2R5KCk7DQotCQlhc3NlcnRUcnVlKGJvZHkgIT0gbnVsbCk7DQotDQotCQlOb2RlIGludm9rZUVsZW1lbnQgPSAoTm9kZSkgYm9keS5nZXRGaXJzdENoaWxkKCk7DQotCQlhc3NlcnRUcnVlKGludm9rZUVsZW1lbnQgaW5zdGFuY2VvZiBTT0FQRWxlbWVudCk7DQotCQlhc3NlcnRFcXVhbHMoU29hcE1lc3NhZ2VQcm92aWRlci5SRVNQT05TRV9OQU1FLCBpbnZva2VFbGVtZW50LmdldExvY2FsTmFtZSgpKTsNCi0NCi0JCU5vZGUgZGF0YUVsZW1lbnQgPSAoTm9kZSkgaW52b2tlRWxlbWVudC5nZXRGaXJzdENoaWxkKCk7DQotCQlhc3NlcnRUcnVlKGRhdGFFbGVtZW50IGluc3RhbmNlb2YgU09BUEVsZW1lbnQpOw0KLQkJYXNzZXJ0RXF1YWxzKFNvYXBNZXNzYWdlUHJvdmlkZXIuUkVTUE9OU0VfREFUQV9OQU1FLCBkYXRhRWxlbWVudC5nZXRMb2NhbE5hbWUoKSk7DQotDQotCQkvLyBUT0RPIEFYSVMyIFNBQUogc2hvdWxkIChidXQgZG9lcyBub3QpIHN1cHBvcnQgdGhlIGdldFRleHRDb250ZW50KCk7DQotCQkvLyBTdHJpbmcgdGV4dCA9IGRhdGFFbGVtZW50LmdldFRleHRDb250ZW50KCk7DQotCQlTdHJpbmcgdGV4dCA9IGRhdGFFbGVtZW50LmdldFZhbHVlKCk7DQotCQlhc3NlcnRFcXVhbHMoIkZvdW5kICgiKyB0ZXh0ICsgIikgYnV0IGV4cGVjdGVkICgiICsgZXhwZWN0ZWRUZXh0ICsgIikiLCBleHBlY3RlZFRleHQsIHRleHQpOw0KLQ0KLQkJcmV0dXJuIChTT0FQRWxlbWVudCkgZGF0YUVsZW1lbnQ7DQotCX0NCi0NCi0JLyoqDQotCSAqIENvdW50IEF0dGFjaG1lbnRzDQotCSAqIEBwYXJhbSBtc2cNCi0JICogQHJldHVybg0KLQkgKi8NCi0JcHJpdmF0ZSBpbnQgY291bnRBdHRhY2htZW50cyhTT0FQTWVzc2FnZSBtc2cpIHsNCi0JCUl0ZXJhdG9yIGl0ID0gbXNnLmdldEF0dGFjaG1lbnRzKCk7DQotCQlpbnQgY291bnQgPSAwOw0KLQkJYXNzZXJ0VHJ1ZShpdCAhPSBudWxsKTsNCi0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsNCi0JCQlpdC5uZXh0KCk7DQotCQkJY291bnQrKzsNCi0JCX0NCi0JCXJldHVybiBjb3VudDsNCi0JfQ0KLX0NCi0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvc29hcGJpbmRpbmcvdGVzdHMvU3RyaW5nUHJvdmlkZXJUZXN0cy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyL3NvYXBiaW5kaW5nL3Rlc3RzL1N0cmluZ1Byb3ZpZGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2IzMjQ4Ni4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvc29hcGJpbmRpbmcvdGVzdHMvU3RyaW5nUHJvdmlkZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm92aWRlci5zb2FwYmluZGluZy50ZXN0czsNCi0NCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsNCi0NCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi1pbXBvcnQgamF2YXgueG1sLnNvYXAuTWVzc2FnZUZhY3Rvcnk7DQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBFbnZlbG9wZTsNCi1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUE1lc3NhZ2U7DQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBQYXJ0Ow0KLWltcG9ydCBqYXZheC54bWwud3MuRGlzcGF0Y2g7DQotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5TT0FQQmluZGluZzsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZnJhbWV3b3JrLkFic3RyYWN0VGVzdENhc2U7DQotDQotcHVibGljIGNsYXNzIFN0cmluZ1Byb3ZpZGVyVGVzdHMgZXh0ZW5kcyBBYnN0cmFjdFRlc3RDYXNlIHsNCi0JcHJpdmF0ZSBTdHJpbmcgZW5kcG9pbnRVcmwgPSAiaHR0cDovL2xvY2FsaG9zdDo2MDYwL2F4aXMyL3NlcnZpY2VzL1NPQVBCaW5kaW5nU3RyaW5nUHJvdmlkZXJTZXJ2aWNlLlNPQVBCaW5kaW5nU3RyaW5nUHJvdmlkZXJQb3J0IjsNCi0JcHJpdmF0ZSBRTmFtZSBzZXJ2aWNlTmFtZSA9IG5ldyBRTmFtZSgiaHR0cDovL1N0cmluZ1Byb3ZpZGVyLnNvYXBiaW5kaW5nLnByb3ZpZGVyLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciLCAiU09BUEJpbmRpbmdTdHJpbmdQcm92aWRlclNlcnZpY2UiKTsNCi0JcHJpdmF0ZSBRTmFtZSBwb3J0TmFtZSA9ICBuZXcgUU5hbWUoImh0dHA6Ly9TdHJpbmdQcm92aWRlci5zb2FwYmluZGluZy5wcm92aWRlci5qYXh3cy5heGlzMi5hcGFjaGUub3JnIiwgIlNPQVBCaW5kaW5nU3RyaW5nUHJvdmlkZXJQb3J0Iik7DQotDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTT0FQMTFfTlNfVVJJID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIjsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNPQVAxMl9OU19VUkkgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIjsNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09BUDExX0VOVkVMT1BFX0hFQUQgPSAiPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0ndXRmLTgnPz4iICsgDQotCSI8c29hcGVudjpFbnZlbG9wZSB4bWxuczpzb2FwZW52PVwiIiArIFNPQVAxMV9OU19VUkkgKyAiXCI+IiArDQotCSI8c29hcGVudjpIZWFkZXIgLz4iICsgDQotCSI8c29hcGVudjpCb2R5PiI7DQotDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNPQVAxMl9FTlZFTE9QRV9IRUFEID0gDQotCQkiPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0ndXRmLTgnPz4iICsgDQotCQkiPHNvYXBlbnY6RW52ZWxvcGUgeG1sbnM6c29hcGVudj1cIiIgKyBTT0FQMTJfTlNfVVJJICsgIlwiPiIgKw0KLQkJIjxzb2FwZW52OkhlYWRlciAvPiIgKyANCi0JCSI8c29hcGVudjpCb2R5PiI7DQotDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNPQVAxMV9FTlZFTE9QRV9UQUlMID0gDQotCQkiPC9zb2FwZW52OkJvZHk+IiArIA0KLQkJIjwvc29hcGVudjpFbnZlbG9wZT4iOw0KLQ0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTT0FQMTJfRU5WRUxPUEVfVEFJTCA9IA0KLQkJIjwvc29hcGVudjpCb2R5PiIgKyANCi0JCSI8L3NvYXBlbnY6RW52ZWxvcGU+IjsNCi0JDQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsNCi0gICAgICAgIHJldHVybiBnZXRUZXN0U2V0dXAobmV3IFRlc3RTdWl0ZShTdHJpbmdQcm92aWRlclRlc3RzLmNsYXNzKSk7DQotICAgIH0NCi0vKg0KLSAqIFRoaXMgdGVzdCBjYXNlIG1ha2VzIHN1cmUgdGhhdCB3ZSByZWNlaXZlIGEgc29hcDExIHJlc3BvbnNlIGZvciBhIHNvYXAxMSByZXF1ZXN0Lg0KLSAqLw0KLQlwdWJsaWMgdm9pZCB0ZXN0c29hcDExcmVxdWVzdCgpew0KLQkJU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0JCVN5c3RlbS5vdXQucHJpbnRsbigidGVzdDogIiArIGdldE5hbWUoKSk7DQotCQl0cnl7DQotCQkJU2VydmljZSBzdmMgPSBTZXJ2aWNlLmNyZWF0ZShzZXJ2aWNlTmFtZSk7DQotCQkJc3ZjLmFkZFBvcnQocG9ydE5hbWUsIFNPQVBCaW5kaW5nLlNPQVAxMUhUVFBfQklORElORywgZW5kcG9pbnRVcmwpOw0KLQ0KLQkJCURpc3BhdGNoPFN0cmluZz4gZGlzcGF0Y2ggPQ0KLQkJCQlzdmMuY3JlYXRlRGlzcGF0Y2gocG9ydE5hbWUsIFN0cmluZy5jbGFzcywgU2VydmljZS5Nb2RlLk1FU1NBR0UpOw0KLQkJCVN0cmluZyB4bWxNZXNzYWdlID0gU09BUDExX0VOVkVMT1BFX0hFQUQrIjxpbnZva2VPcD5zb2FwMTEgcmVxdWVzdDwvaW52b2tlT3A+IitTT0FQMTFfRU5WRUxPUEVfVEFJTDsNCi0JCQlTdHJpbmcgcmVzcG9uc2UgPSBkaXNwYXRjaC5pbnZva2UoeG1sTWVzc2FnZSk7DQotDQotCQkJTWVzc2FnZUZhY3RvcnkgZmFjdG9yeSA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKCk7DQotCQkJU09BUE1lc3NhZ2Ugc29hcE1lc3NhZ2UgPSBmYWN0b3J5LmNyZWF0ZU1lc3NhZ2UobnVsbCwgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHJlc3BvbnNlLmdldEJ5dGVzKCkpKTsNCi0JCQlhc3NlcnRUcnVlKGdldFZlcnNpb25VUkkoc29hcE1lc3NhZ2UpLmVxdWFscyhTT0FQMTFfTlNfVVJJKSk7DQotCQl9Y2F0Y2goRXhjZXB0aW9uIGUpew0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRmFpbHVyZSB3aGlsZSBzZW5kaW5nIHNvYXAgMTEgcmVxdWVzdCIpOw0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbihlLmdldE1lc3NhZ2UoKSk7DQotCQkJZmFpbCgpOw0KLQkJfQ0KLQ0KLQl9DQotDQotCXByaXZhdGUgU3RyaW5nIGdldFZlcnNpb25VUkkoU09BUE1lc3NhZ2Ugc29hcE1lc3NhZ2UpdGhyb3dzIFNPQVBFeGNlcHRpb257DQotCQlTT0FQUGFydCBzcCA9IHNvYXBNZXNzYWdlLmdldFNPQVBQYXJ0KCk7DQotCQlTT0FQRW52ZWxvcGUgZW52ZWxvcGUgPSBzcC5nZXRFbnZlbG9wZSgpOw0KLQkJcmV0dXJuIGVudmVsb3BlLmdldE5hbWVzcGFjZVVSSSgpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9zb2FwbXNnL01FVEEtSU5GL01BTklGRVNULk1GIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyL3NvYXBtc2cvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmNGI1NjguLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyL3NvYXBtc2cvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjANCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvc29hcG1zZy9NRVRBLUlORi9Qcm92aWRlclNPQVBNZXNzYWdlLndzZGwgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvc29hcG1zZy9NRVRBLUlORi9Qcm92aWRlclNPQVBNZXNzYWdlLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjMjQ3ZjcuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyL3NvYXBtc2cvTUVUQS1JTkYvUHJvdmlkZXJTT0FQTWVzc2FnZS53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08IS0tDQotLS0+DQotDQotPGRlZmluaXRpb25zIHhtbG5zOmh0dHA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvaHR0cC8iIA0KLSAgICB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiANCi0gICAgeG1sbnM6cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIA0KLSAgICB4bWxuczp0bnM9Imh0dHA6Ly9zb2FwbXNnLnByb3ZpZGVyLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciDQotICAgIHhtbG5zOnNvYXBlbmM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIiANCi0gICAgeG1sbnM6dG09Imh0dHA6Ly9taWNyb3NvZnQuY29tL3dzZGwvbWltZS90ZXh0TWF0Y2hpbmcvIiANCi0gICAgeG1sbnM6bWltZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9taW1lLyIgDQotICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3NvYXBtc2cucHJvdmlkZXIuamF4d3MuYXhpczIuYXBhY2hlLm9yZyIgDQotICAgIHhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+DQotICA8dHlwZXM+DQotICAgICAJPHhzZDpzY2hlbWENCi0JCQl0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9zb2FwbXNnLnByb3ZpZGVyLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciDQotCQkJeG1sbnM6dG5zPSJodHRwOi8vc29hcG1zZy5wcm92aWRlci5qYXh3cy5heGlzMi5hcGFjaGUub3JnIg0KLQkJCXhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPg0KLQkJCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iU3RyaW5nQXJyYXkiPg0KLQkJCQk8eHNkOnNlcXVlbmNlPg0KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9InZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIg0KLQkJCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+DQotDQotCQkJCTwveHNkOnNlcXVlbmNlPg0KLQkJCTwveHNkOmNvbXBsZXhUeXBlPg0KLQ0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJpbk1lc3NhZ2UiIHR5cGU9InRuczpTdHJpbmdBcnJheSIgLz4NCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0ib3V0TWVzc2FnZSIgdHlwZT0idG5zOlN0cmluZ0FycmF5IiAvPg0KLQkJICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHdvV2F5RXhjZXB0aW9uRmF1bHQiIHR5cGU9InhzZDpzdHJpbmciIC8+DQotCTwveHNkOnNjaGVtYT4NCi0gICAgDQotDQotICA8L3R5cGVzPg0KLSAgIA0KLSAgPG1lc3NhZ2UgbmFtZT0iZW1wdHlNZXNzYWdlIi8+DQotICA8bWVzc2FnZSBuYW1lPSJpbk1lc3NhZ2UiPg0KLSAgICA8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJ0bnM6aW5NZXNzYWdlIiAvPg0KLSAgPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2UgbmFtZT0ib3V0TWVzc2FnZSI+DQotICAgIDxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9InRuczpvdXRNZXNzYWdlIiAvPg0KLSAgPC9tZXNzYWdlPg0KLQ0KLSAgPHBvcnRUeXBlIG5hbWU9IkVjaG9TZXJ2aWNlSW50ZXJmYWNlIj4NCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJpbnZva2VPcCI+DQotICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczppbk1lc3NhZ2UiIC8+DQotICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6b3V0TWVzc2FnZSIgLz4NCi0gICAgPC9vcGVyYXRpb24+ICANCi0gIDwvcG9ydFR5cGU+DQotDQotICA8YmluZGluZyBuYW1lPSJFY2hvU2VydmljZVNvYXAiIHR5cGU9InRuczpFY2hvU2VydmljZUludGVyZmFjZSI+DQotICAgIDxzb2FwOmJpbmRpbmcgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiIHN0eWxlPSJkb2N1bWVudCIgLz4NCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJpbnZva2VPcCI+DQotICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249ImVjaG9TdHJpbmciIHN0eWxlPSJkb2N1bWVudCIgLz4NCi0gICAgICA8aW5wdXQ+DQotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0gICAgICA8L2lucHV0Pg0KLSAgICAgIDxvdXRwdXQ+DQotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0gICAgICA8L291dHB1dD4NCi0gICAgPC9vcGVyYXRpb24+DQotICA8L2JpbmRpbmc+DQotDQotICA8c2VydmljZSBuYW1lPSJTb2FwTWVzc2FnZVByb3ZpZGVyU2VydmljZSI+DQotICAgIDxwb3J0IG5hbWU9IlNvYXBNZXNzYWdlUHJvdmlkZXJQb3J0IiBiaW5kaW5nPSJ0bnM6RWNob1NlcnZpY2VTb2FwIj4NCi0gICAgICA8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjYwNjAvYXhpczIvc2VydmljZXMvU29hcE1lc3NhZ2VQcm92aWRlclNlcnZpY2UiIC8+DQotICAgIDwvcG9ydD4NCi0gIDwvc2VydmljZT4NCi0NCi08L2RlZmluaXRpb25zPg0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9zb2FwbXNnL1NvYXBNZXNzYWdlUHJvdmlkZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9zb2FwbXNnL1NvYXBNZXNzYWdlUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZjYTEwYy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvc29hcG1zZy9Tb2FwTWVzc2FnZVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm92aWRlci5zb2FwbXNnOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLlRlc3RMb2dnZXI7DQotDQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLkF0dGFjaG1lbnRQYXJ0Ow0KLWltcG9ydCBqYXZheC54bWwuc29hcC5EZXRhaWw7DQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLk1lc3NhZ2VGYWN0b3J5Ow0KLWltcG9ydCBqYXZheC54bWwuc29hcC5OYW1lOw0KLWltcG9ydCBqYXZheC54bWwuc29hcC5Ob2RlOw0KLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQQm9keTsNCi1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUENvbnN0YW50czsNCi1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEVsZW1lbnQ7DQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBGYWN0b3J5Ow0KLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRmF1bHQ7DQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBIZWFkZXI7DQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBIZWFkZXJFbGVtZW50Ow0KLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQTWVzc2FnZTsNCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5SZXN1bHQ7DQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXI7DQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5Ow0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7DQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVNvdXJjZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLkJpbmRpbmdUeXBlOw0KLWltcG9ydCBqYXZheC54bWwud3MuUHJvdmlkZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZU1vZGU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZVByb3ZpZGVyOw0KLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5TT0FQQmluZGluZzsNCi1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuU09BUEZhdWx0RXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KLQ0KLUBXZWJTZXJ2aWNlUHJvdmlkZXIoc2VydmljZU5hbWU9IlNvYXBNZXNzYWdlUHJvdmlkZXJTZXJ2aWNlIiwNCi0JCXRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3NvYXBtc2cucHJvdmlkZXIuamF4d3MuYXhpczIuYXBhY2hlLm9yZyIsDQotCQl3c2RsTG9jYXRpb249Ik1FVEEtSU5GL1Byb3ZpZGVyU09BUE1lc3NhZ2Uud3NkbCIsDQotCQlwb3J0TmFtZT0iU29hcE1lc3NhZ2VQcm92aWRlclBvcnQiKQ0KLUBCaW5kaW5nVHlwZShTT0FQQmluZGluZy5TT0FQMTFIVFRQX0JJTkRJTkcpDQotQFNlcnZpY2VNb2RlKHZhbHVlPVNlcnZpY2UuTW9kZS5NRVNTQUdFKQ0KLXB1YmxpYyBjbGFzcyBTb2FwTWVzc2FnZVByb3ZpZGVyIGltcGxlbWVudHMgUHJvdmlkZXI8U09BUE1lc3NhZ2U+IHsNCi0gICAgICANCi0gICAgU3RyaW5nIHJlc3BvbnNlTXNnU3RhcnQgPSAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+PHNvYXBlbnY6RW52ZWxvcGUgeG1sbnM6c29hcGVudj1cImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvXCI+PHNvYXBlbnY6SGVhZGVyLz48c29hcGVudjpCb2R5PiI7DQotICAgIFN0cmluZyByZXNwb25zZU1zZ0VuZCA9ICI8L3NvYXBlbnY6Qm9keT48L3NvYXBlbnY6RW52ZWxvcGU+IjsNCi0NCi0gICAgLy8gUmVxdWVzdHMgYW5kIFJlc3BvbnNlIHZhbHVlcyBvZiBpbnZva2Vfc3RyIGFuZCByZXR1cm5fc3RyDQotICAgIC8vIFRoZXNlIGNvbnN0YW50cyBhcmUgcmVmZXJlbmNlZCBieSB0aGUgU29hcE1lc3NhZ2VQcm92aWRlclRlc3QgYW5kIFNvYXBNZXNzYWdlUHJvdmlkZXINCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgUkVTUE9OU0VfTkFNRSA9ICJSZXR1cm5UeXBlIjsNCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgUkVTUE9OU0VfREFUQV9OQU1FID0gInJldHVybl9zdHIiOw0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBSRVFVRVNUX05BTUUgPSAiaW52b2tlT3AiOw0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBSRVFVRVNUX0RBVEFfTkFNRSA9ICJpbnZva2Vfc3RyIjsNCi0gICAgDQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFhNTF9SRVFVRVNUICAgICAgICAgICAgICA9ICJ4bWwgcmVxdWVzdCI7DQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFhNTF9SRVNQT05TRSAgICAgICAgICAgICA9ICJ4bWwgcmVzcG9uc2UiOw0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBYTUxfRU1QVFlCT0RZX1JFUVVFU1QgICAgPSAieG1sIGVtcHR5IGJvZHkgcmVxdWVzdCI7DQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFhNTF9DSEVDS0hFQURFUlNfUkVRVUVTVCA9ICJ4bWwgY2hlY2sgaGVhZGVycyByZXF1ZXN0IjsNCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgWE1MX0NIRUNLSEVBREVSU19SRVNQT05TRT0gInhtbCBjaGVjayBoZWFkZXJzIHJlc3BvbnNlIjsNCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgWE1MX0FUVEFDSE1FTlRfUkVRVUVTVCAgID0gInhtbCBhbmQgYXR0YWNobWVudCByZXF1ZXN0IjsNCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgWE1MX0FUVEFDSE1FTlRfUkVTUE9OU0UgID0gInhtbCBhbmQgYXR0YWNobWVudCByZXNwb25zZSI7DQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFhNTF9NVE9NX1JFUVVFU1QgICAgICAgICA9ICJ4bWwgYW5kIG10b20gcmVxdWVzdCI7DQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFhNTF9NVE9NX1JFU1BPTlNFICAgICAgICA9ICJ4bWwgYW5kIG10b20gcmVzcG9uc2UiOw0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBYTUxfU1dBUkVGX1JFUVVFU1QgICAgICAgPSAieG1sIGFuZCBzd2FyZWYgcmVxdWVzdCI7DQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFhNTF9TV0FSRUZfUkVTUE9OU0UgICAgICA9ICJ4bWwgYW5kIHN3YXJlZiByZXNwb25zZSI7DQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFhNTF9GQVVMVF9SRVFVRVNUICAgICAgICA9ICJ4bWwgZmF1bHQiOw0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBYTUxfV1NFX1JFUVVFU1QgICAgICAgID0gInhtbCB3c2UgZmF1bHQiOw0KLSAgICANCi0gICAgcHJpdmF0ZSBTdHJpbmcgWE1MX1JFVFVSTiA9ICI8bnMyOlJldHVyblR5cGUgeG1sbnM6bnMyPVwiaHR0cDovL3Rlc3RcIj48cmV0dXJuX3N0cj4iICsgDQotICAgICAgICBTb2FwTWVzc2FnZVByb3ZpZGVyLlhNTF9SRVNQT05TRSArDQotICAgICAgICAiPC9yZXR1cm5fc3RyPjwvbnMyOlJldHVyblR5cGU+IjsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgQVRUQUNITUVOVF9SRVRVUk4gPSAiPG5zMjpSZXR1cm5UeXBlIHhtbG5zOm5zMj1cImh0dHA6Ly90ZXN0XCI+PHJldHVybl9zdHI+IiArIA0KLSAgICAgICAgU29hcE1lc3NhZ2VQcm92aWRlci5YTUxfQVRUQUNITUVOVF9SRVNQT05TRSArDQotICAgICAgICAiPC9yZXR1cm5fc3RyPjwvbnMyOlJldHVyblR5cGU+IjsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgTVRPTV9SRVRVUk4gPSAiPG5zMjpSZXR1cm5UeXBlIHhtbG5zOm5zMj1cImh0dHA6Ly90ZXN0XCI+PHJldHVybl9zdHI+IiArIA0KLSAgICAgICAgU29hcE1lc3NhZ2VQcm92aWRlci5YTUxfTVRPTV9SRVNQT05TRSArDQotICAgICAgICAiPC9yZXR1cm5fc3RyPiIgKyANCi0gICAgICAgIFNvYXBNZXNzYWdlUHJvdmlkZXIuTVRPTV9SRUYgKw0KLSAgICAgICAgIjwvbnMyOlJldHVyblR5cGU+IjsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgU1dBUkVGX1JFVFVSTiA9ICI8bnMyOlJldHVyblR5cGUgeG1sbnM6bnMyPVwiaHR0cDovL3Rlc3RcIj48cmV0dXJuX3N0cj4iICsgDQotICAgICAgICBTb2FwTWVzc2FnZVByb3ZpZGVyLlhNTF9TV0FSRUZfUkVTUE9OU0UgKw0KLSAgICAgICAgIjwvcmV0dXJuX3N0cj4iICsgDQotICAgICAgICBTb2FwTWVzc2FnZVByb3ZpZGVyLlNXQVJFRl9SRUYgKw0KLSAgICAgICAgIjwvbnMyOlJldHVyblR5cGU+IjsgICAgIA0KLSAgICBwcml2YXRlIFN0cmluZyBDSEVDS0hFQURFUlNfUkVUVVJOID0gIjxuczI6UmV0dXJuVHlwZSB4bWxuczpuczI9XCJodHRwOi8vdGVzdFwiPjxyZXR1cm5fc3RyPiIgKyANCi0gICAgICAgIFNvYXBNZXNzYWdlUHJvdmlkZXIuWE1MX0NIRUNLSEVBREVSU19SRVNQT05TRSArDQotICAgICAgICAiPC9yZXR1cm5fc3RyPiIgKyANCi0gICAgICAgICI8L25zMjpSZXR1cm5UeXBlPiI7ICAgICANCi0gICAgDQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFRFWFRfWE1MX0FUVEFDSE1FTlQgPSAiPG15QXR0YWNobWVudD5IZWxsbyBXb3JsZDwvbXlBdHRhY2htZW50PiI7DQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIElEID0gImhlbGxvV29ybGQxMjMiOw0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBNVE9NX1JFRiA9ICI8ZGF0YT4iICsgDQotICAgICAgICAiPHhvcDpJbmNsdWRlIGhyZWY9J2NpZDoiICsgSUQgKyAiJyB4bWxuczp4b3A9J2h0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgveG9wL2luY2x1ZGUnIC8+IiArDQotICAgICAgICAgICAgIjwvZGF0YT4iOw0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBTV0FSRUZfUkVGID0gIjxkYXRhPiIgKyANCi0gICAgICAgICJjaWQ6IiArIElEICsNCi0gICAgICAgICI8L2RhdGE+IjsNCi0gICAgDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgRk9PX0hFQURFUl9RTkFNRSA9IG5ldyBRTmFtZSgiaHR0cDovL3NhbXBsZTEiLCAiZm9vIiwgInByZTEiKTsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBCQVJfSEVBREVSX1FOQU1FID0gbmV3IFFOYW1lKCJodHRwOi8vc2FtcGxlMiIsICJiYXIiLCAicHJlMiIpOw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIEJBVF9IRUFERVJfUU5BTUUgPSBuZXcgUU5hbWUoImh0dHA6Ly9zYW1wbGUzIiwgImJhdCIsICJwcmUzIik7DQotICAgIA0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT09fSEVBREVSX0NPTlRFTlQgPSAiZm9vIGNvbnRlbnQiOw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCQVJfSEVBREVSX0NPTlRFTlQxID0gImJhciBjb250ZW50MSI7DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJBUl9IRUFERVJfQ09OVEVOVDIgPSAiYmFyIGNvbnRlbnQyIjsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFUX0hFQURFUl9DT05URU5UID0gImJhdCBjb250ZW50IjsNCi0gICAgDQotICAgIHB1YmxpYyBTT0FQTWVzc2FnZSBpbnZva2UoU09BUE1lc3NhZ2Ugc29hcE1lc3NhZ2UpIHRocm93cyBTT0FQRmF1bHRFeGNlcHRpb24gew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IFNvYXBNZXNzYWdlUHJvdmlkZXI6IFJlcXVlc3QgcmVjZWl2ZWQuIik7DQotICAgIAkNCi0gICAgCXRyeXsNCi0gICAgCSAgICAvLyBMb29rIGF0IHRoZSBpbmNvbWluZyByZXF1ZXN0IG1lc3NhZ2UNCi0gICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiPj4gUmVxdWVzdCBvbiBTZXJ2ZXI6Iik7DQotICAgICAgICAgICAgLy9zb2FwTWVzc2FnZS53cml0ZVRvKFN5c3RlbS5vdXQpOw0KLSAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJcbiIpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIEdldCB0aGUgZGlzY3JpbWluYXRpb24gZWxlbWVudC4gIFRoaXMgcGVyZm9ybXMgYmFzaWMgYXNzZXJ0aW9ucyBvbiB0aGUgcmVjZWl2ZWQgbWVzc2FnZQ0KLSAgICAgICAgICAgIFNPQVBFbGVtZW50IGRpc2NFbGVtZW50ID0gYXNzZXJ0UmVxdWVzdFhNTChzb2FwTWVzc2FnZSk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gVXNlIHRoZSBkYXRhIGVsZW1lbnQgdGV4dCB0byBkZXRlcm1pbmUgdGhlIHR5cGUgb2YgcmVzcG9uc2UgdG8gc2VuZA0KLSAgICAgICAgICAgIFNPQVBNZXNzYWdlIHJlc3BvbnNlID0gbnVsbDsNCi0gICAgICAgICAgICAvLyBUT0RPIEFYSVMyIFNBQUogc2hvdWxkIChidXQgZG9lcyBub3QpIHN1cHBvcnQgdGhlIGdldFRleHRDb250ZW50KCk7DQotICAgICAgICAgICAgLy8gU3RyaW5nIHRleHQgPSBkYXRhRWxlbWVudC5nZXRUZXh0Q29udGVudCgpOw0KLSAgICAgICAgICAgIFN0cmluZyB0ZXh0ID0gZGlzY0VsZW1lbnQuZ2V0VmFsdWUoKTsNCi0gICAgICAgICAgICBpZiAoWE1MX1JFUVVFU1QuZXF1YWxzKHRleHQpKSB7DQotICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gZ2V0WE1MUmVzcG9uc2Uoc29hcE1lc3NhZ2UsIGRpc2NFbGVtZW50KTsNCi0gICAgICAgICAgICB9IGVsc2UgaWYgKFhNTF9FTVBUWUJPRFlfUkVRVUVTVC5lcXVhbHModGV4dCkpIHsNCi0gICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBnZXRYTUxFbXB0eUJvZHlSZXNwb25zZShzb2FwTWVzc2FnZSwgZGlzY0VsZW1lbnQpOw0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoWE1MX0NIRUNLSEVBREVSU19SRVFVRVNULmVxdWFscyh0ZXh0KSkgew0KLSAgICAgICAgICAgICAgICByZXNwb25zZSA9IGdldFhNTENoZWNrSGVhZGVyc1Jlc3BvbnNlKHNvYXBNZXNzYWdlLCBkaXNjRWxlbWVudCk7DQotICAgICAgICAgICAgfSBlbHNlIGlmIChYTUxfQVRUQUNITUVOVF9SRVFVRVNULmVxdWFscyh0ZXh0KSkgew0KLSAgICAgICAgICAgICAgICByZXNwb25zZSA9IGdldFhNTEF0dGFjaG1lbnRSZXNwb25zZShzb2FwTWVzc2FnZSwgZGlzY0VsZW1lbnQpOw0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoWE1MX01UT01fUkVRVUVTVC5lcXVhbHModGV4dCkpIHsNCi0gICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBnZXRYTUxNVE9NUmVzcG9uc2Uoc29hcE1lc3NhZ2UsIGRpc2NFbGVtZW50KTsNCi0gICAgICAgICAgICB9IGVsc2UgaWYgKFhNTF9TV0FSRUZfUkVRVUVTVC5lcXVhbHModGV4dCkpIHsNCi0gICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBnZXRYTUxTV0FSZWZSZXNwb25zZShzb2FwTWVzc2FnZSwgZGlzY0VsZW1lbnQpOw0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoWE1MX0ZBVUxUX1JFUVVFU1QuZXF1YWxzKHRleHQpKSB7DQotICAgICAgICAgICAgICAgIHRocm93U09BUEZhdWx0RXhjZXB0aW9uKCk7DQotICAgICAgICAgICAgfSBlbHNlIGlmIChYTUxfV1NFX1JFUVVFU1QuZXF1YWxzKHRleHQpKSB7DQotICAgICAgICAgICAgICAgIHRocm93V2ViU2VydmljZUV4Y2VwdGlvbigpOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIC8vIFdlIHNob3VsZCBub3QgZ2V0IGhlcmUNCi0gICAgICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIlVua25vd24gVHlwZSBvZiBNZXNzYWdlIik7DQotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoZmFsc2UpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBXcml0ZSBvdXQgdGhlIE1lc3NhZ2UNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gUmVzcG9uc2UgYmVpbmcgc2VudCBieSBTZXJ2ZXI6Iik7DQotICAgICAgICAgICAgLy9yZXNwb25zZS53cml0ZVRvKFN5c3RlbS5vdXQpOw0KLSAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJcbiIpOw0KLSAgICAgICAgICAgIHJldHVybiByZXNwb25zZTsNCi0gICAgCX0gY2F0Y2ggKFdlYlNlcnZpY2VFeGNlcHRpb24gd3NlKSB7DQotICAgIAkgICAgdGhyb3cgd3NlOw0KLSAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSl7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXINCi0gICAgICAgICAgICAgICAgICAgIC5kZWJ1ZygiKioqRVJST1I6IEluIFNvYXBNZXNzYWdlUHJvdmlkZXIuaW52b2tlOiBDYXVnaHQgZXhjZXB0aW9uICIgKyBlKTsNCi0gICAgCQllLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAJfQ0KLSAgICAJcmV0dXJuIG51bGw7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBDb21tb24gYXNzZXJ0aW9uIGNoZWNraW5nIG9mIHRoZSByZXF1ZXN0DQotICAgICAqIEBwYXJhbSBtc2cNCi0gICAgICogQHJldHVybiBTT0FQRWxlbWVudCByZXByZXNlbnRpbmcgdGhlIGRhdGEgZWxlbWVudA0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBTT0FQRWxlbWVudCBhc3NlcnRSZXF1ZXN0WE1MKFNPQVBNZXNzYWdlIG1zZykgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBhc3NlcnRUcnVlKG1zZyAhPSBudWxsKTsNCi0gICAgICAgIFNPQVBCb2R5IGJvZHkgPSBtc2cuZ2V0U09BUEJvZHkoKTsNCi0gICAgICAgIGFzc2VydFRydWUoYm9keSAhPSBudWxsKTsNCi0gICAgICAgIA0KLSAgICAgICAgTm9kZSBpbnZva2VFbGVtZW50ID0gKE5vZGUpIGJvZHkuZ2V0Rmlyc3RDaGlsZCgpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShpbnZva2VFbGVtZW50IGluc3RhbmNlb2YgU09BUEVsZW1lbnQpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShTb2FwTWVzc2FnZVByb3ZpZGVyLlJFUVVFU1RfTkFNRS5lcXVhbHMoaW52b2tlRWxlbWVudC5nZXRMb2NhbE5hbWUoKSkpOw0KLSAgICAgICAgDQotICAgICAgICBOb2RlIGRpc2NFbGVtZW50ID0gKE5vZGUpIGludm9rZUVsZW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShkaXNjRWxlbWVudCBpbnN0YW5jZW9mIFNPQVBFbGVtZW50KTsNCi0gICAgICAgIGFzc2VydFRydWUoU29hcE1lc3NhZ2VQcm92aWRlci5SRVFVRVNUX0RBVEFfTkFNRS5lcXVhbHMoZGlzY0VsZW1lbnQuZ2V0TG9jYWxOYW1lKCkpKTsNCi0gICAgICAgIA0KLSAgICAgICAgU3RyaW5nIHRleHQgPSBkaXNjRWxlbWVudC5nZXRWYWx1ZSgpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSh0ZXh0ICE9IG51bGwpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSh0ZXh0Lmxlbmd0aCgpID4gMCk7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiUmVxdWVzdCBNZXNzYWdlIFR5cGUgaXM6IiArIHRleHQpOw0KLSAgICAgICAgDQotICAgICAgICByZXR1cm4gKFNPQVBFbGVtZW50KSBkaXNjRWxlbWVudDsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIEdldCB0aGUgcmVzcG9uc2UgZm9yIGFuIFhNTCBvbmx5IHJlcXVlc3QNCi0gICAgICogQHBhcmFtIHJlcXVlc3QNCi0gICAgICogQHBhcmFtIGRhdGFFbGVtZW50DQotICAgICAqIEByZXR1cm4gU09BUE1lc3NhZ2UNCi0gICAgICovDQotICAgIHByaXZhdGUgU09BUE1lc3NhZ2UgZ2V0WE1MUmVzcG9uc2UoU09BUE1lc3NhZ2UgcmVxdWVzdCwgU09BUEVsZW1lbnQgZGF0YUVsZW1lbnQpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgU09BUE1lc3NhZ2UgcmVzcG9uc2U7DQotICAgICAgICANCi0gICAgICAgIC8vIFRyYW5zcG9ydCBoZWFkZXIgY2hlY2sNCi0gICAgICAgIGFzc2VydFRydWUocmVxdWVzdC5nZXRDb250ZW50RGVzY3JpcHRpb24oKSAhPSBudWxsKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVxdWVzdC5nZXRDb250ZW50RGVzY3JpcHRpb24oKS5lcXVhbHMoU29hcE1lc3NhZ2VQcm92aWRlci5YTUxfUkVRVUVTVCkpOw0KLQ0KLSAgICAgICAgLy8gQWRkaXRpb25hbCBhc3NlcnRpb24gY2hlY2tzDQotICAgICAgICBhc3NlcnRUcnVlKGNvdW50QXR0YWNobWVudHMocmVxdWVzdCkgPT0gMCk7DQotICAgICAgICANCi0gICAgICAgIC8vIEJ1aWxkIHRoZSBSZXNwb25zZQ0KLSAgICAgICAgTWVzc2FnZUZhY3RvcnkgZmFjdG9yeSA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKCk7DQotICAgICAgICBTdHJpbmcgcmVzcG9uc2VYTUwgPSByZXNwb25zZU1zZ1N0YXJ0ICsgWE1MX1JFVFVSTiArIHJlc3BvbnNlTXNnRW5kOw0KLSAgICAgICAgcmVzcG9uc2UgPSBmYWN0b3J5LmNyZWF0ZU1lc3NhZ2UobnVsbCwgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHJlc3BvbnNlWE1MLmdldEJ5dGVzKCkpKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gU2V0IGEgY29udGVudCBkZXNjcmlwdGlvbg0KLSAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudERlc2NyaXB0aW9uKFNvYXBNZXNzYWdlUHJvdmlkZXIuWE1MX1JFU1BPTlNFKTsNCi0gICAgICAgIHJldHVybiByZXNwb25zZTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIEdldCB0aGUgcmVzcG9uc2UgZm9yIGFuIFhNTCBvbmx5IHJlcXVlc3QNCi0gICAgICogQHBhcmFtIHJlcXVlc3QNCi0gICAgICogQHBhcmFtIGRhdGFFbGVtZW50DQotICAgICAqIEByZXR1cm4gU09BUE1lc3NhZ2UNCi0gICAgICovDQotICAgIHByaXZhdGUgU09BUE1lc3NhZ2UgZ2V0WE1MRW1wdHlCb2R5UmVzcG9uc2UoU09BUE1lc3NhZ2UgcmVxdWVzdCwgU09BUEVsZW1lbnQgZGF0YUVsZW1lbnQpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgU09BUE1lc3NhZ2UgcmVzcG9uc2U7DQotICAgICAgIA0KLQ0KLSAgICAgICAgLy8gQWRkaXRpb25hbCBhc3NlcnRpb24gY2hlY2tzDQotICAgICAgICBhc3NlcnRUcnVlKGNvdW50QXR0YWNobWVudHMocmVxdWVzdCkgPT0gMCk7DQotICAgICAgICANCi0gICAgICAgIC8vIEJ1aWxkIHRoZSBSZXNwb25zZQ0KLSAgICAgICAgTWVzc2FnZUZhY3RvcnkgZmFjdG9yeSA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKCk7DQotICAgICAgICByZXNwb25zZSA9IGZhY3RvcnkuY3JlYXRlTWVzc2FnZSgpOw0KLSAgICAgDQotICAgICAgICByZXR1cm4gcmVzcG9uc2U7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBHZXQgdGhlIHJlc3BvbnNlIGZvciBhbiBYTUwgY2hlY2sgaGVhZGVycyByZXF1ZXN0DQotICAgICAqIEBwYXJhbSByZXF1ZXN0DQotICAgICAqIEBwYXJhbSBkYXRhRWxlbWVudA0KLSAgICAgKiBAcmV0dXJuIFNPQVBNZXNzYWdlDQotICAgICAqLw0KLSAgICBwcml2YXRlIFNPQVBNZXNzYWdlIGdldFhNTENoZWNrSGVhZGVyc1Jlc3BvbnNlKFNPQVBNZXNzYWdlIHJlcXVlc3QsIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPQVBFbGVtZW50IGRhdGFFbGVtZW50KSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIFNPQVBNZXNzYWdlIHJlc3BvbnNlOw0KLSAgICAgICAgDQotICAgICAgICAvLyBBZGRpdGlvbmFsIGFzc2VydGlvbiBjaGVja3MNCi0gICAgICAgIGFzc2VydFRydWUoY291bnRBdHRhY2htZW50cyhyZXF1ZXN0KSA9PSAwKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQ2hlY2sgZm9yIHNwZWNpZmljIGhlYWRlcnMNCi0gICAgICAgIFNPQVBIZWFkZXIgc2ggPSByZXF1ZXN0LmdldFNPQVBIZWFkZXIoKTsNCi0gICAgICAgIGFzc2VydFRydWUoc2ggIT0gbnVsbCk7DQotICAgICAgICANCi0gICAgICAgIFNPQVBIZWFkZXJFbGVtZW50IHNoZSA9IChTT0FQSGVhZGVyRWxlbWVudCkNCi0gICAgICAgICAgICBzaC5nZXRDaGlsZEVsZW1lbnRzKEZPT19IRUFERVJfUU5BTUUpLm5leHQoKTsNCi0gICAgICAgIGFzc2VydFRydWUoc2hlICE9IG51bGwpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShzaGUgaW5zdGFuY2VvZiBTT0FQSGVhZGVyRWxlbWVudCk7DQotICAgICAgICBTdHJpbmcgdGV4dCA9IHNoZS5nZXRWYWx1ZSgpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShGT09fSEVBREVSX0NPTlRFTlQuZXF1YWxzKHRleHQpKTsNCi0gICAgICAgIA0KLSAgICAgICAgSXRlcmF0b3IgaXQgPSBzaC5nZXRDaGlsZEVsZW1lbnRzKEJBUl9IRUFERVJfUU5BTUUpOw0KLSAgICAgICAgc2hlID0gKFNPQVBIZWFkZXJFbGVtZW50KSBpdC5uZXh0KCk7DQotICAgICAgICBhc3NlcnRUcnVlKHNoZSAhPSBudWxsKTsNCi0gICAgICAgIGFzc2VydFRydWUoc2hlIGluc3RhbmNlb2YgU09BUEhlYWRlckVsZW1lbnQpOw0KLSAgICAgICAgdGV4dCA9IHNoZS5nZXRWYWx1ZSgpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShCQVJfSEVBREVSX0NPTlRFTlQxLmVxdWFscyh0ZXh0KSk7DQotICAgICAgICBzaGUgPSAoU09BUEhlYWRlckVsZW1lbnQpIGl0Lm5leHQoKTsNCi0gICAgICAgIGFzc2VydFRydWUoc2hlICE9IG51bGwpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShzaGUgaW5zdGFuY2VvZiBTT0FQSGVhZGVyRWxlbWVudCk7DQotICAgICAgICB0ZXh0ID0gc2hlLmdldFZhbHVlKCk7DQotICAgICAgICBhc3NlcnRUcnVlKEJBUl9IRUFERVJfQ09OVEVOVDIuZXF1YWxzKHRleHQpKTsNCi0gICAgICAgIA0KLSAgICAgICAgYXNzZXJ0VHJ1ZSghc2guZ2V0Q2hpbGRFbGVtZW50cyhCQVRfSEVBREVSX1FOQU1FKS5oYXNOZXh0KCkpOw0KLSAgIA0KLSAgICAgICAgDQotICAgICAgICAvLyBCdWlsZCB0aGUgUmVzcG9uc2UNCi0gICAgICAgIE1lc3NhZ2VGYWN0b3J5IGZhY3RvcnkgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpOw0KLSAgICAgICAgU3RyaW5nIHJlc3BvbnNlWE1MID0gcmVzcG9uc2VNc2dTdGFydCArIENIRUNLSEVBREVSU19SRVRVUk4gKyByZXNwb25zZU1zZ0VuZDsNCi0gICAgICAgIHJlc3BvbnNlID0gZmFjdG9yeS5jcmVhdGVNZXNzYWdlKG51bGwsIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShyZXNwb25zZVhNTC5nZXRCeXRlcygpKSk7DQotICAgICAgICByZXNwb25zZS5nZXRTT0FQSGVhZGVyKCkuYWRkSGVhZGVyRWxlbWVudChCQVJfSEVBREVSX1FOQU1FKS4NCi0gICAgICAgICAgICBhZGRUZXh0Tm9kZShCQVJfSEVBREVSX0NPTlRFTlQxKTsNCi0gICAgICAgIHJlc3BvbnNlLmdldFNPQVBIZWFkZXIoKS5hZGRIZWFkZXJFbGVtZW50KEJBUl9IRUFERVJfUU5BTUUpLg0KLSAgICAgICAgICAgIGFkZFRleHROb2RlKEJBUl9IRUFERVJfQ09OVEVOVDIpOw0KLSAgICAgICAgcmVzcG9uc2UuZ2V0U09BUEhlYWRlcigpLmFkZEhlYWRlckVsZW1lbnQoQkFUX0hFQURFUl9RTkFNRSkuDQotICAgICAgICAgICAgYWRkVGV4dE5vZGUoQkFUX0hFQURFUl9DT05URU5UKTsNCi0gICAgICAgIA0KLSAgICAgICAgcmV0dXJuIHJlc3BvbnNlOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogR2V0IHRoZSByZXNwb25zZSBmb3IgYW4gWE1MIGFuZCBhbiBBdHRhY2htZW50IHJlcXVlc3QNCi0gICAgICogQHBhcmFtIHJlcXVlc3QNCi0gICAgICogQHBhcmFtIGRhdGFFbGVtZW50DQotICAgICAqIEByZXR1cm4gU09BUE1lc3NhZ2UNCi0gICAgICovDQotICAgIHByaXZhdGUgU09BUE1lc3NhZ2UgZ2V0WE1MQXR0YWNobWVudFJlc3BvbnNlKFNPQVBNZXNzYWdlIHJlcXVlc3QsIFNPQVBFbGVtZW50IGRhdGFFbGVtZW50KSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIFNPQVBNZXNzYWdlIHJlc3BvbnNlOw0KLSAgICAgICAgDQotICAgICAgICAvLyBBZGRpdGlvbmFsIGFzc2VydGlvbiBjaGVja3MNCi0gICAgICAgIGFzc2VydFRydWUoY291bnRBdHRhY2htZW50cyhyZXF1ZXN0KSA9PSAxKTsNCi0gICAgICAgIEF0dGFjaG1lbnRQYXJ0IHJlcXVlc3RBUCA9IChBdHRhY2htZW50UGFydCkgcmVxdWVzdC5nZXRBdHRhY2htZW50cygpLm5leHQoKTsNCi0gICAgICAgIFN0cmVhbVNvdXJjZSBjb250ZW50U1MgPSAoU3RyZWFtU291cmNlKSByZXF1ZXN0QVAuZ2V0Q29udGVudCgpOw0KLSAgICAgICAgU3RyaW5nIGNvbnRlbnQgPSBnZXRBc1N0cmluZyhjb250ZW50U1MpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShjb250ZW50LmNvbnRhaW5zKFNvYXBNZXNzYWdlUHJvdmlkZXIuVEVYVF9YTUxfQVRUQUNITUVOVCkpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBCdWlsZCB0aGUgUmVzcG9uc2UNCi0gICAgICAgIE1lc3NhZ2VGYWN0b3J5IGZhY3RvcnkgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpOw0KLSAgICAgICAgU3RyaW5nIHJlc3BvbnNlWE1MID0gcmVzcG9uc2VNc2dTdGFydCArIEFUVEFDSE1FTlRfUkVUVVJOICsgcmVzcG9uc2VNc2dFbmQ7DQotICAgICAgICByZXNwb25zZSA9IGZhY3RvcnkuY3JlYXRlTWVzc2FnZShudWxsLCBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ocmVzcG9uc2VYTUwuZ2V0Qnl0ZXMoKSkpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBDcmVhdGUgYW5kIGF0dGFjaCB0aGUgYXR0YWNobWVudA0KLSAgICAgICAgQXR0YWNobWVudFBhcnQgYXAgPSByZXNwb25zZS5jcmVhdGVBdHRhY2htZW50UGFydChTb2FwTWVzc2FnZVByb3ZpZGVyLlRFWFRfWE1MX0FUVEFDSE1FTlQsICJ0ZXh0L3htbCIpOw0KLSAgICAgICAgYXAuc2V0Q29udGVudElkKElEKTsNCi0gICAgICAgIHJlc3BvbnNlLmFkZEF0dGFjaG1lbnRQYXJ0KGFwKTsNCi0gICAgICAgIA0KLSAgICAgICAgcmV0dXJuIHJlc3BvbnNlOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogR2V0IHRoZSByZXNwb25zZSBmb3IgYW4gWE1MIGFuZCBhbiBNVE9NIEF0dGFjaG1lbnQgcmVxdWVzdA0KLSAgICAgKiBAcGFyYW0gcmVxdWVzdA0KLSAgICAgKiBAcGFyYW0gZGF0YUVsZW1lbnQNCi0gICAgICogQHJldHVybiBTT0FQTWVzc2FnZQ0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBTT0FQTWVzc2FnZSBnZXRYTUxNVE9NUmVzcG9uc2UoU09BUE1lc3NhZ2UgcmVxdWVzdCwgU09BUEVsZW1lbnQgZGF0YUVsZW1lbnQpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgU09BUE1lc3NhZ2UgcmVzcG9uc2U7DQotDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiUmVjZWl2ZWQgTVRPTSBNZXNzYWdlIik7DQotICAgICAgICAvLyBBZGRpdGlvbmFsIGFzc2VydGlvbiBjaGVja3MNCi0gICAgICAgIGFzc2VydFRydWUoY291bnRBdHRhY2htZW50cyhyZXF1ZXN0KSA9PSAxKTsNCi0gICAgICAgIEF0dGFjaG1lbnRQYXJ0IHJlcXVlc3RBUCA9IChBdHRhY2htZW50UGFydCkgcmVxdWVzdC5nZXRBdHRhY2htZW50cygpLm5leHQoKTsNCi0gICAgICAgIFN0cmVhbVNvdXJjZSBjb250ZW50U1MgPSAoU3RyZWFtU291cmNlKSByZXF1ZXN0QVAuZ2V0Q29udGVudCgpOw0KLSAgICAgICAgU3RyaW5nIGNvbnRlbnQgPSBnZXRBc1N0cmluZyhjb250ZW50U1MpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShjb250ZW50LmNvbnRhaW5zKFNvYXBNZXNzYWdlUHJvdmlkZXIuVEVYVF9YTUxfQVRUQUNITUVOVCkpOw0KLQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIlRoZSBNVE9NIFJlcXVlc3QgTWVzc2FnZSBhcHBlYXJzIGNvcnJlY3QuIik7DQotICAgICAgICANCi0gICAgICAgIC8vIEJ1aWxkIHRoZSBSZXNwb25zZQ0KLSAgICAgICAgTWVzc2FnZUZhY3RvcnkgZmFjdG9yeSA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKCk7DQotICAgICAgICBTdHJpbmcgcmVzcG9uc2VYTUwgPSByZXNwb25zZU1zZ1N0YXJ0ICsgTVRPTV9SRVRVUk4gKyByZXNwb25zZU1zZ0VuZDsNCi0gICAgICAgIHJlc3BvbnNlID0gZmFjdG9yeS5jcmVhdGVNZXNzYWdlKG51bGwsIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShyZXNwb25zZVhNTC5nZXRCeXRlcygpKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIENyZWF0ZSBhbmQgYXR0YWNoIHRoZSBhdHRhY2htZW50DQotICAgICAgICBBdHRhY2htZW50UGFydCBhcCA9IHJlc3BvbnNlLmNyZWF0ZUF0dGFjaG1lbnRQYXJ0KFNvYXBNZXNzYWdlUHJvdmlkZXIuVEVYVF9YTUxfQVRUQUNITUVOVCwgInRleHQveG1sIik7DQotICAgICAgICBhcC5zZXRDb250ZW50SWQoSUQpOw0KLSAgICAgICAgcmVzcG9uc2UuYWRkQXR0YWNobWVudFBhcnQoYXApOw0KLQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIlJldHVybmluZyB0aGUgUmVzcG9uc2UgTWVzc2FnZSIpOw0KLSAgICAgICAgcmV0dXJuIHJlc3BvbnNlOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogR2V0IHRoZSByZXNwb25zZSBmb3IgYW4gWE1MIGFuZCBhbiBNVE9NIEF0dGFjaG1lbnQgcmVxdWVzdA0KLSAgICAgKiBAcGFyYW0gcmVxdWVzdA0KLSAgICAgKiBAcGFyYW0gZGF0YUVsZW1lbnQNCi0gICAgICogQHJldHVybiBTT0FQTWVzc2FnZQ0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBTT0FQTWVzc2FnZSBnZXRYTUxTV0FSZWZSZXNwb25zZShTT0FQTWVzc2FnZSByZXF1ZXN0LCBTT0FQRWxlbWVudCBkYXRhRWxlbWVudCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBTT0FQTWVzc2FnZSByZXNwb25zZTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQWRkaXRpb25hbCBhc3NlcnRpb24gY2hlY2tzDQotICAgICAgICBhc3NlcnRUcnVlKGNvdW50QXR0YWNobWVudHMocmVxdWVzdCkgPT0gMSk7DQotICAgICAgICBBdHRhY2htZW50UGFydCByZXF1ZXN0QVAgPSAoQXR0YWNobWVudFBhcnQpIHJlcXVlc3QuZ2V0QXR0YWNobWVudHMoKS5uZXh0KCk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlcXVlc3RBUC5nZXRDb250ZW50SWQoKS5lcXVhbHMoSUQpKTsNCi0gICAgICAgIFN0cmVhbVNvdXJjZSBjb250ZW50U1MgPSAoU3RyZWFtU291cmNlKSByZXF1ZXN0QVAuZ2V0Q29udGVudCgpOw0KLSAgICAgICAgU3RyaW5nIGNvbnRlbnQgPSBnZXRBc1N0cmluZyhjb250ZW50U1MpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShjb250ZW50LmNvbnRhaW5zKFNvYXBNZXNzYWdlUHJvdmlkZXIuVEVYVF9YTUxfQVRUQUNITUVOVCkpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBCdWlsZCB0aGUgUmVzcG9uc2UNCi0gICAgICAgIE1lc3NhZ2VGYWN0b3J5IGZhY3RvcnkgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpOw0KLSAgICAgICAgU3RyaW5nIHJlc3BvbnNlWE1MID0gcmVzcG9uc2VNc2dTdGFydCArIFNXQVJFRl9SRVRVUk4gKyByZXNwb25zZU1zZ0VuZDsNCi0gICAgICAgIHJlc3BvbnNlID0gZmFjdG9yeS5jcmVhdGVNZXNzYWdlKG51bGwsIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShyZXNwb25zZVhNTC5nZXRCeXRlcygpKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIENyZWF0ZSBhbmQgYXR0YWNoIHRoZSBhdHRhY2htZW50DQotICAgICAgICBBdHRhY2htZW50UGFydCBhcCA9IHJlc3BvbnNlLmNyZWF0ZUF0dGFjaG1lbnRQYXJ0KFNvYXBNZXNzYWdlUHJvdmlkZXIuVEVYVF9YTUxfQVRUQUNITUVOVCwgInRleHQveG1sIik7DQotICAgICAgICBhcC5zZXRDb250ZW50SWQoSUQpOw0KLSAgICAgICAgcmVzcG9uc2UuYWRkQXR0YWNobWVudFBhcnQoYXApOw0KLSAgICAgICAgDQotICAgICAgICByZXR1cm4gcmVzcG9uc2U7DQotICAgIH0NCi0gICAgDQotICAgIHByaXZhdGUgdm9pZCB0aHJvd1NPQVBGYXVsdEV4Y2VwdGlvbigpIHRocm93cyBTT0FQRmF1bHRFeGNlcHRpb24gew0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBNZXNzYWdlRmFjdG9yeSBtZiA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKCk7DQotICAgICAgICAgICAgU09BUEZhY3Rvcnkgc2YgPSBTT0FQRmFjdG9yeS5uZXdJbnN0YW5jZSgpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIFNPQVBNZXNzYWdlIG0gPSBtZi5jcmVhdGVNZXNzYWdlKCk7DQotICAgICAgICAgICAgU09BUEJvZHkgYm9keSA9IG0uZ2V0U09BUEJvZHkoKTsNCi0gICAgICAgICAgICBTT0FQRmF1bHQgZmF1bHQgPSBib2R5LmFkZEZhdWx0KCk7DQotICAgICAgICAgICAgUU5hbWUgZmF1bHRDb2RlID0gbmV3IFFOYW1lKFNPQVBDb25zdGFudHMuVVJJX05TX1NPQVBfMV8xX0VOVkVMT1BFLCAiQ2xpZW50Iik7IA0KLSAgICAgICAgICAgIGZhdWx0LnNldEZhdWx0Q29kZShmYXVsdENvZGUpOw0KLSAgICAgICAgICAgIGZhdWx0LnNldEZhdWx0U3RyaW5nKCJzYW1wbGUgZmF1bHQiKTsNCi0gICAgICAgICAgICBEZXRhaWwgZGV0YWlsID0gZmF1bHQuYWRkRGV0YWlsKCk7DQotICAgICAgICAgICAgTmFtZSBkZU5hbWUgPSBzZi5jcmVhdGVOYW1lKCJkZXRhaWxFbnRyeSIpOw0KLSAgICAgICAgICAgIFNPQVBFbGVtZW50IGRldGFpbEVudHJ5ID0gZGV0YWlsLmFkZERldGFpbEVudHJ5KGRlTmFtZSk7DQotICAgICAgICAgICAgZGV0YWlsRW50cnkuYWRkVGV4dE5vZGUoInNhbXBsZSBkZXRhaWwiKTsNCi0gICAgICAgICAgICBmYXVsdC5zZXRGYXVsdEFjdG9yKCJzYW1wbGUgYWN0b3IiKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBTT0FQRmF1bHRFeGNlcHRpb24gc2ZlID0gbmV3IFNPQVBGYXVsdEV4Y2VwdGlvbihmYXVsdCk7DQotICAgICAgICAgICAgdGhyb3cgc2ZlOw0KLSAgICAgICAgfSBjYXRjaCAoU09BUEZhdWx0RXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICB0aHJvdyBlOw0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICANCi0gICAgcHJpdmF0ZSB2b2lkIHRocm93V2ViU2VydmljZUV4Y2VwdGlvbigpIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsNCi0gICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKCJBIFdTRSB3YXMgdGhyb3duIik7DQotICAgIH0NCi0gICAgLyoqDQotICAgICAqIENvdW50IEF0dGFjaG1lbnRzDQotICAgICAqIEBwYXJhbSBtc2cNCi0gICAgICogQHJldHVybg0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBpbnQgY291bnRBdHRhY2htZW50cyhTT0FQTWVzc2FnZSBtc2cpIHsNCi0gICAgICAgIEl0ZXJhdG9yIGl0ID0gbXNnLmdldEF0dGFjaG1lbnRzKCk7DQotICAgICAgICBpbnQgY291bnQgPSAwOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShpdCAhPSBudWxsKTsNCi0gICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsNCi0gICAgICAgICAgICBpdC5uZXh0KCk7DQotICAgICAgICAgICAgY291bnQrKzsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBjb3VudDsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QXNTdHJpbmcoU3RyZWFtU291cmNlIHNzKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIA0KLSAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsNCi0gICAgICAgIFJlc3VsdCByZXN1bHQgPSBuZXcgU3RyZWFtUmVzdWx0KG91dCk7DQotICAgICAgICBUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1RyYW5zZm9ybWVyKCk7DQotICAgICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0oc3MsIHJlc3VsdCk7IA0KLSAgICAgICAgU3RyaW5nIHRleHQgPSBuZXcgU3RyaW5nKG91dC50b0J5dGVBcnJheSgpKTsNCi0gICAgICAgIHJldHVybiB0ZXh0Ow0KLSAgICB9DQotICAgIA0KLSAgICBwcml2YXRlIHZvaWQgYXNzZXJ0VHJ1ZShib29sZWFuIHRlc3RBc3NlcnRpb24pIHsNCi0gICAgICAgIGlmICghdGVzdEFzc2VydGlvbikgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJBc3NlcnRpb24gZmFsc2UiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvc29hcG1zZ2NoZWNrbXRvbS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9zb2FwbXNnY2hlY2ttdG9tL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjRiNTY4Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9zb2FwbXNnY2hlY2ttdG9tL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wDQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyL3NvYXBtc2djaGVja210b20vU29hcE1lc3NhZ2VDaGVja01UT01Qcm92aWRlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyL3NvYXBtc2djaGVja210b20vU29hcE1lc3NhZ2VDaGVja01UT01Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDFiNTUzLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9zb2FwbXNnY2hlY2ttdG9tL1NvYXBNZXNzYWdlQ2hlY2tNVE9NUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnByb3ZpZGVyLnNvYXBtc2djaGVja210b207DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuVGVzdExvZ2dlcjsNCi0NCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi1pbXBvcnQgamF2YXgueG1sLnNvYXAuQXR0YWNobWVudFBhcnQ7DQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLkRldGFpbDsNCi1pbXBvcnQgamF2YXgueG1sLnNvYXAuTWVzc2FnZUZhY3Rvcnk7DQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLk5hbWU7DQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLk5vZGU7DQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBCb2R5Ow0KLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQQm9keUVsZW1lbnQ7DQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBDb25zdGFudHM7DQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBFbGVtZW50Ow0KLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRmFjdG9yeTsNCi1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEZhdWx0Ow0KLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQTWVzc2FnZTsNCi1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUFBhcnQ7DQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uUmVzdWx0Ow0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyOw0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeTsNCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0Ow0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1Tb3VyY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5CaW5kaW5nVHlwZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLlByb3ZpZGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2VNb2RlOw0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VQcm92aWRlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuU09BUEJpbmRpbmc7DQotaW1wb3J0IGphdmF4LnhtbC53cy5zb2FwLlNPQVBGYXVsdEV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07DQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCi0NCi1AV2ViU2VydmljZVByb3ZpZGVyKHNlcnZpY2VOYW1lPSJTb2FwTWVzc2FnZUNoZWNrTVRPTVByb3ZpZGVyU2VydmljZSIsDQotCQl0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9zb2FwbXNnY2hlY2ttdG9tLnByb3ZpZGVyLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciLA0KLQkJcG9ydE5hbWU9IlNvYXBNZXNzYWdlQ2hlY2tNVE9NUHJvdmlkZXJQb3J0IikNCi1AQmluZGluZ1R5cGUoU09BUEJpbmRpbmcuU09BUDExSFRUUF9CSU5ESU5HKQ0KLUBTZXJ2aWNlTW9kZSh2YWx1ZT1TZXJ2aWNlLk1vZGUuTUVTU0FHRSkNCi1wdWJsaWMgY2xhc3MgU29hcE1lc3NhZ2VDaGVja01UT01Qcm92aWRlciBpbXBsZW1lbnRzIFByb3ZpZGVyPFNPQVBNZXNzYWdlPiB7DQotICAgIA0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFZlcnkgc2ltcGxlIG9wZXJhdGlvbi4NCi0gICAgICogSWYgdGhlcmUgYXJlIG5vIGF0dGFjaG1lbnRzLCBhbiBleGNlcHRpb24gaXMgdGhyb3duLg0KLSAgICAgKiBPdGhlcndpc2UgdGhlIG1lc3NhZ2UgaXMgZWNob2VkLg0KLSAgICAgKi8NCi0gICAgcHVibGljIFNPQVBNZXNzYWdlIGludm9rZShTT0FQTWVzc2FnZSBzb2FwTWVzc2FnZSkgIHsNCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiPj4gU29hcE1lc3NhZ2VDaGVja01UT01Qcm92aWRlcjogUmVxdWVzdCByZWNlaXZlZC4iKTsNCi0NCi0NCi0gICAgICAgIGludCBudW1BdHRhY2htZW50cyA9IHNvYXBNZXNzYWdlLmNvdW50QXR0YWNobWVudHMoKTsNCi0gICAgICAgIGlmIChudW1BdHRhY2htZW50cyA9PSAwKSB7DQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCI+PiBTb2FwTWVzc2FnZUNoZWNrTVRPTVByb3ZpZGVyOiBObyBBdHRhY2htZW50cy4iKTsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbigiTm8gQXR0YWNobWVudHMgYXJlIGRldGVjdGVkIik7DQotICAgICAgICB9DQotICAgICAgICBTT0FQTWVzc2FnZSByZXNwb25zZSA9IG51bGw7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5IGZhY3RvcnkgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpOw0KLSAgICAgICAgICAgIHJlc3BvbnNlID0gZmFjdG9yeS5jcmVhdGVNZXNzYWdlKCk7DQotICAgICAgICAgICAgU09BUFBhcnQgc29hcFBhcnQgPSByZXNwb25zZS5nZXRTT0FQUGFydCgpOw0KLSAgICAgICAgICAgIFNPQVBCb2R5IHNvYXBCb2R5ID0gc29hcFBhcnQuZ2V0RW52ZWxvcGUoKS5nZXRCb2R5KCk7DQotICAgICAgICAgICAgc29hcEJvZHkuYWRkQ2hpbGRFbGVtZW50KChTT0FQQm9keUVsZW1lbnQpIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2FwTWVzc2FnZS4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U09BUEJvZHkoKS5nZXRDaGlsZEVsZW1lbnRzKCkubmV4dCgpKTsNCi0gICAgICAgICAgICByZXNwb25zZS5hZGRBdHRhY2htZW50UGFydCgoQXR0YWNobWVudFBhcnQpIHNvYXBNZXNzYWdlLmdldEF0dGFjaG1lbnRzKCkubmV4dCgpKTsNCi0gICAgICAgIH0gY2F0Y2ggKFNPQVBFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCI+PiBTb2FwTWVzc2FnZUNoZWNrTVRPTVByb3ZpZGVyOiBSZXR1cm5pbmcuIik7DQotICAgICAgICByZXR1cm4gcmVzcG9uc2U7ICAvLyBlY2hvIGJhY2sgdGhlIHNhbWUgbWVzc2FnZQ0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogQ291bnQgQXR0YWNobWVudHMNCi0gICAgICogQHBhcmFtIG1zZw0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqLw0KLSAgICBwcml2YXRlIGludCBjb3VudEF0dGFjaG1lbnRzKFNPQVBNZXNzYWdlIG1zZykgew0KLSAgICAgICAgSXRlcmF0b3IgaXQgPSBtc2cuZ2V0QXR0YWNobWVudHMoKTsNCi0gICAgICAgIGludCBjb3VudCA9IDA7DQotICAgICAgICBpZiAoaXQgPT0gbnVsbCApIHsNCi0gICAgICAgICAgICByZXR1cm4gMDsNCi0gICAgICAgIH0NCi0gICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsNCi0gICAgICAgICAgICBpdC5uZXh0KCk7DQotICAgICAgICAgICAgY291bnQrKzsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBjb3VudDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvc29hcG1zZ211L01FVEEtSU5GL01BTklGRVNULk1GIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyL3NvYXBtc2dtdS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY0YjU2OC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvc29hcG1zZ211L01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wDQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyL3NvYXBtc2dtdS9NRVRBLUlORi9Qcm92aWRlclNPQVBNZXNzYWdlLndzZGwgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvc29hcG1zZ211L01FVEEtSU5GL1Byb3ZpZGVyU09BUE1lc3NhZ2Uud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzM4ZTBlMy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvc29hcG1zZ211L01FVEEtSU5GL1Byb3ZpZGVyU09BUE1lc3NhZ2Uud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPCEtLQ0KLS0tPg0KLQ0KLTxkZWZpbml0aW9ucyB4bWxuczpodHRwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL2h0dHAvIiANCi0gICAgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIgDQotICAgIHhtbG5zOnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiANCi0gICAgeG1sbnM6dG5zPSJodHRwOi8vc29hcG1zZ211LnByb3ZpZGVyLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciDQotICAgIHhtbG5zOnNvYXBlbmM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIiANCi0gICAgeG1sbnM6dG09Imh0dHA6Ly9taWNyb3NvZnQuY29tL3dzZGwvbWltZS90ZXh0TWF0Y2hpbmcvIiANCi0gICAgeG1sbnM6bWltZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9taW1lLyIgDQotICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3NvYXBtc2dtdS5wcm92aWRlci5qYXh3cy5heGlzMi5hcGFjaGUub3JnIiANCi0gICAgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4NCi0gIDx0eXBlcz4NCi0gICAgIAk8eHNkOnNjaGVtYQ0KLQkJCXRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3NvYXBtc2dtdS5wcm92aWRlci5qYXh3cy5heGlzMi5hcGFjaGUub3JnIg0KLQkJCXhtbG5zOnRucz0iaHR0cDovL3NvYXBtc2dtdS5wcm92aWRlci5qYXh3cy5heGlzMi5hcGFjaGUub3JnIg0KLQkJCXhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPg0KLQkJCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iU3RyaW5nQXJyYXkiPg0KLQkJCQk8eHNkOnNlcXVlbmNlPg0KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9InZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIg0KLQkJCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+DQotDQotCQkJCTwveHNkOnNlcXVlbmNlPg0KLQkJCTwveHNkOmNvbXBsZXhUeXBlPg0KLQ0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJpbk1lc3NhZ2UiIHR5cGU9InRuczpTdHJpbmdBcnJheSIgLz4NCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0ib3V0TWVzc2FnZSIgdHlwZT0idG5zOlN0cmluZ0FycmF5IiAvPg0KLQkJICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHdvV2F5RXhjZXB0aW9uRmF1bHQiIHR5cGU9InhzZDpzdHJpbmciIC8+DQotCTwveHNkOnNjaGVtYT4NCi0gICAgDQotDQotICA8L3R5cGVzPg0KLSAgIA0KLSAgPG1lc3NhZ2UgbmFtZT0iZW1wdHlNZXNzYWdlIi8+DQotICA8bWVzc2FnZSBuYW1lPSJpbk1lc3NhZ2UiPg0KLSAgICA8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJ0bnM6aW5NZXNzYWdlIiAvPg0KLSAgPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2UgbmFtZT0ib3V0TWVzc2FnZSI+DQotICAgIDxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9InRuczpvdXRNZXNzYWdlIiAvPg0KLSAgPC9tZXNzYWdlPg0KLQ0KLSAgPHBvcnRUeXBlIG5hbWU9IkVjaG9TZXJ2aWNlSW50ZXJmYWNlIj4NCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJpbnZva2UiPg0KLSAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6aW5NZXNzYWdlIiAvPg0KLSAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOm91dE1lc3NhZ2UiIC8+DQotICAgIDwvb3BlcmF0aW9uPiAgDQotICA8L3BvcnRUeXBlPg0KLQ0KLSAgPGJpbmRpbmcgbmFtZT0iRWNob1NlcnZpY2VTb2FwIiB0eXBlPSJ0bnM6RWNob1NlcnZpY2VJbnRlcmZhY2UiPg0KLSAgICA8c29hcDpiaW5kaW5nIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIiBzdHlsZT0iZG9jdW1lbnQiIC8+DQotICAgIDxvcGVyYXRpb24gbmFtZT0iaW52b2tlIj4NCi0gICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iZWNob1N0cmluZyIgc3R5bGU9ImRvY3VtZW50IiAvPg0KLSAgICAgIDxpbnB1dD4NCi0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPg0KLSAgICAgIDwvaW5wdXQ+DQotICAgICAgPG91dHB1dD4NCi0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPg0KLSAgICAgIDwvb3V0cHV0Pg0KLSAgICA8L29wZXJhdGlvbj4NCi0gIDwvYmluZGluZz4NCi0NCi0gIDxzZXJ2aWNlIG5hbWU9IlNvYXBNZXNzYWdlTVVQcm92aWRlclNlcnZpY2UiPg0KLSAgICA8cG9ydCBuYW1lPSJTaW1wbGVQcm92aWRlclNlcnZpY2VTT0FQMTFwb3J0MCIgYmluZGluZz0idG5zOkVjaG9TZXJ2aWNlU29hcCI+DQotICAgICAgPHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo2MDYwL2F4aXMyL3NlcnZpY2VzL1NvYXBNZXNzYWdlTVVQcm92aWRlclNlcnZpY2UiIC8+DQotICAgIDwvcG9ydD4NCi0gIDwvc2VydmljZT4NCi0NCi08L2RlZmluaXRpb25zPg0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9zb2FwbXNnbXUvU29hcE1lc3NhZ2VNVVByb3ZpZGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvc29hcG1zZ211L1NvYXBNZXNzYWdlTVVQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2IxNmY4Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9zb2FwbXNnbXUvU29hcE1lc3NhZ2VNVVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnByb3ZpZGVyLnNvYXBtc2dtdTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm92aWRlci5BdHRhY2htZW50VXRpbDsNCi0NCi1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUE1lc3NhZ2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5CaW5kaW5nVHlwZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLlByb3ZpZGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2VNb2RlOw0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZVByb3ZpZGVyOw0KLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5TT0FQQmluZGluZzsNCi0NCi0vKioNCi0gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIHRoZSBzZXJ2ZXIgc2lkZSBpbXBsZW1lbnRhdGlvbiBmb3IgSkFYLVdTIFByb3ZpZGVyPE1FU1NBR0U+DQotICogZm9yIFNPQVAxMSBCaW5kaW5nIHdpdGggTW9kZSA9IE1FU1NBR0UuDQotICoNCi0gKiBUaGUgcmVjZWl2aW5nIG1lc3NhZ2UgYW5kIHRoZSBzZW5kaW5nIGJhY2sgbWVzc2FnZQ0KLSAqIG11c3QgaGF2ZSB0aGUgaGVhZGVycyBkZWZpbmVkIGluIHdzZGwuDQotICovDQotDQotQFdlYlNlcnZpY2VQcm92aWRlcigNCi0JCXNlcnZpY2VOYW1lPSJTb2FwTWVzc2FnZU1VUHJvdmlkZXJTZXJ2aWNlIiwNCi0JCXRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3NvYXBtc2dtdS5wcm92aWRlci5qYXh3cy5heGlzMi5hcGFjaGUub3JnIiwNCi0JCXdzZGxMb2NhdGlvbj0iTUVUQS1JTkYvUHJvdmlkZXJTT0FQTWVzc2FnZS53c2RsIiwNCi0JCXBvcnROYW1lPSJTaW1wbGVQcm92aWRlclNlcnZpY2VTT0FQMTFwb3J0MCIpDQotQEJpbmRpbmdUeXBlKFNPQVBCaW5kaW5nLlNPQVAxMUhUVFBfQklORElORykNCi1AU2VydmljZU1vZGUodmFsdWUgPSBTZXJ2aWNlLk1vZGUuTUVTU0FHRSkNCi1wdWJsaWMgY2xhc3MgU29hcE1lc3NhZ2VNVVByb3ZpZGVyIGltcGxlbWVudHMgUHJvdmlkZXI8U09BUE1lc3NhZ2U+IHsNCi0gICAgLyoqDQotICAgICAqIFRoaXMgc2VydmljZSByZWNlaXZlcyBzb2FwIG1lc3NhZ2UgYW5kIHJldHVybiBpdCBiYWNrIHRvIGNsaWVudCBhcyBpcw0KLSAgICAgKiBvciBhZGQgYSBzb2FwIG11c3RVbmRlcnN0YW5kIGF0dHJpYnV0ZSBoZWFkZXIgYW5kIHRoZW4gcmV0dXJuIGl0IGJhY2sgdG8gY2xpZW50DQotICAgICAqDQotICAgICAqIEBwYXJhbSBTT0FQTWVzc2FnZSBvYmplY3Qgc2VudCBieSB0aGUgY2xpZW50DQotICAgICAqIEByZXR1cm4gdGhlIFNPQVBNZXNzYWdlDQotICAgICAqLw0KLSAgICBwdWJsaWMgU09BUE1lc3NhZ2UgaW52b2tlKFNPQVBNZXNzYWdlIHJlcXVlc3QpIHsNCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTb2FwTWVzc2FnZU1VUHJvdmlkZXI6SW52b2tlOiBSZXF1ZXN0IHJlY2VpdmVkIik7DQotICAgICAgICBTT0FQTWVzc2FnZSByZXNwb25zZSA9IG51bGw7DQotDQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIFN0cmluZyBzdHJpbmcgPSBBdHRhY2htZW50VXRpbC50b1N0cmluZyhyZXF1ZXN0KTsNCi0gICAgICAgICAgICBpZiAoc3RyaW5nICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJpbnZva2U6IC0tLVJlY2VpdmVkIG1lc3NhZ2U9ICIgKyBzdHJpbmcpOw0KLSAgICAgICAgICAgICAgICBpZiAoc3RyaW5nLmNvbnRhaW5zKG5ldyBTdHJpbmdCdWZmZXIoQXR0YWNobWVudFV0aWwuVU5ERVJTVE9PRF9NVV9URVhUKSkpIHsNCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyByZXNwb25zZVN0ciA9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dGFjaG1lbnRVdGlsLm1zZ0Vudk1VX3VuZGVyc3Rvb2QucmVwbGFjZUFsbChBdHRhY2htZW50VXRpbC5NVUhFQURFUl9DTElFTlRfVU5ERVJTVE9PRCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dGFjaG1lbnRVdGlsLk1VSEVBREVSX1NFUlZFUl9VTkRFUlNUT09EKTsNCi0gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gQXR0YWNobWVudFV0aWwudG9TT0FQTWVzc2FnZShyZXNwb25zZVN0cik7DQotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImludm9rZTogLS0tUmVzcG9uc2UgbWVzc2FnZT0gIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEF0dGFjaG1lbnRVdGlsLnRvU3RyaW5nKHJlc3BvbnNlKSk7DQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyaW5nLmNvbnRhaW5zKG5ldyBTdHJpbmdCdWZmZXIoQXR0YWNobWVudFV0aWwuTVVfVEVYVCkpKSB7DQotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmVzcG9uc2VTdHIgPQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRhY2htZW50VXRpbC5tc2dFbnZNVS5yZXBsYWNlQWxsKEF0dGFjaG1lbnRVdGlsLk1VSEVBREVSX0NMSUVOVCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRhY2htZW50VXRpbC5NVUhFQURFUl9TRVJWRVIpOw0KLSAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBBdHRhY2htZW50VXRpbC50b1NPQVBNZXNzYWdlKHJlc3BvbnNlU3RyKTsNCi0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiaW52b2tlOiAtLS1SZXNwb25zZSBtZXNzYWdlPSAiDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgQXR0YWNobWVudFV0aWwudG9TdHJpbmcocmVzcG9uc2UpKTsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gcmVxdWVzdDsNCi0gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmdldE1pbWVIZWFkZXJzKCkucmVtb3ZlQWxsSGVhZGVycygpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgU3RyaW5nIGJhZFJlc3VsdCA9ICIqKipFUlJPUiBhdCBTZXJ2aWNlIEVuZHBvaW50OiBSZWNlaXZlZCBtZXNzYWdlIGlzIE5VTEwuIjsNCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKGJhZFJlc3VsdCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlNvYXBNZXNzYWdlTVVQcm92aWRlclNlcnZpY2U6IEZhaWxlZCB3aXRoIGV4Y2VwdGlvbi4iKTsNCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHJlc3BvbnNlOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9zb3VyY2UvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvc291cmNlL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDhmMWJkLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9zb3VyY2UvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvc291cmNlL1NvdXJjZVByb3ZpZGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvc291cmNlL1NvdXJjZVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiMmVkNGUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyL3NvdXJjZS9Tb3VyY2VQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm92aWRlci5zb3VyY2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuVGVzdExvZ2dlcjsNCi0NCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5SZXN1bHQ7DQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOw0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyOw0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk7DQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yOw0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7DQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVNvdXJjZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLkJpbmRpbmdUeXBlOw0KLWltcG9ydCBqYXZheC54bWwud3MuUHJvdmlkZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZVByb3ZpZGVyOw0KLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5TT0FQQmluZGluZzsNCi1pbXBvcnQgamF2YXgueG1sLndzLmh0dHAuSFRUUEJpbmRpbmc7DQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07DQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07DQotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOw0KLQ0KLUBXZWJTZXJ2aWNlUHJvdmlkZXIoc2VydmljZU5hbWU9IlNvdXJjZVByb3ZpZGVyU2VydmljZSIpDQotQEJpbmRpbmdUeXBlKFNPQVBCaW5kaW5nLlNPQVAxMUhUVFBfQklORElORykNCi1wdWJsaWMgY2xhc3MgU291cmNlUHJvdmlkZXIgaW1wbGVtZW50cyBQcm92aWRlcjxTb3VyY2U+IHsNCi0gICAgDQotICAgIC8vIFNhbWUgbG9naWMgYXMgU3RyaW5nUHJvdmlkZXINCi0gICAgcHVibGljIFNvdXJjZSBpbnZva2UoU291cmNlIHNvdXJjZSkgew0KLQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IFNvdXJjZVByb3ZpZGVyOiBSZXF1ZXN0IHJlY2VpdmVkLlxuIik7DQotICAgIAlpZiAoc291cmNlID09IG51bGwpIHsNCi0gICAgICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBzdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oIiAiLmdldEJ5dGVzKCkpOw0KLSAgICAgICAgICAgIFNvdXJjZSBzcmNTdHJlYW0gPSBuZXcgU3RyZWFtU291cmNlKChJbnB1dFN0cmVhbSkgc3RyZWFtKTsNCi0gICAgICAgICAgICByZXR1cm4gc3JjU3RyZWFtOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICAvLyBOb24tbnVsbCBzb3VyY2UNCi0gICAgCQ0KLSAgICAJU3RyaW5nV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsNCi0gICAgCXRyeSB7DQotICAgICAgICAgICAgVHJhbnNmb3JtZXIgdCA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1RyYW5zZm9ybWVyKCk7DQotICAgICAgICAgICAgUmVzdWx0IHJlc3VsdCA9IG5ldyBTdHJlYW1SZXN1bHQod3JpdGVyKTsNCi0gICAgICAgICAgICB0LnRyYW5zZm9ybShzb3VyY2UsIHJlc3VsdCk7DQotICAgICAgICB9IGNhdGNoIChUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOw0KLSAgICAgICAgfSBjYXRjaCAoVHJhbnNmb3JtZXJGYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yIGUpIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihlKTsNCi0gICAgICAgIH0gY2F0Y2ggKFRyYW5zZm9ybWVyRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihlKTsNCi0gICAgICAgIH0NCi0gICAgCVN0cmluZyB0ZXh0ID0gd3JpdGVyLmdldEJ1ZmZlcigpLnRvU3RyaW5nKCk7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gU291cmNlIFJlcXVlc3Qgb24gU2VydmVyOiBcbiIgKyB0ZXh0KTsNCi0gICAgCQ0KLSAgICAJaWYgKHRleHQgIT0gbnVsbCAmJiB0ZXh0LmNvbnRhaW5zKCJ0aHJvd1dlYlNlcnZpY2VFeGNlcHRpb24iKSkgew0KLSAgICAJICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKCJwcm92aWRlciIpOw0KLSAgICAJfSAgZWxzZSBpZiAodGV4dCAhPSBudWxsICYmIHRleHQuY29udGFpbnMoInRocm93VXNlckdlbmVyYXRlZEZhdWx0IikpIHsNCi0gICAgCSAgICBTdHJpbmcgdXNlckZhdWx0ID0gIjxzb2FwZW52OkZhdWx0IHhtbG5zOnNvYXBlbnY9XCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlL1wiPiIgKw0KLSAgICAJICAgICI8ZmF1bHRjb2RlPnNvYXBlbnY6UmVjZWl2ZXI8L2ZhdWx0Y29kZT4iICsNCi0gICAgCSAgICAiPGZhdWx0c3RyaW5nPnVzZXJHZW5lcmF0ZWRGYXVsdFRlc3Q8L2ZhdWx0c3RyaW5nPiIgKw0KLSAgICAJICAgICI8ZGV0YWlsPnNhbXBsZSBTT0FQIEZhdWx0IGRldGFpbHM8L2RldGFpbD4iICsNCi0gICAgCSAgICAiPC9zb2FwZW52OkZhdWx0PiI7DQotICAgIAkgICAgdGV4dCA9IHVzZXJGYXVsdDsNCi0gICAgCX0NCi0gICAgICAgIA0KLSAgICAJDQotICAgIAlCeXRlQXJyYXlJbnB1dFN0cmVhbSBzdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0odGV4dC5nZXRCeXRlcygpKTsNCi0gICAgCVNvdXJjZSBzcmNTdHJlYW0gPSBuZXcgU3RyZWFtU291cmNlKChJbnB1dFN0cmVhbSkgc3RyZWFtKTsNCi0gICAgCXJldHVybiBzcmNTdHJlYW07DQotICAgICAgICANCi0gICAgfQ0KLSAgICAJDQotDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9zb3VyY2Vtc2cvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvc291cmNlbXNnL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjRiNTY4Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9zb3VyY2Vtc2cvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjANCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvc291cmNlbXNnL1NvdXJjZU1lc3NhZ2VQcm92aWRlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyL3NvdXJjZW1zZy9Tb3VyY2VNZXNzYWdlUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmViYjZiNC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvc291cmNlbXNnL1NvdXJjZU1lc3NhZ2VQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm92aWRlci5zb3VyY2Vtc2c7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuVGVzdExvZ2dlcjsNCi0NCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5SZXN1bHQ7DQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOw0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyOw0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeTsNCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0Ow0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1Tb3VyY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5CaW5kaW5nVHlwZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLlByb3ZpZGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZVByb3ZpZGVyOw0KLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5TT0FQQmluZGluZzsNCi1pbXBvcnQgamF2YXgueG1sLndzLmh0dHAuSFRUUEJpbmRpbmc7DQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07DQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07DQotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOw0KLQ0KLUBXZWJTZXJ2aWNlUHJvdmlkZXIoc2VydmljZU5hbWU9IlNvdXJjZU1lc3NhZ2VQcm92aWRlclNlcnZpY2UiKQ0KLUBCaW5kaW5nVHlwZShTT0FQQmluZGluZy5TT0FQMTFIVFRQX0JJTkRJTkcpDQotcHVibGljIGNsYXNzIFNvdXJjZU1lc3NhZ2VQcm92aWRlciBpbXBsZW1lbnRzIFByb3ZpZGVyPFNvdXJjZT4gew0KLSAgICBTdHJpbmcgcmVzcG9uc2VBc1N0cmluZyA9IG5ldyBTdHJpbmcoIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/Pjxzb2FwZW52OkVudmVsb3BlIHhtbG5zOnNvYXBlbnY9XCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlL1wiPjxzb2FwZW52OkhlYWRlci8+PHNvYXBlbnY6Qm9keT48bnMyOlJldHVyblR5cGUgeG1sbnM6bnMyPVwiaHR0cDovL3Rlc3RcIj48cmV0dXJuX3N0cj5zb21lIHJlc3BvbnNlPC9yZXR1cm5fc3RyPjwvbnMyOlJldHVyblR5cGU+PC9zb2FwZW52OkJvZHk+PC9zb2FwZW52OkVudmVsb3BlPiIpOw0KLSAgICBwdWJsaWMgU291cmNlIGludm9rZShTb3VyY2Ugc291cmNlKSB7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gU291cmNlTWVzc2FnZVByb3ZpZGVyOiBSZXF1ZXN0IHJlY2VpdmVkLiIpOw0KLSAgICAJLy9TeXN0ZW0ub3V0LnByaW50bG4oIj4+IFNvdXJjZSB0b1N0cmluZzogXG4iK3NvdXJjZS50b1N0cmluZygpKTsNCi0gICAgCQ0KLSAgICAJdHJ5ew0KLSAgICAJCVN0cmluZ1dyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7DQotCSAgICAgICAgVHJhbnNmb3JtZXIgdCA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1RyYW5zZm9ybWVyKCk7DQotCSAgICAgICAgUmVzdWx0IHJlc3VsdCA9IG5ldyBTdHJlYW1SZXN1bHQod3JpdGVyKTsNCi0JICAgICAgICB0LnRyYW5zZm9ybShzb3VyY2UsIHJlc3VsdCk7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXINCi0gICAgICAgICAgICAgICAgICAgIC5kZWJ1ZygiPj4gU291cmNlIFJlcXVlc3Qgb24gU2VydmVyOiBcbiIgKyB3cml0ZXIuZ2V0QnVmZmVyKCkudG9TdHJpbmcoKSk7DQotCSAgICAgICAgDQotCSAgICAJYnl0ZVtdIGJ5dGVzID0gcmVzcG9uc2VBc1N0cmluZy5nZXRCeXRlcygpOw0KLQkgICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIHN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlcyk7DQotCSAgICAgICAgU291cmNlIHNyY1N0cmVhbSA9IG5ldyBTdHJlYW1Tb3VyY2UoKElucHV0U3RyZWFtKSBzdHJlYW0pOw0KLQkgICAgICAgIHJldHVybiBzcmNTdHJlYW07DQotICAgIAl9Y2F0Y2goRXhjZXB0aW9uIGUpew0KLSAgICAJCWUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgIAl9DQotICAgIAlyZXR1cm4gbnVsbDsNCi0gICAgfQ0KLSAgICAJDQotDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9zdHJpbmcvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvc3RyaW5nL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDhmMWJkLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9zdHJpbmcvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvc3RyaW5nL01FVEEtSU5GL2VjaG9zdHJpbmcud3NkbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9zdHJpbmcvTUVUQS1JTkYvZWNob3N0cmluZy53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWZlN2YwLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9zdHJpbmcvTUVUQS1JTkYvZWNob3N0cmluZy53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi0NCi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08d3NkbDpkZWZpbml0aW9ucyB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiB4bWxuczp0bnM9Imh0dHA6Ly9zdHJpbmdwcm92aWRlci5zYW1wbGUudGVzdC5vcmciIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJTdHJpbmdQcm92aWRlciIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vc3RyaW5ncHJvdmlkZXIuc2FtcGxlLnRlc3Qub3JnIj4NCi0gIDx3c2RsOnR5cGVzPg0KLSAgICA8eHNkOnNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9zdHJpbmdwcm92aWRlci5zYW1wbGUudGVzdC5vcmciIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPg0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlY2hvUmVzcG9uc2UiPg0KLSAgICAgIAk8eHNkOmNvbXBsZXhUeXBlPg0KLSAgICAgIAkJPHhzZDpzZXF1ZW5jZT4NCi0gICAgICAJCQk8eHNkOmVsZW1lbnQgbmFtZT0icmVzcG9uc2UiIHR5cGU9InhzZDpzdHJpbmciPjwveHNkOmVsZW1lbnQ+DQotICAgICAgCQk8L3hzZDpzZXF1ZW5jZT4NCi0gICAgICAJPC94c2Q6Y29tcGxleFR5cGU+DQotICAgICAgPC94c2Q6ZWxlbWVudD4NCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWNobyI+DQotICAgICAgCTx4c2Q6Y29tcGxleFR5cGU+DQotICAgICAgCQk8eHNkOnNlcXVlbmNlPg0KLSAgICAgIAkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJhcmciIHR5cGU9InhzZDpzdHJpbmciPjwveHNkOmVsZW1lbnQ+DQotICAgICAgCQk8L3hzZDpzZXF1ZW5jZT4NCi0gICAgICAJPC94c2Q6Y29tcGxleFR5cGU+DQotICAgICAgPC94c2Q6ZWxlbWVudD4NCi0gICAgPC94c2Q6c2NoZW1hPg0KLSAgPC93c2RsOnR5cGVzPg0KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJlY2hvUmVzcG9uc2UiPg0KLSAgICA8d3NkbDpwYXJ0IGVsZW1lbnQ9InRuczplY2hvUmVzcG9uc2UiIG5hbWU9ImVjaG9SZXNwb25zZSIvPg0KLSAgPC93c2RsOm1lc3NhZ2U+DQotICA8d3NkbDptZXNzYWdlIG5hbWU9ImVjaG8iPg0KLSAgICA8d3NkbDpwYXJ0IGVsZW1lbnQ9InRuczplY2hvIiBuYW1lPSJlY2hvIi8+DQotICA8L3dzZGw6bWVzc2FnZT4NCi0gIDx3c2RsOnBvcnRUeXBlIG5hbWU9IlN0cmluZ1Byb3ZpZGVyUG9ydFR5cGUiPg0KLSAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iZWNob1N0cmluZyI+DQotICAgICAgPHdzZGw6aW5wdXQgbWVzc2FnZT0idG5zOmVjaG8iLz4NCi0gICAgICA8d3NkbDpvdXRwdXQgbWVzc2FnZT0idG5zOmVjaG9SZXNwb25zZSIvPg0KLSAgICA8L3dzZGw6b3BlcmF0aW9uPg0KLSAgPC93c2RsOnBvcnRUeXBlPg0KLSAgPHdzZGw6YmluZGluZyBuYW1lPSJTdHJpbmdQcm92aWRlckJpbmRpbmciIHR5cGU9InRuczpTdHJpbmdQcm92aWRlclBvcnRUeXBlIj4NCi0gICAgPHNvYXA6YmluZGluZyBzdHlsZT0iZG9jdW1lbnQiIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIi8+DQotICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJlY2hvU3RyaW5nIj4NCi0gICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3N0cmluZ3Byb3ZpZGVyLnNhbXBsZS50ZXN0Lm9yZy9lY2hvU3RyaW5nIi8+DQotICAgICAgPHdzZGw6aW5wdXQ+DQotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgIDwvd3NkbDppbnB1dD4NCi0gICAgICA8d3NkbDpvdXRwdXQ+DQotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgIDwvd3NkbDpvdXRwdXQ+DQotICAgIDwvd3NkbDpvcGVyYXRpb24+DQotICA8L3dzZGw6YmluZGluZz4NCi0gIDx3c2RsOnNlcnZpY2UgbmFtZT0iU3RyaW5nUHJvdmlkZXJTZXJ2aWNlIj4NCi0gICAgPHdzZGw6cG9ydCBiaW5kaW5nPSJ0bnM6U3RyaW5nUHJvdmlkZXJCaW5kaW5nIiBuYW1lPSJTdHJpbmdQcm92aWRlclBvcnQiPg0KLSAgICAgIDxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6NjA2MC9heGlzMi9zZXJ2aWNlcy9FY2hvU2VydmljZSIvPg0KLSAgICA8L3dzZGw6cG9ydD4NCi0gIDwvd3NkbDpzZXJ2aWNlPg0KLTwvd3NkbDpkZWZpbml0aW9ucz4NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvc3RyaW5nL1N0cmluZ1Byb3ZpZGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvc3RyaW5nL1N0cmluZ1Byb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4N2IwZjAuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyL3N0cmluZy9TdHJpbmdQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm92aWRlci5zdHJpbmc7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuVGVzdExvZ2dlcjsNCi0NCi1pbXBvcnQgamF2YXgueG1sLndzLkJpbmRpbmdUeXBlOw0KLWltcG9ydCBqYXZheC54bWwud3MuUHJvdmlkZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZVByb3ZpZGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuaHR0cC5IVFRQQmluZGluZzsNCi1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuU09BUEJpbmRpbmc7DQotDQotDQotQFdlYlNlcnZpY2VQcm92aWRlcigNCi0gICAgICAgIHNlcnZpY2VOYW1lPSJTdHJpbmdQcm92aWRlclNlcnZpY2UiLCANCi0gICAgICAgIHdzZGxMb2NhdGlvbj0iTUVUQS1JTkYvZWNob3N0cmluZy53c2RsIiwgDQotICAgICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9zdHJpbmdwcm92aWRlci5zYW1wbGUudGVzdC5vcmciKQ0KLUBCaW5kaW5nVHlwZShTT0FQQmluZGluZy5TT0FQMTFIVFRQX0JJTkRJTkcpDQotcHVibGljIGNsYXNzIFN0cmluZ1Byb3ZpZGVyIGltcGxlbWVudHMgUHJvdmlkZXI8U3RyaW5nPiB7DQotICAgIA0KLSAgICBwdWJsaWMgU3RyaW5nIGludm9rZShTdHJpbmcgdGV4dCkgew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIlN0cmluZ1Byb3ZpZGVyIGludm9rZSByZWNlaXZlZCB0aGUgbWVzc2FnZSBbIiArIHRleHQgKyAiXSIpOw0KLSAgICAgICAgaWYgKHRleHQgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiAiICI7DQotICAgICAgICB9IGVsc2UgaWYgKHRleHQuY29udGFpbnMoInRocm93V2ViU2VydmljZUV4Y2VwdGlvbiIpKSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oInByb3ZpZGVyIik7DQotICAgICAgICB9IGVsc2UgaWYgKHRleHQuY29udGFpbnMoIjxDb2RlPiIpICYmIHRleHQuY29udGFpbnMoIlNPQVBGYXVsdFByb3ZpZGVyVGVzdHMiKSkgeyANCi0gICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIHJlY2VpdmVkIGZhdWx0IGhhcyB0aGUgUmVhc29uIHN0cmluZw0KLSAgICAgICAgICAgIGlmICh0ZXh0LmNvbnRhaW5zKCI8UmVhc29uPiIpKSB7DQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlIHsNCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJUZXN0IGZhaWxlZDogTm8gPFJlYXNvbj4gZWxlbWVudCIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0gZWxzZSBpZiAodGV4dC5jb250YWlucygiPGZhdWx0Y29kZT4iKSAmJiB0ZXh0LmNvbnRhaW5zKCJTT0FQRmF1bHRQcm92aWRlclRlc3RzIikpIHsgDQotICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSByZWNlaXZlZCBmYXVsdCBoYXMgdGhlIFJlYXNvbiBzdHJpbmcNCi0gICAgICAgICAgICBpZiAodGV4dC5jb250YWlucygiPGZhdWx0c3RyaW5nPiIpKSB7DQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlIHsNCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJUZXN0IGZhaWxlZDogTm8gPGZhdWx0c3RyaW5nPiBlbGVtZW50Iik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAvLyBFY2hvIHRoZSBpbnB1dA0KLSAgICAgICAgICAgIHJldHVybiB0ZXh0Ow0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9zdHJpbmdtc2cvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvc3RyaW5nbXNnL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjRiNTY4Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9zdHJpbmdtc2cvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjANCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvc3RyaW5nbXNnL1N0cmluZ01lc3NhZ2VQcm92aWRlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyL3N0cmluZ21zZy9TdHJpbmdNZXNzYWdlUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWMxNzM3Mi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvc3RyaW5nbXNnL1N0cmluZ01lc3NhZ2VQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm92aWRlci5zdHJpbmdtc2c7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuVGVzdExvZ2dlcjsNCi0NCi1pbXBvcnQgamF2YXgueG1sLndzLkJpbmRpbmdUeXBlOw0KLWltcG9ydCBqYXZheC54bWwud3MuUHJvdmlkZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlUHJvdmlkZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5zb2FwLlNPQVBCaW5kaW5nOw0KLWltcG9ydCBqYXZheC54bWwud3MuaHR0cC5IVFRQQmluZGluZzsNCi0NCi1AV2ViU2VydmljZVByb3ZpZGVyKHNlcnZpY2VOYW1lPSJTdHJpbmdNZXNzYWdlUHJvdmlkZXJTZXJ2aWNlIikNCi1AQmluZGluZ1R5cGUoU09BUEJpbmRpbmcuU09BUDExSFRUUF9CSU5ESU5HKQ0KLXB1YmxpYyBjbGFzcyBTdHJpbmdNZXNzYWdlUHJvdmlkZXIgaW1wbGVtZW50cyBQcm92aWRlcjxTdHJpbmc+IHsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHJlc3BvbnNlR29vZCA9ICI8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSd1dGYtOCc/Pjxzb2FwZW52OkVudmVsb3BlIHhtbG5zOnNvYXBlbnY9XCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlL1wiPjxzb2FwZW52OkhlYWRlciAvPjxzb2FwZW52OkJvZHk+PHByb3ZpZGVyPjxtZXNzYWdlPnJlcXVlc3QgcHJvY2Vzc2VkPC9tZXNzYWdlPjwvcHJvdmlkZXI+PC9zb2FwZW52OkJvZHk+PC9zb2FwZW52OkVudmVsb3BlPiI7DQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyByZXNwb25zZUJhZCAgPSAiPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0ndXRmLTgnPz48c29hcGVudjpFbnZlbG9wZSB4bWxuczpzb2FwZW52PVwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS9cIj48c29hcGVudjpIZWFkZXIgLz48c29hcGVudjpCb2R5Pjxwcm92aWRlcj48bWVzc2FnZT5FUlJPUjpudWxsIHJlcXVlc3QgcmVjZWl2ZWQ8L21lc3NhZ2U+PHByb3ZpZGVyPjwvc29hcGVudjpCb2R5Pjwvc29hcGVudjpFbnZlbG9wZT4iOw0KLSAgICANCi0gICAgcHVibGljIFN0cmluZyBpbnZva2UoU3RyaW5nIG9iaikgew0KLSAgICAgICAgaWYgKG9iaiAhPSBudWxsKSB7DQotICAgICAgICAgICAgU3RyaW5nIHN0ciA9IChTdHJpbmcpIG9iajsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gU3RyaW5nTWVzc2FnZVByb3ZpZGVyIHJlY2VpdmVkIGEgbmV3IHJlcXVlc3QiKTsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gcmVxdWVzdCBbIiArIHN0ciArICJdIik7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlR29vZDsNCi0gICAgICAgIH0NCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBFUlJPUjpudWxsIHJlcXVlc3QgcmVjZWl2ZWQiKTsNCi0gICAgICAgIHJldHVybiByZXNwb25zZUJhZDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvQXN5bmNDYWxsYmFjay5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L0FzeW5jQ2FsbGJhY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y2NmE2MC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvQXN5bmNDYWxsYmFjay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm94eTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5UZXN0TG9nZ2VyOw0KLWltcG9ydCBvcmcudGVzdC5wcm94eS5kb2NsaXR3cmFwcGVkLlJldHVyblR5cGU7DQotDQotaW1wb3J0IGphdmF4LnhtbC53cy5Bc3luY0hhbmRsZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5SZXNwb25zZTsNCi1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0aW9uRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqDQotICovDQotcHVibGljIGNsYXNzIEFzeW5jQ2FsbGJhY2sgaW1wbGVtZW50cyBBc3luY0hhbmRsZXIgew0KLQ0KLSAgICBwdWJsaWMgQXN5bmNDYWxsYmFjaygpIHsNCi0gICAgICAgIHN1cGVyKCk7DQotICAgIH0NCi0NCi0gICAgLyogKG5vbi1KYXZhZG9jKQ0KLSAgICAgKiBAc2VlIGphdmF4LnhtbC53cy5Bc3luY0hhbmRsZXIjaGFuZGxlUmVzcG9uc2UoamF2YXgueG1sLndzLlJlc3BvbnNlKQ0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgaGFuZGxlUmVzcG9uc2UoUmVzcG9uc2UgcmVzcG9uc2UpIHsNCi0gICAgICAgIHRyeXsNCi0gICAgICAgICAgICBPYmplY3Qgb2JqID0gcmVzcG9uc2UuZ2V0KCk7DQotICAgICAgICAgICAgaWYob2JqIGluc3RhbmNlb2YgUmV0dXJuVHlwZSl7DQotICAgICAgICAgICAgICAgIFJldHVyblR5cGUgdHlwZSA9IChSZXR1cm5UeXBlKW9iajsNCi0gICAgICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+UmV0dXJuIFN0cmluZyA9ICIgKyB0eXBlLmdldFJldHVyblN0cigpKTsNCi0gICAgICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZihvYmogaW5zdGFuY2VvZiBvcmcudGVzdC5wcm94eS5kb2NsaXRub253cmFwcGVkLlJldHVyblR5cGUpew0KLSAgICAgICAgICAgICAgICBvcmcudGVzdC5wcm94eS5kb2NsaXRub253cmFwcGVkLlJldHVyblR5cGUgcmV0dXJuVHlwZSA9IChvcmcudGVzdC5wcm94eS5kb2NsaXRub253cmFwcGVkLlJldHVyblR5cGUpb2JqOw0KLSAgICAgICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj5SZXR1cm4gU3RyaW5nID0gIiArIHJldHVyblR5cGUuZ2V0UmV0dXJuU3RyKCkpOw0KLSAgICAgICAgICAgICAgICByZXR1cm47DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJSZXNwb25zZS5nZXQgc2hvdWxkIGhhdmUgYmVlbiBSZXR1cm5UeXBlIik7DQotICAgICAgICAgICAgDQotICAgICAgICB9Y2F0Y2goRXhlY3V0aW9uRXhjZXB0aW9uIGUpew0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICB9Y2F0Y2goSW50ZXJydXB0ZWRFeGNlcHRpb24gZSl7DQotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvR29yaWxsYURMV1Byb3h5VGVzdHMuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9Hb3JpbGxhRExXUHJveHlUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGNlZDgzLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9Hb3JpbGxhRExXUHJveHlUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQ1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJveHk7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLlRlc3RMb2dnZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZnJhbWV3b3JrLkFic3RyYWN0VGVzdENhc2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5kYXRhYmluZGluZy5KQVhCVXRpbHNNb25pdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnByb3h5LmdvcmlsbGFfZGx3LnNlaS5Hb3JpbGxhSW50ZXJmYWNlOw0KLQ0KLWltcG9ydCBqYXZheC54bWwuZGF0YXR5cGUuRGF0YXR5cGVGYWN0b3J5Ow0KLWltcG9ydCBqYXZheC54bWwuZGF0YXR5cGUuRHVyYXRpb247DQotaW1wb3J0IGphdmF4LnhtbC5kYXRhdHlwZS5YTUxHcmVnb3JpYW5DYWxlbmRhcjsNCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLkJpbmRpbmdQcm92aWRlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLkRpc3BhdGNoOw0KLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsNCi1pbXBvcnQgamF2YS5pby5GaWxlOw0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247DQotaW1wb3J0IGphdmEubmV0LlVSTDsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOw0KLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsNCi1pbXBvcnQgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi1wdWJsaWMgY2xhc3MgR29yaWxsYURMV1Byb3h5VGVzdHMgZXh0ZW5kcyBBYnN0cmFjdFRlc3RDYXNlIHsNCi0NCi0gICAgcHJpdmF0ZSBRTmFtZSBzZXJ2aWNlTmFtZSA9IG5ldyBRTmFtZSgNCi0gICAgICAgICAgICAiaHR0cDovL29yZy5hcGFjaGUuYXhpczIuamF4d3MucHJveHkuZ29yaWxsYV9kbHciLCAiR29yaWxsYVNlcnZpY2UiKTsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgYXhpc0VuZHBvaW50ID0gImh0dHA6Ly9sb2NhbGhvc3Q6NjA2MC9heGlzMi9zZXJ2aWNlcy9Hb3JpbGxhU2VydmljZS5Hb3JpbGxhUHJveHlJbXBsUG9ydCI7DQotICAgIHByaXZhdGUgUU5hbWUgcG9ydE5hbWUgPSBuZXcgUU5hbWUoImh0dHA6Ly9vcmcuYXBhY2hlLmF4aXMyLmpheHdzLnByb3h5LnJwY2xpdCIsDQotICAgICAgICAgICAgIkdvcmlsbGFQb3J0Iik7DQotICAgIHByaXZhdGUgU3RyaW5nIHdzZGxMb2NhdGlvbiA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiYmFzZWRpciIsIi4iKSsiLyIrInRlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9nb3JpbGxhX2Rsdy9NRVRBLUlORi9nb3JpbGxhX2Rsdy53c2RsIjsNCi0gICAgDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsNCi0gICAgICAgIHJldHVybiBnZXRUZXN0U2V0dXAobmV3IFRlc3RTdWl0ZShHb3JpbGxhRExXUHJveHlUZXN0cy5jbGFzcykpOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogVXRpbGl0eSBtZXRob2QgdG8gZ2V0IHRoZSBwcm94eQ0KLSAgICAgKiBAcmV0dXJuIEdvcmlsbGFJbnRlcmZhY2UgcHJveHkNCi0gICAgICogQHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24NCi0gICAgICovDQotICAgIHB1YmxpYyBHb3JpbGxhSW50ZXJmYWNlIGdldFByb3h5KCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7DQotICAgICAgICBGaWxlIHdzZGw9IG5ldyBGaWxlKHdzZGxMb2NhdGlvbik7IA0KLSAgICAgICAgVVJMIHdzZGxVcmwgPSB3c2RsLnRvVVJMKCk7IA0KLSAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gU2VydmljZS5jcmVhdGUobnVsbCwgc2VydmljZU5hbWUpOw0KLSAgICAgICAgT2JqZWN0IHByb3h5ID1zZXJ2aWNlLmdldFBvcnQocG9ydE5hbWUsIEdvcmlsbGFJbnRlcmZhY2UuY2xhc3MpOw0KLSAgICAgICAgQmluZGluZ1Byb3ZpZGVyIHAgPSAoQmluZGluZ1Byb3ZpZGVyKXByb3h5OyANCi0gICAgICAgIHAuZ2V0UmVxdWVzdENvbnRleHQoKS5wdXQoQmluZGluZ1Byb3ZpZGVyLkVORFBPSU5UX0FERFJFU1NfUFJPUEVSVFksYXhpc0VuZHBvaW50KTsNCi0gICAgICAgIA0KLSAgICAgICAgcmV0dXJuIChHb3JpbGxhSW50ZXJmYWNlKXByb3h5Ow0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogVXRpbGl0eSBNZXRob2QgdG8gZ2V0IGEgRGlzcGF0Y2g8U3RyaW5nPg0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqIEB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uDQotICAgICAqLw0KLSAgICBwdWJsaWMgRGlzcGF0Y2g8U3RyaW5nPiBnZXREaXNwYXRjaCgpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24gew0KLSAgICAgICAgRmlsZSB3c2RsPSBuZXcgRmlsZSh3c2RsTG9jYXRpb24pOyANCi0gICAgICAgIFVSTCB3c2RsVXJsID0gd3NkbC50b1VSTCgpOyANCi0gICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IFNlcnZpY2UuY3JlYXRlKG51bGwsIHNlcnZpY2VOYW1lKTsNCi0gICAgICAgIHNlcnZpY2UuYWRkUG9ydChwb3J0TmFtZSwgbnVsbCwgYXhpc0VuZHBvaW50KTsNCi0gICAgICAgIERpc3BhdGNoPFN0cmluZz4gZGlzcGF0Y2ggPSBzZXJ2aWNlLmNyZWF0ZURpc3BhdGNoKHBvcnROYW1lLCBTdHJpbmcuY2xhc3MsIFNlcnZpY2UuTW9kZS5QQVlMT0FEKTsNCi0gICAgICAgIHJldHVybiBkaXNwYXRjaDsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFNpbXBsZSB0ZXN0IHRoYXQgZW5zdXJlcyB0aGF0IHdlIGNhbiBlY2hvIGEgc3RyaW5nLg0KLSAgICAgKiBJZiB0aGlzIHRlc3QgZmFpbHMsIGl0IHVzdWFsbHkgbWVhbnMgdGhhdCB0aGVyZSBhcmUgY29ubmVjdGlvbg0KLSAgICAgKiBwcm9ibGVtcyBvciBkZXBsb3kgcHJvYmxlbXMuDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RWNob1N0cmluZygpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgdHJ5eyANCi0gICAgICAgICAgICBHb3JpbGxhSW50ZXJmYWNlIHByb3h5ID0gZ2V0UHJveHkoKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBTdHJhaWdodCBGb3J3YXJkIFRlc3QNCi0gICAgICAgICAgICBTdHJpbmcgcmVxdWVzdCA9ICJIZWxsbyBXb3JsZCI7DQotICAgICAgICAgICANCi0gICAgICAgICAgICBTdHJpbmcgcmVzcG9uc2UgPSBwcm94eS5lY2hvU3RyaW5nKHJlcXVlc3QpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UgIT0gbnVsbCk7DQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3BvbnNlLCByZXF1ZXN0KTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBUcnkgYWdhaW4gdG8gdmVyaWZ5DQotICAgICAgICAgICAgcmVzcG9uc2UgPSBwcm94eS5lY2hvU3RyaW5nKHJlcXVlc3QpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UgIT0gbnVsbCk7DQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3BvbnNlLCByZXF1ZXN0KTsNCi0gICAgICAgICAgICANCi0gICAgICAgIH1jYXRjaChFeGNlcHRpb24gZSl7IA0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7IA0KLSAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiByZWNlaXZlZCIgKyBlKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFRlc3RzIHRoYXQgd2UgY2FuIGVjaG8gYSBudWxsDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RWNob1N0cmluZ051bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIHRyeXsgDQotICAgICAgICAgICAgR29yaWxsYUludGVyZmFjZSBwcm94eSA9IGdldFByb3h5KCk7DQotICAgICAgICAgICAgU3RyaW5nIHJlcXVlc3QgPSBudWxsOyAgLy8gTnVsbCBpcyBhbiBhcHByb3ByaWF0ZSBpbnB1dA0KLSAgICAgICAgICAgDQotICAgICAgICAgICAgU3RyaW5nIHJlc3BvbnNlID0gcHJveHkuZWNob1N0cmluZyhyZXF1ZXN0KTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlID09IG51bGwpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIFRyeSBhZ2FpbiB0byB2ZXJpZnkNCi0gICAgICAgICAgICByZXNwb25zZSA9IHByb3h5LmVjaG9TdHJpbmcocmVxdWVzdCk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZSA9PSBudWxsKTsNCi0gICAgICAgIH1jYXRjaChFeGNlcHRpb24gZSl7IA0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7IA0KLSAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiByZWNlaXZlZCIgKyBlKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFRlc3Qgd2hldGhlciB0aGUgQFhtbFNlZUFsc28gdGhhdCB3YXMgYWRkZWQgdG8gdGhlIFNFSQ0KLSAgICAgKiBpcyB1c2VkIHRvIGNvbnN0cnVjdCB0aGUgSkFYQkNvbnRleHQNCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RYbWxTZWVBbHNvKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICB0cnl7DQotICAgICAgICAgICAgLy8gU2V0IHVwIHRoZSBKQVhCVXRpbHMgbW9uaXRvcg0KLSAgICAgICAgICAgIEpBWEJVdGlsc01vbml0b3Iuc2V0TW9uaXRvcmluZyh0cnVlKTsNCi0gICAgICAgICAgICBKQVhCVXRpbHNNb25pdG9yLmNsZWFyKCk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgR29yaWxsYUludGVyZmFjZSBwcm94eSA9IGdldFByb3h5KCk7DQotICAgICAgICAgICAgU3RyaW5nIHJlcXVlc3QgPSAiSGVsbG8gV29ybGQiOw0KLSAgICAgICAgICAgDQotICAgICAgICAgICAgU3RyaW5nIHJlc3BvbnNlID0gcHJveHkuZWNob1N0cmluZyhyZXF1ZXN0KTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlICE9IG51bGwpOw0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXNwb25zZSwgcmVxdWVzdCk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gTm93IHF1ZXJ5IHRoZSBtb25pdG9yDQotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IGtleXMgPSBKQVhCVXRpbHNNb25pdG9yLmdldFBhY2thZ2VLZXlzKCk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShrZXlzICE9IG51bGwgJiYga2V5cy5zaXplKCkgPiAwKTsNCi0gICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8a2V5cy5zaXplKCk7IGkrKykgew0KLSAgICAgICAgICAgICAgICBTdHJpbmcgb2JzZXJ2ZWRLZXkgPSBrZXlzLmdldChpKTsNCi0gICAgICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIk9ic2VydmVkIEtleSA9IiArIG9ic2VydmVkS2V5KTsNCi0gICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIG9uZSBvZiB0aGUgZXhwZWN0ZWQgKHJlZmVyZW5jZWQpIHBhY2thZ2VzDQotICAgICAgICAgICAgICAgIGFzc2VydFRydWUob2JzZXJ2ZWRLZXkuY29udGFpbnMoIm9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJveHkuZ29yaWxsYV9kbHcuZGF0YSIpKTsNCi0gICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIHRoZSBwYWNrYWdlIHJlZmVyZW5jZWQgb25seSBieSBhbiBAWG1sU2VlQWxzbw0KLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKG9ic2VydmVkS2V5LmNvbnRhaW5zKCJvcmcudGVzdC5zdG9jazIiKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIFRyeSBhZ2FpbiB0byB2ZXJpZnkNCi0gICAgICAgICAgICBKQVhCVXRpbHNNb25pdG9yLmNsZWFyKCk7DQotICAgICAgICAgICAgcmVzcG9uc2UgPSBwcm94eS5lY2hvU3RyaW5nKHJlcXVlc3QpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UgIT0gbnVsbCk7DQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3BvbnNlLCByZXF1ZXN0KTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBOb3cgcXVlcnkgdGhlIG1vbml0b3INCi0gICAgICAgICAgICBrZXlzID0gSkFYQlV0aWxzTW9uaXRvci5nZXRQYWNrYWdlS2V5cygpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUoa2V5cyAhPSBudWxsICYmIGtleXMuc2l6ZSgpID4gMCk7DQotICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPGtleXMuc2l6ZSgpOyBpKyspIHsNCi0gICAgICAgICAgICAgICAgU3RyaW5nIG9ic2VydmVkS2V5ID0ga2V5cy5nZXQoaSk7DQotICAgICAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJPYnNlcnZlZCBLZXkgPSIgKyBvYnNlcnZlZEtleSk7DQotICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciBvbmUgb2YgdGhlIGV4cGVjdGVkIChyZWZlcmVuY2VkKSBwYWNrYWdlcw0KLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKG9ic2VydmVkS2V5LmNvbnRhaW5zKCJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnByb3h5LmdvcmlsbGFfZGx3LmRhdGEiKSk7DQotICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciB0aGUgcGFja2FnZSByZWZlcmVuY2VkIG9ubHkgYnkgYW4gQFhtbFNlZUFsc28NCi0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShvYnNlcnZlZEtleS5jb250YWlucygib3JnLnRlc3Quc3RvY2syIikpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH1jYXRjaChFeGNlcHRpb24gZSl7IA0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7IA0KLSAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiByZWNlaXZlZCIgKyBlKTsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgICAgSkFYQlV0aWxzTW9uaXRvci5zZXRNb25pdG9yaW5nKGZhbHNlKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFRlc3Rpbmcgb2YgU3RyaW5nTGlzdCAoeHNkOmxpc3Qgb2Ygc3RyaW5nKQ0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdEVjaG9TdHJpbmdMaXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICAvLyBSdW4gdGhlIHRlc3QgbXVsdGlwbGUgdGltZXMgdG8gdmVyaWZ5IGNvcnJlY3QgYmVoYXZpb3INCi0gICAgICAgIF90ZXN0RWNob1N0cmluZ0xpc3QoKTsNCi0gICAgICAgIF90ZXN0RWNob1N0cmluZ0xpc3QoKTsNCi0gICAgICAgIF90ZXN0RWNob1N0cmluZ0xpc3QoKTsNCi0gICAgfQ0KLSAgICBwdWJsaWMgdm9pZCBfdGVzdEVjaG9TdHJpbmdMaXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICB0cnl7IA0KLSAgICAgICAgICAgIEdvcmlsbGFJbnRlcmZhY2UgcHJveHkgPSBnZXRQcm94eSgpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIFRlc3Qgc2VuZGluZyBIZWxsbyBXb3JsZA0KLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiByZXF1ZXN0MSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLSAgICAgICAgICAgIHJlcXVlc3QxLmFkZCgiSGVsbG8iKTsNCi0gICAgICAgICAgICByZXF1ZXN0MS5hZGQoIldvcmxkIik7DQotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHJlc3BvbnNlMSA9IHByb3h5LmVjaG9TdHJpbmdMaXN0KHJlcXVlc3QxKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlMSAhPSBudWxsKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGNvbXBhcmVMaXN0cyhyZXF1ZXN0MSwgcmVzcG9uc2UxKSk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gVGVzdCB3aXRoIGVtcHR5IGxpc3QNCi0gICAgICAgICAgICBMaXN0PFN0cmluZz4gcmVxdWVzdDIgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0gICAgICAgICAgICBMaXN0PFN0cmluZz4gcmVzcG9uc2UyID0gcHJveHkuZWNob1N0cmluZ0xpc3QocmVxdWVzdDIpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UyICE9IG51bGwpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUoY29tcGFyZUxpc3RzKHJlcXVlc3QyLCByZXNwb25zZTIpKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBUZXN0IHdpdGggbnVsbA0KLSAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB0aGUgcmVzcG9uc2Ugd2lsbCBiZSBhbiBlbXB0eSBhcnJheSBiZWNhdXNlDQotICAgICAgICAgICAgLy8gdGhlIEpBWEIgYmVhbiB3aWxsIG5ldmVyIHJlcHJlc2VudCBMaXN0PFN0cmluZz4gYXMgYSBudWxsLiAgVGhpcyBpcyBleHBlY3RlZC4NCi0gICAgICAgICAgICBMaXN0PFN0cmluZz4gcmVxdWVzdDMgPSBudWxsOw0KLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiByZXNwb25zZTMgPSBwcm94eS5lY2hvU3RyaW5nTGlzdChyZXF1ZXN0Myk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZTMgIT0gbnVsbCAmJiByZXNwb25zZTMuc2l6ZSgpID09IDApOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIFRlc3Qgc2VuZGluZyBIZWxsbyBudWxsIFdvcmxkDQotICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHRoZSBudWxsIGlzIHB1cmdlZCBieSBKQVhCLiAgVGhpcyBpcyBleHBlY3RlZC4NCi0gICAgICAgICAgICBMaXN0PFN0cmluZz4gcmVxdWVzdDQgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0gICAgICAgICAgICByZXF1ZXN0NC5hZGQoIkhlbGxvIik7DQotICAgICAgICAgICAgcmVxdWVzdDQuYWRkKG51bGwpOw0KLSAgICAgICAgICAgIHJlcXVlc3Q0LmFkZCgiV29ybGQiKTsNCi0gICAgICAgICAgICBMaXN0PFN0cmluZz4gcmVzcG9uc2U0ID0gcHJveHkuZWNob1N0cmluZ0xpc3QocmVxdWVzdDQpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUocmVzcG9uc2U0IT0gbnVsbCk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjb21wYXJlTGlzdHMocmVxdWVzdDEsIHJlc3BvbnNlNCkpOyAgLy8gUmVzcG9uc2UgNCBzaG91bGQgYmUgdGhlIHNhbWUgYXMgUmVxdWVzdCAxDQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gVGVzdCBzZW5kaW5nICJIZWxsbyBXb3JsZCINCi0gICAgICAgICAgICAvLyBOb3RlIHRoYXQgdGhlIEhlbGxvIFdvcmxkIGlzIGRpdmlkZWQgaW50byB0d28gaXRlbXMuDQotICAgICAgICAgICAgLy8gVGhpcyBpcyBkdWUgdG8gdGhlIHhzZDpsaXN0IHNlcmlhbGl6YXRpb24uIFRoaXMgaXMgZXhwZWN0ZWQuDQotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHJlcXVlc3Q1ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQotICAgICAgICAgICAgcmVxdWVzdDUuYWRkKCJIZWxsbyBXb3JsZCIpOw0KLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiByZXNwb25zZTUgPSBwcm94eS5lY2hvU3RyaW5nTGlzdChyZXF1ZXN0NSk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZTUhPSBudWxsKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGNvbXBhcmVMaXN0cyhyZXF1ZXN0MSwgcmVzcG9uc2U1KSk7IC8vIFJlc3BvbnNlIDUgc2hvdWxkIGJlIHRoZSBzYW1lIGFzIFJlcXVlc3QgMQ0KLSAgICAgICAgfWNhdGNoKEV4Y2VwdGlvbiBlKXsgDQotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsgDQotICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIHJlY2VpdmVkIiArIGUpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogVGVzdGluZyBvZiBTdHJpbmdMaXN0ICh4c2Q6bGlzdCBvZiBzdHJpbmcpDQotICAgICAqIFNFSSBpcyBtYXBwZWQgdG8gU3RyaW5nW10gaW5zdGVhZCBvZiBMaXN0PFN0cmluZz4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RFY2hvU3RyaW5nTGlzdEFsdCgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgDQotICAgICAgICAvLyBSdW4gdGhlIHRlc3QgbXVsdGlwbGUgdGltZXMgdG8gdmVyaWZ5IGNvcnJlY3QgYmVoYXZpb3INCi0gICAgICAgIF90ZXN0RWNob1N0cmluZ0xpc3RBbHQoKTsNCi0gICAgICAgIF90ZXN0RWNob1N0cmluZ0xpc3RBbHQoKTsNCi0gICAgICAgIF90ZXN0RWNob1N0cmluZ0xpc3RBbHQoKTsNCi0gICAgfQ0KLSAgICBwdWJsaWMgdm9pZCBfdGVzdEVjaG9TdHJpbmdMaXN0QWx0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICB0cnl7IA0KLSAgICAgICAgICAgIEdvcmlsbGFJbnRlcmZhY2UgcHJveHkgPSBnZXRQcm94eSgpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIFRlc3Qgc2VuZGluZyBIZWxsbyBXb3JsZA0KLSAgICAgICAgICAgIFN0cmluZ1tdIHJlcXVlc3QxID0gbmV3IFN0cmluZ1tdIHsiSGVsbG8iLCAiV29ybGQifTsNCi0gICAgICAgICAgICBTdHJpbmdbXSByZXNwb25zZTEgPSBwcm94eS5lY2hvU3RyaW5nTGlzdEFsdChyZXF1ZXN0MSk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZTEgIT0gbnVsbCk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjb21wYXJlQXJyYXlzKHJlcXVlc3QxLCByZXNwb25zZTEpKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBUZXN0IHdpdGggZW1wdHkgYXJyYXkNCi0gICAgICAgICAgICBTdHJpbmdbXSByZXF1ZXN0MiA9IG5ldyBTdHJpbmdbXSB7fTsNCi0gICAgICAgICAgICBTdHJpbmdbXSByZXNwb25zZTIgPSBwcm94eS5lY2hvU3RyaW5nTGlzdEFsdChyZXF1ZXN0Mik7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZTIgIT0gbnVsbCk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjb21wYXJlQXJyYXlzKHJlcXVlc3QyLCByZXNwb25zZTIpKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBUZXN0IHdpdGggbnVsbA0KLSAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB0aGUgcmVzcG9uc2Ugd2lsbCBiZSBhbiBlbXB0eSBhcnJheSBiZWNhdXNlDQotICAgICAgICAgICAgLy8gdGhlIEpBWEIgYmVhbiB3aWxsIG5ldmVyIHJlcHJlc2VudCBMaXN0PFN0cmluZz4gYXMgYSBudWxsLiAgVGhpcyBpcyBleHBlY3RlZC4NCi0gICAgICAgICAgICBTdHJpbmdbXSByZXF1ZXN0MyA9IG51bGw7DQotICAgICAgICAgICAgU3RyaW5nW10gcmVzcG9uc2UzID0gcHJveHkuZWNob1N0cmluZ0xpc3RBbHQocmVxdWVzdDMpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UzICE9IG51bGwgJiYgcmVzcG9uc2UzLmxlbmd0aCA9PSAwKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBUZXN0IHNlbmRpbmcgSGVsbG8gbnVsbCBXb3JsZA0KLSAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB0aGUgbnVsbCBpcyBwdXJnZWQgYnkgSkFYQi4gIFRoaXMgaXMgZXhwZWN0ZWQuDQotICAgICAgICAgICAgU3RyaW5nW10gcmVxdWVzdDQgPSBuZXcgU3RyaW5nW10geyJIZWxsbyIsIG51bGwsICJXb3JsZCJ9Ow0KLSAgICAgICAgICAgIFN0cmluZ1tdIHJlc3BvbnNlNCA9IHByb3h5LmVjaG9TdHJpbmdMaXN0QWx0KHJlcXVlc3Q0KTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlNCE9IG51bGwpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUoY29tcGFyZUFycmF5cyhyZXF1ZXN0MSwgcmVzcG9uc2U0KSk7ICAvLyBSZXNwb25zZSA0IHNob3VsZCBiZSB0aGUgc2FtZSBhcyBSZXF1ZXN0IDENCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBUZXN0IHNlbmRpbmcgIkhlbGxvIFdvcmxkIg0KLSAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB0aGUgSGVsbG8gV29ybGQgaXMgZGl2aWRlZCBpbnRvIHR3byBpdGVtcy4NCi0gICAgICAgICAgICAvLyBUaGlzIGlzIGR1ZSB0byB0aGUgeHNkOmxpc3Qgc2VyaWFsaXphdGlvbi4gVGhpcyBpcyBleHBlY3RlZC4NCi0gICAgICAgICAgICBTdHJpbmdbXSByZXF1ZXN0NSA9IG5ldyBTdHJpbmdbXSB7IkhlbGxvIFdvcmxkIn07DQotICAgICAgICAgICAgU3RyaW5nW10gcmVzcG9uc2U1ID0gcHJveHkuZWNob1N0cmluZ0xpc3RBbHQocmVxdWVzdDUpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUocmVzcG9uc2U1IT0gbnVsbCk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjb21wYXJlQXJyYXlzKHJlcXVlc3QxLCByZXNwb25zZTUpKTsgLy8gUmVzcG9uc2UgNSBzaG91bGQgYmUgdGhlIHNhbWUgYXMgUmVxdWVzdCAxDQotICAgICAgICB9Y2F0Y2goRXhjZXB0aW9uIGUpeyANCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOyANCi0gICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gcmVjZWl2ZWQiICsgZSk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBUZXN0IG9mIFN0cmluZyBBcnJheSAoc3RyaW5nIG1heE9jY3Vycz11bmJvdW5kZWQpDQotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RWNob0luZGV4ZWRTdHJpbmdBcnJheSgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgLy8gUnVuIHRoZSB0ZXN0IG11bHRpcGxlIHRpbWVzIHRvIHZlcmlmeSBjb3JyZWN0IGJlaGF2aW9yDQotICAgICAgICBfdGVzdEVjaG9JbmRleGVkU3RyaW5nQXJyYXkoKTsNCi0gICAgICAgIF90ZXN0RWNob0luZGV4ZWRTdHJpbmdBcnJheSgpOw0KLSAgICAgICAgX3Rlc3RFY2hvSW5kZXhlZFN0cmluZ0FycmF5KCk7DQotICAgIH0NCi0gICAgcHVibGljIHZvaWQgX3Rlc3RFY2hvSW5kZXhlZFN0cmluZ0FycmF5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICB0cnl7IA0KLSAgICAgICAgICAgIEdvcmlsbGFJbnRlcmZhY2UgcHJveHkgPSBnZXRQcm94eSgpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIFRlc3Qgc2VuZGluZyBIZWxsbyBXb3JsZA0KLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiByZXF1ZXN0MSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLSAgICAgICAgICAgIHJlcXVlc3QxLmFkZCgiSGVsbG8iKTsNCi0gICAgICAgICAgICByZXF1ZXN0MS5hZGQoIldvcmxkIik7DQotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHJlc3BvbnNlMSA9IHByb3h5LmVjaG9JbmRleGVkU3RyaW5nQXJyYXkocmVxdWVzdDEpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UxICE9IG51bGwpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUoY29tcGFyZUxpc3RzKHJlcXVlc3QxLCByZXNwb25zZTEpKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBUZXN0IHdpdGggZW1wdHkgbGlzdA0KLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiByZXF1ZXN0MiA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiByZXNwb25zZTIgPSBwcm94eS5lY2hvSW5kZXhlZFN0cmluZ0FycmF5KHJlcXVlc3QyKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlMiAhPSBudWxsKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGNvbXBhcmVMaXN0cyhyZXF1ZXN0MiwgcmVzcG9uc2UyKSk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gVGVzdCB3aXRoIG51bGwNCi0gICAgICAgICAgICAvLyBOb3RlIHRoYXQgdGhlIHJlc3BvbnNlIHdpbGwgYmUgYW4gZW1wdHkgYXJyYXkgYmVjYXVzZQ0KLSAgICAgICAgICAgIC8vIHRoZSBKQVhCIGJlYW4gd2lsbCBuZXZlciByZXByZXNlbnQgTGlzdDxTdHJpbmc+IGFzIGEgbnVsbC4gIFRoaXMgaXMgZXhwZWN0ZWQuDQotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHJlcXVlc3QzID0gbnVsbDsNCi0gICAgICAgICAgICBMaXN0PFN0cmluZz4gcmVzcG9uc2UzID0gcHJveHkuZWNob0luZGV4ZWRTdHJpbmdBcnJheShyZXF1ZXN0Myk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZTMgIT0gbnVsbCAmJiByZXNwb25zZTMuc2l6ZSgpID09IDApOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIFRlc3Qgc2VuZGluZyBIZWxsbyBudWxsIFdvcmxkDQotICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHRoZSBudWxsIGlzIHByZXNlcnZlZCBhbmQgdGhlIHJlcXVlc3QgYW5kIHJlc3BvbnNlDQotICAgICAgICAgICAgLy8gYXJlIHRoZSBzYW1lLi5ub3RlIHRoYXQgdGhpcyBpcyBkaWZmZXJlbnQgdGhhbiB0aGUgeHNkOmxpc3QgcHJvY2Vzc2luZyAoc2VlIHRlc3RTdHJpbmdMaXN0IGFib3ZlKQ0KLSAgICAgICAgICAgIC8vIFRoaXMgaXMgZXhwZWN0ZWQuDQotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHJlcXVlc3Q0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQotICAgICAgICAgICAgcmVxdWVzdDQuYWRkKCJIZWxsbyIpOw0KLSAgICAgICAgICAgIHJlcXVlc3Q0LmFkZChudWxsKTsNCi0gICAgICAgICAgICByZXF1ZXN0NC5hZGQoIldvcmxkIik7DQotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHJlc3BvbnNlNCA9IHByb3h5LmVjaG9JbmRleGVkU3RyaW5nQXJyYXkocmVxdWVzdDQpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUocmVzcG9uc2U0IT0gbnVsbCk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjb21wYXJlTGlzdHMocmVxdWVzdDQsIHJlc3BvbnNlNCkpOyAgLy8gUmVzcG9uc2UgNCBzaG91bGQgYmUgdGhlIHNhbWUgYXMgUmVxdWVzdCAxDQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gVGVzdCBzZW5kaW5nICJIZWxsbyBXb3JsZCINCi0gICAgICAgICAgICAvLyBOb3RlIHRoYXQgdGhlIEhlbGxvIFdvcmxkIHJlbWFpbnMgb25lIGl0ZW0uDQotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHJlcXVlc3Q1ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQotICAgICAgICAgICAgcmVxdWVzdDUuYWRkKCJIZWxsbyBXb3JsZCIpOw0KLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiByZXNwb25zZTUgPSBwcm94eS5lY2hvSW5kZXhlZFN0cmluZ0FycmF5KHJlcXVlc3Q1KTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlNSE9IG51bGwpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUoY29tcGFyZUxpc3RzKHJlcXVlc3Q1LCByZXNwb25zZTUpKTsgLy8gUmVzcG9uc2UgNSBzaG91bGQgYmUgdGhlIHNhbWUgYXMgUmVxdWVzdCAxDQotICAgICAgICB9Y2F0Y2goRXhjZXB0aW9uIGUpeyANCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOyANCi0gICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gcmVjZWl2ZWQiICsgZSk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBUZXN0IG9mIFN0cmluZyBBcnJheSAoc3RyaW5nIG1heE9jY3Vycz11bmJvdW5kZWQpDQotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RWNob1N0cmluZ0FycmF5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICANCi0gICAgICAgIC8vIFJ1biB0aGUgdGVzdCBtdWx0aXBsZSB0aW1lcyB0byB2ZXJpZnkgY29ycmVjdCBiZWhhdmlvcg0KLSAgICAgICAgX3Rlc3RFY2hvU3RyaW5nQXJyYXkoKTsNCi0gICAgICAgIF90ZXN0RWNob1N0cmluZ0FycmF5KCk7DQotICAgICAgICBfdGVzdEVjaG9TdHJpbmdBcnJheSgpOw0KLSAgICB9DQotICAgIHB1YmxpYyB2b2lkIF90ZXN0RWNob1N0cmluZ0FycmF5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICB0cnl7IA0KLSAgICAgICAgICAgIEdvcmlsbGFJbnRlcmZhY2UgcHJveHkgPSBnZXRQcm94eSgpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIFRlc3Qgc2VuZGluZyBIZWxsbyBXb3JsZA0KLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiByZXF1ZXN0MSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLSAgICAgICAgICAgIHJlcXVlc3QxLmFkZCgiSGVsbG8iKTsNCi0gICAgICAgICAgICByZXF1ZXN0MS5hZGQoIldvcmxkIik7DQotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHJlc3BvbnNlMSA9IHByb3h5LmVjaG9TdHJpbmdBcnJheShyZXF1ZXN0MSk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZTEgIT0gbnVsbCk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjb21wYXJlTGlzdHMocmVxdWVzdDEsIHJlc3BvbnNlMSkpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIFRlc3Qgd2l0aCBlbXB0eSBsaXN0DQotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHJlcXVlc3QyID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHJlc3BvbnNlMiA9IHByb3h5LmVjaG9TdHJpbmdBcnJheShyZXF1ZXN0Mik7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZTIgIT0gbnVsbCk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjb21wYXJlTGlzdHMocmVxdWVzdDIsIHJlc3BvbnNlMikpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIFRlc3Qgd2l0aCBudWxsDQotICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHRoZSByZXNwb25zZSB3aWxsIGJlIGFuIGVtcHR5IGFycmF5IGJlY2F1c2UNCi0gICAgICAgICAgICAvLyB0aGUgSkFYQiBiZWFuIHdpbGwgbmV2ZXIgcmVwcmVzZW50IExpc3Q8U3RyaW5nPiBhcyBhIG51bGwuICBUaGlzIGlzIGV4cGVjdGVkLg0KLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiByZXF1ZXN0MyA9IG51bGw7DQotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHJlc3BvbnNlMyA9IHByb3h5LmVjaG9TdHJpbmdBcnJheShyZXF1ZXN0Myk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZTMgIT0gbnVsbCAmJiByZXNwb25zZTMuc2l6ZSgpID09IDApOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIFRlc3Qgc2VuZGluZyBIZWxsbyBudWxsIFdvcmxkDQotICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHRoZSBudWxsIGlzIHByZXNlcnZlZCBhbmQgdGhlIHJlcXVlc3QgYW5kIHJlc3BvbnNlDQotICAgICAgICAgICAgLy8gYXJlIHRoZSBzYW1lLi5ub3RlIHRoYXQgdGhpcyBpcyBkaWZmZXJlbnQgdGhhbiB0aGUgeHNkOmxpc3QgcHJvY2Vzc2luZyAoc2VlIHRlc3RTdHJpbmdMaXN0IGFib3ZlKQ0KLSAgICAgICAgICAgIC8vIFRoaXMgaXMgZXhwZWN0ZWQuDQotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHJlcXVlc3Q0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQotICAgICAgICAgICAgcmVxdWVzdDQuYWRkKCJIZWxsbyIpOw0KLSAgICAgICAgICAgIHJlcXVlc3Q0LmFkZChudWxsKTsNCi0gICAgICAgICAgICByZXF1ZXN0NC5hZGQoIldvcmxkIik7DQotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHJlc3BvbnNlNCA9IHByb3h5LmVjaG9TdHJpbmdBcnJheShyZXF1ZXN0NCk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZTQhPSBudWxsKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGNvbXBhcmVMaXN0cyhyZXF1ZXN0NCwgcmVzcG9uc2U0KSk7ICAvLyBSZXNwb25zZSA0IHNob3VsZCBiZSB0aGUgc2FtZSBhcyBSZXF1ZXN0IDENCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBUZXN0IHNlbmRpbmcgIkhlbGxvIFdvcmxkIg0KLSAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB0aGUgSGVsbG8gV29ybGQgcmVtYWlucyBvbmUgaXRlbS4NCi0gICAgICAgICAgICBMaXN0PFN0cmluZz4gcmVxdWVzdDUgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0gICAgICAgICAgICByZXF1ZXN0NS5hZGQoIkhlbGxvIFdvcmxkIik7DQotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHJlc3BvbnNlNSA9IHByb3h5LmVjaG9TdHJpbmdBcnJheShyZXF1ZXN0NSk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZTUhPSBudWxsKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGNvbXBhcmVMaXN0cyhyZXF1ZXN0NSwgcmVzcG9uc2U1KSk7IC8vIFJlc3BvbnNlIDUgc2hvdWxkIGJlIHRoZSBzYW1lIGFzIFJlcXVlc3QgMQ0KLSAgICAgICAgfWNhdGNoKEV4Y2VwdGlvbiBlKXsgDQotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsgDQotICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIHJlY2VpdmVkIiArIGUpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogVGVzdCBvZiBTdHJpbmcgQXJyYXkgKHN0cmluZyBtYXhPY2N1cnM9dW5ib3VuZGVkKSB3aGljaCBpcyBtYXBwZWQgdG8gU3RyaW5nW10NCi0gICAgICogQHRocm93cyBFeGNlcHRpb24NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RFY2hvU3RyaW5nQXJyYXlBbHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gUnVuIHRoZSB0ZXN0IG11bHRpcGxlIHRpbWVzIHRvIHZlcmlmeSBjb3JyZWN0IGJlaGF2aW9yDQotICAgICAgICBfdGVzdEVjaG9TdHJpbmdBcnJheUFsdCgpOw0KLSAgICAgICAgX3Rlc3RFY2hvU3RyaW5nQXJyYXlBbHQoKTsNCi0gICAgICAgIF90ZXN0RWNob1N0cmluZ0FycmF5QWx0KCk7DQotICAgIH0NCi0gICAgcHVibGljIHZvaWQgX3Rlc3RFY2hvU3RyaW5nQXJyYXlBbHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIHRyeXsgDQotICAgICAgICAgICAgR29yaWxsYUludGVyZmFjZSBwcm94eSA9IGdldFByb3h5KCk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gVGVzdCBzZW5kaW5nIEhlbGxvIFdvcmxkDQotICAgICAgICAgICAgU3RyaW5nW10gcmVxdWVzdDEgPSBuZXcgU3RyaW5nW10geyJIZWxsbyIsICJXb3JsZCJ9Ow0KLSAgICAgICAgICAgIFN0cmluZ1tdIHJlc3BvbnNlMSA9IHByb3h5LmVjaG9TdHJpbmdBcnJheUFsdChyZXF1ZXN0MSk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZTEgIT0gbnVsbCk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjb21wYXJlQXJyYXlzKHJlcXVlc3QxLCByZXNwb25zZTEpKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBUZXN0IHdpdGggZW1wdHkgbGlzdA0KLSAgICAgICAgICAgIFN0cmluZ1tdIHJlcXVlc3QyID0gbmV3IFN0cmluZ1tdIHt9Ow0KLSAgICAgICAgICAgIFN0cmluZ1tdIHJlc3BvbnNlMiA9IHByb3h5LmVjaG9TdHJpbmdBcnJheUFsdChyZXF1ZXN0Mik7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZTIgIT0gbnVsbCk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjb21wYXJlQXJyYXlzKHJlcXVlc3QyLCByZXNwb25zZTIpKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBUZXN0IHdpdGggbnVsbA0KLSAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB0aGUgcmVzcG9uc2Ugd2lsbCBiZSBhbiBlbXB0eSBhcnJheSBiZWNhdXNlDQotICAgICAgICAgICAgLy8gdGhlIEpBWEIgYmVhbiB3aWxsIG5ldmVyIHJlcHJlc2VudCBMaXN0PFN0cmluZz4gYXMgYSBudWxsLiAgVGhpcyBpcyBleHBlY3RlZC4NCi0gICAgICAgICAgICBTdHJpbmdbXSByZXF1ZXN0MyA9IG51bGw7DQotICAgICAgICAgICAgU3RyaW5nW10gcmVzcG9uc2UzID0gcHJveHkuZWNob1N0cmluZ0FycmF5QWx0KHJlcXVlc3QzKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlMyAhPSBudWxsICYmIHJlc3BvbnNlMy5sZW5ndGggPT0gMCk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gVGVzdCBzZW5kaW5nIEhlbGxvIG51bGwgV29ybGQNCi0gICAgICAgICAgICAvLyBOb3RlIHRoYXQgdGhlIG51bGwgaXMgcHJlc2VydmVkIGFuZCB0aGUgcmVxdWVzdCBhbmQgcmVzcG9uc2UNCi0gICAgICAgICAgICAvLyBhcmUgdGhlIHNhbWUuLm5vdGUgdGhhdCB0aGlzIGlzIGRpZmZlcmVudCB0aGFuIHRoZSB4c2Q6bGlzdCBwcm9jZXNzaW5nIChzZWUgdGVzdFN0cmluZ0xpc3QgYWJvdmUpDQotICAgICAgICAgICAgLy8gVGhpcyBpcyBleHBlY3RlZC4NCi0gICAgICAgICAgICBTdHJpbmdbXSByZXF1ZXN0NCA9IG5ldyBTdHJpbmdbXSB7IkhlbGxvIiwgbnVsbCwgIldvcmxkIn07DQotICAgICAgICAgICAgU3RyaW5nW10gcmVzcG9uc2U0ID0gcHJveHkuZWNob1N0cmluZ0FycmF5QWx0KHJlcXVlc3Q0KTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlNCE9IG51bGwpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUoY29tcGFyZUFycmF5cyhyZXF1ZXN0NCwgcmVzcG9uc2U0KSk7ICAvLyBSZXNwb25zZSA0IHNob3VsZCBiZSB0aGUgc2FtZSBhcyBSZXF1ZXN0IDENCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBUZXN0IHNlbmRpbmcgIkhlbGxvIFdvcmxkIg0KLSAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB0aGUgSGVsbG8gV29ybGQgcmVtYWlucyBvbmUgaXRlbS4NCi0gICAgICAgICAgICBTdHJpbmdbXSByZXF1ZXN0NSA9IG5ldyBTdHJpbmdbXSB7IkhlbGxvIFdvcmxkIn07DQotICAgICAgICAgICAgU3RyaW5nW10gcmVzcG9uc2U1ID0gcHJveHkuZWNob1N0cmluZ0FycmF5QWx0KHJlcXVlc3Q1KTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlNSE9IG51bGwpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUoY29tcGFyZUFycmF5cyhyZXF1ZXN0NSwgcmVzcG9uc2U1KSk7IC8vIFJlc3BvbnNlIDUgc2hvdWxkIGJlIHRoZSBzYW1lIGFzIFJlcXVlc3QgMQ0KLSAgICAgICAgfWNhdGNoKEV4Y2VwdGlvbiBlKXsgDQotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsgDQotICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIHJlY2VpdmVkIiArIGUpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RWNob0RhdGUoKSB0aHJvd3MgRXhjZXB0aW9uew0KLSAgICAJdHJ5ew0KLSAgICAJCVN5c3RlbS5vdXQucHJpbnRsbigiVGVzdEVjaG9EYXRlIik7DQotCSAgICAJR29yaWxsYUludGVyZmFjZSBwcm94eSA9IGdldFByb3h5KCk7DQotCSAgICAJR3JlZ29yaWFuQ2FsZW5kYXIgY2FsID0gbmV3IEdyZWdvcmlhbkNhbGVuZGFyKENhbGVuZGFyLllFQVIsIENhbGVuZGFyLk1PTlRILCBDYWxlbmRhci5EQVlfT0ZfTU9OVEgpOw0KLQkgICAgCURhdGF0eXBlRmFjdG9yeSBqYXZheHR5cGVGYWN0b3J5ID0gRGF0YXR5cGVGYWN0b3J5Lm5ld0luc3RhbmNlKCk7DQotCSAgICAJWE1MR3JlZ29yaWFuQ2FsZW5kYXIgcmVxdWVzdD0gIGphdmF4dHlwZUZhY3RvcnkubmV3WE1MR3JlZ29yaWFuQ2FsZW5kYXIoY2FsKTsNCi0JICAgIAlTeXN0ZW0ub3V0LnByaW50bG4oIkphdmF4IEZhY3RvcnkgQ2xhenogTmFtZSA9ICIrcmVxdWVzdC5nZXRDbGFzcygpLmdldE5hbWUoKSk7DQotCSAgICAJRHVyYXRpb24gZCA9IGphdmF4dHlwZUZhY3RvcnkubmV3RHVyYXRpb24oU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOw0KLQkgICAgCVhNTEdyZWdvcmlhbkNhbGVuZGFyIHJlc3BvbnNlID0gcHJveHkuZWNob0RhdGUocmVxdWVzdCwgZCk7DQotCSAgICAJU3lzdGVtLm91dC5wcmludGxuKHJlc3BvbnNlLnRvU3RyaW5nKCkpOw0KLQkgICAgCWFzc2VydE5vdE51bGwocmVzcG9uc2UpOw0KLSAgICAJfWNhdGNoKEV4Y2VwdGlvbiBlKXsNCi0gICAgCQllLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAJCWZhaWwoIkV4Y2VwdGlvbiBpbiB0ZXN0RWNob0RhdGUgOiIrZSk7DQotICAgIAl9DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHRlc3RQb2x5bW9ycGhpY0RhdGUoKSB0aHJvd3MgRXhjZXB0aW9uew0KLSAgICAJdHJ5ew0KLQkgICAgCUdvcmlsbGFJbnRlcmZhY2UgcHJveHkgPSBnZXRQcm94eSgpOw0KLQkgICAgCUdyZWdvcmlhbkNhbGVuZGFyIGNhbCA9IG5ldyBHcmVnb3JpYW5DYWxlbmRhcihDYWxlbmRhci5ZRUFSLCBDYWxlbmRhci5NT05USCwgQ2FsZW5kYXIuREFZX09GX01PTlRIKTsNCi0JICAgIAlEYXRhdHlwZUZhY3RvcnkgdHlwZUZhY3RvcnkgPSBEYXRhdHlwZUZhY3RvcnkubmV3SW5zdGFuY2UoKTsNCi0JICAgIAlYTUxHcmVnb3JpYW5DYWxlbmRhciByZXF1ZXN0ID0gIHR5cGVGYWN0b3J5Lm5ld1hNTEdyZWdvcmlhbkNhbGVuZGFyKGNhbCk7DQotCSAgICAgICAgcHJveHkuZWNob1BvbHltb3JwaGljRGF0ZShyZXF1ZXN0KTsNCi0JICAgIAkNCi0gICAgCX1jYXRjaChFeGNlcHRpb24gZSl7DQotICAgIAkJZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgCQlmYWlsKCJFeGNlcHRpb24gaW4gdGVzdEVjaG9EYXRlIDoiK2UpOw0KLSAgICAJfQ0KLSAgICB9DQotICAgIA0KLSAgICBwcml2YXRlIGJvb2xlYW4gY29tcGFyZUxpc3RzKExpc3QgaW4sIExpc3Qgb3V0KSB7DQotICAgICAgICBpZiAoaW4uc2l6ZSgpICE9IG91dC5zaXplKCkpIHsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiU2l6ZSBtaXNtYXRjaCAiICsgaW4uc2l6ZSgpICsgIiE9IiArIG91dC5zaXplKCkpOw0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0gICAgICAgIGZvciAoaW50IGk9MDsgaTxpbi5zaXplKCk7IGkrKykgew0KLSAgICAgICAgICAgIE9iamVjdCBpbkl0ZW0gPSBpbi5nZXQoaSk7DQotICAgICAgICAgICAgT2JqZWN0IG91dEl0ZW0gPSBvdXQuZ2V0KGkpOw0KLSAgICAgICAgICAgIGlmIChpbkl0ZW0gIT0gbnVsbCAmJiAhaW5JdGVtLmVxdWFscyhvdXRJdGVtKSB8fA0KLSAgICAgICAgICAgICAgICAoaW5JdGVtID09IG51bGwgJiYgaW5JdGVtICE9IG91dEl0ZW0pKSB7DQotICAgICAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJJdGVtICIgKyBpICsgIiBtaXNtYXRjaCAiICsgaW5JdGVtICsgIiE9IiArIG91dEl0ZW0pOw0KLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICANCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotICAgIA0KLSAgICBwcml2YXRlIGJvb2xlYW4gY29tcGFyZUFycmF5cyhTdHJpbmdbXSBpbiwgU3RyaW5nW10gb3V0KSB7DQotICAgICAgICBpZiAoaW4ubGVuZ3RoICE9IG91dC5sZW5ndGgpIHsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiU2l6ZSBtaXNtYXRjaCAiICsgaW4ubGVuZ3RoICsgIiE9IiArIG91dC5sZW5ndGgpOw0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0gICAgICAgIGZvciAoaW50IGk9MDsgaTxpbi5sZW5ndGg7IGkrKykgew0KLSAgICAgICAgICAgIE9iamVjdCBpbkl0ZW0gPSBpbltpXTsNCi0gICAgICAgICAgICBPYmplY3Qgb3V0SXRlbSA9IG91dFtpXTsNCi0gICAgICAgICAgICBpZiAoaW5JdGVtICE9IG51bGwgJiYgIWluSXRlbS5lcXVhbHMob3V0SXRlbSkgfHwNCi0gICAgICAgICAgICAgICAgKGluSXRlbSA9PSBudWxsICYmIGluSXRlbSAhPSBvdXRJdGVtKSkgew0KLSAgICAgICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiSXRlbSAiICsgaSArICIgbWlzbWF0Y2ggIiArIGluSXRlbSArICIhPSIgKyBvdXRJdGVtKTsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgDQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvUHJveHlOb25XcmFwcGVkVGVzdHMuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9Qcm94eU5vbldyYXBwZWRUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOWRiODQ1Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9Qcm94eU5vbldyYXBwZWRUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJveHk7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLlRlc3RMb2dnZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZnJhbWV3b3JrLkFic3RyYWN0VGVzdENhc2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJveHkuZG9jbGl0bm9ud3JhcHBlZC5zZWkuRG9jTGl0bm9uV3JhcHBlZFByb3h5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnByb3h5LmRvY2xpdG5vbndyYXBwZWQuc2VpLlByb3h5RG9jTGl0VW53cmFwcGVkU2VydmljZTsNCi1pbXBvcnQgb3JnLnRlc3QucHJveHkuZG9jbGl0bm9ud3JhcHBlZC5JbnZva2U7DQotaW1wb3J0IG9yZy50ZXN0LnByb3h5LmRvY2xpdG5vbndyYXBwZWQuT2JqZWN0RmFjdG9yeTsNCi1pbXBvcnQgb3JnLnRlc3QucHJveHkuZG9jbGl0bm9ud3JhcHBlZC5SZXR1cm5UeXBlOw0KLQ0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOw0KLWltcG9ydCBqYXZheC54bWwud3MuQXN5bmNIYW5kbGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuQmluZGluZ1Byb3ZpZGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsNCi1pbXBvcnQgamF2YS5pby5GaWxlOw0KLWltcG9ydCBqYXZhLm5ldC5VUkw7DQotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTsNCi0NCi0vKioNCi0gKiBUaGlzIHRlc3QgY2FzZXMgd2lsbCB1c2UgcHJveHkgTk9OIHdyYXBwZWQgd3NkbCB0byBpbnZva2UgbWV0aG9kcw0KLSAqIG9uIGEgZGVwbG95ZWQgU2VydmVyIEVuZHBvaW50Lg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBQcm94eU5vbldyYXBwZWRUZXN0cyBleHRlbmRzIEFic3RyYWN0VGVzdENhc2Ugew0KLQ0KLSAgICBRTmFtZSBzZXJ2aWNlTmFtZSA9IG5ldyBRTmFtZSgiaHR0cDovL2RvY2xpdG5vbndyYXBwZWQucHJveHkudGVzdC5vcmciLCAiUHJveHlEb2NMaXRVbndyYXBwZWRTZXJ2aWNlIik7DQotICAgIHByaXZhdGUgU3RyaW5nIGF4aXNFbmRwb2ludCA9ICJodHRwOi8vbG9jYWxob3N0OjYwNjAvYXhpczIvc2VydmljZXMvUHJveHlEb2NMaXRVbndyYXBwZWRTZXJ2aWNlLkRvY0xpdG5vbldyYXBwZWRJbXBsUG9ydCI7DQotICAgIHByaXZhdGUgUU5hbWUgcG9ydE5hbWUgPSBuZXcgUU5hbWUoImh0dHA6Ly9vcmcuYXBhY2hlLmF4aXMyLnByb3h5LmRvY2xpdHdyYXBwZWQiLCAiUHJveHlEb2NMaXRXcmFwcGVkUG9ydCIpOw0KLSAgICBwcml2YXRlIFN0cmluZyB3c2RsTG9jYXRpb24gPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImJhc2VkaXIiLCIuIikrIi8iKyJ0ZXN0LXJlc291cmNlcy93c2RsL1Byb3h5RG9jTGl0bm9uV3JhcHBlZC53c2RsIjsNCi0NCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgew0KLSAgICAgICAgcmV0dXJuIGdldFRlc3RTZXR1cChuZXcgVGVzdFN1aXRlKFByb3h5Tm9uV3JhcHBlZFRlc3RzLmNsYXNzKSk7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZva2UoKXsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoInRlc3Q6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+VGVzdGluZyBTeW5jIElub3Zva2Ugb24gUHJveHkgRG9jTGl0IG5vbi13cmFwcGVkIik7DQotICAgICAgICBPYmplY3RGYWN0b3J5IGZhY3RvcnkgPSBuZXcgT2JqZWN0RmFjdG9yeSgpOw0KLSAgICAgICAgSW52b2tlIGludm9rZU9iaiA9IGZhY3RvcnkuY3JlYXRlSW52b2tlKCk7DQotICAgICAgICBpbnZva2VPYmouc2V0SW52b2tlU3RyKCJ0ZXN0IHJlcXVlc3QgZm9yIHR3b1dheSBPcGVyYXRpb24iKTsNCi0gICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IFNlcnZpY2UuY3JlYXRlKG51bGwsIHNlcnZpY2VOYW1lKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZSk7DQotICAgICAgICBEb2NMaXRub25XcmFwcGVkUHJveHkgcHJveHkgPSBzZXJ2aWNlLmdldFBvcnQocG9ydE5hbWUsIERvY0xpdG5vbldyYXBwZWRQcm94eS5jbGFzcyk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHByb3h5KTsNCi0gICAgICAgIEJpbmRpbmdQcm92aWRlciBwID0gKEJpbmRpbmdQcm92aWRlcilwcm94eTsNCi0gICAgICAgIHAuZ2V0UmVxdWVzdENvbnRleHQoKS5wdXQoQmluZGluZ1Byb3ZpZGVyLkVORFBPSU5UX0FERFJFU1NfUFJPUEVSVFksYXhpc0VuZHBvaW50KTsNCi0gICAgICAgIFJldHVyblR5cGUgcmVzcG9uc2UgPSBwcm94eS5pbnZva2UoaW52b2tlT2JqKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwocmVzcG9uc2UpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+UmVzcG9uc2UgPSIgKyByZXNwb25zZS5nZXRSZXR1cm5TdHIoKSk7DQotDQotICAgICAgICANCi0gICAgICAgIC8vIFRyeSBhZ2FpbiB0byB2ZXJpZnkNCi0gICAgICAgIHJlc3BvbnNlID0gcHJveHkuaW52b2tlKGludm9rZU9iaik7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3BvbnNlKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PlJlc3BvbnNlID0iICsgcmVzcG9uc2UuZ2V0UmV0dXJuU3RyKCkpOw0KLQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIHZvaWQgdGVzdE51bGxJbnZva2UoKXsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoInRlc3Q6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+VGVzdGluZyBTeW5jIEludm9rZSBvbiBQcm94eSBEb2NMaXQgYmFyZSB3aXRoIGEgbnVsbCBwYXJhbWV0ZXIiKTsNCi0gICAgICAgIE9iamVjdEZhY3RvcnkgZmFjdG9yeSA9IG5ldyBPYmplY3RGYWN0b3J5KCk7DQotICAgICAgICBJbnZva2UgaW52b2tlT2JqID0gbnVsbDsNCi0gICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IFNlcnZpY2UuY3JlYXRlKG51bGwsIHNlcnZpY2VOYW1lKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZSk7DQotICAgICAgICBEb2NMaXRub25XcmFwcGVkUHJveHkgcHJveHkgPSBzZXJ2aWNlLmdldFBvcnQocG9ydE5hbWUsIERvY0xpdG5vbldyYXBwZWRQcm94eS5jbGFzcyk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHByb3h5KTsNCi0gICAgICAgIEJpbmRpbmdQcm92aWRlciBwID0gKEJpbmRpbmdQcm92aWRlcilwcm94eTsNCi0gICAgICAgIHAuZ2V0UmVxdWVzdENvbnRleHQoKS5wdXQoQmluZGluZ1Byb3ZpZGVyLkVORFBPSU5UX0FERFJFU1NfUFJPUEVSVFksYXhpc0VuZHBvaW50KTsNCi0gICAgICAgIFJldHVyblR5cGUgcmVzcG9uc2UgPSBwcm94eS5pbnZva2UoaW52b2tlT2JqKTsNCi0gICAgICAgIGFzc2VydE51bGwocmVzcG9uc2UpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBUcnkgYWdhaW4NCi0gICAgICAgIHJlc3BvbnNlID0gcHJveHkuaW52b2tlKGludm9rZU9iaik7DQotICAgICAgICBhc3NlcnROdWxsKHJlc3BvbnNlKTsNCi0NCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZva2VBc3luY0NhbGxiYWNrKCl7DQotICAgICAgICB0cnl7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJEb2NMaXROb25XcmFwcGVkIHRlc3QgY2FzZTogIiArIGdldE5hbWUoKSk7DQotICAgICAgICAgICAgLy9DcmVhdGUgd3NkbCB1cmwNCi0gICAgICAgICAgICBGaWxlIHdzZGw9IG5ldyBGaWxlKHdzZGxMb2NhdGlvbik7IA0KLSAgICAgICAgICAgIFVSTCB3c2RsVXJsID0gd3NkbC50b1VSTCgpOyANCi0gICAgICAgICAgICBPYmplY3RGYWN0b3J5IGZhY3RvcnkgPSBuZXcgT2JqZWN0RmFjdG9yeSgpOw0KLSAgICAgICAgICAgIC8vY3JlYXRlIGlucHV0IG9iamVjdCB0byB3ZWIgc2VydmljZSBvcGVyYXRpb24NCi0gICAgICAgICAgICBJbnZva2UgaW52b2tlT2JqID0gZmFjdG9yeS5jcmVhdGVJbnZva2UoKTsNCi0gICAgICAgICAgICBpbnZva2VPYmouc2V0SW52b2tlU3RyKCJ0ZXN0IHJlcXVlc3QgZm9yIHR3b1dheSBBc3luYyBPcGVyYXRpb24iKTsNCi0gICAgICAgICAgICAvL0NyZWF0ZSBTZXJ2aWNlDQotICAgICAgICAgICAgUHJveHlEb2NMaXRVbndyYXBwZWRTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgUHJveHlEb2NMaXRVbndyYXBwZWRTZXJ2aWNlKHdzZGxVcmwsIHNlcnZpY2VOYW1lKTsNCi0gICAgICAgICAgICAvL0NyZWF0ZSBwcm94eQ0KLSAgICAgICAgICAgIERvY0xpdG5vbldyYXBwZWRQcm94eSBwcm94eSA9IHNlcnZpY2UuZ2V0UHJveHlEb2NMaXRub25XcmFwcGVkUG9ydCgpOw0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+Pkludm9raW5nIEJpbmRpbmcgUHJvdmlkZXIgcHJvcGVydHkiKTsNCi0gICAgICAgICAgICAvL1NldHVwIEVuZHBvaW50IHVybCAtLSBvcHRpb25hbC4NCi0gICAgICAgICAgICBCaW5kaW5nUHJvdmlkZXIgcCA9IChCaW5kaW5nUHJvdmlkZXIpcHJveHk7DQotICAgICAgICAgICAgICAgIHAuZ2V0UmVxdWVzdENvbnRleHQoKS5wdXQoQmluZGluZ1Byb3ZpZGVyLkVORFBPSU5UX0FERFJFU1NfUFJPUEVSVFksYXhpc0VuZHBvaW50KTsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gSW52b2tpbmcgUHJveHkgQXN5bmNocm9ub3VzIENhbGxiYWNrIik7DQotICAgICAgICAgICAgQXN5bmNIYW5kbGVyPFJldHVyblR5cGU+IGhhbmRsZXIgPSBuZXcgQXN5bmNDYWxsYmFjaygpOw0KLSAgICAgICAgICAgIC8vSW52b2tlIG9wZXJhdGlvbiBBc3luY2hyb25vdXNseS4NCi0gICAgICAgICAgICBGdXR1cmU8Pz4gbW9uaXRvciA9IHByb3h5Lmludm9rZUFzeW5jKGludm9rZU9iaiwgaGFuZGxlcik7DQotICAgICAgICAgICAgd2hpbGUoIW1vbml0b3IuaXNEb25lKCkpew0KLSAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIFRyeSBhZ2Fpbg0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBJbnZva2luZyBQcm94eSBBc3luY2hyb25vdXMgQ2FsbGJhY2siKTsNCi0gICAgICAgICAgICBoYW5kbGVyID0gbmV3IEFzeW5jQ2FsbGJhY2soKTsNCi0gICAgICAgICAgICAvL0ludm9rZSBvcGVyYXRpb24gQXN5bmNocm9ub3VzbHkuDQotICAgICAgICAgICAgbW9uaXRvciA9IHByb3h5Lmludm9rZUFzeW5jKGludm9rZU9iaiwgaGFuZGxlcik7DQotICAgICAgICAgICAgd2hpbGUoIW1vbml0b3IuaXNEb25lKCkpew0KLSAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIH1jYXRjaChFeGNlcHRpb24gZSl7IA0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7IA0KLSAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiByZWNlaXZlZCIgKyBlKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIHZvaWQgdGVzdEludm9rZUFzeW5jUG9sbGluZygpew0KLSAgICAgICAgDQotICAgIH0NCi0NCi19DQotDQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L1Byb3h5VGVzdHMuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9Qcm94eVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmYmMyZTAuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L1Byb3h5VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyNCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnByb3h5Ow0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5UZXN0TG9nZ2VyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmZyYW1ld29yay5BYnN0cmFjdFRlc3RDYXNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnByb3h5LmRvY2xpdHdyYXBwZWQuc2VpLkRvY0xpdFdyYXBwZWRQcm94eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm94eS5kb2NsaXR3cmFwcGVkLnNlaS5Qcm94eURvY0xpdFdyYXBwZWRTZXJ2aWNlOw0KLWltcG9ydCBvcmcudGVzdC5wcm94eS5kb2NsaXR3cmFwcGVkLlJldHVyblR5cGU7DQotDQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5Bc3luY0hhbmRsZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5CaW5kaW5nUHJvdmlkZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5SZXNwb25zZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7DQotaW1wb3J0IGphdmEuaW8uRmlsZTsNCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU7DQotDQotcHVibGljIGNsYXNzIFByb3h5VGVzdHMgZXh0ZW5kcyBBYnN0cmFjdFRlc3RDYXNlIHsNCi0gICAgcHJpdmF0ZSBRTmFtZSBzZXJ2aWNlTmFtZSA9IG5ldyBRTmFtZSgNCi0gICAgICAgICAgICAiaHR0cDovL2RvY2xpdHdyYXBwZWQucHJveHkudGVzdC5vcmciLCAiUHJveHlEb2NMaXRXcmFwcGVkU2VydmljZSIpOw0KLSAgICBwcml2YXRlIFN0cmluZyBheGlzRW5kcG9pbnQgPSAiaHR0cDovL2xvY2FsaG9zdDo2MDYwL2F4aXMyL3NlcnZpY2VzL1Byb3h5RG9jTGl0V3JhcHBlZFNlcnZpY2UuRG9jTGl0V3JhcHBlZFByb3h5SW1wbFBvcnQiOw0KLSAgICBwcml2YXRlIFFOYW1lIHBvcnROYW1lID0gbmV3IFFOYW1lKCJodHRwOi8vZG9jbGl0d3JhcHBlZC5wcm94eS50ZXN0Lm9yZyIsDQotICAgICAgICAgICAgIkRvY0xpdFdyYXBwZWRQcm94eUltcGxQb3J0Iik7DQotICAgIHByaXZhdGUgU3RyaW5nIHdzZGxMb2NhdGlvbiA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiYmFzZWRpciIsIi4iKSsiLyIrInRlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9kb2NsaXR3cmFwcGVkL01FVEEtSU5GL1Byb3h5RG9jTGl0V3JhcHBlZC53c2RsIjsNCi0gICAgcHJpdmF0ZSBib29sZWFuIHJ1bm5pbmdPbkF4aXMgPSB0cnVlOw0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7DQotICAgICAgICByZXR1cm4gZ2V0VGVzdFNldHVwKG5ldyBUZXN0U3VpdGUoUHJveHlUZXN0cy5jbGFzcykpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aXBsZVNlcnZpY2VDYWxscygpew0KLSAgICAgICAgdHJ5ew0KLSAgICAgICAgICAgIGlmKCFydW5uaW5nT25BeGlzKXsNCi0gICAgICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoInRlc3Q6IiArIGdldE5hbWUoKSk7DQotICAgICAgICAgICAgU3RyaW5nIHJlcXVlc3QgPSBuZXcgU3RyaW5nKCJzb21lIHN0cmluZyByZXF1ZXN0Iik7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIlNlcnZpY2UgQ2FsbCAjMSIpOw0KLSAgICAgICAgICAgIFByb3h5RG9jTGl0V3JhcHBlZFNlcnZpY2Ugc2VydmljZTEgPSBuZXcgUHJveHlEb2NMaXRXcmFwcGVkU2VydmljZSgpOw0KLSAgICAgICAgICAgIERvY0xpdFdyYXBwZWRQcm94eSBwcm94eTEgPSBzZXJ2aWNlMS5nZXREb2NMaXRXcmFwcGVkUHJveHlJbXBsUG9ydCgpOw0KLSAgICAgICAgICAgIEJpbmRpbmdQcm92aWRlciBwMSA9ICAgIChCaW5kaW5nUHJvdmlkZXIpcHJveHkxOw0KLSAgICAgICAgICAgIHAxLmdldFJlcXVlc3RDb250ZXh0KCkucHV0KEJpbmRpbmdQcm92aWRlci5FTkRQT0lOVF9BRERSRVNTX1BST1BFUlRZLGF4aXNFbmRwb2ludCk7DQotICAgICAgICAgICAgU3RyaW5nIHJlc3BvbnNlMSA9IHByb3h5MS5pbnZva2UocmVxdWVzdCk7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIlByb3h5IFJlc3BvbnNlID0iICsgcmVzcG9uc2UxKTsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotDQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIlNlcnZpY2UgQ2FsbCAjMiIpOw0KLSAgICAgICAgICAgIFByb3h5RG9jTGl0V3JhcHBlZFNlcnZpY2Ugc2VydmljZTIgPSBuZXcgUHJveHlEb2NMaXRXcmFwcGVkU2VydmljZSgpOw0KLSAgICAgICAgICAgIERvY0xpdFdyYXBwZWRQcm94eSBwcm94eTIgPSBzZXJ2aWNlMi5nZXREb2NMaXRXcmFwcGVkUHJveHlJbXBsUG9ydCgpOw0KLSAgICAgICAgICAgIEJpbmRpbmdQcm92aWRlciBwMiA9ICAgIChCaW5kaW5nUHJvdmlkZXIpcHJveHkyOw0KLSAgICAgICAgICAgIHAyLmdldFJlcXVlc3RDb250ZXh0KCkucHV0KEJpbmRpbmdQcm92aWRlci5FTkRQT0lOVF9BRERSRVNTX1BST1BFUlRZLGF4aXNFbmRwb2ludCk7DQotICAgICAgICAgICAgU3RyaW5nIHJlc3BvbnNlMiA9IHByb3h5Mi5pbnZva2UocmVxdWVzdCk7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIlByb3h5IFJlc3BvbnNlID0iICsgcmVzcG9uc2UyKTsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICAgICAgDQotICAgICAgICB9Y2F0Y2goRXhjZXB0aW9uIGUpew0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAgICAgZmFpbChnZXROYW1lKCkgKyAiIGZhaWxlZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW52b2tlV2l0aE51bGxQYXJhbSgpew0KLSAgICAgICAgdHJ5eyANCi0gICAgICAgICAgICBpZighcnVubmluZ09uQXhpcyl7DQotICAgICAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJUZXN0IE5hbWU6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgICAgIEZpbGUgd3NkbD0gbmV3IEZpbGUod3NkbExvY2F0aW9uKTsgDQotICAgICAgICAgICAgVVJMIHdzZGxVcmwgPSB3c2RsLnRvVVJMKCk7IA0KLSAgICAgICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IFNlcnZpY2UuY3JlYXRlKG51bGwsIHNlcnZpY2VOYW1lKTsgDQotICAgICAgICAgICAgT2JqZWN0IHByb3h5ID1zZXJ2aWNlLmdldFBvcnQocG9ydE5hbWUsIERvY0xpdFdyYXBwZWRQcm94eS5jbGFzcyk7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+SW52b2tpbmcgQmluZGluZyBQcm92aWRlciBwcm9wZXJ0eSIpOw0KLSAgICAgICAgICAgIEJpbmRpbmdQcm92aWRlciBwID0gKEJpbmRpbmdQcm92aWRlcilwcm94eTsNCi0gICAgICAgICAgICBwLmdldFJlcXVlc3RDb250ZXh0KCkucHV0KEJpbmRpbmdQcm92aWRlci5FTkRQT0lOVF9BRERSRVNTX1BST1BFUlRZLGF4aXNFbmRwb2ludCk7DQotDQotICAgICAgICAgICAgRG9jTGl0V3JhcHBlZFByb3h5IGR3cCA9IChEb2NMaXRXcmFwcGVkUHJveHkpcHJveHk7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEludm9raW5nIFByb3h5IFN5bmNocm9ub3VzbHkiKTsNCi0gICAgICAgICAgICBTdHJpbmcgcmVxdWVzdCA9IG51bGw7DQotICAgICAgICAgICAgU3RyaW5nIHJlc3BvbnNlID0gZHdwLmludm9rZShyZXF1ZXN0KTsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiUHJveHkgUmVzcG9uc2UgPSIgKyByZXNwb25zZSk7DQotDQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gVHJ5IGFnYWluDQotICAgICAgICAgICAgcmVzcG9uc2UgPSBkd3AuaW52b2tlKHJlcXVlc3QpOw0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJQcm94eSBSZXNwb25zZSA9IiArIHJlc3BvbnNlKTsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICB9Y2F0Y2goRXhjZXB0aW9uIGUpeyANCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOyANCi0gICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gcmVjZWl2ZWQiICsgZSk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgcHVibGljIHZvaWQgdGVzdEludm9rZSgpew0KLSAgICAgICAgdHJ5eyANCi0gICAgICAgICAgICBpZighcnVubmluZ09uQXhpcyl7DQotICAgICAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIEZpbGUgd3NkbD0gbmV3IEZpbGUod3NkbExvY2F0aW9uKTsgDQotICAgICAgICAgICAgVVJMIHdzZGxVcmwgPSB3c2RsLnRvVVJMKCk7IA0KLSAgICAgICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IFNlcnZpY2UuY3JlYXRlKG51bGwsIHNlcnZpY2VOYW1lKTsNCi0gICAgICAgICAgICBTdHJpbmcgcmVxdWVzdCA9IG5ldyBTdHJpbmcoInNvbWUgc3RyaW5nIHJlcXVlc3QiKTsgDQotICAgICAgICAgICAgT2JqZWN0IHByb3h5ID1zZXJ2aWNlLmdldFBvcnQocG9ydE5hbWUsIERvY0xpdFdyYXBwZWRQcm94eS5jbGFzcyk7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+SW52b2tpbmcgQmluZGluZyBQcm92aWRlciBwcm9wZXJ0eSIpOw0KLSAgICAgICAgICAgIEJpbmRpbmdQcm92aWRlciBwID0gKEJpbmRpbmdQcm92aWRlcilwcm94eTsNCi0gICAgICAgICAgICAgICAgcC5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dChCaW5kaW5nUHJvdmlkZXIuRU5EUE9JTlRfQUREUkVTU19QUk9QRVJUWSxheGlzRW5kcG9pbnQpOw0KLSAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICBEb2NMaXRXcmFwcGVkUHJveHkgZHdwID0gKERvY0xpdFdyYXBwZWRQcm94eSlwcm94eTsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gSW52b2tpbmcgUHJveHkgU3luY2hyb25vdXNseSIpOw0KLSAgICAgICAgICAgIFN0cmluZyByZXNwb25zZSA9IGR3cC5pbnZva2UocmVxdWVzdCk7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIlByb3h5IFJlc3BvbnNlID0iICsgcmVzcG9uc2UpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIFRyeSBhZ2Fpbg0KLSAgICAgICAgICAgIHJlc3BvbnNlID0gZHdwLmludm9rZShyZXF1ZXN0KTsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiUHJveHkgUmVzcG9uc2UgPSIgKyByZXNwb25zZSk7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgfWNhdGNoKEV4Y2VwdGlvbiBlKXsgDQotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsgDQotICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIHJlY2VpdmVkIiArIGUpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZva2VXaXRoV1NETCgpew0KLQ0KLSAgICAJdHJ5eyANCi0gICAgICAgICAgICBpZighcnVubmluZ09uQXhpcyl7DQotICAgICAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgICAgIEZpbGUgd3NkbD0gbmV3IEZpbGUod3NkbExvY2F0aW9uKTsgDQotICAgICAgICAgICAgVVJMIHdzZGxVcmwgPSB3c2RsLnRvVVJMKCk7IA0KLSAgICAgICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IFNlcnZpY2UuY3JlYXRlKHdzZGxVcmwsIHNlcnZpY2VOYW1lKTsNCi0gICAgICAgICAgICBTdHJpbmcgcmVxdWVzdCA9IG5ldyBTdHJpbmcoInNvbWUgc3RyaW5nIHJlcXVlc3QiKTsgDQotICAgICAgICAgICAgT2JqZWN0IHByb3h5ID1zZXJ2aWNlLmdldFBvcnQocG9ydE5hbWUsIERvY0xpdFdyYXBwZWRQcm94eS5jbGFzcyk7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+SW52b2tpbmcgQmluZGluZyBQcm92aWRlciBwcm9wZXJ0eSIpOw0KLSAgICAgICAgICAgIEJpbmRpbmdQcm92aWRlciBwID0gKEJpbmRpbmdQcm92aWRlcilwcm94eTsNCi0gICAgICAgICAgICBwLmdldFJlcXVlc3RDb250ZXh0KCkucHV0KEJpbmRpbmdQcm92aWRlci5FTkRQT0lOVF9BRERSRVNTX1BST1BFUlRZLGF4aXNFbmRwb2ludCk7DQotICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgIERvY0xpdFdyYXBwZWRQcm94eSBkd3AgPSAoRG9jTGl0V3JhcHBlZFByb3h5KXByb3h5Ow0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBJbnZva2luZyBQcm94eSBTeW5jaHJvbm91c2x5Iik7DQotICAgICAgICAgICAgU3RyaW5nIHJlc3BvbnNlID0gZHdwLmludm9rZShyZXF1ZXN0KTsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiUHJveHkgUmVzcG9uc2UgPSIgKyByZXNwb25zZSk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gVHJ5IGFnYWluDQotICAgICAgICAgICAgcmVzcG9uc2UgPSBkd3AuaW52b2tlKHJlcXVlc3QpOw0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJQcm94eSBSZXNwb25zZSA9IiArIHJlc3BvbnNlKTsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICB9Y2F0Y2goRXhjZXB0aW9uIGUpeyANCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOyANCi0gICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gcmVjZWl2ZWQiICsgZSk7DQotICAgICAgICB9DQotDQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZva2VBc3luY0NhbGxiYWNrKCl7DQotICAgICAgICB0cnl7IA0KLSAgICAgICAgICAgIGlmKCFydW5uaW5nT25BeGlzKXsNCi0gICAgICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgRmlsZSB3c2RsPSBuZXcgRmlsZSh3c2RsTG9jYXRpb24pOyANCi0gICAgICAgICAgICBVUkwgd3NkbFVybCA9IHdzZGwudG9VUkwoKTsgDQotICAgICAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gU2VydmljZS5jcmVhdGUobnVsbCwgc2VydmljZU5hbWUpOw0KLSAgICAgICAgICAgIFN0cmluZyByZXF1ZXN0ID0gbmV3IFN0cmluZygic29tZSBzdHJpbmcgcmVxdWVzdCIpOyANCi0gICAgICAgICAgICBPYmplY3QgcHJveHkgPXNlcnZpY2UuZ2V0UG9ydChwb3J0TmFtZSwgRG9jTGl0V3JhcHBlZFByb3h5LmNsYXNzKTsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj5JbnZva2luZyBCaW5kaW5nIFByb3ZpZGVyIHByb3BlcnR5Iik7DQotICAgICAgICAgICAgQmluZGluZ1Byb3ZpZGVyIHAgPSAoQmluZGluZ1Byb3ZpZGVyKXByb3h5Ow0KLSAgICAgICAgICAgICAgICBwLmdldFJlcXVlc3RDb250ZXh0KCkucHV0KEJpbmRpbmdQcm92aWRlci5FTkRQT0lOVF9BRERSRVNTX1BST1BFUlRZLGF4aXNFbmRwb2ludCk7DQotICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgIERvY0xpdFdyYXBwZWRQcm94eSBkd3AgPSAoRG9jTGl0V3JhcHBlZFByb3h5KXByb3h5Ow0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBJbnZva2luZyBQcm94eSBBc3luY2hyb25vdXMgQ2FsbGJhY2siKTsNCi0gICAgICAgICAgICBBc3luY0hhbmRsZXIgaGFuZGxlciA9IG5ldyBBc3luY0NhbGxiYWNrKCk7DQotICAgICAgICAgICAgRnV0dXJlPD8+IHJlc3BvbnNlID0gZHdwLmludm9rZUFzeW5jKHJlcXVlc3QsIGhhbmRsZXIpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIFRyeSBhZ2Fpbg0KLSAgICAgICAgICAgIGhhbmRsZXIgPSBuZXcgQXN5bmNDYWxsYmFjaygpOw0KLSAgICAgICAgICAgIHJlc3BvbnNlID0gZHdwLmludm9rZUFzeW5jKHJlcXVlc3QsIGhhbmRsZXIpOw0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIH1jYXRjaChFeGNlcHRpb24gZSl7IA0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7IA0KLSAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiByZWNlaXZlZCIgKyBlKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIHZvaWQgdGVzdEludm9rZUFzeW5jUG9sbGluZygpIHsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIEZpbGUgd3NkbD0gbmV3IEZpbGUod3NkbExvY2F0aW9uKTsgDQotICAgICAgICAgICAgVVJMIHdzZGxVcmwgPSB3c2RsLnRvVVJMKCk7IA0KLSAgICAgICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IFNlcnZpY2UuY3JlYXRlKG51bGwsIHNlcnZpY2VOYW1lKTsNCi0gICAgICAgICAgICBEb2NMaXRXcmFwcGVkUHJveHkgcHJveHkgPXNlcnZpY2UuZ2V0UG9ydChwb3J0TmFtZSwgRG9jTGl0V3JhcHBlZFByb3h5LmNsYXNzKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBTdHJpbmcgcmVxdWVzdCA9IG5ldyBTdHJpbmcoInNvbWUgc3RyaW5nIHJlcXVlc3QiKTsNCi0NCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gSW52b2tpbmcgQmluZGluZyBQcm92aWRlciBwcm9wZXJ0eSIpOw0KLSAgICAgICAgICAgIEJpbmRpbmdQcm92aWRlciBwID0gKEJpbmRpbmdQcm92aWRlcikgcHJveHk7DQotICAgICAgICAgICAgcC5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dChCaW5kaW5nUHJvdmlkZXIuRU5EUE9JTlRfQUREUkVTU19QUk9QRVJUWSwgYXhpc0VuZHBvaW50KTsNCi0NCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gSW52b2tpbmcgUHJveHkgd2l0aCBhc3luYyBwb2xsaW5nIHJlcXVlc3QiKTsNCi0gICAgICAgICAgICBSZXNwb25zZTxSZXR1cm5UeXBlPiBhc3luY1Jlc3BvbnNlID0gcHJveHkuaW52b2tlQXN5bmMocmVxdWVzdCk7DQotDQotICAgICAgICAgICAgd2hpbGUgKCFhc3luY1Jlc3BvbnNlLmlzRG9uZSgpKSB7DQotICAgICAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBBc3luYyBpbnZvY2F0aW9uIHN0aWxsIG5vdCBjb21wbGV0ZSIpOw0KLSAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIFJldHVyblR5cGUgcmVzcG9uc2UgPSBhc3luY1Jlc3BvbnNlLmdldCgpOw0KLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwocmVzcG9uc2UpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIFRyeSBhZ2Fpbg0KLSAgICAgICAgICAgIGFzeW5jUmVzcG9uc2UgPSBwcm94eS5pbnZva2VBc3luYyhyZXF1ZXN0KTsNCi0NCi0gICAgICAgICAgICB3aGlsZSAoIWFzeW5jUmVzcG9uc2UuaXNEb25lKCkpIHsNCi0gICAgICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEFzeW5jIGludm9jYXRpb24gc3RpbGwgbm90IGNvbXBsZXRlIik7DQotICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgcmVzcG9uc2UgPSBhc3luY1Jlc3BvbnNlLmdldCgpOw0KLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwocmVzcG9uc2UpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2goRXhjZXB0aW9uIGUpIHsgDQotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsgDQotICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIHJlY2VpdmVkIiArIGUpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VHdvV2F5KCl7DQotICAgICAgICANCi0gICAgICAgIHRyeXsgDQotICAgICAgICAgICAgaWYocnVubmluZ09uQXhpcyl7DQotICAgICAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgRmlsZSB3c2RsPSBuZXcgRmlsZSh3c2RsTG9jYXRpb24pOyANCi0gICAgICAgICAgICBVUkwgd3NkbFVybCA9IHdzZGwudG9VUkwoKTsgDQotICAgICAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gU2VydmljZS5jcmVhdGUobnVsbCwgc2VydmljZU5hbWUpOw0KLSAgICAgICAgICAgIFN0cmluZyByZXF1ZXN0ID0gbmV3IFN0cmluZygic29tZSBzdHJpbmcgcmVxdWVzdCIpOyANCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBPYmplY3QgcHJveHkgPXNlcnZpY2UuZ2V0UG9ydChwb3J0TmFtZSwgRG9jTGl0V3JhcHBlZFByb3h5LmNsYXNzKTsgDQotICAgICAgICAgICAgQmluZGluZ1Byb3ZpZGVyIHAgPSAoQmluZGluZ1Byb3ZpZGVyKXByb3h5Ow0KLSAgICAgICAgICAgIHAuZ2V0UmVxdWVzdENvbnRleHQoKS5wdXQoQmluZGluZ1Byb3ZpZGVyLkVORFBPSU5UX0FERFJFU1NfUFJPUEVSVFksIGF4aXNFbmRwb2ludCk7DQotICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgIERvY0xpdFdyYXBwZWRQcm94eSBkd3AgPSAoRG9jTGl0V3JhcHBlZFByb3h5KXByb3h5OyAgDQotICAgICAgICAgICAgU3RyaW5nIHJlc3BvbnNlID0gZHdwLnR3b1dheShyZXF1ZXN0KTsNCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlJlc3BvbnNlID0iICsgcmVzcG9uc2UpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIFRyeSBhZ2Fpbg0KLSAgICAgICAgICAgIHJlc3BvbnNlID0gZHdwLnR3b1dheShyZXF1ZXN0KTsNCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlJlc3BvbnNlID0iICsgcmVzcG9uc2UpOw0KLSAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSl7IA0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7IA0KLSAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiByZWNlaXZlZCIgKyBlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0T25lV2F5KCl7DQotICAgICAgICANCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIHZvaWQgdGVzdEhvbGRlcigpew0KLSAgICAgICAgDQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHRlc3RUd29XYXlBc3luY0NhbGxiYWNrKCl7DQotICAgICAgICANCi0gICAgICAgIHRyeXsgDQotICAgICAgICAgICAgaWYocnVubmluZ09uQXhpcyl7DQotICAgICAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgRmlsZSB3c2RsPSBuZXcgRmlsZSh3c2RsTG9jYXRpb24pOyANCi0gICAgICAgICAgICBVUkwgd3NkbFVybCA9IHdzZGwudG9VUkwoKTsgDQotICAgICAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gU2VydmljZS5jcmVhdGUobnVsbCwgc2VydmljZU5hbWUpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIFN0cmluZyByZXF1ZXN0ID0gbmV3IFN0cmluZygic29tZSBzdHJpbmcgcmVxdWVzdCIpOyANCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBPYmplY3QgcHJveHkgPXNlcnZpY2UuZ2V0UG9ydChwb3J0TmFtZSwgRG9jTGl0V3JhcHBlZFByb3h5LmNsYXNzKTsgDQotICAgICAgICAgICAgQmluZGluZ1Byb3ZpZGVyIHAgPSAoQmluZGluZ1Byb3ZpZGVyKXByb3h5Ow0KLSAgICAgICAgICAgICAgICBwLmdldFJlcXVlc3RDb250ZXh0KCkucHV0KEJpbmRpbmdQcm92aWRlci5FTkRQT0lOVF9BRERSRVNTX1BST1BFUlRZLCBheGlzRW5kcG9pbnQpOw0KLSAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICBEb2NMaXRXcmFwcGVkUHJveHkgZHdwID0gKERvY0xpdFdyYXBwZWRQcm94eSlwcm94eTsNCi0gICAgICAgICAgICBBc3luY0hhbmRsZXIgaGFuZGxlciA9IG5ldyBBc3luY0NhbGxiYWNrKCk7DQotICAgICAgICAgICAgRnV0dXJlPD8+IHJlc3BvbnNlID0gZHdwLnR3b1dheUFzeW5jKHJlcXVlc3QsIGhhbmRsZXIpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIFRyeSBhZ2Fpbg0KLSAgICAgICAgICAgIGhhbmRsZXIgPSBuZXcgQXN5bmNDYWxsYmFjaygpOw0KLSAgICAgICAgICAgIHJlc3BvbnNlID0gZHdwLnR3b1dheUFzeW5jKHJlcXVlc3QsIGhhbmRsZXIpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgfWNhdGNoKEV4Y2VwdGlvbiBlKXsgDQotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsgDQotICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIHJlY2VpdmVkIiArIGUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHRlc3RBc3luY1Bvb2xpbmcoKXsNCi0gICAgICAgIA0KLSAgICB9DQotfQ0KLQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9SUENMaXRTV0FQcm94eVRlc3RzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvUlBDTGl0U1dBUHJveHlUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2Y4NjRhLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9SUENMaXRTV0FQcm94eVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm94eTsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZnJhbWV3b3JrLkFic3RyYWN0VGVzdENhc2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJvdmlkZXIuRGF0YVNvdXJjZUltcGw7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJveHkucnBjbGl0c3dhLnNlaS5SUENMaXRTV0E7DQotDQotaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXI7DQotaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRGF0YVNvdXJjZTsNCi1pbXBvcnQgamF2YXguaW1hZ2Vpby5JbWFnZUlPOw0KLWltcG9ydCBqYXZheC5pbWFnZWlvLnN0cmVhbS5GaWxlSW1hZ2VJbnB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YXguaW1hZ2Vpby5zdHJlYW0uSW1hZ2VJbnB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLkJpbmRpbmdQcm92aWRlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLkRpc3BhdGNoOw0KLWltcG9ydCBqYXZheC54bWwud3MuSG9sZGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsNCi1pbXBvcnQgamF2YS5hd3QuKjsNCi1pbXBvcnQgamF2YS5pby5GaWxlOw0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247DQotaW1wb3J0IGphdmEubmV0LlVSTDsNCi0NCi1wdWJsaWMgY2xhc3MgUlBDTGl0U1dBUHJveHlUZXN0cyBleHRlbmRzIEFic3RyYWN0VGVzdENhc2Ugew0KLQ0KLSAgICBwcml2YXRlIFFOYW1lIHNlcnZpY2VOYW1lID0gbmV3IFFOYW1lKA0KLSAgICAgICAgICAgICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9ycGNsaXRzd2EiLCAiUlBDTGl0U1dBU2VydmljZSIpOw0KLSAgICBwcml2YXRlIFN0cmluZyBheGlzRW5kcG9pbnQgPSAiaHR0cDovL2xvY2FsaG9zdDo2MDYwL2F4aXMyL3NlcnZpY2VzL1JQQ0xpdFNXQVNlcnZpY2UuUlBDTGl0U1dBIjsNCi0gICAgcHJpdmF0ZSBRTmFtZSBwb3J0TmFtZSA9IG5ldyBRTmFtZSgiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvcnBjbGl0c3dhIiwNCi0gICAgICAgICAgICAiUlBDTGl0U1dBIik7DQotICAgIHByaXZhdGUgU3RyaW5nIHdzZGxMb2NhdGlvbiA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiYmFzZWRpciIsIi4iKSsiLyIrDQotICAgICJ0ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvcnBjbGl0c3dhL01FVEEtSU5GL1JQQ0xpdFNXQS53c2RsIjsNCi0gICAgICAgIA0KLSAgICBzdGF0aWMgew0KLSAgICAgICAgU3RyaW5nIGltYWdlUmVzb3VyY2VEaXIgPQ0KLSAgICAgICAgICAgICAgICBTeXN0ZW0uZ2V0UHJvcGVydHkoImJhc2VkaXIiLCAiLiIpICsgIi8iICsgInRlc3QtcmVzb3VyY2VzIiArIEZpbGUuc2VwYXJhdG9yDQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiaW1hZ2UiOw0KLQ0KLSAgICAgICAgLy9DcmVhdGUgYSBEYXRhU291cmNlIGZyb20gYW4gaW1hZ2UgDQotICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShpbWFnZVJlc291cmNlRGlyICsgRmlsZS5zZXBhcmF0b3IgKyAidGVzdC5qcGciKTsNCi0gICAgICAgIEltYWdlSW5wdXRTdHJlYW0gZmlpcyA9IG51bGw7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIGZpaXMgPSBuZXcgRmlsZUltYWdlSW5wdXRTdHJlYW0oZmlsZSk7DQotICAgICAgICAgICAgSW1hZ2UgaW1hZ2UgPSBJbWFnZUlPLnJlYWQoZmlpcyk7DQotICAgICAgICAgICAgaW1hZ2VEUyA9IG5ldyBEYXRhU291cmNlSW1wbCgiaW1hZ2UvanBlZyIsICJ0ZXN0LmpwZyIsIGltYWdlKTsNCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7ICAgIA0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHByaXZhdGUgc3RhdGljIERhdGFTb3VyY2UgaW1hZ2VEUzsNCi0gICAgDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsNCi0gICAgICAgIHJldHVybiBnZXRUZXN0U2V0dXAobmV3IFRlc3RTdWl0ZShSUENMaXRTV0FQcm94eVRlc3RzLmNsYXNzKSk7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBVdGlsaXR5IG1ldGhvZCB0byBnZXQgdGhlIHByb3h5DQotICAgICAqIEByZXR1cm4gUlBDTGl0IHByb3h5DQotICAgICAqIEB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uDQotICAgICAqLw0KLSAgICBwdWJsaWMgUlBDTGl0U1dBIGdldFByb3h5KCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7DQotICAgICAgICBGaWxlIHdzZGw9IG5ldyBGaWxlKHdzZGxMb2NhdGlvbik7DQotICAgICAgICBhc3NlcnRUcnVlKCJXU0RMIGRvZXMgbm90IGV4aXN0OiIgKyB3c2RsTG9jYXRpb24sd3NkbC5leGlzdHMoKSk7DQotICAgICAgICBVUkwgd3NkbFVybCA9IHdzZGwudG9VUkwoKTsgDQotICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSBTZXJ2aWNlLmNyZWF0ZSh3c2RsVXJsLCBzZXJ2aWNlTmFtZSk7DQotICAgICAgICBPYmplY3QgcHJveHkgPXNlcnZpY2UuZ2V0UG9ydChwb3J0TmFtZSwgUlBDTGl0U1dBLmNsYXNzKTsNCi0gICAgICAgIEJpbmRpbmdQcm92aWRlciBwID0gKEJpbmRpbmdQcm92aWRlcilwcm94eTsgDQotICAgICAgICBwLmdldFJlcXVlc3RDb250ZXh0KCkucHV0KEJpbmRpbmdQcm92aWRlci5FTkRQT0lOVF9BRERSRVNTX1BST1BFUlRZLGF4aXNFbmRwb2ludCk7DQotICAgICAgICANCi0gICAgICAgIHJldHVybiAoUlBDTGl0U1dBKXByb3h5Ow0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogVXRpbGl0eSBNZXRob2QgdG8gZ2V0IGEgRGlzcGF0Y2g8U3RyaW5nPg0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqIEB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uDQotICAgICAqLw0KLSAgICBwdWJsaWMgRGlzcGF0Y2g8U3RyaW5nPiBnZXREaXNwYXRjaCgpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24gew0KLSAgICAgICAgRmlsZSB3c2RsPSBuZXcgRmlsZSh3c2RsTG9jYXRpb24pOyANCi0gICAgICAgIFVSTCB3c2RsVXJsID0gd3NkbC50b1VSTCgpOyANCi0gICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IFNlcnZpY2UuY3JlYXRlKG51bGwsIHNlcnZpY2VOYW1lKTsNCi0gICAgICAgIHNlcnZpY2UuYWRkUG9ydChwb3J0TmFtZSwgbnVsbCwgYXhpc0VuZHBvaW50KTsNCi0gICAgICAgIERpc3BhdGNoPFN0cmluZz4gZGlzcGF0Y2ggPSBzZXJ2aWNlLmNyZWF0ZURpc3BhdGNoKHBvcnROYW1lLCBTdHJpbmcuY2xhc3MsIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VydmljZS5Nb2RlLlBBWUxPQUQpOw0KLSAgICAgICAgcmV0dXJuIGRpc3BhdGNoOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Tk9PUCgpIHsNCi0gICAgICAgIA0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogU2ltcGxlIHRlc3QgdGhhdCBlbnN1cmVzIHRoYXQgd2UgY2FuIGVjaG8gYSBzdHJpbmcgdG8gYW4gcnBjL2xpdCB3ZWIgc2VydmljZQ0KLSAgICAgKiBOT1RFOg0KLSAgICAgKiBUbyBlbmFibGUgdGhpcyB0ZXN0LCByZW1vdmUgdGhlIF8uDQotICAgICAqIE9uY2UgeW91IGRvIHRoaXMsIHlvdSBjYW4gYWRkIHRoZSBmb2xsb3dpbmcgY29kZSB0byBPcGVyYXRpb25EZXNjcmlwdGlvbkltcGwuDQotICAgICAqIGJ1aWxkQXR0YWNobWVudEluZm9ybWF0aW9uKCkNCi0gICAgICogLy8gVE9ETzogU3RhcnQgSEFDSyBmb3IgUlBDTGl0U1dBUHJveHlUZXN0DQotICAgICAgICBhZGRQYXJ0QXR0YWNobWVudERlc2NyaXB0aW9uKCJkdW1teUF0dGFjaG1lbnRJTiIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBdHRhY2htZW50RGVzY3JpcHRpb25JbXBsKEF0dGFjaG1lbnRUeXBlLlNXQSwgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7InRleHQvcGxhaW4ifSkpOw0KLSAgICAgICAgYWRkUGFydEF0dGFjaG1lbnREZXNjcmlwdGlvbigiZHVtbXlBdHRhY2htZW50SU5PVVQiLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXR0YWNobWVudERlc2NyaXB0aW9uSW1wbChBdHRhY2htZW50VHlwZS5TV0EsIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyJpbWFnZS9qcGVnIn0pKTsNCi0gICAgICAgIGFkZFBhcnRBdHRhY2htZW50RGVzY3JpcHRpb24oImR1bW15QXR0YWNobWVudE9VVCIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBdHRhY2htZW50RGVzY3JpcHRpb25JbXBsKEF0dGFjaG1lbnRUeXBlLlNXQSwgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7InRleHQvcGxhaW4ifSkpOw0KLSAgICAgICAgLy8gVE9ETzogRW5kIEhBQ0sgZm9yIFJQQ0xpc3RTV0FQcm94eVRlc3QNCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RSUENMaXRTV0FFY2hvKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICANCi0gICAgICAgICAgICBSUENMaXRTV0EgcHJveHkgPSBnZXRQcm94eSgpOw0KLSAgICAgICAgICAgIFN0cmluZyByZXF1ZXN0ID0gIlRoaXMgaXMgYSBub3QgYXR0YWNobWVudCBkYXRhIjsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBTdHJpbmcgYXR0YWNobWVudElOID0gIkRhdGEgZm9yIHBsYWluIHRleHQgYXR0YWNobWVudCI7DQotICAgICAgICAgICAgRGF0YUhhbmRsZXIgYXR0YWNobWVudElOT1VUID0gZ2V0SW1hZ2VESCgpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIEhvbGRlcjxEYXRhSGFuZGxlcj4gYXR0YWNobWVudElOT1VUX0hvbGRlciA9IG5ldyBIb2xkZXI8RGF0YUhhbmRsZXI+KCk7DQotICAgICAgICAgICAgYXR0YWNobWVudElOT1VUX0hvbGRlci52YWx1ZSA9IGF0dGFjaG1lbnRJTk9VVDsNCi0gICAgICAgICAgICBIb2xkZXI8U3RyaW5nPiByZXNwb25zZV9Ib2xkZXIgPSBuZXcgSG9sZGVyPFN0cmluZz4oKTsNCi0gICAgICAgICAgICBIb2xkZXI8U3RyaW5nPiBhdHRhY2htZW50T1VUX0hvbGRlciA9IG5ldyBIb2xkZXI8U3RyaW5nPigpOw0KLSAgICAgICAgICAgDQotICAgICAgICAgICAgcHJveHkuZWNobyhyZXF1ZXN0LCBhdHRhY2htZW50SU4sIGF0dGFjaG1lbnRJTk9VVF9Ib2xkZXIsIHJlc3BvbnNlX0hvbGRlciwgDQotICAgICAgICAgICAgICAgICAgICAgICBhdHRhY2htZW50T1VUX0hvbGRlcik7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiQmFkIFJlc3BvbnNlIEhvbGRlciIsIHJlc3BvbnNlX0hvbGRlciAhPSBudWxsKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKCJSZXNwb25zZSB2YWx1ZSBpcyBudWxsIiwgcmVzcG9uc2VfSG9sZGVyLnZhbHVlICE9IG51bGwpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUoIlJlc3BvbnNlIGlzIG5vdCB0aGUgc2FtZSBhcyByZXF1ZXN0LiBSZWNlaXZlPSIrcmVzcG9uc2VfSG9sZGVyLnZhbHVlLCANCi0gICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuZXF1YWxzKHJlc3BvbnNlX0hvbGRlci52YWx1ZSkpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIGFzc2VydFRydWUoIlRoZSBvdXRwdXQgYXR0YWNobWVudCBob2xkZXIgaXMgbnVsbCIsIGF0dGFjaG1lbnRPVVRfSG9sZGVyICE9IG51bGwpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUoIlRoZSBvdXRwdXQgYXR0YWNobWVudCBpcyBudWxsIiwgYXR0YWNobWVudE9VVF9Ib2xkZXIudmFsdWUgIT0gbnVsbCk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIG91dHB1dCBhdHRhY2htZW50IGlzIG5vdCB0aGUgc2FtZSBhcyB0aGUgaW5wdXQuICBSZWNlaXZlZD0iICsgDQotICAgICAgICAgICAgICAgICAgICAgICBhdHRhY2htZW50T1VUX0hvbGRlci52YWx1ZSwgDQotICAgICAgICAgICAgICAgICAgICBhdHRhY2htZW50SU4uZXF1YWxzKGF0dGFjaG1lbnRPVVRfSG9sZGVyLnZhbHVlKSk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICANCi0gICAgICAgICAgICBhc3NlcnRUcnVlKCJUaGUgaW5vdXQgYXR0YWNobWVudCBob2xkZXIgaXMgbnVsbCIsIGF0dGFjaG1lbnRJTk9VVF9Ib2xkZXIgIT0gbnVsbCk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIGlub3V0IGF0dGFjaG1lbnQgaXMgbnVsbCIsIGF0dGFjaG1lbnRJTk9VVF9Ib2xkZXIudmFsdWUgIT0gbnVsbCk7DQotICAgICAgICAgICAgLy8gRW5zdXJlIHRoYXQgdGhpcyBpcyBub3QgdGhlIHNhbWUgb2JqZWN0DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhdHRhY2htZW50SU5PVVRfSG9sZGVyLnZhbHVlICE9IGF0dGFjaG1lbnRJTk9VVCk7IA0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLQ0KLSAgICAgICAgICAgIC8vIFRyeSBhZ2FpbiB3aXRoIHRoZSBzYW1lIHByb3h5DQotICAgICAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tDQotICAgICAgICAgICAgcmVxdWVzdCA9ICJUaGlzIGlzIGEgbm90IGF0dGFjaG1lbnQgZGF0YSI7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgYXR0YWNobWVudElOID0gIkRhdGEgZm9yIHBsYWluIHRleHQgYXR0YWNobWVudCI7DQotICAgICAgICAgICAgYXR0YWNobWVudElOT1VUID0gZ2V0SW1hZ2VESCgpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIGF0dGFjaG1lbnRJTk9VVF9Ib2xkZXIgPSBuZXcgSG9sZGVyPERhdGFIYW5kbGVyPigpOw0KLSAgICAgICAgICAgIGF0dGFjaG1lbnRJTk9VVF9Ib2xkZXIudmFsdWUgPSBhdHRhY2htZW50SU5PVVQ7DQotICAgICAgICAgICAgcmVzcG9uc2VfSG9sZGVyID0gbmV3IEhvbGRlcjxTdHJpbmc+KCk7DQotICAgICAgICAgICAgYXR0YWNobWVudE9VVF9Ib2xkZXIgPSBuZXcgSG9sZGVyPFN0cmluZz4oKTsNCi0gICAgICAgICAgIA0KLSAgICAgICAgICAgIHByb3h5LmVjaG8ocmVxdWVzdCwgYXR0YWNobWVudElOLCBhdHRhY2htZW50SU5PVVRfSG9sZGVyLCByZXNwb25zZV9Ib2xkZXIsIA0KLSAgICAgICAgICAgICAgICAgICAgICAgYXR0YWNobWVudE9VVF9Ib2xkZXIpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIGFzc2VydFRydWUoIkJhZCBSZXNwb25zZSBIb2xkZXIiLCByZXNwb25zZV9Ib2xkZXIgIT0gbnVsbCk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiUmVzcG9uc2UgdmFsdWUgaXMgbnVsbCIsIHJlc3BvbnNlX0hvbGRlci52YWx1ZSAhPSBudWxsKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKCJSZXNwb25zZSBpcyBub3QgdGhlIHNhbWUgYXMgcmVxdWVzdC4gUmVjZWl2ZT0iK3Jlc3BvbnNlX0hvbGRlci52YWx1ZSwgDQotICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmVxdWFscyhyZXNwb25zZV9Ib2xkZXIudmFsdWUpKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBhc3NlcnRUcnVlKCJUaGUgb3V0cHV0IGF0dGFjaG1lbnQgaG9sZGVyIGlzIG51bGwiLCBhdHRhY2htZW50T1VUX0hvbGRlciAhPSBudWxsKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKCJUaGUgb3V0cHV0IGF0dGFjaG1lbnQgaXMgbnVsbCIsIGF0dGFjaG1lbnRPVVRfSG9sZGVyLnZhbHVlICE9IG51bGwpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUoIlRoZSBvdXRwdXQgYXR0YWNobWVudCBpcyBub3QgdGhlIHNhbWUgYXMgdGhlIGlucHV0LiAgUmVjZWl2ZWQ9IiArIA0KLSAgICAgICAgICAgICAgICAgICAgICAgYXR0YWNobWVudE9VVF9Ib2xkZXIudmFsdWUsIA0KLSAgICAgICAgICAgICAgICAgICAgYXR0YWNobWVudElOLmVxdWFscyhhdHRhY2htZW50T1VUX0hvbGRlci52YWx1ZSkpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgDQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIGlub3V0IGF0dGFjaG1lbnQgaG9sZGVyIGlzIG51bGwiLCBhdHRhY2htZW50SU5PVVRfSG9sZGVyICE9IG51bGwpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUoIlRoZSBpbm91dCBhdHRhY2htZW50IGlzIG51bGwiLCBhdHRhY2htZW50SU5PVVRfSG9sZGVyLnZhbHVlICE9IG51bGwpOw0KLSAgICAgICAgICAgIC8vIEVuc3VyZSB0aGF0IHRoaXMgaXMgbm90IHRoZSBzYW1lIG9iamVjdA0KLSAgICAgICAgICAgIGFzc2VydFRydWUoYXR0YWNobWVudElOT1VUX0hvbGRlci52YWx1ZSAhPSBhdHRhY2htZW50SU5PVVQpOyAgDQotICAgICAgICANCi0gICAgfQ0KLSAgICANCi0gICAgcHJpdmF0ZSBEYXRhSGFuZGxlciBnZXRJbWFnZURIKCkgew0KLSAgICAgICAgcmV0dXJuIG5ldyBEYXRhSGFuZGxlcihpbWFnZURTKTsNCi0gICAgfQ0KLSAgICANCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L1JQQ1Byb3h5VGVzdHMuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9SUENQcm94eVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2MjYwOGQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L1JQQ1Byb3h5VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnByb3h5Ow0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5UZXN0TG9nZ2VyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmZyYW1ld29yay5BYnN0cmFjdFRlc3RDYXNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnByb3h5LnJwY2xpdC5SUENMaXRJbXBsOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnByb3h5LnJwY2xpdC5zZWkuUlBDRmF1bHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJveHkucnBjbGl0LnNlaS5SUENMaXQ7DQotaW1wb3J0IG9yZy50ZXN0LnByb3h5LnJwY2xpdC5Db21wbGV4QWxsOw0KLWltcG9ydCBvcmcudGVzdC5wcm94eS5ycGNsaXQuRW51bTsNCi0NCi1pbXBvcnQgamF2YXgueG1sLmRhdGF0eXBlLlhNTEdyZWdvcmlhbkNhbGVuZGFyOw0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOw0KLWltcG9ydCBqYXZheC54bWwud3MuQmluZGluZ1Byb3ZpZGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuRGlzcGF0Y2g7DQotaW1wb3J0IGphdmF4LnhtbC53cy5Ib2xkZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5pby5GaWxlOw0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsNCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLm5ldC5VUkw7DQotDQotcHVibGljIGNsYXNzIFJQQ1Byb3h5VGVzdHMgZXh0ZW5kcyBBYnN0cmFjdFRlc3RDYXNlIHsNCi0NCi0gICAgcHJpdmF0ZSBRTmFtZSBzZXJ2aWNlTmFtZSA9IG5ldyBRTmFtZSgNCi0gICAgICAgICAgICAiaHR0cDovL29yZy5hcGFjaGUuYXhpczIuamF4d3MucHJveHkucnBjbGl0IiwgIlJQQ0xpdFNlcnZpY2UiKTsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgYXhpc0VuZHBvaW50ID0gImh0dHA6Ly9sb2NhbGhvc3Q6NjA2MC9heGlzMi9zZXJ2aWNlcy9SUENMaXRTZXJ2aWNlLlJQQ0xpdEltcGxQb3J0IjsNCi0gICAgcHJpdmF0ZSBRTmFtZSBwb3J0TmFtZSA9IG5ldyBRTmFtZSgiaHR0cDovL29yZy5hcGFjaGUuYXhpczIuamF4d3MucHJveHkucnBjbGl0IiwNCi0gICAgICAgICAgICAiUlBDTGl0Iik7DQotICAgIHByaXZhdGUgU3RyaW5nIHdzZGxMb2NhdGlvbiA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiYmFzZWRpciIsIi4iKSsiLyIrInRlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9ycGNsaXQvTUVUQS1JTkYvUlBDTGl0LndzZGwiOw0KLSAgICANCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgew0KLSAgICAgICAgcmV0dXJuIGdldFRlc3RTZXR1cChuZXcgVGVzdFN1aXRlKFJQQ1Byb3h5VGVzdHMuY2xhc3MpKTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFV0aWxpdHkgbWV0aG9kIHRvIGdldCB0aGUgcHJveHkNCi0gICAgICogQHJldHVybiBSUENMaXQgcHJveHkNCi0gICAgICogQHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24NCi0gICAgICovDQotICAgIHB1YmxpYyBSUENMaXQgZ2V0UHJveHkoKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsNCi0gICAgICAgIEZpbGUgd3NkbD0gbmV3IEZpbGUod3NkbExvY2F0aW9uKTsgDQotICAgICAgICBVUkwgd3NkbFVybCA9IHdzZGwudG9VUkwoKTsgDQotICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSBTZXJ2aWNlLmNyZWF0ZShudWxsLCBzZXJ2aWNlTmFtZSk7DQotICAgICAgICBPYmplY3QgcHJveHkgPXNlcnZpY2UuZ2V0UG9ydChwb3J0TmFtZSwgUlBDTGl0LmNsYXNzKTsNCi0gICAgICAgIEJpbmRpbmdQcm92aWRlciBwID0gKEJpbmRpbmdQcm92aWRlcilwcm94eTsgDQotICAgICAgICBwLmdldFJlcXVlc3RDb250ZXh0KCkucHV0KEJpbmRpbmdQcm92aWRlci5FTkRQT0lOVF9BRERSRVNTX1BST1BFUlRZLGF4aXNFbmRwb2ludCk7DQotICAgICAgICANCi0gICAgICAgIHJldHVybiAoUlBDTGl0KXByb3h5Ow0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogVXRpbGl0eSBNZXRob2QgdG8gZ2V0IGEgRGlzcGF0Y2g8U3RyaW5nPg0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqIEB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uDQotICAgICAqLw0KLSAgICBwdWJsaWMgRGlzcGF0Y2g8U3RyaW5nPiBnZXREaXNwYXRjaCgpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24gew0KLSAgICAgICAgRmlsZSB3c2RsPSBuZXcgRmlsZSh3c2RsTG9jYXRpb24pOyANCi0gICAgICAgIFVSTCB3c2RsVXJsID0gd3NkbC50b1VSTCgpOyANCi0gICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IFNlcnZpY2UuY3JlYXRlKG51bGwsIHNlcnZpY2VOYW1lKTsNCi0gICAgICAgIHNlcnZpY2UuYWRkUG9ydChwb3J0TmFtZSwgbnVsbCwgYXhpc0VuZHBvaW50KTsNCi0gICAgICAgIERpc3BhdGNoPFN0cmluZz4gZGlzcGF0Y2ggPSBzZXJ2aWNlLmNyZWF0ZURpc3BhdGNoKHBvcnROYW1lLCBTdHJpbmcuY2xhc3MsIFNlcnZpY2UuTW9kZS5QQVlMT0FEKTsNCi0gICAgICAgIHJldHVybiBkaXNwYXRjaDsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFNpbXBsZSB0ZXN0IHRoYXQgZW5zdXJlcyB0aGF0IHdlIGNhbiBlY2hvIGEgc3RyaW5nIHRvIGFuIHJwYy9saXQgd2ViIHNlcnZpY2UNCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RTaW1wbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIHRyeXsgDQotICAgICAgICAgICAgUlBDTGl0IHByb3h5ID0gZ2V0UHJveHkoKTsNCi0gICAgICAgICAgICBTdHJpbmcgcmVxdWVzdCA9ICJUaGlzIGlzIGEgdGVzdC4uLiI7DQotICAgICAgICAgICANCi0gICAgICAgICAgICBTdHJpbmcgcmVzcG9uc2UgPSBwcm94eS50ZXN0U2ltcGxlKHJlcXVlc3QpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UgIT0gbnVsbCk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZS5lcXVhbHMocmVxdWVzdCkpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIFRyeSBhIHNlY29uZCB0aW1lDQotICAgICAgICAgICAgcmVzcG9uc2UgPSBwcm94eS50ZXN0U2ltcGxlKHJlcXVlc3QpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UgIT0gbnVsbCk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZS5lcXVhbHMocmVxdWVzdCkpOw0KLSAgICAgICAgfWNhdGNoKEV4Y2VwdGlvbiBlKXsgDQotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsgDQotICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIHJlY2VpdmVkIiArIGUpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogU2ltcGxlIHRlc3QgdGhhdCBlbnN1cmVzIHRoYXQgd2UgY2FuIGVjaG8gYSBzdHJpbmcgdG8gYW4gcnBjL2xpdCB3ZWIgc2VydmljZQ0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdFNpbXBsZUluT3V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICB0cnl7IA0KLSAgICAgICAgICAgIFJQQ0xpdCBwcm94eSA9IGdldFByb3h5KCk7DQotICAgICAgICAgICAgU3RyaW5nIHJlcXVlc3QgPSAiVGhpcyBpcyBhIHRlc3QuLi4iOw0KLSAgICAgICAgICAgIEhvbGRlcjxTdHJpbmc+IHJlcXVlc3RQYXJhbSA9IG5ldyBIb2xkZXI8U3RyaW5nPigpOw0KLSAgICAgICAgICAgIHJlcXVlc3RQYXJhbS52YWx1ZSA9IHJlcXVlc3Q7DQotICAgICAgICAgICANCi0gICAgICAgICAgICBTdHJpbmcgcmVzcG9uc2UgPSBwcm94eS50ZXN0U2ltcGxlSW5PdXQocmVxdWVzdFBhcmFtKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlICE9IG51bGwpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UuZXF1YWxzKHJlcXVlc3QpKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHJlcXVlc3RQYXJhbS52YWx1ZS5lcXVhbHMocmVxdWVzdCkpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIFRyeSBhIHNlY29uZCB0aW1lDQotICAgICAgICAgICAgcmVzcG9uc2UgPSBwcm94eS50ZXN0U2ltcGxlSW5PdXQocmVxdWVzdFBhcmFtKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlICE9IG51bGwpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UuZXF1YWxzKHJlcXVlc3QpKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHJlcXVlc3RQYXJhbS52YWx1ZS5lcXVhbHMocmVxdWVzdCkpOw0KLSAgICAgICAgfWNhdGNoKEV4Y2VwdGlvbiBlKXsgDQotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsgDQotICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIHJlY2VpdmVkIiArIGUpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogU2ltcGxlIHRlc3QgdGhhdCBlbnN1cmVzIHRoYXQgd2UgY2FuIGVjaG8gYSBzdHJpbmcgdG8gYW4gcnBjL2xpdCB3ZWIgc2VydmljZQ0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdFNpbXBsZTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIHRyeXsgDQotICAgICAgICAgICAgUlBDTGl0IHByb3h5ID0gZ2V0UHJveHkoKTsNCi0gICAgICAgICAgICBTdHJpbmcgcmVxdWVzdDEgPSAiaGVsbG8iOw0KLSAgICAgICAgICAgIFN0cmluZyByZXF1ZXN0MiA9ICJ3b3JsZCI7DQotICAgICAgICAgICANCi0gICAgICAgICAgICBTdHJpbmcgcmVzcG9uc2UgPSBwcm94eS50ZXN0U2ltcGxlMihyZXF1ZXN0MSwgcmVxdWVzdDIpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UgIT0gbnVsbCk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZS5lcXVhbHMoImhlbGxvd29ybGQiKSk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gVHJ5IGEgc2Vjb25kIHRpbWUNCi0gICAgICAgICAgICByZXNwb25zZSA9IHByb3h5LnRlc3RTaW1wbGUyKHJlcXVlc3QxLCByZXF1ZXN0Mik7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZSAhPSBudWxsKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlLmVxdWFscygiaGVsbG93b3JsZCIpKTsNCi0gICAgICAgIH1jYXRjaChFeGNlcHRpb24gZSl7IA0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7IA0KLSAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiByZWNlaXZlZCIgKyBlKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFNpbXBsZSB0ZXN0IHRoYXQgZW5zdXJlcyB0aGF0IHdlIGNhbiBlY2hvIGEgc3RyaW5nIHRvIGFuIHJwYy9saXQgd2ViIHNlcnZpY2UuDQotICAgICAqIFRoaXMgdGVzdCBwYXNzZXMgdGhlIGluZm9ybWF0aW9uIGluIGhlYWRlcnMNCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RIZWFkZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIFJQQ0xpdCBwcm94eSA9IGdldFByb3h5KCk7DQotICAgICAgICBTdHJpbmcgcmVxdWVzdDEgPSAiaGVsbG8iOw0KLSAgICAgICAgU3RyaW5nIHJlcXVlc3QyID0gIndvcmxkIjsNCi0gICAgICAgIA0KLSAgICAgICAgU3RyaW5nIHJlc3BvbnNlID0gcHJveHkudGVzdEhlYWRlcihyZXF1ZXN0MSwgcmVxdWVzdDIpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZSAhPSBudWxsKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UuZXF1YWxzKCJoZWxsb3dvcmxkIikpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBUcnkgYSBzZWNvbmQgdGltZQ0KLSAgICAgICAgcmVzcG9uc2UgPSBwcm94eS50ZXN0SGVhZGVyKHJlcXVlc3QxLCByZXF1ZXN0Mik7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlICE9IG51bGwpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZS5lcXVhbHMoImhlbGxvd29ybGQiKSk7DQotICAgICAgICANCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFNpbXBsZSB0ZXN0IHRoYXQgZW5zdXJlcyB0aGF0IGEgc2VydmljZSBmYXVsdCBpcyB0aHJvd24gY29ycmVjdGx5DQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmF1bHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIFJQQ0xpdCBwcm94eSA9IGdldFByb3h5KCk7DQotICAgICAgICB0cnl7IA0KLSAgICAgICAgICAgIHByb3h5LnRlc3RGYXVsdCgpOw0KLSAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIFJQQ0ZhdWx0Iik7DQotICAgICAgICB9IGNhdGNoKFJQQ0ZhdWx0IHJwY0ZhdWx0KXsgDQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShycGNGYXVsdC5nZXRNZXNzYWdlKCkuZXF1YWxzKCJUaHJvdyBSUENGYXVsdCIpKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHJwY0ZhdWx0LmdldEZhdWx0SW5mbygpID09IDEyMyk7DQotICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKXsgDQotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsgDQotICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIHJlY2VpdmVkIiArIGUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICAvLyBUcnkgYSBzZWNvbmQgdGltZQ0KLSAgICAgICAgdHJ5eyANCi0gICAgICAgICAgICBwcm94eS50ZXN0RmF1bHQoKTsNCi0gICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBSUENGYXVsdCIpOw0KLSAgICAgICAgfSBjYXRjaChSUENGYXVsdCBycGNGYXVsdCl7IA0KLSAgICAgICAgICAgIGFzc2VydFRydWUocnBjRmF1bHQuZ2V0TWVzc2FnZSgpLmVxdWFscygiVGhyb3cgUlBDRmF1bHQiKSk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShycGNGYXVsdC5nZXRGYXVsdEluZm8oKSA9PSAxMjMpOw0KLSAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSl7IA0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7IA0KLSAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiByZWNlaXZlZCIgKyBlKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFNpbXBsZSB0ZXN0IHRoYXQgZW5zdXJlcyB0aGF0IHdlIGNhbiBlY2hvIGEgc3RyaW5nIHRvIGFuIHJwYy9saXQgd2ViIHNlcnZpY2UNCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RGb3JOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBSUENMaXQgcHJveHkgPSBnZXRQcm94eSgpOw0KLSAgICAgICAgdHJ5eyAgIA0KLSAgICAgICAgICAgIFN0cmluZyByZXF1ZXN0ID0gbnVsbDsNCi0gICAgICAgICAgIA0KLSAgICAgICAgICAgIFN0cmluZyByZXNwb25zZSA9IHByb3h5LnRlc3RTaW1wbGUocmVxdWVzdCk7DQotICAgICAgICAgICAgZmFpbCgiUlBDL0xJVCBzaG91bGQgdGhyb3cgd2Vic2VydmljZUV4Y2VwdGlvbiB3aGVuIG9wZXJhdGlvbiBpcyBpbnZva2VkIHdpdGggbnVsbCBpbnB1dCBwYXJhbWV0ZXIiKTsNCi0gICAgICAgIH1jYXRjaChFeGNlcHRpb24gZSl7IA0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZSBpbnN0YW5jZW9mIFdlYlNlcnZpY2VFeGNlcHRpb24pOw0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKGUuZ2V0TWVzc2FnZSgpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgLy8gVHJ5IGEgc2Vjb25kIHRpbWUNCi0gICAgICAgIHRyeXsgICANCi0gICAgICAgICAgICBTdHJpbmcgcmVxdWVzdCA9IG51bGw7DQotICAgICAgICAgICANCi0gICAgICAgICAgICBTdHJpbmcgcmVzcG9uc2UgPSBwcm94eS50ZXN0U2ltcGxlKHJlcXVlc3QpOw0KLSAgICAgICAgICAgIGZhaWwoIlJQQy9MSVQgc2hvdWxkIHRocm93IHdlYnNlcnZpY2VFeGNlcHRpb24gd2hlbiBvcGVyYXRpb24gaXMgaW52b2tlZCB3aXRoIG51bGwgaW5wdXQgcGFyYW1ldGVyIik7DQotICAgICAgICB9Y2F0Y2goRXhjZXB0aW9uIGUpeyANCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGUgaW5zdGFuY2VvZiBXZWJTZXJ2aWNlRXhjZXB0aW9uKTsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZyhlLmdldE1lc3NhZ2UoKSk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBTaW1wbGUgdGVzdCB0aGF0IGVuc3VyZXMgdGhhdCB3ZSBjYW4gZWNobyBhIHN0cmluZyB0byBhbiBycGMvbGl0IHdlYiBzZXJ2aWNlDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Rm9yTnVsbFJldHVybigpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgDQotICAgICAgICBSUENMaXQgcHJveHkgPSBnZXRQcm94eSgpOw0KLSAgICAgICAgdHJ5eyANCi0gICAgICAgICAgICBTdHJpbmcgcmVzcG9uc2UgPSBwcm94eS50ZXN0U2ltcGxlKCJyZXR1cm5OdWxsIik7DQotICAgICAgICAgICAgZmFpbCgiUlBDL0xJVCBzaG91bGQgdGhyb3cgd2Vic2VydmljZUV4Y2VwdGlvbiB3aGVuIG9wZXJhdGlvbiBpcyBpbnZva2VkIHdpdGggbnVsbCBvdXQgcGFyYW1ldGVyIik7DQotICAgICAgICB9Y2F0Y2goRXhjZXB0aW9uIGUpeyANCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGUgaW5zdGFuY2VvZiBXZWJTZXJ2aWNlRXhjZXB0aW9uKTsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZyhlLmdldE1lc3NhZ2UoKSk7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIC8vIFRyeSBhIHNlY29uZCB0aW1lDQotICAgICAgICB0cnl7IA0KLSAgICAgICAgICAgIFN0cmluZyByZXNwb25zZSA9IHByb3h5LnRlc3RTaW1wbGUoInJldHVybk51bGwiKTsNCi0gICAgICAgICAgICBmYWlsKCJSUEMvTElUIHNob3VsZCB0aHJvdyB3ZWJzZXJ2aWNlRXhjZXB0aW9uIHdoZW4gb3BlcmF0aW9uIGlzIGludm9rZWQgd2l0aCBudWxsIG91dCBwYXJhbWV0ZXIiKTsNCi0gICAgICAgIH1jYXRjaChFeGNlcHRpb24gZSl7IA0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZSBpbnN0YW5jZW9mIFdlYlNlcnZpY2VFeGNlcHRpb24pOw0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKGUuZ2V0TWVzc2FnZSgpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICANCi0gICAgDQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlX0Rpc3BhdGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICAvLyBTZW5kIGEgcGF5bG9hZCB0aGF0IHNpbXVsYXRlcw0KLSAgICAgICAgLy8gdGhlIHJwYyBtZXNzYWdlDQotICAgICAgICBTdHJpbmcgcmVxdWVzdCA9ICI8dG5zOnRlc3RTaW1wbGUgeG1sbnM6dG5zPSdodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9ycGNsaXQnPiIgKw0KLSAgICAgICAgIjxzaW1wbGVJbiB4c2k6dHlwZT0neHNkOnN0cmluZycgeG1sbnM6eHNkPSdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYScgeG1sbnM6eHNpPSdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSc+IiArDQotICAgICAgICAiUEFZTE9BRCBXSVRIIFhTSTpUWVBFIiArDQotICAgICAgICAiPC9zaW1wbGVJbj48L3Ruczp0ZXN0U2ltcGxlPiI7DQotICAgICAgICBEaXNwYXRjaDxTdHJpbmc+IGRpc3BhdGNoID0gZ2V0RGlzcGF0Y2goKTsNCi0gICAgICAgIFN0cmluZyByZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0NCi0gICAgICAgIGFzc2VydE5vdE51bGwoImRpc3BhdGNoIGludm9rZSByZXR1cm5lZCBudWxsIiwgcmVzcG9uc2UpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcocmVzcG9uc2UpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIGNvbnRlbnQgaXMgY29ycmVjdA0KLSAgICAgICAgYXNzZXJ0VHJ1ZSghcmVzcG9uc2UuY29udGFpbnMoInNvYXAiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZS5jb250YWlucygiRW52ZWxvcGUiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZS5jb250YWlucygiQm9keSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlLmNvbnRhaW5zKCJGYXVsdCIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UuY29udGFpbnMoInNpbXBsZU91dCIpKTsNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlLmNvbnRhaW5zKCI6c2ltcGxlT3V0IikpOyAgLy8gTWFrZSBzdXJlIHNpbXBsZSBvdXQgaXMgbm90IG5hbWVzcGFjZSBxdWFsaWZpZWQNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UuY29udGFpbnMoIjp0ZXN0U2ltcGxlUmVzcG9uc2UiKSk7ICAvLyBNYWtlIHN1cmUgcmVzcG9uc2UgaXMgbmFtZXNwYWNlIHF1YWxpZmllZCAgDQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlLmNvbnRhaW5zKCJQQVlMT0FEIFdJVEggWFNJOlRZUEUiKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIFRyeSBhIHNlY29uZCB0aW1lDQotICAgICAgICByZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0NCi0gICAgICAgIGFzc2VydE5vdE51bGwoImRpc3BhdGNoIGludm9rZSByZXR1cm5lZCBudWxsIiwgcmVzcG9uc2UpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcocmVzcG9uc2UpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIGNvbnRlbnQgaXMgY29ycmVjdA0KLSAgICAgICAgYXNzZXJ0VHJ1ZSghcmVzcG9uc2UuY29udGFpbnMoInNvYXAiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZS5jb250YWlucygiRW52ZWxvcGUiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZS5jb250YWlucygiQm9keSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlLmNvbnRhaW5zKCJGYXVsdCIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UuY29udGFpbnMoInNpbXBsZU91dCIpKTsNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlLmNvbnRhaW5zKCI6c2ltcGxlT3V0IikpOyAgLy8gTWFrZSBzdXJlIHNpbXBsZSBvdXQgaXMgbm90IG5hbWVzcGFjZSBxdWFsaWZpZWQNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UuY29udGFpbnMoIjp0ZXN0U2ltcGxlUmVzcG9uc2UiKSk7ICAvLyBNYWtlIHN1cmUgcmVzcG9uc2UgaXMgbmFtZXNwYWNlIHF1YWxpZmllZCAgDQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlLmNvbnRhaW5zKCJQQVlMT0FEIFdJVEggWFNJOlRZUEUiKSk7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHRlc3RTaW1wbGUyX0Rpc3BhdGNoV2l0aG91dFhTSVR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIC8vIFNlbmQgYSBwYXlsb2FkIHRoYXQgc2ltdWxhdGVzDQotICAgICAgICAvLyB0aGUgcnBjIG1lc3NhZ2UNCi0gICAgICAgIFN0cmluZyByZXF1ZXN0ID0gIjx0bnM6dGVzdFNpbXBsZTIgeG1sbnM6dG5zPSdodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9ycGNsaXQnPiIgKw0KLSAgICAgICAgIjxzaW1wbGUySW4xPiIgKw0KLSAgICAgICAgIkhFTExPIiArDQotICAgICAgICAiPC9zaW1wbGUySW4xPiIgKw0KLSAgICAgICAgIjxzaW1wbGUySW4yPiIgKw0KLSAgICAgICAgIldPUkxEIiArDQotICAgICAgICAiPC9zaW1wbGUySW4yPjwvdG5zOnRlc3RTaW1wbGUyPiI7DQotICAgICAgICBEaXNwYXRjaDxTdHJpbmc+IGRpc3BhdGNoID0gZ2V0RGlzcGF0Y2goKTsNCi0gICAgICAgIFN0cmluZyByZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0gICAgICAgIA0KLQ0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgiZGlzcGF0Y2ggaW52b2tlIHJldHVybmVkIG51bGwiLCByZXNwb25zZSk7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZyhyZXNwb25zZSk7DQotICAgICAgICANCi0gICAgICAgIC8vIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgY29udGVudCBpcyBjb3JyZWN0DQotICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZS5jb250YWlucygic29hcCIpKTsNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlLmNvbnRhaW5zKCJFbnZlbG9wZSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlLmNvbnRhaW5zKCJCb2R5IikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSghcmVzcG9uc2UuY29udGFpbnMoIkZhdWx0IikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZS5jb250YWlucygic2ltcGxlMk91dCIpKTsNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlLmNvbnRhaW5zKCI6c2ltcGxlMk91dCIpKTsvLyBNYWtlIHN1cmUgc2ltcGxlT3V0IGlzIG5vdCBuYW1lc3BhY2UgcXVhbGlmaWVkDQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlLmNvbnRhaW5zKCI6dGVzdFNpbXBsZTJSZXNwb25zZSIpKTsgDQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlLmNvbnRhaW5zKCJIRUxMT1dPUkxEIikpOw0KLSAgICAgICAgDQotICAgICAgICANCi0gICAgICAgIC8vIFRyeSBhIHNlY29uZCB0aW1lDQotICAgICAgICByZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0gICAgICAgIA0KLQ0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgiZGlzcGF0Y2ggaW52b2tlIHJldHVybmVkIG51bGwiLCByZXNwb25zZSk7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZyhyZXNwb25zZSk7DQotICAgICAgICANCi0gICAgICAgIC8vIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgY29udGVudCBpcyBjb3JyZWN0DQotICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZS5jb250YWlucygic29hcCIpKTsNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlLmNvbnRhaW5zKCJFbnZlbG9wZSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlLmNvbnRhaW5zKCJCb2R5IikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSghcmVzcG9uc2UuY29udGFpbnMoIkZhdWx0IikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZS5jb250YWlucygic2ltcGxlMk91dCIpKTsNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlLmNvbnRhaW5zKCI6c2ltcGxlMk91dCIpKTsvLyBNYWtlIHN1cmUgc2ltcGxlT3V0IGlzIG5vdCBuYW1lc3BhY2UgcXVhbGlmaWVkDQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlLmNvbnRhaW5zKCI6dGVzdFNpbXBsZTJSZXNwb25zZSIpKTsgDQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlLmNvbnRhaW5zKCJIRUxMT1dPUkxEIikpOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlX0Rpc3BhdGNoV2l0aG91dFhTSVR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIC8vIFNlbmQgYSBwYXlsb2FkIHRoYXQgc2ltdWxhdGVzDQotICAgICAgICAvLyB0aGUgcnBjIG1lc3NhZ2UNCi0gICAgICAgIFN0cmluZyByZXF1ZXN0ID0gIjx0bnM6dGVzdFNpbXBsZSB4bWxuczp0bnM9J2h0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L3JwY2xpdCc+IiArDQotICAgICAgICAiPHNpbXBsZUluPiIgKw0KLSAgICAgICAgIlBBWUxPQUQgV0lUSE9VVCBYU0k6VFlQRSIgKw0KLSAgICAgICAgIjwvc2ltcGxlSW4+PC90bnM6dGVzdFNpbXBsZT4iOw0KLSAgICAgICAgRGlzcGF0Y2g8U3RyaW5nPiBkaXNwYXRjaCA9IGdldERpc3BhdGNoKCk7DQotICAgICAgICBTdHJpbmcgcmVzcG9uc2UgPSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7DQotICAgICAgICANCi0NCi0gICAgICAgIGFzc2VydE5vdE51bGwoImRpc3BhdGNoIGludm9rZSByZXR1cm5lZCBudWxsIiwgcmVzcG9uc2UpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcocmVzcG9uc2UpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIGNvbnRlbnQgaXMgY29ycmVjdA0KLSAgICAgICAgYXNzZXJ0VHJ1ZSghcmVzcG9uc2UuY29udGFpbnMoInNvYXAiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZS5jb250YWlucygiRW52ZWxvcGUiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZS5jb250YWlucygiQm9keSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlLmNvbnRhaW5zKCJGYXVsdCIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UuY29udGFpbnMoInNpbXBsZU91dCIpKTsNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlLmNvbnRhaW5zKCI6c2ltcGxlT3V0IikpOyAgLy8gTWFrZSBzdXJlIHNpbXBsZU91dCBpcyBub3QgbmFtZXNwYWNlIHF1YWxpZmllZA0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZS5jb250YWlucygiOnRlc3RTaW1wbGVSZXNwb25zZSIpKTsgDQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlLmNvbnRhaW5zKCJQQVlMT0FEIFdJVEhPVVQgWFNJOlRZUEUiKSk7DQotICAgICAgICANCi0gICAgICAgIA0KLSAgICAgICAgLy8gVHJ5IGEgc2Vjb25kIHRpbWUNCi0gICAgICAgIHJlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLSAgICAgICAgDQotDQotICAgICAgICBhc3NlcnROb3ROdWxsKCJkaXNwYXRjaCBpbnZva2UgcmV0dXJuZWQgbnVsbCIsIHJlc3BvbnNlKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKHJlc3BvbnNlKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBjb250ZW50IGlzIGNvcnJlY3QNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlLmNvbnRhaW5zKCJzb2FwIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSghcmVzcG9uc2UuY29udGFpbnMoIkVudmVsb3BlIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSghcmVzcG9uc2UuY29udGFpbnMoIkJvZHkiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZS5jb250YWlucygiRmF1bHQiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlLmNvbnRhaW5zKCJzaW1wbGVPdXQiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZS5jb250YWlucygiOnNpbXBsZU91dCIpKTsgIC8vIE1ha2Ugc3VyZSBzaW1wbGVPdXQgaXMgbm90IG5hbWVzcGFjZSBxdWFsaWZpZWQNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UuY29udGFpbnMoIjp0ZXN0U2ltcGxlUmVzcG9uc2UiKSk7IA0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZS5jb250YWlucygiUEFZTE9BRCBXSVRIT1VUIFhTSTpUWVBFIikpOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogU2ltcGxlIHRlc3QgdGhhdCBlbnN1cmVzIHRoYXQgd2UgY2FuIGVjaG8gYSBzdHJpbmcgdG8gYW4gcnBjL2xpdCB3ZWIgc2VydmljZS4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpbmdMaXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICB0cnl7IA0KLSAgICAgICAgICAgIFJQQ0xpdCBwcm94eSA9IGdldFByb3h5KCk7DQotICAgICAgICAgICAgU3RyaW5nW10gcmVxdWVzdCA9IG5ldyBTdHJpbmdbXSB7IkhlbGxvIiAsICJXb3JsZCJ9Ow0KLSAgICAgICAgICAgDQotICAgICAgICAgICAgU3RyaW5nW10gcmVzcG9uc2UgPSBwcm94eS50ZXN0U3RyaW5nTGlzdDIocmVxdWVzdCk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZSAhPSBudWxsKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlLmxlbmd0aD09Mik7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZVswXS5lcXVhbHMoIkhlbGxvIikpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VbMV0uZXF1YWxzKCJXb3JsZCIpKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBUcnkgYSBzZWNvbmQgdGltZQ0KLSAgICAgICAgICAgIHJlc3BvbnNlID0gcHJveHkudGVzdFN0cmluZ0xpc3QyKHJlcXVlc3QpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UgIT0gbnVsbCk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZS5sZW5ndGg9PTIpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VbMF0uZXF1YWxzKCJIZWxsbyIpKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlWzFdLmVxdWFscygiV29ybGQiKSk7DQotICAgICAgICB9Y2F0Y2goRXhjZXB0aW9uIGUpeyANCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOyANCi0gICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gcmVjZWl2ZWQiICsgZSk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpbmdMaXN0X0Rpc3BhdGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICAvLyBTZW5kIGEgcGF5bG9hZCB0aGF0IHNpbXVsYXRlcw0KLSAgICAgICAgLy8gdGhlIHJwYyBtZXNzYWdlDQotICAgICAgICBTdHJpbmcgcmVxdWVzdCA9ICI8dG5zOnRlc3RTdHJpbmdMaXN0MiB4bWxuczp0bnM9J2h0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L3JwY2xpdCc+IiArDQotICAgICAgICAvLyI8dG5zOmFyZ18yXzAgeG1sbnM6dG5zPSdodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9ycGNsaXQnIHhtbG5zOnhzaT0naHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UnIHhzaTp0eXBlPSd0bnM6U3RyaW5nTGlzdCcgPiIgKw0KLSAgICAgICAgIjx0bnM6YXJnXzJfMD4iICsNCi0gICAgICAgICJIZWxsbyBXb3JsZCIgKw0KLSAgICAgICAgIjwvdG5zOmFyZ18yXzA+PC90bnM6dGVzdFN0cmluZ0xpc3QyPiI7DQotICAgICAgICBEaXNwYXRjaDxTdHJpbmc+IGRpc3BhdGNoID0gZ2V0RGlzcGF0Y2goKTsNCi0gICAgICAgIFN0cmluZyByZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0NCi0gICAgICAgIGFzc2VydE5vdE51bGwoImRpc3BhdGNoIGludm9rZSByZXR1cm5lZCBudWxsIiwgcmVzcG9uc2UpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcocmVzcG9uc2UpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIGNvbnRlbnQgaXMgY29ycmVjdA0KLSAgICAgICAgYXNzZXJ0VHJ1ZSghcmVzcG9uc2UuY29udGFpbnMoInNvYXAiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZS5jb250YWlucygiRW52ZWxvcGUiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZS5jb250YWlucygiQm9keSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlLmNvbnRhaW5zKCJGYXVsdCIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UuY29udGFpbnMoInRlc3RTdHJpbmdMaXN0MlJldHVybiIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UuY29udGFpbnMoInRlc3RTdHJpbmdMaXN0MlJlc3BvbnNlIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZS5jb250YWlucygiSGVsbG8gV29ybGQiKSk7DQotICAgICAgICANCi0gICAgICAgIA0KLSAgICAgICAgLy8gVHJ5IGEgc2Vjb25kIHRpbWUNCi0gICAgICAgIHJlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLQ0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgiZGlzcGF0Y2ggaW52b2tlIHJldHVybmVkIG51bGwiLCByZXNwb25zZSk7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZyhyZXNwb25zZSk7DQotICAgICAgICANCi0gICAgICAgIC8vIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgY29udGVudCBpcyBjb3JyZWN0DQotICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZS5jb250YWlucygic29hcCIpKTsNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlLmNvbnRhaW5zKCJFbnZlbG9wZSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlLmNvbnRhaW5zKCJCb2R5IikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSghcmVzcG9uc2UuY29udGFpbnMoIkZhdWx0IikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZS5jb250YWlucygidGVzdFN0cmluZ0xpc3QyUmV0dXJuIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZS5jb250YWlucygidGVzdFN0cmluZ0xpc3QyUmVzcG9uc2UiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlLmNvbnRhaW5zKCJIZWxsbyBXb3JsZCIpKTsNCi0gICAgfQ0KLSAgICAvKioNCi0gICAgICogQ3VycmVudGx5IG5vdCBlbmFibGVkIGR1ZSB0byBwcm9ibGVtcyB3aXRoIA0KLSAgICAgKiBtYXJzaGFsaW5nIGFuIHhzZDpsaXN0IG9mIFFOYW1lLg0KLSAgICAgKiANCi0gICAgICogVXNlcnMgc2hvdWxkIHVzZSBkb2N1bWVudC9saXRlcmFsIHByb2Nlc3NpbmcgaWYgdGhleSANCi0gICAgICogbmVlZCBzdWNoIGNvbXBsaWNhdGVkIHNjZW5hcmlvcy4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIF90ZXN0TGlzdHMoKSB7DQotICAgICAgICB0cnl7IA0KLSAgICAgICAgICAgIFJQQ0xpdCBwcm94eSA9IGdldFByb3h5KCk7DQotICAgICAgICAgICAgUU5hbWVbXSByZXF1ZXN0ID0gbmV3IFFOYW1lW10ge1JQQ0xpdEltcGwucW5hbWUxLCBSUENMaXRJbXBsLnFuYW1lMn07DQotICAgICAgICAgICANCi0gICAgICAgICAgICBRTmFtZVtdIHFOYW1lcyA9IHByb3h5LnRlc3RMaXN0cyhyZXF1ZXN0LA0KLSAgICAgICAgICAgICAgICAgICAgbmV3IFhNTEdyZWdvcmlhbkNhbGVuZGFyWzBdLA0KLSAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1swXSwNCi0gICAgICAgICAgICAgICAgICAgIG5ldyBCaWdJbnRlZ2VyWzBdLA0KLSAgICAgICAgICAgICAgICAgICAgbmV3IExvbmdbMF0sDQotICAgICAgICAgICAgICAgICAgICBuZXcgRW51bVswXSwNCi0gICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbMF0sDQotICAgICAgICAgICAgICAgICAgICBuZXcgQ29tcGxleEFsbCgpKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHFOYW1lcy5sZW5ndGg9PTIpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUocU5hbWVzWzBdLmVxdWFscyhSUENMaXRJbXBsLnFuYW1lMSkpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUocU5hbWVzWzFdLmVxdWFscyhSUENMaXRJbXBsLnFuYW1lMikpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vVHJ5IGEgc2Vjb25kIHRpbWUNCi0gICAgICAgICAgICBxTmFtZXMgPSBwcm94eS50ZXN0TGlzdHMocmVxdWVzdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhNTEdyZWdvcmlhbkNhbGVuZGFyWzBdLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nWzBdLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQmlnSW50ZWdlclswXSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IExvbmdbMF0sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBFbnVtWzBdLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nWzBdLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ29tcGxleEFsbCgpKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUocU5hbWVzLmxlbmd0aD09Mik7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKHFOYW1lc1swXS5lcXVhbHMoUlBDTGl0SW1wbC5xbmFtZTEpKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUocU5hbWVzWzFdLmVxdWFscyhSUENMaXRJbXBsLnFuYW1lMikpOw0KLSAgICAgICAgfWNhdGNoKEV4Y2VwdGlvbiBlKXsgDQotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsgDQotICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIHJlY2VpdmVkIiArIGUpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogQ3VycmVudGx5IG5vdCBlbmFibGVkIGR1ZSB0byBwcm9ibGVtcyBtYXJzaGFsbGluZy91bm1hcnNoYWxsaW5nDQotICAgICAqIGFuIHhzZDpsaXN0IG9mIFhNTEdyZWdvcmlhbkNhbGVuZGFyLg0KLSAgICAgKiANCi0gICAgICogVXNlcnMgc2hvdWxkIHVzZSBkb2N1bWVudC9saXRlcmFsIHByb2Nlc3NpbmcgaWYgdGhleSANCi0gICAgICogbmVlZCBzdWNoIGNvbXBsaWNhdGVkIHNjZW5hcmlvcy4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIF90ZXN0Q2FsZW5kYXJzKCkgew0KLSAgICAgICAgdHJ5eyANCi0gICAgICAgICAgICBSUENMaXQgcHJveHkgPSBnZXRQcm94eSgpOw0KLSAgICAgICAgICAgIFhNTEdyZWdvcmlhbkNhbGVuZGFyW10gcmVxdWVzdCA9IG5ldyBYTUxHcmVnb3JpYW5DYWxlbmRhcltdIHtSUENMaXRJbXBsLmJkYXksIFJQQ0xpdEltcGwuaG9saWRheX07DQotICAgICAgICAgICANCi0gICAgICAgICAgICBYTUxHcmVnb3JpYW5DYWxlbmRhcltdIGNhbHMgID0gcHJveHkudGVzdENhbGVuZGFyTGlzdDEocmVxdWVzdCk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjYWxzLmxlbmd0aCA9PSAyKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGNhbHNbMF0uY29tcGFyZShSUENMaXRJbXBsLmJkYXkpID09IDApOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUoY2Fsc1sxXS5jb21wYXJlKFJQQ0xpdEltcGwuaG9saWRheSkgPT0gMCk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gVHJ5IGEgc2Vjb25kIHRpbWUNCi0gICAgICAgICAgICBjYWxzICA9IHByb3h5LnRlc3RDYWxlbmRhckxpc3QxKHJlcXVlc3QpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUoY2Fscy5sZW5ndGggPT0gMik7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjYWxzWzBdLmNvbXBhcmUoUlBDTGl0SW1wbC5iZGF5KSA9PSAwKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGNhbHNbMV0uY29tcGFyZShSUENMaXRJbXBsLmhvbGlkYXkpID09IDApOw0KLSAgICAgICAgfWNhdGNoKEV4Y2VwdGlvbiBlKXsgDQotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsgDQotICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIHJlY2VpdmVkIiArIGUpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QmlnSW50ZWdlcnMoKSB7DQotICAgICAgICB0cnl7IA0KLSAgICAgICAgICAgIFJQQ0xpdCBwcm94eSA9IGdldFByb3h5KCk7DQotICAgICAgICAgICAgQmlnSW50ZWdlcltdIHJlcXVlc3QgPSBuZXcgQmlnSW50ZWdlcltdIHtSUENMaXRJbXBsLmJpZ0ludDEsIFJQQ0xpdEltcGwuYmlnSW50Mn07DQotICAgICAgICAgICANCi0gICAgICAgICAgICBCaWdJbnRlZ2VyW10gaW50cyAgPSBwcm94eS50ZXN0QmlnSW50ZWdlckxpc3QzKHJlcXVlc3QpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUoaW50cy5sZW5ndGg9PTIpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUoaW50c1swXS5jb21wYXJlVG8oUlBDTGl0SW1wbC5iaWdJbnQxKSA9PSAwKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGludHNbMV0uY29tcGFyZVRvKFJQQ0xpdEltcGwuYmlnSW50MikgPT0gMCk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gVHJ5IGEgc2Vjb25kIHRpbWUNCi0gICAgICAgICAgICBpbnRzICA9IHByb3h5LnRlc3RCaWdJbnRlZ2VyTGlzdDMocmVxdWVzdCk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShpbnRzLmxlbmd0aD09Mik7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShpbnRzWzBdLmNvbXBhcmVUbyhSUENMaXRJbXBsLmJpZ0ludDEpID09IDApOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUoaW50c1sxXS5jb21wYXJlVG8oUlBDTGl0SW1wbC5iaWdJbnQyKSA9PSAwKTsNCi0gICAgICAgIH1jYXRjaChFeGNlcHRpb24gZSl7IA0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7IA0KLSAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiByZWNlaXZlZCIgKyBlKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIHZvaWQgdGVzdExvbmdzKCkgew0KLSAgICAgICAgdHJ5eyANCi0gICAgICAgICAgICBSUENMaXQgcHJveHkgPSBnZXRQcm94eSgpOw0KLSAgICAgICAgICAgIExvbmdbXSByZXF1ZXN0ID0gbmV3IExvbmdbXSB7bmV3IExvbmcoMCksIG5ldyBMb25nKDEpLCBuZXcgTG9uZygyKX07DQotICAgICAgICAgICANCi0gICAgICAgICAgICBMb25nW10gbG9uZ3MgID0gcHJveHkudGVzdExvbmdMaXN0NChyZXF1ZXN0KTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGxvbmdzLmxlbmd0aD09Myk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShsb25nc1swXSA9PSAwKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGxvbmdzWzFdID09IDEpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUobG9uZ3NbMl0gPT0gMik7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gVHJ5IGEgc2Vjb25kIHRpbWUNCi0gICAgICAgICAgICBsb25ncyAgPSBwcm94eS50ZXN0TG9uZ0xpc3Q0KHJlcXVlc3QpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUobG9uZ3MubGVuZ3RoPT0zKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGxvbmdzWzBdID09IDApOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUobG9uZ3NbMV0gPT0gMSk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShsb25nc1syXSA9PSAyKTsNCi0gICAgICAgIH1jYXRjaChFeGNlcHRpb24gZSl7IA0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7IA0KLSAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiByZWNlaXZlZCIgKyBlKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIHZvaWQgdGVzdEVudW1zKCkgew0KLSAgICAgICAgdHJ5eyANCi0gICAgICAgICAgICBSUENMaXQgcHJveHkgPSBnZXRQcm94eSgpOw0KLSAgICAgICAgICAgIEVudW1bXSByZXF1ZXN0ID0gbmV3IEVudW1bXSB7RW51bS5PTkUsIEVudW0uVFdPLCBFbnVtLlRIUkVFfTsNCi0gICAgICAgICAgIA0KLSAgICAgICAgICAgIEVudW1bXSBlbnVtcyAgPSBwcm94eS50ZXN0RW51bUxpc3Q1KHJlcXVlc3QpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZW51bXMubGVuZ3RoPT0zKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGVudW1zWzBdID09IEVudW0uT05FKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGVudW1zWzFdID09IEVudW0uVFdPKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGVudW1zWzJdID09IEVudW0uVEhSRUUpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIFRyeSBhIHNlY29uZCB0aW1lDQotICAgICAgICAgICAgZW51bXMgID0gcHJveHkudGVzdEVudW1MaXN0NShyZXF1ZXN0KTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGVudW1zLmxlbmd0aD09Myk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShlbnVtc1swXSA9PSBFbnVtLk9ORSk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShlbnVtc1sxXSA9PSBFbnVtLlRXTyk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShlbnVtc1syXSA9PSBFbnVtLlRIUkVFKTsNCi0gICAgICAgIH1jYXRjaChFeGNlcHRpb24gZSl7IA0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7IA0KLSAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiByZWNlaXZlZCIgKyBlKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvU09BUDEyUHJveHlUZXN0cy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L1NPQVAxMlByb3h5VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDUyY2M3My4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvU09BUDEyUHJveHlUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJveHk7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLlRlc3RMb2dnZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZnJhbWV3b3JrLkFic3RyYWN0VGVzdENhc2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJveHkuc29hcDEyLkVjaG87DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJveHkuc29hcDEyLlNPQVAxMkVjaG9TZXJ2aWNlOw0KLQ0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOw0KLWltcG9ydCBqYXZheC54bWwud3MuQmluZGluZ1Byb3ZpZGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBBIHN1aXRlIG9mIHRlc3RzIHRvIHRlc3QgZHluYW1pYyBwcm94eSBjbGllbnRzIHNlbmRpbmcgU09BUCAxLjINCi0gKiByZXF1ZXN0cy4gIFRoZSBlbmRwb2ludCBjYW4gYWNjZXB0IGRpZmZlcmVudCBrZXlzIHRvIGRldGVybWluZQ0KLSAqIHdoYXQgaXQgc2hvdWxkIHNlbmQgYmFjay4NCi0gKi8NCi1wdWJsaWMgY2xhc3MgU09BUDEyUHJveHlUZXN0cyBleHRlbmRzIEFic3RyYWN0VGVzdENhc2Ugew0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VORF9TT0FQMTFfUkVTUE9OU0UgPSAiUkVTUE9OU0UtU09BUDExIjsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFTkRfU09BUDEyX1JFU1BPTlNFID0gIlJFU1BPTlNFLVNPQVAxMiI7DQotICAgIFN0cmluZyBheGlzRW5kcG9pbnQgPSAiaHR0cDovL2xvY2FsaG9zdDo2MDYwL2F4aXMyL3NlcnZpY2VzL1NPQVAxMkVjaG9TZXJ2aWNlLkVjaG9Qb3J0IjsNCi0JDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsNCi0gICAgICAgIHJldHVybiBnZXRUZXN0U2V0dXAobmV3IFRlc3RTdWl0ZShTT0FQMTJQcm94eVRlc3RzLmNsYXNzKSk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFNlbmQgYSBTT0FQIDEuMiByZXF1ZXN0IGFuZCBleHBlY3QgYSBTT0FQIDEuMiByZXNwb25zZS4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RTT0FQMTJSZXF1ZXN0U09BUDEyUmVzcG9uc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJ0ZXN0OiAiICsgZ2V0TmFtZSgpKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gY3JlYXRlIHRoZSBwcm94eSBpbnN0YW5jZS4gIHRoZSBXU0RMIHVzZWQgYnkgdGhpcyBwcm94eQ0KLSAgICAgICAgLy8gc2hvdWxkIGhhdmUgYSBwcm9wZXIgU09BUCAxLjIgYmluZGluZyBjb25maWd1cmVkDQotICAgICAgICBTT0FQMTJFY2hvU2VydmljZSBzZXJ2aWNlID0gbmV3IFNPQVAxMkVjaG9TZXJ2aWNlKCk7DQotICAgICAgICBFY2hvIHByb3h5ID0gc2VydmljZS5nZXRQb3J0KG5ldyBRTmFtZSgiaHR0cDovL2pheHdzLmF4aXMyLmFwYWNoZS5vcmcvcHJveHkvc29hcDEyIiwgIkVjaG9Qb3J0IiksIEVjaG8uY2xhc3MpOw0KLSAgICAgICAgQmluZGluZ1Byb3ZpZGVyIHAgPSAoQmluZGluZ1Byb3ZpZGVyKSBwcm94eTsNCi0gICAgICAgIHAuZ2V0UmVxdWVzdENvbnRleHQoKS5wdXQoQmluZGluZ1Byb3ZpZGVyLkVORFBPSU5UX0FERFJFU1NfUFJPUEVSVFksIGF4aXNFbmRwb2ludCk7DQotDQotICAgICAgICAvLyBpbnZva2UgdGhlIHJlbW90ZSBvcGVyYXRpb24uICBzZW5kIGEga2V5IHRoYXQgdGVsbHMgdGhlIA0KLSAgICAgICAgLy8gc2VydmljZSBzZW5kIGJhY2sgYSBTT0FQIDEuMiByZXNwb25zZS4NCi0gICAgICAgIFN0cmluZyByZXNwb25zZSA9IHByb3h5LmVjaG8oU0VORF9TT0FQMTJfUkVTUE9OU0UpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoInJlc3BvbnNlIHJldHVybmVkIFsiICsgcmVzcG9uc2UgKyAiXSIpOw0KLSAgICAgICAgDQotICAgICAgICAvLyB2YWxpZGF0ZSB0aGUgcmVzdWx0cw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXNwb25zZSk7DQotICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZS5lcXVhbHMoIkZBSUwiKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIFRyeSBhIHNlY29uZCB0aW1lDQotICAgICAgICByZXNwb25zZSA9IHByb3h5LmVjaG8oU0VORF9TT0FQMTJfUkVTUE9OU0UpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoInJlc3BvbnNlIHJldHVybmVkIFsiICsgcmVzcG9uc2UgKyAiXSIpOw0KLSAgICAgICAgDQotICAgICAgICAvLyB2YWxpZGF0ZSB0aGUgcmVzdWx0cw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXNwb25zZSk7DQotICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZS5lcXVhbHMoIkZBSUwiKSk7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBTZW5kIGEgU09BUCAxLjIgcmVxdWVzdCwgYnV0IGhhdmUgdGhlIHNlcnZlciBzZW5kIGJhY2sgYSBTT0FQIDEuMQ0KLSAgICAgKiByZXNwb25zZS4gIFRoaXMgc2hvdWxkIHJlc3VsdCBpbiBhbiBleGNlcHRpb24uDQotICAgICAqLw0KLSAgICAvLyBUT0RPIGZpeCBhbmQgcmUtZW5hYmxlDQotICAgIHB1YmxpYyB2b2lkIF90ZXN0U09BUDEyUmVxdWVzdFNPQVAxMVJlc3BvbnNlKCkgew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoInRlc3Q6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBjcmVhdGUgdGhlIHByb3h5IGluc3RhbmNlLiAgdGhlIFdTREwgdXNlZCBieSB0aGlzIHByb3h5DQotICAgICAgICAvLyBzaG91bGQgaGF2ZSBhIHByb3BlciBTT0FQIDEuMiBiaW5kaW5nIGNvbmZpZ3VyZWQNCi0gICAgICAgIFNPQVAxMkVjaG9TZXJ2aWNlIHNlcnZpY2UgPSBuZXcgU09BUDEyRWNob1NlcnZpY2UoKTsNCi0gICAgICAgIEVjaG8gcHJveHkgPSBzZXJ2aWNlLmdldFBvcnQobmV3IFFOYW1lKCJodHRwOi8vamF4d3MuYXhpczIuYXBhY2hlLm9yZy9wcm94eS9zb2FwMTIiLCAiRWNob1BvcnQiKSwgRWNoby5jbGFzcyk7DQotICAgICAgICANCi0gICAgICAgIC8vIGludm9rZSB0aGUgcmVtb3RlIG9wZXJhdGlvbi4gIHNlbmQgYSBrZXkgdGhhdCB0ZWxscyB0aGUgDQotICAgICAgICAvLyBzZXJ2aWNlIHNlbmQgYmFjayBhIFNPQVAgMS4xIHJlc3BvbnNlLiAgdGhpcyBzaG91bGQgcmVzdWx0DQotICAgICAgICAvLyBpbiBhbiBlcnJvci4NCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgU3RyaW5nIHJlc3BvbnNlID0gcHJveHkuZWNobyhTRU5EX1NPQVAxMV9SRVNQT05TRSk7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoInJlc3BvbnNlIHJldHVybmVkIFsiICsgcmVzcG9uc2UgKyAiXSIpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIGlmIHdlJ3ZlIGdvdHRlbiB0aGlzIGZhciwgdGhlbiBzb21ldGhpbmcgd2VudCB3cm9uZy4NCi0gICAgICAgICAgICBmYWlsKCk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoV2ViU2VydmljZUV4Y2VwdGlvbiB3c2UpIHsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24sIGFzIGV4cGVjdGVkIik7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcod3NlLmdldE1lc3NhZ2UoKSk7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIC8vIE5vdyBkbyBpdCBhIHNlY29uZCB0aW1lIHRvIGNvbmZpcm0gdGhlIHNhbWUgYmVoYXZpb3INCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgU3RyaW5nIHJlc3BvbnNlID0gcHJveHkuZWNobyhTRU5EX1NPQVAxMV9SRVNQT05TRSk7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoInJlc3BvbnNlIHJldHVybmVkIFsiICsgcmVzcG9uc2UgKyAiXSIpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIGlmIHdlJ3ZlIGdvdHRlbiB0aGlzIGZhciwgdGhlbiBzb21ldGhpbmcgd2VudCB3cm9uZy4NCi0gICAgICAgICAgICBmYWlsKCk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoV2ViU2VydmljZUV4Y2VwdGlvbiB3c2UpIHsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24sIGFzIGV4cGVjdGVkIik7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcod3NlLmdldE1lc3NhZ2UoKSk7DQotICAgICAgICB9DQotICAgIH0gDQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0KCkgew0KLSAgICAgICAgLy8gTk9PUA0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9kb2NsaXRub253cmFwcGVkL0RvY0xpdG5vbldyYXBwZWRJbXBsLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvZG9jbGl0bm9ud3JhcHBlZC9Eb2NMaXRub25XcmFwcGVkSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTRjNDExLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9kb2NsaXRub253cmFwcGVkL0RvY0xpdG5vbldyYXBwZWRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnByb3h5LmRvY2xpdG5vbndyYXBwZWQ7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuVGVzdExvZ2dlcjsNCi0NCi1pbXBvcnQgamF2YXgueG1sLndzLkJpbmRpbmdUeXBlOw0KLWltcG9ydCBqYXZheC54bWwud3MuUHJvdmlkZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlUHJvdmlkZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5odHRwLkhUVFBCaW5kaW5nOw0KLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5TT0FQQmluZGluZzsNCi0NCi1AV2ViU2VydmljZVByb3ZpZGVyKA0KLSAgICAgICAgc2VydmljZU5hbWU9IlByb3h5RG9jTGl0VW53cmFwcGVkU2VydmljZSIsIA0KLSAgICAgICAgd3NkbExvY2F0aW9uPSJNRVRBLUlORi9wcm94eV9kb2NsaXRfdW53ci53c2RsIiwgDQotICAgICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9kb2NsaXRub253cmFwcGVkLnByb3h5LnRlc3Qub3JnIikNCi1AQmluZGluZ1R5cGUoU09BUEJpbmRpbmcuU09BUDExSFRUUF9CSU5ESU5HKQ0KLXB1YmxpYyBjbGFzcyBEb2NMaXRub25XcmFwcGVkSW1wbCBpbXBsZW1lbnRzIFByb3ZpZGVyPFN0cmluZz4gew0KLQ0KLQkNCi0JcHVibGljIERvY0xpdG5vbldyYXBwZWRJbXBsKCkgew0KLQkJc3VwZXIoKTsNCi0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1Yg0KLQl9DQotDQotICAgIC8qIChub24tSmF2YWRvYykNCi0gICAgICogQHNlZSBqYXZheC54bWwud3MuUHJvdmlkZXIjaW52b2tlKFQpDQotICAgICAqLw0KLSAgICBwdWJsaWMgU3RyaW5nIGludm9rZShTdHJpbmcgaW52b2tlX3N0cikgew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIkVuZCBwb2ludCBjYWxsZWQgd2l0aCBTdHJpbmcgdmFsdWUgPSIgKyBpbnZva2Vfc3RyKTsNCi0gICAgICAgIGlmIChpbnZva2Vfc3RyLmNvbnRhaW5zKCJuaWwiKSkgew0KLSAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKCI8bnMyOlJldHVyblR5cGUgeHNpOm5pbD0ndHJ1ZScgeG1sbnM6eHNpPSdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZScgeG1sbnM6bnMyPVwiaHR0cDovL2RvY2xpdG5vbndyYXBwZWQucHJveHkudGVzdC5vcmdcIi8+Iik7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKCI8bnMyOlJldHVyblR5cGUgeG1sbnM6bnMyPVwiaHR0cDovL2RvY2xpdG5vbndyYXBwZWQucHJveHkudGVzdC5vcmdcIj48cmV0dXJuX3N0cj5zb21lIHJlc3BvbnNlPC9yZXR1cm5fc3RyPjwvbnMyOlJldHVyblR5cGU+Iik7DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2RvY2xpdG5vbndyYXBwZWQvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvZG9jbGl0bm9ud3JhcHBlZC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY0YjU2OC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvZG9jbGl0bm9ud3JhcHBlZC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMA0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9kb2NsaXRub253cmFwcGVkL01FVEEtSU5GL3Byb3h5X2RvY2xpdF91bndyLndzZGwgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvZG9jbGl0bm9ud3JhcHBlZC9NRVRBLUlORi9wcm94eV9kb2NsaXRfdW53ci53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTg5NzkzLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9kb2NsaXRub253cmFwcGVkL01FVEEtSU5GL3Byb3h5X2RvY2xpdF91bndyLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08IS0tDQotCVRoaXMgaXMgYSBjb3B5IG9mIHByb3h5X2RvY2xpdHdyLndzZGwuIFNlcnZpY2UgYW5kIHBvcnQgbmFtZXMNCi0JaGF2ZSBiZWVuIGNobmFnZWQgdG8gYmUgQWxwaGEgY29tcGF0aWJsZSBhbmQgZW5kcG9pbnQgYWRkcmVzcw0KLQloYXMgYmVlbiBjaGFuZ2VkDQotLS0+DQotPHdzZGw6ZGVmaW5pdGlvbnMgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iDQotCXhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iDQotCXhtbG5zOnRucz0iaHR0cDovL2RvY2xpdG5vbndyYXBwZWQucHJveHkudGVzdC5vcmciDQotCXhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9InByb3h5Ig0KLQl0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9kb2NsaXRub253cmFwcGVkLnByb3h5LnRlc3Qub3JnIj4NCi0JDQotCTx3c2RsOnR5cGVzPg0KLQkJPHhzZDpzY2hlbWENCi0JCQl0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9kb2NsaXRub253cmFwcGVkLnByb3h5LnRlc3Qub3JnIg0KLQkJCXhtbG5zOnRucz0iaHR0cDovL2RvY2xpdG5vbndyYXBwZWQucHJveHkudGVzdC5vcmciDQotCQkJeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+DQotDQotCQkJPHhzZDplbGVtZW50IG5hbWU9Ik15RmF1bHQiIHR5cGU9InhzZDpzdHJpbmciIC8+DQotCQkJDQotCQkJDQotCQkJDQotCQkJPHhzZDplbGVtZW50IG5hbWU9Imludm9rZSIgbmlsbGFibGU9InRydWUiPg0KLQkJCQk8eHNkOmNvbXBsZXhUeXBlPg0KLQkJCQkJPHhzZDpzZXF1ZW5jZT4NCi0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iaW52b2tlX3N0ciIgdHlwZT0ieHNkOnN0cmluZyIgLz4NCi0JCQkJCTwveHNkOnNlcXVlbmNlPg0KLQkJCQk8L3hzZDpjb21wbGV4VHlwZT4NCi0JCQk8L3hzZDplbGVtZW50PgkJCQ0KLQkJCQ0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSZXR1cm5UeXBlIiBuaWxsYWJsZT0idHJ1ZSI+DQotCQkJCTx4c2Q6Y29tcGxleFR5cGU+DQotCQkJCQk8eHNkOnNlcXVlbmNlPg0KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJyZXR1cm5fc3RyIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPg0KLQkJCQkJPC94c2Q6c2VxdWVuY2U+DQotCQkJCTwveHNkOmNvbXBsZXhUeXBlPg0KLQkJCTwveHNkOmVsZW1lbnQ+CQkJCQ0KLQ0KLQkJPC94c2Q6c2NoZW1hPg0KLQk8L3dzZGw6dHlwZXM+DQotDQotCQ0KLQkNCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJpbnZva2VSZXF1ZXN0Ij4NCi0JCTx3c2RsOnBhcnQgbmFtZT0iYWxsQnlNeXNlbGYiIGVsZW1lbnQ9InRuczppbnZva2UiIC8+DQotCTwvd3NkbDptZXNzYWdlPg0KLQ0KLQk8d3NkbDptZXNzYWdlIG5hbWU9Imludm9rZVJlc3BvbnNlIj4NCi0JCTx3c2RsOnBhcnQgbmFtZT0iYWxsQnlNeXNlbGYiIGVsZW1lbnQ9InRuczpSZXR1cm5UeXBlIiAvPg0KLQk8L3dzZGw6bWVzc2FnZT4JDQotCQ0KLQk8d3NkbDpwb3J0VHlwZSBuYW1lPSJEb2NMaXRub25XcmFwcGVkUHJveHkiPg0KLQ0KLQkJDQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iaW52b2tlIj4NCi0JCQk8d3NkbDppbnB1dCBtZXNzYWdlPSJ0bnM6aW52b2tlUmVxdWVzdCIgLz4NCi0JCQk8d3NkbDpvdXRwdXQgbWVzc2FnZT0idG5zOmludm9rZVJlc3BvbnNlIiAvPg0KLQkJPC93c2RsOm9wZXJhdGlvbj4JCQ0KLQkJCQ0KLQk8L3dzZGw6cG9ydFR5cGU+DQotCQ0KLQk8d3NkbDpiaW5kaW5nIG5hbWU9IlByb3h5RG9jTGl0bm9uV3JhcHBlZCIgdHlwZT0idG5zOkRvY0xpdG5vbldyYXBwZWRQcm94eSI+DQotCQk8c29hcDpiaW5kaW5nIHN0eWxlPSJkb2N1bWVudCIgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiIC8+CQkNCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJpbnZva2UiPg0KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vZG9jbGl0bm9ud3JhcHBlZC5wcm94eS50ZXN0Lm9yZy9pbnZva2VSZXR1cm4iIC8+DQotCQkJPHdzZGw6aW5wdXQ+DQotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAgLz4NCi0JCQk8L3dzZGw6aW5wdXQ+DQotCQkJPHdzZGw6b3V0cHV0Pg0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgIC8+DQotCQkJPC93c2RsOm91dHB1dD4NCi0JDQotCQk8L3dzZGw6b3BlcmF0aW9uPgkJDQotCQ0KLQk8L3dzZGw6YmluZGluZz4NCi0JDQotCTx3c2RsOnNlcnZpY2UgbmFtZT0iUHJveHlEb2NMaXRVbndyYXBwZWRTZXJ2aWNlIj4NCi0JCTx3c2RsOnBvcnQgYmluZGluZz0idG5zOlByb3h5RG9jTGl0bm9uV3JhcHBlZCIgbmFtZT0iRG9jTGl0bm9uV3JhcHBlZEltcGxQb3J0Ij4NCi0JCQk8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vQEhPU1RAOkBQT1JUQC9qYXh3cy5wcm94eS9zZXJ2aWNlcy9Qcm94eURvY0xpdFVud3JhcHBlZFNlcnZpY2UiIC8+DQotCQk8L3dzZGw6cG9ydD4NCi0JPC93c2RsOnNlcnZpY2U+DQotCQ0KLTwvd3NkbDpkZWZpbml0aW9ucz4NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvZG9jbGl0bm9ud3JhcHBlZC9zZWkvRG9jTGl0bm9uV3JhcHBlZFByb3h5LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvZG9jbGl0bm9ud3JhcHBlZC9zZWkvRG9jTGl0bm9uV3JhcHBlZFByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmNTZlYmYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2RvY2xpdG5vbndyYXBwZWQvc2VpL0RvY0xpdG5vbldyYXBwZWRQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotDQotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm94eS5kb2NsaXRub253cmFwcGVkLnNlaTsNCi0NCi1pbXBvcnQgb3JnLnRlc3QucHJveHkuZG9jbGl0bm9ud3JhcHBlZC5JbnZva2U7DQotaW1wb3J0IG9yZy50ZXN0LnByb3h5LmRvY2xpdG5vbndyYXBwZWQuUmV0dXJuVHlwZTsNCi0NCi1pbXBvcnQgamF2YXguandzLldlYk1ldGhvZDsNCi1pbXBvcnQgamF2YXguandzLldlYlBhcmFtOw0KLWltcG9ydCBqYXZheC5qd3MuV2ViUmVzdWx0Ow0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsNCi1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmc7DQotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlBhcmFtZXRlclN0eWxlOw0KLWltcG9ydCBqYXZheC54bWwud3MuQXN5bmNIYW5kbGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuUmVzcG9uc2U7DQotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTsNCi0NCi0NCi0vKioNCi0gKiBUaGlzIGNsYXNzIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIEpBWFdTIFNJLg0KLSAqIEpBWC1XUyBSSSAyLjBfMDEtYjE1LWZjcw0KLSAqIEdlbmVyYXRlZCBzb3VyY2UgdmVyc2lvbjogMi4wDQotICogDQotICovDQotQFdlYlNlcnZpY2UobmFtZSA9ICJEb2NMaXRub25XcmFwcGVkUHJveHkiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL2RvY2xpdG5vbndyYXBwZWQucHJveHkudGVzdC5vcmciKQ0KLUBTT0FQQmluZGluZyhwYXJhbWV0ZXJTdHlsZSA9IFBhcmFtZXRlclN0eWxlLkJBUkUpDQotcHVibGljIGludGVyZmFjZSBEb2NMaXRub25XcmFwcGVkUHJveHkgew0KLQkvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSBhbGxCeU15c2VsZg0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIGphdmF4LnhtbC53cy5SZXNwb25zZTxvcmcudGVzdC5wcm94eS5kb2NsaXRub253cmFwcGVkLlJldHVyblR5cGU+DQotICAgICAqLw0KLSAgICBAV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWUgPSAiaW52b2tlIiwgYWN0aW9uID0gImh0dHA6Ly9kb2NsaXRub253cmFwcGVkLnByb3h5LnRlc3Qub3JnL2ludm9rZVJldHVybiIpDQotICAgIHB1YmxpYyBSZXNwb25zZTxSZXR1cm5UeXBlPiBpbnZva2VBc3luYygNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImludm9rZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vZG9jbGl0bm9ud3JhcHBlZC5wcm94eS50ZXN0Lm9yZyIsIHBhcnROYW1lID0gImFsbEJ5TXlzZWxmIikNCi0gICAgICAgIEludm9rZSBhbGxCeU15c2VsZik7DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGFsbEJ5TXlzZWxmDQotICAgICAqIEBwYXJhbSBhc3luY0hhbmRsZXINCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU8PyBleHRlbmRzIGphdmEubGFuZy5PYmplY3Q+DQotICAgICAqLw0KLSAgICBAV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWUgPSAiaW52b2tlIiwgYWN0aW9uID0gImh0dHA6Ly9kb2NsaXRub253cmFwcGVkLnByb3h5LnRlc3Qub3JnL2ludm9rZVJldHVybiIpDQotICAgIHB1YmxpYyBGdXR1cmU8Pz4gaW52b2tlQXN5bmMoDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJpbnZva2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL2RvY2xpdG5vbndyYXBwZWQucHJveHkudGVzdC5vcmciLCBwYXJ0TmFtZSA9ICJhbGxCeU15c2VsZiIpDQotICAgICAgICBJbnZva2UgYWxsQnlNeXNlbGYsDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJpbnZva2VSZXNwb25zZSIsIHRhcmdldE5hbWVzcGFjZSA9ICIiLCBwYXJ0TmFtZSA9ICJhc3luY0hhbmRsZXIiKQ0KLSAgICAgICAgQXN5bmNIYW5kbGVyPFJldHVyblR5cGU+IGFzeW5jSGFuZGxlcik7DQotDQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGFsbEJ5TXlzZWxmDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgb3JnLnRlc3QucHJveHkuZG9jbGl0bm9ud3JhcHBlZC5SZXR1cm5UeXBlDQotICAgICAqLw0KLSAgICBAV2ViTWV0aG9kKGFjdGlvbiA9ICJodHRwOi8vZG9jbGl0bm9ud3JhcHBlZC5wcm94eS50ZXN0Lm9yZy9pbnZva2VSZXR1cm4iKQ0KLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAiUmV0dXJuVHlwZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vZG9jbGl0bm9ud3JhcHBlZC5wcm94eS50ZXN0Lm9yZyIsIHBhcnROYW1lID0gImFsbEJ5TXlzZWxmIikNCi0gICAgcHVibGljIFJldHVyblR5cGUgaW52b2tlKA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiaW52b2tlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9kb2NsaXRub253cmFwcGVkLnByb3h5LnRlc3Qub3JnIiwgcGFydE5hbWUgPSAiYWxsQnlNeXNlbGYiKQ0KLSAgICAgICAgSW52b2tlIGFsbEJ5TXlzZWxmKTsNCi0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2RvY2xpdG5vbndyYXBwZWQvc2VpL1Byb3h5RG9jTGl0VW53cmFwcGVkU2VydmljZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2RvY2xpdG5vbndyYXBwZWQvc2VpL1Byb3h5RG9jTGl0VW53cmFwcGVkU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzcyYTllLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9kb2NsaXRub253cmFwcGVkL3NlaS9Qcm94eURvY0xpdFVud3JhcHBlZFNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLQ0KLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJveHkuZG9jbGl0bm9ud3JhcHBlZC5zZWk7DQotDQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViRW5kcG9pbnQ7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlQ2xpZW50Ow0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247DQotaW1wb3J0IGphdmEubmV0LlVSTDsNCi0NCi0vKioNCi0gKiBUaGlzIGNsYXNzIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIEpBWFdTIFNJLg0KLSAqIEpBWC1XUyBSSSAyLjBfMDEtYjE1LWZjcw0KLSAqIEdlbmVyYXRlZCBzb3VyY2UgdmVyc2lvbjogMi4wDQotICogDQotICovDQotQFdlYlNlcnZpY2VDbGllbnQobmFtZSA9ICJQcm94eURvY0xpdFVud3JhcHBlZFNlcnZpY2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL2RvY2xpdG5vbndyYXBwZWQucHJveHkudGVzdC5vcmciLCB3c2RsTG9jYXRpb24gPSAicHJveHlfZG9jbGl0X3Vud3Iud3NkbCIpDQotcHVibGljIGNsYXNzIFByb3h5RG9jTGl0VW53cmFwcGVkU2VydmljZQ0KLSAgICBleHRlbmRzIFNlcnZpY2UNCi17DQotDQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFVSTCBQUk9YWURPQ0xJVFVOV1JBUFBFRFNFUlZJQ0VfV1NETF9MT0NBVElPTjsNCi0NCi0gICAgc3RhdGljIHsNCi0gICAgICAgIFVSTCB1cmwgPSBudWxsOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICB1cmwgPSBuZXcgVVJMKCJmaWxlOi9DOi90ZW1wL3Byb3h5X2RvY2xpdF91bndyLndzZGwiKTsNCi0gICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIFBST1hZRE9DTElUVU5XUkFQUEVEU0VSVklDRV9XU0RMX0xPQ0FUSU9OID0gdXJsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBQcm94eURvY0xpdFVud3JhcHBlZFNlcnZpY2UoVVJMIHdzZGxMb2NhdGlvbiwgUU5hbWUgc2VydmljZU5hbWUpIHsNCi0gICAgICAgIHN1cGVyKHdzZGxMb2NhdGlvbiwgc2VydmljZU5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBQcm94eURvY0xpdFVud3JhcHBlZFNlcnZpY2UoKSB7DQotICAgICAgICBzdXBlcihQUk9YWURPQ0xJVFVOV1JBUFBFRFNFUlZJQ0VfV1NETF9MT0NBVElPTiwgbmV3IFFOYW1lKCJodHRwOi8vZG9jbGl0bm9ud3JhcHBlZC5wcm94eS50ZXN0Lm9yZyIsICJQcm94eURvY0xpdFVud3JhcHBlZFNlcnZpY2UiKSk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIERvY0xpdG5vbldyYXBwZWRQcm94eQ0KLSAgICAgKi8NCi0gICAgQFdlYkVuZHBvaW50KG5hbWUgPSAiUHJveHlEb2NMaXRub25XcmFwcGVkUG9ydCIpDQotICAgIHB1YmxpYyBEb2NMaXRub25XcmFwcGVkUHJveHkgZ2V0UHJveHlEb2NMaXRub25XcmFwcGVkUG9ydCgpIHsNCi0gICAgICAgIHJldHVybiAoRG9jTGl0bm9uV3JhcHBlZFByb3h5KXN1cGVyLmdldFBvcnQobmV3IFFOYW1lKCJodHRwOi8vZG9jbGl0bm9ud3JhcHBlZC5wcm94eS50ZXN0Lm9yZyIsICJQcm94eURvY0xpdG5vbldyYXBwZWRQb3J0IiksIERvY0xpdG5vbldyYXBwZWRQcm94eS5jbGFzcyk7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2RvY2xpdHdyYXBwZWQvRG9jTGl0V3JhcHBlZFByb3h5SW1wbC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2RvY2xpdHdyYXBwZWQvRG9jTGl0V3JhcHBlZFByb3h5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjBmMDkwLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9kb2NsaXR3cmFwcGVkL0RvY0xpdFdyYXBwZWRQcm94eUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJveHkuZG9jbGl0d3JhcHBlZDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5UZXN0TG9nZ2VyOw0KLQ0KLWltcG9ydCBqYXZheC54bWwud3MuQmluZGluZ1R5cGU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5Qcm92aWRlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VQcm92aWRlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLmh0dHAuSFRUUEJpbmRpbmc7DQotaW1wb3J0IGphdmF4LnhtbC53cy5zb2FwLlNPQVBCaW5kaW5nOw0KLUBXZWJTZXJ2aWNlUHJvdmlkZXIoDQotICAgICAgICBzZXJ2aWNlTmFtZT0iUHJveHlEb2NMaXRXcmFwcGVkU2VydmljZSIsIA0KLSAgICAgICAgd3NkbExvY2F0aW9uPSJNRVRBLUlORi9Qcm94eURvY0xpdFdyYXBwZWQud3NkbCIsIA0KLSAgICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vZG9jbGl0d3JhcHBlZC5wcm94eS50ZXN0Lm9yZyIpDQotQEJpbmRpbmdUeXBlKFNPQVBCaW5kaW5nLlNPQVAxMUhUVFBfQklORElORykNCi1wdWJsaWMgY2xhc3MgRG9jTGl0V3JhcHBlZFByb3h5SW1wbCBpbXBsZW1lbnRzIFByb3ZpZGVyPFN0cmluZz4gew0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGludm9rZShTdHJpbmcgaW52b2tlX3N0cikgew0KLSAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1Yg0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIkVuZCBwb2ludCBjYWxsZWQgd2l0aCBTdHJpbmcgdmFsdWUgPSIgKyBpbnZva2Vfc3RyKTsNCi0gICAgICAgIHJldHVybiBuZXcgU3RyaW5nKCI8bnMyOlJldHVyblR5cGUgeG1sbnM6bnMyPVwiaHR0cDovL2RvY2xpdHdyYXBwZWQucHJveHkudGVzdC5vcmdcIj48cmV0dXJuX3N0cj5zb21lIHJlc3BvbnNlPC9yZXR1cm5fc3RyPjwvbnMyOlJldHVyblR5cGU+Iik7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2RvY2xpdHdyYXBwZWQvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvZG9jbGl0d3JhcHBlZC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY0YjU2OC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvZG9jbGl0d3JhcHBlZC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMA0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9kb2NsaXR3cmFwcGVkL01FVEEtSU5GL1Byb3h5RG9jTGl0V3JhcHBlZC53c2RsIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2RvY2xpdHdyYXBwZWQvTUVUQS1JTkYvUHJveHlEb2NMaXRXcmFwcGVkLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwOWJiY2MuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2RvY2xpdHdyYXBwZWQvTUVUQS1JTkYvUHJveHlEb2NMaXRXcmFwcGVkLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSwzMDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi0NCi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08d3NkbDpkZWZpbml0aW9ucyB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyINCi0JeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyINCi0JeG1sbnM6dG5zPSJodHRwOi8vZG9jbGl0d3JhcHBlZC5wcm94eS50ZXN0Lm9yZyINCi0JeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0icHJveHkiDQotCXRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2RvY2xpdHdyYXBwZWQucHJveHkudGVzdC5vcmciPg0KLQ0KLQk8d3NkbDp0eXBlcz4NCi0JCTx4c2Q6c2NoZW1hDQotCQkJdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vZG9jbGl0d3JhcHBlZC5wcm94eS50ZXN0Lm9yZyINCi0JCQl4bWxuczp0bnM9Imh0dHA6Ly9kb2NsaXR3cmFwcGVkLnByb3h5LnRlc3Qub3JnIg0KLQkJCXhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPg0KLQ0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJNeUZhdWx0IiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPg0KLQ0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJvbmVXYXlWb2lkIj4NCi0JCQkJPHhzZDpjb21wbGV4VHlwZT4NCi0JCQkJCTx4c2Q6c2VxdWVuY2UgLz4NCi0JCQkJPC94c2Q6Y29tcGxleFR5cGU+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+DQotDQotCQk8L3hzZDpzY2hlbWE+DQotCTwvd3NkbDp0eXBlcz4NCi0NCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJvbmVXYXlWb2lkUmVxdWVzdCI+DQotCQk8d3NkbDpwYXJ0IG5hbWU9ImFsbEJ5TXlzZWxmIiBlbGVtZW50PSJ0bnM6b25lV2F5Vm9pZCIgLz4NCi0JPC93c2RsOm1lc3NhZ2U+DQotDQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0ib25lV2F5UmVxdWVzdCI+DQotCQk8d3NkbDpwYXJ0IG5hbWU9ImFsbEJ5TXlzZWxmIiBlbGVtZW50PSJ0bnM6b25lV2F5IiAvPg0KLQk8L3dzZGw6bWVzc2FnZT4NCi0NCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJ0d29XYXlIb2xkZXJSZXF1ZXN0Ij4NCi0JCTx3c2RsOnBhcnQgbmFtZT0iYWxsQnlNeXNlbGYiIGVsZW1lbnQ9InRuczp0d29XYXlIb2xkZXIiIC8+DQotCTwvd3NkbDptZXNzYWdlPg0KLQ0KLQk8d3NkbDptZXNzYWdlIG5hbWU9InR3b1dheUhvbGRlclJlc3BvbnNlIj4NCi0JCTx3c2RsOnBhcnQgbmFtZT0iYWxsQnlNeXNlbGYiIGVsZW1lbnQ9InRuczp0d29XYXlIb2xkZXIiIC8+DQotCTwvd3NkbDptZXNzYWdlPg0KLQ0KLQk8d3NkbDptZXNzYWdlIG5hbWU9InR3b1dheVJlcXVlc3QiPg0KLQkJPHdzZGw6cGFydCBuYW1lPSJhbGxCeU15c2VsZiIgZWxlbWVudD0idG5zOnR3b1dheSIgLz4NCi0JPC93c2RsOm1lc3NhZ2U+DQotDQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0idHdvV2F5UmVzcG9uc2UiPg0KLQkJPHdzZGw6cGFydCBuYW1lPSJhbGxCeU15c2VsZiIgZWxlbWVudD0idG5zOlJldHVyblR5cGUiIC8+DQotCTwvd3NkbDptZXNzYWdlPg0KLQ0KLQk8d3NkbDptZXNzYWdlIG5hbWU9Imludm9rZVJlcXVlc3QiPg0KLQkJPHdzZGw6cGFydCBuYW1lPSJhbGxCeU15c2VsZiIgZWxlbWVudD0idG5zOmludm9rZSIgLz4NCi0JPC93c2RsOm1lc3NhZ2U+DQotDQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0iaW52b2tlUmVzcG9uc2UiPg0KLQkJPHdzZGw6cGFydCBuYW1lPSJhbGxCeU15c2VsZiIgZWxlbWVudD0idG5zOlJldHVyblR5cGUiIC8+DQotCTwvd3NkbDptZXNzYWdlPg0KLQ0KLQk8d3NkbDptZXNzYWdlIG5hbWU9ImZpbk9wUmVxdWVzdCI+DQotCQk8d3NkbDpwYXJ0IG5hbWU9Im9wIiBlbGVtZW50PSJ0bnM6ZmluT3AiIC8+DQotCTwvd3NkbDptZXNzYWdlPg0KLQ0KLQk8d3NkbDptZXNzYWdlIG5hbWU9ImZpbk9wUmVzcG9uc2UiPg0KLQkJPHdzZGw6cGFydCBuYW1lPSJvcCIgZWxlbWVudD0idG5zOmZpbk9wUmVzcG9uc2UiIC8+DQotCTwvd3NkbDptZXNzYWdlPg0KLQ0KLQk8d3NkbDpwb3J0VHlwZSBuYW1lPSJEb2NMaXRXcmFwcGVkUHJveHkiPg0KLQ0KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9Im9uZVdheVZvaWQiPg0KLQkJCTx3c2RsOmlucHV0IG1lc3NhZ2U9InRuczpvbmVXYXlWb2lkUmVxdWVzdCIgLz4NCi0JCTwvd3NkbDpvcGVyYXRpb24+DQotDQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0ib25lV2F5Ij4NCi0JCQk8d3NkbDppbnB1dCBtZXNzYWdlPSJ0bnM6b25lV2F5UmVxdWVzdCIgLz4NCi0JCTwvd3NkbDpvcGVyYXRpb24+DQotDQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0idHdvV2F5SG9sZGVyIj4NCi0JCQk8d3NkbDppbnB1dCBtZXNzYWdlPSJ0bnM6dHdvV2F5SG9sZGVyUmVxdWVzdCIgLz4NCi0JCQk8d3NkbDpvdXRwdXQgbWVzc2FnZT0idG5zOnR3b1dheUhvbGRlclJlc3BvbnNlIiAvPg0KLQkJPC93c2RsOm9wZXJhdGlvbj4NCi0NCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJ0d29XYXkiPg0KLQkJCTx3c2RsOmlucHV0IG1lc3NhZ2U9InRuczp0d29XYXlSZXF1ZXN0IiAvPg0KLQkJCTx3c2RsOm91dHB1dCBtZXNzYWdlPSJ0bnM6dHdvV2F5UmVzcG9uc2UiIC8+DQotCQk8L3dzZGw6b3BlcmF0aW9uPg0KLQkJDQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iaW52b2tlIj4NCi0JCQk8d3NkbDppbnB1dCBtZXNzYWdlPSJ0bnM6aW52b2tlUmVxdWVzdCIgLz4NCi0JCQk8d3NkbDpvdXRwdXQgbWVzc2FnZT0idG5zOmludm9rZVJlc3BvbnNlIiAvPg0KLQkJPC93c2RsOm9wZXJhdGlvbj4NCi0JCQ0KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImZpbk9wIj4NCi0JCQk8d3NkbDppbnB1dCBtZXNzYWdlPSJ0bnM6ZmluT3BSZXF1ZXN0IiAvPg0KLQkJCTx3c2RsOm91dHB1dCBtZXNzYWdlPSJ0bnM6ZmluT3BSZXNwb25zZSIgLz4NCi0JCTwvd3NkbDpvcGVyYXRpb24+DQotDQotCTwvd3NkbDpwb3J0VHlwZT4NCi0NCi0JPHdzZGw6YmluZGluZyBuYW1lPSJQcm94eURvY0xpdFdyYXBwZWQiDQotCQl0eXBlPSJ0bnM6RG9jTGl0V3JhcHBlZFByb3h5Ij4NCi0JCTxzb2FwOmJpbmRpbmcgc3R5bGU9ImRvY3VtZW50Ig0KLQkJCXRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIiAvPg0KLQ0KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9Im9uZVdheVZvaWQiPg0KLQkJCTxzb2FwOm9wZXJhdGlvbg0KLQkJCQlzb2FwQWN0aW9uPSJodHRwOi8vZG9jbGl0d3JhcHBlZC5wcm94eS50ZXN0Lm9yZy90d29XYXlSZXR1cm4iIC8+DQotCQkJPHdzZGw6aW5wdXQ+DQotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPg0KLQkJCTwvd3NkbDppbnB1dD4NCi0JCTwvd3NkbDpvcGVyYXRpb24+DQotDQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0ib25lV2F5Ij4NCi0JCQk8c29hcDpvcGVyYXRpb24NCi0JCQkJc29hcEFjdGlvbj0iaHR0cDovL2RvY2xpdHdyYXBwZWQucHJveHkudGVzdC5vcmcvdHdvV2F5UmV0dXJuIiAvPg0KLQkJCTx3c2RsOmlucHV0Pg0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0JCQk8L3dzZGw6aW5wdXQ+DQotCQk8L3dzZGw6b3BlcmF0aW9uPg0KLQ0KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9InR3b1dheUhvbGRlciI+DQotCQkJPHNvYXA6b3BlcmF0aW9uDQotCQkJCXNvYXBBY3Rpb249Imh0dHA6Ly9kb2NsaXR3cmFwcGVkLnByb3h5LnRlc3Qub3JnL3R3b1dheVJldHVybiIgLz4NCi0JCQk8d3NkbDppbnB1dD4NCi0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+DQotCQkJPC93c2RsOmlucHV0Pg0KLQkJCTx3c2RsOm91dHB1dD4NCi0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+DQotCQkJPC93c2RsOm91dHB1dD4NCi0NCi0JCTwvd3NkbDpvcGVyYXRpb24+DQotDQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0idHdvV2F5Ij4NCi0JCQk8c29hcDpvcGVyYXRpb24NCi0JCQkJc29hcEFjdGlvbj0iaHR0cDovL2RvY2xpdHdyYXBwZWQucHJveHkudGVzdC5vcmcvdHdvV2F5UmV0dXJuIiAvPg0KLQkJCTx3c2RsOmlucHV0Pg0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0JCQk8L3dzZGw6aW5wdXQ+DQotCQkJPHdzZGw6b3V0cHV0Pg0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0JCQk8L3dzZGw6b3V0cHV0Pg0KLQ0KLQkJPC93c2RsOm9wZXJhdGlvbj4NCi0JCQ0KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9Imludm9rZSI+DQotCQkJPHNvYXA6b3BlcmF0aW9uDQotCQkJCXNvYXBBY3Rpb249Imh0dHA6Ly9kb2NsaXR3cmFwcGVkLnByb3h5LnRlc3Qub3JnL3R3b1dheVJldHVybiIgLz4NCi0JCQk8d3NkbDppbnB1dD4NCi0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+DQotCQkJPC93c2RsOmlucHV0Pg0KLQkJCTx3c2RsOm91dHB1dD4NCi0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+DQotCQkJPC93c2RsOm91dHB1dD4NCi0NCi0JCTwvd3NkbDpvcGVyYXRpb24+DQotCQkNCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJmaW5PcCI+DQotCQkJPHNvYXA6b3BlcmF0aW9uDQotCQkJCXNvYXBBY3Rpb249Imh0dHA6Ly9kb2NsaXR3cmFwcGVkLnByb3h5LnRlc3Qub3JnL2Zpbk9wIiAvPg0KLQkJCTx3c2RsOmlucHV0Pg0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0JCQk8L3dzZGw6aW5wdXQ+DQotCQkJPHdzZGw6b3V0cHV0Pg0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0JCQk8L3dzZGw6b3V0cHV0Pg0KLQ0KLQkJPC93c2RsOm9wZXJhdGlvbj4NCi0NCi0JPC93c2RsOmJpbmRpbmc+DQotDQotCTx3c2RsOnNlcnZpY2UgbmFtZT0iUHJveHlEb2NMaXRXcmFwcGVkU2VydmljZSI+DQotCQk8d3NkbDpwb3J0IGJpbmRpbmc9InRuczpQcm94eURvY0xpdFdyYXBwZWQiDQotCQkJbmFtZT0iRG9jTGl0V3JhcHBlZFByb3h5SW1wbFBvcnQiPg0KLQkJCTxzb2FwOmFkZHJlc3MNCi0JCQkJbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6OTA4MC9heGlzMi9zZXJ2aWNlcy9Qcm94eURvY0xpdFdyYXBwZWRTZXJ2aWNlL2ludm9rZSIgLz4NCi0JCTwvd3NkbDpwb3J0Pg0KLQk8L3dzZGw6c2VydmljZT4NCi0NCi08L3dzZGw6ZGVmaW5pdGlvbnM+DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2RvY2xpdHdyYXBwZWQvc2VpL0RvY0xpdFdyYXBwZWRQcm94eS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2RvY2xpdHdyYXBwZWQvc2VpL0RvY0xpdFdyYXBwZWRQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzY0OTFlLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9kb2NsaXR3cmFwcGVkL3NlaS9Eb2NMaXRXcmFwcGVkUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0OSArMCwwIEBACi0NCi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnByb3h5LmRvY2xpdHdyYXBwZWQuc2VpOw0KLQ0KLWltcG9ydCBvcmcudGVzdC5wcm94eS5kb2NsaXR3cmFwcGVkLkZpbk9wUmVzcG9uc2U7DQotaW1wb3J0IG9yZy50ZXN0LnByb3h5LmRvY2xpdHdyYXBwZWQuRmluYW5jaWFsT3BlcmF0aW9uOw0KLWltcG9ydCBvcmcudGVzdC5wcm94eS5kb2NsaXR3cmFwcGVkLlJldHVyblR5cGU7DQotaW1wb3J0IG9yZy50ZXN0LnByb3h5LmRvY2xpdHdyYXBwZWQuVHdvV2F5SG9sZGVyOw0KLQ0KLWltcG9ydCBqYXZheC5qd3MuT25ld2F5Ow0KLWltcG9ydCBqYXZheC5qd3MuV2ViTWV0aG9kOw0KLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW07DQotaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbS5Nb2RlOw0KLWltcG9ydCBqYXZheC5qd3MuV2ViUmVzdWx0Ow0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLkFzeW5jSGFuZGxlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLkhvbGRlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLlJlcXVlc3RXcmFwcGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuUmVzcG9uc2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5SZXNwb25zZVdyYXBwZXI7DQotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTsNCi0NCi0vKioNCi0gKiBUaGlzIGNsYXNzIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIEpBWFdTIFNJLg0KLSAqIEpBWC1XUyBSSSAyLjBfMDEtYjE1LWZjcw0KLSAqIEdlbmVyYXRlZCBzb3VyY2UgdmVyc2lvbjogMi4wDQotICogDQotICovDQotQFdlYlNlcnZpY2UobmFtZSA9ICJEb2NMaXRXcmFwcGVkUHJveHkiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL2RvY2xpdHdyYXBwZWQucHJveHkudGVzdC5vcmciKQ0KLXB1YmxpYyBpbnRlcmZhY2UgRG9jTGl0V3JhcHBlZFByb3h5IHsNCi0NCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKi8NCi0gICAgQFdlYk1ldGhvZChhY3Rpb24gPSAiaHR0cDovL2RvY2xpdHdyYXBwZWQucHJveHkudGVzdC5vcmcvdHdvV2F5UmV0dXJuIikNCi0gICAgQE9uZXdheQ0KLSAgICBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gIm9uZVdheVZvaWQiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL2RvY2xpdHdyYXBwZWQucHJveHkudGVzdC5vcmciLCBjbGFzc05hbWUgPSAib3JnLnRlc3QucHJveHkuZG9jbGl0d3JhcHBlZC5PbmVXYXlWb2lkIikNCi0gICAgcHVibGljIHZvaWQgb25lV2F5Vm9pZCgpOw0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSBvbmV3YXlTdHINCi0gICAgICovDQotICAgIEBXZWJNZXRob2QoYWN0aW9uID0gImh0dHA6Ly9kb2NsaXR3cmFwcGVkLnByb3h5LnRlc3Qub3JnL3R3b1dheVJldHVybiIpDQotICAgIEBPbmV3YXkNCi0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJvbmVXYXkiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL2RvY2xpdHdyYXBwZWQucHJveHkudGVzdC5vcmciLCBjbGFzc05hbWUgPSAib3JnLnRlc3QucHJveHkuZG9jbGl0d3JhcHBlZC5zZWkuT25lV2F5IikNCi0gICAgcHVibGljIHZvaWQgb25lV2F5KA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAib25ld2F5X3N0ciIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQ0KLSAgICAgICAgU3RyaW5nIG9uZXdheVN0cik7DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIHR3b1dheUhvbGRlckludA0KLSAgICAgKiBAcGFyYW0gdHdvV2F5SG9sZGVyU3RyDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgamF2YXgueG1sLndzLlJlc3BvbnNlPGRvY2xpdHdyYXBwZWQucHJveHkudGVzdC5vcmcuc2VpLlR3b1dheUhvbGRlcj4NCi0gICAgICovDQotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJ0d29XYXlIb2xkZXIiLCBhY3Rpb24gPSAiaHR0cDovL2RvY2xpdHdyYXBwZWQucHJveHkudGVzdC5vcmcvdHdvV2F5UmV0dXJuIikNCi0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJ0d29XYXlIb2xkZXIiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL2RvY2xpdHdyYXBwZWQucHJveHkudGVzdC5vcmciLCBjbGFzc05hbWUgPSAib3JnLnRlc3QucHJveHkuZG9jbGl0d3JhcHBlZC5Ud29XYXlIb2xkZXIiKQ0KLSAgICBAUmVzcG9uc2VXcmFwcGVyKGxvY2FsTmFtZSA9ICJ0d29XYXlIb2xkZXIiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL2RvY2xpdHdyYXBwZWQucHJveHkudGVzdC5vcmciLCBjbGFzc05hbWUgPSAib3JnLnRlc3QucHJveHkuZG9jbGl0d3JhcHBlZC5Ud29XYXlIb2xkZXIiKQ0KLSAgICBwdWJsaWMgUmVzcG9uc2U8VHdvV2F5SG9sZGVyPiB0d29XYXlIb2xkZXJBc3luYygNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gInR3b1dheUhvbGRlcl9zdHIiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikNCi0gICAgICAgIFN0cmluZyB0d29XYXlIb2xkZXJTdHIsDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJ0d29XYXlIb2xkZXJfaW50IiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpDQotICAgICAgICBpbnQgdHdvV2F5SG9sZGVySW50KTsNCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gdHdvV2F5SG9sZGVySW50DQotICAgICAqIEBwYXJhbSBhc3luY0hhbmRsZXINCi0gICAgICogQHBhcmFtIHR3b1dheUhvbGRlclN0cg0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTw/IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdD4NCi0gICAgICovDQotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJ0d29XYXlIb2xkZXIiLCBhY3Rpb24gPSAiaHR0cDovL2RvY2xpdHdyYXBwZWQucHJveHkudGVzdC5vcmcvdHdvV2F5UmV0dXJuIikNCi0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJ0d29XYXlIb2xkZXIiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL2RvY2xpdHdyYXBwZWQucHJveHkudGVzdC5vcmciLCBjbGFzc05hbWUgPSAib3JnLnRlc3QucHJveHkuZG9jbGl0d3JhcHBlZC5Ud29XYXlIb2xkZXIiKQ0KLSAgICBAUmVzcG9uc2VXcmFwcGVyKGxvY2FsTmFtZSA9ICJ0d29XYXlIb2xkZXIiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL2RvY2xpdHdyYXBwZWQucHJveHkudGVzdC5vcmciLCBjbGFzc05hbWUgPSAib3JnLnRlc3QucHJveHkuZG9jbGl0d3JhcHBlZC5Ud29XYXlIb2xkZXIiKQ0KLSAgICBwdWJsaWMgRnV0dXJlPD8+IHR3b1dheUhvbGRlckFzeW5jKA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAidHdvV2F5SG9sZGVyX3N0ciIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQ0KLSAgICAgICAgU3RyaW5nIHR3b1dheUhvbGRlclN0ciwNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gInR3b1dheUhvbGRlcl9pbnQiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikNCi0gICAgICAgIGludCB0d29XYXlIb2xkZXJJbnQsDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJhc3luY0hhbmRsZXIiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikNCi0gICAgICAgIEFzeW5jSGFuZGxlcjxUd29XYXlIb2xkZXI+IGFzeW5jSGFuZGxlcik7DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIHR3b1dheUhvbGRlckludA0KLSAgICAgKiBAcGFyYW0gdHdvV2F5SG9sZGVyU3RyDQotICAgICAqLw0KLSAgICBAV2ViTWV0aG9kKGFjdGlvbiA9ICJodHRwOi8vZG9jbGl0d3JhcHBlZC5wcm94eS50ZXN0Lm9yZy90d29XYXlSZXR1cm4iKQ0KLSAgICBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gInR3b1dheUhvbGRlciIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vZG9jbGl0d3JhcHBlZC5wcm94eS50ZXN0Lm9yZyIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5wcm94eS5kb2NsaXR3cmFwcGVkLlR3b1dheUhvbGRlciIpDQotICAgIEBSZXNwb25zZVdyYXBwZXIobG9jYWxOYW1lID0gInR3b1dheUhvbGRlciIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vZG9jbGl0d3JhcHBlZC5wcm94eS50ZXN0Lm9yZyIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5wcm94eS5kb2NsaXR3cmFwcGVkLlR3b1dheUhvbGRlciIpDQotICAgIHB1YmxpYyB2b2lkIHR3b1dheUhvbGRlcigNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gInR3b1dheUhvbGRlcl9zdHIiLCB0YXJnZXROYW1lc3BhY2UgPSAiIiwgbW9kZSA9IE1vZGUuSU5PVVQpDQotICAgICAgICBIb2xkZXI8U3RyaW5nPiB0d29XYXlIb2xkZXJTdHIsDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJ0d29XYXlIb2xkZXJfaW50IiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIsIG1vZGUgPSBNb2RlLklOT1VUKQ0KLSAgICAgICAgSG9sZGVyPEludGVnZXI+IHR3b1dheUhvbGRlckludCk7DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIHR3b3dheVN0cg0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIGphdmF4LnhtbC53cy5SZXNwb25zZTxkb2NsaXR3cmFwcGVkLnByb3h5LnRlc3Qub3JnLnNlaS5SZXR1cm5UeXBlPg0KLSAgICAgKi8NCi0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lID0gInR3b1dheSIsIGFjdGlvbiA9ICJodHRwOi8vZG9jbGl0d3JhcHBlZC5wcm94eS50ZXN0Lm9yZy90d29XYXlSZXR1cm4iKQ0KLSAgICBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gInR3b1dheSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vZG9jbGl0d3JhcHBlZC5wcm94eS50ZXN0Lm9yZyIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5wcm94eS5kb2NsaXR3cmFwcGVkLlR3b1dheSIpDQotICAgIEBSZXNwb25zZVdyYXBwZXIobG9jYWxOYW1lID0gIlJldHVyblR5cGUiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL2RvY2xpdHdyYXBwZWQucHJveHkudGVzdC5vcmciLCBjbGFzc05hbWUgPSAib3JnLnRlc3QucHJveHkuZG9jbGl0d3JhcHBlZC5zZWkuUmV0dXJuVHlwZSIpDQotICAgIHB1YmxpYyBSZXNwb25zZTxSZXR1cm5UeXBlPiB0d29XYXlBc3luYygNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gInR3b3dheV9zdHIiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikNCi0gICAgICAgIFN0cmluZyB0d293YXlTdHIpOw0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSB0d293YXlTdHINCi0gICAgICogQHBhcmFtIGFzeW5jSGFuZGxlcg0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTw/IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdD4NCi0gICAgICovDQotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJ0d29XYXkiLCBhY3Rpb24gPSAiaHR0cDovL2RvY2xpdHdyYXBwZWQucHJveHkudGVzdC5vcmcvdHdvV2F5UmV0dXJuIikNCi0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJ0d29XYXkiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL2RvY2xpdHdyYXBwZWQucHJveHkudGVzdC5vcmciLCBjbGFzc05hbWUgPSAib3JnLnRlc3QucHJveHkuZG9jbGl0d3JhcHBlZC5Ud29XYXkiKQ0KLSAgICBAUmVzcG9uc2VXcmFwcGVyKGxvY2FsTmFtZSA9ICJSZXR1cm5UeXBlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9kb2NsaXR3cmFwcGVkLnByb3h5LnRlc3Qub3JnIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LnByb3h5LmRvY2xpdHdyYXBwZWQuUmV0dXJuVHlwZSIpDQotICAgIHB1YmxpYyBGdXR1cmU8Pz4gdHdvV2F5QXN5bmMoDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJ0d293YXlfc3RyIiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpDQotICAgICAgICBTdHJpbmcgdHdvd2F5U3RyLA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiYXN5bmNIYW5kbGVyIiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpDQotICAgICAgICBBc3luY0hhbmRsZXI8UmV0dXJuVHlwZT4gYXN5bmNIYW5kbGVyKTsNCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gdHdvd2F5U3RyDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgamF2YS5sYW5nLlN0cmluZw0KLSAgICAgKi8NCi0gICAgQFdlYk1ldGhvZChhY3Rpb24gPSAiaHR0cDovL2RvY2xpdHdyYXBwZWQucHJveHkudGVzdC5vcmcvdHdvV2F5UmV0dXJuIikNCi0gICAgQFdlYlJlc3VsdChuYW1lID0gInJldHVybl9zdHIiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikNCi0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJ0d29XYXkiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL2RvY2xpdHdyYXBwZWQucHJveHkudGVzdC5vcmciLCBjbGFzc05hbWUgPSAib3JnLnRlc3QucHJveHkuZG9jbGl0d3JhcHBlZC5Ud29XYXkiKQ0KLSAgICBAUmVzcG9uc2VXcmFwcGVyKGxvY2FsTmFtZSA9ICJSZXR1cm5UeXBlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9kb2NsaXR3cmFwcGVkLnByb3h5LnRlc3Qub3JnIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LnByb3h5LmRvY2xpdHdyYXBwZWQuUmV0dXJuVHlwZSIpDQotICAgIHB1YmxpYyBTdHJpbmcgdHdvV2F5KA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAidHdvd2F5X3N0ciIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQ0KLSAgICAgICAgU3RyaW5nIHR3b3dheVN0cik7DQotDQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGludm9rZVN0cg0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIGphdmF4LnhtbC53cy5SZXNwb25zZTxvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnByb3h5LmRvY2xpdHdyYXBwZWQuc2VpLlJldHVyblR5cGU+DQotICAgICAqLw0KLSAgICBAV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWUgPSAiaW52b2tlIiwgYWN0aW9uID0gImh0dHA6Ly9kb2NsaXR3cmFwcGVkLnByb3h5LnRlc3Qub3JnL3R3b1dheVJldHVybiIpDQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAiaW52b2tlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9kb2NsaXR3cmFwcGVkLnByb3h5LnRlc3Qub3JnIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LnByb3h5LmRvY2xpdHdyYXBwZWQuSW52b2tlIikNCi0gICAgQFJlc3BvbnNlV3JhcHBlcihsb2NhbE5hbWUgPSAiUmV0dXJuVHlwZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vZG9jbGl0d3JhcHBlZC5wcm94eS50ZXN0Lm9yZyIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5wcm94eS5kb2NsaXR3cmFwcGVkLlJldHVyblR5cGUiKQ0KLSAgICBwdWJsaWMgUmVzcG9uc2U8UmV0dXJuVHlwZT4gaW52b2tlQXN5bmMoDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJpbnZva2Vfc3RyIiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpDQotICAgICAgICBTdHJpbmcgaW52b2tlU3RyKTsNCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gaW52b2tlU3RyDQotICAgICAqIEBwYXJhbSBhc3luY0hhbmRsZXINCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU8PyBleHRlbmRzIGphdmEubGFuZy5PYmplY3Q+DQotICAgICAqLw0KLSAgICBAV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWUgPSAiaW52b2tlIiwgYWN0aW9uID0gImh0dHA6Ly9kb2NsaXR3cmFwcGVkLnByb3h5LnRlc3Qub3JnL3R3b1dheVJldHVybiIpDQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAiaW52b2tlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9kb2NsaXR3cmFwcGVkLnByb3h5LnRlc3Qub3JnIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LnByb3h5LmRvY2xpdHdyYXBwZWQuSW52b2tlIikNCi0gICAgQFJlc3BvbnNlV3JhcHBlcihsb2NhbE5hbWUgPSAiUmV0dXJuVHlwZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vZG9jbGl0d3JhcHBlZC5wcm94eS50ZXN0Lm9yZyIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5wcm94eS5kb2NsaXR3cmFwcGVkLlJldHVyblR5cGUiKQ0KLSAgICBwdWJsaWMgRnV0dXJlPD8+IGludm9rZUFzeW5jKA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiaW52b2tlX3N0ciIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQ0KLSAgICAgICAgU3RyaW5nIGludm9rZVN0ciwNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImFzeW5jSGFuZGxlciIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQ0KLSAgICAgICAgQXN5bmNIYW5kbGVyPFJldHVyblR5cGU+IGFzeW5jSGFuZGxlcik7DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGludm9rZVN0cg0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIGphdmEubGFuZy5TdHJpbmcNCi0gICAgICovDQotICAgIEBXZWJNZXRob2QoYWN0aW9uID0gImh0dHA6Ly9kb2NsaXR3cmFwcGVkLnByb3h5LnRlc3Qub3JnL3R3b1dheVJldHVybiIpDQotICAgIEBXZWJSZXN1bHQobmFtZSA9ICJyZXR1cm5fc3RyIiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpDQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAiaW52b2tlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9kb2NsaXR3cmFwcGVkLnByb3h5LnRlc3Qub3JnIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LnByb3h5LmRvY2xpdHdyYXBwZWQuSW52b2tlIikNCi0gICAgQFJlc3BvbnNlV3JhcHBlcihsb2NhbE5hbWUgPSAiUmV0dXJuVHlwZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vZG9jbGl0d3JhcHBlZC5wcm94eS50ZXN0Lm9yZyIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5wcm94eS5kb2NsaXR3cmFwcGVkLlJldHVyblR5cGUiKQ0KLSAgICBwdWJsaWMgU3RyaW5nIGludm9rZSgNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImludm9rZV9zdHIiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikNCi0gICAgICAgIFN0cmluZyBpbnZva2VTdHIpOw0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSBvcA0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIGphdmF4LnhtbC53cy5SZXNwb25zZTxkb2NsaXR3cmFwcGVkLnByb3h5LnRlc3Qub3JnLnNlaS5GaW5PcFJlc3BvbnNlPg0KLSAgICAgKi8NCi0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lID0gImZpbk9wIiwgYWN0aW9uID0gImh0dHA6Ly9kb2NsaXR3cmFwcGVkLnByb3h5LnRlc3Qub3JnL2Zpbk9wIikNCi0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJmaW5PcCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vZG9jbGl0d3JhcHBlZC5wcm94eS50ZXN0Lm9yZyIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5wcm94eS5kb2NsaXR3cmFwcGVkLkZpbk9wIikNCi0gICAgQFJlc3BvbnNlV3JhcHBlcihsb2NhbE5hbWUgPSAiZmluT3BSZXNwb25zZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vZG9jbGl0d3JhcHBlZC5wcm94eS50ZXN0Lm9yZyIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5wcm94eS5kb2NsaXR3cmFwcGVkLkZpbk9wUmVzcG9uc2UiKQ0KLSAgICBwdWJsaWMgUmVzcG9uc2U8RmluT3BSZXNwb25zZT4gZmluT3BBc3luYygNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gIm9wIiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpDQotICAgICAgICBGaW5hbmNpYWxPcGVyYXRpb24gb3ApOw0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSBvcA0KLSAgICAgKiBAcGFyYW0gYXN5bmNIYW5kbGVyDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlPD8gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Pg0KLSAgICAgKi8NCi0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lID0gImZpbk9wIiwgYWN0aW9uID0gImh0dHA6Ly9kb2NsaXR3cmFwcGVkLnByb3h5LnRlc3Qub3JnL2Zpbk9wIikNCi0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJmaW5PcCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vZG9jbGl0d3JhcHBlZC5wcm94eS50ZXN0Lm9yZyIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5wcm94eS5kb2NsaXR3cmFwcGVkLkZpbk9wIikNCi0gICAgQFJlc3BvbnNlV3JhcHBlcihsb2NhbE5hbWUgPSAiZmluT3BSZXNwb25zZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vZG9jbGl0d3JhcHBlZC5wcm94eS50ZXN0Lm9yZyIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5wcm94eS5kb2NsaXR3cmFwcGVkLkZpbk9wUmVzcG9uc2UiKQ0KLSAgICBwdWJsaWMgRnV0dXJlPD8+IGZpbk9wQXN5bmMoDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJvcCIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQ0KLSAgICAgICAgRmluYW5jaWFsT3BlcmF0aW9uIG9wLA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiYXN5bmNIYW5kbGVyIiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpDQotICAgICAgICBBc3luY0hhbmRsZXI8RmluT3BSZXNwb25zZT4gYXN5bmNIYW5kbGVyKTsNCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gb3ANCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBkb2NsaXR3cmFwcGVkLnByb3h5LnRlc3Qub3JnLnNlaS5GaW5hbmNpYWxPcGVyYXRpb24NCi0gICAgICovDQotICAgIEBXZWJNZXRob2QoYWN0aW9uID0gImh0dHA6Ly9kb2NsaXR3cmFwcGVkLnByb3h5LnRlc3Qub3JnL2Zpbk9wIikNCi0gICAgQFdlYlJlc3VsdChuYW1lID0gInJlc3BvbnNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpDQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAiZmluT3AiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL2RvY2xpdHdyYXBwZWQucHJveHkudGVzdC5vcmciLCBjbGFzc05hbWUgPSAib3JnLnRlc3QucHJveHkuZG9jbGl0d3JhcHBlZC5GaW5PcCIpDQotICAgIEBSZXNwb25zZVdyYXBwZXIobG9jYWxOYW1lID0gImZpbk9wUmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL2RvY2xpdHdyYXBwZWQucHJveHkudGVzdC5vcmciLCBjbGFzc05hbWUgPSAib3JnLnRlc3QucHJveHkuZG9jbGl0d3JhcHBlZC5GaW5PcFJlc3BvbnNlIikNCi0gICAgcHVibGljIEZpbmFuY2lhbE9wZXJhdGlvbiBmaW5PcCgNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gIm9wIiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpDQotICAgICAgICBGaW5hbmNpYWxPcGVyYXRpb24gb3ApOw0KLQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvZG9jbGl0d3JhcHBlZC9zZWkvUHJveHlEb2NMaXRXcmFwcGVkU2VydmljZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2RvY2xpdHdyYXBwZWQvc2VpL1Byb3h5RG9jTGl0V3JhcHBlZFNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDM4M2NmYi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvZG9jbGl0d3JhcHBlZC9zZWkvUHJveHlEb2NMaXRXcmFwcGVkU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotDQotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm94eS5kb2NsaXR3cmFwcGVkLnNlaTsNCi0NCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJFbmRwb2ludDsNCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VDbGllbnQ7DQotaW1wb3J0IGphdmEuaW8uRmlsZTsNCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLm5ldC5VUkw7DQotDQotDQotLyoqDQotICogVGhpcyBjbGFzcyB3YXMgZ2VuZXJhdGVkIGJ5IHRoZSBKQVhXUyBTSS4NCi0gKiBKQVgtV1MgUkkgMi4wXzAxLWIxNS1mY3MNCi0gKiBHZW5lcmF0ZWQgc291cmNlIHZlcnNpb246IDIuMA0KLSAqIA0KLSAqLw0KLQ0KLUBXZWJTZXJ2aWNlQ2xpZW50KG5hbWUgPSAiUHJveHlEb2NMaXRXcmFwcGVkU2VydmljZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vZG9jbGl0d3JhcHBlZC5wcm94eS50ZXN0Lm9yZyIsIHdzZGxMb2NhdGlvbiA9ICJQcm94eURvY0xpdFdyYXBwZWQud3NkbCIpDQotcHVibGljIGNsYXNzIFByb3h5RG9jTGl0V3JhcHBlZFNlcnZpY2UNCi0gICAgZXh0ZW5kcyBTZXJ2aWNlDQotew0KLQ0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBVUkwgUFJPWFlET0NMSVRXUkFQUEVEU0VSVklDRV9XU0RMX0xPQ0FUSU9OOw0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgd3NkbExvY2F0aW9uID0gIi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvZG9jbGl0d3JhcHBlZC9NRVRBLUlORi9Qcm94eURvY0xpdFdyYXBwZWQud3NkbCI7DQotICAgIHN0YXRpYyB7DQotICAgICAgICBVUkwgdXJsID0gbnVsbDsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAJdHJ5ew0KLQkgICAgICAgIAlTdHJpbmcgYmFzZURpciAgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoImJhc2VkaXIiLCIuIikpLmdldENhbm9uaWNhbFBhdGgoKTsNCi0JICAgICAgICAJd3NkbExvY2F0aW9uID0gbmV3IEZpbGUoYmFzZURpciArIHdzZGxMb2NhdGlvbikuZ2V0QWJzb2x1dGVQYXRoKCk7DQotICAgICAgICAJfWNhdGNoKEV4Y2VwdGlvbiBlKXsNCi0gICAgICAgIAkJDQotICAgICAgICAJfQ0KLSAgICAgICAgCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHdzZGxMb2NhdGlvbik7DQotICAgICAgICAJdXJsID0gZmlsZS50b1VSTCgpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgUFJPWFlET0NMSVRXUkFQUEVEU0VSVklDRV9XU0RMX0xPQ0FUSU9OID0gdXJsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBQcm94eURvY0xpdFdyYXBwZWRTZXJ2aWNlKFVSTCB3c2RsTG9jYXRpb24sIFFOYW1lIHNlcnZpY2VOYW1lKSB7DQotICAgICAgICBzdXBlcih3c2RsTG9jYXRpb24sIHNlcnZpY2VOYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUHJveHlEb2NMaXRXcmFwcGVkU2VydmljZSgpIHsNCi0gICAgICAgIHN1cGVyKFBST1hZRE9DTElUV1JBUFBFRFNFUlZJQ0VfV1NETF9MT0NBVElPTiwgbmV3IFFOYW1lKCJodHRwOi8vZG9jbGl0d3JhcHBlZC5wcm94eS50ZXN0Lm9yZyIsICJQcm94eURvY0xpdFdyYXBwZWRTZXJ2aWNlIikpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBEb2NMaXRXcmFwcGVkUHJveHkNCi0gICAgICovDQotICAgIEBXZWJFbmRwb2ludChuYW1lID0gIlByb3h5RG9jTGl0V3JhcHBlZFBvcnQiKQ0KLSAgICBwdWJsaWMgRG9jTGl0V3JhcHBlZFByb3h5IGdldERvY0xpdFdyYXBwZWRQcm94eUltcGxQb3J0KCkgew0KLSAgICAgICAgcmV0dXJuIChEb2NMaXRXcmFwcGVkUHJveHkpc3VwZXIuZ2V0UG9ydChuZXcgUU5hbWUoImh0dHA6Ly9kb2NsaXR3cmFwcGVkLnByb3h5LnRlc3Qub3JnIiwgIkRvY0xpdFdyYXBwZWRQcm94eUltcGxQb3J0IiksIERvY0xpdFdyYXBwZWRQcm94eS5jbGFzcyk7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2dvcmlsbGFfZGx3L0dvcmlsbGFQcm94eUltcGwuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9nb3JpbGxhX2Rsdy9Hb3JpbGxhUHJveHlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2Nzc0YTAuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2dvcmlsbGFfZGx3L0dvcmlsbGFQcm94eUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnByb3h5LmdvcmlsbGFfZGx3Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnByb3h5LmdvcmlsbGFfZGx3LmRhdGEuRnJ1aXQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJveHkuZ29yaWxsYV9kbHcuc2VpLkFzc2VydEZhdWx0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnByb3h5LmdvcmlsbGFfZGx3LnNlaS5Hb3JpbGxhSW50ZXJmYWNlOw0KLQ0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsNCi1pbXBvcnQgamF2YXgueG1sLmRhdGF0eXBlLkR1cmF0aW9uOw0KLWltcG9ydCBqYXZheC54bWwuZGF0YXR5cGUuWE1MR3JlZ29yaWFuQ2FsZW5kYXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5Ib2xkZXI7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLS8qKg0KLSAqIFRlc3RzIG1vcmUgY29tcGxpY2F0ZWQgRG9jdW1lbnQvTGl0ZXJhbCBXcmFwcGVkIHNjZW5hcmlvcw0KLSAqDQotICovDQotQFdlYlNlcnZpY2UoDQotCQl0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvZ29yaWxsYV9kbHciLA0KLQkJc2VydmljZU5hbWU9IkdvcmlsbGFTZXJ2aWNlIiwNCi0gICAgICAgIGVuZHBvaW50SW50ZXJmYWNlPSJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnByb3h5LmdvcmlsbGFfZGx3LnNlaS5Hb3JpbGxhSW50ZXJmYWNlIikNCi1wdWJsaWMgY2xhc3MgR29yaWxsYVByb3h5SW1wbCBpbXBsZW1lbnRzIEdvcmlsbGFJbnRlcmZhY2Ugew0KLQ0KLSAgICAvKiAobm9uLUphdmFkb2MpDQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm94eS5nb3JpbGxhX2Rsdy5zZWkuR29yaWxsYUludGVyZmFjZSNlY2hvU3RyaW5nKGphdmEubGFuZy5TdHJpbmcpDQotICAgICAqLw0KLSAgICBwdWJsaWMgU3RyaW5nIGVjaG9TdHJpbmcoU3RyaW5nIGRhdGEpIHRocm93cyBBc3NlcnRGYXVsdCB7DQotICAgICAgICByZXR1cm4gZGF0YTsNCi0gICAgfQ0KLQ0KLSAgICAvKiAobm9uLUphdmFkb2MpDQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm94eS5nb3JpbGxhX2Rsdy5zZWkuR29yaWxsYUludGVyZmFjZSNlY2hvU3RyaW5nMihqYXZhLmxhbmcuU3RyaW5nLCBqYXZheC54bWwud3MuSG9sZGVyKQ0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgZWNob1N0cmluZzIoU3RyaW5nIGRhdGEsIEhvbGRlcjxTdHJpbmc+IGlub3V0KQ0KLSAgICAgICAgICAgIHRocm93cyBBc3NlcnRGYXVsdCB7DQotICAgICAgICAvLyBDb21iaW5lIHRoZSBzdHJpbmdzIHRvZ2V0aGVyLg0KLSAgICAgICAgLy8gVGhlIHN0cmluZ3MgbWF5IGJlIG51bGwgb24gaW5wdXQNCi0gICAgICAgIFN0cmluZyByZXN1bHQgPSBudWxsOw0KLSAgICAgICAgaWYgKGRhdGEgIT0gbnVsbCAmJiBpbm91dC52YWx1ZSAhPSBudWxsKSB7DQotICAgICAgICAgICAgcmVzdWx0ID0gZGF0YSArIGlub3V0LnZhbHVlOw0KLSAgICAgICAgfSBlbHNlICB7DQotICAgICAgICAgICAgcmVzdWx0ID0gKGRhdGEgIT0gbnVsbCkgPyBkYXRhIDogaW5vdXQudmFsdWU7DQotICAgICAgICB9DQotICAgICAgICBpbm91dC52YWx1ZSA9IHJlc3VsdDsNCi0NCi0gICAgfQ0KLQ0KLSAgICAvKiAobm9uLUphdmFkb2MpDQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm94eS5nb3JpbGxhX2Rsdy5zZWkuR29yaWxsYUludGVyZmFjZSNlY2hvSW50KGphdmEubGFuZy5JbnRlZ2VyKQ0KLSAgICAgKi8NCi0gICAgcHVibGljIEludGVnZXIgZWNob0ludChJbnRlZ2VyIGRhdGEpIHRocm93cyBBc3NlcnRGYXVsdCB7DQotICAgICAgIHJldHVybiBkYXRhOw0KLSAgICB9DQotDQotICAgIC8qIChub24tSmF2YWRvYykNCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnByb3h5LmdvcmlsbGFfZGx3LnNlaS5Hb3JpbGxhSW50ZXJmYWNlI2VjaG9BbnlUeXBlKGphdmEubGFuZy5PYmplY3QpDQotICAgICAqLw0KLSAgICBwdWJsaWMgT2JqZWN0IGVjaG9BbnlUeXBlKE9iamVjdCBkYXRhKSB0aHJvd3MgQXNzZXJ0RmF1bHQgew0KLSAgICAgICAgcmV0dXJuIGRhdGE7DQotICAgIH0NCi0NCi0gICAgLyogKG5vbi1KYXZhZG9jKQ0KLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJveHkuZ29yaWxsYV9kbHcuc2VpLkdvcmlsbGFJbnRlcmZhY2UjZWNob1N0cmluZ0xpc3QoamF2YS51dGlsLkxpc3QpDQotICAgICAqLw0KLSAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGVjaG9TdHJpbmdMaXN0KExpc3Q8U3RyaW5nPiBkYXRhKQ0KLSAgICAgICAgICAgIHRocm93cyBBc3NlcnRGYXVsdCB7DQotICAgICAgICByZXR1cm4gZGF0YTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIFN0cmluZ1tdIGVjaG9TdHJpbmdMaXN0QWx0KFN0cmluZ1tdIGRhdGEpIHRocm93cyBBc3NlcnRGYXVsdCB7DQotICAgICAgIHJldHVybiBkYXRhOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBMaXN0PExpc3Q8U3RyaW5nPj4gZWNob1N0cmluZ0xpc3RBcnJheShMaXN0PExpc3Q8U3RyaW5nPj4gZGF0YSkgdGhyb3dzIEFzc2VydEZhdWx0IHsNCi0gICAgICAgIHJldHVybiBkYXRhOw0KLSAgICB9DQotICAgIA0KLSAgICAvKiAobm9uLUphdmFkb2MpDQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm94eS5nb3JpbGxhX2Rsdy5zZWkuR29yaWxsYUludGVyZmFjZSNlY2hvU3RyaW5nQXJyYXkoamF2YS51dGlsLkxpc3QpDQotICAgICAqLw0KLSAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGVjaG9TdHJpbmdBcnJheShMaXN0PFN0cmluZz4gZGF0YSkgdGhyb3dzIEFzc2VydEZhdWx0IHsNCi0gICAgICAgIHJldHVybiBkYXRhOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgU3RyaW5nW10gZWNob1N0cmluZ0FycmF5QWx0KFN0cmluZ1tdIGRhdGEpIHRocm93cyBBc3NlcnRGYXVsdCB7DQotICAgICAgICByZXR1cm4gZGF0YTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGVjaG9JbmRleGVkU3RyaW5nQXJyYXkoTGlzdDxTdHJpbmc+IGRhdGEpIHRocm93cyBBc3NlcnRGYXVsdCB7DQotICAgICAgICByZXR1cm4gZGF0YTsNCi0gICAgfQ0KLQ0KLSAgICAvKiAobm9uLUphdmFkb2MpDQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm94eS5nb3JpbGxhX2Rsdy5zZWkuR29yaWxsYUludGVyZmFjZSNlY2hvU3RyaW5nMkFycmF5KGphdmEudXRpbC5MaXN0LCBqYXZheC54bWwud3MuSG9sZGVyKQ0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgZWNob1N0cmluZzJBcnJheShMaXN0PFN0cmluZz4gZGF0YSwgSG9sZGVyPExpc3Q8U3RyaW5nPj4gaW5vdXQpDQotICAgICAgICAgICAgdGhyb3dzIEFzc2VydEZhdWx0IHsNCi0gICAgICAgIGlub3V0LnZhbHVlLmFkZEFsbChkYXRhKTsNCi0gICAgfQ0KLQ0KLSAgICAvKiAobm9uLUphdmFkb2MpDQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm94eS5nb3JpbGxhX2Rsdy5zZWkuR29yaWxsYUludGVyZmFjZSNlY2hvSW50QXJyYXkoamF2YS51dGlsLkxpc3QpDQotICAgICAqLw0KLSAgICBwdWJsaWMgTGlzdDxJbnRlZ2VyPiBlY2hvSW50QXJyYXkoTGlzdDxJbnRlZ2VyPiBkYXRhKSB0aHJvd3MgQXNzZXJ0RmF1bHQgew0KLSAgICAgICAgcmV0dXJuIGRhdGE7DQotICAgIH0NCi0NCi0gICAgLyogKG5vbi1KYXZhZG9jKQ0KLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJveHkuZ29yaWxsYV9kbHcuc2VpLkdvcmlsbGFJbnRlcmZhY2UjZWNob0FueVR5cGVBcnJheShqYXZhLnV0aWwuTGlzdCkNCi0gICAgICovDQotICAgIHB1YmxpYyBMaXN0PE9iamVjdD4gZWNob0FueVR5cGVBcnJheShMaXN0PE9iamVjdD4gZGF0YSkgdGhyb3dzIEFzc2VydEZhdWx0IHsNCi0gICAgICAgIHJldHVybiBkYXRhOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBGcnVpdCBlY2hvRW51bShGcnVpdCBkYXRhKSB0aHJvd3MgQXNzZXJ0RmF1bHQgew0KLSAgICAgICAgcmV0dXJuIGRhdGE7DQotICAgIH0NCi0NCi0gICAgcHVibGljIExpc3Q8RnJ1aXQ+IGVjaG9FbnVtQXJyYXkoTGlzdDxGcnVpdD4gZGF0YSkgdGhyb3dzIEFzc2VydEZhdWx0IHsNCi0gICAgICAgIHJldHVybiBkYXRhOw0KLSAgICB9DQotDQotCXB1YmxpYyBYTUxHcmVnb3JpYW5DYWxlbmRhciBlY2hvRGF0ZShYTUxHcmVnb3JpYW5DYWxlbmRhciByZXF1ZXN0ZWRUZXJtaW5hdGlvblRpbWUsIER1cmF0aW9uIHJlcXVlc3RlZExpZmV0aW1lRHVyYXRpb24pIHsNCi0NCi0JCXJldHVybiByZXF1ZXN0ZWRUZXJtaW5hdGlvblRpbWU7DQotCX0NCi0NCi0NCi0JcHVibGljIHZvaWQgZWNob1BvbHltb3JwaGljRGF0ZShYTUxHcmVnb3JpYW5DYWxlbmRhciByZXF1ZXN0KSB7IA0KLQkJLy9UZXN0IHRvIG1ha2Ugc3VyZSBwb2x5bW9ycGljIGNhc2VzIGNhbiBtYXJzaGFsIG9uIGNsaWVudCBhbmQgc2VydmVyLg0KLQkJaWYocmVxdWVzdD09bnVsbCl7DQotCQkJDQotCQl9DQotCX0NCi0gICAgDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9nb3JpbGxhX2Rsdy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9nb3JpbGxhX2Rsdy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY0YjU2OC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvZ29yaWxsYV9kbHcvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjANCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvZ29yaWxsYV9kbHcvTUVUQS1JTkYvZ29yaWxsYV9kbHcud3NkbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9nb3JpbGxhX2Rsdy9NRVRBLUlORi9nb3JpbGxhX2Rsdy53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDZmNjU0Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9nb3JpbGxhX2Rsdy9NRVRBLUlORi9nb3JpbGxhX2Rsdy53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsOTA0ICswLDAgQEAKLTw/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+DQotICAgIDwvcG9ydD4NCi0gIDwvc2VydmljZT4NCi08L2RlZmluaXRpb25zPg0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9nb3JpbGxhX2Rsdy9zZWkvQXNzZXJ0RmF1bHQuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9nb3JpbGxhX2Rsdy9zZWkvQXNzZXJ0RmF1bHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODYyMjk0NS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvZ29yaWxsYV9kbHcvc2VpL0Fzc2VydEZhdWx0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0NCi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnByb3h5LmdvcmlsbGFfZGx3LnNlaTsNCi0NCi1pbXBvcnQgamF2YXgueG1sLndzLldlYkZhdWx0Ow0KLQ0KLQ0KLS8qKg0KLSAqIFRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBieSB0aGUgSkFYV1MgU0kuDQotICogSkFYLVdTIFJJIDIuMF8wMS1iMTUtZmNzDQotICogR2VuZXJhdGVkIHNvdXJjZSB2ZXJzaW9uOiAyLjANCi0gKiANCi0gKi8NCi1AV2ViRmF1bHQobmFtZSA9ICJhc3NlcnRGYXVsdCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9nb3JpbGxhX2Rsdy9kYXRhIikNCi1wdWJsaWMgY2xhc3MgQXNzZXJ0RmF1bHQNCi0gICAgZXh0ZW5kcyBFeGNlcHRpb24NCi17DQotDQotICAgIC8qKg0KLSAgICAgKiBKYXZhIHR5cGUgdGhhdCBnb2VzIGFzIHNvYXBlbnY6RmF1bHQgZGV0YWlsIGVsZW1lbnQuDQotICAgICAqIA0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnByb3h5LmdvcmlsbGFfZGx3LmRhdGEuQXNzZXJ0RmF1bHQgZmF1bHRJbmZvOw0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSBtZXNzYWdlDQotICAgICAqIEBwYXJhbSBmYXVsdEluZm8NCi0gICAgICovDQotICAgIHB1YmxpYyBBc3NlcnRGYXVsdChTdHJpbmcgbWVzc2FnZSwgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm94eS5nb3JpbGxhX2Rsdy5kYXRhLkFzc2VydEZhdWx0IGZhdWx0SW5mbykgew0KLSAgICAgICAgc3VwZXIobWVzc2FnZSk7DQotICAgICAgICB0aGlzLmZhdWx0SW5mbyA9IGZhdWx0SW5mbzsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSBjYXVzZQ0KLSAgICAgKiBAcGFyYW0gbWVzc2FnZQ0KLSAgICAgKiBAcGFyYW0gZmF1bHRJbmZvDQotICAgICAqLw0KLSAgICBwdWJsaWMgQXNzZXJ0RmF1bHQoU3RyaW5nIG1lc3NhZ2UsIG9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJveHkuZ29yaWxsYV9kbHcuZGF0YS5Bc3NlcnRGYXVsdCBmYXVsdEluZm8sIFRocm93YWJsZSBjYXVzZSkgew0KLSAgICAgICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpOw0KLSAgICAgICAgdGhpcy5mYXVsdEluZm8gPSBmYXVsdEluZm87DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIGZhdWx0IGJlYW46IG9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJveHkuZ29yaWxsYV9kbHcuZGF0YS5Bc3NlcnRGYXVsdA0KLSAgICAgKi8NCi0gICAgcHVibGljIG9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJveHkuZ29yaWxsYV9kbHcuZGF0YS5Bc3NlcnRGYXVsdCBnZXRGYXVsdEluZm8oKSB7DQotICAgICAgICByZXR1cm4gZmF1bHRJbmZvOw0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9nb3JpbGxhX2Rsdy9zZWkvR29yaWxsYUludGVyZmFjZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2dvcmlsbGFfZGx3L3NlaS9Hb3JpbGxhSW50ZXJmYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkN2E4NTUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2dvcmlsbGFfZGx3L3NlaS9Hb3JpbGxhSW50ZXJmYWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzQgKzAsMCBAQAotDQotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm94eS5nb3JpbGxhX2Rsdy5zZWk7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJveHkuZ29yaWxsYV9kbHcuZGF0YS5GcnVpdDsNCi0NCi1pbXBvcnQgamF2YXguandzLk9uZXdheTsNCi1pbXBvcnQgamF2YXguandzLldlYk1ldGhvZDsNCi1pbXBvcnQgamF2YXguandzLldlYlBhcmFtOw0KLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW0uTW9kZTsNCi1pbXBvcnQgamF2YXguandzLldlYlJlc3VsdDsNCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sU2VlQWxzbzsNCi1pbXBvcnQgamF2YXgueG1sLmRhdGF0eXBlLkR1cmF0aW9uOw0KLWltcG9ydCBqYXZheC54bWwuZGF0YXR5cGUuWE1MR3JlZ29yaWFuQ2FsZW5kYXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5Ib2xkZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5SZXF1ZXN0V3JhcHBlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLlJlc3BvbnNlV3JhcHBlcjsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotLyoqDQotICogVGhpcyBjbGFzcyB3YXMgZ2VuZXJhdGVkIGJ5IHRoZSBKQVhXUyBTSS4NCi0gKiBKQVgtV1MgUkkgMi4wXzAxLWIxNS1mY3MNCi0gKiBHZW5lcmF0ZWQgc291cmNlIHZlcnNpb246IDIuMA0KLSAqIA0KLSAqLw0KLUBXZWJTZXJ2aWNlKG5hbWUgPSAiR29yaWxsYUludGVyZmFjZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9nb3JpbGxhX2RsdyIpDQotQFhtbFNlZUFsc28ob3JnLnRlc3Quc3RvY2syLkdldFByaWNlLmNsYXNzKSAgLy8gVGVzdCBzZWUgYWxzbyBwcm9jZXNzaW5nDQotcHVibGljIGludGVyZmFjZSBHb3JpbGxhSW50ZXJmYWNlIHsNCi0NCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gZGF0YQ0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIGphdmEubGFuZy5TdHJpbmcNCi0gICAgICogQHRocm93cyBBc3NlcnRGYXVsdA0KLSAgICAgKi8NCi0gICAgQFdlYk1ldGhvZA0KLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAicmVzdWx0IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2dvcmlsbGFfZGx3L2RhdGEiKQ0KLSAgICBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gImVjaG9TdHJpbmciLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvZ29yaWxsYV9kbHcvZGF0YSIsIGNsYXNzTmFtZSA9ICJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnByb3h5LmdvcmlsbGFfZGx3LmRhdGEuRWNob1N0cmluZyIpDQotICAgIEBSZXNwb25zZVdyYXBwZXIobG9jYWxOYW1lID0gImVjaG9TdHJpbmdSZXNwb25zZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9nb3JpbGxhX2Rsdy9kYXRhIiwgY2xhc3NOYW1lID0gIm9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJveHkuZ29yaWxsYV9kbHcuZGF0YS5FY2hvU3RyaW5nUmVzcG9uc2UiKQ0KLSAgICBwdWJsaWMgU3RyaW5nIGVjaG9TdHJpbmcoDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJkYXRhIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2dvcmlsbGFfZGx3L2RhdGEiKQ0KLSAgICAgICAgU3RyaW5nIGRhdGEpDQotICAgICAgICB0aHJvd3MgQXNzZXJ0RmF1bHQNCi0gICAgOw0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSBkYXRhDQotICAgICAqIEBwYXJhbSBpbm91dA0KLSAgICAgKiBAdGhyb3dzIEFzc2VydEZhdWx0DQotICAgICAqLw0KLSAgICBAV2ViTWV0aG9kDQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAiZWNob1N0cmluZzIiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvZ29yaWxsYV9kbHcvZGF0YSIsIGNsYXNzTmFtZSA9ICJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnByb3h5LmdvcmlsbGFfZGx3LmRhdGEuRWNob1N0cmluZzIiKQ0KLSAgICBAUmVzcG9uc2VXcmFwcGVyKGxvY2FsTmFtZSA9ICJlY2hvU3RyaW5nMlJlc3BvbnNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2dvcmlsbGFfZGx3L2RhdGEiLCBjbGFzc05hbWUgPSAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm94eS5nb3JpbGxhX2Rsdy5kYXRhLkVjaG9TdHJpbmcyUmVzcG9uc2UiKQ0KLSAgICBwdWJsaWMgdm9pZCBlY2hvU3RyaW5nMigNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImRhdGEiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvZ29yaWxsYV9kbHcvZGF0YSIpDQotICAgICAgICBTdHJpbmcgZGF0YSwNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImlub3V0IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2dvcmlsbGFfZGx3L2RhdGEiLCBtb2RlID0gTW9kZS5JTk9VVCkNCi0gICAgICAgIEhvbGRlcjxTdHJpbmc+IGlub3V0KQ0KLSAgICAgICAgdGhyb3dzIEFzc2VydEZhdWx0DQotICAgIDsNCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gZGF0YQ0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIGphdmEubGFuZy5JbnRlZ2VyDQotICAgICAqIEB0aHJvd3MgQXNzZXJ0RmF1bHQNCi0gICAgICovDQotICAgIEBXZWJNZXRob2QNCi0gICAgQFdlYlJlc3VsdChuYW1lID0gInJlc3VsdCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9nb3JpbGxhX2Rsdy9kYXRhIikNCi0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJlY2hvSW50IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2dvcmlsbGFfZGx3L2RhdGEiLCBjbGFzc05hbWUgPSAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm94eS5nb3JpbGxhX2Rsdy5kYXRhLkVjaG9JbnQiKQ0KLSAgICBAUmVzcG9uc2VXcmFwcGVyKGxvY2FsTmFtZSA9ICJlY2hvSW50UmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvZ29yaWxsYV9kbHcvZGF0YSIsIGNsYXNzTmFtZSA9ICJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnByb3h5LmdvcmlsbGFfZGx3LmRhdGEuRWNob0ludFJlc3BvbnNlIikNCi0gICAgcHVibGljIEludGVnZXIgZWNob0ludCgNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImRhdGEiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvZ29yaWxsYV9kbHcvZGF0YSIpDQotICAgICAgICBJbnRlZ2VyIGRhdGEpDQotICAgICAgICB0aHJvd3MgQXNzZXJ0RmF1bHQNCi0gICAgOw0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSBkYXRhDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm94eS5nb3JpbGxhX2Rsdy5kYXRhLkZydWl0DQotICAgICAqIEB0aHJvd3MgQXNzZXJ0RmF1bHQNCi0gICAgICovDQotICAgIEBXZWJNZXRob2QNCi0gICAgQFdlYlJlc3VsdChuYW1lID0gInJlc3VsdCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9nb3JpbGxhX2Rsdy9kYXRhIikNCi0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJlY2hvRW51bSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9nb3JpbGxhX2Rsdy9kYXRhIiwgY2xhc3NOYW1lID0gIm9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJveHkuZ29yaWxsYV9kbHcuZGF0YS5FY2hvRW51bSIpDQotICAgIEBSZXNwb25zZVdyYXBwZXIobG9jYWxOYW1lID0gImVjaG9FbnVtUmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvZ29yaWxsYV9kbHcvZGF0YSIsIGNsYXNzTmFtZSA9ICJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnByb3h5LmdvcmlsbGFfZGx3LmRhdGEuRWNob0VudW1SZXNwb25zZSIpDQotICAgIHB1YmxpYyBGcnVpdCBlY2hvRW51bSgNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImRhdGEiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvZ29yaWxsYV9kbHcvZGF0YSIpDQotICAgICAgICBGcnVpdCBkYXRhKQ0KLSAgICAgICAgdGhyb3dzIEFzc2VydEZhdWx0DQotICAgIDsNCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gZGF0YQ0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIGphdmEubGFuZy5PYmplY3QNCi0gICAgICogQHRocm93cyBBc3NlcnRGYXVsdA0KLSAgICAgKi8NCi0gICAgQFdlYk1ldGhvZA0KLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAicmVzdWx0IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2dvcmlsbGFfZGx3L2RhdGEiKQ0KLSAgICBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gImVjaG9BbnlUeXBlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2dvcmlsbGFfZGx3L2RhdGEiLCBjbGFzc05hbWUgPSAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm94eS5nb3JpbGxhX2Rsdy5kYXRhLkVjaG9BbnlUeXBlIikNCi0gICAgQFJlc3BvbnNlV3JhcHBlcihsb2NhbE5hbWUgPSAiZWNob0FueVR5cGVSZXNwb25zZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9nb3JpbGxhX2Rsdy9kYXRhIiwgY2xhc3NOYW1lID0gIm9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJveHkuZ29yaWxsYV9kbHcuZGF0YS5FY2hvQW55VHlwZVJlc3BvbnNlIikNCi0gICAgcHVibGljIE9iamVjdCBlY2hvQW55VHlwZSgNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImRhdGEiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvZ29yaWxsYV9kbHcvZGF0YSIpDQotICAgICAgICBPYmplY3QgZGF0YSkNCi0gICAgICAgIHRocm93cyBBc3NlcnRGYXVsdA0KLSAgICA7DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGRhdGENCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBqYXZhLnV0aWwuTGlzdDxqYXZhLnV0aWwuTGlzdDxqYXZhLmxhbmcuU3RyaW5nPj4NCi0gICAgICogQHRocm93cyBBc3NlcnRGYXVsdA0KLSAgICAgKi8NCi0gICAgQFdlYk1ldGhvZA0KLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAicmVzdWx0IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2dvcmlsbGFfZGx3L2RhdGEiKQ0KLSAgICBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gImVjaG9TdHJpbmdMaXN0IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2dvcmlsbGFfZGx3L2RhdGEiLCBjbGFzc05hbWUgPSAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm94eS5nb3JpbGxhX2Rsdy5kYXRhLkVjaG9TdHJpbmdMaXN0IikNCi0gICAgQFJlc3BvbnNlV3JhcHBlcihsb2NhbE5hbWUgPSAiZWNob1N0cmluZ0xpc3RSZXNwb25zZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9nb3JpbGxhX2Rsdy9kYXRhIiwgY2xhc3NOYW1lID0gIm9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJveHkuZ29yaWxsYV9kbHcuZGF0YS5FY2hvU3RyaW5nTGlzdFJlc3BvbnNlIikNCi0gICAgcHVibGljIExpc3Q8U3RyaW5nPiBlY2hvU3RyaW5nTGlzdCgNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImRhdGEiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvZ29yaWxsYV9kbHcvZGF0YSIpDQotICAgICAgICBMaXN0PFN0cmluZz4gZGF0YSkNCi0gICAgICAgIHRocm93cyBBc3NlcnRGYXVsdA0KLSAgICA7DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGRhdGENCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBTdHJpbmdbXQ0KLSAgICAgKiBAdGhyb3dzIEFzc2VydEZhdWx0DQotICAgICAqLw0KLSAgICAvLyBOT1RFOiBUaGUgcmV0dXJuIGFuZCBwYXJhbSBhcmUgbWFudWFsbHkgY2hhbmdlZCBmcm9tIExpc3Q8U3RyaW5nPiB0byBTdHJpbmdbXQ0KLSAgICBAV2ViTWV0aG9kDQotICAgIEBXZWJSZXN1bHQobmFtZSA9ICJyZXN1bHQiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvZ29yaWxsYV9kbHcvZGF0YSIpDQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAiZWNob1N0cmluZ0xpc3RBbHQiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvZ29yaWxsYV9kbHcvZGF0YSIsIGNsYXNzTmFtZSA9ICJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnByb3h5LmdvcmlsbGFfZGx3LmRhdGEuRWNob1N0cmluZ0xpc3RBbHQiKQ0KLSAgICBAUmVzcG9uc2VXcmFwcGVyKGxvY2FsTmFtZSA9ICJlY2hvU3RyaW5nTGlzdEFsdFJlc3BvbnNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2dvcmlsbGFfZGx3L2RhdGEiLCBjbGFzc05hbWUgPSAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm94eS5nb3JpbGxhX2Rsdy5kYXRhLkVjaG9TdHJpbmdMaXN0QWx0UmVzcG9uc2UiKQ0KLSAgICBwdWJsaWMgU3RyaW5nW10gZWNob1N0cmluZ0xpc3RBbHQoDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJkYXRhIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2dvcmlsbGFfZGx3L2RhdGEiKQ0KLSAgICAgICAgU3RyaW5nW10gZGF0YSkNCi0gICAgICAgIHRocm93cyBBc3NlcnRGYXVsdA0KLSAgICA7DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGRhdGENCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBqYXZhLnV0aWwuTGlzdDxqYXZhLnV0aWwuTGlzdDxqYXZhLmxhbmcuU3RyaW5nPj4NCi0gICAgICogQHRocm93cyBBc3NlcnRGYXVsdA0KLSAgICAgKi8NCi0gICAgQFdlYk1ldGhvZA0KLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAicmVzdWx0IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2dvcmlsbGFfZGx3L2RhdGEiKQ0KLSAgICBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gImVjaG9TdHJpbmdMaXN0QXJyYXkiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvZ29yaWxsYV9kbHcvZGF0YSIsIGNsYXNzTmFtZSA9ICJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnByb3h5LmdvcmlsbGFfZGx3LmRhdGEuRWNob1N0cmluZ0xpc3RBcnJheSIpDQotICAgIEBSZXNwb25zZVdyYXBwZXIobG9jYWxOYW1lID0gImVjaG9TdHJpbmdMaXN0QXJyYXlSZXNwb25zZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9nb3JpbGxhX2Rsdy9kYXRhIiwgY2xhc3NOYW1lID0gIm9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJveHkuZ29yaWxsYV9kbHcuZGF0YS5FY2hvU3RyaW5nTGlzdEFycmF5UmVzcG9uc2UiKQ0KLSAgICBwdWJsaWMgTGlzdDxMaXN0PFN0cmluZz4+IGVjaG9TdHJpbmdMaXN0QXJyYXkoDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJkYXRhIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2dvcmlsbGFfZGx3L2RhdGEiKQ0KLSAgICAgICAgTGlzdDxMaXN0PFN0cmluZz4+IGRhdGEpDQotICAgICAgICB0aHJvd3MgQXNzZXJ0RmF1bHQNCi0gICAgOw0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSBkYXRhDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgamF2YS51dGlsLkxpc3Q8amF2YS5sYW5nLlN0cmluZz4NCi0gICAgICogQHRocm93cyBBc3NlcnRGYXVsdA0KLSAgICAgKi8NCi0gICAgQFdlYk1ldGhvZA0KLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAicmVzdWx0IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2dvcmlsbGFfZGx3L2RhdGEiKQ0KLSAgICBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gImVjaG9TdHJpbmdBcnJheSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9nb3JpbGxhX2Rsdy9kYXRhIiwgY2xhc3NOYW1lID0gIm9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJveHkuZ29yaWxsYV9kbHcuZGF0YS5FY2hvU3RyaW5nQXJyYXkiKQ0KLSAgICBAUmVzcG9uc2VXcmFwcGVyKGxvY2FsTmFtZSA9ICJlY2hvU3RyaW5nQXJyYXlSZXNwb25zZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9nb3JpbGxhX2Rsdy9kYXRhIiwgY2xhc3NOYW1lID0gIm9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJveHkuZ29yaWxsYV9kbHcuZGF0YS5FY2hvU3RyaW5nQXJyYXlSZXNwb25zZSIpDQotICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZWNob1N0cmluZ0FycmF5KA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiZGF0YSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9nb3JpbGxhX2Rsdy9kYXRhIikNCi0gICAgICAgIExpc3Q8U3RyaW5nPiBkYXRhKQ0KLSAgICAgICAgdGhyb3dzIEFzc2VydEZhdWx0DQotICAgIDsNCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGRhdGENCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBTdHJpbmdbXQ0KLSAgICAgKiBAdGhyb3dzIEFzc2VydEZhdWx0DQotICAgICAqLw0KLSAgICAvLyAgTk9URTogVGhlIHJldHVybiBhbmQgcGFyYW0gYXJlIG1hbnVhbGx5IGNoYW5nZWQgZnJvbSBMaXN0PFN0cmluZz4gdG8gU3RyaW5nW10NCi0gICAgQFdlYk1ldGhvZA0KLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAicmVzdWx0IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2dvcmlsbGFfZGx3L2RhdGEiKQ0KLSAgICBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gImVjaG9TdHJpbmdBcnJheUFsdCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9nb3JpbGxhX2Rsdy9kYXRhIiwgY2xhc3NOYW1lID0gIm9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJveHkuZ29yaWxsYV9kbHcuZGF0YS5FY2hvU3RyaW5nQXJyYXlBbHQiKQ0KLSAgICBAUmVzcG9uc2VXcmFwcGVyKGxvY2FsTmFtZSA9ICJlY2hvU3RyaW5nQXJyYXlBbHRSZXNwb25zZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9nb3JpbGxhX2Rsdy9kYXRhIiwgY2xhc3NOYW1lID0gIm9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJveHkuZ29yaWxsYV9kbHcuZGF0YS5FY2hvU3RyaW5nQXJyYXlBbHRSZXNwb25zZSIpDQotICAgIHB1YmxpYyBTdHJpbmdbXSBlY2hvU3RyaW5nQXJyYXlBbHQoDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJkYXRhIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2dvcmlsbGFfZGx3L2RhdGEiKQ0KLSAgICAgICAgU3RyaW5nW10gZGF0YSkNCi0gICAgICAgIHRocm93cyBBc3NlcnRGYXVsdA0KLSAgICA7DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGRhdGENCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBqYXZhLnV0aWwuTGlzdDxqYXZhLmxhbmcuU3RyaW5nPg0KLSAgICAgKiBAdGhyb3dzIEFzc2VydEZhdWx0DQotICAgICAqLw0KLSAgICBAV2ViTWV0aG9kDQotICAgIEBXZWJSZXN1bHQobmFtZSA9ICJyZXN1bHQiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvZ29yaWxsYV9kbHcvZGF0YSIpDQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAiZWNob0luZGV4ZWRTdHJpbmdBcnJheSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9nb3JpbGxhX2Rsdy9kYXRhIiwgY2xhc3NOYW1lID0gIm9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJveHkuZ29yaWxsYV9kbHcuZGF0YS5FY2hvSW5kZXhlZFN0cmluZ0FycmF5IikNCi0gICAgQFJlc3BvbnNlV3JhcHBlcihsb2NhbE5hbWUgPSAiZWNob0luZGV4ZWRTdHJpbmdBcnJheVJlc3BvbnNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2dvcmlsbGFfZGx3L2RhdGEiLCBjbGFzc05hbWUgPSAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm94eS5nb3JpbGxhX2Rsdy5kYXRhLkVjaG9JbmRleGVkU3RyaW5nQXJyYXlSZXNwb25zZSIpDQotICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZWNob0luZGV4ZWRTdHJpbmdBcnJheSgNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImRhdGEiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvZ29yaWxsYV9kbHcvZGF0YSIpDQotICAgICAgICBMaXN0PFN0cmluZz4gZGF0YSkNCi0gICAgICAgIHRocm93cyBBc3NlcnRGYXVsdA0KLSAgICA7DQotICAgIA0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSBkYXRhDQotICAgICAqIEBwYXJhbSBpbm91dA0KLSAgICAgKiBAdGhyb3dzIEFzc2VydEZhdWx0DQotICAgICAqLw0KLSAgICBAV2ViTWV0aG9kDQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAiZWNob1N0cmluZzJBcnJheSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9nb3JpbGxhX2Rsdy9kYXRhIiwgY2xhc3NOYW1lID0gIm9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJveHkuZ29yaWxsYV9kbHcuZGF0YS5FY2hvU3RyaW5nMkFycmF5IikNCi0gICAgQFJlc3BvbnNlV3JhcHBlcihsb2NhbE5hbWUgPSAiZWNob1N0cmluZzJBcnJheVJlc3BvbnNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2dvcmlsbGFfZGx3L2RhdGEiLCBjbGFzc05hbWUgPSAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm94eS5nb3JpbGxhX2Rsdy5kYXRhLkVjaG9TdHJpbmcyQXJyYXlSZXNwb25zZSIpDQotICAgIHB1YmxpYyB2b2lkIGVjaG9TdHJpbmcyQXJyYXkoDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJkYXRhIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2dvcmlsbGFfZGx3L2RhdGEiKQ0KLSAgICAgICAgTGlzdDxTdHJpbmc+IGRhdGEsDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJpbm91dCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9nb3JpbGxhX2Rsdy9kYXRhIiwgbW9kZSA9IE1vZGUuSU5PVVQpDQotICAgICAgICBIb2xkZXI8TGlzdDxTdHJpbmc+PiBpbm91dCkNCi0gICAgICAgIHRocm93cyBBc3NlcnRGYXVsdA0KLSAgICA7DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGRhdGENCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBqYXZhLnV0aWwuTGlzdDxqYXZhLmxhbmcuSW50ZWdlcj4NCi0gICAgICogQHRocm93cyBBc3NlcnRGYXVsdA0KLSAgICAgKi8NCi0gICAgQFdlYk1ldGhvZA0KLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAicmVzdWx0IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2dvcmlsbGFfZGx3L2RhdGEiKQ0KLSAgICBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gImVjaG9JbnRBcnJheSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9nb3JpbGxhX2Rsdy9kYXRhIiwgY2xhc3NOYW1lID0gIm9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJveHkuZ29yaWxsYV9kbHcuZGF0YS5FY2hvSW50QXJyYXkiKQ0KLSAgICBAUmVzcG9uc2VXcmFwcGVyKGxvY2FsTmFtZSA9ICJlY2hvSW50QXJyYXlSZXNwb25zZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9nb3JpbGxhX2Rsdy9kYXRhIiwgY2xhc3NOYW1lID0gIm9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJveHkuZ29yaWxsYV9kbHcuZGF0YS5FY2hvSW50QXJyYXlSZXNwb25zZSIpDQotICAgIHB1YmxpYyBMaXN0PEludGVnZXI+IGVjaG9JbnRBcnJheSgNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImRhdGEiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvZ29yaWxsYV9kbHcvZGF0YSIpDQotICAgICAgICBMaXN0PEludGVnZXI+IGRhdGEpDQotICAgICAgICB0aHJvd3MgQXNzZXJ0RmF1bHQNCi0gICAgOw0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSBkYXRhDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgamF2YS51dGlsLkxpc3Q8b3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm94eS5nb3JpbGxhX2Rsdy5kYXRhLkZydWl0Pg0KLSAgICAgKiBAdGhyb3dzIEFzc2VydEZhdWx0DQotICAgICAqLw0KLSAgICBAV2ViTWV0aG9kDQotICAgIEBXZWJSZXN1bHQobmFtZSA9ICJyZXN1bHQiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvZ29yaWxsYV9kbHcvZGF0YSIpDQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAiZWNob0VudW1BcnJheSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9nb3JpbGxhX2Rsdy9kYXRhIiwgY2xhc3NOYW1lID0gIm9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJveHkuZ29yaWxsYV9kbHcuZGF0YS5FY2hvRW51bUFycmF5IikNCi0gICAgQFJlc3BvbnNlV3JhcHBlcihsb2NhbE5hbWUgPSAiZWNob0VudW1BcnJheVJlc3BvbnNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2dvcmlsbGFfZGx3L2RhdGEiLCBjbGFzc05hbWUgPSAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm94eS5nb3JpbGxhX2Rsdy5kYXRhLkVjaG9FbnVtQXJyYXlSZXNwb25zZSIpDQotICAgIHB1YmxpYyBMaXN0PEZydWl0PiBlY2hvRW51bUFycmF5KA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiZGF0YSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9nb3JpbGxhX2Rsdy9kYXRhIikNCi0gICAgICAgIExpc3Q8RnJ1aXQ+IGRhdGEpDQotICAgICAgICB0aHJvd3MgQXNzZXJ0RmF1bHQNCi0gICAgOw0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSBkYXRhDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgamF2YS51dGlsLkxpc3Q8amF2YS5sYW5nLk9iamVjdD4NCi0gICAgICogQHRocm93cyBBc3NlcnRGYXVsdA0KLSAgICAgKi8NCi0gICAgQFdlYk1ldGhvZA0KLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAicmVzdWx0IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2dvcmlsbGFfZGx3L2RhdGEiKQ0KLSAgICBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gImVjaG9BbnlUeXBlQXJyYXkiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvZ29yaWxsYV9kbHcvZGF0YSIsIGNsYXNzTmFtZSA9ICJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnByb3h5LmdvcmlsbGFfZGx3LmRhdGEuRWNob0FueVR5cGVBcnJheSIpDQotICAgIEBSZXNwb25zZVdyYXBwZXIobG9jYWxOYW1lID0gImVjaG9BbnlUeXBlQXJyYXlSZXNwb25zZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9nb3JpbGxhX2Rsdy9kYXRhIiwgY2xhc3NOYW1lID0gIm9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJveHkuZ29yaWxsYV9kbHcuZGF0YS5FY2hvQW55VHlwZUFycmF5UmVzcG9uc2UiKQ0KLSAgICBwdWJsaWMgTGlzdDxPYmplY3Q+IGVjaG9BbnlUeXBlQXJyYXkoDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJkYXRhIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2dvcmlsbGFfZGx3L2RhdGEiKQ0KLSAgICAgICAgTGlzdDxPYmplY3Q+IGRhdGEpDQotICAgICAgICB0aHJvd3MgQXNzZXJ0RmF1bHQNCi0gICAgOw0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSByZXF1ZXN0ZWRUZXJtaW5hdGlvblRpbWUNCi0gICAgICogQHBhcmFtIHJlcXVlc3RlZExpZmV0aW1lRHVyYXRpb24NCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBqYXZheC54bWwuZGF0YXR5cGUuWE1MR3JlZ29yaWFuQ2FsZW5kYXINCi0gICAgICovDQotICAgIEBXZWJNZXRob2QNCi0gICAgQFdlYlJlc3VsdChuYW1lID0gInJlc3BvbnNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2dvcmlsbGFfZGx3L2RhdGEiKQ0KLSAgICBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gImVjaG9EYXRlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2dvcmlsbGFfZGx3L2RhdGEiLCBjbGFzc05hbWUgPSAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm94eS5nb3JpbGxhX2Rsdy5kYXRhLkVjaG9EYXRlIikNCi0gICAgQFJlc3BvbnNlV3JhcHBlcihsb2NhbE5hbWUgPSAiZWNob0RhdGVSZXNwb25zZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9nb3JpbGxhX2Rsdy9kYXRhIiwgY2xhc3NOYW1lID0gIm9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJveHkuZ29yaWxsYV9kbHcuZGF0YS5FY2hvRGF0ZVJlc3BvbnNlIikNCi0gICAgcHVibGljIFhNTEdyZWdvcmlhbkNhbGVuZGFyIGVjaG9EYXRlKA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiUmVxdWVzdGVkVGVybWluYXRpb25UaW1lIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2dvcmlsbGFfZGx3L2RhdGEiKQ0KLSAgICAgICAgWE1MR3JlZ29yaWFuQ2FsZW5kYXIgcmVxdWVzdGVkVGVybWluYXRpb25UaW1lLA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiUmVxdWVzdGVkTGlmZXRpbWVEdXJhdGlvbiIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9nb3JpbGxhX2Rsdy9kYXRhIikNCi0gICAgICAgIER1cmF0aW9uIHJlcXVlc3RlZExpZmV0aW1lRHVyYXRpb24pOw0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSByZXF1ZXN0DQotICAgICAqLw0KLSAgICBAV2ViTWV0aG9kDQotICAgIEBPbmV3YXkNCi0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJlY2hvUG9seW1vcnBoaWNEYXRlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2dvcmlsbGFfZGx3L2RhdGEiLCBjbGFzc05hbWUgPSAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm94eS5nb3JpbGxhX2Rsdy5kYXRhLkVjaG9Qb2x5bW9ycGhpY0RhdGUiKQ0KLSAgICBwdWJsaWMgdm9pZCBlY2hvUG9seW1vcnBoaWNEYXRlKA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAicmVxdWVzdCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9nb3JpbGxhX2Rsdy9kYXRhIikNCi0gICAgICAgIFhNTEdyZWdvcmlhbkNhbGVuZGFyIHJlcXVlc3QpOw0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvZ29yaWxsYV9kbHcvc2VpL0dvcmlsbGFTZXJ2aWNlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvZ29yaWxsYV9kbHcvc2VpL0dvcmlsbGFTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1NjBhZDQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2dvcmlsbGFfZGx3L3NlaS9Hb3JpbGxhU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotDQotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm94eS5nb3JpbGxhX2Rsdy5zZWk7DQotDQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViRW5kcG9pbnQ7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlQ2xpZW50Ow0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247DQotaW1wb3J0IGphdmEubmV0LlVSTDsNCi0NCi0vKioNCi0gKiBUaGlzIGNsYXNzIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIEpBWFdTIFNJLg0KLSAqIEpBWC1XUyBSSSAyLjBfMDEtYjE1LWZjcw0KLSAqIEdlbmVyYXRlZCBzb3VyY2UgdmVyc2lvbjogMi4wDQotICogDQotICovDQotQFdlYlNlcnZpY2VDbGllbnQobmFtZSA9ICJHb3JpbGxhU2VydmljZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9nb3JpbGxhX2RsdyIsIHdzZGxMb2NhdGlvbiA9ICJnb3JpbGxhX2Rsdy53c2RsIikNCi1wdWJsaWMgY2xhc3MgR29yaWxsYVNlcnZpY2UNCi0gICAgZXh0ZW5kcyBTZXJ2aWNlDQotew0KLQ0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBVUkwgR09SSUxMQVNFUlZJQ0VfV1NETF9MT0NBVElPTjsNCi0NCi0gICAgc3RhdGljIHsNCi0gICAgICAgIFVSTCB1cmwgPSBudWxsOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICB1cmwgPSBuZXcgVVJMKCJmaWxlOi9DOi9jb21wd3NkbC9nb3JpbGxhX2Rsdy53c2RsIik7DQotICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICB9DQotICAgICAgICBHT1JJTExBU0VSVklDRV9XU0RMX0xPQ0FUSU9OID0gdXJsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBHb3JpbGxhU2VydmljZShVUkwgd3NkbExvY2F0aW9uLCBRTmFtZSBzZXJ2aWNlTmFtZSkgew0KLSAgICAgICAgc3VwZXIod3NkbExvY2F0aW9uLCBzZXJ2aWNlTmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEdvcmlsbGFTZXJ2aWNlKCkgew0KLSAgICAgICAgc3VwZXIoR09SSUxMQVNFUlZJQ0VfV1NETF9MT0NBVElPTiwgbmV3IFFOYW1lKCJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9nb3JpbGxhX2RsdyIsICJHb3JpbGxhU2VydmljZSIpKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgR29yaWxsYUludGVyZmFjZQ0KLSAgICAgKi8NCi0gICAgQFdlYkVuZHBvaW50KG5hbWUgPSAiR29yaWxsYVBvcnQiKQ0KLSAgICBwdWJsaWMgR29yaWxsYUludGVyZmFjZSBnZXRHb3JpbGxhUG9ydCgpIHsNCi0gICAgICAgIHJldHVybiAoR29yaWxsYUludGVyZmFjZSlzdXBlci5nZXRQb3J0KG5ldyBRTmFtZSgiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvZ29yaWxsYV9kbHciLCAiR29yaWxsYVBvcnQiKSwgR29yaWxsYUludGVyZmFjZS5jbGFzcyk7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L3JwY2xpdC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9ycGNsaXQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmNGI1NjguLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L3JwY2xpdC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMA0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9ycGNsaXQvTUVUQS1JTkYvUlBDTGl0LndzZGwgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvcnBjbGl0L01FVEEtSU5GL1JQQ0xpdC53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODc2YjYxLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9ycGNsaXQvTUVUQS1JTkYvUlBDTGl0LndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSw2MjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi0NCi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08d3NkbDpkZWZpbml0aW9ucyB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L3JwY2xpdCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB4bWxuczphcGFjaGVzb2FwPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveG1sLXNvYXAiIHhtbG5zOmltcGw9Imh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L3JwY2xpdCIgeG1sbnM6aW50Zj0iaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvcnBjbGl0IiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIgeG1sbnM6d3NkbHNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPg0KLSA8d3NkbDp0eXBlcz4NCi0gIDxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9ycGNsaXQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+DQotICANCi0gIDwhLS0gRXhhbXBsZSBvZiBhIFFOYW1lIGxpc3QuICBUaGlzIHNob3VsZCBtYXAgdG8gamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZVtdIC0tPg0KLSAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJRTmFtZUxpc3QiPg0KLSAgICAgIDx4c2Q6bGlzdCBpdGVtVHlwZT0ieHNkOlFOYW1lIi8+DQotICAgPC94c2Q6c2ltcGxlVHlwZT4NCi0gICA8ZWxlbWVudCBuYW1lPSJRTmFtZUxpc3QiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJpbXBsOlFOYW1lTGlzdCIvPg0KLQ0KLSAgPCEtLSBFeGFtcGxlIG9mIGEgQ2FsZW5kYXIgbGlzdC4gIFRoaXMgc2hvdWxkIG1hcCB0byBqYXZhLnV0aWwuQ2FsZW5kYXJbXSAtLT4NCi0gICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iQ2FsZW5kYXJMaXN0Ij4gICANCi0gICAgICA8eHNkOmxpc3QgaXRlbVR5cGU9InhzZDpkYXRlVGltZSIvPiANCi0gICA8L3hzZDpzaW1wbGVUeXBlPiAgICAgICAgICAgICAgICAgDQotICAgPGVsZW1lbnQgbmFtZT0iQ2FsZW5kYXJMaXN0IiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0iaW1wbDpDYWxlbmRhckxpc3QiLz4NCi0gIA0KLSAgPCEtLSBFeGFtcGxlIG9mIGEgU3RyaW5nIGxpc3QuICBUaGlzIHNob3VsZCBtYXAgdG8gamF2YS5sYW5nLlN0cmluZ1tdIC0tPg0KLSAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJTdHJpbmdMaXN0Ij4gICANCi0gICAgICA8eHNkOmxpc3QgaXRlbVR5cGU9InhzZDpzdHJpbmciLz4gDQotICAgPC94c2Q6c2ltcGxlVHlwZT4NCi0gICA8ZWxlbWVudCBuYW1lPSJTdHJpbmdMaXN0IiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0iaW1wbDpTdHJpbmdMaXN0Ii8+DQotICANCi0gIDwhLS0gRXhhbXBsZSBvZiBhIHhzZDpuZWdhdGl2ZUludGVnZXIgbGlzdC4gIFRoaXMgc2hvdWxkIG1hcCB0byBqYXZhLm1hdGguQmlnSW50ZWdlcltdIC0tPg0KLSAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJCaWdJbnRlZ2VyTGlzdCI+DQotICAgICAgPHhzZDpyZXN0cmljdGlvbj4gICAgIA0KLSAgICAgICAgICA8eHNkOnNpbXBsZVR5cGU+IA0KLSAgICAgICAgICAgICA8eHNkOmxpc3QgaXRlbVR5cGU9InhzZDpuZWdhdGl2ZUludGVnZXIiLz4NCi0gICAgICAgICAgPC94c2Q6c2ltcGxlVHlwZT4NCi0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4NCi0gICA8L3hzZDpzaW1wbGVUeXBlPg0KLSAgIDxlbGVtZW50IG5hbWU9IkJpZ0ludGVnZXJMaXN0IiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0iaW1wbDpCaWdJbnRlZ2VyTGlzdCIvPg0KLSAgDQotICA8IS0tIEV4YW1wbGUgb2YgYSB4c2Q6dW5zaWduZWRJbnQgbGlzdC4gIFRoaXMgc2hvdWxkIG1hcCB0byBsb25nW10gLS0+DQotICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkxvbmdMaXN0Ij4NCi0gICAgICA8eHNkOmxpc3Q+DQotICAgICAgICAgIDx4c2Q6c2ltcGxlVHlwZT4NCi0gICAgICAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dW5zaWduZWRJbnQiLz4NCi0gICAgICAgICAgPC94c2Q6c2ltcGxlVHlwZT4NCi0gICAgICA8L3hzZDpsaXN0Pg0KLSAgIDwveHNkOnNpbXBsZVR5cGU+DQotICAgPGVsZW1lbnQgbmFtZT0iTG9uZ0xpc3QiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJpbXBsOkxvbmdMaXN0Ii8+DQotICAgDQotICA8IS0tIEV4YW1wbGUgb2YgYW4gRW51bWVyYXRpb24gdHlwZS4gIFRoaXMgc2hvdWxkIG1hcCB0byBFbnVtLmphdmEgLS0+ICANCi0gICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iRW51bSI+DQotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4NCi0gICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ib25lIi8+ICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ0d28iLz4gICAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ0aHJlZSIvPiAgICAgICAgICAgICAgICAgICAgDQotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+DQotICAgPC94c2Q6c2ltcGxlVHlwZT4NCi0gICA8ZWxlbWVudCBuYW1lPSJFbnVtIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0iaW1wbDpFbnVtIi8+DQotIA0KLSAgPCEtLSBFeGFtcGxlIG9mIGEgeHNkOmVudW1lcmF0aW9uIGxpc3QuICBUaGlzIHNob3VsZCBtYXAgdG8gRW51bVtdIC0tPiAgDQotICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkVudW1MaXN0Ij4NCi0gICAgICA8eHNkOmxpc3QgaXRlbVR5cGU9ImltcGw6RW51bSIvPiANCi0gICA8L3hzZDpzaW1wbGVUeXBlPg0KLSAgIDxlbGVtZW50IG5hbWU9IkVudW1MaXN0IiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0iaW1wbDpFbnVtTGlzdCIvPg0KLSAgDQotICA8IS0tIEV4YW1wbGUgb2YgYSB4c2Q6ZW51bWVyYXRpb24gZW1iZWRkZWQgbGlzdC4gIFRoaXMgc2hvdWxkIG1hcCB0byBFbnVtTGlzdDJbXSAtLT4gDQotICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkVudW1MaXN0MiI+DQotICAgICAgPHhzZDpsaXN0Pg0KLSAgICAgICAgICA8eHNkOnNpbXBsZVR5cGU+DQotICAgICAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4NCi0gICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxlIiAvPg0KLSAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JhbmdlIiAvPg0KLSAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JhcGUiIC8+DQotICAgICAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+DQotICAgICAgICAgIDwveHNkOnNpbXBsZVR5cGU+DQotICAgICAgPC94c2Q6bGlzdD4NCi0gICA8L3hzZDpzaW1wbGVUeXBlPg0KLSAgIDxlbGVtZW50IG5hbWU9IkVudW1MaXN0MiIgbmlsbGFibGU9InRydWUiIHR5cGU9ImltcGw6RW51bUxpc3QyIi8+IA0KLQ0KLSAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29tcGxleEFsbCI+DQotICAgICAgPHhzZDphbGw+DQotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJteUludCIgdHlwZT0ieHNkOmludCIvPg0KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibXlTdHJpbmciIHR5cGU9InhzZDpzdHJpbmciLz4NCi0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkVudW0iIHR5cGU9ImltcGw6RW51bSIvPg0KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibXlRTmFtZUxpc3QiIHR5cGU9ImltcGw6UU5hbWVMaXN0Ii8+DQotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJteUNhbGVuZGFyTGlzdCIgdHlwZT0iaW1wbDpDYWxlbmRhckxpc3QiLz4NCi0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im15U3RyaW5nTGlzdCIgdHlwZT0iaW1wbDpTdHJpbmdMaXN0Ii8+DQotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJteUJpZ0ludGVnZXJMaXN0IiB0eXBlPSJpbXBsOkJpZ0ludGVnZXJMaXN0Ii8+DQotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJteUxvbmdMaXN0IiB0eXBlPSJpbXBsOkxvbmdMaXN0Ii8+DQotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJteUVudW1MaXN0IiB0eXBlPSJpbXBsOkVudW1MaXN0Ii8+DQotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJteUVudW1MaXN0MiIgdHlwZT0iaW1wbDpFbnVtTGlzdDIiLz4NCi0gICAgICA8L3hzZDphbGw+DQotICAgPC94c2Q6Y29tcGxleFR5cGU+DQotICAgDQotICAgPHhzZDplbGVtZW50IG5hbWU9ImhlYWRlclBhcmFtIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPg0KLSAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJoZWFkZXJSZXR1cm4iIHR5cGU9InhzZDpzdHJpbmciIC8+DQotICAgDQotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJteUZhdWx0IiB0eXBlPSJ4c2Q6aW50IiAvPg0KLSAgPC9zY2hlbWE+DQotIDwvd3NkbDp0eXBlcz4NCi0NCi0gICA8d3NkbDptZXNzYWdlIG5hbWU9InRlc3RMaXN0c1Jlc3BvbnNlIj4NCi0NCi0gICAgICA8d3NkbDpwYXJ0IG5hbWU9InRlc3RMaXN0c1JldHVybiIgdHlwZT0iaW1wbDpRTmFtZUxpc3QiLz4NCi0NCi0gICA8L3dzZGw6bWVzc2FnZT4NCi0NCi0gICA8d3NkbDptZXNzYWdlIG5hbWU9InRlc3RMaXN0c1JlcXVlc3QiPg0KLQ0KLSAgICAgIDx3c2RsOnBhcnQgbmFtZT0iYXJnXzBfMCIgdHlwZT0iaW1wbDpRTmFtZUxpc3QiLz4NCi0NCi0gICAgICA8d3NkbDpwYXJ0IG5hbWU9ImFyZ18xXzAiIHR5cGU9ImltcGw6Q2FsZW5kYXJMaXN0Ii8+DQotDQotICAgICAgPHdzZGw6cGFydCBuYW1lPSJhcmdfMl8wIiB0eXBlPSJpbXBsOlN0cmluZ0xpc3QiLz4NCi0gICAgICANCi0gICAgICA8d3NkbDpwYXJ0IG5hbWU9ImFyZ18zXzAiIHR5cGU9ImltcGw6QmlnSW50ZWdlckxpc3QiLz4NCi0gICAgICANCi0gICAgICA8d3NkbDpwYXJ0IG5hbWU9ImFyZ180XzAiIHR5cGU9ImltcGw6TG9uZ0xpc3QiLz4NCi0gICAgICANCi0gICAgICA8d3NkbDpwYXJ0IG5hbWU9ImFyZ181XzAiIHR5cGU9ImltcGw6RW51bUxpc3QiLz4NCi0gICAgICANCi0gICAgICA8d3NkbDpwYXJ0IG5hbWU9ImFyZ183XzAiIHR5cGU9ImltcGw6RW51bUxpc3QyIi8+DQotICAgICAgDQotICAgICAgPHdzZGw6cGFydCBuYW1lPSJhcmdfNl8wIiB0eXBlPSJpbXBsOmNvbXBsZXhBbGwiLz4NCi0NCi0gICA8L3dzZGw6bWVzc2FnZT4NCi0gICANCi0gICANCi0gICA8d3NkbDptZXNzYWdlIG5hbWU9InRlc3RDYWxlbmRhckxpc3QxUmVzcG9uc2UiPg0KLQ0KLSAgICAgIDx3c2RsOnBhcnQgbmFtZT0idGVzdENhbGVuZGFyTGlzdDFSZXR1cm4iIHR5cGU9ImltcGw6Q2FsZW5kYXJMaXN0Ii8+DQotDQotICAgPC93c2RsOm1lc3NhZ2U+DQotDQotICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJ0ZXN0Q2FsZW5kYXJMaXN0MVJlcXVlc3QiPg0KLQ0KLSAgICAgIDx3c2RsOnBhcnQgbmFtZT0iYXJnXzFfMCIgdHlwZT0iaW1wbDpDYWxlbmRhckxpc3QiLz4NCi0NCi0gICA8L3dzZGw6bWVzc2FnZT4NCi0gICANCi0gICA8d3NkbDptZXNzYWdlIG5hbWU9InRlc3RTdHJpbmdMaXN0MlJlc3BvbnNlIj4NCi0NCi0gICAgICA8d3NkbDpwYXJ0IG5hbWU9InRlc3RTdHJpbmdMaXN0MlJldHVybiIgdHlwZT0iaW1wbDpTdHJpbmdMaXN0Ii8+DQotDQotICAgPC93c2RsOm1lc3NhZ2U+DQotDQotICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJ0ZXN0U3RyaW5nTGlzdDJSZXF1ZXN0Ij4NCi0NCi0gICAgICA8d3NkbDpwYXJ0IG5hbWU9ImFyZ18yXzAiIHR5cGU9ImltcGw6U3RyaW5nTGlzdCIvPg0KLQ0KLSAgIDwvd3NkbDptZXNzYWdlPg0KLSAgIA0KLSAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0idGVzdEJpZ0ludGVnZXJMaXN0M1Jlc3BvbnNlIj4NCi0NCi0gICAgICA8d3NkbDpwYXJ0IG5hbWU9InRlc3RCaWdJbnRlZ2VyTGlzdDNSZXR1cm4iIHR5cGU9ImltcGw6QmlnSW50ZWdlckxpc3QiLz4NCi0NCi0gICA8L3dzZGw6bWVzc2FnZT4NCi0NCi0gICA8d3NkbDptZXNzYWdlIG5hbWU9InRlc3RCaWdJbnRlZ2VyTGlzdDNSZXF1ZXN0Ij4NCi0NCi0gICAgICA8d3NkbDpwYXJ0IG5hbWU9ImFyZ18zXzAiIHR5cGU9ImltcGw6QmlnSW50ZWdlckxpc3QiLz4NCi0NCi0gICA8L3dzZGw6bWVzc2FnZT4NCi0gICANCi0gICA8d3NkbDptZXNzYWdlIG5hbWU9InRlc3RMb25nTGlzdDRSZXNwb25zZSI+DQotDQotICAgICAgPHdzZGw6cGFydCBuYW1lPSJ0ZXN0TG9uZ0xpc3Q0UmV0dXJuIiB0eXBlPSJpbXBsOkxvbmdMaXN0Ii8+DQotDQotICAgPC93c2RsOm1lc3NhZ2U+DQotDQotICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJ0ZXN0TG9uZ0xpc3Q0UmVxdWVzdCI+DQotDQotICAgICAgPHdzZGw6cGFydCBuYW1lPSJhcmdfNF8wIiB0eXBlPSJpbXBsOkxvbmdMaXN0Ii8+DQotDQotICAgPC93c2RsOm1lc3NhZ2U+DQotICAgDQotICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJ0ZXN0RW51bUxpc3Q1UmVzcG9uc2UiPg0KLQ0KLSAgICAgIDx3c2RsOnBhcnQgbmFtZT0idGVzdEVudW1MaXN0NVJldHVybiIgdHlwZT0iaW1wbDpFbnVtTGlzdCIvPg0KLQ0KLSAgIDwvd3NkbDptZXNzYWdlPg0KLQ0KLSAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0idGVzdEVudW1MaXN0NVJlcXVlc3QiPg0KLQ0KLSAgICAgIDx3c2RsOnBhcnQgbmFtZT0iYXJnXzVfMCIgdHlwZT0iaW1wbDpFbnVtTGlzdCIvPg0KLQ0KLSAgIDwvd3NkbDptZXNzYWdlPg0KLSAgIA0KLSAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0idGVzdEVudW1MaXN0N1Jlc3BvbnNlIj4NCi0NCi0gICAgICA8d3NkbDpwYXJ0IG5hbWU9InRlc3RFbnVtTGlzdDdSZXR1cm4iIHR5cGU9ImltcGw6RW51bUxpc3QyIi8+DQotDQotICAgPC93c2RsOm1lc3NhZ2U+DQotDQotICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJ0ZXN0RW51bUxpc3Q3UmVxdWVzdCI+DQotDQotICAgICAgPHdzZGw6cGFydCBuYW1lPSJhcmdfN18wIiB0eXBlPSJpbXBsOkVudW1MaXN0MiIvPg0KLQ0KLSAgIDwvd3NkbDptZXNzYWdlPg0KLQ0KLSAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0idGVzdENvbXBsZXhBbGw2UmVzcG9uc2UiPg0KLQ0KLSAgICAgIDx3c2RsOnBhcnQgbmFtZT0idGVzdENvbXBsZXhBbGw2UmV0dXJuIiB0eXBlPSJpbXBsOmNvbXBsZXhBbGwiLz4NCi0NCi0gICA8L3dzZGw6bWVzc2FnZT4NCi0NCi0gICA8d3NkbDptZXNzYWdlIG5hbWU9InRlc3RDb21wbGV4QWxsNlJlcXVlc3QiPg0KLQ0KLSAgICAgIDx3c2RsOnBhcnQgbmFtZT0iYXJnXzZfMCIgdHlwZT0iaW1wbDpjb21wbGV4QWxsIi8+DQotDQotICAgPC93c2RsOm1lc3NhZ2U+DQotDQotICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJ0ZXN0U2ltcGxlUmVxdWVzdCI+DQotDQotICAgICAgPHdzZGw6cGFydCBuYW1lPSJzaW1wbGVJbiIgdHlwZT0ieHNkOnN0cmluZyIvPg0KLQ0KLSAgIDwvd3NkbDptZXNzYWdlPg0KLQ0KLSAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0idGVzdFNpbXBsZVJlc3BvbnNlIj4NCi0NCi0gICAgICA8d3NkbDpwYXJ0IG5hbWU9InNpbXBsZU91dCIgdHlwZT0ieHNkOnN0cmluZyIvPg0KLQ0KLSAgIDwvd3NkbDptZXNzYWdlPg0KLSAgIA0KLSAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0idGVzdFNpbXBsZUluT3V0UmVxdWVzdCI+DQotDQotICAgICAgPHdzZGw6cGFydCBuYW1lPSJzaW1wbGVJbk91dCIgdHlwZT0ieHNkOnN0cmluZyIvPg0KLQ0KLSAgIDwvd3NkbDptZXNzYWdlPg0KLQ0KLSAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0idGVzdFNpbXBsZUluT3V0UmVzcG9uc2UiPg0KLQ0KLSAgICAgIDx3c2RsOnBhcnQgbmFtZT0ic2ltcGxlT3V0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+DQotICAgICAgPHdzZGw6cGFydCBuYW1lPSJzaW1wbGVJbk91dCIgdHlwZT0ieHNkOnN0cmluZyIvPg0KLQ0KLSAgIDwvd3NkbDptZXNzYWdlPg0KLSAgIA0KLSAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0idGVzdFNpbXBsZTJSZXF1ZXN0Ij4NCi0NCi0gICAgICA8d3NkbDpwYXJ0IG5hbWU9InNpbXBsZTJJbjEiIHR5cGU9InhzZDpzdHJpbmciLz4NCi0gICAgICA8d3NkbDpwYXJ0IG5hbWU9InNpbXBsZTJJbjEiIHR5cGU9InhzZDpzdHJpbmciLz4NCi0NCi0gICA8L3dzZGw6bWVzc2FnZT4NCi0NCi0gICA8d3NkbDptZXNzYWdlIG5hbWU9InRlc3RTaW1wbGUyUmVzcG9uc2UiPg0KLQ0KLSAgICAgIDx3c2RsOnBhcnQgbmFtZT0ic2ltcGxlMk91dCIgdHlwZT0ieHNkOnN0cmluZyIvPg0KLQ0KLSAgIDwvd3NkbDptZXNzYWdlPg0KLSAgIA0KLSAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0idGVzdEhlYWRlclJlcXVlc3QiPg0KLQ0KLSAgICAgIDx3c2RsOnBhcnQgbmFtZT0iYm9keVBhcmFtIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+DQotICAgICAgPHdzZGw6cGFydCBuYW1lPSJoZWFkZXJQYXJhbSIgZWxlbWVudD0iaW1wbDpoZWFkZXJQYXJhbSIvPg0KLQ0KLSAgIDwvd3NkbDptZXNzYWdlPg0KLQ0KLSAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0idGVzdEhlYWRlclJlc3BvbnNlIj4NCi0NCi0gICAgICA8d3NkbDpwYXJ0IG5hbWU9ImhlYWRlclJldHVybiIgdHlwZT0iaW1wbDpoZWFkZXJSZXR1cm4iIC8+DQotDQotICAgPC93c2RsOm1lc3NhZ2U+DQotICAgDQotICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJ0ZXN0RmF1bHRSZXF1ZXN0IiAvPg0KLSAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0idGVzdEZhdWx0UmVzcG9uc2UiIC8+DQotICAgDQotICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJycGNGYXVsdCI+DQotICAgICA8d3NkbDpwYXJ0IG5hbWU9InJwY0ZhdWx0IiBlbGVtZW50PSJpbXBsOm15RmF1bHQiIC8+DQotICAgPC93c2RsOm1lc3NhZ2U+DQotDQotICAgPHdzZGw6cG9ydFR5cGUgbmFtZT0iUlBDTGl0Ij4NCi0gICAgIA0KLSAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJ0ZXN0U2ltcGxlIiBwYXJhbWV0ZXJPcmRlcj0ic2ltcGxlSW4iPg0KLQ0KLSAgICAgICAgIDx3c2RsOmlucHV0IG1lc3NhZ2U9ImltcGw6dGVzdFNpbXBsZVJlcXVlc3QiIG5hbWU9InRlc3RTaW1wbGVSZXF1ZXN0Ii8+DQotDQotICAgICAgICAgPHdzZGw6b3V0cHV0IG1lc3NhZ2U9ImltcGw6dGVzdFNpbXBsZVJlc3BvbnNlIiBuYW1lPSJ0ZXN0U2ltcGxlUmVzcG9uc2UiLz4NCi0NCi0gICAgICA8L3dzZGw6b3BlcmF0aW9uPg0KLSAgICAgIA0KLSAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0idGVzdFNpbXBsZUluT3V0IiBwYXJhbWV0ZXJPcmRlcj0ic2ltcGxlSW5PdXQiPg0KLQ0KLSAgICAgICAgIDx3c2RsOmlucHV0IG1lc3NhZ2U9ImltcGw6dGVzdFNpbXBsZUluT3V0UmVxdWVzdCIgbmFtZT0idGVzdFNpbXBsZUluT3V0UmVxdWVzdCIvPg0KLQ0KLSAgICAgICAgIDx3c2RsOm91dHB1dCBtZXNzYWdlPSJpbXBsOnRlc3RTaW1wbGVJbk91dFJlc3BvbnNlIiBuYW1lPSJ0ZXN0U2ltcGxlSW5PdXRSZXNwb25zZSIvPg0KLQ0KLSAgICAgIDwvd3NkbDpvcGVyYXRpb24+DQotICAgICAgDQotICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InRlc3RTaW1wbGUyIiBwYXJhbWV0ZXJPcmRlcj0ic2ltcGxlMkluMSBzaW1wbGUySW4yIj4NCi0NCi0gICAgICAgICA8d3NkbDppbnB1dCBtZXNzYWdlPSJpbXBsOnRlc3RTaW1wbGUyUmVxdWVzdCIgbmFtZT0idGVzdFNpbXBsZTJSZXF1ZXN0Ii8+DQotDQotICAgICAgICAgPHdzZGw6b3V0cHV0IG1lc3NhZ2U9ImltcGw6dGVzdFNpbXBsZTJSZXNwb25zZSIgbmFtZT0idGVzdFNpbXBsZTJSZXNwb25zZSIvPg0KLQ0KLSAgICAgIDwvd3NkbDpvcGVyYXRpb24+DQotICAgICAgDQotICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InRlc3RIZWFkZXIiIHBhcmFtZXRlck9yZGVyPSJib2R5UGFyYW0gaGVhZGVyUGFyYW0iPg0KLQ0KLSAgICAgICAgIDx3c2RsOmlucHV0IG1lc3NhZ2U9ImltcGw6dGVzdEhlYWRlclJlcXVlc3QiIG5hbWU9InRlc3RIZWFkZXJSZXF1ZXN0Ii8+DQotDQotICAgICAgICAgPHdzZGw6b3V0cHV0IG1lc3NhZ2U9ImltcGw6dGVzdEhlYWRlclJlc3BvbnNlIiBuYW1lPSJ0ZXN0SGVhZGVyUmVzcG9uc2UiLz4NCi0NCi0gICAgICA8L3dzZGw6b3BlcmF0aW9uPg0KLQ0KLSAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJ0ZXN0TGlzdHMiIHBhcmFtZXRlck9yZGVyPSJhcmdfMF8wIGFyZ18xXzAgYXJnXzJfMCBhcmdfM18wIGFyZ180XzAgYXJnXzVfMCBhcmdfN18wIGFyZ182XzAiPg0KLQ0KLSAgICAgICAgIDx3c2RsOmlucHV0IG1lc3NhZ2U9ImltcGw6dGVzdExpc3RzUmVxdWVzdCIgbmFtZT0idGVzdExpc3RzUmVxdWVzdCIvPg0KLQ0KLSAgICAgICAgIDx3c2RsOm91dHB1dCBtZXNzYWdlPSJpbXBsOnRlc3RMaXN0c1Jlc3BvbnNlIiBuYW1lPSJ0ZXN0TGlzdHNSZXNwb25zZSIvPg0KLQ0KLSAgICAgIDwvd3NkbDpvcGVyYXRpb24+DQotICAgICAgDQotICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InRlc3RDYWxlbmRhckxpc3QxIiBwYXJhbWV0ZXJPcmRlcj0iYXJnXzFfMCI+DQotDQotICAgICAgICAgPHdzZGw6aW5wdXQgbWVzc2FnZT0iaW1wbDp0ZXN0Q2FsZW5kYXJMaXN0MVJlcXVlc3QiIG5hbWU9InRlc3RDYWxlbmRhckxpc3QxUmVxdWVzdCIvPg0KLQ0KLSAgICAgICAgIDx3c2RsOm91dHB1dCBtZXNzYWdlPSJpbXBsOnRlc3RDYWxlbmRhckxpc3QxUmVzcG9uc2UiIG5hbWU9InRlc3RDYWxlbmRhckxpc3QxUmVzcG9uc2UiLz4NCi0NCi0gICAgICA8L3dzZGw6b3BlcmF0aW9uPg0KLSAgICAgIA0KLSAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJ0ZXN0U3RyaW5nTGlzdDIiIHBhcmFtZXRlck9yZGVyPSJhcmdfMl8wIj4NCi0NCi0gICAgICAgICA8d3NkbDppbnB1dCBtZXNzYWdlPSJpbXBsOnRlc3RTdHJpbmdMaXN0MlJlcXVlc3QiIG5hbWU9InRlc3RTdHJpbmdMaXN0MlJlcXVlc3QiLz4NCi0NCi0gICAgICAgICA8d3NkbDpvdXRwdXQgbWVzc2FnZT0iaW1wbDp0ZXN0U3RyaW5nTGlzdDJSZXNwb25zZSIgbmFtZT0idGVzdFN0cmluZ0xpc3QyUmVzcG9uc2UiLz4NCi0NCi0gICAgICA8L3dzZGw6b3BlcmF0aW9uPg0KLSAgICAgIA0KLSAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJ0ZXN0QmlnSW50ZWdlckxpc3QzIiBwYXJhbWV0ZXJPcmRlcj0iYXJnXzNfMCI+DQotDQotICAgICAgICAgPHdzZGw6aW5wdXQgbWVzc2FnZT0iaW1wbDp0ZXN0QmlnSW50ZWdlckxpc3QzUmVxdWVzdCIgbmFtZT0idGVzdEJpZ0ludGVnZXJMaXN0M1JlcXVlc3QiLz4NCi0NCi0gICAgICAgICA8d3NkbDpvdXRwdXQgbWVzc2FnZT0iaW1wbDp0ZXN0QmlnSW50ZWdlckxpc3QzUmVzcG9uc2UiIG5hbWU9InRlc3RCaWdJbnRlZ2VyTGlzdDNSZXNwb25zZSIvPg0KLQ0KLSAgICAgIDwvd3NkbDpvcGVyYXRpb24+DQotICAgICAgDQotICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InRlc3RMb25nTGlzdDQiIHBhcmFtZXRlck9yZGVyPSJhcmdfNF8wIj4NCi0NCi0gICAgICAgICA8d3NkbDppbnB1dCBtZXNzYWdlPSJpbXBsOnRlc3RMb25nTGlzdDRSZXF1ZXN0IiBuYW1lPSJ0ZXN0TG9uZ0xpc3Q0UmVxdWVzdCIvPg0KLQ0KLSAgICAgICAgIDx3c2RsOm91dHB1dCBtZXNzYWdlPSJpbXBsOnRlc3RMb25nTGlzdDRSZXNwb25zZSIgbmFtZT0idGVzdExvbmdMaXN0NFJlc3BvbnNlIi8+DQotDQotICAgICAgPC93c2RsOm9wZXJhdGlvbj4NCi0gICAgICANCi0gICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0idGVzdEVudW1MaXN0NSIgcGFyYW1ldGVyT3JkZXI9ImFyZ181XzAiPg0KLQ0KLSAgICAgICAgIDx3c2RsOmlucHV0IG1lc3NhZ2U9ImltcGw6dGVzdEVudW1MaXN0NVJlcXVlc3QiIG5hbWU9InRlc3RFbnVtTGlzdDVSZXF1ZXN0Ii8+DQotDQotICAgICAgICAgPHdzZGw6b3V0cHV0IG1lc3NhZ2U9ImltcGw6dGVzdEVudW1MaXN0NVJlc3BvbnNlIiBuYW1lPSJ0ZXN0RW51bUxpc3Q1UmVzcG9uc2UiLz4NCi0NCi0gICAgICA8L3dzZGw6b3BlcmF0aW9uPg0KLSAgICAgIA0KLSAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJ0ZXN0RW51bUxpc3Q3IiBwYXJhbWV0ZXJPcmRlcj0iYXJnXzdfMCI+DQotDQotICAgICAgICAgPHdzZGw6aW5wdXQgbWVzc2FnZT0iaW1wbDp0ZXN0RW51bUxpc3Q3UmVxdWVzdCIgbmFtZT0idGVzdEVudW1MaXN0N1JlcXVlc3QiLz4NCi0NCi0gICAgICAgICA8d3NkbDpvdXRwdXQgbWVzc2FnZT0iaW1wbDp0ZXN0RW51bUxpc3Q3UmVzcG9uc2UiIG5hbWU9InRlc3RFbnVtTGlzdDdSZXNwb25zZSIvPg0KLQ0KLSAgICAgIDwvd3NkbDpvcGVyYXRpb24+DQotICAgICAgDQotICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InRlc3RDb21wbGV4QWxsNiIgcGFyYW1ldGVyT3JkZXI9ImFyZ182XzAiPg0KLQ0KLSAgICAgICAgIDx3c2RsOmlucHV0IG1lc3NhZ2U9ImltcGw6dGVzdENvbXBsZXhBbGw2UmVxdWVzdCIgbmFtZT0idGVzdENvbXBsZXhBbGw2UmVxdWVzdCIvPg0KLQ0KLSAgICAgICAgIDx3c2RsOm91dHB1dCBtZXNzYWdlPSJpbXBsOnRlc3RDb21wbGV4QWxsNlJlc3BvbnNlIiBuYW1lPSJ0ZXN0Q29tcGxleEFsbDZSZXNwb25zZSIvPg0KLQ0KLSAgICAgIDwvd3NkbDpvcGVyYXRpb24+DQotICAgICAgDQotICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InRlc3RGYXVsdCI+DQotDQotICAgICAgICAgPHdzZGw6aW5wdXQgbWVzc2FnZT0iaW1wbDp0ZXN0RmF1bHRSZXF1ZXN0IiBuYW1lPSJ0ZXN0RmF1bHRSZXF1ZXN0Ii8+DQotDQotICAgICAgICAgPHdzZGw6b3V0cHV0IG1lc3NhZ2U9ImltcGw6dGVzdEZhdWx0UmVzcG9uc2UiIG5hbWU9InRlc3RGYXVsdFJlc3BvbnNlIi8+DQotICAgICAgICAgPHdzZGw6ZmF1bHQgbmFtZT0icnBjRmF1bHQiIG1lc3NhZ2U9ImltcGw6cnBjRmF1bHQiIC8+DQotICAgICAgPC93c2RsOm9wZXJhdGlvbj4NCi0gICAgICANCi0gICA8L3dzZGw6cG9ydFR5cGU+DQotDQotICAgPHdzZGw6YmluZGluZyBuYW1lPSJSUENMaXRTb2FwQmluZGluZyIgdHlwZT0iaW1wbDpSUENMaXQiPg0KLQ0KLSAgICAgIDx3c2Rsc29hcDpiaW5kaW5nIHN0eWxlPSJycGMiIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIi8+DQotDQotICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0idGVzdFNpbXBsZSI+DQotDQotICAgICAgICAgPHdzZGw6aW5wdXQgbmFtZT0idGVzdFNpbXBsZVJlcXVlc3QiPg0KLSAgICAgICAgICAgICAgIDx3c2Rsc29hcDpib2R5IG5hbWVzcGFjZT0iaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvcnBjbGl0IiB1c2U9ImxpdGVyYWwiLz4NCi0gICAgICAgICA8L3dzZGw6aW5wdXQ+DQotDQotICAgICAgICAgPHdzZGw6b3V0cHV0IG5hbWU9InRlc3RTaW1wbGVSZXNwb25zZSI+DQotICAgICAgICAgICAgICAgPHdzZGxzb2FwOmJvZHkgbmFtZXNwYWNlPSJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9ycGNsaXQiIHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgICAgIDwvd3NkbDpvdXRwdXQ+DQotDQotICAgICAgPC93c2RsOm9wZXJhdGlvbj4NCi0gICAgICANCi0gICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0idGVzdFNpbXBsZUluT3V0Ij4NCi0NCi0gICAgICAgICA8d3NkbDppbnB1dCBuYW1lPSJ0ZXN0U2ltcGxlSW5PdXRSZXF1ZXN0Ij4NCi0gICAgICAgICAgICAgICA8d3NkbHNvYXA6Ym9keSBuYW1lc3BhY2U9Imh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L3JwY2xpdCIgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgICAgPC93c2RsOmlucHV0Pg0KLQ0KLSAgICAgICAgIDx3c2RsOm91dHB1dCBuYW1lPSJ0ZXN0U2ltcGxlSW5PdXRSZXNwb25zZSI+DQotICAgICAgICAgICAgICAgPHdzZGxzb2FwOmJvZHkgbmFtZXNwYWNlPSJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9ycGNsaXQiIHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgICAgIDwvd3NkbDpvdXRwdXQ+DQotDQotICAgICAgPC93c2RsOm9wZXJhdGlvbj4NCi0gICAgICANCi0gICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0idGVzdFNpbXBsZTIiPg0KLQ0KLSAgICAgICAgIDx3c2RsOmlucHV0IG5hbWU9InRlc3RTaW1wbGUyUmVxdWVzdCI+DQotICAgICAgICAgICAgICAgPHdzZGxzb2FwOmJvZHkgbmFtZXNwYWNlPSJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9ycGNsaXQiIHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgICAgIDwvd3NkbDppbnB1dD4NCi0NCi0gICAgICAgICA8d3NkbDpvdXRwdXQgbmFtZT0idGVzdFNpbXBsZTJSZXNwb25zZSI+DQotICAgICAgICAgICAgICAgPHdzZGxzb2FwOmJvZHkgbmFtZXNwYWNlPSJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9ycGNsaXQiIHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgICAgIDwvd3NkbDpvdXRwdXQ+DQotDQotICAgICAgPC93c2RsOm9wZXJhdGlvbj4NCi0gICAgICANCi0gICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0idGVzdEhlYWRlciI+DQotCQkJDQotICAgICAgICAgPHdzZGw6aW5wdXQgbmFtZT0idGVzdEhlYWRlclJlcXVlc3QiPg0KLSAgICAgICAgICAgICAgIDx3c2Rsc29hcDpib2R5IHBhcnRzPSJib2R5UGFyYW0iIHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgICAgICAgICAgIDx3c2Rsc29hcDpoZWFkZXIgbWVzc2FnZT0iaW1wbDp0ZXN0SGVhZGVyUmVxdWVzdCIgcGFydD0iaGVhZGVyUGFyYW0iIHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgICAgIDwvd3NkbDppbnB1dD4NCi0NCi0gICAgICAgICA8d3NkbDpvdXRwdXQgbmFtZT0idGVzdEhlYWRlclJlc3BvbnNlIj4NCi0gICAgICAgICAgICAgICA8d3NkbHNvYXA6aGVhZGVyIG1lc3NhZ2U9ImltcGw6dGVzdEhlYWRlclJlc3BvbnNlIiBwYXJ0PSJoZWFkZXJSZXR1cm4iIHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgICAgIDwvd3NkbDpvdXRwdXQ+DQotDQotICAgICAgPC93c2RsOm9wZXJhdGlvbj4NCi0NCi0gICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0idGVzdExpc3RzIj4NCi0NCi0gICAgICAgICA8d3NkbHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPg0KLQ0KLSAgICAgICAgIDx3c2RsOmlucHV0IG5hbWU9InRlc3RMaXN0c1JlcXVlc3QiPg0KLQ0KLSAgICAgICAgICAgIDx3c2Rsc29hcDpib2R5IG5hbWVzcGFjZT0iaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvcnBjbGl0IiB1c2U9ImxpdGVyYWwiLz4NCi0NCi0gICAgICAgICA8L3dzZGw6aW5wdXQ+DQotDQotICAgICAgICAgPHdzZGw6b3V0cHV0IG5hbWU9InRlc3RMaXN0c1Jlc3BvbnNlIj4NCi0NCi0gICAgICAgICAgICA8d3NkbHNvYXA6Ym9keSBuYW1lc3BhY2U9Imh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L3JwY2xpdCIgdXNlPSJsaXRlcmFsIi8+DQotDQotICAgICAgICAgPC93c2RsOm91dHB1dD4NCi0NCi0gICAgICA8L3dzZGw6b3BlcmF0aW9uPg0KLSAgICAgIA0KLSAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJ0ZXN0Q2FsZW5kYXJMaXN0MSI+DQotDQotICAgICAgICAgPHdzZGxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4NCi0NCi0gICAgICAgICA8d3NkbDppbnB1dCBuYW1lPSJ0ZXN0Q2FsZW5kYXJMaXN0MVJlcXVlc3QiPg0KLQ0KLSAgICAgICAgICAgIDx3c2Rsc29hcDpib2R5IG5hbWVzcGFjZT0iaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvcnBjbGl0IiB1c2U9ImxpdGVyYWwiLz4NCi0NCi0gICAgICAgICA8L3dzZGw6aW5wdXQ+DQotDQotICAgICAgICAgPHdzZGw6b3V0cHV0IG5hbWU9InRlc3RDYWxlbmRhckxpc3QxUmVzcG9uc2UiPg0KLQ0KLSAgICAgICAgICAgIDx3c2Rsc29hcDpib2R5IG5hbWVzcGFjZT0iaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvcnBjbGl0IiB1c2U9ImxpdGVyYWwiLz4NCi0NCi0gICAgICAgICA8L3dzZGw6b3V0cHV0Pg0KLQ0KLSAgICAgIDwvd3NkbDpvcGVyYXRpb24+DQotICAgICAgDQotICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InRlc3RTdHJpbmdMaXN0MiI+DQotDQotICAgICAgICAgPHdzZGxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4NCi0NCi0gICAgICAgICA8d3NkbDppbnB1dCBuYW1lPSJ0ZXN0U3RyaW5nTGlzdDJSZXF1ZXN0Ij4NCi0NCi0gICAgICAgICAgICA8d3NkbHNvYXA6Ym9keSBuYW1lc3BhY2U9Imh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L3JwY2xpdCIgdXNlPSJsaXRlcmFsIi8+DQotDQotICAgICAgICAgPC93c2RsOmlucHV0Pg0KLQ0KLSAgICAgICAgIDx3c2RsOm91dHB1dCBuYW1lPSJ0ZXN0U3RyaW5nTGlzdDJSZXNwb25zZSI+DQotDQotICAgICAgICAgICAgPHdzZGxzb2FwOmJvZHkgbmFtZXNwYWNlPSJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9ycGNsaXQiIHVzZT0ibGl0ZXJhbCIvPg0KLQ0KLSAgICAgICAgIDwvd3NkbDpvdXRwdXQ+DQotDQotICAgICAgPC93c2RsOm9wZXJhdGlvbj4NCi0gICAgICANCi0gICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0idGVzdEJpZ0ludGVnZXJMaXN0MyI+DQotDQotICAgICAgICAgPHdzZGxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4NCi0NCi0gICAgICAgICA8d3NkbDppbnB1dCBuYW1lPSJ0ZXN0QmlnSW50ZWdlckxpc3QzUmVxdWVzdCI+DQotDQotICAgICAgICAgICAgPHdzZGxzb2FwOmJvZHkgbmFtZXNwYWNlPSJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9ycGNsaXQiIHVzZT0ibGl0ZXJhbCIvPg0KLQ0KLSAgICAgICAgIDwvd3NkbDppbnB1dD4NCi0NCi0gICAgICAgICA8d3NkbDpvdXRwdXQgbmFtZT0idGVzdEJpZ0ludGVnZXJMaXN0M1Jlc3BvbnNlIj4NCi0NCi0gICAgICAgICAgICA8d3NkbHNvYXA6Ym9keSBuYW1lc3BhY2U9Imh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L3JwY2xpdCIgdXNlPSJsaXRlcmFsIi8+DQotDQotICAgICAgICAgPC93c2RsOm91dHB1dD4NCi0NCi0gICAgICA8L3dzZGw6b3BlcmF0aW9uPg0KLSAgICAgIA0KLSAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJ0ZXN0TG9uZ0xpc3Q0Ij4NCi0NCi0gICAgICAgICA8d3NkbHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPg0KLQ0KLSAgICAgICAgIDx3c2RsOmlucHV0IG5hbWU9InRlc3RMb25nTGlzdDRSZXF1ZXN0Ij4NCi0NCi0gICAgICAgICAgICA8d3NkbHNvYXA6Ym9keSBuYW1lc3BhY2U9Imh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L3JwY2xpdCIgdXNlPSJsaXRlcmFsIi8+DQotDQotICAgICAgICAgPC93c2RsOmlucHV0Pg0KLQ0KLSAgICAgICAgIDx3c2RsOm91dHB1dCBuYW1lPSJ0ZXN0TG9uZ0xpc3Q0UmVzcG9uc2UiPg0KLQ0KLSAgICAgICAgICAgIDx3c2Rsc29hcDpib2R5IG5hbWVzcGFjZT0iaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvcnBjbGl0IiB1c2U9ImxpdGVyYWwiLz4NCi0NCi0gICAgICAgICA8L3dzZGw6b3V0cHV0Pg0KLQ0KLSAgICAgIDwvd3NkbDpvcGVyYXRpb24+DQotICAgICAgDQotICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InRlc3RFbnVtTGlzdDUiPg0KLQ0KLSAgICAgICAgIDx3c2Rsc29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+DQotDQotICAgICAgICAgPHdzZGw6aW5wdXQgbmFtZT0idGVzdEVudW1MaXN0NVJlcXVlc3QiPg0KLQ0KLSAgICAgICAgICAgIDx3c2Rsc29hcDpib2R5IG5hbWVzcGFjZT0iaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvcnBjbGl0IiB1c2U9ImxpdGVyYWwiLz4NCi0NCi0gICAgICAgICA8L3dzZGw6aW5wdXQ+DQotDQotICAgICAgICAgPHdzZGw6b3V0cHV0IG5hbWU9InRlc3RFbnVtTGlzdDVSZXNwb25zZSI+DQotDQotICAgICAgICAgICAgPHdzZGxzb2FwOmJvZHkgbmFtZXNwYWNlPSJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9ycGNsaXQiIHVzZT0ibGl0ZXJhbCIvPg0KLQ0KLSAgICAgICAgIDwvd3NkbDpvdXRwdXQ+DQotDQotICAgICAgPC93c2RsOm9wZXJhdGlvbj4NCi0gICAgICANCi0gICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0idGVzdEVudW1MaXN0NyI+DQotDQotICAgICAgICAgPHdzZGxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4NCi0NCi0gICAgICAgICA8d3NkbDppbnB1dCBuYW1lPSJ0ZXN0RW51bUxpc3Q3UmVxdWVzdCI+DQotDQotICAgICAgICAgICAgPHdzZGxzb2FwOmJvZHkgbmFtZXNwYWNlPSJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9ycGNsaXQiIHVzZT0ibGl0ZXJhbCIvPg0KLQ0KLSAgICAgICAgIDwvd3NkbDppbnB1dD4NCi0NCi0gICAgICAgICA8d3NkbDpvdXRwdXQgbmFtZT0idGVzdEVudW1MaXN0N1Jlc3BvbnNlIj4NCi0NCi0gICAgICAgICAgICA8d3NkbHNvYXA6Ym9keSBuYW1lc3BhY2U9Imh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L3JwY2xpdCIgdXNlPSJsaXRlcmFsIi8+DQotDQotICAgICAgICAgPC93c2RsOm91dHB1dD4NCi0NCi0gICAgICA8L3dzZGw6b3BlcmF0aW9uPg0KLSAgICAgIA0KLSAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJ0ZXN0Q29tcGxleEFsbDYiPg0KLQ0KLSAgICAgICAgIDx3c2Rsc29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+DQotDQotICAgICAgICAgPHdzZGw6aW5wdXQgbmFtZT0idGVzdENvbXBsZXhBbGw2UmVxdWVzdCI+DQotDQotICAgICAgICAgICAgPHdzZGxzb2FwOmJvZHkgbmFtZXNwYWNlPSJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9ycGNsaXQiIHVzZT0ibGl0ZXJhbCIvPg0KLQ0KLSAgICAgICAgIDwvd3NkbDppbnB1dD4NCi0NCi0gICAgICAgICA8d3NkbDpvdXRwdXQgbmFtZT0idGVzdENvbXBsZXhBbGw2UmVzcG9uc2UiPg0KLQ0KLSAgICAgICAgICAgIDx3c2Rsc29hcDpib2R5IG5hbWVzcGFjZT0iaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvcnBjbGl0IiB1c2U9ImxpdGVyYWwiLz4NCi0NCi0gICAgICAgICA8L3dzZGw6b3V0cHV0Pg0KLQ0KLSAgICAgIDwvd3NkbDpvcGVyYXRpb24+IA0KLSAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJ0ZXN0RmF1bHQiPg0KLQ0KLSAgICAgICAgIDx3c2Rsc29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0idGVzdEZhdWx0Ii8+DQotDQotICAgICAgICAgPHdzZGw6aW5wdXQgbmFtZT0idGVzdEZhdWx0UmVxdWVzdCI+DQotDQotICAgICAgICAgICAgPHdzZGxzb2FwOmJvZHkgbmFtZXNwYWNlPSJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9ycGNsaXQiIHVzZT0ibGl0ZXJhbCIvPg0KLQ0KLSAgICAgICAgIDwvd3NkbDppbnB1dD4NCi0NCi0gICAgICAgICA8d3NkbDpvdXRwdXQgbmFtZT0idGVzdEZhdWx0UmVzcG9uc2UiPg0KLQ0KLSAgICAgICAgICAgIDx3c2Rsc29hcDpib2R5IG5hbWVzcGFjZT0iaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvcnBjbGl0IiB1c2U9ImxpdGVyYWwiLz4NCi0NCi0gICAgICAgICA8L3dzZGw6b3V0cHV0Pg0KLSAgICAgICAgIDx3c2RsOmZhdWx0IG5hbWU9InJwY0ZhdWx0Ij4NCi0gICAgICAgICAgICA8d3NkbHNvYXA6ZmF1bHQgbmFtZT0icnBjRmF1bHQiIHVzZT0ibGl0ZXJhbCIgLz4NCi0gICAgICAgICA8L3dzZGw6ZmF1bHQ+DQotDQotICAgICAgPC93c2RsOm9wZXJhdGlvbj4gICAgICANCi0NCi0gICA8L3dzZGw6YmluZGluZz4NCi0NCi0gICA8d3NkbDpzZXJ2aWNlIG5hbWU9IlJQQ0xpdFNlcnZpY2UiPg0KLQ0KLSAgICAgIDx3c2RsOnBvcnQgYmluZGluZz0iaW1wbDpSUENMaXRTb2FwQmluZGluZyIgbmFtZT0iUlBDTGl0Ij4NCi0NCi0gICAgICAgICA8d3NkbHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo5MDgwL2F4aXMyL3NlcnZpY2VzL1JQQ0xpdFNlcnZpY2UiLz4NCi0NCi0gICAgICA8L3dzZGw6cG9ydD4NCi0NCi0gICA8L3dzZGw6c2VydmljZT4NCi0NCi08L3dzZGw6ZGVmaW5pdGlvbnM+DQotDQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L3JwY2xpdC9SUENMaXRJbXBsLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvcnBjbGl0L1JQQ0xpdEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZiNjZkYy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvcnBjbGl0L1JQQ0xpdEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnByb3h5LnJwY2xpdDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5UZXN0TG9nZ2VyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnByb3h5LnJwY2xpdC5zZWkuUlBDRmF1bHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJveHkucnBjbGl0LnNlaS5SUENMaXQ7DQotaW1wb3J0IG9yZy50ZXN0LnByb3h5LnJwY2xpdC5Db21wbGV4QWxsOw0KLWltcG9ydCBvcmcudGVzdC5wcm94eS5ycGNsaXQuRW51bTsNCi0NCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LnhtbC5kYXRhdHlwZS5EYXRhdHlwZUNvbnN0YW50czsNCi1pbXBvcnQgamF2YXgueG1sLmRhdGF0eXBlLkRhdGF0eXBlRmFjdG9yeTsNCi1pbXBvcnQgamF2YXgueG1sLmRhdGF0eXBlLlhNTEdyZWdvcmlhbkNhbGVuZGFyOw0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOw0KLWltcG9ydCBqYXZheC54bWwud3MuSG9sZGVyOw0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsNCi0NCi0vKioNCi0gKiANCi0gKg0KLSAqLw0KLUBXZWJTZXJ2aWNlKHNlcnZpY2VOYW1lPSJSUENMaXRTZXJ2aWNlIiwNCi0JCXRhcmdldE5hbWVzcGFjZT0iaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvcnBjbGl0IiwNCi0JCWVuZHBvaW50SW50ZXJmYWNlPSJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnByb3h5LnJwY2xpdC5zZWkuUlBDTGl0IikNCi1wdWJsaWMgY2xhc3MgUlBDTGl0SW1wbCBpbXBsZW1lbnRzIFJQQ0xpdCB7DQotDQotICAgIHB1YmxpYyBzdGF0aWMgRGF0YXR5cGVGYWN0b3J5IGRmIDsNCi0gICAgcHVibGljIHN0YXRpYyBYTUxHcmVnb3JpYW5DYWxlbmRhciBiZGF5Ow0KLSAgICBwdWJsaWMgc3RhdGljIFhNTEdyZWdvcmlhbkNhbGVuZGFyIGhvbGlkYXk7DQotICAgIHB1YmxpYyBzdGF0aWMgQmlnSW50ZWdlciBiaWdJbnQxID0gbmV3IEJpZ0ludGVnZXIoIjEiKTsNCi0gICAgcHVibGljIHN0YXRpYyBCaWdJbnRlZ2VyIGJpZ0ludDIgPSBuZXcgQmlnSW50ZWdlcigiMiIpOw0KLSAgICBwdWJsaWMgc3RhdGljIFFOYW1lIHFuYW1lMSA9IG5ldyBRTmFtZSgidXJuOi8vc2FtcGxlIiwgImhlbGxvIiApOw0KLSAgICBwdWJsaWMgc3RhdGljIFFOYW1lIHFuYW1lMiA9IG5ldyBRTmFtZSgidXJuOi8vc2FtcGxlIiwgIndvcmxkIiApOw0KLSAgICANCi0gICAgc3RhdGljIHsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgZGYgPSBEYXRhdHlwZUZhY3RvcnkubmV3SW5zdGFuY2UoKTsNCi0gICAgICAgICAgICBiZGF5ID0gZGYubmV3WE1MR3JlZ29yaWFuQ2FsZW5kYXJEYXRlKDE5NjQsIDEyLCAzLCAgRGF0YXR5cGVDb25zdGFudHMuRklFTERfVU5ERUZJTkVEKTsNCi0gICAgICAgICAgICBob2xpZGF5ID0gYmRheSA9IGRmLm5ld1hNTEdyZWdvcmlhbkNhbGVuZGFyRGF0ZSgyMDA3LCAxLCAxLCAgRGF0YXR5cGVDb25zdGFudHMuRklFTERfVU5ERUZJTkVEKTsNCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fQ0KLSAgICB9DQotICAgIA0KLSAgICANCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBFY2hvIHRoZSBpbnB1dA0KLSAgICAgKi8NCi0gICAgcHVibGljIFN0cmluZyB0ZXN0U2ltcGxlKFN0cmluZyBzaW1wbGVJbikgew0KLSAgICAgICAgYXNzZXJ0VHJ1ZShzaW1wbGVJbiAhPSBudWxsKTsgIC8vIEFjY29yZGluZyB0byBKQVgtV1MgYW4gUlBDIHNlcnZpY2Ugc2hvdWxkIG5ldmVyIHJlY2VpdmUgYSBudWxsDQotICAgICAgICANCi0gICAgICAgIC8vIFRlc3QgdG8gZW5zdXJlIHRoYXQgcmV0dXJuaW5nIG51bGwgY2F1c2VzIHRoZSBwcm9wZXIgZXhjZXB0aW9uIA0KLSAgICAgICAgaWYgKHNpbXBsZUluLmNvbnRhaW5zKCJyZXR1cm5OdWxsIikpIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBzaW1wbGVJbjsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIEVjaG8gdGhlIGlucHV0DQotICAgICAqLw0KLSAgICBwdWJsaWMgU3RyaW5nIHRlc3RTaW1wbGUyKFN0cmluZyBzaW1wbGUySW4xLCBTdHJpbmcgc2ltcGxlMkluMikgew0KLSAgICAgICAgcmV0dXJuIHNpbXBsZTJJbjEgKyBzaW1wbGUySW4yOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgUU5hbWVbXSB0ZXN0TGlzdHMoDQotICAgICAgICAgICAgUU5hbWVbXSBxTmFtZXMsDQotICAgICAgICAgICAgWE1MR3JlZ29yaWFuQ2FsZW5kYXJbXSBjYWxlbmRhcnMsDQotICAgICAgICAgICAgU3RyaW5nW10gdGV4dHMsDQotICAgICAgICAgICAgQmlnSW50ZWdlcltdIGJpZ0ludHMsDQotICAgICAgICAgICAgTG9uZ1tdIGxvbmdzLA0KLSAgICAgICAgICAgIEVudW1bXSBlbnVtcywNCi0gICAgICAgICAgICBTdHJpbmdbXSB0ZXh0MiwNCi0gICAgICAgICAgICBDb21wbGV4QWxsIGFsbCkgew0KLSAgICAgICAgYXNzZXJ0VHJ1ZShxTmFtZXMubGVuZ3RoPT0yKTsNCi0gICAgICAgIGFzc2VydFRydWUocU5hbWVzWzBdLmVxdWFscyhxbmFtZTEpKTsNCi0gICAgICAgIGFzc2VydFRydWUocU5hbWVzWzFdLmVxdWFscyhxbmFtZTIpKTsNCi0gICAgICAgIA0KLSAgICAgICAgcmV0dXJuIHFOYW1lczsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgWE1MR3JlZ29yaWFuQ2FsZW5kYXJbXSB0ZXN0Q2FsZW5kYXJMaXN0MShYTUxHcmVnb3JpYW5DYWxlbmRhcltdIGNhbHMpIHsNCi0gICAgICAgYXNzZXJ0VHJ1ZShjYWxzLmxlbmd0aCA9PSAyKTsNCi0gICAgICAgYXNzZXJ0VHJ1ZShjYWxzWzBdLmNvbXBhcmUoYmRheSkgPT0gMCk7DQotICAgICAgIGFzc2VydFRydWUoY2Fsc1sxXS5jb21wYXJlKGhvbGlkYXkpID09IDApOw0KLSAgICAgICByZXR1cm4gY2FsczsNCi0gICAgICAgDQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZ1tdIHRlc3RTdHJpbmdMaXN0MihTdHJpbmdbXSBhcmcyMCkgew0KLQ0KLSAgICAgICAgYXNzZXJ0VHJ1ZShhcmcyMC5sZW5ndGg9PTIpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShhcmcyMFswXS5lcXVhbHMoIkhlbGxvIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShhcmcyMFsxXS5lcXVhbHMoIldvcmxkIikpOw0KLSAgICAgICAgcmV0dXJuIGFyZzIwOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBCaWdJbnRlZ2VyW10gdGVzdEJpZ0ludGVnZXJMaXN0MyhCaWdJbnRlZ2VyW10gYXJnMzApIHsNCi0gICAgICAgIGFzc2VydFRydWUoYXJnMzAubGVuZ3RoPT0yKTsNCi0gICAgICAgIGFzc2VydFRydWUoYXJnMzBbMF0uY29tcGFyZVRvKGJpZ0ludDEpID09IDApOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShhcmczMFsxXS5jb21wYXJlVG8oYmlnSW50MikgPT0gMCk7DQotICAgICAgICByZXR1cm4gYXJnMzA7DQotICAgIH0NCi0NCi0gICAgcHVibGljIExvbmdbXSB0ZXN0TG9uZ0xpc3Q0KExvbmdbXSBsb25ncykgew0KLSAgICAgICAgYXNzZXJ0VHJ1ZShsb25ncy5sZW5ndGg9PTMpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShsb25nc1swXSA9PSAwKTsNCi0gICAgICAgIGFzc2VydFRydWUobG9uZ3NbMV0gPT0gMSk7DQotICAgICAgICBhc3NlcnRUcnVlKGxvbmdzWzJdID09IDIpOw0KLSAgICAgICAgcmV0dXJuIGxvbmdzOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBFbnVtW10gdGVzdEVudW1MaXN0NShFbnVtW10gZW51bXMpIHsNCi0gICAgICAgIGFzc2VydFRydWUoZW51bXMubGVuZ3RoPT0zKTsNCi0gICAgICAgIGFzc2VydFRydWUoZW51bXNbMF0gPT0gRW51bS5PTkUpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShlbnVtc1sxXSA9PSBFbnVtLlRXTyk7DQotICAgICAgICBhc3NlcnRUcnVlKGVudW1zWzJdID09IEVudW0uVEhSRUUpOw0KLSAgICAgICAgcmV0dXJuIGVudW1zOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBDb21wbGV4QWxsIHRlc3RDb21wbGV4QWxsNihDb21wbGV4QWxsIGFyZzYwKSB7DQotICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViDQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIFN0cmluZ1tdIHRlc3RFbnVtTGlzdDcoU3RyaW5nW10gYXJnNzApIHsNCi0gICAgICAgIGFzc2VydFRydWUoYXJnNzAubGVuZ3RoPT0yKTsNCi0gICAgICAgIGFzc2VydFRydWUoYXJnNzBbMF0uZXF1YWxzKCJBcHBsZSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUoYXJnNzBbMF0uZXF1YWxzKCJPcmFuZ2UiKSk7DQotICAgICAgICByZXR1cm4gYXJnNzA7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGFzc2VydFRydWUoYm9vbGVhbiB2YWx1ZSkgdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24gew0KLSAgICAgICAgaWYgKCF2YWx1ZSkgew0KLSAgICAgICAgICAgIFJ1bnRpbWVFeGNlcHRpb24gcmUgPSBuZXcgUnVudGltZUV4Y2VwdGlvbigpOw0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJUZXN0IEZBSUxVUkU9IiArIHJlKTsNCi0gICAgICAgICAgICB0aHJvdyByZTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIHRlc3RIZWFkZXIoU3RyaW5nIGJvZHlQYXJhbSwgU3RyaW5nIGhlYWRlclBhcmFtKSB7DQotICAgICAgICByZXR1cm4gYm9keVBhcmFtICsgaGVhZGVyUGFyYW07DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdEZhdWx0KCkgdGhyb3dzIFJQQ0ZhdWx0IHsNCi0gICAgICAgIHRocm93IG5ldyBSUENGYXVsdCgiVGhyb3cgUlBDRmF1bHQiLCAxMjMpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgdGVzdFNpbXBsZUluT3V0KEhvbGRlcjxTdHJpbmc+IHNpbXBsZUluT3V0KSB7DQotICAgICAgICByZXR1cm4gc2ltcGxlSW5PdXQudmFsdWU7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L3JwY2xpdC9zZWkvUlBDRmF1bHQuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9ycGNsaXQvc2VpL1JQQ0ZhdWx0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlNGZjMTQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L3JwY2xpdC9zZWkvUlBDRmF1bHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJveHkucnBjbGl0LnNlaTsNCi0NCi1pbXBvcnQgamF2YXgueG1sLndzLldlYkZhdWx0Ow0KLQ0KLUBXZWJGYXVsdChuYW1lID0gIm15RmF1bHQiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvcnBjbGl0IikNCi1wdWJsaWMgY2xhc3MgUlBDRmF1bHQgZXh0ZW5kcyBFeGNlcHRpb24gew0KLQ0KLSAgICBwcml2YXRlIGludCBmYXVsdEluZm87DQotICAgIHB1YmxpYyBSUENGYXVsdCgpIHsNCi0gICAgICAgIHN1cGVyKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFJQQ0ZhdWx0KFN0cmluZyBtZXNzYWdlLCBpbnQgZmF1bHRJbmZvKSB7DQotICAgICAgICBzdXBlcihtZXNzYWdlKTsNCi0gICAgICAgIHRoaXMuZmF1bHRJbmZvID0gZmF1bHRJbmZvOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBSUENGYXVsdChTdHJpbmcgbWVzc2FnZSwgaW50IGZhdWx0SW5mbyxUaHJvd2FibGUgY2F1c2UpIHsNCi0gICAgICAgIHN1cGVyKG1lc3NhZ2UsIGNhdXNlKTsNCi0gICAgICAgIHRoaXMuZmF1bHRJbmZvID0gZmF1bHRJbmZvOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBpbnQgZ2V0RmF1bHRJbmZvKCkgew0KLSAgICAgICAgcmV0dXJuIGZhdWx0SW5mbzsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvcnBjbGl0L3NlaS9SUENMaXQuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9ycGNsaXQvc2VpL1JQQ0xpdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZWVkYmUyLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9ycGNsaXQvc2VpL1JQQ0xpdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ5ICswLDAgQEAKLQ0KLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJveHkucnBjbGl0LnNlaTsNCi0NCi1pbXBvcnQgb3JnLnRlc3QucHJveHkucnBjbGl0LkNvbXBsZXhBbGw7DQotaW1wb3J0IG9yZy50ZXN0LnByb3h5LnJwY2xpdC5FbnVtOw0KLQ0KLWltcG9ydCBqYXZheC5qd3MuV2ViTWV0aG9kOw0KLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW07DQotaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbS5Nb2RlOw0KLWltcG9ydCBqYXZheC5qd3MuV2ViUmVzdWx0Ow0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsNCi1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmc7DQotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlN0eWxlOw0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbExpc3Q7DQotaW1wb3J0IGphdmF4LnhtbC5kYXRhdHlwZS5YTUxHcmVnb3JpYW5DYWxlbmRhcjsNCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLkhvbGRlcjsNCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7DQotDQotLyoqDQotICogVGhpcyBjbGFzcyB3YXMgZ2VuZXJhdGVkIGJ5IHRoZSBKQVhXUyBTSS4NCi0gKiBKQVgtV1MgUkkgMi4wXzAxLWIxNS1mY3MNCi0gKiBHZW5lcmF0ZWQgc291cmNlIHZlcnNpb246IDIuMA0KLSAqIA0KLSAqLw0KLUBXZWJTZXJ2aWNlKG5hbWUgPSAiUlBDTGl0IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L3JwY2xpdCIpDQotQFNPQVBCaW5kaW5nKHN0eWxlID0gU3R5bGUuUlBDKQ0KLXB1YmxpYyBpbnRlcmZhY2UgUlBDTGl0IHsNCi0NCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gc2ltcGxlSW4NCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBqYXZhLmxhbmcuU3RyaW5nDQotICAgICAqLw0KLSAgICBAV2ViTWV0aG9kDQotICAgIEBXZWJSZXN1bHQobmFtZSA9ICJzaW1wbGVPdXQiLCBwYXJ0TmFtZSA9ICJzaW1wbGVPdXQiKQ0KLSAgICBwdWJsaWMgU3RyaW5nIHRlc3RTaW1wbGUoDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJzaW1wbGVJbiIsIHBhcnROYW1lID0gInNpbXBsZUluIikNCi0gICAgICAgIFN0cmluZyBzaW1wbGVJbik7DQotICAgIA0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSBzaW1wbGVJbk91dA0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIGphdmEubGFuZy5TdHJpbmcNCi0gICAgICogVEVTVFMgY29tYmluYXRpb24gb2Ygb3V0IGFuZCByZXR1cm4gdmFsdWVzDQotICAgICAqLw0KLSAgICBAV2ViTWV0aG9kDQotICAgIEBXZWJSZXN1bHQobmFtZSA9ICJzaW1wbGVPdXQiLCBwYXJ0TmFtZSA9ICJzaW1wbGVPdXQiKQ0KLSAgICBwdWJsaWMgU3RyaW5nIHRlc3RTaW1wbGVJbk91dCgNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gInNpbXBsZUluT3V0IiwgcGFydE5hbWUgPSAic2ltcGxlSW5PdXQiLCBtb2RlPU1vZGUuSU5PVVQpDQotICAgICAgICBIb2xkZXI8U3RyaW5nPiBzaW1wbGVJbk91dCk7DQotICAgIA0KLSAgICANCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gc2ltcGxlMkluMQ0KLSAgICAgKiBAcGFyYW0gc2ltcGxlMkluMg0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIGphdmEubGFuZy5TdHJpbmcNCi0gICAgICovDQotICAgIEBXZWJNZXRob2QNCi0gICAgQFdlYlJlc3VsdChuYW1lID0gInNpbXBsZTJPdXQiLCBwYXJ0TmFtZSA9ICJzaW1wbGUyT3V0IikNCi0gICAgcHVibGljIFN0cmluZyB0ZXN0U2ltcGxlMigNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gInNpbXBsZTJJbjEiLCBwYXJ0TmFtZSA9ICJzaW1wbGVJbjEiKQ0KLSAgICAgICAgU3RyaW5nIHNpbXBsZTJJbjEsIA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAic2ltcGxlMkluMiIsIHBhcnROYW1lID0gInNpbXBsZTJJbjIiKQ0KLSAgICAgICAgU3RyaW5nIHNpbXBsZTJJbjIpOw0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSBib2R5UGFyYW0NCi0gICAgICogQHBhcmFtIGhlYWRlclBhcmFtDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgamF2YS5sYW5nLlN0cmluZw0KLSAgICAgKi8NCi0gICAgQFdlYk1ldGhvZA0KLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAiaGVhZGVyUmV0dXJuIiwgaGVhZGVyPXRydWUpDQotICAgIHB1YmxpYyBTdHJpbmcgdGVzdEhlYWRlcigNCi0gICAgICAgIEBXZWJQYXJhbShwYXJ0TmFtZSA9ICJib2R5UGFyYW0iKQ0KLSAgICAgICAgU3RyaW5nIGJvZHlQYXJhbSwgDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJoZWFkZXJQYXJhbSIsIGhlYWRlcj10cnVlKQ0KLSAgICAgICAgU3RyaW5nIGhlYWRlclBhcmFtKTsNCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGFyZzcwDQotICAgICAqIEBwYXJhbSBhcmcwMA0KLSAgICAgKiBAcGFyYW0gYXJnMTANCi0gICAgICogQHBhcmFtIGFyZzIwDQotICAgICAqIEBwYXJhbSBhcmczMA0KLSAgICAgKiBAcGFyYW0gYXJnNDANCi0gICAgICogQHBhcmFtIGFyZzUwDQotICAgICAqIEBwYXJhbSBhcmc2MA0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWVbXQ0KLSAgICAgKi8NCi0gICAgQFhtbExpc3QNCi0gICAgQFdlYk1ldGhvZA0KLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAidGVzdExpc3RzUmV0dXJuIiwgcGFydE5hbWUgPSAidGVzdExpc3RzUmV0dXJuIikNCi0gICAgcHVibGljIFFOYW1lW10gdGVzdExpc3RzKA0KLSAgICAgICAgQFhtbExpc3QNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImFyZ18wXzAiLCBwYXJ0TmFtZSA9ICJhcmdfMF8wIikNCi0gICAgICAgIFFOYW1lW10gYXJnMDAsDQotICAgICAgICBAWG1sTGlzdA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiYXJnXzFfMCIsIHBhcnROYW1lID0gImFyZ18xXzAiKQ0KLSAgICAgICAgWE1MR3JlZ29yaWFuQ2FsZW5kYXJbXSBhcmcxMCwNCi0gICAgICAgIEBYbWxMaXN0DQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJhcmdfMl8wIiwgcGFydE5hbWUgPSAiYXJnXzJfMCIpDQotICAgICAgICBTdHJpbmdbXSBhcmcyMCwNCi0gICAgICAgIEBYbWxMaXN0DQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJhcmdfM18wIiwgcGFydE5hbWUgPSAiYXJnXzNfMCIpDQotICAgICAgICBCaWdJbnRlZ2VyW10gYXJnMzAsDQotICAgICAgICBAWG1sTGlzdA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiYXJnXzRfMCIsIHBhcnROYW1lID0gImFyZ180XzAiKQ0KLSAgICAgICAgTG9uZ1tdIGFyZzQwLA0KLSAgICAgICAgQFhtbExpc3QNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImFyZ181XzAiLCBwYXJ0TmFtZSA9ICJhcmdfNV8wIikNCi0gICAgICAgIEVudW1bXSBhcmc1MCwNCi0gICAgICAgIEBYbWxMaXN0DQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJhcmdfN18wIiwgcGFydE5hbWUgPSAiYXJnXzdfMCIpDQotICAgICAgICBTdHJpbmdbXSBhcmc3MCwNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImFyZ182XzAiLCBwYXJ0TmFtZSA9ICJhcmdfNl8wIikNCi0gICAgICAgIENvbXBsZXhBbGwgYXJnNjApOw0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSBhcmcxMA0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIGphdmF4LnhtbC5kYXRhdHlwZS5YTUxHcmVnb3JpYW5DYWxlbmRhcltdDQotICAgICAqLw0KLSAgICBAWG1sTGlzdA0KLSAgICBAV2ViTWV0aG9kDQotICAgIEBXZWJSZXN1bHQobmFtZSA9ICJ0ZXN0Q2FsZW5kYXJMaXN0MVJldHVybiIsIHBhcnROYW1lID0gInRlc3RDYWxlbmRhckxpc3QxUmV0dXJuIikNCi0gICAgcHVibGljIFhNTEdyZWdvcmlhbkNhbGVuZGFyW10gdGVzdENhbGVuZGFyTGlzdDEoDQotICAgICAgICBAWG1sTGlzdA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiYXJnXzFfMCIsIHBhcnROYW1lID0gImFyZ18xXzAiKQ0KLSAgICAgICAgWE1MR3JlZ29yaWFuQ2FsZW5kYXJbXSBhcmcxMCk7DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGFyZzIwDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgamF2YS5sYW5nLlN0cmluZ1tdDQotICAgICAqLw0KLSAgICBAWG1sTGlzdA0KLSAgICBAV2ViTWV0aG9kDQotICAgIEBXZWJSZXN1bHQobmFtZSA9ICJ0ZXN0U3RyaW5nTGlzdDJSZXR1cm4iLCBwYXJ0TmFtZSA9ICJ0ZXN0U3RyaW5nTGlzdDJSZXR1cm4iKQ0KLSAgICBwdWJsaWMgU3RyaW5nW10gdGVzdFN0cmluZ0xpc3QyKA0KLSAgICAgICAgQFhtbExpc3QNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImFyZ18yXzAiLCBwYXJ0TmFtZSA9ICJhcmdfMl8wIikNCi0gICAgICAgIFN0cmluZ1tdIGFyZzIwKTsNCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gYXJnMzANCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBqYXZhLm1hdGguQmlnSW50ZWdlcltdDQotICAgICAqLw0KLSAgICBAWG1sTGlzdA0KLSAgICBAV2ViTWV0aG9kDQotICAgIEBXZWJSZXN1bHQobmFtZSA9ICJ0ZXN0QmlnSW50ZWdlckxpc3QzUmV0dXJuIiwgcGFydE5hbWUgPSAidGVzdEJpZ0ludGVnZXJMaXN0M1JldHVybiIpDQotICAgIHB1YmxpYyBCaWdJbnRlZ2VyW10gdGVzdEJpZ0ludGVnZXJMaXN0MygNCi0gICAgICAgIEBYbWxMaXN0DQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJhcmdfM18wIiwgcGFydE5hbWUgPSAiYXJnXzNfMCIpDQotICAgICAgICBCaWdJbnRlZ2VyW10gYXJnMzApOw0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSBhcmc0MA0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIGphdmEubGFuZy5Mb25nW10NCi0gICAgICovDQotICAgIEBYbWxMaXN0DQotICAgIEBXZWJNZXRob2QNCi0gICAgQFdlYlJlc3VsdChuYW1lID0gInRlc3RMb25nTGlzdDRSZXR1cm4iLCBwYXJ0TmFtZSA9ICJ0ZXN0TG9uZ0xpc3Q0UmV0dXJuIikNCi0gICAgcHVibGljIExvbmdbXSB0ZXN0TG9uZ0xpc3Q0KA0KLSAgICAgICAgQFhtbExpc3QNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImFyZ180XzAiLCBwYXJ0TmFtZSA9ICJhcmdfNF8wIikNCi0gICAgICAgIExvbmdbXSBhcmc0MCk7DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGFyZzUwDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm94eS5ycGNsaXQuRW51bVtdDQotICAgICAqLw0KLSAgICBAWG1sTGlzdA0KLSAgICBAV2ViTWV0aG9kDQotICAgIEBXZWJSZXN1bHQobmFtZSA9ICJ0ZXN0RW51bUxpc3Q1UmV0dXJuIiwgcGFydE5hbWUgPSAidGVzdEVudW1MaXN0NVJldHVybiIpDQotICAgIHB1YmxpYyBFbnVtW10gdGVzdEVudW1MaXN0NSgNCi0gICAgICAgIEBYbWxMaXN0DQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJhcmdfNV8wIiwgcGFydE5hbWUgPSAiYXJnXzVfMCIpDQotICAgICAgICBFbnVtW10gYXJnNTApOw0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSBhcmc2MA0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIG9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJveHkucnBjbGl0LkNvbXBsZXhBbGwNCi0gICAgICovDQotICAgIEBXZWJNZXRob2QNCi0gICAgQFdlYlJlc3VsdChuYW1lID0gInRlc3RDb21wbGV4QWxsNlJldHVybiIsIHBhcnROYW1lID0gInRlc3RDb21wbGV4QWxsNlJldHVybiIpDQotICAgIHB1YmxpYyBDb21wbGV4QWxsIHRlc3RDb21wbGV4QWxsNigNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImFyZ182XzAiLCBwYXJ0TmFtZSA9ICJhcmdfNl8wIikNCi0gICAgICAgIENvbXBsZXhBbGwgYXJnNjApOw0KLSAgICANCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gYXJnNzANCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBqYXZhLmxhbmcuU3RyaW5nW10NCi0gICAgICovDQotICAgIEBYbWxMaXN0DQotICAgIEBXZWJNZXRob2QNCi0gICAgQFdlYlJlc3VsdChuYW1lID0gInRlc3RFbnVtTGlzdDdSZXR1cm4iLCBwYXJ0TmFtZSA9ICJ0ZXN0RW51bUxpc3Q3UmV0dXJuIikNCi0gICAgcHVibGljIFN0cmluZ1tdIHRlc3RFbnVtTGlzdDcoDQotICAgICAgICBAWG1sTGlzdA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiYXJnXzdfMCIsIHBhcnROYW1lID0gImFyZ183XzAiKQ0KLSAgICAgICAgU3RyaW5nW10gYXJnNzApOw0KLQ0KLSAgICAvKioNCi0gICAgICogVGVzdHMgRmF1bHQNCi0gICAgICovDQotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZT0idGVzdEZhdWx0IiwgYWN0aW9uPSJ0ZXN0RmF1bHQiKQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmF1bHQoKSB0aHJvd3MgUlBDRmF1bHQ7DQotDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9ycGNsaXQvc2VpL1JQQ0xpdFNlcnZpY2UuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9ycGNsaXQvc2VpL1JQQ0xpdFNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQyNTBhYi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvcnBjbGl0L3NlaS9SUENMaXRTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0NCi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnByb3h5LnJwY2xpdC5zZWk7DQotDQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViRW5kcG9pbnQ7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlQ2xpZW50Ow0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247DQotaW1wb3J0IGphdmEubmV0LlVSTDsNCi0NCi0vKioNCi0gKiBUaGlzIGNsYXNzIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIEpBWFdTIFNJLg0KLSAqIEpBWC1XUyBSSSAyLjBfMDEtYjE1LWZjcw0KLSAqIEdlbmVyYXRlZCBzb3VyY2UgdmVyc2lvbjogMi4wDQotICogDQotICovDQotQFdlYlNlcnZpY2VDbGllbnQobmFtZSA9ICJSUENMaXRTZXJ2aWNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L3JwY2xpdCIsIHdzZGxMb2NhdGlvbiA9ICJSUENMaXQud3NkbCIpDQotcHVibGljIGNsYXNzIFJQQ0xpdFNlcnZpY2UNCi0gICAgZXh0ZW5kcyBTZXJ2aWNlDQotew0KLQ0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBVUkwgUlBDTElUU0VSVklDRV9XU0RMX0xPQ0FUSU9OOw0KLQ0KLSAgICBzdGF0aWMgew0KLSAgICAgICAgVVJMIHVybCA9IG51bGw7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIHVybCA9IG5ldyBVUkwoImZpbGU6L0M6L3JwY3Rlc3Qvc2FtcGxlL1JQQ0xpdC53c2RsIik7DQotICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICB9DQotICAgICAgICBSUENMSVRTRVJWSUNFX1dTRExfTE9DQVRJT04gPSB1cmw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFJQQ0xpdFNlcnZpY2UoVVJMIHdzZGxMb2NhdGlvbiwgUU5hbWUgc2VydmljZU5hbWUpIHsNCi0gICAgICAgIHN1cGVyKHdzZGxMb2NhdGlvbiwgc2VydmljZU5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBSUENMaXRTZXJ2aWNlKCkgew0KLSAgICAgICAgc3VwZXIoUlBDTElUU0VSVklDRV9XU0RMX0xPQ0FUSU9OLCBuZXcgUU5hbWUoImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L3JwY2xpdCIsICJSUENMaXRTZXJ2aWNlIikpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBSUENMaXQNCi0gICAgICovDQotICAgIEBXZWJFbmRwb2ludChuYW1lID0gIlJQQ0xpdCIpDQotICAgIHB1YmxpYyBSUENMaXQgZ2V0UlBDTGl0KCkgew0KLSAgICAgICAgcmV0dXJuIChSUENMaXQpc3VwZXIuZ2V0UG9ydChuZXcgUU5hbWUoImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L3JwY2xpdCIsICJSUENMaXQiKSwgUlBDTGl0LmNsYXNzKTsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvcnBjbGl0c3dhL01FVEEtSU5GL01BTklGRVNULk1GIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L3JwY2xpdHN3YS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY0YjU2OC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvcnBjbGl0c3dhL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wDQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L3JwY2xpdHN3YS9NRVRBLUlORi9SUENMaXRTV0Eud3NkbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9ycGNsaXRzd2EvTUVUQS1JTkYvUlBDTGl0U1dBLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlNTZmMGEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L3JwY2xpdHN3YS9NRVRBLUlORi9SUENMaXRTV0Eud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTx3c2RsOmRlZmluaXRpb25zIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvcnBjbGl0c3dhIiANCi14bWxucz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIA0KLXhtbG5zOmFwYWNoZXNvYXA9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94bWwtc29hcCIgDQoteG1sbnM6aW1wbD0iaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvcnBjbGl0c3dhIiANCi14bWxuczppbnRmPSJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9ycGNsaXRzd2EiIA0KLXhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiANCi14bWxuczp3c2Rsc29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIgDQoteG1sbnM6bWltZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9taW1lLyINCi14bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4NCi0gICA8d3NkbDptZXNzYWdlIG5hbWU9ImVjaG9SZXF1ZXN0Ij4NCi0gICAgICA8d3NkbDpwYXJ0IG5hbWU9InJlcXVlc3QiIHR5cGU9InhzZDpzdHJpbmciLz4NCi0gICAgICA8d3NkbDpwYXJ0IG5hbWU9ImR1bW15QXR0YWNobWVudElOIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPg0KLSAgICAgIDx3c2RsOnBhcnQgbmFtZT0iZHVtbXlBdHRhY2htZW50SU5PVVQiIHR5cGU9InhzZDpiYXNlNjRCaW5hcnkiIC8+DQotICAgPC93c2RsOm1lc3NhZ2U+DQotICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJlY2hvUmVzcG9uc2UiPg0KLSAgICAgIDx3c2RsOnBhcnQgbmFtZT0icmVzcG9uc2UiIHR5cGU9InhzZDpzdHJpbmciLz4NCi0gICAgICA8d3NkbDpwYXJ0IG5hbWU9ImR1bW15QXR0YWNobWVudElOT1VUIiB0eXBlPSJ4c2Q6YmFzZTY0QmluYXJ5IiAvPg0KLSAgICAgIDx3c2RsOnBhcnQgbmFtZT0iZHVtbXlBdHRhY2htZW50T1VUIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+DQotICAgPC93c2RsOm1lc3NhZ2U+DQotDQotDQotICAgPHdzZGw6cG9ydFR5cGUgbmFtZT0iUlBDTGl0U1dBIj4NCi0gICAgIA0KLSAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJlY2hvIj4NCi0NCi0gICAgICAgICA8d3NkbDppbnB1dCBtZXNzYWdlPSJpbXBsOmVjaG9SZXF1ZXN0IiBuYW1lPSJlY2hvUmVxdWVzdCIvPg0KLQ0KLSAgICAgICAgIDx3c2RsOm91dHB1dCBtZXNzYWdlPSJpbXBsOmVjaG9SZXNwb25zZSIgbmFtZT0iZWNob1Jlc3BvbnNlIi8+DQotDQotICAgICAgPC93c2RsOm9wZXJhdGlvbj4NCi0gICAgICAgICAgIA0KLSAgIDwvd3NkbDpwb3J0VHlwZT4NCi0NCi0gICA8d3NkbDpiaW5kaW5nIG5hbWU9IlJQQ0xpdFNXQVNvYXBCaW5kaW5nIiB0eXBlPSJpbXBsOlJQQ0xpdFNXQSI+DQotDQotICAgICAgPHdzZGxzb2FwOmJpbmRpbmcgc3R5bGU9InJwYyIgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiLz4NCi0NCi0gICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iZWNobyI+DQotICAgICAgICAgPHdzZGxzb2FwOm9wZXJhdGlvbi8+DQotICAgICAgICAgPHdzZGw6aW5wdXQ+DQotICAgICAgICAgICAgPG1pbWU6bXVsdGlwYXJ0UmVsYXRlZD4NCi0gICAgICAgICAgICAgICA8bWltZTpwYXJ0Pg0KLSAgICAgICAgICAgICAgICAgPHdzZGxzb2FwOmJvZHkgcGFydHM9InJlcXVlc3QiIHVzZT0ibGl0ZXJhbCIgbmFtZXNwYWNlPSJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9ycGNsaXRzd2EiLz4gDQotICAgICAgICAgICAgICAgPC9taW1lOnBhcnQ+DQotICAgICAgICAgICAgICAgPG1pbWU6cGFydD4NCi0gICAgICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgcGFydD0iZHVtbXlBdHRhY2htZW50SU4iIHR5cGU9InRleHQvcGxhaW4iLz4NCi0gICAgICAgICAgICAgICA8L21pbWU6cGFydD4NCi0gICAgICAgICAgICAgICA8bWltZTpwYXJ0Pg0KLSAgICAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCBwYXJ0PSJkdW1teUF0dGFjaG1lbnRJTk9VVCIgdHlwZT0iaW1hZ2UvanBlZyIvPg0KLSAgICAgICAgICAgICAgIDwvbWltZTpwYXJ0Pg0KLSAgICAgICAgICAgIDwvbWltZTptdWx0aXBhcnRSZWxhdGVkPg0KLSAgICAgICAgIDwvd3NkbDppbnB1dD4NCi0gICAgICAgICA8d3NkbDpvdXRwdXQ+DQotICAgICAgICAgICAgPG1pbWU6bXVsdGlwYXJ0UmVsYXRlZD4NCi0gICAgICAgICAgICAgICA8bWltZTpwYXJ0Pg0KLSAgICAgICAgICAgICAgICAgIDx3c2Rsc29hcDpib2R5IHBhcnRzPSJyZXNwb25zZSIgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9Imh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L3JwY2xpdHN3YSIgIC8+DQotICAgICAgICAgICAgICAgPC9taW1lOnBhcnQ+DQotICAgICAgICAgICAgICAgPG1pbWU6cGFydD4NCi0gICAgICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgcGFydD0iZHVtbXlBdHRhY2htZW50SU5PVVQiIHR5cGU9ImltYWdlL2pwZWciLz4NCi0gICAgICAgICAgICAgICA8L21pbWU6cGFydD4NCi0gICAgICAgICAgICAgICA8bWltZTpwYXJ0Pg0KLSAgICAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCBwYXJ0PSJkdW1teUF0dGFjaG1lbnRPVVQiIHR5cGU9InRleHQvcGxhaW4iLz4NCi0gICAgICAgICAgICAgICA8L21pbWU6cGFydD4NCi0gICAgICAgICAgICA8L21pbWU6bXVsdGlwYXJ0UmVsYXRlZD4NCi0gICAgICAgICA8L3dzZGw6b3V0cHV0Pg0KLSAgICAgIDwvd3NkbDpvcGVyYXRpb24+DQotICAgPC93c2RsOmJpbmRpbmc+DQotDQotICAgPHdzZGw6c2VydmljZSBuYW1lPSJSUENMaXRTV0FTZXJ2aWNlIj4NCi0NCi0gICAgICA8d3NkbDpwb3J0IGJpbmRpbmc9ImltcGw6UlBDTGl0U1dBU29hcEJpbmRpbmciIG5hbWU9IlJQQ0xpdFNXQSI+DQotDQotICAgICAgICAgPHdzZGxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6OTA4MC9heGlzMi9zZXJ2aWNlcy9SUENMaXRTV0FTZXJ2aWNlIi8+DQotDQotICAgICAgPC93c2RsOnBvcnQ+DQotDQotICAgPC93c2RsOnNlcnZpY2U+DQotDQotPC93c2RsOmRlZmluaXRpb25zPg0KLQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9ycGNsaXRzd2EvUlBDTGl0U1dBSW1wbC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L3JwY2xpdHN3YS9SUENMaXRTV0FJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4MWIzNmEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L3JwY2xpdHN3YS9SUENMaXRTV0FJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnByb3h5LnJwY2xpdHN3YTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm94eS5ycGNsaXRzd2Euc2VpLlJQQ0xpdFNXQTsNCi0NCi1pbXBvcnQgamF2YXguYWN0aXZhdGlvbi5EYXRhSGFuZGxlcjsNCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5Ib2xkZXI7DQotDQotQFdlYlNlcnZpY2UodGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9ycGNsaXRzd2EiLA0KLSAgICAgICAgICAgIHNlcnZpY2VOYW1lPSJSUENMaXRTV0FTZXJ2aWNlIiwgDQotICAgICAgICAgICAgcG9ydE5hbWU9IlJQQ0xpdFNXQSIsDQotICAgICAgICAgICAgZW5kcG9pbnRJbnRlcmZhY2U9Im9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJveHkucnBjbGl0c3dhLnNlaS5SUENMaXRTV0EiKQ0KLXB1YmxpYyBjbGFzcyBSUENMaXRTV0FJbXBsIGltcGxlbWVudHMgUlBDTGl0U1dBIHsNCi0NCi0gICAgcHVibGljIHZvaWQgZWNobyhTdHJpbmcgcmVxdWVzdCwgU3RyaW5nIGR1bW15QXR0YWNobWVudElOLA0KLSAgICAgICAgICAgIEhvbGRlcjxEYXRhSGFuZGxlcj4gZHVtbXlBdHRhY2htZW50SU5PVVQsIEhvbGRlcjxTdHJpbmc+IHJlc3BvbnNlLA0KLSAgICAgICAgICAgIEhvbGRlcjxTdHJpbmc+IGR1bW15QXR0YWNobWVudE9VVCkgew0KLSAgICAgICAgcmVzcG9uc2UudmFsdWUgPSByZXF1ZXN0Ow0KLSAgICAgICAgZHVtbXlBdHRhY2htZW50T1VULnZhbHVlID0gZHVtbXlBdHRhY2htZW50SU47DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L3JwY2xpdHN3YS9zZWkvUlBDTGl0U1dBLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvcnBjbGl0c3dhL3NlaS9SUENMaXRTV0EuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWUwNzA2ZC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvcnBjbGl0c3dhL3NlaS9SUENMaXRTV0EuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLQ0KLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJveHkucnBjbGl0c3dhLnNlaTsNCi0NCi1pbXBvcnQgamF2YXguYWN0aXZhdGlvbi5EYXRhSGFuZGxlcjsNCi1pbXBvcnQgamF2YXguandzLldlYk1ldGhvZDsNCi1pbXBvcnQgamF2YXguandzLldlYlBhcmFtOw0KLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW0uTW9kZTsNCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7DQotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nOw0KLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5TdHlsZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLkhvbGRlcjsNCi0NCi0NCi0vKioNCi0gKiBUaGlzIGNsYXNzIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIEpBWFdTIFNJLg0KLSAqIEpBWC1XUyBSSSAyLjBfMDEtYjE1LWZjcw0KLSAqIEdlbmVyYXRlZCBzb3VyY2UgdmVyc2lvbjogMi4wDQotICogDQotICovDQotQFdlYlNlcnZpY2UobmFtZSA9ICJSUENMaXRTV0EiLCANCi0JCXRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9ycGNsaXRzd2EiLCANCi0JCXdzZGxMb2NhdGlvbiA9ICJNRVRBLUlORi9SUENMaXRTV0Eud3NkbCIpDQotQFNPQVBCaW5kaW5nKHN0eWxlID0gU3R5bGUuUlBDKQ0KLXB1YmxpYyBpbnRlcmZhY2UgUlBDTGl0U1dBIHsNCi0NCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gcmVxdWVzdA0KLSAgICAgKiBAcGFyYW0gZHVtbXlBdHRhY2htZW50SU5PVVQNCi0gICAgICogQHBhcmFtIGR1bW15QXR0YWNobWVudE9VVA0KLSAgICAgKiBAcGFyYW0gcmVzcG9uc2UNCi0gICAgICogQHBhcmFtIGR1bW15QXR0YWNobWVudElODQotICAgICAqLw0KLSAgICBAV2ViTWV0aG9kDQotICAgIHB1YmxpYyB2b2lkIGVjaG8oDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJyZXF1ZXN0IiwgcGFydE5hbWUgPSAicmVxdWVzdCIpDQotICAgICAgICBTdHJpbmcgcmVxdWVzdCwNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImR1bW15QXR0YWNobWVudElOIiwgcGFydE5hbWUgPSAiZHVtbXlBdHRhY2htZW50SU4iKQ0KLSAgICAgICAgU3RyaW5nIGR1bW15QXR0YWNobWVudElOLA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiZHVtbXlBdHRhY2htZW50SU5PVVQiLCBtb2RlID0gTW9kZS5JTk9VVCwgcGFydE5hbWUgPSAiZHVtbXlBdHRhY2htZW50SU5PVVQiKQ0KLSAgICAgICAgSG9sZGVyPERhdGFIYW5kbGVyPiBkdW1teUF0dGFjaG1lbnRJTk9VVCwNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gInJlc3BvbnNlIiwgbW9kZSA9IE1vZGUuT1VULCBwYXJ0TmFtZSA9ICJyZXNwb25zZSIpDQotICAgICAgICBIb2xkZXI8U3RyaW5nPiByZXNwb25zZSwNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImR1bW15QXR0YWNobWVudE9VVCIsIG1vZGUgPSBNb2RlLk9VVCwgcGFydE5hbWUgPSAiZHVtbXlBdHRhY2htZW50T1VUIikNCi0gICAgICAgIEhvbGRlcjxTdHJpbmc+IGR1bW15QXR0YWNobWVudE9VVCk7DQotDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9ycGNsaXRzd2Evc2VpL1JQQ0xpdFNXQVNlcnZpY2UuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9ycGNsaXRzd2Evc2VpL1JQQ0xpdFNXQVNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjllMzY2OC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvcnBjbGl0c3dhL3NlaS9SUENMaXRTV0FTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnByb3h5LnJwY2xpdHN3YS5zZWk7DQotDQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViRW5kcG9pbnQ7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlQ2xpZW50Ow0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247DQotaW1wb3J0IGphdmEubmV0LlVSTDsNCi0NCi0NCi0vKioNCi0gKiBUaGlzIGNsYXNzIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIEpBWFdTIFNJLg0KLSAqIEpBWC1XUyBSSSAyLjBfMDEtYjE1LWZjcw0KLSAqIEdlbmVyYXRlZCBzb3VyY2UgdmVyc2lvbjogMi4wDQotICogDQotICovDQotQFdlYlNlcnZpY2VDbGllbnQobmFtZSA9ICJSUENMaXRTV0FTZXJ2aWNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L3JwY2xpdHN3YSIsIHdzZGxMb2NhdGlvbiA9ICJycGNsaXRzd2Eud3NkbCIpDQotcHVibGljIGNsYXNzIFJQQ0xpdFNXQVNlcnZpY2UNCi0gICAgZXh0ZW5kcyBTZXJ2aWNlDQotew0KLQ0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBVUkwgUlBDTElUU1dBRVJWSUNFX1dTRExfTE9DQVRJT047DQotDQotICAgIHN0YXRpYyB7DQotICAgICAgICBVUkwgdXJsID0gbnVsbDsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgdXJsID0gbmV3IFVSTCgiZmlsZTovQzovZGVmZWN0cy9ycGNsaXRzd2Eud3NkbCIpOw0KLSAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgUlBDTElUU1dBRVJWSUNFX1dTRExfTE9DQVRJT04gPSB1cmw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFJQQ0xpdFNXQVNlcnZpY2UoVVJMIHdzZGxMb2NhdGlvbiwgUU5hbWUgc2VydmljZU5hbWUpIHsNCi0gICAgICAgIHN1cGVyKHdzZGxMb2NhdGlvbiwgc2VydmljZU5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBSUENMaXRTV0FTZXJ2aWNlKCkgew0KLSAgICAgICAgc3VwZXIoUlBDTElUU1dBRVJWSUNFX1dTRExfTE9DQVRJT04sIG5ldyBRTmFtZSgiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvcnBjbGl0c3dhIiwgIlJQQ0xpdFNXQVNlcnZpY2UiKSk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIFJQQ0xpdFNXQQ0KLSAgICAgKi8NCi0gICAgQFdlYkVuZHBvaW50KG5hbWUgPSAiUlBDTGl0U1dBIikNCi0gICAgcHVibGljIFJQQ0xpdFNXQSBnZXRSUENMaXRTV0EoKSB7DQotICAgICAgICByZXR1cm4gKFJQQ0xpdFNXQSlzdXBlci5nZXRQb3J0KG5ldyBRTmFtZSgiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvcnBjbGl0c3dhIiwgIlJQQ0xpdFNXQSIpLCBSUENMaXRTV0EuY2xhc3MpOw0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9zb2FwMTIvRWNoby5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L3NvYXAxMi9FY2hvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwOWZlMWQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L3NvYXAxMi9FY2hvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnByb3h5LnNvYXAxMjsNCi0NCi1pbXBvcnQgamF2YXguandzLldlYk1ldGhvZDsNCi1pbXBvcnQgamF2YXguandzLldlYlBhcmFtOw0KLWltcG9ydCBqYXZheC5qd3MuV2ViUmVzdWx0Ow0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLlJlcXVlc3RXcmFwcGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuUmVzcG9uc2VXcmFwcGVyOw0KLQ0KLUBXZWJTZXJ2aWNlKG5hbWUgPSAiRWNobyIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vamF4d3MuYXhpczIuYXBhY2hlLm9yZy9wcm94eS9zb2FwMTIiKQ0KLXB1YmxpYyBpbnRlcmZhY2UgRWNobyB7DQotDQotICAgIEBXZWJNZXRob2QNCi0gICAgQFdlYlJlc3VsdChuYW1lID0gInJlc3BvbnNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9qYXh3cy5heGlzMi5hcGFjaGUub3JnL3Byb3h5L3NvYXAxMiIpDQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAiZWNobyIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vamF4d3MuYXhpczIuYXBhY2hlLm9yZy9wcm94eS9zb2FwMTIiLCBjbGFzc05hbWUgPSAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm94eS5zb2FwMTIuRWNob1R5cGUiKQ0KLSAgICBAUmVzcG9uc2VXcmFwcGVyKGxvY2FsTmFtZSA9ICJlY2hvUmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL2pheHdzLmF4aXMyLmFwYWNoZS5vcmcvcHJveHkvc29hcDEyIiwgY2xhc3NOYW1lID0gIm9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJveHkuc29hcDEyLkVjaG9SZXNwb25zZVR5cGUiKQ0KLSAgICBwdWJsaWMgU3RyaW5nIGVjaG8oDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJyZXF1ZXN0IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9qYXh3cy5heGlzMi5hcGFjaGUub3JnL3Byb3h5L3NvYXAxMiIpDQotICAgICAgICBTdHJpbmcgcmVxdWVzdCk7DQotDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9zb2FwMTIvU09BUDEyRWNob1NlcnZpY2UuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9zb2FwMTIvU09BUDEyRWNob1NlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JhMDM3Ni4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvc29hcDEyL1NPQVAxMkVjaG9TZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnByb3h5LnNvYXAxMjsNCi0NCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJFbmRwb2ludDsNCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VDbGllbnQ7DQotaW1wb3J0IGphdmEuaW8uRmlsZTsNCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLm5ldC5VUkw7DQotDQotQFdlYlNlcnZpY2VDbGllbnQobmFtZSA9ICJTT0FQMTJFY2hvU2VydmljZSIsIA0KLSAgICAgICAgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9qYXh3cy5heGlzMi5hcGFjaGUub3JnL3Byb3h5L3NvYXAxMiIsIA0KLSAgICAgICAgd3NkbExvY2F0aW9uID0gIlNPQVAxMkVjaG8ud3NkbCIpDQotcHVibGljIGNsYXNzIFNPQVAxMkVjaG9TZXJ2aWNlDQotICAgIGV4dGVuZHMgU2VydmljZQ0KLXsNCi0NCi0gICAgDQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFVSTCBTT0FQMTJFQ0hPU0VSVklDRV9XU0RMX0xPQ0FUSU9OOw0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgd3NkbExvY2F0aW9uID0gIi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvc29hcDEyL3NlcnZlci9NRVRBLUlORi9TT0FQMTJFY2hvLndzZGwiOw0KLSAgICBzdGF0aWMgew0KLSAgICAgICAgVVJMIHVybCA9IG51bGw7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIHRyeXsNCi0gICAgICAgICAgICAgICAgU3RyaW5nIGJhc2VEaXIgID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJiYXNlZGlyIiwiLiIpKS5nZXRDYW5vbmljYWxQYXRoKCk7DQotICAgICAgICAgICAgICAgIHdzZGxMb2NhdGlvbiA9IG5ldyBGaWxlKGJhc2VEaXIgKyB3c2RsTG9jYXRpb24pLmdldEFic29sdXRlUGF0aCgpOw0KLSAgICAgICAgICAgIH1jYXRjaChFeGNlcHRpb24gZSl7DQotICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZSh3c2RsTG9jYXRpb24pOw0KLSAgICAgICAgICAgIHVybCA9IGZpbGUudG9VUkwoKTsNCi0gICAgICAgICAgICANCi0gICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIFNPQVAxMkVDSE9TRVJWSUNFX1dTRExfTE9DQVRJT04gPSB1cmw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFNPQVAxMkVjaG9TZXJ2aWNlKFVSTCB3c2RsTG9jYXRpb24sIFFOYW1lIHNlcnZpY2VOYW1lKSB7DQotICAgICAgICBzdXBlcih3c2RsTG9jYXRpb24sIHNlcnZpY2VOYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU09BUDEyRWNob1NlcnZpY2UoKSB7DQotICAgICAgICBzdXBlcihTT0FQMTJFQ0hPU0VSVklDRV9XU0RMX0xPQ0FUSU9OLCBuZXcgUU5hbWUoImh0dHA6Ly9qYXh3cy5heGlzMi5hcGFjaGUub3JnL3Byb3h5L3NvYXAxMiIsICJTT0FQMTJFY2hvU2VydmljZSIpKTsNCi0gICAgfQ0KLQ0KLSAgICBAV2ViRW5kcG9pbnQobmFtZSA9ICJFY2hvUG9ydCIpDQotICAgIHB1YmxpYyBFY2hvIGdldEVjaG9Qb3J0KCkgew0KLSAgICAgICAgcmV0dXJuIChFY2hvKXN1cGVyLmdldFBvcnQobmV3IFFOYW1lKCJodHRwOi8vamF4d3MuYXhpczIuYXBhY2hlLm9yZy9wcm94eS9zb2FwMTIiLCAiRWNob1BvcnQiKSwgRWNoby5jbGFzcyk7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L3NvYXAxMi9zZXJ2ZXIvTUVUQS1JTkYvU09BUDEyRWNoby53c2RsIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L3NvYXAxMi9zZXJ2ZXIvTUVUQS1JTkYvU09BUDEyRWNoby53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODMxMTJlLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9zb2FwMTIvc2VydmVyL01FVEEtSU5GL1NPQVAxMkVjaG8ud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotDQotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPGRlZmluaXRpb25zIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2pheHdzLmF4aXMyLmFwYWNoZS5vcmcvcHJveHkvc29hcDEyIg0KLSAgICAgIHhtbG5zOnRucz0iaHR0cDovL2pheHdzLmF4aXMyLmFwYWNoZS5vcmcvcHJveHkvc29hcDEyIg0KLSAgICAgIHhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIgDQotICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSINCi0gICAgICB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAxMi8iPg0KLQ0KLSAgIDx0eXBlcz4NCi0gICAgICA8eHNkOnNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9qYXh3cy5heGlzMi5hcGFjaGUub3JnL3Byb3h5L3NvYXAxMiINCi0gICAgICAgICB4bWxuczp0bnM9Imh0dHA6Ly9qYXh3cy5heGlzMi5hcGFjaGUub3JnL3Byb3h5L3NvYXAxMiINCi0gICAgICAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiDQotICAgICAgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPg0KLQ0KLSAgICAgICAgIDxjb21wbGV4VHlwZSBuYW1lPSJlY2hvVHlwZSI+DQotICAgICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InJlcXVlc3QiIHR5cGU9InhzZDpzdHJpbmciLz4NCi0gICAgICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDwvY29tcGxleFR5cGU+DQotDQotICAgICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9ImVjaG9SZXNwb25zZVR5cGUiPg0KLSAgICAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJyZXNwb25zZSIgdHlwZT0ieHNkOnN0cmluZyIvPg0KLSAgICAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgPC9jb21wbGV4VHlwZT4NCi0NCi0gICAgICAgICA8ZWxlbWVudCBuYW1lPSJlY2hvIiB0eXBlPSJ0bnM6ZWNob1R5cGUiLz4NCi0gICAgICAgICA8ZWxlbWVudCBuYW1lPSJlY2hvUmVzcG9uc2UiIHR5cGU9InRuczplY2hvUmVzcG9uc2VUeXBlIi8+DQotDQotICAgICAgPC94c2Q6c2NoZW1hPg0KLSAgIDwvdHlwZXM+DQotDQotICAgPG1lc3NhZ2UgbmFtZT0iZWNobyI+DQotICAgICAgPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0idG5zOmVjaG8iLz4NCi0gICA8L21lc3NhZ2U+DQotDQotICAgPG1lc3NhZ2UgbmFtZT0iZWNob1Jlc3BvbnNlIj4NCi0gICAgICA8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJ0bnM6ZWNob1Jlc3BvbnNlIi8+DQotICAgPC9tZXNzYWdlPg0KLQ0KLSAgIDxwb3J0VHlwZSBuYW1lPSJFY2hvIj4NCi0gICAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG8iPg0KLSAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6ZWNobyIgLz4NCi0gICAgICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczplY2hvUmVzcG9uc2UiIC8+DQotICAgICAgPC9vcGVyYXRpb24+DQotICAgPC9wb3J0VHlwZT4NCi0NCi0gICA8YmluZGluZyBuYW1lPSJFY2hvQmluZGluZyIgdHlwZT0idG5zOkVjaG8iPg0KLSAgICAgIDxzb2FwOmJpbmRpbmcgc3R5bGU9ImRvY3VtZW50IiB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIvPg0KLSAgICAgIDxvcGVyYXRpb24gbmFtZT0iZWNobyI+DQotICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPg0KLSAgICAgICAgIDxpbnB1dD4NCi0gICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgICAgIDwvaW5wdXQ+DQotDQotICAgICAgICAgPG91dHB1dD4NCi0gICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgICAgIDwvb3V0cHV0Pg0KLSAgICAgIDwvb3BlcmF0aW9uPg0KLSAgIDwvYmluZGluZz4NCi0NCi0gICA8c2VydmljZSBuYW1lPSJTT0FQMTJFY2hvU2VydmljZSI+DQotICAgICAgPHBvcnQgYmluZGluZz0idG5zOkVjaG9CaW5kaW5nIiBuYW1lPSJFY2hvUG9ydCI+DQotICAgICAgICAgPHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo2MDYwL2F4aXMyL3NlcnZpY2VzL1NPQVAxMkVjaG9TZXJ2aWNlIi8+DQotICAgICAgPC9wb3J0Pg0KLSAgIDwvc2VydmljZT4NCi08L2RlZmluaXRpb25zPg0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9zb2FwMTIvc2VydmVyL1NPQVAxMkVjaG9JbXBsLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvc29hcDEyL3NlcnZlci9TT0FQMTJFY2hvSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmFkNmE3Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9zb2FwMTIvc2VydmVyL1NPQVAxMkVjaG9JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm94eS5zb2FwMTIuc2VydmVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLlRlc3RMb2dnZXI7DQotDQotaW1wb3J0IGphdmF4LnhtbC53cy5CaW5kaW5nVHlwZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLlByb3ZpZGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZS5Nb2RlOw0KLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZU1vZGU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlUHJvdmlkZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5zb2FwLlNPQVBCaW5kaW5nOw0KLQ0KLUBXZWJTZXJ2aWNlUHJvdmlkZXIodGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vamF4d3MuYXhpczIuYXBhY2hlLm9yZy9wcm94eS9zb2FwMTIiLA0KLQkJCQkJc2VydmljZU5hbWU9IlNPQVAxMkVjaG9TZXJ2aWNlIiwNCi0JCQkJCXdzZGxMb2NhdGlvbj0iTUVUQS1JTkYvU09BUDEyRWNoby53c2RsIiwNCi0JCQkJCXBvcnROYW1lPSJFY2hvUG9ydCIpDQotQEJpbmRpbmdUeXBlKFNPQVBCaW5kaW5nLlNPQVAxMkhUVFBfQklORElORykNCi1AU2VydmljZU1vZGUoTW9kZS5NRVNTQUdFKQ0KLXB1YmxpYyBjbGFzcyBTT0FQMTJFY2hvSW1wbCBpbXBsZW1lbnRzIFByb3ZpZGVyPFN0cmluZz4gew0KLSAgICANCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNPQVAxMV9OU19VUkkgPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09BUDEyX05TX1VSSSA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUiOw0KLSAgICANCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFTkRfU09BUDExX1JFU1BPTlNFID0gIlJFU1BPTlNFLVNPQVAxMSI7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRU5EX1NPQVAxMl9SRVNQT05TRSA9ICJSRVNQT05TRS1TT0FQMTIiOw0KLSAgICANCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09BUDExX0VOVkVMT1BFX0hFQUQgPSANCi0gICAgICAgICI8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSd1dGYtOCc/PiIgKyANCi0gICAgICAgICI8c29hcGVudjpFbnZlbG9wZSB4bWxuczpzb2FwZW52PVwiIiArIFNPQVAxMV9OU19VUkkgKyAiXCI+IiArDQotICAgICAgICAiPHNvYXBlbnY6SGVhZGVyIC8+IiArIA0KLSAgICAgICAgIjxzb2FwZW52OkJvZHk+IjsNCi0gICAgDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNPQVAxMl9FTlZFTE9QRV9IRUFEID0gDQotICAgICAgICAiPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0ndXRmLTgnPz4iICsgDQotICAgICAgICAiPHNvYXBlbnY6RW52ZWxvcGUgeG1sbnM6c29hcGVudj1cIiIgKyBTT0FQMTJfTlNfVVJJICsgIlwiPiIgKw0KLSAgICAgICAgIjxzb2FwZW52OkhlYWRlciAvPiIgKyANCi0gICAgICAgICI8c29hcGVudjpCb2R5PiI7DQotICAgIA0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTT0FQMTFfRU5WRUxPUEVfVEFJTCA9IA0KLSAgICAgICAgIjwvc29hcGVudjpCb2R5PiIgKyANCi0gICAgICAgICI8L3NvYXBlbnY6RW52ZWxvcGU+IjsNCi0gICAgDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNPQVAxMl9FTlZFTE9QRV9UQUlMID0gDQotICAgICAgICAiPC9zb2FwZW52OkJvZHk+IiArIA0KLSAgICAgICAgIjwvc29hcGVudjpFbnZlbG9wZT4iOw0KLSAgICAgICAgDQotICAgIHB1YmxpYyBTdHJpbmcgaW52b2tlKFN0cmluZyBpbnB1dCkgew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoInJlY2VpdmVkIHJlcXVlc3QgWyIgKyBpbnB1dCArICJdIik7DQotICAgICAgICANCi0gICAgICAgIC8vIGNoZWNrIHRoZSByZXF1ZXN0IHRvIHNlZSBpZiBpdCBjb250YWlucyB0aGUgU09BUCAxLjEgbmFtZXNwYWNlIA0KLSAgICAgICAgLy8gVVJJLiAgaWYgc28sIHRoZW4gdGhhdCBpcyBhbiBlcnJvciBhbmQgd2Ugc2hvdWxkIHJlc3BvbmQgd2l0aCANCi0gICAgICAgIC8vIGEgZmFpbHVyZS4NCi0gICAgICAgIFN0cmluZyBzdGF0dXMgPSAiRkFJTCI7DQotICAgICAgICBpZiAoaW5wdXQuaW5kZXhPZihTT0FQMTJfTlNfVVJJKSA+IDApIHsNCi0gICAgICAgICAgICBzdGF0dXMgPSAiUEFTUyI7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoInRoZSByZXF1ZXN0IGNvbnRhaW5zIHRoZSBTT0FQIDEuMiBuYW1lc3BhY2UgYXMgZXhwZWN0ZWQuIik7DQotICAgICAgICB9DQotICAgICAgICBlbHNlIHsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygidGhlIHJlcXVlc3QgZGlkIE5PVCBjb250YWluIHRoZSBTT0FQIDEuMiBuYW1lc3BhY2UuIik7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoInNlbmRpbmcgYmFjayBhIGZhaWx1cmUiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgLy8gdGhlIGNvbnRlbnRzIG9mIHRoZSByZXNwb25zZSBzaG91bGQgY29udGFpbiB0aGUgc3RhdHVzDQotICAgICAgICBTdHJpbmcgcmVzcG9uc2VCb2R5ID0gICAgICAgICAgICAgDQotICAgICAgICAgICAgIjxlY2hvUmVzcG9uc2UgeG1sbnM9XCJodHRwOi8vamF4d3MuYXhpczIuYXBhY2hlLm9yZy9wcm94eS9zb2FwMTJcIj4iICsNCi0gICAgICAgICAgICAiPHJlc3BvbnNlPiIgKyBzdGF0dXMgKyAiPC9yZXNwb25zZT4iICsNCi0gICAgICAgICAgICAiPC9lY2hvUmVzcG9uc2U+IjsgDQotICAgICAgICANCi0gICAgICAgIC8vIGJ1aWxkIHVwIHRoZSBhcHByb3ByaWF0ZSBlbnZlbG9wZSB0eXBlIGZvciB0aGUgcmVzcG9uc2UNCi0gICAgICAgIC8vIGJhc2VkIG9uIHdoYXQgd2FzIHRoZSBjbGllbnQgcmVxdWVzdGVkLg0KLSAgICAgICAgU3RyaW5nQnVmZmVyIHJlc3BvbnNlID0gbmV3IFN0cmluZ0J1ZmZlcigpOw0KLSAgICAgICAgaWYgKGlucHV0LmluZGV4T2YoU0VORF9TT0FQMTFfUkVTUE9OU0UpID4gMCkgew0KLSAgICAgICAgICAgIHJlc3BvbnNlLmFwcGVuZChTT0FQMTFfRU5WRUxPUEVfSEVBRCk7DQotICAgICAgICAgICAgcmVzcG9uc2UuYXBwZW5kKHJlc3BvbnNlQm9keSk7DQotICAgICAgICAgICAgcmVzcG9uc2UuYXBwZW5kKFNPQVAxMV9FTlZFTE9QRV9UQUlMKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYgKGlucHV0LmluZGV4T2YoU0VORF9TT0FQMTJfUkVTUE9OU0UpID4gMCkgew0KLSAgICAgICAgICAgIHJlc3BvbnNlLmFwcGVuZChTT0FQMTJfRU5WRUxPUEVfSEVBRCk7DQotICAgICAgICAgICAgcmVzcG9uc2UuYXBwZW5kKHJlc3BvbnNlQm9keSk7DQotICAgICAgICAgICAgcmVzcG9uc2UuYXBwZW5kKFNPQVAxMl9FTlZFTE9QRV9UQUlMKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJzZW5kaW5nIHJlc3BvbnNlIFsiICsgcmVzcG9uc2UgKyAiXSIpOw0KLSAgICAgICAgcmV0dXJuIHJlc3BvbnNlLnRvU3RyaW5nKCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3JwY2xpdC9lbnVtdHlwZS9NRVRBLUlORi9ycGNsaXRlbnVtLndzZGwgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcnBjbGl0L2VudW10eXBlL01FVEEtSU5GL3JwY2xpdGVudW0ud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNiNGY2Ny4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcnBjbGl0L2VudW10eXBlL01FVEEtSU5GL3JwY2xpdGVudW0ud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotDQotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPHdzZGw6ZGVmaW5pdGlvbnMgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vcnBjbGl0LnRlc3Qub3JnIg0KLSAgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIA0KLSAgeG1sbnM6dG5zPSJodHRwOi8vcnBjbGl0LnRlc3Qub3JnIiANCi0gIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIA0KLSAgeG1sbnM6d3NkbHNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iIA0KLSAgeG1sbnM6aW50Zj0iaHR0cDovL3NjaGVtYS5ycGNsaXQudGVzdC5vcmciIA0KLSAgeG1sbnM6aW1wbD0iaHR0cDovL3NjaGVtYS5ycGNsaXQudGVzdC5vcmciIA0KLSAgeG1sbnM6YXBhY2hlc29hcD0iaHR0cDovL3htbC5hcGFjaGUub3JnL3htbC1zb2FwIiANCi0gIHhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+DQotDQotICA8dHlwZXM+DQotICAgIDxzY2hlbWEgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiANCi0gICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9zY2hlbWEucnBjbGl0LnRlc3Qub3JnIiANCi0gICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4NCi0gICAgICA8IS0tIDxlbGVtZW50IG5hbWU9ImVsZW1lbnRTdHJpbmciPiAtLT4NCi0gICAgICAgIDxzaW1wbGVUeXBlIG5hbWU9ImVsZW1lbnRTdHJpbmciPg0KLSAgICAgICAgICA8cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+DQotICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJBIi8+DQotICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJCIi8+DQotICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJDIi8+DQotICAgICAgICAgIDwvcmVzdHJpY3Rpb24+DQotICAgICAgICA8L3NpbXBsZVR5cGU+DQotICAgICAgPCEtLSA8L2VsZW1lbnQ+IC0tPg0KLSAgICA8L3NjaGVtYT4NCi0gIDwvdHlwZXM+DQotDQotICA8d3NkbDptZXNzYWdlIG5hbWU9ImVjaG9TdHJpbmdSZXF1ZXN0Ij4NCi0gICAgPHdzZGw6cGFydCBuYW1lPSJwU3RyaW5nIiB0eXBlPSJpbnRmOmVsZW1lbnRTdHJpbmciLz4NCi0gIDwvd3NkbDptZXNzYWdlPg0KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJlY2hvU3RyaW5nUmVzcG9uc2UiPg0KLSAgICA8d3NkbDpwYXJ0IG5hbWU9InBTdHJpbmciIHR5cGU9ImludGY6ZWxlbWVudFN0cmluZyIvPg0KLSAgPC93c2RsOm1lc3NhZ2U+DQotDQotICA8d3NkbDpwb3J0VHlwZSBuYW1lPSJQb3J0VHlwZSI+DQotICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJlY2hvU3RyaW5nIj4NCi0gICAgICA8d3NkbDppbnB1dCBuYW1lPSJlY2hvU3RyaW5nUmVxdWVzdCIgbWVzc2FnZT0idG5zOmVjaG9TdHJpbmdSZXF1ZXN0Ii8+DQotICAgICAgPHdzZGw6b3V0cHV0IG5hbWU9ImVjaG9TdHJpbmdSZXNwb25zZSIgbWVzc2FnZT0idG5zOmVjaG9TdHJpbmdSZXNwb25zZSIvPg0KLSAgICA8L3dzZGw6b3BlcmF0aW9uPg0KLSAgPC93c2RsOnBvcnRUeXBlPg0KLQ0KLSAgPHdzZGw6YmluZGluZyBuYW1lPSJCaW5kaW5nIiB0eXBlPSJ0bnM6UG9ydFR5cGUiPg0KLSAgICA8d3NkbHNvYXA6YmluZGluZyBzdHlsZT0icnBjIiB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIvPg0KLSAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iZWNob1N0cmluZyI+DQotICAgICAgPHdzZGxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4NCi0gICAgICA8d3NkbDppbnB1dCBuYW1lPSJlY2hvU3RyaW5nUmVxdWVzdCI+DQotICAgICAgICA8d3NkbHNvYXA6Ym9keQ0KLSAgICAgICAgICBuYW1lc3BhY2U9Imh0dHA6Ly9ycGNsaXQudGVzdC5vcmciDQotICAgICAgICAgIHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgIDwvd3NkbDppbnB1dD4NCi0gICAgICA8d3NkbDpvdXRwdXQgbmFtZT0iZWNob1N0cmluZ1Jlc3BvbnNlIj4NCi0gICAgICAgIDx3c2Rsc29hcDpib2R5DQotICAgICAgICAgIG5hbWVzcGFjZT0iaHR0cDovL3JwY2xpdC50ZXN0Lm9yZyINCi0gICAgICAgICAgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgPC93c2RsOm91dHB1dD4NCi0gICAgPC93c2RsOm9wZXJhdGlvbj4NCi0gIDwvd3NkbDpiaW5kaW5nPg0KLQ0KLSAgPHdzZGw6c2VydmljZSBuYW1lPSJSUENMaXRFbnVtU2VydmljZSI+DQotICAgIDx3c2RsOnBvcnQgbmFtZT0iUG9ydCIgYmluZGluZz0idG5zOkJpbmRpbmciPg0KLSAgICAgIDx3c2Rsc29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjYwNjAvYXhpczIvc2VydmljZXMvUlBDTGl0RW51bVNlcnZpY2UiLz4NCi0gICAgPC93c2RsOnBvcnQ+DQotICA8L3dzZGw6c2VydmljZT4NCi0NCi0gIA0KLTwvd3NkbDpkZWZpbml0aW9ucz4NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcnBjbGl0L2VudW10eXBlL1BvcnRUeXBlSW1wbC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3JwY2xpdC9lbnVtdHlwZS9Qb3J0VHlwZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmMyZmI2NC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcnBjbGl0L2VudW10eXBlL1BvcnRUeXBlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5ycGNsaXQuZW51bXR5cGU7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuVGVzdExvZ2dlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5ycGNsaXQuZW51bXR5cGUuc2VpLlBvcnRUeXBlOw0KLWltcG9ydCBvcmcudGVzdC5ycGNsaXQuc2NoZW1hLkVsZW1lbnRTdHJpbmc7DQotDQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuSG9sZGVyOw0KLQ0KLUBXZWJTZXJ2aWNlKHNlcnZpY2VOYW1lPSJSUENMaXRFbnVtU2VydmljZSIsDQotCQllbmRwb2ludEludGVyZmFjZT0ib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5ycGNsaXQuZW51bXR5cGUuc2VpLlBvcnRUeXBlIikNCi1wdWJsaWMgY2xhc3MgUG9ydFR5cGVJbXBsIGltcGxlbWVudHMgUG9ydFR5cGUgew0KLQ0KLSAgICAvKiAobm9uLUphdmFkb2MpDQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5ycGNsaXQuZW51bXR5cGUuc2VpLlBvcnRUeXBlI2VjaG9TdHJpbmcoamF2YXgueG1sLndzLkhvbGRlcikNCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIGVjaG9TdHJpbmcoSG9sZGVyPEVsZW1lbnRTdHJpbmc+IHBTdHJpbmcpIHsNCi0gICAgICAgRWxlbWVudFN0cmluZyBlcyA9IHBTdHJpbmcudmFsdWU7DQotICAgICAgIGlmKGVzID09IGVzLkEpew0KLSAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIkVudW0gQSIpOw0KLSAgICAgICB9DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygicmVzZXR0aW5nIEVudW0gdG8gQiIpOw0KLSAgICAgICBlcyA9IGVzLkI7DQotICAgICAgIHBTdHJpbmcudmFsdWUgPSBlczsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcnBjbGl0L2VudW10eXBlL3NlaS9Qb3J0VHlwZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3JwY2xpdC9lbnVtdHlwZS9zZWkvUG9ydFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y4M2RkOC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcnBjbGl0L2VudW10eXBlL3NlaS9Qb3J0VHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5ycGNsaXQuZW51bXR5cGUuc2VpOw0KLQ0KLWltcG9ydCBvcmcudGVzdC5ycGNsaXQuc2NoZW1hLkVsZW1lbnRTdHJpbmc7DQotDQotaW1wb3J0IGphdmF4Lmp3cy5XZWJNZXRob2Q7DQotaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbTsNCi1pbXBvcnQgamF2YXguandzLldlYlBhcmFtLk1vZGU7DQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOw0KLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZzsNCi1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuU3R5bGU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5Ib2xkZXI7DQotDQotDQotLyoqDQotICogVGhpcyBjbGFzcyB3YXMgZ2VuZXJhdGVkIGJ5IHRoZSBKQVhXUyBTSS4NCi0gKiBKQVgtV1MgUkkgMi4wXzAxLWIxNS1mY3MNCi0gKiBHZW5lcmF0ZWQgc291cmNlIHZlcnNpb246IDIuMA0KLSAqIA0KLSAqLw0KLUBXZWJTZXJ2aWNlKG5hbWUgPSAiUG9ydFR5cGUiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3JwY2xpdC50ZXN0Lm9yZyIpDQotQFNPQVBCaW5kaW5nKHN0eWxlID0gU3R5bGUuUlBDKQ0KLXB1YmxpYyBpbnRlcmZhY2UgUG9ydFR5cGUgew0KLQ0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSBwU3RyaW5nDQotICAgICAqLw0KLSAgICBAV2ViTWV0aG9kDQotICAgIHB1YmxpYyB2b2lkIGVjaG9TdHJpbmcoDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJwU3RyaW5nIiwgbW9kZSA9IE1vZGUuSU5PVVQsIHBhcnROYW1lID0gInBTdHJpbmciKQ0KLSAgICAgICAgSG9sZGVyPEVsZW1lbnRTdHJpbmc+IHBTdHJpbmcpOw0KLQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcnBjbGl0L2VudW10eXBlL3NlaS9TZXJ2aWNlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcnBjbGl0L2VudW10eXBlL3NlaS9TZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyN2EzYzIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3JwY2xpdC9lbnVtdHlwZS9zZWkvU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5ycGNsaXQuZW51bXR5cGUuc2VpOw0KLQ0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOw0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViRW5kcG9pbnQ7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlQ2xpZW50Ow0KLWltcG9ydCBqYXZhLmlvLkZpbGU7DQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLQ0KLQ0KLS8qKg0KLSAqIFRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBieSB0aGUgSkFYV1MgU0kuDQotICogSkFYLVdTIFJJIDIuMF8wMS1iMTUtZmNzDQotICogR2VuZXJhdGVkIHNvdXJjZSB2ZXJzaW9uOiAyLjANCi0gKiANCi0gKi8NCi1AV2ViU2VydmljZUNsaWVudChuYW1lID0gIlJQQ0xpdEVudW1TZXJ2aWNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9ycGNsaXQudGVzdC5vcmciLCB3c2RsTG9jYXRpb24gPSAic29hcGVuYy53c2RsIikNCi1wdWJsaWMgY2xhc3MgU2VydmljZQ0KLSAgICBleHRlbmRzIGphdmF4LnhtbC53cy5TZXJ2aWNlDQotew0KLQ0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBVUkwgU0VSVklDRV9XU0RMX0xPQ0FUSU9OOw0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgd3NkbExvY2F0aW9uPSIvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3JwY2xpdC9lbnVtdHlwZS9NRVRBLUlORi9ycGNsaXRlbnVtLndzZGwiOw0KLSAgICBzdGF0aWMgew0KLSAgICAgICAgVVJMIHVybCA9IG51bGw7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgICAgICB0cnl7DQotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGJhc2VEaXIgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoImJhc2VkaXIiLCIuIikpLmdldENhbm9uaWNhbFBhdGgoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB3c2RsTG9jYXRpb24gPSBuZXcgRmlsZShiYXNlRGlyICsgd3NkbExvY2F0aW9uKS5nZXRBYnNvbHV0ZVBhdGgoKTsNCi0gICAgICAgICAgICAgICAgfWNhdGNoKEV4Y2VwdGlvbiBlKXsNCi0gICAgICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKHdzZGxMb2NhdGlvbik7DQotICAgICAgICAgICAgICAgIHVybCA9IGZpbGUudG9VUkwoKTsNCi0gICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIFNFUlZJQ0VfV1NETF9MT0NBVElPTiA9IHVybDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU2VydmljZShVUkwgd3NkbExvY2F0aW9uLCBRTmFtZSBzZXJ2aWNlTmFtZSkgew0KLSAgICAgICAgc3VwZXIod3NkbExvY2F0aW9uLCBzZXJ2aWNlTmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFNlcnZpY2UoKSB7DQotICAgICAgICBzdXBlcihTRVJWSUNFX1dTRExfTE9DQVRJT04sIG5ldyBRTmFtZSgiaHR0cDovL3JwY2xpdC50ZXN0Lm9yZyIsICJSUENMaXRFbnVtU2VydmljZSIpKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgUG9ydFR5cGUNCi0gICAgICovDQotICAgIEBXZWJFbmRwb2ludChuYW1lID0gIlBvcnQiKQ0KLSAgICBwdWJsaWMgUG9ydFR5cGUgZ2V0UG9ydCgpIHsNCi0gICAgICAgIHJldHVybiAoUG9ydFR5cGUpc3VwZXIuZ2V0UG9ydChuZXcgUU5hbWUoImh0dHA6Ly9ycGNsaXQudGVzdC5vcmciLCAiUG9ydCIpLCBQb3J0VHlwZS5jbGFzcyk7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3JwY2xpdC9lbnVtdHlwZS90ZXN0cy9SUENMaXRFbnVtVGVzdHMuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9ycGNsaXQvZW51bXR5cGUvdGVzdHMvUlBDTGl0RW51bVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3YTk0Y2UuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3JwY2xpdC9lbnVtdHlwZS90ZXN0cy9SUENMaXRFbnVtVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MucnBjbGl0LmVudW10eXBlLnRlc3RzOw0KLQ0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5UZXN0TG9nZ2VyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmZyYW1ld29yay5BYnN0cmFjdFRlc3RDYXNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnJwY2xpdC5lbnVtdHlwZS5zZWkuUG9ydFR5cGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MucnBjbGl0LmVudW10eXBlLnNlaS5TZXJ2aWNlOw0KLWltcG9ydCBvcmcudGVzdC5ycGNsaXQuc2NoZW1hLkVsZW1lbnRTdHJpbmc7DQotDQotaW1wb3J0IGphdmF4LnhtbC53cy5CaW5kaW5nUHJvdmlkZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5Ib2xkZXI7DQotDQotDQotcHVibGljIGNsYXNzIFJQQ0xpdEVudW1UZXN0cyBleHRlbmRzIEFic3RyYWN0VGVzdENhc2Ugew0KLSAgICANCi0JU3RyaW5nIGF4aXNFbmRwb2ludCA9ICJodHRwOi8vbG9jYWxob3N0OjYwNjAvYXhpczIvc2VydmljZXMvUlBDTGl0RW51bVNlcnZpY2UuUG9ydFR5cGVJbXBsUG9ydCI7DQotDQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsNCi0gICAgICAgIHJldHVybiBnZXRUZXN0U2V0dXAobmV3IFRlc3RTdWl0ZShSUENMaXRFbnVtVGVzdHMuY2xhc3MpKTsNCi0gICAgfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0RW51bVNpbXBsZVR5cGUoKXsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJUZXN0IDogIiArIGdldE5hbWUoKSk7DQotICAgICAgICB0cnl7DQotICAgICAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gbmV3IFNlcnZpY2UoKTsNCi0gICAgICAgICAgICBQb3J0VHlwZSBwb3J0VHlwZSA9IHNlcnZpY2UuZ2V0UG9ydCgpOw0KLQ0KLSAgICAgICAgICAgIEJpbmRpbmdQcm92aWRlciBwID0gKEJpbmRpbmdQcm92aWRlcikgcG9ydFR5cGU7DQotICAgICAgICAgICAgcC5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dChCaW5kaW5nUHJvdmlkZXIuRU5EUE9JTlRfQUREUkVTU19QUk9QRVJUWSwgYXhpc0VuZHBvaW50KTsNCi0NCi0gICAgICAgICAgICBIb2xkZXI8RWxlbWVudFN0cmluZz4gcFN0cmluZyA9IG5ldyBIb2xkZXI8RWxlbWVudFN0cmluZz4oRWxlbWVudFN0cmluZy5BKTsNCi0gICAgICAgICAgICBwb3J0VHlwZS5lY2hvU3RyaW5nKHBTdHJpbmcpOw0KLSAgICAgICAgICAgIEVsZW1lbnRTdHJpbmcgZXMgPSBwU3RyaW5nLnZhbHVlOw0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJSZXNwb25zZSA9IiArIGVzKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBUcnkgYSBzZWNvbmQgdGltZQ0KLSAgICAgICAgICAgIHBTdHJpbmcgPSBuZXcgSG9sZGVyPEVsZW1lbnRTdHJpbmc+KEVsZW1lbnRTdHJpbmcuQSk7DQotICAgICAgICAgICAgcG9ydFR5cGUuZWNob1N0cmluZyhwU3RyaW5nKTsNCi0gICAgICAgICAgICBlcyA9IHBTdHJpbmcudmFsdWU7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIlJlc3BvbnNlID0iICsgZXMpOw0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgfWNhdGNoKEV4Y2VwdGlvbiBlKXsNCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgICAgIGZhaWwoKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcnBjbGl0L3N0cmluZ2FycmF5L0VjaG9JbXBsLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcnBjbGl0L3N0cmluZ2FycmF5L0VjaG9JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlMjU3NTcuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3JwY2xpdC9zdHJpbmdhcnJheS9FY2hvSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5ycGNsaXQuc3RyaW5nYXJyYXk7DQotDQotaW1wb3J0IG9yZy50ZXN0LnJwY2xpdC5zdHJpbmdhcnJheS5TdHJpbmdBcnJheTsNCi0NCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7DQotDQotQFdlYlNlcnZpY2Uoc2VydmljZU5hbWU9IlJQQ0xpdFN0cmluZ0FycmF5U2VydmljZSIsDQotCQkJZW5kcG9pbnRJbnRlcmZhY2U9Im9yZy5hcGFjaGUuYXhpczIuamF4d3MucnBjbGl0LnN0cmluZ2FycmF5LnNlaS5FY2hvIikNCi1wdWJsaWMgY2xhc3MgRWNob0ltcGwgew0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGVjaG9TdHJpbmcoU3RyaW5nIGFyZzApIHsNCi0gICAgCXJldHVybiBhcmcwOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmdBcnJheSBlY2hvU3RyaW5nQXJyYXkoU3RyaW5nQXJyYXkgYXJnMCl7DQotICAgICAgICBpZihhcmcwID09IG51bGwpew0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigicmVjZWl2ZWQgbnVsbCBwYXJhbWV0ZXIiKTsNCi0gICAgICAgIH1lbHNlew0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigicmVjZWl2ZWQgaW5wdXQgcGFyYW1ldGVyIHN0cmluZ0FycmF5ID0iK2FyZzAudG9TdHJpbmcoKSk7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIHJldHVybiBhcmcwOw0KLSAgICB9DQotDQotDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9ycGNsaXQvc3RyaW5nYXJyYXkvRWNob0ltcGxOb1NFSS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3JwY2xpdC9zdHJpbmdhcnJheS9FY2hvSW1wbE5vU0VJLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5MWI0MGIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3JwY2xpdC9zdHJpbmdhcnJheS9FY2hvSW1wbE5vU0VJLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MucnBjbGl0LnN0cmluZ2FycmF5OwotCi1pbXBvcnQgamF2YXguandzLldlYk1ldGhvZDsKLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZzsKLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5TdHlsZTsKLQotQFdlYlNlcnZpY2UobmFtZSA9ICJFY2hvTm9TRUkiLCBzZXJ2aWNlTmFtZT0iUlBDTGl0U3RyaW5nQXJyYXlTZXJ2aWNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9zZWkuc3RyaW5nYXJyYXkucnBjbGl0LmpheHdzLmF4aXMyLmFwYWNoZS5vcmciKQotQFNPQVBCaW5kaW5nKHN0eWxlID0gU3R5bGUuUlBDKQotcHVibGljIGNsYXNzIEVjaG9JbXBsTm9TRUkgewotCi0gICAgQFdlYk1ldGhvZAotICAgIHB1YmxpYyBTdHJpbmcgZWNob1N0cmluZyhTdHJpbmcgYXJnMCkgewotICAgIAlyZXR1cm4gYXJnMDsKLSAgICB9Ci0KLSAgIEBXZWJNZXRob2QKLSAgICBwdWJsaWMgU3RyaW5nW10gZWNob1N0cmluZ0FycmF5KFN0cmluZyBbXSBhcmdzKSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgYXJnc1tpXSA9IGFyZ3NbaV0gKyAicmV0dXJuIjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYXJnczsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9ycGNsaXQvc3RyaW5nYXJyYXkvTUVUQS1JTkYvcnBjbGl0c3RyaW5nYXJyYXkud3NkbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9ycGNsaXQvc3RyaW5nYXJyYXkvTUVUQS1JTkYvcnBjbGl0c3RyaW5nYXJyYXkud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWViYTFkNS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcnBjbGl0L3N0cmluZ2FycmF5L01FVEEtSU5GL3JwY2xpdHN0cmluZ2FycmF5LndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLQ0KLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTxkZWZpbml0aW9ucyBuYW1lPSJFY2hvU2VydmljZSIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vc2VpLnN0cmluZ2FycmF5LnJwY2xpdC5qYXh3cy5heGlzMi5hcGFjaGUub3JnIiB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiB4bWxuczp0bnM9Imh0dHA6Ly9zZWkuc3RyaW5nYXJyYXkucnBjbGl0LmpheHdzLmF4aXMyLmFwYWNoZS5vcmciIHhtbG5zOm5zMT0gImh0dHA6Ly9zdHJpbmdhcnJheS5ycGNsaXQudGVzdC5vcmciIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+DQotICA8dHlwZXM+DQotICAgIDx4c2Q6c2NoZW1hIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSINCi0JCQl0YXJnZXROYW1lc3BhY2U9ICJodHRwOi8vc3RyaW5nYXJyYXkucnBjbGl0LnRlc3Qub3JnIj4NCi0gICAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InN0cmluZ0FycmF5IiBmaW5hbD0iI2FsbCI+DQotCQk8eHNkOnNlcXVlbmNlPg0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJpdGVtIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuaWxsYWJsZT0idHJ1ZSI+PC94c2Q6ZWxlbWVudD4NCi0JCTwveHNkOnNlcXVlbmNlPg0KLQkgIDwveHNkOmNvbXBsZXhUeXBlPg0KLSAgICA8L3hzZDpzY2hlbWE+DQotICA8L3R5cGVzPg0KLSAgPG1lc3NhZ2UgbmFtZT0iZWNob1N0cmluZ0FycmF5Ij4NCi0gICAgPHBhcnQgbmFtZT0iYXJnMCIgdHlwZT0ibnMxOnN0cmluZ0FycmF5Ij4NCi0gICAgPC9wYXJ0Pg0KLQ0KLSAgPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2UgbmFtZT0iZWNob1N0cmluZ0FycmF5UmVzcG9uc2UiPg0KLSAgICA8cGFydCBuYW1lPSJyZXR1cm4iIHR5cGU9Im5zMTpzdHJpbmdBcnJheSI+DQotICAgIDwvcGFydD4NCi0gIDwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIG5hbWU9ImVjaG9TdHJpbmdSZXNwb25zZSI+DQotICAgIDxwYXJ0IG5hbWU9InJldHVybiIgdHlwZT0ieHNkOnN0cmluZyI+DQotICAgIDwvcGFydD4NCi0gIDwvbWVzc2FnZT4NCi0NCi0gIDxtZXNzYWdlIG5hbWU9ImVjaG9TdHJpbmciPg0KLSAgICA8cGFydCBuYW1lPSJhcmcwIiB0eXBlPSJ4c2Q6c3RyaW5nIj4NCi0gICAgPC9wYXJ0Pg0KLSAgPC9tZXNzYWdlPg0KLSAgPHBvcnRUeXBlIG5hbWU9IkVjaG8iPg0KLSAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9TdHJpbmciIHBhcmFtZXRlck9yZGVyPSJhcmcwIj4NCi0gICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmVjaG9TdHJpbmciPg0KLSAgICA8L2lucHV0Pg0KLSAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmVjaG9TdHJpbmdSZXNwb25zZSI+DQotDQotICAgIDwvb3V0cHV0Pg0KLSAgICA8L29wZXJhdGlvbj4NCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvU3RyaW5nQXJyYXkiIHBhcmFtZXRlck9yZGVyPSJhcmcwIj4NCi0gICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmVjaG9TdHJpbmdBcnJheSI+DQotICAgIDwvaW5wdXQ+DQotICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6ZWNob1N0cmluZ0FycmF5UmVzcG9uc2UiPg0KLSAgICA8L291dHB1dD4NCi0gICAgPC9vcGVyYXRpb24+DQotICA8L3BvcnRUeXBlPg0KLQ0KLSAgPGJpbmRpbmcgbmFtZT0iRWNob1BvcnRCaW5kaW5nIiB0eXBlPSJ0bnM6RWNobyI+DQotICAgIDxzb2FwOmJpbmRpbmcgc3R5bGU9InJwYyIgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiLz4NCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvU3RyaW5nIj4NCi0gICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+DQotICAgICAgPGlucHV0Pg0KLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIG5hbWVzcGFjZT0iaHR0cDovL3N0cmluZ2FycmF5LnJwY2xpdC50ZXN0Lm9yZyIvPg0KLSAgICAgIDwvaW5wdXQ+DQotICAgICAgPG91dHB1dD4NCi0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9Imh0dHA6Ly9zdHJpbmdhcnJheS5ycGNsaXQudGVzdC5vcmciLz4NCi0NCi0gICAgICA8L291dHB1dD4NCi0gICAgPC9vcGVyYXRpb24+DQotICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob1N0cmluZ0FycmF5Ij4NCi0gICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iZWNob1N0cmluZ0FycmF5Ii8+DQotICAgICAgPGlucHV0Pg0KLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIG5hbWVzcGFjZT0iaHR0cDovL3N0cmluZ2FycmF5LnJwY2xpdC50ZXN0Lm9yZyIvPg0KLSAgICAgIDwvaW5wdXQ+DQotICAgICAgPG91dHB1dD4NCi0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9Imh0dHA6Ly9zdHJpbmdhcnJheS5ycGNsaXQudGVzdC5vcmciLz4NCi0NCi0gICAgICA8L291dHB1dD4NCi0gICAgPC9vcGVyYXRpb24+DQotICA8L2JpbmRpbmc+DQotICA8c2VydmljZSBuYW1lPSJSUENMaXRTdHJpbmdBcnJheVNlcnZpY2UiPg0KLSAgICA8cG9ydCBuYW1lPSJFY2hvUG9ydCIgYmluZGluZz0idG5zOkVjaG9Qb3J0QmluZGluZyI+DQotICAgICAgPHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo2MDYwL2F4aXMyL3NlcnZpY2VzL1JQQ0xpdFN0cmluZ0FycmF5U2VydmljZSIvPg0KLSAgICA8L3BvcnQ+DQotICA8L3NlcnZpY2U+DQotPC9kZWZpbml0aW9ucz4NCi0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcnBjbGl0L3N0cmluZ2FycmF5L3NlaS9FY2hvLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcnBjbGl0L3N0cmluZ2FycmF5L3NlaS9FY2hvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyNDEwMDIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3JwY2xpdC9zdHJpbmdhcnJheS9zZWkvRWNoby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotDQotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5ycGNsaXQuc3RyaW5nYXJyYXkuc2VpOw0KLQ0KLWltcG9ydCBvcmcudGVzdC5ycGNsaXQuc3RyaW5nYXJyYXkuU3RyaW5nQXJyYXk7DQotDQotaW1wb3J0IGphdmF4Lmp3cy5XZWJNZXRob2Q7DQotaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbTsNCi1pbXBvcnQgamF2YXguandzLldlYlJlc3VsdDsNCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7DQotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nOw0KLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5TdHlsZTsNCi0NCi0NCi0vKioNCi0gKiBUaGlzIGNsYXNzIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIEpBWFdTIFNJLg0KLSAqIEpBWC1XUyBSSSAyLjBfMDEtYjE1LWZjcw0KLSAqIEdlbmVyYXRlZCBzb3VyY2UgdmVyc2lvbjogMi4wDQotICogDQotICovDQotQFdlYlNlcnZpY2UobmFtZSA9ICJFY2hvIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9zZWkuc3RyaW5nYXJyYXkucnBjbGl0LmpheHdzLmF4aXMyLmFwYWNoZS5vcmciKQ0KLUBTT0FQQmluZGluZyhzdHlsZSA9IFN0eWxlLlJQQykNCi1wdWJsaWMgaW50ZXJmYWNlIEVjaG8gew0KLQ0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSBhcmcwDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgamF2YS5sYW5nLlN0cmluZw0KLSAgICAgKi8NCi0gICAgQFdlYk1ldGhvZA0KLSAgICBAV2ViUmVzdWx0KHBhcnROYW1lID0gInJldHVybiIpDQotICAgIHB1YmxpYyBTdHJpbmcgZWNob1N0cmluZygNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImFyZzAiLCBwYXJ0TmFtZSA9ICJhcmcwIikNCi0gICAgICAgIFN0cmluZyBhcmcwKTsNCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gYXJnMA0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIG9yZy50ZXN0LnJwY2xpdC5zdHJpbmdhcnJheS5TdHJpbmdBcnJheQ0KLSAgICAgKi8NCi0gICAgQFdlYk1ldGhvZA0KLSAgICBAV2ViUmVzdWx0KHBhcnROYW1lID0gInJldHVybiIpDQotICAgIHB1YmxpYyBTdHJpbmdBcnJheSBlY2hvU3RyaW5nQXJyYXkoDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJhcmcwIiwgcGFydE5hbWUgPSAiYXJnMCIpDQotICAgICAgICBTdHJpbmdBcnJheSBhcmcwKTsNCi0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3JwY2xpdC9zdHJpbmdhcnJheS9zZWkvUlBDTGl0U3RyaW5nQXJyYXlTZXJ2aWNlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcnBjbGl0L3N0cmluZ2FycmF5L3NlaS9SUENMaXRTdHJpbmdBcnJheVNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE4OWY2ZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcnBjbGl0L3N0cmluZ2FycmF5L3NlaS9SUENMaXRTdHJpbmdBcnJheVNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLQ0KLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MucnBjbGl0LnN0cmluZ2FycmF5LnNlaTsNCi0NCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJFbmRwb2ludDsNCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VDbGllbnQ7DQotaW1wb3J0IGphdmEuaW8uRmlsZTsNCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLm5ldC5VUkw7DQotDQotDQotLyoqDQotICogVGhpcyBjbGFzcyB3YXMgZ2VuZXJhdGVkIGJ5IHRoZSBKQVhXUyBTSS4NCi0gKiBKQVgtV1MgUkkgMi4wXzAxLWIxNS1mY3MNCi0gKiBHZW5lcmF0ZWQgc291cmNlIHZlcnNpb246IDIuMA0KLSAqIA0KLSAqLw0KLUBXZWJTZXJ2aWNlQ2xpZW50KG5hbWUgPSAiUlBDTGl0U3RyaW5nQXJyYXlTZXJ2aWNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9zZWkuc3RyaW5nYXJyYXkucnBjbGl0LmpheHdzLmF4aXMyLmFwYWNoZS5vcmciLCB3c2RsTG9jYXRpb24gPSAiZWNob3NlcnZpY2Uud3NkbCIpDQotcHVibGljIGNsYXNzIFJQQ0xpdFN0cmluZ0FycmF5U2VydmljZQ0KLSAgICBleHRlbmRzIFNlcnZpY2UNCi17DQotDQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFVSTCBSUENMSVRTVFJJTkdBUlJBWVNFUlZJQ0VfV1NETF9MT0NBVElPTjsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHdzZGxMb2NhdGlvbiA9DQotICAgICAgICAiL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9ycGNsaXQvc3RyaW5nYXJyYXkvTUVUQS1JTkYvcnBjbGl0c3RyaW5nYXJyYXkud3NkbCI7DQotICAgIHN0YXRpYyB7DQotICAgICAgICBVUkwgdXJsID0gbnVsbDsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICAgICAgU3RyaW5nIGJhc2VEaXIgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoImJhc2VkaXIiLCAiLiIpKS5nZXRDYW5vbmljYWxQYXRoKCk7DQotICAgICAgICAgICAgICAgIHdzZGxMb2NhdGlvbiA9IG5ldyBGaWxlKGJhc2VEaXIgKyB3c2RsTG9jYXRpb24pLmdldEFic29sdXRlUGF0aCgpOw0KLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKHdzZGxMb2NhdGlvbik7DQotICAgICAgICAgICAgdXJsID0gZmlsZS50b1VSTCgpOw0KLSAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgUlBDTElUU1RSSU5HQVJSQVlTRVJWSUNFX1dTRExfTE9DQVRJT04gPSB1cmw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFJQQ0xpdFN0cmluZ0FycmF5U2VydmljZShVUkwgd3NkbExvY2F0aW9uLCBRTmFtZSBzZXJ2aWNlTmFtZSkgew0KLSAgICAgICAgc3VwZXIod3NkbExvY2F0aW9uLCBzZXJ2aWNlTmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFJQQ0xpdFN0cmluZ0FycmF5U2VydmljZSgpIHsNCi0gICAgICAgIHN1cGVyKFJQQ0xJVFNUUklOR0FSUkFZU0VSVklDRV9XU0RMX0xPQ0FUSU9OLCBuZXcgUU5hbWUoImh0dHA6Ly9zZWkuc3RyaW5nYXJyYXkucnBjbGl0LmpheHdzLmF4aXMyLmFwYWNoZS5vcmciLCAiUlBDTGl0U3RyaW5nQXJyYXlTZXJ2aWNlIikpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBFY2hvDQotICAgICAqLw0KLSAgICBAV2ViRW5kcG9pbnQobmFtZSA9ICJFY2hvUG9ydCIpDQotICAgIHB1YmxpYyBFY2hvIGdldEVjaG9Qb3J0KCkgew0KLSAgICAgICAgcmV0dXJuIChFY2hvKXN1cGVyLmdldFBvcnQobmV3IFFOYW1lKCJodHRwOi8vc2VpLnN0cmluZ2FycmF5LnJwY2xpdC5qYXh3cy5heGlzMi5hcGFjaGUub3JnIiwgIkVjaG9Qb3J0IiksIEVjaG8uY2xhc3MpOw0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9ycGNsaXQvc3RyaW5nYXJyYXkvdGVzdHMvUlBDTGl0U3RyaW5nQXJyYXlUZXN0cy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3JwY2xpdC9zdHJpbmdhcnJheS90ZXN0cy9SUENMaXRTdHJpbmdBcnJheVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwMzMwNzguLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3JwY2xpdC9zdHJpbmdhcnJheS90ZXN0cy9SUENMaXRTdHJpbmdBcnJheVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5ycGNsaXQuc3RyaW5nYXJyYXkudGVzdHM7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmZyYW1ld29yay5BYnN0cmFjdFRlc3RDYXNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnJwY2xpdC5zdHJpbmdhcnJheS5zZWkuRWNobzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5ycGNsaXQuc3RyaW5nYXJyYXkuc2VpLlJQQ0xpdFN0cmluZ0FycmF5U2VydmljZTsNCi1pbXBvcnQgb3JnLnRlc3QucnBjbGl0LnN0cmluZ2FycmF5LlN0cmluZ0FycmF5Ow0KLQ0KLWltcG9ydCBqYXZheC54bWwud3MuQmluZGluZ1Byb3ZpZGVyOw0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOw0KLQ0KLXB1YmxpYyBjbGFzcyBSUENMaXRTdHJpbmdBcnJheVRlc3RzIGV4dGVuZHMgQWJzdHJhY3RUZXN0Q2FzZSB7DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsNCi0gICAgICAgIHJldHVybiBnZXRUZXN0U2V0dXAobmV3IFRlc3RTdWl0ZShSUENMaXRTdHJpbmdBcnJheVRlc3RzLmNsYXNzKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFN0cmluZ0FycmF5VHlwZSgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGVzdCA6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgUlBDTGl0U3RyaW5nQXJyYXlTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgUlBDTGl0U3RyaW5nQXJyYXlTZXJ2aWNlKCk7DQotICAgICAgICBFY2hvIHBvcnRUeXBlID0gc2VydmljZS5nZXRFY2hvUG9ydCgpOw0KLSAgICAgICAgQmluZGluZ1Byb3ZpZGVyIHAgPSAoQmluZGluZ1Byb3ZpZGVyKSBwb3J0VHlwZTsNCi0gICAgICAgIHAuZ2V0UmVxdWVzdENvbnRleHQoKS5wdXQoQmluZGluZ1Byb3ZpZGVyLkVORFBPSU5UX0FERFJFU1NfUFJPUEVSVFksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vbG9jYWxob3N0OjYwNjAvYXhpczIvc2VydmljZXMvUlBDTGl0U3RyaW5nQXJyYXlTZXJ2aWNlLkVjaG9JbXBsUG9ydCIpOw0KLQ0KLSAgICAgICAgU3RyaW5nW10gc3RyQXJyYXk9IHsic3RyMSIsICJzdHIyIiwgInN0cjMiLCAic3RyNCA1In07DQotICAgICAgICBTdHJpbmdBcnJheSBhcnJheSA9IG5ldyBTdHJpbmdBcnJheSgpOw0KLSAgICAgICAgYXJyYXkuZ2V0SXRlbSgpLmFkZEFsbChBcnJheXMuYXNMaXN0KHN0ckFycmF5KSk7DQotICAgICAgICBTdHJpbmdBcnJheSByZXN1bHQgPSBwb3J0VHlwZS5lY2hvU3RyaW5nQXJyYXkoYXJyYXkpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKGFycmF5LmdldEl0ZW0oKS5zaXplKCksIHJlc3VsdC5nZXRJdGVtKCkuc2l6ZSgpKTsNCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXkuZ2V0SXRlbSgpLnNpemUoKTsgaSsrKSB7DQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGFycmF5LmdldEl0ZW0oKS5nZXQoaSksIHJlc3VsdC5nZXRJdGVtKCkuZ2V0KGkpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vIFRyeSBhIHNlY29uZCB0aW1lIHRvIHZlcmlmeQ0KLSAgICAgICAgU3RyaW5nW10gc3RyQXJyYXkyID0geyJzdHIxIiwgInN0cjIiLCAic3RyMyIsICJzdHI0IDUifTsNCi0gICAgICAgIGFycmF5ID0gbmV3IFN0cmluZ0FycmF5KCk7DQotICAgICAgICBhcnJheS5nZXRJdGVtKCkuYWRkQWxsKEFycmF5cy5hc0xpc3Qoc3RyQXJyYXkyKSk7DQotICAgICAgICByZXN1bHQgPSBwb3J0VHlwZS5lY2hvU3RyaW5nQXJyYXkoYXJyYXkpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKGFycmF5LmdldEl0ZW0oKS5zaXplKCksIHJlc3VsdC5nZXRJdGVtKCkuc2l6ZSgpKTsNCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXkuZ2V0SXRlbSgpLnNpemUoKTsgaSsrKSB7DQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGFycmF5LmdldEl0ZW0oKS5nZXQoaSksIHJlc3VsdC5nZXRJdGVtKCkuZ2V0KGkpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpbmdBcnJheVR5cGVOb1NFSSgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGVzdCA6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgUlBDTGl0U3RyaW5nQXJyYXlTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgUlBDTGl0U3RyaW5nQXJyYXlTZXJ2aWNlKCk7DQotICAgICAgICBFY2hvIHBvcnRUeXBlID0gc2VydmljZS5nZXRFY2hvUG9ydCgpOw0KLSAgICAgICAgQmluZGluZ1Byb3ZpZGVyIHAgPSAoQmluZGluZ1Byb3ZpZGVyKSBwb3J0VHlwZTsNCi0gICAgICAgIHAuZ2V0UmVxdWVzdENvbnRleHQoKS5wdXQoQmluZGluZ1Byb3ZpZGVyLkVORFBPSU5UX0FERFJFU1NfUFJPUEVSVFksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vbG9jYWxob3N0OjYwNjAvYXhpczIvc2VydmljZXMvUlBDTGl0U3RyaW5nQXJyYXlTZXJ2aWNlLkVjaG9Ob1NFSVBvcnQiKTsNCi0NCi0gICAgICAgIFN0cmluZ1tdIHN0ckFycmF5PSB7InN0cjEiLCAic3RyMiIsICJzdHIzIiwgInN0cjQgNSJ9Ow0KLSAgICAgICAgU3RyaW5nQXJyYXkgYXJyYXkgPSBuZXcgU3RyaW5nQXJyYXkoKTsNCi0gICAgICAgIGFycmF5LmdldEl0ZW0oKS5hZGRBbGwoQXJyYXlzLmFzTGlzdChzdHJBcnJheSkpOw0KLSAgICAgICAgU3RyaW5nQXJyYXkgcmVzdWx0ID0gcG9ydFR5cGUuZWNob1N0cmluZ0FycmF5KGFycmF5KTsNCi0gICAgICAgICAgICANCi0gICAgICAgIGFzc2VydEVxdWFscyhhcnJheS5nZXRJdGVtKCkuc2l6ZSgpLCByZXN1bHQuZ2V0SXRlbSgpLnNpemUoKSk7DQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFycmF5LmdldEl0ZW0oKS5zaXplKCk7IGkrKykgew0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhhcnJheS5nZXRJdGVtKCkuZ2V0KGkpICsgInJldHVybiIsIHJlc3VsdC5nZXRJdGVtKCkuZ2V0KGkpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgLy8gVHJ5IGEgc2Vjb25kIHRpbWUgdG8gdmVyaWZ5DQotICAgICAgICBTdHJpbmdbXXN0ckFycmF5MiA9IHsic3RyMSIsICJzdHIyIiwgInN0cjMiLCAic3RyNCA1In07DQotICAgICAgICBhcnJheSA9IG5ldyBTdHJpbmdBcnJheSgpOw0KLSAgICAgICAgYXJyYXkuZ2V0SXRlbSgpLmFkZEFsbChBcnJheXMuYXNMaXN0KHN0ckFycmF5MikpOw0KLSAgICAgICAgcmVzdWx0ID0gcG9ydFR5cGUuZWNob1N0cmluZ0FycmF5KGFycmF5KTsNCi0gICAgICAgICAgICANCi0gICAgICAgIGFzc2VydEVxdWFscyhhcnJheS5nZXRJdGVtKCkuc2l6ZSgpLCByZXN1bHQuZ2V0SXRlbSgpLnNpemUoKSk7DQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFycmF5LmdldEl0ZW0oKS5zaXplKCk7IGkrKykgew0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhhcnJheS5nZXRJdGVtKCkuZ2V0KGkpICsgInJldHVybiIsIHJlc3VsdC5nZXRJdGVtKCkuZ2V0KGkpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvQWRkTnVtYmVyc0hhbmRsZXJUZXN0cy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9BZGROdW1iZXJzSGFuZGxlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2Y2QyZGMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9BZGROdW1iZXJzSGFuZGxlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlOw0KLQ0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOw0KLWltcG9ydCBqYXZhLmlvLkZpbGU7DQotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5pby5GaWxlUmVhZGVyOw0KLWltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7DQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOw0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOw0KLQ0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOw0KLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRmF1bHQ7DQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uUmVzdWx0Ow0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsNCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjsNCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk7DQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdDsNCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtU291cmNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuQXN5bmNIYW5kbGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuQmluZGluZzsNCi1pbXBvcnQgamF2YXgueG1sLndzLkJpbmRpbmdQcm92aWRlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLkRpc3BhdGNoOw0KLWltcG9ydCBqYXZheC54bWwud3MuUmVzcG9uc2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5IYW5kbGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5IYW5kbGVyUmVzb2x2ZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLlBvcnRJbmZvOw0KLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5TT0FQRmF1bHRFeGNlcHRpb247DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLlRlc3RMb2dnZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZnJhbWV3b3JrLkFic3RyYWN0VGVzdENhc2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLmFkZG51bWJlcnNoYW5kbGVyLkFkZE51bWJlcnNDbGllbnRMb2dpY2FsSGFuZGxlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuYWRkbnVtYmVyc2hhbmRsZXIuQWRkTnVtYmVyc0NsaWVudExvZ2ljYWxIYW5kbGVyMjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuYWRkbnVtYmVyc2hhbmRsZXIuQWRkTnVtYmVyc0NsaWVudExvZ2ljYWxIYW5kbGVyMzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuYWRkbnVtYmVyc2hhbmRsZXIuQWRkTnVtYmVyc0NsaWVudExvZ2ljYWxIYW5kbGVyNDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuYWRkbnVtYmVyc2hhbmRsZXIuQWRkTnVtYmVyc0NsaWVudFByb3RvY29sSGFuZGxlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuYWRkbnVtYmVyc2hhbmRsZXIuQWRkTnVtYmVyc0hhbmRsZXJGYXVsdF9FeGNlcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLmFkZG51bWJlcnNoYW5kbGVyLkFkZE51bWJlcnNIYW5kbGVyUG9ydFR5cGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLmFkZG51bWJlcnNoYW5kbGVyLkFkZE51bWJlcnNIYW5kbGVyU2VydmljZTsNCi1pbXBvcnQgb3JnLnRlc3QuYWRkbnVtYmVyc2hhbmRsZXIuQWRkTnVtYmVyc0hhbmRsZXJSZXNwb25zZTsNCi0NCi1wdWJsaWMgY2xhc3MgQWRkTnVtYmVyc0hhbmRsZXJUZXN0cyBleHRlbmRzIEFic3RyYWN0VGVzdENhc2Ugew0KLQkNCi0gICAgU3RyaW5nIGF4aXNFbmRwb2ludCA9ICJodHRwOi8vbG9jYWxob3N0OjYwNjAvYXhpczIvc2VydmljZXMvQWRkTnVtYmVyc0hhbmRsZXJTZXJ2aWNlLkFkZE51bWJlcnNIYW5kbGVyUG9ydFR5cGVJbXBsUG9ydCI7DQotICAgIHN0YXRpYyBGaWxlIHJlcXVlc3RGaWxlID0gbnVsbDsNCi0gICAgc3RhdGljIHsNCi0gICAgICAgIFN0cmluZyByZXNvdXJjZURpciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiYmFzZWRpciIsIi4iKSsNCi0gICAgICAgICAgICBGaWxlLnNlcGFyYXRvcisidGVzdC1yZXNvdXJjZXMiK0ZpbGUuc2VwYXJhdG9yKyJ4bWwiOw0KLSAgICAgICAgcmVxdWVzdEZpbGUgPSBuZXcgRmlsZShyZXNvdXJjZURpcitGaWxlLnNlcGFyYXRvcisiYWRkbnVtYmVyc3Rlc3QueG1sIik7DQotICAgIH0NCi0gICAgDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBmaWxlbG9nbmFtZSA9ICJBZGROdW1iZXJzSGFuZGxlclRlc3RzLmxvZyI7DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsNCi0gICAgICAgIHJldHVybiBnZXRUZXN0U2V0dXAobmV3IFRlc3RTdWl0ZShBZGROdW1iZXJzSGFuZGxlclRlc3RzLmNsYXNzKSk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIENsaWVudCBhcHAgc2VuZHMgMTAsIDEwIGFzIHBhcmFtcyB0byBzdW0uICBObyBjbGllbnQtc2lkZSBoYW5kbGVycyBhcmUgY29uZmlndXJlZA0KLSAgICAgKiBmb3IgdGhpcyBzY2VuYXJpby4gIFRoZSBzZXJ2ZXItc2lkZSBBZGROdW1iZXJzTG9naWNhbEhhbmRsZXIgaXMgaW5zdGFudGlhdGVkIHdpdGggYQ0KLSAgICAgKiB2YXJpYWJsZSAiZGVkdWN0aW9uIiB3aXRoIHZhbHVlIDEuICBVcG9uIGNsYXNzIGluaXRpYWxpemF0aW9uIHVzaW5nIFBvc3RDb25zdHJ1Y3QNCi0gICAgICogYW5ub3RhdGlvbiwgdGhhdCBpbnRlcm5hbCB2YXJpYWJsZSBpcyBjaGFuZ2VkIHRvIHZhbHVlIDIuICBUaGUgaW5ib3VuZCBBZGROdW1iZXJzTG9naWNhbEhhbmRsZXINCi0gICAgICogc3VidHJhY3RzIDEgZnJvbSB0aGUgZmlyc3QgcGFyYW0sIHRoZW4gb3V0Ym91bmQgaXQgc3VidHJhY3RzIDIgZnJvbSB0aGUgcmVzdWx0IHN1bS4NCi0gICAgICogDQotICAgICAqIFRoaXMgdGVzdCBhY2NvbXBsaXNoZXMgdGhyZWUgdGhpbmdzICh3aGljaCBhbHNvIGNhcnJ5IG92ZXIgdG8gb3RoZXIgdGVzdHMgc2luY2UgdGhleSBhbGwgdXNlDQotICAgICAqIHRoZSBzYW1lIGVuZHBvaW50IGFuZCBzZXJ2ZXItc2lkZSBoYW5kbGVyczoNCi0gICAgICogMSkgIFBvc3RDb25zdHJ1Y3QgYW5ub3RhdGlvbiBob25vcmVkIGluIHRoZSBoYW5kbGVyIGZyYW1ld29yayBmb3IgaGFuZGxlciBpbnN0YW50aWF0aW9uDQotICAgICAqIDIpICBBZGROdW1iZXJzTG9naWNhbEhhbmRsZXIgYWxzbyBzZXRzIHR3byBtZXNzYWdlIGNvbnRleHQgcHJvcGVydGllcywgb25lIHdpdGggQVBQTElDQVRJT04NCi0gICAgICogICAgIHNjb3BlLCB3aGljaCB0aGUgZW5kcG9pbnQgY2hlY2tzLg0KLSAgICAgKiAzKSAgSGFuZGxlcnMgYXJlIHNoYXJpbmcgcHJvcGVydGllcywgYm90aCBBUFBMSUNBVElPTiBzY29wZWQgYW5kIEhBTkRMRVIgc2NvcGVkDQotICAgICAqIDMpICBHZW5lcmFsIGhhbmRsZXIgZnJhbWV3b3JrIGZ1bmN0aW9uYWxpdHk7IG1ha2Ugc3VyZSBoYW5kbGVycyBhcmUgaW5zdGFudGlhdGVkIGFuZCBjYWxsZWQNCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RBZGROdW1iZXJzSGFuZGxlcigpIHsNCi0JCXRyeXsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJ0ZXN0OiAiICsgZ2V0TmFtZSgpKTsNCi0JCQkNCi0gICAgICAgICAgICBBZGROdW1iZXJzSGFuZGxlclNlcnZpY2Ugc2VydmljZSA9IG5ldyBBZGROdW1iZXJzSGFuZGxlclNlcnZpY2UoKTsNCi0gICAgICAgICAgICBBZGROdW1iZXJzSGFuZGxlclBvcnRUeXBlIHByb3h5ID0gc2VydmljZS5nZXRBZGROdW1iZXJzSGFuZGxlclBvcnQoKTsNCi0JCQkNCi0gICAgICAgICAgICBCaW5kaW5nUHJvdmlkZXIgcCA9CShCaW5kaW5nUHJvdmlkZXIpcHJveHk7DQotICAgICAgICAgICAgcC5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dChCaW5kaW5nUHJvdmlkZXIuRU5EUE9JTlRfQUREUkVTU19QUk9QRVJUWSwgYXhpc0VuZHBvaW50KTsNCi0gICAgICAgICAgICBpbnQgdG90YWwgPSBwcm94eS5hZGROdW1iZXJzSGFuZGxlcigxMCwgMTApOw0KLQ0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiV2l0aCBoYW5kbGVyIG1hbmlwdWxhdGlvbiwgdG90YWwgc2hvdWxkIGJlIDMgbGVzcyB0aGFuIGEgcHJvcGVyIHN1bWF0aW9uLiIsIDE3LCB0b3RhbCk7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIlRvdGFsIChhZnRlciBoYW5kbGVyIG1hbmlwdWxhdGlvbikgPSAiICsgdG90YWwpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIGFsc28gY29uZmlybSB0aGF0IEBQcmVEZXN0cm95IG1ldGhvZCBpcyBjYWxsZWQuICBTaW5jZSBpdCBvbmx5IG1ha2VzIHNlbnNlIHRvIGNhbGwgaXQgb24gdGhlIG1hbmFnZWQNCi0gICAgICAgICAgICAvLyAoc2VydmVyKSBzaWRlIGFuZCBqdXN0IGJlZm9yZSB0aGUgaGFuZGxlciBpbnN0YW5jZSBnb2VzIG91dCBvZiBzY29wZSwgd2UgYXJlIGNyZWF0aW5nIGEgZmlsZSBpbiB0aGUNCi0gICAgICAgICAgICAvLyBAUHJlRGVzdHJveSBtZXRob2QsIGFuZCB3aWxsIGNoZWNrIGZvciBpdHMgZXhpc3RhbmNlIGhlcmUuICBJZiB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdCwgaXQgbWVhbnMNCi0gICAgICAgICAgICAvLyBAUHJlRGVzdHJveSBtZXRob2Qgd2FzIG5ldmVyIGNhbGxlZC4gIFRoZSBmaWxlIGlzIHNldCB0byAuZGVsZXRlT25FeGl0KCksIHNvIG5vIG5lZWQgdG8gZGVsZXRlIGl0Lg0KLSAgICAgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKCJBZGROdW1iZXJzUHJvdG9jb2xIYW5kbGVyLnByZURlc3Ryb3kudHh0Iik7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiRmlsZSBBZGROdW1iZXJzUHJvdG9jb2xIYW5kbGVyLnByZURlc3Ryb3kudHh0IGRvZXMgbm90IGV4aXN0LCBtZWFuaW5nIHRoZSBAUHJlRGVzdHJveSBtZXRob2Qgd2FzIG5vdCBjYWxsZWQuIiwgZmlsZS5leGlzdHMoKSk7DQotDQotICAgICAgICAgICAgU3RyaW5nIGxvZyA9IHJlYWRMb2dGaWxlKCk7DQotICAgICAgICAgICAgU3RyaW5nIGV4cGVjdGVkX2NhbGxzID0NCi0gICAgICAgICAgICAgICAgICAgICAgIkFkZE51bWJlcnNMb2dpY2FsSGFuZGxlcjIgUE9TVF9DT05TVFJVQ1RcbiINCi0gICAgICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNQcm90b2NvbEhhbmRsZXIyIEdFVF9IRUFERVJTXG4iDQotICAgICAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzUHJvdG9jb2xIYW5kbGVyIEdFVF9IRUFERVJTXG4iDQotICAgICAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzUHJvdG9jb2xIYW5kbGVyIEhBTkRMRV9NRVNTQUdFX0lOQk9VTkRcbiINCi0gICAgICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNQcm90b2NvbEhhbmRsZXIyIEhBTkRMRV9NRVNTQUdFX0lOQk9VTkRcbiINCi0gICAgICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNMb2dpY2FsSGFuZGxlcjIgSEFORExFX01FU1NBR0VfSU5CT1VORFxuIg0KLSAgICAgICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc0xvZ2ljYWxIYW5kbGVyIEhBTkRMRV9NRVNTQUdFX0lOQk9VTkRcbiINCi0gICAgICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNMb2dpY2FsSGFuZGxlciBIQU5ETEVfTUVTU0FHRV9PVVRCT1VORFxuIg0KLSAgICAgICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc0xvZ2ljYWxIYW5kbGVyMiBIQU5ETEVfTUVTU0FHRV9PVVRCT1VORFxuIg0KLSAgICAgICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc1Byb3RvY29sSGFuZGxlcjIgSEFORExFX01FU1NBR0VfT1VUQk9VTkRcbiINCi0gICAgICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNQcm90b2NvbEhhbmRsZXIgSEFORExFX01FU1NBR0VfT1VUQk9VTkRcbiINCi0gICAgICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNMb2dpY2FsSGFuZGxlciBDTE9TRVxuIg0KLSAgICAgICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc0xvZ2ljYWxIYW5kbGVyMiBDTE9TRVxuIg0KLSAgICAgICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc1Byb3RvY29sSGFuZGxlcjIgQ0xPU0VcbiINCi0gICAgICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNQcm90b2NvbEhhbmRsZXIgQ0xPU0VcbiINCi0gICAgICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNQcm90b2NvbEhhbmRsZXIgUFJFX0RFU1RST1lcbiI7DQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkX2NhbGxzLCBsb2cpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotCQl9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7DQotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsNCi0JCQlmYWlsKGUuZ2V0TWVzc2FnZSgpKTsNCi0JCX0NCi0JfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIENsaWVudCBhcHAgc2VuZHMgTUFYVkFMVUUsIE1BWFZBTFVFIGFzIHBhcmFtcyB0byBhZGQuDQotICAgICAqIE5vIGNsaWVudC1zaWRlIGhhbmRsZXJzIGFyZSBjb25maWd1cmVkIGZvciB0aGlzIHNjZW5hcmlvLiAgDQotICAgICAqIFRoZSBlbmRwb2ludCBtZXRob2QgKGFkZE51bWJlcnNIYW5kbGVyKSB3aWxsIGRldGVjdCB0aGUgcG9zc2libGUgb3ZlcmZsb3cgYW5kDQotICAgICAqIHRocm93IGFuIGFwcGxpY2F0aW9uIGV4Y2VwdGlvbiwgQWRkTnVtYmVyc0hhbmRsZUZhdWx0X0V4Y2VwdGlvbi4NCi0gICAgICogDQotICAgICAqIFRoZSBzZXJ2ZXItc2lkZSBBZGROdW1iZXJzUHJvdG9jb2xIYW5kbGVyIHdpbGwNCi0gICAgICogYWNjZXNzIHRoZSB0aHJvd24gZXhjZXB0aW9uIHVzaW5nIHRoZSAiamF4d3Mud2VibWV0aG9kLmV4Y2VwdGlvbiINCi0gICAgICogcHJvcGVydHkgYW5kIGFkZCB0aGUgc3RhY2sgdHJhY2Ugc3RyaW5nIHRvIGZhdWx0IHN0cmluZy4NCi0gICAgICogDQotICAgICAqIFRoZSBjbGllbnQgc2hvdWxkIHJlY2VpdmUgYSBBZGROdW1iZXJzSGFuZGxlckZhdWx0X0V4Y2VwdGlvbiB0aGF0IGhhcyBhIHN0YWNrDQotICAgICAqIHRyYWNlIGFzIHBhcnQgb2YgdGhlIG1lc3NhZ2UuDQotICAgICAqIFRoaXMgdGVzdCB2ZXJpZmllcyB0aGUgZm9sbG93aW5nOg0KLSAgICAgKiANCi0gICAgICogMSkgIFByb3BlciBleGNlcHRpb24vZmF1bHQgcHJvY2Vzc2luZyB3aGVuIGhhbmRsZXJzIGFyZSBpbnN0YWxsZWQuDQotICAgICAqIDIpICBBY2Nlc3MgdG8gdGhlIHNwZWNpYWwgImpheHdzLndlYm1ldGhvZC5leGNlcHRpb24iDQotICAgICAqIDMpICBQcm9wZXIgZXhjZXB0aW9uIGNhbGwgZmxvdyB3aGVuIGFuIGFwcGxpY2F0aW9uIGV4Y2VwdGlvbiBpcyB0aHJvd24uDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkTnVtYmVyc0hhbmRsZXJfV2l0aENoZWNrZWRFeGNlcHRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0NCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygidGVzdDogIiArIGdldE5hbWUoKSk7DQotDQotICAgICAgICBBZGROdW1iZXJzSGFuZGxlclNlcnZpY2Ugc2VydmljZSA9IG5ldyBBZGROdW1iZXJzSGFuZGxlclNlcnZpY2UoKTsNCi0gICAgICAgIEFkZE51bWJlcnNIYW5kbGVyUG9ydFR5cGUgcHJveHkgPSBzZXJ2aWNlLmdldEFkZE51bWJlcnNIYW5kbGVyUG9ydCgpOw0KLQ0KLSAgICAgICAgQmluZGluZ1Byb3ZpZGVyIHAgPSAoQmluZGluZ1Byb3ZpZGVyKXByb3h5Ow0KLSAgICAgICAgcC5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dChCaW5kaW5nUHJvdmlkZXIuRU5EUE9JTlRfQUREUkVTU19QUk9QRVJUWSwgYXhpc0VuZHBvaW50KTsNCi0gICAgICAgIEFkZE51bWJlcnNIYW5kbGVyRmF1bHRfRXhjZXB0aW9uIGV4cGVjdGVkRXhjZXB0aW9uID0gbnVsbDsNCi0gICAgICAgIFRocm93YWJsZSB0ID0gbnVsbDsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgcHJveHkuYWRkTnVtYmVyc0hhbmRsZXIoSW50ZWdlci5NQVhfVkFMVUUsIEludGVnZXIuTUFYX1ZBTFVFKTsNCi0gICAgICAgICAgICANCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7DQotICAgICAgICAgICAgLy8gQW4gZXhjZXB0aW9uIGlzIGV4cGVjdGVkDQotICAgICAgICAgICAgdCA9IGU7DQotICAgICAgICAgICAgDQotICAgICAgICB9IA0KLSAgICAgICAgDQotICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIHByb3BlciBleGNlcHRpb24gaXMgdGhyb3duDQotICAgICAgICBpZiAodCA9PSBudWxsKSB7DQotICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgQWRkTnVtYmVyc0hhbmRsZXJGYXVsdF9FeGNlcHRpb24gdG8gYmUgdGhyb3duIik7DQotICAgICAgICB9DQotICAgICAgICBpZiAodCBpbnN0YW5jZW9mIEFkZE51bWJlcnNIYW5kbGVyRmF1bHRfRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgZXhwZWN0ZWRFeGNlcHRpb24gPSAoQWRkTnVtYmVyc0hhbmRsZXJGYXVsdF9FeGNlcHRpb24pIHQ7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIEFkZE51bWJlcnNIYW5kbGVyRmF1bHRfRXhjZXB0aW9uIHRvIGJlIHRocm93biwgIiArDQotICAgICAgICAgICAgICAgICAgICAgICAgImJ1dCB0aGUgZXhjZXB0aW9uIGlzOiAiICsgdCk7DQotICAgICAgICB9DQotICAgICAgIA0KLSAgICAgICAgLy8gYWxzbyBjb25maXJtIHRoYXQgQFByZURlc3Ryb3kgbWV0aG9kIGlzIGNhbGxlZC4gIFNpbmNlIGl0IG9ubHkgbWFrZXMgc2Vuc2UgdG8gY2FsbCBpdCBvbiB0aGUgbWFuYWdlZA0KLSAgICAgICAgLy8gKHNlcnZlcikgc2lkZSBhbmQganVzdCBiZWZvcmUgdGhlIGhhbmRsZXIgaW5zdGFuY2UgZ29lcyBvdXQgb2Ygc2NvcGUsIHdlIGFyZSBjcmVhdGluZyBhIGZpbGUgaW4gdGhlDQotICAgICAgICAvLyBAUHJlRGVzdHJveSBtZXRob2QsIGFuZCB3aWxsIGNoZWNrIGZvciBpdHMgZXhpc3RhbmNlIGhlcmUuICBJZiB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdCwgaXQgbWVhbnMNCi0gICAgICAgIC8vIEBQcmVEZXN0cm95IG1ldGhvZCB3YXMgbmV2ZXIgY2FsbGVkLiAgVGhlIGZpbGUgaXMgc2V0IHRvIC5kZWxldGVPbkV4aXQoKSwgc28gbm8gbmVlZCB0byBkZWxldGUgaXQuDQotICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZSgiQWRkTnVtYmVyc1Byb3RvY29sSGFuZGxlci5wcmVEZXN0cm95LnR4dCIpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiRmlsZSBBZGROdW1iZXJzUHJvdG9jb2xIYW5kbGVyLnByZURlc3Ryb3kudHh0IGRvZXMgbm90IGV4aXN0LCBtZWFuaW5nIHRoZSBAUHJlRGVzdHJveSBtZXRob2Qgd2FzIG5vdCBjYWxsZWQuIiwgZmlsZS5leGlzdHMoKSk7DQotDQotICAgICAgICBTdHJpbmcgbG9nID0gcmVhZExvZ0ZpbGUoKTsNCi0gICAgICAgIFN0cmluZyBleHBlY3RlZF9jYWxscyA9DQotICAgICAgICAgICAgIkFkZE51bWJlcnNMb2dpY2FsSGFuZGxlcjIgUE9TVF9DT05TVFJVQ1RcbiINCi0gICAgICAgICAgICArICJBZGROdW1iZXJzUHJvdG9jb2xIYW5kbGVyMiBHRVRfSEVBREVSU1xuIg0KLSAgICAgICAgICAgICsgIkFkZE51bWJlcnNQcm90b2NvbEhhbmRsZXIgR0VUX0hFQURFUlNcbiINCi0gICAgICAgICAgICArICJBZGROdW1iZXJzUHJvdG9jb2xIYW5kbGVyIEhBTkRMRV9NRVNTQUdFX0lOQk9VTkRcbiINCi0gICAgICAgICAgICArICJBZGROdW1iZXJzUHJvdG9jb2xIYW5kbGVyMiBIQU5ETEVfTUVTU0FHRV9JTkJPVU5EXG4iDQotICAgICAgICAgICAgKyAiQWRkTnVtYmVyc0xvZ2ljYWxIYW5kbGVyMiBIQU5ETEVfTUVTU0FHRV9JTkJPVU5EXG4iDQotICAgICAgICAgICAgKyAiQWRkTnVtYmVyc0xvZ2ljYWxIYW5kbGVyIEhBTkRMRV9NRVNTQUdFX0lOQk9VTkRcbiINCi0gICAgICAgICAgICArICJBZGROdW1iZXJzTG9naWNhbEhhbmRsZXIgSEFORExFX0ZBVUxUX09VVEJPVU5EXG4iDQotICAgICAgICAgICAgKyAiQWRkTnVtYmVyc0xvZ2ljYWxIYW5kbGVyMiBIQU5ETEVfRkFVTFRfT1VUQk9VTkRcbiINCi0gICAgICAgICAgICArICJBZGROdW1iZXJzUHJvdG9jb2xIYW5kbGVyMiBIQU5ETEVfRkFVTFRfT1VUQk9VTkRcbiINCi0gICAgICAgICAgICArICJBZGROdW1iZXJzUHJvdG9jb2xIYW5kbGVyIEhBTkRMRV9GQVVMVF9PVVRCT1VORFxuIg0KLSAgICAgICAgICAgICsgIkFkZE51bWJlcnNMb2dpY2FsSGFuZGxlciBDTE9TRVxuIg0KLSAgICAgICAgICAgICsgIkFkZE51bWJlcnNMb2dpY2FsSGFuZGxlcjIgQ0xPU0VcbiINCi0gICAgICAgICAgICArICJBZGROdW1iZXJzUHJvdG9jb2xIYW5kbGVyMiBDTE9TRVxuIg0KLSAgICAgICAgICAgICsgIkFkZE51bWJlcnNQcm90b2NvbEhhbmRsZXIgQ0xPU0VcbiINCi0gICAgICAgICAgICArICJBZGROdW1iZXJzUHJvdG9jb2xIYW5kbGVyIFBSRV9ERVNUUk9ZXG4iOw0KLSAgICAgICAgDQotICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRfY2FsbHMsIGxvZyk7DQotICAgICAgICANCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJFeHBlY3RlZCBFeGNlcHRpb24gaXMgIiArIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRFeGNlcHRpb24uZ2V0TWVzc2FnZSgpKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gVGhlIG91dGJvdW5kIHNlcnZpY2UgaGFuZGxlciBhZGRzIHRoZSBzdGFjayB0cmFjZSB0byB0aGUgDQotICAgICAgICAvLyBtZXNzYWdlLiAgTWFrZSBzdXJlIHRoZSBzdGFjayB0cmFjZSBjb250YWlucyB0aGUgQWRkTnVtYmVyc0hhbmRsZXJQb3J0VHlwZUltcGwNCi0gICAgICAgIGFzc2VydFRydWUoIkEgc3RhY2sgdHJhY2Ugd2FzIG5vdCBwcmVzZW50IGluIHRoZSByZXR1cm5lZCBleGNlcHRpb24ncyBtZXNzYWdlOiIgKyANCi0gICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRFeGNlcHRpb24uZ2V0TWVzc2FnZSgpLA0KLSAgICAgICAgICAgICAgICAgICBleHBlY3RlZEV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkuaW5kZXhPZigiQWRkTnVtYmVyc0hhbmRsZXJQb3J0VHlwZUltcGwiKSA+IDApOw0KLQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIA0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogQ2xpZW50IGFwcCBzZW5kcyBNQVhWQUxVRSwgTUFYVkFMVUUgYXMgcGFyYW1zIHRvIGFkZC4NCi0gICAgICogTm8gY2xpZW50LXNpZGUgaGFuZGxlcnMgYXJlIGNvbmZpZ3VyZWQgZm9yIHRoaXMgc2NlbmFyaW8uICANCi0gICAgICogVGhlIGVuZHBvaW50IG1ldGhvZCAoYWRkTnVtYmVyc0hhbmRsZXIpIHdpbGwgZGV0ZWN0IHRoZSBwb3NzaWJsZSBvdmVyZmxvdyBhbmQNCi0gICAgICogdGhyb3cgYW4gdW5jaGVja2VkIGV4Y2VwdGlvbiwgTnVsbFBvaW50ZXJFeGNlcHRpb24uDQotICAgICAqIA0KLSAgICAgKiBUaGUgc2VydmVyLXNpZGUgQWRkTnVtYmVyc1Byb3RvY29sSGFuZGxlciB3aWxsDQotICAgICAqIGFjY2VzcyB0aGUgdGhyb3duIGV4Y2VwdGlvbiB1c2luZyB0aGUgImpheHdzLndlYm1ldGhvZC5leGNlcHRpb24iDQotICAgICAqIHByb3BlcnR5IGFuZCBhZGQgdGhlIHN0YWNrIHRyYWNlIHN0cmluZyB0byBmYXVsdCBzdHJpbmcuDQotICAgICAqIA0KLSAgICAgKiBUaGUgY2xpZW50IHNob3VsZCByZWNlaXZlIGEgU09BUEZhdWx0RXhjZXB0aW9uIHRoYXQgaGFzIGEgc3RhY2sNCi0gICAgICogdHJhY2UgYXMgcGFydCBvZiB0aGUgbWVzc2FnZS4NCi0gICAgICogVGhpcyB0ZXN0IHZlcmlmaWVzIHRoZSBmb2xsb3dpbmc6DQotICAgICAqIA0KLSAgICAgKiAxKSAgUHJvcGVyIGV4Y2VwdGlvbi9mYXVsdCBwcm9jZXNzaW5nIHdoZW4gaGFuZGxlcnMgYXJlIGluc3RhbGxlZC4NCi0gICAgICogMikgIEFjY2VzcyB0byB0aGUgc3BlY2lhbCAiamF4d3Mud2VibWV0aG9kLmV4Y2VwdGlvbiINCi0gICAgICogMykgIFByb3BlciBleGNlcHRpb24gY2FsbCBmbG93IHdoZW4gYW4gdW5jaGVja2VkIGV4Y2VwdGlvbiBpcyB0aHJvd24uDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkTnVtYmVyc0hhbmRsZXJfV2l0aFVuQ2hlY2tlZEV4Y2VwdGlvbigpIHRocm93cyBFeGNlcHRpb24gew0KLQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJ0ZXN0OiAiICsgZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIEFkZE51bWJlcnNIYW5kbGVyU2VydmljZSBzZXJ2aWNlID0gbmV3IEFkZE51bWJlcnNIYW5kbGVyU2VydmljZSgpOw0KLSAgICAgICAgQWRkTnVtYmVyc0hhbmRsZXJQb3J0VHlwZSBwcm94eSA9IHNlcnZpY2UuZ2V0QWRkTnVtYmVyc0hhbmRsZXJQb3J0KCk7DQotDQotICAgICAgICBCaW5kaW5nUHJvdmlkZXIgcCA9IChCaW5kaW5nUHJvdmlkZXIpcHJveHk7DQotICAgICAgICBwLmdldFJlcXVlc3RDb250ZXh0KCkucHV0KEJpbmRpbmdQcm92aWRlci5FTkRQT0lOVF9BRERSRVNTX1BST1BFUlRZLCBheGlzRW5kcG9pbnQpOw0KLSAgICAgICAgU09BUEZhdWx0RXhjZXB0aW9uIGV4cGVjdGVkRXhjZXB0aW9uID0gbnVsbDsNCi0gICAgICAgIFRocm93YWJsZSB0ID0gbnVsbDsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgcHJveHkuYWRkTnVtYmVyc0hhbmRsZXIoLTEwMDAsIEludGVnZXIuTUlOX1ZBTFVFKTsNCi0gICAgICAgICAgICANCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7DQotICAgICAgICAgICAgLy8gQW4gZXhjZXB0aW9uIGlzIGV4cGVjdGVkDQotICAgICAgICAgICAgdCA9IGU7DQotICAgICAgICAgICAgDQotICAgICAgICB9IA0KLSAgICAgICAgDQotICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIHByb3BlciBleGNlcHRpb24gaXMgdGhyb3duDQotICAgICAgICBpZiAodCA9PSBudWxsKSB7DQotICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgQWRkTnVtYmVyc0hhbmRsZXJGYXVsdF9FeGNlcHRpb24gdG8gYmUgdGhyb3duIik7DQotICAgICAgICB9DQotICAgICAgICBpZiAodCBpbnN0YW5jZW9mIFNPQVBGYXVsdEV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIGV4cGVjdGVkRXhjZXB0aW9uID0gKFNPQVBGYXVsdEV4Y2VwdGlvbikgdDsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgU09BUEZhdWx0RXhjZXB0aW9uIHRvIGJlIHRocm93biwgIiArDQotICAgICAgICAgICAgICAgICAgICAgICAgImJ1dCB0aGUgZXhjZXB0aW9uIGlzOiAiICsgdCk7DQotICAgICAgICB9DQotICAgICAgIA0KLSAgICAgICAgLy8gYWxzbyBjb25maXJtIHRoYXQgQFByZURlc3Ryb3kgbWV0aG9kIGlzIGNhbGxlZC4gIFNpbmNlIGl0IG9ubHkgbWFrZXMgc2Vuc2UgdG8gY2FsbCBpdCBvbiB0aGUgbWFuYWdlZA0KLSAgICAgICAgLy8gKHNlcnZlcikgc2lkZSBhbmQganVzdCBiZWZvcmUgdGhlIGhhbmRsZXIgaW5zdGFuY2UgZ29lcyBvdXQgb2Ygc2NvcGUsIHdlIGFyZSBjcmVhdGluZyBhIGZpbGUgaW4gdGhlDQotICAgICAgICAvLyBAUHJlRGVzdHJveSBtZXRob2QsIGFuZCB3aWxsIGNoZWNrIGZvciBpdHMgZXhpc3RhbmNlIGhlcmUuICBJZiB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdCwgaXQgbWVhbnMNCi0gICAgICAgIC8vIEBQcmVEZXN0cm95IG1ldGhvZCB3YXMgbmV2ZXIgY2FsbGVkLiAgVGhlIGZpbGUgaXMgc2V0IHRvIC5kZWxldGVPbkV4aXQoKSwgc28gbm8gbmVlZCB0byBkZWxldGUgaXQuDQotICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZSgiQWRkTnVtYmVyc1Byb3RvY29sSGFuZGxlci5wcmVEZXN0cm95LnR4dCIpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiRmlsZSBBZGROdW1iZXJzUHJvdG9jb2xIYW5kbGVyLnByZURlc3Ryb3kudHh0IGRvZXMgbm90IGV4aXN0LCBtZWFuaW5nIHRoZSBAUHJlRGVzdHJveSBtZXRob2Qgd2FzIG5vdCBjYWxsZWQuIiwgZmlsZS5leGlzdHMoKSk7DQotDQotICAgICAgICBTdHJpbmcgbG9nID0gcmVhZExvZ0ZpbGUoKTsNCi0gICAgICAgIFN0cmluZyBleHBlY3RlZF9jYWxscyA9DQotICAgICAgICAgICAgIkFkZE51bWJlcnNMb2dpY2FsSGFuZGxlcjIgUE9TVF9DT05TVFJVQ1RcbiINCi0gICAgICAgICAgICArICJBZGROdW1iZXJzUHJvdG9jb2xIYW5kbGVyMiBHRVRfSEVBREVSU1xuIg0KLSAgICAgICAgICAgICsgIkFkZE51bWJlcnNQcm90b2NvbEhhbmRsZXIgR0VUX0hFQURFUlNcbiINCi0gICAgICAgICAgICArICJBZGROdW1iZXJzUHJvdG9jb2xIYW5kbGVyIEhBTkRMRV9NRVNTQUdFX0lOQk9VTkRcbiINCi0gICAgICAgICAgICArICJBZGROdW1iZXJzUHJvdG9jb2xIYW5kbGVyMiBIQU5ETEVfTUVTU0FHRV9JTkJPVU5EXG4iDQotICAgICAgICAgICAgKyAiQWRkTnVtYmVyc0xvZ2ljYWxIYW5kbGVyMiBIQU5ETEVfTUVTU0FHRV9JTkJPVU5EXG4iDQotICAgICAgICAgICAgKyAiQWRkTnVtYmVyc0xvZ2ljYWxIYW5kbGVyIEhBTkRMRV9NRVNTQUdFX0lOQk9VTkRcbiINCi0gICAgICAgICAgICArICJBZGROdW1iZXJzTG9naWNhbEhhbmRsZXIgSEFORExFX0ZBVUxUX09VVEJPVU5EXG4iDQotICAgICAgICAgICAgKyAiQWRkTnVtYmVyc0xvZ2ljYWxIYW5kbGVyMiBIQU5ETEVfRkFVTFRfT1VUQk9VTkRcbiINCi0gICAgICAgICAgICArICJBZGROdW1iZXJzUHJvdG9jb2xIYW5kbGVyMiBIQU5ETEVfRkFVTFRfT1VUQk9VTkRcbiINCi0gICAgICAgICAgICArICJBZGROdW1iZXJzUHJvdG9jb2xIYW5kbGVyIEhBTkRMRV9GQVVMVF9PVVRCT1VORFxuIg0KLSAgICAgICAgICAgICsgIkFkZE51bWJlcnNMb2dpY2FsSGFuZGxlciBDTE9TRVxuIg0KLSAgICAgICAgICAgICsgIkFkZE51bWJlcnNMb2dpY2FsSGFuZGxlcjIgQ0xPU0VcbiINCi0gICAgICAgICAgICArICJBZGROdW1iZXJzUHJvdG9jb2xIYW5kbGVyMiBDTE9TRVxuIg0KLSAgICAgICAgICAgICsgIkFkZE51bWJlcnNQcm90b2NvbEhhbmRsZXIgQ0xPU0VcbiINCi0gICAgICAgICAgICArICJBZGROdW1iZXJzUHJvdG9jb2xIYW5kbGVyIFBSRV9ERVNUUk9ZXG4iOw0KLSAgICAgICAgDQotICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRfY2FsbHMsIGxvZyk7DQotICAgICAgICANCi0gICAgICAgIC8vIFRoZSBvdXRib3VuZCBzZXJ2aWNlIGhhbmRsZXIgYWRkcyB0aGUgc3RhY2sgdHJhY2UgdG8gdGhlIA0KLSAgICAgICAgLy8gbWVzc2FnZS4gIE1ha2Ugc3VyZSB0aGUgc3RhY2sgdHJhY2UgY29udGFpbnMgdGhlIEFkZE51bWJlcnNIYW5kbGVyUG9ydFR5cGVJbXBsDQotICAgICAgICANCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJFeHBlY3RlZCBFeGNlcHRpb24gaXMgIiArIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRFeGNlcHRpb24uZ2V0TWVzc2FnZSgpKTsNCi0gICAgICAgIA0KLSAgICAgICAgU09BUEZhdWx0IGZhdWx0ID0gZXhwZWN0ZWRFeGNlcHRpb24uZ2V0RmF1bHQoKTsNCi0gICAgICAgIGFzc2VydFRydWUoIkEgc3RhY2sgdHJhY2Ugd2FzIG5vdCBwcmVzZW50IGluIHRoZSByZXR1cm5lZCBleGNlcHRpb24ncyBtZXNzYWdlOiIgKyANCi0gICAgICAgICAgICAgICAgICAgZmF1bHQuZ2V0RmF1bHRTdHJpbmcoKSwNCi0gICAgICAgICAgICAgICAgICAgZmF1bHQuZ2V0RmF1bHRTdHJpbmcoKS5pbmRleE9mKCJBZGROdW1iZXJzSGFuZGxlclBvcnRUeXBlSW1wbCIpID4gMCk7DQotICAgICAgICAgICAgICAgICAgIA0KLQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIA0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkTnVtYmVyc0hhbmRsZXJEaXNwYXRjaCgpIHsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgUU5hbWUgc2VydmljZU5hbWUgPQ0KLSAgICAgICAgICAgICAgICAgICAgbmV3IFFOYW1lKCJodHRwOi8vb3JnL3Rlc3QvYWRkbnVtYmVyc2hhbmRsZXIiLCAiQWRkTnVtYmVyc0hhbmRsZXJTZXJ2aWNlIik7DQotICAgICAgICAgICAgUU5hbWUgcG9ydE5hbWUgPQ0KLSAgICAgICAgICAgICAgICAgICAgbmV3IFFOYW1lKCJodHRwOi8vb3JnL3Rlc3QvYWRkbnVtYmVyc2hhbmRsZXIiLCAiQWRkTnVtYmVyc0hhbmRsZXJQb3J0Iik7DQotDQotICAgICAgICAgICAgU2VydmljZSBteVNlcnZpY2UgPSBTZXJ2aWNlLmNyZWF0ZShzZXJ2aWNlTmFtZSk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgbXlTZXJ2aWNlLmFkZFBvcnQocG9ydE5hbWUsIG51bGwsIGF4aXNFbmRwb2ludCk7DQotICAgICAgICAgICAgRGlzcGF0Y2g8U291cmNlPiBteURpc3BhdGNoID0gbXlTZXJ2aWNlLmNyZWF0ZURpc3BhdGNoKHBvcnROYW1lLCBTb3VyY2UuY2xhc3MsIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlLk1vZGUuTUVTU0FHRSk7DQotDQotICAgICAgICAgICAgLy8gc2V0IGhhbmRsZXIgY2hhaW4gZm9yIGJpbmRpbmcgcHJvdmlkZXINCi0gICAgICAgICAgICBCaW5kaW5nIGJpbmRpbmcgPSAoKEJpbmRpbmdQcm92aWRlcikgbXlEaXNwYXRjaCkuZ2V0QmluZGluZygpOw0KLQ0KLSAgICAgICAgICAgIC8vIGNyZWF0ZSBhIG5ldyBsaXN0IG9yIHVzZSB0aGUgZXhpc3Rpbmcgb25lDQotICAgICAgICAgICAgTGlzdDxIYW5kbGVyPiBoYW5kbGVycyA9IGJpbmRpbmcuZ2V0SGFuZGxlckNoYWluKCk7DQotICAgICAgICANCi0gICAgICAgICAgICBpZiAoaGFuZGxlcnMgPT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgaGFuZGxlcnMgPSBuZXcgQXJyYXlMaXN0PEhhbmRsZXI+KCk7DQotICAgICAgICAgICAgaGFuZGxlcnMuYWRkKG5ldyBBZGROdW1iZXJzQ2xpZW50TG9naWNhbEhhbmRsZXIoKSk7DQotICAgICAgICAgICAgaGFuZGxlcnMuYWRkKG5ldyBBZGROdW1iZXJzQ2xpZW50UHJvdG9jb2xIYW5kbGVyKCkpOw0KLSAgICAgICAgICAgIGJpbmRpbmcuc2V0SGFuZGxlckNoYWluKGhhbmRsZXJzKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvL0ludm9rZSB0aGUgRGlzcGF0Y2gNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gSW52b2tpbmcgQXN5bmMgRGlzcGF0Y2giKTsNCi0gICAgICAgICAgICBTb3VyY2UgcmVzcG9uc2UgPSBteURpc3BhdGNoLmludm9rZShjcmVhdGVSZXF1ZXN0U291cmNlKCkpOw0KLSAgICAgICAgICAgIFN0cmluZyByZXNTdHJpbmcgPSBnZXRTdHJpbmcocmVzcG9uc2UpOw0KLSAgICAgICAgICAgIGlmICghcmVzU3RyaW5nLmNvbnRhaW5zKCI8cmV0dXJuPjE2PC9yZXR1cm4+IikpIHsNCi0gICAgICAgICAgICAgICAgZmFpbCgiUmVzcG9uc2Ugc3RyaW5nIHNob3VsZCBjb250YWluIDxyZXR1cm4+MTY8L3JldHVybj4sIGJ1dCBkb2VzIG5vdC4gIFRoZSByZXNTdHJpbmcgd2FzOiBcIiIgKyByZXNTdHJpbmcgKyAiXCIiKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgU3RyaW5nIGxvZyA9IHJlYWRMb2dGaWxlKCk7DQotICAgICAgICAgICAgU3RyaW5nIGV4cGVjdGVkX2NhbGxzID0gIkFkZE51bWJlcnNDbGllbnRMb2dpY2FsSGFuZGxlciBIQU5ETEVfTUVTU0FHRV9PVVRCT1VORFxuIg0KLSAgICAgICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc0NsaWVudFByb3RvY29sSGFuZGxlciBIQU5ETEVfTUVTU0FHRV9PVVRCT1VORFxuIg0KLSAgICAgICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc0xvZ2ljYWxIYW5kbGVyMiBQT1NUX0NPTlNUUlVDVFxuIg0KLSAgICAgICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc1Byb3RvY29sSGFuZGxlcjIgR0VUX0hFQURFUlNcbiINCi0gICAgICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNQcm90b2NvbEhhbmRsZXIgR0VUX0hFQURFUlNcbiINCi0gICAgICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNQcm90b2NvbEhhbmRsZXIgSEFORExFX01FU1NBR0VfSU5CT1VORFxuIg0KLSAgICAgICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc1Byb3RvY29sSGFuZGxlcjIgSEFORExFX01FU1NBR0VfSU5CT1VORFxuIg0KLSAgICAgICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc0xvZ2ljYWxIYW5kbGVyMiBIQU5ETEVfTUVTU0FHRV9JTkJPVU5EXG4iDQotICAgICAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzTG9naWNhbEhhbmRsZXIgSEFORExFX01FU1NBR0VfSU5CT1VORFxuIg0KLSAgICAgICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc0xvZ2ljYWxIYW5kbGVyIEhBTkRMRV9NRVNTQUdFX09VVEJPVU5EXG4iDQotICAgICAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzTG9naWNhbEhhbmRsZXIyIEhBTkRMRV9NRVNTQUdFX09VVEJPVU5EXG4iDQotICAgICAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzUHJvdG9jb2xIYW5kbGVyMiBIQU5ETEVfTUVTU0FHRV9PVVRCT1VORFxuIg0KLSAgICAgICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc1Byb3RvY29sSGFuZGxlciBIQU5ETEVfTUVTU0FHRV9PVVRCT1VORFxuIg0KLSAgICAgICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc0xvZ2ljYWxIYW5kbGVyIENMT1NFXG4iDQotICAgICAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzTG9naWNhbEhhbmRsZXIyIENMT1NFXG4iDQotICAgICAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzUHJvdG9jb2xIYW5kbGVyMiBDTE9TRVxuIg0KLSAgICAgICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc1Byb3RvY29sSGFuZGxlciBDTE9TRVxuIg0KLSAgICAgICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc1Byb3RvY29sSGFuZGxlciBQUkVfREVTVFJPWVxuIg0KLSAgICAgICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc0NsaWVudFByb3RvY29sSGFuZGxlciBHRVRfSEVBREVSU1xuIg0KLSAgICAgICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc0NsaWVudFByb3RvY29sSGFuZGxlciBIQU5ETEVfTUVTU0FHRV9JTkJPVU5EXG4iDQotICAgICAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzQ2xpZW50TG9naWNhbEhhbmRsZXIgSEFORExFX01FU1NBR0VfSU5CT1VORFxuIg0KLSAgICAgICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc0NsaWVudFByb3RvY29sSGFuZGxlciBDTE9TRVxuIg0KLSAgICAgICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc0NsaWVudExvZ2ljYWxIYW5kbGVyIENMT1NFXG4iOw0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZF9jYWxscywgbG9nKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgICAgIGZhaWwoKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIHZvaWQgdGVzdEFkZE51bWJlcnNIYW5kbGVyRGlzcGF0Y2hNeVJlc29sdmVyKCkgew0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBRTmFtZSBzZXJ2aWNlTmFtZSA9DQotICAgICAgICAgICAgICAgICAgICBuZXcgUU5hbWUoImh0dHA6Ly9vcmcvdGVzdC9hZGRudW1iZXJzaGFuZGxlciIsICJBZGROdW1iZXJzSGFuZGxlclNlcnZpY2UiKTsNCi0gICAgICAgICAgICBRTmFtZSBwb3J0TmFtZSA9DQotICAgICAgICAgICAgICAgICAgICBuZXcgUU5hbWUoImh0dHA6Ly9vcmcvdGVzdC9hZGRudW1iZXJzaGFuZGxlciIsICJBZGROdW1iZXJzSGFuZGxlclBvcnQiKTsNCi0NCi0gICAgICAgICAgICBTZXJ2aWNlIG15U2VydmljZSA9IFNlcnZpY2UuY3JlYXRlKHNlcnZpY2VOYW1lKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBteVNlcnZpY2Uuc2V0SGFuZGxlclJlc29sdmVyKG5ldyBNeUhhbmRsZXJSZXNvbHZlcigpKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBteVNlcnZpY2UuYWRkUG9ydChwb3J0TmFtZSwgbnVsbCwgYXhpc0VuZHBvaW50KTsNCi0gICAgICAgICAgICBEaXNwYXRjaDxTb3VyY2U+IG15RGlzcGF0Y2ggPSBteVNlcnZpY2UuY3JlYXRlRGlzcGF0Y2gocG9ydE5hbWUsIFNvdXJjZS5jbGFzcywgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZpY2UuTW9kZS5NRVNTQUdFKTsNCi0NCi0gICAgICAgICAgICAvL0ludm9rZSB0aGUgRGlzcGF0Y2gNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gSW52b2tpbmcgQXN5bmMgRGlzcGF0Y2giKTsNCi0gICAgICAgICAgICBTb3VyY2UgcmVzcG9uc2UgPSBteURpc3BhdGNoLmludm9rZShjcmVhdGVSZXF1ZXN0U291cmNlKCkpOw0KLSAgICAgICAgICAgIFN0cmluZyByZXNTdHJpbmcgPSBnZXRTdHJpbmcocmVzcG9uc2UpOw0KLSAgICAgICAgICAgIGlmICghcmVzU3RyaW5nLmNvbnRhaW5zKCI8cmV0dXJuPjE2PC9yZXR1cm4+IikpIHsNCi0gICAgICAgICAgICAgICAgZmFpbCgiUmVzcG9uc2Ugc3RyaW5nIHNob3VsZCBjb250YWluIDxyZXR1cm4+MTY8L3JldHVybj4sIGJ1dCBkb2VzIG5vdC4gIFRoZSByZXNTdHJpbmcgd2FzOiBcIiIgKyByZXNTdHJpbmcgKyAiXCIiKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgU3RyaW5nIGxvZyA9IHJlYWRMb2dGaWxlKCk7DQotICAgICAgICAgICAgU3RyaW5nIGV4cGVjdGVkX2NhbGxzID0gIkFkZE51bWJlcnNDbGllbnRMb2dpY2FsSGFuZGxlciBIQU5ETEVfTUVTU0FHRV9PVVRCT1VORFxuIg0KLSAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzQ2xpZW50UHJvdG9jb2xIYW5kbGVyIEhBTkRMRV9NRVNTQUdFX09VVEJPVU5EXG4iDQotICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNMb2dpY2FsSGFuZGxlcjIgUE9TVF9DT05TVFJVQ1RcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc1Byb3RvY29sSGFuZGxlcjIgR0VUX0hFQURFUlNcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc1Byb3RvY29sSGFuZGxlciBHRVRfSEVBREVSU1xuIg0KLSAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzUHJvdG9jb2xIYW5kbGVyIEhBTkRMRV9NRVNTQUdFX0lOQk9VTkRcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc1Byb3RvY29sSGFuZGxlcjIgSEFORExFX01FU1NBR0VfSU5CT1VORFxuIg0KLSAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzTG9naWNhbEhhbmRsZXIyIEhBTkRMRV9NRVNTQUdFX0lOQk9VTkRcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc0xvZ2ljYWxIYW5kbGVyIEhBTkRMRV9NRVNTQUdFX0lOQk9VTkRcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc0xvZ2ljYWxIYW5kbGVyIEhBTkRMRV9NRVNTQUdFX09VVEJPVU5EXG4iDQotICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNMb2dpY2FsSGFuZGxlcjIgSEFORExFX01FU1NBR0VfT1VUQk9VTkRcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc1Byb3RvY29sSGFuZGxlcjIgSEFORExFX01FU1NBR0VfT1VUQk9VTkRcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc1Byb3RvY29sSGFuZGxlciBIQU5ETEVfTUVTU0FHRV9PVVRCT1VORFxuIg0KLSAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzTG9naWNhbEhhbmRsZXIgQ0xPU0VcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc0xvZ2ljYWxIYW5kbGVyMiBDTE9TRVxuIg0KLSAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzUHJvdG9jb2xIYW5kbGVyMiBDTE9TRVxuIg0KLSAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzUHJvdG9jb2xIYW5kbGVyIENMT1NFXG4iDQotICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNQcm90b2NvbEhhbmRsZXIgUFJFX0RFU1RST1lcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc0NsaWVudFByb3RvY29sSGFuZGxlciBHRVRfSEVBREVSU1xuIg0KLSAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzQ2xpZW50UHJvdG9jb2xIYW5kbGVyIEhBTkRMRV9NRVNTQUdFX0lOQk9VTkRcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc0NsaWVudExvZ2ljYWxIYW5kbGVyIEhBTkRMRV9NRVNTQUdFX0lOQk9VTkRcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc0NsaWVudFByb3RvY29sSGFuZGxlciBDTE9TRVxuIg0KLSAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzQ2xpZW50TG9naWNhbEhhbmRsZXIgQ0xPU0VcbiI7DQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkX2NhbGxzLCBsb2cpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAgICAgZmFpbCgpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICAvKg0KLSAgICAgKiBKQVhXUyA5LjIuMS4xIGNvbmZvcm1hbmNlIHRlc3QNCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RBZGROdW1iZXJzSGFuZGxlclJlc29sdmVyKCkgew0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJ0ZXN0OiAiICsgZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgICAgICBBZGROdW1iZXJzSGFuZGxlclNlcnZpY2Ugc2VydmljZSA9IG5ldyBBZGROdW1iZXJzSGFuZGxlclNlcnZpY2UoKTsNCi0NCi0gICAgICAgICAgICBBZGROdW1iZXJzSGFuZGxlclBvcnRUeXBlIHByb3h5ID0gc2VydmljZS5nZXRBZGROdW1iZXJzSGFuZGxlclBvcnQoKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBzZXJ2aWNlLnNldEhhbmRsZXJSZXNvbHZlcihuZXcgTXlIYW5kbGVyUmVzb2x2ZXIoKSk7DQotDQotICAgICAgICAgICAgQmluZGluZ1Byb3ZpZGVyIHAgPSAoQmluZGluZ1Byb3ZpZGVyKSBwcm94eTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvKg0KLSAgICAgICAgICAgICAqIGRlc3BpdGUgc2V0dGluZyBNeUhhbmRsZXJSZXNvbHZlciBvbiB0aGUgc2VydmljZSwgd2Ugc2hvdWxkIGdldCBhbiBlbXB0eQ0KLSAgICAgICAgICAgICAqIGxpc3QgZnJvbSB0aGUgZ2V0QmluZGluZygpLmdldEhhbmRsZXJDaGFpbigpIGNhbGwgYmVsb3cuICBKQVhXUyA5LjIuMS4xIGNvbmZvcm1hbmNlDQotICAgICAgICAgICAgICovDQotICAgICAgICAgICAgTGlzdDxIYW5kbGVyPiBsaXN0ID0gcC5nZXRCaW5kaW5nKCkuZ2V0SGFuZGxlckNoYWluKCk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiTGlzdCBzaG91bGQgYmUgZW1wdHkuICBXZSd2ZSBub3QgY29uZm9ybWVkIHRvIEpBWFdTIDkuMi4xLjEuIiwgbGlzdC5pc0VtcHR5KCkpOw0KLSAgICAgICAgICAgIFN0cmluZyBsb2cgPSByZWFkTG9nRmlsZSgpOw0KLSAgICAgICAgICAgIGFzc2VydE51bGwoImxvZyBzaG91bGQgYmUgZW1wdHksIHNpbmNlIG5vIGhhbmRsZXJzIGFyZSBpbiB0aGUgbGlzdCBhbmQgd2UgbmV2ZXIgY2FsbGVkIGEgc2VydmljZSIsIGxvZyk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkTnVtYmVyc0hhbmRsZXJXaXRoRmF1bHQoKSB7DQotICAgICAgICB0cnl7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygidGVzdDogIiArIGdldE5hbWUoKSk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgQWRkTnVtYmVyc0hhbmRsZXJTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgQWRkTnVtYmVyc0hhbmRsZXJTZXJ2aWNlKCk7DQotICAgICAgICAgICAgQWRkTnVtYmVyc0hhbmRsZXJQb3J0VHlwZSBwcm94eSA9IHNlcnZpY2UuZ2V0QWRkTnVtYmVyc0hhbmRsZXJQb3J0KCk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgQmluZGluZ1Byb3ZpZGVyIHAgPSAoQmluZGluZ1Byb3ZpZGVyKXByb3h5Ow0KLSAgICAgICAgICAgIHAuZ2V0UmVxdWVzdENvbnRleHQoKS5wdXQoQmluZGluZ1Byb3ZpZGVyLkVORFBPSU5UX0FERFJFU1NfUFJPUEVSVFksIA0KLSAgICAgICAgICAgICAgICAgICAgYXhpc0VuZHBvaW50KTsgIA0KLSAgICAgICAgICAgIC8vIHZhbHVlIDk5IHRyaWdnZXJzIHRoZSBoYW5kbGVyIHRvIHRocm93IGFuIGV4Y2VwdGlvbiwgYnV0IGRvZXMNCi0gICAgICAgICAgICAvLyBOT1QgdHJpZ2dlciB0aGUgQWRkTnVtYmVyc0hhbmRsZXIuaGFuZGxlZmF1bHQgbWV0aG9kLg0KLSAgICAgICAgICAgIC8vIFRoZSBzcGVjIGRvZXMgbm90IGNhbGwgdGhlIGhhbmRsZWZhdWx0IG1ldGhvZCBvZiBhIGhhbmRsZXIgdGhhdA0KLSAgICAgICAgICAgIC8vIGNhdXNlcyBhIGZsb3cgcmV2ZXJzYWwNCi0gICAgICAgICAgICBpbnQgdG90YWwgPSBwcm94eS5hZGROdW1iZXJzSGFuZGxlcig5OSwxMCk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgZmFpbCgiV2Ugc2hvdWxkIGhhdmUgZ290IGFuIGV4Y2VwdGlvbiBkdWUgdG8gdGhlIGhhbmRsZXIuIik7DQotICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKCJFeGNlcHRpb24gc2hvdWxkIGJlIFNPQVBGYXVsdEV4Y2VwdGlvbiIsIGUgaW5zdGFuY2VvZiBTT0FQRmF1bHRFeGNlcHRpb24pOw0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscygoKFNPQVBGYXVsdEV4Y2VwdGlvbillKS5nZXRNZXNzYWdlKCksICJJIGRvbid0IGxpa2UgdGhlIHZhbHVlIDk5Iik7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgU3RyaW5nIGxvZyA9IHJlYWRMb2dGaWxlKCk7DQotICAgICAgICAgICAgU3RyaW5nIGV4cGVjdGVkX2NhbGxzID0gIkFkZE51bWJlcnNMb2dpY2FsSGFuZGxlcjIgUE9TVF9DT05TVFJVQ1RcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc1Byb3RvY29sSGFuZGxlcjIgR0VUX0hFQURFUlNcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc1Byb3RvY29sSGFuZGxlciBHRVRfSEVBREVSU1xuIg0KLSAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzUHJvdG9jb2xIYW5kbGVyIEhBTkRMRV9NRVNTQUdFX0lOQk9VTkRcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc1Byb3RvY29sSGFuZGxlcjIgSEFORExFX01FU1NBR0VfSU5CT1VORFxuIg0KLSAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzTG9naWNhbEhhbmRsZXIyIEhBTkRMRV9NRVNTQUdFX0lOQk9VTkRcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc0xvZ2ljYWxIYW5kbGVyMiBUSFJPV0lORyBQUk9UT0NPTEVYQ0VQVElPTiBJTkJPVU5EXG4iDQotICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNQcm90b2NvbEhhbmRsZXIyIEhBTkRMRV9GQVVMVF9PVVRCT1VORFxuIg0KLSAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzUHJvdG9jb2xIYW5kbGVyIEhBTkRMRV9GQVVMVF9PVVRCT1VORFxuIg0KLSAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzTG9naWNhbEhhbmRsZXIyIENMT1NFXG4iDQotICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNQcm90b2NvbEhhbmRsZXIyIENMT1NFXG4iDQotICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNQcm90b2NvbEhhbmRsZXIgQ0xPU0VcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc1Byb3RvY29sSGFuZGxlciBQUkVfREVTVFJPWVxuIjsNCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRfY2FsbHMsIGxvZyk7DQotICAgICAgICB9DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICB9DQotDQotDQotICAgIC8qKg0KLSAgICAgKiB0ZXN0QWRkTnVtYmVyc0NsaWVudEhhbmRsZXIgcGVyZm9ybXMgdGhlIHNhbWUgdGVzdHMgYXMgdGVzdEFkZE51bWJlcnNIYW5kbGVyLCBleGNlcHQNCi0gICAgICogdGhhdCB0d28gY2xpZW50LXNpZGUgaGFuZGxlcnMgYXJlIGFsc28gaW5zZXJ0ZWQgaW50byB0aGUgZmxvdy4gIFRoZSBpbmJvdW5kIEFkZE51bWJlcnNDbGllbnRMb2dpY2FsSGFuZGxlcg0KLSAgICAgKiBjaGVja3MgdGhhdCB0aGUgcHJvcGVydGllcyBzZXQgaGVyZSBpbiB0aGlzIG1ldGhvZCAodGhlIGNsaWVudCBhcHApIGFuZCB0aGUgcHJvcGVydGllcyBzZXQgaW4gdGhlDQotICAgICAqIG91dGJvdW5kIEFkZE51bWJlcnNDbGllbnRQcm90b2NvbEhhbmRsZXIgYXJlIGFjY2Vzc2libGUuICBUaGVzZSBwcm9wZXJ0aWVzIGFyZSBhbHNvIGNoZWNrZWQgaGVyZSBpbg0KLSAgICAgKiB0aGUgY2xpZW50IGFwcC4gIEFkZE51bWJlcnNDbGllbnRMb2dpY2FsSGFuZGxlciBhbHNvIHN1YnRyYWN0cyAxIGZyb20gdGhlIHN1bSBvbiB0aGUgaW5ib3VuZCBmbG93Lg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdEFkZE51bWJlcnNDbGllbnRIYW5kbGVyKCkgew0KLSAgICAgICAgdHJ5ew0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoInRlc3Q6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIEFkZE51bWJlcnNIYW5kbGVyU2VydmljZSBzZXJ2aWNlID0gbmV3IEFkZE51bWJlcnNIYW5kbGVyU2VydmljZSgpOw0KLSAgICAgICAgICAgIEFkZE51bWJlcnNIYW5kbGVyUG9ydFR5cGUgcHJveHkgPSBzZXJ2aWNlLmdldEFkZE51bWJlcnNIYW5kbGVyUG9ydCgpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIEJpbmRpbmdQcm92aWRlciBwID0gKEJpbmRpbmdQcm92aWRlcilwcm94eTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBwLmdldFJlcXVlc3RDb250ZXh0KCkucHV0KEJpbmRpbmdQcm92aWRlci5FTkRQT0lOVF9BRERSRVNTX1BST1BFUlRZLCANCi0gICAgICAgICAgICAgICAgICAgIGF4aXNFbmRwb2ludCk7DQotICAgICAgICAgICAgcC5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dCgibXlDbGllbnRLZXkiLCAibXlDbGllbnRWYWwiKTsNCi0NCi0gICAgICAgICAgICBMaXN0PEhhbmRsZXI+IGhhbmRsZXJzID0gcC5nZXRCaW5kaW5nKCkuZ2V0SGFuZGxlckNoYWluKCk7DQotICAgICAgICAgICAgaWYgKGhhbmRsZXJzID09IG51bGwpDQotICAgICAgICAgICAgICAgIGhhbmRsZXJzID0gbmV3IEFycmF5TGlzdDxIYW5kbGVyPigpOw0KLSAgICAgICAgICAgIGhhbmRsZXJzLmFkZChuZXcgQWRkTnVtYmVyc0NsaWVudExvZ2ljYWxIYW5kbGVyKCkpOw0KLSAgICAgICAgICAgIGhhbmRsZXJzLmFkZChuZXcgQWRkTnVtYmVyc0NsaWVudFByb3RvY29sSGFuZGxlcigpKTsNCi0gICAgICAgICAgICBwLmdldEJpbmRpbmcoKS5zZXRIYW5kbGVyQ2hhaW4oaGFuZGxlcnMpOw0KLQ0KLSAgICAgICAgICAgIGludCB0b3RhbCA9IHByb3h5LmFkZE51bWJlcnNIYW5kbGVyKDEwLDEwKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBzZWUgaWYgSSBjYW4gZ2V0IGFuIEFQUExJQ0FUSU9OIHNjb3BlZCBwcm9wZXJ0eSBzZXQgZHVyaW5nIG91dGJvdW5kIGZsb3cuICBJIHNob3VsZCBiZSBhYmxlIHRvIGRvIHRoaXMgYWNjb3JkaW5nIHRvIDQuMi4xDQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gVE9ETzogIGFzc2VydCBpcyBub3cgY29tbWVudGVkIG91dC4gIFRoaXMgcHJvcGVydHkgaXMgc2V0IGJ5IGEgY2xpZW50IG91dGJvdW5kIGhhbmRsZXIsIGFuZCBJIGRvbid0IHRoaW5rIGl0DQotICAgICAgICAgICAgLy8gc2hvdWxkIGJlIGF2YWlsYWJsZSBvbiB0aGUgcmVxdWVzdCBvciByZXNwb25zZSBjb250ZXh0cy4NCi0gICAgICAgICAgICAvL2Fzc2VydE5vdE51bGwoIlNob3VsZCBiZSBhYmxlIHRvIHJldHJpZXZlIEFQUExJQ0FUSU9OIHNjb3BlZCBwcm9wZXJ0eSwgYnV0IGNvdWxkIG5vdC4iLCAoKFN0cmluZylwLmdldFJlcXVlc3RDb250ZXh0KCkuZ2V0KCJBZGROdW1iZXJzQ2xpZW50UHJvdG9jb2xIYW5kbGVyT3V0Ym91bmRBcHBTY29wZWRQcm9wZXJ0eSIpKSk7DQotDQotICAgICAgICAgICAgLy8gc2hvdWxkIE5PVCBiZSBhYmxlIHRvIGdldCB0aGlzIEhBTkRMRVIgc2NvcGVkIHByb3BlcnR5IHRob3VnaA0KLSAgICAgICAgICAgIGFzc2VydE51bGwoIlNob3VsZCBub3QgYmUgYWJsZSB0byByZXRyaWV2ZSBIQU5ETEVSIHNjb3BlZCBwcm9wZXJ0eSwgYnV0IHdhcyBhYmxlLiIsIChTdHJpbmcpcC5nZXRSZXNwb25zZUNvbnRleHQoKS5nZXQoIkFkZE51bWJlcnNDbGllbnRQcm90b2NvbEhhbmRsZXJPdXRib3VuZEhhbmRsZXJTY29wZWRQcm9wZXJ0eSIpKTsNCi0gICAgICAgICAgICAvLyBzaG91bGQgYmUgYWJsZSB0byBnZXQgdGhpcyBBUFBMSUNBVElPTiBzY29wZWQgcHJvcGVydHkgc2V0IGR1cmluZyBpbmJvdW5kIGZsb3cNCi0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKCJTaG91bGQgYmUgYWJsZSB0byByZXRyaWV2ZSBBUFBMSUNBVElPTiBzY29wZWQgcHJvcGVydHksIGJ1dCBjb3VsZCBub3QuIiwgKFN0cmluZylwLmdldFJlc3BvbnNlQ29udGV4dCgpLmdldCgiQWRkTnVtYmVyc0NsaWVudFByb3RvY29sSGFuZGxlckluYm91bmRBcHBTY29wZWRQcm9wZXJ0eSIpKTsNCi0gICAgICAgICAgICAvLyBzaG91bGQgTk9UIGJlIGFibGUgdG8gZ2V0IHRoaXMgSEFORExFUiBzY29wZWQgcHJvcGVydHkgdGhvdWdoDQotICAgICAgICAgICAgYXNzZXJ0TnVsbCgiU2hvdWxkIG5vdCBiZSBhYmxlIHRvIHJldHJpZXZlIEhBTkRMRVIgc2NvcGVkIHByb3BlcnR5LCBidXQgd2FzIGFibGUuIiwgKFN0cmluZylwLmdldFJlc3BvbnNlQ29udGV4dCgpLmdldCgiQWRkTnVtYmVyc0NsaWVudFByb3RvY29sSGFuZGxlckluYm91bmRIYW5kbGVyU2NvcGVkUHJvcGVydHkiKSk7DQotICAgICAgICAgICAgLy8gc2hvdWxkIGJlIGFibGUgdG8gZ2V0IHRoaXMgQVBQTElDQVRJT04gc2NvcGVkIHByb3BlcnR5IHNldCBieSB0aGlzIGNsaWVudA0KLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoIlNob3VsZCBiZSBhYmxlIHRvIHJldHJpZXZlIEFQUExJQ0FUSU9OIHNjb3BlZCBwcm9wZXJ0eSwgYnV0IGNvdWxkIG5vdC4iLCAoU3RyaW5nKXAuZ2V0UmVxdWVzdENvbnRleHQoKS5nZXQoIm15Q2xpZW50S2V5IikpOw0KLQ0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiV2l0aCBoYW5kbGVyIG1hbmlwdWxhdGlvbiwgdG90YWwgc2hvdWxkIGJlIDQgbGVzcyB0aGFuIGEgcHJvcGVyIHN1bWF0aW9uLiIsIDE2LCB0b3RhbCk7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIlRvdGFsIChhZnRlciBoYW5kbGVyIG1hbmlwdWxhdGlvbikgPSAiICsgdG90YWwpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIFN0cmluZyBsb2cgPSByZWFkTG9nRmlsZSgpOw0KLSAgICAgICAgICAgIFN0cmluZyBleHBlY3RlZF9jYWxscyA9ICJBZGROdW1iZXJzQ2xpZW50TG9naWNhbEhhbmRsZXIgSEFORExFX01FU1NBR0VfT1VUQk9VTkRcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc0NsaWVudFByb3RvY29sSGFuZGxlciBIQU5ETEVfTUVTU0FHRV9PVVRCT1VORFxuIg0KLSAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzTG9naWNhbEhhbmRsZXIyIFBPU1RfQ09OU1RSVUNUXG4iDQotICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNQcm90b2NvbEhhbmRsZXIyIEdFVF9IRUFERVJTXG4iDQotICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNQcm90b2NvbEhhbmRsZXIgR0VUX0hFQURFUlNcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc1Byb3RvY29sSGFuZGxlciBIQU5ETEVfTUVTU0FHRV9JTkJPVU5EXG4iDQotICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNQcm90b2NvbEhhbmRsZXIyIEhBTkRMRV9NRVNTQUdFX0lOQk9VTkRcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc0xvZ2ljYWxIYW5kbGVyMiBIQU5ETEVfTUVTU0FHRV9JTkJPVU5EXG4iDQotICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNMb2dpY2FsSGFuZGxlciBIQU5ETEVfTUVTU0FHRV9JTkJPVU5EXG4iDQotICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNMb2dpY2FsSGFuZGxlciBIQU5ETEVfTUVTU0FHRV9PVVRCT1VORFxuIg0KLSAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzTG9naWNhbEhhbmRsZXIyIEhBTkRMRV9NRVNTQUdFX09VVEJPVU5EXG4iDQotICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNQcm90b2NvbEhhbmRsZXIyIEhBTkRMRV9NRVNTQUdFX09VVEJPVU5EXG4iDQotICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNQcm90b2NvbEhhbmRsZXIgSEFORExFX01FU1NBR0VfT1VUQk9VTkRcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc0xvZ2ljYWxIYW5kbGVyIENMT1NFXG4iDQotICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNMb2dpY2FsSGFuZGxlcjIgQ0xPU0VcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc1Byb3RvY29sSGFuZGxlcjIgQ0xPU0VcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc1Byb3RvY29sSGFuZGxlciBDTE9TRVxuIg0KLSAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzUHJvdG9jb2xIYW5kbGVyIFBSRV9ERVNUUk9ZXG4iDQotICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNDbGllbnRQcm90b2NvbEhhbmRsZXIgR0VUX0hFQURFUlNcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc0NsaWVudFByb3RvY29sSGFuZGxlciBIQU5ETEVfTUVTU0FHRV9JTkJPVU5EXG4iDQotICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNDbGllbnRMb2dpY2FsSGFuZGxlciBIQU5ETEVfTUVTU0FHRV9JTkJPVU5EXG4iDQotICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNDbGllbnRQcm90b2NvbEhhbmRsZXIgQ0xPU0VcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc0NsaWVudExvZ2ljYWxIYW5kbGVyIENMT1NFXG4iOw0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZF9jYWxscywgbG9nKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAgICAgZmFpbCgpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICAvKg0KLSAgICAgKiB1c2VzIGEgY3VzdG9tIEhhbmRsZXJSZXNvbHZlciBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0LiAgTXlIYW5kbGVyUmVzb2x2ZXINCi0gICAgICogcHV0cyB0aGUgQWRkTnVtYmVyc0NsaWVudExvZ2ljYWxIYW5kbGVyIGFuZCBBZGROdW1iZXJzQ2xpZW50UHJvdG9jb2xIYW5kbGVyDQotICAgICAqIGluIHRoZSBmbG93LiAgUmVzdWx0cyBzaG91bGQgYmUgdGhlIHNhbWUgYXMgdGVzdEFkZE51bWJlcnNDbGllbnRIYW5kbGVyLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdEFkZE51bWJlcnNDbGllbnRIYW5kbGVyTXlSZXNvbHZlcigpIHsNCi0gICAgICAgIHRyeXsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJ0ZXN0OiAiICsgZ2V0TmFtZSgpKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBBZGROdW1iZXJzSGFuZGxlclNlcnZpY2Ugc2VydmljZSA9IG5ldyBBZGROdW1iZXJzSGFuZGxlclNlcnZpY2UoKTsNCi0gICAgICAgICAgICBzZXJ2aWNlLnNldEhhbmRsZXJSZXNvbHZlcihuZXcgTXlIYW5kbGVyUmVzb2x2ZXIoKSk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgQWRkTnVtYmVyc0hhbmRsZXJQb3J0VHlwZSBwcm94eSA9IHNlcnZpY2UuZ2V0QWRkTnVtYmVyc0hhbmRsZXJQb3J0KCk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgQmluZGluZ1Byb3ZpZGVyIHAgPSAoQmluZGluZ1Byb3ZpZGVyKXByb3h5Ow0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIHAuZ2V0UmVxdWVzdENvbnRleHQoKS5wdXQoQmluZGluZ1Byb3ZpZGVyLkVORFBPSU5UX0FERFJFU1NfUFJPUEVSVFksIA0KLSAgICAgICAgICAgICAgICAgICAgYXhpc0VuZHBvaW50KTsNCi0NCi0gICAgICAgICAgICBpbnQgdG90YWwgPSBwcm94eS5hZGROdW1iZXJzSGFuZGxlcigxMCwxMCk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJXaXRoIGhhbmRsZXIgbWFuaXB1bGF0aW9uLCB0b3RhbCBzaG91bGQgYmUgNCBsZXNzIHRoYW4gYSBwcm9wZXIgc3VtYXRpb24uIiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgMTYsDQotICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsKTsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiVG90YWwgKGFmdGVyIGhhbmRsZXIgbWFuaXB1bGF0aW9uKSA9ICIgKyB0b3RhbCk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgU3RyaW5nIGxvZyA9IHJlYWRMb2dGaWxlKCk7DQotICAgICAgICAgICAgU3RyaW5nIGV4cGVjdGVkX2NhbGxzID0gIkFkZE51bWJlcnNDbGllbnRMb2dpY2FsSGFuZGxlciBIQU5ETEVfTUVTU0FHRV9PVVRCT1VORFxuIg0KLSAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzQ2xpZW50UHJvdG9jb2xIYW5kbGVyIEhBTkRMRV9NRVNTQUdFX09VVEJPVU5EXG4iDQotICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNMb2dpY2FsSGFuZGxlcjIgUE9TVF9DT05TVFJVQ1RcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc1Byb3RvY29sSGFuZGxlcjIgR0VUX0hFQURFUlNcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc1Byb3RvY29sSGFuZGxlciBHRVRfSEVBREVSU1xuIg0KLSAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzUHJvdG9jb2xIYW5kbGVyIEhBTkRMRV9NRVNTQUdFX0lOQk9VTkRcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc1Byb3RvY29sSGFuZGxlcjIgSEFORExFX01FU1NBR0VfSU5CT1VORFxuIg0KLSAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzTG9naWNhbEhhbmRsZXIyIEhBTkRMRV9NRVNTQUdFX0lOQk9VTkRcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc0xvZ2ljYWxIYW5kbGVyIEhBTkRMRV9NRVNTQUdFX0lOQk9VTkRcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc0xvZ2ljYWxIYW5kbGVyIEhBTkRMRV9NRVNTQUdFX09VVEJPVU5EXG4iDQotICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNMb2dpY2FsSGFuZGxlcjIgSEFORExFX01FU1NBR0VfT1VUQk9VTkRcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc1Byb3RvY29sSGFuZGxlcjIgSEFORExFX01FU1NBR0VfT1VUQk9VTkRcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc1Byb3RvY29sSGFuZGxlciBIQU5ETEVfTUVTU0FHRV9PVVRCT1VORFxuIg0KLSAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzTG9naWNhbEhhbmRsZXIgQ0xPU0VcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc0xvZ2ljYWxIYW5kbGVyMiBDTE9TRVxuIg0KLSAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzUHJvdG9jb2xIYW5kbGVyMiBDTE9TRVxuIg0KLSAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzUHJvdG9jb2xIYW5kbGVyIENMT1NFXG4iDQotICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNQcm90b2NvbEhhbmRsZXIgUFJFX0RFU1RST1lcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc0NsaWVudFByb3RvY29sSGFuZGxlciBHRVRfSEVBREVSU1xuIg0KLSAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzQ2xpZW50UHJvdG9jb2xIYW5kbGVyIEhBTkRMRV9NRVNTQUdFX0lOQk9VTkRcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc0NsaWVudExvZ2ljYWxIYW5kbGVyIEhBTkRMRV9NRVNTQUdFX0lOQk9VTkRcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc0NsaWVudFByb3RvY29sSGFuZGxlciBDTE9TRVxuIg0KLSAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzQ2xpZW50TG9naWNhbEhhbmRsZXIgQ0xPU0VcbiI7DQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkX2NhbGxzLCBsb2cpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgICAgICBmYWlsKCk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHRlc3RBZGROdW1iZXJzQ2xpZW50UHJvdG9BbmRMb2dpY2FsSGFuZGxlcigpIHsNCi0gICAgICAgIHRyeXsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJ0ZXN0OiAiICsgZ2V0TmFtZSgpKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBBZGROdW1iZXJzSGFuZGxlclNlcnZpY2Ugc2VydmljZSA9IG5ldyBBZGROdW1iZXJzSGFuZGxlclNlcnZpY2UoKTsNCi0gICAgICAgICAgICBBZGROdW1iZXJzSGFuZGxlclBvcnRUeXBlIHByb3h5ID0gc2VydmljZS5nZXRBZGROdW1iZXJzSGFuZGxlclBvcnQoKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBCaW5kaW5nUHJvdmlkZXIgcCA9IChCaW5kaW5nUHJvdmlkZXIpcHJveHk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgcC5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dChCaW5kaW5nUHJvdmlkZXIuRU5EUE9JTlRfQUREUkVTU19QUk9QRVJUWSwgDQotICAgICAgICAgICAgICAgICAgICBheGlzRW5kcG9pbnQpOw0KLQ0KLSAgICAgICAgICAgIExpc3Q8SGFuZGxlcj4gaGFuZGxlcnMgPSBwLmdldEJpbmRpbmcoKS5nZXRIYW5kbGVyQ2hhaW4oKTsNCi0gICAgICAgICAgICBpZiAoaGFuZGxlcnMgPT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgaGFuZGxlcnMgPSBuZXcgQXJyYXlMaXN0PEhhbmRsZXI+KCk7DQotICAgICAgICAgICAgaGFuZGxlcnMuYWRkKG5ldyBBZGROdW1iZXJzQ2xpZW50TG9naWNhbEhhbmRsZXIoKSk7DQotICAgICAgICAgICAgaGFuZGxlcnMuYWRkKG5ldyBBZGROdW1iZXJzQ2xpZW50UHJvdG9jb2xIYW5kbGVyKCkpOw0KLSAgICAgICAgICAgIHAuZ2V0QmluZGluZygpLnNldEhhbmRsZXJDaGFpbihoYW5kbGVycyk7DQotDQotICAgICAgICAgICAgLy8gdmFsdWUgMTAyIHRyaWdnZXJzIGFuIGVuZHBvaW50IGV4Y2VwdGlvbiwgd2hpY2ggd2lsbCBydW4gdGhyb3VnaCB0aGUgc2VydmVyIG91dGJvdW5kDQotICAgICAgICAgICAgLy8gaGFuZGxlRmF1bHQgbWV0aG9kcywgdGhlbiBjbGllbnQgaW5ib3VuZCBoYW5kbGVGYXVsdCBtZXRob2RzDQotICAgICAgICAgICAgaW50IHRvdGFsID0gcHJveHkuYWRkTnVtYmVyc0hhbmRsZXIoMTAyLDEwKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBmYWlsKCJzaG91bGQgaGF2ZSBnb3QgYW4gZXhjZXB0aW9uLCBidXQgZGlkbid0Iik7DQotICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKCJFeGNlcHRpb24gc2hvdWxkIGJlIFNPQVBGYXVsdEV4Y2VwdGlvbiIsIGUgaW5zdGFuY2VvZiBTT0FQRmF1bHRFeGNlcHRpb24pOw0KLSAgICAgICAgICAgIC8vQVhJUzItMjQxNyAtIGFzc2VydEVxdWFscygoKFNPQVBGYXVsdEV4Y2VwdGlvbillKS5nZXRNZXNzYWdlKCksICJBZGROdW1iZXJzTG9naWNhbEhhbmRsZXIyIHdhcyBoZXJlIik7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgoKFNPQVBGYXVsdEV4Y2VwdGlvbillKS5nZXRNZXNzYWdlKCkuY29udGFpbnMoIkdvdCB2YWx1ZSAxMDEuICAiICsNCi0gICAgICAgICAgICAJCSJBZGROdW1iZXJzSGFuZGxlclBvcnRUeXBlSW1wbC5hZGROdW1iZXJzSGFuZGxlciBtZXRob2QgaXMgIiArDQotICAgICAgICAgICAgCQkiY29ycmVjdGx5IHRocm93aW5nIHRoaXMgZXhjZXB0aW9uIGFzIHBhcnQgb2YgdGVzdGluZyIpKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBTdHJpbmcgbG9nID0gcmVhZExvZ0ZpbGUoKTsNCi0gICAgICAgICAgICBTdHJpbmcgZXhwZWN0ZWRfY2FsbHMgPSAiQWRkTnVtYmVyc0NsaWVudExvZ2ljYWxIYW5kbGVyIEhBTkRMRV9NRVNTQUdFX09VVEJPVU5EXG4iDQotICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNDbGllbnRQcm90b2NvbEhhbmRsZXIgSEFORExFX01FU1NBR0VfT1VUQk9VTkRcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc0xvZ2ljYWxIYW5kbGVyMiBQT1NUX0NPTlNUUlVDVFxuIg0KLSAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzUHJvdG9jb2xIYW5kbGVyMiBHRVRfSEVBREVSU1xuIg0KLSAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzUHJvdG9jb2xIYW5kbGVyIEdFVF9IRUFERVJTXG4iDQotICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNQcm90b2NvbEhhbmRsZXIgSEFORExFX01FU1NBR0VfSU5CT1VORFxuIg0KLSAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzUHJvdG9jb2xIYW5kbGVyMiBIQU5ETEVfTUVTU0FHRV9JTkJPVU5EXG4iDQotICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNMb2dpY2FsSGFuZGxlcjIgSEFORExFX01FU1NBR0VfSU5CT1VORFxuIg0KLSAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzTG9naWNhbEhhbmRsZXIgSEFORExFX01FU1NBR0VfSU5CT1VORFxuIg0KLSAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzTG9naWNhbEhhbmRsZXIgSEFORExFX0ZBVUxUX09VVEJPVU5EXG4iDQotICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNMb2dpY2FsSGFuZGxlcjIgSEFORExFX0ZBVUxUX09VVEJPVU5EXG4iDQotICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNQcm90b2NvbEhhbmRsZXIyIEhBTkRMRV9GQVVMVF9PVVRCT1VORFxuIg0KLSAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzUHJvdG9jb2xIYW5kbGVyIEhBTkRMRV9GQVVMVF9PVVRCT1VORFxuIg0KLSAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzTG9naWNhbEhhbmRsZXIgQ0xPU0VcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc0xvZ2ljYWxIYW5kbGVyMiBDTE9TRVxuIg0KLSAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzUHJvdG9jb2xIYW5kbGVyMiBDTE9TRVxuIg0KLSAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzUHJvdG9jb2xIYW5kbGVyIENMT1NFXG4iDQotICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNQcm90b2NvbEhhbmRsZXIgUFJFX0RFU1RST1lcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc0NsaWVudFByb3RvY29sSGFuZGxlciBHRVRfSEVBREVSU1xuIg0KLSAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzQ2xpZW50UHJvdG9jb2xIYW5kbGVyIEhBTkRMRV9GQVVMVF9JTkJPVU5EXG4iDQotICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNDbGllbnRMb2dpY2FsSGFuZGxlciBIQU5ETEVfRkFVTFRfSU5CT1VORFxuIg0KLSAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzQ2xpZW50UHJvdG9jb2xIYW5kbGVyIENMT1NFXG4iDQotICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNDbGllbnRMb2dpY2FsSGFuZGxlciBDTE9TRVxuIjsNCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRfY2FsbHMsIGxvZyk7DQotICAgICAgICAgICAgDQotICAgICAgICB9DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkTnVtYmVyc0NsaWVudEhhbmRsZXJXaXRoRmF1bHQoKSB7DQotICAgICAgICB0cnl7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygidGVzdDogIiArIGdldE5hbWUoKSk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgQWRkTnVtYmVyc0hhbmRsZXJTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgQWRkTnVtYmVyc0hhbmRsZXJTZXJ2aWNlKCk7DQotICAgICAgICAgICAgQWRkTnVtYmVyc0hhbmRsZXJQb3J0VHlwZSBwcm94eSA9IHNlcnZpY2UuZ2V0QWRkTnVtYmVyc0hhbmRsZXJQb3J0KCk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgQmluZGluZ1Byb3ZpZGVyIHAgPSAoQmluZGluZ1Byb3ZpZGVyKXByb3h5Ow0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIHAuZ2V0UmVxdWVzdENvbnRleHQoKS5wdXQoQmluZGluZ1Byb3ZpZGVyLkVORFBPSU5UX0FERFJFU1NfUFJPUEVSVFksIA0KLSAgICAgICAgICAgICAgICAgICAgYXhpc0VuZHBvaW50KTsNCi0NCi0gICAgICAgICAgICBMaXN0PEhhbmRsZXI+IGhhbmRsZXJzID0gcC5nZXRCaW5kaW5nKCkuZ2V0SGFuZGxlckNoYWluKCk7DQotICAgICAgICAgICAgaWYgKGhhbmRsZXJzID09IG51bGwpDQotICAgICAgICAgICAgICAgIGhhbmRsZXJzID0gbmV3IEFycmF5TGlzdDxIYW5kbGVyPigpOw0KLSAgICAgICAgICAgIGhhbmRsZXJzLmFkZChuZXcgQWRkTnVtYmVyc0NsaWVudExvZ2ljYWxIYW5kbGVyNCgpKTsNCi0gICAgICAgICAgICBoYW5kbGVycy5hZGQobmV3IEFkZE51bWJlcnNDbGllbnRMb2dpY2FsSGFuZGxlcjMoKSk7DQotICAgICAgICAgICAgaGFuZGxlcnMuYWRkKG5ldyBBZGROdW1iZXJzQ2xpZW50TG9naWNhbEhhbmRsZXIoKSk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgcC5nZXRCaW5kaW5nKCkuc2V0SGFuZGxlckNoYWluKGhhbmRsZXJzKTsNCi0NCi0gICAgICAgICAgICBpbnQgdG90YWwgPSBwcm94eS5hZGROdW1iZXJzSGFuZGxlcig5OSwxMCk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgZ290IGFuIGV4Y2VwdGlvbiwgYnV0IHdlIGRpZG4ndC4iKTsNCi0gICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUoIkV4Y2VwdGlvbiBzaG91bGQgYmUgU09BUEZhdWx0RXhjZXB0aW9uIiwgZSBpbnN0YW5jZW9mIFNPQVBGYXVsdEV4Y2VwdGlvbik7DQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJIGRvbid0IGxpa2UgdGhlIHZhbHVlIDk5IiwgKChTT0FQRmF1bHRFeGNlcHRpb24pZSkuZ2V0TWVzc2FnZSgpKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBTdHJpbmcgbG9nID0gcmVhZExvZ0ZpbGUoKTsNCi0gICAgICAgICAgICBTdHJpbmcgZXhwZWN0ZWRfY2FsbHMgPSAiQWRkTnVtYmVyc0NsaWVudExvZ2ljYWxIYW5kbGVyNCBIQU5ETEVfTUVTU0FHRV9PVVRCT1VORFxuIg0KLSAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzQ2xpZW50TG9naWNhbEhhbmRsZXIzIEhBTkRMRV9GQVVMVF9PVVRCT1VORFxuIg0KLSAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzQ2xpZW50TG9naWNhbEhhbmRsZXIgSEFORExFX01FU1NBR0VfT1VUQk9VTkRcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc0NsaWVudExvZ2ljYWxIYW5kbGVyMyBIQU5ETEVfRkFVTFRfSU5CT1VORFxuIg0KLSAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzQ2xpZW50TG9naWNhbEhhbmRsZXIzIFJFVFVSTklORyBGQUxTRSBJTkJPVU5EXG4iDQotICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNDbGllbnRMb2dpY2FsSGFuZGxlciBDTE9TRVxuIg0KLSAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzQ2xpZW50TG9naWNhbEhhbmRsZXIzIENMT1NFXG4iDQotICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNDbGllbnRMb2dpY2FsSGFuZGxlcjQgQ0xPU0VcbiI7DQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkX2NhbGxzLCBsb2cpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgfQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogdGVzdCByZXN1bHRzIHNob3VsZCBiZSB0aGUgc2FtZSBhcyB0ZXN0QWRkTnVtYmVyc0NsaWVudEhhbmRsZXIsIGV4Y2VwdCB0aGF0DQotICAgICAqIEFkZE51bWJlcnNDbGllbnRMb2dpY2FsSGFuZGxlcjIgZG91YmxlcyB0aGUgZmlyc3QgcGFyYW0gb24gb3V0Ym91bmQuICBBc3luYywgb2YgY291cnNlLg0KLSAgICAgKg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdEFkZE51bWJlcnNDbGllbnRIYW5kbGVyQXN5bmMoKSB7DQotICAgICAgICB0cnl7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygidGVzdDogIiArIGdldE5hbWUoKSk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgQWRkTnVtYmVyc0hhbmRsZXJTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgQWRkTnVtYmVyc0hhbmRsZXJTZXJ2aWNlKCk7DQotICAgICAgICAgICAgQWRkTnVtYmVyc0hhbmRsZXJQb3J0VHlwZSBwcm94eSA9IHNlcnZpY2UuZ2V0QWRkTnVtYmVyc0hhbmRsZXJQb3J0KCk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgQmluZGluZ1Byb3ZpZGVyIHAgPSAoQmluZGluZ1Byb3ZpZGVyKXByb3h5Ow0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIHAuZ2V0UmVxdWVzdENvbnRleHQoKS5wdXQoQmluZGluZ1Byb3ZpZGVyLkVORFBPSU5UX0FERFJFU1NfUFJPUEVSVFksIA0KLSAgICAgICAgICAgICAgICAgICAgYXhpc0VuZHBvaW50KTsNCi0NCi0gICAgICAgICAgICBMaXN0PEhhbmRsZXI+IGhhbmRsZXJzID0gcC5nZXRCaW5kaW5nKCkuZ2V0SGFuZGxlckNoYWluKCk7DQotICAgICAgICAgICAgaWYgKGhhbmRsZXJzID09IG51bGwpDQotICAgICAgICAgICAgICAgIGhhbmRsZXJzID0gbmV3IEFycmF5TGlzdDxIYW5kbGVyPigpOw0KLSAgICAgICAgICAgIGhhbmRsZXJzLmFkZChuZXcgQWRkTnVtYmVyc0NsaWVudExvZ2ljYWxIYW5kbGVyKCkpOw0KLSAgICAgICAgICAgIGhhbmRsZXJzLmFkZChuZXcgQWRkTnVtYmVyc0NsaWVudExvZ2ljYWxIYW5kbGVyMigpKTsNCi0gICAgICAgICAgICBoYW5kbGVycy5hZGQobmV3IEFkZE51bWJlcnNDbGllbnRQcm90b2NvbEhhbmRsZXIoKSk7DQotICAgICAgICAgICAgcC5nZXRCaW5kaW5nKCkuc2V0SGFuZGxlckNoYWluKGhhbmRsZXJzKTsNCi0NCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBBZGROdW1iZXJzSGFuZGxlckFzeW5jQ2FsbGJhY2sgY2FsbGJhY2sgPSBuZXcgQWRkTnVtYmVyc0hhbmRsZXJBc3luY0NhbGxiYWNrKCk7DQotICAgICAgICAgICAgRnV0dXJlPD8+IGZ1dHVyZSA9IHByb3h5LmFkZE51bWJlcnNIYW5kbGVyQXN5bmMoMTAsIDEwLCBjYWxsYmFjayk7DQotDQotICAgICAgICAgICAgd2hpbGUgKCFmdXR1cmUuaXNEb25lKCkpIHsNCi0gICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDApOw0KLSAgICAgICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiQXN5bmMgaW52b2NhdGlvbiBpbmNvbXBsZXRlIik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIGludCB0b3RhbCA9IGNhbGxiYWNrLmdldFJlc3BvbnNlVmFsdWUoKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIldpdGggaGFuZGxlciBtYW5pcHVsYXRpb24sIHRvdGFsIHNob3VsZCBiZSAyNi4iLCAyNiwgdG90YWwpOw0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJUb3RhbCAoYWZ0ZXIgaGFuZGxlciBtYW5pcHVsYXRpb24pID0gIiArIHRvdGFsKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBTdHJpbmcgbG9nID0gcmVhZExvZ0ZpbGUoKTsNCi0gICAgICAgICAgICBTdHJpbmcgZXhwZWN0ZWRfY2FsbHMgPSAiQWRkTnVtYmVyc0NsaWVudExvZ2ljYWxIYW5kbGVyIEhBTkRMRV9NRVNTQUdFX09VVEJPVU5EXG4iDQotICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNDbGllbnRMb2dpY2FsSGFuZGxlcjIgSEFORExFX01FU1NBR0VfT1VUQk9VTkRcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc0NsaWVudFByb3RvY29sSGFuZGxlciBIQU5ETEVfTUVTU0FHRV9PVVRCT1VORFxuIg0KLSAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzTG9naWNhbEhhbmRsZXIyIFBPU1RfQ09OU1RSVUNUXG4iDQotICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNQcm90b2NvbEhhbmRsZXIyIEdFVF9IRUFERVJTXG4iDQotICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNQcm90b2NvbEhhbmRsZXIgR0VUX0hFQURFUlNcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc1Byb3RvY29sSGFuZGxlciBIQU5ETEVfTUVTU0FHRV9JTkJPVU5EXG4iDQotICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNQcm90b2NvbEhhbmRsZXIyIEhBTkRMRV9NRVNTQUdFX0lOQk9VTkRcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc0xvZ2ljYWxIYW5kbGVyMiBIQU5ETEVfTUVTU0FHRV9JTkJPVU5EXG4iDQotICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNMb2dpY2FsSGFuZGxlciBIQU5ETEVfTUVTU0FHRV9JTkJPVU5EXG4iDQotICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNMb2dpY2FsSGFuZGxlciBIQU5ETEVfTUVTU0FHRV9PVVRCT1VORFxuIg0KLSAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzTG9naWNhbEhhbmRsZXIyIEhBTkRMRV9NRVNTQUdFX09VVEJPVU5EXG4iDQotICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNQcm90b2NvbEhhbmRsZXIyIEhBTkRMRV9NRVNTQUdFX09VVEJPVU5EXG4iDQotICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNQcm90b2NvbEhhbmRsZXIgSEFORExFX01FU1NBR0VfT1VUQk9VTkRcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc0xvZ2ljYWxIYW5kbGVyIENMT1NFXG4iDQotICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNMb2dpY2FsSGFuZGxlcjIgQ0xPU0VcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc1Byb3RvY29sSGFuZGxlcjIgQ0xPU0VcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc1Byb3RvY29sSGFuZGxlciBDTE9TRVxuIg0KLSAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzUHJvdG9jb2xIYW5kbGVyIFBSRV9ERVNUUk9ZXG4iDQotICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNDbGllbnRQcm90b2NvbEhhbmRsZXIgR0VUX0hFQURFUlNcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc0NsaWVudFByb3RvY29sSGFuZGxlciBIQU5ETEVfTUVTU0FHRV9JTkJPVU5EXG4iDQotICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNDbGllbnRMb2dpY2FsSGFuZGxlcjIgSEFORExFX01FU1NBR0VfSU5CT1VORFxuIg0KLSAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzQ2xpZW50TG9naWNhbEhhbmRsZXIgSEFORExFX01FU1NBR0VfSU5CT1VORFxuIg0KLSAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzQ2xpZW50UHJvdG9jb2xIYW5kbGVyIENMT1NFXG4iDQotICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNDbGllbnRMb2dpY2FsSGFuZGxlcjIgQ0xPU0VcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc0NsaWVudExvZ2ljYWxIYW5kbGVyIENMT1NFXG4iOw0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZF9jYWxscywgbG9nKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAgICAgZmFpbChlLnRvU3RyaW5nKCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkTnVtYmVyc0hhbmRsZXJIYW5kbGVyUmVzb2x2ZXIoKSB7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigidGVzdDogIiArIGdldE5hbWUoKSk7DQotICAgICAgICAgICAgQWRkTnVtYmVyc0hhbmRsZXJTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgQWRkTnVtYmVyc0hhbmRsZXJTZXJ2aWNlKCk7IC8vIHdpbGwgZ2l2ZSBOUEU6DQotICAgICAgICAgICAgTGlzdDxIYW5kbGVyPiBoYW5kbGVycyA9IHNlcnZpY2UuZ2V0SGFuZGxlclJlc29sdmVyKCkNCi0gICAgICAgICAgICAgICAgICAgIC5nZXRIYW5kbGVyQ2hhaW4obnVsbCk7DQotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCgNCi0gICAgICAgICAgICAgICAgICAgICJEZWZhdWx0IGhhbmRsZXJzIGxpc3Qgc2hvdWxkIG5vdCBiZSBudWxsIGJ1dCBlbXB0eS4iLA0KLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlcnMpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIFN0cmluZyBsb2cgPSByZWFkTG9nRmlsZSgpOw0KLSAgICAgICAgICAgIGFzc2VydE51bGwoImxvZyBzaG91bGQgYmUgbnVsbCBzaW5jZSB3ZSBkaWQgbm90IGNhbGwgYW55IHNlcnZpY2VzIiwgbG9nKTsNCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgIH0gDQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0T25lV2F5KCkgew0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJ0ZXN0OiAiICsgZ2V0TmFtZSgpKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBBZGROdW1iZXJzSGFuZGxlclNlcnZpY2Ugc2VydmljZSA9IG5ldyBBZGROdW1iZXJzSGFuZGxlclNlcnZpY2UoKTsNCi0gICAgICAgICAgICBBZGROdW1iZXJzSGFuZGxlclBvcnRUeXBlIHByb3h5ID0gc2VydmljZS5nZXRBZGROdW1iZXJzSGFuZGxlclBvcnQoKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBCaW5kaW5nUHJvdmlkZXIgYnAgPSAoQmluZGluZ1Byb3ZpZGVyKSBwcm94eTsNCi0gICAgICAgICAgICBicC5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dChCaW5kaW5nUHJvdmlkZXIuRU5EUE9JTlRfQUREUkVTU19QUk9QRVJUWSwgDQotICAgICAgICAgICAgICAgICAgICBheGlzRW5kcG9pbnQpOw0KLSAgICAgICAgICAgIHByb3h5Lm9uZVdheUludCgxMSk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gb25lLXdheSBpbnZvY2F0aW9ucyBydW4gaW4gdGhlaXIgb3duIHRocmVhZCwNCi0gICAgICAgICAgICAvLyBhbmQgd2UgY2FuJ3QgdGVsbCBoZXJlIGluIHRoZSBjbGllbnQgd2hlbiBpdA0KLSAgICAgICAgICAgIC8vIGhhcyBjb21wbGV0ZWQuICBTbywgd2UgbmVlZCB0byB3YWl0IGxvbmcgZW5vdWdoDQotICAgICAgICAgICAgLy8gZm9yIHRoZSBpbnZvY2F0aW9uIHRvIGNvbXBsZXRlLCBzbyBvdXIgbG9nIGZpbGUNCi0gICAgICAgICAgICAvLyBpcyBmdWxseSBwb3B1bGF0ZWQuDQotICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDAgKiA1KTsgLy8gNSBzZWNvbmRzDQotICAgICAgICAgICAgDQotICAgICAgICAgICAgU3RyaW5nIGxvZyA9IHJlYWRMb2dGaWxlKCk7DQotICAgICAgICAgICAgU3RyaW5nIGV4cGVjdGVkX2NhbGxzID0gIkFkZE51bWJlcnNMb2dpY2FsSGFuZGxlcjIgUE9TVF9DT05TVFJVQ1RcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc1Byb3RvY29sSGFuZGxlcjIgR0VUX0hFQURFUlNcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc1Byb3RvY29sSGFuZGxlciBHRVRfSEVBREVSU1xuIg0KLSAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzUHJvdG9jb2xIYW5kbGVyIEhBTkRMRV9NRVNTQUdFX0lOQk9VTkRcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc1Byb3RvY29sSGFuZGxlcjIgSEFORExFX01FU1NBR0VfSU5CT1VORFxuIg0KLSAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzTG9naWNhbEhhbmRsZXIyIEhBTkRMRV9NRVNTQUdFX0lOQk9VTkRcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc0xvZ2ljYWxIYW5kbGVyIEhBTkRMRV9NRVNTQUdFX0lOQk9VTkRcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc0xvZ2ljYWxIYW5kbGVyIENMT1NFXG4iDQotICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNMb2dpY2FsSGFuZGxlcjIgQ0xPU0VcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc1Byb3RvY29sSGFuZGxlcjIgQ0xPU0VcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc1Byb3RvY29sSGFuZGxlciBDTE9TRVxuIjsNCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRfY2FsbHMsIGxvZyk7DQotDQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7DQotICAgICAgICB9DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0T25lV2F5V2l0aFByb3RvY29sRXhjZXB0aW9uKCkgew0KLSAgICAgICAgRXhjZXB0aW9uIGV4Y2VwdGlvbiA9IG51bGw7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoInRlc3Q6ICIgKyBnZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgICAgIEFkZE51bWJlcnNIYW5kbGVyU2VydmljZSBzZXJ2aWNlID0gbmV3IEFkZE51bWJlcnNIYW5kbGVyU2VydmljZSgpOw0KLSAgICAgICAgICAgIEFkZE51bWJlcnNIYW5kbGVyUG9ydFR5cGUgcHJveHkgPSBzZXJ2aWNlLmdldEFkZE51bWJlcnNIYW5kbGVyUG9ydCgpOw0KLQ0KLSAgICAgICAgICAgIEJpbmRpbmdQcm92aWRlciBwID0gKEJpbmRpbmdQcm92aWRlcikgcHJveHk7DQotDQotICAgICAgICAgICAgcC5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dChCaW5kaW5nUHJvdmlkZXIuRU5EUE9JTlRfQUREUkVTU19QUk9QRVJUWSwgYXhpc0VuZHBvaW50KTsNCi0gICAgICAgICAgICBwLmdldFJlcXVlc3RDb250ZXh0KCkucHV0KCJteUNsaWVudEtleSIsICJteUNsaWVudFZhbCIpOw0KLQ0KLSAgICAgICAgICAgIExpc3Q8SGFuZGxlcj4gaGFuZGxlcnMgPSBwLmdldEJpbmRpbmcoKS5nZXRIYW5kbGVyQ2hhaW4oKTsNCi0gICAgICAgICAgICBpZiAoaGFuZGxlcnMgPT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgaGFuZGxlcnMgPSBuZXcgQXJyYXlMaXN0PEhhbmRsZXI+KCk7DQotICAgICAgICAgICAgaGFuZGxlcnMuYWRkKG5ldyBBZGROdW1iZXJzQ2xpZW50TG9naWNhbEhhbmRsZXIoKSk7DQotICAgICAgICAgICAgaGFuZGxlcnMuYWRkKG5ldyBBZGROdW1iZXJzQ2xpZW50UHJvdG9jb2xIYW5kbGVyKCkpOw0KLSAgICAgICAgICAgIHAuZ2V0QmluZGluZygpLnNldEhhbmRsZXJDaGFpbihoYW5kbGVycyk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgQmluZGluZ1Byb3ZpZGVyIGJwID0gKEJpbmRpbmdQcm92aWRlcikgcHJveHk7DQotICAgICAgICAgICAgYnAuZ2V0UmVxdWVzdENvbnRleHQoKS5wdXQoQmluZGluZ1Byb3ZpZGVyLkVORFBPSU5UX0FERFJFU1NfUFJPUEVSVFksIGF4aXNFbmRwb2ludCk7DQotICAgICAgICAgICAgLy8gdmFsdWUgOTkgd2lsbCB0cmlnZ2VyIGV4Y2VwdGlvbiBmcm9tIEFkZE51bWJlcnNDbGllbnRMb2dpY2FsSGFuZGxlcg0KLSAgICAgICAgICAgIHByb3h5Lm9uZVdheUludCg5OSk7DQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeyAgICAgICAgICAgIA0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAgICAgZXhjZXB0aW9uID0gZTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgLy8gZXhjZXB0aW9ucyBvbiBvbmUtd2F5IGludm9jYXRpb25zIGFyZSBzdXBwcmVzc2VkIGJ5IGRlZmF1bHQNCi0gICAgICAgIGFzc2VydE51bGwoZXhjZXB0aW9uKTsNCi0gICAgICAgICAgICANCi0gICAgICAgIC8vIG9uZS13YXkgaW52b2NhdGlvbnMgcnVuIGluIHRoZWlyIG93biB0aHJlYWQsDQotICAgICAgICAvLyBhbmQgd2UgY2FuJ3QgdGVsbCBoZXJlIGluIHRoZSBjbGllbnQgd2hlbiBpdA0KLSAgICAgICAgLy8gaGFzIGNvbXBsZXRlZC4gIFNvLCB3ZSBuZWVkIHRvIHdhaXQgbG9uZyBlbm91Z2gNCi0gICAgICAgIC8vIGZvciB0aGUgaW52b2NhdGlvbiB0byBjb21wbGV0ZSwgc28gb3VyIGxvZyBmaWxlDQotICAgICAgICAvLyBpcyBmdWxseSBwb3B1bGF0ZWQuDQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwICogNSk7IC8vIDUgc2Vjb25kcw0KLSAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsNCi0gICAgICAgICAgICAvLyBub3RoaW5nDQotICAgICAgICB9DQotICAgICAgICAgICAgDQotICAgICAgICBTdHJpbmcgbG9nID0gcmVhZExvZ0ZpbGUoKTsNCi0gICAgICAgIFN0cmluZyBleHBlY3RlZF9jYWxscyA9ICJBZGROdW1iZXJzQ2xpZW50TG9naWNhbEhhbmRsZXIgSEFORExFX01FU1NBR0VfT1VUQk9VTkRcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc0NsaWVudExvZ2ljYWxIYW5kbGVyIENMT1NFXG4iOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkX2NhbGxzLCBsb2cpOw0KLSAgICAgICAgICAgICAgICAgICAgDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0T25lV2F5V2l0aFJ1bnRpbWVFeGNlcHRpb24oKSB7DQotICAgICAgICBFeGNlcHRpb24gZXhjZXB0aW9uID0gbnVsbDsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygidGVzdDogIiArIGdldE5hbWUoKSk7DQotDQotICAgICAgICAgICAgQWRkTnVtYmVyc0hhbmRsZXJTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgQWRkTnVtYmVyc0hhbmRsZXJTZXJ2aWNlKCk7DQotICAgICAgICAgICAgQWRkTnVtYmVyc0hhbmRsZXJQb3J0VHlwZSBwcm94eSA9IHNlcnZpY2UuZ2V0QWRkTnVtYmVyc0hhbmRsZXJQb3J0KCk7DQotDQotICAgICAgICAgICAgQmluZGluZ1Byb3ZpZGVyIHAgPSAoQmluZGluZ1Byb3ZpZGVyKSBwcm94eTsNCi0NCi0gICAgICAgICAgICBwLmdldFJlcXVlc3RDb250ZXh0KCkucHV0KEJpbmRpbmdQcm92aWRlci5FTkRQT0lOVF9BRERSRVNTX1BST1BFUlRZLCBheGlzRW5kcG9pbnQpOw0KLSAgICAgICAgICAgIHAuZ2V0UmVxdWVzdENvbnRleHQoKS5wdXQoIm15Q2xpZW50S2V5IiwgIm15Q2xpZW50VmFsIik7DQotDQotICAgICAgICAgICAgTGlzdDxIYW5kbGVyPiBoYW5kbGVycyA9IHAuZ2V0QmluZGluZygpLmdldEhhbmRsZXJDaGFpbigpOw0KLSAgICAgICAgICAgIGlmIChoYW5kbGVycyA9PSBudWxsKQ0KLSAgICAgICAgICAgICAgICBoYW5kbGVycyA9IG5ldyBBcnJheUxpc3Q8SGFuZGxlcj4oKTsNCi0gICAgICAgICAgICBoYW5kbGVycy5hZGQobmV3IEFkZE51bWJlcnNDbGllbnRMb2dpY2FsSGFuZGxlcigpKTsNCi0gICAgICAgICAgICBoYW5kbGVycy5hZGQobmV3IEFkZE51bWJlcnNDbGllbnRQcm90b2NvbEhhbmRsZXIoKSk7DQotICAgICAgICAgICAgcC5nZXRCaW5kaW5nKCkuc2V0SGFuZGxlckNoYWluKGhhbmRsZXJzKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBCaW5kaW5nUHJvdmlkZXIgYnAgPSAoQmluZGluZ1Byb3ZpZGVyKSBwcm94eTsNCi0gICAgICAgICAgICBicC5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dChCaW5kaW5nUHJvdmlkZXIuRU5EUE9JTlRfQUREUkVTU19QUk9QRVJUWSwgYXhpc0VuZHBvaW50KTsNCi0gICAgICAgICAgICAvLyB2YWx1ZSA5OSB3aWxsIHRyaWdnZXIgZXhjZXB0aW9uIGZyb20gQWRkTnVtYmVyc0NsaWVudExvZ2ljYWxIYW5kbGVyDQotICAgICAgICAgICAgcHJveHkub25lV2F5SW50KDk5OSk7DQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAgICAgZXhjZXB0aW9uID0gZTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgLy8gZXhjZXB0aW9ucyBvbiBvbmUtd2F5IGludm9jYXRpb25zIGFyZSBzdXBwcmVzc2VkIGJ5IGRlZmF1bHQNCi0gICAgICAgIGFzc2VydE51bGwoZXhjZXB0aW9uKTsgICAgICAgICAgICANCi0gICAgICAgICAgICANCi0gICAgICAgIC8vIG9uZS13YXkgaW52b2NhdGlvbnMgcnVuIGluIHRoZWlyIG93biB0aHJlYWQsDQotICAgICAgICAvLyBhbmQgd2UgY2FuJ3QgdGVsbCBoZXJlIGluIHRoZSBjbGllbnQgd2hlbiBpdA0KLSAgICAgICAgLy8gaGFzIGNvbXBsZXRlZC4gIFNvLCB3ZSBuZWVkIHRvIHdhaXQgbG9uZyBlbm91Z2gNCi0gICAgICAgIC8vIGZvciB0aGUgaW52b2NhdGlvbiB0byBjb21wbGV0ZSwgc28gb3VyIGxvZyBmaWxlDQotICAgICAgICAvLyBpcyBmdWxseSBwb3B1bGF0ZWQuDQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwICogNSk7IC8vIDUgc2Vjb25kcw0KLSAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsNCi0gICAgICAgICAgICAvLyBub3RoaW5nDQotICAgICAgICB9DQotICAgICAgICAgICAgDQotICAgICAgICBTdHJpbmcgbG9nID0gcmVhZExvZ0ZpbGUoKTsNCi0gICAgICAgIFN0cmluZyBleHBlY3RlZF9jYWxscyA9ICJBZGROdW1iZXJzQ2xpZW50TG9naWNhbEhhbmRsZXIgSEFORExFX01FU1NBR0VfT1VUQk9VTkRcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc0NsaWVudExvZ2ljYWxIYW5kbGVyIENMT1NFXG4iOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkX2NhbGxzLCBsb2cpOw0KLSAgICAgICAgDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICB9DQotDQotDQotICAgIC8qDQotICAgICAqIEEgY2FsbGJhY2sgaW1wbGVtZW50YXRpb24gdGhhdCBjYW4gYmUgdXNlZCB0byBjb2xsZWN0IHRoZSBleGNlcHRpb25zDQotICAgICAqLw0KLSAgICBjbGFzcyBBZGROdW1iZXJzSGFuZGxlckFzeW5jQ2FsbGJhY2sgaW1wbGVtZW50cyBBc3luY0hhbmRsZXI8QWRkTnVtYmVyc0hhbmRsZXJSZXNwb25zZT4gew0KLSAgICAgDQotICAgICAgICBwcml2YXRlIEV4Y2VwdGlvbiBleGNlcHRpb247DQotICAgICAgICBwcml2YXRlIGludCByZXRWYWw7DQotICAgICAgICANCi0gICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZVJlc3BvbnNlKFJlc3BvbnNlPEFkZE51bWJlcnNIYW5kbGVyUmVzcG9uc2U+IHJlc3BvbnNlKSB7DQotICAgICAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIkZhdWx0eUFzeW5jSGFuZGxlci5oYW5kbGVSZXNwb25zZSgpIHdhcyBjYWxsZWQiKTsNCi0gICAgICAgICAgICAgICAgQWRkTnVtYmVyc0hhbmRsZXJSZXNwb25zZSByID0gcmVzcG9uc2UuZ2V0KCk7DQotICAgICAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJObyBleGNlcHRpb24gd2FzIHRocm93biBmcm9tIFJlc3BvbnNlLmdldCgpIik7DQotICAgICAgICAgICAgICAgIHJldFZhbCA9IHIuZ2V0UmV0dXJuKCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiQW4gZXhjZXB0aW9uIHdhcyB0aHJvd246ICIgKyBlLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICBleGNlcHRpb24gPSBlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgcHVibGljIGludCBnZXRSZXNwb25zZVZhbHVlKCkgew0KLSAgICAgICAgICAgIHJldHVybiByZXRWYWw7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIHB1YmxpYyBFeGNlcHRpb24gZ2V0RXhjZXB0aW9uKCkgew0KLSAgICAgICAgICAgIHJldHVybiBleGNlcHRpb247DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIGNsYXNzIE15SGFuZGxlclJlc29sdmVyIGltcGxlbWVudHMgSGFuZGxlclJlc29sdmVyIHsNCi0NCi0gICAgICAgIHB1YmxpYyBMaXN0PEhhbmRsZXI+IGdldEhhbmRsZXJDaGFpbihQb3J0SW5mbyBwb3J0aW5mbykgew0KLSAgICAgICAgICAgIEFycmF5TGlzdDxIYW5kbGVyPiBoYW5kbGVycyA9IG5ldyBBcnJheUxpc3Q8SGFuZGxlcj4oKTsNCi0gICAgICAgICAgICBoYW5kbGVycy5hZGQobmV3IEFkZE51bWJlcnNDbGllbnRMb2dpY2FsSGFuZGxlcigpKTsNCi0gICAgICAgICAgICBoYW5kbGVycy5hZGQobmV3IEFkZE51bWJlcnNDbGllbnRQcm90b2NvbEhhbmRsZXIoKSk7DQotICAgICAgICAgICAgcmV0dXJuIGhhbmRsZXJzOw0KLSAgICAgICAgfQ0KLQ0KLSAgICB9DQotICAgIA0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRTdHJpbmcoU291cmNlIHNvdXJjZSkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBpZiAoc291cmNlID09IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgICAgIFN0cmluZ1dyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7DQotICAgICAgICBUcmFuc2Zvcm1lciB0ID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3VHJhbnNmb3JtZXIoKTsNCi0gICAgICAgIFJlc3VsdCByZXN1bHQgPSBuZXcgU3RyZWFtUmVzdWx0KHdyaXRlcik7DQotICAgICAgICB0LnRyYW5zZm9ybShzb3VyY2UsIHJlc3VsdCk7DQotICAgICAgICByZXR1cm4gd3JpdGVyLmdldEJ1ZmZlcigpLnRvU3RyaW5nKCk7DQotDQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBDcmVhdGUgYSBTb3VyY2UgcmVxdWVzdCB0byBiZSB1c2VkIGJ5IERpc3BhdGNoPFNvdXJjZT4NCi0gICAgICovDQotICAgIHByaXZhdGUgU291cmNlIGNyZWF0ZVJlcXVlc3RTb3VyY2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLSAgICAgICAgRmlsZUlucHV0U3RyZWFtIGZpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0ocmVxdWVzdEZpbGUpOw0KLSAgICAgICAgcmV0dXJuIG5ldyBTdHJlYW1Tb3VyY2UoZmlzKTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7DQotICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShmaWxlbG9nbmFtZSk7DQotICAgICAgICBmaWxlLmRlbGV0ZSgpOyAgLy8geWVzLCBkZWxldGUgZm9yIGVhY2ggcmV0cmlldmFsLCB3aGljaCBzaG91bGQgb25seSBoYXBwZW4gb25jZSBwZXIgdGVzdA0KLSAgICB9DQotICAgIA0KLSAgICBwcml2YXRlIFN0cmluZyByZWFkTG9nRmlsZSgpIHsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgRmlsZVJlYWRlciBmciA9IG5ldyBGaWxlUmVhZGVyKGZpbGVsb2duYW1lKTsNCi0gICAgICAgICAgICBCdWZmZXJlZFJlYWRlciBpbnB1dFN0cmVhbSA9IG5ldyBCdWZmZXJlZFJlYWRlcihmcik7DQotICAgICAgICAgICAgU3RyaW5nIGxpbmUgPSBudWxsOw0KLSAgICAgICAgICAgIFN0cmluZyByZXQgPSBudWxsOw0KLSAgICAgICAgICAgIHdoaWxlICgobGluZSA9IGlucHV0U3RyZWFtLnJlYWRMaW5lKCkpICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgaWYgKHJldCA9PSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICByZXQgPSAiIjsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICByZXQgPSByZXQuY29uY2F0KGxpbmUgKyAiXG4iKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZnIuY2xvc2UoKTsNCi0gICAgICAgICAgICByZXR1cm4gcmV0Ow0KLSAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGZuZmUpIHsNCi0gICAgICAgICAgICAvLyBpdCdzIHBvc3NpYmxlIHRoZSB0ZXN0IGRvZXMgbm90IGFjdHVhbGx5IGNhbGwgYW55IGhhbmRsZXJzIGFuZCB0aGVyZWZvcmUNCi0gICAgICAgICAgICAvLyBubyBmaWxlIHdvdWxkIGhhdmUgYmVlbiB3cml0dGVuLiAgVGhlIHRlc3Qgc2hvdWxkIGFjY291bnQgZm9yIHRoaXMgYnkNCi0gICAgICAgICAgICAvLyBhc3NlcnROdWxsIG9uIHRoZSByZXR1cm4gdmFsdWUgZnJvbSBoZXJlDQotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsNCi0gICAgICAgICAgICBpb2UucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAgICAgZmFpbChpb2UuZ2V0TWVzc2FnZSgpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvQWRkTnVtYmVyc1Rlc3RzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL0FkZE51bWJlcnNUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTMxZTI0Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvQWRkTnVtYmVyc1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZTsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuVGVzdExvZ2dlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5mcmFtZXdvcmsuQWJzdHJhY3RUZXN0Q2FzZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuYWRkbnVtYmVycy5BZGROdW1iZXJzUG9ydFR5cGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLmFkZG51bWJlcnMuQWRkTnVtYmVyc1NlcnZpY2U7DQotDQotaW1wb3J0IGphdmF4LnhtbC53cy5CaW5kaW5nUHJvdmlkZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLk1lc3NhZ2VDb250ZXh0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLXB1YmxpYyBjbGFzcyBBZGROdW1iZXJzVGVzdHMgZXh0ZW5kcyBBYnN0cmFjdFRlc3RDYXNlIHsNCi0JDQotICAgIFN0cmluZyBheGlzRW5kcG9pbnQgPSAiaHR0cDovL2xvY2FsaG9zdDo2MDYwL2F4aXMyL3NlcnZpY2VzL0FkZE51bWJlcnNTZXJ2aWNlLkFkZE51bWJlcnNQb3J0VHlwZUltcGxQb3J0IjsNCi0NCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgew0KLSAgICAgICAgcmV0dXJuIGdldFRlc3RTZXR1cChuZXcgVGVzdFN1aXRlKEFkZHJlc3NCb29rVGVzdHMuY2xhc3MpKTsNCi0gICAgfQ0KLSAgICAJICAgIA0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkTnVtYmVycygpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJ0ZXN0OiAiICsgZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIEFkZE51bWJlcnNTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgQWRkTnVtYmVyc1NlcnZpY2UoKTsNCi0gICAgICAgIEFkZE51bWJlcnNQb3J0VHlwZSBwcm94eSA9IHNlcnZpY2UuZ2V0QWRkTnVtYmVyc1BvcnQoKTsNCi0NCi0gICAgICAgIEJpbmRpbmdQcm92aWRlciBwID0gKEJpbmRpbmdQcm92aWRlcikgcHJveHk7DQotICAgICAgICBwLmdldFJlcXVlc3RDb250ZXh0KCkucHV0KEJpbmRpbmdQcm92aWRlci5FTkRQT0lOVF9BRERSRVNTX1BST1BFUlRZLCBheGlzRW5kcG9pbnQpOw0KLSAgICAgICAgaW50IHRvdGFsID0gcHJveHkuYWRkTnVtYmVycygxMCwgMTApOw0KLQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIlRvdGFsID0iICsgdG90YWwpOw0KLSAgICAgICAgDQotDQotICAgICAgICBhc3NlcnRFcXVhbHMoInN1bSIsIDIwLCB0b3RhbCk7DQotICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHAgcmVzcG9uc2UgY29kZSIsIA0KLSAgICAgICAgICAgICAgICAgICAgIG5ldyBJbnRlZ2VyKDIwMCksIHAuZ2V0UmVzcG9uc2VDb250ZXh0KCkuZ2V0KE1lc3NhZ2VDb250ZXh0LkhUVFBfUkVTUE9OU0VfQ09ERSkpOw0KLSAgICAgICAgTWFwIGhlYWRlcnMgPSAoTWFwKSBwLmdldFJlc3BvbnNlQ29udGV4dCgpLmdldChNZXNzYWdlQ29udGV4dC5IVFRQX1JFU1BPTlNFX0hFQURFUlMpOw0KLSAgICAgICAgLy8gdGhlIG1hcCBzaG91bGQgY29udGFpbiBzb21lIGhlYWRlcnMNCi0gICAgICAgIGFzc2VydFRydWUoImh0dHAgcmVzcG9uc2UgaGVhZGVycyIsIGhlYWRlcnMgIT0gbnVsbCAmJiAhaGVhZGVycy5pc0VtcHR5KCkpOw0KLSAgICAgICAgDQotICAgICAgICANCi0gICAgICAgIC8vIFRyeSB0aGUgdGVzdCBhZ2Fpbg0KLSAgICAgICAgdG90YWwgPSBwcm94eS5hZGROdW1iZXJzKDEwLCAxMCk7DQotDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiVG90YWwgPSIgKyB0b3RhbCk7DQotICAgICAgICANCi0NCi0gICAgICAgIGFzc2VydEVxdWFscygic3VtIiwgMjAsIHRvdGFsKTsNCi0gICAgICAgIGFzc2VydEVxdWFscygiaHR0cCByZXNwb25zZSBjb2RlIiwgDQotICAgICAgICAgICAgICAgICAgICAgbmV3IEludGVnZXIoMjAwKSwgcC5nZXRSZXNwb25zZUNvbnRleHQoKS5nZXQoTWVzc2FnZUNvbnRleHQuSFRUUF9SRVNQT05TRV9DT0RFKSk7DQotICAgICAgICBoZWFkZXJzID0gKE1hcCkgcC5nZXRSZXNwb25zZUNvbnRleHQoKS5nZXQoTWVzc2FnZUNvbnRleHQuSFRUUF9SRVNQT05TRV9IRUFERVJTKTsNCi0gICAgICAgIC8vIHRoZSBtYXAgc2hvdWxkIGNvbnRhaW4gc29tZSBoZWFkZXJzDQotICAgICAgICBhc3NlcnRUcnVlKCJodHRwIHJlc3BvbnNlIGhlYWRlcnMiLCBoZWFkZXJzICE9IG51bGwgJiYgIWhlYWRlcnMuaXNFbXB0eSgpKTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIHZvaWQgdGVzdE9uZVdheSgpIHsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygidGVzdDogIiArIGdldE5hbWUoKSk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgQWRkTnVtYmVyc1NlcnZpY2Ugc2VydmljZSA9IG5ldyBBZGROdW1iZXJzU2VydmljZSgpOw0KLSAgICAgICAgICAgIEFkZE51bWJlcnNQb3J0VHlwZSBwcm94eSA9IHNlcnZpY2UuZ2V0QWRkTnVtYmVyc1BvcnQoKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBCaW5kaW5nUHJvdmlkZXIgYnAgPSAoQmluZGluZ1Byb3ZpZGVyKSBwcm94eTsNCi0gICAgICAgICAgICBicC5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dChCaW5kaW5nUHJvdmlkZXIuRU5EUE9JTlRfQUREUkVTU19QUk9QRVJUWSwgDQotICAgICAgICAgICAgICAgICAgICBheGlzRW5kcG9pbnQpOw0KLSAgICAgICAgICAgIHByb3h5Lm9uZVdheUludCgxMSk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gVHJ5IGl0IG9uZSBtb3JlIHRpbWUNCi0gICAgICAgICAgICBwcm94eS5vbmVXYXlJbnQoMTEpOw0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAgICAgZmFpbCgpOw0KLSAgICAgICAgfSAgICAgICANCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL0FkZHJlc3NCb29rVGVzdHMuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvQWRkcmVzc0Jvb2tUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjIwNTU2Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvQWRkcmVzc0Jvb2tUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5UZXN0TG9nZ2VyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmZyYW1ld29yay5BYnN0cmFjdFRlc3RDYXNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5hZGRyZXNzYm9vay5BZGRFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuYWRkcmVzc2Jvb2suQWRkRW50cnlSZXNwb25zZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuYWRkcmVzc2Jvb2suQWRkcmVzc0Jvb2s7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLmFkZHJlc3Nib29rLkFkZHJlc3NCb29rRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLmFkZHJlc3Nib29rLk9iamVjdEZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJDb250ZXh0Ow0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOw0KLWltcG9ydCBqYXZheC54bWwud3MuQmluZGluZ1Byb3ZpZGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuRGlzcGF0Y2g7DQotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZS5Nb2RlOw0KLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5TT0FQQmluZGluZzsNCi0NCi0vKioNCi0gKiBUaGlzIHRlc3RzIHRoZSBBZGRyZXNzQm9vayBzYW1lIHNlcnZpY2UgdGhhdCBleGlzdHMgdW5kZXINCi0gKiBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5hZGRyZXNzYm9vay4qDQotICovDQotcHVibGljIGNsYXNzIEFkZHJlc3NCb29rVGVzdHMgZXh0ZW5kcyBBYnN0cmFjdFRlc3RDYXNlIHsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVTUEFDRSA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkcmVzc2Jvb2siOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBRTmFtZSBRTkFNRV9TRVJWSUNFID0gbmV3IFFOYW1lKA0KLSAgICAgICAgICAgIE5BTUVTUEFDRSwgIkFkZHJlc3NCb29rU2VydmljZSIpOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBRTmFtZSBRTkFNRV9QT1JUID0gbmV3IFFOYW1lKA0KLSAgICAgICAgICAgIE5BTUVTUEFDRSwgIkFkZHJlc3NCb29rIik7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVUkxfRU5EUE9JTlQgPSAiaHR0cDovL2xvY2FsaG9zdDo2MDYwL2F4aXMyL3NlcnZpY2VzL0FkZHJlc3NCb29rU2VydmljZS5BZGRyZXNzQm9va0ltcGxQb3J0IjsNCi0NCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgew0KLSAgICAgICAgcmV0dXJuIGdldFRlc3RTZXR1cChuZXcgVGVzdFN1aXRlKEFkZHJlc3NCb29rVGVzdHMuY2xhc3MpKTsNCi0gICAgfQ0KLSAgIA0KLSAgICAvKioNCi0gICAgICogVGVzdCB0aGUgZW5kcG9pbnQgYnkgaW52b2tpbmcgaXQgd2l0aCBhIEpBWC1XUyBEaXNwYXRjaC4gIA0KLSAgICAgKi8NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRyZXNzQm9va1dpdGhEaXNwYXRjaCgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJ0ZXN0OiAiICsgZ2V0TmFtZSgpKTsNCi0gICAgICAgIA0KLSAgICAgICAgSkFYQkNvbnRleHQgamJjID0gSkFYQkNvbnRleHQubmV3SW5zdGFuY2UoIm9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLmFkZHJlc3Nib29rIik7DQotICAgICAgICANCi0gICAgICAgIC8vIENyZWF0ZSB0aGUgSkFYLVdTIGNsaWVudCBuZWVkZWQgdG8gc2VuZCB0aGUgcmVxdWVzdA0KLSAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gU2VydmljZS5jcmVhdGUoUU5BTUVfU0VSVklDRSk7DQotICAgICAgICBzZXJ2aWNlLmFkZFBvcnQoUU5BTUVfUE9SVCwgU09BUEJpbmRpbmcuU09BUDExSFRUUF9CSU5ESU5HLCBVUkxfRU5EUE9JTlQpOw0KLSAgICAgICAgRGlzcGF0Y2g8T2JqZWN0PiBkaXNwYXRjaCA9IHNlcnZpY2UuY3JlYXRlRGlzcGF0Y2goDQotICAgICAgICAgICAgICAgIFFOQU1FX1BPUlQsIGpiYywgTW9kZS5QQVlMT0FEKTsNCi0gICAgICAgICAgICAgICAgDQotICAgICAgICAvLyBDcmVhdGUgdGhlIEpBWC1CIG9iamVjdCB0aGF0IHdpbGwgaG9sZCB0aGUgZGF0YQ0KLSAgICAgICAgT2JqZWN0RmFjdG9yeSBmYWN0b3J5ID0gbmV3IE9iamVjdEZhY3RvcnkoKTsNCi0gICAgICAgIEFkZEVudHJ5IHJlcXVlc3QgPSBmYWN0b3J5LmNyZWF0ZUFkZEVudHJ5KCk7DQotICAgICAgICBBZGRyZXNzQm9va0VudHJ5IGNvbnRlbnQgPSBmYWN0b3J5LmNyZWF0ZUFkZHJlc3NCb29rRW50cnkoKTsNCi0gICAgICAgIA0KLSAgICAgICAgY29udGVudC5zZXRGaXJzdE5hbWUoIlJvbiIpOw0KLSAgICAgICAgY29udGVudC5zZXRMYXN0TmFtZSgiVGVzdGVyc29uIik7DQotICAgICAgICBjb250ZW50LnNldFBob25lKCI1MTItNDU5LTIyMjIiKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gU2luY2UgdGhpcyBpcyBhIGRvYy9saXQgd3JhcHBlZCBXU0RMLCB3ZSBuZWVkIHRvIHNldCB0aGUgDQotICAgICAgICAvLyBkYXRhIGluc2lkZSBvZiBhIHJlcXVlc3Qgd3JhcHBlciBlbGVtZW50Lg0KLSAgICAgICAgcmVxdWVzdC5zZXRFbnRyeShjb250ZW50KTsNCi0gICAgICAgIA0KLSAgICAgICAgQWRkRW50cnlSZXNwb25zZSByZXNwb25zZSA9IChBZGRFbnRyeVJlc3BvbnNlKSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7DQotDQotICAgICAgICAvLyBWYWxpZGF0ZSB0aGUgcmVzdWx0cw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXNwb25zZSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlLmlzU3RhdHVzKCkpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIltwYXNzXSAgICAgLSB2YWxpZCByZXNwb25zZSByZWNlaXZlZCIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIltyZXNwb25zZV0gLSAiICsgcmVzcG9uc2UuaXNTdGF0dXMoKSk7DQotDQotICAgICAgICANCi0gICAgICAgIC8vIFRyeSB0aGUgZGlzcGF0Y2ggYWdhaW4NCi0gICAgICAgIHJlc3BvbnNlID0gKEFkZEVudHJ5UmVzcG9uc2UpIGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0NCi0gICAgICAgIC8vIFZhbGlkYXRlIHRoZSByZXN1bHRzDQotICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3BvbnNlKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UuaXNTdGF0dXMoKSk7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiW3Bhc3NdICAgICAtIHZhbGlkIHJlc3BvbnNlIHJlY2VpdmVkIik7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiW3Jlc3BvbnNlXSAtICIgKyByZXNwb25zZS5pc1N0YXR1cygpKTsNCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgICAgICB0aHJvdyBlOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFRlc3QgdGhlICJhZGRFbnRyeSIgb3BlcmF0aW9uLiAgVGhpcyBzZW5kcyBhIGNvbXBsZXggdHlwZSBhbmQgcmV0dXJucw0KLSAgICAgKiBhIHNpbXBsZSB0eXBlLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdEFkZEVudHJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoInRlc3Q6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBDcmVhdGUgdGhlIEpBWC1XUyBjbGllbnQgbmVlZGVkIHRvIHNlbmQgdGhlIHJlcXVlc3QNCi0gICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IFNlcnZpY2UuY3JlYXRlKFFOQU1FX1NFUlZJQ0UpOw0KLSAgICAgICAgQWRkcmVzc0Jvb2sgYWIgPSBzZXJ2aWNlLmdldFBvcnQoUU5BTUVfUE9SVCwgQWRkcmVzc0Jvb2suY2xhc3MpOw0KLSAgICAgICAgQmluZGluZ1Byb3ZpZGVyIHAxID0gKEJpbmRpbmdQcm92aWRlcikgYWI7DQotICAgICAgICBwMS5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dChCaW5kaW5nUHJvdmlkZXIuRU5EUE9JTlRfQUREUkVTU19QUk9QRVJUWSwgVVJMX0VORFBPSU5UKTsNCi0gICAgICAgIA0KLSAgICAgICAgT2JqZWN0RmFjdG9yeSBmYWN0b3J5ID0gbmV3IE9iamVjdEZhY3RvcnkoKTsNCi0gICAgICAgIEFkZHJlc3NCb29rRW50cnkgY29udGVudCA9IGZhY3RvcnkuY3JlYXRlQWRkcmVzc0Jvb2tFbnRyeSgpOw0KLSAgICAgICAgY29udGVudC5zZXRGaXJzdE5hbWUoIkZvbyIpOw0KLSAgICAgICAgY29udGVudC5zZXRMYXN0TmFtZSgiQmFyIik7DQotICAgICAgICBjb250ZW50LnNldFBob25lKCI1MTItNDU5LTIyMjIiKTsNCi0gICAgICAgIA0KLSAgICAgICAgYm9vbGVhbiBhZGRlZCA9IGFiLmFkZEVudHJ5KGNvbnRlbnQpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBWYWxpZGF0ZSB0aGUgcmVzdWx0cw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChhZGRlZCk7DQotICAgICAgICBhc3NlcnRUcnVlKGFkZGVkKTsNCi0gICAgICAgIA0KLSAgICAgICAgDQotICAgICAgICAvLyBUcnkgdGhlIHRlc3QgYWdhaW4NCi0gICAgICAgIGFkZGVkID0gYWIuYWRkRW50cnkoY29udGVudCk7DQotICAgICAgICANCi0gICAgICAgIC8vIFZhbGlkYXRlIHRoZSByZXN1bHRzDQotICAgICAgICBhc3NlcnROb3ROdWxsKGFkZGVkKTsNCi0gICAgICAgIGFzc2VydFRydWUoYWRkZWQpOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogVGVzdCB0aGUgImZpbmRFbnRyeUJ5TmFtZSIgb3BlcmF0aW9uLiAgVGhpcyBzZW5kcyBhIHNpbXBsZSB0eXBlIGFuZCANCi0gICAgICogcmV0dXJucyBhIGNvbXBsZXggdHlwZS4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RGaW5kRW50cnlCeU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygidGVzdDogIiArIGdldE5hbWUoKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIENyZWF0ZSB0aGUgSkFYLVdTIGNsaWVudCBuZWVkZWQgdG8gc2VuZCB0aGUgcmVxdWVzdA0KLSAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gU2VydmljZS5jcmVhdGUoUU5BTUVfU0VSVklDRSk7DQotICAgICAgICBBZGRyZXNzQm9vayBhYiA9IHNlcnZpY2UuZ2V0UG9ydChRTkFNRV9QT1JULCBBZGRyZXNzQm9vay5jbGFzcyk7DQotICAgICAgICBCaW5kaW5nUHJvdmlkZXIgcDEgPSAoQmluZGluZ1Byb3ZpZGVyKSBhYjsNCi0gICAgICAgIHAxLmdldFJlcXVlc3RDb250ZXh0KCkucHV0KEJpbmRpbmdQcm92aWRlci5FTkRQT0lOVF9BRERSRVNTX1BST1BFUlRZLCBVUkxfRU5EUE9JTlQpOw0KLSAgICAgICAgDQotICAgICAgICBTdHJpbmcgZm5hbWUgPSAiSm9lIjsNCi0gICAgICAgIFN0cmluZyBsbmFtZSA9ICJUZXN0IjsNCi0gICAgICAgIEFkZHJlc3NCb29rRW50cnkgcmVzdWx0ID0gYWIuZmluZEVudHJ5QnlOYW1lKGZuYW1lLCBsbmFtZSk7DQotICAgICAgICANCi0gICAgICAgIC8vIFZhbGlkYXRlIHRoZSByZXN1bHRzDQotICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3VsdCk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3VsdC5nZXRGaXJzdE5hbWUoKSk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3VsdC5nZXRMYXN0TmFtZSgpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzdWx0LmdldEZpcnN0TmFtZSgpLmVxdWFscyhmbmFtZSkpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHQuZ2V0TGFzdE5hbWUoKS5lcXVhbHMobG5hbWUpKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gVHJ5IHRoZSBpbnZva2UgYWdhaW4gdG8gdmVyaWZ5DQotICAgICAgICByZXN1bHQgPSBhYi5maW5kRW50cnlCeU5hbWUoZm5hbWUsIGxuYW1lKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gVmFsaWRhdGUgdGhlIHJlc3VsdHMNCi0gICAgICAgIGFzc2VydE5vdE51bGwocmVzdWx0KTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwocmVzdWx0LmdldEZpcnN0TmFtZSgpKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwocmVzdWx0LmdldExhc3ROYW1lKCkpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHQuZ2V0Rmlyc3ROYW1lKCkuZXF1YWxzKGZuYW1lKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdC5nZXRMYXN0TmFtZSgpLmVxdWFscyhsbmFtZSkpOw0KLSAgICB9DQotICAgIA0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL0FzeW5jQ2FsbGJhY2suamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvQXN5bmNDYWxsYmFjay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDFjZjU5Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvQXN5bmNDYWxsYmFjay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLS8qKg0KLSAqIA0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGU7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuVGVzdExvZ2dlcjsNCi1pbXBvcnQgb3JnLnRlc3Quc2FtcGxlLm5vbndyYXAuUmV0dXJuVHlwZTsNCi1pbXBvcnQgb3JnLnRlc3Quc2FtcGxlLm5vbndyYXAuVHdvV2F5SG9sZGVyOw0KLQ0KLWltcG9ydCBqYXZheC54bWwud3MuQXN5bmNIYW5kbGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuUmVzcG9uc2U7DQotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dGlvbkV4Y2VwdGlvbjsNCi0NCi0NCi1wdWJsaWMgY2xhc3MgQXN5bmNDYWxsYmFjayBpbXBsZW1lbnRzIEFzeW5jSGFuZGxlciB7DQotDQotCS8qKg0KLQkgKiANCi0JICovDQotCXB1YmxpYyBBc3luY0NhbGxiYWNrKCkgew0KLQkJc3VwZXIoKTsNCi0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1Yg0KLQl9DQotDQotCS8qIChub24tSmF2YWRvYykNCi0JICogQHNlZSBqYXZheC54bWwud3MuQXN5bmNIYW5kbGVyI2hhbmRsZVJlc3BvbnNlKGphdmF4LnhtbC53cy5SZXNwb25zZSkNCi0JICovDQotCXB1YmxpYyB2b2lkIGhhbmRsZVJlc3BvbnNlKFJlc3BvbnNlIHJlc3BvbnNlKSB7DQotCQl0cnl7DQotCQkJT2JqZWN0IG9iaiA9IHJlc3BvbnNlLmdldCgpOw0KLQkJCWlmKG9iaiBpbnN0YW5jZW9mIFJldHVyblR5cGUpew0KLQkJCQlSZXR1cm5UeXBlIHR5cGUgPSAoUmV0dXJuVHlwZSlvYmo7DQotICAgICAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PlJldHVybiBTdHJpbmcgPSAiICsgdHlwZS5nZXRSZXR1cm5TdHIoKSk7DQotCQkJCXJldHVybjsNCi0JCQl9DQotCQkJaWYob2JqIGluc3RhbmNlb2YgVHdvV2F5SG9sZGVyKXsNCi0JCQkJVHdvV2F5SG9sZGVyIHR3aCA9IChUd29XYXlIb2xkZXIpb2JqOw0KLSAgICAgICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiQXN5bmNDYWxsYmFjayBIb2xkZXIgc3RyaW5nID0iICsgdHdoLmdldFR3b1dheUhvbGRlclN0cigpKTsNCi0gICAgICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIkFzeW5jQ2FsbGJhY2sgSG9sZGVyIGludCA9IiArIHR3aC5nZXRUd29XYXlIb2xkZXJJbnQoKSk7DQotCQkJfQ0KLQkJCQ0KLQkJfWNhdGNoKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKXsNCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOw0KLQkJfWNhdGNoKEludGVycnVwdGVkRXhjZXB0aW9uIGUpew0KLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7DQotCQl9DQotDQotCX0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9CYXJlVGVzdHMuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvQmFyZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViMzFlZDUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9CYXJlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotLyoqDQotICogDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZTsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuVGVzdExvZ2dlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5mcmFtZXdvcmsuQWJzdHJhY3RUZXN0Q2FzZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuZG9jbGl0YmFyZS5zZWkuQmFyZURvY0xpdFNlcnZpY2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLmRvY2xpdGJhcmUuc2VpLkRvY0xpdEJhcmVQb3J0VHlwZTsNCi0NCi1pbXBvcnQgamF2YXgueG1sLndzLkJpbmRpbmdQcm92aWRlcjsNCi0NCi1wdWJsaWMgY2xhc3MgQmFyZVRlc3RzIGV4dGVuZHMgQWJzdHJhY3RUZXN0Q2FzZSB7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5EUE9JTlRfVVJMID0gDQotICAgICAgICAiaHR0cDovL2xvY2FsaG9zdDo2MDYwL2F4aXMyL3NlcnZpY2VzL0JhcmVEb2NMaXRTZXJ2aWNlLkRvY0xpdEJhcmVQb3J0VHlwZUltcGxQb3J0IjsNCi0NCi0gICAgLy8gU3RyaW5nIGNvbnRhaW5pbmcgc29tZSBjaGFyYWN0ZXJzIHRoYXQgcmVxdWlyZSBYTUwgZW5jb2RpbmcNCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFhNTENIQVJTID0gIj4+PDw8Mz4+PjM+Pj4zIjsNCi0gICAgDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsNCi0gICAgICAgIHJldHVybiBnZXRUZXN0U2V0dXAobmV3IFRlc3RTdWl0ZShCYXJlVGVzdHMuY2xhc3MpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RWNob1N0cmluZygpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIlRlc3QgOiAiICsgZ2V0TmFtZSgpKTsNCi0NCi0NCi0gICAgICAgIEJhcmVEb2NMaXRTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgQmFyZURvY0xpdFNlcnZpY2UoKTsNCi0gICAgICAgIERvY0xpdEJhcmVQb3J0VHlwZSBwcm94eSA9IHNlcnZpY2UuZ2V0QmFyZURvY0xpdFBvcnQoKTsNCi0gICAgICAgIEJpbmRpbmdQcm92aWRlciBwID0gKEJpbmRpbmdQcm92aWRlcikgcHJveHk7DQotICAgICAgICBwLmdldFJlcXVlc3RDb250ZXh0KCkucHV0KA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaW5kaW5nUHJvdmlkZXIuU09BUEFDVElPTl9VU0VfUFJPUEVSVFksIEJvb2xlYW4uVFJVRSk7DQotICAgICAgICBwLmdldFJlcXVlc3RDb250ZXh0KCkucHV0KA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaW5kaW5nUHJvdmlkZXIuU09BUEFDVElPTl9VUklfUFJPUEVSVFksICJlY2hvU3RyaW5nIik7DQotICAgICAgICBwLmdldFJlcXVlc3RDb250ZXh0KCkucHV0KEJpbmRpbmdQcm92aWRlci5FTkRQT0lOVF9BRERSRVNTX1BST1BFUlRZLCBFTkRQT0lOVF9VUkwpOw0KLQ0KLSAgICAgICAgU3RyaW5nIHJlcXVlc3QgPSAiSGVsbG8gV29ybGQiOw0KLSAgICAgICAgU3RyaW5nIHJlc3BvbnNlID0gcHJveHkuZWNob1N0cmluZyhyZXF1ZXN0KTsNCi0gICAgICAgIGFzc2VydFRydWUocmVxdWVzdC5lcXVhbHMocmVzcG9uc2UpKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gVHJ5IHRoZSB0ZXN0IGFnYWluDQotICAgICAgICByZXNwb25zZSA9IHByb3h5LmVjaG9TdHJpbmcocmVxdWVzdCk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlcXVlc3QuZXF1YWxzKHJlc3BvbnNlKSk7DQotDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotDQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHRlc3RFY2hvU3RyaW5nX3htbGVuY29kZSgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIlRlc3QgOiAiICsgZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIEJhcmVEb2NMaXRTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgQmFyZURvY0xpdFNlcnZpY2UoKTsNCi0gICAgICAgIERvY0xpdEJhcmVQb3J0VHlwZSBwcm94eSA9IHNlcnZpY2UuZ2V0QmFyZURvY0xpdFBvcnQoKTsNCi0gICAgICAgIEJpbmRpbmdQcm92aWRlciBwID0gKEJpbmRpbmdQcm92aWRlcikgcHJveHk7DQotICAgICAgICBwLmdldFJlcXVlc3RDb250ZXh0KCkucHV0KA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaW5kaW5nUHJvdmlkZXIuU09BUEFDVElPTl9VU0VfUFJPUEVSVFksIEJvb2xlYW4uVFJVRSk7DQotICAgICAgICBwLmdldFJlcXVlc3RDb250ZXh0KCkucHV0KA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaW5kaW5nUHJvdmlkZXIuU09BUEFDVElPTl9VUklfUFJPUEVSVFksICJlY2hvU3RyaW5nIik7DQotICAgICAgICBwLmdldFJlcXVlc3RDb250ZXh0KCkucHV0KEJpbmRpbmdQcm92aWRlci5FTkRQT0lOVF9BRERSRVNTX1BST1BFUlRZLCBFTkRQT0lOVF9VUkwpOw0KLQ0KLSAgICAgICAgU3RyaW5nIHJlcXVlc3QgPSBYTUxDSEFSUzsNCi0gICAgICAgIFN0cmluZyByZXNwb25zZSA9IHByb3h5LmVjaG9TdHJpbmcocmVxdWVzdCk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlcXVlc3QuZXF1YWxzKHJlc3BvbnNlKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIFRyeSB0aGUgdGVzdCBhZ2Fpbg0KLSAgICAgICAgcmVzcG9uc2UgPSBwcm94eS5lY2hvU3RyaW5nKHJlcXVlc3QpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXF1ZXN0LmVxdWFscyhyZXNwb25zZSkpOw0KLQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLQ0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VHdvV2F5U3luYygpew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIlRlc3QgOiAiICsgZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIHRyeXsNCi0NCi0gICAgICAgICAgICBCYXJlRG9jTGl0U2VydmljZSBzZXJ2aWNlID0gbmV3IEJhcmVEb2NMaXRTZXJ2aWNlKCk7DQotICAgICAgICAgICAgRG9jTGl0QmFyZVBvcnRUeXBlIHByb3h5ID0gc2VydmljZS5nZXRCYXJlRG9jTGl0UG9ydCgpOw0KLSAgICAgICAgICAgIEJpbmRpbmdQcm92aWRlciBwID0gKEJpbmRpbmdQcm92aWRlcikgcHJveHk7DQotICAgICAgICAgICAgcC5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dCgNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpbmRpbmdQcm92aWRlci5TT0FQQUNUSU9OX1VTRV9QUk9QRVJUWSwgQm9vbGVhbi5UUlVFKTsNCi0gICAgICAgICAgICBwLmdldFJlcXVlc3RDb250ZXh0KCkucHV0KA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmluZGluZ1Byb3ZpZGVyLlNPQVBBQ1RJT05fVVJJX1BST1BFUlRZLCAidHdvV2F5U2ltcGxlIik7DQotICAgICAgICAgICAgcC5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dChCaW5kaW5nUHJvdmlkZXIuRU5EUE9JTlRfQUREUkVTU19QUk9QRVJUWSwgRU5EUE9JTlRfVVJMKTsNCi0NCi0gICAgICAgICAgICBTdHJpbmcgcmVzcG9uc2UgPSBwcm94eS50d29XYXlTaW1wbGUoMTApOw0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJTeW5jIFJlc3BvbnNlID0iICsgcmVzcG9uc2UpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIFRyeSB0aGUgY2FsbCBhZ2Fpbg0KLSAgICAgICAgICAgIHJlc3BvbnNlID0gcHJveHkudHdvV2F5U2ltcGxlKDEwKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiU3luYyBSZXNwb25zZSA9IiArIHJlc3BvbnNlKTsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICB9Y2F0Y2goRXhjZXB0aW9uIGUpew0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAgICAgZmFpbCgpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RUd29XYXlTeW5jV2l0aEJvZHlSb3V0aW5nKCl7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiVGVzdCA6ICIgKyBnZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgdHJ5ew0KLQ0KLSAgICAgICAgICAgIEJhcmVEb2NMaXRTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgQmFyZURvY0xpdFNlcnZpY2UoKTsNCi0gICAgICAgICAgICBEb2NMaXRCYXJlUG9ydFR5cGUgcHJveHkgPSBzZXJ2aWNlLmdldEJhcmVEb2NMaXRQb3J0KCk7DQotICAgICAgICAgICAgQmluZGluZ1Byb3ZpZGVyIHAgPSAoQmluZGluZ1Byb3ZpZGVyKSBwcm94eTsNCi0gICAgICAgICAgICBwLmdldFJlcXVlc3RDb250ZXh0KCkucHV0KEJpbmRpbmdQcm92aWRlci5FTkRQT0lOVF9BRERSRVNTX1BST1BFUlRZLCBFTkRQT0lOVF9VUkwpOw0KLQ0KLSAgICAgICAgICAgIFN0cmluZyByZXNwb25zZSA9IHByb3h5LnR3b1dheVNpbXBsZSgxMCk7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIlN5bmMgUmVzcG9uc2UgPSIgKyByZXNwb25zZSk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gVHJ5IHRoZSBjYWxsIGFnYWluDQotICAgICAgICAgICAgcmVzcG9uc2UgPSBwcm94eS50d29XYXlTaW1wbGUoMTApOw0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJTeW5jIFJlc3BvbnNlID0iICsgcmVzcG9uc2UpOw0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIH1jYXRjaChFeGNlcHRpb24gZSl7DQotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgICAgICBmYWlsKCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdE9uZVdheUVtcHR5KCl7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiVGVzdCA6ICIgKyBnZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgdHJ5ew0KLQ0KLSAgICAgICAgICAgIEJhcmVEb2NMaXRTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgQmFyZURvY0xpdFNlcnZpY2UoKTsNCi0gICAgICAgICAgICBEb2NMaXRCYXJlUG9ydFR5cGUgcHJveHkgPSBzZXJ2aWNlLmdldEJhcmVEb2NMaXRQb3J0KCk7DQotICAgICAgICAgICAgQmluZGluZ1Byb3ZpZGVyIHAgPSAoQmluZGluZ1Byb3ZpZGVyKSBwcm94eTsNCi0NCi0gICAgICAgICAgICBwLmdldFJlcXVlc3RDb250ZXh0KCkucHV0KEJpbmRpbmdQcm92aWRlci5TT0FQQUNUSU9OX1VTRV9QUk9QRVJUWSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvb2xlYW4uVFJVRSk7DQotICAgICAgICAgICAgcC5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dChCaW5kaW5nUHJvdmlkZXIuU09BUEFDVElPTl9VUklfUFJPUEVSVFksDQotICAgICAgICAgICAgIm9uZVdheUVtcHR5Iik7DQotICAgICAgICAgICAgcC5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dCgNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpbmRpbmdQcm92aWRlci5FTkRQT0lOVF9BRERSRVNTX1BST1BFUlRZLCBFTkRQT0lOVF9VUkwpOw0KLSAgICAgICAgICAgIHByb3h5Lm9uZVdheUVtcHR5KCk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gVHJ5IHRoZSBjYWxsIGFnYWluDQotICAgICAgICAgICAgcHJveHkub25lV2F5RW1wdHkoKTsNCi0NCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICB9Y2F0Y2goRXhjZXB0aW9uIGUpew0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAgICAgZmFpbCgpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvRExXTWluVGVzdHMuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvRExXTWluVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJiMGJkMy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL0RMV01pblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGU7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLlRlc3RMb2dnZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZnJhbWV3b3JrLkFic3RyYWN0VGVzdENhc2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLmRsd21pbi5zZWkuR3JlZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuZGx3bWluLnNlaS5UZXN0RXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5kbHdtaW4uc2VpLlRlc3RFeGNlcHRpb24yOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5kbHdtaW4uc2VpLlRlc3RFeGNlcHRpb24zOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5kbHdtaW4udHlwZXMuVGVzdEJlYW47DQotDQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5CaW5kaW5nUHJvdmlkZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5EaXNwYXRjaDsNCi1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOw0KLQ0KLXB1YmxpYyBjbGFzcyBETFdNaW5UZXN0cyBleHRlbmRzIEFic3RyYWN0VGVzdENhc2Ugew0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRVNQQUNFID0gImh0dHA6Ly9hcGFjaGUub3JnL2F4aXMyL2pheHdzL3NhbXBsZS9kbHdtaW4iOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBRTmFtZSBRTkFNRV9TRVJWSUNFID0gbmV3IFFOYW1lKA0KLSAgICAgICAgICAgIE5BTUVTUEFDRSwgIkdyZWV0ZXJTZXJ2aWNlIik7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFFOYW1lIFFOQU1FX1BPUlQgPSBuZXcgUU5hbWUoDQotICAgICAgICAgICAgTkFNRVNQQUNFLCAiR3JlZXRlclBvcnQiKTsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTF9FTkRQT0lOVCA9ICJodHRwOi8vbG9jYWxob3N0OjYwNjAvYXhpczIvc2VydmljZXMvR3JlZXRlclNlcnZpY2UuR3JlZXRlckltcGxQb3J0IjsNCi0JDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsNCi0gICAgICAgIHJldHVybiBnZXRUZXN0U2V0dXAobmV3IFRlc3RTdWl0ZShETFdNaW5UZXN0cy5jbGFzcykpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgR3JlZXRlciBnZXRQcm94eShTdHJpbmcgYWN0aW9uKSB7DQotICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSBTZXJ2aWNlLmNyZWF0ZShRTkFNRV9TRVJWSUNFKTsNCi0gICAgICAgIEdyZWV0ZXIgcHJveHkgPSBzZXJ2aWNlLmdldFBvcnQoUU5BTUVfUE9SVCwgR3JlZXRlci5jbGFzcyk7DQotICAgICAgICBCaW5kaW5nUHJvdmlkZXIgcCA9IChCaW5kaW5nUHJvdmlkZXIpIHByb3h5Ow0KLSAgICAgICAgcC5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dCgNCi0gICAgICAgICAgICAgICAgQmluZGluZ1Byb3ZpZGVyLlNPQVBBQ1RJT05fVVNFX1BST1BFUlRZLCBCb29sZWFuLlRSVUUpOw0KLSAgICAgICAgcC5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dCgNCi0gICAgICAgICAgICAgICAgQmluZGluZ1Byb3ZpZGVyLlNPQVBBQ1RJT05fVVJJX1BST1BFUlRZLCBhY3Rpb24pOw0KLSAgICAgICAgcC5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dCgNCi0gICAgICAgICAgICAgICAgQmluZGluZ1Byb3ZpZGVyLkVORFBPSU5UX0FERFJFU1NfUFJPUEVSVFksIFVSTF9FTkRQT0lOVCk7DQotICAgICAgICByZXR1cm4gcHJveHk7DQotICAgIH0NCi0gICAgDQotICAgIHByaXZhdGUgRGlzcGF0Y2g8U3RyaW5nPiBnZXREaXNwYXRjaChTdHJpbmcgYWN0aW9uKSB7DQotICAgICAgICAvLyBHZXQgYSBkaXNwYXRjaA0KLSAgICAgICAgU2VydmljZSBzdmMgPSBTZXJ2aWNlLmNyZWF0ZShRTkFNRV9TRVJWSUNFKTsNCi0gICAgICAgIHN2Yy5hZGRQb3J0KFFOQU1FX1BPUlQsIG51bGwsIFVSTF9FTkRQT0lOVCk7DQotICAgICAgICBEaXNwYXRjaDxTdHJpbmc+IGRpc3BhdGNoID0gc3ZjLmNyZWF0ZURpc3BhdGNoKFFOQU1FX1BPUlQsIA0KLSAgICAgICAgICAgICAgICBTdHJpbmcuY2xhc3MsIFNlcnZpY2UuTW9kZS5QQVlMT0FEKTsNCi0gICAgICAgIEJpbmRpbmdQcm92aWRlciBwID0gKEJpbmRpbmdQcm92aWRlcikgZGlzcGF0Y2g7DQotICAgICAgICBwLmdldFJlcXVlc3RDb250ZXh0KCkucHV0KA0KLSAgICAgICAgICAgICAgICBCaW5kaW5nUHJvdmlkZXIuU09BUEFDVElPTl9VU0VfUFJPUEVSVFksIEJvb2xlYW4uVFJVRSk7DQotICAgICAgICBwLmdldFJlcXVlc3RDb250ZXh0KCkucHV0KA0KLSAgICAgICAgICAgICAgICBCaW5kaW5nUHJvdmlkZXIuU09BUEFDVElPTl9VUklfUFJPUEVSVFksIGFjdGlvbik7DQotICAgICAgICByZXR1cm4gZGlzcGF0Y2g7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBUZXN0IHNpbXBsZSBncmVldE1lIG1ldGhvZCANCi0gICAgICogd2l0aCBzdHlsZSBkb2MvbGl0IHdyYXBwZWQgd2l0aG91dCB0aGUgcHJlc2VuY2Ugb2Ygd3JhcHBlciBjbGFzc2VzLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdEdyZWV0TWUoKSB7DQotICAgICAgICANCi0gICAgICAgIEdyZWV0ZXIgcHJveHkgPSBnZXRQcm94eSgiZ3JlZXRNZSIpOw0KLSAgICAgICAgDQotICAgICAgICBTdHJpbmcgbWUgPSAiU2NoZXUiOw0KLSAgICAgICAgU3RyaW5nIHJlc3BvbnNlID0gcHJveHkuZ3JlZXRNZShtZSk7DQotICAgICAgICBhc3NlcnRUcnVlKCJIZWxsbyBTY2hldSIuZXF1YWxzKHJlc3BvbnNlKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIFRyeSB0aGUgY2FsbCBhZ2Fpbg0KLSAgICAgICAgcmVzcG9uc2UgPSBwcm94eS5ncmVldE1lKG1lKTsNCi0gICAgICAgIGFzc2VydFRydWUoIkhlbGxvIFNjaGV1Ii5lcXVhbHMocmVzcG9uc2UpKTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFRlc3Qgc2ltcGxlIGdyZWV0TWUgbWV0aG9kIHdpdGggZGlzcGF0Y2ggDQotICAgICAqIHdpdGggc3R5bGUgZG9jL2xpdCB3cmFwcGVkIHdpdGhvdXQgdGhlIHByZXNlbmNlIG9mIHdyYXBwZXIgY2xhc3Nlcy4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RHcmVldE1lX0Rpc3BhdGNoKCkgew0KLSAgICAgICANCi0gICAgICAgIERpc3BhdGNoPFN0cmluZz4gZGlzcGF0Y2ggPSBnZXREaXNwYXRjaCgiZ3JlZXRNZSIpOw0KLSAgICAgICAgDQotICAgICAgICBTdHJpbmcgcmVxdWVzdCA9DQotICAgICAgICAgICAgIjxwcmU6Z3JlZXRNZSB4bWxuczpwcmU9J2h0dHA6Ly9hcGFjaGUub3JnL2F4aXMyL2pheHdzL3NhbXBsZS9kbHdtaW4nPiIgKw0KLSAgICAgICAgICAgICI8cHJlOnJlcXVlc3RUeXBlPlNjaGV1PC9wcmU6cmVxdWVzdFR5cGU+IiArDQotICAgICAgICAgICAgIjwvcHJlOmdyZWV0TWU+IjsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJEb2MvTGl0IFdyYXBwZWQgTWluaW1hbCBSZXF1ZXN0ID0iICsgcmVxdWVzdCk7DQotICAgICAgICBTdHJpbmcgcmVzcG9uc2UgPSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiRG9jL0xpdCBXcmFwcGVkIE1pbmltYWwgUmVzcG9uc2UgPSIgKyByZXNwb25zZSk7DQotICAgICAgICANCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UuY29udGFpbnMoIkhlbGxvIFNjaGV1IikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZS5jb250YWlucygiZGx3bWluOmdyZWV0TWVSZXNwb25zZSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UuY29udGFpbnMoIjpyZXNwb25zZVR5cGUiKSB8fA0KLSAgICAgICAgICAgICAgICAgICByZXNwb25zZS5jb250YWlucygicmVzcG9uc2VUeXBlIHhtbG5zPSIpKTsgIC8vIGFzc2VydCB0aGF0IHJlc3BvbnNlIHR5cGUgaXMgYSBxdWFsaWZpZWQgZWxlbWVudA0KLSAgICAgICAgYXNzZXJ0VHJ1ZSghcmVzcG9uc2UuY29udGFpbnMoInhzaTp0eXBlIikpOyAvLyB4c2k6dHlwZSBzaG91bGQgbm90IGJlIHVzZWQNCi0gICAgICAgIA0KLSAgICAgICAgLy8gVHJ5IHRoZSBjYWxsIGFnYWluDQotICAgICAgICByZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJEb2MvTGl0IFdyYXBwZWQgTWluaW1hbCBSZXNwb25zZSA9IiArIHJlc3BvbnNlKTsNCi0gICAgICAgIA0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZS5jb250YWlucygiSGVsbG8gU2NoZXUiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlLmNvbnRhaW5zKCJkbHdtaW46Z3JlZXRNZVJlc3BvbnNlIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZS5jb250YWlucygiOnJlc3BvbnNlVHlwZSIpIHx8DQotICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmNvbnRhaW5zKCJyZXNwb25zZVR5cGUgeG1sbnM9IikpOyAgLy8gYXNzZXJ0IHRoYXQgcmVzcG9uc2UgdHlwZSBpcyBhIHF1YWxpZmllZCBlbGVtZW50DQotICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZS5jb250YWlucygieHNpOnR5cGUiKSk7IC8vIHhzaTp0eXBlIHNob3VsZCBub3QgYmUgdXNlZA0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogVGVzdCBzaW1wbGUgZ3JlZXRNZSBtZXRob2QgDQotICAgICAqIHdpdGggc3R5bGUgZG9jL2xpdCB3cmFwcGVkIHdpdGhvdXQgdGhlIHByZXNlbmNlIG9mIHdyYXBwZXIgY2xhc3Nlcy4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RVbnF1YWxpZmllZCgpIHsNCi0gICAgICAgIA0KLSAgICAgICAgR3JlZXRlciBwcm94eSA9IGdldFByb3h5KCJ0ZXN0VW5xdWFsaWZpZWQiKTsNCi0gICAgICAgIA0KLSAgICAgICAgU3RyaW5nIHJlcXVlc3QgPSAiaGVsbG8gd29ybGQiOw0KLSAgICAgICAgU3RyaW5nIHJlc3BvbnNlID0gcHJveHkudGVzdFVucXVhbGlmaWVkKHJlcXVlc3QpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiaGVsbG8gd29ybGQiLmVxdWFscyhyZXNwb25zZSkpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBUcnkgdGhlIGNhbGwgYWdhaW4NCi0gICAgICAgIHJlc3BvbnNlID0gcHJveHkudGVzdFVucXVhbGlmaWVkKHJlcXVlc3QpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiaGVsbG8gd29ybGQiLmVxdWFscyhyZXNwb25zZSkpOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogVGVzdCBzaW1wbGUgZ3JlZXRNZSBtZXRob2Qgd2l0aCBkaXNwYXRjaCANCi0gICAgICogd2l0aCBzdHlsZSBkb2MvbGl0IHdyYXBwZWQgd2l0aG91dCB0aGUgcHJlc2VuY2Ugb2Ygd3JhcHBlciBjbGFzc2VzLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdFVucXVhbGlmaWVkX0Rpc3BhdGNoKCkgew0KLSAgICAgICANCi0gICAgICAgIERpc3BhdGNoPFN0cmluZz4gZGlzcGF0Y2ggPSBnZXREaXNwYXRjaCgidGVzdFVucXVhbGlmaWVkIik7DQotICAgICAgICANCi0gICAgICAgIFN0cmluZyByZXF1ZXN0ID0NCi0gICAgICAgICAgICAiPHByZTp1bnF1YWxpZmllZFRlc3RSZXNwb25zZSB4bWxuczpwcmU9J2h0dHA6Ly9hcGFjaGUub3JnL2F4aXMyL2pheHdzL3NhbXBsZS9kbHdtaW4nPiIgKw0KLSAgICAgICAgICAgICI8dW5xdWFsaWZpZWRSZXF1ZXN0PmhlbGxvIHdvcmxkPC91bnF1YWxpZmllZFJlcXVlc3Q+IiArDQotICAgICAgICAgICAgIjwvcHJlOnVucXVhbGlmaWVkVGVzdFJlc3BvbnNlPiI7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiRG9jL0xpdCBXcmFwcGVkIE1pbmltYWwgUmVxdWVzdCA9IiArIHJlcXVlc3QpOw0KLSAgICAgICAgU3RyaW5nIHJlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIkRvYy9MaXQgV3JhcHBlZCBNaW5pbWFsIFJlc3BvbnNlID0iICsgcmVzcG9uc2UpOw0KLSAgICAgICAgDQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlLmNvbnRhaW5zKCJoZWxsbyB3b3JsZCIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UuY29udGFpbnMoImRsd21pbjp0ZXN0VW5xdWFsaWZpZWRSZXNwb25zZSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UuY29udGFpbnMoIjx1bnF1YWxpZmllZFJlc3BvbnNlIikpOyAgLy8gYXNzZXJ0IHRoYXQgdGhlIGNoaWxkIGVsZW1lbnQgaXMgYW4gdXF1YWxpZmllZCBlbGVtZW50DQotICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZS5jb250YWlucygieHNpOnR5cGUiKSk7IC8vIHhzaTp0eXBlIHNob3VsZCBub3QgYmUgdXNlZA0KLSAgICAgICAgDQotICAgICAgICANCi0gICAgICAgIC8vIFRyeSB0aGUgY2FsbCBhZ2FpbiB0byB2ZXJpZnkNCi0gICAgICAgIHJlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIkRvYy9MaXQgV3JhcHBlZCBNaW5pbWFsIFJlc3BvbnNlID0iICsgcmVzcG9uc2UpOw0KLSAgICAgICAgDQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlLmNvbnRhaW5zKCJoZWxsbyB3b3JsZCIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UuY29udGFpbnMoImRsd21pbjp0ZXN0VW5xdWFsaWZpZWRSZXNwb25zZSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UuY29udGFpbnMoIjx1bnF1YWxpZmllZFJlc3BvbnNlIikpOyAgLy8gYXNzZXJ0IHRoYXQgdGhlIGNoaWxkIGVsZW1lbnQgaXMgYW4gdXF1YWxpZmllZCBlbGVtZW50DQotICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZS5jb250YWlucygieHNpOnR5cGUiKSk7IC8vIHhzaTp0eXBlIHNob3VsZCBub3QgYmUgdXNlZA0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogVGVzdCBlY2hvIHdpdGggY29tcGxleFR5cGUgDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvY2Vzc19FY2hvKCkgIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgDQotICAgICAgICBHcmVldGVyIHByb3h5ID0gZ2V0UHJveHkoInByb2Nlc3MiKTsNCi0gICAgICAgIA0KLSAgICAgICAgVGVzdEJlYW4gcmVxdWVzdCA9IG5ldyBUZXN0QmVhbigpOw0KLSAgICAgICAgcmVxdWVzdC5zZXREYXRhMSgiaGVsbG8gd29ybGQiKTsNCi0gICAgICAgIHJlcXVlc3Quc2V0RGF0YTIoMTApOw0KLSAgICAgICAgVGVzdEJlYW4gcmVzcG9uc2UgPSBwcm94eS5wcm9jZXNzKDAsIHJlcXVlc3QpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZSAhPSBudWxsKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UuZ2V0RGF0YTEoKS5lcXVhbHMoImhlbGxvIHdvcmxkIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZS5nZXREYXRhMigpID09IDEwKTsNCi0gICAgICAgIA0KLSAgICAgICAgDQotICAgICAgICAvLyBUcnkgdGhlIGNhbGwgYWdhaW4gdG8gdmVyaWZ5DQotICAgICAgICByZXNwb25zZSA9IHByb3h5LnByb2Nlc3MoMCwgcmVxdWVzdCk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlICE9IG51bGwpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZS5nZXREYXRhMSgpLmVxdWFscygiaGVsbG8gd29ybGQiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlLmdldERhdGEyKCkgPT0gMTApOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogVGVzdCB0aHJvd2luZyBjaGVja2VkIGV4Y2VwdGlvbiB3L28gYSBKQVhCIEJlYW4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RQcm9jZXNzX0NoZWNrRXhjZXB0aW9uKCkgIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgDQotICAgICAgICBHcmVldGVyIHByb3h5ID0gZ2V0UHJveHkoInByb2Nlc3MiKTsNCi0gICAgICAgIA0KLSAgICAgICAgVGVzdEJlYW4gcmVxdWVzdCA9IG5ldyBUZXN0QmVhbigpOw0KLSAgICAgICAgcmVxdWVzdC5zZXREYXRhMSgiaGVsbG8gd29ybGQiKTsNCi0gICAgICAgIHJlcXVlc3Quc2V0RGF0YTIoMTApOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBUZXN0QmVhbiByZXNwb25zZSA9IHByb3h5LnByb2Nlc3MoMSwgcmVxdWVzdCk7DQotICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgVGVzdEV4Y2VwdGlvbiB0aHJvd24iKTsNCi0gICAgICAgIH0gY2F0Y2ggKFdlYlNlcnZpY2VFeGNlcHRpb24gd3NlKSB7DQotICAgICAgICAgICAgLy8gQ3VycmVudGx5IHRoZXJlIGlzIG5vIHN1cHBvcnQgaWYgdGhlIGZhdWx0IGJlYW4gaXMgbWlzc2luZw0KLSAgICAgICAgICAgIGFzc2VydFRydWUod3NlLmdldE1lc3NhZ2UoKS5jb250YWlucygiVXNlciBmYXVsdCBwcm9jZXNzaW5nIGlzIG5vdCBzdXBwb3J0ZWQiKSk7DQotICAgICAgICB9IGNhdGNoIChUZXN0RXhjZXB0aW9uIHRlKSB7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh0ZS5nZXRNZXNzYWdlKCkuZXF1YWxzKCJUZXN0RXhjZXB0aW9uIHRocm93biIpKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHRlLmdldEZsYWcoKSA9PSAxMjMpOw0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBUZXN0RXhjZXB0aW9uIHRocm93biBidXQgZm91bmQgIiArIGUuZ2V0Q2xhc3MoKSk7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIC8vIFRyeSB0aGUgY2FsbCBhZ2FpbiB0byB2ZXJpZnkNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgVGVzdEJlYW4gcmVzcG9uc2UgPSBwcm94eS5wcm9jZXNzKDEsIHJlcXVlc3QpOw0KLSAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIFRlc3RFeGNlcHRpb24gdGhyb3duIik7DQotICAgICAgICB9IGNhdGNoIChXZWJTZXJ2aWNlRXhjZXB0aW9uIHdzZSkgew0KLSAgICAgICAgICAgIC8vIEN1cnJlbnRseSB0aGVyZSBpcyBubyBzdXBwb3J0IGlmIHRoZSBmYXVsdCBiZWFuIGlzIG1pc3NpbmcNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHdzZS5nZXRNZXNzYWdlKCkuY29udGFpbnMoIlVzZXIgZmF1bHQgcHJvY2Vzc2luZyBpcyBub3Qgc3VwcG9ydGVkIikpOw0KLSAgICAgICAgfSBjYXRjaCAoVGVzdEV4Y2VwdGlvbiB0ZSkgew0KLSAgICAgICAgICAgIGFzc2VydFRydWUodGUuZ2V0TWVzc2FnZSgpLmVxdWFscygiVGVzdEV4Y2VwdGlvbiB0aHJvd24iKSk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh0ZS5nZXRGbGFnKCkgPT0gMTIzKTsNCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgVGVzdEV4Y2VwdGlvbiB0aHJvd24gYnV0IGZvdW5kICIgKyBlLmdldENsYXNzKCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogVGVzdCB0aHJvd2luZyBjaGVja2VkIGV4Y2VwdGlvbiB0aGF0IGhhcyBhIEpBWEIgQmVhbg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdFByb2Nlc3NfQ2hlY2tFeGNlcHRpb24yKCkgIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgDQotICAgICAgICBHcmVldGVyIHByb3h5ID0gZ2V0UHJveHkoInByb2Nlc3MiKTsNCi0gICAgICAgIA0KLSAgICAgICAgVGVzdEJlYW4gcmVxdWVzdCA9IG5ldyBUZXN0QmVhbigpOw0KLSAgICAgICAgcmVxdWVzdC5zZXREYXRhMSgiaGVsbG8gd29ybGQiKTsNCi0gICAgICAgIHJlcXVlc3Quc2V0RGF0YTIoMTApOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBUZXN0QmVhbiByZXNwb25zZSA9IHByb3h5LnByb2Nlc3MoNCwgcmVxdWVzdCk7DQotICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgVGVzdEV4Y2VwdGlvbjIgdGhyb3duIik7DQotICAgICAgICB9IGNhdGNoIChUZXN0RXhjZXB0aW9uMiB0ZSkgew0KLSAgICAgICAgICAgIGFzc2VydFRydWUodGUuZ2V0TWVzc2FnZSgpLmVxdWFscygiVGVzdEV4Y2VwdGlvbjIgdGhyb3duIikpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUodGUuZ2V0RmxhZygpID09IDQ1Nik7DQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIFRlc3RFeGNlcHRpb24yIHRocm93biBidXQgZm91bmQgIiArIGUuZ2V0Q2xhc3MoKSk7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIC8vIFRyeSB0aGUgY2FsbCBhZ2FpbiB0byB2ZXJpZnkgdGhlIHNhbWUgYmVoYXZpb3INCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgVGVzdEJlYW4gcmVzcG9uc2UgPSBwcm94eS5wcm9jZXNzKDQsIHJlcXVlc3QpOw0KLSAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIFRlc3RFeGNlcHRpb24yIHRocm93biIpOw0KLSAgICAgICAgfSBjYXRjaCAoVGVzdEV4Y2VwdGlvbjIgdGUpIHsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHRlLmdldE1lc3NhZ2UoKS5lcXVhbHMoIlRlc3RFeGNlcHRpb24yIHRocm93biIpKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHRlLmdldEZsYWcoKSA9PSA0NTYpOw0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBUZXN0RXhjZXB0aW9uMiB0aHJvd24gYnV0IGZvdW5kICIgKyBlLmdldENsYXNzKCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogVGVzdCB0aHJvd2luZyBjaGVja2VkIGV4Y2VwdGlvbiB0aGF0IGlzIGEgY29tcGxpYW50IEpBWFdTIGV4Y2VwdGlvbg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdFByb2Nlc3NfQ2hlY2tFeGNlcHRpb24zKCkgIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgDQotICAgICAgICBHcmVldGVyIHByb3h5ID0gZ2V0UHJveHkoInByb2Nlc3MiKTsNCi0gICAgICAgIA0KLSAgICAgICAgVGVzdEJlYW4gcmVxdWVzdCA9IG5ldyBUZXN0QmVhbigpOw0KLSAgICAgICAgcmVxdWVzdC5zZXREYXRhMSgiaGVsbG8gd29ybGQiKTsNCi0gICAgICAgIHJlcXVlc3Quc2V0RGF0YTIoMTApOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBUZXN0QmVhbiByZXNwb25zZSA9IHByb3h5LnByb2Nlc3MoNSwgcmVxdWVzdCk7DQotICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgVGVzdEV4Y2VwdGlvbjMgdGhyb3duIik7DQotICAgICAgICB9IGNhdGNoIChUZXN0RXhjZXB0aW9uMyB0ZSkgew0KLSAgICAgICAgICAgIGFzc2VydFRydWUodGUuZ2V0TWVzc2FnZSgpLmVxdWFscygiVGVzdEV4Y2VwdGlvbjMgdGhyb3duIikpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUodGUuZ2V0RmF1bHRJbmZvKCkuZ2V0RmxhZygpID09IDc4OSk7DQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIFRlc3RFeGNlcHRpb24zIHRocm93biBidXQgZm91bmQgIiArIGUuZ2V0Q2xhc3MoKSk7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIC8vIFRyeSB0aGUgY2FsbCBhZ2FpbiB0byB2ZXJpZnkgdGhlIHNhbWUgYmVoYXZpb3INCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgVGVzdEJlYW4gcmVzcG9uc2UgPSBwcm94eS5wcm9jZXNzKDUsIHJlcXVlc3QpOw0KLSAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIFRlc3RFeGNlcHRpb24zIHRocm93biIpOw0KLSAgICAgICAgfSBjYXRjaCAoVGVzdEV4Y2VwdGlvbjMgdGUpIHsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHRlLmdldE1lc3NhZ2UoKS5lcXVhbHMoIlRlc3RFeGNlcHRpb24zIHRocm93biIpKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHRlLmdldEZhdWx0SW5mbygpLmdldEZsYWcoKSA9PSA3ODkpOw0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBUZXN0RXhjZXB0aW9uMyB0aHJvd24gYnV0IGZvdW5kICIgKyBlLmdldENsYXNzKCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogVGVzdCB0aHJvd2luZyBXZWJTZXJ2aWNlRXhjZXB0aW9uDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvY2Vzc19XZWJTZXJ2aWNlRXhjZXB0aW9uKCkgIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgDQotICAgICAgICBHcmVldGVyIHByb3h5ID0gZ2V0UHJveHkoInByb2Nlc3MiKTsNCi0gICAgICAgIA0KLSAgICAgICAgVGVzdEJlYW4gcmVxdWVzdCA9IG5ldyBUZXN0QmVhbigpOw0KLSAgICAgICAgcmVxdWVzdC5zZXREYXRhMSgiaGVsbG8gd29ybGQiKTsNCi0gICAgICAgIHJlcXVlc3Quc2V0RGF0YTIoMTApOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBUZXN0QmVhbiByZXNwb25zZSA9IHByb3h5LnByb2Nlc3MoMiwgcmVxdWVzdCk7DQotICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgV2ViU2VydmljZUV4Y2VwdGlvbiB0aHJvd24iKTsNCi0gICAgICAgIH0gY2F0Y2ggKFdlYlNlcnZpY2VFeGNlcHRpb24gd3NlKSB7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh3c2UuZ2V0TWVzc2FnZSgpLmVxdWFscygiV2ViU2VydmljZUV4Y2VwdGlvbiB0aHJvd24iKSk7DQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIFdlYlNlcnZpY2VFeGNlcHRpb24gdGhyb3duIGJ1dCBmb3VuZCAiICsgZS5nZXRDbGFzcygpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgLy8gVHJ5IHRoZSBjYWxsIGFnYWluIHRvIHZlcmlmeSB0aGUgc2FtZSBiZWhhdmlvcg0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBUZXN0QmVhbiByZXNwb25zZSA9IHByb3h5LnByb2Nlc3MoMiwgcmVxdWVzdCk7DQotICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgV2ViU2VydmljZUV4Y2VwdGlvbiB0aHJvd24iKTsNCi0gICAgICAgIH0gY2F0Y2ggKFdlYlNlcnZpY2VFeGNlcHRpb24gd3NlKSB7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh3c2UuZ2V0TWVzc2FnZSgpLmVxdWFscygiV2ViU2VydmljZUV4Y2VwdGlvbiB0aHJvd24iKSk7DQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIFdlYlNlcnZpY2VFeGNlcHRpb24gdGhyb3duIGJ1dCBmb3VuZCAiICsgZS5nZXRDbGFzcygpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFRlc3QgdGhyb3dpbmcgTlBFDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvY2Vzc19OUEUoKSAgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICANCi0gICAgICAgIEdyZWV0ZXIgcHJveHkgPSBnZXRQcm94eSgicHJvY2VzcyIpOw0KLSAgICAgICAgDQotICAgICAgICBUZXN0QmVhbiByZXF1ZXN0ID0gbmV3IFRlc3RCZWFuKCk7DQotICAgICAgICByZXF1ZXN0LnNldERhdGExKCJoZWxsbyB3b3JsZCIpOw0KLSAgICAgICAgcmVxdWVzdC5zZXREYXRhMigxMCk7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIFRlc3RCZWFuIHJlc3BvbnNlID0gcHJveHkucHJvY2VzcygzLCByZXF1ZXN0KTsNCi0gICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBOdWxsUG9pbnRlckV4Y2VwdGlvbiB0aHJvd24iKTsNCi0gICAgICAgIH0gY2F0Y2ggKFdlYlNlcnZpY2VFeGNlcHRpb24gd3NlKSB7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh3c2UuZ2V0TWVzc2FnZSgpLmVxdWFscygiTlBFIHRocm93biIpKTsNCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgTnVsbFBvaW50ZXJFeGNlcHRpb24gdGhyb3duIGJ1dCBmb3VuZCAiICsgZS5nZXRDbGFzcygpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgLy8gVHJ5IHRoZSBjYWxsIGFnYWluIHRvIHZlcmlmeSB0aGUgc2FtZSBiZWhhdmlvcg0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBUZXN0QmVhbiByZXNwb25zZSA9IHByb3h5LnByb2Nlc3MoMywgcmVxdWVzdCk7DQotICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgTnVsbFBvaW50ZXJFeGNlcHRpb24gdGhyb3duIik7DQotICAgICAgICB9IGNhdGNoIChXZWJTZXJ2aWNlRXhjZXB0aW9uIHdzZSkgew0KLSAgICAgICAgICAgIGFzc2VydFRydWUod3NlLmdldE1lc3NhZ2UoKS5lcXVhbHMoIk5QRSB0aHJvd24iKSk7DQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIE51bGxQb2ludGVyRXhjZXB0aW9uIHRocm93biBidXQgZm91bmQgIiArIGUuZ2V0Q2xhc3MoKSk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvRG9jTGl0QmFyZU1pblRlc3RzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL0RvY0xpdEJhcmVNaW5UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDUzZTAwLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvRG9jTGl0QmFyZU1pblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotLyoqDQotICogDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZTsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuVGVzdExvZ2dlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5mcmFtZXdvcmsuQWJzdHJhY3RUZXN0Q2FzZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuZG9jbGl0YmFyZW1pbi5zZWkuQmFyZURvY0xpdE1pblNlcnZpY2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLmRvY2xpdGJhcmVtaW4uc2VpLkRvY0xpdEJhcmVNaW5Qb3J0VHlwZTsNCi0NCi1pbXBvcnQgamF2YXgueG1sLndzLkJpbmRpbmdQcm92aWRlcjsNCi0NCi0NCi1wdWJsaWMgY2xhc3MgRG9jTGl0QmFyZU1pblRlc3RzIGV4dGVuZHMgQWJzdHJhY3RUZXN0Q2FzZSB7DQotICAgIFN0cmluZyBheGlzRW5kcG9pbnQgPSAiaHR0cDovL2xvY2FsaG9zdDo2MDYwL2F4aXMyL3NlcnZpY2VzL0RvY0xpdEJhcmVNaW5Qb3J0VHlwZUltcGxTZXJ2aWNlLkRvY0xpdEJhcmVNaW5Qb3J0VHlwZUltcGxQb3J0IjsNCi0NCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgew0KLSAgICAgICAgcmV0dXJuIGdldFRlc3RTZXR1cChuZXcgVGVzdFN1aXRlKERvY0xpdEJhcmVNaW5UZXN0cy5jbGFzcykpOw0KLSAgICB9DQotICAgIAkNCi0JDQotICAgIHB1YmxpYyB2b2lkIHRlc3RFY2hvKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiVGVzdCA6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgDQotICAgICAgICANCi0gICAgICAgIEJhcmVEb2NMaXRNaW5TZXJ2aWNlIHNlcnZpY2UgPSBuZXcgQmFyZURvY0xpdE1pblNlcnZpY2UoKTsNCi0gICAgICAgIERvY0xpdEJhcmVNaW5Qb3J0VHlwZSBwcm94eSA9IHNlcnZpY2UuZ2V0QmFyZURvY0xpdE1pblBvcnQoKTsNCi0gICAgICAgIEJpbmRpbmdQcm92aWRlciBwID0gKEJpbmRpbmdQcm92aWRlcikgcHJveHk7DQotICAgICAgICBwLmdldFJlcXVlc3RDb250ZXh0KCkucHV0KEJpbmRpbmdQcm92aWRlci5FTkRQT0lOVF9BRERSRVNTX1BST1BFUlRZLCBheGlzRW5kcG9pbnQpOw0KLSAgICAgICAgcC5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dCgNCi0gICAgICAgICAgICAgICAgQmluZGluZ1Byb3ZpZGVyLlNPQVBBQ1RJT05fVVNFX1BST1BFUlRZLCBCb29sZWFuLlRSVUUpOw0KLSAgICAgICAgcC5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dCgNCi0gICAgICAgICAgICAgICAgQmluZGluZ1Byb3ZpZGVyLlNPQVBBQ1RJT05fVVJJX1BST1BFUlRZLCAiZWNobyIpOw0KLSAgICAgICAgU3RyaW5nIHJlcXVlc3QgPSAiZGxyb1cgZWxsb0giOw0KLSAgICAgICAgU3RyaW5nIHJlc3BvbnNlID0gcHJveHkuZWNobyhyZXF1ZXN0KTsNCi0gICAgICAgIA0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXF1ZXN0LmVxdWFscyhyZXNwb25zZSkpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBUcnkgdGhlIGNhbGwgYWdhaW4gdG8gdmVyaWZ5IGJlaGF2aW9yDQotICAgICAgICByZXNwb25zZSA9IHByb3h5LmVjaG8ocmVxdWVzdCk7DQotICAgICAgICANCi0gICAgICAgIGFzc2VydFRydWUocmVxdWVzdC5lcXVhbHMocmVzcG9uc2UpKTsNCi0gICAgICAgIA0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvRmF1bHRzU2VydmljZVRlc3RzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL0ZhdWx0c1NlcnZpY2VUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODFmZjllLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvRmF1bHRzU2VydmljZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NDUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLS8qKg0KLSAqIA0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGU7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLlRlc3RMb2dnZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZnJhbWV3b3JrLkFic3RyYWN0VGVzdENhc2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLmZhdWx0c3NlcnZpY2UuQmFzZUZhdWx0X0V4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuZmF1bHRzc2VydmljZS5Db21wbGV4RmF1bHRfRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5mYXVsdHNzZXJ2aWNlLkRlcml2ZWRGYXVsdDFfRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5mYXVsdHNzZXJ2aWNlLkRlcml2ZWRGYXVsdDJfRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5mYXVsdHNzZXJ2aWNlLkZhdWx0c1NlcnZpY2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLmZhdWx0c3NlcnZpY2UuRmF1bHRzU2VydmljZVBvcnRUeXBlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5mYXVsdHNzZXJ2aWNlLkludmFsaWRUaWNrZXJGYXVsdF9FeGNlcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLmZhdWx0c3NlcnZpY2UuU2ltcGxlRmF1bHQ7DQotaW1wb3J0IG9yZy50ZXN0LnBvbHltb3JwaGljZmF1bHRzLkJhc2VGYXVsdDsNCi1pbXBvcnQgb3JnLnRlc3QucG9seW1vcnBoaWNmYXVsdHMuQ29tcGxleEZhdWx0Ow0KLWltcG9ydCBvcmcudGVzdC5wb2x5bW9ycGhpY2ZhdWx0cy5EZXJpdmVkRmF1bHQxOw0KLWltcG9ydCBvcmcudGVzdC5wb2x5bW9ycGhpY2ZhdWx0cy5EZXJpdmVkRmF1bHQyOw0KLQ0KLWltcG9ydCBqYXZheC54bWwuc29hcC5EZXRhaWxFbnRyeTsNCi1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEZhdWx0Ow0KLWltcG9ydCBqYXZheC54bWwud3MuQmluZGluZ1Byb3ZpZGVyOw0KLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5TT0FQRmF1bHRFeGNlcHRpb247DQotDQotcHVibGljIGNsYXNzIEZhdWx0c1NlcnZpY2VUZXN0cyBleHRlbmRzIEFic3RyYWN0VGVzdENhc2Ugew0KLSAgICANCi0gICAgU3RyaW5nIGF4aXNFbmRwb2ludCA9ICJodHRwOi8vbG9jYWxob3N0OjYwNjAvYXhpczIvc2VydmljZXMvRmF1bHRzU2VydmljZS5GYXVsdHNQb3J0IjsNCi0gICAgDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsNCi0gICAgICAgIHJldHVybiBnZXRUZXN0U2V0dXAobmV3IFRlc3RTdWl0ZShGYXVsdHNTZXJ2aWNlVGVzdHMuY2xhc3MpKTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFV0aWxpdHkgbWV0aG9kIHRvIGdldCB0aGUgcHJveHkNCi0gICAgICogQHJldHVybiBwcm94eQ0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBGYXVsdHNTZXJ2aWNlUG9ydFR5cGUgZ2V0UHJveHkoKSB7DQotICAgICAgICBGYXVsdHNTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgRmF1bHRzU2VydmljZSgpOw0KLSAgICAgICAgRmF1bHRzU2VydmljZVBvcnRUeXBlIHByb3h5ID0gc2VydmljZS5nZXRGYXVsdHNQb3J0KCk7DQotICAgICAgICBCaW5kaW5nUHJvdmlkZXIgcCA9IChCaW5kaW5nUHJvdmlkZXIpcHJveHk7DQotICAgICAgICBwLmdldFJlcXVlc3RDb250ZXh0KCkucHV0KEJpbmRpbmdQcm92aWRlci5FTkRQT0lOVF9BRERSRVNTX1BST1BFUlRZLGF4aXNFbmRwb2ludCk7DQotICAgICAgICByZXR1cm4gcHJveHk7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBUZXN0cyB0aGF0IHRoYXQgQmFzZUZhdWx0IGlzIHRocm93bg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdEZhdWx0c1NlcnZpY2UwKCkgew0KLSAgICAgICAgRXhjZXB0aW9uIGV4Y2VwdGlvbiA9IG51bGw7DQotICAgICAgICBGYXVsdHNTZXJ2aWNlUG9ydFR5cGUgcHJveHkgPSBnZXRQcm94eSgpOw0KLSAgICAgICAgdHJ5ew0KLSAgICAgICAgICAgIGV4Y2VwdGlvbiA9IG51bGw7DQotICAgICAgICAgICAgLy8gdGhlIGludm9rZSB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbiwgaWYgdGhlIHRlc3QgaXMgcGVyZm9ybWVkIHJpZ2h0DQotICAgICAgICAgICAgaW50IHRvdGFsID0gcHJveHkudGhyb3dGYXVsdCgyLCAiQmFzZUZhdWx0IiwgMik7DQotICAgICAgICAgICAgDQotICAgICAgICB9Y2F0Y2goQmFzZUZhdWx0X0V4Y2VwdGlvbiBlKXsNCi0gICAgICAgICAgICBleGNlcHRpb24gPSBlOw0KLSAgICAgICAgfSBjYXRjaCAoQ29tcGxleEZhdWx0X0V4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgZmFpbCgiU2hvdWxkIG5vdCBnZXQgQ29tcGxleEZhdWx0X0V4Y2VwdGlvbiBpbiB0aGlzIHRlc3RjYXNlIik7DQotICAgICAgICB9DQotDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgDQotICAgICAgICBhc3NlcnROb3ROdWxsKGV4Y2VwdGlvbik7DQotICAgICAgICBPYmplY3QgZmF1bHQgPSAoKEJhc2VGYXVsdF9FeGNlcHRpb24pZXhjZXB0aW9uKS5nZXRGYXVsdEluZm8oKTsNCi0gICAgICAgIGFzc2VydFRydWUoZmF1bHQuZ2V0Q2xhc3MoKSA9PSBCYXNlRmF1bHQuY2xhc3MpOw0KLSAgICAgICAgQmFzZUZhdWx0IGJmID0gKEJhc2VGYXVsdCkgZmF1bHQ7DQotICAgICAgICBhc3NlcnRUcnVlKGJmLmdldEEoKSA9PSAyKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gUmVwZWF0IHRvIHZlcmlmeSANCi0gICAgICAgIHRyeXsNCi0gICAgICAgICAgICBleGNlcHRpb24gPSBudWxsOw0KLSAgICAgICAgICAgIC8vIHRoZSBpbnZva2Ugd2lsbCB0aHJvdyBhbiBleGNlcHRpb24sIGlmIHRoZSB0ZXN0IGlzIHBlcmZvcm1lZCByaWdodA0KLSAgICAgICAgICAgIGludCB0b3RhbCA9IHByb3h5LnRocm93RmF1bHQoMiwgIkJhc2VGYXVsdCIsIDIpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgfWNhdGNoKEJhc2VGYXVsdF9FeGNlcHRpb24gZSl7DQotICAgICAgICAgICAgZXhjZXB0aW9uID0gZTsNCi0gICAgICAgIH0gY2F0Y2ggKENvbXBsZXhGYXVsdF9FeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGZhaWwoIlNob3VsZCBub3QgZ2V0IENvbXBsZXhGYXVsdF9FeGNlcHRpb24gaW4gdGhpcyB0ZXN0Y2FzZSIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIA0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChleGNlcHRpb24pOw0KLSAgICAgICAgZmF1bHQgPSAoKEJhc2VGYXVsdF9FeGNlcHRpb24pZXhjZXB0aW9uKS5nZXRGYXVsdEluZm8oKTsNCi0gICAgICAgIGFzc2VydFRydWUoZmF1bHQuZ2V0Q2xhc3MoKSA9PSBCYXNlRmF1bHQuY2xhc3MpOw0KLSAgICAgICAgYmYgPSAoQmFzZUZhdWx0KSBmYXVsdDsNCi0gICAgICAgIGFzc2VydFRydWUoYmYuZ2V0QSgpID09IDIpOw0KLSAgICAgICAgDQotICAgIH0NCi0gICAgLyoqDQotICAgICAqIFRlc3RzIHRoYXQgdGhhdCBCYXNlRmF1bHQgKERlcml2ZWRGYXVsdDEpIGlzIHRocm93bg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdEZhdWx0c1NlcnZpY2UxKCkgew0KLSAgICAgICAgRmF1bHRzU2VydmljZVBvcnRUeXBlIHByb3h5ID0gZ2V0UHJveHkoKTsNCi0gICAgICAgIEV4Y2VwdGlvbiBleGNlcHRpb24gPSBudWxsOw0KLSAgICAgICAgdHJ5ew0KLSAgICAgICAgICAgIGV4Y2VwdGlvbiA9IG51bGw7DQotICAgICAgICAgICAgLy8gdGhlIGludm9rZSB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbiwgaWYgdGhlIHRlc3QgaXMgcGVyZm9ybWVkIHJpZ2h0DQotICAgICAgICAgICAgaW50IHRvdGFsID0gcHJveHkudGhyb3dGYXVsdCgyLCAiRGVyaXZlZEZhdWx0MSIsIDIpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgfWNhdGNoKEJhc2VGYXVsdF9FeGNlcHRpb24gZSl7DQotICAgICAgICAgICAgZXhjZXB0aW9uID0gZTsNCi0gICAgICAgIH0gY2F0Y2ggKENvbXBsZXhGYXVsdF9FeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGZhaWwoIlNob3VsZCBub3QgZ2V0IENvbXBsZXhGYXVsdF9FeGNlcHRpb24gaW4gdGhpcyB0ZXN0Y2FzZSIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIA0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChleGNlcHRpb24pOw0KLSAgICAgICAgT2JqZWN0IGZhdWx0ID0gKChCYXNlRmF1bHRfRXhjZXB0aW9uKWV4Y2VwdGlvbikuZ2V0RmF1bHRJbmZvKCk7DQotICAgICAgICBhc3NlcnRUcnVlKGZhdWx0LmdldENsYXNzKCkgPT0gRGVyaXZlZEZhdWx0MS5jbGFzcyk7DQotICAgICAgICBEZXJpdmVkRmF1bHQxIGRmID0gKERlcml2ZWRGYXVsdDEpIGZhdWx0Ow0KLSAgICAgICAgYXNzZXJ0VHJ1ZShkZi5nZXRBKCkgPT0gMik7DQotICAgICAgICBhc3NlcnRUcnVlKGRmLmdldEIoKS5lcXVhbHMoIkRlcml2ZWRGYXVsdDEiKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIFJlcGVhdCB0byB2ZXJpZnkgYmVoYXZpb3INCi0gICAgICAgIHRyeXsNCi0gICAgICAgICAgICBleGNlcHRpb24gPSBudWxsOw0KLSAgICAgICAgICAgIC8vIHRoZSBpbnZva2Ugd2lsbCB0aHJvdyBhbiBleGNlcHRpb24sIGlmIHRoZSB0ZXN0IGlzIHBlcmZvcm1lZCByaWdodA0KLSAgICAgICAgICAgIGludCB0b3RhbCA9IHByb3h5LnRocm93RmF1bHQoMiwgIkRlcml2ZWRGYXVsdDEiLCAyKTsNCi0gICAgICAgICAgICANCi0gICAgICAgIH1jYXRjaChCYXNlRmF1bHRfRXhjZXB0aW9uIGUpew0KLSAgICAgICAgICAgIGV4Y2VwdGlvbiA9IGU7DQotICAgICAgICB9IGNhdGNoIChDb21wbGV4RmF1bHRfRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBmYWlsKCJTaG91bGQgbm90IGdldCBDb21wbGV4RmF1bHRfRXhjZXB0aW9uIGluIHRoaXMgdGVzdGNhc2UiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICANCi0gICAgICAgIGFzc2VydE5vdE51bGwoZXhjZXB0aW9uKTsNCi0gICAgICAgIGZhdWx0ID0gKChCYXNlRmF1bHRfRXhjZXB0aW9uKWV4Y2VwdGlvbikuZ2V0RmF1bHRJbmZvKCk7DQotICAgICAgICBhc3NlcnRUcnVlKGZhdWx0LmdldENsYXNzKCkgPT0gRGVyaXZlZEZhdWx0MS5jbGFzcyk7DQotICAgICAgICBkZiA9IChEZXJpdmVkRmF1bHQxKSBmYXVsdDsNCi0gICAgICAgIGFzc2VydFRydWUoZGYuZ2V0QSgpID09IDIpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShkZi5nZXRCKCkuZXF1YWxzKCJEZXJpdmVkRmF1bHQxIikpOw0KLSAgICAgICAgDQotICAgIH0NCi0gICAgLyoqDQotICAgICAqIFRlc3RzIHRoYXQgdGhhdCBCYXNlRmF1bHQgKERlcml2ZWRGYXVsdDEpIGlzIHRocm93bg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdEZhdWx0c1NlcnZpY2UyKCkgew0KLSAgICAgICAgRmF1bHRzU2VydmljZVBvcnRUeXBlIHByb3h5ID0gZ2V0UHJveHkoKTsNCi0gICAgICAgIEV4Y2VwdGlvbiBleGNlcHRpb24gPSBudWxsOw0KLSAgICAgICAgdHJ5ew0KLSAgICAgICAgICAgIGV4Y2VwdGlvbiA9IG51bGw7DQotICAgICAgICAgICAgLy8gdGhlIGludm9rZSB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbiwgaWYgdGhlIHRlc3QgaXMgcGVyZm9ybWVkIHJpZ2h0DQotICAgICAgICAgICAgaW50IHRvdGFsID0gcHJveHkudGhyb3dGYXVsdCgyLCAiRGVyaXZlZEZhdWx0MiIsIDIpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgfWNhdGNoKEJhc2VGYXVsdF9FeGNlcHRpb24gZSl7DQotICAgICAgICAgICAgZXhjZXB0aW9uID0gZTsNCi0gICAgICAgIH0gY2F0Y2ggKENvbXBsZXhGYXVsdF9FeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGZhaWwoIlNob3VsZCBub3QgZ2V0IENvbXBsZXhGYXVsdF9FeGNlcHRpb24gaW4gdGhpcyB0ZXN0Y2FzZSIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIA0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChleGNlcHRpb24pOw0KLSAgICAgICAgT2JqZWN0IGZhdWx0ID0gKChCYXNlRmF1bHRfRXhjZXB0aW9uKWV4Y2VwdGlvbikuZ2V0RmF1bHRJbmZvKCk7DQotICAgICAgICBhc3NlcnRUcnVlKGZhdWx0LmdldENsYXNzKCkgPT0gRGVyaXZlZEZhdWx0Mi5jbGFzcyk7DQotICAgICAgICBEZXJpdmVkRmF1bHQyIGRmID0gKERlcml2ZWRGYXVsdDIpIGZhdWx0Ow0KLSAgICAgICAgYXNzZXJ0VHJ1ZShkZi5nZXRBKCkgPT0gMik7DQotICAgICAgICBhc3NlcnRUcnVlKGRmLmdldEIoKS5lcXVhbHMoIkRlcml2ZWRGYXVsdDIiKSk7ICANCi0gICAgICAgIGFzc2VydFRydWUoZGYuZ2V0QygpID09IDIpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBSZXBlYXQgdG8gdmVyaWZ5IGJlaGF2aW9yDQotICAgICAgICB0cnl7DQotICAgICAgICAgICAgZXhjZXB0aW9uID0gbnVsbDsNCi0gICAgICAgICAgICAvLyB0aGUgaW52b2tlIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uLCBpZiB0aGUgdGVzdCBpcyBwZXJmb3JtZWQgcmlnaHQNCi0gICAgICAgICAgICBpbnQgdG90YWwgPSBwcm94eS50aHJvd0ZhdWx0KDIsICJEZXJpdmVkRmF1bHQyIiwgMik7DQotICAgICAgICAgICAgDQotICAgICAgICB9Y2F0Y2goQmFzZUZhdWx0X0V4Y2VwdGlvbiBlKXsNCi0gICAgICAgICAgICBleGNlcHRpb24gPSBlOw0KLSAgICAgICAgfSBjYXRjaCAoQ29tcGxleEZhdWx0X0V4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgZmFpbCgiU2hvdWxkIG5vdCBnZXQgQ29tcGxleEZhdWx0X0V4Y2VwdGlvbiBpbiB0aGlzIHRlc3RjYXNlIik7DQotICAgICAgICB9DQotDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgDQotICAgICAgICBhc3NlcnROb3ROdWxsKGV4Y2VwdGlvbik7DQotICAgICAgICBmYXVsdCA9ICgoQmFzZUZhdWx0X0V4Y2VwdGlvbilleGNlcHRpb24pLmdldEZhdWx0SW5mbygpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShmYXVsdC5nZXRDbGFzcygpID09IERlcml2ZWRGYXVsdDIuY2xhc3MpOw0KLSAgICAgICAgZGYgPSAoRGVyaXZlZEZhdWx0MikgZmF1bHQ7DQotICAgICAgICBhc3NlcnRUcnVlKGRmLmdldEEoKSA9PSAyKTsNCi0gICAgICAgIGFzc2VydFRydWUoZGYuZ2V0QigpLmVxdWFscygiRGVyaXZlZEZhdWx0MiIpKTsgIA0KLSAgICAgICAgYXNzZXJ0VHJ1ZShkZi5nZXRDKCkgPT0gMik7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBUZXN0cyB0aGF0IHRoYXQgQ29tcGx4RmF1bHRGYXVsdCBpcyB0aHJvd24gDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmF1bHRzU2VydmljZTMoKXsNCi0gICAgICAgIEZhdWx0c1NlcnZpY2VQb3J0VHlwZSBwcm94eSA9IGdldFByb3h5KCk7DQotICAgICAgICBFeGNlcHRpb24gZXhjZXB0aW9uID0gbnVsbDsNCi0gICAgICAgIHRyeXsNCi0gICAgICAgICAgICBleGNlcHRpb24gPSBudWxsOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIHRoZSBpbnZva2Ugd2lsbCB0aHJvdyBhbiBleGNlcHRpb24sIGlmIHRoZSB0ZXN0IGlzIHBlcmZvcm1lZCByaWdodA0KLSAgICAgICAgICAgIGludCB0b3RhbCA9IHByb3h5LnRocm93RmF1bHQoMiwgIkNvbXBsZXgiLCAyKTsgIC8vICJDb21wbGV4IiB3aWxsIGNhdXNlIHNlcnZpY2UgdG8gdGhyb3cgQ29tcGxleEZhdWx0X0V4Y2VwdGlvbg0KLSAgICAgICAgICAgIA0KLSAgICAgICAgfWNhdGNoKEJhc2VGYXVsdF9FeGNlcHRpb24gZSl7DQotICAgICAgICAgICAgZmFpbCgiU2hvdWxkIG5vdCBnZXQgQmFzZUZhdWx0X0V4Y2VwdGlvbiBpbiB0aGlzIHRlc3RjYXNlIik7DQotICAgICAgICB9IGNhdGNoIChDb21wbGV4RmF1bHRfRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBleGNlcHRpb24gPSBlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIA0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChleGNlcHRpb24pOw0KLSAgICAgICAgT2JqZWN0IGZhdWx0ID0gKChDb21wbGV4RmF1bHRfRXhjZXB0aW9uKWV4Y2VwdGlvbikuZ2V0RmF1bHRJbmZvKCk7DQotICAgICAgICBhc3NlcnRUcnVlKGZhdWx0LmdldENsYXNzKCkgPT0gQ29tcGxleEZhdWx0LmNsYXNzKTsNCi0gICAgICAgIENvbXBsZXhGYXVsdCBjZiA9IChDb21wbGV4RmF1bHQpIGZhdWx0Ow0KLSAgICAgICAgYXNzZXJ0VHJ1ZShjZi5nZXRBKCkgPT0gMik7DQotICAgICAgICBhc3NlcnRUcnVlKGNmLmdldEIoKS5lcXVhbHMoIkNvbXBsZXgiKSk7ICANCi0gICAgICAgIGFzc2VydFRydWUoY2YuZ2V0QygpID09IDIpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShjZi5nZXREKCkgPT0gNSk7DQotICAgICAgICANCi0gICAgICAgIA0KLSAgICAgICAgLy8gUmVwZWF0IHRvIHZlcmlmeSBiZWhhdmlvcg0KLSAgICAgICAgdHJ5ew0KLSAgICAgICAgICAgIGV4Y2VwdGlvbiA9IG51bGw7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gdGhlIGludm9rZSB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbiwgaWYgdGhlIHRlc3QgaXMgcGVyZm9ybWVkIHJpZ2h0DQotICAgICAgICAgICAgaW50IHRvdGFsID0gcHJveHkudGhyb3dGYXVsdCgyLCAiQ29tcGxleCIsIDIpOyAgLy8gIkNvbXBsZXgiIHdpbGwgY2F1c2Ugc2VydmljZSB0byB0aHJvdyBDb21wbGV4RmF1bHRfRXhjZXB0aW9uDQotICAgICAgICAgICAgDQotICAgICAgICB9Y2F0Y2goQmFzZUZhdWx0X0V4Y2VwdGlvbiBlKXsNCi0gICAgICAgICAgICBmYWlsKCJTaG91bGQgbm90IGdldCBCYXNlRmF1bHRfRXhjZXB0aW9uIGluIHRoaXMgdGVzdGNhc2UiKTsNCi0gICAgICAgIH0gY2F0Y2ggKENvbXBsZXhGYXVsdF9FeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGV4Y2VwdGlvbiA9IGU7DQotICAgICAgICB9DQotDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgDQotICAgICAgICBhc3NlcnROb3ROdWxsKGV4Y2VwdGlvbik7DQotICAgICAgICBmYXVsdCA9ICgoQ29tcGxleEZhdWx0X0V4Y2VwdGlvbilleGNlcHRpb24pLmdldEZhdWx0SW5mbygpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShmYXVsdC5nZXRDbGFzcygpID09IENvbXBsZXhGYXVsdC5jbGFzcyk7DQotICAgICAgICBjZiA9IChDb21wbGV4RmF1bHQpIGZhdWx0Ow0KLSAgICAgICAgYXNzZXJ0VHJ1ZShjZi5nZXRBKCkgPT0gMik7DQotICAgICAgICBhc3NlcnRUcnVlKGNmLmdldEIoKS5lcXVhbHMoIkNvbXBsZXgiKSk7ICANCi0gICAgICAgIGFzc2VydFRydWUoY2YuZ2V0QygpID09IDIpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShjZi5nZXREKCkgPT0gNSk7DQotICAgIH0NCi0gICAgDQotICAgIA0KLSAgICAvKioNCi0gICAgICogVGVzdHMgdGhhdCB0aHJvd2luZyBvZiBTaW1wbGVGYXVsdA0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdEZhdWx0c1NlcnZpY2U0KCl7DQotICAgICAgICBGYXVsdHNTZXJ2aWNlUG9ydFR5cGUgcHJveHkgPSBnZXRQcm94eSgpOw0KLSAgICAgICAgRXhjZXB0aW9uIGV4Y2VwdGlvbiA9IG51bGw7DQotICAgICAgICB0cnl7DQotICAgICAgICAgICAgZXhjZXB0aW9uID0gbnVsbDsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyB0aGUgaW52b2tlIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uLCBpZiB0aGUgdGVzdCBpcyBwZXJmb3JtZWQgcmlnaHQNCi0gICAgICAgICAgICBmbG9hdCB0b3RhbCA9IHByb3h5LmdldFF1b3RlKCJTTVBMIik7DQotICAgICAgICAgICAgZmFpbCggIkV4cGVjdGVkIFNpbXBsZUZhdWx0IGJ1dCBubyBmYXVsdCB3YXMgdGhyb3duICIpOw0KLSAgICAgICAgfWNhdGNoKFNpbXBsZUZhdWx0IGUpew0KLSAgICAgICAgICAgIFNpbXBsZUZhdWx0IGZhdWx0ID0gKFNpbXBsZUZhdWx0KSBlOw0KLQ0KLSAgICAgICAgICAgIGludCBmYXVsdEluZm8gPSBmYXVsdC5nZXRGYXVsdEluZm8oKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGZhdWx0SW5mbyA9PSAxMDApOw0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBmYWlsKCJXcm9uZyBleGNlcHRpb24gdGhyb3duLiAgRXhwZWN0ZWQgU2ltcGxlRmF1bHQgYnV0IHJlY2VpdmVkICIgKyBlLmdldENsYXNzKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICAvLyBSZXBlYXQgdG8gdmVyaWZ5IGJlaGF2aW9yDQotICAgICAgICB0cnl7DQotICAgICAgICAgICAgZXhjZXB0aW9uID0gbnVsbDsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyB0aGUgaW52b2tlIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uLCBpZiB0aGUgdGVzdCBpcyBwZXJmb3JtZWQgcmlnaHQNCi0gICAgICAgICAgICBmbG9hdCB0b3RhbCA9IHByb3h5LmdldFF1b3RlKCJTTVBMIik7DQotICAgICAgICAgICAgZmFpbCggIkV4cGVjdGVkIFNpbXBsZUZhdWx0IGJ1dCBubyBmYXVsdCB3YXMgdGhyb3duICIpOw0KLSAgICAgICAgfWNhdGNoKFNpbXBsZUZhdWx0IGUpew0KLSAgICAgICAgICAgIFNpbXBsZUZhdWx0IGZhdWx0ID0gKFNpbXBsZUZhdWx0KSBlOw0KLQ0KLSAgICAgICAgICAgIGludCBmYXVsdEluZm8gPSBmYXVsdC5nZXRGYXVsdEluZm8oKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGZhdWx0SW5mbyA9PSAxMDApOw0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBmYWlsKCJXcm9uZyBleGNlcHRpb24gdGhyb3duLiAgRXhwZWN0ZWQgU2ltcGxlRmF1bHQgYnV0IHJlY2VpdmVkICIgKyBlLmdldENsYXNzKCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFRlc3QgdGhyb3dpbmcgbGVnYWN5IGZhdWx0DQotICAgICAqIERpc2FibGVkIHdoaWxlIEkgZml4IHRoaXMgdGVzdA0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdEZhdWx0c1NlcnZpY2U1KCl7DQotICAgICAgICBGYXVsdHNTZXJ2aWNlUG9ydFR5cGUgcHJveHkgPSBnZXRQcm94eSgpOw0KLSAgICAgICAgRXhjZXB0aW9uIGV4Y2VwdGlvbiA9IG51bGw7DQotICAgICAgICB0cnl7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gdGhlIGludm9rZSB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbiwgaWYgdGhlIHRlc3QgaXMgcGVyZm9ybWVkIHJpZ2h0DQotICAgICAgICAgICAgZmxvYXQgdG90YWwgPSBwcm94eS5nZXRRdW90ZSgiTEVHQyIpOw0KLSAgICAgICAgICAgIGZhaWwoICJFeHBlY3RlZCBJbnZhbGlkVGlja2VyRmF1bHRfRXhjZXB0aW9uIGJ1dCBubyBmYXVsdCB3YXMgdGhyb3duICIpOw0KLSAgICAgICAgfWNhdGNoKEludmFsaWRUaWNrZXJGYXVsdF9FeGNlcHRpb24gZSl7DQotICAgICAgICAgICAgSW52YWxpZFRpY2tlckZhdWx0X0V4Y2VwdGlvbiBmYXVsdCA9IChJbnZhbGlkVGlja2VyRmF1bHRfRXhjZXB0aW9uKSBlOw0KLQ0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZmF1bHQuZ2V0TGVnYWN5RGF0YTEoKS5lcXVhbHMoIkxFR0MiKSk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShmYXVsdC5nZXRMZWdhY3lEYXRhMigpID09IDEyMyk7DQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGZhaWwoIldyb25nIGV4Y2VwdGlvbiB0aHJvd24uICBFeHBlY3RlZCBJbnZhbGlkVGlja2VyRmF1bHRfRXhjZXB0aW9uIGJ1dCByZWNlaXZlZCAiICsgZS5nZXRDbGFzcygpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgLy8gUmVwZWF0IHRvIHZlcmlmeSBiZWhhdmlvcg0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICAvLyB0aGUgaW52b2tlIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uLCBpZiB0aGUgdGVzdCBpcyBwZXJmb3JtZWQgcmlnaHQNCi0gICAgICAgICAgICBmbG9hdCB0b3RhbCA9IHByb3h5LmdldFF1b3RlKCJMRUdDIik7DQotICAgICAgICAgICAgZmFpbCggIkV4cGVjdGVkIEludmFsaWRUaWNrZXJGYXVsdF9FeGNlcHRpb24gYnV0IG5vIGZhdWx0IHdhcyB0aHJvd24gIik7DQotICAgICAgICB9Y2F0Y2goSW52YWxpZFRpY2tlckZhdWx0X0V4Y2VwdGlvbiBlKXsNCi0gICAgICAgICAgICBJbnZhbGlkVGlja2VyRmF1bHRfRXhjZXB0aW9uIGZhdWx0ID0gKEludmFsaWRUaWNrZXJGYXVsdF9FeGNlcHRpb24pIGU7DQotDQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShmYXVsdC5nZXRMZWdhY3lEYXRhMSgpLmVxdWFscygiTEVHQyIpKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGZhdWx0LmdldExlZ2FjeURhdGEyKCkgPT0gMTIzKTsNCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgZmFpbCgiV3JvbmcgZXhjZXB0aW9uIHRocm93bi4gIEV4cGVjdGVkIEludmFsaWRUaWNrZXJGYXVsdF9FeGNlcHRpb24gYnV0IHJlY2VpdmVkICIgKyBlLmdldENsYXNzKCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogVGVzdHMgdGhhdCB0aHJvd2luZyBvZiBCYXNlRmF1bHRfRXhjZXB0aW9uDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmF1bHRzU2VydmljZTYoKXsNCi0gICAgICAgIEZhdWx0c1NlcnZpY2VQb3J0VHlwZSBwcm94eSA9IGdldFByb3h5KCk7DQotICAgICAgICBFeGNlcHRpb24gZXhjZXB0aW9uID0gbnVsbDsNCi0gICAgICAgIHRyeXsNCi0gICAgICAgICAgICAvLyB0aGUgaW52b2tlIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uLCBpZiB0aGUgdGVzdCBpcyBwZXJmb3JtZWQgcmlnaHQNCi0gICAgICAgICAgICBmbG9hdCB0b3RhbCA9IHByb3h5LmdldFF1b3RlKCJCQVNFIik7DQotICAgICAgICAgICAgZmFpbCggIkV4cGVjdGVkIEJhc2VGYXVsdF9FeGNlcHRpb24gYnV0IG5vIGZhdWx0IHdhcyB0aHJvd24gIik7DQotICAgICAgICB9Y2F0Y2goQmFzZUZhdWx0X0V4Y2VwdGlvbiBlKXsNCi0gICAgICAgICAgICBCYXNlRmF1bHRfRXhjZXB0aW9uIGZhdWx0ID0gKEJhc2VGYXVsdF9FeGNlcHRpb24pIGU7DQotDQotICAgICAgICAgICAgQmFzZUZhdWx0IGZhdWx0SW5mbyA9IGZhdWx0LmdldEZhdWx0SW5mbygpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZmF1bHRJbmZvICE9IG51bGwpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZmF1bHRJbmZvLmdldEEoKSA9PSA0MDApOw0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBmYWlsKCJXcm9uZyBleGNlcHRpb24gdGhyb3duLiAgRXhwZWN0ZWQgQmFzZUZhdWx0X0V4Y2VwdGlvbiBidXQgcmVjZWl2ZWQgIiArIGUuZ2V0Q2xhc3MoKSk7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIC8vIFJlcGVhdCB0byB2ZXJpZnkgYmVoYXZpb3INCi0gICAgICAgIHRyeXsNCi0gICAgICAgICAgICAvLyB0aGUgaW52b2tlIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uLCBpZiB0aGUgdGVzdCBpcyBwZXJmb3JtZWQgcmlnaHQNCi0gICAgICAgICAgICBmbG9hdCB0b3RhbCA9IHByb3h5LmdldFF1b3RlKCJCQVNFIik7DQotICAgICAgICAgICAgZmFpbCggIkV4cGVjdGVkIEJhc2VGYXVsdF9FeGNlcHRpb24gYnV0IG5vIGZhdWx0IHdhcyB0aHJvd24gIik7DQotICAgICAgICB9Y2F0Y2goQmFzZUZhdWx0X0V4Y2VwdGlvbiBlKXsNCi0gICAgICAgICAgICBCYXNlRmF1bHRfRXhjZXB0aW9uIGZhdWx0ID0gKEJhc2VGYXVsdF9FeGNlcHRpb24pIGU7DQotDQotICAgICAgICAgICAgQmFzZUZhdWx0IGZhdWx0SW5mbyA9IGZhdWx0LmdldEZhdWx0SW5mbygpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZmF1bHRJbmZvICE9IG51bGwpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZmF1bHRJbmZvLmdldEEoKSA9PSA0MDApOw0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBmYWlsKCJXcm9uZyBleGNlcHRpb24gdGhyb3duLiAgRXhwZWN0ZWQgQmFzZUZhdWx0X0V4Y2VwdGlvbiBidXQgcmVjZWl2ZWQgIiArIGUuZ2V0Q2xhc3MoKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFRlc3RzIHRoYXQgdGhyb3dpbmcgb2YgRGVyaXZlZEZhdWx0MV9FeGNlcHRpb24NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RGYXVsdHNTZXJ2aWNlNygpew0KLSAgICAgICAgRmF1bHRzU2VydmljZVBvcnRUeXBlIHByb3h5ID0gZ2V0UHJveHkoKTsNCi0gICAgICAgIEV4Y2VwdGlvbiBleGNlcHRpb24gPSBudWxsOw0KLSAgICAgICAgdHJ5ew0KLSAgICAgICAgICAgIC8vIHRoZSBpbnZva2Ugd2lsbCB0aHJvdyBhbiBleGNlcHRpb24sIGlmIHRoZSB0ZXN0IGlzIHBlcmZvcm1lZCByaWdodA0KLSAgICAgICAgICAgIGZsb2F0IHRvdGFsID0gcHJveHkuZ2V0UXVvdGUoIkRGMSIpOw0KLSAgICAgICAgICAgIGZhaWwoICJFeHBlY3RlZCBEZXJpdmVkRmF1bHQxX0V4Y2VwdGlvbiBidXQgbm8gZmF1bHQgd2FzIHRocm93biIpOw0KLSAgICAgICAgfWNhdGNoKERlcml2ZWRGYXVsdDFfRXhjZXB0aW9uIGUpew0KLSAgICAgICAgICAgIERlcml2ZWRGYXVsdDFfRXhjZXB0aW9uIGZhdWx0ID0gKERlcml2ZWRGYXVsdDFfRXhjZXB0aW9uKSBlOw0KLQ0KLSAgICAgICAgICAgIERlcml2ZWRGYXVsdDEgZmF1bHRJbmZvID0gZmF1bHQuZ2V0RmF1bHRJbmZvKCk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShmYXVsdEluZm8gIT0gbnVsbCk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShmYXVsdEluZm8uZ2V0QSgpID09IDEwMCk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShmYXVsdEluZm8uZ2V0QigpLmVxdWFscygiREYxIikpOw0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBmYWlsKCJXcm9uZyBleGNlcHRpb24gdGhyb3duLiAgRXhwZWN0ZWQgRGVyaXZlZEZhdWx0MV9FeGNlcHRpb24gYnV0IHJlY2VpdmVkICIgKyBlLmdldENsYXNzKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICAvLyBSZXBlYXQgdG8gdmVyaWZ5IGJlaGF2aW9yDQotICAgICAgICB0cnl7DQotICAgICAgICAgICAgLy8gdGhlIGludm9rZSB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbiwgaWYgdGhlIHRlc3QgaXMgcGVyZm9ybWVkIHJpZ2h0DQotICAgICAgICAgICAgZmxvYXQgdG90YWwgPSBwcm94eS5nZXRRdW90ZSgiREYxIik7DQotICAgICAgICAgICAgZmFpbCggIkV4cGVjdGVkIERlcml2ZWRGYXVsdDFfRXhjZXB0aW9uIGJ1dCBubyBmYXVsdCB3YXMgdGhyb3duIik7DQotICAgICAgICB9Y2F0Y2goRGVyaXZlZEZhdWx0MV9FeGNlcHRpb24gZSl7DQotICAgICAgICAgICAgRGVyaXZlZEZhdWx0MV9FeGNlcHRpb24gZmF1bHQgPSAoRGVyaXZlZEZhdWx0MV9FeGNlcHRpb24pIGU7DQotDQotICAgICAgICAgICAgRGVyaXZlZEZhdWx0MSBmYXVsdEluZm8gPSBmYXVsdC5nZXRGYXVsdEluZm8oKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGZhdWx0SW5mbyAhPSBudWxsKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGZhdWx0SW5mby5nZXRBKCkgPT0gMTAwKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGZhdWx0SW5mby5nZXRCKCkuZXF1YWxzKCJERjEiKSk7DQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGZhaWwoIldyb25nIGV4Y2VwdGlvbiB0aHJvd24uICBFeHBlY3RlZCBEZXJpdmVkRmF1bHQxX0V4Y2VwdGlvbiBidXQgcmVjZWl2ZWQgIiArIGUuZ2V0Q2xhc3MoKSk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBUZXN0cyB0aGF0IHRocm93aW5nIG9mIERlcml2ZWRGYXVsdDFfRXhjZXB0aW9uDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmF1bHRzU2VydmljZTgoKXsNCi0gICAgICAgIEZhdWx0c1NlcnZpY2VQb3J0VHlwZSBwcm94eSA9IGdldFByb3h5KCk7DQotICAgICAgICBFeGNlcHRpb24gZXhjZXB0aW9uID0gbnVsbDsNCi0gICAgICAgIHRyeXsNCi0gICAgICAgICAgICAvLyB0aGUgaW52b2tlIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uLCBpZiB0aGUgdGVzdCBpcyBwZXJmb3JtZWQgcmlnaHQNCi0gICAgICAgICAgICBmbG9hdCB0b3RhbCA9IHByb3h5LmdldFF1b3RlKCJERjIiKTsNCi0gICAgICAgICAgICBmYWlsKCAiRXhwZWN0ZWQgRGVyaXZlZEZhdWx0Ml9FeGNlcHRpb24gYnV0IG5vIGZhdWx0IHdhcyB0aHJvd24gIik7DQotICAgICAgICB9Y2F0Y2goRGVyaXZlZEZhdWx0Ml9FeGNlcHRpb24gZSl7DQotICAgICAgICAgICAgRGVyaXZlZEZhdWx0Ml9FeGNlcHRpb24gZmF1bHQgPSAoRGVyaXZlZEZhdWx0Ml9FeGNlcHRpb24pIGU7DQotDQotICAgICAgICAgICAgRGVyaXZlZEZhdWx0MiBmYXVsdEluZm8gPSBmYXVsdC5nZXRGYXVsdEluZm8oKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGZhdWx0SW5mbyAhPSBudWxsKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGZhdWx0SW5mby5nZXRBKCkgPT0gMjAwKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGZhdWx0SW5mby5nZXRCKCkuZXF1YWxzKCJERjIiKSk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShmYXVsdEluZm8uZ2V0QygpID09IDgwLjBGKTsNCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgZmFpbCgiV3JvbmcgZXhjZXB0aW9uIHRocm93bi4gIEV4cGVjdGVkIERlcml2ZWRGYXVsdDFfRXhjZXB0aW9uIGJ1dCByZWNlaXZlZCAiICsgZS5nZXRDbGFzcygpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgLy8gUmVwZWF0IHRvIHZlcmlmeSBiZWhhdmlvcg0KLSAgICAgICAgdHJ5ew0KLSAgICAgICAgICAgIC8vIHRoZSBpbnZva2Ugd2lsbCB0aHJvdyBhbiBleGNlcHRpb24sIGlmIHRoZSB0ZXN0IGlzIHBlcmZvcm1lZCByaWdodA0KLSAgICAgICAgICAgIGZsb2F0IHRvdGFsID0gcHJveHkuZ2V0UXVvdGUoIkRGMiIpOw0KLSAgICAgICAgICAgIGZhaWwoICJFeHBlY3RlZCBEZXJpdmVkRmF1bHQyX0V4Y2VwdGlvbiBidXQgbm8gZmF1bHQgd2FzIHRocm93biAiKTsNCi0gICAgICAgIH1jYXRjaChEZXJpdmVkRmF1bHQyX0V4Y2VwdGlvbiBlKXsNCi0gICAgICAgICAgICBEZXJpdmVkRmF1bHQyX0V4Y2VwdGlvbiBmYXVsdCA9IChEZXJpdmVkRmF1bHQyX0V4Y2VwdGlvbikgZTsNCi0NCi0gICAgICAgICAgICBEZXJpdmVkRmF1bHQyIGZhdWx0SW5mbyA9IGZhdWx0LmdldEZhdWx0SW5mbygpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZmF1bHRJbmZvICE9IG51bGwpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZmF1bHRJbmZvLmdldEEoKSA9PSAyMDApOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZmF1bHRJbmZvLmdldEIoKS5lcXVhbHMoIkRGMiIpKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGZhdWx0SW5mby5nZXRDKCkgPT0gODAuMEYpOw0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBmYWlsKCJXcm9uZyBleGNlcHRpb24gdGhyb3duLiAgRXhwZWN0ZWQgRGVyaXZlZEZhdWx0MV9FeGNlcHRpb24gYnV0IHJlY2VpdmVkICIgKyBlLmdldENsYXNzKCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogVGVzdHMgdGhhdCB0aGF0IFNPQVBGYXVsdEV4Y2VwdGlvbiBpcyB0aHJvd24gDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmF1bHRzU2VydmljZTlhKCl7DQotICAgICAgICBGYXVsdHNTZXJ2aWNlUG9ydFR5cGUgcHJveHkgPSBnZXRQcm94eSgpOw0KLSAgICAgICAgRXhjZXB0aW9uIGV4Y2VwdGlvbiA9IG51bGw7DQotICAgICAgICB0cnl7DQotICAgICAgICAgICAgZXhjZXB0aW9uID0gbnVsbDsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyB0aGUgaW52b2tlIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uLCBpZiB0aGUgdGVzdCBpcyBwZXJmb3JtZWQgcmlnaHQNCi0gICAgICAgICAgICBpbnQgdG90YWwgPSBwcm94eS50aHJvd0ZhdWx0KDIsICJTT0FQRmF1bHRFeGNlcHRpb24iLCAyKTsgIC8vICJTT0FQRmF1bHRFeGNlcHRpb24iIHdpbGwgY2F1c2Ugc2VydmljZSB0byB0aHJvdyBTT0FQRmF1bHRFeGNlcHRpb24NCi0gICAgICAgICAgICANCi0gICAgICAgIH1jYXRjaChTT0FQRmF1bHRFeGNlcHRpb24gZSl7DQotICAgICAgICAgICAgLy8gT2theQ0KLSAgICAgICAgICAgIGV4Y2VwdGlvbiA9IGU7DQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGZhaWwoIkRpZCBub3QgZ2V0IGEgU09BUEZhdWx0RXhjZXB0aW9uIik7DQotICAgICAgICB9DQotDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgDQotICAgICAgICBhc3NlcnROb3ROdWxsKGV4Y2VwdGlvbik7DQotICAgICAgICBTT0FQRmF1bHRFeGNlcHRpb24gc2ZlID0gKFNPQVBGYXVsdEV4Y2VwdGlvbikgZXhjZXB0aW9uOw0KLSAgICAgICAgU09BUEZhdWx0IHNvYXBGYXVsdCA9IHNmZS5nZXRGYXVsdCgpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShzb2FwRmF1bHQgIT0gbnVsbCk7DQotICAgICAgICBhc3NlcnRUcnVlKHNvYXBGYXVsdC5nZXRGYXVsdFN0cmluZygpLmVxdWFscygiaGVsbG8gd29ybGQiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHNvYXBGYXVsdC5nZXRGYXVsdEFjdG9yKCkuZXF1YWxzKCJhY3RvciIpKTsNCi0gICAgICAgIGFzc2VydFRydWUoc29hcEZhdWx0LmdldERldGFpbCgpID09IG51bGwpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBSZXBlYXQgdG8gdmVyaWZ5IGJlaGF2aW9yDQotICAgICAgICB0cnl7DQotICAgICAgICAgICAgZXhjZXB0aW9uID0gbnVsbDsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyB0aGUgaW52b2tlIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uLCBpZiB0aGUgdGVzdCBpcyBwZXJmb3JtZWQgcmlnaHQNCi0gICAgICAgICAgICBpbnQgdG90YWwgPSBwcm94eS50aHJvd0ZhdWx0KDIsICJTT0FQRmF1bHRFeGNlcHRpb24iLCAyKTsgIC8vICJTT0FQRmF1bHRFeGNlcHRpb24iIHdpbGwgY2F1c2Ugc2VydmljZSB0byB0aHJvdyBTT0FQRmF1bHRFeGNlcHRpb24NCi0gICAgICAgICAgICANCi0gICAgICAgIH1jYXRjaChTT0FQRmF1bHRFeGNlcHRpb24gZSl7DQotICAgICAgICAgICAgLy8gT2theQ0KLSAgICAgICAgICAgIGV4Y2VwdGlvbiA9IGU7DQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGZhaWwoIkRpZCBub3QgZ2V0IGEgU09BUEZhdWx0RXhjZXB0aW9uIik7DQotICAgICAgICB9DQotDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgDQotICAgICAgICBhc3NlcnROb3ROdWxsKGV4Y2VwdGlvbik7DQotICAgICAgICBzZmUgPSAoU09BUEZhdWx0RXhjZXB0aW9uKSBleGNlcHRpb247DQotICAgICAgICBzb2FwRmF1bHQgPSBzZmUuZ2V0RmF1bHQoKTsNCi0gICAgICAgIGFzc2VydFRydWUoc29hcEZhdWx0ICE9IG51bGwpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShzb2FwRmF1bHQuZ2V0RmF1bHRTdHJpbmcoKS5lcXVhbHMoImhlbGxvIHdvcmxkIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShzb2FwRmF1bHQuZ2V0RmF1bHRBY3RvcigpLmVxdWFscygiYWN0b3IiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHNvYXBGYXVsdC5nZXREZXRhaWwoKSA9PSBudWxsKTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFRlc3RzIHRoYXQgdGhhdCBTT0FQRmF1bHRFeGNlcHRpb24gaXMgdGhyb3duIA0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdEZhdWx0c1NlcnZpY2U5Yigpew0KLSAgICAgICAgRmF1bHRzU2VydmljZVBvcnRUeXBlIHByb3h5ID0gZ2V0UHJveHkoKTsNCi0gICAgICAgIEV4Y2VwdGlvbiBleGNlcHRpb24gPSBudWxsOw0KLSAgICAgICAgdHJ5ew0KLSAgICAgICAgICAgIGV4Y2VwdGlvbiA9IG51bGw7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gdGhlIGludm9rZSB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbiwgaWYgdGhlIHRlc3QgaXMgcGVyZm9ybWVkIHJpZ2h0DQotICAgICAgICAgICAgaW50IHRvdGFsID0gcHJveHkudGhyb3dGYXVsdCgyLCAiU09BUEZhdWx0RXhjZXB0aW9uMiIsIDIpOyAgLy8gIlNPQVBGYXVsdEV4Y2VwdGlvbiIgd2lsbCBjYXVzZSBzZXJ2aWNlIHRvIHRocm93IFNPQVBGYXVsdEV4Y2VwdGlvbg0KLSAgICAgICAgICAgIA0KLSAgICAgICAgfWNhdGNoKFNPQVBGYXVsdEV4Y2VwdGlvbiBlKXsNCi0gICAgICAgICAgICAvLyBPa2F5DQotICAgICAgICAgICAgZXhjZXB0aW9uID0gZTsNCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgZmFpbCgiRGlkIG5vdCBnZXQgYSBTT0FQRmF1bHRFeGNlcHRpb24iKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICANCi0gICAgICAgIGFzc2VydE5vdE51bGwoZXhjZXB0aW9uKTsNCi0gICAgICAgIFNPQVBGYXVsdEV4Y2VwdGlvbiBzZmUgPSAoU09BUEZhdWx0RXhjZXB0aW9uKSBleGNlcHRpb247DQotICAgICAgICBTT0FQRmF1bHQgc29hcEZhdWx0ID0gc2ZlLmdldEZhdWx0KCk7DQotICAgICAgICBhc3NlcnRUcnVlKHNvYXBGYXVsdCAhPSBudWxsKTsNCi0gICAgICAgIGFzc2VydFRydWUoc29hcEZhdWx0LmdldEZhdWx0U3RyaW5nKCkuZXF1YWxzKCJoZWxsbyB3b3JsZDIiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHNvYXBGYXVsdC5nZXRGYXVsdEFjdG9yKCkuZXF1YWxzKCJhY3RvcjIiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHNvYXBGYXVsdC5nZXREZXRhaWwoKSAhPSBudWxsKTsNCi0gICAgICAgIERldGFpbEVudHJ5IGRlID0gKERldGFpbEVudHJ5KSBzb2FwRmF1bHQuZ2V0RGV0YWlsKCkuZ2V0RGV0YWlsRW50cmllcygpLm5leHQoKTsNCi0gICAgICAgIGFzc2VydFRydWUoZGUgIT0gbnVsbCk7DQotICAgICAgICBhc3NlcnRUcnVlKGRlLmdldE5hbWVzcGFjZVVSSSgpLmVxdWFscygidXJuOi8vc2FtcGxlIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShkZS5nZXRMb2NhbE5hbWUoKS5lcXVhbHMoImRldGFpbEVudHJ5IikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShkZS5nZXRWYWx1ZSgpLmVxdWFscygiVGV4YXMiKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIFJlcGVhdCB0byB2ZXJpZnkgYmVoYXZpb3INCi0gICAgICAgIHRyeXsNCi0gICAgICAgICAgICBleGNlcHRpb24gPSBudWxsOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIHRoZSBpbnZva2Ugd2lsbCB0aHJvdyBhbiBleGNlcHRpb24sIGlmIHRoZSB0ZXN0IGlzIHBlcmZvcm1lZCByaWdodA0KLSAgICAgICAgICAgIGludCB0b3RhbCA9IHByb3h5LnRocm93RmF1bHQoMiwgIlNPQVBGYXVsdEV4Y2VwdGlvbjIiLCAyKTsgIC8vICJTT0FQRmF1bHRFeGNlcHRpb24iIHdpbGwgY2F1c2Ugc2VydmljZSB0byB0aHJvdyBTT0FQRmF1bHRFeGNlcHRpb24NCi0gICAgICAgICAgICANCi0gICAgICAgIH1jYXRjaChTT0FQRmF1bHRFeGNlcHRpb24gZSl7DQotICAgICAgICAgICAgLy8gT2theQ0KLSAgICAgICAgICAgIGV4Y2VwdGlvbiA9IGU7DQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGZhaWwoIkRpZCBub3QgZ2V0IGEgU09BUEZhdWx0RXhjZXB0aW9uIik7DQotICAgICAgICB9DQotDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgDQotICAgICAgICBhc3NlcnROb3ROdWxsKGV4Y2VwdGlvbik7DQotICAgICAgICBzZmUgPSAoU09BUEZhdWx0RXhjZXB0aW9uKSBleGNlcHRpb247DQotICAgICAgICBzb2FwRmF1bHQgPSBzZmUuZ2V0RmF1bHQoKTsNCi0gICAgICAgIGFzc2VydFRydWUoc29hcEZhdWx0ICE9IG51bGwpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShzb2FwRmF1bHQuZ2V0RmF1bHRTdHJpbmcoKS5lcXVhbHMoImhlbGxvIHdvcmxkMiIpKTsNCi0gICAgICAgIGFzc2VydFRydWUoc29hcEZhdWx0LmdldEZhdWx0QWN0b3IoKS5lcXVhbHMoImFjdG9yMiIpKTsNCi0gICAgICAgIGFzc2VydFRydWUoc29hcEZhdWx0LmdldERldGFpbCgpICE9IG51bGwpOw0KLSAgICAgICAgZGUgPSAoRGV0YWlsRW50cnkpIHNvYXBGYXVsdC5nZXREZXRhaWwoKS5nZXREZXRhaWxFbnRyaWVzKCkubmV4dCgpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShkZSAhPSBudWxsKTsNCi0gICAgICAgIGFzc2VydFRydWUoZGUuZ2V0TmFtZXNwYWNlVVJJKCkuZXF1YWxzKCJ1cm46Ly9zYW1wbGUiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKGRlLmdldExvY2FsTmFtZSgpLmVxdWFscygiZGV0YWlsRW50cnkiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKGRlLmdldFZhbHVlKCkuZXF1YWxzKCJUZXhhcyIpKTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFRlc3RzIHRoYXQgdGhhdCBTT0FQRmF1bHRFeGNlcHRpb24gKE5QRSkgaXMgdGhyb3duIA0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdEZhdWx0c1NlcnZpY2UxMCgpew0KLSAgICAgICAgRmF1bHRzU2VydmljZVBvcnRUeXBlIHByb3h5ID0gZ2V0UHJveHkoKTsNCi0gICAgICAgIEV4Y2VwdGlvbiBleGNlcHRpb24gPSBudWxsOw0KLSAgICAgICAgdHJ5ew0KLSAgICAgICAgICAgIGV4Y2VwdGlvbiA9IG51bGw7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gdGhlIGludm9rZSB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbiwgaWYgdGhlIHRlc3QgaXMgcGVyZm9ybWVkIHJpZ2h0DQotICAgICAgICAgICAgaW50IHRvdGFsID0gcHJveHkudGhyb3dGYXVsdCgyLCAiTlBFIiwgMik7ICAvLyAiTlBFIiB3aWxsIGNhdXNlIHNlcnZpY2UgdG8gdGhyb3cgTlBFIFN5c3RlbSBFeGNlcHRpb24NCi0gICAgICAgICAgICANCi0gICAgICAgIH1jYXRjaChTT0FQRmF1bHRFeGNlcHRpb24gZSl7DQotICAgICAgICAgICAgLy8gT2theQ0KLSAgICAgICAgICAgIGV4Y2VwdGlvbiA9IGU7DQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGZhaWwoIkRpZCBub3QgZ2V0IGEgU09BUEZhdWx0RXhjZXB0aW9uIik7DQotICAgICAgICB9DQotDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgDQotICAgICAgICBhc3NlcnROb3ROdWxsKGV4Y2VwdGlvbik7DQotICAgICAgICBTT0FQRmF1bHRFeGNlcHRpb24gc2ZlID0gKFNPQVBGYXVsdEV4Y2VwdGlvbikgZXhjZXB0aW9uOw0KLSAgICAgICAgU09BUEZhdWx0IHNvYXBGYXVsdCA9IHNmZS5nZXRGYXVsdCgpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShzb2FwRmF1bHQgIT0gbnVsbCk7DQotICAgICAgICBhc3NlcnRUcnVlKHNvYXBGYXVsdC5nZXRGYXVsdFN0cmluZygpLmVxdWFscygiamF2YS5sYW5nLk51bGxQb2ludGVyRXhjZXB0aW9uIikpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBSZXBlYXQgdG8gdmVyaWZ5IGJlaGF2aW9yDQotICAgICAgICB0cnl7DQotICAgICAgICAgICAgZXhjZXB0aW9uID0gbnVsbDsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyB0aGUgaW52b2tlIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uLCBpZiB0aGUgdGVzdCBpcyBwZXJmb3JtZWQgcmlnaHQNCi0gICAgICAgICAgICBpbnQgdG90YWwgPSBwcm94eS50aHJvd0ZhdWx0KDIsICJOUEUiLCAyKTsgIC8vICJOUEUiIHdpbGwgY2F1c2Ugc2VydmljZSB0byB0aHJvdyBOUEUgU3lzdGVtIEV4Y2VwdGlvbg0KLSAgICAgICAgICAgIA0KLSAgICAgICAgfWNhdGNoKFNPQVBGYXVsdEV4Y2VwdGlvbiBlKXsNCi0gICAgICAgICAgICAvLyBPa2F5DQotICAgICAgICAgICAgZXhjZXB0aW9uID0gZTsNCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgZmFpbCgiRGlkIG5vdCBnZXQgYSBTT0FQRmF1bHRFeGNlcHRpb24iKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICANCi0gICAgICAgIGFzc2VydE5vdE51bGwoZXhjZXB0aW9uKTsNCi0gICAgICAgIHNmZSA9IChTT0FQRmF1bHRFeGNlcHRpb24pIGV4Y2VwdGlvbjsNCi0gICAgICAgIHNvYXBGYXVsdCA9IHNmZS5nZXRGYXVsdCgpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShzb2FwRmF1bHQgIT0gbnVsbCk7DQotICAgICAgICBhc3NlcnRUcnVlKHNvYXBGYXVsdC5nZXRGYXVsdFN0cmluZygpLmVxdWFscygiamF2YS5sYW5nLk51bGxQb2ludGVyRXhjZXB0aW9uIikpOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogVGVzdHMgdGhhdCB0aGF0IFNPQVBGYXVsdEV4Y2VwdGlvbiAoTlBFKSBpcyB0aHJvd24gDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmF1bHRzU2VydmljZTEwYSgpew0KLSAgICAgICAgRmF1bHRzU2VydmljZVBvcnRUeXBlIHByb3h5ID0gZ2V0UHJveHkoKTsNCi0gICAgICAgIEV4Y2VwdGlvbiBleGNlcHRpb24gPSBudWxsOw0KLSAgICAgICAgdHJ5ew0KLSAgICAgICAgICAgIGV4Y2VwdGlvbiA9IG51bGw7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gdGhlIGludm9rZSB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbiwgaWYgdGhlIHRlc3QgaXMgcGVyZm9ybWVkIHJpZ2h0DQotICAgICAgICAgICAgaW50IHRvdGFsID0gcHJveHkudGhyb3dGYXVsdCgyLCAiTlBFMiIsIDIpOyAgLy8gIk5QRSIgd2lsbCBjYXVzZSBzZXJ2aWNlIHRvIHRocm93IE5QRSBTeXN0ZW0gRXhjZXB0aW9uDQotICAgICAgICAgICAgDQotICAgICAgICB9Y2F0Y2goU09BUEZhdWx0RXhjZXB0aW9uIGUpew0KLSAgICAgICAgICAgIC8vIE9rYXkNCi0gICAgICAgICAgICBleGNlcHRpb24gPSBlOw0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBmYWlsKCJEaWQgbm90IGdldCBhIFNPQVBGYXVsdEV4Y2VwdGlvbiIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIA0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChleGNlcHRpb24pOw0KLSAgICAgICAgU09BUEZhdWx0RXhjZXB0aW9uIHNmZSA9IChTT0FQRmF1bHRFeGNlcHRpb24pIGV4Y2VwdGlvbjsNCi0gICAgICAgIFNPQVBGYXVsdCBzb2FwRmF1bHQgPSBzZmUuZ2V0RmF1bHQoKTsNCi0gICAgICAgIGFzc2VydFRydWUoc29hcEZhdWx0ICE9IG51bGwpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShzb2FwRmF1bHQuZ2V0RmF1bHRTdHJpbmcoKS5lcXVhbHMoIk51bGwgUG9pbnRlciBFeGNlcHRpb24gb2NjdXJyZWQiKSk7DQotICAgICAgICANCi0gICAgICAgIA0KLSAgICAgICAgLy8gUmVwZWF0IHRvIHZlcmlmeSBiZWhhdmlvcg0KLSAgICAgICAgdHJ5ew0KLSAgICAgICAgICAgIGV4Y2VwdGlvbiA9IG51bGw7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gdGhlIGludm9rZSB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbiwgaWYgdGhlIHRlc3QgaXMgcGVyZm9ybWVkIHJpZ2h0DQotICAgICAgICAgICAgaW50IHRvdGFsID0gcHJveHkudGhyb3dGYXVsdCgyLCAiTlBFMiIsIDIpOyAgLy8gIk5QRSIgd2lsbCBjYXVzZSBzZXJ2aWNlIHRvIHRocm93IE5QRSBTeXN0ZW0gRXhjZXB0aW9uDQotICAgICAgICAgICAgDQotICAgICAgICB9Y2F0Y2goU09BUEZhdWx0RXhjZXB0aW9uIGUpew0KLSAgICAgICAgICAgIC8vIE9rYXkNCi0gICAgICAgICAgICBleGNlcHRpb24gPSBlOw0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBmYWlsKCJEaWQgbm90IGdldCBhIFNPQVBGYXVsdEV4Y2VwdGlvbiIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIA0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChleGNlcHRpb24pOw0KLSAgICAgICAgc2ZlID0gKFNPQVBGYXVsdEV4Y2VwdGlvbikgZXhjZXB0aW9uOw0KLSAgICAgICAgc29hcEZhdWx0ID0gc2ZlLmdldEZhdWx0KCk7DQotICAgICAgICBhc3NlcnRUcnVlKHNvYXBGYXVsdCAhPSBudWxsKTsNCi0gICAgICAgIGFzc2VydFRydWUoc29hcEZhdWx0LmdldEZhdWx0U3RyaW5nKCkuZXF1YWxzKCJOdWxsIFBvaW50ZXIgRXhjZXB0aW9uIG9jY3VycmVkIikpOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogVGVzdHMgdGhhdCB0aGF0IFNPQVBGYXVsdEV4Y2VwdGlvbiAoZm9yIFdlYlNlcnZpY2VFeGNlcHRpb24pIGlzIHRocm93biANCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RGYXVsdHNTZXJ2aWNlMTEoKXsNCi0gICAgICAgIEZhdWx0c1NlcnZpY2VQb3J0VHlwZSBwcm94eSA9IGdldFByb3h5KCk7DQotICAgICAgICBFeGNlcHRpb24gZXhjZXB0aW9uID0gbnVsbDsNCi0gICAgICAgIHRyeXsNCi0gICAgICAgICAgICBleGNlcHRpb24gPSBudWxsOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIHRoZSBpbnZva2Ugd2lsbCB0aHJvdyBhbiBleGNlcHRpb24sIGlmIHRoZSB0ZXN0IGlzIHBlcmZvcm1lZCByaWdodA0KLSAgICAgICAgICAgIGludCB0b3RhbCA9IHByb3h5LnRocm93RmF1bHQoMiwgIldTRSIsIDIpOyAgLy8gIldTRSIgd2lsbCBjYXVzZSBzZXJ2aWNlIHRvIHRocm93IFdlYlNlcnZpY2VFeGNlcHRpb24gU3lzdGVtIEV4Y2VwdGlvbg0KLSAgICAgICAgICAgIA0KLSAgICAgICAgfWNhdGNoKFNPQVBGYXVsdEV4Y2VwdGlvbiBlKXsNCi0gICAgICAgICAgICAvLyBPa2F5Li4ub24gdGhlIGNsaWVudCBhIFNPQVBGYXVsdEV4Y2VwdGlvbiBzaG91bGQgYmUgdGhyb3duDQotICAgICAgICAgICAgZXhjZXB0aW9uID0gZTsNCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgZmFpbCgiRGlkIG5vdCBnZXQgYSBTT0FQRmF1bHRFeGNlcHRpb24iKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIA0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIA0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChleGNlcHRpb24pOw0KLSAgICAgICAgU09BUEZhdWx0RXhjZXB0aW9uIHNmZSA9IChTT0FQRmF1bHRFeGNlcHRpb24pIGV4Y2VwdGlvbjsNCi0gICAgICAgIFNPQVBGYXVsdCBzb2FwRmF1bHQgPSBzZmUuZ2V0RmF1bHQoKTsNCi0gICAgICAgIGFzc2VydFRydWUoc29hcEZhdWx0ICE9IG51bGwpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShzb2FwRmF1bHQuZ2V0RmF1bHRTdHJpbmcoKS5lcXVhbHMoIlRoaXMgaXMgYSBXZWJTZXJ2aWNlRXhjZXB0aW9uIikpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBSZXBlYXQgdG8gdmVyaWZ5IGJlaGF2aW9yDQotICAgICAgICB0cnl7DQotICAgICAgICAgICAgZXhjZXB0aW9uID0gbnVsbDsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyB0aGUgaW52b2tlIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uLCBpZiB0aGUgdGVzdCBpcyBwZXJmb3JtZWQgcmlnaHQNCi0gICAgICAgICAgICBpbnQgdG90YWwgPSBwcm94eS50aHJvd0ZhdWx0KDIsICJXU0UiLCAyKTsgIC8vICJXU0UiIHdpbGwgY2F1c2Ugc2VydmljZSB0byB0aHJvdyBXZWJTZXJ2aWNlRXhjZXB0aW9uIFN5c3RlbSBFeGNlcHRpb24NCi0gICAgICAgICAgICANCi0gICAgICAgIH1jYXRjaChTT0FQRmF1bHRFeGNlcHRpb24gZSl7DQotICAgICAgICAgICAgLy8gT2theS4uLm9uIHRoZSBjbGllbnQgYSBTT0FQRmF1bHRFeGNlcHRpb24gc2hvdWxkIGJlIHRocm93bg0KLSAgICAgICAgICAgIGV4Y2VwdGlvbiA9IGU7DQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGZhaWwoIkRpZCBub3QgZ2V0IGEgU09BUEZhdWx0RXhjZXB0aW9uIik7DQotICAgICAgICB9DQotDQotICAgICAgICANCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICANCi0gICAgICAgIGFzc2VydE5vdE51bGwoZXhjZXB0aW9uKTsNCi0gICAgICAgIHNmZSA9IChTT0FQRmF1bHRFeGNlcHRpb24pIGV4Y2VwdGlvbjsNCi0gICAgICAgIHNvYXBGYXVsdCA9IHNmZS5nZXRGYXVsdCgpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShzb2FwRmF1bHQgIT0gbnVsbCk7DQotICAgICAgICBhc3NlcnRUcnVlKHNvYXBGYXVsdC5nZXRGYXVsdFN0cmluZygpLmVxdWFscygiVGhpcyBpcyBhIFdlYlNlcnZpY2VFeGNlcHRpb24iKSk7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBUZXN0cyBSZXNvdXJjZSBpbmplY3Rpb24NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZUluamVjdGlvbigpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgRmF1bHRzU2VydmljZVBvcnRUeXBlIHByb3h5ID0gZ2V0UHJveHkoKTsNCi0gICAgICAgIA0KLSAgICAgICAgZmxvYXQgdG90YWwgPSBwcm94eS5nZXRRdW90ZSgiSU5KRUNUSU9OIik7DQotICAgICAgICANCi0gICAgICAgIC8vIElmIHJlc291cmNlIGluamVjdGlvbiBvY2N1cnJlZCBwcm9wZXJseSwgdGhlbiB0aGUgYSB2YWx1ZSBvZiAxMjM0NTY3IGlzIGV4cGVjdGVkDQotICAgICAgICBhc3NlcnRUcnVlKCJSZXNvdXJjZSBJbmplY3Rpb24gRmFpbGVkIiwgdG90YWwgPT0gMTIzNDU2Nyk7DQotICAgICAgICANCi0gICAgICAgIC8vIFJlcGVhdCB0byB2ZXJpZnkgYmVoYXZpb3INCi0gICAgICAgIHRvdGFsID0gcHJveHkuZ2V0UXVvdGUoIklOSkVDVElPTiIpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBJZiByZXNvdXJjZSBpbmplY3Rpb24gb2NjdXJyZWQgcHJvcGVybHksIHRoZW4gdGhlIGEgdmFsdWUgb2YgMTIzNDU2NyBpcyBleHBlY3RlZA0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiUmVzb3VyY2UgSW5qZWN0aW9uIEZhaWxlZCIsIHRvdGFsID09IDEyMzQ1NjcpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvRmF1bHR5V2ViU2VydmljZVRlc3RzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL0ZhdWx0eVdlYlNlcnZpY2VUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDc5NmExLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvRmF1bHR5V2ViU2VydmljZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLS8qKg0KLSAqIA0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGU7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLlRlc3RMb2dnZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZnJhbWV3b3JrLkFic3RyYWN0VGVzdENhc2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLmZhdWx0cy5GYXVsdHlXZWJTZXJ2aWNlRmF1bHRfRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5mYXVsdHMuRmF1bHR5V2ViU2VydmljZVBvcnRUeXBlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5mYXVsdHMuRmF1bHR5V2ViU2VydmljZVNlcnZpY2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLndyYXAuc2VpLkRvY0xpdFdyYXA7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLndyYXAuc2VpLkRvY0xpdFdyYXBTZXJ2aWNlOw0KLWltcG9ydCBvcmcudGVzdC5mYXVsdHMuRmF1bHR5V2ViU2VydmljZVJlc3BvbnNlOw0KLQ0KLWltcG9ydCBqYXZheC54bWwud3MuQXN5bmNIYW5kbGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuQmluZGluZ1Byb3ZpZGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuUmVzcG9uc2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5TT0FQRmF1bHRFeGNlcHRpb247DQotaW1wb3J0IGphdmEubmV0LlVua25vd25Ib3N0RXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRpb25FeGNlcHRpb247DQotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTsNCi0NCi1wdWJsaWMgY2xhc3MgRmF1bHR5V2ViU2VydmljZVRlc3RzIGV4dGVuZHMgQWJzdHJhY3RUZXN0Q2FzZSB7DQotICAgIFN0cmluZyBheGlzRW5kcG9pbnQgPSAiaHR0cDovL2xvY2FsaG9zdDo2MDYwL2F4aXMyL3NlcnZpY2VzL0ZhdWx0eVdlYlNlcnZpY2VTZXJ2aWNlLkZhdWx0eVdlYlNlcnZpY2VQb3J0VHlwZUltcGxQb3J0IjsNCi0NCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgew0KLSAgICAgICAgcmV0dXJuIGdldFRlc3RTZXR1cChuZXcgVGVzdFN1aXRlKEZhdWx0eVdlYlNlcnZpY2VUZXN0cy5jbGFzcykpOw0KLSAgICB9DQotDQotDQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RGYXVsdHlXZWJTZXJ2aWNlKCl7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoInRlc3Q6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgRmF1bHR5V2ViU2VydmljZVNlcnZpY2Ugc2VydmljZSA9IG5ldyBGYXVsdHlXZWJTZXJ2aWNlU2VydmljZSgpOw0KLSAgICAgICAgRmF1bHR5V2ViU2VydmljZVBvcnRUeXBlIHByb3h5ID0gc2VydmljZS5nZXRGYXVsdHlXZWJTZXJ2aWNlUG9ydCgpOw0KLSAgICAgICAgDQotICAgICAgICBGYXVsdHlXZWJTZXJ2aWNlRmF1bHRfRXhjZXB0aW9uIGV4Y2VwdGlvbiA9IG51bGw7DQotICAgICAgICB0cnl7DQotICAgICAgICAgICAgZXhjZXB0aW9uID0gbnVsbDsNCi0gICAgICAgICAgICBCaW5kaW5nUHJvdmlkZXIgcCA9CShCaW5kaW5nUHJvdmlkZXIpcHJveHk7DQotICAgICAgICAgICAgcC5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dChCaW5kaW5nUHJvdmlkZXIuRU5EUE9JTlRfQUREUkVTU19QUk9QRVJUWSxheGlzRW5kcG9pbnQpOw0KLQ0KLSAgICAgICAgICAgIC8vIHRoZSBpbnZva2Ugd2lsbCB0aHJvdyBhbiBleGNlcHRpb24sIGlmIHRoZSB0ZXN0IGlzIHBlcmZvcm1lZCByaWdodA0KLSAgICAgICAgICAgIGludCB0b3RhbCA9IHByb3h5LmZhdWx0eVdlYlNlcnZpY2UoMTApOw0KLQ0KLSAgICAgICAgfWNhdGNoKEZhdWx0eVdlYlNlcnZpY2VGYXVsdF9FeGNlcHRpb24gZSl7DQotICAgICAgICAgICAgZXhjZXB0aW9uID0gZTsNCi0gICAgICAgIH1jYXRjaChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAgICAgZmFpbChlLnRvU3RyaW5nKCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0NCi0gICAgICAgIGFzc2VydE5vdE51bGwoZXhjZXB0aW9uKTsNCi0gICAgICAgIGFzc2VydEVxdWFscygiY3VzdG9tIGV4Y2VwdGlvbiIsIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChleGNlcHRpb24uZ2V0RmF1bHRJbmZvKCkpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJiZWFuIGN1c3RvbSBmYXVsdCBpbmZvIiwgZXhjZXB0aW9uLmdldEZhdWx0SW5mbygpLmdldEZhdWx0SW5mbygpKTsNCi0gICAgICAgIGFzc2VydEVxdWFscygiYmVhbiBjdXN0b20gbWVzc2FnZSIsIGV4Y2VwdGlvbi5nZXRGYXVsdEluZm8oKS5nZXRNZXNzYWdlKCkpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBSZXBlYXQgdG8gdmVyaWZ5IGJlaGF2aW9yDQotICAgICAgICB0cnl7DQotICAgICAgICAgICAgZXhjZXB0aW9uID0gbnVsbDsNCi0gICAgICAgICAgICBCaW5kaW5nUHJvdmlkZXIgcCA9IChCaW5kaW5nUHJvdmlkZXIpcHJveHk7DQotICAgICAgICAgICAgcC5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dChCaW5kaW5nUHJvdmlkZXIuRU5EUE9JTlRfQUREUkVTU19QUk9QRVJUWSxheGlzRW5kcG9pbnQpOw0KLQ0KLSAgICAgICAgICAgIC8vIHRoZSBpbnZva2Ugd2lsbCB0aHJvdyBhbiBleGNlcHRpb24sIGlmIHRoZSB0ZXN0IGlzIHBlcmZvcm1lZCByaWdodA0KLSAgICAgICAgICAgIGludCB0b3RhbCA9IHByb3h5LmZhdWx0eVdlYlNlcnZpY2UoMTApOw0KLQ0KLSAgICAgICAgfWNhdGNoKEZhdWx0eVdlYlNlcnZpY2VGYXVsdF9FeGNlcHRpb24gZSl7DQotICAgICAgICAgICAgZXhjZXB0aW9uID0gZTsNCi0gICAgICAgIH1jYXRjaChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAgICAgZmFpbChlLnRvU3RyaW5nKCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0NCi0gICAgICAgIGFzc2VydE5vdE51bGwoZXhjZXB0aW9uKTsNCi0gICAgICAgIGFzc2VydEVxdWFscygiY3VzdG9tIGV4Y2VwdGlvbiIsIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChleGNlcHRpb24uZ2V0RmF1bHRJbmZvKCkpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJiZWFuIGN1c3RvbSBmYXVsdCBpbmZvIiwgZXhjZXB0aW9uLmdldEZhdWx0SW5mbygpLmdldEZhdWx0SW5mbygpKTsNCi0gICAgICAgIGFzc2VydEVxdWFscygiYmVhbiBjdXN0b20gbWVzc2FnZSIsIGV4Y2VwdGlvbi5nZXRGYXVsdEluZm8oKS5nZXRNZXNzYWdlKCkpOw0KLQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RGYXVsdHlXZWJTZXJ2aWNlX2JhZEVuZHBvaW50KCl7DQotDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoInRlc3Q6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgRmF1bHR5V2ViU2VydmljZVNlcnZpY2Ugc2VydmljZSA9IG5ldyBGYXVsdHlXZWJTZXJ2aWNlU2VydmljZSgpOw0KLSAgICAgICAgRmF1bHR5V2ViU2VydmljZVBvcnRUeXBlIHByb3h5ID0gc2VydmljZS5nZXRGYXVsdHlXZWJTZXJ2aWNlUG9ydCgpOw0KLSAgICAgICAgDQotICAgICAgICBTdHJpbmcgaG9zdCA9ICJ0aGlzLmlzLmEuYmFkLmVuZHBvaW50LnRlcnJpYmxlLmluLmZhY3QiOw0KLSAgICAgICAgU3RyaW5nIGJhZEVuZHBvaW50ID0gImh0dHA6Ly8iICsgaG9zdDsNCi0NCi0gICAgICAgIFdlYlNlcnZpY2VFeGNlcHRpb24gZXhjZXB0aW9uID0gbnVsbDsNCi0NCi0gICAgICAgIHRyeXsNCi0gICAgICAgICAgICBleGNlcHRpb24gPSBudWxsOw0KLSAgICAgICAgICAgIEJpbmRpbmdQcm92aWRlciBwID0gKEJpbmRpbmdQcm92aWRlcilwcm94eTsNCi0gICAgICAgICAgICBwLmdldFJlcXVlc3RDb250ZXh0KCkucHV0KEJpbmRpbmdQcm92aWRlci5FTkRQT0lOVF9BRERSRVNTX1BST1BFUlRZLGJhZEVuZHBvaW50KTsNCi0NCi0gICAgICAgICAgICAvLyB0aGUgaW52b2tlIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uLCBpZiB0aGUgdGVzdCBpcyBwZXJmb3JtZWQgcmlnaHQNCi0gICAgICAgICAgICBpbnQgdG90YWwgPSBwcm94eS5mYXVsdHlXZWJTZXJ2aWNlKDEwKTsNCi0NCi0gICAgICAgIH1jYXRjaChGYXVsdHlXZWJTZXJ2aWNlRmF1bHRfRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICAvLyBzaG91bGRuJ3QgZ2V0IHRoaXMgZXhjZXB0aW9uDQotICAgICAgICAgICAgZmFpbChlLnRvU3RyaW5nKCkpOw0KLSAgICAgICAgfWNhdGNoKFdlYlNlcnZpY2VFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGV4Y2VwdGlvbiA9IGU7DQotICAgICAgICB9Y2F0Y2goRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBmYWlsKCJUaGlzIHRlc3RjYXNlIHNob3VsZCBvbmx5IHByb2R1Y2UgYSBXZWJTZXJ2aWNlRXhjZXB0aW9uLiAgV2UgZ290OiAiICsgZS50b1N0cmluZygpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotDQotICAgICAgICBhc3NlcnROb3ROdWxsKGV4Y2VwdGlvbik7DQotICAgICAgICBhc3NlcnRUcnVlKGV4Y2VwdGlvbi5nZXRDYXVzZSgpIGluc3RhbmNlb2YgVW5rbm93bkhvc3RFeGNlcHRpb24pOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShleGNlcHRpb24uZ2V0Q2F1c2UoKS5nZXRNZXNzYWdlKCkuaW5kZXhPZihob3N0KSE9LTEpOw0KLSAgICAgICAgDQotICAgICAgICANCi0gICAgICAgIC8vIFJlcGVhdCB0byB2ZXJpZnkgYmVoYXZpb3INCi0gICAgICAgIHRyeXsNCi0gICAgICAgICAgICBleGNlcHRpb24gPSBudWxsOw0KLSAgICAgICAgICAgIEJpbmRpbmdQcm92aWRlciBwID0gKEJpbmRpbmdQcm92aWRlcilwcm94eTsNCi0gICAgICAgICAgICBwLmdldFJlcXVlc3RDb250ZXh0KCkucHV0KEJpbmRpbmdQcm92aWRlci5FTkRQT0lOVF9BRERSRVNTX1BST1BFUlRZLGJhZEVuZHBvaW50KTsNCi0NCi0gICAgICAgICAgICAvLyB0aGUgaW52b2tlIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uLCBpZiB0aGUgdGVzdCBpcyBwZXJmb3JtZWQgcmlnaHQNCi0gICAgICAgICAgICBpbnQgdG90YWwgPSBwcm94eS5mYXVsdHlXZWJTZXJ2aWNlKDEwKTsNCi0NCi0gICAgICAgIH1jYXRjaChGYXVsdHlXZWJTZXJ2aWNlRmF1bHRfRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICAvLyBzaG91bGRuJ3QgZ2V0IHRoaXMgZXhjZXB0aW9uDQotICAgICAgICAgICAgZmFpbChlLnRvU3RyaW5nKCkpOw0KLSAgICAgICAgfWNhdGNoKFdlYlNlcnZpY2VFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGV4Y2VwdGlvbiA9IGU7DQotICAgICAgICB9Y2F0Y2goRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBmYWlsKCJUaGlzIHRlc3RjYXNlIHNob3VsZCBvbmx5IHByb2R1Y2UgYSBXZWJTZXJ2aWNlRXhjZXB0aW9uLiAgV2UgZ290OiAiICsgZS50b1N0cmluZygpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotDQotICAgICAgICBhc3NlcnROb3ROdWxsKGV4Y2VwdGlvbik7DQotICAgICAgICBhc3NlcnRUcnVlKGV4Y2VwdGlvbi5nZXRDYXVzZSgpIGluc3RhbmNlb2YgVW5rbm93bkhvc3RFeGNlcHRpb24pOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShleGNlcHRpb24uZ2V0Q2F1c2UoKS5nZXRNZXNzYWdlKCkuaW5kZXhPZihob3N0KSE9LTEpOw0KLQ0KLSAgICB9DQotDQotICAgIC8vIFRPRE8gc2hvdWxkIGFsc28gaGF2ZSBhbiBpbnZva2Ugb25ld2F5IGJhZCBlbmRwb2ludCB0ZXN0IHRvIG1ha2Ugc3VyZQ0KLSAgICAvLyB3ZSBnZXQgYW4gZXhjZXB0aW9uIGFzIGluZGljYXRlZCBpbiBKQVhXUyA2LjQuMi4NCi0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdEZhdWx0eVdlYlNlcnZpY2VfYmFkRW5kcG9pbnRfb25lV2F5KCkgew0KLSAgICAgICAgU3RyaW5nIGhvc3QgPSAidGhpcy5pcy5hLmJhZC5lbmRwb2ludC50ZXJyaWJsZS5pbi5mYWN0IjsNCi0gICAgICAgIFN0cmluZyBiYWRFbmRwb2ludCA9ICJodHRwOi8vIiArIGhvc3Q7DQotICAgICAgICANCi0gICAgICAgIERvY0xpdFdyYXBTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgRG9jTGl0V3JhcFNlcnZpY2UoKTsNCi0gICAgICAgIERvY0xpdFdyYXAgcHJveHkgPSBzZXJ2aWNlLmdldERvY0xpdFdyYXBQb3J0KCk7DQotICAgICAgICBCaW5kaW5nUHJvdmlkZXIgcCA9IChCaW5kaW5nUHJvdmlkZXIpcHJveHk7DQotICAgICAgICBwLmdldFJlcXVlc3RDb250ZXh0KCkucHV0KEJpbmRpbmdQcm92aWRlci5FTkRQT0lOVF9BRERSRVNTX1BST1BFUlRZLGJhZEVuZHBvaW50KTsNCi0gICAgICAgIA0KLSAgICAgICANCi0NCi0gICAgICAgIFdlYlNlcnZpY2VFeGNlcHRpb24gZXhjZXB0aW9uID0gbnVsbDsNCi0NCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJUZXN0IDogIiArIGdldE5hbWUoKSk7DQotICAgICAgICB0cnl7DQotICAgICAgICAgICAgZXhjZXB0aW9uID0gbnVsbDsNCi0gICAgICAgICAgIA0KLSAgICAgICAgICAgIHByb3h5Lm9uZVdheVZvaWQoKTsNCi0NCi0gICAgICAgIH1jYXRjaChXZWJTZXJ2aWNlRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBleGNlcHRpb24gPSBlOw0KLSAgICAgICAgfWNhdGNoKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgZmFpbCgiVGhpcyB0ZXN0Y2FzZSBzaG91bGQgb25seSBwcm9kdWNlIGEgV2ViU2VydmljZUV4Y2VwdGlvbi4gIFdlIGdvdDogIiArIGUudG9TdHJpbmcoKSk7DQotICAgICAgICB9DQotDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLQ0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChleGNlcHRpb24pOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShleGNlcHRpb24uZ2V0Q2F1c2UoKSBpbnN0YW5jZW9mIFVua25vd25Ib3N0RXhjZXB0aW9uKTsNCi0gICAgICAgIGFzc2VydFRydWUoZXhjZXB0aW9uLmdldENhdXNlKCkuZ2V0TWVzc2FnZSgpLmluZGV4T2YoaG9zdCkhPS0xKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gUmVwZWF0IHRvIHZlcmlmeSBiZWhhdmlvcg0KLSAgICAgICAgdHJ5ew0KLSAgICAgICAgICAgIGV4Y2VwdGlvbiA9IG51bGw7DQotICAgICAgICAgICANCi0gICAgICAgICAgICBwcm94eS5vbmVXYXlWb2lkKCk7DQotDQotICAgICAgICB9Y2F0Y2goV2ViU2VydmljZUV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgZXhjZXB0aW9uID0gZTsNCi0gICAgICAgIH1jYXRjaChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGZhaWwoIlRoaXMgdGVzdGNhc2Ugc2hvdWxkIG9ubHkgcHJvZHVjZSBhIFdlYlNlcnZpY2VFeGNlcHRpb24uICBXZSBnb3Q6ICIgKyBlLnRvU3RyaW5nKCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0NCi0gICAgICAgIGFzc2VydE5vdE51bGwoZXhjZXB0aW9uKTsNCi0gICAgICAgIGFzc2VydFRydWUoZXhjZXB0aW9uLmdldENhdXNlKCkgaW5zdGFuY2VvZiBVbmtub3duSG9zdEV4Y2VwdGlvbik7DQotICAgICAgICBhc3NlcnRUcnVlKGV4Y2VwdGlvbi5nZXRDYXVzZSgpLmdldE1lc3NhZ2UoKS5pbmRleE9mKGhvc3QpIT0tMSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdEZhdWx0eVdlYlNlcnZpY2VfYmFkRW5kcG9pbnRfQXN5bmNDYWxsYmFjaygpDQotICAgIHRocm93cyBFeGNlcHRpb24gew0KLQ0KLSAgICAgICAgU3RyaW5nIGhvc3QgPSAidGhpcy5pcy5hLmJhZC5lbmRwb2ludC50ZXJyaWJsZS5pbi5mYWN0IjsNCi0gICAgICAgIFN0cmluZyBiYWRFbmRwb2ludCA9ICJodHRwOi8vIiArIGhvc3Q7DQotDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiVGVzdCA6ICIgKyBnZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgRmF1bHR5V2ViU2VydmljZVNlcnZpY2Ugc2VydmljZSA9IG5ldyBGYXVsdHlXZWJTZXJ2aWNlU2VydmljZSgpOw0KLSAgICAgICAgRmF1bHR5V2ViU2VydmljZVBvcnRUeXBlIHByb3h5ID0gc2VydmljZS5nZXRGYXVsdHlXZWJTZXJ2aWNlUG9ydCgpOw0KLSAgICAgICAgQmluZGluZ1Byb3ZpZGVyIHAgPSAoQmluZGluZ1Byb3ZpZGVyKSBwcm94eTsNCi0gICAgICAgIHAuZ2V0UmVxdWVzdENvbnRleHQoKS5wdXQoQmluZGluZ1Byb3ZpZGVyLkVORFBPSU5UX0FERFJFU1NfUFJPUEVSVFksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhZEVuZHBvaW50KTsNCi0NCi0gICAgICAgIEZhdWx0eUFzeW5jSGFuZGxlciBjYWxsYmFjayA9IG5ldyBGYXVsdHlBc3luY0hhbmRsZXIoKTsNCi0gICAgICAgIEZ1dHVyZTw/PiBmdXR1cmUgPSBwcm94eS5mYXVsdHlXZWJTZXJ2aWNlQXN5bmMoMSwgY2FsbGJhY2spOw0KLQ0KLSAgICAgICAgd2hpbGUgKCFmdXR1cmUuaXNEb25lKCkpIHsNCi0gICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIkFzeW5jIGludm9jYXRpb24gaW5jb21wbGV0ZSIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgRXhjZXB0aW9uIGUgPSBjYWxsYmFjay5nZXRFeGNlcHRpb24oKTsNCi0NCi0gICAgICAgIC8vIFNlY3Rpb24gNC4zLjMgc3RhdGVzIHRoYXQgdGhlIHRvcCBsZXZlbCBFeGNlcHRpb24gc2hvdWxkIGJlDQotICAgICAgICAvLyBhbiBFeGVjdXRpb25FeGNlcHRpb24sIHdpdGggYSBXZWJTZXJ2aWNlRXhjZXB0aW9uIHVuZGVybmVhdGguDQotICAgICAgICBhc3NlcnROb3ROdWxsKCJUaGUgZXhjZXB0aW9uIHdhcyBudWxsLiIsIGUpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIHRocm93biBleGNlcHRpb24gc2hvdWxkIGJlIGFuIEV4ZWN1dGlvbkV4Y2VwdGlvbi4iLCBlDQotICAgICAgICAgICAgICAgICAgIC5nZXRDbGFzcygpLmVxdWFscyhFeGVjdXRpb25FeGNlcHRpb24uY2xhc3MpKTsNCi0gICAgICAgIGFzc2VydFRydWUoDQotICAgICAgICAgICAgICAgICAgICJUaGUgZXhwZWN0ZWQgZmF1bHQgdHlwZSB1bmRlciB0aGUgRXhlY3V0aW9uRXhjZXB0aW9uIHNob3VsZCBiZSBhICINCi0gICAgICAgICAgICAgICAgICAgKyAiU09BUEZhdWx0RXhjZXB0aW9uLiAgRm91bmQgdHlwZTogIg0KLSAgICAgICAgICAgICAgICAgICArIGUuZ2V0Q2F1c2UoKS5nZXRDbGFzcygpLCBlLmdldENhdXNlKCkuZ2V0Q2xhc3MoKQ0KLSAgICAgICAgICAgICAgICAgICAuaXNBc3NpZ25hYmxlRnJvbShTT0FQRmF1bHRFeGNlcHRpb24uY2xhc3MpKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gUmVwZWF0IHRvIHZlcmlmeSBiZWhhdmlvcg0KLSAgICAgICAgY2FsbGJhY2sgPSBuZXcgRmF1bHR5QXN5bmNIYW5kbGVyKCk7DQotICAgICAgICBmdXR1cmUgPSBwcm94eS5mYXVsdHlXZWJTZXJ2aWNlQXN5bmMoMSwgY2FsbGJhY2spOw0KLQ0KLSAgICAgICAgd2hpbGUgKCFmdXR1cmUuaXNEb25lKCkpIHsNCi0gICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIkFzeW5jIGludm9jYXRpb24gaW5jb21wbGV0ZSIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZSA9IGNhbGxiYWNrLmdldEV4Y2VwdGlvbigpOw0KLQ0KLSAgICAgICAgLy8gU2VjdGlvbiA0LjMuMyBzdGF0ZXMgdGhhdCB0aGUgdG9wIGxldmVsIEV4Y2VwdGlvbiBzaG91bGQgYmUNCi0gICAgICAgIC8vIGFuIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgd2l0aCBhIFdlYlNlcnZpY2VFeGNlcHRpb24gdW5kZXJuZWF0aC4NCi0gICAgICAgIGFzc2VydE5vdE51bGwoIlRoZSBleGNlcHRpb24gd2FzIG51bGwuIiwgZSk7DQotICAgICAgICBhc3NlcnRUcnVlKCJUaGUgdGhyb3duIGV4Y2VwdGlvbiBzaG91bGQgYmUgYW4gRXhlY3V0aW9uRXhjZXB0aW9uLiIsIGUNCi0gICAgICAgICAgICAgICAgICAgLmdldENsYXNzKCkuZXF1YWxzKEV4ZWN1dGlvbkV4Y2VwdGlvbi5jbGFzcykpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgNCi0gICAgICAgICAgICAgICAgICAgIlRoZSBleHBlY3RlZCBmYXVsdCB0eXBlIHVuZGVyIHRoZSBFeGVjdXRpb25FeGNlcHRpb24gc2hvdWxkIGJlIGEgIg0KLSAgICAgICAgICAgICAgICAgICArICJTT0FQRmF1bHRFeGNlcHRpb24uICBGb3VuZCB0eXBlOiAiDQotICAgICAgICAgICAgICAgICAgICsgZS5nZXRDYXVzZSgpLmdldENsYXNzKCksIGUuZ2V0Q2F1c2UoKS5nZXRDbGFzcygpDQotICAgICAgICAgICAgICAgICAgIC5pc0Fzc2lnbmFibGVGcm9tKFNPQVBGYXVsdEV4Y2VwdGlvbi5jbGFzcykpOw0KLQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RGYXVsdHlXZWJTZXJ2aWNlX2JhZEVuZHBvaW50X0FzeW5jUG9sbGluZygpDQotICAgIHRocm93cyBFeGNlcHRpb24gew0KLQ0KLSAgICAgICAgU3RyaW5nIGhvc3QgPSAidGhpcy5pcy5hLmJhZC5lbmRwb2ludC50ZXJyaWJsZS5pbi5mYWN0IjsNCi0gICAgICAgIFN0cmluZyBiYWRFbmRwb2ludCA9ICJodHRwOi8vIiArIGhvc3Q7DQotDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiVGVzdCA6ICIgKyBnZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgRmF1bHR5V2ViU2VydmljZVNlcnZpY2Ugc2VydmljZSA9IG5ldyBGYXVsdHlXZWJTZXJ2aWNlU2VydmljZSgpOw0KLSAgICAgICAgRmF1bHR5V2ViU2VydmljZVBvcnRUeXBlIHByb3h5ID0gc2VydmljZS5nZXRGYXVsdHlXZWJTZXJ2aWNlUG9ydCgpOw0KLSAgICAgICAgQmluZGluZ1Byb3ZpZGVyIHAgPSAoQmluZGluZ1Byb3ZpZGVyKSBwcm94eTsNCi0gICAgICAgIHAuZ2V0UmVxdWVzdENvbnRleHQoKS5wdXQoQmluZGluZ1Byb3ZpZGVyLkVORFBPSU5UX0FERFJFU1NfUFJPUEVSVFksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhZEVuZHBvaW50KTsNCi0NCi0gICAgICAgIEZ1dHVyZTw/PiBmdXR1cmUgPSBwcm94eS5mYXVsdHlXZWJTZXJ2aWNlQXN5bmMoMSk7DQotICAgICAgICB3aGlsZSAoIWZ1dHVyZS5pc0RvbmUoKSkgew0KLSAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiQXN5bmMgaW52b2NhdGlvbiBpbmNvbXBsZXRlIik7DQotICAgICAgICB9DQotDQotICAgICAgICBFeGNlcHRpb24gZSA9IG51bGw7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIE9iamVjdCBvYmogPSBmdXR1cmUuZ2V0KCk7DQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsNCi0gICAgICAgICAgICBlID0gZXg7DQotICAgICAgICB9DQotDQotICAgICAgICAvLyBTZWN0aW9uIDQuMy4zIHN0YXRlcyB0aGF0IHRoZSB0b3AgbGV2ZWwgRXhjZXB0aW9uIHNob3VsZCBiZQ0KLSAgICAgICAgLy8gYW4gRXhlY3V0aW9uRXhjZXB0aW9uLCB3aXRoIGEgV2ViU2VydmljZUV4Y2VwdGlvbiB1bmRlcm5lYXRoLg0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgiVGhlIGV4Y2VwdGlvbiB3YXMgbnVsbC4iLCBlKTsNCi0gICAgICAgIGFzc2VydFRydWUoIlRoZSB0aHJvd24gZXhjZXB0aW9uIHNob3VsZCBiZSBhbiBFeGVjdXRpb25FeGNlcHRpb24uIiwgZQ0KLSAgICAgICAgICAgICAgICAgICAuZ2V0Q2xhc3MoKS5lcXVhbHMoRXhlY3V0aW9uRXhjZXB0aW9uLmNsYXNzKSk7DQotICAgICAgICBhc3NlcnRUcnVlKA0KLSAgICAgICAgICAgICAgICAgICAiVGhlIGV4cGVjdGVkIGZhdWx0IHR5cGUgdW5kZXIgdGhlIEV4ZWN1dGlvbkV4Y2VwdGlvbiBzaG91bGQgYmUgYSAiDQotICAgICAgICAgICAgICAgICAgICsgIlNPQVBGYXVsdEV4Y2VwdGlvbi4gIEZvdW5kIHR5cGU6ICINCi0gICAgICAgICAgICAgICAgICAgKyBlLmdldENhdXNlKCkuZ2V0Q2xhc3MoKSwgZS5nZXRDYXVzZSgpLmdldENsYXNzKCkNCi0gICAgICAgICAgICAgICAgICAgLmlzQXNzaWduYWJsZUZyb20oU09BUEZhdWx0RXhjZXB0aW9uLmNsYXNzKSk7DQotICAgICAgICANCi0gICAgICAgIA0KLSAgICAgICAgLy8gUmVwZWF0IHRvIHZlcmlmeSBiZWhhdmlvcg0KLSAgICAgICAgcHJveHkuZmF1bHR5V2ViU2VydmljZUFzeW5jKDEpOw0KLSAgICAgICAgd2hpbGUgKCFmdXR1cmUuaXNEb25lKCkpIHsNCi0gICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIkFzeW5jIGludm9jYXRpb24gaW5jb21wbGV0ZSIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZSA9IG51bGw7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIE9iamVjdCBvYmogPSBmdXR1cmUuZ2V0KCk7DQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsNCi0gICAgICAgICAgICBlID0gZXg7DQotICAgICAgICB9DQotDQotICAgICAgICAvLyBTZWN0aW9uIDQuMy4zIHN0YXRlcyB0aGF0IHRoZSB0b3AgbGV2ZWwgRXhjZXB0aW9uIHNob3VsZCBiZQ0KLSAgICAgICAgLy8gYW4gRXhlY3V0aW9uRXhjZXB0aW9uLCB3aXRoIGEgV2ViU2VydmljZUV4Y2VwdGlvbiB1bmRlcm5lYXRoLg0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgiVGhlIGV4Y2VwdGlvbiB3YXMgbnVsbC4iLCBlKTsNCi0gICAgICAgIGFzc2VydFRydWUoIlRoZSB0aHJvd24gZXhjZXB0aW9uIHNob3VsZCBiZSBhbiBFeGVjdXRpb25FeGNlcHRpb24uIiwgZQ0KLSAgICAgICAgICAgICAgICAgICAuZ2V0Q2xhc3MoKS5lcXVhbHMoRXhlY3V0aW9uRXhjZXB0aW9uLmNsYXNzKSk7DQotICAgICAgICBhc3NlcnRUcnVlKA0KLSAgICAgICAgICAgICAgICAgICAiVGhlIGV4cGVjdGVkIGZhdWx0IHR5cGUgdW5kZXIgdGhlIEV4ZWN1dGlvbkV4Y2VwdGlvbiBzaG91bGQgYmUgYSAiDQotICAgICAgICAgICAgICAgICAgICsgIlNPQVBGYXVsdEV4Y2VwdGlvbi4gIEZvdW5kIHR5cGU6ICINCi0gICAgICAgICAgICAgICAgICAgKyBlLmdldENhdXNlKCkuZ2V0Q2xhc3MoKSwgZS5nZXRDYXVzZSgpLmdldENsYXNzKCkNCi0gICAgICAgICAgICAgICAgICAgLmlzQXNzaWduYWJsZUZyb20oU09BUEZhdWx0RXhjZXB0aW9uLmNsYXNzKSk7DQotDQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogVGVzdHMgZmF1bHQgcHJvY2Vzc2luZyBmb3IgdXNlciBkZWZpbmVkIGZhdWx0IHR5cGVzDQotICAgICAqLyAgICAgIA0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3VzdG9tRmF1bHRfQXN5bmNDYWxsYmFjaygpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoInRlc3Q6ICIgKyBnZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgRmF1bHR5V2ViU2VydmljZVNlcnZpY2Ugc2VydmljZSA9IG5ldyBGYXVsdHlXZWJTZXJ2aWNlU2VydmljZSgpOw0KLSAgICAgICAgRmF1bHR5V2ViU2VydmljZVBvcnRUeXBlIHByb3h5ID0gc2VydmljZS5nZXRGYXVsdHlXZWJTZXJ2aWNlUG9ydCgpOw0KLSAgICAgICAgQmluZGluZ1Byb3ZpZGVyIHAgPSAoQmluZGluZ1Byb3ZpZGVyKSBwcm94eTsNCi0gICAgICAgIHAuZ2V0UmVxdWVzdENvbnRleHQoKS5wdXQoQmluZGluZ1Byb3ZpZGVyLkVORFBPSU5UX0FERFJFU1NfUFJPUEVSVFksIGF4aXNFbmRwb2ludCk7DQotDQotICAgICAgICBGYXVsdHlBc3luY0hhbmRsZXIgY2FsbGJhY2sgPSBuZXcgRmF1bHR5QXN5bmNIYW5kbGVyKCk7DQotICAgICAgICBGdXR1cmU8Pz4gZnV0dXJlID0gcHJveHkuZmF1bHR5V2ViU2VydmljZUFzeW5jKDEsIGNhbGxiYWNrKTsNCi0NCi0gICAgICAgIHdoaWxlICghZnV0dXJlLmlzRG9uZSgpKSB7DQotICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDApOw0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJBc3luYyBpbnZvY2F0aW9uIGluY29tcGxldGUiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIEV4Y2VwdGlvbiBlID0gY2FsbGJhY2suZ2V0RXhjZXB0aW9uKCk7DQotICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLQ0KLSAgICAgICAgLy8gU2VjdGlvbiA0LjMuMyBzdGF0ZXMgdGhhdCB0aGUgdG9wIGxldmVsIEV4Y2VwdGlvbiBzaG91bGQgYmUNCi0gICAgICAgIC8vIGFuIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgd2l0aCBhIFdlYlNlcnZpY2VFeGNlcHRpb24gdW5kZXJuZWF0aC4NCi0gICAgICAgIGFzc2VydE5vdE51bGwoIlRoZSBleGNlcHRpb24gd2FzIG51bGwuIiwgZSk7DQotICAgICAgICBhc3NlcnRUcnVlKCJUaGUgdGhyb3duIGV4Y2VwdGlvbiBzaG91bGQgYmUgYW4gRXhlY3V0aW9uRXhjZXB0aW9uLiIsIA0KLSAgICAgICAgICAgICAgICAgICBlLmdldENsYXNzKCkuZXF1YWxzKEV4ZWN1dGlvbkV4Y2VwdGlvbi5jbGFzcykpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIGV4cGVjdGVkIGZhdWx0IHR5cGUgdW5kZXIgdGhlIEV4ZWN1dGlvbkV4Y2VwdGlvbiBzaG91bGQgYmUgYSAiICsNCi0gICAgICAgICAgICAgICAgICAgIkZhdWx0eVdlYlNlcnZpY2VGYXVsdF9FeGNlcHRpb24uICBGb3VuZCB0eXBlOiAiICsgZS5nZXRDYXVzZSgpLmdldENsYXNzKCksIA0KLSAgICAgICAgICAgICAgICAgICBlLmdldENhdXNlKCkuZ2V0Q2xhc3MoKS5pc0Fzc2lnbmFibGVGcm9tKEZhdWx0eVdlYlNlcnZpY2VGYXVsdF9FeGNlcHRpb24uY2xhc3MpKTsNCi0gICAgICAgIA0KLSAgICAgICAgDQotICAgICAgICAvLyBSZXBlYXQgdG8gdmVyaWZ5IGJlaGF2aW9yDQotICAgICAgICBjYWxsYmFjayA9IG5ldyBGYXVsdHlBc3luY0hhbmRsZXIoKTsNCi0gICAgICAgIGZ1dHVyZSA9IHByb3h5LmZhdWx0eVdlYlNlcnZpY2VBc3luYygxLCBjYWxsYmFjayk7DQotDQotICAgICAgICB3aGlsZSAoIWZ1dHVyZS5pc0RvbmUoKSkgew0KLSAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiQXN5bmMgaW52b2NhdGlvbiBpbmNvbXBsZXRlIik7DQotICAgICAgICB9DQotDQotICAgICAgICBlID0gY2FsbGJhY2suZ2V0RXhjZXB0aW9uKCk7DQotICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLQ0KLSAgICAgICAgLy8gU2VjdGlvbiA0LjMuMyBzdGF0ZXMgdGhhdCB0aGUgdG9wIGxldmVsIEV4Y2VwdGlvbiBzaG91bGQgYmUNCi0gICAgICAgIC8vIGFuIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgd2l0aCBhIFdlYlNlcnZpY2VFeGNlcHRpb24gdW5kZXJuZWF0aC4NCi0gICAgICAgIGFzc2VydE5vdE51bGwoIlRoZSBleGNlcHRpb24gd2FzIG51bGwuIiwgZSk7DQotICAgICAgICBhc3NlcnRUcnVlKCJUaGUgdGhyb3duIGV4Y2VwdGlvbiBzaG91bGQgYmUgYW4gRXhlY3V0aW9uRXhjZXB0aW9uLiIsIA0KLSAgICAgICAgICAgICAgICAgICBlLmdldENsYXNzKCkuZXF1YWxzKEV4ZWN1dGlvbkV4Y2VwdGlvbi5jbGFzcykpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIGV4cGVjdGVkIGZhdWx0IHR5cGUgdW5kZXIgdGhlIEV4ZWN1dGlvbkV4Y2VwdGlvbiBzaG91bGQgYmUgYSAiICsNCi0gICAgICAgICAgICAgICAgICAgIkZhdWx0eVdlYlNlcnZpY2VGYXVsdF9FeGNlcHRpb24uICBGb3VuZCB0eXBlOiAiICsgZS5nZXRDYXVzZSgpLmdldENsYXNzKCksIA0KLSAgICAgICAgICAgICAgICAgICBlLmdldENhdXNlKCkuZ2V0Q2xhc3MoKS5pc0Fzc2lnbmFibGVGcm9tKEZhdWx0eVdlYlNlcnZpY2VGYXVsdF9FeGNlcHRpb24uY2xhc3MpKTsNCi0gICAgfQ0KLQ0KLQ0KLSAgICAvKg0KLSAgICAgKiBBIGNhbGxiYWNrIGltcGxlbWVudGF0aW9uIHRoYXQgY2FuIGJlIHVzZWQgdG8gY29sbGVjdCB0aGUgZXhjZXB0aW9ucw0KLSAgICAgKi8NCi0gICAgY2xhc3MgRmF1bHR5QXN5bmNIYW5kbGVyIGltcGxlbWVudHMgQXN5bmNIYW5kbGVyPEZhdWx0eVdlYlNlcnZpY2VSZXNwb25zZT4gew0KLQ0KLSAgICAgICAgRXhjZXB0aW9uIGV4Y2VwdGlvbjsNCi0NCi0gICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZVJlc3BvbnNlKFJlc3BvbnNlPEZhdWx0eVdlYlNlcnZpY2VSZXNwb25zZT4gcmVzcG9uc2UpIHsNCi0gICAgICAgICAgICB0cnkgew0KLSAgICAgICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiRmF1bHR5QXN5bmNIYW5kbGVyLmhhbmRsZVJlc3BvbnNlKCkgd2FzIGNhbGxlZCIpOw0KLSAgICAgICAgICAgICAgICBGYXVsdHlXZWJTZXJ2aWNlUmVzcG9uc2UgciA9IHJlc3BvbnNlLmdldCgpOw0KLSAgICAgICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiTm8gZXhjZXB0aW9uIHdhcyB0aHJvd24gZnJvbSBSZXNwb25zZS5nZXQoKSIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIkFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duOiAiICsgZS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgZXhjZXB0aW9uID0gZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgRXhjZXB0aW9uIGdldEV4Y2VwdGlvbigpIHsNCi0gICAgICAgICAgICByZXR1cm4gZXhjZXB0aW9uOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvTXRvbVNhbXBsZUJ5dGVBcnJheVRlc3RzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL010b21TYW1wbGVCeXRlQXJyYXlUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDZhNzljLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvTXRvbVNhbXBsZUJ5dGVBcnJheVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGU7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLlRlc3RMb2dnZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZnJhbWV3b3JrLkFic3RyYWN0VGVzdENhc2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLm10b20xLkltYWdlRGVwb3Q7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLm10b20xLkludm9rZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUubXRvbTEuT2JqZWN0RmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUubXRvbTEuU2VuZEltYWdlUmVzcG9uc2U7DQotaW1wb3J0IG9yZy53My5fMjAwNS5fMDUueG1sbWltZS5CYXNlNjRCaW5hcnk7DQotDQotaW1wb3J0IGphdmF4LmltYWdlaW8uSW1hZ2VJTzsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkNvbnRleHQ7DQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5EaXNwYXRjaDsNCi1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5zb2FwLlNPQVBCaW5kaW5nOw0KLWltcG9ydCBqYXZhLmF3dC4qOw0KLWltcG9ydCBqYXZhLmlvLkZpbGU7DQotDQotcHVibGljIGNsYXNzIE10b21TYW1wbGVCeXRlQXJyYXlUZXN0cyBleHRlbmRzIEFic3RyYWN0VGVzdENhc2Ugew0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBRTmFtZSBRTkFNRV9TRVJWSUNFID0gbmV3IFFOYW1lKCJ1cm46Ly9tdG9tMS5zYW1wbGUuamF4d3MuYXhpczIuYXBhY2hlLm9yZyIsICJTZW5kSW1hZ2VTZXJ2aWNlIik7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFFOYW1lIFFOQU1FX1BPUlQgICAgPSBuZXcgUU5hbWUoInVybjovL210b20xLnNhbXBsZS5qYXh3cy5heGlzMi5hcGFjaGUub3JnIiwgInNlbmRJbWFnZVNvYXAiKTsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTF9FTkRQT0lOVCA9ICJodHRwOi8vbG9jYWxob3N0OjYwNjAvYXhpczIvc2VydmljZXMvU2VuZEltYWdlU2VydmljZS5zZW5kSW1hZ2VQb3J0IjsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElNQUdFX0RJUiA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiYmFzZWRpciIsIi4iKStGaWxlLnNlcGFyYXRvcisidGVzdC1yZXNvdXJjZXMiK0ZpbGUuc2VwYXJhdG9yKyJpbWFnZSI7DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsNCi0gICAgICAgIHJldHVybiBnZXRUZXN0U2V0dXAobmV3IFRlc3RTdWl0ZShNdG9tU2FtcGxlQnl0ZUFycmF5VGVzdHMuY2xhc3MpKTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoNCi0gICAgICogRW5hYmxlIGF0dGFjaG1lbnQgT3B0aW1pemF0aW9uIHRocm91Z2ggdGhlIFNPQVBCaW5kaW5nIG1ldGhvZCANCi0gICAgICogLS0gc2V0TVRPTUVuYWJsZWQoW3RydWV8ZmFsc2VdKQ0KLSAgICAgKiBVc2luZyBTT0FQMTENCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIF90ZXN0QXR0YWNobWVudEJ5dGVBcnJheUFQSTExKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoInRlc3Q6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAJDQotICAgICAgCVN0cmluZyBpbWFnZVJlc291cmNlRGlyID0gSU1BR0VfRElSOw0KLSAgICAgIAkJDQotICAgICAgCVNlcnZpY2Ugc3ZjID0gU2VydmljZS5jcmVhdGUoUU5BTUVfU0VSVklDRSk7DQotICAgICAgCXN2Yy5hZGRQb3J0KFFOQU1FX1BPUlQsIFNPQVBCaW5kaW5nLlNPQVAxMUhUVFBfQklORElORywgVVJMX0VORFBPSU5UKTsNCi0gICAgICAJDQotICAgICAgCUpBWEJDb250ZXh0IGpiYyA9IEpBWEJDb250ZXh0Lm5ld0luc3RhbmNlKCJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5tdG9tMSIpOw0KLSAgICAgIAlEaXNwYXRjaDxPYmplY3Q+IGRpc3BhdGNoID0gc3ZjLmNyZWF0ZURpc3BhdGNoKFFOQU1FX1BPUlQsIGpiYywgU2VydmljZS5Nb2RlLlBBWUxPQUQpOw0KLSAgICAgIAkNCi0gICAgICAJU09BUEJpbmRpbmcgYmluZGluZyA9IChTT0FQQmluZGluZylkaXNwYXRjaC5nZXRCaW5kaW5nKCk7DQotICAgICAgCWJpbmRpbmcuc2V0TVRPTUVuYWJsZWQodHJ1ZSk7DQotICAgICAgCQ0KLSAgICAgIAlJbWFnZSBpbWFnZSA9IEltYWdlSU8ucmVhZCAobmV3IEZpbGUoaW1hZ2VSZXNvdXJjZURpcitGaWxlLnNlcGFyYXRvcisidGVzdC5qcGciKSk7DQotICAgICAgCUltYWdlRGVwb3QgaW1hZ2VEZXBvdCA9IG5ldyBPYmplY3RGYWN0b3J5KCkuY3JlYXRlSW1hZ2VEZXBvdCgpOw0KLSAgICAgIAlpbWFnZURlcG90LnNldEltYWdlRGF0YShpbWFnZSk7DQotICAgICAgICBzZXRUZXh0KGltYWdlRGVwb3QpOw0KLSAgICAgIAkNCi0gICAgICAJLy9DcmVhdGUgYSByZXF1ZXN0IGJlYW4gd2l0aCBpbWFnZWRlcG90IGJlYW4gYXMgdmFsdWUNCi0gICAgICAJT2JqZWN0RmFjdG9yeSBmYWN0b3J5ID0gbmV3IE9iamVjdEZhY3RvcnkoKTsNCi0gICAgICAJSW52b2tlIHJlcXVlc3QgPSBmYWN0b3J5LmNyZWF0ZUludm9rZSgpOw0KLSAgICAgIAlyZXF1ZXN0LnNldElucHV0KGltYWdlRGVwb3QpOw0KLSAgICAgIAkNCi0gICAgICAJU2VuZEltYWdlUmVzcG9uc2UgcmVzcG9uc2UgPSAoU2VuZEltYWdlUmVzcG9uc2UpIGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0gICAgICAJDQotICAgICAgCWFzc2VydE5vdE51bGwocmVzcG9uc2UpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXNwb25zZS5nZXRPdXRwdXQoKS5nZXRJbWFnZURhdGEoKSk7DQotICAgICAgICBjaGVja1RleHQocmVzcG9uc2UuZ2V0T3V0cHV0KCkpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBSZXBlYXQgdG8gdmVyaWZ5IGJlaGF2aW9yDQotICAgICAgICByZXNwb25zZSA9IChTZW5kSW1hZ2VSZXNwb25zZSkgZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLSAgICAgICAgDQotICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3BvbnNlKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwocmVzcG9uc2UuZ2V0T3V0cHV0KCkuZ2V0SW1hZ2VEYXRhKCkpOw0KLSAgICAgICAgY2hlY2tUZXh0KHJlc3BvbnNlLmdldE91dHB1dCgpKTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoNCi0gICAgICogRGlzYWJsZSBhdHRhY2htZW50IE9wdGltaXphdGlvbiB0aHJvdWdoIHRoZSBTT0FQQmluZGluZyBtZXRob2QgDQotICAgICAqIC0tIHNldE1UT01FbmFibGVkKFt0cnVlfGZhbHNlXSkNCi0gICAgICogVXNpbmcgU09BUDExDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXR0YWNobWVudEJ5dGVBcnJheUFQSTExX0NsaWVudFNlbmRzTm9uT3B0aW1pemVkTVRPTSgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJ0ZXN0OiAiICsgZ2V0TmFtZSgpKTsNCi0gICAgICAgIA0KLSAgICAgICAgU3RyaW5nIGltYWdlUmVzb3VyY2VEaXIgPSBJTUFHRV9ESVI7DQotICAgICAgICAgICAgDQotICAgICAgICBTZXJ2aWNlIHN2YyA9IFNlcnZpY2UuY3JlYXRlKFFOQU1FX1NFUlZJQ0UpOw0KLSAgICAgICAgc3ZjLmFkZFBvcnQoUU5BTUVfUE9SVCwgU09BUEJpbmRpbmcuU09BUDExSFRUUF9CSU5ESU5HLCBVUkxfRU5EUE9JTlQpOw0KLSAgICAgICAgDQotICAgICAgICBKQVhCQ29udGV4dCBqYmMgPSBKQVhCQ29udGV4dC5uZXdJbnN0YW5jZSgib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUubXRvbTEiKTsNCi0gICAgICAgIERpc3BhdGNoPE9iamVjdD4gZGlzcGF0Y2ggPSBzdmMuY3JlYXRlRGlzcGF0Y2goUU5BTUVfUE9SVCwgamJjLCBTZXJ2aWNlLk1vZGUuUEFZTE9BRCk7DQotICAgICAgICANCi0gICAgICAgIFNPQVBCaW5kaW5nIGJpbmRpbmcgPSAoU09BUEJpbmRpbmcpZGlzcGF0Y2guZ2V0QmluZGluZygpOw0KLSAgICAgICAgYmluZGluZy5zZXRNVE9NRW5hYmxlZChmYWxzZSk7ICAvLyBEaXNhYmxpbmcgTVRPTSBvcHRpbWl6YXRpb24gb24gY2xpZW50LCBidXQgc2VydmVyIHdpbGwgcmVzcG9uZCB3aXRoIG9wdGltaXplZCBNVE9NDQotICAgICAgICANCi0gICAgICAgIEltYWdlIGltYWdlID0gSW1hZ2VJTy5yZWFkIChuZXcgRmlsZShpbWFnZVJlc291cmNlRGlyK0ZpbGUuc2VwYXJhdG9yKyJ0ZXN0LmpwZyIpKTsNCi0gICAgICAgIEltYWdlRGVwb3QgaW1hZ2VEZXBvdCA9IG5ldyBPYmplY3RGYWN0b3J5KCkuY3JlYXRlSW1hZ2VEZXBvdCgpOw0KLSAgICAgICAgaW1hZ2VEZXBvdC5zZXRJbWFnZURhdGEoaW1hZ2UpOw0KLSAgICAgICAgc2V0VGV4dChpbWFnZURlcG90KTsNCi0gICAgICAgIA0KLSAgICAgICAgLy9DcmVhdGUgYSByZXF1ZXN0IGJlYW4gd2l0aCBpbWFnZWRlcG90IGJlYW4gYXMgdmFsdWUNCi0gICAgICAgIE9iamVjdEZhY3RvcnkgZmFjdG9yeSA9IG5ldyBPYmplY3RGYWN0b3J5KCk7DQotICAgICAgICBJbnZva2UgcmVxdWVzdCA9IGZhY3RvcnkuY3JlYXRlSW52b2tlKCk7DQotICAgICAgICByZXF1ZXN0LnNldElucHV0KGltYWdlRGVwb3QpOw0KLSAgICAgICAgDQotICAgICAgICBTZW5kSW1hZ2VSZXNwb25zZSByZXNwb25zZSA9IChTZW5kSW1hZ2VSZXNwb25zZSkgZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLSAgICAgICAgDQotICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3BvbnNlKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwocmVzcG9uc2UuZ2V0T3V0cHV0KCkuZ2V0SW1hZ2VEYXRhKCkpOw0KLSAgICAgICAgY2hlY2tUZXh0KHJlc3BvbnNlLmdldE91dHB1dCgpKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gUmVwZWF0IHRvIHZlcmlmeSBiZWhhdmlvcg0KLSAgICAgICAgcmVzcG9uc2UgPSAoU2VuZEltYWdlUmVzcG9uc2UpIGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0gICAgICAgIA0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXNwb25zZSk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3BvbnNlLmdldE91dHB1dCgpLmdldEltYWdlRGF0YSgpKTsNCi0gICAgICAgIGNoZWNrVGV4dChyZXNwb25zZS5nZXRPdXRwdXQoKSk7DQotICAgIH0NCi0gICAgDQotICAgIC8qDQotICAgICAqIEVuYWJsZSBhdHRhY2htZW50IG9wdGltaXphdGlvbiB1c2luZyB0aGUgU09BUDExIGJpbmRpbmcNCi0gICAgICogcHJvcGVydHkgZm9yIE1UT00uDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXR0YWNobWVudEJ5dGVBcnJheVByb3BlcnR5MTEoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIA0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJ0ZXN0OiAiICsgZ2V0TmFtZSgpKTsNCi0gICAgCQ0KLSAgICAgIAlTdHJpbmcgaW1hZ2VSZXNvdXJjZURpciA9IElNQUdFX0RJUjsNCi0gICAgICAJCQ0KLSAgICAgIAlTZXJ2aWNlIHN2YyA9IFNlcnZpY2UuY3JlYXRlKFFOQU1FX1NFUlZJQ0UpOw0KLSAgICAgIAlzdmMuYWRkUG9ydChRTkFNRV9QT1JULCBTT0FQQmluZGluZy5TT0FQMTFIVFRQX01UT01fQklORElORywgVVJMX0VORFBPSU5UKTsNCi0gICAgICAJDQotICAgICAgCUpBWEJDb250ZXh0IGpiYyA9IEpBWEJDb250ZXh0Lm5ld0luc3RhbmNlKCJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5tdG9tMSIpOw0KLSAgICAgIAlEaXNwYXRjaDxPYmplY3Q+IGRpc3BhdGNoID0gc3ZjLmNyZWF0ZURpc3BhdGNoKFFOQU1FX1BPUlQsIGpiYywgU2VydmljZS5Nb2RlLlBBWUxPQUQpOw0KLSAgICAgIAkNCi0gICAgICAJSW1hZ2UgaW1hZ2UgPSBJbWFnZUlPLnJlYWQgKG5ldyBGaWxlKGltYWdlUmVzb3VyY2VEaXIrRmlsZS5zZXBhcmF0b3IrInRlc3QuanBnIikpOw0KLSAgICAgIAlJbWFnZURlcG90IGltYWdlRGVwb3QgPSBuZXcgT2JqZWN0RmFjdG9yeSgpLmNyZWF0ZUltYWdlRGVwb3QoKTsNCi0gICAgICAJaW1hZ2VEZXBvdC5zZXRJbWFnZURhdGEoaW1hZ2UpOw0KLSAgICAgICAgc2V0VGV4dChpbWFnZURlcG90KTsNCi0gICAgICAJDQotICAgICAgCS8vQ3JlYXRlIGEgcmVxdWVzdCBiZWFuIHdpdGggaW1hZ2VkZXBvdCBiZWFuIGFzIHZhbHVlDQotICAgICAgCU9iamVjdEZhY3RvcnkgZmFjdG9yeSA9IG5ldyBPYmplY3RGYWN0b3J5KCk7DQotICAgICAgCUludm9rZSByZXF1ZXN0ID0gZmFjdG9yeS5jcmVhdGVJbnZva2UoKTsNCi0gICAgICAJcmVxdWVzdC5zZXRJbnB1dChpbWFnZURlcG90KTsNCi0gICAgICAJDQotICAgICAgCVNlbmRJbWFnZVJlc3BvbnNlIHJlc3BvbnNlID0gKFNlbmRJbWFnZVJlc3BvbnNlKSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7DQotICAgICAgCQ0KLSAgICAgIAlhc3NlcnROb3ROdWxsKHJlc3BvbnNlKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwocmVzcG9uc2UuZ2V0T3V0cHV0KCkuZ2V0SW1hZ2VEYXRhKCkpOw0KLSAgICAgICAgY2hlY2tUZXh0KHJlc3BvbnNlLmdldE91dHB1dCgpKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gUmVwZWF0IHRvIHZlcmlmeSBiZWhhdmlvcg0KLSAgICAgICAgcmVzcG9uc2UgPSAoU2VuZEltYWdlUmVzcG9uc2UpIGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0gICAgICAgIA0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXNwb25zZSk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3BvbnNlLmdldE91dHB1dCgpLmdldEltYWdlRGF0YSgpKTsNCi0gICAgICAgIGNoZWNrVGV4dChyZXNwb25zZS5nZXRPdXRwdXQoKSk7DQotICAgICAgICANCi0gICAgfQ0KLSAgICANCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHRleHQgPSAiQmluYXJ5IEF0dGFjaG1lbnRzIGFyZSByYWRpY2FsIjsNCi0gICAgcHJpdmF0ZSB2b2lkIHNldFRleHQoSW1hZ2VEZXBvdCBkZXBvdCkgew0KLSAgICAgICAgDQotICAgICAgICBCYXNlNjRCaW5hcnkgYmluYXJ5ID0gbmV3IEJhc2U2NEJpbmFyeSgpOw0KLSAgICAgICAgYmluYXJ5LnNldENvbnRlbnRUeXBlKCIiKTsNCi0gICAgICAgIGJpbmFyeS5zZXRWYWx1ZSh0ZXh0LmdldEJ5dGVzKCkpOw0KLSAgICAgICAgZGVwb3Quc2V0VGV4dERhdGEoYmluYXJ5KTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrVGV4dChJbWFnZURlcG90IGRlcG90KSB7DQotICAgICAgICBCYXNlNjRCaW5hcnkgYmluYXJ5ID0gZGVwb3QuZ2V0VGV4dERhdGEoKTsNCi0gICAgICAgIGFzc2VydFRydWUoYmluYXJ5ICE9IG51bGwpOw0KLSAgICAgICAgU3RyaW5nIGNvbnRlbnRUeXBlID0gYmluYXJ5LmdldENvbnRlbnRUeXBlKCk7DQotICAgICAgICBhc3NlcnRUcnVlKCIiLmVxdWFscyhjb250ZW50VHlwZSkpOw0KLSAgICAgICAgYnl0ZVtdIGJ5dGVzID0gYmluYXJ5LmdldFZhbHVlKCk7DQotICAgICAgICBhc3NlcnRUcnVlKGJ5dGVzICE9IG51bGwpOw0KLSAgICAgICAgU3RyaW5nIHRoZVRleHQgPSBuZXcgU3RyaW5nKGJ5dGVzKTsNCi0gICAgICAgIGFzc2VydFRydWUodGV4dC5lcXVhbHModGhlVGV4dCkpOw0KLSAgICB9DQotICAgIA0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL010b21TYW1wbGVUZXN0cy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9NdG9tU2FtcGxlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTVhZmJmZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL010b21TYW1wbGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODg2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlOw0KLQ0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhc291cmNlLmpheGIuSkFYQkF0dGFjaG1lbnRVbm1hcnNoYWxsZXJNb25pdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLlRlc3RMb2dnZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZnJhbWV3b3JrLkFic3RyYWN0VGVzdENhc2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJvdmlkZXIuRGF0YVNvdXJjZUltcGw7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5VdGlsczsNCi1pbXBvcnQgb3JnLnRlc3QubXRvbS5JbWFnZURlcG90Ow0KLWltcG9ydCBvcmcudGVzdC5tdG9tLk9iamVjdEZhY3Rvcnk7DQotaW1wb3J0IG9yZy50ZXN0Lm10b20uU2VuZEltYWdlOw0KLWltcG9ydCBvcmcudGVzdC5tdG9tLlNlbmRJbWFnZVJlc3BvbnNlOw0KLQ0KLWltcG9ydCBqYXZheC5hY3RpdmF0aW9uLkRhdGFIYW5kbGVyOw0KLWltcG9ydCBqYXZheC5hY3RpdmF0aW9uLkRhdGFTb3VyY2U7DQotaW1wb3J0IGphdmF4LmltYWdlaW8uSW1hZ2VJTzsNCi1pbXBvcnQgamF2YXguaW1hZ2Vpby5zdHJlYW0uRmlsZUltYWdlSW5wdXRTdHJlYW07DQotaW1wb3J0IGphdmF4LmltYWdlaW8uc3RyZWFtLkltYWdlSW5wdXRTdHJlYW07DQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJDb250ZXh0Ow0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOw0KLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQQ29uc3RhbnRzOw0KLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRmF1bHQ7DQotaW1wb3J0IGphdmF4LnhtbC53cy5EaXNwYXRjaDsNCi1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlLk1vZGU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5zb2FwLk1UT01GZWF0dXJlOw0KLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5TT0FQQmluZGluZzsNCi1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuU09BUEZhdWx0RXhjZXB0aW9uOw0KLQ0KLWltcG9ydCBqYXZhLmF3dC5JbWFnZTsNCi1pbXBvcnQgamF2YS5pby5GaWxlOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi1wdWJsaWMgY2xhc3MgTXRvbVNhbXBsZVRlc3RzIGV4dGVuZHMgQWJzdHJhY3RUZXN0Q2FzZSB7DQotDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFFOYW1lIFFOQU1FX1NFUlZJQ0UgPSBuZXcgUU5hbWUoInVybjovL210b20udGVzdC5vcmciLCAiTXRvbVNhbXBsZVNlcnZpY2UiKTsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUU5hbWUgUU5BTUVfUE9SVCAgICA9IG5ldyBRTmFtZSgidXJuOi8vbXRvbS50ZXN0Lm9yZyIsICJNdG9tU2FtcGxlIik7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVUkxfRU5EUE9JTlQgPSAiaHR0cDovL2xvY2FsaG9zdDo2MDYwL2F4aXMyL3NlcnZpY2VzL010b21TYW1wbGVTZXJ2aWNlLk10b21TYW1wbGVTZXJ2aWNlUG9ydCI7DQotICAgIA0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMX0VORFBPSU5UX01UT01ESVNBQkxFID0gDQotICAgICAgICAiaHR0cDovL2xvY2FsaG9zdDo2MDYwL2F4aXMyL3NlcnZpY2VzL010b21TYW1wbGVTZXJ2aWNlLk10b21TYW1wbGVNVE9NRGlzYWJsZVNlcnZpY2VQb3J0IjsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTF9FTkRQT0lOVF9NVE9NRElTQUJMRTIgPSANCi0gICAgICAgICJodHRwOi8vbG9jYWxob3N0OjYwNjAvYXhpczIvc2VydmljZXMvTXRvbVNhbXBsZVNlcnZpY2UuTXRvbVNhbXBsZU1UT01EaXNhYmxlMlNlcnZpY2VQb3J0IjsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTF9FTkRQT0lOVF9NVE9NRU5BQkxFID0gDQotICAgICAgICAiaHR0cDovL2xvY2FsaG9zdDo2MDYwL2F4aXMyL3NlcnZpY2VzL010b21TYW1wbGVTZXJ2aWNlLk10b21TYW1wbGVNVE9NRW5hYmxlU2VydmljZVBvcnQiOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMX0VORFBPSU5UX01UT01ERUZBVUxUID0gDQotICAgICAgICAiaHR0cDovL2xvY2FsaG9zdDo2MDYwL2F4aXMyL3NlcnZpY2VzL010b21TYW1wbGVTZXJ2aWNlLk10b21TYW1wbGVNVE9NRGVmYXVsdFNlcnZpY2VQb3J0IjsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTF9FTkRQT0lOVF9NVE9NVEhSRVNIT0xEID0gDQotICAgICAgICAiaHR0cDovL2xvY2FsaG9zdDo2MDYwL2F4aXMyL3NlcnZpY2VzL010b21TYW1wbGVTZXJ2aWNlLk10b21TYW1wbGVNVE9NVGhyZXNob2xkU2VydmljZVBvcnQiOw0KLSAgICANCi0gICAgDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTUFHRV9ESVIgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImJhc2VkaXIiLCIuIikrIi8iKyJ0ZXN0LXJlc291cmNlcyIrRmlsZS5zZXBhcmF0b3IrImltYWdlIjsgICANCi0gICAgDQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gQ0hFQ0tfVkVSU0lPTk1JU01BVENIID0gdHJ1ZTsNCi0gICAgDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsNCi0gICAgICAgIHJldHVybiBnZXRUZXN0U2V0dXAobmV3IFRlc3RTdWl0ZShNdG9tU2FtcGxlVGVzdHMuY2xhc3MpKTsNCi0gICAgfQ0KLSAgIA0KLSAgICAvKg0KLSAgICAgKiBFbmFibGUgYXR0YWNobWVudCBPcHRpbWl6YXRpb24gdGhyb3VnaCB0aGUgU09BUEJpbmRpbmcgbWV0aG9kIA0KLSAgICAgKiAtLSBzZXRNVE9NRW5hYmxlZChbdHJ1ZXxmYWxzZV0pDQotICAgICAqIFVzaW5nIFNPQVAxMQ0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdFNlbmRJbWFnZUF0dGFjaG1lbnRBUEkxMSgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJ0ZXN0OiAiICsgZ2V0TmFtZSgpKTsNCi0gICAgICAgIA0KLSAgICAgICAgU3RyaW5nIGltYWdlUmVzb3VyY2VEaXIgPSBJTUFHRV9ESVI7DQotICAgICAgICANCi0gICAgICAgIC8vQ3JlYXRlIGEgRGF0YVNvdXJjZSBmcm9tIGFuIGltYWdlIA0KLSAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoaW1hZ2VSZXNvdXJjZURpcitGaWxlLnNlcGFyYXRvcisidGVzdC5qcGciKTsNCi0gICAgICAgIEltYWdlSW5wdXRTdHJlYW0gZmlpcyA9IG5ldyBGaWxlSW1hZ2VJbnB1dFN0cmVhbShmaWxlKTsNCi0gICAgICAgIEltYWdlIGltYWdlID0gSW1hZ2VJTy5yZWFkKGZpaXMpOw0KLSAgICAgICAgRGF0YVNvdXJjZSBpbWFnZURTID0gbmV3IERhdGFTb3VyY2VJbXBsKCJpbWFnZS9qcGVnIiwidGVzdC5qcGciLGltYWdlKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy9DcmVhdGUgYSBEYXRhSGFuZGxlciB3aXRoIHRoZSBTdHJpbmcgRGF0YVNvdXJjZSBvYmplY3QNCi0gICAgICAgIERhdGFIYW5kbGVyIGRhdGFIYW5kbGVyID0gbmV3IERhdGFIYW5kbGVyKGltYWdlRFMpOw0KLSAgICAgICAgDQotICAgICAgICAvL1N0b3JlIHRoZSBkYXRhIGhhbmRsZXIgaW4gSW1hZ2VEZXBvdCBiZWFuDQotICAgICAgICBJbWFnZURlcG90IGltYWdlRGVwb3QgPSBuZXcgT2JqZWN0RmFjdG9yeSgpLmNyZWF0ZUltYWdlRGVwb3QoKTsNCi0gICAgICAgIGltYWdlRGVwb3Quc2V0SW1hZ2VEYXRhKGRhdGFIYW5kbGVyKTsNCi0gICAgICAgIA0KLSAgICAgICAgU2VuZEltYWdlIHJlcXVlc3QgPSBuZXcgT2JqZWN0RmFjdG9yeSgpLmNyZWF0ZVNlbmRJbWFnZSgpOw0KLSAgICAgICAgcmVxdWVzdC5zZXRJbnB1dChpbWFnZURlcG90KTsNCi0gICAgICAgIA0KLSAgICAgICAgLy9DcmVhdGUgdGhlIG5lY2Vzc2FyeSBKQVhCQ29udGV4dA0KLSAgICAgICAgSkFYQkNvbnRleHQgamJjID0gSkFYQkNvbnRleHQubmV3SW5zdGFuY2UoIm9yZy50ZXN0Lm10b20iKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQ3JlYXRlIHRoZSBKQVgtV1MgY2xpZW50IG5lZWRlZCB0byBzZW5kIHRoZSByZXF1ZXN0DQotICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSBTZXJ2aWNlLmNyZWF0ZShRTkFNRV9TRVJWSUNFKTsNCi0gICAgICAgIHNlcnZpY2UuYWRkUG9ydChRTkFNRV9QT1JULCBTT0FQQmluZGluZy5TT0FQMTFIVFRQX0JJTkRJTkcsIFVSTF9FTkRQT0lOVCk7DQotICAgICAgICBEaXNwYXRjaDxPYmplY3Q+IGRpc3BhdGNoID0gc2VydmljZS5jcmVhdGVEaXNwYXRjaChRTkFNRV9QT1JULCBqYmMsIE1vZGUuUEFZTE9BRCk7DQotICAgICAgICANCi0gICAgICAgIC8vRW5hYmxlIGF0dGFjaG1lbnQgb3B0aW1pemF0aW9uDQotICAgICAgICBTT0FQQmluZGluZyBiaW5kaW5nID0gKFNPQVBCaW5kaW5nKSBkaXNwYXRjaC5nZXRCaW5kaW5nKCk7DQotICAgICAgICBiaW5kaW5nLnNldE1UT01FbmFibGVkKHRydWUpOw0KLSAgICAgICAgDQotICAgICAgICBTZW5kSW1hZ2VSZXNwb25zZSByZXNwb25zZSA9IChTZW5kSW1hZ2VSZXNwb25zZSkgZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLSAgICAgICAgDQotICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3BvbnNlKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwocmVzcG9uc2UuZ2V0T3V0cHV0KCkuZ2V0SW1hZ2VEYXRhKCkpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBSZXBlYXQgdG8gdmVyaWZ5IGJlaGF2aW9yDQotICAgICAgICByZXNwb25zZSA9IChTZW5kSW1hZ2VSZXNwb25zZSkgZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLSAgICAgICAgDQotICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3BvbnNlKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwocmVzcG9uc2UuZ2V0T3V0cHV0KCkuZ2V0SW1hZ2VEYXRhKCkpOw0KLSAgICB9DQotICAgIA0KLSAgICAvKg0KLSAgICAgKiBFbmFibGUgYXR0YWNobWVudCBPcHRpbWl6YXRpb24gdGhyb3VnaCB0aGUgTVRPTUZlYXR1cmUNCi0gICAgICogVXNpbmcgU09BUDExDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2VuZEltYWdlRmVhdHVyZTExKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoInRlc3Q6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgDQotICAgICAgICBTdHJpbmcgaW1hZ2VSZXNvdXJjZURpciA9IElNQUdFX0RJUjsNCi0gICAgICAgIA0KLSAgICAgICAgLy9DcmVhdGUgYSBEYXRhU291cmNlIGZyb20gYW4gaW1hZ2UgDQotICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShpbWFnZVJlc291cmNlRGlyK0ZpbGUuc2VwYXJhdG9yKyJ0ZXN0LmpwZyIpOw0KLSAgICAgICAgSW1hZ2VJbnB1dFN0cmVhbSBmaWlzID0gbmV3IEZpbGVJbWFnZUlucHV0U3RyZWFtKGZpbGUpOw0KLSAgICAgICAgSW1hZ2UgaW1hZ2UgPSBJbWFnZUlPLnJlYWQoZmlpcyk7DQotICAgICAgICBEYXRhU291cmNlIGltYWdlRFMgPSBuZXcgRGF0YVNvdXJjZUltcGwoImltYWdlL2pwZWciLCJ0ZXN0LmpwZyIsaW1hZ2UpOw0KLSAgICAgICAgDQotICAgICAgICAvL0NyZWF0ZSBhIERhdGFIYW5kbGVyIHdpdGggdGhlIFN0cmluZyBEYXRhU291cmNlIG9iamVjdA0KLSAgICAgICAgRGF0YUhhbmRsZXIgZGF0YUhhbmRsZXIgPSBuZXcgRGF0YUhhbmRsZXIoaW1hZ2VEUyk7DQotICAgICAgICANCi0gICAgICAgIC8vU3RvcmUgdGhlIGRhdGEgaGFuZGxlciBpbiBJbWFnZURlcG90IGJlYW4NCi0gICAgICAgIEltYWdlRGVwb3QgaW1hZ2VEZXBvdCA9IG5ldyBPYmplY3RGYWN0b3J5KCkuY3JlYXRlSW1hZ2VEZXBvdCgpOw0KLSAgICAgICAgaW1hZ2VEZXBvdC5zZXRJbWFnZURhdGEoZGF0YUhhbmRsZXIpOw0KLSAgICAgICAgDQotICAgICAgICBTZW5kSW1hZ2UgcmVxdWVzdCA9IG5ldyBPYmplY3RGYWN0b3J5KCkuY3JlYXRlU2VuZEltYWdlKCk7DQotICAgICAgICByZXF1ZXN0LnNldElucHV0KGltYWdlRGVwb3QpOw0KLSAgICAgICAgDQotICAgICAgICAvL0NyZWF0ZSB0aGUgbmVjZXNzYXJ5IEpBWEJDb250ZXh0DQotICAgICAgICBKQVhCQ29udGV4dCBqYmMgPSBKQVhCQ29udGV4dC5uZXdJbnN0YW5jZSgib3JnLnRlc3QubXRvbSIpOw0KLSAgICAgICAgDQotICAgICAgICBNVE9NRmVhdHVyZSBtdG9tMjEgPSBuZXcgTVRPTUZlYXR1cmUoKTsNCi0NCi0gICAgICAgIC8vIENyZWF0ZSB0aGUgSkFYLVdTIGNsaWVudCBuZWVkZWQgdG8gc2VuZCB0aGUgcmVxdWVzdA0KLSAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gU2VydmljZS5jcmVhdGUoUU5BTUVfU0VSVklDRSk7DQotICAgICAgICBzZXJ2aWNlLmFkZFBvcnQoUU5BTUVfUE9SVCwgU09BUEJpbmRpbmcuU09BUDExSFRUUF9CSU5ESU5HLCBVUkxfRU5EUE9JTlQpOw0KLSAgICAgICAgRGlzcGF0Y2g8T2JqZWN0PiBkaXNwYXRjaCA9IHNlcnZpY2UuY3JlYXRlRGlzcGF0Y2goUU5BTUVfUE9SVCwgamJjLCBNb2RlLlBBWUxPQUQsIG10b20yMSk7DQotICAgICAgICANCi0gICAgICAgIExpc3QgY2lkcyA9IG51bGw7DQotICAgICAgICBTZW5kSW1hZ2VSZXNwb25zZSByZXNwb25zZSA9IG51bGw7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIEpBWEJBdHRhY2htZW50VW5tYXJzaGFsbGVyTW9uaXRvci5zZXRNb25pdG9yaW5nKHRydWUpOw0KLSAgICAgICAgICAgIHJlc3BvbnNlID0gKFNlbmRJbWFnZVJlc3BvbnNlKSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gVGhlIGNpZHMgYXJlIGNvbGxlY3RlZCBpbiB0aGUgbW9uaXRvci4gIFdlIHdpbGwgY2hlY2sNCi0gICAgICAgICAgICAvLyB0aGlzIHRvIG1ha2Ugc3VyZSB0aGUgcmVzcG9uc2UgbXRvbSBpcyBub3QgaW5saW5lZA0KLSAgICAgICAgICAgIGNpZHMgPSBKQVhCQXR0YWNobWVudFVubWFyc2hhbGxlck1vbml0b3IuZ2V0QmxvYkNJRHMoKTsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgICAgSkFYQkF0dGFjaG1lbnRVbm1hcnNoYWxsZXJNb25pdG9yLnNldE1vbml0b3JpbmcoZmFsc2UpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICANCi0gICAgICAgIGFzc2VydE5vdE51bGwocmVzcG9uc2UpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXNwb25zZS5nZXRPdXRwdXQoKS5nZXRJbWFnZURhdGEoKSk7DQotICAgICAgICANCi0gICAgICAgIA0KLSAgICAgICAgaW50IG51bUNJRHMgPSAoY2lkcyA9PSBudWxsKSA/IDAgOiBjaWRzLnNpemUoKTsNCi0gICAgICAgIGFzc2VydFRydWUoIkV4cGVjdGVkIG9uZSBhdHRhY2htZW50IGJ1dCB0aGVyZSB3ZXJlOiIgKyBudW1DSURzLCBudW1DSURzID09IDEpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBSZXBlYXQgdG8gdmVyaWZ5IGJlaGF2aW9yDQotICAgICAgICByZXNwb25zZSA9IG51bGw7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIEpBWEJBdHRhY2htZW50VW5tYXJzaGFsbGVyTW9uaXRvci5zZXRNb25pdG9yaW5nKHRydWUpOw0KLSAgICAgICAgICAgIHJlc3BvbnNlID0gKFNlbmRJbWFnZVJlc3BvbnNlKSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gVGhlIGNpZHMgYXJlIGNvbGxlY3RlZCBpbiB0aGUgbW9uaXRvci4gIFdlIHdpbGwgY2hlY2sNCi0gICAgICAgICAgICAvLyB0aGlzIHRvIG1ha2Ugc3VyZSB0aGUgcmVzcG9uc2UgbXRvbSBpcyBub3QgaW5saW5lZA0KLSAgICAgICAgICAgIGNpZHMgPSBKQVhCQXR0YWNobWVudFVubWFyc2hhbGxlck1vbml0b3IuZ2V0QmxvYkNJRHMoKTsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgICAgSkFYQkF0dGFjaG1lbnRVbm1hcnNoYWxsZXJNb25pdG9yLnNldE1vbml0b3JpbmcoZmFsc2UpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICANCi0gICAgICAgIGFzc2VydE5vdE51bGwocmVzcG9uc2UpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXNwb25zZS5nZXRPdXRwdXQoKS5nZXRJbWFnZURhdGEoKSk7DQotICAgICAgICANCi0gICAgICAgIA0KLSAgICAgICAgbnVtQ0lEcyA9IChjaWRzID09IG51bGwpID8gMCA6IGNpZHMuc2l6ZSgpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgb25lIGF0dGFjaG1lbnQgYnV0IHRoZXJlIHdlcmU6IiArIG51bUNJRHMsIG51bUNJRHMgPT0gMSk7DQotICAgIH0NCi0gICAgDQotICAgIC8qDQotICAgICAqIEVuYWJsZSBhdHRhY2htZW50IE9wdGltaXphdGlvbiBidXQgY2FsbCBhbiBlbmRwb2ludCB3aXRoIEBNVE9NKGVuYWJsZT1mYWxzZSkNCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RTZW5kSW1hZ2VfTVRPTURpc2FibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygidGVzdDogIiArIGdldE5hbWUoKSk7DQotICAgICAgICANCi0gICAgICAgIFN0cmluZyBpbWFnZVJlc291cmNlRGlyID0gSU1BR0VfRElSOw0KLSAgICAgICAgDQotICAgICAgICAvL0NyZWF0ZSBhIERhdGFTb3VyY2UgZnJvbSBhbiBpbWFnZSANCi0gICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGltYWdlUmVzb3VyY2VEaXIrRmlsZS5zZXBhcmF0b3IrInRlc3QuanBnIik7DQotICAgICAgICBJbWFnZUlucHV0U3RyZWFtIGZpaXMgPSBuZXcgRmlsZUltYWdlSW5wdXRTdHJlYW0oZmlsZSk7DQotICAgICAgICBJbWFnZSBpbWFnZSA9IEltYWdlSU8ucmVhZChmaWlzKTsNCi0gICAgICAgIERhdGFTb3VyY2UgaW1hZ2VEUyA9IG5ldyBEYXRhU291cmNlSW1wbCgiaW1hZ2UvanBlZyIsInRlc3QuanBnIixpbWFnZSk7DQotICAgICAgICANCi0gICAgICAgIC8vQ3JlYXRlIGEgRGF0YUhhbmRsZXIgd2l0aCB0aGUgU3RyaW5nIERhdGFTb3VyY2Ugb2JqZWN0DQotICAgICAgICBEYXRhSGFuZGxlciBkYXRhSGFuZGxlciA9IG5ldyBEYXRhSGFuZGxlcihpbWFnZURTKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy9TdG9yZSB0aGUgZGF0YSBoYW5kbGVyIGluIEltYWdlRGVwb3QgYmVhbg0KLSAgICAgICAgSW1hZ2VEZXBvdCBpbWFnZURlcG90ID0gbmV3IE9iamVjdEZhY3RvcnkoKS5jcmVhdGVJbWFnZURlcG90KCk7DQotICAgICAgICBpbWFnZURlcG90LnNldEltYWdlRGF0YShkYXRhSGFuZGxlcik7DQotICAgICAgICANCi0gICAgICAgIFNlbmRJbWFnZSByZXF1ZXN0ID0gbmV3IE9iamVjdEZhY3RvcnkoKS5jcmVhdGVTZW5kSW1hZ2UoKTsNCi0gICAgICAgIHJlcXVlc3Quc2V0SW5wdXQoaW1hZ2VEZXBvdCk7DQotICAgICAgICANCi0gICAgICAgIC8vQ3JlYXRlIHRoZSBuZWNlc3NhcnkgSkFYQkNvbnRleHQNCi0gICAgICAgIEpBWEJDb250ZXh0IGpiYyA9IEpBWEJDb250ZXh0Lm5ld0luc3RhbmNlKCJvcmcudGVzdC5tdG9tIik7DQotICAgICAgICANCi0gICAgICAgIE1UT01GZWF0dXJlIG10b20yMSA9IG5ldyBNVE9NRmVhdHVyZSgpOw0KLQ0KLSAgICAgICAgLy8gQ3JlYXRlIHRoZSBKQVgtV1MgY2xpZW50IG5lZWRlZCB0byBzZW5kIHRoZSByZXF1ZXN0DQotICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSBTZXJ2aWNlLmNyZWF0ZShRTkFNRV9TRVJWSUNFKTsNCi0gICAgICAgIHNlcnZpY2UuYWRkUG9ydChRTkFNRV9QT1JULCBTT0FQQmluZGluZy5TT0FQMTFIVFRQX0JJTkRJTkcsIFVSTF9FTkRQT0lOVF9NVE9NRElTQUJMRSk7DQotICAgICAgICBEaXNwYXRjaDxPYmplY3Q+IGRpc3BhdGNoID0gc2VydmljZS5jcmVhdGVEaXNwYXRjaChRTkFNRV9QT1JULCBqYmMsIE1vZGUuUEFZTE9BRCwgbXRvbTIxKTsNCi0gICAgICAgIA0KLSAgICAgICAgTGlzdCBjaWRzID0gbnVsbDsNCi0gICAgICAgIFNlbmRJbWFnZVJlc3BvbnNlIHJlc3BvbnNlID0gbnVsbDsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgSkFYQkF0dGFjaG1lbnRVbm1hcnNoYWxsZXJNb25pdG9yLnNldE1vbml0b3JpbmcodHJ1ZSk7DQotICAgICAgICAgICAgcmVzcG9uc2UgPSAoU2VuZEltYWdlUmVzcG9uc2UpIGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBUaGUgY2lkcyBhcmUgY29sbGVjdGVkIGluIHRoZSBtb25pdG9yLiAgV2Ugd2lsbCBjaGVjaw0KLSAgICAgICAgICAgIC8vIHRoaXMgdG8gbWFrZSBzdXJlIHRoZSByZXNwb25zZSBtdG9tIGlzIG5vdCBpbmxpbmVkDQotICAgICAgICAgICAgY2lkcyA9IEpBWEJBdHRhY2htZW50VW5tYXJzaGFsbGVyTW9uaXRvci5nZXRCbG9iQ0lEcygpOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgICBKQVhCQXR0YWNobWVudFVubWFyc2hhbGxlck1vbml0b3Iuc2V0TW9uaXRvcmluZyhmYWxzZSk7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIA0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXNwb25zZSk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3BvbnNlLmdldE91dHB1dCgpLmdldEltYWdlRGF0YSgpKTsNCi0gICAgICAgIA0KLSAgICAgICAgDQotICAgICAgICBpbnQgbnVtQ0lEcyA9IChjaWRzID09IG51bGwpID8gMCA6IGNpZHMuc2l6ZSgpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgemVybyBhdHRhY2htZW50cyBidXQgdGhlcmUgd2VyZToiICsgbnVtQ0lEcywgbnVtQ0lEcyA9PSAwKTsNCi0gICAgICAgIA0KLSAgICAgICAgDQotICAgICAgICAvLyBSZXBlYXQgdG8gdmVyaWZ5IGJlaGF2aW9yDQotICAgICAgICByZXNwb25zZSA9IG51bGw7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIEpBWEJBdHRhY2htZW50VW5tYXJzaGFsbGVyTW9uaXRvci5zZXRNb25pdG9yaW5nKHRydWUpOw0KLSAgICAgICAgICAgIHJlc3BvbnNlID0gKFNlbmRJbWFnZVJlc3BvbnNlKSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gVGhlIGNpZHMgYXJlIGNvbGxlY3RlZCBpbiB0aGUgbW9uaXRvci4gIFdlIHdpbGwgY2hlY2sNCi0gICAgICAgICAgICAvLyB0aGlzIHRvIG1ha2Ugc3VyZSB0aGUgcmVzcG9uc2UgbXRvbSBpcyBub3QgaW5saW5lZA0KLSAgICAgICAgICAgIGNpZHMgPSBKQVhCQXR0YWNobWVudFVubWFyc2hhbGxlck1vbml0b3IuZ2V0QmxvYkNJRHMoKTsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgICAgSkFYQkF0dGFjaG1lbnRVbm1hcnNoYWxsZXJNb25pdG9yLnNldE1vbml0b3JpbmcoZmFsc2UpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICANCi0gICAgICAgIGFzc2VydE5vdE51bGwocmVzcG9uc2UpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXNwb25zZS5nZXRPdXRwdXQoKS5nZXRJbWFnZURhdGEoKSk7DQotICAgICAgICANCi0gICAgICAgIA0KLSAgICAgICAgbnVtQ0lEcyA9IChjaWRzID09IG51bGwpID8gMCA6IGNpZHMuc2l6ZSgpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgemVybyBhdHRhY2htZW50cyBidXQgdGhlcmUgd2VyZToiICsgbnVtQ0lEcywgbnVtQ0lEcyA9PSAwKTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoNCi0gICAgICogRW5hYmxlIGF0dGFjaG1lbnQgT3B0aW1pemF0aW9uIGJ1dCBjYWxsIGFuIGVuZHBvaW50IHdpdGggQE1UT00oZW5hYmxlPWZhbHNlKQ0KLSAgICAgKiB3aGljaCBzaG91bGQgb3ZlcnJpZGUgdGhlIE1UT00gQmluZGluZ1R5cGUNCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RTZW5kSW1hZ2VfTVRPTURpc2FibGUyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoInRlc3Q6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgDQotICAgICAgICBTdHJpbmcgaW1hZ2VSZXNvdXJjZURpciA9IElNQUdFX0RJUjsNCi0gICAgICAgIA0KLSAgICAgICAgLy9DcmVhdGUgYSBEYXRhU291cmNlIGZyb20gYW4gaW1hZ2UgDQotICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShpbWFnZVJlc291cmNlRGlyK0ZpbGUuc2VwYXJhdG9yKyJ0ZXN0LmpwZyIpOw0KLSAgICAgICAgSW1hZ2VJbnB1dFN0cmVhbSBmaWlzID0gbmV3IEZpbGVJbWFnZUlucHV0U3RyZWFtKGZpbGUpOw0KLSAgICAgICAgSW1hZ2UgaW1hZ2UgPSBJbWFnZUlPLnJlYWQoZmlpcyk7DQotICAgICAgICBEYXRhU291cmNlIGltYWdlRFMgPSBuZXcgRGF0YVNvdXJjZUltcGwoImltYWdlL2pwZWciLCJ0ZXN0LmpwZyIsaW1hZ2UpOw0KLSAgICAgICAgDQotICAgICAgICAvL0NyZWF0ZSBhIERhdGFIYW5kbGVyIHdpdGggdGhlIFN0cmluZyBEYXRhU291cmNlIG9iamVjdA0KLSAgICAgICAgRGF0YUhhbmRsZXIgZGF0YUhhbmRsZXIgPSBuZXcgRGF0YUhhbmRsZXIoaW1hZ2VEUyk7DQotICAgICAgICANCi0gICAgICAgIC8vU3RvcmUgdGhlIGRhdGEgaGFuZGxlciBpbiBJbWFnZURlcG90IGJlYW4NCi0gICAgICAgIEltYWdlRGVwb3QgaW1hZ2VEZXBvdCA9IG5ldyBPYmplY3RGYWN0b3J5KCkuY3JlYXRlSW1hZ2VEZXBvdCgpOw0KLSAgICAgICAgaW1hZ2VEZXBvdC5zZXRJbWFnZURhdGEoZGF0YUhhbmRsZXIpOw0KLSAgICAgICAgDQotICAgICAgICBTZW5kSW1hZ2UgcmVxdWVzdCA9IG5ldyBPYmplY3RGYWN0b3J5KCkuY3JlYXRlU2VuZEltYWdlKCk7DQotICAgICAgICByZXF1ZXN0LnNldElucHV0KGltYWdlRGVwb3QpOw0KLSAgICAgICAgDQotICAgICAgICAvL0NyZWF0ZSB0aGUgbmVjZXNzYXJ5IEpBWEJDb250ZXh0DQotICAgICAgICBKQVhCQ29udGV4dCBqYmMgPSBKQVhCQ29udGV4dC5uZXdJbnN0YW5jZSgib3JnLnRlc3QubXRvbSIpOw0KLSAgICAgICAgDQotICAgICAgICBNVE9NRmVhdHVyZSBtdG9tMjEgPSBuZXcgTVRPTUZlYXR1cmUoKTsNCi0NCi0gICAgICAgIC8vIENyZWF0ZSB0aGUgSkFYLVdTIGNsaWVudCBuZWVkZWQgdG8gc2VuZCB0aGUgcmVxdWVzdA0KLSAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gU2VydmljZS5jcmVhdGUoUU5BTUVfU0VSVklDRSk7DQotICAgICAgICBzZXJ2aWNlLmFkZFBvcnQoUU5BTUVfUE9SVCwgU09BUEJpbmRpbmcuU09BUDExSFRUUF9CSU5ESU5HLCBVUkxfRU5EUE9JTlRfTVRPTURJU0FCTEUyKTsNCi0gICAgICAgIERpc3BhdGNoPE9iamVjdD4gZGlzcGF0Y2ggPSBzZXJ2aWNlLmNyZWF0ZURpc3BhdGNoKFFOQU1FX1BPUlQsIGpiYywgTW9kZS5QQVlMT0FELCBtdG9tMjEpOw0KLSAgICAgICAgDQotICAgICAgICBMaXN0IGNpZHMgPSBudWxsOw0KLSAgICAgICAgU2VuZEltYWdlUmVzcG9uc2UgcmVzcG9uc2UgPSBudWxsOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBKQVhCQXR0YWNobWVudFVubWFyc2hhbGxlck1vbml0b3Iuc2V0TW9uaXRvcmluZyh0cnVlKTsNCi0gICAgICAgICAgICByZXNwb25zZSA9IChTZW5kSW1hZ2VSZXNwb25zZSkgZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIFRoZSBjaWRzIGFyZSBjb2xsZWN0ZWQgaW4gdGhlIG1vbml0b3IuICBXZSB3aWxsIGNoZWNrDQotICAgICAgICAgICAgLy8gdGhpcyB0byBtYWtlIHN1cmUgdGhlIHJlc3BvbnNlIG10b20gaXMgbm90IGlubGluZWQNCi0gICAgICAgICAgICBjaWRzID0gSkFYQkF0dGFjaG1lbnRVbm1hcnNoYWxsZXJNb25pdG9yLmdldEJsb2JDSURzKCk7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICAgIEpBWEJBdHRhY2htZW50VW5tYXJzaGFsbGVyTW9uaXRvci5zZXRNb25pdG9yaW5nKGZhbHNlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgDQotICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3BvbnNlKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwocmVzcG9uc2UuZ2V0T3V0cHV0KCkuZ2V0SW1hZ2VEYXRhKCkpOw0KLSAgICAgICAgDQotICAgICAgICANCi0gICAgICAgIGludCBudW1DSURzID0gKGNpZHMgPT0gbnVsbCkgPyAwIDogY2lkcy5zaXplKCk7DQotICAgICAgICBhc3NlcnRUcnVlKCJFeHBlY3RlZCB6ZXJvIGF0dGFjaG1lbnRzIGJ1dCB0aGVyZSB3ZXJlOiIgKyBudW1DSURzLCBudW1DSURzID09IDApOw0KLSAgICAgICAgDQotICAgICAgICANCi0gICAgICAgIC8vIFJlcGVhdCB0byB2ZXJpZnkgYmVoYXZpb3INCi0gICAgICAgIHJlc3BvbnNlID0gbnVsbDsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgSkFYQkF0dGFjaG1lbnRVbm1hcnNoYWxsZXJNb25pdG9yLnNldE1vbml0b3JpbmcodHJ1ZSk7DQotICAgICAgICAgICAgcmVzcG9uc2UgPSAoU2VuZEltYWdlUmVzcG9uc2UpIGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBUaGUgY2lkcyBhcmUgY29sbGVjdGVkIGluIHRoZSBtb25pdG9yLiAgV2Ugd2lsbCBjaGVjaw0KLSAgICAgICAgICAgIC8vIHRoaXMgdG8gbWFrZSBzdXJlIHRoZSByZXNwb25zZSBtdG9tIGlzIG5vdCBpbmxpbmVkDQotICAgICAgICAgICAgY2lkcyA9IEpBWEJBdHRhY2htZW50VW5tYXJzaGFsbGVyTW9uaXRvci5nZXRCbG9iQ0lEcygpOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgICBKQVhCQXR0YWNobWVudFVubWFyc2hhbGxlck1vbml0b3Iuc2V0TW9uaXRvcmluZyhmYWxzZSk7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIA0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXNwb25zZSk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3BvbnNlLmdldE91dHB1dCgpLmdldEltYWdlRGF0YSgpKTsNCi0gICAgICAgIA0KLSAgICAgICAgDQotICAgICAgICBudW1DSURzID0gKGNpZHMgPT0gbnVsbCkgPyAwIDogY2lkcy5zaXplKCk7DQotICAgICAgICBhc3NlcnRUcnVlKCJFeHBlY3RlZCB6ZXJvIGF0dGFjaG1lbnRzIGJ1dCB0aGVyZSB3ZXJlOiIgKyBudW1DSURzLCBudW1DSURzID09IDApOw0KLSAgICB9DQotICAgIA0KLSAgICAvKg0KLSAgICAgKiBFbmFibGUgYXR0YWNobWVudCBPcHRpbWl6YXRpb24gYnV0IGNhbGwgYW4gZW5kcG9pbnQgd2l0aCBATVRPTShlbmFibGU9dHJ1ZSkNCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RTZW5kSW1hZ2VfTVRPTUVuYWJsZSgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJ0ZXN0OiAiICsgZ2V0TmFtZSgpKTsNCi0gICAgICAgIA0KLSAgICAgICAgU3RyaW5nIGltYWdlUmVzb3VyY2VEaXIgPSBJTUFHRV9ESVI7DQotICAgICAgICANCi0gICAgICAgIC8vQ3JlYXRlIGEgRGF0YVNvdXJjZSBmcm9tIGFuIGltYWdlIA0KLSAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoaW1hZ2VSZXNvdXJjZURpcitGaWxlLnNlcGFyYXRvcisidGVzdC5qcGciKTsNCi0gICAgICAgIEltYWdlSW5wdXRTdHJlYW0gZmlpcyA9IG5ldyBGaWxlSW1hZ2VJbnB1dFN0cmVhbShmaWxlKTsNCi0gICAgICAgIEltYWdlIGltYWdlID0gSW1hZ2VJTy5yZWFkKGZpaXMpOw0KLSAgICAgICAgRGF0YVNvdXJjZSBpbWFnZURTID0gbmV3IERhdGFTb3VyY2VJbXBsKCJpbWFnZS9qcGVnIiwidGVzdC5qcGciLGltYWdlKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy9DcmVhdGUgYSBEYXRhSGFuZGxlciB3aXRoIHRoZSBTdHJpbmcgRGF0YVNvdXJjZSBvYmplY3QNCi0gICAgICAgIERhdGFIYW5kbGVyIGRhdGFIYW5kbGVyID0gbmV3IERhdGFIYW5kbGVyKGltYWdlRFMpOw0KLSAgICAgICAgDQotICAgICAgICAvL1N0b3JlIHRoZSBkYXRhIGhhbmRsZXIgaW4gSW1hZ2VEZXBvdCBiZWFuDQotICAgICAgICBJbWFnZURlcG90IGltYWdlRGVwb3QgPSBuZXcgT2JqZWN0RmFjdG9yeSgpLmNyZWF0ZUltYWdlRGVwb3QoKTsNCi0gICAgICAgIGltYWdlRGVwb3Quc2V0SW1hZ2VEYXRhKGRhdGFIYW5kbGVyKTsNCi0gICAgICAgIA0KLSAgICAgICAgU2VuZEltYWdlIHJlcXVlc3QgPSBuZXcgT2JqZWN0RmFjdG9yeSgpLmNyZWF0ZVNlbmRJbWFnZSgpOw0KLSAgICAgICAgcmVxdWVzdC5zZXRJbnB1dChpbWFnZURlcG90KTsNCi0gICAgICAgIA0KLSAgICAgICAgLy9DcmVhdGUgdGhlIG5lY2Vzc2FyeSBKQVhCQ29udGV4dA0KLSAgICAgICAgSkFYQkNvbnRleHQgamJjID0gSkFYQkNvbnRleHQubmV3SW5zdGFuY2UoIm9yZy50ZXN0Lm10b20iKTsNCi0gICAgICAgIA0KLSAgICAgICAgTVRPTUZlYXR1cmUgbXRvbTIxID0gbmV3IE1UT01GZWF0dXJlKCk7DQotDQotICAgICAgICAvLyBDcmVhdGUgdGhlIEpBWC1XUyBjbGllbnQgbmVlZGVkIHRvIHNlbmQgdGhlIHJlcXVlc3QNCi0gICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IFNlcnZpY2UuY3JlYXRlKFFOQU1FX1NFUlZJQ0UpOw0KLSAgICAgICAgc2VydmljZS5hZGRQb3J0KFFOQU1FX1BPUlQsIFNPQVBCaW5kaW5nLlNPQVAxMUhUVFBfQklORElORywgVVJMX0VORFBPSU5UX01UT01FTkFCTEUpOw0KLSAgICAgICAgRGlzcGF0Y2g8T2JqZWN0PiBkaXNwYXRjaCA9IHNlcnZpY2UuY3JlYXRlRGlzcGF0Y2goUU5BTUVfUE9SVCwgamJjLCBNb2RlLlBBWUxPQUQsIG10b20yMSk7DQotICAgICAgICANCi0gICAgICAgIExpc3QgY2lkcyA9IG51bGw7DQotICAgICAgICBTZW5kSW1hZ2VSZXNwb25zZSByZXNwb25zZSA9IG51bGw7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIEpBWEJBdHRhY2htZW50VW5tYXJzaGFsbGVyTW9uaXRvci5zZXRNb25pdG9yaW5nKHRydWUpOw0KLSAgICAgICAgICAgIHJlc3BvbnNlID0gKFNlbmRJbWFnZVJlc3BvbnNlKSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gVGhlIGNpZHMgYXJlIGNvbGxlY3RlZCBpbiB0aGUgbW9uaXRvci4gIFdlIHdpbGwgY2hlY2sNCi0gICAgICAgICAgICAvLyB0aGlzIHRvIG1ha2Ugc3VyZSB0aGUgcmVzcG9uc2UgbXRvbSBpcyBub3QgaW5saW5lZA0KLSAgICAgICAgICAgIGNpZHMgPSBKQVhCQXR0YWNobWVudFVubWFyc2hhbGxlck1vbml0b3IuZ2V0QmxvYkNJRHMoKTsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgICAgSkFYQkF0dGFjaG1lbnRVbm1hcnNoYWxsZXJNb25pdG9yLnNldE1vbml0b3JpbmcoZmFsc2UpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICANCi0gICAgICAgIGFzc2VydE5vdE51bGwocmVzcG9uc2UpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXNwb25zZS5nZXRPdXRwdXQoKS5nZXRJbWFnZURhdGEoKSk7DQotICAgICAgICANCi0gICAgICAgIA0KLSAgICAgICAgaW50IG51bUNJRHMgPSAoY2lkcyA9PSBudWxsKSA/IDAgOiBjaWRzLnNpemUoKTsNCi0gICAgICAgIGFzc2VydFRydWUoIkV4cGVjdGVkIG9uZSBhdHRhY2htZW50IGJ1dCB0aGVyZSB3ZXJlOiIgKyBudW1DSURzLCBudW1DSURzID09IDEpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBSZXBlYXQgdG8gdmVyaWZ5IGJlaGF2aW9yDQotICAgICAgICByZXNwb25zZSA9IG51bGw7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIEpBWEJBdHRhY2htZW50VW5tYXJzaGFsbGVyTW9uaXRvci5zZXRNb25pdG9yaW5nKHRydWUpOw0KLSAgICAgICAgICAgIHJlc3BvbnNlID0gKFNlbmRJbWFnZVJlc3BvbnNlKSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gVGhlIGNpZHMgYXJlIGNvbGxlY3RlZCBpbiB0aGUgbW9uaXRvci4gIFdlIHdpbGwgY2hlY2sNCi0gICAgICAgICAgICAvLyB0aGlzIHRvIG1ha2Ugc3VyZSB0aGUgcmVzcG9uc2UgbXRvbSBpcyBub3QgaW5saW5lZA0KLSAgICAgICAgICAgIGNpZHMgPSBKQVhCQXR0YWNobWVudFVubWFyc2hhbGxlck1vbml0b3IuZ2V0QmxvYkNJRHMoKTsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgICAgSkFYQkF0dGFjaG1lbnRVbm1hcnNoYWxsZXJNb25pdG9yLnNldE1vbml0b3JpbmcoZmFsc2UpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICANCi0gICAgICAgIGFzc2VydE5vdE51bGwocmVzcG9uc2UpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXNwb25zZS5nZXRPdXRwdXQoKS5nZXRJbWFnZURhdGEoKSk7DQotICAgICAgICANCi0gICAgICAgIA0KLSAgICAgICAgbnVtQ0lEcyA9IChjaWRzID09IG51bGwpID8gMCA6IGNpZHMuc2l6ZSgpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgb25lIGF0dGFjaG1lbnQgYnV0IHRoZXJlIHdlcmU6IiArIG51bUNJRHMsIG51bUNJRHMgPT0gMSk7DQotICAgIH0NCi0gICAgDQotICAgIC8qDQotICAgICAqIEVuYWJsZSBhdHRhY2htZW50IE9wdGltaXphdGlvbiBidXQgY2FsbCBhbiBlbmRwb2ludCB3aXRoIEBNVE9NDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2VuZEltYWdlX01UT01EZWZhdWx0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoInRlc3Q6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgDQotICAgICAgICBTdHJpbmcgaW1hZ2VSZXNvdXJjZURpciA9IElNQUdFX0RJUjsNCi0gICAgICAgIA0KLSAgICAgICAgLy9DcmVhdGUgYSBEYXRhU291cmNlIGZyb20gYW4gaW1hZ2UgDQotICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShpbWFnZVJlc291cmNlRGlyK0ZpbGUuc2VwYXJhdG9yKyJ0ZXN0LmpwZyIpOw0KLSAgICAgICAgSW1hZ2VJbnB1dFN0cmVhbSBmaWlzID0gbmV3IEZpbGVJbWFnZUlucHV0U3RyZWFtKGZpbGUpOw0KLSAgICAgICAgSW1hZ2UgaW1hZ2UgPSBJbWFnZUlPLnJlYWQoZmlpcyk7DQotICAgICAgICBEYXRhU291cmNlIGltYWdlRFMgPSBuZXcgRGF0YVNvdXJjZUltcGwoImltYWdlL2pwZWciLCJ0ZXN0LmpwZyIsaW1hZ2UpOw0KLSAgICAgICAgDQotICAgICAgICAvL0NyZWF0ZSBhIERhdGFIYW5kbGVyIHdpdGggdGhlIFN0cmluZyBEYXRhU291cmNlIG9iamVjdA0KLSAgICAgICAgRGF0YUhhbmRsZXIgZGF0YUhhbmRsZXIgPSBuZXcgRGF0YUhhbmRsZXIoaW1hZ2VEUyk7DQotICAgICAgICANCi0gICAgICAgIC8vU3RvcmUgdGhlIGRhdGEgaGFuZGxlciBpbiBJbWFnZURlcG90IGJlYW4NCi0gICAgICAgIEltYWdlRGVwb3QgaW1hZ2VEZXBvdCA9IG5ldyBPYmplY3RGYWN0b3J5KCkuY3JlYXRlSW1hZ2VEZXBvdCgpOw0KLSAgICAgICAgaW1hZ2VEZXBvdC5zZXRJbWFnZURhdGEoZGF0YUhhbmRsZXIpOw0KLSAgICAgICAgDQotICAgICAgICBTZW5kSW1hZ2UgcmVxdWVzdCA9IG5ldyBPYmplY3RGYWN0b3J5KCkuY3JlYXRlU2VuZEltYWdlKCk7DQotICAgICAgICByZXF1ZXN0LnNldElucHV0KGltYWdlRGVwb3QpOw0KLSAgICAgICAgDQotICAgICAgICAvL0NyZWF0ZSB0aGUgbmVjZXNzYXJ5IEpBWEJDb250ZXh0DQotICAgICAgICBKQVhCQ29udGV4dCBqYmMgPSBKQVhCQ29udGV4dC5uZXdJbnN0YW5jZSgib3JnLnRlc3QubXRvbSIpOw0KLSAgICAgICAgDQotICAgICAgICBNVE9NRmVhdHVyZSBtdG9tMjEgPSBuZXcgTVRPTUZlYXR1cmUoKTsNCi0NCi0gICAgICAgIC8vIENyZWF0ZSB0aGUgSkFYLVdTIGNsaWVudCBuZWVkZWQgdG8gc2VuZCB0aGUgcmVxdWVzdA0KLSAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gU2VydmljZS5jcmVhdGUoUU5BTUVfU0VSVklDRSk7DQotICAgICAgICBzZXJ2aWNlLmFkZFBvcnQoUU5BTUVfUE9SVCwgU09BUEJpbmRpbmcuU09BUDExSFRUUF9CSU5ESU5HLCBVUkxfRU5EUE9JTlRfTVRPTURFRkFVTFQpOw0KLSAgICAgICAgRGlzcGF0Y2g8T2JqZWN0PiBkaXNwYXRjaCA9IHNlcnZpY2UuY3JlYXRlRGlzcGF0Y2goUU5BTUVfUE9SVCwgamJjLCBNb2RlLlBBWUxPQUQsIG10b20yMSk7DQotICAgICAgICANCi0gICAgICAgIExpc3QgY2lkcyA9IG51bGw7DQotICAgICAgICBTZW5kSW1hZ2VSZXNwb25zZSByZXNwb25zZSA9IG51bGw7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIEpBWEJBdHRhY2htZW50VW5tYXJzaGFsbGVyTW9uaXRvci5zZXRNb25pdG9yaW5nKHRydWUpOw0KLSAgICAgICAgICAgIHJlc3BvbnNlID0gKFNlbmRJbWFnZVJlc3BvbnNlKSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gVGhlIGNpZHMgYXJlIGNvbGxlY3RlZCBpbiB0aGUgbW9uaXRvci4gIFdlIHdpbGwgY2hlY2sNCi0gICAgICAgICAgICAvLyB0aGlzIHRvIG1ha2Ugc3VyZSB0aGUgcmVzcG9uc2UgbXRvbSBpcyBub3QgaW5saW5lZA0KLSAgICAgICAgICAgIGNpZHMgPSBKQVhCQXR0YWNobWVudFVubWFyc2hhbGxlck1vbml0b3IuZ2V0QmxvYkNJRHMoKTsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgICAgSkFYQkF0dGFjaG1lbnRVbm1hcnNoYWxsZXJNb25pdG9yLnNldE1vbml0b3JpbmcoZmFsc2UpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICANCi0gICAgICAgIGFzc2VydE5vdE51bGwocmVzcG9uc2UpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXNwb25zZS5nZXRPdXRwdXQoKS5nZXRJbWFnZURhdGEoKSk7DQotICAgICAgICANCi0gICAgICAgIA0KLSAgICAgICAgaW50IG51bUNJRHMgPSAoY2lkcyA9PSBudWxsKSA/IDAgOiBjaWRzLnNpemUoKTsNCi0gICAgICAgIGFzc2VydFRydWUoIkV4cGVjdGVkIG9uZSBhdHRhY2htZW50IGJ1dCB0aGVyZSB3ZXJlOiIgKyBudW1DSURzLCBudW1DSURzID09IDEpOw0KLSAgICAgICAgDQotICAgICAgICANCi0gICAgICAgIC8vIFJlcGVhdCB0byB2ZXJpZnkgYmVoYXZpb3INCi0gICAgICAgIHJlc3BvbnNlID0gbnVsbDsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgSkFYQkF0dGFjaG1lbnRVbm1hcnNoYWxsZXJNb25pdG9yLnNldE1vbml0b3JpbmcodHJ1ZSk7DQotICAgICAgICAgICAgcmVzcG9uc2UgPSAoU2VuZEltYWdlUmVzcG9uc2UpIGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBUaGUgY2lkcyBhcmUgY29sbGVjdGVkIGluIHRoZSBtb25pdG9yLiAgV2Ugd2lsbCBjaGVjaw0KLSAgICAgICAgICAgIC8vIHRoaXMgdG8gbWFrZSBzdXJlIHRoZSByZXNwb25zZSBtdG9tIGlzIG5vdCBpbmxpbmVkDQotICAgICAgICAgICAgY2lkcyA9IEpBWEJBdHRhY2htZW50VW5tYXJzaGFsbGVyTW9uaXRvci5nZXRCbG9iQ0lEcygpOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgICBKQVhCQXR0YWNobWVudFVubWFyc2hhbGxlck1vbml0b3Iuc2V0TW9uaXRvcmluZyhmYWxzZSk7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIA0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXNwb25zZSk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3BvbnNlLmdldE91dHB1dCgpLmdldEltYWdlRGF0YSgpKTsNCi0gICAgICAgIA0KLSAgICAgICAgDQotICAgICAgICBudW1DSURzID0gKGNpZHMgPT0gbnVsbCkgPyAwIDogY2lkcy5zaXplKCk7DQotICAgICAgICBhc3NlcnRUcnVlKCJFeHBlY3RlZCBvbmUgYXR0YWNobWVudCBidXQgdGhlcmUgd2VyZToiICsgbnVtQ0lEcywgbnVtQ0lEcyA9PSAxKTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoNCi0gICAgICogRW5hYmxlIGF0dGFjaG1lbnQgb3B0aW1pemF0aW9uIHVzaW5nIHRoZSBTT0FQMTEgYmluZGluZw0KLSAgICAgKiBwcm9wZXJ0eSBmb3IgTVRPTS4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RTZW5kSW1hZ2VBdHRhY2htZW50UHJvcGVydHkxMSgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJ0ZXN0OiAiICsgZ2V0TmFtZSgpKTsNCi0gICAgICAgIA0KLSAgICAgICAgU3RyaW5nIGltYWdlUmVzb3VyY2VEaXIgPSBJTUFHRV9ESVI7DQotICAgICAgICANCi0gICAgICAgIC8vQ3JlYXRlIGEgRGF0YVNvdXJjZSBmcm9tIGFuIGltYWdlIA0KLSAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoaW1hZ2VSZXNvdXJjZURpcitGaWxlLnNlcGFyYXRvcisidGVzdC5qcGciKTsNCi0gICAgICAgIEltYWdlSW5wdXRTdHJlYW0gZmlpcyA9IG5ldyBGaWxlSW1hZ2VJbnB1dFN0cmVhbShmaWxlKTsNCi0gICAgICAgIEltYWdlIGltYWdlID0gSW1hZ2VJTy5yZWFkKGZpaXMpOw0KLSAgICAgICAgRGF0YVNvdXJjZSBpbWFnZURTID0gbmV3IERhdGFTb3VyY2VJbXBsKCJpbWFnZS9qcGVnIiwidGVzdC5qcGciLGltYWdlKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy9DcmVhdGUgYSBEYXRhSGFuZGxlciB3aXRoIHRoZSBTdHJpbmcgRGF0YVNvdXJjZSBvYmplY3QNCi0gICAgICAgIERhdGFIYW5kbGVyIGRhdGFIYW5kbGVyID0gbmV3IERhdGFIYW5kbGVyKGltYWdlRFMpOw0KLSAgICAgICAgDQotICAgICAgICAvL1N0b3JlIHRoZSBkYXRhIGhhbmRsZXIgaW4gSW1hZ2VEZXBvdCBiZWFuDQotICAgICAgICBJbWFnZURlcG90IGltYWdlRGVwb3QgPSBuZXcgT2JqZWN0RmFjdG9yeSgpLmNyZWF0ZUltYWdlRGVwb3QoKTsNCi0gICAgICAgIGltYWdlRGVwb3Quc2V0SW1hZ2VEYXRhKGRhdGFIYW5kbGVyKTsNCi0gICAgICAgIA0KLSAgICAgICAgU2VuZEltYWdlIHJlcXVlc3QgPSBuZXcgT2JqZWN0RmFjdG9yeSgpLmNyZWF0ZVNlbmRJbWFnZSgpOw0KLSAgICAgICAgcmVxdWVzdC5zZXRJbnB1dChpbWFnZURlcG90KTsNCi0gICAgICAgIA0KLSAgICAgICAgLy9DcmVhdGUgdGhlIG5lY2Vzc2FyeSBKQVhCQ29udGV4dA0KLSAgICAgICAgSkFYQkNvbnRleHQgamJjID0gSkFYQkNvbnRleHQubmV3SW5zdGFuY2UoIm9yZy50ZXN0Lm10b20iKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQ3JlYXRlIHRoZSBKQVgtV1MgY2xpZW50IG5lZWRlZCB0byBzZW5kIHRoZSByZXF1ZXN0IHdpdGggc29hcCAxMSBiaW5kaW5nDQotICAgICAgICAvLyBwcm9wZXJ0eSBmb3IgTVRPTQ0KLSAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gU2VydmljZS5jcmVhdGUoUU5BTUVfU0VSVklDRSk7DQotICAgICAgICBzZXJ2aWNlLmFkZFBvcnQoUU5BTUVfUE9SVCwgU09BUEJpbmRpbmcuU09BUDExSFRUUF9NVE9NX0JJTkRJTkcsIFVSTF9FTkRQT0lOVCk7DQotICAgICAgICBEaXNwYXRjaDxPYmplY3Q+IGRpc3BhdGNoID0gc2VydmljZS5jcmVhdGVEaXNwYXRjaChRTkFNRV9QT1JULCBqYmMsIE1vZGUuUEFZTE9BRCk7DQotICAgICAgICANCi0gICAgICAgIFNlbmRJbWFnZVJlc3BvbnNlIHJlc3BvbnNlID0gKFNlbmRJbWFnZVJlc3BvbnNlKSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7DQotICAgICAgICANCi0gICAgICAgIGFzc2VydE5vdE51bGwocmVzcG9uc2UpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXNwb25zZS5nZXRPdXRwdXQoKS5nZXRJbWFnZURhdGEoKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIFJlcGVhdCB0byB2ZXJpZnkgYmVoYXZpb3INCi0gICAgICAgIHJlc3BvbnNlID0gKFNlbmRJbWFnZVJlc3BvbnNlKSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7DQotICAgICAgICANCi0gICAgICAgIGFzc2VydE5vdE51bGwocmVzcG9uc2UpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXNwb25zZS5nZXRPdXRwdXQoKS5nZXRJbWFnZURhdGEoKSk7DQotICAgIH0NCi0gICAgDQotICAgIC8qDQotICAgICAqIEVuYWJsZSBhdHRhY2htZW50IG9wdGltaXphdGlvbiB1c2luZyBib3RoIHRoZSBTT0FQMTEgYmluZGluZw0KLSAgICAgKiBwcm9wZXJ0eSBmb3IgTVRPTSBhbmQgdGhlIEJpbmRpbmcgQVBJDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2VuZEltYWdlQXR0YWNobWVudEFQSVByb3BlcnR5MTEoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygidGVzdDogIiArIGdldE5hbWUoKSk7DQotICAgICAgICANCi0gICAgICAgIFN0cmluZyBpbWFnZVJlc291cmNlRGlyID0gSU1BR0VfRElSOw0KLSAgICAgICAgDQotICAgICAgICAvL0NyZWF0ZSBhIERhdGFTb3VyY2UgZnJvbSBhbiBpbWFnZSANCi0gICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGltYWdlUmVzb3VyY2VEaXIrRmlsZS5zZXBhcmF0b3IrInRlc3QuanBnIik7DQotICAgICAgICBJbWFnZUlucHV0U3RyZWFtIGZpaXMgPSBuZXcgRmlsZUltYWdlSW5wdXRTdHJlYW0oZmlsZSk7DQotICAgICAgICBJbWFnZSBpbWFnZSA9IEltYWdlSU8ucmVhZChmaWlzKTsNCi0gICAgICAgIERhdGFTb3VyY2UgaW1hZ2VEUyA9IG5ldyBEYXRhU291cmNlSW1wbCgiaW1hZ2UvanBlZyIsInRlc3QuanBnIixpbWFnZSk7DQotICAgICAgICANCi0gICAgICAgIC8vQ3JlYXRlIGEgRGF0YUhhbmRsZXIgd2l0aCB0aGUgU3RyaW5nIERhdGFTb3VyY2Ugb2JqZWN0DQotICAgICAgICBEYXRhSGFuZGxlciBkYXRhSGFuZGxlciA9IG5ldyBEYXRhSGFuZGxlcihpbWFnZURTKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy9TdG9yZSB0aGUgZGF0YSBoYW5kbGVyIGluIEltYWdlRGVwb3QgYmVhbg0KLSAgICAgICAgSW1hZ2VEZXBvdCBpbWFnZURlcG90ID0gbmV3IE9iamVjdEZhY3RvcnkoKS5jcmVhdGVJbWFnZURlcG90KCk7DQotICAgICAgICBpbWFnZURlcG90LnNldEltYWdlRGF0YShkYXRhSGFuZGxlcik7DQotICAgICAgICANCi0gICAgICAgIFNlbmRJbWFnZSByZXF1ZXN0ID0gbmV3IE9iamVjdEZhY3RvcnkoKS5jcmVhdGVTZW5kSW1hZ2UoKTsNCi0gICAgICAgIHJlcXVlc3Quc2V0SW5wdXQoaW1hZ2VEZXBvdCk7DQotICAgICAgICANCi0gICAgICAgIC8vQ3JlYXRlIHRoZSBuZWNlc3NhcnkgSkFYQkNvbnRleHQNCi0gICAgICAgIEpBWEJDb250ZXh0IGpiYyA9IEpBWEJDb250ZXh0Lm5ld0luc3RhbmNlKCJvcmcudGVzdC5tdG9tIik7DQotICAgICAgICANCi0gICAgICAgIC8vIENyZWF0ZSB0aGUgSkFYLVdTIGNsaWVudCBuZWVkZWQgdG8gc2VuZCB0aGUgcmVxdWVzdCB3aXRoIHNvYXAgMTEgYmluZGluZw0KLSAgICAgICAgLy8gcHJvcGVydHkgZm9yIE1UT00NCi0gICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IFNlcnZpY2UuY3JlYXRlKFFOQU1FX1NFUlZJQ0UpOw0KLSAgICAgICAgc2VydmljZS5hZGRQb3J0KFFOQU1FX1BPUlQsIFNPQVBCaW5kaW5nLlNPQVAxMUhUVFBfTVRPTV9CSU5ESU5HLCBVUkxfRU5EUE9JTlQpOw0KLSAgICAgICAgRGlzcGF0Y2g8T2JqZWN0PiBkaXNwYXRjaCA9IHNlcnZpY2UuY3JlYXRlRGlzcGF0Y2goUU5BTUVfUE9SVCwgamJjLCBNb2RlLlBBWUxPQUQpOw0KLSAgICAgICAgDQotICAgICAgICANCi0gICAgICAgIC8vRW5hYmxlIGF0dGFjaG1lbnQgb3B0aW1pemF0aW9uDQotICAgICAgICBTT0FQQmluZGluZyBiaW5kaW5nID0gKFNPQVBCaW5kaW5nKSBkaXNwYXRjaC5nZXRCaW5kaW5nKCk7DQotICAgICAgICBiaW5kaW5nLnNldE1UT01FbmFibGVkKHRydWUpOw0KLSAgICAgICAgDQotICAgICAgICBTZW5kSW1hZ2VSZXNwb25zZSByZXNwb25zZSA9IChTZW5kSW1hZ2VSZXNwb25zZSkgZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLSAgICAgICAgDQotICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3BvbnNlKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwocmVzcG9uc2UuZ2V0T3V0cHV0KCkuZ2V0SW1hZ2VEYXRhKCkpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBSZXBlYXQgdG8gdmVyaWZ5IGJlaGF2aW9yDQotICAgICAgICByZXNwb25zZSA9IChTZW5kSW1hZ2VSZXNwb25zZSkgZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLSAgICAgICAgDQotICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3BvbnNlKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwocmVzcG9uc2UuZ2V0T3V0cHV0KCkuZ2V0SW1hZ2VEYXRhKCkpOw0KLSAgICB9DQotICAgIA0KLSAgICAvKg0KLSAgICAgKiBFbmFibGUgYXR0YWNobWVudCBvcHRpbWl6YXRpb24gdXNpbmcgYm90aCB0aGUgU09BUDEyIGJpbmRpbmcNCi0gICAgICogcHJvcGVydHkgZm9yIE1UT00NCi0gICAgICogDQotICAgICAqIFNlbmRpbmcgU09BUDEyIG1lc3NhZ2UgdG8gU09BUDExIGVuZHBvaW50IHdpbGwgY29ycmVjdGx5IHJlc3VsdCBpbiBleGNlcHRpb24NCi0gICAgICogDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2VuZEltYWdlQXR0YWNobWVudFByb3BlcnR5MTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygidGVzdDogIiArIGdldE5hbWUoKSk7DQotICAgICAgICANCi0gICAgICAgIFN0cmluZyBpbWFnZVJlc291cmNlRGlyID0gSU1BR0VfRElSOw0KLSAgICAgICAgDQotICAgICAgICAvL0NyZWF0ZSBhIERhdGFTb3VyY2UgZnJvbSBhbiBpbWFnZSANCi0gICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGltYWdlUmVzb3VyY2VEaXIrRmlsZS5zZXBhcmF0b3IrInRlc3QuanBnIik7DQotICAgICAgICBJbWFnZUlucHV0U3RyZWFtIGZpaXMgPSBuZXcgRmlsZUltYWdlSW5wdXRTdHJlYW0oZmlsZSk7DQotICAgICAgICBJbWFnZSBpbWFnZSA9IEltYWdlSU8ucmVhZChmaWlzKTsNCi0gICAgICAgIERhdGFTb3VyY2UgaW1hZ2VEUyA9IG5ldyBEYXRhU291cmNlSW1wbCgiaW1hZ2UvanBlZyIsInRlc3QuanBnIixpbWFnZSk7DQotICAgICAgICANCi0gICAgICAgIC8vQ3JlYXRlIGEgRGF0YUhhbmRsZXIgd2l0aCB0aGUgU3RyaW5nIERhdGFTb3VyY2Ugb2JqZWN0DQotICAgICAgICBEYXRhSGFuZGxlciBkYXRhSGFuZGxlciA9IG5ldyBEYXRhSGFuZGxlcihpbWFnZURTKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy9TdG9yZSB0aGUgZGF0YSBoYW5kbGVyIGluIEltYWdlRGVwb3QgYmVhbg0KLSAgICAgICAgSW1hZ2VEZXBvdCBpbWFnZURlcG90ID0gbmV3IE9iamVjdEZhY3RvcnkoKS5jcmVhdGVJbWFnZURlcG90KCk7DQotICAgICAgICBpbWFnZURlcG90LnNldEltYWdlRGF0YShkYXRhSGFuZGxlcik7DQotICAgICAgICANCi0gICAgICAgIFNlbmRJbWFnZSByZXF1ZXN0ID0gbmV3IE9iamVjdEZhY3RvcnkoKS5jcmVhdGVTZW5kSW1hZ2UoKTsNCi0gICAgICAgIHJlcXVlc3Quc2V0SW5wdXQoaW1hZ2VEZXBvdCk7DQotICAgICAgICANCi0gICAgICAgIC8vQ3JlYXRlIHRoZSBuZWNlc3NhcnkgSkFYQkNvbnRleHQNCi0gICAgICAgIEpBWEJDb250ZXh0IGpiYyA9IEpBWEJDb250ZXh0Lm5ld0luc3RhbmNlKCJvcmcudGVzdC5tdG9tIik7DQotICAgICAgICANCi0gICAgICAgIC8vIENyZWF0ZSB0aGUgSkFYLVdTIGNsaWVudCBuZWVkZWQgdG8gc2VuZCB0aGUgcmVxdWVzdCB3aXRoIHNvYXAgMTEgYmluZGluZw0KLSAgICAgICAgLy8gcHJvcGVydHkgZm9yIE1UT00NCi0gICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IFNlcnZpY2UuY3JlYXRlKFFOQU1FX1NFUlZJQ0UpOw0KLSAgICAgICAgc2VydmljZS5hZGRQb3J0KFFOQU1FX1BPUlQsIFNPQVBCaW5kaW5nLlNPQVAxMkhUVFBfTVRPTV9CSU5ESU5HLCBVUkxfRU5EUE9JTlQpOw0KLSAgICAgICAgRGlzcGF0Y2g8T2JqZWN0PiBkaXNwYXRjaCA9IHNlcnZpY2UuY3JlYXRlRGlzcGF0Y2goUU5BTUVfUE9SVCwgamJjLCBNb2RlLlBBWUxPQUQpOw0KLSAgICAgICAgDQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIFNlbmRJbWFnZVJlc3BvbnNlIHJlc3BvbnNlID0gKFNlbmRJbWFnZVJlc3BvbnNlKSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7DQotICAgICAgICAgICAgZmFpbCgiV2FzIGV4cGVjdGluZyBhbiBleGNlcHRpb24gZHVlIHRvIHNlbmRpbmcgU09BUDEyIG1lc3NhZ2UgdG8gU09BUDExIGVuZHBvaW50LiIpOw0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGUpOw0KLSAgICAgICAgICAgIGlmIChDSEVDS19WRVJTSU9OTUlTTUFUQ0gpIHsNCi0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgU09BUEZhdWx0RXhjZXB0aW9uLCBidXQgcmVjZWl2ZWQ6ICIrIGUuZ2V0Q2xhc3MoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBlIGluc3RhbmNlb2YgU09BUEZhdWx0RXhjZXB0aW9uKTsNCi0gICAgICAgICAgICAgICAgU09BUEZhdWx0RXhjZXB0aW9uIHNmZSA9IChTT0FQRmF1bHRFeGNlcHRpb24pIGU7DQotDQotICAgICAgICAgICAgICAgIFNPQVBGYXVsdCBmYXVsdCA9IHNmZS5nZXRGYXVsdCgpOw0KLQ0KLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJTT0FQRmF1bHQgaXMgbnVsbCAiLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhdWx0ICE9IG51bGwpOw0KLSAgICAgICAgICAgICAgICBRTmFtZSBmYXVsdENvZGUgPSBzZmUuZ2V0RmF1bHQoKS5nZXRGYXVsdENvZGVBc1FOYW1lKCk7DQotDQotDQotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIkV4cGVjdGVkIFZFUlNJT04gTUlTTUFUQ0ggYnV0IHJlY2VpdmVkOiAiKyBmYXVsdENvZGUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFFOYW1lKFNPQVBDb25zdGFudHMuVVJJX05TX1NPQVBfMV8xX0VOVkVMT1BFLCAiVmVyc2lvbk1pc21hdGNoIiwgU09BUENvbnN0YW50cy5TT0FQX0VOVl9QUkVGSVgpLmVxdWFscyhmYXVsdENvZGUpKTsNCi0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIC8vIFJlcGVhdCB0byB2ZXJpZnkgYmVoYXZpb3INCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgU2VuZEltYWdlUmVzcG9uc2UgcmVzcG9uc2UgPSAoU2VuZEltYWdlUmVzcG9uc2UpIGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0gICAgICAgICAgICBmYWlsKCJXYXMgZXhwZWN0aW5nIGFuIGV4Y2VwdGlvbiBkdWUgdG8gc2VuZGluZyBTT0FQMTIgbWVzc2FnZSB0byBTT0FQMTEgZW5kcG9pbnQuIik7DQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoZSk7DQotICAgICAgICAgICAgaWYgKENIRUNLX1ZFUlNJT05NSVNNQVRDSCkgew0KLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJFeHBlY3RlZCBTT0FQRmF1bHRFeGNlcHRpb24sIGJ1dCByZWNlaXZlZDogIisgZS5nZXRDbGFzcygpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgaW5zdGFuY2VvZiBTT0FQRmF1bHRFeGNlcHRpb24pOw0KLSAgICAgICAgICAgICAgICBTT0FQRmF1bHRFeGNlcHRpb24gc2ZlID0gKFNPQVBGYXVsdEV4Y2VwdGlvbikgZTsNCi0NCi0gICAgICAgICAgICAgICAgU09BUEZhdWx0IGZhdWx0ID0gc2ZlLmdldEZhdWx0KCk7DQotDQotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIlNPQVBGYXVsdCBpcyBudWxsICIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgZmF1bHQgIT0gbnVsbCk7DQotICAgICAgICAgICAgICAgIFFOYW1lIGZhdWx0Q29kZSA9IHNmZS5nZXRGYXVsdCgpLmdldEZhdWx0Q29kZUFzUU5hbWUoKTsNCi0NCi0NCi0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgVkVSU0lPTiBNSVNNQVRDSCBidXQgcmVjZWl2ZWQ6ICIrIGZhdWx0Q29kZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUU5hbWUoU09BUENvbnN0YW50cy5VUklfTlNfU09BUF8xXzFfRU5WRUxPUEUsICJWZXJzaW9uTWlzbWF0Y2giLCBTT0FQQ29uc3RhbnRzLlNPQVBfRU5WX1BSRUZJWCkuZXF1YWxzKGZhdWx0Q29kZSkpOw0KLQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgDQotDQotCX0NCi0gICAgDQotICAgIC8qDQotICAgICAqIEVuYWJsZSBhdHRhY2htZW50IG9wdGltaXphdGlvbiB1c2luZyBib3RoIHRoZSBTT0FQMTIgYmluZGluZyBBUEkNCi0gICAgICogZm9yIE1UT00NCi0gICAgICogDQotICAgICAqIFNlbmRpbmcgU09BUDEyIG1lc3NhZ2UgdG8gU09BUDExIGVuZHBvaW50IHdpbGwgY29ycmVjdGx5IHJlc3VsdCBpbiBleGNlcHRpb24NCi0gICAgICogDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2VuZEltYWdlQXR0YWNobWVudEFQSTEyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoInRlc3Q6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgDQotICAgICAgICBTdHJpbmcgaW1hZ2VSZXNvdXJjZURpciA9IElNQUdFX0RJUjsNCi0gICAgICAgIA0KLSAgICAgICAgLy9DcmVhdGUgYSBEYXRhU291cmNlIGZyb20gYW4gaW1hZ2UgDQotICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShpbWFnZVJlc291cmNlRGlyK0ZpbGUuc2VwYXJhdG9yKyJ0ZXN0LmpwZyIpOw0KLSAgICAgICAgSW1hZ2VJbnB1dFN0cmVhbSBmaWlzID0gbmV3IEZpbGVJbWFnZUlucHV0U3RyZWFtKGZpbGUpOw0KLSAgICAgICAgSW1hZ2UgaW1hZ2UgPSBJbWFnZUlPLnJlYWQoZmlpcyk7DQotICAgICAgICBEYXRhU291cmNlIGltYWdlRFMgPSBuZXcgRGF0YVNvdXJjZUltcGwoImltYWdlL2pwZWciLCJ0ZXN0LmpwZyIsaW1hZ2UpOw0KLSAgICAgICAgDQotICAgICAgICAvL0NyZWF0ZSBhIERhdGFIYW5kbGVyIHdpdGggdGhlIFN0cmluZyBEYXRhU291cmNlIG9iamVjdA0KLSAgICAgICAgRGF0YUhhbmRsZXIgZGF0YUhhbmRsZXIgPSBuZXcgRGF0YUhhbmRsZXIoaW1hZ2VEUyk7DQotICAgICAgICANCi0gICAgICAgIC8vU3RvcmUgdGhlIGRhdGEgaGFuZGxlciBpbiBJbWFnZURlcG90IGJlYW4NCi0gICAgICAgIEltYWdlRGVwb3QgaW1hZ2VEZXBvdCA9IG5ldyBPYmplY3RGYWN0b3J5KCkuY3JlYXRlSW1hZ2VEZXBvdCgpOw0KLSAgICAgICAgaW1hZ2VEZXBvdC5zZXRJbWFnZURhdGEoZGF0YUhhbmRsZXIpOw0KLSAgICAgICAgDQotICAgICAgICBTZW5kSW1hZ2UgcmVxdWVzdCA9IG5ldyBPYmplY3RGYWN0b3J5KCkuY3JlYXRlU2VuZEltYWdlKCk7DQotICAgICAgICByZXF1ZXN0LnNldElucHV0KGltYWdlRGVwb3QpOw0KLSAgICAgICAgDQotICAgICAgICAvL0NyZWF0ZSB0aGUgbmVjZXNzYXJ5IEpBWEJDb250ZXh0DQotICAgICAgICBKQVhCQ29udGV4dCBqYmMgPSBKQVhCQ29udGV4dC5uZXdJbnN0YW5jZSgib3JnLnRlc3QubXRvbSIpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBDcmVhdGUgdGhlIEpBWC1XUyBjbGllbnQgbmVlZGVkIHRvIHNlbmQgdGhlIHJlcXVlc3Qgd2l0aCBzb2FwIDExIGJpbmRpbmcNCi0gICAgICAgIC8vIHByb3BlcnR5IGZvciBNVE9NDQotICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSBTZXJ2aWNlLmNyZWF0ZShRTkFNRV9TRVJWSUNFKTsNCi0gICAgICAgIHNlcnZpY2UuYWRkUG9ydChRTkFNRV9QT1JULCBTT0FQQmluZGluZy5TT0FQMTJIVFRQX0JJTkRJTkcsIFVSTF9FTkRQT0lOVCk7DQotICAgICAgICBEaXNwYXRjaDxPYmplY3Q+IGRpc3BhdGNoID0gc2VydmljZS5jcmVhdGVEaXNwYXRjaChRTkFNRV9QT1JULCBqYmMsIE1vZGUuUEFZTE9BRCk7DQotICAgICAgICANCi0gICAgICAgIA0KLSAgICAgICAgLy9FbmFibGUgYXR0YWNobWVudCBvcHRpbWl6YXRpb24NCi0gICAgICAgIFNPQVBCaW5kaW5nIGJpbmRpbmcgPSAoU09BUEJpbmRpbmcpIGRpc3BhdGNoLmdldEJpbmRpbmcoKTsNCi0gICAgICAgIGJpbmRpbmcuc2V0TVRPTUVuYWJsZWQodHJ1ZSk7DQotICAgICAgICANCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgU2VuZEltYWdlUmVzcG9uc2UgcmVzcG9uc2UgPSAoU2VuZEltYWdlUmVzcG9uc2UpIGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0gICAgICAgICAgICBmYWlsKCJXYXMgZXhwZWN0aW5nIGFuIGV4Y2VwdGlvbiBkdWUgdG8gc2VuZGluZyBTT0FQMTIgbWVzc2FnZSB0byBTT0FQMTEgZW5kcG9pbnQuIik7DQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoZSk7DQotICAgICAgICAgICAgaWYgKENIRUNLX1ZFUlNJT05NSVNNQVRDSCkgew0KLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJFeHBlY3RlZCBTT0FQRmF1bHRFeGNlcHRpb24sIGJ1dCByZWNlaXZlZDogIisgZS5nZXRDbGFzcygpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgaW5zdGFuY2VvZiBTT0FQRmF1bHRFeGNlcHRpb24pOw0KLSAgICAgICAgICAgICAgICBTT0FQRmF1bHRFeGNlcHRpb24gc2ZlID0gKFNPQVBGYXVsdEV4Y2VwdGlvbikgZTsNCi0NCi0gICAgICAgICAgICAgICAgU09BUEZhdWx0IGZhdWx0ID0gc2ZlLmdldEZhdWx0KCk7DQotDQotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIlNPQVBGYXVsdCBpcyBudWxsICIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgZmF1bHQgIT0gbnVsbCk7DQotICAgICAgICAgICAgICAgIFFOYW1lIGZhdWx0Q29kZSA9IHNmZS5nZXRGYXVsdCgpLmdldEZhdWx0Q29kZUFzUU5hbWUoKTsNCi0NCi0NCi0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgVkVSU0lPTiBNSVNNQVRDSCBidXQgcmVjZWl2ZWQ6ICIrIGZhdWx0Q29kZSwNCi0gICAgICAgICAgICAgIAkJICBuZXcgUU5hbWUoU09BUENvbnN0YW50cy5VUklfTlNfU09BUF8xXzFfRU5WRUxPUEUsICJWZXJzaW9uTWlzbWF0Y2giLCBTT0FQQ29uc3RhbnRzLlNPQVBfRU5WX1BSRUZJWCkuZXF1YWxzKGZhdWx0Q29kZSkpOw0KLQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgLy8gUmVwZWF0IHRvIHZlcmlmeSBiZWhhdmlvcg0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBTZW5kSW1hZ2VSZXNwb25zZSByZXNwb25zZSA9IChTZW5kSW1hZ2VSZXNwb25zZSkgZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLSAgICAgICAgICAgIGZhaWwoIldhcyBleHBlY3RpbmcgYW4gZXhjZXB0aW9uIGR1ZSB0byBzZW5kaW5nIFNPQVAxMiBtZXNzYWdlIHRvIFNPQVAxMSBlbmRwb2ludC4iKTsNCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChlKTsNCi0gICAgICAgICAgICBpZiAoQ0hFQ0tfVkVSU0lPTk1JU01BVENIKSB7DQotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIkV4cGVjdGVkIFNPQVBGYXVsdEV4Y2VwdGlvbiwgYnV0IHJlY2VpdmVkOiAiKyBlLmdldENsYXNzKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgZSBpbnN0YW5jZW9mIFNPQVBGYXVsdEV4Y2VwdGlvbik7DQotICAgICAgICAgICAgICAgIFNPQVBGYXVsdEV4Y2VwdGlvbiBzZmUgPSAoU09BUEZhdWx0RXhjZXB0aW9uKSBlOw0KLQ0KLSAgICAgICAgICAgICAgICBTT0FQRmF1bHQgZmF1bHQgPSBzZmUuZ2V0RmF1bHQoKTsNCi0NCi0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiU09BUEZhdWx0IGlzIG51bGwgIiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBmYXVsdCAhPSBudWxsKTsNCi0gICAgICAgICAgICAgICAgUU5hbWUgZmF1bHRDb2RlID0gc2ZlLmdldEZhdWx0KCkuZ2V0RmF1bHRDb2RlQXNRTmFtZSgpOw0KLQ0KLQ0KLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJFeHBlY3RlZCBWRVJTSU9OIE1JU01BVENIIGJ1dCByZWNlaXZlZDogIisgZmF1bHRDb2RlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFFOYW1lKFNPQVBDb25zdGFudHMuVVJJX05TX1NPQVBfMV8xX0VOVkVMT1BFLCAiVmVyc2lvbk1pc21hdGNoIiwgU09BUENvbnN0YW50cy5TT0FQX0VOVl9QUkVGSVgpLmVxdWFscyhmYXVsdENvZGUpKTsNCi0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgIA0KLSAgICB9DQotICAgIC8qDQotICAgICAqIEVuYWJsZSBhdHRhY2htZW50IE9wdGltaXphdGlvbiBidXQgY2FsbCBhbiBlbmRwb2ludCB3aXRoIEBNVE9NKGVuYWJsZT10cnVlLCBUaHJlc2hvbGQgPSA5OTAwMCkNCi0gICAgICovDQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2VuZEltYWdlX3NldE1UT01UaHJlc2hvbGQoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygidGVzdDogIiArIGdldE5hbWUoKSk7DQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInRlc3RTZW5kSW1hZ2Vfc2V0TVRPTVRocmVzaG9sZCgpIik7DQotICAgICAgICBTdHJpbmcgaW1hZ2VSZXNvdXJjZURpciA9IElNQUdFX0RJUjsNCi0gICAgICAgIA0KLSAgICAgICAgLy9DcmVhdGUgYSBEYXRhU291cmNlIGZyb20gYW4gaW1hZ2UgDQotICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShpbWFnZVJlc291cmNlRGlyK0ZpbGUuc2VwYXJhdG9yKyJ0ZXN0LmpwZyIpOw0KLSAgICAgICAgSW1hZ2VJbnB1dFN0cmVhbSBmaWlzID0gbmV3IEZpbGVJbWFnZUlucHV0U3RyZWFtKGZpbGUpOw0KLSAgICAgICAgSW1hZ2UgaW1hZ2UgPSBJbWFnZUlPLnJlYWQoZmlpcyk7DQotICAgICAgICBEYXRhU291cmNlIGltYWdlRFMgPSBuZXcgRGF0YVNvdXJjZUltcGwoImltYWdlL2pwZWciLCJ0ZXN0LmpwZyIsaW1hZ2UpOw0KLSAgICAgICAgDQotICAgICAgICAvL0NyZWF0ZSBhIERhdGFIYW5kbGVyIHdpdGggdGhlIFN0cmluZyBEYXRhU291cmNlIG9iamVjdA0KLSAgICAgICAgRGF0YUhhbmRsZXIgZGF0YUhhbmRsZXIgPSBuZXcgRGF0YUhhbmRsZXIoaW1hZ2VEUyk7DQotICAgICAgICANCi0gICAgICAgIC8vU3RvcmUgdGhlIGRhdGEgaGFuZGxlciBpbiBJbWFnZURlcG90IGJlYW4NCi0gICAgICAgIEltYWdlRGVwb3QgaW1hZ2VEZXBvdCA9IG5ldyBPYmplY3RGYWN0b3J5KCkuY3JlYXRlSW1hZ2VEZXBvdCgpOw0KLSAgICAgICAgaW1hZ2VEZXBvdC5zZXRJbWFnZURhdGEoZGF0YUhhbmRsZXIpOw0KLSAgICAgICAgDQotICAgICAgICBTZW5kSW1hZ2UgcmVxdWVzdCA9IG5ldyBPYmplY3RGYWN0b3J5KCkuY3JlYXRlU2VuZEltYWdlKCk7DQotICAgICAgICByZXF1ZXN0LnNldElucHV0KGltYWdlRGVwb3QpOw0KLSAgICAgICAgDQotICAgICAgICAvL0NyZWF0ZSB0aGUgbmVjZXNzYXJ5IEpBWEJDb250ZXh0DQotICAgICAgICBKQVhCQ29udGV4dCBqYmMgPSBKQVhCQ29udGV4dC5uZXdJbnN0YW5jZSgib3JnLnRlc3QubXRvbSIpOw0KLSAgICAgICAgLy9TZXR0aW5nIFRocmVzaG9sZCB0byBzZW5kIHJlcXVlc3QgSW5saW5lDQotICAgICAgICBpbnQgdGhyZXNob2xkID0gMTAwMDAwOw0KLSAgICAgICAgTVRPTUZlYXR1cmUgbXRvbTIxID0gbmV3IE1UT01GZWF0dXJlKHRydWUsIHRocmVzaG9sZCk7DQotICAgICAgICAvLyBDcmVhdGUgdGhlIEpBWC1XUyBjbGllbnQgbmVlZGVkIHRvIHNlbmQgdGhlIHJlcXVlc3QNCi0gICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IFNlcnZpY2UuY3JlYXRlKFFOQU1FX1NFUlZJQ0UpOw0KLSAgICAgICAgc2VydmljZS5hZGRQb3J0KFFOQU1FX1BPUlQsIFNPQVBCaW5kaW5nLlNPQVAxMUhUVFBfQklORElORywgVVJMX0VORFBPSU5UX01UT01USFJFU0hPTEQpOw0KLSAgICAgICAgRGlzcGF0Y2g8T2JqZWN0PiBkaXNwYXRjaCA9IHNlcnZpY2UuY3JlYXRlRGlzcGF0Y2goUU5BTUVfUE9SVCwgamJjLCBNb2RlLlBBWUxPQUQsIG10b20yMSk7DQotICAgICAgICANCi0gICAgICAgIExpc3QgY2lkcyA9IG51bGw7DQotICAgICAgICBTZW5kSW1hZ2VSZXNwb25zZSByZXNwb25zZSA9IG51bGw7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIEpBWEJBdHRhY2htZW50VW5tYXJzaGFsbGVyTW9uaXRvci5zZXRNb25pdG9yaW5nKHRydWUpOw0KLSAgICAgICAgICAgIHJlc3BvbnNlID0gKFNlbmRJbWFnZVJlc3BvbnNlKSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gVGhlIGNpZHMgYXJlIGNvbGxlY3RlZCBpbiB0aGUgbW9uaXRvci4gIFdlIHdpbGwgY2hlY2sNCi0gICAgICAgICAgICAvLyB0aGlzIHRvIG1ha2Ugc3VyZSB0aGUgcmVzcG9uc2UgbXRvbSBpcyBub3QgaW5saW5lZA0KLSAgICAgICAgICAgIGNpZHMgPSBKQVhCQXR0YWNobWVudFVubWFyc2hhbGxlck1vbml0b3IuZ2V0QmxvYkNJRHMoKTsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgICAgSkFYQkF0dGFjaG1lbnRVbm1hcnNoYWxsZXJNb25pdG9yLnNldE1vbml0b3JpbmcoZmFsc2UpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICANCi0gICAgICAgIGFzc2VydE5vdE51bGwocmVzcG9uc2UpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXNwb25zZS5nZXRPdXRwdXQoKS5nZXRJbWFnZURhdGEoKSk7DQotICAgICAgICANCi0gICAgICAgIC8vVGhlcmUgc2hvbGQgYmUgbm8gY2lkIGFzIGF0dGFjaG1lbnQgc2hvdWxkIGJlIGlubGluZWQuDQotICAgICAgICBpbnQgbnVtQ0lEcyA9IChjaWRzID09IG51bGwpID8gMCA6IGNpZHMuc2l6ZSgpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgb25lIGF0dGFjaG1lbnQgaW5saW5lZDoiICsgbnVtQ0lEcywgbnVtQ0lEcyA9PSAwKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gUmVwZWF0IHRvIHZlcmlmeSBiZWhhdmlvcg0KLSAgICAgICAgcmVzcG9uc2UgPSBudWxsOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBKQVhCQXR0YWNobWVudFVubWFyc2hhbGxlck1vbml0b3Iuc2V0TW9uaXRvcmluZyh0cnVlKTsNCi0gICAgICAgICAgICByZXNwb25zZSA9IChTZW5kSW1hZ2VSZXNwb25zZSkgZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIFRoZSBjaWRzIGFyZSBjb2xsZWN0ZWQgaW4gdGhlIG1vbml0b3IuICBXZSB3aWxsIGNoZWNrDQotICAgICAgICAgICAgLy8gdGhpcyB0byBtYWtlIHN1cmUgdGhlIHJlc3BvbnNlIG10b20gaXMgbm90IGlubGluZWQNCi0gICAgICAgICAgICBjaWRzID0gSkFYQkF0dGFjaG1lbnRVbm1hcnNoYWxsZXJNb25pdG9yLmdldEJsb2JDSURzKCk7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICAgIEpBWEJBdHRhY2htZW50VW5tYXJzaGFsbGVyTW9uaXRvci5zZXRNb25pdG9yaW5nKGZhbHNlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgDQotICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3BvbnNlKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwocmVzcG9uc2UuZ2V0T3V0cHV0KCkuZ2V0SW1hZ2VEYXRhKCkpOw0KLSAgICAgICAgDQotICAgICAgICAvL1RoZXJlIHNob2xkIGJlIG5vIGNpZCBhcyBhdHRhY2htZW50IHNob3VsZCBiZSBpbmxpbmVkLg0KLSAgICAgICAgbnVtQ0lEcyA9IChjaWRzID09IG51bGwpID8gMCA6IGNpZHMuc2l6ZSgpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgb25lIGF0dGFjaG1lbnQgaW5saW5lZDoiICsgbnVtQ0lEcywgbnVtQ0lEcyA9PSAwKTsNCi0gICAgfQ0KLSAgICANCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9Ob25XcmFwVGVzdHMuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvTm9uV3JhcFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljYjMzNzUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9Ob25XcmFwVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotLyoqDQotICogDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZTsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuVGVzdExvZ2dlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5mcmFtZXdvcmsuQWJzdHJhY3RUZXN0Q2FzZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUubm9ud3JhcC5zZWkuRG9jTGl0Tm9uV3JhcFBvcnRUeXBlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5ub253cmFwLnNlaS5Eb2NMaXROb25XcmFwU2VydmljZTsNCi1pbXBvcnQgb3JnLnRlc3Quc2FtcGxlLm5vbndyYXAuT2JqZWN0RmFjdG9yeTsNCi1pbXBvcnQgb3JnLnRlc3Quc2FtcGxlLm5vbndyYXAuUmV0dXJuVHlwZTsNCi1pbXBvcnQgb3JnLnRlc3Quc2FtcGxlLm5vbndyYXAuVHdvV2F5Ow0KLWltcG9ydCBvcmcudGVzdC5zYW1wbGUubm9ud3JhcC5Ud29XYXlIb2xkZXI7DQotDQotaW1wb3J0IGphdmF4LnhtbC53cy5CaW5kaW5nUHJvdmlkZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5Ib2xkZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU7DQotDQotcHVibGljIGNsYXNzIE5vbldyYXBUZXN0cyBleHRlbmRzIEFic3RyYWN0VGVzdENhc2Ugew0KLQ0KLQlTdHJpbmcgYXhpc0VuZHBvaW50ID0gImh0dHA6Ly9sb2NhbGhvc3Q6NjA2MC9heGlzMi9zZXJ2aWNlcy9Eb2NMaXROb25XcmFwU2VydmljZS5Eb2NMaXROb25XcmFwUG9ydFR5cGVJbXBsUG9ydCI7DQotCQ0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7DQotICAgICAgICByZXR1cm4gZ2V0VGVzdFNldHVwKG5ldyBUZXN0U3VpdGUoTm9uV3JhcFRlc3RzLmNsYXNzKSk7DQotICAgIH0NCi0JDQotICAgIHB1YmxpYyB2b2lkIHRlc3RUd29XYXlTeW5jKCl7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiVGVzdCA6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgdHJ5ew0KLSAgICAgICAgICAgIFR3b1dheSB0d29XYXkgPSBuZXcgT2JqZWN0RmFjdG9yeSgpLmNyZWF0ZVR3b1dheSgpOw0KLSAgICAgICAgICAgIHR3b1dheS5zZXRUd293YXlTdHIoInRlc3Rpbmcgc3luYyBjYWxsIGZvciBqYXZhIGJlYW4gbm9uIHdyYXAgZW5kcG9pbnQiKTsNCi0gICAgICAgICAgICBEb2NMaXROb25XcmFwU2VydmljZSBzZXJ2aWNlID0gbmV3IERvY0xpdE5vbldyYXBTZXJ2aWNlKCk7DQotICAgICAgICAgICAgRG9jTGl0Tm9uV3JhcFBvcnRUeXBlIHByb3h5ID0gc2VydmljZS5nZXREb2NMaXROb25XcmFwUG9ydCgpOw0KLQ0KLSAgICAgICAgICAgIEJpbmRpbmdQcm92aWRlciBwID0JKEJpbmRpbmdQcm92aWRlcilwcm94eTsNCi0gICAgICAgICAgICBwLmdldFJlcXVlc3RDb250ZXh0KCkucHV0KEJpbmRpbmdQcm92aWRlci5FTkRQT0lOVF9BRERSRVNTX1BST1BFUlRZLCBheGlzRW5kcG9pbnQpOw0KLQ0KLSAgICAgICAgICAgIFJldHVyblR5cGUgcmV0dXJuVmFsdWUgPSBwcm94eS50d29XYXkodHdvV2F5KTsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZyhyZXR1cm5WYWx1ZS5nZXRSZXR1cm5TdHIoKSk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gUmVwZWF0IHRvIHZlcmlmeSBiZWhhdmlvcg0KLSAgICAgICAgICAgIHJldHVyblZhbHVlID0gcHJveHkudHdvV2F5KHR3b1dheSk7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcocmV0dXJuVmFsdWUuZ2V0UmV0dXJuU3RyKCkpOw0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIH1jYXRjaChFeGNlcHRpb24gZSl7DQotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgICAgICBmYWlsKCk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIF90ZXN0VHdvV2F5U3luY051bGwoKSB0aHJvd3MgRXhjZXB0aW9uew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIlRlc3QgOiAiICsgZ2V0TmFtZSgpKTsNCi0gICAgICAgIHRyeXsNCi0gICAgICAgICAgICBUd29XYXkgdHdvV2F5ID0gbnVsbDsgIC8vIFRoaXMgc2hvdWxkIGNhdXNlIGFuIFdlYlNlcnZpY2VFeGNlcHRpb24NCi0gICAgICAgICAgICBEb2NMaXROb25XcmFwU2VydmljZSBzZXJ2aWNlID0gbmV3IERvY0xpdE5vbldyYXBTZXJ2aWNlKCk7DQotICAgICAgICAgICAgRG9jTGl0Tm9uV3JhcFBvcnRUeXBlIHByb3h5ID0gc2VydmljZS5nZXREb2NMaXROb25XcmFwUG9ydCgpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIEJpbmRpbmdQcm92aWRlciBwID0JKEJpbmRpbmdQcm92aWRlcilwcm94eTsNCi0JCQlwLmdldFJlcXVlc3RDb250ZXh0KCkucHV0KEJpbmRpbmdQcm92aWRlci5FTkRQT0lOVF9BRERSRVNTX1BST1BFUlRZLCBheGlzRW5kcG9pbnQpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIFJldHVyblR5cGUgcmV0dXJuVmFsdWUgPSBwcm94eS50d29XYXkodHdvV2F5KTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBSZXBlYXQgdG8gdmVyaWZ5IGJlaGF2aW9yDQotICAgICAgICAgICAgcmV0dXJuVmFsdWUgPSBwcm94eS50d29XYXkodHdvV2F5KTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBUT0RPIFJldmlzaXQgSkFYQiB2YWxpZGF0aW9uDQotICAgICAgICAgICAgLy8gSkFYV1MgZG9lcyBub3QgbWFrZSB0aGUgZGVjaXNpb24gb2Ygd2hldGhlciBhDQotICAgICAgICAgICAgLy8gbnVsbCBwYXJhbWV0ZXIgY2FuIGJlIG1hcnNoYWxsZWQuICBUaGlzIGRlY2lzaW9uIGlzDQotICAgICAgICAgICAgLy8gZGVsZWdhdGVkIHRvIEpBWEIuICBJbiB0aGlzIGNhc2UsIHRoZSBzY2hlbWEgaW5kaWNhdGVzDQotICAgICAgICAgICAgLy8gdGhhdCB0aGlzIGlzIG5vdCBhIG5pbGxhYmxlIGVsZW1lbnQuICBUaGUgYXNzdW1wdGlvbiBpcw0KLSAgICAgICAgICAgIC8vIHRoYXQgSkFYQiB3aWxsIGZhaWwuICBIb3dldmVyIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgDQotICAgICAgICAgICAgLy8gSkFYQiBjb25zaWRlcnMgdGhpcyBhcyAndmFsaWRhdGlvbiBjaGVja2luZycgYW5kIGlzIG5vdA0KLSAgICAgICAgICAgIC8vIHN1cHBvcnRlZC4gIFRodXMgSkFYQiB3aWxsIG1hcnNoYWwgdGhlIGVsZW1lbnQgd2l0aG91dA0KLSAgICAgICAgICAgIC8vIGFuIGV4Y2VwdGlvbiAoYW5kIHVubWFyc2hhbCB3aXRob3V0IGV4Y2VwdGlvbikgZXZlbiB0aG91Z2gNCi0gICAgICAgICAgICAvLyB0aGlzIGlzIGEgdmlvbGF0aW9uIG9mIHRoZSBzY2hlbWEuDQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy9mYWlsKCJFeHBlY3RlZCBXZWJTZXJ2aWNlRXhjZXB0aW9uIik7DQotICAgICAgICAgICAgDQotICAgICAgICB9IGNhdGNoKFdlYlNlcnZpY2VFeGNlcHRpb24gZSl7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoZS50b1N0cmluZygpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VHdvV2F5QVN5bmNDYWxsYmFjaygpew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIlRlc3QgOiAiICsgZ2V0TmFtZSgpKTsNCi0gICAgICAgIHRyeXsNCi0gICAgICAgICAgICBUd29XYXkgdHdvV2F5ID0gbmV3IE9iamVjdEZhY3RvcnkoKS5jcmVhdGVUd29XYXkoKTsNCi0gICAgICAgICAgICB0d29XYXkuc2V0VHdvd2F5U3RyKCJ0ZXN0aW5nIEFzeW5jIGNhbGwgZm9yIGphdmEgYmVhbiBub24gd3JhcCBlbmRwb2ludCIpOw0KLSAgICAgICAgICAgIERvY0xpdE5vbldyYXBTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgRG9jTGl0Tm9uV3JhcFNlcnZpY2UoKTsNCi0gICAgICAgICAgICBEb2NMaXROb25XcmFwUG9ydFR5cGUgcHJveHkgPSBzZXJ2aWNlLmdldERvY0xpdE5vbldyYXBQb3J0KCk7DQotDQotICAgICAgICAgICAgQmluZGluZ1Byb3ZpZGVyIHAgPQkoQmluZGluZ1Byb3ZpZGVyKXByb3h5Ow0KLSAgICAgICAgICAgIHAuZ2V0UmVxdWVzdENvbnRleHQoKS5wdXQoQmluZGluZ1Byb3ZpZGVyLkVORFBPSU5UX0FERFJFU1NfUFJPUEVSVFksIGF4aXNFbmRwb2ludCk7DQotDQotICAgICAgICAgICAgQXN5bmNDYWxsYmFjayBjYWxsYmFjayA9IG5ldyBBc3luY0NhbGxiYWNrKCk7DQotICAgICAgICAgICAgRnV0dXJlPD8+IG1vbml0b3IgPSBwcm94eS50d29XYXlBc3luYyh0d29XYXksIGNhbGxiYWNrKTsNCi0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKG1vbml0b3IpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIFJlcGVhdCB0byB2ZXJpZnkgYmVoYXZpb3INCi0gICAgICAgICAgICBjYWxsYmFjayA9IG5ldyBBc3luY0NhbGxiYWNrKCk7DQotICAgICAgICAgICAgbW9uaXRvciA9IHByb3h5LnR3b1dheUFzeW5jKHR3b1dheSwgY2FsbGJhY2spOw0KLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwobW9uaXRvcik7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgfWNhdGNoKEV4Y2VwdGlvbiBlKXsNCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgICAgIGZhaWwoKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIHZvaWQgdGVzdFR3b1dheUhvbGRlcigpew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIlRlc3QgOiAiICsgZ2V0TmFtZSgpKTsNCi0gICAgICAgIHRyeXsNCi0gICAgICAgICAgICBUd29XYXlIb2xkZXIgdHdoID0gbmV3IFR3b1dheUhvbGRlcigpOw0KLSAgICAgICAgICAgIHR3aC5zZXRUd29XYXlIb2xkZXJJbnQobmV3IEludGVnZXIoMCkpOw0KLSAgICAgICAgICAgIHR3aC5zZXRUd29XYXlIb2xkZXJTdHIobmV3IFN0cmluZygiUmVxdWVzdCBIb2xkZXIgU3RyaW5nIikpOw0KLSAgICAgICAgICAgIEhvbGRlcjxUd29XYXlIb2xkZXI+IGhvbGRlciA9IG5ldyBIb2xkZXI8VHdvV2F5SG9sZGVyPih0d2gpOw0KLSAgICAgICAgICAgIFR3b1dheSB0d29XYXkgPSBuZXcgT2JqZWN0RmFjdG9yeSgpLmNyZWF0ZVR3b1dheSgpOw0KLSAgICAgICAgICAgIHR3b1dheS5zZXRUd293YXlTdHIoInRlc3Rpbmcgc3luYyBjYWxsIGZvciBqYXZhIGJlYW4gbm9uIHdyYXAgZW5kcG9pbnQiKTsNCi0gICAgICAgICAgICBEb2NMaXROb25XcmFwU2VydmljZSBzZXJ2aWNlID0gbmV3IERvY0xpdE5vbldyYXBTZXJ2aWNlKCk7DQotICAgICAgICAgICAgRG9jTGl0Tm9uV3JhcFBvcnRUeXBlIHByb3h5ID0gc2VydmljZS5nZXREb2NMaXROb25XcmFwUG9ydCgpOw0KLQ0KLSAgICAgICAgICAgIEJpbmRpbmdQcm92aWRlciBwID0JKEJpbmRpbmdQcm92aWRlcilwcm94eTsNCi0gICAgICAgICAgICBwLmdldFJlcXVlc3RDb250ZXh0KCkucHV0KEJpbmRpbmdQcm92aWRlci5FTkRQT0lOVF9BRERSRVNTX1BST1BFUlRZLCBheGlzRW5kcG9pbnQpOw0KLQ0KLSAgICAgICAgICAgIHByb3h5LnR3b1dheUhvbGRlcihob2xkZXIpOw0KLSAgICAgICAgICAgIHR3aCA9IGhvbGRlci52YWx1ZTsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiSG9sZGVyIHN0cmluZyA9IiArIHR3aC5nZXRUd29XYXlIb2xkZXJTdHIoKSk7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIkhvbGRlciBpbnQgPSIgKyB0d2guZ2V0VHdvV2F5SG9sZGVySW50KCkpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIFJlcGVhdCB0byB2ZXJpZnkgYmVoYXZpb3INCi0gICAgICAgICAgICBwcm94eS50d29XYXlIb2xkZXIoaG9sZGVyKTsNCi0gICAgICAgICAgICB0d2ggPSBob2xkZXIudmFsdWU7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIkhvbGRlciBzdHJpbmcgPSIgKyB0d2guZ2V0VHdvV2F5SG9sZGVyU3RyKCkpOw0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJIb2xkZXIgaW50ID0iICsgdHdoLmdldFR3b1dheUhvbGRlckludCgpKTsNCi0NCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICB9Y2F0Y2goRXhjZXB0aW9uIGUpew0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAgICAgZmFpbCgpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotCQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VHdvV2F5SG9sZGVyQXN5bmMoKXsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJUZXN0IDogIiArIGdldE5hbWUoKSk7DQotICAgICAgICB0cnl7DQotICAgICAgICAgICAgVHdvV2F5SG9sZGVyIHR3aCA9IG5ldyBUd29XYXlIb2xkZXIoKTsNCi0gICAgICAgICAgICB0d2guc2V0VHdvV2F5SG9sZGVySW50KG5ldyBJbnRlZ2VyKDApKTsNCi0gICAgICAgICAgICB0d2guc2V0VHdvV2F5SG9sZGVyU3RyKG5ldyBTdHJpbmcoIlJlcXVlc3QgSG9sZGVyIFN0cmluZyIpKTsNCi0gICAgICAgICAgICBIb2xkZXI8VHdvV2F5SG9sZGVyPiBob2xkZXIgPSBuZXcgSG9sZGVyPFR3b1dheUhvbGRlcj4odHdoKTsNCi0gICAgICAgICAgICBUd29XYXkgdHdvV2F5ID0gbmV3IE9iamVjdEZhY3RvcnkoKS5jcmVhdGVUd29XYXkoKTsNCi0gICAgICAgICAgICB0d29XYXkuc2V0VHdvd2F5U3RyKCJ0ZXN0aW5nIHN5bmMgY2FsbCBmb3IgamF2YSBiZWFuIG5vbiB3cmFwIGVuZHBvaW50Iik7DQotICAgICAgICAgICAgRG9jTGl0Tm9uV3JhcFNlcnZpY2Ugc2VydmljZSA9IG5ldyBEb2NMaXROb25XcmFwU2VydmljZSgpOw0KLSAgICAgICAgICAgIERvY0xpdE5vbldyYXBQb3J0VHlwZSBwcm94eSA9IHNlcnZpY2UuZ2V0RG9jTGl0Tm9uV3JhcFBvcnQoKTsNCi0NCi0gICAgICAgICAgICBCaW5kaW5nUHJvdmlkZXIgcCA9CShCaW5kaW5nUHJvdmlkZXIpcHJveHk7DQotICAgICAgICAgICAgcC5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dChCaW5kaW5nUHJvdmlkZXIuRU5EUE9JTlRfQUREUkVTU19QUk9QRVJUWSwgYXhpc0VuZHBvaW50KTsNCi0NCi0gICAgICAgICAgICBBc3luY0NhbGxiYWNrIGNhbGxiYWNrID0gbmV3IEFzeW5jQ2FsbGJhY2soKTsNCi0gICAgICAgICAgICBGdXR1cmU8Pz4gbW9uaXRvciA9cHJveHkudHdvV2F5SG9sZGVyQXN5bmModHdoLCBjYWxsYmFjayk7DQotICAgICAgICAgICAgd2hpbGUoIW1vbml0b3IuaXNEb25lKCkpew0KLSAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwobW9uaXRvcik7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gUmVwZWF0IHRvIHZlcmlmeSBiZWhhdmlvcg0KLSAgICAgICAgICAgIGNhbGxiYWNrID0gbmV3IEFzeW5jQ2FsbGJhY2soKTsNCi0gICAgICAgICAgICBtb25pdG9yID1wcm94eS50d29XYXlIb2xkZXJBc3luYyh0d2gsIGNhbGxiYWNrKTsNCi0gICAgICAgICAgICB3aGlsZSghbW9uaXRvci5pc0RvbmUoKSl7DQotICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChtb25pdG9yKTsNCi0NCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICB9Y2F0Y2goRXhjZXB0aW9uIGUpew0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAgICAgZmFpbCgpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvUGFyYWxsZWxBc3luY1Rlc3RzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL1BhcmFsbGVsQXN5bmNUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjI2YTAwLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvUGFyYWxsZWxBc3luY1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OTEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGU7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLlRlc3RMb2dnZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZnJhbWV3b3JrLkFic3RyYWN0VGVzdENhc2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLnBhcmFsbGVsYXN5bmMuY29tbW9uLkNhbGxiYWNrSGFuZGxlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUucGFyYWxsZWxhc3luYy5zZXJ2ZXIuQXN5bmNQb3J0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5wYXJhbGxlbGFzeW5jLnNlcnZlci5Bc3luY1NlcnZpY2U7DQotaW1wb3J0IG9yZy50ZXN0LnBhcmFsbGVsYXN5bmMuQ3VzdG9tQXN5bmNSZXNwb25zZTsNCi1pbXBvcnQgb3JnLnRlc3QucGFyYWxsZWxhc3luYy5TbGVlcFJlc3BvbnNlOw0KLWltcG9ydCBvcmcudGVzdC5wYXJhbGxlbGFzeW5jLldha2VVcFJlc3BvbnNlOw0KLQ0KLWltcG9ydCBqYXZheC54bWwud3MuQmluZGluZ1Byb3ZpZGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuUmVzcG9uc2U7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yOw0KLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvclNlcnZpY2U7DQotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yczsNCi1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOw0KLQ0KLS8qKg0KLSAqIFRlc3RzIGZvciBBc3luY2hyb255IGluIEpBWC1XUy4gTW9zdCBvZiB0aGUgc2ltcGxlIGludm9rZUFzeW5jL2FzeW5jDQotICogZXhjZXB0aW9ucyBoYXZlIGJlZW4gY292ZXJlZCB1bmRlciBqYXh3cy5kaXNwYXRjaCBhbmQgamF4d3MucHJveHkgdGVzdCBzdWl0ZXMNCi0gKiANCi0gKiBFeGVjdXRpb25FeGNlcHRpb24gdGVzdHMgYXJlIGNvdmVyZWQgaW4gamF4d3MuZGlzcGF0Y2ggYW5kIGpheHdzLnByb3h5DQotICovDQotcHVibGljIGNsYXNzIFBhcmFsbGVsQXN5bmNUZXN0cyBleHRlbmRzIEFic3RyYWN0VGVzdENhc2Ugew0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9DTElUV1JfQVNZTkNfRU5EUE9JTlQgPQ0KLSAgICAgICAgImh0dHA6Ly9sb2NhbGhvc3Q6NjA2MC9heGlzMi9zZXJ2aWNlcy9Bc3luY1NlcnZpY2UuRG9jTGl0V3JhcHBlZFBvcnRJbXBsUG9ydCI7DQotDQotICAgIC8vIHVzZWQgZm9yIGxvZ2dpbmcNCi0gICAgcHJpdmF0ZSBTdHJpbmcgbXlDbGFzc05hbWUgPSAiUGFyYWxsZWxBc3luY1Rlc3RzIjsNCi0NCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgew0KLSAgICAgICAgcmV0dXJuIGdldFRlc3RTZXR1cChuZXcgVGVzdFN1aXRlKFBhcmFsbGVsQXN5bmNUZXN0cy5jbGFzcykpOw0KLSAgICB9DQotICAgIAkNCi0gICAgcHVibGljIHZvaWQgdGVzdE5PT1AgKCkge30NCi0NCi0gICAgLyoqDQotICAgICAqIEB0ZXN0U3RyYXRlZ3kgQ2hlY2sgdGhhdCB0aGUgd2ViIHNlcnZpY2UgaXMgdXAgYW5kIHJ1bm5pbmcgDQotICAgICAqICAgICAgICAgICAgICAgYmVmb3JlIHJ1bm5pbmcgYW55IG90aGVyIHRlc3RzDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2VydmljZV9pc0FsaXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBmaW5hbCBTdHJpbmcgTUVTU0FHRSA9ICJ0ZXN0U2VydmljZUFsaXZlIjsNCi0NCi0gICAgICAgIFN0cmluZyB0aXRsZSA9IG15Q2xhc3NOYW1lICsgIiA6ICIgKyBnZXROYW1lKCkgKyAiIDogIjsNCi0NCi0gICAgICAgIEFzeW5jUG9ydCBwb3J0ID0gZ2V0UG9ydCgoRXhlY3V0b3IpbnVsbCk7DQotDQotICAgICAgICBTdHJpbmcgcmVxMWJhc2UgPSAic2xlZXBBc3luYyI7DQotICAgICAgICBTdHJpbmcgcmVxMmJhc2UgPSAicmVtYXBwZWRBc3luYyI7DQotDQotICAgICAgICBTdHJpbmcgcmVxdWVzdDEgPSBudWxsOw0KLSAgICAgICAgU3RyaW5nIHJlcXVlc3QyID0gbnVsbDsNCi0NCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgew0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIHJlcXVlc3QxID0gcmVxMWJhc2UgKyAiXyIgKyBpOw0KLSAgICAgICAgICAgIHJlcXVlc3QyID0gcmVxMmJhc2UgKyAiXyIgKyBpOw0KLQ0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKHRpdGxlICsgIml0ZXJhdGlvbiBbIiArIGkgKyAiXSB1c2luZyByZXF1ZXN0MSBbIiArIHJlcXVlc3QxICsNCi0gICAgICAgICAgICAgICAgICAgICJdICByZXF1ZXN0MiBbIiArIHJlcXVlc3QyICsgIl0iKTsNCi0NCi0gICAgICAgICAgICAvLyBzdWJtaXQgcmVxdWVzdCAjMSB0byB0aGUgc2VydmVyLXNpZGUgd2ViIHNlcnZpY2UgdGhhdCANCi0gICAgICAgICAgICAvLyB0aGUgd2ViIHNlcnZpY2Ugd2lsbCBrZWVwIHVudGlsIHdlIGFzayBmb3IgaXQNCi0gICAgICAgICAgICBSZXNwb25zZTxTbGVlcFJlc3BvbnNlPiByZXNwMSA9IHBvcnQuc2xlZXBBc3luYyhyZXF1ZXN0MSk7DQotDQotICAgICAgICAgICAgLy8gc3VibWl0IHJlcXVlc3QgIzIgdG8gdGhlIHNlcnZlciB0aGF0IGVzc2VudGlhbGx5IHByb2Nlc3Nlcw0KLSAgICAgICAgICAgIC8vIHdpdGhvdXQgZGVsYXkNCi0gICAgICAgICAgICBSZXNwb25zZTxDdXN0b21Bc3luY1Jlc3BvbnNlPiByZXNwMiA9IHBvcnQucmVtYXBwZWRBc3luYyhyZXF1ZXN0Mik7DQotDQotICAgICAgICAgICAgLy8gd2FpdCB1bnRpbCB0aGUgcmVzcG9uc2UgZm9yIHJlcXVlc3QgIzIgaXMgZG9uZSANCi0gICAgICAgICAgICB3YWl0QmxvY2tpbmcocmVzcDIpOw0KLQ0KLSAgICAgICAgICAgIC8vIGNoZWNrIHRoZSB3YWl0aW5nIHJlcXVlc3QgIzENCi0gICAgICAgICAgICBTdHJpbmcgYXNsZWVwID0gcG9ydC5pc0FzbGVlcChyZXF1ZXN0MSk7DQotICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4odGl0bGUrIml0ZXJhdGlvbiBbIitpKyJdICAgcG9ydC5pc0FzbGVlcChyZXF1ZXN0MSBbIityZXF1ZXN0MSsiXSkgPSBbIithc2xlZXArIl0iKTsNCi0NCi0gICAgICAgICAgICAvLyB3YWtldXAgdGhlIHdhaXRpbmcgcmVxdWVzdCAjMQ0KLSAgICAgICAgICAgIFN0cmluZyB3YWtlID0gcG9ydC53YWtlVXAocmVxdWVzdDEpOw0KLSAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKHRpdGxlKyJpdGVyYXRpb24gWyIraSsiXSAgIHBvcnQud2FrZVVwKHJlcXVlc3QxIFsiK3JlcXVlc3QxKyJdKSA9IFsiK3dha2UrIl0iKTsNCi0NCi0gICAgICAgICAgICAvLyB3YWl0IHVudGlsIHRoZSByZXNwb25zZSBmb3IgcmVxdWVzdCAjMSBpcyBkb25lDQotICAgICAgICAgICAgd2FpdEJsb2NraW5nKHJlc3AxKTsNCi0gICAgICAgIA0KLSAgICAgICAgICAgIC8vIGdldCB0aGUgcmVzcG9uc2VzDQotICAgICAgICAgICAgU3RyaW5nIHJlcTFfcmVzdWx0ID0gbnVsbDsNCi0gICAgICAgICAgICBTdHJpbmcgcmVxMl9yZXN1bHQgPSBudWxsOw0KLQ0KLSAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgIHJlcTFfcmVzdWx0ID0gcmVzcDEuZ2V0KCkuZ2V0TWVzc2FnZSgpOw0KLSAgICAgICAgICAgICAgICByZXEyX3Jlc3VsdCA9IHJlc3AyLmdldCgpLmdldFJlc3BvbnNlKCk7DQotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoDQotICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUgKyAiaXRlcmF0aW9uIFsiICsgaSArICJdIHVzaW5nIHJlcXVlc3QxIFsiICsgcmVxdWVzdDEgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl0gIHJlcXVlc3QyIFsiICsgcmVxdWVzdDIgKyAiXSA6ICBnb3QgZXhjZXB0aW9uIFsiICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiXSAgWyIgKyBlLmdldE1lc3NhZ2UoKSArICJdICIpOw0KLSAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgICAgICAgICBmYWlsKGUudG9TdHJpbmcoKSk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIC8vIGNoZWNrIHN0YXR1cyBvbiByZXF1ZXN0ICMxDQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJzbGVlcEFzeW5jIGRpZCBub3Qgc2xlZXAgYXMgZXhwZWN0ZWQiLCByZXF1ZXN0MSwgYXNsZWVwKTsNCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoInNsZWVwQXN5bmMgZGlkIG5vdCByZXR1cm4gZXhwZWN0ZWQgcmVzcG9uc2UgIiwgcmVxdWVzdDEsIHJlcTFfcmVzdWx0KTsNCi0NCi0gICAgICAgICAgICAvLyBjaGVjayBzdGF0dXMgb24gcmVxdWVzdCAjMg0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscygicmVtYXBwZWRBc3luYyBkaWQgbm90IHJldHVybiBleHBlY3RlZCByZXNwb25zZSIsIHJlcXVlc3QyLCByZXEyX3Jlc3VsdCk7DQotICAgICAgICAgICAgDQotDQotICAgICAgICAgICAgLy8gQ2FsbGluZyBnZXQoKSBhZ2FpbiBzaG91bGQgcmV0dXJuIHRoZSBzYW1lIG9iamVjdCBhcyB0aGUgZmlyc3QgY2FsbCB0byBnZXQoKQ0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscygic2xlZXBBc3luYyBkaWQgbm90IHJldHVybiBleHBlY3RlZCByZXNwb25zZSAiLCByZXF1ZXN0MSwgcmVzcDEuZ2V0KCkuZ2V0TWVzc2FnZSgpKTsNCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoInJlbWFwcGVkQXN5bmMgZGlkIG5vdCByZXR1cm4gZXhwZWN0ZWQgcmVzcG9uc2UiLCByZXF1ZXN0MiwgcmVzcDIuZ2V0KCkuZ2V0UmVzcG9uc2UoKSk7DQotICAgICAgICAgICAgDQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIC8vIGNoZWNrIHRoZSBjYWxsYmFjayBvcGVyYXRpb24NCi0JCUNhbGxiYWNrSGFuZGxlcjxTbGVlcFJlc3BvbnNlPiBzbGVlcENhbGxiYWNrSGFuZGxlciA9IG5ldyBDYWxsYmFja0hhbmRsZXI8U2xlZXBSZXNwb25zZT4oKTsNCi0NCi0gICAgICAgIHJlcXVlc3QxID0gcmVxMWJhc2UgKyAiX3dpdGhfQ2FsbGJhY2siOw0KLSAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4odGl0bGUrIiBwb3J0LnNsZWVwQXN5bmMoIityZXF1ZXN0MSsiLCBjYWxsYmFja0hhbmRlcikgIGJlaW5nIHN1Ym1pdHRlZC4uLi4iKTsNCi0JCUZ1dHVyZTw/PiBzciA9IHBvcnQuc2xlZXBBc3luYyhyZXF1ZXN0MSwgc2xlZXBDYWxsYmFja0hhbmRsZXIpOw0KLQ0KLSAgICAgICAgLy8gd2FpdCBhIGJpdCBmb3IgdGhlIHNlcnZlciB0byBwcm9jZXNzIHRoZSByZXF1ZXN0IC4uLg0KLSAgICAgICAgVGhyZWFkLnNsZWVwKDUwMCk7DQotDQotICAgICAgICAvLyBjaGVjayB0aGUgd2FpdGluZyByZXF1ZXN0IA0KLSAgICAgICAgU3RyaW5nIGFzbGVlcFdpdGhDYWxsYmFjayA9IHBvcnQuaXNBc2xlZXAocmVxdWVzdDEpOw0KLSAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4odGl0bGUrIiBwb3J0LmlzQXNsZWVwKCIrcmVxdWVzdDErIikgPSBbIithc2xlZXBXaXRoQ2FsbGJhY2srIl0iKTsNCi0NCi0gICAgICAgIC8vIHdha2V1cCB0aGUgd2FpdGluZyByZXF1ZXN0DQotICAgICAgICBTdHJpbmcgd2FrZSA9IHBvcnQud2FrZVVwKHJlcXVlc3QxKTsNCi0gICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKHRpdGxlKyIgcG9ydC53YWtlVXAoIityZXF1ZXN0MSsiKSA9IFsiK3dha2UrIl0iKTsNCi0NCi0gICAgICAgIC8vIHdhaXQgYSBiaXQuLg0KLSAgICAgICAgVGhyZWFkLnNsZWVwKDUwMCk7DQotDQotICAgICAgICAvLyBnZXQgdGhlIHJlc3BvbnNlDQotICAgICAgICBTdHJpbmcgcmVxX2NiX3Jlc3VsdCA9IG51bGw7DQotDQotICAgICAgICB0cnkgew0KLQ0KLSAgICAgICAgICAgIFNsZWVwUmVzcG9uc2Ugc2xlZXBSZXNwID0gc2xlZXBDYWxsYmFja0hhbmRsZXIuZ2V0KCk7DQotDQotICAgICAgICAgICAgaWYgKHNsZWVwUmVzcCAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmVxX2NiX3Jlc3VsdCA9IHNsZWVwUmVzcC5nZXRNZXNzYWdlKCk7DQotICAgICAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKA0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlICsgIiByZXF1ZXN0IFsiICsgcmVxdWVzdDEgKyAiXSA6ICByZXN1bHQgWyIgKyByZXFfY2JfcmVzdWx0ICsgIl0gIik7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcodGl0bGUgKyAiIHJlcXVlc3QgWyIgKyByZXF1ZXN0MSArICJdIDogIGdvdCBleGNlcHRpb24gWyIgKw0KLSAgICAgICAgICAgICAgICAgICAgZXguZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiXSAgWyIgKyBleC5nZXRNZXNzYWdlKCkgKyAiXSAiKTsNCi0gICAgICAgICAgICBleC5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgICAgICBmYWlsKGV4LnRvU3RyaW5nKCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy8gY2hlY2sgc3RhdHVzIG9uIHJlcXVlc3QNCi0gICAgICAgIGFzc2VydEVxdWFscygic2xlZXBBc3luYyB3aXRoIGNhbGxiYWNrIGRpZCBub3Qgc2xlZXAgYXMgZXhwZWN0ZWQiLCByZXF1ZXN0MSwgcmVxX2NiX3Jlc3VsdCk7DQotDQotICAgIH0NCi0NCi0NCi0gICAgLyoqDQotICAgICAqIEB0ZXN0U3RyYXRlZ3kgVGVzdCBmb3Igb3JkZXJpbmcgYW4gZXhlY3V0b3IgdG8gc2h1dGRvd25Ob3cgd2hpbGUgdGhlcmUNCi0gICAgICogICAgICAgICAgICAgICBpcyBhIHJlcXVlc3QgYmVpbmcgcHJvY2Vzc2VkLiAgVXNlcyB0aGUgZGVmYXVsdCBleGVjdXRvci4NCi0gICAgICogICAgICAgICAgICAgICANCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJ2aWNlX0V4ZWN1dG9yU2h1dGRvd25Ob3coKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIGZpbmFsIFN0cmluZyBNRVNTQUdFID0gInRlc3RFeGVjdXRvclNodXRkb3duTm93IjsNCi0NCi0gICAgICAgIFN0cmluZyB0aXRsZSA9IG15Q2xhc3NOYW1lICsgIiA6ICIgKyBnZXROYW1lKCkgKyAiIDogIjsNCi0NCi0gICAgICAgIEFzeW5jU2VydmljZSBzZXJ2aWNlID0gZ2V0U2VydmljZShudWxsKTsNCi0gICAgICAgIEFzeW5jUG9ydCBwb3J0ID0gZ2V0UG9ydChzZXJ2aWNlKTsNCi0NCi0JCS8vIGdldCB0aGUgZGVmYXVsdCBleGVjdXRvciBhbmQgY2hlY2sgdG8gbWFrZSBzdXJlIGl0IGlzIGFuIGV4ZWN1dG9yIHNlcnZpY2UNCi0gICAgICAgIEV4ZWN1dG9yU2VydmljZSBleCA9IG51bGw7DQotICAgICAgICBFeGVjdXRvciBleGVjdXRvciA9IHNlcnZpY2UuZ2V0RXhlY3V0b3IoKTsNCi0gICAgICAgIGlmICgoZXhlY3V0b3IgIT0gbnVsbCkgJiYgKGV4ZWN1dG9yIGluc3RhbmNlb2YgRXhlY3V0b3JTZXJ2aWNlKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBleCA9IChFeGVjdXRvclNlcnZpY2UpIGV4ZWN1dG9yOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKHRpdGxlICsgIiBObyBleGVjdXRvciBzZXJ2aWNlIGF2YWlsYWJsZS4gTm90aGluZyB0byB0ZXN0LiIpOw0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0NCi0NCi0gICAgICAgIC8vIHN1Ym1pdCBhIHJlcXVlc3QgdG8gdGhlIHNlcnZlciB0aGF0IHdpbGwgd2FpdCB1bnRpbCB3ZSBhc2sgZm9yIGl0DQotCQlDYWxsYmFja0hhbmRsZXI8U2xlZXBSZXNwb25zZT4gc2xlZXBDYWxsYmFja0hhbmRsZXIxID0gbmV3IENhbGxiYWNrSGFuZGxlcjxTbGVlcFJlc3BvbnNlPigpOw0KLQ0KLSAgICAgICAgU3RyaW5nIHJlcXVlc3QxID0gInNsZWVwQXN5bmNfd2l0aF9DYWxsYmFja18xIjsNCi0NCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKHRpdGxlICsgIiBwb3J0LnNsZWVwQXN5bmMoIiArIHJlcXVlc3QxICsNCi0gICAgICAgICAgICAgICAgIiwgY2FsbGJhY2tIYW5kZXIxKSAgIzEgYmVpbmcgc3VibWl0dGVkLi4uLiIpOw0KLQkJRnV0dXJlPD8+IHNyMSA9IHBvcnQuc2xlZXBBc3luYyhyZXF1ZXN0MSwgc2xlZXBDYWxsYmFja0hhbmRsZXIxKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKA0KLSAgICAgICAgICAgICAgICB0aXRsZSArICIgcG9ydC5zbGVlcEFzeW5jKCIgKyByZXF1ZXN0MSArICIsIGNhbGxiYWNrSGFuZGVyMSkgICMxIC4uLi4uc3VibWl0dGVkLiIpOw0KLQ0KLSAgICAgICAgLy8gd2FpdCBhIGJpdCB0byBtYWtlIHN1cmUgdGhhdCB0aGUgc2VydmVyIGhhcyB0aGUgcmVxdWVzdA0KLSAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDApOw0KLQ0KLQkJLy8gdGVsbCB0aGUgZXhlY3V0b3IgdG8gc2h1dGRvd24gaW1tZWRpYXRlbHksIHdoaWNoIA0KLSAgICAgICAgLy8gYXR0ZW1wdHMgdG8gc3RvcCBhbGwgYWN0aXZlbHkgZXhlY3V0aW5nIHRhc2tzIHZpYSBUaHJlYWQuaW50ZXJydXB0KCkNCi0gICAgICAgIC8vIGFuZCBzaG91bGQgcHJldmVudCBuZXcgdGFza3MgZnJvbSBiZWluZyBzdWJtaXR0ZWQNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyDQotICAgICAgICAgICAgICAgIC5kZWJ1Zyh0aXRsZSArICIgc2h1dHRpbmcgZG93biBleGVjdXRvciBbIiArIGV4LmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIl0iKTsNCi0gICAgICAgIGV4LnNodXRkb3duTm93KCk7DQotDQotICAgICAgICAvLyBjaGVjayB0aGUgd2FpdGluZyByZXF1ZXN0IA0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcodGl0bGUgKyAiIHBvcnQuaXNBc2xlZXAoIiArIHJlcXVlc3QxICsgIikgIzEgYmVpbmcgc3VibWl0dGVkLi4uLiIpOw0KLSAgICAgICAgU3RyaW5nIGFzbGVlcFdpdGhDYWxsYmFjazEgPSBwb3J0LmlzQXNsZWVwKHJlcXVlc3QxKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKA0KLSAgICAgICAgICAgICAgICB0aXRsZSArICIgcG9ydC5pc0FzbGVlcCgiICsgcmVxdWVzdDEgKyAiKSAjMSA9IFsiICsgYXNsZWVwV2l0aENhbGxiYWNrMSArICJdIik7DQotDQotICAgICAgICAvLyB3YWtldXAgdGhlIHdhaXRpbmcgcmVxdWVzdA0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcodGl0bGUgKyAiIHBvcnQud2FrZVVwKHJlcXVlc3QxKSAjMSBiZWluZyBzdWJtaXR0ZWQuLi4uIik7DQotICAgICAgICBTdHJpbmcgd2FrZTEgPSBwb3J0Lndha2VVcChyZXF1ZXN0MSk7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1Zyh0aXRsZSArICIgcG9ydC53YWtlVXAoIiArIHJlcXVlc3QxICsgIikgIzEgPSBbIiArIHdha2UxICsgIl0iKTsNCi0NCi0gICAgICAgIC8vIHdhaXQgYSBiaXQuLg0KLSAgICAgICAgVGhyZWFkLnNsZWVwKDIwMDApOw0KLQ0KLSAgICAgICAgLy8gY2hlY2sgdGhlIEZ1dHVyZQ0KLSAgICAgICAgaWYgKHNyMS5pc0RvbmUoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1Zyh0aXRsZSArICIgc3IxLmlzRG9uZVtUUlVFXSAiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vIHRyeSB0byBnZXQgdGhlIHJlc3BvbnNlDQotICAgICAgICBib29sZWFuIGdvdEV4Y2VwdGlvbiA9IGZhbHNlOw0KLSAgICAgICAgdHJ5IHsNCi0NCi0gICAgICAgICAgICBTbGVlcFJlc3BvbnNlIHNsZWVwUmVzcDEgPSBzbGVlcENhbGxiYWNrSGFuZGxlcjEuZ2V0KCk7DQotDQotICAgICAgICAgICAgaWYgKHNsZWVwUmVzcDEgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKHRpdGxlICsgIiByZXF1ZXN0IFsiICsgcmVxdWVzdDEgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICJdICMxOiAgc2xlZXBSZXNwb25zZSBbTk9UIE5VTExdIGZyb20gY2FsbGJhY2sgaGFuZGxlciIpOw0KLSAgICAgICAgICAgICAgICBTdHJpbmcgcmVzdWx0MSA9IHNsZWVwUmVzcDEuZ2V0TWVzc2FnZSgpOw0KLSAgICAgICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygNCi0gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSArICIgcmVxdWVzdCBbIiArIHJlcXVlc3QxICsgIl0gIzE6ICByZXN1bHQgWyIgKyByZXN1bHQxICsgIl0gIik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKHRpdGxlICsgIiByZXF1ZXN0IFsiICsgcmVxdWVzdDEgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICJdICMxOiAgc2xlZXBSZXNwb25zZSBbTlVMTF0gZnJvbSBjYWxsYmFjayBoYW5kbGVyIik7DQotDQotICAgICAgICAgICAgICAgIC8vIHNlZSB3aGF0IHRoZSBGdXR1cmUgc2F5cw0KLSAgICAgICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygNCi0gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSArICIgcmVxdWVzdCBbIiArIHJlcXVlc3QxICsgIl0gIzE6ICAuLi4uY2hlY2sgRnV0dXJlIHJlc3BvbnNlLi4uIik7DQotICAgICAgICAgICAgICAgIE9iamVjdCBmdXR1cmVSZXN1bHQgPSBzcjEuZ2V0KCk7DQotICAgICAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKA0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlICsgIiByZXF1ZXN0IFsiICsgcmVxdWVzdDEgKyAiXSAjMTogIC4uLi5GdXR1cmUgcmVzcG9uc2UgWyIgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnV0dXJlUmVzdWx0ICsgIl0uLi4iKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXhjKSB7DQotDQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcodGl0bGUgKyAiIHJlcXVlc3QgWyIgKyByZXF1ZXN0MSArICJdIDogIGdvdCBleGNlcHRpb24gWyIgKw0KLSAgICAgICAgICAgICAgICAgICAgZXhjLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIl0gIFsiICsgZXhjLmdldE1lc3NhZ2UoKSArICJdICIpOw0KLSAgICAgICAgICAgIGdvdEV4Y2VwdGlvbiA9IHRydWU7DQotICAgICAgICB9DQotDQotICAgICAgICBhc3NlcnRUcnVlKCJEaWQgbm90IHJlY2VpdmUgYW4gZXhjZXB0aW9uIGZyb20gdHJ5aW5nIHRvIGFjY2VzcyB0aGUgcmVzcG9uc2Ugd2hlbiB0aGUgZXhlY3V0b3Igc2VydmljZSBpcyBzaHV0ZG93bi4iLGdvdEV4Y2VwdGlvbik7DQotICAgIH0NCi0NCi0NCi0gICAgLyoqDQotICAgICAqIEB0ZXN0U3RyYXRlZ3kgVGVzdCBmb3Igb3JkZXJpbmcgYW4gZXhlY3V0b3IgdG8gc2h1dGRvd25Ob3cgd2hpbGUgdGhlcmUNCi0gICAgICogICAgICAgICAgICAgICBpcyBhIHJlcXVlc3QgYmVpbmcgcHJvY2Vzc2VkLiAgVXNlcyBhbiBhcHBsaWNhdGlvbiBleGVjdXRvcg0KLSAgICAgKiAgICAgICAgICAgICAgIHNlcnZpY2UuDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2VydmljZV9FeGVjdXRvclNodXRkb3duTm93XzIoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIGZpbmFsIFN0cmluZyBNRVNTQUdFID0gInRlc3RFeGVjdXRvclNodXRkb3duTm93XzIiOw0KLQ0KLSAgICAgICAgU3RyaW5nIHRpdGxlID0gbXlDbGFzc05hbWUgKyAiIDogIiArIGdldE5hbWUoKSArICIgOiAiOw0KLQ0KLSAgICAgICAgQXN5bmNTZXJ2aWNlIHNlcnZpY2UgPSBnZXRTZXJ2aWNlKG51bGwpOw0KLSAgICAgICAgQXN5bmNQb3J0IHBvcnQgPSBnZXRQb3J0KHNlcnZpY2UpOw0KLQ0KLQkJLy8gZ2V0IHRoZSBkZWZhdWx0IGV4ZWN1dG9yIGFuZCBjaGVjayB0byBtYWtlIHN1cmUgaXQgaXMgYW4gZXhlY3V0b3Igc2VydmljZQ0KLQkJRXhlY3V0b3JTZXJ2aWNlIGV4ID0gRXhlY3V0b3JzLm5ld1NpbmdsZVRocmVhZEV4ZWN1dG9yKCk7DQotCQlzZXJ2aWNlLnNldEV4ZWN1dG9yKGV4KTsNCi0NCi0NCi0gICAgICAgIC8vIHN1Ym1pdCBhIHJlcXVlc3QgdG8gdGhlIHNlcnZlciB0aGF0IHdpbGwgd2FpdCB1bnRpbCB3ZSBhc2sgZm9yIGl0DQotCQlDYWxsYmFja0hhbmRsZXI8U2xlZXBSZXNwb25zZT4gc2xlZXBDYWxsYmFja0hhbmRsZXIxID0gbmV3IENhbGxiYWNrSGFuZGxlcjxTbGVlcFJlc3BvbnNlPigpOw0KLQ0KLSAgICAgICAgU3RyaW5nIHJlcXVlc3QxID0gInNsZWVwQXN5bmNfd2l0aF9DYWxsYmFja18xIjsNCi0NCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKHRpdGxlICsgIiBwb3J0LnNsZWVwQXN5bmMoIiArIHJlcXVlc3QxICsNCi0gICAgICAgICAgICAgICAgIiwgY2FsbGJhY2tIYW5kZXIxKSAgIzEgYmVpbmcgc3VibWl0dGVkLi4uLiIpOw0KLQkJRnV0dXJlPD8+IHNyMSA9IHBvcnQuc2xlZXBBc3luYyhyZXF1ZXN0MSwgc2xlZXBDYWxsYmFja0hhbmRsZXIxKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKA0KLSAgICAgICAgICAgICAgICB0aXRsZSArICIgcG9ydC5zbGVlcEFzeW5jKCIgKyByZXF1ZXN0MSArICIsIGNhbGxiYWNrSGFuZGVyMSkgICMxIC4uLi4uc3VibWl0dGVkLiIpOw0KLQ0KLSAgICAgICAgLy8gd2FpdCBhIGJpdCB0byBtYWtlIHN1cmUgdGhhdCB0aGUgc2VydmVyIGhhcyB0aGUgcmVxdWVzdA0KLSAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDApOw0KLQ0KLQkJLy8gdGVsbCB0aGUgZXhlY3V0b3IgdG8gc2h1dGRvd24gaW1tZWRpYXRlbHksIHdoaWNoIA0KLSAgICAgICAgLy8gYXR0ZW1wdHMgdG8gc3RvcCBhbGwgYWN0aXZlbHkgZXhlY3V0aW5nIHRhc2tzIHZpYSBUaHJlYWQuaW50ZXJydXB0KCkNCi0gICAgICAgIC8vIGFuZCBzaG91bGQgcHJldmVudCBuZXcgdGFza3MgZnJvbSBiZWluZyBzdWJtaXR0ZWQNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyDQotICAgICAgICAgICAgICAgIC5kZWJ1Zyh0aXRsZSArICIgc2h1dHRpbmcgZG93biBleGVjdXRvciBbIiArIGV4LmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIl0iKTsNCi0gICAgICAgIGV4LnNodXRkb3duTm93KCk7DQotDQotICAgICAgICAvLyBjaGVjayB0aGUgd2FpdGluZyByZXF1ZXN0IA0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcodGl0bGUgKyAiIHBvcnQuaXNBc2xlZXAoIiArIHJlcXVlc3QxICsgIikgIzEgYmVpbmcgc3VibWl0dGVkLi4uLiIpOw0KLSAgICAgICAgU3RyaW5nIGFzbGVlcFdpdGhDYWxsYmFjazEgPSBwb3J0LmlzQXNsZWVwKHJlcXVlc3QxKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKA0KLSAgICAgICAgICAgICAgICB0aXRsZSArICIgcG9ydC5pc0FzbGVlcCgiICsgcmVxdWVzdDEgKyAiKSAjMSA9IFsiICsgYXNsZWVwV2l0aENhbGxiYWNrMSArICJdIik7DQotDQotICAgICAgICAvLyB3YWtldXAgdGhlIHdhaXRpbmcgcmVxdWVzdA0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcodGl0bGUgKyAiIHBvcnQud2FrZVVwKHJlcXVlc3QxKSAjMSBiZWluZyBzdWJtaXR0ZWQuLi4uIik7DQotICAgICAgICBTdHJpbmcgd2FrZTEgPSBwb3J0Lndha2VVcChyZXF1ZXN0MSk7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1Zyh0aXRsZSArICIgcG9ydC53YWtlVXAoIiArIHJlcXVlc3QxICsgIikgIzEgPSBbIiArIHdha2UxICsgIl0iKTsNCi0NCi0gICAgICAgIC8vIHdhaXQgYSBiaXQuLg0KLSAgICAgICAgVGhyZWFkLnNsZWVwKDIwMDApOw0KLQ0KLSAgICAgICAgLy8gY2hlY2sgdGhlIEZ1dHVyZQ0KLSAgICAgICAgaWYgKHNyMS5pc0RvbmUoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1Zyh0aXRsZSArICIgc3IxLmlzRG9uZVtUUlVFXSAiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vIHRyeSB0byBnZXQgdGhlIHJlc3BvbnNlDQotICAgICAgICBib29sZWFuIGdvdEV4Y2VwdGlvbiA9IGZhbHNlOw0KLSAgICAgICAgdHJ5IHsNCi0NCi0gICAgICAgICAgICBTbGVlcFJlc3BvbnNlIHNsZWVwUmVzcDEgPSBzbGVlcENhbGxiYWNrSGFuZGxlcjEuZ2V0KCk7DQotDQotICAgICAgICAgICAgaWYgKHNsZWVwUmVzcDEgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKHRpdGxlICsgIiByZXF1ZXN0IFsiICsgcmVxdWVzdDEgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICJdICMxOiAgc2xlZXBSZXNwb25zZSBbTk9UIE5VTExdIGZyb20gY2FsbGJhY2sgaGFuZGxlciIpOw0KLSAgICAgICAgICAgICAgICBTdHJpbmcgcmVzdWx0MSA9IHNsZWVwUmVzcDEuZ2V0TWVzc2FnZSgpOw0KLSAgICAgICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygNCi0gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSArICIgcmVxdWVzdCBbIiArIHJlcXVlc3QxICsgIl0gIzE6ICByZXN1bHQgWyIgKyByZXN1bHQxICsgIl0gIik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKHRpdGxlICsgIiByZXF1ZXN0IFsiICsgcmVxdWVzdDEgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICJdICMxOiAgc2xlZXBSZXNwb25zZSBbTlVMTF0gZnJvbSBjYWxsYmFjayBoYW5kbGVyIik7DQotDQotICAgICAgICAgICAgICAgIC8vIHNlZSB3aGF0IHRoZSBGdXR1cmUgc2F5cw0KLSAgICAgICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygNCi0gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSArICIgcmVxdWVzdCBbIiArIHJlcXVlc3QxICsgIl0gIzE6ICAuLi4uY2hlY2sgRnV0dXJlIHJlc3BvbnNlLi4uIik7DQotICAgICAgICAgICAgICAgIE9iamVjdCBmdXR1cmVSZXN1bHQgPSBzcjEuZ2V0KCk7DQotICAgICAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKA0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlICsgIiByZXF1ZXN0IFsiICsgcmVxdWVzdDEgKyAiXSAjMTogIC4uLi5GdXR1cmUgcmVzcG9uc2UgWyIgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnV0dXJlUmVzdWx0ICsgIl0uLi4iKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXhjKSB7DQotDQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcodGl0bGUgKyAiIHJlcXVlc3QgWyIgKyByZXF1ZXN0MSArICJdIDogIGdvdCBleGNlcHRpb24gWyIgKw0KLSAgICAgICAgICAgICAgICAgICAgZXhjLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIl0gIFsiICsgZXhjLmdldE1lc3NhZ2UoKSArICJdICIpOw0KLSAgICAgICAgICAgIGdvdEV4Y2VwdGlvbiA9IHRydWU7DQotICAgICAgICB9DQotDQotICAgICAgICBhc3NlcnRUcnVlKCJEaWQgbm90IHJlY2VpdmUgYW4gZXhjZXB0aW9uIGZyb20gdHJ5aW5nIHRvIGFjY2VzcyB0aGUgcmVzcG9uc2Ugd2hlbiB0aGUgZXhlY3V0b3Igc2VydmljZSBpcyBzaHV0ZG93bi4iLGdvdEV4Y2VwdGlvbik7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIEB0ZXN0U3RyYXRlZ3kgVGVzdCBmb3Igb3JkZXJpbmcgYW4gZXhlY3V0b3IgdG8gc2h1dGRvd25Ob3cgYmVmb3JlIHRoZXJlDQotICAgICAqICAgICAgICAgICAgICAgaXMgYSByZXF1ZXN0LiAgVXNlcyB0aGUgZGVmYXVsdCBleGVjdXRvci4NCi0gICAgICogICAgICAgICAgICAgICANCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJ2aWNlX0V4ZWN1dG9yU2h1dGRvd25Ob3dfMygpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgZmluYWwgU3RyaW5nIE1FU1NBR0UgPSAidGVzdEV4ZWN1dG9yU2h1dGRvd25Ob3dfMyI7DQotDQotICAgICAgICBTdHJpbmcgdGl0bGUgPSBteUNsYXNzTmFtZSArICIgOiAiICsgZ2V0TmFtZSgpICsgIiA6ICI7DQotDQotICAgICAgICBBc3luY1NlcnZpY2Ugc2VydmljZSA9IGdldFNlcnZpY2UobnVsbCk7DQotICAgICAgICBBc3luY1BvcnQgcG9ydCA9IGdldFBvcnQoc2VydmljZSk7DQotDQotCQkvLyBnZXQgdGhlIGRlZmF1bHQgZXhlY3V0b3IgYW5kIGNoZWNrIHRvIG1ha2Ugc3VyZSBpdCBpcyBhbiBleGVjdXRvciBzZXJ2aWNlDQotICAgICAgICBFeGVjdXRvclNlcnZpY2UgZXggPSBudWxsOw0KLSAgICAgICAgRXhlY3V0b3IgZXhlY3V0b3IgPSBzZXJ2aWNlLmdldEV4ZWN1dG9yKCk7DQotICAgICAgICBpZiAoKGV4ZWN1dG9yICE9IG51bGwpICYmIChleGVjdXRvciBpbnN0YW5jZW9mIEV4ZWN1dG9yU2VydmljZSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgZXggPSAoRXhlY3V0b3JTZXJ2aWNlKSBleGVjdXRvcjsNCi0NCi0gICAgICAgICAgICAvLyB0ZWxsIHRoZSBleGVjdXRvciB0byBzaHV0ZG93biBpbW1lZGlhdGVseSwgd2hpY2ggDQotICAgICAgICAgICAgLy8gYXR0ZW1wdHMgdG8gc3RvcCBhbGwgYWN0aXZlbHkgZXhlY3V0aW5nIHRhc2tzIHZpYSBUaHJlYWQuaW50ZXJydXB0KCkNCi0gICAgICAgICAgICAvLyBhbmQgc2hvdWxkIHByZXZlbnQgbmV3IHRhc2tzIGZyb20gYmVpbmcgc3VibWl0dGVkDQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXINCi0gICAgICAgICAgICAgICAgICAgIC5kZWJ1Zyh0aXRsZSArICIgc2h1dHRpbmcgZG93biBleGVjdXRvciBbIiArIGV4LmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIl0iKTsNCi0gICAgICAgICAgICBleC5zaHV0ZG93bk5vdygpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKHRpdGxlICsgIiBObyBleGVjdXRvciBzZXJ2aWNlIGF2YWlsYWJsZS4gTm90aGluZyB0byB0ZXN0LiIpOw0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0NCi0NCi0gICAgICAgIGJvb2xlYW4gZ290UmVxdWVzdEV4Y2VwdGlvbiA9IGZhbHNlOw0KLQ0KLSAgICAgICAgU3RyaW5nIHJlcXVlc3QxID0gInNsZWVwQXN5bmNfd2l0aF9DYWxsYmFja18xIjsNCi0gICAgICAgIENhbGxiYWNrSGFuZGxlcjxTbGVlcFJlc3BvbnNlPiBzbGVlcENhbGxiYWNrSGFuZGxlcjEgPSBuZXcgQ2FsbGJhY2tIYW5kbGVyPFNsZWVwUmVzcG9uc2U+KCk7DQotICAgICAgICBGdXR1cmU8Pz4gc3IxID0gbnVsbDsNCi0NCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vIHN1Ym1pdCBhIHJlcXVlc3QgdG8gdGhlIHNlcnZlciB0aGF0IHdpbGwgd2FpdCB1bnRpbCB3ZSBhc2sgZm9yIGl0DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcodGl0bGUgKyAiIHBvcnQuc2xlZXBBc3luYygiICsgcmVxdWVzdDEgKw0KLSAgICAgICAgICAgICAgICAgICAgIiwgY2FsbGJhY2tIYW5kZXIxKSAgIzEgYmVpbmcgc3VibWl0dGVkLi4uLiIpOw0KLSAgICAgICAgICAgIHNyMSA9IHBvcnQuc2xlZXBBc3luYyhyZXF1ZXN0MSwgc2xlZXBDYWxsYmFja0hhbmRsZXIxKTsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1Zyh0aXRsZSArICIgcG9ydC5zbGVlcEFzeW5jKCIgKyByZXF1ZXN0MSArDQotICAgICAgICAgICAgICAgICAgICAiLCBjYWxsYmFja0hhbmRlcjEpICAjMSAuLi4uLnN1Ym1pdHRlZC4iKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXhjKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKHRpdGxlICsgIiByZXF1ZXN0IFsiICsgcmVxdWVzdDEgKyAiXSA6ICBnb3QgZXhjZXB0aW9uIFsiICsNCi0gICAgICAgICAgICAgICAgICAgIGV4Yy5nZXRDbGFzcygpLmdldE5hbWUoKSArICJdICBbIiArIGV4Yy5nZXRNZXNzYWdlKCkgKyAiXSAiKTsNCi0gICAgICAgICAgICBnb3RSZXF1ZXN0RXhjZXB0aW9uID0gdHJ1ZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vIGlmIHRoZSByZXF1ZXN0IHdlbnQgdGhyb3VnaCwgY29udGludWUgcHJvY2Vzc2luZyB0byBzZWUgaWYgdGhlIHJlc3BvbnNlIGlzIHN0b3BwZWQNCi0gICAgICAgIC8vIHRoaXMgbWFrZXMgc3VyZSB0aGF0IHRoZSBzZXJ2ZXIgZG9lc24ndCBrZWVwIHRoZSByZXF1ZXN0IGZvcmV2ZXINCi0gICAgICAgIGJvb2xlYW4gZ290UmVzcG9uc2VFeGNlcHRpb24gPSBmYWxzZTsNCi0NCi0gICAgICAgIGlmICghZ290UmVxdWVzdEV4Y2VwdGlvbikNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvLyB3YWtldXAgdGhlIHdhaXRpbmcgcmVxdWVzdA0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKHRpdGxlICsgIiBwb3J0Lndha2VVcChyZXF1ZXN0MSkgIzEgYmVpbmcgc3VibWl0dGVkLi4uLiIpOw0KLSAgICAgICAgICAgIFN0cmluZyB3YWtlMSA9IHBvcnQud2FrZVVwKHJlcXVlc3QxKTsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1Zyh0aXRsZSArICIgcG9ydC53YWtlVXAoIiArIHJlcXVlc3QxICsgIikgIzEgPSBbIiArIHdha2UxICsgIl0iKTsNCi0NCi0gICAgICAgICAgICAvLyB0cnkgdG8gZ2V0IHRoZSByZXNwb25zZQ0KLSAgICAgICAgICAgIHRyeSB7DQotDQotICAgICAgICAgICAgICAgIFNsZWVwUmVzcG9uc2Ugc2xlZXBSZXNwMSA9IHNsZWVwQ2FsbGJhY2tIYW5kbGVyMS5nZXQoKTsNCi0NCi0gICAgICAgICAgICAgICAgaWYgKHNsZWVwUmVzcDEgIT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcodGl0bGUgKyAiIHJlcXVlc3QgWyIgKyByZXF1ZXN0MSArDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJdICMxOiAgc2xlZXBSZXNwb25zZSBbTk9UIE5VTExdIGZyb20gY2FsbGJhY2sgaGFuZGxlciIpOw0KLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlc3VsdDEgPSBzbGVlcFJlc3AxLmdldE1lc3NhZ2UoKTsNCi0gICAgICAgICAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSArICIgcmVxdWVzdCBbIiArIHJlcXVlc3QxICsgIl0gIzE6ICByZXN1bHQgWyIgKyByZXN1bHQxICsgIl0gIik7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1Zyh0aXRsZSArICIgcmVxdWVzdCBbIiArIHJlcXVlc3QxICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIl0gIzE6ICBzbGVlcFJlc3BvbnNlIFtOVUxMXSBmcm9tIGNhbGxiYWNrIGhhbmRsZXIiKTsNCi0NCi0gICAgICAgICAgICAgICAgICAgIC8vIHNlZSB3aGF0IHRoZSBGdXR1cmUgc2F5cw0KLSAgICAgICAgICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcodGl0bGUgKyAiIHJlcXVlc3QgWyIgKyByZXF1ZXN0MSArDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJdICMxOiAgLi4uLmNoZWNrIEZ1dHVyZSByZXNwb25zZS4uLiIpOw0KLSAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGZ1dHVyZVJlc3VsdCA9IHNyMS5nZXQoKTsNCi0gICAgICAgICAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKHRpdGxlICsgIiByZXF1ZXN0IFsiICsgcmVxdWVzdDEgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXSAjMTogIC4uLi5GdXR1cmUgcmVzcG9uc2UgWyIgKyBmdXR1cmVSZXN1bHQgKyAiXS4uLiIpOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4Yykgew0KLQ0KLSAgICAgICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1Zyh0aXRsZSArICIgcmVxdWVzdCBbIiArIHJlcXVlc3QxICsgIl0gOiAgZ290IGV4Y2VwdGlvbiBbIiArDQotICAgICAgICAgICAgICAgICAgICAgICAgZXhjLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIl0gIFsiICsgZXhjLmdldE1lc3NhZ2UoKSArICJdICIpOw0KLSAgICAgICAgICAgICAgICBnb3RSZXNwb25zZUV4Y2VwdGlvbiA9IHRydWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiRGlkIG5vdCByZWNlaXZlIGFuIGV4Y2VwdGlvbiBmcm9tIHRyeWluZyB0byBzdWJtaXQgdGhlIHJlcXVlc3Qgd2hlbiB0aGUgZXhlY3V0b3Igc2VydmljZSBpcyBzaHV0ZG93bi4iLGdvdFJlcXVlc3RFeGNlcHRpb24pOw0KLQ0KLSAgICAgICAgLy9hc3NlcnRUcnVlKCJEaWQgbm90IHJlY2VpdmUgYW4gZXhjZXB0aW9uIGZyb20gdHJ5aW5nIHRvIGFjY2VzcyB0aGUgcmVzcG9uc2Ugd2hlbiB0aGUgZXhlY3V0b3Igc2VydmljZSBpcyBzaHV0ZG93bi4iLGdvdFJlc3BvbnNlRXhjZXB0aW9uKTsNCi0gICAgfQ0KLQ0KLQ0KLQ0KLQ0KLSAgICAvKioNCi0gICAgICogQXV4aWxpYXJ5IG1ldGhvZCB1c2VkIGZvciBkb2luZyBpc0FzbGVlcCBjaGVja3MuIFdpbGwgcGVyZm9ybSBpc0FzbGVlcA0KLSAgICAgKiB1cCB0byBhIE1BWF9JU0FTTEVFUF9DSEVDSyBudW1iZXIgb2YgY2hlY2tzLiBXaWxsIHNsZWVwIGZvcg0KLSAgICAgKiBTTEVFUF9JU0FTTEVFUF9TRUMgc2Vjb25kcyBpbiBiZXR3ZWVuIHJlcXVlc3RzLiBJZiByZWFjaGVzIG1heGltdW0gbnVtYmVyDQotICAgICAqIGZvIHJldHJpZXMgdGhlbiB3aWxsIGZhaWwgdGhlIHRlc3QNCi0gICAgICovDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0FzbGVlcENoZWNrKFN0cmluZyBNRVNTQUdFLCBBc3luY1BvcnQgcG9ydCkgew0KLSAgICAgICAgYm9vbGVhbiBhc2xlZXAgPSBmYWxzZTsNCi0gICAgICAgIGludCBjaGVjayA9IDMwOw0KLSAgICAgICAgU3RyaW5nIG1zZyA9IG51bGw7DQotICAgICAgICBkbyB7DQotICAgICAgICAgICAgbXNnID0gcG9ydC5pc0FzbGVlcChNRVNTQUdFKTsNCi0gICAgICAgICAgICBhc2xlZXAgPSAobXNnICE9IG51bGwpOw0KLQ0KLSAgICAgICAgICAgIC8vIGZhaWwgdGhlIHRlc3QgaWYgd2UgcmFuIG91dCBvZiBjaGVja3MNCi0gICAgICAgICAgICBpZiAoKGNoZWNrLS0pID09IDApDQotICAgICAgICAgICAgICAgIGZhaWwoIlNlcnZlIGRpZCBub3QgcmVjZWl2ZSBzbGVlcCBhZnRlciBzZXZlcmFsIHJldHJpZXMiKTsNCi0NCi0gICAgICAgICAgICAvLyBzbGVlcCBmb3IgYSBiaXQNCi0gICAgICAgICAgICB0cnkgew0KLSAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMzApOw0KLSAgICAgICAgICAgIH0gDQotICAgICAgICAgICAgY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICB9IHdoaWxlICghYXNsZWVwKTsNCi0NCi0gICAgICAgIGlmIChhc2xlZXApIHsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKCJTbGVlcGluZyBvbiBhbiBpbmNvcnJlY3QgbWVzc2FnZSIsIE1FU1NBR0UuZXF1YWxzKG1zZykpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0gICAgDQotDQotICAgIHByaXZhdGUgQXN5bmNTZXJ2aWNlIGdldFNlcnZpY2UoRXhlY3V0b3IgZXgpIHsNCi0gICAgICAgIEFzeW5jU2VydmljZSBzZXJ2aWNlID0gbmV3IEFzeW5jU2VydmljZSgpOw0KLQ0KLSAgICAgICAgaWYgKGV4IT0gbnVsbCkNCi0gICAgICAgICAgICBzZXJ2aWNlLnNldEV4ZWN1dG9yKGV4KTsNCi0gICAgICAgIA0KLSAgICAgICAgaWYgKHNlcnZpY2UuZ2V0RXhlY3V0b3IoKSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKG15Q2xhc3NOYW1lICsgIiA6IGdldFNlcnZpY2UoKSA6IGV4ZWN1dG9yIGlzIG51bGwiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZyhteUNsYXNzTmFtZSArICIgOiBnZXRTZXJ2aWNlKCkgOiBleGVjdXRvciBpcyBhdmFpbGFibGUgIik7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gc2VydmljZTsNCi0gICAgfQ0KLQ0KLQ0KLSAgICBwcml2YXRlIEFzeW5jUG9ydCBnZXRQb3J0KEFzeW5jU2VydmljZSBzZXJ2aWNlKSB7DQotDQotICAgICAgICBBc3luY1BvcnQgcG9ydCA9IHNlcnZpY2UuZ2V0QXN5bmNQb3J0KCk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKCJQb3J0IGlzIG51bGwiLCBwb3J0KTsNCi0NCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcmMgPSAoKEJpbmRpbmdQcm92aWRlcikgcG9ydCkuZ2V0UmVxdWVzdENvbnRleHQoKTsNCi0gICAgICAgIHJjLnB1dChCaW5kaW5nUHJvdmlkZXIuRU5EUE9JTlRfQUREUkVTU19QUk9QRVJUWSwNCi0gICAgICAgICAgICAgICAgRE9DTElUV1JfQVNZTkNfRU5EUE9JTlQpOw0KLSAgICAgICAgDQotICAgICAgICByZXR1cm4gcG9ydDsNCi0NCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogQXV4aWxpYXJ5IG1ldGhvZCB1c2VkIGZvciBvYnRhaW5pbmcgYSBwcm94eSBwcmUtY29uZmlndXJlZCB3aXRoIGENCi0gICAgICogc3BlY2lmaWMgRXhlY3V0b3INCi0gICAgICovDQotICAgIHByaXZhdGUgQXN5bmNQb3J0IGdldFBvcnQoRXhlY3V0b3IgZXgpIHsNCi0gICAgICAgIEFzeW5jU2VydmljZSBzZXJ2aWNlID0gZ2V0U2VydmljZShleCk7DQotDQotICAgICAgICBBc3luY1BvcnQgcG9ydCA9IHNlcnZpY2UuZ2V0QXN5bmNQb3J0KCk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKCJQb3J0IGlzIG51bGwiLCBwb3J0KTsNCi0NCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcmMgPSAoKEJpbmRpbmdQcm92aWRlcikgcG9ydCkuZ2V0UmVxdWVzdENvbnRleHQoKTsNCi0gICAgICAgIHJjLnB1dChCaW5kaW5nUHJvdmlkZXIuRU5EUE9JTlRfQUREUkVTU19QUk9QRVJUWSwNCi0gICAgICAgICAgICAgICAgRE9DTElUV1JfQVNZTkNfRU5EUE9JTlQpOw0KLSAgICAgICAgDQotICAgICAgICByZXR1cm4gcG9ydDsNCi0gICAgfQ0KLSAgICANCi0gICAgcHJpdmF0ZSB2b2lkIHdhaXRCbG9ja2luZyhGdXR1cmU8Pz4gbW9uaXRvcil7DQotICAgICAgICB3aGlsZSAoIW1vbml0b3IuaXNEb25lKCkpew0KLSAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsNCi0gICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvUmVzb3VyY2VJbmplY3Rpb25UZXN0cy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9SZXNvdXJjZUluamVjdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjZjI3MDMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9SZXNvdXJjZUluamVjdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZTsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZnJhbWV3b3JrLkFic3RyYWN0VGVzdENhc2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLnJlc291cmNlaW5qZWN0aW9uLnNlaS5SZXNvdXJjZUluamVjdGlvblBvcnRUeXBlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5yZXNvdXJjZWluamVjdGlvbi5zZWkuUmVzb3VyY2VJbmplY3Rpb25TZXJ2aWNlOw0KLQ0KLWltcG9ydCBqYXZheC54bWwud3MuQmluZGluZ1Byb3ZpZGVyOw0KLQ0KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZUluamVjdGlvblRlc3RzIGV4dGVuZHMgQWJzdHJhY3RUZXN0Q2FzZSB7DQotICAgIFN0cmluZyBheGlzRW5kcG9pbnQgPSAiaHR0cDovL2xvY2FsaG9zdDo2MDYwL2F4aXMyL3NlcnZpY2VzL1Jlc291cmNlSW5qZWN0aW9uU2VydmljZS5SZXNvdXJjZUluamVjdGlvblBvcnRUeXBlSW1wbFBvcnQiOw0KLQkNCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgew0KLSAgICAgICAgcmV0dXJuIGdldFRlc3RTZXR1cChuZXcgVGVzdFN1aXRlKFJlc291cmNlSW5qZWN0aW9uVGVzdHMuY2xhc3MpKTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIFJlc291cmNlSW5qZWN0aW9uUG9ydFR5cGUgZ2V0UHJveHkoKSB7DQotICAgICAgICBSZXNvdXJjZUluamVjdGlvblNlcnZpY2Ugc2VydmljZSA9IG5ldyBSZXNvdXJjZUluamVjdGlvblNlcnZpY2UoKTsNCi0gICAgICAgIFJlc291cmNlSW5qZWN0aW9uUG9ydFR5cGUgcHJveHkgPSBzZXJ2aWNlLmdldFJlc291cmNlSW5qZWN0aW9uUG9ydCgpOw0KLSAgICAgICAgQmluZGluZ1Byb3ZpZGVyIHAgPSAoQmluZGluZ1Byb3ZpZGVyKSBwcm94eTsNCi0gICAgICAgIHAuZ2V0UmVxdWVzdENvbnRleHQoKS5wdXQoQmluZGluZ1Byb3ZpZGVyLkVORFBPSU5UX0FERFJFU1NfUFJPUEVSVFksIGF4aXNFbmRwb2ludCk7DQotICAgICAgICByZXR1cm4gcHJveHk7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBUaGlzIHRlc3QgZW5zdXJlcyB0aGF0IGFuIGVuZHBvaW50IHdpdGggYW4gaW5qZWN0IFdlYlNlcnZpY2VDb250ZXh0DQotICAgICAqIGNhbiBzdWNjZXNzZnVsbHkgZ2V0IGFuZCBxdWVyeSB0aGUgd2ViIHNlcnZpY2UuDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RWNob1dpdGhSZXNvdXJjZUluamVjdGlvbkFuZExpZmVjeWNsZU1ldGhvZHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgICAgDQotICAgICAgICAgICAgUmVzb3VyY2VJbmplY3Rpb25Qb3J0VHlwZSBwcm94eSA9IGdldFByb3h5KCk7DQotICAgICAgICAgICAgU3RyaW5nIHJlc3BvbnNlID0gcHJveHkudGVzdEluamVjdGlvbigic2FtcGxlIik7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIHJlc3BvbnNlIHdhcyBudWxsIiwgcmVzcG9uc2UgIT0gbnVsbCk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIHJlc3BvbnNlIHdhcyBub3Qgc3VjY2VzZnVsOiAiICsgcmVzcG9uc2UsIA0KLSAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuaW5kZXhPZigiU1VDQ0VTUyIpID49IDApOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIFJlcGVhdCB0byB2ZXJpZnkgYmVoYXZpb3INCi0gICAgICAgICAgICByZXNwb25zZSA9IHByb3h5LnRlc3RJbmplY3Rpb24oInNhbXBsZSIpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUoIlRoZSByZXNwb25zZSB3YXMgbnVsbCIsIHJlc3BvbnNlICE9IG51bGwpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUoIlRoZSByZXNwb25zZSB3YXMgbm90IHN1Y2Nlc2Z1bDogIiArIHJlc3BvbnNlLCANCi0gICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmluZGV4T2YoIlNVQ0NFU1MiKSA+PSAwKTsNCi0gICAgICAgIA0KLSAgICB9DQotICAgDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvUnVudGltZUV4Y2VwdGlvbnNBc3luY01lcFRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvUnVudGltZUV4Y2VwdGlvbnNBc3luY01lcFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDI3NTA5NC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL1J1bnRpbWVFeGNlcHRpb25zQXN5bmNNZXBUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGU7Ci0KLWltcG9ydCBqYXZhLm5ldC5Db25uZWN0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVua25vd25Ib3N0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTsKLQotaW1wb3J0IGphdmF4LnhtbC53cy5CaW5kaW5nUHJvdmlkZXI7Ci1pbXBvcnQgamF2YXgueG1sLndzLlJlc3BvbnNlOwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRmVhdHVyZTsKLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5BZGRyZXNzaW5nRmVhdHVyZTsKLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5TT0FQRmF1bHRFeGNlcHRpb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkFkZHJlc3NpbmdDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LkZpbGVTeXN0ZW1Db25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5DbGllbnRDb25maWd1cmF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmZyYW1ld29yay5BYnN0cmFjdFRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLmFzeW5jZG9jbGl0LmNsaWVudC5Bc3luY0NsaWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5hc3luY2RvY2xpdC5jbGllbnQuQXN5bmNQb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLmFzeW5jZG9jbGl0LmNsaWVudC5Bc3luY1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuYXN5bmNkb2NsaXQuY2xpZW50LlRocm93RXhjZXB0aW9uRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuYXN5bmNkb2NsaXQuY29tbW9uLkNhbGxiYWNrSGFuZGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLm1ldGFkYXRhLnJlZ2lzdHJ5Lk1ldGFkYXRhRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy50ZXN0LmFzeW5jZG9jbGl0LkV4Y2VwdGlvblR5cGVFbnVtOwotaW1wb3J0IG9yZy50ZXN0LmFzeW5jZG9jbGl0LlRocm93RXhjZXB0aW9uUmVzcG9uc2U7Ci0KLS8qKgotICogVGVzdCBmb3IgdmFyaW9zIGFzeW5jIGV4Y2VwdGlvbnMgd2hlcm4gQXN5bmNNRVAgaXMgZW5hYmxlZAotICovCi1wdWJsaWMgY2xhc3MgUnVudGltZUV4Y2VwdGlvbnNBc3luY01lcFRlc3QgZXh0ZW5kcyBBYnN0cmFjdFRlc3RDYXNlIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBET0NMSVRXUl9BU1lOQ19FTkRQT0lOVCA9ICJodHRwOi8vbG9jYWxob3N0OjYwNjAvYXhpczIvc2VydmljZXMvQXN5bmNTZXJ2aWNlMi5Eb2NMaXRXcmFwcGVkUG9ydEltcGxQb3J0IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OTkVDVF9FWENFUFRJT05fRU5EUE9JTlQgPSAiaHR0cDovL2xvY2FsaG9zdDo2MDYxL2F4aXMyL3NlcnZpY2VzL0FzeW5jU2VydmljZTIuRG9jTGl0V3JhcHBlZFBvcnRJbXBsUG9ydCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDT05ORUNUXzQwNF9FTkRQT0lOVCA9IERPQ0xJVFdSX0FTWU5DX0VORFBPSU5UIC8vIENvbnN0YW50cy5ET0NMSVRXUl9BU1lOQ19FTkRQT0lOVAotICAgICAgICAgICAgKyAiL0RvZXNOb3RFeGlzdCI7Ci0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEhPU1RfTk9UX0ZPVU5EX0VORFBPSU5UID0gImh0dHA6Ly90aGlzLmVuZHBvaW50LmRvZXMubm90LmV4aXN0L25vcGUiOwotCi0gICAgLyoKLSAgICAgKiBGb3IgYXN5bmMtb24tdGhlLXdpcmUgZXhjaGFuZ2VzLCB3ZSBuZWVkIHRvIGVuYWJsZSBXUy1BZGRyZXNzaW5nIGFuZCBnZXQgYSB0cmFuc3BvcnQKLSAgICAgKiBsaXN0ZW5lciBzZXR1cCB0byByZWNlaXZlIHRoZSBpbmJvdW5kIHJlcXVlc3QgZnJvbSB0aGUgc2VydmljZS1wcm92aWRlciB3aGljaCBjb250YWlucyB0aGUKLSAgICAgKiByZXNwb25zZS4gIFdlIG9ubHkgbmVlZCB0byBkbyB0aGF0IG9uZSB0aW1lIGZvciBhbGwgdGhlIHRlc3RzLgotICAgICAqLwotICAgIHN0YXRpYyBib29sZWFuIGxpc3RlbmVyQWxyZWFkeVNldHVwID0gZmFsc2U7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIFRlc3QgdGVzdCA9IGdldFRlc3RTZXR1cChuZXcgVGVzdFN1aXRlKAotICAgICAgICAgICAgICAgIFJ1bnRpbWVFeGNlcHRpb25zQXN5bmNNZXBUZXN0LmNsYXNzKSwgbnVsbCwKLSAgICAgICAgICAgICAgICAidGVzdC1yZXNvdXJjZXMvYXhpczJfYWRkcmVzc2luZy54bWwiKTsKLSAgICAgICAgcmV0dXJuIHRlc3Q7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBBc3luY1BvcnQgZ2V0UG9ydCgpIHsKLSAgICAgICAgcmV0dXJuIGdldFBvcnQobnVsbCk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgQXN5bmNQb3J0IGdldFBvcnQoV2ViU2VydmljZUZlYXR1cmUuLi4gZmVhdHVyZXMpIHsKLQotICAgICAgICBBc3luY1NlcnZpY2Ugc2VydmljZSA9IG5ldyBBc3luY1NlcnZpY2UoKTsKLSAgICAgICAgQXN5bmNQb3J0IHBvcnQgPSBzZXJ2aWNlLmdldEFzeW5jUG9ydChmZWF0dXJlcyk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoIlBvcnQgaXMgbnVsbCIsIHBvcnQpOwotCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcmMgPSAoKEJpbmRpbmdQcm92aWRlcikgcG9ydCkuZ2V0UmVxdWVzdENvbnRleHQoKTsKLSAgICAgICAgcmMucHV0KEJpbmRpbmdQcm92aWRlci5FTkRQT0lOVF9BRERSRVNTX1BST1BFUlRZLAotICAgICAgICAgICAgICAgIERPQ0xJVFdSX0FTWU5DX0VORFBPSU5UKTsKLQotICAgICAgICByZXR1cm4gcG9ydDsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogQHRlc3RTdHJhdGVneSBJbnZva2UgdGhlIHByb3h5IHdpdGggc3luYyBtZXRob2QsIHNwZWNpZnlpbmcgdGhhdCBpdCBzaG91bGQgdXNlCi0gICAgICogICAgICAgICAgICAgICB0aGUgYXN5bmMtb24tdGhlLXdpcmUgTUVQLiAgVGhlIHByb3h5IGVucGRvaW50IHNwZWNpZmllcyBhIHBvcnQgdGhhdAotICAgICAqICAgICAgICAgICAgICAgZG9lcyBub3QgZXhpc3QuICBWZXJpZnkgdGhhdCB0aGUgY29ubmVjdGlvbiBleGNlcHRpb24gaXMgcmVjZWl2ZWQKLSAgICAgKiAgICAgICAgICAgICAgIGJ5IHRoZSBjbGllbnQuCi0gICAgICovCi0gIAotICAgIHB1YmxpYyB2b2lkIHRlc3RBc3luY0NhbGxiYWNrX2FzeW5jV2lyZV9Db25uZWN0RXhjZXB0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHNldHVwQWRkcmVzc2luZ0FuZExpc3RlbmVyKCk7Ci0gICAgICAgIAotICAgICAgICBBc3luY1BvcnQgcG9ydCA9IGdldFBvcnQoKTsKLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByYyA9ICgoQmluZGluZ1Byb3ZpZGVyKSBwb3J0KS5nZXRSZXF1ZXN0Q29udGV4dCgpOwotICAgICAgICByYy5wdXQoQmluZGluZ1Byb3ZpZGVyLkVORFBPSU5UX0FERFJFU1NfUFJPUEVSVFksIENPTk5FQ1RfRVhDRVBUSU9OX0VORFBPSU5UKTsKLSAgICAgICAgcmMucHV0KCJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnVzZS5hc3luYy5tZXAiLCBCb29sZWFuLlRSVUUpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTdHJpbmcgcmVzcCA9IHBvcnQudGhyb3dFeGNlcHRpb24oRXhjZXB0aW9uVHlwZUVudW0uV1NFKTsKLSAgICAgICAgICAgIGZhaWwoIkRpZCBub3QgZ2V0IGFuIGV4Y2VwdGlvbiBhcyBleHBlY3RlZCIpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZWUpIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUoIkV4ZWN1dGlvbkV4Y2VwdGlvbi5nZXRDYXVzZSBzaG91bGQgYmUgYW4gaW5zdGFuY2Ugb2YgV2ViU2VydmljZUV4Y2VwdGlvbiIsCi0gICAgICAgICAgICAgICAgICAgICAgIGVlIGluc3RhbmNlb2YgV2ViU2VydmljZUV4Y2VwdGlvbik7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKCJEaWRuJ3QgZ2V0IGEgY2F1c2Ugd2l0aGluIHRoZSBXZWJTZXJ2aWNlRXhjZXB0aW9uIiwKLSAgICAgICAgICAgICAgICAgICAgICAgZWUuZ2V0Q2F1c2UoKSAhPSBudWxsKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoIkNhdXNlIHdhcyBub3QgQ29ubmVjdGlvbkV4Y2VwdGlvbiBhcyBleHBlY3RlZCIsIAotICAgICAgICAgICAgICAgICAgICAgICBlZS5nZXRDYXVzZSgpIGluc3RhbmNlb2YgQ29ubmVjdEV4Y2VwdGlvbik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAdGVzdFN0cmF0ZWd5IEludm9rZSB0aGUgcHJveHkgd2l0aCBhc3luYy1wb2xsaW5nIG1ldGhvZCwgdGhlIHByb3h5IGlzCi0gICAgICogICAgICAgICAgICAgICBjb25maWd1cmVkIGFnYWluc3QgYW4gZW5kcG9pbnQgd2hpY2ggZG9lcyBub3QgZXhpc3QgKHRoaXMKLSAgICAgKiAgICAgICAgICAgICAgIGlzIGEgc2VydmVyIG5vdCBmb3VuZCBjYXNlKS4gRXhwZWN0ZWQgdG8gdGhyb3cgYQotICAgICAqICAgICAgICAgICAgICAgRUUvV1NFL1Vua25vd25Ib3N0RXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEFzeW5jUG9sbGluZ19hc3luY01FUF9Vbmtud29uSG9zdCgpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIEFzeW5jUG9ydCBwb3J0ID0gZ2V0UG9ydCgpOwotCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcmMgPSAoKEJpbmRpbmdQcm92aWRlcikgcG9ydCkuZ2V0UmVxdWVzdENvbnRleHQoKTsKLSAgICAgICAgcmMucHV0KEJpbmRpbmdQcm92aWRlci5FTkRQT0lOVF9BRERSRVNTX1BST1BFUlRZLAotICAgICAgICAgICAgICAgIEhPU1RfTk9UX0ZPVU5EX0VORFBPSU5UKTsKLQotICAgICAgICBSZXNwb25zZTxUaHJvd0V4Y2VwdGlvblJlc3BvbnNlPiByZXNwID0gcG9ydAotICAgICAgICAgICAgICAgIC50aHJvd0V4Y2VwdGlvbkFzeW5jKEV4Y2VwdGlvblR5cGVFbnVtLldTRSk7Ci0KLSAgICAgICAgQXN5bmNDbGllbnQud2FpdEJsb2NraW5nKHJlc3ApOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmVzcC5nZXQoKTsKLQotICAgICAgICAgICAgZmFpbCgiRXhlY3V0aW9uRXhjZXB0aW9uIGV4cGVjdGVkIGF0IGludm9rZSB0aW1lIHdoZW4gYW4gaW52YWxpZCBlbmRwb2ludCBhZGRyZXNzIGlzIHNwZWNpZmllZCIpOwotICAgICAgICB9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZWUpIHsKLSAgICAgICAgICAgIC8vIENvbnN0YW50cy5sb2dTdGFjayhlZSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoIkVFLmdldENhdXNlIG11c3QgYmUgV2ViU2VydmljZUV4Y2VwdGlvbiIsCi0gICAgICAgICAgICAgICAgICAgIGVlLmdldENhdXNlKCkgaW5zdGFuY2VvZiBXZWJTZXJ2aWNlRXhjZXB0aW9uKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiV1NFLmdldENhdXNlIG11c3QgYmUgVW5rbm93bkhvc3RFeGNlcHRpb24iLCBjaGVja1N0YWNrKAotICAgICAgICAgICAgICAgICAgICBlZSwgVW5rbm93bkhvc3RFeGNlcHRpb24uY2xhc3MpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEB0ZXN0U3RyYXRlZ3kgSW52b2tlIHRoZSBwcm94eSB3aXRoIGFzeW5jLXBvbGxpbmcgbWV0aG9kLCB0aGUgcHJveHkgaXMKLSAgICAgKiAgICAgICAgICAgICAgIGNvbmZpZ3VyZWQgYWdhaW5zdCBhbiBlbmRwb2ludCB3aGljaCBkb2VzIG5vdCBleGlzdCAodGhpcwotICAgICAqICAgICAgICAgICAgICAgaXMgYSA0MDQtTm90IEZvdW5kIGNhc2UpLiBFeHBlY3RlZCB0byB0aHJvdyBhIEVFL1dTRQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RBc3luY1BvbGxpbmdfYXN5bmNNRVBfNDA0Tm90Rm91bmQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICBBc3luY1BvcnQgcG9ydCA9IGdldFBvcnQoKTsKLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByYyA9ICgoQmluZGluZ1Byb3ZpZGVyKSBwb3J0KS5nZXRSZXF1ZXN0Q29udGV4dCgpOwotICAgICAgICByYy5wdXQoQmluZGluZ1Byb3ZpZGVyLkVORFBPSU5UX0FERFJFU1NfUFJPUEVSVFksIENPTk5FQ1RfNDA0X0VORFBPSU5UKTsKLSAgICAgICAgUmVzcG9uc2U8VGhyb3dFeGNlcHRpb25SZXNwb25zZT4gcmVzcCA9IHBvcnQKLSAgICAgICAgICAgICAgICAudGhyb3dFeGNlcHRpb25Bc3luYyhFeGNlcHRpb25UeXBlRW51bS5XU0UpOwotCi0gICAgICAgIEFzeW5jQ2xpZW50LndhaXRCbG9ja2luZyhyZXNwKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJlc3AuZ2V0KCk7Ci0KLSAgICAgICAgICAgIGZhaWwoIkV4ZWN1dGlvbkV4Y2VwdGlvbiBleHBlY3RlZCBhdCBpbnZva2UgdGltZSB3aGVuIGFuIGludmFsaWQgZW5kcG9pbnQgYWRkcmVzcyBpcyBzcGVjaWZpZWQiKTsKLSAgICAgICAgfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGVlKSB7Ci0gICAgICAgICAgICAvLyBDb25zdGFudHMubG9nU3RhY2soZWUpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKCJFRS5nZXRDYXVzZSBtdXN0IGJlIFdlYlNlcnZpY2VFeGNlcHRpb24iLAotICAgICAgICAgICAgICAgICAgICBlZS5nZXRDYXVzZSgpIGluc3RhbmNlb2YgV2ViU2VydmljZUV4Y2VwdGlvbik7Ci0KLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBUT0RPOiBSRVZJRVcuIE9yaWdpbmFsIHRlc3Qgd2FzIHdyaXR0ZW4gZXhwZWN0aW5nIGEgNDA0IGZyb20gdGhlCi0gICAgICAgICAgICAgKiBiYWQgVVJMIHNldCBvbiB0aGUgcmVxdWVzdGNvbnRleHQuIEhvd2V2ZXIsIHRoaXMgdGVzdCBhY3R1YWxseQotICAgICAgICAgICAgICogZG9lcyBtYWtlIGl0IHRvIHRoZSBlbmRwb2ludCwgYW5kIHJldHVybnMgdGhlIGV4Y2VwdGlvbiBzcGVjaWZpZWQKLSAgICAgICAgICAgICAqIGluIHRoZSBjYWxsIHRvIHBvcnQudGhyb3dFeGNlcHRpb25Bc3luYyhFeGNlcHRpb25UeXBlRW51bS5XU0UpCi0gICAgICAgICAgICAgKiBhYm92ZS4uLnNvIHRoZSBhc3NlcnQgaXMgY29tbWVudGVkIHVudGlsIHdlIGNhbiByZXZpZXcgaXQuIEFsc28sCi0gICAgICAgICAgICAgKiBkaWZmZXJlbnQgc2VydmVycyBtYXkgYmVoYXZlIGRpZmZlcmVudGx5LCBkZXBlbmRpbmcgb24gaG93IHRoZXkKLSAgICAgICAgICAgICAqIHdhbnQgdG8gcGFyc2UgdGhlIGluY29taW5nIHJlcXVlc3QgVVJMLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICAvLyBhc3NlcnRUcnVlKCJXU0UuZ2V0Q2F1c2UgbXVzdCBiZSA0MDQiLCBjaGVja1N0YWNrKGVlLAotICAgICAgICAgICAgLy8gamF2YS5uZXQuQ29ubmVjdEV4Y2VwdGlvbi5jbGFzcykpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHRlc3RTdHJhdGVneSBJbnZva2UgdGhlIHByb3h5IHdpdGggYXN5bmMtcG9sbGluZyBtZXRob2QsIHRoZSBlbmRwb2ludAotICAgICAqICAgICAgICAgICAgICAgd2lsbCB0aHJvdyBhIFdTRSB3aGljaCBzaG91bGQgcmVzdWx0IGluIGEKLSAgICAgKiAgICAgICAgICAgICAgIEVFL1NPQVBGYXVsdEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RBc3luY1BvbGxpbmdfYXN5bmNNRVBfV2ViU2VydmljZUV4Y2VwdGlvbigpCi0gICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICBBc3luY1BvcnQgcG9ydCA9IGdldFBvcnQoKTsKLSAgICAgICAgUmVzcG9uc2U8VGhyb3dFeGNlcHRpb25SZXNwb25zZT4gcmVzcCA9IHBvcnQKLSAgICAgICAgICAgICAgICAudGhyb3dFeGNlcHRpb25Bc3luYyhFeGNlcHRpb25UeXBlRW51bS5XU0UpOwotCi0gICAgICAgIEFzeW5jQ2xpZW50LndhaXRCbG9ja2luZyhyZXNwKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJlc3AuZ2V0KCk7Ci0gICAgICAgICAgICBmYWlsKCJFeGVjdXRpb25FeGNlcHRpb24gZXhwZWN0ZWQgYXQgUmVzcG9uc2UuZ2V0IHdoZW4gZWRucG9pbnQgdGhyb3dzIGFuIGV4Y2VwdGlvbiIpOwotICAgICAgICB9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZWUpIHsKLSAgICAgICAgICAgIC8vIENvbnN0YW50cy5sb2dTdGFjayhlZSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoCi0gICAgICAgICAgICAgICAgICAgICJFeGVjdXRpb25FeGNlcHRpb24uZ2V0Q2F1c2Ugc2hvdWxkIGJlIGFuIGluc3RhbmNlIG9mIFNPQVBGYXVsdEV4Y2VwdGlvbiIsCi0gICAgICAgICAgICAgICAgICAgIGVlLmdldENhdXNlKCkgaW5zdGFuY2VvZiBTT0FQRmF1bHRFeGNlcHRpb24pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHRlc3RTdHJhdGVneSBJbnZva2UgdGhlIHByb3h5IHdpdGggYXN5bmMtcG9sbGluZyBtZXRob2QsIHRoZSBlbmRwb2ludAotICAgICAqICAgICAgICAgICAgICAgd2lsbCB0aHJvdyBhIHdzZGw6ZmF1bHQgd2hpY2ggc2hvdWxkIHJlc3VsdCBpbiBhCi0gICAgICogICAgICAgICAgICAgICBFRS9TaW1wbGVGYXVsdAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RBc3luY1BvbGxpbmdfYXN5bmNNRVBfV3NkbEZhdWx0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgQXN5bmNQb3J0IHBvcnQgPSBnZXRQb3J0KCk7Ci0gICAgICAgIFJlc3BvbnNlPFRocm93RXhjZXB0aW9uUmVzcG9uc2U+IHJlc3AgPSBwb3J0Ci0gICAgICAgICAgICAgICAgLnRocm93RXhjZXB0aW9uQXN5bmMoRXhjZXB0aW9uVHlwZUVudW0uV1NETF9GQVVMVCk7Ci0KLSAgICAgICAgQXN5bmNDbGllbnQud2FpdEJsb2NraW5nKHJlc3ApOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmVzcC5nZXQoKTsKLSAgICAgICAgICAgIGZhaWwoIkV4ZWN1dGlvbkV4Y2VwdGlvbiBleHBlY3RlZCBhdCBSZXNwb25zZS5nZXQgd2hlbiBlZG5wb2ludCB0aHJvd3MgYW4gZXhjZXB0aW9uIik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlZSkgewotICAgICAgICAgICAgLy8gQ29uc3RhbnRzLmxvZ1N0YWNrKGVlKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgKLSAgICAgICAgICAgICAgICAgICAgIkV4ZWN1dGlvbkV4Y2VwdGlvbi5nZXRDYXVzZSBzaG91bGQgYmUgYW4gaW5zdGFuY2Ugb2YgU2ltcGxlRmF1bHQiLAotICAgICAgICAgICAgICAgICAgICBlZS5nZXRDYXVzZSgpIGluc3RhbmNlb2YgVGhyb3dFeGNlcHRpb25GYXVsdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiogKioqKioqKioqKioqKioqKioqKiogQXN5bmMgQ2FsbGJhY2sgKioqKioqKioqKioqKioqKioqKiAqLwotCi0gICAgLyoqCi0gICAgICogQHRlc3RTdHJhdGVneSBJbnZva2UgdGhlIHByb3h5IHdpdGggYXN5bmMtY2FsbGJhY2sgbWV0aG9kLCB0aGUgcHJveHkgaXMKLSAgICAgKiAgICAgICAgICAgICAgIGNvbmZpZ3VyZWQgYWdhaW5zdCBhbiBlbmRwb2ludCB3aGljaCBkb2VzIG5vdCBleGlzdCAodGhpcwotICAgICAqICAgICAgICAgICAgICAgaXMgYSBzZXJ2ZXIgbm90IGZvdW5kIGNhc2UpLiBFeHBlY3RlZCB0byB0aHJvdyBhCi0gICAgICogICAgICAgICAgICAgICBFRS9XU0UvVW5rbm93bkhvc3RFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXN5bmNDYWxsYmFja19hc3luY01FUF9Vbmtub3duSG9zdCgpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIEFzeW5jUG9ydCBwb3J0ID0gZ2V0UG9ydCgpOwotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHJjID0gKChCaW5kaW5nUHJvdmlkZXIpIHBvcnQpLmdldFJlcXVlc3RDb250ZXh0KCk7Ci0gICAgICAgIHJjLnB1dChCaW5kaW5nUHJvdmlkZXIuRU5EUE9JTlRfQUREUkVTU19QUk9QRVJUWSwKLSAgICAgICAgICAgICAgICBIT1NUX05PVF9GT1VORF9FTkRQT0lOVCk7Ci0KLSAgICAgICAgQ2FsbGJhY2tIYW5kbGVyPFRocm93RXhjZXB0aW9uUmVzcG9uc2U+IGhhbmRsZXIgPSBuZXcgQ2FsbGJhY2tIYW5kbGVyPFRocm93RXhjZXB0aW9uUmVzcG9uc2U+KCk7Ci0gICAgICAgIEZ1dHVyZTw/PiByZXNwID0gcG9ydC50aHJvd0V4Y2VwdGlvbkFzeW5jKEV4Y2VwdGlvblR5cGVFbnVtLldTRSwKLSAgICAgICAgICAgICAgICBoYW5kbGVyKTsKLQotICAgICAgICBBc3luY0NsaWVudC53YWl0QmxvY2tpbmcocmVzcCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBoYW5kbGVyLmdldCgpOwotCi0gICAgICAgICAgICBmYWlsKCJFeGVjdXRpb25FeGNlcHRpb24gZXhwZWN0ZWQgYXQgaW52b2tlIHRpbWUgd2hlbiBhbiBpbnZhbGlkIGVuZHBvaW50IGFkZHJlc3MgaXMgc3BlY2lmaWVkIik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlZSkgewotICAgICAgICAgICAgLy8gQ29uc3RhbnRzLmxvZ1N0YWNrKGVlKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgKLSAgICAgICAgICAgICAgICAgICAgIkV4ZWN1dGlvbkV4Y2VwdGlvbi5nZXRDYXVzZSBzaG91bGQgYmUgYW4gaW5zdGFuY2Ugb2YgV2ViU2VydmljZUV4Y2VwdGlvbiIsCi0gICAgICAgICAgICAgICAgICAgIGVlLmdldENhdXNlKCkgaW5zdGFuY2VvZiBXZWJTZXJ2aWNlRXhjZXB0aW9uKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiV1NFLmdldENhdXNlIG11c3QgYmUgVW5rbm93bkhvc3RFeGNlcHRpb24iLCBjaGVja1N0YWNrKAotICAgICAgICAgICAgICAgICAgICBlZSwgVW5rbm93bkhvc3RFeGNlcHRpb24uY2xhc3MpKTsKLQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHRlc3RTdHJhdGVneSBJbnZva2UgdGhlIHByb3h5IHdpdGggYXN5bmMtY2FsbGJhY2sgbWV0aG9kLCB0aGUgcHJveHkgaXMKLSAgICAgKiAgICAgICAgICAgICAgIGNvbmZpZ3VyZWQgYWdhaW5zdCBhbiBlbmRwb2ludCB3aGljaCBkb2VzIG5vdCBleGlzdCAodGhpcwotICAgICAqICAgICAgICAgICAgICAgaXMgYSA0MDQgTm90IEZvdW5kIGNhc2UpLiBFeHBlY3RlZCB0byB0aHJvdyBhCi0gICAgICogICAgICAgICAgICAgICBFRS9XU0UvVW5rbm93bkhvc3RFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXN5bmNDYWxsYmFja19hc3luY01FUF80MDROb3RGb3VuZCgpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIEFzeW5jUG9ydCBwb3J0ID0gZ2V0UG9ydCgpOwotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHJjID0gKChCaW5kaW5nUHJvdmlkZXIpIHBvcnQpLmdldFJlcXVlc3RDb250ZXh0KCk7Ci0gICAgICAgIHJjLnB1dChCaW5kaW5nUHJvdmlkZXIuRU5EUE9JTlRfQUREUkVTU19QUk9QRVJUWSwgQ09OTkVDVF80MDRfRU5EUE9JTlQpOwotCi0gICAgICAgIENhbGxiYWNrSGFuZGxlcjxUaHJvd0V4Y2VwdGlvblJlc3BvbnNlPiBoYW5kbGVyID0gbmV3IENhbGxiYWNrSGFuZGxlcjxUaHJvd0V4Y2VwdGlvblJlc3BvbnNlPigpOwotICAgICAgICBGdXR1cmU8Pz4gcmVzcCA9IHBvcnQudGhyb3dFeGNlcHRpb25Bc3luYyhFeGNlcHRpb25UeXBlRW51bS5XU0UsCi0gICAgICAgICAgICAgICAgaGFuZGxlcik7Ci0KLSAgICAgICAgQXN5bmNDbGllbnQud2FpdEJsb2NraW5nKHJlc3ApOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaGFuZGxlci5nZXQoKTsKLQotICAgICAgICAgICAgZmFpbCgiRXhlY3V0aW9uRXhjZXB0aW9uIGV4cGVjdGVkIGF0IFJlc3BvbnNlLmdldCB3aGVuIGVkbnBvaW50IHRocm93cyBhbiBleGNlcHRpb24iKTsKLSAgICAgICAgfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGVlKSB7Ci0gICAgICAgICAgICAvLyBDb25zdGFudHMubG9nU3RhY2soZWUpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKAotICAgICAgICAgICAgICAgICAgICAiRXhlY3V0aW9uRXhjZXB0aW9uLmdldENhdXNlIHNob3VsZCBiZSBhbiBpbnN0YW5jZSBvZiBXZWJTZXJ2aWNlRXhjZXB0aW9uIiwKLSAgICAgICAgICAgICAgICAgICAgZWUuZ2V0Q2F1c2UoKSBpbnN0YW5jZW9mIFdlYlNlcnZpY2VFeGNlcHRpb24pOwotCi0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogVE9ETzogUkVWSUVXLiBPcmlnaW5hbCB0ZXN0IHdhcyB3cml0dGVuIGV4cGVjdGluZyBhIDQwNCBmcm9tIHRoZQotICAgICAgICAgICAgICogYmFkIFVSTCBzZXQgb24gdGhlIHJlcXVlc3Rjb250ZXh0LiBIb3dldmVyLCB0aGlzIHRlc3QgYWN0dWFsbHkKLSAgICAgICAgICAgICAqIGRvZXMgbWFrZSBpdCB0byB0aGUgZW5kcG9pbnQsIGFuZCByZXR1cm5zIHRoZSBleGNlcHRpb24gc3BlY2lmaWVkCi0gICAgICAgICAgICAgKiBpbiB0aGUgY2FsbCB0byBwb3J0LnRocm93RXhjZXB0aW9uQXN5bmMoRXhjZXB0aW9uVHlwZUVudW0uV1NFKQotICAgICAgICAgICAgICogYWJvdmUuLi5zbyB0aGUgYXNzZXJ0IGlzIGNvbW1lbnRlZCB1bnRpbCB3ZSBjYW4gcmV2aWV3IGl0LiBBbHNvLAotICAgICAgICAgICAgICogZGlmZmVyZW50IHNlcnZlcnMgbWF5IGJlaGF2ZSBkaWZmZXJlbnRseSwgZGVwZW5kaW5nIG9uIGhvdyB0aGV5Ci0gICAgICAgICAgICAgKiB3YW50IHRvIHBhcnNlIHRoZSBpbmNvbWluZyByZXF1ZXN0IFVSTC4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgLy8gYXNzZXJ0VHJ1ZSgiV1NFLmdldENhdXNlIHNob3VsZCBiZSBhbiBpbnN0YW5jZSBvZgotICAgICAgICAgICAgLy8gQ29ubmVjdEV4Y2VwdGlvbiIsIGNoZWNrU3RhY2soZWUsCi0gICAgICAgICAgICAvLyBqYXZhLm5pby5jaGFubmVscy5VbnJlc29sdmVkQWRkcmVzc0V4Y2VwdGlvbi5jbGFzcykpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHRlc3RTdHJhdGVneSBJbnZva2UgdGhlIHByb3h5IHdpdGggYXN5bmMtY2FsbGJhY2sgbWV0aG9kLCB0aGUgcHJveHkKLSAgICAgKiAgICAgICAgICAgICAgIHRocm93cyBhIGdlbmVyaWMgV2ViU2VydmljZUV4Y2VwdGlvbi4gSSB0aGluayB3ZSBtYXkgaGF2ZQotICAgICAqICAgICAgICAgICAgICAgdGhlIHJlY29yZCBmb3IgbG9uZ2VzdCBtZXRob2QgbmFtZSBpbiBBcGFjaGUgaGVyZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXN5bmNDYWxsYmFja19hc3luY01FUF9XZWJTZXJ2aWNlRXhjZXB0aW9uKCkKLSAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIEFzeW5jUG9ydCBwb3J0ID0gZ2V0UG9ydCgpOwotCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcmMgPSAoKEJpbmRpbmdQcm92aWRlcikgcG9ydCkuZ2V0UmVxdWVzdENvbnRleHQoKTsKLSAgICAgICAgcmMucHV0KEJpbmRpbmdQcm92aWRlci5FTkRQT0lOVF9BRERSRVNTX1BST1BFUlRZLAotICAgICAgICAgICAgICAgIERPQ0xJVFdSX0FTWU5DX0VORFBPSU5UKTsKLSAgICAgICAgcmMucHV0KEFkZHJlc3NpbmdDb25zdGFudHMuV1NBX1JFUExZX1RPLCAiYmxhcmciKTsKLQotICAgICAgICBDYWxsYmFja0hhbmRsZXI8VGhyb3dFeGNlcHRpb25SZXNwb25zZT4gaGFuZGxlciA9IG5ldyBDYWxsYmFja0hhbmRsZXI8VGhyb3dFeGNlcHRpb25SZXNwb25zZT4oKTsKLSAgICAgICAgRnV0dXJlPD8+IHJlc3AgPSBwb3J0LnRocm93RXhjZXB0aW9uQXN5bmMoRXhjZXB0aW9uVHlwZUVudW0uV1NFLAotICAgICAgICAgICAgICAgIGhhbmRsZXIpOwotCi0gICAgICAgIEFzeW5jQ2xpZW50LndhaXRCbG9ja2luZyhyZXNwKTsKLSAgICAgICAgRXhjZXB0aW9uIGUgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaGFuZGxlci5nZXQoKTsKLQotICAgICAgICAgICAgZmFpbCgiRXhlY3V0aW9uRXhjZXB0aW9uIGV4cGVjdGVkIGF0IFJlc3BvbnNlLmdldCB3aGVuIGVkbnBvaW50IHRocm93cyBhbiBleGNlcHRpb24iKTsKLSAgICAgICAgfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGVlKSB7Ci0gICAgICAgICAgICBlID0gZWU7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChlKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgKLSAgICAgICAgICAgICAgICAiRXhlY3V0aW9uRXhjZXB0aW9uLmdldENhdXNlIHNob3VsZCBiZSBhbiBpbnN0YW5jZSBvZiBXZWJTZXJ2aWNlRXhjZXB0aW9uIiwKLSAgICAgICAgICAgICAgICBlLmdldENhdXNlKCkgaW5zdGFuY2VvZiBTT0FQRmF1bHRFeGNlcHRpb24pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEB0ZXN0U3RyYXRlZ3kgSW52b2tlIHRoZSBwcm94eSB3aXRoIGFzeW5jLWNhbGxiYWNrIG1ldGhvZCwgdGhlIHByb3h5Ci0gICAgICogICAgICAgICAgICAgICB0aHJvd3MgYSBnZW5lcmljIFdlYlNlcnZpY2VFeGNlcHRpb24uIEkgdGhpbmsgd2UgbWF5IGhhdmUKLSAgICAgKiAgICAgICAgICAgICAgIHRoZSByZWNvcmQgZm9yIGxvbmdlc3QgbWV0aG9kIG5hbWUgaW4gQXBhY2hlIGhlcmUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEFzeW5jQ2FsbGJhY2tfYXN5bmNNRVBfYXN5bmNXaXJlX0FkZHJlc3NpbmdfV2ViU2VydmljZUV4Y2VwdGlvbigpCi0gICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc2V0dXBBZGRyZXNzaW5nQW5kTGlzdGVuZXIoKTsKLSAgICAgICAgQXN5bmNQb3J0IHBvcnQgPSBnZXRQb3J0KG5ldyBBZGRyZXNzaW5nRmVhdHVyZSgpKTsKLQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHJjID0gKChCaW5kaW5nUHJvdmlkZXIpIHBvcnQpLmdldFJlcXVlc3RDb250ZXh0KCk7Ci0gICAgICAgIHJjLnB1dChCaW5kaW5nUHJvdmlkZXIuRU5EUE9JTlRfQUREUkVTU19QUk9QRVJUWSwKLSAgICAgICAgICAgICAgICBET0NMSVRXUl9BU1lOQ19FTkRQT0lOVCk7Ci0gICAgICAgIC8vcmMucHV0KEFkZHJlc3NpbmdDb25zdGFudHMuV1NBX1JFUExZX1RPLCBBZGRyZXNzaW5nQ29uc3RhbnRzLkZpbmFsLldTQV9BTk9OWU1PVVNfVVJMKTsKLSAgICAgICAgcmMucHV0KCJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnVzZS5hc3luYy5tZXAiLCBCb29sZWFuLlRSVUUpOwotCi0gICAgICAgIENhbGxiYWNrSGFuZGxlcjxUaHJvd0V4Y2VwdGlvblJlc3BvbnNlPiBoYW5kbGVyID0gbmV3IENhbGxiYWNrSGFuZGxlcjxUaHJvd0V4Y2VwdGlvblJlc3BvbnNlPigpOwotICAgICAgICBGdXR1cmU8Pz4gcmVzcCA9IHBvcnQudGhyb3dFeGNlcHRpb25Bc3luYyhFeGNlcHRpb25UeXBlRW51bS5XU0UsCi0gICAgICAgICAgICAgICAgaGFuZGxlcik7Ci0KLSAgICAgICAgQXN5bmNDbGllbnQud2FpdEJsb2NraW5nKHJlc3ApOwotICAgICAgICBFeGNlcHRpb24gZSA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBoYW5kbGVyLmdldCgpOwotCi0gICAgICAgICAgICBmYWlsKCJFeGVjdXRpb25FeGNlcHRpb24gZXhwZWN0ZWQgYXQgUmVzcG9uc2UuZ2V0IHdoZW4gZWRucG9pbnQgdGhyb3dzIGFuIGV4Y2VwdGlvbiIpOwotICAgICAgICB9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZWUpIHsKLSAgICAgICAgICAgIGUgPSBlZTsKLSAgICAgICAgfQotCi0gICAgICAgIGFzc2VydE5vdE51bGwoZSk7Ci0gICAgICAgIGFzc2VydFRydWUoCi0gICAgICAgICAgICAgICAgIkV4ZWN1dGlvbkV4Y2VwdGlvbi5nZXRDYXVzZSBzaG91bGQgYmUgYW4gaW5zdGFuY2Ugb2YgV2ViU2VydmljZUV4Y2VwdGlvbiIsCi0gICAgICAgICAgICAgICAgZS5nZXRDYXVzZSgpIGluc3RhbmNlb2YgU09BUEZhdWx0RXhjZXB0aW9uKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAdGVzdFN0cmF0ZWd5IEludm9rZSB0aGUgcHJveHkgd2l0aCBhc3luYy1jYWxsYmFjayBtZXRob2QsIHRoZSBlbmRwb2ludAotICAgICAqICAgICAgICAgICAgICAgd2lsbCB0aHJvdyBhIHdzZGw6ZmF1bHQgd2hpY2ggc2hvdWxkIHJlc3VsdCBpbiBhCi0gICAgICogICAgICAgICAgICAgICBFRS9TaW1wbGVGYXVsdAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RBc3luY0NhbGxiYWNrX2FzeW5jTUVQX1dzZGxGYXVsdCgpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIEFzeW5jUG9ydCBwb3J0ID0gZ2V0UG9ydCgpOwotICAgICAgICBDYWxsYmFja0hhbmRsZXI8VGhyb3dFeGNlcHRpb25SZXNwb25zZT4gaGFuZGxlciA9IG5ldyBDYWxsYmFja0hhbmRsZXI8VGhyb3dFeGNlcHRpb25SZXNwb25zZT4oKTsKLSAgICAgICAgRnV0dXJlPD8+IHJlc3AgPSBwb3J0LnRocm93RXhjZXB0aW9uQXN5bmMoRXhjZXB0aW9uVHlwZUVudW0uV1NETF9GQVVMVCwKLSAgICAgICAgICAgICAgICBoYW5kbGVyKTsKLQotICAgICAgICBBc3luY0NsaWVudC53YWl0QmxvY2tpbmcocmVzcCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGhhbmRsZXIuZ2V0KCk7Ci0KLSAgICAgICAgICAgIGZhaWwoIkV4ZWN1dGlvbkV4Y2VwdGlvbiBleHBlY3RlZCBhdCBSZXNwb25zZS5nZXQgd2hlbiBlZG5wb2ludCB0aHJvd3MgYW4gZXhjZXB0aW9uIik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlZSkgewotICAgICAgICAgICAgLy9Db25zdGFudHMubG9nU3RhY2soZWUpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKAotICAgICAgICAgICAgICAgICAgICAiRXhlY3V0aW9uRXhjZXB0aW9uLmdldENhdXNlIHNob3VsZCBiZSBhbiBpbnN0YW5jZSBvZiBTaW1wbGVGYXVsdCIsCi0gICAgICAgICAgICAgICAgICAgIGVlLmdldENhdXNlKCkgaW5zdGFuY2VvZiBUaHJvd0V4Y2VwdGlvbkZhdWx0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gY2hlY2tTdGFjayhUaHJvd2FibGUgdCwgQ2xhc3MgZmluZCkgewotICAgICAgICBUaHJvd2FibGUgY3VyID0gdDsKLSAgICAgICAgYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotICAgICAgICBkbyB7Ci0gICAgICAgICAgICBmb3VuZCA9IGN1ci5nZXRDbGFzcygpLmlzQXNzaWduYWJsZUZyb20oZmluZCk7Ci0gICAgICAgICAgICBjdXIgPSBjdXIuZ2V0Q2F1c2UoKTsKLSAgICAgICAgfSB3aGlsZSAoIWZvdW5kICYmIGN1ciAhPSBudWxsKTsKLQotICAgICAgICByZXR1cm4gZm91bmQ7Ci0gICAgfQotICAgIAotICAgIAotICAgIC8qKgotICAgICAqIFNldHVwIHRvIHVzZSBhZGRyZXNzaW5nIGFuZCB0byBzdGFydCBhIGxpc3RlbmVyIHRvIHJlY2VpdmUgaW5ib3VuZCBhc3luYyByZXNwb25zZXMKLSAgICAgKiBmcm9tIHRoZSBzZXJ2aWNlLXByb3ZpZGVyLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAgICovCi0gICAgc3luY2hyb25pemVkIHByaXZhdGUgdm9pZCBzZXR1cEFkZHJlc3NpbmdBbmRMaXN0ZW5lcigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIWxpc3RlbmVyQWxyZWFkeVNldHVwKSB7Ci0gICAgICAgICAgICBsaXN0ZW5lckFscmVhZHlTZXR1cCA9IHRydWU7Ci0gICAgICAgICAgICAvLyB3ZSB3YW50IHRvIHVzZSBhZGRyZXNzaW5nIG9uIHRoZSBjbGllbnQgc2lkZQotICAgICAgICAgICAgU3RyaW5nIHJlcG9wYXRoID0gU3lzdGVtLmdldFByb3BlcnR5KCJiYXNlZGlyIiwgIi4iKSArICIvIgotICAgICAgICAgICAgICAgICAgICArIFN5c3RlbS5nZXRQcm9wZXJ0eSgiYnVpbGQucmVwb3NpdG9yeSIsICJ0YXJnZXQvY2xpZW50LXJlcG8iKTsKLSAgICAgICAgICAgIFN0cmluZyBheGlzMnhtbHBhdGggPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImJhc2VkaXIiLCAiLiIpCi0gICAgICAgICAgICAgICAgICAgICsgIi90ZXN0LXJlc291cmNlcy9heGlzMl9hZGRyZXNzaW5nLnhtbCI7Ci0gICAgICAgICAgICBGaWxlU3lzdGVtQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvciA9IG5ldyBGaWxlU3lzdGVtQ29uZmlndXJhdG9yKAotICAgICAgICAgICAgICAgICAgICByZXBvcGF0aCwgYXhpczJ4bWxwYXRoKTsKLSAgICAgICAgICAgIENsaWVudENvbmZpZ3VyYXRpb25GYWN0b3J5IGZhY3RvcnkgPSBuZXcgQ2xpZW50Q29uZmlndXJhdGlvbkZhY3RvcnkoCi0gICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRvcik7Ci0gICAgICAgICAgICBNZXRhZGF0YUZhY3RvcnlSZWdpc3RyeS5zZXRGYWN0b3J5KENsaWVudENvbmZpZ3VyYXRpb25GYWN0b3J5LmNsYXNzLAotICAgICAgICAgICAgICAgICAgICBmYWN0b3J5KTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9TdHJpbmdMaXN0VGVzdHMuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvU3RyaW5nTGlzdFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiMTUyY2MuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9TdHJpbmdMaXN0VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5UZXN0TG9nZ2VyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmZyYW1ld29yay5BYnN0cmFjdFRlc3RDYXNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5zdHJpbmdsaXN0LnNlaS5TdHJpbmdMaXN0UG9ydFR5cGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLnN0cmluZ2xpc3Quc2VpLlN0cmluZ0xpc3RTZXJ2aWNlOw0KLQ0KLWltcG9ydCBqYXZheC54bWwud3MuQmluZGluZ1Byb3ZpZGVyOw0KLQ0KLQ0KLXB1YmxpYyBjbGFzcyBTdHJpbmdMaXN0VGVzdHMgZXh0ZW5kcyBBYnN0cmFjdFRlc3RDYXNlIHsNCi0gICAgU3RyaW5nIGF4aXNFbmRwb2ludCA9ICJodHRwOi8vbG9jYWxob3N0OjYwNjAvYXhpczIvc2VydmljZXMvU3RyaW5nTGlzdFNlcnZpY2UuU3RyaW5nTGlzdFBvcnRUeXBlSW1wbFBvcnQiOw0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7DQotICAgICAgICByZXR1cm4gZ2V0VGVzdFNldHVwKG5ldyBUZXN0U3VpdGUoU3RyaW5nTGlzdFRlc3RzLmNsYXNzKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFN0cmluZ0xpc3RTY2VuYXJpbygpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJ0ZXN0OiAiICsgZ2V0TmFtZSgpKTsNCi0gICAgICAgIFN0cmluZ0xpc3RTZXJ2aWNlIHNscyA9IG5ldyBTdHJpbmdMaXN0U2VydmljZSgpOw0KLSAgICAgICAgU3RyaW5nTGlzdFBvcnRUeXBlIHBvcnRUeXBlID1zbHMuZ2V0U3RyaW5nTGlzdFBvcnQoKTsNCi0gICAgICAgIEJpbmRpbmdQcm92aWRlciBwID0JKEJpbmRpbmdQcm92aWRlcilwb3J0VHlwZTsNCi0gICAgICAgIHAuZ2V0UmVxdWVzdENvbnRleHQoKS5wdXQoQmluZGluZ1Byb3ZpZGVyLkVORFBPSU5UX0FERFJFU1NfUFJPUEVSVFksIGF4aXNFbmRwb2ludCk7DQotICAgICAgICBTdHJpbmdbXSBzZW5kID0gbmV3IFN0cmluZ1tdeyJTdHJpbmcxIiwiU3RyaW5nMiIsIlN0cmluZzMiLCJTdHJpbmcgU3BhY2UifTsNCi0gICAgICAgIC8vIHNpbmNlIHRoZSBhcnJheSBpcyBzZXJpbGl6ZWQgYXMgeHNkOmxpc3QgdGhlIHN0cmluZyB3aXRoIHNwYWNlIHdpbGwgYmUgY29udmVydGVkDQotICAgICAgICAvLyB0byBhIG5ldyBhcnJheSBlbGVtZW50LiBzbyB3ZSBzZW5kIGFycmF5Lmxlbmd0aCBvZiAzIGJ1dCBnZXQgYmFjayBhcnJheS5sZW5ndGggb2YgNQ0KLSAgICAgICAgU3RyaW5nW10gZXhwZWN0ZWQgPSBuZXcgU3RyaW5nW117IlN0cmluZzEiLCJTdHJpbmcyIiwiU3RyaW5nMyIsIlN0cmluZyIsIlNwYWNlIn07DQotICAgICAgICBTdHJpbmdbXSByZXRTdHJpbmcgPSBwb3J0VHlwZS5zdHJpbmdMaXN0KHNlbmQpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRTdHJpbmcpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgcmV0U3RyaW5nLmxlbmd0aCk7DQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4cGVjdGVkLmxlbmd0aDsgaSsrKSB7DQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkW2ldLCByZXRTdHJpbmdbaV0pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICAvLyBSZXBlYXQgdG8gZW5zdXJlIHZhbGlkaXR5DQotICAgICAgICByZXRTdHJpbmcgPSBwb3J0VHlwZS5zdHJpbmdMaXN0KHNlbmQpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRTdHJpbmcpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgcmV0U3RyaW5nLmxlbmd0aCk7DQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4cGVjdGVkLmxlbmd0aDsgaSsrKSB7DQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkW2ldLCByZXRTdHJpbmdbaV0pOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvV1NHZW5UZXN0cy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9XU0dlblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4NGRkZTguLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9XU0dlblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZTsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuVGVzdExvZ2dlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5mcmFtZXdvcmsuQWJzdHJhY3RUZXN0Q2FzZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUud3NnZW4uY2xpZW50LldTR2VuSW50ZXJmYWNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS53c2dlbi5jbGllbnQuV1NHZW5TZXJ2aWNlOw0KLQ0KLWltcG9ydCBqYXZheC54bWwud3MuQmluZGluZ1Byb3ZpZGVyOw0KLQ0KLXB1YmxpYyBjbGFzcyBXU0dlblRlc3RzIGV4dGVuZHMgQWJzdHJhY3RUZXN0Q2FzZSB7DQotICAgIA0KLSAgICBTdHJpbmcgYXhpc0VuZHBvaW50ID0gImh0dHA6Ly9sb2NhbGhvc3Q6NjA2MC9heGlzMi9zZXJ2aWNlcy9XU0dlblNlcnZpY2UuV1NHZW5Qb3J0IjsNCi0gICAgDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsNCi0gICAgICAgIHJldHVybiBnZXRUZXN0U2V0dXAobmV3IFRlc3RTdWl0ZShXcmFwVGVzdHMuY2xhc3MpKTsNCi0gICAgfQ0KLSAgICAJDQotICAgIA0KLSAgICANCi0gICAgcHVibGljIHZvaWQgdGVzdFdTR2VuKCkgew0KLSAgICAgICAgdHJ5ew0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoInRlc3Q6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIFdTR2VuU2VydmljZSBzZXJ2aWNlID0gbmV3IFdTR2VuU2VydmljZSgpOw0KLSAgICAgICAgICAgIFdTR2VuSW50ZXJmYWNlIHByb3h5ID0gc2VydmljZS5nZXRXU0dlblBvcnQoKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBCaW5kaW5nUHJvdmlkZXIgcCA9IChCaW5kaW5nUHJvdmlkZXIpcHJveHk7DQotICAgICAgICAgICAgcC5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dChCaW5kaW5nUHJvdmlkZXIuRU5EUE9JTlRfQUREUkVTU19QUk9QRVJUWSwgDQotICAgICAgICAgICAgICAgICAgICBheGlzRW5kcG9pbnQpOyAgDQotICAgICAgICAgICAgU3RyaW5nIG91dFN0cmluZyA9ICJ0aGlzIGlzIGEgd29uZGVyZnVsIHRlc3QiOw0KLSAgICAgICAgICAgIFN0cmluZyBzID0gcHJveHkuZWNob1N0cmluZyhvdXRTdHJpbmcpOw0KLQ0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJTdHJpbmcgcyA9ICIgKyBzKTsNCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMob3V0U3RyaW5nLCBzKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBSZXBlYXQgdG8gZW5zdXJlIHZhbGlkaXR5DQotICAgICAgICAgICAgcyA9IHByb3h5LmVjaG9TdHJpbmcob3V0U3RyaW5nKTsNCi0NCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiU3RyaW5nIHMgPSAiICsgcyk7DQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG91dFN0cmluZywgcyk7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgICAgIGZhaWwoIldlIHNob3VsZCBub3QgZ2V0IGFuIGV4Y2VwdGlvbiwgYnV0IHdlIGRpZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvV3JhcFRlc3RzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL1dyYXBUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjk4OGM2Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvV3JhcFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ODUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLS8qKg0KLSAqIA0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGU7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFzb3VyY2UuamF4Yi5KQVhCQ3VzdG9tQnVpbGRlck1vbml0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuVGVzdExvZ2dlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5mcmFtZXdvcmsuQWJzdHJhY3RUZXN0Q2FzZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUud3JhcC5zZWkuRG9jTGl0V3JhcDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUud3JhcC5zZWkuRG9jTGl0V3JhcFNlcnZpY2U7DQotaW1wb3J0IG9yZy50ZXN0LnNhbXBsZS53cmFwLkhlYWRlcjsNCi1pbXBvcnQgb3JnLnRlc3Quc2FtcGxlLndyYXAuSGVhZGVyUGFydDA7DQotaW1wb3J0IG9yZy50ZXN0LnNhbXBsZS53cmFwLkhlYWRlclBhcnQxOw0KLWltcG9ydCBvcmcudGVzdC5zYW1wbGUud3JhcC5IZWFkZXJSZXNwb25zZTsNCi0NCi1pbXBvcnQgamF2YXgueG1sLndzLkJpbmRpbmdQcm92aWRlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLkhvbGRlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247DQotDQotcHVibGljIGNsYXNzIFdyYXBUZXN0cyBleHRlbmRzIEFic3RyYWN0VGVzdENhc2Ugew0KLQ0KLSAgICBTdHJpbmcgYXhpc0VuZHBvaW50ID0gImh0dHA6Ly9sb2NhbGhvc3Q6NjA2MC9heGlzMi9zZXJ2aWNlcy9Eb2NMaXRXcmFwU2VydmljZS5Eb2NMaXRXcmFwSW1wbFBvcnQiOw0KLQkNCi0gICAgLy8gU3RyaW5nIGNvbnRhaW5pbmcgc29tZSBjaGFyYWN0ZXJzIHRoYXQgcmVxdWlyZSBYTUwgZW5jb2RpbmcNCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFhNTENIQVJTID0gIjw8PDM+Pj4zPj4+MyI7DQotICAgIA0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7DQotICAgICAgICByZXR1cm4gZ2V0VGVzdFNldHVwKG5ldyBUZXN0U3VpdGUoV3JhcFRlc3RzLmNsYXNzKSk7DQotICAgIH0NCi0NCi0gICAgICAgIC8qKg0KLSAgICAgICAgICogR2V0IHRoZURvY0xpdFdyYXAgUHJ4b3kNCi0gICAgICAgICAqIEByZXR1cm4gRG9jTGl0V3JhcFByb3h5DQotICAgICAgICAgKi8NCi0gICAgICAgIHByaXZhdGUgRG9jTGl0V3JhcCBnZXRQcm94eSgpIHsNCi0gICAgICAgICAgICBEb2NMaXRXcmFwU2VydmljZSBzZXJ2aWNlID0gbmV3IERvY0xpdFdyYXBTZXJ2aWNlKCk7DQotICAgICAgICAgICAgRG9jTGl0V3JhcCBwcm94eSA9IHNlcnZpY2UuZ2V0RG9jTGl0V3JhcFBvcnQoKTsNCi0gICAgICAgICAgICBCaW5kaW5nUHJvdmlkZXIgcCA9IChCaW5kaW5nUHJvdmlkZXIpIHByb3h5Ow0KLSAgICAgICAgICAgIHAuZ2V0UmVxdWVzdENvbnRleHQoKS5wdXQoQmluZGluZ1Byb3ZpZGVyLkVORFBPSU5UX0FERFJFU1NfUFJPUEVSVFksIGF4aXNFbmRwb2ludCk7DQotICAgICAgICAgICAgcmV0dXJuIHByb3h5Ow0KLSAgICAgICAgfQ0KLQkNCi0gICAgICAgIHB1YmxpYyB2b2lkIHRlc3RUd29XYXlTeW5jKCl7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJUZXN0IDogIiArIGdldE5hbWUoKSk7DQotICAgICAgICAgICAgdHJ5ew0KLSAgICAgICAgICAgICAgICBTdHJpbmcgcmVxU3RyaW5nID0gIlRlc3QgdHdvV2F5IFN5bmMiOw0KLSAgICAgICAgICAgICAgICBEb2NMaXRXcmFwIHByb3h5ID0gZ2V0UHJveHkoKTsNCi0NCi0gICAgICAgICAgICAgICAgU3RyaW5nIHJlc3BvbnNlID0gcHJveHkudHdvV2F5KHJlcVN0cmluZyk7DQotICAgICAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJTeW5jIFJlc3BvbnNlID0iICsgcmVzcG9uc2UpOw0KLSAgICAgICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICAgICAgfWNhdGNoKEV4Y2VwdGlvbiBlKXsNCi0gICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgICAgICAgICAgZmFpbCgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyB2b2lkIHRlc3RPbmVXYXlWb2lkV2l0aE5vSW5wdXRQYXJhbXMoKXsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIlRlc3QgOiAiICsgZ2V0TmFtZSgpKTsNCi0gICAgICAgICAgICB0cnl7DQotDQotICAgICAgICAgICAgICAgIERvY0xpdFdyYXBTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgRG9jTGl0V3JhcFNlcnZpY2UoKTsNCi0gICAgICAgICAgICAgICAgRG9jTGl0V3JhcCBwcm94eSA9IGdldFByb3h5KCk7DQotICAgICAgICAgICAgICAgIHByb3h5Lm9uZVdheVZvaWQoKTsNCi0gICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgIC8vIFJlcGVhdCB0byBlbnN1cmUgY29ycmVjdCBiZWhhdmlvcg0KLSAgICAgICAgICAgICAgICBwcm94eS5vbmVXYXlWb2lkKCk7DQotDQotICAgICAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgICAgICB9Y2F0Y2goRXhjZXB0aW9uIGUpew0KLSAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgICAgICAgICBmYWlsKCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIHZvaWQgdGVzdFR3b1dheUhvbGRlcigpew0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiVGVzdCA6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgICAgIHRyeXsNCi0gICAgICAgICAgICAgICAgU3RyaW5nIGhvbGRlclN0cmluZyA9IG5ldyBTdHJpbmcoIlRlc3QgdHdvV2F5IFN5bmMiKTsNCi0gICAgICAgICAgICAgICAgSW50ZWdlciBob2xkZXJJbnRlZ2VyID0gbmV3IEludGVnZXIoMCk7DQotICAgICAgICAgICAgICAgIEhvbGRlcjxTdHJpbmc+IHN0ckhvbGRlciA9IG5ldyBIb2xkZXI8U3RyaW5nPihob2xkZXJTdHJpbmcpOw0KLSAgICAgICAgICAgICAgICBIb2xkZXI8SW50ZWdlcj4gaW50SG9sZGVyID0gbmV3IEhvbGRlcjxJbnRlZ2VyPihob2xkZXJJbnRlZ2VyKTsNCi0gICAgICAgICAgICAgICAgRG9jTGl0V3JhcCBwcm94eSA9IGdldFByb3h5KCk7DQotICAgICAgICAgICAgICAgIHByb3h5LnR3b1dheUhvbGRlcihzdHJIb2xkZXIsIGludEhvbGRlcik7DQotICAgICAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJIb2xkZXIgUmVzcG9uc2UgU3RyaW5nID0iICsgc3RySG9sZGVyLnZhbHVlKTs7DQotICAgICAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJIb2xkZXIgUmVzcG9uc2UgSW50ZWdlciA9IiArIGludEhvbGRlci52YWx1ZSk7DQotICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICAvLyBSZXBlYXQgdG8gZW5zdXJlIGNvcnJlY3QgYmVoYXZpb3INCi0gICAgICAgICAgICAgICAgcHJveHkudHdvV2F5SG9sZGVyKHN0ckhvbGRlciwgaW50SG9sZGVyKTsNCi0gICAgICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIkhvbGRlciBSZXNwb25zZSBTdHJpbmcgPSIgKyBzdHJIb2xkZXIudmFsdWUpOzsNCi0gICAgICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIkhvbGRlciBSZXNwb25zZSBJbnRlZ2VyID0iICsgaW50SG9sZGVyLnZhbHVlKTsNCi0gICAgICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgICAgIH1jYXRjaChFeGNlcHRpb24gZSl7DQotICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAgICAgICAgIGZhaWwoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0VHdvV2F5V2l0aEhlYWRlcnNBbmRIb2xkZXJzKCl7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJUZXN0IDogIiArIGdldE5hbWUoKSk7DQotICAgICAgICAgICAgdHJ5ew0KLSAgICAgICAgICAgICAgICBIZWFkZXIgaGVhZGVyID0gbmV3IEhlYWRlcigpOw0KLSAgICAgICAgICAgICAgICBoZWFkZXIuc2V0T3V0KDApOw0KLSAgICAgICAgICAgICAgICBIZWFkZXJQYXJ0MCBocDA9IG5ldyBIZWFkZXJQYXJ0MCgpOw0KLSAgICAgICAgICAgICAgICBocDAuc2V0SGVhZGVyVHlwZSgiQ2xpZW50IHNldHVwIEhlYWRlciBUeXBlIGZvciBIZWFkZXJQYXJ0MCIpOw0KLSAgICAgICAgICAgICAgICBIZWFkZXJQYXJ0MSBocDEgPSBuZXcgSGVhZGVyUGFydDEoKTsNCi0gICAgICAgICAgICAgICAgaHAxLnNldEhlYWRlclR5cGUoIkNsaWVudCBzZXR1cCBIZWFkZXIgVHlwZSBmb3IgSGVhZGVyUGFydDAiKTsNCi0gICAgICAgICAgICAgICAgSG9sZGVyPEhlYWRlclBhcnQwPiBob2xkZXIgPSBuZXcgSG9sZGVyPEhlYWRlclBhcnQwPihocDApOw0KLSAgICAgICAgICAgICAgICBEb2NMaXRXcmFwIHByb3h5ID0gZ2V0UHJveHkoKTsNCi0gICAgICAgICAgICAgICAgSGVhZGVyUmVzcG9uc2UgaHIgPSBwcm94eS5oZWFkZXIoaGVhZGVyLCBob2xkZXIsIGhwMSk7DQotICAgICAgICAgICAgICAgIGhwMD1ob2xkZXIudmFsdWU7DQotICAgICAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJIb2xkZXIgUmVzcG9uc2UgU3RyaW5nID0iICsgaHAwLmdldEhlYWRlclR5cGUoKSk7DQotICAgICAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJIZWFkZXIgUmVzcG9uc2UgTG9uZyA9IiArIGhyLmdldE91dCgpKTsNCi0gICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgIC8vIFJlcGVhdCB0byBlbnN1cmUgY29ycmVjdCBiZWhhdmlvcg0KLSAgICAgICAgICAgICAgICBociA9IHByb3h5LmhlYWRlcihoZWFkZXIsIGhvbGRlciwgaHAxKTsNCi0gICAgICAgICAgICAgICAgaHAwPWhvbGRlci52YWx1ZTsNCi0gICAgICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIkhvbGRlciBSZXNwb25zZSBTdHJpbmcgPSIgKyBocDAuZ2V0SGVhZGVyVHlwZSgpKTsNCi0gICAgICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIkhlYWRlciBSZXNwb25zZSBMb25nID0iICsgaHIuZ2V0T3V0KCkpOw0KLSAgICAgICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICAgICAgfWNhdGNoKEV4Y2VwdGlvbiBlKXsNCi0gICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgICAgICAgICAgZmFpbCgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyB2b2lkIHRlc3RUd29XYXlIb2xkZXJBc3luYygpew0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiVGVzdCA6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgICAgIHRyeXsNCi0gICAgICAgICAgICAgICAgU3RyaW5nIGhvbGRlclN0cmluZyA9IG5ldyBTdHJpbmcoIlRlc3QgdHdvV2F5IFN5bmMiKTsNCi0gICAgICAgICAgICAgICAgSW50ZWdlciBob2xkZXJJbnRlZ2VyID0gbmV3IEludGVnZXIoMCk7DQotICAgICAgICAgICAgICAgIEhvbGRlcjxTdHJpbmc+IHN0ckhvbGRlciA9IG5ldyBIb2xkZXI8U3RyaW5nPihob2xkZXJTdHJpbmcpOw0KLSAgICAgICAgICAgICAgICBIb2xkZXI8SW50ZWdlcj4gaW50SG9sZGVyID0gbmV3IEhvbGRlcjxJbnRlZ2VyPihob2xkZXJJbnRlZ2VyKTsNCi0gICAgICAgICAgICAgICAgRG9jTGl0V3JhcCBwcm94eSA9IGdldFByb3h5KCk7DQotICAgICAgICAgICAgICAgIHByb3h5LnR3b1dheUhvbGRlcihzdHJIb2xkZXIsIGludEhvbGRlcik7DQotICAgICAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJIb2xkZXIgUmVzcG9uc2UgU3RyaW5nID0iICsgc3RySG9sZGVyLnZhbHVlKTs7DQotICAgICAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJIb2xkZXIgUmVzcG9uc2UgSW50ZWdlciA9IiArIGludEhvbGRlci52YWx1ZSk7DQotICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICAvLyBSZXBlYXQgDQotICAgICAgICAgICAgICAgIHByb3h5LnR3b1dheUhvbGRlcihzdHJIb2xkZXIsIGludEhvbGRlcik7DQotICAgICAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJIb2xkZXIgUmVzcG9uc2UgU3RyaW5nID0iICsgc3RySG9sZGVyLnZhbHVlKTs7DQotICAgICAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJIb2xkZXIgUmVzcG9uc2UgSW50ZWdlciA9IiArIGludEhvbGRlci52YWx1ZSk7DQotICAgICAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgICAgICB9Y2F0Y2goRXhjZXB0aW9uIGUpew0KLSAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgICAgICAgICBmYWlsKCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLyoqDQotICAgICAgICAgKiBUaGlzIGlzIGEgdGVzdCBvZiBhIGRvYy9saXQgZWNobyB0ZXN0DQotICAgICAgICAgKi8NCi0gICAgICAgIHB1YmxpYyB2b2lkIHRlc3RFY2hvU3RyaW5nKCkgew0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiVGVzdCA6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgICAgIHRyeXsNCi0gICAgICAgICAgICAgICAgU3RyaW5nIHJlcXVlc3QgPSAiaGVsbG8gd29ybGQiOw0KLQ0KLSAgICAgICAgICAgICAgICBEb2NMaXRXcmFwIHByb3h5ID0gZ2V0UHJveHkoKTsNCi0gICAgICAgICAgICAgICAgU3RyaW5nIHJlc3BvbnNlID0gcHJveHkuZWNob1N0cmluZ1dTR0VOMShyZXF1ZXN0KTsNCi0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZS5lcXVhbHMocmVxdWVzdCkpOw0KLSAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgLy8gUmVwZWF0DQotICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gcHJveHkuZWNob1N0cmluZ1dTR0VOMShyZXF1ZXN0KTsNCi0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZS5lcXVhbHMocmVxdWVzdCkpOw0KLSAgICAgICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICAgICAgfWNhdGNoKEV4Y2VwdGlvbiBlKXsNCi0gICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgICAgICAgICAgZmFpbCgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgLyoqDQotICAgICAgICAgKiBUaGlzIGlzIGEgdGVzdCBvZiBhIGRvYy9saXQgbWV0aG9kIHRoYXQgcGFzc2VzIHRoZSANCi0gICAgICAgICAqIHJlcXVlc3QgaW4gYSBoZWFkZXIuICBUaGlzIGNhbiBvbmx5IGJlIHJlcHJvZHVjZWQgdmlhDQotICAgICAgICAgKiBhbm5vdGF0aW9ucyBhbmQgV1NHRU4uICBXU0ltcG9ydCB3aWxsIG5vdCBhbGxvdyB0aGlzLg0KLSAgICAgICAgICovDQotICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0RWNob1N0cmluZ1dTR0VOMSgpIHsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIlRlc3QgOiAiICsgZ2V0TmFtZSgpKTsNCi0gICAgICAgICAgICB0cnl7DQotICAgICAgICAgICAgICAgIFN0cmluZyByZXF1ZXN0ID0gImhlbGxvIHdvcmxkIjsNCi0NCi0gICAgICAgICAgICAgICAgRG9jTGl0V3JhcCBwcm94eSA9IGdldFByb3h5KCk7DQotICAgICAgICAgICAgICAgIFN0cmluZyByZXNwb25zZSA9IHByb3h5LmVjaG9TdHJpbmdXU0dFTjEocmVxdWVzdCk7DQotICAgICAgICAgICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UuZXF1YWxzKHJlcXVlc3QpKTsNCi0gICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgIC8vIFJlcGVhdA0KLSAgICAgICAgICAgICAgICByZXNwb25zZSA9IHByb3h5LmVjaG9TdHJpbmdXU0dFTjEocmVxdWVzdCk7DQotICAgICAgICAgICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UuZXF1YWxzKHJlcXVlc3QpKTsNCi0gICAgICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgICAgIH1jYXRjaChFeGNlcHRpb24gZSl7DQotICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAgICAgICAgIGZhaWwoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICAvKioNCi0gICAgICAgICAqIFRoaXMgaXMgYSB0ZXN0IG9mIGEgZG9jL2xpdCBtZXRob2QgdGhhdCBwYXNzZXMgdGhlIA0KLSAgICAgICAgICogcmVzcG9uc2UgaW4gYSBoZWFkZXIuICBUaGlzIGNhbiBvbmx5IGJlIHJlcHJvZHVjZWQgdmlhDQotICAgICAgICAgKiBhbm5vdGF0aW9ucyBhbmQgV1NHRU4uICBXU0ltcG9ydCB3aWxsIG5vdCBhbGxvdyB0aGlzLg0KLSAgICAgICAgICovDQotDQotICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0RWNob1N0cmluZ1dTR0VOMigpIHsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIlRlc3QgOiAiICsgZ2V0TmFtZSgpKTsNCi0gICAgICAgICAgICB0cnl7DQotICAgICAgICAgICAgICAgIFN0cmluZyByZXF1ZXN0ID0gImhlbGxvIHdvcmxkIDIiOw0KLQ0KLSAgICAgICAgICAgICAgICBEb2NMaXRXcmFwIHByb3h5ID0gZ2V0UHJveHkoKTsNCi0gICAgICAgICAgICAgICAgU3RyaW5nIHJlc3BvbnNlID0gcHJveHkuZWNob1N0cmluZ1dTR0VOMihyZXF1ZXN0KTsNCi0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZS5lcXVhbHMocmVxdWVzdCkpOw0KLSAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgLy8gUmVwZWF0DQotICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gcHJveHkuZWNob1N0cmluZ1dTR0VOMihyZXF1ZXN0KTsNCi0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZS5lcXVhbHMocmVxdWVzdCkpOw0KLSAgICAgICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICAgICAgfWNhdGNoKEV4Y2VwdGlvbiBlKXsNCi0gICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgICAgICAgICAgZmFpbCgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgLyoqDQotICAgICAgICAgKiBUaGlzIGlzIGEgdGVzdCBvZiBhIGRvYy9saXQgZWNobyB0ZXN0IHdpdGggeG1sIGNoYXJzLg0KLSAgICAgICAgICovDQotICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0RWNob1N0cmluZ194bWxjaGFycygpIHsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIlRlc3QgOiAiICsgZ2V0TmFtZSgpKTsNCi0gICAgICAgICAgICB0cnl7DQotICAgICAgICAgICAgICAgIFN0cmluZyByZXF1ZXN0ID0gWE1MQ0hBUlM7DQotDQotICAgICAgICAgICAgICAgIERvY0xpdFdyYXAgcHJveHkgPSBnZXRQcm94eSgpOw0KLSAgICAgICAgICAgICAgICBTdHJpbmcgcmVzcG9uc2UgPSBwcm94eS5lY2hvU3RyaW5nV1NHRU4xKHJlcXVlc3QpOw0KLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlLmVxdWFscyhyZXF1ZXN0KSk7DQotICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICAvLyBSZXBlYXQNCi0gICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBwcm94eS5lY2hvU3RyaW5nV1NHRU4xKHJlcXVlc3QpOw0KLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlLmVxdWFscyhyZXF1ZXN0KSk7DQotICAgICAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgICAgICB9Y2F0Y2goRXhjZXB0aW9uIGUpew0KLSAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgICAgICAgICBmYWlsKCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICAvKioNCi0gICAgICAgICAqIFRoaXMgaXMgYSB0ZXN0IG9mIGEgZG9jL2xpdCBtZXRob2QgdGhhdCBwYXNzZXMgdGhlIA0KLSAgICAgICAgICogcmVxdWVzdCBpbiBhIGhlYWRlci4gIFRoaXMgY2FuIG9ubHkgYmUgcmVwcm9kdWNlZCB2aWENCi0gICAgICAgICAqIGFubm90YXRpb25zIGFuZCBXU0dFTi4gIFdTSW1wb3J0IHdpbGwgbm90IGFsbG93IHRoaXMuDQotICAgICAgICAgKi8NCi0gICAgICAgIHB1YmxpYyB2b2lkIHRlc3RFY2hvU3RyaW5nV1NHRU4xX3htbGNoYXJzKCkgew0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiVGVzdCA6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgICAgIHRyeXsNCi0gICAgICAgICAgICAgICAgU3RyaW5nIHJlcXVlc3QgPSBYTUxDSEFSUzsNCi0NCi0gICAgICAgICAgICAgICAgRG9jTGl0V3JhcCBwcm94eSA9IGdldFByb3h5KCk7DQotICAgICAgICAgICAgICAgIFN0cmluZyByZXNwb25zZSA9IHByb3h5LmVjaG9TdHJpbmdXU0dFTjEocmVxdWVzdCk7DQotICAgICAgICAgICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UuZXF1YWxzKHJlcXVlc3QpKTsNCi0gICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgIC8vIFJlcGVhdA0KLSAgICAgICAgICAgICAgICByZXNwb25zZSA9IHByb3h5LmVjaG9TdHJpbmdXU0dFTjEocmVxdWVzdCk7DQotICAgICAgICAgICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UuZXF1YWxzKHJlcXVlc3QpKTsNCi0gICAgICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgICAgIH1jYXRjaChFeGNlcHRpb24gZSl7DQotICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAgICAgICAgIGZhaWwoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICAvKioNCi0gICAgICAgICAqIFRoaXMgaXMgYSB0ZXN0IG9mIGEgZG9jL2xpdCBtZXRob2QgdGhhdCBwYXNzZXMgdGhlIA0KLSAgICAgICAgICogcmVzcG9uc2UgaW4gYSBoZWFkZXIuICBUaGlzIGNhbiBvbmx5IGJlIHJlcHJvZHVjZWQgdmlhDQotICAgICAgICAgKiBhbm5vdGF0aW9ucyBhbmQgV1NHRU4uICBXU0ltcG9ydCB3aWxsIG5vdCBhbGxvdyB0aGlzLg0KLSAgICAgICAgICovDQotDQotICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0RWNob1N0cmluZ1dTR0VOMl94bWxjaGFycygpIHsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIlRlc3QgOiAiICsgZ2V0TmFtZSgpKTsNCi0gICAgICAgICAgICB0cnl7DQotICAgICAgICAgICAgICAgIFN0cmluZyByZXF1ZXN0ID0gWE1MQ0hBUlM7DQotDQotICAgICAgICAgICAgICAgIERvY0xpdFdyYXAgcHJveHkgPSBnZXRQcm94eSgpOw0KLSAgICAgICAgICAgICAgICBTdHJpbmcgcmVzcG9uc2UgPSBwcm94eS5lY2hvU3RyaW5nV1NHRU4yKHJlcXVlc3QpOw0KLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlLmVxdWFscyhyZXF1ZXN0KSk7DQotICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICAvLyBSZXBlYXQNCi0gICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBwcm94eS5lY2hvU3RyaW5nV1NHRU4yKHJlcXVlc3QpOw0KLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlLmVxdWFscyhyZXF1ZXN0KSk7DQotICAgICAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgICAgICB9Y2F0Y2goRXhjZXB0aW9uIGUpew0KLSAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgICAgICAgICBmYWlsKCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgLyoqDQotICAgICAgICAgKiBUZXN0IHRvIHZhbGlkYXRlIHdoZXRoZXIgYSBKQVhCQ3VzdG9tQnVpbGRlciBpcyBwbHVnZ2VkIGluDQotICAgICAgICAgKiBvbiB0aGUgc2VydmVyLg0KLSAgICAgICAgICovDQotICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0SkFYQkNCX1NlcnZlcjEoKXsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIlRlc3QgIDogIiArIGdldE5hbWUoKSk7DQotICAgICAgICAgICAgdHJ5ew0KLSAgICAgICAgICAgICAgICBTdHJpbmcgcmVxU3RyaW5nID0gIkpBWEJDdXN0b21CdWlsZGVyU2VydmVyMSI7DQotICAgICAgICAgICAgICAgIERvY0xpdFdyYXAgcHJveHkgPSBnZXRQcm94eSgpOw0KLSAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgLy8gU3RhcnQgTW9uaXRvcmluZw0KLSAgICAgICAgICAgICAgICBwcm94eS50d29XYXkoIkpBWEJDdXN0b21CdWlsZGVyTW9uaXRvclN0YXJ0Iik7DQotICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICBTdHJpbmcgcmVzcG9uc2UgPSBwcm94eS50d29XYXkocmVxU3RyaW5nKTsNCi0gICAgICAgICAgICAgICAgLy8gVGhlIHJldHVybmVkIHJlc3BvbnNlIHdpbGwgY29udGFpbiB0aGUgbnVtYmVyIG9mIEpBWEJDdXN0b21CdWlsZGVycw0KLSAgICAgICAgICAgICAgICAvLyBmb3IgdGhlIHNlcnZlciB0aGlzIGNvdWxkIGJlIGFueSBudW1iZXIgMCBvciBncmVhdGVyLg0KLSAgICAgICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiUmVzcG9uc2UgMSA9IiArIHJlc3BvbnNlKTsNCi0gICAgICAgICAgICAgICAgU3RyaW5nIHJlc3BvbnNlMiA9IHByb3h5LnR3b1dheShyZXFTdHJpbmcpOw0KLSAgICAgICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiUmVzcG9uc2UgMiA9IiArIHJlc3BvbnNlMik7DQotICAgICAgICAgICAgICAgIC8vIFRoZSByZXR1cm5lZCByZXNwb25zZSB3aWxsIGNvbnRhaW4gdGhlIG51bWJlciBvZiBKQVhCQ3VzdG9tQnVpbGRlcnMNCi0gICAgICAgICAgICAgICAgLy8gdGhpcyBjb3VsZCBiZSBhbnkgbnVtYmVyIDEgb3IgZ3JlYXRlci4gIFRoZSBhc3N1bXB0aW9uIGlzIHRoYXQNCi0gICAgICAgICAgICAgICAgLy8gdGhlIEpBWEJDdXN0b21CdWlsZGVyIHdpbGwgYmUgaW5zdGFsbGVkIG9uIHRoZSBzZWNvbmQgaW52b2tlDQotICAgICAgICAgICAgICAgIEludGVnZXIgciA9IEludGVnZXIucGFyc2VJbnQocmVzcG9uc2UyKTsNCi0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyLmludFZhbHVlKCkgPj0gMSk7DQotICAgICAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgIC8vIEVuZCBNb25pdG9yaW5nDQotICAgICAgICAgICAgICAgIHByb3h5LnR3b1dheSgiSkFYQkN1c3RvbUJ1aWxkZXJNb25pdG9yRW5kIik7DQotICAgICAgICAgICAgfWNhdGNoKEV4Y2VwdGlvbiBlKXsNCi0gICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgICAgICAgICAgZmFpbCgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgLyoqDQotICAgICAgICAgKiBUZXN0IHRvIHZhbGlkYXRlIHdoZXRoZXIgYSBKQVhCQ3VzdG9tQnVpbGRlciBpcyBwbHVnZ2VkIGluDQotICAgICAgICAgKiBhbmQgdXNlZCBvbiB0aGUgc2VydmVyLg0KLSAgICAgICAgICovDQotICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0SkFYQkNCX1NlcnZlcjIoKXsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIlRlc3QgIDogIiArIGdldE5hbWUoKSk7DQotICAgICAgICAgICAgdHJ5ew0KLSAgICAgICAgICAgICAgICBTdHJpbmcgcmVxU3RyaW5nID0gIkpBWEJDdXN0b21CdWlsZGVyU2VydmVyMiI7DQotICAgICAgICAgICAgICAgIERvY0xpdFdyYXAgcHJveHkgPSBnZXRQcm94eSgpOw0KLSAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgLy8gU3RhcnQgTW9uaXRvcmluZw0KLSAgICAgICAgICAgICAgICBwcm94eS50d29XYXkoIkpBWEJDdXN0b21CdWlsZGVyTW9uaXRvclN0YXJ0Iik7DQotICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICBTdHJpbmcgcmVzcG9uc2UgPSBwcm94eS50d29XYXkocmVxU3RyaW5nKTsNCi0gICAgICAgICAgICAgICAgLy8gVGhlIHJldHVybmVkIHJlc3BvbnNlIHdpbGwgY29udGFpbiB0aGUgbnVtYmVyIG9mIEpBWEJDdXN0b21CdWlsZGVycw0KLSAgICAgICAgICAgICAgICAvLyB1c2FnZXMuDQotICAgICAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJSZXNwb25zZSAxID0iICsgcmVzcG9uc2UpOw0KLSAgICAgICAgICAgICAgICBJbnRlZ2VyIHIxID0gSW50ZWdlci5wYXJzZUludChyZXNwb25zZSk7DQotICAgICAgICAgICAgICAgIFN0cmluZyByZXNwb25zZTIgPSBwcm94eS50d29XYXkocmVxU3RyaW5nKTsNCi0gICAgICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIlJlc3BvbnNlIDIgPSIgKyByZXNwb25zZTIpOw0KLSAgICAgICAgICAgICAgICAvLyBUaGUgcmV0dXJuZWQgcmVzcG9uc2Ugd2lsbCBjb250YWluIHRoZSBudW1iZXIgb2YgSkFYQkN1c3RvbUJ1aWxkZXJzDQotICAgICAgICAgICAgICAgIC8vIHVzYWdlcy4gIFRoaXMgc2hvdWxkIGJlIGdyZWF0ZXIgdGhhbiB0aGUgZmlyc3QgcmVzcG9uc2UNCi0gICAgICAgICAgICAgICAgSW50ZWdlciByMiA9IEludGVnZXIucGFyc2VJbnQocmVzcG9uc2UyKTsNCi0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyMi5pbnRWYWx1ZSgpID4gcjEuaW50VmFsdWUoKSk7DQotICAgICAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgICAgICAgICAgDQotDQotICAgICAgICAgICAgICAgIC8vIEVuZCBNb25pdG9yaW5nDQotICAgICAgICAgICAgICAgIHByb3h5LnR3b1dheSgiSkFYQkN1c3RvbUJ1aWxkZXJNb25pdG9yRW5kIik7DQotICAgICAgICAgICAgfWNhdGNoKEV4Y2VwdGlvbiBlKXsNCi0gICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgICAgICAgICAgZmFpbCgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgLyoqDQotICAgICAgICAgKiBUZXN0IHRvIHZhbGlkYXRlIHdoZXRoZXIgYSBKQVhCQ3VzdG9tQnVpbGRlciBpcyBwbHVnZ2VkIGFuZCB1c2VkDQotICAgICAgICAgKiBvbiB0aGUgY2xpZW50DQotICAgICAgICAgKi8NCi0gICAgICAgIHB1YmxpYyB2b2lkIHRlc3RKQVhCQ0JfQ2xpZW50KCl7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJUZXN0ICA6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgICAgIHRyeXsNCi0gICAgICAgICAgICAgICAgU3RyaW5nIHJlcVN0cmluZyA9ICJKQVhCQ3VzdG9tQnVpbGRlckNsaWVudCI7DQotICAgICAgICAgICAgICAgIERvY0xpdFdyYXAgcHJveHkgPSBnZXRQcm94eSgpOw0KLSAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgLy8gU3RhcnQgTW9uaXRvcmluZw0KLSAgICAgICAgICAgICAgICBKQVhCQ3VzdG9tQnVpbGRlck1vbml0b3Iuc2V0TW9uaXRvcmluZyh0cnVlKTsNCi0gICAgICAgICAgICAgICAgSkFYQkN1c3RvbUJ1aWxkZXJNb25pdG9yLmNsZWFyKCk7DQotICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICAvLyBJbnZva2UgdGhlIHdlYiBzZXJ2aWNlcw0KLSAgICAgICAgICAgICAgICBwcm94eS50d29XYXkocmVxU3RyaW5nKTsNCi0gICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgIC8vIFRoZSBzZWNvbmQgaW52b2tlIHNob3VsZCB0cmlnZ2VyIHRoZSBmYXN0DQotICAgICAgICAgICAgICAgIC8vIHVubWFyc2hhbGxpbmcgb2YgdGhlIHJlc3BvbnNlDQotICAgICAgICAgICAgICAgIHByb3h5LnR3b1dheShyZXFTdHJpbmcpOw0KLSAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgIC8vIFRoZSByZXR1cm5lZCByZXNwb25zZSB1bm1hcnNoYWxsaW5nIHNob3VsZCB0cnkNCi0gICAgICAgICAgICAgICAgLy8gdGhlIEpBWEJDdXN0b21CdWlsZGVyDQotICAgICAgICAgICAgICAgIGludCB0b3RhbEJ1aWxkZXJzID0gSkFYQkN1c3RvbUJ1aWxkZXJNb25pdG9yLmdldFRvdGFsQnVpbGRlcnMoKTsNCi0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh0b3RhbEJ1aWxkZXJzID49IDEpOw0KLSAgICAgICAgICAgICAgICBpbnQgdG90YWxDcmVhdGVzID0gSkFYQkN1c3RvbUJ1aWxkZXJNb25pdG9yLmdldFRvdGFsQ3JlYXRlcygpOw0KLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKHRvdGFsQ3JlYXRlcyA+PSAxKTsNCi0gICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgfWNhdGNoKEV4Y2VwdGlvbiBlKXsNCi0gICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgICAgICAgICAgZmFpbCgpOw0KLSAgICAgICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgICAgICAgIEpBWEJDdXN0b21CdWlsZGVyTW9uaXRvci5zZXRNb25pdG9yaW5nKGZhbHNlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIC8qKg0KLSAgICAgICAgICogVGVzdCB0byB2YWxpZGF0ZSB3aGV0aGVyIGEgSkFYQkN1c3RvbUJ1aWxkZXIgaXMgcGx1Z2dlZCBpbg0KLSAgICAgICAgICogb24gdGhlIGNsaWVudC4gIEFsc28gbWFrZXMgc3VyZSB0aGF0IHRoZSBKQVhCQ3VzdG9tQnVpbGRlcg0KLSAgICAgICAgICogZmFsbHMgYmFjayB0byBub3JtYWwgcHJvY2Vzc2luZyB3aGVuIGZhdWx0cyBhcmUgdGhyb3duLg0KLSAgICAgICAgICovDQotICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0SkFYQkNCX0ZhdWx0KCl7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJUZXN0ICA6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgICAgIHRyeXsNCi0gICAgICAgICAgICAgICAgU3RyaW5nIHJlcU5vcm1hbFN0cmluZyA9ICJKQVhCQ3VzdG9tQnVpbGRlckNsaWVudCI7DQotICAgICAgICAgICAgICAgIFN0cmluZyByZXFGYXVsdFN0cmluZyA9ICJKQVhCQ3VzdG9tQnVpbGRlckZhdWx0IjsNCi0gICAgICAgICAgICAgICAgRG9jTGl0V3JhcCBwcm94eSA9IGdldFByb3h5KCk7DQotICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICAvLyBTdGFydCBNb25pdG9yaW5nDQotICAgICAgICAgICAgICAgIEpBWEJDdXN0b21CdWlsZGVyTW9uaXRvci5zZXRNb25pdG9yaW5nKHRydWUpOw0KLSAgICAgICAgICAgICAgICBKQVhCQ3VzdG9tQnVpbGRlck1vbml0b3IuY2xlYXIoKTsNCi0gICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgICAgICAvLyBJbnZva2UgdGhlIHdlYiBzZXJ2aWNlcw0KLSAgICAgICAgICAgICAgICAgICAgcHJveHkudHdvV2F5KHJlcU5vcm1hbFN0cmluZyk7DQotICAgICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgc2Vjb25kIGludm9rZSB3aWxsIGNhdXNlDQotICAgICAgICAgICAgICAgICAgICAvLyBhbiBleGNlcHRpb24gdG8gYmUgdGhyb3duLg0KLSAgICAgICAgICAgICAgICAgICAgcHJveHkudHdvV2F5KHJlcUZhdWx0U3RyaW5nKTsNCi0gICAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICAgICAgLy8gQW4gZXhjZXB0aW9uIHdhcyBleHBlY3RlZA0KLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShmYWxzZSk7DQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFdlYlNlcnZpY2VFeGNlcHRpb24gd3NlKSB7DQotICAgICAgICAgICAgICAgICAgICAvLyBBbiBleGNlcHRpb24gaXMgZXhwZWN0ZWQNCi0gICAgICAgICAgICAgICAgICAgIC8vIFRoZSByZXR1cm5lZCByZXNwb25zZSB1bm1hcnNoYWxsaW5nIHNob3VsZCB0cnkNCi0gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBKQVhCQ3VzdG9tQnVpbGRlciBidXQgZmFsbGJhY2sgdG8gbm9ybWFsIHVubWFyc2hhbGxpbmcNCi0gICAgICAgICAgICAgICAgICAgIC8vIGR1ZSB0byB0aGUgcHJlc2Vuc2Ugb2YgYSBTT0FQRmF1bHQNCi0gICAgICAgICAgICAgICAgICAgIGludCB0b3RhbEJ1aWxkZXJzID0gSkFYQkN1c3RvbUJ1aWxkZXJNb25pdG9yLmdldFRvdGFsQnVpbGRlcnMoKTsNCi0gICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUodG90YWxCdWlsZGVycyA+PSAxKTsNCi0gICAgICAgICAgICAgICAgICAgIGludCB0b3RhbENyZWF0ZXMgPSBKQVhCQ3VzdG9tQnVpbGRlck1vbml0b3IuZ2V0VG90YWxDcmVhdGVzKCk7DQotICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKHRvdGFsQ3JlYXRlcyA9PSAwKTsNCi0gICAgICAgICAgICAgICAgICAgIGludCB0b3RhbEZhaWxlZENyZWF0ZXMgPSANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYQkN1c3RvbUJ1aWxkZXJNb25pdG9yLmdldFRvdGFsRmFpbGVkQ3JlYXRlcygpOw0KLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh0b3RhbEZhaWxlZENyZWF0ZXMgPj0gMSk7DQotICAgICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgIH0gDQotICAgICAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSl7DQotICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAgICAgICAgIGZhaWwoKTsNCi0gICAgICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICAgICAgICBKQVhCQ3VzdG9tQnVpbGRlck1vbml0b3Iuc2V0TW9uaXRvcmluZyhmYWxzZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICANCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hZGRudW1iZXJzL0FkZE51bWJlcnNGYXVsdF9FeGNlcHRpb24uamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkbnVtYmVycy9BZGROdW1iZXJzRmF1bHRfRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkZjM1MGIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hZGRudW1iZXJzL0FkZE51bWJlcnNGYXVsdF9FeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLmFkZG51bWJlcnM7DQotDQotaW1wb3J0IG9yZy50ZXN0LmFkZG51bWJlcnMuQWRkTnVtYmVyc0ZhdWx0Ow0KLQ0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViRmF1bHQ7DQotDQotDQotLyoqDQotICogVGhpcyBjbGFzcyB3YXMgZ2VuZXJhdGVkIGJ5IHRoZSBKQVhXUyBTSS4NCi0gKiBKQVgtV1MgUkkgMi4wXzAxLWIxNS1mY3MNCi0gKiBHZW5lcmF0ZWQgc291cmNlIHZlcnNpb246IDIuMA0KLSAqIA0KLSAqLw0KLUBXZWJGYXVsdChmYXVsdEJlYW49IiIsIG5hbWUgPSAiQWRkTnVtYmVyc0ZhdWx0IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9kdWtlL29yZyIpDQotcHVibGljIGNsYXNzIEFkZE51bWJlcnNGYXVsdF9FeGNlcHRpb24NCi0gICAgZXh0ZW5kcyBFeGNlcHRpb24NCi17DQotDQotICAgIC8qKg0KLSAgICAgKiBKYXZhIHR5cGUgdGhhdCBnb2VzIGFzIHNvYXBlbnY6RmF1bHQgZGV0YWlsIGVsZW1lbnQuDQotICAgICAqIA0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBBZGROdW1iZXJzRmF1bHQgZmF1bHRJbmZvOw0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSBmYXVsdEluZm8NCi0gICAgICogQHBhcmFtIG1lc3NhZ2UNCi0gICAgICovDQotICAgIHB1YmxpYyBBZGROdW1iZXJzRmF1bHRfRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBBZGROdW1iZXJzRmF1bHQgZmF1bHRJbmZvKSB7DQotICAgICAgICBzdXBlcihtZXNzYWdlKTsNCi0gICAgICAgIHRoaXMuZmF1bHRJbmZvID0gZmF1bHRJbmZvOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGZhdWx0SW5mbw0KLSAgICAgKiBAcGFyYW0gbWVzc2FnZQ0KLSAgICAgKiBAcGFyYW0gY2F1c2UNCi0gICAgICovDQotICAgIHB1YmxpYyBBZGROdW1iZXJzRmF1bHRfRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBBZGROdW1iZXJzRmF1bHQgZmF1bHRJbmZvLCBUaHJvd2FibGUgY2F1c2UpIHsNCi0gICAgICAgIHN1cGVyKG1lc3NhZ2UsIGNhdXNlKTsNCi0gICAgICAgIHRoaXMuZmF1bHRJbmZvID0gZmF1bHRJbmZvOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBmYXVsdCBiZWFuOiBkdWtlLm9yZy5BZGROdW1iZXJzRmF1bHQNCi0gICAgICovDQotICAgIHB1YmxpYyBBZGROdW1iZXJzRmF1bHQgZ2V0RmF1bHRJbmZvKCkgew0KLSAgICAgICAgcmV0dXJuIGZhdWx0SW5mbzsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FkZG51bWJlcnMvQWRkTnVtYmVyc1BvcnRUeXBlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FkZG51bWJlcnMvQWRkTnVtYmVyc1BvcnRUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkNmE3YTUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hZGRudW1iZXJzL0FkZE51bWJlcnNQb3J0VHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuYWRkbnVtYmVyczsNCi0NCi1pbXBvcnQgamF2YXguandzLk9uZXdheTsNCi1pbXBvcnQgamF2YXguandzLldlYk1ldGhvZDsNCi1pbXBvcnQgamF2YXguandzLldlYlBhcmFtOw0KLWltcG9ydCBqYXZheC5qd3MuV2ViUmVzdWx0Ow0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLlJlcXVlc3RXcmFwcGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuUmVzcG9uc2VXcmFwcGVyOw0KLQ0KLQ0KLQ0KLQ0KLS8qKg0KLSAqIFRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBieSB0aGUgSkFYV1MgU0kuDQotICogSkFYLVdTIFJJIDIuMF8wMS1iMTUtZmNzDQotICogR2VuZXJhdGVkIHNvdXJjZSB2ZXJzaW9uOiAyLjANCi0gKiANCi0gKi8NCi1AV2ViU2VydmljZShuYW1lID0gIkFkZE51bWJlcnNQb3J0VHlwZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL3Rlc3QvYWRkbnVtYmVycyIpDQotcHVibGljIGludGVyZmFjZSBBZGROdW1iZXJzUG9ydFR5cGUgew0KLQ0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSBhcmcxDQotICAgICAqIEBwYXJhbSBhcmcwDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgaW50DQotICAgICAqIEB0aHJvd3MgQWRkTnVtYmVyc0ZhdWx0X0V4Y2VwdGlvbg0KLSAgICAgKi8NCi0gICAgQFdlYk1ldGhvZA0KLSAgICBAV2ViUmVzdWx0KHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL3Rlc3QvYWRkbnVtYmVycyIpDQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAiYWRkTnVtYmVycyIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL3Rlc3QvYWRkbnVtYmVycyIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5hZGRudW1iZXJzLkFkZE51bWJlcnMiKQ0KLSAgICBAUmVzcG9uc2VXcmFwcGVyKGxvY2FsTmFtZSA9ICJhZGROdW1iZXJzUmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L2FkZG51bWJlcnMiLCBjbGFzc05hbWUgPSAib3JnLnRlc3QuYWRkbnVtYmVycy5BZGROdW1iZXJzUmVzcG9uc2UiKQ0KLSAgICBwdWJsaWMgaW50IGFkZE51bWJlcnMoDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJhcmcwIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9hZGRudW1iZXJzIikNCi0gICAgICAgIGludCBhcmcwLA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiYXJnMSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL3Rlc3QvYWRkbnVtYmVycyIpDQotICAgICAgICBpbnQgYXJnMSkNCi0gICAgICAgIHRocm93cyBBZGROdW1iZXJzRmF1bHRfRXhjZXB0aW9uDQotICAgIDsNCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gYXJnMA0KLSAgICAgKi8NCi0gICAgQFdlYk1ldGhvZA0KLSAgICBAT25ld2F5DQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAib25lV2F5SW50IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9hZGRudW1iZXJzIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LmFkZG51bWJlcnMuT25lV2F5SW50IikNCi0gICAgcHVibGljIHZvaWQgb25lV2F5SW50KA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiYXJnMCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL3Rlc3QvYWRkbnVtYmVycyIpDQotICAgICAgICBpbnQgYXJnMCk7DQotDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkbnVtYmVycy9BZGROdW1iZXJzUG9ydFR5cGVJbXBsLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FkZG51bWJlcnMvQWRkTnVtYmVyc1BvcnRUeXBlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmFjMWVhLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkbnVtYmVycy9BZGROdW1iZXJzUG9ydFR5cGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5hZGRudW1iZXJzOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLlRlc3RMb2dnZXI7DQotDQotaW1wb3J0IGphdmF4LmFubm90YXRpb24uUmVzb3VyY2U7DQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUNvbnRleHQ7DQotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLk1lc3NhZ2VDb250ZXh0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLQ0KLUBXZWJTZXJ2aWNlKHNlcnZpY2VOYW1lPSJBZGROdW1iZXJzU2VydmljZSIsZW5kcG9pbnRJbnRlcmZhY2U9Im9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLmFkZG51bWJlcnMuQWRkTnVtYmVyc1BvcnRUeXBlIikNCi1wdWJsaWMgY2xhc3MgQWRkTnVtYmVyc1BvcnRUeXBlSW1wbCBpbXBsZW1lbnRzIEFkZE51bWJlcnNQb3J0VHlwZSB7DQotDQotICAgIEBSZXNvdXJjZQ0KLSAgICBwcml2YXRlIFdlYlNlcnZpY2VDb250ZXh0IGN0eDsNCi0gICAgDQotCS8qIChub24tSmF2YWRvYykNCi0JICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5hZGRudW1iZXJzLkFkZE51bWJlcnNQb3J0VHlwZSNhZGROdW1iZXJzKGludCwgaW50KQ0KLQkgKi8NCi0JcHVibGljIGludCBhZGROdW1iZXJzKGludCBhcmcwLCBpbnQgYXJnMSkgdGhyb3dzIEFkZE51bWJlcnNGYXVsdF9FeGNlcHRpb24gew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IFJlY2VpdmVkIGFkZE51bWJlcnMgcmVxdWVzdCBmb3IgIiArIGFyZzAgKyAiIGFuZCAiICsgYXJnMSk7DQotICAgICAgICANCi0gICAgICAgIGNoZWNrUHJvcGVydGllcygpOw0KLSAgICAgICAgDQotICAgICAgICByZXR1cm4gYXJnMCthcmcxOw0KLQl9DQotCQ0KLQlwcml2YXRlIHZvaWQgY2hlY2tQcm9wZXJ0aWVzKCkgew0KLQkgICAgTWVzc2FnZUNvbnRleHQgbWMgPSBjdHguZ2V0TWVzc2FnZUNvbnRleHQoKTsNCi0JICAgIE1hcCBoZWFkZXJzID0gKE1hcCltYy5nZXQoTWVzc2FnZUNvbnRleHQuSFRUUF9SRVFVRVNUX0hFQURFUlMpOw0KLQkgICAgLy8gdGhlIG1hcCBzaG91bGQgY29udGFpbiBzb21lIGhlYWRlcnMNCi0JICAgIGlmIChoZWFkZXJzID09IG51bGwgfHwgaGVhZGVycy5pc0VtcHR5KCkpIHsNCi0JICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiSFRUUCByZXF1ZXN0IGhlYWRlcnMgbWFwIGlzIG51bGwgb3IgZW1wdHkhIik7DQotCSAgICB9DQotCX0NCi0NCi0JLyogKG5vbi1KYXZhZG9jKQ0KLQkgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLmFkZG51bWJlcnMuQWRkTnVtYmVyc1BvcnRUeXBlI29uZVdheUludChpbnQpDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBvbmVXYXlJbnQoaW50IGFyZzApIHsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBSZWNlaXZlZCBvbmUtd2F5IHJlcXVlc3QuIik7DQotICAgICAgICByZXR1cm47DQotCX0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hZGRudW1iZXJzL0FkZE51bWJlcnNTZXJ2aWNlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FkZG51bWJlcnMvQWRkTnVtYmVyc1NlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGFkMGU1My4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FkZG51bWJlcnMvQWRkTnVtYmVyc1NlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLQ0KLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLmFkZG51bWJlcnM7DQotDQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViRW5kcG9pbnQ7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlQ2xpZW50Ow0KLWltcG9ydCBqYXZhLmlvLkZpbGU7DQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLQ0KLS8qKg0KLSAqIFRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBieSB0aGUgSkFYV1MgU0kuDQotICogSkFYLVdTIFJJIDIuMF8wMS1iMTUtZmNzDQotICogR2VuZXJhdGVkIHNvdXJjZSB2ZXJzaW9uOiAyLjANCi0gKiANCi0gKi8NCi1AV2ViU2VydmljZUNsaWVudChuYW1lID0gIkFkZE51bWJlcnNTZXJ2aWNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9hZGRudW1iZXJzIiwgd3NkbExvY2F0aW9uID0gIkFkZE51bWJlcnMxLndzZGwiKQ0KLXB1YmxpYyBjbGFzcyBBZGROdW1iZXJzU2VydmljZQ0KLSAgICBleHRlbmRzIFNlcnZpY2UNCi17DQotDQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFVSTCBBREROVU1CRVJTU0VSVklDRV9XU0RMX0xPQ0FUSU9OOw0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgd3NkbExvY2F0aW9uPSIvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hZGRudW1iZXJzL01FVEEtSU5GL0FkZE51bWJlcnMud3NkbCI7DQotICAgIHN0YXRpYyB7DQotICAgICAgICBVUkwgdXJsID0gbnVsbDsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAJdHJ5ew0KLQkgICAgICAgIAlTdHJpbmcgYmFzZURpciA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiYmFzZWRpciIsIi4iKSkuZ2V0Q2Fub25pY2FsUGF0aCgpOw0KLQkgICAgICAgIAl3c2RsTG9jYXRpb24gPSBuZXcgRmlsZShiYXNlRGlyICsgd3NkbExvY2F0aW9uKS5nZXRBYnNvbHV0ZVBhdGgoKTsNCi0gICAgICAgIAl9Y2F0Y2goRXhjZXB0aW9uIGUpew0KLSAgICAgICAgCQllLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgCX0NCi0gICAgICAgIAlGaWxlIGZpbGUgPSBuZXcgRmlsZSh3c2RsTG9jYXRpb24pOw0KLSAgICAgICAgCXVybCA9IGZpbGUudG9VUkwoKTsNCi0gICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIEFERE5VTUJFUlNTRVJWSUNFX1dTRExfTE9DQVRJT04gPSB1cmw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEFkZE51bWJlcnNTZXJ2aWNlKFVSTCB3c2RsTG9jYXRpb24sIFFOYW1lIHNlcnZpY2VOYW1lKSB7DQotICAgICAgICBzdXBlcih3c2RsTG9jYXRpb24sIHNlcnZpY2VOYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQWRkTnVtYmVyc1NlcnZpY2UoKSB7DQotICAgICAgICBzdXBlcihBREROVU1CRVJTU0VSVklDRV9XU0RMX0xPQ0FUSU9OLCBuZXcgUU5hbWUoImh0dHA6Ly9vcmcvdGVzdC9hZGRudW1iZXJzIiwgIkFkZE51bWJlcnNTZXJ2aWNlIikpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBBZGROdW1iZXJzUG9ydFR5cGUNCi0gICAgICovDQotICAgIEBXZWJFbmRwb2ludChuYW1lID0gIkFkZE51bWJlcnNQb3J0IikNCi0gICAgcHVibGljIEFkZE51bWJlcnNQb3J0VHlwZSBnZXRBZGROdW1iZXJzUG9ydCgpIHsNCi0gICAgICAgIHJldHVybiAoQWRkTnVtYmVyc1BvcnRUeXBlKXN1cGVyLmdldFBvcnQobmV3IFFOYW1lKCJodHRwOi8vb3JnL3Rlc3QvYWRkbnVtYmVycyIsICJBZGROdW1iZXJzUG9ydCIpLCBBZGROdW1iZXJzUG9ydFR5cGUuY2xhc3MpOw0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkbnVtYmVycy9NRVRBLUlORi9BZGROdW1iZXJzLndzZGwgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FkZG51bWJlcnMvTUVUQS1JTkYvQWRkTnVtYmVycy53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzNlZWYxLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkbnVtYmVycy9NRVRBLUlORi9BZGROdW1iZXJzLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi0NCi0NCi08IS0tDQotICB+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+DQotPC9kZWZpbml0aW9ucz4NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FkZG51bWJlcnNoYW5kbGVyL0FkZE51bWJlcnNDbGllbnRIYW5kbGVycy54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FkZG51bWJlcnNoYW5kbGVyL0FkZE51bWJlcnNDbGllbnRIYW5kbGVycy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1NjNlOWQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hZGRudW1iZXJzaGFuZGxlci9BZGROdW1iZXJzQ2xpZW50SGFuZGxlcnMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi0NCi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08andzOmhhbmRsZXItY2hhaW5zIHhtbG5zOmp3cz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIj4NCi0NCi0JPGp3czpoYW5kbGVyLWNoYWluIG5hbWU9IkxvZ2dpbmdIYW5kbGVyQ2hhaW4iPg0KLQkJPHByb3RvY29sLWJpbmRpbmdzPiMjU09BUDExX0hUVFA8L3Byb3RvY29sLWJpbmRpbmdzPg0KLQkJPGp3czpoYW5kbGVyPg0KLQkJCTxqd3M6aGFuZGxlci1jbGFzcz5vcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5hZGRudW1iZXJzaGFuZGxlci5BZGROdW1iZXJzQ2xpZW50TG9naWNhbEhhbmRsZXI8L2p3czpoYW5kbGVyLWNsYXNzPg0KLQkJPC9qd3M6aGFuZGxlcj4NCi0JPC9qd3M6aGFuZGxlci1jaGFpbj4NCi0JDQotPC9qd3M6aGFuZGxlci1jaGFpbnM+DQotDQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hZGRudW1iZXJzaGFuZGxlci9BZGROdW1iZXJzQ2xpZW50TG9naWNhbEhhbmRsZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkbnVtYmVyc2hhbmRsZXIvQWRkTnVtYmVyc0NsaWVudExvZ2ljYWxIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjN2JhMzIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hZGRudW1iZXJzaGFuZGxlci9BZGROdW1iZXJzQ2xpZW50TG9naWNhbEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwOCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5hZGRudW1iZXJzaGFuZGxlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5oYW5kbGVyLkF0dGFjaG1lbnRzQWRhcHRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5oYW5kbGVyLkxvZ2ljYWxNZXNzYWdlQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tYXJzaGFsbGVyLmltcGwuYWx0Lk1ldGhvZE1hcnNoYWxsZXJVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLlhNTEZhdWx0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UudXRpbC5YTUxGYXVsdFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnV0aWxpdHkuU0FBSkZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBCb2R5Ow0KLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQQ29uc3RhbnRzOw0KLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRmF1bHQ7DQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBNZXNzYWdlOw0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLk91dHB1dEtleXM7DQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOw0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyOw0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeTsNCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0Ow0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1Tb3VyY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5Mb2dpY2FsTWVzc2FnZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLlByb3RvY29sRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5NZXNzYWdlQ29udGV4dDsNCi1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuU09BUEZhdWx0RXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5TdHJpbmdCdWZmZXJJbnB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsNCi0NCi0vKg0KLSAqIFlvdSBjYW4ndCBhY3R1YWxseSBzcGVjaWZ5IHdoZXRoZXIgYSBoYW5kbGVyIGlzIGZvciBjbGllbnQgb3Igc2VydmVyLA0KLSAqIHlvdSBqdXN0IGhhdmUgdG8gY2hlY2sgaW4gdGhlIGhhbmRsZU1lc3NhZ2UgYW5kL29yIGhhbmRsZUZhdWx0IHRvIG1ha2UNCi0gKiBzdXJlIHdoYXQgZGlyZWN0aW9uIHdlJ3JlIGdvaW5nLg0KLSAqLw0KLQ0KLXB1YmxpYyBjbGFzcyBBZGROdW1iZXJzQ2xpZW50TG9naWNhbEhhbmRsZXIgDQotaW1wbGVtZW50cyBqYXZheC54bWwud3MuaGFuZGxlci5Mb2dpY2FsSGFuZGxlcjxMb2dpY2FsTWVzc2FnZUNvbnRleHQ+IHsNCi0NCi0gICAgSGFuZGxlclRyYWNrZXIgdHJhY2tlciA9IG5ldyBIYW5kbGVyVHJhY2tlcihBZGROdW1iZXJzQ2xpZW50TG9naWNhbEhhbmRsZXIuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpKTsNCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIGNsb3NlKE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2Vjb250ZXh0KSB7DQotICAgICAgICB0cmFja2VyLmNsb3NlKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaGFuZGxlRmF1bHQoTG9naWNhbE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2Vjb250ZXh0KSB7DQotICAgICAgICBCb29sZWFuIG91dGJvdW5kID0gKEJvb2xlYW4pIG1lc3NhZ2Vjb250ZXh0LmdldChNZXNzYWdlQ29udGV4dC5NRVNTQUdFX09VVEJPVU5EX1BST1BFUlRZKTsNCi0gICAgICAgIHRyYWNrZXIuaGFuZGxlRmF1bHQob3V0Ym91bmQpOw0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaGFuZGxlTWVzc2FnZShMb2dpY2FsTWVzc2FnZUNvbnRleHQgbWVzc2FnZWNvbnRleHQpIHsNCi0gICAgICAgIEJvb2xlYW4gb3V0Ym91bmQgPSANCi0gICAgICAgICAgICAoQm9vbGVhbiltZXNzYWdlY29udGV4dC5nZXQoTWVzc2FnZUNvbnRleHQuTUVTU0FHRV9PVVRCT1VORF9QUk9QRVJUWSk7DQotICAgICAgICB0cmFja2VyLmhhbmRsZU1lc3NhZ2Uob3V0Ym91bmQpOw0KLSAgICAgICAgaWYgKCFvdXRib3VuZCkgeyAgLy8gaW5ib3VuZCByZXNwb25zZSBvbiB0aGUgY2xpZW50DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHN0YW5kYXJkIHByb3BlcnR5IGlzIGF2YWlsYWJsZQ0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIE9iamVjdCBib2IgPSBtZXNzYWdlY29udGV4dC5nZXQoTG9naWNhbE1lc3NhZ2VDb250ZXh0LkhUVFBfUkVTUE9OU0VfQ09ERSk7DQotICAgICAgICAgICAgaWYgKGJvYiA9PSBudWxsKSB7DQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiYm9iIGlzIG51bGwiKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gcHJldmlvdXNseSBjYXVzZWQgYSBOUEUgZHVlIHRvIGludGVybmFsIFByb3BlcnRpZXMucHV0QWxsKG1hcCk7DQotICAgICAgICAgICAgLy8gd2hlcmUgJ21hcCcgaGFkIGEga2V5L3ZhbHVlIHBhaXIgd2l0aCBudWxsIHZhbHVlLiAgU28sIGludGVybmFsbHkNCi0gICAgICAgICAgICAvLyB3ZSBub3cgdXNlIEhhc2hNYXAgaW5zdGVhZCBvZiBQcm9wZXJ0aWVzLg0KLSAgICAgICAgICAgIGludCBzaXplID0gbWVzc2FnZWNvbnRleHQuc2l6ZSgpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8qDQotICAgICAgICAgICAgICogVGhlc2UgcHJvcHMgd2VyZSBzZXQgb24gdGhlIG91dGJvdW5kIGZsb3cuICBJbmJvdW5kIGZsb3cgaGFuZGxlcnMNCi0gICAgICAgICAgICAgKiBzaG91bGQgaGF2ZSBhY2Nlc3MgdG8gdGhlbS4NCi0gICAgICAgICAgICAgKi8NCi0gICAgICAgICAgICBTdHJpbmcgcHJvcEtleSA9ICJBZGROdW1iZXJzQ2xpZW50UHJvdG9jb2xIYW5kbGVyT3V0Ym91bmRBcHBTY29wZWRQcm9wZXJ0eSI7DQotICAgICAgICAgICAgU3RyaW5nIG15Q2xpZW50VmFsID0gKFN0cmluZyltZXNzYWdlY29udGV4dC5nZXQocHJvcEtleSk7DQotICAgICAgICAgICAgaWYgKG15Q2xpZW50VmFsID09IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlByb3BlcnR5ICIgKyBwcm9wS2V5ICsgIiB3YXMgbnVsbC4gICIgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1FUENvbnRleHQgaXMgbm90IHNlYXJjaGluZyBoYXJkIGVub3VnaCBmb3IgdGhlIHByb3BlcnR5LiIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBDaGVjayBmb3IgdGhlIHByZXNlbmNlcyBvZiB0aGUgYXR0YWNobWVudCBwcm9wZXJ0eQ0KLSAgICAgICAgICAgIHByb3BLZXkgPSBNZXNzYWdlQ29udGV4dC5JTkJPVU5EX01FU1NBR0VfQVRUQUNITUVOVFM7DQotICAgICAgICAgICAgTWFwIG1hcCA9IChNYXApIG1lc3NhZ2Vjb250ZXh0LmdldChwcm9wS2V5KTsNCi0gICAgICAgICAgICBpZiAobWFwID09IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlByb3BlcnR5ICIgKyBwcm9wS2V5ICsgIiB3YXMgbnVsbCIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZiAoIShtYXAgaW5zdGFuY2VvZiBBdHRhY2htZW50c0FkYXB0ZXIpKSB7DQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJFeHBlY3RlZCBBdHRhY2htZW50QWRhcHRlciBmb3IgUHJvcGVydHkgIiArIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wS2V5KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcHJvcEtleSA9ICJBZGROdW1iZXJzQ2xpZW50UHJvdG9jb2xIYW5kbGVyT3V0Ym91bmRIYW5kbGVyU2NvcGVkUHJvcGVydHkiOw0KLSAgICAgICAgICAgIG15Q2xpZW50VmFsID0gKFN0cmluZyltZXNzYWdlY29udGV4dC5nZXQocHJvcEtleSk7DQotICAgICAgICAgICAgaWYgKG15Q2xpZW50VmFsID09IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlByb3BlcnR5ICIgKyBwcm9wS2V5ICsgIiB3YXMgbnVsbC4gICIgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1FUENvbnRleHQgaXMgbm90IHNlYXJjaGluZyBoYXJkIGVub3VnaCBmb3IgdGhlIHByb3BlcnR5LiIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvKg0KLSAgICAgICAgICAgICAqIFRoZXNlIHByb3BzIHdlcmUgc2V0IG9uIHRoZSBpbmJvdW5kIGZsb3cuICBJbmJvdW5kIGZsb3cgaGFuZGxlcnMNCi0gICAgICAgICAgICAgKiBzaG91bGQgaGF2ZSBhY2Nlc3MgdG8gdGhlbS4NCi0gICAgICAgICAgICAgKi8NCi0gICAgICAgICAgICBwcm9wS2V5ID0gIkFkZE51bWJlcnNDbGllbnRQcm90b2NvbEhhbmRsZXJJbmJvdW5kQXBwU2NvcGVkUHJvcGVydHkiOw0KLSAgICAgICAgICAgIG15Q2xpZW50VmFsID0gKFN0cmluZyltZXNzYWdlY29udGV4dC5nZXQocHJvcEtleSk7DQotICAgICAgICAgICAgaWYgKG15Q2xpZW50VmFsID09IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlByb3BlcnR5ICIgKyBwcm9wS2V5ICsgIiB3YXMgbnVsbC4gICIgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1FUENvbnRleHQgaXMgbm90IHNlYXJjaGluZyBoYXJkIGVub3VnaCBmb3IgdGhlIHByb3BlcnR5LiIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBwcm9wS2V5ID0gIkFkZE51bWJlcnNDbGllbnRQcm90b2NvbEhhbmRsZXJJbmJvdW5kSGFuZGxlclNjb3BlZFByb3BlcnR5IjsNCi0gICAgICAgICAgICBteUNsaWVudFZhbCA9IChTdHJpbmcpbWVzc2FnZWNvbnRleHQuZ2V0KHByb3BLZXkpOw0KLSAgICAgICAgICAgIGlmIChteUNsaWVudFZhbCA9PSBudWxsKSB7DQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJQcm9wZXJ0eSAiICsgcHJvcEtleSArICIgd2FzIG51bGwuICAiICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNRVBDb250ZXh0IGlzIG5vdCBzZWFyY2hpbmcgaGFyZCBlbm91Z2ggZm9yIHRoZSBwcm9wZXJ0eS4iKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgTG9naWNhbE1lc3NhZ2UgbXNnID0gbWVzc2FnZWNvbnRleHQuZ2V0TWVzc2FnZSgpOw0KLSAgICAgICAgICAgIFN0cmluZyBzdCA9IGdldFN0cmluZ0Zyb21Tb3VyY2VQYXlsb2FkKG1zZy5nZXRQYXlsb2FkKCkpOw0KLSAgICAgICAgICAgIFN0cmluZyB0eHQgPSBTdHJpbmcudmFsdWVPZihJbnRlZ2VyLnZhbHVlT2YoZ2V0Rmlyc3RBcmcoc3QpKSAtIDEpOw0KLSAgICAgICAgICAgIHN0ID0gcmVwbGFjZUZpcnN0QXJnKHN0LCB0eHQpOw0KLSAgICAgICAgICAgIG1zZy5zZXRQYXlsb2FkKG5ldyBTdHJlYW1Tb3VyY2UobmV3IFN0cmluZ0J1ZmZlcklucHV0U3RyZWFtKHN0KSkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSB7DQotICAgICAgICAgICAgTG9naWNhbE1lc3NhZ2UgbXNnID0gbWVzc2FnZWNvbnRleHQuZ2V0TWVzc2FnZSgpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIFNvdXJjZSBzID0gbXNnLmdldFBheWxvYWQoKTsNCi0gICAgICAgICAgICBzID0gbXNnLmdldFBheWxvYWQoKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBTdHJpbmcgc3QgPSBnZXRTdHJpbmdGcm9tU291cmNlUGF5bG9hZChtc2cuZ2V0UGF5bG9hZCgpKTsNCi0gICAgICAgICAgICBpZiAoc3QuY29udGFpbnMoIj45OTwvYXJnMD4iKSkgew0KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUHJvdG9jb2xFeGNlcHRpb24oIkkgZG9uJ3QgbGlrZSB0aGUgdmFsdWUgOTkiKTsNCi0gICAgICAgICAgICB9IGVsc2UgaWYgKHN0LmNvbnRhaW5zKCI+OTk5PC9hcmcwPiIpKSB7DQotICAgICAgICAgICAgICAgIFhNTEZhdWx0IHhtbEZhdWx0ID0gTWV0aG9kTWFyc2hhbGxlclV0aWxzLmNyZWF0ZVhNTEZhdWx0RnJvbVN5c3RlbUV4Y2VwdGlvbihuZXcgUnVudGltZUV4Y2VwdGlvbigiSSBkb24ndCBsaWtlIHRoZSB2YWx1ZSA5OTkiKSk7DQotICAgICAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc29hcC5NZXNzYWdlRmFjdG9yeSBtZiA9IFNBQUpGYWN0b3J5LmNyZWF0ZU1lc3NhZ2VGYWN0b3J5KFNPQVBDb25zdGFudHMuVVJJX05TX1NPQVBfMV8xX0VOVkVMT1BFKTsNCi0gICAgICAgICAgICAgICAgICAgIFNPQVBNZXNzYWdlIG1lc3NhZ2UgPSBtZi5jcmVhdGVNZXNzYWdlKCk7DQotICAgICAgICAgICAgICAgICAgICBTT0FQQm9keSBib2R5ID0gbWVzc2FnZS5nZXRTT0FQQm9keSgpOw0KLSAgICAgICAgICAgICAgICAgICAgU09BUEZhdWx0IHNvYXBGYXVsdCA9IFhNTEZhdWx0VXRpbHMuY3JlYXRlU0FBSkZhdWx0KHhtbEZhdWx0LCBib2R5KTsNCi0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTT0FQRmF1bHRFeGNlcHRpb24oc29hcEZhdWx0KTsNCi0gICAgICAgICAgICAgICAgfSBjYXRjaCAoU09BUEV4Y2VwdGlvbiBzb2FwZSkgew0KLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkdvdCBTT0FQRXhjZXB0aW9uLiAgVGhhdCdzIGJhZC4iKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBDaGVjayBmb3IgdGhlIHByZXNlbmNlcyBvZiB0aGUgYXR0YWNobWVudCBwcm9wZXJ0eQ0KLSAgICAgICAgICAgIFN0cmluZyBwcm9wS2V5ID0gTWVzc2FnZUNvbnRleHQuT1VUQk9VTkRfTUVTU0FHRV9BVFRBQ0hNRU5UUzsNCi0gICAgICAgICAgICBNYXAgbWFwID0gKE1hcCkgbWVzc2FnZWNvbnRleHQuZ2V0KHByb3BLZXkpOw0KLSAgICAgICAgICAgIGlmIChtYXAgPT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiUHJvcGVydHkgIiArIHByb3BLZXkgKyAiIHdhcyBudWxsIik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmICghKG1hcCBpbnN0YW5jZW9mIEF0dGFjaG1lbnRzQWRhcHRlcikpIHsNCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkV4cGVjdGVkIEF0dGFjaG1lbnRBZGFwdGVyIGZvciBQcm9wZXJ0eSAiICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcEtleSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0gICAgDQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRGaXJzdEFyZyhTdHJpbmcgcGF5bG9hZFN0cmluZykgew0KLSAgICAgICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihwYXlsb2FkU3RyaW5nLCAiPiIpOw0KLSAgICAgICAgc3QubmV4dFRva2VuKCk7ICAvLyBza2lwIGZpcnN0IHRva2VuLg0KLSAgICAgICAgc3QubmV4dFRva2VuKCk7ICAvLyBza2lwIHNlY29uZA0KLSAgICAgICAgU3RyaW5nIHRlbXBTdHJpbmcgPSBzdC5uZXh0VG9rZW4oKTsNCi0gICAgICAgIFN0cmluZyByZXR1cm5TdHJpbmcgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHRlbXBTdHJpbmcsICI8IikubmV4dFRva2VuKCk7DQotICAgICAgICByZXR1cm4gcmV0dXJuU3RyaW5nOw0KLSAgICB9DQotICAgIA0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgcmVwbGFjZUZpcnN0QXJnKFN0cmluZyBwYXlsb2FkU3RyaW5nLCBTdHJpbmcgbmV3QXJnKSB7DQotICAgICAgICBTdHJpbmcgZmlyc3RBcmcgPSBnZXRGaXJzdEFyZyhwYXlsb2FkU3RyaW5nKTsNCi0gICAgICAgIHBheWxvYWRTdHJpbmcgPSBwYXlsb2FkU3RyaW5nLnJlcGxhY2VGaXJzdChmaXJzdEFyZywgbmV3QXJnKTsNCi0gICAgICAgIHJldHVybiBwYXlsb2FkU3RyaW5nOw0KLSAgICB9DQotICAgIA0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nRnJvbVNvdXJjZVBheWxvYWQoU291cmNlIHBheWxvYWQpIHsNCi0gICAgICAgIHRyeSB7DQotDQotICAgICAgICAgICAgVHJhbnNmb3JtZXJGYWN0b3J5IGZhY3RvcnkgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKTsNCi0gICAgICAgICAgICBUcmFuc2Zvcm1lciB0cmFucyA9IGZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsNCi0NCi0gICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsNCi0gICAgICAgICAgICBTdHJlYW1SZXN1bHQgcmVzdWx0ID0gbmV3IFN0cmVhbVJlc3VsdChiYW9zKTsNCi0NCi0gICAgICAgICAgICB0cmFucy5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLk9NSVRfWE1MX0RFQ0xBUkFUSU9OLCAieWVzIik7DQotICAgICAgICAgICAgdHJhbnMudHJhbnNmb3JtKHBheWxvYWQsIHJlc3VsdCk7DQotDQotICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoYmFvcy50b0J5dGVBcnJheSgpKTsNCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7DQotICAgICAgICB9DQotDQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hZGRudW1iZXJzaGFuZGxlci9BZGROdW1iZXJzQ2xpZW50TG9naWNhbEhhbmRsZXIyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FkZG51bWJlcnNoYW5kbGVyL0FkZE51bWJlcnNDbGllbnRMb2dpY2FsSGFuZGxlcjIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2VhY2E3Zi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FkZG51bWJlcnNoYW5kbGVyL0FkZE51bWJlcnNDbGllbnRMb2dpY2FsSGFuZGxlcjIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5hZGRudW1iZXJzaGFuZGxlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5oYW5kbGVyLkxvZ2ljYWxNZXNzYWdlQ29udGV4dDsNCi0NCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5PdXRwdXRLZXlzOw0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsNCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjsNCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk7DQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdDsNCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtU291cmNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuTG9naWNhbE1lc3NhZ2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLk1lc3NhZ2VDb250ZXh0Ow0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5TdHJpbmdCdWZmZXJJbnB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsNCi0NCi0vKg0KLSAqIFlvdSBjYW4ndCBhY3R1YWxseSBzcGVjaWZ5IHdoZXRoZXIgYSBoYW5kbGVyIGlzIGZvciBjbGllbnQgb3Igc2VydmVyLA0KLSAqIHlvdSBqdXN0IGhhdmUgdG8gY2hlY2sgaW4gdGhlIGhhbmRsZU1lc3NhZ2UgYW5kL29yIGhhbmRsZUZhdWx0IHRvIG1ha2UNCi0gKiBzdXJlIHdoYXQgZGlyZWN0aW9uIHdlJ3JlIGdvaW5nLg0KLSAqLw0KLQ0KLXB1YmxpYyBjbGFzcyBBZGROdW1iZXJzQ2xpZW50TG9naWNhbEhhbmRsZXIyIGltcGxlbWVudHMgamF2YXgueG1sLndzLmhhbmRsZXIuTG9naWNhbEhhbmRsZXI8TG9naWNhbE1lc3NhZ2VDb250ZXh0PiB7DQotDQotICAgIEhhbmRsZXJUcmFja2VyIHRyYWNrZXIgPSBuZXcgSGFuZGxlclRyYWNrZXIoQWRkTnVtYmVyc0NsaWVudExvZ2ljYWxIYW5kbGVyMi5jbGFzcy5nZXRTaW1wbGVOYW1lKCkpOw0KLSAgICANCi0gICAgcHVibGljIHZvaWQgY2xvc2UoTWVzc2FnZUNvbnRleHQgbWVzc2FnZWNvbnRleHQpIHsNCi0gICAgICAgIHRyYWNrZXIuY2xvc2UoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYW5kbGVGYXVsdChMb2dpY2FsTWVzc2FnZUNvbnRleHQgbWVzc2FnZWNvbnRleHQpIHsNCi0gICAgICAgIEJvb2xlYW4gb3V0Ym91bmQgPSAoQm9vbGVhbikgbWVzc2FnZWNvbnRleHQuZ2V0KE1lc3NhZ2VDb250ZXh0Lk1FU1NBR0VfT1VUQk9VTkRfUFJPUEVSVFkpOw0KLSAgICAgICAgdHJhY2tlci5oYW5kbGVGYXVsdChvdXRib3VuZCk7DQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYW5kbGVNZXNzYWdlKExvZ2ljYWxNZXNzYWdlQ29udGV4dCBtZXNzYWdlY29udGV4dCkgew0KLSAgICAgICAgQm9vbGVhbiBvdXRib3VuZCA9IChCb29sZWFuKW1lc3NhZ2Vjb250ZXh0LmdldChNZXNzYWdlQ29udGV4dC5NRVNTQUdFX09VVEJPVU5EX1BST1BFUlRZKTsNCi0gICAgICAgIHRyYWNrZXIuaGFuZGxlTWVzc2FnZShvdXRib3VuZCk7DQotICAgICAgICBpZiAob3V0Ym91bmQpIHsgIC8vIG91dGJvdW5kIHJlcXVlc3Qgb24gdGhlIGNsaWVudA0KLSAgICAgICAgICAgIExvZ2ljYWxNZXNzYWdlIG1zZyA9IG1lc3NhZ2Vjb250ZXh0LmdldE1lc3NhZ2UoKTsNCi0gICAgICAgICAgICBTb3VyY2UgcGF5bG9hZCA9IG1zZy5nZXRQYXlsb2FkKCk7DQotICAgICAgICAgICAgU3RyaW5nIHN0ID0gZ2V0U3RyaW5nRnJvbVNvdXJjZVBheWxvYWQocGF5bG9hZCk7DQotICAgICAgICAgICAgU3RyaW5nIHR4dCA9IFN0cmluZy52YWx1ZU9mKEludGVnZXIudmFsdWVPZihnZXRGaXJzdEFyZyhzdCkpICogMik7DQotICAgICAgICAgICAgc3QgPSByZXBsYWNlRmlyc3RBcmcoc3QsIHR4dCk7DQotICAgICAgICAgICAgbXNnLnNldFBheWxvYWQobmV3IFN0cmVhbVNvdXJjZShuZXcgU3RyaW5nQnVmZmVySW5wdXRTdHJlYW0oc3QpKSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEZpcnN0QXJnKFN0cmluZyBwYXlsb2FkU3RyaW5nKSB7DQotICAgICAgICBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHBheWxvYWRTdHJpbmcsICI+Iik7DQotICAgICAgICBzdC5uZXh0VG9rZW4oKTsgIC8vIHNraXAgZmlyc3QgdG9rZW4uDQotICAgICAgICBzdC5uZXh0VG9rZW4oKTsgIC8vIHNraXAgc2Vjb25kDQotICAgICAgICBTdHJpbmcgdGVtcFN0cmluZyA9IHN0Lm5leHRUb2tlbigpOw0KLSAgICAgICAgU3RyaW5nIHJldHVyblN0cmluZyA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodGVtcFN0cmluZywgIjwiKS5uZXh0VG9rZW4oKTsNCi0gICAgICAgIHJldHVybiByZXR1cm5TdHJpbmc7DQotICAgIH0NCi0gICAgDQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyByZXBsYWNlRmlyc3RBcmcoU3RyaW5nIHBheWxvYWRTdHJpbmcsIFN0cmluZyBuZXdBcmcpIHsNCi0gICAgICAgIFN0cmluZyBmaXJzdEFyZyA9IGdldEZpcnN0QXJnKHBheWxvYWRTdHJpbmcpOw0KLSAgICAgICAgcGF5bG9hZFN0cmluZyA9IHBheWxvYWRTdHJpbmcucmVwbGFjZUZpcnN0KGZpcnN0QXJnLCBuZXdBcmcpOw0KLSAgICAgICAgcmV0dXJuIHBheWxvYWRTdHJpbmc7DQotICAgIH0NCi0gICAgDQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRTdHJpbmdGcm9tU291cmNlUGF5bG9hZChTb3VyY2UgcGF5bG9hZCkgew0KLSAgICAgICAgdHJ5IHsNCi0NCi0gICAgICAgICAgICBUcmFuc2Zvcm1lckZhY3RvcnkgZmFjdG9yeSA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOw0KLSAgICAgICAgICAgIFRyYW5zZm9ybWVyIHRyYW5zID0gZmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOw0KLQ0KLSAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOw0KLSAgICAgICAgICAgIFN0cmVhbVJlc3VsdCByZXN1bHQgPSBuZXcgU3RyZWFtUmVzdWx0KGJhb3MpOw0KLQ0KLSAgICAgICAgICAgIHRyYW5zLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuT01JVF9YTUxfREVDTEFSQVRJT04sICJ5ZXMiKTsNCi0gICAgICAgICAgICB0cmFucy50cmFuc2Zvcm0ocGF5bG9hZCwgcmVzdWx0KTsNCi0NCi0gICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhiYW9zLnRvQnl0ZUFycmF5KCkpOw0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FkZG51bWJlcnNoYW5kbGVyL0FkZE51bWJlcnNDbGllbnRMb2dpY2FsSGFuZGxlcjMuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkbnVtYmVyc2hhbmRsZXIvQWRkTnVtYmVyc0NsaWVudExvZ2ljYWxIYW5kbGVyMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODczNzkxLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkbnVtYmVyc2hhbmRsZXIvQWRkTnVtYmVyc0NsaWVudExvZ2ljYWxIYW5kbGVyMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuYWRkbnVtYmVyc2hhbmRsZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaGFuZGxlci5Mb2dpY2FsTWVzc2FnZUNvbnRleHQ7DQotDQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uT3V0cHV0S2V5czsNCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7DQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXI7DQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5Ow0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7DQotaW1wb3J0IGphdmF4LnhtbC53cy5Mb2dpY2FsTWVzc2FnZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuTWVzc2FnZUNvbnRleHQ7DQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOw0KLQ0KLS8qDQotICogWW91IGNhbid0IGFjdHVhbGx5IHNwZWNpZnkgd2hldGhlciBhIGhhbmRsZXIgaXMgZm9yIGNsaWVudCBvciBzZXJ2ZXIsDQotICogeW91IGp1c3QgaGF2ZSB0byBjaGVjayBpbiB0aGUgaGFuZGxlTWVzc2FnZSBhbmQvb3IgaGFuZGxlRmF1bHQgdG8gbWFrZQ0KLSAqIHN1cmUgd2hhdCBkaXJlY3Rpb24gd2UncmUgZ29pbmcuDQotICovDQotDQotcHVibGljIGNsYXNzIEFkZE51bWJlcnNDbGllbnRMb2dpY2FsSGFuZGxlcjMgIGltcGxlbWVudHMgamF2YXgueG1sLndzLmhhbmRsZXIuTG9naWNhbEhhbmRsZXI8TG9naWNhbE1lc3NhZ2VDb250ZXh0PiB7DQotDQotICAgIEhhbmRsZXJUcmFja2VyIHRyYWNrZXIgPSBuZXcgSGFuZGxlclRyYWNrZXIoQWRkTnVtYmVyc0NsaWVudExvZ2ljYWxIYW5kbGVyMy5jbGFzcy5nZXRTaW1wbGVOYW1lKCkpOw0KLSAgICANCi0gICAgcHVibGljIHZvaWQgY2xvc2UoTWVzc2FnZUNvbnRleHQgbWVzc2FnZWNvbnRleHQpIHsNCi0gICAgICAgIHRyYWNrZXIuY2xvc2UoKTsgICAgICANCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYW5kbGVGYXVsdChMb2dpY2FsTWVzc2FnZUNvbnRleHQgbWVzc2FnZWNvbnRleHQpIHsNCi0gICAgICAgIEJvb2xlYW4gb3V0Ym91bmQgPSAoQm9vbGVhbikgbWVzc2FnZWNvbnRleHQuZ2V0KE1lc3NhZ2VDb250ZXh0Lk1FU1NBR0VfT1VUQk9VTkRfUFJPUEVSVFkpOw0KLSAgICAgICAgdHJhY2tlci5oYW5kbGVGYXVsdChvdXRib3VuZCk7DQotICAgICAgICAvLyBsZXQncyBzZWUgaWYgd2UgY2FuIGRvIHRoaXMNCi0gICAgICAgIExvZ2ljYWxNZXNzYWdlIGxtID0gbWVzc2FnZWNvbnRleHQuZ2V0TWVzc2FnZSgpOw0KLSAgICAgICAgU3RyaW5nIHMgPSBnZXRTdHJpbmdGcm9tU291cmNlUGF5bG9hZChsbS5nZXRQYXlsb2FkKCkpOw0KLSAgICAgICAgdHJhY2tlci5sb2coIlJFVFVSTklORyBGQUxTRSIsIG91dGJvdW5kKTsNCi0gICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYW5kbGVNZXNzYWdlKExvZ2ljYWxNZXNzYWdlQ29udGV4dCBtZXNzYWdlY29udGV4dCkgew0KLSAgICAgICAgQm9vbGVhbiBvdXRib3VuZCA9IChCb29sZWFuKSBtZXNzYWdlY29udGV4dC5nZXQoTWVzc2FnZUNvbnRleHQuTUVTU0FHRV9PVVRCT1VORF9QUk9QRVJUWSk7DQotICAgICAgICB0cmFja2VyLmhhbmRsZUZhdWx0KG91dGJvdW5kKTsNCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotICAgIA0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nRnJvbVNvdXJjZVBheWxvYWQoU291cmNlIHBheWxvYWQpIHsNCi0gICAgICAgIHRyeSB7DQotDQotICAgICAgICAgICAgVHJhbnNmb3JtZXJGYWN0b3J5IGZhY3RvcnkgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKTsNCi0gICAgICAgICAgICBUcmFuc2Zvcm1lciB0cmFucyA9IGZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsNCi0NCi0gICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsNCi0gICAgICAgICAgICBTdHJlYW1SZXN1bHQgcmVzdWx0ID0gbmV3IFN0cmVhbVJlc3VsdChiYW9zKTsNCi0NCi0gICAgICAgICAgICB0cmFucy5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLk9NSVRfWE1MX0RFQ0xBUkFUSU9OLCAieWVzIik7DQotICAgICAgICAgICAgdHJhbnMudHJhbnNmb3JtKHBheWxvYWQsIHJlc3VsdCk7DQotDQotICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoYmFvcy50b0J5dGVBcnJheSgpKTsNCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7DQotICAgICAgICB9DQotDQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hZGRudW1iZXJzaGFuZGxlci9BZGROdW1iZXJzQ2xpZW50TG9naWNhbEhhbmRsZXI0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FkZG51bWJlcnNoYW5kbGVyL0FkZE51bWJlcnNDbGllbnRMb2dpY2FsSGFuZGxlcjQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2UxMDY0NS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FkZG51bWJlcnNoYW5kbGVyL0FkZE51bWJlcnNDbGllbnRMb2dpY2FsSGFuZGxlcjQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLmFkZG51bWJlcnNoYW5kbGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmhhbmRsZXIuTG9naWNhbE1lc3NhZ2VDb250ZXh0Ow0KLQ0KLWltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5NZXNzYWdlQ29udGV4dDsNCi0NCi0vKg0KLSAqIFlvdSBjYW4ndCBhY3R1YWxseSBzcGVjaWZ5IHdoZXRoZXIgYSBoYW5kbGVyIGlzIGZvciBjbGllbnQgb3Igc2VydmVyLA0KLSAqIHlvdSBqdXN0IGhhdmUgdG8gY2hlY2sgaW4gdGhlIGhhbmRsZU1lc3NhZ2UgYW5kL29yIGhhbmRsZUZhdWx0IHRvIG1ha2UNCi0gKiBzdXJlIHdoYXQgZGlyZWN0aW9uIHdlJ3JlIGdvaW5nLg0KLSAqLw0KLQ0KLXB1YmxpYyBjbGFzcyBBZGROdW1iZXJzQ2xpZW50TG9naWNhbEhhbmRsZXI0ICBpbXBsZW1lbnRzIGphdmF4LnhtbC53cy5oYW5kbGVyLkxvZ2ljYWxIYW5kbGVyPExvZ2ljYWxNZXNzYWdlQ29udGV4dD4gew0KLQ0KLSAgICBIYW5kbGVyVHJhY2tlciB0cmFja2VyID0gbmV3IEhhbmRsZXJUcmFja2VyKEFkZE51bWJlcnNDbGllbnRMb2dpY2FsSGFuZGxlcjQuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpKTsNCi0NCi0gICAgcHVibGljIHZvaWQgY2xvc2UoTWVzc2FnZUNvbnRleHQgbWVzc2FnZWNvbnRleHQpIHsNCi0gICAgICAgIHRyYWNrZXIuY2xvc2UoKTsgICAgDQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaGFuZGxlRmF1bHQoTG9naWNhbE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2Vjb250ZXh0KSB7DQotICAgICAgICBCb29sZWFuIG91dGJvdW5kID0gKEJvb2xlYW4pIG1lc3NhZ2Vjb250ZXh0LmdldChNZXNzYWdlQ29udGV4dC5NRVNTQUdFX09VVEJPVU5EX1BST1BFUlRZKTsNCi0gICAgICAgIHRyYWNrZXIuaGFuZGxlRmF1bHQob3V0Ym91bmQpOw0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaGFuZGxlTWVzc2FnZShMb2dpY2FsTWVzc2FnZUNvbnRleHQgbWVzc2FnZWNvbnRleHQpIHsNCi0gICAgICAgIEJvb2xlYW4gb3V0Ym91bmQgPSAoQm9vbGVhbikgbWVzc2FnZWNvbnRleHQuZ2V0KE1lc3NhZ2VDb250ZXh0Lk1FU1NBR0VfT1VUQk9VTkRfUFJPUEVSVFkpOw0KLSAgICAgICAgdHJhY2tlci5oYW5kbGVNZXNzYWdlKG91dGJvdW5kKTsNCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotICAgIA0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FkZG51bWJlcnNoYW5kbGVyL0FkZE51bWJlcnNDbGllbnRQcm90b2NvbEhhbmRsZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkbnVtYmVyc2hhbmRsZXIvQWRkTnVtYmVyc0NsaWVudFByb3RvY29sSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTE5MGU3Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkbnVtYmVyc2hhbmRsZXIvQWRkTnVtYmVyc0NsaWVudFByb3RvY29sSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuYWRkbnVtYmVyc2hhbmRsZXI7DQotDQotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLk1lc3NhZ2VDb250ZXh0Ow0KLWltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5NZXNzYWdlQ29udGV4dC5TY29wZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuc29hcC5TT0FQTWVzc2FnZUNvbnRleHQ7DQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotDQotLyoNCi0gKiBZb3UgY2FuJ3QgYWN0dWFsbHkgc3BlY2lmeSB3aGV0aGVyIGEgaGFuZGxlciBpcyBmb3IgY2xpZW50IG9yIHNlcnZlciwNCi0gKiB5b3UganVzdCBoYXZlIHRvIGNoZWNrIGluIHRoZSBoYW5kbGVNZXNzYWdlIGFuZC9vciBoYW5kbGVGYXVsdCB0byBtYWtlDQotICogc3VyZSB3aGF0IGRpcmVjdGlvbiB3ZSdyZSBnb2luZy4NCi0gKi8NCi0NCi1wdWJsaWMgY2xhc3MgQWRkTnVtYmVyc0NsaWVudFByb3RvY29sSGFuZGxlciBpbXBsZW1lbnRzIGphdmF4LnhtbC53cy5oYW5kbGVyLnNvYXAuU09BUEhhbmRsZXI8U09BUE1lc3NhZ2VDb250ZXh0PiB7DQotDQotICAgIEhhbmRsZXJUcmFja2VyIHRyYWNrZXIgPSBuZXcgSGFuZGxlclRyYWNrZXIoQWRkTnVtYmVyc0NsaWVudFByb3RvY29sSGFuZGxlci5jbGFzcy5nZXRTaW1wbGVOYW1lKCkpOw0KLSAgICANCi0gICAgcHVibGljIHZvaWQgY2xvc2UoTWVzc2FnZUNvbnRleHQgbWVzc2FnZWNvbnRleHQpIHsNCi0gICAgICAgIHRyYWNrZXIuY2xvc2UoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYW5kbGVGYXVsdChTT0FQTWVzc2FnZUNvbnRleHQgbWVzc2FnZWNvbnRleHQpIHsNCi0gICAgICAgIEJvb2xlYW4gb3V0Ym91bmQgPSAoQm9vbGVhbikgbWVzc2FnZWNvbnRleHQuZ2V0KE1lc3NhZ2VDb250ZXh0Lk1FU1NBR0VfT1VUQk9VTkRfUFJPUEVSVFkpOw0KLSAgICAgICAgdHJhY2tlci5oYW5kbGVGYXVsdChvdXRib3VuZCk7DQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU2V0IGdldEhlYWRlcnMoKSB7DQotICAgICAgICB0cmFja2VyLmdldEhlYWRlcnMoKTsNCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGhhbmRsZU1lc3NhZ2UoU09BUE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2Vjb250ZXh0KSB7DQotICAgICAgICBCb29sZWFuIG91dGJvdW5kID0gKEJvb2xlYW4pIG1lc3NhZ2Vjb250ZXh0LmdldChNZXNzYWdlQ29udGV4dC5NRVNTQUdFX09VVEJPVU5EX1BST1BFUlRZKTsNCi0gICAgICAgIHRyYWNrZXIuaGFuZGxlTWVzc2FnZShvdXRib3VuZCk7DQotICAgICAgICBpZiAob3V0Ym91bmQpIHsNCi0NCi0gICAgICAgICAgICBTdHJpbmcgYXBwUHJvcDEgPSAiQWRkTnVtYmVyc0NsaWVudFByb3RvY29sSGFuZGxlck91dGJvdW5kQXBwU2NvcGVkUHJvcGVydHkiOw0KLSAgICAgICAgICAgIG1lc3NhZ2Vjb250ZXh0LnB1dChhcHBQcm9wMSwgIm15VmFsIik7DQotICAgICAgICAgICAgbWVzc2FnZWNvbnRleHQuc2V0U2NvcGUoYXBwUHJvcDEsIFNjb3BlLkFQUExJQ0FUSU9OKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBTdHJpbmcgYXBwUHJvcDIgPSAiQWRkTnVtYmVyc0NsaWVudFByb3RvY29sSGFuZGxlck91dGJvdW5kSGFuZGxlclNjb3BlZFByb3BlcnR5IjsNCi0gICAgICAgICAgICBtZXNzYWdlY29udGV4dC5wdXQoYXBwUHJvcDIsICJjbGllbnQgYXBwcyBjYW4ndCBzZWUgdGhpcyIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSB7ICAvLyBjbGllbnQgaW5ib3VuZCByZXNwb25zZQ0KLSAgICAgICAgICAgIFN0cmluZyBhcHBQcm9wMSA9ICJBZGROdW1iZXJzQ2xpZW50UHJvdG9jb2xIYW5kbGVySW5ib3VuZEFwcFNjb3BlZFByb3BlcnR5IjsNCi0gICAgICAgICAgICBtZXNzYWdlY29udGV4dC5wdXQoYXBwUHJvcDEsICJteVZhbCIpOw0KLSAgICAgICAgICAgIG1lc3NhZ2Vjb250ZXh0LnNldFNjb3BlKGFwcFByb3AxLCBTY29wZS5BUFBMSUNBVElPTik7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgU3RyaW5nIGFwcFByb3AyID0gIkFkZE51bWJlcnNDbGllbnRQcm90b2NvbEhhbmRsZXJJbmJvdW5kSGFuZGxlclNjb3BlZFByb3BlcnR5IjsNCi0gICAgICAgICAgICBtZXNzYWdlY29udGV4dC5wdXQoYXBwUHJvcDIsICJjbGllbnQgYXBwcyBjYW4ndCBzZWUgdGhpcyIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hZGRudW1iZXJzaGFuZGxlci9BZGROdW1iZXJzSGFuZGxlckZhdWx0X0V4Y2VwdGlvbi5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hZGRudW1iZXJzaGFuZGxlci9BZGROdW1iZXJzSGFuZGxlckZhdWx0X0V4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTE5OTE0Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkbnVtYmVyc2hhbmRsZXIvQWRkTnVtYmVyc0hhbmRsZXJGYXVsdF9FeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLQ0KLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLmFkZG51bWJlcnNoYW5kbGVyOw0KLQ0KLWltcG9ydCBvcmcudGVzdC5hZGRudW1iZXJzaGFuZGxlci5BZGROdW1iZXJzSGFuZGxlckZhdWx0Ow0KLQ0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViRmF1bHQ7DQotDQotDQotLyoqDQotICogVGhpcyBjbGFzcyB3YXMgZ2VuZXJhdGVkIGJ5IHRoZSBKQVhXUyBTSS4NCi0gKiBKQVgtV1MgUkkgMi4wXzAxLWIxNS1mY3MNCi0gKiBHZW5lcmF0ZWQgc291cmNlIHZlcnNpb246IDIuMA0KLSAqIA0KLSAqLw0KLUBXZWJGYXVsdChmYXVsdEJlYW49IiIsIG5hbWUgPSAiQWRkTnVtYmVyc0hhbmRsZXJGYXVsdCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vZHVrZS9vcmciKQ0KLXB1YmxpYyBjbGFzcyBBZGROdW1iZXJzSGFuZGxlckZhdWx0X0V4Y2VwdGlvbg0KLSAgICBleHRlbmRzIEV4Y2VwdGlvbg0KLXsNCi0NCi0gICAgLyoqDQotICAgICAqIEphdmEgdHlwZSB0aGF0IGdvZXMgYXMgc29hcGVudjpGYXVsdCBkZXRhaWwgZWxlbWVudC4NCi0gICAgICogDQotICAgICAqLw0KLSAgICBwcml2YXRlIEFkZE51bWJlcnNIYW5kbGVyRmF1bHQgZmF1bHRJbmZvOw0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSBmYXVsdEluZm8NCi0gICAgICogQHBhcmFtIG1lc3NhZ2UNCi0gICAgICovDQotICAgIHB1YmxpYyBBZGROdW1iZXJzSGFuZGxlckZhdWx0X0V4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgQWRkTnVtYmVyc0hhbmRsZXJGYXVsdCBmYXVsdEluZm8pIHsNCi0gICAgICAgIHN1cGVyKG1lc3NhZ2UpOw0KLSAgICAgICAgdGhpcy5mYXVsdEluZm8gPSBmYXVsdEluZm87DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gZmF1bHRJbmZvDQotICAgICAqIEBwYXJhbSBtZXNzYWdlDQotICAgICAqIEBwYXJhbSBjYXVzZQ0KLSAgICAgKi8NCi0gICAgcHVibGljIEFkZE51bWJlcnNIYW5kbGVyRmF1bHRfRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBBZGROdW1iZXJzSGFuZGxlckZhdWx0IGZhdWx0SW5mbywgVGhyb3dhYmxlIGNhdXNlKSB7DQotICAgICAgICBzdXBlcihtZXNzYWdlLCBjYXVzZSk7DQotICAgICAgICB0aGlzLmZhdWx0SW5mbyA9IGZhdWx0SW5mbzsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgZmF1bHQgYmVhbjogZHVrZS5vcmcuQWRkTnVtYmVyc0hhbmRsZXJGYXVsdA0KLSAgICAgKi8NCi0gICAgcHVibGljIEFkZE51bWJlcnNIYW5kbGVyRmF1bHQgZ2V0RmF1bHRJbmZvKCkgew0KLSAgICAgICAgcmV0dXJuIGZhdWx0SW5mbzsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FkZG51bWJlcnNoYW5kbGVyL0FkZE51bWJlcnNIYW5kbGVyUG9ydFR5cGUuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkbnVtYmVyc2hhbmRsZXIvQWRkTnVtYmVyc0hhbmRsZXJQb3J0VHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzRhYmNkLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkbnVtYmVyc2hhbmRsZXIvQWRkTnVtYmVyc0hhbmRsZXJQb3J0VHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotDQotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuYWRkbnVtYmVyc2hhbmRsZXI7DQotDQotaW1wb3J0IG9yZy50ZXN0LmFkZG51bWJlcnNoYW5kbGVyLkFkZE51bWJlcnNIYW5kbGVyUmVzcG9uc2U7DQotDQotaW1wb3J0IGphdmF4Lmp3cy5PbmV3YXk7DQotaW1wb3J0IGphdmF4Lmp3cy5XZWJNZXRob2Q7DQotaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbTsNCi1pbXBvcnQgamF2YXguandzLldlYlJlc3VsdDsNCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5Bc3luY0hhbmRsZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5SZXF1ZXN0V3JhcHBlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLlJlc3BvbnNlV3JhcHBlcjsNCi1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOw0KLQ0KLQ0KLQ0KLS8qKg0KLSAqIFRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBieSB0aGUgSkFYV1MgU0kuDQotICogSkFYLVdTIFJJIDIuMF8wMS1iMTUtZmNzDQotICogR2VuZXJhdGVkIHNvdXJjZSB2ZXJzaW9uOiAyLjANCi0gKiANCi0gKi8NCi1AV2ViU2VydmljZShuYW1lID0gIkFkZE51bWJlcnNIYW5kbGVyUG9ydFR5cGUiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L2FkZG51bWJlcnNoYW5kbGVyIikNCi0vL0BIYW5kbGVyQ2hhaW4oZmlsZT0iTUVUQS1JTkYvQWRkTnVtYmVyc0NsaWVudEhhbmRsZXJzLnhtbCIsIG5hbWU9IiIpDQotcHVibGljIGludGVyZmFjZSBBZGROdW1iZXJzSGFuZGxlclBvcnRUeXBlIHsNCi0NCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gYXJnMQ0KLSAgICAgKiBAcGFyYW0gYXJnMA0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIGludA0KLSAgICAgKiBAdGhyb3dzIEFkZE51bWJlcnNIYW5kbGVyRmF1bHRfRXhjZXB0aW9uDQotICAgICAqLw0KLSAgICBAV2ViTWV0aG9kDQotICAgIEBXZWJSZXN1bHQodGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9hZGRudW1iZXJzaGFuZGxlciIpDQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAiYWRkTnVtYmVyc0hhbmRsZXIiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L2FkZG51bWJlcnNoYW5kbGVyIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LmFkZG51bWJlcnNoYW5kbGVyLkFkZE51bWJlcnNIYW5kbGVyIikNCi0gICAgQFJlc3BvbnNlV3JhcHBlcihsb2NhbE5hbWUgPSAiYWRkTnVtYmVyc0hhbmRsZXJSZXNwb25zZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL3Rlc3QvYWRkbnVtYmVyc2hhbmRsZXIiLCBjbGFzc05hbWUgPSAib3JnLnRlc3QuYWRkbnVtYmVyc2hhbmRsZXIuQWRkTnVtYmVyc0hhbmRsZXJSZXNwb25zZSIpDQotICAgIHB1YmxpYyBpbnQgYWRkTnVtYmVyc0hhbmRsZXIoDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJhcmcwIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9hZGRudW1iZXJzaGFuZGxlciIpDQotICAgICAgICBpbnQgYXJnMCwNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImFyZzEiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L2FkZG51bWJlcnNoYW5kbGVyIikNCi0gICAgICAgIGludCBhcmcxKQ0KLSAgICAgICAgdGhyb3dzIEFkZE51bWJlcnNIYW5kbGVyRmF1bHRfRXhjZXB0aW9uDQotICAgIDsNCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gYXN5bmNIYW5kbGVyDQotICAgICAqIEBwYXJhbSBhcmcwDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlPD8gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Pg0KLSAgICAgKi8NCi0gICAgQFdlYk1ldGhvZA0KLSAgICBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gImFkZE51bWJlcnNIYW5kbGVyIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9hZGRudW1iZXJzaGFuZGxlciIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5hZGRudW1iZXJzaGFuZGxlci5BZGROdW1iZXJzSGFuZGxlciIpDQotICAgIEBSZXNwb25zZVdyYXBwZXIobG9jYWxOYW1lID0gImFkZE51bWJlcnNIYW5kbGVyUmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L2FkZG51bWJlcnNoYW5kbGVyIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LmFkZG51bWJlcnNoYW5kbGVyLkFkZE51bWJlcnNIYW5kbGVyUmVzcG9uc2UiKQ0KLSAgICBwdWJsaWMgRnV0dXJlPD8+IGFkZE51bWJlcnNIYW5kbGVyQXN5bmMoDQotICAgICAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiYXJnMCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL3Rlc3QvYWRkbnVtYmVyc2hhbmRsZXIiKQ0KLSAgICAgICAgICAgIGludCBhcmcwLA0KLSAgICAgICAgICAgIEBXZWJQYXJhbShuYW1lID0gImFyZzEiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L2FkZG51bWJlcnNoYW5kbGVyIikNCi0gICAgICAgICAgICBpbnQgYXJnMSwNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImFzeW5jSGFuZGxlciIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQ0KLSAgICAgICAgQXN5bmNIYW5kbGVyPEFkZE51bWJlcnNIYW5kbGVyUmVzcG9uc2U+IGFzeW5jSGFuZGxlcik7DQotDQotICAgIA0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSBhcmcwDQotICAgICAqLw0KLSAgICBAV2ViTWV0aG9kDQotICAgIEBPbmV3YXkNCi0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJvbmVXYXlJbnQiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L2FkZG51bWJlcnNoYW5kbGVyIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LmFkZG51bWJlcnNoYW5kbGVyLk9uZVdheUludCIpDQotICAgIHB1YmxpYyB2b2lkIG9uZVdheUludCgNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImFyZzAiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L2FkZG51bWJlcnNoYW5kbGVyIikNCi0gICAgICAgIGludCBhcmcwKTsNCi0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hZGRudW1iZXJzaGFuZGxlci9BZGROdW1iZXJzSGFuZGxlclBvcnRUeXBlSW1wbC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hZGRudW1iZXJzaGFuZGxlci9BZGROdW1iZXJzSGFuZGxlclBvcnRUeXBlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDBmMWE2Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkbnVtYmVyc2hhbmRsZXIvQWRkTnVtYmVyc0hhbmRsZXJQb3J0VHlwZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5hZGRudW1iZXJzaGFuZGxlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5UZXN0TG9nZ2VyOw0KLWltcG9ydCBvcmcudGVzdC5hZGRudW1iZXJzaGFuZGxlci5BZGROdW1iZXJzSGFuZGxlckZhdWx0Ow0KLWltcG9ydCBvcmcudGVzdC5hZGRudW1iZXJzaGFuZGxlci5BZGROdW1iZXJzSGFuZGxlclJlc3BvbnNlOw0KLQ0KLQ0KLWltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlJlc291cmNlOw0KLWltcG9ydCBqYXZheC5qd3MuSGFuZGxlckNoYWluOw0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLkFzeW5jSGFuZGxlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VDb250ZXh0Ow0KLWltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5NZXNzYWdlQ29udGV4dDsNCi1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOw0KLQ0KLQ0KLUBXZWJTZXJ2aWNlKHNlcnZpY2VOYW1lPSJBZGROdW1iZXJzSGFuZGxlclNlcnZpY2UiLGVuZHBvaW50SW50ZXJmYWNlPSJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5hZGRudW1iZXJzaGFuZGxlci5BZGROdW1iZXJzSGFuZGxlclBvcnRUeXBlIikNCi1ASGFuZGxlckNoYWluKGZpbGUgPSAiQWRkTnVtYmVyc0hhbmRsZXJzLnhtbCIsIG5hbWUgPSAiIikNCi1wdWJsaWMgY2xhc3MgQWRkTnVtYmVyc0hhbmRsZXJQb3J0VHlwZUltcGwgaW1wbGVtZW50cyBBZGROdW1iZXJzSGFuZGxlclBvcnRUeXBlIHsNCi0NCi0gICAgcHJpdmF0ZSBXZWJTZXJ2aWNlQ29udGV4dCBjdHg7DQotICAgIA0KLSAgICAvKiAobm9uLUphdmFkb2MpDQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuYWRkbnVtYmVyc2hhbmRsZXIuQWRkTnVtYmVyc0hhbmRsZXJQb3J0VHlwZSNhZGROdW1iZXJzSGFuZGxlcihpbnQsIGludCkNCi0gICAgICovDQotICAgIHB1YmxpYyBpbnQgYWRkTnVtYmVyc0hhbmRsZXIoaW50IGFyZzAsIGludCBhcmcxKSB0aHJvd3MgQWRkTnVtYmVyc0hhbmRsZXJGYXVsdF9FeGNlcHRpb24gew0KLQ0KLSAgICAgICAgLyogRklYTUU6IGdldEhlYWRlcnMoKSBpcyBjdXJyZW50bHkgbm90IGNhbGxlZA0KLQkgICAgaWYgKCF0cmFja2VyLmlzQ2FsbGVkKEhhbmRsZXJUcmFja2VyLk1ldGhvZHMuR0VUX0hFQURFUlMpKSB7DQotCSAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImdldEhlYWRlcnMoKSB3YXMgbm90IGNhbGxlZCBvbiB0aGUgaGFuZGxlciIpOw0KLQkgICAgfQ0KLSAgICAgICAgICovDQotDQotICAgICAgICAvLyBmb3IgdGhlc2UgcHJvcGVydGllcyB0ZXN0cyB0byBhbHdheXMgcGFzcywgYW4gaW5ib3VuZCBzZXJ2ZXItc2lkZSBoYW5kbGVyIG11c3QgInB1dCIgdGhlbQ0KLSAgICAgICAgTWVzc2FnZUNvbnRleHQgbWMgPSBjdHguZ2V0TWVzc2FnZUNvbnRleHQoKTsNCi0gICAgICAgIFN0cmluZyBwcm9wS2V5MSA9ICJBZGROdW1iZXJzTG9naWNhbEhhbmRsZXJJbmJvdW5kQXBwU2NvcGVkUHJvcGVydHkiOw0KLSAgICAgICAgU3RyaW5nIHByb3BLZXkyID0gIkFkZE51bWJlcnNMb2dpY2FsSGFuZGxlckluYm91bmRIYW5kbGVyU2NvcGVkUHJvcGVydHkiOw0KLSAgICAgICAgU3RyaW5nIHZhbHVlID0gKFN0cmluZyltYy5nZXQocHJvcEtleTEpOw0KLSAgICAgICAgaWYgKHZhbHVlID09IG51bGwpDQotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlByb3BlcnR5IHZhbHVlIGZvciBrZXkgXCIiICsgcHJvcEtleTEgKyAiXCIgd2FzIG51bGwsIGJ1dCBpcyBBUFBMSUNBVElPTiBzY29wZWQgYW5kIHNob3VsZCBiZSBhY2Nlc3NpYmxlIGJ5IHRoZSBlbmRwb2ludCIpOw0KLSAgICAgICAgaWYgKG1jLmNvbnRhaW5zS2V5KHByb3BLZXkyKSkgIC8vIGluc3RlYWQgb2YgImdldCIsIHVzZSAiY29udGFpbnNLZXkiIHRvIGJlIGEgbGl0dGxlIG1vcmUgcm9idXN0IGluIHRlc3RpbmcNCi0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiTWVzc2FnZUNvbnRleHQuY29udGFpbnNLZXkgcmVwb3J0ZWQgdHJ1ZSBmb3Iga2V5IFwiIiArIHByb3BLZXkyICsgIlwiIHdhcyBub3QgbnVsbC4gIFRoaXMgcHJvcGVydHkgaXMgSEFORExFUiBzY29wZWQgYW5kIHNob3VsZCBub3QgYmUgYWNjZXNzaWJsZSBieSB0aGUgZW5kcG9pbnQiKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBSZWNlaXZlZCBhZGROdW1iZXJzSGFuZGxlciByZXF1ZXN0IGZvciAiICsgYXJnMCArICIgYW5kICIgKyBhcmcxKTsNCi0gICAgICAgIGlmIChhcmcwID09IDEwMSkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJHb3QgdmFsdWUgMTAxLiAgIiArDQotICAgICAgICAgICAgICAgICAgICAgICAgIkFkZE51bWJlcnNIYW5kbGVyUG9ydFR5cGVJbXBsLmFkZE51bWJlcnNIYW5kbGVyIG1ldGhvZCBpcyAiICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAiY29ycmVjdGx5IHRocm93aW5nIHRoaXMgZXhjZXB0aW9uIGFzIHBhcnQgb2YgdGVzdGluZyIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICBsb25nIHN1bSA9IChsb25nKSBhcmcwICsgKGxvbmcpIGFyZzE7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gU3VtIGlzICIgKyBzdW0pOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IE1BWF9WQUxVRSBpcyAiICsgSW50ZWdlci5NQVhfVkFMVUUpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IE1JTl9WQUxVRSBpcyAiICsgSW50ZWdlci5NSU5fVkFMVUUpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBGb3IgdGVzdGluZyBwdXJwb3NlcywgYW4gb3ZlcmZsb3cgdHJpZ2dlcnMgYW4gYXBwbGljYXRpb24gZXhjZXB0aW9uIEFkZE51bWJlcnNIYW5kbGVyUG9ydFR5cGUNCi0gICAgICAgIC8vIEZvciB0ZXN0aW5nIHB1cnBvc2VzLCBhbiB1bmRlcmZsb3cgdHJpZ2dlcnMgYW4gTlBFLg0KLSAgICAgICAgaWYgKHN1bSA+IEludGVnZXIuTUFYX1ZBTFVFKSB7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIk92ZXJmbG93IGRldGVjdGVkLiAgVGhyb3dpbmcgQWRkTnVtYmVyc0hhbmRsZXJGYXVsdCIpOw0KLSAgICAgICAgICAgIEFkZE51bWJlcnNIYW5kbGVyRmF1bHQgZmF1bHRJbmZvID0gbmV3IEFkZE51bWJlcnNIYW5kbGVyRmF1bHQoKTsNCi0gICAgICAgICAgICBmYXVsdEluZm8uc2V0RmF1bHRJbmZvKCJvdmVyZmxvdyIpOw0KLSAgICAgICAgICAgIGZhdWx0SW5mby5zZXRNZXNzYWdlKCJvdmVyZmxvdyIpOw0KLSAgICAgICAgICAgIHRocm93IG5ldyBBZGROdW1iZXJzSGFuZGxlckZhdWx0X0V4Y2VwdGlvbigib3ZlcmZsb3ciLCBmYXVsdEluZm8pOw0KLSAgICAgICAgfSBlbHNlIGlmIChzdW0gPCBJbnRlZ2VyLk1JTl9WQUxVRSkgew0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJVbmRlcmZsb3cgZGV0ZWN0ZWQuICBUaHJvd2luZyBOdWxsUG9pbnRlckV4Y2VwdGlvbiIpOw0KLSAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigidW5kZXJmbG93Iik7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gKGludCkgc3VtOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBGdXR1cmU8Pz4gYWRkTnVtYmVyc0hhbmRsZXJBc3luYyhpbnQgYXJnMCwgaW50IGFyZzEsIEFzeW5jSGFuZGxlcjxBZGROdW1iZXJzSGFuZGxlclJlc3BvbnNlPiBhc3luY0hhbmRsZXIpIHsNCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotDQotDQotCS8qIChub24tSmF2YWRvYykNCi0JICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5hZGRudW1iZXJzaGFuZGxlci5BZGROdW1iZXJzSGFuZGxlclBvcnRUeXBlI29uZVdheUludChpbnQpDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBvbmVXYXlJbnQoaW50IGFyZzApIHsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBSZWNlaXZlZCBvbmUtd2F5IHJlcXVlc3QuIik7DQotICAgICAgICByZXR1cm47DQotCX0NCi0gICAgDQotICAgIEBSZXNvdXJjZQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRDdHgoV2ViU2VydmljZUNvbnRleHQgY3R4KSB7DQotICAgICAgICB0aGlzLmN0eCA9IGN0eDsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FkZG51bWJlcnNoYW5kbGVyL0FkZE51bWJlcnNIYW5kbGVyU2VydmljZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hZGRudW1iZXJzaGFuZGxlci9BZGROdW1iZXJzSGFuZGxlclNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGUzMGI1Ni4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FkZG51bWJlcnNoYW5kbGVyL0FkZE51bWJlcnNIYW5kbGVyU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotDQotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuYWRkbnVtYmVyc2hhbmRsZXI7DQotDQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViRW5kcG9pbnQ7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlQ2xpZW50Ow0KLWltcG9ydCBqYXZhLmlvLkZpbGU7DQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLQ0KLS8qKg0KLSAqIFRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBieSB0aGUgSkFYV1MgU0kuDQotICogSkFYLVdTIFJJIDIuMF8wMS1iMTUtZmNzDQotICogR2VuZXJhdGVkIHNvdXJjZSB2ZXJzaW9uOiAyLjANCi0gKiANCi0gKi8NCi1AV2ViU2VydmljZUNsaWVudChuYW1lID0gIkFkZE51bWJlcnNIYW5kbGVyU2VydmljZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL3Rlc3QvYWRkbnVtYmVyc2hhbmRsZXIiLCB3c2RsTG9jYXRpb24gPSAiQWRkTnVtYmVyc0hhbmRsZXIxLndzZGwiKQ0KLXB1YmxpYyBjbGFzcyBBZGROdW1iZXJzSGFuZGxlclNlcnZpY2UNCi0gICAgZXh0ZW5kcyBTZXJ2aWNlDQotew0KLQ0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBVUkwgQURETlVNQkVSU1NFUlZJQ0VfV1NETF9MT0NBVElPTjsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHdzZGxMb2NhdGlvbj0iL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkbnVtYmVyc2hhbmRsZXIvTUVUQS1JTkYvQWRkTnVtYmVyc0hhbmRsZXIud3NkbCI7DQotICAgIHN0YXRpYyB7DQotICAgICAgICBVUkwgdXJsID0gbnVsbDsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAJdHJ5ew0KLQkgICAgICAgIAlTdHJpbmcgYmFzZURpciA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiYmFzZWRpciIsIi4iKSkuZ2V0Q2Fub25pY2FsUGF0aCgpOw0KLQkgICAgICAgIAl3c2RsTG9jYXRpb24gPSBuZXcgRmlsZShiYXNlRGlyICsgd3NkbExvY2F0aW9uKS5nZXRBYnNvbHV0ZVBhdGgoKTsNCi0gICAgICAgIAl9Y2F0Y2goRXhjZXB0aW9uIGUpew0KLSAgICAgICAgCQllLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgCX0NCi0gICAgICAgIAlGaWxlIGZpbGUgPSBuZXcgRmlsZSh3c2RsTG9jYXRpb24pOw0KLSAgICAgICAgCXVybCA9IGZpbGUudG9VUkwoKTsNCi0gICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIEFERE5VTUJFUlNTRVJWSUNFX1dTRExfTE9DQVRJT04gPSB1cmw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEFkZE51bWJlcnNIYW5kbGVyU2VydmljZShVUkwgd3NkbExvY2F0aW9uLCBRTmFtZSBzZXJ2aWNlTmFtZSkgew0KLSAgICAgICAgc3VwZXIod3NkbExvY2F0aW9uLCBzZXJ2aWNlTmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEFkZE51bWJlcnNIYW5kbGVyU2VydmljZSgpIHsNCi0gICAgICAgIHN1cGVyKEFERE5VTUJFUlNTRVJWSUNFX1dTRExfTE9DQVRJT04sIG5ldyBRTmFtZSgiaHR0cDovL29yZy90ZXN0L2FkZG51bWJlcnNoYW5kbGVyIiwgIkFkZE51bWJlcnNIYW5kbGVyU2VydmljZSIpKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgQWRkTnVtYmVyc0hhbmRsZXJQb3J0VHlwZQ0KLSAgICAgKi8NCi0gICAgQFdlYkVuZHBvaW50KG5hbWUgPSAiQWRkTnVtYmVyc0hhbmRsZXJQb3J0IikNCi0gICAgcHVibGljIEFkZE51bWJlcnNIYW5kbGVyUG9ydFR5cGUgZ2V0QWRkTnVtYmVyc0hhbmRsZXJQb3J0KCkgew0KLSAgICAgICAgcmV0dXJuIChBZGROdW1iZXJzSGFuZGxlclBvcnRUeXBlKXN1cGVyLmdldFBvcnQobmV3IFFOYW1lKCJodHRwOi8vb3JnL3Rlc3QvYWRkbnVtYmVyc2hhbmRsZXIiLCAiQWRkTnVtYmVyc0hhbmRsZXJQb3J0IiksIEFkZE51bWJlcnNIYW5kbGVyUG9ydFR5cGUuY2xhc3MpOw0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkbnVtYmVyc2hhbmRsZXIvQWRkTnVtYmVyc0hhbmRsZXJzLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkbnVtYmVyc2hhbmRsZXIvQWRkTnVtYmVyc0hhbmRsZXJzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRhNzVjNi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FkZG51bWJlcnNoYW5kbGVyL0FkZE51bWJlcnNIYW5kbGVycy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLQ0KLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTxqd3M6aGFuZGxlci1jaGFpbnMgeG1sbnM6andzPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiPg0KLQ0KLQk8andzOmhhbmRsZXItY2hhaW4gbmFtZT0iTG9nZ2luZ0hhbmRsZXJDaGFpbiI+DQotCQk8andzOnByb3RvY29sLWJpbmRpbmdzPiMjU09BUDExX0hUVFAgIyNzb21ldGhpbmcgYmxhcmc8L2p3czpwcm90b2NvbC1iaW5kaW5ncz4NCi0JCTxqd3M6cG9ydC1uYW1lLXBhdHRlcm4gDQotICAgICAgICAgICAgICB4bWxuczpuczE9Imh0dHA6Ly9hZGRudW1iZXJzaGFuZGxlci5zYW1wbGUuamF4d3MuYXhpczIuYXBhY2hlLm9yZy8iPm5zMTpBZGROdW1iZXJzSGFuZGxlclAqPC9qd3M6cG9ydC1uYW1lLXBhdHRlcm4+DQotICAgICAgICA8andzOnNlcnZpY2UtbmFtZS1wYXR0ZXJuIA0KLSAgICAgICAgICAgICAgeG1sbnM6bnMxPSJodHRwOi8vYWRkbnVtYmVyc2hhbmRsZXIuc2FtcGxlLmpheHdzLmF4aXMyLmFwYWNoZS5vcmcvIj5uczE6KjwvandzOnNlcnZpY2UtbmFtZS1wYXR0ZXJuPg0KLQkJPGp3czpoYW5kbGVyPg0KLQkJCTxqd3M6aGFuZGxlci1jbGFzcz5vcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5hZGRudW1iZXJzaGFuZGxlci5BZGROdW1iZXJzTG9naWNhbEhhbmRsZXI8L2p3czpoYW5kbGVyLWNsYXNzPg0KLQkJPC9qd3M6aGFuZGxlcj4NCi0JCTxqd3M6aGFuZGxlcj4NCi0JCQk8andzOmhhbmRsZXItY2xhc3M+b3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuYWRkbnVtYmVyc2hhbmRsZXIuQWRkTnVtYmVyc1Byb3RvY29sSGFuZGxlcjI8L2p3czpoYW5kbGVyLWNsYXNzPg0KLQkJPC9qd3M6aGFuZGxlcj4NCi0JCTxqd3M6aGFuZGxlcj4NCi0JCQk8andzOmhhbmRsZXItY2xhc3M+b3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuYWRkbnVtYmVyc2hhbmRsZXIuQWRkTnVtYmVyc0xvZ2ljYWxIYW5kbGVyMjwvandzOmhhbmRsZXItY2xhc3M+DQotCQk8L2p3czpoYW5kbGVyPg0KLQkJPGp3czpoYW5kbGVyPg0KLQkJCTxqd3M6aGFuZGxlci1jbGFzcz5vcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5hZGRudW1iZXJzaGFuZGxlci5BZGROdW1iZXJzUHJvdG9jb2xIYW5kbGVyPC9qd3M6aGFuZGxlci1jbGFzcz4NCi0JCTwvandzOmhhbmRsZXI+DQotCTwvandzOmhhbmRsZXItY2hhaW4+DQotCQ0KLTwvandzOmhhbmRsZXItY2hhaW5zPg0KLQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkbnVtYmVyc2hhbmRsZXIvQWRkTnVtYmVyc0xvZ2ljYWxIYW5kbGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FkZG51bWJlcnNoYW5kbGVyL0FkZE51bWJlcnNMb2dpY2FsSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWE3YWZkLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkbnVtYmVyc2hhbmRsZXIvQWRkTnVtYmVyc0xvZ2ljYWxIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5hZGRudW1iZXJzaGFuZGxlcjsNCi0NCi1pbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuTWVzc2FnZUNvbnRleHQ7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaGFuZGxlci5Mb2dpY2FsTWVzc2FnZUNvbnRleHQ7DQotDQotcHVibGljIGNsYXNzIEFkZE51bWJlcnNMb2dpY2FsSGFuZGxlciANCi1pbXBsZW1lbnRzIGphdmF4LnhtbC53cy5oYW5kbGVyLkxvZ2ljYWxIYW5kbGVyPExvZ2ljYWxNZXNzYWdlQ29udGV4dD4gew0KLSAgICANCi0gICAgSGFuZGxlclRyYWNrZXIgdHJhY2tlciA9IG5ldyBIYW5kbGVyVHJhY2tlcihBZGROdW1iZXJzTG9naWNhbEhhbmRsZXIuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpKTsNCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIGNsb3NlKE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2Vjb250ZXh0KSB7DQotICAgICAgICB0cmFja2VyLmNsb3NlKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaGFuZGxlRmF1bHQoTG9naWNhbE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2Vjb250ZXh0KSB7DQotICAgICAgICBCb29sZWFuIG91dGJvdW5kID0gKEJvb2xlYW4pIG1lc3NhZ2Vjb250ZXh0LmdldChNZXNzYWdlQ29udGV4dC5NRVNTQUdFX09VVEJPVU5EX1BST1BFUlRZKTsNCi0gICAgICAgIHRyYWNrZXIuaGFuZGxlRmF1bHQob3V0Ym91bmQpOw0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaGFuZGxlTWVzc2FnZShMb2dpY2FsTWVzc2FnZUNvbnRleHQgbWVzc2FnZWNvbnRleHQpIHsNCi0gICAgICAgIEJvb2xlYW4gb3V0Ym91bmQgPSAoQm9vbGVhbikgbWVzc2FnZWNvbnRleHQuZ2V0KE1lc3NhZ2VDb250ZXh0Lk1FU1NBR0VfT1VUQk9VTkRfUFJPUEVSVFkpOw0KLSAgICAgICAgdHJhY2tlci5oYW5kbGVNZXNzYWdlKG91dGJvdW5kKTsNCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotICAgIA0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FkZG51bWJlcnNoYW5kbGVyL0FkZE51bWJlcnNMb2dpY2FsSGFuZGxlcjIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkbnVtYmVyc2hhbmRsZXIvQWRkTnVtYmVyc0xvZ2ljYWxIYW5kbGVyMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGRiYTg3Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkbnVtYmVyc2hhbmRsZXIvQWRkTnVtYmVyc0xvZ2ljYWxIYW5kbGVyMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLmFkZG51bWJlcnNoYW5kbGVyOw0KLQ0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5TdHJpbmdCdWZmZXJJbnB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsNCi0NCi1pbXBvcnQgamF2YXguYW5ub3RhdGlvbi5Qb3N0Q29uc3RydWN0Ow0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLk91dHB1dEtleXM7DQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOw0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyOw0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeTsNCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0Ow0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1Tb3VyY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5Mb2dpY2FsTWVzc2FnZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLlByb3RvY29sRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5NZXNzYWdlQ29udGV4dDsNCi1pbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuTWVzc2FnZUNvbnRleHQuU2NvcGU7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaGFuZGxlci5BdHRhY2htZW50c0FkYXB0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaGFuZGxlci5Mb2dpY2FsTWVzc2FnZUNvbnRleHQ7DQotDQotcHVibGljIGNsYXNzIEFkZE51bWJlcnNMb2dpY2FsSGFuZGxlcjIgaW1wbGVtZW50cyBqYXZheC54bWwud3MuaGFuZGxlci5Mb2dpY2FsSGFuZGxlcjxMb2dpY2FsTWVzc2FnZUNvbnRleHQ+IHsNCi0NCi0gICAgcHJpdmF0ZSBpbnQgZGVkdWN0aW9uID0gMTsNCi0gICAgDQotICAgIEhhbmRsZXJUcmFja2VyIHRyYWNrZXIgPSBuZXcgSGFuZGxlclRyYWNrZXIoQWRkTnVtYmVyc0xvZ2ljYWxIYW5kbGVyMi5jbGFzcy5nZXRTaW1wbGVOYW1lKCkpOw0KLSAgICANCi0gICAgQFBvc3RDb25zdHJ1Y3QNCi0gICAgcHVibGljIHZvaWQgcG9zdENvbnN0cnVjdCgpIHsNCi0gICAgICAgIHRyYWNrZXIucG9zdENvbnN0cnVjdCgpOw0KLSAgICAgICAgZGVkdWN0aW9uID0gMjsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIHZvaWQgY2xvc2UoTWVzc2FnZUNvbnRleHQgbWVzc2FnZWNvbnRleHQpIHsNCi0gICAgICAgIHRyYWNrZXIuY2xvc2UoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYW5kbGVGYXVsdChMb2dpY2FsTWVzc2FnZUNvbnRleHQgbWVzc2FnZWNvbnRleHQpIHsNCi0gICAgICAgIEJvb2xlYW4gb3V0Ym91bmQgPSAoQm9vbGVhbikgbWVzc2FnZWNvbnRleHQuZ2V0KE1lc3NhZ2VDb250ZXh0Lk1FU1NBR0VfT1VUQk9VTkRfUFJPUEVSVFkpOw0KLSAgICAgICAgdHJhY2tlci5oYW5kbGVGYXVsdChvdXRib3VuZCk7DQotICAgICAgICBpZiAob3V0Ym91bmQpIHsgIC8vIG91dGJvdW5kIHJlc3BvbnNlIGlmIHdlJ3JlIG9uIHRoZSBzZXJ2ZXINCi0gICAgICAgICAgICBMb2dpY2FsTWVzc2FnZSBtc2cgPSBtZXNzYWdlY29udGV4dC5nZXRNZXNzYWdlKCk7DQotICAgICAgICAgICAgU3RyaW5nIHN0ID0gZ2V0U3RyaW5nRnJvbVNvdXJjZVBheWxvYWQobXNnLmdldFBheWxvYWQoKSk7DQotICAgICAgICAgICAgc3QgPSBzdC5yZXBsYWNlRmlyc3QoImJsYXJnIiwgIkFkZE51bWJlcnNMb2dpY2FsSGFuZGxlcjIgd2FzIGhlcmUiKTsNCi0gICAgICAgICAgICBtc2cuc2V0UGF5bG9hZChuZXcgU3RyZWFtU291cmNlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShzdC5nZXRCeXRlcygpKSkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogdGhpcyB0ZXN0IGhhbmRsZU1lc3NhZ2UgbWV0aG9kIGlzIG9idmlvdXNseSBub3Qgd2hhdCBhIGN1c3RvbWVyIG1pZ2h0IHdyaXRlLCBidXQgaXQgZG9lcw0KLSAgICAgKiB0aGUgdHJpY2sgZm9yIGtpY2tpbmcgdGhlIHRpcmVzIGluIHRoZSBoYW5kbGVyIGZyYW1ld29yay4gIFRoZSBBZGROdW1iZXJzIHNlcnZpY2UgdGFrZXMgdHdvDQotICAgICAqIGludHMgYXMgaW5jb21pbmcgcGFyYW1zLCBhZGRzIHRoZW0sIGFuZCByZXR1cm5zIHRoZSBzdW0uICBUaGlzIG1ldGhvZCBzdWJ0cmFjdHMgMSBmcm9tIHRoZSANCi0gICAgICogZmlyc3QgaW50IG9uIHRoZSBpbmJvdW5kIHJlcXVlc3QsIGFuZCBzdWJ0cmFjdHMgImRlZHVjdGlvbiIgZnJvbSB0aGUgaW50IG9uIHRoZSBvdXRib3VuZA0KLSAgICAgKiByZXNwb25zZS4gIFNvIHRoZSBjbGllbnQgYXBwIHNob3VsZCBleHBlY3QgYSBzdW0gMyBsZXNzIHRoYW4gYSBzdW0gd2l0aCB0aGlzIGhhbmRsZXIgDQotICAgICAqIG1hbmlwdWxhdGluZyB0aGUgU09BUCBtZXNzYWdlLg0KLSAgICAgKi8NCi0gICAgcHVibGljIGJvb2xlYW4gaGFuZGxlTWVzc2FnZShMb2dpY2FsTWVzc2FnZUNvbnRleHQgbWVzc2FnZWNvbnRleHQpIHsNCi0gICAgICAgIEJvb2xlYW4gb3V0Ym91bmQgPSAoQm9vbGVhbiltZXNzYWdlY29udGV4dC5nZXQoTWVzc2FnZUNvbnRleHQuTUVTU0FHRV9PVVRCT1VORF9QUk9QRVJUWSk7DQotICAgICAgICB0cmFja2VyLmhhbmRsZU1lc3NhZ2Uob3V0Ym91bmQpOw0KLSAgICAgICAgaWYgKCFvdXRib3VuZCkgeyAgLy8gaW5ib3VuZCByZXF1ZXN0IGlmIHdlJ3JlIG9uIHRoZSBzZXJ2ZXINCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBMb2dpY2FsTWVzc2FnZSBtc2cgPSBtZXNzYWdlY29udGV4dC5nZXRNZXNzYWdlKCk7DQotICAgICAgICAgICAgU3RyaW5nIHN0ID0gZ2V0U3RyaW5nRnJvbVNvdXJjZVBheWxvYWQobXNnLmdldFBheWxvYWQoKSk7DQotICAgICAgICAgICAgaWYgKHN0LmNvbnRhaW5zKCI8YXJnMD45OTwvYXJnMD4iKSkgew0KLSAgICAgICAgICAgICAgICB0cmFja2VyLmxvZygiVEhST1dJTkcgUFJPVE9DT0xFWENFUFRJT04iLCBvdXRib3VuZCk7DQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBQcm90b2NvbEV4Y2VwdGlvbigiSSBkb24ndCBsaWtlIHRoZSB2YWx1ZSA5OSIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBTdHJpbmcgdHh0ID0gU3RyaW5nLnZhbHVlT2YoSW50ZWdlci52YWx1ZU9mKGdldEZpcnN0QXJnKHN0KSkgLSAxKTsNCi0gICAgICAgICAgICBzdCA9IHJlcGxhY2VGaXJzdEFyZyhzdCwgdHh0KTsNCi0gICAgICAgICAgICBtc2cuc2V0UGF5bG9hZChuZXcgU3RyZWFtU291cmNlKG5ldyBTdHJpbmdCdWZmZXJJbnB1dFN0cmVhbShzdCkpKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBtZXNzYWdlY29udGV4dC5wdXQoIkFkZE51bWJlcnNMb2dpY2FsSGFuZGxlckluYm91bmRBcHBTY29wZWRQcm9wZXJ0eSIsICJibGFyZ3ZhbCIpOw0KLSAgICAgICAgICAgIG1lc3NhZ2Vjb250ZXh0LnNldFNjb3BlKCJBZGROdW1iZXJzTG9naWNhbEhhbmRsZXJJbmJvdW5kQXBwU2NvcGVkUHJvcGVydHkiLCANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY29wZS5BUFBMSUNBVElPTik7DQotICAgICAgICAgICAgbWVzc2FnZWNvbnRleHQucHV0KCJBZGROdW1iZXJzTG9naWNhbEhhbmRsZXJJbmJvdW5kSGFuZGxlclNjb3BlZFByb3BlcnR5IiwgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJibGFyZ3ZhbCIpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIENoZWNrIGZvciB0aGUgcHJlc2VuY2VzIG9mIHRoZSBhdHRhY2htZW50IHByb3BlcnR5DQotICAgICAgICAgICAgU3RyaW5nIHByb3BLZXkgPSBNZXNzYWdlQ29udGV4dC5JTkJPVU5EX01FU1NBR0VfQVRUQUNITUVOVFM7DQotICAgICAgICAgICAgTWFwIG1hcCA9IChNYXApIG1lc3NhZ2Vjb250ZXh0LmdldChwcm9wS2V5KTsNCi0gICAgICAgICAgICBpZiAobWFwID09IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlByb3BlcnR5ICIgKyBwcm9wS2V5ICsgIiB3YXMgbnVsbCIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZiAoIShtYXAgaW5zdGFuY2VvZiBBdHRhY2htZW50c0FkYXB0ZXIpKSB7DQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJFeHBlY3RlZCBBdHRhY2htZW50QWRhcHRlciBmb3IgUHJvcGVydHkgIiArIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wS2V5KTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICB9IGVsc2UgeyAvLyBvdXRib3VuZCByZXNwb25zZSBpZiB3ZSdyZSBvbiB0aGUgc2VydmVyDQotICAgICAgICAgICAgTG9naWNhbE1lc3NhZ2UgbXNnID0gbWVzc2FnZWNvbnRleHQuZ2V0TWVzc2FnZSgpOw0KLSAgICAgICAgICAgIFN0cmluZyBzdCA9IGdldFN0cmluZ0Zyb21Tb3VyY2VQYXlsb2FkKG1zZy5nZXRQYXlsb2FkKCkpOw0KLSAgICAgICAgICAgIFN0cmluZyB0eHQgPSBTdHJpbmcudmFsdWVPZihJbnRlZ2VyLnZhbHVlT2YoZ2V0Rmlyc3RBcmcoc3QpKSAtIGRlZHVjdGlvbik7DQotICAgICAgICAgICAgc3QgPSByZXBsYWNlRmlyc3RBcmcoc3QsIHR4dCk7DQotICAgICAgICAgICAgbXNnLnNldFBheWxvYWQobmV3IFN0cmVhbVNvdXJjZShuZXcgU3RyaW5nQnVmZmVySW5wdXRTdHJlYW0oc3QpKSk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIHRoZSBwcmVzZW5jZXMgb2YgdGhlIGF0dGFjaG1lbnQgcHJvcGVydHkNCi0gICAgICAgICAgICBTdHJpbmcgcHJvcEtleSA9IE1lc3NhZ2VDb250ZXh0Lk9VVEJPVU5EX01FU1NBR0VfQVRUQUNITUVOVFM7DQotICAgICAgICAgICAgTWFwIG1hcCA9IChNYXApIG1lc3NhZ2Vjb250ZXh0LmdldChwcm9wS2V5KTsNCi0gICAgICAgICAgICBpZiAobWFwID09IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlByb3BlcnR5ICIgKyBwcm9wS2V5ICsgIiB3YXMgbnVsbCIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZiAoIShtYXAgaW5zdGFuY2VvZiBBdHRhY2htZW50c0FkYXB0ZXIpKSB7DQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJFeHBlY3RlZCBBdHRhY2htZW50QWRhcHRlciBmb3IgUHJvcGVydHkgIiArIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wS2V5KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICANCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFN0cmluZ0Zyb21Tb3VyY2VQYXlsb2FkKFNvdXJjZSBwYXlsb2FkKSB7DQotICAgICAgICB0cnkgew0KLQ0KLSAgICAgICAgICAgIFRyYW5zZm9ybWVyRmFjdG9yeSBmYWN0b3J5ID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7DQotICAgICAgICAgICAgVHJhbnNmb3JtZXIgdHJhbnMgPSBmYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKCk7DQotDQotICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7DQotICAgICAgICAgICAgU3RyZWFtUmVzdWx0IHJlc3VsdCA9IG5ldyBTdHJlYW1SZXN1bHQoYmFvcyk7DQotDQotICAgICAgICAgICAgdHJhbnMuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5PTUlUX1hNTF9ERUNMQVJBVElPTiwgInllcyIpOw0KLSAgICAgICAgICAgIHRyYW5zLnRyYW5zZm9ybShwYXlsb2FkLCByZXN1bHQpOw0KLQ0KLSAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKGJhb3MudG9CeXRlQXJyYXkoKSk7DQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0Rmlyc3RBcmcoU3RyaW5nIHBheWxvYWRTdHJpbmcpIHsNCi0gICAgICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIocGF5bG9hZFN0cmluZywgIj4iKTsNCi0gICAgICAgIHN0Lm5leHRUb2tlbigpOyAgLy8gc2tpcCBmaXJzdCB0b2tlbi4NCi0gICAgICAgIHN0Lm5leHRUb2tlbigpOyAgLy8gc2tpcCBzZWNvbmQNCi0gICAgICAgIFN0cmluZyB0ZW1wU3RyaW5nID0gc3QubmV4dFRva2VuKCk7DQotICAgICAgICBTdHJpbmcgcmV0dXJuU3RyaW5nID0gbmV3IFN0cmluZ1Rva2VuaXplcih0ZW1wU3RyaW5nLCAiPCIpLm5leHRUb2tlbigpOw0KLSAgICAgICAgcmV0dXJuIHJldHVyblN0cmluZzsNCi0gICAgfQ0KLSAgICANCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHJlcGxhY2VGaXJzdEFyZyhTdHJpbmcgcGF5bG9hZFN0cmluZywgU3RyaW5nIG5ld0FyZykgew0KLSAgICAgICAgU3RyaW5nIGZpcnN0QXJnID0gZ2V0Rmlyc3RBcmcocGF5bG9hZFN0cmluZyk7DQotICAgICAgICBwYXlsb2FkU3RyaW5nID0gcGF5bG9hZFN0cmluZy5yZXBsYWNlRmlyc3QoZmlyc3RBcmcsIG5ld0FyZyk7DQotICAgICAgICByZXR1cm4gcGF5bG9hZFN0cmluZzsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FkZG51bWJlcnNoYW5kbGVyL0FkZE51bWJlcnNQcm90b2NvbEhhbmRsZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkbnVtYmVyc2hhbmRsZXIvQWRkTnVtYmVyc1Byb3RvY29sSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjUwOWI1Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkbnVtYmVyc2hhbmRsZXIvQWRkTnVtYmVyc1Byb3RvY29sSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLmFkZG51bWJlcnNoYW5kbGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLkV4Y2VwdGlvbkZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuVGVzdExvZ2dlcjsNCi0NCi1pbXBvcnQgamF2YXguYW5ub3RhdGlvbi5QcmVEZXN0cm95Ow0KLWltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCQ29udGV4dDsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkVsZW1lbnQ7DQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBGYXVsdDsNCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247DQotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLk1lc3NhZ2VDb250ZXh0Ow0KLWltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5zb2FwLlNPQVBNZXNzYWdlQ29udGV4dDsNCi1pbXBvcnQgamF2YS5pby5GaWxlOw0KLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07DQotaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsNCi1pbXBvcnQgamF2YS51dGlsLlNldDsNCi0NCi1wdWJsaWMgY2xhc3MgQWRkTnVtYmVyc1Byb3RvY29sSGFuZGxlciBpbXBsZW1lbnRzIGphdmF4LnhtbC53cy5oYW5kbGVyLnNvYXAuU09BUEhhbmRsZXI8U09BUE1lc3NhZ2VDb250ZXh0PiB7DQotDQotICAgIEhhbmRsZXJUcmFja2VyIHRyYWNrZXIgPSBuZXcgSGFuZGxlclRyYWNrZXIoQWRkTnVtYmVyc1Byb3RvY29sSGFuZGxlci5jbGFzcy5nZXRTaW1wbGVOYW1lKCkpOw0KLSAgICANCi0gICAgcHVibGljIHZvaWQgY2xvc2UoTWVzc2FnZUNvbnRleHQgbWVzc2FnZWNvbnRleHQpIHsNCi0gICAgICAgIHRyYWNrZXIuY2xvc2UoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU2V0PFFOYW1lPiBnZXRIZWFkZXJzKCkgew0KLSAgICAgICAgdHJhY2tlci5nZXRIZWFkZXJzKCk7DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIGJvb2xlYW4gaGFuZGxlRmF1bHQoU09BUE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2Vjb250ZXh0KSB7DQotICAgICAgICB0cmFja2VyLmhhbmRsZUZhdWx0KChCb29sZWFuKSBtZXNzYWdlY29udGV4dC5nZXQoTWVzc2FnZUNvbnRleHQuTUVTU0FHRV9PVVRCT1VORF9QUk9QRVJUWSkpOw0KLSAgICAgICAgDQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIFNPQVBGYXVsdCBmYXVsdCA9IG1lc3NhZ2Vjb250ZXh0LmdldE1lc3NhZ2UoKS5nZXRTT0FQQm9keSgpLmdldEZhdWx0KCk7DQotICAgICAgICAgICAgU3RyaW5nIGZhdWx0U3RyaW5nID0gZmF1bHQuZ2V0RmF1bHRTdHJpbmcoKTsNCi0gICAgICAgICAgICBUaHJvd2FibGUgd2VibWV0aG9kRXhjZXB0aW9uID0gKFRocm93YWJsZSkNCi0gICAgICAgICAgICAgICAgbWVzc2FnZWNvbnRleHQuZ2V0KCJqYXh3cy5vdXRib3VuZC5yZXNwb25zZS53ZWJtZXRob2QuZXhjZXB0aW9uIik7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBmYXVsdCBzdHJpbmcgd2l0aCB0aGUgc3RhY2sgdHJhY2UNCi0gICAgICAgICAgICBpZiAod2VibWV0aG9kRXhjZXB0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIlRoZSB3ZWJtZXRob2QgZXhjZXB0aW9uIGlzIGF2YWlsYWJsZS4uLnNldHRpbmcgdGhlIGZhdWx0IHN0cmluZyIpOw0KLSAgICAgICAgICAgICAgICBmYXVsdFN0cmluZyArPSAic3RhY2sgPSAiICsgIHN0YWNrVG9TdHJpbmcod2VibWV0aG9kRXhjZXB0aW9uKTsNCi0gICAgICAgICAgICAgICAgZmF1bHQuc2V0RmF1bHRTdHJpbmcoZmF1bHRTdHJpbmcpOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJUaGUgd2VibWV0aG9kIGV4Y2VwdGlvbiB3YXMgbm90IGF2YWlsYWJsZSIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgdHJhY2tlci5sb2coIkV4Y2VwdGlvbiBvY2N1cnJlZDoiICsgZS5nZXRNZXNzYWdlKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgKEJvb2xlYW4pIG1lc3NhZ2Vjb250ZXh0LmdldChNZXNzYWdlQ29udGV4dC5NRVNTQUdFX09VVEJPVU5EX1BST1BFUlRZKSk7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGhhbmRsZU1lc3NhZ2UoU09BUE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2Vjb250ZXh0KSB7DQotICAgICAgICB0cmFja2VyLmhhbmRsZU1lc3NhZ2UoKEJvb2xlYW4pIG1lc3NhZ2Vjb250ZXh0LmdldChNZXNzYWdlQ29udGV4dC5NRVNTQUdFX09VVEJPVU5EX1BST1BFUlRZKSk7DQotICAgICAgICAvLyBFbnN1cmUgdGhhdCB0aGUgZXhwZWN0ZWQgaGVhZGVycyBhcmUgcHJlc2VudA0KLSAgICAgICAgSkFYQkNvbnRleHQgY29udGV4dDsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgY29udGV4dCA9IEpBWEJDb250ZXh0Lm5ld0luc3RhbmNlKCJvcmcudGVzdC5hZGRudW1iZXJzaGFuZGxlciIpOw0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIFFOYW1lIHFOYW1lPSBuZXcgUU5hbWUoImh0dHA6Ly9vcmcvdGVzdC9hZGRudW1iZXJzaGFuZGxlciIsIm15SGVhZGVyIik7DQotDQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIE9iamVjdFtdIHZhbHVlcyA9IG1lc3NhZ2Vjb250ZXh0LmdldEhlYWRlcnMocU5hbWUsIGNvbnRleHQsIHRydWUpOw0KLQ0KLSAgICAgICAgICAgIGlmICh2YWx1ZXMubGVuZ3RoID4gMCkgew0KLSAgICAgICAgICAgICAgICBpZiAodmFsdWVzLmxlbmd0aCAhPTMgfHwNCi0gICAgICAgICAgICAgICAgICAgICAgICAhKChKQVhCRWxlbWVudCl2YWx1ZXNbMF0pLmdldFZhbHVlKCkuZXF1YWxzKCJHb29kMSIpIHx8DQotICAgICAgICAgICAgICAgICAgICAgICAgISgoSkFYQkVsZW1lbnQpdmFsdWVzWzFdKS5nZXRWYWx1ZSgpLmVxdWFscygiR29vZDIiKSB8fA0KLSAgICAgICAgICAgICAgICAgICAgICAgICEoKEpBWEJFbGVtZW50KXZhbHVlc1syXSkuZ2V0VmFsdWUoKS5lcXVhbHMoIkJhZCIpKSB7DQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbigiRmFpbGVkIGdldHRpbmcgYWxsIG9mIHRoZSBoZWFkZXJzOiIgKyB2YWx1ZXMpOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIHZhbHVlcyA9IG1lc3NhZ2Vjb250ZXh0LmdldEhlYWRlcnMocU5hbWUsIGNvbnRleHQsIGZhbHNlKTsNCi0gICAgICAgICAgICAgICAgaWYgKHZhbHVlcy5sZW5ndGggIT0yIHx8DQotICAgICAgICAgICAgICAgICAgICAgICAgISgoSkFYQkVsZW1lbnQpdmFsdWVzWzBdKS5nZXRWYWx1ZSgpLmVxdWFscygiR29vZDEiKSB8fA0KLSAgICAgICAgICAgICAgICAgICAgICAgICEoKEpBWEJFbGVtZW50KXZhbHVlc1sxXSkuZ2V0VmFsdWUoKS5lcXVhbHMoIkdvb2QyIikpIHsNCi0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKCJGYWlsZWQgZ2V0dGluZyB0aGUgZXhwZWN0ZWQgaGVhZGVyczoiICsgdmFsdWVzKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLSAgICANCi0gICAgQFByZURlc3Ryb3kNCi0gICAgcHVibGljIHZvaWQgcHJlRGVzdHJveSgpIHsNCi0gICAgICAgIHRyYWNrZXIucHJlRGVzdHJveSgpOw0KLSAgICAJdHJ5IHsNCi0gICAgCQkvKg0KLSAgICAJCSAqIHNpbmNlIEBQcmVEZXN0cm95IG1ldGhvZHMgYXJlIGNhbGxlZCBqdXN0IGJlZm9yZSB0aGUgbWFuYWdlZCAoc2VydmVyKSBzaWRlDQotICAgIAkJICogaGFuZGxlciBpbnN0YW5jZSBnb2VzIG91dCBvZiBzY29wZSwgdGhlcmUncyBub3QgYSBnb29kIHdheSB0byB0ZXN0IGlmIGl0IGlzDQotICAgIAkJICogY2FsbGVkLiAgU28sIHdlIGFyZSBjcmVhdGluZyBhIGZpbGUgdGhhdCBvbmUgb2YgdGhlIEFkZE51bWJlcnNIYW5kbGVyVGVzdHMgdGVzdHMNCi0gICAgCQkgKiBjaGVja3MgdGhlIGV4aXN0YW5jZSBvZi4NCi0gICAgCQkgKi8NCi0gICAgCQlGaWxlIGZpbGUgPSBuZXcgRmlsZSgiQWRkTnVtYmVyc1Byb3RvY29sSGFuZGxlci5wcmVEZXN0cm95LnR4dCIpOw0KLSAgICAJCWZpbGUuY3JlYXRlTmV3RmlsZSgpOw0KLSAgICAJCUZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZSk7DQotICAgIAkJZm9zLndyaXRlKG5ldyBieXRlW117J2gnLCdpJ30pOw0KLSAgICAJCWZvcy5jbG9zZSgpOw0KLSAgICAJCWZpbGUuZGVsZXRlT25FeGl0KCk7DQotICAgIAl9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAJCXRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7DQotICAgIAl9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHN0YWNrVG9TdHJpbmcoVGhyb3dhYmxlIGUpIHsNCi0gICAgICAgIGphdmEuaW8uU3RyaW5nV3JpdGVyIHN3ID0gbmV3IGphdmEuaW8uU3RyaW5nV3JpdGVyKCk7DQotICAgICAgICBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyIGJ3ID0gbmV3IGphdmEuaW8uQnVmZmVyZWRXcml0ZXIoc3cpOw0KLSAgICAgICAgamF2YS5pby5QcmludFdyaXRlciBwdyA9IG5ldyBqYXZhLmlvLlByaW50V3JpdGVyKGJ3KTsNCi0gICAgICAgIGUucHJpbnRTdGFja1RyYWNlKHB3KTsNCi0gICAgICAgIHB3LmNsb3NlKCk7DQotICAgICAgICByZXR1cm4gc3cuZ2V0QnVmZmVyKCkudG9TdHJpbmcoKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FkZG51bWJlcnNoYW5kbGVyL0FkZE51bWJlcnNQcm90b2NvbEhhbmRsZXIyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FkZG51bWJlcnNoYW5kbGVyL0FkZE51bWJlcnNQcm90b2NvbEhhbmRsZXIyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhZjIwNzYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hZGRudW1iZXJzaGFuZGxlci9BZGROdW1iZXJzUHJvdG9jb2xIYW5kbGVyMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuYWRkbnVtYmVyc2hhbmRsZXI7DQotDQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotDQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLk1lc3NhZ2VDb250ZXh0Ow0KLWltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5zb2FwLlNPQVBNZXNzYWdlQ29udGV4dDsNCi0NCi1wdWJsaWMgY2xhc3MgQWRkTnVtYmVyc1Byb3RvY29sSGFuZGxlcjIgaW1wbGVtZW50cyBqYXZheC54bWwud3MuaGFuZGxlci5zb2FwLlNPQVBIYW5kbGVyPFNPQVBNZXNzYWdlQ29udGV4dD4gew0KLQ0KLSAgICBIYW5kbGVyVHJhY2tlciB0cmFja2VyID0gbmV3IEhhbmRsZXJUcmFja2VyKEFkZE51bWJlcnNQcm90b2NvbEhhbmRsZXIyLmNsYXNzLmdldFNpbXBsZU5hbWUoKSk7DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCBjbG9zZShNZXNzYWdlQ29udGV4dCBtZXNzYWdlY29udGV4dCkgew0KLSAgICAgICAgdHJhY2tlci5jbG9zZSgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTZXQ8UU5hbWU+IGdldEhlYWRlcnMoKSB7DQotICAgICAgICB0cmFja2VyLmdldEhlYWRlcnMoKTsNCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYW5kbGVGYXVsdChTT0FQTWVzc2FnZUNvbnRleHQgbWVzc2FnZWNvbnRleHQpIHsNCi0gICAgICAgIEJvb2xlYW4gb3V0Ym91bmQgPSAoQm9vbGVhbikgbWVzc2FnZWNvbnRleHQuZ2V0KE1lc3NhZ2VDb250ZXh0Lk1FU1NBR0VfT1VUQk9VTkRfUFJPUEVSVFkpOw0KLSAgICAgICAgdHJhY2tlci5oYW5kbGVGYXVsdChvdXRib3VuZCk7DQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYW5kbGVNZXNzYWdlKFNPQVBNZXNzYWdlQ29udGV4dCBtZXNzYWdlY29udGV4dCkgew0KLSAgICAgICAgQm9vbGVhbiBvdXRib3VuZCA9IChCb29sZWFuKSBtZXNzYWdlY29udGV4dC5nZXQoTWVzc2FnZUNvbnRleHQuTUVTU0FHRV9PVVRCT1VORF9QUk9QRVJUWSk7DQotICAgICAgICB0cmFja2VyLmhhbmRsZU1lc3NhZ2Uob3V0Ym91bmQpOw0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hZGRudW1iZXJzaGFuZGxlci9IYW5kbGVyVHJhY2tlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hZGRudW1iZXJzaGFuZGxlci9IYW5kbGVyVHJhY2tlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTQ5YTNkLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkbnVtYmVyc2hhbmRsZXIvSGFuZGxlclRyYWNrZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLmFkZG51bWJlcnNoYW5kbGVyOw0KLQ0KLWltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7DQotDQotcHVibGljIGNsYXNzIEhhbmRsZXJUcmFja2VyIHsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGZpbGVsb2duYW1lID0gIkFkZE51bWJlcnNIYW5kbGVyVGVzdHMubG9nIjsNCi0gICAgDQotICAgIHByaXZhdGUgU3RyaW5nIGNsYXNzbmFtZTsNCi0gICAgDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDTE9TRSA9ICJDTE9TRSI7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBHRVRfSEVBREVSUyA9ICJHRVRfSEVBREVSUyI7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIQU5ETEVfRkFVTFRfSU5CT1VORCA9ICJIQU5ETEVfRkFVTFRfSU5CT1VORCI7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIQU5ETEVfTUVTU0FHRV9JTkJPVU5EID0gIkhBTkRMRV9NRVNTQUdFX0lOQk9VTkQiOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEFORExFX0ZBVUxUX09VVEJPVU5EID0gIkhBTkRMRV9GQVVMVF9PVVRCT1VORCI7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIQU5ETEVfTUVTU0FHRV9PVVRCT1VORCA9ICJIQU5ETEVfTUVTU0FHRV9PVVRCT1VORCI7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQT1NUX0NPTlNUUlVDVCA9ICJQT1NUX0NPTlNUUlVDVCI7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVfREVTVFJPWSA9ICJQUkVfREVTVFJPWSI7DQotICAgIA0KLSAgICAvLyBzaG91bGQgcGFzcyBjbGFzc25hbWUgZm9yICJuYW1lIg0KLSAgICBwdWJsaWMgSGFuZGxlclRyYWNrZXIoU3RyaW5nIG5hbWUpIHsNCi0gICAgICAgIGNsYXNzbmFtZSA9IG5hbWU7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHBvc3RDb25zdHJ1Y3QoKSB7DQotICAgICAgICBsb2dfdG9fZmlsZShQT1NUX0NPTlNUUlVDVCk7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHByZURlc3Ryb3koKSB7DQotICAgICAgICBsb2dfdG9fZmlsZShQUkVfREVTVFJPWSk7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgew0KLSAgICAgICAgbG9nX3RvX2ZpbGUoQ0xPU0UpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGdldEhlYWRlcnMoKSB7DQotICAgICAgICBsb2dfdG9fZmlsZShHRVRfSEVBREVSUyk7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIGhhbmRsZUZhdWx0KGJvb2xlYW4gb3V0Ym91bmQpIHsNCi0gICAgICAgIGlmIChvdXRib3VuZCkgew0KLSAgICAgICAgICAgIGxvZ190b19maWxlKEhBTkRMRV9GQVVMVF9PVVRCT1VORCk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGxvZ190b19maWxlKEhBTkRMRV9GQVVMVF9JTkJPVU5EKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKGJvb2xlYW4gb3V0Ym91bmQpIHsNCi0gICAgICAgIGlmIChvdXRib3VuZCkgew0KLSAgICAgICAgICAgIGxvZ190b19maWxlKEhBTkRMRV9NRVNTQUdFX09VVEJPVU5EKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgbG9nX3RvX2ZpbGUoSEFORExFX01FU1NBR0VfSU5CT1VORCk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIGxvZyhTdHJpbmcgbXNnLCBib29sZWFuIG91dGJvdW5kKSB7DQotICAgICAgICBsb2dfdG9fZmlsZShtc2cgKyAiICIgKyAob3V0Ym91bmQgPyAiT1VUQk9VTkQiIDogIklOQk9VTkQiKSk7DQotICAgIH0NCi0gICAgDQotICAgIC8qDQotICAgICAqIHdlIGhhdmUgdG8gb3BlbiBhbmQgY2xvc2UgdGhlIGZpbGUgZXZlcnkgdGltZSB3ZSB3cml0ZQ0KLSAgICAgKiBhcyBvdGhlciBoYW5kbGVyIG1ldGhvZCBjYWxscyBtYXkgYmUgaW50ZXJsZWF2ZWQgd2l0aCB0aGlzIG9uZQ0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSB2b2lkIGxvZ190b19maWxlKFN0cmluZyBtc2cpIHsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgRmlsZVdyaXRlciBmdyA9IG5ldyBGaWxlV3JpdGVyKGZpbGVsb2duYW1lLCB0cnVlKTsNCi0gICAgICAgICAgICBmdy53cml0ZShjbGFzc25hbWUgKyAiICIgKyBtc2cgKyAiXG4iKTsNCi0gICAgICAgICAgICBmdy5jbG9zZSgpOw0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICANCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hZGRudW1iZXJzaGFuZGxlci9NRVRBLUlORi9BZGROdW1iZXJzSGFuZGxlci53c2RsIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hZGRudW1iZXJzaGFuZGxlci9NRVRBLUlORi9BZGROdW1iZXJzSGFuZGxlci53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OWM2YTkxLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkbnVtYmVyc2hhbmRsZXIvTUVUQS1JTkYvQWRkTnVtYmVyc0hhbmRsZXIud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/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+DQotCTwvc2VydmljZT4NCi08L2RlZmluaXRpb25zPg0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkcmVzc2Jvb2svQWRkRW50cnkuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkcmVzc2Jvb2svQWRkRW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjk4NjliMi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FkZHJlc3Nib29rL0FkZEVudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5hZGRyZXNzYm9vazsNCi0NCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOw0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZTsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50Ow0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50Ow0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGU7DQotDQotDQotLyoqDQotICogPHA+SmF2YSBjbGFzcyBmb3IgYWRkRW50cnkgZWxlbWVudCBkZWNsYXJhdGlvbi4NCi0gKiANCi0gKiA8cD5UaGUgZm9sbG93aW5nIHNjaGVtYSBmcmFnbWVudCBzcGVjaWZpZXMgdGhlIGV4cGVjdGVkIGNvbnRlbnQgY29udGFpbmVkIHdpdGhpbiB0aGlzIGNsYXNzLg0KLSAqIA0KLSAqIDxwcmU+DQotICogJmx0O2VsZW1lbnQgbmFtZT0iYWRkRW50cnkiPg0KLSAqICAgJmx0O2NvbXBsZXhUeXBlPg0KLSAqICAgICAmbHQ7Y29tcGxleENvbnRlbnQ+DQotICogICAgICAgJmx0O3Jlc3RyaWN0aW9uIGJhc2U9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1hbnlUeXBlIj4NCi0gKiAgICAgICAgICZsdDtzZXF1ZW5jZT4NCi0gKiAgICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0iZW50cnkiIHR5cGU9IntodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkcmVzc2Jvb2t9QWRkcmVzc0Jvb2tFbnRyeSIvPg0KLSAqICAgICAgICAgJmx0Oy9zZXF1ZW5jZT4NCi0gKiAgICAgICAmbHQ7L3Jlc3RyaWN0aW9uPg0KLSAqICAgICAmbHQ7L2NvbXBsZXhDb250ZW50Pg0KLSAqICAgJmx0Oy9jb21wbGV4VHlwZT4NCi0gKiAmbHQ7L2VsZW1lbnQ+DQotICogPC9wcmU+DQotICogDQotICogDQotICovDQotQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKQ0KLUBYbWxUeXBlKG5hbWUgPSAiIiwgcHJvcE9yZGVyID0gew0KLSAgICAiZW50cnkiDQotfSkNCi1AWG1sUm9vdEVsZW1lbnQobmFtZSA9ICJhZGRFbnRyeSIpDQotcHVibGljIGNsYXNzIEFkZEVudHJ5IHsNCi0NCi0gICAgQFhtbEVsZW1lbnQobmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hZGRyZXNzYm9vayIsIHJlcXVpcmVkID0gdHJ1ZSkNCi0gICAgcHJvdGVjdGVkIEFkZHJlc3NCb29rRW50cnkgZW50cnk7DQotDQotICAgIC8qKg0KLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZW50cnkgcHJvcGVydHkuDQotICAgICAqIA0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICBwb3NzaWJsZSBvYmplY3QgaXMNCi0gICAgICogICAgIHtAbGluayBBZGRyZXNzQm9va0VudHJ5IH0NCi0gICAgICogICAgIA0KLSAgICAgKi8NCi0gICAgcHVibGljIEFkZHJlc3NCb29rRW50cnkgZ2V0RW50cnkoKSB7DQotICAgICAgICByZXR1cm4gZW50cnk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBlbnRyeSBwcm9wZXJ0eS4NCi0gICAgICogDQotICAgICAqIEBwYXJhbSB2YWx1ZQ0KLSAgICAgKiAgICAgYWxsb3dlZCBvYmplY3QgaXMNCi0gICAgICogICAgIHtAbGluayBBZGRyZXNzQm9va0VudHJ5IH0NCi0gICAgICogICAgIA0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgc2V0RW50cnkoQWRkcmVzc0Jvb2tFbnRyeSB2YWx1ZSkgew0KLSAgICAgICAgdGhpcy5lbnRyeSA9IHZhbHVlOw0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkcmVzc2Jvb2svQWRkRW50cnlSZXNwb25zZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hZGRyZXNzYm9vay9BZGRFbnRyeVJlc3BvbnNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0ZmM1MTcuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hZGRyZXNzYm9vay9BZGRFbnRyeVJlc3BvbnNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5hZGRyZXNzYm9vazsNCi0NCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOw0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZTsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50Ow0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50Ow0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGU7DQotDQotDQotLyoqDQotICogPHA+SmF2YSBjbGFzcyBmb3IgYWRkRW50cnlSZXNwb25zZSBlbGVtZW50IGRlY2xhcmF0aW9uLg0KLSAqIA0KLSAqIDxwPlRoZSBmb2xsb3dpbmcgc2NoZW1hIGZyYWdtZW50IHNwZWNpZmllcyB0aGUgZXhwZWN0ZWQgY29udGVudCBjb250YWluZWQgd2l0aGluIHRoaXMgY2xhc3MuDQotICogDQotICogPHByZT4NCi0gKiAmbHQ7ZWxlbWVudCBuYW1lPSJhZGRFbnRyeVJlc3BvbnNlIj4NCi0gKiAgICZsdDtjb21wbGV4VHlwZT4NCi0gKiAgICAgJmx0O2NvbXBsZXhDb250ZW50Pg0KLSAqICAgICAgICZsdDtyZXN0cmljdGlvbiBiYXNlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9YW55VHlwZSI+DQotICogICAgICAgICAmbHQ7c2VxdWVuY2U+DQotICogICAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9InN0YXR1cyIgdHlwZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfWJvb2xlYW4iLz4NCi0gKiAgICAgICAgICZsdDsvc2VxdWVuY2U+DQotICogICAgICAgJmx0Oy9yZXN0cmljdGlvbj4NCi0gKiAgICAgJmx0Oy9jb21wbGV4Q29udGVudD4NCi0gKiAgICZsdDsvY29tcGxleFR5cGU+DQotICogJmx0Oy9lbGVtZW50Pg0KLSAqIDwvcHJlPg0KLSAqIA0KLSAqIA0KLSAqLw0KLUBYbWxBY2Nlc3NvclR5cGUoWG1sQWNjZXNzVHlwZS5GSUVMRCkNCi1AWG1sVHlwZShuYW1lID0gIiIsIHByb3BPcmRlciA9IHsNCi0gICAgInN0YXR1cyINCi19KQ0KLUBYbWxSb290RWxlbWVudChuYW1lID0gImFkZEVudHJ5UmVzcG9uc2UiKQ0KLXB1YmxpYyBjbGFzcyBBZGRFbnRyeVJlc3BvbnNlIHsNCi0NCi0gICAgQFhtbEVsZW1lbnQobmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hZGRyZXNzYm9vayIpDQotICAgIHByb3RlY3RlZCBib29sZWFuIHN0YXR1czsNCi0NCi0gICAgLyoqDQotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBzdGF0dXMgcHJvcGVydHkuDQotICAgICAqIA0KLSAgICAgKi8NCi0gICAgcHVibGljIGJvb2xlYW4gaXNTdGF0dXMoKSB7DQotICAgICAgICByZXR1cm4gc3RhdHVzOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgc3RhdHVzIHByb3BlcnR5Lg0KLSAgICAgKiANCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHNldFN0YXR1cyhib29sZWFuIHZhbHVlKSB7DQotICAgICAgICB0aGlzLnN0YXR1cyA9IHZhbHVlOw0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkcmVzc2Jvb2svQWRkcmVzc0Jvb2suamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkcmVzc2Jvb2svQWRkcmVzc0Jvb2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjcxZGQ1OS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FkZHJlc3Nib29rL0FkZHJlc3NCb29rLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5hZGRyZXNzYm9vazsNCi0NCi1pbXBvcnQgamF2YXguandzLldlYk1ldGhvZDsNCi1pbXBvcnQgamF2YXguandzLldlYlBhcmFtOw0KLWltcG9ydCBqYXZheC5qd3MuV2ViUmVzdWx0Ow0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLlJlcXVlc3RXcmFwcGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuUmVzcG9uc2VXcmFwcGVyOw0KLQ0KLUBXZWJTZXJ2aWNlKG5hbWUgPSAiQWRkcmVzc0Jvb2siLCANCi0gICAgICAgICAgICB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FkZHJlc3Nib29rIikNCi1wdWJsaWMgaW50ZXJmYWNlIEFkZHJlc3NCb29rIHsNCi0NCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gZW50cnkNCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBib29sZWFuDQotICAgICAqLw0KLSAgICBAV2ViTWV0aG9kDQotICAgIEBXZWJSZXN1bHQobmFtZSA9ICJzdGF0dXMiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FkZHJlc3Nib29rIikNCi0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJhZGRFbnRyeSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkcmVzc2Jvb2siLCBjbGFzc05hbWUgPSAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuYWRkcmVzc2Jvb2suQWRkRW50cnkiKQ0KLSAgICBAUmVzcG9uc2VXcmFwcGVyKGxvY2FsTmFtZSA9ICJhZGRFbnRyeVJlc3BvbnNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hZGRyZXNzYm9vayIsIGNsYXNzTmFtZSA9ICJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5hZGRyZXNzYm9vay5BZGRFbnRyeVJlc3BvbnNlIikNCi0gICAgcHVibGljIGJvb2xlYW4gYWRkRW50cnkoDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJlbnRyeSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkcmVzc2Jvb2siKQ0KLSAgICAgICAgQWRkcmVzc0Jvb2tFbnRyeSBlbnRyeSk7DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGZpcnN0bmFtZQ0KLSAgICAgKiBAcGFyYW0gbGFzdG5hbWUNCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5hZGRyZXNzYm9vay5BZGRyZXNzQm9va0VudHJ5DQotICAgICAqLw0KLSAgICBAV2ViTWV0aG9kDQotICAgIEBXZWJSZXN1bHQobmFtZSA9ICJlbnRyeSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkcmVzc2Jvb2siKQ0KLSAgICBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gImZpbmRFbnRyeUJ5TmFtZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkcmVzc2Jvb2siLCBjbGFzc05hbWUgPSAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuYWRkcmVzc2Jvb2suRmluZEVudHJ5QnlOYW1lIikNCi0gICAgQFJlc3BvbnNlV3JhcHBlcihsb2NhbE5hbWUgPSAiZmluZEVudHJ5QnlOYW1lUmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FkZHJlc3Nib29rIiwgY2xhc3NOYW1lID0gIm9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLmFkZHJlc3Nib29rLkZpbmRFbnRyeUJ5TmFtZVJlc3BvbnNlIikNCi0gICAgcHVibGljIEFkZHJlc3NCb29rRW50cnkgZmluZEVudHJ5QnlOYW1lKA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiZmlyc3RuYW1lIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hZGRyZXNzYm9vayIpDQotICAgICAgICBTdHJpbmcgZmlyc3RuYW1lLA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAibGFzdG5hbWUiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FkZHJlc3Nib29rIikNCi0gICAgICAgIFN0cmluZyBsYXN0bmFtZSk7DQotDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkcmVzc2Jvb2svQWRkcmVzc0Jvb2tFbnRyeS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hZGRyZXNzYm9vay9BZGRyZXNzQm9va0VudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlY2EyNWYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hZGRyZXNzYm9vay9BZGRyZXNzQm9va0VudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuYWRkcmVzc2Jvb2s7DQotDQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzVHlwZTsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7DQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudDsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlOw0KLQ0KLQ0KLS8qKg0KLSAqIDxwPkphdmEgY2xhc3MgZm9yIEFkZHJlc3NCb29rRW50cnkgY29tcGxleCB0eXBlLg0KLSAqIA0KLSAqIDxwPlRoZSBmb2xsb3dpbmcgc2NoZW1hIGZyYWdtZW50IHNwZWNpZmllcyB0aGUgZXhwZWN0ZWQgY29udGVudCBjb250YWluZWQgd2l0aGluIHRoaXMgY2xhc3MuDQotICogDQotICogPHByZT4NCi0gKiAmbHQ7Y29tcGxleFR5cGUgbmFtZT0iQWRkcmVzc0Jvb2tFbnRyeSI+DQotICogICAmbHQ7Y29tcGxleENvbnRlbnQ+DQotICogICAgICZsdDtyZXN0cmljdGlvbiBiYXNlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9YW55VHlwZSI+DQotICogICAgICAgJmx0O3NlcXVlbmNlPg0KLSAqICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0iZmlyc3ROYW1lIiB0eXBlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9c3RyaW5nIi8+DQotICogICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJsYXN0TmFtZSIgdHlwZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfXN0cmluZyIvPg0KLSAqICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0icGhvbmUiIHR5cGU9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1zdHJpbmciLz4NCi0gKiAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9InN0cmVldCIgdHlwZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfXN0cmluZyIvPg0KLSAqICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0iY2l0eSIgdHlwZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfXN0cmluZyIvPg0KLSAqICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0ic3RhdGUiIHR5cGU9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1zdHJpbmciLz4NCi0gKiAgICAgICAmbHQ7L3NlcXVlbmNlPg0KLSAqICAgICAmbHQ7L3Jlc3RyaWN0aW9uPg0KLSAqICAgJmx0Oy9jb21wbGV4Q29udGVudD4NCi0gKiAmbHQ7L2NvbXBsZXhUeXBlPg0KLSAqIDwvcHJlPg0KLSAqIA0KLSAqIA0KLSAqLw0KLUBYbWxBY2Nlc3NvclR5cGUoWG1sQWNjZXNzVHlwZS5GSUVMRCkNCi1AWG1sVHlwZShuYW1lID0gIkFkZHJlc3NCb29rRW50cnkiLCBwcm9wT3JkZXIgPSB7DQotICAgICJmaXJzdE5hbWUiLA0KLSAgICAibGFzdE5hbWUiLA0KLSAgICAicGhvbmUiLA0KLSAgICAic3RyZWV0IiwNCi0gICAgImNpdHkiLA0KLSAgICAic3RhdGUiDQotfSkNCi1wdWJsaWMgY2xhc3MgQWRkcmVzc0Jvb2tFbnRyeSB7DQotDQotICAgIEBYbWxFbGVtZW50KG5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkcmVzc2Jvb2siLCByZXF1aXJlZCA9IHRydWUpDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZmlyc3ROYW1lOw0KLSAgICBAWG1sRWxlbWVudChuYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FkZHJlc3Nib29rIiwgcmVxdWlyZWQgPSB0cnVlKQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGxhc3ROYW1lOw0KLSAgICBAWG1sRWxlbWVudChuYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FkZHJlc3Nib29rIiwgcmVxdWlyZWQgPSB0cnVlLCBuaWxsYWJsZSA9IHRydWUpDQotICAgIHByb3RlY3RlZCBTdHJpbmcgcGhvbmU7DQotICAgIEBYbWxFbGVtZW50KG5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkcmVzc2Jvb2siLCByZXF1aXJlZCA9IHRydWUsIG5pbGxhYmxlID0gdHJ1ZSkNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBzdHJlZXQ7DQotICAgIEBYbWxFbGVtZW50KG5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkcmVzc2Jvb2siLCByZXF1aXJlZCA9IHRydWUsIG5pbGxhYmxlID0gdHJ1ZSkNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBjaXR5Ow0KLSAgICBAWG1sRWxlbWVudChuYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FkZHJlc3Nib29rIiwgcmVxdWlyZWQgPSB0cnVlLCBuaWxsYWJsZSA9IHRydWUpDQotICAgIHByb3RlY3RlZCBTdHJpbmcgc3RhdGU7DQotDQotICAgIC8qKg0KLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZmlyc3ROYW1lIHByb3BlcnR5Lg0KLSAgICAgKiANCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcG9zc2libGUgb2JqZWN0IGlzDQotICAgICAqICAgICB7QGxpbmsgU3RyaW5nIH0NCi0gICAgICogICAgIA0KLSAgICAgKi8NCi0gICAgcHVibGljIFN0cmluZyBnZXRGaXJzdE5hbWUoKSB7DQotICAgICAgICByZXR1cm4gZmlyc3ROYW1lOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZmlyc3ROYW1lIHByb3BlcnR5Lg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIHZhbHVlDQotICAgICAqICAgICBhbGxvd2VkIG9iamVjdCBpcw0KLSAgICAgKiAgICAge0BsaW5rIFN0cmluZyB9DQotICAgICAqICAgICANCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHNldEZpcnN0TmFtZShTdHJpbmcgdmFsdWUpIHsNCi0gICAgICAgIHRoaXMuZmlyc3ROYW1lID0gdmFsdWU7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBsYXN0TmFtZSBwcm9wZXJ0eS4NCi0gICAgICogDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHBvc3NpYmxlIG9iamVjdCBpcw0KLSAgICAgKiAgICAge0BsaW5rIFN0cmluZyB9DQotICAgICAqICAgICANCi0gICAgICovDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGFzdE5hbWUoKSB7DQotICAgICAgICByZXR1cm4gbGFzdE5hbWU7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBsYXN0TmFtZSBwcm9wZXJ0eS4NCi0gICAgICogDQotICAgICAqIEBwYXJhbSB2YWx1ZQ0KLSAgICAgKiAgICAgYWxsb3dlZCBvYmplY3QgaXMNCi0gICAgICogICAgIHtAbGluayBTdHJpbmcgfQ0KLSAgICAgKiAgICAgDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBzZXRMYXN0TmFtZShTdHJpbmcgdmFsdWUpIHsNCi0gICAgICAgIHRoaXMubGFzdE5hbWUgPSB2YWx1ZTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIHBob25lIHByb3BlcnR5Lg0KLSAgICAgKiANCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcG9zc2libGUgb2JqZWN0IGlzDQotICAgICAqICAgICB7QGxpbmsgU3RyaW5nIH0NCi0gICAgICogICAgIA0KLSAgICAgKi8NCi0gICAgcHVibGljIFN0cmluZyBnZXRQaG9uZSgpIHsNCi0gICAgICAgIHJldHVybiBwaG9uZTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHBob25lIHByb3BlcnR5Lg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIHZhbHVlDQotICAgICAqICAgICBhbGxvd2VkIG9iamVjdCBpcw0KLSAgICAgKiAgICAge0BsaW5rIFN0cmluZyB9DQotICAgICAqICAgICANCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHNldFBob25lKFN0cmluZyB2YWx1ZSkgew0KLSAgICAgICAgdGhpcy5waG9uZSA9IHZhbHVlOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgc3RyZWV0IHByb3BlcnR5Lg0KLSAgICAgKiANCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcG9zc2libGUgb2JqZWN0IGlzDQotICAgICAqICAgICB7QGxpbmsgU3RyaW5nIH0NCi0gICAgICogICAgIA0KLSAgICAgKi8NCi0gICAgcHVibGljIFN0cmluZyBnZXRTdHJlZXQoKSB7DQotICAgICAgICByZXR1cm4gc3RyZWV0Ow0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgc3RyZWV0IHByb3BlcnR5Lg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIHZhbHVlDQotICAgICAqICAgICBhbGxvd2VkIG9iamVjdCBpcw0KLSAgICAgKiAgICAge0BsaW5rIFN0cmluZyB9DQotICAgICAqICAgICANCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHNldFN0cmVldChTdHJpbmcgdmFsdWUpIHsNCi0gICAgICAgIHRoaXMuc3RyZWV0ID0gdmFsdWU7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBjaXR5IHByb3BlcnR5Lg0KLSAgICAgKiANCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcG9zc2libGUgb2JqZWN0IGlzDQotICAgICAqICAgICB7QGxpbmsgU3RyaW5nIH0NCi0gICAgICogICAgIA0KLSAgICAgKi8NCi0gICAgcHVibGljIFN0cmluZyBnZXRDaXR5KCkgew0KLSAgICAgICAgcmV0dXJuIGNpdHk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBjaXR5IHByb3BlcnR5Lg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIHZhbHVlDQotICAgICAqICAgICBhbGxvd2VkIG9iamVjdCBpcw0KLSAgICAgKiAgICAge0BsaW5rIFN0cmluZyB9DQotICAgICAqICAgICANCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHNldENpdHkoU3RyaW5nIHZhbHVlKSB7DQotICAgICAgICB0aGlzLmNpdHkgPSB2YWx1ZTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIHN0YXRlIHByb3BlcnR5Lg0KLSAgICAgKiANCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcG9zc2libGUgb2JqZWN0IGlzDQotICAgICAqICAgICB7QGxpbmsgU3RyaW5nIH0NCi0gICAgICogICAgIA0KLSAgICAgKi8NCi0gICAgcHVibGljIFN0cmluZyBnZXRTdGF0ZSgpIHsNCi0gICAgICAgIHJldHVybiBzdGF0ZTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHN0YXRlIHByb3BlcnR5Lg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIHZhbHVlDQotICAgICAqICAgICBhbGxvd2VkIG9iamVjdCBpcw0KLSAgICAgKiAgICAge0BsaW5rIFN0cmluZyB9DQotICAgICAqICAgICANCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHNldFN0YXRlKFN0cmluZyB2YWx1ZSkgew0KLSAgICAgICAgdGhpcy5zdGF0ZSA9IHZhbHVlOw0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkcmVzc2Jvb2svQWRkcmVzc0Jvb2tJbXBsLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FkZHJlc3Nib29rL0FkZHJlc3NCb29rSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWI0YWNmLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkcmVzc2Jvb2svQWRkcmVzc0Jvb2tJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5hZGRyZXNzYm9vazsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5UZXN0TG9nZ2VyOw0KLQ0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KLQ0KLUBXZWJTZXJ2aWNlKHNlcnZpY2VOYW1lPSJBZGRyZXNzQm9va1NlcnZpY2UiLA0KLQkJCWVuZHBvaW50SW50ZXJmYWNlPSJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5hZGRyZXNzYm9vay5BZGRyZXNzQm9vayIpDQotcHVibGljIGNsYXNzIEFkZHJlc3NCb29rSW1wbCBpbXBsZW1lbnRzIEFkZHJlc3NCb29rIHsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgQXJyYXlMaXN0PEFkZHJlc3NCb29rRW50cnk+IGRhdGE7DQotICAgIA0KLSAgICBzdGF0aWMgew0KLSAgICAgICAgZGF0YSA9IG5ldyBBcnJheUxpc3Q8QWRkcmVzc0Jvb2tFbnRyeT4oKTsNCi0gICAgICAgIA0KLSAgICAgICAgT2JqZWN0RmFjdG9yeSBmYWN0b3J5ID0gbmV3IE9iamVjdEZhY3RvcnkoKTsNCi0gICAgICAgIEFkZHJlc3NCb29rRW50cnkgZW50cnkgPSBmYWN0b3J5LmNyZWF0ZUFkZHJlc3NCb29rRW50cnkoKTsNCi0gICAgICAgIGVudHJ5LnNldEZpcnN0TmFtZSgiSm9lIik7DQotICAgICAgICBlbnRyeS5zZXRMYXN0TmFtZSgiVGVzdCIpOw0KLSAgICAgICAgZW50cnkuc2V0U3RyZWV0KCIxMjE0IFRlc3QgTG4uIik7DQotICAgICAgICBlbnRyeS5zZXRDaXR5KCJBdXN0aW4iKTsNCi0gICAgICAgIGVudHJ5LnNldFN0YXRlKCJUWCIpOw0KLSAgICAgICAgZGF0YS5hZGQoZW50cnkpOw0KLSAgICAgICAgDQotICAgICAgICBlbnRyeSA9IGZhY3RvcnkuY3JlYXRlQWRkcmVzc0Jvb2tFbnRyeSgpOw0KLSAgICAgICAgZW50cnkuc2V0Rmlyc3ROYW1lKCJTdWUiKTsNCi0gICAgICAgIGVudHJ5LnNldExhc3ROYW1lKCJUZXN0ZmllbGQiKTsNCi0gICAgICAgIGVudHJ5LnNldFN0cmVldCgiNzgwIDFzdCBTdC4iKTsNCi0gICAgICAgIGVudHJ5LnNldENpdHkoIk5ldyBZb3JrIik7DQotICAgICAgICBlbnRyeS5zZXRTdGF0ZSgiTlkiKTsNCi0gICAgICAgIGRhdGEuYWRkKGVudHJ5KTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIGJvb2xlYW4gYWRkRW50cnkoQWRkcmVzc0Jvb2tFbnRyeSBlbnRyeSkgew0KLSAgICAgICAgaWYgKGVudHJ5ICE9IG51bGwpIHsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiTmV3IEFkZHJlc3NCb29rRW50cnkgcmVjZWl2ZWQiKTsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlcg0KLSAgICAgICAgICAgICAgICAgICAgLmRlYnVnKCIgICAgICAgW25hbWVdICIgKyBlbnRyeS5nZXRMYXN0TmFtZSgpICsgIiwgIiArIGVudHJ5LmdldEZpcnN0TmFtZSgpKTsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiICAgICAgW3Bob25lXSAiICsgZW50cnkuZ2V0UGhvbmUoKSk7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIiAgICAgW3N0cmVldF0gIiArIGVudHJ5LmdldFN0cmVldCgpKTsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiW2NpdHksIHN0YXRlXSAiICsgZW50cnkuZ2V0Q2l0eSgpICsgIiwgIiArIGVudHJ5LmdldFN0YXRlKCkpOw0KLSAgICAgICAgICAgIGRhdGEuYWRkKGVudHJ5KTsNCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2Ugew0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQWRkcmVzc0Jvb2tFbnRyeSBmaW5kRW50cnlCeU5hbWUoU3RyaW5nIGZpcnN0bmFtZSwgU3RyaW5nIGxhc3RuYW1lKSB7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiTmV3IHJlcXVlc3QgcmVjZWl2ZWQuIik7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiTG9va2luZyBmb3IgZW50cnk6IFsiICsgZmlyc3RuYW1lICsgIl0gWyIgKyBsYXN0bmFtZSArICJdIik7DQotICAgICAgICBJdGVyYXRvcjxBZGRyZXNzQm9va0VudHJ5PiBpID0gZGF0YS5pdGVyYXRvcigpOw0KLSAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKSB7DQotICAgICAgICAgICAgQWRkcmVzc0Jvb2tFbnRyeSBlbnRyeSA9IGkubmV4dCgpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vSWYgdGhleSBoYXZlIGEgZmlyc3RuYW1lIGFuZCBpdCBkb2Vzbid0IG1hdGNoLCBqdXN0IGdvIG9uDQotICAgICAgICAgICAgLy90byB0aGUgbmV4dCBlbnRyeS4NCi0gICAgICAgICAgICBpZiAoZmlyc3RuYW1lICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgaWYgKCFmaXJzdG5hbWUuZXF1YWxzKGVudHJ5LmdldEZpcnN0TmFtZSgpKSkNCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAgICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIGlmIChsYXN0bmFtZSAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgIGlmIChsYXN0bmFtZS5lcXVhbHMoZW50cnkuZ2V0TGFzdE5hbWUoKSkpDQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW50cnk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLSAgICANCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hZGRyZXNzYm9vay9GaW5kRW50cnlCeU5hbWUuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkcmVzc2Jvb2svRmluZEVudHJ5QnlOYW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2MTMyN2EuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hZGRyZXNzYm9vay9GaW5kRW50cnlCeU5hbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5hZGRyZXNzYm9vazsNCi0NCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOw0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZTsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50Ow0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50Ow0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGU7DQotDQotDQotLyoqDQotICogPHA+SmF2YSBjbGFzcyBmb3IgZmluZEVudHJ5QnlOYW1lIGVsZW1lbnQgZGVjbGFyYXRpb24uDQotICogDQotICogPHA+VGhlIGZvbGxvd2luZyBzY2hlbWEgZnJhZ21lbnQgc3BlY2lmaWVzIHRoZSBleHBlY3RlZCBjb250ZW50IGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBjbGFzcy4NCi0gKiANCi0gKiA8cHJlPg0KLSAqICZsdDtlbGVtZW50IG5hbWU9ImZpbmRFbnRyeUJ5TmFtZSI+DQotICogICAmbHQ7Y29tcGxleFR5cGU+DQotICogICAgICZsdDtjb21wbGV4Q29udGVudD4NCi0gKiAgICAgICAmbHQ7cmVzdHJpY3Rpb24gYmFzZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfWFueVR5cGUiPg0KLSAqICAgICAgICAgJmx0O3NlcXVlbmNlPg0KLSAqICAgICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJmaXJzdG5hbWUiIHR5cGU9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1zdHJpbmciLz4NCi0gKiAgICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0ibGFzdG5hbWUiIHR5cGU9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1zdHJpbmciLz4NCi0gKiAgICAgICAgICZsdDsvc2VxdWVuY2U+DQotICogICAgICAgJmx0Oy9yZXN0cmljdGlvbj4NCi0gKiAgICAgJmx0Oy9jb21wbGV4Q29udGVudD4NCi0gKiAgICZsdDsvY29tcGxleFR5cGU+DQotICogJmx0Oy9lbGVtZW50Pg0KLSAqIDwvcHJlPg0KLSAqIA0KLSAqIA0KLSAqLw0KLUBYbWxBY2Nlc3NvclR5cGUoWG1sQWNjZXNzVHlwZS5GSUVMRCkNCi1AWG1sVHlwZShuYW1lID0gIiIsIHByb3BPcmRlciA9IHsNCi0gICAgImZpcnN0bmFtZSIsDQotICAgICJsYXN0bmFtZSINCi19KQ0KLUBYbWxSb290RWxlbWVudChuYW1lID0gImZpbmRFbnRyeUJ5TmFtZSIpDQotcHVibGljIGNsYXNzIEZpbmRFbnRyeUJ5TmFtZSB7DQotDQotICAgIEBYbWxFbGVtZW50KG5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkcmVzc2Jvb2siLCByZXF1aXJlZCA9IHRydWUsIG5pbGxhYmxlID0gdHJ1ZSkNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBmaXJzdG5hbWU7DQotICAgIEBYbWxFbGVtZW50KG5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkcmVzc2Jvb2siLCByZXF1aXJlZCA9IHRydWUpDQotICAgIHByb3RlY3RlZCBTdHJpbmcgbGFzdG5hbWU7DQotDQotICAgIC8qKg0KLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZmlyc3RuYW1lIHByb3BlcnR5Lg0KLSAgICAgKiANCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcG9zc2libGUgb2JqZWN0IGlzDQotICAgICAqICAgICB7QGxpbmsgU3RyaW5nIH0NCi0gICAgICogICAgIA0KLSAgICAgKi8NCi0gICAgcHVibGljIFN0cmluZyBnZXRGaXJzdG5hbWUoKSB7DQotICAgICAgICByZXR1cm4gZmlyc3RuYW1lOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZmlyc3RuYW1lIHByb3BlcnR5Lg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIHZhbHVlDQotICAgICAqICAgICBhbGxvd2VkIG9iamVjdCBpcw0KLSAgICAgKiAgICAge0BsaW5rIFN0cmluZyB9DQotICAgICAqICAgICANCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHNldEZpcnN0bmFtZShTdHJpbmcgdmFsdWUpIHsNCi0gICAgICAgIHRoaXMuZmlyc3RuYW1lID0gdmFsdWU7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBsYXN0bmFtZSBwcm9wZXJ0eS4NCi0gICAgICogDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHBvc3NpYmxlIG9iamVjdCBpcw0KLSAgICAgKiAgICAge0BsaW5rIFN0cmluZyB9DQotICAgICAqICAgICANCi0gICAgICovDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGFzdG5hbWUoKSB7DQotICAgICAgICByZXR1cm4gbGFzdG5hbWU7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBsYXN0bmFtZSBwcm9wZXJ0eS4NCi0gICAgICogDQotICAgICAqIEBwYXJhbSB2YWx1ZQ0KLSAgICAgKiAgICAgYWxsb3dlZCBvYmplY3QgaXMNCi0gICAgICogICAgIHtAbGluayBTdHJpbmcgfQ0KLSAgICAgKiAgICAgDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBzZXRMYXN0bmFtZShTdHJpbmcgdmFsdWUpIHsNCi0gICAgICAgIHRoaXMubGFzdG5hbWUgPSB2YWx1ZTsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FkZHJlc3Nib29rL0ZpbmRFbnRyeUJ5TmFtZVJlc3BvbnNlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FkZHJlc3Nib29rL0ZpbmRFbnRyeUJ5TmFtZVJlc3BvbnNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4MDE3YzguLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hZGRyZXNzYm9vay9GaW5kRW50cnlCeU5hbWVSZXNwb25zZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuYWRkcmVzc2Jvb2s7DQotDQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzVHlwZTsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7DQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudDsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSb290RWxlbWVudDsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlOw0KLQ0KLQ0KLS8qKg0KLSAqIDxwPkphdmEgY2xhc3MgZm9yIGZpbmRFbnRyeUJ5TmFtZVJlc3BvbnNlIGVsZW1lbnQgZGVjbGFyYXRpb24uDQotICogDQotICogPHA+VGhlIGZvbGxvd2luZyBzY2hlbWEgZnJhZ21lbnQgc3BlY2lmaWVzIHRoZSBleHBlY3RlZCBjb250ZW50IGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBjbGFzcy4NCi0gKiANCi0gKiA8cHJlPg0KLSAqICZsdDtlbGVtZW50IG5hbWU9ImZpbmRFbnRyeUJ5TmFtZVJlc3BvbnNlIj4NCi0gKiAgICZsdDtjb21wbGV4VHlwZT4NCi0gKiAgICAgJmx0O2NvbXBsZXhDb250ZW50Pg0KLSAqICAgICAgICZsdDtyZXN0cmljdGlvbiBiYXNlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9YW55VHlwZSI+DQotICogICAgICAgICAmbHQ7c2VxdWVuY2U+DQotICogICAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9ImVudHJ5IiB0eXBlPSJ7aHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FkZHJlc3Nib29rfUFkZHJlc3NCb29rRW50cnkiLz4NCi0gKiAgICAgICAgICZsdDsvc2VxdWVuY2U+DQotICogICAgICAgJmx0Oy9yZXN0cmljdGlvbj4NCi0gKiAgICAgJmx0Oy9jb21wbGV4Q29udGVudD4NCi0gKiAgICZsdDsvY29tcGxleFR5cGU+DQotICogJmx0Oy9lbGVtZW50Pg0KLSAqIDwvcHJlPg0KLSAqIA0KLSAqIA0KLSAqLw0KLUBYbWxBY2Nlc3NvclR5cGUoWG1sQWNjZXNzVHlwZS5GSUVMRCkNCi1AWG1sVHlwZShuYW1lID0gIiIsIHByb3BPcmRlciA9IHsNCi0gICAgImVudHJ5Ig0KLX0pDQotQFhtbFJvb3RFbGVtZW50KG5hbWUgPSAiZmluZEVudHJ5QnlOYW1lUmVzcG9uc2UiKQ0KLXB1YmxpYyBjbGFzcyBGaW5kRW50cnlCeU5hbWVSZXNwb25zZSB7DQotDQotICAgIEBYbWxFbGVtZW50KG5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkcmVzc2Jvb2siLCByZXF1aXJlZCA9IHRydWUpDQotICAgIHByb3RlY3RlZCBBZGRyZXNzQm9va0VudHJ5IGVudHJ5Ow0KLQ0KLSAgICAvKioNCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGVudHJ5IHByb3BlcnR5Lg0KLSAgICAgKiANCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcG9zc2libGUgb2JqZWN0IGlzDQotICAgICAqICAgICB7QGxpbmsgQWRkcmVzc0Jvb2tFbnRyeSB9DQotICAgICAqICAgICANCi0gICAgICovDQotICAgIHB1YmxpYyBBZGRyZXNzQm9va0VudHJ5IGdldEVudHJ5KCkgew0KLSAgICAgICAgcmV0dXJuIGVudHJ5Ow0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZW50cnkgcHJvcGVydHkuDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gdmFsdWUNCi0gICAgICogICAgIGFsbG93ZWQgb2JqZWN0IGlzDQotICAgICAqICAgICB7QGxpbmsgQWRkcmVzc0Jvb2tFbnRyeSB9DQotICAgICAqICAgICANCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHNldEVudHJ5KEFkZHJlc3NCb29rRW50cnkgdmFsdWUpIHsNCi0gICAgICAgIHRoaXMuZW50cnkgPSB2YWx1ZTsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FkZHJlc3Nib29rL01FVEEtSU5GL0FkZHJlc3NCb29rU2VydmljZS53c2RsIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hZGRyZXNzYm9vay9NRVRBLUlORi9BZGRyZXNzQm9va1NlcnZpY2Uud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTliOTNjOC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FkZHJlc3Nib29rL01FVEEtSU5GL0FkZHJlc3NCb29rU2VydmljZS53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotDQotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPHdzZGw6ZGVmaW5pdGlvbnMgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkcmVzc2Jvb2siDQotICAgIHhtbG5zOmltcGw9Imh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hZGRyZXNzYm9vayIgDQotICAgIHhtbG5zOmludGY9Imh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hZGRyZXNzYm9vayIgDQotICAgIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiANCi0gICAgeG1sbnM6d3NkbHNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iIA0KLSAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4NCi0gIDx3c2RsOnR5cGVzPg0KLSAgICAgPHNjaGVtYSBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkcmVzc2Jvb2siIA0KLSAgICAgICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgDQotICAgICAgICAgeG1sbnM6aW1wbD0iaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FkZHJlc3Nib29rIiANCi0gICAgICAgICB4bWxuczppbnRmPSJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkcmVzc2Jvb2siIA0KLSAgICAgICAgIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiANCi0gICAgICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4NCi0NCi0gICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9IkFkZHJlc3NCb29rRW50cnkiPg0KLSAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImZpcnN0TmFtZSIgbmlsbGFibGU9ImZhbHNlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+DQotICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJsYXN0TmFtZSIgbmlsbGFibGU9ImZhbHNlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+DQotICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJwaG9uZSIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzZDpzdHJpbmciLz4NCi0gICAgICAgICAgIDxlbGVtZW50IG5hbWU9InN0cmVldCIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzZDpzdHJpbmciLz4NCi0gICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImNpdHkiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+DQotICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJzdGF0ZSIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzZDpzdHJpbmciLz4NCi0gICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgICANCi0gICAgICAgPGVsZW1lbnQgbmFtZT0iYWRkRW50cnkiPg0KLSAgICAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iZW50cnkiIG5pbGxhYmxlPSJmYWxzZSIgdHlwZT0iaW1wbDpBZGRyZXNzQm9va0VudHJ5Ii8+DQotICAgICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDwvY29tcGxleFR5cGU+DQotICAgICAgIDwvZWxlbWVudD4NCi0gICAgDQotICAgICAgIDxlbGVtZW50IG5hbWU9ImFkZEVudHJ5UmVzcG9uc2UiPg0KLSAgICAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0ic3RhdHVzIiBuaWxsYWJsZT0iZmFsc2UiIHR5cGU9InhzZDpib29sZWFuIi8+DQotICAgICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDwvY29tcGxleFR5cGU+DQotICAgICAgIDwvZWxlbWVudD4NCi0NCi0gICAgICAgPGVsZW1lbnQgbmFtZT0iZmluZEVudHJ5QnlOYW1lIj4NCi0gICAgICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImZpcnN0bmFtZSIgbmlsbGFibGU9ImZhbHNlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+DQotICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Imxhc3RuYW1lIiBuaWxsYWJsZT0iZmFsc2UiIHR5cGU9InhzZDpzdHJpbmciLz4NCi0gICAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICAgICAgPC9lbGVtZW50Pg0KLSAgICAgICANCi0gICAgICAgPGVsZW1lbnQgbmFtZT0iZmluZEVudHJ5QnlOYW1lUmVzcG9uc2UiPg0KLSAgICAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iZW50cnkiIG5pbGxhYmxlPSJmYWxzZSIgdHlwZT0iaW1wbDpBZGRyZXNzQm9va0VudHJ5Ii8+DQotICAgICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDwvY29tcGxleFR5cGU+DQotICAgICAgIDwvZWxlbWVudD4NCi0NCi0gICAgIDwvc2NoZW1hPg0KLSAgIDwvd3NkbDp0eXBlcz4NCi0gDQotICA8d3NkbDptZXNzYWdlIG5hbWU9ImFkZEVudHJ5UmVxdWVzdCI+DQotICAgIDx3c2RsOnBhcnQgZWxlbWVudD0iaW1wbDphZGRFbnRyeSIgbmFtZT0icGFyYW1ldGVycyIvPg0KLSAgPC93c2RsOm1lc3NhZ2U+DQotIA0KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJhZGRFbnRyeVJlc3BvbnNlIj4NCi0gICAgPHdzZGw6cGFydCBlbGVtZW50PSJpbXBsOmFkZEVudHJ5UmVzcG9uc2UiIG5hbWU9InBhcmFtZXRlcnMiLz4NCi0gIDwvd3NkbDptZXNzYWdlPg0KLQ0KLSA8d3NkbDptZXNzYWdlIG5hbWU9ImZpbmRFbnRyeUJ5TmFtZVJlcXVlc3QiPg0KLSAgICA8d3NkbDpwYXJ0IGVsZW1lbnQ9ImltcGw6ZmluZEVudHJ5QnlOYW1lIiBuYW1lPSJwYXJhbWV0ZXJzIi8+DQotICA8L3dzZGw6bWVzc2FnZT4NCi0gDQotICA8d3NkbDptZXNzYWdlIG5hbWU9ImZpbmRFbnRyeUJ5TmFtZVJlc3BvbnNlIj4NCi0gICAgPHdzZGw6cGFydCBlbGVtZW50PSJpbXBsOmZpbmRFbnRyeUJ5TmFtZVJlc3BvbnNlIiBuYW1lPSJwYXJhbWV0ZXJzIi8+DQotICA8L3dzZGw6bWVzc2FnZT4NCi0NCi0gIDx3c2RsOnBvcnRUeXBlIG5hbWU9IkFkZHJlc3NCb29rIj4NCi0gICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImFkZEVudHJ5Ij4NCi0gICAgICA8d3NkbDppbnB1dCBtZXNzYWdlPSJpbXBsOmFkZEVudHJ5UmVxdWVzdCIgbmFtZT0iYWRkRW50cnlSZXF1ZXN0Ii8+DQotICAgICAgPHdzZGw6b3V0cHV0IG1lc3NhZ2U9ImltcGw6YWRkRW50cnlSZXNwb25zZSIgbmFtZT0iYWRkRW50cnlSZXNwb25zZSIvPg0KLSAgICA8L3dzZGw6b3BlcmF0aW9uPg0KLSAgICANCi0gICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImZpbmRFbnRyeUJ5TmFtZSI+DQotICAgICAgPHdzZGw6aW5wdXQgbWVzc2FnZT0iaW1wbDpmaW5kRW50cnlCeU5hbWVSZXF1ZXN0IiBuYW1lPSJmaW5kRW50cnlCeU5hbWVSZXF1ZXN0Ii8+DQotICAgICAgPHdzZGw6b3V0cHV0IG1lc3NhZ2U9ImltcGw6ZmluZEVudHJ5QnlOYW1lUmVzcG9uc2UiIG5hbWU9ImZpbmRFbnRyeUJ5TmFtZVJlc3BvbnNlIi8+DQotICAgIDwvd3NkbDpvcGVyYXRpb24+DQotICA8L3dzZGw6cG9ydFR5cGU+DQotDQotICA8d3NkbDpiaW5kaW5nIG5hbWU9IkFkZHJlc3NCb29rU29hcCIgdHlwZT0iaW1wbDpBZGRyZXNzQm9vayI+DQotICAgIDx3c2Rsc29hcDpiaW5kaW5nIHN0eWxlPSJkb2N1bWVudCIgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiLz4NCi0gICAgDQotICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJhZGRFbnRyeSI+DQotICAgICAgPHdzZGxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4NCi0gICAgICA8d3NkbDppbnB1dCBuYW1lPSJhZGRFbnRyeVJlcXVlc3QiPg0KLSAgICAgICAgPHdzZGxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgPC93c2RsOmlucHV0Pg0KLSAgICAgIDx3c2RsOm91dHB1dCBuYW1lPSJhZGRFbnRyeVJlc3BvbnNlIj4NCi0gICAgICAgIDx3c2Rsc29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgIDwvd3NkbDpvdXRwdXQ+DQotICAgIDwvd3NkbDpvcGVyYXRpb24+DQotDQotICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJmaW5kRW50cnlCeU5hbWUiPg0KLSAgICAgIDx3c2Rsc29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+DQotICAgICAgPHdzZGw6aW5wdXQgbmFtZT0iZmluZEVudHJ5QnlOYW1lUmVxdWVzdCI+DQotICAgICAgICA8d3NkbHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4NCi0gICAgICA8L3dzZGw6aW5wdXQ+DQotICAgICAgPHdzZGw6b3V0cHV0IG5hbWU9ImZpbmRFbnRyeUJ5TmFtZVJlc3BvbnNlIj4NCi0gICAgICAgIDx3c2Rsc29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgIDwvd3NkbDpvdXRwdXQ+DQotICAgIDwvd3NkbDpvcGVyYXRpb24+DQotICA8L3dzZGw6YmluZGluZz4NCi0NCi0gIDx3c2RsOnNlcnZpY2UgbmFtZT0iQWRkcmVzc0Jvb2tTZXJ2aWNlIj4NCi0gICAgPHdzZGw6cG9ydCBiaW5kaW5nPSJpbXBsOkFkZHJlc3NCb29rU29hcCIgbmFtZT0iQWRkcmVzc0Jvb2siPg0KLSAgICAgIDx3c2Rsc29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjYwNjAvYXhpczIvc2VydmljZXMvQWRkcmVzc0Jvb2tTZXJ2aWNlIi8+DQotICAgIDwvd3NkbDpwb3J0Pg0KLSAgPC93c2RsOnNlcnZpY2U+DQotDQotPC93c2RsOmRlZmluaXRpb25zPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkcmVzc2Jvb2svT2JqZWN0RmFjdG9yeS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hZGRyZXNzYm9vay9PYmplY3RGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkYmZmOWEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hZGRyZXNzYm9vay9PYmplY3RGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5hZGRyZXNzYm9vazsNCi0NCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSZWdpc3RyeTsNCi0NCi0NCi0vKioNCi0gKiBUaGlzIG9iamVjdCBjb250YWlucyBmYWN0b3J5IG1ldGhvZHMgZm9yIGVhY2ggDQotICogSmF2YSBjb250ZW50IGludGVyZmFjZSBhbmQgSmF2YSBlbGVtZW50IGludGVyZmFjZSANCi0gKiBnZW5lcmF0ZWQgaW4gdGhlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLmFkZHJlc3Nib29rIHBhY2thZ2UuIA0KLSAqIDxwPkFuIE9iamVjdEZhY3RvcnkgYWxsb3dzIHlvdSB0byBwcm9ncmFtYXRpY2FsbHkgDQotICogY29uc3RydWN0IG5ldyBpbnN0YW5jZXMgb2YgdGhlIEphdmEgcmVwcmVzZW50YXRpb24gDQotICogZm9yIFhNTCBjb250ZW50LiBUaGUgSmF2YSByZXByZXNlbnRhdGlvbiBvZiBYTUwgDQotICogY29udGVudCBjYW4gY29uc2lzdCBvZiBzY2hlbWEgZGVyaXZlZCBpbnRlcmZhY2VzIA0KLSAqIGFuZCBjbGFzc2VzIHJlcHJlc2VudGluZyB0aGUgYmluZGluZyBvZiBzY2hlbWEgDQotICogdHlwZSBkZWZpbml0aW9ucywgZWxlbWVudCBkZWNsYXJhdGlvbnMgYW5kIG1vZGVsIA0KLSAqIGdyb3Vwcy4gIEZhY3RvcnkgbWV0aG9kcyBmb3IgZWFjaCBvZiB0aGVzZSBhcmUgDQotICogcHJvdmlkZWQgaW4gdGhpcyBjbGFzcy4NCi0gKiANCi0gKi8NCi1AWG1sUmVnaXN0cnkNCi1wdWJsaWMgY2xhc3MgT2JqZWN0RmFjdG9yeSB7DQotDQotDQotICAgIC8qKg0KLSAgICAgKiBDcmVhdGUgYSBuZXcgT2JqZWN0RmFjdG9yeSB0aGF0IGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBuZXcgaW5zdGFuY2VzIG9mIHNjaGVtYSBkZXJpdmVkIGNsYXNzZXMgZm9yIHBhY2thZ2U6IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLmFkZHJlc3Nib29rDQotICAgICAqIA0KLSAgICAgKi8NCi0gICAgcHVibGljIE9iamVjdEZhY3RvcnkoKSB7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgRmluZEVudHJ5QnlOYW1lIH0NCi0gICAgICogDQotICAgICAqLw0KLSAgICBwdWJsaWMgRmluZEVudHJ5QnlOYW1lIGNyZWF0ZUZpbmRFbnRyeUJ5TmFtZSgpIHsNCi0gICAgICAgIHJldHVybiBuZXcgRmluZEVudHJ5QnlOYW1lKCk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgQWRkRW50cnkgfQ0KLSAgICAgKiANCi0gICAgICovDQotICAgIHB1YmxpYyBBZGRFbnRyeSBjcmVhdGVBZGRFbnRyeSgpIHsNCi0gICAgICAgIHJldHVybiBuZXcgQWRkRW50cnkoKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBBZGRyZXNzQm9va0VudHJ5IH0NCi0gICAgICogDQotICAgICAqLw0KLSAgICBwdWJsaWMgQWRkcmVzc0Jvb2tFbnRyeSBjcmVhdGVBZGRyZXNzQm9va0VudHJ5KCkgew0KLSAgICAgICAgcmV0dXJuIG5ldyBBZGRyZXNzQm9va0VudHJ5KCk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgQWRkRW50cnlSZXNwb25zZSB9DQotICAgICAqIA0KLSAgICAgKi8NCi0gICAgcHVibGljIEFkZEVudHJ5UmVzcG9uc2UgY3JlYXRlQWRkRW50cnlSZXNwb25zZSgpIHsNCi0gICAgICAgIHJldHVybiBuZXcgQWRkRW50cnlSZXNwb25zZSgpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEZpbmRFbnRyeUJ5TmFtZVJlc3BvbnNlIH0NCi0gICAgICogDQotICAgICAqLw0KLSAgICBwdWJsaWMgRmluZEVudHJ5QnlOYW1lUmVzcG9uc2UgY3JlYXRlRmluZEVudHJ5QnlOYW1lUmVzcG9uc2UoKSB7DQotICAgICAgICByZXR1cm4gbmV3IEZpbmRFbnRyeUJ5TmFtZVJlc3BvbnNlKCk7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hZGRyZXNzYm9vay9wYWNrYWdlLWluZm8uamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkcmVzc2Jvb2svcGFja2FnZS1pbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1NTAzNmEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hZGRyZXNzYm9vay9wYWNrYWdlLWluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1AamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxTY2hlbWEobmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hZGRyZXNzYm9vayIpDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5hZGRyZXNzYm9vazsNCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FzeW5jZG9jbGl0L2NsaWVudC9Bc3luY0NsaWVudC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hc3luY2RvY2xpdC9jbGllbnQvQXN5bmNDbGllbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI2ZWJlYS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FzeW5jZG9jbGl0L2NsaWVudC9Bc3luY0NsaWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLmFzeW5jZG9jbGl0LmNsaWVudDsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3I7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVvdXRFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZheC54bWwud3MuQmluZGluZ1Byb3ZpZGVyOwotCi1wdWJsaWMgY2xhc3MgQXN5bmNDbGllbnQgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERPQ0xJVFdSX0FTWU5DX0VORFBPSU5UID0KLSAgICAgICAgImh0dHA6Ly9sb2NhbGhvc3Q6NjA2MC9heGlzMi9zZXJ2aWNlcy9Bc3luY1NlcnZpY2UyLkRvY0xpdFdyYXBwZWRQb3J0SW1wbFBvcnQiOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IG1heF9pc2FzbGVlcF9jaGVjayA9IDMwOwotCQotCS8qKgotCSAqIEF1eGlsaWFyeSBtZXRob2QgdXNlZCBmb3IgZG9paW5nIGlzQXNsZWVwIGNoZWNrcy4gV2lsbCBwZXJmb3JtIGlzQXNsZWVwCi0JICogdXAgdG8gYSBNQVhfSVNBU0xFRVBfQ0hFQ0sgbnVtYmVyIG9mIGNoZWNrcy4gV2lsbCBzbGVlcCBmb3IKLQkgKiBTTEVFUF9JU0FTTEVFUF9TRUMgc2Vjb25kcyBpbiBiZXR3ZWVuIHJlcXVlc3RzLiBJZiByZWFjaGVzIG1heGltdW0gbnVtYmVyCi0JICogZm8gcmV0cmllcyB0aGVuIHdpbGwgZmFpbCB0aGUgdGVzdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0FzbGVlcENoZWNrKFN0cmluZyBNRVNTQUdFLCBBc3luY1BvcnQgcG9ydCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWJvb2xlYW4gYXNsZWVwID0gZmFsc2U7Ci0JCWludCBjaGVjayA9IDU7IC8vQ29uc3RhbnRzLk1BWF9JU0FTTEVFUF9DSEVDSzsKLQkJU3RyaW5nIG1zZyA9IG51bGw7Ci0KLQkJZmluYWwgbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkKLQkJU3lzdGVtLm91dC5wcmludGxuKCJBc3luY0NsaWVudC5pc0FzbGVlcENoZWNrKCIgKyBNRVNTQUdFICsgIikgRW50ZXIiKTsKLQotCQlkbyB7Ci0JCQl0cnkgewotCQkJCW1zZyA9IHBvcnQuaXNBc2xlZXAoKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKXsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkFzeW5jQ2xpZW50LmlzQXNsZWVwQ2hlY2sgRXhjZXB0aW9uIG9uIGlzQXNsZWVwOiIgKyBlKTsKLQkJCQl0aHJvdyBlOwotCQkJfQotCQkJCi0JCQlhc2xlZXAgPSAobXNnICE9IG51bGwpOwotCi0JCQkvLyBmYWlsIHRoZSB0ZXN0IGlmIHdlIHJhbiBvdXQgb2YgY2hlY2tzCi0JCQlpZiAoKGNoZWNrLS0pID09IDApIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkFzeW5jQ2xpZW50LmlzQXNsZWVwQ2hlY2s9IiArIGFzbGVlcAotCQkJCQkJKyAiIGFmdGVyICIgKyAoLypDb25zdGFudHMuTUFYX0lTQVNMRUVQX0NIRUNLKi8gbWF4X2lzYXNsZWVwX2NoZWNrIC0gY2hlY2spCi0JCQkJCQkrICIgdHJpZXMiKTsKLQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiU2VydmVyIGRpZCBub3QgcmVjZWl2ZSBzbGVlcCBhZnRlciBzZXZlcmFsIHJldHJpZXMiKTsKLQkJCX0KLQotCQkJLy8gc2xlZXAgZm9yIGEgYml0Ci0JCQl0cnkgewotCQkJCVRocmVhZC5zbGVlcCgvKkNvbnN0YW50cy5TTEVFUF9JU0FTTEVFUF9TRUMqLyAxICogMTAwMCk7Ci0JCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJBc3luY0NsaWVudC5pc0FzbGVlcENoZWNrIChpZ25vcmVkIGVycm9yKSAiCi0JCQkJCQkrIGUpOwotCQkJfQotCi0JCX0gd2hpbGUgKCFhc2xlZXApOwotCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiQXN5bmNDbGllbnQuaXNBc2xlZXBDaGVjaygpIGFzbGVlcD0iICsgYXNsZWVwICsgIiBhZnRlciAiCi0JCQkJKyAoLypDb25zdGFudHMuTUFYX0lTQVNMRUVQX0NIRUNLKi8gbWF4X2lzYXNsZWVwX2NoZWNrIC0gY2hlY2spICsgIiB0cmllcyIpOwotCi0JCWlmIChhc2xlZXApIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQXN5bmNDbGllbnQuaXNBc2xlZXBDaGVjayBzbGVlcGluZyBvbjoiICsgbXNnKTsKLQkJCWlmICghTUVTU0FHRS5lcXVhbHMobXNnKSkgewotCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJTbGVlcGluZyBvbiBhbiBpbmNvcnJlY3QgbWVzc2FnZSIpOwotCQkJfQotCQl9Ci0KLQkJbG9uZyBtaW5zID0gKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnQpIC8gMTAwMDsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJBc3luY0NsaWVudC5pc0FzbGVlcENoZWNrKCkgRXhpdCwgdGltZT0iICsgbWlucyArICJtaW4iKTsKLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBBdXhpbGlhcnkgbWV0aG9kIHVzZWQgZm9yIG9idGFpbmluZyBhIHByb3h5IHByZS1jb25maWd1cmVkIHdpdGggYQotCSAqIHNwZWNpZmljIEV4ZWN1dG9yCi0JICovCi0JcHVibGljIHN0YXRpYyBBc3luY1BvcnQgZ2V0UG9ydChFeGVjdXRvciBleCkgewotCQlBc3luY1NlcnZpY2Ugc2VydmljZSA9IG5ldyBBc3luY1NlcnZpY2UoKTsKLQotCQlpZiAoZXggIT0gbnVsbCkgc2VydmljZS5zZXRFeGVjdXRvcihleCk7Ci0KLQkJQXN5bmNQb3J0IHBvcnQgPSBzZXJ2aWNlLmdldEFzeW5jUG9ydCgpOwotCQlpZiAocG9ydCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigic2VydmljZS5nZXRBc3luY1BvcnQoKSBpcyBudWxsIik7Ci0JCX0KLQotCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHJjID0gKChCaW5kaW5nUHJvdmlkZXIpIHBvcnQpLmdldFJlcXVlc3RDb250ZXh0KCk7Ci0JCXJjLnB1dChCaW5kaW5nUHJvdmlkZXIuRU5EUE9JTlRfQUREUkVTU19QUk9QRVJUWSwKLQkJCQlET0NMSVRXUl9BU1lOQ19FTkRQT0lOVCk7IC8vQ29uc3RhbnRzLkRPQ0xJVFdSX0FTWU5DX0VORFBPSU5UKTsKLQotCQlTeXN0ZW0ub3V0LnByaW50bG4oIkFzeW5jQ2xpZW50LmdldFBvcnQoKSA9ICIKLQkJCQkrIERPQ0xJVFdSX0FTWU5DX0VORFBPSU5UKTsgLy9Db25zdGFudHMuRE9DTElUV1JfQVNZTkNfRU5EUE9JTlQpOwotCi0JCXJldHVybiBwb3J0OwotCX0KLQotCS8qKgotCSAqIEF1eGlsaWFyeSBtZXRob2QgdXNlZCB0byB3YWl0IGZvciBhIG1vbml0b3IgZm9yIGEgY2VydGFpbiBhbW91bnQgb2YgdGltZQotCSAqIGJlZm9yZSB0aW1pbmcgb3V0Ci0JICogCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgd2FpdEJsb2NraW5nKEZ1dHVyZTw/PiBtb25pdG9yKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlTeXN0ZW0ub3V0LnByaW50bG4oIkFzeW5jQ2xpZW50LndhaXRCbG9ja2luZygpIEVudGVyIik7Ci0KLQkJLy8gd2FpdCBmb3IgcmVxdWVzdCB0byBjb21wbGV0ZQotCQlpbnQgc2VjID0gLypDb25zdGFudHMuQ0xJRU5UX01BWF9TTEVFUF9TRUMqLyBtYXhfaXNhc2xlZXBfY2hlY2s7Ci0JCXdoaWxlICghbW9uaXRvci5pc0RvbmUoKSAmJiAhbW9uaXRvci5pc0NhbmNlbGxlZCgpKSB7Ci0JCQlUaHJlYWQuc2xlZXAoMTAwMCk7Ci0JCQlzZWMtLTsKLQkJCWlmIChzZWMgPD0gMCkgYnJlYWs7Ci0JCX0KLQotCQlpZiAoc2VjIDw9IDApIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQXN5bmNDbGllbnQud2FpdEJsb2NraW5nIEV4aXQsIHRpbWVvdXQgYWZ0ZXIiCi0JCQkJCSsgLypDb25zdGFudHMuQ0xJRU5UX01BWF9TTEVFUF9TRUMqLyBtYXhfaXNhc2xlZXBfY2hlY2sgKyAiIHNlYyIpOwotCQkJCi0JCQl0aHJvdyBuZXcgVGltZW91dEV4Y2VwdGlvbigKLQkJCQkJIlN0b3BwZWQgd2FpdGluZyBmb3IgQXN5bmMgcmVzcG9uc2UgYWZ0ZXIgIgotCQkJCQkJCSsgLypDb25zdGFudHMuQ0xJRU5UX01BWF9TTEVFUF9TRUMqLyBtYXhfaXNhc2xlZXBfY2hlY2sgKyAiIHNlYyIpOwotCQl9IGVsc2UgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJBc3luY0NsaWVudC53YWl0QmxvY2tpbmcgRXhpdCwgIiArIHNlYwotCQkJCQkrICJzZWMgcmVtYWluaW5nIik7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FzeW5jZG9jbGl0L2NsaWVudC9Bc3luY1BvcnQuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYXN5bmNkb2NsaXQvY2xpZW50L0FzeW5jUG9ydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDMxMzA4Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYXN5bmNkb2NsaXQvY2xpZW50L0FzeW5jUG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0vLw0KLS8vIEdlbmVyYXRlZCBCeTpKQVgtV1MgUkkgSUJNIDIuMS4xIGluIEpESyA2IChKQVhCIFJJIElCTSBKQVhCIDIuMS4zIGluIEpESyAxLjYpDQotLy8NCi0NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLmFzeW5jZG9jbGl0LmNsaWVudDsNCi0NCi1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOw0KLQ0KLWltcG9ydCBqYXZheC5qd3MuV2ViTWV0aG9kOw0KLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW07DQotaW1wb3J0IGphdmF4Lmp3cy5XZWJSZXN1bHQ7DQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuQXN5bmNIYW5kbGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuSG9sZGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuUmVxdWVzdFdyYXBwZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5SZXNwb25zZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLlJlc3BvbnNlV3JhcHBlcjsNCi0NCi1pbXBvcnQgb3JnLnRlc3QuYXN5bmNkb2NsaXQuQW5vdGhlclJlc3BvbnNlOw0KLWltcG9ydCBvcmcudGVzdC5hc3luY2RvY2xpdC5DdXN0b21Bc3luY1Jlc3BvbnNlOw0KLWltcG9ydCBvcmcudGVzdC5hc3luY2RvY2xpdC5FeGNlcHRpb25UeXBlRW51bTsNCi1pbXBvcnQgb3JnLnRlc3QuYXN5bmNkb2NsaXQuSW52b2tlQXN5bmNSZXNwb25zZTsNCi1pbXBvcnQgb3JnLnRlc3QuYXN5bmNkb2NsaXQuUGluZ1Jlc3BvbnNlOw0KLWltcG9ydCBvcmcudGVzdC5hc3luY2RvY2xpdC5TbGVlcFJlc3BvbnNlOw0KLWltcG9ydCBvcmcudGVzdC5hc3luY2RvY2xpdC5UaHJvd0V4Y2VwdGlvblJlc3BvbnNlOw0KLQ0KLUBXZWJTZXJ2aWNlKG5hbWUgPSAiQXN5bmNQb3J0IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9hc3luY2RvY2xpdCIpDQotcHVibGljIGludGVyZmFjZSBBc3luY1BvcnQgew0KLQ0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSBtZXNzYWdlDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgamF2YXgueG1sLndzLlJlc3BvbnNlPG9yZy50ZXN0LmFzeW5jZG9jbGl0LlBpbmdSZXNwb25zZT4NCi0gICAgICovDQotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJwaW5nIiwgYWN0aW9uID0gInBpbmciKQ0KLSAgICBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gInBpbmciLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L2FzeW5jZG9jbGl0IiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LmFzeW5jZG9jbGl0LlBpbmciKQ0KLSAgICBAUmVzcG9uc2VXcmFwcGVyKGxvY2FsTmFtZSA9ICJwaW5nUmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L2FzeW5jZG9jbGl0IiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LmFzeW5jZG9jbGl0LlBpbmdSZXNwb25zZSIpDQotICAgIHB1YmxpYyBSZXNwb25zZTxQaW5nUmVzcG9uc2U+IHBpbmdBc3luYygNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gIm1lc3NhZ2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikNCi0gICAgICAgIFN0cmluZyBtZXNzYWdlKTsNCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gbWVzc2FnZQ0KLSAgICAgKiBAcGFyYW0gYXN5bmNIYW5kbGVyDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlPD8gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Pg0KLSAgICAgKi8NCi0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lID0gInBpbmciLCBhY3Rpb24gPSAicGluZyIpDQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAicGluZyIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL3Rlc3QvYXN5bmNkb2NsaXQiLCBjbGFzc05hbWUgPSAib3JnLnRlc3QuYXN5bmNkb2NsaXQuUGluZyIpDQotICAgIEBSZXNwb25zZVdyYXBwZXIobG9jYWxOYW1lID0gInBpbmdSZXNwb25zZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL3Rlc3QvYXN5bmNkb2NsaXQiLCBjbGFzc05hbWUgPSAib3JnLnRlc3QuYXN5bmNkb2NsaXQuUGluZ1Jlc3BvbnNlIikNCi0gICAgcHVibGljIEZ1dHVyZTw/PiBwaW5nQXN5bmMoDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJtZXNzYWdlIiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpDQotICAgICAgICBTdHJpbmcgbWVzc2FnZSwNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImFzeW5jSGFuZGxlciIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQ0KLSAgICAgICAgQXN5bmNIYW5kbGVyPFBpbmdSZXNwb25zZT4gYXN5bmNIYW5kbGVyKTsNCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gbWVzc2FnZQ0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIGphdmEubGFuZy5TdHJpbmcNCi0gICAgICovDQotICAgIEBXZWJNZXRob2QoYWN0aW9uID0gInBpbmciKQ0KLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAicmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikNCi0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJwaW5nIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9hc3luY2RvY2xpdCIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5hc3luY2RvY2xpdC5QaW5nIikNCi0gICAgQFJlc3BvbnNlV3JhcHBlcihsb2NhbE5hbWUgPSAicGluZ1Jlc3BvbnNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9hc3luY2RvY2xpdCIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5hc3luY2RvY2xpdC5QaW5nUmVzcG9uc2UiKQ0KLSAgICBwdWJsaWMgU3RyaW5nIHBpbmcoDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJtZXNzYWdlIiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpDQotICAgICAgICBTdHJpbmcgbWVzc2FnZSk7DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIG1lc3NhZ2UNCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBqYXZheC54bWwud3MuUmVzcG9uc2U8b3JnLnRlc3QuYXN5bmNkb2NsaXQuU2xlZXBSZXNwb25zZT4NCi0gICAgICovDQotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJzbGVlcCIsIGFjdGlvbiA9ICJzbGVlcCIpDQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAic2xlZXAiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L2FzeW5jZG9jbGl0IiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LmFzeW5jZG9jbGl0LlNsZWVwIikNCi0gICAgQFJlc3BvbnNlV3JhcHBlcihsb2NhbE5hbWUgPSAic2xlZXBSZXNwb25zZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL3Rlc3QvYXN5bmNkb2NsaXQiLCBjbGFzc05hbWUgPSAib3JnLnRlc3QuYXN5bmNkb2NsaXQuU2xlZXBSZXNwb25zZSIpDQotICAgIHB1YmxpYyBSZXNwb25zZTxTbGVlcFJlc3BvbnNlPiBzbGVlcEFzeW5jKA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAibWVzc2FnZSIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQ0KLSAgICAgICAgU3RyaW5nIG1lc3NhZ2UpOw0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSBtZXNzYWdlDQotICAgICAqIEBwYXJhbSBhc3luY0hhbmRsZXINCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU8PyBleHRlbmRzIGphdmEubGFuZy5PYmplY3Q+DQotICAgICAqLw0KLSAgICBAV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWUgPSAic2xlZXAiLCBhY3Rpb24gPSAic2xlZXAiKQ0KLSAgICBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gInNsZWVwIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9hc3luY2RvY2xpdCIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5hc3luY2RvY2xpdC5TbGVlcCIpDQotICAgIEBSZXNwb25zZVdyYXBwZXIobG9jYWxOYW1lID0gInNsZWVwUmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L2FzeW5jZG9jbGl0IiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LmFzeW5jZG9jbGl0LlNsZWVwUmVzcG9uc2UiKQ0KLSAgICBwdWJsaWMgRnV0dXJlPD8+IHNsZWVwQXN5bmMoDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJtZXNzYWdlIiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpDQotICAgICAgICBTdHJpbmcgbWVzc2FnZSwNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImFzeW5jSGFuZGxlciIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQ0KLSAgICAgICAgQXN5bmNIYW5kbGVyPFNsZWVwUmVzcG9uc2U+IGFzeW5jSGFuZGxlcik7DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIG1lc3NhZ2UNCi0gICAgICovDQotICAgIEBXZWJNZXRob2QoYWN0aW9uID0gInNsZWVwIikNCi0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJzbGVlcCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL3Rlc3QvYXN5bmNkb2NsaXQiLCBjbGFzc05hbWUgPSAib3JnLnRlc3QuYXN5bmNkb2NsaXQuU2xlZXAiKQ0KLSAgICBAUmVzcG9uc2VXcmFwcGVyKGxvY2FsTmFtZSA9ICJzbGVlcFJlc3BvbnNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9hc3luY2RvY2xpdCIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5hc3luY2RvY2xpdC5TbGVlcFJlc3BvbnNlIikNCi0gICAgcHVibGljIHZvaWQgc2xlZXAoDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJtZXNzYWdlIiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIsIG1vZGUgPSBXZWJQYXJhbS5Nb2RlLklOT1VUKQ0KLSAgICAgICAgSG9sZGVyPFN0cmluZz4gbWVzc2FnZSk7DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBqYXZhLmxhbmcuU3RyaW5nDQotICAgICAqLw0KLSAgICBAV2ViTWV0aG9kKGFjdGlvbiA9ICJpc0FzbGVlcCIpDQotICAgIEBXZWJSZXN1bHQobmFtZSA9ICJtZXNzYWdlIiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpDQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAiaXNBc2xlZXAiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L2FzeW5jZG9jbGl0IiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LmFzeW5jZG9jbGl0LklzQXNsZWVwIikNCi0gICAgQFJlc3BvbnNlV3JhcHBlcihsb2NhbE5hbWUgPSAiaXNBc2xlZXBSZXNwb25zZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL3Rlc3QvYXN5bmNkb2NsaXQiLCBjbGFzc05hbWUgPSAib3JnLnRlc3QuYXN5bmNkb2NsaXQuSXNBc2xlZXBSZXNwb25zZSIpDQotICAgIHB1YmxpYyBTdHJpbmcgaXNBc2xlZXAoKTsNCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIGphdmEubGFuZy5TdHJpbmcNCi0gICAgICovDQotICAgIEBXZWJNZXRob2QoYWN0aW9uID0gIndha2VVcCIpDQotICAgIEBXZWJSZXN1bHQobmFtZSA9ICJtZXNzYWdlIiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpDQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAid2FrZVVwIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9hc3luY2RvY2xpdCIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5hc3luY2RvY2xpdC5XYWtlVXAiKQ0KLSAgICBAUmVzcG9uc2VXcmFwcGVyKGxvY2FsTmFtZSA9ICJ3YWtlVXBSZXNwb25zZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL3Rlc3QvYXN5bmNkb2NsaXQiLCBjbGFzc05hbWUgPSAib3JnLnRlc3QuYXN5bmNkb2NsaXQuV2FrZVVwUmVzcG9uc2UiKQ0KLSAgICBwdWJsaWMgU3RyaW5nIHdha2VVcCgpOw0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSByZXF1ZXN0DQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgamF2YXgueG1sLndzLlJlc3BvbnNlPG9yZy50ZXN0LmFzeW5jZG9jbGl0Lkludm9rZUFzeW5jUmVzcG9uc2U+DQotICAgICAqLw0KLSAgICBAV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWUgPSAiaW52b2tlQXN5bmMiLCBhY3Rpb24gPSAiaW52b2tlQXN5bmMiKQ0KLSAgICBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gImludm9rZUFzeW5jIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9hc3luY2RvY2xpdCIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5hc3luY2RvY2xpdC5JbnZva2VBc3luYyIpDQotICAgIEBSZXNwb25zZVdyYXBwZXIobG9jYWxOYW1lID0gImludm9rZUFzeW5jUmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L2FzeW5jZG9jbGl0IiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LmFzeW5jZG9jbGl0Lkludm9rZUFzeW5jUmVzcG9uc2UiKQ0KLSAgICBwdWJsaWMgUmVzcG9uc2U8SW52b2tlQXN5bmNSZXNwb25zZT4gaW52b2tlQXN5bmNBc3luYygNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gInJlcXVlc3QiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikNCi0gICAgICAgIFN0cmluZyByZXF1ZXN0KTsNCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gYXN5bmNIYW5kbGVyDQotICAgICAqIEBwYXJhbSByZXF1ZXN0DQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlPD8gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Pg0KLSAgICAgKi8NCi0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lID0gImludm9rZUFzeW5jIiwgYWN0aW9uID0gImludm9rZUFzeW5jIikNCi0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJpbnZva2VBc3luYyIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL3Rlc3QvYXN5bmNkb2NsaXQiLCBjbGFzc05hbWUgPSAib3JnLnRlc3QuYXN5bmNkb2NsaXQuSW52b2tlQXN5bmMiKQ0KLSAgICBAUmVzcG9uc2VXcmFwcGVyKGxvY2FsTmFtZSA9ICJpbnZva2VBc3luY1Jlc3BvbnNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9hc3luY2RvY2xpdCIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5hc3luY2RvY2xpdC5JbnZva2VBc3luY1Jlc3BvbnNlIikNCi0gICAgcHVibGljIEZ1dHVyZTw/PiBpbnZva2VBc3luY0FzeW5jKA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAicmVxdWVzdCIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQ0KLSAgICAgICAgU3RyaW5nIHJlcXVlc3QsDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJhc3luY0hhbmRsZXIiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikNCi0gICAgICAgIEFzeW5jSGFuZGxlcjxJbnZva2VBc3luY1Jlc3BvbnNlPiBhc3luY0hhbmRsZXIpOw0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSByZXF1ZXN0DQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgamF2YS5sYW5nLlN0cmluZw0KLSAgICAgKi8NCi0gICAgQFdlYk1ldGhvZChhY3Rpb24gPSAiaW52b2tlQXN5bmMiKQ0KLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAicmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikNCi0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJpbnZva2VBc3luYyIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL3Rlc3QvYXN5bmNkb2NsaXQiLCBjbGFzc05hbWUgPSAib3JnLnRlc3QuYXN5bmNkb2NsaXQuSW52b2tlQXN5bmMiKQ0KLSAgICBAUmVzcG9uc2VXcmFwcGVyKGxvY2FsTmFtZSA9ICJpbnZva2VBc3luY1Jlc3BvbnNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9hc3luY2RvY2xpdCIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5hc3luY2RvY2xpdC5JbnZva2VBc3luY1Jlc3BvbnNlIikNCi0gICAgcHVibGljIFN0cmluZyBpbnZva2VBc3luYygNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gInJlcXVlc3QiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikNCi0gICAgICAgIFN0cmluZyByZXF1ZXN0KTsNCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gcmVxdWVzdA0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIGphdmF4LnhtbC53cy5SZXNwb25zZTxvcmcudGVzdC5hc3luY2RvY2xpdC5DdXN0b21Bc3luY1Jlc3BvbnNlPg0KLSAgICAgKi8NCi0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lID0gImN1c3RvbUFzeW5jIiwgYWN0aW9uID0gImN1c3RvbUFzeW5jIikNCi0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJjdXN0b21Bc3luYyIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL3Rlc3QvYXN5bmNkb2NsaXQiLCBjbGFzc05hbWUgPSAib3JnLnRlc3QuYXN5bmNkb2NsaXQuQ3VzdG9tQXN5bmMiKQ0KLSAgICBAUmVzcG9uc2VXcmFwcGVyKGxvY2FsTmFtZSA9ICJjdXN0b21Bc3luY1Jlc3BvbnNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9hc3luY2RvY2xpdCIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5hc3luY2RvY2xpdC5DdXN0b21Bc3luY1Jlc3BvbnNlIikNCi0gICAgcHVibGljIFJlc3BvbnNlPEN1c3RvbUFzeW5jUmVzcG9uc2U+IHJlbWFwcGVkQXN5bmMoDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJyZXF1ZXN0IiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpDQotICAgICAgICBTdHJpbmcgcmVxdWVzdCk7DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGFzeW5jSGFuZGxlcg0KLSAgICAgKiBAcGFyYW0gcmVxdWVzdA0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTw/IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdD4NCi0gICAgICovDQotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJjdXN0b21Bc3luYyIsIGFjdGlvbiA9ICJjdXN0b21Bc3luYyIpDQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAiY3VzdG9tQXN5bmMiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L2FzeW5jZG9jbGl0IiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LmFzeW5jZG9jbGl0LkN1c3RvbUFzeW5jIikNCi0gICAgQFJlc3BvbnNlV3JhcHBlcihsb2NhbE5hbWUgPSAiY3VzdG9tQXN5bmNSZXNwb25zZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL3Rlc3QvYXN5bmNkb2NsaXQiLCBjbGFzc05hbWUgPSAib3JnLnRlc3QuYXN5bmNkb2NsaXQuQ3VzdG9tQXN5bmNSZXNwb25zZSIpDQotICAgIHB1YmxpYyBGdXR1cmU8Pz4gcmVtYXBwZWRBc3luYygNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gInJlcXVlc3QiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikNCi0gICAgICAgIFN0cmluZyByZXF1ZXN0LA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiYXN5bmNIYW5kbGVyIiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpDQotICAgICAgICBBc3luY0hhbmRsZXI8Q3VzdG9tQXN5bmNSZXNwb25zZT4gYXN5bmNIYW5kbGVyKTsNCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gcmVxdWVzdA0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIGphdmEubGFuZy5TdHJpbmcNCi0gICAgICovDQotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJjdXN0b21Bc3luYyIsIGFjdGlvbiA9ICJjdXN0b21Bc3luYyIpDQotICAgIEBXZWJSZXN1bHQobmFtZSA9ICJyZXNwb25zZSIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQ0KLSAgICBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gImN1c3RvbUFzeW5jIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9hc3luY2RvY2xpdCIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5hc3luY2RvY2xpdC5DdXN0b21Bc3luYyIpDQotICAgIEBSZXNwb25zZVdyYXBwZXIobG9jYWxOYW1lID0gImN1c3RvbUFzeW5jUmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L2FzeW5jZG9jbGl0IiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LmFzeW5jZG9jbGl0LkN1c3RvbUFzeW5jUmVzcG9uc2UiKQ0KLSAgICBwdWJsaWMgU3RyaW5nIHJlbWFwcGVkKA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAicmVxdWVzdCIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQ0KLSAgICAgICAgU3RyaW5nIHJlcXVlc3QpOw0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSByZXF1ZXN0DQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgamF2YXgueG1sLndzLlJlc3BvbnNlPG9yZy50ZXN0LmFzeW5jZG9jbGl0LkFub3RoZXJSZXNwb25zZT4NCi0gICAgICovDQotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJhbm90aGVyIiwgYWN0aW9uID0gImFub3RoZXIiKQ0KLSAgICBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gImFub3RoZXIiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L2FzeW5jZG9jbGl0IiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LmFzeW5jZG9jbGl0LkFub3RoZXIiKQ0KLSAgICBAUmVzcG9uc2VXcmFwcGVyKGxvY2FsTmFtZSA9ICJhbm90aGVyUmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L2FzeW5jZG9jbGl0IiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LmFzeW5jZG9jbGl0LkFub3RoZXJSZXNwb25zZSIpDQotICAgIHB1YmxpYyBSZXNwb25zZTxBbm90aGVyUmVzcG9uc2U+IGFub3RoZXJBc3luY0FzeW5jKA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAicmVxdWVzdCIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQ0KLSAgICAgICAgU3RyaW5nIHJlcXVlc3QpOw0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSBhc3luY0hhbmRsZXINCi0gICAgICogQHBhcmFtIHJlcXVlc3QNCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU8PyBleHRlbmRzIGphdmEubGFuZy5PYmplY3Q+DQotICAgICAqLw0KLSAgICBAV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWUgPSAiYW5vdGhlciIsIGFjdGlvbiA9ICJhbm90aGVyIikNCi0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJhbm90aGVyIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9hc3luY2RvY2xpdCIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5hc3luY2RvY2xpdC5Bbm90aGVyIikNCi0gICAgQFJlc3BvbnNlV3JhcHBlcihsb2NhbE5hbWUgPSAiYW5vdGhlclJlc3BvbnNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9hc3luY2RvY2xpdCIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5hc3luY2RvY2xpdC5Bbm90aGVyUmVzcG9uc2UiKQ0KLSAgICBwdWJsaWMgRnV0dXJlPD8+IGFub3RoZXJBc3luY0FzeW5jKA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAicmVxdWVzdCIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQ0KLSAgICAgICAgU3RyaW5nIHJlcXVlc3QsDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJhc3luY0hhbmRsZXIiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikNCi0gICAgICAgIEFzeW5jSGFuZGxlcjxBbm90aGVyUmVzcG9uc2U+IGFzeW5jSGFuZGxlcik7DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIHJlcXVlc3QNCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBqYXZhLmxhbmcuU3RyaW5nDQotICAgICAqLw0KLSAgICBAV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWUgPSAiYW5vdGhlciIsIGFjdGlvbiA9ICJhbm90aGVyIikNCi0gICAgQFdlYlJlc3VsdChuYW1lID0gInJlc3BvbnNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpDQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAiYW5vdGhlciIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL3Rlc3QvYXN5bmNkb2NsaXQiLCBjbGFzc05hbWUgPSAib3JnLnRlc3QuYXN5bmNkb2NsaXQuQW5vdGhlciIpDQotICAgIEBSZXNwb25zZVdyYXBwZXIobG9jYWxOYW1lID0gImFub3RoZXJSZXNwb25zZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL3Rlc3QvYXN5bmNkb2NsaXQiLCBjbGFzc05hbWUgPSAib3JnLnRlc3QuYXN5bmNkb2NsaXQuQW5vdGhlclJlc3BvbnNlIikNCi0gICAgcHVibGljIFN0cmluZyBhbm90aGVyQXN5bmMoDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJyZXF1ZXN0IiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpDQotICAgICAgICBTdHJpbmcgcmVxdWVzdCk7DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGV4Y2VwdGlvblR5cGUNCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBqYXZheC54bWwud3MuUmVzcG9uc2U8b3JnLnRlc3QuYXN5bmNkb2NsaXQuVGhyb3dFeGNlcHRpb25SZXNwb25zZT4NCi0gICAgICovDQotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJ0aHJvd0V4Y2VwdGlvbiIsIGFjdGlvbiA9ICJ0aHJvd0V4Y2VwdGlvbiIpDQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAidGhyb3dFeGNlcHRpb24iLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L2FzeW5jZG9jbGl0IiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LmFzeW5jZG9jbGl0LlRocm93RXhjZXB0aW9uIikNCi0gICAgQFJlc3BvbnNlV3JhcHBlcihsb2NhbE5hbWUgPSAidGhyb3dFeGNlcHRpb25SZXNwb25zZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL3Rlc3QvYXN5bmNkb2NsaXQiLCBjbGFzc05hbWUgPSAib3JnLnRlc3QuYXN5bmNkb2NsaXQuVGhyb3dFeGNlcHRpb25SZXNwb25zZSIpDQotICAgIHB1YmxpYyBSZXNwb25zZTxUaHJvd0V4Y2VwdGlvblJlc3BvbnNlPiB0aHJvd0V4Y2VwdGlvbkFzeW5jKA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiZXhjZXB0aW9uVHlwZSIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQ0KLSAgICAgICAgRXhjZXB0aW9uVHlwZUVudW0gZXhjZXB0aW9uVHlwZSk7DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGV4Y2VwdGlvblR5cGUNCi0gICAgICogQHBhcmFtIGFzeW5jSGFuZGxlcg0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTw/IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdD4NCi0gICAgICovDQotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJ0aHJvd0V4Y2VwdGlvbiIsIGFjdGlvbiA9ICJ0aHJvd0V4Y2VwdGlvbiIpDQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAidGhyb3dFeGNlcHRpb24iLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L2FzeW5jZG9jbGl0IiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LmFzeW5jZG9jbGl0LlRocm93RXhjZXB0aW9uIikNCi0gICAgQFJlc3BvbnNlV3JhcHBlcihsb2NhbE5hbWUgPSAidGhyb3dFeGNlcHRpb25SZXNwb25zZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL3Rlc3QvYXN5bmNkb2NsaXQiLCBjbGFzc05hbWUgPSAib3JnLnRlc3QuYXN5bmNkb2NsaXQuVGhyb3dFeGNlcHRpb25SZXNwb25zZSIpDQotICAgIHB1YmxpYyBGdXR1cmU8Pz4gdGhyb3dFeGNlcHRpb25Bc3luYygNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImV4Y2VwdGlvblR5cGUiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikNCi0gICAgICAgIEV4Y2VwdGlvblR5cGVFbnVtIGV4Y2VwdGlvblR5cGUsDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJhc3luY0hhbmRsZXIiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikNCi0gICAgICAgIEFzeW5jSGFuZGxlcjxUaHJvd0V4Y2VwdGlvblJlc3BvbnNlPiBhc3luY0hhbmRsZXIpOw0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSBleGNlcHRpb25UeXBlDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgamF2YS5sYW5nLlN0cmluZw0KLSAgICAgKiBAdGhyb3dzIFRocm93RXhjZXB0aW9uRmF1bHQNCi0gICAgICovDQotICAgIEBXZWJNZXRob2QoYWN0aW9uID0gInRocm93RXhjZXB0aW9uIikNCi0gICAgQFdlYlJlc3VsdChuYW1lID0gInJlc3BvbnNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpDQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAidGhyb3dFeGNlcHRpb24iLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L2FzeW5jZG9jbGl0IiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LmFzeW5jZG9jbGl0LlRocm93RXhjZXB0aW9uIikNCi0gICAgQFJlc3BvbnNlV3JhcHBlcihsb2NhbE5hbWUgPSAidGhyb3dFeGNlcHRpb25SZXNwb25zZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL3Rlc3QvYXN5bmNkb2NsaXQiLCBjbGFzc05hbWUgPSAib3JnLnRlc3QuYXN5bmNkb2NsaXQuVGhyb3dFeGNlcHRpb25SZXNwb25zZSIpDQotICAgIHB1YmxpYyBTdHJpbmcgdGhyb3dFeGNlcHRpb24oDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJleGNlcHRpb25UeXBlIiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpDQotICAgICAgICBFeGNlcHRpb25UeXBlRW51bSBleGNlcHRpb25UeXBlKQ0KLSAgICAgICAgdGhyb3dzIFRocm93RXhjZXB0aW9uRmF1bHQNCi0gICAgOw0KLQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FzeW5jZG9jbGl0L2NsaWVudC9Bc3luY1NlcnZpY2UuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYXN5bmNkb2NsaXQvY2xpZW50L0FzeW5jU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMGUzNGRhLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYXN5bmNkb2NsaXQvY2xpZW50L0FzeW5jU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLS8vDQotLy8gR2VuZXJhdGVkIEJ5OkpBWC1XUyBSSSBJQk0gMi4xLjEgaW4gSkRLIDYgKEpBWEIgUkkgSUJNIEpBWEIgMi4xLjMgaW4gSkRLIDEuNikNCi0vLw0KLQ0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuYXN5bmNkb2NsaXQuY2xpZW50Ow0KLQ0KLWltcG9ydCBqYXZhLmlvLkZpbGU7DQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOw0KLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLldlYkVuZHBvaW50Ow0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUNsaWVudDsNCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VGZWF0dXJlOw0KLQ0KLUBXZWJTZXJ2aWNlQ2xpZW50KG5hbWUgPSAiQXN5bmNTZXJ2aWNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9hc3luY2RvY2xpdCIsIHdzZGxMb2NhdGlvbiA9ICJhc3luY19kb2NsaXR3cjIud3NkbCIpDQotcHVibGljIGNsYXNzIEFzeW5jU2VydmljZQ0KLSAgICBleHRlbmRzIFNlcnZpY2UNCi17DQotDQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFVSTCBBU1lOQ1NFUlZJQ0VfV1NETF9MT0NBVElPTjsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHdzZGxMb2NhdGlvbj0iL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYXN5bmNkb2NsaXQvc2VydmVyL01FVEEtSU5GL2FzeW5jX2RvY2xpdHdyMi53c2RsIjsNCi0gICAgc3RhdGljIHsNCi0gICAgICAgIFVSTCB1cmwgPSBudWxsOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICB0cnl7DQotICAgICAgICAgICAgICAgIFN0cmluZyBiYXNlRGlyID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJiYXNlZGlyIiwiLiIpKS5nZXRDYW5vbmljYWxQYXRoKCk7DQotICAgICAgICAgICAgICAgIHdzZGxMb2NhdGlvbiA9IG5ldyBGaWxlKGJhc2VEaXIgKyB3c2RsTG9jYXRpb24pLmdldEFic29sdXRlUGF0aCgpOw0KLSAgICAgICAgICAgIH1jYXRjaChFeGNlcHRpb24gZSl7DQotICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKHdzZGxMb2NhdGlvbik7DQotICAgICAgICAgICAgdXJsID0gZmlsZS50b1VSTCgpOw0KLSAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgQVNZTkNTRVJWSUNFX1dTRExfTE9DQVRJT04gPSB1cmw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEFzeW5jU2VydmljZShVUkwgd3NkbExvY2F0aW9uLCBRTmFtZSBzZXJ2aWNlTmFtZSkgew0KLSAgICAgICAgc3VwZXIod3NkbExvY2F0aW9uLCBzZXJ2aWNlTmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEFzeW5jU2VydmljZSgpIHsNCi0gICAgICAgIHN1cGVyKEFTWU5DU0VSVklDRV9XU0RMX0xPQ0FUSU9OLCBuZXcgUU5hbWUoImh0dHA6Ly9vcmcvdGVzdC9hc3luY2RvY2xpdCIsICJBc3luY1NlcnZpY2UiKSk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIEFzeW5jUG9ydA0KLSAgICAgKi8NCi0gICAgQFdlYkVuZHBvaW50KG5hbWUgPSAiQXN5bmNQb3J0IikNCi0gICAgcHVibGljIEFzeW5jUG9ydCBnZXRBc3luY1BvcnQoKSB7DQotICAgICAgICByZXR1cm4gKEFzeW5jUG9ydClzdXBlci5nZXRQb3J0KG5ldyBRTmFtZSgiaHR0cDovL29yZy90ZXN0L2FzeW5jZG9jbGl0IiwgIkFzeW5jUG9ydCIpLCBBc3luY1BvcnQuY2xhc3MpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGZlYXR1cmVzDQotICAgICAqICAgICBBIGxpc3Qgb2Yge0BsaW5rIGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRmVhdHVyZX0gdG8gY29uZmlndXJlIG9uIHRoZSBwcm94eS4gIFN1cHBvcnRlZCBmZWF0dXJlcyBub3QgaW4gdGhlIDxjb2RlPmZlYXR1cmVzPC9jb2RlPiBwYXJhbWV0ZXIgd2lsbCBoYXZlIHRoZWlyIGRlZmF1bHQgdmFsdWVzLg0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIEFzeW5jUG9ydA0KLSAgICAgKi8NCi0gICAgQFdlYkVuZHBvaW50KG5hbWUgPSAiQXN5bmNQb3J0IikNCi0gICAgcHVibGljIEFzeW5jUG9ydCBnZXRBc3luY1BvcnQoV2ViU2VydmljZUZlYXR1cmUuLi4gZmVhdHVyZXMpIHsNCi0gICAgICAgIHJldHVybiAoQXN5bmNQb3J0KXN1cGVyLmdldFBvcnQobmV3IFFOYW1lKCJodHRwOi8vb3JnL3Rlc3QvYXN5bmNkb2NsaXQiLCAiQXN5bmNQb3J0IiksIEFzeW5jUG9ydC5jbGFzcywgZmVhdHVyZXMpOw0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYXN5bmNkb2NsaXQvY2xpZW50L1Rocm93RXhjZXB0aW9uRmF1bHQuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYXN5bmNkb2NsaXQvY2xpZW50L1Rocm93RXhjZXB0aW9uRmF1bHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmExMjBiOS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FzeW5jZG9jbGl0L2NsaWVudC9UaHJvd0V4Y2VwdGlvbkZhdWx0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotLy8NCi0vLyBHZW5lcmF0ZWQgQnk6SkFYLVdTIFJJIElCTSAyLjEuMSBpbiBKREsgNiAoSkFYQiBSSSBJQk0gSkFYQiAyLjEuMyBpbiBKREsgMS42KQ0KLS8vDQotDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5hc3luY2RvY2xpdC5jbGllbnQ7DQotDQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJGYXVsdDsNCi0NCi1pbXBvcnQgb3JnLnRlc3QuYXN5bmNkb2NsaXQuVGhyb3dFeGNlcHRpb25GYXVsdEJlYW47DQotDQotQFdlYkZhdWx0KG5hbWUgPSAidGhyb3dFeGNlcHRpb25GYXVsdEJlYW4iLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L2FzeW5jZG9jbGl0IikNCi1wdWJsaWMgY2xhc3MgVGhyb3dFeGNlcHRpb25GYXVsdA0KLSAgICBleHRlbmRzIEV4Y2VwdGlvbg0KLXsNCi0NCi0gICAgLyoqDQotICAgICAqIEphdmEgdHlwZSB0aGF0IGdvZXMgYXMgc29hcGVudjpGYXVsdCBkZXRhaWwgZWxlbWVudC4NCi0gICAgICogDQotICAgICAqLw0KLSAgICBwcml2YXRlIFRocm93RXhjZXB0aW9uRmF1bHRCZWFuIGZhdWx0SW5mbzsNCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gZmF1bHRJbmZvDQotICAgICAqIEBwYXJhbSBtZXNzYWdlDQotICAgICAqLw0KLSAgICBwdWJsaWMgVGhyb3dFeGNlcHRpb25GYXVsdChTdHJpbmcgbWVzc2FnZSwgVGhyb3dFeGNlcHRpb25GYXVsdEJlYW4gZmF1bHRJbmZvKSB7DQotICAgICAgICBzdXBlcihtZXNzYWdlKTsNCi0gICAgICAgIHRoaXMuZmF1bHRJbmZvID0gZmF1bHRJbmZvOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGZhdWx0SW5mbw0KLSAgICAgKiBAcGFyYW0gbWVzc2FnZQ0KLSAgICAgKiBAcGFyYW0gY2F1c2UNCi0gICAgICovDQotICAgIHB1YmxpYyBUaHJvd0V4Y2VwdGlvbkZhdWx0KFN0cmluZyBtZXNzYWdlLCBUaHJvd0V4Y2VwdGlvbkZhdWx0QmVhbiBmYXVsdEluZm8sIFRocm93YWJsZSBjYXVzZSkgew0KLSAgICAgICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpOw0KLSAgICAgICAgdGhpcy5mYXVsdEluZm8gPSBmYXVsdEluZm87DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIGZhdWx0IGJlYW46IGpheHdzLmFzeW5jLndzZnZ0LmNvbW1vbi5kb2NsaXR3ci5UaHJvd0V4Y2VwdGlvbkZhdWx0QmVhbg0KLSAgICAgKi8NCi0gICAgcHVibGljIFRocm93RXhjZXB0aW9uRmF1bHRCZWFuIGdldEZhdWx0SW5mbygpIHsNCi0gICAgICAgIHJldHVybiBmYXVsdEluZm87DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hc3luY2RvY2xpdC9jb21tb24vQ2FsbGJhY2tIYW5kbGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FzeW5jZG9jbGl0L2NvbW1vbi9DYWxsYmFja0hhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQzMmJlYi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FzeW5jZG9jbGl0L2NvbW1vbi9DYWxsYmFja0hhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLmFzeW5jZG9jbGl0LmNvbW1vbjsNCi0NCi1pbXBvcnQgamF2YXgueG1sLndzLkFzeW5jSGFuZGxlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLlJlc3BvbnNlOw0KLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU7DQotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVvdXRFeGNlcHRpb247DQotDQotLyoqDQotICogR2VuZXJpYyBBc3luYyBjYWxsYmFjayBoYW5kbGVyLiBUaGUgZ2V0IG1ldGhvZCBlbXVsYXRlcyBSZXNwb25zZS5nZXQgYnkNCi0gKiB0aHJvd25pbmcgYW4gZXhjZXB0aW9uIGlmIG9uZSBpcyByZWNlaXZlZC4gDQotICovDQotcHVibGljIGNsYXNzIENhbGxiYWNrSGFuZGxlcjxUPiBpbXBsZW1lbnRzIEFzeW5jSGFuZGxlcjxUPiB7DQotDQotICAgIHByaXZhdGUgVCByZXNwb25zZSA9IG51bGw7DQotICAgIHByaXZhdGUgUmVzcG9uc2U8VD4gcmVzcCA9IG51bGw7DQotICAgIA0KLSAgICBwcml2YXRlIEV4Y2VwdGlvbiBleGNlcHRpb24gPSBudWxsOw0KLQ0KLSAgICBwdWJsaWMgdm9pZCBoYW5kbGVSZXNwb25zZShSZXNwb25zZTxUPiByZXNwb25zZSkgew0KLQ0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBUIHJlcyA9IChUKSByZXNwb25zZS5nZXQoKTsNCi0gICAgICAgICAgICB0aGlzLnJlc3BvbnNlID0gcmVzOw0KLSAgICAgICAgICAgIHRoaXMucmVzcCA9IHJlc3BvbnNlOw0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICB0aGlzLmV4Y2VwdGlvbiA9IGU7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIFJlc3BvbnNlPFQ+IGdldFJlc3BvbnNlKCl7DQotICAgICAgICByZXR1cm4gdGhpcy5yZXNwOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgVCBnZXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0NCi0gICAgICAgIGlmIChleGNlcHRpb24gIT0gbnVsbCkNCi0gICAgICAgICAgICB0aHJvdyBleGNlcHRpb247DQotICAgICAgICByZXR1cm4gdGhpcy5yZXNwb25zZTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogQXV4aWxpYXJ5IG1ldGhvZCB1c2VkIHRvIHdhaXQgZm9yIGEgbW9uaXRvciBmb3IgYSBjZXJ0YWluIGFtb3VudCBvZiB0aW1lDQotICAgICAqIGJlZm9yZSB0aW1pbmcgb3V0DQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gbW9uaXRvcg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgd2FpdEJsb2NraW5nKEZ1dHVyZTw/PiBtb25pdG9yKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIC8vIHdhaXQgZm9yIHJlcXVlc3QgdG8gY29tcGxldGUNCi0gICAgICAgIGludCBzZWMgPSAyMDsgLy9Db25zdGFudHMuQ0xJRU5UX01BWF9TTEVFUF9TRUM7DQotICAgICAgICB3aGlsZSAoIW1vbml0b3IuaXNEb25lKCkpIHsNCi0gICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7DQotICAgICAgICAgICAgc2VjLS07DQotICAgICAgICAgICAgaWYgKHNlYyA8PSAwKSBicmVhazsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChzZWMgPD0gMCkNCi0gICAgICAgICAgICB0aHJvdyBuZXcgVGltZW91dEV4Y2VwdGlvbigiU3RvcHBlZCB3YWl0aW5nIGZvciBBc3luYyByZXNwb25zZSBhZnRlciAiDQotICAgICAgICAgICAgICAgICAgICArIDIwIC8qQ29uc3RhbnRzLkNMSUVOVF9NQVhfU0xFRVBfU0VDKi8gKyAiIHNlYyIpOw0KLSAgICB9ICAgDQotICAgIA0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FzeW5jZG9jbGl0L3NlcnZlci9Bc3luY1BvcnQuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYXN5bmNkb2NsaXQvc2VydmVyL0FzeW5jUG9ydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGZjZmIwLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYXN5bmNkb2NsaXQvc2VydmVyL0FzeW5jUG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0vLw0KLS8vIEdlbmVyYXRlZCBCeTpKQVgtV1MgUkkgSUJNIDIuMS4xIGluIEpESyA2IChKQVhCIFJJIElCTSBKQVhCIDIuMS4zIGluIEpESyAxLjYpDQotLy8NCi0NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLmFzeW5jZG9jbGl0LnNlcnZlcjsNCi0NCi1pbXBvcnQgamF2YXguandzLldlYk1ldGhvZDsNCi1pbXBvcnQgamF2YXguandzLldlYlBhcmFtOw0KLWltcG9ydCBqYXZheC5qd3MuV2ViUmVzdWx0Ow0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLkhvbGRlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLlJlcXVlc3RXcmFwcGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuUmVzcG9uc2VXcmFwcGVyOw0KLQ0KLWltcG9ydCBvcmcudGVzdC5hc3luY2RvY2xpdC5FeGNlcHRpb25UeXBlRW51bTsNCi0NCi1AV2ViU2VydmljZShuYW1lID0gIkFzeW5jUG9ydDIiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L2FzeW5jZG9jbGl0IikNCi1wdWJsaWMgaW50ZXJmYWNlIEFzeW5jUG9ydCB7DQotDQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIG1lc3NhZ2UNCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBqYXZhLmxhbmcuU3RyaW5nDQotICAgICAqLw0KLSAgICBAV2ViTWV0aG9kKGFjdGlvbiA9ICJwaW5nIikNCi0gICAgQFdlYlJlc3VsdChuYW1lID0gInJlc3BvbnNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpDQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAicGluZyIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL3Rlc3QvYXN5bmNkb2NsaXQiLCBjbGFzc05hbWUgPSAib3JnLnRlc3QuYXN5bmNkb2NsaXQuUGluZyIpDQotICAgIEBSZXNwb25zZVdyYXBwZXIobG9jYWxOYW1lID0gInBpbmdSZXNwb25zZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL3Rlc3QvYXN5bmNkb2NsaXQiLCBjbGFzc05hbWUgPSAib3JnLnRlc3QuYXN5bmNkb2NsaXQuUGluZ1Jlc3BvbnNlIikNCi0gICAgcHVibGljIFN0cmluZyBwaW5nKA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAibWVzc2FnZSIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQ0KLSAgICAgICAgU3RyaW5nIG1lc3NhZ2UpOw0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSBtZXNzYWdlDQotICAgICAqLw0KLSAgICBAV2ViTWV0aG9kKGFjdGlvbiA9ICJzbGVlcCIpDQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAic2xlZXAiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L2FzeW5jZG9jbGl0IiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LmFzeW5jZG9jbGl0LlNsZWVwIikNCi0gICAgQFJlc3BvbnNlV3JhcHBlcihsb2NhbE5hbWUgPSAic2xlZXBSZXNwb25zZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL3Rlc3QvYXN5bmNkb2NsaXQiLCBjbGFzc05hbWUgPSAib3JnLnRlc3QuYXN5bmNkb2NsaXQuU2xlZXBSZXNwb25zZSIpDQotICAgIHB1YmxpYyB2b2lkIHNsZWVwKA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAibWVzc2FnZSIsIHRhcmdldE5hbWVzcGFjZSA9ICIiLCBtb2RlID0gV2ViUGFyYW0uTW9kZS5JTk9VVCkNCi0gICAgICAgIEhvbGRlcjxTdHJpbmc+IG1lc3NhZ2UpOw0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgamF2YS5sYW5nLlN0cmluZw0KLSAgICAgKi8NCi0gICAgQFdlYk1ldGhvZChhY3Rpb24gPSAiaXNBc2xlZXAiKQ0KLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAibWVzc2FnZSIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQ0KLSAgICBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gImlzQXNsZWVwIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9hc3luY2RvY2xpdCIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5hc3luY2RvY2xpdC5Jc0FzbGVlcCIpDQotICAgIEBSZXNwb25zZVdyYXBwZXIobG9jYWxOYW1lID0gImlzQXNsZWVwUmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L2FzeW5jZG9jbGl0IiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LmFzeW5jZG9jbGl0LklzQXNsZWVwUmVzcG9uc2UiKQ0KLSAgICBwdWJsaWMgU3RyaW5nIGlzQXNsZWVwKCk7DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBqYXZhLmxhbmcuU3RyaW5nDQotICAgICAqLw0KLSAgICBAV2ViTWV0aG9kKGFjdGlvbiA9ICJ3YWtlVXAiKQ0KLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAibWVzc2FnZSIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQ0KLSAgICBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gIndha2VVcCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL3Rlc3QvYXN5bmNkb2NsaXQiLCBjbGFzc05hbWUgPSAib3JnLnRlc3QuYXN5bmNkb2NsaXQuV2FrZVVwIikNCi0gICAgQFJlc3BvbnNlV3JhcHBlcihsb2NhbE5hbWUgPSAid2FrZVVwUmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L2FzeW5jZG9jbGl0IiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LmFzeW5jZG9jbGl0Lldha2VVcFJlc3BvbnNlIikNCi0gICAgcHVibGljIFN0cmluZyB3YWtlVXAoKTsNCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gcmVxdWVzdA0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIGphdmEubGFuZy5TdHJpbmcNCi0gICAgICovDQotICAgIEBXZWJNZXRob2QoYWN0aW9uID0gImludm9rZUFzeW5jIikNCi0gICAgQFdlYlJlc3VsdChuYW1lID0gInJlc3BvbnNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpDQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAiaW52b2tlQXN5bmMiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L2FzeW5jZG9jbGl0IiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LmFzeW5jZG9jbGl0Lkludm9rZUFzeW5jIikNCi0gICAgQFJlc3BvbnNlV3JhcHBlcihsb2NhbE5hbWUgPSAiaW52b2tlQXN5bmNSZXNwb25zZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL3Rlc3QvYXN5bmNkb2NsaXQiLCBjbGFzc05hbWUgPSAib3JnLnRlc3QuYXN5bmNkb2NsaXQuSW52b2tlQXN5bmNSZXNwb25zZSIpDQotICAgIHB1YmxpYyBTdHJpbmcgaW52b2tlQXN5bmMoDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJyZXF1ZXN0IiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpDQotICAgICAgICBTdHJpbmcgcmVxdWVzdCk7DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIHJlcXVlc3QNCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBqYXZhLmxhbmcuU3RyaW5nDQotICAgICAqLw0KLSAgICBAV2ViTWV0aG9kKGFjdGlvbiA9ICJjdXN0b21Bc3luYyIpDQotICAgIEBXZWJSZXN1bHQobmFtZSA9ICJyZXNwb25zZSIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQ0KLSAgICBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gImN1c3RvbUFzeW5jIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9hc3luY2RvY2xpdCIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5hc3luY2RvY2xpdC5DdXN0b21Bc3luYyIpDQotICAgIEBSZXNwb25zZVdyYXBwZXIobG9jYWxOYW1lID0gImN1c3RvbUFzeW5jUmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L2FzeW5jZG9jbGl0IiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LmFzeW5jZG9jbGl0LkN1c3RvbUFzeW5jUmVzcG9uc2UiKQ0KLSAgICBwdWJsaWMgU3RyaW5nIGN1c3RvbUFzeW5jKA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAicmVxdWVzdCIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQ0KLSAgICAgICAgU3RyaW5nIHJlcXVlc3QpOw0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSByZXF1ZXN0DQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgamF2YS5sYW5nLlN0cmluZw0KLSAgICAgKi8NCi0gICAgQFdlYk1ldGhvZChhY3Rpb24gPSAiYW5vdGhlciIpDQotICAgIEBXZWJSZXN1bHQobmFtZSA9ICJyZXNwb25zZSIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQ0KLSAgICBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gImFub3RoZXIiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L2FzeW5jZG9jbGl0IiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LmFzeW5jZG9jbGl0LkFub3RoZXIiKQ0KLSAgICBAUmVzcG9uc2VXcmFwcGVyKGxvY2FsTmFtZSA9ICJhbm90aGVyUmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L2FzeW5jZG9jbGl0IiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LmFzeW5jZG9jbGl0LkFub3RoZXJSZXNwb25zZSIpDQotICAgIHB1YmxpYyBTdHJpbmcgYW5vdGhlcigNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gInJlcXVlc3QiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikNCi0gICAgICAgIFN0cmluZyByZXF1ZXN0KTsNCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gZXhjZXB0aW9uVHlwZQ0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIGphdmEubGFuZy5TdHJpbmcNCi0gICAgICogQHRocm93cyBUaHJvd0V4Y2VwdGlvbkZhdWx0DQotICAgICAqLw0KLSAgICBAV2ViTWV0aG9kKGFjdGlvbiA9ICJ0aHJvd0V4Y2VwdGlvbiIpDQotICAgIEBXZWJSZXN1bHQobmFtZSA9ICJyZXNwb25zZSIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQ0KLSAgICBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gInRocm93RXhjZXB0aW9uIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9hc3luY2RvY2xpdCIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5hc3luY2RvY2xpdC5UaHJvd0V4Y2VwdGlvbiIpDQotICAgIEBSZXNwb25zZVdyYXBwZXIobG9jYWxOYW1lID0gInRocm93RXhjZXB0aW9uUmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L2FzeW5jZG9jbGl0IiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LmFzeW5jZG9jbGl0LlRocm93RXhjZXB0aW9uUmVzcG9uc2UiKQ0KLSAgICBwdWJsaWMgU3RyaW5nIHRocm93RXhjZXB0aW9uKA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiZXhjZXB0aW9uVHlwZSIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQ0KLSAgICAgICAgRXhjZXB0aW9uVHlwZUVudW0gZXhjZXB0aW9uVHlwZSkNCi0gICAgICAgIHRocm93cyBUaHJvd0V4Y2VwdGlvbkZhdWx0DQotICAgIDsNCi0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hc3luY2RvY2xpdC9zZXJ2ZXIvRG9jTGl0V3JhcHBlZFBvcnRJbXBsLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FzeW5jZG9jbGl0L3NlcnZlci9Eb2NMaXRXcmFwcGVkUG9ydEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTAzOGE1MS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FzeW5jZG9jbGl0L3NlcnZlci9Eb2NMaXRXcmFwcGVkUG9ydEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLmFzeW5jZG9jbGl0LnNlcnZlcjsKLQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOwotaW1wb3J0IGphdmF4LnhtbC53cy5Ib2xkZXI7Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcudGVzdC5hc3luY2RvY2xpdC5FeGNlcHRpb25UeXBlRW51bTsKLWltcG9ydCBvcmcudGVzdC5hc3luY2RvY2xpdC5UaHJvd0V4Y2VwdGlvbkZhdWx0QmVhbjsKLQotLyoKLWltcG9ydCBqYXh3cy5hc3luYy53c2Z2dC5jb21tb24uQ29uc3RhbnRzOwotaW1wb3J0IGpheHdzLmFzeW5jLndzZnZ0LmNvbW1vbi5kb2NsaXR3ci5Bc3luY1BvcnQ7Ci1pbXBvcnQgamF4d3MuYXN5bmMud3NmdnQuY29tbW9uLmRvY2xpdHdyLkV4Y2VwdGlvblR5cGVFbnVtOwotaW1wb3J0IGpheHdzLmFzeW5jLndzZnZ0LmNvbW1vbi5kb2NsaXR3ci5UaHJvd0V4Y2VwdGlvbkZhdWx0OwotaW1wb3J0IGpheHdzLmFzeW5jLndzZnZ0LmNvbW1vbi5kb2NsaXR3ci5UaHJvd0V4Y2VwdGlvbkZhdWx0QmVhbjsKLSovCi0vKioKLSAqIEFzeW5jIGVuZHBvaW50IHVzZWQgZm9yIEFzeW5jIGNsaWVudCBzaWRlIHRlc3RzLiBDbGllbnRzIHdpbGwgaW52b2tlQXN5bmMKLSAqIHNsZWVwIG1ldGhvZCB0byBmb3JjZSB0aGUgc2VydmVyIHRvIGJsb2NrIHVudGlsIHdha2VVcCBpcyBjYWxsZWQuIFRoZSBjbGllbnQKLSAqIGNhbiBjYWxsIGlzQXNsZWVwIHRvIHZlcmlmeSB0aGF0IHNsZWVwIGhhcyBiZWVuIGNhbGxlZCBieSB0aGUgYXN5bmMgdGhyZWFkLgotICovCi1AV2ViU2VydmljZShzZXJ2aWNlTmFtZT0iQXN5bmNTZXJ2aWNlMiIsCi0JCQllbmRwb2ludEludGVyZmFjZT0ib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuYXN5bmNkb2NsaXQuc2VydmVyLkFzeW5jUG9ydCIpCi1wdWJsaWMgY2xhc3MgRG9jTGl0V3JhcHBlZFBvcnRJbXBsIGltcGxlbWVudHMgQXN5bmNQb3J0IHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSB0cnVlOwotCi0JLy8gbWVzc2FnZSBvbiB3aGljaCB0aGUgc2xlZXAgbWV0aG9kIGlzIHNsZWVwaW5nIG9uCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIG1zZyA9ICIiOwotCi0JLy8gdGhyZWFkIGluc3RhbmNlIHRoYXQgaXMgY3VycmVudGx5IHNsZWVwaW5nIHNvIGl0IGNhbiBiZSBpbnRlcnJ1cHRlZCBmcm9tCi0JLy8gd2FrZXVwCi0JcHJpdmF0ZSBzdGF0aWMgVGhyZWFkIHNsZWVwZXIgPSBudWxsOwotCi0JLy8gaW50ZXJydXB0IGZsYWcgZm9yIHdha2VVcCB0byBzZXQKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGRvQ2FuY2VsbCA9IGZhbHNlOwotCi0JcHVibGljIHZvaWQgc2xlZXAoSG9sZGVyPFN0cmluZz4gbWVzc2FnZSkgewotCi0JdHJ5IHsKLQkJaWYgKG1lc3NhZ2UgPT0gbnVsbCB8fCBtZXNzYWdlLnZhbHVlID09IG51bGwpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRG9jTGl0V3JhcHBlZFBvcnRJbXBsLnNsZWVwKG51bGwpIEVudGVyIik7Ci0JCX0KLQkJCi0JCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKCJEb2NMaXRXcmFwcGVkUG9ydEltcGwuc2xlZXAoIiArIG1lc3NhZ2UudmFsdWUgKyAiKSBFbnRlciIpOwotCi0JCWJvb2xlYW4gY2FuY2VsUmVxdWVzdGVkID0gZmFsc2U7Ci0KLQkJbXNnID0gbWVzc2FnZS52YWx1ZTsKLQotCQlzeW5jaHJvbml6ZWQgKG1zZykgewotCi0JCQlUaHJlYWQgbXlUaHJlYWQgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpOwotCQkJc2xlZXBlciA9IG15VGhyZWFkOwotCi0JCQl0cnkgewotCi0JCQkJZG9DYW5jZWxsID0gZmFsc2U7Ci0KLQkJCQlpZiAoREVCVUcpCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRG9jTGl0V3JhcHBlZFBvcnRJbXBsLnNsZWVwOiBnb2luZyB0byBzbGVlcCBvbiAiCi0JCQkJCQkJKyBteVRocmVhZC5nZXRJZCgpICsgIiAiICsgbXNnKTsKLQotCQkJCS8vIHdhaXQgdW50aWwgZWl0aGVyIGEgdGltZW91dCBvciBjbGllbnQgcmVsZWFzZXMgdXMKLQkJCQkvLyBvciBpZiBhbm90aGVyIHJlcXVlc3QgYmVnaW5zIChsb2NrSWQgY2hhbmdlcykKLQkJCQlsb25nIHNlYyA9IDE1OyAvL0NvbnN0YW50cy5TRVJWRVJfU0xFRVBfU0VDOwotCi0JCQkJd2hpbGUgKHNlYyA+IDAgJiYgIWRvQ2FuY2VsbCAmJiBzbGVlcGVyID09IG15VGhyZWFkKSB7Ci0JCQkJCWlmIChERUJVRykKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRG9jTGl0V3JhcHBlZFBvcnRJbXBsLnNsZWVwOiAiICsgbXlUaHJlYWQuZ2V0SWQoKQotCQkJCQkJCQkrICIgdGltZUxlZnQ9IiArIHNlYyk7Ci0JCQkJCXNlYy0tOwotCi0JCQkJCW1zZy53YWl0KDEwMDApOwotCQkJCX0KLQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkRvY0xpdFdyYXBwZWRQb3J0SW1wbC5zbGVlcDogaW50ZXJydXB0ZWQgb24gIiArIG15VGhyZWFkLmdldElkKCkpOwotCQkJfSBmaW5hbGx5IHsKLQotCQkJCWlmIChERUJVRykKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJEb2NMaXRXcmFwcGVkUG9ydEltcGwuc2xlZXA6IFdva2VVcCAiICsgbXlUaHJlYWQuZ2V0SWQoKSk7Ci0KLQkJCQkvLyBpZiB3ZSB0aW1lZCBvdXQgd2hpbGUgd2FpdGluZyB0aGVuCi0JCQkJLy8gcmVsZWFzZSB0aGUgd2FpdAotCQkJCWlmIChzbGVlcGVyID09IG15VGhyZWFkKSB7Ci0JCQkJCWNhbmNlbFJlcXVlc3RlZCA9IGRvQ2FuY2VsbDsKLQkJCQkJZG9DYW5jZWxsID0gZmFsc2U7Ci0JCQkJCXNsZWVwZXIgPSBudWxsOwotCQkJCX0KLQotCQkJCS8vIG9ubHkgbm90aWZ5IGlmIGNhbmNlbCB3YXMgcmVxdWVzdGVkCi0JCQkJaWYgKGNhbmNlbFJlcXVlc3RlZCkgewotCQkJCQlpZiAoREVCVUcpCi0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkRvY0xpdFdyYXBwZWRQb3J0SW1wbC5zbGVlcDogTm90aWZ5ICIgKyBteVRocmVhZC5nZXRJZCgpCi0JCQkJCQkJCSsgIiBpc0RvbmUiKTsKLQotCQkJCQkvLyB3YWtlIHVwIHRoZSByZWxlYXNlIHRocmVhZAotCQkJCQltc2cubm90aWZ5KCk7Ci0JCQkJfQotCQkJfQotCQl9Ly8gc3luY2gKLQotCQltc2cgPSBudWxsOwotCi0JCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKCJEb2NMaXRXcmFwcGVkUG9ydEltcGwuc2xlZXAoIiArIG1lc3NhZ2UudmFsdWUgKyAiKSBFeGl0Iik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKXsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRG9jTGl0V3JhcHBlZFBvcnRJbXBsLnNsZWVwOiAiICsgZSk7Ci0JCQllLnByaW50U3RhY2tUcmFjZShTeXN0ZW0ub3V0KTsKLQkJfQotCX0KLQotCXB1YmxpYyBTdHJpbmcgaXNBc2xlZXAoKSB7Ci0JCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKCJEb2NMaXRXcmFwcGVkUG9ydEltcGwuaXNBc2xlZXAoKSBFbnRlciIpOwotCQkKLQkJU3RyaW5nIHJldCA9IChzbGVlcGVyICE9IG51bGwpID8gbXNnIDogbnVsbDsKLQkJCi0JCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKCJEb2NMaXRXcmFwcGVkUG9ydEltcGwuaXNBc2xlZXAoKSA9ICIgKyByZXQpOwotCQkKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHdha2VVcCgpIHsKLQotCQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbigiRG9jTGl0V3JhcHBlZFBvcnRJbXBsLndha2VVcCgpIEVudGVyIik7Ci0KLQkJU3RyaW5nIHdha2VVcCA9IG51bGw7Ci0KLQkJaWYgKHNsZWVwZXIgPT0gbnVsbCkgewotCQkJaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4oIkRvY0xpdFdyYXBwZWRQb3J0SW1wbC53YWtlVXA6IE5vIG9uZSB0byB3YWtlIHVwIik7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbigiRG9jTGl0V3JhcHBlZFBvcnRJbXBsLndha2VVcDogSW50ZXJydXB0aW5nICIgKyBzbGVlcGVyLmdldElkKCkpOwotCi0JCQkvLyBpbnRlcnJ1cHQgdGhlIHNsZWVwZXIgJiBzZXQgaW50ZWVydXB0IGZsYWcgaW4gY2FzZQotCQkJLy8gdGhlIHNsZWVwIGlzbid0IHNsZWVwaW5nIGJ1dCBhY3R1YWxseSBkb2luZyB3b3JrCi0JCQl3YWtlVXAgPSBtc2c7Ci0JCQlzbGVlcGVyLmludGVycnVwdCgpOwotCQkJZG9DYW5jZWxsID0gdHJ1ZTsKLQkJCQotCQkJaWYgKERFQlVHKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRG9jTGl0V3JhcHBlZFBvcnRJbXBsLndha2VVcDogYWJvdXQgdG8gZW50ZXIgc3luYyBibG9jayAiCi0JCQkJCQkrIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKLQotCQkJLy8gYmxvY2sgdW50aWwgc2xlZXAgY29tcGxldGVzCi0JCQlpZiAobXNnICE9IG51bGwpIHsKLQkJCQlzeW5jaHJvbml6ZWQgKG1zZykgewotCi0JCQkJCWlmIChERUJVRykKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRG9jTGl0V3JhcHBlZFBvcnRJbXBsLndha2VVcDogZW50ZXIgc3luYyBibG9jayAiCi0JCQkJCQkJCSsgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOwotCi0JCQkJCWRvQ2FuY2VsbCA9IGZhbHNlOwotCQkJCX0KLQkJCX0KLQotCQkJbXNnID0gbnVsbDsKLQkJfQotCi0JCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKCJEb2NMaXRXcmFwcGVkUG9ydEltcGwud2FrZVVwKCkgPSAiICsgd2FrZVVwKTsKLQotCQlyZXR1cm4gd2FrZVVwOwotCX0KLQotCS8qKgotCSAqIGNsaWVudCBzaWRlIHRlc3RzIGZvciByZW1hcHBpbmcgb3BlcmF0aW9uIG5hbWVzLCBvbiB0aGUgc2VydmVyIHNpZGUgYWxsCi0JICogd2UgbmVlZCB0byBkbyBpcyByb3VuZHRyaXAgdGhlIG1lc3NhZ2UKLQkgKi8KLQotCXB1YmxpYyBTdHJpbmcgaW52b2tlQXN5bmMoU3RyaW5nIHJlcXVlc3QpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJEb2NMaXRXcmFwcGVkUG9ydEltcGwuaW52b2tlQXN5bmMgIiArIHJlcXVlc3QpOwotCQlyZXR1cm4gcmVxdWVzdDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGN1c3RvbUFzeW5jKFN0cmluZyByZXF1ZXN0KSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiRG9jTGl0V3JhcHBlZFBvcnRJbXBsLmN1c3RvbUFzeW5jICIgKyByZXF1ZXN0KTsKLQkJdHJ5IHsKLQkJCVRocmVhZC5zbGVlcCg1MDAwKTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gcmVxdWVzdDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGFub3RoZXIoU3RyaW5nIHJlcXVlc3QpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJEb2NMaXRXcmFwcGVkUG9ydEltcGwuYW5vdGhlciAiICsgcmVxdWVzdCk7Ci0JCXJldHVybiByZXF1ZXN0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgcGluZyhTdHJpbmcgbWVzc2FnZSkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIkRvY0xpdFdyYXBwZWRQb3J0SW1wbC5waW5nICIgKyBtZXNzYWdlKTsKLQkJcmV0dXJuIG1lc3NhZ2U7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0aHJvd0V4Y2VwdGlvbihFeGNlcHRpb25UeXBlRW51bSBleGNlcHRpb25UeXBlKQotCQkJdGhyb3dzIFRocm93RXhjZXB0aW9uRmF1bHQgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIkRvY0xpdFdyYXBwZWRQb3J0SW1wbC50aHJvd0V4Y2VwdGlvbiAiICsgZXhjZXB0aW9uVHlwZSk7Ci0JCQotCQlzd2l0Y2ggKGV4Y2VwdGlvblR5cGUpIHsKLQkJY2FzZSBESVZJREVfQllfWkVSTzoKLQkJCWludCBkaXYgPSAxMCAvIDA7Ci0JCQlicmVhazsKLQkJY2FzZSBOUEU6Ci0JCQlTdHJpbmcgeCA9IG51bGw7Ci0JCQl4LnRvU3RyaW5nKCk7Ci0JCQlicmVhazsKLQkJY2FzZSBXU0U6Ci0JCQl0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbigiV2ViU2VydmljZUZhdWx0Iik7Ci0JCWNhc2UgV1NETF9GQVVMVDoKLQkJCVRocm93RXhjZXB0aW9uRmF1bHRCZWFuIHRlZmIgPSBuZXcgVGhyb3dFeGNlcHRpb25GYXVsdEJlYW4oKTsKLQkJCXRlZmIuc2V0VGV4dCgiZmF1bHRCZWFuIik7Ci0JCQl0aHJvdyBuZXcgVGhyb3dFeGNlcHRpb25GYXVsdCgibWVzc2FnZSIsIHRlZmIpOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FzeW5jZG9jbGl0L3NlcnZlci9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYXN5bmNkb2NsaXQvc2VydmVyL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjVlZmFhLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYXN5bmNkb2NsaXQvc2VydmVyL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjANCi1BbnQtVmVyc2lvbjogQXBhY2hlIEFudCAxLjYuMQ0KLUNyZWF0ZWQtQnk6IDIuMyAoSUJNIENvcnBvcmF0aW9uKQ0KLQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYXN5bmNkb2NsaXQvc2VydmVyL01FVEEtSU5GL2FzeW5jX2RvY2xpdHdyMi53c2RsIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hc3luY2RvY2xpdC9zZXJ2ZXIvTUVUQS1JTkYvYXN5bmNfZG9jbGl0d3IyLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5OTM0NTguLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hc3luY2RvY2xpdC9zZXJ2ZXIvTUVUQS1JTkYvYXN5bmNfZG9jbGl0d3IyLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSw0MDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08d3NkbDpkZWZpbml0aW9ucyB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIKLQl4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIgotCXhtbG5zOnRucz0iaHR0cDovL29yZy90ZXN0L2FzeW5jZG9jbGl0IgotCXhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9ImFzeW5jIgotCXRhcmdldE5hbWVzcGFjZT0iaHR0cDovL29yZy90ZXN0L2FzeW5jZG9jbGl0Ij4KLQkKLQk8d3NkbDp0eXBlcz4KLQkJPHhzZDpzY2hlbWEKLQkJCXRhcmdldE5hbWVzcGFjZT0iaHR0cDovL29yZy90ZXN0L2FzeW5jZG9jbGl0IgotCQkJeG1sbnM6dG5zPSJodHRwOi8vb3JnL3Rlc3QvYXN5bmNkb2NsaXQiCi0JCQl4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4JCQotCQkJCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0icGluZyI+Ci0JCQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJtZXNzYWdlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgkJCQkJCQotCQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8L3hzZDpjb21wbGV4VHlwZT4KLQkJCTwveHNkOmVsZW1lbnQ+CQkKLQkJCQotCQkJPHhzZDplbGVtZW50IG5hbWU9InBpbmdSZXNwb25zZSI+Ci0JCQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJyZXNwb25zZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLQkJCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JCQk8L3hzZDplbGVtZW50PgotCQkJCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0ic2xlZXAiPgotCQkJCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4JCQkJCQkKLQkJCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JCQk8L3hzZDplbGVtZW50PgkJCi0JCQkKLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJzbGVlcFJlc3BvbnNlIj4KLQkJCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Im1lc3NhZ2UiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0JCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTwveHNkOmNvbXBsZXhUeXBlPgotCQkJPC94c2Q6ZWxlbWVudD4JCQotCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iaXNBc2xlZXAiPgotCQkJCTx4c2Q6Y29tcGxleFR5cGUgLz4KLQkJCTwveHNkOmVsZW1lbnQ+CQotCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iaXNBc2xlZXBSZXNwb25zZSI+Ci0JCQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJtZXNzYWdlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotCQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8L3hzZDpjb21wbGV4VHlwZT4KLQkJCTwveHNkOmVsZW1lbnQ+CQotCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0id2FrZVVwIj4KLQkJCQk8eHNkOmNvbXBsZXhUeXBlIC8+Ci0JCQk8L3hzZDplbGVtZW50PgkKLQotCQkJPHhzZDplbGVtZW50IG5hbWU9Indha2VVcFJlc3BvbnNlIj4KLQkJCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Im1lc3NhZ2UiIHR5cGU9InhzZDpzdHJpbmciIC8+CQkJCQkJCi0JCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTwveHNkOmNvbXBsZXhUeXBlPgotCQkJPC94c2Q6ZWxlbWVudD4JCi0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJpbnZva2VBc3luYyI+Ci0JCQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJyZXF1ZXN0IiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgkJCQkJCQotCQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8L3hzZDpjb21wbGV4VHlwZT4KLQkJCTwveHNkOmVsZW1lbnQ+Ci0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJpbnZva2VBc3luY1Jlc3BvbnNlIj4KLQkJCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9InJlc3BvbnNlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgkJCQkJCQotCQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8L3hzZDpjb21wbGV4VHlwZT4KLQkJCTwveHNkOmVsZW1lbnQ+Ci0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJjdXN0b21Bc3luYyI+Ci0JCQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJyZXF1ZXN0IiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgkJCQkJCQotCQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8L3hzZDpjb21wbGV4VHlwZT4KLQkJCTwveHNkOmVsZW1lbnQ+Ci0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJjdXN0b21Bc3luY1Jlc3BvbnNlIj4KLQkJCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9InJlc3BvbnNlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgkJCQkJCQotCQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8L3hzZDpjb21wbGV4VHlwZT4KLQkJCTwveHNkOmVsZW1lbnQ+Ci0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJhbm90aGVyIj4KLQkJCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9InJlcXVlc3QiIHR5cGU9InhzZDpzdHJpbmciIC8+CQkJCQkJCi0JCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTwveHNkOmNvbXBsZXhUeXBlPgotCQkJPC94c2Q6ZWxlbWVudD4KLQotCQkJPHhzZDplbGVtZW50IG5hbWU9ImFub3RoZXJSZXNwb25zZSI+Ci0JCQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJyZXNwb25zZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4JCQkJCQkKLQkJCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JCQk8L3hzZDplbGVtZW50PgotCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0idGhyb3dFeGNlcHRpb24iPgotCQkJCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iZXhjZXB0aW9uVHlwZSIgdHlwZT0idG5zOkV4Y2VwdGlvblR5cGVFbnVtIiAvPgotCQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8L3hzZDpjb21wbGV4VHlwZT4KLQkJCTwveHNkOmVsZW1lbnQ+CQkKLQotCQkJPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkV4Y2VwdGlvblR5cGVFbnVtIj4KLQkJCQk8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOUEUiIC8+Ci0JCQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpdmlkZUJ5WmVybyIgLz4KLQkJCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV1NFIiAvPgotCQkJCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb2FwRmF1bHQiIC8+Ci0JCQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldzZGxGYXVsdCIgLz4KLQkJCQk8L3hzZDpyZXN0cmljdGlvbj4KLQkJCTwveHNkOnNpbXBsZVR5cGU+CQotCQkJCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0idGhyb3dFeGNlcHRpb25GYXVsdEJlYW4iPgotCQkJCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0idGV4dCIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLQkJCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JCQk8L3hzZDplbGVtZW50PgkJCQotCQkJCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0idGhyb3dFeGNlcHRpb25SZXNwb25zZSI+Ci0JCQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJyZXNwb25zZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLQkJCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JCQk8L3hzZDplbGVtZW50PgotCi0JCTwveHNkOnNjaGVtYT4KLQk8L3dzZGw6dHlwZXM+Ci0KLQk8d3NkbDptZXNzYWdlIG5hbWU9InBpbmdSZXF1ZXN0Ij4KLQkJPHdzZGw6cGFydCBuYW1lPSJyZXF1ZXN0IiBlbGVtZW50PSJ0bnM6cGluZyIgLz4KLQk8L3dzZGw6bWVzc2FnZT4KLQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0icGluZ1Jlc3BvbnNlIj4KLQkJPHdzZGw6cGFydCBuYW1lPSJyZXNwb25zZSIgZWxlbWVudD0idG5zOnBpbmdSZXNwb25zZSIgLz4KLQk8L3dzZGw6bWVzc2FnZT4KLQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0idGhyb3dFeGNlcHRpb25SZXF1ZXN0Ij4KLQkJPHdzZGw6cGFydCBuYW1lPSJyZXF1ZXN0IiBlbGVtZW50PSJ0bnM6dGhyb3dFeGNlcHRpb24iIC8+Ci0JPC93c2RsOm1lc3NhZ2U+Ci0KLQk8d3NkbDptZXNzYWdlIG5hbWU9InRocm93RXhjZXB0aW9uUmVzcG9uc2UiPgotCQk8d3NkbDpwYXJ0IG5hbWU9InJlc3BvbnNlIiBlbGVtZW50PSJ0bnM6dGhyb3dFeGNlcHRpb25SZXNwb25zZSIgLz4KLQk8L3dzZGw6bWVzc2FnZT4KLQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0idGhyb3dFeGNlcHRpb25GYXVsdCI+Ci0JCTx3c2RsOnBhcnQgbmFtZT0iZmF1bHQiIGVsZW1lbnQ9InRuczp0aHJvd0V4Y2VwdGlvbkZhdWx0QmVhbiIgLz4KLQk8L3dzZGw6bWVzc2FnZT4KLQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0ic2xlZXBSZXF1ZXN0Ij4KLQkJPHdzZGw6cGFydCBuYW1lPSJyZXF1ZXN0IiBlbGVtZW50PSJ0bnM6c2xlZXAiIC8+Ci0JPC93c2RsOm1lc3NhZ2U+Ci0KLQk8d3NkbDptZXNzYWdlIG5hbWU9InNsZWVwUmVzcG9uc2UiPgotCQk8d3NkbDpwYXJ0IG5hbWU9InJlc3BvbnNlIiBlbGVtZW50PSJ0bnM6c2xlZXBSZXNwb25zZSIgLz4KLQk8L3dzZGw6bWVzc2FnZT4KLQkKLQk8d3NkbDptZXNzYWdlIG5hbWU9Indha2VVcFJlcXVlc3QiPgotCQk8d3NkbDpwYXJ0IG5hbWU9InJlc3BvbnNlIiBlbGVtZW50PSJ0bnM6d2FrZVVwIiAvPgkKLQk8L3dzZGw6bWVzc2FnZT4KLQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0id2FrZVVwUmVzcG9uc2UiPgotCQk8d3NkbDpwYXJ0IG5hbWU9InJlc3BvbnNlIiBlbGVtZW50PSJ0bnM6d2FrZVVwUmVzcG9uc2UiIC8+CQotCTwvd3NkbDptZXNzYWdlPgkKLQkKLQk8d3NkbDptZXNzYWdlIG5hbWU9ImlzQXNsZWVwUmVxdWVzdCI+Ci0JPHdzZGw6cGFydCBuYW1lPSJyZXNwb25zZSIgZWxlbWVudD0idG5zOmlzQXNsZWVwIiAvPgotCTwvd3NkbDptZXNzYWdlPgotCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJpc0FzbGVlcFJlc3BvbnNlIj4KLQkJPHdzZGw6cGFydCBuYW1lPSJyZXNwb25zZSIgZWxlbWVudD0idG5zOmlzQXNsZWVwUmVzcG9uc2UiIC8+CQotCTwvd3NkbDptZXNzYWdlPgkJCi0JCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJpbnZva2VBc3luY1JlcXVlc3QiPgotCQk8d3NkbDpwYXJ0IG5hbWU9InJlcXVlc3QiIGVsZW1lbnQ9InRuczppbnZva2VBc3luYyIgLz4KLQk8L3dzZGw6bWVzc2FnZT4KLQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0iaW52b2tlQXN5bmNSZXNwb25zZSI+Ci0JCTx3c2RsOnBhcnQgbmFtZT0icmVzcG9uc2UiIGVsZW1lbnQ9InRuczppbnZva2VBc3luY1Jlc3BvbnNlIiAvPgotCTwvd3NkbDptZXNzYWdlPgkKLQkKLQk8d3NkbDptZXNzYWdlIG5hbWU9ImN1c3RvbUFzeW5jUmVxdWVzdCI+Ci0JCTx3c2RsOnBhcnQgbmFtZT0icmVxdWVzdCIgZWxlbWVudD0idG5zOmN1c3RvbUFzeW5jIiAvPgotCTwvd3NkbDptZXNzYWdlPgotCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJjdXN0b21Bc3luY1Jlc3BvbnNlIj4KLQkJPHdzZGw6cGFydCBuYW1lPSJyZXNwb25zZSIgZWxlbWVudD0idG5zOmN1c3RvbUFzeW5jUmVzcG9uc2UiIC8+Ci0JPC93c2RsOm1lc3NhZ2U+CQkKLQkKLQk8d3NkbDptZXNzYWdlIG5hbWU9ImFub3RoZXJSZXF1ZXN0Ij4KLQkJPHdzZGw6cGFydCBuYW1lPSJyZXF1ZXN0IiBlbGVtZW50PSJ0bnM6YW5vdGhlciIgLz4KLQk8L3dzZGw6bWVzc2FnZT4KLQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0iYW5vdGhlclJlc3BvbnNlIj4KLQkJPHdzZGw6cGFydCBuYW1lPSJyZXNwb25zZSIgZWxlbWVudD0idG5zOmFub3RoZXJSZXNwb25zZSIgLz4KLQk8L3dzZGw6bWVzc2FnZT4JCQotCQotCTx3c2RsOnBvcnRUeXBlIG5hbWU9IkFzeW5jUG9ydCI+Ci0JCQotCQk8IS0tIHNpbXBsZSBwaW5nIG9wZXJhdGlvbiB0aGF0IHdpbGwgYmUgdXNlZCBmb3IgRG9jTGl0V3JhcHBlZCBhc3luYyB0ZXN0LS0+Ci0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJwaW5nIj4KLQkJCTx3c2RsOmlucHV0ICBtZXNzYWdlPSJ0bnM6cGluZ1JlcXVlc3QiIC8+Ci0JCQk8d3NkbDpvdXRwdXQgbWVzc2FnZT0idG5zOnBpbmdSZXNwb25zZSIgLz4KLQkJPC93c2RsOm9wZXJhdGlvbj4JCQotCQkKLQkJPCEtLSByZXF1ZXN0IGZvciB0aGUgc2VydmVyIHRvIGdvdG8gc2xlZXAgdW50aWwgcmVsZWFzZSBpcyBjYWxsZWQtLT4KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9InNsZWVwIj4KLQkJCTx3c2RsOmlucHV0ICBtZXNzYWdlPSJ0bnM6c2xlZXBSZXF1ZXN0IiAvPgotCQkJPHdzZGw6b3V0cHV0IG1lc3NhZ2U9InRuczpzbGVlcFJlc3BvbnNlIiAvPgotCQk8L3dzZGw6b3BlcmF0aW9uPgotCQkKLQkJPCEtLSBjaGVjayB0byBzZWUgaWYgdGhlIHNsZWVwIG9wZXJhdGlvbiBoYXMgYmVlbiBjYWxsZWQgeWV0IC0tPgotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iaXNBc2xlZXAiPgotCQkJPHdzZGw6aW5wdXQgIG1lc3NhZ2U9InRuczppc0FzbGVlcFJlcXVlc3QiIC8+Ci0JCQk8d3NkbDpvdXRwdXQgbWVzc2FnZT0idG5zOmlzQXNsZWVwUmVzcG9uc2UiIC8+Ci0JCTwvd3NkbDpvcGVyYXRpb24+CQkJCi0JCQotCQk8IS0tIGZvcmNlIHRoZSBzbGVlcCBvcGVyYXRpb24gdG8gc3RvcCBzbGVlcGluZyAtLT4KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9Indha2VVcCI+Ci0JCQk8d3NkbDppbnB1dCAgbWVzc2FnZT0idG5zOndha2VVcFJlcXVlc3QiIC8+Ci0JCQk8d3NkbDpvdXRwdXQgbWVzc2FnZT0idG5zOndha2VVcFJlc3BvbnNlIiAvPgotCQk8L3dzZGw6b3BlcmF0aW9uPgkJCi0JCQkKLQkJCQotCQkJCi0JCTwhLS0gU2Vjb25kIHN1aXRlIG9mIHRlc3RzIGZvciBBc3luYyBvcGVyYXRpb24gbmFtaW5nOgotCQkJIHdpbGwgdGVzdCBmb3IgaG93IHRoZSBpbXBsZW1lbnRhdGlvbiByZXNwb25kcyB0bwotCQkgICAgIG1ldGhvZHMgZW5kaW5nIGluIEFzeW5jIHdpdGggYXN5bmMgYmluZGluZyBlbmFibGVkCi0JCSAtLT4KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9Imludm9rZUFzeW5jIj4KLQkJCTx3c2RsOmlucHV0ICBtZXNzYWdlPSJ0bnM6aW52b2tlQXN5bmNSZXF1ZXN0IiAvPgotCQkJPHdzZGw6b3V0cHV0IG1lc3NhZ2U9InRuczppbnZva2VBc3luY1Jlc3BvbnNlIiAvPgotCQk8L3dzZGw6b3BlcmF0aW9uPgkJCQotCQkJCi0JCTwhLS0gd2lsbCB0ZXN0IGZvciBob3cgdGhlIGltcGxlbWVudGF0aW9uIHJlc3BvbmRzIHRvCi0JCSAgICAgbWV0aG9kcyBlbmRpbmcgaW4gYXN5bmMgd2l0aCBhc3luYyBiaW5kaW5nIGVuYWJsZWQKLQkJIC0tPgkJCQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iY3VzdG9tQXN5bmMiPgotCQkJPHdzZGw6aW5wdXQgIG1lc3NhZ2U9InRuczpjdXN0b21Bc3luY1JlcXVlc3QiIC8+Ci0JCQk8d3NkbDpvdXRwdXQgbWVzc2FnZT0idG5zOmN1c3RvbUFzeW5jUmVzcG9uc2UiIC8+Ci0JCTwvd3NkbDpvcGVyYXRpb24+Ci0JCQotCQk8IS0tIHdlIHdpbGwgbWFwIHRoaXMgb3BlcmF0aW9uIHRvIGEgamF2YSBtZXRob2QgZW5kaW5nIGluIEFzeW5jCi0JCSAtLT4JCQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iYW5vdGhlciI+Ci0JCQk8d3NkbDppbnB1dCAgbWVzc2FnZT0idG5zOmFub3RoZXJSZXF1ZXN0IiAvPgotCQkJPHdzZGw6b3V0cHV0IG1lc3NhZ2U9InRuczphbm90aGVyUmVzcG9uc2UiIC8+Ci0JCTwvd3NkbDpvcGVyYXRpb24+Ci0JCQotCQk8IS0tIHRlc3QgZm9yIHZhcmlvcyBleGNlcHRpb25zLCB0byB0ZXN0IGV4Y2VwdGlvbiBoYW5kbGluZyB3aXRoIGFzeW5jTUVQCi0JCQkgZW5hYmxlZAotCQkgLS0+CQkKLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9InRocm93RXhjZXB0aW9uIj4KLQkJCTx3c2RsOmlucHV0ICBtZXNzYWdlPSJ0bnM6dGhyb3dFeGNlcHRpb25SZXF1ZXN0IiAvPgotCQkJPHdzZGw6b3V0cHV0IG1lc3NhZ2U9InRuczp0aHJvd0V4Y2VwdGlvblJlc3BvbnNlIiAvPgotCQkJPHdzZGw6ZmF1bHQgbmFtZT0idGhyb3dFeGNlcHRpb25GYXVsdCIgbWVzc2FnZT0idG5zOnRocm93RXhjZXB0aW9uRmF1bHQiIC8+CQkJCi0JCTwvd3NkbDpvcGVyYXRpb24+CQkJCi0JCQkKLQk8L3dzZGw6cG9ydFR5cGU+Ci0JCi0JPHdzZGw6YmluZGluZyBuYW1lPSJBc3luYyIgdHlwZT0idG5zOkFzeW5jUG9ydCI+Ci0JCTxzb2FwOmJpbmRpbmcgc3R5bGU9ImRvY3VtZW50IiB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIgLz4KLQkJCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJwaW5nIj4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vb3JnL3Rlc3QvYXN5bmNkb2NsaXQvcGluZyIgLz4KLQkJCTx3c2RsOmlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAgLz4KLQkJCTwvd3NkbDppbnB1dD4KLQkJCTx3c2RsOm91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgIC8+Ci0JCQk8L3dzZGw6b3V0cHV0PgotCQk8L3dzZGw6b3BlcmF0aW9uPgkJCi0JCQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0ic2xlZXAiPgotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly9vcmcvdGVzdC9hc3luY2RvY2xpdC9zbGVlcCIgLz4KLQkJCTx3c2RsOmlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAgLz4KLQkJCTwvd3NkbDppbnB1dD4KLQkJCTx3c2RsOm91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgIC8+Ci0JCQk8L3dzZGw6b3V0cHV0PgotCQk8L3dzZGw6b3BlcmF0aW9uPgotCQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iaXNBc2xlZXAiPgotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly9vcmcvdGVzdC9hc3luY2RvY2xpdC9pc0FzbGVlcCIgLz4KLQkJCTx3c2RsOmlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAgLz4KLQkJCTwvd3NkbDppbnB1dD4KLQkJCTx3c2RsOm91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgIC8+Ci0JCQk8L3dzZGw6b3V0cHV0PgotCQk8L3dzZGw6b3BlcmF0aW9uPgkKLQkKLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9Indha2VVcCI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL29yZy90ZXN0L2FzeW5jZG9jbGl0L3dha2VVcCIgLz4KLQkJCTx3c2RsOmlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAgLz4KLQkJCTwvd3NkbDppbnB1dD4KLQkJCTx3c2RsOm91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgIC8+Ci0JCQk8L3dzZGw6b3V0cHV0PgotCQk8L3dzZGw6b3BlcmF0aW9uPgotCQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iaW52b2tlQXN5bmMiPgotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly9vcmcvdGVzdC9hc3luY2RvY2xpdC9pbnZva2VBc3luYyIgLz4KLQkJCTx3c2RsOmlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAgLz4KLQkJCTwvd3NkbDppbnB1dD4KLQkJCTx3c2RsOm91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgIC8+Ci0JCQk8L3dzZGw6b3V0cHV0PgotCQk8L3dzZGw6b3BlcmF0aW9uPgkJCi0JCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJjdXN0b21Bc3luYyI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL29yZy90ZXN0L2FzeW5jZG9jbGl0L2N1c3RvbUFzeW5jIiAvPgotCQkJPHdzZGw6aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiICAvPgotCQkJPC93c2RsOmlucHV0PgotCQkJPHdzZGw6b3V0cHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAgLz4KLQkJCTwvd3NkbDpvdXRwdXQ+Ci0JCTwvd3NkbDpvcGVyYXRpb24+CQkKLQkKLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImFub3RoZXIiPgotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly9vcmcvdGVzdC9hc3luY2RvY2xpdC9hbm90aGVyIiAvPgotCQkJPHdzZGw6aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiICAvPgotCQkJPC93c2RsOmlucHV0PgotCQkJPHdzZGw6b3V0cHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAgLz4KLQkJCTwvd3NkbDpvdXRwdXQ+Ci0JCTwvd3NkbDpvcGVyYXRpb24+Ci0JCQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0idGhyb3dFeGNlcHRpb24iPgotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly9vcmcvdGVzdC9hc3luY2RvY2xpdC90aHJvd0V4Y2VwdGlvbiIgLz4KLQkJCTx3c2RsOmlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAgLz4KLQkJCTwvd3NkbDppbnB1dD4KLQkJCTx3c2RsOm91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgIC8+Ci0JCQk8L3dzZGw6b3V0cHV0PgotCQkJPHdzZGw6ZmF1bHQgbmFtZT0idGhyb3dFeGNlcHRpb25GYXVsdCI+Ci0JCQkJPHNvYXA6ZmF1bHQgdXNlPSJsaXRlcmFsIiBuYW1lPSJ0aHJvd0V4Y2VwdGlvbkZhdWx0IiAvPgotCQkJPC93c2RsOmZhdWx0PgkJCQkKLQkJPC93c2RsOm9wZXJhdGlvbj4JCQkKLQkKLQk8L3dzZGw6YmluZGluZz4KLQkKLQk8d3NkbDpzZXJ2aWNlIG5hbWU9IkFzeW5jU2VydmljZSI+Ci0JCTx3c2RsOnBvcnQgYmluZGluZz0idG5zOkFzeW5jIiBuYW1lPSJBc3luY1BvcnQiPgotCQkJPHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo5MDgwL2pheHdzLmFzeW5jZG9jbGl0L3NlcnZpY2VzL0FzeW5jRG9jTGl0V3JhcHBlZFNlcnZpY2UiIC8+Ci0JCTwvd3NkbDpwb3J0PgotCTwvd3NkbDpzZXJ2aWNlPgotCQotPC93c2RsOmRlZmluaXRpb25zPgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hc3luY2RvY2xpdC9zZXJ2ZXIvVGhyb3dFeGNlcHRpb25GYXVsdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hc3luY2RvY2xpdC9zZXJ2ZXIvVGhyb3dFeGNlcHRpb25GYXVsdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjQ1NmFiLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYXN5bmNkb2NsaXQvc2VydmVyL1Rocm93RXhjZXB0aW9uRmF1bHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0vLw0KLS8vIEdlbmVyYXRlZCBCeTpKQVgtV1MgUkkgSUJNIDIuMS4xIGluIEpESyA2IChKQVhCIFJJIElCTSBKQVhCIDIuMS4zIGluIEpESyAxLjYpDQotLy8NCi0NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLmFzeW5jZG9jbGl0LnNlcnZlcjsNCi0NCi1pbXBvcnQgamF2YXgueG1sLndzLldlYkZhdWx0Ow0KLWltcG9ydCBvcmcudGVzdC5hc3luY2RvY2xpdC5UaHJvd0V4Y2VwdGlvbkZhdWx0QmVhbjsNCi0NCi1AV2ViRmF1bHQobmFtZSA9ICJ0aHJvd0V4Y2VwdGlvbkZhdWx0QmVhbiIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL3Rlc3QvYXN5bmNkb2NsaXQiKQ0KLXB1YmxpYyBjbGFzcyBUaHJvd0V4Y2VwdGlvbkZhdWx0DQotICAgIGV4dGVuZHMgRXhjZXB0aW9uDQotew0KLQ0KLSAgICAvKioNCi0gICAgICogSmF2YSB0eXBlIHRoYXQgZ29lcyBhcyBzb2FwZW52OkZhdWx0IGRldGFpbCBlbGVtZW50Lg0KLSAgICAgKiANCi0gICAgICovDQotICAgIHByaXZhdGUgVGhyb3dFeGNlcHRpb25GYXVsdEJlYW4gZmF1bHRJbmZvOw0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSBmYXVsdEluZm8NCi0gICAgICogQHBhcmFtIG1lc3NhZ2UNCi0gICAgICovDQotICAgIHB1YmxpYyBUaHJvd0V4Y2VwdGlvbkZhdWx0KFN0cmluZyBtZXNzYWdlLCBUaHJvd0V4Y2VwdGlvbkZhdWx0QmVhbiBmYXVsdEluZm8pIHsNCi0gICAgICAgIHN1cGVyKG1lc3NhZ2UpOw0KLSAgICAgICAgdGhpcy5mYXVsdEluZm8gPSBmYXVsdEluZm87DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gZmF1bHRJbmZvDQotICAgICAqIEBwYXJhbSBtZXNzYWdlDQotICAgICAqIEBwYXJhbSBjYXVzZQ0KLSAgICAgKi8NCi0gICAgcHVibGljIFRocm93RXhjZXB0aW9uRmF1bHQoU3RyaW5nIG1lc3NhZ2UsIFRocm93RXhjZXB0aW9uRmF1bHRCZWFuIGZhdWx0SW5mbywgVGhyb3dhYmxlIGNhdXNlKSB7DQotICAgICAgICBzdXBlcihtZXNzYWdlLCBjYXVzZSk7DQotICAgICAgICB0aGlzLmZhdWx0SW5mbyA9IGZhdWx0SW5mbzsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgZmF1bHQgYmVhbjogb3JnLnRlc3QuYXN5bmNkb2NsaXQuVGhyb3dFeGNlcHRpb25GYXVsdEJlYW4NCi0gICAgICovDQotICAgIHB1YmxpYyBUaHJvd0V4Y2VwdGlvbkZhdWx0QmVhbiBnZXRGYXVsdEluZm8oKSB7DQotICAgICAgICByZXR1cm4gZmF1bHRJbmZvOw0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvZGx3bWluL0dyZWV0ZXJJbXBsLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2Rsd21pbi9HcmVldGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjIzNDNhLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvZGx3bWluL0dyZWV0ZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5kbHdtaW47DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLmRsd21pbi5zZWkuR3JlZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuZGx3bWluLnNlaS5UZXN0RXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5kbHdtaW4uc2VpLlRlc3RFeGNlcHRpb24yOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5kbHdtaW4uc2VpLlRlc3RFeGNlcHRpb24zOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5kbHdtaW4udHlwZXMuUHJvY2Vzc0ZhdWx0MzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuZGx3bWluLnR5cGVzLlRlc3RCZWFuOw0KLQ0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247DQotDQotQFdlYlNlcnZpY2Uoc2VydmljZU5hbWU9IkdyZWV0ZXJTZXJ2aWNlIiwNCi0JCQllbmRwb2ludEludGVyZmFjZSA9ICJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5kbHdtaW4uc2VpLkdyZWV0ZXIiLA0KLQkJCXRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vYXBhY2hlLm9yZy9heGlzMi9qYXh3cy9zYW1wbGUvZGx3bWluIikNCi1wdWJsaWMgY2xhc3MgR3JlZXRlckltcGwgaW1wbGVtZW50cyBHcmVldGVyIHsNCi0NCi0gICAgcHVibGljIFN0cmluZyBncmVldE1lKFN0cmluZyBtZSkgew0KLSAgICAgICAgcmV0dXJuICJIZWxsbyAiICsgbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyB0ZXN0VW5xdWFsaWZpZWQoU3RyaW5nIGluKSB7DQotICAgICAgICByZXR1cm4gaW47DQotICAgIH0NCi0NCi0gICAgcHVibGljIFRlc3RCZWFuIHByb2Nlc3MoaW50IGluQWN0aW9uLCBUZXN0QmVhbiBpbikgdGhyb3dzIFRlc3RFeGNlcHRpb24sIFRlc3RFeGNlcHRpb24yLCBUZXN0RXhjZXB0aW9uMyB7DQotICAgICAgICBpZiAoaW5BY3Rpb24gPT0gMCkgew0KLSAgICAgICAgICAgIC8vIGVjaG8NCi0gICAgICAgICAgICByZXR1cm4gaW47DQotICAgICAgICB9IGVsc2UgaWYgKGluQWN0aW9uID09IDEpIHsNCi0gICAgICAgICAgICAvLyB0aHJvdyBjaGVja2VkIGV4Y2VwdGlvbiB0aGF0IGRvZXMgbm90IGhhdmUgYSBmYXVsdCBiZWFuDQotICAgICAgICAgICAgdGhyb3cgbmV3IFRlc3RFeGNlcHRpb24oIlRlc3RFeGNlcHRpb24gdGhyb3duIiwgMTIzKTsNCi0gICAgICAgIH0gZWxzZSBpZiAoaW5BY3Rpb24gPT0gMikgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKCJXZWJTZXJ2aWNlRXhjZXB0aW9uIHRocm93biIpOw0KLSAgICAgICAgfSBlbHNlIGlmIChpbkFjdGlvbiA9PSAzKSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJOUEUgdGhyb3duIik7DQotICAgICAgICB9IGVsc2UgaWYgKGluQWN0aW9uID09IDQpIHsNCi0gICAgICAgICAgIC8vIHRocm93IGNoZWNrZWQgZXhjZXB0aW9uIHRoYXQgZG9lcyBoYXZlIGEgZmF1bHQgYmVhbg0KLSAgICAgICAgICAgIHRocm93IG5ldyBUZXN0RXhjZXB0aW9uMigiVGVzdEV4Y2VwdGlvbjIgdGhyb3duIiwgNDU2KTsNCi0gICAgICAgIH0gZWxzZSBpZiAoaW5BY3Rpb24gPT0gNSkgew0KLSAgICAgICAgICAgLy8gdGhyb3cgY2hlY2tlZCBleGNlcHRpb24gdGhhdCBkb2VzIGhhdmUgYSBmYXVsdCBiZWFuDQotICAgICAgICAgICAgUHJvY2Vzc0ZhdWx0MyBmYXVsdEluZm8gPSBuZXcgUHJvY2Vzc0ZhdWx0MygpOw0KLSAgICAgICAgICAgIGZhdWx0SW5mby5zZXRGbGFnKDc4OSk7DQotICAgICAgICAgICAgdGhyb3cgbmV3IFRlc3RFeGNlcHRpb24zKCJUZXN0RXhjZXB0aW9uMyB0aHJvd24iLCBmYXVsdEluZm8pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9kbHdtaW4vTUVUQS1JTkYvZ3JlZXRlci53c2RsIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9kbHdtaW4vTUVUQS1JTkYvZ3JlZXRlci53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjI3ZjMwLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvZGx3bWluL01FVEEtSU5GL2dyZWV0ZXIud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLQ0KLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTx3c2RsOmRlZmluaXRpb25zIHhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIgeG1sbnM6dG5zPSJodHRwOi8vYXBhY2hlLm9yZy9heGlzMi9qYXh3cy9zYW1wbGUvZGx3bWluIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIgeG1sbnM6dHlwZXM9Imh0dHA6Ly9hcGFjaGUub3JnL2F4aXMyL2pheHdzL3NhbXBsZS9kbHdtaW4vdHlwZXMiIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2FwYWNoZS5vcmcvYXhpczIvamF4d3Mvc2FtcGxlL2Rsd21pbiIgbmFtZT0iSGVsbG9Xb3JsZCI+DQotICAgIDx3c2RsOnR5cGVzLz4NCi0gICAgPHdzZGw6dHlwZXM+DQotICAgICAgICA8c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2FwYWNoZS5vcmcvYXhpczIvamF4d3Mvc2FtcGxlL2Rsd21pbiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczp0eXBlcz0iaHR0cDovL2FwYWNoZS5vcmcvYXhpczIvamF4d3Mvc2FtcGxlL2Rsd21pbi90eXBlcyIgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPg0KLSAgICAgICAgICAgIDxpbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vYXBhY2hlLm9yZy9heGlzMi9qYXh3cy9zYW1wbGUvZGx3bWluL3R5cGVzIiBzY2hlbWFMb2NhdGlvbj0iZ3JlZXRlclR5cGVzLnhzZCIvPg0KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImdyZWV0TWUiPg0KLSAgICAgICAgICAgICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgICAgICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0icmVxdWVzdFR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4NCi0gICAgICAgICAgICAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgICAgICAgIDwvY29tcGxleFR5cGU+DQotICAgICAgICAgICAgPC9lbGVtZW50Pg0KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImdyZWV0TWVSZXNwb25zZSI+DQotICAgICAgICAgICAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICAgICAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJyZXNwb25zZVR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4NCi0gICAgICAgICAgICAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgICAgICAgIDwvY29tcGxleFR5cGU+DQotICAgICAgICAgICAgPC9lbGVtZW50Pg0KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InRlc3RVbnF1YWxpZmllZCI+DQotICAgICAgICAgICAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICAgICAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ1bnF1YWxpZmllZFJlcXVlc3QiIGZvcm09InVucXVhbGlmaWVkIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+DQotICAgICAgICAgICAgICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgICAgICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgICAgICAgICAgIDwvZWxlbWVudD4NCi0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ0ZXN0VW5xdWFsaWZpZWRSZXNwb25zZSI+DQotICAgICAgICAgICAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICAgICAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ1bnF1YWxpZmllZFJlc3BvbnNlIiBmb3JtPSJ1bnF1YWxpZmllZCIgdHlwZT0ieHNkOnN0cmluZyIvPg0KLSAgICAgICAgICAgICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICAgICAgICAgICA8L2VsZW1lbnQ+DQotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0icHJvY2VzcyI+DQotICAgICAgICAgICAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICAgICAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJpbkFjdGlvbiIgZm9ybT0idW5xdWFsaWZpZWQiIHR5cGU9InhzZDppbnQiLz4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJpbiIgZm9ybT0idW5xdWFsaWZpZWQiIHR5cGU9InR5cGVzOnRlc3RCZWFuIi8+DQotICAgICAgICAgICAgICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgICAgICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgICAgICAgICAgIDwvZWxlbWVudD4NCi0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJwcm9jZXNzUmVzcG9uc2UiPg0KLSAgICAgICAgICAgICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgICAgICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0ib3V0IiBmb3JtPSJ1bnF1YWxpZmllZCIgdHlwZT0idHlwZXM6dGVzdEJlYW4iLz4NCi0gICAgICAgICAgICAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgICAgICAgIDwvY29tcGxleFR5cGU+DQotICAgICAgICAgICAgPC9lbGVtZW50Pg0KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InByb2Nlc3NGYXVsdCI+DQotICAgICAgICAgICAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICAgICAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJmbGFnIiBmb3JtPSJ1bnF1YWxpZmllZCIgdHlwZT0ieHNkOmludCIvPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Im1lc3NhZ2UiIGZvcm09InVucXVhbGlmaWVkIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+DQotICAgICAgICAgICAgICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgICAgICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgICAgICAgICAgIDwvZWxlbWVudD4NCi0gICAgICAgIDwvc2NoZW1hPg0KLSAgICA8L3dzZGw6dHlwZXM+DQotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0iZ3JlZXRNZVJlcXVlc3QiPg0KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJpbiIgZWxlbWVudD0idG5zOmdyZWV0TWUiLz4NCi0gICAgPC93c2RsOm1lc3NhZ2U+DQotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0iZ3JlZXRNZVJlc3BvbnNlIj4NCi0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0ib3V0IiBlbGVtZW50PSJ0bnM6Z3JlZXRNZVJlc3BvbnNlIi8+DQotICAgIDwvd3NkbDptZXNzYWdlPg0KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9InRlc3RVbnF1YWxpZmllZFJlcXVlc3QiPg0KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJpbiIgZWxlbWVudD0idG5zOnRlc3RVbnF1YWxpZmllZCIvPg0KLSAgICA8L3dzZGw6bWVzc2FnZT4NCi0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJ0ZXN0VW5xdWFsaWZpZWRSZXNwb25zZSI+DQotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9Im91dCIgZWxlbWVudD0idG5zOnRlc3RVbnF1YWxpZmllZFJlc3BvbnNlIi8+DQotICAgIDwvd3NkbDptZXNzYWdlPg0KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9InByb2Nlc3NSZXF1ZXN0Ij4NCi0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0iaW4iIGVsZW1lbnQ9InRuczpwcm9jZXNzIi8+DQotICAgIDwvd3NkbDptZXNzYWdlPg0KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9InByb2Nlc3NSZXNwb25zZSI+DQotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9Im91dCIgZWxlbWVudD0idG5zOnByb2Nlc3NSZXNwb25zZSIvPg0KLSAgICA8L3dzZGw6bWVzc2FnZT4NCi0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJwcm9jZXNzRmF1bHQiPg0KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJmYXVsdCIgZWxlbWVudD0idG5zOnByb2Nlc3NGYXVsdCIvPg0KLSAgICA8L3dzZGw6bWVzc2FnZT4NCi0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJwcm9jZXNzRmF1bHQyIj4NCi0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0iZmF1bHQyIiBlbGVtZW50PSJ0eXBlczpwcm9jZXNzRmF1bHQyIi8+DQotICAgIDwvd3NkbDptZXNzYWdlPg0KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9InByb2Nlc3NGYXVsdDMiPg0KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJmYXVsdDMiIGVsZW1lbnQ9InR5cGVzOnByb2Nlc3NGYXVsdDMiLz4NCi0gICAgPC93c2RsOm1lc3NhZ2U+DQotICAgIDx3c2RsOnBvcnRUeXBlIG5hbWU9IkdyZWV0ZXIiPg0KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImdyZWV0TWUiPg0KLSAgICAgICAgICAgIDx3c2RsOmlucHV0IG5hbWU9ImdyZWV0TWVSZXF1ZXN0IiBtZXNzYWdlPSJ0bnM6Z3JlZXRNZVJlcXVlc3QiLz4NCi0gICAgICAgICAgICA8d3NkbDpvdXRwdXQgbmFtZT0iZ3JlZXRNZVJlc3BvbnNlIiBtZXNzYWdlPSJ0bnM6Z3JlZXRNZVJlc3BvbnNlIi8+DQotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPg0KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InRlc3RVbnF1YWxpZmllZCI+DQotICAgICAgICAgICAgPHdzZGw6aW5wdXQgbmFtZT0idGVzdFVucXVhbGlmaWVkUmVxdWVzdCIgbWVzc2FnZT0idG5zOnRlc3RVbnF1YWxpZmllZFJlcXVlc3QiLz4NCi0gICAgICAgICAgICA8d3NkbDpvdXRwdXQgbmFtZT0idGVzdFVucXVhbGlmaWVkUmVzcG9uc2UiIG1lc3NhZ2U9InRuczp0ZXN0VW5xdWFsaWZpZWRSZXNwb25zZSIvPg0KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4NCi0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJwcm9jZXNzIj4NCi0gICAgICAgICAgICA8d3NkbDppbnB1dCBuYW1lPSJwcm9jZXNzUmVxdWVzdCIgbWVzc2FnZT0idG5zOnByb2Nlc3NSZXF1ZXN0Ii8+DQotICAgICAgICAgICAgPHdzZGw6b3V0cHV0IG5hbWU9InByb2Nlc3NSZXNwb25zZSIgbWVzc2FnZT0idG5zOnByb2Nlc3NSZXNwb25zZSIvPg0KLSAgICAgICAgICAgIDx3c2RsOmZhdWx0IG5hbWU9InByb2Nlc3NGYXVsdCIgbWVzc2FnZT0idG5zOnByb2Nlc3NGYXVsdCIvPg0KLSAgICAgICAgICAgIDx3c2RsOmZhdWx0IG5hbWU9InByb2Nlc3NGYXVsdDIiIG1lc3NhZ2U9InRuczpwcm9jZXNzRmF1bHQyIi8+DQotICAgICAgICAgICAgPHdzZGw6ZmF1bHQgbmFtZT0icHJvY2Vzc0ZhdWx0MyIgbWVzc2FnZT0idG5zOnByb2Nlc3NGYXVsdDMiLz4NCi0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+DQotICAgIDwvd3NkbDpwb3J0VHlwZT4NCi0gICAgPHdzZGw6YmluZGluZyBuYW1lPSJHcmVldGVyU09BUEJpbmRpbmciIHR5cGU9InRuczpHcmVldGVyIj4NCi0gICAgICAgIDxzb2FwOmJpbmRpbmcgc3R5bGU9ImRvY3VtZW50IiB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIvPg0KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImdyZWV0TWUiPg0KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJncmVldE1lIiBzdHlsZT0iZG9jdW1lbnQiLz4NCi0gICAgICAgICAgICA8d3NkbDppbnB1dD4NCi0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4NCi0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+DQotICAgICAgICAgICAgPHdzZGw6b3V0cHV0Pg0KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+DQotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPg0KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InRlc3RVbnF1YWxpZmllZCI+DQotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249InRlc3RVbnF1YWxpZmllZCIgc3R5bGU9ImRvY3VtZW50Ii8+DQotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+DQotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgICAgICAgPC93c2RsOmlucHV0Pg0KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4NCi0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4NCi0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0Pg0KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4NCi0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJwcm9jZXNzIj4NCi0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0icHJvY2VzcyIgc3R5bGU9ImRvY3VtZW50Ii8+DQotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+DQotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgICAgICAgPC93c2RsOmlucHV0Pg0KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4NCi0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4NCi0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0Pg0KLSAgICAgICAgICAgIDxmYXVsdCBuYW1lPSJwcm9jZXNzRmF1bHQiPg0KLSAgICAgICAgICAgICAgICA8c29hcDpmYXVsdCBuYW1lPSJwcm9jZXNzRmF1bHQiIHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgICAgICAgIDwvZmF1bHQ+DQotICAgICAgICAgICAgPGZhdWx0IG5hbWU9InByb2Nlc3NGYXVsdDIiPg0KLSAgICAgICAgICAgICAgICA8c29hcDpmYXVsdCBuYW1lPSJwcm9jZXNzRmF1bHQyIiB1c2U9ImxpdGVyYWwiLz4NCi0gICAgICAgICAgICA8L2ZhdWx0Pg0KLSAgICAgICAgICAgIDxmYXVsdCBuYW1lPSJwcm9jZXNzRmF1bHQzIj4NCi0gICAgICAgICAgICAgICAgPHNvYXA6ZmF1bHQgbmFtZT0icHJvY2Vzc0ZhdWx0MyIgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgICAgICAgPC9mYXVsdD4NCi0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+DQotICAgIDwvd3NkbDpiaW5kaW5nPg0KLSAgICA8d3NkbDpzZXJ2aWNlIG5hbWU9IkdyZWV0ZXJTZXJ2aWNlIj4NCi0gICAgICAgIDx3c2RsOnBvcnQgbmFtZT0iR3JlZXRlclBvcnQiIGJpbmRpbmc9InRuczpHcmVldGVyU09BUEJpbmRpbmciPg0KLSAgICAgICAgICAgIDxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6NjA2MC9heGlzMi9zZXJ2aWNlcy9HcmVldGVyU2VydmljZSIvPg0KLSAgICAgICAgPC93c2RsOnBvcnQ+DQotICAgIDwvd3NkbDpzZXJ2aWNlPg0KLTwvd3NkbDpkZWZpbml0aW9ucz4NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2Rsd21pbi9NRVRBLUlORi9ncmVldGVyVHlwZXMueHNkIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9kbHdtaW4vTUVUQS1JTkYvZ3JlZXRlclR5cGVzLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNjMTg4My4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2Rsd21pbi9NRVRBLUlORi9ncmVldGVyVHlwZXMueHNkCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9hcGFjaGUub3JnL2F4aXMyL2pheHdzL3NhbXBsZS9kbHdtaW4vdHlwZXMiDQotICAgICAgICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSINCi0gICAgICAgICAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIj4NCi0gICAgIDxjb21wbGV4VHlwZSBuYW1lPSJ0ZXN0QmVhbiI+DQotICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICA8ZWxlbWVudCBuYW1lPSJkYXRhMSIgdHlwZT0ieHNkOnN0cmluZyIvPg0KLSAgICAgICAgIDxlbGVtZW50IG5hbWU9ImRhdGEyIiB0eXBlPSJ4c2Q6aW50Ii8+DQotICAgICAgIDwvc2VxdWVuY2U+DQotICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgICAgPGVsZW1lbnQgbmFtZT0icHJvY2Vzc0ZhdWx0MiI+DQotICAgICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgICAgICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iZmxhZyIgICAgZm9ybT0idW5xdWFsaWZpZWQiIHR5cGU9InhzZDppbnQiLz4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJtZXNzYWdlIiBmb3JtPSJ1bnF1YWxpZmllZCIgdHlwZT0ieHNkOnN0cmluZyIvPg0KLSAgICAgICAgICAgICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgIDwvY29tcGxleFR5cGU+DQotICAgICA8L2VsZW1lbnQ+DQotICAgICA8ZWxlbWVudCBuYW1lPSJwcm9jZXNzRmF1bHQzIj4NCi0gICAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICAgICAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJmbGFnIiAgICBmb3JtPSJ1bnF1YWxpZmllZCIgdHlwZT0ieHNkOmludCIvPg0KLSAgICAgICAgICAgICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgIDwvY29tcGxleFR5cGU+DQotICAgICA8L2VsZW1lbnQ+DQotPC9zY2hlbWE+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9kbHdtaW4vc2VpL0dyZWV0ZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvZGx3bWluL3NlaS9HcmVldGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyY2UzZjQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9kbHdtaW4vc2VpL0dyZWV0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLmRsd21pbi5zZWk7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLmRsd21pbi50eXBlcy5UZXN0QmVhbjsNCi0NCi1pbXBvcnQgamF2YXguandzLldlYk1ldGhvZDsNCi1pbXBvcnQgamF2YXguandzLldlYlBhcmFtOw0KLWltcG9ydCBqYXZheC5qd3MuV2ViUmVzdWx0Ow0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsNCi0NCi1AV2ViU2VydmljZSh0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL2FwYWNoZS5vcmcvYXhpczIvamF4d3Mvc2FtcGxlL2Rsd21pbiIsIG5hbWUgPSAiR3JlZXRlciIpDQotDQotcHVibGljIGludGVyZmFjZSBHcmVldGVyIHsNCi0gICAgQFdlYlJlc3VsdCh0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL2FwYWNoZS5vcmcvYXhpczIvamF4d3Mvc2FtcGxlL2Rsd21pbiIsIG5hbWUgPSAicmVzcG9uc2VUeXBlIikNCi0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lID0gImdyZWV0TWUiLCBhY3Rpb249ImdyZWV0TWUiKQ0KLSAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBncmVldE1lKA0KLSAgICAgICAgQFdlYlBhcmFtKHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vYXBhY2hlLm9yZy9heGlzMi9qYXh3cy9zYW1wbGUvZGx3bWluIiwgbmFtZSA9ICJyZXF1ZXN0VHlwZSIpDQotICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHJlcXVlc3RUeXBlDQotICAgICk7DQotICAgIA0KLSAgICBAV2ViUmVzdWx0KHRhcmdldE5hbWVzcGFjZSA9ICIiLCBwYXJ0TmFtZSA9ICJ1bnF1YWxpZmllZFJlc3BvbnNlIikNCi0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lID0gInRlc3RVbnF1YWxpZmllZCIsIGFjdGlvbj0idGVzdFVucXVhbGlmaWVkIikNCi0gICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgdGVzdFVucXVhbGlmaWVkKA0KLSAgICAgICAgQFdlYlBhcmFtKHRhcmdldE5hbWVzcGFjZSA9ICIiLCBwYXJ0TmFtZSA9ICJ1bnF1YWxpZmllZFJlcXVlc3QiKQ0KLSAgICAgICAgamF2YS5sYW5nLlN0cmluZyByZXF1ZXN0VHlwZQ0KLSAgICApOw0KLSANCi0gICAgQFdlYlJlc3VsdCh0YXJnZXROYW1lc3BhY2UgPSAiIiwgcGFydE5hbWUgPSAib3V0IikNCi0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lID0gInByb2Nlc3MiLCBhY3Rpb249InByb2Nlc3MiKQ0KLSAgICBwdWJsaWMgVGVzdEJlYW4gcHJvY2VzcygNCi0gICAgICAgIEBXZWJQYXJhbSh0YXJnZXROYW1lc3BhY2UgPSAiIiwgcGFydE5hbWUgPSAiaW5BY3Rpb24iKQ0KLSAgICAgICAgaW50IGluQWN0aW9uLA0KLSAgICAgICAgQFdlYlBhcmFtKHRhcmdldE5hbWVzcGFjZSA9ICIiLCBwYXJ0TmFtZSA9ICJpbiIpDQotICAgICAgICBUZXN0QmVhbiBpbg0KLSAgICApIHRocm93cyBUZXN0RXhjZXB0aW9uLCBUZXN0RXhjZXB0aW9uMiwgVGVzdEV4Y2VwdGlvbjM7DQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvZGx3bWluL3NlaS9UZXN0RXhjZXB0aW9uLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2Rsd21pbi9zZWkvVGVzdEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWM0ZWE3Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvZGx3bWluL3NlaS9UZXN0RXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5kbHdtaW4uc2VpOw0KLQ0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViRmF1bHQ7DQotDQotLyoqDQotICogRXhhbXBsZSBDaGVja2VkIEV4Y2VwdGlvbiB3aXRoIG5vIGNvcnJlc3BvbmRpbmcgSkFYQiBiZWFuDQotICovDQotQFdlYkZhdWx0KG5hbWU9InByb2Nlc3NGYXVsdCIsIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2FwYWNoZS5vcmcvYXhpczIvamF4d3Mvc2FtcGxlL2Rsd21pbiIpDQotcHVibGljIGNsYXNzIFRlc3RFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gew0KLQ0KLSAgICBwdWJsaWMgaW50IGZsYWc7DQotICAgIA0KLQ0KLSAgICBwdWJsaWMgVGVzdEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgaW50IGZsYWcpIHsNCi0gICAgICAgIHN1cGVyKG1lc3NhZ2UpOw0KLSAgICAgICAgdGhpcy5mbGFnID0gZmxhZzsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIGludCBnZXRGbGFnKCkgew0KLSAgICAgICAgcmV0dXJuIGZsYWc7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9kbHdtaW4vc2VpL1Rlc3RFeGNlcHRpb24yLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2Rsd21pbi9zZWkvVGVzdEV4Y2VwdGlvbjIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZjZWQ5MC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2Rsd21pbi9zZWkvVGVzdEV4Y2VwdGlvbjIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLmRsd21pbi5zZWk7DQotDQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJGYXVsdDsNCi0NCi0vKioNCi0gKiBDaGVja2VkIEV4Y2VwdGlvbiB3aXRoIGEgV2ViRmF1bHQgdGhhdCBsb2NhdGVzIGFuIGV4aXN0aW5nIEpBWEIgQmVhbg0KLSAqDQotICovDQotQFdlYkZhdWx0KG5hbWU9InByb2Nlc3NGYXVsdDIiLCB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9hcGFjaGUub3JnL2F4aXMyL2pheHdzL3NhbXBsZS9kbHdtaW4vdHlwZXMiLA0KLSAgICAgICAgZmF1bHRCZWFuPSJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5kbHdtaW4udHlwZXMuUHJvY2Vzc0ZhdWx0MiIpDQotcHVibGljIGNsYXNzIFRlc3RFeGNlcHRpb24yIGV4dGVuZHMgRXhjZXB0aW9uIHsNCi0NCi0gICAgcHVibGljIGludCBmbGFnOw0KLSAgICANCi0NCi0gICAgcHVibGljIFRlc3RFeGNlcHRpb24yKFN0cmluZyBtZXNzYWdlLCBpbnQgZmxhZykgew0KLSAgICAgICAgc3VwZXIobWVzc2FnZSk7DQotICAgICAgICB0aGlzLmZsYWcgPSBmbGFnOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgaW50IGdldEZsYWcoKSB7DQotICAgICAgICByZXR1cm4gZmxhZzsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2Rsd21pbi9zZWkvVGVzdEV4Y2VwdGlvbjMuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvZGx3bWluL3NlaS9UZXN0RXhjZXB0aW9uMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjIyMzM4Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvZGx3bWluL3NlaS9UZXN0RXhjZXB0aW9uMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuZGx3bWluLnNlaTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuZGx3bWluLnR5cGVzLlByb2Nlc3NGYXVsdDM7DQotDQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJGYXVsdDsNCi0NCi0vKioNCi0gKiBDaGVja2VkIEV4Y2VwdGlvbiB3aXRoIGEgV2ViRmF1bHQgdGhhdCBsb2NhdGVzIGFuIGV4aXN0aW5nIEpBWEIgQmVhbg0KLSAqDQotICovDQotQFdlYkZhdWx0KG5hbWU9InByb2Nlc3NGYXVsdDMiLCB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9hcGFjaGUub3JnL2F4aXMyL2pheHdzL3NhbXBsZS9kbHdtaW4vdHlwZXMiKQ0KLXB1YmxpYyBjbGFzcyBUZXN0RXhjZXB0aW9uMyBleHRlbmRzIEV4Y2VwdGlvbiB7DQotDQotICAgIHB1YmxpYyBQcm9jZXNzRmF1bHQzIGZhdWx0SW5mbzsNCi0gICAgDQotDQotICAgIHB1YmxpYyBUZXN0RXhjZXB0aW9uMyhTdHJpbmcgbWVzc2FnZSwgUHJvY2Vzc0ZhdWx0MyBmYXVsdEluZm8pIHsNCi0gICAgICAgIHN1cGVyKG1lc3NhZ2UpOw0KLSAgICAgICAgdGhpcy5mYXVsdEluZm8gPSBmYXVsdEluZm87DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyBQcm9jZXNzRmF1bHQzIGdldEZhdWx0SW5mbygpIHsNCi0gICAgICAgIHJldHVybiBmYXVsdEluZm87DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9kb2NsaXRiYXJlL0RvY0xpdEJhcmVQb3J0VHlwZUltcGwuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvZG9jbGl0YmFyZS9Eb2NMaXRCYXJlUG9ydFR5cGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzNDQ2N2QuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9kb2NsaXRiYXJlL0RvY0xpdEJhcmVQb3J0VHlwZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi0vKioNCi0gKiANCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLmRvY2xpdGJhcmU7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLmRvY2xpdGJhcmUuc2VpLkRvY0xpdEJhcmVQb3J0VHlwZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuZG9jbGl0YmFyZS5zZWkuRmF1bHRCZWFuV2l0aFdyYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLmRvY2xpdGJhcmUuc2VpLlNpbXBsZUZhdWx0Ow0KLWltcG9ydCBvcmcudGVzdC5zYW1wbGUuZG9jbGl0YmFyZS5Db21wb3NpdGU7DQotDQotaW1wb3J0IGphdmF4Lmp3cy5XZWJNZXRob2Q7DQotaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbTsNCi1pbXBvcnQgamF2YXguandzLldlYlJlc3VsdDsNCi1pbXBvcnQgamF2YXguandzLldlYlBhcmFtLk1vZGU7DQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuSG9sZGVyOw0KLQ0KLUBXZWJTZXJ2aWNlKHNlcnZpY2VOYW1lPSJCYXJlRG9jTGl0U2VydmljZSIsDQotCQkJZW5kcG9pbnRJbnRlcmZhY2U9Im9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLmRvY2xpdGJhcmUuc2VpLkRvY0xpdEJhcmVQb3J0VHlwZSIpDQotcHVibGljIGNsYXNzIERvY0xpdEJhcmVQb3J0VHlwZUltcGwgaW1wbGVtZW50cyBEb2NMaXRCYXJlUG9ydFR5cGUgew0KLQ0KLQkvKiAobm9uLUphdmFkb2MpDQotCSAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuZG9jbGl0YmFyZS5zZWkuRG9jTGl0QmFyZVBvcnRUeXBlI29uZVdheUVtcHR5KCkNCi0JICovDQotCXB1YmxpYyB2b2lkIG9uZVdheUVtcHR5KCkgew0KLQkJU3RyaW5nIHJldFZhbHVlID0gIlJ1bm5pbmcgT25lIHdheSBjYWxsIjsNCi0NCi0JfQ0KLQ0KLQkvKiAobm9uLUphdmFkb2MpDQotCSAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuZG9jbGl0YmFyZS5zZWkuRG9jTGl0QmFyZVBvcnRUeXBlI29uZVdheShqYXZhLmxhbmcuU3RyaW5nKQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgb25lV2F5KFN0cmluZyBhbGxCeU15c2VsZikgew0KLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1Yg0KLQkJU3RyaW5nIHJldFZhbHVlID0gIlJ1bm5pbmcgT25lIHdheSBjYWxsIHdpdGggU3RyaW5nIGlucHV0IiArIGFsbEJ5TXlzZWxmOw0KLQl9DQotICAgICAgICANCi0gICAgICAgICANCi0JcHVibGljIFN0cmluZyBlY2hvU3RyaW5nKFN0cmluZyBlY2hvU3RyaW5nSW4pIHsNCi0JICAgIHJldHVybiBlY2hvU3RyaW5nSW47DQotCX0NCi0NCi0NCi0JLyogKG5vbi1KYXZhZG9jKQ0KLQkgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLmRvY2xpdGJhcmUuc2VpLkRvY0xpdEJhcmVQb3J0VHlwZSN0d29XYXlTaW1wbGUoaW50KQ0KLQkgKi8NCi0JcHVibGljIFN0cmluZyB0d29XYXlTaW1wbGUoaW50IGFsbEJ5TXlzZWxmKSB7DQotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViDQotCQlTdHJpbmcgcmV0VmFsdWUgPSAiQWNrbm93bGVkZ2VtZW50OiByZWNlaXZlZCBpbnB1dCB2YWx1ZSBhcyBpbnRlZ2VyOiIrIGFsbEJ5TXlzZWxmOw0KLQkJcmV0dXJuIHJldFZhbHVlOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0d29XYXlIb2xkZXIoDQotCSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiQ29tcG9zaXRlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcudGVzdC5zYW1wbGUuZG9jbGl0YmFyZSIsIG1vZGUgPSBNb2RlLklOT1VULCBwYXJ0TmFtZSA9ICJhbGxCeU15c2VsZiIpDQotCSAgICAgICAgSG9sZGVyPENvbXBvc2l0ZT4gYWxsQnlNeXNlbGYpDQotCSAgICAgICAgdGhyb3dzIEZhdWx0QmVhbldpdGhXcmFwcGVyLCBTaW1wbGVGYXVsdHsNCi0JCQ0KLQl9DQotCSAgICANCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9kb2NsaXRiYXJlL01FVEEtSU5GL2RvY2xpdGJhcmUud3NkbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvZG9jbGl0YmFyZS9NRVRBLUlORi9kb2NsaXRiYXJlLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzNGJiMzIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9kb2NsaXRiYXJlL01FVEEtSU5GL2RvY2xpdGJhcmUud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDE5MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/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+DQotCQkJCTxzb2FwOmZhdWx0IHVzZT0ibGl0ZXJhbCIgbmFtZT0id3JhcHBlckZhdWx0IiAvPg0KLQkJCTwvd3NkbDpmYXVsdD4JCQkJDQotCQk8L3dzZGw6b3BlcmF0aW9uPg0KLQkJDQotCQ0KLQk8L3dzZGw6YmluZGluZz4NCi0JDQotCTx3c2RsOnNlcnZpY2UgbmFtZT0iQmFyZURvY0xpdFNlcnZpY2UiPg0KLQkJPHdzZGw6cG9ydCBiaW5kaW5nPSJ0bnM6RG9jTGl0QmFyZSIgbmFtZT0iQmFyZURvY0xpdFBvcnQiPg0KLQkJCTxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6NjA2MC9heGlzMi9zZXJ2aWNlcy9CYXJlRG9jTGl0U2VydmljZSIgLz4NCi0JCTwvd3NkbDpwb3J0Pg0KLQk8L3dzZGw6c2VydmljZT4NCi0JDQotPC93c2RsOmRlZmluaXRpb25zPg0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvZG9jbGl0YmFyZS9zZWkvQmFyZURvY0xpdFNlcnZpY2UuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvZG9jbGl0YmFyZS9zZWkvQmFyZURvY0xpdFNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2IxNzU5My4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2RvY2xpdGJhcmUvc2VpL0JhcmVEb2NMaXRTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0NCi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5kb2NsaXRiYXJlLnNlaTsNCi0NCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJFbmRwb2ludDsNCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VDbGllbnQ7DQotaW1wb3J0IGphdmEuaW8uRmlsZTsNCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLm5ldC5VUkw7DQotDQotLyoqDQotICogVGhpcyBjbGFzcyB3YXMgZ2VuZXJhdGVkIGJ5IHRoZSBKQVhXUyBTSS4NCi0gKiBKQVgtV1MgUkkgMi4wXzAxLWIxNS1mY3MNCi0gKiBHZW5lcmF0ZWQgc291cmNlIHZlcnNpb246IDIuMA0KLSAqIA0KLSAqLw0KLUBXZWJTZXJ2aWNlQ2xpZW50KG5hbWUgPSAiQmFyZURvY0xpdFNlcnZpY2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy50ZXN0LnNhbXBsZS5kb2NsaXRiYXJlIiwgd3NkbExvY2F0aW9uID0gInByb3h5X2RvY2xpdC53c2RsIikNCi1wdWJsaWMgY2xhc3MgQmFyZURvY0xpdFNlcnZpY2UNCi0gICAgZXh0ZW5kcyBTZXJ2aWNlDQotew0KLQ0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBVUkwgQkFSRURPQ0xJVFNFUlZJQ0VfV1NETF9MT0NBVElPTjsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHdzZGxMb2NhdGlvbj0iL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvZG9jbGl0YmFyZS9NRVRBLUlORi9kb2NsaXRiYXJlLndzZGwiOw0KLSAgICBzdGF0aWMgew0KLSAgICAgICAgVVJMIHVybCA9IG51bGw7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgCXRyeXsNCi0JICAgICAgICAJU3RyaW5nIGJhc2VEaXIgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoImJhc2VkaXIiLCIuIikpLmdldENhbm9uaWNhbFBhdGgoKTsNCi0JICAgICAgICAJd3NkbExvY2F0aW9uID0gbmV3IEZpbGUoYmFzZURpciArIHdzZGxMb2NhdGlvbikuZ2V0QWJzb2x1dGVQYXRoKCk7DQotICAgICAgICAJfWNhdGNoKEV4Y2VwdGlvbiBlKXsNCi0gICAgICAgIAkJZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgIAl9DQotICAgICAgICAJRmlsZSBmaWxlID0gbmV3IEZpbGUod3NkbExvY2F0aW9uKTsNCi0gICAgICAgIAl1cmwgPSBmaWxlLnRvVVJMKCk7DQotICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICB9DQotICAgICAgICBCQVJFRE9DTElUU0VSVklDRV9XU0RMX0xPQ0FUSU9OID0gdXJsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBCYXJlRG9jTGl0U2VydmljZShVUkwgd3NkbExvY2F0aW9uLCBRTmFtZSBzZXJ2aWNlTmFtZSkgew0KLSAgICAgICAgc3VwZXIod3NkbExvY2F0aW9uLCBzZXJ2aWNlTmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEJhcmVEb2NMaXRTZXJ2aWNlKCkgew0KLSAgICAgICAgc3VwZXIoQkFSRURPQ0xJVFNFUlZJQ0VfV1NETF9MT0NBVElPTiwgbmV3IFFOYW1lKCJodHRwOi8vZG9jbGl0YmFyZS5zYW1wbGUudGVzdC5vcmciLCAiQmFyZURvY0xpdFNlcnZpY2UiKSk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIERvY0xpdEJhcmVQb3J0VHlwZQ0KLSAgICAgKi8NCi0gICAgQFdlYkVuZHBvaW50KG5hbWUgPSAiQmFyZURvY0xpdFBvcnQiKQ0KLSAgICBwdWJsaWMgRG9jTGl0QmFyZVBvcnRUeXBlIGdldEJhcmVEb2NMaXRQb3J0KCkgew0KLSAgICAgICAgcmV0dXJuIChEb2NMaXRCYXJlUG9ydFR5cGUpc3VwZXIuZ2V0UG9ydChuZXcgUU5hbWUoImh0dHA6Ly9kb2NsaXRiYXJlLnNhbXBsZS50ZXN0Lm9yZyIsICJCYXJlRG9jTGl0UG9ydCIpLCBEb2NMaXRCYXJlUG9ydFR5cGUuY2xhc3MpOw0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvZG9jbGl0YmFyZS9zZWkvRG9jTGl0QmFyZVBvcnRUeXBlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2RvY2xpdGJhcmUvc2VpL0RvY0xpdEJhcmVQb3J0VHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGExNzNhLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvZG9jbGl0YmFyZS9zZWkvRG9jTGl0QmFyZVBvcnRUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0NCi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5kb2NsaXRiYXJlLnNlaTsNCi0NCi1pbXBvcnQgb3JnLnRlc3Quc2FtcGxlLmRvY2xpdGJhcmUuQ29tcG9zaXRlOw0KLQ0KLWltcG9ydCBqYXZheC5qd3MuT25ld2F5Ow0KLWltcG9ydCBqYXZheC5qd3MuV2ViTWV0aG9kOw0KLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW07DQotaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbS5Nb2RlOw0KLWltcG9ydCBqYXZheC5qd3MuV2ViUmVzdWx0Ow0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsNCi1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmc7DQotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlBhcmFtZXRlclN0eWxlOw0KLWltcG9ydCBqYXZheC54bWwud3MuSG9sZGVyOw0KLQ0KLQ0KLS8qKg0KLSAqIFRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBieSB0aGUgSkFYV1MgU0kuDQotICogSkFYLVdTIFJJIDIuMF8wMS1iMTUtZmNzDQotICogR2VuZXJhdGVkIHNvdXJjZSB2ZXJzaW9uOiAyLjANCi0gKiANCi0gKi8NCi1AV2ViU2VydmljZShuYW1lID0gIkRvY0xpdEJhcmVQb3J0VHlwZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vZG9jbGl0YmFyZS5zYW1wbGUudGVzdC5vcmciKQ0KLUBTT0FQQmluZGluZyhwYXJhbWV0ZXJTdHlsZSA9IFBhcmFtZXRlclN0eWxlLkJBUkUpDQotcHVibGljIGludGVyZmFjZSBEb2NMaXRCYXJlUG9ydFR5cGUgew0KLQ0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqLw0KLSAgICBAV2ViTWV0aG9kDQotICAgIEBPbmV3YXkNCi0gICAgcHVibGljIHZvaWQgb25lV2F5RW1wdHkoKTsNCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gYWxsQnlNeXNlbGYNCi0gICAgICovDQotICAgIEBXZWJNZXRob2QNCi0gICAgQE9uZXdheQ0KLSAgICBwdWJsaWMgdm9pZCBvbmVXYXkoDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJTdHJpbmciLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL2RvY2xpdGJhcmUuc2FtcGxlLnRlc3Qub3JnIiwgcGFydE5hbWUgPSAiYWxsQnlNeXNlbGYiKQ0KLSAgICAgICAgU3RyaW5nIGFsbEJ5TXlzZWxmKTsNCi0NCi0gICAgDQotICAgIEBXZWJNZXRob2QNCi0gICAgQFdlYlJlc3VsdChuYW1lID0gIlN0cmluZyIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vZG9jbGl0YmFyZS5zYW1wbGUudGVzdC5vcmciLCBwYXJ0TmFtZSA9ICJlY2hvU3RyaW5nSW4iKQ0KLSAgICBwdWJsaWMgU3RyaW5nIGVjaG9TdHJpbmcoDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJTdHJpbmciLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL2RvY2xpdGJhcmUuc2FtcGxlLnRlc3Qub3JnIiwgcGFydE5hbWUgPSAiZWNob1N0cmluZ091dCIpDQotICAgICAgICBTdHJpbmcgZWNob1N0cmluZ0luKTsNCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGFsbEJ5TXlzZWxmDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgamF2YS5sYW5nLlN0cmluZw0KLSAgICAgKi8NCi0gICAgQFdlYk1ldGhvZA0KLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAiU3RyaW5nIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9kb2NsaXRiYXJlLnNhbXBsZS50ZXN0Lm9yZyIsIHBhcnROYW1lID0gImFsbEJ5TXlzZWxmIikNCi0gICAgcHVibGljIFN0cmluZyB0d29XYXlTaW1wbGUoDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJJbnRlZ2VyIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9kb2NsaXRiYXJlLnNhbXBsZS50ZXN0Lm9yZyIsIHBhcnROYW1lID0gImFsbEJ5TXlzZWxmIikNCi0gICAgICAgIGludCBhbGxCeU15c2VsZik7DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGFsbEJ5TXlzZWxmDQotICAgICAqIEB0aHJvd3MgRmF1bHRCZWFuV2l0aFdyYXBwZXINCi0gICAgICogQHRocm93cyBTaW1wbGVGYXVsdA0KLSAgICAgKi8NCi0gICAgQFdlYk1ldGhvZA0KLSAgICBwdWJsaWMgdm9pZCB0d29XYXlIb2xkZXIoDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJDb21wb3NpdGUiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL2RvY2xpdGJhcmUuc2FtcGxlLnRlc3Qub3JnIiwgbW9kZSA9IE1vZGUuSU5PVVQsIHBhcnROYW1lID0gImFsbEJ5TXlzZWxmIikNCi0gICAgICAgIEhvbGRlcjxDb21wb3NpdGU+IGFsbEJ5TXlzZWxmKQ0KLSAgICAgICAgdGhyb3dzIEZhdWx0QmVhbldpdGhXcmFwcGVyLCBTaW1wbGVGYXVsdA0KLSAgICA7DQotDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvZG9jbGl0YmFyZS9zZWkvRmF1bHRCZWFuV2l0aFdyYXBwZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvZG9jbGl0YmFyZS9zZWkvRmF1bHRCZWFuV2l0aFdyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRjZGVhYi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2RvY2xpdGJhcmUvc2VpL0ZhdWx0QmVhbldpdGhXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0NCi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5kb2NsaXRiYXJlLnNlaTsNCi0NCi1pbXBvcnQgb3JnLnRlc3Quc2FtcGxlLmRvY2xpdGJhcmUuQmFzZUZhdWx0Ow0KLQ0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViRmF1bHQ7DQotDQotDQotLyoqDQotICogVGhpcyBjbGFzcyB3YXMgZ2VuZXJhdGVkIGJ5IHRoZSBKQVhXUyBTSS4NCi0gKiBKQVgtV1MgUkkgMi4wXzAxLWIxNS1mY3MNCi0gKiBHZW5lcmF0ZWQgc291cmNlIHZlcnNpb246IDIuMA0KLSAqIA0KLSAqLw0KLUBXZWJGYXVsdChuYW1lID0gIk15QmFzZUZhdWx0QmVhbiIsIGZhdWx0QmVhbj0iIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9kb2NsaXRiYXJlLnNhbXBsZS50ZXN0Lm9yZyIpDQotcHVibGljIGNsYXNzIEZhdWx0QmVhbldpdGhXcmFwcGVyDQotICAgIGV4dGVuZHMgRXhjZXB0aW9uDQotew0KLQ0KLSAgICAvKioNCi0gICAgICogSmF2YSB0eXBlIHRoYXQgZ29lcyBhcyBzb2FwZW52OkZhdWx0IGRldGFpbCBlbGVtZW50Lg0KLSAgICAgKiANCi0gICAgICovDQotICAgIHByaXZhdGUgQmFzZUZhdWx0IGZhdWx0SW5mbzsNCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gZmF1bHRJbmZvDQotICAgICAqIEBwYXJhbSBtZXNzYWdlDQotICAgICAqLw0KLSAgICBwdWJsaWMgRmF1bHRCZWFuV2l0aFdyYXBwZXIoU3RyaW5nIG1lc3NhZ2UsIEJhc2VGYXVsdCBmYXVsdEluZm8pIHsNCi0gICAgICAgIHN1cGVyKG1lc3NhZ2UpOw0KLSAgICAgICAgdGhpcy5mYXVsdEluZm8gPSBmYXVsdEluZm87DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gZmF1bHRJbmZvDQotICAgICAqIEBwYXJhbSBtZXNzYWdlDQotICAgICAqIEBwYXJhbSBjYXVzZQ0KLSAgICAgKi8NCi0gICAgcHVibGljIEZhdWx0QmVhbldpdGhXcmFwcGVyKFN0cmluZyBtZXNzYWdlLCBCYXNlRmF1bHQgZmF1bHRJbmZvLCBUaHJvd2FibGUgY2F1c2UpIHsNCi0gICAgICAgIHN1cGVyKG1lc3NhZ2UsIGNhdXNlKTsNCi0gICAgICAgIHRoaXMuZmF1bHRJbmZvID0gZmF1bHRJbmZvOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBmYXVsdCBiZWFuOiBvcmcudGVzdC5zYW1wbGUuZG9jbGl0YmFyZS5CYXNlRmF1bHQNCi0gICAgICovDQotICAgIHB1YmxpYyBCYXNlRmF1bHQgZ2V0RmF1bHRJbmZvKCkgew0KLSAgICAgICAgcmV0dXJuIGZhdWx0SW5mbzsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2RvY2xpdGJhcmUvc2VpL1NpbXBsZUZhdWx0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2RvY2xpdGJhcmUvc2VpL1NpbXBsZUZhdWx0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkYzE5YzcuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9kb2NsaXRiYXJlL3NlaS9TaW1wbGVGYXVsdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotDQotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuZG9jbGl0YmFyZS5zZWk7DQotDQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJGYXVsdDsNCi0NCi0NCi0vKioNCi0gKiBUaGlzIGNsYXNzIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIEpBWFdTIFNJLg0KLSAqIEpBWC1XUyBSSSAyLjBfMDEtYjE1LWZjcw0KLSAqIEdlbmVyYXRlZCBzb3VyY2UgdmVyc2lvbjogMi4wDQotICogDQotICovDQotQFdlYkZhdWx0KG5hbWUgPSAiTXlGYXVsdCIsIGZhdWx0QmVhbj0iIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9kb2NsaXRiYXJlLnNhbXBsZS50ZXN0Lm9yZyIpDQotcHVibGljIGNsYXNzIFNpbXBsZUZhdWx0DQotICAgIGV4dGVuZHMgRXhjZXB0aW9uDQotew0KLQ0KLSAgICAvKioNCi0gICAgICogSmF2YSB0eXBlIHRoYXQgZ29lcyBhcyBzb2FwZW52OkZhdWx0IGRldGFpbCBlbGVtZW50Lg0KLSAgICAgKiANCi0gICAgICovDQotICAgIHByaXZhdGUgU3RyaW5nIGZhdWx0SW5mbzsNCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gZmF1bHRJbmZvDQotICAgICAqIEBwYXJhbSBtZXNzYWdlDQotICAgICAqLw0KLSAgICBwdWJsaWMgU2ltcGxlRmF1bHQoU3RyaW5nIG1lc3NhZ2UsIFN0cmluZyBmYXVsdEluZm8pIHsNCi0gICAgICAgIHN1cGVyKG1lc3NhZ2UpOw0KLSAgICAgICAgdGhpcy5mYXVsdEluZm8gPSBmYXVsdEluZm87DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gZmF1bHRJbmZvDQotICAgICAqIEBwYXJhbSBtZXNzYWdlDQotICAgICAqIEBwYXJhbSBjYXVzZQ0KLSAgICAgKi8NCi0gICAgcHVibGljIFNpbXBsZUZhdWx0KFN0cmluZyBtZXNzYWdlLCBTdHJpbmcgZmF1bHRJbmZvLCBUaHJvd2FibGUgY2F1c2UpIHsNCi0gICAgICAgIHN1cGVyKG1lc3NhZ2UsIGNhdXNlKTsNCi0gICAgICAgIHRoaXMuZmF1bHRJbmZvID0gZmF1bHRJbmZvOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBmYXVsdCBiZWFuOiBqYXZhLmxhbmcuU3RyaW5nDQotICAgICAqLw0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZhdWx0SW5mbygpIHsNCi0gICAgICAgIHJldHVybiBmYXVsdEluZm87DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9kb2NsaXRiYXJlbWluL0RvY0xpdEJhcmVNaW5Qb3J0VHlwZUltcGwuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvZG9jbGl0YmFyZW1pbi9Eb2NMaXRCYXJlTWluUG9ydFR5cGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlY2E2MTEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9kb2NsaXRiYXJlbWluL0RvY0xpdEJhcmVNaW5Qb3J0VHlwZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLmRvY2xpdGJhcmVtaW47DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLmRvY2xpdGJhcmVtaW4uc2VpLkRvY0xpdEJhcmVNaW5Qb3J0VHlwZTsNCi0NCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7DQotDQotLyoqDQotICogVGVzdCBEb2NMaXRCYXJlTWluUG9ydA0KLSAqLw0KLUBXZWJTZXJ2aWNlKGVuZHBvaW50SW50ZXJmYWNlPSJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5kb2NsaXRiYXJlbWluLnNlaS5Eb2NMaXRCYXJlTWluUG9ydFR5cGUiKQ0KLXB1YmxpYyBjbGFzcyBEb2NMaXRCYXJlTWluUG9ydFR5cGVJbXBsIGltcGxlbWVudHMgRG9jTGl0QmFyZU1pblBvcnRUeXBlIHsNCi0NCi0gICAgLyogDQotICAgICAqIGVjaG8NCi0gICAgICovDQotICAgIHB1YmxpYyBTdHJpbmcgZWNobyhTdHJpbmcgYWxsQnlNeXNlbGYpIHsNCi0gICAgICAgIHJldHVybiBhbGxCeU15c2VsZjsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2RvY2xpdGJhcmVtaW4vTUVUQS1JTkYvZG9jbGl0YmFyZW1pbi53c2RsIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9kb2NsaXRiYXJlbWluL01FVEEtSU5GL2RvY2xpdGJhcmVtaW4ud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZhY2NhOS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2RvY2xpdGJhcmVtaW4vTUVUQS1JTkYvZG9jbGl0YmFyZW1pbi53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi0NCi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08d3NkbDpkZWZpbml0aW9ucyB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyINCi0JeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyINCi0JeG1sbnM6dG5zPSJodHRwOi8vZG9jbGl0YmFyZW1pbi5zYW1wbGUudGVzdC5vcmciDQotCXhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9IkRvY2xpdEJhcmVNaW4iDQotCXRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2RvY2xpdGJhcmVtaW4uc2FtcGxlLnRlc3Qub3JnIj4NCi0JDQotCTx3c2RsOnR5cGVzPg0KLQkJPHhzZDpzY2hlbWENCi0JCQl0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9kb2NsaXRiYXJlbWluLnNhbXBsZS50ZXN0Lm9yZyINCi0JCQl4bWxuczp0bnM9Imh0dHA6Ly9kb2NsaXRiYXJlbWluLnNhbXBsZS50ZXN0Lm9yZyINCi0JCQl4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4NCi0JCQ0KLQkJPHhzZDplbGVtZW50IG5hbWU9IlN0cmluZyIgdHlwZT0ieHNkOnN0cmluZyIgLz4NCi0NCi0JCTwveHNkOnNjaGVtYT4NCi0JPC93c2RsOnR5cGVzPg0KLQ0KLQk8d3NkbDptZXNzYWdlIG5hbWU9IlNpbmdsZVBhcmFtIj4NCi0JCTx3c2RsOnBhcnQgbmFtZT0iYWxsQnlNeXNlbGYiIGVsZW1lbnQ9InRuczpTdHJpbmciIC8+DQotCTwvd3NkbDptZXNzYWdlPg0KLQ0KLQk8d3NkbDpwb3J0VHlwZSBuYW1lPSJEb2NMaXRCYXJlTWluUG9ydFR5cGUiPg0KLQkJDQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iZWNobyI+DQotCQkJPHdzZGw6aW5wdXQgbWVzc2FnZT0idG5zOlNpbmdsZVBhcmFtIiAvPg0KLQkJCTx3c2RsOm91dHB1dCBtZXNzYWdlPSJ0bnM6U2luZ2xlUGFyYW0iIC8+DQotCQk8L3dzZGw6b3BlcmF0aW9uPg0KLQkJCQ0KLQk8L3dzZGw6cG9ydFR5cGU+DQotCQ0KLQk8d3NkbDpiaW5kaW5nIG5hbWU9IkRvY0xpdEJhcmVNaW4iIHR5cGU9InRuczpEb2NMaXRCYXJlTWluUG9ydFR5cGUiPg0KLQkJPHNvYXA6YmluZGluZyBzdHlsZT0iZG9jdW1lbnQiIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIiAvPg0KLQkJDQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iZWNobyI+DQotCQkJPHdzZGw6aW5wdXQ+DQotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAgLz4NCi0JCQk8L3dzZGw6aW5wdXQ+DQotCQkJPHdzZGw6b3V0cHV0Pg0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgIC8+DQotCQkJPC93c2RsOm91dHB1dD4NCi0JCTwvd3NkbDpvcGVyYXRpb24+CQ0KLQkJDQotCQ0KLQk8L3dzZGw6YmluZGluZz4NCi0JDQotCTx3c2RsOnNlcnZpY2UgbmFtZT0iQmFyZURvY0xpdE1pblNlcnZpY2UiPg0KLQkJPHdzZGw6cG9ydCBiaW5kaW5nPSJ0bnM6RG9jTGl0QmFyZU1pbiIgbmFtZT0iQmFyZURvY0xpdE1pblBvcnQiPg0KLQkJCTxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6NjA2MC9heGlzMi9zZXJ2aWNlcy9CYXJlRG9jTGl0TWluU2VydmljZSIgLz4NCi0JCTwvd3NkbDpwb3J0Pg0KLQk8L3dzZGw6c2VydmljZT4NCi0JDQotPC93c2RsOmRlZmluaXRpb25zPg0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvZG9jbGl0YmFyZW1pbi9zZWkvQmFyZURvY0xpdE1pblNlcnZpY2UuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvZG9jbGl0YmFyZW1pbi9zZWkvQmFyZURvY0xpdE1pblNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWFlMmY5ZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2RvY2xpdGJhcmVtaW4vc2VpL0JhcmVEb2NMaXRNaW5TZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0NCi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5kb2NsaXRiYXJlbWluLnNlaTsNCi0NCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJFbmRwb2ludDsNCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VDbGllbnQ7DQotaW1wb3J0IGphdmEuaW8uRmlsZTsNCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLm5ldC5VUkw7DQotDQotLyoqDQotICogVGhpcyBjbGFzcyB3YXMgZ2VuZXJhdGVkIGJ5IHRoZSBKQVhXUyBTSS4NCi0gKiBKQVgtV1MgUkkgMi4wXzAxLWIxNS1mY3MNCi0gKiBHZW5lcmF0ZWQgc291cmNlIHZlcnNpb246IDIuMA0KLSAqIA0KLSAqLw0KLUBXZWJTZXJ2aWNlQ2xpZW50KG5hbWUgPSAiQmFyZURvY0xpdE1pblNlcnZpY2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy50ZXN0LnNhbXBsZS5kb2NsaXRiYXJlbWluIiwgd3NkbExvY2F0aW9uID0gImRvY2xpdGJhcmVtaW4ud3NkbCIpDQotcHVibGljIGNsYXNzIEJhcmVEb2NMaXRNaW5TZXJ2aWNlDQotICAgIGV4dGVuZHMgU2VydmljZQ0KLXsNCi0NCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgVVJMIEJBUkVET0NMSVRNSU5TRVJWSUNFX1dTRExfTE9DQVRJT047DQotDQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyB3c2RsTG9jYXRpb249Ii90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2RvY2xpdGJhcmVtaW4vTUVUQS1JTkYvZG9jbGl0YmFyZW1pbi53c2RsIjsNCi0gICAgc3RhdGljIHsNCi0gICAgICAgIFVSTCB1cmwgPSBudWxsOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgIAl0cnl7DQotCSAgICAgICAgCVN0cmluZyBiYXNlRGlyID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJiYXNlZGlyIiwiLiIpKS5nZXRDYW5vbmljYWxQYXRoKCk7DQotCSAgICAgICAgCXdzZGxMb2NhdGlvbiA9IG5ldyBGaWxlKGJhc2VEaXIgKyB3c2RsTG9jYXRpb24pLmdldEFic29sdXRlUGF0aCgpOw0KLSAgICAgICAgCX1jYXRjaChFeGNlcHRpb24gZSl7DQotICAgICAgICAJCWUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAJfQ0KLSAgICAgICAgCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHdzZGxMb2NhdGlvbik7DQotICAgICAgICAJdXJsID0gZmlsZS50b1VSTCgpOw0KLSAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgQkFSRURPQ0xJVE1JTlNFUlZJQ0VfV1NETF9MT0NBVElPTiA9IHVybDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQmFyZURvY0xpdE1pblNlcnZpY2UoVVJMIHdzZGxMb2NhdGlvbiwgUU5hbWUgc2VydmljZU5hbWUpIHsNCi0gICAgICAgIHN1cGVyKHdzZGxMb2NhdGlvbiwgc2VydmljZU5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBCYXJlRG9jTGl0TWluU2VydmljZSgpIHsNCi0gICAgICAgIHN1cGVyKEJBUkVET0NMSVRNSU5TRVJWSUNFX1dTRExfTE9DQVRJT04sIG5ldyBRTmFtZSgiaHR0cDovL2RvY2xpdGJhcmVtaW4uc2FtcGxlLnRlc3Qub3JnIiwgIkJhcmVEb2NMaXRNaW5TZXJ2aWNlIikpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBEb2NMaXRCYXJlUG9ydFR5cGUNCi0gICAgICovDQotICAgIEBXZWJFbmRwb2ludChuYW1lID0gIkJhcmVEb2NMaXRNaW5Qb3J0IikNCi0gICAgcHVibGljIERvY0xpdEJhcmVNaW5Qb3J0VHlwZSBnZXRCYXJlRG9jTGl0TWluUG9ydCgpIHsNCi0gICAgICAgIHJldHVybiAoRG9jTGl0QmFyZU1pblBvcnRUeXBlKXN1cGVyLmdldFBvcnQobmV3IFFOYW1lKCJodHRwOi8vZG9jbGl0YmFyZW1pbi5zYW1wbGUudGVzdC5vcmciLCAiQmFyZURvY0xpdE1pblBvcnQiKSwgRG9jTGl0QmFyZU1pblBvcnRUeXBlLmNsYXNzKTsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2RvY2xpdGJhcmVtaW4vc2VpL0RvY0xpdEJhcmVNaW5Qb3J0VHlwZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9kb2NsaXRiYXJlbWluL3NlaS9Eb2NMaXRCYXJlTWluUG9ydFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTE4NTJmNC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2RvY2xpdGJhcmVtaW4vc2VpL0RvY0xpdEJhcmVNaW5Qb3J0VHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotDQotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuZG9jbGl0YmFyZW1pbi5zZWk7DQotDQotaW1wb3J0IGphdmF4Lmp3cy5XZWJNZXRob2Q7DQotaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbTsNCi1pbXBvcnQgamF2YXguandzLldlYlJlc3VsdDsNCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7DQotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nOw0KLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5QYXJhbWV0ZXJTdHlsZTsNCi0NCi0NCi0NCi0vKioNCi0gKiBUZXN0cyBkb2MvbGl0IGJhcmUgbWluaW1hbA0KLSAqIChNaW5pbWFsIGluZGljYXRlcyB0aGF0IG5vIE9iamVjdEZhY3RvcnkgaXMgYXZhaWxhYmxlIHRvIGRvIHRoZSBwYXJhbWV0ZXIgbWFyc2hhbGxpbmcvZGVtYXJzaGFsbGluZykNCi0gKiANCi0gKi8NCi1AV2ViU2VydmljZShuYW1lID0gIkRvY0xpdEJhcmVNaW5Qb3J0VHlwZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vZG9jbGl0YmFyZW1pbi5zYW1wbGUudGVzdC5vcmciKQ0KLUBTT0FQQmluZGluZyhwYXJhbWV0ZXJTdHlsZSA9IFBhcmFtZXRlclN0eWxlLkJBUkUpDQotcHVibGljIGludGVyZmFjZSBEb2NMaXRCYXJlTWluUG9ydFR5cGUgew0KLQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIGVjaG8NCi0gICAgICogQHBhcmFtIGFsbEJ5TXlzZWxmDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgamF2YS5sYW5nLlN0cmluZw0KLSAgICAgKi8NCi0gICAgQFdlYk1ldGhvZA0KLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAiU3RyaW5nIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9kb2NsaXRiYXJlbWluLnNhbXBsZS50ZXN0Lm9yZyIsIHBhcnROYW1lID0gImFsbEJ5TXlzZWxmIikNCi0gICAgcHVibGljIFN0cmluZyBlY2hvKA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiU3RyaW5nIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9kb2NsaXRiYXJlbWluLnNhbXBsZS50ZXN0Lm9yZyIsIHBhcnROYW1lID0gImFsbEJ5TXlzZWxmIikNCi0gICAgICAgIFN0cmluZyBhbGxCeU15c2VsZik7DQotICAgICAgICANCi0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9mYXVsdHMvRmF1bHR5V2ViU2VydmljZUZhdWx0X0V4Y2VwdGlvbi5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9mYXVsdHMvRmF1bHR5V2ViU2VydmljZUZhdWx0X0V4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjZjNDg4Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvZmF1bHRzL0ZhdWx0eVdlYlNlcnZpY2VGYXVsdF9FeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLQ0KLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLmZhdWx0czsNCi0NCi1pbXBvcnQgb3JnLnRlc3QuZmF1bHRzLkZhdWx0eVdlYlNlcnZpY2VGYXVsdDsNCi0NCi0vKioNCi0gKiBUaGlzIGNsYXNzIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIEpBWFdTIFNJLg0KLSAqIEpBWC1XUyBSSSAyLjBfMDEtYjE1LWZjcw0KLSAqIEdlbmVyYXRlZCBzb3VyY2UgdmVyc2lvbjogMi4wDQotICogDQotICovDQotLy8gYW5ub3RhdGlvbiBpcyBjb21tZW50ZWQgYXMgcGFydCBvZiB0aGUgdGVzdCB0byBtYWtlIHN1cmUgZGVmYXVsdHMgYXJlIHVzZWQNCi0vL0BXZWJGYXVsdChmYXVsdEJlYW49Im9yZy50ZXN0LmZhdWx0cy5GYXVsdHlXZWJTZXJ2aWNlRmF1bHQiLCBuYW1lID0gIkZhdWx0eVdlYlNlcnZpY2VGYXVsdCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL3Rlc3QvZmF1bHRzIikNCi1wdWJsaWMgY2xhc3MgRmF1bHR5V2ViU2VydmljZUZhdWx0X0V4Y2VwdGlvbg0KLSAgICBleHRlbmRzIEV4Y2VwdGlvbg0KLXsNCi0NCi0gICAgLyoqDQotICAgICAqIEphdmEgdHlwZSB0aGF0IGdvZXMgYXMgc29hcGVudjpGYXVsdCBkZXRhaWwgZWxlbWVudC4NCi0gICAgICogDQotICAgICAqLw0KLSAgICBwcml2YXRlIEZhdWx0eVdlYlNlcnZpY2VGYXVsdCBmYXVsdEluZm87DQotICAgIA0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSBmYXVsdEluZm8NCi0gICAgICogQHBhcmFtIG1lc3NhZ2UNCi0gICAgICovDQotICAgIHB1YmxpYyBGYXVsdHlXZWJTZXJ2aWNlRmF1bHRfRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBGYXVsdHlXZWJTZXJ2aWNlRmF1bHQgZmF1bHRJbmZvKSB7DQotICAgICAgICBzdXBlcihtZXNzYWdlKTsNCi0gICAgICAgIHRoaXMuZmF1bHRJbmZvID0gZmF1bHRJbmZvOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGZhdWx0SW5mbw0KLSAgICAgKiBAcGFyYW0gbWVzc2FnZQ0KLSAgICAgKiBAcGFyYW0gY2F1c2UNCi0gICAgICovDQotICAgIHB1YmxpYyBGYXVsdHlXZWJTZXJ2aWNlRmF1bHRfRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBGYXVsdHlXZWJTZXJ2aWNlRmF1bHQgZmF1bHRJbmZvLCBUaHJvd2FibGUgY2F1c2UpIHsNCi0gICAgICAgIHN1cGVyKG1lc3NhZ2UsIGNhdXNlKTsNCi0gICAgICAgIHRoaXMuZmF1bHRJbmZvID0gZmF1bHRJbmZvOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBmYXVsdCBiZWFuOiBkdWtlLm9yZy5GYXVsdHlXZWJTZXJ2aWNlRmF1bHQNCi0gICAgICovDQotICAgIHB1YmxpYyBGYXVsdHlXZWJTZXJ2aWNlRmF1bHQgZ2V0RmF1bHRJbmZvKCkgew0KLSAgICAgICAgcmV0dXJuIGZhdWx0SW5mbzsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2ZhdWx0cy9GYXVsdHlXZWJTZXJ2aWNlUG9ydFR5cGUuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvZmF1bHRzL0ZhdWx0eVdlYlNlcnZpY2VQb3J0VHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjg3YmM0Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvZmF1bHRzL0ZhdWx0eVdlYlNlcnZpY2VQb3J0VHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotDQotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuZmF1bHRzOw0KLQ0KLWltcG9ydCBvcmcudGVzdC5mYXVsdHMuRmF1bHR5V2ViU2VydmljZVJlc3BvbnNlOw0KLQ0KLWltcG9ydCBqYXZheC5qd3MuV2ViTWV0aG9kOw0KLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW07DQotaW1wb3J0IGphdmF4Lmp3cy5XZWJSZXN1bHQ7DQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuQXN5bmNIYW5kbGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuUmVxdWVzdFdyYXBwZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5SZXNwb25zZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLlJlc3BvbnNlV3JhcHBlcjsNCi1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOw0KLQ0KLUBXZWJTZXJ2aWNlKG5hbWUgPSAiRmF1bHR5V2ViU2VydmljZVBvcnRUeXBlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9mYXVsdHMiKQ0KLXB1YmxpYyBpbnRlcmZhY2UgRmF1bHR5V2ViU2VydmljZVBvcnRUeXBlIHsNCi0NCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gYXJnMQ0KLSAgICAgKiBAcGFyYW0gYXJnMA0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIGludA0KLSAgICAgKiBAdGhyb3dzIEZhdWx0eVdlYlNlcnZpY2VGYXVsdF9FeGNlcHRpb24NCi0gICAgICovDQotICAgIEBXZWJNZXRob2QNCi0gICAgQFdlYlJlc3VsdCh0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L2ZhdWx0cyIpDQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAiZmF1bHR5V2ViU2VydmljZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL3Rlc3QvZmF1bHRzIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LmZhdWx0cy5GYXVsdHlXZWJTZXJ2aWNlIikNCi0gICAgQFJlc3BvbnNlV3JhcHBlcihsb2NhbE5hbWUgPSAiZmF1bHR5V2ViU2VydmljZVJlc3BvbnNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9mYXVsdHMiLCBjbGFzc05hbWUgPSAib3JnLnRlc3QuZmF1bHRzLkZhdWx0eVdlYlNlcnZpY2VSZXNwb25zZSIpDQotICAgIHB1YmxpYyBpbnQgZmF1bHR5V2ViU2VydmljZSgNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImFyZzAiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L2ZhdWx0cyIpDQotICAgICAgICBpbnQgYXJnMCkNCi0gICAgICAgIHRocm93cyBGYXVsdHlXZWJTZXJ2aWNlRmF1bHRfRXhjZXB0aW9uDQotICAgIDsNCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGFzeW5jSGFuZGxlcg0KLSAgICAgKiBAcGFyYW0gYXJnMA0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTw/IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdD4NCi0gICAgICovDQotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJmYXVsdHlXZWJTZXJ2aWNlIikNCi0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJmYXVsdHlXZWJTZXJ2aWNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9mYXVsdHMiLCBjbGFzc05hbWUgPSAib3JnLnRlc3QuZmF1bHRzLkZhdWx0eVdlYlNlcnZpY2UiKQ0KLSAgICBAUmVzcG9uc2VXcmFwcGVyKGxvY2FsTmFtZSA9ICJmYXVsdHlXZWJTZXJ2aWNlUmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L2ZhdWx0cyIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5mYXVsdHMuRmF1bHR5V2ViU2VydmljZVJlc3BvbnNlIikNCi0gICAgcHVibGljIEZ1dHVyZTw/PiBmYXVsdHlXZWJTZXJ2aWNlQXN5bmMoDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJhcmcwIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9mYXVsdHMiKQ0KLSAgICAgICAgaW50IGFyZzAsDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJhc3luY0hhbmRsZXIiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikNCi0gICAgICAgIEFzeW5jSGFuZGxlcjxGYXVsdHlXZWJTZXJ2aWNlUmVzcG9uc2U+IGFzeW5jSGFuZGxlcik7DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGFyZzANCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBqYXZheC54bWwud3MuUmVzcG9uc2U8b3JnLnRlc3QuZmF1bHRzLkZhdWx0eVdlYlNlcnZpY2VSZXNwb25zZT4NCi0gICAgICovDQotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJmYXVsdHlXZWJTZXJ2aWNlIikNCi0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJmYXVsdHlXZWJTZXJ2aWNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9mYXVsdHMiLCBjbGFzc05hbWUgPSAib3JnLnRlc3QuZmF1bHRzLkZhdWx0eVdlYlNlcnZpY2UiKQ0KLSAgICBAUmVzcG9uc2VXcmFwcGVyKGxvY2FsTmFtZSA9ICJmYXVsdHlXZWJTZXJ2aWNlUmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L2ZhdWx0cyIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5mYXVsdHMuRmF1bHR5V2ViU2VydmljZVJlc3BvbnNlIikNCi0gICAgcHVibGljIFJlc3BvbnNlPEZhdWx0eVdlYlNlcnZpY2VSZXNwb25zZT4gZmF1bHR5V2ViU2VydmljZUFzeW5jKA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiYXJnMCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL3Rlc3QvZmF1bHRzIikNCi0gICAgICAgIGludCBhcmcwKTsNCi0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9mYXVsdHMvRmF1bHR5V2ViU2VydmljZVBvcnRUeXBlSW1wbC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9mYXVsdHMvRmF1bHR5V2ViU2VydmljZVBvcnRUeXBlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjZiZGQ3Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvZmF1bHRzL0ZhdWx0eVdlYlNlcnZpY2VQb3J0VHlwZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi0vKioNCi0gKiANCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLmZhdWx0czsNCi0NCi1pbXBvcnQgb3JnLnRlc3QuZmF1bHRzLkZhdWx0eVdlYlNlcnZpY2VGYXVsdDsNCi1pbXBvcnQgb3JnLnRlc3QuZmF1bHRzLkZhdWx0eVdlYlNlcnZpY2VSZXNwb25zZTsNCi0NCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5Bc3luY0hhbmRsZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5SZXNwb25zZTsNCi1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOw0KLQ0KLUBXZWJTZXJ2aWNlKHNlcnZpY2VOYW1lPSJGYXVsdHlXZWJTZXJ2aWNlU2VydmljZSIsDQotCQkJZW5kcG9pbnRJbnRlcmZhY2U9Im9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLmZhdWx0cy5GYXVsdHlXZWJTZXJ2aWNlUG9ydFR5cGUiKQ0KLQkJCXB1YmxpYyBjbGFzcyBGYXVsdHlXZWJTZXJ2aWNlUG9ydFR5cGVJbXBsIHsNCi0NCi0gICAgLyogKG5vbi1KYXZhZG9jKQ0KLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLmZhdWx0cy5GYXVsdHlXZWJTZXJ2aWNlUG9ydFR5cGUjZmF1bHR5V2ViU2VydmljZShpbnQpDQotICAgICAqLw0KLSAgICBwdWJsaWMgaW50IGZhdWx0eVdlYlNlcnZpY2UoaW50IGFyZzApIHRocm93cyBGYXVsdHlXZWJTZXJ2aWNlRmF1bHRfRXhjZXB0aW9uIHsNCi0NCi0gICAgICAgIEZhdWx0eVdlYlNlcnZpY2VGYXVsdCBiZWFuID0gbmV3IEZhdWx0eVdlYlNlcnZpY2VGYXVsdCgpOw0KLSAgICAgICAgYmVhbi5zZXRGYXVsdEluZm8oImJlYW4gY3VzdG9tIGZhdWx0IGluZm8iKTsNCi0gICAgICAgIGJlYW4uc2V0TWVzc2FnZSgiYmVhbiBjdXN0b20gbWVzc2FnZSIpOw0KLQ0KLSAgICAgICAgdGhyb3cgbmV3IEZhdWx0eVdlYlNlcnZpY2VGYXVsdF9FeGNlcHRpb24oImN1c3RvbSBleGNlcHRpb24iLCBiZWFuKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgRnV0dXJlPD8+IGZhdWx0eVdlYlNlcnZpY2VBc3luYyhpbnQgYXJnMCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXN5bmNIYW5kbGVyPEZhdWx0eVdlYlNlcnZpY2VSZXNwb25zZT4gYXN5bmNIYW5kbGVyKSB7DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLQ0KLSAgICBwdWJsaWMgUmVzcG9uc2U8RmF1bHR5V2ViU2VydmljZVJlc3BvbnNlPiBmYXVsdHlXZWJTZXJ2aWNlQXN5bmMoaW50IGFyZzApIHsNCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotDQotDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvZmF1bHRzL0ZhdWx0eVdlYlNlcnZpY2VTZXJ2aWNlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2ZhdWx0cy9GYXVsdHlXZWJTZXJ2aWNlU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODNkNDkxLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvZmF1bHRzL0ZhdWx0eVdlYlNlcnZpY2VTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0NCi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5mYXVsdHM7DQotDQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViRW5kcG9pbnQ7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlQ2xpZW50Ow0KLWltcG9ydCBqYXZhLmlvLkZpbGU7DQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLQ0KLS8qKg0KLSAqIFRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBieSB0aGUgSkFYV1MgU0kuDQotICogSkFYLVdTIFJJIDIuMF8wMS1iMTUtZmNzDQotICogR2VuZXJhdGVkIHNvdXJjZSB2ZXJzaW9uOiAyLjANCi0gKiANCi0gKi8NCi1AV2ViU2VydmljZUNsaWVudChuYW1lID0gIkZhdWx0eVdlYlNlcnZpY2VTZXJ2aWNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9mYXVsdHMiLCB3c2RsTG9jYXRpb24gPSAiRmF1bHR5V2ViU2VydmljZTEud3NkbCIpDQotcHVibGljIGNsYXNzIEZhdWx0eVdlYlNlcnZpY2VTZXJ2aWNlDQotICAgIGV4dGVuZHMgU2VydmljZQ0KLXsNCi0NCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgVVJMIEZBVUxUWVdFQlNFUlZJQ0VTRVJWSUNFX1dTRExfTE9DQVRJT047DQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyB3c2RsTG9jYXRpb249Ii90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2ZhdWx0cy9NRVRBLUlORi9GYXVsdHlXZWJTZXJ2aWNlLndzZGwiOw0KLSAgICBzdGF0aWMgew0KLSAgICAgICAgVVJMIHVybCA9IG51bGw7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgCXRyeXsNCi0JICAgICAgICAJU3RyaW5nIGJhc2VEaXIgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoImJhc2VkaXIiLCIuIikpLmdldENhbm9uaWNhbFBhdGgoKTsNCi0JICAgICAgICAJd3NkbExvY2F0aW9uID0gbmV3IEZpbGUoYmFzZURpciArIHdzZGxMb2NhdGlvbikuZ2V0QWJzb2x1dGVQYXRoKCk7DQotICAgICAgICAJfWNhdGNoKEV4Y2VwdGlvbiBlKXsNCi0gICAgICAgIAkJZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgIAl9DQotICAgICAgICAJRmlsZSBmaWxlID0gbmV3IEZpbGUod3NkbExvY2F0aW9uKTsNCi0gICAgICAgIAl1cmwgPSBmaWxlLnRvVVJMKCk7DQotICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICB9DQotICAgICAgICBGQVVMVFlXRUJTRVJWSUNFU0VSVklDRV9XU0RMX0xPQ0FUSU9OID0gdXJsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBGYXVsdHlXZWJTZXJ2aWNlU2VydmljZShVUkwgd3NkbExvY2F0aW9uLCBRTmFtZSBzZXJ2aWNlTmFtZSkgew0KLSAgICAgICAgc3VwZXIod3NkbExvY2F0aW9uLCBzZXJ2aWNlTmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEZhdWx0eVdlYlNlcnZpY2VTZXJ2aWNlKCkgew0KLSAgICAgICAgc3VwZXIoRkFVTFRZV0VCU0VSVklDRVNFUlZJQ0VfV1NETF9MT0NBVElPTiwgbmV3IFFOYW1lKCJodHRwOi8vb3JnL3Rlc3QvZmF1bHRzIiwgIkZhdWx0eVdlYlNlcnZpY2VTZXJ2aWNlIikpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBGYXVsdHlXZWJTZXJ2aWNlUG9ydFR5cGUNCi0gICAgICovDQotICAgIEBXZWJFbmRwb2ludChuYW1lID0gIkZhdWx0eVdlYlNlcnZpY2VQb3J0IikNCi0gICAgcHVibGljIEZhdWx0eVdlYlNlcnZpY2VQb3J0VHlwZSBnZXRGYXVsdHlXZWJTZXJ2aWNlUG9ydCgpIHsNCi0gICAgICAgIHJldHVybiAoRmF1bHR5V2ViU2VydmljZVBvcnRUeXBlKXN1cGVyLmdldFBvcnQobmV3IFFOYW1lKCJodHRwOi8vb3JnL3Rlc3QvZmF1bHRzIiwgIkZhdWx0eVdlYlNlcnZpY2VQb3J0IiksIEZhdWx0eVdlYlNlcnZpY2VQb3J0VHlwZS5jbGFzcyk7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9mYXVsdHMvTUVUQS1JTkYvRmF1bHR5V2ViU2VydmljZS53c2RsIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9mYXVsdHMvTUVUQS1JTkYvRmF1bHR5V2ViU2VydmljZS53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGFiZTlhLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvZmF1bHRzL01FVEEtSU5GL0ZhdWx0eVdlYlNlcnZpY2Uud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLQ0KLQ0KLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLQ0KLTxkZWZpbml0aW9ucyBuYW1lPSJGYXVsdHlXZWJTZXJ2aWNlIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9vcmcvdGVzdC9mYXVsdHMiDQotCXhtbG5zOnRucz0iaHR0cDovL29yZy90ZXN0L2ZhdWx0cyIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIg0KLQl4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIg0KLQl4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIj4NCi0NCi0NCi0JPHR5cGVzPg0KLQkJPHhzZDpzY2hlbWEgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIg0KLQkJCWVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9vcmcvdGVzdC9mYXVsdHMiPg0KLQkJCTxlbGVtZW50IG5hbWU9ImZhdWx0eVdlYlNlcnZpY2VSZXNwb25zZSI+DQotCQkJCTxjb21wbGV4VHlwZT4NCi0JCQkJCTxzZXF1ZW5jZT4NCi0JCQkJCQk8ZWxlbWVudCBuYW1lPSJyZXR1cm4iIHR5cGU9InhzZDppbnQiIC8+DQotCQkJCQk8L3NlcXVlbmNlPg0KLQkJCQk8L2NvbXBsZXhUeXBlPg0KLQkJCTwvZWxlbWVudD4NCi0NCi0JCQk8ZWxlbWVudCBuYW1lPSJmYXVsdHlXZWJTZXJ2aWNlIj4NCi0JCQkJPGNvbXBsZXhUeXBlPg0KLQkJCQkJPHNlcXVlbmNlPg0KLQkJCQkJCTxlbGVtZW50IG5hbWU9ImFyZzAiIHR5cGU9InhzZDppbnQiIC8+DQotCQkJCQk8L3NlcXVlbmNlPg0KLQkJCQk8L2NvbXBsZXhUeXBlPg0KLQkJCTwvZWxlbWVudD4NCi0NCi0JCQk8ZWxlbWVudCBuYW1lPSJGYXVsdHlXZWJTZXJ2aWNlRmF1bHQiPg0KLQkJCQk8Y29tcGxleFR5cGU+DQotCQkJCQk8c2VxdWVuY2U+DQotCQkJCQkJPGVsZW1lbnQgbmFtZT0iZmF1bHRJbmZvIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPg0KLQkJCQkJCTxlbGVtZW50IG5hbWU9Im1lc3NhZ2UiIHR5cGU9InhzZDpzdHJpbmciIC8+DQotCQkJCQk8L3NlcXVlbmNlPg0KLQkJCQk8L2NvbXBsZXhUeXBlPg0KLQkJCTwvZWxlbWVudD4NCi0NCi0JCTwveHNkOnNjaGVtYT4NCi0JPC90eXBlcz4NCi0NCi0JPG1lc3NhZ2UgbmFtZT0iZmF1bHR5V2ViU2VydmljZSI+DQotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJ0bnM6ZmF1bHR5V2ViU2VydmljZSIgLz4NCi0JPC9tZXNzYWdlPg0KLQk8bWVzc2FnZSBuYW1lPSJmYXVsdHlXZWJTZXJ2aWNlUmVzcG9uc2UiPg0KLQkJPHBhcnQgbmFtZT0icmVzdWx0IiBlbGVtZW50PSJ0bnM6ZmF1bHR5V2ViU2VydmljZVJlc3BvbnNlIiAvPg0KLQk8L21lc3NhZ2U+DQotCTxtZXNzYWdlIG5hbWU9ImZhdWx0eVdlYlNlcnZpY2VGYXVsdCI+DQotCQk8cGFydCBuYW1lPSJGYXVsdHlXZWJTZXJ2aWNlRmF1bHQiIGVsZW1lbnQ9InRuczpGYXVsdHlXZWJTZXJ2aWNlRmF1bHQiIC8+DQotCTwvbWVzc2FnZT4NCi0NCi0JPHBvcnRUeXBlIG5hbWU9IkZhdWx0eVdlYlNlcnZpY2VQb3J0VHlwZSI+DQotCQk8b3BlcmF0aW9uIG5hbWU9ImZhdWx0eVdlYlNlcnZpY2UiPg0KLQkJCTxpbnB1dCBtZXNzYWdlPSJ0bnM6ZmF1bHR5V2ViU2VydmljZSIgbmFtZT0iYWRkIiAvPg0KLQkJCTxvdXRwdXQgbWVzc2FnZT0idG5zOmZhdWx0eVdlYlNlcnZpY2VSZXNwb25zZSIgbmFtZT0iZmF1bHR5V1NSZXNwb25zZSIgLz4NCi0JCQk8ZmF1bHQgbmFtZT0iZmF1bHR5V2ViU2VydmljZUZhdWx0IiBtZXNzYWdlPSJ0bnM6ZmF1bHR5V2ViU2VydmljZUZhdWx0IiAvPg0KLQkJPC9vcGVyYXRpb24+DQotCTwvcG9ydFR5cGU+DQotCTxiaW5kaW5nIG5hbWU9IkZhdWx0eVdlYlNlcnZpY2VCaW5kaW5nIiB0eXBlPSJ0bnM6RmF1bHR5V2ViU2VydmljZVBvcnRUeXBlIj4NCi0JCTxzb2FwOmJpbmRpbmcgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiDQotCQkJc3R5bGU9ImRvY3VtZW50IiAvPg0KLQkJPG9wZXJhdGlvbiBuYW1lPSJmYXVsdHlXZWJTZXJ2aWNlIj4NCi0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIiAvPg0KLQkJCTxpbnB1dD4NCi0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+DQotCQkJPC9pbnB1dD4NCi0JCQk8b3V0cHV0Pg0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0JCQk8L291dHB1dD4NCi0JCQk8ZmF1bHQgbmFtZT0iZmF1bHR5V2ViU2VydmljZUZhdWx0Ij4NCi0JCQkJPHNvYXA6ZmF1bHQgbmFtZT0iZmF1bHR5V2ViU2VydmljZUZhdWx0IiB1c2U9ImxpdGVyYWwiIC8+DQotCQkJPC9mYXVsdD4NCi0JCTwvb3BlcmF0aW9uPg0KLQk8L2JpbmRpbmc+DQotCTxzZXJ2aWNlIG5hbWU9IkZhdWx0eVdlYlNlcnZpY2VTZXJ2aWNlIj4NCi0JCTxwb3J0IG5hbWU9IkZhdWx0eVdlYlNlcnZpY2VQb3J0IiBiaW5kaW5nPSJ0bnM6RmF1bHR5V2ViU2VydmljZUJpbmRpbmciPg0KLQkJCTxzb2FwOmFkZHJlc3MNCi0JCQkJbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6OTA4MC9GYXVsdHlXZWJTZXJ2aWNlL0ZhdWx0eVdlYlNlcnZpY2VJbXBsU2VydmljZSIgLz4NCi0JCTwvcG9ydD4NCi0JPC9zZXJ2aWNlPg0KLTwvZGVmaW5pdGlvbnM+DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9mYXVsdHNzZXJ2aWNlL0Jhc2VGYXVsdF9FeGNlcHRpb24uamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvZmF1bHRzc2VydmljZS9CYXNlRmF1bHRfRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlMjY5MjYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9mYXVsdHNzZXJ2aWNlL0Jhc2VGYXVsdF9FeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLQ0KLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLmZhdWx0c3NlcnZpY2U7DQotDQotaW1wb3J0IG9yZy50ZXN0LnBvbHltb3JwaGljZmF1bHRzLkJhc2VGYXVsdDsNCi0NCi1pbXBvcnQgamF2YXgueG1sLndzLldlYkZhdWx0Ow0KLQ0KLS8qKg0KLSAqIFRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBieSB0aGUgSkFYV1MgU0kuDQotICogSkFYLVdTIFJJIDIuMF8wMS1iMTUtZmNzDQotICogR2VuZXJhdGVkIHNvdXJjZSB2ZXJzaW9uOiAyLjANCi0gKiANCi0gKi8NCi1AV2ViRmF1bHQobmFtZSA9ICJCYXNlRmF1bHQiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L3BvbHltb3JwaGljZmF1bHRzIikNCi1wdWJsaWMgY2xhc3MgQmFzZUZhdWx0X0V4Y2VwdGlvbg0KLSAgICBleHRlbmRzIEV4Y2VwdGlvbg0KLXsNCi0NCi0gICAgLyoqDQotICAgICAqIEphdmEgdHlwZSB0aGF0IGdvZXMgYXMgc29hcGVudjpGYXVsdCBkZXRhaWwgZWxlbWVudC4NCi0gICAgICogDQotICAgICAqLw0KLSAgICBwcml2YXRlIEJhc2VGYXVsdCBmYXVsdEluZm87DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIG1lc3NhZ2UNCi0gICAgICogQHBhcmFtIGZhdWx0SW5mbw0KLSAgICAgKi8NCi0gICAgcHVibGljIEJhc2VGYXVsdF9FeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIEJhc2VGYXVsdCBmYXVsdEluZm8pIHsNCi0gICAgICAgIHN1cGVyKG1lc3NhZ2UpOw0KLSAgICAgICAgdGhpcy5mYXVsdEluZm8gPSBmYXVsdEluZm87DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gY2F1c2UNCi0gICAgICogQHBhcmFtIG1lc3NhZ2UNCi0gICAgICogQHBhcmFtIGZhdWx0SW5mbw0KLSAgICAgKi8NCi0gICAgcHVibGljIEJhc2VGYXVsdF9FeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIEJhc2VGYXVsdCBmYXVsdEluZm8sIFRocm93YWJsZSBjYXVzZSkgew0KLSAgICAgICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpOw0KLSAgICAgICAgdGhpcy5mYXVsdEluZm8gPSBmYXVsdEluZm87DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIGZhdWx0IGJlYW46IG9yZy50ZXN0LnBvbHltb3JwaGljZmF1bHRzLkJhc2VGYXVsdA0KLSAgICAgKi8NCi0gICAgcHVibGljIEJhc2VGYXVsdCBnZXRGYXVsdEluZm8oKSB7DQotICAgICAgICByZXR1cm4gZmF1bHRJbmZvOw0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvZmF1bHRzc2VydmljZS9Db21wbGV4RmF1bHRfRXhjZXB0aW9uLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2ZhdWx0c3NlcnZpY2UvQ29tcGxleEZhdWx0X0V4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODg5OGUwLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvZmF1bHRzc2VydmljZS9Db21wbGV4RmF1bHRfRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0NCi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5mYXVsdHNzZXJ2aWNlOw0KLQ0KLWltcG9ydCBvcmcudGVzdC5wb2x5bW9ycGhpY2ZhdWx0cy5Db21wbGV4RmF1bHQ7DQotDQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJGYXVsdDsNCi0NCi0vKioNCi0gKiBUaGlzIGNsYXNzIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIEpBWFdTIFNJLg0KLSAqIEpBWC1XUyBSSSAyLjBfMDEtYjE1LWZjcw0KLSAqIEdlbmVyYXRlZCBzb3VyY2UgdmVyc2lvbjogMi4wDQotICogDQotICovDQotQFdlYkZhdWx0KG5hbWUgPSAiQ29tcGxleEZhdWx0IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9wb2x5bW9ycGhpY2ZhdWx0cyIpDQotcHVibGljIGNsYXNzIENvbXBsZXhGYXVsdF9FeGNlcHRpb24NCi0gICAgZXh0ZW5kcyBFeGNlcHRpb24NCi17DQotDQotICAgIC8qKg0KLSAgICAgKiBKYXZhIHR5cGUgdGhhdCBnb2VzIGFzIHNvYXBlbnY6RmF1bHQgZGV0YWlsIGVsZW1lbnQuDQotICAgICAqIA0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBDb21wbGV4RmF1bHQgZmF1bHRJbmZvOw0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSBtZXNzYWdlDQotICAgICAqIEBwYXJhbSBmYXVsdEluZm8NCi0gICAgICovDQotICAgIHB1YmxpYyBDb21wbGV4RmF1bHRfRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBDb21wbGV4RmF1bHQgZmF1bHRJbmZvKSB7DQotICAgICAgICBzdXBlcihtZXNzYWdlKTsNCi0gICAgICAgIHRoaXMuZmF1bHRJbmZvID0gZmF1bHRJbmZvOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGNhdXNlDQotICAgICAqIEBwYXJhbSBtZXNzYWdlDQotICAgICAqIEBwYXJhbSBmYXVsdEluZm8NCi0gICAgICovDQotICAgIHB1YmxpYyBDb21wbGV4RmF1bHRfRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBDb21wbGV4RmF1bHQgZmF1bHRJbmZvLCBUaHJvd2FibGUgY2F1c2UpIHsNCi0gICAgICAgIHN1cGVyKG1lc3NhZ2UsIGNhdXNlKTsNCi0gICAgICAgIHRoaXMuZmF1bHRJbmZvID0gZmF1bHRJbmZvOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBmYXVsdCBiZWFuOiBvcmcudGVzdC5wb2x5bW9ycGhpY2ZhdWx0cy5Db21wbGV4RmF1bHQNCi0gICAgICovDQotICAgIHB1YmxpYyBDb21wbGV4RmF1bHQgZ2V0RmF1bHRJbmZvKCkgew0KLSAgICAgICAgcmV0dXJuIGZhdWx0SW5mbzsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2ZhdWx0c3NlcnZpY2UvRGVyaXZlZEZhdWx0MV9FeGNlcHRpb24uamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvZmF1bHRzc2VydmljZS9EZXJpdmVkRmF1bHQxX0V4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjFiZmRjLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvZmF1bHRzc2VydmljZS9EZXJpdmVkRmF1bHQxX0V4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotDQotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuZmF1bHRzc2VydmljZTsNCi0NCi1pbXBvcnQgb3JnLnRlc3QucG9seW1vcnBoaWNmYXVsdHMuRGVyaXZlZEZhdWx0MTsNCi0NCi1pbXBvcnQgamF2YXgueG1sLndzLldlYkZhdWx0Ow0KLQ0KLS8qKg0KLSAqIFRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBieSB0aGUgSkFYV1MgU0kuDQotICogSkFYLVdTIFJJIDIuMF8wMS1iMTUtZmNzDQotICogR2VuZXJhdGVkIHNvdXJjZSB2ZXJzaW9uOiAyLjANCi0gKiANCi0gKi8NCi1AV2ViRmF1bHQobmFtZSA9ICJEZXJpdmVkRmF1bHQxIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9wb2x5bW9ycGhpY2ZhdWx0cyIpDQotcHVibGljIGNsYXNzIERlcml2ZWRGYXVsdDFfRXhjZXB0aW9uDQotICAgIGV4dGVuZHMgRXhjZXB0aW9uDQotew0KLQ0KLSAgICAvKioNCi0gICAgICogSmF2YSB0eXBlIHRoYXQgZ29lcyBhcyBzb2FwZW52OkZhdWx0IGRldGFpbCBlbGVtZW50Lg0KLSAgICAgKiANCi0gICAgICovDQotICAgIHByaXZhdGUgRGVyaXZlZEZhdWx0MSBmYXVsdEluZm87DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIG1lc3NhZ2UNCi0gICAgICogQHBhcmFtIGZhdWx0SW5mbw0KLSAgICAgKi8NCi0gICAgcHVibGljIERlcml2ZWRGYXVsdDFfRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBEZXJpdmVkRmF1bHQxIGZhdWx0SW5mbykgew0KLSAgICAgICAgc3VwZXIobWVzc2FnZSk7DQotICAgICAgICB0aGlzLmZhdWx0SW5mbyA9IGZhdWx0SW5mbzsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSBjYXVzZQ0KLSAgICAgKiBAcGFyYW0gbWVzc2FnZQ0KLSAgICAgKiBAcGFyYW0gZmF1bHRJbmZvDQotICAgICAqLw0KLSAgICBwdWJsaWMgRGVyaXZlZEZhdWx0MV9FeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIERlcml2ZWRGYXVsdDEgZmF1bHRJbmZvLCBUaHJvd2FibGUgY2F1c2UpIHsNCi0gICAgICAgIHN1cGVyKG1lc3NhZ2UsIGNhdXNlKTsNCi0gICAgICAgIHRoaXMuZmF1bHRJbmZvID0gZmF1bHRJbmZvOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBmYXVsdCBiZWFuOiBvcmcudGVzdC5wb2x5bW9ycGhpY2ZhdWx0cy5EZXJpdmVkRmF1bHQxDQotICAgICAqLw0KLSAgICBwdWJsaWMgRGVyaXZlZEZhdWx0MSBnZXRGYXVsdEluZm8oKSB7DQotICAgICAgICByZXR1cm4gZmF1bHRJbmZvOw0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvZmF1bHRzc2VydmljZS9EZXJpdmVkRmF1bHQyX0V4Y2VwdGlvbi5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9mYXVsdHNzZXJ2aWNlL0Rlcml2ZWRGYXVsdDJfRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwYjAwOWUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9mYXVsdHNzZXJ2aWNlL0Rlcml2ZWRGYXVsdDJfRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0NCi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5mYXVsdHNzZXJ2aWNlOw0KLQ0KLWltcG9ydCBvcmcudGVzdC5wb2x5bW9ycGhpY2ZhdWx0cy5EZXJpdmVkRmF1bHQyOw0KLQ0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViRmF1bHQ7DQotDQotLyoqDQotICogVGhpcyBjbGFzcyB3YXMgZ2VuZXJhdGVkIGJ5IHRoZSBKQVhXUyBTSS4NCi0gKiBKQVgtV1MgUkkgMi4wXzAxLWIxNS1mY3MNCi0gKiBHZW5lcmF0ZWQgc291cmNlIHZlcnNpb246IDIuMA0KLSAqIA0KLSAqLw0KLUBXZWJGYXVsdChuYW1lID0gIkRlcml2ZWRGYXVsdDIiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L3BvbHltb3JwaGljZmF1bHRzIikNCi1wdWJsaWMgY2xhc3MgRGVyaXZlZEZhdWx0Ml9FeGNlcHRpb24NCi0gICAgZXh0ZW5kcyBFeGNlcHRpb24NCi17DQotDQotICAgIC8qKg0KLSAgICAgKiBKYXZhIHR5cGUgdGhhdCBnb2VzIGFzIHNvYXBlbnY6RmF1bHQgZGV0YWlsIGVsZW1lbnQuDQotICAgICAqIA0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBEZXJpdmVkRmF1bHQyIGZhdWx0SW5mbzsNCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gbWVzc2FnZQ0KLSAgICAgKiBAcGFyYW0gZmF1bHRJbmZvDQotICAgICAqLw0KLSAgICBwdWJsaWMgRGVyaXZlZEZhdWx0Ml9FeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIERlcml2ZWRGYXVsdDIgZmF1bHRJbmZvKSB7DQotICAgICAgICBzdXBlcihtZXNzYWdlKTsNCi0gICAgICAgIHRoaXMuZmF1bHRJbmZvID0gZmF1bHRJbmZvOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGNhdXNlDQotICAgICAqIEBwYXJhbSBtZXNzYWdlDQotICAgICAqIEBwYXJhbSBmYXVsdEluZm8NCi0gICAgICovDQotICAgIHB1YmxpYyBEZXJpdmVkRmF1bHQyX0V4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgRGVyaXZlZEZhdWx0MiBmYXVsdEluZm8sIFRocm93YWJsZSBjYXVzZSkgew0KLSAgICAgICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpOw0KLSAgICAgICAgdGhpcy5mYXVsdEluZm8gPSBmYXVsdEluZm87DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIGZhdWx0IGJlYW46IG9yZy50ZXN0LnBvbHltb3JwaGljZmF1bHRzLkRlcml2ZWRGYXVsdDINCi0gICAgICovDQotICAgIHB1YmxpYyBEZXJpdmVkRmF1bHQyIGdldEZhdWx0SW5mbygpIHsNCi0gICAgICAgIHJldHVybiBmYXVsdEluZm87DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9mYXVsdHNzZXJ2aWNlL0VxdWFsRmF1bHQuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvZmF1bHRzc2VydmljZS9FcXVhbEZhdWx0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2ZDQxOGQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9mYXVsdHNzZXJ2aWNlL0VxdWFsRmF1bHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLQ0KLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLmZhdWx0c3NlcnZpY2U7DQotDQotaW1wb3J0IG9yZy50ZXN0LnBvbHltb3JwaGljZmF1bHRzLkRlcml2ZWRGYXVsdDE7DQotDQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJGYXVsdDsNCi0NCi0vKioNCi0gKiBUaGlzIGNsYXNzIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIEpBWFdTIFNJLg0KLSAqIEpBWC1XUyBSSSAyLjBfMDEtYjE1LWZjcw0KLSAqIEdlbmVyYXRlZCBzb3VyY2UgdmVyc2lvbjogMi4wDQotICogDQotICovDQotQFdlYkZhdWx0KG5hbWUgPSAiRGVyaXZlZEZhdWx0MSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL3Rlc3QvcG9seW1vcnBoaWNmYXVsdHMiKQ0KLXB1YmxpYyBjbGFzcyBFcXVhbEZhdWx0DQotICAgIGV4dGVuZHMgRXhjZXB0aW9uDQotew0KLQ0KLSAgICAvKioNCi0gICAgICogSmF2YSB0eXBlIHRoYXQgZ29lcyBhcyBzb2FwZW52OkZhdWx0IGRldGFpbCBlbGVtZW50Lg0KLSAgICAgKiANCi0gICAgICovDQotICAgIHByaXZhdGUgRGVyaXZlZEZhdWx0MSBmYXVsdEluZm87DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIG1lc3NhZ2UNCi0gICAgICogQHBhcmFtIGZhdWx0SW5mbw0KLSAgICAgKi8NCi0gICAgcHVibGljIEVxdWFsRmF1bHQoU3RyaW5nIG1lc3NhZ2UsIERlcml2ZWRGYXVsdDEgZmF1bHRJbmZvKSB7DQotICAgICAgICBzdXBlcihtZXNzYWdlKTsNCi0gICAgICAgIHRoaXMuZmF1bHRJbmZvID0gZmF1bHRJbmZvOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGNhdXNlDQotICAgICAqIEBwYXJhbSBtZXNzYWdlDQotICAgICAqIEBwYXJhbSBmYXVsdEluZm8NCi0gICAgICovDQotICAgIHB1YmxpYyBFcXVhbEZhdWx0KFN0cmluZyBtZXNzYWdlLCBEZXJpdmVkRmF1bHQxIGZhdWx0SW5mbywgVGhyb3dhYmxlIGNhdXNlKSB7DQotICAgICAgICBzdXBlcihtZXNzYWdlLCBjYXVzZSk7DQotICAgICAgICB0aGlzLmZhdWx0SW5mbyA9IGZhdWx0SW5mbzsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgZmF1bHQgYmVhbjogb3JnLnRlc3QucG9seW1vcnBoaWNmYXVsdHMuRGVyaXZlZEZhdWx0MQ0KLSAgICAgKi8NCi0gICAgcHVibGljIERlcml2ZWRGYXVsdDEgZ2V0RmF1bHRJbmZvKCkgew0KLSAgICAgICAgcmV0dXJuIGZhdWx0SW5mbzsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2ZhdWx0c3NlcnZpY2UvRmF1bHRzU2VydmljZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9mYXVsdHNzZXJ2aWNlL0ZhdWx0c1NlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NlYTY5NS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2ZhdWx0c3NlcnZpY2UvRmF1bHRzU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotDQotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuZmF1bHRzc2VydmljZTsNCi0NCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJFbmRwb2ludDsNCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VDbGllbnQ7DQotaW1wb3J0IGphdmEuaW8uRmlsZTsNCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLm5ldC5VUkw7DQotDQotLyoqDQotICogVGhpcyBjbGFzcyB3YXMgZ2VuZXJhdGVkIGJ5IHRoZSBKQVhXUyBTSS4NCi0gKiBKQVgtV1MgUkkgMi4wXzAxLWIxNS1mY3MNCi0gKiBHZW5lcmF0ZWQgc291cmNlIHZlcnNpb246IDIuMA0KLSAqIA0KLSAqLw0KLUBXZWJTZXJ2aWNlQ2xpZW50KG5hbWUgPSAiRmF1bHRzU2VydmljZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL3Rlc3QvcG9seW1vcnBoaWNmYXVsdHMiLCB3c2RsTG9jYXRpb24gPSAiRmF1bHRzU2VydmljZS53c2RsIikNCi1wdWJsaWMgY2xhc3MgRmF1bHRzU2VydmljZQ0KLSAgICBleHRlbmRzIFNlcnZpY2UNCi17DQotDQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFVSTCBGQVVMVFNTRVJWSUNFX1dTRExfTE9DQVRJT047DQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyB3c2RsTG9jYXRpb249Ii90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2ZhdWx0c3NlcnZpY2UvTUVUQS1JTkYvRmF1bHRzU2VydmljZS53c2RsIjsNCi0gICAgc3RhdGljIHsNCi0gICAgICAgIFVSTCB1cmwgPSBudWxsOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICB0cnl7DQotICAgICAgICAgICAgICAgIFN0cmluZyBiYXNlRGlyID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJiYXNlZGlyIiwiLiIpKS5nZXRDYW5vbmljYWxQYXRoKCk7DQotICAgICAgICAgICAgICAgIHdzZGxMb2NhdGlvbiA9IG5ldyBGaWxlKGJhc2VEaXIgKyB3c2RsTG9jYXRpb24pLmdldEFic29sdXRlUGF0aCgpOw0KLSAgICAgICAgICAgIH1jYXRjaChFeGNlcHRpb24gZSl7DQotICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKHdzZGxMb2NhdGlvbik7DQotICAgICAgICAgICAgdXJsID0gZmlsZS50b1VSTCgpOw0KLSAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgRkFVTFRTU0VSVklDRV9XU0RMX0xPQ0FUSU9OID0gdXJsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBGYXVsdHNTZXJ2aWNlKFVSTCB3c2RsTG9jYXRpb24sIFFOYW1lIHNlcnZpY2VOYW1lKSB7DQotICAgICAgICBzdXBlcih3c2RsTG9jYXRpb24sIHNlcnZpY2VOYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgRmF1bHRzU2VydmljZSgpIHsNCi0gICAgICAgIHN1cGVyKEZBVUxUU1NFUlZJQ0VfV1NETF9MT0NBVElPTiwgbmV3IFFOYW1lKCJodHRwOi8vb3JnL3Rlc3QvcG9seW1vcnBoaWNmYXVsdHMiLCAiRmF1bHRzU2VydmljZSIpKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgRmF1bHRzU2VydmljZVBvcnRUeXBlDQotICAgICAqLw0KLSAgICBAV2ViRW5kcG9pbnQobmFtZSA9ICJGYXVsdHNQb3J0IikNCi0gICAgcHVibGljIEZhdWx0c1NlcnZpY2VQb3J0VHlwZSBnZXRGYXVsdHNQb3J0KCkgew0KLSAgICAgICAgcmV0dXJuIChGYXVsdHNTZXJ2aWNlUG9ydFR5cGUpc3VwZXIuZ2V0UG9ydChuZXcgUU5hbWUoImh0dHA6Ly9vcmcvdGVzdC9wb2x5bW9ycGhpY2ZhdWx0cyIsICJGYXVsdHNQb3J0IiksIEZhdWx0c1NlcnZpY2VQb3J0VHlwZS5jbGFzcyk7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9mYXVsdHNzZXJ2aWNlL0ZhdWx0c1NlcnZpY2VQb3J0VHlwZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9mYXVsdHNzZXJ2aWNlL0ZhdWx0c1NlcnZpY2VQb3J0VHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDNjZWE3Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvZmF1bHRzc2VydmljZS9GYXVsdHNTZXJ2aWNlUG9ydFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0NCi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5mYXVsdHNzZXJ2aWNlOw0KLQ0KLWltcG9ydCBvcmcudGVzdC5wb2x5bW9ycGhpY2ZhdWx0cy5EZXJpdmVkRmF1bHQxOw0KLQ0KLWltcG9ydCBqYXZheC5qd3MuV2ViTWV0aG9kOw0KLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW07DQotaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbS5Nb2RlOw0KLWltcG9ydCBqYXZheC5qd3MuV2ViUmVzdWx0Ow0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLkhvbGRlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLlJlcXVlc3RXcmFwcGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuUmVzcG9uc2VXcmFwcGVyOw0KLQ0KLS8qKg0KLSAqIFRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBieSB0aGUgSkFYV1MgU0kuDQotICogSkFYLVdTIFJJIDIuMF8wMS1iMTUtZmNzDQotICogR2VuZXJhdGVkIHNvdXJjZSB2ZXJzaW9uOiAyLjANCi0gKiANCi0gKi8NCi1AV2ViU2VydmljZShuYW1lID0gIkZhdWx0c1NlcnZpY2VQb3J0VHlwZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL3Rlc3QvcG9seW1vcnBoaWNmYXVsdHMiKQ0KLXB1YmxpYyBpbnRlcmZhY2UgRmF1bHRzU2VydmljZVBvcnRUeXBlIHsNCi0NCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gc3ltYm9sDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgZmxvYXQNCi0gICAgICogQHRocm93cyBJbnZhbGlkVGlja2VyRmF1bHRfRXhjZXB0aW9uDQotICAgICAqIEB0aHJvd3MgRGVyaXZlZEZhdWx0Ml9FeGNlcHRpb24NCi0gICAgICogQHRocm93cyBCYXNlRmF1bHRfRXhjZXB0aW9uDQotICAgICAqIEB0aHJvd3MgRGVyaXZlZEZhdWx0MV9FeGNlcHRpb24NCi0gICAgICogQHRocm93cyBTaW1wbGVGYXVsdA0KLSAgICAgKi8NCi0gICAgQFdlYk1ldGhvZA0KLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAicmVzdWx0IiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpDQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAiZ2V0UXVvdGUiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L3BvbHltb3JwaGljZmF1bHRzIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LnBvbHltb3JwaGljZmF1bHRzLkdldFF1b3RlIikNCi0gICAgQFJlc3BvbnNlV3JhcHBlcihsb2NhbE5hbWUgPSAiZ2V0UXVvdGVSZXN1bHQiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L3BvbHltb3JwaGljZmF1bHRzIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LnBvbHltb3JwaGljZmF1bHRzLkdldFF1b3RlUmVzdWx0IikNCi0gICAgcHVibGljIGZsb2F0IGdldFF1b3RlKA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAic3ltYm9sIiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpDQotICAgICAgICBTdHJpbmcgc3ltYm9sKQ0KLSAgICAgICAgdGhyb3dzIEJhc2VGYXVsdF9FeGNlcHRpb24sIERlcml2ZWRGYXVsdDFfRXhjZXB0aW9uLCBEZXJpdmVkRmF1bHQyX0V4Y2VwdGlvbiwgSW52YWxpZFRpY2tlckZhdWx0X0V4Y2VwdGlvbiwgU2ltcGxlRmF1bHQNCi0gICAgOw0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSBwYXJhbUMNCi0gICAgICogQHBhcmFtIHBhcmFtQg0KLSAgICAgKiBAcGFyYW0gcGFyYW1BDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgaW50DQotICAgICAqIEB0aHJvd3MgQmFzZUZhdWx0X0V4Y2VwdGlvbg0KLSAgICAgKiBAdGhyb3dzIENvbXBsZXhGYXVsdF9FeGNlcHRpb24NCi0gICAgICovDQotICAgIEBXZWJNZXRob2QNCi0gICAgQFdlYlJlc3VsdCh0YXJnZXROYW1lc3BhY2UgPSAiIikNCi0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJ0aHJvd0ZhdWx0IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9wb2x5bW9ycGhpY2ZhdWx0cyIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5wb2x5bW9ycGhpY2ZhdWx0cy5UaHJvd0ZhdWx0IikNCi0gICAgQFJlc3BvbnNlV3JhcHBlcihsb2NhbE5hbWUgPSAidGhyb3dGYXVsdFJldHVybiIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL3Rlc3QvcG9seW1vcnBoaWNmYXVsdHMiLCBjbGFzc05hbWUgPSAib3JnLnRlc3QucG9seW1vcnBoaWNmYXVsdHMuVGhyb3dGYXVsdFJldHVybiIpDQotICAgIHB1YmxpYyBpbnQgdGhyb3dGYXVsdCgNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gInBhcmFtQSIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQ0KLSAgICAgICAgaW50IHBhcmFtQSwNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gInBhcmFtQiIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQ0KLSAgICAgICAgU3RyaW5nIHBhcmFtQiwNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gInBhcmFtQyIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQ0KLSAgICAgICAgZmxvYXQgcGFyYW1DKQ0KLSAgICAgICAgdGhyb3dzIEJhc2VGYXVsdF9FeGNlcHRpb24sIENvbXBsZXhGYXVsdF9FeGNlcHRpb24NCi0gICAgOw0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSBwYXJhbVoNCi0gICAgICogQHBhcmFtIHBhcmFtWQ0KLSAgICAgKiBAcGFyYW0gcGFyYW1YDQotICAgICAqIEBwYXJhbSBmYXVsdA0KLSAgICAgKiBAdGhyb3dzIERlcml2ZWRGYXVsdDFfRXhjZXB0aW9uDQotICAgICAqIEB0aHJvd3MgRXF1YWxGYXVsdA0KLSAgICAgKi8NCi0gICAgQFdlYk1ldGhvZA0KLSAgICBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gInJldHVybkZhdWx0IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9wb2x5bW9ycGhpY2ZhdWx0cyIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5wb2x5bW9ycGhpY2ZhdWx0cy5SZXR1cm5GYXVsdCIpDQotICAgIEBSZXNwb25zZVdyYXBwZXIobG9jYWxOYW1lID0gInJldHVybkZhdWx0UmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L3BvbHltb3JwaGljZmF1bHRzIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LnBvbHltb3JwaGljZmF1bHRzLlJldHVybkZhdWx0UmVzcG9uc2UiKQ0KLSAgICBwdWJsaWMgdm9pZCByZXR1cm5GYXVsdCgNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gInBhcmFtWCIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQ0KLSAgICAgICAgaW50IHBhcmFtWCwNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gInBhcmFtWSIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQ0KLSAgICAgICAgU3RyaW5nIHBhcmFtWSwNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gInBhcmFtWiIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQ0KLSAgICAgICAgZmxvYXQgcGFyYW1aLA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiZmF1bHQiLCB0YXJnZXROYW1lc3BhY2UgPSAiIiwgbW9kZSA9IE1vZGUuSU5PVVQpDQotICAgICAgICBIb2xkZXI8RGVyaXZlZEZhdWx0MT4gZmF1bHQpDQotICAgICAgICB0aHJvd3MgRGVyaXZlZEZhdWx0MV9FeGNlcHRpb24sIEVxdWFsRmF1bHQNCi0gICAgOw0KLQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2ZhdWx0c3NlcnZpY2UvRmF1bHRzU2VydmljZVNvYXBCaW5kaW5nSW1wbC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9mYXVsdHNzZXJ2aWNlL0ZhdWx0c1NlcnZpY2VTb2FwQmluZGluZ0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTE3NmNmMS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2ZhdWx0c3NlcnZpY2UvRmF1bHRzU2VydmljZVNvYXBCaW5kaW5nSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLmZhdWx0c3NlcnZpY2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5kb20uRE9PTUFic3RyYWN0RmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5UZXN0TG9nZ2VyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnNhYWouU09BUEVudmVsb3BlSW1wbDsNCi1pbXBvcnQgb3JnLnRlc3QucG9seW1vcnBoaWNmYXVsdHMuQmFzZUZhdWx0Ow0KLWltcG9ydCBvcmcudGVzdC5wb2x5bW9ycGhpY2ZhdWx0cy5Db21wbGV4RmF1bHQ7DQotaW1wb3J0IG9yZy50ZXN0LnBvbHltb3JwaGljZmF1bHRzLkRlcml2ZWRGYXVsdDE7DQotaW1wb3J0IG9yZy50ZXN0LnBvbHltb3JwaGljZmF1bHRzLkRlcml2ZWRGYXVsdDI7DQotDQotaW1wb3J0IGphdmF4LmFubm90YXRpb24uUG9zdENvbnN0cnVjdDsNCi1pbXBvcnQgamF2YXguYW5ub3RhdGlvbi5QcmVEZXN0cm95Ow0KLWltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlJlc291cmNlOw0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsNCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi1pbXBvcnQgamF2YXgueG1sLnNvYXAuRGV0YWlsOw0KLWltcG9ydCBqYXZheC54bWwuc29hcC5EZXRhaWxFbnRyeTsNCi1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEJvZHk7DQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBFeGNlcHRpb247DQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBGYXVsdDsNCi1pbXBvcnQgamF2YXgueG1sLndzLkhvbGRlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VDb250ZXh0Ow0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuU09BUEZhdWx0RXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgc2VydmVyIHNpZGUgaW1wbGVtZW50YXRpb24gZm9yIHRoZSANCi0gKiBGYXVsdHNTZXJ2aWNlUG9ydFR5cGUuDQotICovDQotDQotQFdlYlNlcnZpY2UgKHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL29yZy90ZXN0L3BvbHltb3JwaGljZmF1bHRzIiwNCi0gICAgICAgICAgICAgc2VydmljZU5hbWU9IkZhdWx0c1NlcnZpY2UiLA0KLSAgICAgICAgICAgICBwb3J0TmFtZT0iRmF1bHRzUG9ydCIsDQotICAgICAgICAgICAvL3dzZGxMb2NhdGlvbj0iV0VCLUlORi93c2RsL0ZhdWx0c1NlcnZpY2Uud3NkbCIsDQotICAgICAgICAgICAgIGVuZHBvaW50SW50ZXJmYWNlPSJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5mYXVsdHNzZXJ2aWNlLkZhdWx0c1NlcnZpY2VQb3J0VHlwZSIpDQotDQotcHVibGljIGNsYXNzIEZhdWx0c1NlcnZpY2VTb2FwQmluZGluZ0ltcGwgaW1wbGVtZW50cyBGYXVsdHNTZXJ2aWNlUG9ydFR5cGUgew0KLQ0KLSAgICBwcml2YXRlIFdlYlNlcnZpY2VDb250ZXh0IGN0eCA9IG51bGw7DQotICAgIHByaXZhdGUgYm9vbGVhbiBpbml0ID0gZmFsc2U7DQotICAgIA0KLSAgICAvKioNCi0gICAgICogVGhyb3dzIHdyYXBwZXIgZXhjZXB0aW9ucyBmb3IgZmF1bHQgYmVhbnMNCi0gICAgICovDQotICAgIHB1YmxpYyBmbG9hdCBnZXRRdW90ZShTdHJpbmcgdGlja2VyU3ltYm9sKSB0aHJvd3MgDQotICAgICAgICBCYXNlRmF1bHRfRXhjZXB0aW9uLCBEZXJpdmVkRmF1bHQxX0V4Y2VwdGlvbiwgDQotICAgICAgICBEZXJpdmVkRmF1bHQyX0V4Y2VwdGlvbiwgSW52YWxpZFRpY2tlckZhdWx0X0V4Y2VwdGlvbiwgU2ltcGxlRmF1bHQgew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIlxuSW4gZ2V0UXVvdGUoKTogIiArIHRpY2tlclN5bWJvbCArICJcbiIpOw0KLSAgICAgICAgaWYgKHRpY2tlclN5bWJvbC5lcXVhbHMoIlNNUEwiKSkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBTaW1wbGVGYXVsdCgiU2VydmVyIHRocm93cyBTaW1wbGVGYXVsdCIsIDEwMCk7DQotICAgICAgICB9IGVsc2UgaWYgKHRpY2tlclN5bWJvbC5lcXVhbHMoIkxFR0MiKSkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkVGlja2VyRmF1bHRfRXhjZXB0aW9uKCJTZXJ2ZXIgdGhyb3dzIEludmFsaWRUaWNrZXJGYXVsdF9FeGNlcHRpb24iLCB0aWNrZXJTeW1ib2wsIDEyMyk7DQotICAgICAgICB9IGVsc2UgaWYgKHRpY2tlclN5bWJvbC5lcXVhbHMoIkRGMSIpKSB7DQotICAgICAgICAgICAgRGVyaXZlZEZhdWx0MSBkZiA9IG5ldyBEZXJpdmVkRmF1bHQxKCk7DQotICAgICAgICAgICAgZGYuc2V0QSgxMDApOw0KLSAgICAgICAgICAgIGRmLnNldEIodGlja2VyU3ltYm9sKTsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgRGVyaXZlZEZhdWx0MV9FeGNlcHRpb24oIlNlcnZlciB0aHJvd3MgRGVyaXZlZEZhdWx0MV9FeGNlcHRpb24iLCBkZik7DQotICAgICAgICB9ICBlbHNlIGlmICh0aWNrZXJTeW1ib2wuZXF1YWxzKCJERjIiKSkgew0KLSAgICAgICAgICAgIERlcml2ZWRGYXVsdDIgZGYgPSBuZXcgRGVyaXZlZEZhdWx0MigpOw0KLSAgICAgICAgICAgIGRmLnNldEEoMjAwKTsNCi0gICAgICAgICAgICBkZi5zZXRCKHRpY2tlclN5bWJvbCk7DQotICAgICAgICAgICAgZGYuc2V0Qyg4MC4wRik7DQotICAgICAgICAgICAgdGhyb3cgbmV3IERlcml2ZWRGYXVsdDJfRXhjZXB0aW9uKCJTZXJ2ZXIgdGhyb3dzIERlcml2ZWRGYXVsdDJfRXhjZXB0aW9uIiwgZGYpOw0KLSAgICAgICAgfSBlbHNlIGlmICh0aWNrZXJTeW1ib2wuZXF1YWxzKCJCQVNFIikpIHsNCi0gICAgICAgICAgICBCYXNlRmF1bHQgYmYgPSBuZXcgQmFzZUZhdWx0KCk7DQotICAgICAgICAgICAgYmYuc2V0QSg0MDApOw0KLSAgICAgICAgICAgIHRocm93IG5ldyBCYXNlRmF1bHRfRXhjZXB0aW9uKCJTZXJ2ZXIgdGhyb3dzIEJhc2VGYXVsdF9FeGNlcHRpb24iLCBiZik7DQotICAgICAgICB9IGVsc2UgaWYgKHRpY2tlclN5bWJvbC5lcXVhbHMoIklOSkVDVElPTiIpKSB7DQotICAgICAgICAgICBpZiAoY3R4ICE9IG51bGwgJiYgaW5pdCkgew0KLSAgICAgICAgICAgICAgIC8vIE9ubHkgcmV0dXJuIHRoaXMgdmFsdWUgaWYgdGhlIGNvbnRleHQgaXMgaW5qZWN0ZWQgYW5kIA0KLSAgICAgICAgICAgICAgIC8vIHRoZSBpbml0aWFsaXphdGlvbiBtZXRob2QgaXMgaW52b2tlZA0KLSAgICAgICAgICAgICAgIHJldHVybiAxMjM0NTY3OyANCi0gICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiAxMDA7DQotICAgIH0NCi0NCi0NCi0gICAgLyoqDQotICAgICAqIFRocm93cyB3cmFwcGVyIGV4Y2VwdGlvbnMgZm9yIGRlcml2ZWQgZmF1bHQgYmVhbnMNCi0gICAgICovDQotICAgIHB1YmxpYyBpbnQgdGhyb3dGYXVsdChpbnQgYSwgU3RyaW5nIGIsIGZsb2F0IGMpIHRocm93cyANCi0gICAgICAgIEJhc2VGYXVsdF9FeGNlcHRpb24sIENvbXBsZXhGYXVsdF9FeGNlcHRpb24gew0KLSAgICAgICAgaWYoYi5lcXVhbHMoIkNvbXBsZXgiKSkgew0KLSAgICAgICAgICAgIENvbXBsZXhGYXVsdCBjZiA9IG5ldyBDb21wbGV4RmF1bHQoKTsNCi0gICAgICAgICAgICBjZi5zZXRBKGEpOyANCi0gICAgICAgICAgICBjZi5zZXRCKGIpOyANCi0gICAgICAgICAgICBjZi5zZXRDKGMpOyANCi0gICAgICAgICAgICBjZi5zZXREKDUpOyANCi0gICAgICAgICAgICB0aHJvdyBuZXcgQ29tcGxleEZhdWx0X0V4Y2VwdGlvbigiU2VydmVyIHRocm93cyBDb21wbGV4RmF1bHRfRXhjZXB0aW9uIiwgY2YpOw0KLSAgICAgICAgfSBlbHNlIGlmIChiLmVxdWFscygiQmFzZUZhdWx0IikpIHsNCi0gICAgICAgICAgICBCYXNlRmF1bHQgYmYgPSBuZXcgQmFzZUZhdWx0KCk7DQotICAgICAgICAgICAgYmYuc2V0QShhKTsgIA0KLSAgICAgICAgICAgIHRocm93IG5ldyBCYXNlRmF1bHRfRXhjZXB0aW9uKCJTZXJ2ZXIgdGhyb3dzIEJhc2VGYXVsdF9FeGNlcHRpb24iLCBiZik7DQotICAgICAgICB9IGVsc2UgaWYgKGIuZXF1YWxzKCJEZXJpdmVkRmF1bHQxIikpIHsNCi0gICAgICAgICAgICBEZXJpdmVkRmF1bHQxIGRmID0gbmV3IERlcml2ZWRGYXVsdDEoKTsNCi0gICAgICAgICAgICBkZi5zZXRBKGEpOyANCi0gICAgICAgICAgICBkZi5zZXRCKGIpOyANCi0gICAgICAgICAgICB0aHJvdyBuZXcgQmFzZUZhdWx0X0V4Y2VwdGlvbigiU2VydmVyIHRocm93cyBCYXNlRmF1bHRfRXhjZXB0aW9uIiwgZGYpOw0KLSAgICAgICAgfSBlbHNlIGlmIChiLmVxdWFscygiRGVyaXZlZEZhdWx0MiIpKSB7DQotICAgICAgICAgICAgRGVyaXZlZEZhdWx0MiBkZiA9IG5ldyBEZXJpdmVkRmF1bHQyKCk7DQotICAgICAgICAgICAgZGYuc2V0QShhKTsgDQotICAgICAgICAgICAgZGYuc2V0QihiKTsgDQotICAgICAgICAgICAgZGYuc2V0QyhjKTsgDQotICAgICAgICAgICAgdGhyb3cgbmV3IEJhc2VGYXVsdF9FeGNlcHRpb24oIlNlcnZlciB0aHJvd3MgQmFzZUZhdWx0X0V4Y2VwdGlvbiIsIGRmKTsNCi0gICAgICAgIH0gZWxzZSBpZiAoYi5lcXVhbHMoIlNPQVBGYXVsdEV4Y2VwdGlvbiIpKSB7DQotICAgICAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICAgICAgU09BUEZhdWx0IHNvYXBGYXVsdCA9IGNyZWF0ZVNPQVBGYXVsdCgpOw0KLSAgICAgICAgICAgICAgICBzb2FwRmF1bHQuc2V0RmF1bHRTdHJpbmcoImhlbGxvIHdvcmxkIik7DQotICAgICAgICAgICAgICAgIHNvYXBGYXVsdC5zZXRGYXVsdEFjdG9yKCJhY3RvciIpOw0KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU09BUEZhdWx0RXhjZXB0aW9uKHNvYXBGYXVsdCk7DQotICAgICAgICAgICAgfSBjYXRjaCAoU09BUEV4Y2VwdGlvbiBzZSkge30NCi0gICAgICAgIH0gZWxzZSBpZiAoYi5lcXVhbHMoIlNPQVBGYXVsdEV4Y2VwdGlvbjIiKSkgew0KLSAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgIFNPQVBGYXVsdCBzb2FwRmF1bHQgPSBjcmVhdGVTT0FQRmF1bHQoKTsNCi0gICAgICAgICAgICAgICAgc29hcEZhdWx0LnNldEZhdWx0U3RyaW5nKCJoZWxsbyB3b3JsZDIiKTsNCi0gICAgICAgICAgICAgICAgc29hcEZhdWx0LnNldEZhdWx0QWN0b3IoImFjdG9yMiIpOw0KLSAgICAgICAgICAgICAgICBEZXRhaWwgZGV0YWlsID0gc29hcEZhdWx0LmFkZERldGFpbCgpOw0KLSAgICAgICAgICAgICAgICBEZXRhaWxFbnRyeSBkZSA9IGRldGFpbC5hZGREZXRhaWxFbnRyeShuZXcgUU5hbWUoInVybjovL3NhbXBsZSIsICJkZXRhaWxFbnRyeSIpKTsNCi0gICAgICAgICAgICAgICAgZGUuc2V0VmFsdWUoIlRleGFzIik7DQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBTT0FQRmF1bHRFeGNlcHRpb24oc29hcEZhdWx0KTsNCi0gICAgICAgICAgICB9IGNhdGNoIChTT0FQRXhjZXB0aW9uIHNlKSB7fQ0KLSAgICAgICAgfSBlbHNlIGlmIChiLmVxdWFscygiTlBFIikpIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsNCi0gICAgICAgIH0gZWxzZSBpZiAoYi5lcXVhbHMoIk5QRTIiKSkgew0KLSAgICAgICAgICAgIC8vIFRocm93IE5QRSB3aXRoIGEgbWVzc2FnZQ0KLSAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiTnVsbCBQb2ludGVyIEV4Y2VwdGlvbiBvY2N1cnJlZCIpOw0KLSAgICAgICAgfSBlbHNlIGlmIChiLmVxdWFscygiV1NFIikpIHsNCi0gICAgICAgICAgICBXZWJTZXJ2aWNlRXhjZXB0aW9uIHdzZiA9IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKCJUaGlzIGlzIGEgV2ViU2VydmljZUV4Y2VwdGlvbiIpOw0KLSAgICAgICAgICAgIHRocm93IHdzZjsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiAwOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBSZXR1cm5zIGEgZmF1bHQgYmVhbiBvciB0aHJvd3MgYSB3cmFwcGVyIGV4Y2VwdGlvbg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgcmV0dXJuRmF1bHQoaW50IGEsIFN0cmluZyBiLCBmbG9hdCBjLCANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSG9sZGVyPERlcml2ZWRGYXVsdDE+IGZhdWx0KSB0aHJvd3MgRXF1YWxGYXVsdCB7DQotDQotICAgICAgICBEZXJpdmVkRmF1bHQyIG5ld0ZhdWx0ID0gbmV3IERlcml2ZWRGYXVsdDIoKTsNCi0gICAgICAgIG5ld0ZhdWx0LnNldEEoZmF1bHQudmFsdWUuZ2V0QSgpKTsgICAgICAgICAgICANCi0gICAgICAgIG5ld0ZhdWx0LnNldEIoZmF1bHQudmFsdWUuZ2V0QigpKTsgICAgICAgICAgICANCi0gICAgICAgIG5ld0ZhdWx0LnNldEMoYyk7DQotDQotICAgICAgICBpZihmYXVsdC52YWx1ZS5nZXRCKCkuZXF1YWxzKCJmYXVsdCIpKSB7DQotICAgICAgICAgICAgZmF1bHQudmFsdWUgPSBuZXdGYXVsdDsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9IGVsc2UgaWYgKGZhdWx0LnZhbHVlLmdldEIoKS5lcXVhbHMoImV4Y2VwdGlvbiIpKSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IEVxdWFsRmF1bHQoIlNlcnZlciB0aHJvd3MgRXF1YWxGYXVsdCIsIG5ld0ZhdWx0KTsgICAgICAgICAgICANCi0gICAgICAgIH0NCi0gICAgICAgIERlcml2ZWRGYXVsdDEgZGYgPSBuZXcgRGVyaXZlZEZhdWx0MSgpOw0KLSAgICAgICAgZGYuc2V0QShhICsgMSk7IA0KLSAgICAgICAgZGYuc2V0QigiU2VydmVyOiAiICsgYik7IA0KLSAgICAgICAgdGhyb3cgbmV3IEVxdWFsRmF1bHQoIlNlcnZlciB0aHJvd3MgRXF1YWxGYXVsdCIsIGRmKTsNCi0gICAgfQ0KLSAgICANCi0gICAgU09BUEZhdWx0IGNyZWF0ZVNPQVBGYXVsdCgpIHRocm93cyBTT0FQRXhjZXB0aW9uIHsNCi0gICAgICAgIFNPQVBGYXVsdCBzb2FwRmF1bHQgPSBudWxsOw0KLSAgICANCi0gICAgICAgIC8vIFJFVklFVzogVGhlIGZvbGxvd2luZyBkb2VzIG5vdCB3b3JrIGR1ZSB0byBBeGlzMiBTQUFKIHByb2JsZW1zLg0KLSAgICAgICAgLy8NCi0gICAgICAgIC8vIFNPQVBGYWN0b3J5IHNvYXBGYWN0b3J5ID0gU09BUEZhY3RvcnkubmV3SW5zdGFuY2UoKTsNCi0gICAgICAgIC8vIFNPQVBGYXVsdCBzb2FwRmF1bHQgPSBzb2FwRmFjdG9yeS5jcmVhdGVGYXVsdCgpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBBbHRlcm5hdGUgQXBwcm9hY2gNCi0gICAgICAgIG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmFjdG9yeSBhc2YgPSBET09NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMUZhY3RvcnkoKTsNCi0gICAgICAgIG9yZy5hcGFjaGUuYXhpb20uc29hcC5pbXBsLmRvbS5TT0FQRW52ZWxvcGVJbXBsIGF4aW9tRW52ID0gKG9yZy5hcGFjaGUuYXhpb20uc29hcC5pbXBsLmRvbS5TT0FQRW52ZWxvcGVJbXBsKSBhc2YuY3JlYXRlU09BUEVudmVsb3BlKCk7DQotICAgICAgICBqYXZheC54bWwuc29hcC5TT0FQRW52ZWxvcGUgZW52ID0gbmV3IFNPQVBFbnZlbG9wZUltcGwoYXhpb21FbnYpOw0KLSAgICAgICAgU09BUEJvZHkgYm9keSA9IGVudi5hZGRCb2R5KCk7DQotICAgICAgICBzb2FwRmF1bHQgPSBib2R5LmFkZEZhdWx0KCk7DQotICAgICAgICByZXR1cm4gc29hcEZhdWx0Ow0KLSAgICB9DQotICAgIA0KLSAgICBAUG9zdENvbnN0cnVjdA0KLSAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKCl7DQotICAgICAgICAvL0NhbGxlZCBhZnRlciByZXNvdXJjZSBpbmplY3Rpb24gYW5kIGJlZm9yZSBhIG1ldGhvZCBpcyBjYWxsZWQuDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiQ2FsbGluZyBQb3N0Q29uc3RydWN0IHRvIEluaXRpYWxpemUiKTsNCi0gICAgICAgIHRoaXMuaW5pdCA9IHRydWU7DQotICAgIH0NCi0gICAgDQotICAgIEBQcmVEZXN0cm95DQotICAgIHB1YmxpYyB2b2lkIGRpc3RydWN0b3IoKXsNCi0gICAgICAgIC8vQ2FsbGVkIGJlZm9yZSB0aGUgc2NvcGUgb2YgcmVxdWVzdCBvciBzZXNzaW9uIG9yIGFwcGxpY2F0aW9uIGVuZHMuDQotDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiQ2FsbGluZyBQcmVEZXN0cm95ICIpOw0KLSAgICAgICAgDQotICAgIH0NCi0gICAgQFJlc291cmNlDQotICAgIHByaXZhdGUgdm9pZCBzZXRDdHgoV2ViU2VydmljZUNvbnRleHQgY3R4KSB7DQotICAgICAgICAvLyBUaGUgc2V0dGVyIGlzIHByaXZhdGUuICBUaGlzIHNob3VsZCBub3QgbWF0dGVyIGJlY2F1c2UgdGhlIGVuZ2luZQ0KLSAgICAgICAgLy8gc2hvdWxkIHN0aWxsIG1ha2UgaXQgYWNjZXNzaWJsZS4NCi0gICAgICAgIHRoaXMuY3R4ID0gY3R4Ow0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvZmF1bHRzc2VydmljZS9JbnZhbGlkVGlja2VyRmF1bHRfRXhjZXB0aW9uLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2ZhdWx0c3NlcnZpY2UvSW52YWxpZFRpY2tlckZhdWx0X0V4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTM3MDE3Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvZmF1bHRzc2VydmljZS9JbnZhbGlkVGlja2VyRmF1bHRfRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0NCi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5mYXVsdHNzZXJ2aWNlOw0KLQ0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViRmF1bHQ7DQotDQotLyoqDQotICogVGhpcyBpcyBhbiBleGFtcGxlIG9mIGEgbGVnYWN5IGV4Y2VwdGlvbiAgd2hpY2ggbWF5IGJlIHRoZSByZXN1bHQgb2YgYSBKQVgtUlBDIGVtaXNzaW9uLg0KLSAqIFRoZSBmYXVsdCBkb2VzIG5vdCBoYXZlIHRoZSB2YWxpZCBjb25zdHJ1Y3RvcnMgYW5kIGxhY2tzIGEgZ2V0RmF1bHRJbmZvIG1ldGhvZC4NCi0gKiBIb3dldmVyIChpbiB0aGlzIGNhc2UpIHRoZSBmYXVsdCBoYXMgYSBAV2ViRmF1bHQgdGhhdCBpZGVudGlmaWVzIHRoZSBmYXVsdGJlYW4NCi0gKi8NCi1AV2ViRmF1bHQobmFtZSA9ICJJbnZhbGlkVGlja2VyRmF1bHQiLCANCi0gICAgICAgIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL3Rlc3QvcG9seW1vcnBoaWNmYXVsdHMiLA0KLSAgICAgICAgZmF1bHRCZWFuPSJvcmcudGVzdC5wb2x5bW9ycGhpY2ZhdWx0cy5JbnZhbGlkVGlja2VyRmF1bHRFeGNlcHRpb25CZWFuIikNCi0gICAgICAgIA0KLSAgICAgICAgLy8gZmF1bHRCZWFuIGlzIGludGVudGlvbmFsbHkgbm90IHNwZWNpZmllZC4gSXQgc2hvdWxkIGRlZmF1bHQgdG8gDQotICAgICAgICAvLyBmYXVsdEJlYW49Im9yZy50ZXN0LnBvbHltb3JwaGljZmF1bHRzLkludmFsaWRUaWNrZXJGYXVsdF9FeGNlcHRpb25CZWFuIg0KLXB1YmxpYyBjbGFzcyBJbnZhbGlkVGlja2VyRmF1bHRfRXhjZXB0aW9uDQotICAgIGV4dGVuZHMgRXhjZXB0aW9uDQotew0KLQ0KLSAgICAvKioNCi0gICAgICogSmF2YSB0eXBlIHRoYXQgZ29lcyBhcyBzb2FwZW52OkZhdWx0IGRldGFpbCBlbGVtZW50Lg0KLSAgICAgKiANCi0gICAgICovDQotICAgIHByaXZhdGUgU3RyaW5nIGxlZ2FjeURhdGExOw0KLSAgICBwcml2YXRlIGludCBsZWdhY3lEYXRhMjsNCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gbWVzc2FnZQ0KLSAgICAgKiBAcGFyYW0gZmF1bHRJbmZvDQotICAgICAqLw0KLSAgICBwdWJsaWMgSW52YWxpZFRpY2tlckZhdWx0X0V4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgU3RyaW5nIGxlZ2FjeURhdGExLCBpbnQgbGVnYWN5RGF0YTIpIHsNCi0gICAgICAgIHN1cGVyKG1lc3NhZ2UpOw0KLSAgICAgICAgdGhpcy5sZWdhY3lEYXRhMSA9IGxlZ2FjeURhdGExOw0KLSAgICAgICAgdGhpcy5sZWdhY3lEYXRhMiA9IGxlZ2FjeURhdGEyOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGNhdXNlDQotICAgICAqIEBwYXJhbSBtZXNzYWdlDQotICAgICAqIEBwYXJhbSBmYXVsdEluZm8NCi0gICAgICovDQotICAgIHB1YmxpYyBJbnZhbGlkVGlja2VyRmF1bHRfRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBTdHJpbmcgbGVnYWN5RGF0YTEsIGludCBsZWdhY3lEYXRhMiwgVGhyb3dhYmxlIGNhdXNlKSB7DQotICAgICAgICBzdXBlcihtZXNzYWdlLCBjYXVzZSk7DQotICAgICAgICB0aGlzLmxlZ2FjeURhdGExID0gbGVnYWN5RGF0YTE7DQotICAgICAgICB0aGlzLmxlZ2FjeURhdGEyID0gbGVnYWN5RGF0YTI7DQotICAgIH0NCi0NCi0gICAgDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGVnYWN5RGF0YTEoKSB7DQotICAgICAgICByZXR1cm4gbGVnYWN5RGF0YTE7DQotICAgIH0NCi0gICAgcHVibGljIGludCBnZXRMZWdhY3lEYXRhMigpIHsNCi0gICAgICAgIHJldHVybiBsZWdhY3lEYXRhMjsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2ZhdWx0c3NlcnZpY2UvTUVUQS1JTkYvRmF1bHRzU2VydmljZS53c2RsIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9mYXVsdHNzZXJ2aWNlL01FVEEtSU5GL0ZhdWx0c1NlcnZpY2Uud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQ2OWYwZC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2ZhdWx0c3NlcnZpY2UvTUVUQS1JTkYvRmF1bHRzU2VydmljZS53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsMjgxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotDQotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPGRlZmluaXRpb25zIG5hbWU9IkZhdWx0c1NlcnZpY2UiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL29yZy90ZXN0L3BvbHltb3JwaGljZmF1bHRzIg0KLSAgICAgeG1sbnM6dG5zPSJodHRwOi8vb3JnL3Rlc3QvcG9seW1vcnBoaWNmYXVsdHMiDQotICAgICB4bWxuczp0cz0iaHR0cDovL29yZy90ZXN0L3BvbHltb3JwaGljZmF1bHRzIg0KLSAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgDQotICAgICB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiANCi0gICAgIHhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+DQotDQotICA8dHlwZXM+DQotICAgIDx4c2Q6c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL29yZy90ZXN0L3BvbHltb3JwaGljZmF1bHRzIj4NCi0gICAgICAgIA0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJTaW1wbGVGYXVsdCIgdHlwZT0ieHNkOmludCIvPg0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJJbnZhbGlkVGlja2VyRmF1bHQiIHR5cGU9InRzOkludmFsaWRUaWNrZXJGYXVsdF9FeGNlcHRpb25CZWFuIi8+DQotICAgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJJbnZhbGlkVGlja2VyRmF1bHRfRXhjZXB0aW9uQmVhbiI+DQotICAgICAgICA8eHNkOnNlcXVlbmNlPg0KLSAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxlZ2FjeURhdGExIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPg0KLSAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxlZ2FjeURhdGEyIiB0eXBlPSJ4c2Q6aW50IiAvPg0KLSAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1lc3NhZ2UiIHR5cGU9InhzZDpzdHJpbmciIC8+DQotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4NCi0gICAgICA8L3hzZDpjb21wbGV4VHlwZT4NCi0NCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQmFzZUZhdWx0IiB0eXBlPSJ0czpCYXNlRmF1bHQiLz4NCi0gICAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkJhc2VGYXVsdCI+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+DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9mYXVsdHNzZXJ2aWNlL1NpbXBsZUZhdWx0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2ZhdWx0c3NlcnZpY2UvU2ltcGxlRmF1bHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE0YThhZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2ZhdWx0c3NlcnZpY2UvU2ltcGxlRmF1bHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLQ0KLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLmZhdWx0c3NlcnZpY2U7DQotDQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJGYXVsdDsNCi0NCi0vKioNCi0gKiBUaGlzIGNsYXNzIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIEpBWFdTIFNJLg0KLSAqIEpBWC1XUyBSSSAyLjBfMDEtYjE1LWZjcw0KLSAqIEdlbmVyYXRlZCBzb3VyY2UgdmVyc2lvbjogMi4wDQotICogDQotICovDQotQFdlYkZhdWx0KG5hbWUgPSAiU2ltcGxlRmF1bHQiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L3BvbHltb3JwaGljZmF1bHRzIikNCi1wdWJsaWMgY2xhc3MgU2ltcGxlRmF1bHQNCi0gICAgZXh0ZW5kcyBFeGNlcHRpb24NCi17DQotDQotICAgIC8qKg0KLSAgICAgKiBKYXZhIHR5cGUgdGhhdCBnb2VzIGFzIHNvYXBlbnY6RmF1bHQgZGV0YWlsIGVsZW1lbnQuDQotICAgICAqIA0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBpbnQgZmF1bHRJbmZvOw0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSBtZXNzYWdlDQotICAgICAqIEBwYXJhbSBmYXVsdEluZm8NCi0gICAgICovDQotICAgIHB1YmxpYyBTaW1wbGVGYXVsdChTdHJpbmcgbWVzc2FnZSwgaW50IGZhdWx0SW5mbykgew0KLSAgICAgICAgc3VwZXIobWVzc2FnZSk7DQotICAgICAgICB0aGlzLmZhdWx0SW5mbyA9IGZhdWx0SW5mbzsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSBjYXVzZQ0KLSAgICAgKiBAcGFyYW0gbWVzc2FnZQ0KLSAgICAgKiBAcGFyYW0gZmF1bHRJbmZvDQotICAgICAqLw0KLSAgICBwdWJsaWMgU2ltcGxlRmF1bHQoU3RyaW5nIG1lc3NhZ2UsIGludCBmYXVsdEluZm8sIFRocm93YWJsZSBjYXVzZSkgew0KLSAgICAgICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpOw0KLSAgICAgICAgdGhpcy5mYXVsdEluZm8gPSBmYXVsdEluZm87DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIGZhdWx0IGJlYW46IGludA0KLSAgICAgKi8NCi0gICAgcHVibGljIGludCBnZXRGYXVsdEluZm8oKSB7DQotICAgICAgICByZXR1cm4gZmF1bHRJbmZvOw0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvbXRvbS9NdG9tU2FtcGxlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL210b20vTXRvbVNhbXBsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDliNWM4Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvbXRvbS9NdG9tU2FtcGxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0NCi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5tdG9tOw0KLQ0KLWltcG9ydCBvcmcudGVzdC5tdG9tLkltYWdlRGVwb3Q7DQotDQotaW1wb3J0IGphdmF4Lmp3cy5XZWJNZXRob2Q7DQotaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbTsNCi1pbXBvcnQgamF2YXguandzLldlYlJlc3VsdDsNCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5SZXF1ZXN0V3JhcHBlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLlJlc3BvbnNlV3JhcHBlcjsNCi0NCi1AV2ViU2VydmljZShuYW1lID0gIk10b21TYW1wbGUiLA0KLSAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvbXRvbSIsIA0KLSAgICAgICAgICAgIHdzZGxMb2NhdGlvbiA9ICJNRVRBLUlORi9JbWFnZURlcG90LndzZGwiKQ0KLXB1YmxpYyBpbnRlcmZhY2UgTXRvbVNhbXBsZSB7DQotDQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGlucHV0DQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgb3JnLnRlc3QubXRvbS5JbWFnZURlcG90DQotICAgICAqLw0KLSAgICBAV2ViTWV0aG9kDQotICAgIEBXZWJSZXN1bHQobmFtZSA9ICJvdXRwdXQiLCB0YXJnZXROYW1lc3BhY2UgPSAidXJuOi8vbXRvbS50ZXN0Lm9yZyIpDQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAic2VuZEltYWdlIiwgdGFyZ2V0TmFtZXNwYWNlID0gInVybjovL210b20udGVzdC5vcmciLCBjbGFzc05hbWUgPSAib3JnLnRlc3QubXRvbS5TZW5kSW1hZ2UiKQ0KLSAgICBAUmVzcG9uc2VXcmFwcGVyKGxvY2FsTmFtZSA9ICJzZW5kSW1hZ2VSZXNwb25zZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJ1cm46Ly9tdG9tLnRlc3Qub3JnIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0Lm10b20uU2VuZEltYWdlUmVzcG9uc2UiKQ0KLSAgICBwdWJsaWMgSW1hZ2VEZXBvdCBzZW5kSW1hZ2UoDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJpbnB1dCIsIHRhcmdldE5hbWVzcGFjZSA9ICJ1cm46Ly9tdG9tLnRlc3Qub3JnIikNCi0gICAgICAgIEltYWdlRGVwb3QgaW5wdXQpOw0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSBpbnB1dA0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIG9yZy50ZXN0Lm10b20uSW1hZ2VEZXBvdA0KLSAgICAgKi8NCi0gICAgQFdlYk1ldGhvZA0KLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAib3V0cHV0IiwgdGFyZ2V0TmFtZXNwYWNlID0gInVybjovL210b20udGVzdC5vcmciKQ0KLSAgICBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gInNlbmRUZXh0IiwgdGFyZ2V0TmFtZXNwYWNlID0gInVybjovL210b20udGVzdC5vcmciLCBjbGFzc05hbWUgPSAib3JnLnRlc3QubXRvbS5TZW5kVGV4dCIpDQotICAgIEBSZXNwb25zZVdyYXBwZXIobG9jYWxOYW1lID0gInNlbmRUZXh0UmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAidXJuOi8vbXRvbS50ZXN0Lm9yZyIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5tdG9tLlNlbmRUZXh0UmVzcG9uc2UiKQ0KLSAgICBwdWJsaWMgSW1hZ2VEZXBvdCBzZW5kVGV4dCgNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImlucHV0IiwgdGFyZ2V0TmFtZXNwYWNlID0gInVybjovL210b20udGVzdC5vcmciKQ0KLSAgICAgICAgYnl0ZVtdIGlucHV0KTsNCi0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9tdG9tL010b21TYW1wbGVNVE9NRGVmYXVsdFNlcnZpY2UuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvbXRvbS9NdG9tU2FtcGxlTVRPTURlZmF1bHRTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiMDcyZmQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9tdG9tL010b21TYW1wbGVNVE9NRGVmYXVsdFNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLm10b207DQotDQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YXNvdXJjZS5qYXhiLkpBWEJBdHRhY2htZW50VW5tYXJzaGFsbGVyTW9uaXRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5UZXN0TG9nZ2VyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnByb3ZpZGVyLkRhdGFTb3VyY2VJbXBsOw0KLWltcG9ydCBvcmcudGVzdC5tdG9tLkltYWdlRGVwb3Q7DQotaW1wb3J0IG9yZy50ZXN0Lm10b20uT2JqZWN0RmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YXguYWN0aXZhdGlvbi5EYXRhSGFuZGxlcjsNCi1pbXBvcnQgamF2YXguYWN0aXZhdGlvbi5EYXRhU291cmNlOw0KLWltcG9ydCBqYXZheC5pbWFnZWlvLkltYWdlSU87DQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuQmluZGluZ1R5cGU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5NVE9NOw0KLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5TT0FQQmluZGluZzsNCi1pbXBvcnQgamF2YS5hd3QuKjsNCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsNCi0NCi0vKioNCi0gKiBFbmRwb2ludCB3aXRoIGRlZmF1bHQgTVRPTSBhbm5vdGF0aW9uDQotICovDQotQFdlYlNlcnZpY2Uoc2VydmljZU5hbWU9Ik10b21TYW1wbGVTZXJ2aWNlIiwNCi0JICAgIGVuZHBvaW50SW50ZXJmYWNlPSJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5tdG9tLk10b21TYW1wbGUiKQ0KLS8vQEJpbmRpbmdUeXBlKFNPQVBCaW5kaW5nLlNPQVAxMUhUVFBfTVRPTV9CSU5ESU5HKQ0KLUBNVE9NDQotcHVibGljIGNsYXNzIE10b21TYW1wbGVNVE9NRGVmYXVsdFNlcnZpY2UgaW1wbGVtZW50cyBNdG9tU2FtcGxlIHsNCi0NCi0gICAgcHVibGljIEltYWdlRGVwb3Qgc2VuZEltYWdlKEltYWdlRGVwb3QgaW5wdXQpIHsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJNdG9tU2FtcGxlTVRPTURlZmF1bHRTZXJ2aWNlIFtuZXcgc2VuZEltYWdlIHJlcXVlc3QgcmVjZWl2ZWRdIik7DQotICAgICAgICBEYXRhSGFuZGxlciBkYXRhID0gaW5wdXQuZ2V0SW1hZ2VEYXRhKCk7DQotDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiW2NvbnRlbnRUeXBlXSAiICsgZGF0YS5nZXRDb250ZW50VHlwZSgpKTsNCi0gICAgICAgIEltYWdlRGVwb3Qgb3V0cHV0ID0gKG5ldyBPYmplY3RGYWN0b3J5KCkpLmNyZWF0ZUltYWdlRGVwb3QoKTsNCi0gICAgICAgIEltYWdlIGltYWdlID0gbnVsbDsNCi0gICAgICAgIA0KLSAgICAgICAgcmVzZXRBdHRhY2htZW50VW5tYXJzaGFsbGluZ01vbml0b3IoKTsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgSW5wdXRTdHJlYW0gc3RyZWFtID0gKElucHV0U3RyZWFtKSBkYXRhLmdldENvbnRlbnQoKTsNCi0gICAgICAgICAgICBpbWFnZSA9IEltYWdlSU8ucmVhZChzdHJlYW0pOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIERhdGFTb3VyY2UgaW1hZ2VEUyA9IG5ldyBEYXRhU291cmNlSW1wbCgiaW1hZ2UvanBlZyIsICJ0ZXN0LmpwZyIsIGltYWdlKTsNCi0gICAgICAgICAgICBEYXRhSGFuZGxlciBoYW5kbGVyID0gbmV3IERhdGFIYW5kbGVyKGltYWdlRFMpOw0KLSAgICAgICAgICAgIG91dHB1dC5zZXRJbWFnZURhdGEoaGFuZGxlcik7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBvdXRwdXQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEltYWdlRGVwb3Qgc2VuZFRleHQoYnl0ZVtdIGlucHV0KSB7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiW25ldyBzZW5kVGV4dCByZXF1ZXN0IHJlY2VpdmVkXSIpOw0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFJlc2V0IHRoZSBtb25pdG9yIHNvIHRoYXQgd2UgY2FuIGRldGVybWluZSBpZiBhbg0KLSAgICAgKiBhdHRhY2htZW50IGlzIHVubWFyc2hhbGxlZCBvbiB0aGUgcmVzcG9uc2UuDQotICAgICAqLw0KLSAgICBwcml2YXRlIHZvaWQgcmVzZXRBdHRhY2htZW50VW5tYXJzaGFsbGluZ01vbml0b3IoKSB7DQotICAgICAgICBpZiAoSkFYQkF0dGFjaG1lbnRVbm1hcnNoYWxsZXJNb25pdG9yLmlzTW9uaXRvcmluZygpKSB7DQotICAgICAgICAgICAgSkFYQkF0dGFjaG1lbnRVbm1hcnNoYWxsZXJNb25pdG9yLmNsZWFyKCk7DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9tdG9tL010b21TYW1wbGVNVE9NRGlzYWJsZTJTZXJ2aWNlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL210b20vTXRvbVNhbXBsZU1UT01EaXNhYmxlMlNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmIyNmM3ZC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL210b20vTXRvbVNhbXBsZU1UT01EaXNhYmxlMlNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLm10b207DQotDQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YXNvdXJjZS5qYXhiLkpBWEJBdHRhY2htZW50VW5tYXJzaGFsbGVyTW9uaXRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5UZXN0TG9nZ2VyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnByb3ZpZGVyLkRhdGFTb3VyY2VJbXBsOw0KLWltcG9ydCBvcmcudGVzdC5tdG9tLkltYWdlRGVwb3Q7DQotaW1wb3J0IG9yZy50ZXN0Lm10b20uT2JqZWN0RmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YXguYWN0aXZhdGlvbi5EYXRhSGFuZGxlcjsNCi1pbXBvcnQgamF2YXguYWN0aXZhdGlvbi5EYXRhU291cmNlOw0KLWltcG9ydCBqYXZheC5pbWFnZWlvLkltYWdlSU87DQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuQmluZGluZ1R5cGU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5NVE9NOw0KLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5TT0FQQmluZGluZzsNCi1pbXBvcnQgamF2YS5hd3QuKjsNCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsNCi0NCi0vKioNCi0gKiBUaGUgYmluZGluZyBpbmRpY2F0ZXMgTVRPTSwgYnV0IEBNVE9NIGluZGljYXRlcyBlbmFibGVkPWZhbHNlDQotICogVGh1cyBubyBNVE9NLg0KLSAqLw0KLUBXZWJTZXJ2aWNlKHNlcnZpY2VOYW1lPSJNdG9tU2FtcGxlU2VydmljZSIsDQotCSAgICBlbmRwb2ludEludGVyZmFjZT0ib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUubXRvbS5NdG9tU2FtcGxlIikNCi1AQmluZGluZ1R5cGUoU09BUEJpbmRpbmcuU09BUDExSFRUUF9NVE9NX0JJTkRJTkcpDQotQE1UT00oZW5hYmxlZD1mYWxzZSkNCi1wdWJsaWMgY2xhc3MgTXRvbVNhbXBsZU1UT01EaXNhYmxlMlNlcnZpY2UgaW1wbGVtZW50cyBNdG9tU2FtcGxlIHsNCi0NCi0gICAgcHVibGljIEltYWdlRGVwb3Qgc2VuZEltYWdlKEltYWdlRGVwb3QgaW5wdXQpIHsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJNdG9tU2FtcGxlTVRPTURpc2FibGUyU2VydmljZSBbbmV3IHNlbmRJbWFnZSByZXF1ZXN0IHJlY2VpdmVkXSIpOw0KLSAgICAgICAgRGF0YUhhbmRsZXIgZGF0YSA9IGlucHV0LmdldEltYWdlRGF0YSgpOw0KLQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIltjb250ZW50VHlwZV0gIiArIGRhdGEuZ2V0Q29udGVudFR5cGUoKSk7DQotICAgICAgICBJbWFnZURlcG90IG91dHB1dCA9IChuZXcgT2JqZWN0RmFjdG9yeSgpKS5jcmVhdGVJbWFnZURlcG90KCk7DQotICAgICAgICBJbWFnZSBpbWFnZSA9IG51bGw7DQotICAgICAgICANCi0gICAgICAgIHJlc2V0QXR0YWNobWVudFVubWFyc2hhbGxpbmdNb25pdG9yKCk7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIElucHV0U3RyZWFtIHN0cmVhbSA9IChJbnB1dFN0cmVhbSkgZGF0YS5nZXRDb250ZW50KCk7DQotICAgICAgICAgICAgaW1hZ2UgPSBJbWFnZUlPLnJlYWQoc3RyZWFtKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBEYXRhU291cmNlIGltYWdlRFMgPSBuZXcgRGF0YVNvdXJjZUltcGwoImltYWdlL2pwZWciLCAidGVzdC5qcGciLCBpbWFnZSk7DQotICAgICAgICAgICAgRGF0YUhhbmRsZXIgaGFuZGxlciA9IG5ldyBEYXRhSGFuZGxlcihpbWFnZURTKTsNCi0gICAgICAgICAgICBvdXRwdXQuc2V0SW1hZ2VEYXRhKGhhbmRsZXIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oZSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gb3V0cHV0Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBJbWFnZURlcG90IHNlbmRUZXh0KGJ5dGVbXSBpbnB1dCkgew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIltuZXcgc2VuZFRleHQgcmVxdWVzdCByZWNlaXZlZF0iKTsNCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBSZXNldCB0aGUgbW9uaXRvciBzbyB0aGF0IHdlIGNhbiBkZXRlcm1pbmUgaWYgYW4NCi0gICAgICogYXR0YWNobWVudCBpcyB1bm1hcnNoYWxsZWQgb24gdGhlIHJlc3BvbnNlLg0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSB2b2lkIHJlc2V0QXR0YWNobWVudFVubWFyc2hhbGxpbmdNb25pdG9yKCkgew0KLSAgICAgICAgaWYgKEpBWEJBdHRhY2htZW50VW5tYXJzaGFsbGVyTW9uaXRvci5pc01vbml0b3JpbmcoKSkgew0KLSAgICAgICAgICAgIEpBWEJBdHRhY2htZW50VW5tYXJzaGFsbGVyTW9uaXRvci5jbGVhcigpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvbXRvbS9NdG9tU2FtcGxlTVRPTURpc2FibGVTZXJ2aWNlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL210b20vTXRvbVNhbXBsZU1UT01EaXNhYmxlU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODBmMzg4Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvbXRvbS9NdG9tU2FtcGxlTVRPTURpc2FibGVTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5tdG9tOw0KLQ0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFzb3VyY2UuamF4Yi5KQVhCQXR0YWNobWVudFVubWFyc2hhbGxlck1vbml0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuVGVzdExvZ2dlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm92aWRlci5EYXRhU291cmNlSW1wbDsNCi1pbXBvcnQgb3JnLnRlc3QubXRvbS5JbWFnZURlcG90Ow0KLWltcG9ydCBvcmcudGVzdC5tdG9tLk9iamVjdEZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXI7DQotaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRGF0YVNvdXJjZTsNCi1pbXBvcnQgamF2YXguaW1hZ2Vpby5JbWFnZUlPOw0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLkJpbmRpbmdUeXBlOw0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuTVRPTTsNCi1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuU09BUEJpbmRpbmc7DQotaW1wb3J0IGphdmEuYXd0Lio7DQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07DQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07DQotDQotDQotLyoqDQotICogRW5kcG9pbnQgd2l0aCBNVE9NIGRpc2FibGVkDQotICovDQotQFdlYlNlcnZpY2Uoc2VydmljZU5hbWU9Ik10b21TYW1wbGVTZXJ2aWNlIiwNCi0JICAgIGVuZHBvaW50SW50ZXJmYWNlPSJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5tdG9tLk10b21TYW1wbGUiKQ0KLS8vQEJpbmRpbmdUeXBlKFNPQVBCaW5kaW5nLlNPQVAxMUhUVFBfTVRPTV9CSU5ESU5HKQ0KLUBNVE9NKGVuYWJsZWQ9ZmFsc2UpDQotcHVibGljIGNsYXNzIE10b21TYW1wbGVNVE9NRGlzYWJsZVNlcnZpY2UgaW1wbGVtZW50cyBNdG9tU2FtcGxlIHsNCi0NCi0gICAgcHVibGljIEltYWdlRGVwb3Qgc2VuZEltYWdlKEltYWdlRGVwb3QgaW5wdXQpIHsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJNdG9tU2FtcGxlTVRPTURpc2FibGVTZXJ2aWNlIFtuZXcgc2VuZEltYWdlIHJlcXVlc3QgcmVjZWl2ZWRdIik7DQotICAgICAgICBEYXRhSGFuZGxlciBkYXRhID0gaW5wdXQuZ2V0SW1hZ2VEYXRhKCk7DQotDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiW2NvbnRlbnRUeXBlXSAiICsgZGF0YS5nZXRDb250ZW50VHlwZSgpKTsNCi0gICAgICAgIEltYWdlRGVwb3Qgb3V0cHV0ID0gKG5ldyBPYmplY3RGYWN0b3J5KCkpLmNyZWF0ZUltYWdlRGVwb3QoKTsNCi0gICAgICAgIEltYWdlIGltYWdlID0gbnVsbDsNCi0gICAgICAgIA0KLSAgICAgICAgcmVzZXRBdHRhY2htZW50VW5tYXJzaGFsbGluZ01vbml0b3IoKTsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgSW5wdXRTdHJlYW0gc3RyZWFtID0gKElucHV0U3RyZWFtKSBkYXRhLmdldENvbnRlbnQoKTsNCi0gICAgICAgICAgICBpbWFnZSA9IEltYWdlSU8ucmVhZChzdHJlYW0pOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIERhdGFTb3VyY2UgaW1hZ2VEUyA9IG5ldyBEYXRhU291cmNlSW1wbCgiaW1hZ2UvanBlZyIsICJ0ZXN0LmpwZyIsIGltYWdlKTsNCi0gICAgICAgICAgICBEYXRhSGFuZGxlciBoYW5kbGVyID0gbmV3IERhdGFIYW5kbGVyKGltYWdlRFMpOw0KLSAgICAgICAgICAgIG91dHB1dC5zZXRJbWFnZURhdGEoaGFuZGxlcik7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBvdXRwdXQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEltYWdlRGVwb3Qgc2VuZFRleHQoYnl0ZVtdIGlucHV0KSB7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiW25ldyBzZW5kVGV4dCByZXF1ZXN0IHJlY2VpdmVkXSIpOw0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFJlc2V0IHRoZSBtb25pdG9yIHNvIHRoYXQgd2UgY2FuIGRldGVybWluZSBpZiBhbg0KLSAgICAgKiBhdHRhY2htZW50IGlzIHVubWFyc2hhbGxlZCBvbiB0aGUgcmVzcG9uc2UuDQotICAgICAqLw0KLSAgICBwcml2YXRlIHZvaWQgcmVzZXRBdHRhY2htZW50VW5tYXJzaGFsbGluZ01vbml0b3IoKSB7DQotICAgICAgICBpZiAoSkFYQkF0dGFjaG1lbnRVbm1hcnNoYWxsZXJNb25pdG9yLmlzTW9uaXRvcmluZygpKSB7DQotICAgICAgICAgICAgSkFYQkF0dGFjaG1lbnRVbm1hcnNoYWxsZXJNb25pdG9yLmNsZWFyKCk7DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9tdG9tL010b21TYW1wbGVNVE9NRW5hYmxlU2VydmljZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9tdG9tL010b21TYW1wbGVNVE9NRW5hYmxlU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OGIyNWJlLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvbXRvbS9NdG9tU2FtcGxlTVRPTUVuYWJsZVNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLm10b207DQotDQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YXNvdXJjZS5qYXhiLkpBWEJBdHRhY2htZW50VW5tYXJzaGFsbGVyTW9uaXRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5UZXN0TG9nZ2VyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnByb3ZpZGVyLkRhdGFTb3VyY2VJbXBsOw0KLWltcG9ydCBvcmcudGVzdC5tdG9tLkltYWdlRGVwb3Q7DQotaW1wb3J0IG9yZy50ZXN0Lm10b20uT2JqZWN0RmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YXguYWN0aXZhdGlvbi5EYXRhSGFuZGxlcjsNCi1pbXBvcnQgamF2YXguYWN0aXZhdGlvbi5EYXRhU291cmNlOw0KLWltcG9ydCBqYXZheC5pbWFnZWlvLkltYWdlSU87DQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuQmluZGluZ1R5cGU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5NVE9NOw0KLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5TT0FQQmluZGluZzsNCi1pbXBvcnQgamF2YS5hd3QuKjsNCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsNCi0NCi0vKioNCi0gKiBFbmRwb2ludCB3aXRoIE1UT00gZW5hYmxlZA0KLSAqLw0KLUBXZWJTZXJ2aWNlKHNlcnZpY2VOYW1lPSJNdG9tU2FtcGxlU2VydmljZSIsDQotCSAgICBlbmRwb2ludEludGVyZmFjZT0ib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUubXRvbS5NdG9tU2FtcGxlIikNCi0vL0BCaW5kaW5nVHlwZShTT0FQQmluZGluZy5TT0FQMTFIVFRQX01UT01fQklORElORykNCi1ATVRPTShlbmFibGVkPXRydWUpDQotcHVibGljIGNsYXNzIE10b21TYW1wbGVNVE9NRW5hYmxlU2VydmljZSBpbXBsZW1lbnRzIE10b21TYW1wbGUgew0KLQ0KLSAgICBwdWJsaWMgSW1hZ2VEZXBvdCBzZW5kSW1hZ2UoSW1hZ2VEZXBvdCBpbnB1dCkgew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIk10b21TYW1wbGVNVE9NRW5hYmxlU2VydmljZSBbbmV3IHNlbmRJbWFnZSByZXF1ZXN0IHJlY2VpdmVkXSIpOw0KLSAgICAgICAgRGF0YUhhbmRsZXIgZGF0YSA9IGlucHV0LmdldEltYWdlRGF0YSgpOw0KLQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIltjb250ZW50VHlwZV0gIiArIGRhdGEuZ2V0Q29udGVudFR5cGUoKSk7DQotICAgICAgICBJbWFnZURlcG90IG91dHB1dCA9IChuZXcgT2JqZWN0RmFjdG9yeSgpKS5jcmVhdGVJbWFnZURlcG90KCk7DQotICAgICAgICBJbWFnZSBpbWFnZSA9IG51bGw7DQotICAgICAgICANCi0gICAgICAgIHJlc2V0QXR0YWNobWVudFVubWFyc2hhbGxpbmdNb25pdG9yKCk7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIElucHV0U3RyZWFtIHN0cmVhbSA9IChJbnB1dFN0cmVhbSkgZGF0YS5nZXRDb250ZW50KCk7DQotICAgICAgICAgICAgaW1hZ2UgPSBJbWFnZUlPLnJlYWQoc3RyZWFtKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBEYXRhU291cmNlIGltYWdlRFMgPSBuZXcgRGF0YVNvdXJjZUltcGwoImltYWdlL2pwZWciLCAidGVzdC5qcGciLCBpbWFnZSk7DQotICAgICAgICAgICAgRGF0YUhhbmRsZXIgaGFuZGxlciA9IG5ldyBEYXRhSGFuZGxlcihpbWFnZURTKTsNCi0gICAgICAgICAgICBvdXRwdXQuc2V0SW1hZ2VEYXRhKGhhbmRsZXIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oZSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gb3V0cHV0Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBJbWFnZURlcG90IHNlbmRUZXh0KGJ5dGVbXSBpbnB1dCkgew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIltuZXcgc2VuZFRleHQgcmVxdWVzdCByZWNlaXZlZF0iKTsNCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBSZXNldCB0aGUgbW9uaXRvciBzbyB0aGF0IHdlIGNhbiBkZXRlcm1pbmUgaWYgYW4NCi0gICAgICogYXR0YWNobWVudCBpcyB1bm1hcnNoYWxsZWQgb24gdGhlIHJlc3BvbnNlLg0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSB2b2lkIHJlc2V0QXR0YWNobWVudFVubWFyc2hhbGxpbmdNb25pdG9yKCkgew0KLSAgICAgICAgaWYgKEpBWEJBdHRhY2htZW50VW5tYXJzaGFsbGVyTW9uaXRvci5pc01vbml0b3JpbmcoKSkgew0KLSAgICAgICAgICAgIEpBWEJBdHRhY2htZW50VW5tYXJzaGFsbGVyTW9uaXRvci5jbGVhcigpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvbXRvbS9NdG9tU2FtcGxlTVRPTVRocmVzaG9sZFNlcnZpY2UuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvbXRvbS9NdG9tU2FtcGxlTVRPTVRocmVzaG9sZFNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGE2MTE2ZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL210b20vTXRvbVNhbXBsZU1UT01UaHJlc2hvbGRTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5tdG9tOw0KLQ0KLWltcG9ydCBqYXZhLmF3dC5JbWFnZTsNCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsNCi0NCi1pbXBvcnQgamF2YXguYWN0aXZhdGlvbi5EYXRhSGFuZGxlcjsNCi1pbXBvcnQgamF2YXguYWN0aXZhdGlvbi5EYXRhU291cmNlOw0KLWltcG9ydCBqYXZheC5pbWFnZWlvLkltYWdlSU87DQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuTVRPTTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhc291cmNlLmpheGIuSkFYQkF0dGFjaG1lbnRVbm1hcnNoYWxsZXJNb25pdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLlRlc3RMb2dnZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJvdmlkZXIuRGF0YVNvdXJjZUltcGw7DQotaW1wb3J0IG9yZy50ZXN0Lm10b20uSW1hZ2VEZXBvdDsNCi1pbXBvcnQgb3JnLnRlc3QubXRvbS5PYmplY3RGYWN0b3J5Ow0KLS8qKg0KLSAqIEVuZHBvaW50IHdpdGggTVRPTSBlbmFibGVkIGFuZCBUaHJlc2hvbGQgc2V0IHRvIHNpemUgYmlnZ2VyIHRoYW4gdGhlIGF0dGFjaG1lbnQgc2l6ZS4NCi0gKiBUaGUgcmVzcG9uc2UgZnJvbSBTZXJ2ZXIgc2hvdWxkIGhhdmUgYXR0YWNobWVudHMgaW5saW5lZC4NCi0gKi8NCi1AV2ViU2VydmljZShzZXJ2aWNlTmFtZT0iTXRvbVNhbXBsZVNlcnZpY2UiLA0KLQkgICAgZW5kcG9pbnRJbnRlcmZhY2U9Im9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLm10b20uTXRvbVNhbXBsZSIpDQotQE1UT00oZW5hYmxlZD10cnVlLCB0aHJlc2hvbGQ9OTkwMDApDQotcHVibGljIGNsYXNzIE10b21TYW1wbGVNVE9NVGhyZXNob2xkU2VydmljZSBpbXBsZW1lbnRzIE10b21TYW1wbGUgew0KLQ0KLSAgICBwdWJsaWMgSW1hZ2VEZXBvdCBzZW5kSW1hZ2UoSW1hZ2VEZXBvdCBpbnB1dCkgew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIk10b21TYW1wbGVNVE9NRW5hYmxlU2VydmljZSBbbmV3IHNlbmRJbWFnZSByZXF1ZXN0IHJlY2VpdmVkXSIpOw0KLSAgICAgICAgRGF0YUhhbmRsZXIgZGF0YSA9IGlucHV0LmdldEltYWdlRGF0YSgpOw0KLQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIltjb250ZW50VHlwZV0gIiArIGRhdGEuZ2V0Q29udGVudFR5cGUoKSk7DQotICAgICAgICBJbWFnZURlcG90IG91dHB1dCA9IChuZXcgT2JqZWN0RmFjdG9yeSgpKS5jcmVhdGVJbWFnZURlcG90KCk7DQotICAgICAgICBJbWFnZSBpbWFnZSA9IG51bGw7DQotICAgICAgICANCi0gICAgICAgIHJlc2V0QXR0YWNobWVudFVubWFyc2hhbGxpbmdNb25pdG9yKCk7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIElucHV0U3RyZWFtIHN0cmVhbSA9IChJbnB1dFN0cmVhbSkgZGF0YS5nZXRDb250ZW50KCk7DQotICAgICAgICAgICAgaW1hZ2UgPSBJbWFnZUlPLnJlYWQoc3RyZWFtKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBEYXRhU291cmNlIGltYWdlRFMgPSBuZXcgRGF0YVNvdXJjZUltcGwoImltYWdlL2pwZWciLCAidGVzdC5qcGciLCBpbWFnZSk7DQotICAgICAgICAgICAgRGF0YUhhbmRsZXIgaGFuZGxlciA9IG5ldyBEYXRhSGFuZGxlcihpbWFnZURTKTsNCi0gICAgICAgICAgICBvdXRwdXQuc2V0SW1hZ2VEYXRhKGhhbmRsZXIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oZSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gb3V0cHV0Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBJbWFnZURlcG90IHNlbmRUZXh0KGJ5dGVbXSBpbnB1dCkgew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIltuZXcgc2VuZFRleHQgcmVxdWVzdCByZWNlaXZlZF0iKTsNCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBSZXNldCB0aGUgbW9uaXRvciBzbyB0aGF0IHdlIGNhbiBkZXRlcm1pbmUgaWYgYW4NCi0gICAgICogYXR0YWNobWVudCBpcyB1bm1hcnNoYWxsZWQgb24gdGhlIHJlc3BvbnNlLg0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSB2b2lkIHJlc2V0QXR0YWNobWVudFVubWFyc2hhbGxpbmdNb25pdG9yKCkgew0KLSAgICAgICAgaWYgKEpBWEJBdHRhY2htZW50VW5tYXJzaGFsbGVyTW9uaXRvci5pc01vbml0b3JpbmcoKSkgew0KLSAgICAgICAgICAgIEpBWEJBdHRhY2htZW50VW5tYXJzaGFsbGVyTW9uaXRvci5jbGVhcigpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvbXRvbS9NdG9tU2FtcGxlUHJvdmlkZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvbXRvbS9NdG9tU2FtcGxlUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZlMGI2ZC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL210b20vTXRvbVNhbXBsZVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5tdG9tOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLlRlc3RMb2dnZXI7DQotDQotaW1wb3J0IGphdmF4LnhtbC53cy5Qcm92aWRlcjsNCi0NCi1wdWJsaWMgY2xhc3MgTXRvbVNhbXBsZVByb3ZpZGVyIGltcGxlbWVudHMgUHJvdmlkZXI8U3RyaW5nPiB7DQotDQotICAgIHB1YmxpYyBTdHJpbmcgaW52b2tlKFN0cmluZyBpbnB1dCkgew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IGlucHV0WyIgKyBpbnB1dCArICJdIik7DQotICAgICAgICByZXR1cm4gaW5wdXQ7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9tdG9tL010b21TYW1wbGVTZXJ2aWNlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL210b20vTXRvbVNhbXBsZVNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDYxZGE2Zi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL210b20vTXRvbVNhbXBsZVNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLm10b207DQotDQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YXNvdXJjZS5qYXhiLkpBWEJBdHRhY2htZW50VW5tYXJzaGFsbGVyTW9uaXRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5UZXN0TG9nZ2VyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnByb3ZpZGVyLkRhdGFTb3VyY2VJbXBsOw0KLWltcG9ydCBvcmcudGVzdC5tdG9tLkltYWdlRGVwb3Q7DQotaW1wb3J0IG9yZy50ZXN0Lm10b20uT2JqZWN0RmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YXguYWN0aXZhdGlvbi5EYXRhSGFuZGxlcjsNCi1pbXBvcnQgamF2YXguYWN0aXZhdGlvbi5EYXRhU291cmNlOw0KLWltcG9ydCBqYXZheC5pbWFnZWlvLkltYWdlSU87DQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuQmluZGluZ1R5cGU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5NVE9NOw0KLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5TT0FQQmluZGluZzsNCi1pbXBvcnQgamF2YS5hd3QuKjsNCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsNCi0NCi1AV2ViU2VydmljZShzZXJ2aWNlTmFtZT0iTXRvbVNhbXBsZVNlcnZpY2UiLA0KLQkgICAgZW5kcG9pbnRJbnRlcmZhY2U9Im9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLm10b20uTXRvbVNhbXBsZSIpDQotQEJpbmRpbmdUeXBlKFNPQVBCaW5kaW5nLlNPQVAxMUhUVFBfTVRPTV9CSU5ESU5HKQ0KLXB1YmxpYyBjbGFzcyBNdG9tU2FtcGxlU2VydmljZSBpbXBsZW1lbnRzIE10b21TYW1wbGUgew0KLQ0KLSAgICBwdWJsaWMgSW1hZ2VEZXBvdCBzZW5kSW1hZ2UoSW1hZ2VEZXBvdCBpbnB1dCkgew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIk10b21TYW1wbGVTZXJ2aWNlIFtuZXcgc2VuZEltYWdlIHJlcXVlc3QgcmVjZWl2ZWRdIik7DQotICAgICAgICBEYXRhSGFuZGxlciBkYXRhID0gaW5wdXQuZ2V0SW1hZ2VEYXRhKCk7DQotDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiW2NvbnRlbnRUeXBlXSAiICsgZGF0YS5nZXRDb250ZW50VHlwZSgpKTsNCi0gICAgICAgIEltYWdlRGVwb3Qgb3V0cHV0ID0gKG5ldyBPYmplY3RGYWN0b3J5KCkpLmNyZWF0ZUltYWdlRGVwb3QoKTsNCi0gICAgICAgIEltYWdlIGltYWdlID0gbnVsbDsNCi0gICAgICAgIA0KLSAgICAgICAgcmVzZXRBdHRhY2htZW50VW5tYXJzaGFsbGluZ01vbml0b3IoKTsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgSW5wdXRTdHJlYW0gc3RyZWFtID0gKElucHV0U3RyZWFtKSBkYXRhLmdldENvbnRlbnQoKTsNCi0gICAgICAgICAgICBpbWFnZSA9IEltYWdlSU8ucmVhZChzdHJlYW0pOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIERhdGFTb3VyY2UgaW1hZ2VEUyA9IG5ldyBEYXRhU291cmNlSW1wbCgiaW1hZ2UvanBlZyIsICJ0ZXN0LmpwZyIsIGltYWdlKTsNCi0gICAgICAgICAgICBEYXRhSGFuZGxlciBoYW5kbGVyID0gbmV3IERhdGFIYW5kbGVyKGltYWdlRFMpOw0KLSAgICAgICAgICAgIG91dHB1dC5zZXRJbWFnZURhdGEoaGFuZGxlcik7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBvdXRwdXQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEltYWdlRGVwb3Qgc2VuZFRleHQoYnl0ZVtdIGlucHV0KSB7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiW25ldyBzZW5kVGV4dCByZXF1ZXN0IHJlY2VpdmVkXSIpOw0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFJlc2V0IHRoZSBtb25pdG9yIHNvIHRoYXQgd2UgY2FuIGRldGVybWluZSBpZiBhbg0KLSAgICAgKiBhdHRhY2htZW50IGlzIHVubWFyc2hhbGxlZCBvbiB0aGUgcmVzcG9uc2UuDQotICAgICAqLw0KLSAgICBwcml2YXRlIHZvaWQgcmVzZXRBdHRhY2htZW50VW5tYXJzaGFsbGluZ01vbml0b3IoKSB7DQotICAgICAgICBpZiAoSkFYQkF0dGFjaG1lbnRVbm1hcnNoYWxsZXJNb25pdG9yLmlzTW9uaXRvcmluZygpKSB7DQotICAgICAgICAgICAgSkFYQkF0dGFjaG1lbnRVbm1hcnNoYWxsZXJNb25pdG9yLmNsZWFyKCk7DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9tdG9tMS9NRVRBLUlORi9zYW1wbGVtdG9tanBlZy53c2RsIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9tdG9tMS9NRVRBLUlORi9zYW1wbGVtdG9tanBlZy53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTk4ZjEyLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvbXRvbTEvTUVUQS1JTkYvc2FtcGxlbXRvbWpwZWcud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTwhLS0NCi1OYW1lOiBzYW1wbGVtdG9tanBlZy53c2RsDQotLS0+DQotPGRlZmluaXRpb25zIHhtbG5zOmh0dHA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvaHR0cC8iIA0KLSAgICB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiANCi0gICAgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiANCi0gICAgeG1sbnM6c29hcGVuYz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iICANCi0gICAgeG1sbnM6bWltZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9taW1lLyIgDQotICAgIHhtbG5zOnMwPSJ1cm46Ly9tdG9tMS5zYW1wbGUuamF4d3MuYXhpczIuYXBhY2hlLm9yZyINCi0gICAgdGFyZ2V0TmFtZXNwYWNlPSJ1cm46Ly9tdG9tMS5zYW1wbGUuamF4d3MuYXhpczIuYXBhY2hlLm9yZyINCi0gICAgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4NCi0gICAgDQotICA8dHlwZXM+DQotICAgPHhzOnNjaGVtYSBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCINCi0gICAgeG1sbnM6eG1pbWU9Imh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDUveG1sbWltZSINCi0gICAgeG1sbnM6dG5zPSJ1cm46Ly9tdG9tMS5zYW1wbGUuamF4d3MuYXhpczIuYXBhY2hlLm9yZyINCi0gICAgdGFyZ2V0TmFtZXNwYWNlPSJ1cm46Ly9tdG9tMS5zYW1wbGUuamF4d3MuYXhpczIuYXBhY2hlLm9yZyI+DQotICAgIA0KLSAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iSW1hZ2VEZXBvdCI+DQotICAgICAgIDx4czpzZXF1ZW5jZT4NCi0gICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9ImltYWdlRGF0YSIgDQotICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4czpiYXNlNjRCaW5hcnkiICAgICAgICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgICAgICAgICB4bWltZTpleHBlY3RlZENvbnRlbnRUeXBlcz0iaW1hZ2UvanBlZyIvPg0KLSAgICAgICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InRleHREYXRhIiANCi0gICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhtaW1lOmJhc2U2NEJpbmFyeSIgICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgICAgICAgIHhtaW1lOmNvbnRlbnRUeXBlPSJ0ZXh0L3htbCIvPg0KLSAgICAgICAgICANCi0gICAgICAgPC94czpzZXF1ZW5jZT4NCi0gICAgPC94czpjb21wbGV4VHlwZT4NCi0gICAgDQotICAgIDx4czplbGVtZW50IG5hbWU9Imludm9rZSI+DQotICAgICAgIDx4czpjb21wbGV4VHlwZT4NCi0gICAgICAgICAgPHhzOnNlcXVlbmNlPg0KLSAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0iaW5wdXQiIHR5cGU9InRuczpJbWFnZURlcG90Ii8+DQotICAgICAgICAgIDwveHM6c2VxdWVuY2U+DQotICAgICAgIDwveHM6Y29tcGxleFR5cGU+DQotICAgIDwveHM6ZWxlbWVudD4NCi0gICAgDQotICAgIDx4czplbGVtZW50IG5hbWU9InNlbmRJbWFnZVJlc3BvbnNlIj4NCi0gICAgICAgPHhzOmNvbXBsZXhUeXBlPg0KLSAgICAgICAgICA8eHM6c2VxdWVuY2U+DQotICAgICAgICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJvdXRwdXQiIHR5cGU9InRuczpJbWFnZURlcG90Ii8+DQotICAgICAgICAgIDwveHM6c2VxdWVuY2U+DQotICAgICAgIDwveHM6Y29tcGxleFR5cGU+DQotICAgIDwveHM6ZWxlbWVudD4NCi0gICAgDQotICAgPC94czpzY2hlbWE+DQotICA8L3R5cGVzPg0KLQ0KLSAgPG1lc3NhZ2UgbmFtZT0iZW1wdHlNZXNzYWdlIi8+DQotICA8bWVzc2FnZSBuYW1lPSJzZW5kSW1hZ2UiPg0KLSAgICA8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJzMDppbnZva2UiIC8+DQotICA8L21lc3NhZ2U+DQotICA8bWVzc2FnZSBuYW1lPSJzZW5kSW1hZ2VSZXNwb25zZSI+DQotICAgIDxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9InMwOnNlbmRJbWFnZVJlc3BvbnNlIiAvPg0KLSAgPC9tZXNzYWdlPg0KLQ0KLSAgPHBvcnRUeXBlIG5hbWU9InNlbmRJbWFnZUludGVyZmFjZSI+DQotICAgIDxvcGVyYXRpb24gbmFtZT0iaW52b2tlIj4NCi0gICAgICA8aW5wdXQgbWVzc2FnZT0iczA6c2VuZEltYWdlIiAvPg0KLSAgICAgIDxvdXRwdXQgbWVzc2FnZT0iczA6c2VuZEltYWdlUmVzcG9uc2UiIC8+DQotICAgIDwvb3BlcmF0aW9uPiAgDQotICA8L3BvcnRUeXBlPg0KLQ0KLSAgPGJpbmRpbmcgbmFtZT0ic2VuZEltYWdlU29hcCIgdHlwZT0iczA6c2VuZEltYWdlSW50ZXJmYWNlIj4NCi0gICAgPHNvYXA6YmluZGluZyB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIgc3R5bGU9ImRvY3VtZW50IiAvPg0KLSAgICA8b3BlcmF0aW9uIG5hbWU9Imludm9rZSI+DQotICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249InNlbmRJbWFnZSIgc3R5bGU9ImRvY3VtZW50IiAvPg0KLSAgICAgIDxpbnB1dD4NCi0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPg0KLSAgICAgIDwvaW5wdXQ+DQotICAgICAgPG91dHB1dD4NCi0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPg0KLSAgICAgIDwvb3V0cHV0Pg0KLSAgICA8L29wZXJhdGlvbj4NCi0gIDwvYmluZGluZz4NCi0NCi0gIDxzZXJ2aWNlIG5hbWU9IlNlbmRJbWFnZVNlcnZpY2UiPg0KLSAgICA8cG9ydCBuYW1lPSJTZW5kSW1hZ2VQb3J0IiBiaW5kaW5nPSJzMDpzZW5kSW1hZ2VTb2FwIj4NCi0gICAgICA8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjkwODAvTVRPTUJ5dGVBcnJheS9TZW5kSW1hZ2VTZXJ2aWNlIiAvPg0KLSAgICA8L3BvcnQ+DQotICA8L3NlcnZpY2U+DQotDQotPC9kZWZpbml0aW9ucz4NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL210b20xL1NlbmRJbWFnZUludGVyZmFjZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9tdG9tMS9TZW5kSW1hZ2VJbnRlcmZhY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzAwNTliZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL210b20xL1NlbmRJbWFnZUludGVyZmFjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotDQotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUubXRvbTE7DQotDQotaW1wb3J0IGphdmF4Lmp3cy5XZWJNZXRob2Q7DQotaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbTsNCi1pbXBvcnQgamF2YXguandzLldlYlJlc3VsdDsNCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5SZXF1ZXN0V3JhcHBlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLlJlc3BvbnNlV3JhcHBlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247DQotDQotDQotLyoqDQotICogVGhpcyBjbGFzcyB3YXMgZ2VuZXJhdGVkIGJ5IHRoZSBKQVhXUyBTSS4NCi0gKiBKQVgtV1MgUkkgMi4wXzAxLWIxNS1mY3MNCi0gKiBHZW5lcmF0ZWQgc291cmNlIHZlcnNpb246IDIuMA0KLSAqIA0KLSAqLw0KLUBXZWJTZXJ2aWNlKG5hbWUgPSAic2VuZEltYWdlSW50ZXJmYWNlIiwgDQotLy8JCXRhcmdldE5hbWVzcGFjZT0iaHR0cDovL210b20xLnNhbXBsZS5qYXh3cy5heGlzMi5hcGFjaGUub3JnIikNCi0JCSAgICB0YXJnZXROYW1lc3BhY2UgPSAidXJuOi8vbXRvbTEuc2FtcGxlLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciKQ0KLQkvLwkgICAgd3NkbExvY2F0aW9uID0gIk1FVEEtSU5GL3NhbXBsZW10b21qcGVnLndzZGwiKQ0KLXB1YmxpYyBpbnRlcmZhY2UgU2VuZEltYWdlSW50ZXJmYWNlIHsNCi0NCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gaW5wdXQNCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5tdG9tMS5JbWFnZURlcG90DQotICAgICAqLw0KLSAgICBAV2ViTWV0aG9kKGFjdGlvbiA9ICJzZW5kSW1hZ2UiKQ0KLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAib3V0cHV0IiwgdGFyZ2V0TmFtZXNwYWNlID0gInVybjovL210b20xLnNhbXBsZS5qYXh3cy5heGlzMi5hcGFjaGUub3JnIikNCi0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJpbnZva2UiLCB0YXJnZXROYW1lc3BhY2UgPSAidXJuOi8vbXRvbTEuc2FtcGxlLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciLCBjbGFzc05hbWUgPSAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUubXRvbTEuSW52b2tlIikNCi0gICAgQFJlc3BvbnNlV3JhcHBlcihsb2NhbE5hbWUgPSAic2VuZEltYWdlUmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAidXJuOi8vbXRvbTEuc2FtcGxlLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciLCBjbGFzc05hbWUgPSAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUubXRvbTEuU2VuZEltYWdlUmVzcG9uc2UiKQ0KLSAgICBwdWJsaWMgSW1hZ2VEZXBvdCBpbnZva2UoDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJpbnB1dCIsIHRhcmdldE5hbWVzcGFjZSA9ICJ1cm46Ly9tdG9tMS5zYW1wbGUuamF4d3MuYXhpczIuYXBhY2hlLm9yZyIpDQotICAgICAgICBJbWFnZURlcG90IGlucHV0KSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbjsNCi0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9tdG9tMS9TZW5kSW1hZ2VTZXJ2aWNlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL210b20xL1NlbmRJbWFnZVNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWMwNzVjMC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL210b20xL1NlbmRJbWFnZVNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLQ0KLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLm10b20xOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLlRlc3RMb2dnZXI7DQotDQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuQmluZGluZ1R5cGU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5TT0FQQmluZGluZzsNCi0NCi0NCi0vKioNCi0gKiBBIEpBWEIgaW1wbGVtZW50YXRpb24NCi0gKg0KLSAqLw0KLQ0KLUBXZWJTZXJ2aWNlKA0KLQkJdGFyZ2V0TmFtZXNwYWNlID0gInVybjovL210b20xLnNhbXBsZS5qYXh3cy5heGlzMi5hcGFjaGUub3JnIiwNCi0JCXNlcnZpY2VOYW1lID0gIlNlbmRJbWFnZVNlcnZpY2UiLA0KLQkJcG9ydE5hbWUgPSAic2VuZEltYWdlUG9ydCIsCQkNCi0JCWVuZHBvaW50SW50ZXJmYWNlID0gIm9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLm10b20xLlNlbmRJbWFnZUludGVyZmFjZSIpDQotQEJpbmRpbmdUeXBlIChTT0FQQmluZGluZy5TT0FQMTFIVFRQX01UT01fQklORElORykJDQotcHVibGljIGNsYXNzIFNlbmRJbWFnZVNlcnZpY2UgaW1wbGVtZW50cyBTZW5kSW1hZ2VJbnRlcmZhY2Ugew0KLSANCi0JDQotICAgIC8qKg0KLSAgICAgKiBSZXF1aXJlZCBpbXBsIG1ldGhvZCBmcm9tIEpBWEIgaW50ZXJmYWNlDQotICAgICAqIA0KLSAgICAgKiAtIE5vIE1UT00gc2V0dGluZyB2aWEgQEJpbmRpbmdUeXBlDQotICAgICAqIC0gVXNpbmcgUEFZTE9BRCBtb2RlDQotICAgICAqIC0gU2VuZGluZyBiYWNrIHRoZSBzYW1lIG9iaiBpdCByZWNlaXZlZA0KLSAgICAgKiAtIFRoZSBKQVhCIG9iamVjdCBpcyBmb3IgaW1hZ2UvanBlZyBNSU1FIHR5cGUNCi0gICAgICoNCi0gICAgICogQHBhcmFtIEltYWdlRGVwb3Qgb2JqDQotICAgICAqIEByZXR1cm4gSW1hZ2VEZXBvdCBvYmoNCi0gICAgICovDQotICAgIHB1YmxpYyBJbWFnZURlcG90IGludm9rZShJbWFnZURlcG90IHJlcXVlc3QpIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIlNlbmRJbWFnZVNlcnZpY2UiKTsNCi0NCi0gICAgICAgaWYgKHJlcXVlc3QgPT0gbnVsbCkgew0KLSAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oIk51bGwgaW5wdXQgcmVjZWl2ZWQuIik7DQotICAgICAgIH0gZWxzZSBpZiAocmVxdWVzdC5nZXRJbWFnZURhdGEoKSA9PSBudWxsKSB7DQotICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbigiSW1hZ2UgaXMgbnVsbCIpOw0KLSAgICAgICB9DQotDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiU2VuZEltYWdlU2VydmljZTogUmVxdWVzdCByZWNlaXZlZC4iKTsNCi0gICAgICAgcmV0dXJuIHJlcXVlc3Q7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9ub253cmFwL0RvY0xpdE5vbldyYXBQb3J0VHlwZUltcGwuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvbm9ud3JhcC9Eb2NMaXROb25XcmFwUG9ydFR5cGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2MDE4Y2UuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9ub253cmFwL0RvY0xpdE5vbldyYXBQb3J0VHlwZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotLyoqDQotICogDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5ub253cmFwOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5ub253cmFwLnNlaS5Eb2NMaXROb25XcmFwUG9ydFR5cGU7DQotaW1wb3J0IG9yZy50ZXN0LnNhbXBsZS5ub253cmFwLk9iamVjdEZhY3Rvcnk7DQotaW1wb3J0IG9yZy50ZXN0LnNhbXBsZS5ub253cmFwLk9uZVdheTsNCi1pbXBvcnQgb3JnLnRlc3Quc2FtcGxlLm5vbndyYXAuT25lV2F5Vm9pZDsNCi1pbXBvcnQgb3JnLnRlc3Quc2FtcGxlLm5vbndyYXAuUmV0dXJuVHlwZTsNCi1pbXBvcnQgb3JnLnRlc3Quc2FtcGxlLm5vbndyYXAuVHdvV2F5Ow0KLWltcG9ydCBvcmcudGVzdC5zYW1wbGUubm9ud3JhcC5Ud29XYXlIb2xkZXI7DQotDQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuQXN5bmNIYW5kbGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuSG9sZGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuUmVzcG9uc2U7DQotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTsNCi0NCi1AV2ViU2VydmljZShzZXJ2aWNlTmFtZT0iRG9jTGl0Tm9uV3JhcFNlcnZpY2UiLA0KLQkJCWVuZHBvaW50SW50ZXJmYWNlPSJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5ub253cmFwLnNlaS5Eb2NMaXROb25XcmFwUG9ydFR5cGUiKQ0KLXB1YmxpYyBjbGFzcyBEb2NMaXROb25XcmFwUG9ydFR5cGVJbXBsIGltcGxlbWVudHMgRG9jTGl0Tm9uV3JhcFBvcnRUeXBlIHsNCi0NCi0JLyoqDQotCSAqIA0KLQkgKi8NCi0JcHVibGljIERvY0xpdE5vbldyYXBQb3J0VHlwZUltcGwoKSB7DQotCQlzdXBlcigpOw0KLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViDQotCX0NCi0NCi0JLyogKG5vbi1KYXZhZG9jKQ0KLQkgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLm5vbndyYXAuc2VpLkRvY0xpdE5vbldyYXBQb3J0VHlwZSNvbmVXYXlWb2lkKG9yZy50ZXN0LnNhbXBsZS5ub253cmFwLk9uZVdheVZvaWQpDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBvbmVXYXlWb2lkKE9uZVdheVZvaWQgYWxsQnlNeXNlbGYpIHsNCi0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWINCi0NCi0JfQ0KLQ0KLQkvKiAobm9uLUphdmFkb2MpDQotCSAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUubm9ud3JhcC5zZWkuRG9jTGl0Tm9uV3JhcFBvcnRUeXBlI29uZVdheShvcmcudGVzdC5zYW1wbGUubm9ud3JhcC5PbmVXYXkpDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBvbmVXYXkoT25lV2F5IGFsbEJ5TXlzZWxmKSB7DQotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViDQotDQotCX0NCi0NCi0JLyogKG5vbi1KYXZhZG9jKQ0KLQkgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLm5vbndyYXAuc2VpLkRvY0xpdE5vbldyYXBQb3J0VHlwZSN0d29XYXlIb2xkZXJBc3luYyhvcmcudGVzdC5zYW1wbGUubm9ud3JhcC5Ud29XYXlIb2xkZXIpDQotCSAqLw0KLQlwdWJsaWMgUmVzcG9uc2U8VHdvV2F5SG9sZGVyPiB0d29XYXlIb2xkZXJBc3luYyhUd29XYXlIb2xkZXIgYWxsQnlNeXNlbGYpIHsNCi0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWINCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCS8qIChub24tSmF2YWRvYykNCi0JICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5ub253cmFwLnNlaS5Eb2NMaXROb25XcmFwUG9ydFR5cGUjdHdvV2F5SG9sZGVyQXN5bmMob3JnLnRlc3Quc2FtcGxlLm5vbndyYXAuVHdvV2F5SG9sZGVyLCBqYXZheC54bWwud3MuQXN5bmNIYW5kbGVyKQ0KLQkgKi8NCi0JcHVibGljIEZ1dHVyZTw/PiB0d29XYXlIb2xkZXJBc3luYyhUd29XYXlIb2xkZXIgYWxsQnlNeXNlbGYsDQotCQkJQXN5bmNIYW5kbGVyPFR3b1dheUhvbGRlcj4gYXN5bmNIYW5kbGVyKSB7DQotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViDQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLQkvKiAobm9uLUphdmFkb2MpDQotCSAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUubm9ud3JhcC5zZWkuRG9jTGl0Tm9uV3JhcFBvcnRUeXBlI3R3b1dheUhvbGRlcihqYXZheC54bWwud3MuSG9sZGVyKQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgdHdvV2F5SG9sZGVyKEhvbGRlcjxUd29XYXlIb2xkZXI+IGFsbEJ5TXlzZWxmKSB7DQotCQkvL1RPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWINCi0JCVR3b1dheUhvbGRlciB0d2ggPSBhbGxCeU15c2VsZi52YWx1ZTsNCi0JCXR3aC5zZXRUd29XYXlIb2xkZXJJbnQoMTApOw0KLQkJdHdoLnNldFR3b1dheUhvbGRlclN0cigiUmVzcG9uc2UgU3RyaW5nIik7DQotDQotCX0NCi0NCi0JLyogKG5vbi1KYXZhZG9jKQ0KLQkgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLm5vbndyYXAuc2VpLkRvY0xpdE5vbldyYXBQb3J0VHlwZSN0d29XYXlBc3luYyhvcmcudGVzdC5zYW1wbGUubm9ud3JhcC5Ud29XYXkpDQotCSAqLw0KLQlwdWJsaWMgUmVzcG9uc2U8UmV0dXJuVHlwZT4gdHdvV2F5QXN5bmMoVHdvV2F5IGFsbEJ5TXlzZWxmKSB7DQotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViDQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLQkvKiAobm9uLUphdmFkb2MpDQotCSAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUubm9ud3JhcC5zZWkuRG9jTGl0Tm9uV3JhcFBvcnRUeXBlI3R3b1dheUFzeW5jKG9yZy50ZXN0LnNhbXBsZS5ub253cmFwLlR3b1dheSwgamF2YXgueG1sLndzLkFzeW5jSGFuZGxlcikNCi0JICovDQotCXB1YmxpYyBGdXR1cmU8Pz4gdHdvV2F5QXN5bmMoVHdvV2F5IGFsbEJ5TXlzZWxmLA0KLQkJCUFzeW5jSGFuZGxlcjxSZXR1cm5UeXBlPiBhc3luY0hhbmRsZXIpIHsNCi0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWINCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCS8qIChub24tSmF2YWRvYykNCi0JICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5ub253cmFwLnNlaS5Eb2NMaXROb25XcmFwUG9ydFR5cGUjdHdvV2F5KG9yZy50ZXN0LnNhbXBsZS5ub253cmFwLlR3b1dheSkNCi0JICovDQotCXB1YmxpYyBSZXR1cm5UeXBlIHR3b1dheShUd29XYXkgdHdvV2F5KSB7DQotCQkNCi0JCVN0cmluZyByZXF1ZXN0U3RyaW5nID0gdHdvV2F5LmdldFR3b3dheVN0cigpOw0KLQkJT2JqZWN0RmFjdG9yeSBvZiA9IG5ldyBPYmplY3RGYWN0b3J5KCk7DQotCQlSZXR1cm5UeXBlIHJ0ID0gb2YuY3JlYXRlUmV0dXJuVHlwZSgpOw0KLQkJcnQuc2V0UmV0dXJuU3RyKCJBY2tub3dsZWRnZW1lbnQgOiBSZXF1ZXN0IFN0cmluZyByZWNlaXZlZCA9ICIrIHJlcXVlc3RTdHJpbmcpOw0KLQkJDQotCQlyZXR1cm4gcnQ7DQotCX0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9ub253cmFwL01FVEEtSU5GL2RvY2xpdF9ub253cmFwLndzZGwgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL25vbndyYXAvTUVUQS1JTkYvZG9jbGl0X25vbndyYXAud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNjOWYzOS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL25vbndyYXAvTUVUQS1JTkYvZG9jbGl0X25vbndyYXAud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDIxNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLQ0KLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTx3c2RsOmRlZmluaXRpb25zIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIg0KLQl4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIg0KLQl4bWxuczp0bnM9Imh0dHA6Ly9ub253cmFwLnNhbXBsZS50ZXN0Lm9yZyINCi0JeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0icHJveHkiDQotCXRhcmdldE5hbWVzcGFjZT0iaHR0cDovL25vbndyYXAuc2FtcGxlLnRlc3Qub3JnIj4NCi0JDQotCTx3c2RsOnR5cGVzPg0KLQkJPHhzZDpzY2hlbWENCi0JCQl0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9ub253cmFwLnNhbXBsZS50ZXN0Lm9yZyINCi0JCQl4bWxuczp0bnM9Imh0dHA6Ly9ub253cmFwLnNhbXBsZS50ZXN0Lm9yZyINCi0JCQl4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4NCi0NCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iTXlGYXVsdCIgdHlwZT0ieHNkOnN0cmluZyIgLz4NCi0JCQkNCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0ib25lV2F5Vm9pZCI+DQotCQkJCTx4c2Q6Y29tcGxleFR5cGU+DQotCQkJCQk8eHNkOnNlcXVlbmNlLz4NCi0JCQkJPC94c2Q6Y29tcGxleFR5cGU+DQotCQkJPC94c2Q6ZWxlbWVudD4JCQkJDQotCQkJDQotCQkJPHhzZDplbGVtZW50IG5hbWU9Im9uZVdheSI+DQotCQkJCTx4c2Q6Y29tcGxleFR5cGU+DQotCQkJCQk8eHNkOnNlcXVlbmNlPg0KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJvbmV3YXlfc3RyIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPg0KLQkJCQkJPC94c2Q6c2VxdWVuY2U+DQotCQkJCTwveHNkOmNvbXBsZXhUeXBlPg0KLQkJCTwveHNkOmVsZW1lbnQ+CQkJCQ0KLQkJCQ0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJ0d29XYXlIb2xkZXIiPg0KLQkJCQk8eHNkOmNvbXBsZXhUeXBlPg0KLQkJCQkJPHhzZDpzZXF1ZW5jZT4NCi0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0idHdvV2F5SG9sZGVyX3N0ciIgdHlwZT0ieHNkOnN0cmluZyIgLz4NCi0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0idHdvV2F5SG9sZGVyX2ludCIgdHlwZT0ieHNkOmludCIgLz4JCQkJCQkNCi0JCQkJCTwveHNkOnNlcXVlbmNlPg0KLQkJCQk8L3hzZDpjb21wbGV4VHlwZT4NCi0JCQk8L3hzZDplbGVtZW50Pg0KLQkJCQ0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJ0d29XYXkiPg0KLQkJCQk8eHNkOmNvbXBsZXhUeXBlPg0KLQkJCQkJPHhzZDpzZXF1ZW5jZT4NCi0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0idHdvd2F5X3N0ciIgdHlwZT0ieHNkOnN0cmluZyIgLz4NCi0JCQkJCTwveHNkOnNlcXVlbmNlPg0KLQkJCQk8L3hzZDpjb21wbGV4VHlwZT4NCi0JCQk8L3hzZDplbGVtZW50PgkJCQ0KLQkJCQ0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSZXR1cm5UeXBlIj4NCi0JCQkJPHhzZDpjb21wbGV4VHlwZT4NCi0JCQkJCTx4c2Q6c2VxdWVuY2U+DQotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9InJldHVybl9zdHIiIHR5cGU9InhzZDpzdHJpbmciIC8+DQotCQkJCQk8L3hzZDpzZXF1ZW5jZT4NCi0JCQkJPC94c2Q6Y29tcGxleFR5cGU+DQotCQkJPC94c2Q6ZWxlbWVudD4JCQkJDQotDQotCQkJPCEtLSBmaW4gb3AgZGVmaW5pdGlvbiAtLT4NCi0JCQkNCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iZmluT3AiPg0KLQkJCQk8eHNkOmNvbXBsZXhUeXBlPg0KLQkJCQkJPHhzZDpzZXF1ZW5jZT4NCi0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0ib3AiIHR5cGU9InRuczpGaW5hbmNpYWxPcGVyYXRpb24iIC8+DQotCQkJCQk8L3hzZDpzZXF1ZW5jZT4NCi0JCQkJPC94c2Q6Y29tcGxleFR5cGU+DQotCQkJPC94c2Q6ZWxlbWVudD4JCQkNCi0NCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iZmluT3BSZXNwb25zZSI+DQotCQkJCTx4c2Q6Y29tcGxleFR5cGU+DQotCQkJCTx4c2Q6c2VxdWVuY2U+DQotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0icmVzcG9uc2UiIHR5cGU9InRuczpGaW5hbmNpYWxPcGVyYXRpb24iIC8+DQotCQkJCTwveHNkOnNlcXVlbmNlPg0KLQkJCQk8L3hzZDpjb21wbGV4VHlwZT4NCi0JCQk8L3hzZDplbGVtZW50Pg0KLQ0KLQkJCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRmluYW5jaWFsT3BlcmF0aW9uIj4NCi0JCQkJPHhzZDpzZXF1ZW5jZT4NCi0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJhbW91bnQiIHR5cGU9InhzZDpmbG9hdCIgLz4NCi0JCQkJPC94c2Q6c2VxdWVuY2U+DQotCQkJPC94c2Q6Y29tcGxleFR5cGU+DQotDQotCQkJPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJXaXRoZHJhdyI+DQotCQkJICA8eHNkOmNvbXBsZXhDb250ZW50Pg0KLQkJCSAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ0bnM6RmluYW5jaWFsT3BlcmF0aW9uIj4NCi0JCQkgICAgICA8eHNkOnNlcXVlbmNlPg0KLQkJCSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1lbW8iIHR5cGU9InhzZDpzdHJpbmciIC8+DQotCQkJICAgICAgPC94c2Q6c2VxdWVuY2U+DQotCQkJICAgIDwveHNkOmV4dGVuc2lvbj4NCi0JCQkgIDwveHNkOmNvbXBsZXhDb250ZW50Pg0KLQkJCTwveHNkOmNvbXBsZXhUeXBlPg0KLQkJCQ0KLQkJCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRGVwb3NpdCI+DQotCQkJICA8eHNkOmNvbXBsZXhDb250ZW50Pg0KLQkJCSAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ0bnM6RmluYW5jaWFsT3BlcmF0aW9uIj4NCi0JCQkgICAgICA8eHNkOnNlcXVlbmNlPg0KLQkJCSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0YXR1cyIgdHlwZT0ieHNkOnN0cmluZyIgLz4NCi0JCQkgICAgICA8L3hzZDpzZXF1ZW5jZT4NCi0JCQkgICAgIDwveHNkOmV4dGVuc2lvbj4NCi0JCQkgIDwveHNkOmNvbXBsZXhDb250ZW50Pg0KLQkJCTwveHNkOmNvbXBsZXhUeXBlPgkNCi0NCi0JCTwveHNkOnNjaGVtYT4NCi0JPC93c2RsOnR5cGVzPg0KLQ0KLQk8d3NkbDptZXNzYWdlIG5hbWU9Im9uZVdheVZvaWRSZXF1ZXN0Ij4NCi0JCTx3c2RsOnBhcnQgbmFtZT0iYWxsQnlNeXNlbGYiIGVsZW1lbnQ9InRuczpvbmVXYXlWb2lkIiAvPg0KLQk8L3dzZGw6bWVzc2FnZT4NCi0NCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJvbmVXYXlSZXF1ZXN0Ij4NCi0JCTx3c2RsOnBhcnQgbmFtZT0iYWxsQnlNeXNlbGYiIGVsZW1lbnQ9InRuczpvbmVXYXkiIC8+DQotCTwvd3NkbDptZXNzYWdlPg0KLQ0KLQk8d3NkbDptZXNzYWdlIG5hbWU9InR3b1dheUhvbGRlclJlcXVlc3QiPg0KLQkJPHdzZGw6cGFydCBuYW1lPSJhbGxCeU15c2VsZiIgZWxlbWVudD0idG5zOnR3b1dheUhvbGRlciIgLz4NCi0JPC93c2RsOm1lc3NhZ2U+DQotDQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0idHdvV2F5SG9sZGVyUmVzcG9uc2UiPg0KLQkJPHdzZGw6cGFydCBuYW1lPSJhbGxCeU15c2VsZiIgZWxlbWVudD0idG5zOnR3b1dheUhvbGRlciIgLz4NCi0JPC93c2RsOm1lc3NhZ2U+DQotCQ0KLQk8d3NkbDptZXNzYWdlIG5hbWU9InR3b1dheVJlcXVlc3QiPg0KLQkJPHdzZGw6cGFydCBuYW1lPSJhbGxCeU15c2VsZiIgZWxlbWVudD0idG5zOnR3b1dheSIgLz4NCi0JPC93c2RsOm1lc3NhZ2U+DQotDQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0idHdvV2F5UmVzcG9uc2UiPg0KLQkJPHdzZGw6cGFydCBuYW1lPSJhbGxCeU15c2VsZiIgZWxlbWVudD0idG5zOlJldHVyblR5cGUiIC8+DQotCTwvd3NkbDptZXNzYWdlPgkNCi0JDQotCTx3c2RsOnBvcnRUeXBlIG5hbWU9IkRvY0xpdE5vbldyYXBQb3J0VHlwZSI+DQotDQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0ib25lV2F5Vm9pZCI+DQotCQkJPHdzZGw6aW5wdXQgbWVzc2FnZT0idG5zOm9uZVdheVZvaWRSZXF1ZXN0IiAvPg0KLQkJPC93c2RsOm9wZXJhdGlvbj4NCi0NCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJvbmVXYXkiPg0KLQkJCTx3c2RsOmlucHV0IG1lc3NhZ2U9InRuczpvbmVXYXlSZXF1ZXN0IiAvPg0KLQkJPC93c2RsOm9wZXJhdGlvbj4NCi0JCQ0KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9InR3b1dheUhvbGRlciI+DQotCQkJPHdzZGw6aW5wdXQgbWVzc2FnZT0idG5zOnR3b1dheUhvbGRlclJlcXVlc3QiIC8+DQotCQkJPHdzZGw6b3V0cHV0IG1lc3NhZ2U9InRuczp0d29XYXlIb2xkZXJSZXNwb25zZSIgLz4NCi0JCTwvd3NkbDpvcGVyYXRpb24+DQotCQkNCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJ0d29XYXkiPg0KLQkJCTx3c2RsOmlucHV0IG1lc3NhZ2U9InRuczp0d29XYXlSZXF1ZXN0IiAvPg0KLQkJCTx3c2RsOm91dHB1dCBtZXNzYWdlPSJ0bnM6dHdvV2F5UmVzcG9uc2UiIC8+DQotCQk8L3dzZGw6b3BlcmF0aW9uPgkJDQotCQkJDQotCTwvd3NkbDpwb3J0VHlwZT4NCi0JDQotCTx3c2RsOmJpbmRpbmcgbmFtZT0iRG9jTGl0Tm9uV3JhcCIgdHlwZT0idG5zOkRvY0xpdE5vbldyYXBQb3J0VHlwZSI+DQotCQk8c29hcDpiaW5kaW5nIHN0eWxlPSJkb2N1bWVudCIgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiIC8+DQotDQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0ib25lV2F5Vm9pZCI+DQotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly9ub253cmFwLnNhbXBsZS50ZXN0Lm9yZy9vbmVXYXlWb2lkIiAvPg0KLQkJCTx3c2RsOmlucHV0Pg0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgIC8+DQotCQkJPC93c2RsOmlucHV0Pg0KLQkJPC93c2RsOm9wZXJhdGlvbj4NCi0NCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJvbmVXYXkiPg0KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vbm9ud3JhcC5zYW1wbGUudGVzdC5vcmcvb25lV2F5IiAvPg0KLQkJCTx3c2RsOmlucHV0Pg0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgIC8+DQotCQkJPC93c2RsOmlucHV0Pg0KLQkJPC93c2RsOm9wZXJhdGlvbj4NCi0JCQ0KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9InR3b1dheUhvbGRlciI+DQotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly9ub253cmFwLnNhbXBsZS50ZXN0Lm9yZy90d29XYXlIb2xkZXIiIC8+DQotCQkJPHdzZGw6aW5wdXQ+DQotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAgLz4NCi0JCQk8L3dzZGw6aW5wdXQ+DQotCQkJPHdzZGw6b3V0cHV0Pg0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgIC8+DQotCQkJPC93c2RsOm91dHB1dD4NCi0JDQotCQk8L3dzZGw6b3BlcmF0aW9uPg0KLQkJDQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0idHdvV2F5Ij4NCi0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL25vbndyYXAuc2FtcGxlLnRlc3Qub3JnL3R3b1dheSIgLz4NCi0JCQk8d3NkbDppbnB1dD4NCi0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiICAvPg0KLQkJCTwvd3NkbDppbnB1dD4NCi0JCQk8d3NkbDpvdXRwdXQ+DQotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAgLz4NCi0JCQk8L3dzZGw6b3V0cHV0Pg0KLQkNCi0JCTwvd3NkbDpvcGVyYXRpb24+CQkNCi0JDQotCTwvd3NkbDpiaW5kaW5nPg0KLQkNCi0JPHdzZGw6c2VydmljZSBuYW1lPSJEb2NMaXROb25XcmFwU2VydmljZSI+DQotCQk8d3NkbDpwb3J0IGJpbmRpbmc9InRuczpEb2NMaXROb25XcmFwIiBuYW1lPSJEb2NMaXROb25XcmFwUG9ydCI+DQotCQkJPHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo2MDYwL2F4aXMyL3NlcnZpY2VzL0RvY0xpdE5vbldyYXBTZXJ2aWNlIiAvPg0KLQkJPC93c2RsOnBvcnQ+DQotCTwvd3NkbDpzZXJ2aWNlPg0KLQkNCi08L3dzZGw6ZGVmaW5pdGlvbnM+DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9ub253cmFwL3NlaS9Eb2NMaXROb25XcmFwUG9ydFR5cGUuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvbm9ud3JhcC9zZWkvRG9jTGl0Tm9uV3JhcFBvcnRUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwYmRlNzAuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9ub253cmFwL3NlaS9Eb2NMaXROb25XcmFwUG9ydFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0NCi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5ub253cmFwLnNlaTsNCi0NCi1pbXBvcnQgb3JnLnRlc3Quc2FtcGxlLm5vbndyYXAuT25lV2F5Ow0KLWltcG9ydCBvcmcudGVzdC5zYW1wbGUubm9ud3JhcC5PbmVXYXlWb2lkOw0KLWltcG9ydCBvcmcudGVzdC5zYW1wbGUubm9ud3JhcC5SZXR1cm5UeXBlOw0KLWltcG9ydCBvcmcudGVzdC5zYW1wbGUubm9ud3JhcC5Ud29XYXk7DQotaW1wb3J0IG9yZy50ZXN0LnNhbXBsZS5ub253cmFwLlR3b1dheUhvbGRlcjsNCi0NCi1pbXBvcnQgamF2YXguandzLk9uZXdheTsNCi1pbXBvcnQgamF2YXguandzLldlYk1ldGhvZDsNCi1pbXBvcnQgamF2YXguandzLldlYlBhcmFtOw0KLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW0uTW9kZTsNCi1pbXBvcnQgamF2YXguandzLldlYlJlc3VsdDsNCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7DQotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nOw0KLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5QYXJhbWV0ZXJTdHlsZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLkFzeW5jSGFuZGxlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLkhvbGRlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLlJlc3BvbnNlOw0KLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU7DQotDQotLyoqDQotICogVGhpcyBjbGFzcyB3YXMgZ2VuZXJhdGVkIGJ5IHRoZSBKQVhXUyBTSS4NCi0gKiBKQVgtV1MgUkkgMi4wXzAxLWIxNS1mY3MNCi0gKiBHZW5lcmF0ZWQgc291cmNlIHZlcnNpb246IDIuMA0KLSAqIA0KLSAqLw0KLUBXZWJTZXJ2aWNlKG5hbWUgPSAiRG9jTGl0Tm9uV3JhcFBvcnRUeXBlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9ub253cmFwLnNhbXBsZS50ZXN0Lm9yZyIpDQotQFNPQVBCaW5kaW5nKHBhcmFtZXRlclN0eWxlID0gUGFyYW1ldGVyU3R5bGUuQkFSRSkNCi1wdWJsaWMgaW50ZXJmYWNlIERvY0xpdE5vbldyYXBQb3J0VHlwZSB7DQotDQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGFsbEJ5TXlzZWxmDQotICAgICAqLw0KLSAgICBAV2ViTWV0aG9kKGFjdGlvbiA9ICJodHRwOi8vbm9ud3JhcC5zYW1wbGUudGVzdC5vcmcvdHdvV2F5UmV0dXJuIikNCi0gICAgQE9uZXdheQ0KLSAgICBwdWJsaWMgdm9pZCBvbmVXYXlWb2lkKA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAib25lV2F5Vm9pZCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vbm9ud3JhcC5zYW1wbGUudGVzdC5vcmciLCBwYXJ0TmFtZSA9ICJhbGxCeU15c2VsZiIpDQotICAgICAgICBPbmVXYXlWb2lkIGFsbEJ5TXlzZWxmKTsNCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gYWxsQnlNeXNlbGYNCi0gICAgICovDQotICAgIEBXZWJNZXRob2QoYWN0aW9uID0gImh0dHA6Ly9ub253cmFwLnNhbXBsZS50ZXN0Lm9yZy90d29XYXlSZXR1cm4iKQ0KLSAgICBAT25ld2F5DQotICAgIHB1YmxpYyB2b2lkIG9uZVdheSgNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gIm9uZVdheSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vbm9ud3JhcC5zYW1wbGUudGVzdC5vcmciLCBwYXJ0TmFtZSA9ICJhbGxCeU15c2VsZiIpDQotICAgICAgICBPbmVXYXkgYWxsQnlNeXNlbGYpOw0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSBhbGxCeU15c2VsZg0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIGphdmF4LnhtbC53cy5SZXNwb25zZTxvcmcudGVzdC5zYW1wbGUubm9ud3JhcC5Ud29XYXlIb2xkZXI+DQotICAgICAqLw0KLSAgICBAV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWUgPSAidHdvV2F5SG9sZGVyIiwgYWN0aW9uID0gImh0dHA6Ly9ub253cmFwLnNhbXBsZS50ZXN0Lm9yZy90d29XYXlSZXR1cm4iKQ0KLSAgICBwdWJsaWMgUmVzcG9uc2U8VHdvV2F5SG9sZGVyPiB0d29XYXlIb2xkZXJBc3luYygNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gInR3b1dheUhvbGRlciIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vbm9ud3JhcC5zYW1wbGUudGVzdC5vcmciLCBwYXJ0TmFtZSA9ICJhbGxCeU15c2VsZiIpDQotICAgICAgICBUd29XYXlIb2xkZXIgYWxsQnlNeXNlbGYpOw0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSBhbGxCeU15c2VsZg0KLSAgICAgKiBAcGFyYW0gYXN5bmNIYW5kbGVyDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlPD8gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Pg0KLSAgICAgKi8NCi0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lID0gInR3b1dheUhvbGRlciIsIGFjdGlvbiA9ICJodHRwOi8vbm9ud3JhcC5zYW1wbGUudGVzdC5vcmcvdHdvV2F5UmV0dXJuIikNCi0gICAgcHVibGljIEZ1dHVyZTw/PiB0d29XYXlIb2xkZXJBc3luYygNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gInR3b1dheUhvbGRlciIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vbm9ud3JhcC5zYW1wbGUudGVzdC5vcmciLCBwYXJ0TmFtZSA9ICJhbGxCeU15c2VsZiIpDQotICAgICAgICBUd29XYXlIb2xkZXIgYWxsQnlNeXNlbGYsDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJ0d29XYXlIb2xkZXJSZXNwb25zZSIsIHRhcmdldE5hbWVzcGFjZSA9ICIiLCBwYXJ0TmFtZSA9ICJhc3luY0hhbmRsZXIiKQ0KLSAgICAgICAgQXN5bmNIYW5kbGVyPFR3b1dheUhvbGRlcj4gYXN5bmNIYW5kbGVyKTsNCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gYWxsQnlNeXNlbGYNCi0gICAgICovDQotICAgIEBXZWJNZXRob2QoYWN0aW9uID0gImh0dHA6Ly9ub253cmFwLnNhbXBsZS50ZXN0Lm9yZy90d29XYXlSZXR1cm4iKQ0KLSAgICBwdWJsaWMgdm9pZCB0d29XYXlIb2xkZXIoDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJ0d29XYXlIb2xkZXIiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL25vbndyYXAuc2FtcGxlLnRlc3Qub3JnIiwgbW9kZSA9IE1vZGUuSU5PVVQsIHBhcnROYW1lID0gImFsbEJ5TXlzZWxmIikNCi0gICAgICAgIEhvbGRlcjxUd29XYXlIb2xkZXI+IGFsbEJ5TXlzZWxmKTsNCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gYWxsQnlNeXNlbGYNCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBqYXZheC54bWwud3MuUmVzcG9uc2U8b3JnLnRlc3Quc2FtcGxlLm5vbndyYXAuUmV0dXJuVHlwZT4NCi0gICAgICovDQotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJ0d29XYXkiLCBhY3Rpb24gPSAiaHR0cDovL25vbndyYXAuc2FtcGxlLnRlc3Qub3JnL3R3b1dheVJldHVybiIpDQotICAgIHB1YmxpYyBSZXNwb25zZTxSZXR1cm5UeXBlPiB0d29XYXlBc3luYygNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gInR3b1dheSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vbm9ud3JhcC5zYW1wbGUudGVzdC5vcmciLCBwYXJ0TmFtZSA9ICJhbGxCeU15c2VsZiIpDQotICAgICAgICBUd29XYXkgYWxsQnlNeXNlbGYpOw0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSBhbGxCeU15c2VsZg0KLSAgICAgKiBAcGFyYW0gYXN5bmNIYW5kbGVyDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlPD8gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Pg0KLSAgICAgKi8NCi0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lID0gInR3b1dheSIsIGFjdGlvbiA9ICJodHRwOi8vbm9ud3JhcC5zYW1wbGUudGVzdC5vcmcvdHdvV2F5UmV0dXJuIikNCi0gICAgcHVibGljIEZ1dHVyZTw/PiB0d29XYXlBc3luYygNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gInR3b1dheSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vbm9ud3JhcC5zYW1wbGUudGVzdC5vcmciLCBwYXJ0TmFtZSA9ICJhbGxCeU15c2VsZiIpDQotICAgICAgICBUd29XYXkgYWxsQnlNeXNlbGYsDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJ0d29XYXlSZXNwb25zZSIsIHRhcmdldE5hbWVzcGFjZSA9ICIiLCBwYXJ0TmFtZSA9ICJhc3luY0hhbmRsZXIiKQ0KLSAgICAgICAgQXN5bmNIYW5kbGVyPFJldHVyblR5cGU+IGFzeW5jSGFuZGxlcik7DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGFsbEJ5TXlzZWxmDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgb3JnLnRlc3Quc2FtcGxlLm5vbndyYXAuUmV0dXJuVHlwZQ0KLSAgICAgKi8NCi0gICAgQFdlYk1ldGhvZChhY3Rpb24gPSAiaHR0cDovL25vbndyYXAuc2FtcGxlLnRlc3Qub3JnL3R3b1dheVJldHVybiIpDQotICAgIEBXZWJSZXN1bHQobmFtZSA9ICJSZXR1cm5UeXBlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9ub253cmFwLnNhbXBsZS50ZXN0Lm9yZyIsIHBhcnROYW1lID0gImFsbEJ5TXlzZWxmIikNCi0gICAgcHVibGljIFJldHVyblR5cGUgdHdvV2F5KA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAidHdvV2F5IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9ub253cmFwLnNhbXBsZS50ZXN0Lm9yZyIsIHBhcnROYW1lID0gImFsbEJ5TXlzZWxmIikNCi0gICAgICAgIFR3b1dheSBhbGxCeU15c2VsZik7DQotDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvbm9ud3JhcC9zZWkvRG9jTGl0Tm9uV3JhcFNlcnZpY2UuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvbm9ud3JhcC9zZWkvRG9jTGl0Tm9uV3JhcFNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRmZjQ5Zi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL25vbndyYXAvc2VpL0RvY0xpdE5vbldyYXBTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0NCi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5ub253cmFwLnNlaTsNCi0NCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJFbmRwb2ludDsNCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VDbGllbnQ7DQotaW1wb3J0IGphdmEuaW8uRmlsZTsNCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLm5ldC5VUkw7DQotDQotLyoqDQotICogVGhpcyBjbGFzcyB3YXMgZ2VuZXJhdGVkIGJ5IHRoZSBKQVhXUyBTSS4NCi0gKiBKQVgtV1MgUkkgMi4wXzAxLWIxNS1mY3MNCi0gKiBHZW5lcmF0ZWQgc291cmNlIHZlcnNpb246IDIuMA0KLSAqIA0KLSAqLw0KLUBXZWJTZXJ2aWNlQ2xpZW50KG5hbWUgPSAiRG9jTGl0Tm9uV3JhcFNlcnZpY2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL25vbndyYXAuc2FtcGxlLnRlc3Qub3JnIiwgd3NkbExvY2F0aW9uID0gImRvY2xpdF9ub253cmFwLndzZGwiKQ0KLXB1YmxpYyBjbGFzcyBEb2NMaXROb25XcmFwU2VydmljZQ0KLSAgICBleHRlbmRzIFNlcnZpY2UNCi17DQotDQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFVSTCBET0NMSVROT05XUkFQU0VSVklDRV9XU0RMX0xPQ0FUSU9OOw0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgd3NkbExvY2F0aW9uPSIvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9ub253cmFwL01FVEEtSU5GL2RvY2xpdF9ub253cmFwLndzZGwiOw0KLSAgICBzdGF0aWMgew0KLSAgICAgICAgVVJMIHVybCA9IG51bGw7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgCXRyeXsNCi0JICAgICAgICAJU3RyaW5nIGJhc2VEaXIgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoImJhc2VkaXIiLCIuIikpLmdldENhbm9uaWNhbFBhdGgoKTsNCi0JICAgICAgICAJd3NkbExvY2F0aW9uID0gbmV3IEZpbGUoYmFzZURpciArIHdzZGxMb2NhdGlvbikuZ2V0QWJzb2x1dGVQYXRoKCk7DQotICAgICAgICAJfWNhdGNoKEV4Y2VwdGlvbiBlKXsNCi0gICAgICAgIAkJZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgIAl9DQotICAgICAgICAJRmlsZSBmaWxlID0gbmV3IEZpbGUod3NkbExvY2F0aW9uKTsNCi0gICAgICAgIAl1cmwgPSBmaWxlLnRvVVJMKCk7DQotICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICB9DQotICAgICAgICBET0NMSVROT05XUkFQU0VSVklDRV9XU0RMX0xPQ0FUSU9OID0gdXJsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBEb2NMaXROb25XcmFwU2VydmljZShVUkwgd3NkbExvY2F0aW9uLCBRTmFtZSBzZXJ2aWNlTmFtZSkgew0KLSAgICAgICAgc3VwZXIod3NkbExvY2F0aW9uLCBzZXJ2aWNlTmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIERvY0xpdE5vbldyYXBTZXJ2aWNlKCkgew0KLSAgICAgICAgc3VwZXIoRE9DTElUTk9OV1JBUFNFUlZJQ0VfV1NETF9MT0NBVElPTiwgbmV3IFFOYW1lKCJodHRwOi8vbm9ud3JhcC5zYW1wbGUudGVzdC5vcmciLCAiRG9jTGl0Tm9uV3JhcFNlcnZpY2UiKSk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIERvY0xpdE5vbldyYXBQb3J0VHlwZQ0KLSAgICAgKi8NCi0gICAgQFdlYkVuZHBvaW50KG5hbWUgPSAiRG9jTGl0Tm9uV3JhcFBvcnQiKQ0KLSAgICBwdWJsaWMgRG9jTGl0Tm9uV3JhcFBvcnRUeXBlIGdldERvY0xpdE5vbldyYXBQb3J0KCkgew0KLSAgICAgICAgcmV0dXJuIChEb2NMaXROb25XcmFwUG9ydFR5cGUpc3VwZXIuZ2V0UG9ydChuZXcgUU5hbWUoImh0dHA6Ly9ub253cmFwLnNhbXBsZS50ZXN0Lm9yZyIsICJEb2NMaXROb25XcmFwUG9ydCIpLCBEb2NMaXROb25XcmFwUG9ydFR5cGUuY2xhc3MpOw0KLSAgICB9DQotDQotDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvcGFyYWxsZWxhc3luYy9jb21tb24vQ2FsbGJhY2tIYW5kbGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL3BhcmFsbGVsYXN5bmMvY29tbW9uL0NhbGxiYWNrSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjU2ODFlLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvcGFyYWxsZWxhc3luYy9jb21tb24vQ2FsbGJhY2tIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5wYXJhbGxlbGFzeW5jLmNvbW1vbjsNCi0NCi1pbXBvcnQgamF2YXgueG1sLndzLkFzeW5jSGFuZGxlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLlJlc3BvbnNlOw0KLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU7DQotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVvdXRFeGNlcHRpb247DQotDQotLyoqDQotICogR2VuZXJpYyBBc3luYyBjYWxsYmFjayBoYW5kbGVyLiBUaGUgZ2V0IG1ldGhvZCBlbXVsYXRlcyBSZXNwb25zZS5nZXQgYnkNCi0gKiB0aHJvd25pbmcgYW4gZXhjZXB0aW9uIGlmIG9uZSBpcyByZWNlaXZlZC4gDQotICovDQotcHVibGljIGNsYXNzIENhbGxiYWNrSGFuZGxlcjxUPiBpbXBsZW1lbnRzIEFzeW5jSGFuZGxlcjxUPiB7DQotDQotICAgIHByaXZhdGUgVCByZXNwb25zZSA9IG51bGw7DQotICAgIHByaXZhdGUgUmVzcG9uc2U8VD4gcmVzcCA9IG51bGw7DQotICAgIA0KLSAgICBwcml2YXRlIEV4Y2VwdGlvbiBleGNlcHRpb24gPSBudWxsOw0KLQ0KLSAgICBwdWJsaWMgdm9pZCBoYW5kbGVSZXNwb25zZShSZXNwb25zZTxUPiByZXNwb25zZSkgew0KLQ0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBUIHJlcyA9IChUKSByZXNwb25zZS5nZXQoKTsNCi0gICAgICAgICAgICB0aGlzLnJlc3BvbnNlID0gcmVzOw0KLSAgICAgICAgICAgIHRoaXMucmVzcCA9IHJlc3BvbnNlOw0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICB0aGlzLmV4Y2VwdGlvbiA9IGU7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIFJlc3BvbnNlPFQ+IGdldFJlc3BvbnNlKCl7DQotICAgICAgICByZXR1cm4gdGhpcy5yZXNwOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgVCBnZXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0NCi0gICAgICAgIGlmIChleGNlcHRpb24gIT0gbnVsbCkNCi0gICAgICAgICAgICB0aHJvdyBleGNlcHRpb247DQotICAgICAgICByZXR1cm4gdGhpcy5yZXNwb25zZTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogQXV4aWxpYXJ5IG1ldGhvZCB1c2VkIHRvIHdhaXQgZm9yIGEgbW9uaXRvciBmb3IgYSBjZXJ0YWluIGFtb3VudCBvZiB0aW1lDQotICAgICAqIGJlZm9yZSB0aW1pbmcgb3V0DQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gbW9uaXRvcg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgd2FpdEJsb2NraW5nKEZ1dHVyZTw/PiBtb25pdG9yKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIC8vIHdhaXQgZm9yIHJlcXVlc3QgdG8gY29tcGxldGUNCi0gICAgICAgIGludCBzZWMgPSBDb25zdGFudHMuQ0xJRU5UX01BWF9TTEVFUF9TRUM7DQotICAgICAgICB3aGlsZSAoIW1vbml0b3IuaXNEb25lKCkpIHsNCi0gICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7DQotICAgICAgICAgICAgc2VjLS07DQotICAgICAgICAgICAgaWYgKHNlYyA8PSAwKSBicmVhazsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChzZWMgPD0gMCkNCi0gICAgICAgICAgICB0aHJvdyBuZXcgVGltZW91dEV4Y2VwdGlvbigiU3RvcHBlZCB3YWl0aW5nIGZvciBBc3luYyByZXNwb25zZSBhZnRlciAiDQotICAgICAgICAgICAgICAgICAgICArIENvbnN0YW50cy5DTElFTlRfTUFYX1NMRUVQX1NFQyArICIgc2VjIik7DQotICAgIH0gICANCi0gICAgDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvcGFyYWxsZWxhc3luYy9jb21tb24vQ29uc3RhbnRzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL3BhcmFsbGVsYXN5bmMvY29tbW9uL0NvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTMxMzBkLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvcGFyYWxsZWxhc3luYy9jb21tb24vQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5wYXJhbGxlbGFzeW5jLmNvbW1vbjsNCi0NCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi0NCi0vKioNCi0gKiBUaGlzIGNsYXNzIGhvbGRzIGNvbnN0YW50IHN0cmluZ3Mgc3VjaCBhcyBlbmRwb2ludCBhZGRyZXNzZXMgYW5kIGNvbW1vbg0KLSAqIGNvbnZlcnNpb24gbWV0aG9kcw0KLSAqLw0KLXB1YmxpYyBjbGFzcyBDb25zdGFudHMgew0KLQ0KLSAgICAvLyBzZXJ2ZXIgaG9zdE5hbWUgYW5kIFdDIHBvcnQNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZFUiA9ICJsb2NhbGhvc3Q6NjA2MCI7DQotICAgIA0KLSAgICAvL3B1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdTRExfTkFNRVNQQUNFID0gImh0dHA6Ly9jb21tb24ud3NmdnQuYXN5bmMuamF4d3MiOw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXU0RMX05BTUVTUEFDRSA9ICJodHRwOi8vb3JnL3Rlc3QvcGFyYWxsZWxhc3luYyI7DQotDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNPQVAxMV9OQU1FU1BBQ0UgPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZSI7DQotDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNPQVAxMl9OQU1FU1BBQ0UgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIjsNCi0NCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBTRVJWSUNFX1FOQU1FID0gbmV3IFFOYW1lKFdTRExfTkFNRVNQQUNFLA0KLSAgICAgICAgICAgICJBc3luY1NlcnZpY2UiKTsNCi0NCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBQT1JUX1FOQU1FID0gbmV3IFFOYW1lKFdTRExfTkFNRVNQQUNFLA0KLSAgICAgICAgICAgICJBc3luY1BvcnQiKTsNCi0NCi0gICAgLy8gRW5kcG9pbnQgYWRkcmVzc2VzDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJBU0VfRU5EUE9JTlQgPSAiaHR0cDovLyIgKyBTRVJWRVINCi0gICAgICAgICAgICArICIvYXhpczIvc2VydmljZXMvIjsNCi0NCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9DTElUV1JfQVNZTkNfRU5EUE9JTlQgPSBCQVNFX0VORFBPSU5UDQotICAgICAgICAgICAgKyAiQXN5bmNTZXJ2aWNlIjsgLy8rICJBc3luY0RvY0xpdFdyYXBwZWRTZXJ2aWNlIjsNCi0NCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9DTElUX0FTWU5DX0VORFBPSU5UID0gQkFTRV9FTkRQT0lOVA0KLSAgICAgICAgICAgICsgIkFzeW5jU2VydmljZSI7IC8vKyAiQXN5bmNEb2NMaXRTZXJ2aWNlIjsNCi0NCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUlBDTElUX0FTWU5DX0VORFBPSU5UID0gQkFTRV9FTkRQT0lOVA0KLSAgICAgICAgICAgICsgIkFzeW5jU2VydmljZSI7IC8vKyAiQXN5bmNScGNMaXRTZXJ2aWNlIjsNCi0NCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEhFX1NUUklORyA9ICJUaGlzIElzIEp1c3QgQSBUZXN0IjsNCi0NCi0gICAgLy8gaG93IGxvbmcgdGhlIHNlcnZlciBzaG91bGQgc2VlcCBmb3IgYmVmb3JlIHJldHVybmluZyBhIHJlc3BvbnNlDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBTRVJWRVJfU0xFRVBfU0VDID0gMTIwOw0KLQ0KLSAgICAvLyBtYXhpbXVtIGFtb3VudCBvZiB0aW1lIHRvIHdhaXQgZm9yIGFzeW5jIG9wZXJhdGlvbiB0byBjb21wbGV0ZQ0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTElFTlRfTUFYX1NMRUVQX1NFQyA9IDEyMDsNCi0NCi0gICAgLy8gbWF4aW11bSBhbW91bnQgb2YgdGltZSB0byB3YWl0IGZvciBhc3luYyBvcGVyYXRpb24gdG8gY29tcGxldGUNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xJRU5UX1NIT1JUX1NMRUVQX1NFQyA9IDE1Ow0KLQ0KLSAgICAvLyBtYXhpbXVtIG51bWJlciBvZiB0aW1lcyB0aGUgY2xpZW50IHNob3VsZCBjaGVjayB0byBzZWUgaWYNCi0gICAgLy8gdGhlIHNlcnZlciByZWNlaXZlZCBzbGVlcCByZXF1ZXN0DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BWF9JU0FTTEVFUF9DSEVDSyA9IDEwOw0KLQ0KLSAgICAvLyBudW1iZXIgb2Ygc2VjIHRvIHNsZWVwIGluIGJldHdlZW4gaXNBc2xlZXAgY2hlY2tzDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNMRUVQX0lTQVNMRUVQX1NFQyA9IDE7DQotDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvcGFyYWxsZWxhc3luYy9jb21tb24vS2lsbGVyVGhyZWFkLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL3BhcmFsbGVsYXN5bmMvY29tbW9uL0tpbGxlclRocmVhZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmYzMjM4Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvcGFyYWxsZWxhc3luYy9jb21tb24vS2lsbGVyVGhyZWFkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5wYXJhbGxlbGFzeW5jLmNvbW1vbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5UZXN0TG9nZ2VyOw0KLQ0KLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsNCi1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3I7DQotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yU2VydmljZTsNCi0NCi1wdWJsaWMgY2xhc3MgS2lsbGVyVGhyZWFkIGV4dGVuZHMgVGhyZWFkew0KLQ0KLSAgICBwcml2YXRlIFNlcnZpY2Ugc3ZjID0gbnVsbDsNCi0gICAgDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0tpbGxlZCA9IGZhbHNlOw0KLSAgICBwcml2YXRlIGJvb2xlYW4gaW50ZXJydXB0ID0gZmFsc2U7DQotICAgIA0KLSAgICBwcml2YXRlIGludCB3YWl0VW50aWxLaWxsaW5nU2VjID0gMzA7DQotICAgIA0KLSAgICBwdWJsaWMgS2lsbGVyVGhyZWFkKFNlcnZpY2Ugc2VydmljZSwgaW50IGNsaWVudF9tYXhfc2xlZXBfc2VjKSB7DQotICAgICAgICB0aGlzLndhaXRVbnRpbEtpbGxpbmdTZWMgPSBjbGllbnRfbWF4X3NsZWVwX3NlYzsNCi0gICAgICAgIHRoaXMuc3ZjID0gc2VydmljZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBydW4oKXsNCi0gICAgICAgIEV4ZWN1dG9yIGUgPSBzdmMuZ2V0RXhlY3V0b3IoKTsNCi0NCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJLaWxsZXJUaHJlYWQ6ICIgKyBlLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsNCi0gICAgICAgIEV4ZWN1dG9yU2VydmljZSBlcyA9IChFeGVjdXRvclNlcnZpY2UpIGU7DQotICAgICAgICANCi0NCi0gICAgICAgIGludCBpID0gd2FpdFVudGlsS2lsbGluZ1NlYzsNCi0gICAgICAgIHdoaWxlIChpID4gMCAmJiAhaW50ZXJydXB0KXsNCi0gICAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJLaWxsZXJUaHJlYWQ6IGdvaW5nIHRvIHNsZWVwIik7DQotICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsNCi0gICAgICAgICAgICAgICAgaSAtLTsNCi0gICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlMSkgew0KLSAgICAgICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiS2lsbGVyVGhyZWFkOiBpbnRlcnJ1cHRlZCIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgLy8gZm9yY2UgZXhlY3V0b3IgdG8gc3RvcA0KLSAgICAgICAgaWYgKCFpbnRlcnJ1cHQpew0KLSAgICAgICAgICAgIGlzS2lsbGVkID0gdHJ1ZTsNCi0gICAgICAgICAgICBlcy5zaHV0ZG93bk5vdygpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzS2lsbGVkKCkgew0KLSAgICAgICAgcmV0dXJuIGlzS2lsbGVkOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCBhYm9ydCgpew0KLSAgICAgICAgdGhpcy5pbnRlcnJ1cHQgPSB0cnVlOw0KLSAgICAgICAgdGhpcy5pbnRlcnJ1cHQoKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL3BhcmFsbGVsYXN5bmMvY29tbW9uL1BhdXNhYmxlRXhlY3V0b3IuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvcGFyYWxsZWxhc3luYy9jb21tb24vUGF1c2FibGVFeGVjdXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlN2E5MzMyLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvcGFyYWxsZWxhc3luYy9jb21tb24vUGF1c2FibGVFeGVjdXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUucGFyYWxsZWxhc3luYy5jb21tb247DQotDQotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkFycmF5QmxvY2tpbmdRdWV1ZTsNCi1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yOw0KLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsNCi1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuQ29uZGl0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5SZWVudHJhbnRMb2NrOw0KLQ0KLS8qKg0KLSAqIEEgY3VzdG9tIGV4ZWN1dG9yIHRoYXQgY2FuIGJlIHBhdXNlZCBmb3IgdGVzdGluZyBvZiBleGNlcHRpb25zIHRoYXQgb2NjdXINCi0gKiBiZWZvcmUgYW4gaXRlbSBpcyBleGVjdXRlZC4gVGhpcyBleGVjdXRvciBwcm92aWRlcyBhYnNvbHVlIGNvbnRyb2wgb3ZlciBpdHMNCi0gKiB0aHJlYWQgc2l6ZSB2aWEgc2l6ZSBwYXJhbWV0ZXIgaW4gdGhlIGNvbnN0cnVjdG9yDQotICovDQotcHVibGljIGNsYXNzIFBhdXNhYmxlRXhlY3V0b3IgZXh0ZW5kcyBUaHJlYWRQb29sRXhlY3V0b3Igew0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNQYXVzZWQ7DQotDQotICAgIHByaXZhdGUgUmVlbnRyYW50TG9jayBwYXVzZUxvY2sgPSBuZXcgUmVlbnRyYW50TG9jaygpOw0KLQ0KLSAgICBwcml2YXRlIENvbmRpdGlvbiB1bnBhdXNlZCA9IHBhdXNlTG9jay5uZXdDb25kaXRpb24oKTsNCi0NCi0gICAgcHVibGljIFBhdXNhYmxlRXhlY3V0b3IoaW50IHNpemUpIHsNCi0gICAgICAgIHN1cGVyKHNpemUsIHNpemUsIDEsIFRpbWVVbml0LlNFQ09ORFMsDQotICAgICAgICAgICAgICAgIG5ldyBBcnJheUJsb2NraW5nUXVldWU8UnVubmFibGU+KHNpemUpKTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHJvdGVjdGVkIHZvaWQgYmVmb3JlRXhlY3V0ZShUaHJlYWQgdCwgUnVubmFibGUgcikgew0KLSAgICAgICAgc3VwZXIuYmVmb3JlRXhlY3V0ZSh0LCByKTsNCi0gICAgICAgIHBhdXNlTG9jay5sb2NrKCk7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIHdoaWxlIChpc1BhdXNlZCkNCi0gICAgICAgICAgICAgICAgdW5wYXVzZWQuYXdhaXQoKTsNCi0gICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7DQotICAgICAgICAgICAgdC5pbnRlcnJ1cHQoKTsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgICAgcGF1c2VMb2NrLnVubG9jaygpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHBhdXNlKCkgew0KLSAgICAgICAgcGF1c2VMb2NrLmxvY2soKTsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgaXNQYXVzZWQgPSB0cnVlOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgICBwYXVzZUxvY2sudW5sb2NrKCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgcmVzdW1lKCkgew0KLSAgICAgICAgcGF1c2VMb2NrLmxvY2soKTsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgaXNQYXVzZWQgPSBmYWxzZTsNCi0gICAgICAgICAgICB1bnBhdXNlZC5zaWduYWxBbGwoKTsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgICAgcGF1c2VMb2NrLnVubG9jaygpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvcGFyYWxsZWxhc3luYy9zZXJ2ZXIvQXN5bmNQb3J0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL3BhcmFsbGVsYXN5bmMvc2VydmVyL0FzeW5jUG9ydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmQzMzYzLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvcGFyYWxsZWxhc3luYy9zZXJ2ZXIvQXN5bmNQb3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUucGFyYWxsZWxhc3luYy5zZXJ2ZXI7DQotDQotaW1wb3J0IG9yZy50ZXN0LnBhcmFsbGVsYXN5bmMuQW5vdGhlclJlc3BvbnNlOw0KLWltcG9ydCBvcmcudGVzdC5wYXJhbGxlbGFzeW5jLkN1c3RvbUFzeW5jUmVzcG9uc2U7DQotaW1wb3J0IG9yZy50ZXN0LnBhcmFsbGVsYXN5bmMuSW52b2tlQXN5bmNSZXNwb25zZTsNCi1pbXBvcnQgb3JnLnRlc3QucGFyYWxsZWxhc3luYy5Jc0FzbGVlcFJlc3BvbnNlOw0KLWltcG9ydCBvcmcudGVzdC5wYXJhbGxlbGFzeW5jLlBpbmdSZXNwb25zZTsNCi1pbXBvcnQgb3JnLnRlc3QucGFyYWxsZWxhc3luYy5TbGVlcFJlc3BvbnNlOw0KLWltcG9ydCBvcmcudGVzdC5wYXJhbGxlbGFzeW5jLldha2VVcFJlc3BvbnNlOw0KLQ0KLWltcG9ydCBqYXZheC5qd3MuV2ViTWV0aG9kOw0KLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW07DQotaW1wb3J0IGphdmF4Lmp3cy5XZWJSZXN1bHQ7DQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuQXN5bmNIYW5kbGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuSG9sZGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuUmVxdWVzdFdyYXBwZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5SZXNwb25zZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLlJlc3BvbnNlV3JhcHBlcjsNCi1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOw0KLQ0KLS8qKg0KLSAqIFRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBieSB0aGUgSkFYV1MgU0kuDQotICogSkFYLVdTIFJJIDIuMC4xLWpheHdzLXJlYXJjaC0yMDA1LW5pZ2h0bHlfMjAwNi0wOC0xNl8wMi0zMi0wMy1NMQ0KLSAqIEdlbmVyYXRlZCBzb3VyY2UgdmVyc2lvbjogMi4wDQotICogDQotICovDQotQFdlYlNlcnZpY2UobmFtZSA9ICJBc3luY1BvcnQiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L3BhcmFsbGVsYXN5bmMiKQ0KLXB1YmxpYyBpbnRlcmZhY2UgQXN5bmNQb3J0IHsNCi0NCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gcmVxdWVzdA0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIGphdmEubGFuZy5TdHJpbmcNCi0gICAgICovDQotICAgIEBXZWJNZXRob2QoYWN0aW9uID0gImh0dHA6Ly9vcmcvdGVzdC9wYXJhbGxlbGFzeW5jL3BpbmciKQ0KLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAicmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikNCi0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJwaW5nIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9wYXJhbGxlbGFzeW5jIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LnBhcmFsbGVsYXN5bmMuUGluZyIpDQotICAgIEBSZXNwb25zZVdyYXBwZXIobG9jYWxOYW1lID0gInBpbmdSZXNwb25zZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL3Rlc3QvcGFyYWxsZWxhc3luYyIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5wYXJhbGxlbGFzeW5jLlBpbmdSZXNwb25zZSIpDQotICAgIHB1YmxpYyBTdHJpbmcgcGluZygNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gInJlcXVlc3QiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikNCi0gICAgICAgIFN0cmluZyByZXF1ZXN0KTsNCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gbWVzc2FnZQ0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIGphdmF4LnhtbC53cy5SZXNwb25zZTxvcmcudGVzdC5wYXJhbGxlbGFzeW5jLlNsZWVwUmVzcG9uc2U+DQotICAgICAqLw0KLSAgICBAV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWUgPSAic2xlZXAiLCBhY3Rpb24gPSAiaHR0cDovL29yZy90ZXN0L3BhcmFsbGVsYXN5bmMvc2xlZXAiKQ0KLSAgICBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gInNsZWVwIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9wYXJhbGxlbGFzeW5jIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LnBhcmFsbGVsYXN5bmMuU2xlZXAiKQ0KLSAgICBAUmVzcG9uc2VXcmFwcGVyKGxvY2FsTmFtZSA9ICJzbGVlcFJlc3BvbnNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9wYXJhbGxlbGFzeW5jIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LnBhcmFsbGVsYXN5bmMuU2xlZXBSZXNwb25zZSIpDQotICAgIHB1YmxpYyBSZXNwb25zZTxTbGVlcFJlc3BvbnNlPiBzbGVlcEFzeW5jKA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAibWVzc2FnZSIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQ0KLSAgICAgICAgU3RyaW5nIG1lc3NhZ2UpOw0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSBtZXNzYWdlDQotICAgICAqIEBwYXJhbSBhc3luY0hhbmRsZXINCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU8PyBleHRlbmRzIGphdmEubGFuZy5PYmplY3Q+DQotICAgICAqLw0KLSAgICBAV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWUgPSAic2xlZXAiLCBhY3Rpb24gPSAiaHR0cDovL29yZy90ZXN0L3BhcmFsbGVsYXN5bmMvc2xlZXAiKQ0KLSAgICBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gInNsZWVwIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9wYXJhbGxlbGFzeW5jIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LnBhcmFsbGVsYXN5bmMuU2xlZXAiKQ0KLSAgICBAUmVzcG9uc2VXcmFwcGVyKGxvY2FsTmFtZSA9ICJzbGVlcFJlc3BvbnNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9wYXJhbGxlbGFzeW5jIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LnBhcmFsbGVsYXN5bmMuU2xlZXBSZXNwb25zZSIpDQotICAgIHB1YmxpYyBGdXR1cmU8Pz4gc2xlZXBBc3luYygNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gIm1lc3NhZ2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikNCi0gICAgICAgIFN0cmluZyBtZXNzYWdlLA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiYXN5bmNIYW5kbGVyIiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpDQotICAgICAgICBBc3luY0hhbmRsZXI8U2xlZXBSZXNwb25zZT4gYXN5bmNIYW5kbGVyKTsNCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gbWVzc2FnZQ0KLSAgICAgKi8NCi0gICAgQFdlYk1ldGhvZChhY3Rpb24gPSAiaHR0cDovL29yZy90ZXN0L3BhcmFsbGVsYXN5bmMvc2xlZXAiKQ0KLSAgICBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gInNsZWVwIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9wYXJhbGxlbGFzeW5jIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LnBhcmFsbGVsYXN5bmMuU2xlZXAiKQ0KLSAgICBAUmVzcG9uc2VXcmFwcGVyKGxvY2FsTmFtZSA9ICJzbGVlcFJlc3BvbnNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9wYXJhbGxlbGFzeW5jIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LnBhcmFsbGVsYXN5bmMuU2xlZXBSZXNwb25zZSIpDQotICAgIHB1YmxpYyB2b2lkIHNsZWVwKA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAibWVzc2FnZSIsIHRhcmdldE5hbWVzcGFjZSA9ICIiLCBtb2RlID0gV2ViUGFyYW0uTW9kZS5JTk9VVCkNCi0gICAgICAgIEhvbGRlcjxTdHJpbmc+IG1lc3NhZ2UpOw0KLQ0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgamF2YS5sYW5nLlN0cmluZw0KLSAgICAgKi8NCi0gICAgQFdlYk1ldGhvZChhY3Rpb24gPSAiaHR0cDovL29yZy90ZXN0L3BhcmFsbGVsYXN5bmMvaXNBc2xlZXAiKQ0KLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAicmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikNCi0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJpc0FzbGVlcCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL3Rlc3QvcGFyYWxsZWxhc3luYyIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5wYXJhbGxlbGFzeW5jLklzQXNsZWVwIikNCi0gICAgQFJlc3BvbnNlV3JhcHBlcihsb2NhbE5hbWUgPSAiaXNBc2xlZXBSZXNwb25zZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL3Rlc3QvcGFyYWxsZWxhc3luYyIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5wYXJhbGxlbGFzeW5jLklzQXNsZWVwUmVzcG9uc2UiKQ0KLSAgICBwdWJsaWMgU3RyaW5nIGlzQXNsZWVwKA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAicmVxdWVzdCIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQ0KLSAgICAgICAgU3RyaW5nIHJlcXVlc3QpOw0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgamF2YS5sYW5nLlN0cmluZw0KLSAgICAgKi8NCi0gICAgQFdlYk1ldGhvZChhY3Rpb24gPSAiaHR0cDovL29yZy90ZXN0L3BhcmFsbGVsYXN5bmMvd2FrZVVwIikNCi0gICAgQFdlYlJlc3VsdChuYW1lID0gInJlc3BvbnNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpDQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAid2FrZVVwIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9wYXJhbGxlbGFzeW5jIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LnBhcmFsbGVsYXN5bmMuV2FrZVVwIikNCi0gICAgQFJlc3BvbnNlV3JhcHBlcihsb2NhbE5hbWUgPSAid2FrZVVwUmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L3BhcmFsbGVsYXN5bmMiLCBjbGFzc05hbWUgPSAib3JnLnRlc3QucGFyYWxsZWxhc3luYy5XYWtlVXBSZXNwb25zZSIpDQotICAgIHB1YmxpYyBTdHJpbmcgd2FrZVVwKA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAicmVxdWVzdCIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQ0KLSAgICAgICAgU3RyaW5nIHJlcXVlc3QpOw0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSByZXF1ZXN0DQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgamF2YXgueG1sLndzLlJlc3BvbnNlPG9yZy50ZXN0LnBhcmFsbGVsYXN5bmMuSW52b2tlQXN5bmNSZXNwb25zZT4NCi0gICAgICovDQotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJpbnZva2VBc3luYyIsIGFjdGlvbiA9ICJodHRwOi8vb3JnL3Rlc3QvcGFyYWxsZWxhc3luYy9pbnZva2VBc3luYyIpDQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAiaW52b2tlQXN5bmMiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L3BhcmFsbGVsYXN5bmMiLCBjbGFzc05hbWUgPSAib3JnLnRlc3QucGFyYWxsZWxhc3luYy5JbnZva2VBc3luYyIpDQotICAgIEBSZXNwb25zZVdyYXBwZXIobG9jYWxOYW1lID0gImludm9rZUFzeW5jUmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L3BhcmFsbGVsYXN5bmMiLCBjbGFzc05hbWUgPSAib3JnLnRlc3QucGFyYWxsZWxhc3luYy5JbnZva2VBc3luY1Jlc3BvbnNlIikNCi0gICAgcHVibGljIFJlc3BvbnNlPEludm9rZUFzeW5jUmVzcG9uc2U+IGludm9rZUFzeW5jQXN5bmMoDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJyZXF1ZXN0IiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpDQotICAgICAgICBTdHJpbmcgcmVxdWVzdCk7DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGFzeW5jSGFuZGxlcg0KLSAgICAgKiBAcGFyYW0gcmVxdWVzdA0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTw/IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdD4NCi0gICAgICovDQotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJpbnZva2VBc3luYyIsIGFjdGlvbiA9ICJodHRwOi8vb3JnL3Rlc3QvcGFyYWxsZWxhc3luYy9pbnZva2VBc3luYyIpDQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAiaW52b2tlQXN5bmMiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L3BhcmFsbGVsYXN5bmMiLCBjbGFzc05hbWUgPSAib3JnLnRlc3QucGFyYWxsZWxhc3luYy5JbnZva2VBc3luYyIpDQotICAgIEBSZXNwb25zZVdyYXBwZXIobG9jYWxOYW1lID0gImludm9rZUFzeW5jUmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L3BhcmFsbGVsYXN5bmMiLCBjbGFzc05hbWUgPSAib3JnLnRlc3QucGFyYWxsZWxhc3luYy5JbnZva2VBc3luY1Jlc3BvbnNlIikNCi0gICAgcHVibGljIEZ1dHVyZTw/PiBpbnZva2VBc3luY0FzeW5jKA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAicmVxdWVzdCIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQ0KLSAgICAgICAgU3RyaW5nIHJlcXVlc3QsDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJhc3luY0hhbmRsZXIiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikNCi0gICAgICAgIEFzeW5jSGFuZGxlcjxJbnZva2VBc3luY1Jlc3BvbnNlPiBhc3luY0hhbmRsZXIpOw0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSByZXF1ZXN0DQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgamF2YS5sYW5nLlN0cmluZw0KLSAgICAgKi8NCi0gICAgQFdlYk1ldGhvZChhY3Rpb24gPSAiaHR0cDovL29yZy90ZXN0L3BhcmFsbGVsYXN5bmMvaW52b2tlQXN5bmMiKQ0KLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAicmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikNCi0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJpbnZva2VBc3luYyIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL3Rlc3QvcGFyYWxsZWxhc3luYyIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5wYXJhbGxlbGFzeW5jLkludm9rZUFzeW5jIikNCi0gICAgQFJlc3BvbnNlV3JhcHBlcihsb2NhbE5hbWUgPSAiaW52b2tlQXN5bmNSZXNwb25zZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL3Rlc3QvcGFyYWxsZWxhc3luYyIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5wYXJhbGxlbGFzeW5jLkludm9rZUFzeW5jUmVzcG9uc2UiKQ0KLSAgICBwdWJsaWMgU3RyaW5nIGludm9rZUFzeW5jKA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAicmVxdWVzdCIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQ0KLSAgICAgICAgU3RyaW5nIHJlcXVlc3QpOw0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSByZXF1ZXN0DQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgamF2YXgueG1sLndzLlJlc3BvbnNlPG9yZy50ZXN0LnBhcmFsbGVsYXN5bmMuQ3VzdG9tQXN5bmNSZXNwb25zZT4NCi0gICAgICovDQotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJjdXN0b21Bc3luYyIsIGFjdGlvbiA9ICJodHRwOi8vb3JnL3Rlc3QvcGFyYWxsZWxhc3luYy9jdXN0b21Bc3luYyIpDQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAiY3VzdG9tQXN5bmMiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L3BhcmFsbGVsYXN5bmMiLCBjbGFzc05hbWUgPSAib3JnLnRlc3QucGFyYWxsZWxhc3luYy5DdXN0b21Bc3luYyIpDQotICAgIEBSZXNwb25zZVdyYXBwZXIobG9jYWxOYW1lID0gImN1c3RvbUFzeW5jUmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L3BhcmFsbGVsYXN5bmMiLCBjbGFzc05hbWUgPSAib3JnLnRlc3QucGFyYWxsZWxhc3luYy5DdXN0b21Bc3luY1Jlc3BvbnNlIikNCi0gICAgcHVibGljIFJlc3BvbnNlPEN1c3RvbUFzeW5jUmVzcG9uc2U+IHJlbWFwcGVkQXN5bmMoDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJyZXF1ZXN0IiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpDQotICAgICAgICBTdHJpbmcgcmVxdWVzdCk7DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGFzeW5jSGFuZGxlcg0KLSAgICAgKiBAcGFyYW0gcmVxdWVzdA0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTw/IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdD4NCi0gICAgICovDQotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJjdXN0b21Bc3luYyIsIGFjdGlvbiA9ICJodHRwOi8vb3JnL3Rlc3QvcGFyYWxsZWxhc3luYy9jdXN0b21Bc3luYyIpDQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAiY3VzdG9tQXN5bmMiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L3BhcmFsbGVsYXN5bmMiLCBjbGFzc05hbWUgPSAib3JnLnRlc3QucGFyYWxsZWxhc3luYy5DdXN0b21Bc3luYyIpDQotICAgIEBSZXNwb25zZVdyYXBwZXIobG9jYWxOYW1lID0gImN1c3RvbUFzeW5jUmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L3BhcmFsbGVsYXN5bmMiLCBjbGFzc05hbWUgPSAib3JnLnRlc3QucGFyYWxsZWxhc3luYy5DdXN0b21Bc3luY1Jlc3BvbnNlIikNCi0gICAgcHVibGljIEZ1dHVyZTw/PiByZW1hcHBlZEFzeW5jKA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAicmVxdWVzdCIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQ0KLSAgICAgICAgU3RyaW5nIHJlcXVlc3QsDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJhc3luY0hhbmRsZXIiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikNCi0gICAgICAgIEFzeW5jSGFuZGxlcjxDdXN0b21Bc3luY1Jlc3BvbnNlPiBhc3luY0hhbmRsZXIpOw0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSByZXF1ZXN0DQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgamF2YS5sYW5nLlN0cmluZw0KLSAgICAgKi8NCi0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lID0gImN1c3RvbUFzeW5jIiwgYWN0aW9uID0gImh0dHA6Ly9vcmcvdGVzdC9wYXJhbGxlbGFzeW5jL2N1c3RvbUFzeW5jIikNCi0gICAgQFdlYlJlc3VsdChuYW1lID0gInJlc3BvbnNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpDQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAiY3VzdG9tQXN5bmMiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L3BhcmFsbGVsYXN5bmMiLCBjbGFzc05hbWUgPSAib3JnLnRlc3QucGFyYWxsZWxhc3luYy5DdXN0b21Bc3luYyIpDQotICAgIEBSZXNwb25zZVdyYXBwZXIobG9jYWxOYW1lID0gImN1c3RvbUFzeW5jUmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L3BhcmFsbGVsYXN5bmMiLCBjbGFzc05hbWUgPSAib3JnLnRlc3QucGFyYWxsZWxhc3luYy5DdXN0b21Bc3luY1Jlc3BvbnNlIikNCi0gICAgcHVibGljIFN0cmluZyByZW1hcHBlZCgNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gInJlcXVlc3QiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikNCi0gICAgICAgIFN0cmluZyByZXF1ZXN0KTsNCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gcmVxdWVzdA0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIGphdmF4LnhtbC53cy5SZXNwb25zZTxvcmcudGVzdC5wYXJhbGxlbGFzeW5jLkFub3RoZXJSZXNwb25zZT4NCi0gICAgICovDQotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJhbm90aGVyIiwgYWN0aW9uID0gImh0dHA6Ly9vcmcvdGVzdC9wYXJhbGxlbGFzeW5jL2Fub3RoZXIiKQ0KLSAgICBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gImFub3RoZXIiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L3BhcmFsbGVsYXN5bmMiLCBjbGFzc05hbWUgPSAib3JnLnRlc3QucGFyYWxsZWxhc3luYy5Bbm90aGVyIikNCi0gICAgQFJlc3BvbnNlV3JhcHBlcihsb2NhbE5hbWUgPSAiYW5vdGhlclJlc3BvbnNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9wYXJhbGxlbGFzeW5jIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LnBhcmFsbGVsYXN5bmMuQW5vdGhlclJlc3BvbnNlIikNCi0gICAgcHVibGljIFJlc3BvbnNlPEFub3RoZXJSZXNwb25zZT4gYW5vdGhlckFzeW5jQXN5bmMoDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJyZXF1ZXN0IiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpDQotICAgICAgICBTdHJpbmcgcmVxdWVzdCk7DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGFzeW5jSGFuZGxlcg0KLSAgICAgKiBAcGFyYW0gcmVxdWVzdA0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTw/IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdD4NCi0gICAgICovDQotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJhbm90aGVyIiwgYWN0aW9uID0gImh0dHA6Ly9vcmcvdGVzdC9wYXJhbGxlbGFzeW5jL2Fub3RoZXIiKQ0KLSAgICBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gImFub3RoZXIiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L3BhcmFsbGVsYXN5bmMiLCBjbGFzc05hbWUgPSAib3JnLnRlc3QucGFyYWxsZWxhc3luYy5Bbm90aGVyIikNCi0gICAgQFJlc3BvbnNlV3JhcHBlcihsb2NhbE5hbWUgPSAiYW5vdGhlclJlc3BvbnNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9wYXJhbGxlbGFzeW5jIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LnBhcmFsbGVsYXN5bmMuQW5vdGhlclJlc3BvbnNlIikNCi0gICAgcHVibGljIEZ1dHVyZTw/PiBhbm90aGVyQXN5bmNBc3luYygNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gInJlcXVlc3QiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikNCi0gICAgICAgIFN0cmluZyByZXF1ZXN0LA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiYXN5bmNIYW5kbGVyIiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpDQotICAgICAgICBBc3luY0hhbmRsZXI8QW5vdGhlclJlc3BvbnNlPiBhc3luY0hhbmRsZXIpOw0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSByZXF1ZXN0DQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgamF2YS5sYW5nLlN0cmluZw0KLSAgICAgKi8NCi0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lID0gImFub3RoZXIiLCBhY3Rpb24gPSAiaHR0cDovL29yZy90ZXN0L3BhcmFsbGVsYXN5bmMvYW5vdGhlciIpDQotICAgIEBXZWJSZXN1bHQobmFtZSA9ICJyZXNwb25zZSIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQ0KLSAgICBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gImFub3RoZXIiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L3BhcmFsbGVsYXN5bmMiLCBjbGFzc05hbWUgPSAib3JnLnRlc3QucGFyYWxsZWxhc3luYy5Bbm90aGVyIikNCi0gICAgQFJlc3BvbnNlV3JhcHBlcihsb2NhbE5hbWUgPSAiYW5vdGhlclJlc3BvbnNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9wYXJhbGxlbGFzeW5jIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LnBhcmFsbGVsYXN5bmMuQW5vdGhlclJlc3BvbnNlIikNCi0gICAgcHVibGljIFN0cmluZyBhbm90aGVyQXN5bmMoDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJyZXF1ZXN0IiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpDQotICAgICAgICBTdHJpbmcgcmVxdWVzdCk7DQotICAgIA0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSByZXF1ZXN0DQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgamF2YS5sYW5nLlN0cmluZw0KLSAgICAgKi8NCi0gICAgQFdlYk1ldGhvZChleGNsdWRlPXRydWUpDQotICAgIHB1YmxpYyBTdHJpbmcgY3VzdG9tQXN5bmMoDQotICAgICAgICBTdHJpbmcgcmVxdWVzdCk7DQotDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvcGFyYWxsZWxhc3luYy9zZXJ2ZXIvQXN5bmNTZXJ2aWNlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL3BhcmFsbGVsYXN5bmMvc2VydmVyL0FzeW5jU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjQ2YmUzLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvcGFyYWxsZWxhc3luYy9zZXJ2ZXIvQXN5bmNTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5wYXJhbGxlbGFzeW5jLnNlcnZlcjsNCi0NCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJFbmRwb2ludDsNCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VDbGllbnQ7DQotaW1wb3J0IGphdmEuaW8uRmlsZTsNCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLm5ldC5VUkw7DQotDQotLyoqDQotICogVGhpcyBjbGFzcyB3YXMgZ2VuZXJhdGVkIGJ5IHRoZSBKQVhXUyBTSS4NCi0gKiBKQVgtV1MgUkkgMi4wLjEtamF4d3MtcmVhcmNoLTIwMDUtbmlnaHRseV8yMDA2LTA4LTE2XzAyLTMyLTAzLU0xDQotICogR2VuZXJhdGVkIHNvdXJjZSB2ZXJzaW9uOiAyLjANCi0gKiANCi0gKi8NCi1AV2ViU2VydmljZUNsaWVudChuYW1lID0gIkFzeW5jU2VydmljZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL3Rlc3QvcGFyYWxsZWxhc3luYyIsIHdzZGxMb2NhdGlvbiA9ICJhc3luY19kb2NsaXR3ci53c2RsIikNCi1wdWJsaWMgY2xhc3MgQXN5bmNTZXJ2aWNlDQotICAgIGV4dGVuZHMgU2VydmljZQ0KLXsNCi0NCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgVVJMIEFTWU5DU0VSVklDRV9XU0RMX0xPQ0FUSU9OOw0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgd3NkbExvY2F0aW9uPSIvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9wYXJhbGxlbGFzeW5jL3NlcnZlci9NRVRBLUlORi9hc3luY19kb2NsaXR3ci53c2RsIjsNCi0gICAgc3RhdGljIHsNCi0gICAgICAgIFVSTCB1cmwgPSBudWxsOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICB0cnl7DQotICAgICAgICAgICAgICAgIFN0cmluZyBiYXNlRGlyID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJiYXNlZGlyIiwiLiIpKS5nZXRDYW5vbmljYWxQYXRoKCk7DQotICAgICAgICAgICAgICAgIHdzZGxMb2NhdGlvbiA9IG5ldyBGaWxlKGJhc2VEaXIgKyB3c2RsTG9jYXRpb24pLmdldEFic29sdXRlUGF0aCgpOw0KLSAgICAgICAgICAgIH1jYXRjaChFeGNlcHRpb24gZSl7DQotICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKHdzZGxMb2NhdGlvbik7DQotICAgICAgICAgICAgdXJsID0gZmlsZS50b1VSTCgpOw0KLSAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgQVNZTkNTRVJWSUNFX1dTRExfTE9DQVRJT04gPSB1cmw7DQotICAgIH0NCi0gICAgDQotDQotICAgIHB1YmxpYyBBc3luY1NlcnZpY2UoVVJMIHdzZGxMb2NhdGlvbiwgUU5hbWUgc2VydmljZU5hbWUpIHsNCi0gICAgICAgIHN1cGVyKHdzZGxMb2NhdGlvbiwgc2VydmljZU5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBBc3luY1NlcnZpY2UoKSB7DQotICAgICAgICBzdXBlcihBU1lOQ1NFUlZJQ0VfV1NETF9MT0NBVElPTiwgbmV3IFFOYW1lKCJodHRwOi8vb3JnL3Rlc3QvcGFyYWxsZWxhc3luYyIsICJBc3luY1NlcnZpY2UiKSk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIEFzeW5jUG9ydA0KLSAgICAgKi8NCi0gICAgQFdlYkVuZHBvaW50KG5hbWUgPSAiQXN5bmNQb3J0IikNCi0gICAgcHVibGljIEFzeW5jUG9ydCBnZXRBc3luY1BvcnQoKSB7DQotICAgICAgICByZXR1cm4gKEFzeW5jUG9ydClzdXBlci5nZXRQb3J0KG5ldyBRTmFtZSgiaHR0cDovL29yZy90ZXN0L3BhcmFsbGVsYXN5bmMiLCAiQXN5bmNQb3J0IiksIEFzeW5jUG9ydC5jbGFzcyk7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9wYXJhbGxlbGFzeW5jL3NlcnZlci9Eb2NMaXRXcmFwcGVkUG9ydEltcGwuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvcGFyYWxsZWxhc3luYy9zZXJ2ZXIvRG9jTGl0V3JhcHBlZFBvcnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3MGM0OWIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9wYXJhbGxlbGFzeW5jL3NlcnZlci9Eb2NMaXRXcmFwcGVkUG9ydEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxMiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5wYXJhbGxlbGFzeW5jLnNlcnZlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5UZXN0TG9nZ2VyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5wYXJhbGxlbGFzeW5jLmNvbW1vbi5Db25zdGFudHM7DQotaW1wb3J0IG9yZy50ZXN0LnBhcmFsbGVsYXN5bmMuQW5vdGhlclJlc3BvbnNlOw0KLWltcG9ydCBvcmcudGVzdC5wYXJhbGxlbGFzeW5jLkN1c3RvbUFzeW5jUmVzcG9uc2U7DQotaW1wb3J0IG9yZy50ZXN0LnBhcmFsbGVsYXN5bmMuSW52b2tlQXN5bmNSZXNwb25zZTsNCi1pbXBvcnQgb3JnLnRlc3QucGFyYWxsZWxhc3luYy5QaW5nUmVzcG9uc2U7DQotaW1wb3J0IG9yZy50ZXN0LnBhcmFsbGVsYXN5bmMuU2xlZXBSZXNwb25zZTsNCi0NCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5Bc3luY0hhbmRsZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5Ib2xkZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5SZXNwb25zZTsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsNCi1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOw0KLQ0KLS8qKg0KLSAqIEFzeW5jIGVuZHBvaW50IHVzZWQgZm9yIEFzeW5jIGNsaWVudCBzaWRlIHRlc3RzLiBDbGllbnRzIHdpbGwgaW52b2tlQXN5bmMNCi0gKiBzbGVlcCBtZXRob2QgdG8gZm9yY2UgdGhlIHNlcnZlciB0byBibG9jayB1bnRpbCB3YWtlVXAgaXMgY2FsbGVkLiBUaGUgY2xpZW50DQotICogY2FuIGNhbGwgaXNBc2xlZXAgdG8gdmVyaWZ5IHRoYXQgc2xlZXAgaGFzIGJlZW4gY2FsbGVkIGJ5IHRoZSBhc3luYyB0aHJlYWQuDQotICovDQotLyoNCi1AV2ViU2VydmljZSgNCi0gICAgICAgIHNlcnZpY2VOYW1lPSJBc3luY1NlcnZpY2UiLA0KLSAgICAgICAgcG9ydE5hbWU9IkFzeW5jUG9ydCIsDQotICAgICAgICB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L3BhcmFsbGVsYXN5bmMiLA0KLSAgICAgICAgZW5kcG9pbnRJbnRlcmZhY2UgPSAib3JnLnRlc3QucGFyYWxsZWxhc3luYy5Bc3luY1BvcnQiLA0KLSAgICAgICAgd3NkbExvY2F0aW9uPSJXRUItSU5GL3dzZGwvYXN5bmNfZG9jbGl0d3Iud3NkbCIpDQotICAgICAgICAqLw0KLUBXZWJTZXJ2aWNlKHNlcnZpY2VOYW1lPSJBc3luY1NlcnZpY2UiLA0KLQkJCWVuZHBvaW50SW50ZXJmYWNlPSJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5wYXJhbGxlbGFzeW5jLnNlcnZlci5Bc3luY1BvcnQiKQ0KLXB1YmxpYyBjbGFzcyBEb2NMaXRXcmFwcGVkUG9ydEltcGwgaW1wbGVtZW50cyBBc3luY1BvcnQgew0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gZmFsc2U7DQotDQotICAgIC8vIGluIG9yZGVyIHRvIGFsbG93IG11bHRpcGxlIHNsZWVwaW5nIHJlcXVlc3RzIHRvIGJlIGhlbGQgYXQgdGhlIHNhbWUgdGltZQ0KLSAgICAvLyB1c2UgYSB0YWJsZSB3aGVyZSANCi0gICAgLy8gICAgICAgdGhlIGtleSBpcyB0aGUgcmVxdWVzdCBzdHJpbmcNCi0gICAgLy8gICAgICAgdGhlIHZhbHVlIGlzIHRoZSBvYmplY3QgdXNlZCB0byBibG9jayBvbg0KLSAgICAvLw0KLSAgICBwcml2YXRlIHN0YXRpYyBIYXNodGFibGUgc2xlZXBlcnMgPSBuZXcgSGFzaHRhYmxlKCk7DQotDQotICAgIC8vIGludGVuZGVkIHRvIGZsYWcgdGhlIG5lZWQgdG8gY2FuY2VsIGN1cnJlbnQgcmVxdWVzdHMgYmVpbmcgaGVsZCAoaWUsIHNsZWVwaW5nKQ0KLSAgICAvLyBkb2VzIG5vdCBzdG9wIG5ldyByZXF1ZXN0cw0KLSAgICAvLyBub3Qgc2V0dGFibGUgeWV0DQotICAgIC8vIG5lZWQgdG8gZGV0ZXJtaW5lIHdoZW4gdG8gcmVzZXQgaXQgd2hlbiBkZWFsaW5nIHdpdGggbXVsdGlwbGUgb3BlcmF0aW9ucw0KLSAgICAvLyBjdXJyZW50bHkgcmVzZXQgd2hlbiB0aGUgc2xlZXBlcnMgdGFibGUgZG9lc24ndCBoYXZlIGFueSBtb3JlIHJlcXVlc3RzDQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gZG9DYW5jZWxsID0gZmFsc2U7DQotDQotICAgIC8vIHN0cmluZ3MgdXNlZCBmb3IgbG9nZ2luZw0KLSAgICBwcml2YXRlIFN0cmluZyBteUNsYXNzTmFtZSA9ICJEb2NMaXRXcmFwcGVkUG9ydEltcGwuIjsNCi0NCi0NCi0NCi0gICAgLyoqDQotICAgICAqIFRoaXMgb3BlcmF0aW9uIHRha2VzIHRoZSByZXF1ZXN0IGFuZCBob2xkcyBpdCBpbiB0aGUgd2ViIHNlcnZpY2UgdW50aWwNCi0gICAgICogPFVMPg0KLSAgICAgKiA8TEk+dGhlIGNsaWVudCBhc2tzIGZvciBpdCB2aWEgd2FrZVVwKCkNCi0gICAgICogPExJPnRoZSBvcGVyYXRpb24gdGltZXMgb3V0DQotICAgICAqIDxMST50aGUgb3BlcmF0aW9uIGlzIGludGVycnVwdGVkDQotICAgICAqIDwvVUw+DQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgcmVxdWVzdCBpZGVudGlmaWVyDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBzbGVlcChIb2xkZXI8U3RyaW5nPiByZXF1ZXN0KSB7DQotDQotICAgICAgICBib29sZWFuIGNhbmNlbFJlcXVlc3RlZCA9IGZhbHNlOw0KLQ0KLSAgICAgICAgU3RyaW5nIGtleSA9IG5ldyBTdHJpbmcocmVxdWVzdC52YWx1ZSk7DQotICAgICAgICBTdHJpbmcgbXNnID0gcmVxdWVzdC52YWx1ZTsNCi0NCi0gICAgICAgIFN0cmluZyB0aXRsZSA9IG15Q2xhc3NOYW1lKyJzbGVlcCgiK21zZysiKTogIjsNCi0gICAgICAgIFN0cmluZyB0aWQgPSAiIHRocmVhZElEIFsiKyBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldElkKCkgKyAiXSAiOw0KLSAgICAgICAgLy9pZiAoREVCVUcpDQotICAgICAgICAvL3sNCi0gICAgICAgIC8vICAgIFN5c3RlbS5vdXQucHJpbnRsbih0aXRsZSArIHRpZCArICJFbnRlciIpOw0KLSAgICAgICAgLy99DQotDQotICAgICAgICBpZiAoc2xlZXBlcnMuZ2V0KGtleSkgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvLyBhbHJlYWR5IGhvbGRpbmcgdGhpcyByZXF1ZXN0IGlkDQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgVGhyZWFkIG15VGhyZWFkID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKTsNCi0gICAgICAgIGxvbmcgdGhyZWFkSUQgPSBteVRocmVhZC5nZXRJZCgpOw0KLQ0KLSAgICAgICAgLy8gYWRkIHRoaXMgcmVxdWVzdCB0byBvdXIgbGlzdA0KLSAgICAgICAgc2xlZXBlcnMucHV0KGtleSxteVRocmVhZCk7DQotDQotICAgICAgICAvLyBzZXQgdGhlIHRpbWVvdXQgdmFsdWUNCi0gICAgICAgIGxvbmcgc2VjID0gQ29uc3RhbnRzLlNFUlZFUl9TTEVFUF9TRUM7DQotDQotICAgICAgICB0cnkgew0KLQ0KLSAgICAgICAgICAgIC8vaWYgKERFQlVHKQ0KLSAgICAgICAgICAgIC8vICAgIFN5c3RlbS5vdXQucHJpbnRsbih0aXRsZSArICJTdGFydGluZyB0byBzbGVlcCBvbiAiDQotICAgICAgICAgICAgLy8gICAgICAgICAgICArICIgdGhyZWFkSUQgWyIrIHRocmVhZElEICsgIl0iICk7DQotDQotICAgICAgICAgICAgLy8gaG9sZCB0aGlzIHJlcXVlc3QgdW50aWwNCi0gICAgICAgICAgICAvLyAgLSB0aGUgd2FpdCB0aW1lIGV4cGlyZXMNCi0gICAgICAgICAgICAvLyAgLSB0aGUgY2xpZW50IGV4cGxpY2l0cyBhc2tzIGZvciB0aGlzIHJlcXVlc3QgdmlhIHdha2VVcCgpDQotICAgICAgICAgICAgLy8gIC0gdGhlIHdhaXQgaXMgaW50ZXJydXB0ZWQNCi0gICAgICAgICAgICAvLyAgLSBhIGNhbmNlbCBvY2N1cnMNCi0NCi0gICAgICAgICAgICB3aGlsZSAoc2VjID4gMCAmJiAhZG9DYW5jZWxsKSB7DQotICAgICAgICAgICAgICAgIGlmIChERUJVRykNCi0gICAgICAgICAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKHRpdGxlICsgIlNsZWVwaW5nIG9uICINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHRocmVhZElEIFsiICsgdGhyZWFkSUQgKyAiXSINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHRpbWVMZWZ0PSIgKyBzZWMpOw0KLSAgICAgICAgICAgICAgICBzZWMtLTsNCi0NCi0gICAgICAgICAgICAgICAgLy9tc2cud2FpdCg1MDApOw0KLSAgICAgICAgICAgICAgICBteVRocmVhZC5zbGVlcCg1MDApOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgIH0gDQotICAgICAgICBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgew0KLQ0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKHRpdGxlICsgIlNsZWVwIGludGVycnVwdGVkIG9uICINCi0gICAgICAgICAgICAgICAgICAgICsgIiB0aHJlYWRJRCBbIiArIHRocmVhZElEICsgIl0iDQotICAgICAgICAgICAgICAgICAgICArICIgdGltZUxlZnQ9WyIgKyBzZWMgKyAiXSIpOw0KLQ0KLSAgICAgICAgfSANCi0gICAgICAgIGZpbmFsbHkgew0KLQ0KLSAgICAgICAgICAgIGlmIChERUJVRykNCi0gICAgICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcodGl0bGUgKyAiZmluYWwgcHJvY2Vzc2luZyBmb3IgIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiB0aHJlYWRJRCBbIiArIHRocmVhZElEICsgIl0iKTsNCi0NCi0gICAgICAgICAgICAvLyByZW1vdmUgdGhpcyByZXF1ZXN0IGZyb20gdGhlIGxpc3QNCi0gICAgICAgICAgICBzbGVlcGVycy5yZW1vdmUoa2V5KTsNCi0NCi0gICAgICAgICAgICAvLyBmb3Igbm93LCByZXNldCB0aGUgY2FuY2VsbGF0aW9uIGZsYWcgd2hlbiB0aGUgbGlzdCBvZiANCi0gICAgICAgICAgICAvLyB3YWl0aW5nIHJlcXVlc3RzIGdvIHRvIHplcm8NCi0gICAgICAgICAgICBpZiAoc2xlZXBlcnMuaXNFbXB0eSgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgZG9DYW5jZWxsID0gZmFsc2U7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBDaGVja3MgdGhlIHNwZWNpZmllZCByZXF1ZXN0IHRvIGRldGVybWluZSB3aGV0aGVyDQotICAgICAqIGl0IGlzIHN0aWxsIGJlaW5nIGhlbGQgYnkgdGhlIHdlYiBzZXJ2aWNlLg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHJlcXVlc3QgaWRlbnRpZmllciB0byBjaGVjaw0KLSAgICAgKiBAcmV0dXJuIFRoZSBTdHJpbmcgYmVpbmcgdXNlZCBhcyBhIHdhaXQgb2JqZWN0IGlmIHRoZQ0KLSAgICAgKiAgICAgICAgIHJlcXVlc3QgaXMgc3RpbGwgYmVpbmcgaGVsZCBieSB0aGUgc2VydmVyDQotICAgICAqICAgICAgICAgb3IgTlVMTCBpZiB0aGUgcmVxdWVzdCBpcyBub3QgaGVsZCBieSB0aGUgc2VydmVyDQotICAgICAqLw0KLSAgICBwdWJsaWMgU3RyaW5nIGlzQXNsZWVwKFN0cmluZyByZXF1ZXN0KSB7DQotDQotICAgICAgICBTdHJpbmcgdGl0bGUgPSBteUNsYXNzTmFtZSsiaXNBc2xlZXAoIityZXF1ZXN0KyIpOiAiOw0KLSAgICAgICAgU3RyaW5nIHRpZCA9ICIgdGhyZWFkSUQgWyIrIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0SWQoKSArICJdICI7DQotDQotICAgICAgICBpZiAoc2xlZXBlcnMuaXNFbXB0eSgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChERUJVRykNCi0gICAgICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcodGl0bGUgKyB0aWQgKyAiIE5vdCBzbGVlcGluZyIpOw0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgVGhyZWFkIHZhbHVlID0gKFRocmVhZCkgc2xlZXBlcnMuZ2V0KHJlcXVlc3QpOw0KLQ0KLSAgICAgICAgaWYgKHZhbHVlID09IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKERFQlVHKQ0KLSAgICAgICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1Zyh0aXRsZSArIHRpZCArICIgTm90IHNsZWVwaW5nIik7DQotDQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoREVCVUcpDQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcodGl0bGUgKyB0aWQgKyAiIHNsZWVwaW5nIG9uIFsiICsgcmVxdWVzdCArICJdIik7DQotDQotICAgICAgICByZXR1cm4gcmVxdWVzdDsNCi0gICAgfQ0KLQ0KLQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIHdha2VVcChTdHJpbmcgcmVxdWVzdCkgew0KLQ0KLSAgICAgICAgU3RyaW5nIHRpdGxlID0gbXlDbGFzc05hbWUrIndha2VVcCgpOiAiOw0KLSAgICAgICAgU3RyaW5nIHRpZCA9ICIgdGhyZWFkSUQgWyIrIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0SWQoKSArICJdIjsNCi0NCi0gICAgICAgIGlmIChzbGVlcGVycy5pc0VtcHR5KCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKERFQlVHKQ0KLSAgICAgICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1Zyh0aXRsZSArIHRpZCArICIgTm8gb25lIHRvIHdha2UgdXAiKTsNCi0NCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFRocmVhZCB2YWx1ZSA9IChUaHJlYWQpIHNsZWVwZXJzLmdldChyZXF1ZXN0KTsNCi0NCi0gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChERUJVRykNCi0gICAgICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcodGl0bGUgKyB0aWQgKyAiIFRocmVhZCBub3QgYXZhaWxhYmxlLiBObyBvbmUgdG8gd2FrZSB1cC4iKTsNCi0NCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChERUJVRykNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1Zyh0aXRsZSArIHRpZCArICIgSW50ZXJydXB0aW5nICINCi0gICAgICAgICAgICAgICAgICAgICsgIiB0aHJlYWRJRCBbIiArIHZhbHVlLmdldElkKCkgKyAiXSIpOw0KLQ0KLSAgICAgICAgLy8gaW50ZXJydXB0IHRoZSBzbGVlcGVyDQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB2YWx1ZS5pbnRlcnJ1cHQoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoREVCVUcpDQotICAgICAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKHRpdGxlICsgdGlkICsgIiBJbnRlcnJ1cHRpbmcgIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiB0aHJlYWRJRCBbIiArIHZhbHVlLmdldElkKCkgKyAiXSAgZ290IEV4Y2VwdGlvbiBbIiArDQotICAgICAgICAgICAgICAgICAgICAgICAgZS5nZXRDbGFzcygpLmdldE5hbWUoKSArICJdICAgWyIgKyBlLmdldE1lc3NhZ2UoKSArICJdIik7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVxdWVzdDsNCi0gICAgfQ0KLQ0KLQ0KLSAgICAvKioNCi0gICAgICogY2xpZW50IHNpZGUgdGVzdHMgZm9yIHJlbWFwcGluZyBvcGVyYXRpb24gbmFtZXMsIG9uIHRoZSBzZXJ2ZXIgc2lkZSBhbGwNCi0gICAgICogd2UgbmVlZCB0byBkbyBpcyByb3VuZHRyaXAgdGhlIG1lc3NhZ2UNCi0gICAgICovDQotDQotICAgIHB1YmxpYyBTdHJpbmcgaW52b2tlQXN5bmMoU3RyaW5nIHJlcXVlc3QpIHsNCi0gICAgICAgIFN0cmluZyB0aXRsZSA9IG15Q2xhc3NOYW1lKyJpbnZva2VBc3luYygiK3JlcXVlc3QrIikgOiAiOw0KLSAgICAgICAgU3RyaW5nIHRpZCA9ICIgdGhyZWFkSUQgWyIrIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0SWQoKSArICJdIjsNCi0gICAgICAgIGlmIChERUJVRykNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1Zyh0aXRsZSArICJFbnRlciIgKyB0aWQpOw0KLQ0KLSAgICAgICAgcmV0dXJuIHJlcXVlc3Q7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBjdXN0b21Bc3luYyhTdHJpbmcgcmVxdWVzdCkgew0KLSAgICAgICAgU3RyaW5nIHRpdGxlID0gbXlDbGFzc05hbWUrImN1c3RvbWVBc3luYygiK3JlcXVlc3QrIikgOiAiOw0KLSAgICAgICAgU3RyaW5nIHRpZCA9ICIgdGhyZWFkSUQgWyIrIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0SWQoKSArICJdIjsNCi0gICAgICAgIGlmIChERUJVRykNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1Zyh0aXRsZSArICJFbnRlciIgKyB0aWQpOw0KLQ0KLSAgICAgICAgcmV0dXJuIHJlcXVlc3QgKyAiZnJvbSBjdXN0b21Bc3luYyBtZXRob2QiOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgYW5vdGhlcihTdHJpbmcgcmVxdWVzdCkgew0KLSAgICAgICAgU3RyaW5nIHRpdGxlID0gbXlDbGFzc05hbWUrImFub3RoZXIoIityZXF1ZXN0KyIpIDogIjsNCi0gICAgICAgIFN0cmluZyB0aWQgPSAiIHRocmVhZElEIFsiKyBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldElkKCkgKyAiXSI7DQotICAgICAgICBpZiAoREVCVUcpDQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcodGl0bGUgKyAiRW50ZXIiICsgdGlkKTsNCi0NCi0gICAgICAgIHJldHVybiByZXF1ZXN0Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgcGluZyhTdHJpbmcgcmVxdWVzdCkgew0KLSAgICAgICAgU3RyaW5nIHRpdGxlID0gbXlDbGFzc05hbWUrInBpbmcoIityZXF1ZXN0KyIpIDogIjsNCi0gICAgICAgIFN0cmluZyB0aWQgPSAiIHRocmVhZElEIFsiKyBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldElkKCkgKyAiXSI7DQotICAgICAgICBpZiAoREVCVUcpDQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcodGl0bGUgKyAiRW50ZXIiICsgdGlkKTsNCi0NCi0gICAgICAgIHJldHVybiByZXF1ZXN0Ow0KLSAgICB9DQotDQotDQotICAgIHB1YmxpYyBTdHJpbmcgcmVtYXBwZWQoU3RyaW5nIHJlcXVlc3QpIHsNCi0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWINCi0gICAgICAgIFN0cmluZyB0aXRsZSA9IG15Q2xhc3NOYW1lKyJyZW1hcHBlZCgiK3JlcXVlc3QrIikgOiAiOw0KLSAgICAgICAgU3RyaW5nIHRpZCA9ICIgdGhyZWFkSUQgWyIrIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0SWQoKSArICJdIjsNCi0gICAgICAgIGlmIChERUJVRykNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1Zyh0aXRsZSArICJFbnRlciIgKyB0aWQpOw0KLQ0KLSAgICAgICAgcmV0dXJuIHJlcXVlc3Q7DQotICAgIH0NCi0NCi0NCi0gICAgLy8gTk9UIFVTRUQ6DQotICAgIA0KLSAgICBwdWJsaWMgU3RyaW5nIGFub3RoZXJBc3luYyhTdHJpbmcgcmVxdWVzdCkgew0KLSAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1Yg0KLSAgICAgICAgU3RyaW5nIHRpdGxlID0gbXlDbGFzc05hbWUrImFub3RoZXJBc3luYygiK3JlcXVlc3QrIikgOiAiOw0KLSAgICAgICAgU3RyaW5nIHRpZCA9ICIgdGhyZWFkSUQgWyIrIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0SWQoKSArICJdIjsNCi0gICAgICAgIGlmIChERUJVRykNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1Zyh0aXRsZSArICJFbnRlciIgKyB0aWQpOw0KLQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEZ1dHVyZTw/PiBhbm90aGVyQXN5bmNBc3luYyhTdHJpbmcgcmVxdWVzdCwgQXN5bmNIYW5kbGVyPEFub3RoZXJSZXNwb25zZT4gYXN5bmNIYW5kbGVyKSB7DQotICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViDQotICAgICAgICBTdHJpbmcgdGl0bGUgPSBteUNsYXNzTmFtZSsiIEZ1dHVyZTw/PiBhbm90aGVyQXN5bmNBc3luYygiK3JlcXVlc3QrIikgOiAiOw0KLSAgICAgICAgU3RyaW5nIHRpZCA9ICIgdGhyZWFkSUQgWyIrIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0SWQoKSArICJdIjsNCi0gICAgICAgIGlmIChERUJVRykNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1Zyh0aXRsZSArICJFbnRlciIgKyB0aWQpOw0KLQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFJlc3BvbnNlPEFub3RoZXJSZXNwb25zZT4gYW5vdGhlckFzeW5jQXN5bmMoU3RyaW5nIHJlcXVlc3QpIHsNCi0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWINCi0gICAgICAgIFN0cmluZyB0aXRsZSA9IG15Q2xhc3NOYW1lKyIgUmVzcG9uc2U8QW5vdGhlclJlc3BvbnNlPiBhbm90aGVyQXN5bmNBc3luYygiK3JlcXVlc3QrIikgOiAiOw0KLSAgICAgICAgU3RyaW5nIHRpZCA9ICIgdGhyZWFkSUQgWyIrIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0SWQoKSArICJdIjsNCi0gICAgICAgIGlmIChERUJVRykNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1Zyh0aXRsZSArICJFbnRlciIgKyB0aWQpOw0KLQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEZ1dHVyZTw/PiBpbnZva2VBc3luY0FzeW5jKFN0cmluZyByZXF1ZXN0LCBBc3luY0hhbmRsZXI8SW52b2tlQXN5bmNSZXNwb25zZT4gYXN5bmNIYW5kbGVyKSB7DQotICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViDQotICAgICAgICBTdHJpbmcgdGl0bGUgPSBteUNsYXNzTmFtZSsiIEZ1dHVyZTw/PiBpbnZva2VBc3luY0FzeW5jKCIrcmVxdWVzdCsiKSA6ICI7DQotICAgICAgICBTdHJpbmcgdGlkID0gIiB0aHJlYWRJRCBbIisgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRJZCgpICsgIl0iOw0KLSAgICAgICAgaWYgKERFQlVHKQ0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKHRpdGxlICsgIkVudGVyIiArIHRpZCk7DQotDQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUmVzcG9uc2U8SW52b2tlQXN5bmNSZXNwb25zZT4gaW52b2tlQXN5bmNBc3luYyhTdHJpbmcgcmVxdWVzdCkgew0KLSAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1Yg0KLSAgICAgICAgU3RyaW5nIHRpdGxlID0gbXlDbGFzc05hbWUrIiBSZXNwb25zZTxJbnZva2VBc3luY1Jlc3BvbnNlPiBpbnZva2VBc3luY0FzeW5jKCIrcmVxdWVzdCsiKSA6ICI7DQotICAgICAgICBTdHJpbmcgdGlkID0gIiB0aHJlYWRJRCBbIisgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRJZCgpICsgIl0iOw0KLSAgICAgICAgaWYgKERFQlVHKQ0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKHRpdGxlICsgIkVudGVyIiArIHRpZCk7DQotDQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgRnV0dXJlPD8+IHBpbmdBc3luYyhTdHJpbmcgcmVxdWVzdCwgQXN5bmNIYW5kbGVyPFBpbmdSZXNwb25zZT4gYXN5bmNIYW5kbGVyKSB7DQotICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViDQotICAgICAgICBTdHJpbmcgdGl0bGUgPSBteUNsYXNzTmFtZSsiIEZ1dHVyZTw/PiBwaW5nQXN5bmMoIityZXF1ZXN0KyIpIDogIjsNCi0gICAgICAgIFN0cmluZyB0aWQgPSAiIHRocmVhZElEIFsiKyBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldElkKCkgKyAiXSI7DQotICAgICAgICBpZiAoREVCVUcpDQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcodGl0bGUgKyAiRW50ZXIiICsgdGlkKTsNCi0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBSZXNwb25zZTxQaW5nUmVzcG9uc2U+IHBpbmdBc3luYyhTdHJpbmcgcmVxdWVzdCkgew0KLSAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1Yg0KLSAgICAgICAgU3RyaW5nIHRpdGxlID0gbXlDbGFzc05hbWUrIiBSZXNwb25zZTxQaW5nUmVzcG9uc2U+IHBpbmdBc3luYygiK3JlcXVlc3QrIikgOiAiOw0KLSAgICAgICAgU3RyaW5nIHRpZCA9ICIgdGhyZWFkSUQgWyIrIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0SWQoKSArICJdIjsNCi0gICAgICAgIGlmIChERUJVRykNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1Zyh0aXRsZSArICJFbnRlciIgKyB0aWQpOw0KLQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEZ1dHVyZTw/PiByZW1hcHBlZEFzeW5jKFN0cmluZyByZXF1ZXN0LCBBc3luY0hhbmRsZXI8Q3VzdG9tQXN5bmNSZXNwb25zZT4gYXN5bmNIYW5kbGVyKSB7DQotICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViDQotICAgICAgICBTdHJpbmcgdGl0bGUgPSBteUNsYXNzTmFtZSsiIEZ1dHVyZTw/PiByZW1hcHBlZEFzeW5jKCIrcmVxdWVzdCsiKSA6ICI7DQotICAgICAgICBTdHJpbmcgdGlkID0gIiB0aHJlYWRJRCBbIisgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRJZCgpICsgIl0iOw0KLSAgICAgICAgaWYgKERFQlVHKQ0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKHRpdGxlICsgIkVudGVyIiArIHRpZCk7DQotDQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUmVzcG9uc2U8Q3VzdG9tQXN5bmNSZXNwb25zZT4gcmVtYXBwZWRBc3luYyhTdHJpbmcgcmVxdWVzdCkgew0KLSAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1Yg0KLSAgICAgICAgU3RyaW5nIHRpdGxlID0gbXlDbGFzc05hbWUrIiBSZXNwb25zZTxDdXN0b21Bc3luY1Jlc3BvbnNlPiByZW1hcHBlZEFzeW5jKCIrcmVxdWVzdCsiKSA6ICI7DQotICAgICAgICBTdHJpbmcgdGlkID0gIiB0aHJlYWRJRCBbIisgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRJZCgpICsgIl0iOw0KLSAgICAgICAgaWYgKERFQlVHKQ0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKHRpdGxlICsgIkVudGVyIiArIHRpZCk7DQotDQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgRnV0dXJlPD8+IHNsZWVwQXN5bmMoU3RyaW5nIHJlcXVlc3QsIEFzeW5jSGFuZGxlcjxTbGVlcFJlc3BvbnNlPiBhc3luY0hhbmRsZXIpIHsNCi0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWINCi0gICAgICAgIFN0cmluZyB0aXRsZSA9IG15Q2xhc3NOYW1lKyIgRnV0dXJlPD8+IHNsZWVwQXN5bmMoIityZXF1ZXN0KyIpIDogIjsNCi0gICAgICAgIFN0cmluZyB0aWQgPSAiIHRocmVhZElEIFsiKyBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldElkKCkgKyAiXSI7DQotICAgICAgICBpZiAoREVCVUcpDQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcodGl0bGUgKyAiRW50ZXIiICsgdGlkKTsNCi0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBSZXNwb25zZTxTbGVlcFJlc3BvbnNlPiBzbGVlcEFzeW5jKFN0cmluZyByZXF1ZXN0KSB7DQotICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViDQotICAgICAgICBTdHJpbmcgdGl0bGUgPSBteUNsYXNzTmFtZSsiIFJlc3BvbnNlPFNsZWVwUmVzcG9uc2U+IHNsZWVwQXN5bmMoIityZXF1ZXN0KyIpIDogIjsNCi0gICAgICAgIFN0cmluZyB0aWQgPSAiIHRocmVhZElEIFsiKyBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldElkKCkgKyAiXSI7DQotICAgICAgICBpZiAoREVCVUcpDQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcodGl0bGUgKyAiRW50ZXIiICsgdGlkKTsNCi0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotICAgIA0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL3BhcmFsbGVsYXN5bmMvc2VydmVyL01FVEEtSU5GL01BTklGRVNULk1GIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9wYXJhbGxlbGFzeW5jL3NlcnZlci9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTY1ZWZhYS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL3BhcmFsbGVsYXN5bmMvc2VydmVyL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjANCi1BbnQtVmVyc2lvbjogQXBhY2hlIEFudCAxLjYuMQ0KLUNyZWF0ZWQtQnk6IDIuMyAoSUJNIENvcnBvcmF0aW9uKQ0KLQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvcGFyYWxsZWxhc3luYy9zZXJ2ZXIvTUVUQS1JTkYvYXN5bmNfZG9jbGl0d3Iud3NkbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvcGFyYWxsZWxhc3luYy9zZXJ2ZXIvTUVUQS1JTkYvYXN5bmNfZG9jbGl0d3Iud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDAyNzgyYi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL3BhcmFsbGVsYXN5bmMvc2VydmVyL01FVEEtSU5GL2FzeW5jX2RvY2xpdHdyLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSwzNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi0NCi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08d3NkbDpkZWZpbml0aW9ucyB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyINCi0JeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyINCi0JeG1sbnM6dG5zPSJodHRwOi8vb3JnL3Rlc3QvcGFyYWxsZWxhc3luYyINCi0JeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iYXN5bmMiDQotCXRhcmdldE5hbWVzcGFjZT0iaHR0cDovL29yZy90ZXN0L3BhcmFsbGVsYXN5bmMiPg0KLQkNCi0JPHdzZGw6dHlwZXM+DQotCQk8eHNkOnNjaGVtYQ0KLQkJCXRhcmdldE5hbWVzcGFjZT0iaHR0cDovL29yZy90ZXN0L3BhcmFsbGVsYXN5bmMiDQotCQkJeG1sbnM6dG5zPSJodHRwOi8vb3JnL3Rlc3QvcGFyYWxsZWxhc3luYyINCi0JCQl4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4JCQ0KLQkJCQ0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJwaW5nIj4NCi0JCQkJPHhzZDpjb21wbGV4VHlwZT4NCi0JCQkJCTx4c2Q6c2VxdWVuY2U+DQotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9InJlcXVlc3QiIHR5cGU9InhzZDpzdHJpbmciIC8+CQkJCQkJDQotCQkJCQk8L3hzZDpzZXF1ZW5jZT4NCi0JCQkJPC94c2Q6Y29tcGxleFR5cGU+DQotCQkJPC94c2Q6ZWxlbWVudD4JCQ0KLQkJCQ0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJwaW5nUmVzcG9uc2UiPg0KLQkJCQk8eHNkOmNvbXBsZXhUeXBlPg0KLQkJCQkJPHhzZDpzZXF1ZW5jZT4NCi0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0icmVzcG9uc2UiIHR5cGU9InhzZDpzdHJpbmciIC8+DQotCQkJCQk8L3hzZDpzZXF1ZW5jZT4NCi0JCQkJPC94c2Q6Y29tcGxleFR5cGU+DQotCQkJPC94c2Q6ZWxlbWVudD4JCQkNCi0JCQkNCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0ic2xlZXAiPg0KLQkJCQk8eHNkOmNvbXBsZXhUeXBlPg0KLQkJCQkJPHhzZDpzZXF1ZW5jZT4NCi0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0icmVxdWVzdCIgdHlwZT0ieHNkOnN0cmluZyIgLz4JCQkJCQkNCi0JCQkJCTwveHNkOnNlcXVlbmNlPg0KLQkJCQk8L3hzZDpjb21wbGV4VHlwZT4NCi0JCQk8L3hzZDplbGVtZW50PgkJDQotCQkJDQotCQkJPHhzZDplbGVtZW50IG5hbWU9InNsZWVwUmVzcG9uc2UiPg0KLQkJCQk8eHNkOmNvbXBsZXhUeXBlPg0KLQkJCQkJPHhzZDpzZXF1ZW5jZT4NCi0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0icmVzcG9uc2UiIHR5cGU9InhzZDpzdHJpbmciIC8+DQotCQkJCQk8L3hzZDpzZXF1ZW5jZT4NCi0JCQkJPC94c2Q6Y29tcGxleFR5cGU+DQotCQkJPC94c2Q6ZWxlbWVudD4JCQ0KLQ0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJpc0FzbGVlcCI+DQotCQkJCTx4c2Q6Y29tcGxleFR5cGU+DQotCQkJCQk8eHNkOnNlcXVlbmNlPg0KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJyZXF1ZXN0IiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPg0KLQkJCQkJPC94c2Q6c2VxdWVuY2U+DQotCQkJCTwveHNkOmNvbXBsZXhUeXBlPg0KLQkJCTwveHNkOmVsZW1lbnQ+CQ0KLQ0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJpc0FzbGVlcFJlc3BvbnNlIj4NCi0JCQkJPHhzZDpjb21wbGV4VHlwZT4NCi0JCQkJCTx4c2Q6c2VxdWVuY2U+DQotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9InJlc3BvbnNlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPg0KLQkJCQkJPC94c2Q6c2VxdWVuY2U+DQotCQkJCTwveHNkOmNvbXBsZXhUeXBlPg0KLQkJCTwveHNkOmVsZW1lbnQ+CQ0KLQ0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJ3YWtlVXAiPg0KLQkJCQk8eHNkOmNvbXBsZXhUeXBlPg0KLQkJCQkJPHhzZDpzZXF1ZW5jZT4NCi0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0icmVxdWVzdCIgdHlwZT0ieHNkOnN0cmluZyIgLz4NCi0JCQkJCTwveHNkOnNlcXVlbmNlPg0KLQkJCQk8L3hzZDpjb21wbGV4VHlwZT4NCi0JCQk8L3hzZDplbGVtZW50PgkNCi0NCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0id2FrZVVwUmVzcG9uc2UiPg0KLQkJCQk8eHNkOmNvbXBsZXhUeXBlPg0KLQkJCQkJPHhzZDpzZXF1ZW5jZT4NCi0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0icmVzcG9uc2UiIHR5cGU9InhzZDpzdHJpbmciIC8+CQkJCQkJDQotCQkJCQk8L3hzZDpzZXF1ZW5jZT4NCi0JCQkJPC94c2Q6Y29tcGxleFR5cGU+DQotCQkJPC94c2Q6ZWxlbWVudD4JDQotDQotCQkJPHhzZDplbGVtZW50IG5hbWU9Imludm9rZUFzeW5jIj4NCi0JCQkJPHhzZDpjb21wbGV4VHlwZT4NCi0JCQkJCTx4c2Q6c2VxdWVuY2U+DQotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9InJlcXVlc3QiIHR5cGU9InhzZDpzdHJpbmciIC8+CQkJCQkJDQotCQkJCQk8L3hzZDpzZXF1ZW5jZT4NCi0JCQkJPC94c2Q6Y29tcGxleFR5cGU+DQotCQkJPC94c2Q6ZWxlbWVudD4NCi0NCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iaW52b2tlQXN5bmNSZXNwb25zZSI+DQotCQkJCTx4c2Q6Y29tcGxleFR5cGU+DQotCQkJCQk8eHNkOnNlcXVlbmNlPg0KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJyZXNwb25zZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4JCQkJCQkNCi0JCQkJCTwveHNkOnNlcXVlbmNlPg0KLQkJCQk8L3hzZDpjb21wbGV4VHlwZT4NCi0JCQk8L3hzZDplbGVtZW50Pg0KLQ0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJjdXN0b21Bc3luYyI+DQotCQkJCTx4c2Q6Y29tcGxleFR5cGU+DQotCQkJCQk8eHNkOnNlcXVlbmNlPg0KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJyZXF1ZXN0IiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgkJCQkJCQ0KLQkJCQkJPC94c2Q6c2VxdWVuY2U+DQotCQkJCTwveHNkOmNvbXBsZXhUeXBlPg0KLQkJCTwveHNkOmVsZW1lbnQ+DQotDQotCQkJPHhzZDplbGVtZW50IG5hbWU9ImN1c3RvbUFzeW5jUmVzcG9uc2UiPg0KLQkJCQk8eHNkOmNvbXBsZXhUeXBlPg0KLQkJCQkJPHhzZDpzZXF1ZW5jZT4NCi0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0icmVzcG9uc2UiIHR5cGU9InhzZDpzdHJpbmciIC8+CQkJCQkJDQotCQkJCQk8L3hzZDpzZXF1ZW5jZT4NCi0JCQkJPC94c2Q6Y29tcGxleFR5cGU+DQotCQkJPC94c2Q6ZWxlbWVudD4NCi0NCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iYW5vdGhlciI+DQotCQkJCTx4c2Q6Y29tcGxleFR5cGU+DQotCQkJCQk8eHNkOnNlcXVlbmNlPg0KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJyZXF1ZXN0IiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgkJCQkJCQ0KLQkJCQkJPC94c2Q6c2VxdWVuY2U+DQotCQkJCTwveHNkOmNvbXBsZXhUeXBlPg0KLQkJCTwveHNkOmVsZW1lbnQ+DQotDQotCQkJPHhzZDplbGVtZW50IG5hbWU9ImFub3RoZXJSZXNwb25zZSI+DQotCQkJCTx4c2Q6Y29tcGxleFR5cGU+DQotCQkJCQk8eHNkOnNlcXVlbmNlPg0KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJyZXNwb25zZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4JCQkJCQkNCi0JCQkJCTwveHNkOnNlcXVlbmNlPg0KLQkJCQk8L3hzZDpjb21wbGV4VHlwZT4NCi0JCQk8L3hzZDplbGVtZW50Pg0KLQ0KLQkJPC94c2Q6c2NoZW1hPg0KLQk8L3dzZGw6dHlwZXM+DQotDQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0icGluZ1JlcXVlc3QiPg0KLQkJPHdzZGw6cGFydCBuYW1lPSJyZXF1ZXN0IiBlbGVtZW50PSJ0bnM6cGluZyIgLz4NCi0JPC93c2RsOm1lc3NhZ2U+DQotDQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0icGluZ1Jlc3BvbnNlIj4NCi0JCTx3c2RsOnBhcnQgbmFtZT0icmVzcG9uc2UiIGVsZW1lbnQ9InRuczpwaW5nUmVzcG9uc2UiIC8+DQotCTwvd3NkbDptZXNzYWdlPg0KLQ0KLQk8d3NkbDptZXNzYWdlIG5hbWU9InNsZWVwUmVxdWVzdCI+DQotCQk8d3NkbDpwYXJ0IG5hbWU9InJlcXVlc3QiIGVsZW1lbnQ9InRuczpzbGVlcCIgLz4NCi0JPC93c2RsOm1lc3NhZ2U+DQotDQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0ic2xlZXBSZXNwb25zZSI+DQotCQk8d3NkbDpwYXJ0IG5hbWU9InJlc3BvbnNlIiBlbGVtZW50PSJ0bnM6c2xlZXBSZXNwb25zZSIgLz4NCi0JPC93c2RsOm1lc3NhZ2U+DQotCQ0KLQk8d3NkbDptZXNzYWdlIG5hbWU9Indha2VVcFJlcXVlc3QiPg0KLQkJPHdzZGw6cGFydCBuYW1lPSJyZXF1ZXN0IiBlbGVtZW50PSJ0bnM6d2FrZVVwIiAvPgkNCi0JPC93c2RsOm1lc3NhZ2U+DQotDQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0id2FrZVVwUmVzcG9uc2UiPg0KLQkJPHdzZGw6cGFydCBuYW1lPSJyZXNwb25zZSIgZWxlbWVudD0idG5zOndha2VVcFJlc3BvbnNlIiAvPgkNCi0JPC93c2RsOm1lc3NhZ2U+CQ0KLQkNCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJpc0FzbGVlcFJlcXVlc3QiPg0KLQk8d3NkbDpwYXJ0IG5hbWU9InJlcXVlc3QiIGVsZW1lbnQ9InRuczppc0FzbGVlcCIgLz4NCi0JPC93c2RsOm1lc3NhZ2U+DQotDQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0iaXNBc2xlZXBSZXNwb25zZSI+DQotCQk8d3NkbDpwYXJ0IG5hbWU9InJlc3BvbnNlIiBlbGVtZW50PSJ0bnM6aXNBc2xlZXBSZXNwb25zZSIgLz4JDQotCTwvd3NkbDptZXNzYWdlPgkJDQotCQ0KLQk8d3NkbDptZXNzYWdlIG5hbWU9Imludm9rZUFzeW5jUmVxdWVzdCI+DQotCQk8d3NkbDpwYXJ0IG5hbWU9InJlcXVlc3QiIGVsZW1lbnQ9InRuczppbnZva2VBc3luYyIgLz4NCi0JPC93c2RsOm1lc3NhZ2U+DQotDQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0iaW52b2tlQXN5bmNSZXNwb25zZSI+DQotCQk8d3NkbDpwYXJ0IG5hbWU9InJlc3BvbnNlIiBlbGVtZW50PSJ0bnM6aW52b2tlQXN5bmNSZXNwb25zZSIgLz4NCi0JPC93c2RsOm1lc3NhZ2U+CQ0KLQkNCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJjdXN0b21Bc3luY1JlcXVlc3QiPg0KLQkJPHdzZGw6cGFydCBuYW1lPSJyZXF1ZXN0IiBlbGVtZW50PSJ0bnM6Y3VzdG9tQXN5bmMiIC8+DQotCTwvd3NkbDptZXNzYWdlPg0KLQ0KLQk8d3NkbDptZXNzYWdlIG5hbWU9ImN1c3RvbUFzeW5jUmVzcG9uc2UiPg0KLQkJPHdzZGw6cGFydCBuYW1lPSJyZXNwb25zZSIgZWxlbWVudD0idG5zOmN1c3RvbUFzeW5jUmVzcG9uc2UiIC8+DQotCTwvd3NkbDptZXNzYWdlPgkJDQotCQ0KLQk8d3NkbDptZXNzYWdlIG5hbWU9ImFub3RoZXJSZXF1ZXN0Ij4NCi0JCTx3c2RsOnBhcnQgbmFtZT0icmVxdWVzdCIgZWxlbWVudD0idG5zOmFub3RoZXIiIC8+DQotCTwvd3NkbDptZXNzYWdlPg0KLQ0KLQk8d3NkbDptZXNzYWdlIG5hbWU9ImFub3RoZXJSZXNwb25zZSI+DQotCQk8d3NkbDpwYXJ0IG5hbWU9InJlc3BvbnNlIiBlbGVtZW50PSJ0bnM6YW5vdGhlclJlc3BvbnNlIiAvPg0KLQk8L3dzZGw6bWVzc2FnZT4JCQ0KLQkNCi0JPHdzZGw6cG9ydFR5cGUgbmFtZT0iQXN5bmNQb3J0Ij4NCi0JCQ0KLQkJPCEtLSBzaW1wbGUgcGluZyBvcGVyYXRpb24gdGhhdCB3aWxsIGJlIHVzZWQgZm9yIERvY0xpdFdyYXBwZWQgYXN5bmMgdGVzdC0tPg0KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9InBpbmciPg0KLQkJCTx3c2RsOmlucHV0ICBtZXNzYWdlPSJ0bnM6cGluZ1JlcXVlc3QiIC8+DQotCQkJPHdzZGw6b3V0cHV0IG1lc3NhZ2U9InRuczpwaW5nUmVzcG9uc2UiIC8+DQotCQk8L3dzZGw6b3BlcmF0aW9uPgkJDQotCQkNCi0JCTwhLS0gcmVxdWVzdCBmb3IgdGhlIHNlcnZlciB0byBnb3RvIHNsZWVwIHVudGlsIHJlbGVhc2UgaXMgY2FsbGVkLS0+DQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0ic2xlZXAiPg0KLQkJCTx3c2RsOmlucHV0ICBtZXNzYWdlPSJ0bnM6c2xlZXBSZXF1ZXN0IiAvPg0KLQkJCTx3c2RsOm91dHB1dCBtZXNzYWdlPSJ0bnM6c2xlZXBSZXNwb25zZSIgLz4NCi0JCTwvd3NkbDpvcGVyYXRpb24+DQotCQkNCi0JCTwhLS0gY2hlY2sgdG8gc2VlIGlmIHRoZSBzbGVlcCBvcGVyYXRpb24gaGFzIGJlZW4gY2FsbGVkIHlldCAtLT4NCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJpc0FzbGVlcCI+DQotCQkJPHdzZGw6aW5wdXQgIG1lc3NhZ2U9InRuczppc0FzbGVlcFJlcXVlc3QiIC8+DQotCQkJPHdzZGw6b3V0cHV0IG1lc3NhZ2U9InRuczppc0FzbGVlcFJlc3BvbnNlIiAvPg0KLQkJPC93c2RsOm9wZXJhdGlvbj4JCQkNCi0JCQ0KLQkJPCEtLSBmb3JjZSB0aGUgc2xlZXAgb3BlcmF0aW9uIHRvIHN0b3Agc2xlZXBpbmcgLS0+DQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0id2FrZVVwIj4NCi0JCQk8d3NkbDppbnB1dCAgbWVzc2FnZT0idG5zOndha2VVcFJlcXVlc3QiIC8+DQotCQkJPHdzZGw6b3V0cHV0IG1lc3NhZ2U9InRuczp3YWtlVXBSZXNwb25zZSIgLz4NCi0JCTwvd3NkbDpvcGVyYXRpb24+CQkNCi0JCQkNCi0JCQkNCi0JCQkNCi0JCTwhLS0gU2Vjb25kIHN1aXRlIG9mIHRlc3RzIGZvciBBc3luYyBvcGVyYXRpb24gbmFtaW5nOg0KLQkJCSB3aWxsIHRlc3QgZm9yIGhvdyB0aGUgaW1wbGVtZW50YXRpb24gcmVzcG9uZHMgdG8NCi0JCSAgICAgbWV0aG9kcyBlbmRpbmcgaW4gQXN5bmMgd2l0aCBhc3luYyBiaW5kaW5nIGVuYWJsZWQNCi0JCSAtLT4NCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJpbnZva2VBc3luYyI+DQotCQkJPHdzZGw6aW5wdXQgIG1lc3NhZ2U9InRuczppbnZva2VBc3luY1JlcXVlc3QiIC8+DQotCQkJPHdzZGw6b3V0cHV0IG1lc3NhZ2U9InRuczppbnZva2VBc3luY1Jlc3BvbnNlIiAvPg0KLQkJPC93c2RsOm9wZXJhdGlvbj4JCQkNCi0JCQkNCi0JCTwhLS0gd2lsbCB0ZXN0IGZvciBob3cgdGhlIGltcGxlbWVudGF0aW9uIHJlc3BvbmRzIHRvDQotCQkgICAgIG1ldGhvZHMgZW5kaW5nIGluIGFzeW5jIHdpdGggYXN5bmMgYmluZGluZyBlbmFibGVkDQotCQkgLS0+CQkJDQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iY3VzdG9tQXN5bmMiPg0KLQkJCTx3c2RsOmlucHV0ICBtZXNzYWdlPSJ0bnM6Y3VzdG9tQXN5bmNSZXF1ZXN0IiAvPg0KLQkJCTx3c2RsOm91dHB1dCBtZXNzYWdlPSJ0bnM6Y3VzdG9tQXN5bmNSZXNwb25zZSIgLz4NCi0JCTwvd3NkbDpvcGVyYXRpb24+DQotCQkNCi0JCTwhLS0gd2Ugd2lsbCBtYXAgdGhpcyBvcGVyYXRpb24gdG8gYSBqYXZhIG1ldGhvZCBlbmRpbmcgaW4gQXN5bmMNCi0JCSAtLT4JCQ0KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImFub3RoZXIiPg0KLQkJCTx3c2RsOmlucHV0ICBtZXNzYWdlPSJ0bnM6YW5vdGhlclJlcXVlc3QiIC8+DQotCQkJPHdzZGw6b3V0cHV0IG1lc3NhZ2U9InRuczphbm90aGVyUmVzcG9uc2UiIC8+DQotCQk8L3dzZGw6b3BlcmF0aW9uPgkJCQkJDQotCQkJDQotCTwvd3NkbDpwb3J0VHlwZT4NCi0JDQotCTx3c2RsOmJpbmRpbmcgbmFtZT0iQXN5bmMiIHR5cGU9InRuczpBc3luY1BvcnQiPg0KLQkJPHNvYXA6YmluZGluZyBzdHlsZT0iZG9jdW1lbnQiIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIiAvPg0KLQkJDQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0icGluZyI+DQotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly9vcmcvdGVzdC9wYXJhbGxlbGFzeW5jL3BpbmciIC8+DQotCQkJPHdzZGw6aW5wdXQ+DQotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAgLz4NCi0JCQk8L3dzZGw6aW5wdXQ+DQotCQkJPHdzZGw6b3V0cHV0Pg0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgIC8+DQotCQkJPC93c2RsOm91dHB1dD4NCi0JCTwvd3NkbDpvcGVyYXRpb24+CQkNCi0JCQ0KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9InNsZWVwIj4NCi0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL29yZy90ZXN0L3BhcmFsbGVsYXN5bmMvc2xlZXAiIC8+DQotCQkJPHdzZGw6aW5wdXQ+DQotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAgLz4NCi0JCQk8L3dzZGw6aW5wdXQ+DQotCQkJPHdzZGw6b3V0cHV0Pg0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgIC8+DQotCQkJPC93c2RsOm91dHB1dD4NCi0JCTwvd3NkbDpvcGVyYXRpb24+DQotCQ0KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImlzQXNsZWVwIj4NCi0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL29yZy90ZXN0L3BhcmFsbGVsYXN5bmMvaXNBc2xlZXAiIC8+DQotCQkJPHdzZGw6aW5wdXQ+DQotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAgLz4NCi0JCQk8L3dzZGw6aW5wdXQ+DQotCQkJPHdzZGw6b3V0cHV0Pg0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgIC8+DQotCQkJPC93c2RsOm91dHB1dD4NCi0JCTwvd3NkbDpvcGVyYXRpb24+CQ0KLQkNCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJ3YWtlVXAiPg0KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vb3JnL3Rlc3QvcGFyYWxsZWxhc3luYy93YWtlVXAiIC8+DQotCQkJPHdzZGw6aW5wdXQ+DQotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAgLz4NCi0JCQk8L3dzZGw6aW5wdXQ+DQotCQkJPHdzZGw6b3V0cHV0Pg0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgIC8+DQotCQkJPC93c2RsOm91dHB1dD4NCi0JCTwvd3NkbDpvcGVyYXRpb24+DQotCQ0KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9Imludm9rZUFzeW5jIj4NCi0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL29yZy90ZXN0L3BhcmFsbGVsYXN5bmMvaW52b2tlQXN5bmMiIC8+DQotCQkJPHdzZGw6aW5wdXQ+DQotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAgLz4NCi0JCQk8L3dzZGw6aW5wdXQ+DQotCQkJPHdzZGw6b3V0cHV0Pg0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgIC8+DQotCQkJPC93c2RsOm91dHB1dD4NCi0JCTwvd3NkbDpvcGVyYXRpb24+CQkNCi0JDQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iY3VzdG9tQXN5bmMiPg0KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vb3JnL3Rlc3QvcGFyYWxsZWxhc3luYy9jdXN0b21Bc3luYyIgLz4NCi0JCQk8d3NkbDppbnB1dD4NCi0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiICAvPg0KLQkJCTwvd3NkbDppbnB1dD4NCi0JCQk8d3NkbDpvdXRwdXQ+DQotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAgLz4NCi0JCQk8L3dzZGw6b3V0cHV0Pg0KLQkJPC93c2RsOm9wZXJhdGlvbj4JCQ0KLQkNCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJhbm90aGVyIj4NCi0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL29yZy90ZXN0L3BhcmFsbGVsYXN5bmMvYW5vdGhlciIgLz4NCi0JCQk8d3NkbDppbnB1dD4NCi0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiICAvPg0KLQkJCTwvd3NkbDppbnB1dD4NCi0JCQk8d3NkbDpvdXRwdXQ+DQotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAgLz4NCi0JCQk8L3dzZGw6b3V0cHV0Pg0KLQkJPC93c2RsOm9wZXJhdGlvbj4JDQotCQ0KLQk8L3dzZGw6YmluZGluZz4NCi0JDQotCTx3c2RsOnNlcnZpY2UgbmFtZT0iQXN5bmNTZXJ2aWNlIj4NCi0JCTx3c2RsOnBvcnQgYmluZGluZz0idG5zOkFzeW5jIiBuYW1lPSJBc3luY1BvcnQiPg0KLQkJCTxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6OTA4MC9qYXh3cy5hc3luYy9zZXJ2aWNlcy9Bc3luY0RvY0xpdFdyYXBwZWRTZXJ2aWNlIiAvPg0KLQkJPC93c2RsOnBvcnQ+DQotCTwvd3NkbDpzZXJ2aWNlPg0KLQkNCi08L3dzZGw6ZGVmaW5pdGlvbnM+DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9yZXNvdXJjZWluamVjdGlvbi9NRVRBLUlORi9yZXNvdXJjZWluamVjdGlvbi53c2RsIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9yZXNvdXJjZWluamVjdGlvbi9NRVRBLUlORi9yZXNvdXJjZWluamVjdGlvbi53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2MyZGQ5Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvcmVzb3VyY2VpbmplY3Rpb24vTUVUQS1JTkYvcmVzb3VyY2VpbmplY3Rpb24ud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotDQotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPHdzZGw6ZGVmaW5pdGlvbnMgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIgeG1sbnM6dG5zPSJodHRwOi8vcmVzb3VyY2VpbmplY3Rpb24uc2FtcGxlLnRlc3Qub3JnIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iUmVzb3VyY2VJbmplY3Rpb24iIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3Jlc291cmNlaW5qZWN0aW9uLnNhbXBsZS50ZXN0Lm9yZyI+DQotICA8d3NkbDp0eXBlcz4NCi0gICAgPHhzZDpzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vcmVzb3VyY2VpbmplY3Rpb24uc2FtcGxlLnRlc3Qub3JnIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4NCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGVzdEluamVjdGlvblJlc3BvbnNlIj4NCi0gICAgICAJPHhzZDpjb21wbGV4VHlwZT4NCi0gICAgICAJCTx4c2Q6c2VxdWVuY2U+DQotICAgICAgCQkJPHhzZDplbGVtZW50IG5hbWU9InJlc3BvbnNlIiB0eXBlPSJ4c2Q6c3RyaW5nIj48L3hzZDplbGVtZW50Pg0KLSAgICAgIAkJPC94c2Q6c2VxdWVuY2U+DQotICAgICAgCTwveHNkOmNvbXBsZXhUeXBlPg0KLSAgICAgIDwveHNkOmVsZW1lbnQ+DQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRlc3RJbmplY3Rpb24iPg0KLSAgICAgIAk8eHNkOmNvbXBsZXhUeXBlPg0KLSAgICAgIAkJPHhzZDpzZXF1ZW5jZT4NCi0gICAgICAJCQk8eHNkOmVsZW1lbnQgbmFtZT0iYXJnIiB0eXBlPSJ4c2Q6c3RyaW5nIj48L3hzZDplbGVtZW50Pg0KLSAgICAgIAkJPC94c2Q6c2VxdWVuY2U+DQotICAgICAgCTwveHNkOmNvbXBsZXhUeXBlPg0KLSAgICAgIDwveHNkOmVsZW1lbnQ+DQotICAgIDwveHNkOnNjaGVtYT4NCi0gIDwvd3NkbDp0eXBlcz4NCi0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0idGVzdEluamVjdGlvblJlc3BvbnNlIj4NCi0gICAgPHdzZGw6cGFydCBlbGVtZW50PSJ0bnM6dGVzdEluamVjdGlvblJlc3BvbnNlIiBuYW1lPSJ0ZXN0SW5qZWN0aW9uUmVzcG9uc2UiLz4NCi0gIDwvd3NkbDptZXNzYWdlPg0KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJ0ZXN0SW5qZWN0aW9uIj4NCi0gICAgPHdzZGw6cGFydCBlbGVtZW50PSJ0bnM6dGVzdEluamVjdGlvbiIgbmFtZT0idGVzdEluamVjdGlvbiIvPg0KLSAgPC93c2RsOm1lc3NhZ2U+DQotICA8d3NkbDpwb3J0VHlwZSBuYW1lPSJSZXNvdXJjZUluamVjdGlvblBvcnRUeXBlIj4NCi0gICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InRlc3RJbmplY3Rpb24iPg0KLSAgICAgIDx3c2RsOmlucHV0IG1lc3NhZ2U9InRuczp0ZXN0SW5qZWN0aW9uIi8+DQotICAgICAgPHdzZGw6b3V0cHV0IG1lc3NhZ2U9InRuczp0ZXN0SW5qZWN0aW9uUmVzcG9uc2UiLz4NCi0gICAgPC93c2RsOm9wZXJhdGlvbj4NCi0gIDwvd3NkbDpwb3J0VHlwZT4NCi0gIDx3c2RsOmJpbmRpbmcgbmFtZT0iUmVzb3VyY2VJbmplY3Rpb25CaW5kaW5nIiB0eXBlPSJ0bnM6UmVzb3VyY2VJbmplY3Rpb25Qb3J0VHlwZSI+DQotICAgIDxzb2FwOmJpbmRpbmcgc3R5bGU9ImRvY3VtZW50IiB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIvPg0KLSAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0idGVzdEluamVjdGlvbiI+DQotICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly9yZXNvdXJjZWluamVjdGlvbi5zYW1wbGUudGVzdC5vcmcvdGVzdEluamVjdGlvbiIvPg0KLSAgICAgIDx3c2RsOmlucHV0Pg0KLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4NCi0gICAgICA8L3dzZGw6aW5wdXQ+DQotICAgICAgPHdzZGw6b3V0cHV0Pg0KLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4NCi0gICAgICA8L3dzZGw6b3V0cHV0Pg0KLSAgICA8L3dzZGw6b3BlcmF0aW9uPg0KLSAgPC93c2RsOmJpbmRpbmc+DQotICA8d3NkbDpzZXJ2aWNlIG5hbWU9IlJlc291cmNlSW5qZWN0aW9uU2VydmljZSI+DQotICAgIDx3c2RsOnBvcnQgYmluZGluZz0idG5zOlJlc291cmNlSW5qZWN0aW9uQmluZGluZyIgbmFtZT0iUmVzb3VyY2VJbmplY3Rpb25Qb3J0Ij4NCi0gICAgICA8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjYwNjAvYXhpczIvc2VydmljZXMvUmVzb3VyY2VJbmplY3Rpb25TZXJ2aWNlIi8+DQotICAgIDwvd3NkbDpwb3J0Pg0KLSAgPC93c2RsOnNlcnZpY2U+DQotPC93c2RsOmRlZmluaXRpb25zPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvcmVzb3VyY2VpbmplY3Rpb24vUmVzb3VyY2VJbmplY3Rpb25Qb3J0VHlwZUltcGwuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvcmVzb3VyY2VpbmplY3Rpb24vUmVzb3VyY2VJbmplY3Rpb25Qb3J0VHlwZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzNiNmE3ZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL3Jlc291cmNlaW5qZWN0aW9uL1Jlc291cmNlSW5qZWN0aW9uUG9ydFR5cGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5yZXNvdXJjZWluamVjdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5UZXN0TG9nZ2VyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5yZXNvdXJjZWluamVjdGlvbi5zZWkuUmVzb3VyY2VJbmplY3Rpb25Qb3J0VHlwZTsNCi0NCi1pbXBvcnQgamF2YXguYW5ub3RhdGlvbi5Qb3N0Q29uc3RydWN0Ow0KLWltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlByZURlc3Ryb3k7DQotaW1wb3J0IGphdmF4LmFubm90YXRpb24uUmVzb3VyY2U7DQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOw0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUNvbnRleHQ7DQotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLk1lc3NhZ2VDb250ZXh0Ow0KLQ0KLS8qKg0KLSAqIFNhbXBsZSBSZXNvdXJjZSBJbmplY3Rpb24gRW5kcG9pbnQNCi0gKg0KLSAqLw0KLUBXZWJTZXJ2aWNlKHNlcnZpY2VOYW1lPSJSZXNvdXJjZUluamVjdGlvblNlcnZpY2UiLA0KLSAgICAgICAgICAgIGVuZHBvaW50SW50ZXJmYWNlPSJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5yZXNvdXJjZWluamVjdGlvbi5zZWkuUmVzb3VyY2VJbmplY3Rpb25Qb3J0VHlwZSIpDQotICAgICAgICAgICAgcHVibGljIGNsYXNzIFJlc291cmNlSW5qZWN0aW9uUG9ydFR5cGVJbXBsIGltcGxlbWVudHMgUmVzb3VyY2VJbmplY3Rpb25Qb3J0VHlwZSB7DQotDQotICAgIC8vIFRoZSBjdHggdmFyaWFibGUgaXMgbWFya2VkIHdpdGggdGhlIEBSZXNvdXJjZSBhbm5vdGF0aW9uLg0KLSAgICAvLyBUaGUgcnVudGltZSB3aWxsIGF1dG9tYXRpY2FsbHkgaW5qZWN0IChzZXQpIHRoaXMgdmFyaWFibGUgdG8gdGhlDQotICAgIC8vIGN1cnJlbnQgV2ViU2VydmljZUNvbnRleHQNCi0gICAgQFJlc291cmNlDQotICAgIHB1YmxpYyBXZWJTZXJ2aWNlQ29udGV4dCBjdHggPSBudWxsOw0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFNhbXBsZSBtZXRob2QgdGhhdCBlbnN1cmVzIHRoYXQgV2ViU2VydmljZUNvbnRleHQgd2FzIHByb3Blcmx5IHNldC4NCi0gICAgICovDQotICAgIHB1YmxpYyBTdHJpbmcgdGVzdEluamVjdGlvbihTdHJpbmcgYXJnKSB7DQotICAgICAgICANCi0gICAgICAgIA0KLSAgICAgICAgaWYgKGN0eCA9PSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuICJGQUlMVVJFOiBUaGUgV2ViU2VydmljZUNvbnRleHQgd2FzIG5vdCBzZXQiOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICBNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0ID0gY3R4LmdldE1lc3NhZ2VDb250ZXh0KCk7DQotICAgICAgICBpZiAobXNnQ29udGV4dCA9PSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuICJGQUlMVVJFOiBUaGUgV2ViU2VydmljZUNvbnRleHQgZG9lcyBub3QgaGF2ZSBhIE1lc3NhZ2VDb250ZXh0IjsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgU3RyaW5nIGluaXRDYWxsZWRWYWx1ZSA9IChTdHJpbmcpIG1zZ0NvbnRleHQuZ2V0KCJJTklUX0NBTExFRCIpOw0KLSAgICAgICAgaWYgKGluaXRDYWxsZWRWYWx1ZSA9PSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuICJGQUlMVVJFOiBUaGUgQFBvc3RDb25zdHJ1Y3QgaW5pdGlhbGl6ZSBtZXRob2Qgd2FzIG5vdCBpbnZva2VkIjsNCi0gICAgICAgIH0NCi0gICAgICAgIFFOYW1lIHdzZGxPcGVyYXRpb24gPSAoUU5hbWUpIG1zZ0NvbnRleHQuZ2V0KE1lc3NhZ2VDb250ZXh0LldTRExfT1BFUkFUSU9OKTsNCi0gICAgICAgIA0KLSAgICAgICAgaWYgKHdzZGxPcGVyYXRpb24gPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiAiRkFJTFVSRTogVGhlIFdlYlNlcnZpY2VDb250ZXh0J3MgTWVzc2FnZUNvbnRleHQgIiArDQotICAgICAgICAgICAgICAgICAgICAgICAgImRvZXMgbm90IGhhdmUgdGhlIGNvcnJlY3Qgd3NkbE9wZXJhdGlvbiI7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gIlNVQ0NFU1M6ICIgKyB3c2RsT3BlcmF0aW9uLmdldExvY2FsUGFydCgpOw0KLSAgICB9DQotDQotICAgIEBQb3N0Q29uc3RydWN0DQotICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoKXsNCi0gICAgICAgIC8vQ2FsbGVkIGFmdGVyIHJlc291cmNlIGluamVjdGlvbiBhbmQgYmVmb3JlIGEgbWV0aG9kIGlzIGNhbGxlZC4NCi0gICAgICAgIGlmIChjdHggIT0gbnVsbCAmJiBjdHguZ2V0TWVzc2FnZUNvbnRleHQoKSAhPSBudWxsKSB7DQotICAgICAgICAgICAgY3R4LmdldE1lc3NhZ2VDb250ZXh0KCkucHV0KCJJTklUX0NBTExFRCIsICJJTklUX0NBTExFRF9WQUxVRSIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBQcmVEZXN0cm95DQotICAgIHB1YmxpYyB2b2lkIGRpc3RydWN0b3IoKXsNCi0gICAgICAgIC8vQ2FsbGVkIGJlZm9yZSB0aGUgc2NvcGUgb2YgcmVxdWVzdCBvciBzZXNzaW9uIG9yIGFwcGxpY2F0aW9uIGVuZHMuDQotDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiQ2FsbGluZyBQcmVEZXN0cm95ICIpOw0KLQ0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvcmVzb3VyY2VpbmplY3Rpb24vc2VpL1Jlc291cmNlSW5qZWN0aW9uUG9ydFR5cGUuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvcmVzb3VyY2VpbmplY3Rpb24vc2VpL1Jlc291cmNlSW5qZWN0aW9uUG9ydFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RhOGNkOS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL3Jlc291cmNlaW5qZWN0aW9uL3NlaS9SZXNvdXJjZUluamVjdGlvblBvcnRUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0NCi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5yZXNvdXJjZWluamVjdGlvbi5zZWk7DQotDQotaW1wb3J0IGphdmF4Lmp3cy5XZWJNZXRob2Q7DQotaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbTsNCi1pbXBvcnQgamF2YXguandzLldlYlJlc3VsdDsNCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5SZXF1ZXN0V3JhcHBlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLlJlc3BvbnNlV3JhcHBlcjsNCi0NCi1AV2ViU2VydmljZShuYW1lID0gIlJlc291cmNlSW5qZWN0aW9uUG9ydFR5cGUiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3Jlc291cmNlaW5qZWN0aW9uLnNhbXBsZS50ZXN0Lm9yZyIpDQotcHVibGljIGludGVyZmFjZSBSZXNvdXJjZUluamVjdGlvblBvcnRUeXBlIHsNCi0NCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gYXJnDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgamF2YS5sYW5nLlN0cmluZw0KLSAgICAgKi8NCi0gICAgQFdlYk1ldGhvZChhY3Rpb24gPSAiaHR0cDovL3Jlc291cmNlaW5qZWN0aW9uLnNhbXBsZS50ZXN0Lm9yZy9OZXdPcGVyYXRpb24iKQ0KLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAicmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikNCi0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJ0ZXN0SW5qZWN0aW9uIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9yZXNvdXJjZWluamVjdGlvbi5zYW1wbGUudGVzdC5vcmciLCBjbGFzc05hbWUgPSAib3JnLnRlc3Quc2FtcGxlLnJlc291cmNlaW5qZWN0aW9uLlRlc3RJbmplY3Rpb24iKQ0KLSAgICBAUmVzcG9uc2VXcmFwcGVyKGxvY2FsTmFtZSA9ICJ0ZXN0SW5qZWN0aW9uUmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3Jlc291cmNlaW5qZWN0aW9uLnNhbXBsZS50ZXN0Lm9yZyIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5zYW1wbGUucmVzb3VyY2VpbmplY3Rpb24uVGVzdEluamVjdGlvblJlc3BvbnNlIikNCi0gICAgcHVibGljIFN0cmluZyB0ZXN0SW5qZWN0aW9uKA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiYXJnIiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpDQotICAgICAgICBTdHJpbmcgYXJnKTsNCi0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9yZXNvdXJjZWluamVjdGlvbi9zZWkvUmVzb3VyY2VJbmplY3Rpb25TZXJ2aWNlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL3Jlc291cmNlaW5qZWN0aW9uL3NlaS9SZXNvdXJjZUluamVjdGlvblNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQ2YTBmNi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL3Jlc291cmNlaW5qZWN0aW9uL3NlaS9SZXNvdXJjZUluamVjdGlvblNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLQ0KLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLnJlc291cmNlaW5qZWN0aW9uLnNlaTsNCi0NCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJFbmRwb2ludDsNCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VDbGllbnQ7DQotaW1wb3J0IGphdmEuaW8uRmlsZTsNCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLm5ldC5VUkw7DQotDQotQFdlYlNlcnZpY2VDbGllbnQobmFtZSA9ICJSZXNvdXJjZUluamVjdGlvblNlcnZpY2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3Jlc291cmNlaW5qZWN0aW9uLnNhbXBsZS50ZXN0Lm9yZyIsIHdzZGxMb2NhdGlvbiA9ICJyZXNvdXJjZWluamVjdGlvbi53c2RsIikNCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VJbmplY3Rpb25TZXJ2aWNlDQotICAgIGV4dGVuZHMgU2VydmljZQ0KLXsNCi0NCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgVVJMIFJFU09VUkNFSU5KRUNUSU9OU0VSVklDRV9XU0RMX0xPQ0FUSU9OOw0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgd3NkbExvY2F0aW9uPSIvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9yZXNvdXJjZWluamVjdGlvbi9NRVRBLUlORi9yZXNvdXJjZWluamVjdGlvbi53c2RsIjsNCi0gICAgc3RhdGljIHsNCi0gICAgICAgIFVSTCB1cmwgPSBudWxsOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICB0cnl7DQotICAgICAgICAgICAgICAgIFN0cmluZyBiYXNlRGlyID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJiYXNlZGlyIiwiLiIpKS5nZXRDYW5vbmljYWxQYXRoKCk7DQotICAgICAgICAgICAgICAgIHdzZGxMb2NhdGlvbiA9IG5ldyBGaWxlKGJhc2VEaXIgKyB3c2RsTG9jYXRpb24pLmdldEFic29sdXRlUGF0aCgpOw0KLSAgICAgICAgICAgIH1jYXRjaChFeGNlcHRpb24gZSl7DQotICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKHdzZGxMb2NhdGlvbik7DQotICAgICAgICAgICAgdXJsID0gZmlsZS50b1VSTCgpOw0KLSAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgUkVTT1VSQ0VJTkpFQ1RJT05TRVJWSUNFX1dTRExfTE9DQVRJT04gPSB1cmw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFJlc291cmNlSW5qZWN0aW9uU2VydmljZShVUkwgd3NkbExvY2F0aW9uLCBRTmFtZSBzZXJ2aWNlTmFtZSkgew0KLSAgICAgICAgc3VwZXIod3NkbExvY2F0aW9uLCBzZXJ2aWNlTmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFJlc291cmNlSW5qZWN0aW9uU2VydmljZSgpIHsNCi0gICAgICAgIHN1cGVyKFJFU09VUkNFSU5KRUNUSU9OU0VSVklDRV9XU0RMX0xPQ0FUSU9OLCBuZXcgUU5hbWUoImh0dHA6Ly9yZXNvdXJjZWluamVjdGlvbi5zYW1wbGUudGVzdC5vcmciLCAiUmVzb3VyY2VJbmplY3Rpb25TZXJ2aWNlIikpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBSZXNvdXJjZUluamVjdGlvblBvcnRUeXBlDQotICAgICAqLw0KLSAgICBAV2ViRW5kcG9pbnQobmFtZSA9ICJSZXNvdXJjZUluamVjdGlvblBvcnQiKQ0KLSAgICBwdWJsaWMgUmVzb3VyY2VJbmplY3Rpb25Qb3J0VHlwZSBnZXRSZXNvdXJjZUluamVjdGlvblBvcnQoKSB7DQotICAgICAgICByZXR1cm4gKFJlc291cmNlSW5qZWN0aW9uUG9ydFR5cGUpc3VwZXIuZ2V0UG9ydChuZXcgUU5hbWUoImh0dHA6Ly9yZXNvdXJjZWluamVjdGlvbi5zYW1wbGUudGVzdC5vcmciLCAiUmVzb3VyY2VJbmplY3Rpb25Qb3J0IiksIFJlc291cmNlSW5qZWN0aW9uUG9ydFR5cGUuY2xhc3MpOw0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvc3RyaW5nbGlzdC9NRVRBLUlORi9TdHJpbmdMaXN0LndzZGwgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL3N0cmluZ2xpc3QvTUVUQS1JTkYvU3RyaW5nTGlzdC53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjMwOTQxLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvc3RyaW5nbGlzdC9NRVRBLUlORi9TdHJpbmdMaXN0LndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLQ0KLQ0KLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLQ0KLTxkZWZpbml0aW9ucyBuYW1lPSJTdHJpbmdMaXN0IiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9vcmcvdGVzdC9TdHJpbmdMaXN0Ig0KLQl4bWxuczp0bnM9Imh0dHA6Ly9vcmcvdGVzdC9TdHJpbmdMaXN0IiB4bWxucz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iDQotCXhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiDQotCXhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iPg0KLQ0KLQ0KLQk8dHlwZXM+DQotCQk8eHNkOnNjaGVtYSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiDQotCQkJZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL29yZy90ZXN0L1N0cmluZ0xpc3QiPg0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTdHJpbmdMaXN0IiB0eXBlPSJ0bnM6U3RyaW5nTGlzdFR5cGUiIC8+DQotCQkJPHhzZDplbGVtZW50IG5hbWU9IlN0cmluZ0xpc3RSZXNwb25zZSIgdHlwZT0idG5zOlN0cmluZ0xpc3RUeXBlIiAvPg0KLSAgICANCi0JCQk8eHNkOnNpbXBsZVR5cGUgbmFtZT0iU3RyaW5nTGlzdFR5cGUiPg0KLQkJCQk8eHNkOmxpc3QgaXRlbVR5cGU9InhzZDpzdHJpbmciLz4NCi0JCQk8L3hzZDpzaW1wbGVUeXBlPg0KLQkJCQ0KLQkJPC94c2Q6c2NoZW1hPg0KLQk8L3R5cGVzPg0KLQ0KLQk8bWVzc2FnZSBuYW1lPSJTdHJpbmdMaXN0Ij4NCi0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9InRuczpTdHJpbmdMaXN0IiAvPg0KLQk8L21lc3NhZ2U+DQotCTxtZXNzYWdlIG5hbWU9IlN0cmluZ0xpc3RSZXNwb25zZSI+DQotCQk8cGFydCBuYW1lPSJyZXN1bHQiIGVsZW1lbnQ9InRuczpTdHJpbmdMaXN0UmVzcG9uc2UiIC8+DQotCTwvbWVzc2FnZT4NCi0JDQotCTxwb3J0VHlwZSBuYW1lPSJTdHJpbmdMaXN0UG9ydFR5cGUiPg0KLQkJPG9wZXJhdGlvbiBuYW1lPSJTdHJpbmdMaXN0Ij4NCi0JCQk8aW5wdXQgbWVzc2FnZT0idG5zOlN0cmluZ0xpc3QiIG5hbWU9ImFkZCIgLz4NCi0JCQk8b3V0cHV0IG1lc3NhZ2U9InRuczpTdHJpbmdMaXN0UmVzcG9uc2UiIG5hbWU9ImFkZFJlc3BvbnNlIiAvPg0KLQkJCQ0KLQkJPC9vcGVyYXRpb24+DQotCTwvcG9ydFR5cGU+DQotCTxiaW5kaW5nIG5hbWU9IlN0cmluZ0xpc3RCaW5kaW5nIiB0eXBlPSJ0bnM6U3RyaW5nTGlzdFBvcnRUeXBlIj4NCi0JCTxzb2FwOmJpbmRpbmcgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiDQotCQkJc3R5bGU9ImRvY3VtZW50IiAvPg0KLQkJPG9wZXJhdGlvbiBuYW1lPSJTdHJpbmdMaXN0Ij4NCi0JCQk8aW5wdXQ+DQotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPg0KLQkJCTwvaW5wdXQ+DQotCQkJPG91dHB1dD4NCi0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+DQotCQkJPC9vdXRwdXQ+DQotCQkJDQotCQk8L29wZXJhdGlvbj4NCi0JCQ0KLQk8L2JpbmRpbmc+DQotCTxzZXJ2aWNlIG5hbWU9IlN0cmluZ0xpc3RTZXJ2aWNlIj4NCi0JCTxwb3J0IG5hbWU9IlN0cmluZ0xpc3RQb3J0IiBiaW5kaW5nPSJ0bnM6U3RyaW5nTGlzdEJpbmRpbmciPg0KLQkJCTxzb2FwOmFkZHJlc3MNCi0JCQkJbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6NjA2MC9heGlzMi9zZXJ2aWNlcy9TdHJpbmdMaXN0U2VydmljZSIgLz4NCi0JCTwvcG9ydD4NCi0JPC9zZXJ2aWNlPg0KLTwvZGVmaW5pdGlvbnM+DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9zdHJpbmdsaXN0L1N0cmluZ0xpc3RQb3J0VHlwZUltcGwuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvc3RyaW5nbGlzdC9TdHJpbmdMaXN0UG9ydFR5cGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyNzdhZTguLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9zdHJpbmdsaXN0L1N0cmluZ0xpc3RQb3J0VHlwZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLnN0cmluZ2xpc3Q7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLnN0cmluZ2xpc3Quc2VpLlN0cmluZ0xpc3RQb3J0VHlwZTsNCi0NCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7DQotDQotQFdlYlNlcnZpY2Uoc2VydmljZU5hbWU9IlN0cmluZ0xpc3RTZXJ2aWNlIiwgZW5kcG9pbnRJbnRlcmZhY2U9Im9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLnN0cmluZ2xpc3Quc2VpLlN0cmluZ0xpc3RQb3J0VHlwZSIpDQotcHVibGljIGNsYXNzIFN0cmluZ0xpc3RQb3J0VHlwZUltcGwgaW1wbGVtZW50cyBTdHJpbmdMaXN0UG9ydFR5cGUgew0KLQ0KLSAgICAvKiAobm9uLUphdmFkb2MpDQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zdHJpbmdsaXN0LnNlaS5TdHJpbmdMaXN0UG9ydFR5cGUjc3RyaW5nTGlzdChqYXZhLmxhbmcuU3RyaW5nW10pDQotICAgICAqLw0KLSAgICBwdWJsaWMgU3RyaW5nW10gc3RyaW5nTGlzdChTdHJpbmdbXSBwYXJhbWV0ZXJzKSB7DQotICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViDQotICAgICAgICByZXR1cm4gcGFyYW1ldGVyczsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL3N0cmluZ2xpc3Qvc2VpL1N0cmluZ0xpc3RQb3J0VHlwZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9zdHJpbmdsaXN0L3NlaS9TdHJpbmdMaXN0UG9ydFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM1MWI5Ni4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL3N0cmluZ2xpc3Qvc2VpL1N0cmluZ0xpc3RQb3J0VHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotDQotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuc3RyaW5nbGlzdC5zZWk7DQotDQotaW1wb3J0IGphdmF4Lmp3cy5XZWJNZXRob2Q7DQotaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbTsNCi1pbXBvcnQgamF2YXguandzLldlYlJlc3VsdDsNCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7DQotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nOw0KLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5QYXJhbWV0ZXJTdHlsZTsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxMaXN0Ow0KLQ0KLQ0KLS8qKg0KLSAqIFRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBieSB0aGUgSkFYV1MgU0kuDQotICogSkFYLVdTIFJJIDIuMF8wMS1iMTUtZmNzDQotICogR2VuZXJhdGVkIHNvdXJjZSB2ZXJzaW9uOiAyLjANCi0gKiANCi0gKi8NCi1AV2ViU2VydmljZShuYW1lID0gIlN0cmluZ0xpc3RQb3J0VHlwZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL3Rlc3QvU3RyaW5nTGlzdCIpDQotQFNPQVBCaW5kaW5nKHBhcmFtZXRlclN0eWxlID0gUGFyYW1ldGVyU3R5bGUuQkFSRSkNCi1wdWJsaWMgaW50ZXJmYWNlIFN0cmluZ0xpc3RQb3J0VHlwZSB7DQotDQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIHBhcmFtZXRlcnMNCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBqYXZhLmxhbmcuU3RyaW5nW10NCi0gICAgICovDQotICAgIEBYbWxMaXN0DQotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJTdHJpbmdMaXN0IikNCi0gICAgQFdlYlJlc3VsdChuYW1lID0gIlN0cmluZ0xpc3RSZXNwb25zZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL3Rlc3QvU3RyaW5nTGlzdCIsIHBhcnROYW1lID0gInJlc3VsdCIpDQotICAgIHB1YmxpYyBTdHJpbmdbXSBzdHJpbmdMaXN0KA0KLSAgICAgICAgQFhtbExpc3QNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gIlN0cmluZ0xpc3QiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L1N0cmluZ0xpc3QiLCBwYXJ0TmFtZSA9ICJwYXJhbWV0ZXJzIikNCi0gICAgICAgIFN0cmluZ1tdIHBhcmFtZXRlcnMpOw0KLQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL3N0cmluZ2xpc3Qvc2VpL1N0cmluZ0xpc3RTZXJ2aWNlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL3N0cmluZ2xpc3Qvc2VpL1N0cmluZ0xpc3RTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxYTNlYmEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9zdHJpbmdsaXN0L3NlaS9TdHJpbmdMaXN0U2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotDQotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuc3RyaW5nbGlzdC5zZWk7DQotDQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViRW5kcG9pbnQ7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlQ2xpZW50Ow0KLWltcG9ydCBqYXZhLmlvLkZpbGU7DQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLQ0KLQ0KLS8qKg0KLSAqIFRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBieSB0aGUgSkFYV1MgU0kuDQotICogSkFYLVdTIFJJIDIuMF8wMS1iMTUtZmNzDQotICogR2VuZXJhdGVkIHNvdXJjZSB2ZXJzaW9uOiAyLjANCi0gKiANCi0gKi8NCi1AV2ViU2VydmljZUNsaWVudChuYW1lID0gIlN0cmluZ0xpc3RTZXJ2aWNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9TdHJpbmdMaXN0Iiwgd3NkbExvY2F0aW9uID0gIlN0cmluZ0xpc3Qud3NkbCIpDQotcHVibGljIGNsYXNzIFN0cmluZ0xpc3RTZXJ2aWNlDQotICAgIGV4dGVuZHMgU2VydmljZQ0KLXsNCi0NCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgVVJMIFNUUklOR0xJU1RTRVJWSUNFX1dTRExfTE9DQVRJT047DQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyB3c2RsTG9jYXRpb249Ii90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL3N0cmluZ2xpc3QvTUVUQS1JTkYvU3RyaW5nTGlzdC53c2RsIjsNCi0gICAgc3RhdGljIHsNCi0gICAgICAgIFVSTCB1cmwgPSBudWxsOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICAgICAgdHJ5ew0KLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBiYXNlRGlyID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJiYXNlZGlyIiwiLiIpKS5nZXRDYW5vbmljYWxQYXRoKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgd3NkbExvY2F0aW9uID0gbmV3IEZpbGUoYmFzZURpciArIHdzZGxMb2NhdGlvbikuZ2V0QWJzb2x1dGVQYXRoKCk7DQotICAgICAgICAgICAgICAgIH1jYXRjaChFeGNlcHRpb24gZSl7DQotICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZSh3c2RsTG9jYXRpb24pOw0KLSAgICAgICAgICAgICAgICB1cmwgPSBmaWxlLnRvVVJMKCk7DQotICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICB9DQotICAgICAgICBTVFJJTkdMSVNUU0VSVklDRV9XU0RMX0xPQ0FUSU9OID0gdXJsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmdMaXN0U2VydmljZShVUkwgd3NkbExvY2F0aW9uLCBRTmFtZSBzZXJ2aWNlTmFtZSkgew0KLSAgICAgICAgc3VwZXIod3NkbExvY2F0aW9uLCBzZXJ2aWNlTmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZ0xpc3RTZXJ2aWNlKCkgew0KLSAgICAgICAgc3VwZXIoU1RSSU5HTElTVFNFUlZJQ0VfV1NETF9MT0NBVElPTiwgbmV3IFFOYW1lKCJodHRwOi8vb3JnL3Rlc3QvU3RyaW5nTGlzdCIsICJTdHJpbmdMaXN0U2VydmljZSIpKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgU3RyaW5nTGlzdFBvcnRUeXBlDQotICAgICAqLw0KLSAgICBAV2ViRW5kcG9pbnQobmFtZSA9ICJTdHJpbmdMaXN0UG9ydCIpDQotICAgIHB1YmxpYyBTdHJpbmdMaXN0UG9ydFR5cGUgZ2V0U3RyaW5nTGlzdFBvcnQoKSB7DQotICAgICAgICByZXR1cm4gKFN0cmluZ0xpc3RQb3J0VHlwZSlzdXBlci5nZXRQb3J0KG5ldyBRTmFtZSgiaHR0cDovL29yZy90ZXN0L1N0cmluZ0xpc3QiLCAiU3RyaW5nTGlzdFBvcnQiKSwgU3RyaW5nTGlzdFBvcnRUeXBlLmNsYXNzKTsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL3dyYXAvRG9jTGl0V3JhcEltcGwuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvd3JhcC9Eb2NMaXRXcmFwSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDQzYzQ0Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvd3JhcC9Eb2NMaXRXcmFwSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi0vKioNCi0gKiANCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLndyYXA7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YXNvdXJjZS5qYXhiLkpBWEJDdXN0b21CdWlsZGVyTW9uaXRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5UZXN0TG9nZ2VyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS53cmFwLnNlaS5Eb2NMaXRXcmFwOw0KLWltcG9ydCBvcmcudGVzdC5zYW1wbGUud3JhcC5GaW5hbmNpYWxPcGVyYXRpb247DQotaW1wb3J0IG9yZy50ZXN0LnNhbXBsZS53cmFwLkhlYWRlcjsNCi1pbXBvcnQgb3JnLnRlc3Quc2FtcGxlLndyYXAuSGVhZGVyUGFydDA7DQotaW1wb3J0IG9yZy50ZXN0LnNhbXBsZS53cmFwLkhlYWRlclBhcnQxOw0KLWltcG9ydCBvcmcudGVzdC5zYW1wbGUud3JhcC5IZWFkZXJSZXNwb25zZTsNCi0NCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5Ib2xkZXI7DQotDQotQFdlYlNlcnZpY2Uoc2VydmljZU5hbWU9IkRvY0xpdFdyYXBTZXJ2aWNlIiwNCi0JCQllbmRwb2ludEludGVyZmFjZT0ib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUud3JhcC5zZWkuRG9jTGl0V3JhcCIpDQotcHVibGljIGNsYXNzIERvY0xpdFdyYXBJbXBsIGltcGxlbWVudHMgRG9jTGl0V3JhcCB7DQotDQotCXB1YmxpYyBGaW5hbmNpYWxPcGVyYXRpb24gZmluT3AoRmluYW5jaWFsT3BlcmF0aW9uIG9wKSB7DQotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViDQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogDQotCSAqLw0KLQlwdWJsaWMgRG9jTGl0V3JhcEltcGwoKSB7DQotCQlzdXBlcigpOw0KLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViDQotCX0NCi0NCi0JLyogKG5vbi1KYXZhZG9jKQ0KLQkgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLndyYXAuc2VpLkRvY0xpdFdyYXAjb25lV2F5Vm9pZCgpDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBvbmVXYXlWb2lkKCkgew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIk9uZVdheVZvaWQgd2l0aCBubyBwYXJhbWV0ZXJzIGNhbGxlZCIpOw0KLQ0KLQl9DQotDQotCS8qIChub24tSmF2YWRvYykNCi0JICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS53cmFwLnNlaS5Eb2NMaXRXcmFwI29uZVdheShqYXZhLmxhbmcuU3RyaW5nKQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgb25lV2F5KFN0cmluZyBvbmV3YXlTdHIpIHsNCi0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWINCi0NCi0JfQ0KLQ0KLQkvKiAobm9uLUphdmFkb2MpDQotCSAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUud3JhcC5zZWkuRG9jTGl0V3JhcCN0d29XYXlIb2xkZXIoamF2YXgueG1sLndzLkhvbGRlciwgamF2YXgueG1sLndzLkhvbGRlcikNCi0JICovDQotCXB1YmxpYyB2b2lkIHR3b1dheUhvbGRlcihIb2xkZXI8U3RyaW5nPiB0d29XYXlIb2xkZXJTdHIsDQotCQkJSG9sZGVyPEludGVnZXI+IHR3b1dheUhvbGRlckludCkgew0KLQ0KLQkJdHdvV2F5SG9sZGVySW50LnZhbHVlID0gMTA7DQotCQl0d29XYXlIb2xkZXJTdHIudmFsdWUgPSAiUmVzcG9uc2UgU3RyaW5nIjsNCi0NCi0JfQ0KLQ0KLSAgICAgICAgLyogKG5vbi1KYXZhZG9jKQ0KLSAgICAgICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS53cmFwLnNlaS5Eb2NMaXRXcmFwI3R3b1dheShqYXZhLmxhbmcuU3RyaW5nKQ0KLSAgICAgICAgICovDQotICAgICAgICBwdWJsaWMgU3RyaW5nIHR3b1dheShTdHJpbmcgdHdvd2F5U3RyKSB7DQotICAgICAgICAgICAgaWYgKHR3b3dheVN0ci5lcXVhbHMoIkpBWEJDdXN0b21CdWlsZGVyTW9uaXRvclN0YXJ0IikpIHsNCi0gICAgICAgICAgICAgICAgLy8gQ2xlYXIgdGhlIG1vbml0b3IgYW5kIHN0YXJ0IG1vbml0b3JpbmcNCi0gICAgICAgICAgICAgICAgSkFYQkN1c3RvbUJ1aWxkZXJNb25pdG9yLmNsZWFyKCk7DQotICAgICAgICAgICAgICAgIEpBWEJDdXN0b21CdWlsZGVyTW9uaXRvci5zZXRNb25pdG9yaW5nKHRydWUpOw0KLSAgICAgICAgICAgICAgICByZXR1cm4gIkpBWEJDdXN0b21CdWlsZGVyTW9uaXRvclN0YXJ0IjsNCi0gICAgICAgICAgICB9IGVsc2UgaWYgKHR3b3dheVN0ci5lcXVhbHMoIkpBWEJDdXN0b21CdWlsZGVyTW9uaXRvckVuZCIpKSB7DQotICAgICAgICAgICAgICAgIC8vIEVuZCBtb25pdG9yaW5nLg0KLSAgICAgICAgICAgICAgICBKQVhCQ3VzdG9tQnVpbGRlck1vbml0b3Iuc2V0TW9uaXRvcmluZyhmYWxzZSk7DQotICAgICAgICAgICAgICAgIHJldHVybiAiSkFYQkN1c3RvbUJ1aWxkZXJNb25pdG9yRW5kIjsNCi0gICAgICAgICAgICB9IGVsc2UgaWYgKHR3b3dheVN0ci5lcXVhbHMoIkpBWEJDdXN0b21CdWlsZGVyQ2xpZW50IikpIHsNCi0gICAgICAgICAgICAgICAgLy8gQ2xlYXIgbW9uaXRvciBzbyB0aGF0IGNoYW5nZXMgb24gdGhlIGNsaWVudCBjYW4gYmUgZGV0ZWN0ZWQNCi0gICAgICAgICAgICAgICAgSkFYQkN1c3RvbUJ1aWxkZXJNb25pdG9yLmNsZWFyKCk7DQotICAgICAgICAgICAgICAgIFN0cmluZyByZXRTdHIgPSB0d293YXlTdHI7DQotICAgICAgICAgICAgICAgIHJldHVybiByZXRTdHI7DQotICAgICAgICAgICAgfSBlbHNlIGlmICh0d293YXlTdHIuZXF1YWxzKCJKQVhCQ3VzdG9tQnVpbGRlclNlcnZlcjEiKSkgew0KLSAgICAgICAgICAgICAgICAvLyBSZXR1cm4gdGhlIG51bWJlciBvZiBidWlsZGVycyBmcm9tIHRoZSBtb25pdG9yDQotICAgICAgICAgICAgICAgIFN0cmluZyByZXRTdHIgPSAiIiAgKyBKQVhCQ3VzdG9tQnVpbGRlck1vbml0b3IuZ2V0VG90YWxCdWlsZGVycygpOw0KLSAgICAgICAgICAgICAgICByZXR1cm4gcmV0U3RyOw0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAodHdvd2F5U3RyLmVxdWFscygiSkFYQkN1c3RvbUJ1aWxkZXJTZXJ2ZXIyIikpIHsNCi0gICAgICAgICAgICAgICAgLy8gUmV0dXJuIHRoZSBudW1iZXIgb2YgY3JlYXRlcyBmcm9tIHRoZSBtb25pdG9yDQotICAgICAgICAgICAgICAgIFN0cmluZyByZXRTdHIgPSAiIiAgKyBKQVhCQ3VzdG9tQnVpbGRlck1vbml0b3IuZ2V0VG90YWxDcmVhdGVzKCk7DQotICAgICAgICAgICAgICAgIHJldHVybiByZXRTdHI7DQotICAgICAgICAgICAgfSBlbHNlIGlmICh0d293YXlTdHIuZXF1YWxzKCJKQVhCQ3VzdG9tQnVpbGRlckZhdWx0IikpIHsNCi0gICAgICAgICAgICAgICAgLy8gQ2xlYXIgdGhlIG1vbml0b3Igc28gdGhhdCBjaGFnbmVzIG9uIHRoZSBjbGllbnQgY2FuIGJlIGRldGVjdGVkDQotICAgICAgICAgICAgICAgIEpBWEJDdXN0b21CdWlsZGVyTW9uaXRvci5jbGVhcigpOw0KLSAgICAgICAgICAgICAgICAvLyBBbiBleGNlcHRpb24gaXMgZXhwZWN0ZWQgZm9yIHRoaXMgaW5wdXQNCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlN5c3RlbSBGYXVsdCBPY2N1cnJlZCIpOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIFN0cmluZyByZXRTdHIgPSBuZXcgU3RyaW5nKCJBY2tub3dsZWRnZW1lbnQgOiBSZXF1ZXN0IFN0cmluZyByZWNlaXZlZCA9ICIrIHR3b3dheVN0cik7DQotICAgICAgICAgICAgICAgIHJldHVybiByZXRTdHI7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLyogKG5vbi1KYXZhZG9jKQ0KLSAgICAgICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS53cmFwLnNlaS5Eb2NMaXRXcmFwI2ludm9rZShqYXZhLmxhbmcuU3RyaW5nKQ0KLSAgICAgICAgICovDQotICAgICAgICBwdWJsaWMgU3RyaW5nIGludm9rZShTdHJpbmcgaW52b2tlU3RyKSB7DQotICAgICAgICAgICAgcmV0dXJuIGludm9rZVN0cjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyBIZWFkZXJSZXNwb25zZSBoZWFkZXIoSGVhZGVyIHBheWxvYWQsIEhvbGRlcjxIZWFkZXJQYXJ0MD4gaGVhZGVyMCwgSGVhZGVyUGFydDEgaGVhZGVyMSl7DQotDQotICAgICAgICAgICAgSGVhZGVyUGFydDAgaHBvPSAoSGVhZGVyUGFydDApaGVhZGVyMC52YWx1ZTsNCi0gICAgICAgICAgICBocG8gPSBuZXcgSGVhZGVyUGFydDAoKTsNCi0gICAgICAgICAgICBocG8uc2V0SGVhZGVyVHlwZSgiSGVhZGVyIFR5cGUgZnJvbSBFbmRwb2ludCBpbXBsZW1lbnRhdGlvbiIpOw0KLSAgICAgICAgICAgIGhlYWRlcjAudmFsdWUgPSBocG87DQotICAgICAgICAgICAgLy9ocG8uc2V0SGVhZGVyVHlwZSgiIik7DQotICAgICAgICAgICAgSGVhZGVyUmVzcG9uc2UgcmVzcG9uc2UgPSBuZXcgSGVhZGVyUmVzcG9uc2UoKTsNCi0gICAgICAgICAgICByZXNwb25zZS5zZXRPdXQoMTAwMCk7DQotICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIFN0cmluZyBlY2hvU3RyaW5nV1NHRU4xKFN0cmluZyBoZWFkZXJWYWx1ZSkgew0KLSAgICAgICAgICAgIHJldHVybiBoZWFkZXJWYWx1ZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZWNob1N0cmluZ1dTR0VOMihTdHJpbmcgZGF0YSkgew0KLSAgICAgICAgICAgIHJldHVybiBkYXRhOw0KLSAgICAgICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL3dyYXAvTUVUQS1JTkYvZG9jbGl0d3JhcC53c2RsIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS93cmFwL01FVEEtSU5GL2RvY2xpdHdyYXAud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTIzODdmOS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL3dyYXAvTUVUQS1JTkYvZG9jbGl0d3JhcC53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsNDQ2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotDQotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPHdzZGw6ZGVmaW5pdGlvbnMgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iDQotCXhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iDQotCXhtbG5zOnRucz0iaHR0cDovL3dyYXAuc2FtcGxlLnRlc3Qub3JnIg0KLQl4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJ3cmFwamF2YWJlYW50ZXN0Ig0KLQl0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93cmFwLnNhbXBsZS50ZXN0Lm9yZyI+DQotDQotCTx3c2RsOnR5cGVzPg0KLQkJPHhzZDpzY2hlbWENCi0JCQl0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93cmFwLnNhbXBsZS50ZXN0Lm9yZyINCi0JCQl4bWxuczp0bnM9Imh0dHA6Ly93cmFwLnNhbXBsZS50ZXN0Lm9yZyINCi0JCQl4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4NCi0NCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iTXlGYXVsdCIgdHlwZT0ieHNkOnN0cmluZyIgLz4NCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iaGVhZGVyVmFsdWUiIHR5cGU9InhzZDpzdHJpbmciIC8+DQotDQotCQkJPHhzZDplbGVtZW50IG5hbWU9Im9uZVdheVZvaWQiPg0KLQkJCQk8eHNkOmNvbXBsZXhUeXBlPg0KLQkJCQkJPHhzZDpzZXF1ZW5jZSAvPg0KLQkJCQk8L3hzZDpjb21wbGV4VHlwZT4NCi0JCQk8L3hzZDplbGVtZW50Pg0KLQ0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJvbmVXYXkiPg0KLQkJCQk8eHNkOmNvbXBsZXhUeXBlPg0KLQkJCQkJPHhzZDpzZXF1ZW5jZT4NCi0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0ib25ld2F5X3N0ciINCi0JCQkJCQkJdHlwZT0ieHNkOnN0cmluZyIgLz4NCi0JCQkJCTwveHNkOnNlcXVlbmNlPg0KLQkJCQk8L3hzZDpjb21wbGV4VHlwZT4NCi0JCQk8L3hzZDplbGVtZW50Pg0KLQ0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJ0d29XYXlIb2xkZXIiPg0KLQkJCQk8eHNkOmNvbXBsZXhUeXBlPg0KLQkJCQkJPHhzZDpzZXF1ZW5jZT4NCi0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0idHdvV2F5SG9sZGVyX3N0ciINCi0JCQkJCQkJdHlwZT0ieHNkOnN0cmluZyIgLz4NCi0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0idHdvV2F5SG9sZGVyX2ludCINCi0JCQkJCQkJdHlwZT0ieHNkOmludCIgLz4NCi0JCQkJCTwveHNkOnNlcXVlbmNlPg0KLQkJCQk8L3hzZDpjb21wbGV4VHlwZT4NCi0JCQk8L3hzZDplbGVtZW50Pg0KLQ0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJ0d29XYXkiPg0KLQkJCQk8eHNkOmNvbXBsZXhUeXBlPg0KLQkJCQkJPHhzZDpzZXF1ZW5jZT4NCi0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0idHdvd2F5X3N0ciINCi0JCQkJCQkJdHlwZT0ieHNkOnN0cmluZyIgLz4NCi0JCQkJCTwveHNkOnNlcXVlbmNlPg0KLQkJCQk8L3hzZDpjb21wbGV4VHlwZT4NCi0JCQk8L3hzZDplbGVtZW50Pg0KLQkJCQ0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSZXR1cm5UeXBlIj4NCi0JCQkJPHhzZDpjb21wbGV4VHlwZT4NCi0JCQkJCTx4c2Q6c2VxdWVuY2U+DQotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9InJldHVybl9zdHIiDQotCQkJCQkJCXR5cGU9InhzZDpzdHJpbmciIC8+DQotCQkJCQk8L3hzZDpzZXF1ZW5jZT4NCi0JCQkJPC94c2Q6Y29tcGxleFR5cGU+DQotCQkJPC94c2Q6ZWxlbWVudD4NCi0NCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iaW52b2tlIj4NCi0JCQkJPHhzZDpjb21wbGV4VHlwZT4NCi0JCQkJCTx4c2Q6c2VxdWVuY2U+DQotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Imludm9rZV9zdHIiDQotCQkJCQkJCXR5cGU9InhzZDpzdHJpbmciIC8+DQotCQkJCQk8L3hzZDpzZXF1ZW5jZT4NCi0JCQkJPC94c2Q6Y29tcGxleFR5cGU+DQotCQkJPC94c2Q6ZWxlbWVudD4NCi0NCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iaW52b2tlUmV0dXJuVHlwZSI+DQotCQkJCTx4c2Q6Y29tcGxleFR5cGU+DQotCQkJCQk8eHNkOnNlcXVlbmNlPg0KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJyZXR1cm5fc3RyIg0KLQkJCQkJCQl0eXBlPSJ4c2Q6c3RyaW5nIiAvPg0KLQkJCQkJPC94c2Q6c2VxdWVuY2U+DQotCQkJCTwveHNkOmNvbXBsZXhUeXBlPg0KLQkJCTwveHNkOmVsZW1lbnQ+DQotDQotDQotCQkJDQotDQotCQkJPCEtLSBmaW4gb3AgZGVmaW5pdGlvbiAtLT4NCi0NCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iZmluT3AiPg0KLQkJCQk8eHNkOmNvbXBsZXhUeXBlPg0KLQkJCQkJPHhzZDpzZXF1ZW5jZT4NCi0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0ib3AiDQotCQkJCQkJCXR5cGU9InRuczpGaW5hbmNpYWxPcGVyYXRpb24iIC8+DQotCQkJCQk8L3hzZDpzZXF1ZW5jZT4NCi0JCQkJPC94c2Q6Y29tcGxleFR5cGU+DQotCQkJPC94c2Q6ZWxlbWVudD4NCi0NCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iZmluT3BSZXNwb25zZSI+DQotCQkJCTx4c2Q6Y29tcGxleFR5cGU+DQotCQkJCQk8eHNkOnNlcXVlbmNlPg0KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJyZXNwb25zZSINCi0JCQkJCQkJdHlwZT0idG5zOkZpbmFuY2lhbE9wZXJhdGlvbiIgLz4NCi0JCQkJCTwveHNkOnNlcXVlbmNlPg0KLQkJCQk8L3hzZDpjb21wbGV4VHlwZT4NCi0JCQk8L3hzZDplbGVtZW50Pg0KLQ0KLQkJCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRmluYW5jaWFsT3BlcmF0aW9uIj4NCi0JCQkJPHhzZDpzZXF1ZW5jZT4NCi0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJhbW91bnQiIHR5cGU9InhzZDpmbG9hdCIgLz4NCi0JCQkJPC94c2Q6c2VxdWVuY2U+DQotCQkJPC94c2Q6Y29tcGxleFR5cGU+DQotDQotCQkJPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJXaXRoZHJhdyI+DQotCQkJCTx4c2Q6Y29tcGxleENvbnRlbnQ+DQotCQkJCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ0bnM6RmluYW5jaWFsT3BlcmF0aW9uIj4NCi0JCQkJCQk8eHNkOnNlcXVlbmNlPg0KLQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0ibWVtbyIgdHlwZT0ieHNkOnN0cmluZyIgLz4NCi0JCQkJCQk8L3hzZDpzZXF1ZW5jZT4NCi0JCQkJCTwveHNkOmV4dGVuc2lvbj4NCi0JCQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+DQotCQkJPC94c2Q6Y29tcGxleFR5cGU+DQotDQotCQkJPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJEZXBvc2l0Ij4NCi0JCQkJPHhzZDpjb21wbGV4Q29udGVudD4NCi0JCQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InRuczpGaW5hbmNpYWxPcGVyYXRpb24iPg0KLQkJCQkJCTx4c2Q6c2VxdWVuY2U+DQotCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJzdGF0dXMiDQotCQkJCQkJCQl0eXBlPSJ4c2Q6c3RyaW5nIiAvPg0KLQkJCQkJCTwveHNkOnNlcXVlbmNlPg0KLQkJCQkJPC94c2Q6ZXh0ZW5zaW9uPg0KLQkJCQk8L3hzZDpjb21wbGV4Q29udGVudD4NCi0JCQk8L3hzZDpjb21wbGV4VHlwZT4NCi0NCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iaGVhZGVyUGFydDAiPg0KLQkJCQk8eHNkOmNvbXBsZXhUeXBlPg0KLQkJCQkJPHhzZDpzZXF1ZW5jZT4NCi0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iaGVhZGVyVHlwZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4NCi0JCQkJCTwveHNkOnNlcXVlbmNlPg0KLQkJCQk8L3hzZDpjb21wbGV4VHlwZT4NCi0JCQk8L3hzZDplbGVtZW50Pg0KLQ0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJoZWFkZXJQYXJ0MSI+DQotCQkJCTx4c2Q6Y29tcGxleFR5cGU+DQotCQkJCQk8eHNkOnNlcXVlbmNlPg0KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJoZWFkZXJUeXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPg0KLQkJCQkJPC94c2Q6c2VxdWVuY2U+DQotCQkJCTwveHNkOmNvbXBsZXhUeXBlPg0KLQkJCTwveHNkOmVsZW1lbnQ+DQotDQotCQkJPHhzZDplbGVtZW50IG5hbWU9ImhlYWRlciI+DQotCQkJCTx4c2Q6Y29tcGxleFR5cGU+DQotCQkJCQk8eHNkOnNlcXVlbmNlPg0KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJpbiIgdHlwZT0ieHNkOnN0cmluZyIgLz4NCi0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0ib3V0IiB0eXBlPSJ4c2Q6bG9uZyIgLz4NCi0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iaW5vdXQiIHR5cGU9InhzZDppbnRlZ2VyIiAvPg0KLQkJCQkJPC94c2Q6c2VxdWVuY2U+DQotCQkJCTwveHNkOmNvbXBsZXhUeXBlPg0KLQkJCTwveHNkOmVsZW1lbnQ+DQotDQotCQkJPHhzZDplbGVtZW50IG5hbWU9ImhlYWRlclJlc3BvbnNlIj4NCi0JCQkJPHhzZDpjb21wbGV4VHlwZT4NCi0JCQkJCTx4c2Q6c2VxdWVuY2U+DQotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Im91dCIgdHlwZT0ieHNkOmxvbmciIC8+DQotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Imlub3V0IiB0eXBlPSJ4c2Q6aW50ZWdlciIgLz4NCi0JCQkJCTwveHNkOnNlcXVlbmNlPg0KLQkJCQk8L3hzZDpjb21wbGV4VHlwZT4NCi0JCQk8L3hzZDplbGVtZW50Pg0KLQkJCQ0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJlY2hvU3RyaW5nV1NHRU4xIj4NCi0JCQkJPHhzZDpjb21wbGV4VHlwZSAvPg0KLQkJCTwveHNkOmVsZW1lbnQ+DQotDQotCQkJPHhzZDplbGVtZW50IG5hbWU9ImVjaG9TdHJpbmdXU0dFTjFSZXNwb25zZSI+DQotCQkJCTx4c2Q6Y29tcGxleFR5cGU+DQotCQkJCQk8eHNkOnNlcXVlbmNlPg0KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJyZXR1cm4iIHR5cGU9InhzZDpzdHJpbmciIC8+DQotCQkJCQk8L3hzZDpzZXF1ZW5jZT4NCi0JCQkJPC94c2Q6Y29tcGxleFR5cGU+DQotCQkJPC94c2Q6ZWxlbWVudD4NCi0JCQkNCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iZWNob1N0cmluZ1dTR0VOMiI+DQotCQkJICAgIDx4c2Q6Y29tcGxleFR5cGU+DQotCQkJCQk8eHNkOnNlcXVlbmNlPg0KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJkYXRhIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPg0KLQkJCQkJPC94c2Q6c2VxdWVuY2U+DQotCQkJCTwveHNkOmNvbXBsZXhUeXBlPg0KLQkJCTwveHNkOmVsZW1lbnQ+DQotDQotCQkJPHhzZDplbGVtZW50IG5hbWU9ImVjaG9TdHJpbmdXU0dFTjJSZXNwb25zZSI+DQotCQkJCTx4c2Q6Y29tcGxleFR5cGUgLz4NCi0JCQk8L3hzZDplbGVtZW50Pg0KLQkJCQ0KLQkJPC94c2Q6c2NoZW1hPg0KLQk8L3dzZGw6dHlwZXM+DQotDQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0ib25lV2F5Vm9pZFJlcXVlc3QiPg0KLQkJPHdzZGw6cGFydCBuYW1lPSJhbGxCeU15c2VsZiIgZWxlbWVudD0idG5zOm9uZVdheVZvaWQiIC8+DQotCTwvd3NkbDptZXNzYWdlPg0KLQ0KLQk8d3NkbDptZXNzYWdlIG5hbWU9Im9uZVdheVJlcXVlc3QiPg0KLQkJPHdzZGw6cGFydCBuYW1lPSJhbGxCeU15c2VsZiIgZWxlbWVudD0idG5zOm9uZVdheSIgLz4NCi0JPC93c2RsOm1lc3NhZ2U+DQotDQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0idHdvV2F5SG9sZGVyUmVxdWVzdCI+DQotCQk8d3NkbDpwYXJ0IG5hbWU9ImFsbEJ5TXlzZWxmIiBlbGVtZW50PSJ0bnM6dHdvV2F5SG9sZGVyIiAvPg0KLQk8L3dzZGw6bWVzc2FnZT4NCi0NCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJ0d29XYXlIb2xkZXJSZXNwb25zZSI+DQotCQk8d3NkbDpwYXJ0IG5hbWU9ImFsbEJ5TXlzZWxmIiBlbGVtZW50PSJ0bnM6dHdvV2F5SG9sZGVyIiAvPg0KLQk8L3dzZGw6bWVzc2FnZT4NCi0NCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJ0d29XYXlSZXF1ZXN0Ij4NCi0JCTx3c2RsOnBhcnQgbmFtZT0iYWxsQnlNeXNlbGYiIGVsZW1lbnQ9InRuczp0d29XYXkiIC8+DQotCTwvd3NkbDptZXNzYWdlPg0KLQ0KLQk8d3NkbDptZXNzYWdlIG5hbWU9InR3b1dheVJlc3BvbnNlIj4NCi0JCTx3c2RsOnBhcnQgbmFtZT0iYWxsQnlNeXNlbGYiIGVsZW1lbnQ9InRuczpSZXR1cm5UeXBlIiAvPg0KLQk8L3dzZGw6bWVzc2FnZT4NCi0NCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJpbnZva2VSZXF1ZXN0Ij4NCi0JCTx3c2RsOnBhcnQgbmFtZT0iYWxsQnlNeXNlbGYiIGVsZW1lbnQ9InRuczppbnZva2UiIC8+DQotCTwvd3NkbDptZXNzYWdlPg0KLQ0KLQk8d3NkbDptZXNzYWdlIG5hbWU9Imludm9rZVJlc3BvbnNlIj4NCi0JCTx3c2RsOnBhcnQgbmFtZT0iYWxsQnlNeXNlbGYiIGVsZW1lbnQ9InRuczpSZXR1cm5UeXBlIiAvPg0KLQk8L3dzZGw6bWVzc2FnZT4NCi0NCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJmaW5PcFJlcXVlc3QiPg0KLQkJPHdzZGw6cGFydCBuYW1lPSJvcCIgZWxlbWVudD0idG5zOmZpbk9wIiAvPg0KLQk8L3dzZGw6bWVzc2FnZT4NCi0NCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJmaW5PcFJlc3BvbnNlIj4NCi0JCTx3c2RsOnBhcnQgbmFtZT0ib3AiIGVsZW1lbnQ9InRuczpmaW5PcFJlc3BvbnNlIiAvPg0KLQk8L3dzZGw6bWVzc2FnZT4NCi0NCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJoZWFkZXJSZXF1ZXN0Ij4NCi0JCTx3c2RsOnBhcnQgbmFtZT0icGF5bG9hZCIgZWxlbWVudD0idG5zOmhlYWRlciIgLz4NCi0JCTx3c2RsOnBhcnQgbmFtZT0iaGVhZGVyMCIgZWxlbWVudD0idG5zOmhlYWRlclBhcnQwIiAvPg0KLQkJPHdzZGw6cGFydCBuYW1lPSJoZWFkZXIxIiBlbGVtZW50PSJ0bnM6aGVhZGVyUGFydDEiIC8+DQotCTwvd3NkbDptZXNzYWdlPg0KLQ0KLQk8d3NkbDptZXNzYWdlIG5hbWU9ImhlYWRlclJlc3BvbnNlIj4NCi0JCTx3c2RsOnBhcnQgbmFtZT0icGF5bG9hZCIgZWxlbWVudD0idG5zOmhlYWRlclJlc3BvbnNlIiAvPg0KLQkJPHdzZGw6cGFydCBuYW1lPSJoZWFkZXIwIiBlbGVtZW50PSJ0bnM6aGVhZGVyUGFydDAiIC8+DQotCTwvd3NkbDptZXNzYWdlPg0KLQkNCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJlY2hvU3RyaW5nV1NHRU4xUmVxdWVzdCI+DQotCQk8d3NkbDpwYXJ0IG5hbWU9ImJvZHlQYXJ0IiBlbGVtZW50PSJ0bnM6ZWNob1N0cmluZ1dTR0VOMSIgLz4NCi0JCTx3c2RsOnBhcnQgbmFtZT0iaGVhZGVyUGFydCIgZWxlbWVudD0idG5zOmhlYWRlclZhbHVlIiAvPg0KLQk8L3dzZGw6bWVzc2FnZT4NCi0NCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJlY2hvU3RyaW5nV1NHRU4xUmVzcG9uc2UiPg0KLQkJPHdzZGw6cGFydCBuYW1lPSJib2R5UGFydCIgZWxlbWVudD0idG5zOmVjaG9TdHJpbmdXU0dFTjFSZXNwb25zZSIgLz4NCi0JPC93c2RsOm1lc3NhZ2U+DQotCQ0KLQk8d3NkbDptZXNzYWdlIG5hbWU9ImVjaG9TdHJpbmdXU0dFTjJSZXF1ZXN0Ij4NCi0JCTx3c2RsOnBhcnQgbmFtZT0iYm9keVBhcnQiIGVsZW1lbnQ9InRuczplY2hvU3RyaW5nV1NHRU4yIiAvPg0KLQk8L3dzZGw6bWVzc2FnZT4NCi0NCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJlY2hvU3RyaW5nV1NHRU4yUmVzcG9uc2UiPg0KLQkJPHdzZGw6cGFydCBuYW1lPSJib2R5UGFydCIgZWxlbWVudD0idG5zOmVjaG9TdHJpbmdXU0dFTjJSZXNwb25zZSIgLz4NCi0JICAgIDx3c2RsOnBhcnQgbmFtZT0iaGVhZGVyUGFydCIgZWxlbWVudD0idG5zOmhlYWRlclZhbHVlIiAvPg0KLQk8L3dzZGw6bWVzc2FnZT4NCi0JDQotCQ0KLQk8d3NkbDpwb3J0VHlwZSBuYW1lPSJEb2NMaXRXcmFwIj4NCi0NCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJvbmVXYXlWb2lkIj4NCi0JCQk8d3NkbDppbnB1dCBtZXNzYWdlPSJ0bnM6b25lV2F5Vm9pZFJlcXVlc3QiIC8+DQotCQk8L3dzZGw6b3BlcmF0aW9uPg0KLQ0KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9Im9uZVdheSI+DQotCQkJPHdzZGw6aW5wdXQgbWVzc2FnZT0idG5zOm9uZVdheVJlcXVlc3QiIC8+DQotCQk8L3dzZGw6b3BlcmF0aW9uPg0KLQ0KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9InR3b1dheUhvbGRlciI+DQotCQkJPHdzZGw6aW5wdXQgbWVzc2FnZT0idG5zOnR3b1dheUhvbGRlclJlcXVlc3QiIC8+DQotCQkJPHdzZGw6b3V0cHV0IG1lc3NhZ2U9InRuczp0d29XYXlIb2xkZXJSZXNwb25zZSIgLz4NCi0JCTwvd3NkbDpvcGVyYXRpb24+DQotDQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0idHdvV2F5Ij4NCi0JCQk8d3NkbDppbnB1dCBtZXNzYWdlPSJ0bnM6dHdvV2F5UmVxdWVzdCIgLz4NCi0JCQk8d3NkbDpvdXRwdXQgbWVzc2FnZT0idG5zOnR3b1dheVJlc3BvbnNlIiAvPg0KLQkJPC93c2RsOm9wZXJhdGlvbj4NCi0JCQ0KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImhlYWRlciI+DQotCQkJPHdzZGw6aW5wdXQgbWVzc2FnZT0idG5zOmhlYWRlclJlcXVlc3QiIC8+DQotCQkJPHdzZGw6b3V0cHV0IG1lc3NhZ2U9InRuczpoZWFkZXJSZXNwb25zZSIgLz4NCi0JCTwvd3NkbDpvcGVyYXRpb24+CQkNCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJpbnZva2UiPg0KLQkJCTx3c2RsOmlucHV0IG1lc3NhZ2U9InRuczppbnZva2VSZXF1ZXN0IiAvPg0KLQkJCTx3c2RsOm91dHB1dCBtZXNzYWdlPSJ0bnM6aW52b2tlUmVzcG9uc2UiIC8+DQotCQk8L3dzZGw6b3BlcmF0aW9uPg0KLQkJDQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iZmluT3AiPg0KLQkJCTx3c2RsOmlucHV0IG1lc3NhZ2U9InRuczpmaW5PcFJlcXVlc3QiIC8+DQotCQkJPHdzZGw6b3V0cHV0IG1lc3NhZ2U9InRuczpmaW5PcFJlc3BvbnNlIiAvPg0KLQkJPC93c2RsOm9wZXJhdGlvbj4NCi0JCQ0KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImVjaG9TdHJpbmdXU0dFTjEiPg0KLQkJCTx3c2RsOmlucHV0IG1lc3NhZ2U9InRuczplY2hvU3RyaW5nV1NHRU4xUmVxdWVzdCIgLz4NCi0JCQk8d3NkbDpvdXRwdXQgbWVzc2FnZT0idG5zOmVjaG9TdHJpbmdXU0dFTjFSZXNwb25zZSIgLz4NCi0JCTwvd3NkbDpvcGVyYXRpb24+DQotCQkNCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJlY2hvU3RyaW5nV1NHRU4yIj4NCi0JCQk8d3NkbDppbnB1dCBtZXNzYWdlPSJ0bnM6ZWNob1N0cmluZ1dTR0VOMlJlcXVlc3QiIC8+DQotCQkJPHdzZGw6b3V0cHV0IG1lc3NhZ2U9InRuczplY2hvU3RyaW5nV1NHRU4yUmVzcG9uc2UiIC8+DQotCQk8L3dzZGw6b3BlcmF0aW9uPg0KLQ0KLQk8L3dzZGw6cG9ydFR5cGU+DQotDQotCTx3c2RsOmJpbmRpbmcgbmFtZT0iRG9jTGl0V3JhcCINCi0JCXR5cGU9InRuczpEb2NMaXRXcmFwIj4NCi0JCTxzb2FwOmJpbmRpbmcgc3R5bGU9ImRvY3VtZW50Ig0KLQkJCXRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIiAvPg0KLQ0KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9Im9uZVdheVZvaWQiPg0KLQkJCTxzb2FwOm9wZXJhdGlvbg0KLQkJCQlzb2FwQWN0aW9uPSJodHRwOi8vd3JhcC5zYW1wbGUudGVzdC5vcmcvb25lV2F5Vm9pZCIgLz4NCi0JCQk8d3NkbDppbnB1dD4NCi0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+DQotCQkJPC93c2RsOmlucHV0Pg0KLQkJPC93c2RsOm9wZXJhdGlvbj4NCi0NCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJvbmVXYXkiPg0KLQkJCTxzb2FwOm9wZXJhdGlvbg0KLQkJCQlzb2FwQWN0aW9uPSJodHRwOi8vd3JhcC5zYW1wbGUudGVzdC5vcmcvb25lV2F5IiAvPg0KLQkJCTx3c2RsOmlucHV0Pg0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0JCQk8L3dzZGw6aW5wdXQ+DQotCQk8L3dzZGw6b3BlcmF0aW9uPg0KLQ0KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9InR3b1dheUhvbGRlciI+DQotCQkJPHNvYXA6b3BlcmF0aW9uDQotCQkJCXNvYXBBY3Rpb249Imh0dHA6Ly93cmFwLnNhbXBsZS50ZXN0Lm9yZy90d29XYXlIb2xkZXIiIC8+DQotCQkJPHdzZGw6aW5wdXQ+DQotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPg0KLQkJCTwvd3NkbDppbnB1dD4NCi0JCQk8d3NkbDpvdXRwdXQ+DQotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPg0KLQkJCTwvd3NkbDpvdXRwdXQ+DQotCQk8L3dzZGw6b3BlcmF0aW9uPg0KLQ0KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImhlYWRlciI+DQotCQkJPHNvYXA6b3BlcmF0aW9uDQotCQkJCXNvYXBBY3Rpb249Imh0dHA6Ly9hZGRoZWFkZXJzLnNhbXBsZS50ZXN0Lm9yZy9oZWFkZXIiIC8+DQotICAgICAgICANCi0JCQk8d3NkbDppbnB1dD4NCi0JCQkJPHNvYXA6aGVhZGVyIHVzZT0ibGl0ZXJhbCIgbWVzc2FnZT0idG5zOmhlYWRlclJlcXVlc3QiIHBhcnQ9ImhlYWRlcjAiLz4JCQkNCi0JCQkJPHNvYXA6aGVhZGVyIHVzZT0ibGl0ZXJhbCIgbWVzc2FnZT0idG5zOmhlYWRlclJlcXVlc3QiIHBhcnQ9ImhlYWRlcjEiLz4JCQkNCi0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIHBhcnRzPSJwYXlsb2FkIi8+DQotCQkJPC93c2RsOmlucHV0Pg0KLQkJCTx3c2RsOm91dHB1dD4NCi0JCQkJPHNvYXA6aGVhZGVyIHVzZT0ibGl0ZXJhbCIgbWVzc2FnZT0idG5zOmhlYWRlclJlc3BvbnNlIiBwYXJ0PSJoZWFkZXIwIi8+CQkJDQotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiBwYXJ0cz0icGF5bG9hZCIvPgkJCQ0KLQkJCTwvd3NkbDpvdXRwdXQ+DQotCQk8L3dzZGw6b3BlcmF0aW9uPg0KLQ0KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9InR3b1dheSI+DQotCQkJPHNvYXA6b3BlcmF0aW9uDQotCQkJCXNvYXBBY3Rpb249Imh0dHA6Ly93cmFwLnNhbXBsZS50ZXN0Lm9yZy90d29XYXkiIC8+DQotCQkJPHdzZGw6aW5wdXQ+DQotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPg0KLQkJCTwvd3NkbDppbnB1dD4NCi0JCQk8d3NkbDpvdXRwdXQ+DQotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPg0KLQkJCTwvd3NkbDpvdXRwdXQ+DQotDQotCQk8L3dzZGw6b3BlcmF0aW9uPg0KLQkJDQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iaW52b2tlIj4NCi0JCQk8c29hcDpvcGVyYXRpb24NCi0JCQkJc29hcEFjdGlvbj0iaHR0cDovL3dyYXAuc2FtcGxlLnRlc3Qub3JnL2ludm9rZSIgLz4NCi0JCQk8d3NkbDppbnB1dD4NCi0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+DQotCQkJPC93c2RsOmlucHV0Pg0KLQkJCTx3c2RsOm91dHB1dD4NCi0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+DQotCQkJPC93c2RsOm91dHB1dD4NCi0NCi0JCTwvd3NkbDpvcGVyYXRpb24+DQotCQkNCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJmaW5PcCI+DQotCQkJPHNvYXA6b3BlcmF0aW9uDQotCQkJCXNvYXBBY3Rpb249Imh0dHA6Ly93cmFwLnNhbXBsZS50ZXN0Lm9yZy9maW5PcCIgLz4NCi0JCQk8d3NkbDppbnB1dD4NCi0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+DQotCQkJPC93c2RsOmlucHV0Pg0KLQkJCTx3c2RsOm91dHB1dD4NCi0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+DQotCQkJPC93c2RsOm91dHB1dD4NCi0NCi0JCTwvd3NkbDpvcGVyYXRpb24+DQotCQkNCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJlY2hvU3RyaW5nV1NHRU4xIj4NCi0JCQk8c29hcDpvcGVyYXRpb24NCi0JCQkJc29hcEFjdGlvbj0iaHR0cDovL2FkZGhlYWRlcnMuc2FtcGxlLnRlc3Qub3JnL2VjaG9TdHJpbmdXU0dFTjEiIC8+DQotICAgICAgICANCi0JCQk8d3NkbDppbnB1dD4NCi0JCQkJPHNvYXA6aGVhZGVyIHVzZT0ibGl0ZXJhbCIgbWVzc2FnZT0idG5zOmVjaG9TdHJpbmdXU0dFTjFSZXF1ZXN0IiBwYXJ0PSJoZWFkZXJQYXJ0Ii8+CQkJDQotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiBtZXNzYWdlPSJ0bnM6ZWNob1N0cmluZ1dTR0VOMVJlcXVlc3QiIHBhcnRzPSJib2R5UGFydCIvPgkJCQ0KLQkJCTwvd3NkbDppbnB1dD4NCi0JCQk8d3NkbDpvdXRwdXQ+DQotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgkJDQotCQkJPC93c2RsOm91dHB1dD4NCi0JCTwvd3NkbDpvcGVyYXRpb24+DQotCQkNCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJlY2hvU3RyaW5nV1NHRU4yIj4NCi0JCQk8c29hcDpvcGVyYXRpb24NCi0JCQkJc29hcEFjdGlvbj0iaHR0cDovL2FkZGhlYWRlcnMuc2FtcGxlLnRlc3Qub3JnL2VjaG9TdHJpbmdXU0dFTjIiIC8+DQotICAgICAgICANCi0JCQk8d3NkbDppbnB1dD4NCi0gICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgkNCi0JCQk8L3dzZGw6aW5wdXQ+DQotCQkJPHdzZGw6b3V0cHV0Pg0KLQkJCSAgICA8c29hcDpoZWFkZXIgdXNlPSJsaXRlcmFsIiBtZXNzYWdlPSJ0bnM6ZWNob1N0cmluZ1dTR0VOMlJlc3BvbnNlIiBwYXJ0PSJoZWFkZXJQYXJ0Ii8+CQkJDQotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiBtZXNzYWdlPSJ0bnM6ZWNob1N0cmluZ1dTR0VOMlJlc3BvbnNlIiBwYXJ0cz0iYm9keVBhcnQiLz4JCQkNCi0JCQk8L3dzZGw6b3V0cHV0Pg0KLQkJPC93c2RsOm9wZXJhdGlvbj4NCi0NCi0JPC93c2RsOmJpbmRpbmc+DQotDQotCTx3c2RsOnNlcnZpY2UgbmFtZT0iRG9jTGl0V3JhcFNlcnZpY2UiPg0KLQkJPHdzZGw6cG9ydCBiaW5kaW5nPSJ0bnM6RG9jTGl0V3JhcCINCi0JCQluYW1lPSJEb2NMaXRXcmFwUG9ydCI+DQotCQkJPHNvYXA6YWRkcmVzcw0KLQkJCQlsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo2MDYwL2F4aXMyL3NlcnZpY2VzL0RvY0xpdFdyYXBTZXJ2aWNlIiAvPg0KLQkJPC93c2RsOnBvcnQ+DQotCTwvd3NkbDpzZXJ2aWNlPg0KLQ0KLTwvd3NkbDpkZWZpbml0aW9ucz4NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL3dyYXAvc2VpL0RvY0xpdFdyYXAuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvd3JhcC9zZWkvRG9jTGl0V3JhcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjA0MWFjLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvd3JhcC9zZWkvRG9jTGl0V3JhcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLQ0KLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLndyYXAuc2VpOw0KLQ0KLWltcG9ydCBvcmcudGVzdC5zYW1wbGUud3JhcC5GaW5hbmNpYWxPcGVyYXRpb247DQotaW1wb3J0IG9yZy50ZXN0LnNhbXBsZS53cmFwLkhlYWRlcjsNCi1pbXBvcnQgb3JnLnRlc3Quc2FtcGxlLndyYXAuSGVhZGVyUGFydDA7DQotaW1wb3J0IG9yZy50ZXN0LnNhbXBsZS53cmFwLkhlYWRlclBhcnQxOw0KLWltcG9ydCBvcmcudGVzdC5zYW1wbGUud3JhcC5IZWFkZXJSZXNwb25zZTsNCi0NCi1pbXBvcnQgamF2YXguandzLk9uZXdheTsNCi1pbXBvcnQgamF2YXguandzLldlYk1ldGhvZDsNCi1pbXBvcnQgamF2YXguandzLldlYlBhcmFtOw0KLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW0uTW9kZTsNCi1pbXBvcnQgamF2YXguandzLldlYlJlc3VsdDsNCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7DQotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nOw0KLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5QYXJhbWV0ZXJTdHlsZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLkhvbGRlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLlJlcXVlc3RXcmFwcGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuUmVzcG9uc2VXcmFwcGVyOw0KLQ0KLS8qKg0KLSAqIFRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBieSB0aGUgSkFYV1MgU0kuDQotICogSkFYLVdTIFJJIDIuMF8wMS1iMTUtZmNzDQotICogR2VuZXJhdGVkIHNvdXJjZSB2ZXJzaW9uOiAyLjANCi0gKiANCi0gKi8NCi1AV2ViU2VydmljZShuYW1lID0gIkRvY0xpdFdyYXAiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3dyYXAuc2FtcGxlLnRlc3Qub3JnIikNCi1wdWJsaWMgaW50ZXJmYWNlIERvY0xpdFdyYXAgew0KLQ0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqLw0KLSAgICBAV2ViTWV0aG9kKGFjdGlvbiA9ICJodHRwOi8vd3JhcC5zYW1wbGUudGVzdC5vcmcvdHdvV2F5UmV0dXJuIikNCi0gICAgQE9uZXdheQ0KLSAgICBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gIm9uZVdheVZvaWQiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3dyYXAuc2FtcGxlLnRlc3Qub3JnIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LnNhbXBsZS53cmFwLk9uZVdheVZvaWQiKQ0KLSAgICBwdWJsaWMgdm9pZCBvbmVXYXlWb2lkKCk7DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIG9uZXdheVN0cg0KLSAgICAgKi8NCi0gICAgQFdlYk1ldGhvZChhY3Rpb24gPSAiaHR0cDovL3dyYXAuc2FtcGxlLnRlc3Qub3JnL3R3b1dheVJldHVybiIpDQotICAgIEBPbmV3YXkNCi0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJvbmVXYXkiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3dyYXAuc2FtcGxlLnRlc3Qub3JnIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LnNhbXBsZS53cmFwLk9uZVdheSIpDQotICAgIHB1YmxpYyB2b2lkIG9uZVdheSgNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gIm9uZXdheV9zdHIiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikNCi0gICAgICAgIFN0cmluZyBvbmV3YXlTdHIpOw0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSB0d29XYXlIb2xkZXJJbnQNCi0gICAgICogQHBhcmFtIHR3b1dheUhvbGRlclN0cg0KLSAgICAgKi8NCi0gICAgQFdlYk1ldGhvZChhY3Rpb24gPSAiaHR0cDovL3dyYXAuc2FtcGxlLnRlc3Qub3JnL3R3b1dheVJldHVybiIpDQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAidHdvV2F5SG9sZGVyIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly93cmFwLnNhbXBsZS50ZXN0Lm9yZyIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5zYW1wbGUud3JhcC5Ud29XYXlIb2xkZXIiKQ0KLSAgICBAUmVzcG9uc2VXcmFwcGVyKGxvY2FsTmFtZSA9ICJ0d29XYXlIb2xkZXIiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3dyYXAuc2FtcGxlLnRlc3Qub3JnIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LnNhbXBsZS53cmFwLlR3b1dheUhvbGRlciIpDQotICAgIHB1YmxpYyB2b2lkIHR3b1dheUhvbGRlcigNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gInR3b1dheUhvbGRlcl9zdHIiLCB0YXJnZXROYW1lc3BhY2UgPSAiIiwgbW9kZSA9IE1vZGUuSU5PVVQpDQotICAgICAgICBIb2xkZXI8U3RyaW5nPiB0d29XYXlIb2xkZXJTdHIsDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJ0d29XYXlIb2xkZXJfaW50IiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIsIG1vZGUgPSBNb2RlLklOT1VUKQ0KLSAgICAgICAgSG9sZGVyPEludGVnZXI+IHR3b1dheUhvbGRlckludCk7DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIHR3b3dheVN0cg0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIGphdmEubGFuZy5TdHJpbmcNCi0gICAgICovDQotICAgIEBXZWJNZXRob2QoYWN0aW9uID0gImh0dHA6Ly93cmFwLnNhbXBsZS50ZXN0Lm9yZy90d29XYXlSZXR1cm4iKQ0KLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAicmV0dXJuX3N0ciIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQ0KLSAgICBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gInR3b1dheSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vd3JhcC5zYW1wbGUudGVzdC5vcmciLCBjbGFzc05hbWUgPSAib3JnLnRlc3Quc2FtcGxlLndyYXAuVHdvV2F5IikNCi0gICAgQFJlc3BvbnNlV3JhcHBlcihsb2NhbE5hbWUgPSAiUmV0dXJuVHlwZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vd3JhcC5zYW1wbGUudGVzdC5vcmciLCBjbGFzc05hbWUgPSAib3JnLnRlc3Quc2FtcGxlLndyYXAuUmV0dXJuVHlwZSIpDQotICAgIHB1YmxpYyBTdHJpbmcgdHdvV2F5KA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAidHdvd2F5X3N0ciIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQ0KLSAgICAgICAgU3RyaW5nIHR3b3dheVN0cik7DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGludm9rZVN0cg0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIGphdmEubGFuZy5TdHJpbmcNCi0gICAgICovDQotICAgIEBXZWJNZXRob2QoYWN0aW9uID0gImh0dHA6Ly93cmFwLnNhbXBsZS50ZXN0Lm9yZy90d29XYXlSZXR1cm4iKQ0KLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAicmV0dXJuX3N0ciIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQ0KLSAgICBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gImludm9rZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vd3JhcC5zYW1wbGUudGVzdC5vcmciLCBjbGFzc05hbWUgPSAib3JnLnRlc3Quc2FtcGxlLndyYXAuSW52b2tlIikNCi0gICAgQFJlc3BvbnNlV3JhcHBlcihsb2NhbE5hbWUgPSAiUmV0dXJuVHlwZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vd3JhcC5zYW1wbGUudGVzdC5vcmciLCBjbGFzc05hbWUgPSAib3JnLnRlc3Quc2FtcGxlLndyYXAuUmV0dXJuVHlwZSIpDQotICAgIHB1YmxpYyBTdHJpbmcgaW52b2tlKA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiaW52b2tlX3N0ciIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQ0KLSAgICAgICAgU3RyaW5nIGludm9rZVN0cik7DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIG9wDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgb3JnLnRlc3Quc2FtcGxlLndyYXAuRmluYW5jaWFsT3BlcmF0aW9uDQotICAgICAqLw0KLSAgICBAV2ViTWV0aG9kKGFjdGlvbiA9ICJodHRwOi8vd3JhcC5zYW1wbGUudGVzdC5vcmcvZmluT3AiKQ0KLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAicmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikNCi0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJmaW5PcCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vd3JhcC5zYW1wbGUudGVzdC5vcmciLCBjbGFzc05hbWUgPSAib3JnLnRlc3Quc2FtcGxlLndyYXAuRmluT3AiKQ0KLSAgICBAUmVzcG9uc2VXcmFwcGVyKGxvY2FsTmFtZSA9ICJmaW5PcFJlc3BvbnNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly93cmFwLnNhbXBsZS50ZXN0Lm9yZyIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5zYW1wbGUud3JhcC5GaW5PcFJlc3BvbnNlIikNCi0gICAgcHVibGljIEZpbmFuY2lhbE9wZXJhdGlvbiBmaW5PcCgNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gIm9wIiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpDQotICAgICAgICBGaW5hbmNpYWxPcGVyYXRpb24gb3ApOw0KLSAgICANCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gaGVhZGVyMQ0KLSAgICAgKiBAcGFyYW0gaGVhZGVyMA0KLSAgICAgKiBAcGFyYW0gcGF5bG9hZA0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIG9yZy50ZXN0LnNhbXBsZS53cmFwLkhlYWRlclJlc3BvbnNlDQotICAgICAqLw0KLSAgICBAV2ViTWV0aG9kKGFjdGlvbiA9ICJodHRwOi8vYWRkaGVhZGVycy5zYW1wbGUudGVzdC5vcmcvaGVhZGVyIikNCi0gICAgQFdlYlJlc3VsdChuYW1lID0gImhlYWRlclJlc3BvbnNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly93cmFwLnNhbXBsZS50ZXN0Lm9yZyIsIHBhcnROYW1lID0gInBheWxvYWQiKQ0KLSAgICBAU09BUEJpbmRpbmcocGFyYW1ldGVyU3R5bGUgPSBQYXJhbWV0ZXJTdHlsZS5CQVJFKQ0KLSAgICBwdWJsaWMgSGVhZGVyUmVzcG9uc2UgaGVhZGVyKA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiaGVhZGVyIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly93cmFwLnNhbXBsZS50ZXN0Lm9yZyIsIHBhcnROYW1lID0gInBheWxvYWQiKQ0KLSAgICAgICAgSGVhZGVyIHBheWxvYWQsDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJoZWFkZXJQYXJ0MCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vd3JhcC5zYW1wbGUudGVzdC5vcmciLCBoZWFkZXIgPSB0cnVlLCBtb2RlID0gTW9kZS5JTk9VVCwgcGFydE5hbWUgPSAiaGVhZGVyMCIpDQotICAgICAgICBIb2xkZXI8SGVhZGVyUGFydDA+IGhlYWRlcjAsDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJoZWFkZXJQYXJ0MSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vd3JhcC5zYW1wbGUudGVzdC5vcmciLCBoZWFkZXIgPSB0cnVlLCBwYXJ0TmFtZSA9ICJoZWFkZXIxIikNCi0gICAgICAgIEhlYWRlclBhcnQxIGhlYWRlcjEpOw0KLSAgICANCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBUaGUgU09BUEJpbmRpbmcgZm9yIHRoaXMgbWV0aG9kIHdpbGwgZGVmYXVsdCB0byB3cmFwcGVkLiAgWWVzIFdyYXBwZWQgIQ0KLSAgICAgKiBIb3dldmVyIHRoZSBwYXJhbWV0ZXIgaXMgYSBoZWFkZXIgcGFyYW1ldGVyLi4ud2hpY2ggdmlvbGF0ZXMgd3JhcHBlZCBydWxlcy4NCi0gICAgICogVW5mb3J0dW5hdGVseSBXU0dFTiBjYW4gcHJvZHVjZSB0aGlzIGtpbmQgb2Ygc2l0dWF0aW9uLi4udGh1cyB3ZSBuZWVkIHRvIA0KLSAgICAgKiBoYW5kbGUgaXQNCi0gICAgICogQHBhcmFtIGhlYWRlclZhbHVlDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgU3RyaW5nDQotICAgICAqLw0KLSAgICBAV2ViTWV0aG9kKGFjdGlvbiA9ICJodHRwOi8vYWRkaGVhZGVycy5zYW1wbGUudGVzdC5vcmcvZWNob1N0cmluZ1dTR0VOMSIpDQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAiZWNob1N0cmluZ1dTR0VOMSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vd3JhcC5zYW1wbGUudGVzdC5vcmciLCBjbGFzc05hbWUgPSAib3JnLnRlc3Quc2FtcGxlLndyYXAuRWNob1N0cmluZ1dTR0VOMSIpDQotICAgIEBSZXNwb25zZVdyYXBwZXIobG9jYWxOYW1lID0gImVjaG9TdHJpbmdXU0dFTjFSZXNwb25zZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vd3JhcC5zYW1wbGUudGVzdC5vcmciLCBjbGFzc05hbWUgPSAib3JnLnRlc3Quc2FtcGxlLndyYXAuRWNob1N0cmluZ1dTR0VOMVJlc3BvbnNlIikNCi0gICAgcHVibGljIFN0cmluZyBlY2hvU3RyaW5nV1NHRU4xKA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiaGVhZGVyVmFsdWUiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3dyYXAuc2FtcGxlLnRlc3Qub3JnIiwgaGVhZGVyID0gdHJ1ZSkNCi0gICAgICAgIFN0cmluZyBoZWFkZXJWYWx1ZQ0KLSAgICApOw0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFRoZSBzYW1lIGFzIGVjaG9TdHJpbmdXU0dFTjEgZXhjZXB0IHRoYXQgdGhlIHJldHVybiBTdHJpbmcgaXMgaW4gdGhlIGhlYWRlcg0KLSAgICAgKiBAcGFyYW0gZGF0YQ0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIFN0cmluZw0KLSAgICAgKi8NCi0gICAgDQotICAgIEBXZWJNZXRob2QoYWN0aW9uID0gImh0dHA6Ly9hZGRoZWFkZXJzLnNhbXBsZS50ZXN0Lm9yZy9lY2hvU3RyaW5nV1NHRU4yIikNCi0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJlY2hvU3RyaW5nV1NHRU4yIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly93cmFwLnNhbXBsZS50ZXN0Lm9yZyIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5zYW1wbGUud3JhcC5FY2hvU3RyaW5nV1NHRU4yIikNCi0gICAgQFJlc3BvbnNlV3JhcHBlcihsb2NhbE5hbWUgPSAiZWNob1N0cmluZ1dTR0VOMlJlc3BvbnNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly93cmFwLnNhbXBsZS50ZXN0Lm9yZyIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5zYW1wbGUud3JhcC5FY2hvU3RyaW5nV1NHRU4yUmVzcG9uc2UiKQ0KLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAiaGVhZGVyVmFsdWUiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3dyYXAuc2FtcGxlLnRlc3Qub3JnIiwgaGVhZGVyID0gdHJ1ZSkNCi0gICAgcHVibGljIFN0cmluZyBlY2hvU3RyaW5nV1NHRU4yKA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiZGF0YSIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQ0KLSAgICAgICAgU3RyaW5nIGRhdGENCi0gICAgKTsNCi0gICAgDQotDQotDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvd3JhcC9zZWkvRG9jTGl0V3JhcFNlcnZpY2UuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvd3JhcC9zZWkvRG9jTGl0V3JhcFNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjVlN2M4NC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL3dyYXAvc2VpL0RvY0xpdFdyYXBTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0NCi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS53cmFwLnNlaTsNCi0NCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJFbmRwb2ludDsNCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VDbGllbnQ7DQotaW1wb3J0IGphdmEuaW8uRmlsZTsNCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLm5ldC5VUkw7DQotDQotLyoqDQotICogVGhpcyBjbGFzcyB3YXMgZ2VuZXJhdGVkIGJ5IHRoZSBKQVhXUyBTSS4NCi0gKiBKQVgtV1MgUkkgMi4wXzAxLWIxNS1mY3MNCi0gKiBHZW5lcmF0ZWQgc291cmNlIHZlcnNpb246IDIuMA0KLSAqIA0KLSAqLw0KLUBXZWJTZXJ2aWNlQ2xpZW50KG5hbWUgPSAiRG9jTGl0V3JhcFNlcnZpY2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3dyYXAuc2FtcGxlLnRlc3Qub3JnIiwgd3NkbExvY2F0aW9uID0gIkRvY0xpdC53c2RsIikNCi1wdWJsaWMgY2xhc3MgRG9jTGl0V3JhcFNlcnZpY2UNCi0gICAgZXh0ZW5kcyBTZXJ2aWNlDQotew0KLQ0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBVUkwgRE9DTElUV1JBUFNFUlZJQ0VfV1NETF9MT0NBVElPTjsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHdzZGxMb2NhdGlvbj0iL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvd3JhcC9NRVRBLUlORi9kb2NsaXR3cmFwLndzZGwiOw0KLSAgICBzdGF0aWMgew0KLSAgICAgICAgVVJMIHVybCA9IG51bGw7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgCXRyeXsNCi0JICAgICAgICAJU3RyaW5nIGJhc2VEaXIgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoImJhc2VkaXIiLCIuIikpLmdldENhbm9uaWNhbFBhdGgoKTsNCi0JICAgICAgICAJd3NkbExvY2F0aW9uID0gbmV3IEZpbGUoYmFzZURpciArIHdzZGxMb2NhdGlvbikuZ2V0QWJzb2x1dGVQYXRoKCk7DQotICAgICAgICAJfWNhdGNoKEV4Y2VwdGlvbiBlKXsNCi0gICAgICAgIAkJZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgIAl9DQotICAgICAgICAJRmlsZSBmaWxlID0gbmV3IEZpbGUod3NkbExvY2F0aW9uKTsNCi0gICAgICAgIAl1cmwgPSBmaWxlLnRvVVJMKCk7DQotICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICB9DQotICAgICAgICBET0NMSVRXUkFQU0VSVklDRV9XU0RMX0xPQ0FUSU9OID0gdXJsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBEb2NMaXRXcmFwU2VydmljZShVUkwgd3NkbExvY2F0aW9uLCBRTmFtZSBzZXJ2aWNlTmFtZSkgew0KLSAgICAgICAgc3VwZXIod3NkbExvY2F0aW9uLCBzZXJ2aWNlTmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIERvY0xpdFdyYXBTZXJ2aWNlKCkgew0KLSAgICAgICAgc3VwZXIoRE9DTElUV1JBUFNFUlZJQ0VfV1NETF9MT0NBVElPTiwgbmV3IFFOYW1lKCJodHRwOi8vd3JhcC5zYW1wbGUudGVzdC5vcmciLCAiRG9jTGl0V3JhcFNlcnZpY2UiKSk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIERvY0xpdFdyYXANCi0gICAgICovDQotICAgIEBXZWJFbmRwb2ludChuYW1lID0gIkRvY0xpdFdyYXBQb3J0IikNCi0gICAgcHVibGljIERvY0xpdFdyYXAgZ2V0RG9jTGl0V3JhcFBvcnQoKSB7DQotICAgICAgICByZXR1cm4gKERvY0xpdFdyYXApc3VwZXIuZ2V0UG9ydChuZXcgUU5hbWUoImh0dHA6Ly93cmFwLnNhbXBsZS50ZXN0Lm9yZyIsICJEb2NMaXRXcmFwUG9ydCIpLCBEb2NMaXRXcmFwLmNsYXNzKTsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL3dzZ2VuL01FVEEtSU5GL1dTR2VuU2VydmljZS53c2RsIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS93c2dlbi9NRVRBLUlORi9XU0dlblNlcnZpY2Uud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdkZjQ3OC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL3dzZ2VuL01FVEEtSU5GL1dTR2VuU2VydmljZS53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI/Pg0KLQ0KLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTxkZWZpbml0aW9ucyB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93c2dlbi5zYW1wbGUuamF4d3MuYXhpczIuYXBhY2hlLm9yZyIgbmFtZT0iV1NHZW5TZXJ2aWNlIiB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczp0bnM9Imh0dHA6Ly93c2dlbi5zYW1wbGUuamF4d3MuYXhpczIuYXBhY2hlLm9yZyIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4NCi0gIDx0eXBlcz4NCi0gICAgPHhzZDpzY2hlbWE+DQotICAgICAgPHhzZDppbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vd3NnZW4uc2FtcGxlLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciIHNjaGVtYUxvY2F0aW9uPSJXU0dlblNlcnZpY2Vfc2NoZW1hMS54c2QiLz4NCi0gICAgPC94c2Q6c2NoZW1hPg0KLSAgPC90eXBlcz4NCi0gIDxtZXNzYWdlIG5hbWU9ImVjaG9TdHJpbmciPg0KLSAgICA8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJ0bnM6ZWNob1N0cmluZyIvPg0KLSAgPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2UgbmFtZT0iZWNob1N0cmluZ1Jlc3BvbnNlIj4NCi0gICAgPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0idG5zOmVjaG9TdHJpbmdSZXNwb25zZSIvPg0KLSAgPC9tZXNzYWdlPg0KLSAgPHBvcnRUeXBlIG5hbWU9IldTR2VuSW50ZXJmYWNlIj4NCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvU3RyaW5nIj4NCi0gICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmVjaG9TdHJpbmciLz4NCi0gICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczplY2hvU3RyaW5nUmVzcG9uc2UiLz4NCi0gICAgPC9vcGVyYXRpb24+DQotICA8L3BvcnRUeXBlPg0KLSAgPGJpbmRpbmcgbmFtZT0iV1NHZW5Qb3J0QmluZGluZyIgdHlwZT0idG5zOldTR2VuSW50ZXJmYWNlIj4NCi0gICAgPHNvYXA6YmluZGluZyB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIgc3R5bGU9ImRvY3VtZW50Ii8+DQotICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob1N0cmluZyI+DQotICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjpFY2hvU3RyaW5nIi8+DQotICAgICAgPGlucHV0Pg0KLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4NCi0gICAgICA8L2lucHV0Pg0KLSAgICAgIDxvdXRwdXQ+DQotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgIDwvb3V0cHV0Pg0KLSAgICA8L29wZXJhdGlvbj4NCi0gIDwvYmluZGluZz4NCi0gIDxzZXJ2aWNlIG5hbWU9IldTR2VuU2VydmljZSI+DQotICAgIDxwb3J0IG5hbWU9IldTR2VuUG9ydCIgYmluZGluZz0idG5zOldTR2VuUG9ydEJpbmRpbmciPg0KLSAgICAgIDxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6NjA2MC9heGlzMi9zZXJ2aWNlcy9XU0dlblNlcnZpY2UiLz4NCi0gICAgPC9wb3J0Pg0KLSAgPC9zZXJ2aWNlPg0KLTwvZGVmaW5pdGlvbnM+DQotDQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS93c2dlbi9NRVRBLUlORi9XU0dlblNlcnZpY2Vfc2NoZW1hMS54c2QgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL3dzZ2VuL01FVEEtSU5GL1dTR2VuU2VydmljZV9zY2hlbWExLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ5ZjdiZi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL3dzZ2VuL01FVEEtSU5GL1dTR2VuU2VydmljZV9zY2hlbWExLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4NCi0NCi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08eHM6c2NoZW1hIHZlcnNpb249IjEuMCIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3NnZW4uc2FtcGxlLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+DQotDQotICA8eHM6ZWxlbWVudCBuYW1lPSJlY2hvU3RyaW5nIiB0eXBlPSJuczE6ZWNob1N0cmluZyIgeG1sbnM6bnMxPSJodHRwOi8vd3NnZW4uc2FtcGxlLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciLz4NCi0NCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJlY2hvU3RyaW5nIj4NCi0gICAgPHhzOnNlcXVlbmNlPg0KLSAgICAgIDx4czplbGVtZW50IG5hbWU9ImFyZzAiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+DQotICAgIDwveHM6c2VxdWVuY2U+DQotICA8L3hzOmNvbXBsZXhUeXBlPg0KLQ0KLSAgPHhzOmVsZW1lbnQgbmFtZT0iZWNob1N0cmluZ1Jlc3BvbnNlIiB0eXBlPSJuczI6ZWNob1N0cmluZ1Jlc3BvbnNlIiB4bWxuczpuczI9Imh0dHA6Ly93c2dlbi5zYW1wbGUuamF4d3MuYXhpczIuYXBhY2hlLm9yZyIvPg0KLQ0KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImVjaG9TdHJpbmdSZXNwb25zZSI+DQotICAgIDx4czpzZXF1ZW5jZT4NCi0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJyZXR1cm4iIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+DQotICAgIDwveHM6c2VxdWVuY2U+DQotICA8L3hzOmNvbXBsZXhUeXBlPg0KLTwveHM6c2NoZW1hPg0KLQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvd3NnZW4vV1NHZW5JbXBsLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL3dzZ2VuL1dTR2VuSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTlkMDI5Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvd3NnZW4vV1NHZW5JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS53c2dlbjsNCi0NCi0vLyBTRVJWRVItU0lERSBDTEFTUw0KLQ0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsNCi0NCi1AV2ViU2VydmljZShlbmRwb2ludEludGVyZmFjZSA9ICJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS53c2dlbi5XU0dlbkludGVyZmFjZSIsDQotICAgICAgICBzZXJ2aWNlTmFtZT0iV1NHZW5TZXJ2aWNlIiwNCi0gICAgICAgIHBvcnROYW1lPSJXU0dlblBvcnQiLA0KLSAgICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3NnZW4uc2FtcGxlLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciDQotICAgICkNCi1wdWJsaWMgY2xhc3MgV1NHZW5JbXBsIGltcGxlbWVudHMgV1NHZW5JbnRlcmZhY2Ugew0KLQ0KLSAgICBwdWJsaWMgV1NHZW5JbXBsKCkgew0KLSAgICAgICAgc3VwZXIoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGVjaG9TdHJpbmcoU3RyaW5nIGFyZzApIHsNCi0gICAgICAgIHJldHVybiBhcmcwOw0KLQ0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvd3NnZW4vV1NHZW5JbnRlcmZhY2UuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvd3NnZW4vV1NHZW5JbnRlcmZhY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODc3NGU5Ni4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL3dzZ2VuL1dTR2VuSW50ZXJmYWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0NCi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS53c2dlbjsNCi0NCi1pbXBvcnQgamF2YXguandzLldlYk1ldGhvZDsNCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7DQotLy9pbXBvcnQgamF2YXgueG1sLndzLlJlcXVlc3RXcmFwcGVyOw0KLS8vaW1wb3J0IGphdmF4LnhtbC53cy5SZXNwb25zZVdyYXBwZXI7DQotDQotDQotLyoqDQotICogVGhpcyBjbGFzcyB3YXMgZ2VuZXJhdGVkIGJ5IHRoZSBKQVhXUyBTSS4NCi0gKiBKQVgtV1MgUkkgMi4wXzAxLWIxNS1mY3MNCi0gKiBHZW5lcmF0ZWQgc291cmNlIHZlcnNpb246IDIuMA0KLSAqIA0KLSAqLw0KLUBXZWJTZXJ2aWNlKG5hbWUgPSAiV1NHZW5JbnRlcmZhY2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3dzZ2VuLnNhbXBsZS5qYXh3cy5heGlzMi5hcGFjaGUub3JnIikNCi1wdWJsaWMgaW50ZXJmYWNlIFdTR2VuSW50ZXJmYWNlIHsNCi0NCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gYXJnMA0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIGphdmEubGFuZy5TdHJpbmcNCi0gICAgICovDQotICAgIEBXZWJNZXRob2QoYWN0aW9uID0gInVybjpFY2hvU3RyaW5nIikNCi0gICAgLy9AV2ViUmVzdWx0KHRhcmdldE5hbWVzcGFjZSA9ICIiKQ0KLSAgICAvL0BSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAiZWNob1N0cmluZyIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vd3NnZW4uc2FtcGxlLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciLCBjbGFzc05hbWUgPSAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUud3NnZW4uRWNob1N0cmluZyIpDQotICAgIC8vQFJlc3BvbnNlV3JhcHBlcihsb2NhbE5hbWUgPSAiZWNob1N0cmluZ1Jlc3BvbnNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly93c2dlbi5zYW1wbGUuamF4d3MuYXhpczIuYXBhY2hlLm9yZyIsIGNsYXNzTmFtZSA9ICJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS53c2dlbi5FY2hvU3RyaW5nUmVzcG9uc2UiKQ0KLSAgICBwdWJsaWMgU3RyaW5nIGVjaG9TdHJpbmcoDQotICAgICAgICAvL0BXZWJQYXJhbShuYW1lID0gImFyZzAiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikNCi0gICAgICAgIFN0cmluZyBhcmcwKTsNCi0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS93c2dlbi9jbGllbnQvV1NHZW5JbXBsLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL3dzZ2VuL2NsaWVudC9XU0dlbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM0Y2Q1Ni4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL3dzZ2VuL2NsaWVudC9XU0dlbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLndzZ2VuLmNsaWVudDsNCi0NCi0vLyBTRVJWRVItU0lERSBDTEFTUw0KLQ0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsNCi0NCi1AV2ViU2VydmljZShlbmRwb2ludEludGVyZmFjZSA9ICJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS53c2dlbi5XU0dlbkludGVyZmFjZSIsDQotICAgICAgICBzZXJ2aWNlTmFtZT0iV1NHZW5TZXJ2aWNlIiwNCi0gICAgICAgIHBvcnROYW1lPSJXU0dlblBvcnQiLA0KLSAgICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3NnZW4uc2FtcGxlLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciDQotICAgICkNCi1wdWJsaWMgY2xhc3MgV1NHZW5JbXBsIGltcGxlbWVudHMgV1NHZW5JbnRlcmZhY2Ugew0KLQ0KLSAgICBwdWJsaWMgV1NHZW5JbXBsKCkgew0KLSAgICAgICAgc3VwZXIoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGVjaG9TdHJpbmcoU3RyaW5nIGFyZzApIHsNCi0gICAgICAgIHJldHVybiBhcmcwOw0KLQ0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvd3NnZW4vY2xpZW50L1dTR2VuSW50ZXJmYWNlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL3dzZ2VuL2NsaWVudC9XU0dlbkludGVyZmFjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmJkNWVjLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvd3NnZW4vY2xpZW50L1dTR2VuSW50ZXJmYWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0NCi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS53c2dlbi5jbGllbnQ7DQotDQotaW1wb3J0IGphdmF4Lmp3cy5XZWJNZXRob2Q7DQotaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbTsNCi1pbXBvcnQgamF2YXguandzLldlYlJlc3VsdDsNCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5SZXF1ZXN0V3JhcHBlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLlJlc3BvbnNlV3JhcHBlcjsNCi0NCi0NCi0vKioNCi0gKiBUaGlzIGNsYXNzIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIEpBWFdTIFNJLg0KLSAqIEpBWC1XUyBSSSAyLjBfMDEtYjE1LWZjcw0KLSAqIEdlbmVyYXRlZCBzb3VyY2UgdmVyc2lvbjogMi4wDQotICogDQotICovDQotQFdlYlNlcnZpY2UobmFtZSA9ICJXU0dlbkludGVyZmFjZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vd3NnZW4uc2FtcGxlLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciKQ0KLXB1YmxpYyBpbnRlcmZhY2UgV1NHZW5JbnRlcmZhY2Ugew0KLQ0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSBhcmcwDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgamF2YS5sYW5nLlN0cmluZw0KLSAgICAgKi8NCi0gICAgQFdlYk1ldGhvZChhY3Rpb24gPSAidXJuOkVjaG9TdHJpbmciKQ0KLSAgICBAV2ViUmVzdWx0KHRhcmdldE5hbWVzcGFjZSA9ICIiKQ0KLSAgICBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gImVjaG9TdHJpbmciLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3dzZ2VuLnNhbXBsZS5qYXh3cy5heGlzMi5hcGFjaGUub3JnIiwgY2xhc3NOYW1lID0gIm9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLndzZ2VuLmpheHdzLkVjaG9TdHJpbmciKQ0KLSAgICBAUmVzcG9uc2VXcmFwcGVyKGxvY2FsTmFtZSA9ICJlY2hvU3RyaW5nUmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3dzZ2VuLnNhbXBsZS5qYXh3cy5heGlzMi5hcGFjaGUub3JnIiwgY2xhc3NOYW1lID0gIm9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLndzZ2VuLmpheHdzLkVjaG9TdHJpbmdSZXNwb25zZSIpDQotICAgIHB1YmxpYyBTdHJpbmcgZWNob1N0cmluZygNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImFyZzAiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikNCi0gICAgICAgIFN0cmluZyBhcmcwKTsNCi0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS93c2dlbi9jbGllbnQvV1NHZW5TZXJ2aWNlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL3dzZ2VuL2NsaWVudC9XU0dlblNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJlNjc1OC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL3dzZ2VuL2NsaWVudC9XU0dlblNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLQ0KLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLndzZ2VuLmNsaWVudDsNCi0NCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJFbmRwb2ludDsNCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VDbGllbnQ7DQotaW1wb3J0IGphdmEuaW8uRmlsZTsNCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLm5ldC5VUkw7DQotDQotDQotLyoqDQotICogVGhpcyBjbGFzcyB3YXMgZ2VuZXJhdGVkIGJ5IHRoZSBKQVhXUyBTSS4NCi0gKiBKQVgtV1MgUkkgMi4wXzAxLWIxNS1mY3MNCi0gKiBHZW5lcmF0ZWQgc291cmNlIHZlcnNpb246IDIuMA0KLSAqIA0KLSAqLw0KLUBXZWJTZXJ2aWNlQ2xpZW50KG5hbWUgPSAiV1NHZW5TZXJ2aWNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly93c2dlbi5zYW1wbGUuamF4d3MuYXhpczIuYXBhY2hlLm9yZyIsIHdzZGxMb2NhdGlvbiA9ICJXU0dlblNlcnZpY2Uud3NkbCIpDQotcHVibGljIGNsYXNzIFdTR2VuU2VydmljZQ0KLSAgICBleHRlbmRzIFNlcnZpY2UNCi17DQotDQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFVSTCBXU0dFTlNFUlZJQ0VfV1NETF9MT0NBVElPTjsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHdzZGxMb2NhdGlvbj0iL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvd3NnZW4vTUVUQS1JTkYvV1NHZW5TZXJ2aWNlLndzZGwiOw0KLSAgICANCi0gICAgc3RhdGljIHsNCi0gICAgICAgIFVSTCB1cmwgPSBudWxsOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICB0cnl7DQotICAgICAgICAgICAgICAgIFN0cmluZyBiYXNlRGlyID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJiYXNlZGlyIiwiLiIpKS5nZXRDYW5vbmljYWxQYXRoKCk7DQotICAgICAgICAgICAgICAgIHdzZGxMb2NhdGlvbiA9IG5ldyBGaWxlKGJhc2VEaXIgKyB3c2RsTG9jYXRpb24pLmdldEFic29sdXRlUGF0aCgpOw0KLSAgICAgICAgICAgIH1jYXRjaChFeGNlcHRpb24gZSl7DQotICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKHdzZGxMb2NhdGlvbik7DQotICAgICAgICAgICAgdXJsID0gZmlsZS50b1VSTCgpOw0KLSAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgV1NHRU5TRVJWSUNFX1dTRExfTE9DQVRJT04gPSB1cmw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFdTR2VuU2VydmljZShVUkwgd3NkbExvY2F0aW9uLCBRTmFtZSBzZXJ2aWNlTmFtZSkgew0KLSAgICAgICAgc3VwZXIod3NkbExvY2F0aW9uLCBzZXJ2aWNlTmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFdTR2VuU2VydmljZSgpIHsNCi0gICAgICAgIHN1cGVyKFdTR0VOU0VSVklDRV9XU0RMX0xPQ0FUSU9OLCBuZXcgUU5hbWUoImh0dHA6Ly93c2dlbi5zYW1wbGUuamF4d3MuYXhpczIuYXBhY2hlLm9yZyIsICJXU0dlblNlcnZpY2UiKSk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIFdTR2VuSW50ZXJmYWNlDQotICAgICAqLw0KLSAgICBAV2ViRW5kcG9pbnQobmFtZSA9ICJXU0dlblBvcnQiKQ0KLSAgICBwdWJsaWMgV1NHZW5JbnRlcmZhY2UgZ2V0V1NHZW5Qb3J0KCkgew0KLSAgICAgICAgcmV0dXJuIChXU0dlbkludGVyZmFjZSlzdXBlci5nZXRQb3J0KG5ldyBRTmFtZSgiaHR0cDovL3dzZ2VuLnNhbXBsZS5qYXh3cy5heGlzMi5hcGFjaGUub3JnIiwgIldTR2VuUG9ydCIpLCBXU0dlbkludGVyZmFjZS5jbGFzcyk7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS93c2dlbi9qYXh3cy9FY2hvU3RyaW5nLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL3dzZ2VuL2pheHdzL0VjaG9TdHJpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdhYzA2Yi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL3dzZ2VuL2pheHdzL0VjaG9TdHJpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLQ0KLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLndzZ2VuLmpheHdzOw0KLQ0KLS8vIFNFUlZFUi1TSURFIENMQVNTDQotDQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzVHlwZTsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7DQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudDsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSb290RWxlbWVudDsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlOw0KLQ0KLUBYbWxSb290RWxlbWVudChuYW1lID0gImVjaG9TdHJpbmciLCBuYW1lc3BhY2UgPSAiaHR0cDovL3dzZ2VuLnNhbXBsZS5qYXh3cy5heGlzMi5hcGFjaGUub3JnIikNCi1AWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpDQotQFhtbFR5cGUobmFtZSA9ICJlY2hvU3RyaW5nIiwgbmFtZXNwYWNlID0gImh0dHA6Ly93c2dlbi5zYW1wbGUuamF4d3MuYXhpczIuYXBhY2hlLm9yZyIpDQotcHVibGljIGNsYXNzIEVjaG9TdHJpbmcgew0KLQ0KLSAgICBAWG1sRWxlbWVudChuYW1lID0gImFyZzAiLCBuYW1lc3BhY2UgPSAiIikNCi0gICAgcHJpdmF0ZSBTdHJpbmcgYXJnMDsNCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIFN0cmluZw0KLSAgICAgKi8NCi0gICAgcHVibGljIFN0cmluZyBnZXRBcmcwKCkgew0KLSAgICAgICAgcmV0dXJuIHRoaXMuYXJnMDsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSBhcmcwDQotICAgICAqICAgICB0aGUgdmFsdWUgZm9yIHRoZSBhcmcwIHByb3BlcnR5DQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBzZXRBcmcwKFN0cmluZyBhcmcwKSB7DQotICAgICAgICB0aGlzLmFyZzAgPSBhcmcwOw0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvd3NnZW4vamF4d3MvRWNob1N0cmluZ1Jlc3BvbnNlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL3dzZ2VuL2pheHdzL0VjaG9TdHJpbmdSZXNwb25zZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGNjMzUxLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvd3NnZW4vamF4d3MvRWNob1N0cmluZ1Jlc3BvbnNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0NCi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS53c2dlbi5qYXh3czsNCi0NCi0vLyBTRVJWRVItU0lERSBDTEFTUw0KLQ0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7DQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOw0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnQ7DQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUm9vdEVsZW1lbnQ7DQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZTsNCi0NCi1AWG1sUm9vdEVsZW1lbnQobmFtZSA9ICJlY2hvU3RyaW5nUmVzcG9uc2UiLCBuYW1lc3BhY2UgPSAiaHR0cDovL3dzZ2VuLnNhbXBsZS5qYXh3cy5heGlzMi5hcGFjaGUub3JnIikNCi1AWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpDQotQFhtbFR5cGUobmFtZSA9ICJlY2hvU3RyaW5nUmVzcG9uc2UiLCBuYW1lc3BhY2UgPSAiaHR0cDovL3dzZ2VuLnNhbXBsZS5qYXh3cy5heGlzMi5hcGFjaGUub3JnIikNCi1wdWJsaWMgY2xhc3MgRWNob1N0cmluZ1Jlc3BvbnNlIHsNCi0NCi0gICAgQFhtbEVsZW1lbnQobmFtZSA9ICJyZXR1cm4iLCBuYW1lc3BhY2UgPSAiIikNCi0gICAgcHJpdmF0ZSBTdHJpbmcgX3JldHVybjsNCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIFN0cmluZw0KLSAgICAgKi8NCi0gICAgcHVibGljIFN0cmluZyBnZXRfcmV0dXJuKCkgew0KLSAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVybjsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSBfcmV0dXJuDQotICAgICAqICAgICB0aGUgdmFsdWUgZm9yIHRoZSBfcmV0dXJuIHByb3BlcnR5DQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBzZXRfcmV0dXJuKFN0cmluZyBfcmV0dXJuKSB7DQotICAgICAgICB0aGlzLl9yZXR1cm4gPSBfcmV0dXJuOw0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zZWN1cml0eS9CYXNpY0F1dGhTZWN1cml0eVRlc3RzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2VjdXJpdHkvQmFzaWNBdXRoU2VjdXJpdHlUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjQ5ZjhmLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zZWN1cml0eS9CYXNpY0F1dGhTZWN1cml0eVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zZWN1cml0eTsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuQmluZGluZ1Byb3ZpZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLlRlc3RMb2dnZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZnJhbWV3b3JrLkFic3RyYWN0VGVzdENhc2U7DQotDQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5EaXNwYXRjaDsNCi1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5TT0FQQmluZGluZzsNCi0NCi1wdWJsaWMgY2xhc3MgQmFzaWNBdXRoU2VjdXJpdHlUZXN0cyBleHRlbmRzIEFic3RyYWN0VGVzdENhc2Ugew0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyBlbmRwb2ludFVybCA9ICJodHRwOi8vbG9jYWxob3N0OjYwNjAvYXhpczIvc2VydmljZXMvQmFzaWNBdXRoU2VjdXJpdHlTZXJ2aWNlLlNpbXBsZVByb3ZpZGVyU2VydmljZVNPQVAxMXBvcnQwIjsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgeG1sU3RyaW5nID0gIjxpbnZva2VPcD50ZXN0IGlucHV0PC9pbnZva2VPcD4iOw0KLSAgICBwcml2YXRlIFFOYW1lIFNFUlZJQ0VfUU5BTUUgPSBuZXcgUU5hbWUoImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyIiwgIkJhc2ljQXV0aFNlY3VyaXR5U2VydmljZSIpOw0KLSAgICBwcml2YXRlIFFOYW1lIFBPUlRfUU5BTUUgPSBuZXcgUU5hbWUoImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyIiwgIlNpbXBsZVByb3ZpZGVyU2VydmljZVNPQVAxMXBvcnQwIik7DQotDQotICAgIHByaXZhdGUgU3RyaW5nIFVTRVJfSUQgPSAidGVzdGlkIjsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgUEFTU1dPUkQgPSAidGVzdGlkIjsNCi0NCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgew0KLSAgICAgICAgcmV0dXJuIGdldFRlc3RTZXR1cChuZXcgVGVzdFN1aXRlKEJhc2ljQXV0aFNlY3VyaXR5VGVzdHMuY2xhc3MpKTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIHZvaWQgdGVzdEJhc2ljQXV0aCgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoInRlc3Q6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgDQotICAgICAgICBEaXNwYXRjaDxTdHJpbmc+IGRpc3BhdGNoID0gZ2V0RGlzcGF0Y2goU2VydmljZS5Nb2RlLlBBWUxPQUQsDQotICAgICAgICAJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kcG9pbnRVcmwsDQotICAgICAgICAJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09BUEJpbmRpbmcuU09BUDExSFRUUF9CSU5ESU5HKTsNCi0NCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBJbnZva2luZyBEaXNwYXRjaDxTdHJpbmc+IEJhc2ljQXV0aFNlY3VyaXR5U2VydmljZSIpOw0KLSAgICAgICAgU3RyaW5nIHJldFZhbCA9IGRpc3BhdGNoLmludm9rZSh4bWxTdHJpbmcpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IFJlc3BvbnNlIFsiICsgcmV0VmFsICsgIl0iKTsNCi0gICAgICAgIA0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXRWYWwgIT0gbnVsbCk7DQotICAgICAgICANCi0gICAgICAgIC8vIEludm9rZSBhIHNlY29uZCB0aW1lIHRvIHZlcmlmeQ0KLSAgICAgICAgcmV0VmFsID0gZGlzcGF0Y2guaW52b2tlKHhtbFN0cmluZyk7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gUmVzcG9uc2UgWyIgKyByZXRWYWwgKyAiXSIpOw0KLSAgICAgICAgDQotICAgICAgICBhc3NlcnRUcnVlKHJldFZhbCAhPSBudWxsKTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIHZvaWQgdGVzdEJhc2ljQXV0aF91aWRfcHdkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygidGVzdDogIiArIGdldE5hbWUoKSk7DQotICAgICAgICANCi0gICAgICAgIERpc3BhdGNoPFN0cmluZz4gZGlzcGF0Y2ggPSBnZXREaXNwYXRjaChTZXJ2aWNlLk1vZGUuUEFZTE9BRCwNCi0gICAgICAgIAkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRwb2ludFVybCwNCi0gICAgICAgIAkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT0FQQmluZGluZy5TT0FQMTFIVFRQX0JJTkRJTkcpOw0KLSAgICAgICAgDQotICAgICAgICBkaXNwYXRjaC5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dChCaW5kaW5nUHJvdmlkZXIuVVNFUk5BTUVfUFJPUEVSVFksIFVTRVJfSUQpOw0KLQkJZGlzcGF0Y2guZ2V0UmVxdWVzdENvbnRleHQoKS5wdXQoQmluZGluZ1Byb3ZpZGVyLlBBU1NXT1JEX1BST1BFUlRZLCBQQVNTV09SRCk7DQotDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gSW52b2tpbmcgRGlzcGF0Y2g8U3RyaW5nPiBCYXNpY0F1dGhTZWN1cml0eVNlcnZpY2UiKTsNCi0gICAgICAgIFN0cmluZyByZXRWYWwgPSBkaXNwYXRjaC5pbnZva2UoeG1sU3RyaW5nKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBSZXNwb25zZSBbIiArIHJldFZhbCArICJdIik7DQotICAgICAgICANCi0gICAgICAgIGFzc2VydFRydWUocmV0VmFsICE9IG51bGwpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBJbnZva2UgYSBzZWNvbmQgdGltZSB0byB2ZXJpZnkNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBJbnZva2luZyBEaXNwYXRjaDxTdHJpbmc+IEJhc2ljQXV0aFNlY3VyaXR5U2VydmljZSIpOw0KLSAgICAgICAgcmV0VmFsID0gZGlzcGF0Y2guaW52b2tlKHhtbFN0cmluZyk7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gUmVzcG9uc2UgWyIgKyByZXRWYWwgKyAiXSIpOw0KLSAgICAgICAgDQotICAgICAgICBhc3NlcnRUcnVlKHJldFZhbCAhPSBudWxsKTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIHZvaWQgdGVzdEJhc2ljQXV0aF91aWQoKXRocm93cyBFeGNlcHRpb257DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygidGVzdDogIiArIGdldE5hbWUoKSk7DQotICAgICAgICANCi0gICAgICAgIERpc3BhdGNoPFN0cmluZz4gZGlzcGF0Y2ggPSBnZXREaXNwYXRjaChTZXJ2aWNlLk1vZGUuUEFZTE9BRCwNCi0gICAgICAgIAkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRwb2ludFVybCwNCi0gICAgICAgIAkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT0FQQmluZGluZy5TT0FQMTFIVFRQX0JJTkRJTkcpOw0KLSAgICAgICAgDQotICAgICAgICBkaXNwYXRjaC5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dChCaW5kaW5nUHJvdmlkZXIuVVNFUk5BTUVfUFJPUEVSVFksIFVTRVJfSUQpOw0KLQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEludm9raW5nIERpc3BhdGNoPFN0cmluZz4gQmFzaWNBdXRoU2VjdXJpdHlTZXJ2aWNlIik7DQotICAgICAgICBTdHJpbmcgcmV0VmFsID0gZGlzcGF0Y2guaW52b2tlKHhtbFN0cmluZyk7DQotICAgICAgIAlUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gUmVzcG9uc2UgWyIgKyByZXRWYWwgKyAiXSIpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBJbnZva2UgYSBzZWNvbmQgdGltZSB0byB2ZXJpZnkNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBJbnZva2luZyBEaXNwYXRjaDxTdHJpbmc+IEJhc2ljQXV0aFNlY3VyaXR5U2VydmljZSIpOw0KLSAgICAgICAgcmV0VmFsID0gZGlzcGF0Y2guaW52b2tlKHhtbFN0cmluZyk7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gUmVzcG9uc2UgWyIgKyByZXRWYWwgKyAiXSIpOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QmFzaWNBdXRoX3B3ZCgpdGhyb3dzIEV4Y2VwdGlvbnsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJ0ZXN0OiAiICsgZ2V0TmFtZSgpKTsNCi0gICAgICAgIA0KLSAgICAgICAgRGlzcGF0Y2g8U3RyaW5nPiBkaXNwYXRjaCA9IGdldERpc3BhdGNoKFNlcnZpY2UuTW9kZS5QQVlMT0FELA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZHBvaW50VXJsLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPQVBCaW5kaW5nLlNPQVAxMUhUVFBfQklORElORyk7DQotDQotICAgICAgICBkaXNwYXRjaC5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dChCaW5kaW5nUHJvdmlkZXIuUEFTU1dPUkRfUFJPUEVSVFksIFBBU1NXT1JEKTsNCi0NCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBJbnZva2luZyBEaXNwYXRjaDxTdHJpbmc+IEJhc2ljQXV0aFNlY3VyaXR5U2VydmljZSIpOw0KLQ0KLSAgICAgICAgdHJ5ew0KLSAgICAgICAgICAgIFN0cmluZyByZXRWYWwgPSBkaXNwYXRjaC5pbnZva2UoeG1sU3RyaW5nKTsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gUmVzcG9uc2UgWyIgKyByZXRWYWwgKyAiXSIpOw0KLQ0KLSAgICAgICAgICAgIGZhaWwoIlNldCBQQVNTV09SRCB3aXRoIG5vIFVTRVJJRDogV2ViU2VydmljZUV4Y2VwdGlvbiBpcyBleHBlY3RlZCIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2goV2ViU2VydmljZUV4Y2VwdGlvbiB3c2Upew0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKGdldE5hbWUoKSArICI6ICIgKyB3c2UpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICAvLyBUcnkgYSBzZWNvbmQgdGltZSB0byB2ZXJpZnkNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBJbnZva2luZyBEaXNwYXRjaDxTdHJpbmc+IEJhc2ljQXV0aFNlY3VyaXR5U2VydmljZSIpOw0KLQ0KLSAgICAgICAgdHJ5ew0KLSAgICAgICAgICAgIFN0cmluZyByZXRWYWwgPSBkaXNwYXRjaC5pbnZva2UoeG1sU3RyaW5nKTsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gUmVzcG9uc2UgWyIgKyByZXRWYWwgKyAiXSIpOw0KLQ0KLSAgICAgICAgICAgIGZhaWwoIlNldCBQQVNTV09SRCB3aXRoIG5vIFVTRVJJRDogV2ViU2VydmljZUV4Y2VwdGlvbiBpcyBleHBlY3RlZCIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2goV2ViU2VydmljZUV4Y2VwdGlvbiB3c2Upew0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKGdldE5hbWUoKSArICI6ICIgKyB3c2UpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLQkvKioNCi0JICogQXV4aWxpYXJ5IG1ldGhvZCwgZ2VuZXJhdGVzIGEgRGlzcGF0Y2ggb2JqZWN0IG9uIGRlbWFuZA0KLQkgKiANCi0JICogQHBhcmFtIG1vZGUNCi0JICogICAgICAgICAgICBTZXJ2aWNlLk1vZGUNCi0JICogQHBhcmFtIGVuZHBvaW50DQotCSAqICAgICAgICAgICAgZW5kcG9pbnQgYWRkcmVzcw0KLQkgKiBAcGFyYW0gYmluZGluZw0KLQkgKiAgICAgICAgICAgIGJpbmRpbmcgdHlwZQ0KLQkgKiBAcmV0dXJuDQotCSAqLw0KLQlwcml2YXRlIERpc3BhdGNoPFN0cmluZz4gZ2V0RGlzcGF0Y2goU2VydmljZS5Nb2RlIG1vZGUsIFN0cmluZyBlbmRwb2ludCxTdHJpbmcgYmluZGluZykgew0KLQkJDQotCQlTZXJ2aWNlIHNlcnZpY2UgPSBTZXJ2aWNlLmNyZWF0ZShTRVJWSUNFX1FOQU1FKTsNCi0JCQ0KLQkJc2VydmljZS5hZGRQb3J0KFBPUlRfUU5BTUUsIGJpbmRpbmcsIGVuZHBvaW50KTsNCi0JCWphdmF4LnhtbC53cy5EaXNwYXRjaDxTdHJpbmc+IGRpc3BhdGNoID0gc2VydmljZS5jcmVhdGVEaXNwYXRjaChQT1JUX1FOQU1FLCBTdHJpbmcuY2xhc3MsbW9kZSk7DQotDQotCQlhc3NlcnROb3ROdWxsKCJEaXNwYXRjaCBub3QgbnVsbCIsIGRpc3BhdGNoKTsNCi0NCi0JCXJldHVybiBkaXNwYXRjaDsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2VjdXJpdHkvc2VydmVyL01FVEEtSU5GL01BTklGRVNULk1GIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NlY3VyaXR5L3NlcnZlci9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY0YjU2OC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2VjdXJpdHkvc2VydmVyL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wDQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NlY3VyaXR5L3NlcnZlci9TZWN1cml0eVByb3ZpZGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2VjdXJpdHkvc2VydmVyL1NlY3VyaXR5UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA1YWIwMS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2VjdXJpdHkvc2VydmVyL1NlY3VyaXR5UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2VjdXJpdHkuc2VydmVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLlRlc3RMb2dnZXI7DQotDQotaW1wb3J0IGphdmF4LnhtbC53cy5CaW5kaW5nVHlwZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLlByb3ZpZGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZVByb3ZpZGVyOw0KLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5TT0FQQmluZGluZzsNCi1pbXBvcnQgamF2YXgueG1sLndzLmh0dHAuSFRUUEJpbmRpbmc7DQotDQotQFdlYlNlcnZpY2VQcm92aWRlcihzZXJ2aWNlTmFtZT0iQmFzaWNBdXRoU2VjdXJpdHlTZXJ2aWNlIixwb3J0TmFtZT0iU2ltcGxlUHJvdmlkZXJTZXJ2aWNlU09BUDExcG9ydDAiKQ0KLUBCaW5kaW5nVHlwZShTT0FQQmluZGluZy5TT0FQMTFIVFRQX0JJTkRJTkcpDQotcHVibGljIGNsYXNzIFNlY3VyaXR5UHJvdmlkZXIgaW1wbGVtZW50cyBQcm92aWRlcjxTdHJpbmc+IHsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHJlc3BvbnNlR29vZCA9ICI8cHJvdmlkZXI+PG1lc3NhZ2U+cmVxdWVzdCBwcm9jZXNzZWQ8L21lc3NhZ2U+PC9wcm92aWRlcj4iOw0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgcmVzcG9uc2VCYWQgID0gIjxwcm92aWRlcj48bWVzc2FnZT5FUlJPUjpudWxsIHJlcXVlc3QgcmVjZWl2ZWQ8L21lc3NhZ2U+PHByb3ZpZGVyPiI7DQotICAgIA0KLSAgICBwdWJsaWMgU3RyaW5nIGludm9rZShTdHJpbmcgb2JqKSB7DQotICAgICAgICBpZiAob2JqICE9IG51bGwpIHsNCi0gICAgICAgICAgICBTdHJpbmcgc3RyID0gKFN0cmluZykgb2JqOw0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBTdHJpbmdQcm92aWRlciByZWNlaXZlZCBhIG5ldyByZXF1ZXN0Iik7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IHJlcXVlc3QgWyIgKyBzdHIgKyAiXSIpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIHJldHVybiByZXNwb25zZUdvb2Q7DQotICAgICAgICB9DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gRVJST1I6bnVsbCByZXF1ZXN0IHJlY2VpdmVkIik7DQotICAgICAgICByZXR1cm4gcmVzcG9uc2VCYWQ7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3N3YW10b20vU1dBTVRPTVRlc3RzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc3dhbXRvbS9TV0FNVE9NVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBjMjU4Yi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc3dhbXRvbS9TV0FNVE9NVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwNSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnN3YW10b207DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZnJhbWV3b3JrLkFic3RyYWN0VGVzdENhc2U7DQotDQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLkF0dGFjaG1lbnRQYXJ0Ow0KLWltcG9ydCBqYXZheC54bWwuc29hcC5NZXNzYWdlRmFjdG9yeTsNCi1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEJvZHk7DQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBNZXNzYWdlOw0KLWltcG9ydCBqYXZheC54bWwud3MuQmluZGluZ1Byb3ZpZGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuRGlzcGF0Y2g7DQotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5TT0FQQmluZGluZzsNCi0NCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi0NCi0vKioNCi0gKiBUZXN0cyBjYWxsaW5nIGFuIGVuZHBvaW50IHRoYXQgaGFzIG9uZSBvcGVyYXRpb24gdGhhdA0KLSAqIHVzZXMgYW4gTVRPTSBhdHRhY2htZW50IGFuZCBhbm90aGVyIG9wZXJhdGlvbiB0aGF0IHVzZXMgYSBTV0ENCi0gKiBhdHRhY2htZW50Lg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBTV0FNVE9NVGVzdHMgZXh0ZW5kcyBBYnN0cmFjdFRlc3RDYXNlIHsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUU5hbWUgUU5BTUVfU0VSVklDRSA9IG5ldyBRTmFtZSgiaHR0cDovL3N3YW10b21zZXJ2aWNlLnRlc3Qub3JnIiwgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNXQU1UT01TZXJ2aWNlIik7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFFOYW1lIFFOQU1FX1BPUlQgICAgPSBuZXcgUU5hbWUoImh0dHA6Ly9zd2FtdG9tc2VydmljZS50ZXN0Lm9yZyIsIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTV0FNVE9NUG9ydFR5cGVQb3J0Iik7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVUkxfRU5EUE9JTlQgPSAiaHR0cDovL2xvY2FsaG9zdDo2MDYwL2F4aXMyL3NlcnZpY2VzL1NXQU1UT01TZXJ2aWNlLlNXQU1UT01Qb3J0VHlwZVBvcnQiOw0KLSAgICANCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgew0KLSAgICAgICAgcmV0dXJuIGdldFRlc3RTZXR1cChuZXcgVGVzdFN1aXRlKFNXQU1UT01UZXN0cy5jbGFzcykpOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgRGlzcGF0Y2g8U09BUE1lc3NhZ2U+IGdldERpc3BhdGNoKFN0cmluZyBzb2FwQWN0aW9uKSB7DQotICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSBTZXJ2aWNlLmNyZWF0ZShRTkFNRV9TRVJWSUNFKTsNCi0gICAgICAgIHNlcnZpY2UuYWRkUG9ydChRTkFNRV9QT1JULCBTT0FQQmluZGluZy5TT0FQMTFIVFRQX0JJTkRJTkcsIFVSTF9FTkRQT0lOVCk7DQotICAgICAgICBEaXNwYXRjaDxTT0FQTWVzc2FnZT4gZGlzcGF0Y2ggPSBzZXJ2aWNlLmNyZWF0ZURpc3BhdGNoKFFOQU1FX1BPUlQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPQVBNZXNzYWdlLmNsYXNzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlLk1vZGUuTUVTU0FHRSk7DQotICAgICAgICBCaW5kaW5nUHJvdmlkZXIgcCA9IChCaW5kaW5nUHJvdmlkZXIpIGRpc3BhdGNoOw0KLSAgICAgICAgcC5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dChCaW5kaW5nUHJvdmlkZXIuRU5EUE9JTlRfQUREUkVTU19QUk9QRVJUWSwgVVJMX0VORFBPSU5UKTsNCi0gICAgICAgIHAuZ2V0UmVxdWVzdENvbnRleHQoKS5wdXQoQmluZGluZ1Byb3ZpZGVyLlNPQVBBQ1RJT05fVVNFX1BST1BFUlRZLCBCb29sZWFuLlRSVUUpOw0KLSAgICAgICAgcC5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dChCaW5kaW5nUHJvdmlkZXIuU09BUEFDVElPTl9VUklfUFJPUEVSVFksIHNvYXBBY3Rpb24pOw0KLSAgICAgICAgDQotICAgICAgICByZXR1cm4gZGlzcGF0Y2g7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBUZXN0cyBjYWxsaW5nIGFuIGVuZHBvaW50IHRoYXQgdW5kZXJzdGFuZHMgU09BUCAxLjEgTVRPTQ0KLSAgICAgKiBIb3dldmVyIHdlIGFyZSBjYWxsaW5nIGFuIG9wZXJhdGlvbiBvbiB0aGUgZW5kcG9pbnQgdGhhdCANCi0gICAgICogcGFzcyBhIHNpbmdsZSBTV0EgYXR0YWNobWVudCBhcyBhIHJlcXVlc3QgYW5kIGV4cGVjdHMgYSANCi0gICAgICogc2luZ2xlIFNXQSBhdHRhY2htZW50IGFzIGEgcmVzcG9uc2UuICAoVGhlIGJvZHkgY29udGVudHMgYXJlIGVtcHR5LikNCi0gICAgICogDQotICAgICAqIFRoaXMgdGVzdCBhY2NvbXBsaXNoZXMgdGhlIGZvbGxvd2luZzoNCi0gICAgICogICAtIGVuc3VyZXMgdGhhdCBhIFNXQSBhdHRhY2htZW50IChub3QgYW4gTVRPTSBhdHRhY2htZW50KSBpcyBzZW50Lg0KLSAgICAgKiAgIC0gZW5zdXJlcyB0aGF0IGEgU1dBIGF0dGFjaG1lbnQgY2FuIGJlIHNlbnQgYW5kIHJldHVybmVkIGZyb20gDQotICAgICAqICAgICBhbiBlbmRwb2ludCB0aGF0IGhhcyBNVE9NIGVuYWJsZWQuDQotICAgICAqICAgLSBlbnN1cmVzIHRoYXQgdGhlIERCQyBjb3JyZWN0bHkgbWFya3MgdGhlIG9wZXJhdGlvbiBhbmQgcGFyYW1ldGVycw0KLSAgICAgKiAgICAgc3VjaCB0aGF0IGFsbCBvZiB0aGUgcGFyYW1ldGVycyB0byB0aGlzIG9wZXJhdGlvbiBhcmUgbWFwcGVkDQotICAgICAqICAgICB0byBTV0EgYXR0YWNobWVudHMuDQotICAgICAqICAgLSBlbnN1cmVzIHRoYXQgdGhlIG1hcnNoYWxsaW5nIGNvZGUgY2FuIGhhbmRsZSB0aGUgY2FzZSBvZiBhbiANCi0gICAgICogICAgIGVtcHR5IHNvYXAgYm9keSBhbmQgYWxsIGNvbW11bmljYXRpb24gdmlhIFNXQSBhdHRhY2htZW50cy4NCi0gICAgICogICAgIA0KLSAgICAgKiBUaGlzIHRlc3QgZW5zdXJlcyB0aGF0IHRoZSB0b2xlcmF0aW9uIG9mIHRoZSBhdHRhY2htZW50cyB3aXRoIGxlZ2FjeSAocHJlIFdTLUkgMS4wKSBjb250ZW50IGlkcy4NCi0gICAgICogQHRocm93cyBFeGNlcHRpb24NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RTV0FBdHRhY2htZW50c19MZWdhY3lDb250ZW50SUQoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIFN0cmluZyBzb2FwQWN0aW9uID0gInN3YUF0dGFjaG1lbnQiOw0KLSAgICAgICAgRGlzcGF0Y2g8U09BUE1lc3NhZ2U+IGRpc3BhdGNoID0gZ2V0RGlzcGF0Y2goc29hcEFjdGlvbik7DQotDQotICAgICAgICAvLyBPYnRhaW4gYSBwcmVjb25maWd1cmVkIFNBQUogTWVzc2FnZUZhY3RvcnkNCi0gICAgICAgIE1lc3NhZ2VGYWN0b3J5IGZhY3RvcnkgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpOw0KLSAgICAgICAgU09BUE1lc3NhZ2UgcmVxdWVzdCA9IGZhY3RvcnkuY3JlYXRlTWVzc2FnZSgpOw0KLQ0KLSAgICAgICAgLy8gc29hcDpib2R5IHNob3VsZCBiZSBlbXB0eQ0KLSAgICAgICAgU09BUEJvZHkgYm9keSA9IHJlcXVlc3QuZ2V0U09BUEJvZHkoKTsNCi0NCi0gICAgICAgIC8vIGFkZCBhdHRhY2htZW50DQotICAgICAgICBpbnQgYXR0YWNobWVudFNpemUgPSAxMDA7DQotICAgICAgICBieXRlW10gYnl0ZXMgPSBuZXcgYnl0ZVthdHRhY2htZW50U2l6ZV07DQotDQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSsrKSB7DQotICAgICAgICAgICAgYnl0ZXNbaV0gPSAoYnl0ZSkgKCdhJyArICgneicgLSAnYScpICogTWF0aC5yYW5kb20oKSk7DQotICAgICAgICB9DQotDQotICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBiYWlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVzKTsNCi0gICAgICAgIEF0dGFjaG1lbnRQYXJ0IGF0dGFjaG1lbnQgPSByZXF1ZXN0LmNyZWF0ZUF0dGFjaG1lbnRQYXJ0KCk7DQotICAgICAgICAvLyBQZXIgV1NJIFNwZWN0LCB0aGUgc3dhIGNvbnRlbnQgaWQgbXVzdCBzdGFydCB3aXRoIHRoZSBwYXJ0IG5hbWUNCi0gICAgICAgIC8vaHR0cDovL3d3dy53cy1pLm9yZy9Qcm9maWxlcy9BdHRhY2htZW50c1Byb2ZpbGUtMS4wLmh0bWwjVmFsdWUtc3BhY2Vfb2ZfQ29udGVudC1JZF9IZWFkZXINCi0gICAgICAgIGF0dGFjaG1lbnQuc2V0Q29udGVudElkKCJTV0FNVE9NVGVzdFNPQVBNZXNzYWdlIik7DQotICAgICAgICBhdHRhY2htZW50LmFkZE1pbWVIZWFkZXIoIkZWVC1zb3VyY2UiLCAiU1RSX0JPRFlfRUxFTUVOVF8xIik7DQotICAgICAgICBhdHRhY2htZW50LnNldFJhd0NvbnRlbnQoYmFpcywgInRleHQvcGxhaW4iKTsNCi0gICAgICAgIHJlcXVlc3QuYWRkQXR0YWNobWVudFBhcnQoYXR0YWNobWVudCk7DQotDQotICAgICAgICAvLyBpbnZva2UNCi0gICAgICAgIFNPQVBNZXNzYWdlIHJlcGx5ID0gZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLQ0KLSAgICAgICAgLy8gaXRlcmF0ZSBvdmVyIHRoZSBhdHRhY2htZW50cywgdGhlcmUgc2hvdWxkIG9ubHkgYmUgb25lDQotICAgICAgICBJdGVyYXRvciBpdCA9IHJlcGx5LmdldEF0dGFjaG1lbnRzKCk7DQotICAgICAgICBBdHRhY2htZW50UGFydCBhcCA9IG51bGw7DQotDQotICAgICAgICAvLyB2ZXJpZnkgdGhhdCB0aGUgYXR0YWNobWVudCBpcyBub3QgbnVsbCBvciBlbXB0eQ0KLSAgICAgICAgaWYgKChhcCA9IChBdHRhY2htZW50UGFydCkgaXQubmV4dCgpKSA9PSBudWxsKXsNCi0gICAgICAgICAgICBmYWlsKCJBdHRhY2htZW50IGlzIG51bGwiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLQ0KLSAgICAgICAgLy8gdmVyaWZ5IHRoYXQgdGhlIGF0dGFjaG1lbnQgaXMgbm90IG51bGwgb3IgZW1wdHkNCi0gICAgICAgIGlmIChpdC5oYXNOZXh0KCkpew0KLSAgICAgICAgICAgIGZhaWwoIkRldGVjdGVkIG1vcmUgdGhlbiAxIGF0dGFjaG1lbnQiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFNPQVBCb2R5IHNiID0gcmVwbHkuZ2V0U09BUEJvZHkoKTsNCi0gICAgICAgIGlmIChzYi5nZXRDaGlsZEVsZW1lbnRzKCkuaGFzTmV4dCgpKSB7DQotICAgICAgICAgICAgZmFpbCgiTWVzc2FnZSBjb250YWlucyBzb2FwOmJvZHkgcGF5bG9hZCIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgYnl0ZXMgPSBhcC5nZXRSYXdDb250ZW50Qnl0ZXMoKTsNCi0gICAgICAgIGlmIChieXRlcy5sZW5ndGggPT0gMCkgeyANCi0gICAgICAgICAgICBmYWlsKCJBdHRhY2htZW50IGlzIGVtcHR5Iik7IA0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy8gdmVyaWZ5IHRoYXQgZW5kcG9pbnQgaGFzIGJlZW4gYWJsZSB0byBtb2RpZnkgdGhlIGF0dGFjaG1lbnQNCi0gICAgICAgIGlmIChieXRlc1swXSAhPSAnUycgfHwgYnl0ZXNbMV0gIT0gJ1cnIHx8IGJ5dGVzWzJdICE9ICdBJykgeyANCi0gICAgICAgICAgICBmYWlsKCJEaWQgbm90IHJlY2VpdmUgYSBtb2RpZmllZCBhdHRhY2htZW50Iik7IA0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICANCi0gICAgICAgIC8vIEludm9rZSBhIHNlY29uZCB0aW1lIHRvIHZlcmlmeQ0KLQ0KLSAgICAgICAgLy8gaW52b2tlDQotICAgICAgICByZXBseSA9IGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0NCi0gICAgICAgIC8vIGl0ZXJhdGUgb3ZlciB0aGUgYXR0YWNobWVudHMsIHRoZXJlIHNob3VsZCBvbmx5IGJlIG9uZQ0KLSAgICAgICAgaXQgPSByZXBseS5nZXRBdHRhY2htZW50cygpOw0KLSAgICAgICAgYXAgPSBudWxsOw0KLQ0KLSAgICAgICAgLy8gdmVyaWZ5IHRoYXQgdGhlIGF0dGFjaG1lbnQgaXMgbm90IG51bGwgb3IgZW1wdHkNCi0gICAgICAgIGlmICgoYXAgPSAoQXR0YWNobWVudFBhcnQpIGl0Lm5leHQoKSkgPT0gbnVsbCl7DQotICAgICAgICAgICAgZmFpbCgiQXR0YWNobWVudCBpcyBudWxsIik7DQotICAgICAgICB9DQotICAgICAgICANCi0NCi0gICAgICAgIC8vIHZlcmlmeSB0aGF0IHRoZSBhdHRhY2htZW50IGlzIG5vdCBudWxsIG9yIGVtcHR5DQotICAgICAgICBpZiAoaXQuaGFzTmV4dCgpKXsNCi0gICAgICAgICAgICBmYWlsKCJEZXRlY3RlZCBtb3JlIHRoZW4gMSBhdHRhY2htZW50Iik7DQotICAgICAgICB9DQotDQotICAgICAgICBzYiA9IHJlcGx5LmdldFNPQVBCb2R5KCk7DQotICAgICAgICBpZiAoc2IuZ2V0Q2hpbGRFbGVtZW50cygpLmhhc05leHQoKSkgew0KLSAgICAgICAgICAgIGZhaWwoIk1lc3NhZ2UgY29udGFpbnMgc29hcDpib2R5IHBheWxvYWQiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGJ5dGVzID0gYXAuZ2V0UmF3Q29udGVudEJ5dGVzKCk7DQotICAgICAgICBpZiAoYnl0ZXMubGVuZ3RoID09IDApIHsgDQotICAgICAgICAgICAgZmFpbCgiQXR0YWNobWVudCBpcyBlbXB0eSIpOyANCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vIHZlcmlmeSB0aGF0IGVuZHBvaW50IGhhcyBiZWVuIGFibGUgdG8gbW9kaWZ5IHRoZSBhdHRhY2htZW50DQotICAgICAgICBpZiAoYnl0ZXNbMF0gIT0gJ1MnIHx8IGJ5dGVzWzFdICE9ICdXJyB8fCBieXRlc1syXSAhPSAnQScpIHsgDQotICAgICAgICAgICAgZmFpbCgiRGlkIG5vdCByZWNlaXZlIGEgbW9kaWZpZWQgYXR0YWNobWVudCIpOyANCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFRlc3RzIGNhbGxpbmcgYW4gZW5kcG9pbnQgdGhhdCB1bmRlcnN0YW5kcyBTT0FQIDEuMSBNVE9NDQotICAgICAqIEhvd2V2ZXIgd2UgYXJlIGNhbGxpbmcgYW4gb3BlcmF0aW9uIG9uIHRoZSBlbmRwb2ludCB0aGF0IA0KLSAgICAgKiBwYXNzIGEgc2luZ2xlIFNXQSBhdHRhY2htZW50IGFzIGEgcmVxdWVzdCBhbmQgZXhwZWN0cyBhIA0KLSAgICAgKiBzaW5nbGUgU1dBIGF0dGFjaG1lbnQgYXMgYSByZXNwb25zZS4gIChUaGUgYm9keSBjb250ZW50cyBhcmUgZW1wdHkuKQ0KLSAgICAgKiANCi0gICAgICogVGhpcyB0ZXN0IGFjY29tcGxpc2hlcyB0aGUgZm9sbG93aW5nOg0KLSAgICAgKiAgIC0gZW5zdXJlcyB0aGF0IGEgU1dBIGF0dGFjaG1lbnQgKG5vdCBhbiBNVE9NIGF0dGFjaG1lbnQpIGlzIHNlbnQuDQotICAgICAqICAgLSBlbnN1cmVzIHRoYXQgYSBTV0EgYXR0YWNobWVudCBjYW4gYmUgc2VudCBhbmQgcmV0dXJuZWQgZnJvbSANCi0gICAgICogICAgIGFuIGVuZHBvaW50IHRoYXQgaGFzIE1UT00gZW5hYmxlZC4NCi0gICAgICogICAtIGVuc3VyZXMgdGhhdCB0aGUgREJDIGNvcnJlY3RseSBtYXJrcyB0aGUgb3BlcmF0aW9uIGFuZCBwYXJhbWV0ZXJzDQotICAgICAqICAgICBzdWNoIHRoYXQgYWxsIG9mIHRoZSBwYXJhbWV0ZXJzIHRvIHRoaXMgb3BlcmF0aW9uIGFyZSBtYXBwZWQNCi0gICAgICogICAgIHRvIFNXQSBhdHRhY2htZW50cy4NCi0gICAgICogICAtIGVuc3VyZXMgdGhhdCB0aGUgbWFyc2hhbGxpbmcgY29kZSBjYW4gaGFuZGxlIHRoZSBjYXNlIG9mIGFuIA0KLSAgICAgKiAgICAgZW1wdHkgc29hcCBib2R5IGFuZCBhbGwgY29tbXVuaWNhdGlvbiB2aWEgU1dBIGF0dGFjaG1lbnRzLg0KLSAgICAgKiAgICAgDQotICAgICAqIFRoaXMgdGVzdCBlbnN1cmVzIHRoYXQgdGhlIGVuZHBvaW50IGNhbiByZWNlaXZlIGFuZCByZXR1cm4gY29tcGxpYW50IChwcmUgV1MtSSAxLjApIGNvbnRlbnQgaWRzLg0KLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdFNXQUF0dGFjaG1lbnRzX1dTSSgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgU3RyaW5nIHNvYXBBY3Rpb24gPSAic3dhQXR0YWNobWVudCI7DQotICAgICAgICBEaXNwYXRjaDxTT0FQTWVzc2FnZT4gZGlzcGF0Y2ggPSBnZXREaXNwYXRjaChzb2FwQWN0aW9uKTsNCi0NCi0gICAgICAgIC8vIE9idGFpbiBhIHByZWNvbmZpZ3VyZWQgU0FBSiBNZXNzYWdlRmFjdG9yeQ0KLSAgICAgICAgTWVzc2FnZUZhY3RvcnkgZmFjdG9yeSA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKCk7DQotICAgICAgICBTT0FQTWVzc2FnZSByZXF1ZXN0ID0gZmFjdG9yeS5jcmVhdGVNZXNzYWdlKCk7DQotDQotICAgICAgICAvLyBzb2FwOmJvZHkgc2hvdWxkIGJlIGVtcHR5DQotICAgICAgICBTT0FQQm9keSBib2R5ID0gcmVxdWVzdC5nZXRTT0FQQm9keSgpOw0KLQ0KLSAgICAgICAgLy8gYWRkIGF0dGFjaG1lbnQNCi0gICAgICAgIGludCBhdHRhY2htZW50U2l6ZSA9IDEwMDsNCi0gICAgICAgIGJ5dGVbXSBieXRlcyA9IG5ldyBieXRlW2F0dGFjaG1lbnRTaXplXTsNCi0NCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpKyspIHsNCi0gICAgICAgICAgICBieXRlc1tpXSA9IChieXRlKSAoJ2EnICsgKCd6JyAtICdhJykgKiBNYXRoLnJhbmRvbSgpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGJhaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZXMpOw0KLSAgICAgICAgQXR0YWNobWVudFBhcnQgYXR0YWNobWVudCA9IHJlcXVlc3QuY3JlYXRlQXR0YWNobWVudFBhcnQoKTsNCi0gICAgICAgIC8vIFBlciBXU0kgU3BlY3QsIHRoZSBzd2EgY29udGVudCBpZCBtdXN0IHN0YXJ0IHdpdGggdGhlIHBhcnQgbmFtZQ0KLSAgICAgICAgLy9odHRwOi8vd3d3LndzLWkub3JnL1Byb2ZpbGVzL0F0dGFjaG1lbnRzUHJvZmlsZS0xLjAuaHRtbCNWYWx1ZS1zcGFjZV9vZl9Db250ZW50LUlkX0hlYWRlcg0KLSAgICAgICAgYXR0YWNobWVudC5zZXRDb250ZW50SWQoImpwZWdJbWFnZVJlcXVlc3Q9U1dBTVRPTVRlc3RTT0FQTWVzc2FnZSIpOw0KLSAgICAgICAgYXR0YWNobWVudC5hZGRNaW1lSGVhZGVyKCJGVlQtc291cmNlIiwgIlNUUl9CT0RZX0VMRU1FTlRfMSIpOw0KLSAgICAgICAgYXR0YWNobWVudC5zZXRSYXdDb250ZW50KGJhaXMsICJ0ZXh0L3BsYWluIik7DQotICAgICAgICByZXF1ZXN0LmFkZEF0dGFjaG1lbnRQYXJ0KGF0dGFjaG1lbnQpOw0KLQ0KLSAgICAgICAgLy8gaW52b2tlDQotICAgICAgICBTT0FQTWVzc2FnZSByZXBseSA9IGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0NCi0gICAgICAgIC8vIGl0ZXJhdGUgb3ZlciB0aGUgYXR0YWNobWVudHMsIHRoZXJlIHNob3VsZCBvbmx5IGJlIG9uZQ0KLSAgICAgICAgSXRlcmF0b3IgaXQgPSByZXBseS5nZXRBdHRhY2htZW50cygpOw0KLSAgICAgICAgQXR0YWNobWVudFBhcnQgYXAgPSBudWxsOw0KLQ0KLSAgICAgICAgLy8gdmVyaWZ5IHRoYXQgdGhlIGF0dGFjaG1lbnQgaXMgbm90IG51bGwgb3IgZW1wdHkNCi0gICAgICAgIGlmICgoYXAgPSAoQXR0YWNobWVudFBhcnQpIGl0Lm5leHQoKSkgPT0gbnVsbCl7DQotICAgICAgICAgICAgZmFpbCgiQXR0YWNobWVudCBpcyBudWxsIik7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgY29udGVudCBpZCBzdGFydHMgd2l0aCB0aGUgYXBwcm9wcmlhdGUgU1dBIG5hbWUNCi0gICAgICAgIGlmICghYXAuZ2V0Q29udGVudElkKCkuc3RhcnRzV2l0aCgianBlZ0ltYWdlUmVzcG9uc2U9IikpIHsNCi0gICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBjb250ZW50IGlkIHRvIHN0YXJ0IHdpdGgganBlZ0ltYWdlUmVzcG9uc2UiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vIHZlcmlmeSB0aGF0IHRoZSBhdHRhY2htZW50IGlzIG5vdCBudWxsIG9yIGVtcHR5DQotICAgICAgICBpZiAoaXQuaGFzTmV4dCgpKXsNCi0gICAgICAgICAgICBmYWlsKCJEZXRlY3RlZCBtb3JlIHRoZW4gMSBhdHRhY2htZW50Iik7DQotICAgICAgICB9DQotDQotICAgICAgICBTT0FQQm9keSBzYiA9IHJlcGx5LmdldFNPQVBCb2R5KCk7DQotICAgICAgICBpZiAoc2IuZ2V0Q2hpbGRFbGVtZW50cygpLmhhc05leHQoKSkgew0KLSAgICAgICAgICAgIGZhaWwoIk1lc3NhZ2UgY29udGFpbnMgc29hcDpib2R5IHBheWxvYWQiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGJ5dGVzID0gYXAuZ2V0UmF3Q29udGVudEJ5dGVzKCk7DQotICAgICAgICBpZiAoYnl0ZXMubGVuZ3RoID09IDApIHsgDQotICAgICAgICAgICAgZmFpbCgiQXR0YWNobWVudCBpcyBlbXB0eSIpOyANCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vIHZlcmlmeSB0aGF0IGVuZHBvaW50IGhhcyBiZWVuIGFibGUgdG8gbW9kaWZ5IHRoZSBhdHRhY2htZW50DQotICAgICAgICBpZiAoYnl0ZXNbMF0gIT0gJ1MnIHx8IGJ5dGVzWzFdICE9ICdXJyB8fCBieXRlc1syXSAhPSAnQScpIHsgDQotICAgICAgICAgICAgZmFpbCgiRGlkIG5vdCByZWNlaXZlIGEgbW9kaWZpZWQgYXR0YWNobWVudCIpOyANCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgLy8gSW52b2tlIGEgc2Vjb25kIHRpbWUgdG8gdmVyaWZ5DQotDQotICAgICAgICAvLyBpbnZva2UNCi0gICAgICAgIHJlcGx5ID0gZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLQ0KLSAgICAgICAgLy8gaXRlcmF0ZSBvdmVyIHRoZSBhdHRhY2htZW50cywgdGhlcmUgc2hvdWxkIG9ubHkgYmUgb25lDQotICAgICAgICBpdCA9IHJlcGx5LmdldEF0dGFjaG1lbnRzKCk7DQotICAgICAgICBhcCA9IG51bGw7DQotDQotICAgICAgICAvLyB2ZXJpZnkgdGhhdCB0aGUgYXR0YWNobWVudCBpcyBub3QgbnVsbCBvciBlbXB0eQ0KLSAgICAgICAgaWYgKChhcCA9IChBdHRhY2htZW50UGFydCkgaXQubmV4dCgpKSA9PSBudWxsKXsNCi0gICAgICAgICAgICBmYWlsKCJBdHRhY2htZW50IGlzIG51bGwiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBjb250ZW50IGlkIHN0YXJ0cyB3aXRoIHRoZSBhcHByb3ByaWF0ZSBTV0EgbmFtZQ0KLSAgICAgICAgaWYgKCFhcC5nZXRDb250ZW50SWQoKS5zdGFydHNXaXRoKCJqcGVnSW1hZ2VSZXNwb25zZT0iKSkgew0KLSAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIGNvbnRlbnQgaWQgdG8gc3RhcnQgd2l0aCBqcGVnSW1hZ2VSZXNwb25zZSIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy8gdmVyaWZ5IHRoYXQgdGhlIGF0dGFjaG1lbnQgaXMgbm90IG51bGwgb3IgZW1wdHkNCi0gICAgICAgIGlmIChpdC5oYXNOZXh0KCkpew0KLSAgICAgICAgICAgIGZhaWwoIkRldGVjdGVkIG1vcmUgdGhlbiAxIGF0dGFjaG1lbnQiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHNiID0gcmVwbHkuZ2V0U09BUEJvZHkoKTsNCi0gICAgICAgIGlmIChzYi5nZXRDaGlsZEVsZW1lbnRzKCkuaGFzTmV4dCgpKSB7DQotICAgICAgICAgICAgZmFpbCgiTWVzc2FnZSBjb250YWlucyBzb2FwOmJvZHkgcGF5bG9hZCIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgYnl0ZXMgPSBhcC5nZXRSYXdDb250ZW50Qnl0ZXMoKTsNCi0gICAgICAgIGlmIChieXRlcy5sZW5ndGggPT0gMCkgeyANCi0gICAgICAgICAgICBmYWlsKCJBdHRhY2htZW50IGlzIGVtcHR5Iik7IA0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy8gdmVyaWZ5IHRoYXQgZW5kcG9pbnQgaGFzIGJlZW4gYWJsZSB0byBtb2RpZnkgdGhlIGF0dGFjaG1lbnQNCi0gICAgICAgIGlmIChieXRlc1swXSAhPSAnUycgfHwgYnl0ZXNbMV0gIT0gJ1cnIHx8IGJ5dGVzWzJdICE9ICdBJykgeyANCi0gICAgICAgICAgICBmYWlsKCJEaWQgbm90IHJlY2VpdmUgYSBtb2RpZmllZCBhdHRhY2htZW50Iik7IA0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogTm93IGludm9rZSB0aGUgbWVzc2FnZSB0aGUgYSByZWNlaXZlcyBhbmQgcmV0dXJucyAyIGF0dGFjaG1lbnRzDQotICAgICAqIA0KLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdFNXQUF0dGFjaG1lbnRzMl9XU0koKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIFN0cmluZyBzb2FwQWN0aW9uID0gInN3YUF0dGFjaG1lbnQyIjsNCi0gICAgICAgIERpc3BhdGNoPFNPQVBNZXNzYWdlPiBkaXNwYXRjaCA9IGdldERpc3BhdGNoKHNvYXBBY3Rpb24pOw0KLQ0KLSAgICAgICAgLy8gT2J0YWluIGEgcHJlY29uZmlndXJlZCBTQUFKIE1lc3NhZ2VGYWN0b3J5DQotICAgICAgICBNZXNzYWdlRmFjdG9yeSBmYWN0b3J5ID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoKTsNCi0gICAgICAgIFNPQVBNZXNzYWdlIHJlcXVlc3QgPSBmYWN0b3J5LmNyZWF0ZU1lc3NhZ2UoKTsNCi0NCi0gICAgICAgIC8vIHNvYXA6Ym9keSBzaG91bGQgYmUgZW1wdHkNCi0gICAgICAgIFNPQVBCb2R5IGJvZHkgPSByZXF1ZXN0LmdldFNPQVBCb2R5KCk7DQotDQotICAgICAgICAvLyBjcmVhdGUgYXR0YWNobWVudHMgMSBhbmQgMg0KLSAgICAgICAgYnl0ZVtdIGJ5dGVzMSA9IG5ldyBieXRlWzFdOw0KLSAgICAgICAgYnl0ZXMxWzBdID0gJzEnOw0KLSAgICAgICAgYnl0ZVtdIGJ5dGVzMiA9IG5ldyBieXRlWzFdOw0KLSAgICAgICAgYnl0ZXMyWzBdID0gJzInOw0KLQ0KLSAgICAgICAgLy8gVGhlIGF0dGFjaG1lbnRzIGFyZSBzZW50IG91dCBvZiBvcmRlci4NCi0gICAgICAgIC8vIFRoZSByZWNlaXZlciBzaG91bGQgYmUgc21hcnQgZW5vdWdoIHRvIHVzZSB0aGUgY29udGVudCBpZA0KLSAgICAgICAgLy8gdG8gZXN0YWJsaXNoIHRoZSBjb3JyZWN0IG9yZGVyDQotICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBiYWlzMiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlczIpOw0KLSAgICAgICAgQXR0YWNobWVudFBhcnQgYXR0YWNobWVudDIgPSByZXF1ZXN0LmNyZWF0ZUF0dGFjaG1lbnRQYXJ0KCk7DQotICAgICAgICBhdHRhY2htZW50Mi5zZXRDb250ZW50SWQoImpwZWdJbWFnZTJSZXF1ZXN0PVNXQU1UT01UZXN0U09BUE1lc3NhZ2UiKTsNCi0gICAgICAgIGF0dGFjaG1lbnQyLmFkZE1pbWVIZWFkZXIoIkZWVC1zb3VyY2UiLCAiU1RSX0JPRFlfRUxFTUVOVF8xIik7DQotICAgICAgICBhdHRhY2htZW50Mi5zZXRSYXdDb250ZW50KGJhaXMyLCAidGV4dC9wbGFpbiIpOw0KLSAgICAgICAgcmVxdWVzdC5hZGRBdHRhY2htZW50UGFydChhdHRhY2htZW50Mik7DQotICAgICAgICANCi0gICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGJhaXMxID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVzMSk7DQotICAgICAgICBBdHRhY2htZW50UGFydCBhdHRhY2htZW50MSA9IHJlcXVlc3QuY3JlYXRlQXR0YWNobWVudFBhcnQoKTsNCi0gICAgICAgIGF0dGFjaG1lbnQxLnNldENvbnRlbnRJZCgianBlZ0ltYWdlMVJlcXVlc3Q9U1dBTVRPTVRlc3RTT0FQTWVzc2FnZSIpOw0KLSAgICAgICAgYXR0YWNobWVudDEuYWRkTWltZUhlYWRlcigiRlZULXNvdXJjZSIsICJTVFJfQk9EWV9FTEVNRU5UXzEiKTsNCi0gICAgICAgIGF0dGFjaG1lbnQxLnNldFJhd0NvbnRlbnQoYmFpczEsICJ0ZXh0L3BsYWluIik7DQotICAgICAgICByZXF1ZXN0LmFkZEF0dGFjaG1lbnRQYXJ0KGF0dGFjaG1lbnQxKTsNCi0NCi0gICAgICAgIC8vIGludm9rZQ0KLSAgICAgICAgU09BUE1lc3NhZ2UgcmVwbHkgPSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7DQotDQotICAgICAgICAvLyBpdGVyYXRlIG92ZXIgdGhlIGF0dGFjaG1lbnRzLCB0aGVyZSBzaG91bGQgb25seSBiZSBvbmUNCi0gICAgICAgIEl0ZXJhdG9yIGl0ID0gcmVwbHkuZ2V0QXR0YWNobWVudHMoKTsNCi0gICAgICAgIEF0dGFjaG1lbnRQYXJ0IGFwMyA9IG51bGw7DQotDQotICAgICAgICAvLyB2ZXJpZnkgdGhhdCB0aGUgYXR0YWNobWVudCBpcyBub3QgbnVsbCBvciBlbXB0eQ0KLSAgICAgICAgaWYgKChhcDMgPSAoQXR0YWNobWVudFBhcnQpIGl0Lm5leHQoKSkgPT0gbnVsbCl7DQotICAgICAgICAgICAgZmFpbCgiQXR0YWNobWVudCBpcyBudWxsIik7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgY29udGVudCBpZCBzdGFydHMgd2l0aCB0aGUgYXBwcm9wcmlhdGUgU1dBIG5hbWUNCi0gICAgICAgIGlmICghYXAzLmdldENvbnRlbnRJZCgpLnN0YXJ0c1dpdGgoImpwZWdJbWFnZTFSZXNwb25zZT0iKSkgew0KLSAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIGNvbnRlbnQgaWQgdG8gc3RhcnQgd2l0aCBqcGVnSW1hZ2UxUmVzcG9uc2UiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgQXR0YWNobWVudFBhcnQgYXA0ID0gbnVsbDsNCi0gICAgICAgIC8vIHZlcmlmeSB0aGF0IHRoZSBzZWNvbmQgYXR0YWNobWVudCBpcyBub3QgbnVsbCBvciBlbXB0eQ0KLSAgICAgICAgaWYgKChhcDQgPSAoQXR0YWNobWVudFBhcnQpIGl0Lm5leHQoKSkgPT0gbnVsbCl7DQotICAgICAgICAgICAgZmFpbCgiQXR0YWNobWVudCBpcyBudWxsIik7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgY29udGVudCBpZCBzdGFydHMgd2l0aCB0aGUgYXBwcm9wcmlhdGUgU1dBIG5hbWUNCi0gICAgICAgIGlmICghYXA0LmdldENvbnRlbnRJZCgpLnN0YXJ0c1dpdGgoImpwZWdJbWFnZTJSZXNwb25zZT0iKSkgew0KLSAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIGNvbnRlbnQgaWQgdG8gc3RhcnQgd2l0aCBqcGVnSW1hZ2UyUmVzcG9uc2UiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChpdC5oYXNOZXh0KCkpew0KLSAgICAgICAgICAgIGZhaWwoIkRldGVjdGVkIG1vcmUgdGhlbiAyIGF0dGFjaG1lbnQiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFNPQVBCb2R5IHNiID0gcmVwbHkuZ2V0U09BUEJvZHkoKTsNCi0gICAgICAgIGlmIChzYi5nZXRDaGlsZEVsZW1lbnRzKCkuaGFzTmV4dCgpKSB7DQotICAgICAgICAgICAgZmFpbCgiTWVzc2FnZSBjb250YWlucyBzb2FwOmJvZHkgcGF5bG9hZCIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgYnl0ZVtdIGJ5dGVzMyA9IGFwMy5nZXRSYXdDb250ZW50Qnl0ZXMoKTsNCi0gICAgICAgIGlmIChieXRlczMubGVuZ3RoID09IDApIHsgDQotICAgICAgICAgICAgZmFpbCgiQXR0YWNobWVudCBpcyBlbXB0eSIpOyANCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChieXRlczNbMF0gIT0gJzMnKSB7IA0KLSAgICAgICAgICAgIGZhaWwoIlRoZSByZXNwb25zZSBhdHRhY2htZW50IGlzIG5vdCBjb3JyZWN0Iik7IA0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICBieXRlW10gYnl0ZXM0ID0gYXA0LmdldFJhd0NvbnRlbnRCeXRlcygpOw0KLSAgICAgICAgaWYgKGJ5dGVzNC5sZW5ndGggPT0gMCkgeyANCi0gICAgICAgICAgICBmYWlsKCJBdHRhY2htZW50IGlzIGVtcHR5Iik7IA0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKGJ5dGVzNFswXSAhPSAnNCcpIHsgDQotICAgICAgICAgICAgZmFpbCgiVGhlIHJlc3BvbnNlIGF0dGFjaG1lbnQgaXMgbm90IGNvcnJlY3QiKTsgDQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIA0KLSAgICAgICAgLy8gSW52b2tlIGEgc2Vjb25kIHRpbWUgdG8gdmVyaWZ5DQotICAgICAgICByZXBseSA9IGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0NCi0gICAgICAgIC8vIGl0ZXJhdGUgb3ZlciB0aGUgYXR0YWNobWVudHMsIHRoZXJlIHNob3VsZCBvbmx5IGJlIG9uZQ0KLSAgICAgICAgaXQgPSByZXBseS5nZXRBdHRhY2htZW50cygpOw0KLSAgICAgICAgYXAzID0gbnVsbDsNCi0NCi0gICAgICAgIC8vIHZlcmlmeSB0aGF0IHRoZSBhdHRhY2htZW50IGlzIG5vdCBudWxsIG9yIGVtcHR5DQotICAgICAgICBpZiAoKGFwMyA9IChBdHRhY2htZW50UGFydCkgaXQubmV4dCgpKSA9PSBudWxsKXsNCi0gICAgICAgICAgICBmYWlsKCJBdHRhY2htZW50IGlzIG51bGwiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBjb250ZW50IGlkIHN0YXJ0cyB3aXRoIHRoZSBhcHByb3ByaWF0ZSBTV0EgbmFtZQ0KLSAgICAgICAgaWYgKCFhcDMuZ2V0Q29udGVudElkKCkuc3RhcnRzV2l0aCgianBlZ0ltYWdlMVJlc3BvbnNlPSIpKSB7DQotICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgY29udGVudCBpZCB0byBzdGFydCB3aXRoIGpwZWdJbWFnZTFSZXNwb25zZSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICBhcDQgPSBudWxsOw0KLSAgICAgICAgLy8gdmVyaWZ5IHRoYXQgdGhlIHNlY29uZCBhdHRhY2htZW50IGlzIG5vdCBudWxsIG9yIGVtcHR5DQotICAgICAgICBpZiAoKGFwNCA9IChBdHRhY2htZW50UGFydCkgaXQubmV4dCgpKSA9PSBudWxsKXsNCi0gICAgICAgICAgICBmYWlsKCJBdHRhY2htZW50IGlzIG51bGwiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBjb250ZW50IGlkIHN0YXJ0cyB3aXRoIHRoZSBhcHByb3ByaWF0ZSBTV0EgbmFtZQ0KLSAgICAgICAgaWYgKCFhcDQuZ2V0Q29udGVudElkKCkuc3RhcnRzV2l0aCgianBlZ0ltYWdlMlJlc3BvbnNlPSIpKSB7DQotICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgY29udGVudCBpZCB0byBzdGFydCB3aXRoIGpwZWdJbWFnZTJSZXNwb25zZSIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKGl0Lmhhc05leHQoKSl7DQotICAgICAgICAgICAgZmFpbCgiRGV0ZWN0ZWQgbW9yZSB0aGVuIDIgYXR0YWNobWVudCIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgc2IgPSByZXBseS5nZXRTT0FQQm9keSgpOw0KLSAgICAgICAgaWYgKHNiLmdldENoaWxkRWxlbWVudHMoKS5oYXNOZXh0KCkpIHsNCi0gICAgICAgICAgICBmYWlsKCJNZXNzYWdlIGNvbnRhaW5zIHNvYXA6Ym9keSBwYXlsb2FkIik7DQotICAgICAgICB9DQotDQotICAgICAgICBieXRlczMgPSBhcDMuZ2V0UmF3Q29udGVudEJ5dGVzKCk7DQotICAgICAgICBpZiAoYnl0ZXMzLmxlbmd0aCA9PSAwKSB7IA0KLSAgICAgICAgICAgIGZhaWwoIkF0dGFjaG1lbnQgaXMgZW1wdHkiKTsgDQotICAgICAgICB9DQotICAgICAgICBpZiAoYnl0ZXMzWzBdICE9ICczJykgeyANCi0gICAgICAgICAgICBmYWlsKCJUaGUgcmVzcG9uc2UgYXR0YWNobWVudCBpcyBub3QgY29ycmVjdCIpOyANCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgYnl0ZXM0ID0gYXA0LmdldFJhd0NvbnRlbnRCeXRlcygpOw0KLSAgICAgICAgaWYgKGJ5dGVzNC5sZW5ndGggPT0gMCkgeyANCi0gICAgICAgICAgICBmYWlsKCJBdHRhY2htZW50IGlzIGVtcHR5Iik7IA0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKGJ5dGVzNFswXSAhPSAnNCcpIHsgDQotICAgICAgICAgICAgZmFpbCgiVGhlIHJlc3BvbnNlIGF0dGFjaG1lbnQgaXMgbm90IGNvcnJlY3QiKTsgDQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBOb3cgaW52b2tlIHRoZSBtZXNzYWdlIHRoZSBhIHJlY2VpdmVzIGFuZCByZXR1cm5zIDIgYXR0YWNobWVudHMsDQotICAgICAqIGJ1dCB0aGUgcmVxdWVzdCBhdHRhY2htZW50cyBkb24ndCBjb21wbHkgd2l0aCB3c2kNCi0gICAgICogDQotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U1dBQXR0YWNobWVudHMyX0xlZ2FjeSgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgU3RyaW5nIHNvYXBBY3Rpb24gPSAic3dhQXR0YWNobWVudDIiOw0KLSAgICAgICAgRGlzcGF0Y2g8U09BUE1lc3NhZ2U+IGRpc3BhdGNoID0gZ2V0RGlzcGF0Y2goc29hcEFjdGlvbik7DQotDQotICAgICAgICAvLyBPYnRhaW4gYSBwcmVjb25maWd1cmVkIFNBQUogTWVzc2FnZUZhY3RvcnkNCi0gICAgICAgIE1lc3NhZ2VGYWN0b3J5IGZhY3RvcnkgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpOw0KLSAgICAgICAgU09BUE1lc3NhZ2UgcmVxdWVzdCA9IGZhY3RvcnkuY3JlYXRlTWVzc2FnZSgpOw0KLQ0KLSAgICAgICAgLy8gc29hcDpib2R5IHNob3VsZCBiZSBlbXB0eQ0KLSAgICAgICAgU09BUEJvZHkgYm9keSA9IHJlcXVlc3QuZ2V0U09BUEJvZHkoKTsNCi0NCi0gICAgICAgIC8vIGNyZWF0ZSBhdHRhY2htZW50cyAxIGFuZCAyDQotICAgICAgICBieXRlW10gYnl0ZXMxID0gbmV3IGJ5dGVbMV07DQotICAgICAgICBieXRlczFbMF0gPSAnMSc7DQotICAgICAgICBieXRlW10gYnl0ZXMyID0gbmV3IGJ5dGVbMV07DQotICAgICAgICBieXRlczJbMF0gPSAnMic7DQotDQotICAgICAgICANCi0gICAgICAgIA0KLSAgICAgICAgDQotICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBiYWlzMSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlczEpOw0KLSAgICAgICAgQXR0YWNobWVudFBhcnQgYXR0YWNobWVudDEgPSByZXF1ZXN0LmNyZWF0ZUF0dGFjaG1lbnRQYXJ0KCk7DQotICAgICAgICBhdHRhY2htZW50MS5zZXRDb250ZW50SWQoIm5vdENvbXBsaWFudDFTV0FNVE9NVGVzdFNPQVBNZXNzYWdlIik7DQotICAgICAgICBhdHRhY2htZW50MS5hZGRNaW1lSGVhZGVyKCJGVlQtc291cmNlIiwgIlNUUl9CT0RZX0VMRU1FTlRfMSIpOw0KLSAgICAgICAgYXR0YWNobWVudDEuc2V0UmF3Q29udGVudChiYWlzMSwgInRleHQvcGxhaW4iKTsNCi0gICAgICAgIHJlcXVlc3QuYWRkQXR0YWNobWVudFBhcnQoYXR0YWNobWVudDEpOw0KLSAgICAgICAgDQotICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBiYWlzMiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlczIpOw0KLSAgICAgICAgQXR0YWNobWVudFBhcnQgYXR0YWNobWVudDIgPSByZXF1ZXN0LmNyZWF0ZUF0dGFjaG1lbnRQYXJ0KCk7DQotICAgICAgICBhdHRhY2htZW50Mi5zZXRDb250ZW50SWQoIm5vdENvbXBsaWFudDJTV0FNVE9NVGVzdFNPQVBNZXNzYWdlIik7DQotICAgICAgICBhdHRhY2htZW50Mi5hZGRNaW1lSGVhZGVyKCJGVlQtc291cmNlIiwgIlNUUl9CT0RZX0VMRU1FTlRfMSIpOw0KLSAgICAgICAgYXR0YWNobWVudDIuc2V0UmF3Q29udGVudChiYWlzMiwgInRleHQvcGxhaW4iKTsNCi0gICAgICAgIHJlcXVlc3QuYWRkQXR0YWNobWVudFBhcnQoYXR0YWNobWVudDIpOw0KLQ0KLSAgICAgICAgLy8gaW52b2tlDQotICAgICAgICBTT0FQTWVzc2FnZSByZXBseSA9IGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0NCi0gICAgICAgIC8vIGl0ZXJhdGUgb3ZlciB0aGUgYXR0YWNobWVudHMsIHRoZXJlIHNob3VsZCBvbmx5IGJlIG9uZQ0KLSAgICAgICAgSXRlcmF0b3IgaXQgPSByZXBseS5nZXRBdHRhY2htZW50cygpOw0KLSAgICAgICAgQXR0YWNobWVudFBhcnQgYXAzID0gbnVsbDsNCi0NCi0gICAgICAgIC8vIHZlcmlmeSB0aGF0IHRoZSBhdHRhY2htZW50IGlzIG5vdCBudWxsIG9yIGVtcHR5DQotICAgICAgICBpZiAoKGFwMyA9IChBdHRhY2htZW50UGFydCkgaXQubmV4dCgpKSA9PSBudWxsKXsNCi0gICAgICAgICAgICBmYWlsKCJBdHRhY2htZW50IGlzIG51bGwiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBjb250ZW50IGlkIHN0YXJ0cyB3aXRoIHRoZSBhcHByb3ByaWF0ZSBTV0EgbmFtZQ0KLSAgICAgICAgaWYgKCFhcDMuZ2V0Q29udGVudElkKCkuc3RhcnRzV2l0aCgianBlZ0ltYWdlMVJlc3BvbnNlPSIpKSB7DQotICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgY29udGVudCBpZCB0byBzdGFydCB3aXRoIGpwZWdJbWFnZTFSZXNwb25zZSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICBBdHRhY2htZW50UGFydCBhcDQgPSBudWxsOw0KLSAgICAgICAgLy8gdmVyaWZ5IHRoYXQgdGhlIHNlY29uZCBhdHRhY2htZW50IGlzIG5vdCBudWxsIG9yIGVtcHR5DQotICAgICAgICBpZiAoKGFwNCA9IChBdHRhY2htZW50UGFydCkgaXQubmV4dCgpKSA9PSBudWxsKXsNCi0gICAgICAgICAgICBmYWlsKCJBdHRhY2htZW50IGlzIG51bGwiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBjb250ZW50IGlkIHN0YXJ0cyB3aXRoIHRoZSBhcHByb3ByaWF0ZSBTV0EgbmFtZQ0KLSAgICAgICAgaWYgKCFhcDQuZ2V0Q29udGVudElkKCkuc3RhcnRzV2l0aCgianBlZ0ltYWdlMlJlc3BvbnNlPSIpKSB7DQotICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgY29udGVudCBpZCB0byBzdGFydCB3aXRoIGpwZWdJbWFnZTJSZXNwb25zZSIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKGl0Lmhhc05leHQoKSl7DQotICAgICAgICAgICAgZmFpbCgiRGV0ZWN0ZWQgbW9yZSB0aGVuIDIgYXR0YWNobWVudCIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgU09BUEJvZHkgc2IgPSByZXBseS5nZXRTT0FQQm9keSgpOw0KLSAgICAgICAgaWYgKHNiLmdldENoaWxkRWxlbWVudHMoKS5oYXNOZXh0KCkpIHsNCi0gICAgICAgICAgICBmYWlsKCJNZXNzYWdlIGNvbnRhaW5zIHNvYXA6Ym9keSBwYXlsb2FkIik7DQotICAgICAgICB9DQotDQotICAgICAgICBieXRlW10gYnl0ZXMzID0gYXAzLmdldFJhd0NvbnRlbnRCeXRlcygpOw0KLSAgICAgICAgaWYgKGJ5dGVzMy5sZW5ndGggPT0gMCkgeyANCi0gICAgICAgICAgICBmYWlsKCJBdHRhY2htZW50IGlzIGVtcHR5Iik7IA0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKGJ5dGVzM1swXSAhPSAnMycpIHsgDQotICAgICAgICAgICAgZmFpbCgiVGhlIHJlc3BvbnNlIGF0dGFjaG1lbnQgaXMgbm90IGNvcnJlY3QiKTsgDQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIGJ5dGVbXSBieXRlczQgPSBhcDQuZ2V0UmF3Q29udGVudEJ5dGVzKCk7DQotICAgICAgICBpZiAoYnl0ZXM0Lmxlbmd0aCA9PSAwKSB7IA0KLSAgICAgICAgICAgIGZhaWwoIkF0dGFjaG1lbnQgaXMgZW1wdHkiKTsgDQotICAgICAgICB9DQotICAgICAgICBpZiAoYnl0ZXM0WzBdICE9ICc0JykgeyANCi0gICAgICAgICAgICBmYWlsKCJUaGUgcmVzcG9uc2UgYXR0YWNobWVudCBpcyBub3QgY29ycmVjdCIpOyANCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgLy8gSW52b2tlIGEgc2Vjb25kIHRpbWUgdG8gdmVyaWZ5DQotICAgICAgICANCi0gICAgICAgIC8vIGludm9rZQ0KLSAgICAgICAgcmVwbHkgPSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7DQotDQotICAgICAgICAvLyBpdGVyYXRlIG92ZXIgdGhlIGF0dGFjaG1lbnRzLCB0aGVyZSBzaG91bGQgb25seSBiZSBvbmUNCi0gICAgICAgIGl0ID0gcmVwbHkuZ2V0QXR0YWNobWVudHMoKTsNCi0gICAgICAgIGFwMyA9IG51bGw7DQotDQotICAgICAgICAvLyB2ZXJpZnkgdGhhdCB0aGUgYXR0YWNobWVudCBpcyBub3QgbnVsbCBvciBlbXB0eQ0KLSAgICAgICAgaWYgKChhcDMgPSAoQXR0YWNobWVudFBhcnQpIGl0Lm5leHQoKSkgPT0gbnVsbCl7DQotICAgICAgICAgICAgZmFpbCgiQXR0YWNobWVudCBpcyBudWxsIik7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgY29udGVudCBpZCBzdGFydHMgd2l0aCB0aGUgYXBwcm9wcmlhdGUgU1dBIG5hbWUNCi0gICAgICAgIGlmICghYXAzLmdldENvbnRlbnRJZCgpLnN0YXJ0c1dpdGgoImpwZWdJbWFnZTFSZXNwb25zZT0iKSkgew0KLSAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIGNvbnRlbnQgaWQgdG8gc3RhcnQgd2l0aCBqcGVnSW1hZ2UxUmVzcG9uc2UiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgYXA0ID0gbnVsbDsNCi0gICAgICAgIC8vIHZlcmlmeSB0aGF0IHRoZSBzZWNvbmQgYXR0YWNobWVudCBpcyBub3QgbnVsbCBvciBlbXB0eQ0KLSAgICAgICAgaWYgKChhcDQgPSAoQXR0YWNobWVudFBhcnQpIGl0Lm5leHQoKSkgPT0gbnVsbCl7DQotICAgICAgICAgICAgZmFpbCgiQXR0YWNobWVudCBpcyBudWxsIik7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgY29udGVudCBpZCBzdGFydHMgd2l0aCB0aGUgYXBwcm9wcmlhdGUgU1dBIG5hbWUNCi0gICAgICAgIGlmICghYXA0LmdldENvbnRlbnRJZCgpLnN0YXJ0c1dpdGgoImpwZWdJbWFnZTJSZXNwb25zZT0iKSkgew0KLSAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIGNvbnRlbnQgaWQgdG8gc3RhcnQgd2l0aCBqcGVnSW1hZ2UyUmVzcG9uc2UiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChpdC5oYXNOZXh0KCkpew0KLSAgICAgICAgICAgIGZhaWwoIkRldGVjdGVkIG1vcmUgdGhlbiAyIGF0dGFjaG1lbnQiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHNiID0gcmVwbHkuZ2V0U09BUEJvZHkoKTsNCi0gICAgICAgIGlmIChzYi5nZXRDaGlsZEVsZW1lbnRzKCkuaGFzTmV4dCgpKSB7DQotICAgICAgICAgICAgZmFpbCgiTWVzc2FnZSBjb250YWlucyBzb2FwOmJvZHkgcGF5bG9hZCIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgYnl0ZXMzID0gYXAzLmdldFJhd0NvbnRlbnRCeXRlcygpOw0KLSAgICAgICAgaWYgKGJ5dGVzMy5sZW5ndGggPT0gMCkgeyANCi0gICAgICAgICAgICBmYWlsKCJBdHRhY2htZW50IGlzIGVtcHR5Iik7IA0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKGJ5dGVzM1swXSAhPSAnMycpIHsgDQotICAgICAgICAgICAgZmFpbCgiVGhlIHJlc3BvbnNlIGF0dGFjaG1lbnQgaXMgbm90IGNvcnJlY3QiKTsgDQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIGJ5dGVzNCA9IGFwNC5nZXRSYXdDb250ZW50Qnl0ZXMoKTsNCi0gICAgICAgIGlmIChieXRlczQubGVuZ3RoID09IDApIHsgDQotICAgICAgICAgICAgZmFpbCgiQXR0YWNobWVudCBpcyBlbXB0eSIpOyANCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChieXRlczRbMF0gIT0gJzQnKSB7IA0KLSAgICAgICAgICAgIGZhaWwoIlRoZSByZXNwb25zZSBhdHRhY2htZW50IGlzIG5vdCBjb3JyZWN0Iik7IA0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIC8vIFRPRE86ICBBZGQgc2ltaWxhciBjb2RlIHRvIGludm9rZSB0aGUgbXRvbSBlbmFibGVkIG9wZXJhdGlvbg0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc3dhbXRvbS9zZXJ2ZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc3dhbXRvbS9zZXJ2ZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmNGI1NjguLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3N3YW10b20vc2VydmVyL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wDQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3N3YW10b20vc2VydmVyL01FVEEtSU5GL3N3YW10b21zZXJ2aWNlLndzZGwgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc3dhbXRvbS9zZXJ2ZXIvTUVUQS1JTkYvc3dhbXRvbXNlcnZpY2Uud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTYwNjFlNi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc3dhbXRvbS9zZXJ2ZXIvTUVUQS1JTkYvc3dhbXRvbXNlcnZpY2Uud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDE3OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLTx3c2RsOmRlZmluaXRpb25zDQotCXRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3N3YW10b21zZXJ2aWNlLnRlc3Qub3JnIg0KLQl4bWxucz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iDQotCXhtbG5zOm1pbWU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvbWltZS8iDQotCXhtbG5zOnRucz0iaHR0cDovL3N3YW10b21zZXJ2aWNlLnRlc3Qub3JnIg0KLQl4bWxuczp0eXBlbnM9Imh0dHA6Ly9zd2FtdG9tc2VydmljZS50eXBlcy50ZXN0Lm9yZyINCi0JeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iDQotCXhtbG5zOndzZGxzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIg0KLQl4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4NCi0JIDx3c2RsOnR5cGVzPg0KLQkJPHhzZDpzY2hlbWENCi0JCSAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIg0KLQkJICB4bWxuczp0bnM9Imh0dHA6Ly9zd2FtdG9tc2VydmljZS50eXBlcy50ZXN0Lm9yZyINCi0JCSAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vc3dhbXRvbXNlcnZpY2UudHlwZXMudGVzdC5vcmciPg0KLQ0KLQkJPGVsZW1lbnQgbmFtZT0ibXRvbUF0dGFjaG1lbnQiID4NCi0JCQk8Y29tcGxleFR5cGU+DQotCQkJCTxzZXF1ZW5jZT4NCi0JCQkJCTxlbGVtZW50IG5hbWU9Im1lc3NhZ2UiIHR5cGU9InhzZDpiYXNlNjRCaW5hcnkiIC8+DQotCQkJCTwvc2VxdWVuY2U+DQotCQkJPC9jb21wbGV4VHlwZT4NCi0JCTwvZWxlbWVudD4NCi0NCi0JCTxlbGVtZW50IG5hbWU9Im10b21BdHRhY2htZW50UmVzcG9uc2UiID4NCi0JCQk8Y29tcGxleFR5cGU+DQotCQkJCTxzZXF1ZW5jZT4NCi0JCQkJCTxlbGVtZW50IG5hbWU9Im1lc3NhZ2UiIHR5cGU9InhzZDpiYXNlNjRCaW5hcnkiIC8+DQotCQkJCTwvc2VxdWVuY2U+DQotCQkJPC9jb21wbGV4VHlwZT4NCi0JCTwvZWxlbWVudD4NCi0JCTwveHNkOnNjaGVtYT4NCi0JPC93c2RsOnR5cGVzPg0KLQ0KLQ0KLSAgPCEtLSBhdHRhY2htZW50Li4ubm90ZSBubyBib2R5IHBhcnQgLS0+DQotICA8d3NkbDptZXNzYWdlIG5hbWU9InN3YUF0dGFjaG1lbnRSZXF1ZXN0Ij4NCi0gICAgPHBhcnQgbmFtZT0ianBlZ0ltYWdlUmVxdWVzdCIgdHlwZT0ieHNkOmhleEJpbmFyeSIvPg0KLSAgPC93c2RsOm1lc3NhZ2U+DQotICA8d3NkbDptZXNzYWdlIG5hbWU9InN3YUF0dGFjaG1lbnRSZXNwb25zZSI+DQotICAgIDxwYXJ0IG5hbWU9ImpwZWdJbWFnZVJlc3BvbnNlIiB0eXBlPSJ4c2Q6aGV4QmluYXJ5Ii8+DQotICA8L3dzZGw6bWVzc2FnZT4NCi0NCi0gIA0KLSAgPCEtLSB0d28gYXR0YWNobWVudHMuLi5hbmQgbm8gYm9keSBwYXJ0IC0tPg0KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJzd2FBdHRhY2htZW50MlJlcXVlc3QiPg0KLSAgICA8cGFydCBuYW1lPSJqcGVnSW1hZ2UxUmVxdWVzdCIgdHlwZT0ieHNkOmhleEJpbmFyeSIvPg0KLSAgICA8cGFydCBuYW1lPSJqcGVnSW1hZ2UyUmVxdWVzdCIgdHlwZT0ieHNkOmhleEJpbmFyeSIvPg0KLSAgPC93c2RsOm1lc3NhZ2U+DQotICA8d3NkbDptZXNzYWdlIG5hbWU9InN3YUF0dGFjaG1lbnQyUmVzcG9uc2UiPg0KLSAgICA8cGFydCBuYW1lPSJqcGVnSW1hZ2UxUmVzcG9uc2UiIHR5cGU9InhzZDpoZXhCaW5hcnkiLz4NCi0gICAgPHBhcnQgbmFtZT0ianBlZ0ltYWdlMlJlc3BvbnNlIiB0eXBlPSJ4c2Q6aGV4QmluYXJ5Ii8+DQotICA8L3dzZGw6bWVzc2FnZT4NCi0gIA0KLQ0KLSAgIDwhLS0gbXRvbSAtLT4NCi0NCi0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0ibXRvbUF0dGFjaG1lbnRSZXF1ZXN0Ij4NCi0gICAgPHBhcnQgbmFtZT0ibXRvbV9pbiIgZWxlbWVudD0idHlwZW5zOm10b20iLz4NCi0gIDwvd3NkbDptZXNzYWdlPg0KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJtdG9tQXR0YWNobWVudFJlc3BvbnNlIj4NCi0gICAgPHBhcnQgbmFtZT0ibXRvbV9vdXQiIGVsZW1lbnQ9InR5cGVuczptdG9tUmVzcG9uc2UiLz4NCi0gIDwvd3NkbDptZXNzYWdlPg0KLQ0KLSAgIDx3c2RsOnBvcnRUeXBlIG5hbWU9IlNXQU1UT01Qb3J0VHlwZSI+DQotICAgICAgDQotICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InN3YUF0dGFjaG1lbnQiPg0KLSAgICAgICAgIDx3c2RsOmlucHV0IG1lc3NhZ2U9InRuczpzd2FBdHRhY2htZW50UmVxdWVzdCIgLz4NCi0gICAgICAgICA8d3NkbDpvdXRwdXQgbWVzc2FnZT0idG5zOnN3YUF0dGFjaG1lbnRSZXNwb25zZSIgLz4NCi0gICAgICA8L3dzZGw6b3BlcmF0aW9uPg0KLSAgICAgIA0KLSAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJzd2FBdHRhY2htZW50MiI+DQotICAgICAgICAgPHdzZGw6aW5wdXQgbWVzc2FnZT0idG5zOnN3YUF0dGFjaG1lbnQyUmVxdWVzdCIgLz4NCi0gICAgICAgICA8d3NkbDpvdXRwdXQgbWVzc2FnZT0idG5zOnN3YUF0dGFjaG1lbnQyUmVzcG9uc2UiIC8+DQotICAgICAgPC93c2RsOm9wZXJhdGlvbj4NCi0gICAgICANCi0gICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0ibXRvbUF0dGFjaG1lbnQiPg0KLSAgICAgICAgIDx3c2RsOmlucHV0IG1lc3NhZ2U9InRuczptdG9tQXR0YWNobWVudFJlcXVlc3QiIC8+DQotDQotICAgICAgICAgPHdzZGw6b3V0cHV0IG1lc3NhZ2U9InRuczptdG9tQXR0YWNobWVudFJlc3BvbnNlIiAvPg0KLQ0KLSAgICAgIDwvd3NkbDpvcGVyYXRpb24+DQotICAgPC93c2RsOnBvcnRUeXBlPg0KLQ0KLSAgIDx3c2RsOmJpbmRpbmcgbmFtZT0iU1dBTVRPTUJpbmRpbmciIHR5cGU9InRuczpTV0FNVE9NUG9ydFR5cGUiPg0KLSAgICAgIDx3c2Rsc29hcDpiaW5kaW5nIHN0eWxlPSJkb2N1bWVudCIgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiLz4NCi0gICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0ic3dhQXR0YWNobWVudCI+DQotICAgICAgICA8d3NkbHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249InN3YUF0dGFjaG1lbnQiLz4NCi0gICAgICAgIDx3c2RsOmlucHV0ID4NCi0gICAgICAgICAgPG1pbWU6bXVsdGlwYXJ0UmVsYXRlZD4NCi0gICAgICAgICAgICA8bWltZTpwYXJ0Pg0KLSAgICAgICAgICAgICAgPHdzZGxzb2FwOmJvZHkgcGFydHM9IiIgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgICAgICAgPC9taW1lOnBhcnQ+DQotDQotICAgICAgICAgICAgPG1pbWU6cGFydD4NCi0gICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgcGFydD0ianBlZ0ltYWdlUmVxdWVzdCIgdHlwZT0idGV4dC9wbGFpbiIvPg0KLSAgICAgICAgICAgIDwvbWltZTpwYXJ0Pg0KLSAgICAgICAgICA8L21pbWU6bXVsdGlwYXJ0UmVsYXRlZD4NCi0gICAgICAgIDwvd3NkbDppbnB1dD4NCi0gICAgICAgIDx3c2RsOm91dHB1dCA+DQotICAgICAgICAgIDxtaW1lOm11bHRpcGFydFJlbGF0ZWQ+DQotICAgICAgICAgICAgPG1pbWU6cGFydD4NCi0gICAgICAgICAgICAgIDx3c2Rsc29hcDpib2R5IHBhcnRzPSIiIHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgICAgICAgIDwvbWltZTpwYXJ0Pg0KLSAgICAgICAgICAgIDxtaW1lOnBhcnQ+DQotICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHBhcnQ9ImpwZWdJbWFnZVJlc3BvbnNlIiB0eXBlPSJ0ZXh0L3BsYWluIi8+DQotICAgICAgICAgICAgPC9taW1lOnBhcnQ+DQotICAgICAgICAgIDwvbWltZTptdWx0aXBhcnRSZWxhdGVkPg0KLSAgICAgICAgPC93c2RsOm91dHB1dD4NCi0gICAgICA8L3dzZGw6b3BlcmF0aW9uPg0KLSAgICAgIA0KLSAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJzd2FBdHRhY2htZW50MiI+DQotICAgICAgICA8d3NkbHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249InN3YUF0dGFjaG1lbnQyIi8+DQotICAgICAgICA8d3NkbDppbnB1dCA+DQotICAgICAgICAgIDxtaW1lOm11bHRpcGFydFJlbGF0ZWQ+DQotICAgICAgICAgICAgPG1pbWU6cGFydD4NCi0gICAgICAgICAgICAgIDx3c2Rsc29hcDpib2R5IHBhcnRzPSIiIHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgICAgICAgIDwvbWltZTpwYXJ0Pg0KLQ0KLSAgICAgICAgICAgIDxtaW1lOnBhcnQ+DQotICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHBhcnQ9ImpwZWdJbWFnZTFSZXF1ZXN0IiB0eXBlPSJ0ZXh0L3BsYWluIi8+DQotICAgICAgICAgICAgPC9taW1lOnBhcnQ+DQotICAgICAgICAgICAgPG1pbWU6cGFydD4NCi0gICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgcGFydD0ianBlZ0ltYWdlMlJlcXVlc3QiIHR5cGU9InRleHQvcGxhaW4iLz4NCi0gICAgICAgICAgICA8L21pbWU6cGFydD4NCi0gICAgICAgICAgPC9taW1lOm11bHRpcGFydFJlbGF0ZWQ+DQotICAgICAgICA8L3dzZGw6aW5wdXQ+DQotICAgICAgICA8d3NkbDpvdXRwdXQgPg0KLSAgICAgICAgICA8bWltZTptdWx0aXBhcnRSZWxhdGVkPg0KLSAgICAgICAgICAgIDxtaW1lOnBhcnQ+DQotICAgICAgICAgICAgICA8d3NkbHNvYXA6Ym9keSBwYXJ0cz0iIiB1c2U9ImxpdGVyYWwiLz4NCi0gICAgICAgICAgICA8L21pbWU6cGFydD4NCi0gICAgICAgICAgICA8bWltZTpwYXJ0Pg0KLSAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCBwYXJ0PSJqcGVnSW1hZ2UxUmVzcG9uc2UiIHR5cGU9InRleHQvcGxhaW4iLz4NCi0gICAgICAgICAgICA8L21pbWU6cGFydD4NCi0gICAgICAgICAgICA8bWltZTpwYXJ0Pg0KLSAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCBwYXJ0PSJqcGVnSW1hZ2UyUmVzcG9uc2UiIHR5cGU9InRleHQvcGxhaW4iLz4NCi0gICAgICAgICAgICA8L21pbWU6cGFydD4NCi0gICAgICAgICAgPC9taW1lOm11bHRpcGFydFJlbGF0ZWQ+DQotICAgICAgICA8L3dzZGw6b3V0cHV0Pg0KLSAgICAgIDwvd3NkbDpvcGVyYXRpb24+DQotDQotICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9Im10b21BdHRhY2htZW50Ij4NCi0gICAgICAgICA8d3NkbHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Im10b21BdHRhY2htZW50Ii8+DQotICAgICAgICAgPHdzZGw6aW5wdXQ+DQotICAgICAgICAgICAgPHdzZGxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgICAgPC93c2RsOmlucHV0Pg0KLSAgICAgICAgIDx3c2RsOm91dHB1dCA+DQotICAgICAgICAgICAgPHdzZGxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgICAgPC93c2RsOm91dHB1dD4NCi0gICAgICA8L3dzZGw6b3BlcmF0aW9uPg0KLSAgIDwvd3NkbDpiaW5kaW5nPg0KLQ0KLSAgIDx3c2RsOnNlcnZpY2UgbmFtZT0iU1dBTVRPTVNlcnZpY2UiPg0KLSAgICAgPHdzZGw6cG9ydCBuYW1lPSJTV0FNVE9NUG9ydFR5cGVQb3J0IiBiaW5kaW5nPSJ0bnM6U1dBTVRPTUJpbmRpbmciPg0KLSAgICAgICAgPHdzZGxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9ASE9TVEA6QFBPUlRAL2pheHdzLnN3YW10b20vc2VydmljZXMvU1dBTVRPTVNlcnZpY2UiIC8+DQotICAgICA8L3dzZGw6cG9ydD4NCi0gICA8L3dzZGw6c2VydmljZT4NCi0gICAgICAgICAgDQotPC93c2RsOmRlZmluaXRpb25zPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zd2FtdG9tL3NlcnZlci9TV0FNVE9NUG9ydFR5cGVJbXBsLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc3dhbXRvbS9zZXJ2ZXIvU1dBTVRPTVBvcnRUeXBlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2ZhZDc0Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zd2FtdG9tL3NlcnZlci9TV0FNVE9NUG9ydFR5cGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zd2FtdG9tLnNlcnZlcjsNCi0NCi1pbXBvcnQgamF2YXguandzLldlYk1ldGhvZDsNCi1pbXBvcnQgamF2YXguandzLldlYlBhcmFtOw0KLWltcG9ydCBqYXZheC5qd3MuV2ViUmVzdWx0Ow0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5hZGFwdGVycy5IZXhCaW5hcnlBZGFwdGVyOw0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLmFkYXB0ZXJzLlhtbEphdmFUeXBlQWRhcHRlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLkJpbmRpbmdUeXBlOw0KLWltcG9ydCBqYXZheC54bWwud3MuSG9sZGVyOw0KLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW0uTW9kZTsNCi1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmc7DQotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlBhcmFtZXRlclN0eWxlOw0KLQ0KLS8qKg0KLSAqIEVuZHBvbnQgdGhhdCBpcyBhIFNPQVAgMS4xIE1UT00gQmluZGluZyANCi0gKiBidXQgaGFzIGFuIG9wZXJhdGlvbiAoc3dhQXR0YWNobWVudCkgdGhhdCBwYXNzZXMNCi0gKiBTV0EgYXR0YWNobWVudHMNCi0gKg0KLSAqLw0KLUBXZWJTZXJ2aWNlKG5hbWU9IlNXQU1UT01Qb3J0VHlwZSIsDQotICAgICAgICAgICAgc2VydmljZU5hbWU9IlNXQU1UT01TZXJ2aWNlIiwgDQotICAgICAgICAgICAgd3NkbExvY2F0aW9uPSJNRVRBLUlORi9zd2FtdG9tc2VydmljZS53c2RsIiwgDQotICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vc3dhbXRvbXNlcnZpY2UudGVzdC5vcmciKQ0KLUBCaW5kaW5nVHlwZShqYXZheC54bWwud3Muc29hcC5TT0FQQmluZGluZy5TT0FQMTFIVFRQX01UT01fQklORElORykNCi1wdWJsaWMgY2xhc3MgU1dBTVRPTVBvcnRUeXBlSW1wbCB7DQotDQotICAgIC8qKg0KLSAgICAgKiBUaGlzIG1ldGhvZCBwYXNzZXMgYW4gU1dBIGF0dGFjaG1lbnQgYXMgYSByZXF1ZXN0DQotICAgICAqIGFuZCBleHBlY3RzIGFuIFNXQSBhdHRhY2htZW50IGFzIGEgcmVzcG9uc2UuDQotICAgICAqIE5vdGUgdGhhdCB0aGUgYm9keSBjb250ZW50IGluIGJvdGggY2FzZXMgaXMgZW1wdHkuDQotICAgICAqIChTZWUgdGhlIHdzZGwpDQotICAgICAqIEBwYXJhbSBhdHRhY2htZW50IChzd2EpDQotICAgICAqIEByZXR1cm4gYXR0YWNobWVudCAoc3dhKQ0KLSAgICAgKi8NCi0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lPSJzd2FBdHRhY2htZW50IiwgYWN0aW9uPSJzd2FBdHRhY2htZW50IikNCi0gICAgQFhtbEphdmFUeXBlQWRhcHRlcihIZXhCaW5hcnlBZGFwdGVyLmNsYXNzKQ0KLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAianBlZ0ltYWdlUmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiIiwgcGFydE5hbWUgPSAianBlZ0ltYWdlUmVzcG9uc2UiKQ0KLSAgICBAU09BUEJpbmRpbmcocGFyYW1ldGVyU3R5bGUgPSBTT0FQQmluZGluZy5QYXJhbWV0ZXJTdHlsZS5CQVJFKQ0KLSAgICBwdWJsaWMgYnl0ZVtdIHN3YUF0dGFjaG1lbnQoDQotICAgICAgICAgIEBYbWxKYXZhVHlwZUFkYXB0ZXIoSGV4QmluYXJ5QWRhcHRlci5jbGFzcykNCi0gICAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAianBlZ0ltYWdlUmVxdWVzdCIsIHRhcmdldE5hbWVzcGFjZSA9ICIiLCBwYXJ0TmFtZSA9ICJqcGVnSW1hZ2VSZXF1ZXN0IikNCi0gICAgICAgICAgYnl0ZVtdIGF0dGFjaG1lbnQpIHsNCi0gICAgICAgIGlmIChhdHRhY2htZW50ID09IG51bGwgfHwgYXR0YWNobWVudC5sZW5ndGggPT0gMCl7DQotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlJlY2VpdmVkIGVtcHR5IGF0dGFjaG1lbnQiKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgLy8gQ2hhbmdlIHRoZSBmaXJzdCB0aHJlZSBjaGFyYWN0ZXJzIGFuZCByZXR1cm4gdGhlIGF0dGFjaG1lbnQNCi0gICAgICAgICAgICBhdHRhY2htZW50WzBdID0gJ1MnOw0KLSAgICAgICAgICAgIGF0dGFjaG1lbnRbMV0gPSAnVyc7DQotICAgICAgICAgICAgYXR0YWNobWVudFsyXSA9ICdBJzsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBhdHRhY2htZW50Ow0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogVGhpcyBtZXRob2QgcGFzc2VzIHR3byBTV0EgYXR0YWNobWVudHMgYXMgYSByZXF1ZXN0DQotICAgICAqIGFuZCBleHBlY3RzIHR3byBTV0EgYXR0YWNobWVudHMgYXMgYSByZXNwb25zZS4NCi0gICAgICogTm90ZSB0aGF0IHRoZSBib2R5IGNvbnRlbnQgaW4gYm90aCBjYXNlcyBpcyBlbXB0eS4NCi0gICAgICogKFNlZSB0aGUgd3NkbCkNCi0gICAgICogQHBhcmFtIGF0dGFjaG1lbnQgKHN3YSkNCi0gICAgICogQHJldHVybiBhdHRhY2htZW50IChzd2EpDQotICAgICAqLw0KLSAgICBAV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWU9InN3YUF0dGFjaG1lbnQyIiwgYWN0aW9uPSJzd2FBdHRhY2htZW50MiIpDQotICAgIEBTT0FQQmluZGluZyhwYXJhbWV0ZXJTdHlsZSA9IFNPQVBCaW5kaW5nLlBhcmFtZXRlclN0eWxlLkJBUkUpDQotICAgIHB1YmxpYyB2b2lkIHN3YUF0dGFjaG1lbnQyKA0KLSAgICAgICAgICBAWG1sSmF2YVR5cGVBZGFwdGVyKEhleEJpbmFyeUFkYXB0ZXIuY2xhc3MpDQotICAgICAgICAgIEBXZWJQYXJhbShuYW1lID0gImpwZWdJbWFnZTFSZXF1ZXN0IiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIsIHBhcnROYW1lID0gImpwZWdJbWFnZTFSZXF1ZXN0IikNCi0gICAgICAgICAgYnl0ZVtdIGF0dGFjaG1lbnQsDQotICAgICAgICAgIA0KLSAgICAgICAgICBAWG1sSmF2YVR5cGVBZGFwdGVyKEhleEJpbmFyeUFkYXB0ZXIuY2xhc3MpDQotICAgICAgICAgIEBXZWJQYXJhbShuYW1lID0gImpwZWdJbWFnZTJSZXF1ZXN0IiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIsIHBhcnROYW1lID0gImpwZWdJbWFnZTJSZXF1ZXN0IikNCi0gICAgICAgICAgYnl0ZVtdIGF0dGFjaG1lbnQyLA0KLSAgICAgICAgICANCi0gICAgICAgICAgQFhtbEphdmFUeXBlQWRhcHRlcihIZXhCaW5hcnlBZGFwdGVyLmNsYXNzKQ0KLSAgICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJqcGVnSW1hZ2UxUmVzcG9uc2UiLCANCi0gICAgICAgICAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZSA9ICIiLCANCi0gICAgICAgICAgICAgICAgICAgIHBhcnROYW1lID0gImpwZWdJbWFnZTFSZXNwb25zZSIsDQotICAgICAgICAgICAgICAgICAgICBtb2RlPSBNb2RlLk9VVCkNCi0gICAgICAgICAgSG9sZGVyPGJ5dGVbXT4gYXR0YWNobWVudE91dDEsDQotICAgICAgICAgIA0KLSAgICAgICAgICBAWG1sSmF2YVR5cGVBZGFwdGVyKEhleEJpbmFyeUFkYXB0ZXIuY2xhc3MpDQotICAgICAgICAgIEBXZWJQYXJhbShuYW1lID0gImpwZWdJbWFnZTJSZXNwb25zZSIsIA0KLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlID0gIiIsIA0KLSAgICAgICAgICAgICAgICAgICAgcGFydE5hbWUgPSAianBlZ0ltYWdlMlJlc3BvbnNlIiwNCi0gICAgICAgICAgICAgICAgICAgIG1vZGU9IE1vZGUuT1VUKQ0KLSAgICAgICAgICBIb2xkZXI8Ynl0ZVtdPiBhdHRhY2htZW50T3V0Mikgew0KLSAgICAgICAgICANCi0gICAgICAgIGlmIChhdHRhY2htZW50ID09IG51bGwgfHwgYXR0YWNobWVudC5sZW5ndGggPT0gMCl7DQotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlJlY2VpdmVkIGVtcHR5IGZpcnN0IGF0dGFjaG1lbnQiKTsNCi0gICAgICAgIH0gZWxzZSBpZiAoYXR0YWNobWVudDIgPT0gbnVsbCB8fCBhdHRhY2htZW50Mi5sZW5ndGggPT0gMCl7DQotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlJlY2VpdmVkIGVtcHR5IHNlY29uZCBhdHRhY2htZW50Iik7DQotICAgICAgICB9IGVsc2UgaWYgKGF0dGFjaG1lbnRbMF0gIT0gJzEnKSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkZpcnN0IGF0dGFjaG1lbnQgaXMgbm90ICcxJyIpOw0KLSAgICAgICAgfSBlbHNlIGlmIChhdHRhY2htZW50MlswXSAhPSAnMicpIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiU2Vjb25kIGF0dGFjaG1lbnQgaXMgbm90ICcyJyIpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBhdHRhY2htZW50T3V0MS52YWx1ZSA9IG5ldyBieXRlWzFdOw0KLSAgICAgICAgICAgIGF0dGFjaG1lbnRPdXQxLnZhbHVlWzBdID0gJzMnOw0KLSAgICAgICAgICAgIGF0dGFjaG1lbnRPdXQyLnZhbHVlID0gbmV3IGJ5dGVbMV07DQotICAgICAgICAgICAgYXR0YWNobWVudE91dDIudmFsdWVbMF0gPSAnNCc7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgfQ0KLSAgICANCi0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lPSJtdG9tQXR0YWNobWVudCIsIGFjdGlvbj0ibXRvbUF0dGFjaG1lbnQiKQ0KLSAgICBAU09BUEJpbmRpbmcocGFyYW1ldGVyU3R5bGU9UGFyYW1ldGVyU3R5bGUuQkFSRSkNCi0gICAgcHVibGljIHZvaWQgbXRvbUF0dGFjaG1lbnQoSG9sZGVyPGJ5dGVbXT4gbWVzc2FnZSkgew0KLQ0KLSAgICAgICAgYnl0ZVtdIGF0dGFjaG1lbnQgPSBtZXNzYWdlLnZhbHVlOw0KLQ0KLSAgICAgICAgaWYgKGF0dGFjaG1lbnQgPT0gbnVsbCB8fCBhdHRhY2htZW50Lmxlbmd0aCA9PSAwKXsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiUmVjZWl2ZWQgZW1wdHkgbXRvbSBhdHRhY2htZW50Iik7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIC8vIENoYW5nZSB0aGUgZmlyc3QgY2hhcmFjdGVycw0KLSAgICAgICAgICAgIGF0dGFjaG1lbnRbMF0gPSAnWCc7DQotICAgICAgICAgICAgYXR0YWNobWVudFsxXSA9ICdPJzsNCi0gICAgICAgICAgICBhdHRhY2htZW50WzJdID0gJ1AnOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgbWVzc2FnZS52YWx1ZSA9IGF0dGFjaG1lbnQ7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3R5cGVfc3Vic3RpdHV0aW9uL0FwcGxlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvdHlwZV9zdWJzdGl0dXRpb24vQXBwbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGFmYTE4NS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvdHlwZV9zdWJzdGl0dXRpb24vQXBwbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MudHlwZV9zdWJzdGl0dXRpb247Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBcHBsZSB7Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGNvbG9yOwotICAgIHByb3RlY3RlZCBTdHJpbmcgZmxhdm9yOwotICAgIHByb3RlY3RlZCBTdHJpbmcgdHlwZTsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29sb3IoKSB7Ci0gICAgICAgIHJldHVybiBjb2xvcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb2xvcihTdHJpbmcgYXJnKSB7Ci0gICAgICAgIHRoaXMuY29sb3IgPSBhcmc7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRGbGF2b3IoKSB7Ci0gICAgICAgIHJldHVybiBmbGF2b3I7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Rmxhdm9yKFN0cmluZyBmbGEpIHsKLSAgICAgICAgdGhpcy5mbGF2b3IgPSBmbGE7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgYXJnKSB7Ci0gICAgICAgIHRoaXMudHlwZSA9IGFyZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0gICAgICAgIHJldHVybiB0eXBlOwotICAgIH0KLQotICAgIAotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3R5cGVfc3Vic3RpdHV0aW9uL0FwcGxlRmluZGVySW1wbC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3R5cGVfc3Vic3RpdHV0aW9uL0FwcGxlRmluZGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlN2U5ZGFjLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy90eXBlX3N1YnN0aXR1dGlvbi9BcHBsZUZpbmRlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnR5cGVfc3Vic3RpdHV0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sU2VlQWxzbzsKLQotQFdlYlNlcnZpY2Uoc2VydmljZU5hbWUgPSAiQXBwbGVGaW5kZXJTZXJ2aWNlIiwKLSAgICAgICAgICAgIHBvcnROYW1lID0gIkFwcGxlRmluZGVyUG9ydCIsIAotICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9hcHBsZS5vcmciKQotQFhtbFNlZUFsc28oeyBGcmV5YnVyZy5jbGFzcywgRnVqaS5jbGFzcyB9KQotcHVibGljIGNsYXNzIEFwcGxlRmluZGVySW1wbCB7IAotCi0gICAgcHVibGljIExpc3Q8QXBwbGU+IGdldEFwcGxlcygpIHsKLSAgICAgICAgTGlzdDxBcHBsZT4gYXBwbGVzID0gbmV3IEFycmF5TGlzdDxBcHBsZT4oKTsKLSAgICAgICAgYXBwbGVzLmFkZChuZXcgRnVqaSgiUmVkIiwgIm1pbGQiLCAiSmFwYW4iKSk7Ci0gICAgICAgIGFwcGxlcy5hZGQobmV3IEZyZXlidXJnKCJZZWxsb3ciLCAic3dlZXQiLCAiZWFybHkgT2N0b2JlciIpKTsKLSAgICAgICAgcmV0dXJuIGFwcGxlczsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvdHlwZV9zdWJzdGl0dXRpb24vRnJleWJ1cmcuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy90eXBlX3N1YnN0aXR1dGlvbi9GcmV5YnVyZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWE2YmQwLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy90eXBlX3N1YnN0aXR1dGlvbi9GcmV5YnVyZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy50eXBlX3N1YnN0aXR1dGlvbjsKLQotcHVibGljIGNsYXNzIEZyZXlidXJnIGV4dGVuZHMgQXBwbGUgewotCi0gICAgcHJpdmF0ZSBTdHJpbmcgc2Vhc29uOwotCi0gICAgcHVibGljIEZyZXlidXJnKCkgewotICAgICAgICBzZXRUeXBlKCJGcmV5YnVyZyIpOwotICAgIH0KLQotICAgIHB1YmxpYyBGcmV5YnVyZyhTdHJpbmcgY29sb3IsIFN0cmluZyBmbGF2b3IsIFN0cmluZyBzZWFzb24pIHsKLSAgICAgICAgc2V0VHlwZSgiRnJleWJ1cmciKTsKLSAgICAgICAgc2V0Q29sb3IoY29sb3IpOwotICAgICAgICBzZXRGbGF2b3IoZmxhdm9yKTsKLSAgICAgICAgCi0gICAgICAgIHNldFNlYXNvbihzZWFzb24pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFNlYXNvbihTdHJpbmcgYXJnMCkgewotICAgICAgICB0aGlzLnNlYXNvbiA9IGFyZzA7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRTZWFzb24oKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnNlYXNvbjsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy90eXBlX3N1YnN0aXR1dGlvbi9GdWppLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvdHlwZV9zdWJzdGl0dXRpb24vRnVqaS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmU4NGQzLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy90eXBlX3N1YnN0aXR1dGlvbi9GdWppLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnR5cGVfc3Vic3RpdHV0aW9uOwotCi1wdWJsaWMgY2xhc3MgRnVqaSBleHRlbmRzIEFwcGxlIHsKLQotICAgIHByaXZhdGUgU3RyaW5nIGxvY2F0aW9uOwotCi0gICAgcHVibGljIEZ1amkoKSB7Ci0gICAgICAgIHNldFR5cGUoIkZ1amkiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRnVqaShTdHJpbmcgY29sb3IsIFN0cmluZyBmbGF2b3IsIFN0cmluZyBsb2NhdGlvbikgewotICAgICAgICBzZXRUeXBlKCJGdWppIik7Ci0gICAgICAgIHNldENvbG9yKGNvbG9yKTsKLSAgICAgICAgc2V0Rmxhdm9yKGZsYXZvcik7Ci0gICAgICAgIAotICAgICAgICBzZXRMb2NhdGlvbihsb2NhdGlvbik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TG9jYXRpb24oU3RyaW5nIGFyZzApIHsKLSAgICAgICAgdGhpcy5sb2NhdGlvbiA9IGFyZzA7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRMb2NhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMubG9jYXRpb247Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvdHlwZV9zdWJzdGl0dXRpb24vamF4d3MvR2V0QXBwbGVzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvdHlwZV9zdWJzdGl0dXRpb24vamF4d3MvR2V0QXBwbGVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3ODQ5OTIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3R5cGVfc3Vic3RpdHV0aW9uL2pheHdzL0dldEFwcGxlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy50eXBlX3N1YnN0aXR1dGlvbi5qYXh3czsKLQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50OwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZTsKLQotLyoqCi0gKiA8cD5KYXZhIGNsYXNzIGZvciBnZXRBcHBsZXMgY29tcGxleCB0eXBlLgotICogCi0gKiA8cD5UaGUgZm9sbG93aW5nIHNjaGVtYSBmcmFnbWVudCBzcGVjaWZpZXMgdGhlIGV4cGVjdGVkIGNvbnRlbnQgY29udGFpbmVkIHdpdGhpbiB0aGlzIGNsYXNzLgotICogCi0gKiA8cHJlPgotICogJmx0O2NvbXBsZXhUeXBlIG5hbWU9ImdldEFwcGxlcyI+Ci0gKiAgICZsdDtjb21wbGV4Q29udGVudD4KLSAqICAgICAmbHQ7cmVzdHJpY3Rpb24gYmFzZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfWFueVR5cGUiPgotICogICAgICAgJmx0O3NlcXVlbmNlPgotICogICAgICAgJmx0Oy9zZXF1ZW5jZT4KLSAqICAgICAmbHQ7L3Jlc3RyaWN0aW9uPgotICogICAmbHQ7L2NvbXBsZXhDb250ZW50PgotICogJmx0Oy9jb21wbGV4VHlwZT4KLSAqIDwvcHJlPgotICogCi0gKiAKLSAqLwotQFhtbFJvb3RFbGVtZW50KG5hbWVzcGFjZSA9ICJodHRwOi8vYXBwbGUub3JnIiwgbmFtZSA9ICJnZXRBcHBsZXMiKQotQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKQotQFhtbFR5cGUobmFtZXNwYWNlID0gImh0dHA6Ly9hcHBsZS5vcmciLCBuYW1lID0gImdldEFwcGxlcyIpCi1wdWJsaWMgY2xhc3MgR2V0QXBwbGVzIHsKLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3R5cGVfc3Vic3RpdHV0aW9uL2pheHdzL0dldEFwcGxlc1Jlc3BvbnNlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvdHlwZV9zdWJzdGl0dXRpb24vamF4d3MvR2V0QXBwbGVzUmVzcG9uc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFiNjBkNS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvdHlwZV9zdWJzdGl0dXRpb24vamF4d3MvR2V0QXBwbGVzUmVzcG9uc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MudHlwZV9zdWJzdGl0dXRpb24uamF4d3M7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnR5cGVfc3Vic3RpdHV0aW9uLkFwcGxlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50OwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUm9vdEVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlOwotCi0KLS8qKgotICogPHA+SmF2YSBjbGFzcyBmb3IgZ2V0QXBwbGVzUmVzcG9uc2UgY29tcGxleCB0eXBlLgotICogCi0gKiA8cD5UaGUgZm9sbG93aW5nIHNjaGVtYSBmcmFnbWVudCBzcGVjaWZpZXMgdGhlIGV4cGVjdGVkIGNvbnRlbnQgY29udGFpbmVkIHdpdGhpbiB0aGlzIGNsYXNzLgotICogCi0gKiA8cHJlPgotICogJmx0O2NvbXBsZXhUeXBlIG5hbWU9ImdldEFwcGxlc1Jlc3BvbnNlIj4KLSAqICAgJmx0O2NvbXBsZXhDb250ZW50PgotICogICAgICZsdDtyZXN0cmljdGlvbiBiYXNlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9YW55VHlwZSI+Ci0gKiAgICAgICAmbHQ7c2VxdWVuY2U+Ci0gKiAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9InJldHVybiIgdHlwZT0ie2h0dHA6Ly9hcHBsZS5vcmd9YXBwbGUiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiLz4KLSAqICAgICAgICZsdDsvc2VxdWVuY2U+Ci0gKiAgICAgJmx0Oy9yZXN0cmljdGlvbj4KLSAqICAgJmx0Oy9jb21wbGV4Q29udGVudD4KLSAqICZsdDsvY29tcGxleFR5cGU+Ci0gKiA8L3ByZT4KLSAqIAotICogCi0gKi8KLUBYbWxSb290RWxlbWVudChuYW1lc3BhY2UgPSAiaHR0cDovL2FwcGxlLm9yZyIsIG5hbWUgPSAiZ2V0QXBwbGVzUmVzcG9uc2UiKQotQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKQotQFhtbFR5cGUobmFtZXNwYWNlID0gImh0dHA6Ly9hcHBsZS5vcmciLCBuYW1lID0gImdldEFwcGxlc1Jlc3BvbnNlIiwgcHJvcE9yZGVyID0geyJfcmV0dXJuIn0pCi1wdWJsaWMgY2xhc3MgR2V0QXBwbGVzUmVzcG9uc2UgewotCi0gICAgQFhtbEVsZW1lbnQobmFtZSA9ICJyZXR1cm4iKQotICAgIHByb3RlY3RlZCBMaXN0PEFwcGxlPiBfcmV0dXJuOwotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIHJldHVybiBwcm9wZXJ0eS4KLSAgICAgKiAKLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGFjY2Vzc29yIG1ldGhvZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBsaXZlIGxpc3QsCi0gICAgICogbm90IGEgc25hcHNob3QuIFRoZXJlZm9yZSBhbnkgbW9kaWZpY2F0aW9uIHlvdSBtYWtlIHRvIHRoZQotICAgICAqIHJldHVybmVkIGxpc3Qgd2lsbCBiZSBwcmVzZW50IGluc2lkZSB0aGUgSkFYQiBvYmplY3QuCi0gICAgICogVGhpcyBpcyB3aHkgdGhlcmUgaXMgbm90IGEgPENPREU+c2V0PC9DT0RFPiBtZXRob2QgZm9yIHRoZSByZXR1cm4gcHJvcGVydHkuCi0gICAgICogCi0gICAgICogPHA+Ci0gICAgICogRm9yIGV4YW1wbGUsIHRvIGFkZCBhIG5ldyBpdGVtLCBkbyBhcyBmb2xsb3dzOgotICAgICAqIDxwcmU+Ci0gICAgICogICAgZ2V0UmV0dXJuKCkuYWRkKG5ld0l0ZW0pOwotICAgICAqIDwvcHJlPgotICAgICAqIAotICAgICAqIAotICAgICAqIDxwPgotICAgICAqIE9iamVjdHMgb2YgdGhlIGZvbGxvd2luZyB0eXBlKHMpIGFyZSBhbGxvd2VkIGluIHRoZSBsaXN0Ci0gICAgICoge0BsaW5rIEFwcGxlIH0KLSAgICAgKiAKLSAgICAgKiAKLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxBcHBsZT4gZ2V0UmV0dXJuKCkgewotICAgICAgICBpZiAoX3JldHVybiA9PSBudWxsKSB7Ci0gICAgICAgICAgICBfcmV0dXJuID0gbmV3IEFycmF5TGlzdDxBcHBsZT4oKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3R5cGVfc3Vic3RpdHV0aW9uL3Rlc3RzL1R5cGVTdWJzdGl0dXRpb25UZXN0cy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3R5cGVfc3Vic3RpdHV0aW9uL3Rlc3RzL1R5cGVTdWJzdGl0dXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTE1OGZiLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy90eXBlX3N1YnN0aXR1dGlvbi90ZXN0cy9UeXBlU3Vic3RpdHV0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MudHlwZV9zdWJzdGl0dXRpb24udGVzdHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5UZXN0TG9nZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZnJhbWV3b3JrLkFic3RyYWN0VGVzdENhc2U7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLk1lc3NhZ2VGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBCb2R5OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBFbGVtZW50OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBNZXNzYWdlOwotaW1wb3J0IGphdmF4LnhtbC53cy5EaXNwYXRjaDsKLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIFR5cGVTdWJzdGl0dXRpb25UZXN0cyBleHRlbmRzIEFic3RyYWN0VGVzdENhc2UgewotCi0gICAgcHJpdmF0ZSBTdHJpbmcgTlMgPSAiaHR0cDovL2FwcGxlLm9yZyI7Ci0gICAgcHJpdmF0ZSBRTmFtZSBYU0lfVFlQRSA9IG5ldyBRTmFtZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCAidHlwZSIpOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZW5kcG9pbnRVcmwgPSAiaHR0cDovL2xvY2FsaG9zdDo2MDYwL2F4aXMyL3NlcnZpY2VzL0FwcGxlRmluZGVyU2VydmljZS5BcHBsZUZpbmRlclBvcnQiOwotICAgIHByaXZhdGUgUU5hbWUgc2VydmljZU5hbWUgPSBuZXcgUU5hbWUoTlMsICJBcHBsZUZpbmRlclNlcnZpY2UiKTsKLSAgICBwcml2YXRlIFFOYW1lIHBvcnROYW1lID0gbmV3IFFOYW1lKE5TLCAiQXBwbGVGaW5kZXJQb3J0Iik7Ci0gICAgCi0gICAgcHJpdmF0ZSBTdHJpbmcgcmVxTXNnU3RhcnQgPSAKLSAgICAgICAgIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PiIgKwotICAgICAgICAiPHNvYXA6RW52ZWxvcGUgeG1sbnM6c29hcD1cImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvXCI+PHNvYXA6Qm9keT4iOwotICAgIAotICAgIHByaXZhdGUgU3RyaW5nIHJlcU1zZ0VuZCA9ICI8L3NvYXA6Qm9keT48L3NvYXA6RW52ZWxvcGU+IjsKLSAgIAotICAgIHByaXZhdGUgU3RyaW5nIEdFVF9BUFBMRVMgPSAiPG5zMjpnZXRBcHBsZXMgeG1sbnM6bnMyPVwiIiArIE5TICsgIlwiLz4iOwotICAgICAgICAgICAgICAgIAotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgcmV0dXJuIGdldFRlc3RTZXR1cChuZXcgVGVzdFN1aXRlKFR5cGVTdWJzdGl0dXRpb25UZXN0cy5jbGFzcykpOwotICAgIH0KLSAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RUeXBlU3Vic3RpdHV0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIERpc3BhdGNoPFNPQVBNZXNzYWdlPiBkaXNwYXRjaCA9IGNyZWF0ZURpc3BhdGNoKCk7Ci0gICAgICAgICAgICAgCi0gICAgICAgIFN0cmluZyBtc2cgPSByZXFNc2dTdGFydCArIEdFVF9BUFBMRVMgKyByZXFNc2dFbmQ7Ci0gICAgICAgIE1lc3NhZ2VGYWN0b3J5IGZhY3RvcnkgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICBTT0FQTWVzc2FnZSByZXF1ZXN0ID0gZmFjdG9yeS5jcmVhdGVNZXNzYWdlKG51bGwsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShtc2cuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgCi0gICAgICAgIFNPQVBNZXNzYWdlIHJlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOwotCi0gICAgICAgIFNPQVBCb2R5IGJvZHkgPSByZXNwb25zZS5nZXRTT0FQQm9keSgpOwotCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBSZXNwb25zZSBbIiArIGJvZHkgKyAiXSIpOwotCi0gICAgICAgIFFOYW1lIGV4cGVjdGVkWHNpVHlwZTEgPSBuZXcgUU5hbWUoTlMsICJmdWppIik7Ci0gICAgICAgIFFOYW1lIGV4cGVjdGVkWHNpVHlwZTIgPSBuZXcgUU5hbWUoTlMsICJmcmV5YnVyZyIpOwotCi0gICAgICAgIEl0ZXJhdG9yIGl0ZXI7Ci0gICAgICAgIFNPQVBFbGVtZW50IGVsZW1lbnQ7Ci0gICAgICAgIFFOYW1lIHhzaVR5cGU7Ci0KLSAgICAgICAgaXRlciA9IGJvZHkuZ2V0Q2hpbGRFbGVtZW50cyhuZXcgUU5hbWUoTlMsICJnZXRBcHBsZXNSZXNwb25zZSIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShpdGVyLmhhc05leHQoKSk7Ci0gICAgICAgIAotICAgICAgICBlbGVtZW50ID0gKFNPQVBFbGVtZW50KWl0ZXIubmV4dCgpOwotCi0gICAgICAgIGl0ZXIgPSBlbGVtZW50LmdldENoaWxkRWxlbWVudHMobmV3IFFOYW1lKCJyZXR1cm4iKSk7Ci0KLSAgICAgICAgLy8gY2hlY2sgdmFsdWUxCi0gICAgICAgIGFzc2VydFRydWUoaXRlci5oYXNOZXh0KCkpOwotICAgICAgICBlbGVtZW50ID0gKFNPQVBFbGVtZW50KWl0ZXIubmV4dCgpOwotICAgICAgICB4c2lUeXBlID0gZ2V0WHNpVHlwZUF0dHJpYnV0ZShlbGVtZW50KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJ4c2k6dHlwZSAxIiwgZXhwZWN0ZWRYc2lUeXBlMSwgeHNpVHlwZSk7Ci0gICAgICAgIAotICAgICAgICAvLyBjaGVjayB2YWx1ZTIKLSAgICAgICAgYXNzZXJ0VHJ1ZShpdGVyLmhhc05leHQoKSk7Ci0gICAgICAgIGVsZW1lbnQgPSAoU09BUEVsZW1lbnQpaXRlci5uZXh0KCk7Ci0gICAgICAgIHhzaVR5cGUgPSBnZXRYc2lUeXBlQXR0cmlidXRlKGVsZW1lbnQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInhzaTp0eXBlIDIiLCBleHBlY3RlZFhzaVR5cGUyLCB4c2lUeXBlKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBRTmFtZSBnZXRYc2lUeXBlQXR0cmlidXRlKFNPQVBFbGVtZW50IGVsZW1lbnQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgdmFsdWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZVZhbHVlKFhTSV9UWVBFKTsKLSAgICAgICAgUU5hbWUgeHNpVHlwZSA9IG51bGw7Ci0gICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnQgcG9zID0gdmFsdWUuaW5kZXhPZigiOiIpOwotICAgICAgICAgICAgaWYgKHBvcyAhPSAtMSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSB2YWx1ZS5zdWJzdHJpbmcoMCwgcG9zKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbG9jYWxOYW1lID0gdmFsdWUuc3Vic3RyaW5nKHBvcysxKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZXNwYWNlID0gZWxlbWVudC5nZXROYW1lc3BhY2VVUkkocHJlZml4KTsKLSAgICAgICAgICAgICAgICB4c2lUeXBlID0gbmV3IFFOYW1lKG5hbWVzcGFjZSwgbG9jYWxOYW1lLCBwcmVmaXgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB4c2lUeXBlID0gbmV3IFFOYW1lKHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4geHNpVHlwZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIERpc3BhdGNoPFNPQVBNZXNzYWdlPiBjcmVhdGVEaXNwYXRjaCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTZXJ2aWNlIHN2YyA9IFNlcnZpY2UuY3JlYXRlKHNlcnZpY2VOYW1lKTsKLSAgICAgICAgc3ZjLmFkZFBvcnQocG9ydE5hbWUsIG51bGwsIGVuZHBvaW50VXJsKTsKLSAgICAgICAgRGlzcGF0Y2g8U09BUE1lc3NhZ2U+IGRpc3BhdGNoID0gCi0gICAgICAgICAgICBzdmMuY3JlYXRlRGlzcGF0Y2gocG9ydE5hbWUsIFNPQVBNZXNzYWdlLmNsYXNzLCBTZXJ2aWNlLk1vZGUuTUVTU0FHRSk7Ci0gICAgICAgIHJldHVybiBkaXNwYXRjaDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy91dGlsaXR5L1NpbXBsZVNlcnZlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3V0aWxpdHkvU2ltcGxlU2VydmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlMjZlNjYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3V0aWxpdHkvU2ltcGxlU2VydmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnV0aWxpdHk7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dEZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuVGVzdExvZ2dlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5TaW1wbGVIVFRQU2VydmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLkJhc2ljQ29uZmlndXJhdG9yOw0KLQ0KLQ0KLQ0KLXB1YmxpYyBjbGFzcyBTaW1wbGVTZXJ2ZXIgew0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBTaW1wbGVIVFRQU2VydmVyIHNlcnZlcjsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgcmVwb3NpdG9yeURpciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiYmFzZWRpciIsIi4iKSsiLyIrU3lzdGVtLmdldFByb3BlcnR5KCJidWlsZC5yZXBvc2l0b3J5IiwiIik7DQotICAgIHByaXZhdGUgU3RyaW5nIGF4aXMyeG1sID0gU3lzdGVtLmdldFByb3BlcnR5KCJheGlzMi5jb25maWciKTsNCi0gICAgcHJpdmF0ZSBpbnQgcG9ydCA9IDYwNjA7DQotDQotICAgIHB1YmxpYyBTaW1wbGVTZXJ2ZXIoKSB7fQ0KLSAgICANCi0gICAgLyoNCi0gICAgICogdXNlcnMgbWF5IHBhc3MgaW4gdGhlaXIgb3duIHJlcG9zaXRvcnlEaXIgcGF0aCBhbmQgcGF0aCB0byBjdXN0b20gY29uZmlndXJhdGlvbiBmaWxlLg0KLSAgICAgKiBQYXNzaW5nICdudWxsJyBmb3IgZWl0aGVyIHBhcmFtIHdpbGwgdXNlIHRoZSBkZWZhdWx0DQotICAgICAqLw0KLSAgICBwdWJsaWMgU2ltcGxlU2VydmVyKFN0cmluZyByZXBvc2l0b3J5RGlyLCBTdHJpbmcgYXhpczJ4bWwpIHsNCi0gICAgICAgIGlmIChyZXBvc2l0b3J5RGlyICE9IG51bGwpIHsNCi0gICAgICAgICAgICB0aGlzLnJlcG9zaXRvcnlEaXIgPSByZXBvc2l0b3J5RGlyOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKGF4aXMyeG1sICE9IG51bGwpIHsNCi0gICAgICAgICAgICB0aGlzLmF4aXMyeG1sID0gYXhpczJ4bWw7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIGluaXQoKSB7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gcmVwb3NpdG9yeURpciA9ICIgKyByZXBvc2l0b3J5RGlyKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBheGlzMi54bWwgICAgID0gIiArIGF4aXMyeG1sKTsNCi0NCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnID0gQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5LmNyZWF0ZUNvbmZpZ3VyYXRpb25Db250ZXh0RnJvbUZpbGVTeXN0ZW0oDQotICAgICAgICAgICAgICAgICAgICByZXBvc2l0b3J5RGlyLCBheGlzMnhtbCk7DQotICAgICAgICAgICAgc2VydmVyID0gbmV3IFNpbXBsZUhUVFBTZXJ2ZXIoY29uZmlnLCBwb3J0KTsNCi0gICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBlKSB7DQotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIHZvaWQgc3RhcnQoKSB7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tIHN0YXJ0aW5nIHNlcnZlciAtLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIGluaXQoKTsNCi0gICAgICAgIGlmIChzZXJ2ZXIgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgIHNlcnZlci5zdGFydCgpOw0KLSAgICAgICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBlKSB7DQotICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLSBkb25lIC0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHN0b3AoKSB7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tIHN0b3BwaW5nIHNlcnZlciAtLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIGlmIChzZXJ2ZXIgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHNlcnZlci5zdG9wKCk7DQotICAgICAgICB9DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tIGRvbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICAvLyBUbyBjaGFuZ2UgdGhlIHNldHRpbmdzLCBlZGl0IHRoZSBsb2c0ai5wcm9wZXJ0eSBmaWxlDQotICAgICAgICAvLyBpbiB0aGUgdGVzdC1yZXNvdXJjZXMgZGlyZWN0b3J5Lg0KLSAgICAgICAgQmFzaWNDb25maWd1cmF0b3IuY29uZmlndXJlKCk7DQotICAgICAgICBTaW1wbGVTZXJ2ZXIgc2VydmVyID0gbmV3IFNpbXBsZVNlcnZlcigpOw0KLSAgICAgICAgc2VydmVyLnN0YXJ0KCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3htbGh0dHAvUkVBRE1FLnR4dCBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy94bWxodHRwL1JFQURNRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiY2FiYTIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3htbGh0dHAvUkVBRE1FLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLVRoZSB4bWxodHRwIHRlc3QgdGhlIFhNTCBIVFRQIHByb3RvY29sLg0KLQ0KLVRoZSBzdHJ1Y3R1cmUgb2YgdGhlIHRlc3RzIHdpbGwgYmUgDQotDQotb3JnLmFwYWNoZS5heGlzMi5qYXh3cy54bWxodHRwLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlci4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZC4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcuIC4uLk1FVEFfSU5GLCBldGMuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLiAuLi5NRVRBX0lORiwgZXRjLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZy4gLi4uTUVUQV9JTkYsIGV0Yy4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UuIC4uLk1FVEFfSU5GLCBldGMuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YXNvdXJjZSAuLi5NRVRBX0lORiwgZXRjLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWJzZXJ2aWNlLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlaS4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVUQV9JTkYgLi4uDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRUZXN0cy4gZGlzcGF0Y2guDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YXNvdXJjZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF4Yg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJveHkuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy94bWxodHRwL2NsaWVudFRlc3RzL2Rpc3BhdGNoL2RhdGFzb3VyY2UvRGlzcGF0Y2hYTWVzc2FnZURhdGFTb3VyY2VUZXN0cy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3htbGh0dHAvY2xpZW50VGVzdHMvZGlzcGF0Y2gvZGF0YXNvdXJjZS9EaXNwYXRjaFhNZXNzYWdlRGF0YVNvdXJjZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3MDU5NzcuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3htbGh0dHAvY2xpZW50VGVzdHMvZGlzcGF0Y2gvZGF0YXNvdXJjZS9EaXNwYXRjaFhNZXNzYWdlRGF0YVNvdXJjZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy54bWxodHRwLmNsaWVudFRlc3RzLmRpc3BhdGNoLmRhdGFzb3VyY2U7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmZyYW1ld29yay5BYnN0cmFjdFRlc3RDYXNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnByb3ZpZGVyLkRhdGFTb3VyY2VJbXBsOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLmF0dGFjaG1lbnRzLnV0aWxzLklPVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uYXR0YWNobWVudHMuaW1wbC5CdWZmZXJVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS51dGlsLlVVSURHZW5lcmF0b3I7DQotDQotaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRGF0YVNvdXJjZTsNCi1pbXBvcnQgamF2YXguYWN0aXZhdGlvbi5GaWxlRGF0YVNvdXJjZTsNCi1pbXBvcnQgamF2YXguYWN0aXZhdGlvbi5EYXRhSGFuZGxlcjsNCi1pbXBvcnQgamF2YXguaW1hZ2Vpby5JbWFnZUlPOw0KLWltcG9ydCBqYXZheC5pbWFnZWlvLnN0cmVhbS5GaWxlSW1hZ2VJbnB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YXguaW1hZ2Vpby5zdHJlYW0uSW1hZ2VJbnB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLkRpc3BhdGNoOw0KLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuTWVzc2FnZUNvbnRleHQ7DQotaW1wb3J0IGphdmF4LnhtbC53cy5odHRwLkhUVFBCaW5kaW5nOw0KLWltcG9ydCBqYXZhLmF3dC4qOw0KLWltcG9ydCBqYXZhLmlvLkZpbGU7DQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi0NCi1wdWJsaWMgY2xhc3MgRGlzcGF0Y2hYTWVzc2FnZURhdGFTb3VyY2VUZXN0cyBleHRlbmRzIEFic3RyYWN0VGVzdENhc2Ugew0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIEhPU1RQT1JUID0gImh0dHA6Ly9sb2NhbGhvc3Q6NjA2MCI7DQotICAgICAgICANCi0gICAgcHJpdmF0ZSBTdHJpbmcgRU5EUE9JTlRfVVJMID0gSE9TVFBPUlQgKyAiL2F4aXMyL3NlcnZpY2VzL1hNZXNzYWdlRGF0YVNvdXJjZVByb3ZpZGVyLlhNZXNzYWdlRGF0YVNvdXJjZVByb3ZpZGVyUG9ydCI7DQotICAgIHByaXZhdGUgUU5hbWUgU0VSVklDRV9OQU1FICA9IG5ldyBRTmFtZSgiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIiLCAiWE1lc3NhZ2VEYXRhU291cmNlUHJvdmlkZXIiKTsNCi0gICAgcHJpdmF0ZSBRTmFtZSBQT1JUX05BTUUgID0gbmV3IFFOYW1lKCJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMiIsICJYTWVzc2FnZURhdGFTb3VyY2VQcm92aWRlclBvcnQiKTsNCi0gDQotICAgIHByaXZhdGUgRGF0YVNvdXJjZSBpbWFnZURTOw0KLSAgICBwcml2YXRlIEZpbGVEYXRhU291cmNlIHR4dERTOw0KLSAgICBwcml2YXRlIERhdGFTb3VyY2UgYXR0YWNobWVudERTOw0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7DQotICAgICAgICByZXR1cm4gZ2V0VGVzdFNldHVwKG5ldyBUZXN0U3VpdGUoRGlzcGF0Y2hYTWVzc2FnZURhdGFTb3VyY2VUZXN0cy5jbGFzcykpOw0KLSAgICB9DQotIA0KLSAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgU3RyaW5nIGltYWdlUmVzb3VyY2VEaXIgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImJhc2VkaXIiLCIuIikrIi8iKyJ0ZXN0LXJlc291cmNlcyIrRmlsZS5zZXBhcmF0b3IrImltYWdlIjsNCi0NCi0gICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGltYWdlUmVzb3VyY2VEaXIrRmlsZS5zZXBhcmF0b3IrInRlc3QuanBnIik7DQotICAgICAgICBJbWFnZUlucHV0U3RyZWFtIGZpaXMgPSBuZXcgRmlsZUltYWdlSW5wdXRTdHJlYW0oZmlsZSk7DQotICAgICAgICBJbWFnZSBpbWFnZSA9IEltYWdlSU8ucmVhZChmaWlzKTsNCi0gICAgICAgIGltYWdlRFMgPSBuZXcgRGF0YVNvdXJjZUltcGwoImltYWdlL2pwZWciLCJ0ZXN0LmpwZyIsaW1hZ2UpOw0KLQ0KLSAgICAgICAgU3RyaW5nIHRleHRSZXNvdXJjZURpciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiYmFzZWRpciIsIi4iKSsiLyIrInRlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy94bWxodHRwIjsNCi0gICAgICAgIEZpbGUgZmlsZTIgPSBuZXcgRmlsZSh0ZXh0UmVzb3VyY2VEaXIrRmlsZS5zZXBhcmF0b3IrIlJFQURNRS50eHQiKTsNCi0gICAgICAgIHR4dERTID0gbmV3IEZpbGVEYXRhU291cmNlKGZpbGUyKTsNCi0NCi0gICAgICAgIFN0cmluZyByZXNvdXJjZURpciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiYmFzZWRpciIsIi4iKSsiLyIrInRlc3QtcmVzb3VyY2VzIjsNCi0gICAgICAgIEZpbGUgZmlsZTMgPSBuZXcgRmlsZShyZXNvdXJjZURpcitGaWxlLnNlcGFyYXRvcisibG9nNGoucHJvcGVydGllcyIpOw0KLSAgICAgICAgYXR0YWNobWVudERTID0gbmV3IEZpbGVEYXRhU291cmNlKGZpbGUzKTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIERpc3BhdGNoPERhdGFTb3VyY2U+IGdldERpc3BhdGNoKCkgew0KLSAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSBTZXJ2aWNlLmNyZWF0ZShTRVJWSUNFX05BTUUpOw0KLSAgICAgICBzZXJ2aWNlLmFkZFBvcnQoUE9SVF9OQU1FLCBIVFRQQmluZGluZy5IVFRQX0JJTkRJTkcsRU5EUE9JTlRfVVJMKTsNCi0gICAgICAgRGlzcGF0Y2g8RGF0YVNvdXJjZT4gZGlzcGF0Y2ggPSBzZXJ2aWNlLmNyZWF0ZURpc3BhdGNoKFBPUlRfTkFNRSwgRGF0YVNvdXJjZS5jbGFzcywgU2VydmljZS5Nb2RlLk1FU1NBR0UpOw0KLSAgICAgICByZXR1cm4gZGlzcGF0Y2g7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHRlc3REYXRhU291cmNlV2l0aFRYVCgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgRGlzcGF0Y2g8RGF0YVNvdXJjZT4gZGlzcGF0Y2ggPSBnZXREaXNwYXRjaCgpOw0KLSAgICAgICAgRGF0YVNvdXJjZSByZXF1ZXN0ID0gdHh0RFM7DQotICAgICAgICBEYXRhU291cmNlIHJlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZSAhPSBudWxsKTsNCi0gICAgICAgIGFzc2VydEVxdWFscyhyZXNwb25zZS5nZXRDb250ZW50VHlwZSgpLCJ0ZXh0L3BsYWluIik7DQotICAgICAgICBTdHJpbmcgcmVxID0gbmV3IFN0cmluZyhnZXRTdHJlYW1Bc0J5dGVBcnJheShyZXF1ZXN0LmdldElucHV0U3RyZWFtKCkpKTsNCi0gICAgICAgIFN0cmluZyByZXMgPSBuZXcgU3RyaW5nKGdldFN0cmVhbUFzQnl0ZUFycmF5KHJlc3BvbnNlLmdldElucHV0U3RyZWFtKCkpKTsNCi0gICAgICAgIGFzc2VydEVxdWFscyhyZXEsIHJlcyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdERhdGFTb3VyY2VXaXRoSW1hZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIERpc3BhdGNoPERhdGFTb3VyY2U+IGRpc3BhdGNoID0gZ2V0RGlzcGF0Y2goKTsNCi0gICAgICAgIERhdGFTb3VyY2UgcmVxdWVzdCA9IGltYWdlRFM7DQotICAgICAgICBEYXRhU291cmNlIHJlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZSAhPSBudWxsKTsNCi0gICAgICAgIGFzc2VydEVxdWFscyhyZXNwb25zZS5nZXRDb250ZW50VHlwZSgpLCJpbWFnZS9qcGVnIik7DQotICAgICAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZ2V0U3RyZWFtQXNCeXRlQXJyYXkocmVxdWVzdC5nZXRJbnB1dFN0cmVhbSgpKSwgDQotICAgICAgICAgICAgICAgIGdldFN0cmVhbUFzQnl0ZUFycmF5KHJlc3BvbnNlLmdldElucHV0U3RyZWFtKCkpKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdERhdGFTb3VyY2VXaXRoVFhUUGx1c0F0dGFjaG1lbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIERpc3BhdGNoPERhdGFTb3VyY2U+IGRpc3BhdGNoID0gZ2V0RGlzcGF0Y2goKTsNCi0NCi0gICAgICAgIE1hcCBhdHRhY2htZW50cyA9IG5ldyBIYXNoTWFwKCk7DQotICAgICAgICBNYXAgcmVxdWVzdENvbnRleHQgPSBkaXNwYXRjaC5nZXRSZXF1ZXN0Q29udGV4dCgpOw0KLQ0KLS8vICAgICAgICByZXF1ZXN0Q29udGV4dC5wdXQob3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5IVFRQQ29uc3RhbnRzLlNPX1RJTUVPVVQgLCBuZXcgDQotLy8gICAgICAgIEludGVnZXIoOTk5OTk5KSk7DQotLy8gICAgICAgIHJlcXVlc3RDb250ZXh0LnB1dChvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkhUVFBDb25zdGFudHMuQ09OTkVDVElPTl9USU1FT1VULCBuZXcgDQotLy8gICAgICAgIEludGVnZXIoOTk5OTk5KSk7DQotDQotICAgICAgICByZXF1ZXN0Q29udGV4dC5wdXQoTWVzc2FnZUNvbnRleHQuT1VUQk9VTkRfTUVTU0FHRV9BVFRBQ0hNRU5UUywNCi0gICAgICAgICAgICAgICAgYXR0YWNobWVudHMpOw0KLSAgICAgICAgYXR0YWNobWVudHMucHV0KFVVSURHZW5lcmF0b3IuZ2V0VVVJRCgpLCBuZXcgRGF0YUhhbmRsZXIoYXR0YWNobWVudERTKSk7DQotDQotICAgICAgICBEYXRhU291cmNlIHJlcXVlc3QgPSB0eHREUzsNCi0gICAgICAgIERhdGFTb3VyY2UgcmVzcG9uc2UgPSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlICE9IG51bGwpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3BvbnNlLmdldENvbnRlbnRUeXBlKCksInRleHQvcGxhaW4iKTsNCi0gICAgICAgIFN0cmluZyByZXEgPSBuZXcgU3RyaW5nKGdldFN0cmVhbUFzQnl0ZUFycmF5KHJlcXVlc3QuZ2V0SW5wdXRTdHJlYW0oKSkpOw0KLSAgICAgICAgU3RyaW5nIHJlcyA9IG5ldyBTdHJpbmcoZ2V0U3RyZWFtQXNCeXRlQXJyYXkocmVzcG9uc2UuZ2V0SW5wdXRTdHJlYW0oKSkpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJlcSwgcmVzKTsNCi0gICAgICAgIE1hcCBhdHRhY2htZW50czIgPSAoTWFwKSBkaXNwYXRjaC5nZXRSZXNwb25zZUNvbnRleHQoKS5nZXQoTWVzc2FnZUNvbnRleHQuSU5CT1VORF9NRVNTQUdFX0FUVEFDSE1FTlRTKTsNCi0gICAgICAgIGFzc2VydFRydWUoYXR0YWNobWVudHMyICE9IG51bGwpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKGF0dGFjaG1lbnRzMi5zaXplKCksIDEpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3REYXRhU291cmNlV2l0aEltYWdlUGx1c0F0dGFjaG1lbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIERpc3BhdGNoPERhdGFTb3VyY2U+IGRpc3BhdGNoID0gZ2V0RGlzcGF0Y2goKTsNCi0NCi0gICAgICAgIE1hcCBhdHRhY2htZW50cyA9IG5ldyBIYXNoTWFwKCk7DQotICAgICAgICBNYXAgcmVxdWVzdENvbnRleHQgPSBkaXNwYXRjaC5nZXRSZXF1ZXN0Q29udGV4dCgpOw0KLQ0KLSAgICAgICAgcmVxdWVzdENvbnRleHQucHV0KE1lc3NhZ2VDb250ZXh0Lk9VVEJPVU5EX01FU1NBR0VfQVRUQUNITUVOVFMsDQotICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRzKTsNCi0gICAgICAgIGF0dGFjaG1lbnRzLnB1dChVVUlER2VuZXJhdG9yLmdldFVVSUQoKSwgbmV3IERhdGFIYW5kbGVyKGF0dGFjaG1lbnREUykpOw0KLSAgICAgICAgDQotICAgICAgICBEYXRhU291cmNlIHJlcXVlc3QgPSBpbWFnZURTOw0KLSAgICAgICAgRGF0YVNvdXJjZSByZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UgIT0gbnVsbCk7DQotICAgICAgICBhc3NlcnRFcXVhbHMocmVzcG9uc2UuZ2V0Q29udGVudFR5cGUoKSwiaW1hZ2UvanBlZyIpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGdldFN0cmVhbUFzQnl0ZUFycmF5KHJlcXVlc3QuZ2V0SW5wdXRTdHJlYW0oKSksIA0KLSAgICAgICAgICAgICAgICBnZXRTdHJlYW1Bc0J5dGVBcnJheShyZXNwb25zZS5nZXRJbnB1dFN0cmVhbSgpKSkpOw0KLSAgICAgICAgTWFwIGF0dGFjaG1lbnRzMiA9IChNYXApIGRpc3BhdGNoLmdldFJlc3BvbnNlQ29udGV4dCgpLmdldChNZXNzYWdlQ29udGV4dC5JTkJPVU5EX01FU1NBR0VfQVRUQUNITUVOVFMpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShhdHRhY2htZW50czIgIT0gbnVsbCk7DQotICAgICAgICBhc3NlcnRFcXVhbHMoYXR0YWNobWVudHMyLnNpemUoKSwgMSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdERhdGFTb3VyY2VXaXRoVFhUUGx1c1R3b0F0dGFjaG1lbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBEaXNwYXRjaDxEYXRhU291cmNlPiBkaXNwYXRjaCA9IGdldERpc3BhdGNoKCk7DQotDQotICAgICAgICBNYXAgYXR0YWNobWVudHMgPSBuZXcgSGFzaE1hcCgpOw0KLSAgICAgICAgTWFwIHJlcXVlc3RDb250ZXh0ID0gZGlzcGF0Y2guZ2V0UmVxdWVzdENvbnRleHQoKTsNCi0NCi0gICAgICAgIHJlcXVlc3RDb250ZXh0LnB1dChNZXNzYWdlQ29udGV4dC5PVVRCT1VORF9NRVNTQUdFX0FUVEFDSE1FTlRTLA0KLSAgICAgICAgICAgICAgICBhdHRhY2htZW50cyk7DQotICAgICAgICBhdHRhY2htZW50cy5wdXQoVVVJREdlbmVyYXRvci5nZXRVVUlEKCksIG5ldyBEYXRhSGFuZGxlcihhdHRhY2htZW50RFMpKTsNCi0gICAgICAgIGF0dGFjaG1lbnRzLnB1dChVVUlER2VuZXJhdG9yLmdldFVVSUQoKSwgbmV3IERhdGFIYW5kbGVyKGltYWdlRFMpKTsNCi0NCi0gICAgICAgIERhdGFTb3VyY2UgcmVxdWVzdCA9IHR4dERTOw0KLSAgICAgICAgRGF0YVNvdXJjZSByZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UgIT0gbnVsbCk7DQotICAgICAgICBhc3NlcnRFcXVhbHMocmVzcG9uc2UuZ2V0Q29udGVudFR5cGUoKSwidGV4dC9wbGFpbiIpOw0KLSAgICAgICAgU3RyaW5nIHJlcSA9IG5ldyBTdHJpbmcoZ2V0U3RyZWFtQXNCeXRlQXJyYXkocmVxdWVzdC5nZXRJbnB1dFN0cmVhbSgpKSk7DQotICAgICAgICBTdHJpbmcgcmVzID0gbmV3IFN0cmluZyhnZXRTdHJlYW1Bc0J5dGVBcnJheShyZXNwb25zZS5nZXRJbnB1dFN0cmVhbSgpKSk7DQotICAgICAgICBhc3NlcnRFcXVhbHMocmVxLCByZXMpOw0KLSAgICAgICAgTWFwIGF0dGFjaG1lbnRzMiA9IChNYXApIGRpc3BhdGNoLmdldFJlc3BvbnNlQ29udGV4dCgpLmdldChNZXNzYWdlQ29udGV4dC5JTkJPVU5EX01FU1NBR0VfQVRUQUNITUVOVFMpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShhdHRhY2htZW50czIgIT0gbnVsbCk7DQotICAgICAgICBhc3NlcnRFcXVhbHMoYXR0YWNobWVudHMyLnNpemUoKSwgMik7DQotICAgIH0NCi0gICAgDQotICAgIHByaXZhdGUgYnl0ZVtdIGdldFN0cmVhbUFzQnl0ZUFycmF5KElucHV0U3RyZWFtIGlzKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLSAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7IA0KLSAgICAgICAgQnVmZmVyVXRpbHMuaW5wdXRTdHJlYW0yT3V0cHV0U3RyZWFtKGlzLCBiYW9zKTsNCi0gICAgICAgIGJhb3MuZmx1c2goKTsNCi0gICAgICAgIHJldHVybiBiYW9zLnRvQnl0ZUFycmF5KCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3htbGh0dHAvY2xpZW50VGVzdHMvZGlzcGF0Y2gvamF4Yi9EaXNwYXRjaFhQYXlsb2FkSkFYQlRlc3RzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MveG1saHR0cC9jbGllbnRUZXN0cy9kaXNwYXRjaC9qYXhiL0Rpc3BhdGNoWFBheWxvYWRKQVhCVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdiZGQ5ZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MveG1saHR0cC9jbGllbnRUZXN0cy9kaXNwYXRjaC9qYXhiL0Rpc3BhdGNoWFBheWxvYWRKQVhCVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MueG1saHR0cC5jbGllbnRUZXN0cy5kaXNwYXRjaC5qYXhiOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5UZXN0TG9nZ2VyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmZyYW1ld29yay5BYnN0cmFjdFRlc3RDYXNlOw0KLWltcG9ydCB0ZXN0LkVjaG9TdHJpbmc7DQotaW1wb3J0IHRlc3QuT2JqZWN0RmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkNvbnRleHQ7DQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJFeGNlcHRpb247DQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MSW5wdXRGYWN0b3J5Ow0KLWltcG9ydCBqYXZheC54bWwud3MuRGlzcGF0Y2g7DQotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuaHR0cC5IVFRQQmluZGluZzsNCi0NCi1wdWJsaWMgY2xhc3MgRGlzcGF0Y2hYUGF5bG9hZEpBWEJUZXN0cyBleHRlbmRzIEFic3RyYWN0VGVzdENhc2Ugew0KLSAgICANCi0gICAgcHJpdmF0ZSBzdGF0aWMgWE1MSW5wdXRGYWN0b3J5IGlucHV0RmFjdG9yeSA9IFhNTElucHV0RmFjdG9yeS5uZXdJbnN0YW5jZSgpOw0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIEhPU1RQT1JUID0gImh0dHA6Ly9sb2NhbGhvc3Q6NjA2MCI7DQotICAgICAgICANCi0gICAgcHJpdmF0ZSBTdHJpbmcgRU5EUE9JTlRfVVJMID0gSE9TVFBPUlQgKyAiL2F4aXMyL3NlcnZpY2VzL1hQYXlsb2FkU291cmNlUHJvdmlkZXIuWFBheWxvYWRTb3VyY2VQcm92aWRlclBvcnQiOw0KLSAgICBwcml2YXRlIFFOYW1lIFNFUlZJQ0VfTkFNRSAgPSBuZXcgUU5hbWUoImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyIiwgIlhQYXlsb2FkU291cmNlUHJvdmlkZXIiKTsNCi0gICAgcHJpdmF0ZSBRTmFtZSBQT1JUX05BTUUgID0gbmV3IFFOYW1lKCJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMiIsICJYUGF5bG9hZFNvdXJjZVByb3ZpZGVyUG9ydCIpOw0KLQ0KLSAgICBTdHJpbmcgWE1MX1RFWFQgPSAiPHA6ZWNobyB4bWxuczpwPVwiaHR0cDovL3NhbXBsZVwiPmhlbGxvIHdvcmxkPC9wOmVjaG8+IjsNCi0gICAgDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsNCi0gICAgICAgIHJldHVybiBnZXRUZXN0U2V0dXAobmV3IFRlc3RTdWl0ZShEaXNwYXRjaFhQYXlsb2FkSkFYQlRlc3RzLmNsYXNzKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIERpc3BhdGNoPE9iamVjdD4gZ2V0RGlzcGF0Y2goKSB0aHJvd3MgSkFYQkV4Y2VwdGlvbiB7DQotICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSBTZXJ2aWNlLmNyZWF0ZShTRVJWSUNFX05BTUUpOw0KLSAgICAgICAgc2VydmljZS5hZGRQb3J0KFBPUlRfTkFNRSwgSFRUUEJpbmRpbmcuSFRUUF9CSU5ESU5HLEVORFBPSU5UX1VSTCk7DQotICAgICAgICBKQVhCQ29udGV4dCBqYmMgPSBKQVhCQ29udGV4dC5uZXdJbnN0YW5jZSgidGVzdCIpOw0KLSAgICAgICAgRGlzcGF0Y2g8T2JqZWN0PiBkaXNwYXRjaCA9IHNlcnZpY2UuY3JlYXRlRGlzcGF0Y2goUE9SVF9OQU1FLCBqYmMsIFNlcnZpY2UuTW9kZS5QQVlMT0FEKTsNCi0gICAgICAgIHJldHVybiBkaXNwYXRjaDsNCi0gICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAqIFNpbXBsZSBYTUwvSFRUUCBNZXNzYWdlIFRlc3QNCi0gICAgKiBAdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICAqLw0KLSAgIHB1YmxpYyB2b2lkIHRlc3RTaW1wbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgRGlzcGF0Y2g8T2JqZWN0PiBkaXNwYXRjaCA9IGdldERpc3BhdGNoKCk7DQotICAgICAgIE9iamVjdEZhY3RvcnkgZmFjdG9yeSA9IG5ldyBPYmplY3RGYWN0b3J5KCk7DQotICAgICAgIEVjaG9TdHJpbmcgcmVxdWVzdCA9IGZhY3RvcnkuY3JlYXRlRWNob1N0cmluZygpOyAgICAgICAgIA0KLSAgICAgICByZXF1ZXN0LnNldElucHV0KCJTWU5DIEpBWEIgWE1MIFBBWUxPQUQgVEVTVCIpOw0KLSAgICAgICANCi0gICAgICAgLy8gSW52b2tlIHRoZSBEaXNwYXRjaDxPYmplY3Q+DQotICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBJbnZva2luZyBzeW5jIERpc3BhdGNoIHdpdGggSkFYLUIgUGFyYW1ldGVyIik7DQotICAgICAgIEVjaG9TdHJpbmcgcmVzcG9uc2UgPSAoRWNob1N0cmluZykgZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLSAgICAgICANCi0gICAgICAgYXNzZXJ0Tm90TnVsbChyZXNwb25zZSk7DQotDQotICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBSZXNwb25zZSBjb250ZW50OiAiICsgcmVzcG9uc2UuZ2V0SW5wdXQoKSk7DQotICAgICAgIA0KLSAgICAgICBhc3NlcnRUcnVlKCJbRVJST1JdIC0gUmVzcG9uc2Ugb2JqZWN0IHdhcyBudWxsIiwgcmVzcG9uc2UgIT0gbnVsbCk7DQotICAgICAgIGFzc2VydFRydWUoIltFUlJPUl0gLSBObyBjb250ZW50IGluIHJlc3BvbnNlIG9iamVjdCIsIHJlc3BvbnNlLmdldElucHV0KCkgIT0gbnVsbCk7DQotICAgICAgIGFzc2VydFRydWUoIltFUlJPUl0gLSBaZXJvIGxlbmd0aCBjb250ZW50IGluIHJlc3BvbnNlIiwgcmVzcG9uc2UuZ2V0SW5wdXQoKS5sZW5ndGgoKSA+IDApOw0KLSAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlLmdldElucHV0KCkuZXF1YWxzKHJlcXVlc3QuZ2V0SW5wdXQoKSkpOw0KLSAgICAgICANCi0gICAgICAgLy8gVGVzdCBhIHNlY29uZCB0aW1lIHRvIHZlcmlmeQ0KLSAgICAgICAvLyBJbnZva2UgdGhlIERpc3BhdGNoPE9iamVjdD4NCi0gICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEludm9raW5nIHN5bmMgRGlzcGF0Y2ggd2l0aCBKQVgtQiBQYXJhbWV0ZXIiKTsNCi0gICAgICAgcmVzcG9uc2UgPSAoRWNob1N0cmluZykgZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLSAgICAgICANCi0gICAgICAgYXNzZXJ0Tm90TnVsbChyZXNwb25zZSk7DQotDQotICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBSZXNwb25zZSBjb250ZW50OiAiICsgcmVzcG9uc2UuZ2V0SW5wdXQoKSk7DQotICAgICAgIA0KLSAgICAgICBhc3NlcnRUcnVlKCJbRVJST1JdIC0gUmVzcG9uc2Ugb2JqZWN0IHdhcyBudWxsIiwgcmVzcG9uc2UgIT0gbnVsbCk7DQotICAgICAgIGFzc2VydFRydWUoIltFUlJPUl0gLSBObyBjb250ZW50IGluIHJlc3BvbnNlIG9iamVjdCIsIHJlc3BvbnNlLmdldElucHV0KCkgIT0gbnVsbCk7DQotICAgICAgIGFzc2VydFRydWUoIltFUlJPUl0gLSBaZXJvIGxlbmd0aCBjb250ZW50IGluIHJlc3BvbnNlIiwgcmVzcG9uc2UuZ2V0SW5wdXQoKS5sZW5ndGgoKSA+IDApOw0KLSAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlLmdldElucHV0KCkuZXF1YWxzKHJlcXVlc3QuZ2V0SW5wdXQoKSkpOw0KLQ0KLSAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3htbGh0dHAvY2xpZW50VGVzdHMvZGlzcGF0Y2gvc291cmNlL0Rpc3BhdGNoWE1lc3NhZ2VTb3VyY2VUZXN0cy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3htbGh0dHAvY2xpZW50VGVzdHMvZGlzcGF0Y2gvc291cmNlL0Rpc3BhdGNoWE1lc3NhZ2VTb3VyY2VUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTQ1ODNlLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy94bWxodHRwL2NsaWVudFRlc3RzL2Rpc3BhdGNoL3NvdXJjZS9EaXNwYXRjaFhNZXNzYWdlU291cmNlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnhtbGh0dHAuY2xpZW50VGVzdHMuZGlzcGF0Y2guc291cmNlOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5mcmFtZXdvcmsuQWJzdHJhY3RUZXN0Q2FzZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLnV0aWwuUmVhZGVyMldyaXRlcjsNCi0NCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxJbnB1dEZhY3Rvcnk7DQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOw0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsNCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtU291cmNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuRGlzcGF0Y2g7DQotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuTWVzc2FnZUNvbnRleHQ7DQotaW1wb3J0IGphdmF4LnhtbC53cy5odHRwLkhUVFBCaW5kaW5nOw0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOw0KLQ0KLXB1YmxpYyBjbGFzcyBEaXNwYXRjaFhNZXNzYWdlU291cmNlVGVzdHMgZXh0ZW5kcyBBYnN0cmFjdFRlc3RDYXNlIHsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgWE1MSW5wdXRGYWN0b3J5IGlucHV0RmFjdG9yeSA9IFhNTElucHV0RmFjdG9yeS5uZXdJbnN0YW5jZSgpOw0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIEhPU1RQT1JUID0gImh0dHA6Ly9sb2NhbGhvc3Q6NjA2MCI7DQotICAgICAgICANCi0gICAgcHJpdmF0ZSBTdHJpbmcgRU5EUE9JTlRfVVJMID0gSE9TVFBPUlQgKyAiL2F4aXMyL3NlcnZpY2VzL1hNZXNzYWdlU291cmNlUHJvdmlkZXIuWE1lc3NhZ2VTb3VyY2VQcm92aWRlclBvcnQiOw0KLSAgICBwcml2YXRlIFFOYW1lIFNFUlZJQ0VfTkFNRSAgPSBuZXcgUU5hbWUoImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyIiwgIlhNZXNzYWdlU291cmNlUHJvdmlkZXIiKTsNCi0gICAgcHJpdmF0ZSBRTmFtZSBQT1JUX05BTUUgID0gbmV3IFFOYW1lKCJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMiIsICJYTWVzc2FnZVNvdXJjZVByb3ZpZGVyUG9ydCIpOw0KLSANCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFhNTF9URVhUID0gIjxwOmVjaG8geG1sbnM6cD1cImh0dHA6Ly9zYW1wbGVcIj5oZWxsbyB3b3JsZDwvcDplY2hvPiI7DQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBYTUxfVEVYVF9OUEUgPSAiPHA6ZWNobyB4bWxuczpwPVwiaHR0cDovL3NhbXBsZVwiPk5QRTwvcDplY2hvPiI7DQotICAgIA0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgR0VUX1JFU1BPTlNFID0gIjxyZXNwb25zZT5HRVQ8L3Jlc3BvbnNlPiI7DQotICAgIA0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7DQotICAgICAgICByZXR1cm4gZ2V0VGVzdFNldHVwKG5ldyBUZXN0U3VpdGUoRGlzcGF0Y2hYTWVzc2FnZVNvdXJjZVRlc3RzLmNsYXNzKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIERpc3BhdGNoPFNvdXJjZT4gZ2V0RGlzcGF0Y2goKSB7DQotICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IFNlcnZpY2UuY3JlYXRlKFNFUlZJQ0VfTkFNRSk7DQotICAgICAgIHNlcnZpY2UuYWRkUG9ydChQT1JUX05BTUUsIEhUVFBCaW5kaW5nLkhUVFBfQklORElORyxFTkRQT0lOVF9VUkwpOw0KLSAgICAgICBEaXNwYXRjaDxTb3VyY2U+IGRpc3BhdGNoID0gc2VydmljZS5jcmVhdGVEaXNwYXRjaChQT1JUX05BTUUsIFNvdXJjZS5jbGFzcywgU2VydmljZS5Nb2RlLk1FU1NBR0UpOw0KLSAgICAgICByZXR1cm4gZGlzcGF0Y2g7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBTaW1wbGUgWE1ML0hUVFAgTWVzc2FnZSBUZXN0DQotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBEaXNwYXRjaDxTb3VyY2U+IGRpc3BhdGNoID0gZ2V0RGlzcGF0Y2goKTsNCi0gICAgICAgIFN0cmluZyByZXF1ZXN0ID0gWE1MX1RFWFQ7DQotICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBzdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ocmVxdWVzdC5nZXRCeXRlcygpKTsNCi0gICAgICAgIFNvdXJjZSBpblNvdXJjZSA9IG5ldyBTdHJlYW1Tb3VyY2UoKElucHV0U3RyZWFtKSBzdHJlYW0pOw0KLSAgICAgICAgDQotICAgICAgICBTb3VyY2Ugb3V0U291cmNlID0gZGlzcGF0Y2guaW52b2tlKGluU291cmNlKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gUHJlcGFyZSB0aGUgcmVzcG9uc2UgY29udGVudCBmb3IgY2hlY2tpbmcNCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlciByZWFkZXIgPSBpbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG91dFNvdXJjZSk7DQotICAgICAgICBSZWFkZXIyV3JpdGVyIHIydyA9IG5ldyBSZWFkZXIyV3JpdGVyKHJlYWRlcik7DQotICAgICAgICBTdHJpbmcgcmVzcG9uc2UgPSByMncuZ2V0QXNTdHJpbmcoKTsNCi0gICAgICAgIA0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZSAhPSBudWxsKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVxdWVzdC5lcXVhbHMocmVzcG9uc2UpKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gVGVzdCBhIHNlY29uZCB0aW1lIHRvIHZlcmlmeQ0KLSAgICAgICAgc3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHJlcXVlc3QuZ2V0Qnl0ZXMoKSk7DQotICAgICAgICBpblNvdXJjZSA9IG5ldyBTdHJlYW1Tb3VyY2UoKElucHV0U3RyZWFtKSBzdHJlYW0pOw0KLSAgICAgICAgDQotICAgICAgICBvdXRTb3VyY2UgPSBkaXNwYXRjaC5pbnZva2UoaW5Tb3VyY2UpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBQcmVwYXJlIHRoZSByZXNwb25zZSBjb250ZW50IGZvciBjaGVja2luZw0KLSAgICAgICAgcmVhZGVyID0gaW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihvdXRTb3VyY2UpOw0KLSAgICAgICAgcjJ3ID0gbmV3IFJlYWRlcjJXcml0ZXIocmVhZGVyKTsNCi0gICAgICAgIHJlc3BvbnNlID0gcjJ3LmdldEFzU3RyaW5nKCk7DQotICAgICAgICANCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UgIT0gbnVsbCk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlcXVlc3QuZXF1YWxzKHJlc3BvbnNlKSk7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRSZXF1ZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBEaXNwYXRjaDxTb3VyY2U+IGRpc3BhdGNoID0gZ2V0RGlzcGF0Y2goKTsNCi0NCi0gICAgICAgIC8vIHRoaXMgc2hvdWxkIGZhaWwNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgZGlzcGF0Y2guaW52b2tlKG51bGwpOw0KLSAgICAgICAgICAgIGZhaWwoIkRpZCBub3QgdGhyb3cgV2ViU2VydmljZUV4Y2VwdGlvbiIpOw0KLSAgICAgICAgfSBjYXRjaCAoV2ViU2VydmljZUV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgLy8gdGhhdCdzIHdoYXQgd2UgZXhwZWN0DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIC8vIHRoaXMgc2hvdWxkIHdvcmsgb2sNCi0gICAgICAgIGRpc3BhdGNoLmdldFJlcXVlc3RDb250ZXh0KCkucHV0KE1lc3NhZ2VDb250ZXh0LkhUVFBfUkVRVUVTVF9NRVRIT0QsICJHRVQiKTsgDQotICAgICAgICBTb3VyY2Ugb3V0U291cmNlID0gZGlzcGF0Y2guaW52b2tlKG51bGwpOw0KLSAgICAgICAgDQotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyID0gaW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihvdXRTb3VyY2UpOw0KLSAgICAgICAgUmVhZGVyMldyaXRlciByMncgPSBuZXcgUmVhZGVyMldyaXRlcihyZWFkZXIpOw0KLSAgICAgICAgU3RyaW5nIHJlc3BvbnNlID0gcjJ3LmdldEFzU3RyaW5nKCk7ICAgICAgICANCi0gICAgICAgIGFzc2VydEVxdWFscyhHRVRfUkVTUE9OU0UsIHJlc3BvbnNlKTsgICAgIA0KLSAgICAgICAgDQotICAgICAgICAvLyB0aGlzIHNob3VsZCBmYWlsIGFnYWluDQotICAgICAgICBkaXNwYXRjaC5nZXRSZXF1ZXN0Q29udGV4dCgpLnJlbW92ZShNZXNzYWdlQ29udGV4dC5IVFRQX1JFUVVFU1RfTUVUSE9EKTsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgZGlzcGF0Y2guaW52b2tlKG51bGwpOw0KLSAgICAgICAgICAgIGZhaWwoIkRpZCBub3QgdGhyb3cgV2ViU2VydmljZUV4Y2VwdGlvbiIpOw0KLSAgICAgICAgfSBjYXRjaCAoV2ViU2VydmljZUV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgLy8gdGhhdCdzIHdoYXQgd2UgZXhwZWN0DQotICAgICAgICB9DQotICAgIH0NCi0gICANCi19DQotDQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3htbGh0dHAvY2xpZW50VGVzdHMvZGlzcGF0Y2gvc291cmNlL0Rpc3BhdGNoWFBheWxvYWRTb3VyY2VUZXN0cy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3htbGh0dHAvY2xpZW50VGVzdHMvZGlzcGF0Y2gvc291cmNlL0Rpc3BhdGNoWFBheWxvYWRTb3VyY2VUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGI1NGVjLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy94bWxodHRwL2NsaWVudFRlc3RzL2Rpc3BhdGNoL3NvdXJjZS9EaXNwYXRjaFhQYXlsb2FkU291cmNlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MueG1saHR0cC5jbGllbnRUZXN0cy5kaXNwYXRjaC5zb3VyY2U7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmZyYW1ld29yay5BYnN0cmFjdFRlc3RDYXNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UudXRpbC5SZWFkZXIyV3JpdGVyOw0KLQ0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOw0KLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTElucHV0RmFjdG9yeTsNCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7DQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOw0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1Tb3VyY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5EaXNwYXRjaDsNCi1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5odHRwLkhUVFBCaW5kaW5nOw0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOw0KLQ0KLXB1YmxpYyBjbGFzcyBEaXNwYXRjaFhQYXlsb2FkU291cmNlVGVzdHMgZXh0ZW5kcyBBYnN0cmFjdFRlc3RDYXNlIHsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgWE1MSW5wdXRGYWN0b3J5IGlucHV0RmFjdG9yeSA9IFhNTElucHV0RmFjdG9yeS5uZXdJbnN0YW5jZSgpOw0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIEhPU1RQT1JUID0gImh0dHA6Ly9sb2NhbGhvc3Q6NjA2MCI7DQotICAgICAgICANCi0gICAgcHJpdmF0ZSBTdHJpbmcgRU5EUE9JTlRfVVJMID0gSE9TVFBPUlQgKyAiL2F4aXMyL3NlcnZpY2VzL1hNZXNzYWdlU291cmNlUHJvdmlkZXIuWE1lc3NhZ2VTb3VyY2VQcm92aWRlclBvcnQiOw0KLSAgICBwcml2YXRlIFFOYW1lIFNFUlZJQ0VfTkFNRSAgPSBuZXcgUU5hbWUoImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyIiwgIlhQYXlsb2FkU291cmNlUHJvdmlkZXIiKTsNCi0gICAgcHJpdmF0ZSBRTmFtZSBQT1JUX05BTUUgID0gbmV3IFFOYW1lKCJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMiIsICJYUGF5bG9hZFNvdXJjZVByb3ZpZGVyUG9ydCIpOw0KLSANCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFhNTF9URVhUID0gIjxwOmVjaG8geG1sbnM6cD1cImh0dHA6Ly9zYW1wbGVcIj5oZWxsbyB3b3JsZDwvcDplY2hvPiI7DQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBYTUxfVEVYVF9OUEUgPSAiPHA6ZWNobyB4bWxuczpwPVwiaHR0cDovL3NhbXBsZVwiPk5QRTwvcDplY2hvPiI7DQotICAgIA0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7DQotICAgICAgICByZXR1cm4gZ2V0VGVzdFNldHVwKG5ldyBUZXN0U3VpdGUoRGlzcGF0Y2hYUGF5bG9hZFNvdXJjZVRlc3RzLmNsYXNzKSk7DQotICAgIH0NCi0gIA0KLSAgICBwdWJsaWMgRGlzcGF0Y2g8U291cmNlPiBnZXREaXNwYXRjaCgpIHsNCi0gICAgICAgU2VydmljZSBzZXJ2aWNlID0gU2VydmljZS5jcmVhdGUoU0VSVklDRV9OQU1FKTsNCi0gICAgICAgc2VydmljZS5hZGRQb3J0KFBPUlRfTkFNRSwgSFRUUEJpbmRpbmcuSFRUUF9CSU5ESU5HLEVORFBPSU5UX1VSTCk7DQotICAgICAgIERpc3BhdGNoPFNvdXJjZT4gZGlzcGF0Y2ggPSBzZXJ2aWNlLmNyZWF0ZURpc3BhdGNoKFBPUlRfTkFNRSwgU291cmNlLmNsYXNzLCBTZXJ2aWNlLk1vZGUuUEFZTE9BRCk7DQotICAgICAgIHJldHVybiBkaXNwYXRjaDsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFNpbXBsZSBYTUwvSFRUUCBQYXlsb2FkIFRlc3QNCi0gICAgICogQHRocm93cyBFeGNlcHRpb24NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RTaW1wbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIERpc3BhdGNoPFNvdXJjZT4gZGlzcGF0Y2ggPSBnZXREaXNwYXRjaCgpOw0KLSAgICAgICAgU3RyaW5nIHJlcXVlc3QgPSBYTUxfVEVYVDsNCi0gICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIHN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShyZXF1ZXN0LmdldEJ5dGVzKCkpOw0KLSAgICAgICAgU291cmNlIGluU291cmNlID0gbmV3IFN0cmVhbVNvdXJjZSgoSW5wdXRTdHJlYW0pIHN0cmVhbSk7DQotICAgICAgICANCi0gICAgICAgIFNvdXJjZSBvdXRTb3VyY2UgPSBkaXNwYXRjaC5pbnZva2UoaW5Tb3VyY2UpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBQcmVwYXJlIHRoZSByZXNwb25zZSBjb250ZW50IGZvciBjaGVja2luZw0KLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHJlYWRlciA9IGlucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIob3V0U291cmNlKTsNCi0gICAgICAgIFJlYWRlcjJXcml0ZXIgcjJ3ID0gbmV3IFJlYWRlcjJXcml0ZXIocmVhZGVyKTsNCi0gICAgICAgIFN0cmluZyByZXNwb25zZSA9IHIydy5nZXRBc1N0cmluZygpOw0KLSAgICAgICAgDQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlICE9IG51bGwpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXF1ZXN0LmVxdWFscyhyZXNwb25zZSkpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBUcnkgYSBzZWNvbmQgdGltZSB0byB2ZXJpZnkNCi0gICAgICAgIHN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShyZXF1ZXN0LmdldEJ5dGVzKCkpOw0KLSAgICAgICAgaW5Tb3VyY2UgPSBuZXcgU3RyZWFtU291cmNlKChJbnB1dFN0cmVhbSkgc3RyZWFtKTsNCi0gICAgICAgIA0KLSAgICAgICAgb3V0U291cmNlID0gZGlzcGF0Y2guaW52b2tlKGluU291cmNlKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gUHJlcGFyZSB0aGUgcmVzcG9uc2UgY29udGVudCBmb3IgY2hlY2tpbmcNCi0gICAgICAgIHJlYWRlciA9IGlucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIob3V0U291cmNlKTsNCi0gICAgICAgIHIydyA9IG5ldyBSZWFkZXIyV3JpdGVyKHJlYWRlcik7DQotICAgICAgICByZXNwb25zZSA9IHIydy5nZXRBc1N0cmluZygpOw0KLSAgICAgICAgDQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlICE9IG51bGwpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXF1ZXN0LmVxdWFscyhyZXNwb25zZSkpOw0KLSAgICB9DQotICAgIA0KLSAgIA0KLX0NCi0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MveG1saHR0cC9jbGllbnRUZXN0cy9kaXNwYXRjaC9zdHJpbmcvRGlzcGF0Y2hYTWVzc2FnZVN0cmluZ1Rlc3RzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MveG1saHR0cC9jbGllbnRUZXN0cy9kaXNwYXRjaC9zdHJpbmcvRGlzcGF0Y2hYTWVzc2FnZVN0cmluZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkYjY4ZDkuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3htbGh0dHAvY2xpZW50VGVzdHMvZGlzcGF0Y2gvc3RyaW5nL0Rpc3BhdGNoWE1lc3NhZ2VTdHJpbmdUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MueG1saHR0cC5jbGllbnRUZXN0cy5kaXNwYXRjaC5zdHJpbmc7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLlRlc3RMb2dnZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZnJhbWV3b3JrLkFic3RyYWN0VGVzdENhc2U7DQotDQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5EaXNwYXRjaDsNCi1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5odHRwLkhUVFBCaW5kaW5nOw0KLQ0KLXB1YmxpYyBjbGFzcyBEaXNwYXRjaFhNZXNzYWdlU3RyaW5nVGVzdHMgZXh0ZW5kcyBBYnN0cmFjdFRlc3RDYXNlIHsNCi0NCi0gICAgcHVibGljIFN0cmluZyBIT1NUUE9SVCA9ICJodHRwOi8vbG9jYWxob3N0OjYwNjAiOw0KLSAgICAgICAgDQotICAgIHByaXZhdGUgU3RyaW5nIEVORFBPSU5UX1VSTCA9IEhPU1RQT1JUICsgIi9heGlzMi9zZXJ2aWNlcy9YTWVzc2FnZVN0cmluZ1Byb3ZpZGVyLlhNZXNzYWdlU3RyaW5nUHJvdmlkZXJQb3J0IjsNCi0gICAgcHJpdmF0ZSBRTmFtZSBTRVJWSUNFX05BTUUgID0gbmV3IFFOYW1lKCJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMiIsICJYTWVzc2FnZVN0cmluZ1Byb3ZpZGVyIik7DQotICAgIHByaXZhdGUgUU5hbWUgUE9SVF9OQU1FICA9IG5ldyBRTmFtZSgiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIiLCAiWE1lc3NhZ2VTdHJpbmdQcm92aWRlclBvcnQiKTsNCi0gDQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBYTUxfVEVYVCA9ICI8cDplY2hvIHhtbG5zOnA9XCJodHRwOi8vc2FtcGxlXCI+aGVsbG8gd29ybGQ8L3A6ZWNobz4iOw0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgWE1MX1RFWFRfTlBFID0gIjxwOmVjaG8geG1sbnM6cD1cImh0dHA6Ly9zYW1wbGVcIj5OUEU8L3A6ZWNobz4iOw0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7DQotICAgICAgICByZXR1cm4gZ2V0VGVzdFNldHVwKG5ldyBUZXN0U3VpdGUoRGlzcGF0Y2hYTWVzc2FnZVN0cmluZ1Rlc3RzLmNsYXNzKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIERpc3BhdGNoPFN0cmluZz4gZ2V0RGlzcGF0Y2goKSB7DQotICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IFNlcnZpY2UuY3JlYXRlKFNFUlZJQ0VfTkFNRSk7DQotICAgICAgIHNlcnZpY2UuYWRkUG9ydChQT1JUX05BTUUsIEhUVFBCaW5kaW5nLkhUVFBfQklORElORyxFTkRQT0lOVF9VUkwpOw0KLSAgICAgICBEaXNwYXRjaDxTdHJpbmc+IGRpc3BhdGNoID0gc2VydmljZS5jcmVhdGVEaXNwYXRjaChQT1JUX05BTUUsIFN0cmluZy5jbGFzcywgU2VydmljZS5Nb2RlLk1FU1NBR0UpOw0KLSAgICAgICByZXR1cm4gZGlzcGF0Y2g7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBTaW1wbGUgWE1ML0hUVFAgTWVzc2FnZSBUZXN0DQotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBEaXNwYXRjaDxTdHJpbmc+IGRpc3BhdGNoID0gZ2V0RGlzcGF0Y2goKTsNCi0gICAgICAgIFN0cmluZyByZXF1ZXN0ID0gWE1MX1RFWFQ7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiUmVxdWVzdCAgPSAiICsgcmVxdWVzdCk7DQotICAgICAgICBTdHJpbmcgcmVzcG9uc2UgPSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiUmVzcG9uc2UgPSAiICsgcmVzcG9uc2UpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZSAhPSBudWxsKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVxdWVzdC5lcXVhbHMocmVzcG9uc2UpKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gVHJ5IGEgc2Vjb25kIHRpbWUNCi0gICAgICAgIHJlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIlJlc3BvbnNlID0gIiArIHJlc3BvbnNlKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UgIT0gbnVsbCk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlcXVlc3QuZXF1YWxzKHJlc3BvbnNlKSk7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBUT0RPIE5lZWQgdG8gZml4IHRoZSBpbXBsZW1lbnRhdGlvbiBhbmQgdGVzdA0KLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgX3Rlc3RFbXB0eSgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgRGlzcGF0Y2g8U3RyaW5nPiBkaXNwYXRjaCA9IGdldERpc3BhdGNoKCk7DQotICAgICAgICBTdHJpbmcgcmVxdWVzdCA9ICIiOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIlJlcXVlc3QgID0gIiArIHJlcXVlc3QpOw0KLSAgICAgICAgU3RyaW5nIHJlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIlJlc3BvbnNlID0gIiArIHJlc3BvbnNlKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UgIT0gbnVsbCk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlcXVlc3QuZXF1YWxzKHJlc3BvbnNlKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIFRyeSBhZ2FpbiB0byB2ZXJpZnkNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJSZXF1ZXN0ICA9ICIgKyByZXF1ZXN0KTsNCi0gICAgICAgIHJlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIlJlc3BvbnNlID0gIiArIHJlc3BvbnNlKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UgIT0gbnVsbCk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlcXVlc3QuZXF1YWxzKHJlc3BvbnNlKSk7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBUT0RPIE5lZWQgdG8gZml4IHRoZSBpbXBsZW1lbnRhdGlvbiBhbmQgdGVzdA0KLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgX3Rlc3ROdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBEaXNwYXRjaDxTdHJpbmc+IGRpc3BhdGNoID0gZ2V0RGlzcGF0Y2goKTsNCi0gICAgICAgIFN0cmluZyByZXF1ZXN0ID0gbnVsbDsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJSZXF1ZXN0ICA9ICIgKyByZXF1ZXN0KTsNCi0gICAgICAgIFN0cmluZyByZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJSZXNwb25zZSA9ICIgKyByZXNwb25zZSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlICE9IG51bGwpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXF1ZXN0LmVxdWFscyhyZXNwb25zZSkpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBUcnkgYWdhaW4gdG8gdmVyaWZ5DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiUmVxdWVzdCAgPSAiICsgcmVxdWVzdCk7DQotICAgICAgICByZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJSZXNwb25zZSA9ICIgKyByZXNwb25zZSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlICE9IG51bGwpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXF1ZXN0LmVxdWFscyhyZXNwb25zZSkpOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogVE9ETyBOZWVkIHRvIGZpeCB0aGUgaW1wbGVtZW50YXRpb24gYW5kIHRlc3QNCi0gICAgICogQHRocm93cyBFeGNlcHRpb24NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIF90ZXN0RXhjZXB0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBEaXNwYXRjaDxTdHJpbmc+IGRpc3BhdGNoID0gZ2V0RGlzcGF0Y2goKTsNCi0gICAgICAgIFN0cmluZyByZXF1ZXN0ID0gWE1MX1RFWFRfTlBFOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIlJlcXVlc3QgID0gIiArIHJlcXVlc3QpOw0KLSAgICAgICAgU3RyaW5nIHJlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIlJlc3BvbnNlID0gIiArIHJlc3BvbnNlKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UgIT0gbnVsbCk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlcXVlc3QuZXF1YWxzKHJlc3BvbnNlKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIFRyeSBhZ2FpbiB0byB2ZXJpZnkNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJSZXF1ZXN0ICA9ICIgKyByZXF1ZXN0KTsNCi0gICAgICAgIHJlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIlJlc3BvbnNlID0gIiArIHJlc3BvbnNlKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UgIT0gbnVsbCk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlcXVlc3QuZXF1YWxzKHJlc3BvbnNlKSk7DQotICAgIH0NCi19DQotDQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3htbGh0dHAvY2xpZW50VGVzdHMvZGlzcGF0Y2gvc3RyaW5nL0Rpc3BhdGNoWFBheWxvYWRTdHJpbmdUZXN0cy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3htbGh0dHAvY2xpZW50VGVzdHMvZGlzcGF0Y2gvc3RyaW5nL0Rpc3BhdGNoWFBheWxvYWRTdHJpbmdUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZmYwMjc2Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy94bWxodHRwL2NsaWVudFRlc3RzL2Rpc3BhdGNoL3N0cmluZy9EaXNwYXRjaFhQYXlsb2FkU3RyaW5nVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnhtbGh0dHAuY2xpZW50VGVzdHMuZGlzcGF0Y2guc3RyaW5nOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5UZXN0TG9nZ2VyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmZyYW1ld29yay5BYnN0cmFjdFRlc3RDYXNlOw0KLQ0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOw0KLWltcG9ydCBqYXZheC54bWwud3MuRGlzcGF0Y2g7DQotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuaHR0cC5IVFRQQmluZGluZzsNCi0NCi1wdWJsaWMgY2xhc3MgRGlzcGF0Y2hYUGF5bG9hZFN0cmluZ1Rlc3RzIGV4dGVuZHMgQWJzdHJhY3RUZXN0Q2FzZSB7DQotDQotICAgIHB1YmxpYyBTdHJpbmcgSE9TVFBPUlQgPSAiaHR0cDovL2xvY2FsaG9zdDo2MDYwIjsNCi0gICAgICAgIA0KLSAgICBwcml2YXRlIFN0cmluZyBFTkRQT0lOVF9VUkwgPSBIT1NUUE9SVCArICIvYXhpczIvc2VydmljZXMvWFBheWxvYWRTdHJpbmdQcm92aWRlci5YUGF5bG9hZFN0cmluZ1Byb3ZpZGVyUG9ydCI7DQotICAgIHByaXZhdGUgUU5hbWUgU0VSVklDRV9OQU1FICA9IG5ldyBRTmFtZSgiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIiLCAiWFBheWxvYWRTdHJpbmdQcm92aWRlciIpOw0KLSAgICBwcml2YXRlIFFOYW1lIFBPUlRfTkFNRSAgPSBuZXcgUU5hbWUoImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyIiwgIlhQYXlsb2FkU3RyaW5nUHJvdmlkZXJQb3J0Iik7DQotIA0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgWE1MX1RFWFQgPSAiPHA6ZWNobyB4bWxuczpwPVwiaHR0cDovL3NhbXBsZVwiPmhlbGxvIHdvcmxkPC9wOmVjaG8+IjsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFhNTF9URVhUX05QRSA9ICI8cDplY2hvIHhtbG5zOnA9XCJodHRwOi8vc2FtcGxlXCI+TlBFPC9wOmVjaG8+IjsNCi0gICAgDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsNCi0gICAgICAgIHJldHVybiBnZXRUZXN0U2V0dXAobmV3IFRlc3RTdWl0ZShEaXNwYXRjaFhQYXlsb2FkU3RyaW5nVGVzdHMuY2xhc3MpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgRGlzcGF0Y2g8U3RyaW5nPiBnZXREaXNwYXRjaCgpIHsNCi0gICAgICAgU2VydmljZSBzZXJ2aWNlID0gU2VydmljZS5jcmVhdGUoU0VSVklDRV9OQU1FKTsNCi0gICAgICAgc2VydmljZS5hZGRQb3J0KFBPUlRfTkFNRSwgSFRUUEJpbmRpbmcuSFRUUF9CSU5ESU5HLEVORFBPSU5UX1VSTCk7DQotICAgICAgIERpc3BhdGNoPFN0cmluZz4gZGlzcGF0Y2ggPSBzZXJ2aWNlLmNyZWF0ZURpc3BhdGNoKFBPUlRfTkFNRSwgU3RyaW5nLmNsYXNzLCBTZXJ2aWNlLk1vZGUuUEFZTE9BRCk7DQotICAgICAgIHJldHVybiBkaXNwYXRjaDsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFNpbXBsZSBYTUwvSFRUUCBQYXlsb2FkIFRlc3QNCi0gICAgICogQHRocm93cyBFeGNlcHRpb24NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RTaW1wbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIERpc3BhdGNoPFN0cmluZz4gZGlzcGF0Y2ggPSBnZXREaXNwYXRjaCgpOw0KLSAgICAgICAgU3RyaW5nIHJlcXVlc3QgPSBYTUxfVEVYVDsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJSZXF1ZXN0ICA9ICIgKyByZXF1ZXN0KTsNCi0gICAgICAgIFN0cmluZyByZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJSZXNwb25zZSA9ICIgKyByZXNwb25zZSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlICE9IG51bGwpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXF1ZXN0LmVxdWFscyhyZXNwb25zZSkpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBUcnkgYWdhaW4gdG8gdmVyaWZ5DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiUmVxdWVzdCAgPSAiICsgcmVxdWVzdCk7DQotICAgICAgICByZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJSZXNwb25zZSA9ICIgKyByZXNwb25zZSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlICE9IG51bGwpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXF1ZXN0LmVxdWFscyhyZXNwb25zZSkpOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogVE9ETyBOZWVkIHRvIGZpeCB0aGUgaW1wbGVtZW50YXRpb24gYW5kIHRlc3QNCi0gICAgICogQHRocm93cyBFeGNlcHRpb24NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIF90ZXN0RW1wdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIERpc3BhdGNoPFN0cmluZz4gZGlzcGF0Y2ggPSBnZXREaXNwYXRjaCgpOw0KLSAgICAgICAgU3RyaW5nIHJlcXVlc3QgPSAiIjsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJSZXF1ZXN0ICA9ICIgKyByZXF1ZXN0KTsNCi0gICAgICAgIFN0cmluZyByZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJSZXNwb25zZSA9ICIgKyByZXNwb25zZSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlICE9IG51bGwpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXF1ZXN0LmVxdWFscyhyZXNwb25zZSkpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBUcnkgYWdhaW4gdG8gdmVyaWZ5DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiUmVxdWVzdCAgPSAiICsgcmVxdWVzdCk7DQotICAgICAgICByZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJSZXNwb25zZSA9ICIgKyByZXNwb25zZSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlICE9IG51bGwpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXF1ZXN0LmVxdWFscyhyZXNwb25zZSkpOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogVE9ETyBOZWVkIHRvIGZpeCB0aGUgaW1wbGVtZW50YXRpb24gYW5kIHRlc3QNCi0gICAgICogQHRocm93cyBFeGNlcHRpb24NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIF90ZXN0TnVsbCgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgRGlzcGF0Y2g8U3RyaW5nPiBkaXNwYXRjaCA9IGdldERpc3BhdGNoKCk7DQotICAgICAgICBTdHJpbmcgcmVxdWVzdCA9IG51bGw7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiUmVxdWVzdCAgPSAiICsgcmVxdWVzdCk7DQotICAgICAgICBTdHJpbmcgcmVzcG9uc2UgPSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiUmVzcG9uc2UgPSAiICsgcmVzcG9uc2UpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZSAhPSBudWxsKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVxdWVzdC5lcXVhbHMocmVzcG9uc2UpKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gVHJ5IGFnYWluIHRvIHZlcmlmeQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIlJlcXVlc3QgID0gIiArIHJlcXVlc3QpOw0KLSAgICAgICAgcmVzcG9uc2UgPSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiUmVzcG9uc2UgPSAiICsgcmVzcG9uc2UpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZSAhPSBudWxsKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVxdWVzdC5lcXVhbHMocmVzcG9uc2UpKTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFRPRE8gTmVlZCB0byBmaXggdGhlIGltcGxlbWVudGF0aW9uIGFuZCB0ZXN0DQotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBfdGVzdEV4Y2VwdGlvbigpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgRGlzcGF0Y2g8U3RyaW5nPiBkaXNwYXRjaCA9IGdldERpc3BhdGNoKCk7DQotICAgICAgICBTdHJpbmcgcmVxdWVzdCA9IFhNTF9URVhUX05QRTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJSZXF1ZXN0ICA9ICIgKyByZXF1ZXN0KTsNCi0gICAgICAgIFN0cmluZyByZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJSZXNwb25zZSA9ICIgKyByZXNwb25zZSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlICE9IG51bGwpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXF1ZXN0LmVxdWFscyhyZXNwb25zZSkpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBUcnkgYWdhaW4gdG8gdmVyaWZ5DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiUmVxdWVzdCAgPSAiICsgcmVxdWVzdCk7DQotICAgICAgICByZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJSZXNwb25zZSA9ICIgKyByZXNwb25zZSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlICE9IG51bGwpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXF1ZXN0LmVxdWFscyhyZXNwb25zZSkpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy94bWxodHRwL3Byb3ZpZGVyL21lc3NhZ2UvZGF0YXNvdXJjZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy94bWxodHRwL3Byb3ZpZGVyL21lc3NhZ2UvZGF0YXNvdXJjZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ4ZjFiZC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MveG1saHR0cC9wcm92aWRlci9tZXNzYWdlL2RhdGFzb3VyY2UvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MveG1saHR0cC9wcm92aWRlci9tZXNzYWdlL2RhdGFzb3VyY2UvWE1lc3NhZ2VEYXRhU291cmNlUHJvdmlkZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy94bWxodHRwL3Byb3ZpZGVyL21lc3NhZ2UvZGF0YXNvdXJjZS9YTWVzc2FnZURhdGFTb3VyY2VQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTZiNzdhLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy94bWxodHRwL3Byb3ZpZGVyL21lc3NhZ2UvZGF0YXNvdXJjZS9YTWVzc2FnZURhdGFTb3VyY2VQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy54bWxodHRwLnByb3ZpZGVyLm1lc3NhZ2UuZGF0YXNvdXJjZTsNCi0NCi1pbXBvcnQgamF2YXguYWN0aXZhdGlvbi5EYXRhU291cmNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuQmluZGluZ1R5cGU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5Qcm92aWRlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlTW9kZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VQcm92aWRlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VDb250ZXh0Ow0KLWltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5NZXNzYWdlQ29udGV4dDsNCi1pbXBvcnQgamF2YXgueG1sLndzLmh0dHAuSFRUUEJpbmRpbmc7DQotaW1wb3J0IGphdmF4LmFubm90YXRpb24uUmVzb3VyY2U7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogU2FtcGxlIFhNTC9IVFRQIERhdGFTb3VyY2UgUHJvdmlkZXIgDQotICovDQotQFdlYlNlcnZpY2VQcm92aWRlcihzZXJ2aWNlTmFtZT0iWE1lc3NhZ2VEYXRhU291cmNlUHJvdmlkZXIiKQ0KLUBCaW5kaW5nVHlwZShIVFRQQmluZGluZy5IVFRQX0JJTkRJTkcpDQotQFNlcnZpY2VNb2RlKHZhbHVlPVNlcnZpY2UuTW9kZS5NRVNTQUdFKQ0KLXB1YmxpYyBjbGFzcyBYTWVzc2FnZURhdGFTb3VyY2VQcm92aWRlciBpbXBsZW1lbnRzIFByb3ZpZGVyPERhdGFTb3VyY2U+IHsNCi0gICAgQFJlc291cmNlDQotICAgIFdlYlNlcnZpY2VDb250ZXh0IHdzQ29udGV4dDsNCi0gICAgDQotICAgIHB1YmxpYyBEYXRhU291cmNlIGludm9rZShEYXRhU291cmNlIGlucHV0KSB7DQotICAgICAgICBNZXNzYWdlQ29udGV4dCBjdHggPSB3c0NvbnRleHQuZ2V0TWVzc2FnZUNvbnRleHQoKTsNCi0gICAgICAgIE1hcCBhdHRhY2htZW50cyA9IChNYXApIGN0eC5nZXQoTWVzc2FnZUNvbnRleHQuSU5CT1VORF9NRVNTQUdFX0FUVEFDSE1FTlRTKTsNCi0gICAgICAgIGN0eC5wdXQoTWVzc2FnZUNvbnRleHQuT1VUQk9VTkRfTUVTU0FHRV9BVFRBQ0hNRU5UUywgYXR0YWNobWVudHMpOw0KLSAgICAgICAgcmV0dXJuIGlucHV0Ow0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy94bWxodHRwL3Byb3ZpZGVyL21lc3NhZ2Uvc291cmNlL01FVEEtSU5GL01BTklGRVNULk1GIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3htbGh0dHAvcHJvdmlkZXIvbWVzc2FnZS9zb3VyY2UvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0OGYxYmQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3htbGh0dHAvcHJvdmlkZXIvbWVzc2FnZS9zb3VyY2UvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MveG1saHR0cC9wcm92aWRlci9tZXNzYWdlL3NvdXJjZS9YTWVzc2FnZVNvdXJjZVByb3ZpZGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MveG1saHR0cC9wcm92aWRlci9tZXNzYWdlL3NvdXJjZS9YTWVzc2FnZVNvdXJjZVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxYjZhZDIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3htbGh0dHAvcHJvdmlkZXIvbWVzc2FnZS9zb3VyY2UvWE1lc3NhZ2VTb3VyY2VQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy54bWxodHRwLnByb3ZpZGVyLm1lc3NhZ2Uuc291cmNlOw0KLQ0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOw0KLQ0KLWltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlJlc291cmNlOw0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsNCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtU291cmNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuQmluZGluZ1R5cGU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5Qcm92aWRlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlTW9kZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VDb250ZXh0Ow0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZVByb3ZpZGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuaHR0cC5IVFRQQmluZGluZzsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5IVFRQQ29uc3RhbnRzOw0KLQ0KLS8qKg0KLSAqIFNhbXBsZSBYTUwvSFRUUCBTdHJpbmcgUHJvdmlkZXIgDQotICovDQotQFdlYlNlcnZpY2VQcm92aWRlcihzZXJ2aWNlTmFtZT0iWE1lc3NhZ2VTb3VyY2VQcm92aWRlciIpDQotQEJpbmRpbmdUeXBlKEhUVFBCaW5kaW5nLkhUVFBfQklORElORykNCi1AU2VydmljZU1vZGUodmFsdWU9U2VydmljZS5Nb2RlLk1FU1NBR0UpDQotcHVibGljIGNsYXNzIFhNZXNzYWdlU291cmNlUHJvdmlkZXIgaW1wbGVtZW50cyBQcm92aWRlcjxTb3VyY2U+IHsNCi0NCi0gICAgQFJlc291cmNlDQotICAgIHB1YmxpYyBXZWJTZXJ2aWNlQ29udGV4dCBjdHg7DQotICAgIA0KLSAgICBwdWJsaWMgU291cmNlIGludm9rZShTb3VyY2UgaW5wdXQpIHsNCi0gICAgICAgIFN0cmluZyBtZXRob2QgPSAoU3RyaW5nKWN0eC5nZXRNZXNzYWdlQ29udGV4dCgpLmdldChIVFRQQ29uc3RhbnRzLkhUVFBfTUVUSE9EKTsNCi0gICAgICAgIGlmIChpbnB1dCA9PSBudWxsKSB7DQotICAgICAgICAgICAgU3RyaW5nIHJlcXVlc3QgPSAiPHJlc3BvbnNlPiIgKyBtZXRob2QgKyAiPC9yZXNwb25zZT4iOw0KLSAgICAgICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIHN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShyZXF1ZXN0LmdldEJ5dGVzKCkpOw0KLSAgICAgICAgICAgIGlucHV0ID0gbmV3IFN0cmVhbVNvdXJjZSgoSW5wdXRTdHJlYW0pIHN0cmVhbSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gaW5wdXQ7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3htbGh0dHAvcHJvdmlkZXIvbWVzc2FnZS9zdHJpbmcvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MveG1saHR0cC9wcm92aWRlci9tZXNzYWdlL3N0cmluZy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ4ZjFiZC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MveG1saHR0cC9wcm92aWRlci9tZXNzYWdlL3N0cmluZy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy94bWxodHRwL3Byb3ZpZGVyL21lc3NhZ2Uvc3RyaW5nL1hNZXNzYWdlU3RyaW5nUHJvdmlkZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy94bWxodHRwL3Byb3ZpZGVyL21lc3NhZ2Uvc3RyaW5nL1hNZXNzYWdlU3RyaW5nUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTAyOGM4ZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MveG1saHR0cC9wcm92aWRlci9tZXNzYWdlL3N0cmluZy9YTWVzc2FnZVN0cmluZ1Byb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnhtbGh0dHAucHJvdmlkZXIubWVzc2FnZS5zdHJpbmc7DQotDQotaW1wb3J0IGphdmF4LnhtbC53cy5CaW5kaW5nVHlwZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLlByb3ZpZGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2VNb2RlOw0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZVByb3ZpZGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuaHR0cC5IVFRQQmluZGluZzsNCi0NCi0vKioNCi0gKiBTYW1wbGUgWE1ML0hUVFAgU3RyaW5nIFByb3ZpZGVyIA0KLSAqLw0KLUBXZWJTZXJ2aWNlUHJvdmlkZXIoc2VydmljZU5hbWU9IlhNZXNzYWdlU3RyaW5nUHJvdmlkZXIiKQ0KLUBCaW5kaW5nVHlwZShIVFRQQmluZGluZy5IVFRQX0JJTkRJTkcpDQotQFNlcnZpY2VNb2RlKHZhbHVlPVNlcnZpY2UuTW9kZS5NRVNTQUdFKQ0KLXB1YmxpYyBjbGFzcyBYTWVzc2FnZVN0cmluZ1Byb3ZpZGVyIGltcGxlbWVudHMgUHJvdmlkZXI8U3RyaW5nPiB7DQotDQotICAgIHB1YmxpYyBTdHJpbmcgaW52b2tlKFN0cmluZyBpbnB1dCkgew0KLSAgICAgICAgaWYgKGlucHV0LmNvbnRhaW5zKCJOUEUiKSkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiTlBFIFRocm93biEiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBpbnB1dDsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MveG1saHR0cC9wcm92aWRlci9wYXlsb2FkL3NvdXJjZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy94bWxodHRwL3Byb3ZpZGVyL3BheWxvYWQvc291cmNlL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDhmMWJkLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy94bWxodHRwL3Byb3ZpZGVyL3BheWxvYWQvc291cmNlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3htbGh0dHAvcHJvdmlkZXIvcGF5bG9hZC9zb3VyY2UvWFBheWxvYWRTb3VyY2VQcm92aWRlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3htbGh0dHAvcHJvdmlkZXIvcGF5bG9hZC9zb3VyY2UvWFBheWxvYWRTb3VyY2VQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzUxMzFhLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy94bWxodHRwL3Byb3ZpZGVyL3BheWxvYWQvc291cmNlL1hQYXlsb2FkU291cmNlUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MueG1saHR0cC5wcm92aWRlci5wYXlsb2FkLnNvdXJjZTsNCi0NCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5CaW5kaW5nVHlwZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLlByb3ZpZGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZVByb3ZpZGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuaHR0cC5IVFRQQmluZGluZzsNCi0NCi0vKioNCi0gKiBTYW1wbGUgWE1ML0hUVFAgU3RyaW5nIFByb3ZpZGVyIA0KLSAqLw0KLUBXZWJTZXJ2aWNlUHJvdmlkZXIoc2VydmljZU5hbWU9IlhQYXlsb2FkU291cmNlUHJvdmlkZXIiKQ0KLUBCaW5kaW5nVHlwZShIVFRQQmluZGluZy5IVFRQX0JJTkRJTkcpDQotcHVibGljIGNsYXNzIFhQYXlsb2FkU291cmNlUHJvdmlkZXIgaW1wbGVtZW50cyBQcm92aWRlcjxTb3VyY2U+IHsNCi0NCi0gICAgcHVibGljIFNvdXJjZSBpbnZva2UoU291cmNlIGlucHV0KSB7DQotICAgICAgICByZXR1cm4gaW5wdXQ7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3htbGh0dHAvcHJvdmlkZXIvcGF5bG9hZC9zdHJpbmcvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MveG1saHR0cC9wcm92aWRlci9wYXlsb2FkL3N0cmluZy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ4ZjFiZC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MveG1saHR0cC9wcm92aWRlci9wYXlsb2FkL3N0cmluZy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy94bWxodHRwL3Byb3ZpZGVyL3BheWxvYWQvc3RyaW5nL1hQYXlsb2FkU3RyaW5nUHJvdmlkZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy94bWxodHRwL3Byb3ZpZGVyL3BheWxvYWQvc3RyaW5nL1hQYXlsb2FkU3RyaW5nUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDc2NzgzOS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MveG1saHR0cC9wcm92aWRlci9wYXlsb2FkL3N0cmluZy9YUGF5bG9hZFN0cmluZ1Byb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnhtbGh0dHAucHJvdmlkZXIucGF5bG9hZC5zdHJpbmc7DQotDQotaW1wb3J0IGphdmF4LnhtbC53cy5CaW5kaW5nVHlwZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLlByb3ZpZGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZVByb3ZpZGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuaHR0cC5IVFRQQmluZGluZzsNCi0NCi0vKioNCi0gKiBTYW1wbGUgWE1ML0hUVFAgU3RyaW5nIFByb3ZpZGVyIA0KLSAqLw0KLUBXZWJTZXJ2aWNlUHJvdmlkZXIoc2VydmljZU5hbWU9IlhQYXlsb2FkU3RyaW5nUHJvdmlkZXIiKQ0KLUBCaW5kaW5nVHlwZShIVFRQQmluZGluZy5IVFRQX0JJTkRJTkcpDQotcHVibGljIGNsYXNzIFhQYXlsb2FkU3RyaW5nUHJvdmlkZXIgaW1wbGVtZW50cyBQcm92aWRlcjxTdHJpbmc+IHsNCi0NCi0gICAgcHVibGljIFN0cmluZyBpbnZva2UoU3RyaW5nIGlucHV0KSB7DQotICAgICAgICBpZiAoaW5wdXQuY29udGFpbnMoIk5QRSIpKSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJOUEUgVGhyb3duISIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGlucHV0Ow0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS93cy9heGlzMi90ZXN0cy9FY2hvLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvd3MvYXhpczIvdGVzdHMvRWNoby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzc2NmNlLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS93cy9heGlzMi90ZXN0cy9FY2hvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0NCi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLndzLmF4aXMyLnRlc3RzOw0KLQ0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7DQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOw0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnQ7DQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZTsNCi0NCi0NCi0vKioNCi0gKiA8cD5KYXZhIGNsYXNzIGZvciBlY2hvIGNvbXBsZXggdHlwZS4NCi0gKiANCi0gKiA8cD5UaGUgZm9sbG93aW5nIHNjaGVtYSBmcmFnbWVudCBzcGVjaWZpZXMgdGhlIGV4cGVjdGVkIGNvbnRlbnQgY29udGFpbmVkIHdpdGhpbiB0aGlzIGNsYXNzLg0KLSAqIA0KLSAqIDxwcmU+DQotICogJmx0O2NvbXBsZXhUeXBlIG5hbWU9ImVjaG8iPg0KLSAqICAgJmx0O2NvbXBsZXhDb250ZW50Pg0KLSAqICAgICAmbHQ7cmVzdHJpY3Rpb24gYmFzZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfWFueVR5cGUiPg0KLSAqICAgICAgICZsdDtzZXF1ZW5jZT4NCi0gKiAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9InRleHQiIHR5cGU9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1zdHJpbmciLz4NCi0gKiAgICAgICAmbHQ7L3NlcXVlbmNlPg0KLSAqICAgICAmbHQ7L3Jlc3RyaWN0aW9uPg0KLSAqICAgJmx0Oy9jb21wbGV4Q29udGVudD4NCi0gKiAmbHQ7L2NvbXBsZXhUeXBlPg0KLSAqIDwvcHJlPg0KLSAqIA0KLSAqIA0KLSAqLw0KLUBYbWxBY2Nlc3NvclR5cGUoWG1sQWNjZXNzVHlwZS5GSUVMRCkNCi1AWG1sVHlwZShuYW1lID0gImVjaG8iLCBwcm9wT3JkZXIgPSB7DQotICAgICJ0ZXh0Ig0KLX0pDQotcHVibGljIGNsYXNzIEVjaG8gew0KLQ0KLSAgICBAWG1sRWxlbWVudChyZXF1aXJlZCA9IHRydWUsIG5pbGxhYmxlID0gdHJ1ZSkNCi0gICAgcHJvdGVjdGVkIFN0cmluZyB0ZXh0Ow0KLQ0KLSAgICAvKioNCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIHRleHQgcHJvcGVydHkuDQotICAgICAqIA0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICBwb3NzaWJsZSBvYmplY3QgaXMNCi0gICAgICogICAgIHtAbGluayBTdHJpbmcgfQ0KLSAgICAgKiAgICAgDQotICAgICAqLw0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7DQotICAgICAgICByZXR1cm4gdGV4dDsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHRleHQgcHJvcGVydHkuDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gdmFsdWUNCi0gICAgICogICAgIGFsbG93ZWQgb2JqZWN0IGlzDQotICAgICAqICAgICB7QGxpbmsgU3RyaW5nIH0NCi0gICAgICogICAgIA0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgdmFsdWUpIHsNCi0gICAgICAgIHRoaXMudGV4dCA9IHZhbHVlOw0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS93cy9heGlzMi90ZXN0cy9FY2hvUG9ydC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL3dzL2F4aXMyL3Rlc3RzL0VjaG9Qb3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxZDNhZjcuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL3dzL2F4aXMyL3Rlc3RzL0VjaG9Qb3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0NCi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLndzLmF4aXMyLnRlc3RzOw0KLQ0KLWltcG9ydCBqYXZheC5qd3MuV2ViTWV0aG9kOw0KLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW07DQotaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbS5Nb2RlOw0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLkhvbGRlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLlJlcXVlc3RXcmFwcGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuUmVzcG9uc2VXcmFwcGVyOw0KLQ0KLQ0KLS8qKg0KLSAqIFRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBieSB0aGUgSkFYV1MgU0kuDQotICogSkFYLVdTIFJJIDIuMC1iMjYtZWEzDQotICogR2VuZXJhdGVkIHNvdXJjZSB2ZXJzaW9uOiAyLjANCi0gKiANCi0gKi8NCi1AV2ViU2VydmljZShuYW1lID0gIkVjaG9Qb3J0IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL3Rlc3RzIiwgd3NkbExvY2F0aW9uID0gIlxcd29ya1xcYXBwc1xcZWNsaXBzZVxcd29ya3NwYWNlXFxheGlzMi1saXZlXFxtb2R1bGVzXFxqYXh3c1xcdGVzdC1yZXNvdXJjZXNcXHdzZGxcXFdTRExUZXN0cy53c2RsIikNCi1wdWJsaWMgaW50ZXJmYWNlIEVjaG9Qb3J0IHsNCi0NCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gdGV4dA0KLSAgICAgKi8NCi0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lID0gIkVjaG8iLCBhY3Rpb24gPSAiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvdGVzdHMvZWNobyIpDQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAiRWNobyIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi90ZXN0cyIsIGNsYXNzTmFtZSA9ICJvcmcuYXBhY2hlLndzLmF4aXMyLnRlc3RzLkVjaG8iKQ0KLSAgICBAUmVzcG9uc2VXcmFwcGVyKGxvY2FsTmFtZSA9ICJFY2hvUmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvdGVzdHMiLCBjbGFzc05hbWUgPSAib3JnLmFwYWNoZS53cy5heGlzMi50ZXN0cy5FY2hvUmVzcG9uc2UiKQ0KLSAgICBwdWJsaWMgdm9pZCBlY2hvKA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAidGV4dCIsIHRhcmdldE5hbWVzcGFjZSA9ICIiLCBtb2RlID0gTW9kZS5JTk9VVCkNCi0gICAgICAgIEhvbGRlcjxTdHJpbmc+IHRleHQpOw0KLQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvd3MvYXhpczIvdGVzdHMvRWNob1Jlc3BvbnNlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvd3MvYXhpczIvdGVzdHMvRWNob1Jlc3BvbnNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiMWNmZTYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL3dzL2F4aXMyL3Rlc3RzL0VjaG9SZXNwb25zZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotDQotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS53cy5heGlzMi50ZXN0czsNCi0NCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOw0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZTsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50Ow0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGU7DQotDQotDQotLyoqDQotICogPHA+SmF2YSBjbGFzcyBmb3IgZWNob1Jlc3BvbnNlIGNvbXBsZXggdHlwZS4NCi0gKiANCi0gKiA8cD5UaGUgZm9sbG93aW5nIHNjaGVtYSBmcmFnbWVudCBzcGVjaWZpZXMgdGhlIGV4cGVjdGVkIGNvbnRlbnQgY29udGFpbmVkIHdpdGhpbiB0aGlzIGNsYXNzLg0KLSAqIA0KLSAqIDxwcmU+DQotICogJmx0O2NvbXBsZXhUeXBlIG5hbWU9ImVjaG9SZXNwb25zZSI+DQotICogICAmbHQ7Y29tcGxleENvbnRlbnQ+DQotICogICAgICZsdDtyZXN0cmljdGlvbiBiYXNlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9YW55VHlwZSI+DQotICogICAgICAgJmx0O3NlcXVlbmNlPg0KLSAqICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0idGV4dCIgdHlwZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfXN0cmluZyIvPg0KLSAqICAgICAgICZsdDsvc2VxdWVuY2U+DQotICogICAgICZsdDsvcmVzdHJpY3Rpb24+DQotICogICAmbHQ7L2NvbXBsZXhDb250ZW50Pg0KLSAqICZsdDsvY29tcGxleFR5cGU+DQotICogPC9wcmU+DQotICogDQotICogDQotICovDQotQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKQ0KLUBYbWxUeXBlKG5hbWUgPSAiZWNob1Jlc3BvbnNlIiwgcHJvcE9yZGVyID0gew0KLSAgICAidGV4dCINCi19KQ0KLXB1YmxpYyBjbGFzcyBFY2hvUmVzcG9uc2Ugew0KLQ0KLSAgICBAWG1sRWxlbWVudChyZXF1aXJlZCA9IHRydWUsIG5pbGxhYmxlID0gdHJ1ZSkNCi0gICAgcHJvdGVjdGVkIFN0cmluZyB0ZXh0Ow0KLQ0KLSAgICAvKioNCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIHRleHQgcHJvcGVydHkuDQotICAgICAqIA0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICBwb3NzaWJsZSBvYmplY3QgaXMNCi0gICAgICogICAgIHtAbGluayBTdHJpbmcgfQ0KLSAgICAgKiAgICAgDQotICAgICAqLw0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7DQotICAgICAgICByZXR1cm4gdGV4dDsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHRleHQgcHJvcGVydHkuDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gdmFsdWUNCi0gICAgICogICAgIGFsbG93ZWQgb2JqZWN0IGlzDQotICAgICAqICAgICB7QGxpbmsgU3RyaW5nIH0NCi0gICAgICogICAgIA0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgdmFsdWUpIHsNCi0gICAgICAgIHRoaXMudGV4dCA9IHZhbHVlOw0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS93cy9heGlzMi90ZXN0cy9FY2hvU2VydmljZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL3dzL2F4aXMyL3Rlc3RzL0VjaG9TZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhNDJkNjguLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL3dzL2F4aXMyL3Rlc3RzL0VjaG9TZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0NCi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLndzLmF4aXMyLnRlc3RzOw0KLQ0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOw0KLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLldlYkVuZHBvaW50Ow0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUNsaWVudDsNCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLm5ldC5VUkw7DQotDQotLyoqDQotICogVGhpcyBjbGFzcyB3YXMgZ2VuZXJhdGVkIGJ5IHRoZSBKQVhXUyBTSS4NCi0gKiBKQVgtV1MgUkkgMi4wLWIyNi1lYTMNCi0gKiBHZW5lcmF0ZWQgc291cmNlIHZlcnNpb246IDIuMA0KLSAqIA0KLSAqLw0KLUBXZWJTZXJ2aWNlQ2xpZW50KG5hbWUgPSAiRWNob1NlcnZpY2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvdGVzdHMiLCB3c2RsTG9jYXRpb24gPSAiXFx3b3JrXFxhcHBzXFxlY2xpcHNlXFx3b3Jrc3BhY2VcXGF4aXMyLWxpdmVcXG1vZHVsZXNcXGpheHdzXFx0ZXN0LXJlc291cmNlc1xcd3NkbFxcV1NETFRlc3RzLndzZGwiKQ0KLXB1YmxpYyBjbGFzcyBFY2hvU2VydmljZQ0KLSAgICBleHRlbmRzIFNlcnZpY2UNCi17DQotDQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFVSTCBXU0RMX0xPQ0FUSU9OOw0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBRTmFtZSBFQ0hPU0VSVklDRSA9IG5ldyBRTmFtZSgiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvdGVzdHMiLCAiRWNob1NlcnZpY2UiKTsNCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgUU5hbWUgRUNIT1BPUlQgPSBuZXcgUU5hbWUoImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL3Rlc3RzIiwgIkVjaG9Qb3J0Iik7DQotDQotICAgIHN0YXRpYyB7DQotICAgICAgICBVUkwgdXJsID0gbnVsbDsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgdXJsID0gbmV3IFVSTCgiZmlsZTovQzovd29yay9hcHBzL2VjbGlwc2Uvd29ya3NwYWNlL2F4aXMyLWxpdmUvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy93c2RsL1dTRExUZXN0cy53c2RsIik7DQotICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICB9DQotICAgICAgICBXU0RMX0xPQ0FUSU9OID0gdXJsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBFY2hvU2VydmljZShVUkwgd3NkbExvY2F0aW9uLCBRTmFtZSBzZXJ2aWNlTmFtZSkgew0KLSAgICAgICAgc3VwZXIod3NkbExvY2F0aW9uLCBzZXJ2aWNlTmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEVjaG9TZXJ2aWNlKCkgew0KLSAgICAgICAgc3VwZXIoV1NETF9MT0NBVElPTiwgRUNIT1NFUlZJQ0UpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBFY2hvUG9ydA0KLSAgICAgKi8NCi0gICAgQFdlYkVuZHBvaW50KG5hbWUgPSAiRWNob1BvcnQiKQ0KLSAgICBwdWJsaWMgRWNob1BvcnQgZ2V0RWNob1BvcnQoKSB7DQotICAgICAgICByZXR1cm4gKEVjaG9Qb3J0KXN1cGVyLmdldFBvcnQoRUNIT1BPUlQsIEVjaG9Qb3J0LmNsYXNzKTsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvd3MvYXhpczIvdGVzdHMvRWNob1NlcnZpY2VJbXBsV2l0aFNFSS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL3dzL2F4aXMyL3Rlc3RzL0VjaG9TZXJ2aWNlSW1wbFdpdGhTRUkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2YxMjI0OS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvd3MvYXhpczIvdGVzdHMvRWNob1NlcnZpY2VJbXBsV2l0aFNFSS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS53cy5heGlzMi50ZXN0czsNCi0NCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5Ib2xkZXI7DQotDQotLyoqDQotICogDQotICovDQotQFdlYlNlcnZpY2Uoc2VydmljZU5hbWUgPSAiRWNob1NlcnZpY2UiLCBlbmRwb2ludEludGVyZmFjZT0ib3JnLmFwYWNoZS53cy5heGlzMi50ZXN0cy5FY2hvUG9ydCIpDQotcHVibGljIGNsYXNzIEVjaG9TZXJ2aWNlSW1wbFdpdGhTRUkgew0KLSAgICAvLyBUT0RPOiBUZXN0IGFsbCBjb25kaXRpb25zIGluIEpTUi0xODEgc3BlYyBTZWMgMy4xIHAxMw0KLSAgICBwdWJsaWMgdm9pZCBlY2hvKEhvbGRlcjxTdHJpbmc+IHRleHQpIHsNCi0gICAgICAgIHRleHQudmFsdWUgPSAiRWNobyAiICsgdGV4dC52YWx1ZTsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvd3MvYXhpczIvdGVzdHMvT2JqZWN0RmFjdG9yeS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL3dzL2F4aXMyL3Rlc3RzL09iamVjdEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI1MGY4Ni4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvd3MvYXhpczIvdGVzdHMvT2JqZWN0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotDQotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS53cy5heGlzMi50ZXN0czsNCi0NCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkVsZW1lbnQ7DQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudERlY2w7DQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUmVnaXN0cnk7DQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotDQotDQotLyoqDQotICogVGhpcyBvYmplY3QgY29udGFpbnMgZmFjdG9yeSBtZXRob2RzIGZvciBlYWNoIA0KLSAqIEphdmEgY29udGVudCBpbnRlcmZhY2UgYW5kIEphdmEgZWxlbWVudCBpbnRlcmZhY2UgDQotICogZ2VuZXJhdGVkIGluIHRoZSBvcmcuYXBhY2hlLndzLmF4aXMyLnRlc3RzIHBhY2thZ2UuIA0KLSAqIDxwPkFuIE9iamVjdEZhY3RvcnkgYWxsb3dzIHlvdSB0byBwcm9ncmFtYXRpY2FsbHkgDQotICogY29uc3RydWN0IG5ldyBpbnN0YW5jZXMgb2YgdGhlIEphdmEgcmVwcmVzZW50YXRpb24gDQotICogZm9yIFhNTCBjb250ZW50LiBUaGUgSmF2YSByZXByZXNlbnRhdGlvbiBvZiBYTUwgDQotICogY29udGVudCBjYW4gY29uc2lzdCBvZiBzY2hlbWEgZGVyaXZlZCBpbnRlcmZhY2VzIA0KLSAqIGFuZCBjbGFzc2VzIHJlcHJlc2VudGluZyB0aGUgYmluZGluZyBvZiBzY2hlbWEgDQotICogdHlwZSBkZWZpbml0aW9ucywgZWxlbWVudCBkZWNsYXJhdGlvbnMgYW5kIG1vZGVsIA0KLSAqIGdyb3Vwcy4gIEZhY3RvcnkgbWV0aG9kcyBmb3IgZWFjaCBvZiB0aGVzZSBhcmUgDQotICogcHJvdmlkZWQgaW4gdGhpcyBjbGFzcy4NCi0gKiANCi0gKi8NCi1AWG1sUmVnaXN0cnkNCi1wdWJsaWMgY2xhc3MgT2JqZWN0RmFjdG9yeSB7DQotDQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFFOYW1lIF9FY2hvUmVzcG9uc2VfUU5BTUUgPSBuZXcgUU5hbWUoImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL3Rlc3RzIiwgIkVjaG9SZXNwb25zZSIpOw0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBRTmFtZSBfRWNob19RTkFNRSA9IG5ldyBRTmFtZSgiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvdGVzdHMiLCAiRWNobyIpOw0KLQ0KLSAgICAvKioNCi0gICAgICogQ3JlYXRlIGEgbmV3IE9iamVjdEZhY3RvcnkgdGhhdCBjYW4gYmUgdXNlZCB0byBjcmVhdGUgbmV3IGluc3RhbmNlcyBvZiBzY2hlbWEgZGVyaXZlZCBjbGFzc2VzIGZvciBwYWNrYWdlOiBvcmcuYXBhY2hlLndzLmF4aXMyLnRlc3RzDQotICAgICAqIA0KLSAgICAgKi8NCi0gICAgcHVibGljIE9iamVjdEZhY3RvcnkoKSB7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgRWNob1Jlc3BvbnNlIH0NCi0gICAgICogDQotICAgICAqLw0KLSAgICBwdWJsaWMgRWNob1Jlc3BvbnNlIGNyZWF0ZUVjaG9SZXNwb25zZSgpIHsNCi0gICAgICAgIHJldHVybiBuZXcgRWNob1Jlc3BvbnNlKCk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgRWNobyB9DQotICAgICAqIA0KLSAgICAgKi8NCi0gICAgcHVibGljIEVjaG8gY3JlYXRlRWNobygpIHsNCi0gICAgICAgIHJldHVybiBuZXcgRWNobygpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEpBWEJFbGVtZW50IH17QGNvZGUgPH17QGxpbmsgRWNob1Jlc3BvbnNlIH17QGNvZGUgPn19DQotICAgICAqIA0KLSAgICAgKi8NCi0gICAgQFhtbEVsZW1lbnREZWNsKG5hbWVzcGFjZSA9ICJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi90ZXN0cyIsIG5hbWUgPSAiRWNob1Jlc3BvbnNlIikNCi0gICAgcHVibGljIEpBWEJFbGVtZW50PEVjaG9SZXNwb25zZT4gY3JlYXRlRWNob1Jlc3BvbnNlKEVjaG9SZXNwb25zZSB2YWx1ZSkgew0KLSAgICAgICAgcmV0dXJuIG5ldyBKQVhCRWxlbWVudDxFY2hvUmVzcG9uc2U+KF9FY2hvUmVzcG9uc2VfUU5BTUUsIEVjaG9SZXNwb25zZS5jbGFzcywgbnVsbCwgdmFsdWUpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEpBWEJFbGVtZW50IH17QGNvZGUgPH17QGxpbmsgRWNobyB9e0Bjb2RlID59fQ0KLSAgICAgKiANCi0gICAgICovDQotICAgIEBYbWxFbGVtZW50RGVjbChuYW1lc3BhY2UgPSAiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvdGVzdHMiLCBuYW1lID0gIkVjaG8iKQ0KLSAgICBwdWJsaWMgSkFYQkVsZW1lbnQ8RWNobz4gY3JlYXRlRWNobyhFY2hvIHZhbHVlKSB7DQotICAgICAgICByZXR1cm4gbmV3IEpBWEJFbGVtZW50PEVjaG8+KF9FY2hvX1FOQU1FLCBFY2hvLmNsYXNzLCBudWxsLCB2YWx1ZSk7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL3dzL2F4aXMyL3Rlc3RzL3BhY2thZ2UtaW5mby5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL3dzL2F4aXMyL3Rlc3RzL3BhY2thZ2UtaW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDA1YWU0Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS93cy9heGlzMi90ZXN0cy9wYWNrYWdlLWluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1AamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxTY2hlbWEobmFtZXNwYWNlID0gImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL3Rlc3RzIikNCi1wYWNrYWdlIG9yZy5hcGFjaGUud3MuYXhpczIudGVzdHM7DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9zZXJ2ZXIvRWNob1NlcnZpY2VNZXNzYWdlUmVjZWl2ZXJJbk91dC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9zZXJ2ZXIvRWNob1NlcnZpY2VNZXNzYWdlUmVjZWl2ZXJJbk91dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTkyNDFlLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvc2VydmVyL0VjaG9TZXJ2aWNlTWVzc2FnZVJlY2VpdmVySW5PdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MCArMCwwIEBACi0NCi0NCi0gICAgICAgIC8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi0gICAgICAgIC8qKg0KLSAgICAgICAgICogRWNob1NlcnZpY2VNZXNzYWdlUmVjZWl2ZXJJbk91dC5qYXZhDQotICAgICAgICAgKg0KLSAgICAgICAgICogVGhpcyBmaWxlIHdhcyBhdXRvLWdlbmVyYXRlZCBmcm9tIFdTREwNCi0gICAgICAgICAqIGJ5IHRoZSBBcGFjaGUgQXhpczIgdmVyc2lvbjogU05BUFNIT1QgQXByIDA5LCAyMDA2ICgxMDoyMDozNiBDRFQpDQotICAgICAgICAgKi8NCi0gICAgICAgIHBhY2thZ2Ugc2VydmVyOw0KLQ0KLSAgICAgICAgLyoqDQotICAgICAgICAgKiAgRWNob1NlcnZpY2VNZXNzYWdlUmVjZWl2ZXJJbk91dCBtZXNzYWdlIHJlY2VpdmVyDQotICAgICAgICAgKi8NCi0NCi0gICAgICAgIHB1YmxpYyBjbGFzcyBFY2hvU2VydmljZU1lc3NhZ2VSZWNlaXZlckluT3V0IGV4dGVuZHMgb3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuQWJzdHJhY3RJbk91dFN5bmNNZXNzYWdlUmVjZWl2ZXJ7DQotDQotDQotICAgICAgICBwdWJsaWMgdm9pZCBpbnZva2VCdXNpbmVzc0xvZ2ljKG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0LCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQgbmV3TXNnQ29udGV4dCkNCi0gICAgICAgIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdHsNCi0NCi0gICAgICAgIHRyeSB7DQotDQotICAgICAgICAvLyBnZXQgdGhlIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciB0aGUgV2ViIFNlcnZpY2UNCi0gICAgICAgIE9iamVjdCBvYmogPSBnZXRUaGVJbXBsZW1lbnRhdGlvbk9iamVjdChtc2dDb250ZXh0KTsNCi0NCi0gICAgICAgIC8vSW5qZWN0IHRoZSBNZXNzYWdlIENvbnRleHQgaWYgaXQgaXMgYXNrZWQgZm9yDQotICAgICAgICAvL29yZy5hcGFjaGUuYXhpczIuZW5naW5lLkRlcGVuZGVuY3lNYW5hZ2VyLmNvbmZpZ3VyZUJ1c2luZXNzTG9naWNQcm92aWRlcihvYmosIG1zZ0NvbnRleHQuZ2V0T3BlcmF0aW9uQ29udGV4dCgpKTsNCi0NCi0gICAgICAgIEVjaG9TZXJ2aWNlU2tlbGV0b24gc2tlbCA9IChFY2hvU2VydmljZVNrZWxldG9uKW9iajsNCi0gICAgICAgIC8vT3V0IEVudmVsb3ANCi0gICAgICAgIG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGUgZW52ZWxvcGUgPSBudWxsOw0KLSAgICAgICAgLy9GaW5kIHRoZSBheGlzT3BlcmF0aW9uIHRoYXQgaGFzIGJlZW4gc2V0IGJ5IHRoZSBEaXNwYXRjaCBwaGFzZS4NCi0gICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbiBvcCA9IG1zZ0NvbnRleHQuZ2V0T3BlcmF0aW9uQ29udGV4dCgpLmdldEF4aXNPcGVyYXRpb24oKTsNCi0gICAgICAgIGlmIChvcCA9PSBudWxsKSB7DQotICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQoIk9wZXJhdGlvbiBpcyBub3QgbG9jYXRlZCwgaWYgdGhpcyBpcyBkb2NsaXQgc3R5bGUgdGhlIFNPQVAtQUNUSU9OIHNob3VsZCBzcGVjaWZpZWQgdmlhIHRoZSBTT0FQIEFjdGlvbiB0byB1c2UgdGhlIFJhd1hNTFByb3ZpZGVyIik7DQotICAgICAgICB9DQotDQotICAgICAgICBTdHJpbmcgbWV0aG9kTmFtZTsNCi0gICAgICAgIGlmKG9wLmdldE5hbWUoKSAhPSBudWxsICYgKG1ldGhvZE5hbWUgPSBvcC5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpICE9IG51bGwpew0KLQ0KLSAgICAgICAgDQotDQotDQotICAgICAgICAgICAgaWYoImVjaG9TdHJpbmciLmVxdWFscyhtZXRob2ROYW1lKSl7DQotDQotDQotICAgICAgICAgICAgc2VydmVyLkVjaG9TdHJpbmdSZXNwb25zZSBwYXJhbTMgPSBudWxsOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICAgICAgLy9kb2Mgc3R5bGUNCi0gICAgICAgICAgICAgICAgICAgIHBhcmFtMyA9c2tlbC5lY2hvU3RyaW5nKA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VydmVyLkVjaG9TdHJpbmcpZnJvbU9NKG1zZ0NvbnRleHQuZ2V0RW52ZWxvcGUoKS5nZXRCb2R5KCkuZ2V0Rmlyc3RFbGVtZW50KCksIHNlcnZlci5FY2hvU3RyaW5nLmNsYXNzKSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgICAgICAgICAgZW52ZWxvcGUgPSB0b0VudmVsb3BlKGdldFNPQVBGYWN0b3J5KG1zZ0NvbnRleHQpLCBwYXJhbTMsIGZhbHNlKTsNCi0gICAgICAgICAgICAgICAgICAgICAgDQotDQotICAgICAgICAgICAgfQ0KLSAgICAgICAgDQotDQotICAgICAgICBuZXdNc2dDb250ZXh0LnNldEVudmVsb3BlKGVudmVsb3BlKTsNCi0gICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICAgIHRocm93IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICAgDQotICAgICAgICAvLw0KLSAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgIHRvT00oc2VydmVyLkVjaG9TdHJpbmcgcGFyYW0sIGJvb2xlYW4gb3B0aW1pemVDb250ZW50KXsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW0gaW5zdGFuY2VvZiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkJlYW4pew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuYnVpbGRlci5TdEFYT01CdWlsZGVyIGJ1aWxkZXINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IG5ldyBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuYnVpbGRlci5TdEFYT01CdWlsZGVyDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgb3JnLmFwYWNoZS5heGlzMi51dGlsLlN0cmVhbVdyYXBwZXIocGFyYW0uZ2V0UHVsbFBhcnNlcihzZXJ2ZXIuRWNob1N0cmluZy5NWV9RTkFNRSkpKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgZG9jdW1lbnRFbGVtZW50ID0gYnVpbGRlci5nZXREb2N1bWVudEVsZW1lbnQoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKChvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuT01Ob2RlRXgpIGRvY3VtZW50RWxlbWVudCkuc2V0UGFyZW50KG51bGwpOyAvLyByZW1vdmUgdGhlIHBhcmVudCBsaW5rDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkb2N1bWVudEVsZW1lbnQ7DQotICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgLy90b2RvIGZpbmlzaCB0aGlzIG9uZWNlIHRoZSBiZWFuIHNlcmlhbGl6ZXIgaGFzIHRoZSBuZWNlc3NhcnkgbWV0aG9kcw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgICAgICBwcml2YXRlICBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlIHRvRW52ZWxvcGUob3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYWN0b3J5IGZhY3RvcnksIHNlcnZlci5FY2hvU3RyaW5nIHBhcmFtLCBib29sZWFuIG9wdGltaXplQ29udGVudCl7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtIGluc3RhbmNlb2Ygb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJCZWFuKXsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJTT0FQTW9kZWxCdWlsZGVyIGJ1aWxkZXIgPSBuZXcNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQlNPQVBNb2RlbEJ1aWxkZXIocGFyYW0uZ2V0UHVsbFBhcnNlcihzZXJ2ZXIuRWNob1N0cmluZy5NWV9RTkFNRSksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3RvcnkpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYnVpbGRlci5nZXRFbnZlbG9wZSgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdG9kbyBmaW5pc2ggdGhpcyBvbmVjZSB0aGUgYmVhbiBzZXJpYWxpemVyIGhhcyB0aGUgbmVjZXNzYXJ5IG1ldGhvZHMNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgICAgIHByaXZhdGUgIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50ICB0b09NKHNlcnZlci5FY2hvU3RyaW5nUmVzcG9uc2UgcGFyYW0sIGJvb2xlYW4gb3B0aW1pemVDb250ZW50KXsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW0gaW5zdGFuY2VvZiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkJlYW4pew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuYnVpbGRlci5TdEFYT01CdWlsZGVyIGJ1aWxkZXINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IG5ldyBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuYnVpbGRlci5TdEFYT01CdWlsZGVyDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgb3JnLmFwYWNoZS5heGlzMi51dGlsLlN0cmVhbVdyYXBwZXIocGFyYW0uZ2V0UHVsbFBhcnNlcihzZXJ2ZXIuRWNob1N0cmluZ1Jlc3BvbnNlLk1ZX1FOQU1FKSkpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCBkb2N1bWVudEVsZW1lbnQgPSBidWlsZGVyLmdldERvY3VtZW50RWxlbWVudCgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5PTU5vZGVFeCkgZG9jdW1lbnRFbGVtZW50KS5zZXRQYXJlbnQobnVsbCk7IC8vIHJlbW92ZSB0aGUgcGFyZW50IGxpbmsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRvY3VtZW50RWxlbWVudDsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvL3RvZG8gZmluaXNoIHRoaXMgb25lY2UgdGhlIGJlYW4gc2VyaWFsaXplciBoYXMgdGhlIG5lY2Vzc2FyeSBtZXRob2RzDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgIHByaXZhdGUgIG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGUgdG9FbnZlbG9wZShvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhY3RvcnkgZmFjdG9yeSwgc2VydmVyLkVjaG9TdHJpbmdSZXNwb25zZSBwYXJhbSwgYm9vbGVhbiBvcHRpbWl6ZUNvbnRlbnQpew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbSBpbnN0YW5jZW9mIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCQmVhbil7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCU09BUE1vZGVsQnVpbGRlciBidWlsZGVyID0gbmV3DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJTT0FQTW9kZWxCdWlsZGVyKHBhcmFtLmdldFB1bGxQYXJzZXIoc2VydmVyLkVjaG9TdHJpbmdSZXNwb25zZS5NWV9RTkFNRSksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3RvcnkpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYnVpbGRlci5nZXRFbnZlbG9wZSgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdG9kbyBmaW5pc2ggdGhpcyBvbmVjZSB0aGUgYmVhbiBzZXJpYWxpemVyIGhhcyB0aGUgbmVjZXNzYXJ5IG1ldGhvZHMNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICANCi0NCi0gICAgICAgICAgIC8qKg0KLSAgICAgICAgICAgKiAgZ2V0IHRoZSBkZWZhdWx0IGVudmVsb3BlDQotICAgICAgICAgICAqLw0KLSAgICAgICAgICAgcHJpdmF0ZSBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlIHRvRW52ZWxvcGUob3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYWN0b3J5IGZhY3Rvcnkpew0KLSAgICAgICAgICAgICAgICByZXR1cm4gZmFjdG9yeS5nZXREZWZhdWx0RW52ZWxvcGUoKTsNCi0gICAgICAgICAgIH0NCi0NCi0NCi0gICAgICAgICAgICBwcml2YXRlICBqYXZhLmxhbmcuT2JqZWN0IGZyb21PTShvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCBwYXJhbSwNCi0gICAgICAgICAgICBqYXZhLmxhbmcuQ2xhc3MgdHlwZSl7DQotDQotICAgICAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgICAgICAgaWYgKHNlcnZlci5FY2hvU3RyaW5nLmNsYXNzLmVxdWFscyh0eXBlKSl7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlcnZlci5FY2hvU3RyaW5nLkZhY3RvcnkucGFyc2UocGFyYW0uZ2V0WE1MU3RyZWFtUmVhZGVyV2l0aG91dENhY2hpbmcoKSk7DQotICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgICAgICAgaWYgKHNlcnZlci5FY2hvU3RyaW5nUmVzcG9uc2UuY2xhc3MuZXF1YWxzKHR5cGUpKXsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VydmVyLkVjaG9TdHJpbmdSZXNwb25zZS5GYWN0b3J5LnBhcnNlKHBhcmFtLmdldFhNTFN0cmVhbVJlYWRlcldpdGhvdXRDYWNoaW5nKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgDQotDQotICAgICAgICB9DQotICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvc2VydmVyL0VjaG9TZXJ2aWNlU2tlbGV0b24uamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvc2VydmVyL0VjaG9TZXJ2aWNlU2tlbGV0b24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZjZDQzMy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L3NlcnZlci9FY2hvU2VydmljZVNrZWxldG9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotLyoqDQotICogRWNob1NlcnZpY2VTa2VsZXRvbi5qYXZhDQotICoNCi0gKiBUaGlzIGZpbGUgd2FzIGF1dG8tZ2VuZXJhdGVkIGZyb20gV1NETA0KLSAqIGJ5IHRoZSBBcGFjaGUgQXhpczIgdmVyc2lvbjogU05BUFNIT1QgQXByIDA5LCAyMDA2ICgxMDoyMDozNiBDRFQpDQotICovDQotcGFja2FnZSBzZXJ2ZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuVGVzdExvZ2dlcjsNCi0NCi0vKioNCi0gKiAgRWNob1NlcnZpY2VTa2VsZXRvbiBqYXZhIHNrZWxldG9uIGZvciB0aGUgYXhpc1NlcnZpY2UNCi0gKi8NCi1wdWJsaWMgY2xhc3MgRWNob1NlcnZpY2VTa2VsZXRvbiB7DQotDQotICAgIC8qKg0KLSAgICAgKiBBdXRvIGdlbmVyYXRlZCBtZXRob2Qgc2lnbmF0dXJlDQotICAgICAqIEBwYXJhbSBwYXJhbTANCi0gICAgICovDQotICAgIHB1YmxpYyAgc2VydmVyLkVjaG9TdHJpbmdSZXNwb25zZSBlY2hvU3RyaW5nKHNlcnZlci5FY2hvU3RyaW5nIGlucHV0KSB7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlcg0KLSAgICAgICAgICAgICAgICAuZGVidWcoIj4+IEVudGVyaW5nIG1ldGhvZCBbRWNob1N0cmluZ1Jlc3BvbnNlIEVjaG9TZXJ2aWNlU2tlbGV0b24uZWNob1N0cmluZyhFY2hvU3RyaW5nKV0iKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBFbmRwb2ludCByZWNlaXZlZCBpbnB1dCBbIiArIGlucHV0LmdldElucHV0KCkgKyAiXSIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IFJldHVybmluZyBzdHJpbmcgW0VDSE86IiArIGlucHV0LmdldElucHV0KCkgKyAiXSIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXINCi0gICAgICAgICAgICAgICAgLmRlYnVnKCI8PCBEb25lIHdpdGggbWV0aG9kIFtFY2hvU3RyaW5nUmVzcG9uc2UgRWNob1NlcnZpY2VTa2VsZXRvbi5lY2hvU3RyaW5nKEVjaG9TdHJpbmcpXSIpOw0KLSAgICAgICAgRWNob1N0cmluZ1Jlc3BvbnNlIG91dHB1dCA9IG5ldyBFY2hvU3RyaW5nUmVzcG9uc2UoKTsNCi0gICAgICAgIG91dHB1dC5zZXRFY2hvU3RyaW5nUmV0dXJuKCJFQ0hPOiIgKyBpbnB1dC5nZXRJbnB1dCgpKTsNCi0gICAgICAgIHJldHVybiBvdXRwdXQ7DQotICAgIH0NCi19DQotICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvc2VydmVyL0VjaG9TdHJpbmcuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvc2VydmVyL0VjaG9TdHJpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk0Y2MyZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L3NlcnZlci9FY2hvU3RyaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzcgKzAsMCBAQAotDQotICAgICAgICAgICAgLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLSAgICAgICAgICAgIC8qKg0KLSAgICAgICAgICAgICogRWNob1N0cmluZy5qYXZhDQotICAgICAgICAgICAgKg0KLSAgICAgICAgICAgICogVGhpcyBmaWxlIHdhcyBhdXRvLWdlbmVyYXRlZCBmcm9tIFdTREwNCi0gICAgICAgICAgICAqIGJ5IHRoZSBBcGFjaGUgQXhpczIgdmVyc2lvbjogI2F4aXNWZXJzaW9uIyAjdG9kYXkjDQotICAgICAgICAgICAgKi8NCi0NCi0gICAgICAgICAgICBwYWNrYWdlIHNlcnZlcjsNCi0NCi0gICAgICAgICAgICBpbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3Rvcnk7DQotICAgICAgICAgICAgaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uOw0KLSAgICAgICAgICAgIGltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXI7DQotDQotICAgICAgICAgICAgaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotICAgICAgICAgICAgaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOw0KLQ0KLSAgICAgICAgICAgIC8qKg0KLSAgICAgICAgICAgICogIEVjaG9TdHJpbmcgYmVhbiBjbGFzcw0KLSAgICAgICAgICAgICovDQotDQotICAgICAgICAgICAgcHVibGljICBjbGFzcyBFY2hvU3RyaW5nDQotICAgICAgICBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCQmVhbnsNCi0NCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIE1ZX1FOQU1FID0gbmV3IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUoDQotICAgICAgICAgICAgICAgICJodHRwOi8vdGVzdCIsDQotICAgICAgICAgICAgICAgICJlY2hvU3RyaW5nIiwNCi0gICAgICAgICAgICAgICAgIm5zMSIpOw0KLQ0KLQ0KLQ0KLQ0KLSAgICAgICAgICAgIC8qKg0KLSAgICAgICAgICAgICogZmllbGQgZm9yIElucHV0DQotICAgICAgICAgICAgKi8NCi0NCi0gICAgICAgICAgICBwcm90ZWN0ZWQgamF2YS5sYW5nLlN0cmluZyBsb2NhbElucHV0IDsNCi0NCi0NCi0NCi0gICAgICAgICAgIC8qKg0KLSAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBnZXR0ZXIgbWV0aG9kDQotICAgICAgICAgICAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZw0KLSAgICAgICAgICAgKi8NCi0gICAgICAgICAgIHB1YmxpYyAgamF2YS5sYW5nLlN0cmluZyBnZXRJbnB1dCgpIHsNCi0gICAgICAgICAgICAgICBpZiAobG9jYWxJbnB1dC5lcXVhbHMoIlRIUk9XIEVYQ0VQVElPTiIpKQ0KLSAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigidGVzdCBleGNlcHRpb24iKTsNCi0gICAgICAgICAgICAgICByZXR1cm4gbG9jYWxJbnB1dDsNCi0gICAgICAgICAgIH0NCi0NCi0NCi0NCi0gICAgICAgICAgICAgICAgICAgIC8qKg0KLSAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIHNldHRlciBtZXRob2QNCi0gICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gcGFyYW0gSW5wdXQNCi0gICAgICAgICAgICAgICAgICAgKi8NCi0gICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0SW5wdXQoamF2YS5sYW5nLlN0cmluZyBwYXJhbSl7DQotDQotICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYWxJbnB1dD1wYXJhbTsNCi0gICAgICAgICAgICAgICAgICAgfQ0KLQ0KLQ0KLSAgICAgICAgLyoqDQotICAgICAgICAqIGRhdGFiaW5kaW5nIG1ldGhvZCB0byBnZXQgYW4gWE1MIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0DQotICAgICAgICAqDQotICAgICAgICAqLw0KLSAgICAgICAgcHVibGljIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIGdldFB1bGxQYXJzZXIoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxTmFtZSl7DQotDQotDQotDQotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGVsZW1lbnRMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsNCi0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgYXR0cmliTGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7DQotDQotDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQobmV3IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUoImh0dHA6Ly90ZXN0IiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlucHV0IikpOw0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChsb2NhbElucHV0PT1udWxsP251bGw6DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxJbnB1dCkpOw0KLQ0KLQ0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlckltcGwocU5hbWUsIGVsZW1lbnRMaXN0LnRvQXJyYXkoKSwgYXR0cmliTGlzdC50b0FycmF5KCkpOw0KLQ0KLQ0KLQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgUU5hbWUgcGFyZW50UU5hbWUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPTUZhY3RvcnkgZmFjdG9yeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpDQotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgQURCRXhjZXB0aW9uIHsNCi0gICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZShwYXJlbnRRTmFtZSwgZmFjdG9yeSwgeG1sV3JpdGVyLCBmYWxzZSk7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIFFOYW1lIHBhcmVudFFOYW1lLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT01GYWN0b3J5IGZhY3RvcnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzZXJpYWxpemVUeXBlKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sIEFEQkV4Y2VwdGlvbiB7DQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlVuIGltcGxlbWVudGVkIG1ldGhvZCIpOw0KLSAgICAgICAgICAgICAgICB9DQotDQotDQotDQotDQotDQotDQotICAgICAgICAvKioNCi0gICAgICAgICAgICAgKiAgRmFjdG9yeSBjbGFzcyB0aGF0IGtlZXBzIHRoZSBwYXJzZSBtZXRob2QNCi0gICAgICAgICAgICAgKi8NCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeXsNCi0NCi0gICAgICAgICAgICAgICAvKioNCi0gICAgICAgICAgICAgICAqIHN0YXRpYyBtZXRob2QgdG8gY3JlYXRlIHRoZSBvYmplY3QNCi0gICAgICAgICAgICAgICAqLw0KLSAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgRWNob1N0cmluZyBwYXJzZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uew0KLSAgICAgICAgICAgICAgIEVjaG9TdHJpbmcgb2JqZWN0ID0gbmV3IEVjaG9TdHJpbmcoKTsNCi0gICAgICAgICAgICAgICB0cnkgew0KLSAgICAgICAgICAgICAgIGludCBldmVudCA9IHJlYWRlci5nZXRFdmVudFR5cGUoKTsNCi0NCi0gICAgICAgICAgICAgIC8vZXZlbnQgYmV0dGVyIGJlIGEgU1RBUlRfRUxFTUVOVC4gaWYgbm90IHdlIHNob3VsZCBnbyB1cCB0byB0aGUgc3RhcnQgZWxlbWVudCBoZXJlDQotICAgICAgICAgICAgICAgd2hpbGUgKGV2ZW50IT0gamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIuU1RBUlRfRUxFTUVOVCkgew0KLSAgICAgICAgICAgICAgICAgICBldmVudCA9IHJlYWRlci5uZXh0KCk7DQotICAgICAgICAgICAgICAgfQ0KLQ0KLQ0KLSAgICAgICAgICAgICAgIGlmICghTVlfUU5BTUUuZXF1YWxzKHJlYWRlci5nZXROYW1lKCkpKXsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJXcm9uZyBRTmFtZSIpOw0KLSAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuU2ltcGxlRWxlbWVudFJlYWRlclN0YXRlTWFjaGluZSBzdGF0ZU1hY2hpbmUxDQotICAgICAgICAgICAgICAgICAgICAgICAgID0gbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuU2ltcGxlRWxlbWVudFJlYWRlclN0YXRlTWFjaGluZSgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBzdGFydFFuYW1lMSA9IG5ldyBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lKA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly90ZXN0IiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlucHV0Iik7DQotICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZU1hY2hpbmUxLnNldEVsZW1lbnROYW1lVG9UZXN0KHN0YXJ0UW5hbWUxKTsNCi0gICAgICAgICAgICAgICAgICAgICAgIHN0YXRlTWFjaGluZTEuc2V0TmlsbGFibGUoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgIHN0YXRlTWFjaGluZTEucmVhZChyZWFkZXIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldElucHV0KA0KLSAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZU1hY2hpbmUxLmdldFRleHQoKT09bnVsbD9udWxsOg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcoDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlTWFjaGluZTEuZ2V0VGV4dCgpKSk7DQotDQotICAgICAgICAgICAgICAgfSBjYXRjaCAoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEubGFuZy5FeGNlcHRpb24oZSk7DQotICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgIHJldHVybiBvYmplY3Q7DQotICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgIH0vL2VuZCBvZiBmYWN0b3J5IGNsYXNzDQotDQotDQotDQotDQotDQotICAgICAgICB9DQotICAgICAgICAgICANCi0gICAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9zZXJ2ZXIvRWNob1N0cmluZ1Jlc3BvbnNlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L3NlcnZlci9FY2hvU3RyaW5nUmVzcG9uc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JlMGJhZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L3NlcnZlci9FY2hvU3RyaW5nUmVzcG9uc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotLyoqDQotICogRWNob1N0cmluZ1Jlc3BvbnNlLmphdmENCi0gKg0KLSAqIFRoaXMgZmlsZSB3YXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBXU0RMDQotICogYnkgdGhlIEFwYWNoZSBBeGlzMiB2ZXJzaW9uOiAjYXhpc1ZlcnNpb24jICN0b2RheSMNCi0gKi8NCi1wYWNrYWdlIHNlcnZlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXI7DQotDQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqICBFY2hvU3RyaW5nUmVzcG9uc2UgYmVhbiBjbGFzcw0KLSAqLw0KLXB1YmxpYyAgY2xhc3MgRWNob1N0cmluZ1Jlc3BvbnNlIGltcGxlbWVudHMgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJCZWFuew0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgTVlfUU5BTUUgPSBuZXcgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSgNCi0gICAgICAgICAgICAiaHR0cDovL3Rlc3QiLA0KLSAgICAgICAgICAgICJlY2hvU3RyaW5nUmVzcG9uc2UiLA0KLSAgICAgICAgICAgICJuczEiKTsNCi0NCi0gICAgLyoqDQotICAgICAqIGZpZWxkIGZvciBFY2hvU3RyaW5nUmV0dXJuDQotICAgICAqLw0KLSAgICBwcm90ZWN0ZWQgamF2YS5sYW5nLlN0cmluZyBsb2NhbEVjaG9TdHJpbmdSZXR1cm47DQotDQotICAgIC8qKg0KLSAgICAgKiBBdXRvIGdlbmVyYXRlZCBnZXR0ZXIgbWV0aG9kDQotICAgICAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZw0KLSAgICAgKi8NCi0gICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0RWNob1N0cmluZ1JldHVybigpIHsNCi0gICAgICAgIHJldHVybiBsb2NhbEVjaG9TdHJpbmdSZXR1cm47DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIEF1dG8gZ2VuZXJhdGVkIHNldHRlciBtZXRob2QNCi0gICAgICogQHBhcmFtIHBhcmFtIEVjaG9TdHJpbmdSZXR1cm4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHNldEVjaG9TdHJpbmdSZXR1cm4oamF2YS5sYW5nLlN0cmluZyBwYXJhbSkgew0KLQ0KLSAgICAgICAgdGhpcy5sb2NhbEVjaG9TdHJpbmdSZXR1cm4gPSBwYXJhbTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogZGF0YWJpbmRpbmcgbWV0aG9kIHRvIGdldCBhbiBYTUwgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QNCi0gICAgICoNCi0gICAgICovDQotICAgIHB1YmxpYyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciBnZXRQdWxsUGFyc2VyKA0KLSAgICAgICAgICAgIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcU5hbWUpIHsNCi0NCi0gICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgZWxlbWVudExpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOw0KLSAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBhdHRyaWJMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsNCi0NCi0gICAgICAgIGVsZW1lbnRMaXN0LmFkZChuZXcgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSgiaHR0cDovL3Rlc3QiLA0KLSAgICAgICAgICAgICAgICAiZWNob1N0cmluZ1JldHVybiIpKTsNCi0NCi0gICAgICAgIGVsZW1lbnRMaXN0LmFkZChsb2NhbEVjaG9TdHJpbmdSZXR1cm4gPT0gbnVsbCA/IG51bGwNCi0gICAgICAgICAgICAgICAgOiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwNCi0gICAgICAgICAgICAgICAgICAgICAgICAuY29udmVydFRvU3RyaW5nKGxvY2FsRWNob1N0cmluZ1JldHVybikpOw0KLQ0KLSAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXJJbXBsKA0KLSAgICAgICAgICAgICAgICBxTmFtZSwgZWxlbWVudExpc3QudG9BcnJheSgpLCBhdHRyaWJMaXN0LnRvQXJyYXkoKSk7DQotDQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIFFOYW1lIHBhcmVudFFOYW1lLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT01GYWN0b3J5IGZhY3RvcnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICBNVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKQ0KLSAgICAgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sIEFEQkV4Y2VwdGlvbiB7DQotICAgICAgICBzZXJpYWxpemUocGFyZW50UU5hbWUsIGZhY3RvcnksIHhtbFdyaXRlciwgZmFsc2UpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBRTmFtZSBwYXJlbnRRTmFtZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9NRmFjdG9yeSBmYWN0b3J5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VyaWFsaXplVHlwZSkNCi0gICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uLCBBREJFeGNlcHRpb24gew0KLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJVbiBpbXBsZW1lbnRlZCBtZXRob2QiKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogIEZhY3RvcnkgY2xhc3MgdGhhdCBrZWVwcyB0aGUgcGFyc2UgbWV0aG9kDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3Rvcnkgew0KLQ0KLSAgICAgICAgLyoqDQotICAgICAgICAgKiBzdGF0aWMgbWV0aG9kIHRvIGNyZWF0ZSB0aGUgb2JqZWN0DQotICAgICAgICAgKi8NCi0NCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgRWNob1N0cmluZ1Jlc3BvbnNlIHBhcnNlKA0KLSAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpDQotICAgICAgICAgICAgICAgIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uIHsNCi0gICAgICAgICAgICBFY2hvU3RyaW5nUmVzcG9uc2Ugb2JqZWN0ID0gbmV3IEVjaG9TdHJpbmdSZXNwb25zZSgpOw0KLSAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgIGludCBldmVudCA9IHJlYWRlci5nZXRFdmVudFR5cGUoKTsNCi0NCi0gICAgICAgICAgICAgICAgLy9ldmVudCBiZXR0ZXIgYmUgYSBTVEFSVF9FTEVNRU5ULiBpZiBub3Qgd2Ugc2hvdWxkIGdvIHVwIHRvIHRoZSBzdGFydCBlbGVtZW50IGhlcmUNCi0gICAgICAgICAgICAgICAgd2hpbGUgKGV2ZW50ICE9IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyLlNUQVJUX0VMRU1FTlQpIHsNCi0gICAgICAgICAgICAgICAgICAgIGV2ZW50ID0gcmVhZGVyLm5leHQoKTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBpZiAoIU1ZX1FOQU1FLmVxdWFscyhyZWFkZXIuZ2V0TmFtZSgpKSkgew0KLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiV3JvbmcgUU5hbWUiKTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLlNpbXBsZUVsZW1lbnRSZWFkZXJTdGF0ZU1hY2hpbmUgc3RhdGVNYWNoaW5lMSA9IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLlNpbXBsZUVsZW1lbnRSZWFkZXJTdGF0ZU1hY2hpbmUoKTsNCi0gICAgICAgICAgICAgICAgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBzdGFydFFuYW1lMSA9IG5ldyBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lKA0KLSAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vdGVzdCIsICJlY2hvU3RyaW5nUmV0dXJuIik7DQotICAgICAgICAgICAgICAgIHN0YXRlTWFjaGluZTEuc2V0RWxlbWVudE5hbWVUb1Rlc3Qoc3RhcnRRbmFtZTEpOw0KLSAgICAgICAgICAgICAgICBzdGF0ZU1hY2hpbmUxLnNldE5pbGxhYmxlKCk7DQotICAgICAgICAgICAgICAgIHN0YXRlTWFjaGluZTEucmVhZChyZWFkZXIpOw0KLSAgICAgICAgICAgICAgICBvYmplY3QNCi0gICAgICAgICAgICAgICAgICAgICAgICAuc2V0RWNob1N0cmluZ1JldHVybihzdGF0ZU1hY2hpbmUxLmdldFRleHQoKSA9PSBudWxsID8gbnVsbA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbnZlcnRUb1N0cmluZyhzdGF0ZU1hY2hpbmUxDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFRleHQoKS5nZXRCeXRlcygpKSk7DQotDQotICAgICAgICAgICAgfSBjYXRjaCAoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5sYW5nLkV4Y2VwdGlvbihlKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgcmV0dXJuIG9iamVjdDsNCi0gICAgICAgIH0NCi0NCi0gICAgfS8vZW5kIG9mIGZhY3RvcnkgY2xhc3MNCi0NCi19DQotICAgICAgICAgICANCi0gICAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9zZXJ2ZXIvTUVUQS1JTkYvc2VydmljZXMueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9zZXJ2ZXIvTUVUQS1JTkYvc2VydmljZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMmIyOWJkLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvc2VydmVyL01FVEEtSU5GL3NlcnZpY2VzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTxzZXJ2aWNlR3JvdXA+DQotIDxzZXJ2aWNlIG5hbWU9IkVjaG9TZXJ2aWNlIj4NCi0gIDxtZXNzYWdlUmVjZWl2ZXJzPg0KLSAgIDxtZXNzYWdlUmVjZWl2ZXIgbWVwPSJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaW4tb3V0IiBjbGFzcz0ic2VydmVyLkVjaG9TZXJ2aWNlTWVzc2FnZVJlY2VpdmVySW5PdXQiLz4NCi0gIDwvbWVzc2FnZVJlY2VpdmVycz4NCi0gIDxwYXJhbWV0ZXIgbmFtZT0iU2VydmljZUNsYXNzIj5zZXJ2ZXIuRWNob1NlcnZpY2VTa2VsZXRvbjwvcGFyYW1ldGVyPg0KLSAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvU3RyaW5nIiBtZXA9Imh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgvd3NkbC9pbi1vdXQiPg0KLSAgICA8YWN0aW9uTWFwcGluZy8+DQotICA8L29wZXJhdGlvbj4NCi0gPC9zZXJ2aWNlPg0KLTwvc2VydmljZUdyb3VwPg0KLQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLW1hci9wb20ueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtbWFyL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwOTUwZWUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtbWFyL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+MS41LjE8L3ZlcnNpb24+Ci0gICAgICAgIDxyZWxhdGl2ZVBhdGg+Li4vcGFyZW50L3BvbS54bWw8L3JlbGF0aXZlUGF0aD4KLSAgICA8L3BhcmVudD4KLSAgICA8YXJ0aWZhY3RJZD5heGlzMi1qYXh3cy1tYXI8L2FydGlmYWN0SWQ+Ci0gICAgPHBhY2thZ2luZz5tYXI8L3BhY2thZ2luZz4KLSAgICA8bmFtZT5BcGFjaGUgQXhpczIgLSBKQVhXUyAobWFyKTwvbmFtZT4KLSAgICA8ZGVzY3JpcHRpb24+QXhpczIgSkFYV1MgSW1wbGVtZW50YXRpb248L2Rlc2NyaXB0aW9uPgotCi0gICAgPGRlcGVuZGVuY2llcz4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItamF4d3M8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3ZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPC9kZXBlbmRlbmNpZXM+Ci0KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxzb3VyY2VEaXJlY3Rvcnk+c3JjPC9zb3VyY2VEaXJlY3Rvcnk+Ci0gICAgICAgIDx0ZXN0U291cmNlRGlyZWN0b3J5PnRlc3Q8L3Rlc3RTb3VyY2VEaXJlY3Rvcnk+Ci0KLSAgICAgICAgPHJlc291cmNlcz4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PmNvbmY8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqLyoucHJvcGVydGllczwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1ZGVzPgotICAgICAgICAgICAgICAgIDxmaWx0ZXJpbmc+ZmFsc2U8L2ZpbHRlcmluZz4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmM8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqLyouamF2YTwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1ZGVzPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5Pi4uLy4uPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5OT1RJQ0UudHh0PC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5MSUNFTlNFLnR4dDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgICAgIDxmaWx0ZXJpbmc+ZmFsc2U8L2ZpbHRlcmluZz4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgIDwvcmVzb3VyY2VzPgotCi0gICAgICAgIDx0ZXN0UmVzb3VyY2VzPgotICAgICAgICAgICAgPHRlc3RSZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0UGF0aD4uLi90ZXN0LXJlc291cmNlczwvdGFyZ2V0UGF0aD4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnRlc3QtcmVzb3VyY2VzPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qKjwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgPC90ZXN0UmVzb3VyY2U+Ci0gICAgICAgIDwvdGVzdFJlc291cmNlcz4KLQotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8c2tpcD5mYWxzZTwvc2tpcD4KLSAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovKlV0aWwuamF2YTwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgPC9leGNsdWRlcz4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1tYXItbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7dmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPGV4dGVuc2lvbnM+dHJ1ZTwvZXh0ZW5zaW9ucz4KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGVEZXBlbmRlbmNpZXM+ZmFsc2U8L2luY2x1ZGVEZXBlbmRlbmNpZXM+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgIDwvcGx1Z2lucz4KLSAgICA8L2J1aWxkPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtbWFyL3NyYy9NRVRBLUlORi9tb2R1bGUueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtbWFyL3NyYy9NRVRBLUlORi9tb2R1bGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzAyNDY0Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLW1hci9zcmMvTUVUQS1JTkYvbW9kdWxlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLTxtb2R1bGUgbmFtZT0iamF4d3MiIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1vZHVsZS5KQVhXU01vZHVsZSI+Ci0gICAgPERlc2NyaXB0aW9uPlRoaXMgaXMgQXhpczIgaW1wbGVtZW50YXRpb24gb2YgSkFYLVdTPC9EZXNjcmlwdGlvbj4KLQotICAgIDxJbkZsb3c+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJHZW5lcmljUHJvdmlkZXJEaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGlzcGF0Y2hlcnMuR2VuZXJpY1Byb3ZpZGVyRGlzcGF0Y2hlciI+Ci0gICAgICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJEaXNwYXRjaCIvPgotICAgICAgICAgICAgPC9oYW5kbGVyPgotCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJNdXN0VW5kZXJzdGFuZFZhbGlkYXRpb25EaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGlzcGF0Y2hlcnMuTXVzdFVuZGVyc3RhbmRWYWxpZGF0aW9uRGlzcGF0Y2hlciI+Ci0gICAgICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJEaXNwYXRjaCIvPgotICAgICAgICAgICAgPC9oYW5kbGVyPgotCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJNdXN0VW5kZXJzdGFuZENoZWNrZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kaXNwYXRjaGVycy5NdXN0VW5kZXJzdGFuZENoZWNrZXIiPgotICAgICAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iT3BlcmF0aW9uSW5QaGFzZSIvPgotICAgICAgICAgICAgPC9oYW5kbGVyPgotICAgIDwvSW5GbG93PgotCi0gICAgPE91dEZsb3c+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJEaXNwYXRjaE9wZXJhdGlvbkhhbmRsZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jbGllbnQuZGlzcGF0Y2guRGlzcGF0Y2hPcGVyYXRpb25IYW5kbGVyIj4KLSAgICAgICAgICAgICAgICA8b3JkZXIgcGhhc2U9Ik9wZXJhdGlvbk91dFBoYXNlIi8+Ci0gICAgICAgICAgICA8L2hhbmRsZXI+Ci0gICAgPC9PdXRGbG93PgotCi0gICAgPEluRmF1bHRGbG93PgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iR2VuZXJpY1Byb3ZpZGVyRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRpc3BhdGNoZXJzLkdlbmVyaWNQcm92aWRlckRpc3BhdGNoZXIiPgotICAgICAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iRGlzcGF0Y2giLz4KLSAgICAgICAgICAgIDwvaGFuZGxlcj4KLQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iTXVzdFVuZGVyc3RhbmRWYWxpZGF0aW9uRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRpc3BhdGNoZXJzLk11c3RVbmRlcnN0YW5kVmFsaWRhdGlvbkRpc3BhdGNoZXIiPgotICAgICAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iRGlzcGF0Y2giLz4KLSAgICAgICAgICAgIDwvaGFuZGxlcj4KLQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iTXVzdFVuZGVyc3RhbmRDaGVja2VyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGlzcGF0Y2hlcnMuTXVzdFVuZGVyc3RhbmRDaGVja2VyIj4KLSAgICAgICAgICAgICAgICA8b3JkZXIgcGhhc2U9Ik9wZXJhdGlvbkluRmF1bHRQaGFzZSIvPgotICAgICAgICAgICAgPC9oYW5kbGVyPgotICAgIDwvSW5GYXVsdEZsb3c+Ci0KLTwvbW9kdWxlPgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtbWFyL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21vZHVsZS9KQVhXU01vZHVsZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MtbWFyL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21vZHVsZS9KQVhXU01vZHVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2YzZWMzLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzLW1hci9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tb2R1bGUvSkFYV1NNb2R1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubW9kdWxlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc0Rlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc01vZHVsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLm1vZHVsZXMuTW9kdWxlOwotaW1wb3J0IG9yZy5hcGFjaGUubmVldGhpLkFzc2VydGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm5lZXRoaS5Qb2xpY3k7Ci0KLXB1YmxpYyBjbGFzcyBKQVhXU01vZHVsZSBpbXBsZW1lbnRzIE1vZHVsZSB7Ci0KLSAgICBwdWJsaWMgdm9pZCBlbmdhZ2VOb3RpZnkoQXhpc0Rlc2NyaXB0aW9uIGF4aXNEZXNjcmlwdGlvbikgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaW5pdChDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWd1cmF0aW9uQ29udGV4dCwgQXhpc01vZHVsZSBtb2R1bGUpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb25Db250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgIHJlZ2lzdGVyR2xvYmFsTW9kdWxlKGF4aXNDb25maWd1cmF0aW9uLCAiamF4d3MiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzaHV0ZG93bihDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWd1cmF0aW9uQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYXBwbHlQb2xpY3koUG9saWN5IHBvbGljeSwgQXhpc0Rlc2NyaXB0aW9uIGF4aXNEZXNjcmlwdGlvbikgIHRocm93cyBBeGlzRmF1bHQgewotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGNhblN1cHBvcnRBc3NlcnRpb24oQXNzZXJ0aW9uIGFzc2VydGlvbikgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHJlZ2lzdGVyR2xvYmFsTW9kdWxlKEF4aXNDb25maWd1cmF0aW9uIGF4aXNDb25maWd1cmF0aW9uLCBTdHJpbmcgbW9kdWxlTmFtZSkgewotICAgICAgICBpZiAoIWF4aXNDb25maWd1cmF0aW9uLmdldEdsb2JhbE1vZHVsZXMoKS5jb250YWlucyhtb2R1bGVOYW1lKSkgewotICAgICAgICAgICAgYXhpc0NvbmZpZ3VyYXRpb24uYWRkR2xvYmFsTW9kdWxlUmVmKG1vZHVsZU5hbWUpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvYnVpbGQueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTEyMmYyLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL2J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxwcm9qZWN0IG5hbWU9Iml0ZXN0IiBkZWZhdWx0PSJidWlsZC1yZXBvIiBiYXNlZGlyPSIuIj4KLQotCTx0YXJnZXQgbmFtZT0iYnVpbGQtcmVwbyIgdW5sZXNzPSJ0ZXN0LnNraXAiPgotCi0JCTwhLS0gU3RhbmRhcmQgcmVwb3NpdG9yeSAtLT4KLQkJPG1rZGlyIGRpcj0idGFyZ2V0L3JlcG9zaXRvcnkiLz4KLQkJPG1rZGlyIGRpcj0idGFyZ2V0L3JlcG9zaXRvcnkvY29uZiIvPgotCQk8bWtkaXIgZGlyPSJ0YXJnZXQvcmVwb3NpdG9yeS9zZXJ2aWNlcyIvPgotCQk8bWtkaXIgZGlyPSJ0YXJnZXQvcmVwb3NpdG9yeS9tb2R1bGVzIi8+Ci0JCTxjb3B5IGZpbGU9Ii4uL2FkZHJlc3NpbmcvdGFyZ2V0L2FkZHJlc3NpbmctJHthZGRyZXNzaW5nX3ZlcnNpb259Lm1hciIKLSAgICAJICAgICAgICAgICAgICAgICAgdG9maWxlPSJ0YXJnZXQvcmVwb3NpdG9yeS9tb2R1bGVzL2FkZHJlc3NpbmctJHthZGRyZXNzaW5nX3ZlcnNpb259Lm1hciIvPgotCQk8Y29weSBmaWxlPSIuLi9rZXJuZWwvY29uZi9heGlzMi54bWwiCi0gICAgCSAgICAgICAgICAgICAgICAgIHRvZmlsZT0idGFyZ2V0L3JlcG9zaXRvcnkvY29uZi9heGlzMi54bWwiLz4KLQotCTwvdGFyZ2V0PgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9wb20ueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjUyY2FlYy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzMzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjEuNS4xPC92ZXJzaW9uPgotICAgICAgICA8cmVsYXRpdmVQYXRoPi4uL3BhcmVudC9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+Ci0gICAgPC9wYXJlbnQ+Ci0gICAgPGFydGlmYWN0SWQ+YXhpczItamF4d3M8L2FydGlmYWN0SWQ+Ci0gICAgPG5hbWU+QXBhY2hlIEF4aXMyIC0gSkFYV1M8L25hbWU+Ci0gICAgPGRlc2NyaXB0aW9uPkF4aXMyIEpBWFdTIEltcGxlbWVudGF0aW9uPC9kZXNjcmlwdGlvbj4KLSAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZ2Vyb25pbW8uc3BlY3M8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5nZXJvbmltby1hbm5vdGF0aW9uXzEuMF9zcGVjPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLWtlcm5lbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7dmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItc2FhajwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7dmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItbWV0YWRhdGE8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3ZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+eG1sLXJlc29sdmVyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+eG1sLXJlc29sdmVyPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+amF4ZW48L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXhlbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmNvbS5zdW4ueG1sLmJpbmQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXhiLWltcGw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8ZXhjbHVzaW9ucz4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qc3IxNzM8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPmphdmF4LnhtbDwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgIDwvZXhjbHVzaW9ucz4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmNvbS5zdW4ueG1sLmJpbmQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXhiLXhqYzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPnhhbGFuPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+eGFsYW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC54bWwuYmluZDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmpheGItYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPGV4Y2x1c2lvbnM+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+anNyMTczPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC54bWw8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICA8L2V4Y2x1c2lvbnM+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItdHJhbnNwb3J0LWh0dHA8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3ZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLXRyYW5zcG9ydC1sb2NhbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7dmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8L2RlcGVuZGVuY2llcz4KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxzb3VyY2VEaXJlY3Rvcnk+c3JjPC9zb3VyY2VEaXJlY3Rvcnk+Ci0gICAgICAgIDx0ZXN0U291cmNlRGlyZWN0b3J5PnRlc3Q8L3Rlc3RTb3VyY2VEaXJlY3Rvcnk+Ci0gICAgICAgIDxyZXNvdXJjZXM+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5jb25mPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qLnByb3BlcnRpZXM8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmM8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLyoucHJvcGVydGllczwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKi54bWw8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5yZXNvdXJjZXM8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLyo8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT4uLi8uLjwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+Tk9USUNFLnR4dDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+TElDRU5TRS50eHQ8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgICAgICA8ZmlsdGVyaW5nPmZhbHNlPC9maWx0ZXJpbmc+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICA8L3Jlc291cmNlcz4KLSAgICAgICAgPHRlc3RSZXNvdXJjZXM+Ci0gICAgICAgICAgICA8dGVzdFJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+dGVzdDwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKi54bWw8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLyoud3NkbDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKi5wcm9wZXJ0aWVzPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICA8L3Rlc3RSZXNvdXJjZT4KLSAgICAgICAgPC90ZXN0UmVzb3VyY2VzPgotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphci1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgIDxhcmNoaXZlPiAgCi0gICAgICAgICAgICAgICAgICA8bWFuaWZlc3RGaWxlPnJlc291cmNlcy9NRVRBLUlORi9NQU5JRkVTVC5NRjwvbWFuaWZlc3RGaWxlPgotICAgICAgICAgICAgICAgIDwvYXJjaGl2ZT4gCi0gICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPiAgCi0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGNvbXBpbGVyQXJndW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAtWGJvb3RjbGFzc3BhdGgvcDoke2Jhc2VkaXJ9Ly4uL2pheHdzLWFwaS90YXJnZXQvY2xhc3NlcyR7cGF0aC5zZXBhcmF0b3J9JHtiYXNlZGlyfS8uLi9qd3MtYXBpL3RhcmdldC9jbGFzc2VzCi0gICAgICAgICAgICAgICAgICAgIDwvY29tcGlsZXJBcmd1bWVudD4KLSAgICAgICAgICAgICAgICAgICAgPGNvbXBpbGVyVmVyc2lvbj4xLjU8L2NvbXBpbGVyVmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPHNvdXJjZT4xLjU8L3NvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgPHRhcmdldD4xLjU8L3RhcmdldD4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFudHJ1bi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+Z2VuLXRzPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5nZW5lcmF0ZS10ZXN0LXNvdXJjZXM8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhc2tzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFRoZXJlcyBnb3QgdG8gYmUgYSBiZXR0ZXIgd2F5IHRvIGRvIHRoaXMgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzY2hlbWEuc291cmNlLmRpciIgdmFsdWU9InRlc3QtcmVzb3VyY2VzL3hzZCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0id3NkbC5zb3VyY2UuZGlyIiB2YWx1ZT0idGVzdC1yZXNvdXJjZXMvd3NkbCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ic2NoZW1hLm91dHB1dC5iYXNlLmRpciIgdmFsdWU9InRhcmdldC9zY2hlbWEiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InNjaGVtYS5nZW5lcmF0ZWQuc3JjLmRpciIgdmFsdWU9IiR7c2NoZW1hLm91dHB1dC5iYXNlLmRpcn0vc3JjIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzY2hlbWEuZ2VuZXJhdGVkLmNsYXNzZXMuZGlyIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9IiR7c2NoZW1hLm91dHB1dC5iYXNlLmRpcn0vY2xhc3NlcyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIG1ha2UgdGhlIGRpcnMgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxta2RpciBkaXI9IiR7c2NoZW1hLm91dHB1dC5iYXNlLmRpcn0iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1rZGlyIGRpcj0iJHtzY2hlbWEuZ2VuZXJhdGVkLnNyYy5kaXJ9Ii8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxta2RpciBkaXI9IiR7c2NoZW1hLmdlbmVyYXRlZC5jbGFzc2VzLmRpcn0iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBSdW4gSkFYQiBzY2hlbWEgY29tcGlsZXIgd2l0aCBkZXNpZ25hdGVkIHNjaGVtYXMgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlY2hvPkdlbmVyYXRpbmcgSkFYLUIgY2xhc3NlcyBmcm9tIFhTRHM8L2VjaG8+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVjaG8+R2VuZXJhdGluZyBqYXZhIGZyb20gZWNoby54c2Q8L2VjaG8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxqYXZhIGNsYXNzbmFtZT0iY29tLnN1bi50b29scy54amMuRHJpdmVyIiBmb3JrPSJ0cnVlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc3BhdGggcmVmaWQ9Im1hdmVuLnJ1bnRpbWUuY2xhc3NwYXRoIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoIGxvY2F0aW9uPSIke2NvbXBpbGVkLmNsYXNzZXMuZGlyfSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFyZyBsaW5lPSItZCAke3NjaGVtYS5nZW5lcmF0ZWQuc3JjLmRpcn0gLXF1aWV0ICAke3NjaGVtYS5zb3VyY2UuZGlyfS9lY2hvLnhzZCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2phdmE+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVjaG8+R2VuZXJhdGluZyBqYXZhIGZyb20gc3RvY2sxLnhzZDwvZWNobz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGphdmEgY2xhc3NuYW1lPSJjb20uc3VuLnRvb2xzLnhqYy5Ecml2ZXIiIGZvcms9InRydWUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzcGF0aCByZWZpZD0ibWF2ZW4ucnVudGltZS5jbGFzc3BhdGgiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc3BhdGggbG9jYXRpb249IiR7Y29tcGlsZWQuY2xhc3Nlcy5kaXJ9Ii8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJnIGxpbmU9Ii1kICR7c2NoZW1hLmdlbmVyYXRlZC5zcmMuZGlyfSAtcXVpZXQgJHtzY2hlbWEuc291cmNlLmRpcn0vc3RvY2sxLnhzZCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2phdmE+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVjaG8+R2VuZXJhdGluZyBqYXZhIGZyb20gc3RvY2syLnhzZDwvZWNobz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGphdmEgY2xhc3NuYW1lPSJjb20uc3VuLnRvb2xzLnhqYy5Ecml2ZXIiIGZvcms9InRydWUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzcGF0aCByZWZpZD0ibWF2ZW4ucnVudGltZS5jbGFzc3BhdGgiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc3BhdGggbG9jYXRpb249IiR7Y29tcGlsZWQuY2xhc3Nlcy5kaXJ9Ii8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJnIGxpbmU9Ii1kICR7c2NoZW1hLmdlbmVyYXRlZC5zcmMuZGlyfSAtcXVpZXQgJHtzY2hlbWEuc291cmNlLmRpcn0vc3RvY2syLnhzZCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2phdmE+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVjaG8+R2VuZXJhdGluZyBqYXZhIGZyb20gc2FtcGxlbXRvbS54c2Q8L2VjaG8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxqYXZhIGNsYXNzbmFtZT0iY29tLnN1bi50b29scy54amMuRHJpdmVyIiBmb3JrPSJ0cnVlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc3BhdGggcmVmaWQ9Im1hdmVuLnJ1bnRpbWUuY2xhc3NwYXRoIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoIGxvY2F0aW9uPSIke2NvbXBpbGVkLmNsYXNzZXMuZGlyfSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFyZyBsaW5lPSItZCAke3NjaGVtYS5nZW5lcmF0ZWQuc3JjLmRpcn0gLXF1aWV0ICR7c2NoZW1hLnNvdXJjZS5kaXJ9L3NhbXBsZW10b20ueHNkIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvamF2YT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVjaG8+R2VuZXJhdGluZyBqYXZhIGZyb20gUHJveHlEb2NMaXRXcmFwcGVkLndzZGw8L2VjaG8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxqYXZhIGNsYXNzbmFtZT0iY29tLnN1bi50b29scy54amMuRHJpdmVyIiBmb3JrPSJ0cnVlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc3BhdGggcmVmaWQ9Im1hdmVuLnJ1bnRpbWUuY2xhc3NwYXRoIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoIGxvY2F0aW9uPSIke2NvbXBpbGVkLmNsYXNzZXMuZGlyfSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFyZyBsaW5lPSItZCAke3NjaGVtYS5nZW5lcmF0ZWQuc3JjLmRpcn0gLXF1aWV0IC1wIG9yZy50ZXN0LnByb3h5LmRvY2xpdHdyYXBwZWQgLXF1aWV0IC13c2RsICR7d3NkbC5zb3VyY2UuZGlyfS9Qcm94eURvY0xpdFdyYXBwZWQud3NkbCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2phdmE+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlY2hvPkdlbmVyYXRpbmcgamF2YSBmcm9tIEFkZE51bWJlcnMud3NkbDwvZWNobz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGphdmEgY2xhc3NuYW1lPSJjb20uc3VuLnRvb2xzLnhqYy5Ecml2ZXIiIGZvcms9InRydWUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzcGF0aCByZWZpZD0ibWF2ZW4ucnVudGltZS5jbGFzc3BhdGgiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc3BhdGggbG9jYXRpb249IiR7Y29tcGlsZWQuY2xhc3Nlcy5kaXJ9Ii8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJnIGxpbmU9Ii1kICR7c2NoZW1hLmdlbmVyYXRlZC5zcmMuZGlyfSAtcXVpZXQgLXdzZGwgJHt3c2RsLnNvdXJjZS5kaXJ9L0FkZE51bWJlcnMud3NkbCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2phdmE+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YXNrcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5ydW48L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5idWlsZC1yZXBvPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT50ZXN0LWNvbXBpbGU8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhc2tzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29weSB0b0Rpcj0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy8iPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJ0ZXN0LXJlc291cmNlcy8iPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoucHJvcGVydGllcyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqL2F4aXMyLnhtbCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvcHk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJhZGRyZXNzaW5nX3ZlcnNpb24iIHZhbHVlPSIke3ZlcnNpb259Ii8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhbnQgYW50ZmlsZT0iYnVpbGQueG1sIiBpbmhlcml0YWxsPSJ0cnVlIiBpbmhlcml0cmVmcz0idHJ1ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXI9Ii4iIHRhcmdldD0iYnVpbGQtcmVwbyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFza3M+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+cnVuPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmJ1aWxkLWhlbHBlci1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+YWRkLXRlc3Qtc291cmNlPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wcm9jZXNzLXRlc3QtcmVzb3VyY2VzPC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5hZGQtdGVzdC1zb3VyY2U8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNvdXJjZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzb3VyY2U+JHtiYXNlZGlyfS90YXJnZXQvc2NoZW1hL3NyYzwvc291cmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc291cmNlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHNraXA+ZmFsc2U8L3NraXA+Ci0gICAgICAgICAgICAgICAgICAgIDxmb3JrTW9kZT5vbmNlPC9mb3JrTW9kZT4KLSAgICAgICAgICAgICAgICAgICAgPGFyZ0xpbmU+LVhtczI1Nm0gLVhteDUxMm08L2FyZ0xpbmU+Ci0gICAgICAgICAgICAgICAgICAgIDwhLS0gRW5hYmxlIHRoZSBuZXh0IDIgbGluZXMgaWYgeW91IHdhbnQgdG8gYXR0YWNoIGEgZGVidWdnZXIKLSAgICAgICAgICAgICAgICAgICAgPGFyZ0xpbmU+LVhkZWJ1ZyAtWG5vYWdlbnQgLURqYXZhLmNvbXBpbGVyPU5PTkUgLVhydW5qZHdwOnRyYW5zcG9ydD1kdF9zb2NrZXQsc2VydmVyPXksc3VzcGVuZD15LGFkZHJlc3M9NTAwNjwvYXJnTGluZT4tLT4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKlRlc3QuamF2YTwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLypUZXN0cy5qYXZhPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8c3lzdGVtUHJvcGVydGllcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwhLS08cHJvcGVydHk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+T0FTSVNDYXRhbG9nTWFuYWdlci5jYXRhbG9nLmRlYnVnLmxldmVsPC9uYW1lPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2YWx1ZT45OTk5PC92YWx1ZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+LS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+YnVpbGQucmVwb3NpdG9yeTwvbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmFsdWU+Li90YXJnZXQvdGVzdC1jbGFzc2VzPC92YWx1ZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+amF2YXgueG1sLnNvYXAuTWVzc2FnZUZhY3Rvcnk8L25hbWU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZhbHVlPm9yZy5hcGFjaGUuYXhpczIuc2Fhai5NZXNzYWdlRmFjdG9yeUltcGw8L3ZhbHVlPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5qYXZheC54bWwuc29hcC5TT0FQRmFjdG9yeTwvbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmFsdWU+b3JnLmFwYWNoZS5heGlzMi5zYWFqLlNPQVBGYWN0b3J5SW1wbDwvdmFsdWU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3Byb3BlcnR5PgotICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPmphdmF4LnhtbC5zb2FwLlNPQVBDb25uZWN0aW9uRmFjdG9yeTwvbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmFsdWU+b3JnLmFwYWNoZS5heGlzMi5zYWFqLlNPQVBDb25uZWN0aW9uRmFjdG9yeUltcGw8L3ZhbHVlPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5qYXZheC54bWwuc29hcC5NZXRhRmFjdG9yeTwvbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmFsdWU+b3JnLmFwYWNoZS5heGlzMi5zYWFqLlNBQUpNZXRhRmFjdG9yeUltcGw8L3ZhbHVlPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gTmVlZCB0aGlzIGZvciB0aGUgY2xpZW50IHNpZGUgdG8gcGlja3VwIGFuIGF4aXMyLnhtbCB0byBjb25maWd1cmUgU29hcE1lc3NhZ2VNVVByb3ZpZGVyQ2hlY2tlciAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5vcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvbmZpZy5wYXRoPC9uYW1lPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2YWx1ZT4uL3RhcmdldC90ZXN0LWNsYXNzZXMvYXhpczIueG1sPC92YWx1ZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+b3JnLmFwYWNoZS5heGlzMi5qYXh3cy5yZXBvLnBhdGg8L25hbWU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZhbHVlPi4vdGFyZ2V0L3JlcG9zaXRvcnk8L3ZhbHVlPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KLSAgICAgICAgICAgICAgICAgICAgPC9zeXN0ZW1Qcm9wZXJ0aWVzPgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgPC9idWlsZD4KLSAgICA8cmVwb3J0aW5nPgotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXJlcG9ydC1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvcmVwb3J0aW5nPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvcmVzb3VyY2VzL01FVEEtSU5GL01BTklGRVNULk1GIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvcmVzb3VyY2VzL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWU5Y2ZlLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Jlc291cmNlcy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjANCi1CdW5kbGUtTGljZW5zZTogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wLnR4dA0KLUltcG9ydC1QYWNrYWdlOiANCi0gamF2YXguYWN0aXZhdGlvbiwNCi0gamF2YXguYW5ub3RhdGlvbiwNCi0gamF2YXguaW1hZ2VpbywNCi0gamF2YXguaW1hZ2Vpby5tZXRhZGF0YSwNCi0gamF2YXguaW1hZ2Vpby5zdHJlYW0sDQotIGphdmF4Lmp3cywNCi0gamF2YXguandzLnNvYXAsDQotIGphdmF4Lm1haWwsDQotIGphdmF4Lm1haWwuaW50ZXJuZXQsDQotIGphdmF4LnNlcnZsZXQuaHR0cCwNCi0gamF2YXgud3NkbCwNCi0gamF2YXgud3NkbC5leHRlbnNpb25zLA0KLSBqYXZheC53c2RsLmV4dGVuc2lvbnMuc2NoZW1hLA0KLSBqYXZheC54bWwuYmluZCwNCi0gamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbiwNCi0gamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5hZGFwdGVycywNCi0gamF2YXgueG1sLmJpbmQuYXR0YWNobWVudCwNCi0gamF2YXgueG1sLmJpbmQudXRpbCwNCi0gamF2YXgueG1sLmRhdGF0eXBlLA0KLSBqYXZheC54bWwubmFtZXNwYWNlLA0KLSBqYXZheC54bWwucGFyc2VycywNCi0gamF2YXgueG1sLnNvYXAsDQotIGphdmF4LnhtbC5zdHJlYW0sDQotIGphdmF4LnhtbC50cmFuc2Zvcm0sDQotIGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLA0KLSBqYXZheC54bWwudHJhbnNmb3JtLnNheCwNCi0gamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0sDQotIGphdmF4LnhtbC53cywNCi0gamF2YXgueG1sLndzLmhhbmRsZXIsDQotIGphdmF4LnhtbC53cy5oYW5kbGVyLnNvYXAsDQotIGphdmF4LnhtbC53cy5odHRwLA0KLSBqYXZheC54bWwud3Muc29hcCwNCi0gamF2YXgueG1sLndzLnNwaSwNCi0gamF2YXgueG1sLndzLndzYWRkcmVzc2luZywNCi0gb3JnLmFwYWNoZS5heGlvbS5hdHRhY2htZW50cywNCi0gb3JnLmFwYWNoZS5heGlvbS5vbSwNCi0gb3JnLmFwYWNoZS5heGlvbS5vbS5kcywNCi0gb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLA0KLSBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuYnVpbGRlciwNCi0gb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmRvbSwNCi0gb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmxsb20sDQotIG9yZy5hcGFjaGUuYXhpb20ub20udXRpbCwNCi0gb3JnLmFwYWNoZS5heGlvbS5zb2FwLA0KLSBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuaW1wbC5idWlsZGVyLA0KLSBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuaW1wbC5sbG9tLnNvYXAxMSwNCi0gb3JnLmFwYWNoZS5heGlvbS5zb2FwLmltcGwubGxvbS5zb2FwMTIsDQotIG9yZy5hcGFjaGUuYXhpczIsDQotIG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZywNCi0gb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLm1ldGFkYXRhLA0KLSBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudCwNCi0gb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuYXN5bmMsDQotIG9yZy5hcGFjaGUuYXhpczIuY29udGV4dCwNCi0gb3JnLmFwYWNoZS5heGlzMi5kYXRhc291cmNlLA0KLSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFzb3VyY2UuamF4YiwNCi0gb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LA0KLSBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQucmVwb3NpdG9yeS51dGlsLA0KLSBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQudXRpbCwNCi0gb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbiwNCi0gb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUsDQotIG9yZy5hcGFjaGUuYXhpczIuaGFuZGxlcnMsDQotIG9yZy5hcGFjaGUuYXhpczIuaTE4biwNCi0gb3JnLmFwYWNoZS5heGlzMi5qYXZhLnNlY3VyaXR5LA0KLSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmFkZHJlc3NpbmcsDQotIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY2F0YWxvZy5pbXBsLA0KLSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNhdGFsb2csDQotIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5jb252ZXJ0ZXIsDQotIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlciwNCi0gb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5pbXBsLA0KLSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLnZhbGlkYXRvciwNCi0gb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi54bWwuaGFuZGxlciwNCi0gb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbiwNCi0gb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5mZWF0dXJlLA0KLSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmkxOG4sDQotIG9yZy5hcGFjaGUuYXhpczIuamF4d3MucmVnaXN0cnksDQotIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2VydmVyLmNvbmZpZywNCi0gb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51dGlsLA0KLSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLndzZGwsDQotIG9yZy5hcGFjaGUuYXhpczIuamF4d3MsDQotIG9yZy5hcGFjaGUuYXhpczIubWV0YWRhdGEuZmFjdG9yeSwNCi0gb3JnLmFwYWNoZS5heGlzMi5tZXRhZGF0YS5yZWdpc3RyeSwNCi0gb3JnLmFwYWNoZS5heGlzMi5tZXRhZGF0YS5yZXNvdXJjZS5pbXBsLA0KLSBvcmcuYXBhY2hlLmF4aXMyLm1ldGFkYXRhLnJlc291cmNlLA0KLSBvcmcuYXBhY2hlLmF4aXMyLnNhYWosDQotIG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0LA0KLSBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLA0KLSBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLnNlcnZlciwNCi0gb3JnLmFwYWNoZS5heGlzMi51dGlsLA0KLSBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZywNCi0gb3JnLnczYy5kb20sDQotIG9yZy54bWwuc2F4DQotRXhwb3J0LVBhY2thZ2U6IA0KLSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFzb3VyY2UuamF4YiwNCi0gb3JnLmFwYWNoZS5heGlzMi5kYXRhc291cmNlLA0KLSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmFkZHJlc3NpbmcuZmFjdG9yeS5pbXBsLA0KLSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmFkZHJlc3NpbmcuZmFjdG9yeSwNCi0gb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5hZGRyZXNzaW5nLm1pZ3JhdG9yLA0KLSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmFkZHJlc3NpbmcudXRpbCwNCi0gb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5hZGRyZXNzaW5nLA0KLSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmJpbmRpbmcsDQotIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY2xpZW50LmFzeW5jLA0KLSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNsaWVudC5jb25maWcsDQotIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY2xpZW50LmRpc3BhdGNoLA0KLSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNsaWVudC5wcm94eSwNCi0gb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jbGllbnQsDQotIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29udGV4dC5mYWN0b3J5LA0KLSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvbnRleHQudXRpbHMsDQotIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29udGV4dCwNCi0gb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLmNvbnRyb2xsZXIuaW1wbCwNCi0gb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLmNvbnRyb2xsZXIsDQotIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS51dGlsLA0KLSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUsDQotIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGlzcGF0Y2hlcnMsDQotIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZmVhdHVyZSwNCi0gb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5mcmFtZXdvcmssDQotIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaGFuZGxlci5mYWN0b3J5LmltcGwsDQotIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaGFuZGxlci5mYWN0b3J5LA0KLSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmhhbmRsZXIuaW1wbCwNCi0gb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5oYW5kbGVyLmxpZmVjeWNsZS5mYWN0b3J5LA0KLSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmhhbmRsZXIubGlmZWN5Y2xlLmltcGwsDQotIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaGFuZGxlciwNCi0gb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5pbmplY3Rpb24sDQotIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubGlmZWN5Y2xlLA0KLSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1hcnNoYWxsZXIuZmFjdG9yeSwNCi0gb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tYXJzaGFsbGVyLmltcGwuYWx0LA0KLSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1hcnNoYWxsZXIsDQotIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5hdHRhY2htZW50cywNCi0gb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmRhdGFiaW5kaW5nLmltcGwsDQotIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5kYXRhYmluZGluZywNCi0gb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmZhY3RvcnksDQotIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5pbXBsLA0KLSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UudXRpbC5pbXBsLA0KLSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UudXRpbCwNCi0gb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLA0KLSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnJlZ2lzdHJ5LA0KLSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnJ1bnRpbWUuZGVzY3JpcHRpb24uaW5qZWN0aW9uLmltcGwsDQotIG9yZy5hcGFjaGUuYXhpczIuamF4d3MucnVudGltZS5kZXNjcmlwdGlvbi5pbmplY3Rpb24sDQotIG9yZy5hcGFjaGUuYXhpczIuamF4d3MucnVudGltZS5kZXNjcmlwdGlvbi5tYXJzaGFsLmltcGwsDQotIG9yZy5hcGFjaGUuYXhpczIuamF4d3MucnVudGltZS5kZXNjcmlwdGlvbi5tYXJzaGFsLA0KLSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNlcnZlci5kaXNwYXRjaGVyLmZhY3RvcnksDQotIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2VydmVyLmRpc3BhdGNoZXIsDQotIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2VydmVyLmVuZHBvaW50LmluamVjdGlvbi5mYWN0b3J5LA0KLSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNlcnZlci5lbmRwb2ludC5pbmplY3Rpb24uaW1wbCwNCi0gb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zZXJ2ZXIuZW5kcG9pbnQuaW5qZWN0aW9uLA0KLSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNlcnZlci5lbmRwb2ludC5saWZlY3ljbGUuZmFjdG9yeS5pbXBsLA0KLSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNlcnZlci5lbmRwb2ludC5saWZlY3ljbGUuZmFjdG9yeSwNCi0gb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zZXJ2ZXIuZW5kcG9pbnQubGlmZWN5Y2xlLmltcGwsDQotIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2VydmVyLmVuZHBvaW50LmxpZmVjeWNsZSwNCi0gb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zZXJ2ZXIuZW5kcG9pbnQsDQotIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2VydmVyLA0KLSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNwaS5oYW5kbGVyLA0KLSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNwaS5taWdyYXRvciwNCi0gb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zcGksDQotIG9yZy5hcGFjaGUuYXhpczIuamF4d3MudXRpbGl0eSwNCi0gb3JnLmFwYWNoZS5heGlzMi5qYXh3cy53cmFwcGVyLmltcGwsDQotIG9yZy5hcGFjaGUuYXhpczIuamF4d3Mud3JhcHBlciwNCi0gb3JnLmFwYWNoZS5heGlzMi5qYXh3cy53c2RsLmltcGwsDQotIG9yZy5hcGFjaGUuYXhpczIuamF4d3Mud3NkbCwNCi0gb3JnLmFwYWNoZS5heGlzMi5qYXh3cw0KLUJ1bmRsZS1WZXJzaW9uOiAxLjQNCi1CdW5kbGUtTmFtZTogQXhpczIgSkFYV1MNCi1CdW5kbGUtRG9jVVJMOiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvDQotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMg0KLUJ1bmRsZS1WZW5kb3I6IEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmFwYWNoZS5heGlzMi5qYXh3cw0KLQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9qYXZheC54bWwud3Muc3BpLlByb3ZpZGVyIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL2phdmF4LnhtbC53cy5zcGkuUHJvdmlkZXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5NTMxOTYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL2phdmF4LnhtbC53cy5zcGkuUHJvdmlkZXIKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1vcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNwaS5Qcm92aWRlcgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFzb3VyY2UvU291cmNlRGF0YVNvdXJjZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YXNvdXJjZS9Tb3VyY2VEYXRhU291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwNWMzMzcuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YXNvdXJjZS9Tb3VyY2VEYXRhU291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhc291cmNlOw0KLQ0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZUV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5kcy5PTURhdGFTb3VyY2VFeHRCYXNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLnV0aWwuU3RBWFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsNCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5SZXN1bHQ7DQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOw0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyOw0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeTsNCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0Ow0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1Tb3VyY2U7DQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07DQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247DQotDQotLyoqDQotICogT01EYXRhU291cmNlIGJhY2tlZCBieSBhIHNvdXJjZQ0KLSAqLw0KLXB1YmxpYyBjbGFzcyBTb3VyY2VEYXRhU291cmNlIGV4dGVuZHMgT01EYXRhU291cmNlRXh0QmFzZSB7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhTb3VyY2VEYXRhU291cmNlLmNsYXNzKTsNCi0gICAgU291cmNlIGRhdGE7DQotDQotICAgIHB1YmxpYyBTb3VyY2VEYXRhU291cmNlKFNvdXJjZSBkYXRhKSB7DQotICAgICAgICBzdXBlcigpOw0KLSAgICAgICAgdGhpcy5kYXRhID0gZGF0YTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgT01EYXRhU291cmNlRXh0IGNvcHkoKSB7DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgT2JqZWN0IGdldE9iamVjdCgpIHsNCi0gICAgICAgIHJldHVybiBkYXRhOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBYTUxTdHJlYW1SZWFkZXIgZ2V0UmVhZGVyKCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7DQotDQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIFN0cmluZyBlbmNvZGluZyA9ICJ1dGYtOCI7DQotICAgICAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oZ2V0WE1MQnl0ZXMoZW5jb2RpbmcpKTsNCi0gICAgICAgICAgICByZXR1cm4gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihpcywgZW5jb2RpbmcpOw0KLSAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IFhNTFN0cmVhbUV4Y2VwdGlvbihlKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYnl0ZVtdIGdldFhNTEJ5dGVzKFN0cmluZyBlbmNvZGluZykgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gew0KLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKCJTdGFydCBnZXRYTUxCeXRlcyIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgYnl0ZVtdIGJ5dGVzID0gbnVsbDsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgYnl0ZXMgPSAoYnl0ZVtdKSBudWxsOw0KLQ0KLSAgICAgICAgICAgIGlmIChkYXRhIGluc3RhbmNlb2YgU3RyZWFtU291cmNlKSB7DQotICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGlzID0gKChTdHJlYW1Tb3VyY2UpIGRhdGEpLmdldElucHV0U3RyZWFtKCk7DQotICAgICAgICAgICAgICAgIGlmIChpcyAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICBieXRlcyA9IGdldEJ5dGVzRnJvbVN0cmVhbShpcyk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOw0KLSAgICAgICAgICAgICAgICBSZXN1bHQgcmVzdWx0ID0gbmV3IFN0cmVhbVJlc3VsdChvdXQpOw0KLSAgICAgICAgICAgICAgICBUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1RyYW5zZm9ybWVyKCk7DQotICAgICAgICAgICAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybShkYXRhLCByZXN1bHQpOw0KLSAgICAgICAgICAgICAgICBieXRlcyA9IG91dC50b0J5dGVBcnJheSgpOw0KLSAgICAgICAgICAgIH0gICAgICAgICAgICANCi0gICAgICAgIH0gY2F0Y2ggKE9NRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICB0aHJvdyBlOw0KLSAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgdGhyb3cgZTsNCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IE9NRXhjZXB0aW9uKGUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcoIkVuZCBnZXRYTUxCeXRlcyIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGJ5dGVzOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzRGVzdHJ1Y3RpdmVSZWFkKCkgew0KLSAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzRGVzdHJ1Y3RpdmVXcml0ZSgpIHsNCi0gICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIGdldEJ5dGVzRnJvbVN0cmVhbShJbnB1dFN0cmVhbSBpcykgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIC8vIFRPRE8gVGhpcyBjb2RlIGFzc3VtZXMgdGhhdCBhdmFpbGFibGUgaXMgdGhlIGxlbmd0aCBvZiB0aGUgc3RyZWFtLg0KLSAgICAgICAgYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbaXMuYXZhaWxhYmxlKCldOw0KLSAgICAgICAgaXMucmVhZChieXRlcyk7DQotICAgICAgICByZXR1cm4gYnl0ZXM7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YXNvdXJjZS9YTUxTdHJpbmdEYXRhU291cmNlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhc291cmNlL1hNTFN0cmluZ0RhdGFTb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjUzMTVjOS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhc291cmNlL1hNTFN0cmluZ0RhdGFTb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YXNvdXJjZTsNCi0NCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTURhdGFTb3VyY2VFeHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uZHMuT01EYXRhU291cmNlRXh0QmFzZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS51dGlsLlN0QVhVdGlsczsNCi0NCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247DQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOw0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247DQotDQotLyoqDQotICogT01EYXRhU291cmNlIGJhY2tlZCBieSBhIHN0cmluZyBjb250YWluaW5nIHhtbCBkYXRhDQotICovDQotcHVibGljIGNsYXNzIFhNTFN0cmluZ0RhdGFTb3VyY2UgZXh0ZW5kcyBPTURhdGFTb3VyY2VFeHRCYXNlIHsNCi0gICAgU3RyaW5nIGRhdGE7DQotDQotICAgIHB1YmxpYyBYTUxTdHJpbmdEYXRhU291cmNlKFN0cmluZyBkYXRhKSB7DQotICAgICAgICBzdXBlcigpOw0KLSAgICAgICAgdGhpcy5kYXRhID0gZGF0YTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgT01EYXRhU291cmNlRXh0IGNvcHkoKSB7DQotICAgICAgICByZXR1cm4gbmV3IFhNTFN0cmluZ0RhdGFTb3VyY2UoZGF0YSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE9iamVjdCBnZXRPYmplY3QoKSB7DQotICAgICAgICByZXR1cm4gZGF0YTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgWE1MU3RyZWFtUmVhZGVyIGdldFJlYWRlcigpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gew0KLQ0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBTdHJpbmcgZW5jb2RpbmcgPSAidXRmLTgiOw0KLSAgICAgICAgICAgIElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGdldFhNTEJ5dGVzKGVuY29kaW5nKSk7DQotICAgICAgICAgICAgcmV0dXJuIFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoaXMsIGVuY29kaW5nKTsNCi0gICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBYTUxTdHJlYW1FeGNlcHRpb24oZSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJ5dGVbXSBnZXRYTUxCeXRlcyhTdHJpbmcgZW5jb2RpbmcpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsNCi0gICAgICAgIHJldHVybiBkYXRhLmdldEJ5dGVzKGVuY29kaW5nKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0Rlc3RydWN0aXZlUmVhZCgpIHsNCi0gICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0Rlc3RydWN0aXZlV3JpdGUoKSB7DQotICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgIH0NCi0gICAgDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFzb3VyY2UvamF4Yi9KQVhCQXR0YWNobWVudE1hcnNoYWxsZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFzb3VyY2UvamF4Yi9KQVhCQXR0YWNobWVudE1hcnNoYWxsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2UwNTc0OS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhc291cmNlL2pheGIvSkFYQkF0dGFjaG1lbnRNYXJzaGFsbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhc291cmNlLmpheGI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FeGNlcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01UZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuTVRPTVhNTFN0cmVhbVdyaXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmxsb20uT01UZXh0SW1wbDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5IVFRQQ29uc3RhbnRzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXI7DQotaW1wb3J0IGphdmF4Lm1haWwuTWVzc2FnaW5nRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC5tYWlsLmludGVybmV0LkludGVybmV0SGVhZGVyczsNCi1pbXBvcnQgamF2YXgubWFpbC5pbnRlcm5ldC5NaW1lQm9keVBhcnQ7DQotaW1wb3J0IGphdmF4Lm1haWwuaW50ZXJuZXQuTWltZVBhcnREYXRhU291cmNlOw0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hdHRhY2htZW50LkF0dGFjaG1lbnRNYXJzaGFsbGVyOw0KLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlcjsNCi0NCi0vKioNCi0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgSkFYQiBBdHRhY2htZW50TWFyc2hhbGxlciB0aGF0IGlzIHVzZWQgdG8gaGFuZGxlIGJpbmFyeSBkYXRhIGZyb20gSkFYQg0KLSAqIGFuZCBjcmVhdGUgcG9wdWxhdGUgdGhlIGFwcHJvcHJpYXRlIGNvbnN0cnVjdHMgb24gdGhlIE1lc3NhZ2VDb250ZXh0DQotICovDQotcHVibGljIGNsYXNzIEpBWEJBdHRhY2htZW50TWFyc2hhbGxlciBleHRlbmRzIEF0dGFjaG1lbnRNYXJzaGFsbGVyIHsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEpBWEJBdHRhY2htZW50TWFyc2hhbGxlci5jbGFzcyk7DQotDQotICAgIHByaXZhdGUgTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dDsNCi0gICAgcHJpdmF0ZSBYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQTElDQVRJT05fT0NURVQgPSAiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIjsNCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBDb25zdHJ1Y3QgdGhlIEpBWEJBdHRhY2htZW50TWFyc2hhbGxlciB0aGF0IGhhcyBhY2Nlc3MgdG8gdGhlIE1lc3NhZ2VDb250ZXh0DQotICAgICAqIEBwYXJhbSBtc2dDb250ZXh0DQotICAgICAqIEBwYXJhbSB3cml0ZXINCi0gICAgICovDQotICAgIHB1YmxpYyBKQVhCQXR0YWNobWVudE1hcnNoYWxsZXIoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCwgWE1MU3RyZWFtV3JpdGVyIHdyaXRlcikgew0KLSAgICAgICAgdGhpcy5tc2dDb250ZXh0ID0gbXNnQ29udGV4dDsNCi0gICAgICAgIHRoaXMud3JpdGVyID0gd3JpdGVyOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBPdmVycmlkZSBpc1hPUFBhY2thZ2V0IHRvIGNhbGN1bGF0ZSB0aGUgaXNYT1BQYWNrYWdlIHNldHRpbmcNCi0gICAgICovDQotICAgIHB1YmxpYyBib29sZWFuIGlzWE9QUGFja2FnZSgpIHsNCi0gICAgICAgIGJvb2xlYW4gdmFsdWUgPSBmYWxzZTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gRm9yIG91dGJvdW5kIG1lc3NhZ2VzLCBvbmx5IHRyaWdnZXIgTVRPTSBpZg0KLSAgICAgICAgLy8gdGhlIG1lc3NhZ2UgaXMgbXRvbSBlbmFibGVkLg0KLSAgICAgICAgdmFsdWUgPSBpc01UT01FbmFibGVkKCk7DQotICAgICAgICANCi0gICAgICAgIC8vIElmIHRoZSB3cml0ZXIgaXMgbm90IGFuIE1UT00gWE1MU3RyZWFtV3JpdGVyIHRoZW4gd2UgZG9uJ3QgaGF2ZQ0KLSAgICAgICAgLy8gYW55IHBsYWNlIHRvIHN0b3JlIHRoZSBhdHRhY2htZW50DQotICAgICAgICBpZiAoISh3cml0ZXIgaW5zdGFuY2VvZiBNVE9NWE1MU3RyZWFtV3JpdGVyKSkgew0KLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlRoZSB3cml0ZXIgaXMgbm90IGVuYWJsZWQgZm9yIE1UT00uICAiICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNVE9NIHZhbHVlcyB3aWxsIG5vdCBiZSBvcHRpbWl6ZWQiKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgdmFsdWUgPSBmYWxzZTsNCi0gICAgICAgIH0NCi0gICAgDQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpeyANCi0gICAgICAgICAgICBsb2cuZGVidWcoImlzWE9QUGFja2FnZSByZXR1cm5zICIgKyB2YWx1ZSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gdmFsdWU7ICAgICAgICANCi0gICAgfQ0KLQ0KLSAgICANCi0gICAgLyogKG5vbi1KYXZhZG9jKQ0KLSAgICAgKiBAc2VlIGphdmF4LnhtbC5iaW5kLmF0dGFjaG1lbnQuQXR0YWNobWVudE1hcnNoYWxsZXIjYWRkTXRvbUF0dGFjaG1lbnQoYnl0ZVtdLCBpbnQsIGludCwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykNCi0gICAgICovDQotICAgIHB1YmxpYyBTdHJpbmcgYWRkTXRvbUF0dGFjaG1lbnQoYnl0ZVtdIGRhdGEsIGludCBvZmZzZXQsIGludCBsZW5ndGgsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1pbWVUeXBlLCBTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbG9jYWxQYXJ0KSB7DQotDQotICAgICAgICBpZiAob2Zmc2V0ICE9IDAgfHwgbGVuZ3RoICE9IGRhdGEubGVuZ3RoKSB7DQotICAgICAgICAgICAgaW50IGxlbiA9IGxlbmd0aCAtIG9mZnNldDsNCi0gICAgICAgICAgICBieXRlW10gbmV3RGF0YSA9IG5ldyBieXRlW2xlbl07DQotICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShkYXRhLCBvZmZzZXQsIG5ld0RhdGEsIDAsIGxlbik7DQotICAgICAgICAgICAgZGF0YSA9IG5ld0RhdGE7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIGlmIChtaW1lVHlwZSA9PSBudWxsIHx8IG1pbWVUeXBlLmxlbmd0aCgpID09IDApIHsNCi0gICAgICAgICAgICBtaW1lVHlwZSA9IEFQUExJQ0FUSU9OX09DVEVUOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpeyANCi0gICAgICAgICAgICBsb2cuZGVidWcoIkFkZGluZyBNVE9NL1hPUCBieXRlIGFycmF5IGF0dGFjaG1lbnQgZm9yIGVsZW1lbnQ6ICIgKyANCi0gICAgICAgICAgICAgICAgICAgICAgInsiICsgbmFtZXNwYWNlICsgIn0iICsgbG9jYWxQYXJ0KTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgU3RyaW5nIGNpZCA9IG51bGw7DQotICAgICAgICANCi0gICAgICAgICAgICB0cnkgew0KLSAgICAgICAgICAgICAgICAvLyBDcmVhdGUgTUlNRSBCb2R5IFBhcnQNCi0gICAgICAgICAgICAgICAgSW50ZXJuZXRIZWFkZXJzIGloID0gbmV3IEludGVybmV0SGVhZGVycygpOw0KLSAgICAgICAgICAgICAgICBpaC5zZXRIZWFkZXIoSFRUUENvbnN0YW50cy5IRUFERVJfQ09OVEVOVF9UWVBFLCBtaW1lVHlwZSk7DQotICAgICAgICAgICAgICAgIE1pbWVCb2R5UGFydCBtYnAgPSBuZXcgTWltZUJvZHlQYXJ0KGloLCBkYXRhKTsNCi0gICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgIC8vQ3JlYXRlIGEgZGF0YSBzb3VyY2UgZm9yIHRoZSBNSU1FIEJvZHkgUGFydA0KLSAgICAgICAgICAgICAgICBNaW1lUGFydERhdGFTb3VyY2UgbXBkcyA9IG5ldyBNaW1lUGFydERhdGFTb3VyY2UobWJwKTsNCi0gICAgICAgICAgICAgICAgbG9uZyBkYXRhTGVuZ3RoID1kYXRhLmxlbmd0aDsNCi0gICAgICAgICAgICAgICAgSW50ZWdlciB2YWx1ZSA9IG51bGw7DQotICAgICAgICAgICAgICAgIGlmIChtc2dDb250ZXh0ICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gKEludGVnZXIpIG1zZ0NvbnRleHQuZ2V0UHJvcGVydHkoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uTVRPTV9USFJFU0hPTEQpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGludCBvcHRpbWl6ZWRUaHJlc2hvbGQgPSAodmFsdWUgIT0gbnVsbCkgPyB2YWx1ZS5pbnRWYWx1ZSgpIDogMDsNCi0NCi0gICAgICAgICAgICAgICAgaWYob3B0aW1pemVkVGhyZXNob2xkPT0wIHx8IGRhdGFMZW5ndGggPiBvcHRpbWl6ZWRUaHJlc2hvbGQpew0KLSAgICAgICAgICAgICAgICAJRGF0YUhhbmRsZXIgZGF0YUhhbmRsZXIgPSBuZXcgRGF0YUhhbmRsZXIobXBkcyk7DQotICAgICAgICAgICAgICAgIAljaWQgPSBhZGREYXRhSGFuZGxlcihkYXRhSGFuZGxlcik7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgIC8vIEFkZCB0aGUgY29udGVudCBpZCB0byB0aGUgbWltZSBib2R5IHBhcnQNCi0gICAgICAgICAgICAgICAgbWJwLnNldEhlYWRlcihIVFRQQ29uc3RhbnRzLkhFQURFUl9DT05URU5UX0lELCBjaWQpOw0KLSAgICAgICAgICAgIH0gY2F0Y2ggKE1lc3NhZ2luZ0V4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBPTUV4Y2VwdGlvbihlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIHJldHVybiBjaWQgPT0gbnVsbCA/IG51bGwgOiAiY2lkOiIgKyBjaWQ7DQotICAgIH0NCi0gICAgDQotICAgIA0KLSAgICAvKiAobm9uLUphdmFkb2MpDQotICAgICAqIEBzZWUgamF2YXgueG1sLmJpbmQuYXR0YWNobWVudC5BdHRhY2htZW50TWFyc2hhbGxlciNhZGRNdG9tQXR0YWNobWVudChqYXZheC5hY3RpdmF0aW9uLkRhdGFIYW5kbGVyLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQ0KLSAgICAgKi8NCi0gICAgcHVibGljIFN0cmluZyBhZGRNdG9tQXR0YWNobWVudChEYXRhSGFuZGxlciBkYXRhLCBTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbG9jYWxQYXJ0KSB7DQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpeyANCi0gICAgICAgICAgICBsb2cuZGVidWcoIkFkZGluZyBNVE9NL1hPUCBkYXRhaGFuZGxlciBhdHRhY2htZW50IGZvciBlbGVtZW50OiAiICsgDQotICAgICAgICAgICAgICAgICAgICAgICJ7IiArIG5hbWVzcGFjZSArICJ9IiArIGxvY2FsUGFydCk7DQotICAgICAgICB9DQotICAgICAgICBTdHJpbmcgY2lkID0gYWRkRGF0YUhhbmRsZXIoZGF0YSk7DQotICAgICAgICByZXR1cm4gY2lkID09IG51bGwgPyBudWxsIDogImNpZDoiICsgY2lkOw0KLSAgICB9DQotICAgIA0KLSAgICANCi0gICAgLyogKG5vbi1KYXZhZG9jKQ0KLSAgICAgKiBAc2VlIGphdmF4LnhtbC5iaW5kLmF0dGFjaG1lbnQuQXR0YWNobWVudE1hcnNoYWxsZXIjYWRkU3dhUmVmQXR0YWNobWVudChqYXZheC5hY3RpdmF0aW9uLkRhdGFIYW5kbGVyKQ0KLSAgICAgKi8NCi0gICAgcHVibGljIFN0cmluZyBhZGRTd2FSZWZBdHRhY2htZW50KERhdGFIYW5kbGVyIGRhdGEpIHsNCi0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSl7IA0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiQWRkaW5nIFNXQVJFRiBhdHRhY2htZW50Iik7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIFN0cmluZyBjaWQgPSBhZGREYXRhSGFuZGxlcihkYXRhKTsNCi0gICAgICAgIHNldERvaW5nU1dBKCk7DQotICAgICAgICByZXR1cm4gImNpZDoiICsgY2lkOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogQWRkIHRoZSBEYXRhSGFuZGxlciB0byB0aGUgd3JpdGVyIGFuZCBjb250ZXh0DQotICAgICAqIEBwYXJhbSBkaA0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqLw0KLSAgICBwcml2YXRlIFN0cmluZyBhZGREYXRhSGFuZGxlcihEYXRhSGFuZGxlciBkaCkgew0KLSAgICAgICAgU3RyaW5nIGNpZCA9IG51bGw7DQotICAgICAgICBPTVRleHQgdGV4dE5vZGUgPSBudWxsOw0KLSAgICAgICAgDQotICAgICAgICAvLyBJZiB0aGlzIGlzIGFuIE1UT01YTUxTdHJlYW1Xcml0ZXIgdGhlbiBpbmZvcm0gdGhlIHdyaXRlciANCi0gICAgICAgIC8vIHRoYXQgaXQgbXVzdCB3cml0ZSBvdXQgdGhpcyBhdHRjaG1lbnQgKEkgZ3Vlc3Mgd2Ugc2hvdWxkIGRvIHRoaXMNCi0gICAgICAgIC8vIGV2ZW4gaWYgdGhlIGF0dGFjaG1lbnQgaXMgU1dBUkVGID8pDQotICAgICAgICBpZiAod3JpdGVyIGluc3RhbmNlb2YgTVRPTVhNTFN0cmVhbVdyaXRlcikgew0KLSAgICAgICAgICAgIHRleHROb2RlID0gbmV3IE9NVGV4dEltcGwoZGgsIG51bGwpOw0KLSAgICAgICAgCWlmKCgoTVRPTVhNTFN0cmVhbVdyaXRlcikgd3JpdGVyKS5pc09wdGltaXplZFRocmVzaG9sZCh0ZXh0Tm9kZSkpew0KLSAgICAgICAgCQljaWQgPSB0ZXh0Tm9kZS5nZXRDb250ZW50SUQoKTsNCi0gICAgICAgIAkJKChNVE9NWE1MU3RyZWFtV3JpdGVyKSB3cml0ZXIpLndyaXRlT3B0aW1pemVkKHRleHROb2RlKTsNCi0gICAgICAgIAkJLy8gUmVtZW1iZXIgdGhlIGF0dGFjaG1lbnQgb24gdGhlIG1lc3NhZ2UuDQotICAgICAgICAJCWFkZERhdGFIYW5kbGVyKGRoLCBjaWQpOw0KLSAgICAgICAgCX0gICAgICAgIAkNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKXsgDQotICAgICAgICAgICAgbG9nLmRlYnVnKCIgICBjb250ZW50IGlkPSIgKyBjaWQpOw0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiICAgZGF0YUhhbmRsZXIgID0iICsgZGgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGNpZDsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogQHJldHVybiBpZiBNVE9NIGVuYWJsZWQgY2FsY3VsYXRlZCBmcm9tIHRoZSBjb250ZXh0IGluZm9ybWF0aW9uDQotICAgICAqLw0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc01UT01FbmFibGVkKCkgew0KLSAgICAgICAgaWYgKG1zZ0NvbnRleHQgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gKFN0cmluZykgbXNnQ29udGV4dC5nZXRQcm9wZXJ0eShDb25maWd1cmF0aW9uLkVOQUJMRV9NVE9NKTsNCi0gICAgICAgICAgICByZXR1cm4gKCJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKHZhbHVlKSk7DQotICAgICAgICB9ICANCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIEluZGljYXRlIG9uIHRoZSBjb250ZXh0IHRoYXQgU1dBIGF0dGFjaG1lbnRzIGFyZSBlbmNvdW50ZXJlZA0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgc2V0RG9pbmdTV0EoKSB7DQotICAgICAgICBpZiAobXNnQ29udGV4dCAhPSBudWxsKSB7DQotICAgICAgICAgICAgbXNnQ29udGV4dC5zZXREb2luZ1N3QSh0cnVlKTsNCi0gICAgICAgICAgICBtc2dDb250ZXh0LnNldFByb3BlcnR5KENvbmZpZ3VyYXRpb24uRU5BQkxFX1NXQSwgInRydWUiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIEluZm9ybSB0aGUgY29udGV4dCB0aGF0IGFuIEF0dGFjaG1lbnQgKERhdGFIYW5kbGVyLCBDSUQpIGlzIHdyaXR0ZW4uDQotICAgICAqIEBwYXJhbSBkaA0KLSAgICAgKiBAcGFyYW0gY2lkDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBhZGREYXRhSGFuZGxlcihEYXRhSGFuZGxlciBkaCwgU3RyaW5nIGNpZCkgew0KLSAgICAgICAgaWYgKG1zZ0NvbnRleHQgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIG1zZ0NvbnRleHQuYWRkQXR0YWNobWVudChjaWQsIGRoKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhc291cmNlL2pheGIvSkFYQkF0dGFjaG1lbnRVbm1hcnNoYWxsZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFzb3VyY2UvamF4Yi9KQVhCQXR0YWNobWVudFVubWFyc2hhbGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZmFkODMyLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFzb3VyY2UvamF4Yi9KQVhCQXR0YWNobWVudFVubWFyc2hhbGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YXNvdXJjZS5qYXhiOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NWE1MU3RyZWFtUmVhZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaTE4bi5NZXNzYWdlczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5hY3RpdmF0aW9uLkRhdGFIYW5kbGVyOw0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hdHRhY2htZW50LkF0dGFjaG1lbnRVbm1hcnNoYWxsZXI7DQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOw0KLQ0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsNCi0NCi0vKioNCi0gKiBKQVhCQXR0YWNobWVudFVubWFyc2hhbGxlcg0KLSAqIDxwLz4NCi0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgPGxpbms+amF2YXgueG1sLmJpbmQuYXR0YWNobWVudC5BdHRhY2htZW50VW5tYXJzaGFsbGVyPC9saW5rPiB0aGF0IGlzDQotICogdXNlZCBmb3IgZGVzZXJpYWxpemluZyBYT1AgZWxlbWVudHMgaW50byB0aGVpciBjb3JyZXNwb25kaW5nIGJpbmFyeSBkYXRhIHBhY2thZ2VzLg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBKQVhCQXR0YWNobWVudFVubWFyc2hhbGxlciBleHRlbmRzIEF0dGFjaG1lbnRVbm1hcnNoYWxsZXIgew0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coSkFYQkF0dGFjaG1lbnRVbm1hcnNoYWxsZXIuY2xhc3MpOw0KLQ0KLSAgICBwcml2YXRlIE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQ7DQotICAgIHByaXZhdGUgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlcjsNCi0NCi0gICAgcHVibGljIEpBWEJBdHRhY2htZW50VW5tYXJzaGFsbGVyKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQsIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlcikgew0KLSAgICAgICAgdGhpcy5tc2dDb250ZXh0ID0gbXNnQ29udGV4dDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1hPUFBhY2thZ2UoKSB7DQotICAgICAgICANCi0gICAgICAgIC8vIEFueSBtZXNzYWdlIHRoYXQgaXMgcmVjZWl2ZWQgbWlnaHQgY29udGFpbiBNVE9NLg0KLSAgICAgICAgLy8gU28gYWx3YXlzIHJldHVybiB0cnVlLg0KLSAgICAgICAgYm9vbGVhbiB2YWx1ZSA9IHRydWU7DQotICAgICAgICANCi0gICAgICAgIC8vIEhhdmUgdGhlIE9NIFhNTFN0cmVhbVJlYWRlciAoT01TdEFYV3JhcHBlcikNCi0gICAgICAgIC8vIHNlbnQgeG9wOmluY2x1ZGUgZXZlbnRzDQotICAgICAgICBpZiAoeG1sU3RyZWFtUmVhZGVyIGluc3RhbmNlb2YgT01YTUxTdHJlYW1SZWFkZXIpIHsNCi0gICAgICAgICAgICAoKE9NWE1MU3RyZWFtUmVhZGVyKSB4bWxTdHJlYW1SZWFkZXIpLnNldElubGluZU1UT00odHJ1ZSk7DQotICAgICAgICB9DQotICAgIA0KLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKXsgDQotICAgICAgICAgICAgbG9nLmRlYnVnKCJpc1hPUFBhY2thZ2UgcmV0dXJucyAiICsgdmFsdWUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHZhbHVlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBieXRlW10gZ2V0QXR0YWNobWVudEFzQnl0ZUFycmF5KFN0cmluZyBjaWQpIHsNCi0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiQXR0ZW1wdGluZyB0byByZXRyaWV2ZSBhdHRhY2htZW50IFsiICsgY2lkICsgIl0gYXMgYSBieXRlW10iKTsNCi0gICAgICAgIH0NCi0gICAgICAgIERhdGFIYW5kbGVyIGRoID0gZ2V0QXR0YWNobWVudEFzRGF0YUhhbmRsZXIoY2lkKTsNCi0gICAgICAgIGlmIChkaCAhPSBudWxsKSB7DQotICAgICAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnQoZGgpOw0KLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgew0KLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiRXhjZXB0aW9uIG9jY3VycmVkIHdoaWxlIGdldHRpbmcgdGhlIGJ5dGVbXSAiICsgaW9lKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT01FeGNlcHRpb24oaW9lKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcoInJldHVybmluZyBudWxsIGJ5dGVbXSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIERhdGFIYW5kbGVyIGdldEF0dGFjaG1lbnRBc0RhdGFIYW5kbGVyKFN0cmluZyBjaWQpIHsNCi0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiQXR0ZW1wdGluZyB0byByZXRyaWV2ZSBhdHRhY2htZW50IFsiICsgY2lkICsgIl0gYXMgYSBEYXRhSGFuZGxlciIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgRGF0YUhhbmRsZXIgZGggPSBnZXREYXRhSGFuZGxlcihjaWQpOw0KLSAgICAgICAgaWYgKGRoICE9IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gZGg7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIFN0cmluZyBjaWQyID0gZ2V0TmV3Q0lEKGNpZCk7DQotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQSBkYXRhSGFuZGxlciB3YXMgbm90IGZvdW5kIGZvciBbIiArIGNpZCArICJdIHRyeWluZyBbIiArIGNpZDIgKyAiXSIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBkaCA9IGdldERhdGFIYW5kbGVyKGNpZDIpOw0KLSAgICAgICAgICAgIGlmIChkaCAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgIHJldHVybiBkaDsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICAvLyBObyBEYXRhIEhhbmRsZXIgZm91bmQNCi0gICAgICAgIHRocm93IG5ldyBPTUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJub0RhdGFIYW5kbGVyIiwgY2lkKSk7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBAcGFyYW0gY2lkDQotICAgICAqIEByZXR1cm4gY2lkIHdpdGggdHJhbnNsYXRlZCBjaGFyYWN0ZXJzDQotICAgICAqLw0KLSAgICBwcml2YXRlIFN0cmluZyBnZXROZXdDSUQoU3RyaW5nIGNpZCkgew0KLSAgICAgICAgU3RyaW5nIGNpZDIgPSBjaWQ7DQotDQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIGNpZDIgPSBqYXZhLm5ldC5VUkxEZWNvZGVyLmRlY29kZShjaWQsICJVVEYtOCIpOw0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJnZXROZXdDSUQgZGVjb2RpbmcgIiArIGNpZCArICIgYXMgVVRGLTggZGVjb2RpbmcgZXJyb3I6ICIgKyBlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gY2lkMjsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogUmVhZCB0aGUgYnl0ZXMgZnJvbSB0aGUgRGF0YUhhbmRsZXINCi0gICAgICogDQotICAgICAqIEBwYXJhbSBkaA0KLSAgICAgKiBAcmV0dXJuIGJ5dGVbXQ0KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uDQotICAgICAqLw0KLSAgICBwcml2YXRlIGJ5dGVbXSBjb252ZXJ0KERhdGFIYW5kbGVyIGRoKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKCJSZWFkaW5nIGJ5dGVbXSBmcm9tIERhdGFIYW5kbGVyICIgKyBkaCk7DQotICAgICAgICB9DQotICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IGRoLmdldElucHV0U3RyZWFtKCk7DQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcoIkRhdGFIYW5kbGVyIElucHV0U3RyZWFtICIgKyBpcyk7DQotICAgICAgICB9DQotICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsNCi0gICAgICAgIGJ5dGVbXSBiID0gbmV3IGJ5dGVbMTAyNF07DQotICAgICAgICBpbnQgbnVtID0gaXMucmVhZChiKTsNCi0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KLSAgICAgICAgICAgIGlmIChudW0gPD0gMCkgew0KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkRhdGFIYW5kbGVyIElucHV0U3RyZWFtIGNvbnRhaW5zIG5vIGRhdGEuIG51bT0iICsgbnVtKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICB3aGlsZSAobnVtID4gMCkgew0KLSAgICAgICAgICAgIGJhb3Mud3JpdGUoYiwgMCwgbnVtKTsNCi0gICAgICAgICAgICBudW0gPSBpcy5yZWFkKGIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGJhb3MudG9CeXRlQXJyYXkoKTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHJvdGVjdGVkIERhdGFIYW5kbGVyIGdldERhdGFIYW5kbGVyKFN0cmluZyBjaWQpIHsNCi0gICAgICAgIFN0cmluZyBibG9iY2lkID0gY2lkOw0KLSAgICAgICAgaWYgKGJsb2JjaWQuc3RhcnRzV2l0aCgiY2lkOiIpKSB7DQotICAgICAgICAgICAgYmxvYmNpZCA9IGJsb2JjaWQuc3Vic3RyaW5nKDQpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgLy8gR2V0IHRoZSBhdHRhY2htZW50IGZyb20gdGhlIG1lc3NhZ2Vjb250ZXh0IHVzaW5nIHRoZSBibG9iIGNpZA0KLSAgICAgICAgaWYgKG1zZ0NvbnRleHQgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIERhdGFIYW5kbGVyIGRoID0gbXNnQ29udGV4dC5nZXRBdHRhY2htZW50KGJsb2JjaWQpOw0KLSAgICAgICAgICAgIGlmIChkaCAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgIEpBWEJBdHRhY2htZW50VW5tYXJzaGFsbGVyTW9uaXRvci5hZGRCbG9iQ0lEKGJsb2JjaWQpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gZGg7DQotICAgICAgICB9DQotICAgICAgICBpZiAoeG1sU3RyZWFtUmVhZGVyIGluc3RhbmNlb2YgT01YTUxTdHJlYW1SZWFkZXIpIHsNCi0gICAgICAgICAgICBEYXRhSGFuZGxlciBkaCA9IA0KLSAgICAgICAgICAgICAgICAoKE9NWE1MU3RyZWFtUmVhZGVyKSB4bWxTdHJlYW1SZWFkZXIpLmdldERhdGFIYW5kbGVyKGJsb2JjaWQpOw0KLSAgICAgICAgICAgIGlmIChkaCAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgIEpBWEJBdHRhY2htZW50VW5tYXJzaGFsbGVyTW9uaXRvci5hZGRCbG9iQ0lEKGJsb2JjaWQpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gZGg7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhc291cmNlL2pheGIvSkFYQkF0dGFjaG1lbnRVbm1hcnNoYWxsZXJNb25pdG9yLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhc291cmNlL2pheGIvSkFYQkF0dGFjaG1lbnRVbm1hcnNoYWxsZXJNb25pdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyNmJhMTQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YXNvdXJjZS9qYXhiL0pBWEJBdHRhY2htZW50VW5tYXJzaGFsbGVyTW9uaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YXNvdXJjZS5qYXhiOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLS8qKg0KLSAqIFRoZSBtb25pdG9yIGlzIHVzZWQgYnkgdGhlIHRlc3RzIHRvIGVuc3VyZQ0KLSAqIHRoYXQgdGhlIEpBWEJBdHRhY2htZW50VW5tYXJzaGFsbGVyIGlzIHVzZWQgYW5kIGlzIGZ1bmN0aW9uaW5nIGNvcnJlY3RseS4NCi0gKiBJbiBub3JtYWwgdXNhZ2UsIG1vbml0b3JpbmcgaXMgb2ZmLg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBKQVhCQXR0YWNobWVudFVubWFyc2hhbGxlck1vbml0b3Igew0KLSAgICANCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEpBWEJBdHRhY2htZW50VW5tYXJzaGFsbGVyTW9uaXRvci5jbGFzcyk7DQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gbW9uaXRvcmluZyA9IGZhbHNlOw0KLSAgICBwcml2YXRlIHN0YXRpYyBBcnJheUxpc3QgYmxvYkNJRHMgPSBuZXcgQXJyYXlMaXN0KCk7IA0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgc2VtaWZvcmUgPSAiSkFYQkF0dGFjaG1lbnRVbm1hcnNoYWxsZXJNb25pdG9yIjsNCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBJbnRlbnRpb25hbGx5IHByaXZhdGUuICBBbGwgbWV0aG9kcyBhcmUgc3RhdGljLg0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBKQVhCQXR0YWNobWVudFVubWFyc2hhbGxlck1vbml0b3IoKSB7DQotICAgICAgICANCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogQHJldHVybiB0cnVlIGlmIG1vbml0b3JpbmcNCi0gICAgICovDQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc01vbml0b3JpbmcoKSB7DQotICAgICAgICByZXR1cm4gbW9uaXRvcmluZzsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogU2V0IG1vbml0b3JpbmcNCi0gICAgICogQHBhcmFtIG1vbml0b3JpbmcgYm9vbGVhbg0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldE1vbml0b3JpbmcoYm9vbGVhbiBtb25pdG9yaW5nKSB7DQotICAgICAgICBKQVhCQXR0YWNobWVudFVubWFyc2hhbGxlck1vbml0b3IubW9uaXRvcmluZyA9IG1vbml0b3Jpbmc7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBDbGVhciB0aGUgbnVtYmVyIG9mIGNyZWF0ZXMgYW5kIGZhaWxlZCBjcmVhdGVzDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY2xlYXIoKSB7DQotICAgICAgICBzeW5jaHJvbml6ZWQoc2VtaWZvcmUpIHsNCi0gICAgICAgICAgICBibG9iQ0lEcy5jbGVhcigpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBAcmV0dXJuIG51bWJlciBvZiBKQVhCQ3VzdG9tQnVpbGRlcnMgY3JlYXRlZA0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyBMaXN0IGdldEJsb2JDSURzKCkgew0KLSAgICAgICAgc3luY2hyb25pemVkKHNlbWlmb3JlKSB7DQotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiTlVNIEJMT0IgQ0lEUyA9IiArIGJsb2JDSURzLnNpemUoKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiBuZXcgQXJyYXlMaXN0KGJsb2JDSURzKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBJbmNyZWFzZSBudW1iZXIgb2YgdG90YWwgYnVpbGRlcnMgDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkQmxvYkNJRChTdHJpbmcgYmxvYkNJRCkgew0KLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKCJjYWxsIEFERCBCTE9CIENJRCA9IiArIGJsb2JDSUQpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKGlzTW9uaXRvcmluZygpKSB7DQotICAgICAgICAgICAgc3luY2hyb25pemVkKHNlbWlmb3JlKSB7DQotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJBREQgQkxPQiBDSUQgPSIgKyBibG9iQ0lEKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBibG9iQ0lEcy5hZGQoYmxvYkNJRCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotICANCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YXNvdXJjZS9qYXhiL0pBWEJDdXN0b21CdWlsZGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhc291cmNlL2pheGIvSkFYQkN1c3RvbUJ1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ1MGNkNC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhc291cmNlL2pheGIvSkFYQkN1c3RvbUJ1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFzb3VyY2UuamF4YjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUNvbnRhaW5lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTURhdGFTb3VyY2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5hbWVzcGFjZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTVNvdXJjZWRFbGVtZW50Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuYnVpbGRlci5DdXN0b21CdWlsZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuQ29uc3RhbnRzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJFeGNlcHRpb247DQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBDb25zdGFudHM7DQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOw0KLQ0KLS8qKg0KLSAqIEpBWEJDdXN0b21CdWlsZGVyIGNyZWF0ZXMgYW4gT01Tb3VyY2VkRWxlbWVudCBiYWNrZWQgYnkgYSBKQVhCRGF0YVNvdXJjZQ0KLSAqIGZvciB0aGUgc3BlY2lmaWVkIG5hbWVzcGFjZSBhbmQgbG9jYWxQYXJ0Lg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBKQVhCQ3VzdG9tQnVpbGRlciBpbXBsZW1lbnRzIEN1c3RvbUJ1aWxkZXIgew0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coSkFYQkN1c3RvbUJ1aWxkZXIuY2xhc3MpOw0KLSAgICANCi0gICAgSkFYQkRTQ29udGV4dCBqZHNDb250ZXh0Ow0KLSAgICANCi0gICAgLyoqDQotICAgICAqIENyZWF0ZSBhIEpBWEJDdXN0b21CdWlsZGVyDQotICAgICAqIEBwYXJhbSBjb250ZXh0IEpBWEJEU0NvbnRleHQNCi0gICAgICovDQotICAgIHB1YmxpYyBKQVhCQ3VzdG9tQnVpbGRlcihKQVhCRFNDb250ZXh0IGNvbnRleHQpIHsNCi0gICAgICAgIHN1cGVyKCk7DQotICAgICAgICB0aGlzLmpkc0NvbnRleHQgPSBjb250ZXh0Ow0KLSAgICAgICAgSkFYQkN1c3RvbUJ1aWxkZXJNb25pdG9yLnVwZGF0ZVRvdGFsQnVpbGRlcnMoKTsNCi0gICAgfQ0KLQ0KLQ0KLSAgICBwdWJsaWMgT01FbGVtZW50IGNyZWF0ZShTdHJpbmcgbmFtZXNwYWNlLCANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxvY2FsUGFydCwgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NQ29udGFpbmVyIHBhcmVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHJlYWRlciwgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NRmFjdG9yeSBmYWN0b3J5KSB0aHJvd3MgT01FeGNlcHRpb24gew0KLSAgICAgICAgDQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcoImNyZWF0ZSBuYW1lc3BhY2UgPSAiICsgbmFtZXNwYWNlKTsNCi0gICAgICAgICAgICBsb2cuZGVidWcoIiAgbG9jYWxQYXJ0ID0gIiArIGxvY2FsUGFydCk7DQotICAgICAgICAgICAgbG9nLmRlYnVnKCIgIHJlYWRlciA9ICIgKyByZWFkZXIuZ2V0Q2xhc3MoKSk7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIC8vIFRoZXJlIGFyZSBzb21lIHNpdHVhdGlvbnMgd2hlcmUgd2Ugd2FudCB0byB1c2Ugbm9ybWFsDQotICAgICAgICAvLyB1bm1hcnNoYWxsaW5nLCBzbyByZXR1cm4gbnVsbA0KLSAgICAgICAgaWYgKCFzaG91bGRVbm1hcnNoYWwobmFtZXNwYWNlLCBsb2NhbFBhcnQpKSB7DQotICAgICAgICAgICAgSkFYQkN1c3RvbUJ1aWxkZXJNb25pdG9yLnVwZGF0ZVRvdGFsRmFpbGVkQ3JlYXRlcygpOw0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICAvLyBDcmVhdGUgYW4gT01Tb3VyY2VkRWxlbWVudCBiYWNrZWQgYnkgYW4gdW5tYXJzaGFsbGVkIEpBWEIgb2JqZWN0DQotICAgICAgICAgICAgT01OYW1lc3BhY2UgbnMgPSBmYWN0b3J5LmNyZWF0ZU9NTmFtZXNwYWNlKG5hbWVzcGFjZSwgcmVhZGVyLmdldFByZWZpeCgpKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBPYmplY3QgamF4YiA9IGpkc0NvbnRleHQudW5tYXJzaGFsKHJlYWRlcik7DQotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiU3VjY2Vzc2Z1bGx5IHVubWFyc2hhbGxlZCBqYXhiIG9iamVjdCAiICsgamF4Yik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIE9NRGF0YVNvdXJjZSBkcyA9IG5ldyBKQVhCRGF0YVNvdXJjZShqYXhiLCBqZHNDb250ZXh0KTsNCi0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJUaGUgSkFYQkRhdGFTb3VyY2UgaXMgIiArIGRzKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgT01Tb3VyY2VkRWxlbWVudCBvbXNlID0gZmFjdG9yeS5jcmVhdGVPTUVsZW1lbnQoZHMsIGxvY2FsUGFydCwgbnMpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIHBhcmVudC5hZGRDaGlsZChvbXNlKTsNCi0gICAgICAgICAgICBKQVhCQ3VzdG9tQnVpbGRlck1vbml0b3IudXBkYXRlVG90YWxDcmVhdGVzKCk7DQotICAgICAgICAgICAgcmV0dXJuIG9tc2U7DQotICAgICAgICB9IGNhdGNoIChKQVhCRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBKQVhCQ3VzdG9tQnVpbGRlck1vbml0b3IudXBkYXRlVG90YWxGYWlsZWRDcmVhdGVzKCk7DQotICAgICAgICAgICAgdGhyb3cgbmV3IE9NRXhjZXB0aW9uKGUpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogQHBhcmFtIG5hbWVzcGFjZQ0KLSAgICAgKiBAcGFyYW0gbG9jYWxQYXJ0DQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIG5zIGFuZCBsb2NhbCBwYXJ0IGlzIGFjY2VwdGFibGUgZm9yIHVubWFyc2hhbGxpbmcNCi0gICAgICovDQotICAgIHByaXZhdGUgYm9vbGVhbiBzaG91bGRVbm1hcnNoYWwoU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIGxvY2FsUGFydCkgew0KLSAgICAgICAgT2JqZWN0IHZhbHVlID0gbnVsbDsNCi0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1zZ0N0eCA9IGpkc0NvbnRleHQuZ2V0TWVzc2FnZUNvbnRleHQoKTsNCi0gICAgICAgIGlmIChtc2dDdHggIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHZhbHVlID0gbXNnQ3R4LmdldFByb3BlcnR5KENvbnN0YW50cy5KQVhXU19FTkFCTEVfSkFYQl9QQVlMT0FEX1NUUkVBTUlORyk7DQotICAgICAgICB9DQotICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZSBpbnN0YW5jZW9mIEJvb2xlYW4pIHsNCi0gICAgICAgICAgICBib29sZWFuIHN0cmVhbWluZ0VuYWJsZWQgPSAoKEJvb2xlYW4pIHZhbHVlKS5ib29sZWFuVmFsdWUoKTsNCi0gICAgICAgICAgICBpZiAoIXN0cmVhbWluZ0VuYWJsZWQpIHsNCi0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkpBWEIgcGF5bG9hZCBzdHJlYW1pbmcgZGlzYWJsZWQgYnkgbWVzc2FnZUNvbnRleHQgcHJvcGVydHkgIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgQ29uc3RhbnRzLkpBWFdTX0VOQUJMRV9KQVhCX1BBWUxPQURfU1RSRUFNSU5HDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHNldCB0byAiICsgc3RyZWFtaW5nRW5hYmxlZCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgLy8gRG9uJ3QgdW5tYXJzaGFsbCBTT0FQRmF1bHRzIG9yIGFueXRoaW5nIGVsc2UgaW4gdGhlIFNPQVAgDQotICAgICAgICAvLyBuYW1lc3BhY2UuDQotICAgICAgICAvLyBEb24ndCB1bm1hcnNoYWxsIGVsZW1lbnRzIHRoYXQgYXJlIHVucXVhbGlmaWVkDQotICAgICAgICBpZiAobG9jYWxQYXJ0ID09IG51bGwgfHwgbmFtZXNwYWNlID09IG51bGwgfHwgbmFtZXNwYWNlLmxlbmd0aCgpID09IDAgfHwNCi0gICAgICAgICAgICBTT0FQQ29uc3RhbnRzLlVSSV9OU19TT0FQXzFfMV9FTlZFTE9QRS5lcXVhbHMobmFtZXNwYWNlKSB8fA0KLSAgICAgICAgICAgIFNPQVBDb25zdGFudHMuVVJJX05TX1NPQVBfMV8yX0VOVkVMT1BFLmVxdWFscyhuYW1lc3BhY2UpKSB7DQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLSAgICAgICANCi0gICAgICAgIC8vIERvbid0IHVubWFyc2hhbCBpZiB0aGlzIGxvb2tzIGxpa2UgZW5jcnlwdGVkIGRhdGENCi0gICAgICAgIGlmIChsb2NhbFBhcnQuZXF1YWxzKCJFbmNyeXB0ZWREYXRhIikpIHsNCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgICAgICANCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhc291cmNlL2pheGIvSkFYQkN1c3RvbUJ1aWxkZXJNb25pdG9yLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhc291cmNlL2pheGIvSkFYQkN1c3RvbUJ1aWxkZXJNb25pdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5YzczYzQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YXNvdXJjZS9qYXhiL0pBWEJDdXN0b21CdWlsZGVyTW9uaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YXNvdXJjZS5qYXhiOw0KLQ0KLS8qKg0KLSAqIFRoZSBtb25pdG9yIGlzIHVzZWQgYnkgdGhlIHRlc3RzIHRvIGVuc3VyZQ0KLSAqIHRoYXQgdGhlIEpBWEJDdXN0b21CdWlsZGVyIGlzIHVzZWQgYW5kIGlzIGZ1bmN0aW9uaW5nIGNvcnJlY3RseS4NCi0gKiBJbiBub3JtYWwgdXNhZ2UsIG1vbml0b3JpbmcgaXMgb2ZmLg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBKQVhCQ3VzdG9tQnVpbGRlck1vbml0b3Igew0KLSAgICANCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBtb25pdG9yaW5nID0gZmFsc2U7DQotICAgIHByaXZhdGUgc3RhdGljIGludCB0b3RhbEJ1aWxkZXJzID0gMDsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IHRvdGFsQ3JlYXRlcyA9IDA7DQotICAgIHByaXZhdGUgc3RhdGljIGludCB0b3RhbEZhaWxlZENyZWF0ZXMgPSAwOw0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgc2VtaWZvcmUgPSAiSkFYQkN1c3RvbUJ1aWxkZXJNb25pdG9yIjsNCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBJbnRlbnRpb25hbGx5IHByaXZhdGUuICBBbGwgbWV0aG9kcyBhcmUgc3RhdGljLg0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBKQVhCQ3VzdG9tQnVpbGRlck1vbml0b3IoKSB7DQotICAgICAgICANCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogQHJldHVybiB0cnVlIGlmIG1vbml0b3JpbmcNCi0gICAgICovDQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc01vbml0b3JpbmcoKSB7DQotICAgICAgICByZXR1cm4gbW9uaXRvcmluZzsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogU2V0IG1vbml0b3JpbmcNCi0gICAgICogQHBhcmFtIG1vbml0b3JpbmcgYm9vbGVhbg0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldE1vbml0b3JpbmcoYm9vbGVhbiBtb25pdG9yaW5nKSB7DQotICAgICAgICBKQVhCQ3VzdG9tQnVpbGRlck1vbml0b3IubW9uaXRvcmluZyA9IG1vbml0b3Jpbmc7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBDbGVhciB0aGUgbnVtYmVyIG9mIGNyZWF0ZXMgYW5kIGZhaWxlZCBjcmVhdGVzDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY2xlYXIoKSB7DQotICAgICAgICBzeW5jaHJvbml6ZWQoc2VtaWZvcmUpIHsNCi0gICAgICAgICAgICB0b3RhbENyZWF0ZXMgPSAwOw0KLSAgICAgICAgICAgIHRvdGFsRmFpbGVkQ3JlYXRlcyA9IDA7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIEByZXR1cm4gbnVtYmVyIG9mIEpBWEJDdXN0b21CdWlsZGVycyBjcmVhdGVkDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIGludCBnZXRUb3RhbEJ1aWxkZXJzKCkgew0KLSAgICAgICAgc3luY2hyb25pemVkKHNlbWlmb3JlKSB7DQotICAgICAgICAgICAgcmV0dXJuIHRvdGFsQnVpbGRlcnM7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogSW5jcmVhc2UgbnVtYmVyIG9mIHRvdGFsIGJ1aWxkZXJzIA0KLSAgICAgKi8NCi0gICAgc3RhdGljIHZvaWQgdXBkYXRlVG90YWxCdWlsZGVycygpIHsNCi0gICAgICAgIHN5bmNocm9uaXplZChzZW1pZm9yZSkgew0KLSAgICAgICAgICAgIEpBWEJDdXN0b21CdWlsZGVyTW9uaXRvci50b3RhbEJ1aWxkZXJzKys7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIEByZXR1cm4gbnVtYmVyIG9mIHN1Y2Nlc3NmdWwgY3JlYXRlcw0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0VG90YWxDcmVhdGVzKCkgew0KLSAgICAgICAgaWYgKGlzTW9uaXRvcmluZygpKSB7DQotICAgICAgICAgICAgc3luY2hyb25pemVkKHNlbWlmb3JlKSB7DQotICAgICAgICAgICAgICAgIHJldHVybiB0b3RhbENyZWF0ZXM7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIDA7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIEluY3JlbWVudCBudW1iZXIgb2YgY3JlYXRlcw0KLSAgICAgKi8NCi0gICAgc3RhdGljIHZvaWQgdXBkYXRlVG90YWxDcmVhdGVzKCkgew0KLSAgICAgICAgaWYgKGlzTW9uaXRvcmluZygpKSB7DQotICAgICAgICAgICAgc3luY2hyb25pemVkKHNlbWlmb3JlKSB7DQotICAgICAgICAgICAgICAgIEpBWEJDdXN0b21CdWlsZGVyTW9uaXRvci50b3RhbENyZWF0ZXMrKzsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIEByZXR1cm4gbnVtYmVyIG9mIGZhaWxlZCBhdHRlbXB0cw0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0VG90YWxGYWlsZWRDcmVhdGVzKCkgew0KLSAgICAgICAgaWYgKGlzTW9uaXRvcmluZygpKSB7DQotICAgICAgICAgICAgc3luY2hyb25pemVkKHNlbWlmb3JlKSB7DQotICAgICAgICAgICAgICAgIHJldHVybiB0b3RhbEZhaWxlZENyZWF0ZXM7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIDA7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIEluY3JlbWVudCBudW1iZXIgb2YgZmFpbGVkIGNyZWF0ZXMNCi0gICAgICovDQotICAgIHN0YXRpYyB2b2lkIHVwZGF0ZVRvdGFsRmFpbGVkQ3JlYXRlcygpIHsNCi0gICAgICAgIGlmIChpc01vbml0b3JpbmcoKSkgew0KLSAgICAgICAgICAgIHN5bmNocm9uaXplZChzZW1pZm9yZSkgew0KLSAgICAgICAgICAgICAgICBKQVhCQ3VzdG9tQnVpbGRlck1vbml0b3IudG90YWxGYWlsZWRDcmVhdGVzKys7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotICANCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YXNvdXJjZS9qYXhiL0pBWEJEU0NvbnRleHQuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFzb3VyY2UvamF4Yi9KQVhCRFNDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmMmU2YzEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YXNvdXJjZS9qYXhiL0pBWEJEU0NvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxOCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFzb3VyY2UuamF4YjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLk1UT01YTUxTdHJlYW1Xcml0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5kYXRhYmluZGluZy5KQVhCVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS51dGlsLlhNTFN0cmVhbVdyaXRlcldpdGhPUzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zcGkuQ29uc3RhbnRzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnV0aWxpdHkuSmF2YVV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnV0aWxpdHkuWE1MUm9vdEVsZW1lbnRVdGlsOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJDb250ZXh0Ow0KLWltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCRWxlbWVudDsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuTWFyc2hhbGxlcjsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuVW5tYXJzaGFsbGVyOw0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hdHRhY2htZW50LkF0dGFjaG1lbnRNYXJzaGFsbGVyOw0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hdHRhY2htZW50LkF0dGFjaG1lbnRVbm1hcnNoYWxsZXI7DQotaW1wb3J0IGphdmF4LnhtbC5kYXRhdHlwZS5EYXRhdHlwZUNvbmZpZ3VyYXRpb25FeGNlcHRpb247DQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsNCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5Ib2xkZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOw0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7DQotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbjsNCi1pbXBvcnQgamF2YS50ZXh0LlBhcnNlRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7DQotDQotLyoNCi0gKiBUbyBtYXJzaGFsIG9yIHVubWFyc2hhbCBhIEpBWEIgb2JqZWN0LCB0aGUgSkFYQkNvbnRleHQgaXMgbmVjZXNzYXJ5Lg0KLSAqIEluIGFkZGl0aW9uLCBhY2Nlc3MgdG8gdGhlIE1lc3NhZ2VDb250ZXh0IGFuZCBvdGhlciBjb250ZXh0IG9iamVjdHMgbWF5IGJlIG5lY2Vzc2FyeQ0KLSAqIHRvIGdldCBjbGFzc2xvYWRlciBpbmZvcm1hdGlvbiwgc3RvcmUgYXR0YWNobWVudHMgZXRjLg0KLSAqIA0KLSAqIFRoZSBKQVhCRFNDb250ZXh0IGJ1bmRsZXMgYWxsIG9mIHRoaXMgaW5mb3JtYXRpb24gdG9nZXRoZXIuDQotICovDQotcHVibGljIGNsYXNzIEpBWEJEU0NvbnRleHQgew0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coSkFYQkRTQ29udGV4dC5jbGFzcyk7DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVR19FTkFCTEVEID0gbG9nLmlzRGVidWdFbmFibGVkKCk7DQotDQotICAgIHByaXZhdGUgVHJlZVNldDxTdHJpbmc+IGNvbnRleHRQYWNrYWdlczsgIC8vIExpc3Qgb2YgcGFja2FnZXMgbmVlZGVkIGJ5IHRoZSBjb250ZXh0DQotICAgIHByaXZhdGUgU3RyaW5nIGNvbnRleHRQYWNrYWdlc0tleTsgICAgICAgIC8vIFVuaXF1ZSBrZXkgdGhhdCByZXByZXNlbnRzIHRoZSBzZXQgb2YgcGFja2FnZXMNCi0gICAgDQotICAgIHByaXZhdGUgSkFYQkNvbnRleHQgY3VzdG9tZXJKQVhCQ29udGV4dDsgICAgICAvLyBKQVhCQ29udGV4dCBwcm92aWRlZCBieSB0aGUgY3VzdG9tZXIgYXBpDQotICAgIC8vICBKQVhCQ29udGV4dCBsb2FkZWQgYnkgdGhlIGVuZ2luZS4gIEl0IGlzIHdlYWtyZWYnZCB0byBhbGxvdyBHQw0KLSAgICBwcml2YXRlIFdlYWtSZWZlcmVuY2U8SkFYQkNvbnRleHQ+IGF1dG9KQVhCQ29udGV4dCA9IG51bGw7ICAgDQotICAgIHByaXZhdGUgSkFYQlV0aWxzLkNPTlNUUlVDVElPTl9UWVBFICAgICAgIC8vIEhvdyB0aGUgSkFYQkNvbnRleHQgaXMgY29uc3RydWN0ZWQNCi0gICAgICAgICAgICBjb25zdHJ1Y3Rpb25UeXBlID0gSkFYQlV0aWxzLkNPTlNUUlVDVElPTl9UWVBFLlVOS05PV047DQotICAgIHByaXZhdGUgTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dDsgICAgDQotDQotICAgIC8vIFRoZXJlIGFyZSB0d28gbW9kZXMgb2YgbWFyc2hhbGxpbmcgYW5kIHVubWFyc2hhbGxpbmc6IA0KLSAgICAvLyAgICJieSBqYXZhIHR5cGUiIGFuZCAiYnkgc2NoZW1hIGVsZW1lbnQiLg0KLSAgICAvLyBUaGUgcHJlZmVyZWQgbW9kZSBpcyAiYnkgc2NoZW1hIGVsZW1lbnQiIGJlY2F1c2UgaXQgaXMgc2FmZSBhbmQgeG1sLWNlbnRyaWMuDQotICAgIC8vIEhvd2V2ZXIgdGhlcmUgYXJlIHNvbWUgY2lyY3Vtc3RhbmNlcyB3aGVuICJieSBzY2hlbWEgZWxlbWVudCIgaXMgbm90IGF2YWlsYWJsZS4NCi0gICAgLy8gICAgRXhhbXBsZXM6IFJQQyBMaXQgcHJvY2Vzc2luZyAodGhlIHdpcmUgZWxlbWVudCBpcyBkZWZpbmVkIGJ5IGEgd3NkbDpwYXJ0Li4ubm90IHNjaGVtYSkNCi0gICAgLy8gICAgICAgICAgICAgIERvYy9MaXQgQmFyZSAiTWluaW1hbCIgUHJvY2Vzc2luZyAoSkFYQiBPYmplY3RGYWN0b3JpZXMgYXJlIG1pc3NpbmcuLi4NCi0gICAgLy8gICAgICAgICAgICAgICAgICAgYW5kIHRodXMgd2UgbXVzdCB1c2UgImJ5IHR5cGUiIGZvciBwcmltaXRpdmVzL1N0cmluZykNCi0gICAgLy8gUGxlYXNlIGRvbid0IHVzZSAiYnkgamF2YSB0eXBlIiBwcm9jZXNzaW5nIHRvIGdldCBhcm91bmQgZXJyb3JzLg0KLSAgICBwcml2YXRlIENsYXNzIHByb2Nlc3NUeXBlID0gbnVsbDsNCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzeG1sTGlzdCA9ZmFsc2U7DQotICAgIA0KLSAgICBwcml2YXRlIFN0cmluZyB3ZWJTZXJ2aWNlTmFtZXNwYWNlOw0KLQ0KLSAgICAvKioNCi0gICAgICogRnVsbCBDb25zdHJ1Y3RvciBKQVhCRFNDb250ZXh0IChtb3N0IHBlcmZvcm1hbnQpDQotICAgICAqDQotICAgICAqIEBwYXJhbSBwYWNrYWdlcyBTZXQgb2YgcGFja2FnZXMgbmVlZGVkIGJ5IHRoZSBKQVhCQ29udGV4dC4NCi0gICAgICovDQotICAgIHB1YmxpYyBKQVhCRFNDb250ZXh0KFRyZWVTZXQ8U3RyaW5nPiBwYWNrYWdlcywgU3RyaW5nIHBhY2thZ2VzS2V5KSB7DQotICAgICAgICB0aGlzLmNvbnRleHRQYWNrYWdlcyA9IHBhY2thZ2VzOw0KLSAgICAgICAgdGhpcy5jb250ZXh0UGFja2FnZXNLZXkgPSBwYWNrYWdlc0tleTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogU2xpZ2h0bHkgc2xvd2VyIGNvbnN0cnVjdG9yDQotICAgICAqDQotICAgICAqIEBwYXJhbSBwYWNrYWdlcw0KLSAgICAgKi8NCi0gICAgcHVibGljIEpBWEJEU0NvbnRleHQoVHJlZVNldDxTdHJpbmc+IHBhY2thZ2VzKSB7DQotICAgICAgICB0aGlzKHBhY2thZ2VzLCBwYWNrYWdlcy50b1N0cmluZygpKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogTm9ybWFsIENvbnN0cnVjdG9yIEpBWEJCbG9ja0NvbnRleHQNCi0gICAgICoNCi0gICAgICogQHBhcmFtIGNvbnRleHRQYWNrYWdlDQotICAgICAqIEBkZXByZWNhdGVkDQotICAgICAqLw0KLSAgICBwdWJsaWMgSkFYQkRTQ29udGV4dChTdHJpbmcgY29udGV4dFBhY2thZ2UpIHsNCi0gICAgICAgIHRoaXMuY29udGV4dFBhY2thZ2VzID0gbmV3IFRyZWVTZXQoKTsNCi0gICAgICAgIHRoaXMuY29udGV4dFBhY2thZ2VzLmFkZChjb250ZXh0UGFja2FnZSk7DQotICAgICAgICB0aGlzLmNvbnRleHRQYWNrYWdlc0tleSA9IHRoaXMuY29udGV4dFBhY2thZ2VzLnRvU3RyaW5nKCk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqICJEaXNwYXRjaCIgQ29uc3RydWN0b3IgDQotICAgICAqIFVzZSB0aGlzIGZ1bGwgY29uc3RydWN0b3Igd2hlbiB0aGUgSkFYQkNvbnRlbnQgaXMgcHJvdmlkZWQgYnkgdGhlDQotICAgICAqIGN1c3RvbWVyLg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gamF4YkNvbnRleHQNCi0gICAgICovDQotICAgIHB1YmxpYyBKQVhCRFNDb250ZXh0KEpBWEJDb250ZXh0IGpheGJDb250ZXh0KSB7DQotICAgICAgICB0aGlzLmN1c3RvbWVySkFYQkNvbnRleHQgPSBqYXhiQ29udGV4dDsNCi0gICAgfQ0KLQ0KLSAgICAvKiogQHJldHVybiBDbGFzcyByZXByZXNlbnRpbmcgdHlwZSBvZiB0aGUgZWxlbWVudCAqLw0KLSAgICBwdWJsaWMgVHJlZVNldDxTdHJpbmc+IGdldENvbnRleHRQYWNrYWdlcygpIHsNCi0gICAgICAgIHJldHVybiBjb250ZXh0UGFja2FnZXM7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyBKQVhCQ29udGV4dCBnZXRKQVhCQ29udGV4dCgpIHRocm93cyBKQVhCRXhjZXB0aW9uIHsNCi0gICAgICAgIHJldHVybiBnZXRKQVhCQ29udGV4dChudWxsKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogQHJldHVybiBnZXQgdGhlIEpBWEJDb250ZXh0DQotICAgICAqIEB0aHJvd3MgSkFYQkV4Y2VwdGlvbg0KLSAgICAgKi8NCi0gICAgcHVibGljIEpBWEJDb250ZXh0IGdldEpBWEJDb250ZXh0KENsYXNzTG9hZGVyIGNsKSB0aHJvd3MgSkFYQkV4Y2VwdGlvbiB7DQotICAgICAgICBpZiAoY3VzdG9tZXJKQVhCQ29udGV4dCAhPSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuIGN1c3RvbWVySkFYQkNvbnRleHQ7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIC8vIEdldCB0aGUgd2Vha2x5IGNhY2hlZCBKQVhCQ29udGV4dA0KLSAgICAgICAgSkFYQkNvbnRleHQgamMgPSBudWxsOw0KLSAgICAgICAgaWYgKGF1dG9KQVhCQ29udGV4dCAhPSBudWxsKSB7DQotICAgICAgICAgICAgamMgPSBhdXRvSkFYQkNvbnRleHQuZ2V0KCk7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIGlmIChqYyA9PSBudWxsKSB7DQotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygNCi0gICAgICAgICAgICAgICAgICAgICAgICAiQSBKQVhCQ29udGV4dCBkaWQgbm90IGV4aXN0LCBjcmVhdGluZyBhIG5ldyBvbmUgd2l0aCB0aGUgY29udGV4dCBwYWNrYWdlcy4iKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgSG9sZGVyPEpBWEJVdGlscy5DT05TVFJVQ1RJT05fVFlQRT4gY29uc3RydWN0VHlwZSA9DQotICAgICAgICAgICAgICAgICAgICBuZXcgSG9sZGVyPEpBWEJVdGlscy5DT05TVFJVQ1RJT05fVFlQRT4oKTsNCi0gICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMgPSBudWxsOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8qDQotICAgICAgICAgICAgICogV2Ugc2V0IHRoZSBkZWZhdWx0IG5hbWVzcGFjZSB0byB0aGUgd2ViIHNlcnZpY2UgbmFtZXNwYWNlIHRvIGZpeCBhbg0KLSAgICAgICAgICAgICAqIG9ic2N1ciBidWcuDQotICAgICAgICAgICAgICogDQotICAgICAgICAgICAgICogSWYgdGhlIGNsYXNzIHJlcHJlc2VudGluZyBhIEpBWEIgZGF0YSBvYmplY3QgZG9lcyBub3QgZGVmaW5lIGEgbmFtZXNwYWNlDQotICAgICAgICAgICAgICogKHZpYSBhbiBhbm5vdGF0aW9uIGxpa2UgQFhtbFR5cGUgb3IgdmlhIE9iamVjdEZhY3Rvcnkgb3Igc2NoZW1hIGdlbiBpbmZvcm1hdGlvbikNCi0gICAgICAgICAgICAgKiB0aGVuIHRoZSBuYW1lc3BhY2UgaW5mb3JtYXRpb24gaXMgZGVmYXVsdGVkLg0KLSAgICAgICAgICAgICAqIA0KLSAgICAgICAgICAgICAqIFRoZSB4amMgdG9vbCBkZWZhdWx0cyB0aGUgbmFtZXNwYWNlIGluZm9ybWF0aW9uIHRvIHVucXVhbGlmaWVkLg0KLSAgICAgICAgICAgICAqIEhvd2V2ZXIgdGhlIHdzaW1wb3J0IHRvb2wgZGVmYXVsdHMgdGhlIG5hbWVzcGFjZSB0byB0aGUgbmFtZXNwYWNlIG9mIHRoZQ0KLSAgICAgICAgICAgICAqIHdlYnNlcnZpY2UuDQotICAgICAgICAgICAgICogDQotICAgICAgICAgICAgICogVG8gIndvcmthcm91bmQiIHRoaXMgaXNzdWUsIGEgZGVmYXVsdCBuYW1lc3BhY2UgZXF1YWwgdG8gdGhlIHdlYnNlcnZpY2UNCi0gICAgICAgICAgICAgKiBuYW1lc3BhY2UgaXMgc2V0IG9uIHRoZSBKQVhCIG1hcnNoYWxsZXIuICBUaGlzIGhhcyB0aGUgZWZmZWN0IG9mIGNoYW5naW5nIHRoZQ0KLSAgICAgICAgICAgICAqICJ1bnF1YWxpZmllZCBuYW1lc3BhY2VzIiBpbnRvIHRoZSBuYW1lc3BhY2UgdXNlZCBieSB0aGUgd2Vic2VydmljZS4NCi0gICAgICAgICAgICAgKiANCi0gICAgICAgICAgICAgKi8NCi0gICAgICAgICAgICBpZiAodGhpcy53ZWJTZXJ2aWNlTmFtZXNwYWNlICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLSAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzLnB1dChKQVhCVXRpbHMuREVGQVVMVF9OQU1FU1BBQ0VfUkVNQVAsIHRoaXMud2ViU2VydmljZU5hbWVzcGFjZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGpjID0gSkFYQlV0aWxzLmdldEpBWEJDb250ZXh0KGNvbnRleHRQYWNrYWdlcywgY29uc3RydWN0VHlwZSwgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dFBhY2thZ2VzS2V5LCBjbCwgcHJvcGVydGllcyk7DQotICAgICAgICAgICAgY29uc3RydWN0aW9uVHlwZSA9IGNvbnN0cnVjdFR5cGUudmFsdWU7DQotICAgICAgICAgICAgYXV0b0pBWEJDb250ZXh0ID0gbmV3IFdlYWtSZWZlcmVuY2U8SkFYQkNvbnRleHQ+KGpjKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiVXNpbmcgYW4gZXhpc3RpbmcgSkFYQkNvbnRleHQiKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gamM7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0V2ViU2VydmljZU5hbWVzcGFjZShTdHJpbmcgbmFtZXNwYWNlKSB7DQotICAgICAgICB0aGlzLndlYlNlcnZpY2VOYW1lc3BhY2UgPSBuYW1lc3BhY2U7DQotICAgIH0NCi0gICAgDQotICAgIC8qKiBAcmV0dXJuIFJQQyBEZWNsYXJlZCBUeXBlICovDQotICAgIHB1YmxpYyBDbGFzcyBnZXRQcm9jZXNzVHlwZSgpIHsNCi0gICAgICAgIHJldHVybiBwcm9jZXNzVHlwZTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogU2V0IFJQQyBEZWNsYXJlZCBUeXBlLiAgVGhlIHVzZSBvZiB1c2UgdGhpcyBwcm9wZXJ0eSBpZiB0aGUgbWVzc2FnZSBpcyBzdHlsZT1kb2N1bWVudCBpcw0KLSAgICAgKiBkaXNjb3VyYWdlZC4NCi0gICAgICoNCi0gICAgICogQHBhcmFtIHR5cGUNCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHNldFByb2Nlc3NUeXBlKENsYXNzIHR5cGUpIHsNCi0gICAgICAgIHByb2Nlc3NUeXBlID0gdHlwZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgSkFYQlV0aWxzLkNPTlNUUlVDVElPTl9UWVBFIGdldENvbnN0cnVjdGlvblR5cGUoKSB7DQotICAgICAgICByZXR1cm4gY29uc3RydWN0aW9uVHlwZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc3htbExpc3QoKSB7DQotICAgICAgICByZXR1cm4gaXN4bWxMaXN0Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldElzeG1sTGlzdChib29sZWFuIGlzeG1sTGlzdCkgew0KLSAgICAgICAgdGhpcy5pc3htbExpc3QgPSBpc3htbExpc3Q7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyBNZXNzYWdlQ29udGV4dCBnZXRNZXNzYWdlQ29udGV4dCgpIHsNCi0gICAgICAgIHJldHVybiBtc2dDb250ZXh0Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2VDb250ZXh0KE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0KSB7DQotICAgICAgICB0aGlzLm1zZ0NvbnRleHQgPSBtZXNzYWdlQ29udGV4dDsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIENsYXNzTG9hZGVyIGdldENsYXNzTG9hZGVyKCkgew0KLSAgICAgICAgTWVzc2FnZUNvbnRleHQgY29udGV4dCA9IGdldE1lc3NhZ2VDb250ZXh0KCk7DQotICAgICAgICBpZiAoY29udGV4dCAhPSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuIChDbGFzc0xvYWRlcikgY29udGV4dC5nZXRQcm9wZXJ0eShDb25zdGFudHMuQ0FDSEVfQ0xBU1NMT0FERVIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBDcmVhdGUgYW4gQXR0YWNobWVudE1hcnNoYWxsZXIgdG8gbWFyc2hhbCBNVE9NL1NXQSBBdHRhY2htZW50cw0KLSAgICAgKiBAcGFyYW0gd3JpdGVyDQotICAgICAqIEByZXR1cm4NCi0gICAgICovDQotICAgIHByb3RlY3RlZCBBdHRhY2htZW50TWFyc2hhbGxlciBjcmVhdGVBdHRhY2htZW50TWFyc2hhbGxlcihYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyKSB7DQotICAgICAgICByZXR1cm4gbmV3IEpBWEJBdHRhY2htZW50TWFyc2hhbGxlcihnZXRNZXNzYWdlQ29udGV4dCgpLCB3cml0ZXIpOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogQ3JlYXRlIGFuIEF0dGFjaG1lbnQgdW5tYXJzaGFsbGVyIGZvciB1bm1hcnNoYWxsaW5nIE1UT00vU1dBIEF0dGFjaG1lbnRzDQotICAgICAqIEByZXR1cm4gQXR0YWNobWVudFVubWFyc2hhbGxlcg0KLSAgICAgKi8NCi0gICAgcHJvdGVjdGVkIEF0dGFjaG1lbnRVbm1hcnNoYWxsZXIgY3JlYXRlQXR0YWNobWVudFVubWFyc2hhbGxlcihYTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7DQotICAgICAgICByZXR1cm4gbmV3IEpBWEJBdHRhY2htZW50VW5tYXJzaGFsbGVyKGdldE1lc3NhZ2VDb250ZXh0KCksIHJlYWRlcik7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFVubWFyc2hhbCB0aGUgeG1sIGludG8gYSBKQVhCIG9iamVjdA0KLSAgICAgKiBAcGFyYW0gcmVhZGVyDQotICAgICAqIEByZXR1cm4NCi0gICAgICogQHRocm93cyBKQVhCRXhjZXB0aW9uDQotICAgICAqLw0KLSAgICBwdWJsaWMgT2JqZWN0IHVubWFyc2hhbChYTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB0aHJvd3MgSkFYQkV4Y2VwdGlvbiB7DQotDQotICAgICAgICAvLyBUaGVyZSBtYXkgYmUgYSBwcmVmZXJyZWQgY2xhc3Nsb2FkZXIgdGhhdCBzaG91bGQgYmUgdXNlZA0KLSAgICAgICAgQ2xhc3NMb2FkZXIgY2wgPSBnZXRDbGFzc0xvYWRlcigpOw0KLSAgICAgICAgDQotICAgICAgICBVbm1hcnNoYWxsZXIgdSA9IEpBWEJVdGlscy5nZXRKQVhCVW5tYXJzaGFsbGVyKGdldEpBWEJDb250ZXh0KGNsKSk7DQotDQotICAgICAgICANCi0gICAgICAgIC8vIENyZWF0ZSBhbiBhdHRhY2htZW50IHVubWFyc2hhbGxlcg0KLSAgICAgICAgQXR0YWNobWVudFVubWFyc2hhbGxlciBhdW0gPSBjcmVhdGVBdHRhY2htZW50VW5tYXJzaGFsbGVyKHJlYWRlcik7DQotDQotICAgICAgICBpZiAoYXVtICE9IG51bGwpIHsNCi0gICAgICAgICAgICBpZiAoREVCVUdfRU5BQkxFRCkgew0KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkFkZGluZyBKQVhCQXR0YWNobWVudFVubWFyc2hhbGxlciB0byBVbm1hcnNoYWxsZXIiKTsNCi0gICAgICAgICAgICB9IA0KLSAgICAgICAgICAgIHUuc2V0QXR0YWNobWVudFVubWFyc2hhbGxlcihhdW0pOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgT2JqZWN0IGpheGIgPSBudWxsOw0KLQ0KLSAgICAgICAgLy8gVW5tYXJzaGFsIGludG8gdGhlIGJ1c2luZXNzIG9iamVjdC4NCi0gICAgICAgIGlmIChnZXRQcm9jZXNzVHlwZSgpID09IG51bGwpIHsNCi0gICAgICAgICAgICBqYXhiID0gdW5tYXJzaGFsQnlFbGVtZW50KHUsIHJlYWRlcik7ICAgLy8gcHJlZmVycmVkIGFuZCBhbHdheXMgdXNlZCBmb3INCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3R5bGU9ZG9jdW1lbnQNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamF4YiA9IHVubWFyc2hhbEJ5VHlwZSh1LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UHJvY2Vzc1R5cGUoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzeG1sTGlzdCgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q29uc3RydWN0aW9uVHlwZSgpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vIFN1Y2Nlc3NmdWxseSB1bm1hcnNoYWxsZWQgdGhlIG9iamVjdA0KLSAgICAgICAgSkFYQlV0aWxzLnJlbGVhc2VKQVhCVW5tYXJzaGFsbGVyKGdldEpBWEJDb250ZXh0KGNsKSwgdSk7DQotICAgICAgICANCi0gICAgICAgIC8vIERvbid0IGNsb3NlIHRoZSByZWFkZXIuICBUaGUgcmVhZGVyIGlzIG93bmVkIGJ5IHRoZSBjYWxsZXIsIGFuZCBpdA0KLSAgICAgICAgLy8gbWF5IGNvbnRhaW4gb3RoZXIgeG1sIGluc3RhbmNlIGRhdGEgKG90aGVyIHRoYW4gdGhpcyBKQVhCIG9iamVjdCkNCi0gICAgICAgIC8vIHJlYWRlci5jbG9zZSgpOw0KLSAgICAgICAgcmV0dXJuIGpheGI7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBNYXJzaGFsIHRoZSBqYXhiIG9iamVjdA0KLSAgICAgKiBAcGFyYW0gb2JqDQotICAgICAqIEBwYXJhbSB3cml0ZXINCi0gICAgICogQHBhcmFtIGFtIEF0dGFjaG1lbnRNYXJzaGFsbGVyLCBvcHRpb25hbCBBdHRhY2htZW50DQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBtYXJzaGFsKE9iamVjdCBvYmosIA0KLSAgICAgICAgICAgICAgICAgICAgICAgIFhNTFN0cmVhbVdyaXRlciB3cml0ZXIpIHRocm93cyBKQVhCRXhjZXB0aW9uIHsNCi0gICAgICAgICAgICAvLyBUaGVyZSBtYXkgYmUgYSBwcmVmZXJyZWQgY2xhc3Nsb2FkZXIgdGhhdCBzaG91bGQgYmUgdXNlZA0KLSAgICAgICAgICAgIENsYXNzTG9hZGVyIGNsID0gZ2V0Q2xhc3NMb2FkZXIoKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBWZXJ5IGVhc3ksIHVzZSB0aGUgQ29udGV4dCB0byBnZXQgdGhlIE1hcnNoYWxsZXIuDQotICAgICAgICAgICAgLy8gVXNlIHRoZSBtYXJzaGFsbGVyIHRvIHdyaXRlIHRoZSBvYmplY3QuDQotICAgICAgICAgICAgTWFyc2hhbGxlciBtID0gSkFYQlV0aWxzLmdldEpBWEJNYXJzaGFsbGVyKGdldEpBWEJDb250ZXh0KGNsKSk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgQXR0YWNobWVudE1hcnNoYWxsZXIgYW0gPSBjcmVhdGVBdHRhY2htZW50TWFyc2hhbGxlcih3cml0ZXIpOw0KLSAgICAgICAgICAgIGlmIChhbSAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgIGlmIChERUJVR19FTkFCTEVEKSB7DQotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkFkZGluZyBKQVhCQXR0YWNobWVudE1hcnNoYWxsZXIgdG8gTWFyc2hhbGxlciIpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIG0uc2V0QXR0YWNobWVudE1hcnNoYWxsZXIoYW0pOw0KLSAgICAgICAgICAgIH0NCi0NCi0NCi0gICAgICAgICAgICAvLyBNYXJzaGFsIHRoZSBvYmplY3QNCi0gICAgICAgICAgICBpZiAoZ2V0UHJvY2Vzc1R5cGUoKSA9PSBudWxsKSB7DQotICAgICAgICAgICAgICAgIG1hcnNoYWxCeUVsZW1lbnQob2JqLCANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLCANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIsIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIWFtLmlzWE9QUGFja2FnZSgpKTsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBtYXJzaGFsQnlUeXBlKG9iaiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlciwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRQcm9jZXNzVHlwZSgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzeG1sTGlzdCgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldENvbnN0cnVjdGlvblR5cGUoKSk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIC8vIFN1Y2Nlc3NmdWxseSBtYXJzaGFsbGVkIHRoZSBkYXRhDQotICAgICAgICAgICAgSkFYQlV0aWxzLnJlbGVhc2VKQVhCTWFyc2hhbGxlcihnZXRKQVhCQ29udGV4dChjbCksIG0pOw0KLSAgICB9DQotICAgIA0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFByZWZlcnJlZCB3YXkgdG8gbWFyc2hhbCBvYmplY3RzLg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGIgT2JqZWN0IHRoYXQgY2FuIGJlIHJlbmRlcmVkIGFzIGFuIGVsZW1lbnQgYW5kIHRoZSBlbGVtZW50IG5hbWUgaXMga25vd24gYnkgdGhlDQotICAgICAqIE1hcnNoYWxsZXINCi0gICAgICogQHBhcmFtIG0gTWFyc2hhbGxlcg0KLSAgICAgKiBAcGFyYW0gd3JpdGVyIFhNTFN0cmVhbVdyaXRlcg0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBtYXJzaGFsQnlFbGVtZW50KGZpbmFsIE9iamVjdCBiLCBmaW5hbCBNYXJzaGFsbGVyIG0sIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgWE1MU3RyZWFtV3JpdGVyIHdyaXRlciwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gb3B0aW1pemUpIHsNCi0gICAgICAgIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkQWN0aW9uKCkgew0KLSAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgew0KLSAgICAgICAgICAgICAgICAvLyBNYXJzaGFsbGluZyBkaXJlY3RseSB0byB0aGUgb3V0cHV0IHN0cmVhbSBpcyBmYXN0ZXIgdGhhbiBtYXJzaGFsbGluZyB0aHJvdWdoIHRoZQ0KLSAgICAgICAgICAgICAgICAvLyBYTUxTdHJlYW1Xcml0ZXIuIA0KLSAgICAgICAgICAgICAgICAvLyBUYWtlIGFkdmFudGFnZSBvZiB0aGlzIG9wdGltaXphdGlvbiBpZiB0aGVyZSBpcyBhbiBvdXRwdXQgc3RyZWFtLg0KLSAgICAgICAgICAgICAgICB0cnkgew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFvcHRpbWl6ZSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy50cmFjZShKYXZhVXRpbHMuc3RhY2tUb1N0cmluZygpKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRPdXRwdXRTdHJlYW0od3JpdGVyKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbSBvcyA9IChvcHRpbWl6ZSkgPyBnZXRPdXRwdXRTdHJlYW0od3JpdGVyKSA6IG51bGw7DQotICAgICAgICAgICAgICAgICAgICBpZiAob3MgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVR19FTkFCTEVEKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiSW52b2tpbmcgbWFyc2hhbEJ5RWxlbWVudC4gICIgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWFyc2hhbGluZyB0byBhbiBPdXRwdXRTdHJlYW0uICIgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9iamVjdCBpcyAiDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGdldERlYnVnTmFtZShiKSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci5mbHVzaCgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIG0ubWFyc2hhbChiLCBvcyk7DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVR19FTkFCTEVEKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiSW52b2tpbmcgbWFyc2hhbEJ5RWxlbWVudC4gICIgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWFyc2hhbGluZyB0byBhbiBYTUxTdHJlYW1Xcml0ZXIuICIgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9iamVjdCBpcyAiDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGdldERlYnVnTmFtZShiKSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIG0ubWFyc2hhbChiLCB3cml0ZXIpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9IGNhdGNoIChPTUV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBlOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkgew0KLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE9NRXhjZXB0aW9uKHQpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgICAgIH19KTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldERlYnVnTmFtZShPYmplY3Qgbykgew0KLSAgICAgICAgcmV0dXJuIChvID09IG51bGwpID8gIm51bGwiIDogby5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogSWYgdGhlIHdyaXRlciBpcyBiYWNrZWQgYnkgYW4gT3V0cHV0U3RyZWFtLCB0aGVuIHJldHVybiB0aGUgT3V0cHV0U3RyZWFtDQotICAgICAqIEBwYXJhbSB3cml0ZXINCi0gICAgICogQHJldHVybiBPdXRwdXRTdHJlYW0gb3IgbnVsbA0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBzdGF0aWMgT3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbShYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsNCi0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiWE1MU3RyZWFtV3JpdGVyIGlzICIgKyB3cml0ZXIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgT3V0cHV0U3RyZWFtIG9zID0gbnVsbDsNCi0gICAgICAgIGlmICh3cml0ZXIuZ2V0Q2xhc3MoKSA9PSBNVE9NWE1MU3RyZWFtV3JpdGVyLmNsYXNzKSB7DQotICAgICAgICAgICAgb3MgPSAoKE1UT01YTUxTdHJlYW1Xcml0ZXIpIHdyaXRlcikuZ2V0T3V0cHV0U3RyZWFtKCk7DQotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiT3V0cHV0U3RyZWFtIGFjY2Vzc2libGUgZnJvbSBNVE9NWE1MU3RyZWFtV3JpdGVyIGlzICIgKyBvcyk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHdyaXRlci5nZXRDbGFzcygpID09IFhNTFN0cmVhbVdyaXRlcldpdGhPUy5jbGFzcykgew0KLSAgICAgICAgICAgIG9zID0gKChYTUxTdHJlYW1Xcml0ZXJXaXRoT1MpIHdyaXRlcikuZ2V0T3V0cHV0U3RyZWFtKCk7DQotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiT3V0cHV0U3RyZWFtIGFjY2Vzc2libGUgZnJvbSBYTUxTdHJlYW1Xcml0ZXJXaXRoT1MgaXMgIiArIG9zKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gb3M7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBUaGUgcm9vdCBlbGVtZW50IGJlaW5nIHJlYWQgaXMgZGVmaW5lZCBieSBzY2hlbWEvSkFYQjsgaG93ZXZlciBpdHMgY29udGVudHMgYXJlIGtub3duIGJ5DQotICAgICAqIHNjaGVtYS9KQVhCLiBUaGVyZWZvcmUgd2UgdXNlIHVubWFyc2hhbCBieSB0aGUgZGVjbGFyZWQgdHlwZSAoVGhpcyBtZXRob2QgaXMgdXNlZCB0bw0KLSAgICAgKiB1bm1hcnNoYWwgcnBjIGVsZW1lbnRzKQ0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIHUgVW5tYXJzaGFsbGVyDQotICAgICAqIEBwYXJhbSByZWFkZXIgWE1MU3RyZWFtUmVhZGVyDQotICAgICAqIEBwYXJhbSB0eXBlIENsYXNzDQotICAgICAqIEByZXR1cm4gT2JqZWN0DQotICAgICAqIEB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbg0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgdW5tYXJzaGFsQnlUeXBlKGZpbmFsIFVubWFyc2hhbGxlciB1LCBmaW5hbCBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzIHR5cGUsIGZpbmFsIGJvb2xlYW4gaXNMaXN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEpBWEJVdGlscy5DT05TVFJVQ1RJT05fVFlQRSBjdHlwZSkNCi0gICAgICAgIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsNCi0NCi0gICAgICAgIGlmIChERUJVR19FTkFCTEVEKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKCJJbnZva2luZyB1bm1hcnNoYWxCeVR5cGUuIik7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRBY3Rpb24oKSB7DQotICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB7DQotICAgICAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgICAgICAvLyBVbmZvcnR1bmF0ZWx5IFJQQyBpcyB0eXBlIGJhc2VkLiBUaHVzIGENCi0gICAgICAgICAgICAgICAgICAgIC8vIGRlY2xhcmVkIHR5cGUgbXVzdCBiZSB1c2VkIHRvIHVubWFyc2hhbCB0aGUgeG1sLg0KLSAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGpheGI7DQotICAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0xpc3QpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBjYXNlOiBXZSBhcmUgbm90IHVubWFyc2hhbGxpbmcgYW4geHNkOmxpc3QgYnV0IGFuIEFycmF5Lg0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlLmlzQXJyYXkoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgY29udGV4dCBpcyBjcmVhdGVkIHVzaW5nIHBhY2thZ2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2Ugd2lsbCBub3QgaGF2ZSBjb21tb24gYXJyYXlzIG9yIHR5cGUgYXJyYXkgaW4gdGhlIGNvbnRleHQNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnV0IHRoZXJlIGlzIG5vdCBtdWNoIHdlIGNhbiBkbyBhYm91dCBpdCBzbyBzZXJhbGl6ZSBpdCBhcw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1c3VhbA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3R5cGUgPT0gSkFYQlV0aWxzLkNPTlNUUlVDVElPTl9UWVBFLkJZX0NPTlRFWFRfUEFUSCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF4YiA9IHUudW5tYXJzaGFsKHJlYWRlciwgdHlwZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGlzdCBvbiBjbGllbnQgYXJyYXkgb24gc2VydmVyLCBDYW4gaGFwcGVuIG9ubHkgaW4gc3RhcnQgZnJvbSBqYXZhDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhc2UuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKChjdHlwZSA9PSBKQVhCVXRpbHMuQ09OU1RSVUNUSU9OX1RZUEUuQllfQ0xBU1NfQVJSQVkpKSB7DQotDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgdHlwZSBjb3VsZCBiZSBhbnkgT2JqZWN0IG9yIHByaW1pdGl2ZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSSB3aWxsIGZpcnN0IHVubWFyc2hhbGwgdGhlIHhtbGRhdGEgdG8gYSBTdHJpbmdbXQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlbiB1c2UgdGhlIHVubWFyc2hhbGxlZCBqYXhiRWxlbWVudCB0byBjcmVhdGUNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByb3BlciB0eXBlIE9iamVjdCBBcnJheS4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF4YiA9IHVubWFyc2hhbEFycmF5KHJlYWRlciwgdSwgdHlwZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF4YiA9IHUudW5tYXJzaGFsKHJlYWRlciwgdHlwZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZS5pc0VudW0oKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXaGVuIEpBWEJDb250ZXh0IGlzIGNyZWF0ZWQgdXNpbmcgYSBjb250ZXh0IHBhdGgsIGl0IHdpbGwgbm90IA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmNsdWRlIEVudW0gY2xhc3Nlcy4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlc2UgY2xhc3NlcyBoYXZlIEBYbWxFbnVtIGFubm90YXRpb24gYnV0IG5vdCBAWG1sVHlwZS9AWG1sRWxlbWVudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc28gdGhlIHVzZXIgd2lsbCBzZWUgTWFyc2hhbGxpbmdFeCwgY2xhc3Mgbm90IGtub3duIHRvIGN0eHQuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGEgamF4LWIgZGVmZWN0LCBmb3Igbm93IHRoaXMgZml4IGlzIGluIHBsYWNlIHRvIHBhc3MgQ1RTLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIG9ubHkgZml4ZXMgdGhlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNpdHVhdGlvbiB3aGVyZSB0aGUgZW51bSBpcyB0aGUgdG9wLWxldmVsIG9iamVjdCAoZS5nLiwgbWVzc2FnZS1wYXJ0DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluIHJwYy1saXQgc2NlbmFyaW8pDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNhbXBsZSBvZiB3aGF0IGVudW0gbG9va3MgbGlrZToNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQFhtbEVudW0gcHVibGljIGVudW0gRW51bVN0cmluZyB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEBYbWxFbnVtVmFsdWUoIlN0cmluZzEiKSBTVFJJTkdfMSgiU3RyaW5nMSIpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBAWG1sRW51bVZhbHVlKCJTdHJpbmcyIikgU1RSSU5HXzIoIlN0cmluZzIiKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHVibGljIHN0YXRpYyBnZXRWYWx1ZShTdHJpbmcpe30gPC0tIHJlc29sdmVzIGEgInZhbHVlIiB0byBhbiBlbXVtDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9iamVjdA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAuLi4gfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUdfRU5BQkxFRCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJ1bm1hcnNoYWxCeVR5cGUuIFVubWFyc2hhbGxpbmcgIiArIHR5cGUuZ2V0TmFtZSgpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBhcyBFbnVtIik7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYQkVsZW1lbnQ8U3RyaW5nPiBlbnVtVmFsdWUgPSB1LnVubWFyc2hhbChyZWFkZXIsIFN0cmluZy5jbGFzcyk7DQotDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbnVtVmFsdWUgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kIG0gPQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLmdldE1ldGhvZCgiZnJvbVZhbHVlIiwgbmV3IENsYXNzW10geyBTdHJpbmcuY2xhc3MgfSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXhiID0gbS5pbnZva2UobnVsbCwgbmV3IE9iamVjdFtdIHsgZW51bVZhbHVlLmdldFZhbHVlKCkgfSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXhiID0gbnVsbDsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAvL05vcm1hbCBjYXNlOiBXZSBhcmUgbm90IHVubWFyc2hhbGxpbmcgYSB4c2Q6bGlzdCBvciBBcnJheQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXhiID0gdS51bm1hcnNoYWwocmVhZGVyLCB0eXBlKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgaXMgYW4geHNkOmxpc3QsIHdlIG5lZWQgdG8gcmV0dXJuIHRoZSBhcHByb3ByaWF0ZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxpc3Qgb3IgYXJyYXkgKHNlZSBOT1RFIGFib3ZlKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpcnN0IHVubWFyc2hhbCBhcyBhIFN0cmluZw0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vU2Vjb25kIGNvbnZlcnQgdGhlIFN0cmluZyBpbnRvIGEgbGlzdCBvciBhcnJheQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGpheGIgPSB1bm1hcnNoYWxBc0xpc3RPckFycmF5KHJlYWRlciwgdSwgdHlwZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gamF4YjsNCi0gICAgICAgICAgICAgICAgfSBjYXRjaCAoT01FeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgZTsNCi0gICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsNCi0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBPTUV4Y2VwdGlvbih0KTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0pOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIE9iamVjdCB1bm1hcnNoYWxBcnJheShmaW5hbCBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyLCANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFVubWFyc2hhbGxlciB1LCANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzIHR5cGUpDQotICAgICAgIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBpZiAoREVCVUdfRU5BQkxFRCkgew0KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkludm9raW5nIHVubWFyc2hhbEFycmF5Iik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIE9iamVjdCBqYXhiID0gQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRBY3Rpb24oKSB7DQotICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgew0KLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdS51bm1hcnNoYWwocmVhZGVyLCBTdHJpbmdbXS5jbGFzcyk7DQotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChPTUV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZTsNCi0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE9NRXhjZXB0aW9uKHQpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfSk7DQotDQotICAgICAgICAgICAgT2JqZWN0IHR5cGVPYmogPSBnZXRUeXBlRW5hYmxlZE9iamVjdChqYXhiKTsNCi0NCi0gICAgICAgICAgICAvLyBOb3cgY29udmVydCBTdHJpbmcgQXJyYXkgaW4gdG8gdGhlIHJlcXVpcmVkIFR5cGUgQXJyYXkuDQotICAgICAgICAgICAgaWYgKHR5cGVPYmogaW5zdGFuY2VvZiBTdHJpbmdbXSkgew0KLSAgICAgICAgICAgICAgICBTdHJpbmdbXSBzdHJBcnJheSA9IChTdHJpbmdbXSkgdHlwZU9iajsNCi0gICAgICAgICAgICAgICAgT2JqZWN0IG9iaiA9IFhTRExpc3RVdGlscy5mcm9tU3RyaW5nQXJyYXkoc3RyQXJyYXksIHR5cGUpOw0KLSAgICAgICAgICAgICAgICBRTmFtZSBxTmFtZSA9DQotICAgICAgICAgICAgICAgICAgICBYTUxSb290RWxlbWVudFV0aWwuZ2V0WG1sUm9vdEVsZW1lbnRRTmFtZUZyb21PYmplY3QoamF4Yik7DQotICAgICAgICAgICAgICAgIGpheGIgPSBuZXcgSkFYQkVsZW1lbnQocU5hbWUsIHR5cGUsIG9iaik7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHJldHVybiBqYXhiOw0KLSAgICAgICAgfSBjYXRjaCAoT01FeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIHRocm93IGU7DQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBPTUV4Y2VwdGlvbih0KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgIA0KLSAgICAvKioNCi0gICAgICogY29udmVydCB0aGUgU3RyaW5nIGludG8gYSBsaXN0IG9yIGFycmF5DQotICAgICAqIEBwYXJhbSA8VD4NCi0gICAgICogQHBhcmFtIGpheGINCi0gICAgICogQHBhcmFtIHR5cGUNCi0gICAgICogQHJldHVybg0KLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24NCi0gICAgICogQHRocm93cyBQYXJzZUV4Y2VwdGlvbg0KLSAgICAgKiBAdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbg0KLSAgICAgKiBAdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24NCi0gICAgICogQHRocm93cyBEYXRhdHlwZUNvbmZpZ3VyYXRpb25FeGNlcHRpb24NCi0gICAgICogQHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCB1bm1hcnNoYWxBc0xpc3RPckFycmF5KGZpbmFsIFhNTFN0cmVhbVJlYWRlciByZWFkZXIsIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFVubWFyc2hhbGxlciB1LCANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MgdHlwZSkNCi0gICAgICAgIHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBQYXJzZUV4Y2VwdGlvbixOb1N1Y2hNZXRob2RFeGNlcHRpb24sDQotICAgICAgICBJbnN0YW50aWF0aW9uRXhjZXB0aW9uLA0KLSAgICAgICAgRGF0YXR5cGVDb25maWd1cmF0aW9uRXhjZXB0aW9uLEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sSkFYQkV4Y2VwdGlvbiB7DQotICAgICAgICANCi0gICAgICAgIA0KLSAgICAgICAgICAgIGlmIChERUJVR19FTkFCTEVEKSB7DQotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiSW52b2tpbmcgdW5tYXJzaGFBcnJheSIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBJZiB0aGlzIGlzIGFuIHhzZDpsaXN0LCB3ZSBuZWVkIHRvIHJldHVybiB0aGUgYXBwcm9wcmlhdGUNCi0gICAgICAgICAgICAvLyBsaXN0IG9yIGFycmF5IChzZWUgTk9URSBhYm92ZSkNCi0gICAgICAgICAgICAvLyBGaXJzdCB1bm1hcnNoYWwgYXMgYSBTdHJpbmcNCi0gICAgICAgICAgICBPYmplY3QgamF4YiA9IG51bGw7DQotICAgICAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICAgICAgamF4YiA9IEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkQWN0aW9uKCkgew0KLSAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHUudW5tYXJzaGFsKHJlYWRlciwgU3RyaW5nLmNsYXNzKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChPTUV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGU7DQotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE9NRXhjZXB0aW9uKHQpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfSk7DQotICAgICAgICAgICAgfSBjYXRjaCAoT01FeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgICAgICB0aHJvdyBlOw0KLSAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7DQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBPTUV4Y2VwdGlvbih0KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgLy9TZWNvbmQgY29udmVydCB0aGUgU3RyaW5nIGludG8gYSBsaXN0IG9yIGFycmF5DQotICAgICAgICAgICAgaWYgKGdldFR5cGVFbmFibGVkT2JqZWN0KGpheGIpIGluc3RhbmNlb2YgU3RyaW5nKSB7DQotICAgICAgICAgICAgICAgIFFOYW1lIHFOYW1lID0gWE1MUm9vdEVsZW1lbnRVdGlsLmdldFhtbFJvb3RFbGVtZW50UU5hbWVGcm9tT2JqZWN0KGpheGIpOw0KLSAgICAgICAgICAgICAgICBPYmplY3Qgb2JqID0gWFNETGlzdFV0aWxzLmZyb21YU0RMaXN0U3RyaW5nKChTdHJpbmcpIGdldFR5cGVFbmFibGVkT2JqZWN0KGpheGIpLCB0eXBlKTsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBKQVhCRWxlbWVudChxTmFtZSwgdHlwZSwgb2JqKTsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICByZXR1cm4gamF4YjsNCi0gICAgICAgICAgICB9DQotDQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFJldHVybiB0eXBlIGVuYWJsZWQgb2JqZWN0DQotICAgICAqDQotICAgICAqIEBwYXJhbSBvYmogdHlwZSBvciBlbGVtZW50IGVuYWJsZWQgb2JqZWN0DQotICAgICAqIEByZXR1cm4gdHlwZSBlbmFibGVkIG9iamVjdA0KLSAgICAgKi8NCi0gICAgc3RhdGljIE9iamVjdCBnZXRUeXBlRW5hYmxlZE9iamVjdChPYmplY3Qgb2JqKSB7DQotICAgICAgICBpZiAob2JqID09IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBKQVhCRWxlbWVudCkgew0KLSAgICAgICAgICAgIHJldHVybiAoKEpBWEJFbGVtZW50KSBvYmopLmdldFZhbHVlKCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gb2JqOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBNYXJzaGFsIG9iamVjdHMgYnkgdHlwZQ0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGIgT2JqZWN0IHRoYXQgY2FuIGJlIHJlbmRlcmVkIGFzIGFuIGVsZW1lbnQsIGJ1dCB0aGUgZWxlbWVudCBuYW1lIGlzIG5vdCBrbm93biB0byB0aGUNCi0gICAgICogc2NoZW1hIChpLmUuIHJwYykNCi0gICAgICogQHBhcmFtIG0gTWFyc2hhbGxlcg0KLSAgICAgKiBAcGFyYW0gd3JpdGVyIFhNTFN0cmVhbVdyaXRlcg0KLSAgICAgKiBAcGFyYW0gdHlwZQ0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBtYXJzaGFsQnlUeXBlKGZpbmFsIE9iamVjdCBiLCBmaW5hbCBNYXJzaGFsbGVyIG0sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyLCBmaW5hbCBDbGFzcyB0eXBlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBpc0xpc3QsIGZpbmFsIEpBWEJVdGlscy5DT05TVFJVQ1RJT05fVFlQRSBjdHlwZSkNCi0gICAgICAgIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsNCi0gICAgICAgIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkQWN0aW9uKCkgew0KLSAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgew0KLSAgICAgICAgICAgICAgICB0cnkgew0KLQ0KLSAgICAgICAgICAgICAgICAgICAgLy8gTk9URQ0KLSAgICAgICAgICAgICAgICAgICAgLy8gRXhhbXBsZToNCi0gICAgICAgICAgICAgICAgICAgIC8vIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJMb25nTGlzdCI+DQotICAgICAgICAgICAgICAgICAgICAvLyA8eHNkOmxpc3Q+DQotICAgICAgICAgICAgICAgICAgICAvLyA8eHNkOnNpbXBsZVR5cGU+DQotICAgICAgICAgICAgICAgICAgICAvLyA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp1bnNpZ25lZEludCIvPg0KLSAgICAgICAgICAgICAgICAgICAgLy8gPC94c2Q6c2ltcGxlVHlwZT4NCi0gICAgICAgICAgICAgICAgICAgIC8vIDwveHNkOmxpc3Q+DQotICAgICAgICAgICAgICAgICAgICAvLyA8L3hzZDpzaW1wbGVUeXBlPg0KLSAgICAgICAgICAgICAgICAgICAgLy8gPGVsZW1lbnQgbmFtZT0ibXlMb25nIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0iaW1wbDpMb25nTGlzdCIvPg0KLSAgICAgICAgICAgICAgICAgICAgLy8NCi0gICAgICAgICAgICAgICAgICAgIC8vIExvbmdMaXN0IHdpbGwgYmUgcmVwcmVzZW50ZWQgYXMgYW4gaW50W10NCi0gICAgICAgICAgICAgICAgICAgIC8vIE9uIHRoZSB3aXJlIG15TG9uZyB3aWxsIGJlIHJlcHJlc2VudGVkIGFzIGEgbGlzdCBvZiBpbnRlZ2Vycw0KLSAgICAgICAgICAgICAgICAgICAgLy8gd2l0aCBpbnRlcnZlbmluZyB3aGl0ZXNwYWNlDQotICAgICAgICAgICAgICAgICAgICAvLyA8bXlMb25nPjEgMiAzPC9teUxvbmc+DQotICAgICAgICAgICAgICAgICAgICAvLw0KLSAgICAgICAgICAgICAgICAgICAgLy8gVW5mb3J0dW5hdGVseSwgd2UgYXJlIHRyeWluZyB0byBtYXJzaGFsIGJ5IHR5cGUuIFRoZXJlZm9yZQ0KLSAgICAgICAgICAgICAgICAgICAgLy8gd2Ugd2FudCB0byBtYXJzaGFsIGFuIGVsZW1lbnQgKGZvbykgdGhhdCBpcyB1bmtub3duIHRvIHNjaGVtYS4NCi0gICAgICAgICAgICAgICAgICAgIC8vIElmIHdlIHVzZSB0aGUgbm9ybWFsIG1hcnNoYWwgY29kZSwgdGhlIHdpcmUgd2lsbCBsb29rIGxpa2UNCi0gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgKHdoaWNoIGlzIGluY29ycmVjdCk6DQotICAgICAgICAgICAgICAgICAgICAvLyA8Zm9vPjxpdGVtPjE8L2l0ZW0+PGl0ZW0+MjwvaXRlbT48aXRlbT4zPC9pdGVtPjwvZm9vPg0KLSAgICAgICAgICAgICAgICAgICAgLy8NCi0gICAgICAgICAgICAgICAgICAgIC8vIFRoZSBzb2x1dGlvbiBpcyB0byBkZXRlY3QgdGhpcyBzaXR1YXRpb24gYW5kIG1hcnNoYWwgdGhlDQotICAgICAgICAgICAgICAgICAgICAvLyBTdHJpbmcgaW5zdGVhZC4gVGhlbiB3ZSBnZXQgdGhlIGNvcnJlY3Qgd2lyZSBmb3JtYXQ6DQotICAgICAgICAgICAgICAgICAgICAvLyA8Zm9vPjEgMiAzPC9mb28+DQotICAgICAgICAgICAgICAgICAgICBPYmplY3QgamJvID0gYjsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChpc0xpc3QpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUdfRU5BQkxFRCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIm1hcnNoYWxsaW5nIHR5cGUgd2hpY2ggaXMgYSBMaXN0IG9yIEFycmF5Iik7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgY29kZSBhc3N1bWVzIHRoYXQgdGhlIEpBWEJDb250ZXh0IGRvZXMgbm90IHVuZGVyc3RhbmQNCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgYXJyYXkgb3IgbGlzdC4gSW4gc3VjaCBjYXNlcywgdGhlIGNvbnRlbnRzIGFyZSBjb252ZXJ0ZWQNCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyB0byBhIFN0cmluZyBhbmQgcGFzc2VkIGRpcmVjdGx5Lg0KLSAgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdHlwZSA9PSBKQVhCVXRpbHMuQ09OU1RSVUNUSU9OX1RZUEUuQllfQ09OVEVYVF9QQVRIKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFOYW1lIHFOYW1lID0gWE1MUm9vdEVsZW1lbnRVdGlsLmdldFhtbFJvb3RFbGVtZW50UU5hbWVGcm9tT2JqZWN0KGIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdGV4dCA9IFhTRExpc3RVdGlscy50b1hTRExpc3RTdHJpbmcoZ2V0VHlwZUVuYWJsZWRPYmplY3QoYikpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUdfRU5BQkxFRCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJtYXJzaGFsbGluZyBbY29udGV4dCBwYXRoIGFwcHJvYWNoXSAiICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2l0aCB4bWxsaXN0IHRleHQgPSAiICsgdGV4dCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgamJvID0gbmV3IEpBWEJFbGVtZW50KHFOYW1lLCBTdHJpbmcuY2xhc3MsIHRleHQpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY3R5cGUgPT0gSkFYQlV0aWxzLkNPTlNUUlVDVElPTl9UWVBFLkJZX0NMQVNTX0FSUkFZKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNvbWUgdmVyc2lvbnMgb2YgSkFYQiBoYXZlIGFycmF5L2xpc3QgcHJvY2Vzc2luZyBidWlsdCBpbi4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBjb2RlIGlzIGEgc2FmZWd1YXJkIGJlY2F1c2UgYXBwYXJlbnRseSBzb21lIHZlcnNpb25zDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mIEpBWEIgZG9uJ3QuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFOYW1lIHFOYW1lID0gWE1MUm9vdEVsZW1lbnRVdGlsLmdldFhtbFJvb3RFbGVtZW50UU5hbWVGcm9tT2JqZWN0KGIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdGV4dCA9IFhTRExpc3RVdGlscy50b1hTRExpc3RTdHJpbmcoZ2V0VHlwZUVuYWJsZWRPYmplY3QoYikpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUdfRU5BQkxFRCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJtYXJzaGFsbGluZyBbY2xhc3MgYXJyYXkgYXBwcm9hY2hdICIgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aXRoIHhtbGxpc3QgdGV4dCA9ICIgKyB0ZXh0KTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYm8gPSBuZXcgSkFYQkVsZW1lbnQocU5hbWUsIFN0cmluZy5jbGFzcywgdGV4dCk7IA0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgIC8vIFdoZW4gSkFYQkNvbnRleHQgaXMgY3JlYXRlZCB1c2luZyBhIGNvbnRleHQgcGF0aCwgaXQgd2lsbCBub3QgaW5jbHVkZSBFbnVtDQotICAgICAgICAgICAgICAgICAgICAvLyBjbGFzc2VzLg0KLSAgICAgICAgICAgICAgICAgICAgLy8gVGhlc2UgY2xhc3NlcyBoYXZlIEBYbWxFbnVtIGFubm90YXRpb24gYnV0IG5vdCBAWG1sVHlwZS9AWG1sRWxlbWVudCwgc28gdGhlDQotICAgICAgICAgICAgICAgICAgICAvLyB1c2VyIHdpbGwgc2VlIE1hcnNoYWxsaW5nRXgsIGNsYXNzIG5vdCBrbm93biB0byBjdHh0Lg0KLSAgICAgICAgICAgICAgICAgICAgLy8gDQotICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGEgamF4LWIgZGVmZWN0LCBmb3Igbm93IHRoaXMgZml4IGlzIGluIHBsYWNlIHRvIHBhc3MgQ1RTLiBUaGlzIG9ubHkNCi0gICAgICAgICAgICAgICAgICAgIC8vIGZpeGVzIHRoZQ0KLSAgICAgICAgICAgICAgICAgICAgLy8gc2l0dWF0aW9uIHdoZXJlIHRoZSBlbnVtIGlzIHRoZSB0b3AtbGV2ZWwgb2JqZWN0IChlLmcuLCBtZXNzYWdlLXBhcnQgaW4NCi0gICAgICAgICAgICAgICAgICAgIC8vIHJwYy1saXQgc2NlbmFyaW8pDQotICAgICAgICAgICAgICAgICAgICAvLw0KLSAgICAgICAgICAgICAgICAgICAgLy8gU2FtcGxlIG9mIHdoYXQgZW51bSBsb29rcyBsaWtlOg0KLSAgICAgICAgICAgICAgICAgICAgLy8gQFhtbEVudW0gcHVibGljIGVudW0gRW51bVN0cmluZyB7DQotICAgICAgICAgICAgICAgICAgICAvLyBAWG1sRW51bVZhbHVlKCJTdHJpbmcxIikgU1RSSU5HXzEoIlN0cmluZzEiKSwNCi0gICAgICAgICAgICAgICAgICAgIC8vIEBYbWxFbnVtVmFsdWUoIlN0cmluZzIiKSBTVFJJTkdfMigiU3RyaW5nMiIpOw0KLSAgICAgICAgICAgICAgICAgICAgLy8gLi4uIH0NCi0gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlLmlzRW51bSgpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGIgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUdfRU5BQkxFRCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJtYXJzaGFsQnlUeXBlLiBNYXJzaGFsaW5nICIgKyB0eXBlLmdldE5hbWUoKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgYXMgRW51bSIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWEJFbGVtZW50IGpiZSA9IChKQVhCRWxlbWVudCkgYjsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gWE1MUm9vdEVsZW1lbnRVdGlsLmdldEVudW1WYWx1ZSgoRW51bSkgamJlLmdldFZhbHVlKCkpOw0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYm8gPSBuZXcgSkFYQkVsZW1lbnQoamJlLmdldE5hbWUoKSwgU3RyaW5nLmNsYXNzLCB2YWx1ZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHX0VOQUJMRUQpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkludm9raW5nIG1hcnNoYWxCeVR5cGUuICAiICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1hcnNoYWxpbmcgdG8gYW4gWE1MU3RyZWFtV3JpdGVyLiBPYmplY3QgaXMgIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBnZXREZWJ1Z05hbWUoYikpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgICAgICAvLy8gVE9ETyANCi0gICAgICAgICAgICAgICAgICAgIC8vIEZvciB0aGUgY2FzZXMgbGlrZSBlbnVtIGFuZCBsaXN0LCBzaG91bGQgd2UgDQotICAgICAgICAgICAgICAgICAgICAvLyBpbnRlcmNlcHQgZXhjZXB0aW9ucyBhbmQgdHJ5IGEgZGlmZmVyZW50IGFwcHJvYWNoID8NCi0gICAgICAgICAgICAgICAgICAgIG0ubWFyc2hhbChqYm8sIHdyaXRlcik7DQotDQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE9NRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICAgICAgICAgIHRocm93IGU7DQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7DQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT01FeGNlcHRpb24odCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFByZWZlcnJlZCB3YXkgdG8gdW5tYXJzaGFsIG9iamVjdHMNCi0gICAgICogDQotICAgICAqIEBwYXJhbSB1IFVubWFyc2hhbGxlcg0KLSAgICAgKiBAcGFyYW0gcmVhZGVyIFhNTFN0cmVhbVJlYWRlcg0KLSAgICAgKiBAcmV0dXJuIE9iamVjdCB0aGF0IHJlcHJlc2VudHMgYW4gZWxlbWVudA0KLSAgICAgKiBAdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24NCi0gICAgICovDQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IHVubWFyc2hhbEJ5RWxlbWVudChmaW5hbCBVbm1hcnNoYWxsZXIgdSwgZmluYWwgWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikNCi0gICAgICAgIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgaWYgKERFQlVHX0VOQUJMRUQpIHsNCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJJbnZva2luZyB1bk1hcnNoYWxCeUVsZW1lbnQiKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkQWN0aW9uKCkgew0KLSAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsNCi0gICAgICAgICAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHUudW5tYXJzaGFsKHJlYWRlcik7DQotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChPTUV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZTsNCi0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE9NRXhjZXB0aW9uKHQpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfSk7DQotDQotICAgICAgICB9IGNhdGNoIChPTUV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgdGhyb3cgZTsNCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IE9NRXhjZXB0aW9uKHQpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFzb3VyY2UvamF4Yi9KQVhCRGF0YVNvdXJjZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YXNvdXJjZS9qYXhiL0pBWEJEYXRhU291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwOWIxOTAuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YXNvdXJjZS9qYXhiL0pBWEJEYXRhU291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhc291cmNlLmpheGI7DQotDQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlRXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NT3V0cHV0Rm9ybWF0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmRzLk9NRGF0YVNvdXJjZUV4dEJhc2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5NVE9NWE1MU3RyZWFtV3JpdGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLnV0aWwuU3RBWFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UudXRpbC5YTUxTdHJlYW1Xcml0ZXJXaXRoT1M7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247DQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOw0KLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlcjsNCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07DQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07DQotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247DQotaW1wb3J0IGphdmEuaW8uV3JpdGVyOw0KLQ0KLS8qKg0KLSAqIE9NRGF0YVNvdXJjZSBiYWNrZWQgYnkgYSBqYXhiIG9iamVjdA0KLSAqLw0KLXB1YmxpYyBjbGFzcyBKQVhCRGF0YVNvdXJjZSBleHRlbmRzIE9NRGF0YVNvdXJjZUV4dEJhc2Ugew0KLSAgICANCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEpBWEJEYXRhU291cmNlLmNsYXNzKTsNCi0gICAgDQotICAgIE9iamVjdCBqYXhiOw0KLSAgICBKQVhCRFNDb250ZXh0IGNvbnRleHQ7DQotDQotICAgIHB1YmxpYyBKQVhCRGF0YVNvdXJjZShPYmplY3QgamF4YiwgSkFYQkRTQ29udGV4dCBjb250ZXh0KSB7DQotICAgICAgICBzdXBlcigpOw0KLSAgICAgICAgdGhpcy5qYXhiID0gamF4YjsNCi0gICAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7DQotICAgICAgICANCi0gICAgICAgIC8vIEN1cnJlbnRseSB3ZSBjYW5ub3QgY29udHJvbCBob3cgdGhlIHVubWFyc2hhbGxlciB3aWxsIGVtaXQgdGhlIHByZWZpeA0KLSAgICAgICAgLy8gU28gaWYgdGhlIHZhbHVlIG9mIHRoZSBwcmVmaXggaXMgbmVlZGVkLCBmdWxsIGV4cGFuc2lvbiBpcyBuZWNlc3NhcnkuDQotICAgICAgICBzZXRQcm9wZXJ0eShPTURhdGFTb3VyY2VFeHQuTE9TU1lfUFJFRklYLCBCb29sZWFuLlRSVUUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgew0KLSAgICB9DQotDQotICAgIHB1YmxpYyBPTURhdGFTb3VyY2VFeHQgY29weSgpIHsNCi0gICAgICAgIHJldHVybiBuZXcgSkFYQkRhdGFTb3VyY2UoamF4YiwgY29udGV4dCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE9iamVjdCBnZXRPYmplY3QoKSB7DQotICAgICAgICByZXR1cm4gamF4YjsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIEpBWEJEU0NvbnRleHQgZ2V0Q29udGV4dCgpIHsNCi0gICAgICAgIHJldHVybiBjb250ZXh0Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBYTUxTdHJlYW1SZWFkZXIgZ2V0UmVhZGVyKCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7DQotDQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIFN0cmluZyBlbmNvZGluZyA9ICJ1dGYtOCI7DQotICAgICAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oZ2V0WE1MQnl0ZXMoZW5jb2RpbmcpKTsNCi0gICAgICAgICAgICByZXR1cm4gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihpcywgZW5jb2RpbmcpOw0KLSAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IFhNTFN0cmVhbUV4Y2VwdGlvbihlKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoT3V0cHV0U3RyZWFtIG91dHB1dCwgT01PdXRwdXRGb3JtYXQgZm9ybWF0KSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsNCi0gICAgICAgIE1UT01YTUxTdHJlYW1Xcml0ZXIgd3JpdGVyID0gbmV3IE1UT01YTUxTdHJlYW1Xcml0ZXIob3V0cHV0LCBmb3JtYXQpOw0KLSAgICAgICAgc2VyaWFsaXplKHdyaXRlcik7DQotICAgICAgICB3cml0ZXIuZmx1c2goKTsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgd3JpdGVyLmNsb3NlKCk7DQotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIC8vIEFuIGV4Y2VwdGlvbiBjYW4gb2NjdXIgaWYgbm90aGluZyBpcyB3cml0dGVuIHRvIHRoZSANCi0gICAgICAgICAgICAvLyB3cml0ZXIuICBUaGlzIGlzIHBvc3NpYmxlIGlmIHRoZSB1bmRlcmx5aW5nIGRhdGEgc291cmNlDQotICAgICAgICAgICAgLy8gd3JpdGVycyB0byB0aGUgb3V0cHV0IHN0cmVhbSBkaXJlY3RseS4NCi0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJDYXRjaGluZyBhbmQgc3dhbGxvd2luZyBleGNlcHRpb24gIiArIGUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoV3JpdGVyIHdyaXRlclRhcmdldCwgT01PdXRwdXRGb3JtYXQgZm9ybWF0KSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsNCi0gICAgICAgIE1UT01YTUxTdHJlYW1Xcml0ZXIgd3JpdGVyID0NCi0gICAgICAgICAgICBuZXcgTVRPTVhNTFN0cmVhbVdyaXRlcihTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtV3JpdGVyKHdyaXRlclRhcmdldCkpOw0KLSAgICAgICAgd3JpdGVyLnNldE91dHB1dEZvcm1hdChmb3JtYXQpOw0KLSAgICAgICAgc2VyaWFsaXplKHdyaXRlcik7DQotICAgICAgICB3cml0ZXIuZmx1c2goKTsNCi0gICAgICAgIHdyaXRlci5jbG9zZSgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgY29udGV4dC5tYXJzaGFsKGpheGIsIHhtbFdyaXRlcik7DQotICAgICAgICB9IGNhdGNoIChKQVhCRXhjZXB0aW9uIGplKSB7DQotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkpBWEJDb250ZXh0IGZvciBtYXJzaGFsIGZhaWx1cmU6IiArIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0SkFYQkNvbnRleHQoY29udGV4dC5nZXRDbGFzc0xvYWRlcigpKSk7DQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgdGhyb3cgbmV3IFhNTFN0cmVhbUV4Y2VwdGlvbihqZSk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyBieXRlW10gZ2V0WE1MQnl0ZXMoU3RyaW5nIGVuY29kaW5nKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOw0KLQ0KLSAgICAgICAgICAgIC8vIEV4cG9zZXMgZ2V0T3V0cHV0U3RyZWFtLCB3aGljaCBhbGxvd3MgZmFzdGVyIHdyaXRlcy4NCi0gICAgICAgICAgICBYTUxTdHJlYW1Xcml0ZXJXaXRoT1Mgd3JpdGVyID0gbmV3IFhNTFN0cmVhbVdyaXRlcldpdGhPUyhiYW9zLCBlbmNvZGluZyk7DQotDQotICAgICAgICAgICAgLy8gV3JpdGUgdGhlIGJ1c2luZXNzIG9iamVjdCB0byB0aGUgd3JpdGVyDQotICAgICAgICAgICAgc2VyaWFsaXplKHdyaXRlcik7DQotDQotICAgICAgICAgICAgLy8gRmx1c2ggdGhlIHdyaXRlcg0KLSAgICAgICAgICAgIHdyaXRlci5mbHVzaCgpOw0KLSAgICAgICAgICAgIHdyaXRlci5jbG9zZSgpOw0KLSAgICAgICAgICAgIHJldHVybiBiYW9zLnRvQnl0ZUFycmF5KCk7DQotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBPTUV4Y2VwdGlvbihlKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0Rlc3RydWN0aXZlUmVhZCgpIHsNCi0gICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0Rlc3RydWN0aXZlV3JpdGUoKSB7DQotICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgIH0NCi0gICAgDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFzb3VyY2UvamF4Yi9KQVhCWE1MU3RyZWFtV3JpdGVyRmlsdGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhc291cmNlL2pheGIvSkFYQlhNTFN0cmVhbVdyaXRlckZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmRkNmQyLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFzb3VyY2UvamF4Yi9KQVhCWE1MU3RyZWFtV3JpdGVyRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFzb3VyY2UuamF4YjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MudXRpbGl0eS5KYXZhVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLk5hbWVzcGFjZUNvbnRleHQ7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXI7Ci0KLS8qKgotICogT24gc29tZSBvY2Nhc2lvbnMsIEpBWEIgd3JpdGVzIG91dCBpbmNvcnJlY3QgeG1sbnMgYW5kIG5hbWVzcGFjZSBpbmZvcm1hdGlvbi4gVGhpcyBmaWx0ZXIgaXMKLSAqIHVzZWZ1bCBmb3IgbG9nZ2luZyBhbmQgY29ycmVjdGluZyB0aGVzZSBraW5kcyBvZiBwcm9ibGVtcy4KLSAqLwotY2xhc3MgSkFYQlhNTFN0cmVhbVdyaXRlckZpbHRlciBpbXBsZW1lbnRzIFhNTFN0cmVhbVdyaXRlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEpBWEJYTUxTdHJlYW1Xcml0ZXJGaWx0ZXIuY2xhc3MpOwotCi0gICAgWE1MU3RyZWFtV3JpdGVyIGRlbGVnYXRlOwotICAgIGludCBudW1FbGVtZW50cyA9IDA7Ci0gICAgaW50IG51bURlZmF1bHROUyA9IDA7Ci0KLSAgICBwdWJsaWMgSkFYQlhNTFN0cmVhbVdyaXRlckZpbHRlcihYTUxTdHJlYW1Xcml0ZXIgZGVsZWdhdGUpIHsKLSAgICAgICAgdGhpcy5kZWxlZ2F0ZSA9IGRlbGVnYXRlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIGRlbGVnYXRlLmNsb3NlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZmx1c2goKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgZGVsZWdhdGUuZmx1c2goKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTmFtZXNwYWNlQ29udGV4dCBnZXROYW1lc3BhY2VDb250ZXh0KCkgewotICAgICAgICByZXR1cm4gZGVsZWdhdGUuZ2V0TmFtZXNwYWNlQ29udGV4dCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KFN0cmluZyBhcmcwKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldFByZWZpeChhcmcwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBhcmcwKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldFByb3BlcnR5KGFyZzApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHROYW1lc3BhY2UoU3RyaW5nIG5hbWVzcGFjZVVSSSkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChudW1FbGVtZW50cyA9PSAxKSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIiAgZGVmYXVsdCBuYW1lc3BhY2VVUkk9IiArIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBudW1EZWZhdWx0TlMrKzsKLSAgICAgICAgICAgIGlmIChudW1EZWZhdWx0TlMgPiAxKSB7Ci0gICAgICAgICAgICAgICAgLy8gU29tZXRpbWVzIEpBWEIgd3JpdGVzIG91dCB0aGUgZGVmYXVsdCBuYW1lc3BhY2UgdHdpY2UKLSAgICAgICAgICAgICAgICAvLyBUaGlzIHNlZW1zIHRvIGJlIHJlbGF0ZWQgdG8gd3JpdGluZyBvdXQgeG1sbnMuLi5zZWUgYmVsb3cKLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgICAgV0hZIElTIFRIRSBERUZBVUxUIE5BTUVTUEFDRSBXUklUVEVOIFRXSUNFPyIpOwotICAgICAgICAgICAgICAgICAgICBsb2cudHJhY2UoSmF2YVV0aWxzLnN0YWNrVG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBkZWxlZ2F0ZS5zZXREZWZhdWx0TmFtZXNwYWNlKG5hbWVzcGFjZVVSSSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZXNwYWNlQ29udGV4dChOYW1lc3BhY2VDb250ZXh0IGFyZzApIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBkZWxlZ2F0ZS5zZXROYW1lc3BhY2VDb250ZXh0KGFyZzApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFByZWZpeChTdHJpbmcgYXJnMCwgU3RyaW5nIGFyZzEpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBkZWxlZ2F0ZS5zZXRQcmVmaXgoYXJnMCwgYXJnMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGVBdHRyaWJ1dGUoU3RyaW5nIHByZWZpeCwgU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHZhbHVlKQotICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChudW1FbGVtZW50cyA9PSAxKSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIiAgcHJlZml4PSIgKyBwcmVmaXggKyAiIG5hbWVzcGFjZT0iICsgbmFtZXNwYWNlVVJJICsgIiBsb2NhbE5hbWU9IiArCi0gICAgICAgICAgICAgICAgICAgICAgICBsb2NhbE5hbWUgKyAiIHZhbHVlPSIgKyB2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZGVsZWdhdGUud3JpdGVBdHRyaWJ1dGUocHJlZml4LCBuYW1lc3BhY2VVUkksIGxvY2FsTmFtZSwgdmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlQXR0cmlidXRlKFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyB2YWx1ZSkKLSAgICAgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBpZiAobnVtRWxlbWVudHMgPT0gMSkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgIG5hbWVzcGFjZT0iICsgbmFtZXNwYWNlVVJJICsgIiBsb2NhbE5hbWU9IiArIGxvY2FsTmFtZSArICIgdmFsdWU9IiArCi0gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZGVsZWdhdGUud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlVVJJLCBsb2NhbE5hbWUsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUF0dHJpYnV0ZShTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgdmFsdWUpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBpZiAobnVtRWxlbWVudHMgPT0gMSkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgIGxvY2FsTmFtZT0iICsgbG9jYWxOYW1lICsgIiB2YWx1ZT0iICsgdmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGRlbGVnYXRlLndyaXRlQXR0cmlidXRlKGxvY2FsTmFtZSwgdmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlQ0RhdGEoU3RyaW5nIGFyZzApIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBkZWxlZ2F0ZS53cml0ZUNEYXRhKGFyZzApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlQ2hhcmFjdGVycyhjaGFyW10gYXJnMCwgaW50IGFyZzEsIGludCBhcmcyKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgZGVsZWdhdGUud3JpdGVDaGFyYWN0ZXJzKGFyZzAsIGFyZzEsIGFyZzIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlQ2hhcmFjdGVycyhTdHJpbmcgYXJnMCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIGRlbGVnYXRlLndyaXRlQ2hhcmFjdGVycyhhcmcwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUNvbW1lbnQoU3RyaW5nIGFyZzApIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBkZWxlZ2F0ZS53cml0ZUNvbW1lbnQoYXJnMCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGVEZWZhdWx0TmFtZXNwYWNlKFN0cmluZyBhcmcwKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgZGVsZWdhdGUud3JpdGVEZWZhdWx0TmFtZXNwYWNlKGFyZzApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlRFREKFN0cmluZyBhcmcwKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgZGVsZWdhdGUud3JpdGVEVEQoYXJnMCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGVFbXB0eUVsZW1lbnQoU3RyaW5nIGFyZzAsIFN0cmluZyBhcmcxLCBTdHJpbmcgYXJnMikgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIGRlbGVnYXRlLndyaXRlRW1wdHlFbGVtZW50KGFyZzAsIGFyZzEsIGFyZzIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlRW1wdHlFbGVtZW50KFN0cmluZyBhcmcwLCBTdHJpbmcgYXJnMSkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIGRlbGVnYXRlLndyaXRlRW1wdHlFbGVtZW50KGFyZzAsIGFyZzEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlRW1wdHlFbGVtZW50KFN0cmluZyBhcmcwKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgZGVsZWdhdGUud3JpdGVFbXB0eUVsZW1lbnQoYXJnMCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGVFbmREb2N1bWVudCgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBkZWxlZ2F0ZS53cml0ZUVuZERvY3VtZW50KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGVFbmRFbGVtZW50KCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIGRlbGVnYXRlLndyaXRlRW5kRWxlbWVudCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlRW50aXR5UmVmKFN0cmluZyBhcmcwKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgZGVsZWdhdGUud3JpdGVFbnRpdHlSZWYoYXJnMCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGVOYW1lc3BhY2UoU3RyaW5nIHByZWZpeCwgU3RyaW5nIG5hbWVzcGFjZVVSSSkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChudW1FbGVtZW50cyA9PSAxKSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIiAgcHJlZml4PSIgKyBwcmVmaXggKyAiIG5hbWVzcGFjZVVSST0iICsgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICgieG1sbnMiLmVxdWFscyhwcmVmaXgpKSB7Ci0gICAgICAgICAgICAgICAgLy8gU29tZXRpbWVzIEpBWEIgd3JpdGVzIG91dCB0aGUgWE1MTlMgYXR0cmlidXRlLi4ubmVlZCB0byBmaW5kIG91dCB3aHkKLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgICAgSU5WQUxJRCBYTUxOUyBhdHRyaWJ1dGUgaXMgcmVtb3ZlZCBwcmVmaXg9Iik7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy50cmFjZShKYXZhVXRpbHMuc3RhY2tUb1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZGVsZWdhdGUud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlUHJvY2Vzc2luZ0luc3RydWN0aW9uKFN0cmluZyBhcmcwLCBTdHJpbmcgYXJnMSkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIGRlbGVnYXRlLndyaXRlUHJvY2Vzc2luZ0luc3RydWN0aW9uKGFyZzAsIGFyZzEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlUHJvY2Vzc2luZ0luc3RydWN0aW9uKFN0cmluZyBhcmcwKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgZGVsZWdhdGUud3JpdGVQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oYXJnMCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGVTdGFydERvY3VtZW50KCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIGRlbGVnYXRlLndyaXRlU3RhcnREb2N1bWVudCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlU3RhcnREb2N1bWVudChTdHJpbmcgYXJnMCwgU3RyaW5nIGFyZzEpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBkZWxlZ2F0ZS53cml0ZVN0YXJ0RG9jdW1lbnQoYXJnMCwgYXJnMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGVTdGFydERvY3VtZW50KFN0cmluZyBhcmcwKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgZGVsZWdhdGUud3JpdGVTdGFydERvY3VtZW50KGFyZzApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlU3RhcnRFbGVtZW50KFN0cmluZyBwcmVmaXgsIFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBsb2NhbE5hbWUpCi0gICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgbnVtRWxlbWVudHMrKzsKLSAgICAgICAgaWYgKG51bUVsZW1lbnRzID09IDEpIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiICBwcmVmaXg9IiArIHByZWZpeCArICIgbmFtZXNwYWNlPSIgKyBuYW1lc3BhY2VVUkkgKyAiIGxvY2FsTmFtZT0iICsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsTmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZGVsZWdhdGUud3JpdGVTdGFydEVsZW1lbnQocHJlZml4LCBuYW1lc3BhY2VVUkksIGxvY2FsTmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGVTdGFydEVsZW1lbnQoU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIGxvY2FsTmFtZSkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIG51bUVsZW1lbnRzKys7Ci0gICAgICAgIGlmIChudW1FbGVtZW50cyA9PSAxKSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIiAgbmFtZXNwYWNlPSIgKyBuYW1lc3BhY2VVUkkgKyAiIGxvY2FsTmFtZT0iICsgbG9jYWxOYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBkZWxlZ2F0ZS53cml0ZVN0YXJ0RWxlbWVudChuYW1lc3BhY2VVUkksIGxvY2FsTmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGVTdGFydEVsZW1lbnQoU3RyaW5nIGxvY2FsTmFtZSkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIG51bUVsZW1lbnRzKys7Ci0gICAgICAgIGlmIChudW1FbGVtZW50cyA9PSAxKSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIiAgbG9jYWxOYW1lPSIgKyBsb2NhbE5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGRlbGVnYXRlLndyaXRlU3RhcnRFbGVtZW50KGxvY2FsTmFtZSk7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFzb3VyY2UvamF4Yi9YU0RMaXN0VXRpbHMuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFzb3VyY2UvamF4Yi9YU0RMaXN0VXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJkZjdmZi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhc291cmNlL2pheGIvWFNETGlzdFV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFzb3VyY2UuamF4YjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaTE4bi5NZXNzYWdlczsKLQotaW1wb3J0IGphdmF4LnhtbC5kYXRhdHlwZS5EYXRhdHlwZUNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLmRhdGF0eXBlLlhNTEdyZWdvcmlhbkNhbGVuZGFyOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQXJyYXk7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS50ZXh0LlBhcnNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci1pbXBvcnQgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLS8qKiBVdGlsaXRpZXMgdG8gY29udmVydCB0by9mcm9tIHhzZDpsaXN0IFN0cmluZyB0byBPYmplY3RbXS9MaXN0IHZhbHVlcy4gKi8KLXB1YmxpYyBjbGFzcyBYU0RMaXN0VXRpbHMgewotICAgIC8qKiBDb25zdHJ1Y3RvciBpcyBpbnRlbnRpb25hbGx5IHByaXZhdGUgKi8KLSAgICBwcml2YXRlIFhTRExpc3RVdGlscygpIHsKLSAgICB9Ci0KLSAgICAvLyAgRXhhbXBsZToKLSAgICAvLyA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iTG9uZ0xpc3QiPgotICAgIC8vICAgPHhzZDpsaXN0PgotICAgIC8vICAgICA8eHNkOnNpbXBsZVR5cGU+Ci0gICAgLy8gICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dW5zaWduZWRJbnQiLz4KLSAgICAvLyAgICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICAvLyAgIDwveHNkOmxpc3Q+Ci0gICAgLy8gPC94c2Q6c2ltcGxlVHlwZT4KLSAgICAvLyA8ZWxlbWVudCBuYW1lPSJteUxvbmciIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJpbXBsOkxvbmdMaXN0Ii8+Ci0gICAgLy8KLSAgICAvLyBMb25nTGlzdCB3aWxsIGJlIHJlcHJlc2VudGVkIGFzIGFuIGludFtdCi0gICAgLy8gT24gdGhlIHdpcmUgbXlMb25nIHdpbGwgYmUgcmVwcmVzZW50ZWQgYXMgYSBsaXN0IG9mIGludGVnZXJzCi0gICAgLy8gd2l0aCBpbnRlcnZlbmluZyB3aGl0ZXNwYWNlCi0gICAgLy8gICA8bXlMb25nPjEgMiAzPC9teUxvbmc+Ci0gICAgLy8KLSAgICAvLyBVbmZvcnR1bmF0ZWx5LCBzb21ldGltZXMgd2Ugd2FudCB0byBtYXJzaGFsIGJ5IHR5cGUuICBUaGVyZWZvcmUKLSAgICAvLyB3ZSB3YW50IHRvIG1hcnNoYWwgYW4gZWxlbWVudCAoZm9vKSB0aGF0IGlzIHVua25vd24gdG8gc2NoZW1hLgotICAgIC8vIElmIHdlIHVzZSB0aGUgbm9ybWFsIG1hcnNoYWwgY29kZSwgdGhlIHdpcmUgd2lsbCBsb29rIGxpa2UKLSAgICAvLyB0aGlzICh3aGljaCBpcyBpbmNvcnJlY3QpOgotICAgIC8vICA8Zm9vPjxpdGVtPjE8L2l0ZW0+PGl0ZW0+MjwvaXRlbT48aXRlbT4zPC9pdGVtPjwvZm9vPgotICAgIC8vCi0gICAgLy8gVGhlIHNvbHV0aW9uIGlzIHRvIGRldGVjdCB0aGlzIHNpdHVhdGlvbiBhbmQgbWFyc2hhbCB0aGUgCi0gICAgLy8gU3RyaW5nIGluc3RlYWQuICBUaGVuIHdlIGdldCB0aGUgY29ycmVjdCB3aXJlIGZvcm1hdDoKLSAgICAvLyA8Zm9vPjEgMiAzPC9mb28+Ci0gICAgLy8gCi0gICAgLy8gVGhpcyB1dGlsaXR5IGNvbnRhaW5zIGNvZGUgdG8gY29udmVydCBmcm9tIEFycmF5L0xpc3QgLT4gU3RyaW5nCi0gICAgLy8gYW5kIGZyb20gU3RyaW5nIC0+IEFycmF5L0xpc3QKLQotICAgIC8qKgotICAgICAqIENvbnZlcnQgdG8gU3RyaW5nIHRoYXQgY2FuIGJlIHVzZWQgYXMgYW4geHNkOmxpc3QgY29udGVudAotICAgICAqCi0gICAgICogQHBhcmFtIGNvbnRhaW5lciBPYmplY3QKLSAgICAgKiBAcmV0dXJuIHhzZDpsaXN0IFN0cmluZwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvWFNETGlzdFN0cmluZyhPYmplY3QgY29udGFpbmVyKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uLAotICAgICAgICAgICAgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCBJbnN0YW50aWF0aW9uRXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLAotICAgICAgICAgICAgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFRPRE8gb25seSBzdXBwb3J0cyBhcnJheXMgcmlnaHQgbm93LiAgTmVlZCB0byBpbXBsZW1lbnQgdGhpcyBmb3IgTGlzdAotICAgIAlpZiAoY29udGFpbmVyICE9bnVsbCAmJiBjb250YWluZXIuZ2V0Q2xhc3MoKS5pc0FycmF5KCkpIHsKLSAgICAgICAgICAgIFN0cmluZyB4c2RTdHJpbmcgPSAiIjsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQXJyYXkuZ2V0TGVuZ3RoKGNvbnRhaW5lcik7IGkrKykgewotICAgICAgICAgICAgICAgIE9iamVjdCBjb21wb25lbnQgPSBBcnJheS5nZXQoY29udGFpbmVyLCBpKTsKLSAgICAgICAgICAgICAgICBpZiAoeHNkU3RyaW5nLmxlbmd0aCgpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgeHNkU3RyaW5nICs9ICIgIjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgeHNkU3RyaW5nICs9IGdldEFzVGV4dChjb21wb25lbnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHhzZFN0cmluZzsKLSAgICAgICAgICAgIAotICAgICAgICB9IGVsc2UgaWYoY29udGFpbmVyIT1udWxsICYmIExpc3QuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShjb250YWluZXIuZ2V0Q2xhc3MoKSkpewotICAgICAgICAgICAgU3RyaW5nIHhzZFN0cmluZyA9ICIiOwotICAgICAgICAgICAgTGlzdCBjb250YWluZXJBc0xpc3QgPSAoTGlzdCljb250YWluZXI7Ci0gICAgICAgICAgICBmb3IgKE9iamVjdCBjb21wb25lbnQ6Y29udGFpbmVyQXNMaXN0KSB7Ci0gICAgICAgICAgICAgICAgaWYgKHhzZFN0cmluZy5sZW5ndGgoKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHhzZFN0cmluZyArPSAiICI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHhzZFN0cmluZyArPSBnZXRBc1RleHQoY29tcG9uZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB4c2RTdHJpbmc7Ci0gICAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oY29udGFpbmVyLmdldENsYXNzKCkudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0IGZyb20geHNkTGlzdFN0cmluZyB0byBhbiBhcnJheS9saXN0Ci0gICAgICoKLSAgICAgKiBAcGFyYW0geHNkTGlzdFN0cmluZwotICAgICAqIEBwYXJhbSB0eXBlICAgICAgICAgIENsYXNzIG9mIHJldHVybgotICAgICAqIEByZXR1cm4gQXJyYXkgb3IgTGlzdAotICAgICAqIEB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBmcm9tWFNETGlzdFN0cmluZyhTdHJpbmcgeHNkTGlzdFN0cmluZywgQ2xhc3MgdHlwZSkgdGhyb3dzCi0gICAgICAgICAgICBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwKLSAgICAgICAgICAgIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIFBhcnNlRXhjZXB0aW9uLAotICAgICAgICAgICAgRGF0YXR5cGVDb25maWd1cmF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gVE9ETyBvbmx5IHN1cHBvcnRzIGFycmF5cyByaWdodCBub3cuICBOZWVkIHRvIGltcGxlbWVudCB0aGlzIGZvciBMaXN0Ci0gICAgICAgIGlmICh0eXBlLmlzQXJyYXkoKSkgewotICAgICAgICAgICAgQ2xhc3MgY29tcG9uZW50VHlwZSA9IHR5cGUuZ2V0Q29tcG9uZW50VHlwZSgpOwotICAgICAgICAgICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgICAgICAgICAvLyBQYXJzZSB0aGUgdG9rZW5zIGJhc2VkIG9uIHdoaXRlc3BhY2UKLSAgICAgICAgICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoeHNkTGlzdFN0cmluZyk7Ci0gICAgICAgICAgICB3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHRleHQgPSBzdC5uZXh0VG9rZW4oKTsKLSAgICAgICAgICAgICAgICBPYmplY3QgY29tcG9uZW50T2JqZWN0ID0gZ2V0RnJvbVRleHQodGV4dCwgY29tcG9uZW50VHlwZSk7Ci0gICAgICAgICAgICAgICAgbGlzdC5hZGQoY29tcG9uZW50T2JqZWN0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENsYXNzIGFycmF5VHlwZSA9IGNvbXBvbmVudFR5cGU7Ci0gICAgICAgICAgICBpZiAoY29tcG9uZW50VHlwZS5pc1ByaW1pdGl2ZSgpKSB7Ci0gICAgICAgICAgICAgICAgQ2xhc3MgYm94ZWRUeXBlID0gZ2V0Qm94ZWRUeXBlKGNvbXBvbmVudFR5cGUpOwotICAgICAgICAgICAgICAgIGlmIChib3hlZFR5cGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhcnJheVR5cGUgPSBib3hlZFR5cGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgT2JqZWN0IGFycmF5ID0gQXJyYXkubmV3SW5zdGFuY2UoYXJyYXlUeXBlLCBsaXN0LnNpemUoKSk7Ci0gICAgICAgICAgICByZXR1cm4gbGlzdC50b0FycmF5KChPYmplY3RbXSlhcnJheSk7Ci0gICAgICAgIH1lbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24odHlwZS50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGZyb21TdHJpbmdBcnJheShTdHJpbmdbXSBpdGVtcywgQ2xhc3MgdHlwZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICh0eXBlLmlzQXJyYXkoKSkgewotICAgICAgICAgICAgQ2xhc3MgY29tcG9uZW50VHlwZSA9IHR5cGUuZ2V0Q29tcG9uZW50VHlwZSgpOwotICAgICAgICAgICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgICAgICAgICBmb3IgKFN0cmluZyBpdGVtIDogaXRlbXMpIHsKLSAgICAgICAgICAgICAgICBPYmplY3QgY29tcG9uZW50T2JqZWN0ID0gZ2V0RnJvbVRleHQoaXRlbSwgY29tcG9uZW50VHlwZSk7ICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGxpc3QuYWRkKGNvbXBvbmVudE9iamVjdCk7Ci0gICAgICAgICAgICB9Ci0gICAgCi0gICAgICAgICAgICBDbGFzcyBhcnJheVR5cGUgPSBjb21wb25lbnRUeXBlOwotICAgICAgICAgICAgaWYgKGNvbXBvbmVudFR5cGUuaXNQcmltaXRpdmUoKSkgewotICAgICAgICAgICAgICAgIENsYXNzIGJveGVkVHlwZSA9IGdldEJveGVkVHlwZShjb21wb25lbnRUeXBlKTsKLSAgICAgICAgICAgICAgICBpZiAoYm94ZWRUeXBlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYXJyYXlUeXBlID0gYm94ZWRUeXBlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgT2JqZWN0IGFycmF5ID0gQXJyYXkubmV3SW5zdGFuY2UoYXJyYXlUeXBlLCBsaXN0LnNpemUoKSk7Ci0gICAgICAgICAgICByZXR1cm4gbGlzdC50b0FycmF5KChPYmplY3RbXSlhcnJheSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKHR5cGUudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmdbXSB0b1N0cmluZ0FycmFheShPYmplY3QgY29udGFpbmVyKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGNvbnRhaW5lciAhPSBudWxsICYmIGNvbnRhaW5lci5nZXRDbGFzcygpLmlzQXJyYXkoKSkgewotICAgICAgICAgICAgaW50IHNpemUgPSBBcnJheS5nZXRMZW5ndGgoY29udGFpbmVyKTsgICAgICAgIAotICAgICAgICAgICAgU3RyaW5nIFtdIHN0ckFycmF5ID0gbmV3IFN0cmluZ1tzaXplXTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IGNvbXBvbmVudCA9IEFycmF5LmdldChjb250YWluZXIsIGkpOwotICAgICAgICAgICAgICAgIHN0ckFycmF5W2ldID0gZ2V0QXNUZXh0KGNvbXBvbmVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gc3RyQXJyYXk7ICAgIAotICAgICAgICB9IGVsc2UgaWYoY29udGFpbmVyICE9IG51bGwgJiYgTGlzdC5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGNvbnRhaW5lci5nZXRDbGFzcygpKSl7ICAgCi0gICAgICAgICAgICBMaXN0IGNvbnRhaW5lckFzTGlzdCA9IChMaXN0KWNvbnRhaW5lcjsKLSAgICAgICAgICAgIGludCBzaXplID0gY29udGFpbmVyQXNMaXN0LnNpemUoKTsKLSAgICAgICAgICAgIFN0cmluZyBbXSBzdHJBcnJheSA9IG5ldyBTdHJpbmdbc2l6ZV07Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgICAgICAgIHN0ckFycmF5W2ldID0gZ2V0QXNUZXh0KGNvbnRhaW5lckFzTGlzdC5nZXQoaSkpOwotICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiBzdHJBcnJheTsgICAgCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGNvbnRhaW5lci5nZXRDbGFzcygpLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEBwYXJhbSBvYmoKLSAgICAgKiBAcmV0dXJuIHhtbCB0ZXh0IGZvciB0aGlzIG9iamVjdAotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRBc1RleHQoT2JqZWN0IG9iaikgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiwKLSAgICAgICAgICAgIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwKLSAgICAgICAgICAgIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotICAgICAgICAvLyBUT0RPIE5lZWQgdG8gdXBncmFkZSB0byBoYW5kbGUgbW9yZSBjb21wbGljYXRlZCBvYmplY3RzIGxpa2UgY2FsZW5kYXIgYW5kIHFuYW1lCi0gICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBRTmFtZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoIlhTRExpc3ROb3RTdXBwb3J0ZWQiLCBRTmFtZS5jbGFzcy5nZXROYW1lKCkpKTsKLSAgICAgICAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBYTUxHcmVnb3JpYW5DYWxlbmRhcikgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiWFNETGlzdE5vdFN1cHBvcnRlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTEdyZWdvcmlhbkNhbGVuZGFyLmNsYXNzLmdldE5hbWUoKSkpOwotICAgICAgICB9IGVsc2UgaWYgKG9iai5nZXRDbGFzcygpLmlzRW51bSgpKSB7Ci0gICAgICAgICAgICAvLyBUT0RPIE1ldGhvZCBzaG91bGQgYmUgY2FjaGVkIGZvciBwZXJmb3JtYW5jZQotICAgICAgICAgICAgTWV0aG9kIG1ldGhvZCA9Ci0gICAgICAgICAgICAgICAgICAgIG9iai5nZXRDbGFzcygpLmdldERlY2xhcmVkTWV0aG9kKCJ2YWx1ZSIsIG5ldyBDbGFzc1tdIHsgfSk7Ci0gICAgICAgICAgICByZXR1cm4gKFN0cmluZyltZXRob2QuaW52b2tlKG9iaiwgbmV3IE9iamVjdFtdIHsgfSk7Ci0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gb2JqLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHZhbHVlCi0gICAgICogQHBhcmFtIGNvbXBvbmVudFR5cGUKLSAgICAgKiBAcmV0dXJuIE9iamVjdCBjb25zdHJ1Y3RlZCBmcm9tIHRoZSBzcGVjaWZpZWQgeG1sIHRleHQgKHZhbHVlKQotICAgICAqIEB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBPYmplY3QgZ2V0RnJvbVRleHQoU3RyaW5nIHZhbHVlLCBDbGFzcyBjb21wb25lbnRUeXBlKSB0aHJvd3MKLSAgICAgICAgICAgIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCBJbnN0YW50aWF0aW9uRXhjZXB0aW9uLAotICAgICAgICAgICAgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgUGFyc2VFeGNlcHRpb24sCi0gICAgICAgICAgICBEYXRhdHlwZUNvbmZpZ3VyYXRpb25FeGNlcHRpb24gewotICAgICAgICAvLyBUT0RPIFRoaXMgbmVlZHMgdG8gYmUgdXBncmFkZWQgdG8gaGFuZGxlIG1vcmUgY29tcGxpY2F0ZWQgb2JqZWN0cyAoZW51bSwgY2FsZW5kYXIsIHByaW1pdGl2ZSwgZXRjLikKLSAgICAgICAgaWYgKGNvbXBvbmVudFR5cGUgPT0gU3RyaW5nLmNsYXNzKSB7Ci0gICAgICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNvbXBvbmVudFR5cGUuaXNFbnVtKCkpIHsKLSAgICAgICAgICAgIC8vIElmIHlvdSBnZXQgYW4gZXhjZXB0aW9uIGhlcmUsIGNvbnNpZGVyIGFkZGluZyB0aGUgY29kZSB0byBjb252ZXJ0IHRoZSBTdHJpbmcgdmFsdWUgdG8gdGhlIHJlcXVpcmVkIGNvbXBvbmVudCBvYmplY3QKLSAgICAgICAgICAgIC8vIERlZmF1bHQ6IENhbGwgdGhlIGNvbnN0cnVjdG9yCi0gICAgICAgICAgICAvLyBUT0RPIE1ldGhvZCBzaG91bGQgYmUgY2FjaGVkIGZvciBwZXJmb3JtYW5jZQotICAgICAgICAgICAgTWV0aG9kIG1ldGhvZCA9Ci0gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudFR5cGUuZ2V0RGVjbGFyZWRNZXRob2QoImZyb21WYWx1ZSIsIG5ldyBDbGFzc1tdIHsgU3RyaW5nLmNsYXNzIH0pOwotICAgICAgICAgICAgT2JqZWN0IG9iaiA9IG1ldGhvZC5pbnZva2UobnVsbCwgbmV3IE9iamVjdFtdIHsgdmFsdWUgfSk7Ci0gICAgICAgICAgICByZXR1cm4gb2JqOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNvbXBvbmVudFR5cGUgPT0gYnl0ZS5jbGFzcykgewotICAgICAgICAgICAgY29tcG9uZW50VHlwZSA9IEJ5dGUuY2xhc3M7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNvbXBvbmVudFR5cGUgPT0gc2hvcnQuY2xhc3MpIHsKLSAgICAgICAgICAgIGNvbXBvbmVudFR5cGUgPSBTaG9ydC5jbGFzczsKLSAgICAgICAgfQotICAgICAgICBpZiAoY29tcG9uZW50VHlwZSA9PSBpbnQuY2xhc3MpIHsKLSAgICAgICAgICAgIGNvbXBvbmVudFR5cGUgPSBJbnRlZ2VyLmNsYXNzOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjb21wb25lbnRUeXBlID09IGZsb2F0LmNsYXNzKSB7Ci0gICAgICAgICAgICBjb21wb25lbnRUeXBlID0gRmxvYXQuY2xhc3M7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNvbXBvbmVudFR5cGUgPT0gZG91YmxlLmNsYXNzKSB7Ci0gICAgICAgICAgICBjb21wb25lbnRUeXBlID0gRG91YmxlLmNsYXNzOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjb21wb25lbnRUeXBlID09IGNoYXIuY2xhc3MpIHsKLSAgICAgICAgICAgIENoYXJhY3RlciBjaCA9IG51bGw7Ci0gICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBjaCA9IENoYXJhY3Rlci52YWx1ZU9mKHZhbHVlLmNoYXJBdCgwKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gY2g7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNvbXBvbmVudFR5cGUgPT0gYm9vbGVhbi5jbGFzcykgewotICAgICAgICAgICAgY29tcG9uZW50VHlwZSA9IEJvb2xlYW4uY2xhc3M7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY29tcG9uZW50VHlwZS5lcXVhbHMoUU5hbWUuY2xhc3MpKSB7Ci0gICAgICAgICAgICAvLyBUT0RPIE1pc3NpbmcgU3VwcG9ydAotCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRNZXNzYWdlKCJYU0RMaXN0Tm90U3VwcG9ydGVkIiwgY29tcG9uZW50VHlwZS5nZXROYW1lKCkpKTsKLSAgICAgICAgfSBlbHNlIGlmIChjb21wb25lbnRUeXBlLmVxdWFscyhYTUxHcmVnb3JpYW5DYWxlbmRhci5jbGFzcykpIHsKLSAgICAgICAgICAgIC8vIFRPRE8gTWlzc2luZyBTdXBwb3J0Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRNZXNzYWdlKCJYU0RMaXN0Tm90U3VwcG9ydGVkIiwgY29tcG9uZW50VHlwZS5nZXROYW1lKCkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIElmIHlvdSBnZXQgYW4gZXhjZXB0aW9uIGhlcmUsIGNvbnNpZGVyIGFkZGluZyB0aGUgY29kZSB0byBjb252ZXJ0IHRoZSBTdHJpbmcgdmFsdWUgdG8gdGhlIHJlcXVpcmVkIGNvbXBvbmVudCBvYmplY3QKLSAgICAgICAgLy8gRGVmYXVsdDogQ2FsbCB0aGUgY29uc3RydWN0b3IKLSAgICAgICAgQ29uc3RydWN0b3IgY29uc3RydWN0b3IgPSBjb21wb25lbnRUeXBlLmdldENvbnN0cnVjdG9yKG5ldyBDbGFzc1tdIHsgU3RyaW5nLmNsYXNzIH0pOwotICAgICAgICBPYmplY3Qgb2JqID0gY29uc3RydWN0b3IubmV3SW5zdGFuY2UobmV3IE9iamVjdFtdIHsgdmFsdWUgfSk7Ci0gICAgICAgIHJldHVybiBvYmo7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3MgZ2V0Qm94ZWRUeXBlKENsYXNzIHByaW1pdGl2ZVR5cGUpIHsKLSAgICAgICAgaWYgKHByaW1pdGl2ZVR5cGUgPT0gYnl0ZS5jbGFzcykgewotICAgICAgICAgICAgcmV0dXJuIEJ5dGUuY2xhc3M7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHByaW1pdGl2ZVR5cGUgPT0gc2hvcnQuY2xhc3MpIHsKLSAgICAgICAgICAgIHJldHVybiBTaG9ydC5jbGFzczsKLSAgICAgICAgfQotICAgICAgICBpZiAocHJpbWl0aXZlVHlwZSA9PSBpbnQuY2xhc3MpIHsKLSAgICAgICAgICAgIHJldHVybiBJbnRlZ2VyLmNsYXNzOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwcmltaXRpdmVUeXBlID09IGxvbmcuY2xhc3MpIHsKLSAgICAgICAgICAgIHJldHVybiBMb25nLmNsYXNzOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwcmltaXRpdmVUeXBlID09IGZsb2F0LmNsYXNzKSB7Ci0gICAgICAgICAgICByZXR1cm4gRmxvYXQuY2xhc3M7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHByaW1pdGl2ZVR5cGUgPT0gZG91YmxlLmNsYXNzKSB7Ci0gICAgICAgICAgICByZXR1cm4gRG91YmxlLmNsYXNzOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwcmltaXRpdmVUeXBlID09IGNoYXIuY2xhc3MpIHsKLSAgICAgICAgICAgIHJldHVybiBDaGFyYWN0ZXIuY2xhc3M7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHByaW1pdGl2ZVR5cGUgPT0gYm9vbGVhbi5jbGFzcykgewotICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4uY2xhc3M7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgR3JlZ29yaWFuQ2FsZW5kYXIgdG9HcmVnb3JpYW5DYWxlbmRhcihTdHJpbmcgdmFsdWUpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgIERhdGUgZCA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KCkucGFyc2UodmFsdWUpOwotICAgICAgICBHcmVnb3JpYW5DYWxlbmRhciBnYyA9IG5ldyBHcmVnb3JpYW5DYWxlbmRhcigpOwotICAgICAgICBnYy5zZXRUaW1lKGQpOwotICAgICAgICByZXR1cm4gZ2M7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvQmluZGluZ1Byb3ZpZGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9CaW5kaW5nUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWEzOTM0ZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9CaW5kaW5nUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3M7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuQWRkcmVzc2luZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmFkZHJlc3NpbmcudXRpbC5FbmRwb2ludFJlZmVyZW5jZVV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuYmluZGluZy5CaW5kaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5iaW5kaW5nLlNPQVBCaW5kaW5nOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY2xpZW50LlByb3BlcnR5VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS5JbnZvY2F0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5FbmRwb2ludERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uU2VydmljZURlc2NyaXB0aW9uV1NETDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmhhbmRsZXIuSGFuZGxlclJlc29sdmVySW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmkxOG4uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zcGkuU2VydmljZURlbGVnYXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuSFRUUENvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLndzLkJpbmRpbmc7Ci1pbXBvcnQgamF2YXgueG1sLndzLkVuZHBvaW50UmVmZXJlbmNlOwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRmVhdHVyZTsKLWltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5IYW5kbGVyUmVzb2x2ZXI7Ci1pbXBvcnQgamF2YXgueG1sLndzLndzYWRkcmVzc2luZy5XM0NFbmRwb2ludFJlZmVyZW5jZTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLXB1YmxpYyBjbGFzcyBCaW5kaW5nUHJvdmlkZXIgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNwaS5CaW5kaW5nUHJvdmlkZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhCaW5kaW5nUHJvdmlkZXIuY2xhc3MpOwotCi0gICAgcHJvdGVjdGVkIE1hcDxTdHJpbmcsIE9iamVjdD4gcmVxdWVzdENvbnRleHQ7Ci0KLSAgICBwcm90ZWN0ZWQgTWFwPFN0cmluZywgT2JqZWN0PiByZXNwb25zZUNvbnRleHQ7Ci0KLSAgICBwcm90ZWN0ZWQgRW5kcG9pbnREZXNjcmlwdGlvbiBlbmRwb2ludERlc2M7Ci0KLSAgICBwcm90ZWN0ZWQgU2VydmljZURlbGVnYXRlIHNlcnZpY2VEZWxlZ2F0ZTsKLQotICAgIHByaXZhdGUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zcGkuQmluZGluZyBiaW5kaW5nOwotCi0gICAgcHVibGljIEJpbmRpbmdQcm92aWRlcihTZXJ2aWNlRGVsZWdhdGUgc3ZjRGVsZWdhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVwRGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZSBlcHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYWRkcmVzc2luZ05hbWVzcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlNlcnZpY2VGZWF0dXJlLi4uIGZlYXR1cmVzKSB7Ci0gICAgICAgIHRoaXMuZW5kcG9pbnREZXNjID0gZXBEZXNjOwotICAgICAgICB0aGlzLnNlcnZpY2VEZWxlZ2F0ZSA9IHN2Y0RlbGVnYXRlOwotICAgICAgICAKLSAgICAgICAgaW5pdGlhbGl6ZShlcHIsIGFkZHJlc3NpbmdOYW1lc3BhY2UsIGZlYXR1cmVzKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEluaXRpYWxpemUgYW55IG9iamVjdHMgbmVlZGVkIGJ5IHRoZSBCaW5kaW5nUHJvdmlkZXIKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZShvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2UgZXByLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhZGRyZXNzaW5nTmFtZXNwYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlNlcnZpY2VGZWF0dXJlLi4uIGZlYXR1cmVzKSB7Ci0gICAgICAgIHJlcXVlc3RDb250ZXh0ID0gbmV3IFZhbGlkYXRpbmdDbGllbnRDb250ZXh0KCk7Ci0gICAgICAgIHJlc3BvbnNlQ29udGV4dCA9IG5ldyBWYWxpZGF0aW5nQ2xpZW50Q29udGV4dCgpOwotICAgICAgICAKLSAgICAgICAgLy8gU2V0dGluZyBzdGFuZGFyZCBwcm9wZXJ0eSBkZWZhdWx0cyBmb3IgdGhlIHJlcXVlc3QgY29udGV4dAotICAgICAgICByZXF1ZXN0Q29udGV4dC5wdXQoQmluZGluZ1Byb3ZpZGVyLlNFU1NJT05fTUFJTlRBSU5fUFJPUEVSVFksIEJvb2xlYW4uRkFMU0UpOwotICAgICAgICByZXF1ZXN0Q29udGV4dC5wdXQoQmluZGluZ1Byb3ZpZGVyLlNPQVBBQ1RJT05fVVNFX1BST1BFUlRZLCBCb29sZWFuLlRSVUUpOwotICAgICAgICByZXF1ZXN0Q29udGV4dC5wdXQoQWRkcmVzc2luZ0NvbnN0YW50cy5ESVNBQkxFX0FERFJFU1NJTkdfRk9SX09VVF9NRVNTQUdFUywgQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFNldCB0aGUgZW5kcG9pbnQgYWRkcmVzcwotICAgICAgICBTdHJpbmcgZW5kcG9pbnRBZGRyZXNzID0gKGVwciAhPSBudWxsICkgPyBlcHIuZ2V0QWRkcmVzcygpIDogZW5kcG9pbnREZXNjLmdldEVuZHBvaW50QWRkcmVzcygpOyAgICAgICAgCi0gICAgICAgIGlmIChlbmRwb2ludEFkZHJlc3MgIT0gbnVsbCAmJiAhIiIuZXF1YWxzKGVuZHBvaW50QWRkcmVzcykpIHsKLSAgICAgICAgICAgIHJlcXVlc3RDb250ZXh0LnB1dChCaW5kaW5nUHJvdmlkZXIuRU5EUE9JTlRfQUREUkVTU19QUk9QRVJUWSwgZW5kcG9pbnRBZGRyZXNzKTsgICAgICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIEpBWFdTIDkuMi4xLjEgcmVxdWlyZXMgdGhhdCB3ZSBnbyBhaGVhZCBhbmQgY3JlYXRlIHRoZSBiaW5kaW5nIG9iamVjdAotICAgICAgICAvLyBzbyB3ZSBjYW4gYWxzbyBzZXQgdGhlIGhhbmRsZXJjaGFpbgotICAgICAgICBiaW5kaW5nID0gKG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc3BpLkJpbmRpbmcpIEJpbmRpbmdVdGlscy5jcmVhdGVCaW5kaW5nKGVuZHBvaW50RGVzYyk7Ci0gICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKXsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiTG9va2lnbiBmb3IgSGFuZGxlciBSZXNvbHZlciIpOwotICAgICAgICB9Ci0gICAgICAgIC8vIFRPRE8gc2hvdWxkIHdlIGFsbG93IHRoZSBTZXJ2aWNlRGVsZWdhdGUgdG8gZmlndXJlIG91dCB0aGUgZGVmYXVsdCBoYW5kbGVycmVzb2x2ZXI/ICBQcm9iYWJseSB5ZXMsIHNpbmNlIGEgY2xpZW50IGFwcCBtYXkgbG9vayBmb3Igb25lIHRoZXJlLgotICAgICAgICBIYW5kbGVyUmVzb2x2ZXIgaGFuZGxlclJlc29sdmVyID0gbnVsbDsKLSAgICAgICAgaWYoc2VydmljZURlbGVnYXRlLmdldEhhbmRsZXJSZXNvbHZlcigpICE9IG51bGwpewotICAgICAgICAgICAgaWYobG9nLmlzRGVidWdFbmFibGVkKCkpewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiUmVhZGluZyBkZWZhdWx0IEhhbmRsZXIgUmVzb2x2ZXIgIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBoYW5kbGVyUmVzb2x2ZXIgPSBzZXJ2aWNlRGVsZWdhdGUuZ2V0SGFuZGxlclJlc29sdmVyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZXsKLSAgICAgICAgICAgIGhhbmRsZXJSZXNvbHZlciA9IG5ldyBIYW5kbGVyUmVzb2x2ZXJJbXBsKGVuZHBvaW50RGVzYy5nZXRTZXJ2aWNlRGVzY3JpcHRpb24oKSwgc2VydmljZURlbGVnYXRlKTsKLSAgICAgICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKXsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkNyZWF0aW5nIG5ldyBIYW5kbGVyIFJlc29sdmVyIHVzaW5nIEhhbmRsZXJSZXNvbHZlckltcGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIFNlZSBpZiB0aGUgbWV0YWRhdGEgZnJvbSBjcmVhdGluZyB0aGUgc2VydmljZSBpbmRpY2F0ZXMgdGhhdCBNVE9NIHNob3VsZCBiZSBlbmFibGVkCi0gICAgICAgIGlmIChiaW5kaW5nIGluc3RhbmNlb2YgU09BUEJpbmRpbmcpIHsKLSAgICAgICAgICAgIC8vIE1UT00gY2FuIGJlIGVuYWJsZWQgZWl0aGVyIGF0IHRoZSBTZXJ2aWNlRGVzY3JpcHRpb24gbGV2ZWwgKHZpYSB0aGUgV1NETCBiaW5kaW5nIHR5cGUpIG9yCi0gICAgICAgICAgICAvLyBhdCB0aGUgRW5kcG9pbnREZXNjcmlwdGlvbiBsZXZlbCB2aWEgdGhlIGJpbmRpbmcgdHlwZSB1c2VkIHRvIGNyZWF0ZSBhIERpc3BhdGNoLgotICAgICAgICAgICAgYm9vbGVhbiBlbmFibGVNVE9NRnJvbU1ldGFkYXRhID0gZmFsc2U7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIGlmIHdlIGhhdmUgYW4gU0VJIGZvciB0aGUgcG9ydCwgdGhlbiB3ZSdsbCB1c2UgaXQgaW4gb3JkZXIgdG8gc2VhcmNoIGZvciBNVE9NIGNvbmZpZ3VyYXRpb24KLSAgICAgICAgICAgIGlmKGVuZHBvaW50RGVzYy5nZXRFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uKCkgIT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAgICAgICAgICBlbmRwb2ludERlc2MuZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbigpLmdldFNFSUNsYXNzKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGVuYWJsZU1UT01Gcm9tTWV0YWRhdGEgPSBlbmRwb2ludERlc2MuZ2V0U2VydmljZURlc2NyaXB0aW9uKCkuaXNNVE9NRW5hYmxlZChzZXJ2aWNlRGVsZWdhdGUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZHBvaW50RGVzYy5nZXRFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uKCkuZ2V0U0VJQ2xhc3MoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBlbmFibGVNVE9NRnJvbU1ldGFkYXRhID0gZW5kcG9pbnREZXNjLmdldFNlcnZpY2VEZXNjcmlwdGlvbigpLmlzTVRPTUVuYWJsZWQoc2VydmljZURlbGVnYXRlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghZW5hYmxlTVRPTUZyb21NZXRhZGF0YSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBiaW5kaW5nVHlwZSA9IGVuZHBvaW50RGVzYy5nZXRDbGllbnRCaW5kaW5nSUQoKTsKLSAgICAgICAgICAgICAgICBlbmFibGVNVE9NRnJvbU1ldGFkYXRhID0gKGJpbmRpbmdUeXBlLmVxdWFscyhTT0FQQmluZGluZy5TT0FQMTFIVFRQX01UT01fQklORElORykgfHwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kaW5nVHlwZS5lcXVhbHMoU09BUEJpbmRpbmcuU09BUDEySFRUUF9NVE9NX0JJTkRJTkcpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGVuYWJsZU1UT01Gcm9tTWV0YWRhdGEpIHsKLSAgICAgICAgICAgICAgICAoKFNPQVBCaW5kaW5nKSBiaW5kaW5nKS5zZXRNVE9NRW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAvLyBjaGVjayBmb3IgcHJvcGVydGllcyB0aGF0IG5lZWQgdG8gYmUgc2V0IG9uIHRoZSBCaW5kaW5nUHJvdmlkZXIKLSAgICAgICAgU3RyaW5nIHNlaU5hbWUgPSBudWxsOwotICAgICAgICBpZihlbmRwb2ludERlc2MuZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbigpICE9IG51bGwgCi0gICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgICAgICBlbmRwb2ludERlc2MuZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbigpLmdldFNFSUNsYXNzKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgc2VpTmFtZSA9IGVuZHBvaW50RGVzYy5nZXRFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uKCkuZ2V0U0VJQ2xhc3MoKS5nZXROYW1lKCk7Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nIHBvcnRRTmFtZVN0cmluZyA9IGVuZHBvaW50RGVzYy5nZXRQb3J0UU5hbWUoKS50b1N0cmluZygpOwotICAgICAgICBTdHJpbmcga2V5ID0gc2VpTmFtZSArICI6IiArIHBvcnRRTmFtZVN0cmluZzsKLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBiUHJvcHMgPSBlbmRwb2ludERlc2MuZ2V0U2VydmljZURlc2NyaXB0aW9uKCkuZ2V0QmluZGluZ1Byb3BlcnRpZXMoc2VydmljZURlbGVnYXRlLCBrZXkpOwotICAgICAgICBpZihiUHJvcHMgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlNldHRpbmcgYmluZGluZyBwcm9wcyB3aXRoIHNpemU6ICIgKyBiUHJvcHMuc2l6ZSgpICsgIiBvbiAiICsKLSAgICAgICAgICAgICAgICAiQmluZGluZ1Byb3ZpZGVyIFJlcXVlc3RDb250ZXh0Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXF1ZXN0Q29udGV4dC5wdXRBbGwoYlByb3BzKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgYmluZGluZy5zZXRIYW5kbGVyQ2hhaW4oaGFuZGxlclJlc29sdmVyLmdldEhhbmRsZXJDaGFpbihlbmRwb2ludERlc2MuZ2V0UG9ydEluZm8oKSkpOwotICAgICAgICAKLSAgICAgICAgLy9TZXQgSkFYLVdTIDIuMSByZWxhdGVkIHByb3BlcnRpZXMuCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBiaW5kaW5nLnNldEF4aXMyRW5kcG9pbnRSZWZlcmVuY2UoZXByKTsKLSAgICAgICAgICAgIGJpbmRpbmcuc2V0QWRkcmVzc2luZ05hbWVzcGFjZShhZGRyZXNzaW5nTmFtZXNwYWNlKTsKLSAgICAgICAgICAgIGJpbmRpbmcuc2V0RmVhdHVyZXMoZmVhdHVyZXMpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTZXJ2aWNlRGVsZWdhdGUgZ2V0U2VydmljZURlbGVnYXRlKCkgewotICAgICAgICByZXR1cm4gc2VydmljZURlbGVnYXRlOwotICAgIH0KLQotICAgIHB1YmxpYyBFbmRwb2ludERlc2NyaXB0aW9uIGdldEVuZHBvaW50RGVzY3JpcHRpb24oKSB7Ci0gICAgICAgIHJldHVybiBlbmRwb2ludERlc2M7Ci0gICAgfQotCi0gICAgcHVibGljIEJpbmRpbmcgZ2V0QmluZGluZygpIHsKLSAgICAgICAgcmV0dXJuIGJpbmRpbmc7Ci0gICAgfQotCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD4gZ2V0UmVxdWVzdENvbnRleHQoKSB7Ci0gICAgICAgIHJldHVybiByZXF1ZXN0Q29udGV4dDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiBnZXRSZXNwb25zZUNvbnRleHQoKSB7Ci0gICAgICAgIHJldHVybiByZXNwb25zZUNvbnRleHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2sgZm9yIG1haW50YWluIHNlc3Npb24gc3RhdGUgZW5hYmxlbWVudCBlaXRoZXIgaW4gdGhlCi0gICAgICogTWVzc2FnZUNvbnRleHQuaXNNYWludGFpblNlc3Npb24oKSBvciBpbiB0aGUgU2VydmljZUNvbnRleHQgcHJvcGVydGllcy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWMKLSAgICAgKiBAcGFyYW0gaWMKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBjaGVja01haW50YWluU2Vzc2lvblN0YXRlKE1lc3NhZ2VDb250ZXh0IG1jLCBJbnZvY2F0aW9uQ29udGV4dCBpYykgewotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMgPSBpYy5nZXRTZXJ2aWNlQ2xpZW50KCkuZ2V0U2VydmljZUNvbnRleHQoKS5nZXRQcm9wZXJ0aWVzKCk7Ci0gICAgICAgIGJvb2xlYW4gYlZhbHVlID0gZmFsc2U7Ci0KLSAgICAgICAgaWYgKHByb3BlcnRpZXMgIT0gbnVsbAotICAgICAgICAgICAgJiYgcHJvcGVydGllcwotICAgICAgICAgICAgICAgICAgICAgICAgIC5jb250YWluc0tleShqYXZheC54bWwud3MuQmluZGluZ1Byb3ZpZGVyLlNFU1NJT05fTUFJTlRBSU5fUFJPUEVSVFkpKSB7Ci0gICAgICAgICAgICBiVmFsdWUgPSAoQm9vbGVhbikgcHJvcGVydGllcwotICAgICAgICAgICAgICAgIC5nZXQoamF2YXgueG1sLndzLkJpbmRpbmdQcm92aWRlci5TRVNTSU9OX01BSU5UQUlOX1BST1BFUlRZKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobWMuaXNNYWludGFpblNlc3Npb24oKSB8fCBiVmFsdWUgPT0gdHJ1ZSkgewotICAgICAgICAgICAgc2V0dXBTZXNzaW9uQ29udGV4dChwcm9wZXJ0aWVzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgKiBFbnN1cmUgdGhhdCB0aGUgbmV4dCByZXF1ZXN0IGNvbnRleHQgY29udGFpbnMgdGhlIHNlc3Npb24gdmFsdWUgcmV0dXJuZWQKLSAgICAqIGZyb20gcHJldmlvdXMgcmVxdWVzdAotICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0dXBTZXNzaW9uQ29udGV4dChNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpIHsKLSAgICAgICAgU3RyaW5nIHNlc3Npb25LZXkgPSBudWxsOwotICAgICAgICBPYmplY3Qgc2Vzc2lvblZhbHVlID0gbnVsbDsKLQotICAgICAgICBpZiAocHJvcGVydGllcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoIk5vTWFpbnRhaW5TZXNzaW9uUHJvcGVydHkiKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcGVydGllcy5jb250YWluc0tleShIVFRQQ29uc3RhbnRzLkhFQURFUl9MT0NBVElPTikpIHsKLSAgICAgICAgICAgIHNlc3Npb25LZXkgPSBIVFRQQ29uc3RhbnRzLkhFQURFUl9MT0NBVElPTjsKLSAgICAgICAgICAgIHNlc3Npb25WYWx1ZSA9IHByb3BlcnRpZXMuZ2V0KHNlc3Npb25LZXkpOwotICAgICAgICAgICAgaWYgKHNlc3Npb25WYWx1ZSAhPSBudWxsICYmICEiIi5lcXVhbHMoc2Vzc2lvblZhbHVlKSkgewotICAgICAgICAgICAgICAgIHJlcXVlc3RDb250ZXh0LnB1dChCaW5kaW5nUHJvdmlkZXIuRU5EUE9JTlRfQUREUkVTU19QUk9QRVJUWSwgc2Vzc2lvblZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChwcm9wZXJ0aWVzLmNvbnRhaW5zS2V5KEhUVFBDb25zdGFudHMuSEVBREVSX0NPT0tJRSkpIHsKLSAgICAgICAgICAgIHNlc3Npb25LZXkgPSBIVFRQQ29uc3RhbnRzLkhFQURFUl9DT09LSUU7Ci0gICAgICAgICAgICBzZXNzaW9uVmFsdWUgPSBwcm9wZXJ0aWVzLmdldChzZXNzaW9uS2V5KTsKLSAgICAgICAgICAgIGlmIChzZXNzaW9uVmFsdWUgIT0gbnVsbCAmJiAhIiIuZXF1YWxzKHNlc3Npb25WYWx1ZSkpIHsKLSAgICAgICAgICAgICAgICByZXF1ZXN0Q29udGV4dC5wdXQoSFRUUENvbnN0YW50cy5DT09LSUVfU1RSSU5HLCBzZXNzaW9uVmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnRpZXMuY29udGFpbnNLZXkoSFRUUENvbnN0YW50cy5IRUFERVJfQ09PS0lFMikpIHsKLSAgICAgICAgICAgIHNlc3Npb25LZXkgPSBIVFRQQ29uc3RhbnRzLkhFQURFUl9DT09LSUUyOwotICAgICAgICAgICAgc2Vzc2lvblZhbHVlID0gcHJvcGVydGllcy5nZXQoc2Vzc2lvbktleSk7Ci0gICAgICAgICAgICBpZiAoc2Vzc2lvblZhbHVlICE9IG51bGwgJiYgISIiLmVxdWFscyhzZXNzaW9uVmFsdWUpKSB7Ci0gICAgICAgICAgICAgICAgcmVxdWVzdENvbnRleHQucHV0KEhUVFBDb25zdGFudHMuQ09PS0lFX1NUUklORywgc2Vzc2lvblZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkKLSAgICAgICAgICAgICAgICAgICAgLm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoIk5vTWFpbnRhaW5TZXNzaW9uUHJvcGVydHkiKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc2Vzc2lvblZhbHVlID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoIk51bGxWYWx1ZUZvck1haW50YWluU2Vzc2lvblByb3BlcnR5Iiwgc2Vzc2lvbktleSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGJvb2xlYW4gdmFsdWUgcmVwcmVzZW50aW5nIHdoZXRoZXIgb3Igbm90IGEgU09BUEFjdGlvbiBoZWFkZXIgc2hvdWxkIGJlIHNlbnQgd2l0aAotICAgICAqIHRoZSByZXF1ZXN0LgotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIHVzZVNvYXBBY3Rpb24oKSB7Ci0gICAgICAgIC8vVE9ETzogQWRkIHNvbWUgYml0IG9mIHZhbGlkYXRpb24gZm9yIHRoaXMgcHJvcGVydHkgc28gdGhhdCB3ZSBrbm93Ci0gICAgICAgIC8vIGl0IGlzIGFjdHVhbGx5IGEgQm9vbGVhbiBhbmQgbm90IGEgU3RyaW5nLgotICAgICAgICBCb29sZWFuIHVzZSA9IChCb29sZWFuKXJlcXVlc3RDb250ZXh0LmdldChCaW5kaW5nUHJvdmlkZXIuU09BUEFDVElPTl9VU0VfUFJPUEVSVFkpOwotICAgICAgICBpZiAodXNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmICh1c2UuYm9vbGVhblZhbHVlKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gSWYgdGhlIHZhbHVlIGlzIG5vdCBzZXQsIHRoZW4ganVzdCBkZWZhdWx0IHRvIHNlbmRpbmcgYSBTT0FQQWN0aW9uCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIGphdmF4LnhtbC53cy5CaW5kaW5nUHJvdmlkZXIjZ2V0RW5kcG9pbnRSZWZlcmVuY2UoKQotICAgICAqLwotICAgIHB1YmxpYyBFbmRwb2ludFJlZmVyZW5jZSBnZXRFbmRwb2ludFJlZmVyZW5jZSgpIHsKLSAgICAgICAgcmV0dXJuIGdldEVuZHBvaW50UmVmZXJlbmNlKFczQ0VuZHBvaW50UmVmZXJlbmNlLmNsYXNzKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqICAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBqYXZheC54bWwud3MuQmluZGluZ1Byb3ZpZGVyI2dldEVuZHBvaW50UmVmZXJlbmNlKGphdmEubGFuZy5DbGFzcykKLSAgICAgKi8KLSAgICBwdWJsaWMgPFQgZXh0ZW5kcyBFbmRwb2ludFJlZmVyZW5jZT4gVCBnZXRFbmRwb2ludFJlZmVyZW5jZShDbGFzczxUPiBjbGF6eikgewotICAgICAgICBFbmRwb2ludFJlZmVyZW5jZSBqYXh3c0VQUiA9IG51bGw7Ci0gICAgICAgIFN0cmluZyBhZGRyZXNzaW5nTmFtZXNwYWNlID0gRW5kcG9pbnRSZWZlcmVuY2VVdGlscy5nZXRBZGRyZXNzaW5nTmFtZXNwYWNlKGNsYXp6KTsKLSAgICAgICAgCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2UgZXByID0gYmluZGluZy5nZXRBeGlzMkVuZHBvaW50UmVmZXJlbmNlKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChlcHIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFN0cmluZyBhZGRyZXNzID0KLSAgICAgICAgICAgICAgICAgICAgKFN0cmluZykgcmVxdWVzdENvbnRleHQuZ2V0KEJpbmRpbmdQcm92aWRlci5FTkRQT0lOVF9BRERSRVNTX1BST1BFUlRZKTsKLSAgICAgICAgICAgICAgICBpZiAoYWRkcmVzcyA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICBhZGRyZXNzID0gZW5kcG9pbnREZXNjLmdldEVuZHBvaW50QWRkcmVzcygpOwotICAgICAgICAgICAgICAgIFFOYW1lIHNlcnZpY2UgPSBlbmRwb2ludERlc2MuZ2V0U2VydmljZVFOYW1lKCk7Ci0gICAgICAgICAgICAgICAgUU5hbWUgcG9ydCA9IGVuZHBvaW50RGVzYy5nZXRQb3J0UU5hbWUoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgd3NkbExvY2F0aW9uID0gKChTZXJ2aWNlRGVzY3JpcHRpb25XU0RMKSBlbmRwb2ludERlc2MuZ2V0U2VydmljZURlc2NyaXB0aW9uKCkpLmdldFdTRExMb2NhdGlvbigpOwotCi0gICAgICAgICAgICAgICAgZXByID0gRW5kcG9pbnRSZWZlcmVuY2VVdGlscy5jcmVhdGVBeGlzMkVuZHBvaW50UmVmZXJlbmNlKGFkZHJlc3MsIHNlcnZpY2UsIHBvcnQsIHdzZGxMb2NhdGlvbiwgYWRkcmVzc2luZ05hbWVzcGFjZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICghYWRkcmVzc2luZ05hbWVzcGFjZS5lcXVhbHMoYmluZGluZy5nZXRBZGRyZXNzaW5nTmFtZXNwYWNlKCkpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS4KLSAgICAgICAgICAgICAgICAgICBtYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJiaW5kaW5nUHJvdmlkZXJFcnIxIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRpbmcuZ2V0QWRkcmVzc2luZ05hbWVzcGFjZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzc2luZ05hbWVzcGFjZSkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBqYXh3c0VQUiA9IEVuZHBvaW50UmVmZXJlbmNlVXRpbHMuY29udmVydEZyb21BeGlzMihlcHIsIGFkZHJlc3NpbmdOYW1lc3BhY2UpOwotICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICB9IGNhdGNoIChXZWJTZXJ2aWNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5LgotICAgICAgICAgICAgICAgIG1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoImVuZHBvaW50UmVmQ29uc3RydWN0aW9uRmFpbHVyZTMiLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUudG9TdHJpbmcoKSkpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gY2xhenouY2FzdChqYXh3c0VQUik7Ci0gICAgfQotICAgIAotICAgIC8qCi0gICAgKiBBbiBpbm5lciBjbGFzcyB1c2VkIHRvIHZhbGlkYXRlIHByb3BlcnRpZXMgYXMgdGhleSBhcmUgc2V0IGJ5IHRoZSBjbGllbnQuCi0gICAgKi8KLSAgICBjbGFzcyBWYWxpZGF0aW5nQ2xpZW50Q29udGV4dCBleHRlbmRzIEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4gewotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzNDg1MTEyMjA1ODAxOTE3ODU4TDsKLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHN5bmNocm9uaXplZCBPYmplY3QgcHV0KFN0cmluZyBrZXksIE9iamVjdCB2YWx1ZSkgewotICAgICAgICAgICAgLy8gc3VwZXIucHV0IHJpZ2h0bHkgdGhyb3dzIGEgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYga2V5IG9yIHZhbHVlIGlzIG51bGwsIHNvIGRvbid0IGNvbnRpbnVlIGlmIHRoYXQncyB0aGUgY2FzZQotICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICBpZiAoUHJvcGVydHlWYWxpZGF0b3IudmFsaWRhdGUoa2V5LCB2YWx1ZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIucHV0KGtleSwgdmFsdWUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZ2V0TWVzc2FnZSgiaW52YWxpZFByb3BWYWx1ZSIsIGtleSwgdmFsdWUuZ2V0Q2xhc3MoKS5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsaWRhdG9yLmdldEV4cGVjdGVkVmFsdWUoa2V5KS5nZXROYW1lKCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9Db25zdGFudHMuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL0NvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzQxY2RkLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL0NvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzOwotCi0vKioKLSAqIENvbnN0YW50cyB0aGF0IGFwcGx5IHRvIHRoZSBKQVgtV1MgaW1wbGVtZW50YXRpb24uCi0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbnN0YW50cyB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5EUE9JTlRfQ09OVEVYVF9NQVAgPQotICAgICAgICAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5hZGRyZXNzaW5nLnV0aWwuRW5kcG9pbnRDb250ZXh0TWFwIjsKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVhXU19PVVRCT1VORF9TT0FQX0hFQURFUlMgID0gCi0gICAgICAgIG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzLkpBWFdTX09VVEJPVU5EX1NPQVBfSEVBREVSUzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVhXU19JTkJPVU5EX1NPQVBfSEVBREVSUyAgID0gCi0gICAgICAgIG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzLkpBWFdTX0lOQk9VTkRfU09BUF9IRUFERVJTOwotICAgIC8qKgotICAgICAqIFZhbHVlIHRoYXQgY2FuIGJlIHNldCBvbiBhIE1lc3NhZ2VDb250ZXh0LiAgVGhlIHByb3BlcnR5IHZhbHVlIHNob3VsZCBiZSBhIEJvb2xlYW4oKQotICAgICAqIAotICAgICAqIElmIHNldCB0byBmYWxzZSwgdGhlbiBKQVhCIHN0cmVhbWluZyBvZiB0aGUgWE1MIGJvZHkgaXMgZGlzYWJsZWQuCi0gICAgICogQSB2YWx1ZSBvZiBmYWxzZSB3aWxsIHJlc3VsdCBpbiBzbG93ZXIgcGVyZm9ybWFuY2UgZm9yIHVubWFyc2hhbGxpbmcgSkFYQiBvYmplY3RzCi0gICAgICogYnV0IGlzIGEgbG9zcy1sZXNzIHRyYW5zZm9ybWF0aW9uLiAgCi0gICAgICogIAotICAgICAqIEEgdmFsdWUgb2YgdHJ1ZSB3aWxsIGNhdXNlIHRoZSBKQVhCIG9iamVjdHMgdG8gYmUgY3JlYXRlZCB3aGVuIHRoZSBYTUwgYm9keSBpcyBpbml0aWFsbHkgCi0gICAgICogcGFyc2VkLCB3aGljaCBpcyBtb3JlIHBlcmZvcm1hbnQsIGJ1dCBpdCBtYXkgbG9vc2Ugc29tZSBpbmZvcm1hdGlvbiBjb250YWluZWQgaW4gdGhlIAotICAgICAqIG9yaWdpbmFsIFhNTCBzdWNoIGFzIG5hbWVzcGFjZSBwcmVmaXhlcyBpZiB0aGUgWE1MIHN0cmVhbSBpcyByZWNyZWF0ZWQgZnJvbSB0aGUgSkFYQiAKLSAgICAgKiBvYmplY3RzLgotICAgICAqIAotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIEJvb2xlYW4odHJ1ZSkgaWYgdGhpcyBwcm9wZXJ0eSBpcyBub3Qgc2V0LiAgCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFYV1NfRU5BQkxFX0pBWEJfUEFZTE9BRF9TVFJFQU1JTkcgPSAKLSAgICAgICAgIm9yZy5hcGFjaGUuYXhpczIuamF4d3MuZW5hYmxlSkFYQlBheWxvYWRTdHJlYW1pbmciOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FUF9DT05URVhUID0gCi0gICAgICAgICJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmhhbmRsZXIuTUVQQ29udGV4dCI7Ci0gICAgCi0gICAgLyoqCi0gICAgICogSWYgYSBjaGVja2VkIGV4Y2VwdGlvbiBpcyB0aHJvd24gYnkgdGhlIHdlYnNlcnZpY2UncyB3ZWJtZXRob2QsIHRoZW4KLSAgICAgKiB0aGUgbmFtZSBvZiB0aGUgY2hlY2tlZCBleGNlcHRpb24gaXMgcGxhY2VkIGluIHRoZSBvdXRib3VuZCByZXNwb25zZSBjb250ZXh0LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENIRUNLRURfRVhDRVBUSU9OID0KLSAgICAgICAgIm9yZy5hcGFjaGUuYXhpczIuamF4d3MuY2hlY2tlZEV4Y2VwdGlvbiI7Ci0gICAgCi0gICAgLyoqCi0gICAgICogSWYgYW4gZXhjZXB0aW9uIGlzIHRocm93biBieSB0aGUgSkFYV1Mgd2Vic2VydmljZSdzIHdlYm1ldGhvZCwgdGhlIAotICAgICAqIFRocm93YWJsZSBvYmplY3QgaXMgcGxhY2VkIGluIHRoZSBzZXJ2aWNlIG91dGJvdW5kIHJlc3BvbnNlIGNvbnRleHQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFYV1NfV0VCTUVUSE9EX0VYQ0VQVElPTiA9IAotICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50cy5KQVhXU19XRUJNRVRIT0RfRVhDRVBUSU9OOwotICAgIAotICAgIC8qKgotICAgICAqIFRoaXMgY29uc3RhbnQgaW50cm9kdWNlcyBhbiBleHRlbnNpb24gZm9yIEBCaW5kaW5nVHlwZSBhbm5vdGF0aW9uLgotICAgICAqIFdoZW4gdGhlIHZhbHVlIG9mIEJpbmRpbmdUeXBlIGFubm90YXRpb24gaXMgc2V0IHRvIHRoaXMgY29uc3RhbnQsCi0gICAgICogdGhlIGphdmF4LnhtbC53cy5Qcm92aWRlciBqYXZhIGVuZHBvaW50cyB3aWxsIGNhdGVyIHRvIFNPQVAxMSBhbmQgU09BUDEyCi0gICAgICogbWVzc2FnZXMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09BUF9IVFRQX0JJTkRJTkcgPSJTT0FQX0hUVFBfQklORElORyI7Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9XZWJTZXJ2aWNlRXhjZXB0aW9uTG9nZ2VyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9XZWJTZXJ2aWNlRXhjZXB0aW9uTG9nZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3N2ZjZTQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvV2ViU2VydmljZUV4Y2VwdGlvbkxvZ2dlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3M7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaTE4bi5NZXNzYWdlczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51dGlsaXR5LkphdmFVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7DQotDQotLyoqDQotICogQ29udHJvbHMgZXJyb3IgbG9nZ2luZyBvZiBleGNlcHRpb25zIHRocm93biBieSB0aGUgV2ViU2VydmljZSBhcHBsaWNhdGlvbiAocHJvdmlkZXIsIGltcGwsIGV0Yy4pDQotICogDQotICogVGhpcyBjbGFzcyBsb2dzIGVycm9ycyBmb3IgYWxsIG5vbi1jaGVja2VkIGV4Y2VwdGlvbnMuDQotICogVGhpcyBjbGFzcyBsb2dzIGV4dGVuc2l2ZSBkZWJ1ZyBpbmZvcm1hdGlvbiBmb3IgYWxsIGV4Y2VwdGlvbnMuDQotICovDQotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VFeGNlcHRpb25Mb2dnZXIgew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coV2ViU2VydmljZUV4Y2VwdGlvbkxvZ2dlci5jbGFzcyk7DQotICAgIA0KLSAgICAvKioNCi0gICAgICogTG9ncyBhbiBlcnJvciBpZiB0aGUgZXhjZXB0aW9uIHRocm93biBieSBAV2ViTWV0aG9kIG0gaXMgbm90IGEgY2hlY2tlZCBleGNlcHRpb24uDQotICAgICAqIElmIGRlYnVnIGxvZ2dpbmcgaXMgZW5hYmxlZCwgYWxsIGV4Y2VwdGlvbnMgYXJlIGxvZ2dlZC4NCi0gICAgICogQHBhcmFtIG1ldGhvZA0KLSAgICAgKiBAcGFyYW0gdGhyb3dhYmxlDQotICAgICAqIEBwYXJhbSBsb2dGdWxseSAoaWYgdHJ1ZSB0aGVuIHRoZSBleGNlcHRpb24gaXMgbG9nZ2VkLCBvdGhlcndpc2Ugb25seSB0aGUgY2xhc3MgYW5kIHN0YWNrIGlzIGxvZ2dlZCkNCi0gICAgICogQHBhcmFtIHNlcnZpY2VJbXBsQ2xhc3MgY2xhc3Mgb2Ygc2VydmljZSBpbXBsZW1lbnRhdGlvbg0KLSAgICAgKiBAcGFyYW0gc2VydmljZUluc3RhbmNlIA0KLSAgICAgKiBAcGFyYW0gYXJncyBPYmplY3RbXSBhcmd1bWVudHMgcGFzcyB0byBtZXRob2QNCi0gICAgICovDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2coTWV0aG9kIG1ldGhvZCwgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyb3dhYmxlIHRocm93YWJsZSwgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBsb2dGdWxseSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyBzZXJ2aWNlSW1wbENsYXNzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBzZXJ2aWNlSW5zdGFuY2UsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0W10gYXJncykgew0KLSAgICAgICAgDQotICAgICAgICAvLyBNdXN0IGhhdmUgZGVidWcgb3IgZXJyb3IgbG9nZ2luZyBlbmFibGVkDQotICAgICAgICBpZiAoIWxvZy5pc0RlYnVnRW5hYmxlZCgpICYmICFsb2cuaXNFcnJvckVuYWJsZWQoKSkgew0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgLy8gR2V0IHRoZSByb290IG9mIHRoZSBleGNlcHRpb24NCi0gICAgICAgIFRocm93YWJsZSByb290VCA9IG51bGw7DQotICAgICAgICBpZiAodGhyb3dhYmxlIGluc3RhbmNlb2YgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHJvb3RUID0gKChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKSB0aHJvd2FibGUpLmdldFRhcmdldEV4Y2VwdGlvbigpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICANCi0gICAgICAgIFN0cmluZyBuYW1lID0gcm9vdFQuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7DQotICAgICAgICBTdHJpbmcgc3RhY2sgPSBzdGFja1RvU3RyaW5nKHJvb3RUKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gRGV0ZXJtaW5lIGlmIHRoaXMgaXMgYSBjaGVja2VkIGV4Y2VwdGlvbiBvciBub24tY2hlY2tlZCBleGNlcHRpb24NCi0gICAgICAgIENsYXNzIGNoZWNrZWRFeGNlcHRpb24gPSBKYXZhVXRpbHMuZ2V0Q2hlY2tlZEV4Y2VwdGlvbihyb290VCwgbWV0aG9kKTsNCi0gICAgICAgIA0KLSAgICAgICAgaWYgKGNoZWNrZWRFeGNlcHRpb24gPT0gbnVsbCkgew0KLSAgICAgICAgICAgIC8vIE9ubHkgbG9nIGVycm9ycyBmb3Igbm9uLWNoZWNrZWQgZXhjZXB0aW9ucw0KLSAgICAgICAgICAgIGlmIChsb2cuaXNFcnJvckVuYWJsZWQoKSkgew0KLSAgICAgICAgICAgICAgICBTdHJpbmcgdGV4dCA9ICIiOw0KLSAgICAgICAgICAgICAgICBpZiAobG9nRnVsbHkpIHsNCi0gICAgICAgICAgICAgICAgICAgIHRleHQgPSBNZXNzYWdlcy5nZXRNZXNzYWdlKCJmYWlsdXJlTG9nZ2VyIiwgbmFtZSwgcm9vdFQudG9TdHJpbmcoKSk7DQotICAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgdGV4dCA9IE1lc3NhZ2VzLmdldE1lc3NhZ2UoImZhaWx1cmVMb2dnZXIiLCBuYW1lLCBzdGFjayk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgbG9nLmVycm9yKHRleHQpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICANCi0gICAgICAgIH0gDQotICAgICAgICANCi0gICAgICAgIC8vIEZ1bGwgbG9nZ2luZyBpZiBkZWJ1ZyBpcyBlbmFibGVkLg0KLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKCJFeGNlcHRpb24gaW52b2tpbmcgYSBtZXRob2Qgb2YgIiArIHNlcnZpY2VJbXBsQ2xhc3MudG9TdHJpbmcoKQ0KLSAgICAgICAgICAgICAgICAgICAgKyAiIG9mIGluc3RhbmNlICIgKyBzZXJ2aWNlSW5zdGFuY2UudG9TdHJpbmcoKSk7DQotICAgICAgICAgICAgbG9nLmRlYnVnKCJFeGNlcHRpb24gdHlwZSB0aHJvd246ICIgKyB0aHJvd2FibGUuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOw0KLSAgICAgICAgICAgIGlmIChyb290VCAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiUm9vdCBFeGNlcHRpb24gdHlwZSB0aHJvd246ICIgKyByb290VC5nZXRDbGFzcygpLmdldE5hbWUoKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmIChjaGVja2VkRXhjZXB0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJUaGUgZXhjZXB0aW9uIGlzIGFuIGluc3RhbmNlIG9mIGNoZWNrZWQgZXhjZXB0aW9uOiAiICsgDQotICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja2VkRXhjZXB0aW9uLmdldE5hbWUoKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiTWV0aG9kID0gIiArIG1ldGhvZC50b0dlbmVyaWNTdHJpbmcoKSk7DQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7DQotICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9DQotICAgICAgICAgICAgICAgICAgICAgICAgKGFyZ3NbaV0gPT0gbnVsbCkgPyAibnVsbCINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogYXJnc1tpXS5nZXRDbGFzcygpLnRvU3RyaW5nKCk7DQotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiIEFyZ3VtZW50WyIgKyBpICsgIl0gaXMgIiArIHZhbHVlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm47DQotICAgICAgICANCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIEdldCBhIHN0cmluZyBjb250YWluaW5nIHRoZSBzdGFjayBvZiB0aGUgc3BlY2lmaWVkIGV4Y2VwdGlvbg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gZQ0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqLw0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgc3RhY2tUb1N0cmluZyhUaHJvd2FibGUgZSkgew0KLSAgICAgICAgamF2YS5pby5TdHJpbmdXcml0ZXIgc3cgPSBuZXcgamF2YS5pby5TdHJpbmdXcml0ZXIoKTsNCi0gICAgICAgIGphdmEuaW8uQnVmZmVyZWRXcml0ZXIgYncgPSBuZXcgamF2YS5pby5CdWZmZXJlZFdyaXRlcihzdyk7DQotICAgICAgICBqYXZhLmlvLlByaW50V3JpdGVyIHB3ID0gbmV3IGphdmEuaW8uUHJpbnRXcml0ZXIoYncpOw0KLSAgICAgICAgZS5wcmludFN0YWNrVHJhY2UocHcpOw0KLSAgICAgICAgcHcuY2xvc2UoKTsNCi0gICAgICAgIFN0cmluZyB0ZXh0ID0gc3cuZ2V0QnVmZmVyKCkudG9TdHJpbmcoKTsNCi0gICAgICAgIC8vIEp1bXAgcGFzdCB0aGUgdGhyb3dhYmxlDQotICAgICAgICB0ZXh0ID0gdGV4dC5zdWJzdHJpbmcodGV4dC5pbmRleE9mKCJhdCIpKTsNCi0gICAgICAgIHJldHVybiB0ZXh0Ow0KLSAgICB9DQotICAgIA0KLSAgICANCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvYWRkcmVzc2luZy9TdWJtaXNzaW9uRW5kcG9pbnRSZWZlcmVuY2UuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2FkZHJlc3NpbmcvU3VibWlzc2lvbkVuZHBvaW50UmVmZXJlbmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwZDRhOWUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvYWRkcmVzc2luZy9TdWJtaXNzaW9uRW5kcG9pbnRSZWZlcmVuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyNCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmFkZHJlc3Npbmc7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmkxOG4uTWVzc2FnZXM7DQotDQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJDb250ZXh0Ow0KLWltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC54bWwuYmluZC5NYXJzaGFsbGVyOw0KLWltcG9ydCBqYXZheC54bWwuYmluZC5Vbm1hcnNoYWxsZXI7DQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzVHlwZTsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7DQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQW55QXR0cmlidXRlOw0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFueUVsZW1lbnQ7DQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQXR0cmlidXRlOw0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnQ7DQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUm9vdEVsZW1lbnQ7DQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sU2NoZW1hVHlwZTsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlOw0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFZhbHVlOw0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLmFkYXB0ZXJzLkNvbGxhcHNlZFN0cmluZ0FkYXB0ZXI7DQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uYWRhcHRlcnMuWG1sSmF2YVR5cGVBZGFwdGVyOw0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOw0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlJlc3VsdDsNCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5FbmRwb2ludFJlZmVyZW5jZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247DQotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIDxwPkphdmEgY2xhc3MgZm9yIEVuZHBvaW50UmVmZXJlbmNlVHlwZSBjb21wbGV4IHR5cGUuDQotICogDQotICogPHA+VGhlIGZvbGxvd2luZyBzY2hlbWEgZnJhZ21lbnQgc3BlY2lmaWVzIHRoZSBleHBlY3RlZCBjb250ZW50IGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBjbGFzcy4NCi0gKiANCi0gKiA8cHJlPg0KLSAqICZsdDtjb21wbGV4VHlwZSBuYW1lPSJFbmRwb2ludFJlZmVyZW5jZVR5cGUiPg0KLSAqICAgJmx0O2NvbXBsZXhDb250ZW50Pg0KLSAqICAgICAmbHQ7cmVzdHJpY3Rpb24gYmFzZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfWFueVR5cGUiPg0KLSAqICAgICAgICZsdDtzZXF1ZW5jZT4NCi0gKiAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9IkFkZHJlc3MiIHR5cGU9IntodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA4L2FkZHJlc3Npbmd9QXR0cmlidXRlZFVSSSIvPg0KLSAqICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0iUmVmZXJlbmNlUHJvcGVydGllcyIgdHlwZT0ie2h0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDgvYWRkcmVzc2luZ31SZWZlcmVuY2VQcm9wZXJ0aWVzVHlwZSIgbWluT2NjdXJzPSIwIi8+DQotICogICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJSZWZlcmVuY2VQYXJhbWV0ZXJzIiB0eXBlPSJ7aHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOC9hZGRyZXNzaW5nfVJlZmVyZW5jZVBhcmFtZXRlcnNUeXBlIiBtaW5PY2N1cnM9IjAiLz4NCi0gKiAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9IlBvcnRUeXBlIiB0eXBlPSJ7aHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOC9hZGRyZXNzaW5nfUF0dHJpYnV0ZWRRTmFtZSIgbWluT2NjdXJzPSIwIi8+DQotICogICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJTZXJ2aWNlTmFtZSIgdHlwZT0ie2h0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDgvYWRkcmVzc2luZ31TZXJ2aWNlTmFtZVR5cGUiIG1pbk9jY3Vycz0iMCIvPg0KLSAqICAgICAgICAgJmx0O2FueS8+DQotICogICAgICAgJmx0Oy9zZXF1ZW5jZT4NCi0gKiAgICAgJmx0Oy9yZXN0cmljdGlvbj4NCi0gKiAgICZsdDsvY29tcGxleENvbnRlbnQ+DQotICogJmx0Oy9jb21wbGV4VHlwZT4NCi0gKiA8L3ByZT4NCi0gKiANCi0gKiANCi0gKi8NCi1AWG1sUm9vdEVsZW1lbnQobmFtZSA9ICJFbmRwb2ludFJlZmVyZW5jZSIsIG5hbWVzcGFjZSA9IFN1Ym1pc3Npb25FbmRwb2ludFJlZmVyZW5jZS5OUykNCi1AWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpDQotQFhtbFR5cGUobmFtZSA9ICJFbmRwb2ludFJlZmVyZW5jZVR5cGUiLCBuYW1lc3BhY2UgPSBTdWJtaXNzaW9uRW5kcG9pbnRSZWZlcmVuY2UuTlMsIHByb3BPcmRlciA9IHsNCi0gICAgImFkZHJlc3MiLA0KLSAgICAicmVmZXJlbmNlUHJvcGVydGllcyIsDQotICAgICJyZWZlcmVuY2VQYXJhbWV0ZXJzIiwNCi0gICAgInBvcnRUeXBlIiwNCi0gICAgInNlcnZpY2VOYW1lIiwNCi0gICAgImFueSINCi19KQ0KLXB1YmxpYyBjbGFzcyBTdWJtaXNzaW9uRW5kcG9pbnRSZWZlcmVuY2UgZXh0ZW5kcyBFbmRwb2ludFJlZmVyZW5jZSB7DQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5TID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDgvYWRkcmVzc2luZyI7DQotICAgIHByb3RlY3RlZCBzdGF0aWMgSkFYQkNvbnRleHQgamF4YkNvbnRleHQ7DQotDQotICAgIEBYbWxFbGVtZW50KG5hbWUgPSAiQWRkcmVzcyIsIG5hbWVzcGFjZSA9IE5TLCByZXF1aXJlZCA9IHRydWUpDQotICAgIHByb3RlY3RlZCBBdHRyaWJ1dGVkVVJJIGFkZHJlc3M7DQotICAgIEBYbWxFbGVtZW50KG5hbWUgPSAiUmVmZXJlbmNlUHJvcGVydGllcyIsIG5hbWVzcGFjZSA9IE5TKQ0KLSAgICBwcm90ZWN0ZWQgUmVmZXJlbmNlUHJvcGVydGllc1R5cGUgcmVmZXJlbmNlUHJvcGVydGllczsNCi0gICAgQFhtbEVsZW1lbnQobmFtZSA9ICJSZWZlcmVuY2VQYXJhbWV0ZXJzIiwgbmFtZXNwYWNlID0gTlMpDQotICAgIHByb3RlY3RlZCBSZWZlcmVuY2VQYXJhbWV0ZXJzVHlwZSByZWZlcmVuY2VQYXJhbWV0ZXJzOw0KLSAgICBAWG1sRWxlbWVudChuYW1lID0gIlBvcnRUeXBlIiwgbmFtZXNwYWNlID0gTlMpDQotICAgIHByb3RlY3RlZCBBdHRyaWJ1dGVkUU5hbWUgcG9ydFR5cGU7DQotICAgIEBYbWxFbGVtZW50KG5hbWUgPSAiU2VydmljZU5hbWUiLCBuYW1lc3BhY2UgPSBOUykNCi0gICAgcHJvdGVjdGVkIFNlcnZpY2VOYW1lVHlwZSBzZXJ2aWNlTmFtZTsNCi0gICAgQFhtbEFueUVsZW1lbnQobGF4ID0gdHJ1ZSkNCi0gICAgcHJvdGVjdGVkIExpc3Q8T2JqZWN0PiBhbnk7DQotICAgIEBYbWxBbnlBdHRyaWJ1dGUNCi0gICAgcHJpdmF0ZSBNYXA8UU5hbWUsIFN0cmluZz4gb3RoZXJBdHRyaWJ1dGVzID0gbmV3IEhhc2hNYXA8UU5hbWUsIFN0cmluZz4oKTsNCi0gICAgDQotICAgIHN0YXRpYyB7DQotICAgICAgICB0cnkgeyANCi0gICAgICAgICAgICBqYXhiQ29udGV4dCA9KEpBWEJDb250ZXh0KQ0KLSAgICAgICAgICAgIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKA0KLSAgICAgICAgICAgICAgIG5ldyBQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uKCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB0aHJvd3MgSkFYQkV4Y2VwdGlvbiB7DQotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSkFYQkNvbnRleHQubmV3SW5zdGFuY2UoU3VibWlzc2lvbkVuZHBvaW50UmVmZXJlbmNlLmNsYXNzKTsNCi0gICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgIH0pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiamF4YkNvbnRleHRGYWlsdXJlIiwgZS50b1N0cmluZygpKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN1Ym1pc3Npb25FbmRwb2ludFJlZmVyZW5jZSgpIHsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIFN1Ym1pc3Npb25FbmRwb2ludFJlZmVyZW5jZShTb3VyY2UgZXBySW5mb3NldCkgew0KLSAgICAgICAgc3VwZXIoKTsNCi0gICAgICAgIA0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBVbm1hcnNoYWxsZXIgdW0gPSBqYXhiQ29udGV4dC5jcmVhdGVVbm1hcnNoYWxsZXIoKTsNCi0gICAgICAgICAgICBTdWJtaXNzaW9uRW5kcG9pbnRSZWZlcmVuY2Ugc3ViRVBSID0NCi0gICAgICAgICAgICAgICAgKFN1Ym1pc3Npb25FbmRwb2ludFJlZmVyZW5jZSkgdW0udW5tYXJzaGFsKGVwckluZm9zZXQpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIGFkZHJlc3MgPSBzdWJFUFIuYWRkcmVzczsNCi0gICAgICAgICAgICByZWZlcmVuY2VQYXJhbWV0ZXJzID0gc3ViRVBSLnJlZmVyZW5jZVBhcmFtZXRlcnM7DQotICAgICAgICAgICAgcmVmZXJlbmNlUHJvcGVydGllcyA9IHN1YkVQUi5yZWZlcmVuY2VQcm9wZXJ0aWVzOw0KLSAgICAgICAgICAgIHBvcnRUeXBlID0gc3ViRVBSLnBvcnRUeXBlOw0KLSAgICAgICAgICAgIHNlcnZpY2VOYW1lID0gc3ViRVBSLnNlcnZpY2VOYW1lOw0KLSAgICAgICAgICAgIGFueSA9IHN1YkVQUi5hbnk7DQotICAgICAgICAgICAgb3RoZXJBdHRyaWJ1dGVzLnB1dEFsbChzdWJFUFIub3RoZXJBdHRyaWJ1dGVzKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoImVuZHBvaW50UmVmQ29uc3RydWN0aW9uRmFpbHVyZTIiLCANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUudG9TdHJpbmcoKSkpOw0KLSAgICAgICAgfSAgICAgICAgDQotICAgIH0NCi0gICAgDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKFJlc3VsdCByZXN1bHQpIHsNCi0gICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiZW5kcG9pbnRSZWZlcmVuY2VXcml0ZUVycm9yMSIpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBNYXJzaGFsbGVyIG0gPSBqYXhiQ29udGV4dC5jcmVhdGVNYXJzaGFsbGVyKCk7DQotICAgICAgICAgICAgbS5zZXRQcm9wZXJ0eShNYXJzaGFsbGVyLkpBWEJfRlJBR01FTlQsIEJvb2xlYW4uVFJVRSk7DQotICAgICAgICAgICAgbS5tYXJzaGFsKHRoaXMsIHJlc3VsdCk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJlbmRwb2ludFJlZmVyZW5jZVdyaXRlRXJyb3IxIiwgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnRvU3RyaW5nKCkpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIDxwPkphdmEgY2xhc3MgZm9yIEF0dHJpYnV0ZWRVUkkgY29tcGxleCB0eXBlLg0KLSAgICAgKiANCi0gICAgICogPHA+VGhlIGZvbGxvd2luZyBzY2hlbWEgZnJhZ21lbnQgc3BlY2lmaWVzIHRoZSBleHBlY3RlZCBjb250ZW50IGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBjbGFzcy4NCi0gICAgICogDQotICAgICAqIDxwcmU+DQotICAgICAqICZsdDtjb21wbGV4VHlwZSBuYW1lPSJBdHRyaWJ1dGVkVVJJIj4NCi0gICAgICogICAmbHQ7c2ltcGxlQ29udGVudD4NCi0gICAgICogICAgICZsdDtleHRlbnNpb24gYmFzZT0iJmx0O2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hPmFueVVSSSI+DQotICAgICAqICAgICAmbHQ7L2V4dGVuc2lvbj4NCi0gICAgICogICAmbHQ7L3NpbXBsZUNvbnRlbnQ+DQotICAgICAqICZsdDsvY29tcGxleFR5cGU+DQotICAgICAqIDwvcHJlPg0KLSAgICAgKiANCi0gICAgICogDQotICAgICAqLw0KLSAgICBAWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpDQotICAgIEBYbWxUeXBlKG5hbWUgPSAiQXR0cmlidXRlZFVSSSIsIHByb3BPcmRlciA9IHsNCi0gICAgICAgICJ2YWx1ZSINCi0gICAgfSkNCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQXR0cmlidXRlZFVSSSB7DQotDQotICAgICAgICBAWG1sVmFsdWUNCi0gICAgICAgIEBYbWxTY2hlbWFUeXBlKG5hbWUgPSAiYW55VVJJIikNCi0gICAgICAgIHByb3RlY3RlZCBTdHJpbmcgdmFsdWU7DQotICAgICAgICBAWG1sQW55QXR0cmlidXRlDQotICAgICAgICBwcml2YXRlIE1hcDxRTmFtZSwgU3RyaW5nPiBvdGhlckF0dHJpYnV0ZXMgPSBuZXcgSGFzaE1hcDxRTmFtZSwgU3RyaW5nPigpOw0KLSAgICAgICAgDQotICAgICAgICBwdWJsaWMgQXR0cmlidXRlZFVSSSgpIHsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIDxwPkphdmEgY2xhc3MgZm9yIFJlZmVyZW5jZVBhcmFtZXRlcnNUeXBlIGNvbXBsZXggdHlwZS4NCi0gICAgICogDQotICAgICAqIDxwPlRoZSBmb2xsb3dpbmcgc2NoZW1hIGZyYWdtZW50IHNwZWNpZmllcyB0aGUgZXhwZWN0ZWQgY29udGVudCBjb250YWluZWQgd2l0aGluIHRoaXMgY2xhc3MuDQotICAgICAqIA0KLSAgICAgKiA8cHJlPg0KLSAgICAgKiAmbHQ7Y29tcGxleFR5cGUgbmFtZT0iUmVmZXJlbmNlUGFyYW1ldGVyc1R5cGUiPg0KLSAgICAgKiAgICZsdDtjb21wbGV4Q29udGVudD4NCi0gICAgICogICAgICZsdDtyZXN0cmljdGlvbiBiYXNlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9YW55VHlwZSI+DQotICAgICAqICAgICAgICZsdDtzZXF1ZW5jZT4NCi0gICAgICogICAgICAgICAmbHQ7YW55Lz4NCi0gICAgICogICAgICAgJmx0Oy9zZXF1ZW5jZT4NCi0gICAgICogICAgICZsdDsvcmVzdHJpY3Rpb24+DQotICAgICAqICAgJmx0Oy9jb21wbGV4Q29udGVudD4NCi0gICAgICogJmx0Oy9jb21wbGV4VHlwZT4NCi0gICAgICogPC9wcmU+DQotICAgICAqIA0KLSAgICAgKiANCi0gICAgICovDQotICAgIEBYbWxBY2Nlc3NvclR5cGUoWG1sQWNjZXNzVHlwZS5GSUVMRCkNCi0gICAgQFhtbFR5cGUobmFtZSA9ICJSZWZlcmVuY2VQYXJhbWV0ZXJzVHlwZSIsIHByb3BPcmRlciA9IHsNCi0gICAgICAgICJhbnkiDQotICAgIH0pDQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFJlZmVyZW5jZVBhcmFtZXRlcnNUeXBlIHsNCi0NCi0gICAgICAgIEBYbWxBbnlFbGVtZW50KGxheCA9IHRydWUpDQotICAgICAgICBwcm90ZWN0ZWQgTGlzdDxPYmplY3Q+IGFueTsNCi0gICAgICAgIA0KLSAgICAgICAgcHVibGljIFJlZmVyZW5jZVBhcmFtZXRlcnNUeXBlKCkgew0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogPHA+SmF2YSBjbGFzcyBmb3IgUmVmZXJlbmNlUHJvcGVydGllc1R5cGUgY29tcGxleCB0eXBlLg0KLSAgICAgKiANCi0gICAgICogPHA+VGhlIGZvbGxvd2luZyBzY2hlbWEgZnJhZ21lbnQgc3BlY2lmaWVzIHRoZSBleHBlY3RlZCBjb250ZW50IGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBjbGFzcy4NCi0gICAgICogDQotICAgICAqIDxwcmU+DQotICAgICAqICZsdDtjb21wbGV4VHlwZSBuYW1lPSJSZWZlcmVuY2VQcm9wZXJ0aWVzVHlwZSI+DQotICAgICAqICAgJmx0O2NvbXBsZXhDb250ZW50Pg0KLSAgICAgKiAgICAgJmx0O3Jlc3RyaWN0aW9uIGJhc2U9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1hbnlUeXBlIj4NCi0gICAgICogICAgICAgJmx0O3NlcXVlbmNlPg0KLSAgICAgKiAgICAgICAgICZsdDthbnkvPg0KLSAgICAgKiAgICAgICAmbHQ7L3NlcXVlbmNlPg0KLSAgICAgKiAgICAgJmx0Oy9yZXN0cmljdGlvbj4NCi0gICAgICogICAmbHQ7L2NvbXBsZXhDb250ZW50Pg0KLSAgICAgKiAmbHQ7L2NvbXBsZXhUeXBlPg0KLSAgICAgKiA8L3ByZT4NCi0gICAgICogDQotICAgICAqIA0KLSAgICAgKi8NCi0gICAgQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKQ0KLSAgICBAWG1sVHlwZShuYW1lID0gIlJlZmVyZW5jZVByb3BlcnRpZXNUeXBlIiwgcHJvcE9yZGVyID0gew0KLSAgICAgICAgImFueSINCi0gICAgfSkNCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUmVmZXJlbmNlUHJvcGVydGllc1R5cGUgew0KLQ0KLSAgICAgICAgQFhtbEFueUVsZW1lbnQobGF4ID0gdHJ1ZSkNCi0gICAgICAgIHByb3RlY3RlZCBMaXN0PE9iamVjdD4gYW55Ow0KLSAgICAgICAgDQotICAgICAgICBwdWJsaWMgUmVmZXJlbmNlUHJvcGVydGllc1R5cGUoKSB7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiA8cD5KYXZhIGNsYXNzIGZvciBTZXJ2aWNlTmFtZVR5cGUgY29tcGxleCB0eXBlLg0KLSAgICAgKiANCi0gICAgICogPHA+VGhlIGZvbGxvd2luZyBzY2hlbWEgZnJhZ21lbnQgc3BlY2lmaWVzIHRoZSBleHBlY3RlZCBjb250ZW50IGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBjbGFzcy4NCi0gICAgICogDQotICAgICAqIDxwcmU+DQotICAgICAqICZsdDtjb21wbGV4VHlwZSBuYW1lPSJTZXJ2aWNlTmFtZVR5cGUiPg0KLSAgICAgKiAgICZsdDtzaW1wbGVDb250ZW50Pg0KLSAgICAgKiAgICAgJmx0O2V4dGVuc2lvbiBiYXNlPSImbHQ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWE+UU5hbWUiPg0KLSAgICAgKiAgICAgICAmbHQ7YXR0cmlidXRlIG5hbWU9IlBvcnROYW1lIiB0eXBlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9TkNOYW1lIiAvPg0KLSAgICAgKiAgICAgJmx0Oy9leHRlbnNpb24+DQotICAgICAqICAgJmx0Oy9zaW1wbGVDb250ZW50Pg0KLSAgICAgKiAmbHQ7L2NvbXBsZXhUeXBlPg0KLSAgICAgKiA8L3ByZT4NCi0gICAgICogDQotICAgICAqIA0KLSAgICAgKi8NCi0gICAgQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKQ0KLSAgICBAWG1sVHlwZShuYW1lID0gIlNlcnZpY2VOYW1lVHlwZSIsIHByb3BPcmRlciA9IHsNCi0gICAgICAgICJ2YWx1ZSINCi0gICAgfSkNCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU2VydmljZU5hbWVUeXBlIHsNCi0NCi0gICAgICAgIEBYbWxWYWx1ZQ0KLSAgICAgICAgcHJvdGVjdGVkIFFOYW1lIHZhbHVlOw0KLSAgICAgICAgQFhtbEF0dHJpYnV0ZShuYW1lID0gIlBvcnROYW1lIikNCi0gICAgICAgIEBYbWxKYXZhVHlwZUFkYXB0ZXIoQ29sbGFwc2VkU3RyaW5nQWRhcHRlci5jbGFzcykNCi0gICAgICAgIEBYbWxTY2hlbWFUeXBlKG5hbWUgPSAiTkNOYW1lIikNCi0gICAgICAgIHByb3RlY3RlZCBTdHJpbmcgcG9ydE5hbWU7DQotICAgICAgICBAWG1sQW55QXR0cmlidXRlDQotICAgICAgICBwcml2YXRlIE1hcDxRTmFtZSwgU3RyaW5nPiBvdGhlckF0dHJpYnV0ZXMgPSBuZXcgSGFzaE1hcDxRTmFtZSwgU3RyaW5nPigpOw0KLSAgICAgICAgDQotICAgICAgICBwdWJsaWMgU2VydmljZU5hbWVUeXBlKCkgew0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogPHA+SmF2YSBjbGFzcyBmb3IgQXR0cmlidXRlZFFOYW1lIGNvbXBsZXggdHlwZS4NCi0gICAgICogDQotICAgICAqIDxwPlRoZSBmb2xsb3dpbmcgc2NoZW1hIGZyYWdtZW50IHNwZWNpZmllcyB0aGUgZXhwZWN0ZWQgY29udGVudCBjb250YWluZWQgd2l0aGluIHRoaXMgY2xhc3MuDQotICAgICAqIA0KLSAgICAgKiA8cHJlPg0KLSAgICAgKiAmbHQ7Y29tcGxleFR5cGUgbmFtZT0iQXR0cmlidXRlZFFOYW1lIj4NCi0gICAgICogICAmbHQ7c2ltcGxlQ29udGVudD4NCi0gICAgICogICAgICZsdDtleHRlbnNpb24gYmFzZT0iJmx0O2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hPlFOYW1lIj4NCi0gICAgICogICAgICZsdDsvZXh0ZW5zaW9uPg0KLSAgICAgKiAgICZsdDsvc2ltcGxlQ29udGVudD4NCi0gICAgICogJmx0Oy9jb21wbGV4VHlwZT4NCi0gICAgICogPC9wcmU+DQotICAgICAqIA0KLSAgICAgKiANCi0gICAgICovDQotICAgIEBYbWxBY2Nlc3NvclR5cGUoWG1sQWNjZXNzVHlwZS5GSUVMRCkNCi0gICAgQFhtbFR5cGUobmFtZSA9ICJBdHRyaWJ1dGVkUU5hbWUiLCBwcm9wT3JkZXIgPSB7DQotICAgICAgICAidmFsdWUiDQotICAgIH0pDQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEF0dHJpYnV0ZWRRTmFtZSB7DQotDQotICAgICAgICBAWG1sVmFsdWUNCi0gICAgICAgIHByb3RlY3RlZCBRTmFtZSB2YWx1ZTsNCi0gICAgICAgIEBYbWxBbnlBdHRyaWJ1dGUNCi0gICAgICAgIHByaXZhdGUgTWFwPFFOYW1lLCBTdHJpbmc+IG90aGVyQXR0cmlidXRlcyA9IG5ldyBIYXNoTWFwPFFOYW1lLCBTdHJpbmc+KCk7DQotICAgICAgICANCi0gICAgICAgIHB1YmxpYyBBdHRyaWJ1dGVkUU5hbWUoKSB7DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvYWRkcmVzc2luZy9TdWJtaXNzaW9uRW5kcG9pbnRSZWZlcmVuY2VCdWlsZGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9hZGRyZXNzaW5nL1N1Ym1pc3Npb25FbmRwb2ludFJlZmVyZW5jZUJ1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTkzMjYyOC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9hZGRyZXNzaW5nL1N1Ym1pc3Npb25FbmRwb2ludFJlZmVyZW5jZUJ1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmFkZHJlc3Npbmc7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuRXhjZXB0aW9uRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5hZGRyZXNzaW5nLnV0aWwuRW5kcG9pbnRSZWZlcmVuY2VVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5pMThuLk1lc3NhZ2VzOw0KLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50Ow0KLQ0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOw0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi0vKioNCi0gKiBUaGlzIGNsYXNzIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBpbnN0YW5jZXMgb2Yge0BsaW5rIFN1Ym1pc3Npb25FbmRwb2ludFJlZmVyZW5jZX0uDQotICoNCi0gKiBAc2VlIGphdmF4LnhtbC53cy53c2FkZHJlc3NpbmcuVzNDRW5kcG9pbnRSZWZlcmVuY2VCdWlsZGVyDQotICovDQotcHVibGljIGZpbmFsIGNsYXNzIFN1Ym1pc3Npb25FbmRwb2ludFJlZmVyZW5jZUJ1aWxkZXIgew0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBFbGVtZW50W10gWkVST19MRU5HVEhfQVJSQVkgPSBuZXcgRWxlbWVudFswXTsNCi0NCi0JcHJpdmF0ZSBTdHJpbmcgYWRkcmVzczsNCi0gICAgcHJpdmF0ZSBRTmFtZSBzZXJ2aWNlTmFtZTsNCi0gICAgcHJpdmF0ZSBRTmFtZSBlbmRwb2ludE5hbWU7DQotICAgIHByaXZhdGUgU3RyaW5nIHdzZGxEb2N1bWVudExvY2F0aW9uOw0KLSAgICBwcml2YXRlIExpc3Q8RWxlbWVudD4gcmVmZXJlbmNlUGFyYW1ldGVyczsNCi0gICAgcHJpdmF0ZSBRTmFtZSBwb3J0VHlwZTsNCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBDb25zdHJ1Y3Rvcg0KLSAgICAgKg0KLSAgICAgKi8NCi0gICAgcHVibGljIFN1Ym1pc3Npb25FbmRwb2ludFJlZmVyZW5jZUJ1aWxkZXIoKSB7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBBZGQgdGhlIGFkZHJlc3MgVVJJIHRvIHVzZS4NCi0gICAgICogDQotICAgICAqIEBwYXJhbSBhZGRyZXNzIHRoZSBhZGRyZXNzIFVSSQ0KLSAgICAgKiBAcmV0dXJuIGFuIGluc3RhbmNlIG9mIDxjb2RlPlN1Ym1pc3Npb25FbmRwb2ludFJlZmVyZW5jZUJ1aWxkZXI8L2NvZGU+IHRoYXQgaGFzDQotICAgICAqIGJlZW4gdXBkYXRlZCBhcyBzcGVjaWZpZWQuDQotICAgICAqLw0KLSAgICBwdWJsaWMgU3VibWlzc2lvbkVuZHBvaW50UmVmZXJlbmNlQnVpbGRlciBhZGRyZXNzKFN0cmluZyBhZGRyZXNzKSB7DQotICAgICAgICB0aGlzLmFkZHJlc3MgPSBhZGRyZXNzOw0KLSAgICAgICAgcmV0dXJuIHRoaXM7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBBZGQgdGhlIFdTREwgc2VydmljZSBuYW1lIG9mIHRoZSBlbmRwb2ludCB0aGF0IHRoZSBlbmRwb2ludCByZWZlcmVuY2Ugd2lsbCB0YXJnZXQuDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gc2VydmljZU5hbWUgdGhlIFdTREwgc2VydmljZSBuYW1lDQotICAgICAqIEByZXR1cm4gYW4gaW5zdGFuY2Ugb2YgPGNvZGU+U3VibWlzc2lvbkVuZHBvaW50UmVmZXJlbmNlQnVpbGRlcjwvY29kZT4gdGhhdCBoYXMNCi0gICAgICogYmVlbiB1cGRhdGVkIGFzIHNwZWNpZmllZC4NCi0gICAgICovDQotICAgIHB1YmxpYyBTdWJtaXNzaW9uRW5kcG9pbnRSZWZlcmVuY2VCdWlsZGVyIHNlcnZpY2VOYW1lKFFOYW1lIHNlcnZpY2VOYW1lKSB7DQotICAgICAgICB0aGlzLnNlcnZpY2VOYW1lID0gc2VydmljZU5hbWU7DQotICAgICAgICByZXR1cm4gdGhpczsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIEFkZCB0aGUgV1NETCBwb3J0IG5hbWUgb2YgdGhlIGVuZHBvaW50IHRoYXQgdGhlIGVuZHBvaW50IHJlZmVyZW5jZSB3aWxsIHRhcmdldC4NCi0gICAgICogVGhlIFdTREwgcG9ydCBuYW1lIGNhbiBvbmx5IGJlIHNldCBhZnRlciB0aGUgV1NETCBzZXJ2aWNlIG5hbWUgaGFzIGJlZW4gc2V0Lg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGVuZHBvaW50TmFtZSB0aGUgV1NETCBwb3J0IG5hbWUNCi0gICAgICogQHJldHVybiBhbiBpbnN0YW5jZSBvZiA8Y29kZT5TdWJtaXNzaW9uRW5kcG9pbnRSZWZlcmVuY2VCdWlsZGVyPC9jb2RlPiB0aGF0IGhhcw0KLSAgICAgKiBiZWVuIHVwZGF0ZWQgYXMgc3BlY2lmaWVkLg0KLSAgICAgKi8NCi0gICAgcHVibGljIFN1Ym1pc3Npb25FbmRwb2ludFJlZmVyZW5jZUJ1aWxkZXIgZW5kcG9pbnROYW1lKFFOYW1lIGVuZHBvaW50TmFtZSkgew0KLSAgICAgICAgaWYgKHRoaXMuc2VydmljZU5hbWUgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiZW5kcG9pbnRRTmFtZVNldEVycm9yIiwgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZHBvaW50TmFtZS50b1N0cmluZygpKSk7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIHRoaXMuZW5kcG9pbnROYW1lID0gZW5kcG9pbnROYW1lOw0KLSAgICAgICAgcmV0dXJuIHRoaXM7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBBZGQgdGhlIFVSSSBmcm9tIHdoZXJlIHRoZSBXU0RMIGZvciB0aGUgZW5kcG9pbnQgdGhhdCB0aGUgZW5kcG9pbnQgcmVmZXJlbmNlIHdpbGwNCi0gICAgICogdGFyZ2V0IGNhbiBiZSByZXRyaWV2ZWQuDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gd3NkbERvY3VtZW50TG9jYXRpb24gdGhlIGxvY2F0aW9uIFVSSSBvZiB0aGUgV1NETA0KLSAgICAgKiBAcmV0dXJuIGFuIGluc3RhbmNlIG9mIDxjb2RlPlN1Ym1pc3Npb25FbmRwb2ludFJlZmVyZW5jZUJ1aWxkZXI8L2NvZGU+IHRoYXQgaGFzDQotICAgICAqIGJlZW4gdXBkYXRlZCBhcyBzcGVjaWZpZWQuDQotICAgICAqLw0KLSAgICBwdWJsaWMgU3VibWlzc2lvbkVuZHBvaW50UmVmZXJlbmNlQnVpbGRlciB3c2RsRG9jdW1lbnRMb2NhdGlvbihTdHJpbmcgd3NkbERvY3VtZW50TG9jYXRpb24pIHsNCi0gICAgICAgIHRoaXMud3NkbERvY3VtZW50TG9jYXRpb24gPSB3c2RsRG9jdW1lbnRMb2NhdGlvbjsNCi0gICAgICAgIHJldHVybiB0aGlzOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogQWRkIHJlZmVyZW5jZSBwcm9wZXJ0aWVzLiBUaGVzZSB3aWxsIGFwcGVhciBpbiB0aGUgZW5kcG9pbnQgcmVmZXJlbmNlIGFzIHJlZmVyZW5jZQ0KLSAgICAgKiBwYXJhbWV0ZXJzLg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIHJlZmVyZW5jZVByb3BlcnR5IHRoZSByZWZlcmVuY2UgcHJvcGVydHkNCi0gICAgICogQHJldHVybiBhbiBpbnN0YW5jZSBvZiA8Y29kZT5TdWJtaXNzaW9uRW5kcG9pbnRSZWZlcmVuY2VCdWlsZGVyPC9jb2RlPiB0aGF0IGhhcw0KLSAgICAgKiBiZWVuIHVwZGF0ZWQgYXMgc3BlY2lmaWVkLg0KLSAgICAgKi8NCi0gICAgcHVibGljIFN1Ym1pc3Npb25FbmRwb2ludFJlZmVyZW5jZUJ1aWxkZXIgcmVmZXJlbmNlUHJvcGVydHkoRWxlbWVudCByZWZlcmVuY2VQcm9wZXJ0eSkgew0KLSAgICAgICAgaWYgKHJlZmVyZW5jZVByb3BlcnR5ID09IG51bGwpIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoInJlZmVyZW5jZVByb3BlcnR5TnVsbEVyciIpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgaWYgKHRoaXMucmVmZXJlbmNlUGFyYW1ldGVycyA9PSBudWxsKSB7DQotICAgICAgICAgICAgdGhpcy5yZWZlcmVuY2VQYXJhbWV0ZXJzID0gbmV3IEFycmF5TGlzdDxFbGVtZW50PigpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICB0aGlzLnJlZmVyZW5jZVBhcmFtZXRlcnMuYWRkKHJlZmVyZW5jZVByb3BlcnR5KTsNCi0gICAgICAgIHJldHVybiB0aGlzOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogQWRkIHJlZmVyZW5jZSBwYXJhbWV0ZXJzLg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIHJlZmVyZW5jZVBhcmFtZXRlciB0aGUgcmVmZXJlbmNlIHBhcmFtZXRlcg0KLSAgICAgKiBAcmV0dXJuIGFuIGluc3RhbmNlIG9mIDxjb2RlPlN1Ym1pc3Npb25FbmRwb2ludFJlZmVyZW5jZUJ1aWxkZXI8L2NvZGU+IHRoYXQgaGFzDQotICAgICAqIGJlZW4gdXBkYXRlZCBhcyBzcGVjaWZpZWQuDQotICAgICAqLw0KLSAgICBwdWJsaWMgU3VibWlzc2lvbkVuZHBvaW50UmVmZXJlbmNlQnVpbGRlciByZWZlcmVuY2VQYXJhbWV0ZXIoRWxlbWVudCByZWZlcmVuY2VQYXJhbWV0ZXIpIHsNCi0gICAgICAgIGlmIChyZWZlcmVuY2VQYXJhbWV0ZXIgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgicmVmZXJlbmNlUGFyYW1ldGVyTnVsbEVyciIpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgaWYgKHRoaXMucmVmZXJlbmNlUGFyYW1ldGVycyA9PSBudWxsKSB7DQotICAgICAgICAgICAgdGhpcy5yZWZlcmVuY2VQYXJhbWV0ZXJzID0gbmV3IEFycmF5TGlzdDxFbGVtZW50PigpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICB0aGlzLnJlZmVyZW5jZVBhcmFtZXRlcnMuYWRkKHJlZmVyZW5jZVBhcmFtZXRlcik7DQotICAgICAgICByZXR1cm4gdGhpczsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIEFkZCB0aGUgbmFtZSBvZiB0aGUgV1NETCBwb3J0IHR5cGUuDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gcG9ydFR5cGUgdGhlIFdTREwgcG9ydCB0eXBlIG5hbWUNCi0gICAgICogQHJldHVybiBhbiBpbnN0YW5jZSBvZiA8Y29kZT5TdWJtaXNzaW9uRW5kcG9pbnRSZWZlcmVuY2VCdWlsZGVyPC9jb2RlPiB0aGF0IGhhcw0KLSAgICAgKiBiZWVuIHVwZGF0ZWQgYXMgc3BlY2lmaWVkLg0KLSAgICAgKi8NCi0gICAgcHVibGljIFN1Ym1pc3Npb25FbmRwb2ludFJlZmVyZW5jZUJ1aWxkZXIgcG9ydFR5cGUoUU5hbWUgcG9ydFR5cGUpIHsNCi0gICAgICAgIHRoaXMucG9ydFR5cGUgPSBwb3J0VHlwZTsNCi0gICAgICAgIHJldHVybiB0aGlzOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogQ29uc3RydWN0IGFuIGluc3RhbmNlIG9mIDxjb2RlPkVuZHBvaW50UmVmZXJlbmNlPC9jb2RlPiBiYXNlZCBvbiB0aGUgdmFsdWVzDQotICAgICAqIHNwZWNpZmllZC4NCi0gICAgICogDQotICAgICAqIEByZXR1cm4gYW4gaW5zdGFuY2Ugb2YgPGNvZGU+U3VibWlzc2lvbkVuZHBvaW50UmVmZXJlbmNlPC9jb2RlPg0KLSAgICAgKi8NCi0gICAgcHVibGljIFN1Ym1pc3Npb25FbmRwb2ludFJlZmVyZW5jZSBidWlsZCgpIHsNCi0gICAgCVN1Ym1pc3Npb25FbmRwb2ludFJlZmVyZW5jZSBzdWJtaXNzaW9uRVBSID0gbnVsbDsNCi0gICAgCQ0KLSAgICAgICAgU3RyaW5nIGFkZHJlc3NpbmdOYW1lc3BhY2UgPQ0KLSAgICAgICAgCUVuZHBvaW50UmVmZXJlbmNlVXRpbHMuZ2V0QWRkcmVzc2luZ05hbWVzcGFjZShTdWJtaXNzaW9uRW5kcG9pbnRSZWZlcmVuY2UuY2xhc3MpOyAgICAJDQotICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2UgYXhpczJFUFIgPQ0KLSAgICAgICAgCUVuZHBvaW50UmVmZXJlbmNlVXRpbHMuY3JlYXRlQXhpczJFbmRwb2ludFJlZmVyZW5jZShhZGRyZXNzLCBzZXJ2aWNlTmFtZSwgZW5kcG9pbnROYW1lLCB3c2RsRG9jdW1lbnRMb2NhdGlvbiwgYWRkcmVzc2luZ05hbWVzcGFjZSk7DQotICAgIAkNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgaWYgKHJlZmVyZW5jZVBhcmFtZXRlcnMgIT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgRW5kcG9pbnRSZWZlcmVuY2VVdGlscy5hZGRSZWZlcmVuY2VQYXJhbWV0ZXJzKGF4aXMyRVBSLCByZWZlcmVuY2VQYXJhbWV0ZXJzLnRvQXJyYXkoWkVST19MRU5HVEhfQVJSQVkpKTsNCi0gICAgICAgIAkNCi0gICAgICAgICAgICBpZiAocG9ydFR5cGUgIT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgRW5kcG9pbnRSZWZlcmVuY2VVdGlscy5hZGRJbnRlcmZhY2UoYXhpczJFUFIsIHBvcnRUeXBlLCBhZGRyZXNzaW5nTmFtZXNwYWNlKTsNCi0gICAgICAgIAkNCi0gICAgICAgICAgICBzdWJtaXNzaW9uRVBSID0NCi0gICAgICAgICAgICAgICAgKFN1Ym1pc3Npb25FbmRwb2ludFJlZmVyZW5jZSkgRW5kcG9pbnRSZWZlcmVuY2VVdGlscy5jb252ZXJ0RnJvbUF4aXMyKGF4aXMyRVBSLCBhZGRyZXNzaW5nTmFtZXNwYWNlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oDQotICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoImVuZHBvaW50UmVmQ29uc3RydWN0aW9uRmFpbHVyZTIiLCBlLnRvU3RyaW5nKCkpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgcmV0dXJuIHN1Ym1pc3Npb25FUFI7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQotICAgICAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOw0KLSAgICAgICAgDQotICAgICAgICBpZiAoYWRkcmVzcyAhPSBudWxsKSB7DQotICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiQWRkcmVzczogIikuYXBwZW5kKGFkZHJlc3MpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICBpZiAoc2VydmljZU5hbWUgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIiwgU2VydmljZSBuYW1lOiAiKS5hcHBlbmQoc2VydmljZU5hbWUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICBpZiAoZW5kcG9pbnROYW1lICE9IG51bGwpIHsNCi0gICAgICAgICAgICBidWZmZXIuYXBwZW5kKCIsIEVuZHBvaW50IG5hbWU6ICIpLmFwcGVuZChlbmRwb2ludE5hbWUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICBpZiAocG9ydFR5cGUgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIiwgUG9ydCB0eXBlOiAiKS5hcHBlbmQocG9ydFR5cGUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICBpZiAocmVmZXJlbmNlUGFyYW1ldGVycyAhPSBudWxsKSB7DQotICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiLCBSZWZlcmVuY2UgcGFyYW1ldGVyczogIikuYXBwZW5kKHJlZmVyZW5jZVBhcmFtZXRlcnMpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICBpZiAod3NkbERvY3VtZW50TG9jYXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIiwgV1NETCBsb2NhdGlvbjogIikuYXBwZW5kKHdzZGxEb2N1bWVudExvY2F0aW9uKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9hZGRyZXNzaW5nL2ZhY3RvcnkvQXhpczJFbmRwb2ludFJlZmVyZW5jZUZhY3RvcnkuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2FkZHJlc3NpbmcvZmFjdG9yeS9BeGlzMkVuZHBvaW50UmVmZXJlbmNlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTQ1MzhhLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2FkZHJlc3NpbmcvZmFjdG9yeS9BeGlzMkVuZHBvaW50UmVmZXJlbmNlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5hZGRyZXNzaW5nLmZhY3Rvcnk7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZTsNCi0NCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi0NCi0vKioNCi0gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgZmFjdG9yaWVzIHRoYXQgY2FuIGJlIHVzZSB0byBjcmVhdGUgaW5zdGFuY2VzIG9mDQotICoge0BsaW5rIEVuZHBvaW50UmVmZXJlbmNlfSB0aGF0IGNhbiB1bHRpbWF0ZWx5IGJlIGNvbnZlcnRlZCBpbnRvIGluc3RhbmNlcw0KLSAqIG9mIHtAbGluayBqYXZheC54bWwud3MuRW5kcG9pbnRSZWZlcmVuY2V9IHRoYXQgYXJlIHN1aXRhYmxlIHRvIGJlIHJldHVybmVkDQotICogdmlhIHRoZSBhcHByb3ByaWF0ZSBKQVgtV1MgMi4xIEFQSSBtZXRob2RzLg0KLSAqIA0KLSAqLw0KLXB1YmxpYyBpbnRlcmZhY2UgQXhpczJFbmRwb2ludFJlZmVyZW5jZUZhY3Rvcnkgew0KLSAgICAvKioNCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIDxjb2RlPkVuZHBvaW50UmVmZXJlbmNlPC9jb2RlPiB3aXRoIHRoZSBzcGVjaWZpZWQgYWRkcmVzcy4NCi0gICAgICogDQotICAgICAqIEBwYXJhbSBhZGRyZXNzIHRoZSBhZGRyZXNzIFVSSSB0byB1c2UuIEl0IGNhbm5vdCBiZSBudWxsLg0KLSAgICAgKiBAcmV0dXJuIGFuIGluc3RhbmNlIG9mIDxjb2RlPkVuZHBvaW50UmVmZXJlbmNlPC9jb2RlPi4NCi0gICAgICovDQotICAgIHB1YmxpYyBFbmRwb2ludFJlZmVyZW5jZSBjcmVhdGVFbmRwb2ludFJlZmVyZW5jZShTdHJpbmcgYWRkcmVzcyk7DQotICAgIA0KLSAgICAvKioNCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIDxjb2RlPkVuZHBvaW50UmVmZXJlbmNlPC9jb2RlPiB0aGF0IHRhcmdldHMgdGhlIGVuZHBvaW50DQotICAgICAqIGlkZW50aWZpZWQgYnkgdGhlIHNwZWNpZmllZCBXU0RMIHNlcnZpY2UgbmFtZSBhbmQgZW5kcG9pbnQgbmFtZS4NCi0gICAgICogDQotICAgICAqIEBwYXJhbSBzZXJ2aWNlTmFtZSB0aGUgV1NETCBzZXJ2aWNlIG5hbWUNCi0gICAgICogQHBhcmFtIGVuZHBvaW50IHRoZSBXU0RMIHBvcnQgbmFtZQ0KLSAgICAgKiBAcmV0dXJuIGFuIGluc3RhbmNlIG9mIDxjb2RlPkVuZHBvaW50UmVmZXJlbmNlPC9jb2RlPiB0aGF0IHRhcmdldHMgdGhlIHNwZWNpZmllZA0KLSAgICAgKiBlbmRwb2ludA0KLSAgICAgKi8NCi0gICAgcHVibGljIEVuZHBvaW50UmVmZXJlbmNlIGNyZWF0ZUVuZHBvaW50UmVmZXJlbmNlKFFOYW1lIHNlcnZpY2VOYW1lLCBRTmFtZSBlbmRwb2ludCk7DQotICAgIA0KLSAgICAvKioNCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIDxjb2RlPkVuZHBvaW50UmVmZXJlbmNlPC9jb2RlPi4gSWYgdGhlIGFkZHJlc3MgaXMgc3BlY2lmaWVkDQotICAgICAqIHRoZW4gaXQgd2lsbCBiZSB1c2VkLiBJZiB0aGUgYWRkcmVzcyBpcyBudWxsLCBidXQgdGhlIFdTREwgc2VydmljZSBuYW1lIGFuZCBwb3J0DQotICAgICAqIG5hbWUgYXJlIHNwZWNpZmllZCB0aGVuIHRoZXkgd2lsbCBiZSB1c2VkIHRvIHRhcmdldCB0aGUgc3BlY2lmaWVkIGVuZHBvaW50LiBFaXRoZXINCi0gICAgICogdGhlIGFkZHJlc3MgVVJJLCBvciB0aGUgV1NETCBzZXJ2aWNlIG5hbWUgYW5kIHBvcnQgbmFtZSBtdXN0IGJlIHNwZWNpZmllZC4NCi0gICAgICogDQotICAgICAqIEBwYXJhbSBhZGRyZXNzIHRoZSBhZGRyZXNzIFVSSSB0byB1c2UsIGlmIHNwZWNpZmllZA0KLSAgICAgKiBAcGFyYW0gc2VydmljZU5hbWUgdGhlIFdTREwgc2VydmljZSBuYW1lLCBpZiBzcGVjaWZpZWQNCi0gICAgICogQHBhcmFtIHBvcnROYW1lIHRoZSBXU0RMIHBvcnQgbmFtZSwgaWYgc3BlY2lmaWVkDQotICAgICAqIEBwYXJhbSB3c2RsRG9jdW1lbnRMb2NhdGlvbiB0aGUgVVJJIGZyb20gd2hlcmUgdGhlIFdTREwgZm9yIHRoZSBlbmRwb2ludCBjYW4gYmUNCi0gICAgICogcmV0cmlldmVkLCBpZiBzcGVjaWZpZWQuDQotICAgICAqIEBwYXJhbSBhZGRyZXNzaW5nTmFtZXNwYWNlIHRoZSBpbnRlbmRlZCBXUy1BZGRyZXNzaW5nIG5hbWVzcGFjZSB0aGF0IHRoZSA8Y29kZT4NCi0gICAgICogRW5kcG9pbnRSZWZlbmNlPC9jb2RlPiBzaG91bGQgY29tcGx5IHdpdGguDQotICAgICAqIEByZXR1cm4gYW4gaW5zdGFuY2Ugb2YgPGNvZGU+RW5kcG9pbnRSZWZlcmVuY2U8L2NvZGU+Lg0KLSAgICAgKi8NCi0gICAgcHVibGljIEVuZHBvaW50UmVmZXJlbmNlIGNyZWF0ZUVuZHBvaW50UmVmZXJlbmNlKFN0cmluZyBhZGRyZXNzLCBRTmFtZSBzZXJ2aWNlTmFtZSwgUU5hbWUgcG9ydE5hbWUsIFN0cmluZyB3c2RsRG9jdW1lbnRMb2NhdGlvbiwgU3RyaW5nIGFkZHJlc3NpbmdOYW1lc3BhY2UpOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9hZGRyZXNzaW5nL2ZhY3RvcnkvSkFYV1NFbmRwb2ludFJlZmVyZW5jZUZhY3RvcnkuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2FkZHJlc3NpbmcvZmFjdG9yeS9KQVhXU0VuZHBvaW50UmVmZXJlbmNlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWEyNGRjLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2FkZHJlc3NpbmcvZmFjdG9yeS9KQVhXU0VuZHBvaW50UmVmZXJlbmNlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5hZGRyZXNzaW5nLmZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJFeGNlcHRpb247DQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuRW5kcG9pbnRSZWZlcmVuY2U7DQotDQotLyoqDQotICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGZhY3RvcmllcyB0aGF0IGNhbiBiZSB1c2VkIHRvIGdlbmVyYXRlIGluc3RhbmNlcyBvZiB0aGUNCi0gKiB7QGxpbmsgRW5kcG9pbnRSZWZlcmVuY2V9Lg0KLSAqLw0KLXB1YmxpYyBpbnRlcmZhY2UgSkFYV1NFbmRwb2ludFJlZmVyZW5jZUZhY3Rvcnkgew0KLSAgICAvKioNCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIGEgc3VwcG9ydGVkIHN1YmNsYXNzIG9mIDxjb2RlPkVuZHBvaW50UmVmZXJlbmNlPC9jb2RlPi4NCi0gICAgICogDQotICAgICAqIEBwYXJhbSBlcHJJbmZvc2V0IHRoZSBlbmRwb2ludCByZWZlcmVuY2UNCi0gICAgICogQHJldHVybiBhbiBpbnN0YW5jZSBvZiA8Y29kZT5FbmRwb2ludFJlZmVyZW5jZTwvY29kZT4uDQotICAgICAqIEB0aHJvd3MgSkFYQkV4Y2VwdGlvbg0KLSAgICAgKi8NCi0gICAgcHVibGljIEVuZHBvaW50UmVmZXJlbmNlIGNyZWF0ZUVuZHBvaW50UmVmZXJlbmNlKFNvdXJjZSBlcHJJbmZvc2V0KSB0aHJvd3MgSkFYQkV4Y2VwdGlvbjsNCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBNYXAgdGhlIHNwZWNpZmllZCBjbGFzcyB0byBhIHN1cHBvcnRlZCBXUy1BZGRyZXNzaW5nIG5hbWVzcGFjZS4NCi0gICAgICogDQotICAgICAqIEBwYXJhbSA8VD4gYSBzdWJjbGFzcyBvZiA8Y29kZT5FbmRwb2ludFJlZmVyZW5jZTwvY29kZT4uDQotICAgICAqIEBwYXJhbSBjbGF6eiB0aGUgY2xhc3MuDQotICAgICAqIEByZXR1cm4gdGhlIFdTLUFkZHJlc3NpbmcgbmFtZXNwYWNlIHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBjbGFzcy4NCi0gICAgICovDQotICAgIHB1YmxpYyA8VCBleHRlbmRzIEVuZHBvaW50UmVmZXJlbmNlPiBTdHJpbmcgZ2V0QWRkcmVzc2luZ05hbWVzcGFjZShDbGFzczxUPiBjbGF6eik7DQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2FkZHJlc3NpbmcvZmFjdG9yeS9pbXBsL0F4aXMyRW5kcG9pbnRSZWZlcmVuY2VGYWN0b3J5SW1wbC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvYWRkcmVzc2luZy9mYWN0b3J5L2ltcGwvQXhpczJFbmRwb2ludFJlZmVyZW5jZUZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxMjVlOWMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvYWRkcmVzc2luZy9mYWN0b3J5L2ltcGwvQXhpczJFbmRwb2ludFJlZmVyZW5jZUZhY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5hZGRyZXNzaW5nLmZhY3RvcnkuaW1wbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLkV4Y2VwdGlvbkZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuYWRkcmVzc2luZy5mYWN0b3J5LkF4aXMyRW5kcG9pbnRSZWZlcmVuY2VGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmFkZHJlc3NpbmcudXRpbC5FbmRwb2ludENvbnRleHRNYXA7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuYWRkcmVzc2luZy51dGlsLkVuZHBvaW50Q29udGV4dE1hcE1hbmFnZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuYWRkcmVzc2luZy51dGlsLkVuZHBvaW50S2V5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmFkZHJlc3NpbmcudXRpbC5FbmRwb2ludFJlZmVyZW5jZVV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmkxOG4uTWVzc2FnZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MudXRpbC5XU0RMNEpXcmFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnV0aWwuV1NETFdyYXBwZXI7DQotDQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotaW1wb3J0IGphdmEubmV0LlVSTDsNCi0NCi0vKioNCi0gKiBUaGlzIGNsYXNzIHByb2R1Y2VzIGluc3RhbmNlcyBvZiB7QGxpbmsgRW5kcG9pbnRSZWZlcmVuY2V9Lg0KLSAqDQotICovDQotcHVibGljIGNsYXNzIEF4aXMyRW5kcG9pbnRSZWZlcmVuY2VGYWN0b3J5SW1wbCBpbXBsZW1lbnRzIEF4aXMyRW5kcG9pbnRSZWZlcmVuY2VGYWN0b3J5IHsNCi0gICAgcHVibGljIEF4aXMyRW5kcG9pbnRSZWZlcmVuY2VGYWN0b3J5SW1wbCgpIHsNCi0gICAgCXN1cGVyKCk7DQotICAgIH0NCi0gICAgDQotICAgIC8qDQotICAgICAqICAobm9uLUphdmFkb2MpDQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5hZGRyZXNzaW5nLmZhY3RvcnkuQXhpczJFbmRwb2ludFJlZmVyZW5jZUZhY3RvcnkjY3JlYXRlRW5kcG9pbnRSZWZlcmVuY2UoamF2YS5sYW5nLlN0cmluZykNCi0gICAgICovDQotICAgIHB1YmxpYyBFbmRwb2ludFJlZmVyZW5jZSBjcmVhdGVFbmRwb2ludFJlZmVyZW5jZShTdHJpbmcgYWRkcmVzcykgew0KLSAgICAgICAgaWYgKGFkZHJlc3MgPT0gbnVsbCkNCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaGUgZW5kcG9pbnQgYWRkcmVzcyBVUkkgaXMgbnVsbC4iKTsNCi0NCi0gICAgICAgIHJldHVybiBuZXcgRW5kcG9pbnRSZWZlcmVuY2UoYWRkcmVzcyk7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogIChub24tSmF2YWRvYykNCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmFkZHJlc3NpbmcuZmFjdG9yeS5BeGlzMkVuZHBvaW50UmVmZXJlbmNlRmFjdG9yeSNjcmVhdGVFbmRwb2ludFJlZmVyZW5jZShqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lLCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lKQ0KLSAgICAgKi8NCi0gICAgcHVibGljIEVuZHBvaW50UmVmZXJlbmNlIGNyZWF0ZUVuZHBvaW50UmVmZXJlbmNlKFFOYW1lIHNlcnZpY2VOYW1lLCBRTmFtZSBlbmRwb2ludCkgew0KLSAgICAgICAgRW5kcG9pbnRLZXkga2V5ID0gbmV3IEVuZHBvaW50S2V5KHNlcnZpY2VOYW1lLCBlbmRwb2ludCk7DQotICAgICAgICBFbmRwb2ludENvbnRleHRNYXAgbWFwID0gRW5kcG9pbnRDb250ZXh0TWFwTWFuYWdlci5nZXRFbmRwb2ludENvbnRleHRNYXAoKTsNCi0gICAgICAgIA0KLSAgICAgICAgaWYgKCFtYXAuY29udGFpbnNLZXkoa2V5KSkNCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJVbmFibGUgdG8gbG9jYXRlIGEgZGVwbG95ZWQgc2VydmljZSB0aGF0IG1hcHMgdG8gdGhlIHJlcXVlc3RlZCBlbmRwb2ludCwgIiArIGtleSk7DQotICAgICAgICANCi0gICAgICAgIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlID0gKEF4aXNTZXJ2aWNlKSBtYXAuZ2V0KGtleSk7DQotICAgICAgICBTdHJpbmcgYWRkcmVzcyA9IG51bGw7DQotICAgICAgICANCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgYWRkcmVzcyA9IGF4aXNTZXJ2aWNlLmdldEVQUnMoKVswXTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIC8vZG8gbm90aGluZw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICByZXR1cm4gY3JlYXRlRW5kcG9pbnRSZWZlcmVuY2UoYWRkcmVzcyk7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogIChub24tSmF2YWRvYykNCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmFkZHJlc3NpbmcuZmFjdG9yeS5BeGlzMkVuZHBvaW50UmVmZXJlbmNlRmFjdG9yeSNjcmVhdGVFbmRwb2ludFJlZmVyZW5jZShqYXZhLmxhbmcuU3RyaW5nLCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lLCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQ0KLSAgICAgKi8NCi0gICAgcHVibGljIEVuZHBvaW50UmVmZXJlbmNlIGNyZWF0ZUVuZHBvaW50UmVmZXJlbmNlKFN0cmluZyBhZGRyZXNzLCBRTmFtZSBzZXJ2aWNlTmFtZSwgUU5hbWUgcG9ydE5hbWUsIFN0cmluZyB3c2RsRG9jdW1lbnRMb2NhdGlvbiwgU3RyaW5nIGFkZHJlc3NpbmdOYW1lc3BhY2UpIHsNCi0gICAgICAgIEVuZHBvaW50UmVmZXJlbmNlIGF4aXMyRVBSID0gbnVsbDsNCi0gICAgICAgIA0KLSAgICAgICAgaWYgKGFkZHJlc3MgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIGlmIChzZXJ2aWNlTmFtZSA9PSBudWxsICYmIHBvcnROYW1lICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigNCi0gICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoImF4aXNFbmRwb2ludFJlZmVyZW5jZUZhY3RvcnlFcnIiLCANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydE5hbWUudG9TdHJpbmcoKSkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBheGlzMkVQUiA9IGNyZWF0ZUVuZHBvaW50UmVmZXJlbmNlKGFkZHJlc3MpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZiAoc2VydmljZU5hbWUgIT0gbnVsbCAmJiBwb3J0TmFtZSAhPSBudWxsKSB7DQotICAgICAgICAgICAgYXhpczJFUFIgPSBjcmVhdGVFbmRwb2ludFJlZmVyZW5jZShzZXJ2aWNlTmFtZSwgcG9ydE5hbWUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigNCi0gICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoImF4aXNFbmRwb2ludFJlZmVyZW5jZUZhY3RvcnlFcnIyIikpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICAvL1RPRE8gSWYgbm8gc2VydmljZSBuYW1lIGFuZCBwb3J0IG5hbWUgYXJlIHNwZWNpZmllZCwgYnV0IHRoZSB3c2RsIGxvY2F0aW9uIGlzDQotICAgICAgICAvL3NwZWNpZmllZCwgYW5kIHRoZSBXU0RMIG9ubHkgY29udGFpbnMgb25lIHNlcnZpY2UgYW5kIG9uZSBwb3J0IHRoZW4gbWF5YmUgd2UNCi0gICAgICAgIC8vc2hvdWxkIHNpbXBseSB1c2UgdGhvc2UuICAgICAgICANCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgLy9UaGlzIGNvZGUgaXMgbG9jYXRlIGhlcmUgaW5zdGVhZCBvZiBpbiB0aGUgY3JlYXRlRW5kcG9pbnRSZWZlcmVuY2UoUU5hbWUsIFFOYW1lKQ0KLSAgICAgICAgICAgIC8vbWV0aG9kIHNvIHRoYXQgaWYgdGhlIGFkZHJlc3MgaXMgYWxzbyBzcGVjaWZpZWQgdGhlIEVQUiBtZXRhZGF0YSB3aWxsIHN0aWxsIGJlDQotICAgICAgICAgICAgLy9maWxsZWQgaW4gY29ycmVjdGx5Lg0KLSAgICAgICAgICAgIEVuZHBvaW50UmVmZXJlbmNlVXRpbHMuYWRkU2VydmljZShheGlzMkVQUiwgc2VydmljZU5hbWUsIHBvcnROYW1lLCBhZGRyZXNzaW5nTmFtZXNwYWNlKTsNCi0NCi0gICAgICAgICAgICBpZiAod3NkbERvY3VtZW50TG9jYXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIAlVUkwgd3NkbFVSTCA9IG5ldyBVUkwod3NkbERvY3VtZW50TG9jYXRpb24pOw0KLSAgICAgICAgICAgIAkvLyBUaGlzIGlzIGEgdGVtcG9yYXJ5IHVzYWdlLCBzbyB1c2UgYSBtZW1vcnkgc2Vuc2l0aXZlIHdyYXBwZXINCi0gICAgICAgICAgICAgICAgV1NETFdyYXBwZXIgd3JhcHBlciA9IG5ldyBXU0RMNEpXcmFwcGVyKHdzZGxVUkwsIHRydWUsIDIpOw0KLSAgICAgICAgICAgIAkNCi0gICAgICAgICAgICAgICAgaWYgKHNlcnZpY2VOYW1lICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmICh3cmFwcGVyLmdldFNlcnZpY2Uoc2VydmljZU5hbWUpID09IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRNZXNzYWdlKCJNaXNzaW5nU2VydmljZU5hbWUiLCANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlTmFtZS50b1N0cmluZygpLCANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c2RsRG9jdW1lbnRMb2NhdGlvbikpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHBvcnROYW1lICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSBwb3J0cyA9IHdyYXBwZXIuZ2V0UG9ydHMoc2VydmljZU5hbWUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwb3J0TG9jYWxOYW1lID0gcG9ydE5hbWUuZ2V0TG9jYWxQYXJ0KCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBmb3VuZCA9IGZhbHNlOw0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwb3J0cyAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIHBvcnQgOiBwb3J0cykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvcnQuZXF1YWxzKHBvcnRMb2NhbE5hbWUpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoIk1pc3NpbmdQb3J0TmFtZSIsIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0TmFtZS50b1N0cmluZygpLCANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NkbERvY3VtZW50TG9jYXRpb24pKTsgDQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIEVuZHBvaW50UmVmZXJlbmNlVXRpbHMuYWRkTG9jYXRpb24oYXhpczJFUFIsIHBvcnROYW1lLmdldE5hbWVzcGFjZVVSSSgpLCB3c2RsRG9jdW1lbnRMb2NhdGlvbiwgYWRkcmVzc2luZ05hbWVzcGFjZSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlzZSkgew0KLSAgICAgICAgCXRocm93IGlzZTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkuDQotICAgICAgICAgICAgICBtYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJlbmRwb2ludFJlZkNyZWF0aW9uRXJyb3IiKSwgZSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gYXhpczJFUFI7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvYWRkcmVzc2luZy9mYWN0b3J5L2ltcGwvSkFYV1NFbmRwb2ludFJlZmVyZW5jZUZhY3RvcnlJbXBsLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9hZGRyZXNzaW5nL2ZhY3RvcnkvaW1wbC9KQVhXU0VuZHBvaW50UmVmZXJlbmNlRmFjdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY4ZmEyMy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9hZGRyZXNzaW5nL2ZhY3RvcnkvaW1wbC9KQVhXU0VuZHBvaW50UmVmZXJlbmNlRmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuYWRkcmVzc2luZy5mYWN0b3J5LmltcGw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5BZGRyZXNzaW5nQ29uc3RhbnRzLkZpbmFsOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuQWRkcmVzc2luZ0NvbnN0YW50cy5TdWJtaXNzaW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5FeGNlcHRpb25GYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmFkZHJlc3NpbmcuU3VibWlzc2lvbkVuZHBvaW50UmVmZXJlbmNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmFkZHJlc3NpbmcuZmFjdG9yeS5KQVhXU0VuZHBvaW50UmVmZXJlbmNlRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5pMThuLk1lc3NhZ2VzOw0KLQ0KLWltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCQ29udGV4dDsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuVW5tYXJzaGFsbGVyOw0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLkVuZHBvaW50UmVmZXJlbmNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXgueG1sLndzLndzYWRkcmVzc2luZy5XM0NFbmRwb2ludFJlZmVyZW5jZTsNCi1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uOw0KLQ0KLS8qKg0KLSAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBnZW5lcmF0ZSBpbnN0YW5jZXMgb2YgdGhlIGZvbGxvd2luZyBzdWJjbGFzc2VzIG9mDQotICoge0BsaW5rIEVuZHBvaW50UmVmZXJlbmNlfS4NCi0gKg0KLSAqIEBzZWUgamF2YXgueG1sLndzLndzYWRkcmVzc2luZy5XM0NFbmRwb2ludFJlZmVyZW5jZQ0KLSAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5hZGRyZXNzaW5nLlN1Ym1pc3Npb25FbmRwb2ludFJlZmVyZW5jZQ0KLSAqLw0KLXB1YmxpYyBjbGFzcyBKQVhXU0VuZHBvaW50UmVmZXJlbmNlRmFjdG9yeUltcGwgaW1wbGVtZW50cyBKQVhXU0VuZHBvaW50UmVmZXJlbmNlRmFjdG9yeSB7DQotICAgIHByaXZhdGUgSkFYQkNvbnRleHQgamF4YkNvbnRleHQ7DQotDQotICAgIC8qKg0KLSAgICAgKiBDb25zdHJ1Y3Rvcg0KLSAgICAgKi8NCi0gICAgcHVibGljIEpBWFdTRW5kcG9pbnRSZWZlcmVuY2VGYWN0b3J5SW1wbCgpIHsNCi0gICAgICAgIHN1cGVyKCk7DQotDQotICAgICAgICB0cnkgeyANCi0gICAgICAgICAgICBqYXhiQ29udGV4dCA9KEpBWEJDb250ZXh0KQ0KLSAgICAgICAgICAgICAgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoDQotICAgICAgICAgICAgICAgICBuZXcgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbigpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHRocm93cyBKQVhCRXhjZXB0aW9uIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEpBWEJDb250ZXh0Lm5ld0luc3RhbmNlKFczQ0VuZHBvaW50UmVmZXJlbmNlLmNsYXNzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3VibWlzc2lvbkVuZHBvaW50UmVmZXJlbmNlLmNsYXNzKTsNCi0gICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICB9KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoImpheGJDb250ZXh0RmFpbHVyZSIsIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS50b1N0cmluZygpKSk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIC8qDQotICAgICAqICAobm9uLUphdmFkb2MpDQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5hZGRyZXNzaW5nLmZhY3RvcnkuSkFYV1NFbmRwb2ludFJlZmVyZW5jZUZhY3RvcnkjY3JlYXRlRW5kcG9pbnRSZWZlcmVuY2UoamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2UpDQotICAgICAqLw0KLSAgICBwdWJsaWMgRW5kcG9pbnRSZWZlcmVuY2UgY3JlYXRlRW5kcG9pbnRSZWZlcmVuY2UoU291cmNlIGVwckluZm9zZXQpIHRocm93cyBKQVhCRXhjZXB0aW9uIHsNCi0gICAgICAgIFVubWFyc2hhbGxlciB1bSA9IGpheGJDb250ZXh0LmNyZWF0ZVVubWFyc2hhbGxlcigpOw0KLSAgICAgICAgcmV0dXJuIChFbmRwb2ludFJlZmVyZW5jZSkgdW0udW5tYXJzaGFsKGVwckluZm9zZXQpOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqICAobm9uLUphdmFkb2MpDQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5hZGRyZXNzaW5nLmZhY3RvcnkuSkFYV1NFbmRwb2ludFJlZmVyZW5jZUZhY3RvcnkjZ2V0QWRkcmVzc2luZ05hbWVzcGFjZShqYXZhLmxhbmcuQ2xhc3MpDQotICAgICAqLw0KLSAgICBwdWJsaWMgPFQgZXh0ZW5kcyBFbmRwb2ludFJlZmVyZW5jZT4gU3RyaW5nIGdldEFkZHJlc3NpbmdOYW1lc3BhY2UoQ2xhc3M8VD4gY2xhenopIHsNCi0gICAgICAgIFN0cmluZyBhZGRyZXNzaW5nTmFtZXNwYWNlID0gbnVsbDsNCi0gICAgICAgIA0KLSAgICAgICAgaWYgKFczQ0VuZHBvaW50UmVmZXJlbmNlLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oY2xhenopKSB7DQotICAgICAgICAgICAgYWRkcmVzc2luZ05hbWVzcGFjZSA9IEZpbmFsLldTQV9OQU1FU1BBQ0U7DQotICAgICAgICB9IGVsc2UgaWYgKFN1Ym1pc3Npb25FbmRwb2ludFJlZmVyZW5jZS5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGNsYXp6KSkgew0KLSAgICAgICAgICAgIGFkZHJlc3NpbmdOYW1lc3BhY2UgPSBTdWJtaXNzaW9uLldTQV9OQU1FU1BBQ0U7DQotICAgICAgICB9IGVsc2UgIHsNCi0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoInVua25vd25DbGFzc1R5cGUiLCANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXp6LnRvU3RyaW5nKCkpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgcmV0dXJuIGFkZHJlc3NpbmdOYW1lc3BhY2U7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvYWRkcmVzc2luZy9taWdyYXRvci9FbmRwb2ludENvbnRleHRNYXBNaWdyYXRvci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvYWRkcmVzc2luZy9taWdyYXRvci9FbmRwb2ludENvbnRleHRNYXBNaWdyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzI2Mzc5Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2FkZHJlc3NpbmcvbWlncmF0b3IvRW5kcG9pbnRDb250ZXh0TWFwTWlncmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuYWRkcmVzc2luZy5taWdyYXRvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5hZGRyZXNzaW5nLnV0aWwuRW5kcG9pbnRDb250ZXh0TWFwOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuYWRkcmVzc2luZy51dGlsLkVuZHBvaW50Q29udGV4dE1hcE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLlRocmVhZENvbnRleHRNaWdyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLldTRExDb25zdGFudHM7Ci0KLS8qKgotICogVGhpcyBjbGFzcyB3aWxsIGVuYWJsZSB0aGUgSkFYLVdTIDIuMSBBUEkgbWV0aG9kcyB0byBjcmVhdGUgaW5zdGFuY2VzIG9mCi0gKiB7QGxpbmsgamF2YXgueG1sLndzLkVuZHBvaW50UmVmZXJlbmNlfSB0aGF0IHRhcmdldCBhIHBhcnRpY3VsYXIgd2ViIHNlcnZpY2UKLSAqIGVuZHBvaW50LCBpZGVudGlmaWVkIGJ5IHNwZWNpZnlpbmcgdGhlIFdTREwgc2VydmljZSBuYW1lIGFuZCBwb3J0IG5hbWUgb2YgdGhlCi0gKiBlbmRwb2ludCwgdG8gd29yayBjb3JyZWN0bHkuIFRoaXMgaXMgYWNoaWV2ZWQgYnkgZW5hYmxpbmcgdGhlIGltcGxlbWVudGF0aW9uIG9mIAotICoge0BsaW5rIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuYWRkcmVzc2luZy5mYWN0b3J5LkF4aXMyRW5kcG9pbnRSZWZlcmVuY2VGYWN0b3J5fQotICogdG8gcmV0cmlldmUgdGhlIGNvbnRleHQgaXQgbmVlZHMgZnJvbSB0aGUgaW52b2tpbmcgdGhyZWFkLiBUaGUgaW5zdGFuY2VzIG9mCi0gKiB7QGxpbmsgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlfSB0aGF0IGl0IHByb2R1Y2VzIGNhbgotICogdGhlbiBjb252ZXJ0ZWQgdG8gaW5zdGFuY2VzIG9mIHtAbGluayBqYXZheC54bWwud3MuRW5kcG9pbnRSZWZlcmVuY2V9LCBhcwotICogbmVlZGVkLgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBFbmRwb2ludENvbnRleHRNYXBNaWdyYXRvciBpbXBsZW1lbnRzIFRocmVhZENvbnRleHRNaWdyYXRvciB7Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuVGhyZWFkQ29udGV4dE1pZ3JhdG9yI21pZ3JhdGVDb250ZXh0VG9UaHJlYWQob3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG1pZ3JhdGVDb250ZXh0VG9UaHJlYWQoTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQpCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgLy9Pbmx5IG1ha2UgdGhlIGNvbnRleHQgbWFwIGF2YWlsYWJsZSBpZiB3ZSBoYXZlIGFuIGluYm91bmQgcmVxdWVzdAotICAgICAgICAvL21lc3NhZ2UsIGluIHRoZSBzZXJ2ZXIuCi0gICAgICAgIEF4aXNPcGVyYXRpb24gYXhpc09wZXJhdGlvbiA9IG1lc3NhZ2VDb250ZXh0LmdldEF4aXNPcGVyYXRpb24oKTsKLSAgICAgICAgU3RyaW5nIG1lcCA9IGF4aXNPcGVyYXRpb24uZ2V0TWVzc2FnZUV4Y2hhbmdlUGF0dGVybigpOwotICAgICAgICBpbnQgbWVwQ29uc3RhbnQgPSBVdGlscy5nZXRBeGlzU3BlY2lmTUVQQ29uc3RhbnQobWVwKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChtZXBDb25zdGFudCA9PSBXU0RMQ29uc3RhbnRzLk1FUF9DT05TVEFOVF9JTl9PTkxZIHx8Ci0gICAgICAgICAgICBtZXBDb25zdGFudCA9PSBXU0RMQ29uc3RhbnRzLk1FUF9DT05TVEFOVF9JTl9PVVQgfHwKLSAgICAgICAgICAgIG1lcENvbnN0YW50ID09IFdTRExDb25zdGFudHMuTUVQX0NPTlNUQU5UX0lOX09QVElPTkFMX09VVCB8fAotICAgICAgICAgICAgbWVwQ29uc3RhbnQgPT0gV1NETENvbnN0YW50cy5NRVBfQ09OU1RBTlRfUk9CVVNUX0lOX09OTFkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEVuZHBvaW50Q29udGV4dE1hcCBtYXAgPSAoRW5kcG9pbnRDb250ZXh0TWFwKSAKLSAgICAgICAgICAgICAgICBtZXNzYWdlQ29udGV4dC5nZXRDb25maWd1cmF0aW9uQ29udGV4dCgpLmdldFByb3BlcnR5KENvbnN0YW50cy5FTkRQT0lOVF9DT05URVhUX01BUCk7Ci0gICAgICAgICAgICBFbmRwb2ludENvbnRleHRNYXBNYW5hZ2VyLnNldEVuZHBvaW50Q29udGV4dE1hcChtYXApOwotICAgICAgICB9ICAgICAgICAKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuVGhyZWFkQ29udGV4dE1pZ3JhdG9yI2NsZWFudXBUaHJlYWQob3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNsZWFudXBUaHJlYWQoTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQpIHsKLSAgICAgICAgLy9Pbmx5IGNsZWFuIHVwIGlmIHdlIGFyZSBpbmJvdW5kIHRvIHRoZSBzZXJ2ZXIuCi0gICAgICAgIEF4aXNPcGVyYXRpb24gYXhpc09wZXJhdGlvbiA9IG1lc3NhZ2VDb250ZXh0LmdldEF4aXNPcGVyYXRpb24oKTsKLSAgICAgICAgU3RyaW5nIG1lcCA9IGF4aXNPcGVyYXRpb24uZ2V0TWVzc2FnZUV4Y2hhbmdlUGF0dGVybigpOwotICAgICAgICBpbnQgbWVwQ29uc3RhbnQgPSBVdGlscy5nZXRBeGlzU3BlY2lmTUVQQ29uc3RhbnQobWVwKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChtZXBDb25zdGFudCA9PSBXU0RMQ29uc3RhbnRzLk1FUF9DT05TVEFOVF9JTl9PTkxZIHx8Ci0gICAgICAgICAgICBtZXBDb25zdGFudCA9PSBXU0RMQ29uc3RhbnRzLk1FUF9DT05TVEFOVF9JTl9PVVQgfHwKLSAgICAgICAgICAgIG1lcENvbnN0YW50ID09IFdTRExDb25zdGFudHMuTUVQX0NPTlNUQU5UX0lOX09QVElPTkFMX09VVCB8fAotICAgICAgICAgICAgbWVwQ29uc3RhbnQgPT0gV1NETENvbnN0YW50cy5NRVBfQ09OU1RBTlRfUk9CVVNUX0lOX09OTFkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEVuZHBvaW50Q29udGV4dE1hcE1hbmFnZXIuc2V0RW5kcG9pbnRDb250ZXh0TWFwKG51bGwpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi51dGlsLlRocmVhZENvbnRleHRNaWdyYXRvciNtaWdyYXRlVGhyZWFkVG9Db250ZXh0KG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBtaWdyYXRlVGhyZWFkVG9Db250ZXh0KE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0KQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIC8vTm90aGluZyB0byBkby4KLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuVGhyZWFkQ29udGV4dE1pZ3JhdG9yI2NsZWFudXBDb250ZXh0KG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjbGVhbnVwQ29udGV4dChNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCkgewotICAgICAgICAvL05vdGhpbmcgdG8gZG8uCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9hZGRyZXNzaW5nL3BhY2thZ2UtaW5mby5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvYWRkcmVzc2luZy9wYWNrYWdlLWluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBlOTlkYS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9hZGRyZXNzaW5nL3BhY2thZ2UtaW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLUBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFNjaGVtYShuYW1lc3BhY2UgPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOC9hZGRyZXNzaW5nIiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudEZvcm1EZWZhdWx0ID0gamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxOc0Zvcm0uUVVBTElGSUVELA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbiA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA4L2FkZHJlc3NpbmciKQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5hZGRyZXNzaW5nOw0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2FkZHJlc3NpbmcvdXRpbC9FbmRwb2ludENvbnRleHRNYXAuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2FkZHJlc3NpbmcvdXRpbC9FbmRwb2ludENvbnRleHRNYXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDVlNTVmYy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9hZGRyZXNzaW5nL3V0aWwvRW5kcG9pbnRDb250ZXh0TWFwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuYWRkcmVzc2luZy51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudEhhc2hNYXA7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBzdG9yZXMgdGhlIGNvbnRleHQgbmVlZGVkIHRvIGNvcnJlY3RseSBwcm9kdWNlIGluc3RhbmNlcyBvZgotICoge0BsaW5rIGphdmF4LnhtbC53cy5FbmRwb2ludFJlZmVyZW5jZX0gZm9yIGEgcGFydGljdWxhciB3ZWIgc2VydmljZSBlbmRwb2ludAotICogaWRlbnRpZmllZCBieSBhbiB7QGxpbmsgRW5kcG9pbnRLZXl9LgotICoKLSAqLwotcHVibGljIGNsYXNzIEVuZHBvaW50Q29udGV4dE1hcCBleHRlbmRzIENvbmN1cnJlbnRIYXNoTWFwPEVuZHBvaW50S2V5LCBPYmplY3Q+IHsKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA2OTQ1Mzk3MzQ4MjU1MDA1OTlMOwotCi0gICAgcHVibGljIEVuZHBvaW50Q29udGV4dE1hcCgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9hZGRyZXNzaW5nL3V0aWwvRW5kcG9pbnRDb250ZXh0TWFwTWFuYWdlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvYWRkcmVzc2luZy91dGlsL0VuZHBvaW50Q29udGV4dE1hcE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjc0M2ZkYi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9hZGRyZXNzaW5nL3V0aWwvRW5kcG9pbnRDb250ZXh0TWFwTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmFkZHJlc3NpbmcudXRpbDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gbWFuYWdlIHRoZSBhc3NvY2lhdGlvbiBiZXR3ZWVuIGFuIHtAbGluayBFbmRwb2ludENvbnRleHRNYXB9Ci0gKiBhbmQgYSB0aHJlYWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBFbmRwb2ludENvbnRleHRNYXBNYW5hZ2VyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBUaHJlYWRMb2NhbDxFbmRwb2ludENvbnRleHRNYXA+IHZhcmlhYmxlID0KLSAgICAgICAgbmV3IEluaGVyaXRhYmxlVGhyZWFkTG9jYWw8RW5kcG9pbnRDb250ZXh0TWFwPigpOwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgRW5kcG9pbnRDb250ZXh0TWFwIHNldEVuZHBvaW50Q29udGV4dE1hcChFbmRwb2ludENvbnRleHRNYXAgbmV3TWFwKSB7Ci0gICAgICAgIEVuZHBvaW50Q29udGV4dE1hcCBvbGRNYXAgPSB2YXJpYWJsZS5nZXQoKTsKLSAgICAgICAgdmFyaWFibGUuc2V0KG5ld01hcCk7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gb2xkTWFwOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIEVuZHBvaW50Q29udGV4dE1hcCBnZXRFbmRwb2ludENvbnRleHRNYXAoKSB7Ci0gICAgICAgIEVuZHBvaW50Q29udGV4dE1hcCBjdXJyZW50TWFwID0gdmFyaWFibGUuZ2V0KCk7Ci0gICAgICAgIAotICAgICAgICBpZiAoY3VycmVudE1hcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBjdXJyZW50TWFwID0gZ2V0RGVmYXVsdEVuZHBvaW50TWFwKCk7Ci0gICAgICAgICAgICBzZXRFbmRwb2ludENvbnRleHRNYXAoY3VycmVudE1hcCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBjdXJyZW50TWFwOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBFbmRwb2ludENvbnRleHRNYXAgZ2V0RGVmYXVsdEVuZHBvaW50TWFwKCkgewotICAgICAgICByZXR1cm4gbmV3IEVuZHBvaW50Q29udGV4dE1hcCgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2FkZHJlc3NpbmcvdXRpbC9FbmRwb2ludEtleS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvYWRkcmVzc2luZy91dGlsL0VuZHBvaW50S2V5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkZjBhN2YuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvYWRkcmVzc2luZy91dGlsL0VuZHBvaW50S2V5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmFkZHJlc3NpbmcudXRpbDsNCi0NCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi0NCi0vKioNCi0gKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gaWRlbnRpZnkgYSBwYXJ0aWN1bGFyIHdlYiBzZXJ2aWNlIGVuZHBvaW50IGJhc2VkIG9uDQotICogdGhlIGNvbWJpbmF0aW9uIG9mIFdTREwgc2VydmljZSBuYW1lIGFuZCBwb3J0IG5hbWUuDQotICoNCi0gKi8NCi1wdWJsaWMgY2xhc3MgRW5kcG9pbnRLZXkgew0KLSAgICBwcml2YXRlIGZpbmFsIFFOYW1lIHNlcnZpY2U7DQotICAgIHByaXZhdGUgZmluYWwgUU5hbWUgZW5kcG9pbnQ7DQotICAgIA0KLSAgICBwdWJsaWMgRW5kcG9pbnRLZXkoUU5hbWUgc2VydmljZSwgUU5hbWUgZW5kcG9pbnQpIHsNCi0gICAgICAgIGlmIChzZXJ2aWNlID09IG51bGwpDQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHNlcnZpY2UgcW5hbWUgY2Fubm90IGJlIG51bGwuIik7DQotICAgICAgICANCi0gICAgICAgIGlmIChlbmRwb2ludCA9PSBudWxsKQ0KLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBlbmRwb2ludCBxbmFtZSBjYW5ub3QgYmUgbnVsbC4iKTsNCi0gICAgICAgIA0KLSAgICAgICAgdGhpcy5zZXJ2aWNlID0gc2VydmljZTsNCi0gICAgICAgIHRoaXMuZW5kcG9pbnQgPSBlbmRwb2ludDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUU5hbWUgZ2V0RW5kcG9pbnQoKSB7DQotICAgICAgICByZXR1cm4gZW5kcG9pbnQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFFOYW1lIGdldFNlcnZpY2UoKSB7DQotICAgICAgICByZXR1cm4gc2VydmljZTsNCi0gICAgfQ0KLQ0KLSAgICAvKiAobm9uLUphdmFkb2MpDQotICAgICAqIEdlbmVyYXRlZCBieSBFY2xpcHNlIC0gc3VnZ2VzdCByZS1nZW5lcmF0aW9uIGlmIGNsYXNzIGNoYW5nZXMNCi0gICAgICovDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgew0KLSAgICAgICAgaWYgKHRoaXMgPT0gb2JqKQ0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgaWYgKG9iaiA9PSBudWxsKQ0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIGlmIChnZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKQ0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIGZpbmFsIEVuZHBvaW50S2V5IG90aGVyID0gKEVuZHBvaW50S2V5KSBvYmo7DQotICAgICAgICBpZiAoZW5kcG9pbnQgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIGlmIChvdGhlci5lbmRwb2ludCAhPSBudWxsKQ0KLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9IGVsc2UgaWYgKCFlbmRwb2ludC5lcXVhbHMob3RoZXIuZW5kcG9pbnQpKQ0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIGlmIChzZXJ2aWNlID09IG51bGwpIHsNCi0gICAgICAgICAgICBpZiAob3RoZXIuc2VydmljZSAhPSBudWxsKQ0KLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9IGVsc2UgaWYgKCFzZXJ2aWNlLmVxdWFscyhvdGhlci5zZXJ2aWNlKSkNCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICAvKiAobm9uLUphdmFkb2MpDQotICAgICAqIEdlbmVyYXRlZCBieSBFY2xpcHNlIC0gc3VnZ2VzdCByZS1nZW5lcmF0aW9uIGlmIGNsYXNzIGNoYW5nZXMNCi0gICAgICovDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgew0KLSAgICAgICAgZmluYWwgaW50IFBSSU1FID0gMzE7DQotICAgICAgICBpbnQgcmVzdWx0ID0gMTsNCi0gICAgICAgIHJlc3VsdCA9IFBSSU1FICogcmVzdWx0ICsgKChlbmRwb2ludCA9PSBudWxsKSA/IDAgOiBlbmRwb2ludC5oYXNoQ29kZSgpKTsNCi0gICAgICAgIHJlc3VsdCA9IFBSSU1FICogcmVzdWx0ICsgKChzZXJ2aWNlID09IG51bGwpID8gMCA6IHNlcnZpY2UuaGFzaENvZGUoKSk7DQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KLSAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsNCi0gICAgICAgIGJ1ZmZlci5hcHBlbmQoIlNlcnZpY2U6ICIpOw0KLSAgICAgICAgYnVmZmVyLmFwcGVuZChzZXJ2aWNlKTsNCi0gICAgICAgIGJ1ZmZlci5hcHBlbmQoIiwgUG9ydDogIik7DQotICAgICAgICBidWZmZXIuYXBwZW5kKGVuZHBvaW50KTsNCi0gICAgICAgIA0KLSAgICAgICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2FkZHJlc3NpbmcvdXRpbC9FbmRwb2ludFJlZmVyZW5jZVV0aWxzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9hZGRyZXNzaW5nL3V0aWwvRW5kcG9pbnRSZWZlcmVuY2VVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDU1MjllLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2FkZHJlc3NpbmcvdXRpbC9FbmRwb2ludFJlZmVyZW5jZVV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5hZGRyZXNzaW5nLnV0aWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2VIZWxwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5tZXRhZGF0YS5JbnRlcmZhY2VOYW1lOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcubWV0YWRhdGEuU2VydmljZU5hbWU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5tZXRhZGF0YS5XU0RMTG9jYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuYWRkcmVzc2luZy5mYWN0b3J5LkF4aXMyRW5kcG9pbnRSZWZlcmVuY2VGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmFkZHJlc3NpbmcuZmFjdG9yeS5KQVhXU0VuZHBvaW50UmVmZXJlbmNlRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5yZWdpc3RyeS5GYWN0b3J5UmVnaXN0cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5YTUxVdGlsczsNCi1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsNCi0NCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7DQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdDsNCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtU291cmNlOw0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsNCi0NCi1wdWJsaWMgZmluYWwgY2xhc3MgRW5kcG9pbnRSZWZlcmVuY2VVdGlscyB7DQotICAgIA0KLSAgICBwcml2YXRlIHN0YXRpYyBPTUZhY3Rvcnkgb21GYWN0b3J5ID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCk7DQotDQotICAgIHByaXZhdGUgRW5kcG9pbnRSZWZlcmVuY2VVdGlscygpIHsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogQ29udmVydCBmcm9tIGEge0BsaW5rIEVuZHBvaW50UmVmZXJlbmNlfSB0byBhDQotICAgICAqIHN1YmNsYXNzIG9mIHtAbGluayBqYXZheC54bWwud3MuRW5kcG9pbnRSZWZlcmVuY2V9Lg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGF4aXMyRVBSDQotICAgICAqIEBwYXJhbSBhZGRyZXNzaW5nTmFtZXNwYWNlDQotICAgICAqIEByZXR1cm4NCi0gICAgICogQHRocm93cyBFeGNlcHRpb24NCi0gICAgICovDQotICAgIHB1YmxpYyBzdGF0aWMgamF2YXgueG1sLndzLkVuZHBvaW50UmVmZXJlbmNlIGNvbnZlcnRGcm9tQXhpczIoRW5kcG9pbnRSZWZlcmVuY2UgYXhpczJFUFIsIFN0cmluZyBhZGRyZXNzaW5nTmFtZXNwYWNlKQ0KLSAgICB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIFFOYW1lIHFuYW1lID0gbmV3IFFOYW1lKGFkZHJlc3NpbmdOYW1lc3BhY2UsICJFbmRwb2ludFJlZmVyZW5jZSIsICJ3c2EiKTsNCi0gICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPQ0KLSAgICAgICAgICAgIEVuZHBvaW50UmVmZXJlbmNlSGVscGVyLnRvT00ob21GYWN0b3J5LCBheGlzMkVQUiwgcW5hbWUsIGFkZHJlc3NpbmdOYW1lc3BhY2UpOw0KLSAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7DQotICAgICAgICBvbUVsZW1lbnQuc2VyaWFsaXplKGJhb3MpOw0KLSAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmFpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpOyAgICAgICAgDQotICAgICAgICBTb3VyY2UgZXBySW5mb3NldCA9IG5ldyBTdHJlYW1Tb3VyY2UoYmFpcyk7DQotICAgICAgICANCi0gICAgICAgIHJldHVybiBjb252ZXJ0RnJvbVNvdXJjZShlcHJJbmZvc2V0KTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogQ29udmVydCBmcm9tIGEge0BsaW5rIFNvdXJjZX0gdG8gYQ0KLSAgICAgKiBzdWJjbGFzcyBvZiB7QGxpbmsgamF2YXgueG1sLndzLkVuZHBvaW50UmVmZXJlbmNlfS4NCi0gICAgICogDQotICAgICAqIEBwYXJhbSBlcHJJbmZvc2V0DQotICAgICAqIEByZXR1cm4NCi0gICAgICogQHRocm93cyBFeGNlcHRpb24NCi0gICAgICovDQotICAgIHB1YmxpYyBzdGF0aWMgamF2YXgueG1sLndzLkVuZHBvaW50UmVmZXJlbmNlIGNvbnZlcnRGcm9tU291cmNlKFNvdXJjZSBlcHJJbmZvc2V0KQ0KLSAgICB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIEpBWFdTRW5kcG9pbnRSZWZlcmVuY2VGYWN0b3J5IGZhY3RvcnkgPSAoSkFYV1NFbmRwb2ludFJlZmVyZW5jZUZhY3RvcnkpDQotICAgICAgICAgICAgRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoSkFYV1NFbmRwb2ludFJlZmVyZW5jZUZhY3RvcnkuY2xhc3MpOw0KLSAgICAgICAgDQotICAgICAgICByZXR1cm4gZmFjdG9yeS5jcmVhdGVFbmRwb2ludFJlZmVyZW5jZShlcHJJbmZvc2V0KTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIENvbnZlcnQgZnJvbSBhIHtAbGluayBqYXZheC54bWwud3MuRW5kcG9pbnRSZWZlcmVuY2V9IHRvIGEgYW4gaW5zdGFuY2Ugb2YNCi0gICAgICoge0BsaW5rIEVuZHBvaW50UmVmZXJlbmNlfS4NCi0gICAgICogDQotICAgICAqIEBwYXJhbSBheGlzMkVQUg0KLSAgICAgKiBAcGFyYW0gamF4d3NFUFINCi0gICAgICogQHJldHVybiB0aGUgV1MtQWRkcmVzc2luZyBuYW1lc3BhY2Ugb2YgdGhlIDxjb2RlPmphdmF4LnhtbC53cy5FbmRwb2ludFJlZmVyZW5jZTwvY29kZT4uDQotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9BeGlzMihFbmRwb2ludFJlZmVyZW5jZSBheGlzMkVQUiwgamF2YXgueG1sLndzLkVuZHBvaW50UmVmZXJlbmNlIGpheHdzRVBSKQ0KLSAgICB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOw0KLSAgICAgICAgamF4d3NFUFIud3JpdGVUbyhuZXcgU3RyZWFtUmVzdWx0KGJhb3MpKTsNCi0gICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGJhaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKTsNCi0gICAgICAgIE9NRWxlbWVudCBlcHJFbGVtZW50ID0gKE9NRWxlbWVudCkgWE1MVXRpbHMudG9PTShiYWlzKTsNCi0gICAgICAgIA0KLSAgICAgICAgcmV0dXJuIEVuZHBvaW50UmVmZXJlbmNlSGVscGVyLmZyb21PTShheGlzMkVQUiwgZXByRWxlbWVudCk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gPFQ+DQotICAgICAqIEBwYXJhbSBjbGF6eg0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIDxUIGV4dGVuZHMgamF2YXgueG1sLndzLkVuZHBvaW50UmVmZXJlbmNlPiBTdHJpbmcgZ2V0QWRkcmVzc2luZ05hbWVzcGFjZShDbGFzczxUPiBjbGF6eikgew0KLSAgICAgICAgSkFYV1NFbmRwb2ludFJlZmVyZW5jZUZhY3RvcnkgZmFjdG9yeSA9IChKQVhXU0VuZHBvaW50UmVmZXJlbmNlRmFjdG9yeSkNCi0gICAgICAgICAgICBGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShKQVhXU0VuZHBvaW50UmVmZXJlbmNlRmFjdG9yeS5jbGFzcyk7DQotICAgICAgICANCi0gICAgICAgIHJldHVybiBmYWN0b3J5LmdldEFkZHJlc3NpbmdOYW1lc3BhY2UoY2xhenopOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSBhZGRyZXNzDQotICAgICAqIEBwYXJhbSBzZXJ2aWNlTmFtZQ0KLSAgICAgKiBAcGFyYW0gcG9ydE5hbWUNCi0gICAgICogQHBhcmFtIHdzZGxEb2N1bWVudExvY2F0aW9uDQotICAgICAqIEBwYXJhbSBhZGRyZXNzaW5nTmFtZXNwYWNlDQotICAgICAqIEByZXR1cm4NCi0gICAgICovDQotICAgIHB1YmxpYyBzdGF0aWMgRW5kcG9pbnRSZWZlcmVuY2UgY3JlYXRlQXhpczJFbmRwb2ludFJlZmVyZW5jZShTdHJpbmcgYWRkcmVzcywgUU5hbWUgc2VydmljZU5hbWUsIFFOYW1lIHBvcnROYW1lLCBTdHJpbmcgd3NkbERvY3VtZW50TG9jYXRpb24sIFN0cmluZyBhZGRyZXNzaW5nTmFtZXNwYWNlKSB7DQotICAgICAgICBBeGlzMkVuZHBvaW50UmVmZXJlbmNlRmFjdG9yeSBmYWN0b3J5ID0gKEF4aXMyRW5kcG9pbnRSZWZlcmVuY2VGYWN0b3J5KQ0KLSAgICAgICAgICAgIEZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KEF4aXMyRW5kcG9pbnRSZWZlcmVuY2VGYWN0b3J5LmNsYXNzKTsNCi0gICAgICAgIA0KLSAgICAgICAgcmV0dXJuIGZhY3RvcnkuY3JlYXRlRW5kcG9pbnRSZWZlcmVuY2UoYWRkcmVzcywgc2VydmljZU5hbWUsIHBvcnROYW1lLCB3c2RsRG9jdW1lbnRMb2NhdGlvbiwgYWRkcmVzc2luZ05hbWVzcGFjZSk7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGFkZHJlc3MNCi0gICAgICogQHJldHVybg0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyBFbmRwb2ludFJlZmVyZW5jZSBjcmVhdGVBeGlzMkVuZHBvaW50UmVmZXJlbmNlKFN0cmluZyBhZGRyZXNzKSB7DQotICAgICAgICBBeGlzMkVuZHBvaW50UmVmZXJlbmNlRmFjdG9yeSBmYWN0b3J5ID0gKEF4aXMyRW5kcG9pbnRSZWZlcmVuY2VGYWN0b3J5KQ0KLSAgICAgICAgICAgIEZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KEF4aXMyRW5kcG9pbnRSZWZlcmVuY2VGYWN0b3J5LmNsYXNzKTsNCi0gICAgICAgIA0KLSAgICAJcmV0dXJuIGZhY3RvcnkuY3JlYXRlRW5kcG9pbnRSZWZlcmVuY2UoYWRkcmVzcyk7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGF4aXMyRVBSDQotICAgICAqIEBwYXJhbSByZWZlcmVuY2VQYXJhbWV0ZXJzDQotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkUmVmZXJlbmNlUGFyYW1ldGVycyhFbmRwb2ludFJlZmVyZW5jZSBheGlzMkVQUiwgRWxlbWVudC4uLnJlZmVyZW5jZVBhcmFtZXRlcnMpDQotICAgIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgaWYgKHJlZmVyZW5jZVBhcmFtZXRlcnMgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIGZvciAoRWxlbWVudCBlbGVtZW50IDogcmVmZXJlbmNlUGFyYW1ldGVycykgew0KLSAgICAgICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gWE1MVXRpbHMudG9PTShlbGVtZW50KTsNCi0gICAgICAgICAgICAgICAgYXhpczJFUFIuYWRkUmVmZXJlbmNlUGFyYW1ldGVyKG9tRWxlbWVudCk7DQotICAgICAgICAgICAgfSAgICAgICAgICAgIA0KLSAgICAgICAgfSAgICAJDQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGF4aXMyRVBSDQotICAgICAqIEBwYXJhbSBtZXRhZGF0YQ0KLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZE1ldGFkYXRhKEVuZHBvaW50UmVmZXJlbmNlIGF4aXMyRVBSLCBFbGVtZW50Li4ubWV0YWRhdGEpDQotICAgIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgaWYgKG1ldGFkYXRhICE9IG51bGwpIHsNCi0gICAgICAgICAgICBmb3IgKEVsZW1lbnQgZWxlbWVudCA6IG1ldGFkYXRhKSB7DQotICAgICAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSBYTUxVdGlscy50b09NKGVsZW1lbnQpOw0KLSAgICAgICAgICAgICAgICBheGlzMkVQUi5hZGRNZXRhRGF0YShvbUVsZW1lbnQpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gYXhpczJFUFINCi0gICAgICogQHBhcmFtIHBvcnRUeXBlDQotICAgICAqIEBwYXJhbSBhZGRyZXNzaW5nTmFtZXNwYWNlDQotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkSW50ZXJmYWNlKEVuZHBvaW50UmVmZXJlbmNlIGF4aXMyRVBSLCBRTmFtZSBwb3J0VHlwZSwgU3RyaW5nIGFkZHJlc3NpbmdOYW1lc3BhY2UpDQotICAgIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAJaWYgKHBvcnRUeXBlICE9IG51bGwpIHsNCi0gICAgCQlJbnRlcmZhY2VOYW1lIGludGVyZmFjZU5hbWUgPSBuZXcgSW50ZXJmYWNlTmFtZShwb3J0VHlwZSk7DQotICAgIAkJRW5kcG9pbnRSZWZlcmVuY2VIZWxwZXIuc2V0SW50ZXJmYWNlTmFtZU1ldGFkYXRhKG9tRmFjdG9yeSwgYXhpczJFUFIsIGFkZHJlc3NpbmdOYW1lc3BhY2UsIGludGVyZmFjZU5hbWUpOw0KLSAgICAJfQ0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSBheGlzMkVQUg0KLSAgICAgKiBAcGFyYW0gc2VydmljZQ0KLSAgICAgKiBAcGFyYW0gcG9ydA0KLSAgICAgKiBAcGFyYW0gYWRkcmVzc2luZ05hbWVzcGFjZQ0KLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZFNlcnZpY2UoRW5kcG9pbnRSZWZlcmVuY2UgYXhpczJFUFIsIFFOYW1lIHNlcnZpY2UsIFFOYW1lIHBvcnQsIFN0cmluZyBhZGRyZXNzaW5nTmFtZXNwYWNlKQ0KLSAgICB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIGlmIChzZXJ2aWNlICE9IG51bGwgJiYgcG9ydCAhPSBudWxsKSB7DQotICAgICAgICAgICAgU2VydmljZU5hbWUgc2VydmljZU5hbWUgPSBuZXcgU2VydmljZU5hbWUoc2VydmljZSwgcG9ydC5nZXRMb2NhbFBhcnQoKSk7DQotICAgICAgICAgICAgRW5kcG9pbnRSZWZlcmVuY2VIZWxwZXIuc2V0U2VydmljZU5hbWVNZXRhZGF0YShvbUZhY3RvcnksIGF4aXMyRVBSLCBhZGRyZXNzaW5nTmFtZXNwYWNlLCBzZXJ2aWNlTmFtZSk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGF4aXMyRVBSDQotICAgICAqIEBwYXJhbSB0YXJnZXROYW1lc3BhY2UNCi0gICAgICogQHBhcmFtIHdzZGxEb2N1bWVudExvY2F0aW9uDQotICAgICAqIEBwYXJhbSBhZGRyZXNzaW5nTmFtZXNwYWNlDQotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkTG9jYXRpb24oRW5kcG9pbnRSZWZlcmVuY2UgYXhpczJFUFIsIFN0cmluZyB0YXJnZXROYW1lc3BhY2UsIFN0cmluZyB3c2RsRG9jdW1lbnRMb2NhdGlvbiwgU3RyaW5nIGFkZHJlc3NpbmdOYW1lc3BhY2UpDQotICAgIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgaWYgKHRhcmdldE5hbWVzcGFjZSAhPSBudWxsICYmIHdzZGxEb2N1bWVudExvY2F0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICBXU0RMTG9jYXRpb24gd3NkbExvY2F0aW9uID0gbmV3IFdTRExMb2NhdGlvbih0YXJnZXROYW1lc3BhY2UsIHdzZGxEb2N1bWVudExvY2F0aW9uKTsNCi0gICAgICAgICAgICBFbmRwb2ludFJlZmVyZW5jZUhlbHBlci5zZXRXU0RMTG9jYXRpb25NZXRhZGF0YShvbUZhY3RvcnksIGF4aXMyRVBSLCBhZGRyZXNzaW5nTmFtZXNwYWNlLCB3c2RsTG9jYXRpb24pOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2FkZHJlc3NpbmcvdXRpbC9SZWZlcmVuY2VQYXJhbWV0ZXJMaXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9hZGRyZXNzaW5nL3V0aWwvUmVmZXJlbmNlUGFyYW1ldGVyTGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjkzM2UxLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2FkZHJlc3NpbmcvdXRpbC9SZWZlcmVuY2VQYXJhbWV0ZXJMaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5hZGRyZXNzaW5nLnV0aWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BdHRyaWJ1dGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEhlYWRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkFkZHJlc3NpbmdDb25zdGFudHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuRXhjZXB0aW9uRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5pMThuLk1lc3NhZ2VzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuWE1MVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsNCi0NCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuTWVzc2FnZUNvbnRleHQ7DQotaW1wb3J0IGphdmEudXRpbC5BYnN0cmFjdExpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotLyoqDQotICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIHByb3ZpZGUgYSByZWFkLW9ubHkgbGlzdCBvZiByZWZlcmVuY2UgcGFyYW1ldGVycw0KLSAqIHZpYSB0aGUgSkFYLVdTIDIuMSBhcGkuDQotICoNCi0gKiBAc2VlIE1lc3NhZ2VDb250ZXh0I1JFRkVSRU5DRV9QQVJBTUVURVJTDQotICovDQotcHVibGljIGNsYXNzIFJlZmVyZW5jZVBhcmFtZXRlckxpc3QgZXh0ZW5kcyBBYnN0cmFjdExpc3Q8RWxlbWVudD4gew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coUmVmZXJlbmNlUGFyYW1ldGVyTGlzdC5jbGFzcyk7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEVsZW1lbnRbXSBFTVBUWV9BUlJBWSA9IG5ldyBFbGVtZW50WzBdOw0KLSAgICANCi0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZXNwYWNlID0gQWRkcmVzc2luZ0NvbnN0YW50cy5GaW5hbC5XU0FfTkFNRVNQQUNFOw0KLSAgICBwcml2YXRlIFNPQVBIZWFkZXIgaGVhZGVyOw0KLSAgICBwcml2YXRlIEVsZW1lbnRbXSByZWZlcmVuY2VQYXJhbWV0ZXJzOw0KLQ0KLSAgICBwdWJsaWMgUmVmZXJlbmNlUGFyYW1ldGVyTGlzdCgpIHsNCi0gICAgICAgIHN1cGVyKCk7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyBSZWZlcmVuY2VQYXJhbWV0ZXJMaXN0KFNPQVBIZWFkZXIgaGVhZGVyKSB7DQotICAgICAgICBzdXBlcigpOw0KLSAgICAgICAgdGhpcy5oZWFkZXIgPSBoZWFkZXI7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBFbGVtZW50IGdldChpbnQgaW5kZXgpIHsNCi0gICAgICAgIGlmIChyZWZlcmVuY2VQYXJhbWV0ZXJzID09IG51bGwpDQotICAgICAgICAgICAgaW5pdGlhbGl6ZSgpOw0KLSAgICAgICAgDQotICAgICAgICByZXR1cm4gcmVmZXJlbmNlUGFyYW1ldGVyc1tpbmRleF07DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsNCi0gICAgICAgIGlmIChyZWZlcmVuY2VQYXJhbWV0ZXJzID09IG51bGwpDQotICAgICAgICAgICAgaW5pdGlhbGl6ZSgpOw0KLSAgICAgICAgDQotICAgICAgICByZXR1cm4gcmVmZXJlbmNlUGFyYW1ldGVycy5sZW5ndGg7DQotICAgIH0NCi0gICAgDQotICAgIHByaXZhdGUgdm9pZCBpbml0aWFsaXplKCkgew0KLSAgICAgICAgaWYgKGhlYWRlciA9PSBudWxsKSB7DQotICAgICAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgICAgIGxvZy50cmFjZSgiaW5pdGlhbGl6ZTogTm8gU09BUCBoZWFkZXIgdG8gY2hlY2sgZm9yIHJlZmVyZW5jZSBwYXJhbWV0ZXJzLiIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICANCi0gICAgICAgICAgICByZWZlcmVuY2VQYXJhbWV0ZXJzID0gRU1QVFlfQVJSQVk7ICAgICAgICAgICAgDQotICAgICAgICB9DQotICAgICAgICBlbHNlIHsNCi0gICAgICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICAgICAgbG9nLnRyYWNlKCJpbml0aWFsaXplOiBDaGVja2luZyBTT0FQIGhlYWRlciBmb3IgcmVmZXJlbmNlIHBhcmFtZXRlcnMuIik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIExpc3Q8RWxlbWVudD4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8RWxlbWVudD4oKTsNCi0gICAgICAgICAgICBJdGVyYXRvciBoZWFkZXJCbG9ja3MgPSBoZWFkZXIuZ2V0Q2hpbGRFbGVtZW50cygpOw0KLSAgICAgICAgICAgIHdoaWxlIChoZWFkZXJCbG9ja3MuaGFzTmV4dCgpKSB7DQotICAgICAgICAgICAgICAgIE9NRWxlbWVudCBoZWFkZXJFbGVtZW50ID0gKE9NRWxlbWVudCloZWFkZXJCbG9ja3MubmV4dCgpOw0KLSAgICAgICAgICAgICAgICBPTUF0dHJpYnV0ZSBpc1JlZlBhcmFtQXR0ciA9DQotICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyRWxlbWVudC5nZXRBdHRyaWJ1dGUobmV3IFFOYW1lKG5hbWVzcGFjZSwgIklzUmVmZXJlbmNlUGFyYW1ldGVyIikpOw0KLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIGxvZy50cmFjZSgiaW5pdGlhbGl6ZTogQ2hlY2tpbmcgaGVhZGVyIGVsZW1lbnQ6ICIgKyBoZWFkZXJFbGVtZW50LmdldFFOYW1lKCkpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICBpZiAoaXNSZWZQYXJhbUF0dHIgIT0gbnVsbCAmJiANCi0gICAgICAgICAgICAgICAgICAgICgidHJ1ZSIuZXF1YWxzKGlzUmVmUGFyYW1BdHRyLmdldEF0dHJpYnV0ZVZhbHVlKCkpIHx8DQotICAgICAgICAgICAgICAgICAgICAgIjEiLmVxdWFscyhpc1JlZlBhcmFtQXR0ci5nZXRBdHRyaWJ1dGVWYWx1ZSgpKSkpIHsNCi0gICAgICAgICAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgRWxlbWVudCBlbGVtZW50ID0gWE1MVXRpbHMudG9ET00oaGVhZGVyRWxlbWVudCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgbGlzdC5hZGQoZWxlbWVudCk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgicmVmZXJlbmNlUGFyYW1ldGVyQ29uc3RydWN0aW9uRXJyIiksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLnRyYWNlKCJpbml0aWFsaXplOiBIZWFkZXI6ICIgKyBoZWFkZXJFbGVtZW50LmdldFFOYW1lKCkgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBoYXMgSXNSZWZlcmVuY2VQYXJhbWV0ZXIgYXR0cmlidXRlLiBBZGRpbmcgdG8gdG9FUFIuIik7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgcmVmZXJlbmNlUGFyYW1ldGVycyA9IGxpc3QudG9BcnJheShFTVBUWV9BUlJBWSk7DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvYmluZGluZy9CaW5kaW5nSW1wbC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvYmluZGluZy9CaW5kaW5nSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWEwOGJjLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2JpbmRpbmcvQmluZGluZ0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuYmluZGluZzsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5FbmRwb2ludERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZmVhdHVyZS5DbGllbnRDb25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5mZWF0dXJlLkNsaWVudEZyYW1ld29yazsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmhhbmRsZXIuSGFuZGxlclJlc29sdmVySW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmkxOG4uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5yZWdpc3RyeS5DbGllbnRDb25maWd1cmF0b3JSZWdpc3RyeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNwaS5CaW5kaW5nOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc3BpLkJpbmRpbmdQcm92aWRlcjsKLQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRmVhdHVyZTsKLWltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5IYW5kbGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiBDbGFzc2VzIHRoYXQgd291bGQgbm9ybWFsbHkgImltcGxlbWVudCBqYXZheC54bWwud3MuQmluZGluZyIKLSAqIHNob3VsZCBleHRlbmQgdGhpcyBjbGFzcyBpbnN0ZWFkLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmluZGluZ0ltcGwgaW1wbGVtZW50cyBCaW5kaW5nIHsKLSAgICAvLyBhbiB1bnNvcnRlZCBsaXN0IG9mIGhhbmRsZXJzCi0gICAgcHJpdmF0ZSBMaXN0PEhhbmRsZXI+IGhhbmRsZXJzOwotCi0gICAgcHJpdmF0ZSBFbmRwb2ludERlc2NyaXB0aW9uIGVuZHBvaW50RGVzYzsKLSAgICAKLSAgICBwcml2YXRlIENsaWVudEZyYW1ld29yayBmcmFtZXdvcmsgPSBuZXcgQ2xpZW50RnJhbWV3b3JrKCk7Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGJpbmRpbmdJZDsKLQotICAgIHByb3RlY3RlZCBTZXQ8U3RyaW5nPiByb2xlczsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNPQVAxMV9FTlZfTlMgPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iOwotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09BUDEyX0VOVl9OUyA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUiOwotCi0gICAgcHVibGljIEJpbmRpbmdJbXBsKEVuZHBvaW50RGVzY3JpcHRpb24gZW5kcG9pbnREZXNjKSB7Ci0gICAgICAgIHRoaXMuZW5kcG9pbnREZXNjID0gZW5kcG9pbnREZXNjOwotICAgICAgICAvLyBjbGllbnQKLSAgICAgICAgdGhpcy5iaW5kaW5nSWQgPSBlbmRwb2ludERlc2MuZ2V0Q2xpZW50QmluZGluZ0lEKCk7Ci0gICAgICAgIGlmICh0aGlzLmJpbmRpbmdJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBzZXJ2ZXIKLSAgICAgICAgICAgIHRoaXMuYmluZGluZ0lkID0gZW5kcG9pbnREZXNjLmdldEJpbmRpbmdUeXBlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIFNldDxTdHJpbmc+IGlkcyA9IENsaWVudENvbmZpZ3VyYXRvclJlZ2lzdHJ5LmdldElkcygpOwotICAgICAgICAKLSAgICAgICAgZm9yIChTdHJpbmcgaWQgOiBpZHMpIHsKLSAgICAgICAgICAgIENsaWVudENvbmZpZ3VyYXRvciBjb25maWd1cmF0b3IgPSBDbGllbnRDb25maWd1cmF0b3JSZWdpc3RyeS5nZXRDb25maWd1cmF0b3IoaWQpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoY29uZmlndXJhdG9yLnN1cHBvcnRzKHRoaXMpKQotICAgICAgICAgICAgICAgIGZyYW1ld29yay5hZGRDb25maWd1cmF0b3IoaWQsIGNvbmZpZ3VyYXRvcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxIYW5kbGVyPiBnZXRIYW5kbGVyQ2hhaW4oKSB7Ci0gICAgICAgIGlmIChoYW5kbGVycyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBub24tbnVsbCBzbyBjbGllbnQgYXBwcyBjYW4gbWFuaXB1bGF0ZQotICAgICAgICAgICAgaGFuZGxlcnMgPQotICAgICAgICAgICAgICAgICAgICBuZXcgSGFuZGxlclJlc29sdmVySW1wbChlbmRwb2ludERlc2MuZ2V0U2VydmljZURlc2NyaXB0aW9uKCkpLmdldEhhbmRsZXJDaGFpbihlbmRwb2ludERlc2MuZ2V0UG9ydEluZm8oKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGhhbmRsZXJzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEhhbmRsZXJDaGFpbihMaXN0PEhhbmRsZXI+IGxpc3QpIHsKLSAgICAgICAgLy8gaGFuZGxlcnMgY2Fubm90IGJlIG51bGwgc28gYSBjbGllbnQgYXBwIGNhbiByZXF1ZXN0IGFuZCBtYW5pcHVsYXRlIGl0Ci0gICAgICAgIGlmIChsaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIGhhbmRsZXJzID0gbmV3IEFycmF5TGlzdDxIYW5kbGVyPigpOyAvLyBub24tbnVsbCwgYnV0IHJhdGhlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVtcHR5Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aGlzLmhhbmRsZXJzID0gbGlzdDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzaW5jZSBKQVgtV1MgMi4xCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRCaW5kaW5nSUQoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmJpbmRpbmdJZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjb25maWd1cmUoTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQsIEJpbmRpbmdQcm92aWRlciBwcm92aWRlcikgewotICAgICAgICBmcmFtZXdvcmsuY29uZmlndXJlKG1lc3NhZ2VDb250ZXh0LCBwcm92aWRlcik7Ci0gICAgfQotCi0gICAgcHVibGljIFdlYlNlcnZpY2VGZWF0dXJlIGdldEZlYXR1cmUoU3RyaW5nIGlkKSB7Ci0gICAgICAgIHJldHVybiBmcmFtZXdvcmsuZ2V0RmVhdHVyZShpZCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RmVhdHVyZXMoV2ViU2VydmljZUZlYXR1cmUuLi4gZmVhdHVyZXMpIHsKLSAgICAgICAgaWYgKGZlYXR1cmVzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoV2ViU2VydmljZUZlYXR1cmUgZmVhdHVyZSA6IGZlYXR1cmVzKSB7Ci0gICAgICAgICAgICAgICAgZnJhbWV3b3JrLmFkZEZlYXR1cmUoZmVhdHVyZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0QWRkcmVzc2luZ05hbWVzcGFjZShTdHJpbmcgYWRkcmVzc2luZ05hbWVzcGFjZSkgewotICAgICAgICBpZiAoYWRkcmVzc2luZ05hbWVzcGFjZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgTWVzc2FnZXMuZ2V0TWVzc2FnZSgiYmluZGluZ01ldGhvZE5vdFN1cHBvcnRlZCIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNldEFkZHJlc3NpbmdOYW1lc3BhY2UiLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRpbmdJZCkpOyAKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEF4aXMyRW5kcG9pbnRSZWZlcmVuY2UoRW5kcG9pbnRSZWZlcmVuY2UgZXByKSB7Ci0gICAgICAgIGlmIChlcHIgIT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoImJpbmRpbmdNZXRob2ROb3RTdXBwb3J0ZWQiLCAic2V0QXhpczJFbmRwb2ludFJlZmVyZW5jZSIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZGluZ0lkKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEFkZHJlc3NpbmdOYW1lc3BhY2UoKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAgTWVzc2FnZXMuZ2V0TWVzc2FnZSgiYmluZGluZ01ldGhvZE5vdFN1cHBvcnRlZCIsICJnZXRBZGRyZXNzaW5nTmFtZXNwYWNlIiwgYmluZGluZ0lkKSk7Ci0gICAgfQotCi0gICAgcHVibGljIEVuZHBvaW50UmVmZXJlbmNlIGdldEF4aXMyRW5kcG9pbnRSZWZlcmVuY2UoKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAgTWVzc2FnZXMuZ2V0TWVzc2FnZSgiYmluZGluZ01ldGhvZE5vdFN1cHBvcnRlZCIsICJnZXRBeGlzMkVuZHBvaW50UmVmZXJlbmNlIiwgYmluZGluZ0lkKSk7IAotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2JpbmRpbmcvQmluZGluZ1V0aWxzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9iaW5kaW5nL0JpbmRpbmdVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTdmMjgzLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2JpbmRpbmcvQmluZGluZ1V0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuYmluZGluZzsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRW5kcG9pbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuTURRQ29uc3RhbnRzOwotCi1pbXBvcnQgamF2YXgueG1sLndzLkJpbmRpbmc7Ci0KLXB1YmxpYyBjbGFzcyBCaW5kaW5nVXRpbHMgewotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIEJpbmRpbmcgaW5zdGFuY2UgYmFzZWQgb24gYW4gRW5kcG9pbnREZXNjcmlwdGlvbi4KLSAgICAgKiBAcGFyYW0gZWQKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBCaW5kaW5nIGNyZWF0ZUJpbmRpbmcoRW5kcG9pbnREZXNjcmlwdGlvbiBlZCkgewotICAgICAgICBpZiAoZWQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJFbmRwb2ludERlc2NyaXB0aW9uIGlzIG51bGwiKTsgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBiaW5kaW5nVHlwZSA9IAotICAgICAgICAgICAgKGVkLmdldFNlcnZpY2VEZXNjcmlwdGlvbigpLmlzU2VydmVyU2lkZSgpKSA/IAotICAgICAgICAgICAgICAgICAgICBlZC5nZXRCaW5kaW5nVHlwZSgpCi0gICAgICAgICAgICAgICAgICAgIDogZWQuZ2V0Q2xpZW50QmluZGluZ0lEKCk7Ci0gICAgICAgIAotICAgICAgICBpZiAoQmluZGluZ1V0aWxzLmlzU09BUEJpbmRpbmcoYmluZGluZ1R5cGUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFNPQVBCaW5kaW5nKGVkKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChCaW5kaW5nVXRpbHMuaXNIVFRQQmluZGluZyhiaW5kaW5nVHlwZSkpIHsgCi0gICAgICAgICAgICByZXR1cm4gbmV3IEhUVFBCaW5kaW5nKGVkKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIC8vIElmIHdlIGNhbid0IGZpZ3VyZSBpdCBvdXQsIGxldCdzIGRlZmF1bHQgdG8gCi0gICAgICAgICAgICAvLyBhIFNPQVBCaW5kaW5nCi0gICAgICAgICAgICByZXR1cm4gbmV3IFNPQVBCaW5kaW5nKGVkKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTT0FQQmluZGluZyhTdHJpbmcgdXJsKSB7Ci0gICAgICAgIHJldHVybiAoaXNTT0FQMTFCaW5kaW5nKHVybCkgfHwgaXNTT0FQMTJCaW5kaW5nKHVybCkpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTT0FQMTFCaW5kaW5nKFN0cmluZyB1cmwpIHsKLSAgICAgICAgaWYgKHVybCAhPSBudWxsICYmICh1cmwuZXF1YWxzKFNPQVBCaW5kaW5nLlNPQVAxMUhUVFBfQklORElORykgfHwKLSAgICAgICAgICAgICAgICB1cmwuZXF1YWxzKFNPQVBCaW5kaW5nLlNPQVAxMUhUVFBfTVRPTV9CSU5ESU5HKSB8fAotICAgICAgICAgICAgICAgIHVybC5lcXVhbHMoTURRQ29uc3RhbnRzLlNPQVAxMUpNU19CSU5ESU5HKSB8fAotICAgICAgICAgICAgICAgIHVybC5lcXVhbHMoTURRQ29uc3RhbnRzLlNPQVAxMUpNU19NVE9NX0JJTkRJTkcpICApKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1NPQVAxMkJpbmRpbmcoU3RyaW5nIHVybCkgewotICAgICAgICBpZiAodXJsICE9IG51bGwgJiYgKHVybC5lcXVhbHMoU09BUEJpbmRpbmcuU09BUDEySFRUUF9CSU5ESU5HKSB8fAotICAgICAgICAgICAgICAgIHVybC5lcXVhbHMoU09BUEJpbmRpbmcuU09BUDEySFRUUF9NVE9NX0JJTkRJTkcpIHx8Ci0gICAgICAgICAgICAgICAgdXJsLmVxdWFscyhNRFFDb25zdGFudHMuU09BUDEySk1TX0JJTkRJTkcpIHx8Ci0gICAgICAgICAgICAgICAgdXJsLmVxdWFscyhNRFFDb25zdGFudHMuU09BUDEySk1TX01UT01fQklORElORykgICkpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzTVRPTUJpbmRpbmcoU3RyaW5nIHVybCkgewotICAgICAgICBpZiAodXJsICE9IG51bGwgJiYgCi0gICAgICAgICAgICAgICAodXJsLmVxdWFscyhTT0FQQmluZGluZy5TT0FQMTFIVFRQX01UT01fQklORElORykgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgdXJsLmVxdWFscyhTT0FQQmluZGluZy5TT0FQMTJIVFRQX01UT01fQklORElORykgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgdXJsLmVxdWFscyhNRFFDb25zdGFudHMuU09BUDExSk1TX01UT01fQklORElORykgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgdXJsLmVxdWFscyhNRFFDb25zdGFudHMuU09BUDEySk1TX01UT01fQklORElORykgICApKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgICAgIAotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0hUVFBCaW5kaW5nKFN0cmluZyB1cmwpIHsKLSAgICAgICAgaWYgKHVybCAhPSBudWxsICYmIHVybC5lcXVhbHMoSFRUUEJpbmRpbmcuSFRUUF9CSU5ESU5HKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9iaW5kaW5nL0hUVFBCaW5kaW5nLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9iaW5kaW5nL0hUVFBCaW5kaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxZDQxNTUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvYmluZGluZy9IVFRQQmluZGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmJpbmRpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLkhhbmRsZXI7Ci1pbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuc29hcC5TT0FQSGFuZGxlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRW5kcG9pbnREZXNjcmlwdGlvbjsKLQotcHVibGljIGNsYXNzIEhUVFBCaW5kaW5nIGV4dGVuZHMgQmluZGluZ0ltcGwgaW1wbGVtZW50cyBqYXZheC54bWwud3MuaHR0cC5IVFRQQmluZGluZyB7Ci0KLSAgICBwdWJsaWMgSFRUUEJpbmRpbmcoRW5kcG9pbnREZXNjcmlwdGlvbiBlZCkgewotICAgICAgICBzdXBlcihlZCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0SGFuZGxlckNoYWluKExpc3Q8SGFuZGxlcj4gbGlzdCkgewotICAgICAgICBpZiAobGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKEhhbmRsZXIgaGFuZGxlciA6IGxpc3QpIHsKLSAgICAgICAgICAgICAgICBpZiAoaGFuZGxlciBpbnN0YW5jZW9mIFNPQVBIYW5kbGVyKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKCJDaGFpbiBjb250YWlucyBpbmNvbXBhdGliaWxlIGhhbmRsZXIiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgc3VwZXIuc2V0SGFuZGxlckNoYWluKGxpc3QpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2JpbmRpbmcvU09BUEJpbmRpbmcuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2JpbmRpbmcvU09BUEJpbmRpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjZhNzFiZi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9iaW5kaW5nL1NPQVBCaW5kaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmJpbmRpbmc7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5FeGNlcHRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRW5kcG9pbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmkxOG4uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51dGlsaXR5LlNBQUpGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXgueG1sLnNvYXAuTWVzc2FnZUZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUENvbnN0YW50czsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIDxsaW5rPmphdmF4LnhtbC53cy5zb2FwLlNPQVBCaW5kaW5nPC9saW5rPgotICogaW50ZXJmYWNlLiBUaGlzIGlzIHRoZSBkZWZhdWx0IGJpbmRpbmcgZm9yIEpBWC1XUywgYW5kIHdpbGwgZXhpc3QgZm9yIGFsbAotICogRGlzcGF0Y2ggYW5kIER5bmFtaWMgUHJveHkgaW5zdGFuY2VzIHVubGVzcyB0aGUgWE1ML0hUVFAgQmluZGluZyBpcwotICogZXhwbGljaXRseSBzcGVjaWZpY2llZC4KLSAqLwotcHVibGljIGNsYXNzIFNPQVBCaW5kaW5nIGV4dGVuZHMgQmluZGluZ0ltcGwgaW1wbGVtZW50cyBqYXZheC54bWwud3Muc29hcC5TT0FQQmluZGluZyB7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG10b21FbmFibGVkID0gZmFsc2U7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coU09BUEJpbmRpbmcuY2xhc3MpOwotICAgIAotICAgIHByaXZhdGUgRW5kcG9pbnRSZWZlcmVuY2UgZXByOwotICAgIAotICAgIHByaXZhdGUgU3RyaW5nIGFkZHJlc3NpbmdOYW1lc3BhY2U7Ci0KLSAgICBwdWJsaWMgU09BUEJpbmRpbmcoRW5kcG9pbnREZXNjcmlwdGlvbiBlbmRwb2ludERlc2MpIHsKLSAgICAgICAgc3VwZXIoZW5kcG9pbnREZXNjKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIGphdmF4LnhtbC53cy5zb2FwLlNPQVBCaW5kaW5nI2dldE1lc3NhZ2VGYWN0b3J5KCkKLSAgICAgKi8KLSAgICBwdWJsaWMgTWVzc2FnZUZhY3RvcnkgZ2V0TWVzc2FnZUZhY3RvcnkoKSB7Ci0gICAgICAgIFN0cmluZyBiaW5kaW5nTmFtZXNwYWNlID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBTQUFKRmFjdG9yeS5jcmVhdGVNZXNzYWdlRmFjdG9yeSB0YWtlcyBhIG5hbWVzcGFjZSBTdHJpbmcgYXMgYQotICAgICAgICAgICAgICogcGFyYW06ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyIgKFNPQVAxLjEpCi0gICAgICAgICAgICAgKiAiaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIiAoU09BUDEuMikKLSAgICAgICAgICAgICAqIAotICAgICAgICAgICAgICogVGhlIGJpbmRpbmdJZCB3aWxsIGJlIGluIG9uZSBvZiB0aGUgZm9sbG93aW5nIGZvcm1zOgotICAgICAgICAgICAgICogImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC9odHRwIiAoU09BUDEuMSkKLSAgICAgICAgICAgICAqICJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAvYmluZGluZ3MvSFRUUC8iIChTT0FQMS4yKQotICAgICAgICAgICAgICovCi0gICAgICAgIAkKLSAgICAgICAgICAgIGlmIChCaW5kaW5nVXRpbHMuaXNTT0FQMTJCaW5kaW5nKGJpbmRpbmdJZCkpewotICAgICAgICAgICAgCWJpbmRpbmdOYW1lc3BhY2UgPSBTT0FQMTJfRU5WX05TOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBUT0RPIGN1cnJlbnRseSBkZWZhdWx0cyB0byBTT0FQMTEuIFNob3VsZCB3ZSBiZSBtb3JlIHN0cmljY3QKLSAgICAgICAgICAgICAgICAvLyBhYm91dCBjaGVja2luZz8KLSAgICAgICAgICAgICAgICBiaW5kaW5nTmFtZXNwYWNlID0gU09BUDExX0VOVl9OUzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBTQUFKRmFjdG9yeS5jcmVhdGVNZXNzYWdlRmFjdG9yeShiaW5kaW5nTmFtZXNwYWNlKTsKLSAgICAgICAgfSBjYXRjaCAoV2ViU2VydmljZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBUT0RPIGxvZyBpdCBhbmQgdGhlbiB3aGF0PwotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJXZWJTZXJ2aWNlRXhjZXB0aW9uIGNhbGxpbmcgU0FBSkZhY3RvcnkuY3JlYXRlTWVzc2FnZUZhY3RvcnkoXCIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgYmluZGluZ05hbWVzcGFjZSArICJcIikiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoU09BUEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBUT0RPIGxvZyBpdCBhbmQgdGhlbiB3aGF0PwotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJTT0FQRXhjZXB0aW9uIGNhbGxpbmcgU0FBSkZhY3RvcnkuY3JlYXRlTWVzc2FnZUZhY3RvcnkoXCIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgYmluZGluZ05hbWVzcGFjZSArICJcIikiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIGphdmF4LnhtbC53cy5zb2FwLlNPQVBCaW5kaW5nI2dldFJvbGVzKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU2V0PFN0cmluZz4gZ2V0Um9sZXMoKSB7Ci0gICAgICAgIC8vIGRvIG5vdCBhbGxvdyBudWxsIHJvbGVzLCBwZXIgdGhlIEpBWC1XUyBDVFMKLSAgICAgICAgaWYgKHJvbGVzID09IG51bGwpCi0gICAgICAgICAgICByb2xlcyA9IGFkZERlZmF1bHRSb2xlcyhudWxsKTsKLSAgICAgICAgcmV0dXJuIHJvbGVzOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgamF2YXgueG1sLndzLnNvYXAuU09BUEJpbmRpbmcjZ2V0U09BUEZhY3RvcnkoKQotICAgICAqLwotICAgIHB1YmxpYyBTT0FQRmFjdG9yeSBnZXRTT0FQRmFjdG9yeSgpIHsKLSAgICAgICAgU3RyaW5nIGJpbmRpbmdOYW1lc3BhY2UgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIFNBQUpGYWN0b3J5LmNyZWF0ZU1lc3NhZ2VGYWN0b3J5IHRha2VzIGEgbmFtZXNwYWNlIFN0cmluZyBhcyBhCi0gICAgICAgICAgICAgKiBwYXJhbTogImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIiAoU09BUDEuMSkKLSAgICAgICAgICAgICAqICJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUiIChTT0FQMS4yKQotICAgICAgICAgICAgICogCi0gICAgICAgICAgICAgKiBUaGUgYmluZGluZ0lkIHdpbGwgYmUgaW4gb25lIG9mIHRoZSBmb2xsb3dpbmcgZm9ybXM6Ci0gICAgICAgICAgICAgKiAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwL2h0dHAiIChTT0FQMS4xKQotICAgICAgICAgICAgICogImh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC9iaW5kaW5ncy9IVFRQLyIgKFNPQVAxLjIpCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmIChiaW5kaW5nSWQuZXF1YWxzSWdub3JlQ2FzZShTT0FQQmluZGluZy5TT0FQMTJIVFRQX0JJTkRJTkcpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgYmluZGluZ0lkLmVxdWFsc0lnbm9yZUNhc2UoU09BUEJpbmRpbmcuU09BUDEySFRUUF9NVE9NX0JJTkRJTkcpKSB7Ci0gICAgICAgICAgICAgICAgYmluZGluZ05hbWVzcGFjZSA9IFNPQVAxMl9FTlZfTlM7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIFRPRE8gY3VycmVudGx5IGRlZmF1bHRzIHRvIFNPQVAxMS4gU2hvdWxkIHdlIGJlIG1vcmUgc3RyaWNjdAotICAgICAgICAgICAgICAgIC8vIGFib3V0IGNoZWNraW5nPwotICAgICAgICAgICAgICAgIGJpbmRpbmdOYW1lc3BhY2UgPSBTT0FQMTFfRU5WX05TOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIFNBQUpGYWN0b3J5LmNyZWF0ZVNPQVBGYWN0b3J5KGJpbmRpbmdOYW1lc3BhY2UpOwotICAgICAgICB9IGNhdGNoIChXZWJTZXJ2aWNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIFRPRE8gbG9nIGl0IGFuZCB0aGVuIHdoYXQ/Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIldlYlNlcnZpY2VFeGNlcHRpb24gY2FsbGluZyBTQUFKRmFjdG9yeS5jcmVhdGVTT0FQRmFjdG9yeShcIiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBiaW5kaW5nTmFtZXNwYWNlICsgIlwiKSIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChTT0FQRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIFRPRE8gbG9nIGl0IGFuZCB0aGVuIHdoYXQ/Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlNPQVBFeGNlcHRpb24gY2FsbGluZyBTQUFKRmFjdG9yeS5jcmVhdGVTT0FQRmFjdG9yeShcIiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBiaW5kaW5nTmFtZXNwYWNlICsgIlwiKSIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgamF2YXgueG1sLndzLnNvYXAuU09BUEJpbmRpbmcjaXNNVE9NRW5hYmxlZCgpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNNVE9NRW5hYmxlZCgpIHsKLSAgICAgICAgcmV0dXJuIG10b21FbmFibGVkOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgamF2YXgueG1sLndzLnNvYXAuU09BUEJpbmRpbmcjc2V0TVRPTUVuYWJsZWQoYm9vbGVhbikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRNVE9NRW5hYmxlZChib29sZWFuIGZsYWcpIHsKLSAgICAgICAgbXRvbUVuYWJsZWQgPSBmbGFnOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgamF2YXgueG1sLndzLnNvYXAuU09BUEJpbmRpbmcjc2V0Um9sZXMoamF2YS51dGlsLlNldCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRSb2xlcyhTZXQ8U3RyaW5nPiBzZXQpIHsKLSAgICAgICAgLy8gVmFsaWRhdGUgdGhlIHZhbHVlcyBpbiB0aGUgc2V0Ci0gICAgICAgIGlmIChzZXQgIT0gbnVsbCAmJiAhc2V0LmlzRW1wdHkoKSkgewotICAgICAgICAgICAgLy8gVGhyb3cgYW4gZXhjZXB0aW9uIGZvciBzZXR0aW5nIGEgcm9sZSBvZiAibm9uZSIKLSAgICAgICAgICAgIC8vIFBlciBKQVhXUyAyLjAgU2VjIDEwLjEuMS4xIFNPQVAgUm9sZXMsIHBhZ2UgMTE2OgotICAgICAgICAgICAgaWYgKHNldC5jb250YWlucyhTT0FQQ29uc3RhbnRzLlVSSV9TT0FQXzFfMl9ST0xFX05PTkUpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJyb2xlVmFsaWRhdGlvRXJyIikpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByb2xlcyA9IGFkZERlZmF1bHRSb2xlcyhzZXQpOwotICAgIH0KLSAgICBwcml2YXRlIFNldDxTdHJpbmc+IGFkZERlZmF1bHRSb2xlcyhTZXQ8U3RyaW5nPiBzZXQpIHsKLSAgICAgICAgCi0gICAgICAgIFNldDxTdHJpbmc+IHJldHVyblNldCA9IHNldDsKLSAgICAgICAgaWYgKHJldHVyblNldCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm5TZXQgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgZGVmYXVsdHMgZm9yIHRoZSBiaW5kaW5nIHR5cGUgYXJlIGluIHRoZSBzZXQKLSAgICAgICAgLy8gYW5kIGFkZCB0aGVtIGlmIG5vdC4gIE5vdGUgdGhhdCBmb3IgYm90aCBTT0FQMTEgYW5kIFNPQVAxMiwgdGhlIHJvbGUgb2YgdWx0aW1hdGUKLSAgICAgICAgLy8gcmVjaWV2ZXIgY2FuIGJlIGluZGljYXRlZCBieSB0aGUgb21pc3Npb24gb2YgdGhlIHJvbGUgYXR0cmlidXRlLgotICAgICAgICAvLyBSRVZJRVc6IFRoaXMgaXMgV1JPTkcgYmVjYXVzZSB0aGUgYmluZGluZ0lEIGZyb20gdGhlIFdTREwgaXMgbm90IHRoZSBzYW1lIHZhbHVlIGFzCi0gICAgICAgIC8vICAgU09BUEJpbmRpbmcgYW5ub3RhdGlvbiBjb25zdGFudHMuICBUaGVyZSBhcmUgb3RoZXIgcGxhY2VzIGluIHRoZSBjb2RlIHRoYXQgaGF2ZQotICAgICAgICAvLyAgIHRoaXMgc2FtZSBpc3N1ZSBJIGFtIHN1cmUuCi0gICAgICAgIGlmIChTT0FQQmluZGluZy5TT0FQMTJIVFRQX0JJTkRJTkcuZXF1YWxzKGJpbmRpbmdJZCkKLSAgICAgICAgICAgICAgICB8fCBTT0FQQmluZGluZy5TT0FQMTJIVFRQX01UT01fQklORElORy5lcXVhbHMoYmluZGluZ0lkKSkgewotICAgICAgICAgICAgaWYgKHJldHVyblNldC5pc0VtcHR5KCkgfHwgIXJldHVyblNldC5jb250YWlucyhTT0FQQ29uc3RhbnRzLlVSSV9TT0FQXzFfMl9ST0xFX05FWFQpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuU2V0LmFkZChTT0FQQ29uc3RhbnRzLlVSSV9TT0FQXzFfMl9ST0xFX05FWFQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAocmV0dXJuU2V0LmlzRW1wdHkoKSB8fCAhcmV0dXJuU2V0LmNvbnRhaW5zKFNPQVBDb25zdGFudHMuVVJJX1NPQVBfQUNUT1JfTkVYVCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm5TZXQuYWRkKFNPQVBDb25zdGFudHMuVVJJX1NPQVBfQUNUT1JfTkVYVCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldHVyblNldDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldEFkZHJlc3NpbmdOYW1lc3BhY2UoKSB7Ci0gICAgICAgIHJldHVybiBhZGRyZXNzaW5nTmFtZXNwYWNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBFbmRwb2ludFJlZmVyZW5jZSBnZXRBeGlzMkVuZHBvaW50UmVmZXJlbmNlKCkgewotICAgICAgICByZXR1cm4gZXByOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldEFkZHJlc3NpbmdOYW1lc3BhY2UoU3RyaW5nIGFkZHJlc3NpbmdOYW1lc3BhY2UpIHsKLSAgICAgICAgdGhpcy5hZGRyZXNzaW5nTmFtZXNwYWNlID0gYWRkcmVzc2luZ05hbWVzcGFjZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRBeGlzMkVuZHBvaW50UmVmZXJlbmNlKEVuZHBvaW50UmVmZXJlbmNlIGVwcikgewotICAgICAgICB0aGlzLmVwciA9IGVwcjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jbGllbnQvQ2xpZW50VXRpbHMuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NsaWVudC9DbGllbnRVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzM0NTdlLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NsaWVudC9DbGllbnRVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNsaWVudDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuQmluZGluZ1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLk9wZXJhdGlvbkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgQ2xpZW50VXRpbHMgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKENsaWVudFV0aWxzLmNsYXNzKTsKLQotICAgIC8qKgotICAgICAqIERldGVybWluZXMgd2hhdCB0aGUgU09BUEFjdGlvbiB2YWx1ZSBzaG91bGQgYmUgZm9yIGEgZ2l2ZW4gTWVzc2FnZUNvbnRleHQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY3R4IC0gVGhlIE1lc3NhZ2VDb250ZXh0IGZvciB0aGUgcmVxdWVzdAotICAgICAqIEByZXR1cm4gQSBzdHJpbmcgd2l0aCB0aGUgY2FsY3VsYXRlZCBTT0FQQWN0aW9uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZmluZFNPQVBBY3Rpb24oTWVzc2FnZUNvbnRleHQgY3R4KSB7Ci0gICAgICAgIE9wZXJhdGlvbkRlc2NyaXB0aW9uIG9wID0gY3R4LmdldE9wZXJhdGlvbkRlc2NyaXB0aW9uKCk7Ci0gICAgICAgIEJvb2xlYW4gdXNlU29hcEFjdGlvbiA9Ci0gICAgICAgICAgICAgICAgKEJvb2xlYW4pY3R4LmdldFByb3BlcnR5KEJpbmRpbmdQcm92aWRlci5TT0FQQUNUSU9OX1VTRV9QUk9QRVJUWSk7Ci0gICAgICAgIGlmICh1c2VTb2FwQWN0aW9uICE9IG51bGwgJiYgdXNlU29hcEFjdGlvbi5ib29sZWFuVmFsdWUoKSkgewotICAgICAgICAgICAgLy8gSWYgU09BUEFjdGlvbiB1c2UgaGFzbid0IGJlZW4gZGlzYWJsZWQgYnkgdGhlIGNsaWVudCwgdGhlbiBmaXJzdAotICAgICAgICAgICAgLy8gbG9vayBpbiB0aGUgY29udGV4dCBwcm9wZXJ0aWVzLgotICAgICAgICAgICAgU3RyaW5nIGFjdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgIChTdHJpbmcpY3R4LmdldFByb3BlcnR5KEJpbmRpbmdQcm92aWRlci5TT0FQQUNUSU9OX1VSSV9QUk9QRVJUWSk7Ci0gICAgICAgICAgICBpZiAoYWN0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJTZXR0aW5nIHNvYXAgYWN0aW9uIGZyb20gSkFYLVdTIHJlcXVlc3QgY29udGV4dC4gIEFjdGlvbiBbIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uICsgIl0iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGFjdGlvbjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gSWYgd2UgZGlkbid0IGZpbmQgYW55dGhpbmcgaW4gdGhlIGNvbnRleHQgcHJvcHMsIHRoZW4gd2UgbmVlZCB0byAKLSAgICAgICAgICAgIC8vIGNoZWNrIHRoZSBPcGVyYXRpb25EZXNjcml0aW9uIHRvIHNlZSBpZiBvbmUgd2FzIGNvbmZpZ3VyZWQgaW4gdGhlIFdTREwuCi0gICAgICAgICAgICBpZiAob3AgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGFjdGlvbiA9IG9wLmdldEFjdGlvbigpOwotICAgICAgICAgICAgICAgIGlmIChhY3Rpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiU2V0dGluZyBzb2FwIGFjdGlvbiBmcm9tIG9wZXJhdGlvbiBkZXNjcmlwdGlvbi4gIEFjdGlvbiBbIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbiArICJdIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFjdGlvbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkNhbm5vdCBzZXQgdGhlIHNvYXAgYWN0aW9uLiAgTm8gb3BlcmF0aW9uIGRlc2NyaXB0aW9uIHdhcyBmb3VuZC4iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlNvYXAgYWN0aW9uIHVzYWdlIHdhcyBkaXNhYmxlZCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jbGllbnQvUHJvcGVydHlNaWdyYXRvci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2xpZW50L1Byb3BlcnR5TWlncmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQwM2NjMC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jbGllbnQvUHJvcGVydHlNaWdyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNsaWVudDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmhhbmRsZXIuTUVQQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNwaS5taWdyYXRvci5BcHBsaWNhdGlvbkNvbnRleHRNaWdyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogVGhlIFByb3BlcnR5TWlncmF0b3IgaW1wbGVtZW50cyB0aGUgQXBwbGljYXRpb25Db250ZXh0TWlncmF0b3IgaW4gb3JkZXIgdG8gcGVyZm9ybSB0aGUgbmVjZXNzYXJ5Ci0gKiBtYW5pcHVsYXRpb25zIG9mIHByb3BlcnRpZXMgZHVyaW5nIGEgcmVxdWVzdCBvciByZXNwb25zZSBmbG93LgotICovCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlNaWdyYXRvciBpbXBsZW1lbnRzIEFwcGxpY2F0aW9uQ29udGV4dE1pZ3JhdG9yLCBTZXJpYWxpemFibGUgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhQcm9wZXJ0eU1pZ3JhdG9yLmNsYXNzKTsKLSAgICBwdWJsaWMgdm9pZCBtaWdyYXRlUHJvcGVydGllc0Zyb21NZXNzYWdlQ29udGV4dChNYXA8U3RyaW5nLCBPYmplY3Q+IHVzZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0KSB7Ci0KLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIlN0YXJ0aW5nIG1pZ3JhdGVQcm9wZXJ0eUZyb21NZXNzYWdlQ29udGV4dCIpOwotICAgICAgICB9Ci0gICAgICAgIE1FUENvbnRleHQgbWVwQ29udGV4dCA9IG1lc3NhZ2VDb250ZXh0LmdldE1FUENvbnRleHQoKTsKLSAgICAgICAgaWYgKG1lcENvbnRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJSZWFkaW5nIEFwcGxpY2F0aW9uU2NvcGVkUHJvcGVydGllcyBmcm9tIE1FUENvbnRleHQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVzZXJDb250ZXh0LnB1dEFsbChtZXBDb250ZXh0LmdldEFwcGxpY2F0aW9uU2NvcGVkUHJvcGVydGllcygpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygibWlncmF0ZVByb3BlcnR5RnJvbU1lc3NhZ2VDb250ZXh0IENvbXBsZXRlIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBtaWdyYXRlUHJvcGVydGllc1RvTWVzc2FnZUNvbnRleHQoTWFwPFN0cmluZywgT2JqZWN0PiB1c2VyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQpIHsKLQotICAgICAgICAvLyBBdm9pZCB1c2luZyBwdXRBbGwgYXMgdGhpcyBjYXVzZXMgY29waWVzIG9mIHRoZSBwcm9wZXJ5IHNldAotICAgICAgICBpZiAodXNlckNvbnRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gc2hvdWxkIG5vdCB1c2UgaXRlcmF0b3IgaGVyZSBiZWNhdXNlIHRoaXMgbWFwIG1heSBiZSBtb2RpZmllZAotICAgICAgICAgICAgLy8gb24gZGlmZmVyZW50IHRocmVhZHMgYnkgdGhlIHVzZXIgb3Igb3RoZXIgSkFYLVdTIGNvZGUKLSAgICAgICAgICAgIFN0cmluZ1tdIGtleXMgPSBuZXcgU3RyaW5nW3VzZXJDb250ZXh0LmtleVNldCgpLnNpemUoKV07Ci0gICAgICAgICAgICBrZXlzID0gdXNlckNvbnRleHQua2V5U2V0KCkudG9BcnJheShrZXlzKTsKLSAgICAgICAgICAgIGZvcihpbnQgaT0wOyBpIDwga2V5cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSBrZXlzW2ldOwotICAgICAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IHVzZXJDb250ZXh0LmdldChrZXkpOwotICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBtdG9tIHN0YXRlIGluIHRoZSB1c2VyIGNvbnRleHQsIHRoZSBtZXNzYWdlIGNvbnRleHQsIAotICAgICAgICAgICAgICAgIC8vIHRoZSBNRVAgY29udGV4dCBhcmUgdGhlIHNhbWUuCi0gICAgICAgICAgICAgICAgaWYoa2V5LmVxdWFsc0lnbm9yZUNhc2UoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uRU5BQkxFX01UT00pKXsKLSAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBtZXNzYWdlQ29udGV4dC5nZXRNZXNzYWdlKCkuaXNNVE9NRW5hYmxlZCgpOwotICAgICAgICAgICAgICAgICAgICBtZXNzYWdlQ29udGV4dC5nZXRNRVBDb250ZXh0KCkucHV0KGtleSwgdmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtZXNzYWdlQ29udGV4dC5zZXRQcm9wZXJ0eShrZXksIHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2xpZW50L1Byb3BlcnR5VmFsaWRhdG9yLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jbGllbnQvUHJvcGVydHlWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWUyZjJmZC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jbGllbnQvUHJvcGVydHlWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jbGllbnQ7Ci0KLWltcG9ydCBqYXZheC54bWwud3MuQmluZGluZ1Byb3ZpZGVyOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlWYWxpZGF0b3IgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgSGFzaE1hcDxTdHJpbmcsIENsYXNzPiBtYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIENsYXNzPigpOwotCi0gICAgc3RhdGljIHsKLSAgICAgICAgbWFwLnB1dChCaW5kaW5nUHJvdmlkZXIuRU5EUE9JTlRfQUREUkVTU19QUk9QRVJUWSwgU3RyaW5nLmNsYXNzKTsKLSAgICAgICAgbWFwLnB1dChCaW5kaW5nUHJvdmlkZXIuVVNFUk5BTUVfUFJPUEVSVFksIFN0cmluZy5jbGFzcyk7Ci0gICAgICAgIG1hcC5wdXQoQmluZGluZ1Byb3ZpZGVyLlBBU1NXT1JEX1BST1BFUlRZLCBTdHJpbmcuY2xhc3MpOwotICAgICAgICBtYXAucHV0KEJpbmRpbmdQcm92aWRlci5TRVNTSU9OX01BSU5UQUlOX1BST1BFUlRZLCBCb29sZWFuLmNsYXNzKTsKLSAgICAgICAgbWFwLnB1dChCaW5kaW5nUHJvdmlkZXIuU09BUEFDVElPTl9VU0VfUFJPUEVSVFksIEJvb2xlYW4uY2xhc3MpOwotICAgICAgICBtYXAucHV0KEJpbmRpbmdQcm92aWRlci5TT0FQQUNUSU9OX1VSSV9QUk9QRVJUWSwgU3RyaW5nLmNsYXNzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3MgdG8gc2VlIGlmIHRoZSBwcm9wZXJ0eSB2YWx1ZSBpcyB2YWxpZCBnaXZlbiB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgYW5kIHRoZSB0eXBlIHRoYXQKLSAgICAgKiBpcyBleHBlY3RlZCBieSBKQVgtV1MuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcHJvcE5hbWUKLSAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIHZhbGlkYXRlKFN0cmluZyBwcm9wTmFtZSwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIENsYXNzIGV4cGVjdGVkVHlwZSA9IG1hcC5nZXQocHJvcE5hbWUpOwotICAgICAgICBpZiAoZXhwZWN0ZWRUeXBlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChleHBlY3RlZFR5cGUuZXF1YWxzKHZhbHVlLmdldENsYXNzKCkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQ2xhc3MgZ2V0RXhwZWN0ZWRWYWx1ZShTdHJpbmcga2V5KSB7Ci0gICAgICAgIHJldHVybiBtYXAuZ2V0KGtleSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2xpZW50L2FzeW5jL0FzeW5jUmVzcG9uc2UuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NsaWVudC9hc3luYy9Bc3luY1Jlc3BvbnNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxOGJmY2UuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2xpZW50L2FzeW5jL0FzeW5jUmVzcG9uc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY2xpZW50LmFzeW5jOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5FeGNlcHRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkVuZHBvaW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5oYW5kbGVyLkF0dGFjaG1lbnRzQWRhcHRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmhhbmRsZXIuSGFuZGxlckNoYWluUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaGFuZGxlci5IYW5kbGVySW52b2tlclV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaGFuZGxlci5TT0FQSGVhZGVyc0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5oYW5kbGVyLlRyYW5zcG9ydEhlYWRlcnNBZGFwdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaTE4bi5NZXNzYWdlczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuYXR0YWNobWVudHMuQXR0YWNobWVudFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc3BpLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNwaS5taWdyYXRvci5BcHBsaWNhdGlvbkNvbnRleHRNaWdyYXRvclV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC54bWwud3MuUmVzcG9uc2U7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ2FuY2VsbGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvdW50RG93bkxhdGNoOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lb3V0RXhjZXB0aW9uOwotLyoqCi0gKiBUaGUgQXN5bmNSZXNwb25zZSBjbGFzcyBpcyB1c2VkIHRvIGNvbGxlY3QgdGhlIHJlc3BvbnNlIGluZm9ybWF0aW9uIGZyb20gQXhpczIgYW5kIGRlbGl2ZXIgaXQgdG8KLSAqIGEgSkFYLVdTIGNsaWVudC4gIEFzeW5jUmVzcG9uc2UgaW1wbGVtZW50cyB0aGUgPGxpbms+amF2YXgueG1sLndzLlJlc3BvbnNlPC9saW5rPiBBUEkgdGhhdCBpcwotICogZGVmaW5lZCBpbiB0aGUgSkFYLVdTIDIuMCBzcGVjaWZpY2F0aW9uLiAgVGhlIDxjb2RlPlJlc3BvbnNlPC9jb2RlPiBvYmplY3Qgd2lsbCBjb250YWluIGJvdGggdGhlCi0gKiBvYmplY3QgdGhhdCBpcyByZXR1cm5lZCBhcyB0aGUgcmVzcG9uc2UgYWxvbmcgd2l0aCBhIDxsaW5rPmphdmEudXRpbC5NYXA8L2xpbms+IHdpdGggdGhlIGNvbnRleHQKLSAqIGluZm9ybWF0aW9uIG9mIHRoZSByZXNwb25zZS4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFzeW5jUmVzcG9uc2UgaW1wbGVtZW50cyBSZXNwb25zZSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coQXN5bmNSZXNwb25zZS5jbGFzcyk7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gY2FuY2VsbGVkOwotCi0gICAgcHJpdmF0ZSBUaHJvd2FibGUgZmF1bHQ7Ci0gICAgcHJpdmF0ZSBNZXNzYWdlQ29udGV4dCBmYXVsdE1lc3NhZ2VDb250ZXh0OwotICAgIHByaXZhdGUgTWVzc2FnZUNvbnRleHQgcmVzcG9uc2U7Ci0KLSAgICBwcml2YXRlIEVuZHBvaW50RGVzY3JpcHRpb24gZW5kcG9pbnREZXNjcmlwdGlvbjsKLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIE9iamVjdD4gcmVzcG9uc2VDb250ZXh0OwotCi0gICAgLy8gQ291bnREb3duTGF0Y2ggaXMgdXNlZCB0byB0cmFjayB3aGV0aGVyIHdlJ3ZlIHJlY2VpdmVkIGFuZAotICAgIC8vIHByb2Nlc3NlZCB0aGUgYXN5bmMgcmVzcG9uc2UuICBGb3IgZXhhbXBsZSwgdGhlIGNsaWVudCBhcHAKLSAgICAvLyBjb3VsZCBiZSBwb2xsaW5nIG9uIDMwIHNlY29uZCBpbnRlcnZhbHMsIGFuZCB3ZSBkb24ndCByZWNlaXZlCi0gICAgLy8gdGhlIGFzeW5jIHJlc3BvbnNlIHVudGlsIHRoZSAxOjE1IG1hcmsuICBJbiB0aGF0IGNhc2UsIHRoZQotICAgIC8vIGZpcnN0IGZldyBwb2xscyBjYWxsaW5nIHRoZSAuZ2V0KCkgd291bGQgaGl0IHRoZSBsYXRjaC5hd2FpdCgpCi0gICAgLy8gd2hpY2ggYmxvY2tzIHRoZSB0aHJlYWQgaWYgdGhlIGxhdGNoIGNvdW50ID4gMAotICAgIHByaXZhdGUgQ291bnREb3duTGF0Y2ggbGF0Y2g7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGNhY2hlVmFsaWQgPSBmYWxzZTsKLSAgICBwcml2YXRlIE9iamVjdCBjYWNoZWRPYmplY3QgPSBudWxsOwotICAgIAotICAgIC8vIFRoZSByZXNwb25zZSBidXNpbmVzcyBvYmplY3QgdG8gYmUgcmV0dXJuZWQKLSAgICBwcml2YXRlIE9iamVjdCByZXNwb25zZU9iamVjdCA9IG51bGw7Ci0gICAgCi0gICAgLy8gVGhlIGV4Y2VwdGlvbiB0byBiZSByZXR1cm5lZCBpbiB0aGUgZXZlbnQgb2YgYSBmYXVsdCBvciBmYWlsdXJlIGluIAotICAgIC8vIHByb2Nlc3NpbmcgdGhlIHJlc3BvbnNlIGNvbnRlbnQuCi0gICAgcHJpdmF0ZSBFeGVjdXRpb25FeGNlcHRpb24gc2F2ZWRFeGNlcHRpb24gPSBudWxsOwotICAgIAotICAgIHByb3RlY3RlZCBBc3luY1Jlc3BvbnNlKEVuZHBvaW50RGVzY3JpcHRpb24gZWQpIHsKLSAgICAgICAgZW5kcG9pbnREZXNjcmlwdGlvbiA9IGVkOwotICAgICAgICBsYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBvbkVycm9yKFRocm93YWJsZSBmbHQsIE1lc3NhZ2VDb250ZXh0IG1jLCBDbGFzc0xvYWRlciBjbCkgewotICAgICAgICBDbGFzc0xvYWRlciBjb250ZXh0Q0wgPSAoQ2xhc3NMb2FkZXIpQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRBY3Rpb24oKSB7Ci0gICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIG9uRXJyb3IoZmx0LCBtYyk7Ci0gICAgICAgIGNoZWNrQ2xhc3NMb2FkZXIoY2wsIGNvbnRleHRDTCk7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIG9uRXJyb3IoVGhyb3dhYmxlIGZsdCwgTWVzc2FnZUNvbnRleHQgZmF1bHRDdHgpIHsKLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIkFzeW5jUmVzcG9uc2UgcmVjZWl2ZWQgYSBmYXVsdC4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZhdWx0ID0gZmx0OwotICAgICAgICBmYXVsdE1lc3NhZ2VDb250ZXh0ID0gZmF1bHRDdHg7Ci0gICAgICAgIGZhdWx0TWVzc2FnZUNvbnRleHQuc2V0RW5kcG9pbnREZXNjcmlwdGlvbihlbmRwb2ludERlc2NyaXB0aW9uKTsKLQotICAgICAgICAvLyBQcm9iYWJseSBhIGdvb2QgaWRlYSB0byBpbnZhbGlkYXRlIHRoZSBjYWNoZQotICAgICAgICBjYWNoZVZhbGlkID0gZmFsc2U7Ci0gICAgICAgIGNhY2hlZE9iamVjdCA9IG51bGw7Ci0KLSAgICAgICAgVGhyb3dhYmxlIHQgPSBwcm9jZXNzRmF1bHRSZXNwb25zZSgpOwotICAgICAgICAKLSAgICAgICAgLy8gSkFYV1MgNC4zLjMgY29uZm9ybWFuY2UgYnVsbGV0IHNheXMgdG8gdGhyb3cgYW4gRXhlY3V0aW9uRXhjZXB0aW9uIGZyb20gaGVyZQotICAgICAgICBzYXZlZEV4Y2VwdGlvbiA9IG5ldyBFeGVjdXRpb25FeGNlcHRpb24odCk7Ci0gICAgICAgICAKLSAgICAgICAgLy8gQ291bnRkb3duIHNvIHRoYXQgdGhlIEZ1dHVyZSBvYmplY3Qgd2lsbCBrbm93IHRoYXQgcHJvY2VzaW5nIGlzIGNvbXBsZXRlLgotICAgICAgICBsYXRjaC5jb3VudERvd24oKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJOZXcgbGF0Y2ggY291bnQgPSBbIiArIGxhdGNoLmdldENvdW50KCkgKyAiXSIpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENoZWNrIGZvciBhIHZhbGlkIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHVubWFyc2hhbGxpbmcgY2xhc3Nsb2FkZXIgYW5kCi0gICAgICogQXBwbGljYXRpb24ncyBjdXJyZW50IGNvbnRleHQgY2xhc3Nsb2FkZXIKLSAgICAgKiBAcGFyYW0gY2wKLSAgICAgKiBAcGFyYW0gY29udGV4dENMCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrQ2xhc3NMb2FkZXIoZmluYWwgQ2xhc3NMb2FkZXIgY2wsIGZpbmFsIENsYXNzTG9hZGVyIGNvbnRleHRDTCkgewotICAgICAgICAvLyBFbnN1cmUgdGhhdCB0aGUgY2xhc3Nsb2FkZXIgKGNsKSB1c2VkIGZvciB1bm1hcnNoYWxsaW5nIGlzIHRoZSBzYW1lCi0gICAgICAgIC8vIG9yIGEgcGFyZW50IG9mIHRoZSBjdXJyZW50IGNvbnRleHQgY2xhc3Nsb2FkZXIuICBPdGhlcndpc2UgCi0gICAgICAgIC8vIENsYXNzQ2FzdEV4Y2VwdGlvbnMgY2FuIG9jY3VyCi0gICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIkFzeW5jUmVzcG9uc2UgQ2xhc3NMb2FkZXIgaXM6Iik7Ci0gICAgICAgICAgICBsb2cuZGVidWcoY2wudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNsLmVxdWFscyhjb250ZXh0Q0wpKSB7Ci0gICAgICAgICAgICBpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQXN5bmNSZXNwb25zZSBDbGFzc0xvYWRlciBtYXRjaGVzIENvbnRleHQgQ2xhc3NMb2FkZXIiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJDb250ZXh0IENsYXNzTG9hZGVyIGlzOiIpOwotICAgICAgICAgICAgICAgIGxvZy5kZWJ1Zyhjb250ZXh0Q0wudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBDbGFzc0xvYWRlciBwYXJlbnQgPSBnZXRQYXJlbnRDbGFzc0xvYWRlcihjb250ZXh0Q0wpOwotICAgICAgICAgICAgd2hpbGUocGFyZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAocGFyZW50LmVxdWFscyhjbCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkFzeW5jUmVzcG9uc2UgQ2xhc3NMb2FkZXIgaXMgYW4gYW5jZXN0b3Igb2YgdGhlIENvbnRleHQgQ2xhc3NMb2FkZXIiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcGFyZW50ID0gZ2V0UGFyZW50Q2xhc3NMb2FkZXIocGFyZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5LgotICAgICAgICAgIG1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoInRocmVhZENsc0xvYWRlckVyciIsCi0gICAgICAgICAgICAgICAgICAgY29udGV4dENMLmdldENsYXNzKCkudG9TdHJpbmcoKSwgY2wuZ2V0Q2xhc3MoKS50b1N0cmluZygpKSk7Ci0gICAgfQotICAgIAotICAgIAotICAgIENsYXNzTG9hZGVyIGdldFBhcmVudENsYXNzTG9hZGVyKGZpbmFsIENsYXNzTG9hZGVyIGNsKSB7Ci0gICAgICAgIHJldHVybiAoQ2xhc3NMb2FkZXIpIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkQWN0aW9uKCkgewotICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNsLmdldFBhcmVudCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgb25Db21wbGV0ZShNZXNzYWdlQ29udGV4dCBtYywgQ2xhc3NMb2FkZXIgY2wpIHsKLSAgICAgICAgQ2xhc3NMb2FkZXIgY29udGV4dENMID0gKENsYXNzTG9hZGVyKUFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkQWN0aW9uKCkgewotICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBvbkNvbXBsZXRlKG1jKTsKLSAgICAgICAgY2hlY2tDbGFzc0xvYWRlcihjbCwgY29udGV4dENMKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBvbkNvbXBsZXRlKE1lc3NhZ2VDb250ZXh0IG1jKSB7Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJBc3luY1Jlc3BvbnNlIHJlY2VpdmVkIGEgTWVzc2FnZUNvbnRleHQuIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBBIG5ldyBtZXNzYWdlIGNvbnRleHQgaW52YWxpZGF0ZXMgdGhlIGNhY2hlZCBvYmplY3QgcmV0cmlldmVkCi0gICAgICAgIC8vIGR1cmluZyB0aGUgbGFzdCBnZXQoKQotICAgICAgICBpZiAocmVzcG9uc2UgIT0gbWMpIHsKLSAgICAgICAgICAgIGNhY2hlZE9iamVjdCA9IG51bGw7Ci0gICAgICAgICAgICBjYWNoZVZhbGlkID0gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICByZXNwb25zZSA9IG1jOwotICAgICAgICByZXNwb25zZS5zZXRFbmRwb2ludERlc2NyaXB0aW9uKGVuZHBvaW50RGVzY3JpcHRpb24pOwotICAgICAgICAKLSAgICAgICAgLy8gQ2hlY2sgZm9yIGNhY2hlZCBhdHRhY2htZW50IGZpbGUocykgaWYgYXR0YWNobWVudHMgZXhpc3QuIAotICAgICAgICBpZiAocmVzcG9uc2UuZ2V0QXhpc01lc3NhZ2VDb250ZXh0KCkuZ2V0QXR0YWNobWVudE1hcCgpICE9IG51bGwpewotICAgICAgICAgICAgQXR0YWNobWVudFV0aWxzLmZpbmRDYWNoZWRBdHRhY2htZW50KHJlc3BvbnNlLmdldEF4aXNNZXNzYWdlQ29udGV4dCgpLmdldEF0dGFjaG1lbnRNYXAoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIFByb2Nlc3MgdGhlIHJlc3BvbnNlIGFzIHNvb24gYXMgaXQgaXMgYXZhaWxhYmxlLiAgVGhpcyBtZWFucyBtYWtpbmcgc3VyZSB0aGF0Ci0gICAgICAgIC8vIG5vIGNvbnRlbnQgaXMgbGVmdCB1bnJlYWQgaW4gdGhlIHJlc3BvbnNlIHN0cmVhbS4gIExlYXZpbmcgY29udGVudCB0aGVyZSBjb3VsZAotICAgICAgICAvLyByZXN1bHQgaW4gYW4gZXJyb3IgaWYgdGhlIHJ1bnRpbWUgaXMgZ3JlZWR5IGFib3V0IGNsZWFuaW5nIHVwLgotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmVzcG9uc2VPYmplY3QgPSBwcm9jZXNzUmVzcG9uc2UoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHNhdmVkRXhjZXB0aW9uID0gZTsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgcHJvY2Vzc2luZyB0aGUgcmVzcG9uc2U6ICIgKyBlLmdldENhdXNlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbGF0Y2guY291bnREb3duKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBDb3VudGRvd24gc28gdGhhdCB0aGUgRnV0dXJlIG9iamVjdCB3aWxsIGtub3cgdGhhdCBwcm9jZXNpbmcgaXMgY29tcGxldGUuCi0gICAgICAgIGxhdGNoLmNvdW50RG93bigpOwotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiTmV3IGxhdGNoIGNvdW50ID0gWyIgKyBsYXRjaC5nZXRDb3VudCgpICsgIl0iKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIGphdmF4LnhtbC53cy5SZXNwb25zZSBBUElzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBwdWJsaWMgYm9vbGVhbiBjYW5jZWwoYm9vbGVhbiBtYXlJbnRlcnJ1cHRJZlJ1bm5pbmcpIHsKLSAgICAgICAgLy8gVGhlIHRhc2sgY2Fubm90IGJlIGNhbmNlbGxlZCBpZiBpdCBoYXMgYWxyZWFkeSBiZWVuIGNhbmNlbGxlZAotICAgICAgICAvLyBiZWZvcmUgb3IgaWYgaXQgaGFzIGFscmVhZHkgY29tcGxldGVkLgotICAgICAgICBpZiAoY2FuY2VsbGVkIHx8IGxhdGNoLmdldENvdW50KCkgPT0gMCkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJDYW5jZWxsYXRpb24gYXR0ZW1wdCBmYWlsZWQuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBjYW5jZWxsZWQgPSB0cnVlOwotICAgICAgICByZXR1cm4gY2FuY2VsbGVkOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0KCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBFeGVjdXRpb25FeGNlcHRpb24gewotICAgICAgICBpZiAoY2FuY2VsbGVkKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ2FuY2VsbGF0aW9uRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoImdldEVyciIpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFdhaXQgZm9yIHRoZSByZXNwb25zZSB0byBjb21lIGJhY2sKLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIldhaXRpbmcgZm9yIGFzeW5jIHJlc3BvbnNlIGRlbGl2ZXJ5LiIpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBJZiBsYXRjaCBjb3VudCA+IDAsIGl0IG1lYW5zIHdlIGhhdmUgbm90IHlldCByZWNlaXZlZAotICAgICAgICAvLyBhbmQgcHJvY2Vzc2VkIHRoZSBhc3luYyByZXNwb25zZSwgYW5kIG11c3QgYmxvY2sgdGhlCi0gICAgICAgIC8vIHRocmVhZC4KLSAgICAgICAgbGF0Y2guYXdhaXQoKTsKLQotICAgICAgICBpZiAoc2F2ZWRFeGNlcHRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgc2F2ZWRFeGNlcHRpb247Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiByZXNwb25zZU9iamVjdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldChsb25nIHRpbWVvdXQsIFRpbWVVbml0IHVuaXQpCi0gICAgICAgICAgICB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24sIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgVGltZW91dEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChjYW5jZWxsZWQpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDYW5jZWxsYXRpb25FeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiZ2V0RXJyIikpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gV2FpdCBmb3IgdGhlIHJlc3BvbnNlIHRvIGNvbWUgYmFjawotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiV2FpdGluZyBmb3IgYXN5bmMgcmVzcG9uc2UgZGVsaXZlcnkgd2l0aCB0aW1lIG91dC4iKTsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygidGltZW91dCA9ICIgKyB0aW1lb3V0KTsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygidW5pdHMgICA9ICIgKyB1bml0KTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gbGF0Y2guYXdhaXQgd2lsbCBvbmx5IGJsb2NrIGlmIGl0cyBjb3VudCBpcyA+IDAKLSAgICAgICAgbGF0Y2guYXdhaXQodGltZW91dCwgdW5pdCk7Ci0KLSAgICAgICAgaWYgKHNhdmVkRXhjZXB0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IHNhdmVkRXhjZXB0aW9uOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBJZiB0aGUgcmVzcG9uc2Ugc3RpbGwgaGFzbid0IGJlZW4gcmV0dXJuZWQsIHRoZW4gd2UndmUgdGltZWQgb3V0Ci0gICAgICAgIC8vIGFuZCBtdXN0IHRocm93IGEgVGltZW91dEV4Y2VwdGlvbgotICAgICAgICBpZiAobGF0Y2guZ2V0Q291bnQoKSA+IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBUaW1lb3V0RXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoImdldEVycjEiKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzcG9uc2VPYmplY3Q7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNDYW5jZWxsZWQoKSB7Ci0gICAgICAgIHJldHVybiBjYW5jZWxsZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNEb25lKCkgewotICAgICAgICByZXR1cm4gKGxhdGNoLmdldENvdW50KCkgPT0gMCk7Ci0gICAgfQotCi0gICAgcHVibGljIE1hcCBnZXRDb250ZXh0KCkgewotICAgICAgICByZXR1cm4gcmVzcG9uc2VDb250ZXh0OwotICAgIH0KLQotICAgIHByaXZhdGUgT2JqZWN0IHByb2Nlc3NSZXNwb25zZSgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotICAgIAkKLSAgICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhIGZhdWx0LCB0aGVuIHdlIGhhdmUgdG8gaGF2ZSBhIE1lc3NhZ2VDb250ZXh0IGZvciB0aGUgcmVzcG9uc2UuCi0gICAgICAgIGlmIChyZXNwb25zZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBsYXRjaC5jb3VudERvd24oKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBFeGVjdXRpb25FeGNlcHRpb24oRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJwcm9jZXNzUmVzcEVyciIpKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBBdm9pZCBhIHJlcGFyc2Ugb2YgdGhlIG1lc3NhZ2UuIElmIHdlIGFscmVhZHkgcmV0cml2ZWQgdGhlIG9iamVjdCwgcmV0dXJuCi0gICAgICAgIC8vIGl0IG5vdy4KLSAgICAgICAgaWYgKGNhY2hlVmFsaWQpIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiUmV0dXJuIG9iamVjdCBjYWNoZWQgZnJvbSBsYXN0IGdldCgpIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gY2FjaGVkT2JqZWN0OwotICAgICAgICB9Ci0KLSAgICAgICAgT2JqZWN0IG9iaiA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbnN0YWxsIHRoZSBhZGFwdGVycyBhbmQgaW52b2tlIGluYm91bmQgaGFuZGxlcnMuCi0gICAgICAgICAgICBUcmFuc3BvcnRIZWFkZXJzQWRhcHRlci5pbnN0YWxsKHJlc3BvbnNlKTsKLSAgICAgICAgICAgIEF0dGFjaG1lbnRzQWRhcHRlci5pbnN0YWxsKHJlc3BvbnNlKTsKLSAgICAgICAgICAgIFNPQVBIZWFkZXJzQWRhcHRlci5pbnN0YWxsKHJlc3BvbnNlKTsKLSAgICAgICAgICAgIEhhbmRsZXJJbnZva2VyVXRpbHMuaW52b2tlSW5ib3VuZEhhbmRsZXJzKHJlc3BvbnNlLmdldE1FUENvbnRleHQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmdldEludm9jYXRpb25Db250ZXh0KCkuZ2V0SGFuZGxlcnMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZXJDaGFpblByb2Nlc3Nvci5NRVAuUkVTUE9OU0UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7Ci0KLSAgICAgICAgICAgIC8vIFRPRE86IElNUE9SVEFOVDogdGhpcyBpcyB0aGUgcmlnaHQgY2FsbCBoZXJlLCBidXQgYmV3YXJlIHRoYXQgdGhlIAotICAgICAgICAgICAgLy8gbWVzc2FnZWNvbnRleHQgbWF5IGJlIHR1cm5lZCBpbnRvIGEgZmF1bHQgY29udGV4dCB3aXRoIGEgZmF1bHQgbWVzc2FnZS4gIAotICAgICAgICAgICAgLy8gV2UgbmVlZCB0byBjaGVjayBmb3IgdGhpcyBhbmQsIGlmIG5lY2Vzc2FyeSwgbWFrZSBhbiBleGNlcHRpb24gYW5kIHRocm93IGl0LgotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJVbm1hcnNoYWxsaW5nIHRoZSBhc3luYyByZXNwb25zZSBtZXNzYWdlLiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBEbyB0aGUgcmVhbCB3b3JrIHRvIHVubWFyc2hhbGwgdGhlIHJlc3BvbnNlLgotICAgICAgICAgICAgb2JqID0gZ2V0UmVzcG9uc2VWYWx1ZU9iamVjdChyZXNwb25zZSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSAmJiBvYmogIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiVW5tYXJzaGFsbGVkIHJlc3BvbnNlIG9iamVjdCBvZiB0eXBlOiAiICsgb2JqLmdldENsYXNzKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBDYWNoZSB0aGUgb2JqZWN0IGluIGNhc2UgaXQgaXMgcmVxdWlyZWQgYWdhaW4KLSAgICAgICAgICAgIGNhY2hlVmFsaWQgPSB0cnVlOwotICAgICAgICAgICAgY2FjaGVkT2JqZWN0ID0gb2JqOwotCi0gICAgICAgICAgICByZXNwb25zZUNvbnRleHQgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLQotICAgICAgICAgICAgLy8gTWlncmF0ZSB0aGUgcHJvcGVydGllcyBmcm9tIHRoZSByZXNwb25zZSBNZXNzYWdlQ29udGV4dCBiYWNrCi0gICAgICAgICAgICAvLyB0byB0aGUgY2xpZW50IHJlc3BvbnNlIGNvbnRleHQgYmFnLgotICAgICAgICAgICAgQXBwbGljYXRpb25Db250ZXh0TWlncmF0b3JVdGlsLnBlcmZvcm1NaWdyYXRpb25Gcm9tTWVzc2FnZUNvbnRleHQoQ29uc3RhbnRzLkFQUExJQ0FUSU9OX0NPTlRFWFRfTUlHUkFUT1JfTElTVF9JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlKTsKLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBFeGVjdXRpb25FeGNlcHRpb24oRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbih0KSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gb2JqOwotICAgIH0KLQotICAgIHByaXZhdGUgVGhyb3dhYmxlIHByb2Nlc3NGYXVsdFJlc3BvbnNlKCkgewotICAgICAgICAvLyBBIGZhdWx0TWVzc2FnZUNvbnRleHQgbWVhbnMgdGhhdCB0aGVyZSBjb3VsZCBwb3NzaWJseSBiZSBhIFNPQVBGYXVsdAotICAgICAgICAvLyBvbiB0aGUgTWVzc2FnZUNvbnRleHQgdGhhdCB3ZSBuZWVkIHRvIHVubWFyc2hhbGwuCi0gICAgICAgIGlmIChmYXVsdE1lc3NhZ2VDb250ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgCVRocm93YWJsZSB0aHJvd2FibGUgPSBudWxsOwotICAgICAgICAgICAgLy8gaXQgaXMgcG9zc2libGUgdGhlIG1lc3NhZ2UgY291bGQgYmUgbnVsbC4gIEZvciBleGFtcGxlLCBpZiB3ZSBnYXZlIHRoZSBwcm94eSBhIGJhZCBlbmRwb2ludCBhZGRyZXNzLgotICAgICAgICAgICAgLy8gSWYgaXQgaXMgdGhlIGNhc2UgdGhhdCB0aGUgbWVzc2FnZSBpcyBudWxsLCB0aGVyZSdzIG5vIHNlbnNlIHJ1bm5pbmcgdGhyb3VnaCB0aGUgaGFuZGxlcnMuCi0gICAgICAgICAgICBpZiAoZmF1bHRNZXNzYWdlQ29udGV4dC5nZXRNZXNzYWdlKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIFRoZSBhZGFwdGVycyBhcmUgaW50ZW50aW9uYWxseSBOT1QgaW5zdGFsbGVkIGhlcmUuICBUaGV5IGNhdXNlIHVuaXQgdGVzdCBmYWlsdXJlcwotICAgICAgICAgICAgICAgIC8vIFRyYW5zcG9ydEhlYWRlcnNBZGFwdGVyLmluc3RhbGwoZmF1bHRNZXNzYWdlQ29udGV4dCk7Ci0gICAgICAgICAgICAgICAgLy8gQXR0YWNobWVudHNBZGFwdGVyLmluc3RhbGwoZmF1bHRNZXNzYWdlQ29udGV4dCk7Ci0gICAgICAgICAgICAJdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW52b2tlIGluYm91bmQgaGFuZGxlcnMuCi0gICAgICAgICAgICAJICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgCSAgICAgICAgbG9nLmRlYnVnKCJJbnZva2luZyB0aGUgSkFYLVdTIGhhbmRsZXIgY2hhaW4gZm9yIHRoZSBmYXVsdCByZXNwb25zZS4iKTsKLSAgICAgICAgICAgIAkgICAgfQotICAgICAgICAgICAgICAgICAgICBIYW5kbGVySW52b2tlclV0aWxzLmludm9rZUluYm91bmRIYW5kbGVycyhmYXVsdE1lc3NhZ2VDb250ZXh0LmdldE1FUENvbnRleHQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYXVsdE1lc3NhZ2VDb250ZXh0LmdldEludm9jYXRpb25Db250ZXh0KCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEhhbmRsZXJzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlckNoYWluUHJvY2Vzc29yLk1FUC5SRVNQT05TRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7Ci0gICAgICAgICAgICAJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgICAgIAkgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAJICAgICAgICBsb2cuZGVidWcoIkFuIGVycm9yIG9jY3VycmVkICgiICsgdC5nZXRDbGFzcygpICsgIiB3aGlsZSBwcm9jZXNzaW5nICIgKwotICAgICAgICAgICAgCSAgICAgICAgInRoZSBmYXVsdCByZXNwb25zZSBoYW5kbGVyIGNoYWluLiIpOwotICAgICAgICAgICAgCSAgICB9Ci0gICAgICAgICAgICAJICAgIHRocm93YWJsZSA9IHQ7Ci0gICAgICAgICAgICAJfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHRocm93YWJsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gRG8gdGhlIHJlYWwgd29yayB0byB1bm1hcnNoYWwgdGhlIGZhdWx0IHJlc3BvbnNlLgotICAgICAgICAgICAgICAgIHRocm93YWJsZSA9IGdldEZhdWx0UmVzcG9uc2UoZmF1bHRNZXNzYWdlQ29udGV4dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmICh0aHJvd2FibGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiB0aHJvd2FibGU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGZhdWx0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGZhdWx0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBhYnN0cmFjdCBPYmplY3QgZ2V0UmVzcG9uc2VWYWx1ZU9iamVjdChNZXNzYWdlQ29udGV4dCBtYyk7Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgVGhyb3dhYmxlIGdldEZhdWx0UmVzcG9uc2UoTWVzc2FnZUNvbnRleHQgbWMpOwotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jbGllbnQvYXN5bmMvQXN5bmNVdGlscy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2xpZW50L2FzeW5jL0FzeW5jVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2MwZTRhMC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jbGllbnQvYXN5bmMvQXN5bmNVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNsaWVudC5hc3luYzsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50LmFzeW5jLkFzeW5jUmVzdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuRXhjZXB0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51dGlsLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuVGhyZWFkQ29udGV4dE1pZ3JhdG9yVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgQXN5bmNVdGlscyB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coQXN5bmNVdGlscy5jbGFzcyk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBkZWJ1ZyA9IGxvZy5pc0RlYnVnRW5hYmxlZCgpOwotCi0gICAgcHVibGljIHN0YXRpYyBNZXNzYWdlQ29udGV4dCBjcmVhdGVKQVhXU01lc3NhZ2VDb250ZXh0KEFzeW5jUmVzdWx0IHJlc3VsdCkKLSAgICAgICAgICAgIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIEFzeW5jVXRpbHMuY3JlYXRlSkFYV1NNZXNzYWdlQ29udGV4dChyZXN1bHQuZ2V0UmVzcG9uc2VNZXNzYWdlQ29udGV4dCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE1lc3NhZ2VDb250ZXh0IGNyZWF0ZUpBWFdTTWVzc2FnZUNvbnRleHQoCi0gICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQgbWMpIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgTWVzc2FnZUNvbnRleHQgcmVzcG9uc2UgPSBudWxsOwotCi0gICAgICAgIGlmIChkZWJ1ZykgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJDcmVhdGluZyByZXNwb25zZSBNZXNzYWdlQ29udGV4dCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQ3JlYXRlIHRoZSBKQVgtV1MgcmVzcG9uc2UgTWVzc2FnZUNvbnRleHQgZnJvbSB0aGUgQXhpczIgcmVzcG9uc2UKLSAgICAgICAgcmVzcG9uc2UgPSBuZXcgTWVzc2FnZUNvbnRleHQobWMpOwotICAgICAgICAvLyBkb24ndCBzZXQgdGhlIHJlc3BvbnNlLnNldE1FUENvbnRleHQoKSBoZXJlLgotCi0gICAgICAgIC8vIFJFVklFVzogQXJlIHdlIG9uIHRoZSBmaW5hbCB0aHJlYWQgb2YgZXhlY3V0aW9uIGhlcmUgb3IgZG9lcyB0aGlzIGdldCBoYW5kZWQgb2ZmIHRvIHRoZSBleGVjdXRvcj8KLSAgICAgICAgLy8gVE9ETzogUmVtb3ZlIHdvcmthcm91bmQgZm9yIFdTLUFkZHJlc3NpbmcgcnVubmluZyBpbiB0aGluIGNsaWVudCAobm9uLXNlcnZlcikgZW52aXJvbm1lbnQKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFRocmVhZENvbnRleHRNaWdyYXRvclV0aWwKLSAgICAgICAgICAgICAgICAgICAgLnBlcmZvcm1NaWdyYXRpb25Ub1RocmVhZChDb25zdGFudHMuVEhSRUFEX0NPTlRFWFRfTUlHUkFUT1JfTElTVF9JRCwgbWMpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkgewotICAgICAgICAgICAgaWYgKGRlYnVnKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKG1jLmdldExvZ0lEU3RyaW5nKCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgIiBBbiBlcnJvciBvY2N1cnJlZCBpbiB0aGUgVGhyZWFkQ29udGV4dE1pZ3JhdG9yVXRpbCAiICsgdCk7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIuLi5jYXVzZWQgYnkgIiArIHQuZ2V0Q2F1c2UoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3BvbnNlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NsaWVudC9hc3luYy9DYWxsYmFja0Z1dHVyZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2xpZW50L2FzeW5jL0NhbGxiYWNrRnV0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5MGE4YTcuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2xpZW50L2FzeW5jL0NhbGxiYWNrRnV0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNsaWVudC5hc3luYzsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50LmFzeW5jLkFzeW5jUmVzdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50LmFzeW5jLkNhbGxiYWNrOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS5JbnZvY2F0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC54bWwud3MuQXN5bmNIYW5kbGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5DYWxsYWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlVGFzazsKLQotLyoqCi0gKiBUaGUgQ2FsbGJhY2tGdXR1cmUgaW1wbGVtZW50cyB0aGUgQXhpczIgPGxpbms+b3JnLmFwYWNoZS5heGlzMi5jbGllbnQuYXN5bmMuQ2FsbGJhY2s8L2xpbms+IEFQSQotICogYW5kIHdpbGwgZ2V0IHJlZ2lzdGVyZWQgd2l0aCB0aGUgQXhpczIgZW5naW5lIHRvIHJlY2VpdmUgdGhlIGFzeW5jaHJvbm91cyBjYWxsYmFjayByZXNwb25zZXMuCi0gKiBUaGlzIG9iamVjdCBpcyBhbHNvIHJlc3BvbnNpYmxlIGZvciB0YWtpbmcgdGhlIDxsaW5rPmphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yPC9saW5rPiBnaXZlbgotICogdG8gaXQgYnkgdGhlIEpBWC1XUyBjbGllbnQgYW5kIHVzaW5nIHRoYXQgYXMgdGhlIHRocmVhZCBvbiB3aGljaCB0byBkZWxpdmVyIHRoZSBhc3luYyByZXNwb25zZQotICogdGhlIEpBWC1XUyA8bGluaz5qYXZheC54bWwud3MuQXN5bmNoSGFuZGxlcjwvbGluaz4uCi0gKi8KLXB1YmxpYyBjbGFzcyBDYWxsYmFja0Z1dHVyZSBleHRlbmRzIENhbGxiYWNrIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhDYWxsYmFja0Z1dHVyZS5jbGFzcyk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBkZWJ1ZyA9IGxvZy5pc0RlYnVnRW5hYmxlZCgpOwotCi0gICAgcHJpdmF0ZSBDYWxsYmFja0Z1dHVyZVRhc2sgY2Z0OwotICAgIHByaXZhdGUgRXhlY3V0b3IgZXhlY3V0b3I7Ci0gICAgcHJpdmF0ZSBGdXR1cmVUYXNrIHRhc2s7Ci0gICAgCi0gICAgcHJpdmF0ZSBJbnZvY2F0aW9uQ29udGV4dCBpbnZvY2F0aW9uQ3R4OwotICAgIAotICAgIC8qCi0gICAgICogVGhlcmUgYXJlIHR3byBBc3luYyBDYWxsYmFjayBGdXR1cmUuY2FuY2VsIHNjZW5hcmlvIHRoYXQgd2UgYWRkcmVzcwotICAgICAqIDEpIENsaWVudCBhcHAgY3JlYXRlcyByZXF1ZXN0IGFuZCBjYWxsIEFzeW5jIE9wZXJhdGlvbi4gTm93IGJlZm9yZSB0aGUgcmVxdWVzdCBpcyBzdWJtaXR0ZWQKLSAgICAgKiAJICBieSBKQVhXUyB0byBFeGVjdXRvciBmb3IgcHJvY2Vzc2luZyBhbmQgYW55IHJlc3BvbnNlIGlzIHJlY2VpdmVkIGNsaWVudCBkZWNpZGVzIHRvIGNhbmNlbCAKLSAgICAgKiAJICB0aGUgZnV0dXJlIHRhc2suCi0gICAgICogMikgQ2xpZW50IGFwcCBjcmVhdGVzIHJlcXVlc3QgYW5kIGNhbGwgQXN5bmMgT3BlcmF0aW9uLiBSZXF1ZXN0IGlzIHN1Ym1pdHRlZCBieSBKQVhXUyAKLSAgICAgKiAJICB0byBFeGVjdXRvciBmb3IgcHJvY2Vzc2luZyBhbmQgYSByZXNwb25zZSBpcyByZWNlaXZlZCBhbmQgY2xpZW50IGRlY2lkZXMgdG8gY2FuY2VsIHRoZSBmdXR1cmUKLSAgICAgKiAJICB0YXNrLgotICAgICAqIAotICAgICAqIFdlIHdpbGwgYWRkcmVzcyBib3RoIHRoZXNlIHNjZW5hcmlvcyBpbiB0aGUgY29kZS4gSW4gc2NlbmFyaW8gMSB3ZSB3aWxsIGRvIHRoZSBmb2xsb3dpbmc6Ci0gICAgICogMSkgQ2hlY2sgdGhlIGZvciB0aGUgZnV0dXJlLmlzQ2FuY2VsbGVkIGJlZm9yZSBzdWJtaXR0aW5nIHRoZSB0YXNrIHRvIEV4ZWN1dG9yIAotICAgICAqIDIpIElmIGNhbmNlbGxlZCB0aGVuIGRvIG5vdCBzdWJtaXQgdGhlIHRhc2sgYW5kIGRvIG5vdCBjYWxsIHRoZSBBc3luYyBIYW5kbGVyIG9mIGNsaWVudC4gCi0gICAgICogMylUaGUgY2xpZW50IHByb2dyYW0gaW4gdGhpcyBjYXNlIChTaW5jZSBpdCBjYW5jZWxsZWQgdGhlIGZ1dHVyZSkgd2lsbCBiZSByZXNwb25zaWJsZSBmb3IgY2xlYW5pbmcgYW55IHJlc291cmNlcyB0aGF0IGl0IGVuZ2FnZXMuCi0gICAgICogCi0gICAgICogSW4gU2Vjb25kIFNjZW5hcmlvIHdlIHdpbGwgY2FsbCB0aGUgQXN5bmNIYW5kbGVyIGFzIEZ1dHVyZS5pc0NhbmNlbGxlZCB3aWxsIGJlIGZhbHNlLiBBcyBwZXIgamF2YSBkb2MKLSAgICAgKiB0aGUgRnV0dXJlIGNhbm5vdCBiZSBjYW5jZWxsZWQgb25jZSB0aGUgdGFzayBoYXMgYmVlbiBzdWJtaXR0ZWQuIEFsc28gdGhlIHJlc3BvbnNlIGhhcyBhbHJlYWR5IGFycml2ZWQgc28gCi0gICAgICogd2Ugd2lsbCBtYWtlIHRoZSBBc3luY0hhbmRsZXIgYW5kIGxldCB0aGUgY2xpZW50IGNvZGUgZGVjaWRlZCBob3cgaXQgd2FudHMgdG8gdHJlYXQgdGhlIHJlc3BvbnNlLgotICAgICAqLwotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHVibGljIENhbGxiYWNrRnV0dXJlKEludm9jYXRpb25Db250ZXh0IGljLCBBc3luY0hhbmRsZXIgaGFuZGxlcikgewotICAgICAgICBjZnQgPSBuZXcgQ2FsbGJhY2tGdXR1cmVUYXNrKGljLmdldEFzeW5jUmVzcG9uc2VMaXN0ZW5lcigpLCBoYW5kbGVyKTsKLSAgICAgICAgdGFzayA9IG5ldyBGdXR1cmVUYXNrKGNmdCk7Ci0gICAgICAgIGV4ZWN1dG9yID0gaWMuZ2V0RXhlY3V0b3IoKTsKLSAgICAgICAgCi0gICAgICAgIC8qCi0gICAgICAgICAqIFRPRE8gcmV2aWV3LiAgV2UgbmVlZCB0byBzYXZlIHRoZSBpbnZvY2F0aW9uIGNvbnRleHQgc28gd2UgY2FuIHNldCBpdCBvbiB0aGUKLSAgICAgICAgICogcmVzcG9uc2UgKG9yIGZhdWx0KSBjb250ZXh0IHNvIHRoZSBGdXR1cmVDYWxsYmFjayBoYXMgYWNjZXNzIHRvIHRoZSBoYW5kbGVyIGxpc3QuCi0gICAgICAgICAqLwotICAgICAgICBpbnZvY2F0aW9uQ3R4ID0gaWM7Ci0gICAgfQotCi0gICAgcHVibGljIEZ1dHVyZTw/PiBnZXRGdXR1cmVUYXNrKCkgewotICAgICAgICByZXR1cm4gKEZ1dHVyZTw/Pil0YXNrOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uQ29tcGxldGUoQXN5bmNSZXN1bHQgcmVzdWx0KSB7Ci0gICAgICAgIGlmIChkZWJ1ZykgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJKQVgtV1MgcmVjZWl2ZWQgdGhlIGFzeW5jIHJlc3BvbnNlIik7Ci0gICAgICAgIH0KLQotICAgICAgICBNZXNzYWdlQ29udGV4dCByZXNwb25zZSA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXNwb25zZSA9IEFzeW5jVXRpbHMuY3JlYXRlSkFYV1NNZXNzYWdlQ29udGV4dChyZXN1bHQpOwotICAgICAgICAgICAgcmVzcG9uc2Uuc2V0SW52b2NhdGlvbkNvbnRleHQoaW52b2NhdGlvbkN0eCk7Ci0gICAgICAgICAgICAvLyBtYWtlIHN1cmUgcmVxdWVzdCBhbmQgcmVzcG9uc2UgY29udGV4dHMgc2hhcmUgYSBzaW5nbGUgcGFyZW50Ci0gICAgICAgICAgICByZXNwb25zZS5zZXRNRVBDb250ZXh0KGludm9jYXRpb25DdHguZ2V0UmVxdWVzdE1lc3NhZ2VDb250ZXh0KCkuZ2V0TUVQQ29udGV4dCgpKTsKLSAgICAgICAgfSBjYXRjaCAoV2ViU2VydmljZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBjZnQuc2V0RXJyb3IoZSk7Ci0gICAgICAgICAgICBpZiAoZGVidWcpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoCi0gICAgICAgICAgICAgICAgICAgICAgICAiQW4gZXJyb3Igb2NjdXJlZCB3aGlsZSBwcm9jZXNzaW5nIHRoZSBhc3luYyByZXNwb25zZS4gICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocmVzcG9uc2UgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gVE9ETzogdGhyb3cgYW4gZXhjZXB0aW9uCi0gICAgICAgIH0KLQotICAgICAgICBjZnQuc2V0TWVzc2FnZUNvbnRleHQocmVzcG9uc2UpOwotICAgICAgICBleGVjdXRlKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25FcnJvcihFeGNlcHRpb24gZSkgewotICAgICAgICAvLyBJZiBhIFNPQVBGYXVsdCB3YXMgcmV0dXJuZWQgYnkgdGhlIEF4aXNFbmdpbmUsIHRoZSBBeGlzRmF1bHQKLSAgICAgICAgLy8gdGhhdCBpcyByZXR1cm5lZCBzaG91bGQgaGF2ZSBhIE1lc3NhZ2VDb250ZXh0IHdpdGggaXQuICBVc2UKLSAgICAgICAgLy8gdGhpcyB0byB1bm1hcnNoYWxsIHRoZSBmYXVsdCBpbmNsdWRlZCB0aGVyZS4KLSAgICAgICAgaWYgKGUuZ2V0Q2xhc3MoKS5pc0Fzc2lnbmFibGVGcm9tKEF4aXNGYXVsdC5jbGFzcykpIHsKLSAgICAgICAgICAgIEF4aXNGYXVsdCBmYXVsdCA9IChBeGlzRmF1bHQpZTsKLSAgICAgICAgICAgIE1lc3NhZ2VDb250ZXh0IGZhdWx0TWVzc2FnZUNvbnRleHQgPSBudWxsOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBmYXVsdE1lc3NhZ2VDb250ZXh0ICA9IEFzeW5jVXRpbHMuY3JlYXRlSkFYV1NNZXNzYWdlQ29udGV4dChmYXVsdC5nZXRGYXVsdE1lc3NhZ2VDb250ZXh0KCkpOwotICAgICAgICAgICAgICAgIGZhdWx0TWVzc2FnZUNvbnRleHQuc2V0SW52b2NhdGlvbkNvbnRleHQoaW52b2NhdGlvbkN0eCk7Ci0gICAgICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHJlcXVlc3QgYW5kIHJlc3BvbnNlIGNvbnRleHRzIHNoYXJlIGEgc2luZ2xlIHBhcmVudAotICAgICAgICAgICAgICAgIGZhdWx0TWVzc2FnZUNvbnRleHQuc2V0TUVQQ29udGV4dChpbnZvY2F0aW9uQ3R4LmdldFJlcXVlc3RNZXNzYWdlQ29udGV4dCgpLmdldE1FUENvbnRleHQoKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChXZWJTZXJ2aWNlRXhjZXB0aW9uIHdzZSkgewotICAgICAgICAgICAgICAgIGNmdC5zZXRFcnJvcih3c2UpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjZnQuc2V0RXJyb3IoZSk7Ci0gICAgICAgICAgICBjZnQuc2V0TWVzc2FnZUNvbnRleHQoZmF1bHRNZXNzYWdlQ29udGV4dCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjZnQuc2V0RXJyb3IoZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBleGVjdXRlKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGV4ZWN1dGUoKSB7Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJFeGVjdXRvciB0YXNrIHN0YXJ0aW5nIHRvIHByb2Nlc3MgYXN5bmMgcmVzcG9uc2UiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChleGVjdXRvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAodGFzayAhPSBudWxsICYmICF0YXNrLmlzQ2FuY2VsbGVkKCkpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBleGVjdXRvci5leGVjdXRlKHRhc2spOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4ZWN1dG9yRXhjKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJDYWxsYmFja0Z1dHVyZS5leGVjdXRlKCk6ICBleGVjdXRvciBleGNlcHRpb24gWyIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRvckV4Yy5nZXRDbGFzcygpLmdldE5hbWUoKSArICJdIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvLyBhdHRlbXB0IHRvIGNhbmNlbCB0aGUgRnV0dXJlVGFzawotICAgICAgICAgICAgICAgICAgICB0YXNrLmNhbmNlbCh0cnVlKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyAgIG5vdGU6IGlmIGl0IGlzIGJlY29tZXMgcmVxdWlyZWQgdG8gcmV0dXJuIHRoZSBhY3R1YWwgZXhjZXB0aW9uCi0gICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgdG8gdGhlIGNsaWVudCwgdGhlbiB3ZSB3b3VsZCBuZWVkIHRvIGRvaW5nIHNvbWV0aGluZwotICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgIHNpbWlsYXIgdG8gc2V0dGluZyB0aGUgQ2FsbGJhY2tGdXR1cmVUYXNrIHdpdGggdGhlIGVycm9yCi0gICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgYW5kIGludm9raW5nIHRoZSBDYWxsYmFja0Z1dHVyZVRhc2suY2FsbCgpIGludGVyZmFjZQotICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgIHRvIHByb2Nlc3MgdGhlIGluZm9ybWF0aW9uCi0gICAgICAgICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiVGFzayBzdWJtaXR0ZWQgdG8gRXhlY3V0b3IiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgKiBUT0RPOiAgcmV2aWV3Ci0gICAgICAgICAgICAgICAgICogQSB0aHJlYWQgc3dpdGNoIHdpbGwgb2NjdXIgaW1tZWRpYXRlbHkgYWZ0ZXIgZ29pbmcgb3V0IG9mIHNjb3BlCi0gICAgICAgICAgICAgICAgICogb24gdGhpcyBtZXRob2QuICBUaGlzIGlzIG9rLCBleGNlcHQgb24gc29tZSBwbGF0Zm9ybXMgdGhpcyB3aWxsCi0gICAgICAgICAgICAgICAgICogcHJvbXB0IHRoZSBKVk0gdG8gY2xlYW4gdXAgdGhlIG9sZCB0aHJlYWQsIHRodXMgY2xlYW5pbmcgdXAgYW55Ci0gICAgICAgICAgICAgICAgICogSW5wdXRTdHJlYW1zIHRoZXJlLiAgSWYgdGhhdCdzIHRoZSBjYXNlLCBhbmQgd2UgaGF2ZSBub3QgZnVsbHkKLSAgICAgICAgICAgICAgICAgKiByZWFkIHRoZSBJbnB1dFN0cmVhbXMsIHdlIHdpbGwgbGlrZWx5IGdldCBhIE51bGxQb2ludGVyRXhjZXB0aW9uCi0gICAgICAgICAgICAgICAgICogY29taW5nIGZyb20gdGhlIHBhcnNlciwgd2hpY2ggaGFzIGEgcmVmZXJlbmNlIHRvIHRoZSBJbnB1dFN0cmVhbQotICAgICAgICAgICAgICAgICAqIHRoYXQgZ290IG51bGxlZCBvdXQgZnJvbSB1bmRlciBpdC4gIE1ha2Ugc3VyZSB0byBkbyB0aGUKLSAgICAgICAgICAgICAgICAgKiBjZnQubm90aWZ5QWxsKCkgaW4gdGhlIHJpZ2h0IHBsYWNlLiAgQ2FsbGJhY2tGdXR1cmVUYXNrLmNhbGwoKQotICAgICAgICAgICAgICAgICAqIGlzIHRoZSByaWdodCBwbGFjZSBzaW5jZSBhdCB0aGF0IHBvaW50LCB0aGUgcGFyc2VyIGhhcyBmdWxseSByZWFkCi0gICAgICAgICAgICAgICAgICogdGhlIElucHV0U3RyZWFtLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoY2Z0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZighY2Z0LmRvbmUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZnQud2FpdCgxODAwMDApOyAgLy8gMyBtaW51dGVzCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkZWJ1ZykgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJjZnQud2FpdCgpIHdhcyBpbnRlcnJ1cHRlZCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJFeGNlcHRpb246ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4ZWN1dG9yIHRhc2sgd2FzIG5vdCBzdW1iaXR0ZWQgYXMgQXN5bmMgRnV0dXJlIHRhc2sgd2FzIGNhbmNlbGxlZCBieSBjbGllbnRzIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIkV4ZWN1dG9yIHRhc2sgY29tcGxldGVkIik7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLWNsYXNzIENhbGxiYWNrRnV0dXJlVGFzayBpbXBsZW1lbnRzIENhbGxhYmxlIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhDYWxsYmFja0Z1dHVyZVRhc2suY2xhc3MpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gZGVidWcgPSBsb2cuaXNEZWJ1Z0VuYWJsZWQoKTsKLQotICAgIEFzeW5jUmVzcG9uc2UgcmVzcG9uc2U7Ci0gICAgTWVzc2FnZUNvbnRleHQgbXNnQ3R4OwotICAgIEFzeW5jSGFuZGxlciBoYW5kbGVyOwotICAgIEV4Y2VwdGlvbiBlcnJvcjsKLSAgICBib29sZWFuIGRvbmUgPSBmYWxzZTsKLQotICAgIENhbGxiYWNrRnV0dXJlVGFzayhBc3luY1Jlc3BvbnNlIHIsIEFzeW5jSGFuZGxlciBoKSB7Ci0gICAgICAgIHJlc3BvbnNlID0gcjsKLSAgICAgICAgaGFuZGxlciA9IGg7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBBc3luY0hhbmRsZXIgZ2V0SGFuZGxlcigpIHsKLSAgICAgICAgcmV0dXJuIGhhbmRsZXI7Ci0gICAgfQotICAgIAotICAgIHZvaWQgc2V0TWVzc2FnZUNvbnRleHQoTWVzc2FnZUNvbnRleHQgbWMpIHsKLSAgICAgICAgbXNnQ3R4ID0gbWM7Ci0gICAgfQotCi0gICAgdm9pZCBzZXRFcnJvcihFeGNlcHRpb24gZSkgewotICAgICAgICBlcnJvciA9IGU7Ci0gICAgfQotCi0gICAgCi0gICAgLyoKLSAgICAgKiBBbiBpbnZvY2F0aW9uIG9mIHRoZSBjYWxsKCkgbWV0aG9kIGlzIHdoYXQgZHJpdmVzIHRoZSByZXNwb25zZSBwcm9jZXNzaW5nCi0gICAgICogZm9yIENhbGxiYWNrIGNsaWVudHMuICBUaGUgZW5kIHJlc3VsdCBvZiB0aGlzIHNob3VsZCBiZSB0aGF0IHRoZSBBeXNuY0hhbmRsZXIKLSAgICAgKiAodGhlIGNhbGxiYWNrIGluc3RhbmNlKSBwcm92aWRlZCBieSB0aGUgY2xpZW50IGlzIGNhbGxlZCBhbmQgdGhlIHJlc3BvbnNlIG9yCi0gICAgICogYW4gZXJyb3IgaXMgZGVsaXZlcmVkLgotICAgICAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHB1YmxpYyBPYmplY3QgY2FsbCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIAl0cnkgewotICAgICAgICAgICAgLy8gVGhlIENsYXNzTG9hZGVyIHRoYXQgd2FzIHVzZWQgdG8gbG9hZCB0aGUgQXN5bmNIYW5kbGVyIGluc3RhbmNlIGlzIHRoZSBzYW1lCi0gICAgICAgICAgICAvLyBvbmUgdGhhdCBpcyB1c2VkIHRvIGNyZWF0ZSB0aGUgSkFYQiByZXF1ZXN0IG9iamVjdCBpbnN0YW5jZXMuICBCZWNhdXNlIG9mIHRoYXQKLSAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gbWFrZSBzdXJlIHdlJ3JlIHVzaW5nIHRoZSBzYW1lIENsYXNzTG9hZGVyIGFzIHdlIHN0YXJ0IHJlc3BvbnNlCi0gICAgICAgICAgICAvLyBwcm9jZXNzaW5nIG9yIENsYXNzQ2FzdEV4Y2VwdGlvbnMgd2lsbCBvY2N1ci4KLSAgICAgICAgICAgIGZpbmFsIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyID0gKENsYXNzTG9hZGVyKUFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkQWN0aW9uKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlci5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiU2V0dGluZyB1cCB0aGUgdGhyZWFkJ3MgQ2xhc3NMb2FkZXIiKTsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoY2xhc3NMb2FkZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEFjdGlvbigpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIoY2xhc3NMb2FkZXIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gU2V0IHRoZSByZXNwb25zZSBvciBmYXVsdCBjb250ZW50IG9uIHRoZSBBc3luY1Jlc3BvbnNlIG9iamVjdAotICAgICAgICAgICAgLy8gc28gdGhhdCBpdCBjYW4gYmUgY29sbGVjdGVkIGluc2lkZSB0aGUgRXhlY3V0b3IgdGhyZWFkIGFuZCBwcm9jZXNzZWQuCi0gICAgICAgICAgICBpZiAoZXJyb3IgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJlc3BvbnNlLm9uRXJyb3IoZXJyb3IsIG1zZ0N0eCwgY2xhc3NMb2FkZXIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXNwb25zZS5vbkNvbXBsZXRlKG1zZ0N0eCwgY2xhc3NMb2FkZXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBOb3cgdGhhdCB0aGUgY29udGVudCBpcyBhdmFpbGFibGUsIGNhbGwgdGhlIEpBWC1XUyBBc3luY0hhbmRsZXIgY2xhc3MKLSAgICAgICAgICAgIC8vIHRvIGRlbGl2ZXIgdGhlIHJlc3BvbnNlIHRvIHRoZSB1c2VyLgotICAgICAgICAgICAgaWYgKGRlYnVnKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJDYWxsaW5nIEpBWC1XUyBBc3luY0hhbmRsZXIgd2l0aCB0aGUgUmVzcG9uc2Ugb2JqZWN0Iik7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJBeW5jSGFuZGxlciBjbGFzczogIiArIGhhbmRsZXIuZ2V0Q2xhc3MoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBoYW5kbGVyLmhhbmRsZVJlc3BvbnNlKHJlc3BvbnNlKTsKLSAgICAJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgICAgIGlmIChkZWJ1ZykgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQW4gZXJyb3Igb2NjdXJlZCB3aGlsZSBpbnZva2luZyB0aGUgY2FsbGJhY2sgb2JqZWN0LiIpOwotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiRXJyb3I6ICIgKyB0LmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgCX0gZmluYWxseSB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQodGhpcykgewotICAgICAgICAgICAgICAgIGRvbmUgPSB0cnVlOwotICAgICAgICAgICAgICAgIHRoaXMubm90aWZ5QWxsKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2xpZW50L2FzeW5jL1BvbGxpbmdGdXR1cmUuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NsaWVudC9hc3luYy9Qb2xsaW5nRnV0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3MGU4ZmQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2xpZW50L2FzeW5jL1BvbGxpbmdGdXR1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY2xpZW50LmFzeW5jOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuYXN5bmMuQXN5bmNSZXN1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuYXN5bmMuQ2FsbGJhY2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLkludm9jYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgUG9sbGluZ0Z1dHVyZSBleHRlbmRzIENhbGxiYWNrIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhQb2xsaW5nRnV0dXJlLmNsYXNzKTsKLQotICAgIHByaXZhdGUgQXN5bmNSZXNwb25zZSByZXNwb25zZTsKLSAgICBwcml2YXRlIEludm9jYXRpb25Db250ZXh0IGludm9jYXRpb25DdHg7Ci0gICAgCi0gICAgcHVibGljIFBvbGxpbmdGdXR1cmUoSW52b2NhdGlvbkNvbnRleHQgaWMpIHsKLSAgICAgICAgcmVzcG9uc2UgPSBpYy5nZXRBc3luY1Jlc3BvbnNlTGlzdGVuZXIoKTsKLSAgICAgICAgCi0gICAgICAgIC8qCi0gICAgICAgICAqIFRPRE8gcmV2aWV3LiAgV2UgbmVlZCB0byBzYXZlIHRoZSBpbnZvY2F0aW9uIGNvbnRleHQgc28gd2UgY2FuIHNldCBpdCBvbiB0aGUKLSAgICAgICAgICogcmVzcG9uc2UgKG9yIGZhdWx0KSBjb250ZXh0IHNvIHRoZSBGdXR1cmVDYWxsYmFjayBoYXMgYWNjZXNzIHRvIHRoZSBoYW5kbGVyIGxpc3QuCi0gICAgICAgICAqLwotICAgICAgICBpbnZvY2F0aW9uQ3R4ID0gaWM7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25Db21wbGV0ZShBc3luY1Jlc3VsdCByZXN1bHQpIHsKLSAgICAgICAgYm9vbGVhbiBkZWJ1ZyA9IGxvZy5pc0RlYnVnRW5hYmxlZCgpOwotICAgICAgICBpZiAoZGVidWcpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiSkFYLVdTIGFzeW5jIHJlc3BvbnNlIGxpc3RlbmVyIHJlY2VpdmVkIHRoZSByZXNwb25zZSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgTWVzc2FnZUNvbnRleHQgcmVzcG9uc2VNc2dDdHggPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmVzcG9uc2VNc2dDdHggPSBBc3luY1V0aWxzLmNyZWF0ZUpBWFdTTWVzc2FnZUNvbnRleHQocmVzdWx0KTsKLSAgICAgICAgICAgIHJlc3BvbnNlTXNnQ3R4LnNldEludm9jYXRpb25Db250ZXh0KGludm9jYXRpb25DdHgpOwotICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHJlcXVlc3QgYW5kIHJlc3BvbnNlIGNvbnRleHRzIHNoYXJlIGEgc2luZ2xlIHBhcmVudAotICAgICAgICAgICAgcmVzcG9uc2VNc2dDdHguc2V0TUVQQ29udGV4dChpbnZvY2F0aW9uQ3R4LmdldFJlcXVlc3RNZXNzYWdlQ29udGV4dCgpLmdldE1FUENvbnRleHQoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKFdlYlNlcnZpY2VFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmVzcG9uc2Uub25FcnJvcihlLCBudWxsKTsKLSAgICAgICAgICAgIGlmIChkZWJ1ZykgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygKLSAgICAgICAgICAgICAgICAgICAgICAgICJBbiBlcnJvciBvY2N1cmVkIHdoaWxlIHByb2Nlc3NpbmcgdGhlIGFzeW5jIHJlc3BvbnNlLiAgIiArIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChyZXNwb25zZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBUT0RPOiB0aHJvdyBhbiBleGNlcHRpb24KLSAgICAgICAgfQotCi0gICAgICAgIHJlc3BvbnNlLm9uQ29tcGxldGUocmVzcG9uc2VNc2dDdHgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uRXJyb3IoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgLy8gSWYgYSBTT0FQRmF1bHQgd2FzIHJldHVybmVkIGJ5IHRoZSBBeGlzRW5naW5lLCB0aGUgQXhpc0ZhdWx0Ci0gICAgICAgIC8vIHRoYXQgaXMgcmV0dXJuZWQgc2hvdWxkIGhhdmUgYSBNZXNzYWdlQ29udGV4dCB3aXRoIGl0LiAgVXNlCi0gICAgICAgIC8vIHRoaXMgdG8gdW5tYXJzaGFsbCB0aGUgZmF1bHQgaW5jbHVkZWQgdGhlcmUuCi0gICAgICAgIGlmIChlLmdldENsYXNzKCkuaXNBc3NpZ25hYmxlRnJvbShBeGlzRmF1bHQuY2xhc3MpKSB7Ci0gICAgICAgICAgICBBeGlzRmF1bHQgZmF1bHQgPSAoQXhpc0ZhdWx0KWU7Ci0gICAgICAgICAgICBNZXNzYWdlQ29udGV4dCBmYXVsdE1lc3NhZ2VDb250ZXh0ID0gbnVsbDsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgZmF1bHRNZXNzYWdlQ29udGV4dCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBBc3luY1V0aWxzLmNyZWF0ZUpBWFdTTWVzc2FnZUNvbnRleHQoZmF1bHQuZ2V0RmF1bHRNZXNzYWdlQ29udGV4dCgpKTsKLSAgICAgICAgICAgICAgICBmYXVsdE1lc3NhZ2VDb250ZXh0LnNldEludm9jYXRpb25Db250ZXh0KGludm9jYXRpb25DdHgpOwotICAgICAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSByZXF1ZXN0IGFuZCByZXNwb25zZSBjb250ZXh0cyBzaGFyZSBhIHNpbmdsZSBwYXJlbnQKLSAgICAgICAgICAgICAgICBmYXVsdE1lc3NhZ2VDb250ZXh0LnNldE1FUENvbnRleHQoaW52b2NhdGlvbkN0eC5nZXRSZXF1ZXN0TWVzc2FnZUNvbnRleHQoKS5nZXRNRVBDb250ZXh0KCkpOwotICAgICAgICAgICAgfSBjYXRjaCAoV2ViU2VydmljZUV4Y2VwdGlvbiB3c2UpIHsKLSAgICAgICAgICAgICAgICByZXNwb25zZS5vbkVycm9yKHdzZSwgbnVsbCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJlc3BvbnNlLm9uRXJyb3IoZSwgZmF1bHRNZXNzYWdlQ29udGV4dCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXNwb25zZS5vbkVycm9yKGUsIG51bGwpOwotICAgICAgICB9Ci0gICAgfQotCi19Ci0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NsaWVudC9jb25maWcvQWRkcmVzc2luZ0NvbmZpZ3VyYXRvci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2xpZW50L2NvbmZpZy9BZGRyZXNzaW5nQ29uZmlndXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmZmI3MjMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2xpZW50L2NvbmZpZy9BZGRyZXNzaW5nQ29uZmlndXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jbGllbnQuY29uZmlnOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkFkZHJlc3NpbmdDb25zdGFudHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5BZGRyZXNzaW5nQ29uc3RhbnRzLkZpbmFsOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuQWRkcmVzc2luZ0NvbnN0YW50cy5TdWJtaXNzaW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLkV4Y2VwdGlvbkZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuYWRkcmVzc2luZy5TdWJtaXNzaW9uQWRkcmVzc2luZ0ZlYXR1cmU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuYmluZGluZy5TT0FQQmluZGluZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLk1lc3NhZ2VDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLlNlcnZpY2VEZXNjcmlwdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5mZWF0dXJlLkNsaWVudENvbmZpZ3VyYXRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5pMThuLk1lc3NhZ2VzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNwaS5CaW5kaW5nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNwaS5CaW5kaW5nUHJvdmlkZXI7DQotDQotaW1wb3J0IGphdmF4LnhtbC53cy5zb2FwLkFkZHJlc3NpbmdGZWF0dXJlOw0KLQ0KLS8qKg0KLSAqIFRoaXMgY2xhc3Mgd2lsbCBlbmFibGUvZGlzYWJsZSBXUy1BZGRyZXNzaW5nIGluIGEgSkFYLVdTIDIuMSBjbGllbnQsDQotICogYmFzZWQgb24gdGhlIGNvbmZpZ3VyYXRpb24gcGFzc2VkIHRvIGl0IHZpYSBhbiA8Y29kZT5BZGRyZXNzaW5nRmVhdHVyZTwvY29kZT4NCi0gKiBhbmQvb3IgYSA8Y29kZT5TdWJtaXNzaW9uQWRkcmVzc2luZ0ZlYXR1cmU8L2NvZGU+Lg0KLSAqICANCi0gKiAgQHNlZSBqYXZheC54bWwud3Muc29hcC5BZGRyZXNzaW5nRmVhdHVyZQ0KLSAqICBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuYWRkcmVzc2luZy5TdWJtaXNzaW9uQWRkcmVzc2luZ0ZlYXR1cmUNCi0gKi8NCi1wdWJsaWMgY2xhc3MgQWRkcmVzc2luZ0NvbmZpZ3VyYXRvciBpbXBsZW1lbnRzIENsaWVudENvbmZpZ3VyYXRvciB7DQotDQotICAgIC8qDQotICAgICAqICAobm9uLUphdmFkb2MpDQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5mZWF0dXJlLkNsaWVudENvbmZpZ3VyYXRvciNjb25maWd1cmUob3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLk1lc3NhZ2VDb250ZXh0LCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNwaS5CaW5kaW5nUHJvdmlkZXIpDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBjb25maWd1cmUoTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQsIEJpbmRpbmdQcm92aWRlciBwcm92aWRlcikgew0KLSAgICAgICAgQmluZGluZyBibmQgPSAoQmluZGluZykgcHJvdmlkZXIuZ2V0QmluZGluZygpOw0KLSAgICAgICAgQWRkcmVzc2luZ0ZlYXR1cmUgYWRkcmVzc2luZ0ZlYXR1cmUgPQ0KLSAgICAgICAgICAgIChBZGRyZXNzaW5nRmVhdHVyZSkgYm5kLmdldEZlYXR1cmUoQWRkcmVzc2luZ0ZlYXR1cmUuSUQpOw0KLSAgICAgICAgU3VibWlzc2lvbkFkZHJlc3NpbmdGZWF0dXJlIHN1Ym1pc3Npb25BZGRyZXNzaW5nRmVhdHVyZSA9DQotICAgICAgICAgICAgKFN1Ym1pc3Npb25BZGRyZXNzaW5nRmVhdHVyZSkgYm5kLmdldEZlYXR1cmUoU3VibWlzc2lvbkFkZHJlc3NpbmdGZWF0dXJlLklEKTsNCi0gICAgICAgIFN0cmluZyBhZGRyZXNzaW5nTmFtZXNwYWNlID0gYm5kLmdldEFkZHJlc3NpbmdOYW1lc3BhY2UoKTsNCi0gICAgICAgIEJvb2xlYW4gZGlzYWJsZUFkZHJlc3NpbmcgPQ0KLSAgICAgICAgICAgIChCb29sZWFuKSBtZXNzYWdlQ29udGV4dC5nZXRQcm9wZXJ0eShBZGRyZXNzaW5nQ29uc3RhbnRzLkRJU0FCTEVfQUREUkVTU0lOR19GT1JfT1VUX01FU1NBR0VTKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy9GaWd1cmUgb3V0IHdoaWNoIFdTLUFkZHJlc3NpbmcgZmVhdHVyZSB3YXMgc3BlY2lmaWVkIGNhdXNpbmcgdGhpcyBjb25maWd1cmF0b3IgdG8gcnVuLiANCi0gICAgICAgIGlmIChhZGRyZXNzaW5nRmVhdHVyZSAhPSBudWxsICYmIHN1Ym1pc3Npb25BZGRyZXNzaW5nRmVhdHVyZSAhPSBudWxsKSB7DQotICAgICAgICAgICAgLy9Cb3RoIGZlYXR1cmVzIG11c3QgaGF2ZSBiZWVuIHNwZWNpZmllZC4NCi0gICAgICAgICAgICBib29sZWFuIHczY0FkZHJlc3NpbmdFbmFibGVkID0gYWRkcmVzc2luZ0ZlYXR1cmUuaXNFbmFibGVkKCk7DQotICAgICAgICAgICAgYm9vbGVhbiBzdWJtaXNzaW9uQWRkcmVzc2luZ0VuYWJsZWQgPSBzdWJtaXNzaW9uQWRkcmVzc2luZ0ZlYXR1cmUuaXNFbmFibGVkKCk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgaWYgKHczY0FkZHJlc3NpbmdFbmFibGVkICYmIHN1Ym1pc3Npb25BZGRyZXNzaW5nRW5hYmxlZCkgew0KLSAgICAgICAgICAgICAgICAvL1VzZSB0aGUgYWRkcmVzc2luZyBuYW1lc3BhY2Ugb2YgdGhlIEVQUiBzcGVjaWZpZWQNCi0gICAgICAgICAgICAgICAgLy92aWEgdGhlIEpBWC1XUyAyLjEgQVBJLiBJZiBubyBFUFIgd2FzIHNwZWNpZmllZA0KLSAgICAgICAgICAgICAgICAvL3RoZW4gdGhlIDIwMDUvMDggbmFtZXNwYWNlIHdpbGwgYmUgdXNlZC4NCi0gICAgICAgICAgICAgICAgaWYgKGFkZHJlc3NpbmdOYW1lc3BhY2UgPT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgICAgIGFkZHJlc3NpbmdOYW1lc3BhY2UgPSBGaW5hbC5XU0FfTkFNRVNQQUNFOw0KLSAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgZGlzYWJsZUFkZHJlc3NpbmcgPSBCb29sZWFuLkZBTFNFOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlIGlmICh3M2NBZGRyZXNzaW5nRW5hYmxlZCkgew0KLSAgICAgICAgICAgICAgICAvL0VuYWJsZSBvbmx5IDIwMDUvMDggYWRkcmVzc2luZw0KLSAgICAgICAgICAgICAgICBpZiAoU3VibWlzc2lvbi5XU0FfTkFNRVNQQUNFLmVxdWFscyhhZGRyZXNzaW5nTmFtZXNwYWNlKSkgew0KLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbigNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRNZXNzYWdlKCJGZWF0dXJlTmFtZXNwYWNlTm90U3VwcG9ydGVkIiwgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzaW5nTmFtZXNwYWNlKSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYWRkcmVzc2luZ05hbWVzcGFjZSA9IEZpbmFsLldTQV9OQU1FU1BBQ0U7DQotICAgICAgICAgICAgICAgIGRpc2FibGVBZGRyZXNzaW5nID0gQm9vbGVhbi5GQUxTRTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZSBpZiAoc3VibWlzc2lvbkFkZHJlc3NpbmdFbmFibGVkKSB7DQotICAgICAgICAgICAgICAgIC8vRW5hYmxlIG9ubHkgMjAwNC8wOCBhZGRyZXNzaW5nDQotICAgICAgICAgICAgICAgIGlmIChGaW5hbC5XU0FfTkFNRVNQQUNFLmVxdWFscyhhZGRyZXNzaW5nTmFtZXNwYWNlKSkgew0KLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbigNCi0gICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRNZXNzYWdlKCJGZWF0dXJlTmFtZXNwYWNlTm90U3VwcG9ydGVkIiwgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3NpbmdOYW1lc3BhY2UpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBhZGRyZXNzaW5nTmFtZXNwYWNlID0gU3VibWlzc2lvbi5XU0FfTkFNRVNQQUNFOw0KLSAgICAgICAgICAgICAgICBkaXNhYmxlQWRkcmVzc2luZyA9IEJvb2xlYW4uRkFMU0U7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2Ugew0KLSAgICAgICAgICAgICAgICAvL0Rpc2FibGUgMjAwNS8wOCBhbmQgMjAwNC8wOCBhZGRyZXNzaW5nDQotICAgICAgICAgICAgICAgIGRpc2FibGVBZGRyZXNzaW5nID0gQm9vbGVhbi5UUlVFOw0KLSAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgDQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmIChhZGRyZXNzaW5nRmVhdHVyZSAhPSBudWxsKSB7DQotICAgICAgICAgICAgLy9UaGUgQWRkcmVzc2luZ0ZlYXR1cmUgbXVzdCBoYXZlIGJlZW4gc3BlY2lmaWVkLg0KLSAgICAgICAgICAgIGJvb2xlYW4gdzNjQWRkcmVzc2luZ0VuYWJsZWQgPSBhZGRyZXNzaW5nRmVhdHVyZS5pc0VuYWJsZWQoKTsNCi0NCi0gICAgICAgICAgICBpZiAodzNjQWRkcmVzc2luZ0VuYWJsZWQpIHsNCi0gICAgICAgICAgICAgICAgLy9FbmFibGUgMjAwNS8wOCBhZGRyZXNzaW5nDQotICAgICAgICAgICAgICAgIGlmIChTdWJtaXNzaW9uLldTQV9OQU1FU1BBQ0UuZXF1YWxzKGFkZHJlc3NpbmdOYW1lc3BhY2UpKSB7DQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZ2V0TWVzc2FnZSgiRmVhdHVyZU5hbWVzcGFjZU5vdFN1cHBvcnRlZCIsIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzaW5nTmFtZXNwYWNlKSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYWRkcmVzc2luZ05hbWVzcGFjZSA9IEZpbmFsLldTQV9OQU1FU1BBQ0U7DQotICAgICAgICAgICAgICAgIGRpc2FibGVBZGRyZXNzaW5nID0gQm9vbGVhbi5GQUxTRTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZSB7DQotICAgICAgICAgICAgICAgIC8vRGlzYWJsZSAyMDA1LzA4IGFkZHJlc3NpbmcNCi0gICAgICAgICAgICAgICAgZGlzYWJsZUFkZHJlc3NpbmcgPSBCb29sZWFuLlRSVUU7DQotICAgICAgICAgICAgfSAgICAgICAgICAgICAgICANCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYgKHN1Ym1pc3Npb25BZGRyZXNzaW5nRmVhdHVyZSAhPSBudWxsKSB7DQotICAgICAgICAgICAgLy9UaGUgU3VibWlzc2lvbkFkZHJlc3NpbmdGZWF0dXJlIG11c3QgaGF2ZSBiZWVuIHNwZWNpZmllZC4NCi0gICAgICAgICAgICBib29sZWFuIHN1Ym1pc3Npb25BZGRyZXNzaW5nRW5hYmxlZCA9IHN1Ym1pc3Npb25BZGRyZXNzaW5nRmVhdHVyZS5pc0VuYWJsZWQoKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBpZiAoc3VibWlzc2lvbkFkZHJlc3NpbmdFbmFibGVkKSB7DQotICAgICAgICAgICAgICAgIC8vRW5hYmxlIDIwMDQvMDggYWRkcmVzc2luZw0KLSAgICAgICAgICAgICAgICBpZiAoRmluYWwuV1NBX05BTUVTUEFDRS5lcXVhbHMoYWRkcmVzc2luZ05hbWVzcGFjZSkpIHsNCi0gICAgICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZ2V0TWVzc2FnZSgiRmVhdHVyZU5hbWVzcGFjZU5vdFN1cHBvcnRlZCIsIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzc2luZ05hbWVzcGFjZSkpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGFkZHJlc3NpbmdOYW1lc3BhY2UgPSBTdWJtaXNzaW9uLldTQV9OQU1FU1BBQ0U7DQotICAgICAgICAgICAgICAgIGRpc2FibGVBZGRyZXNzaW5nID0gQm9vbGVhbi5GQUxTRTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZSB7DQotICAgICAgICAgICAgICAgIC8vRGlzYWJsZSAyMDA0LzA4IGFkZHJlc3NpbmcNCi0gICAgICAgICAgICAgICAgZGlzYWJsZUFkZHJlc3NpbmcgPSBCb29sZWFuLlRSVUU7DQotICAgICAgICAgICAgfSAgICAgICAgICAgICAgICANCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2Ugew0KLSAgICAgICAgICAgIC8vSWYgbmVpdGhlciB3ZXJlIHNwZWNpZmllZCB0aGVuIHRoaXMgY29uZmlndXJhdG9yIHNob3VsZCBuZXZlciBydW4uDQotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbigNCi0gICAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRNZXNzYWdlKCJOb1dTQWRkcmVzc2luZ0ZlYXR1cmVzIikpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICBpZiAoIWRpc2FibGVBZGRyZXNzaW5nKSB7DQotICAgICAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICAgICAgRW5kcG9pbnRSZWZlcmVuY2UgZXByID0gYm5kLmdldEF4aXMyRW5kcG9pbnRSZWZlcmVuY2UoKTsNCi0gICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0IGF4aXMyTWVzc2FnZUNvbnRleHQgPQ0KLSAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUNvbnRleHQuZ2V0QXhpc01lc3NhZ2VDb250ZXh0KCk7DQotICAgICAgICAgICAgICAgIGF4aXMyTWVzc2FnZUNvbnRleHQuc2V0VG8oZXByKTsNCi0gICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzZCA9IG1lc3NhZ2VDb250ZXh0LmdldEVuZHBvaW50RGVzY3JpcHRpb24oKS5nZXRTZXJ2aWNlRGVzY3JpcHRpb24oKTsNCi0gICAgICAgICAgICAgICAgQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZyA9IHNkLmdldEF4aXNDb25maWdDb250ZXh0KCkuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKTsNCi0gICAgICAgICAgICAgICAgaWYgKCFheGlzQ29uZmlnLmlzRW5nYWdlZChDb25zdGFudHMuTU9EVUxFX0FERFJFU1NJTkcpKSB7DQotICAgICAgICAgICAgICAgICAgICBheGlzQ29uZmlnLmVuZ2FnZU1vZHVsZShDb25zdGFudHMuTU9EVUxFX0FERFJFU1NJTkcpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lg0KLSAgICAgICAgICAgICAgICAgICAgbWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oDQotICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRNZXNzYWdlKCJBZGRyZXNzaW5nRW5nYWdlbWVudEVycm9yIiwgZS50b1N0cmluZygpKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgbWVzc2FnZUNvbnRleHQuc2V0UHJvcGVydHkoQWRkcmVzc2luZ0NvbnN0YW50cy5XU19BRERSRVNTSU5HX1ZFUlNJT04sIGFkZHJlc3NpbmdOYW1lc3BhY2UpOyAgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgbWVzc2FnZUNvbnRleHQuc2V0UHJvcGVydHkoQWRkcmVzc2luZ0NvbnN0YW50cy5ESVNBQkxFX0FERFJFU1NJTkdfRk9SX09VVF9NRVNTQUdFUywgZGlzYWJsZUFkZHJlc3NpbmcpOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqICAobm9uLUphdmFkb2MpDQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5mZWF0dXJlLkNsaWVudENvbmZpZ3VyYXRvciNzdXBwb3J0cyhvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNwaS5CaW5kaW5nKQ0KLSAgICAgKi8NCi0gICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoQmluZGluZyBiaW5kaW5nKSB7DQotICAgICAgICByZXR1cm4gYmluZGluZyBpbnN0YW5jZW9mIFNPQVBCaW5kaW5nOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NsaWVudC9jb25maWcvTVRPTUNvbmZpZ3VyYXRvci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2xpZW50L2NvbmZpZy9NVE9NQ29uZmlndXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1NzVkNjYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2xpZW50L2NvbmZpZy9NVE9NQ29uZmlndXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jbGllbnQuY29uZmlnOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5QYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuRXhjZXB0aW9uRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5iaW5kaW5nLlNPQVBCaW5kaW5nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUuTWVzc2FnZUNvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZmVhdHVyZS5DbGllbnRDb25maWd1cmF0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaTE4bi5NZXNzYWdlczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLk1lc3NhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc3BpLkJpbmRpbmc7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc3BpLkJpbmRpbmdQcm92aWRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5hY3RpdmF0aW9uLkRhdGFIYW5kbGVyOw0KLWltcG9ydCBqYXZheC5hY3RpdmF0aW9uLkRhdGFTb3VyY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5zb2FwLk1UT01GZWF0dXJlOw0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi0vKioNCi0gKg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBNVE9NQ29uZmlndXJhdG9yIGltcGxlbWVudHMgQ2xpZW50Q29uZmlndXJhdG9yIHsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKE1UT01Db25maWd1cmF0b3IuY2xhc3MpOw0KLSAgICANCi0gICAgLyoNCi0gICAgICogKG5vbi1KYXZhZG9jKQ0KLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZmVhdHVyZS51dGlsLldlYlNlcnZpY2VGZWF0dXJlQ29uZmlndXJhdG9yI3BlcmZvcm1Db25maWd1cmF0aW9uKG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS5NZXNzYWdlQ29udGV4dCwgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zcGkuQmluZGluZ1Byb3ZpZGVyKQ0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgY29uZmlndXJlKE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0LCBCaW5kaW5nUHJvdmlkZXIgcHJvdmlkZXIpIHsNCi0gICAgICAgIEJpbmRpbmcgYm5kID0gKEJpbmRpbmcpIHByb3ZpZGVyLmdldEJpbmRpbmcoKTsNCi0gICAgICAgIE1UT01GZWF0dXJlIG10b21GZWF0dXJlID0gKE1UT01GZWF0dXJlKSBibmQuZ2V0RmVhdHVyZShNVE9NRmVhdHVyZS5JRCk7DQotICAgICAgICBNZXNzYWdlIHJlcXVlc3RNc2cgPSBtZXNzYWdlQ29udGV4dC5nZXRNZXNzYWdlKCk7DQotICAgICAgICANCi0gICAgICAgIC8vRGlzYWJsZSBNVE9NLg0KLSAgICAgICAgcmVxdWVzdE1zZy5zZXRNVE9NRW5hYmxlZChmYWxzZSk7DQotICAgICAgICAgICAgICAgIA0KLSAgICAgICAgaWYgKG10b21GZWF0dXJlID09IG51bGwpIHsNCi0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lg0KLSAgICAgICAgICAgICAgbWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgibXRvbUZlYXR1cmVFcnIiKSk7DQotICAgICAgICB9DQotDQotICAgICAgICAvL0VuYWJsZSBNVE9NIGlmIHNwZWNpZmllZC4NCi0gICAgICAgIGlmIChtdG9tRmVhdHVyZS5pc0VuYWJsZWQoKSkgew0KLSAgICAgICAgICAgIGludCB0aHJlc2hvbGQgPSBtdG9tRmVhdHVyZS5nZXRUaHJlc2hvbGQoKTsNCi0gICAgICAgICAgICBMaXN0PFN0cmluZz4gYXR0YWNobWVudElEcyA9IHJlcXVlc3RNc2cuZ2V0QXR0YWNobWVudElEcygpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIEVuYWJsZSBNVE9NDQotICAgICAgICAgICAgcmVxdWVzdE1zZy5zZXRNVE9NRW5hYmxlZCh0cnVlKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBpZiAodGhyZXNob2xkIDw9IDApIHsNCi0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkVuYWJsaW5nIE1UT00gd2l0aCBubyB0aHJlc2hvbGQuIik7DQotICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgDQotICAgICAgICAgICAgfWVsc2V7DQotICAgICAgICAgICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKXsNCi0gICAgICAgICAgICAgICAgCWxvZy5kZWJ1ZygiTVRPTSBUaHJlc2hvbGQgVmFsdWUgPSIrdGhyZXNob2xkKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgLy9zZXQgTVRPTSB0aHJlc2hvbGQgdmFsdWUgb24gbWVzc2FnZSBjb250ZXh0Lg0KLSAgICAgICAgICAgICAgICAvL09uY2UgTVRPTSB0aHJlc2hvbGQgaXMgc2V0IG9uIG1lc3NhZ2UgY29udGV4dCBpdCB3aWxsIGJlDQotICAgICAgICAgICAgICAgIC8vcmVhZCBieSBTT0FQTWVzc2FnZUZvcm1hdHRlci53cml0ZVRvKCkgd2hpbGUgd3JpdGluZyB0aGUgYXR0YWNobWVudA0KLSAgICAgICAgICAgICAgICAvL1NPQVBNZXNzYWdlRm9ybWF0dGVyIHdpbGwgZnVydGhlciBwcm9wb2dhdGUgdGhlIHRocmVzaG9sZCB2YWx1ZSB0bw0KLSAgICAgICAgICAgICAgICAvL0F4aW9tLk9NT3V0cHV0Rm9ybWF0LiBKQVhCQXR0YWNobWVudFVubWFyc2hhbGxlciB3aWxsIHRoZW4gbWFrZSANCi0gICAgICAgICAgICAgICAgLy9kZWNpc2lvbiBpZiB0aGUgYXR0YWNobWVudCBzaG91bGQgYmUgaW5saW5lZCBvciBvcHRpbWl6ZWQuICANCi0gICAgICAgICAgICAgICAgbWVzc2FnZUNvbnRleHQuc2V0UHJvcGVydHkoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uTVRPTV9USFJFU0hPTEQsIG5ldyBJbnRlZ2VyKHRocmVzaG9sZCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2Ugew0KLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlRoZSBNVE9NRmVhdHVyZSB3YXMgZm91bmQsIGJ1dCBub3QgZW5hYmxlZC4iKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogIChub24tSmF2YWRvYykNCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmZlYXR1cmUuQ2xpZW50Q29uZmlndXJhdG9yI3N1cHBvcnRzKG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc3BpLkJpbmRpbmcpDQotICAgICAqLw0KLSAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhCaW5kaW5nIGJpbmRpbmcpIHsNCi0gICAgICAgIHJldHVybiBiaW5kaW5nIGluc3RhbmNlb2YgU09BUEJpbmRpbmc7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2xpZW50L2NvbmZpZy9SZXNwZWN0QmluZGluZ0NvbmZpZ3VyYXRvci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2xpZW50L2NvbmZpZy9SZXNwZWN0QmluZGluZ0NvbmZpZ3VyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjRmZDhkLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NsaWVudC9jb25maWcvUmVzcGVjdEJpbmRpbmdDb25maWd1cmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY2xpZW50LmNvbmZpZzsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5FeGNlcHRpb25GYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUuTWVzc2FnZUNvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZmVhdHVyZS5DbGllbnRDb25maWd1cmF0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaTE4bi5NZXNzYWdlczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zcGkuQmluZGluZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zcGkuQmluZGluZ1Byb3ZpZGVyOw0KLQ0KLWltcG9ydCBqYXZheC54bWwud3MuUmVzcGVjdEJpbmRpbmdGZWF0dXJlOw0KLQ0KLS8qKg0KLSAqDQotICovDQotcHVibGljIGNsYXNzIFJlc3BlY3RCaW5kaW5nQ29uZmlndXJhdG9yIGltcGxlbWVudHMgQ2xpZW50Q29uZmlndXJhdG9yIHsNCi0NCi0gICAgLyoNCi0gICAgICogIChub24tSmF2YWRvYykNCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmZlYXR1cmUudXRpbC5XZWJTZXJ2aWNlRmVhdHVyZUNvbmZpZ3VyYXRvciNwZXJmb3JtQ29uZmlndXJhdGlvbihvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUuTWVzc2FnZUNvbnRleHQsIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc3BpLkJpbmRpbmdQcm92aWRlcikNCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZShNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCwgQmluZGluZ1Byb3ZpZGVyIHByb3ZpZGVyKSB7DQotICAgICAgICBCaW5kaW5nIGJuZCA9IChCaW5kaW5nKSBwcm92aWRlci5nZXRCaW5kaW5nKCk7DQotICAgICAgICBSZXNwZWN0QmluZGluZ0ZlYXR1cmUgcmVzcGVjdEJpbmRpbmdGZWF0dXJlID0NCi0gICAgICAgICAgICAoUmVzcGVjdEJpbmRpbmdGZWF0dXJlKSBibmQuZ2V0RmVhdHVyZShSZXNwZWN0QmluZGluZ0ZlYXR1cmUuSUQpOw0KLSAgICAgICAgDQotICAgICAgICBpZiAocmVzcGVjdEJpbmRpbmdGZWF0dXJlID09IG51bGwpIHsNCi0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKA0KLSAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZ2V0TWVzc2FnZSgicmVzcGVjdEJpbmRpbmdOb3RTcGVjaWZpZWQiKSk7DQotICAgICAgICB9DQotICAgICAgICBpZiAocmVzcGVjdEJpbmRpbmdGZWF0dXJlLmlzRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgLy9UT0RPIEltcGxlbWVudGF0aW9uIHJlcXVpcmVkLg0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqICAobm9uLUphdmFkb2MpDQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5mZWF0dXJlLkNsaWVudENvbmZpZ3VyYXRvciNzdXBwb3J0cyhvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNwaS5CaW5kaW5nKQ0KLSAgICAgKi8NCi0gICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoQmluZGluZyBiaW5kaW5nKSB7DQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jbGllbnQvZGlzcGF0Y2gvQmFzZURpc3BhdGNoLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jbGllbnQvZGlzcGF0Y2gvQmFzZURpc3BhdGNoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyYTMzODYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2xpZW50L2Rpc3BhdGNoL0Jhc2VEaXNwYXRjaC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTg4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jbGllbnQuZGlzcGF0Y2g7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuU2VydmljZUNsaWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLkJpbmRpbmdQcm92aWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLkV4Y2VwdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jbGllbnQuYXN5bmMuQXN5bmNSZXNwb25zZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUuSW52b2NhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLkludm9jYXRpb25Db250ZXh0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLmNvbnRyb2xsZXIuSW52b2NhdGlvbkNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLmNvbnRyb2xsZXIuSW52b2NhdGlvbkNvbnRyb2xsZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRW5kcG9pbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmkxOG4uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tYXJzaGFsbGVyLmltcGwuYWx0Lk1ldGhvZE1hcnNoYWxsZXJVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuTWVzc2FnZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnJlZ2lzdHJ5LkZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNwaS5CaW5kaW5nOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc3BpLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNwaS5TZXJ2aWNlRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zcGkubWlncmF0b3IuQXBwbGljYXRpb25Db250ZXh0TWlncmF0b3JVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuSFRUUENvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwud3MuQXN5bmNIYW5kbGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5Qcm90b2NvbEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwud3MuUmVzcG9uc2U7Ci1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2UuTW9kZTsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUZlYXR1cmU7Ci1pbXBvcnQgamF2YXgueG1sLndzLmh0dHAuSFRUUEJpbmRpbmc7Ci1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuU09BUEJpbmRpbmc7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VEaXNwYXRjaDxUPiBleHRlbmRzIEJpbmRpbmdQcm92aWRlcgotICAgICAgICBpbXBsZW1lbnRzIGphdmF4LnhtbC53cy5EaXNwYXRjaCB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coQmFzZURpc3BhdGNoLmNsYXNzKTsKLQotICAgIHByb3RlY3RlZCBJbnZvY2F0aW9uQ29udHJvbGxlciBpYzsKLQotICAgIHByb3RlY3RlZCBTZXJ2aWNlQ2xpZW50IHNlcnZpY2VDbGllbnQ7Ci0KLSAgICBwcm90ZWN0ZWQgTW9kZSBtb2RlOwotCi0gICAgcHJvdGVjdGVkIEJhc2VEaXNwYXRjaChTZXJ2aWNlRGVsZWdhdGUgc3ZjRGVsZ2F0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZXBEZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRW5kcG9pbnRSZWZlcmVuY2UgZXByLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGFkZHJlc3NpbmdOYW1lc3BhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJTZXJ2aWNlRmVhdHVyZS4uLiBmZWF0dXJlcykgewotICAgICAgICBzdXBlcihzdmNEZWxnYXRlLCBlcERlc2MsIGVwciwgYWRkcmVzc2luZ05hbWVzcGFjZSwgZmVhdHVyZXMpOwotCi0gICAgICAgIEludm9jYXRpb25Db250cm9sbGVyRmFjdG9yeSBpY2YgPSAoSW52b2NhdGlvbkNvbnRyb2xsZXJGYWN0b3J5KSBGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShJbnZvY2F0aW9uQ29udHJvbGxlckZhY3RvcnkuY2xhc3MpOwotICAgICAgICBpYyA9IGljZi5nZXRJbnZvY2F0aW9uQ29udHJvbGxlcigpOwotICAgICAgICAKLSAgICAgICAgaWYgKGljID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoIm1pc3NpbmdJbnZvY2F0aW9uQ29udHJvbGxlciIpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRha2UgdGhlIGlucHV0IG9iamVjdCBhbmQgdHVybiBpdCBpbnRvIGFuIE9NRWxlbWVudCBzbyB0aGF0IGl0IGNhbiBiZSBzZW50LgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBNZXNzYWdlIGNyZWF0ZU1lc3NhZ2VGcm9tVmFsdWUoT2JqZWN0IHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIEdpdmVuIGEgbWVzc2FnZSwgcmV0dXJuIHRoZSBidXNpbmVzcyBvYmplY3QgYmFzZWQgb24gdGhlIHJlcXVlc3RvcidzIHJlcXVpcmVkIGZvcm1hdCAoUEFZTE9BRAotICAgICAqIHZzLiBNRVNTQUdFKSBhbmQgZGF0YXR5cGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVzc2FnZQotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgT2JqZWN0IGdldFZhbHVlRnJvbU1lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIEFzeW5jTGlzdGVuZXIgdGhhdCBpcyB0byBiZSB1c2VkIGZvciB3YWl0aW5nIGZvciBhc3luYyByZXNwb25zZXMuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGEgY29uZmlndXJlZCBBc3luY0xpc3RlbmVyIGluc3RhbmNlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IEFzeW5jUmVzcG9uc2UgY3JlYXRlQXN5bmNSZXNwb25zZUxpc3RlbmVyKCk7Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGludm9rZShPYmplY3Qgb2JqKSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgLy8gQ2F0Y2ggYWxsIGV4Y2VwdGlvbnMgYW5kIHJldGhyb3cgYW4gYXBwcm9wcmlhdGUgV2ViU2VydmljZSBFeGNlcHRpb24KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiRW50ZXJlZCBzeW5jaHJvbm91cyBpbnZvY2F0aW9uOiBCYXNlRGlzcGF0Y2guaW52b2tlKCkiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBJbnZvY2F0aW9uQ29udGV4dCBpbnN0YW5jZSBmb3IgdGhpcyByZXF1ZXN0L3Jlc3BvbnNlIGZsb3cuCi0gICAgICAgICAgICBJbnZvY2F0aW9uQ29udGV4dCBpbnZvY2F0aW9uQ29udGV4dCA9Ci0gICAgICAgICAgICAgICAgICAgIEludm9jYXRpb25Db250ZXh0RmFjdG9yeS5jcmVhdGVJbnZvY2F0aW9uQ29udGV4dChudWxsKTsKLSAgICAgICAgICAgIGludm9jYXRpb25Db250ZXh0LnNldFNlcnZpY2VDbGllbnQoc2VydmljZUNsaWVudCk7Ci0KLSAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgTWVzc2FnZUNvbnRleHQgdG8gaG9sZCB0aGUgYWN0dWFsIHJlcXVlc3QgbWVzc2FnZSBhbmQgaXRzCi0gICAgICAgICAgICAvLyBhc3NvY2lhdGVkIHByb3BlcnRpZXMKLSAgICAgICAgICAgIE1lc3NhZ2VDb250ZXh0IHJlcXVlc3RNc2dDdHggPSBuZXcgTWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgICAgIHJlcXVlc3RNc2dDdHguc2V0RW5kcG9pbnREZXNjcmlwdGlvbihnZXRFbmRwb2ludERlc2NyaXB0aW9uKCkpOwotICAgICAgICAgICAgaW52b2NhdGlvbkNvbnRleHQuc2V0UmVxdWVzdE1lc3NhZ2VDb250ZXh0KHJlcXVlc3RNc2dDdHgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogVE9ETzogcmV2aWV3OiBtYWtlIHN1cmUgdGhlIGhhbmRsZXJzIGFyZSBzZXQgb24gdGhlIEludm9jYXRpb25Db250ZXh0Ci0gICAgICAgICAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIG9mIHRoZSBKQVhXUyBydW50aW1lIGRvZXMgbm90IHVzZSBFbmRwb2ludCwgd2hpY2gKLSAgICAgICAgICAgICAqIHdvdWxkIG5vcm1hbGx5IGJlIHRoZSBwbGFjZSB0byBpbml0aWFsaXplIGFuZCBzdG9yZSB0aGUgaGFuZGxlciBsaXN0LgotICAgICAgICAgICAgICogSW4gbGlldSBvZiB0aGF0LCB3ZSB3aWxsIGhhdmUgdG8gaW50aWFsaXplIGFuZCBzdG9yZSB0aGVtIG9uIHRoZSAKLSAgICAgICAgICAgICAqIEludm9jYXRpb25Db250ZXh0LiAgYWxzbyBzZWUgdGhlIEludm9jYXRpb25Db250ZXh0RmFjdG9yeS4gIE9uIHRoZSBjbGllbnQKLSAgICAgICAgICAgICAqIHNpZGUsIHRoZSBiaW5kaW5nIGlzIG5vdCB5ZXQgc2V0IHdoZW4gd2UgY2FsbCBpbnRvIHRoYXQgZmFjdG9yeSwgc28gdGhlCi0gICAgICAgICAgICAgKiBoYW5kbGVyIGxpc3QgZG9lc24ndCBnZXQgc2V0IG9uIHRoZSBJbnZvY2F0aW9uQ29udGV4dCBvYmplY3QgdGhlcmUuICBUaHVzCi0gICAgICAgICAgICAgKiB3ZSBnb3R0YSBkbyBpdCBoZXJlLgotICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgIC8vIGJlIHN1cmUgdG8gdXNlIHdoYXRldmVyIGhhbmRsZXJyZXNvbHZlciBpcyByZWdpc3RlcmVkIG9uIHRoZSBTZXJ2aWNlCi0gICAgICAgICAgICBCaW5kaW5nIGJpbmRpbmcgPSAoQmluZGluZykgZ2V0QmluZGluZygpOwotICAgICAgICAgICAgaW52b2NhdGlvbkNvbnRleHQuc2V0SGFuZGxlcnMoYmluZGluZy5nZXRIYW5kbGVyQ2hhaW4oKSk7Ci0KLSAgICAgICAgICAgIGluaXRNZXNzYWdlQ29udGV4dChvYmosIHJlcXVlc3RNc2dDdHgpOwotCi0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogaWYgU0VTU0lPTl9NQUlOVEFJTl9QUk9QRVJUWSBpcyB0cnVlLCBhbmQgdGhlIGNsaWVudCBhcHAgaGFzIGV4cGxpY2l0bHkgc2V0IGEgSEVBREVSX0NPT0tJRSBvbiB0aGUgcmVxdWVzdCBjb250ZXh0LCBhc3N1bWUgdGhlIGNsaWVudAotICAgICAgICAgICAgICogYXBwIGlzIGV4cGVjdGluZyB0aGUgSEVBREVSX0NPT0tJRSB0byBiZSB0aGUgc2Vzc2lvbiBpZC4gIElmIHdlIHdlcmUgZXN0YWJsaXNoaW5nIGEgbmV3IHNlc3Npb24sIG5vIGNvb2tpZSB3b3VsZCBiZSBzZW50LCBhbmQgdGhlIAotICAgICAgICAgICAgICogc2VydmVyIHdvdWxkIHJlcGx5IHdpdGggYSAiU2V0LUNvb2tpZSIgaGVhZGVyLCB3aGljaCBpcyBjb3BpZWQgYXMgYSAiQ29va2llIi1rZXllZCBwcm9wZXJ0eSB0byB0aGUgc2VydmljZSBjb250ZXh0IGR1cmluZyByZXNwb25zZS4KLSAgICAgICAgICAgICAqIEluIHRoaXMgY2FzZSwgaWYgd2Ugc3VjY2VlZCBpbiB1c2luZyBhbiBleGlzdGluZyBzZXJ2ZXIgc2Vzc2lvbiwgbm8gIlNldC1Db29raWUiIGhlYWRlciB3aWxsIGJlIHJldHVybmVkLCBhbmQgdGhlcmVmb3JlIG5vCi0gICAgICAgICAgICAgKiAiQ29va2llIi1rZXllZCBwcm9wZXJ0eSB3b3VsZCBiZSBzZXQgb24gdGhlIHNlcnZpY2UgY29udGV4dC4gIFNvLCBsZXQncyBjb3B5IG91ciByZXF1ZXN0IGNvbnRleHQgSEVBREVSX0NPT0tJRSBrZXkgdG8gdGhlIHNlcnZpY2UKLSAgICAgICAgICAgICAqIGNvbnRleHQgbm93IHRvIHByZXZlbnQgdGhlICJubyBjb29raWUiIGV4Y2VwdGlvbiBpbiBCaW5kaW5nUHJvdmlkZXIuc2V0dXBTZXNzaW9uQ29udGV4dC4gIEl0IGlzIHBvc3NpYmxlIHRoZSBzZXJ2ZXIgZG9lcyBub3Qgc3VwcG9ydAotICAgICAgICAgICAgICogc2Vzc2lvbnMsIGluIHdoaWNoIGNhc2Ugbm8gZXJyb3Igb2NjdXJzLCBidXQgdGhlIGNsaWVudCBhcHAgd291bGQgYXNzdW1lIGl0IGlzIHBhcnRpY2lwYXRpbmcgaW4gYSBzZXNzaW9uLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAoKHJlcXVlc3RDb250ZXh0LmNvbnRhaW5zS2V5KEJpbmRpbmdQcm92aWRlci5TRVNTSU9OX01BSU5UQUlOX1BST1BFUlRZKSkgJiYgKChCb29sZWFuKXJlcXVlc3RDb250ZXh0LmdldChCaW5kaW5nUHJvdmlkZXIuU0VTU0lPTl9NQUlOVEFJTl9QUk9QRVJUWSkpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKChyZXF1ZXN0Q29udGV4dC5jb250YWluc0tleShIVFRQQ29uc3RhbnRzLkhFQURFUl9DT09LSUUpKSAmJiAocmVxdWVzdENvbnRleHQuZ2V0KEhUVFBDb25zdGFudHMuSEVBREVSX0NPT0tJRSkgIT0gbnVsbCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGludm9jYXRpb25Db250ZXh0LmdldFNlcnZpY2VDbGllbnQoKS5nZXRTZXJ2aWNlQ29udGV4dCgpLmdldFByb3BlcnR5KEhUVFBDb25zdGFudHMuSEVBREVSX0NPT0tJRSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaW52b2NhdGlvbkNvbnRleHQuZ2V0U2VydmljZUNsaWVudCgpLmdldFNlcnZpY2VDb250ZXh0KCkuc2V0UHJvcGVydHkoSFRUUENvbnN0YW50cy5IRUFERVJfQ09PS0lFLCByZXF1ZXN0Q29udGV4dC5nZXQoSFRUUENvbnN0YW50cy5IRUFERVJfQ09PS0lFKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkNsaWVudC1hcHAgZGVmaW5lZCBDb29raWUgcHJvcGVydHkgKGFzc3VtZSB0byBiZSBzZXNzaW9uIGNvb2tpZSkgb24gcmVxdWVzdCBjb250ZXh0IGNvcGllZCB0byBzZXJ2aWNlIGNvbnRleHQuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBDYXV0aW9uOiAgc2VydmVyIG1heSBvciBtYXkgbm90IHN1cHBvcnQgc2Vzc2lvbnMsIGJ1dCBjbGllbnQgYXBwIHdpbGwgbm90IGJlIGluZm9ybWVkIHdoZW4gbm90IHN1cHBvcnRlZC4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gTWlncmF0ZSB0aGUgcHJvcGVydGllcyBmcm9tIHRoZSBjbGllbnQgcmVxdWVzdCBjb250ZXh0IGJhZyB0bwotICAgICAgICAgICAgLy8gdGhlIHJlcXVlc3QgTWVzc2FnZUNvbnRleHQuCi0gICAgICAgICAgICBBcHBsaWNhdGlvbkNvbnRleHRNaWdyYXRvclV0aWwucGVyZm9ybU1pZ3JhdGlvblRvTWVzc2FnZUNvbnRleHQoCi0gICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5BUFBMSUNBVElPTl9DT05URVhUX01JR1JBVE9SX0xJU1RfSUQsCi0gICAgICAgICAgICAgICAgICAgIGdldFJlcXVlc3RDb250ZXh0KCksIHJlcXVlc3RNc2dDdHgpOwotCi0gICAgICAgICAgICAvLyBQZXJmb3JtIHRoZSBXZWJTZXJ2aWNlRmVhdHVyZSBjb25maWd1cmF0aW9uIHJlcXVlc3RlZCBieSB0aGUgdXNlci4KLSAgICAgICAgICAgIGJpbmRpbmcuY29uZmlndXJlKHJlcXVlc3RNc2dDdHgsIHRoaXMpOwotCi0gICAgICAgICAgICAvLyBTZW5kIHRoZSByZXF1ZXN0IHVzaW5nIHRoZSBJbnZvY2F0aW9uQ29udHJvbGxlcgotICAgICAgICAgICAgaWMuaW52b2tlKGludm9jYXRpb25Db250ZXh0KTsKLQotICAgICAgICAgICAgTWVzc2FnZUNvbnRleHQgcmVzcG9uc2VNc2dDdHggPSBpbnZvY2F0aW9uQ29udGV4dC5nZXRSZXNwb25zZU1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgICAgICByZXNwb25zZU1zZ0N0eC5zZXRFbmRwb2ludERlc2NyaXB0aW9uKHJlcXVlc3RNc2dDdHguZ2V0RW5kcG9pbnREZXNjcmlwdGlvbigpKTsKLQotICAgICAgICAgICAgLy8gTWlncmF0ZSB0aGUgcHJvcGVydGllcyBmcm9tIHRoZSByZXNwb25zZSBNZXNzYWdlQ29udGV4dCBiYWNrCi0gICAgICAgICAgICAvLyB0byB0aGUgY2xpZW50IHJlc3BvbnNlIGNvbnRleHQgYmFnLgotICAgICAgICAgICAgQXBwbGljYXRpb25Db250ZXh0TWlncmF0b3JVdGlsLnBlcmZvcm1NaWdyYXRpb25Gcm9tTWVzc2FnZUNvbnRleHQoCi0gICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5BUFBMSUNBVElPTl9DT05URVhUX01JR1JBVE9SX0xJU1RfSUQsCi0gICAgICAgICAgICAgICAgICAgIGdldFJlc3BvbnNlQ29udGV4dCgpLCByZXNwb25zZU1zZ0N0eCk7Ci0KLSAgICAgICAgICAgIGlmIChoYXNGYXVsdFJlc3BvbnNlKHJlc3BvbnNlTXNnQ3R4KSkgewotICAgICAgICAgICAgICAgIFdlYlNlcnZpY2VFeGNlcHRpb24gd3NlID0gQmFzZURpc3BhdGNoLmdldEZhdWx0UmVzcG9uc2UocmVzcG9uc2VNc2dDdHgpOwotICAgICAgICAgICAgICAgIHRocm93IHdzZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gR2V0IHRoZSByZXR1cm4gb2JqZWN0Ci0gICAgICAgICAgICBPYmplY3QgcmV0dXJuT2JqID0gbnVsbDsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgTWVzc2FnZSByZXNwb25zZU1zZyA9IHJlc3BvbnNlTXNnQ3R4LmdldE1lc3NhZ2UoKTsKLSAgICAgICAgICAgICAgICByZXR1cm5PYmogPSBnZXRWYWx1ZUZyb21NZXNzYWdlKHJlc3BvbnNlTXNnKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsbHkgewotICAgICAgICAgICAgICAgIC8vIEZyZWUgdGhlIGluY29taW5nIGlucHV0IHN0cmVhbQotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlTXNnQ3R4LmZyZWVJbnB1dFN0cmVhbSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbih0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgIAotICAgICAgICAgICAgLy9DaGVjayB0byBzZWUgaWYgd2UgbmVlZCB0byBtYWludGFpbiBzZXNzaW9uIHN0YXRlCi0gICAgICAgICAgICBjaGVja01haW50YWluU2Vzc2lvblN0YXRlKHJlcXVlc3RNc2dDdHgsIGludm9jYXRpb25Db250ZXh0KTsKLQotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJTeW5jaHJvbm91cyBpbnZvY2F0aW9uIGNvbXBsZXRlZDogQmFzZURpc3BhdGNoLmludm9rZSgpIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiByZXR1cm5PYmo7Ci0gICAgICAgIH0gY2F0Y2ggKFdlYlNlcnZpY2VFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIEFsbCBleGNlcHRpb25zIGFyZSBjYXVnaHQgYW5kIHJldGhyb3duIGFzIGEgV2ViU2VydmljZUV4Y2VwdGlvbgotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGluaXRNZXNzYWdlQ29udGV4dChPYmplY3Qgb2JqLCBNZXNzYWdlQ29udGV4dCByZXF1ZXN0TXNnQ3R4KSB7Ci0gICAgICAgIE1lc3NhZ2UgcmVxdWVzdE1zZyA9IGNyZWF0ZVJlcXVlc3RNZXNzYWdlKG9iaik7Ci0gICAgICAgIHNldHVwTWVzc2FnZVByb3BlcnRpZXMocmVxdWVzdE1zZyk7Ci0gICAgICAgIHJlcXVlc3RNc2dDdHguc2V0TWVzc2FnZShyZXF1ZXN0TXNnKTsKLSAgICAgICAgLy8gaGFuZGxlIEhUVFBfUkVRVUVTVF9NRVRIT0QgcHJvcGVydHkKLSAgICAgICAgU3RyaW5nIG1ldGhvZCA9IChTdHJpbmcpcmVxdWVzdENvbnRleHQuZ2V0KGphdmF4LnhtbC53cy5oYW5kbGVyLk1lc3NhZ2VDb250ZXh0LkhUVFBfUkVRVUVTVF9NRVRIT0QpOwotICAgICAgICBpZiAobWV0aG9kICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJlcXVlc3RNc2dDdHguc2V0UHJvcGVydHkob3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHMuQ29uZmlndXJhdGlvbi5IVFRQX01FVEhPRCwgbWV0aG9kKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGludm9rZU9uZVdheShPYmplY3Qgb2JqKSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgLy8gQWxsIGV4Y2VwdGlvbnMgYXJlIGNhdWdodCBhbmQgcmV0aHJvd24gYXMgYSBXZWJTZXJ2aWNlRXhjZXB0aW9uCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkVudGVyZWQgb25lLXdheSBpbnZvY2F0aW9uOiBCYXNlRGlzcGF0Y2guaW52b2tlT25lV2F5KCkiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBJbnZvY2F0aW9uQ29udGV4dCBpbnN0YW5jZSBmb3IgdGhpcyByZXF1ZXN0L3Jlc3BvbnNlIGZsb3cuCi0gICAgICAgICAgICBJbnZvY2F0aW9uQ29udGV4dCBpbnZvY2F0aW9uQ29udGV4dCA9Ci0gICAgICAgICAgICAgICAgICAgIEludm9jYXRpb25Db250ZXh0RmFjdG9yeS5jcmVhdGVJbnZvY2F0aW9uQ29udGV4dChudWxsKTsKLSAgICAgICAgICAgIGludm9jYXRpb25Db250ZXh0LnNldFNlcnZpY2VDbGllbnQoc2VydmljZUNsaWVudCk7Ci0KLSAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgTWVzc2FnZUNvbnRleHQgdG8gaG9sZCB0aGUgYWN0dWFsIHJlcXVlc3QgbWVzc2FnZSBhbmQgaXRzCi0gICAgICAgICAgICAvLyBhc3NvY2lhdGVkIHByb3BlcnRpZXMKLSAgICAgICAgICAgIE1lc3NhZ2VDb250ZXh0IHJlcXVlc3RNc2dDdHggPSBuZXcgTWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgICAgIHJlcXVlc3RNc2dDdHguc2V0RW5kcG9pbnREZXNjcmlwdGlvbihnZXRFbmRwb2ludERlc2NyaXB0aW9uKCkpOwotICAgICAgICAgICAgaW52b2NhdGlvbkNvbnRleHQuc2V0UmVxdWVzdE1lc3NhZ2VDb250ZXh0KHJlcXVlc3RNc2dDdHgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogVE9ETzogcmV2aWV3OiBtYWtlIHN1cmUgdGhlIGhhbmRsZXJzIGFyZSBzZXQgb24gdGhlIEludm9jYXRpb25Db250ZXh0Ci0gICAgICAgICAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIG9mIHRoZSBKQVhXUyBydW50aW1lIGRvZXMgbm90IHVzZSBFbmRwb2ludCwgd2hpY2gKLSAgICAgICAgICAgICAqIHdvdWxkIG5vcm1hbGx5IGJlIHRoZSBwbGFjZSB0byBpbml0aWFsaXplIGFuZCBzdG9yZSB0aGUgaGFuZGxlciBsaXN0LgotICAgICAgICAgICAgICogSW4gbGlldSBvZiB0aGF0LCB3ZSB3aWxsIGhhdmUgdG8gaW50aWFsaXplIGFuZCBzdG9yZSB0aGVtIG9uIHRoZSAKLSAgICAgICAgICAgICAqIEludm9jYXRpb25Db250ZXh0LiAgYWxzbyBzZWUgdGhlIEludm9jYXRpb25Db250ZXh0RmFjdG9yeS4gIE9uIHRoZSBjbGllbnQKLSAgICAgICAgICAgICAqIHNpZGUsIHRoZSBiaW5kaW5nIGlzIG5vdCB5ZXQgc2V0IHdoZW4gd2UgY2FsbCBpbnRvIHRoYXQgZmFjdG9yeSwgc28gdGhlCi0gICAgICAgICAgICAgKiBoYW5kbGVyIGxpc3QgZG9lc24ndCBnZXQgc2V0IG9uIHRoZSBJbnZvY2F0aW9uQ29udGV4dCBvYmplY3QgdGhlcmUuICBUaHVzCi0gICAgICAgICAgICAgKiB3ZSBnb3R0YSBkbyBpdCBoZXJlLgotICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgIC8vIGJlIHN1cmUgdG8gdXNlIHdoYXRldmVyIGhhbmRsZXJyZXNvbHZlciBpcyByZWdpc3RlcmVkIG9uIHRoZSBTZXJ2aWNlCi0gICAgICAgICAgICBCaW5kaW5nIGJpbmRpbmcgPSAoQmluZGluZykgZ2V0QmluZGluZygpOwotICAgICAgICAgICAgaW52b2NhdGlvbkNvbnRleHQuc2V0SGFuZGxlcnMoYmluZGluZy5nZXRIYW5kbGVyQ2hhaW4oKSk7Ci0KLSAgICAgICAgICAgIGluaXRNZXNzYWdlQ29udGV4dChvYmosIHJlcXVlc3RNc2dDdHgpOwotCi0gICAgICAgICAgICAvLyBNaWdyYXRlIHRoZSBwcm9wZXJ0aWVzIGZyb20gdGhlIGNsaWVudCByZXF1ZXN0IGNvbnRleHQgYmFnIHRvCi0gICAgICAgICAgICAvLyB0aGUgcmVxdWVzdCBNZXNzYWdlQ29udGV4dC4KLSAgICAgICAgICAgIEFwcGxpY2F0aW9uQ29udGV4dE1pZ3JhdG9yVXRpbC5wZXJmb3JtTWlncmF0aW9uVG9NZXNzYWdlQ29udGV4dCgKLSAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLkFQUExJQ0FUSU9OX0NPTlRFWFRfTUlHUkFUT1JfTElTVF9JRCwKLSAgICAgICAgICAgICAgICAgICAgZ2V0UmVxdWVzdENvbnRleHQoKSwgcmVxdWVzdE1zZ0N0eCk7Ci0KLSAgICAgICAgICAgIC8vIFBlcmZvcm0gdGhlIFdlYlNlcnZpY2VGZWF0dXJlIGNvbmZpZ3VyYXRpb24gcmVxdWVzdGVkIGJ5IHRoZSB1c2VyLgotICAgICAgICAgICAgYmluZGluZy5jb25maWd1cmUocmVxdWVzdE1zZ0N0eCwgdGhpcyk7Ci0KLSAgICAgICAgICAgIC8vIFNlbmQgdGhlIHJlcXVlc3QgdXNpbmcgdGhlIEludm9jYXRpb25Db250cm9sbGVyCi0gICAgICAgICAgICBpYy5pbnZva2VPbmVXYXkoaW52b2NhdGlvbkNvbnRleHQpOwotCi0gICAgICAgICAgICAvL0NoZWNrIHRvIHNlZSBpZiB3ZSBuZWVkIHRvIG1haW50YWluIHNlc3Npb24gc3RhdGUKLSAgICAgICAgICAgIGNoZWNrTWFpbnRhaW5TZXNzaW9uU3RhdGUocmVxdWVzdE1zZ0N0eCwgaW52b2NhdGlvbkNvbnRleHQpOwotCi0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIk9uZS13YXkgaW52b2NhdGlvbiBjb21wbGV0ZWQ6IEJhc2VEaXNwYXRjaC5pbnZva2VPbmVXYXkoKSIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0gY2F0Y2ggKFdlYlNlcnZpY2VFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIEFsbCBleGNlcHRpb25zIGFyZSBjYXVnaHQgYW5kIHJldGhyb3duIGFzIGEgV2ViU2VydmljZUV4Y2VwdGlvbgotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBGdXR1cmU8Pz4gaW52b2tlQXN5bmMoT2JqZWN0IG9iaiwgQXN5bmNIYW5kbGVyIGFzeW5jaGFuZGxlcikgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotCi0gICAgICAgIC8vIEFsbCBleGNlcHRpb25zIGFyZSBjYXVnaHQgYW5kIHJldGhyb3duIGFzIGEgV2ViU2VydmljZUV4Y2VwdGlvbgotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJFbnRlcmVkIGFzeW5jaHJvbm91cyAoY2FsbGJhY2spIGludm9jYXRpb246IEJhc2VEaXNwYXRjaC5pbnZva2VBc3luYygpIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgSW52b2NhdGlvbkNvbnRleHQgaW5zdGFuY2UgZm9yIHRoaXMgcmVxdWVzdC9yZXNwb25zZSBmbG93LgotICAgICAgICAgICAgSW52b2NhdGlvbkNvbnRleHQgaW52b2NhdGlvbkNvbnRleHQgPQotICAgICAgICAgICAgICAgICAgICBJbnZvY2F0aW9uQ29udGV4dEZhY3RvcnkuY3JlYXRlSW52b2NhdGlvbkNvbnRleHQobnVsbCk7Ci0gICAgICAgICAgICBpbnZvY2F0aW9uQ29udGV4dC5zZXRTZXJ2aWNlQ2xpZW50KHNlcnZpY2VDbGllbnQpOwotCi0gICAgICAgICAgICAvLyBDcmVhdGUgdGhlIE1lc3NhZ2VDb250ZXh0IHRvIGhvbGQgdGhlIGFjdHVhbCByZXF1ZXN0IG1lc3NhZ2UgYW5kIGl0cwotICAgICAgICAgICAgLy8gYXNzb2NpYXRlZCBwcm9wZXJ0aWVzCi0gICAgICAgICAgICBNZXNzYWdlQ29udGV4dCByZXF1ZXN0TXNnQ3R4ID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgICAgICByZXF1ZXN0TXNnQ3R4LnNldEVuZHBvaW50RGVzY3JpcHRpb24oZ2V0RW5kcG9pbnREZXNjcmlwdGlvbigpKTsKLSAgICAgICAgICAgIGludm9jYXRpb25Db250ZXh0LnNldFJlcXVlc3RNZXNzYWdlQ29udGV4dChyZXF1ZXN0TXNnQ3R4KTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIFRPRE86IHJldmlldzogbWFrZSBzdXJlIHRoZSBoYW5kbGVycyBhcmUgc2V0IG9uIHRoZSBJbnZvY2F0aW9uQ29udGV4dAotICAgICAgICAgICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgSkFYV1MgcnVudGltZSBkb2VzIG5vdCB1c2UgRW5kcG9pbnQsIHdoaWNoCi0gICAgICAgICAgICAgKiB3b3VsZCBub3JtYWxseSBiZSB0aGUgcGxhY2UgdG8gaW5pdGlhbGl6ZSBhbmQgc3RvcmUgdGhlIGhhbmRsZXIgbGlzdC4KLSAgICAgICAgICAgICAqIEluIGxpZXUgb2YgdGhhdCwgd2Ugd2lsbCBoYXZlIHRvIGludGlhbGl6ZSBhbmQgc3RvcmUgdGhlbSBvbiB0aGUgCi0gICAgICAgICAgICAgKiBJbnZvY2F0aW9uQ29udGV4dC4gIGFsc28gc2VlIHRoZSBJbnZvY2F0aW9uQ29udGV4dEZhY3RvcnkuICBPbiB0aGUgY2xpZW50Ci0gICAgICAgICAgICAgKiBzaWRlLCB0aGUgYmluZGluZyBpcyBub3QgeWV0IHNldCB3aGVuIHdlIGNhbGwgaW50byB0aGF0IGZhY3RvcnksIHNvIHRoZQotICAgICAgICAgICAgICogaGFuZGxlciBsaXN0IGRvZXNuJ3QgZ2V0IHNldCBvbiB0aGUgSW52b2NhdGlvbkNvbnRleHQgb2JqZWN0IHRoZXJlLiAgVGh1cwotICAgICAgICAgICAgICogd2UgZ290dGEgZG8gaXQgaGVyZS4KLSAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAvLyBiZSBzdXJlIHRvIHVzZSB3aGF0ZXZlciBoYW5kbGVycmVzb2x2ZXIgaXMgcmVnaXN0ZXJlZCBvbiB0aGUgU2VydmljZQotICAgICAgICAgICAgQmluZGluZyBiaW5kaW5nID0gKEJpbmRpbmcpIGdldEJpbmRpbmcoKTsKLSAgICAgICAgICAgIGludm9jYXRpb25Db250ZXh0LnNldEhhbmRsZXJzKGJpbmRpbmcuZ2V0SGFuZGxlckNoYWluKCkpOwotCi0gICAgICAgICAgICBpbml0TWVzc2FnZUNvbnRleHQob2JqLCByZXF1ZXN0TXNnQ3R4KTsKLQotICAgICAgICAgICAgLy8gTWlncmF0ZSB0aGUgcHJvcGVydGllcyBmcm9tIHRoZSBjbGllbnQgcmVxdWVzdCBjb250ZXh0IGJhZyB0bwotICAgICAgICAgICAgLy8gdGhlIHJlcXVlc3QgTWVzc2FnZUNvbnRleHQuCi0gICAgICAgICAgICBBcHBsaWNhdGlvbkNvbnRleHRNaWdyYXRvclV0aWwucGVyZm9ybU1pZ3JhdGlvblRvTWVzc2FnZUNvbnRleHQoCi0gICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5BUFBMSUNBVElPTl9DT05URVhUX01JR1JBVE9SX0xJU1RfSUQsCi0gICAgICAgICAgICAgICAgICAgIGdldFJlcXVlc3RDb250ZXh0KCksIHJlcXVlc3RNc2dDdHgpOwotCi0gICAgICAgICAgICAvLyBQZXJmb3JtIHRoZSBXZWJTZXJ2aWNlRmVhdHVyZSBjb25maWd1cmF0aW9uIHJlcXVlc3RlZCBieSB0aGUgdXNlci4KLSAgICAgICAgICAgIGJpbmRpbmcuY29uZmlndXJlKHJlcXVlc3RNc2dDdHgsIHRoaXMpOwotCi0gICAgICAgICAgICAvLyBTZXR1cCB0aGUgRXhlY3V0b3IgdGhhdCB3aWxsIGJlIHVzZWQgdG8gZHJpdmUgYXN5bmMgcmVzcG9uc2VzIGJhY2sgdG8gCi0gICAgICAgICAgICAvLyB0aGUgY2xpZW50LgotICAgICAgICAgICAgLy8gRklYTUU6IFdlIHNob3VsZG4ndCBiZSBnZXR0aW5nIHRoaXMgZnJvbSB0aGUgU2VydmljZURlbGVnYXRlLCByYXRoZXIgZWFjaCAKLSAgICAgICAgICAgIC8vIERpc3BhdGNoIG9iamVjdCBzaG91bGQgaGF2ZSBpdCdzIG93bi4KLSAgICAgICAgICAgIEV4ZWN1dG9yIGUgPSBzZXJ2aWNlRGVsZWdhdGUuZ2V0RXhlY3V0b3IoKTsKLSAgICAgICAgICAgIGludm9jYXRpb25Db250ZXh0LnNldEV4ZWN1dG9yKGUpOwotCi0gICAgICAgICAgICAvLyBDcmVhdGUgdGhlIEFzeW5jTGlzdGVuZXIgdGhhdCBpcyB0byBiZSB1c2VkIGJ5IHRoZSBJbnZvY2F0aW9uQ29udHJvbGxlci4KLSAgICAgICAgICAgIEFzeW5jUmVzcG9uc2UgbGlzdGVuZXIgPSBjcmVhdGVBc3luY1Jlc3BvbnNlTGlzdGVuZXIoKTsKLSAgICAgICAgICAgIGludm9jYXRpb25Db250ZXh0LnNldEFzeW5jUmVzcG9uc2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLSAgICAgICAgICAgIC8vIFNlbmQgdGhlIHJlcXVlc3QgdXNpbmcgdGhlIEludm9jYXRpb25Db250cm9sbGVyCi0gICAgICAgICAgICBGdXR1cmU8Pz4gYXN5bmNSZXNwb25zZSA9IGljLmludm9rZUFzeW5jKGludm9jYXRpb25Db250ZXh0LCBhc3luY2hhbmRsZXIpOwotCi0gICAgICAgICAgICAvL0NoZWNrIHRvIHNlZSBpZiB3ZSBuZWVkIHRvIG1haW50YWluIHNlc3Npb24gc3RhdGUKLSAgICAgICAgICAgIGNoZWNrTWFpbnRhaW5TZXNzaW9uU3RhdGUocmVxdWVzdE1zZ0N0eCwgaW52b2NhdGlvbkNvbnRleHQpOwotCi0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkFzeW5jaHJvbm91cyAoY2FsbGJhY2spIGludm9jYXRpb24gc2VudDogQmFzZURpc3BhdGNoLmludm9rZUFzeW5jKCkiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIGFzeW5jUmVzcG9uc2U7Ci0gICAgICAgIH0gY2F0Y2ggKFdlYlNlcnZpY2VFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIEFsbCBleGNlcHRpb25zIGFyZSBjYXVnaHQgYW5kIHJldGhyb3duIGFzIGEgV2ViU2VydmljZUV4Y2VwdGlvbgotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBSZXNwb25zZSBpbnZva2VBc3luYyhPYmplY3Qgb2JqKSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgLy8gQWxsIGV4Y2VwdGlvbnMgYXJlIGNhdWdodCBhbmQgcmV0aHJvd24gYXMgYSBXZWJTZXJ2aWNlRXhjZXB0aW9uCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkVudGVyZWQgYXN5bmNocm9ub3VzIChwb2xsaW5nKSBpbnZvY2F0aW9uOiBCYXNlRGlzcGF0Y2guaW52b2tlQXN5bmMoKSIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBDcmVhdGUgdGhlIEludm9jYXRpb25Db250ZXh0IGluc3RhbmNlIGZvciB0aGlzIHJlcXVlc3QvcmVzcG9uc2UgZmxvdy4KLSAgICAgICAgICAgIEludm9jYXRpb25Db250ZXh0IGludm9jYXRpb25Db250ZXh0ID0KLSAgICAgICAgICAgICAgICAgICAgSW52b2NhdGlvbkNvbnRleHRGYWN0b3J5LmNyZWF0ZUludm9jYXRpb25Db250ZXh0KG51bGwpOwotICAgICAgICAgICAgaW52b2NhdGlvbkNvbnRleHQuc2V0U2VydmljZUNsaWVudChzZXJ2aWNlQ2xpZW50KTsKLQotICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBNZXNzYWdlQ29udGV4dCB0byBob2xkIHRoZSBhY3R1YWwgcmVxdWVzdCBtZXNzYWdlIGFuZCBpdHMKLSAgICAgICAgICAgIC8vIGFzc29jaWF0ZWQgcHJvcGVydGllcwotICAgICAgICAgICAgTWVzc2FnZUNvbnRleHQgcmVxdWVzdE1zZ0N0eCA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICAgICAgcmVxdWVzdE1zZ0N0eC5zZXRFbmRwb2ludERlc2NyaXB0aW9uKGdldEVuZHBvaW50RGVzY3JpcHRpb24oKSk7Ci0gICAgICAgICAgICBpbnZvY2F0aW9uQ29udGV4dC5zZXRSZXF1ZXN0TWVzc2FnZUNvbnRleHQocmVxdWVzdE1zZ0N0eCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBUT0RPOiByZXZpZXc6IG1ha2Ugc3VyZSB0aGUgaGFuZGxlcnMgYXJlIHNldCBvbiB0aGUgSW52b2NhdGlvbkNvbnRleHQKLSAgICAgICAgICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gb2YgdGhlIEpBWFdTIHJ1bnRpbWUgZG9lcyBub3QgdXNlIEVuZHBvaW50LCB3aGljaAotICAgICAgICAgICAgICogd291bGQgbm9ybWFsbHkgYmUgdGhlIHBsYWNlIHRvIGluaXRpYWxpemUgYW5kIHN0b3JlIHRoZSBoYW5kbGVyIGxpc3QuCi0gICAgICAgICAgICAgKiBJbiBsaWV1IG9mIHRoYXQsIHdlIHdpbGwgaGF2ZSB0byBpbnRpYWxpemUgYW5kIHN0b3JlIHRoZW0gb24gdGhlIAotICAgICAgICAgICAgICogSW52b2NhdGlvbkNvbnRleHQuICBhbHNvIHNlZSB0aGUgSW52b2NhdGlvbkNvbnRleHRGYWN0b3J5LiAgT24gdGhlIGNsaWVudAotICAgICAgICAgICAgICogc2lkZSwgdGhlIGJpbmRpbmcgaXMgbm90IHlldCBzZXQgd2hlbiB3ZSBjYWxsIGludG8gdGhhdCBmYWN0b3J5LCBzbyB0aGUKLSAgICAgICAgICAgICAqIGhhbmRsZXIgbGlzdCBkb2Vzbid0IGdldCBzZXQgb24gdGhlIEludm9jYXRpb25Db250ZXh0IG9iamVjdCB0aGVyZS4gIFRodXMKLSAgICAgICAgICAgICAqIHdlIGdvdHRhIGRvIGl0IGhlcmUuCi0gICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgLy8gYmUgc3VyZSB0byB1c2Ugd2hhdGV2ZXIgaGFuZGxlcnJlc29sdmVyIGlzIHJlZ2lzdGVyZWQgb24gdGhlIFNlcnZpY2UKLSAgICAgICAgICAgIEJpbmRpbmcgYmluZGluZyA9IChCaW5kaW5nKSBnZXRCaW5kaW5nKCk7Ci0gICAgICAgICAgICBpbnZvY2F0aW9uQ29udGV4dC5zZXRIYW5kbGVycyhiaW5kaW5nLmdldEhhbmRsZXJDaGFpbigpKTsKLQotICAgICAgICAgICAgaW5pdE1lc3NhZ2VDb250ZXh0KG9iaiwgcmVxdWVzdE1zZ0N0eCk7Ci0KLSAgICAgICAgICAgIC8vIE1pZ3JhdGUgdGhlIHByb3BlcnRpZXMgZnJvbSB0aGUgY2xpZW50IHJlcXVlc3QgY29udGV4dCBiYWcgdG8KLSAgICAgICAgICAgIC8vIHRoZSByZXF1ZXN0IE1lc3NhZ2VDb250ZXh0LgotICAgICAgICAgICAgQXBwbGljYXRpb25Db250ZXh0TWlncmF0b3JVdGlsLnBlcmZvcm1NaWdyYXRpb25Ub01lc3NhZ2VDb250ZXh0KAotICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuQVBQTElDQVRJT05fQ09OVEVYVF9NSUdSQVRPUl9MSVNUX0lELAotICAgICAgICAgICAgICAgICAgICBnZXRSZXF1ZXN0Q29udGV4dCgpLCByZXF1ZXN0TXNnQ3R4KTsKLQotICAgICAgICAgICAgLy8gUGVyZm9ybSB0aGUgV2ViU2VydmljZUZlYXR1cmUgY29uZmlndXJhdGlvbiByZXF1ZXN0ZWQgYnkgdGhlIHVzZXIuCi0gICAgICAgICAgICBiaW5kaW5nLmNvbmZpZ3VyZShyZXF1ZXN0TXNnQ3R4LCB0aGlzKTsKLQotICAgICAgICAgICAgLy8gU2V0dXAgdGhlIEV4ZWN1dG9yIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGRyaXZlIGFzeW5jIHJlc3BvbnNlcyBiYWNrIHRvIAotICAgICAgICAgICAgLy8gdGhlIGNsaWVudC4KLSAgICAgICAgICAgIC8vIEZJWE1FOiBXZSBzaG91bGRuJ3QgYmUgZ2V0dGluZyB0aGlzIGZyb20gdGhlIFNlcnZpY2VEZWxlZ2F0ZSwgcmF0aGVyIGVhY2ggCi0gICAgICAgICAgICAvLyBEaXNwYXRjaCBvYmplY3Qgc2hvdWxkIGhhdmUgaXQncyBvd24uCi0gICAgICAgICAgICBFeGVjdXRvciBlID0gc2VydmljZURlbGVnYXRlLmdldEV4ZWN1dG9yKCk7Ci0gICAgICAgICAgICBpbnZvY2F0aW9uQ29udGV4dC5zZXRFeGVjdXRvcihlKTsKLQotICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBBc3luY0xpc3RlbmVyIHRoYXQgaXMgdG8gYmUgdXNlZCBieSB0aGUgSW52b2NhdGlvbkNvbnRyb2xsZXIuCi0gICAgICAgICAgICBBc3luY1Jlc3BvbnNlIGxpc3RlbmVyID0gY3JlYXRlQXN5bmNSZXNwb25zZUxpc3RlbmVyKCk7Ci0gICAgICAgICAgICBpbnZvY2F0aW9uQ29udGV4dC5zZXRBc3luY1Jlc3BvbnNlTGlzdGVuZXIobGlzdGVuZXIpOwotCi0gICAgICAgICAgICAvLyBTZW5kIHRoZSByZXF1ZXN0IHVzaW5nIHRoZSBJbnZvY2F0aW9uQ29udHJvbGxlcgotICAgICAgICAgICAgUmVzcG9uc2UgYXN5bmNSZXNwb25zZSA9IGljLmludm9rZUFzeW5jKGludm9jYXRpb25Db250ZXh0KTsKLQotICAgICAgICAgICAgLy9DaGVjayB0byBzZWUgaWYgd2UgbmVlZCB0byBtYWludGFpbiBzZXNzaW9uIHN0YXRlCi0gICAgICAgICAgICBjaGVja01haW50YWluU2Vzc2lvblN0YXRlKHJlcXVlc3RNc2dDdHgsIGludm9jYXRpb25Db250ZXh0KTsKLQotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJBc3luY2hyb25vdXMgKHBvbGxpbmcpIGludm9jYXRpb24gc2VudDogQmFzZURpc3BhdGNoLmludm9rZUFzeW5jKCkiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIGFzeW5jUmVzcG9uc2U7Ci0gICAgICAgIH0gY2F0Y2ggKFdlYlNlcnZpY2VFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIEFsbCBleGNlcHRpb25zIGFyZSBjYXVnaHQgYW5kIHJldGhyb3duIGFzIGEgV2ViU2VydmljZUV4Y2VwdGlvbgotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VDbGllbnQoU2VydmljZUNsaWVudCBzYykgewotICAgICAgICBzZXJ2aWNlQ2xpZW50ID0gc2M7Ci0gICAgfQotCi0gICAgcHVibGljIE1vZGUgZ2V0TW9kZSgpIHsKLSAgICAgICAgcmV0dXJuIG1vZGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TW9kZShNb2RlIG0pIHsKLSAgICAgICAgbW9kZSA9IG07Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZmF1bHQgdGhhdCBpcyBjb250YWluZWQgd2l0aGluIHRoZSBNZXNzYWdlQ29udGV4dCBmb3IgYW4gaW52b2NhdGlvbi4gSWYgbm8gZmF1bHQKLSAgICAgKiBleGlzdHMsIG51bGwgd2lsbCBiZSByZXR1cm5lZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtc2dDdHgKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBXZWJTZXJ2aWNlRXhjZXB0aW9uIGdldEZhdWx0UmVzcG9uc2UoTWVzc2FnZUNvbnRleHQgbXNnQ3R4KSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBNZXNzYWdlIG1zZyA9IG1zZ0N0eC5nZXRNZXNzYWdlKCk7Ci0gICAgICAgICAgICBpZiAobXNnICE9IG51bGwgJiYgbXNnLmlzRmF1bHQoKSkgewotICAgICAgICAgICAgICAgIC8vWE1MRmF1bHQgZmF1bHQgPSBtc2cuZ2V0WE1MRmF1bHQoKTsKLSAgICAgICAgICAgICAgICAvLyA0LjMuMiBjb25mb3JtYW5jZSBidWxsZXQgMSByZXF1aXJlcyBhIFByb3RvY29sRXhjZXB0aW9uIGhlcmUKLSAgICAgICAgICAgICAgICBQcm90b2NvbEV4Y2VwdGlvbiBwZSA9Ci0gICAgICAgICAgICAgICAgICAgIE1ldGhvZE1hcnNoYWxsZXJVdGlscy5jcmVhdGVTeXN0ZW1FeGNlcHRpb24obXNnLmdldFhNTEZhdWx0KCksIG1zZyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHBlOwotICAgICAgICAgICAgfSBlbHNlIGlmIChtc2dDdHguZ2V0TG9jYWxFeGNlcHRpb24oKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gdXNlIHRoZSBmYWN0b3J5LCBpdCdsbCB0aHJvdyB0aGUgcmlnaHQgdGhpbmc6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24obXNnQ3R4LmdldExvY2FsRXhjZXB0aW9uKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgLy8gRnJlZSB0aGUgaW5jb21pbmcgaW5wdXQgc3RyZWFtCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG1zZ0N0eC5mcmVlSW5wdXRTdHJlYW0oKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGlvZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IHRoZSBNZXNzYWdlQ29udGV4dCBjb250YWluZWQgYSBmYXVsdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtc2dDdHgKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaGFzRmF1bHRSZXNwb25zZShNZXNzYWdlQ29udGV4dCBtc2dDdHgpIHsKLSAgICAgICAgaWYgKG1zZ0N0eC5nZXRNZXNzYWdlKCkgIT0gbnVsbCAmJiBtc2dDdHguZ2V0TWVzc2FnZSgpLmlzRmF1bHQoKSkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICBlbHNlIGlmIChtc2dDdHguZ2V0TG9jYWxFeGNlcHRpb24oKSAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIENvbmZpZ3VyZSBhbnkgcHJvcGVydGllcyB0aGF0IHdpbGwgYmUgbmVlZGVkIG9uIHRoZSBNZXNzYWdlCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHNldHVwTWVzc2FnZVByb3BlcnRpZXMoTWVzc2FnZSBtc2cpIHsKLSAgICAgICAgLy8gSWYgdGhlIHVzZXIgaGFzIGVuYWJsZWQgTVRPTSBvbiB0aGUgU09BUEJpbmRpbmcsIHdlIG5lZWQKLSAgICAgICAgLy8gdG8gbWFrZSBzdXJlIHRoYXQgZ2V0cyBwdXNoZWQgdG8gdGhlIE1lc3NhZ2Ugb2JqZWN0LgotICAgICAgICBCaW5kaW5nIGJpbmRpbmcgPSAoQmluZGluZykgZ2V0QmluZGluZygpOwotICAgICAgICBpZiAoYmluZGluZyAhPSBudWxsICYmIGJpbmRpbmcgaW5zdGFuY2VvZiBTT0FQQmluZGluZykgewotICAgICAgICAgICAgU09BUEJpbmRpbmcgc29hcEJpbmRpbmcgPSAoU09BUEJpbmRpbmcpYmluZGluZzsKLSAgICAgICAgICAgIGlmIChzb2FwQmluZGluZy5pc01UT01FbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgbXNnLnNldE1UT01FbmFibGVkKHRydWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAqIENoZWNrcyB0byBzZWUgaWYgdGhlIHBhcmFtZXRlciBmb3IgdGhlIGludm9jYXRpb24gaXMgdmFsaWQKLSAgICAqIGdpdmVuIHRoZSBzY2VuYXJpbyB0aGF0IHRoZSBjbGllbnQgaXMgb3BlcmF0aW5nIGluLiAgVGhlcmUgYXJlCi0gICAgKiBzb21lIGNhc2VzIHdoZW4gbnVsbHMgYXJlIGFsbG93ZWQgYW5kIG90aGVycyB3aGVyZSBpdCBpcwotICAgICogYW4gZXJyb3IuCi0gICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNWYWxpZEludm9jYXRpb25QYXJhbShPYmplY3Qgb2JqZWN0KSB7Ci0gICAgICAgIFN0cmluZyBiaW5kaW5nSWQgPSBlbmRwb2ludERlc2MuZ2V0Q2xpZW50QmluZGluZ0lEKCk7Ci0KLSAgICAgICAgLy8gSWYgbm8gYmluZGluZ0lkIHdhcyBmb3VuZCwgdXNlIHRoZSBkZWZhdWx0LgotICAgICAgICBpZiAoYmluZGluZ0lkID09IG51bGwpIHsKLSAgICAgICAgICAgIGJpbmRpbmdJZCA9IFNPQVBCaW5kaW5nLlNPQVAxMUhUVFBfQklORElORzsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIElmIGl0J3Mgbm90IGFuIEhUVFBfQklORElORywgdGhlbiB3ZSBjYW4gYWxsb3cgZm9yIG51bGwgcGFyYW1zLCAgCi0gICAgICAgIC8vIGJ1dCBvbmx5IGluIFBBWUxPQUQgbW9kZSBwZXIgSkFYLVdTIFNlY3Rpb24gNC4zLjIuCi0gICAgICAgIGlmICghYmluZGluZ0lkLmVxdWFscyhIVFRQQmluZGluZy5IVFRQX0JJTkRJTkcpKSB7Ci0gICAgICAgICAgICBpZiAobW9kZS5lcXVhbHMoTW9kZS5NRVNTQUdFKSAmJiBvYmplY3QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiZGlzcGF0Y2hOdWxsUGFyYW1NZXNzYWdlTW9kZSIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIEluIGFsbCBjYXNlcyAoUEFZTE9BRCBhbmQgTUVTU0FHRSkgd2UgbXVzdCB0aHJvdyBhIFdlYlNlcnZpY2VFeGNlcHRpb24KLSAgICAgICAgICAgIC8vIGlmIHRoZSBwYXJhbWV0ZXIgaXMgbnVsbCBhbmQgcmVxdWVzdCBtZXRob2QgaXMgUE9TVCBvciBQVVQuCi0gICAgICAgICAgICBpZiAob2JqZWN0ID09IG51bGwgJiYgaXNQT1NUb3JQVVRSZXF1ZXN0KCkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoImRpc3BhdGNoTnVsbFBhcmFtSHR0cEJpbmRpbmciKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgRE9NU291cmNlKSB7Ci0gICAgICAgICAgICBET01Tb3VyY2UgZHMgPSAoRE9NU291cmNlKW9iamVjdDsKLSAgICAgICAgICAgIGlmIChkcy5nZXROb2RlKCkgPT0gbnVsbCAmJiBkcy5nZXRTeXN0ZW1JZCgpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoImRpc3BhdGNoQmFkRE9NU291cmNlIikpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSWYgd2UndmUgZ290dGVuIHRoaXMgZmFyLCB0aGVuIGFsbCBpcyBnb29kLgotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzUE9TVG9yUFVUUmVxdWVzdCgpIHsKLSAgICAgICAgU3RyaW5nIG1ldGhvZCA9IChTdHJpbmcpdGhpcy5yZXF1ZXN0Q29udGV4dC5nZXQoamF2YXgueG1sLndzLmhhbmRsZXIuTWVzc2FnZUNvbnRleHQuSFRUUF9SRVFVRVNUX01FVEhPRCk7Ci0gICAgICAgIC8vIGlmIEhUVFBfUkVRVUVTVF9NRVRIT0QgaXMgbm90IHNwZWNpZmllZCwgYXNzdW1lIGl0IGlzIGEgUE9TVCBtZXRob2QKLSAgICAgICAgcmV0dXJuIChtZXRob2QgPT0gbnVsbCB8fCAKLSAgICAgICAgICAgICAgICBIVFRQQ29uc3RhbnRzLkhFQURFUl9QT1NULmVxdWFsc0lnbm9yZUNhc2UobWV0aG9kKSB8fCAKLSAgICAgICAgICAgICAgICBIVFRQQ29uc3RhbnRzLkhFQURFUl9QVVQuZXF1YWxzSWdub3JlQ2FzZShtZXRob2QpKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBNZXNzYWdlIGNyZWF0ZVJlcXVlc3RNZXNzYWdlKE9iamVjdCBvYmopIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgCi0gICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgb2JqZWN0IGlzIGEgdmFsaWQgaW52b2NhdGlvbiBwYXJhbWV0ZXIuICAKLSAgICAgICAgLy8gVGhlbiBjcmVhdGUgdGhlIG1lc3NhZ2UgZnJvbSB0aGUgb2JqZWN0LgotICAgICAgICAvLyBJZiBhbiBleGNlcHRpb24gb2NjdXJzLCBpdCBpcyBsb2NhbCB0byB0aGUgY2xpZW50IGFuZCB0aGVyZWZvcmUgaXMgYQotICAgICAgICAvLyBXZWJTZXJ2aWNlRXhjZXB0aW9uIChhbmQgbm90IFByb3RvY29sRXhjZXB0aW9ucykuCi0gICAgICAgIC8vIFRoaXMgY29kZSBjb21wbGllcyB3aXRoIEpBWC1XUyAyLjAgc2VjdGlvbnMgNC4zLjIsIDQuMy4zIGFuZCA0LjMuNC4KLSAgICAgICAgaWYgKCFpc1ZhbGlkSW52b2NhdGlvblBhcmFtKG9iaikpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiZGlzcGF0Y2hJbnZhbGlkUGFyYW0iKSk7Ci0gICAgICAgIH0gCi0gICAgICAgIE1lc3NhZ2UgcmVxdWVzdE1zZyA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgcmVxdWVzdE1zZyA9IGNyZWF0ZU1lc3NhZ2VGcm9tVmFsdWUob2JqKTsKLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgICAgIC8vIFRoZSB3ZWJzZXJ2aWNlIGV4Y2VwdGlvbiB3cmFwcyB0aGUgdGhyb3duIGV4Y2VwdGlvbi4KLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24odCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlcXVlc3RNc2c7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2xpZW50L2Rpc3BhdGNoL0Rpc3BhdGNoT3BlcmF0aW9uSGFuZGxlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2xpZW50L2Rpc3BhdGNoL0Rpc3BhdGNoT3BlcmF0aW9uSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmQ3NTYyLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NsaWVudC9kaXNwYXRjaC9EaXNwYXRjaE9wZXJhdGlvbkhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jbGllbnQuZGlzcGF0Y2g7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBCb2R5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuU2VydmljZUNsaWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLS8qCi0gKiBJbiBKQVgtV1MgRGlzcGF0Y2ggY2xpZW50cyB3ZSBkb24ndCBrbm93IHdoYXQgYWN0dWFsIG9wZXJhdGlvbiB3ZSBhcmUgY2FsbGluZwotICogdW50aWwgdGhlIG1lc3NhZ2UgaXMgY29udmVydGVkIHRvIGEgU09BUCBlbnZlbG9wZS4gU28gbGV0J3MgdHJ5IHRvIGZpbmQgdGhlIHJlYWwKLSAqIG9wZXJhdGlvbiBiYXNlZCBvbiB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgYm9keSBpbiBvcmRlciB0byBzZW5kIHRoZSByaWdodCBXU0EKLSAqIGFjdGlvbi4KLSAqIAotICogVGhpcyBoYW5kbGVyIHNob3VsZCBiZSBpbnN0YWxsZWQgaW4gT3V0RmxvdyBjaGFpbi4KLSAqLwotcHVibGljIGNsYXNzIERpc3BhdGNoT3BlcmF0aW9uSGFuZGxlciBleHRlbmRzIG9yZy5hcGFjaGUuYXhpczIuaGFuZGxlcnMuQWJzdHJhY3RIYW5kbGVyIHsKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgTE9HID0gTG9nRmFjdG9yeS5nZXRMb2coRGlzcGF0Y2hPcGVyYXRpb25IYW5kbGVyLmNsYXNzKTsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0Fub255bW91c09wZXJhdGlvbihBeGlzT3BlcmF0aW9uIG9wKSB7Ci0gICAgICAgIHJldHVybiAoU2VydmljZUNsaWVudC5BTk9OX09VVF9JTl9PUC5lcXVhbHMob3AuZ2V0TmFtZSgpKSB8fAotICAgICAgICAgICAgICAgIFNlcnZpY2VDbGllbnQuQU5PTl9PVVRfT05MWV9PUC5lcXVhbHMob3AuZ2V0TmFtZSgpKSk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgUU5hbWUgZ2V0Rmlyc3RCb2R5RWxlbWVudChTT0FQRW52ZWxvcGUgZW52ZWxvcGUpIHsKLSAgICAgICAgU09BUEJvZHkgYm9keSA9IGVudmVsb3BlLmdldEJvZHkoKTsKLSAgICAgICAgaWYgKGJvZHkgIT0gbnVsbCkgewotICAgICAgICAgICAgT01FbGVtZW50IGZpcnN0RWxlbWVudCA9IGJvZHkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICAgICAgICBpZiAoZmlyc3RFbGVtZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmlyc3RFbGVtZW50LmdldFFOYW1lKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgQXhpc09wZXJhdGlvbiBmaW5kUmVhbE9wZXJhdGlvbkFjdGlvbihNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB7Ci0gICAgICAgIEF4aXNPcGVyYXRpb24gYXhpc09wZXJhdGlvbiA9IG51bGw7Ci0gICAgICAgIFFOYW1lIGZpcnN0Qm9keUVsZW1lbnQgPSBnZXRGaXJzdEJvZHlFbGVtZW50KG1zZ0NvbnRleHQuZ2V0RW52ZWxvcGUoKSk7Ci0gICAgICAgIGlmIChmaXJzdEJvZHlFbGVtZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2UgPSBtc2dDb250ZXh0LmdldEF4aXNTZXJ2aWNlKCk7Ci0gICAgICAgICAgICBheGlzT3BlcmF0aW9uID0gc2VydmljZS5nZXRPcGVyYXRpb25CeU1lc3NhZ2VFbGVtZW50UU5hbWUoZmlyc3RCb2R5RWxlbWVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGF4aXNPcGVyYXRpb247ICAgICAgICAgICAgCi0gICAgfQotICAgIAotICAgIHB1YmxpYyBJbnZvY2F0aW9uUmVzcG9uc2UgaW52b2tlKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBBeGlzT3BlcmF0aW9uIG9wID0gbXNnQ29udGV4dC5nZXRBeGlzT3BlcmF0aW9uKCk7ICAgICAgIAotICAgICAgICBpZiAoIW1zZ0NvbnRleHQuaXNTZXJ2ZXJTaWRlKCkgJiYgb3AgIT0gbnVsbCAmJiBpc0Fub255bW91c09wZXJhdGlvbihvcCkpIHsKLSAgICAgICAgICAgIG9wID0gZmluZFJlYWxPcGVyYXRpb25BY3Rpb24obXNnQ29udGV4dCk7ICAgICAgICAgCi0gICAgICAgICAgICBpZiAob3AgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1zZ0NvbnRleHQuc2V0QXhpc09wZXJhdGlvbihvcCk7Ci0gICAgICAgICAgICAgICAgaWYgKExPRy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIExPRy5kZWJ1ZygiQW5vbnltb3VzIG9wZXJhdGlvbiBkZXRlY3RlZC4gUmVwbGFjZWQgd2l0aCByZWFsIG9wZXJhdGlvbjogIiArIG9wKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gICAgICAgICAgICAgICAgCi0gICAgICAgIHJldHVybiBJbnZvY2F0aW9uUmVzcG9uc2UuQ09OVElOVUU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2xpZW50L2Rpc3BhdGNoL0pBWEJEaXNwYXRjaC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2xpZW50L2Rpc3BhdGNoL0pBWEJEaXNwYXRjaC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTc2MGRjLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NsaWVudC9kaXNwYXRjaC9KQVhCRGlzcGF0Y2guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY2xpZW50LmRpc3BhdGNoOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuRXhjZXB0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNsaWVudC5hc3luYy5Bc3luY1Jlc3BvbnNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRW5kcG9pbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuQmxvY2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLlByb3RvY29sOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5kYXRhYmluZGluZy5KQVhCQmxvY2tDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5mYWN0b3J5LkJsb2NrRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZmFjdG9yeS5KQVhCQmxvY2tGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5mYWN0b3J5Lk1lc3NhZ2VGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MucmVnaXN0cnkuRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc3BpLlNlcnZpY2VEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnV0aWxpdHkuWE1MUm9vdEVsZW1lbnRVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkNvbnRleHQ7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZS5Nb2RlOwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRmVhdHVyZTsKLQotcHVibGljIGNsYXNzIEpBWEJEaXNwYXRjaDxUPiBleHRlbmRzIEJhc2VEaXNwYXRjaDxUPiB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEpBWEJEaXNwYXRjaC5jbGFzcyk7Ci0gICAgcHJpdmF0ZSBKQVhCQ29udGV4dCBqYXhiQ29udGV4dDsKLQotICAgIHB1YmxpYyBKQVhCRGlzcGF0Y2goU2VydmljZURlbGVnYXRlIHN2Y0RlbGVnYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlcERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICBXZWJTZXJ2aWNlRmVhdHVyZS4uLiBmZWF0dXJlcykgewotICAgICAgICB0aGlzKHN2Y0RlbGVnYXRlLCBlcERlc2MsIG51bGwsIG51bGwsIGZlYXR1cmVzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSkFYQkRpc3BhdGNoKFNlcnZpY2VEZWxlZ2F0ZSBzdmNEZWxlZ2F0ZSwKLSAgICAgICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZXBEZXNjLAotICAgICAgICAgICAgRW5kcG9pbnRSZWZlcmVuY2UgZXByLAotICAgICAgICAgICAgU3RyaW5nIGFkZHJlc3NpbmdOYW1lc3BhY2UsCi0gICAgICAgICAgICBXZWJTZXJ2aWNlRmVhdHVyZS4uLiBmZWF0dXJlcykgewotICAgICAgICBzdXBlcihzdmNEZWxlZ2F0ZSwgZXBEZXNjLCBlcHIsIGFkZHJlc3NpbmdOYW1lc3BhY2UsIGZlYXR1cmVzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSkFYQkNvbnRleHQgZ2V0SkFYQkNvbnRleHQoKSB7Ci0gICAgICAgIHJldHVybiBqYXhiQ29udGV4dDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRKQVhCQ29udGV4dChKQVhCQ29udGV4dCBqYmMpIHsKLSAgICAgICAgamF4YkNvbnRleHQgPSBqYmM7Ci0gICAgfQotCi0gICAgcHVibGljIEFzeW5jUmVzcG9uc2UgY3JlYXRlQXN5bmNSZXNwb25zZUxpc3RlbmVyKCkgewotICAgICAgICBKQVhCRGlzcGF0Y2hBc3luY0xpc3RlbmVyIGxpc3RlbmVyID0KLSAgICAgICAgICAgICAgICBuZXcgSkFYQkRpc3BhdGNoQXN5bmNMaXN0ZW5lcihnZXRFbmRwb2ludERlc2NyaXB0aW9uKCkpOwotICAgICAgICBsaXN0ZW5lci5zZXRKQVhCQ29udGV4dChqYXhiQ29udGV4dCk7Ci0gICAgICAgIGxpc3RlbmVyLnNldE1vZGUobW9kZSk7Ci0gICAgICAgIHJldHVybiBsaXN0ZW5lcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWVzc2FnZSBjcmVhdGVNZXNzYWdlRnJvbVZhbHVlKE9iamVjdCB2YWx1ZSkgewotICAgICAgICBNZXNzYWdlIG1lc3NhZ2UgPSBudWxsOwotICAgICAgICAKLSAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiRGlzcGF0Y2ggaW52b2tlZCB3aXRoIG51bGwgcGFyYW1ldGVyIFZhbHVlIik7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJjcmVhdGluZyBlbXB0eSBzb2FwIG1lc3NhZ2UiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUVtcHR5TWVzc2FnZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIFByb3RvY29sLmdldFByb3RvY29sRm9yQmluZGluZyhlbmRwb2ludERlc2MuZ2V0Q2xpZW50QmluZGluZ0lEKCkpKTsKLQotICAgICAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICB0cnkgewotICAgICAgICAgICAgSkFYQkJsb2NrRmFjdG9yeSBmYWN0b3J5ID0KLSAgICAgICAgICAgICAgICAoSkFYQkJsb2NrRmFjdG9yeSlGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShKQVhCQmxvY2tGYWN0b3J5LmNsYXNzKTsKLQotICAgICAgICAgICAgQ2xhc3MgY2xhenogPSB2YWx1ZS5nZXRDbGFzcygpOwotICAgICAgICAgICAgSkFYQkJsb2NrQ29udGV4dCBjb250ZXh0ID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChqYXhiQ29udGV4dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY29udGV4dCA9IG5ldyBKQVhCQmxvY2tDb250ZXh0KGpheGJDb250ZXh0KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgY29udGV4dCA9IG5ldyBKQVhCQmxvY2tDb250ZXh0KGNsYXp6LmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gVGhlIHByb3RvY29sIG9mIHRoZSBNZXNzYWdlIHRoYXQgaXMgY3JlYXRlZCBzaG91bGQgYmUgYmFzZWQKLSAgICAgICAgICAgIC8vIG9uIHRoZSBiaW5kaW5nIGluZm9ybWF0aW9uIGF2YWlsYWJsZS4KLSAgICAgICAgICAgIFByb3RvY29sIHByb3RvID0gUHJvdG9jb2wuZ2V0UHJvdG9jb2xGb3JCaW5kaW5nKGVuZHBvaW50RGVzYy5nZXRDbGllbnRCaW5kaW5nSUQoKSk7Ci0KLSAgICAgICAgICAgIC8vIENyZWF0ZSBhIGJsb2NrIGZyb20gdGhlIHZhbHVlCi0gICAgICAgICAgICBRTmFtZSBxTmFtZSA9IFhNTFJvb3RFbGVtZW50VXRpbC5nZXRYbWxSb290RWxlbWVudFFOYW1lRnJvbU9iamVjdCh2YWx1ZSk7Ci0gICAgICAgICAgICBCbG9jayBibG9jayA9IGZhY3RvcnkuY3JlYXRlRnJvbSh2YWx1ZSwgY29udGV4dCwgcU5hbWUpOwotICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkgbWYgPSAoTWVzc2FnZUZhY3RvcnkpRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoTWVzc2FnZUZhY3RvcnkuY2xhc3MpOwotCi0gICAgICAgICAgICBpZiAobW9kZS5lcXVhbHMoTW9kZS5QQVlMT0FEKSkgewotICAgICAgICAgICAgICAgIC8vIE5vcm1hbCBjYXNlCi0KLSAgICAgICAgICAgICAgICBtZXNzYWdlID0gbWYuY3JlYXRlKHByb3RvKTsKLSAgICAgICAgICAgICAgICBtZXNzYWdlLnNldEJvZHlCbG9jayhibG9jayk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIE1lc3NhZ2UgbW9kZS4ucmFyZSBjYXNlCi0KLSAgICAgICAgICAgICAgICAvLyBDcmVhdGUgTWVzc2FnZSBmcm9tIGJsb2NrCi0gICAgICAgICAgICAgICAgbWVzc2FnZSA9IG1mLmNyZWF0ZUZyb20oYmxvY2ssIG51bGwsIHByb3RvKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBtZXNzYWdlOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWVGcm9tTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKLSAgICAgICAgcmV0dXJuIGdldFZhbHVlKG1lc3NhZ2UsIG1vZGUsIGpheGJDb250ZXh0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb21tb24gY29kZSB0byBnZXQgdGhlIHZhbHVlIGZvciBKQVhCRGlzcGF0Y2ggYW5kIEpBWEJEaXNwYXRjaEFzeW5jTGlzdGVuZXIKLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXNzYWdlCi0gICAgICogQHBhcmFtIG1vZGUKLSAgICAgKiBAcGFyYW0gamF4YkNvbnRleHQKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgc3RhdGljIE9iamVjdCBnZXRWYWx1ZShNZXNzYWdlIG1lc3NhZ2UsIE1vZGUgbW9kZSwgSkFYQkNvbnRleHQgamF4YkNvbnRleHQpIHsKLSAgICAgICAgT2JqZWN0IHZhbHVlID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChtb2RlLmVxdWFscyhNb2RlLlBBWUxPQUQpKSB7Ci0gICAgICAgICAgICAgICAgLy8gTm9ybWFsIENhc2UKLSAgICAgICAgICAgICAgICBKQVhCQmxvY2tGYWN0b3J5IGZhY3RvcnkgPQotICAgICAgICAgICAgICAgICAgICAgICAgKEpBWEJCbG9ja0ZhY3RvcnkpRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoSkFYQkJsb2NrRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgSkFYQkJsb2NrQ29udGV4dCBjb250ZXh0ID0gbmV3IEpBWEJCbG9ja0NvbnRleHQoamF4YkNvbnRleHQpOwotICAgICAgICAgICAgICAgIEJsb2NrIGJsb2NrID0gbWVzc2FnZS5nZXRCb2R5QmxvY2soY29udGV4dCwgZmFjdG9yeSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoYmxvY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGJsb2NrLmdldEJ1c2luZXNzT2JqZWN0KHRydWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFJFVklFVyBUaGlzIHNlZW1zIGxpa2UgdGhlIGNvcnJlY3QgYmVoYXZpb3IuICBJZiB0aGUgYm9keSBpcyBlbXB0eSwgcmV0dXJuIGEgbnVsbAotICAgICAgICAgICAgICAgICAgICAvLyBBbnkgY2hhbmdlcyBoZXJlIHNob3VsZCBhbHNvIGJlIG1hZGUgdG8gWE1MRGlzcGF0Y2guZ2V0VmFsdWUKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGVyZSBhcmUgbm8gZWxlbWVudHMgaW4gdGhlIGJvZHkgdG8gdW5tYXJzaGFsLiAgSkFYQkRpc3BhdGNoIHJldHVybnMgYSBudWxsIHZhbHVlIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBudWxsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQmxvY2tGYWN0b3J5IGZhY3RvcnkgPQotICAgICAgICAgICAgICAgICAgICAgICAgKEJsb2NrRmFjdG9yeSlGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShKQVhCQmxvY2tGYWN0b3J5LmNsYXNzKTsKLSAgICAgICAgICAgICAgICBKQVhCQmxvY2tDb250ZXh0IGNvbnRleHQgPSBuZXcgSkFYQkJsb2NrQ29udGV4dChqYXhiQ29udGV4dCk7Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSBtZXNzYWdlLmdldFZhbHVlKGNvbnRleHQsIGZhY3RvcnkpOwotICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhlcmUgYXJlIG5vIGVsZW1lbnRzIHRvIHVubWFyc2hhbC4gIEpBWEJEaXNwYXRjaCByZXR1cm5zIGEgbnVsbCB2YWx1ZSIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIG1lc3NhZ2UuY2xvc2UoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBNZXNzYWdlIGNyZWF0ZUVtcHR5TWVzc2FnZShQcm90b2NvbCBwcm90b2NvbCkKLSAgICAgICAgICAgIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uLCBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBNZXNzYWdlRmFjdG9yeSBtZiA9IChNZXNzYWdlRmFjdG9yeSlGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShNZXNzYWdlRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgIE1lc3NhZ2UgbSA9IG1mLmNyZWF0ZShwcm90b2NvbCk7Ci0gICAgICAgIHJldHVybiBtOwotICAgIH0gICAgCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jbGllbnQvZGlzcGF0Y2gvSkFYQkRpc3BhdGNoQXN5bmNMaXN0ZW5lci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2xpZW50L2Rpc3BhdGNoL0pBWEJEaXNwYXRjaEFzeW5jTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTUwMGNkYy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jbGllbnQvZGlzcGF0Y2gvSkFYQkRpc3BhdGNoQXN5bmNMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNsaWVudC5kaXNwYXRjaDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuRXhjZXB0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNsaWVudC5hc3luYy5Bc3luY1Jlc3BvbnNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkVuZHBvaW50RGVzY3JpcHRpb247Ci0KLWltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCQ29udGV4dDsKLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZS5Nb2RlOwotCi0vKioKLSAqIFRoZSBKQVhCRGlzcGF0Y2hBc3luY0xpc3RlbmVyIGlzIGFuIGV4dGVuc2lvbiBvZiB0aGUge0BsaW5rIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY2xpZW50LmFzeW5jLkFzeW5jUmVzcG9uc2V9Ci0gKiBjbGFzcyB0byBwcm92aWRlIEpBWC1CIHNwZWNpZmljIGZ1bmN0aW9uIHdoZW4gcHJvY2Vzc2luZyBhbiBhc3luYyByZXNwb25zZS4KLSAqLwotcHVibGljIGNsYXNzIEpBWEJEaXNwYXRjaEFzeW5jTGlzdGVuZXIgZXh0ZW5kcyBBc3luY1Jlc3BvbnNlIHsKLQotICAgIHByaXZhdGUgTW9kZSBtb2RlOwotICAgIHByaXZhdGUgSkFYQkNvbnRleHQgamF4YkNvbnRleHQ7Ci0KLSAgICBwdWJsaWMgSkFYQkRpc3BhdGNoQXN5bmNMaXN0ZW5lcihFbmRwb2ludERlc2NyaXB0aW9uIGVkKSB7Ci0gICAgICAgIHN1cGVyKGVkKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRNb2RlKE1vZGUgbSkgewotICAgICAgICBtb2RlID0gbTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRKQVhCQ29udGV4dChKQVhCQ29udGV4dCBqYmMpIHsKLSAgICAgICAgamF4YkNvbnRleHQgPSBqYmM7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRSZXNwb25zZVZhbHVlT2JqZWN0KE1lc3NhZ2VDb250ZXh0IG1jKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gSkFYQkRpc3BhdGNoLmdldFZhbHVlKG1jLmdldE1lc3NhZ2UoKSwgbW9kZSwgamF4YkNvbnRleHQpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgLy8gRnJlZSB0aGUgaW5jb21pbmcgc3RyZWFtCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG1jLmZyZWVJbnB1dFN0cmVhbSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbih0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBUaHJvd2FibGUgZ2V0RmF1bHRSZXNwb25zZShNZXNzYWdlQ29udGV4dCBtYykgewotICAgICAgICByZXR1cm4gQmFzZURpc3BhdGNoLmdldEZhdWx0UmVzcG9uc2UobWMpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NsaWVudC9kaXNwYXRjaC9YTUxEaXNwYXRjaC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2xpZW50L2Rpc3BhdGNoL1hNTERpc3BhdGNoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlMjU4MTAuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2xpZW50L2Rpc3BhdGNoL1hNTERpc3BhdGNoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNsaWVudC5kaXNwYXRjaDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLkV4Y2VwdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51dGlsaXR5LkRhdGFTb3VyY2VGb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jbGllbnQuYXN5bmMuQXN5bmNSZXNwb25zZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5FbmRwb2ludERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5CbG9jazsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuTWVzc2FnZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuUHJvdG9jb2w7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmZhY3RvcnkuQmxvY2tGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5mYWN0b3J5LkRhdGFTb3VyY2VCbG9ja0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmZhY3RvcnkuTWVzc2FnZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmZhY3RvcnkuT01CbG9ja0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmZhY3RvcnkuU09BUEVudmVsb3BlQmxvY2tGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5mYWN0b3J5LlNvdXJjZUJsb2NrRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZmFjdG9yeS5YTUxTdHJpbmdCbG9ja0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5yZWdpc3RyeS5GYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zcGkuU2VydmljZURlbGVnYXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5kYXRhYmluZGluZy5PTUJsb2NrOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5kYXRhYmluZGluZy5pbXBsLk9NQmxvY2tGYWN0b3J5SW1wbDsKLQotaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRGF0YVNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRW52ZWxvcGU7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUE1lc3NhZ2U7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2UuTW9kZTsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUZlYXR1cmU7Ci0KLXB1YmxpYyBjbGFzcyBYTUxEaXNwYXRjaDxUPiBleHRlbmRzIEJhc2VEaXNwYXRjaDxUPiB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFhNTERpc3BhdGNoLmNsYXNzKTsKLSAgICBwcml2YXRlIENsYXNzIHR5cGU7Ci0gICAgcHJpdmF0ZSBDbGFzcyBibG9ja0ZhY3RvcnlUeXBlOwotCi0gICAgcHVibGljIFhNTERpc3BhdGNoKFNlcnZpY2VEZWxlZ2F0ZSBzdmNEZWxlZ2F0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlbmRwb2ludERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgIFdlYlNlcnZpY2VGZWF0dXJlLi4uIGZlYXR1cmVzKSB7Ci0gICAgICAgIHRoaXMoc3ZjRGVsZWdhdGUsIGVuZHBvaW50RGVzYywgbnVsbCwgbnVsbCwgZmVhdHVyZXMpOwotICAgIH0KLQotICAgIHB1YmxpYyBYTUxEaXNwYXRjaChTZXJ2aWNlRGVsZWdhdGUgc3ZjRGVsZWdhdGUsCi0gICAgICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVuZHBvaW50RGVzYywKLSAgICAgICAgICAgIEVuZHBvaW50UmVmZXJlbmNlIGVwciwKLSAgICAgICAgICAgIFN0cmluZyBhZGRyZXNzaW5nTmFtZXNwYWNlLAotICAgICAgICAgICAgV2ViU2VydmljZUZlYXR1cmUuLi4gZmVhdHVyZXMpIHsKLSAgICAgICAgc3VwZXIoc3ZjRGVsZWdhdGUsIGVuZHBvaW50RGVzYywgZXByLCBhZGRyZXNzaW5nTmFtZXNwYWNlLCBmZWF0dXJlcyk7Ci0gICAgfQotCi0gICAgcHVibGljIENsYXNzIGdldFR5cGUoKSB7Ci0gICAgICAgIHJldHVybiB0eXBlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFR5cGUoQ2xhc3MgYykgewotICAgICAgICB0eXBlID0gYzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXN5bmNSZXNwb25zZSBjcmVhdGVBc3luY1Jlc3BvbnNlTGlzdGVuZXIoKSB7Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJDcmVhdGluZyBuZXcgQXN5bmNMaXN0ZW5lciBmb3IgWE1MRGlzcGF0Y2giKTsKLSAgICAgICAgfQotCi0gICAgICAgIFhNTERpc3BhdGNoQXN5bmNMaXN0ZW5lciBhbCA9IG5ldyBYTUxEaXNwYXRjaEFzeW5jTGlzdGVuZXIoZ2V0RW5kcG9pbnREZXNjcmlwdGlvbigpKTsKLSAgICAgICAgYWwuc2V0TW9kZShtb2RlKTsKLSAgICAgICAgYWwuc2V0VHlwZSh0eXBlKTsKLSAgICAgICAgYWwuc2V0QmxvY2tGYWN0b3J5VHlwZShibG9ja0ZhY3RvcnlUeXBlKTsKLSAgICAgICAgcmV0dXJuIGFsOwotICAgIH0KLQotICAgIHB1YmxpYyBNZXNzYWdlIGNyZWF0ZU1lc3NhZ2VGcm9tVmFsdWUoT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0eXBlID0gdmFsdWUuZ2V0Q2xhc3MoKTsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiUGFyYW1ldGVyIHR5cGU6ICIgKyB0eXBlLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJNZXNzYWdlIG1vZGU6ICIgKyBtb2RlLm5hbWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkRpc3BhdGNoIGludm9rZWQgd2l0aCBudWxsIHBhcmFtZXRlciBWYWx1ZSIpOwotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiY3JlYXRpbmcgZW1wdHkgc29hcCBtZXNzYWdlIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJsb2NrRmFjdG9yeVR5cGUgPSBnZXRCbG9ja0ZhY3RvcnkoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlRW1wdHlNZXNzYWdlKAotICAgICAgICAgICAgICAgICAgICAgICAgUHJvdG9jb2wuZ2V0UHJvdG9jb2xGb3JCaW5kaW5nKGVuZHBvaW50RGVzYy5nZXRDbGllbnRCaW5kaW5nSUQoKSkpOwotCi0gICAgICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgICBCbG9jayBibG9jayA9IG51bGw7Ci0gICAgICAgIGJsb2NrRmFjdG9yeVR5cGUgPSBnZXRCbG9ja0ZhY3RvcnkodmFsdWUpOwotICAgICAgICBCbG9ja0ZhY3RvcnkgZmFjdG9yeSA9IChCbG9ja0ZhY3RvcnkpRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoYmxvY2tGYWN0b3J5VHlwZSk7Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJMb2FkZWQgYmxvY2sgZmFjdG9yeSB0eXBlIFsiICsgYmxvY2tGYWN0b3J5VHlwZS5nZXROYW1lKCkpOwotICAgICAgICB9Ci0gICAgICAgIC8vIFRoZSBwcm90b2NvbCBvZiB0aGUgTWVzc2FnZSB0aGF0IGlzIGNyZWF0ZWQgc2hvdWxkIGJlIGJhc2VkCi0gICAgICAgIC8vIG9uIHRoZSBiaW5kaW5nIGluZm9ybWF0aW9uIGF2YWlsYWJsZS4KLSAgICAgICAgUHJvdG9jb2wgcHJvdG8gPSBQcm90b2NvbC5nZXRQcm90b2NvbEZvckJpbmRpbmcoZW5kcG9pbnREZXNjLmdldENsaWVudEJpbmRpbmdJRCgpKTsKLSAgICAgICAgTWVzc2FnZSBtZXNzYWdlID0gbnVsbDsKLSAgICAgICAgaWYgKG1vZGUuZXF1YWxzKE1vZGUuUEFZTE9BRCkpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkgbWYgPQotICAgICAgICAgICAgICAgICAgICAgICAgKE1lc3NhZ2VGYWN0b3J5KUZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KE1lc3NhZ2VGYWN0b3J5LmNsYXNzKTsKLSAgICAgICAgICAgICAgICBibG9jayA9IGZhY3RvcnkuY3JlYXRlRnJvbSh2YWx1ZSwgbnVsbCwgbnVsbCk7Ci0KLQotICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBtZi5jcmVhdGUocHJvdG8pOwotICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc2V0Qm9keUJsb2NrKGJsb2NrKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChtb2RlLmVxdWFscyhNb2RlLk1FU1NBR0UpKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5IG1mID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChNZXNzYWdlRmFjdG9yeSlGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShNZXNzYWdlRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgLy8gSWYgdGhlIHZhbHVlIGNvbnRhaW5zIGp1c3QgdGhlIHhtbCBkYXRhLCB0aGVuIHlvdSBjYW4gY3JlYXRlIHRoZSBNZXNzYWdlIGRpcmVjdGx5IGZyb20gdGhlCi0gICAgICAgICAgICAgICAgLy8gQmxvY2suICBJZiB0aGUgdmFsdWUgY29udGFpbnMgYXR0YWNobWVudHMsIHlvdSBuZWVkIHRvIGRvIG1vcmUuCi0gICAgICAgICAgICAgICAgLy8gVE9ETyBGb3Igbm93IHRoZSBvbmx5IHZhbHVlIHRoYXQgY29udGFpbnMgQXR0YWNobWVudHMgaXMgU09BUE1lc3NhZ2UKLSAgICAgICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBTT0FQTWVzc2FnZSkgewotICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gbWYuY3JlYXRlRnJvbSgoU09BUE1lc3NhZ2UpdmFsdWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGJsb2NrID0gZmFjdG9yeS5jcmVhdGVGcm9tKHZhbHVlLCBudWxsLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IG1mLmNyZWF0ZUZyb20oYmxvY2ssIG51bGwsIHByb3RvKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbWVzc2FnZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldFZhbHVlRnJvbU1lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7Ci0gICAgICAgIHJldHVybiBnZXRWYWx1ZShtZXNzYWdlLCBtb2RlLCBibG9ja0ZhY3RvcnlUeXBlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb21tb24gY29kZSB1c2VkIGJ5IFhNTERpc3BhdGNoIGFuZCBYTUxEaXNwYXRjaEFzeW5jTGlzdGVuZXIKLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXNzYWdlCi0gICAgICogQHJldHVybiBvYmplY3QKLSAgICAgKi8KLSAgICBzdGF0aWMgT2JqZWN0IGdldFZhbHVlKE1lc3NhZ2UgbWVzc2FnZSwgTW9kZSBtb2RlLCBDbGFzcyBibG9ja0ZhY3RvcnlUeXBlKSB7Ci0gICAgICAgIE9iamVjdCB2YWx1ZSA9IG51bGw7Ci0gICAgICAgIEJsb2NrIGJsb2NrID0gbnVsbDsKLQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiQXR0ZW1wdGluZyB0byBnZXQgdGhlIHZhbHVlIG9iamVjdCBmcm9tIHRoZSByZXR1cm5lZCBtZXNzYWdlIik7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKG1vZGUuZXF1YWxzKE1vZGUuUEFZTE9BRCkpIHsKLSAgICAgICAgICAgICAgICBCbG9ja0ZhY3RvcnkgZmFjdG9yeSA9IChCbG9ja0ZhY3RvcnkpRmFjdG9yeVJlZ2lzdHJ5Ci0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShibG9ja0ZhY3RvcnlUeXBlKTsKLSAgICAgICAgICAgICAgICBibG9jayA9IG1lc3NhZ2UuZ2V0Qm9keUJsb2NrKG51bGwsIGZhY3RvcnkpOwotICAgICAgICAgICAgICAgIGlmIChibG9jayAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gYmxvY2suZ2V0QnVzaW5lc3NPYmplY3QodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE9NQmxvY2tGYWN0b3J5SW1wbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSAoKE9NQmxvY2spdmFsdWUpLmdldE9NRWxlbWVudCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gUkVWSUVXIFRoaXMgc2VlbXMgbGlrZSB0aGUgY29ycmVjdCBiZWhhdmlvci4gIElmIHRoZSBib2R5IGlzIGVtcHR5LCByZXR1cm4gYSBudWxsCi0gICAgICAgICAgICAgICAgICAgIC8vIEFueSBjaGFuZ2VzIGhlcmUgc2hvdWxkIGFsc28gYmUgbWFkZSB0byBYTUxEaXNwYXRjaC5nZXRWYWx1ZQotICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoZXJlIGFyZSBubyBlbGVtZW50cyBpbiB0aGUgYm9keSB0byB1bm1hcnNoYWwuICBYTUxEaXNwYXRjaCByZXR1cm5zIGEgbnVsbCB2YWx1ZSIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAobW9kZS5lcXVhbHMoTW9kZS5NRVNTQUdFKSkgewotICAgICAgICAgICAgICAgIEJsb2NrRmFjdG9yeSBmYWN0b3J5ID0gKEJsb2NrRmFjdG9yeSlGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShibG9ja0ZhY3RvcnlUeXBlKTsKLSAgICAgICAgICAgICAgICBpZiAoZmFjdG9yeSBpbnN0YW5jZW9mIE9NQmxvY2tGYWN0b3J5SW1wbCkgewotICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IChPTUVsZW1lbnQpbWVzc2FnZS5nZXRBc09NRWxlbWVudCgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gbWVzc2FnZS5nZXRWYWx1ZShudWxsLCBmYWN0b3J5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGVyZSBhcmUgbm8gZWxlbWVudHMgdG8gdW5tYXJzaGFsLiAgWE1MRGlzcGF0Y2ggcmV0dXJucyBhIG51bGwgdmFsdWUiKTsKLSAgICAgICAgICAgICAgICAgICAgfSAgIAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJBbiBlcnJvciBvY2N1cmVkIHdoaWxlIGNyZWF0aW5nIHRoZSBibG9jayIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgT01FbGVtZW50KSkgewotICAgICAgICAgICAgICAgIG1lc3NhZ2UuY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJSZXR1cm5pbmcgYSBudWxsIHZhbHVlIik7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJSZXR1cm5pbmcgdmFsdWUgb2YgdHlwZTogIiArIHZhbHVlLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIENsYXNzIGdldEJsb2NrRmFjdG9yeShPYmplY3QgbykgewotICAgICAgICBpZiAobyBpbnN0YW5jZW9mIFN0cmluZykgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCI+PiByZXR1cm5pbmcgWE1MU3RyaW5nQmxvY2tGYWN0b3J5Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gWE1MU3RyaW5nQmxvY2tGYWN0b3J5LmNsYXNzOwotICAgICAgICB9IGVsc2UgaWYgKFNvdXJjZS5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKG8uZ2V0Q2xhc3MoKSkpIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiPj4gcmV0dXJuaW5nIFNvdXJjZUJsb2NrRmFjdG9yeSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIFNvdXJjZUJsb2NrRmFjdG9yeS5jbGFzczsKLSAgICAgICAgfSBlbHNlIGlmIChEYXRhU291cmNlLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oby5nZXRDbGFzcygpKSkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCI+PiByZXR1cm5pbmcgRGF0YVNvdXJjZUJsb2NrRmFjdG9yeSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIERhdGFTb3VyY2VCbG9ja0ZhY3RvcnkuY2xhc3M7Ci0gICAgICAgIH0gZWxzZSBpZiAoU09BUE1lc3NhZ2UuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShvLmdldENsYXNzKCkpKSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIj4+IHJldHVybmluZyBTT0FQTWVzc2FnZUZhY3RvcnkiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBTT0FQRW52ZWxvcGVCbG9ja0ZhY3RvcnkuY2xhc3M7Ci0gICAgICAgIH0gZWxzZSBpZiAoU09BUEVudmVsb3BlLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oby5nZXRDbGFzcygpKSkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCI+PiByZXR1cm5pbmcgU09BUEVudmVsb3BlIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gU09BUEVudmVsb3BlQmxvY2tGYWN0b3J5LmNsYXNzOwotICAgICAgICB9IGVsc2UgaWYgKE9NRWxlbWVudC5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKG8uZ2V0Q2xhc3MoKSkpIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiPj4gcmV0dXJuaW5nIE9NQmxvY2tGYWN0b3J5Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gT01CbG9ja0ZhY3RvcnkuY2xhc3M7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIj4+IEVSUk9SOiBGYWN0b3J5IG5vdCBmb3VuZCIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgQ2xhc3MgZ2V0QmxvY2tGYWN0b3J5KCkgewotCi0gICAgICAgIGlmIChTdHJpbmcuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbSh0eXBlKSkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCI+PiByZXR1cm5pbmcgWE1MU3RyaW5nQmxvY2tGYWN0b3J5Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gWE1MU3RyaW5nQmxvY2tGYWN0b3J5LmNsYXNzOwotICAgICAgICB9IGVsc2UgaWYgKFNvdXJjZS5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHR5cGUpKSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIj4+IHJldHVybmluZyBTb3VyY2VCbG9ja0ZhY3RvcnkiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBTb3VyY2VCbG9ja0ZhY3RvcnkuY2xhc3M7Ci0gICAgICAgIH0gZWxzZSBpZiAoU09BUE1lc3NhZ2UuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbSh0eXBlKSkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCI+PiByZXR1cm5pbmcgU09BUE1lc3NhZ2VGYWN0b3J5Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gU09BUEVudmVsb3BlQmxvY2tGYWN0b3J5LmNsYXNzOwotICAgICAgICB9IGVsc2UgaWYgKFNPQVBFbnZlbG9wZS5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHR5cGUpKSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIj4+IHJldHVybmluZyBTT0FQRW52ZWxvcGUiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBTT0FQRW52ZWxvcGVCbG9ja0ZhY3RvcnkuY2xhc3M7Ci0gICAgICAgIH0gZWxzZSBpZiAoT01FbGVtZW50LmNsYXNzLmlzQXNzaWduYWJsZUZyb20odHlwZSkpIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiPj4gcmV0dXJuaW5nIE9NQmxvY2tGYWN0b3J5Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gT01CbG9ja0ZhY3RvcnkuY2xhc3M7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIj4+IEVSUk9SOiBGYWN0b3J5IG5vdCBmb3VuZCIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgTWVzc2FnZSBjcmVhdGVFbXB0eU1lc3NhZ2UoUHJvdG9jb2wgcHJvdG9jb2wpCi0gICAgICAgICAgICB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiwgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgTWVzc2FnZUZhY3RvcnkgbWYgPSAoTWVzc2FnZUZhY3RvcnkpRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoTWVzc2FnZUZhY3RvcnkuY2xhc3MpOwotICAgICAgICBNZXNzYWdlIG0gPSBtZi5jcmVhdGUocHJvdG9jb2wpOwotICAgICAgICByZXR1cm4gbTsKLSAgICB9Ci0KLQotICAgIHByb3RlY3RlZCB2b2lkIGluaXRNZXNzYWdlQ29udGV4dChPYmplY3Qgb2JqLCBNZXNzYWdlQ29udGV4dCByZXF1ZXN0TXNnQ3R4KSB7Ci0gICAgICAgIHN1cGVyLmluaXRNZXNzYWdlQ29udGV4dChvYmosIHJlcXVlc3RNc2dDdHgpOwotICAgICAgICBpZihvYmogaW5zdGFuY2VvZiBEYXRhU291cmNlKXsKLSAgICAgICAgICAgIHJlcXVlc3RNc2dDdHguc2V0UHJvcGVydHkoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uTUVTU0FHRV9GT1JNQVRURVIsIAotICAgICAgICAgICAgICAgICAgICBuZXcgRGF0YVNvdXJjZUZvcm1hdHRlcigoKERhdGFTb3VyY2Upb2JqKS5nZXRDb250ZW50VHlwZSgpKSk7ICAgIAotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jbGllbnQvZGlzcGF0Y2gvWE1MRGlzcGF0Y2hBc3luY0xpc3RlbmVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jbGllbnQvZGlzcGF0Y2gvWE1MRGlzcGF0Y2hBc3luY0xpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlOTg2NzYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2xpZW50L2Rpc3BhdGNoL1hNTERpc3BhdGNoQXN5bmNMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNsaWVudC5kaXNwYXRjaDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuRXhjZXB0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNsaWVudC5hc3luYy5Bc3luY1Jlc3BvbnNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkVuZHBvaW50RGVzY3JpcHRpb247Ci0KLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZS5Nb2RlOwotCi0vKioKLSAqIFRoZSBYTUxEaXNwYXRjaEFzeW5jTGlzdGVuZXIgaXMgYW4gZXh0ZW5zaW9uIG9mIHRoZSB7QGxpbmsgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jbGllbnQuYXN5bmMuQXN5bmNSZXNwb25zZX0KLSAqIGNsYXNzIHRvIHByb3ZpZGUgcHJvcGVyIGRlc2VyaWFsaXphdGlvbiBpbnRvIHRoZSB0YXJnZXQgZm9ybWF0IChYTUwgU3RyaW5nIG9yIFNvdXJjZSkuCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxEaXNwYXRjaEFzeW5jTGlzdGVuZXIgZXh0ZW5kcyBBc3luY1Jlc3BvbnNlIHsKLQotICAgIHByaXZhdGUgTW9kZSBtb2RlOwotICAgIHByaXZhdGUgQ2xhc3MgdHlwZTsKLSAgICBwcml2YXRlIENsYXNzIGJsb2NrRmFjdG9yeVR5cGU7Ci0KLSAgICBwdWJsaWMgWE1MRGlzcGF0Y2hBc3luY0xpc3RlbmVyKEVuZHBvaW50RGVzY3JpcHRpb24gZWQpIHsKLSAgICAgICAgc3VwZXIoZWQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE1vZGUoTW9kZSBtKSB7Ci0gICAgICAgIG1vZGUgPSBtOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFR5cGUoQ2xhc3MgdCkgewotICAgICAgICB0eXBlID0gdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRCbG9ja0ZhY3RvcnlUeXBlKENsYXNzIHQpIHsKLSAgICAgICAgYmxvY2tGYWN0b3J5VHlwZSA9IHQ7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRSZXNwb25zZVZhbHVlT2JqZWN0KE1lc3NhZ2VDb250ZXh0IG1jKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gWE1MRGlzcGF0Y2guZ2V0VmFsdWUobWMuZ2V0TWVzc2FnZSgpLCBtb2RlLCBibG9ja0ZhY3RvcnlUeXBlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIC8vIEZyZWUgaW5jb21pbmcgc3RyZWFtCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG1jLmZyZWVJbnB1dFN0cmVhbSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbih0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBUaHJvd2FibGUgZ2V0RmF1bHRSZXNwb25zZShNZXNzYWdlQ29udGV4dCBtYykgewotICAgICAgICByZXR1cm4gQmFzZURpc3BhdGNoLmdldEZhdWx0UmVzcG9uc2UobWMpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NsaWVudC9wcm94eS9KQVhXU1Byb3h5SGFuZGxlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2xpZW50L3Byb3h5L0pBWFdTUHJveHlIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjZDM4NDQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2xpZW50L3Byb3h5L0pBWFdTUHJveHlIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNsaWVudC5wcm94eTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLkJpbmRpbmdQcm92aWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLkV4Y2VwdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jbGllbnQuYXN5bmMuQXN5bmNSZXNwb25zZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUuSW52b2NhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLkludm9jYXRpb25Db250ZXh0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLmNvbnRyb2xsZXIuSW52b2NhdGlvbkNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLmNvbnRyb2xsZXIuSW52b2NhdGlvbkNvbnRyb2xsZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRW5kcG9pbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLk9wZXJhdGlvbkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uU2VydmljZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaTE4bi5NZXNzYWdlczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1hcnNoYWxsZXIuZmFjdG9yeS5NZXRob2RNYXJzaGFsbGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuTWVzc2FnZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnJlZ2lzdHJ5LkZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNwaS5CaW5kaW5nOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc3BpLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNwaS5TZXJ2aWNlRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zcGkubWlncmF0b3IuQXBwbGljYXRpb25Db250ZXh0TWlncmF0b3JVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuSFRUUENvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LnhtbC53cy5Bc3luY0hhbmRsZXI7Ci1pbXBvcnQgamF2YXgueG1sLndzLlJlc3BvbnNlOwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRmVhdHVyZTsKLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5TT0FQQmluZGluZzsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uSGFuZGxlcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JTZXJ2aWNlOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTsKLQotLyoqCi0gKiBQcm94eUhhbmRsZXIgaXMgdGhlIGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25IYW5kbGVyIGltcGxlbWVudGF0aW9uLiBXaGVuIGEgSkFYLVdTIGNsaWVudAotICogY2FsbHMgdGhlIG1ldGhvZCBvbiBhIHByb3h5IG9iamVjdCwgY3JlYXRlZCBieSBjYWxsaW5nIHRoZSBTZXJ2aWNlRGVsZWdhdGUuZ2V0UG9ydCguLi4pIG1ldGhvZCwKLSAqIHRoZSBpbm92a2UgbWV0aG9kIG9uIHRoZSBQcm94eUhhbmRsZXIgaXMgY2FsbGVkLgotICogPHAvPgotICogUHJveHlIYW5kbGVyIHVzZXMgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdG9yIGFuZCBmaW5kcyBvdXQgaWYgMSkgVGhlIGNsaWVudCBjYWxsIGlzIERvY3VtZW50Ci0gKiBMaXRlcmFsIG9yIFJwYyBMaXRlcmFsIDIpIFRoZSBXU0RMIGlzIHdyYXBwZWQgb3IgdW5XcmFwcGVkLgotICogPHAvPgotICogUHJveHlIYW5kbGVyIHRoZW4gcmVhZHMgT3BlcmF0aW9uRGVzY3JpcHRpb24gdXNpbmcgTWV0aG9kIG5hbWUgY2FsbGVkIGJ5IENsaWVudCBGcm9tCi0gKiBPcGVyYXRpb25EZXNjcmlwdGlvbiBpdCBkb2VzIHRoZSBmb2xsb3dpbmcgMSkgaWYgdGhlIHdzZGwgaXNXcmFwcGVkKCkgcmVhZHMgUmVxdWVzdFdyYXBwZXIgQ2xhc3MKLSAqIGFuZCByZXNwb25zZVdyYXBwZXJDbGFzcyAyKSB0aGVuIHJlYWRzIHRoZSB3ZWJQYXJhbXMgZm9yIHRoZSBPcGVyYXRpb24uCi0gKiA8cC8+Ci0gKiBpc1dyYXBwZWQoKSA9IHRydWUgIGFuZCBEb2NMaXRlcmFsIHRoZW4gUHJveHlIYW5kbGVyIHRoZW4gdXNlcyBXcmFwcGVyVG9vbCB0byBjcmVhdGUgUmVxdWVzdCB0aGF0Ci0gKiBpcyBhIFdyYXBwZWQgSkFYQk9iamVjdC4gQ3JlYXRlcyBKQVhCQmxvY2sgdXNpbmcgSkFYQkJsb2NrRmFjdG9yeSBDcmVhdGVzIE1lc3NhZ2VDb250ZXh0LT5NZXNzYWdlCi0gKiBhbmQgc2V0cyBKQVhCQmxvY2sgdG8geG1sUGFydCBhcyBSZXF1ZXN0TXNnQ3R4IGluIEludm9jYXRpb25Db250ZXh0LiBNYWtlcyBjYWxsIHRvCi0gKiBJbnZvY2F0aW9uQ29udHJvbGxlci4gUmVhZHMgUmVzcG9uc2VNc2dDdHggLT5NZXNzYWdlQ3R4LT5NZXNzYWdlLT5YTUxQYXJ0LiBDb252ZXJ0cyB0aGF0IHRvCi0gKiBKQVhCbG9jayB1c2luZyBKQVhCQmxvY2tGYWN0b3J5IGFuZCByZXR1cm5zIHRoZSBCTyBmcm9tIHRoaXMgSkFYQkJsb2NrLgotICogPHAvPgotICogaXNXcmFwcGVkKCkgIT0gdHJ1ZSBhbmQgRG9jTGl0ZXJhbCB0aGVuIFByb3h5SGFuZGxlciBjcmVhdGVzIHRoZSBKQVhCQmxvY2sgZm9yIHRoZSBpbnB1dCByZXF1ZXN0Ci0gKiBjcmVhdGVzIGEgTWVzc2FnZUNvbnRleHQgdGhhdCBpcyB0aGVuIHVzZWQgYnkgSWJ2b2NhdGlvbkNvbnRyb2xsZXIgdG8gaW52b2tlLiBSZXNwb25zZSBpcyByZWFkCi0gKiBhbmQgcmV0dXJuIG9iamVjdCBpcyBkZXJpdmVkIHVzaW5nIEBXZWJyZXN1bHQgYW5ub3RhdGlvbi4gQSBKQVhCQmxvY2sgaXMgY3JlYXRlZCBmcm9tIHRoZQotICogUmVzcG9uc2UgYW5kIHRoZSBCTyBmcm9tIEpBWEJCbG9jayBpcyByZXR1cm5lZC4KLSAqLwotCi1wdWJsaWMgY2xhc3MgSkFYV1NQcm94eUhhbmRsZXIgZXh0ZW5kcyBCaW5kaW5nUHJvdmlkZXIgaW1wbGVtZW50cwotICAgICAgICBJbnZvY2F0aW9uSGFuZGxlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEpBWFdTUHJveHlIYW5kbGVyLmNsYXNzKTsKLQotICAgIHByaXZhdGUgQ2xhc3Mgc2VpQ2xhenogPSBudWxsOwotICAgIHByaXZhdGUgTWV0aG9kIG1ldGhvZCA9IG51bGw7Ci0gICAgCi0gICAgLy9SZWZlcmVuY2UgdG8gU2VydmljZURlbGVnYXRlIGluc3RhbmNlIHRoYXQgd2FzIHVzZWQgdG8gY3JlYXRlIHRoZSBQcm94eQotICAgIHByb3RlY3RlZCBTZXJ2aWNlRGVzY3JpcHRpb24gc2VydmljZURlc2MgPSBudWxsOwotCi0gICAgcHJvdGVjdGVkIEludm9jYXRpb25Db250cm9sbGVyIGNvbnRyb2xsZXI7Ci0gICAgCi0gICAgcHVibGljIEpBWFdTUHJveHlIYW5kbGVyKFNlcnZpY2VEZWxlZ2F0ZSBkZWxlZ2F0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3Mgc2VpQ2xhenosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZXBEZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJTZXJ2aWNlRmVhdHVyZS4uLiBmZWF0dXJlcykgewotICAgICAgICB0aGlzKGRlbGVnYXRlLCBzZWlDbGF6eiwgZXBEZXNjLCBudWxsLCBudWxsLCBmZWF0dXJlcyk7Ci0gICAgfQotCi0gICAgcHVibGljIEpBWFdTUHJveHlIYW5kbGVyKFNlcnZpY2VEZWxlZ2F0ZSBkZWxlZ2F0ZSwKLSAgICAgICAgICAgIENsYXNzIHNlaUNsYXp6LAotICAgICAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlcERlc2MsCi0gICAgICAgICAgICBFbmRwb2ludFJlZmVyZW5jZSBlcHIsCi0gICAgICAgICAgICBTdHJpbmcgYWRkcmVzc2luZ05hbWVzcGFjZSwKLSAgICAgICAgICAgIFdlYlNlcnZpY2VGZWF0dXJlLi4uIGZlYXR1cmVzKSB7Ci0gICAgICAgIHN1cGVyKGRlbGVnYXRlLCBlcERlc2MsIGVwciwgYWRkcmVzc2luZ05hbWVzcGFjZSwgZmVhdHVyZXMpOwotICAgICAgICAKLSAgICAgICAgdGhpcy5zZWlDbGF6eiA9IHNlaUNsYXp6OwotICAgICAgICB0aGlzLnNlcnZpY2VEZXNjID0gZGVsZWdhdGUuZ2V0U2VydmljZURlc2NyaXB0aW9uKCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICogQHNlZSBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uSGFuZGxlciNpbnZva2UoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kLCBqYXZhLmxhbmcuT2JqZWN0W10pCi0gICAgKgotICAgICogSW52b2tlcyB0aGUgbWV0aG9kIHRoYXQgd2FzIGNhbGxlZCBvbiB0aGUgamF2YS5sYW5nLnJlZmxlY3QuUHJveHkgaW5zdGFuY2UuCi0gICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGludm9rZShPYmplY3QgcHJveHksIE1ldGhvZCBtZXRob2QsIE9iamVjdFtdIGFyZ3MpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBib29sZWFuIGRlYnVnID0gbG9nLmlzRGVidWdFbmFibGVkKCk7Ci0gICAgICAgIGlmIChkZWJ1ZykgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJBdHRlbXBpbmcgdG8gaW52b2tlIE1ldGhvZDogIiArIG1ldGhvZC5nZXROYW1lKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy5tZXRob2QgPSBtZXRob2Q7Ci0KLSAgICAgICAgaWYgKCFpc1ZhbGlkTWV0aG9kQ2FsbChtZXRob2QpKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRNZXNzYWdlKCJwcm94eUVycjEiLCBtZXRob2QuZ2V0TmFtZSgpLCBzZWlDbGF6ei5nZXROYW1lKCkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghaXNQdWJsaWMobWV0aG9kKSkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZ2V0TWVzc2FnZSgicHJveHlQcml2YXRlTWV0aG9kIiwgbWV0aG9kLmdldE5hbWUoKSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGlzQmluZGluZ1Byb3ZpZGVySW52b2tlZChtZXRob2QpKSB7Ci0gICAgICAgICAgICAvLyBTaW5jZSB0aGUgSkFYLVdTIHByb3h5IGluc3RhbmNlIG11c3QgYWxzbyBpbXBsZW1lbnQgdGhlIGphdmF4LnhtbC53cy5CaW5kaW5nUHJvdmlkZXIKLSAgICAgICAgICAgIC8vIGludGVyZmFjZSwgdGhpcyBvYmplY3QgbXVzdCBoYW5kbGUgdGhvc2UgaW52b2NhdGlvbnMgYXMgd2VsbC4gIEluIHRoYXQgY2FzZSwgd2UnbGwKLSAgICAgICAgICAgIC8vIGRlbGVnYXRlIHRob3NlIGNhbGxzIHRvIHRoZSBCaW5kaW5nUHJvdmlkZXIgb2JqZWN0LgotICAgICAgICAgICAgaWYgKGRlYnVnKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKAotICAgICAgICAgICAgICAgICAgICAgICAgIkludm9raW5nIGEgcHVibGljIG1ldGhvZCBvbiB0aGUgamF2YXgueG1sLndzLkJpbmRpbmdQcm92aWRlciBpbnRlcmZhY2UuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHJldHVybiBtZXRob2QuaW52b2tlKHRoaXMsIGFyZ3MpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGRlYnVnKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQW4gZXJyb3Igb2NjdXJlZCB3aGlsZSBpbnZva2luZyB0aGUgbWV0aG9kOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgT3BlcmF0aW9uRGVzY3JpcHRpb24gb3BlcmF0aW9uRGVzYyA9Ci0gICAgICAgICAgICAgICAgICAgIGVuZHBvaW50RGVzYy5nZXRFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uKCkuZ2V0T3BlcmF0aW9uKG1ldGhvZCk7Ci0gICAgICAgICAgICBpZiAoaXNNZXRob2RFeGNsdWRlZChvcGVyYXRpb25EZXNjKSkgewotICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRNZXNzYWdlKCJwcm94eUV4Y2x1ZGVkTWV0aG9kIiwgbWV0aG9kLmdldE5hbWUoKSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGludm9rZVNFSU1ldGhvZChtZXRob2QsIGFyZ3MpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAqIFBlcmZvcm1zIHRoZSBpbnZvY2F0aW9uIG9mIHRoZSBtZXRob2QgZGVmaW5lZCBvbiB0aGUgU2VydmljZSBFbmRwb2ludAotICAgICogSW50ZXJmYWNlLgotICAgICovCi0gICAgcHJpdmF0ZSBPYmplY3QgaW52b2tlU0VJTWV0aG9kKE1ldGhvZCBtZXRob2QsIE9iamVjdFtdIGFyZ3MpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiQXR0ZW1wdGluZyB0byBpbnZva2UgU0VJIE1ldGhvZCAiICsgbWV0aG9kLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBPcGVyYXRpb25EZXNjcmlwdGlvbiBvcGVyYXRpb25EZXNjID0KLSAgICAgICAgICAgICAgICBlbmRwb2ludERlc2MuZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbigpLmdldE9wZXJhdGlvbihtZXRob2QpOwotCi0gICAgICAgIC8vIENyZWF0ZSBhbmQgY29uZmlndXJlIHRoZSByZXF1ZXN0IE1lc3NhZ2VDb250ZXh0Ci0gICAgICAgIEludm9jYXRpb25Db250ZXh0IHJlcXVlc3RJQyA9IEludm9jYXRpb25Db250ZXh0RmFjdG9yeS5jcmVhdGVJbnZvY2F0aW9uQ29udGV4dChudWxsKTsKLSAgICAgICAgTWVzc2FnZUNvbnRleHQgcmVxdWVzdCA9IGNyZWF0ZVJlcXVlc3QobWV0aG9kLCBhcmdzKTsKLSAgICAgICAgcmVxdWVzdC5zZXRFbmRwb2ludERlc2NyaXB0aW9uKGdldEVuZHBvaW50RGVzY3JpcHRpb24oKSk7Ci0gICAgICAgIHJlcXVlc3Quc2V0T3BlcmF0aW9uRGVzY3JpcHRpb24ob3BlcmF0aW9uRGVzYyk7Ci0KLSAgICAgICAgLy8gRW5hYmxlIE1UT00gb24gdGhlIE1lc3NhZ2UgaWYgdGhlIHByb3BlcnR5IHdhcyBzZXQgb24gdGhlIFNPQVBCaW5kaW5nLgotICAgICAgICBCaW5kaW5nIGJuZCA9IChCaW5kaW5nKSBnZXRCaW5kaW5nKCk7Ci0gICAgICAgIGlmIChibmQgIT0gbnVsbCAmJiBibmQgaW5zdGFuY2VvZiBTT0FQQmluZGluZykgewotICAgICAgICAgICAgaWYgKCgoU09BUEJpbmRpbmcpYm5kKS5pc01UT01FbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBNZXNzYWdlIHJlcXVlc3RNc2cgPSByZXF1ZXN0LmdldE1lc3NhZ2UoKTsKLSAgICAgICAgICAgICAgICByZXF1ZXN0TXNnLnNldE1UT01FbmFibGVkKHRydWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvKgotICAgICAgICAgKiBUT0RPOiByZXZpZXc6IG1ha2Ugc3VyZSB0aGUgaGFuZGxlcnMgYXJlIHNldCBvbiB0aGUgSW52b2NhdGlvbkNvbnRleHQKLSAgICAgICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgSkFYV1MgcnVudGltZSBkb2VzIG5vdCB1c2UgRW5kcG9pbnQsIHdoaWNoCi0gICAgICAgICAqIHdvdWxkIG5vcm1hbGx5IGJlIHRoZSBwbGFjZSB0byBpbml0aWFsaXplIGFuZCBzdG9yZSB0aGUgaGFuZGxlciBsaXN0LgotICAgICAgICAgKiBJbiBsaWV1IG9mIHRoYXQsIHdlIHdpbGwgaGF2ZSB0byBpbnRpYWxpemUgYW5kIHN0b3JlIHRoZW0gb24gdGhlIAotICAgICAgICAgKiBJbnZvY2F0aW9uQ29udGV4dC4gIGFsc28gc2VlIHRoZSBJbnZvY2F0aW9uQ29udGV4dEZhY3RvcnkuICBPbiB0aGUgY2xpZW50Ci0gICAgICAgICAqIHNpZGUsIHRoZSBiaW5kaW5nIGlzIG5vdCB5ZXQgc2V0IHdoZW4gd2UgY2FsbCBpbnRvIHRoYXQgZmFjdG9yeSwgc28gdGhlCi0gICAgICAgICAqIGhhbmRsZXIgbGlzdCBkb2Vzbid0IGdldCBzZXQgb24gdGhlIEludm9jYXRpb25Db250ZXh0IG9iamVjdCB0aGVyZS4gIFRodXMKLSAgICAgICAgICogd2UgZ290dGEgZG8gaXQgaGVyZS4KLSAgICAgICAgICovCi0gICAgICAgIAotICAgICAgICAvLyBiZSBzdXJlIHRvIHVzZSB3aGF0ZXZlciBoYW5kbGVycmVzb2x2ZXIgaXMgcmVnaXN0ZXJlZCBvbiB0aGUgU2VydmljZQotICAgICAgICByZXF1ZXN0SUMuc2V0SGFuZGxlcnMoYm5kLmdldEhhbmRsZXJDaGFpbigpKTsKLQotICAgICAgICByZXF1ZXN0SUMuc2V0UmVxdWVzdE1lc3NhZ2VDb250ZXh0KHJlcXVlc3QpOwotICAgICAgICByZXF1ZXN0SUMuc2V0U2VydmljZUNsaWVudChzZXJ2aWNlRGVsZWdhdGUuZ2V0U2VydmljZUNsaWVudChlbmRwb2ludERlc2MuZ2V0UG9ydFFOYW1lKCkpKTsKLSAgICAgICAgCi0gICAgICAgIC8qCi0gICAgICAgICAqIGlmIFNFU1NJT05fTUFJTlRBSU5fUFJPUEVSVFkgaXMgdHJ1ZSwgYW5kIHRoZSBjbGllbnQgYXBwIGhhcyBleHBsaWNpdGx5IHNldCBhIEhFQURFUl9DT09LSUUgb24gdGhlIHJlcXVlc3QgY29udGV4dCwgYXNzdW1lIHRoZSBjbGllbnQKLSAgICAgICAgICogYXBwIGlzIGV4cGVjdGluZyB0aGUgSEVBREVSX0NPT0tJRSB0byBiZSB0aGUgc2Vzc2lvbiBpZC4gIElmIHdlIHdlcmUgZXN0YWJsaXNoaW5nIGEgbmV3IHNlc3Npb24sIG5vIGNvb2tpZSB3b3VsZCBiZSBzZW50LCBhbmQgdGhlIAotICAgICAgICAgKiBzZXJ2ZXIgd291bGQgcmVwbHkgd2l0aCBhICJTZXQtQ29va2llIiBoZWFkZXIsIHdoaWNoIGlzIGNvcGllZCBhcyBhICJDb29raWUiLWtleWVkIHByb3BlcnR5IHRvIHRoZSBzZXJ2aWNlIGNvbnRleHQgZHVyaW5nIHJlc3BvbnNlLgotICAgICAgICAgKiBJbiB0aGlzIGNhc2UsIGlmIHdlIHN1Y2NlZWQgaW4gdXNpbmcgYW4gZXhpc3Rpbmcgc2VydmVyIHNlc3Npb24sIG5vICJTZXQtQ29va2llIiBoZWFkZXIgd2lsbCBiZSByZXR1cm5lZCwgYW5kIHRoZXJlZm9yZSBubwotICAgICAgICAgKiAiQ29va2llIi1rZXllZCBwcm9wZXJ0eSB3b3VsZCBiZSBzZXQgb24gdGhlIHNlcnZpY2UgY29udGV4dC4gIFNvLCBsZXQncyBjb3B5IG91ciByZXF1ZXN0IGNvbnRleHQgSEVBREVSX0NPT0tJRSBrZXkgdG8gdGhlIHNlcnZpY2UKLSAgICAgICAgICogY29udGV4dCBub3cgdG8gcHJldmVudCB0aGUgIm5vIGNvb2tpZSIgZXhjZXB0aW9uIGluIEJpbmRpbmdQcm92aWRlci5zZXR1cFNlc3Npb25Db250ZXh0LiAgSXQgaXMgcG9zc2libGUgdGhlIHNlcnZlciBkb2VzIG5vdCBzdXBwb3J0Ci0gICAgICAgICAqIHNlc3Npb25zLCBpbiB3aGljaCBjYXNlIG5vIGVycm9yIG9jY3VycywgYnV0IHRoZSBjbGllbnQgYXBwIHdvdWxkIGFzc3VtZSBpdCBpcyBwYXJ0aWNpcGF0aW5nIGluIGEgc2Vzc2lvbi4KLSAgICAgICAgICovCi0gICAgICAgIGlmICgocmVxdWVzdENvbnRleHQuY29udGFpbnNLZXkoQmluZGluZ1Byb3ZpZGVyLlNFU1NJT05fTUFJTlRBSU5fUFJPUEVSVFkpKSAmJiAoKEJvb2xlYW4pcmVxdWVzdENvbnRleHQuZ2V0KEJpbmRpbmdQcm92aWRlci5TRVNTSU9OX01BSU5UQUlOX1BST1BFUlRZKSkpIHsKLSAgICAgICAgICAgIGlmICgocmVxdWVzdENvbnRleHQuY29udGFpbnNLZXkoSFRUUENvbnN0YW50cy5IRUFERVJfQ09PS0lFKSkgJiYgKHJlcXVlc3RDb250ZXh0LmdldChIVFRQQ29uc3RhbnRzLkhFQURFUl9DT09LSUUpICE9IG51bGwpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHJlcXVlc3RJQy5nZXRTZXJ2aWNlQ2xpZW50KCkuZ2V0U2VydmljZUNvbnRleHQoKS5nZXRQcm9wZXJ0eShIVFRQQ29uc3RhbnRzLkhFQURFUl9DT09LSUUpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElDLmdldFNlcnZpY2VDbGllbnQoKS5nZXRTZXJ2aWNlQ29udGV4dCgpLnNldFByb3BlcnR5KEhUVFBDb25zdGFudHMuSEVBREVSX0NPT0tJRSwgcmVxdWVzdENvbnRleHQuZ2V0KEhUVFBDb25zdGFudHMuSEVBREVSX0NPT0tJRSkpOwotICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ2xpZW50LWFwcCBkZWZpbmVkIENvb2tpZSBwcm9wZXJ0eSAoYXNzdW1lIHRvIGJlIHNlc3Npb24gY29va2llKSBvbiByZXF1ZXN0IGNvbnRleHQgY29waWVkIHRvIHNlcnZpY2UgY29udGV4dC4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgQ2F1dGlvbjogIHNlcnZlciBtYXkgb3IgbWF5IG5vdCBzdXBwb3J0IHNlc3Npb25zLCBidXQgY2xpZW50IGFwcCB3aWxsIG5vdCBiZSBpbmZvcm1lZCB3aGVuIG5vdCBzdXBwb3J0ZWQuIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIE1pZ3JhdGUgdGhlIHByb3BlcnRpZXMgZnJvbSB0aGUgY2xpZW50IHJlcXVlc3QgY29udGV4dCBiYWcgdG8KLSAgICAgICAgLy8gdGhlIHJlcXVlc3QgTWVzc2FnZUNvbnRleHQuCi0gICAgICAgIEFwcGxpY2F0aW9uQ29udGV4dE1pZ3JhdG9yVXRpbC5wZXJmb3JtTWlncmF0aW9uVG9NZXNzYWdlQ29udGV4dCgKLSAgICAgICAgICAgICAgICBDb25zdGFudHMuQVBQTElDQVRJT05fQ09OVEVYVF9NSUdSQVRPUl9MSVNUX0lELCAKLSAgICAgICAgICAgICAgICBnZXRSZXF1ZXN0Q29udGV4dCgpLCByZXF1ZXN0KTsKLQotICAgICAgICAvLyBQZXJmb3JtIHRoZSBXZWJTZXJ2aWNlRmVhdHVyZSBjb25maWd1cmF0aW9uIHJlcXVlc3RlZCBieSB0aGUgdXNlci4KLSAgICAgICAgYm5kLmNvbmZpZ3VyZShyZXF1ZXN0LCB0aGlzKTsKLQotICAgICAgICAvLyBXZSdsbCBuZWVkIGFuIEludm9jYXRpb25Db250cm9sbGVyIGluc3RhbmNlIHRvIHNlbmQgdGhlIHJlcXVlc3QuCi0gICAgICAgIEludm9jYXRpb25Db250cm9sbGVyRmFjdG9yeSBpY2YgPSAoSW52b2NhdGlvbkNvbnRyb2xsZXJGYWN0b3J5KSBGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShJbnZvY2F0aW9uQ29udHJvbGxlckZhY3RvcnkuY2xhc3MpOwotICAgICAgICBjb250cm9sbGVyID0gaWNmLmdldEludm9jYXRpb25Db250cm9sbGVyKCk7Ci0gICAgICAgIAotICAgICAgICBpZiAoY29udHJvbGxlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJtaXNzaW5nSW52b2NhdGlvbkNvbnRyb2xsZXIiKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIENoZWNrIGlmIHRoZSBjYWxsIGlzIE9uZVdheSwgQXN5bmMgb3IgU3luYwotICAgICAgICBpZiAob3BlcmF0aW9uRGVzYy5pc09uZVdheSgpKSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIk9uZVdheSBDYWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjb250cm9sbGVyLmludm9rZU9uZVdheShyZXF1ZXN0SUMpOwotCi0gICAgICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgd2UgbmVlZCB0byBtYWludGFpbiBzZXNzaW9uIHN0YXRlCi0gICAgICAgICAgICBjaGVja01haW50YWluU2Vzc2lvblN0YXRlKHJlcXVlc3QsIHJlcXVlc3RJQyk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobWV0aG9kLmdldFJldHVyblR5cGUoKSA9PSBGdXR1cmUuY2xhc3MpIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQXN5bmMgQ2FsbGJhY2siKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy9HZXQgQXN5bmNIYW5kbGVyIGZyb20gT2JqZWN0cyBhbmQgc2VudCB0aGF0IHRvIEludm9rZUFzeW5jCi0gICAgICAgICAgICBBc3luY0hhbmRsZXIgYXN5bmNIYW5kbGVyID0gbnVsbDsKLSAgICAgICAgICAgIGZvciAoT2JqZWN0IG9iaiA6IGFyZ3MpIHsKLSAgICAgICAgICAgICAgICBpZiAob2JqICE9IG51bGwgJiYgQXN5bmNIYW5kbGVyLmNsYXNzLmlzQXNzaWduYWJsZUZyb20ob2JqLmdldENsYXNzKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFzeW5jSGFuZGxlciA9IChBc3luY0hhbmRsZXIpb2JqOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIERvbid0IGFsbG93IHRoZSBpbnZvY2F0aW9uIHRvIGNvbnRpbnVlIGlmIHRoZSBpbnZvY2F0aW9uIHJlcXVpcmVzIGEgY2FsbGJhY2sKLSAgICAgICAgICAgIC8vIG9iamVjdCwgYnV0IG5vbmUgd2FzIHN1cHBsaWVkLgotICAgICAgICAgICAgaWYgKGFzeW5jSGFuZGxlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeQotICAgICAgICAgICAgICAgICAgICAgICAgLm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoInByb3h5TnVsbENhbGxiYWNrIikpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQXN5bmNSZXNwb25zZSBsaXN0ZW5lciA9IGNyZWF0ZVByb3h5TGlzdGVuZXIoYXJncywgb3BlcmF0aW9uRGVzYyk7Ci0gICAgICAgICAgICByZXF1ZXN0SUMuc2V0QXN5bmNSZXNwb25zZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQotICAgICAgICAgICAgaWYgKChzZXJ2aWNlRGVsZWdhdGUuZ2V0RXhlY3V0b3IoKSAhPSBudWxsKSAmJgotICAgICAgICAgICAgICAgICAgICAoc2VydmljZURlbGVnYXRlLmdldEV4ZWN1dG9yKCkgaW5zdGFuY2VvZiBFeGVjdXRvclNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgRXhlY3V0b3JTZXJ2aWNlIGVzID0gKEV4ZWN1dG9yU2VydmljZSlzZXJ2aWNlRGVsZWdhdGUuZ2V0RXhlY3V0b3IoKTsKLSAgICAgICAgICAgICAgICBpZiAoZXMuaXNTaHV0ZG93bigpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBleGVjdXRvciBzZXJ2aWNlIGlzIHNodXRkb3duIGFuZCB3b24ndCBhY2NlcHQgbmV3IHRhc2tzCi0gICAgICAgICAgICAgICAgICAgIC8vIHNvIHJldHVybiBhbiBlcnJvciBiYWNrIHRvIHRoZSBjbGllbnQKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJFeGVjdXRvclNodXRkb3duIikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmVxdWVzdElDLnNldEV4ZWN1dG9yKHNlcnZpY2VEZWxlZ2F0ZS5nZXRFeGVjdXRvcigpKTsKLQotICAgICAgICAgICAgRnV0dXJlPD8+IGZ1dHVyZSA9IGNvbnRyb2xsZXIuaW52b2tlQXN5bmMocmVxdWVzdElDLCBhc3luY0hhbmRsZXIpOwotCi0gICAgICAgICAgICAvL0NoZWNrIHRvIHNlZSBpZiB3ZSBuZWVkIHRvIG1haW50YWluIHNlc3Npb24gc3RhdGUKLSAgICAgICAgICAgIGNoZWNrTWFpbnRhaW5TZXNzaW9uU3RhdGUocmVxdWVzdCwgcmVxdWVzdElDKTsKLQotICAgICAgICAgICAgcmV0dXJuIGZ1dHVyZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtZXRob2QuZ2V0UmV0dXJuVHlwZSgpID09IFJlc3BvbnNlLmNsYXNzKSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkFzeW5jIFBvbGxpbmciKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFzeW5jUmVzcG9uc2UgbGlzdGVuZXIgPSBjcmVhdGVQcm94eUxpc3RlbmVyKGFyZ3MsIG9wZXJhdGlvbkRlc2MpOwotICAgICAgICAgICAgcmVxdWVzdElDLnNldEFzeW5jUmVzcG9uc2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0gICAgICAgICAgICByZXF1ZXN0SUMuc2V0RXhlY3V0b3Ioc2VydmljZURlbGVnYXRlLmdldEV4ZWN1dG9yKCkpOwotCi0gICAgICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IGNvbnRyb2xsZXIuaW52b2tlQXN5bmMocmVxdWVzdElDKTsKLQotICAgICAgICAgICAgLy9DaGVjayB0byBzZWUgaWYgd2UgbmVlZCB0byBtYWludGFpbiBzZXNzaW9uIHN0YXRlCi0gICAgICAgICAgICBjaGVja01haW50YWluU2Vzc2lvblN0YXRlKHJlcXVlc3QsIHJlcXVlc3RJQyk7Ci0KLSAgICAgICAgICAgIHJldHVybiByZXNwb25zZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghb3BlcmF0aW9uRGVzYy5pc09uZVdheSgpKSB7Ci0gICAgICAgICAgICBJbnZvY2F0aW9uQ29udGV4dCByZXNwb25zZUlDID0gY29udHJvbGxlci5pbnZva2UocmVxdWVzdElDKTsKLQotICAgICAgICAgICAgLy9DaGVjayB0byBzZWUgaWYgd2UgbmVlZCB0byBtYWludGFpbiBzZXNzaW9uIHN0YXRlCi0gICAgICAgICAgICBjaGVja01haW50YWluU2Vzc2lvblN0YXRlKHJlcXVlc3QsIHJlcXVlc3RJQyk7Ci0KLSAgICAgICAgICAgIE1lc3NhZ2VDb250ZXh0IHJlc3BvbnNlQ29udGV4dCA9IHJlc3BvbnNlSUMuZ2V0UmVzcG9uc2VNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBNaWdyYXRlIHRoZSBwcm9wZXJ0aWVzIGZyb20gdGhlIHJlc3BvbnNlIE1lc3NhZ2VDb250ZXh0IGJhY2sKLSAgICAgICAgICAgIC8vIHRvIHRoZSBjbGllbnQgcmVzcG9uc2UgY29udGV4dCBiYWcuCi0gICAgICAgICAgICBBcHBsaWNhdGlvbkNvbnRleHRNaWdyYXRvclV0aWwucGVyZm9ybU1pZ3JhdGlvbkZyb21NZXNzYWdlQ29udGV4dCgKLSAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLkFQUExJQ0FUSU9OX0NPTlRFWFRfTUlHUkFUT1JfTElTVF9JRCwgCi0gICAgICAgICAgICAgICAgICAgIGdldFJlc3BvbnNlQ29udGV4dCgpLCByZXNwb25zZUNvbnRleHQpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBPYmplY3QgcmVzcG9uc2VPYmogPSBjcmVhdGVSZXNwb25zZShtZXRob2QsIGFyZ3MsIHJlc3BvbnNlQ29udGV4dCwgb3BlcmF0aW9uRGVzYyk7Ci0gICAgICAgICAgICByZXR1cm4gcmVzcG9uc2VPYmo7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBBc3luY1Jlc3BvbnNlIGNyZWF0ZVByb3h5TGlzdGVuZXIoT2JqZWN0W10gYXJncywgT3BlcmF0aW9uRGVzY3JpcHRpb24gb3BlcmF0aW9uRGVzYykgewotICAgICAgICBQcm94eUFzeW5jTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgUHJveHlBc3luY0xpc3RlbmVyKG9wZXJhdGlvbkRlc2MpOwotICAgICAgICBsaXN0ZW5lci5zZXRIYW5kbGVyKHRoaXMpOwotICAgICAgICBsaXN0ZW5lci5zZXRJbnB1dEFyZ3MoYXJncyk7Ci0gICAgICAgIHJldHVybiBsaXN0ZW5lcjsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0FzeW5jKCkgewotICAgICAgICBTdHJpbmcgbWV0aG9kTmFtZSA9IG1ldGhvZC5nZXROYW1lKCk7Ci0gICAgICAgIENsYXNzIHJldHVyblR5cGUgPSBtZXRob2QuZ2V0UmV0dXJuVHlwZSgpOwotICAgICAgICByZXR1cm4gbWV0aG9kTmFtZS5lbmRzV2l0aCgiQXN5bmMiKSAmJiAocmV0dXJuVHlwZS5pc0Fzc2lnbmFibGVGcm9tKFJlc3BvbnNlLmNsYXNzKSB8fAotICAgICAgICAgICAgICAgIHJldHVyblR5cGUuaXNBc3NpZ25hYmxlRnJvbShGdXR1cmUuY2xhc3MpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgcmVxdWVzdCBNZXNzYWdlQ29udGV4dCBmb3IgdGhlIG1ldGhvZCBjYWxsLiBUaGlzIHJlcXVlc3QgY29udGV4dCB3aWxsIGJlIHVzZWQgYnkKLSAgICAgKiBJbnZvY2F0aW9uQ29udHJvbGxlciB0byByb3V0ZSB0aGUgbWV0aG9kIGNhbGwgdG8gYXhpcyBlbmdpbmUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWV0aG9kIC0gVGhlIG1ldGhvZCBpbnZva2VkIG9uIHRoZSBwcm94eSBvYmplY3QuCi0gICAgICogQHBhcmFtIGFyZ3MgICAtIFRoZSBwYXJhbWV0ZXIgbGlzdAotICAgICAqIEByZXR1cm4gQSBNZXNzYWdlQ29udGV4dCB0aGF0IGNhbiBiZSB1c2VkIGZvciB0aGUgaW52b2NhdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCBNZXNzYWdlQ29udGV4dCBjcmVhdGVSZXF1ZXN0KE1ldGhvZCBtZXRob2QsIE9iamVjdFtdIGFyZ3MpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ3JlYXRpbmcgYSBuZXcgTWVzc2FnZSB1c2luZyB0aGUgcmVxdWVzdCBwYXJhbWV0ZXJzLiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgT3BlcmF0aW9uRGVzY3JpcHRpb24gb3BlcmF0aW9uRGVzYyA9Ci0gICAgICAgICAgICAgICAgZW5kcG9pbnREZXNjLmdldEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24oKS5nZXRPcGVyYXRpb24obWV0aG9kKTsKLQotICAgICAgICBNZXNzYWdlIG1lc3NhZ2UgPSBNZXRob2RNYXJzaGFsbGVyRmFjdG9yeS5nZXRNYXJzaGFsbGVyKG9wZXJhdGlvbkRlc2MsIHRydWUsIG51bGwpCi0gICAgICAgICAgICAgICAgLm1hcnNoYWxSZXF1ZXN0KGFyZ3MsIG9wZXJhdGlvbkRlc2MpOwotCi0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJSZXF1ZXN0IE1lc3NhZ2UgY3JlYXRlZCBzdWNjZXNzZnVsbHkuIik7Ci0gICAgICAgIH0KLQotICAgICAgICBNZXNzYWdlQ29udGV4dCByZXF1ZXN0ID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIHJlcXVlc3Quc2V0TWVzc2FnZShtZXNzYWdlKTsKLQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiUmVxdWVzdCBNZXNzYWdlQ29udGV4dCBjcmVhdGVkIHN1Y2Nlc3NmdWxseS4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXF1ZXN0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSByZXNwb25zZSBNZXNzYWdlQ29udGV4dCBmb3IgdGhlIG1ldGhvZCBjYWxsLiBUaGlzIHJlc3BvbnNlIGNvbnRleHQgd2lsbCBiZSB1c2VkIHRvCi0gICAgICogY3JlYXRlIHJlc3BvbnNlIHJlc3VsdCB0byB0aGUgY2xpZW50IGNhbGwuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWV0aG9kICAgICAgICAgIC0gVGhlIG1ldGhvZCBpbnZva2VkIG9uIHRoZSBwcm94eSBvYmplY3QuCi0gICAgICogQHBhcmFtIGFyZ3MgICAgICAgICAgICAtIFRoZSBwYXJhbWV0ZXIgbGlzdC4KLSAgICAgKiBAcGFyYW0gcmVzcG9uc2VDb250ZXh0IC0gVGhlIE1lc3NhZ2VDb250ZXh0IHRvIGJlIHVzZWQgZm9yIHRoZSByZXNwb25zZS4KLSAgICAgKiBAcGFyYW0gb3BlcmF0aW9uRGVzYyAgIC0gVGhlIE9wZXJhdGlvbkRlc2NyaXB0aW9uIHRoYXQgZm9yIHRoZSBpbnZva2VkIG1ldGhvZC4KLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVSZXNwb25zZShNZXRob2QgbWV0aG9kLCBPYmplY3RbXSBhcmdzLCBNZXNzYWdlQ29udGV4dCByZXNwb25zZUNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYXRpb25EZXNjcmlwdGlvbiBvcGVyYXRpb25EZXNjKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgTWVzc2FnZSByZXNwb25zZU1zZyA9IHJlc3BvbnNlQ29udGV4dC5nZXRNZXNzYWdlKCk7Ci0gICAgICAgIHRyeSB7Ci0KLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiUHJvY2Vzc2luZyB0aGUgcmVzcG9uc2UgTWVzc2FnZSB0byBjcmVhdGUgdGhlIHJldHVybiB2YWx1ZShzKS4iKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gRmluZCBvdXQgaWYgdGhlcmUgd2FzIGEgZmF1bHQgb24gdGhlIHJlc3BvbnNlIGFuZCBjcmVhdGUgdGhlIGFwcHJvcHJpYXRlIAotICAgICAgICAgICAgLy8gZXhjZXB0aW9uIHR5cGUuCi0gICAgICAgICAgICBpZiAoaGFzRmF1bHRSZXNwb25zZShyZXNwb25zZUNvbnRleHQpKSB7Ci0gICAgICAgICAgICAgICAgVGhyb3dhYmxlIHQgPSBnZXRGYXVsdFJlc3BvbnNlKHJlc3BvbnNlQ29udGV4dCwgb3BlcmF0aW9uRGVzYyk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENsYXNzTG9hZGVyIGNsID0gKENsYXNzTG9hZGVyKSByZXNwb25zZUNvbnRleHQuZ2V0UHJvcGVydHkoQ29uc3RhbnRzLkNBQ0hFX0NMQVNTTE9BREVSKTsKLSAgICAgICAgICAgIE9iamVjdCBvYmplY3QgPQotICAgICAgICAgICAgICAgICAgICBNZXRob2RNYXJzaGFsbGVyRmFjdG9yeS5nZXRNYXJzaGFsbGVyKG9wZXJhdGlvbkRlc2MsIHRydWUsIGNsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmRlbWFyc2hhbFJlc3BvbnNlKHJlc3BvbnNlTXNnLCBhcmdzLCBvcGVyYXRpb25EZXNjKTsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiVGhlIHJlc3BvbnNlIHdhcyBwcm9jZXNzZWQgYW5kIHRoZSByZXR1cm4gdmFsdWUgY3JlYXRlZCBzdWNjZXNzZnVsbHkuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gb2JqZWN0OwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgcmVzcG9uc2VNc2cuY2xvc2UoKTsKLSAgICAgICAgICAgIC8vIEZyZWUgaW5jb21pbmcgc3RyZWFtCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHJlc3BvbnNlQ29udGV4dC5mcmVlSW5wdXRTdHJlYW0oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkgewotICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24odCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIFRocm93YWJsZSBnZXRGYXVsdFJlc3BvbnNlKE1lc3NhZ2VDb250ZXh0IG1zZ0N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhdGlvbkRlc2NyaXB0aW9uIG9wRGVzYykgewotICAgICAgICBNZXNzYWdlIG1zZyA9IG1zZ0N0eC5nZXRNZXNzYWdlKCk7Ci0gICAgICAgIC8vT3BlcmF0aW9uIERlc2NyaXB0aW9uIGZvciBBc3luYyBtZXRob2QgZG9lcyBub3Qgc3RvcmUgdGhlIGZhdWx0IGRlc2NyaXB0aW9uIGFzIEFzeWMgb3BlcmF0aW9uIAotICAgICAgICAvL3dpbGwgbmV2ZXIgaGF2ZSB0aHJvd3MgY2xhdXNlIGluIHRoZSBtZXRob2Qgc2lnbmF0dXJlLgotICAgICAgICAvL3dlIHdpbGwgZmV0Y2ggdGhlIE9wZXJhdGlvbkRlc2NyaXB0aW9uIG9mIHRoZSBzeW5jIG1ldGhvZCBhbmQgdGhpcyBzaG91bGQgZ2l2ZSB1cyB0aGUKLSAgICAgICAgLy9jb3JyZWN0IGZhdWx0IGRlc2NyaXB0aW9uIHNvIHdlIGNhbiB0aHJvdyB0aGUgcmlnaHQgdXNlciBkZWZpbmVkIGV4Y2VwdGlvbi4KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKG9wRGVzYy5pc0pBWFdTQXN5bmNDbGllbnRNZXRob2QoKSkgewotICAgICAgICAgICAgICAgIG9wRGVzYyA9IG9wRGVzYy5nZXRTeW5jT3BlcmF0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobXNnICE9IG51bGwgJiYgbXNnLmlzRmF1bHQoKSkgewotICAgICAgICAgICAgICAgIENsYXNzTG9hZGVyIGNsID0gKENsYXNzTG9hZGVyKSBtc2dDdHguZ2V0UHJvcGVydHkoQ29uc3RhbnRzLkNBQ0hFX0NMQVNTTE9BREVSKTsKLSAgICAgICAgICAgICAgICBPYmplY3Qgb2JqZWN0ID0gTWV0aG9kTWFyc2hhbGxlckZhY3RvcnkuZ2V0TWFyc2hhbGxlcihvcERlc2MsIHRydWUsIGNsKQotICAgICAgICAgICAgICAgIC5kZW1hcnNoYWxGYXVsdFJlc3BvbnNlKG1zZywgb3BEZXNjKTsKLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkgJiYgb2JqZWN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJBIGZhdWx0IHdhcyBmb3VuZCBhbmQgcHJvY2Vzc2VkLiIpOwotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlRocm93aW5nIGEgZmF1bHQgb2YgdHlwZTogIiArIG9iamVjdC5nZXRDbGFzcygpLmdldE5hbWUoKSArCi0gICAgICAgICAgICAgICAgICAgICIgYmFjayB0byB0aGUgY2xlbnQuIik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIChUaHJvd2FibGUpb2JqZWN0OwotICAgICAgICAgICAgfSBlbHNlIGlmIChtc2dDdHguZ2V0TG9jYWxFeGNlcHRpb24oKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gdXNlIHRoZSBmYWN0b3J5LCBpdCdsbCB0aHJvdyB0aGUgcmlnaHQgdGhpbmc6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24obXNnQ3R4LmdldExvY2FsRXhjZXB0aW9uKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtc2dDdHguZnJlZUlucHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKHQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGhhc0ZhdWx0UmVzcG9uc2UoTWVzc2FnZUNvbnRleHQgbWMpIHsKLSAgICAgICAgaWYgKG1jLmdldE1lc3NhZ2UoKSAhPSBudWxsICYmIG1jLmdldE1lc3NhZ2UoKS5pc0ZhdWx0KCkpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgZWxzZSBpZiAobWMuZ2V0TG9jYWxFeGNlcHRpb24oKSAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNCaW5kaW5nUHJvdmlkZXJJbnZva2VkKE1ldGhvZCBtZXRob2QpIHsKLSAgICAgICAgQ2xhc3MgbWV0aG9kc0NsYXNzID0gbWV0aG9kLmdldERlY2xhcmluZ0NsYXNzKCk7Ci0gICAgICAgIHJldHVybiAoc2VpQ2xhenogPT0gbWV0aG9kc0NsYXNzKSA/IGZhbHNlIDogdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNWYWxpZE1ldGhvZENhbGwoTWV0aG9kIG1ldGhvZCkgewotICAgICAgICBDbGFzcyBjbGF6eiA9IG1ldGhvZC5nZXREZWNsYXJpbmdDbGFzcygpOwotICAgICAgICBpZiAoY2xhenouaXNBc3NpZ25hYmxlRnJvbShzZWlDbGF6eikgfHwKLSAgICAgICAgICAgICAgICBjbGF6ei5pc0Fzc2lnbmFibGVGcm9tKG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc3BpLkJpbmRpbmdQcm92aWRlci5jbGFzcykgfHwKLSAgICAgICAgICAgICAgICBjbGF6ei5pc0Fzc2lnbmFibGVGcm9tKGphdmF4LnhtbC53cy5CaW5kaW5nUHJvdmlkZXIuY2xhc3MpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzUHVibGljKE1ldGhvZCBtZXRob2QpIHsKLSAgICAgICAgcmV0dXJuIE1vZGlmaWVyLmlzUHVibGljKG1ldGhvZC5nZXRNb2RpZmllcnMoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzTWV0aG9kRXhjbHVkZWQoT3BlcmF0aW9uRGVzY3JpcHRpb24gb3BlcmF0aW9uRGVzYykgewotICAgICAgICByZXR1cm4gb3BlcmF0aW9uRGVzYy5pc0V4Y2x1ZGVkKCk7Ci0gICAgfQotCi0gICAgcHVibGljIENsYXNzIGdldFNlaUNsYXp6KCkgewotICAgICAgICByZXR1cm4gc2VpQ2xheno7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2VpQ2xhenooQ2xhc3Mgc2VpQ2xhenopIHsKLSAgICAgICAgdGhpcy5zZWlDbGF6eiA9IHNlaUNsYXp6OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NsaWVudC9wcm94eS9Qcm94eUFzeW5jTGlzdGVuZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NsaWVudC9wcm94eS9Qcm94eUFzeW5jTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNhODMxNS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jbGllbnQvcHJveHkvUHJveHlBc3luY0xpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY2xpZW50LnByb3h5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5FeGNlcHRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY2xpZW50LmFzeW5jLkFzeW5jUmVzcG9uc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uT3BlcmF0aW9uRGVzY3JpcHRpb247Ci0KLS8qKgotICogUHJveHlBc3luY0xpc3RlbmVyIHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgcmVzcG9uc2Ugb2JqZWN0IHdoZW4gY2xpZW50IGRvZXMgcmVzcG9uc2UuZ2V0KCk7IFRoZQotICogQ2xhc3Mgd2lsbCByZXR1cm4gdGhlIGRhdGEgdHlwZSBhc3NvY2lhdGVkIHdpdGggUmVzcG9uc2U8VD4gR2VuZXJpYyBDbGFzcy4gRXhhbXBsZQotICogUmVzcG9uc2U8RmxvYXQ+IHdpbGwgcmV0dXJuIGEgRmxvYXQgb2JqZWN0IHRvIGNsaWVudCBvbiBSZXNwb25zZS5nZXQoKSBjYWxsLgotICovCi1wdWJsaWMgY2xhc3MgUHJveHlBc3luY0xpc3RlbmVyIGV4dGVuZHMgQXN5bmNSZXNwb25zZSB7Ci0KLSAgICBKQVhXU1Byb3h5SGFuZGxlciBoYW5kbGVyID0gbnVsbDsKLSAgICBPYmplY3RbXSBpbnB1dEFyZ3MgPSBudWxsOwotICAgIE9wZXJhdGlvbkRlc2NyaXB0aW9uIG9wZXJhdGlvbkRlc2MgPSBudWxsOwotCi0gICAgcHVibGljIFByb3h5QXN5bmNMaXN0ZW5lcihPcGVyYXRpb25EZXNjcmlwdGlvbiBvZCkgewotICAgICAgICBzdXBlcihvZC5nZXRFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uKCkuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbigpKTsKLSAgICAgICAgb3BlcmF0aW9uRGVzYyA9IG9kOwotICAgIH0KLQotICAgIHB1YmxpYyBKQVhXU1Byb3h5SGFuZGxlciBnZXRIYW5kbGVyKCkgewotICAgICAgICByZXR1cm4gaGFuZGxlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRIYW5kbGVyKEpBWFdTUHJveHlIYW5kbGVyIGhhbmRsZXIpIHsKLSAgICAgICAgdGhpcy5oYW5kbGVyID0gaGFuZGxlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRJbnB1dEFyZ3MoT2JqZWN0W10gaW5wdXRBcmdzKSB7Ci0gICAgICAgIHRoaXMuaW5wdXRBcmdzID0gaW5wdXRBcmdzOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBPYmplY3QgZ2V0UmVzcG9uc2VWYWx1ZU9iamVjdChNZXNzYWdlQ29udGV4dCBtYykgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy9EZWxlZ2F0ZSB0aGUgcmVxdWVzdCB0byBjcmVhdGUgcmVzcG9zZSB0byBwcm94eUhhbmRsZXIgCi0gICAgICAgICAgICAvL3NpbmNlIGl0IGhhcyBhbGwgdGhlIGxvZ2ljIHdyaXR0ZW4gdG8gY3JlYXRlIHJlc3BvbnNlIGZvciBTeW5jIAotICAgICAgICAgICAgLy9hbmQgb25lV2F5LgotICAgICAgICAgICAgcmV0dXJuIGhhbmRsZXIuY3JlYXRlUmVzcG9uc2UobnVsbCwgaW5wdXRBcmdzLCBtYywgb3BlcmF0aW9uRGVzYyk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFRocm93YWJsZSBnZXRGYXVsdFJlc3BvbnNlKE1lc3NhZ2VDb250ZXh0IG1jKSB7Ci0gICAgICAgIHJldHVybiBKQVhXU1Byb3h5SGFuZGxlci5nZXRGYXVsdFJlc3BvbnNlKG1jLCBvcGVyYXRpb25EZXNjKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jb250ZXh0L1dlYlNlcnZpY2VDb250ZXh0SW1wbC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY29udGV4dC9XZWJTZXJ2aWNlQ29udGV4dEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTcyNzMwMy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jb250ZXh0L1dlYlNlcnZpY2VDb250ZXh0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5FeGNlcHRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuYWRkcmVzc2luZy51dGlsLkVuZHBvaW50UmVmZXJlbmNlVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5pMThuLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLndzLkVuZHBvaW50UmVmZXJlbmNlOwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlQ29udGV4dDsKLWltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBqYXZheC54bWwud3Mud3NhZGRyZXNzaW5nLlczQ0VuZHBvaW50UmVmZXJlbmNlOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpbmNpcGFsOwotCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZUNvbnRleHRJbXBsIGltcGxlbWVudHMgV2ViU2VydmljZUNvbnRleHQgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFdlYlNlcnZpY2VDb250ZXh0LmNsYXNzKTsKLSAgICAKLSAgICBwcml2YXRlIE1lc3NhZ2VDb250ZXh0IHNvYXBNZXNzYWdlQ29udGV4dDsKLQotICAgIHB1YmxpYyBXZWJTZXJ2aWNlQ29udGV4dEltcGwoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgamF2YXgueG1sLndzLldlYlNlcnZpY2VDb250ZXh0I2dldE1lc3NhZ2VDb250ZXh0KCkKLSAgICAgKi8KLSAgICBwdWJsaWMgTWVzc2FnZUNvbnRleHQgZ2V0TWVzc2FnZUNvbnRleHQoKSB7Ci0gICAgICAgIHJldHVybiBzb2FwTWVzc2FnZUNvbnRleHQ7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgamF2YXgueG1sLndzLldlYlNlcnZpY2VDb250ZXh0I2dldFVzZXJQcmluY2lwYWwoKQotICAgICAqLwotICAgIHB1YmxpYyBQcmluY2lwYWwgZ2V0VXNlclByaW5jaXBhbCgpIHsKLSAgICAgICAgaWYgKHNvYXBNZXNzYWdlQ29udGV4dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCA9IChIdHRwU2VydmxldFJlcXVlc3QpIHNvYXBNZXNzYWdlQ29udGV4dC5nZXQoTWVzc2FnZUNvbnRleHQuU0VSVkxFVF9SRVFVRVNUKTsKLSAgICAgICAgICAgIGlmIChyZXF1ZXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJBY2Nlc3MgdG8gdGhlIHVzZXIgUHJpbmNpcGFsIHdhcyByZXF1ZXN0ZWQuIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiByZXF1ZXN0LmdldFVzZXJQcmluY2lwYWwoKTsgICAgCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJObyBIdHRwU2VydmxldFJlcXVlc3Qgb2JqZWN0IHdhcyBmb3VuZCwgc28gbm8gUHJpbmNpcGFsIGNhbiBiZSBmb3VuZC4iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlQ29udGV4dCNpc1VzZXJJblJvbGUoamF2YS5sYW5nLlN0cmluZykKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1VzZXJJblJvbGUoU3RyaW5nIHVzZXIpIHsKLSAgICAgICAgaWYgKHNvYXBNZXNzYWdlQ29udGV4dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCA9IChIdHRwU2VydmxldFJlcXVlc3QpIHNvYXBNZXNzYWdlQ29udGV4dC5nZXQoTWVzc2FnZUNvbnRleHQuU0VSVkxFVF9SRVFVRVNUKTsKLSAgICAgICAgICAgIGlmIChyZXF1ZXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJDaGVja2luZyB0byBzZWUgaWYgdGhlIHVzZXIgaW4gdGhlIHJvbGUuIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiByZXF1ZXN0LmlzVXNlckluUm9sZSh1c2VyKTsgICAgCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJObyBIdHRwU2VydmxldFJlcXVlc3Qgb2JqZWN0IHdhcyBmb3VuZCwgc28gbm8gcm9sZSBjaGVjayBjYW4gYmUgcGVyZm9ybWVkLiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFNvYXBNZXNzYWdlQ29udGV4dChNZXNzYWdlQ29udGV4dCBzb2FwTWVzc2FnZUNvbnRleHQpIHsKLSAgICAgICAgdGhpcy5zb2FwTWVzc2FnZUNvbnRleHQgPSBzb2FwTWVzc2FnZUNvbnRleHQ7Ci0gICAgfQotCi0gICAgcHVibGljIDxUIGV4dGVuZHMgRW5kcG9pbnRSZWZlcmVuY2U+IFQgZ2V0RW5kcG9pbnRSZWZlcmVuY2UoQ2xhc3M8VD4gY2xhenosIEVsZW1lbnQuLi4gcmVmZXJlbmNlUGFyYW1ldGVycykgewotICAgICAgICBFbmRwb2ludFJlZmVyZW5jZSBqYXh3c0VQUiA9IG51bGw7Ci0gICAgICAgIFN0cmluZyBhZGRyZXNzaW5nTmFtZXNwYWNlID0gRW5kcG9pbnRSZWZlcmVuY2VVdGlscy5nZXRBZGRyZXNzaW5nTmFtZXNwYWNlKGNsYXp6KTsKLSAgICAgICAgCi0gICAgICAgIGlmIChzb2FwTWVzc2FnZUNvbnRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgUU5hbWUgc2VydmljZSA9IChRTmFtZSkgc29hcE1lc3NhZ2VDb250ZXh0LmdldChNZXNzYWdlQ29udGV4dC5XU0RMX1NFUlZJQ0UpOwotICAgICAgICAgICAgUU5hbWUgZW5kcG9pbnQgPSAoUU5hbWUpIHNvYXBNZXNzYWdlQ29udGV4dC5nZXQoTWVzc2FnZUNvbnRleHQuV1NETF9QT1JUKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlIGF4aXMyRVBSID0KLSAgICAgICAgICAgICAgICBFbmRwb2ludFJlZmVyZW5jZVV0aWxzLmNyZWF0ZUF4aXMyRW5kcG9pbnRSZWZlcmVuY2UobnVsbCwgc2VydmljZSwgZW5kcG9pbnQsIG51bGwsIGFkZHJlc3NpbmdOYW1lc3BhY2UpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIEVuZHBvaW50UmVmZXJlbmNlVXRpbHMuYWRkUmVmZXJlbmNlUGFyYW1ldGVycyhheGlzMkVQUiwgcmVmZXJlbmNlUGFyYW1ldGVycyk7Ci0gICAgICAgICAgICAgICAgamF4d3NFUFIgPSBFbmRwb2ludFJlZmVyZW5jZVV0aWxzLmNvbnZlcnRGcm9tQXhpczIoYXhpczJFUFIsIGFkZHJlc3NpbmdOYW1lc3BhY2UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZ2V0TWVzc2FnZSgiZW5kcG9pbnRSZWZDb25zdHJ1Y3Rpb25GYWlsdXJlMyIsIGUudG9TdHJpbmcoKSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRNZXNzYWdlKCJ3ZWJTZXJ2aWNlQ29udGV4dEVycjEiKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBjbGF6ei5jYXN0KGpheHdzRVBSKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRW5kcG9pbnRSZWZlcmVuY2UgZ2V0RW5kcG9pbnRSZWZlcmVuY2UoRWxlbWVudC4uLiByZWZlcmVuY2VQYXJhbWV0ZXJzKSB7Ci0gICAgICAgIHJldHVybiBnZXRFbmRwb2ludFJlZmVyZW5jZShXM0NFbmRwb2ludFJlZmVyZW5jZS5jbGFzcywgcmVmZXJlbmNlUGFyYW1ldGVycyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY29udGV4dC9mYWN0b3J5L01lc3NhZ2VDb250ZXh0RmFjdG9yeS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY29udGV4dC9mYWN0b3J5L01lc3NhZ2VDb250ZXh0RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmM0YmIwLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NvbnRleHQvZmFjdG9yeS9NZXNzYWdlQ29udGV4dEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb250ZXh0LmZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvbnRleHQuV2ViU2VydmljZUNvbnRleHRJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29udGV4dC51dGlscy5Db250ZXh0VXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaGFuZGxlci5Mb2dpY2FsTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5oYW5kbGVyLlNvYXBNZXNzYWdlQ29udGV4dDsKLQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlQ29udGV4dDsKLQotcHVibGljIGNsYXNzIE1lc3NhZ2VDb250ZXh0RmFjdG9yeSB7Ci0KLSAgICBwdWJsaWMgTWVzc2FnZUNvbnRleHRGYWN0b3J5KCkgewotICAgICAgICBzdXBlcigpOwotCi0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBXZWJTZXJ2aWNlQ29udGV4dCBjcmVhdGVXZWJTZXJ2aWNlQ29udGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBXZWJTZXJ2aWNlQ29udGV4dEltcGwoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgU09BUE1lc3NhZ2VDb250ZXh0IGJhc2VkIG9uIHRoZSBpbnB1dCBjb3JlIE1FUENvbnRleHQuICAKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWVwQ3R4Ci0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU29hcE1lc3NhZ2VDb250ZXh0IGNyZWF0ZVNvYXBNZXNzYWdlQ29udGV4dCgKLSAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS5NZXNzYWdlQ29udGV4dCBqYXh3c01lc3NhZ2VDb250ZXh0KSB7Ci0gICAgICAgIFNvYXBNZXNzYWdlQ29udGV4dCBzb2FwQ3R4ID0gbmV3IFNvYXBNZXNzYWdlQ29udGV4dChqYXh3c01lc3NhZ2VDb250ZXh0KTsKLSAgICAgICAgQ29udGV4dFV0aWxzLmFkZFByb3BlcnRpZXMoc29hcEN0eCwgamF4d3NNZXNzYWdlQ29udGV4dCk7Ci0gICAgICAgIHJldHVybiBzb2FwQ3R4OwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgTG9naWNhbE1lc3NhZ2VDb250ZXh0IGJhc2VkIG9uIHRoZSBpbnB1dCBjb3JlIE1FUENvbnRleHQuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1lcEN0eAotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIExvZ2ljYWxNZXNzYWdlQ29udGV4dCBjcmVhdGVMb2dpY2FsTWVzc2FnZUNvbnRleHQoTWVzc2FnZUNvbnRleHQgbWMpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBMb2dpY2FsTWVzc2FnZUNvbnRleHQobWMpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY29udGV4dC91dGlscy9Db250ZXh0VXRpbHMuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NvbnRleHQvdXRpbHMvQ29udGV4dFV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0NDE5MDguLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY29udGV4dC91dGlscy9Db250ZXh0VXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29udGV4dC51dGlsczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQSGVhZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5TZXJ2aWNlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmFkZHJlc3NpbmcudXRpbC5SZWZlcmVuY2VQYXJhbWV0ZXJMaXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkVuZHBvaW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5FbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uT3BlcmF0aW9uRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5TZXJ2aWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5TZXJ2aWNlRGVzY3JpcHRpb25XU0RMOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaTE4bi5NZXNzYWdlczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNlcnZlci5lbmRwb2ludC5saWZlY3ljbGUuaW1wbC5FbmRwb2ludExpZmVjeWNsZU1hbmFnZXJJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MudXRpbGl0eS5KYXZhVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5IVFRQQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OwotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7Ci1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUNvbnRleHQ7Ci1pbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuTWVzc2FnZUNvbnRleHQuU2NvcGU7Ci1pbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuc29hcC5TT0FQTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotCi1wdWJsaWMgY2xhc3MgQ29udGV4dFV0aWxzIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coQ29udGV4dFV0aWxzLmNsYXNzKTsKLQotICAgIC8qKgotICAgICAqIEFkZHMgdGhlIGFwcHJvcHJpYXRlIHByb3BlcnRpZXMgdG8gdGhlIE1lc3NhZ2VDb250ZXh0IHRoYXQgdGhlIHVzZXIgd2lsbCBzZWUKLSAgICAgKgotICAgICAqIEBwYXJhbSBzb2FwTWVzc2FnZUNvbnRleHQKLSAgICAgKiBAcGFyYW0gamF4d3NNZXNzYWdlQ29udGV4dAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRQcm9wZXJ0aWVzKFNPQVBNZXNzYWdlQ29udGV4dCBzb2FwTWVzc2FnZUNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUNvbnRleHQgamF4d3NNZXNzYWdlQ29udGV4dCkgewotCi0gICAgICAgIC8vIENvcHkgQXhpczIgTWVzc2FnZUNvbnRleHQgcHJvcGVydGllcy4gIEl0J3MgcG9zc2libGUgdGhhdCBzb21lIHNldCBvZiBBeGlzMiBoYW5kbGVycwotICAgICAgICAvLyBoYXZlIHJ1biBhbmQgcGxhY2VkIHNvbWUgcHJvcGVydGllcyBpbiB0aGUgY29udGV4dCB0aGF0IG5lZWQgdG8gYmUgdmlzaWJsZS4KLSAgICAgICAgc29hcE1lc3NhZ2VDb250ZXh0LnB1dEFsbChqYXh3c01lc3NhZ2VDb250ZXh0LmdldFByb3BlcnRpZXMoKSk7Ci0KLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IGpheHdzTWVzc2FnZUNvbnRleHQuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbigpOwotICAgICAgICBpZiAoZGVzY3JpcHRpb24gIT1udWxsKSB7Ci0gICAgICAgICAgICAvLyBTZXQgdGhlIFdTREwgcHJvcGVydGllcwotICAgICAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNkID0KLSAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24uZ2V0U2VydmljZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgICAgICBpZiAoc2QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFN0cmluZyB3c2RsTG9jYXRpb24gPSAoKFNlcnZpY2VEZXNjcmlwdGlvbldTREwpc2QpLmdldFdTRExMb2NhdGlvbigpOwotICAgICAgICAgICAgICAgIGlmICh3c2RsTG9jYXRpb24gIT0gbnVsbCAmJiAhIiIuZXF1YWxzKHdzZGxMb2NhdGlvbikpIHsKLSAgICAgICAgICAgICAgICAgICAgVVJJIHdzZGxMb2NhdGlvblVSSSA9IEphdmFVdGlscy5jcmVhdGVVUkkod3NkbExvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHdzZGxMb2NhdGlvblVSSSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cud2FybihNZXNzYWdlcy5nZXRNZXNzYWdlKCJhZGRQcm9wZXJ0aWVzRXJyIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzZGxMb2NhdGlvbi50b1N0cmluZygpLGRlc2NyaXB0aW9uLmdldFNlcnZpY2VRTmFtZSgpLnRvU3RyaW5nKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzZXRQcm9wZXJ0eShzb2FwTWVzc2FnZUNvbnRleHQsIGphdmF4LnhtbC53cy5oYW5kbGVyLk1lc3NhZ2VDb250ZXh0LldTRExfREVTQ1JJUFRJT04sIHdzZGxMb2NhdGlvblVSSSwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNldFByb3BlcnR5KHNvYXBNZXNzYWdlQ29udGV4dCwgamF2YXgueG1sLndzLmhhbmRsZXIuTWVzc2FnZUNvbnRleHQuV1NETF9TRVJWSUNFLCBkZXNjcmlwdGlvbi5nZXRTZXJ2aWNlUU5hbWUoKSwgdHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvL0xhemlseSBwcm92aWRlIGEgbGlzdCBvZiBhdmFpbGFibGUgcmVmZXJlbmNlIHBhcmFtZXRlcnMuCi0gICAgICAgIG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0ID0KLSAgICAgICAgICAgIGpheHdzTWVzc2FnZUNvbnRleHQuZ2V0QXhpc01lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIFNPQVBIZWFkZXIgaGVhZGVyID0gbnVsbDsKLSAgICAgICAgaWYgKG1zZ0NvbnRleHQgIT0gbnVsbCAmJgotICAgICAgICAgICAgbXNnQ29udGV4dC5nZXRFbnZlbG9wZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIGhlYWRlciA9IG1zZ0NvbnRleHQuZ2V0RW52ZWxvcGUoKS5nZXRIZWFkZXIoKTsKLSAgICAgICAgfQotICAgICAgICBMaXN0PEVsZW1lbnQ+IGxpc3QgPSBuZXcgUmVmZXJlbmNlUGFyYW1ldGVyTGlzdChoZWFkZXIpOwotICAgICAgICAKLSAgICAgICAgc2V0UHJvcGVydHkoc29hcE1lc3NhZ2VDb250ZXh0LCBqYXZheC54bWwud3MuaGFuZGxlci5NZXNzYWdlQ29udGV4dC5SRUZFUkVOQ0VfUEFSQU1FVEVSUywgbGlzdCk7Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJBZGRlZCByZWZlcmVuY2UgcGFyYW1ldGVyIGxpc3QuIik7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIElmIHdlIGFyZSBydW5uaW5nIHdpdGhpbiBhIHNlcnZsZXQgY29udGFpbmVyLCB0aGVuIEpBWC1XUyByZXF1aXJlcyB0aGF0IHRoZQotICAgICAgICAvLyBzZXJ2bGV0IHJlbGF0ZWQgcHJvcGVydGllcyBiZSBzZXQgb24gdGhlIE1lc3NhZ2VDb250ZXh0Ci0gICAgICAgIFNlcnZsZXRDb250ZXh0IHNlcnZsZXRDb250ZXh0ID0gCi0gICAgICAgICAgICAoU2VydmxldENvbnRleHQpamF4d3NNZXNzYWdlQ29udGV4dC5nZXRQcm9wZXJ0eShIVFRQQ29uc3RhbnRzLk1DX0hUVFBfU0VSVkxFVENPTlRFWFQpOwotICAgICAgICBpZiAoc2VydmxldENvbnRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJTZXJ2bGV0IENvbnRleHQgU2V0Iik7Ci0gICAgICAgICAgICBzZXRQcm9wZXJ0eShzb2FwTWVzc2FnZUNvbnRleHQsIGphdmF4LnhtbC53cy5oYW5kbGVyLk1lc3NhZ2VDb250ZXh0LlNFUlZMRVRfQ09OVEVYVCwgc2VydmxldENvbnRleHQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJTZXJ2bGV0IENvbnRleHQgbm90IGZvdW5kIik7Ci0gICAgICAgIH0KLQotICAgICAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxID0gKEh0dHBTZXJ2bGV0UmVxdWVzdClqYXh3c01lc3NhZ2VDb250ZXh0Ci0gICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KEhUVFBDb25zdGFudHMuTUNfSFRUUF9TRVJWTEVUUkVRVUVTVCk7Ci0gICAgICAgIGlmIChyZXEgPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJIVFRQU2VydmxldFJlcXVlc3Qgbm90IGZvdW5kIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzZXRQcm9wZXJ0eShzb2FwTWVzc2FnZUNvbnRleHQsIGphdmF4LnhtbC53cy5oYW5kbGVyLk1lc3NhZ2VDb250ZXh0LlNFUlZMRVRfUkVRVUVTVCwgcmVxKTsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiU0VSVkxFVF9SRVFVRVNUIFNldCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTdHJpbmcgcGF0aEluZm8gPSBudWxsOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBwYXRoSW5mbyA9IHJlcS5nZXRQYXRoSW5mbygpOwotICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiZXhjZXB0aW9uIGluIGdldFBhdGhJbmZvIiwgdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXRQcm9wZXJ0eShzb2FwTWVzc2FnZUNvbnRleHQsIGphdmF4LnhtbC53cy5oYW5kbGVyLk1lc3NhZ2VDb250ZXh0LlBBVEhfSU5GTywgcGF0aEluZm8pOwotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBhdGhJbmZvICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJIVFRQX1JFUVVFU1RfUEFUSElORk8gU2V0Iik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJIVFRQX1JFUVVFU1RfUEFUSElORk8gbm90IGZvdW5kIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgU3RyaW5nIHF1ZXJ5U3RyaW5nID0gcmVxLmdldFF1ZXJ5U3RyaW5nKCk7Ci0gICAgICAgICAgICBzZXRQcm9wZXJ0eShzb2FwTWVzc2FnZUNvbnRleHQsIGphdmF4LnhtbC53cy5oYW5kbGVyLk1lc3NhZ2VDb250ZXh0LlFVRVJZX1NUUklORywgcXVlcnlTdHJpbmcpOwotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHF1ZXJ5U3RyaW5nICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJIVFRQX1JFUVVFU1RfUVVFUllTVFJJTkcgU2V0Iik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJIVFRQX1JFUVVFU1RfUVVFUllTVFJJTkcgbm90IGZvdW5kIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgU3RyaW5nIG1ldGhvZCA9IHJlcS5nZXRNZXRob2QoKTsKLSAgICAgICAgICAgIHNldFByb3BlcnR5KHNvYXBNZXNzYWdlQ29udGV4dCwgamF2YXgueG1sLndzLmhhbmRsZXIuTWVzc2FnZUNvbnRleHQuSFRUUF9SRVFVRVNUX01FVEhPRCwgbWV0aG9kKTsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGlmIChtZXRob2QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkhUVFBfUkVRVUVTVF9NRVRIT0QgU2V0Iik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJIVFRQX1JFUVVFU1RfTUVUSE9EIG5vdCBmb3VuZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzID0gKEh0dHBTZXJ2bGV0UmVzcG9uc2UpamF4d3NNZXNzYWdlQ29udGV4dAotICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eShIVFRQQ29uc3RhbnRzLk1DX0hUVFBfU0VSVkxFVFJFU1BPTlNFKTsKLSAgICAgICAgaWYgKHJlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlNlcnZsZXQgUmVzcG9uc2Ugbm90IGZvdW5kIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzZXRQcm9wZXJ0eShzb2FwTWVzc2FnZUNvbnRleHQsIGphdmF4LnhtbC53cy5oYW5kbGVyLk1lc3NhZ2VDb250ZXh0LlNFUlZMRVRfUkVTUE9OU0UsIHJlcyk7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlNFUlZMRVRfUkVTUE9OU0UgU2V0Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZFdTRExQcm9wZXJ0aWVzKE1lc3NhZ2VDb250ZXh0IGpheHdzTWVzc2FnZUNvbnRleHQpIHsKLSAgICAgICAgYWRkV1NETFByb3BlcnRpZXMoamF4d3NNZXNzYWdlQ29udGV4dCwgZ2V0U09BUE1lc3NhZ2VDb250ZXh0KGpheHdzTWVzc2FnZUNvbnRleHQpKTsgICAgICAgICAgICAgICAgCi0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRXU0RMUHJvcGVydGllcyhNZXNzYWdlQ29udGV4dCBqYXh3c01lc3NhZ2VDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT0FQTWVzc2FnZUNvbnRleHQgc29hcE1lc3NhZ2VDb250ZXh0KSB7Ci0gICAgICAgIE9wZXJhdGlvbkRlc2NyaXB0aW9uIG9wID0gamF4d3NNZXNzYWdlQ29udGV4dC5nZXRPcGVyYXRpb25EZXNjcmlwdGlvbigpOwotCi0gICAgICAgIGlmIChvcCAhPSBudWxsICYmIHNvYXBNZXNzYWdlQ29udGV4dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzZXRQcm9wZXJ0eShzb2FwTWVzc2FnZUNvbnRleHQsIGphdmF4LnhtbC53cy5oYW5kbGVyLk1lc3NhZ2VDb250ZXh0LldTRExfT1BFUkFUSU9OLCBvcC5nZXROYW1lKCksIHRydWUpOwotCi0gICAgICAgICAgICBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uIGVpZCA9IG9wLmdldEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24oKTsKLSAgICAgICAgICAgIGlmIChlaWQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZWQgPSBlaWQuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbigpOwotICAgICAgICAgICAgICAgIFFOYW1lIHBvcnRUeXBlID0gZWlkLmdldFBvcnRUeXBlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHBvcnRUeXBlID09IG51bGwgfHwgcG9ydFR5cGUuZ2V0TG9jYWxQYXJ0KCkubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRpZCBub3QgZ2V0IHBvcnQgdHlwZSBmcm9tIEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24sIGF0dGVtcHRpbmcgdG8gZ2V0IFBvcnRUeXBlIGZyb20gRW5kcG9pbnREZXNjcmlwdGlvbiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChlZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldFByb3BlcnR5KHNvYXBNZXNzYWdlQ29udGV4dCwgamF2YXgueG1sLndzLmhhbmRsZXIuTWVzc2FnZUNvbnRleHQuV1NETF9QT1JULCBlZC5nZXRQb3J0UU5hbWUoKSwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNldFByb3BlcnR5KHNvYXBNZXNzYWdlQ29udGV4dCwgamF2YXgueG1sLndzLmhhbmRsZXIuTWVzc2FnZUNvbnRleHQuV1NETF9JTlRFUkZBQ0UsIHBvcnRUeXBlLCB0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiVW5hYmxlIHRvIHJlYWQgV1NETCBvcGVyYXRpb24sIHBvcnQgYW5kIGludGVyZmFjZSBwcm9wZXJ0aWVzIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZFdTRExQcm9wZXJ0aWVzX3Byb3ZpZGVyKE1lc3NhZ2VDb250ZXh0IGpheHdzTWVzc2FnZUNvbnRleHQpIHsKLSAgICAgICAgYWRkV1NETFByb3BlcnRpZXNfcHJvdmlkZXIoamF4d3NNZXNzYWdlQ29udGV4dCwgZ2V0U09BUE1lc3NhZ2VDb250ZXh0KGpheHdzTWVzc2FnZUNvbnRleHQpKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZFdTRExQcm9wZXJ0aWVzX3Byb3ZpZGVyKE1lc3NhZ2VDb250ZXh0IGpheHdzTWVzc2FnZUNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPQVBNZXNzYWdlQ29udGV4dCBzb2FwTWVzc2FnZUNvbnRleHQpIHsKLSAgICAgICAgUU5hbWUgb3AgPSBqYXh3c01lc3NhZ2VDb250ZXh0LmdldE9wZXJhdGlvbk5hbWUoKTsgICAgCQotICAgICAgICAKLSAgICAgICAgaWYgKG9wICE9IG51bGwgJiYgc29hcE1lc3NhZ2VDb250ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNldFByb3BlcnR5KHNvYXBNZXNzYWdlQ29udGV4dCwgamF2YXgueG1sLndzLmhhbmRsZXIuTWVzc2FnZUNvbnRleHQuV1NETF9PUEVSQVRJT04sIG9wLCB0cnVlKTsKLQotICAgICAgICAgICAgLy9FbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uIGVpZCA9IG9wLmdldEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24oKTsKLSAgICAgICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZWQgPSBqYXh3c01lc3NhZ2VDb250ZXh0LmdldEVuZHBvaW50RGVzY3JpcHRpb24oKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGVkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzZXRQcm9wZXJ0eShzb2FwTWVzc2FnZUNvbnRleHQsIGphdmF4LnhtbC53cy5oYW5kbGVyLk1lc3NhZ2VDb250ZXh0LldTRExfUE9SVCwgZWQuZ2V0UG9ydFFOYW1lKCksIHRydWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJVbmFibGUgdG8gcmVhZCBXU0RMIG9wZXJhdGlvbiwgcG9ydCBhbmQgaW50ZXJmYWNlIHByb3BlcnRpZXMiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBTT0FQTWVzc2FnZUNvbnRleHQgZ2V0U09BUE1lc3NhZ2VDb250ZXh0KE1lc3NhZ2VDb250ZXh0IGpheHdzTWVzc2FnZUNvbnRleHQpIHsKLSAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQgPQotICAgICAgICAgICAgamF4d3NNZXNzYWdlQ29udGV4dC5nZXRBeGlzTWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgU2VydmljZUNvbnRleHQgc2VydmljZUNvbnRleHQgPSBtc2dDb250ZXh0LmdldFNlcnZpY2VDb250ZXh0KCk7Ci0gICAgICAgIFNPQVBNZXNzYWdlQ29udGV4dCBzb2FwTWVzc2FnZUNvbnRleHQgPSBudWxsOwotICAgICAgICBpZiAoc2VydmljZUNvbnRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgV2ViU2VydmljZUNvbnRleHQgd3NjID0KLSAgICAgICAgICAgICAgICAoV2ViU2VydmljZUNvbnRleHQpc2VydmljZUNvbnRleHQuZ2V0UHJvcGVydHkoRW5kcG9pbnRMaWZlY3ljbGVNYW5hZ2VySW1wbC5XRUJTRVJWSUNFX01FU1NBR0VfQ09OVEVYVCk7Ci0gICAgICAgICAgICBpZiAod3NjICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzb2FwTWVzc2FnZUNvbnRleHQgPSAoU09BUE1lc3NhZ2VDb250ZXh0KXdzYy5nZXRNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzb2FwTWVzc2FnZUNvbnRleHQ7Ci0gICAgfQotICAgICAgIAotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgc2V0UHJvcGVydHkoU09BUE1lc3NhZ2VDb250ZXh0IGNvbnRleHQsIFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgc2V0UHJvcGVydHkoY29udGV4dCwgbmFtZSwgdmFsdWUsIGZhbHNlKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXRQcm9wZXJ0eShTT0FQTWVzc2FnZUNvbnRleHQgY29udGV4dCwgU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSwgYm9vbGVhbiBsb2dNZXNzYWdlKSB7Ci0gICAgICAgIGNvbnRleHQucHV0KG5hbWUsIHZhbHVlKTsKLSAgICAgICAgY29udGV4dC5zZXRTY29wZShuYW1lLCBTY29wZS5BUFBMSUNBVElPTik7Ci0gICAgICAgIGlmIChsb2dNZXNzYWdlICYmIGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcobmFtZSArICIgOiIgKyB2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jb3JlL0ludm9jYXRpb25Db250ZXh0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jb3JlL0ludm9jYXRpb25Db250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhODlhMmQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY29yZS9JbnZvY2F0aW9uQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5TZXJ2aWNlQ2xpZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY2xpZW50LmFzeW5jLkFzeW5jUmVzcG9uc2U7Ci0KLWltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5IYW5kbGVyOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yOwotCi0vKioKLSAqIFRoZSA8Y29kZT5JbnZvY2F0aW9uQ29udGV4dDwvY29kZT4gZW5jYXBzdWxhdGVzIGFsbCBvZiB0aGUgaW5mb3JtYXRpb24gcmVsZXZhbnQgdG8gYSBwYXJ0aWN1bGFyCi0gKiBpbnZvY2F0aW9uLiAgVGhpcyB0aWVzIHRoZSBjb250ZXh0IG9mIHRoZSByZXF1ZXN0IGJhY2sgdG8gdGhlIGNvbnRleHQgb2YgdGhlIHJlc3BvbnNlIG1lc3NhZ2UgKGlmCi0gKiBhcHBsaWNhYmxlKSB0aHJvdWdoIHRoZSB1c2Ugb2YgdGhlIE1lc3NhZ2VDb250ZXh0IEFQSS4gIFRoZXJlIGlzIGEgc2VwYXJhdGUgTWVzc2FnZUNvbnRleHQgZm9yCi0gKiBib3RoIHRoZSByZXF1ZXN0IGFuZCB0aGUgcmVzcG9uc2UuICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJbnZvY2F0aW9uQ29udGV4dCB7Ci0KLSAgICBwdWJsaWMgTGlzdDxIYW5kbGVyPiBnZXRIYW5kbGVycygpOwotCi0gICAgcHVibGljIHZvaWQgc2V0SGFuZGxlcnMoTGlzdDxIYW5kbGVyPiBsaXN0KTsKLSAgICAKLSAgICBwdWJsaWMgTWVzc2FnZUNvbnRleHQgZ2V0UmVxdWVzdE1lc3NhZ2VDb250ZXh0KCk7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRSZXF1ZXN0TWVzc2FnZUNvbnRleHQoTWVzc2FnZUNvbnRleHQgY3R4KTsKLQotICAgIHB1YmxpYyBNZXNzYWdlQ29udGV4dCBnZXRSZXNwb25zZU1lc3NhZ2VDb250ZXh0KCk7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRSZXNwb25zZU1lc3NhZ2VDb250ZXh0KE1lc3NhZ2VDb250ZXh0IGN0eCk7Ci0KLSAgICBwdWJsaWMgRXhlY3V0b3IgZ2V0RXhlY3V0b3IoKTsKLQotICAgIHB1YmxpYyB2b2lkIHNldEV4ZWN1dG9yKEV4ZWN1dG9yIGUpOwotCi0gICAgcHVibGljIEFzeW5jUmVzcG9uc2UgZ2V0QXN5bmNSZXNwb25zZUxpc3RlbmVyKCk7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRBc3luY1Jlc3BvbnNlTGlzdGVuZXIoQXN5bmNSZXNwb25zZSBhbCk7Ci0KLSAgICAvL0ZJWE1FOiBUaGlzIGlzIHRlbXBvcmFyeS4KLSAgICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlQ2xpZW50KFNlcnZpY2VDbGllbnQgY2xpZW50KTsKLQotICAgIC8vRklYTUU6IFRoaXMgaXMgdGVtcG9yYXJ5LgotICAgIHB1YmxpYyBTZXJ2aWNlQ2xpZW50IGdldFNlcnZpY2VDbGllbnQoKTsKLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NvcmUvSW52b2NhdGlvbkNvbnRleHRGYWN0b3J5LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jb3JlL0ludm9jYXRpb25Db250ZXh0RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWJmNzdhLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NvcmUvSW52b2NhdGlvbkNvbnRleHRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2VydmVyLkVuZHBvaW50SW52b2NhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zZXJ2ZXIuRW5kcG9pbnRJbnZvY2F0aW9uQ29udGV4dEltcGw7Ci0KLWltcG9ydCBqYXZheC54bWwud3MuQmluZGluZzsKLQotLyoqIFRoZSBJbnZvY2F0aW9uQ29udGV4dEZhY3RvcnkgaXMgdXNlZCB0byBjcmVhdGUgaW5zdGFuY2VzIG9mIGFuIEludm9jYXRpb25Db250ZXh0LiAqLwotcHVibGljIGNsYXNzIEludm9jYXRpb25Db250ZXh0RmFjdG9yeSB7Ci0KLSAgICAvKiogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBhbiBJbnZvY2F0aW9uQ29udGV4dCBiYXNlZCBvbiB0aGUgQmluZGluZyB0aGF0IHdhcyBwYXNzZWQgaW4uICovCi0gICAgcHVibGljIHN0YXRpYyBJbnZvY2F0aW9uQ29udGV4dCBjcmVhdGVJbnZvY2F0aW9uQ29udGV4dChCaW5kaW5nIGJpbmRpbmcpIHsKLSAgICAgICAgSW52b2NhdGlvbkNvbnRleHRJbXBsIGljID0gbmV3IEludm9jYXRpb25Db250ZXh0SW1wbCgpOwotICAgICAgICBpZiAoYmluZGluZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpYy5zZXRIYW5kbGVycyhiaW5kaW5nLmdldEhhbmRsZXJDaGFpbigpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBpYzsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBFbmRwb2ludEludm9jYXRpb25Db250ZXh0IGNyZWF0ZUVuZHBvaW50SW52b2NhdGlvbkNvbnRleHQoQmluZGluZyBiaW5kaW5nKSB7Ci0gICAgICAgIEVuZHBvaW50SW52b2NhdGlvbkNvbnRleHQgZWljID0gbmV3IEVuZHBvaW50SW52b2NhdGlvbkNvbnRleHRJbXBsKCk7Ci0gICAgICAgIAotICAgICAgICBpZiAoYmluZGluZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBlaWMuc2V0SGFuZGxlcnMoYmluZGluZy5nZXRIYW5kbGVyQ2hhaW4oKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBlaWM7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY29yZS9JbnZvY2F0aW9uQ29udGV4dEltcGwuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NvcmUvSW52b2NhdGlvbkNvbnRleHRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzYTdhZjEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY29yZS9JbnZvY2F0aW9uQ29udGV4dEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50LlNlcnZpY2VDbGllbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jbGllbnQuYXN5bmMuQXN5bmNSZXNwb25zZTsKLQotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLkhhbmRsZXI7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3I7Ci0KLS8qKgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIEludm9jYXRpb25Db250ZXh0IGludGVyZmFjZS4KLSAqCi0gKiBAc2VlIEludm9jYXRpb25Db250ZXh0Ci0gKi8KLXB1YmxpYyBjbGFzcyBJbnZvY2F0aW9uQ29udGV4dEltcGwgaW1wbGVtZW50cyBJbnZvY2F0aW9uQ29udGV4dCB7Ci0KLSAgICBwcml2YXRlIExpc3Q8SGFuZGxlcj4gaGFuZGxlcnM7Ci0gICAgcHJpdmF0ZSBNZXNzYWdlQ29udGV4dCByZXF1ZXN0TXNnQ3R4OwotICAgIHByaXZhdGUgTWVzc2FnZUNvbnRleHQgcmVzcG9uc2VNc2dDdHg7Ci0gICAgcHJpdmF0ZSBFeGVjdXRvciBleGVjdXRvcjsKLSAgICBwcml2YXRlIEFzeW5jUmVzcG9uc2UgYXN5bmNSZXNwb25zZTsKLQotICAgIHByaXZhdGUgU2VydmljZUNsaWVudCBzZXJ2aWNlQ2xpZW50OyAvL0ZJWE1FOiBUaGlzIGlzIHRlbXBvcmFyeQotCi0gICAgcHVibGljIEludm9jYXRpb25Db250ZXh0SW1wbCgpIHsKLSAgICAgICAgLy9kbyBub3RoaW5nCi0gICAgfQotCi0gICAgLyoqIEBzZWUgSW52b2NhdGlvbkNvbnRleHQjZ2V0SGFuZGxlcnMoKSAqLwotICAgIHB1YmxpYyBMaXN0PEhhbmRsZXI+IGdldEhhbmRsZXJzKCkgewotICAgICAgICByZXR1cm4gaGFuZGxlcnM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbGlzdCBvZiBoYW5sZGVycyBmb3IgdGhpcyBJbnZvY2F0aW9uQ29udGV4dAotICAgICAqCi0gICAgICogQHBhcmFtIGxpc3QKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRIYW5kbGVycyhMaXN0PEhhbmRsZXI+IGhhbmRsZXJzKSB7Ci0gICAgICAgIHRoaXMuaGFuZGxlcnMgPSBoYW5kbGVyczsKLSAgICB9Ci0KLSAgICAvKiogQHNlZSBJbnZvY2F0aW9uQ29udGV4dCNzZXRSZXF1ZXN0TWVzc2FnZUNvbnRleHQoTWVzc2FnZUNvbnRleHQpICovCi0gICAgcHVibGljIHZvaWQgc2V0UmVxdWVzdE1lc3NhZ2VDb250ZXh0KE1lc3NhZ2VDb250ZXh0IGN0eCkgewotICAgICAgICByZXF1ZXN0TXNnQ3R4ID0gY3R4OwotICAgICAgICBpZiAoY3R4ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJlcXVlc3RNc2dDdHguc2V0SW52b2NhdGlvbkNvbnRleHQodGhpcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiogQHNlZSBJbnZvY2F0aW9uQ29udGV4dCNzZXRSZXNwb25zZU1lc3NhZ2VDb250ZXh0KE1lc3NhZ2VDb250ZXh0KSAqLwotICAgIHB1YmxpYyB2b2lkIHNldFJlc3BvbnNlTWVzc2FnZUNvbnRleHQoTWVzc2FnZUNvbnRleHQgY3R4KSB7Ci0gICAgICAgIHJlc3BvbnNlTXNnQ3R4ID0gY3R4OwotICAgICAgICBpZiAoY3R4ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJlc3BvbnNlTXNnQ3R4LnNldEludm9jYXRpb25Db250ZXh0KHRoaXMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqIEBzZWUgSW52b2NhdGlvbkNvbnRleHQjZ2V0UmVzcG9uc2VNZXNzYWdlQ29udGV4dCgpICovCi0gICAgcHVibGljIE1lc3NhZ2VDb250ZXh0IGdldFJlc3BvbnNlTWVzc2FnZUNvbnRleHQoKSB7Ci0gICAgICAgIHJldHVybiByZXNwb25zZU1zZ0N0eDsKLSAgICB9Ci0KLSAgICAvKiogQHNlZSBJbnZvY2F0aW9uQ29udGV4dCNnZXRSZXF1ZXN0TWVzc2FnZUNvbnRleHQoKSAqLwotICAgIHB1YmxpYyBNZXNzYWdlQ29udGV4dCBnZXRSZXF1ZXN0TWVzc2FnZUNvbnRleHQoKSB7Ci0gICAgICAgIHJldHVybiByZXF1ZXN0TXNnQ3R4OwotICAgIH0KLQotICAgIHB1YmxpYyBFeGVjdXRvciBnZXRFeGVjdXRvcigpIHsKLSAgICAgICAgcmV0dXJuIGV4ZWN1dG9yOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEV4ZWN1dG9yKEV4ZWN1dG9yIGUpIHsKLSAgICAgICAgZXhlY3V0b3IgPSBlOwotICAgIH0KLQotICAgIHB1YmxpYyBBc3luY1Jlc3BvbnNlIGdldEFzeW5jUmVzcG9uc2VMaXN0ZW5lcigpIHsKLSAgICAgICAgcmV0dXJuIGFzeW5jUmVzcG9uc2U7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QXN5bmNSZXNwb25zZUxpc3RlbmVyKEFzeW5jUmVzcG9uc2UgYXIpIHsKLSAgICAgICAgYXN5bmNSZXNwb25zZSA9IGFyOwotICAgIH0KLQotICAgIC8vIEZJWE1FOiBUaGlzIGlzIHRlbXBvcmFyeQotICAgIHB1YmxpYyBTZXJ2aWNlQ2xpZW50IGdldFNlcnZpY2VDbGllbnQoKSB7Ci0gICAgICAgIHJldHVybiBzZXJ2aWNlQ2xpZW50OwotICAgIH0KLQotICAgIC8vIEZJWE1FOiBUaGlzIGlzIHRlbXBvcmFyeQotICAgIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VDbGllbnQoU2VydmljZUNsaWVudCBjbGllbnQpIHsKLSAgICAgICAgc2VydmljZUNsaWVudCA9IGNsaWVudDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jb3JlL01lc3NhZ2VDb250ZXh0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jb3JlL01lc3NhZ2VDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiYTFkMjIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY29yZS9NZXNzYWdlQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS51dGlsLkRldGFjaGFibGVJbnB1dFN0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRW5kcG9pbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLk9wZXJhdGlvbkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaGFuZGxlci5NRVBDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5NZXNzYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS51dGlsLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLndzLkJpbmRpbmdQcm92aWRlcjsKLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZS5Nb2RlOwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBUaGUgPGNvZGU+b3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLk1lc3NhZ2VDb250ZXh0PC9jb2RlPiBpcyBhbiBpbnRlcmZhY2UgdGhhdCBleHRlbmRzIHRoZQotICogSkFYLVdTIDIuMCA8Y29kZT5qYXZheC54bWwud3MuaGFuZGxlci5NZXNzYWdlQ29udGV4dDwvY29kZT4gZGVmaW5lZCBpbiB0aGUgc3BlYy4gIFRoaXMKLSAqIGVuY2Fwc3VsYXRlcyBhbGwgb2YgdGhlIGZ1bmN0aW9uYWxpdHkgbmVlZGVkIG9mIHRoZSBNZXNzYWdlQ29udGV4dCBmb3IgdGhlIG90aGVyIEpBWC1XUyBzcGVjCi0gKiBwaWVjZXMgKHRoZSBoYW5kbGVycyBmb3IgZXhhbXBsZSkgYW5kIGFsc28gcHJvdmlkZXMgdGhlIG5lZWRlZCBiaXRzIG9mIGNvbnRleHR1YWwgaW5mb3JtYXRpb24gZm9yCi0gKiB0aGUgcmVzdCBvZiB0aGUgSkFYLVdTIGltcGxlbWVudGF0aW9uLgotICogPHAvPgotICogU3BlY2lmaWNhbGx5LCB0aGlzIGlzIHJlc3BvbnNpYmxlIGZvciBwcm92aWRpbmcgQVBJcyBzbyB0aGF0IHRoZSBjbGllbnQgYW5kIHNlcnZlciBpbXBsZW1lbnRhdGlvbgotICogcG9ydGlvbnMgY2FuIGdldCB0byB0aGUgTWVzc2FnZSwgZGVmaW5lZCBieSB0aGUgTWVzc2FnZSBNb2RlbCBmb3JtYXQgYW5kIGFsc28gYW55IG1ldGFkYXRhIHRoYXQKLSAqIGlzIGF2YWlsYWJsZS4KLSAqLwotcHVibGljIGNsYXNzIE1lc3NhZ2VDb250ZXh0IHsKLQotICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhNZXNzYWdlQ29udGV4dC5jbGFzcyk7Ci0gICAgCi0gICAgcHJpdmF0ZSBJbnZvY2F0aW9uQ29udGV4dCBpbnZvY2F0aW9uQ3R4OwotICAgIHByaXZhdGUgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0IGF4aXNNc2dDdHg7Ci0gICAgcHJpdmF0ZSBFbmRwb2ludERlc2NyaXB0aW9uIGVuZHBvaW50RGVzYzsKLSAgICBwcml2YXRlIE9wZXJhdGlvbkRlc2NyaXB0aW9uIG9wZXJhdGlvbkRlc2M7Ci0gICAgcHJpdmF0ZSBRTmFtZSBvcGVyYXRpb25OYW1lOyAgICAvL0ZJWE1FOiBUaGlzIHNob3VsZCBiZWNvbWUgdGhlIE9wZXJhdGlvbkRlc2NyaXB0aW9uCi0gICAgcHJpdmF0ZSBNZXNzYWdlIG1lc3NhZ2U7Ci0gICAgcHJpdmF0ZSBNb2RlIG1vZGU7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGlzT3V0Ym91bmQ7ICAvLyBPdXRib3VuZCBvciBpbmJvdW5kIG1lc3NhZ2UgY29udGV4dAotICAgIHByaXZhdGUgYm9vbGVhbiBpc1NlcnZlciA9IGZhbHNlOyAvLyBJbmRpY2F0ZSBpZiBzZXJ2ZXIgcm9sZSwgZGVmYXVsdCBpcyBmYWxzZQotICAgIAotICAgIC8qCi0gICAgICogSkFYV1MgcnVudGltZSB1c2VzIGEgcmVxdWVzdCBhbmQgcmVzcG9uc2UgbWMsIGJ1dCB3ZSBuZWVkIHRvIGtub3cgdGhlIHBhaXIuCi0gICAgICogV2Ugd2lsbCB1c2UgdGhpcyBtZXBDdHggYXMgYSB3cmFwcGVyIHRvIHRoZSByZXF1ZXN0IGFuZCByZXNwb25zZSBtZXNzYWdlIGNvbnRleHRzCi0gICAgICogd2hlcmUgdGhlIHJlcXVlc3RNQyBhbmQgcmVzcG9uc2VNQyBoYXZlIHRoZSBzYW1lIHBhcmVudCBNRVBDb250ZXh0IHRvCi0gICAgICogcHJlc2VydmUgdGhlIHJlbGF0aW9uc2hpcC4KLSAgICAgKi8KLSAgICBwcml2YXRlIE1FUENvbnRleHQgbWVwQ3R4OwotCi0gICAgLy8gSWYgYSBsb2NhbCBleGNlcHRpb24gaXMgdGhyb3duLCB0aGUgZXhjZXB0aW9uIGlzIHBsYWNlZCBvbiB0aGUgbWVzc2FnZSBjb250ZXh0LgotICAgIC8vIEl0IGlzIG5vdCBjb252ZXJ0ZWQgaW50byBhIE1lc3NhZ2UuCi0gICAgcHJpdmF0ZSBUaHJvd2FibGUgbG9jYWxFeGNlcHRpb24gPSBudWxsOwotICAgIHByaXZhdGUgQXhpc0ZhdWx0IGNhdXNlZEJ5RXhjZXB0aW9uID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdCBhIE1lc3NhZ2VDb250ZXh0IHdpdGhvdXQgYSBwcmlvciBBeGlzMiBNZXNzYWdlQ29udGV4dAotICAgICAqICh1c2FnZSBvdXRib3VuZCBkaXNwYXRjaC9wcm94eSkKLSAgICAgKi8KLSAgICBwdWJsaWMgTWVzc2FnZUNvbnRleHQoKSB7Ci0gICAgICAgIGF4aXNNc2dDdHggPSBuZXcgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIGlzT3V0Ym91bmQgPSB0cnVlOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3QgYSBNZXNzYWdlQ29udGV4dCB3aXRoIGEgcHJpb3IgTWVzc2FnZUNvbnRleHQKLSAgICAgKiAodXNhZ2UgaW5ib3VuZCBjbGllbnQvc2VydmVyIG9yIG91dGJvdW5kIHNlcnZlcikKLSAgICAgKiBAcGFyYW0gbWMKLSAgICAgKiBAdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgTWVzc2FnZUNvbnRleHQob3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0IG1jKSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIEFzc3VtZSBpbmJvdW5kIChjYWxsZXIgbXVzdCBzZXRPdXRib3VuZCkKLSAgICAgICAgaXNPdXRib3VuZCA9IGZhbHNlOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIEluc3RlYWQgb2YgY3JlYXRpbmcgYSBtZW1iZXIgTUVQQ29udGV4dCBvYmplY3QgZXZlcnkgdGltZSwgd2Ugd2lsbAotICAgICAgICAgKiByZWx5IG9uIHVzZXJzIG9mIHRoaXMgTWVzc2FnZUNvbnRleHQgY2xhc3MgdG8gY3JlYXRlIGEgbmV3Ci0gICAgICAgICAqIE1FUENvbnRleHQgYW5kIGNhbGwgc2V0TUVQQ29udGV4dChNRVBDb250ZXh0KQotICAgICAgICAgKi8KLSAgICAgICAgCi0gICAgICAgIGlmIChtYyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBheGlzTXNnQ3R4ID0gbWM7Ci0gICAgICAgICAgICBtZXNzYWdlID0gTWVzc2FnZVV0aWxzLmdldE1lc3NhZ2VGcm9tTWVzc2FnZUNvbnRleHQobWMpOwotICAgICAgICAgICAgaWYgKG1lc3NhZ2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc2V0TWVzc2FnZUNvbnRleHQodGhpcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBheGlzTXNnQ3R4ID0gbmV3IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIEludm9jYXRpb25Db250ZXh0IGdldEludm9jYXRpb25Db250ZXh0KCkgewotICAgICAgICByZXR1cm4gaW52b2NhdGlvbkN0eDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRJbnZvY2F0aW9uQ29udGV4dChJbnZvY2F0aW9uQ29udGV4dCBpYykgewotICAgICAgICBpbnZvY2F0aW9uQ3R4ID0gaWM7Ci0gICAgfQotCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD4gZ2V0UHJvcGVydGllcygpIHsKLSAgICAgICAgLy8gb25seSB1c2UgcHJvcGVydGllcyB0aGF0IGFyZSBsb2NhbCB0byB0aGUgYXhpczIgTUMsCi0gICAgICAgIC8vIG5vdCB0aGUgb3B0aW9ucyBiYWcuICBTZWUgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkFic3RyYWN0Q29udGV4dAotICAgICAgICBJdGVyYXRvciBuYW1lcyA9IGF4aXNNc2dDdHguZ2V0UHJvcGVydHlOYW1lcygpOwotICAgICAgICBIYXNoTWFwIHRlbXBQcm9wcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotICAgICAgICBmb3IgKDsgbmFtZXMuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSAoU3RyaW5nKW5hbWVzLm5leHQoKTsKLSAgICAgICAgICAgIHRlbXBQcm9wcy5wdXQobmFtZSwgYXhpc01zZ0N0eC5nZXRQcm9wZXJ0eShuYW1lKSk7Ci0gICAgICAgIH0KLSAgICAgICAgLy9yZXR1cm4gbmV3IFJlYWRPbmx5UHJvcGVydGllcyh0ZW1wUHJvcHMpOwotICAgICAgICByZXR1cm4gdGVtcFByb3BzOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0aWVzKE1hcDxTdHJpbmcsIE9iamVjdD4gX3Byb3BlcnRpZXMpIHsKLSAgICAgICAgLy8gbWFrZSBzdXJlIGNvcHkgaXMgbWFkZSwgbm90IGp1c3QgcmVmZXJlbmNlOgotICAgICAgICBfcHJvcGVydGllcy5wdXQob3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0LkNPUFlfUFJPUEVSVElFUywgdHJ1ZSk7Ci0gICAgICAgIGF4aXNNc2dDdHguc2V0UHJvcGVydGllcyhfcHJvcGVydGllcyk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIGtleSkgewotICAgICAgICAvLyBvbmx5IHVzZSBwcm9wZXJ0aWVzIHRoYXQgYXJlIGxvY2FsIHRvIHRoZSBheGlzMiBNQy4KLSAgICAgICAgcmV0dXJuIGF4aXNNc2dDdHguZ2V0TG9jYWxQcm9wZXJ0eShrZXksIGZhbHNlKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNLZXkoT2JqZWN0IGtleSkgewotICAgICAgICAvLyBPbmx5IHVzZSBwcm9wZXJ0aWVzIHRoYXQgYXJlIGxvY2FsIHRvIHRoZSBheGlzMiBNQy4KLSAgICAgICAgLy8gQHNlZSBnZXRQcm9wZXJ0eShTdHJpbmcga2V5KQotICAgICAgICByZXR1cm4gKGtleSBpbnN0YW5jZW9mIFN0cmluZyAmJiBnZXRQcm9wZXJ0eSgoU3RyaW5nKWtleSkgIT0gbnVsbCk7Ci0gICAgfQotICAgIAotICAgIC8vIGFjdHMgbGlrZSBNYXAucHV0KGtleSwgdmFsdWUpCi0gICAgcHVibGljIE9iamVjdCBzZXRQcm9wZXJ0eShTdHJpbmcga2V5LCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgLy8gb25seSB1c2UgcHJvcGVydGllcyB0aGF0IGFyZSBsb2NhbCB0byB0aGUgYXhpczIgTUMKLSAgICAgICAgT2JqZWN0IHJldHZhbCA9IGF4aXNNc2dDdHguZ2V0TG9jYWxQcm9wZXJ0eShrZXksIGZhbHNlKTsKLSAgICAgICAgYXhpc01zZ0N0eC5zZXRQcm9wZXJ0eShrZXksIHZhbHVlKTsKLSAgICAgICAgcmV0dXJuIHJldHZhbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRW5kcG9pbnREZXNjcmlwdGlvbiBnZXRFbmRwb2ludERlc2NyaXB0aW9uKCkgewotICAgICAgICByZXR1cm4gZW5kcG9pbnREZXNjOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEVuZHBvaW50RGVzY3JpcHRpb24oRW5kcG9pbnREZXNjcmlwdGlvbiBlZCkgewotICAgICAgICBlbmRwb2ludERlc2MgPSBlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT3BlcmF0aW9uRGVzY3JpcHRpb24gZ2V0T3BlcmF0aW9uRGVzY3JpcHRpb24oKSB7Ci0gICAgICAgIHJldHVybiBvcGVyYXRpb25EZXNjOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE9wZXJhdGlvbkRlc2NyaXB0aW9uKE9wZXJhdGlvbkRlc2NyaXB0aW9uIG9kKSB7Ci0gICAgICAgIG9wZXJhdGlvbkRlc2MgPSBvZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTW9kZSBnZXRNb2RlKCkgewotICAgICAgICByZXR1cm4gbW9kZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRNb2RlKE1vZGUgbSkgewotICAgICAgICBtb2RlID0gbTsKLSAgICB9Ci0KLSAgICAvL0ZJWE1FOiBUaGlzIHNob3VsZCBiZWNvbWUgdGhlIE9wZXJhdGlvbkRlc2NyaXB0aW9uCi0gICAgcHVibGljIFFOYW1lIGdldE9wZXJhdGlvbk5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBvcGVyYXRpb25OYW1lOwotICAgIH0KLQotICAgIC8vRklYTUU6IFRoaXMgc2hvdWxkIGJlY29tZSB0aGUgT3BlcmF0aW9uRGVzY3JpcHRpb24KLSAgICBwdWJsaWMgdm9pZCBzZXRPcGVyYXRpb25OYW1lKFFOYW1lIG9wKSB7Ci0gICAgICAgIG9wZXJhdGlvbk5hbWUgPSBvcDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7Ci0gICAgICAgIG1lc3NhZ2UgPSBtc2c7Ci0gICAgICAgIG1zZy5zZXRNZXNzYWdlQ29udGV4dCh0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWVzc2FnZSBnZXRNZXNzYWdlKCkgewotICAgICAgICByZXR1cm4gbWVzc2FnZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0IGdldEF4aXNNZXNzYWdlQ29udGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIGF4aXNNc2dDdHg7Ci0gICAgfQotCi0gICAgcHVibGljIENsYXNzTG9hZGVyIGdldENsYXNzTG9hZGVyKCkgewotICAgICAgICBBeGlzU2VydmljZSBzdmMgPSBheGlzTXNnQ3R4LmdldEF4aXNTZXJ2aWNlKCk7Ci0gICAgICAgIGlmIChzdmMgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBzdmMuZ2V0Q2xhc3NMb2FkZXIoKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXNlZCB0byBkZXRlcm1pbmUgd2hldGhlciBvciBub3Qgc2Vzc2lvbiBzdGF0ZSBoYXMgYmVlbiBlbmFibGVkLgotICAgICAqCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzTWFpbnRhaW5TZXNzaW9uKCkgewotICAgICAgICBib29sZWFuIG1haW50YWluU2Vzc2lvbiA9IGZhbHNlOwotCi0gICAgICAgIEJvb2xlYW4gdmFsdWUgPSAoQm9vbGVhbikgZ2V0UHJvcGVydHkoQmluZGluZ1Byb3ZpZGVyLlNFU1NJT05fTUFJTlRBSU5fUFJPUEVSVFkpOwotICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5ib29sZWFuVmFsdWUoKSkgewotICAgICAgICAgICAgbWFpbnRhaW5TZXNzaW9uID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBtYWludGFpblNlc3Npb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIGxvY2FsIGV4Y2VwdGlvbiBpcyB0aGUgVGhyb3dhYmxlIG9iamVjdCBoZWxkIG9uIHRoZSBNZXNzYWdlIGZyb20gYSBwcm9ibGVtIHRoYXQgb2NjdXJyZWQKLSAgICAgKiBkdWUgdG8gc29tZXRoaW5nIG90aGVyIHRoYW4gdGhlIHNlcnZlci4gIEluIG90aGVyIHdvcmRzLCBubyBtZXNzYWdlIGV2ZXIgdHJhdmVsbGVkIGFjcm9zcwotICAgICAqIHRoZSB3aXJlLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgVGhyb3dhYmxlIG9iamVjdCBvciBudWxsCi0gICAgICovCi0gICAgcHVibGljIFRocm93YWJsZSBnZXRMb2NhbEV4Y2VwdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIGxvY2FsRXhjZXB0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSBsb2NhbCBleGNlcHRpb24gaXMgdGhlIFRocm93YWJsZSBvYmplY3QgaGVsZCBvbiB0aGUgTWVzc2FnZSBmcm9tIGEgcHJvYmxlbSB0aGF0IG9jY3VycmVkCi0gICAgICogZHVlIHRvIHNvbWV0aGluZyBvdGhlciB0aGFuIHRoZSBzZXJ2ZXIuICBJbiBvdGhlciB3b3Jkcywgbm8gbWVzc2FnZSBldmVyIHRyYXZlbGxlZCBhY3Jvc3MgdGhlCi0gICAgICogd2lyZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0Ci0gICAgICogQHNlZSBUaHJvd2FibGUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRMb2NhbEV4Y2VwdGlvbihUaHJvd2FibGUgdCkgewotICAgICAgICBsb2NhbEV4Y2VwdGlvbiA9IHQ7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEBwYXJhbSB0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q2F1c2VkQnlFeGNlcHRpb24gKEF4aXNGYXVsdCB0KXsKLSAgICAgICAgdGhpcy5jYXVzZWRCeUV4Y2VwdGlvbiA9IHQ7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgQXhpc0ZhdWx0IGdldENhdXNlZEJ5RXhjZXB0aW9uKCl7Ci0gICAgICAgIHJldHVybiB0aGlzLmNhdXNlZEJ5RXhjZXB0aW9uOwotICAgIH0KLSAgICAKLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgd3JhcHBlciBNRVBDb250ZXh0LiAgSW50ZXJuYWxseSwgdGhpcyBtZXRob2QgYWxzbyBzZXRzCi0gICAgICogdGhlIE1FUENvbnRleHQncyBjaGlsZHJlbiBzbyB0aGUgcG9pbnRlciBpcyBiaS1kaXJlY3Rpb25hbDsgeW91IGNhbgotICAgICAqIGdldCB0aGUgTUVQQ29udGV4dCBmcm9tIHRoZSBNZXNzYWdlQ29udGV4dCBhbmQgdmljZS12ZXJzYS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWVwQ3R4Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TUVQQ29udGV4dChNRVBDb250ZXh0IG1lcEN0eCkgewotICAgICAgICBpZiAodGhpcy5tZXBDdHggPT0gbnVsbCkgewotICAgICAgICAgICAgdGhpcy5tZXBDdHggPSBtZXBDdHg7Ci0gICAgICAgICAgICAvLyBhbmQgc2V0IHBhcmVudCdzIGNoaWxkIHBvaW50ZXIKLSAgICAgICAgICAgIHRoaXMubWVwQ3R4LnNldFJlc3BvbnNlTWVzc2FnZUNvbnRleHQodGhpcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgTUVQQ29udGV4dCBnZXRNRVBDb250ZXh0KCkgewotICAgICAgICBpZiAobWVwQ3R4ID09IG51bGwpIHsKLSAgICAgICAgICAgIHNldE1FUENvbnRleHQobmV3IE1FUENvbnRleHQodGhpcykpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtZXBDdHg7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEByZXR1cm4gaWYgb3V0Ym91bmQgTWVzc2FnZUNvbnRleHQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc091dGJvdW5kKCkgewotICAgICAgICByZXR1cm4gaXNPdXRib3VuZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gaXNPdXRib3VuZCB0cnVlIGlmIG91dGJvdW5kIE1lc3NhZ2VDb250ZXh0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0T3V0Ym91bmQoYm9vbGVhbiBpc091dGJvdW5kKSB7Ci0gICAgICAgIHRoaXMuaXNPdXRib3VuZCA9IGlzT3V0Ym91bmQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0cnVlIGlmIHNlcnZlciByb2xlCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNTZXJ2ZXIoKSB7Ci0gICAgICAgIHJldHVybiBpc1NlcnZlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbmRpY2F0ZSBpZiBzZXJ2ZXIgcm9sZQotICAgICAqIEBwYXJhbSBpc1NlcnZlcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNlcnZlcihib29sZWFuIGlzU2VydmVyKSB7Ci0gICAgICAgIHRoaXMuaXNTZXJ2ZXIgPSBpc1NlcnZlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGcmVlIHRoZSByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBpbmNvbWluZyBpbnB1dCBzdHJlYW0uIChpLmUuIEhUVFBJbnB1dFN0cmVhbSkKLSAgICAgKiBUaGlzIGFsbG93cyB0aGUgdHJhbnNwb3J0IGxheWVyIHRvIGZyZWUgcmVzb3VyY2VzIGFuZCBwb29sIGNvbm5lY3Rpb25zCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZnJlZUlucHV0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAvLyBEdXJpbmcgYnVpbGRlciBwcm9jZXNzaW5nLCB0aGUgb3JpZ2luYWwgaW5wdXQgc3RyZWFtIHdhcyB3cmFwcGVkIHdpdGgKLSAgICAgICAgLy8gYSBkZXRhY2hhYmxlIGlucHV0IHN0cmVhbS4gIFRoZSBkZXRhY2hhYmxlIGlucHV0IHN0cmVhbSdzIGRldGFjaCBtZXRob2QKLSAgICAgICAgLy8gY2F1c2VzIHRoZSBvcmlnaW5hbCBzdHJlYW0gdG8gYmUgY29uc3VtZWQgYW5kIGNsb3NlZC4KLSAgICAgICAgRGV0YWNoYWJsZUlucHV0U3RyZWFtIGlzID0gKERldGFjaGFibGVJbnB1dFN0cmVhbSkgCi0gICAgICAgICAgICBnZXRQcm9wZXJ0eShDb25zdGFudHMuREVUQUNIQUJMRV9JTlBVVF9TVFJFQU0pOwotICAgICAgICBpZiAoaXMgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJEZXRhY2hpbmcgaW5ib3VuZCBpbnB1dCBzdHJlYW0gIiArIGlzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlzLmRldGFjaCgpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY29yZS9jb250cm9sbGVyL0ludm9jYXRpb25Db250cm9sbGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jb3JlL2NvbnRyb2xsZXIvSW52b2NhdGlvbkNvbnRyb2xsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTk5NTgwOC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jb3JlL2NvbnRyb2xsZXIvSW52b2NhdGlvbkNvbnRyb2xsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLmNvbnRyb2xsZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUuSW52b2NhdGlvbkNvbnRleHQ7Ci0KLWltcG9ydCBqYXZheC54bWwud3MuQXN5bmNIYW5kbGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5SZXNwb25zZTsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU7Ci0KLS8qKgotICogVGhlIDx0dD5JbnZvY2F0aW9uQ29udHJvbGxlcjwvdHQ+IGlzIGFuIGludGVyZmFjZSBtb2RlbGluZyB0aGUgaW52b2NhdGlvbiBvZiBhCi0gKiB0YXJnZXQgd2ViIHNlcnZpY2UuICBBbGwgb2YgdGhlIGluZm9ybWF0aW9uIHRoYXQgdGhlIEludm9jYXRpb25Db250cm9sbGVyIG5lZWRzIAotICogc2hvdWxkIGV4aXN0IHdpdGhpbiB0aGUgSW52b2NhdG9uQ29udGV4dCB0aGF0IGlzIHBhc3NlZCBpbiB0byB0aGUgdmFyaW91cyBpbnZva2UgCi0gKiBtZXRob2RzLgotICogPHAvPgotICogVGhlIHJlcXVlc3QgaW5mb3JtYXRpb24gaXMgcGFzc2VkIGluIHdpdGhpbiB0aGUgSW52b2NhdGlvbkNvbnRleHQuICBUaGUgSW52b2NhdGlvbkNvbnRyb2xsZXIKLSAqIGFzc3VtZXMgdGhhdCB0aGVyZSBpcyBhIE1lc3NhZ2VDb250ZXh0IHdpdGhpbiB0aGF0IEludm9jYXRpb25Db250ZXh0IHRoYXQgaXMgcG9wdWxhdGVkIHdpdGggYWxsCi0gKiBvZiB0aGUgaW5mb3JtYXRpb24gdGhhdCBpdCBuZWVkcyB0byBpbnZva2UuICBJZiBub3QsIGFuIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQuICBPbmNlIHRoZQotICogcmVzcG9uc2UgY29tZXMgYmFjaywgdGhlIGluZm9ybWF0aW9uIGZvciB0aGF0IHJlc3BvbnNlIHdpbGwgYmUgaGVsZCBpbnNpZGUgb2YgdGhlIE1lc3NhZ2VDb250ZXh0Ci0gKiByZXByZXNlbnRpbmcgdGhlIHJlc3BvbnNlLCB0aGF0IGV4aXN0cyBpbiB0aGUgSW52b2NhdGlvbkNvbnRleHQuCi0gKiA8cC8+Ci0gKiBUaGUgSW52b2NhdGlvbkNvbnRyb2xsZXIgc3VwcG9ydHMgZm91ciBkaWZmZXJlbnQgaW52b2NhdGlvbiBwYXR0ZXJuczoKLSAqIDxwLz4KLSAqIDEpIHN5bmNocm9ub3VzIC0gVGhpcyBpcyByZXByZXNlbnRlZCBieSB0aGUge0BsaW5rICNpbnZva2UoSW52b2NhdGlvbkNvbnRleHQpfSBtZXRob2QuICBUaGlzIGlzIGEKLSAqIGJsb2NraW5nLCByZXF1ZXN0L3Jlc3BvbnNlIGNhbGwgdG8gdGhlIHdlYiBzZXJ2aWNlLgotICogPHAvPgotICogMikgb25lLXdheSAtIFRoaXMgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIHtAbGluayAjaW52b2tlT25lV2F5KEludm9jYXRpb25Db250ZXh0KX0gbWV0aG9kLiAgVGhpcyBpcwotICogYSBvbmUtd2F5IGludm9jYXRpb24gdGhhdCBvbmx5IHJldHVybnMgZXJyb3JzIHJlbGF0ZWQgdG8gc2VuZGluZyB0aGUgbWVzc2FnZS4gIElmIGFuIGVycm9yIG9jY3VycwotICogd2hpbGUgcHJvY2Vzc2luZywgdGhlIGNsaWVudCB3aWxsIG5vdCBiZSBub3RpZmllZC4KLSAqIDxwLz4KLSAqIDMpIGFzeW5jaHJvbm91cyAoY2FsbGJhY2spIC0ge0BsaW5rICNpbnZva2VBc3luYyhJbnZvY2F0aW9uQ29udGV4dCwgQXN5bmNIYW5kbGVyKX0KLSAqIDxwLz4KLSAqIDQpIGFzeW5jaHJvbm91cyAocG9sbGluZykgLSB7QGxpbmsgI2ludm9rZUFzeW5jKEludm9jYXRpb25Db250ZXh0KX0KLSAqLwotcHVibGljIGludGVyZmFjZSBJbnZvY2F0aW9uQ29udHJvbGxlciB7Ci0KLSAgICAvKioKLSAgICAgKiBQZXJmb3JtcyBhIHN5bmNocm9ub3VzIChibG9ja2luZykgaW52b2NhdGlvbiBvZiBhIHRhcmdldCBzZXJ2aWNlLiAgVGhlIEludm9jYXRpb25Db250ZXh0Ci0gICAgICogcGFzc2VkIGluIHNob3VsZCBjb250YWluIGEgdmFsaWQgTWVzc2FnZUNvbnRleHQgY29udGFpbmluZyB0aGUgcHJvcGVydGllcyBhbmQgbWVzc2FnZSB0byBiZQotICAgICAqIHNlbnQgZm9yIHRoZSByZXF1ZXN0LiAgVGhlIHJlc3BvbnNlIGNvbnRlbnRzIHdpbGwgYmUgcHJvY2Vzc2VkIGFuZCBwbGFjZWQgaW4gdGhlCi0gICAgICogSW52b2NhdGlvbkNvbnRleHQgYXMgd2VsbC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpYwotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgSW52b2NhdGlvbkNvbnRleHQgaW52b2tlKEludm9jYXRpb25Db250ZXh0IGljKTsKLQotICAgIC8qKgotICAgICAqIFBlcmZvcm1zIGEgb25lLXdheSBpbnZvY2F0aW9uIG9mIHRoZSBjbGllbnQuICBUaGlzIGlzIFNIT1VMRCBOT1QgYmUgYSByb2J1c3QgaW52b2NhdGlvbiwgc28KLSAgICAgKiBhbnkgZmF1bHQgdGhhdCBvY2N1cnMgZHVyaW5nIHRoZSBwcm9jZXNzaW5nIG9mIHRoZSByZXF1ZXN0IHdpbGwgbm90IGJlIHJldHVybmVkIHRvIHRoZQotICAgICAqIGNsaWVudC4gIEVycm9ycyByZXR1cm5lZCB0byB0aGUgY2xpZW50IGFyZSBwcm9ibGVtcyB0aGF0IG9jY3VycmVkIGR1cmluZyB0aGUgc2VuZGluZyBvZiB0aGUKLSAgICAgKiBtZXNzYWdlIHRvIHRoZSBzZXJ2ZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaWMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbnZva2VPbmVXYXkoSW52b2NhdGlvbkNvbnRleHQgaWMpIHRocm93cyBFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBQZXJmb3JtcyBhbiBhc3luY2hyb25vdXMgKG5vbi1ibG9ja2luZykgaW52b2NhdGlvbiBvZiB0aGUgY2xpZW50IGJhc2VkIG9uIGEgY2FsbGJhY2sgbW9kZWwuCi0gICAgICogVGhlIEFzeW5jSGFuZGxlciB0aGF0IGlzIHBhc3NlZCBpbiBpcyB0aGUgY2FsbGJhY2sgdGhhdCB0aGUgY2xpZW50IHByb2dyYW1tZXIgc3VwcGxpZWQgd2hlbgotICAgICAqIHRoZXkgaW52b2tlZCB0aGVpciBKQVgtV1MgRGlzcGF0Y2ggb3IgdGhlaXIgU0VJLWJhc2VkIGR5bmFtaWMgcHJveHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaWMKLSAgICAgKiBAcGFyYW0gY2FsbGJhY2sKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIFJlc3BvbnNlIGludm9rZUFzeW5jKEludm9jYXRpb25Db250ZXh0IGljKTsKLQotICAgIC8qKgotICAgICAqIFBlcmZvcm1zIGFuIGFzeW5jaHJvbm91cyAobm9uLWJsb2NraW5nKSBpbnZvY2F0aW9uIG9mIHRoZSBjbGllbnQgYmFzZWQgb24gYSBwb2xsaW5nIG1vZGVsLgotICAgICAqIFRoZSBSZXNwb25zZSBvYmplY3QgdGhhdCBpcyByZXR1cm5lZCBhbGxvd3MgdGhlIGNsaWVudCBwcm9ncmFtbWVyIHRvIHBvbGwgYWdhaW5zdCBpdCB0byBzZWUKLSAgICAgKiBpZiBhIHJlc3BvbnNlIGhhcyBiZWVuIHNlbnQgYmFjayBieSB0aGUgc2VydmVyLgotICAgICAqCi0gICAgICogQHBhcmFtIGljCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBGdXR1cmU8Pz4gaW52b2tlQXN5bmMoSW52b2NhdGlvbkNvbnRleHQgaWMsIEFzeW5jSGFuZGxlciBhc3luY0hhbmRsZXIpOwotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jb3JlL2NvbnRyb2xsZXIvSW52b2NhdGlvbkNvbnRyb2xsZXJGYWN0b3J5LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jb3JlL2NvbnRyb2xsZXIvSW52b2NhdGlvbkNvbnRyb2xsZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4Y2MwZjkuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY29yZS9jb250cm9sbGVyL0ludm9jYXRpb25Db250cm9sbGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLmNvbnRyb2xsZXI7DQotDQotcHVibGljIGludGVyZmFjZSBJbnZvY2F0aW9uQ29udHJvbGxlckZhY3Rvcnkgew0KLQ0KLSAgICAvKioNCi0gICAgICogVXNlZCB0byBvYnRhaW4gYW4gaW5zdGFuY2Ugb2YgdGhlIEludm9jYXRpb25Db250cm9sbGVyIGN1cnJlbnRseQ0KLSAgICAgKiBjb25maWd1cmVkIGZvciB0aGUgcnVudGltZS4NCi0gICAgICogDQotICAgICAqIEByZXR1cm4gQSB2YWxpZCBJbnZvY2F0aW9uQ29udHJvbGxlciBpbnN0YW5jZS4NCi0gICAgICovDQotICAgIHB1YmxpYyBJbnZvY2F0aW9uQ29udHJvbGxlciBnZXRJbnZvY2F0aW9uQ29udHJvbGxlcigpOw0KLSAgICANCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY29yZS9jb250cm9sbGVyL0ludm9jYXRpb25QYXR0ZXJuLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jb3JlL2NvbnRyb2xsZXIvSW52b2NhdGlvblBhdHRlcm4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGMyZTRmMC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jb3JlL2NvbnRyb2xsZXIvSW52b2NhdGlvblBhdHRlcm4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLmNvbnRyb2xsZXI7Ci0KLXB1YmxpYyBlbnVtIEludm9jYXRpb25QYXR0ZXJuIHsKLSAgICBTWU5DLAotICAgIE9ORVdBWSwKLSAgICBBU1lOQ19DQUxMQkFDSywKLSAgICBBU1lOQ19QT0xMSU5HCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jb3JlL2NvbnRyb2xsZXIvaW1wbC9BeGlzSW52b2NhdGlvbkNvbnRyb2xsZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NvcmUvY29udHJvbGxlci9pbXBsL0F4aXNJbnZvY2F0aW9uQ29udHJvbGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZGEzMTE4Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NvcmUvY29udHJvbGxlci9pbXBsL0F4aXNJbnZvY2F0aW9uQ29udHJvbGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLmNvbnRyb2xsZXIuaW1wbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50Lk9wZXJhdGlvbkNsaWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5PcHRpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50LlNlcnZpY2VDbGllbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5CaW5kaW5nUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5FeGNlcHRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY2xpZW50LkNsaWVudFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY2xpZW50LmFzeW5jLkFzeW5jUmVzcG9uc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jbGllbnQuYXN5bmMuQ2FsbGJhY2tGdXR1cmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jbGllbnQuYXN5bmMuUG9sbGluZ0Z1dHVyZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUuSW52b2NhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uT3BlcmF0aW9uRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5pMThuLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5NZXNzYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5mYWN0b3J5Lk1lc3NhZ2VGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS51dGlsLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnJlZ2lzdHJ5LkZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnV0aWwuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MudXRpbGl0eS5DbGFzc1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuSFRUUENvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkh0dHBUcmFuc3BvcnRQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5UaHJlYWRDb250ZXh0TWlncmF0b3JVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwud3MuQXN5bmNIYW5kbGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5SZXNwb25zZTsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTsKLQotLyoqCi0gKiBUaGUgPHR0PkF4aXNJbnZvY2F0aW9uQ29udHJvbGxlcjwvdHQ+IGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSB7QGxpbmsKLSAqIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS5jb250cm9sbGVyLkludm9jYXRpb25Db250cm9sbGVyfSBpbnRlcmZhY2UuICBUaGlzIGltcGxlbWVuYXRpb24gdXNlcwotICogdGhlIEF4aXMyIGVuZ2luZSB0byBkcml2ZSB0aGUgcmVxdWVzdCB0byB0aGUgdGFyZ2V0IHNlcnZpY2UuCi0gKiA8cC8+Ci0gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBob3cgdG8gaW52b2tlIHRoaXMgY2xhc3MsIHBsZWFzZSBzZWUgdGhlIEludm9jYXRpb25Db250cm9sbGVyIGludGVyZmFjZQotICogY29tbWVudHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBBeGlzSW52b2NhdGlvbkNvbnRyb2xsZXIgZXh0ZW5kcyBJbnZvY2F0aW9uQ29udHJvbGxlckltcGwgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEF4aXNJbnZvY2F0aW9uQ29udHJvbGxlci5jbGFzcyk7Ci0KLSAgICAvKgotICAgICogKG5vbi1KYXZhZG9jKQotICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUuY29udHJvbGxlci5JbnZvY2F0aW9uQ29udHJvbGxlciNpbnZva2Uob3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLkludm9jYXRpb25Db250ZXh0KQotICAgICovCi0gICAgcHVibGljIE1lc3NhZ2VDb250ZXh0IGRvSW52b2tlKE1lc3NhZ2VDb250ZXh0IHJlcXVlc3QpIHsKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAvLyBXZSBuZWVkIHRoZSBxbmFtZSBvZiB0aGUgb3BlcmF0aW9uIGJlaW5nIGludm9rZWQgdG8ga25vdyB3aGljaCAKLSAgICAgICAgLy8gQXhpc09wZXJhdGlvbiB0aGUgT3BlcmF0aW9uQ2xpZW50IHNob3VsZCBiZSBiYXNlZCBvbi4KLSAgICAgICAgLy8gTm90ZSB0aGF0IHRoZSBPcGVyYXRpb25EZXNjIGlzIG9ubHkgc2V0IHRocm91Z2ggdXNlIG9mIHRoZSBQcm94eS4gRGlzcGF0Y2gKLSAgICAgICAgLy8gY2xpZW50cyBkbyBub3QgdXNlIG9wZXJhdGlvbnMsIHNvIHRoZSBvcGVyYXRpb25EZXNjIHdpbGwgYmUgbnVsbC4gIEluIHRoaXMKLSAgICAgICAgLy8gY2FzZSBhbiBhbm9ueW1vdXMgQXhpc1NlcnZpY2Ugd2l0aCBhbm95bW91bnMgQXhpc09wZXJhdGlvbnMgZm9yIHRoZSBzdXBwb3J0ZWQKLSAgICAgICAgLy8gTUVQcyB3aWxsIGJlIGNyZWF0ZWQ7IGFuZCBpdCBpcyB0aGF0IGFub255bW91cyBvcGVyYXRpb24gbmFtZSB3aGljaCBuZWVkcyB0bwotICAgICAgICAvLyBiZSBzcGVjaWZpZWQKLSAgICAgICAgUU5hbWUgb3BlcmF0aW9uTmFtZSA9IGdldE9wZXJhdGlvbk5hbWVUb1VzZShyZXF1ZXN0LCBTZXJ2aWNlQ2xpZW50LkFOT05fT1VUX0lOX09QKTsKLQotICAgICAgICAvLyBUT0RPOiBXaWxsIHRoZSBTZXJ2aWNlQ2xpZW50IHN0aWNrIGFyb3VuZCBvbiB0aGUgSW52b2NhdGlvbkNvbnRleHQKLSAgICAgICAgLy8gb3Igd2lsbCB3ZSBuZWVkIHNvbWUgb3RoZXIgbWVjaGFuaXNtIG9mIGNyZWF0aW5nIHRoaXM/Ci0gICAgICAgIC8vIFRyeSB0byBjcmVhdGUgYW4gT3BlcmF0aW9uQ2xpZW50IGZyb20gdGhlIHBhc3NlZCBpbiBTZXJ2aWNlQ2xpZW50Ci0gICAgICAgIEludm9jYXRpb25Db250ZXh0IGljID0gcmVxdWVzdC5nZXRJbnZvY2F0aW9uQ29udGV4dCgpOwotICAgICAgICBTZXJ2aWNlQ2xpZW50IHN2Y0NsaWVudCA9IGljLmdldFNlcnZpY2VDbGllbnQoKTsKLSAgICAgICAgT3BlcmF0aW9uQ2xpZW50IG9wQ2xpZW50ID0gY3JlYXRlT3BlcmF0aW9uQ2xpZW50KHN2Y0NsaWVudCwgb3BlcmF0aW9uTmFtZSk7Ci0KLSAgICAgICAgaW5pdE9wZXJhdGlvbkNsaWVudChvcENsaWVudCwgcmVxdWVzdCk7Ci0gICAgICAgIAotICAgICAgICAvLyBTZXR1cCB0aGUgY2xpZW50IHNvIHRoYXQgaXQga25vd3Mgd2hldGhlciB0aGUgdW5kZXJseWluZyBjYWxsIHRvCi0gICAgICAgIC8vIEF4aXMyIGtub3dzIHdoZXRoZXIgb3Igbm90IHRvIHN0YXJ0IGEgbGlzdGVuaW5nIHBvcnQgZm9yIGFuCi0gICAgICAgIC8vIGFzeW5jaHJvbm91cyByZXNwb25zZS4KLSAgICAgICAgQm9vbGVhbiB1c2VBc3luY01lcCA9IChCb29sZWFuKXJlcXVlc3QuZ2V0UHJvcGVydHkoQ29uc3RhbnRzLlVTRV9BU1lOQ19NRVApOwotICAgICAgICBpZiAoKHVzZUFzeW5jTWVwICE9IG51bGwgJiYgdXNlQXN5bmNNZXAuYm9vbGVhblZhbHVlKCkpCi0gICAgICAgICAgICAgICAgfHwgb3BDbGllbnQuZ2V0T3B0aW9ucygpLmlzVXNlU2VwYXJhdGVMaXN0ZW5lcigpKSB7Ci0gICAgICAgICAgICBjb25maWd1cmVBc3luY0xpc3RlbmVyKG9wQ2xpZW50KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygKLSAgICAgICAgICAgICAgICAgICAgICAgICJBc3luY2hyb25vdXMgbWVzc2FnZSBleGNoYW5nZSBub3QgZW5hYmxlZC4gIFRoZSBpbnZvY2F0aW9uIHdpbGwgYmUgc3luY2hyb25vdXMuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQgYXhpc1JlcXVlc3RNc2dDdHggPSByZXF1ZXN0LmdldEF4aXNNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQgYXhpc1Jlc3BvbnNlTXNnQ3R4ID0gbnVsbDsKLQotICAgICAgICBNZXNzYWdlQ29udGV4dCByZXNwb25zZSA9IG51bGw7Ci0KLSAgICAgICAgQXhpc0ZhdWx0IGZhdWx0ZXhjZXB0aW9uID0KLSAgICAgICAgICAgICAgICBudWxsOyAgLy8gZG9uJ3QgbGV0IHRoZSBrZXl3b3JkICJmYXVsdCIgY29uZnVzZSB5b3UuICBUaGlzIGlzIGFuIGV4Y2VwdGlvbiBjbGFzcy4KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGV4ZWN1dGUob3BDbGllbnQsIHRydWUsIGF4aXNSZXF1ZXN0TXNnQ3R4KTsKLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGFmKSB7Ci0gICAgICAgICAgICAvLyBJZiBhbiBBeGlzRmF1bHQgd2FzIHRocm93biwgd2UgbmVlZCB0byBjbGVhbnVwIHRoZSBvcmlnaW5hbCBPcGVyYXRpb25Db250ZXh0LgotICAgICAgICAgICAgLy8gRmFpbHVyZSB0byBkbyBzbyByZXN1bHRzIGluIGEgbWVtb3J5IGxlYWsuCi0gICAgICAgICAgICBvcENsaWVudC5nZXRPcGVyYXRpb25Db250ZXh0KCkuY2xlYW51cCgpOwotICAgICAgICAgICAgLy8gc2F2ZSB0aGUgZmF1bHQgaW4gY2FzZSBpdCBkaWRuJ3QgY29tZSBmcm9tIHRoZSBlbmRwb2ludCwgYW5kIHRodXMKLSAgICAgICAgICAgIC8vIHRoZXJlIHdvdWxkIGJlIG5vIG1lc3NhZ2Ugb24gdGhlIE1lc3NhZ2VDb250ZXh0Ci0gICAgICAgICAgICBmYXVsdGV4Y2VwdGlvbiA9IGFmOwotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKGF4aXNSZXF1ZXN0TXNnQ3R4LmdldExvZ0lEU3RyaW5nKCkgKyAiIEF4aXNGYXVsdCByZWNlaXZlZCBmcm9tIGNsaWVudDogIiArCi0gICAgICAgICAgICAgICAgICAgICAgICBhZi5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIENvbGxlY3QgdGhlIHJlc3BvbnNlIE1lc3NhZ2VDb250ZXh0IGFuZCBlbnZlbG9wZQotICAgICAgICAgICAgYXhpc1Jlc3BvbnNlTXNnQ3R4ID0gb3BDbGllbnQuZ2V0TWVzc2FnZUNvbnRleHQoV1NETENvbnN0YW50cy5NRVNTQUdFX0xBQkVMX0lOX1ZBTFVFKTsKLSAgICAgICAgICAgIHJlc3BvbnNlID0gbmV3IE1lc3NhZ2VDb250ZXh0KGF4aXNSZXNwb25zZU1zZ0N0eCk7Ci0gICAgICAgICAgICByZXNwb25zZS5zZXRNRVBDb250ZXh0KHJlcXVlc3QuZ2V0TUVQQ29udGV4dCgpKTsKLQotICAgICAgICAgICAgLy8gSWYgdGhlIE1lc3NhZ2Ugb2JqZWN0IGlzIHN0aWxsIG51bGwsIHRoZW4gaXQncyBwb3NzaWJsZSB0aGF0IGEKLSAgICAgICAgICAgIC8vIGxvY2FsIEF4aXNGYXVsdCB3YXMgdGhyb3duIGFuZCB3ZSBuZWVkIHRvIHNhdmUgaXQgZm9yIGxhdGVyIHRocm93aW5nCi0gICAgICAgICAgICAvLyBXZSBkbyBub3Qgd2FudCB0byBjcmVhdGUgYSBtZXNzYWdlIGFuZCBnbyB0aHJvdWdoIHRoZSB3aG9sZSBoYW5kbGVyIG9yCi0gICAgICAgICAgICAvLyBYTUxGYXVsdCBwcm9jZXNzaW5nIGJlY2F1c2UgaXQncyB1bm5lY2Vzc2FyeS4KLSAgICAgICAgICAgIC8vIAotICAgICAgICAgICAgLy8gU2FtZSBpcyB0cnVlIGlmIHdlIGdldCBhIHZhbGlkIG5vbi1mYXVsdCBzZXJ2ZXIgcmVzcG9uc2UgYnV0IHNvbWUgamF4d3MKLSAgICAgICAgICAgIC8vIGNsaWVudCBwcm9jZXNzaW5nIChhIGhhbmRsZXIsIHBlcmhhcHMpIHRocm93cyBhbiBleGNlcHRpb24uCi0gICAgICAgICAgICAvLyAKLSAgICAgICAgICAgIC8vIElmIHRoZSByZXNwb25zZSBtZXNzYWdlIGl0c2VsZiBpcyBhIGZhdWx0IG1lc3NhZ2UsIGxldCBpdCBwYXNzIHRocm91Z2guCi0gICAgICAgICAgICBpZiAoKGZhdWx0ZXhjZXB0aW9uICE9IG51bGwpICYmICgocmVzcG9uc2UuZ2V0TWVzc2FnZSgpID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHx8ICghcmVzcG9uc2UuZ2V0TWVzc2FnZSgpLmlzRmF1bHQoKSkpKSB7Ci0gICAgICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkgZmFjdG9yeSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoTWVzc2FnZUZhY3RvcnkpRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoTWVzc2FnZUZhY3RvcnkuY2xhc3MpOwotICAgICAgICAgICAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9IGZhY3RvcnkuY3JlYXRlKHJlcXVlc3QuZ2V0TWVzc2FnZSgpLmdldFByb3RvY29sKCkpOwotICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNldExvY2FsRXhjZXB0aW9uKGZhdWx0ZXhjZXB0aW9uKTsKLSAgICAgICAgICAgICAgICByZXNwb25zZS5zZXRNZXNzYWdlKG1lc3NhZ2UpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBUaGlzIGFzc3VtZXMgdGhhdCB3ZSBhcmUgb24gdGhlIHVsdGltYXRlIGV4ZWN1dGlvbiB0aHJlYWQKLSAgICAgICAgICAgIFRocmVhZENvbnRleHRNaWdyYXRvclV0aWwucGVyZm9ybU1pZ3JhdGlvblRvVGhyZWFkKAotICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuVEhSRUFEX0NPTlRFWFRfTUlHUkFUT1JfTElTVF9JRCwgYXhpc1Jlc3BvbnNlTXNnQ3R4KTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzcG9uc2U7Ci0gICAgfQotCi0gICAgLyoKLSAgICAqICAobm9uLUphdmFkb2MpCi0gICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS5jb250cm9sbGVyLkludm9jYXRpb25Db250cm9sbGVyI2ludm9rZU9uZVdheShvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUuSW52b2NhdGlvbkNvbnRleHQpCi0gICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkb0ludm9rZU9uZVdheShNZXNzYWdlQ29udGV4dCByZXF1ZXN0KSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IGEgb25lLXdheSBpbnZvY2F0aW9uIGRvZXMgbm90IGF0dGVtcHQgdG8gdXNlIGEgc2VwYXJhdGUgY2hhbm5lbAotICAgICAgICAvLyBmb3IgdGhlIHJlc3BvbnNlLgotICAgICAgICBCb29sZWFuIHVzZUFzeW5jTWVwID0gKEJvb2xlYW4pIHJlcXVlc3QuZ2V0UHJvcGVydHkoQ29uc3RhbnRzLlVTRV9BU1lOQ19NRVApOwotICAgICAgICBpZiAodXNlQXN5bmNNZXAgIT0gbnVsbCAmJiB1c2VBc3luY01lcC5ib29sZWFuVmFsdWUoKSkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJvbmV3YXlBc3luYyIpKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gV2UgbmVlZCB0aGUgcW5hbWUgb2YgdGhlIG9wZXJhdGlvbiBiZWluZyBpbnZva2VkIHRvIGtub3cgd2hpY2ggCi0gICAgICAgIC8vIEF4aXNPcGVyYXRpb24gdGhlIE9wZXJhdGlvbkNsaWVudCBzaG91bGQgYmUgYmFzZWQgb24uCi0gICAgICAgIC8vIE5vdGUgdGhhdCB0aGUgT3BlcmF0aW9uRGVzYyBpcyBvbmx5IHNldCB0aHJvdWdoIHVzZSBvZiB0aGUgUHJveHkuIERpc3BhdGNoCi0gICAgICAgIC8vIGNsaWVudHMgZG8gbm90IHVzZSBvcGVyYXRpb25zLCBzbyB0aGUgb3BlcmF0aW9uRGVzYyB3aWxsIGJlIG51bGwuICBJbiB0aGlzCi0gICAgICAgIC8vIGNhc2UgYW4gYW5vbnltb3VzIEF4aXNTZXJ2aWNlIHdpdGggYW5veW1vdW5zIEF4aXNPcGVyYXRpb25zIGZvciB0aGUgc3VwcG9ydGVkCi0gICAgICAgIC8vIE1FUHMgd2lsbCBiZSBjcmVhdGVkOyBhbmQgaXQgaXMgdGhhdCBhbm9ueW1vdXMgb3BlcmF0aW9uIG5hbWUgd2hpY2ggbmVlZHMgdG8KLSAgICAgICAgLy8gYmUgc3BlY2lmaWVkCi0gICAgICAgIFFOYW1lIG9wZXJhdGlvbk5hbWUgPSBnZXRPcGVyYXRpb25OYW1lVG9Vc2UocmVxdWVzdCwgU2VydmljZUNsaWVudC5BTk9OX09VVF9PTkxZX09QKTsKLQotICAgICAgICBJbnZvY2F0aW9uQ29udGV4dCBpYyA9IHJlcXVlc3QuZ2V0SW52b2NhdGlvbkNvbnRleHQoKTsKLSAgICAgICAgU2VydmljZUNsaWVudCBzdmNDbGllbnQgPSBpYy5nZXRTZXJ2aWNlQ2xpZW50KCk7Ci0gICAgICAgIE9wZXJhdGlvbkNsaWVudCBvcENsaWVudCA9IGNyZWF0ZU9wZXJhdGlvbkNsaWVudChzdmNDbGllbnQsIG9wZXJhdGlvbk5hbWUpOwotCi0gICAgICAgIGluaXRPcGVyYXRpb25DbGllbnQob3BDbGllbnQsIHJlcXVlc3QpOwotCi0gICAgICAgIG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dCBheGlzUmVxdWVzdE1zZ0N0eCA9IHJlcXVlc3QuZ2V0QXhpc01lc3NhZ2VDb250ZXh0KCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGV4ZWN1dGUob3BDbGllbnQsIHRydWUsIGF4aXNSZXF1ZXN0TXNnQ3R4KTsKLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGFmKSB7Ci0gICAgICAgICAgICAvLyBKQVhXUyA2LjQuMiBzYXlzIHRvIHRocm93IGl0Li4uCi0gICAgICAgICAgICAvLyBXaGF0ZXZlciBleGNlcHRpb24gd2UgZ2V0IGhlcmUgd2lsbCBub3QgYmUgZnJvbSB0aGUgc2VydmVyIHNpbmNlIGEgb25lLXdheQotICAgICAgICAgICAgLy8gaW52b2NhdGlvbiBoYXMgbm8gcmVzcG9uc2UuICBUaGlzIHdpbGwgYWx3YXlzIGJlIGEgU0VOREVSIGZhdWx0Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoYXhpc1JlcXVlc3RNc2dDdHguZ2V0TG9nSURTdHJpbmcoKSArICIgQXhpc0ZhdWx0IHJlY2VpdmVkIGZyb20gY2xpZW50OiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFmLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKENsYXNzVXRpbHMuZ2V0Um9vdENhdXNlKGFmKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLyoKLSAgICAqICAobm9uLUphdmFkb2MpCi0gICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS5jb250cm9sbGVyLkludm9jYXRpb25Db250cm9sbGVyI2ludm9rZUFzeW5jKG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS5JbnZvY2F0aW9uQ29udGV4dCwgamF2YXgueG1sLndzLkFzeW5jSGFuZGxlcikKLSAgICAqLwotICAgIHB1YmxpYyBGdXR1cmU8Pz4gZG9JbnZva2VBc3luYyhNZXNzYWdlQ29udGV4dCByZXF1ZXN0LCBBc3luY0hhbmRsZXIgY2FsbGJhY2spIHsKLSAgICAgICAgLy8gV2UgbmVlZCB0aGUgcW5hbWUgb2YgdGhlIG9wZXJhdGlvbiBiZWluZyBpbnZva2VkIHRvIGtub3cgd2hpY2ggCi0gICAgICAgIC8vIEF4aXNPcGVyYXRpb24gdGhlIE9wZXJhdGlvbkNsaWVudCBzaG91bGQgYmUgYmFzZWQgb24uCi0gICAgICAgIC8vIE5vdGUgdGhhdCB0aGUgT3BlcmF0aW9uRGVzYyBpcyBvbmx5IHNldCB0aHJvdWdoIHVzZSBvZiB0aGUgUHJveHkuIERpc3BhdGNoCi0gICAgICAgIC8vIGNsaWVudHMgZG8gbm90IHVzZSBvcGVyYXRpb25zLCBzbyB0aGUgb3BlcmF0aW9uRGVzYyB3aWxsIGJlIG51bGwuICBJbiB0aGlzCi0gICAgICAgIC8vIGNhc2UgYW4gYW5vbnltb3VzIEF4aXNTZXJ2aWNlIHdpdGggYW5veW1vdW5zIEF4aXNPcGVyYXRpb25zIGZvciB0aGUgc3VwcG9ydGVkCi0gICAgICAgIC8vIE1FUHMgd2lsbCBiZSBjcmVhdGVkOyBhbmQgaXQgaXMgdGhhdCBhbm9ueW1vdXMgb3BlcmF0aW9uIG5hbWUgd2hpY2ggbmVlZHMgdG8KLSAgICAgICAgLy8gYmUgc3BlY2lmaWVkCi0gICAgICAgIFFOYW1lIG9wZXJhdGlvbk5hbWUgPSBnZXRPcGVyYXRpb25OYW1lVG9Vc2UocmVxdWVzdCwgU2VydmljZUNsaWVudC5BTk9OX09VVF9JTl9PUCk7Ci0KLSAgICAgICAgLy8gVE9ETzogV2lsbCB0aGUgU2VydmljZUNsaWVudCBzdGljayBhcm91bmQgb24gdGhlIEludm9jYXRpb25Db250ZXh0Ci0gICAgICAgIC8vIG9yIHdpbGwgd2UgbmVlZCBzb21lIG90aGVyIG1lY2hhbmlzbSBvZiBjcmVhdGluZyB0aGlzPwotICAgICAgICAvLyBUcnkgdG8gY3JlYXRlIGFuIE9wZXJhdGlvbkNsaWVudCBmcm9tIHRoZSBwYXNzZWQgaW4gU2VydmljZUNsaWVudAotICAgICAgICBJbnZvY2F0aW9uQ29udGV4dCBpYyA9IHJlcXVlc3QuZ2V0SW52b2NhdGlvbkNvbnRleHQoKTsKLSAgICAgICAgU2VydmljZUNsaWVudCBzdmNDbGllbnQgPSBpYy5nZXRTZXJ2aWNlQ2xpZW50KCk7Ci0gICAgICAgIE9wZXJhdGlvbkNsaWVudCBvcENsaWVudCA9IGNyZWF0ZU9wZXJhdGlvbkNsaWVudChzdmNDbGllbnQsIG9wZXJhdGlvbk5hbWUpOwotCi0gICAgICAgIGluaXRPcGVyYXRpb25DbGllbnQob3BDbGllbnQsIHJlcXVlc3QpOwotCi0gICAgICAgIC8vIFNldHVwIHRoZSBjbGllbnQgc28gdGhhdCBpdCBrbm93cyB3aGV0aGVyIHRoZSB1bmRlcmx5aW5nIGNhbGwgdG8KLSAgICAgICAgLy8gQXhpczIga25vd3Mgd2hldGhlciBvciBub3QgdG8gc3RhcnQgYSBsaXN0ZW5pbmcgcG9ydCBmb3IgYW4KLSAgICAgICAgLy8gYXN5bmNocm9ub3VzIHJlc3BvbnNlLgotICAgICAgICBCb29sZWFuIHVzZUFzeW5jTWVwID0gKEJvb2xlYW4pcmVxdWVzdC5nZXRQcm9wZXJ0eShDb25zdGFudHMuVVNFX0FTWU5DX01FUCk7Ci0gICAgICAgIGlmICgodXNlQXN5bmNNZXAgIT0gbnVsbCAmJiB1c2VBc3luY01lcC5ib29sZWFuVmFsdWUoKSkKLSAgICAgICAgICAgICAgICB8fCBvcENsaWVudC5nZXRPcHRpb25zKCkuaXNVc2VTZXBhcmF0ZUxpc3RlbmVyKCkpIHsKLSAgICAgICAgICAgIGNvbmZpZ3VyZUFzeW5jTGlzdGVuZXIob3BDbGllbnQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKAotICAgICAgICAgICAgICAgICAgICAgICAgIkFzeW5jaHJvbm91cyBtZXNzYWdlIGV4Y2hhbmdlIG5vdCBlbmFibGVkLiAgVGhlIGludm9jYXRpb24gd2lsbCBiZSBzeW5jaHJvbm91cy4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0KLSAgICAgICAgQ2FsbGJhY2tGdXR1cmUgY2JmID0gbnVsbDsKLSAgICAgICAgaWYgKGNhbGxiYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNiZiA9IG5ldyBDYWxsYmFja0Z1dHVyZShpYywgY2FsbGJhY2spOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJJQ0VycjQiKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBvcENsaWVudC5zZXRDYWxsYmFjayhjYmYpOwotCi0gICAgICAgIG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dCBheGlzUmVxdWVzdE1zZ0N0eCA9IHJlcXVlc3QuZ2V0QXhpc01lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBleGVjdXRlKG9wQ2xpZW50LCBmYWxzZSwgYXhpc1JlcXVlc3RNc2dDdHgpOwotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgYWYpIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhheGlzUmVxdWVzdE1zZ0N0eC5nZXRMb2dJRFN0cmluZygpICsgIiBBeGlzRmF1bHQgcmVjZWl2ZWQgZnJvbSBjbGllbnQ6ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgYWYuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBTYXZlIHRoZSBleGNlcHRpb24gb24gdGhlIGNhbGxiYWNrLiAgVGhlIGNsaWVudCB3aWxsIGxlYXJuIGFib3V0IHRoZSBlcnJvciB3aGVuIHRoZXkgdHJ5IHRvCi0gICAgICAgICAgICAgKiByZXRyaWV2ZSB0aGUgYXN5bmMgcmVzdWx0cyB2aWEgdGhlIFJlc3BvbnNlLmdldCgpLiAgIkVycm9ycyB0aGF0IG9jY3VyIGR1cmluZyB0aGUgaW52b2NhdGlvbgotICAgICAgICAgICAgICogYXJlIHJlcG9ydGVkIHZpYSBhbiBleGNlcHRpb24gd2hlbiB0aGUgY2xpZW50IGF0dGVtcHRzIHRvIHJldHJpZXZlIHRoZSByZXN1bHRzIG9mIHRoZSBvcGVyYXRpb24uIgotICAgICAgICAgICAgICogLS0gSkFYV1MgNC4zLjMKLSAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAvKgotICAgICAgICAgICAgKiBUT0RPOiAgVGhpcyBpcyB0aGUgYXBwcm9wcmlhdGUgdGhpbmcgdG8gZG8gaGVyZSBzaW5jZSB0aGUgdGhyb3duIGV4Y2VwdGlvbiBtYXkgb2NjdXIgYmVmb3JlCi0gICAgICAgICAgICAqIHdlIHN3aXRjaCB0aHJlYWRzIHRvIHRoZSBhc3luYyB0aHJlYWQuICBCdXQuLi4gd2hhdCBoYXBwZW5zIGlmIHdlJ3ZlIGFscmVhZHkgc3dpdGNoZWQgb3ZlcgotICAgICAgICAgICAgKiB0byB0aGUgYXN5bmMgdGhyZWFkPyAgU28gZmFyLCBpdCBhcHBlYXJzIHRoYXQgdGhlIGV4Y2VwdGlvbiBnZXRzIHNldCBvbiB0aGUgRnV0dXJlVGFzawotICAgICAgICAgICAgKiBDb25jdXJyZW50IG9iamVjdCwgYW5kIHdlIG5ldmVyIGhpdCB0aGlzIHNjb3BlLiAgVGhpcyBtZWFucyB0aGF0IGxhdGVyLCB3aGVuIHRoZSBjbGllbnQKLSAgICAgICAgICAgICogY2FsbHMgZnV0dXJlLmdldCgpLCBubyBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24gZGVzcGl0ZSB3aGF0IHRoZSBzcGVjIHNheXMuICBUaGUgY2xpZW50IGNhbiwKLSAgICAgICAgICAgICogaG93ZXZlciwgcmV0cmlldmUgZXJyb3JzIHZpYSBpdCdzIEFzeW5jSGFuZGxlci4KLSAgICAgICAgICAgICovCi0gICAgICAgICAgICBjYmYub25FcnJvcihhZik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gY2JmLmdldEZ1dHVyZVRhc2soKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICogIChub24tSmF2YWRvYykKLSAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLmNvbnRyb2xsZXIuSW52b2NhdGlvbkNvbnRyb2xsZXIjaW52b2tlQXN5bmMob3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLkludm9jYXRpb25Db250ZXh0KQotICAgICovCi0gICAgcHVibGljIFJlc3BvbnNlIGRvSW52b2tlQXN5bmMoTWVzc2FnZUNvbnRleHQgcmVxdWVzdCkgewotICAgICAgICAvLyBXZSBuZWVkIHRoZSBxbmFtZSBvZiB0aGUgb3BlcmF0aW9uIGJlaW5nIGludm9rZWQgdG8ga25vdyB3aGljaCAKLSAgICAgICAgLy8gQXhpc09wZXJhdGlvbiB0aGUgT3BlcmF0aW9uQ2xpZW50IHNob3VsZCBiZSBiYXNlZCBvbi4KLSAgICAgICAgLy8gTm90ZSB0aGF0IHRoZSBPcGVyYXRpb25EZXNjIGlzIG9ubHkgc2V0IHRocm91Z2ggdXNlIG9mIHRoZSBQcm94eS4gRGlzcGF0Y2gKLSAgICAgICAgLy8gY2xpZW50cyBkbyBub3QgdXNlIG9wZXJhdGlvbnMsIHNvIHRoZSBvcGVyYXRpb25EZXNjIHdpbGwgYmUgbnVsbC4gIEluIHRoaXMKLSAgICAgICAgLy8gY2FzZSBhbiBhbm9ueW1vdXMgQXhpc1NlcnZpY2Ugd2l0aCBhbm95bW91bnMgQXhpc09wZXJhdGlvbnMgZm9yIHRoZSBzdXBwb3J0ZWQKLSAgICAgICAgLy8gTUVQcyB3aWxsIGJlIGNyZWF0ZWQ7IGFuZCBpdCBpcyB0aGF0IGFub255bW91cyBvcGVyYXRpb24gbmFtZSB3aGljaCBuZWVkcyB0bwotICAgICAgICAvLyBiZSBzcGVjaWZpZWQKLSAgICAgICAgUU5hbWUgb3BlcmF0aW9uTmFtZSA9IGdldE9wZXJhdGlvbk5hbWVUb1VzZShyZXF1ZXN0LCBTZXJ2aWNlQ2xpZW50LkFOT05fT1VUX0lOX09QKTsKLQotICAgICAgICAvLyBUT0RPOiBXaWxsIHRoZSBTZXJ2aWNlQ2xpZW50IHN0aWNrIGFyb3VuZCBvbiB0aGUgSW52b2NhdGlvbkNvbnRleHQKLSAgICAgICAgLy8gb3Igd2lsbCB3ZSBuZWVkIHNvbWUgb3RoZXIgbWVjaGFuaXNtIG9mIGNyZWF0aW5nIHRoaXM/Ci0gICAgICAgIC8vIFRyeSB0byBjcmVhdGUgYW4gT3BlcmF0aW9uQ2xpZW50IGZyb20gdGhlIHBhc3NlZCBpbiBTZXJ2aWNlQ2xpZW50Ci0gICAgICAgIEludm9jYXRpb25Db250ZXh0IGljID0gcmVxdWVzdC5nZXRJbnZvY2F0aW9uQ29udGV4dCgpOwotICAgICAgICBTZXJ2aWNlQ2xpZW50IHN2Y0NsaWVudCA9IGljLmdldFNlcnZpY2VDbGllbnQoKTsKLSAgICAgICAgT3BlcmF0aW9uQ2xpZW50IG9wQ2xpZW50ID0gY3JlYXRlT3BlcmF0aW9uQ2xpZW50KHN2Y0NsaWVudCwgb3BlcmF0aW9uTmFtZSk7Ci0KLSAgICAgICAgaW5pdE9wZXJhdGlvbkNsaWVudChvcENsaWVudCwgcmVxdWVzdCk7Ci0KLSAgICAgICAgLy8gU2V0dXAgdGhlIGNsaWVudCBzbyB0aGF0IGl0IGtub3dzIHdoZXRoZXIgdGhlIHVuZGVybHlpbmcgY2FsbCB0bwotICAgICAgICAvLyBBeGlzMiBrbm93cyB3aGV0aGVyIG9yIG5vdCB0byBzdGFydCBhIGxpc3RlbmluZyBwb3J0IGZvciBhbgotICAgICAgICAvLyBhc3luY2hyb25vdXMgcmVzcG9uc2UuCi0gICAgICAgIEJvb2xlYW4gdXNlQXN5bmNNZXAgPSAoQm9vbGVhbilyZXF1ZXN0LmdldFByb3BlcnR5KENvbnN0YW50cy5VU0VfQVNZTkNfTUVQKTsKLSAgICAgICAgaWYgKCh1c2VBc3luY01lcCAhPSBudWxsICYmIHVzZUFzeW5jTWVwLmJvb2xlYW5WYWx1ZSgpKQotICAgICAgICAgICAgICAgIHx8IG9wQ2xpZW50LmdldE9wdGlvbnMoKS5pc1VzZVNlcGFyYXRlTGlzdGVuZXIoKSkgewotICAgICAgICAgICAgY29uZmlndXJlQXN5bmNMaXN0ZW5lcihvcENsaWVudCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoCi0gICAgICAgICAgICAgICAgICAgICAgICAiQXN5bmNocm9ub3VzIG1lc3NhZ2UgZXhjaGFuZ2Ugbm90IGVuYWJsZWQuICBUaGUgaW52b2NhdGlvbiB3aWxsIGJlIHN5bmNocm9ub3VzLiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQXN5bmNSZXNwb25zZSByZXNwID0gaWMuZ2V0QXN5bmNSZXNwb25zZUxpc3RlbmVyKCk7Ci0gICAgICAgIFBvbGxpbmdGdXR1cmUgcGYgPSBuZXcgUG9sbGluZ0Z1dHVyZShpYyk7Ci0gICAgICAgIG9wQ2xpZW50LnNldENhbGxiYWNrKHBmKTsKLQotICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQgYXhpc1JlcXVlc3RNc2dDdHggPSByZXF1ZXN0LmdldEF4aXNNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZXhlY3V0ZShvcENsaWVudCwgZmFsc2UsIGF4aXNSZXF1ZXN0TXNnQ3R4KTsKLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGFmKSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoYXhpc1JlcXVlc3RNc2dDdHguZ2V0TG9nSURTdHJpbmcoKSArICIgQXhpc0ZhdWx0IHJlY2VpdmVkIGZyb20gY2xpZW50OiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFmLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogU2F2ZSB0aGUgZXhjZXB0aW9uIG9uIHRoZSBjYWxsYmFjay4gIFRoZSBjbGllbnQgd2lsbCBsZWFybiBhYm91dCB0aGUgZXJyb3Igd2hlbiB0aGV5IHRyeSB0bwotICAgICAgICAgICAgICogcmV0cmlldmUgdGhlIGFzeW5jIHJlc3VsdHMgdmlhIHRoZSBSZXNwb25zZS5nZXQoKS4gICJFcnJvcnMgdGhhdCBvY2N1ciBkdXJpbmcgdGhlIGludm9jYXRpb24KLSAgICAgICAgICAgICAqIGFyZSByZXBvcnRlZCB2aWEgYW4gZXhjZXB0aW9uIHdoZW4gdGhlIGNsaWVudCBhdHRlbXB0cyB0byByZXRyaWV2ZSB0aGUgcmVzdWx0cyBvZiB0aGUgb3BlcmF0aW9uLiIKLSAgICAgICAgICAgICAqIC0tIEpBWFdTIDQuMy4zCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHBmLm9uRXJyb3IoYWYpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3A7Ci0gICAgfQotCi0gICAgLyoKLSAgICAqIChub24tSmF2YWRvYykKLSAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLmNvbnRyb2xsZXIuSW52b2NhdGlvbkNvbnRyb2xsZXIjcHJlcGFyZVJlcXVlc3Qob3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLk1lc3NhZ2VDb250ZXh0KQotICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJlcGFyZVJlcXVlc3QoTWVzc2FnZUNvbnRleHQgcmVxdWVzdE1zZ0N0eCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKHJlcXVlc3RNc2dDdHggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vdGhyb3cgYW4gZXhjZXB0aW9uCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dCBheGlzUmVxdWVzdE1zZ0N0eCA9Ci0gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RNc2dDdHguZ2V0QXhpc01lc3NhZ2VDb250ZXh0KCk7Ci0KLSAgICAgICAgICAgIC8vIFRoZSBNZXNzYWdlQ29udGV4dCB3aWxsIGNvbnRhaW4gYSBNZXNzYWdlIG9iamVjdCB3aXRoIHRoZQotICAgICAgICAgICAgLy8gY29udGVudHMgdGhhdCBuZWVkIHRvIGJlIHNlbnQuICBXZSBuZWVkIHRvIGdldCB0aG9zZSBjb250ZW50cwotICAgICAgICAgICAgLy8gaW4gYSBmb3JtIHRoYXQgQXhpczIgY2FuIGNvbnN1bWUgdGhlbSwgYW4gQVhJT00gU09BUEVudmVsb3BlLgotICAgICAgICAgICAgTWVzc2FnZVV0aWxzLnB1dE1lc3NhZ2VPbk1lc3NhZ2VDb250ZXh0KAotICAgICAgICAgICAgICAgICAgICByZXF1ZXN0TXNnQ3R4LmdldE1lc3NhZ2UoKSwgIC8vIEpBWC1XUyBNZXNzYWdlCi0gICAgICAgICAgICAgICAgICAgIGF4aXNSZXF1ZXN0TXNnQ3R4IC8vIEF4aXMgMiBNZXNzYWdlQ29udGV4dAotICAgICAgICAgICAgKTsKLQotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJQcm9wZXJ0aWVzOiAiICsgYXhpc1JlcXVlc3RNc2dDdHguZ2V0UHJvcGVydGllcygpLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChXZWJTZXJ2aWNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkKLSAgICAgICAgICAgICAgICAgICAgLm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoInByZXBhcmVSZXF1ZXN0RmFpbCIpKTsKLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGUpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkKLSAgICAgICAgICAgICAgICAgICAgLm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoInByZXBhcmVSZXF1ZXN0RmFpbCIpLCBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgKiAobm9uLUphdmFkb2MpCi0gICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS5jb250cm9sbGVyLkludm9jYXRpb25Db250cm9sbGVyI3ByZXBhcmVSZXNwb25zZShvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUuTWVzc2FnZUNvbnRleHQpCi0gICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcmVwYXJlUmVzcG9uc2UoTWVzc2FnZUNvbnRleHQgcmVzcG9uc2VNc2dDdHgpIHsKLQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbml0T3BlcmF0aW9uQ2xpZW50KE9wZXJhdGlvbkNsaWVudCBvcENsaWVudCwgTWVzc2FnZUNvbnRleHQgcmVxdWVzdE1zZ0N0eCkgewotICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQgYXhpc1JlcXVlc3QgPSByZXF1ZXN0TXNnQ3R4LmdldEF4aXNNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBzZXR1cFByb3BlcnRpZXMocmVxdWVzdE1zZ0N0eCk7Ly8sIGF4aXNSZXF1ZXN0LmdldE9wdGlvbnMoKSk7Ci0KLSAgICAgICAgaWYgKG9wQ2xpZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIE9wdGlvbnMgb3B0aW9ucyA9IG9wQ2xpZW50LmdldE9wdGlvbnMoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gR2V0IHRoZSB0YXJnZXQgZW5kcG9pbnQgYWRkcmVzcyBhbmQgc2V0dXAgdGhlIFRPIGVuZHBvaW50IAotICAgICAgICAgICAgLy8gcmVmZXJlbmNlLiAgVGhpcyB0ZWxscyB1cyB3aGVyZSB0aGUgcmVxdWVzdCBpcyBnb2luZy4KLSAgICAgICAgICAgIEVuZHBvaW50UmVmZXJlbmNlIHRvRVBSID0gYXhpc1JlcXVlc3QuZ2V0VG8oKTsKLQotICAgICAgICAgICAgaWYgKHRvRVBSID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdGFyZ2V0VXJsID0gKFN0cmluZylyZXF1ZXN0TXNnQ3R4LmdldFByb3BlcnR5KAotICAgICAgICAgICAgICAgICAgICAgICAgQmluZGluZ1Byb3ZpZGVyLkVORFBPSU5UX0FERFJFU1NfUFJPUEVSVFkpOwotICAgICAgICAgICAgICAgIHRvRVBSID0gbmV3IEVuZHBvaW50UmVmZXJlbmNlKHRhcmdldFVybCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIG9wdGlvbnMuc2V0VG8odG9FUFIpOwotCi0gICAgICAgICAgICAvLyBHZXQgdGhlIFNPQVAgQWN0aW9uIChpZiBuZWVkZWQpCi0gICAgICAgICAgICBTdHJpbmcgc29hcEFjdGlvbiA9IENsaWVudFV0aWxzLmZpbmRTT0FQQWN0aW9uKHJlcXVlc3RNc2dDdHgpOwotICAgICAgICAgICAgb3B0aW9ucy5zZXRBY3Rpb24oc29hcEFjdGlvbik7Ci0gICAgICAgICAgICAvLyBnZXQgdGhlIHRpbWVvdXQgZnJvbSB0aGUgcmVxdWVzdCBtZXNzYWdlIGNvbnRleHQgb3B0aW9ucyBhcyBpdCBtYXkgaGF2ZSBiZWVuCi0gICAgICAgICAgICAvLyBzZXQgYnkgdGhlIHVzZXI7IGlmIGl0IHdhcyBub3Qgc2V0IGJ5IHRoZSB1c2VyIHdlIHdpbGwganVzdCBiZSBzZXR0aW5nIHRoZQotICAgICAgICAgICAgLy8gdGltZW91dCBvbiB0aGUgb3BlcmF0aW9uIGNsaWVudCB0byB0aGUgZGVmYXVsdCBzbyBpdCB3aWxsIG5vdCBoYXZlIGEgbmVnYXRpdmUKLSAgICAgICAgICAgIC8vIGVmZmVjdDsgdGhpcyBsb2dpYyBpcyByZWxpYW50IG9uIHRoZSBmYWN0IHRoZSBKQVgtV1MgTWVzc2FnZUNvbnRleHQgaXMgZGVsZWdhdGluZwotICAgICAgICAgICAgLy8gdG8gdGhlIEF4aXMyIE9wdGlvbnMgb2JqZWN0IGFuZCBub3Qgc3RvcmluZyBpdHMgb3duIHByb3BlcnR5IGJhZwotICAgICAgICAgICAgbG9uZyB0aW1lb3V0ID0gYXhpc1JlcXVlc3QuZ2V0T3B0aW9ucygpLmdldFRpbWVPdXRJbk1pbGxpU2Vjb25kcygpOwotICAgICAgICAgICAgb3B0aW9ucy5zZXRUaW1lT3V0SW5NaWxsaVNlY29uZHModGltZW91dCk7Ci0KLSAgICAgICAgICAgIC8vIFVzZSB0aGUgT3BlcmF0aW9uQ2xpZW50IHRvIHNlbmQgdGhlIHJlcXVlc3QgYW5kIHB1dCB0aGUgY29udGVudHMKLSAgICAgICAgICAgIC8vIG9mIHRoZSByZXNwb25zZSBpbiB0aGUgcmVzcG9uc2UgTWVzc2FnZUNvbnRleHQuCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIC8vIFNldCB0aGUgQXhpczIgcmVxdWVzdCBNZXNzYWdlQ29udGV4dAotICAgICAgICAgICAgICAgIG9wQ2xpZW50LmFkZE1lc3NhZ2VDb250ZXh0KGF4aXNSZXF1ZXN0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vVE9ETzogRG8gc29tZXRoaW5nCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVc2UgdGhlIHByb3ZpZGVkIFNlcnZpY2VDbGllbnQgaW5zdGFuY2UgdG8gY3JlYXRlIGFuIE9wZXJhdGlvbkNsaWVudCBpZGVudGlmaWVkIGJ5IHRoZQotICAgICAqIG9wZXJhdGlvbiBRTmFtZSBwcm92aWRlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzYwotICAgICAqIEBwYXJhbSBvcGVyYXRpb24KLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHJpdmF0ZSBPcGVyYXRpb25DbGllbnQgY3JlYXRlT3BlcmF0aW9uQ2xpZW50KFNlcnZpY2VDbGllbnQgc2MsIFFOYW1lIG9wZXJhdGlvbikgewotICAgICAgICBpZiAoc2MgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeQotICAgICAgICAgICAgICAgICAgICAubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiSUNDcmVhdGVPcENsaWVudEVycjEiKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG9wZXJhdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Ci0gICAgICAgICAgICAgICAgICAgIC5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJJQ0NyZWF0ZU9wQ2xpZW50RXJyMiIpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJDcmVhdGluZyBPcGVyYXRpb25DbGllbnQgZm9yIG9wZXJhdGlvbjogIiArIG9wZXJhdGlvbik7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgT3BlcmF0aW9uQ2xpZW50IGNsaWVudCA9IHNjLmNyZWF0ZUNsaWVudChvcGVyYXRpb24pOwotICAgICAgICAgICAgcmV0dXJuIGNsaWVudDsKLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGUpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY29uZmlndXJlQXN5bmNMaXN0ZW5lcihPcGVyYXRpb25DbGllbnQgY2xpZW50KSB7Ci0gICAgICAgIGNsaWVudC5nZXRPcHRpb25zKCkuc2V0VXNlU2VwYXJhdGVMaXN0ZW5lcih0cnVlKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICogVE9ETzogVGhpcyBpcyBhIGZpcnN0IHBhc3MgYXQgZmlsdGVyaW5nIHRoZSBwcm9wZXJ0aWVzIHRoYXQgYXJlIHNldCBvbiB0aGUKLSAgICAqIFJlcXVlc3RDb250ZXh0LiAgUmlnaHQgbm93IGl0J3MgY2FsbGVkIGR1cmluZyB0aGUgaW52b2tlLCBidXQgbmVlZHMgdG8gYmUKLSAgICAqIG1vdmVkIG92ZXIgdG8gd2hlbiB0aGUgcHJvcGVydHkgaXMgc2V0LiAgVGhpcyBzaG91bGQgbm90IGJlIGluIHRoZSBwYXRoCi0gICAgKiBvZiBwZXJmb3JtYW5jZS4KLSAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzZXR1cFByb3BlcnRpZXMoTWVzc2FnZUNvbnRleHQgbWMpIHsvLywgT3B0aW9ucyBvcHMpIHsKLQotICAgICAgICAvLyBFbmFibGUgTVRPTQotICAgICAgICBNZXNzYWdlIG1zZyA9IG1jLmdldE1lc3NhZ2UoKTsKLSAgICAgICAgaWYgKG1zZy5pc01UT01FbmFibGVkKCkpIHsKLSAgICAgICAgICAgIG1jLnNldFByb3BlcnR5KENvbmZpZ3VyYXRpb24uRU5BQkxFX01UT00sICJ0cnVlIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBFbmFibGUgc2Vzc2lvbiBtYW5hZ2VtZW50Ci0gICAgICAgIGlmIChtYy5pc01haW50YWluU2Vzc2lvbigpKSB7Ci0gICAgICAgICAgICBtYy5nZXRBeGlzTWVzc2FnZUNvbnRleHQoKS5nZXRPcHRpb25zKCkuc2V0TWFuYWdlU2Vzc2lvbih0cnVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiBCQVNJQ19BVVRIIGlzIGVuYWJsZWQuICBJZiBzbywgbWFrZSBzdXJlCi0gICAgICAgIC8vIHRoZSBwcm9wZXJ0aWVzIGFyZSBzZXR1cCBjb3JyZWN0bHkuCi0gICAgICAgIGlmIChtYy5jb250YWluc0tleShCaW5kaW5nUHJvdmlkZXIuVVNFUk5BTUVfUFJPUEVSVFkpIHx8Ci0gICAgICAgICAgICBtYy5jb250YWluc0tleShCaW5kaW5nUHJvdmlkZXIuUEFTU1dPUkRfUFJPUEVSVFkpKSB7Ci0KLSAgICAgICAgICAgIFN0cmluZyB1c2VySWQgPSAoU3RyaW5nKW1jLmdldFByb3BlcnR5KEJpbmRpbmdQcm92aWRlci5VU0VSTkFNRV9QUk9QRVJUWSk7Ci0gICAgICAgICAgICBpZiAodXNlcklkID09IG51bGwgfHwgdXNlcklkID09ICIiKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeQotICAgICAgICAgICAgICAgICAgICAgICAgLm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoImNoZWNrVXNlck5hbWUiKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0cmluZyBwYXNzd29yZCA9IG51bGw7Ci0gICAgICAgICAgICBpZiAobWMuY29udGFpbnNLZXkoQmluZGluZ1Byb3ZpZGVyLlBBU1NXT1JEX1BST1BFUlRZKSkgewotICAgICAgICAgICAgICAgIHBhc3N3b3JkID0gKFN0cmluZykgbWMuZ2V0UHJvcGVydHkoQmluZGluZ1Byb3ZpZGVyLlBBU1NXT1JEX1BST1BFUlRZKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgVVJMIHVybCA9IG51bGw7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHVybCA9IG5ldyBVUkwoKFN0cmluZyltYwotICAgICAgICAgICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KEJpbmRpbmdQcm92aWRlci5FTkRQT0lOVF9BRERSRVNTX1BST1BFUlRZKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBIdHRwVHJhbnNwb3J0UHJvcGVydGllcy5BdXRoZW50aWNhdG9yIGJhc2ljQXV0aGVudGljYXRpb24gPQotICAgICAgICAgICAgICAgICAgICBuZXcgSHR0cFRyYW5zcG9ydFByb3BlcnRpZXMuQXV0aGVudGljYXRvcigpOwotICAgICAgICAgICAgYmFzaWNBdXRoZW50aWNhdGlvbi5zZXRVc2VybmFtZSh1c2VySWQpOwotICAgICAgICAgICAgYmFzaWNBdXRoZW50aWNhdGlvbi5zZXRQYXNzd29yZChwYXNzd29yZCk7Ci0gICAgICAgICAgICBiYXNpY0F1dGhlbnRpY2F0aW9uLnNldEhvc3QodXJsLmdldEhvc3QoKSk7Ci0gICAgICAgICAgICBiYXNpY0F1dGhlbnRpY2F0aW9uLnNldFBvcnQodXJsLmdldFBvcnQoKSk7Ci0gICAgICAgICAgICBiYXNpY0F1dGhlbnRpY2F0aW9uLnNldFByZWVtcHRpdmVBdXRoZW50aWNhdGlvbih0cnVlKTsKLQotICAgICAgICAgICAgbWMuc2V0UHJvcGVydHkoSFRUUENvbnN0YW50cy5BVVRIRU5USUNBVEUsIGJhc2ljQXV0aGVudGljYXRpb24pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgUU5hbWUgZ2V0T3BlcmF0aW9uTmFtZVRvVXNlKE1lc3NhZ2VDb250ZXh0IHJlcXVlc3RNc2dDdHgsIFFOYW1lIGRlZmF1bHRPcE5hbWUpIHsKLSAgICAgICAgLy8gV2UgbmVlZCB0aGUgcW5hbWUgb2YgdGhlIG9wZXJhdGlvbiBiZWluZyBpbnZva2VkIHRvIGtub3cgd2hpY2ggCi0gICAgICAgIC8vIEF4aXNPcGVyYXRpb24gdGhlIE9wZXJhdGlvbkNsaWVudCBzaG91bGQgYmUgYmFzZWQgb24uCi0gICAgICAgIC8vIE5vdGUgdGhhdCB0aGUgT3BlcmF0aW9uRGVzYyBpcyBvbmx5IHNldCB0aHJvdWdoIHVzZSBvZiB0aGUgUHJveHkuIERpc3BhdGNoCi0gICAgICAgIC8vIGNsaWVudHMgZG8gbm90IHVzZSBvcGVyYXRpb25zLCBzbyB0aGUgb3BlcmF0aW9uRGVzYyB3aWxsIGJlIG51bGwuICBJbiB0aGlzCi0gICAgICAgIC8vIGNhc2UgYW4gYW5vbnltb3VzIEF4aXNTZXJ2aWNlIHdpdGggYW5vbnltb3VzIEF4aXNPcGVyYXRpb25zIGZvciB0aGUgc3VwcG9ydGVkCi0gICAgICAgIC8vIE1FUHMgd2lsbCBiZSBjcmVhdGVkOyBhbmQgaXQgaXMgdGhhdCBhbm9ueW1vdXMgb3BlcmF0aW9uIG5hbWUgd2hpY2ggbmVlZHMgdG8KLSAgICAgICAgLy8gYmUgc3BlY2lmaWVkCi0gICAgICAgIFFOYW1lIG9wZXJhdGlvbk5hbWUgPSBudWxsOwotICAgICAgICBPcGVyYXRpb25EZXNjcmlwdGlvbiBvcERlc2MgPSByZXF1ZXN0TXNnQ3R4LmdldE9wZXJhdGlvbkRlc2NyaXB0aW9uKCk7Ci0gICAgICAgIGlmIChvcERlc2MgIT0gbnVsbCAmJiBvcERlc2MuZ2V0QXhpc09wZXJhdGlvbigpICE9IG51bGwpCi0gICAgICAgICAgICBvcGVyYXRpb25OYW1lID0gb3BEZXNjLmdldE5hbWUoKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgb3BlcmF0aW9uTmFtZSA9IGRlZmF1bHRPcE5hbWU7Ci0gICAgICAgIHJldHVybiBvcGVyYXRpb25OYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEV4ZWN1dGVzIHRoZSBPcGVyYXRpb25DbGllbnQKLSAgICAgKgotICAgICAqIEBwYXJhbSBvcENsaWVudCAgIC0gRnVsbHkgY29uZmlndXJlZCBPcGVyYXRpb25DbGllbnQKLSAgICAgKiBAcGFyYW0gYmxvY2sgICAgICAtIEluZGljYXRlcyBpZiBibG9ja2luZyBvciBub24tYmxvY2tpbmcgZXhlY3V0ZQotICAgICAqIEBwYXJhbSBtc2dDb250ZXh0IC0gQXhpczIgTWVzc2FnZUNvbnRleHQKLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdCAtIEFsbCBleGNlcHRpb25zIGFyZSByZXR1cm5lZCBhcyBBeGlzRmF1bHRzCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGV4ZWN1dGUoT3BlcmF0aW9uQ2xpZW50IG9wQ2xpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gYmxvY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gUHJlLUV4ZWN1dGUgbG9nZ2luZyBhbmQgc2V0dXAKLSAgICAgICAgICAgIHByZUV4ZWN1dGUob3BDbGllbnQsIGJsb2NrLCBtc2dDb250ZXh0KTsKLQotICAgICAgICAgICAgLy8gSW52b2tlIHRoZSBPcGVyYXRpb25DbGllbnQKLSAgICAgICAgICAgIG9wQ2xpZW50LmV4ZWN1dGUoYmxvY2spOwotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkgewotICAgICAgICAgICAgLy8gQ2F0Y2ggYWxsIFRocm93YWJsZSAoaW5jbHVkaW5nIHJ1bnRpbWUgZXhjZXB0aW9ucyBhbmQgRXJyb3JzKSBhbmQKLSAgICAgICAgICAgIC8vIHRocm93IGFzIEF4aXNGYXVsdC4KLSAgICAgICAgICAgIC8vIFNpbmNlIGUgY291bGQgYmUgYSBUaHJvd2FibGUgKG9yIEVycm9yKSBpbnN0ZWFkIG9mIGFuIEV4Y2VwdGlvbiwgd2UnbGwgaGF2ZSB0byB3cmFwIGl0OgotICAgICAgICAgICAgdGhyb3cgQXhpc0ZhdWx0Lm1ha2VGYXVsdChFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIC8vIFBvc3QtRXhlY3V0ZSBsb2dnaW5nIGFuZCBzZXR1cAotICAgICAgICAgICAgcG9zdEV4ZWN1dGUob3BDbGllbnQsIGJsb2NrLCBtc2dDb250ZXh0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCBieSBleGVjdXRlKE9wZXJhdGlvbkNsaWVudCkgdG8gcGVyZm9ybSBwcmUtZXhlY3V0ZSB0YXNrcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvcENsaWVudAotICAgICAqIEBwYXJhbSBibG9jayAgICAgIC0gSW5kaWNhdGVzIGlmIGJsb2NraW5nIG9yIG5vbi1ibG9ja2luZyBleGVjdXRlCi0gICAgICogQHBhcmFtIG1zZ0NvbnRleHQgLSBBeGlzMiBNZXNzYWdlQ29udGV4dAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBwcmVFeGVjdXRlKE9wZXJhdGlvbkNsaWVudCBvcENsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGJsb2NrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgLy8gVGhpcyBhc3N1bWVzIHRoYXQgd2UgYXJlIG9uIHRoZSB1bHRpbWF0ZSBleGVjdXRpb24gdGhyZWFkCi0KLSAgICAgICAgLy9UaGlzIGhhcyB0byBiZSBoZXJlIHNvIHRoZSBUaHJlYWRDb250ZXh0TWlncmF0b3IgY2FuIHBpY2sgaXQgdXAuCi0gICAgICAgIG1zZ0NvbnRleHQuZ2V0T3B0aW9ucygpLnNldFVzZVNlcGFyYXRlTGlzdGVuZXIob3BDbGllbnQuZ2V0T3B0aW9ucygpLmlzVXNlU2VwYXJhdGVMaXN0ZW5lcigpKTsKLQotICAgICAgICBUaHJlYWRDb250ZXh0TWlncmF0b3JVdGlsCi0gICAgICAgICAgICAgICAgLnBlcmZvcm1NaWdyYXRpb25Ub0NvbnRleHQoQ29uc3RhbnRzLlRIUkVBRF9DT05URVhUX01JR1JBVE9SX0xJU1RfSUQsIG1zZ0NvbnRleHQpOwotICAgICAgICAKLSAgICAgICAgLy9FbmFibGUgdGhlIFRocmVhZENvbnRleHRNaWdyYXRvciB0byBvdmVycmlkZSBVc2VTZXBhcmF0ZUxpc3RlbmVyCi0gICAgICAgIG9wQ2xpZW50LmdldE9wdGlvbnMoKS5zZXRVc2VTZXBhcmF0ZUxpc3RlbmVyKG1zZ0NvbnRleHQuZ2V0T3B0aW9ucygpLmlzVXNlU2VwYXJhdGVMaXN0ZW5lcigpKTsKLQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiU3RhcnQgT3BlcmF0aW9uQ2xpZW50LmV4ZWN1dGUoIiArIGJsb2NrICsgIikiKTsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiVXNlU2VwYXJhdGVMaXN0ZW5lcjogIiArIG9wQ2xpZW50LmdldE9wdGlvbnMoKS5pc1VzZVNlcGFyYXRlTGlzdGVuZXIoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgYnkgZXhlY3V0ZShPcGVyYXRpb25DbGllbnQpIHRvIHBlcmZvcm0gcG9zdC1leGVjdXRlIHRhc2tzLiAgU2hvdWxkIGJlIGEgbWlycm9yIG9mCi0gICAgICogcHJlRXhlY3V0ZQotICAgICAqCi0gICAgICogQHBhcmFtIG9wQ2xpZW50Ci0gICAgICogQHBhcmFtIGJsb2NrICAgICAgLSBJbmRpY2F0ZXMgaWYgYmxvY2tpbmcgb3Igbm9uLWJsb2NraW5nIGV4ZWN1dGUKLSAgICAgKiBAcGFyYW0gbXNnQ29udGV4dCAtIEF4aXMyIE1lc3NhZ2VDb250ZXh0Ci0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHBvc3RFeGVjdXRlKE9wZXJhdGlvbkNsaWVudCBvcENsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBibG9jaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHsKLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIkVuZCBPcGVyYXRpb25DbGllbnQuZXhlY3V0ZSgiICsgYmxvY2sgKyAiKSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogVE9ETyBDdXJyZW50bHkgdGhpcyBjaGVjayBjYXVzZXMgU09BUE1lc3NhZ2VQcm92aWRlclRlc3RzIHRvIGZhaWwuCi0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIGV4cGxvZGVkIE9NU291cmNlZEVsZW1lbnQKLSAgICAgICAgICAgIE9NRWxlbWVudCBib2R5RWxlbWVudCA9IG51bGw7Ci0gICAgICAgICAgICBpZiAobXNnQ29udGV4dC5nZXRFbnZlbG9wZSgpICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICBtc2dDb250ZXh0LmdldEVudmVsb3BlKCkuZ2V0Qm9keSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBib2R5RWxlbWVudCA9IG1zZ0NvbnRleHQuZ2V0RW52ZWxvcGUoKS5nZXRCb2R5KCkuZ2V0Rmlyc3RFbGVtZW50KCk7ICAgICAKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgYm9vbGVhbiBleHBhbmRlZCA9IGZhbHNlOwotICAgICAgICAgICAgaWYgKGJvZHlFbGVtZW50ICE9IG51bGwgJiYgYm9keUVsZW1lbnQgaW5zdGFuY2VvZiBPTVNvdXJjZWRFbGVtZW50SW1wbCkgewotICAgICAgICAgICAgICAgIGV4cGFuZGVkID0gKChPTVNvdXJjZWRFbGVtZW50SW1wbClib2R5RWxlbWVudCkuaXNFeHBhbmRlZCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gQW4gZXhwbG9kZWQgeG1sIGJsb2NrIG1heSBpbmRpY2F0ZSBhIHBlcmZvcm1hbmNlIHByb2JsZW0uICAKLSAgICAgICAgICAgIC8vIEluIGdlbmVyYWwgYW4geG1sIGJsb2NrIHNob3VsZCByZW1haW4gdW5leHBsb2RlZCB1bmxlc3MgdGhlcmUgaXMgYW4KLSAgICAgICAgICAgIC8vIG91dGJvdW5kIGhhbmRsZXIgdGhhdCB0b3VjaGVzIHRoZSBibG9jay4KLSAgICAgICAgICAgIGlmIChleHBhbmRlZCkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiRGV2ZWxvcGVyIERlYnVnOiBGb3VuZCBhbiBleHBhbmRlZCB4bWwgYmxvY2s6IiArIGJvZHlFbGVtZW50LmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAqLwotICAgICAgICAvLyBDbGVhbnVwIGNvbnRleHQKLSAgICAgICAgVGhyZWFkQ29udGV4dE1pZ3JhdG9yVXRpbAotICAgICAgICAgICAgICAgIC5wZXJmb3JtQ29udGV4dENsZWFudXAoQ29uc3RhbnRzLlRIUkVBRF9DT05URVhUX01JR1JBVE9SX0xJU1RfSUQsIG1zZ0NvbnRleHQpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NvcmUvY29udHJvbGxlci9pbXBsL0ludm9jYXRpb25Db250cm9sbGVyRmFjdG9yeUltcGwuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NvcmUvY29udHJvbGxlci9pbXBsL0ludm9jYXRpb25Db250cm9sbGVyRmFjdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2UyMzJhOC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jb3JlL2NvbnRyb2xsZXIvaW1wbC9JbnZvY2F0aW9uQ29udHJvbGxlckZhY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUuY29udHJvbGxlci5pbXBsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUuY29udHJvbGxlci5JbnZvY2F0aW9uQ29udHJvbGxlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLmNvbnRyb2xsZXIuSW52b2NhdGlvbkNvbnRyb2xsZXJGYWN0b3J5Ow0KLQ0KLXB1YmxpYyBjbGFzcyBJbnZvY2F0aW9uQ29udHJvbGxlckZhY3RvcnlJbXBsIGltcGxlbWVudHMgSW52b2NhdGlvbkNvbnRyb2xsZXJGYWN0b3J5IHsNCi0gICAgDQotICAgIHB1YmxpYyBJbnZvY2F0aW9uQ29udHJvbGxlciBnZXRJbnZvY2F0aW9uQ29udHJvbGxlcigpIHsNCi0gICAgICAgIHJldHVybiBuZXcgQXhpc0ludm9jYXRpb25Db250cm9sbGVyKCk7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY29yZS9jb250cm9sbGVyL2ltcGwvSW52b2NhdGlvbkNvbnRyb2xsZXJJbXBsLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jb3JlL2NvbnRyb2xsZXIvaW1wbC9JbnZvY2F0aW9uQ29udHJvbGxlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNkMTAzOS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jb3JlL2NvbnRyb2xsZXIvaW1wbC9JbnZvY2F0aW9uQ29udHJvbGxlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwMiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUuY29udHJvbGxlci5pbXBsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLkV4Y2VwdGlvbkZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS5JbnZvY2F0aW9uQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLk1lc3NhZ2VDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUuY29udHJvbGxlci5JbnZvY2F0aW9uQ29udHJvbGxlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLmNvbnRyb2xsZXIuSW52b2NhdGlvblBhdHRlcm47DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS51dGlsLk1lc3NhZ2VDb250ZXh0VXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaGFuZGxlci5BdHRhY2htZW50c0FkYXB0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaGFuZGxlci5IYW5kbGVyQ2hhaW5Qcm9jZXNzb3I7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaGFuZGxlci5IYW5kbGVySW52b2tlclV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmhhbmRsZXIuU09BUEhlYWRlcnNBZGFwdGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmhhbmRsZXIuVHJhbnNwb3J0SGVhZGVyc0FkYXB0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaTE4bi5NZXNzYWdlczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51dGlsLkNvbnN0YW50czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZheC54bWwud3MuQXN5bmNIYW5kbGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuUmVzcG9uc2U7DQotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yU2VydmljZTsNCi1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOw0KLQ0KLS8qKg0KLSAqIEFuIGFic3RyYWN0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBJbnZvY2F0aW9uQ29udHJvbGxlciBpbnRlcmZhY2UuIA0KLSAqLw0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBJbnZvY2F0aW9uQ29udHJvbGxlckltcGwgaW1wbGVtZW50cyBJbnZvY2F0aW9uQ29udHJvbGxlciB7DQotDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhJbnZvY2F0aW9uQ29udHJvbGxlckltcGwuY2xhc3MpOw0KLQ0KLSAgICAvKg0KLSAgICAgKiAobm9uLUphdmFkb2MpDQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLmNvbnRyb2xsZXIuSW52b2NhdGlvbkNvbnRyb2xsZXIjaW52b2tlKG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS5JbnZvY2F0aW9uQ29udGV4dCkNCi0gICAgICovDQotICAgIHB1YmxpYyBJbnZvY2F0aW9uQ29udGV4dCBpbnZva2UoSW52b2NhdGlvbkNvbnRleHQgaWMpIHsNCi0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiSW52b2NhdGlvbiBwYXR0ZXJuOiBzeW5jaHJvbm91cyIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy8gQ2hlY2sgdG8gbWFrZSBzdXJlIHdlIGF0IGxlYXN0IGhhdmUgYSB2YWxpZCBJbnZvY2F0aW9uQ29udGV4dA0KLSAgICAgICAgLy8gYW5kIHJlcXVlc3QgTWVzc2FnZUNvbnRleHQNCi0gICAgICAgIGlmIChpYyA9PSBudWxsKSB7DQotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJJQ0VycjEiKSk7DQotICAgICAgICB9DQotICAgICAgICBpZiAoaWMuZ2V0UmVxdWVzdE1lc3NhZ2VDb250ZXh0KCkgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiSUNFcnIyIikpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgTWVzc2FnZUNvbnRleHQgcmVxdWVzdCA9IGljLmdldFJlcXVlc3RNZXNzYWdlQ29udGV4dCgpOw0KLSAgICAgICAgTWVzc2FnZUNvbnRleHQgcmVzcG9uc2UgPSBudWxsOw0KLQ0KLSAgICAgICAgcmVxdWVzdC5zZXRQcm9wZXJ0eShDb25zdGFudHMuSU5WT0NBVElPTl9QQVRURVJOLCBJbnZvY2F0aW9uUGF0dGVybi5TWU5DKTsNCi0NCi0gICAgICAgIC8vIEludm9rZSBvdXRib3VuZCBoYW5kbGVycy4NCi0gICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9DQotICAgICAgICAgICAgICAgIEhhbmRsZXJJbnZva2VyVXRpbHMuaW52b2tlT3V0Ym91bmRIYW5kbGVycyhyZXF1ZXN0LmdldE1FUENvbnRleHQoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljLmdldEhhbmRsZXJzKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IuTUVQLlJFUVVFU1QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7DQotDQotICAgICAgICBpZiAoc3VjY2Vzcykgew0KLSAgICAgICAgICAgIHByZXBhcmVSZXF1ZXN0KHJlcXVlc3QpOw0KLSAgICAgICAgICAgIHJlc3BvbnNlID0gZG9JbnZva2UocmVxdWVzdCk7DQotICAgICAgICAgICAgcHJlcGFyZVJlc3BvbnNlKHJlc3BvbnNlKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBtYWtlIHN1cmUgcmVxdWVzdCBhbmQgcmVzcG9uc2UgY29udGV4dHMgc2hhcmUgYSBzaW5nbGUgcGFyZW50DQotICAgICAgICAgICAgcmVzcG9uc2Uuc2V0TUVQQ29udGV4dChyZXF1ZXN0LmdldE1FUENvbnRleHQoKSk7DQotDQotICAgICAgICAgICAgLyoNCi0gICAgICAgICAgICAgKiBUT0RPIFRPRE8gVE9ETyByZXZpZXcNCi0gICAgICAgICAgICAgKiANCi0gICAgICAgICAgICAgKiBJbiBtb3N0IGNhc2VzIHdlIGFyZSBhZGRpbmcgdGhlIGVuZHBvaW50RGVzYyB0byB0aGUNCi0gICAgICAgICAgICAgKiBNZXNzYWdlQ29udGV4dC4gTm90aWNlIGhlcmUgdGhhdCB0aGUgInJlc3BvbnNlIiBvYmplY3QgaXMgc2V0IGJ5DQotICAgICAgICAgICAgICogdGhlIGNhbGwgdG8gZG9JbnZva2UuIEl0J3MgYSBuZXcgY29udGV4dCB3ZSBhcmUgbm93IHdvcmtpbmcgd2l0aC4NCi0gICAgICAgICAgICAgKiBUaGUgaW52b2tlSW5ib3VuZEhhbmRsZXJzIHVzZXMgdGhhdCBjb250ZXh0IHdheSBkb3duIGluDQotICAgICAgICAgICAgICogY3JlYXRlTWVzc2FnZUNvbnRleHQgLS0+IENvbnRleHRVdGlscy5hZGRQcm9wZXJ0aWVzKCkNCi0gICAgICAgICAgICAgKiANCi0gICAgICAgICAgICAgKiBUaGlzIG1heSBhbHNvIG9jY3VyIGluIHRoZSBBc3luY1Jlc3BvbnNlIGNsYXNzIHdoZW4gY2FsbGluZw0KLSAgICAgICAgICAgICAqIGludm9rZUluYm91bmRIYW5kbGVycw0KLSAgICAgICAgICAgICAqIA0KLSAgICAgICAgICAgICAqIEZvciBub3csIG1ha2Ugc3VyZSB0aGUgZW5kcG9pbnREZXNjIGlzIHNldCBvbiB0aGUgcmVzcG9uc2UNCi0gICAgICAgICAgICAgKiBjb250ZXh0Lg0KLSAgICAgICAgICAgICAqLw0KLSAgICAgICAgICAgIHJlc3BvbnNlLnNldEVuZHBvaW50RGVzY3JpcHRpb24ocmVxdWVzdC5nZXRFbmRwb2ludERlc2NyaXB0aW9uKCkpOw0KLQ0KLSAgICAgICAgICAgIC8vIEludm9rZSBpbmJvdW5kIGhhbmRsZXJzLg0KLSAgICAgICAgICAgIFRyYW5zcG9ydEhlYWRlcnNBZGFwdGVyLmluc3RhbGwocmVzcG9uc2UpOw0KLSAgICAgICAgICAgIEF0dGFjaG1lbnRzQWRhcHRlci5pbnN0YWxsKHJlc3BvbnNlKTsNCi0gICAgICAgICAgICBTT0FQSGVhZGVyc0FkYXB0ZXIuaW5zdGFsbChyZXNwb25zZSk7DQotICAgICAgICAgICAgSGFuZGxlckludm9rZXJVdGlscy5pbnZva2VJbmJvdW5kSGFuZGxlcnMocmVzcG9uc2UuZ2V0TUVQQ29udGV4dCgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljLmdldEhhbmRsZXJzKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlckNoYWluUHJvY2Vzc29yLk1FUC5SRVNQT05TRSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7DQotICAgICAgICB9IGVsc2UgeyAvLyB0aGUgb3V0Ym91bmQgaGFuZGxlciBjaGFpbiBtdXN0IGhhdmUgaGFkIGEgcHJvYmxlbSwgYW5kDQotICAgICAgICAgICAgICAgICAgICAvLyB3ZSd2ZSByZXZlcnNlZCBkaXJlY3Rpb25zDQotICAgICAgICAgICAgcmVzcG9uc2UgPSBNZXNzYWdlQ29udGV4dFV0aWxzLmNyZWF0ZU1pbmltYWxSZXNwb25zZU1lc3NhZ2VDb250ZXh0KHJlcXVlc3QpOw0KLSAgICAgICAgICAgIC8vIHNpbmNlIHdlJ3ZlIHJldmVyc2VkIGRpcmVjdGlvbnMsIHRoZSBtZXNzYWdlIGhhcyAiYmVjb21lIGENCi0gICAgICAgICAgICAvLyBtYWtlIHN1cmUgcmVxdWVzdCBhbmQgcmVzcG9uc2UgY29udGV4dHMgc2hhcmUgYSBzaW5nbGUgcGFyZW50DQotICAgICAgICAgICAgcmVzcG9uc2Uuc2V0TUVQQ29udGV4dChyZXF1ZXN0LmdldE1FUENvbnRleHQoKSk7DQotICAgICAgICAgICAgcmVzcG9uc2Uuc2V0TWVzc2FnZShyZXF1ZXN0LmdldE1lc3NhZ2UoKSk7DQotICAgICAgICB9DQotICAgICAgICBpYy5zZXRSZXNwb25zZU1lc3NhZ2VDb250ZXh0KHJlc3BvbnNlKTsNCi0gICAgICAgIHJldHVybiBpYzsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgTWVzc2FnZUNvbnRleHQgZG9JbnZva2UoTWVzc2FnZUNvbnRleHQgcmVxdWVzdCk7DQotDQotICAgIC8qDQotICAgICAqIChub24tSmF2YWRvYykNCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUuY29udHJvbGxlci5JbnZvY2F0aW9uQ29udHJvbGxlciNpbnZva2VPbmVXYXkob3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLkludm9jYXRpb25Db250ZXh0KQ0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgaW52b2tlT25lV2F5KEludm9jYXRpb25Db250ZXh0IGljKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiSW52b2NhdGlvbiBwYXR0ZXJuOiBvbmUtd2F5Iik7DQotICAgICAgICB9DQotDQotICAgICAgICAvLyBDaGVjayB0byBtYWtlIHN1cmUgd2UgYXQgbGVhc3QgaGF2ZSBhIHZhbGlkIEludm9jYXRpb25Db250ZXh0DQotICAgICAgICAvLyBhbmQgcmVxdWVzdCBNZXNzYWdlQ29udGV4dA0KLSAgICAgICAgaWYgKGljID09IG51bGwpIHsNCi0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoIklDRXJyMSIpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChpYy5nZXRSZXF1ZXN0TWVzc2FnZUNvbnRleHQoKSA9PSBudWxsKSB7DQotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJJQ0VycjIiKSk7DQotICAgICAgICB9DQotDQotICAgICAgICBNZXNzYWdlQ29udGV4dCByZXF1ZXN0ID0gaWMuZ2V0UmVxdWVzdE1lc3NhZ2VDb250ZXh0KCk7DQotICAgICAgICByZXF1ZXN0LnNldFByb3BlcnR5KENvbnN0YW50cy5JTlZPQ0FUSU9OX1BBVFRFUk4sIEludm9jYXRpb25QYXR0ZXJuLk9ORVdBWSk7DQotDQotICAgICAgICAvLyBJbnZva2Ugb3V0Ym91bmQgaGFuZGxlcnMuDQotICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPQ0KLSAgICAgICAgICAgICAgICBIYW5kbGVySW52b2tlclV0aWxzLmludm9rZU91dGJvdW5kSGFuZGxlcnMocmVxdWVzdC5nZXRNRVBDb250ZXh0KCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpYy5nZXRIYW5kbGVycygpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlckNoYWluUHJvY2Vzc29yLk1FUC5SRVFVRVNULA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7DQotDQotICAgICAgICBpZiAoc3VjY2Vzcykgew0KLSAgICAgICAgICAgIHByZXBhcmVSZXF1ZXN0KHJlcXVlc3QpOw0KLSAgICAgICAgICAgIGRvSW52b2tlT25lV2F5KHJlcXVlc3QpOw0KLSAgICAgICAgfSBlbHNlIHsgLy8gdGhlIG91dGJvdW5kIGhhbmRsZXIgY2hhaW4gbXVzdCBoYXZlIGhhZCBhIHByb2JsZW0sIGFuZCB3ZSd2ZSByZXZlcnNlZCBkaXJlY3Rpb25zDQotICAgICAgICAgICAgLy8gY2hlY2sgdG8gc2VlIGlmIHByb2JsZW0gaXMgZHVlIHRvIGEgaGFuZGxlciB0aHJvd2luZyBhbiBleGNlcHRpb24uICBJZiBzbywgdGhyb3cgaXQsDQotICAgICAgICAgICAgLy8gZXZlbiBpbiB0aGlzIG9uZVdheSBpbnZva2UuDQotICAgICAgICAgICAgRXhjZXB0aW9uIGUgPSByZXF1ZXN0LmdldENhdXNlZEJ5RXhjZXB0aW9uKCk7DQotICAgICAgICAgICAgaWYgKGUgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICB0aHJvdyAoRXhjZXB0aW9uKWUuZ2V0Q2F1c2UoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZG9JbnZva2VPbmVXYXkoTWVzc2FnZUNvbnRleHQgbWMpOw0KLQ0KLSAgICAvKg0KLSAgICAgKiAobm9uLUphdmFkb2MpDQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLmNvbnRyb2xsZXIuSW52b2NhdGlvbkNvbnRyb2xsZXIjaW52b2tlQXN5bmMob3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLkludm9jYXRpb25Db250ZXh0KQ0KLSAgICAgKi8NCi0gICAgcHVibGljIFJlc3BvbnNlIGludm9rZUFzeW5jKEludm9jYXRpb25Db250ZXh0IGljKSB7DQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcoIkludm9jYXRpb24gcGF0dGVybjogYXN5bmNocm9ub3VzKHBvbGxpbmcpIik7DQotICAgICAgICB9DQotDQotICAgICAgICAvLyBDaGVjayB0byBtYWtlIHN1cmUgd2UgYXQgbGVhc3QgaGF2ZSBhIHZhbGlkIEludm9jYXRpb25Db250ZXh0DQotICAgICAgICAvLyBhbmQgcmVxdWVzdCBNZXNzYWdlQ29udGV4dA0KLSAgICAgICAgaWYgKGljID09IG51bGwpIHsNCi0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoIklDRXJyMSIpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChpYy5nZXRSZXF1ZXN0TWVzc2FnZUNvbnRleHQoKSA9PSBudWxsKSB7DQotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJJQ0VycjIiKSk7DQotICAgICAgICB9DQotDQotICAgICAgICBNZXNzYWdlQ29udGV4dCByZXF1ZXN0ID0gaWMuZ2V0UmVxdWVzdE1lc3NhZ2VDb250ZXh0KCk7DQotICAgICAgICByZXF1ZXN0LnNldFByb3BlcnR5KENvbnN0YW50cy5JTlZPQ0FUSU9OX1BBVFRFUk4sIEludm9jYXRpb25QYXR0ZXJuLkFTWU5DX1BPTExJTkcpOw0KLQ0KLSAgICAgICAgUmVzcG9uc2UgcmVzcCA9IG51bGw7DQotDQotICAgICAgICAvLyBJbnZva2Ugb3V0Ym91bmQgaGFuZGxlcnMuDQotICAgICAgICAvLyBUT0RPIHVuY29tbWVudCwgYW5kIGdldCB0aGUgRW5kcG9pbnREZXNjcmlwdGlvbiBmcm9tIHRoZSByZXF1ZXN0IGNvbnRleHQsIHdoaWNoIHNob3VsZCBzb29uIGJlIGF2YWlsYWJsZQ0KLSAgICAgICAgYm9vbGVhbiBzdWNjZXNzID0NCi0gICAgICAgICAgICAgICAgSGFuZGxlckludm9rZXJVdGlscy5pbnZva2VPdXRib3VuZEhhbmRsZXJzKHJlcXVlc3QuZ2V0TUVQQ29udGV4dCgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWMuZ2V0SGFuZGxlcnMoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZXJDaGFpblByb2Nlc3Nvci5NRVAuUkVRVUVTVCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsNCi0gICAgICAgIGlmIChzdWNjZXNzKSB7DQotICAgICAgICAgICAgcHJlcGFyZVJlcXVlc3QocmVxdWVzdCk7DQotICAgICAgICAgICAgcmVzcCA9IGRvSW52b2tlQXN5bmMocmVxdWVzdCk7DQotICAgICAgICB9IGVsc2UNCi0gICAgICAgIHsgLy8gdGhlIG91dGJvdW5kIGhhbmRsZXIgY2hhaW4gbXVzdCBoYXZlIGhhZCBhIHByb2JsZW0sIGFuZCB3ZSd2ZSByZXZlcnNlZCBkaXJlY3Rpb25zDQotICAgICAgICAgICAgLy8gc2luY2Ugd2UndmUgcmV2ZXJzZWQgZGlyZWN0aW9ucywgdGhlIG1lc3NhZ2UgaGFzICJiZWNvbWUgYSByZXNwb25zZSBtZXNzYWdlIiAoc2VjdGlvbiA5LjMuMi4xLCBmb290bm90ZSBzdXBlcnNjcmlwdCAyKQ0KLQ0KLSAgICAgICAgICAgIC8vIFRPRE8gd2Uga25vdyB0aGUgbWVzc2FnZSBpcyBhIGZhdWx0IG1lc3NhZ2UsIHdlIHNob3VsZA0KLSAgICAgICAgICAgIC8vIGNvbnZlcnQgaXQgdG8gYW4gZXhjZXB0aW9uIGFuZCB0aHJvdyBpdC4NCi0gICAgICAgICAgICAvLyBzb21ldGhpbmcgbGlrZToNCi0NCi0gICAgICAgICAgICAvL3Rocm93IG5ldyBBeGlzRmF1bHQocmVxdWVzdC5nZXRNZXNzYWdlKCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3A7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGFic3RyYWN0IFJlc3BvbnNlIGRvSW52b2tlQXN5bmMoTWVzc2FnZUNvbnRleHQgbWMpOw0KLQ0KLSAgICAvKg0KLSAgICAgKiAobm9uLUphdmFkb2MpDQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLmNvbnRyb2xsZXIuSW52b2NhdGlvbkNvbnRyb2xsZXIjaW52b2tlQXN5bmMob3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLkludm9jYXRpb25Db250ZXh0LCBqYXZheC54bWwud3MuQXN5bmNIYW5kbGVyKQ0KLSAgICAgKi8NCi0gICAgcHVibGljIEZ1dHVyZTw/PiBpbnZva2VBc3luYyhJbnZvY2F0aW9uQ29udGV4dCBpYywgQXN5bmNIYW5kbGVyIGFzeW5jSGFuZGxlcikgew0KLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKCJJbnZvY2F0aW9uIHBhdHRlcm46IGFzeW5jaHJvbm91cyhjYWxsYmFjaykiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vIENoZWNrIHRvIG1ha2Ugc3VyZSB3ZSBhdCBsZWFzdCBoYXZlIGEgdmFsaWQgSW52b2NhdGlvbkNvbnRleHQNCi0gICAgICAgIC8vIGFuZCByZXF1ZXN0IE1lc3NhZ2VDb250ZXh0DQotICAgICAgICBpZiAoaWMgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiSUNFcnIxIikpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKGljLmdldFJlcXVlc3RNZXNzYWdlQ29udGV4dCgpID09IG51bGwpIHsNCi0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoIklDRXJyMiIpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICgoaWMuZ2V0RXhlY3V0b3IoKSAhPSBudWxsKSAmJiAoaWMuZ2V0RXhlY3V0b3IoKSBpbnN0YW5jZW9mIEV4ZWN1dG9yU2VydmljZSkpIHsNCi0gICAgICAgICAgICBFeGVjdXRvclNlcnZpY2UgZXMgPSAoRXhlY3V0b3JTZXJ2aWNlKSBpYy5nZXRFeGVjdXRvcigpOw0KLSAgICAgICAgICAgIGlmIChlcy5pc1NodXRkb3duKCkpIHsNCi0gICAgICAgICAgICAgICAgLy8gdGhlIGV4ZWN1dG9yIHNlcnZpY2UgaXMgc2h1dGRvd24gYW5kIHdvbid0IGFjY2VwdCBuZXcgdGFza3MNCi0gICAgICAgICAgICAgICAgLy8gc28gcmV0dXJuIGFuIGVycm9yIGJhY2sgdG8gdGhlIGNsaWVudA0KLSAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0TWVzc2FnZSgiRXhlY3V0b3JTaHV0ZG93biIpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICBNZXNzYWdlQ29udGV4dCByZXF1ZXN0ID0gaWMuZ2V0UmVxdWVzdE1lc3NhZ2VDb250ZXh0KCk7DQotICAgICAgICByZXF1ZXN0LnNldFByb3BlcnR5KENvbnN0YW50cy5JTlZPQ0FUSU9OX1BBVFRFUk4sIEludm9jYXRpb25QYXR0ZXJuLkFTWU5DX0NBTExCQUNLKTsNCi0NCi0gICAgICAgIEZ1dHVyZTw/PiBmdXR1cmUgPSBudWxsOw0KLQ0KLSAgICAgICAgLy8gSW52b2tlIG91dGJvdW5kIGhhbmRsZXJzLg0KLSAgICAgICAgYm9vbGVhbiBzdWNjZXNzID0NCi0gICAgICAgICAgICAgICAgSGFuZGxlckludm9rZXJVdGlscy5pbnZva2VPdXRib3VuZEhhbmRsZXJzKHJlcXVlc3QuZ2V0TUVQQ29udGV4dCgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWMuZ2V0SGFuZGxlcnMoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZXJDaGFpblByb2Nlc3Nvci5NRVAuUkVRVUVTVCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsNCi0gICAgICAgIGlmIChzdWNjZXNzKSB7DQotICAgICAgICAgICAgcHJlcGFyZVJlcXVlc3QocmVxdWVzdCk7DQotICAgICAgICAgICAgZnV0dXJlID0gZG9JbnZva2VBc3luYyhyZXF1ZXN0LCBhc3luY0hhbmRsZXIpOw0KLSAgICAgICAgfSBlbHNlIHsgLy8gdGhlIG91dGJvdW5kIGhhbmRsZXIgY2hhaW4gbXVzdCBoYXZlIGhhZCBhIHByb2JsZW0sIGFuZA0KLSAgICAgICAgICAgICAgICAgICAgLy8gd2UndmUgcmV2ZXJzZWQgZGlyZWN0aW9ucw0KLSAgICAgICAgICAgIC8vIHNpbmNlIHdlJ3ZlIHJldmVyc2VkIGRpcmVjdGlvbnMsIHRoZSBtZXNzYWdlIGhhcyAiYmVjb21lIGENCi0gICAgICAgICAgICAvLyByZXNwb25zZSBtZXNzYWdlIiAoc2VjdGlvbiA5LjMuMi4xLCBmb290bm90ZSBzdXBlcnNjcmlwdCAyKQ0KLQ0KLSAgICAgICAgICAgIC8vIFRPRE86IGhvdyBkbyB3ZSBkZWFsIHdpdGggdGhpcz8gVGhlIHJlc3BvbnNlIG1lc3NhZ2UgbWF5IG9yIG1heQ0KLSAgICAgICAgICAgIC8vIG5vdCBiZSBhIGZhdWx0DQotICAgICAgICAgICAgLy8gbWVzc2FnZS4gV2UgZG8ga25vdyB0aGF0IHRoZSBkaXJlY3Rpb24gaGFzIHJldmVyc2VkLCBzbyBzb21laG93DQotICAgICAgICAgICAgLy8gd2UgbmVlZCB0bw0KLSAgICAgICAgICAgIC8vIGZsb3cgaW1tZWRpYXRlbHkgb3V0IG9mIHRoZSBhc3luYyBhbmQgZ2l2ZSB0aGUgZXhjZXB0aW9uIGFuZC9vcg0KLSAgICAgICAgICAgIC8vIHJlc3BvbnNlIG9iamVjdA0KLSAgICAgICAgICAgIC8vIGJhY2sgdG8gdGhlIGNsaWVudCBhcHAgd2l0aG91dCBjYWxsaW5nDQotICAgICAgICAgICAgLy8gQXN5bmNSZXNwb25zZS5wcm9jZXNzUmVzcG9uc2Ugb3IgcHJvY2Vzc0ZhdWx0DQotICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiaW52b2tlQXN5bmNFcnIiKSk7DQotDQotICAgICAgICAgICAgLy8gdGhyb3cgbmV3IEF4aXNGYXVsdChyZXF1ZXN0LmdldE1lc3NhZ2UoKSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gZnV0dXJlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBhYnN0cmFjdCBGdXR1cmU8Pz4gZG9JbnZva2VBc3luYyhNZXNzYWdlQ29udGV4dCBtYywgQXN5bmNIYW5kbGVyIGFzeW5jSGFuZGxlcik7DQotDQotICAgIC8qKg0KLSAgICAgKiBBYnN0cmFjdCBtZXRob2QgdGhhdCBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IHdob2V2ZXIgaXMgcHJvdmlkaW5nIHRoZSBzcGVjaWZpYyBjbGllbnQgYmluZGluZy4NCi0gICAgICogIE9uY2UgdGhpcyBpcyBjYWxsZWQsIGV2ZXJ5dGhpbmcgdGhhdCBpcyBuZWVkZWQgdG8gaW52b2tlIHRoZSBvcGVyYXRpb24gbXVzdCBiZSBhdmFpbGFibGUgaW4NCi0gICAgICogdGhlIE1lc3NhZ2VDb250ZXh0Lg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gbWMNCi0gICAgICovDQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHByZXBhcmVSZXF1ZXN0KE1lc3NhZ2VDb250ZXh0IG1jKTsNCi0NCi0gICAgLyoqDQotICAgICAqIEFic3RyYWN0IG1ldGhvZCB0aGF0IG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgd2hvZXZlciBpcyBwcm92aWRpbmcgdGhlIHNwZWNpZmljIGNsaWVudCBiaW5kaW5nLg0KLSAgICAgKiAgVGhpcyBpcyBjYWxsZWQgYWZ0ZXIgdGhlIHJlc3BvbnNlIGhhcyBjb21lIGJhY2sgYW5kIGFsbG93cyB0aGUgY2xpZW50IGJpbmRpbmcgdG8gcHV0DQotICAgICAqIHdoYXRldmVyIGluZm8gaXQgaGFzIGluIHRoZSByZXNwb25zZSBNZXNzYWdlQ29udGV4dC4NCi0gICAgICoNCi0gICAgICogQHBhcmFtIG1jDQotICAgICAqLw0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBwcmVwYXJlUmVzcG9uc2UoTWVzc2FnZUNvbnRleHQgbWMpOw0KLQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jb3JlL3V0aWwvTWVzc2FnZUNvbnRleHRVdGlscy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY29yZS91dGlsL01lc3NhZ2VDb250ZXh0VXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI5ZWE4Ni4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jb3JlL3V0aWwvTWVzc2FnZUNvbnRleHRVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUudXRpbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuRXhjZXB0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLk1lc3NhZ2VDb250ZXh0QnVpbGRlcjsKLQotLyoqIEEgdXRpbGl0eSBjbGFzcyBmb3IgaGFuZGxpbmcgc29tZSBvZiB0aGUgY29tbW9uIGlzc3VlcyByZWxhdGVkIHRvIHRoZSBKQVgtV1MgTWVzc2FnZUNvbnRleHQuICovCi1wdWJsaWMgY2xhc3MgTWVzc2FnZUNvbnRleHRVdGlscyB7Ci0KLSAgICAvKioKLSAgICAgKiBHaXZlbiBhIHJlcXVlc3QgTWVzc2FnZUNvbnRleHQsIGNyZWF0ZSBhIG5ldyBNZXNzYWdlQ29udGV4dCBmcm9tIHRoZXJlIHdpdGggdGhlIG5lY2Vzc2FyeQotICAgICAqIGluZm9ybWF0aW9uIHRvIG1ha2Ugc3VyZSB0aGUgbmV3IE1lc3NhZ2VDb250ZXh0IGlzIHJlbGF0ZWQgdG8gdGhlIGV4aXN0aW5nIG9uZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtYyAtIHRoZSBNZXNzYWdlQ29udGV4dCB0byB1c2UgYXMgdGhlIHNvdXJjZQotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE1lc3NhZ2VDb250ZXh0IGNyZWF0ZVJlc3BvbnNlTWVzc2FnZUNvbnRleHQoTWVzc2FnZUNvbnRleHQgbWMpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dCBzb3VyY2VBeGlzTUMgPSBtYy5nZXRBeGlzTWVzc2FnZUNvbnRleHQoKTsKLQotICAgICAgICAgICAgLy8gVGhlcmUgYXJlIGEgbnVtYmVyIG9mIHRoaW5ncyB0aGF0IG5lZWQgdG8gYmUgY29waWVkIG92ZXIgYXQgdGhlCi0gICAgICAgICAgICAvLyBBeGlzMiBsZXZlbC4KLSAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dCBuZXdBeGlzTUMgPQotICAgICAgICAgICAgICAgICAgICBNZXNzYWdlQ29udGV4dEJ1aWxkZXIuY3JlYXRlT3V0TWVzc2FnZUNvbnRleHQoc291cmNlQXhpc01DKTsKLQotICAgICAgICAgICAgTWVzc2FnZUNvbnRleHQgbmV3TUMgPSBuZXcgTWVzc2FnZUNvbnRleHQobmV3QXhpc01DKTsKLSAgICAgICAgICAgIG5ld01DLnNldE91dGJvdW5kKHRydWUpOwotICAgICAgICAgICAgbmV3TUMuc2V0U2VydmVyKHRydWUpOwotICAgICAgICAgICAgbmV3TUMuc2V0TUVQQ29udGV4dChtYy5nZXRNRVBDb250ZXh0KCkpOwotICAgICAgICAgICAgbmV3TUMuc2V0RW5kcG9pbnREZXNjcmlwdGlvbihtYy5nZXRFbmRwb2ludERlc2NyaXB0aW9uKCkpOwotICAgICAgICAgICAgbmV3TUMuc2V0T3BlcmF0aW9uRGVzY3JpcHRpb24obWMuZ2V0T3BlcmF0aW9uRGVzY3JpcHRpb24oKSk7Ci0gICAgICAgICAgICByZXR1cm4gbmV3TUM7Ci0gICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIAotICAgIC8qCi0gICAgICogc3BlY2lhbCBtZXNzYWdlY29udGV4dCB0aGF0IGhhcyBubyBBeGlzQ29udGV4dCBhc3NvY2lhdGVkIHdpdGggaXQuICBUeXBpY2FsbHksIHRoaXMKLSAgICAgKiB3b3VsZCBiZSB1c2VkIGluIGEgImNsaWVudCBvdXRib3VuZCBoYW5kbGVyIHRocm93cyBleGNlcHRpb24iIGNhc2Ugc2luY2UgdGhhdCB3b3VsZAotICAgICAqIG1lYW4gd2UgbmV2ZXIgaGl0IHRoZSBJbnZvY2F0aW9uQ29udHJvbGxlciBhbmQgdGh1cyBuZXZlciBoaXQgdGhlIEF4aXMgbGF5ZXIuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBNZXNzYWdlQ29udGV4dCBjcmVhdGVNaW5pbWFsUmVzcG9uc2VNZXNzYWdlQ29udGV4dChNZXNzYWdlQ29udGV4dCBtYykgewotICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQgc291cmNlQXhpc01DID0gbWMuZ2V0QXhpc01lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG5ld01DID0gbmV3IE1lc3NhZ2VDb250ZXh0KHNvdXJjZUF4aXNNQyk7Ci0gICAgICAgIG5ld01DLnNldE1FUENvbnRleHQobWMuZ2V0TUVQQ29udGV4dCgpKTsKLSAgICAgICAgbmV3TUMuc2V0RW5kcG9pbnREZXNjcmlwdGlvbihtYy5nZXRFbmRwb2ludERlc2NyaXB0aW9uKCkpOwotICAgICAgICBuZXdNQy5zZXRPcGVyYXRpb25EZXNjcmlwdGlvbihtYy5nZXRPcGVyYXRpb25EZXNjcmlwdGlvbigpKTsKLSAgICAgICAgcmV0dXJuIG5ld01DOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBHaXZlbiBhIHJlcXVlc3QgTWVzc2FnZUNvbnRleHQsIGNyZWF0ZSBhIG5ldyBNZXNzYWdlQ29udGV4dCBmb3IgYSBmYXVsdCByZXNwb25zZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtYwotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE1lc3NhZ2VDb250ZXh0IGNyZWF0ZUZhdWx0TWVzc2FnZUNvbnRleHQoTWVzc2FnZUNvbnRleHQgbWMpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dCBmYXVsdE1DID0KLSAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUNvbnRleHRCdWlsZGVyLmNyZWF0ZUZhdWx0TWVzc2FnZUNvbnRleHQobWMuZ2V0QXhpc01lc3NhZ2VDb250ZXh0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwpOwotICAgICAgICAgICAgTWVzc2FnZUNvbnRleHQgamF4d3NGYXVsdE1DID0gbmV3IE1lc3NhZ2VDb250ZXh0KGZhdWx0TUMpOwotICAgICAgICAgICAgamF4d3NGYXVsdE1DLnNldE91dGJvdW5kKHRydWUpOwotICAgICAgICAgICAgamF4d3NGYXVsdE1DLnNldFNlcnZlcih0cnVlKTsKLSAgICAgICAgICAgIGpheHdzRmF1bHRNQy5zZXRNRVBDb250ZXh0KG1jLmdldE1FUENvbnRleHQoKSk7Ci0gICAgICAgICAgICBqYXh3c0ZhdWx0TUMuc2V0RW5kcG9pbnREZXNjcmlwdGlvbihtYy5nZXRFbmRwb2ludERlc2NyaXB0aW9uKCkpOwotICAgICAgICAgICAgamF4d3NGYXVsdE1DLnNldE9wZXJhdGlvbkRlc2NyaXB0aW9uKG1jLmdldE9wZXJhdGlvbkRlc2NyaXB0aW9uKCkpOwotICAgICAgICAgICAgcmV0dXJuIGpheHdzRmF1bHRNQzsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoQXhpc0ZhdWx0IGUpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rpc3BhdGNoZXJzL0dlbmVyaWNQcm92aWRlckRpc3BhdGNoZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rpc3BhdGNoZXJzL0dlbmVyaWNQcm92aWRlckRpc3BhdGNoZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzIyZTJmNS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kaXNwYXRjaGVycy9HZW5lcmljUHJvdmlkZXJEaXNwYXRjaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGlzcGF0Y2hlcnM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQWJzdHJhY3REaXNwYXRjaGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLS8qKgotICogVGhpcyBkaXNwYXRjaGVyIHdpbGwgbG9vayBmb3IgYSBzcGVjaWZpYyBvcGVyYXRpb24gb24gdGhlIEF4aXNTZXJ2aWNlIGFuZCByZXR1cm4gaXQKLSAqIGlmIGZvdW5kLiAgVGhpcyBkaXNwYXRjaGVyIGlzIHVzZWQgZm9yIFByb3ZpZGVyLWJhc2VkIGVuZHBvaW50cyB3aGljaCBkbyBub3QgaGF2ZSBXU0RMCi0gKiBhc3NvY2lhdGVkIHdpdGggdGhlbS4gIFRob3NlIHR5cGVzIG9mIGVuZHBvaW50cyB3aWxsIG5vdCBoYXZlIFdTREwgb3BlcmF0aW9ucyBjcmVhdGVkIGZvciB0aGVtCi0gKiBzaW5jZSAoYSkgdGhlcmUgaXMgbm8gV1NETCBhbmQgKGIpIHRoZXJlIGlzIG5vIFNFSSBmcm9tIHdoaWNoIHRvIGJ1aWxkIG9wZXJhdGlvbnMgdXNpbmcKLSAqIGFubm90YXRpb25zLiAgRm9yIHRoZXNlIHR5cGVzIG9mIGVuZHBvaW50cywgYSBnZW5lcmljIG9wZXJhdGlvbiB3aWxsIGhhdmUgYmVlbiBhZGRlZCB0byB0aGUKLSAqIHNlcnZpY2Ugd2hpY2ggd2lsbCBhY2NlcHQgYW55IGluY29taW5nIFdTREwgb3BlcmF0aW9uIGFuZCBwYXNzIHRoZSBpbmNvbWluZyBtZXNzYWdlIHRvIHRoZQotICogUHJvdmlkZXIgZW5kcG9pbnQuIAotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJpY1Byb3ZpZGVyRGlzcGF0Y2hlciBleHRlbmRzIEFic3RyYWN0RGlzcGF0Y2hlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEdlbmVyaWNQcm92aWRlckRpc3BhdGNoZXIuY2xhc3MpOwotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQWJzdHJhY3REaXNwYXRjaGVyI2ZpbmRPcGVyYXRpb24ob3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZSwgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0KQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBBeGlzT3BlcmF0aW9uIGZpbmRPcGVyYXRpb24oQXhpc1NlcnZpY2Ugc2VydmljZSwgTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQpCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgQXhpc09wZXJhdGlvbiB0aGVPcGVyYXRpb24gPSBudWxsOwotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiZmluZE9wZXJhdGlvbiBzZXJ2aWNlID0gIiArIHNlcnZpY2UgKyAiOyBtZXNzYWdlY3R4OiAiICsgbWVzc2FnZUNvbnRleHQpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBJZiB0aGVyZSdzIGFuIEF4aXNTZXJ2aWNlLCB0aGVuIGxvb2sgZm9yIHRoZSBzcGVjaWFsbHkgbmFtZWQgb3BlcmF0aW9uIGFuZCByZXR1cm4gaXQKLSAgICAgICAgaWYgKHNlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgdGhlT3BlcmF0aW9uID0gc2VydmljZS5nZXRPcGVyYXRpb24obmV3IFFOYW1lKEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24uSkFYV1NfTk9XU0RMX1BST1ZJREVSX09QRVJBVElPTl9OQU1FKSk7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIm9wZXJhdGlvbiAiICsgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbi5KQVhXU19OT1dTRExfUFJPVklERVJfT1BFUkFUSU9OX05BTUUgKyAiIGlzICIgKyB0aGVPcGVyYXRpb24gKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHRoZU9wZXJhdGlvbjsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BYnN0cmFjdERpc3BhdGNoZXIjZmluZFNlcnZpY2Uob3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0KQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBBeGlzU2VydmljZSBmaW5kU2VydmljZShNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIC8vIFRoaXMgZGlzcGF0Y2hlciB3aWxsIG5vdCB0cnkgdG8gcmVzb2x2ZSBhbmQgQXhpc1NlcnZpY2UgaWYgb25lIGhhc24ndCBiZWVuCi0gICAgICAgIC8vIHJlc29sdmVkIGFscmVhZHkKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQWJzdHJhY3REaXNwYXRjaGVyI2luaXREaXNwYXRjaGVyKCkKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBpbml0RGlzcGF0Y2hlcigpIHsKLSAgICAgICAgLy8gTm8gaW5pdGlhbGl6YXRpb24gbmVjZXNzYXJ5Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kaXNwYXRjaGVycy9NdXN0VW5kZXJzdGFuZENoZWNrZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rpc3BhdGNoZXJzL011c3RVbmRlcnN0YW5kQ2hlY2tlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjVmMjY4Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rpc3BhdGNoZXJzL011c3RVbmRlcnN0YW5kQ2hlY2tlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kaXNwYXRjaGVyczsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLS8qKg0KLSAqIFBsdWdpbiB0byByZW1vdmUgInVuZGVyc3Rvb2QiIGhlYWRlcnMgZm9yIHRoZSBKQVhXUyByZWxhdGVkIGhlYWRlcnMuICBUaGlzIGNsYXNzIG11c3QNCi0gKiBiZSBjb25maWd1cmVkIGluIHRoZSBheGlzMi54bWwgZmlsZSBvbiBib3RoIHRoZSBjbGllbnQgYW5kIHRoZSBzZXJ2ZXIuDQotICogDQotICogIFVuZGVyc3Rvb2QgaGVhZGVycyAocGVyIEpBWFdTIDIuMCBTZWN0aW9uIDEwLjIpIGluY2x1ZGUNCi0gKiAgLSBIZWFkZXJzIHRoYXQgY29ycmVzcG9uZCB0byBTRUkgbWV0aG9kIHBhcmFtZXRlcnMuDQotICovDQotcHVibGljIGNsYXNzIE11c3RVbmRlcnN0YW5kQ2hlY2tlciBleHRlbmRzIG9yZy5hcGFjaGUuYXhpczIuaGFuZGxlcnMuQWJzdHJhY3RIYW5kbGVyIHsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKE11c3RVbmRlcnN0YW5kQ2hlY2tlci5jbGFzcyk7DQotDQotICAgIHB1YmxpYyBJbnZvY2F0aW9uUmVzcG9uc2UgaW52b2tlKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHRocm93cyBBeGlzRmF1bHQgew0KLSAgICAgICAgLy8gR2V0IHRoZSBsaXN0IG9mIGhlYWRlcnMgZm9yIHRoZSByb2xlcyB3ZSdyZSBhY3RpbmcgaW4sIHRoZW4gbWFyayBhbnkgd2UgdW5kZXJzdGFuZA0KLSAgICAgICAgLy8gYXMgcHJvY2Vzc2VkLg0KLSAgICAgICAgTXVzdFVuZGVyc3RhbmRVdGlscy5tYXJrVW5kZXJzdG9vZEhlYWRlclBhcmFtZXRlcnMobXNnQ29udGV4dCk7DQotICAgICAgICByZXR1cm4gSW52b2NhdGlvblJlc3BvbnNlLkNPTlRJTlVFOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rpc3BhdGNoZXJzL011c3RVbmRlcnN0YW5kVXRpbHMuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rpc3BhdGNoZXJzL011c3RVbmRlcnN0YW5kVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzM0MmU2MS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kaXNwYXRjaGVycy9NdXN0VW5kZXJzdGFuZFV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kaXNwYXRjaGVyczsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBIZWFkZXJCbG9jazsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzRGVzY3JpcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5QYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRW5kcG9pbnREZXNjcmlwdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5PcGVyYXRpb25EZXNjcmlwdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOw0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQotDQotLyoqDQotICogU3RhdGljIHV0aWxpdHkgbWV0aG9kcyB1c2VkIGluIHByb2Nlc3NpbmcgbXVzdFVuZGVyc3RhbmQgaGVhZGVycyByZWxhdGl2ZSB0byBKQVhXUy4NCi0gKi8NCi1wdWJsaWMgY2xhc3MgTXVzdFVuZGVyc3RhbmRVdGlscyB7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhNdXN0VW5kZXJzdGFuZFV0aWxzLmNsYXNzKTsNCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBNYXJrIGFsbCBoZWFkZXJzIGZvciBKQVhXUyBTRUkgbWV0aG9kIHBhcmFtYXRlcnMgYXMgdW5kZXJzdG9vZC4gIE5vdGUgdGhhdCBwZXIgdGhlIEpBWFdTDQotICAgICAqIDIuMCBzcGVjaWZpY2F0aW9uLCBhIGhlYWRlciBpcyBjb25zaWRlcmVkIHVuZGVyc3Rvb2QgaWYgaXQgdXNlZCBieSBhcyBhIHBhcmFtZXRlciBmb3IgDQotICAgICAqIGFueSBtZXRob2Qgb24gdGhlIFNFSSwgbm90IGp1c3QgdGhlIG1ldGhvZCBjb3JyZXNwb25kaW5nIHRvIHRoZSBpbmNvbWluZyBvcGVyYXRpb24uICANCi0gICAgICogU2VlIFNlY3Rpb24gMTAuMi4xIGl0ZW0gMy5hIHdoaWNoIHNwZWNpZmljYWxseSBzYXlzICJtYXBwZWQgdG8gbWV0aG9kIHBhcmFtZXRlcnMNCi0gICAgICogaW4gdGhlIHNlcnZpY2UgZW5kcG9pbnQgaW50ZXJmYWNlIi4NCi0gICAgICogDQotICAgICAqIEBwYXJhbSBtc2dDb250ZXh0DQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFya1VuZGVyc3Rvb2RIZWFkZXJQYXJhbWV0ZXJzKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHsNCi0gICAgICAgIGlmIChtc2dDb250ZXh0ID09IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIFNPQVBFbnZlbG9wZSBlbnZlbG9wZSA9IG1zZ0NvbnRleHQuZ2V0RW52ZWxvcGUoKTsNCi0gICAgICAgIGlmIChlbnZlbG9wZS5nZXRIZWFkZXIoKSA9PSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICBBcnJheUxpc3QgdW5kZXJzdG9vZEhlYWRlclFOYW1lcyA9IE11c3RVbmRlcnN0YW5kVXRpbHMuZ2V0SGVhZGVyUGFyYW1hdGVyTGlzdChtc2dDb250ZXh0KTsNCi0gICAgICAgIGlmICh1bmRlcnN0b29kSGVhZGVyUU5hbWVzID09IG51bGwgfHwgdW5kZXJzdG9vZEhlYWRlclFOYW1lcy5pc0VtcHR5KCkpIHsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIC8vIFBhc3NpbmcgaW4gbnVsbCB3aWxsIGdldCBoZWFkZXJzIHRhcmdldGVkIGZvciBORVhUIGFuZCBVTFRJTUFURSBSRUNFSVZFUg0KLSAgICAgICAgSXRlcmF0b3IgaGVhZGVyQmxvY2tzID0gZW52ZWxvcGUuZ2V0SGVhZGVyKCkuZ2V0SGVhZGVyc1RvUHJvY2VzcyhudWxsKTsNCi0gICAgICAgIHdoaWxlIChoZWFkZXJCbG9ja3MuaGFzTmV4dCgpKSB7DQotICAgICAgICAgICAgU09BUEhlYWRlckJsb2NrIGhlYWRlckJsb2NrID0gKFNPQVBIZWFkZXJCbG9jaykgaGVhZGVyQmxvY2tzLm5leHQoKTsNCi0gICAgICAgICAgICBRTmFtZSBoZWFkZXJRTiA9IGhlYWRlckJsb2NrLmdldFFOYW1lKCk7DQotICAgICAgICAgICAgaWYgKHVuZGVyc3Rvb2RIZWFkZXJRTmFtZXMuY29udGFpbnMoaGVhZGVyUU4pKSB7DQotICAgICAgICAgICAgICAgIGhlYWRlckJsb2NrLnNldFByb2Nlc3NlZCgpOw0KLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiSGVhZGVyIG1hcmtlZCBhcyBwcm9jZXNzZWQgYnkgSkFYV1MgTXVzdFVuZGVyc3RhbmRDaGVja2VyOiAiIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgaGVhZGVyUU4pOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBSZXR1cm4gYW4gQXJyYXlMaXN0IG9mIFFOYW1lcyBjb3JyZXNwb25kaW5nIHRvIFNPQVAgaGVhZGVycyB3aGljaCBtYXAgdG8gbWV0aG9kIHBhcmFtZXRlcnMNCi0gICAgICogZm9yIGFueSBtZXRob2RzIG9uIHRoZSBjb3JyZXNwb25kaW5nIFNFSSBhbmQgdGhlIFNPQVAgaGFuZGxlcnMuDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gbXNnQ29udGV4dA0KLSAgICAgKiBAcmV0dXJuIEFycmF5TGlzdCBvZiBRTmFtZXMgZm9yIGFsbCBoZWFkZXIgcGFyYW1ldGVycyBmb3IgYW4gU0VJIGFuZCBTT0FQIGhhbmRsZXJzLiAgDQotICAgICAqICAgICAgICAgVGhlIGxpc3QgbWF5IGJlIGVtcHR5IGJ1dCB3aWxsIG5vdCBiZSBudWxsLg0KLSAgICAgKi8NCi0gICAgc3RhdGljIEFycmF5TGlzdCBFTVBUWV9MSVNUID0gbmV3IEFycmF5TGlzdCgpOw0KLSAgICBwdWJsaWMgc3RhdGljIEFycmF5TGlzdCBnZXRIZWFkZXJQYXJhbWF0ZXJMaXN0KE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHsNCi0gICAgICAgIEFycmF5TGlzdCBoZWFkZXJzID0gbnVsbDsNCi0gICAgICAgIC8vIEJ1aWxkIGEgbGlzdCBvZiB1bmRlcnN0b29kIGhlYWRlcnMgZm9yIGFsbCB0aGUgb3BlcmF0aW9ucyB1bmRlciB0aGUgc2VydmljZQ0KLSAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UgPSBtc2dDb250ZXh0LmdldEF4aXNTZXJ2aWNlKCk7DQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcoIkJ1aWxkaW5nIGxpc3Qgb2YgdW5kZXJzdG9vZCBoZWFkZXJzIGZvciBhbGwgb3BlcmF0aW9ucyB1bmRlciAiICsgYXhpc1NlcnZpY2UpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKGF4aXNTZXJ2aWNlID09IG51bGwpIHsNCi0gICAgICAgICAgICBoZWFkZXJzID0gRU1QVFlfTElTVDsNCi0gICAgICAgIH0gZWxzZSAgew0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIEdldCB0aGUgdW5kZXJzdG9vZCBoZWFkZXJzIGZyb20gdGhlIHNlaSBtZXRob2RzDQotICAgICAgICAgICAgQXJyYXlMaXN0IHNlaU1ldGhvZEhlYWRlcnMgPSAoQXJyYXlMaXN0KSANCi0gICAgICAgICAgICAgICAgYXhpc1NlcnZpY2UuZ2V0UGFyYW1ldGVyVmFsdWUoInNlaU1ldGhvZEhlYWRlclBhcmFtZXRlciIpOw0KLQ0KLSAgICAgICAgICAgIGlmIChzZWlNZXRob2RIZWFkZXJzID09IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgLy8gZXhhbWluZSBTRUkgbWV0aG9kcw0KLSAgICAgICAgICAgICAgICBzZWlNZXRob2RIZWFkZXJzID0gbmV3IEFycmF5TGlzdCgpOw0KLSAgICAgICAgICAgICAgICBJdGVyYXRvciBvcGVyYXRpb25JdGVyYXRvciA9IGF4aXNTZXJ2aWNlLmdldE9wZXJhdGlvbnMoKTsNCi0gICAgICAgICAgICAgICAgaWYgKG9wZXJhdGlvbkl0ZXJhdG9yICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlIChvcGVyYXRpb25JdGVyYXRvci5oYXNOZXh0KCkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBBeGlzT3BlcmF0aW9uIG9wZXJhdGlvbiA9IChBeGlzT3BlcmF0aW9uKSBvcGVyYXRpb25JdGVyYXRvci5uZXh0KCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlMaXN0IGxpc3QgPSBnZXRTRUlNZXRob2RIZWFkZXJQYXJhbWV0ZXJMaXN0KG9wZXJhdGlvbik7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQWRkaW5nIGhlYWRlcnMgZnJvbSBvcGVyYXRpb24gIiArIG9wZXJhdGlvbiArICI7IGhlYWRlcnMgPSAiDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGxpc3QpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGlzdCAhPSBudWxsICYmICFsaXN0LmlzRW1wdHkoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWlNZXRob2RIZWFkZXJzLmFkZEFsbChsaXN0KTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICAgICAgICAgIC8vIFNhdmUgY2FsY3VsYXRlZCB2YWx1ZSBzaW5jZSB0aGlzIHdvbid0IGNoYW5nZQ0KLSAgICAgICAgICAgICAgICAgICAgYXhpc1NlcnZpY2UuYWRkUGFyYW1ldGVyKCJzZWlNZXRob2RIZWFkZXJQYXJhbWV0ZXIiLCBzZWlNZXRob2RIZWFkZXJzKTsNCi0gICAgICAgICAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGUpIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiUHJvYmxlbSBjYWNoaW5nIHNlaU1ldGhvZEhlYWRlclBhcmFtZXRlci4gICIgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJvY2Vzc2luZyBjb250aW51ZXMgd2l0aG91dCBjYWNoZWQgdmFsdWUiKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gR2V0IHRoZSB1bmRlcnN0b29kIGhlYWRlcnMgZnJvbSB0aGUgaGFuZGxlcnMNCi0gICAgICAgICAgICBBcnJheUxpc3QgaGFuZGxlckhlYWRlcnMgPSBnZXRIYW5kbGVyc0hlYWRlclBhcmFtZXRlckxpc3QoYXhpc1NlcnZpY2UpOw0KLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkFkZGluZyBoZWFkZXJzIGZyb20gU09BUCBoYW5kbGVyczsgaGVhZGVycyA9ICIgKyBoYW5kbGVySGVhZGVycyk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIE1ha2UgdGhlIGNvbWJpbmVkIGhlYWRlcnMgbGlzdC4NCi0gICAgICAgICAgICAvLyBUaGUgZm9sbG93aW5nIGNvZGUgYXZvaWRzIG1ha2luZyB0ZW1wb3JhcnkgYXJyYXkgbGlzdHMgZm9yIHBlcmZvcm1hbmNlL2djIHJlYXNvbnMNCi0gICAgICAgICAgICBpZiAoc2VpTWV0aG9kSGVhZGVycyA9PSBudWxsIHx8IHNlaU1ldGhvZEhlYWRlcnMuaXNFbXB0eSgpKSB7DQotICAgICAgICAgICAgICAgIGhlYWRlcnMgPSAoaGFuZGxlckhlYWRlcnMgPT0gbnVsbCkgPyBFTVBUWV9MSVNUIDogaGFuZGxlckhlYWRlcnM7ICAvLyBSZXR1cm4gaGFuZGxlciBoZWFkZXJzDQotICAgICAgICAgICAgfSBlbHNlIGlmIChoYW5kbGVySGVhZGVycyA9PSBudWxsIHx8IGhhbmRsZXJIZWFkZXJzLmlzRW1wdHkoKSkgew0KLSAgICAgICAgICAgICAgICBoZWFkZXJzID0gKHNlaU1ldGhvZEhlYWRlcnMgPT0gbnVsbCkgPyBFTVBUWV9MSVNUIDogc2VpTWV0aG9kSGVhZGVyczsgIC8vIFJldHVybiBzZWkgbWV0aG9kIGhlYWRlcnMNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBoZWFkZXJzID0gbmV3IEFycmF5TGlzdCgpOw0KLSAgICAgICAgICAgICAgICBoZWFkZXJzLmFkZEFsbChzZWlNZXRob2RIZWFkZXJzKTsNCi0gICAgICAgICAgICAgICAgaGVhZGVycy5hZGRBbGwoaGFuZGxlckhlYWRlcnMpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBoZWFkZXJzOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogUmV0dXJuIGFuIEFycmF5TGlzdCBvZiBRTmFtZXMgY29ycmVzcG9uZGluZyB0byBTT0FQIGhlYWRlcnMgd2hpY2ggbWFwIHRvIG1ldGhvZCBwYXJhbWV0ZXJzDQotICAgICAqIGZvciBhIHNwZWNpZmljIG9wZXJhdGlvbi4NCi0gICAgICogDQotICAgICAqIEBwYXJhbSBheGlzT3BlcmF0aW9uDQotICAgICAqIEByZXR1cm4gQXJyYXlMaXN0IG9mIGhlYWRlciBRTmFtZXMgZm9yIGFsbCBoZWFkZXIgcGFyYW10ZXJzIG9uIGFuIG9wZXJhdGlvbiwgb3IgbnVsbCBpZiBub25lLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyBBcnJheUxpc3QgZ2V0U0VJTWV0aG9kSGVhZGVyUGFyYW1ldGVyTGlzdChBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb24pIHsNCi0gICAgICAgIHJldHVybiBnZXRIZWFkZXJQYXJhbWV0ZXJMaXN0KGF4aXNPcGVyYXRpb24sIE9wZXJhdGlvbkRlc2NyaXB0aW9uLkhFQURFUl9QQVJBTUVURVJfUU5BTUVTKTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFJldHVybiBhbiBBcnJheUxpc3Qgb2YgUU5hbWVzIHRoYXQgaXMgYSBjb2xsZWN0aW9uIG9mIFNPQVAgaGFuZGxlcnMgDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gYXhpc1NlcnZpY2UNCi0gICAgICogQHJldHVybiBBcnJheUxpc3Qgb2YgaGVhZGVyIFFOYW1lcy4gICAgIA0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyBBcnJheUxpc3QgZ2V0SGFuZGxlcnNIZWFkZXJQYXJhbWV0ZXJMaXN0KEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlKSB7DQotICAgICAgICByZXR1cm4gZ2V0SGVhZGVyUGFyYW1ldGVyTGlzdChheGlzU2VydmljZSwgRW5kcG9pbnREZXNjcmlwdGlvbi5IQU5ETEVSX1BBUkFNRVRFUl9RTkFNRVMpOw0KLSAgICB9DQotICAgIA0KLSAgICBwcml2YXRlIHN0YXRpYyBBcnJheUxpc3QgZ2V0SGVhZGVyUGFyYW1ldGVyTGlzdChBeGlzRGVzY3JpcHRpb24gYXhpc0Rlc2NyaXB0aW9uLCBTdHJpbmcgcGFyYW1OYW1lKSB7ICAgICAgICANCi0gICAgICAgIFBhcmFtZXRlciBoZWFkZXJRTmFtZXNQYXJhbWV0ZXIgPSBheGlzRGVzY3JpcHRpb24uZ2V0UGFyYW1ldGVyKHBhcmFtTmFtZSk7DQotICAgICAgICBpZiAoaGVhZGVyUU5hbWVzUGFyYW1ldGVyID09IG51bGwpIHsNCi0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJQYXJhbWV0ZXIgbm90IG9uICIgKyBheGlzRGVzY3JpcHRpb24gKyAiOyAiIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgKyBwYXJhbU5hbWUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIEFycmF5TGlzdCB1bmRlcnN0b29kSGVhZGVyUU5hbWVzID0gKEFycmF5TGlzdCkgaGVhZGVyUU5hbWVzUGFyYW1ldGVyLmdldFZhbHVlKCk7DQotICAgICAgICBpZiAodW5kZXJzdG9vZEhlYWRlclFOYW1lcyA9PSBudWxsIHx8IHVuZGVyc3Rvb2RIZWFkZXJRTmFtZXMuaXNFbXB0eSgpKSB7DQotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiUGFyYW1ldGVyIHZhbHVlIGlzIGVtcHR5OiAiICArIGF4aXNEZXNjcmlwdGlvbiArICI7ICIgDQotICAgICAgICAgICAgICAgICAgICAgICAgICArIHBhcmFtTmFtZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHVuZGVyc3Rvb2RIZWFkZXJRTmFtZXM7DQotICAgIH0NCi0gICAgDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rpc3BhdGNoZXJzL011c3RVbmRlcnN0YW5kVmFsaWRhdGlvbkRpc3BhdGNoZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rpc3BhdGNoZXJzL011c3RVbmRlcnN0YW5kVmFsaWRhdGlvbkRpc3BhdGNoZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjgwYmMyNy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kaXNwYXRjaGVycy9NdXN0VW5kZXJzdGFuZFZhbGlkYXRpb25EaXNwYXRjaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kaXNwYXRjaGVyczsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBIZWFkZXJCbG9jazsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BYnN0cmFjdERpc3BhdGNoZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaTE4bi5NZXNzYWdlczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOw0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQotDQotLyoqDQotICogRG8gSkFYV1MgTXVzdFVuZGVyc3RhbmQgaGVhZGVyIHByb2Nlc3NpbmcgcGVyIHRoZSBKQVhXUyAyLjAgc3BlY2lmaWNhdGlvbi4gIFRoaXMgY2hlY2tzIGZvcg0KLSAqIGEgc3BlY2lmaWMgY29tcGxpYW5jZSBzaXR1YXRpb24gd2hlcmUgYSBub24tZXhpc3RhbnQgb3BlcmF0aW9uIHdpdGggbXVzdFVuZGVyc3Rvb2QgaGVhZGVycyANCi0gKiB0aGF0IGFyZSBub3QgdW5kZXJzdG9vZCBtdXN0IHRocm93IGEgbXVzdFVuZGVyc3RhbmRGYXVsdCByYXRoZXIgdGhhbiBhbiBpbnZhbGlkIEVQUiBleGNlcHRpb24uDQotICogDQotICogIE5vdGUgdGhhdCB0aGlzIGhhbmRsZXIgc2hvdWxkIGJlIGluc2VydGVkIGluIHRoZSBpbmJvdW5kIGRpc3BhdGhlciBjaGFpbnMgc28gdGhhdCB0aGUNCi0gKiAgRGlzcGF0Y2hlciBjaGVja1Bvc3RDb25kaXRpb25zIGRvZXMgbm90IHRocm93IHRoZSBpbnZhbGlkIEVQUiBmYXVsdCBpZiB0aGUgb3BlcmF0aW9uIGlzIG51bGwuDQotICovDQotcHVibGljIGNsYXNzIE11c3RVbmRlcnN0YW5kVmFsaWRhdGlvbkRpc3BhdGNoZXIgZXh0ZW5kcyBBYnN0cmFjdERpc3BhdGNoZXIgew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coTXVzdFVuZGVyc3RhbmRWYWxpZGF0aW9uRGlzcGF0Y2hlci5jbGFzcyk7DQotDQotICAgIC8qIChub24tSmF2YWRvYykNCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BYnN0cmFjdERpc3BhdGNoZXIjZmluZE9wZXJhdGlvbihvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlLCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQpDQotICAgICAqLw0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIEF4aXNPcGVyYXRpb24gZmluZE9wZXJhdGlvbihBeGlzU2VydmljZSBzZXJ2aWNlLCBNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCkNCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsNCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIC8qIChub24tSmF2YWRvYykNCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BYnN0cmFjdERpc3BhdGNoZXIjZmluZFNlcnZpY2Uob3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0KQ0KLSAgICAgKi8NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBBeGlzU2VydmljZSBmaW5kU2VydmljZShNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdCB7DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICAvKiAobm9uLUphdmFkb2MpDQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQWJzdHJhY3REaXNwYXRjaGVyI2luaXREaXNwYXRjaGVyKCkNCi0gICAgICovDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgdm9pZCBpbml0RGlzcGF0Y2hlcigpIHsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgSW52b2NhdGlvblJlc3BvbnNlIGludm9rZShNZXNzYWdlQ29udGV4dCBtc2djdHgpIHRocm93cyBBeGlzRmF1bHQgew0KLSAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UgPSBtc2djdHguZ2V0QXhpc1NlcnZpY2UoKTsNCi0gICAgICAgIEF4aXNPcGVyYXRpb24gYXhpc09wZXJhdGlvbiA9IG1zZ2N0eC5nZXRBeGlzT3BlcmF0aW9uKCk7DQotICAgICAgICANCi0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiSkFYV1MgTXVzdFVuZGVyc3RhbmRWYWxpZGF0aW9uRGlzcGF0Y2hlci5pbnZva2Ugb24gQXhpc1NlcnZpY2UgIiANCi0gICAgICAgICAgICAgICAgICAgICAgKyBheGlzU2VydmljZQ0KLSAgICAgICAgICAgICAgICAgICAgICArICI7IEF4aXNPcGVyYXRpb24gIiArIGF4aXNPcGVyYXRpb24pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgLy8gUkVWSUVXOiBUaGlzIHdpbGwgb25seSBjaGVjayBkbyB0aGUgbXVzdFVuZGVyc3RhbmQgY2hlY2tpbmcgaWYgdGhlIG9wZXJhdGlvbiBpcyBudWxsDQotICAgICAgICAvLyBUaGF0IGlzIGJlY2F1c2UgSkFYV1MgY29tcGxpYW5jZSByZXF1aXJlcyB3ZSB0aHJvdyBhIG11c3RVbmRlcnN0YW5kIGZhdWx0IGV2ZW4gaWYgdGhlIG9wZXJhdGlvbiBpcw0KLSAgICAgICAgLy8gaW52YWxpZC4gIElmIHRoZSBvcGVyYXRpb24gaXMgdmFsaWQsIHRoZW4gZnVydGhlciBtdXN0VW5kZXJzdGFuZCBwcm9jZXNzaW5nIHdpbGwgYmUgZG9uZQ0KLSAgICAgICAgLy8gYnkgdGhlIEpBWFdTIE11c3RVbmRlcnN0YW5kQ2hlY2tlciBoYW5kbGVyLiANCi0gICAgICAgIGlmIChheGlzU2VydmljZSAhPSBudWxsICYmIGF4aXNPcGVyYXRpb24gPT0gbnVsbCkgew0KLSAgICAgICAgICAgIGNoZWNrTXVzdFVuZGVyc3RhbmQobXNnY3R4KTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBJbnZvY2F0aW9uUmVzcG9uc2UuQ09OVElOVUU7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGNoZWNrTXVzdFVuZGVyc3RhbmQoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdCB7DQotICAgICAgICBib29sZWFuIGNoZWNrc1Bhc3MgPSB0cnVlOw0KLQ0KLSAgICAgICAgU09BUEVudmVsb3BlIGVudmVsb3BlID0gbXNnQ29udGV4dC5nZXRFbnZlbG9wZSgpOw0KLSAgICAgICAgaWYgKGVudmVsb3BlLmdldEhlYWRlcigpID09IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gY2hlY2tzUGFzczsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgLy8gRmlyc3QgbWFyayBhbGwgdGhlIGhlYWRlcnMgSkFYV1Mgd291bGQgdW5kZXJzdGFuZCB0byBtYWtlIHN1cmUgd2UgZG9uJ3QgdGhyb3cNCi0gICAgICAgIC8vIGEgbXVzdFVuZGVyc3RhbmQgZmF1bHQgaW5hcHByb3ByaWF0ZWx5IGZvciB0aG9zZS4NCi0gICAgICAgIE11c3RVbmRlcnN0YW5kVXRpbHMubWFya1VuZGVyc3Rvb2RIZWFkZXJQYXJhbWV0ZXJzKG1zZ0NvbnRleHQpOw0KLQ0KLSAgICAgICAgLy8gTm93IGNoZWNrIGFsbCB0aGUgaGVhZGVycyBhbmQgdGhyb3cgdGhlIG11c3RVbmRlcnN0YW5kRmF1bHQgaWYgYW55IG5vdCB1bmRlcnN0b29kLg0KLSAgICAgICAgLy8gUkVWSUVXOiBOb3RlIHRoYXQgUW9TZXMgdGhhdCB3b3VsZCBydW4gYWZ0ZXIgdGhlIGRpc3BhdGNoIHBoYXNlIHdpbGwgbm90IGhhdmUgbWFya2VkDQotICAgICAgICAvLyB0aGVpciBoZWFkZXJzIHlldC4NCi0NCi0gICAgICAgIEl0ZXJhdG9yIGhlYWRlckJsb2NrcyA9IGVudmVsb3BlLmdldEhlYWRlcigpLmdldEhlYWRlcnNUb1Byb2Nlc3MobnVsbCk7DQotICAgICAgICB3aGlsZSAoaGVhZGVyQmxvY2tzLmhhc05leHQoKSkgew0KLSAgICAgICAgICAgIFNPQVBIZWFkZXJCbG9jayBoZWFkZXJCbG9jayA9IChTT0FQSGVhZGVyQmxvY2spIGhlYWRlckJsb2Nrcy5uZXh0KCk7DQotICAgICAgICAgICAgaWYgKGhlYWRlckJsb2NrLmlzUHJvY2Vzc2VkKCkgfHwgIWhlYWRlckJsb2NrLmdldE11c3RVbmRlcnN0YW5kKCkpIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIFFOYW1lIGZhdWx0UU5hbWUgPSBoZWFkZXJCbG9jay5nZXRWZXJzaW9uKCkuZ2V0TXVzdFVuZGVyc3RhbmRGYXVsdENvZGUoKTsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KE1lc3NhZ2VzLmdldE1lc3NhZ2UoIm11c3R1bmRlcnN0YW5kZmFpbGVkIiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyQmxvY2suZ2V0TmFtZXNwYWNlKCkuZ2V0TmFtZXNwYWNlVVJJKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlckJsb2NrLmdldExvY2FsTmFtZSgpKSwgZmF1bHRRTmFtZSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gY2hlY2tzUGFzczsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9mZWF0dXJlL0NsaWVudENvbmZpZ3VyYXRvci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZmVhdHVyZS9DbGllbnRDb25maWd1cmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTMyN2M3Ni4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9mZWF0dXJlL0NsaWVudENvbmZpZ3VyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5mZWF0dXJlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUuTWVzc2FnZUNvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc3BpLkJpbmRpbmc7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc3BpLkJpbmRpbmdQcm92aWRlcjsNCi0NCi0vKioNCi0gKiANCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIENsaWVudENvbmZpZ3VyYXRvciB7DQotICAgIC8qKg0KLSAgICAgKiBQZXJmb3JtIGNsaWVudC1zaWRlIGNvbmZpZ3VyYXRpb24gZm9yIGEgPGNvZGU+V2ViU2VydmljZUZlYXR1cmU8L2NvZGU+Lg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIG1lc3NhZ2VDb250ZXh0DQotICAgICAqIEBwYXJhbSBwcm92aWRlcg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgY29uZmlndXJlKE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0LCBCaW5kaW5nUHJvdmlkZXIgcHJvdmlkZXIpOw0KLSAgICANCi0gICAgLyoqDQotICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBjb25maWd1cmF0b3Igc3VwcG9ydHMgdGhlIHNwZWNpZmllZCBiaW5kaW5nLg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGJpbmRpbmcgdGhlIGJpbmRpbmcgdG8gdGVzdA0KLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjb25maWd1cmF0b3Igc3VwcG9ydHMgdGhlIGJpbmRpbmcsIDxjb2RlPmZhbHNlPC9jb2RlPg0KLSAgICAgKiBvdGhlcndpc2UuDQotICAgICAqLw0KLSAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhCaW5kaW5nIGJpbmRpbmcpOw0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9mZWF0dXJlL0NsaWVudEZyYW1ld29yay5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZmVhdHVyZS9DbGllbnRGcmFtZXdvcmsuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk4MDljZi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9mZWF0dXJlL0NsaWVudEZyYW1ld29yay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5mZWF0dXJlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLkV4Y2VwdGlvbkZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS5NZXNzYWdlQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5pMThuLk1lc3NhZ2VzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNwaS5CaW5kaW5nUHJvdmlkZXI7DQotDQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRmVhdHVyZTsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotcHVibGljIGNsYXNzIENsaWVudEZyYW1ld29yayB7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFdlYlNlcnZpY2VGZWF0dXJlW10gWkVST19MRU5HVEhfQVJSQVkgPSBuZXcgV2ViU2VydmljZUZlYXR1cmVbMF07DQotICAgIA0KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIENsaWVudENvbmZpZ3VyYXRvcj4gY29uZmlndXJhdG9yTWFwOw0KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIFdlYlNlcnZpY2VGZWF0dXJlPiBmZWF0dXJlTWFwOw0KLSAgICANCi0gICAgcHVibGljIENsaWVudEZyYW1ld29yaygpIHsNCi0gICAgCXN1cGVyKCk7DQotICAgICAgICBjb25maWd1cmF0b3JNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIENsaWVudENvbmZpZ3VyYXRvcj4oKTsNCi0gICAgICAgIGZlYXR1cmVNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFdlYlNlcnZpY2VGZWF0dXJlPigpOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCBhZGRDb25maWd1cmF0b3IoU3RyaW5nIGlkLCBDbGllbnRDb25maWd1cmF0b3IgY29uZmlndXJhdG9yKSB7DQotICAgICAgICBjb25maWd1cmF0b3JNYXAucHV0KGlkLCBjb25maWd1cmF0b3IpOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKFdlYlNlcnZpY2VGZWF0dXJlIGZlYXR1cmUpIHsNCi0gICAgICAgIGlmIChmZWF0dXJlID09IG51bGwpDQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgDQotICAgICAgICByZXR1cm4gY29uZmlndXJhdG9yTWFwLmNvbnRhaW5zS2V5KGZlYXR1cmUuZ2V0SUQoKSk7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIGFkZEZlYXR1cmUoV2ViU2VydmljZUZlYXR1cmUgZmVhdHVyZSkgew0KLSAgICAgICAgaWYgKCFpc1ZhbGlkKGZlYXR1cmUpKSB7DQotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJpbnZhbGlkV1NGZWF0dXJlIiwNCi0gICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlLmdldElEKCkpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGZlYXR1cmVNYXAucHV0KGZlYXR1cmUuZ2V0SUQoKSwgZmVhdHVyZSk7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyBXZWJTZXJ2aWNlRmVhdHVyZSBnZXRGZWF0dXJlKFN0cmluZyBpZCkgew0KLSAgICAgICAgcmV0dXJuIGZlYXR1cmVNYXAuZ2V0KGlkKTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIFdlYlNlcnZpY2VGZWF0dXJlW10gZ2V0QWxsRmVhdHVyZXMoKSB7DQotICAgICAgICByZXR1cm4gZmVhdHVyZU1hcC52YWx1ZXMoKS50b0FycmF5KFpFUk9fTEVOR1RIX0FSUkFZKTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIHZvaWQgY29uZmlndXJlKE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0LCBCaW5kaW5nUHJvdmlkZXIgcHJvdmlkZXIpIHsNCi0gICAgICAgIGZvciAoV2ViU2VydmljZUZlYXR1cmUgZmVhdHVyZSA6IGdldEFsbEZlYXR1cmVzKCkpIHsNCi0gICAgICAgICAgICBDbGllbnRDb25maWd1cmF0b3IgY29uZmlndXJhdG9yID0gY29uZmlndXJhdG9yTWFwLmdldChmZWF0dXJlLmdldElEKCkpOw0KLSAgICAgICAgICAgIGNvbmZpZ3VyYXRvci5jb25maWd1cmUobWVzc2FnZUNvbnRleHQsIHByb3ZpZGVyKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9mcmFtZXdvcmsvSkFYV1NEZXBsb3llci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZnJhbWV3b3JrL0pBWFdTRGVwbG95ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE4ZTMxMC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9mcmFtZXdvcmsvSkFYV1NEZXBsb3llci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZnJhbWV3b3JrOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LkRlcGxveWVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQuRGVwbG95bWVudEVuZ2luZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LkRlcGxveW1lbnRFcnJvck1zZ3M7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC5EZXBsb3ltZW50RXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQucmVwb3NpdG9yeS51dGlsLkRlcGxveW1lbnRGaWxlRGF0YTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LnV0aWwuVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZUdyb3VwOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0NvbmZpZ3VyYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaTE4bi5NZXNzYWdlczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5hZGRyZXNzaW5nLnV0aWwuRW5kcG9pbnRDb250ZXh0TWFwOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmFkZHJlc3NpbmcudXRpbC5FbmRwb2ludENvbnRleHRNYXBNYW5hZ2VyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmFkZHJlc3NpbmcudXRpbC5FbmRwb2ludEtleTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5EZXNjcmlwdGlvbkZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRW5kcG9pbnREZXNjcmlwdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zZXJ2ZXIuSkFYV1NNZXNzYWdlUmVjZWl2ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5Mb2FkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5pby5GaWxlVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlUHJvdmlkZXI7DQotaW1wb3J0IGphdmEuaW8uRmlsZTsNCi1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07DQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7DQotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOw0KLWltcG9ydCBqYXZhLm5ldC5VUkw7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuamFyLkphcklucHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5Ow0KLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcElucHV0U3RyZWFtOw0KLQ0KLS8qDQotICogSkFYV1NEZXBsb3llciBpcyBhIGN1c3RvbSBkZXBsb3llciBtb2RlbGVkIGFmdGVyIHRoZSBQT0pPRGVwbG95ZXIuIEl0cyBwdXJwb3NlDQotICogaXMgdG8gZGVwbG95IC53YXJzIGFuZCBleHBhbmRlZCAud2FyIGRpcmVjdG9yaWVzDQotICovDQotcHVibGljIGNsYXNzIEpBWFdTRGVwbG95ZXIgaW1wbGVtZW50cyBEZXBsb3llciB7DQotDQotICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhKQVhXU0RlcGxveWVyLmNsYXNzKTsNCi0NCi0gICAgcHJvdGVjdGVkIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0N0eDsNCi0gICAgcHJvdGVjdGVkIEF4aXNDb25maWd1cmF0aW9uIGF4aXNDb25maWc7DQotDQotICAgIC8vVG8gaW5pdGlhbGl6ZSB0aGUgZGVwbG95ZXINCi0gICAgcHVibGljIHZvaWQgaW5pdChDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDdHgpIHsNCi0gICAgICAgIHRoaXMuY29uZmlnQ3R4ID0gY29uZmlnQ3R4Ow0KLSAgICAgICAgdGhpcy5heGlzQ29uZmlnID0gY29uZmlnQ3R4LmdldEF4aXNDb25maWd1cmF0aW9uKCk7DQotICAgICAgICBkZXBsb3lTZXJ2aWNlc0luV0FSQ2xhc3NQYXRoKCk7DQotICAgIH0vL1dpbGwgcHJvY2VzcyB0aGUgZmlsZSBhbmQgYWRkIHRoYXQgdG8gYXhpc0NvbmZpZw0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBkZXBsb3lTZXJ2aWNlc0luV0FSQ2xhc3NQYXRoKCkgew0KLSAgICAgICAgU3RyaW5nIGRpciA9IERlcGxveW1lbnRFbmdpbmUuZ2V0V2ViTG9jYXRpb25TdHJpbmcoKTsNCi0gICAgICAgIGlmIChkaXIgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGRpciArICIvV0VCLUlORi9jbGFzc2VzLyIpOw0KLSAgICAgICAgICAgIFVSTCByZXBvc2l0b3J5ID0gYXhpc0NvbmZpZy5nZXRSZXBvc2l0b3J5KCk7DQotICAgICAgICAgICAgaWYgKCFmaWxlLmlzRGlyZWN0b3J5KCkgfHwgcmVwb3NpdG9yeSA9PSBudWxsKQ0KLSAgICAgICAgICAgICAgICByZXR1cm47DQotICAgICAgICAgICAgQXJyYXlMaXN0IGNsYXNzTGlzdCA9IGdldENsYXNzZXNJbldlYkluZkRpcmVjdG9yeShmaWxlKTsNCi0gICAgICAgICAgICBDbGFzc0xvYWRlciB0aHJlYWRDbGFzc0xvYWRlciA9IG51bGw7DQotICAgICAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICAgICAgdGhyZWFkQ2xhc3NMb2FkZXIgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOw0KLSAgICAgICAgICAgICAgICBBcnJheUxpc3QgdXJscyA9IG5ldyBBcnJheUxpc3QoKTsNCi0gICAgICAgICAgICAgICAgdXJscy5hZGQocmVwb3NpdG9yeSk7DQotICAgICAgICAgICAgICAgIFN0cmluZyB3ZWJMb2NhdGlvbiA9IERlcGxveW1lbnRFbmdpbmUuZ2V0V2ViTG9jYXRpb25TdHJpbmcoKTsNCi0gICAgICAgICAgICAgICAgaWYgKHdlYkxvY2F0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgICAgIHVybHMuYWRkKG5ldyBGaWxlKHdlYkxvY2F0aW9uKS50b1VSTCgpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBDbGFzc0xvYWRlciBjbGFzc0xvYWRlciA9IFV0aWxzLmNyZWF0ZUNsYXNzTG9hZGVyKA0KLSAgICAgICAgICAgICAgICAgICAgICAgIHVybHMsDQotICAgICAgICAgICAgICAgICAgICAgICAgYXhpc0NvbmZpZy5nZXRTeXN0ZW1DbGFzc0xvYWRlcigpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsDQotICAgICAgICAgICAgICAgICAgICAgICAgKEZpbGUpIGF4aXNDb25maWcuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRQYXJhbWV0ZXJWYWx1ZShDb25zdGFudHMuQ29uZmlndXJhdGlvbi5BUlRJRkFDVFNfVEVNUF9ESVIpKTsNCi0gICAgICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIoY2xhc3NMb2FkZXIpOw0KLSAgICAgICAgICAgICAgICBkZXBsb3lDbGFzc2VzKCJKQVhXUy1CdWlsdGluIiwgZmlsZS50b1VSTCgpLCBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpLCBjbGFzc0xpc3QpOw0KLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgICAgIGxvZy5pbmZvKE1lc3NhZ2VzLmdldE1lc3NhZ2UoImRlcGxveWluZ2V4Y2VwdGlvbiIsIGUuZ2V0TWVzc2FnZSgpKSwgZSk7DQotICAgICAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgICAgICAgaWYgKHRocmVhZENsYXNzTG9hZGVyICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyKHRocmVhZENsYXNzTG9hZGVyKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgQXJyYXlMaXN0IGdldENsYXNzZXNJbldlYkluZkRpcmVjdG9yeShGaWxlIGZpbGUpIHsNCi0gICAgICAgIFN0cmluZyBmaWxlUGF0aCA9IGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7DQotICAgICAgICBDb2xsZWN0aW9uIGZpbGVzID0gRmlsZVV0aWxzLmxpc3RGaWxlcyhmaWxlLCBuZXcgU3RyaW5nW117ImNsYXNzIn0sIHRydWUpOw0KLSAgICAgICAgQXJyYXlMaXN0IGNsYXNzTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsNCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBmaWxlcy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7DQotICAgICAgICAgICAgRmlsZSBmID0gKEZpbGUpIGl0ZXJhdG9yLm5leHQoKTsNCi0gICAgICAgICAgICBTdHJpbmcgZlBhdGggPSBmLmdldEFic29sdXRlUGF0aCgpOw0KLSAgICAgICAgICAgIFN0cmluZyBmcWNuID0gZlBhdGguc3Vic3RyaW5nKGZpbGVQYXRoLmxlbmd0aCgpICsgMSk7DQotICAgICAgICAgICAgZnFjbiA9IGZxY24uc3Vic3RyaW5nKDAsIGZxY24ubGVuZ3RoKCkgLSAiLmNsYXNzIi5sZW5ndGgoKSk7DQotICAgICAgICAgICAgZnFjbiA9IGZxY24ucmVwbGFjZSgnLycsICcuJyk7DQotICAgICAgICAgICAgZnFjbiA9IGZxY24ucmVwbGFjZSgnXFwnLCAnLicpOw0KLSAgICAgICAgICAgIGNsYXNzTGlzdC5hZGQoZnFjbik7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gY2xhc3NMaXN0Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGRlcGxveShEZXBsb3ltZW50RmlsZURhdGEgZGVwbG95bWVudEZpbGVEYXRhKSB7DQotICAgICAgICBDbGFzc0xvYWRlciB0aHJlYWRDbGFzc0xvYWRlciA9IG51bGw7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIHRocmVhZENsYXNzTG9hZGVyID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsNCi0gICAgICAgICAgICBTdHJpbmcgZ3JvdXBOYW1lID0gZGVwbG95bWVudEZpbGVEYXRhLmdldE5hbWUoKTsNCi0gICAgICAgICAgICBVUkwgbG9jYXRpb24gPSBkZXBsb3ltZW50RmlsZURhdGEuZ2V0RmlsZSgpLnRvVVJMKCk7DQotICAgICAgICAgICAgaWYgKGlzSmFyKGRlcGxveW1lbnRGaWxlRGF0YS5nZXRGaWxlKCkpKSB7DQotICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJEZXBsb3lpbmcgYXJ0aWZhY3QgOiAiICsgZGVwbG95bWVudEZpbGVEYXRhLmdldE5hbWUoKSk7DQotICAgICAgICAgICAgICAgIEFycmF5TGlzdCB1cmxzID0gbmV3IEFycmF5TGlzdCgpOw0KLSAgICAgICAgICAgICAgICB1cmxzLmFkZChkZXBsb3ltZW50RmlsZURhdGEuZ2V0RmlsZSgpLnRvVVJMKCkpOw0KLSAgICAgICAgICAgICAgICB1cmxzLmFkZChheGlzQ29uZmlnLmdldFJlcG9zaXRvcnkoKSk7DQotICAgICAgICAgICAgICAgIFN0cmluZyB3ZWJMb2NhdGlvbiA9IERlcGxveW1lbnRFbmdpbmUuZ2V0V2ViTG9jYXRpb25TdHJpbmcoKTsNCi0gICAgICAgICAgICAgICAgaWYgKHdlYkxvY2F0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgICAgIHVybHMuYWRkKG5ldyBGaWxlKHdlYkxvY2F0aW9uKS50b1VSTCgpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBDbGFzc0xvYWRlciBjbGFzc0xvYWRlciA9IFV0aWxzLmNyZWF0ZUNsYXNzTG9hZGVyKA0KLSAgICAgICAgICAgICAgICAgICAgICAgIHVybHMsDQotICAgICAgICAgICAgICAgICAgICAgICAgYXhpc0NvbmZpZy5nZXRTeXN0ZW1DbGFzc0xvYWRlcigpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsDQotICAgICAgICAgICAgICAgICAgICAgICAgKEZpbGUpIGF4aXNDb25maWcuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRQYXJhbWV0ZXJWYWx1ZShDb25zdGFudHMuQ29uZmlndXJhdGlvbi5BUlRJRkFDVFNfVEVNUF9ESVIpKTsNCi0gICAgICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIoY2xhc3NMb2FkZXIpOw0KLQ0KLSAgICAgICAgICAgICAgICBBcnJheUxpc3QgY2xhc3NMaXN0ID0gZ2V0TGlzdE9mQ2xhc3NlcyhkZXBsb3ltZW50RmlsZURhdGEpOw0KLSAgICAgICAgICAgICAgICBBeGlzU2VydmljZUdyb3VwIHNlcnZpY2VHcm91cCA9IGRlcGxveUNsYXNzZXMoZ3JvdXBOYW1lLCBsb2NhdGlvbiwgY2xhc3NMb2FkZXIsIGNsYXNzTGlzdCk7IA0KLSAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgaWYoc2VydmljZUdyb3VwID09IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiRXJyb3I6XG4gTm8gYW5ub3RhdGVkIGNsYXNzZXMgZm91bmQgaW4gdGhlIGphcjogIiArDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uLnRvU3RyaW5nKCkgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLiBTZXJ2aWNlIGRlcGxveW1lbnQgZmFpbGVkLiI7DQotICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3IobXNnKTsNCi0gICAgICAgICAgICAgICAgICAgIGF4aXNDb25maWcuZ2V0RmF1bHR5U2VydmljZXMoKS4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHV0KGRlcGxveW1lbnRGaWxlRGF0YS5nZXRGaWxlKCkuZ2V0QWJzb2x1dGVQYXRoKCksIG1zZyk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhNZXNzYWdlcy5nZXRNZXNzYWdlKCJzdHJvcmluZ2ZhdWx0eXNlcnZpY2UiLCB0LmdldE1lc3NhZ2UoKSksIHQpOw0KLSAgICAgICAgICAgIHN0b3JlRmF1bHR5U2VydmljZShkZXBsb3ltZW50RmlsZURhdGEsIHQpOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgICBpZiAodGhyZWFkQ2xhc3NMb2FkZXIgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcih0aHJlYWRDbGFzc0xvYWRlcik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBBeGlzU2VydmljZUdyb3VwIGRlcGxveUNsYXNzZXMoU3RyaW5nIGdyb3VwTmFtZSwgVVJMIGxvY2F0aW9uLCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlciwgTGlzdCBjbGFzc0xpc3QpDQotICAgICAgICAgICAgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24sIEluc3RhbnRpYXRpb25FeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIEF4aXNGYXVsdCB7DQotICAgICAgICBBcnJheUxpc3QgYXhpc1NlcnZpY2VMaXN0ID0gbmV3IEFycmF5TGlzdCgpOw0KLSAgICAgICAgZm9yIChpbnQgaSA9IDAsIHNpemUgPSBjbGFzc0xpc3Quc2l6ZSgpOyBpIDwgc2l6ZTsgaSsrKSB7DQotICAgICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IChTdHJpbmcpIGNsYXNzTGlzdC5nZXQoaSk7DQotICAgICAgICAgICAgQ2xhc3MgcG9qb0NsYXNzOw0KLSAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgIHBvam9DbGFzcyA9IExvYWRlci5sb2FkQ2xhc3MoY2xhc3NMb2FkZXIsIGNsYXNzTmFtZSk7DQotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpew0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgV2ViU2VydmljZSB3c0Fubm90YXRpb24gPSAoV2ViU2VydmljZSkgcG9qb0NsYXNzLmdldEFubm90YXRpb24oV2ViU2VydmljZS5jbGFzcyk7DQotICAgICAgICAgICAgV2ViU2VydmljZVByb3ZpZGVyIHdzcEFubm90YXRpb24gPSBudWxsOw0KLSAgICAgICAgICAgIGlmICh3c0Fubm90YXRpb24gPT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICB3c3BBbm5vdGF0aW9uID0gKFdlYlNlcnZpY2VQcm92aWRlcikgcG9qb0NsYXNzLmdldEFubm90YXRpb24oV2ViU2VydmljZVByb3ZpZGVyLmNsYXNzKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgLy8gQ3JlYXRlIGFuIEF4aXMgU2VydmljZSBvbmx5IGlmIHRoZSBjbGFzcyBpcyBub3QgYW4gaW50ZXJmYWNlIGFuZCBpdCBoYXMgZWl0aGVyIA0KLSAgICAgICAgICAgIC8vIEBXZWJTZXJ2aWNlIGFubm90YXRpb24gb3IgQFdlYlNlcnZpY2VQcm92aWRlciBhbm5vdGF0aW9uLg0KLSAgICAgICAgICAgIGlmICgod3NBbm5vdGF0aW9uICE9IG51bGwNCi0gICAgICAgICAgICAgICAgICAgIHx8IHdzcEFubm90YXRpb24gIT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgICAgICYmICFwb2pvQ2xhc3MuaXNJbnRlcmZhY2UoKSkgew0KLSAgICAgICAgICAgICAgICBBeGlzU2VydmljZSBheGlzU2VydmljZTsNCi0gICAgICAgICAgICAgICAgYXhpc1NlcnZpY2UgPQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUF4aXNTZXJ2aWNlKGNsYXNzTG9hZGVyLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24pOw0KLSAgICAgICAgICAgICAgICBpZihheGlzU2VydmljZSAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICBsb2cuaW5mbygiRGVwbG95aW5nIEpBWFdTIGFubm90YXRlZCBjbGFzcyAiICsgY2xhc3NOYW1lICsgIiBhcyBhIHNlcnZpY2UgLSAiICsgYXhpc1NlcnZpY2UuZ2V0TmFtZSgpKTsNCi0gICAgICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlTGlzdC5hZGQoYXhpc1NlcnZpY2UpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgaW50IHNpemUgPSBheGlzU2VydmljZUxpc3Quc2l6ZSgpOw0KLSAgICAgICAgaWYgKHNpemUgPD0gMCkgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICAgICAgQXhpc1NlcnZpY2VHcm91cCBzZXJ2aWNlR3JvdXAgPSBuZXcgQXhpc1NlcnZpY2VHcm91cCgpOw0KLSAgICAgICAgc2VydmljZUdyb3VwLnNldFNlcnZpY2VHcm91cE5hbWUoZ3JvdXBOYW1lKTsNCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7DQotICAgICAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UgPSAoQXhpc1NlcnZpY2UpIGF4aXNTZXJ2aWNlTGlzdC5nZXQoaSk7DQotICAgICAgICAgICAgc2VydmljZUdyb3VwLmFkZFNlcnZpY2UoYXhpc1NlcnZpY2UpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgYXhpc0NvbmZpZy5hZGRTZXJ2aWNlR3JvdXAoc2VydmljZUdyb3VwKTsNCi0gICAgICAgIGNvbmZpZ3VyZUFkZHJlc3Npbmcoc2VydmljZUdyb3VwKTsNCi0gICAgICAgIHJldHVybiBzZXJ2aWNlR3JvdXA7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIEFycmF5TGlzdCBnZXRMaXN0T2ZDbGFzc2VzKERlcGxveW1lbnRGaWxlRGF0YSBkZXBsb3ltZW50RmlsZURhdGEpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICBBcnJheUxpc3QgY2xhc3NMaXN0Ow0KLSAgICAgICAgRmlsZUlucHV0U3RyZWFtIGZpbiA9IG51bGw7DQotICAgICAgICBaaXBJbnB1dFN0cmVhbSB6aW4gPSBudWxsOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBmaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGRlcGxveW1lbnRGaWxlRGF0YS5nZXRBYnNvbHV0ZVBhdGgoKSk7DQotICAgICAgICAgICAgemluID0gbmV3IFppcElucHV0U3RyZWFtKGZpbik7DQotICAgICAgICAgICAgWmlwRW50cnkgZW50cnk7DQotICAgICAgICAgICAgY2xhc3NMaXN0ID0gbmV3IEFycmF5TGlzdCgpOw0KLSAgICAgICAgICAgIHdoaWxlICgoZW50cnkgPSB6aW4uZ2V0TmV4dEVudHJ5KCkpICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBlbnRyeS5nZXROYW1lKCk7DQotICAgICAgICAgICAgICAgIGlmIChuYW1lLmVuZHNXaXRoKCIuY2xhc3MiKSkgew0KLSAgICAgICAgICAgICAgICAgICAgbmFtZSA9IG5hbWUucmVwbGFjZUFsbCgiLmNsYXNzIiwgIiIpOw0KLSAgICAgICAgICAgICAgICAgICAgbmFtZSA9IG5hbWUucmVwbGFjZUFsbCgiLyIsICIuIik7DQotICAgICAgICAgICAgICAgICAgICBjbGFzc0xpc3QuYWRkKG5hbWUpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHppbi5jbG9zZSgpOw0KLSAgICAgICAgICAgIGZpbi5jbG9zZSgpOw0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcoTWVzc2FnZXMuZ2V0TWVzc2FnZSgiZGVwbG95aW5nZXhjZXB0aW9uIiwgZS5nZXRNZXNzYWdlKCkpLCBlKTsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEV4Y2VwdGlvbihlKTsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgICAgaWYgKHppbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgIHppbi5jbG9zZSgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZiAoZmluICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgZmluLmNsb3NlKCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGNsYXNzTGlzdDsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzdG9yZUZhdWx0eVNlcnZpY2UoRGVwbG95bWVudEZpbGVEYXRhIGRlcGxveW1lbnRGaWxlRGF0YSwgVGhyb3dhYmxlIHQpIHsNCi0gICAgICAgIFN0cmluZ1dyaXRlciBlcnJvcldyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsNCi0gICAgICAgIFByaW50V3JpdGVyIHB0aW50V3JpdGVyID0gbmV3IFByaW50V3JpdGVyKGVycm9yV3JpdGVyKTsNCi0gICAgICAgIHQucHJpbnRTdGFja1RyYWNlKHB0aW50V3JpdGVyKTsNCi0gICAgICAgIFN0cmluZyBlcnJvciA9ICJFcnJvcjpcbiIgKyBlcnJvcldyaXRlci50b1N0cmluZygpOw0KLSAgICAgICAgYXhpc0NvbmZpZy5nZXRGYXVsdHlTZXJ2aWNlcygpLg0KLSAgICAgICAgICAgICAgICBwdXQoZGVwbG95bWVudEZpbGVEYXRhLmdldEZpbGUoKS5nZXRBYnNvbHV0ZVBhdGgoKSwgZXJyb3IpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBBeGlzU2VydmljZSBjcmVhdGVBeGlzU2VydmljZShDbGFzc0xvYWRlciBjbGFzc0xvYWRlciwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTCBzZXJ2aWNlTG9jYXRpb24pIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLA0KLSAgICAgICAgICAgIEluc3RhbnRpYXRpb25FeGNlcHRpb24sDQotICAgICAgICAgICAgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwNCi0gICAgICAgICAgICBBeGlzRmF1bHQgew0KLSAgICAgICAgQ2xhc3MgcG9qb0NsYXNzID0gTG9hZGVyLmxvYWRDbGFzcyhjbGFzc0xvYWRlciwgY2xhc3NOYW1lKTsNCi0gICAgICAgIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBheGlzU2VydmljZSA9IERlc2NyaXB0aW9uRmFjdG9yeS5jcmVhdGVBeGlzU2VydmljZShwb2pvQ2xhc3MsIGNvbmZpZ0N0eCk7DQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgew0KLSAgICAgICAgICAgIGxvZy5pbmZvKCJFeGNlcHRpb24gY3JlYXRpbmcgQXhpcyBTZXJ2aWNlIDogIiArIHQuZ2V0Q2F1c2UoKSwgdCk7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgICAgICBpZiAoYXhpc1NlcnZpY2UgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIEl0ZXJhdG9yIG9wZXJhdGlvbnMgPSBheGlzU2VydmljZS5nZXRPcGVyYXRpb25zKCk7DQotICAgICAgICAgICAgd2hpbGUgKG9wZXJhdGlvbnMuaGFzTmV4dCgpKSB7DQotICAgICAgICAgICAgICAgIEF4aXNPcGVyYXRpb24gYXhpc09wZXJhdGlvbiA9IChBeGlzT3BlcmF0aW9uKSBvcGVyYXRpb25zLm5leHQoKTsNCi0gICAgICAgICAgICAgICAgaWYgKGF4aXNPcGVyYXRpb24uZ2V0TWVzc2FnZVJlY2VpdmVyKCkgPT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICAgICAgYXhpc09wZXJhdGlvbi5zZXRNZXNzYWdlUmVjZWl2ZXIobmV3IEpBWFdTTWVzc2FnZVJlY2VpdmVyKCkpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGF4aXNTZXJ2aWNlLnNldEVsZW1lbnRGb3JtRGVmYXVsdChmYWxzZSk7DQotICAgICAgICAgICAgYXhpc1NlcnZpY2Uuc2V0RmlsZU5hbWUoc2VydmljZUxvY2F0aW9uKTsNCi0gICAgICAgICAgICBheGlzU2VydmljZS5zZXRDbGFzc0xvYWRlcihjbGFzc0xvYWRlcik7DQotICAgICAgICAgICAgYXhpc1NlcnZpY2UuYWRkUGFyYW1ldGVyKG5ldyBQYXJhbWV0ZXIob3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zcGkuQ29uc3RhbnRzLkNBQ0hFX0NMQVNTTE9BREVSLCBjbGFzc0xvYWRlcikpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGF4aXNTZXJ2aWNlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldERpcmVjdG9yeShTdHJpbmcgZGlyZWN0b3J5KSB7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RXh0ZW5zaW9uKFN0cmluZyBleHRlbnNpb24pIHsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB1bkRlcGxveShTdHJpbmcgZmlsZU5hbWUpIHsNCi0gICAgICAgIGZpbGVOYW1lID0gVXRpbHMuZ2V0U2hvcnRGaWxlTmFtZShmaWxlTmFtZSk7DQotICAgICAgICBpZiAoaXNKYXIobmV3IEZpbGUoZmlsZU5hbWUpKSkgew0KLSAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgIEF4aXNTZXJ2aWNlR3JvdXAgc2VydmljZUdyb3VwID0NCi0gICAgICAgICAgICAgICAgICAgICAgICBheGlzQ29uZmlnLnJlbW92ZVNlcnZpY2VHcm91cChmaWxlTmFtZSk7DQotICAgICAgICAgICAgICAgIGlmKGNvbmZpZ0N0eCAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICBjb25maWdDdHgucmVtb3ZlU2VydmljZUdyb3VwQ29udGV4dChzZXJ2aWNlR3JvdXApOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGxvZy5pbmZvKE1lc3NhZ2VzLmdldE1lc3NhZ2UoRGVwbG95bWVudEVycm9yTXNncy5TRVJWSUNFX1JFTU9WRUQsDQotICAgICAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWUpKTsNCi0gICAgICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgYXhpc0ZhdWx0KSB7DQotICAgICAgICAgICAgICAgIC8vTWF5IGJlIGEgZmF1bHR5IHNlcnZpY2UNCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKE1lc3NhZ2VzLmdldE1lc3NhZ2UoRGVwbG95bWVudEVycm9yTXNncy5GQVVMVFlfU0VSVklDRV9SRU1PVkFMLCANCi0gICAgICAgICAgICAgICAgICAgICAgICBheGlzRmF1bHQuZ2V0TWVzc2FnZSgpKSwgYXhpc0ZhdWx0KTsNCi0gICAgICAgICAgICAgICAgYXhpc0NvbmZpZy5yZW1vdmVGYXVsdHlTZXJ2aWNlKGZpbGVOYW1lKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIENoZWNrIGlmIHRoaXMgaW5wdXRzdHJlYW0gaXMgYSBqYXIvemlwDQotICAgICAqDQotICAgICAqIEBwYXJhbSBpcw0KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgaW5wdXRzdHJlYW0gaXMgYSBqYXINCi0gICAgICovDQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0phcihGaWxlIGYpIHsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgSmFySW5wdXRTdHJlYW0gamlzID0gbmV3IEphcklucHV0U3RyZWFtKG5ldyBGaWxlSW5wdXRTdHJlYW0oZikpOw0KLSAgICAgICAgICAgIGlmIChqaXMuZ2V0TmV4dEVudHJ5KCkgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNFbXB0eShTdHJpbmcgc3RyaW5nKSB7DQotICAgICAgICByZXR1cm4gKHN0cmluZyA9PSBudWxsIHx8ICIiLmVxdWFscyhzdHJpbmcpKTsNCi0gICAgfQ0KLSAgICANCi0gICAgLy9TdG9yZSB0aGUgYWRkcmVzcyBVUklzIHRoYXQgd2Ugd2lsbCBuZWVkIHRvIGNyZWF0ZSBlbmRwb2ludCByZWZlcmVuY2VzIGF0IHJ1bnRpbWUuDQotICAgIHByaXZhdGUgdm9pZCBjb25maWd1cmVBZGRyZXNzaW5nKEF4aXNTZXJ2aWNlR3JvdXAgc2VydmljZUdyb3VwKSB7DQotICAgICAgICBFbmRwb2ludENvbnRleHRNYXAgbWFwID0NCi0gICAgICAgICAgICAoRW5kcG9pbnRDb250ZXh0TWFwKSBjb25maWdDdHguZ2V0UHJvcGVydHkob3JnLmFwYWNoZS5heGlzMi5qYXh3cy5Db25zdGFudHMuRU5EUE9JTlRfQ09OVEVYVF9NQVApOw0KLSAgICAgICAgDQotICAgICAgICBpZiAobWFwID09IG51bGwpIHsNCi0gICAgICAgICAgICBtYXAgPSBFbmRwb2ludENvbnRleHRNYXBNYW5hZ2VyLmdldEVuZHBvaW50Q29udGV4dE1hcCgpOw0KLSAgICAgICAgICAgIGNvbmZpZ0N0eC5zZXRQcm9wZXJ0eShvcmcuYXBhY2hlLmF4aXMyLmpheHdzLkNvbnN0YW50cy5FTkRQT0lOVF9DT05URVhUX01BUCwgbWFwKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBzZXJ2aWNlR3JvdXAuZ2V0U2VydmljZXMoKTsNCi0gICAgICAgIA0KLSAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgew0KLSAgICAgICAgICAgIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlID0gKEF4aXNTZXJ2aWNlKSBpdGVyYXRvci5uZXh0KCk7DQotICAgICAgICAgICAgUGFyYW1ldGVyIHBhcmFtID0NCi0gICAgICAgICAgICAgICAgYXhpc1NlcnZpY2UuZ2V0UGFyYW1ldGVyKEVuZHBvaW50RGVzY3JpcHRpb24uQVhJU19TRVJWSUNFX1BBUkFNRVRFUik7DQotICAgICAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlZCA9IChFbmRwb2ludERlc2NyaXB0aW9uKSBwYXJhbS5nZXRWYWx1ZSgpOw0KLSAgICAgICAgICAgIFFOYW1lIHNlcnZpY2VOYW1lID0gZWQuZ2V0U2VydmljZVFOYW1lKCk7DQotICAgICAgICAgICAgUU5hbWUgcG9ydE5hbWUgPSBlZC5nZXRQb3J0UU5hbWUoKTsNCi0gICAgICAgICAgICBFbmRwb2ludEtleSBrZXkgPSBuZXcgRW5kcG9pbnRLZXkoc2VydmljZU5hbWUsIHBvcnROYW1lKTsNCi0NCi0gICAgICAgICAgICBtYXAucHV0KGtleSwgYXhpc1NlcnZpY2UpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KLQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2hhbmRsZXIvQXR0YWNobWVudHNBZGFwdGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9oYW5kbGVyL0F0dGFjaG1lbnRzQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWRiOTU2Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2hhbmRsZXIvQXR0YWNobWVudHNBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5oYW5kbGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUuTWVzc2FnZUNvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5NZXNzYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXI7DQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotDQotLyoqDQotICogVGhlIEpBWC1XUyBleHBvc2VzIGF0dGFjaG1lbnQgcHJvcGVydGllcyB3aG9zZSB2YWx1ZSBpcyBNYXA8U3RyaW5nLCBEYXRhSGFuZGxlcj4uICBUaGUNCi0gKiBTdHJpbmcgaXMgdGhlIGNvbnRlbnQtaWQgYW5kIERhdGFIYW5kbGVyIGlzIHRoZSBkYXRhIGhhbmRsZXIgcmVwcmVzZW50aW5nIHRoZSBhdHRhY2htZW50Lg0KLSAqIA0KLSAqIFRoZSBKQVgtV1MgTWVzc2FnZUNvbnRleHQgc3RvcmVzIGF0dGFjaG1lbnRzIGluIGFuIEF4aW9tIEF0dGFjaG1lbnRzIG9iamVjdCBsb2NhdGVkIG9uIHRoZSBKQVgtV1MgDQotICogTWVzc2FnZS4NCi0gKiANCi0gKiBUaGlzIGNsYXNzLCBBdHRhY2htZW50QWRhcHRlciwgaXMgYW4gYWRhcHRlciBiZXR3ZWVuIHRoZSBNYXA8U3RyaW5nLCBEYXRhSGFuZGxlcj4gaW50ZXJmYWNlIG5lZWRlZA0KLSAqIGJ5IHRoZSBwcm9wZXJ0aWVzIGFuZCB0aGUgYWN0dWFsIGltcGxlbWVudGF0aW9uLiAgQWxsIHVzZWZ1bCBmdW5jdGlvbiBpcyBkZWxlZ2F0ZWQgdGhyb3VnaCB0aGUgTWVzc2FnZUNvbnRleHQsIHNvIA0KLSAqIHRoYXQgd2Ugb25seSBoYXZlIG9uZSBjb3B5IG9mIHRoZSBhdHRhY2htZW50IGluZm9ybWF0aW9uLiAgDQotICogDQotICogVG8gdXNlIHRoaXMgY2xhc3MsIGludm9rZSB0aGUgaW5zdGFsbCBtZXRob2QuICBUaGlzIHdpbGwgY3JlYXRlIGFuIEF0dGFjaG1lbnRBZGFwdGVyIChpZiBuZWNlc3NhcnkpIGFuZCBpbnN0YWxsIGl0DQotICogb24gdGhlIHByb3BlcnR5IEpBWC1XUyBzdGFuZGFyZCBhdHRhY2htZW50IHByb3BlcnR5LiAgKFNlZSBCYXNlTWVzc2FnZUNvbnRleHQuKQ0KLSAqLw0KLXB1YmxpYyBjbGFzcyBBdHRhY2htZW50c0FkYXB0ZXIgaW1wbGVtZW50cyBNYXA8U3RyaW5nLCBEYXRhSGFuZGxlcj4gew0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coQXR0YWNobWVudHNBZGFwdGVyLmNsYXNzKTsNCi0gICAgDQotICAgIE1lc3NhZ2VDb250ZXh0IG1jOyAgICAvLyBNZXNzYWdlQ29udGV4dCB3aGljaCBwcm92aWRlcyB0aGUgYmFja2luZyBpbXBsZW1lbnRhdGlvbiBvZiBBdHRhY2htZW50cw0KLSAgICBTdHJpbmcgcHJvcGVydHlOYW1lOyAgLy8gVGhlIG5hbWUgb2YgdGhlIEpBWC1XUyBwcm9wZXJ0eQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFRoZSBiYWNraW5nIHN0b3JhZ2Ugb2YgdGhlIEF0dGFjaG1lbnRzIGlzIHRoZSBKQVgtV1MgTWVzc2FnZUNvbnRleHQuDQotICAgICAqIEludGVudGlvbmFsbHkgcHJpdmF0ZSwgdXNlIGluc3RhbGwoTWVzc2FnZUNvbnRleHQpDQotICAgICAqLw0KLSAgICBwcml2YXRlIEF0dGFjaG1lbnRzQWRhcHRlcihNZXNzYWdlQ29udGV4dCBtYywgU3RyaW5nIHByb3BlcnR5TmFtZSkgew0KLSAgICAgICAgdGhpcy5tYyA9IG1jOw0KLSAgICAgICAgdGhpcy5wcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eU5hbWU7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBBZGQgdGhlIEF0dGFjaG1lbnRBZGFwdGVyIGFzIHRoZSBwcm9wZXJ0eSBmb3IgdGhlIGluYm91bmQgb3INCi0gICAgICogb3V0Ym91bmQgYXR0YWNobWVudCBwcm9wZXJ0eQ0KLSAgICAgKiBAcGFyYW0gbWMgTWVzc2FnZUNvbnRleHQNCi0gICAgICovDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBpbnN0YWxsKE1lc3NhZ2VDb250ZXh0IG1jKSB7DQotICAgICAgICANCi0gICAgICAgIE1lc3NhZ2UgbSA9IG1jLmdldE1lc3NhZ2UoKTsNCi0gICAgICAgIA0KLSAgICAgICAgaWYgKG0gPT0gbnVsbCkgew0KLSAgICAgICAgICAgIC8vIFByb2JhYmx5IGEgdW5pdCB0ZXN0LCBjYW4ndCBjb250aW51ZS4NCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIGJvb2xlYW4gaXNPdXRib3VuZCA9IG1jLmlzT3V0Ym91bmQoKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gVGhlIHByb3BlcnR5IGlzIGVpdGhlciBhbiBpbmJvdW5kIG9yIG91dGJvdW5kIHByb3BlcnR5DQotICAgICAgICBTdHJpbmcgcHJvcGVydHlOYW1lID0gKGlzT3V0Ym91bmQpID8NCi0gICAgICAgICAgICAgICAgamF2YXgueG1sLndzLmhhbmRsZXIuTWVzc2FnZUNvbnRleHQuT1VUQk9VTkRfTUVTU0FHRV9BVFRBQ0hNRU5UUyA6DQotICAgICAgICAgICAgICAgIGphdmF4LnhtbC53cy5oYW5kbGVyLk1lc3NhZ2VDb250ZXh0LklOQk9VTkRfTUVTU0FHRV9BVFRBQ0hNRU5UUzsNCi0gICAgICAgIA0KLSAgICAgICAgDQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcoIkluc3RhbGxpbmcgQXR0YWNobWVudHNBZGFwdGVyIGZvciAiICsgcHJvcGVydHlOYW1lKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgLy8gU2VlIGlmIHRoZXJlIGlzIGFuIGV4aXN0aW5nIG1hcA0KLSAgICAgICAgT2JqZWN0IG1hcCA9IG1jLmdldFByb3BlcnR5KHByb3BlcnR5TmFtZSk7DQotICAgICAgICANCi0gICAgICAgIC8vIFJldXNlIGV4aXN0aW5nIEF0dGFjaG1lbnRzQWRhcHRlcg0KLSAgICAgICAgaWYgKG1hcCBpbnN0YW5jZW9mIEF0dGFjaG1lbnRzQWRhcHRlcikgew0KLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkFuIEF0dGFjaG1lbnRzQWRhcHRlciBpcyBhbHJlYWR5IGluc3RhbGxlZC4gIFJldXNpbmcgdGhlIGV4aXN0aW5nIG9uZS4iKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfSANCi0gICAgICAgIA0KLSAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IEF0dGFjaG1lbnRzQWRhcHRlciBhbmQgc2V0IGl0IG9uIHRoZSBwcm9wZXJ0eSANCi0gICAgICAgIEF0dGFjaG1lbnRzQWRhcHRlciBhYSA9IG5ldyBBdHRhY2htZW50c0FkYXB0ZXIobWMsIHByb3BlcnR5TmFtZSk7DQotICAgICAgICANCi0gICAgICAgIGlmIChtYXAgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlRoZSBEYXRhSGFuZGxlcnMgaW4gdGhlIGV4aXN0aW5nIG1hcCAoIiArIHByb3BlcnR5TmFtZSArICIpIGFyZSBjb3BpZWQgdG8gdGhlIEF0dGFjaG1lbnRzQWRhcHRlci4iKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgLy8gQ29weSB0aGUgZXhpc3RpbmcgTWFwIGNvbnRlbnRzIHRvIHRoaXMgbmV3IGFkYXB0ZXINCi0gICAgICAgICAgICBhYS5wdXRBbGwoKE1hcDxTdHJpbmcsIERhdGFIYW5kbGVyPikgbWFwKTsNCi0gICAgICAgIH0NCi0gICAgICAgIG1jLnNldFByb3BlcnR5KHByb3BlcnR5TmFtZSwgYWEpOw0KLSAgICB9DQotDQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsNCi0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiY2xlYXIoKSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgTWVzc2FnZSBtID0gbWMuZ2V0TWVzc2FnZSgpOw0KLSAgICAgICAgU2V0PFN0cmluZz4ga2V5cyA9IHRoaXMua2V5U2V0KCk7DQotICAgICAgICBmb3IoU3RyaW5nIGtleToga2V5cykgew0KLSAgICAgICAgICAgIG0ucmVtb3ZlRGF0YUhhbmRsZXIoa2V5KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNLZXkoT2JqZWN0IGtleSkgew0KLSAgICAgICAgTWVzc2FnZSBtID0gbWMuZ2V0TWVzc2FnZSgpOw0KLSAgICAgICAgU2V0PFN0cmluZz4ga2V5cyA9IHRoaXMua2V5U2V0KCk7DQotICAgICAgICByZXR1cm4ga2V5cy5jb250YWlucyhrZXkpOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc1ZhbHVlKE9iamVjdCB2YWx1ZSkgew0KLSAgICAgICAgTWVzc2FnZSBtID0gbWMuZ2V0TWVzc2FnZSgpOw0KLSAgICAgICAgDQotICAgICAgICBTZXQ8U3RyaW5nPiBrZXlzID0gdGhpcy5rZXlTZXQoKTsNCi0gICAgICAgIGZvcihTdHJpbmcga2V5OiBrZXlzKSB7DQotICAgICAgICAgICAgRGF0YUhhbmRsZXIgZGggPSBtLmdldERhdGFIYW5kbGVyKGtleSk7DQotICAgICAgICAgICAgaWYgKGRoLmVxdWFscyh2YWx1ZSkpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgU2V0PEVudHJ5PFN0cmluZywgRGF0YUhhbmRsZXI+PiBlbnRyeVNldCgpIHsNCi0gICAgICAgIE1hcCB0ZW1wTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBEYXRhSGFuZGxlcj4oKTsNCi0gICAgICAgIHRlbXBNYXAucHV0QWxsKHRoaXMpOw0KLSAgICAgICAgcmV0dXJuIHRlbXBNYXAuZW50cnlTZXQoKTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIERhdGFIYW5kbGVyIGdldChPYmplY3Qga2V5KSB7DQotICAgICAgICBNZXNzYWdlIG0gPSBtYy5nZXRNZXNzYWdlKCk7DQotICAgICAgICBEYXRhSGFuZGxlciBkaCA9ICBtLmdldERhdGFIYW5kbGVyKChTdHJpbmcpIGtleSk7DQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcoImdldCgiICsga2V5ICsgIikgcmV0dXJucyBkaD0iICsgZGgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGRoOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgew0KLSAgICAgICAgcmV0dXJuIHRoaXMua2V5U2V0KCkuaXNFbXB0eSgpOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgU2V0PFN0cmluZz4ga2V5U2V0KCkgew0KLSAgICAgICAgU2V0PFN0cmluZz4ga2V5cyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsNCi0gICAgICAgIE1lc3NhZ2UgbSA9IG1jLmdldE1lc3NhZ2UoKTsNCi0gICAgICAgIC8vIE5vdGUgdGhhdCB0aGUgU09BUFBhcnQgaXMgaWdub3JlZA0KLSAgICAgICAgaW50IGkgPSAwOw0KLSAgICAgICAgU3RyaW5nIGtleSA9IG0uZ2V0QXR0YWNobWVudElEKGkpOw0KLSAgICAgICAgd2hpbGUgKGtleSAhPSBudWxsKSB7DQotICAgICAgICAgICAga2V5cy5hZGQoa2V5KTsNCi0gICAgICAgICAgICBpKys7DQotICAgICAgICAgICAga2V5ID0gbS5nZXRBdHRhY2htZW50SUQoaSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4ga2V5czsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIERhdGFIYW5kbGVyIHB1dChTdHJpbmcga2V5LCBEYXRhSGFuZGxlciBkaCkgew0KLSAgICAgICAgTWVzc2FnZSBtID0gbWMuZ2V0TWVzc2FnZSgpOw0KLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKCJwdXQoIiArIGtleSArICIgLCAiICsgZGggKyAiKSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgRGF0YUhhbmRsZXIgb2xkID0gZ2V0KGtleSk7DQotICAgICAgICBtLmFkZERhdGFIYW5kbGVyKGRoLCBrZXkpOw0KLSAgICAgICAgbS5zZXREb2luZ1NXQSh0cnVlKTsgIC8vIENhbid0IHJlYWxseSB0ZWxsIGlmIHRoZSBhdHRhY2htZW50IGlzIE1UT00gb3IgU1dBLCBldGMuICBNYXJrIGFzIFNXQSB0byBtYWtlIHN1cmUgaXQgaXMgd3JpdHRlbiBvdXQNCi0gICAgICAgIHJldHVybiBvbGQ7DQotICAgICAgICANCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIHZvaWQgcHV0QWxsKE1hcDw/IGV4dGVuZHMgU3RyaW5nLCA/IGV4dGVuZHMgRGF0YUhhbmRsZXI+IHQpIHsNCi0gICAgICAgIE1lc3NhZ2UgbSA9IG1jLmdldE1lc3NhZ2UoKTsNCi0gICAgICAgIGZvcihTdHJpbmcga2V5OiB0LmtleVNldCgpKSB7DQotICAgICAgICAgICAgRGF0YUhhbmRsZXIgZGggPSB0LmdldChrZXkpOw0KLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoImFkZERhdGFIYW5kbGVyIHZpYSBwdXRBbGwgKCIgKyBrZXkgKyAiICwgIiArIGRoICsgIikiKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgbS5hZGREYXRhSGFuZGxlcihkaCwga2V5KTsNCi0gICAgICAgICAgICBtLnNldERvaW5nU1dBKHRydWUpOyAgLy8gQ2FuJ3QgcmVhbGx5IHRlbGwgaWYgdGhlIGF0dGFjaG1lbnQgaXMgTVRPTSBvciBTV0EsIGV0Yy4gIE1hcmsgYXMgU1dBIHRvIG1ha2Ugc3VyZSBpdCBpcyB3cml0dGVuIG91dA0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgRGF0YUhhbmRsZXIgcmVtb3ZlKE9iamVjdCBrZXkpIHsNCi0gICAgICAgIE1lc3NhZ2UgbSA9IG1jLmdldE1lc3NhZ2UoKTsNCi0gICAgICAgIC8vIE5vdGUgdGhhdCB0aGUgU09BUFBhcnQgaXMgaWdub3JlZA0KLSAgICAgICAgcmV0dXJuIG0ucmVtb3ZlRGF0YUhhbmRsZXIoKFN0cmluZykga2V5KTsgDQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsNCi0gICAgICAgIE1lc3NhZ2UgbSA9IG1jLmdldE1lc3NhZ2UoKTsNCi0gICAgICAgIFNldDxTdHJpbmc+IGtleXMgPSB0aGlzLmtleVNldCgpOw0KLSAgICAgICAgcmV0dXJuIGtleXMuc2l6ZSgpOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgQ29sbGVjdGlvbjxEYXRhSGFuZGxlcj4gdmFsdWVzKCkgew0KLSAgICAgICAgTWFwIHRlbXBNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIERhdGFIYW5kbGVyPigpOw0KLSAgICAgICAgdGVtcE1hcC5wdXRBbGwodGhpcyk7DQotICAgICAgICByZXR1cm4gdGVtcE1hcC52YWx1ZXMoKTsNCi0gICAgfQ0KLSAgICANCi0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvaGFuZGxlci9CYXNlTWVzc2FnZUNvbnRleHQuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2hhbmRsZXIvQmFzZU1lc3NhZ2VDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5MmY4NTQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvaGFuZGxlci9CYXNlTWVzc2FnZUNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaGFuZGxlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiBCYXNlTWVzc2FnZUNvbnRleHQgaXMgdGhlIGJhc2UgY2xhc3MgZm9yIHRoZSB0d28gaGFuZGxlciBtZXNzYWdlIGNvbnRleHRzOgotICogU29hcE1lc3NhZ2VDb250ZXh0IGFuZCBMb2dpY2FsTWVzc2FnZUNvbnRleHQuICBJdCBkZWxlZ2F0ZXMgZXZlcnl0aGluZyB1cCB0bwotICogdGhlIE1FUENvbnRleHQsIHdoaWNoIGl0c2VsZiBkZWxlZ2F0ZXMgdG8gdGhlIHJlcXVlc3RNQyBvciByZXNwb25zZU1DLCBhcwotICogYXBwcm9wcmlhdGUuCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEJhc2VNZXNzYWdlQ29udGV4dCBpbXBsZW1lbnRzIGphdmF4LnhtbC53cy5oYW5kbGVyLk1lc3NhZ2VDb250ZXh0IHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coQmFzZU1lc3NhZ2VDb250ZXh0LmNsYXNzKTsKLQotICAgIHByb3RlY3RlZCBNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ3R4OwotICAgIAotICAgIC8qKgotICAgICAqIEBwYXJhbSBtZXNzYWdlQ3R4Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIEJhc2VNZXNzYWdlQ29udGV4dChNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ3R4KSB7Ci0gICAgICAgIHRoaXMubWVzc2FnZUN0eCA9IG1lc3NhZ2VDdHg7Ci0gICAgICAgIAotICAgICAgICAvLyBJbnN0YWxsIGFuIGFuIEF0dGFjaG1lbnRzQWRhcHRlciBiZXR3ZWVuIHRoZSAKLSAgICAgICAgLy8gamF4d3MgYXR0YWNobWVudCBzdGFuZGFyZCBwcm9wZXJ0aWVzIGFuZCB0aGUKLSAgICAgICAgLy8gTWVzc2FnZUNvbnRleHQgQXR0YWNobWVudHMgaW1wbGVtZW50YXRpb24uCi0gICAgICAgIEF0dGFjaG1lbnRzQWRhcHRlci5pbnN0YWxsKG1lc3NhZ2VDdHgpOwotICAgICAgICBUcmFuc3BvcnRIZWFkZXJzQWRhcHRlci5pbnN0YWxsKG1lc3NhZ2VDdHgpOwotICAgICAgICBTT0FQSGVhZGVyc0FkYXB0ZXIuaW5zdGFsbChtZXNzYWdlQ3R4KTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBqYXZhLnV0aWwuTWFwI2NsZWFyKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKLSAgICAgICAgbWVzc2FnZUN0eC5nZXRNRVBDb250ZXh0KCkuY2xlYXIoKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBqYXZhLnV0aWwuTWFwI2NvbnRhaW5zS2V5KGphdmEubGFuZy5PYmplY3QpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNLZXkoT2JqZWN0IGtleSkgewotICAgICAgICByZXR1cm4gbWVzc2FnZUN0eC5nZXRNRVBDb250ZXh0KCkuY29udGFpbnNLZXkoa2V5KTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBqYXZhLnV0aWwuTWFwI2NvbnRhaW5zVmFsdWUoamF2YS5sYW5nLk9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc1ZhbHVlKE9iamVjdCB2YWx1ZSkgewotICAgICAgICByZXR1cm4gbWVzc2FnZUN0eC5nZXRNRVBDb250ZXh0KCkuY29udGFpbnNWYWx1ZSh2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgamF2YS51dGlsLk1hcCNlbnRyeVNldCgpCi0gICAgICovCi0gICAgcHVibGljIFNldDxqYXZhLnV0aWwuTWFwLkVudHJ5PFN0cmluZywgT2JqZWN0Pj4gZW50cnlTZXQoKSB7Ci0gICAgICAgIHJldHVybiBtZXNzYWdlQ3R4LmdldE1FUENvbnRleHQoKS5lbnRyeVNldCgpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIGphdmEudXRpbC5NYXAjZ2V0KGphdmEubGFuZy5PYmplY3QpCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXQoT2JqZWN0IGtleSkgewotICAgICAgICAvLyBUaGVyZSBhcmUgc29tZSBwcm9wZXJ0aWVzIHRoYXQsIGluIHNvbWUgY2FzZXMsIHNob3VsZCBub3Qgc3BhbiB0aGUgbWVzc2FnZSBleGNoYW5nZTsKLSAgICAgICAgLy8gdGhhdCBpcywgdGhleSBzaG91bGQgY29tZSBmcm9tIG9ubHkgdGhlIGN1cnJlbnQgbWVzc2FnZSBjb250ZXh0LiAgRm9yIG90aGVycyBwcm9wZXJ0aWVzLAotICAgICAgICAvLyB0aGV5IHNob3VsZCBzcGFuIHRoZSBtZXNzYWdlIGV4Y2hhbmdlLCBtZWFuaW5nIGEgcHJvcGVydHkgY291bGQgYmUgc2V0IG9uIHRoZSByZXF1ZXN0Ci0gICAgICAgIC8vIGFuZCBpdCB3aWxsIGFsc28gYmUgYXZhaWxhYmxlIG9uIHRoZSByZXNwb25zZS4gIFtKQVhXUyAyLjAsIFNlYyA5LjQuMS4xLCBwcC4gMTEwLTExM10KLSAgICAgICAgT2JqZWN0IHJldHVyblZhbHVlID0gbnVsbDsKLSAgICAgICAgaWYgKHNob3VsZFByb3BlcnR5U3Bhbk1FUChrZXkpKSB7Ci0gICAgICAgICAgICByZXR1cm5WYWx1ZSA9IG1lc3NhZ2VDdHguZ2V0TUVQQ29udGV4dCgpLmdldChrZXkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuVmFsdWUgPSBtZXNzYWdlQ3R4LmdldFByb3BlcnR5KChTdHJpbmcpIGtleSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBGb3IgdGhlIEhUVFBfUkVRVUVTVF9IRUFERVJTIGFuZCBIVFRQX1JFU1BPTlNFX0hFQURFUlMsIHRoZSBDVFMgdGVzdHMgd2FudCBhIG51bGwgcmV0dXJuZWQgCi0gICAgICAgIC8vIGlmIHRoZXJlIGFyZSBubyBoZWFkZXJzLiAgU2luY2Ugd2UgYWx3YXlzIHB1dCBhbiBpbnN0YW5jZSBvZiBUcmFuc3BvcnRIZWFkZXJzQWRhcHRlciwKLSAgICAgICAgLy8gd2hpY2ggY29udGFpbnMgdGhlIGhlYWRlcnMsIG9uIHRoZSBtZXNzYWdlIGNvbnRleHQsIHJldHVybiBhIG51bGwgaWYgaXQgaXMgZW1wdHkuCi0gICAgICAgIGlmIChyZXR1cm5WYWx1ZSAhPSBudWxsICYmIChyZXR1cm5WYWx1ZSBpbnN0YW5jZW9mIFRyYW5zcG9ydEhlYWRlcnNBZGFwdGVyKSkgewotICAgICAgICAgICAgVHJhbnNwb3J0SGVhZGVyc0FkYXB0ZXIgYWRhcHRlciA9IChUcmFuc3BvcnRIZWFkZXJzQWRhcHRlcikgcmV0dXJuVmFsdWU7Ci0gICAgICAgICAgICBpZiAoYWRhcHRlci5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIHNob3VsZFByb3BlcnR5U3Bhbk1FUChPYmplY3Qga2V5KSB7Ci0gICAgICAgIGJvb2xlYW4gc2hvdWxkU3BhbiA9IHRydWU7Ci0gICAgICAgIFN0cmluZyBrZXlTdHJpbmcgPSAoU3RyaW5nKSBrZXk7Ci0KLSAgICAgICAgLy8gVGhlIENUUyB0ZXN0cyByZXF1aXJlIHRoYXQgSFRUUF9SRVFVRVNUX0hFQURFUlMgc3BhbiB0aGUgcmVxdWVzdCBhbmQgcmVzcG9uc2UgY29udGV4dHMKLSAgICAgICAgLy8gb24gdGhlIHNlcnZpY2UtcHJvdmlkZXIsIGJ1dCBkbyBOT1Qgc3BhbiB0aGUgcmVxdWVzdCBhbmQgcmVzcG9uc2UgY29udGV4dCBvbiB0aGUgCi0gICAgICAgIC8vIHNlcnZpY2UtcmVxdWVzdGVyLiAgU28sIGZvciBhbiBJTkJPVU5EIGZsb3csIGRvIG5vdCBhbGxvdyBIVFRQX1JFUVVFU1RfSEVBREVSUyB0bwotICAgICAgICAvLyBzcGFuIHRoZSByZXF1ZXN0IGFuZCByZXNwb25zZSBjb250ZXh0cy4gIFRoZSByZXN1bHQgaXMgdGhhdCB0aGUgc2VydmljZS1yZXF1ZXN0ZXIKLSAgICAgICAgLy8gaW5ib3VuZCBoYW5kbGVyIHdpbGwgbm90IHNlZSB0aGUgcmVxdWVzdCBoZWFkZXJzIHdoaWxlIHByb2Nlc3NpbmcgYSByZXNwb25zZS4KLSAgICAgICAgQm9vbGVhbiBvdXRib3VuZCA9IChCb29sZWFuKSBtZXNzYWdlQ3R4LmdldE1FUENvbnRleHQoKS5nZXQoTUVTU0FHRV9PVVRCT1VORF9QUk9QRVJUWSk7Ci0gICAgICAgIGlmIChvdXRib3VuZCAhPSBudWxsICYmICFvdXRib3VuZCkKLSAgICAgICAgICAgIGlmIChqYXZheC54bWwud3MuaGFuZGxlci5NZXNzYWdlQ29udGV4dC5IVFRQX1JFUVVFU1RfSEVBREVSUy5lcXVhbHMoa2V5U3RyaW5nKSkgewotICAgICAgICAgICAgc2hvdWxkU3BhbiA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzaG91bGRTcGFuOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIGphdmEudXRpbC5NYXAjaXNFbXB0eSgpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLSAgICAgICAgcmV0dXJuIG1lc3NhZ2VDdHguZ2V0TUVQQ29udGV4dCgpLmlzRW1wdHkoKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBqYXZhLnV0aWwuTWFwI2tleVNldCgpCi0gICAgICovCi0gICAgcHVibGljIFNldDxTdHJpbmc+IGtleVNldCgpIHsKLSAgICAgICAgcmV0dXJuIG1lc3NhZ2VDdHguZ2V0TUVQQ29udGV4dCgpLmtleVNldCgpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIGphdmEudXRpbC5NYXAjcHV0KGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBwdXQoU3RyaW5nIGtleSwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBtZXNzYWdlQ3R4LmdldE1FUENvbnRleHQoKS5wdXQoa2V5LCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgamF2YS51dGlsLk1hcCNwdXRBbGwoamF2YS51dGlsLk1hcCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwdXRBbGwoTWFwPD8gZXh0ZW5kcyBTdHJpbmcsID8gZXh0ZW5kcyBPYmplY3Q+IHQpIHsKLSAgICAgICAgbWVzc2FnZUN0eC5nZXRNRVBDb250ZXh0KCkucHV0QWxsKHQpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIGphdmEudXRpbC5NYXAjcmVtb3ZlKGphdmEubGFuZy5PYmplY3QpCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCByZW1vdmUoT2JqZWN0IGtleSkgewotICAgICAgICByZXR1cm4gbWVzc2FnZUN0eC5nZXRNRVBDb250ZXh0KCkucmVtb3ZlKGtleSk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgamF2YS51dGlsLk1hcCNzaXplKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IHNpemUoKSB7Ci0gICAgICAgIHJldHVybiBtZXNzYWdlQ3R4LmdldE1FUENvbnRleHQoKS5zaXplKCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgamF2YS51dGlsLk1hcCN2YWx1ZXMoKQotICAgICAqLwotICAgIHB1YmxpYyBDb2xsZWN0aW9uPE9iamVjdD4gdmFsdWVzKCkgewotICAgICAgICByZXR1cm4gbWVzc2FnZUN0eC5nZXRNRVBDb250ZXh0KCkudmFsdWVzKCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgamF2YXgueG1sLndzLmhhbmRsZXIuTWVzc2FnZUNvbnRleHQjZ2V0U2NvcGUoamF2YS5sYW5nLlN0cmluZykKLSAgICAgKi8KLSAgICBwdWJsaWMgU2NvcGUgZ2V0U2NvcGUoU3RyaW5nIHMpIHsKLSAgICAgICAgcmV0dXJuIG1lc3NhZ2VDdHguZ2V0TUVQQ29udGV4dCgpLmdldFNjb3BlKHMpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIGphdmF4LnhtbC53cy5oYW5kbGVyLk1lc3NhZ2VDb250ZXh0I3NldFNjb3BlKGphdmEubGFuZy5TdHJpbmcsIGphdmF4LnhtbC53cy5oYW5kbGVyLk1lc3NhZ2VDb250ZXh0LlNjb3BlKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNjb3BlKFN0cmluZyBzLCBTY29wZSBzY29wZSkgewotICAgICAgICBtZXNzYWdlQ3R4LmdldE1FUENvbnRleHQoKS5zZXRTY29wZShzLCBzY29wZSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9oYW5kbGVyL0hhbmRsZXJDaGFpblByb2Nlc3Nvci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvaGFuZGxlci9IYW5kbGVyQ2hhaW5Qcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY5NWQyYS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9oYW5kbGVyL0hhbmRsZXJDaGFpblByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjI3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5oYW5kbGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5FeGNlcHRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29udGV4dC5mYWN0b3J5Lk1lc3NhZ2VDb250ZXh0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmhhbmRsZXIuZmFjdG9yeS5IYW5kbGVyUG9zdEludm9rZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaGFuZGxlci5mYWN0b3J5LkhhbmRsZXJQcmVJbnZva2VyRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmkxOG4uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tYXJzaGFsbGVyLmltcGwuYWx0Lk1ldGhvZE1hcnNoYWxsZXJVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuTWVzc2FnZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuUHJvdG9jb2w7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLlhNTEZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5mYWN0b3J5Lk1lc3NhZ2VGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS51dGlsLlhNTEZhdWx0VXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5yZWdpc3RyeS5GYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51dGlsaXR5LlNBQUpGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEJvZHk7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUENvbnN0YW50czsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRmF1bHQ7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUE1lc3NhZ2U7Ci1pbXBvcnQgamF2YXgueG1sLndzLlByb3RvY29sRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLkhhbmRsZXI7Ci1pbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuTG9naWNhbEhhbmRsZXI7Ci1pbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuc29hcC5TT0FQSGFuZGxlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGNsYXNzIEhhbmRsZXJDaGFpblByb2Nlc3NvciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coSGFuZGxlckNoYWluUHJvY2Vzc29yLmNsYXNzKTsKLSAgICBwcml2YXRlIEhhbmRsZXJQcmVJbnZva2VyIGhhbmRsZXJQcmVJbnZva2VyID0gbnVsbDsKLSAgICBwcml2YXRlIEhhbmRsZXJQb3N0SW52b2tlciBoYW5kbGVyUG9zdEludm9rZXIgPSBudWxsOwotICAgIAotICAgIHB1YmxpYyBlbnVtIERpcmVjdGlvbiB7Ci0gICAgICAgIElOLCBPVVQKLSAgICB9OwotCi0gICAgLy8gdGhlIHR5cGUgb2YgbWVzc2FnZSwgbm90IGluZGljYXRpdmUgb2Ygb25lLXdheSB2cy4gcmVxdWVzdC1yZXNwb25zZQotICAgIHB1YmxpYyBlbnVtIE1FUCB7Ci0gICAgICAgIFJFUVVFU1QsIFJFU1BPTlNFCi0gICAgfTsKLQotICAgIHByaXZhdGUgamF2YXgueG1sLndzLmhhbmRsZXIuTWVzc2FnZUNvbnRleHQgY3VycmVudE1DOyAgLy8ganVzdCBhIHBvaW50ZXIKLSAgICBwcml2YXRlIExvZ2ljYWxNZXNzYWdlQ29udGV4dCBsb2dpY2FsTUMgPSBudWxsOwotICAgIHByaXZhdGUgU29hcE1lc3NhZ2VDb250ZXh0IHNvYXBNQyA9IG51bGw7Ci0KLSAgICBwcml2YXRlIE1FUENvbnRleHQgbWVwQ3R4OwotCi0gICAgcHJpdmF0ZSBMaXN0PEhhbmRsZXI+IGhhbmRsZXJzID0gbnVsbDsKLQotICAgIC8vIHRyYWNrIHN0YXJ0L2VuZCBvZiBsb2dpY2FsIGFuZCBwcm90b2NvbCBoYW5kbGVycyBpbiB0aGUgbGlzdAotICAgIC8vIFRoZSB0d28gc2NlbmFyaW9zIGFyZTogIDEpIHJ1biBsb2dpY2FsIGhhbmRsZXJzIG9ubHksIDIpIHJ1biBhbGwgaGFuZGxlcnMKLSAgICAvLyBsb2dpY2FsIHN0YXJ0IGlzIGFsd2F5cyAwCi0gICAgLy8gcHJvdG9jb2wgc3RhcnQgaXMgYWx3YXlzIGxvZ2ljYWxMZW5ndGggKyAxCi0gICAgLy8gbGlzdCBlbmQgaXMgYWx3YXlzIGhhbmRsZXJzLnNpemUoKS0xCi0gICAgcHJpdmF0ZSBpbnQgbG9naWNhbExlbmd0aCA9IDA7Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgU1VDQ0VTU0ZVTCA9IDA7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IEZBSUxFRCA9IDE7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IFBST1RPQ09MX0VYQ0VQVElPTiA9IDI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IE9USEVSX0VYQ0VQVElPTiA9IDM7Ci0gICAgLy8gc2F2ZSBpdCBpZiBIYW5kbGVyLmhhbmRsZU1lc3NhZ2UgdGhyb3dzIG9uZSBpbgotICAgIC8vIEhhbmRsZXJDaGFpblByb2Nlc3Nvci5oYW5kbGVNZXNzYWdlCi0gICAgcHJpdmF0ZSBSdW50aW1lRXhjZXB0aW9uIHNhdmVkRXhjZXB0aW9uOwotICAgIHByaXZhdGUgUHJvdG9jb2wgcHJvdG87IC8vIG5lZWQgdG8gc2F2ZSBpdCBpbmNhc2Ugd2UgaGF2ZSB0byBtYWtlIGEgZmF1bHQgbWVzc2FnZQotCi0gICAgLyoKLSAgICAgICogSGFuZGxlckNoYWluUHJvY2VzcyBleHBlY3RzIG51bGwsIGVtcHR5IGxpc3QsIG9yIGFuIGFscmVhZHktc29ydGVkCi0gICAgICAqIGxpc3QuICBJZiB0aGUgY2hhaW4gcGFzc2VkIGludG8gaGVyZSBjYW1lIGZyb20gb3VyIEhhbmRsZXJDaGFpblJlc29sdmVyLAotICAgICAgKiBpdCBpcyBzb3J0ZWQgYWxyZWFkeS4gIElmIGEgY2xpZW50IGFwcCBjcmVhdGVkIG9yIG1hbmlwdWxhdGVkIHRoZSBsaXN0LAotICAgICAgKiBpdCBtYXkgbm90IGJlIHNvcnRlZC4gIFRoZSBwcm9jZXNzQ2hhaW4gYW5kIHByb2Nlc3NGYXVsdCBtZXRob2RzIGNoZWNrCi0gICAgICAqIGZvciB0aGlzIGJ5IGNhbGxpbmcgdmVyaWZ5Q2hhaW4uCi0gICAgICAqLwotCXB1YmxpYyBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IoTGlzdDxIYW5kbGVyPiBjaGFpbiwgUHJvdG9jb2wgcHJvdG8pIHsKLSAgICAgICAgaWYgKGNoYWluID09IG51bGwpIHsKLSAgICAgICAgICAgIGhhbmRsZXJzID0gbmV3IEFycmF5TGlzdDxIYW5kbGVyPigpOwotCQl9Ci0JCWVsc2UKLSAgICAgICAgICAgIGhhbmRsZXJzID0gY2hhaW47Ci0gICAgICAgIHRoaXMucHJvdG8gPSBwcm90bzsKLSAgICB9Ci0KLSAgICAvKgotICAgICAgKiBzb3J0Q2hhaW4gd2lsbCBwcm9wZXJseSBzb3J0IHRoZSBjaGFpbiwgbG9naWNhbCB0aGVuIHByb3RvY29sLCBzaW5jZSBpdCBtYXkgYmUKLSAgICAgICogYSBjaGFpbiBidWlsdCBvciBtb2RpZmllZCBieSBhIGNsaWVudCBhcHBsaWNhdGlvbi4gIEFsc28ga2VlcCB0cmFjayBvZgotICAgICAgKiBzdGFydC9lbmQgZm9yIGVhY2ggdHlwZSBvZiBoYW5kbGVyLgotICAgICAgKi8KLQlwcml2YXRlIHZvaWQgc29ydENoYWluKCkgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICAKLSAgICAgICAgQXJyYXlMaXN0PEhhbmRsZXI+IGxvZ2ljYWxIYW5kbGVycyA9IG5ldyBBcnJheUxpc3Q8SGFuZGxlcj4oKTsKLSAgICAgICAgQXJyYXlMaXN0PEhhbmRsZXI+IHByb3RvY29sSGFuZGxlcnMgPSBuZXcgQXJyYXlMaXN0PEhhbmRsZXI+KCk7Ci0gICAgICAgIAotICAgICAgICBJdGVyYXRvciBoYW5kbGVySXRlcmF0b3IgPSBoYW5kbGVycy5pdGVyYXRvcigpOwotICAgICAgICAKLSAgICAgICAgd2hpbGUgKGhhbmRsZXJJdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIC8vIHRoaXMgaXMgYSBzYWZlIGNhc3Qgc2luY2UgdGhlIGhhbmRsZXJSZXNvbHZlciBhbmQgYmluZGluZy5zZXRIYW5kbGVyQ2hhaW4KLSAgICAgICAgICAgIC8vIGFuZCBJbnZvY2F0aW9uQ29udGV4dC5zZXRIYW5kbGVyQ2hhaW4gdmVyaWZpZXMgaXQgYmVmb3JlIHdlIGdldCBoZXJlCi0gICAgICAgICAgICBIYW5kbGVyIGhhbmRsZXIgPSAoSGFuZGxlciloYW5kbGVySXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgLy8gSkFYV1MgOS4yLjEuMiBzb3J0IHRoZW0gYnkgTG9naWNhbCwgdGhlbiBTT0FQCi0gICAgICAgICAgICBpZiAoTG9naWNhbEhhbmRsZXIuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShoYW5kbGVyLmdldENsYXNzKCkpKQotICAgICAgICAgICAgICAgIGxvZ2ljYWxIYW5kbGVycy5hZGQoKExvZ2ljYWxIYW5kbGVyKSBoYW5kbGVyKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKFNPQVBIYW5kbGVyLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oaGFuZGxlci5nZXRDbGFzcygpKSkKLSAgICAgICAgICAgICAgICAvLyBpbnN0YW5jZW9mIFByb3RvY29sSGFuZGxlcgotICAgICAgICAgICAgICAgIHByb3RvY29sSGFuZGxlcnMuYWRkKChTT0FQSGFuZGxlcikgaGFuZGxlcik7Ci0gICAgICAgICAgICBlbHNlIGlmIChIYW5kbGVyLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oaGFuZGxlci5nZXRDbGFzcygpKSkgewotICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMKLSAgICAgICAgICAgICAgICAgICAgLmdldE1lc3NhZ2UoImhhbmRsZXJDaGFpbkVycjEiLCBoYW5kbGVyLmdldENsYXNzKCkuZ2V0TmFtZSgpKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMKLSAgICAgICAgICAgICAgICAgICAgLmdldE1lc3NhZ2UoImhhbmRsZXJDaGFpbkVycjIiLCBoYW5kbGVyLmdldENsYXNzKCkuZ2V0TmFtZSgpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGxvZ2ljYWxMZW5ndGggPSBsb2dpY2FsSGFuZGxlcnMuc2l6ZSgpOwotICAgICAgICAKLSAgICAgICAgLy8gSkFYV1MgOS4yLjEuMiBzb3J0IHRoZW0gYnkgTG9naWNhbCwgdGhlbiBTT0FQCi0gICAgICAgIGhhbmRsZXJzLmNsZWFyKCk7Ci0gICAgICAgIGhhbmRsZXJzLmFkZEFsbChsb2dpY2FsSGFuZGxlcnMpOwotICAgICAgICBoYW5kbGVycy5hZGRBbGwocHJvdG9jb2xIYW5kbGVycyk7Ci0JfQotCQotCi0JCi0JLyoqCi0JICogQHBhcmFtIG1jCi0JICogQnkgdGhlIHRpbWUgcHJvY2Vzc0NoYWluIG1ldGhvZCBpcyBjYWxsZWQsIHdlIGFscmVhZHkgaGF2ZSB0aGUgc29ydGVkIGNoYWluLAotCSAqIGFuZCBub3cgd2UgaGF2ZSB0aGUgZGlyZWN0aW9uLCBNRVAsIE1lc3NhZ2VDb250ZXh0LCBhbmQgaWYgYSByZXNwb25zZSBpcyBleHBlY3RlZC4gIFdlIHNob3VsZAotCSAqIGJlIGFibGUgdG8gaGFuZGxlIGV2ZXJ5dGhpbmcgZnJvbSBoZXJlLCBubyBwdW4gaW50ZW5kZWQuCi0JICogCi0JICogVHdvIHRoaW5ncyBhIHVzZXIgb2YgcHJvY2Vzc0NoYWluIHNob3VsZCBjaGVjayB3aGVuIHRoZSBtZXRob2QgY29tcGxldGVzOgotCSAqIDEuICBIYXMgdGhlIE1lc3NhZ2VDb250ZXh0Lk1FU1NBR0VfT1VUQk9VTkRfUFJPUEVSVFkgY2hhbmdlZCwgaW5kaWNhdGluZyByZXZlcnNhbCBvZiBtZXNzYWdlIGRpcmVjdGlvbgotCSAqIDIuICBIYXMgdGhlIG1lc3NhZ2UgYmVlbiBjb252ZXJ0ZWQgdG8gYSBmYXVsdCBtZXNzYWdlPyAoaW5kaWNhdGVkIGJ5IGEgZmxhZyBpbiB0aGUgbWVzc2FnZSkKLQkgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzQ2hhaW4oTUVQQ29udGV4dCBtZXBDdHgsIERpcmVjdGlvbiBkaXJlY3Rpb24sIE1FUCBtZXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZXhwZWN0UmVzcG9uc2UpIHsKLQotICAgICAgICBpZiAoaGFuZGxlcnMuc2l6ZSgpID09IDApCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgCi0gICAgICAgIHRoaXMubWVwQ3R4ID0gbWVwQ3R4OwotICAgICAgICBzb3J0Q2hhaW4oKTsKLSAgICAgICAgaW5pdENvbnRleHQoZGlyZWN0aW9uKTsKLSAgICAgICAgYm9vbGVhbiByZXN1bHQgPSB0cnVlOwotCi0gICAgICAgIGlmIChkaXJlY3Rpb24gPT0gRGlyZWN0aW9uLk9VVCkgeyAvLyA5LjMuMiBvdXRib3VuZAotICAgICAgICAgICAgY3VycmVudE1DLnB1dChqYXZheC54bWwud3MuaGFuZGxlci5NZXNzYWdlQ29udGV4dC5NRVNTQUdFX09VVEJPVU5EX1BST1BFUlRZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkaXJlY3Rpb24gPT0gRGlyZWN0aW9uLk9VVCkpOwotICAgICAgICAgICAgcmVzdWx0ID0gY2FsbEdlbmVyaWNIYW5kbGVycyhtZXAsIGV4cGVjdFJlc3BvbnNlLCAwLCBoYW5kbGVycy5zaXplKCkgLSAxLCBkaXJlY3Rpb24pOwotICAgICAgICB9IGVsc2UgeyAvLyBJTiBjYXNlIC0gOS4zLjIgaW5ib3VuZAotICAgICAgICAgICAgY3VycmVudE1DLnB1dChqYXZheC54bWwud3MuaGFuZGxlci5NZXNzYWdlQ29udGV4dC5NRVNTQUdFX09VVEJPVU5EX1BST1BFUlRZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkaXJlY3Rpb24gPT0gRGlyZWN0aW9uLk9VVCkpOwotICAgICAgICAgICAgcmVzdWx0ID0gY2FsbEdlbmVyaWNIYW5kbGVycyhtZXAsIGV4cGVjdFJlc3BvbnNlLCBoYW5kbGVycy5zaXplKCkgLSAxLCAwLCBkaXJlY3Rpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gbWVzc2FnZSBjb250ZXh0IG1heSBoYXZlIGJlZW4gY2hhbmdlZCB0byBiZSByZXNwb25zZSwgYW5kIG1lc3NhZ2UKLSAgICAgICAgLy8gY29udmVydGVkCi0gICAgICAgIC8vIGFjY29yZGluZyB0byB0aGUgSkFYV1Mgc3BlYyA5LjMuMi4xIGZvb3Rub3RlIDIKLSAgICAgICAgaWYgKChCb29sZWFuKSAoY3VycmVudE1DLmdldChqYXZheC54bWwud3MuaGFuZGxlci5NZXNzYWdlQ29udGV4dC5NRVNTQUdFX09VVEJPVU5EX1BST1BFUlRZKSkgIT0gKGRpcmVjdGlvbiA9PSBEaXJlY3Rpb24uT1VUKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLQotCX0KLQotCi0gICAgLyoKLSAgICAgICogVGhpcyBpcyB0aGUgaW1wbGVtZW50YXRpb24gb2YgSkFYLVdTIDIuMCBzZWN0aW9uIDkuMy4yLjEKLSAgICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGNhbGxHZW5lcmljSGFuZGxlcnMoTUVQIG1lcCwgYm9vbGVhbiBleHBlY3RSZXNwb25zZSwgaW50IHN0YXJ0LCBpbnQgZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpcmVjdGlvbiBkaXJlY3Rpb24pIHRocm93cyBSdW50aW1lRXhjZXB0aW9uIHsKLQotICAgICAgICAvLyBpZiB0aGlzIGlzIGEgcmVzcG9uc2UgbWVzc2FnZSwgZXhwZWN0UmVzcG9uc2Ugc2hvdWxkIGFsd2F5cyBiZSBmYWxzZQotICAgICAgICBpZiAobWVwID09IE1FUC5SRVNQT05TRSkKLSAgICAgICAgICAgIGV4cGVjdFJlc3BvbnNlID0gZmFsc2U7Ci0KLSAgICAgICAgaW50IGkgPSBzdGFydDsKLSAgICAgICAgaW50IHJlc3VsdCA9IFNVQ0NFU1NGVUw7Ci0KLSAgICAgICAgLy8gZGVjbGFyZWQgYW5kIGluaXRpYWxpemVkIGp1c3QgaW4gY2FzZSB3ZSBuZWVkIHRoZW0KLSAgICAgICAgLy8gaW4gYSByZXZlcnNlIGZsb3cgc2l0dWF0aW9uCi0gICAgICAgIGludCBuZXdTdGFydCA9IDAsIG5ld1N0YXJ0X2luY2x1c2l2ZSA9IDAsIG5ld0VuZCA9IDA7Ci0gICAgICAgIERpcmVjdGlvbiBuZXdEaXJlY3Rpb24gPSBkaXJlY3Rpb247Ci0KLSAgICAgICAgaWYgKGRpcmVjdGlvbiA9PSBEaXJlY3Rpb24uT1VUKSB7Ci0gICAgICAgICAgICB3aGlsZSAoKGkgPD0gZW5kKSAmJiAocmVzdWx0ID09IFNVQ0NFU1NGVUwpKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gaGFuZGxlTWVzc2FnZSgoKEhhbmRsZXIpaGFuZGxlcnMuZ2V0KGkpKSwgZGlyZWN0aW9uLCBleHBlY3RSZXNwb25zZSk7Ci0gICAgICAgICAgICAgICAgbmV3U3RhcnQgPSBpIC0gMTsKLSAgICAgICAgICAgICAgICBuZXdTdGFydF9pbmNsdXNpdmUgPSBpOwotICAgICAgICAgICAgICAgIG5ld0VuZCA9IDA7Ci0gICAgICAgICAgICAgICAgbmV3RGlyZWN0aW9uID0gRGlyZWN0aW9uLklOOwotICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IFNVQ0NFU1NGVUwpICAvLyBkb24ndCBzd2l0Y2ggaWYgZmFpbGVkLCBzaW5jZSB3ZSdsbCBiZSByZXZlcnNpbmcgZGlyZWN0aW9ucwotICAgICAgICAgICAgICAgICAgICBzd2l0Y2hDb250ZXh0KGRpcmVjdGlvbiwgaSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7IC8vIElOIGNhc2UKLSAgICAgICAgICAgIHdoaWxlICgoaSA+PSBlbmQpICYmIChyZXN1bHQgPT0gU1VDQ0VTU0ZVTCkpIHsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBoYW5kbGVNZXNzYWdlKCgoSGFuZGxlciloYW5kbGVycy5nZXQoaSkpLCBkaXJlY3Rpb24sIGV4cGVjdFJlc3BvbnNlKTsKLSAgICAgICAgICAgICAgICBuZXdTdGFydCA9IGkgKyAxOwotICAgICAgICAgICAgICAgIG5ld1N0YXJ0X2luY2x1c2l2ZSA9IGk7Ci0gICAgICAgICAgICAgICAgbmV3RW5kID0gaGFuZGxlcnMuc2l6ZSgpIC0gMTsKLSAgICAgICAgICAgICAgICBuZXdEaXJlY3Rpb24gPSBEaXJlY3Rpb24uT1VUOwotICAgICAgICAgICAgICAgIGktLTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IFNVQ0NFU1NGVUwpICAvLyBkb24ndCBzd2l0Y2ggaWYgZmFpbGVkLCBzaW5jZSB3ZSdsbCBiZSByZXZlcnNpbmcgZGlyZWN0aW9ucwotICAgICAgICAgICAgICAgICAgICBzd2l0Y2hDb250ZXh0KGRpcmVjdGlvbiwgaSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobmV3RGlyZWN0aW9uID09IGRpcmVjdGlvbikgLy8gd2UgZGlkbid0IGFjdHVhbGx5IHByb2Nlc3MgYW55dGhpbmcsIHByb2JhYmx5IGR1ZSB0byBlbXB0eSBsaXN0Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsgIC8vIG5vIG5lZWQgdG8gY29udGludWUKLQotICAgICAgICAvLyA5LjMuMi4zIGluIGFsbCBzaXR1YXRpb25zLCB3ZSB3YW50IHRvIGNsb3NlIGFzIG1hbnkgaGFuZGxlcnMgYXMKLSAgICAgICAgLy8gd2VyZSBpbnZva2VkIHByaW9yIHRvIGNvbXBsZXRpb24gb3IgZXhjZXB0aW9uIHRocm93aW5nCi0gICAgICAgIGlmIChleHBlY3RSZXNwb25zZSkgewotICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBGQUlMRUQpIHsKLSAgICAgICAgICAgICAgICAvLyB3ZSBzaG91bGQgb25seSB1c2UgY2FsbEdlbmVyaWNIYW5kbGVyc19hdm9pZFJlY3Vyc2lvbiBpbiB0aGlzIGNhc2UKLSAgICAgICAgICAgICAgICBjYWxsR2VuZXJpY0hhbmRsZXJzX2F2b2lkUmVjdXJzaW9uKG5ld1N0YXJ0LCBuZXdFbmQsIG5ld0RpcmVjdGlvbik7Ci0gICAgICAgICAgICAgICAgY2FsbENsb3NlSGFuZGxlcnMobmV3U3RhcnRfaW5jbHVzaXZlLCBuZXdFbmQsIG5ld0RpcmVjdGlvbik7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdCA9PSBQUk9UT0NPTF9FWENFUFRJT04pIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBjYWxsR2VuZXJpY0hhbmRsZUZhdWx0KG5ld1N0YXJ0LCBuZXdFbmQsIG5ld0RpcmVjdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIGNhbGxDbG9zZUhhbmRsZXJzKG5ld1N0YXJ0X2luY2x1c2l2ZSwgbmV3RW5kLCBuZXdEaXJlY3Rpb24pOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FsbENsb3NlSGFuZGxlcnMobmV3U3RhcnRfaW5jbHVzaXZlLCBuZXdFbmQsIG5ld0RpcmVjdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IHJlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzdWx0ID09IE9USEVSX0VYQ0VQVElPTikgewotICAgICAgICAgICAgICAgIGNhbGxDbG9zZUhhbmRsZXJzKG5ld1N0YXJ0X2luY2x1c2l2ZSwgbmV3RW5kLCBuZXdEaXJlY3Rpb24pOwotICAgICAgICAgICAgICAgIC8vIHNhdmVkRXhjZXB0aW9uIGluaXRpYWxpemVkIGluIEhhbmRsZXJDaGFpblByb2Nlc3Nvci5oYW5kbGVNZXNzYWdlCi0gICAgICAgICAgICAgICAgdGhyb3cgc2F2ZWRFeGNlcHRpb247Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7IC8vIGV2ZXJ5dGhpbmcgd2FzIHN1Y2Nlc3NmdWwgT1IgZmluaXNoZWQgcHJvY2Vzc2luZyBoYW5kbGVycwotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIFRoaXMgaXMgYSBsaXR0bGUgY29uZnVzaW5nLiBUaGVyZSBhcmUgc2V2ZXJhbCBjYXNlcyB3ZSBzaG91bGQgYmUKLSAgICAgICAgICAgICAqIGF3YXJlIG9mLiBBbiBpbmNvbWluZyByZXF1ZXN0IHdpdGggZmFsc2UgZXhwZWN0UmVzcG9uc2UgaXMKLSAgICAgICAgICAgICAqIGVxdWl2YWxlbnQgdG8gc2VydmVyIGluYm91bmQgb25lLXdheSwgZm9yIGV4YW1wbGUuCi0gICAgICAgICAgICAgKiAKLSAgICAgICAgICAgICAqIEFuIG91dGdvaW5nIHJlc3BvbnNlIGlzIHNlcnZlciBvdXRib3VuZCwgYW5kIGlzIGFsd2F5cyBtYXJrZWQKLSAgICAgICAgICAgICAqIHdpdGggYSBmYWxzZSBleHBlY3RSZXNwb25zZS4gVGhlIHByb2JsZW0sIGhvd2V2ZXIsIGlzIHRoYXQgdGhlCi0gICAgICAgICAgICAgKiBkaXJlY3Rpb24gZm9yIHRoZSBjYWxsIHRvIGNsb3NlaGFuZGxlcnMgd2lsbCBiZSBpbmNvcnJlY3QuIEluCi0gICAgICAgICAgICAgKiB0aGlzIGNhc2UsIHRoZSBoYW5kbGVycyBzaG91bGQgYmUgY2xvc2VkIGluIHRoZSBvcHBvc2l0ZSBvcmRlciBvZgotICAgICAgICAgICAgICogdGhlIE9SSUdJTkFMIGludm9jYXRpb24uCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmIChtZXAuZXF1YWxzKE1FUC5SRVFVRVNUKSkgewotICAgICAgICAgICAgICAgIC8vIGEgcmVxdWVzdCB0aGF0IHJlcXVpcmVzIG5vIHJlc3BvbnNlIGlzIGEgb25lLXdheSBtZXNzYWdlCi0gICAgICAgICAgICAgICAgLy8gYW5kIHdlIHNob3VsZCBvbmx5IGNsb3NlIHdob21ldmVyIGdvdCBpbnZva2VkCi0gICAgICAgICAgICAgICAgY2FsbENsb3NlSGFuZGxlcnMobmV3U3RhcnRfaW5jbHVzaXZlLCBuZXdFbmQsIG5ld0RpcmVjdGlvbik7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gQXMgYWNjb3JkaW5nIHRvIHRoZSBTdW4gImV4cGVydHMiLCBleGNlcHRpb25zIHJhaXNlZCBieQotICAgICAgICAgICAgICAgIC8vIGhhbmRsZXJzIGluIG9uZSB3YXkgaW52b2NhdGlvbiBhcmUgZGlzY2FyZGVkLiBUaGV5Ci0gICAgICAgICAgICAgICAgLy8gYXJlIE5PVCBwcm9wYWdhdGVkIHRvIHRoZSB1c2VyIGNvZGUuCi0gICAgICAgICAgICAgICAgaWYgKHNhdmVkRXhjZXB0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLndhcm4oIkV4Y2VwdGlvbiB0aHJvd24gYnkgYSBoYW5kbGVyIGluIG9uZSB3YXkgaW52b2NhdGlvbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVkRXhjZXB0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgLy9CdXQgZG8gcmV0dXJuIGZhaWx1cmUgc28gdGhhdCB3ZSBrbm93IG5vdCB0byBzZW5kIHRvIHNlcnZlcgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gaXQncyBhIHJlc3BvbnNlLCBzbyB3ZSBjYW4gc2FmZWx5IGFzc3VtZSB0aGF0IAotICAgICAgICAgICAgICAgIC8vIEFMTCB0aGUgaGFuZGxlcnMgd2VyZSBpbnZva2VkIG9uIHRoZSByZXF1ZXN0LAotICAgICAgICAgICAgICAgIC8vIHNvIHdlIG5lZWQgdG8gY2xvc2UgQUxMIG9mIHRoZW0KLSAgICAgICAgICAgICAgICBpZiAoZGlyZWN0aW9uLmVxdWFscyhEaXJlY3Rpb24uSU4pKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhbGxDbG9zZUhhbmRsZXJzKGhhbmRsZXJzLnNpemUoKSAtIDEsIDAsIGRpcmVjdGlvbik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgY2FsbENsb3NlSGFuZGxlcnMoMCwgaGFuZGxlcnMuc2l6ZSgpIC0gMSwgZGlyZWN0aW9uKTsKLSAgICAgICAgICAgICAgICB9Ci0gCi0gICAgICAgICAgICAgICAgaWYgKHNhdmVkRXhjZXB0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSBhIHNhdmVkIGV4Y2VwdGlvbiwgdGhyb3cgaXQgKEpBWC1XUyA5LjMuMi4xICJUaHJvdyAKLSAgICAgICAgICAgICAgICAgICAgLy8gUHJvdG9jb2xFeGNlcHRpb24gb3IgYW55IG90aGVyIHJ1bnRpbWUgZXhjZXB0aW9uIC0tPiBObyAKLSAgICAgICAgICAgICAgICAgICAgLy8gcmVzcG9uc2UiIGNhc2UuCi0gICAgICAgICAgICAgICAgICAgIHRocm93IHNhdmVkRXhjZXB0aW9uOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBJZiB3ZSd2ZSBmYWlsZWQgYmVmb3JlIHRoaXMsIHdlIHdvdWxkIGhhdmUgYWxyZWFkeSB0aHJvd24gZXhjZXB0aW9uCi0gICAgICAgIC8vIG9yIHJldHVybmVkIGZhbHNlLCBzbyBqdXN0IHJldHVybiB0cnVlIGhlcmUgLi4uIGRvbid0IG5lZWQgdG8gY2hlY2sgcmVzdWx0IGFnYWluLgotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAgKiBjYWxsR2VuZXJpY0hhbmRsZXJzX2F2b2lkUmVjdXJzaW9uIHNob3VsZCBPTkxZIGJlIGNhbGxlZCBmcm9tIG9uZSBwbGFjZS4KLSAgICAgICogVE9ETzogIFdlIGNhbm5vdCBuZWNlc3NhcmlseSBhc3N1bWUgbm8gZmFsc2UgcmV0dXJucyBhbmQgbm8gZXhjZXB0aW9ucyB3aWxsIGJlCi0gICAgICAqIHRocm93biBmcm9tIGhlcmUgZXZlbiB0aG91Z2ggdGhlIGhhbmRsZXJzIHdlIHdpbGwgYmUgY2FsbGluZyBoYXZlIGFsbCBhbHJlYWR5Ci0gICAgICAqIHN1Y2NlZWRlZCBpbiBjYWxsR2VuZXJpY0hhbmRsZXJzLgotICAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY2FsbEdlbmVyaWNIYW5kbGVyc19hdm9pZFJlY3Vyc2lvbihpbnQgc3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVuZCwgRGlyZWN0aW9uIGRpcmVjdGlvbikgewotICAgICAgICBpbnQgaSA9IHN0YXJ0OwotCi0gICAgICAgIGlmIChkaXJlY3Rpb24gPT0gRGlyZWN0aW9uLk9VVCkgewotICAgICAgICAgICAgZm9yICg7IGkgPD0gZW5kOyBpKyspIHsKLSAgICAgICAgICAgICAgICBzd2l0Y2hDb250ZXh0KGRpcmVjdGlvbiwgaSk7Ci0gICAgICAgICAgICAgICAgSGFuZGxlciBoYW5kbGVyID0gKEhhbmRsZXIpIGhhbmRsZXJzLmdldChpKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJJbnZva2luZyBoYW5kbGVNZXNzYWdlIG9uOiAiICsgaGFuZGxlci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGhhbmRsZXIuaGFuZGxlTWVzc2FnZShjdXJyZW50TUMpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgeyAvLyBJTiBjYXNlCi0gICAgICAgICAgICBmb3IgKDsgaSA+PSBlbmQ7IGktLSkgewotICAgICAgICAgICAgICAgIHN3aXRjaENvbnRleHQoZGlyZWN0aW9uLCBpKTsKLSAgICAgICAgICAgICAgICBIYW5kbGVyIGhhbmRsZXIgPSAoSGFuZGxlcikgaGFuZGxlcnMuZ2V0KGkpOwotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiSW52b2tpbmcgaGFuZGxlTWVzc2FnZSBvbjogIiArIGhhbmRsZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBoYW5kbGVyLmhhbmRsZU1lc3NhZ2UoY3VycmVudE1DKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQ2FsbHMgaGFuZGxlTWVzc2FnZSBvbiB0aGUgSGFuZGxlci4gSWYgYW4gZXhjZXB0aW9uIGlzIHRocm93biBhbmQgYSByZXNwb25zZSBpcyBleHBlY3RlZCwgdGhlCi0gICAgICogTWVzc2FnZUNvbnRleHQgaXMgdXBkYXRlZCB3aXRoIHRoZSBoYW5kbGVyIGluZm9ybWF0aW9uCi0gICAgICoKLSAgICAgKiBAcmV0dXJucyBTVUNDRVNTRlVMIGlmIHN1Y2Nlc3NmdWxseSwgVU5TVUNDRVNTRlVMIGlmIGZhbHNlLCBFWENFUFRJT04gaWYgZXhjZXB0aW9uIHRocm93bgotICAgICAqLwotICAgIHByaXZhdGUgaW50IGhhbmRsZU1lc3NhZ2UoSGFuZGxlciBoYW5kbGVyLCBEaXJlY3Rpb24gZGlyZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBleHBlY3RSZXNwb25zZSkgdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJJbnZva2luZyBoYW5kbGVNZXNzYWdlIG9uOiAiICsgaGFuZGxlci5nZXRDbGFzcygpLmdldE5hbWUoKSk7IAotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBUaGUgcHJlIGFuZCBwb3N0IGludm9rZXJzIHdpbGwgbGlrZWx5IG5lZWQgbW9yZSB0aGFuIGp1c3QgdGhlIGhhbmRsZXIgbWVzc2FnZSBjb250ZXh0LgotICAgICAgICAgICAgLy8gVGhleSBtYXkgbmVlZCBhY2Nlc3MgdG8gdGhlIGF4aXMgc2VydmljZSBvYmplY3Qgb3IgZGVzY3JpcHRpb24gb2JqZWN0cy4KLSAgICAgICAgICAgIGN1cnJlbnRNQy5wdXQoQ29uc3RhbnRzLk1FUF9DT05URVhULCBtZXBDdHgpOwotCi0gICAgICAgICAgICBnZXRQcmVJbnZva2VyKCkucHJlSW52b2tlKGN1cnJlbnRNQyk7Ci0gICAgICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSBoYW5kbGVyLmhhbmRsZU1lc3NhZ2UoY3VycmVudE1DKTsKLSAgICAgICAgICAgIGdldFBvc3RJbnZva2VyKCkucG9zdEludm9rZShjdXJyZW50TUMpOwotICAgICAgICAgICAgaWYgKHN1Y2Nlc3MpIHsKLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJoYW5kbGVNZXNzYWdlKCkgcmV0dXJuZWQgdHJ1ZSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gU1VDQ0VTU0ZVTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoImhhbmRsZU1lc3NhZ2UoKSByZXR1cm5lZCBmYWxzZSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoZXhwZWN0UmVzcG9uc2UpCi0gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRNQy5wdXQoamF2YXgueG1sLndzLmhhbmRsZXIuTWVzc2FnZUNvbnRleHQuTUVTU0FHRV9PVVRCT1VORF9QUk9QRVJUWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkaXJlY3Rpb24gIT0gRGlyZWN0aW9uLk9VVCkpOwotICAgICAgICAgICAgICAgIHJldHVybiBGQUlMRUQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gCi0gICAgICAgIGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7IAotICAgICAgICAgICAgLy8gUnVudGltZUV4Y2VwdGlvbiBhbmQgUHJvdG9jb2xFeGNlcHRpb24KLSAgICAgICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICBsb2cuZGVidWcoIkFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duIGR1cmluZyB0aGUgaGFuZGxlTWVzc2FnZSgpIGludm9jYXRpb24iKTsKLSAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiRXhjZXB0aW9uOiAiLCByZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHNhdmVkRXhjZXB0aW9uID0gcmU7Ci0gICAgICAgICAgICBpZiAoZXhwZWN0UmVzcG9uc2UpCi0gICAgICAgICAgICAgICAgLy8gbWFyayBpdCBhcyByZXZlcnNlIGRpcmVjdGlvbgotICAgICAgICAgICAgICAgIGN1cnJlbnRNQy5wdXQoamF2YXgueG1sLndzLmhhbmRsZXIuTWVzc2FnZUNvbnRleHQuTUVTU0FHRV9PVVRCT1VORF9QUk9QRVJUWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRpcmVjdGlvbiAhPSBEaXJlY3Rpb24uT1VUKSk7Ci0gICAgICAgICAgICBpZiAoUHJvdG9jb2xFeGNlcHRpb24uY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShyZS5nZXRDbGFzcygpKSkgewotICAgICAgICAgICAgICAgIGNvbnZlcnRUb0ZhdWx0TWVzc2FnZShtZXBDdHgsIHJlLCBwcm90byk7Ci0gICAgICAgICAgICAgICAgLy8ganVzdCByZS1pbml0aWFsaXplIHRoZSBjdXJyZW50IGhhbmRsZXIgbWVzc2FnZSBjb250ZXh0IHNpbmNlCi0gICAgICAgICAgICAgICAgLy8gdGhhdCB3aWxsIHBpY2sgdXAgdGhlIG5vdy1jaGFuZ2VkIG1lc3NhZ2UKLSAgICAgICAgICAgICAgICByZXR1cm4gUFJPVE9DT0xfRVhDRVBUSU9OOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIE9USEVSX0VYQ0VQVElPTjsKLSAgICAgICAgfQotCi0gICAgfQotCi0KLSAgICAvKgotICAgICAgKiBzdGFydCBhbmQgZW5kIHNob3VsZCBiZSBJTmNsdXNpdmUgb2YgdGhlIGhhbmRsZXJzIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4KLSAgICAgICogaW52b2tlZCBvbiBIYW5kbGVyLmhhbmRsZU1lc3NhZ2Ugb3IgSGFuZGxlci5oYW5kbGVGYXVsdAotICAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY2FsbENsb3NlSGFuZGxlcnMoaW50IHN0YXJ0LCBpbnQgZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXJlY3Rpb24gZGlyZWN0aW9uKSB7Ci0gICAgICAgIGludCBpID0gc3RhcnQ7Ci0KLSAgICAgICAgaWYgKGRpcmVjdGlvbiA9PSBEaXJlY3Rpb24uT1VUKSB7Ci0gICAgICAgICAgICBmb3IgKDsgaSA8PSBlbmQ7IGkrKykgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaENvbnRleHQoZGlyZWN0aW9uLCBpKTsKLSAgICAgICAgICAgICAgICAgICAgSGFuZGxlciBoYW5kbGVyID0gKEhhbmRsZXIpIGhhbmRsZXJzLmdldChpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkludm9raW5nIGNsb3NlIG9uOiAiICsgaGFuZGxlci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlci5jbG9zZShjdXJyZW50TUMpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyB3aGVuIHdlIGNsb3NlLCBhcmUgd2UgZG9uZSB3aXRoIHRoZSBoYW5kbGVyIGluc3RhbmNlLCBhbmQgdGh1cwotICAgICAgICAgICAgICAgICAgICAvLyBtYXkgY2FsbCB0aGUgUHJlRGVzdHJveSBhbm5vdGF0ZWQgbWV0aG9kPyAgSSBkb24ndCB0aGluayBzbywgZXNwZWNpYWxseQotICAgICAgICAgICAgICAgICAgICAvLyBpZiB3ZSd2ZSBjYWNoZWQgdGhlIGhhbmRsZXIgbGlzdCBzb21ld2hlcmUuCi0gICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkFuIEV4Y2VwdGlvbiBvY2N1cnJlZCB3aGlsZSBjYWxsaW5nIGhhbmRsZXIuY2xvc2UoKSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJFeGNlcHRpb246ICIgKyBlLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIjoiICsgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgeyAvLyBJTiBjYXNlCi0gICAgICAgICAgICBmb3IgKDsgaSA+PSBlbmQ7IGktLSkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaENvbnRleHQoZGlyZWN0aW9uLCBpKTsKLSAgICAgICAgICAgICAgICAgICAgSGFuZGxlciBoYW5kbGVyID0gKEhhbmRsZXIpIGhhbmRsZXJzLmdldChpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkludm9raW5nIGNsb3NlIG9uOiAiICsgaGFuZGxlci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlci5jbG9zZShjdXJyZW50TUMpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyB3aGVuIHdlIGNsb3NlLCBhcmUgd2UgZG9uZSB3aXRoIHRoZSBoYW5kbGVyIGluc3RhbmNlLCBhbmQgdGh1cwotICAgICAgICAgICAgICAgICAgICAvLyBtYXkgY2FsbCB0aGUgUHJlRGVzdHJveSBhbm5vdGF0ZWQgbWV0aG9kPyAgSSBkb24ndCB0aGluayBzbywgZXNwZWNpYWxseQotICAgICAgICAgICAgICAgICAgICAvLyBpZiB3ZSd2ZSBjYWNoZWQgdGhlIGhhbmRsZXIgbGlzdCBzb21ld2hlcmUuCi0gICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkFuIEV4Y2VwdGlvbiBvY2N1cnJlZCB3aGlsZSBjYWxsaW5nIGhhbmRsZXIuY2xvc2UoKSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJFeGNlcHRpb246ICIgKyBlLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIjoiICsgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBwcm9jZXNzRmF1bHQgaXMgYXZhaWxhYmxlIGZvciBhIHNlcnZlciB0byB1c2Ugd2hlbiB0aGUgZW5kcG9pbnQKLSAgICAgICogdGhyb3dzIGFuIGV4Y2VwdGlvbiBvciBhIGNsaWVudCB3aGVuIGl0IGdldHMgYSBmYXVsdCByZXNwb25zZSBtZXNzYWdlCi0gICAgICAqCi0gICAgICAqIEluIGJvdGggY2FzZXMsIGFsbCBvZiB0aGUgaGFuZGxlcnMgaGF2ZSBydW4gc3VjY2Vzc2Z1bGx5IGluIHRoZQotICAgICAgKiBvcHBvc2l0ZSBkaXJlY3Rpb24gYXMgdGhpcyBjYWxsIHRvIGNhbGxIYW5kbGVGYXVsdCwgYW5kIHRodXMKLSAgICAgICogc2hvdWxkIGJlIGNsb3NlZC4KLSAgICAgICovCi0gICAgcHVibGljIHZvaWQgcHJvY2Vzc0ZhdWx0KE1FUENvbnRleHQgbWVwQ3R4LCBEaXJlY3Rpb24gZGlyZWN0aW9uKSB7Ci0KLSAgICAgICAgLy8gZGlyZWN0aW9uLklOID0gY2xpZW50Ci0gICAgICAgIC8vIGRpcmVjdGlvbi5PVVQgPSBzZXJ2ZXIKLSAgICAgICAgaWYgKGhhbmRsZXJzLnNpemUoKSA9PSAwKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIHRoaXMubWVwQ3R4ID0gbWVwQ3R4OwotCQlzb3J0Q2hhaW4oKTsKLSAgICAgICAgaW5pdENvbnRleHQoZGlyZWN0aW9uKTsKLQkJY3VycmVudE1DLnB1dChqYXZheC54bWwud3MuaGFuZGxlci5NZXNzYWdlQ29udGV4dC5NRVNTQUdFX09VVEJPVU5EX1BST1BFUlRZLCAoZGlyZWN0aW9uID09IERpcmVjdGlvbi5PVVQpKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKGRpcmVjdGlvbiA9PSBEaXJlY3Rpb24uT1VUKSB7Ci0gICAgICAgICAgICAgICAgY2FsbEdlbmVyaWNIYW5kbGVGYXVsdCgwLCBoYW5kbGVycy5zaXplKCkgLSAxLCBkaXJlY3Rpb24pOwotICAgICAgICAgICAgfSBlbHNlIHsgLy8gSU4gY2FzZQotICAgICAgICAgICAgICAgIGNhbGxHZW5lcmljSGFuZGxlRmF1bHQoaGFuZGxlcnMuc2l6ZSgpIC0gMSwgMCwgZGlyZWN0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgewotICAgICAgICAgICAgLy8gVE9ETzogbG9nIGl0Ci0gICAgICAgICAgICB0aHJvdyByZTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIC8vIHdlIGNhbiBjbG9zZSBhbGwgdGhlIEhhbmRsZXJzIGluIHJldmVyc2Ugb3JkZXIKLSAgICAgICAgICAgIGlmIChkaXJlY3Rpb24gPT0gRGlyZWN0aW9uLk9VVCkgewotICAgICAgICAgICAgICAgIGluaXRDb250ZXh0KERpcmVjdGlvbi5JTik7Ci0gICAgICAgICAgICAgICAgY2FsbENsb3NlSGFuZGxlcnMoMCwgaGFuZGxlcnMuc2l6ZSgpIC0gMSwgRGlyZWN0aW9uLk9VVCk7Ci0gICAgICAgICAgICB9IGVsc2UgeyAvLyBJTiBjYXNlCi0gICAgICAgICAgICAgICAgaW5pdENvbnRleHQoRGlyZWN0aW9uLklOKTsKLSAgICAgICAgICAgICAgICBjYWxsQ2xvc2VIYW5kbGVycyhoYW5kbGVycy5zaXplKCkgLSAxLCAwLCBEaXJlY3Rpb24uSU4pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICAvKgotICAgICAgKiBUaGUgY2FsbEdlbmVyaWNIYW5kbGVGYXVsdCBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGNsb3NpbmcgYW55IGludm9rZWQKLSAgICAgICogSGFuZGxlcnMuICBXZSBkb24ndCBrbm93IGhvdyBmYXIgdGhlIEhhbmRsZXIuaGFuZGxlTWVzc2FnZSBjYWxscyBnb3QKLSAgICAgICogYmVmb3JlIGEgZmFpbHVyZSBtYXkgaGF2ZSBvY2N1cnJlZC4KLSAgICAgICoKLSAgICAgICogUmVnYXJkbGVzcyBvZiB0aGUgSGFuZGxlci5oYW5kbGVGYXVsdCByZXN1bHQsIHRoZSBmbG93IGlzIHRoZSBzYW1lICg5LjMuMi4yKQotICAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY2FsbEdlbmVyaWNIYW5kbGVGYXVsdChpbnQgc3RhcnQsIGludCBlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlyZWN0aW9uIGRpcmVjdGlvbikgdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24gewotCi0gICAgICAgIGludCBpID0gc3RhcnQ7Ci0gICAgICAgIAotICAgICAgICAvLyB3ZSBtYXkgYmUgc3RhcnRpbmcgaW4gdGhlIG1pZGRsZSBvZiB0aGUgbGlzdCwgYW5kIHRoZXJlZm9yZSBtYXkgbmVlZCB0byBzd2l0Y2ggY29udGV4dHMKLSAgICAgICAgc3dpdGNoQ29udGV4dChkaXJlY3Rpb24sIGkpOwotCi0gICAgICAgIGlmIChkaXJlY3Rpb24gPT0gRGlyZWN0aW9uLk9VVCkgewotICAgICAgICAgICAgZm9yICg7IGkgPD0gZW5kOyBpKyspIHsKLSAgICAgICAgICAgICAgICBIYW5kbGVyIGhhbmRsZXIgPSAoSGFuZGxlcikgaGFuZGxlcnMuZ2V0KGkpOwotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkludm9raW5nIGhhbmRsZUZhdWx0IG9uOiAiICsgaGFuZGxlci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9IGhhbmRsZXIuaGFuZGxlRmF1bHQoY3VycmVudE1DKTsKLQotICAgICAgICAgICAgICAgIGlmICghc3VjY2VzcykKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgc3dpdGNoQ29udGV4dChkaXJlY3Rpb24sIGkgKyAxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsgLy8gSU4gY2FzZQotICAgICAgICAgICAgZm9yICg7IGkgPj0gZW5kOyBpLS0pIHsKLSAgICAgICAgICAgICAgICBIYW5kbGVyIGhhbmRsZXIgPSAoSGFuZGxlcikgaGFuZGxlcnMuZ2V0KGkpOwotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkludm9raW5nIGhhbmRsZUZhdWx0IG9uOiAiICsgaGFuZGxlci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9IGhhbmRsZXIuaGFuZGxlRmF1bHQoY3VycmVudE1DKTsKLQotICAgICAgICAgICAgICAgIGlmICghc3VjY2VzcykKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgc3dpdGNoQ29udGV4dChkaXJlY3Rpb24sIGkgLSAxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGNvbnZlcnRUb0ZhdWx0TWVzc2FnZShNRVBDb250ZXh0IG1lcEN0eCwgRXhjZXB0aW9uIGUsIFByb3RvY29sIHByb3RvY29sKSB7Ci0KLSAgICAgICAgLy8gbmVlZCB0byBjaGVjayBpZiBtZXNzYWdlIGlzIGFscmVhZHkgYSBmYXVsdCBtZXNzYWdlIG9yIG5vdCwKLSAgICAgICAgLy8gcHJvYmFibHkgYnkgd2F5IG9mIGEgZmxhZyAoaXNGYXVsdCkgaW4gdGhlIE1lc3NhZ2VDb250ZXh0IG9yIE1lc3NhZ2UKLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIkNyZWF0aW5nIGEgZmF1bHQgTWVzc2FnZSBvYmplY3QgZm9yIHRoZSBleGNlcHRpb246ICIgKyBlLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgfQotICAgICAgICAgICAKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8qIFRPRE8gVE9ETyBUT0RPCi0gICAgICAgICAgICAgKiBUaGVyZSBoYXMgR09UIHRvIGJlIGEgYmV0dGVyIHdheSB0byBkbyB0aGlzLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAocHJvdG9jb2wgPT0gUHJvdG9jb2wuc29hcDExIHx8IHByb3RvY29sID09IFByb3RvY29sLnNvYXAxMikgewotICAgICAgICAgICAgICAgIFN0cmluZyBwcm90b2NvbE5TID0gKHByb3RvY29sID09IFByb3RvY29sLnNvYXAxMSkgPwotICAgICAgICAgICAgICAgICAgICAgICAgU09BUENvbnN0YW50cy5VUklfTlNfU09BUF8xXzFfRU5WRUxPUEUgOgotICAgICAgICAgICAgICAgICAgICAgICAgU09BUENvbnN0YW50cy5VUklfTlNfU09BUF8xXzJfRU5WRUxPUEU7Ci0KLSAgICAgICAgICAgICAgICAvLyBUaGUgZm9sbG93aW5nIHNldCBvZiBpbnN0cnVjdGlvbnMgaXMgdXNlZCB0byBhdm9pZCAKLSAgICAgICAgICAgICAgICAvLyBzb21lIHVuaW1wbGVtZW50ZWQgbWV0aG9kcyBpbiB0aGUgQXhpczIgU0FBSiBpbXBsZW1lbnRhdGlvbgotICAgICAgICAgICAgICAgIFhNTEZhdWx0IHhtbEZhdWx0ID0gTWV0aG9kTWFyc2hhbGxlclV0aWxzLmNyZWF0ZVhNTEZhdWx0RnJvbVN5c3RlbUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgICAgICBqYXZheC54bWwuc29hcC5NZXNzYWdlRmFjdG9yeSBtZiA9IFNBQUpGYWN0b3J5LmNyZWF0ZU1lc3NhZ2VGYWN0b3J5KHByb3RvY29sTlMpOwotICAgICAgICAgICAgICAgIFNPQVBNZXNzYWdlIG1lc3NhZ2UgPSBtZi5jcmVhdGVNZXNzYWdlKCk7Ci0gICAgICAgICAgICAgICAgU09BUEJvZHkgYm9keSA9IG1lc3NhZ2UuZ2V0U09BUEJvZHkoKTsKLSAgICAgICAgICAgICAgICBTT0FQRmF1bHQgc29hcEZhdWx0ID0gWE1MRmF1bHRVdGlscy5jcmVhdGVTQUFKRmF1bHQoeG1sRmF1bHQsIGJvZHkpOwotCi0gICAgICAgICAgICAgICAgLy8gVE9ETyBzb21ldGhpbmcgaXMgd3JvbmcgaGVyZS4gIFRoZSBtZXNzYWdlIHNob3VsZCBiZSBhIHJlc3BvbnNlIG1lc3NhZ2UsIG5vdAotICAgICAgICAgICAgICAgIC8vIGEgcmVxdWVzdCBtZXNzYWdlLiAgSSBkb24ndCBzZWUgaG93IHRvIGNoYW5nZSB0aGF0LiAgKHNlZSB0aGUgZGVidWdnZXIuLi4pCi0gICAgICAgICAgICAgICAgLy8gVE9ETyBwcm9iYWJseSBhbHNvIG5lZWQgdG8gdHVybiBvbiBtZXNzYWdlLldSSVRFX1hNTF9ERUNMQVJBVElPTgotICAgICAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5IG1zZ0ZhY3RvcnkgPSAoTWVzc2FnZUZhY3RvcnkpIEZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KE1lc3NhZ2VGYWN0b3J5LmNsYXNzKTsKLSAgICAgICAgICAgICAgICBNZXNzYWdlIG1zZyA9IG1zZ0ZhY3RvcnkuY3JlYXRlRnJvbShtZXNzYWdlKTsKLSAgICAgICAgICAgICAgICBtZXBDdHguc2V0TWVzc2FnZShtc2cpOwotCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiY0ZhdWx0TXNnRXJyIikpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihleCk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRDb250ZXh0KERpcmVjdGlvbiBkaXJlY3Rpb24pIHsKLSAgICAgICAgc29hcE1DID0gTWVzc2FnZUNvbnRleHRGYWN0b3J5LmNyZWF0ZVNvYXBNZXNzYWdlQ29udGV4dChtZXBDdHguZ2V0TWVzc2FnZUNvbnRleHQoKSk7Ci0gICAgICAgIGxvZ2ljYWxNQyA9IE1lc3NhZ2VDb250ZXh0RmFjdG9yeS5jcmVhdGVMb2dpY2FsTWVzc2FnZUNvbnRleHQobWVwQ3R4LmdldE1lc3NhZ2VDb250ZXh0KCkpOwotICAgICAgICBpZiAoZGlyZWN0aW9uID09IERpcmVjdGlvbi5PVVQpIHsKLSAgICAgICAgICAgIC8vIGxvZ2ljYWwgY29udGV4dCwgdGhlbiBTT0FQCi0gICAgICAgICAgICBpZiAoKGxvZ2ljYWxMZW5ndGggPT0gMCkgJiYgKGhhbmRsZXJzLnNpemUoKSA+IDApKSAvLyB3ZSBvbmx5IGhhdmUgc29hcCBoYW5kbGVycwotICAgICAgICAgICAgICAgIGN1cnJlbnRNQyA9IHNvYXBNQzsgLy9NZXNzYWdlQ29udGV4dEZhY3RvcnkuY3JlYXRlU29hcE1lc3NhZ2VDb250ZXh0KG1lcEN0eC5nZXRNZXNzYWdlQ29udGV4dCgpKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBjdXJyZW50TUMgPSBsb2dpY2FsTUM7IC8vTWVzc2FnZUNvbnRleHRGYWN0b3J5LmNyZWF0ZUxvZ2ljYWxNZXNzYWdlQ29udGV4dChtZXBDdHguZ2V0TWVzc2FnZUNvbnRleHQoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBTT0FQIGNvbnRleHQsIHRoZW4gbG9naWNhbAotICAgICAgICAgICAgaWYgKChsb2dpY2FsTGVuZ3RoID09IGhhbmRsZXJzLnNpemUoKSkgJiYgKGhhbmRsZXJzLnNpemUoKSA+IDApKSAvLyB3ZSBvbmx5IGhhdmUgbG9naWNhbCBoYW5kbGVycwotICAgICAgICAgICAgICAgIGN1cnJlbnRNQyA9IGxvZ2ljYWxNQzsgLy9NZXNzYWdlQ29udGV4dEZhY3RvcnkuY3JlYXRlTG9naWNhbE1lc3NhZ2VDb250ZXh0KG1lcEN0eC5nZXRNZXNzYWdlQ29udGV4dCgpKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBjdXJyZW50TUMgPSBzb2FwTUM7IC8vTWVzc2FnZUNvbnRleHRGYWN0b3J5LmNyZWF0ZVNvYXBNZXNzYWdlQ29udGV4dChtZXBDdHguZ2V0TWVzc2FnZUNvbnRleHQoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc3dpdGNoQ29udGV4dChEaXJlY3Rpb24gZGlyZWN0aW9uLCBpbnQgaW5kZXgpIHsKLQotICAgICAgICBpZiAoKGxvZ2ljYWxMZW5ndGggPT0gaGFuZGxlcnMuc2l6ZSgpKSB8fCAobG9naWNhbExlbmd0aCA9PSAwKSkKLSAgICAgICAgICAgIHJldHVybjsgLy8gYWxsIGhhbmRsZXJzIG11c3QgYmUgdGhlIHNhbWUgdHlwZSwgc28gbm8gY29udGV4dCBzd2l0Y2gKLQotICAgICAgICBpZiAoKChkaXJlY3Rpb24gPT0gRGlyZWN0aW9uLk9VVCkgJiYgKGluZGV4ID09IGxvZ2ljYWxMZW5ndGgpKQotICAgICAgICAgICAgICAgIHx8ICgoZGlyZWN0aW9uID09IERpcmVjdGlvbi5JTikgJiYgKGluZGV4ID09IChsb2dpY2FsTGVuZ3RoIC0gMSkpKSkgewotICAgICAgICAgICAgLy9pZiAoY3VycmVudE1DLmdldENsYXNzKCkuaXNBc3NpZ25hYmxlRnJvbShMb2dpY2FsTWVzc2FnZUNvbnRleHQuY2xhc3MpKQotICAgICAgICAgICAgaWYgKGN1cnJlbnRNQyA9PSBsb2dpY2FsTUMpICAvLyBvYmplY3QgY2hlY2ssIG5vdCAuZXF1YWxzKCkKLSAgICAgICAgICAgICAgICBjdXJyZW50TUMgPSBzb2FwTUM7IC8vTWVzc2FnZUNvbnRleHRGYWN0b3J5LmNyZWF0ZVNvYXBNZXNzYWdlQ29udGV4dChtZXBDdHguZ2V0TWVzc2FnZUNvbnRleHQoKSk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgY3VycmVudE1DID0gbG9naWNhbE1DOyAvL01lc3NhZ2VDb250ZXh0RmFjdG9yeS5jcmVhdGVMb2dpY2FsTWVzc2FnZUNvbnRleHQobWVwQ3R4LmdldE1lc3NhZ2VDb250ZXh0KCkpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgSGFuZGxlclByZUludm9rZXIgZ2V0UHJlSW52b2tlcigpIHsKLSAgICAJaWYgKGhhbmRsZXJQcmVJbnZva2VyID09IG51bGwpIHsKLSAgICAJCUhhbmRsZXJQcmVJbnZva2VyRmFjdG9yeSBwcmVJbnZva2VyRmFjdG9yeSA9IChIYW5kbGVyUHJlSW52b2tlckZhY3RvcnkpRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoSGFuZGxlclByZUludm9rZXJGYWN0b3J5LmNsYXNzKTsKLSAgICAJCWhhbmRsZXJQcmVJbnZva2VyID0gKEhhbmRsZXJQcmVJbnZva2VyKXByZUludm9rZXJGYWN0b3J5LmNyZWF0ZUhhbmRsZXJQcmVJbnZva2VyKCk7Ci0gICAgCX0KLSAgICAJcmV0dXJuIGhhbmRsZXJQcmVJbnZva2VyOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIEhhbmRsZXJQb3N0SW52b2tlciBnZXRQb3N0SW52b2tlcigpIHsKLSAgICAJaWYgKGhhbmRsZXJQb3N0SW52b2tlciA9PSBudWxsKSB7Ci0gICAgCQlIYW5kbGVyUG9zdEludm9rZXJGYWN0b3J5IHBvc3RJbnZva2VyRmFjdG9yeSA9IChIYW5kbGVyUG9zdEludm9rZXJGYWN0b3J5KUZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KEhhbmRsZXJQb3N0SW52b2tlckZhY3RvcnkuY2xhc3MpOwotICAgIAkJaGFuZGxlclBvc3RJbnZva2VyID0gKEhhbmRsZXJQb3N0SW52b2tlcilwb3N0SW52b2tlckZhY3RvcnkuY3JlYXRlSGFuZGxlclBvc3RJbnZva2VyKCk7Ci0gICAgCX0KLSAgICAJcmV0dXJuIGhhbmRsZXJQb3N0SW52b2tlcjsKLSAgICB9Ci0gICAgCi0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2hhbmRsZXIvSGFuZGxlckludm9jYXRpb25Db250ZXh0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9oYW5kbGVyL0hhbmRsZXJJbnZvY2F0aW9uQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMmU1ZGYyLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2hhbmRsZXIvSGFuZGxlckludm9jYXRpb25Db250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmhhbmRsZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS5NZXNzYWdlQ29udGV4dDsNCi0NCi1pbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuSGFuZGxlcjsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotLyoqDQotICogVGhpcyBkYXRhIGJlYW4gd2lsbCBiZSBwYXNzZWQgdG8gdGhlIEhhbmRsZXJJbnZva2VyIGluc3RhbmNlLg0KLSAqIFRoZSBiZWFuIHdpbGwgY29udGFpbiB0aGUgbmVjZXNzYXJ5IGRhdGEgaW4gb3JkZXIgdG8gaW52b2tlDQotICogZWl0aGVyIGluYm91bmQgb3Igb3V0Ym91bmQgSGFuZGxlciBpbnN0YW5jZXMgZm9yIGEgZ2l2ZW4gcmVxdWVzdC4NCi0gKg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBIYW5kbGVySW52b2NhdGlvbkNvbnRleHQgew0KLSAgICANCi0gICAgcHJpdmF0ZSBNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dDsNCi0gICAgDQotICAgIHByaXZhdGUgSGFuZGxlckNoYWluUHJvY2Vzc29yLk1FUCBtZXA7DQotICAgIA0KLSAgICBwcml2YXRlIExpc3Q8SGFuZGxlcj4gaGFuZGxlcnM7DQotICAgIA0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNPbmVXYXk7DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzT25lV2F5KCkgew0KLSAgICAgICAgcmV0dXJuIGlzT25lV2F5Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE9uZVdheShib29sZWFuIGlzT25lV2F5KSB7DQotICAgICAgICB0aGlzLmlzT25lV2F5ID0gaXNPbmVXYXk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE1lc3NhZ2VDb250ZXh0IGdldE1lc3NhZ2VDb250ZXh0KCkgew0KLSAgICAgICAgcmV0dXJuIG1lc3NhZ2VDb250ZXh0Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2VDb250ZXh0KE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0KSB7DQotICAgICAgICB0aGlzLm1lc3NhZ2VDb250ZXh0ID0gbWVzc2FnZUNvbnRleHQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEhhbmRsZXJDaGFpblByb2Nlc3Nvci5NRVAgZ2V0TUVQKCkgew0KLSAgICAgICAgcmV0dXJuIG1lcDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRNRVAoSGFuZGxlckNoYWluUHJvY2Vzc29yLk1FUCBtZXApIHsNCi0gICAgICAgIHRoaXMubWVwID0gbWVwOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBMaXN0PEhhbmRsZXI+IGdldEhhbmRsZXJzKCkgew0KLSAgICAgICAgcmV0dXJuIGhhbmRsZXJzOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldEhhbmRsZXJzKExpc3Q8SGFuZGxlcj4gaGFuZGxlcnMpIHsNCi0gICAgICAgIHRoaXMuaGFuZGxlcnMgPSBoYW5kbGVyczsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9oYW5kbGVyL0hhbmRsZXJJbnZva2VyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9oYW5kbGVyL0hhbmRsZXJJbnZva2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2NThmNDMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvaGFuZGxlci9IYW5kbGVySW52b2tlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5oYW5kbGVyOw0KLQ0KLQ0KLS8qKg0KLSAqIFRoaXMgaW50ZXJmYWNlIHJlcHJlc2VudHMgYSBjbGFzcyB0aGF0IHdpbGwgYmUgY2FsbGVkIGJ5IHRoZQ0KLSAqIEpBWC1XUyBFbmRwb2ludENvbnRyb2xsZXIgdG8gaGFuZGxlIHRoZSBpbnZvY2F0aW9uIG9mIGJvdGgNCi0gKiBpbmJvdW5kIGFuZCBvdXRib3VuZCBoYW5kbGVycy4gSW5zdGFuY2VzIG9mIHRoZXNlIHdpbGwgYmUNCi0gKiBzZXJ2ZWQgdXAgYnkgdGhlIEhhbmRsZXJJbnZva2VyRmFjdG9yeS4NCi0gKg0KLSAqLw0KLXB1YmxpYyBpbnRlcmZhY2UgSGFuZGxlckludm9rZXIgew0KLQ0KLSAgICAvKioNCi0gICAgICogSW52b2tlcyBhbGwgaW5ib3VuZCBoYW5kbGVycyBmb3IgdGhlIGluY29taW5nIHJlcXVlc3QgdG8gdGhlIGVuZHBvaW50Lg0KLSAgICAgKi8NCi0gICAgcHVibGljIGJvb2xlYW4gaW52b2tlSW5ib3VuZEhhbmRsZXJzKEhhbmRsZXJJbnZvY2F0aW9uQ29udGV4dCBjb250ZXh0KTsNCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBJbnZva2VzIGFsbCBpbmJvdW5kIGhhbmRsZXJzIGZvciB0aGUgaW5jb21pbmcgcmVxdWVzdCB0byB0aGUgZW5kcG9pbnQuDQotICAgICAqLw0KLSAgICBwdWJsaWMgYm9vbGVhbiBpbnZva2VPdXRib3VuZEhhbmRsZXJzKEhhbmRsZXJJbnZvY2F0aW9uQ29udGV4dCBjb250ZXh0KTsNCi0gICAgDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2hhbmRsZXIvSGFuZGxlckludm9rZXJVdGlscy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvaGFuZGxlci9IYW5kbGVySW52b2tlclV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllMjgxMTMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvaGFuZGxlci9IYW5kbGVySW52b2tlclV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmhhbmRsZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuUHJvdG9jb2w7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLkhhbmRsZXI7Ci1pbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuc29hcC5TT0FQSGFuZGxlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotcHVibGljIGNsYXNzIEhhbmRsZXJJbnZva2VyVXRpbHMgewotICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhIYW5kbGVySW52b2tlclV0aWxzLmNsYXNzKTsKLQotICAgIC8qKgotICAgICAqIEludm9rZSBJbmJvdW5kIEhhbmRsZXJzCi0gICAgICogQHBhcmFtIHJlcXVlc3RNc2dDdHgKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaW52b2tlSW5ib3VuZEhhbmRsZXJzKE1FUENvbnRleHQgbWVwTWVzc2FnZUN0eCwgTGlzdDxIYW5kbGVyPiBoYW5kbGVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZXJDaGFpblByb2Nlc3Nvci5NRVAgbWVwLCBib29sZWFuIGlzT25lV2F5KSB7Ci0KLSAgICAgICAgaWYgKGhhbmRsZXJzID09IG51bGwgfHwgaGFuZGxlcnMuaXNFbXB0eSgpKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAgICAgU3RyaW5nIGJpbmRpbmdQcm90byA9IG51bGw7Ci0gICAgICAgIGlmIChtZXAuZXF1YWxzKEhhbmRsZXJDaGFpblByb2Nlc3Nvci5NRVAuUkVRVUVTVCkpIC8vIGluYm91bmQgcmVxdWVzdDsgbXVzdCBiZSBvbiB0aGUgc2VydmVyCi0gICAgICAgICAgICBiaW5kaW5nUHJvdG8gPSBtZXBNZXNzYWdlQ3R4LmdldEVuZHBvaW50RGVzYygpLmdldEJpbmRpbmdUeXBlKCk7Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgLy8gaW5ib3VuZCByZXNwb25zZTsgbXVzdCBiZSBvbiB0aGUgY2xpZW50Ci0gICAgICAgICAgICBiaW5kaW5nUHJvdG8gPSBtZXBNZXNzYWdlQ3R4LmdldEVuZHBvaW50RGVzYygpLmdldENsaWVudEJpbmRpbmdJRCgpOwotICAgICAgICAgICAgLy8gVGhlIGdldEhlYWRlciBwcm9jZXNzaW5nIGlzIGRvbmUgb24gdGhlIHNlcnZlciBieSB0aGUgRW5kcG9pbnRDb250cm9sbGVyLgotICAgICAgICAgICAgLy8gRm9yIG1lc3NhZ2VzIGluYm91bmQgdG8gdGhlIGNsaWVudCAoaS5lLiByZXNwb25zZXMpLCB3ZSBkbyBpdCBoZXJlIHNpbmNlIGFsbCB0aHJlZQotICAgICAgICAgICAgLy8gY2xpZW50IEpBWC1XUyBBUElzIChpLmUuIHN5bmMsIGFzeW5jLCBhbmQgYXN5bmMgY2FsbGJhY2spIHVzZSB0aGlzIG1ldGhvZCB0byAKLSAgICAgICAgICAgIC8vIGludm9rZSB0aGUgaGFuZGxlcnMuCi0gICAgICAgICAgICBMaXN0PFFOYW1lPiB1bmRlcnN0b29kID0gbmV3IEFycmF5TGlzdDxRTmFtZT4oKTsKLSAgICAgICAgICAgIGZvcihIYW5kbGVyIGhhbmRsZXI6aGFuZGxlcnMpewotICAgICAgICAgICAgICAgIGlmKGhhbmRsZXIgaW5zdGFuY2VvZiBTT0FQSGFuZGxlcil7Ci0gICAgICAgICAgICAgICAgICAgIFNPQVBIYW5kbGVyIHNvYXBIYW5kbGVyID0gKFNPQVBIYW5kbGVyKWhhbmRsZXI7Ci0gICAgICAgICAgICAgICAgICAgIC8vSW52b2tpbmcgZ2V0SGVhZGVycy4KLSAgICAgICAgICAgICAgICAgICAgaWYobG9nLmlzRGVidWdFbmFibGVkKCkpewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJDbGllbnQgc2lkZTogSW52b2tpbmcgZ2V0SGVhZGVyKCkgb24gU09BUEhhbmRsZXI6ICIgKyBzb2FwSGFuZGxlcik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgU2V0PFFOYW1lPiBoZWFkZXJzID0gc29hcEhhbmRsZXIuZ2V0SGVhZGVycygpOwotICAgICAgICAgICAgICAgICAgICBpZihoZWFkZXJzIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcihRTmFtZSBoZWFkZXI6aGVhZGVycyl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIXVuZGVyc3Rvb2QuY29udGFpbnMoaGVhZGVyKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQWRkaW5nIEhlYWRlciBRTmFtZSIgKyBoZWFkZXIgKyAiIHRvIHVkZXJzdG9vZEhlYWRlclFOYW1lIExpc3QiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0FkZGluZyB0aGlzIHRvIHVuZGVyc3Rvb2QgaGVhZGVyIGxpc3QuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBUaGlzIGxpc3Qgb2YgaGVhZGVycyB1bmRlc3Rvb2QgYnkgdGhlIGNsaWVudCBpbmJvdW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEpBWC1XUyBoYW5kbGVycyBzaG91bGQgYmUgdXNlZCBpbiBjbGllbnQtc2lkZSBpbmJvdW5kIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtdXN0VW5kZXJzdGFuZCBoZWFkZXIgcHJvY2Vzc2luZy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZXJzdG9vZC5hZGQoaGVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgUHJvdG9jb2wgcHJvdG8gPSBQcm90b2NvbC5nZXRQcm90b2NvbEZvckJpbmRpbmcoYmluZGluZ1Byb3RvKTsKLSAgICAgICAgCi0KLSAgICAgICAgSGFuZGxlckNoYWluUHJvY2Vzc29yIHByb2Nlc3NvciA9IG5ldyBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IoaGFuZGxlcnMsIHByb3RvKTsKLSAgICAgICAgLy8gaWYgbm90IG9uZS13YXksIGV4cGVjdCBhIHJlc3BvbnNlCi0gICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9IHRydWU7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAobWVwTWVzc2FnZUN0eC5nZXRNZXNzYWdlT2JqZWN0KCkuaXNGYXVsdCgpKSB7Ci0gICAgICAgICAgICAgICAgcHJvY2Vzc29yLnByb2Nlc3NGYXVsdChtZXBNZXNzYWdlQ3R4LCBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IuRGlyZWN0aW9uLklOKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc3VjY2VzcyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzb3IucHJvY2Vzc0NoYWluKG1lcE1lc3NhZ2VDdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZXJDaGFpblByb2Nlc3Nvci5EaXJlY3Rpb24uSU4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWlzT25lV2F5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgewotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIGhhbmRsZXIgZnJhbWV3b3JrIHNob3VsZCBvbmx5IHRocm93IGFuIGV4Y2VwdGlvbiBoZXJlIGlmCi0gICAgICAgICAgICAgKiB3ZSBhcmUgaW4gdGhlIGNsaWVudCBpbmJvdW5kIGNhc2UuICBNYWtlIHN1cmUgdGhlIG1lc3NhZ2UKLSAgICAgICAgICAgICAqIGNvbnRleHQgYW5kIG1lc3NhZ2UgYXJlIHRyYW5zZm9ybWVkLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IuY29udmVydFRvRmF1bHRNZXNzYWdlKG1lcE1lc3NhZ2VDdHgsIHJlLCBwcm90byk7Ci0gICAgICAgICAgICAvLyBkb25lIGludm9raW5nIGluYm91bmQgaGFuZGxlcnMsIGJlIHN1cmUgdG8gc2V0IHRoZSBhY2Nlc3MgbG9jayBmbGFnIG9uIHRoZSBjb250ZXh0IHRvIHRydWUKLSAgICAgICAgICAgIG1lcE1lc3NhZ2VDdHguc2V0QXBwbGljYXRpb25BY2Nlc3NMb2NrZWQodHJ1ZSk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIXN1Y2Nlc3MgJiYgbWVwLmVxdWFscyhIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IuTUVQLlJFUVVFU1QpKSB7Ci0gICAgICAgICAgICAvLyB1aC1vaC4gIFdlJ3ZlIGNoYW5nZWQgZGlyZWN0aW9ucyBvbiB0aGUgc2VydmVyIGluYm91bmQgaGFuZGxlciBwcm9jZXNzaW5nLAotICAgICAgICAgICAgLy8gVGhpcyBtZWFucyB3ZSdyZSBub3cgb24gYW4gb3V0Ym91bmQgZmxvdywgYW5kIHRoZSBlbmRwb2ludCB3aWxsIG5vdAotICAgICAgICAgICAgLy8gYmUgY2FsbGVkLiAgQmUgc3VyZSB0byBtYXJrIHRoZSBjb250ZXh0IGFuZCBtZXNzYWdlIGFzIHN1Y2guCi0KLSAgICAgICAgICAgIC8vIGRvbmUgaW52b2tpbmcgaW5ib3VuZCBoYW5kbGVycywgYmUgc3VyZSB0byBzZXQgdGhlIGFjY2VzcyBsb2NrIGZsYWcgb24gdGhlIGNvbnRleHQgdG8gdHJ1ZQotICAgICAgICAgICAgbWVwTWVzc2FnZUN0eC5zZXRBcHBsaWNhdGlvbkFjY2Vzc0xvY2tlZCh0cnVlKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICAvLyBkb25lIGludm9raW5nIGluYm91bmQgaGFuZGxlcnMsIGJlIHN1cmUgdG8gc2V0IHRoZSBhY2Nlc3MgbG9jayBmbGFnIG9uIHRoZSBjb250ZXh0IHRvIHRydWUKLSAgICAgICAgbWVwTWVzc2FnZUN0eC5zZXRBcHBsaWNhdGlvbkFjY2Vzc0xvY2tlZCh0cnVlKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbnZva2UgT3V0Ym91bmRIYW5kbGVycwotICAgICAqIAotICAgICAqIEBwYXJhbSBtc2dDdHgKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaW52b2tlT3V0Ym91bmRIYW5kbGVycyhNRVBDb250ZXh0IG1lcE1lc3NhZ2VDdHgsIExpc3Q8SGFuZGxlcj4gaGFuZGxlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlckNoYWluUHJvY2Vzc29yLk1FUCBtZXAsIGJvb2xlYW4gaXNPbmVXYXkpIHsKLQotICAgICAgICBpZiAoaGFuZGxlcnMgPT0gbnVsbCB8fCBoYW5kbGVycy5pc0VtcHR5KCkpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgICAgICBTdHJpbmcgYmluZGluZ1Byb3RvID0gbnVsbDsKLSAgICAgICAgaWYgKG1lcC5lcXVhbHMoSGFuZGxlckNoYWluUHJvY2Vzc29yLk1FUC5SRVFVRVNUKSkgLy8gb3V0Ym91bmQgcmVxdWVzdDsgbXVzdCBiZSBvbiB0aGUgY2xpZW50Ci0gICAgICAgICAgICBiaW5kaW5nUHJvdG8gPSBtZXBNZXNzYWdlQ3R4LmdldEVuZHBvaW50RGVzYygpLmdldENsaWVudEJpbmRpbmdJRCgpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICAvLyBvdXRib3VuZCByZXNwb25zZTsgbXVzdCBiZSBvbiB0aGUgc2VydmVyCi0gICAgICAgICAgICBiaW5kaW5nUHJvdG8gPSBtZXBNZXNzYWdlQ3R4LmdldEVuZHBvaW50RGVzYygpLmdldEJpbmRpbmdUeXBlKCk7Ci0gICAgICAgIFByb3RvY29sIHByb3RvID0gUHJvdG9jb2wuZ2V0UHJvdG9jb2xGb3JCaW5kaW5nKGJpbmRpbmdQcm90byk7Ci0KLSAgICAgICAgSGFuZGxlckNoYWluUHJvY2Vzc29yIHByb2Nlc3NvciA9IG5ldyBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IoaGFuZGxlcnMsIHByb3RvKTsKLSAgICAgICAgLy8gaWYgbm90IG9uZS13YXksIGV4cGVjdCBhIHJlc3BvbnNlCi0gICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9IHRydWU7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAobWVwTWVzc2FnZUN0eC5nZXRNZXNzYWdlT2JqZWN0KCkuaXNGYXVsdCgpKSB7Ci0gICAgICAgICAgICAgICAgcHJvY2Vzc29yLnByb2Nlc3NGYXVsdChtZXBNZXNzYWdlQ3R4LCBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IuRGlyZWN0aW9uLk9VVCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPQotICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc29yLnByb2Nlc3NDaGFpbihtZXBNZXNzYWdlQ3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IuRGlyZWN0aW9uLk9VVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhaXNPbmVXYXkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7Ci0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogaGFuZGxlciBmcmFtZXdvcmsgd2lsbCB0aHJvdyBhbiBleGNlcHRpb24gaGVyZSBvbiBjbGllbnQgb3V0Ym91bmQgZmxvdyBhbmQKLSAgICAgICAgICAgICAqIHNlcnZlciBvdXRib3VuZCBmbG93LiAgTWFrZSBzdXJlIHRoZSBtZXNzYWdlIGNvbnRleHQgYW5kIG1lc3NhZ2UgYXJlIHRyYW5zZm9ybWVkCi0gICAgICAgICAgICAgKiBhbmQgdGhlIGV4Y2VwdGlvbiBpcyBzYXZlZCBvbiB0aGUgbWVzc2FnZSBjb250ZXh0LgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IuY29udmVydFRvRmF1bHRNZXNzYWdlKG1lcE1lc3NhZ2VDdHgsIHJlLCBwcm90byk7Ci0gICAgICAgICAgICBpZiAobWVwTWVzc2FnZUN0eC5nZXRSZXF1ZXN0TWVzc2FnZUNvbnRleHQoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbWVwTWVzc2FnZUN0eC5nZXRSZXF1ZXN0TWVzc2FnZUNvbnRleHQoKS5zZXRDYXVzZWRCeUV4Y2VwdGlvbihuZXcgQXhpc0ZhdWx0KHJlLmdldE1lc3NhZ2UoKSwgcmUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtZXBNZXNzYWdlQ3R4LmdldFJlc3BvbnNlTWVzc2FnZUNvbnRleHQoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbWVwTWVzc2FnZUN0eC5nZXRSZXNwb25zZU1lc3NhZ2VDb250ZXh0KCkuc2V0Q2F1c2VkQnlFeGNlcHRpb24obmV3IEF4aXNGYXVsdChyZS5nZXRNZXNzYWdlKCksIHJlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIXN1Y2Nlc3MgJiYgbWVwLmVxdWFscyhIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IuTUVQLlJFUVVFU1QpKSB7Ci0gICAgICAgICAgICAvLyB1aC1vaC4gIFdlJ3ZlIGNoYW5nZWQgZGlyZWN0aW9ucyBvbiB0aGUgY2xpZW50IG91dGJvdW5kIGhhbmRsZXIgcHJvY2Vzc2luZywKLSAgICAgICAgICAgIC8vIFRoaXMgbWVhbnMgd2UncmUgbm93IG9uIGFuIGluYm91bmQgZmxvdywgYW5kIHRoZSBzZXJ2aWNlIHdpbGwgbm90Ci0gICAgICAgICAgICAvLyBiZSBjYWxsZWQuICBCZSBzdXJlIHRvIG1hcmsgdGhlIGNvbnRleHQgYW5kIG1lc3NhZ2UgYXMgc3VjaC4KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvaGFuZGxlci9IYW5kbGVyUG9zdEludm9rZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2hhbmRsZXIvSGFuZGxlclBvc3RJbnZva2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmYzdiOTUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvaGFuZGxlci9IYW5kbGVyUG9zdEludm9rZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaGFuZGxlcjsNCi0NCi1pbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuTWVzc2FnZUNvbnRleHQ7DQotDQotLyoNCi0gKiBIYW5kbGVyUG9zdEludm9rZXIgLSB0aGlzIGlzIHRoZSBpbnRlcmZhY2UgcmV0dXJuZWQgYnkgdGhlDQotICogSGFuZGxlclBvc3RJbnZva2VyRmFjdG9yeSB0byBiZSBjYWxsZWQganVzdCBhZnRlciBlYWNoDQotICogSkFYV1MgaGFuZGxlci5oYW5kbGVNZXNzYWdlIGludm9jYXRpb24uDQotICovDQotcHVibGljIGludGVyZmFjZSBIYW5kbGVyUG9zdEludm9rZXIgew0KLQ0KLQkvKioNCi0JICogcG9zdEludm9rZSBpcyBjYWxsZWQganVzdCBwcmlvciB0byBlYWNoIEpBWFdTIGhhbmRsZXIuaGFuZGxlTWVzc2FnZS4NCi0JICogSW1wbGVtZW50YXRpb25zIG1heSBuZWVkIHRvIGNoZWNrIGlmIHdlIGFyZSBpbmJvdW5kIG9yIG91dGJvdW5kLCBhbmQNCi0JICogY2xpZW50IG9yIHNlcnZlci4gIEltcGxlbWVudGF0aW9ucyBtYXkgdmFsaWRhdGUgdGhlIHByZS1jb25kaXRpb25zIGZvciBoYW5kbGVycywNCi0JICogc3VjaCBhcyBzYXZpbmcgYSBTT0FQIG1lc3NhZ2UgYm9keSwgdGhhdCB3ZXJlIHJlZ2lzdGVyZWQgYnkgSGFuZGxlclByZUludm9rZXIuDQotCSAqIA0KLQkgKiBAcGFyYW0gbWMNCi0JICovDQotCXB1YmxpYyB2b2lkIHBvc3RJbnZva2UoTWVzc2FnZUNvbnRleHQgbWMpOw0KLQkNCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvaGFuZGxlci9IYW5kbGVyUHJlSW52b2tlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvaGFuZGxlci9IYW5kbGVyUHJlSW52b2tlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjcyNmUzLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2hhbmRsZXIvSGFuZGxlclByZUludm9rZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaGFuZGxlcjsNCi0NCi1pbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuTWVzc2FnZUNvbnRleHQ7DQotDQotLyoNCi0gKiBIYW5kbGVyUHJlSW52b2tlciAtIHRoaXMgaXMgdGhlIGludGVyZmFjZSByZXR1cm5lZCBieSB0aGUNCi0gKiBIYW5kbGVyUHJlSW52b2tlckZhY3RvcnkgdG8gYmUgY2FsbGVkIGp1c3QgcHJpb3IgdG8gZWFjaA0KLSAqIEpBWFdTIGhhbmRsZXIuaGFuZGxlTWVzc2FnZSBpbnZvY2F0aW9uLg0KLSAqLw0KLXB1YmxpYyBpbnRlcmZhY2UgSGFuZGxlclByZUludm9rZXIgew0KLQ0KLQkvKioNCi0JICogcHJlSW52b2tlIGlzIGNhbGxlZCBqdXN0IHByaW9yIHRvIGVhY2ggSkFYV1MgaGFuZGxlci5oYW5kbGVNZXNzYWdlLg0KLQkgKiBJbXBsZW1lbnRhdGlvbnMgbWF5IG5lZWQgdG8gY2hlY2sgaWYgd2UgYXJlIGluYm91bmQgb3Igb3V0Ym91bmQsIGFuZA0KLQkgKiBjbGllbnQgb3Igc2VydmVyLiAgSW1wbGVtZW50YXRpb25zIG1heSBzZXQgdXAgcHJlLWNvbmRpdGlvbnMgZm9yIGhhbmRsZXJzLA0KLQkgKiBzdWNoIGFzIHNhdmluZyBhIFNPQVAgbWVzc2FnZSBib2R5LCB0byBiZSBjaGVja2VkIGJ5IEhhbmRsZXJQb3N0SW52b2tlcg0KLQkgKiBmb3IgaWxsZWdhbCBtb2RpZmljYXRpb25zLg0KLQkgKiANCi0JICogQHBhcmFtIG1jDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBwcmVJbnZva2UoTWVzc2FnZUNvbnRleHQgbWMpOw0KLQkNCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvaGFuZGxlci9IYW5kbGVyUmVzb2x2ZXJJbXBsLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9oYW5kbGVyL0hhbmRsZXJSZXNvbHZlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA3ZDdlMS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9oYW5kbGVyL0hhbmRsZXJSZXNvbHZlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaGFuZGxlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuRXhjZXB0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5EZXNjcmlwdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5FbmRwb2ludERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uUmVzb2x2ZWRIYW5kbGVyc0Rlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uU2VydmljZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uaW1wbC5SZXNvbHZlZEhhbmRsZXJzRGVzY3JpcHRpb25JbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24ueG1sLmhhbmRsZXIuSGFuZGxlckNoYWluVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLnhtbC5oYW5kbGVyLkhhbmRsZXJDaGFpbnNUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24ueG1sLmhhbmRsZXIuSGFuZGxlclR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5oYW5kbGVyLmxpZmVjeWNsZS5mYWN0b3J5LkhhbmRsZXJMaWZlY3ljbGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaGFuZGxlci5saWZlY3ljbGUuZmFjdG9yeS5IYW5kbGVyTGlmZWN5Y2xlTWFuYWdlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5pMThuLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MucmVnaXN0cnkuRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc3BpLmhhbmRsZXIuQmFzZUhhbmRsZXJSZXNvbHZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuTG9nZ2luZ0NvbnRyb2w7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5IYW5kbGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLkxvZ2ljYWxIYW5kbGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLlBvcnRJbmZvOwotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLnNvYXAuU09BUEhhbmRsZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qIAotICogVGhpcyBjbGFzcyBzaG91bGQgYmUgY3JlYXRlZCBieSB0aGUgU2VydmljZURlbGVnYXRlLgotICogSGFuZGxlclJlc29sdmVySW1wbC5nZXRIYW5kbGVyQ2hhaW4oUG9ydEluZm8pIHdpbGwgYmUgY2FsbGVkIGJ5IHRoZQotICogSW52b2NhdGlvbkNvbnRleHQsIGFuZCB0aGUgcmV0dXJuIHZhbHVlIHdpbGwgYmUgc2V0IG9uIHRoZSBCaW5kaW5nCi0gKiB1bmRlciB0aGUgQmluZGluZ1Byb3ZpZGVyLgotICogCi0gKiBIYW5kbGVyUmVzb2x2ZXJJbXBsLmdldEhhbmRsZXJDaGFpbihQb3J0SW5mbykgd2lsbCBiZSByZXNwb25zaWJsZSBmb3IKLSAqIHN0YXJ0aW5nIGVhY2ggSGFuZGxlcidzIGxpZmVjeWNsZSBhY2NvcmRpbmcgdG8gSkFYLVdTIHNwZWMgOS4zLjEKLSAqLwotCi1wdWJsaWMgY2xhc3MgSGFuZGxlclJlc29sdmVySW1wbCBleHRlbmRzIEJhc2VIYW5kbGVyUmVzb2x2ZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEhhbmRsZXJSZXNvbHZlckltcGwuY2xhc3MpOwotICAgIC8qCi0gICAgICAqIFRPRE86ICBpcyB0aGVyZSBhbnkgdmFsdWUvcmVhc29uIGluIGNhY2hpbmcgdGhlIGxpc3Qgd2UgY29sbGVjdCBmcm9tIHRoZQotICAgICAgKiBwb3J0cz8gIEl0IGlzIGEgImxpdmUiIGxpc3QgaW4gdGhlIHNlbnNlIHRoYXQgd2UgY291bGQgcG9zc2libHkgcmV0dXJuCi0gICAgICAqIGEgTGlzdCBvciBBcnJheUxpc3Qgb2JqZWN0IHRvIGEgc2VydmljZSBvciBjbGllbnQgYXBwbGljYXRpb24sIHdoZXJlCi0gICAgICAqIHRoZXkgY291bGQgbWFuaXB1bGF0ZSBpdC4KLSAgICAgICovCi0KLSAgICBwcml2YXRlIFNlcnZpY2VEZXNjcmlwdGlvbiBzZXJ2aWNlRGVzYzsKLSAgICBwcml2YXRlIE9iamVjdCBzZXJ2aWNlRGVsZWdhdGVLZXk7Ci0gICAgCi0gICAgcHVibGljIEhhbmRsZXJSZXNvbHZlckltcGwoU2VydmljZURlc2NyaXB0aW9uIHNkKSB7Ci0gICAgICAgIHRoaXMoc2QsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBIYW5kbGVyUmVzb2x2ZXJJbXBsKFNlcnZpY2VEZXNjcmlwdGlvbiBzZCwgT2JqZWN0IHNlcnZpY2VEZWxlZ2F0ZUtleSkgeyAKLSAgICAgICAgdGhpcy5zZXJ2aWNlRGVzYyA9IHNkOwotICAgICAgICB0aGlzLnNlcnZpY2VEZWxlZ2F0ZUtleSA9IHNlcnZpY2VEZWxlZ2F0ZUtleTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBSZXNvbHZlZEhhbmRsZXJzRGVzY3JpcHRpb24gZ2V0UmVzb2x2ZWRIYW5kbGVyc0Rlc2NyaXB0aW9uKFBvcnRJbmZvIHBvcnRJbmZvKSB7Ci0gICAgICAgIFJlc29sdmVkSGFuZGxlcnNEZXNjcmlwdGlvbiByZXNvbHZlZEhhbmRsZXJzRGVzYyA9IG51bGw7Ci0gICAgICAgIC8vIE9uIHRoZSBjbGllbnQgdGhlIGhhbmRsZXIgaW5mb3JtYXRpb24gY2FuIGJlIGNoYW5nZWQgdmlhIHNlcnZpY2UtZGVsZWdhdGUtc3BlY2lmaWMKLSAgICAgICAgLy8gZGVwbG95bWVudCBpbmZvcm1hdGlvbi4gIFNvLCBvbmx5IGxvb2sgaW50byB0aGUgc2VydmljZS1zaWRlIGNhY2hlIG9ubHkgaWYgdGhlIAotICAgICAgICAvLyBzZXJ2aWNlIGRlbGVnYXRlIGtleSBpcyBudWxsLgotICAgICAgICBpZiAoc2VydmljZURlbGVnYXRlS2V5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJlc29sdmVkSGFuZGxlcnNEZXNjID0gc2VydmljZURlc2MuZ2V0UmVzb2x2ZWRIYW5kbGVyc0Rlc2NyaXB0aW9uKHBvcnRJbmZvKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzb2x2ZWRIYW5kbGVyc0Rlc2M7Ci0gICAgfQotICAgIHByaXZhdGUgUmVzb2x2ZWRIYW5kbGVyc0Rlc2NyaXB0aW9uIGdldE9yQ3JlYXRlUmVzb2x2ZWRIYW5kbGVyc0Rlc2NyaXB0aW9uKFBvcnRJbmZvIHBvcnRJbmZvKSB7Ci0gICAgICAgIFJlc29sdmVkSGFuZGxlcnNEZXNjcmlwdGlvbiByZXNvbHZlZEhhbmRsZXJzRGVzYyA9IG51bGw7Ci0gICAgICAgIC8vIE9uIHRoZSBjbGllbnQgdGhlIGhhbmRsZXIgaW5mb3JtYXRpb24gY2FuIGJlIGNoYW5nZWQgdmlhIHNlcnZpY2UtZGVsZWdhdGUtc3BlY2lmaWMKLSAgICAgICAgLy8gZGVwbG95bWVudCBpbmZvcm1hdGlvbi4gIFNvLCBvbmx5IGxvb2sgaW50byB0aGUgc2VydmljZS1zaWRlIGNhY2hlIG9ubHkgaWYgdGhlIAotICAgICAgICAvLyBzZXJ2aWNlIGRlbGVnYXRlIGtleSBpcyBudWxsLgotICAgICAgICBpZiAoc2VydmljZURlbGVnYXRlS2V5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJlc29sdmVkSGFuZGxlcnNEZXNjID0gc2VydmljZURlc2MuZ2V0UmVzb2x2ZWRIYW5kbGVyc0Rlc2NyaXB0aW9uKHBvcnRJbmZvKTsKLSAgICAgICAgICAgIGlmIChyZXNvbHZlZEhhbmRsZXJzRGVzYyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmVzb2x2ZWRIYW5kbGVyc0Rlc2MgPSBEZXNjcmlwdGlvbkZhY3RvcnkuY3JlYXRlUmVzb2x2ZWRIYW5kbGVyc0Rlc2NyaXB0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc29sdmVkSGFuZGxlcnNEZXNjOwotICAgIH0KLSAgICBwcml2YXRlIExpc3Q8Q2xhc3M+IGdlQ2FjaGVkUmVzb2x2ZWRIYW5kbGVyc0NsYXNzZXMoUG9ydEluZm8gcG9ydEluZm8pIHsKLSAgICAgICAgTGlzdDxDbGFzcz4gY2FjaGVkSGFuZGxlckNsYXNzZXMgPSBudWxsOwotICAgICAgICBSZXNvbHZlZEhhbmRsZXJzRGVzY3JpcHRpb24gcmVzb2x2ZWRIYW5kbGVyc0Rlc2MgPSBnZXRSZXNvbHZlZEhhbmRsZXJzRGVzY3JpcHRpb24ocG9ydEluZm8pOwotICAgICAgICBpZiAocmVzb2x2ZWRIYW5kbGVyc0Rlc2MgIT0gbnVsbCkgewotICAgICAgICAgICAgY2FjaGVkSGFuZGxlckNsYXNzZXMgPSByZXNvbHZlZEhhbmRsZXJzRGVzYy5nZXRIYW5kbGVyQ2xhc3NlcygpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjYWNoZWRIYW5kbGVyQ2xhc3NlczsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGNhY2hlUmVzb2x2ZWRIYW5kbGVyc0luZm8oUG9ydEluZm8gcG9ydEluZm8sIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IGhhbmRsZXJDbGFzc2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8U3RyaW5nPiByb2xlcykgewotICAgICAgICBSZXNvbHZlZEhhbmRsZXJzRGVzY3JpcHRpb24gcmVzb2x2ZWRIYW5kbGVyc0Rlc2MgPSBnZXRPckNyZWF0ZVJlc29sdmVkSGFuZGxlcnNEZXNjcmlwdGlvbihwb3J0SW5mbyk7Ci0gICAgICAgIGlmIChyZXNvbHZlZEhhbmRsZXJzRGVzYyAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXNvbHZlZEhhbmRsZXJzRGVzYy5zZXRIYW5kbGVyQ2xhc3NlcyhoYW5kbGVyQ2xhc3Nlcyk7Ci0gICAgICAgICAgICByZXNvbHZlZEhhbmRsZXJzRGVzYy5zZXRSb2xlcyhyb2xlcyk7Ci0gICAgICAgICAgICBzZXJ2aWNlRGVzYy5zZXRSZXNvbHZlZEhhbmRsZXJzRGVzY3JpcHRpb24ocG9ydEluZm8sIHJlc29sdmVkSGFuZGxlcnNEZXNjKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgTGlzdDxDbGFzcz4gZ2V0SGFuZGxlckNsYXNzZXMoUG9ydEluZm8gcG9ydEluZm8pIHsKLSAgICAgICAgTGlzdDxDbGFzcz4gaGFuZGxlckNsYXNzZXMgPSBnZUNhY2hlZFJlc29sdmVkSGFuZGxlcnNDbGFzc2VzKHBvcnRJbmZvKTsKLSAgICAgICAgaWYgKGhhbmRsZXJDbGFzc2VzID09IG51bGwpIHsKLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiByZXNvbHZlUm9sZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgICAgIGhhbmRsZXJDbGFzc2VzID0gcmVzb2x2ZUhhbmRsZXJzKHBvcnRJbmZvLCByZXNvbHZlUm9sZXMpOwotICAgICAgICAgICAgY2FjaGVSZXNvbHZlZEhhbmRsZXJzSW5mbyhwb3J0SW5mbywgaGFuZGxlckNsYXNzZXMsIHJlc29sdmVSb2xlcyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGhhbmRsZXJDbGFzc2VzOwotICAgIH0KLSAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBnZXRIYW5kbGVyUm9sZXMoUG9ydEluZm8gcG9ydEluZm8pIHsKLSAgICAgICAgTGlzdDxTdHJpbmc+IHJlc29sdmVSb2xlcyA9IGdldENhY2hlZFJlc29sdmVkSGFuZGxlcnNSb2xlcyhwb3J0SW5mbyk7Ci0gICAgICAgIGlmIChyZXNvbHZlUm9sZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmVzb2x2ZVJvbGVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICBMaXN0PENsYXNzPiByZXNvbHZlQ2xhc3NlcyA9IHJlc29sdmVIYW5kbGVycyhwb3J0SW5mbywgcmVzb2x2ZVJvbGVzKTsKLSAgICAgICAgICAgIGNhY2hlUmVzb2x2ZWRIYW5kbGVyc0luZm8ocG9ydEluZm8sIHJlc29sdmVDbGFzc2VzLCByZXNvbHZlUm9sZXMpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXNvbHZlUm9sZXM7Ci0gICAgfQotICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IGdldENhY2hlZFJlc29sdmVkSGFuZGxlcnNSb2xlcyhQb3J0SW5mbyBwb3J0SW5mbykgewotICAgICAgICBMaXN0PFN0cmluZz4gY2FjaGVkSGFuZGxlclJvbGVzID0gbnVsbDsKLSAgICAgICAgUmVzb2x2ZWRIYW5kbGVyc0Rlc2NyaXB0aW9uIHJlc29sdmVkSGFuZGxlcnNEZXNjID0gZ2V0UmVzb2x2ZWRIYW5kbGVyc0Rlc2NyaXB0aW9uKHBvcnRJbmZvKTsKLSAgICAgICAgaWYgKHJlc29sdmVkSGFuZGxlcnNEZXNjICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNhY2hlZEhhbmRsZXJSb2xlcyA9IHJlc29sdmVkSGFuZGxlcnNEZXNjLmdldFJvbGVzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNhY2hlZEhhbmRsZXJSb2xlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxIYW5kbGVyPiBnZXRIYW5kbGVyQ2hhaW4oUG9ydEluZm8gcG9ydEluZm8pIHsKLSAgICAgICAgTGlzdDxDbGFzcz4gaGFuZGxlckNsYXNzZXMgPSBnZXRIYW5kbGVyQ2xhc3Nlcyhwb3J0SW5mbyk7Ci0KLSAgICAgICAgaWYgKGhhbmRsZXJDbGFzc2VzLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEFycmF5TGlzdDxIYW5kbGVyPigpOwotICAgICAgICB9Ci0KLSAgICAgICAgQXJyYXlMaXN0PEhhbmRsZXI+IGhhbmRsZXJzID0gbmV3IEFycmF5TGlzdDxIYW5kbGVyPigpOwotICAgICAgICAvLyBDcmVhdGUgdGVtcG9yYXJ5IE1lc3NhZ2VDb250ZXh0IHRvIHBhc3MgaW5mb3JtYXRpb24gdG8gSGFuZGxlckxpZmVjeWNsZU1hbmFnZXIKLSAgICAgICAgTWVzc2FnZUNvbnRleHQgY3R4ID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIGN0eC5zZXRFbmRwb2ludERlc2NyaXB0aW9uKHNlcnZpY2VEZXNjLmdldEVuZHBvaW50RGVzY3JpcHRpb24ocG9ydEluZm8uZ2V0UG9ydE5hbWUoKSkpOwotCi0gICAgICAgIEhhbmRsZXJMaWZlY3ljbGVNYW5hZ2VyIGhsbSA9IGNyZWF0ZUhhbmRsZXJsaWZlY3ljbGVNYW5hZ2VyKCk7Ci0KLSAgICAgICAgZm9yIChJdGVyYXRvcjxDbGFzcz4gaXRlcmF0b3IgPSBoYW5kbGVyQ2xhc3Nlcy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBDbGFzcyBhQ2xhc3MgPSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICAvLyAgaW5zdGFudGlhdGUgcG9ydEhhbmRsZXIgY2xhc3MgCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGhhbmRsZXJzLmFkZChobG0uY3JlYXRlSGFuZGxlckluc3RhbmNlKGN0eCwgYUNsYXNzKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIFRPRE86IHNob3VsZCB3ZSBqdXN0IGlnbm9yZSB0aGlzIHByb2JsZW0/Ci0gICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkICYmIGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJTdWNjZXNzZnVsbHkgaW5zdGFudGlhdGVkIHRoZSBjbGFzczogIiArIGFDbGFzcyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaGFuZGxlcnM7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRSb2xlcyhQb3J0SW5mbyBwb3J0SW5mbykgewotICAgICAgICBMaXN0PFN0cmluZz4gaGFuZGxlclJvbGVzID0gZ2V0SGFuZGxlclJvbGVzKHBvcnRJbmZvKTsKLSAgICAgICAgcmV0dXJuIGhhbmRsZXJSb2xlczsKLSAgICB9Ci0gICAgLyoKLSAgICAgICogVGhlIGxpc3Qgb2YgaGFuZGxlcnMgKHJhdGhlciwgbGlzdCBvZiBjbGFzcyBuYW1lcykgaXMgYWxyZWFkeQotICAgICAgKiBhdmFpbGFibGUgcGVyIHBvcnQuICBQb3J0cyBhcmUgc3RvcmVkIHVuZGVyIHRoZSBTZXJ2aWNlRGVsZWdhdGUKLSAgICAgICogYXMgUG9ydERhdGEgb2JqZWN0cy4KLSAgICAgICoKLQkgKiBUaGUgcmVzb2x2ZUhhbmRsZXJzIG1ldGhvZCBpcyByZXNwb25zaWJsZSBmb3IgaW5zdGFudGlhdGluZyBlYWNoIEhhbmRsZXIsCi0JICogcnVubmluZyB0aGUgYW5ub3RhdGVkIFBvc3RDb25zdHJ1Y3QgbWV0aG9kLCByZXNvbHZpbmcgdGhlIGxpc3QsCi0JICogYW5kIHJldHVybmluZyBpdC4gIFdlIGRvIG5vdCBzb3J0IGhlcmUuCi0gICAgICAqLwotICAgIC8qKgotICAgICAqIFJlc29sdmUgdGhlIGhhbmRsZXJzIGFuZCByb2xlcyBmb3IgdGhlIGdpdmVuIHBvcnQuICBUaGlzIHdpbGwgcHJvY2VzcyB0aGUgaGFuZGxlciBjb25maWd1cmF0aW9uCi0gICAgICogaW5mb3JtYXRpb24sIHdoaWNoIGNhbiBiZSBzcGVjaWZpZWQgZWl0aGVyIGluIGEgZmlsZSBvbiBhIEhhbmRsZXJDaGFpbiBhbm5vdGFpdG9uIG9yIHZpYSBhCi0gICAgICogZGVwbG95bWVudCBkZXNjcmlwdG9yLiAgVGhlIGhhbmRsZXIgY2xhc3NlcyBhbmQgdGhlIFNPQVAgcm9sZXMgcGxheWVkIHdpbGwgYmUgcmVzb2x2ZWQgYW5kCi0gICAgICogcmV0dXJuZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIHBvcnRpbmZvICBJbmZvcm1hdGlvbiBkZXNjcmliaW5nIHRoZSBwb3J0IGZvciB3aGljaCB0aGUgaGFuZGxlcnMgYW5kIHJvbGVzIGFyZSB0byBiZQotICAgICAqICAgICByZXNvbHZlZAotICAgICAqIEBwYXJhbSBoYW5kbGVyUm9sZXMgIE9VVFBVVCBQQVJBTUVURVIhICBUaGUgTGlzdCB0aGF0IGlzIHBhc3NlZCBpbiB3aWxsIGJlIHVwZGF0ZWQgd2l0aCB0aGUKLSAgICAgKiAgICAgcm9sZXMgcmVsZXZhbnQgdG8gdGhlIHNwZWNmaWVkIHBvcnQuCi0gICAgICogQHJldHVybiBMaXN0IG9mIGhhbmRsZXIgY2xhc3NlcyByZWxldmFudCB0byB0aGUgc3BlY2lmaWVkIHBvcnQuCi0gICAgICogQHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSBBcnJheUxpc3Q8Q2xhc3M+IHJlc29sdmVIYW5kbGVycyhQb3J0SW5mbyBwb3J0aW5mbywgTGlzdDxTdHJpbmc+IGhhbmRsZXJSb2xlcykgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICAvKgotICAgICAgICAgICAgQSBzYW1wbGUgWE1MIGZpbGUgZm9yIHRoZSBoYW5kbGVyLWNoYWluczoKLSAgICAgICAgICAgIAotICAgICAgICAgICAgPGp3czpoYW5kbGVyLWNoYWlucyB4bWxuczpqd3M9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSI+Ci0gICAgICAgICAgICAgICAgPGp3czpoYW5kbGVyLWNoYWluPgotICAgICAgICAgICAgICAgICAgICA8andzOnByb3RvY29sLWJpbmRpbmdzPiMjWE1MX0hUVFA8L2p3czpwcm90b2NvbC1iaW5kaW5ncz4KLSAgICAgICAgICAgICAgICAgICAgPGp3czpoYW5kbGVyPgotICAgICAgICAgICAgICAgICAgICAgICAgPGp3czpoYW5kbGVyLW5hbWU+TXlIYW5kbGVyPC9qd3M6aGFuZGxlci1uYW1lPgotICAgICAgICAgICAgICAgICAgICAgICAgPGp3czpoYW5kbGVyLWNsYXNzPm9yZy5hcGFjaGUuYXhpczIuamF4d3MuTXlIYW5kbGVyPC9qd3M6aGFuZGxlci1jbGFzcz4KLSAgICAgICAgICAgICAgICAgICAgPC9qd3M6aGFuZGxlcj4KLSAgICAgICAgICAgICAgICA8L2p3czpoYW5kbGVyLWNoYWluPgotICAgICAgICAgICAgICAgIDxqd3M6aGFuZGxlci1jaGFpbj4KLSAgICAgICAgICAgICAgICAgICAgPGp3czpwb3J0LW5hbWUtcGF0dGVybj5qd3M6Rm9vKjwvandzOnBvcnQtbmFtZS1wYXR0ZXJuPgotICAgICAgICAgICAgICAgICAgICA8andzOmhhbmRsZXI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8andzOmhhbmRsZXItbmFtZT5NeUhhbmRsZXI8L2p3czpoYW5kbGVyLW5hbWU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8andzOmhhbmRsZXItY2xhc3M+b3JnLmFwYWNoZS5heGlzMi5qYXh3cy5NeUhhbmRsZXI8L2p3czpoYW5kbGVyLWNsYXNzPgotICAgICAgICAgICAgICAgICAgICAgICAgPGp3czpzb2FwLXJvbGU+aHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvTXlSb2xlPC9qd3M6c29hcC1yb2xlPgotICAgICAgICAgICAgICAgICAgICA8L2p3czpoYW5kbGVyPgotICAgICAgICAgICAgICAgIDwvandzOmhhbmRsZXItY2hhaW4+Ci0gICAgICAgICAgICAgICAgPGp3czpoYW5kbGVyLWNoYWluPgotICAgICAgICAgICAgICAgICAgICA8andzOnNlcnZpY2UtbmFtZS1wYXR0ZXJuPmp3czpCYXI8L2p3czpzZXJ2aWNlLW5hbWUtcGF0dGVybj4KLSAgICAgICAgICAgICAgICAgICAgPGp3czpoYW5kbGVyPgotICAgICAgICAgICAgICAgICAgICAgICAgPGp3czpoYW5kbGVyLW5hbWU+TXlIYW5kbGVyPC9qd3M6aGFuZGxlci1uYW1lPgotICAgICAgICAgICAgICAgICAgICAgICAgPGp3czpoYW5kbGVyLWNsYXNzPm9yZy5hcGFjaGUuYXhpczIuamF4d3MuTXlIYW5kbGVyPC9qd3M6aGFuZGxlci1jbGFzcz4KLSAgICAgICAgICAgICAgICAgICAgPC9qd3M6aGFuZGxlcj4KLSAgICAgICAgICAgICAgICA8L2p3czpoYW5kbGVyLWNoYWluPgotICAgICAgICAgICAgPC9qd3M6aGFuZGxlci1jaGFpbnM+Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIENvdXBsZSBvZiB0aGluZ3MgSSdtIG5vdCBzdXJlIGFib3V0Li4uCi0gICAgICAgICAgICAxKSAgaWYgdGhlIHByb3RvY29sLWJpbmRpbmcsIHBvcnQtbmFtZS1wYXR0ZXJuLCBhbmQgc2VydmljZS1uYW1lLXBhdHRlcm4gYWxsCi0gICAgICAgICAgICAgICAgbWF0Y2ggdGhlIFBvcnRJbmZvIG9iamVjdCwgZG9lcyBNeUhhbmRsZXIgZ2V0IGFkZGVkIHRocmVlIHRpbWVzPyAgUHJvYmFibHkgd291bGQgZ2V0IGFkZGVkIDMgdGltZXMuCi0gICAgICAgICAgICAyKSAgSSBhc3N1bWUgdGhlIGFzdGVyaXNrICIqIiBpcyBhIHdpbGRjYXJkLiAgQ2FuIHRoZSBhc3RlcmlzayBvbmx5IG9jY3VyIG9uIHRoZSBsb2NhbCBwYXJ0IG9mIHRoZSBxbmFtZT8KLSAgICAgICAgICAgIDMpICBDYW4gdGhlcmUgYmUgbW9yZSB0aGFuIG9uZSBzZXJ2aWNlLW5hbWUtcGF0dGVybiBvciBwb3J0LW5hbWUtcGF0dGVybiwganVzdCBsaWtlIGZvciBwcm90b2NvbC1iaW5kaW5ncz8KLSAgICAgICAgICAgIDQpICBIb3cgbWFueSBwcm90b2NvbC1iaW5kaW5ncyBhcmUgdGhlcmU/ICAjI1hNTF9IVFRQICMjU09BUDExX0hUVFAgIyNTT0FQMTJfSFRUUCAjI1NPQVAxMV9IVFRQX01UT00gIyNTT0FQMTJfSFRUUF9NVE9NCi0gICAgICAgICAgICAgICAgVGhleSBhcmUgc2VwYXJhdGVkIGJ5IHNwYWNlcwotICAgICAgICAgKi8KLQotICAgICAgICAvLyBvdXIgaW1wbGVtZW50YXRpb24gYWxyZWFkeSBoYXMgYSByZWZlcmVuY2UgdG8gdGhlIEVuZHBvaW50RGVzY3JpcHRpb24sCi0gICAgICAgIC8vIHdoaWNoIGlzIHdoZXJlIG9uZSBtaWdodCBnZXQgdGhlIHBvcnRpbmZvIG9iamVjdC4gIFdlIHN0aWxsIGhhdmUgdGhlIAotICAgICAgICAvLyBwYXNzZWQtaW4gdmFyaWFibGUsIGhvd2V2ZXIsIGR1ZSB0byB0aGUgc3BlYwotCi0gICAgICAgIEFycmF5TGlzdDxDbGFzcz4gaGFuZGxlcnMgPSBuZXcgQXJyYXlMaXN0PENsYXNzPigpOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFRPRE86IGRvIGEgYmV0dGVyIGpvYiBjaGVja2luZyB0aGF0IHRoZSByZXR1cm4gdmFsdWUgbWF0Y2hlcyB1cAotICAgICAgICAgKiB3aXRoIHRoZSBQb3J0SW5mbyBvYmplY3QgYmVmb3JlIHdlIGFkZCBpdCB0byB0aGUgY2hhaW4uCi0gICAgICAgICAqLwotCi0gICAgICAgIC8vIFRoZSBIYW5kbGVyQ2hhaW4gYW5ub3RhdGlvbiBjYW4gYmUgc3BlY2lmaWVkIG9uOgotICAgICAgICAvLyAtIGEgc2VydmljZSBpbXBsZW1lbnRhdGlvbiAocGVyIEpTUi0xODEpIHdoaWNoIGlzIG9uIHRoZSBzZXJ2aWNlLXByb3ZpZGVyIHNpZGUKLSAgICAgICAgLy8gLSBhbiBTRUkgKHBlciBKU1ItMTgxKSwgd2hpY2ggY2FuIGJlIG9uIGJvdGggdGhlIHNlcnZpY2UtcHJvdmlkZXIgYW5kIAotICAgICAgICAvLyAgIHNlcnZpY2UtcmVxdWVzdGVyIHNpZGVzCi0gICAgICAgIC8vIC0gYSBnZW5lcmF0ZWQgU2VydmljZSAocGVyIEpTUi0yMjQpLCB3aGljaCBpcyBvbiB0aGUgc2VydmljZS1yZXF1ZXN0ZXIgc2lkZQotICAgICAgICAvLwotICAgICAgICAvLyBUaGUgb3JkZXIgb2YgcHJlY2VkZW5jZSBoZXJlIGlzIGEgYml0IGNvdW50ZXIgaW50dWl0aXZlIGlmIHRoZSBIYW5kbGVyQ2hhaW4gYW5ub3RhdGlvbgotICAgICAgICAvLyBpcyBwcmVzZW50IG9uIG1vcmUgdGhhbiBvbmUgY2xhc3MuICAKLSAgICAgICAgLy8gLSBGb3IgdGhlIHNlcnZpY2UtcHJvdmlkZXIsIEpTUi0xODEgW3AuIDI1LCBTZWN0aW9uIDQuNi4xXQotICAgICAgICAvLyAgIHN0YXRlcyB0aGF0IHRoZSBzZXJ2aWNlIGltcGxlbWVudGF0aW9uJ3MgSGFuZGxlckNoYWluIHRha2VzIGlzIHVzZWQgaWYgaXQgaXMgcHJlc2VudAotICAgICAgICAvLyAgIG9uIGJvdGggdGhlIGltcGxlbWVudGF0aW9uIGFuZCB0aGUgU0VJLgotICAgICAgICAvLyAtIEZvbGxvd2luZyB0aGF0IHNhbWUgcGF0dGVybiwgd2UgY29uY2x1ZGUgdGhhdCBhIGdlbmVyYXRlZCBzZXJ2aWNlIEhhbmRsZXJDaGFpbiBzaG91bGQKLSAgICAgICAgLy8gICB0YWtlIHByZWNlZGVuY2UgaWYgdGhlIGFubm90YXRpb24gaXMgb24gYm90aCB0aGUgU2VydmljZSBhbmQgdGhlIFNFSS4KLSAgICAgICAgLy8KLSAgICAgICAgLy8gVGhlIHJlYXNvbmluZyBmb3IgdGhpcyBpcyAocHJvYmFibHkpIHRoYXQgdGhlIFNFSSBjYW4gYmUgdXNlZCBieSBtdWx0aXBsZSBlbmRwb2ludHMgCi0gICAgICAgIC8vIGFuZCAvIG9yIG11bHRpcGxlIFNlcnZpY2UgcmVxdWVzdGVycywgc28gdGhlIGVuZHBvaW50IGltcGxlbWVudGF0aW9uIGFuZCB0aGUgU2VydmljZQotICAgICAgICAvLyBzaG91bGQgaGF2ZSB0aGUgZmluYWwgc2F5IGluIHdoYXQgaGFuZGxlcnMgYXJlIHJ1biwgcmF0aGVyIHRoYW4gdGhlIFNFSS4KLSAgICAgICAgLy8KLSAgICAgICAgLy8gQWRkaW5nIERlcGxveW1lbnQgRGVzY3JpcHRvcnMgY29tcGxpY2F0ZXMgdGhpcyBmdXJ0aGVyLiAgQSBERCBzaG91bGQgaGF2ZSB0aGUgYWJzb2x1dGUgCi0gICAgICAgIC8vIGZpbmFsIHNheSAoc3VjaCBhcyBhIEpTUi0xMDkgY2xpZW50IEREKS4gIEdpdmVuIHRoYXQsIG9uIGEgc2VydmljZS1yZXF1ZXN0ZXIgaWYgdGhlCi0gICAgICAgIC8vIFNlcnZpY2UgaGFzIGEgSGFuZGxlckNoYWluIGFuZCB0aGUgU0VJIGhhcyBhIEhhbmRsZXJDaGFpbiBhbmQgdGhlIEREIHNwZWNpZmllcyBhIAotICAgICAgICAvLyBIYW5kbGVyQ2hhaW4gZm9yIGEgcG9ydCwgdGhlbiB0aGUgREQgc2hvdWxkIHdpbi4gIFNpbmNlIEREcyBhcmUgaW1wbGVudGVkIGFzIGluZm9ybWF0aW9uCi0gICAgICAgIC8vIGluIGEgc3BhcnNlIGNvbXBvc2l0ZSwgdGhlbiB0aGF0IG1lYW5zIHRoZSBzcGFyc2UgY29tcG9zaXRlIHdpbnMuCi0gICAgICAgIAotICAgICAgICAvLyBHZXQgdGhlIEhhbmRsZXJDaGFpbnMgc3BlY2lmaWVkIG9uIHRoZSBFbmRwb2ludCAoc2VydmljZS1wcm92aWRlcikgb3Igb24gdGhlIFNlcnZpY2UKLSAgICAgICAgLy8gKHNlcnZpY2UtcmVxdWVzdGVyKS4KLSAgICAgICAgaGFuZGxlckNoYWluc1R5cGUgPSBzZXJ2aWNlRGVzYy5nZXRIYW5kbGVyQ2hhaW4oc2VydmljZURlbGVnYXRlS2V5KTsgIAotCi0gICAgICAgIC8vIEhhbmRsZXJDaGFpbnMgYXBwbHkgdG8gc3BlY2lmaWMgUG9ydCBDb21wb21lbnRzIChzZXJ2aWNlLXByb3ZpZGVyKSBvciBQb3J0cyAoCi0gICAgICAgIC8vIChzZXJ2aWNlLXJlcXVlc3RlcnMpIHNvIGZpbmQgdGhlIGFwcHJvcHJpYXRlIG9uZS4KLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlZCA9IG51bGw7Ci0gICAgICAgIGlmKHBvcnRpbmZvICE9bnVsbCl7Ci0gICAgICAgICAgICAgZWQgPSBzZXJ2aWNlRGVzYy5nZXRFbmRwb2ludERlc2NyaXB0aW9uKHBvcnRpbmZvLmdldFBvcnROYW1lKCkpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBHZXQgdGhlIEhhbmRsZXJDaGFpbiBpbmZvcm1hdGlvbiwgaWYgYW55LCBvZmYgdGhlIFNFSSAoc2VydmljZS1wcm92aWRlciBvciAKLSAgICAgICAgLy8gc2VydmljZS1yZXF1c3RlcikgYW5kIGNoZWNrIGZvciBhbnkgREQgb3ZlcnJpZGVzLgotICAgICAgICBpZiAoZWQgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gSWYgdGhlcmUgd2FzIG5vIGhhbmRsZXIgY2hhaW5zIGluZm9ybWF0aW9uIHNwZWNpZmVkIG9uIHRoZSBlbmRwb2ludCAoc2VydmljZS0KLSAgICAgICAgICAgIC8vIHByb3ZpZGVyKSBvciB0aGUgU2VydmljZSAoc2VydmljZS1yZXF1ZXN0ZXIpCi0gICAgICAgICAgICAvLyAtLSBPUiAtLSAKLSAgICAgICAgICAgIC8vIElmIHRoZSBoYW5kbGVyIGNoYWlucyBhc3NvY2lhdGVkIHdpdGggYSBwYXJ0aWN1bGFyIGluc3RhbmNlIG9mIGEgc2VydmljZSBkZWxlZ2F0ZQotICAgICAgICAgICAgLy8gRE9FUyBOT1QgbWF0Y2ggdGhlIGhhbmRsZXIgY2hhaW5zIGFjcm9zcyBhbGwgc2VydmljZSBkZWxlZ2F0ZXMsIHRoZW4gdGhlcmUgd2FzCi0gICAgICAgICAgICAvLyBzcGFyc2UgY29tcG9zaXRlIGluZm9ybWF0aW9uIHNwZWNpZmllZCBmb3IgdGhpcyBzZXJ2aWNlIGRlbGVnYXRlLiAgU3BhcnNlIGNvbXBvc2l0ZQotICAgICAgICAgICAgLy8gaW5mb3JtYXRpb24gaXMgaG93IERlcGxveW1lbnQgRGVzY3JpcHRvciBpbmZvcm1hdGlvbiBpcyBzcGVjaWZpZWQsIGFuZCB0aGF0IAotICAgICAgICAgICAgLy8gb3ZlcnJpZGVzIHRoZSBhbm5vdGF0aW9ucyBhcyBkZXNjcmliZWQgaW4gdGhlIGxvbmctd2luZGVkIGNvbW1lbnQgYWJvdmUuCi0gICAgICAgICAgICAvLyAtLSBUSEVOIC0tCi0gICAgICAgICAgICAvLyBVc2UgdGhpcyBoYW5kbGVyIGNoYWlucyBpbmZvcm1hdGlvbgotICAgICAgICAgICAgSGFuZGxlckNoYWluc1R5cGUgaGN0X2luY2x1ZGluZ0NvbXBvc2l0ZSA9IGVkLmdldEhhbmRsZXJDaGFpbihzZXJ2aWNlRGVsZWdhdGVLZXkpOwotICAgICAgICAgICAgSGFuZGxlckNoYWluc1R5cGUgaGN0X25vQ29tcG9zaXRlID0gZWQuZ2V0SGFuZGxlckNoYWluKCk7Ci0gICAgICAgICAgICBpZiAoaGFuZGxlckNoYWluc1R5cGUgPT0gbnVsbCB8fCAoaGN0X2luY2x1ZGluZ0NvbXBvc2l0ZSAhPSBoY3Rfbm9Db21wb3NpdGUpKSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlckNoYWluc1R5cGUgPSBoY3RfaW5jbHVkaW5nQ29tcG9zaXRlOwotICAgICAgICAgICAgfSAKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFRoZXJlIGlzIG5vIEVuZHBvaW50RGVzY3JpcHRpb24gdGhhdCBtYXRjaGVzIHRoZSBwb3J0SW5mbyBzcGVjaWZpZWQgc28gCi0gICAgICAgICAgICAvLyByZXR1cm4gdGhlIGVtcHR5IGxpc3Qgb2YgaGFuZGxlcnMgc2luY2UgdGhlcmUgYXJlIG5vIHBvcnRzIHRoYXQgbWF0Y2gKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiVGhlIFBvcnRJbmZvIG9iamVjdCBkaWQgbm90IG1hdGNoIGFueSBwb3J0czsgcmV0dXJuaW5nIGFuIGVtcHR5IGxpc3Qgb2YgaGFuZGxlcnMuIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiAgUG9ydEluZm8gUU5hbWU6ICIgKyBwb3J0aW5mby5nZXRQb3J0TmFtZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBoYW5kbGVyczsKLSAgICAgICAgfQotCi0gICAgICAgIEl0ZXJhdG9yIGl0ID0gaGFuZGxlckNoYWluc1R5cGUgPT0gbnVsbCA/IG51bGwgOiBoYW5kbGVyQ2hhaW5zVHlwZS5nZXRIYW5kbGVyQ2hhaW4oKS5pdGVyYXRvcigpOwotCi0gICAgICAgIHdoaWxlICgoaXQgIT0gbnVsbCkgJiYgKGl0Lmhhc05leHQoKSkpIHsKLSAgICAgICAgICAgIEhhbmRsZXJDaGFpblR5cGUgaGFuZGxlckNoYWluVHlwZSA9ICgoSGFuZGxlckNoYWluVHlwZSlpdC5uZXh0KCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBpZiAhbWF0Y2gsIGNvbnRpbnVlICh0byBuZXh0IGNoYWluKQotICAgICAgICAgICAgaWYgKCEoY2hhaW5SZXNvbHZlc1RvUG9ydChoYW5kbGVyQ2hhaW5UeXBlLCBwb3J0aW5mbykpKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBMaXN0PEhhbmRsZXJUeXBlPiBoYW5kbGVyVHlwZUxpc3QgPSBoYW5kbGVyQ2hhaW5UeXBlLmdldEhhbmRsZXIoKTsKLSAgICAgICAgICAgIEl0ZXJhdG9yIGh0ID0gaGFuZGxlclR5cGVMaXN0Lml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB3aGlsZSAoaHQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgSGFuZGxlclR5cGUgaGFuZGxlclR5cGUgPSAoSGFuZGxlclR5cGUpIGh0Lm5leHQoKTsKLSAgICAgICAgICAgICAgICAvLyBUT0RPIG11c3QgZG8gYmV0dGVyIGpvYiBjb21wYXJpbmcgdGhlIGhhbmRsZXJUeXBlIHdpdGggdGhlIFBvcnRJbmZvIHBhcmFtCi0gICAgICAgICAgICAgICAgLy8gdG8gc2VlIGlmIHRoZSBjdXJyZW50IGl0ZXJhdG9yIGhhbmRsZXIgaXMgaW50ZW5kZWQgZm9yIHRoaXMgc2VydmljZS4KLSAgICAgICAgICAgICAgICAvLyBUT0RPIHJldmlldzogbmVlZCB0byBjaGVjayBmb3IgbnVsbCBnZXRIYW5kbGVyQ2xhc3MoKSByZXR1cm4/Ci0gICAgICAgICAgICAgICAgLy8gb3Igd2lsbCBzY2hlbWEgbm90IGFsbG93IGl0PwotICAgICAgICAgICAgICAgIFN0cmluZyBwb3J0SGFuZGxlciA9IGhhbmRsZXJUeXBlLmdldEhhbmRsZXJDbGFzcygpLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgQ2xhc3MgYUNsYXNzOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGFDbGFzcyA9IGxvYWRDbGFzcyhwb3J0SGFuZGxlcik7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogc2hvdWxkIHdlIGp1c3QgaWdub3JlIHRoaXMgcHJvYmxlbT8KLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyA5LjIuMS4yIHNvcnQgdGhlbSBieSBMb2dpY2FsLCB0aGVuIFNPQVAKLSAgICAgICAgICAgICAgICBpZiAoTG9naWNhbEhhbmRsZXIuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShhQ2xhc3MpKQotICAgICAgICAgICAgICAgICAgICBoYW5kbGVycy5hZGQoYUNsYXNzKTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmIChTT0FQSGFuZGxlci5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGFDbGFzcykpCi0gICAgICAgICAgICAgICAgICAgIC8vIGluc3RhbmNlb2YgUHJvdG9jb2xIYW5kbGVyCi0gICAgICAgICAgICAgICAgICAgIGhhbmRsZXJzLmFkZChhQ2xhc3MpOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKEhhbmRsZXIuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShhQ2xhc3MpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0TWVzc2FnZSgiaGFuZGxlckNoYWluRXJyMSIsIGFDbGFzcy5nZXROYW1lKCkpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldE1lc3NhZ2UoImhhbmRsZXJDaGFpbkVycjIiLCBhQ2xhc3MuZ2V0TmFtZSgpKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIElmIGEgcm9sZSB3YXMgc3BlY2lmaWVkLCBhZGQgaXQgdG8gdGhlIHJvbGVzIHBsYXllZAotICAgICAgICAgICAgICAgIGlmIChoYW5kbGVyUm9sZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBMaXN0PG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24ueG1sLmhhbmRsZXIuU3RyaW5nPiBzb2FwUm9sZXNMaXN0ID0gCi0gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyVHlwZS5nZXRTb2FwUm9sZSgpOwotICAgICAgICAgICAgICAgICAgICBJdGVyYXRvcjxvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLnhtbC5oYW5kbGVyLlN0cmluZz4gCi0gICAgICAgICAgICAgICAgICAgICAgICBzb2FwUm9sZXNJdGVyYXRvciA9IHNvYXBSb2xlc0xpc3QuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHNvYXBSb2xlc0l0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi54bWwuaGFuZGxlci5TdHJpbmcgc29hcFJvbGVFbGVtZW50ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2FwUm9sZXNJdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYWRkU29hcFJvbGUgPSBzb2FwUm9sZUVsZW1lbnQuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXJSb2xlcy5hZGQoYWRkU29hcFJvbGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJBZGRpbmcgc29hcCByb2xlICIgKyBhZGRTb2FwUm9sZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gaGFuZGxlcnM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBIYW5kbGVyTGlmZWN5Y2xlTWFuYWdlciBjcmVhdGVIYW5kbGVybGlmZWN5Y2xlTWFuYWdlcigpIHsKLSAgICAgICAgSGFuZGxlckxpZmVjeWNsZU1hbmFnZXJGYWN0b3J5IGVsbWYgPSAoSGFuZGxlckxpZmVjeWNsZU1hbmFnZXJGYWN0b3J5KUZhY3RvcnlSZWdpc3RyeQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEhhbmRsZXJMaWZlY3ljbGVNYW5hZ2VyRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgIHJldHVybiBlbG1mLmNyZWF0ZUhhbmRsZXJMaWZlY3ljbGVNYW5hZ2VyKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvaGFuZGxlci9IYW5kbGVyVXRpbHMuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2hhbmRsZXIvSGFuZGxlclV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5MTMzMGEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvaGFuZGxlci9IYW5kbGVyVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmhhbmRsZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5Sb2xlUGxheWVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUDExQ29uc3RhbnRzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUDEyQ29uc3RhbnRzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUENvbnN0YW50czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBIZWFkZXJCbG9jazsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmkxOG4uTWVzc2FnZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRW5kcG9pbnREZXNjcmlwdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLkxvZ2dpbmdDb250cm9sOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLkhhbmRsZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLnNvYXAuU09BUEhhbmRsZXI7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotLyoNCi0gKiBVdGlsaXR5IGNsYXNzIHRvIHBlcmZvcm0gc3RhdGljIHV0aWxpdHkgdHlwZSBvZiBvcGVyYXRpb25zIG9uIEhhbmRsZXJzLg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBIYW5kbGVyVXRpbHMgew0KLSAgICBwcml2YXRlIHN0YXRpYyBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coSGFuZGxlclV0aWxzLmNsYXNzKTsNCi0NCi0gICAgLyoqDQotICAgICAqIHJlZ2lzdGVySGFuZGxlckhlYWRlcnMgd2lsbCBpbnZva2UgZ2V0SGVhZGVycyBvbiBTT0FQSGFuZGxlcnMgYW5kIHJldHVybiBhIExpc3Qgb2YgaGVhZGVycw0KLSAgICAgKiB0aGF0IGFyZSBVbmRlcnN0b29kIGJ5IHRoZSBoYW5kbGVycy4NCi0gICAgICogQHBhcmFtIG1zZ0NvbnRleHQNCi0gICAgICogQHBhcmFtIGhhbmRsZXJzDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIExpc3Q8UU5hbWU+IHJlZ2lzdGVyU09BUEhhbmRsZXJIZWFkZXJzKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQsIExpc3Q8SGFuZGxlcj4gaGFuZGxlcnMpew0KLSAgICAJTGlzdDxRTmFtZT4gdW5kZXJzdG9vZCA9IG5ldyBBcnJheUxpc3Q8UU5hbWU+KCk7DQotICAgICAgICBpZihtc2dDb250ZXh0ID09IG51bGwpew0KLSAgICAgICAgICAgIHJldHVybiB1bmRlcnN0b29kOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZm9yKEhhbmRsZXIgaGFuZGxlcjpoYW5kbGVycyl7DQotICAgICAgICAgICAgaWYoaGFuZGxlciBpbnN0YW5jZW9mIFNPQVBIYW5kbGVyKXsNCi0gICAgICAgICAgICAgICAgU09BUEhhbmRsZXIgc29hcEhhbmRsZXIgPSAoU09BUEhhbmRsZXIpaGFuZGxlcjsNCi0gICAgICAgICAgICAgICAgLy9JbnZva2luZyBnZXRIZWFkZXJzLg0KLSAgICAgICAgICAgICAgICBpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSl7DQotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkludm9raW5nIGdldEhlYWRlcigpIG9uIFNPQVBIYW5kbGVyIik7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgU2V0PFFOYW1lPiBoZWFkZXJzID0gc29hcEhhbmRsZXIuZ2V0SGVhZGVycygpOw0KLSAgICAgICAgICAgICAgICBpZihoZWFkZXJzIT1udWxsKXsNCi0gICAgICAgICAgICAgICAgICAgIGZvcihRTmFtZSBoZWFkZXI6aGVhZGVycyl7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIXVuZGVyc3Rvb2QuY29udGFpbnMoaGVhZGVyKSl7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKXsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQWRkaW5nIEhlYWRlciBRTmFtZSIgKyBoZWFkZXIgKyAiIHRvIHVkZXJzdG9vZEhlYWRlclFOYW1lIExpc3QiKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0FkZGluZyB0aGlzIHRvIHVuZGVyc3Rvb2QgaGVhZGVyIGxpc3QuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVyc3Rvb2QuYWRkKGhlYWRlcik7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHVuZGVyc3Rvb2Q7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIGNoZWNrTXVzdFVuZGVyc3RhbmQgd2lsbCB2YWxpZGF0ZSBoZWFkZXJzIHRoYXQgd2hlcmUgZGVsZWdhdGVkIGJ5IEF4aXMgRW5naW5lDQotICAgICAqIHRvIE1lc3NhZ2VSZWNlaXZlciBmb3IgbXVzdFVuZGVyc3RhbmQgY2hlY2suDQotICAgICAqIA0KLSAgICAgKiBOb3RlIHRoYXQgdGhlcmUgaXMgb3RoZXIgSkFYLVdTIHJlbGF0ZWQgbXVzdFVuZGVyc3RhbmQgY2hlY2tpbmcgb2NjdXJpbmcgZWxzZXdoZXJlOg0KLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGlzcGF0Y2hlcnMuTXVzdFVuZGVyc3RhbmRWYWxpZGF0aW9uRGlzcGF0Y2hlciANCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRpc3BhdGNoZXJzLk11c3RVbmRlcnN0YW5kQ2hlY2tlciANCi0gICAgICogDQotICAgICAqIEBwYXJhbSBtc2dDb250ZXh0IENvbnRhaW5zIHRoZSBTT0FQRW52ZWxvcGUgYW5kIG9wdGlvbmFsbHkgYSBsaXN0IG9mIGhlYWRlcnMgbm90IA0KLSAgICAgKiAgICB1bmRlcnN0b29kIGJ5IHRoZSBBeGlzRW5naW5lDQotICAgICAqIEBwYXJhbSB1bmRlcnN0b29kIEEgbGlzdCBvZiBoZWFkZXIgUU5hbWVzIHVuZGVyc3Rvb2QgYnkgSkFYLVdTLCBmb3IgZXhhbXBsZSB0aG9zZSB1bmRlcnN0b29kDQotICAgICAqICAgYnkgYXNzb2NpYXRlZCBhcHBsaWNhdGlvbiBoYW5kbGVycy4gQ2FuIGJlIG51bGwuDQotICAgICAqIEBwYXJhbSBhZGRpdGlvbmFsUm9sZXMgQW4gaW5zdGFuY2Ugb2YgUm9sZVBsYXllciBmb3IgYW55IGFkZHRpb25hbCByb2xlcyBwbGF5ZWQgYnkgSkFYLVdTDQotICAgICAqICAgZm9yIGV4YW1wbGUsIHJvbGVzIGNvbmZpZ3VyZWQgZm9yIGFzc29jaWF0ZWQgaGFuZGxlcnMuICBDYW4gYmUgbnVsbC4NCi0gICAgICogDQotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0IGlmIGFueSBoZWFkZXJzIG1hcmtlZCBtdXN0VW5kZXJzYW5kIGFyZSBub3QgdW5kZXJzdG9vZC4NCi0gICAgICovDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjaGVja011c3RVbmRlcnN0YW5kKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQsIExpc3Q8UU5hbWU+IHVuZGVyc3Rvb2QsIExpc3Q8U3RyaW5nPiBhZGRpdGlvbmFsUm9sZXMpIHRocm93cyBBeGlzRmF1bHQgew0KLSAgICAgICAgaWYgKG1zZ0NvbnRleHQgPT0gbnVsbCB8fCAhbXNnQ29udGV4dC5pc0hlYWRlclByZXNlbnQoKSkgew0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0gICAgICAgIFNPQVBFbnZlbG9wZSBlbnZlbG9wZSA9IG1zZ0NvbnRleHQuZ2V0RW52ZWxvcGUoKTsNCi0gICAgICAgIGlmIChlbnZlbG9wZS5nZXRIZWFkZXIoKSA9PSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICBpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSl7DQotICAgICAgICAgICAgbG9nLmRlYnVnKCJSZWFkaW5nIFVucHJvY2Vzc2VkSGVhZGVyTmFtZXMgZnJvbSBNZXNzYWdlIENvbnRleHQgcHJvcGVydGllcyIpOw0KLSAgICAgICAgfQ0KLSANCi0gICAgICAgIExpc3Q8UU5hbWU+IHVucHJvY2Vzc2VkID0gKExpc3QpbXNnQ29udGV4dC5nZXRQcm9wZXJ0eShDb25zdGFudHMuVU5QUk9DRVNTRURfSEVBREVSX1FOQU1FUyk7DQotDQotICAgICAgICAvLyBBZGQgdG8gdGhlIHVucHJvY2Vzc2VkIGhlYWRlciBsaXN0IGFueSBoZWFkZXJzIHRoYXQgYXJlIHVucHJvY3NzZWQgYW5kIG11c3RVbmRlcnN0YW5kDQotICAgICAgICAvLyBmb3IgYWRkdGlvbmFsIHJvbGVzLCBmb3IgZXhhbXBsZSB0aG9zZSBwbGF5ZWQgYnkgYXNzb2NpYXRlZCBKQVhXUyBoYW5kbGVycw0KLSAgICAgICAgaWYgKGFkZGl0aW9uYWxSb2xlcyAhPSBudWxsKSB7DQotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQWRkaW5nIGFueSBtdXN0VW5kZXJzdGFuZCBoZWFkZXJzIGJhc2VkIG9uIGFkZGl0b25hbCBTT0FQIHJvbGVzOiAiICsgYWRkaXRpb25hbFJvbGVzKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgSGFuZGxlclJvbGVQbGF5ZXIgaGFuZGxlclJvbGVQbGF5ZXIgPSBuZXcgSGFuZGxlclJvbGVQbGF5ZXIoYWRkaXRpb25hbFJvbGVzKTsNCi0gICAgICAgICAgICBJdGVyYXRvciBoZWFkZXJCbG9ja3MgPSBlbnZlbG9wZS5nZXRIZWFkZXIoKS5nZXRIZWFkZXJzVG9Qcm9jZXNzKGhhbmRsZXJSb2xlUGxheWVyKTsNCi0gICAgICAgICAgICB3aGlsZSAoaGVhZGVyQmxvY2tzLmhhc05leHQoKSkgew0KLSAgICAgICAgICAgICAgICBTT0FQSGVhZGVyQmxvY2sgc2hiID0gKFNPQVBIZWFkZXJCbG9jaykgaGVhZGVyQmxvY2tzLm5leHQoKTsNCi0gICAgICAgICAgICAgICAgaWYgKHVucHJvY2Vzc2VkID09IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgICAgIHVucHJvY2Vzc2VkID0gbmV3IEFycmF5TGlzdDxRTmFtZT4oKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBpZiAoIXNoYi5pc1Byb2Nlc3NlZCgpICYmIHNoYi5nZXRNdXN0VW5kZXJzdGFuZCgpKSB7DQotICAgICAgICAgICAgICAgICAgICB1bnByb2Nlc3NlZC5hZGQoc2hiLmdldFFOYW1lKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJBZGRlZCBoZWFkZXIgdG8gdW5wcm9jZXNzZWQgbGlzdDogIiArIHNoYi5nZXRRTmFtZSgpKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgaWYodW5wcm9jZXNzZWQgPT0gbnVsbCB8fCB1bnByb2Nlc3NlZC5zaXplKCkgPT0gMCl7DQotICAgICAgICAgICAgaWYobG9nLmlzRGVidWdFbmFibGVkKCkpew0KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlVOUFJPQ0VTU0VEX0hFQURFUl9RTkFNRVMgbm90IGZvdW5kLiIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIC8vbGV0cyBnbyB0aHJ1IGVhY2ggaGVhZGVyIG9ubHkgaWYgQEhhbmRsZXJDaGFpbiBpcyBwcmVzZW50DQotICAgICAgICBpZighY2FuVW5kZXJzdGFuZChtc2dDb250ZXh0KSl7DQotICAgICAgICAgICAgUU5hbWVbXSBxTmFtZXMgPSB1bnByb2Nlc3NlZC50b0FycmF5KG5ldyBRTmFtZVswXSk7DQotICAgICAgICAgICAgU3RyaW5nW10gaGVhZGVyTmFtZXMgPSBuZXcgU3RyaW5nW3FOYW1lcy5sZW5ndGhdOw0KLSAgICAgICAgICAgIGZvcihpbnQgaT0wOyBpPHFOYW1lcy5sZW5ndGg7IGkrKyl7DQotICAgICAgICAgICAgICAgIGhlYWRlck5hbWVzW2ldID0ieyIgKyBxTmFtZXNbaV0uZ2V0TmFtZXNwYWNlVVJJKCkrICJ9IiArIHFOYW1lc1tpXS5nZXRMb2NhbFBhcnQoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgUU5hbWUgZmF1bHRRTmFtZSA9IGVudmVsb3BlLmdldFZlcnNpb24oKS5nZXRNdXN0VW5kZXJzdGFuZEZhdWx0Q29kZSgpOw0KLSAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoTWVzc2FnZXMuZ2V0TWVzc2FnZSgibXVzdHVuZGVyc3RhbmRmYWlsZWQyIiwgaGVhZGVyTmFtZXMpLCBmYXVsdFFOYW1lKTsgDQotICAgICAgICB9DQotDQotICAgICAgICBjaGVja1VucHJvY2Vzc2VkKGVudmVsb3BlLCB1bnByb2Nlc3NlZCwgdW5kZXJzdG9vZCwgbXNnQ29udGV4dCk7DQotICAgICAgICAvL3Jlc2V0dGluZyB0aGUgRkFVTFRZX0hFQURFUl9RTkFNRSB0byBudWxsLg0KLSAgICAgICAgbXNnQ29udGV4dC5zZXRQcm9wZXJ0eShDb25zdGFudHMuVU5QUk9DRVNTRURfSEVBREVSX1FOQU1FUywgbnVsbCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja1VucHJvY2Vzc2VkKFNPQVBFbnZlbG9wZSBlbnZlbG9wZSwgTGlzdDxRTmFtZT4gdW5wcm9jZXNzZWQsIExpc3Q8UU5hbWU+IHVuZGVyc3Rvb2QsIE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHRocm93cyBBeGlzRmF1bHR7DQotICAgICAgICBmb3IgKFFOYW1lIGhlYWRlclFOYW1lIDogdW5wcm9jZXNzZWQpIHsgICAgICAgICAgIA0KLSAgICAgICAgICAgIGlmICh1bmRlcnN0b29kICE9IG51bGwgJiYgIXVuZGVyc3Rvb2QuaXNFbXB0eSgpKSB7DQotICAgICAgICAgICAgICAgIGlmICh1bmRlcnN0b29kLmNvbnRhaW5zKGhlYWRlclFOYW1lKSkgew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQgJiYgbG9nLmlzRGVidWdFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIk11c3RVbmRlcnN0YW5kIGhlYWRlciByZWdpc3RlcmVkIGFzIHVuZGVyc3Rvb2Qgb24gQXhpc09wZXJhdGlvbjogIiArIGhlYWRlclFOYW1lKTsNCi0gICAgICAgICAgICAgICAgICAgIH0gICAgDQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZiAoTG9nZ2luZ0NvbnRyb2wuZGVidWdMb2dnaW5nQWxsb3dlZCAmJiBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIk11c3RVbmRlcnN0YW5kIGhlYWRlciBub3QgcHJvY2Vzc2VkIG9yIHJlZ2lzdGVyZWQgYXMgdW5kZXJzdG9vZCAiICsgaGVhZGVyUU5hbWUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAvLyBUaHJvdyBhIE11c3RVbmRlcnN0YW5kIGZhdWx0IGZvciB0aGUgY3VycmVudCBTT0FQIHZlcnNpb24NCi0gICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gZW52ZWxvcGUuZ2V0TmFtZXNwYWNlKCkuZ2V0UHJlZml4KCk7DQotICAgICAgICAgICAgaWYgKCFtc2dDb250ZXh0LmlzU09BUDExKCkpIHsNCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsIHx8ICIiLmVxdWFscyhwcmVmaXgpKSB7DQotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBTT0FQQ29uc3RhbnRzLlNPQVBfREVGQVVMVF9OQU1FU1BBQ0VfUFJFRklYOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIC8vIFRPRE86IHNob3VsZCB3ZSBiZSB1c2luZyBhIHByZWZpeCBvbiB0aGUgZmF1bHRjb2RlPyAgV2hhdCBhYm91dA0KLSAgICAgICAgICAgICAgICAvLyB0aGUgUU5hbWUgb2JqZWN0IENvbnN0YW50cy5GQVVMVF9TT0FQMTJfTVVTVFVOREVSU1RBTkQ/DQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoTWVzc2FnZXMuZ2V0TWVzc2FnZSgibXVzdHVuZGVyc3RhbmRmYWlsZWQiLA0KLSAgICAgICAgICAgICAgICAgICAgcHJlZml4LA0KLSAgICAgICAgICAgICAgICAgICAgaGVhZGVyUU5hbWUudG9TdHJpbmcoKSksDQotICAgICAgICAgICAgICAgICAgICBTT0FQMTJDb25zdGFudHMuRkFVTFRfQ09ERV9NVVNUX1VOREVSU1RBTkQpOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIC8vIFRPRE86IHNob3VsZCB3ZSBiZSB1c2luZyBhIHByZWZpeCBvbiB0aGUgZmF1bHRjb2RlPyAgV2hhdCBhYm91dA0KLSAgICAgICAgICAgICAgICAvLyB0aGUgUU5hbWUgb2JqZWN0IENvbnN0YW50cy5GQVVMVF9NVVNUVU5ERVJTVEFORD8NCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdChNZXNzYWdlcy5nZXRNZXNzYWdlKCJtdXN0dW5kZXJzdGFuZGZhaWxlZCIsDQotICAgICAgICAgICAgICAgICAgICBwcmVmaXgsDQotICAgICAgICAgICAgICAgICAgICBoZWFkZXJRTmFtZS50b1N0cmluZygpKSwNCi0gICAgICAgICAgICAgICAgICAgIFNPQVAxMUNvbnN0YW50cy5GQVVMVF9DT0RFX01VU1RfVU5ERVJTVEFORCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gY2FuVW5kZXJzdGFuZChNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KXsNCi0gICAgICAgIC8vSkFYV1NNZXNzYWdlUmVjZWl2ZXIgd2lsbCBvbmx5IGNvbW1pdCB0byBoYW5kbGluZyBtdXN0IHVuZGVyc3RhbmQgaWYgQEhhbmRsZXJDaGFpbiBhbm5vdGF0aW9uIGlzIHByZXNlbnQgb24gdGhlDQotICAgICAgICAvL0VuZHBvaW50LiBUaGlzIHdpbGwgaW5kaWNhdGUgdG8gQXhpc0VuZ2luZSB0aGF0IEZhdWx0eSBIZWFkZXIgbmFtZXMgYXJlIHVuZGVyc3Rvb2QgaG93ZXZlciB0aGUgbXVzdFVuZGVyc3RhbmQgDQotICAgICAgICAvL0NoZWNrIHdpbGwgYmUgcGVyZm9ybWVkIGluIEhhbmRsZXJVdGlscyBjbGFzcyBhZnRlciBIYW5kbGVycyBhcmUgaW5qZWN0ZWQgaW4gYXBwbGljYXRpb24uDQotICAgICAgICBBeGlzU2VydmljZSBheGlzU3ZjID0gbXNnQ29udGV4dC5nZXRBeGlzU2VydmljZSgpOw0KLSAgICAgICAgaWYgKGF4aXNTdmMuZ2V0UGFyYW1ldGVyKEVuZHBvaW50RGVzY3JpcHRpb24uQVhJU19TRVJWSUNFX1BBUkFNRVRFUikgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIFBhcmFtZXRlciBwYXJhbSA9IGF4aXNTdmMuZ2V0UGFyYW1ldGVyKEVuZHBvaW50RGVzY3JpcHRpb24uQVhJU19TRVJWSUNFX1BBUkFNRVRFUik7DQotICAgICAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlZCA9IChFbmRwb2ludERlc2NyaXB0aW9uKXBhcmFtLmdldFZhbHVlKCk7DQotICAgICAgICAgICAgLy9MZXRzIGNoZWNrIGlmIHRoZXJlIGlzIGEgSGFuZGxlciBpbXBsZW1lbnRhdGlvbiBwcmVzZW50IHVzaW5nIE1ldGFkYXRhIGxheWVyLg0KLSAgICAgICAgICAgIC8vSGFuZGxlckNoYWluIGFubm90YXRpb24gY2FuIGJlIHByZXNlbnQgaW4gU2VydmljZSBFbmRwb2ludCBvciBTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UuDQotICAgICAgICAgICAgLy8gZWQuZ2V0SGFuZGxlckNoYWluKCkgbG9va3MgZm9yIEhhbmRsZXJBbm5vdGF0aW9uIGF0IGJvdGggRW5kcG9pbnQgYW5kIGF0IFNFSS4NCi0gICAgICAgICAgICBpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSl7DQotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ2hlY2sgdG8gc2VlIGlmIGEgamF4d3MgaGFuZGxlciBpcyBjb25maWd1cmVkLiIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZihlZC5nZXRIYW5kbGVyQ2hhaW4oKSE9bnVsbCl7DQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9DQotICAgICAgICBlbHNlew0KLSAgICAgICAgICAgIC8vSWYgd2UgY2Fubm90IGdldCB0byBTZXJ2aWNlRGVzY3JpcHRpb24gdG8gY2hlY2sgZm9yIEhhbmRsZXJDaGFpbiBhbm5vdGF0aW9uIHdlIHdpbGwgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICB9DQotDQotICAgIH0NCi19DQotY2xhc3MgSGFuZGxlclJvbGVQbGF5ZXIgaW1wbGVtZW50cyBSb2xlUGxheWVyIHsNCi0gICAgTGlzdDxTdHJpbmc+IHJvbGVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQotDQotICAgIEhhbmRsZXJSb2xlUGxheWVyKExpc3Q8U3RyaW5nPiBhZGRpdGlvbmFsUm9sZXMpIHsNCi0gICAgICAgIHJvbGVzLmFkZEFsbChhZGRpdGlvbmFsUm9sZXMpOw0KLSAgICB9DQotICAgIHB1YmxpYyBMaXN0IGdldFJvbGVzKCkgew0KLSAgICAgICAgcmV0dXJuIHJvbGVzOw0KLSAgICB9DQotICAgIHB1YmxpYyBib29sZWFuIGlzVWx0aW1hdGVEZXN0aW5hdGlvbigpIHsNCi0gICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgfQ0KLX0NCi0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9oYW5kbGVyL0xvZ2ljYWxNZXNzYWdlQ29udGV4dC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvaGFuZGxlci9Mb2dpY2FsTWVzc2FnZUNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2VhYjZjMy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9oYW5kbGVyL0xvZ2ljYWxNZXNzYWdlQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmhhbmRsZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUuTWVzc2FnZUNvbnRleHQ7Ci0KLWltcG9ydCBqYXZheC54bWwud3MuTG9naWNhbE1lc3NhZ2U7Ci0KLS8qKgotICogVGhlIExvZ2ljYWxNZXNzYWdlQ29udGV4dCBpcyBhIEpBWC1XUyBpbnRlcmZhY2UgdGhhdCBpcyBnaXZlbiB0byBMb2dpY2FsIGhhbmRsZXJzIHRvIHByb3ZpZGUKLSAqIGFjY2VzcyB0byB0aGUgbWVzc2FnZSBhbmQgaXRzIGFzc29jaWF0ZWQgcHJvcGVydGllcy4KLSAqLwotcHVibGljIGNsYXNzIExvZ2ljYWxNZXNzYWdlQ29udGV4dCBleHRlbmRzIEJhc2VNZXNzYWdlQ29udGV4dCBpbXBsZW1lbnRzCi0gICAgICAgIGphdmF4LnhtbC53cy5oYW5kbGVyLkxvZ2ljYWxNZXNzYWdlQ29udGV4dCB7Ci0KLSAgICBwdWJsaWMgTG9naWNhbE1lc3NhZ2VDb250ZXh0KE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDdHgpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZUN0eCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBqYXZheC54bWwud3MuaGFuZGxlci5Mb2dpY2FsTWVzc2FnZUNvbnRleHQjZ2V0TWVzc2FnZSgpCi0gICAgICovCi0gICAgcHVibGljIExvZ2ljYWxNZXNzYWdlIGdldE1lc3NhZ2UoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTG9naWNhbE1lc3NhZ2VJbXBsKG1lc3NhZ2VDdHguZ2V0TUVQQ29udGV4dCgpKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2hhbmRsZXIvTG9naWNhbE1lc3NhZ2VJbXBsLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9oYW5kbGVyL0xvZ2ljYWxNZXNzYWdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2U4NjhkLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2hhbmRsZXIvTG9naWNhbE1lc3NhZ2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmhhbmRsZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLnV0aWwuU3RBWFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5FeGNlcHRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5CbG9jazsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuTWVzc2FnZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZGF0YWJpbmRpbmcuSkFYQkJsb2NrQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZmFjdG9yeS5CbG9ja0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmZhY3RvcnkuSkFYQkJsb2NrRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZmFjdG9yeS5NZXNzYWdlRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZmFjdG9yeS5Tb3VyY2VCbG9ja0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5yZWdpc3RyeS5GYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkNvbnRleHQ7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLk91dHB1dEtleXM7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC53cy5Mb2dpY2FsTWVzc2FnZTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7Ci0KLXB1YmxpYyBjbGFzcyBMb2dpY2FsTWVzc2FnZUltcGwgaW1wbGVtZW50cyBMb2dpY2FsTWVzc2FnZSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coTG9naWNhbE1lc3NhZ2VJbXBsLmNsYXNzKTsKLQotICAgIHByaXZhdGUgTUVQQ29udGV4dCBtZXBDdHg7Ci0KLSAgICBwcm90ZWN0ZWQgTG9naWNhbE1lc3NhZ2VJbXBsKE1FUENvbnRleHQgbSkgewotICAgICAgICBtZXBDdHggPSBtOwotICAgIH0KLSAgICAKLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIGphdmF4LnhtbC53cy5Mb2dpY2FsTWVzc2FnZSNnZXRQYXlsb2FkKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU291cmNlIGdldFBheWxvYWQoKSB7Ci0gICAgICAgIEJsb2NrRmFjdG9yeSBmYWN0b3J5ID0gKFNvdXJjZUJsb2NrRmFjdG9yeSkgRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoU291cmNlQmxvY2tGYWN0b3J5LmNsYXNzKTsKLSAgICAgICAgU291cmNlIHBheWxvYWQgPSAoU291cmNlKSBfZ2V0UGF5bG9hZChudWxsLCBmYWN0b3J5KTsKLSAgICAgICAgcmV0dXJuIHBheWxvYWQ7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBqYXZheC54bWwud3MuTG9naWNhbE1lc3NhZ2UjZ2V0UGF5bG9hZChqYXZheC54bWwuYmluZC5KQVhCQ29udGV4dCkKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldFBheWxvYWQoSkFYQkNvbnRleHQgY29udGV4dCkgewotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiUmV0cmVpdmluZyB0aGUgbWVzc2FnZSBwYXlsb2FkIGFzIGEgU291cmNlIG9iamVjdCIpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBCbG9ja0ZhY3RvcnkgZmFjdG9yeSA9IChKQVhCQmxvY2tGYWN0b3J5KSBGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShKQVhCQmxvY2tGYWN0b3J5LmNsYXNzKTsKLSAgICAgICAgSkFYQkJsb2NrQ29udGV4dCBqYmMgPSBuZXcgSkFYQkJsb2NrQ29udGV4dChjb250ZXh0KTsKLSAgICAgICAgT2JqZWN0IHBheWxvYWQgPSBfZ2V0UGF5bG9hZChqYmMsIGZhY3RvcnkpOwotICAgICAgICByZXR1cm4gcGF5bG9hZDsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBPYmplY3QgX2dldFBheWxvYWQoT2JqZWN0IGNvbnRleHQsIEJsb2NrRmFjdG9yeSBmYWN0b3J5KSB7Ci0gICAgICAgIE9iamVjdCBwYXlsb2FkID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEJsb2NrIGJsb2NrID0gbWVwQ3R4LmdldE1lc3NhZ2VPYmplY3QoKS5nZXRCb2R5QmxvY2soY29udGV4dCwgZmFjdG9yeSk7Ci0gICAgICAgICAgICBpZiAoYmxvY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQSBtZXNzYWdlIHBheWxvYWQgd2FzIGZvdW5kLiIpOwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgT2JqZWN0IGNvbnRlbnQgPSBibG9jay5nZXRCdXNpbmVzc09iamVjdCh0cnVlKTsKLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgLy8gRm9yIG5vdywgd2UgaGF2ZSB0byBjcmVhdGUgYSBuZXcgQmxvY2sgZnJvbSB0aGUgb3JpZ2luYWwgY29udGVudAotICAgICAgICAgICAgICAgLy8gYW5kIHNldCB0aGF0IGJhY2sgb24gdGhlIG1lc3NhZ2UuICBUaGUgQmxvY2sgaXMgbm90IGN1cnJlbnRseQotICAgICAgICAgICAgICAgLy8gYWJsZSB0byBjcmVhdGUgYSBjb3B5IG9mIGl0c2VsZiBqdXN0IHlldC4KLSAgICAgICAgICAgICAgIFBheWxvYWRzIHBheWxvYWRzID0gY3JlYXRlUGF5bG9hZHMoY29udGVudCk7Ci0gICAgICAgICAgICAgICBfc2V0UGF5bG9hZChwYXlsb2Fkcy5DQUNIRV9QQVlMT0FELCBjb250ZXh0LCBmYWN0b3J5KTsKLSAgCi0gICAgICAgICAgICAgICBwYXlsb2FkID0gcGF5bG9hZHMuSEFORExFUl9QQVlMT0FEOyAgICAgICAgICAgICAKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIC8vIElmIHRoZSBibG9jayB3YXMgbnVsbCwgdGhlbiBsZXQncyByZXR1cm4gYW4gZW1wdHkKLSAgICAgICAgICAgICAgICAvLyBTb3VyY2Ugb2JqZWN0IHJhdGhlciB0aGFuIGEgbnVsbC4KLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJUaGVyZSB3YXMgbm8gcGF5bG9hZCB0byBiZSBmb3VuZC4gIFJldHVybmluZyBhbiBlbXB0eSBTb3VyY2Ugb2JqZWN0Iik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJ5dGVbXSBieXRlcyA9IG5ldyBieXRlWzBdOwotICAgICAgICAgICAgICAgIHBheWxvYWQgPSBuZXcgU3RyZWFtU291cmNlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlcykpOwotICAgICAgICAgICB9Ci0gICAKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBwYXlsb2FkOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgamF2YXgueG1sLndzLkxvZ2ljYWxNZXNzYWdlI3NldFBheWxvYWQoamF2YS5sYW5nLk9iamVjdCwgamF2YXgueG1sLmJpbmQuSkFYQkNvbnRleHQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UGF5bG9hZChPYmplY3Qgb2JqLCBKQVhCQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIEJsb2NrRmFjdG9yeSBmYWN0b3J5ID0gKEpBWEJCbG9ja0ZhY3RvcnkpIEZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KEpBWEJCbG9ja0ZhY3RvcnkuY2xhc3MpOwotICAgICAgICBKQVhCQmxvY2tDb250ZXh0IGpiYyA9IG5ldyBKQVhCQmxvY2tDb250ZXh0KGNvbnRleHQpOwotICAgICAgICBfc2V0UGF5bG9hZChvYmosIGpiYywgZmFjdG9yeSk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBqYXZheC54bWwud3MuTG9naWNhbE1lc3NhZ2Ujc2V0UGF5bG9hZChqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXlsb2FkKFNvdXJjZSBzb3VyY2UpIHsKLSAgICAgICAgQmxvY2tGYWN0b3J5IGZhY3RvcnkgPSAoU291cmNlQmxvY2tGYWN0b3J5KSBGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShTb3VyY2VCbG9ja0ZhY3RvcnkuY2xhc3MpOwotICAgICAgICBfc2V0UGF5bG9hZChzb3VyY2UsIG51bGwsIGZhY3RvcnkpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgX3NldFBheWxvYWQoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNvbnRleHQsIEJsb2NrRmFjdG9yeSBmYWN0b3J5KSB7Ci0gICAgICAgIEJsb2NrIGJsb2NrID0gZmFjdG9yeS5jcmVhdGVGcm9tKG9iamVjdCwgY29udGV4dCwgbnVsbCk7Ci0gICAgICAgIAotICAgICAgICBpZiAobWVwQ3R4LmdldE1lc3NhZ2VPYmplY3QoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoIW1lcEN0eC5nZXRNZXNzYWdlT2JqZWN0KCkuaXNGYXVsdCgpKSB7Ci0gICAgICAgICAgICAgICAgbWVwQ3R4LmdldE1lc3NhZ2VPYmplY3QoKS5zZXRCb2R5QmxvY2soYmxvY2spOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiVGhlIHBheWxvYWQgY29udGFpbnMgYSBmYXVsdCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBtZXBDdHguZ2V0TWVzc2FnZU9iamVjdCgpLnNldEJvZHlCbG9jayhibG9jayk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gSWYgdGhlIHBheWxvYWQgaXMgYSBmYXVsdCwgdGhlbiB3ZSBjYW4ndCBzZXQgaXQgYmFjayBvbiB0aGUgbWVzc2FnZQotICAgICAgICAgICAgICAgIC8vIGFzIGEgYmxvY2suICBCbG9ja3MgYXJlIE9NU291cmNlZEVsZW1lbnRzLCBhbmQgZmF1bHRzIGNhbm5vdCBiZSBPTVNvdXJjZWRFbGVtZW50cy4gIAotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIFNPQVBFbnZlbG9wZSBlbnYgPSAoU09BUEVudmVsb3BlKSBtZXBDdHguZ2V0TWVzc2FnZU9iamVjdCgpLmdldEFzT01FbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBjb250ZW50ID0gZW52LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkgbWYgPSAoTWVzc2FnZUZhY3RvcnkpIEZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KE1lc3NhZ2VGYWN0b3J5LmNsYXNzKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVhZGVyIHNyID0gbmV3IFN0cmluZ1JlYWRlcihjb250ZW50KTsKLSAgICAgICAgICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHN0cmVhbSA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoc3IpOwotICAgICAgICAgICAgICAgICAgICBNZXNzYWdlIG1zZyA9IG1mLmNyZWF0ZUZyb20oc3RyZWFtLCBtZXBDdHguZ2V0TWVzc2FnZU9iamVjdCgpLmdldFByb3RvY29sKCkpOwotICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIHJlcXVpcmVkIGZvciBwcm9wZXIgc2VyaWFsaXphdGlvbiBvZiB0aGUgT00gc3RydWN0dXJlLgotICAgICAgICAgICAgICAgICAgICBtc2cuZ2V0QXNPTUVsZW1lbnQoKS5idWlsZCgpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgbWVwQ3R4LnNldE1lc3NhZ2UobXNnKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgUGF5bG9hZHMgY3JlYXRlUGF5bG9hZHMoT2JqZWN0IGNvbnRlbnQpIHsKLSAgICAgICAgaWYgKGNvbnRlbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgUGF5bG9hZHMgcGF5bG9hZHMgPSBuZXcgUGF5bG9hZHMoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgaWYgKFNvdXJjZS5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGNvbnRlbnQuZ2V0Q2xhc3MoKSkpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgVHJhbnNmb3JtZXIgdHJhbnMgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdUcmFuc2Zvcm1lcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gRmlyc3Qgd2UgaGF2ZSB0byBnZXQgdGhlIGNvbnRlbnQgb3V0IG9mIHRoZSBvcmlnaW5hbAotICAgICAgICAgICAgICAgIC8vIFNvdXJjZSBvYmplY3Qgc28gd2UgY2FuIGJ1aWxkIHRoZSBjYWNoZSBmcm9tIHRoZXJlLgotICAgICAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICAgICAgICAgIFN0cmVhbVJlc3VsdCByZXN1bHQgPSBuZXcgU3RyZWFtUmVzdWx0KGJhb3MpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgU291cmNlIHNvdXJjZSA9IChTb3VyY2UpIGNvbnRlbnQ7Ci0gICAgICAgICAgICAgICAgdHJhbnMudHJhbnNmb3JtKHNvdXJjZSwgcmVzdWx0KTsKLSAgICAgICAgICAgICAgICB0cmFucy5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLk9NSVRfWE1MX0RFQ0xBUkFUSU9OLCAieWVzIik7Ci0gICAgICAgICAgICAgICAgYnl0ZVtdIGJ5dGVzID0gYmFvcy50b0J5dGVBcnJheSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gR2l2ZW4gdGhhdCB3ZSd2ZSBjb25zdW1lZCB0aGUgb3JpZ2luYWwgU291cmNlIG9iamVjdCwgCi0gICAgICAgICAgICAgICAgLy8gd2UgbmVlZCB0byBjcmVhdGUgYW5vdGhlciBvbmUgd2l0aCB0aGUgb3JpZ2luYWwgY29udGVudAotICAgICAgICAgICAgICAgIC8vIGFuZCBhc3NpZ24gaXQgYmFjay4KLSAgICAgICAgICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBiYWlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVzKTsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAvLyBUaGUgU291cmNlIG9iamVjdCByZXR1cm5lZCB0byB0aGUgaGFuZGxlciBzaG91bGQgYmUgYQotICAgICAgICAgICAgICAgICAgICAvLyBET01Tb3VyY2Ugc28gdGhhdCB0aGUgaGFuZGxlciBwcm9ncmFtbWVyIGNhbiByZWFkIHRoZSBkYXRhCi0gICAgICAgICAgICAgICAgICAgIC8vIG11bHRpcGxlIHRpbWVzIGFuZCAoYXMgb3Bwb3NlZCB0byB1c2luZyBhIFN0cmVhbVNvdXJjZSkgYW5kCi0gICAgICAgICAgICAgICAgICAgIC8vIHRoZXkgY2FuIG1vcmUgZWFzaWx5IGFjY2VzcyB0aGUgZGF0YSBpbiBET00gZm9ybS4KLSAgICAgICAgICAgICAgICAgICAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBkYmYgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGRiZi5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIERvY3VtZW50QnVpbGRlciBkYiA9IGRiZi5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgRG9jdW1lbnQgZG9tID0gZGIucGFyc2UoYmFpcyk7Ci0gICAgICAgICAgICAgICAgICAgIHBheWxvYWRzLkhBTkRMRVJfUEFZTE9BRCA9IG5ldyBET01Tb3VyY2UoZG9tKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIGEgZGlmZmVyZW50IGJ5dGVbXSBmb3IgdGhlIGNhY2hlIHNvIHRoYXQgd2UncmUgbm90IGp1c3QKLSAgICAgICAgICAgICAgICAvLyBidWlsZGluZyB0d28gU291cmNlIG9iamVjdHMgdGhhdCBwb2ludCB0byB0aGUgc2FtZSBhcnJheS4KLSAgICAgICAgICAgICAgICBieXRlW10gY2FjaGVCeXRlcyA9IG5ldyBieXRlW2J5dGVzLmxlbmd0aF07Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShieXRlcywgMCwgY2FjaGVCeXRlcywgMCwgYnl0ZXMubGVuZ3RoKTsKLQotICAgICAgICAgICAgICAgIC8vIE5vdyBidWlsZCB0aGUgU291cmUgb2JqZWN0IGZvciB0aGUgY2FjaGUuCi0gICAgICAgICAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gY2FjaGVCYWlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGNhY2hlQnl0ZXMpOwotICAgICAgICAgICAgICAgIHBheWxvYWRzLkNBQ0hFX1BBWUxPQUQgPSBuZXcgU3RyZWFtU291cmNlKGNhY2hlQmFpcyk7Ci0gICAgICAgICAgICB9IGNhdGNoIChUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChUcmFuc2Zvcm1lckZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3IgZSkgewotICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChUcmFuc2Zvcm1lckV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIG5vIGNhY2hlIGltcGxlbWVudGVkIHlldAotICAgICAgICAgICAgcGF5bG9hZHMuSEFORExFUl9QQVlMT0FEID0gY29udGVudDsKLSAgICAgICAgICAgIHBheWxvYWRzLkNBQ0hFX1BBWUxPQUQgPSBjb250ZW50OwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHBheWxvYWRzOwotICAgIH0KLSAgICAgICAgICAgIAotICAgIC8qCi0gICAgICogQSBzaW1wbGUgaG9sZGVyIGZvciB0aGUgZGlmZmVyZW50IHBheWxvYWQgb2JqZWN0cy4KLSAgICAgKi8KLSAgICBjbGFzcyBQYXlsb2FkcyB7Ci0gICAgICAgIE9iamVjdCBIQU5ETEVSX1BBWUxPQUQ7ICAgIC8vIFRoZSBwYXlsb2FkIG9iamVjdCB0aGF0IHdpbGwgYmUgcmV0dXJuZWQgdG8gdGhlIGhhbmRsZXIKLSAgICAgICAgT2JqZWN0IENBQ0hFX1BBWUxPQUQ7ICAgICAgLy8gVGhlIHBheWxvYWQgb2JqZWN0IHRoYXQgd2lsbCBiZSB1c2VkIGZvciB0aGUgY2FjaGUKLSAgICB9ICAgIAotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvaGFuZGxlci9NRVBDb250ZXh0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9oYW5kbGVyL01FUENvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJjMDNiNi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9oYW5kbGVyL01FUENvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaGFuZGxlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkVuZHBvaW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLk1lc3NhZ2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKioKLSAqIFRoZSA8dHQ+TUVQQ29udGV4dDwvdHQ+IGlzIHRoZSB2ZXJzaW9uIG9mIHRoZSBNZXNzYWdlQ29udGV4dAotICogdGhhdCB3aWxsIGJlIGdpdmVuIHRvIGFwcGxpY2F0aW9uIGhhbmRsZXJzIGFzIHRoZSBoYW5kbGVyIGxpc3QgCi0gKiBpcyB0cmF2ZXJzZWQuICBJdCBpcyBvbmx5IHRvIGJlIHVzZWQgYnkgYXBwbGljYXRpb24gaGFuZGxlcnMuCi0gKiAKLSAqIFRoZSBNRVBDb250ZXh0IG9iamVjdCBpcyBjb25zdHJ1Y3RlZCB1c2luZyBhIG5vbi1udWxsIHJlcXVlc3QKLSAqIGNvbnRleHQuICBPbmNlIHRoZSByZXF1ZXN0IGhhcyBiZWVuIGZ1bGx5IHByb2Nlc3NlZCBpbiB0aGUgSkFYLVdTIGVuZ2luZSwKLSAqIHRoZSByZXNwb25zZSBjb250ZXh0IHNob3VsZCBiZSBzZXQgb24gdGhpcy4gIFNpbmNlIHRoZSByZXNwb25zZSBjb250ZXh0Ci0gKiBpcyBhbHdheXMgbGFzdCwgaXQgdGFrZXMgcHJpb3JpdHkgaW4gYWxsIE1FUENvbnRleHQgbWV0aG9kcy4KLSAqIAotICovCi1wdWJsaWMgY2xhc3MgTUVQQ29udGV4dCBpbXBsZW1lbnRzIGphdmF4LnhtbC53cy5oYW5kbGVyLk1lc3NhZ2VDb250ZXh0IHsKLQotICAgIC8vIElmIHRoaXMgYSByZXF1ZXN0IGZsb3csIHRoZW4gdGhlIE1FUCBjb250YWlucyB0aGUgcmVxdWVzdCBNQy4KLSAgICAvLyBJZiB0aGlzIGEgcmVzcG9uc2UgZmxvdywgdGhlbiB0aGUgTUVQIGNvbnRhaW5zIGJvdGggdGhlIHJlcXVlc3QgTUMgYW5kIHRoZSByZXNwb25zZSBNQy4KLSAgICAvLyAoTm90ZSB0aGF0IGFjY2VzcyB0byB0aGUgcmVxdWVzdE1DIHByb3BlcnRpZXMgaXMgc29tZXRpbWVzIHN5bmNocm9uaXplZCBpbiB0aGUKLSAgICAvLyByZXNwb25zZSBmbG93LikKLSAgICBwcm90ZWN0ZWQgTWVzc2FnZUNvbnRleHQgcmVxdWVzdE1DOwotICAgIHByb3RlY3RlZCBNZXNzYWdlQ29udGV4dCByZXNwb25zZU1DOwotICAgIAotICAgIHByaXZhdGUgTWFwPFN0cmluZywgU2NvcGU+IHNjb3BlczsgIC8vIEFQUExJQ0FUSU9OIG9yIEhBTkRMRVIgc2NvcGUgZm9yIHByb3BlcnRpZXMKLSAgICAKLSAgICAvKgotICAgICAqIEZsYWcgdG8gaW5kaWNhdGUgd2hldGhlciB3ZSdyZSBiZWluZyBjYWxsZWQgZnJvbSBhIGhhbmRsZXIgb3IgYW4gYXBwbGljYXRpb24KLSAgICAgKiAoZW5kcG9pbnQgb3IgY2xpZW50KS4gIFVzZXJzIG9mIE1FUENvbnRleHQgc2hvdWxkIHVzZSB0aGUgJ2lzJyBhbmQKLSAgICAgKiAnc2V0JyBhcHByb3ByaWF0ZWx5IGZvciB0aGlzIGZsYWcuICBUaGUgbW9zdCBsaWtlbHkgc2NlbmFyaW8gaXMgdG8gc2V0IHRoZQotICAgICAqIGZsYWcgdG8gdHJ1ZSBhZnRlciB0aGUgc2VydmVyLXNpZGUgaW5ib3VuZCBoYW5kbGVycyBhcmUgY29tcGxldGUuCi0gICAgICogCi0gICAgICogVE9ETywgYWxsIG1ldGhvZHMgc2hvdWxkIHVzZSB0aGlzIGZsYWcgdG8gY2hlY2sgZm9yIGFjY2VzcyByaWdodHMKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gQXBwbGljYXRpb25BY2Nlc3NMb2NrZWQgPSBmYWxzZTsKLQotICAgIC8qCi0gICAgICogSWRlYWxseSB0aGlzIHdvdWxkIGJlICJwcm90ZWN0ZWQiLCBidXQgd2Ugd2FudCB0aGUganVuaXQgdGVzdHMgdG8gc2VlIGl0LgotICAgICAqLwotICAgIHB1YmxpYyBNRVBDb250ZXh0KE1lc3NhZ2VDb250ZXh0IHJlcXVlc3RNc2dDdHgpIHsKLSAgICAgICAgdGhpcy5yZXF1ZXN0TUMgPSByZXF1ZXN0TXNnQ3R4OwotICAgICAgICBzY29wZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFNjb3BlPigpOwotICAgICAgICAvLyBtYWtlIHN1cmUgdGhlIE1lc3NhZ2VDb250ZXh0IHBvaW50cyBiYWNrIHRvIHRoaXMKLSAgICAgICAgcmVxdWVzdE1zZ0N0eC5zZXRNRVBDb250ZXh0KHRoaXMpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgRW5kcG9pbnREZXNjcmlwdGlvbiBnZXRFbmRwb2ludERlc2MoKSB7Ci0gICAgICAgIGlmIChyZXNwb25zZU1DICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiByZXNwb25zZU1DLmdldEVuZHBvaW50RGVzY3JpcHRpb24oKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVxdWVzdE1DLmdldEVuZHBvaW50RGVzY3JpcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWVzc2FnZUNvbnRleHQgZ2V0UmVxdWVzdE1lc3NhZ2VDb250ZXh0KCkgewotICAgICAgICByZXR1cm4gcmVxdWVzdE1DOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgTWVzc2FnZUNvbnRleHQgZ2V0UmVzcG9uc2VNZXNzYWdlQ29udGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIHJlc3BvbnNlTUM7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBNZXNzYWdlQ29udGV4dCBnZXRNZXNzYWdlQ29udGV4dCgpIHsKLSAgICAgICAgaWYgKHJlc3BvbnNlTUMgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlTUM7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlcXVlc3RNQzsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0UmVzcG9uc2VNZXNzYWdlQ29udGV4dChNZXNzYWdlQ29udGV4dCByZXNwb25zZU1DKSB7Ci0gICAgICAgIGlmKHRoaXMucmVzcG9uc2VNQyAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXNwb25zZU1DLnNldFByb3BlcnR5KGphdmF4LnhtbC53cy5oYW5kbGVyLk1lc3NhZ2VDb250ZXh0Lk9VVEJPVU5EX01FU1NBR0VfQVRUQUNITUVOVFMsIAotICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc3BvbnNlTUMuZ2V0UHJvcGVydHkoamF2YXgueG1sLndzLmhhbmRsZXIuTWVzc2FnZUNvbnRleHQuT1VUQk9VTkRfTUVTU0FHRV9BVFRBQ0hNRU5UUykpOwotICAgICAgICB9Ci0gICAgICAgIC8vIFRPRE8gZG9lcyBBcHBsaWNhdGlvbkFjY2Vzc0xvY2tlZCBtZWFuIGFueXRoaW5nIGhlcmU/IC0tIG1ldGhvZCBpcyBwcm90ZWN0ZWQsIHNvIHByb2JhYmx5IG5vdAotICAgICAgICB0aGlzLnJlc3BvbnNlTUMgPSByZXNwb25zZU1DOwotICAgICAgICAvLyBpZiBjYWxsZXJzIGFyZSBiZWluZyBjYXJlZnVsLCB0aGUgcmVzcG9uc2VNQyBzaG91bGQgbm90IGJlIHNldAotICAgICAgICAvLyB1bnRpbCB0aGUgZW5naW5lIGlzIGRvbmUgaW52b2tpbmcgdGhlIGVuZHBvaW50LCBvbiBib3RoIHNlcnZlciBhbmQKLSAgICAgICAgLy8gY2xpZW50IHNpZGUuICBBdCB0aGF0IHBvaW50LCB3ZSBjYW4gc3RhcnQgYWxsb3dpbmcgY2FsbGVycyBhY2Nlc3MKLSAgICAgICAgLy8gdG8gSEFORExFUiBzY29wZWQgcHJvcGVydGllcyBhZ2Fpbi4gIFNldCB0aGUgZmxhZzoKLSAgICAgICAgQXBwbGljYXRpb25BY2Nlc3NMb2NrZWQgPSBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0TWVzc2FnZShNZXNzYWdlIG1zZykgewotICAgICAgICBpZiAocmVzcG9uc2VNQyAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXNwb25zZU1DLnNldE1lc3NhZ2UobXNnKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHJlcXVlc3RNQy5zZXRNZXNzYWdlKG1zZyk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFNjb3BlIGdldFNjb3BlKFN0cmluZyBzKSB7Ci0gICAgICAgIGlmIChzY29wZXMuZ2V0KHMpID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIEpBWC1XUyBkZWZhdWx0IDkuNC4xLiAgSG93ZXZlciwgd2UgdHJ5IHRvIHNldCB0aGUgc2NvcGUgZm9yCi0gICAgICAgICAgICAvLyBldmVyeSBpbmNvbWluZyBwcm9wZXJ0eSB0byBIQU5ETEVSLiAgSWYgYSBwcm9wZXJ0eSBpcyBjb21pbmcgZnJvbQotICAgICAgICAgICAgLy8gdGhlIGF4aXMyIEFic3RyYWN0Q29udGV4dCBwcm9wZXJ0aWVzIGJhZywgd2Ugd2FudCB0aG9zZSB0byBiZQotICAgICAgICAgICAgLy8gQVBQTElDQVRJT04gc2NvcGVkLiAgVGhvc2UgcHJvcGVydGllcyBtYXkgaGF2ZSBiZWVuIHNldCBieSBhbgotICAgICAgICAgICAgLy8gYXhpcyBhcHBsaWNhdGlvbiBoYW5kbGVyLCBhbmQgbWF5IG5lZWQgdG8gYmUgYWNjZXNzaWJsZSBieSAKLSAgICAgICAgICAgIC8vIGEgY2xpZW50IGFwcCBvciBlbmRwb2ludC4KLSAgICAgICAgICAgIHJldHVybiBTY29wZS5BUFBMSUNBVElPTjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc2NvcGVzLmdldChzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTY29wZShTdHJpbmcgcywgU2NvcGUgc2NvcGUpIHsKLSAgICAgICAgLy8gVE9ETyByZXZpZXcgbmV4dCB0d28gbGluZXMKLSAgICAgICAgaWYgKGlzQXBwbGljYXRpb25BY2Nlc3NMb2NrZWQoKSkgeyAgLy8gZW5kcG9pbnRzIGFyZSBub3QgYWxsb3dlZCB0byBjaGFuZ2UgcHJvcGVydHkgc2NvcGUuICBUaGV5IHNob3VsZCBhbGwgYmUgQVBQTElDQVRJT04gc2NvcGVkIGFueXdheQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHNjb3Blcy5wdXQocywgc2NvcGUpOwotICAgIH0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBqYXZhLnV0aWwuTWFwIG1ldGhvZHMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKLSAgICAgICAgLy8gVE9ETyByZXZpZXcKLSAgICAgICAgaWYgKGlzQXBwbGljYXRpb25BY2Nlc3NMb2NrZWQoKSkgeyAgLy8gZW5kcG9pbnRzIGFyZSBhbGxvd2VkIHRvIGNsZWFyIEFQUExJQ0FUSU9OIHNjb3BlZCBwcm9wZXJ0aWVzIG9ubHkKLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gYXBwU2NvcGVkUHJvcHMgPSBnZXRBcHBsaWNhdGlvblNjb3BlZFByb3BlcnRpZXMoKTsKLSAgICAgICAgICAgIGZvcihJdGVyYXRvciBpdCA9IGFwcFNjb3BlZFByb3BzLmtleVNldCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcga2V5ID0gKFN0cmluZylpdC5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgcmVtb3ZlKGtleSk7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETyBhbHNvIHJlbW92ZSBTY29wZSBzZXR0aW5nIGZvciAia2V5Ij8gIEhvdz8KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAvLyBUT0RPOiBSRVZJRVcKLSAgICAgICAgLy8gSSBkb24ndCB0aGluayB0aGlzIHdpbGwgd29yayBpZiB0aGUgbWVzc2FnZSBjb250ZXh0cyBoYXZlIGEgY29weQotICAgICAgICAvLyBvZiB0aGUgbWFwCi0gICAgICAgIGlmIChyZXNwb25zZU1DICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJlc3BvbnNlTUMuZ2V0UHJvcGVydGllcygpLmNsZWFyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgc3luY2hyb25pemVkIChyZXF1ZXN0TUMpIHsKLSAgICAgICAgICAgIHJlcXVlc3RNQy5nZXRQcm9wZXJ0aWVzKCkuY2xlYXIoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zS2V5KE9iamVjdCBrZXkpIHsKLSAgICAgICAgaWYgKGlzQXBwbGljYXRpb25BY2Nlc3NMb2NrZWQoKSkgewotICAgICAgICAgICAgcmV0dXJuIGdldEFwcGxpY2F0aW9uU2NvcGVkUHJvcGVydGllcygpLmNvbnRhaW5zS2V5KGtleSk7Ci0gICAgICAgIH0KLSAgICAgICAgc3luY2hyb25pemVkIChyZXF1ZXN0TUMpIHsKLSAgICAgICAgICAgIGlmIChyZXNwb25zZU1DICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBib29sZWFuIGNvbnRhaW5zS2V5ID0gcmVzcG9uc2VNQy5jb250YWluc0tleShrZXkpIHx8IHJlcXVlc3RNQy5jb250YWluc0tleShrZXkpOwotICAgICAgICAgICAgICAgIGlmICgoZ2V0U2NvcGUoKFN0cmluZylrZXkpID09IFNjb3BlLkFQUExJQ0FUSU9OKSB8fCAoIWlzQXBwbGljYXRpb25BY2Nlc3NMb2NrZWQoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5zS2V5OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICgoZ2V0U2NvcGUoKFN0cmluZylrZXkpID09IFNjb3BlLkFQUExJQ0FUSU9OKSB8fCAoIWlzQXBwbGljYXRpb25BY2Nlc3NMb2NrZWQoKSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVxdWVzdE1DLmNvbnRhaW5zS2V5KGtleSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zVmFsdWUoT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIGlmIChpc0FwcGxpY2F0aW9uQWNjZXNzTG9ja2VkKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRBcHBsaWNhdGlvblNjb3BlZFByb3BlcnRpZXMoKS5jb250YWluc1ZhbHVlKHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocmVzcG9uc2VNQyAhPSBudWxsKSB7Ci0KLSAgICAgICAgICAgIGlmIChyZXNwb25zZU1DLmdldFByb3BlcnRpZXMoKS5jb250YWluc1ZhbHVlKHZhbHVlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOyAKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAocmVxdWVzdE1DKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlcXVlc3RNQy5nZXRQcm9wZXJ0aWVzKCkuY29udGFpbnNWYWx1ZSh2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlcXVlc3RNQy5nZXRQcm9wZXJ0aWVzKCkuY29udGFpbnNWYWx1ZSh2YWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFNldCBlbnRyeVNldCgpIHsKLSAgICAgICAgLy8gVE9ETyBzaG91bGQgY2hlY2sgQXBwbGljYXRpb25BY2Nlc3NMb2NrZWQgZmxhZwotICAgICAgICAvLyBhbmQgcmV0dXJuIG9ubHkgQVBQTElDQVRJT04gc2NvcGVkIHByb3BlcnRpZXMgaWYgdHJ1ZQotICAgICAgICBpZiAoaXNBcHBsaWNhdGlvbkFjY2Vzc0xvY2tlZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0QXBwbGljYXRpb25TY29wZWRQcm9wZXJ0aWVzKCkuZW50cnlTZXQoKTsKLSAgICAgICAgfQotICAgICAgICBIYXNoTWFwIHRlbXBQcm9wcyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIAotICAgICAgICBzeW5jaHJvbml6ZWQgKHJlcXVlc3RNQykgewotICAgICAgICAgICAgdGVtcFByb3BzLnB1dEFsbChyZXF1ZXN0TUMuZ2V0UHJvcGVydGllcygpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocmVzcG9uc2VNQyAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0ZW1wUHJvcHMucHV0QWxsKHJlc3BvbnNlTUMuZ2V0UHJvcGVydGllcygpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGVtcFByb3BzLmVudHJ5U2V0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXQoT2JqZWN0IGtleU9iamVjdCkgewotICAgICAgICBTdHJpbmcga2V5ID0gKFN0cmluZykga2V5T2JqZWN0OwotICAgICAgICBpZiAocmVzcG9uc2VNQyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAocmVzcG9uc2VNQy5nZXRQcm9wZXJ0eShrZXkpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoKGdldFNjb3BlKChTdHJpbmcpa2V5KSA9PSBTY29wZS5BUFBMSUNBVElPTikgfHwgKCFpc0FwcGxpY2F0aW9uQWNjZXNzTG9ja2VkKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZU1DLmdldFByb3BlcnR5KGtleSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHN5bmNocm9uaXplZCAocmVxdWVzdE1DKSB7Ci0gICAgICAgICAgICBpZiAoKGdldFNjb3BlKChTdHJpbmcpa2V5KSA9PSBTY29wZS5BUFBMSUNBVElPTikgfHwgKCFpc0FwcGxpY2F0aW9uQWNjZXNzTG9ja2VkKCkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlcXVlc3RNQy5nZXRQcm9wZXJ0eShrZXkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0gICAgICAgIGlmIChpc0FwcGxpY2F0aW9uQWNjZXNzTG9ja2VkKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRBcHBsaWNhdGlvblNjb3BlZFByb3BlcnRpZXMoKS5pc0VtcHR5KCk7Ci0gICAgICAgIH0KLSAgICAgICAgc3luY2hyb25pemVkIChyZXF1ZXN0TUMpIHsKLSAgICAgICAgICAgIGlmIChyZXNwb25zZU1DICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVxdWVzdE1DLmdldFByb3BlcnRpZXMoKS5pc0VtcHR5KCkgJiYgcmVxdWVzdE1DLmdldFByb3BlcnRpZXMoKS5pc0VtcHR5KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcmVxdWVzdE1DLmdldFByb3BlcnRpZXMoKS5pc0VtcHR5KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU2V0IGtleVNldCgpIHsKLSAgICAgICAgaWYgKGlzQXBwbGljYXRpb25BY2Nlc3NMb2NrZWQoKSkgewotICAgICAgICAgICAgcmV0dXJuIGdldEFwcGxpY2F0aW9uU2NvcGVkUHJvcGVydGllcygpLmtleVNldCgpOwotICAgICAgICB9Ci0gICAgICAgIEhhc2hNYXAgdGVtcFByb3BzID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgc3luY2hyb25pemVkIChyZXF1ZXN0TUMpIHsKLSAgICAgICAgICAgIHRlbXBQcm9wcy5wdXRBbGwocmVxdWVzdE1DLmdldFByb3BlcnRpZXMoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJlc3BvbnNlTUMgIT0gbnVsbCkgewotICAgICAgICAgICAgdGVtcFByb3BzLnB1dEFsbChyZXNwb25zZU1DLmdldFByb3BlcnRpZXMoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRlbXBQcm9wcy5rZXlTZXQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IHB1dChTdHJpbmcga2V5LCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgLy8gVE9ETyBjYXJlZnVsOiAgZW5kcG9pbnRzIG1heSBvdmVyd3JpdGUgcHJlLWV4aXN0aW5nIGtleS92YWx1ZSBwYWlycy4KLSAgICAgICAgLy8gVGhvc2Uga2V5L3ZhbHVlIHBhaXJzIG1heSBhbHJlYWR5IGhhdmUgYSBzY29wZSBhdHRhY2hlZCB0byB0aGVtLCB3aGljaAotICAgICAgICAvLyBtZWFucyBhbiBlbmRwb2ludCBjb3VsZCAicHV0IiBhIHByb3BlcnR5IHRoYXQgaXMgd3JvbmdseSBzY29wZWQKLSAgICAgICAgaWYgKHNjb3Blcy5nZXQoa2V5KSA9PSBudWxsKSB7ICAvLyBjaGVjayB0aGUgc2NvcGVzIG9iamVjdCBkaXJlY3RseSwgbm90IHRocm91Z2ggZ2V0U2NvcGUoKSEhCi0gICAgICAgICAgICBzZXRTY29wZShrZXksIFNjb3BlLkhBTkRMRVIpOwotICAgICAgICB9Ci0gICAgICAgIHN5bmNocm9uaXplZCAocmVxdWVzdE1DKSB7Ci0gICAgICAgICAgICBpZiAocmVxdWVzdE1DLmNvbnRhaW5zS2V5KGtleSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVxdWVzdE1DLnNldFByb3BlcnR5KGtleSwgdmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHJlc3BvbnNlTUMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZU1DLnNldFByb3BlcnR5KGtleSwgdmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHJlcXVlc3RNQy5zZXRQcm9wZXJ0eShrZXksIHZhbHVlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHB1dEFsbChNYXAgdCkgewotICAgICAgICAvLyBUT0RPIHNpbWlsYXIgcHJvYmxlbSBhcyAicHV0IgotICAgICAgICBmb3IoSXRlcmF0b3IgaXQgPSB0LmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgRW50cnk8U3RyaW5nLCBPYmplY3Q+IGVudHJ5ID0gKEVudHJ5KWl0Lm5leHQoKTsKLSAgICAgICAgICAgIGlmIChnZXRTY29wZShlbnRyeS5nZXRLZXkoKSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHNldFNjb3BlKGVudHJ5LmdldEtleSgpLCBTY29wZS5IQU5ETEVSKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAocmVzcG9uc2VNQyAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXNwb25zZU1DLnNldFByb3BlcnRpZXModCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHJlcXVlc3RNQykgewotICAgICAgICAgICAgICAgIHJlcXVlc3RNQy5zZXRQcm9wZXJ0aWVzKHQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCByZW1vdmUoT2JqZWN0IGtleSkgewotICAgICAgICAvLyBjaGVjayBBcHBsaWNhdGlvbkFjY2Vzc0xvY2tlZCBmbGFnIGFuZCBwcmV2ZW50IHJlbW92YWwgb2YgSEFORExFUiBzY29wZWQgcHJvcHMKLSAgICAgICAgaWYgKGlzQXBwbGljYXRpb25BY2Nlc3NMb2NrZWQoKSkgewotICAgICAgICAgICAgaWYgKGdldFNjb3BlKChTdHJpbmcpa2V5KS5lcXVhbHMoU2NvcGUuSEFORExFUikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8geWVzLCByZW1vdmUgZnJvbSBib3RoIGFuZCByZXR1cm4gdGhlIHJpZ2h0IG9iamVjdAotICAgICAgICAvLyBUT0RPIFRoaXMgd29uJ3Qgd29yayBiZWNhdXNlIGdldFByb3BlcnRpZXMgcmV0dXJucyBhIHRlbXBvcmFyeSBtYXAKLSAgICAgICAgT2JqZWN0IHJldFZhbCA9IG51bGw7Ci0gICAgICAgIGlmIChyZXNwb25zZU1DICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldFZhbCA9IHJlc3BvbnNlTUMuZ2V0UHJvcGVydGllcygpLnJlbW92ZShrZXkpOwotICAgICAgICB9Ci0gICAgICAgIHN5bmNocm9uaXplZCAocmVxdWVzdE1DKSB7Ci0gICAgICAgICAgICBpZiAocmV0VmFsID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVxdWVzdE1DLmdldFByb3BlcnRpZXMoKS5yZW1vdmUoa2V5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHJlcXVlc3RNQy5nZXRQcm9wZXJ0aWVzKCkucmVtb3ZlKGtleSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldFZhbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IHNpemUoKSB7Ci0gICAgICAgIGlmIChpc0FwcGxpY2F0aW9uQWNjZXNzTG9ja2VkKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRBcHBsaWNhdGlvblNjb3BlZFByb3BlcnRpZXMoKS5zaXplKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIFRoZSBwcm9wZXJ0aWVzIG11c3QgYmUgY29tYmluZWQgdG9nZXRoZXIgYmVjYXVzZSBzb21lCi0gICAgICAgIC8vIGtleXMgbWF5IGJlIHRoZSBzYW1lIG9uIHRoZSByZXF1ZXN0IGFuZCB0aGUgcmVzcG9uc2UuCi0gICAgICAgIEhhc2hNYXAgdGVtcFByb3BzID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgc3luY2hyb25pemVkIChyZXF1ZXN0TUMpIHsKLSAgICAgICAgICAgIHRlbXBQcm9wcy5wdXRBbGwocmVxdWVzdE1DLmdldFByb3BlcnRpZXMoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJlc3BvbnNlTUMgIT0gbnVsbCkgewotICAgICAgICAgICAgdGVtcFByb3BzLnB1dEFsbChyZXNwb25zZU1DLmdldFByb3BlcnRpZXMoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRlbXBQcm9wcy5zaXplKCk7Ci0gICAgfQotCi0gICAgcHVibGljIENvbGxlY3Rpb24gdmFsdWVzKCkgewotICAgICAgICBpZiAoaXNBcHBsaWNhdGlvbkFjY2Vzc0xvY2tlZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0QXBwbGljYXRpb25TY29wZWRQcm9wZXJ0aWVzKCkudmFsdWVzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgSGFzaE1hcCB0ZW1wUHJvcHMgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKHJlcXVlc3RNQykgewotICAgICAgICAgICAgdGVtcFByb3BzLnB1dEFsbChyZXF1ZXN0TUMuZ2V0UHJvcGVydGllcygpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocmVzcG9uc2VNQyAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0ZW1wUHJvcHMucHV0QWxsKHJlc3BvbnNlTUMuZ2V0UHJvcGVydGllcygpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGVtcFByb3BzLnZhbHVlcygpOwotICAgIH0KLQotICAgIHB1YmxpYyBNZXNzYWdlIGdldE1lc3NhZ2VPYmplY3QoKSB7Ci0gICAgICAgIC8vIFRPRE8gZG9lcyBBcHBsaWNhdGlvbkFjY2Vzc0xvY2tlZCBhcHBseSBoZXJlPwotICAgICAgICBpZiAocmVzcG9uc2VNQyAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVzcG9uc2VNQy5nZXRNZXNzYWdlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlcXVlc3RNQy5nZXRNZXNzYWdlKCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIGlzQXBwbGljYXRpb25BY2Nlc3NMb2NrZWQoKSB7Ci0gICAgICAgIC8vIHNpbmNlIE1FUENvbnRleHQgaXMgYm90aCBhIHdyYXBwZXIgYW5kIGEgc3ViY2xhc3MsIHdlIG5lZWQgdG8gYmUgY2FyZWZ1bCB0byBzZXQgaXQgb25seSBvbiB0aGUgd3JhcHBlciBvYmplY3Q6Ci0gICAgICAgIGlmICh0aGlzID09IHJlcXVlc3RNQy5nZXRNRVBDb250ZXh0KCkpIHsgIC8vIG9iamVjdCBjb21wYXJlLCBJIGFtIHRoZSB3cmFwcGVyIG9iamVjdAotICAgICAgICAgICAgcmV0dXJuIEFwcGxpY2F0aW9uQWNjZXNzTG9ja2VkOwotICAgICAgICB9Ci0gICAgICAgIGlmIChyZXNwb25zZU1DID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiByZXF1ZXN0TUMuZ2V0TUVQQ29udGV4dCgpLmlzQXBwbGljYXRpb25BY2Nlc3NMb2NrZWQoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiByZXNwb25zZU1DLmdldE1FUENvbnRleHQoKS5pc0FwcGxpY2F0aW9uQWNjZXNzTG9ja2VkKCkgfHwgcmVxdWVzdE1DLmdldE1FUENvbnRleHQoKS5pc0FwcGxpY2F0aW9uQWNjZXNzTG9ja2VkKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRBcHBsaWNhdGlvbkFjY2Vzc0xvY2tlZChib29sZWFuIGFwcGxpY2F0aW9uQWNjZXNzTG9ja2VkKSB7Ci0gICAgICAgIC8vIHNpbmNlIE1FUENvbnRleHQgaXMgYm90aCBhIHdyYXBwZXIgYW5kIGEgc3ViY2xhc3MsIHdlIG5lZWQgdG8gYmUgY2FyZWZ1bCB0byBzZXQgaXQgb25seSBvbiB0aGUgd3JhcHBlciBvYmplY3Q6Ci0gICAgICAgIGlmICh0aGlzID09IHJlcXVlc3RNQy5nZXRNRVBDb250ZXh0KCkpIHsgIC8vIG9iamVjdCBjb21wYXJlLCBJIGFtIHRoZSB3cmFwcGVyIG9iamVjdAotICAgICAgICAgICAgQXBwbGljYXRpb25BY2Nlc3NMb2NrZWQgPSBhcHBsaWNhdGlvbkFjY2Vzc0xvY2tlZDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHJlcXVlc3RNQy5nZXRNRVBDb250ZXh0KCkuc2V0QXBwbGljYXRpb25BY2Nlc3NMb2NrZWQoYXBwbGljYXRpb25BY2Nlc3NMb2NrZWQpOwotICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhlIHJldHVybmVkIHRlbXBNYXAgc2hvdWxkIGJlIHVzZWQgYXMgYSByZWFkLW9ubHkgbWFwIGFzIGNoYW5nZXMgdG8gaXQgd2lsbAotICAgICAqIG5vdCBwcm9wb2dhdGUgaW50byB0aGUgcmVxdWVzdE1DIG9yIHJlc3BvbnNlTUMKLSAgICAgKiAKLSAgICAgKiBXYXRjaCBvdXQgZm9yIGluZmluaXRlIGxvb3AgaWYgeW91IGNhbGwgYW5vdGhlciBtZXRob2QgaW4gdGhpcyBjbGFzcyB0aGF0IHVzZXMgdGhpcyBtZXRob2QuCi0gICAgICogCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGdldEFwcGxpY2F0aW9uU2NvcGVkUHJvcGVydGllcygpIHsKLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiB0ZW1wTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0gICAgICAgIGlmICghc2NvcGVzLmNvbnRhaW5zVmFsdWUoU2NvcGUuQVBQTElDQVRJT04pKSB7Ci0gICAgICAgICAgICByZXR1cm4gdGVtcE1hcDsKLSAgICAgICAgfQotICAgICAgICBzeW5jaHJvbml6ZWQgKHJlcXVlc3RNQykgewotICAgICAgICAgICAgZm9yKEl0ZXJhdG9yIGl0ID0gcmVxdWVzdE1DLmdldFByb3BlcnRpZXMoKS5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICBFbnRyeSBlbnRyeSA9IChFbnRyeSlpdC5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKGdldFNjb3BlKChTdHJpbmcpZW50cnkuZ2V0S2V5KCkpLmVxdWFscyhTY29wZS5BUFBMSUNBVElPTikpIHsKLSAgICAgICAgICAgICAgICAgICAgdGVtcE1hcC5wdXQoKFN0cmluZyllbnRyeS5nZXRLZXkoKSwgZW50cnkuZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChyZXNwb25zZU1DICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvcihJdGVyYXRvciBpdCA9IHJlc3BvbnNlTUMuZ2V0UHJvcGVydGllcygpLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIEVudHJ5IGVudHJ5ID0gKEVudHJ5KWl0Lm5leHQoKTsKLSAgICAgICAgICAgICAgICBpZiAoZ2V0U2NvcGUoKFN0cmluZyllbnRyeS5nZXRLZXkoKSkuZXF1YWxzKFNjb3BlLkFQUExJQ0FUSU9OKSkgewotICAgICAgICAgICAgICAgICAgICB0ZW1wTWFwLnB1dCgoU3RyaW5nKWVudHJ5LmdldEtleSgpLCBlbnRyeS5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRlbXBNYXA7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvaGFuZGxlci9TT0FQSGVhZGVyc0FkYXB0ZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2hhbmRsZXIvU09BUEhlYWRlcnNBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3NDM0MDEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvaGFuZGxlci9TT0FQSGVhZGVyc0FkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmhhbmRsZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuQ29uc3RhbnRzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLkV4Y2VwdGlvbkZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS5NZXNzYWdlQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLkJsb2NrOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuTWVzc2FnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmZhY3RvcnkuWE1MU3RyaW5nQmxvY2tGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnJlZ2lzdHJ5LkZhY3RvcnlSZWdpc3RyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51dGlsaXR5LkphdmFVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLQ0KLS8qKg0KLSAqIFRoZSBKQVgtV1MgZXhwb3NlcyBzb2FwIGhlYWRlciBwcm9wZXJ0aWVzIHdob3NlIHZhbHVlIGlzIE1hcDxRTmFtZSwgTGlzdDxTdHJpbmc+Pi4gIFRoZQ0KLSAqIFFOYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSBoZWFkZXIgYW5kIExpc3Q8U3RyaW5nPiBhcmUgdGhlIHhtbCB2YWx1ZXMgb2YgdGhlIGhlYWRlcnMgZm9yIHFuYW1lLg0KLSAqIA0KLSAqIFRoZSBKQVgtV1MgTWVzc2FnZUNvbnRleHQgc3RvcmVzIHNvYXAgaGVhZGVycyBpbiBhbiBBeGlvbSB0cmVlIG9iamVjdCBsb2NhdGVkIG9uIHRoZSBKQVgtV1MgDQotICogTWVzc2FnZS4NCi0gKiANCi0gKiBUaGlzIGNsYXNzLCBTT0FQSGVhZGVyc0FkYXB0ZXIsIGlzIGFuIGFkYXB0ZXIgYmV0d2VlbiB0aGUgTWFwPFFOYW1lLCBMaXN0PFN0cmluZz4+IGludGVyZmFjZSBuZWVkZWQNCi0gKiBieSB0aGUgcHJvcGVydGllcyBhbmQgdGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbi4gIEFsbCB1c2VmdWwgZnVuY3Rpb24gaXMgZGVsZWdhdGVkIHRocm91Z2ggdGhlIE1lc3NhZ2VDb250ZXh0LCBzbyANCi0gKiB0aGF0IHdlIG9ubHkgaGF2ZSBvbmUgY29weSBvZiB0aGUgc29hcCBoZWFkZXIgaW5mb3JtYXRpb24uICANCi0gKiANCi0gKiBUbyB1c2UgdGhpcyBjbGFzcywgaW52b2tlIHRoZSBpbnN0YWxsIG1ldGhvZC4gIFRoaXMgd2lsbCBjcmVhdGUgYW4gU09BUEhlYWRlckFkYXB0ZXIgKGlmIG5lY2Vzc2FyeSkgYW5kIGluc3RhbGwgaXQNCi0gKiBvbiB0byBwcm92aWRlIHRoZSBKQVgtV1Mgc29hcCBoZWFkZXJzIHByb3BlcnR5LiAgKFNlZSBCYXNlTWVzc2FnZUNvbnRleHQuKQ0KLSAqLw0KLXB1YmxpYyBjbGFzcyBTT0FQSGVhZGVyc0FkYXB0ZXIgaW1wbGVtZW50cyBNYXA8UU5hbWUsIExpc3Q8U3RyaW5nPj4gew0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coU09BUEhlYWRlcnNBZGFwdGVyLmNsYXNzKTsNCi0gICAgDQotICAgIHByaXZhdGUgTWVzc2FnZUNvbnRleHQgbWM7ICAgICAvLyBNZXNzYWdlQ29udGV4dCB3aGljaCBwcm92aWRlcyB0aGUgYmFja2luZyBpbXBsZW1lbnRhdGlvbiBvZiBBdHRhY2htZW50cw0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNPdXRib3VuZDsgICAgLy8gSXNPdXRib3VuZA0KLSAgICBwcml2YXRlIFN0cmluZyBwcm9wZXJ0eTsNCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBBZGQgdGhlIEF0dGFjaG1lbnRBZGFwdGVyIGFzIHRoZSBwcm9wZXJ0eSBmb3IgdGhlIGluYm91bmQgYW5kL29yDQotICAgICAqIG91dGJvdW5kIGF0dGFjaG1lbnQgcHJvcGVydHkNCi0gICAgICogQHBhcmFtIG1jIE1lc3NhZ2VDb250ZXh0DQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgaW5zdGFsbChNZXNzYWdlQ29udGV4dCBtYykgew0KLSAgICAgICAgDQotICAgICAgICBNZXNzYWdlIG0gPSBtYy5nZXRNZXNzYWdlKCk7DQotICAgICAgICANCi0gICAgICAgIGlmIChtID09IG51bGwpIHsNCi0gICAgICAgICAgICAvLyBQcm9iYWJseSBhIHVuaXQgdGVzdCwgY2FuJ3QgY29udGludWUuDQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICBib29sZWFuIGlzT3V0Ym91bmQgPSBtYy5pc091dGJvdW5kKCk7DQotICAgICAgIA0KLSAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgbG9nLnRyYWNlKCJJbnN0YWxsaW5nIFNPQVBIZWFkZXJzQWRhcHRlcjogIiArDQotICAgICAgICAgICAgICAgICAgICAgIEphdmFVdGlscy5jYWxsU3RhY2tUb1N0cmluZygpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgU3RyaW5nIHByb3BlcnR5ID0gKGlzT3V0Ym91bmQpID8gDQotICAgICAgICAgICAgICAgIENvbnN0YW50cy5KQVhXU19PVVRCT1VORF9TT0FQX0hFQURFUlMgOg0KLSAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLkpBWFdTX0lOQk9VTkRfU09BUF9IRUFERVJTOw0KLSAgICAgICAgDQotICAgICAgICAvLyBTZWUgaWYgdGhlcmUgaXMgYW4gZXhpc3RpbmcgbWFwDQotICAgICAgICBPYmplY3QgbWFwID0gbWMuZ2V0UHJvcGVydHkocHJvcGVydHkpOw0KLQ0KLSAgICAgICAgLy8gUmV1c2UgZXhpc3RpbmcgQWRhcHRlcg0KLSAgICAgICAgaWYgKG1hcCBpbnN0YW5jZW9mIFNPQVBIZWFkZXJzQWRhcHRlcikgew0KLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkEgU09BUEhlYWRlcnNBZGFwdGVyIGlzIGFscmVhZHkgaW5zdGFsbGVkLiAgUmV1c2luZyB0aGUgZXhpc3Rpbmcgb25lLiIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9IA0KLSAgICAgIA0KLSAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IEF0dGFjaG1lbnRzQWRhcHRlciBhbmQgc2V0IGl0IG9uIHRoZSBwcm9wZXJ0eSANCi0gICAgICAgIFNPQVBIZWFkZXJzQWRhcHRlciBzaGEgPSANCi0gICAgICAgICAgICBuZXcgU09BUEhlYWRlcnNBZGFwdGVyKG1jLCANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzT3V0Ym91bmQpOw0KLQ0KLSAgICAgICAgaWYgKG1hcCAhPSBudWxsKSB7DQotICAgICAgICAgICAgLy8gQ29weSB0aGUgZXhpc3RpbmcgTWFwIGNvbnRlbnRzIHRvIHRoaXMgbmV3IGFkYXB0ZXINCi0gICAgICAgICAgICBzaGEucHV0QWxsKChNYXA8UU5hbWUsIExpc3Q8U3RyaW5nPj4pIG1hcCk7DQotICAgICAgICB9DQotICAgICAgICBtYy5zZXRQcm9wZXJ0eShwcm9wZXJ0eSwgc2hhKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogVGhlIGJhY2tpbmcgc3RvcmFnZSBvZiB0aGUgQXR0YWNobWVudHMgaXMgdGhlIEpBWC1XUyBNZXNzYWdlQ29udGV4dC4NCi0gICAgICogSW50ZW50aW9uYWxseSBwcml2YXRlLCB1c2UgaW5zdGFsbChNZXNzYWdlQ29udGV4dCkNCi0gICAgICovDQotICAgIHByaXZhdGUgU09BUEhlYWRlcnNBZGFwdGVyKE1lc3NhZ2VDb250ZXh0IG1jLCANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc091dGJvdW5kKSB7DQotICAgICAgICB0aGlzLm1jID0gbWM7DQotICAgICAgICB0aGlzLmlzT3V0Ym91bmQgPSBpc091dGJvdW5kOw0KLSAgICAgICAgdGhpcy5wcm9wZXJ0eSA9IChpc091dGJvdW5kKSA/IA0KLSAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLkpBWFdTX09VVEJPVU5EX1NPQVBfSEVBREVSUyA6DQotICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuSkFYV1NfSU5CT1VORF9TT0FQX0hFQURFUlM7DQotICAgICAgICANCi0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiSW5pdCBTT0FQSGVhZGVyc0FkYXB0ZXIgZm9yICIgKyBwcm9wZXJ0eSk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotDQotICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgew0KLSAgICAgICAgLy8gVGhyb3cgdW5zdXBwb3J0ZWQgb3BlcmF0aW9uIGV4Y2VwdGlvbiBwZXIgTWFwIGphdmFkb2MNCi0gICAgICAgIC8vIGZvciBhbnkgbWV0aG9kIHRoYXQgaXMgbm90IHN1cHBvcnRlZC4NCi0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0tleShPYmplY3Qga2V5KSB7DQotICAgICAgICBTZXQ8UU5hbWU+IGtleXMgPSB0aGlzLmtleVNldCgpOw0KLSAgICAgICAgcmV0dXJuIGtleXMuY29udGFpbnMoa2V5KTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNWYWx1ZShPYmplY3QgdmFsdWUpIHsNCi0gICAgICAgIFNldDxRTmFtZT4ga2V5cyA9IHRoaXMua2V5U2V0KCk7DQotICAgICAgICBmb3IoUU5hbWUga2V5OiBrZXlzKSB7DQotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHRyeVZhbHVlID0gZ2V0KGtleSk7DQotDQotICAgICAgICAgICAgaWYgKHRyeVZhbHVlID09IHZhbHVlIHx8DQotICAgICAgICAgICAgICAgIHZhbHVlLmVxdWFscyh0cnlWYWx1ZSkpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgU2V0PEVudHJ5PFFOYW1lLCBMaXN0PFN0cmluZz4+PiBlbnRyeVNldCgpIHsNCi0gICAgICAgIE1hcDxRTmFtZSwgTGlzdDxTdHJpbmc+PiB0ZW1wTWFwID0gbmV3IEhhc2hNYXA8UU5hbWUsIExpc3Q8U3RyaW5nPj4oKTsNCi0gICAgICAgIHRlbXBNYXAucHV0QWxsKHRoaXMpOw0KLSAgICAgICAgcmV0dXJuIHRlbXBNYXAuZW50cnlTZXQoKTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXQoT2JqZWN0IF9rZXkpIHsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgaWYgKCEoa2V5U2V0KCkuY29udGFpbnMoX2tleSkpKSB7DQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBRTmFtZSBrZXkgPSAoUU5hbWUpIF9rZXk7DQotICAgICAgICAgICAgTWVzc2FnZSBtID0gbWMuZ2V0TWVzc2FnZSgpOw0KLSAgICAgICAgICAgIExpc3Q8QmxvY2s+IGJsb2NrcyA9IG0uZ2V0SGVhZGVyQmxvY2tzKGtleS5nZXROYW1lc3BhY2VVUkkoKSwgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5LmdldExvY2FsUGFydCgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0WE1MU3RyaW5nQmxvY2tGYWN0b3J5KCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCk7DQotICAgICAgICAgICAgaWYgKGJsb2NrcyA9PSBudWxsIHx8IGJsb2Nrcy5zaXplKCkgPT0gMCkgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gR2V0IHRoZSBzdHJpbmdzIGZyb20gdGhlIGJsb2Nrcw0KLSAgICAgICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IHhtbFN0cmluZ3MgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0gICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8YmxvY2tzLnNpemUoKTsgaSsrKSB7DQotICAgICAgICAgICAgICAgIEJsb2NrIGJsb2NrID0gYmxvY2tzLmdldChpKTsNCi0gICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gKGJsb2NrID09IG51bGwpID8gbnVsbCA6IChTdHJpbmcpIGJsb2NrLmdldEJ1c2luZXNzT2JqZWN0KGZhbHNlKTsNCi0gICAgICAgICAgICAgICAgeG1sU3RyaW5ncy5hZGQodmFsdWUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICANCi0gICAgICAgICAgICByZXR1cm4geG1sU3RyaW5nczsNCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7DQotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbih0KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsNCi0gICAgICAgIHJldHVybiB0aGlzLmtleVNldCgpLmlzRW1wdHkoKTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIFNldDxRTmFtZT4ga2V5U2V0KCkgew0KLSAgICAgICAgTWVzc2FnZSBtID0gbWMuZ2V0TWVzc2FnZSgpOw0KLSAgICAgICAgcmV0dXJuIG0uZ2V0SGVhZGVyUU5hbWVzKCk7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gcHV0KFFOYW1lIGtleSwgTGlzdDxTdHJpbmc+IHZhbHVlcykgew0KLSAgICAgICAgTWVzc2FnZSBtID0gbWMuZ2V0TWVzc2FnZSgpOw0KLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKCJwdXQoIiArIGtleSArICIgLCAiICsgdmFsdWVzICsgIikiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIC8vIEdldCB0aGUgb2xkIHZhbHVlDQotICAgICAgICBMaXN0PFN0cmluZz4gb2xkID0gZ2V0KGtleSk7DQotICAgICAgICANCi0gICAgICAgIGlmICh2YWx1ZXMgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIGlmIChvbGQgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICAvLyBSZXBsYWNlIHRoZSBleGlzdGluZyBoZWFkZXIgYmxvY2tzDQotICAgICAgICAgICAgICAgIG0ucmVtb3ZlSGVhZGVyQmxvY2soa2V5LmdldE5hbWVzcGFjZVVSSSgpLCBrZXkuZ2V0TG9jYWxQYXJ0KCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBmb3IgKGludCBpPTA7IGkgPCB2YWx1ZXMuc2l6ZSgpOyBpKyspIHsNCi0gICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gdmFsdWVzLmdldChpKTsNCi0gICAgICAgICAgICAgICAgQmxvY2sgYmxvY2sgPSBnZXRYTUxTdHJpbmdCbG9ja0ZhY3RvcnkoKS5jcmVhdGVGcm9tKHZhbHVlLCBudWxsLCBrZXkpOw0KLSAgICAgICAgICAgICAgICBtLmFwcGVuZEhlYWRlckJsb2NrKGtleS5nZXROYW1lc3BhY2VVUkkoKSwga2V5LmdldExvY2FsUGFydCgpLCBibG9jayk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICByZXR1cm4gb2xkOw0KLSAgICAgICAgDQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHB1dEFsbChNYXA8PyBleHRlbmRzIFFOYW1lLCA/IGV4dGVuZHMgTGlzdDxTdHJpbmc+PiB0KSB7DQotICAgICAgICBmb3IoRW50cnk8PyBleHRlbmRzIFFOYW1lLCA/IGV4dGVuZHMgTGlzdDxTdHJpbmc+PiBlbnRyeTogdC5lbnRyeVNldCgpKSB7DQotICAgICAgICAgICAgUU5hbWUga2V5ID0gZW50cnkuZ2V0S2V5KCk7DQotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHZhbHVlID0gZW50cnkuZ2V0VmFsdWUoKTsgIA0KLSAgICAgICAgICAgIHB1dChrZXksIHZhbHVlKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIExpc3Q8U3RyaW5nPiByZW1vdmUoT2JqZWN0IGtleSkgew0KLSAgICAgICAgLy8gVGhyb3cgdW5zdXBwb3J0ZWQgb3BlcmF0aW9uIGV4Y2VwdGlvbiBwZXIgTWFwIGphdmFkb2MNCi0gICAgICAgIC8vIGZvciBhbnkgbWV0aG9kIHRoYXQgaXMgbm90IHN1cHBvcnRlZC4NCi0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgaW50IHNpemUoKSB7DQotICAgICAgICByZXR1cm4gdGhpcy5rZXlTZXQoKS5zaXplKCk7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyBDb2xsZWN0aW9uPExpc3Q8U3RyaW5nPj4gdmFsdWVzKCkgew0KLSAgICAgICAgTWFwPFFOYW1lLCBMaXN0PFN0cmluZz4+IHRlbXBNYXAgPSBuZXcgSGFzaE1hcDxRTmFtZSwgTGlzdDxTdHJpbmc+PigpOw0KLSAgICAgICAgdGVtcE1hcC5wdXRBbGwodGhpcyk7DQotICAgICAgICByZXR1cm4gdGVtcE1hcC52YWx1ZXMoKTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHJpdmF0ZSBYTUxTdHJpbmdCbG9ja0ZhY3RvcnkgZ2V0WE1MU3RyaW5nQmxvY2tGYWN0b3J5KCkgew0KLSAgICAgICAgcmV0dXJuIChYTUxTdHJpbmdCbG9ja0ZhY3RvcnkpDQotICAgICAgICAgICAgRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoWE1MU3RyaW5nQmxvY2tGYWN0b3J5LmNsYXNzKTsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9oYW5kbGVyL1NvYXBNZXNzYWdlQ29udGV4dC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvaGFuZGxlci9Tb2FwTWVzc2FnZUNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM4OGNkYy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9oYW5kbGVyL1NvYXBNZXNzYWdlQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5oYW5kbGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlJvbGVQbGF5ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5FeGNlcHRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmkxOG4uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLkJsb2NrOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5NZXNzYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5kYXRhYmluZGluZy5KQVhCQmxvY2tDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5mYWN0b3J5LkJsb2NrRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZmFjdG9yeS5KQVhCQmxvY2tGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5mYWN0b3J5Lk1lc3NhZ2VGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MucmVnaXN0cnkuRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkNvbnRleHQ7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQQ29uc3RhbnRzOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBNZXNzYWdlOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogVGhlIFNPQVBNZXNzYWdlQ29udGV4dCBpcyB0aGUgY29udGV4dCBoYW5kZWQgdG8gU09BUC1iYXNlZCBhcHBsaWNhdGlvbiBoYW5kbGVycy4gIEl0IHByb3ZpZGVzCi0gKiBhY2Nlc3MgdG8gdGhlIFNPQVAgbWVzc2FnZSB0aGF0IHJlcHJlc2VudHMgdGhlIHJlcXVlc3Qgb3IgcmVzcG9uc2UgdmlhIFNBQUouICBJdCBhbHNvIGFsbG93cwotICogYWNjZXNzIHRvIGFueSBwcm9wZXJ0aWVzIHRoYXQgaGF2ZSBiZWVuIHJlZ2lzdGVyZWQgYW5kIHNldCBvbiB0aGUgTWVzc2FnZUNvbnRleHQuCi0gKi8KLXB1YmxpYyBjbGFzcyBTb2FwTWVzc2FnZUNvbnRleHQgZXh0ZW5kcyBCYXNlTWVzc2FnZUNvbnRleHQgaW1wbGVtZW50cwotICAgICAgICBqYXZheC54bWwud3MuaGFuZGxlci5zb2FwLlNPQVBNZXNzYWdlQ29udGV4dCB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFNvYXBNZXNzYWdlQ29udGV4dC5jbGFzcyk7Ci0gICAgCi0gICAgLy8gY2FjaGUgdGhlIG1lc3NhZ2Ugb2JqZWN0IGFmdGVyIHRyYW5zZm9ybWF0aW9uIC0tLSBzZWUgZ2V0TWVzc2FnZSBhbmQgc2V0TWVzc2FnZSBtZXRob2RzCi0gICAgTWVzc2FnZSBjYWNoZWRNZXNzYWdlID0gbnVsbDsKLSAgICBTT0FQTWVzc2FnZSBjYWNoZWRTb2FwTWVzc2FnZSA9IG51bGw7Ci0gICAgCi0gICAgcHVibGljIFNvYXBNZXNzYWdlQ29udGV4dChNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ3R4KSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2VDdHgpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3RbXSBnZXRIZWFkZXJzKFFOYW1lIHFuYW1lLCBKQVhCQ29udGV4dCBqYXhiY29udGV4dCwgYm9vbGVhbiBhbGxSb2xlcykgewotICAgICAgICBpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSl7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIkdldHRpbmcgYWxsIEhlYWRlcnMgZm9yIFFuYW1lOiAiK3FuYW1lKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKHFuYW1lID09IG51bGwpewotICAgICAgICAgICAgaWYobG9nLmlzRGVidWdFbmFibGVkKCkpewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiSW52YWxpZCBRTmFtZSwgUU5hbWUgY2Fubm90IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgic29hcE1lc3NhZ2VDb250ZXh0RXJyMSIpKTsKLSAgICAgICAgfQotICAgICAgICBpZihqYXhiY29udGV4dCA9PSBudWxsKXsKLSAgICAgICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKXsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkludmFsaWQgSkFYQkNvbnRleHQsIEpBWEJDb250ZXh0IGNhbm5vdCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoIlNPQVBNZXNzYWdlQ29udGV4dEVycjIiKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBUaGUgaGVhZGVyIGluZm9ybWF0aW9uIGlzIHJldHVybmVkIGFzIGEgbGlzdCBvZiBqYXhiIG9iamVjdHMKLSAgICAgICAgTGlzdDxPYmplY3Q+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLSAgICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICBTdHJpbmcgbG9jYWxQYXJ0ID0gcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgIEJsb2NrRmFjdG9yeSBibG9ja0ZhY3RvcnkgPSAoSkFYQkJsb2NrRmFjdG9yeSkKLSAgICAgICAgICAgIEZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KEpBWEJCbG9ja0ZhY3RvcnkuY2xhc3MpOwotICAgICAgICBNZXNzYWdlIG0gPSBtZXNzYWdlQ3R4LmdldE1lc3NhZ2UoKTsKLSAgICAgICAgSkFYQkJsb2NrQ29udGV4dCBqYmMgPSBuZXcgSkFYQkJsb2NrQ29udGV4dChqYXhiY29udGV4dCk7Ci0gICAgICAgIAotICAgICAgICAvLyBJZiBhbGxSb2xlcyBpcyBub3Qgc3BlY2lmaWVkLCBwYXNzIGluIGEgc2V0IG9mIHJvbGVzLgotICAgICAgICAvLyBUaGUgaGVhZGVycyBtdXN0IHN1cHBvcnQgdGhhdCByb2xlLgotICAgICAgICBSb2xlUGxheWVyIHJvbGVQbGF5ZXIgPSBudWxsOwotICAgICAgICBpZiAoYWxsUm9sZXMgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgIHJvbGVQbGF5ZXIgPSBnZXRSb2xlUGxheWVyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmKG0uZ2V0TnVtSGVhZGVyQmxvY2tzKCk+MCl7Ci0gICAgICAgICAgICAvLyBHZXQgdGhlIGxpc3Qgb2YgSkFYQiBCbG9ja3MKLSAgICAgICAgICAgIExpc3Q8QmxvY2s+IGJsb2NrTGlzdCA9IG0uZ2V0SGVhZGVyQmxvY2tzKG5hbWVzcGFjZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsUGFydCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpiYywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZVBsYXllcik7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIENyZWF0ZSBsaXN0IG9mIEpBWEIgb2JqZWN0cwotICAgICAgICAgICAgaWYoYmxvY2tMaXN0IT1udWxsICYmIGJsb2NrTGlzdC5zaXplKCkgPiAwKXsKLSAgICAgICAgICAgICAgICB0cnl7Ci0gICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGl0ID0gYmxvY2tMaXN0Lml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEJsb2NrIGJsb2NrID0gKEJsb2NrKSBpdC5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgYm8gPSBibG9jay5nZXRCdXNpbmVzc09iamVjdChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZihibyE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYobG9nLmlzRGVidWdFbmFibGVkKCkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkV4dHJhY3RlZCBCTyBmcm9tIEhlYWRlciBCbG9jayIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0LmFkZChibyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIH1jYXRjaChYTUxTdHJlYW1FeGNlcHRpb24gZSl7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBsaXN0LnRvQXJyYXkobmV3IE9iamVjdFswXSk7Ci0gICAgICAgIAotICAgIH0KLQotICAgIHB1YmxpYyBTT0FQTWVzc2FnZSBnZXRNZXNzYWdlKCkgewotICAgICAgICBNZXNzYWdlIG1zZyA9IG1lc3NhZ2VDdHguZ2V0TUVQQ29udGV4dCgpLmdldE1lc3NhZ2VPYmplY3QoKTsKLSAgICAgICAgaWYgKG1zZyAhPSBjYWNoZWRNZXNzYWdlKSB7Ci0gICAgICAgICAgICBjYWNoZWRNZXNzYWdlID0gbXNnOwotICAgICAgICAgICAgY2FjaGVkU29hcE1lc3NhZ2UgPSBtc2cuZ2V0QXNTT0FQTWVzc2FnZSgpOwotICAgICAgICB9IAotICAgICAgICByZXR1cm4gY2FjaGVkU29hcE1lc3NhZ2U7Ci0gICAgfQotCi0gICAgcHVibGljIFNldDxTdHJpbmc+IGdldFJvbGVzKCkgewotICAgICAgICAvLyBUT0RPIGltcGxlbWVudCBiZXR0ZXIuICBXZSBzaG91bGQgYmUgZG9pbmcgc21hcnRlciBjaGVja2luZyBvZiB0aGUgaGVhZGVyLAotICAgICAgICAvLyBlc3BlY2lhbGx5IGZvciB0aGUgVWx0aW1hdGUgcmVjZWl2ZXIgYWN0b3Ivcm9sZQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIEpBVkFET0MgdG8gaGVscCBnZXQgdGhpcyBpbXBsZW1lbnRlZCBjb3JyZWN0bHk6Ci0gICAgICAgICAqIAotICAgICAgICAgKiBHZXRzIHRoZSBTT0FQIGFjdG9yIHJvbGVzIGFzc29jaWF0ZWQgd2l0aCBhbiBleGVjdXRpb24gb2YgdGhlIGhhbmRsZXIKLSAgICAgICAgICogY2hhaW4uIE5vdGUgdGhhdCBTT0FQIGFjdG9yIHJvbGVzIGFwcGx5IHRvIHRoZSBTT0FQIG5vZGUgYW5kIGFyZQotICAgICAgICAgKiBtYW5hZ2VkIHVzaW5nIFNPQVBCaW5kaW5nLnNldFJvbGVzIGFuZCBTT0FQQmluZGluZy5nZXRSb2xlcy4gSGFuZGxlcgotICAgICAgICAgKiBpbnN0YW5jZXMgaW4gdGhlIGhhbmRsZXIgY2hhaW4gdXNlIHRoaXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIFNPQVAKLSAgICAgICAgICogYWN0b3Igcm9sZXMgdG8gcHJvY2VzcyB0aGUgU09BUCBoZWFkZXIgYmxvY2tzLiBOb3RlIHRoYXQgdGhlIFNPQVAKLSAgICAgICAgICogYWN0b3Igcm9sZXMgYXJlIGludmFyaWFudCBkdXJpbmcgdGhlIHByb2Nlc3Npbmcgb2YgU09BUCBtZXNzYWdlCi0gICAgICAgICAqIHRocm91Z2ggdGhlIGhhbmRsZXIgY2hhaW4uCi0gICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgSGFzaFNldDxTdHJpbmc+IHJvbGVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigzKTsKLSAgICAgICAgLy8gSkFYLVdTIDEwLjEuMS4xIGRlZmF1bHRzOgotICAgICAgICAvLyBTT0FQIDEuMQotICAgICAgICByb2xlcy5hZGQoU09BUENvbnN0YW50cy5VUklfU09BUF9BQ1RPUl9ORVhUKTsKLSAgICAgICAgLy8gU09BUCAxLjIKLSAgICAgICAgcm9sZXMuYWRkKFNPQVBDb25zdGFudHMuVVJJX1NPQVBfMV8yX1JPTEVfVUxUSU1BVEVfUkVDRUlWRVIpOwotICAgICAgICByb2xlcy5hZGQoU09BUENvbnN0YW50cy5VUklfU09BUF8xXzJfUk9MRV9ORVhUKTsKLSAgICAgICAgcmV0dXJuIHJvbGVzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2UoU09BUE1lc3NhZ2Ugc29hcG1lc3NhZ2UpIHsKLSAgICAgICAgLy8gVE9ETyBJIGRvbid0IGxpa2UgdGhpcyBhdCBhbGwuCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBNZXNzYWdlIG1zZyA9Ci0gICAgICAgICAgICAgICAgICAgICgoTWVzc2FnZUZhY3RvcnkpIEZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KE1lc3NhZ2VGYWN0b3J5LmNsYXNzKSkuY3JlYXRlRnJvbShzb2FwbWVzc2FnZSk7Ci0gICAgICAgICAgICBtZXNzYWdlQ3R4LmdldE1FUENvbnRleHQoKS5zZXRNZXNzYWdlKG1zZyk7Ci0gICAgICAgICAgICBjYWNoZWRNZXNzYWdlID0gbXNnOwotICAgICAgICAgICAgY2FjaGVkU29hcE1lc3NhZ2UgPSBzb2FwbWVzc2FnZTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIFRPRE8gbG9nIGl0LCBhbmQgdGhyb3cgc29tZXRoaW5nPwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgUm9sZVBsYXllciBnZXRSb2xlUGxheWVyKCkgewotICAgICAgICBMaXN0IHJvbGVzID0gbmV3IEFycmF5TGlzdChnZXRSb2xlcygpKTsKLSAgICAgICAgcmV0dXJuIG5ldyBTTUNSb2xlUGxheWVyKHJvbGVzKTsKLSAgICB9Ci0gICAgCi0gICAgY2xhc3MgU01DUm9sZVBsYXllciBpbXBsZW1lbnRzIFJvbGVQbGF5ZXIgewotICAgICAgICBwcml2YXRlIExpc3Qgcm9sZXM7Ci0gICAgICAgIFNNQ1JvbGVQbGF5ZXIoTGlzdCByb2xlcykgewotICAgICAgICAgICAgdGhpcy5yb2xlcyA9IHJvbGVzOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgTGlzdCBnZXRSb2xlcygpIHsKLSAgICAgICAgICAgIHJldHVybiByb2xlczsKLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1VsdGltYXRlRGVzdGluYXRpb24oKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2hhbmRsZXIvVHJhbnNwb3J0SGVhZGVyc0FkYXB0ZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2hhbmRsZXIvVHJhbnNwb3J0SGVhZGVyc0FkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZkODdhOS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9oYW5kbGVyL1RyYW5zcG9ydEhlYWRlcnNBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5oYW5kbGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmkxOG4uTWVzc2FnZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuRXhjZXB0aW9uRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLk1lc3NhZ2VDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkhUVFBDb25zdGFudHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLlNldDsNCi0NCi0vKioNCi0gKiBUaGUgSkFYLVdTIGV4cG9zZXMgdHJhbnNwb3J0IHByb3BlcnRpZXMgd2hvc2UgdmFsdWUgaXMgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+Pi4gIFRoZQ0KLSAqIFN0cmluZyBpcyB0aGUgY29udGVudC1pZCBhbmQgRGF0YUhhbmRsZXIgaXMgdGhlIGRhdGEgaGFuZGxlciByZXByZXNlbnRpbmcgdGhlIFRyYW5zcG9ydEhlYWRlcnMuDQotICogDQotICogVGhlIEpBWC1XUyBNZXNzYWdlQ29udGV4dCBzdG9yZXMgdHJhbnNwb3J0IHByb3BlcnRpZXMgaW4gYW4gTWFwIG9iamVjdCBsb2NhdGVkIG9uIHRoZSBBWElTMg0KLSAqIE1lc3NhZ2VDb250ZXh0Lg0KLSAqIA0KLSAqIFRoaXMgY2xhc3MsIFRyYW5zcG9ydEhlYWRlcnNBZGFwdGVyLCBpcyBhbiBhZGFwdGVyIGJldHdlZW4gdGhlIE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gDQotICogaW50ZXJmYWNlIG5lZWRlZCBieSB0aGUgcHJvcGVydGllcyBhbmQgdGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbi4gIA0KLSAqIEFsbCB1c2VmdWwgZnVuY3Rpb24gaXMgZGVsZWdhdGVkIHRocm91Z2ggdGhlIE1lc3NhZ2VDb250ZXh0LCANCi0gKiBzbyB0aGF0IHdlIG9ubHkgaGF2ZSBvbmUgY29weSBvZiB0aGUgaW5mb3JtYXRpb24uICANCi0gKiANCi0gKiBUbyB1c2UgdGhpcyBjbGFzcywgaW52b2tlIHRoZSBpbnN0YWxsIG1ldGhvZC4gIFRoaXMgd2lsbCBjcmVhdGUgYW4gVHJhbnNwb3J0SGVhZGVyc0FkYXB0ZXIgDQotICogKGlmIG5lY2Vzc2FyeSkgYW5kIGluc3RhbGwgaXQgb24gdGhlIHByb3BlcnR5IEpBWC1XUyBzdGFuZGFyZCBUcmFuc3BvcnRIZWFkZXJzIHByb3BlcnRpZXMuICANCi0gKiAoU2VlIEJhc2VNZXNzYWdlQ29udGV4dC4pDQotICovDQotcHVibGljIGNsYXNzIFRyYW5zcG9ydEhlYWRlcnNBZGFwdGVyIGltcGxlbWVudHMgTWFwIHsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFRyYW5zcG9ydEhlYWRlcnNBZGFwdGVyLmNsYXNzKTsNCi0NCi0gICAgTWVzc2FnZUNvbnRleHQgbWM7IC8vIE1lc3NhZ2VDb250ZXh0IHdoaWNoIHByb3ZpZGVzIHRoZSBiYWNraW5nIGltcGxlbWVudGF0aW9uDQotICAgIFN0cmluZyBwcm9wZXJ0eU5hbWU7IC8vIFRoZSBuYW1lIG9mIHRoZSBKQVgtV1MgcHJvcGVydHkNCi0NCi0gICAgLyoqDQotICAgICAqIEBwYXJhbSBtYw0KLSAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lDQotICAgICAqLw0KLSAgICBwcml2YXRlIFRyYW5zcG9ydEhlYWRlcnNBZGFwdGVyKE1lc3NhZ2VDb250ZXh0IG1jLCBTdHJpbmcgcHJvcGVydHlOYW1lKSB7DQotICAgICAgICB0aGlzLm1jID0gbWM7DQotICAgICAgICB0aGlzLnByb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogQWRkIHRoZSBUcmFuc3BvcnRIZWFkZXJzQWRhcHRlciBhcyB0aGUgcHJvcGVydHkgZm9yIFRyYW5zcG9ydEhlYWRlcnMNCi0gICAgICogQHBhcmFtIG1jIE1lc3NhZ2VDb250ZXh0DQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgaW5zdGFsbChNZXNzYWdlQ29udGV4dCBtYykgew0KLQ0KLSAgICAgICAgYm9vbGVhbiBpc1JlcXVlc3QgPSAobWMuZ2V0TUVQQ29udGV4dCgpLmdldFJlcXVlc3RNZXNzYWdlQ29udGV4dCgpID09IG1jKTsNCi0NCi0gICAgICAgIC8vIFRoZSBwcm9wZXJ0eSBpcyBlaXRoZXIgYSByZXF1ZXN0IG9yIHJlc3BvbnNlDQotICAgICAgICBTdHJpbmcgcHJvcGVydHlOYW1lID0NCi0gICAgICAgICAgICAgICAgKGlzUmVxdWVzdCkgPyBqYXZheC54bWwud3MuaGFuZGxlci5NZXNzYWdlQ29udGV4dC5IVFRQX1JFUVVFU1RfSEVBREVSUw0KLSAgICAgICAgICAgICAgICAgICAgICAgIDogamF2YXgueG1sLndzLmhhbmRsZXIuTWVzc2FnZUNvbnRleHQuSFRUUF9SRVNQT05TRV9IRUFERVJTOw0KLQ0KLQ0KLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKCJJbnN0YWxsaW5nIFRyYW5zcG9ydEhlYWRlcnNBZGFwdGVyIGZvciAiICsgcHJvcGVydHlOYW1lKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vIFNlZSBpZiB0aGVyZSBpcyBhbiBleGlzdGluZyBtYXANCi0gICAgICAgIE9iamVjdCBtYXAgPSBtYy5nZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOw0KLQ0KLSAgICAgICAgLy8gUmV1c2UgZXhpc3RpbmcgVHJhbnNwb3J0SGVhZGVyc0FkYXB0ZXINCi0gICAgICAgIGlmIChtYXAgaW5zdGFuY2VvZiBUcmFuc3BvcnRIZWFkZXJzQWRhcHRlcikgew0KLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkFuIFRyYW5zcG9ydEhlYWRlcnNBZGFwdGVyIGlzIGFscmVhZHkgaW5zdGFsbGVkLiAgIiArDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmV1c2luZyB0aGUgZXhpc3Rpbmcgb25lLiIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotDQotICAgICAgICAvLyBDcmVhdGUgYSBuZXcgVHJhbnNwb3J0SGVhZGVyc0FkYXB0ZXIgYW5kIHNldCBpdCBvbiB0aGUgcHJvcGVydHkgDQotICAgICAgICBUcmFuc3BvcnRIZWFkZXJzQWRhcHRlciB0aGEgPSBuZXcgVHJhbnNwb3J0SGVhZGVyc0FkYXB0ZXIobWMsIHByb3BlcnR5TmFtZSk7DQotDQotICAgICAgICBpZiAobWFwICE9IG51bGwpIHsNCi0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJUaGUgVHJhbnNwb3J0SGVhZGVycyBpbiB0aGUgZXhpc3RpbmcgbWFwICgiICsgcHJvcGVydHlOYW1lDQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiKSBhcmUgY29waWVkIHRvIHRoZSBUcmFuc3BvcnRIZWFkZXJzQWRhcHRlci4iKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgLy8gQ29weSB0aGUgZXhpc3RpbmcgTWFwIGNvbnRlbnRzIHRvIHRoaXMgbmV3IGFkYXB0ZXINCi0gICAgICAgICAgICB0aGEucHV0QWxsKChNYXApIG1hcCk7DQotICAgICAgICB9DQotICAgICAgICBtYy5zZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHRoYSk7DQotICAgICAgICANCi0gICAgICAgIC8vIElmIHRoaXMgaXMgYSByZXNwb25zZSwgdGhlbiBhbHNvIHNldCB0aGUgcHJvcGVydHkgZm9yIHRoZSByZXNwb25zZSBjb2RlDQotICAgICAgICBpZiAoIWlzUmVxdWVzdCkgew0KLSAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IG1jLmdldFByb3BlcnR5KEhUVFBDb25zdGFudHMuTUNfSFRUUF9TVEFUVVNfQ09ERSk7DQotICAgICAgICAgICAgbWMuc2V0UHJvcGVydHkoamF2YXgueG1sLndzLmhhbmRsZXIuTWVzc2FnZUNvbnRleHQuSFRUUF9SRVNQT05TRV9DT0RFLCB2YWx1ZSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIEdldC9DcmVhdGUgdGhlIGltcGxlbWVudGF0aW9uIG1hcCBmcm9tIHRoZSBBeGlzMiBwcm9wZXJ0aWVzDQotICAgICAqIEBwYXJhbSBtYw0KLSAgICAgKiBAcmV0dXJuIE1hcA0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBzdGF0aWMgTWFwIGdldERlbGVnYXRlTWFwKE1lc3NhZ2VDb250ZXh0IG1jKSB7DQotICAgICAgICAvLyBHZXQgdGhlIGF4aXMyIE1hcA0KLSAgICAgICAgTWFwIG1hcCA9IChNYXApIG1jLmdldFByb3BlcnR5KG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dC5UUkFOU1BPUlRfSEVBREVSUyk7DQotICAgICAgICBpZiAobWFwID09IG51bGwpIHsNCi0gICAgICAgICAgICBtYXAgPSBuZXcgSGFzaE1hcCgpOw0KLSAgICAgICAgICAgIG1jLnNldFByb3BlcnR5KG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dC5UUkFOU1BPUlRfSEVBREVSUywgbWFwKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBtYXA7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIENvbnZlcnQgaW50cHV0IGludG8gYSBMaXN0DQotICAgICAqIEBwYXJhbSBvDQotICAgICAqIEByZXR1cm4gTGlzdA0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxTdHJpbmc+IGNvbnZlcnRUb0xpc3QoT2JqZWN0IG8pIHsNCi0gICAgICAgIGlmIChvID09IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0gZWxzZSBpZiAobyBpbnN0YW5jZW9mIExpc3QpIHsNCi0gICAgICAgICAgICByZXR1cm4gKExpc3QpIG87DQotICAgICAgICB9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBTdHJpbmcpIHsNCi0gICAgICAgICAgICBMaXN0IGwgPSBuZXcgQXJyYXlMaXN0KCk7DQotICAgICAgICAgICAgbC5hZGQobyk7DQotICAgICAgICAgICAgcmV0dXJuIGw7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oDQotICAgICAgICAgICAgCQlNZXNzYWdlcy5nZXRNZXNzYWdlKCJpbnB1dENvbnZlcnRpb25FcnIiLG8uZ2V0Q2xhc3MoKS50b1N0cmluZygpKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhPYmplY3Qgbykgew0KLSAgICAgICAgaWYgKG8gPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfSBlbHNlIGlmIChvIGluc3RhbmNlb2YgU3RyaW5nKSB7DQotICAgICAgICAgICAgcmV0dXJuIChTdHJpbmcpIG87DQotICAgICAgICB9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBMaXN0KSB7DQotDQotICAgICAgICAgICAgTGlzdCBsID0gKExpc3QpIG87DQotICAgICAgICAgICAgaWYgKGwuc2l6ZSgpID09IDApIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICAgICAgfSBlbHNlIGlmIChsLnNpemUoKSA9PSAxKSB7DQotICAgICAgICAgICAgICAgIHJldHVybiAoU3RyaW5nKSBsLmdldCgwKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKA0KLSAgICAgICAgCQlNZXNzYWdlcy5nZXRNZXNzYWdlKCJpbnB1dENvbnZlcnRpb25FcnIxIixvLmdldENsYXNzKCkudG9TdHJpbmcoKSkpOw0KLSAgICB9DQotDQotDQotICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsNCi0gICAgICAgIHJldHVybiBnZXREZWxlZ2F0ZU1hcChtYykuc2l6ZSgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7DQotICAgICAgICByZXR1cm4gZ2V0RGVsZWdhdGVNYXAobWMpLmlzRW1wdHkoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0tleShPYmplY3Qga2V5KSB7DQotICAgICAgICByZXR1cm4gZ2V0RGVsZWdhdGVNYXAobWMpLmNvbnRhaW5zS2V5KGtleSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNWYWx1ZShPYmplY3QgdmFsdWUpIHsNCi0gICAgICAgIC8vIFRPRE8gU2hvdWxkIHdhbGsgYWxsIG9mIHRoZSB2YWx1ZXMgdG8gZG8gdGhpcyBjb3JyZWN0bHkuDQotICAgICAgICBTdHJpbmcgdmFsdWVTdHJpbmcgPSBjb252ZXJ0VG9TdHJpbmcodmFsdWUpOw0KLSAgICAgICAgcmV0dXJuIGdldERlbGVnYXRlTWFwKG1jKS5jb250YWluc1ZhbHVlKHZhbHVlU3RyaW5nKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgT2JqZWN0IGdldChPYmplY3Qga2V5KSB7DQotICAgICAgICBPYmplY3QgdmFsdWUgPSBjb252ZXJ0VG9MaXN0KGdldERlbGVnYXRlTWFwKG1jKS5nZXQoa2V5KSk7DQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcoImdldCgiICsga2V5ICsgIikgcmV0dXJucyB2YWx1ZT0iICsgdmFsdWUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHZhbHVlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBPYmplY3QgcHV0KE9iamVjdCBrZXksIE9iamVjdCB2YWx1ZSkgew0KLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKCJwdXQoIiArIGtleSArICIgLCAiICsgdmFsdWUgKyAiKSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgU3RyaW5nIHZhbHVlU3RyaW5nID0gY29udmVydFRvU3RyaW5nKHZhbHVlKTsNCi0gICAgICAgIHJldHVybiBjb252ZXJ0VG9MaXN0KGdldERlbGVnYXRlTWFwKG1jKS5wdXQoa2V5LCB2YWx1ZVN0cmluZykpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBPYmplY3QgcmVtb3ZlKE9iamVjdCBrZXkpIHsNCi0gICAgICAgIHJldHVybiBjb252ZXJ0VG9MaXN0KGdldERlbGVnYXRlTWFwKG1jKS5yZW1vdmUoa2V5KSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgcHV0QWxsKE1hcCB0KSB7DQotICAgICAgICBmb3IgKE9iamVjdCBrZXkgOiB0LmtleVNldCgpKSB7DQotICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gdC5nZXQoa2V5KTsNCi0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJwdXQgdmlhIHB1dEFsbCAoIiArIGtleSArICIgLCAiICsgdmFsdWUgKyAiKSIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBwdXQoa2V5LCB2YWx1ZSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgY2xlYXIoKSB7DQotICAgICAgICBnZXREZWxlZ2F0ZU1hcChtYykuY2xlYXIoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU2V0IGtleVNldCgpIHsNCi0gICAgICAgIHJldHVybiBnZXREZWxlZ2F0ZU1hcChtYykua2V5U2V0KCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIENvbGxlY3Rpb24gdmFsdWVzKCkgew0KLSAgICAgICAgcmV0dXJuIGNvcHkoKS52YWx1ZXMoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU2V0IGVudHJ5U2V0KCkgew0KLSAgICAgICAgcmV0dXJuIGNvcHkoKS5lbnRyeVNldCgpOw0KLSAgICB9DQotICAgIA0KLSAgICBwcml2YXRlIE1hcCBjb3B5KCkgew0KLSAgICAgICAgTWFwIHRlbXBNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4oKTsNCi0gICAgICAgIGZvciAoT2JqZWN0IGtleSA6IGtleVNldCgpKSB7DQotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHZhbHVlID0gKExpc3Q8U3RyaW5nPilnZXQoa2V5KTsNCi0gICAgICAgICAgICB0ZW1wTWFwLnB1dChrZXksIHZhbHVlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB0ZW1wTWFwOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KLSAgICAgICAgcmV0dXJuICJUcmFuc3BvcnRIZWFkZXJzQWRhcHRlcjogIiArIGdldERlbGVnYXRlTWFwKG1jKS50b1N0cmluZygpOyAgICAgICAgDQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvaGFuZGxlci9mYWN0b3J5L0hhbmRsZXJJbnZva2VyRmFjdG9yeS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvaGFuZGxlci9mYWN0b3J5L0hhbmRsZXJJbnZva2VyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzQ1Njc4Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2hhbmRsZXIvZmFjdG9yeS9IYW5kbGVySW52b2tlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaGFuZGxlci5mYWN0b3J5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUuTWVzc2FnZUNvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaGFuZGxlci5IYW5kbGVySW52b2tlcjsNCi0NCi0vKioNCi0gKiBJbXBsZW1lbnRhdGlvbnMgb2YgdGhpcyBpbnRlcmZhY2UgaXMgY2FsbGVkIGJ5IHRoZSBFbmRwb2ludENvbnRyb2xsZXIgDQotICogaW4gSkFYLVdTIGluIG9yZGVyIHRvIHNlcnZlIHVwIGFuIGluc3RhbmNlIG9mIGEgSGFuZGxlckludm9rZXIuIA0KLSAqIEltcGxlbWVudGF0aW9ucyBjYW4gYmUgcmVnaXN0ZXJlZCB2aWEgdGhlIEZhY3RvcnlSZWdpc3RyeS4NCi0gKg0KLSAqLw0KLXB1YmxpYyBpbnRlcmZhY2UgSGFuZGxlckludm9rZXJGYWN0b3J5IHsNCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBSZXR1cm5zIGFuIGluc3RhbmNlIG9mIHRoZSBIYW5kbGVySW52b2tlciBjbGFzcy4NCi0gICAgICovDQotICAgIHB1YmxpYyBIYW5kbGVySW52b2tlciBjcmVhdGVIYW5kbGVySW52b2tlcihNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCk7DQotDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2hhbmRsZXIvZmFjdG9yeS9IYW5kbGVyUG9zdEludm9rZXJGYWN0b3J5LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9oYW5kbGVyL2ZhY3RvcnkvSGFuZGxlclBvc3RJbnZva2VyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDc4NjVmLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2hhbmRsZXIvZmFjdG9yeS9IYW5kbGVyUG9zdEludm9rZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmhhbmRsZXIuZmFjdG9yeTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5oYW5kbGVyLkhhbmRsZXJQb3N0SW52b2tlcjsNCi0NCi0vKioNCi0gKiBIYW5kbGVyUG9zdEludm9rZXJGYWN0b3J5IGlzIHVzZWQgdG8gY3JlYXRlIGEgSGFuZGxlclBvc3RJbnZva2VyDQotICogaW1wbGVtZW50YXRpb24gY2xhc3MgdGhhdCB3aWxsIGJlIGNhbGxlZCBqdXN0IGFmdGVyIGVhY2gNCi0gKiBKQVhXUyBoYW5kbGVyLmhhbmRsZU1lc3NhZ2UgaW52b2NhdGlvbi4NCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIEhhbmRsZXJQb3N0SW52b2tlckZhY3Rvcnkgew0KLQ0KLQlwdWJsaWMgSGFuZGxlclBvc3RJbnZva2VyIGNyZWF0ZUhhbmRsZXJQb3N0SW52b2tlcigpOw0KLQkNCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvaGFuZGxlci9mYWN0b3J5L0hhbmRsZXJQcmVJbnZva2VyRmFjdG9yeS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvaGFuZGxlci9mYWN0b3J5L0hhbmRsZXJQcmVJbnZva2VyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDczN2IwLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2hhbmRsZXIvZmFjdG9yeS9IYW5kbGVyUHJlSW52b2tlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaGFuZGxlci5mYWN0b3J5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmhhbmRsZXIuSGFuZGxlclByZUludm9rZXI7DQotDQotLyoqDQotICogSGFuZGxlclByZUludm9rZXJGYWN0b3J5IGlzIHVzZWQgdG8gY3JlYXRlIGEgSGFuZGxlclByZUludm9rZXINCi0gKiBpbXBsZW1lbnRhdGlvbiBjbGFzcyB0aGF0IHdpbGwgYmUgY2FsbGVkIGp1c3QgcHJpb3IgdG8gZWFjaA0KLSAqIEpBWFdTIGhhbmRsZXIuaGFuZGxlTWVzc2FnZSBpbnZvY2F0aW9uLg0KLSAqLw0KLXB1YmxpYyBpbnRlcmZhY2UgSGFuZGxlclByZUludm9rZXJGYWN0b3J5IHsNCi0JDQotCXB1YmxpYyBIYW5kbGVyUHJlSW52b2tlciBjcmVhdGVIYW5kbGVyUHJlSW52b2tlcigpOw0KLQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9oYW5kbGVyL2ZhY3RvcnkvaW1wbC9IYW5kbGVySW52b2tlckZhY3RvcnlJbXBsLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9oYW5kbGVyL2ZhY3RvcnkvaW1wbC9IYW5kbGVySW52b2tlckZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2MmNiN2UuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvaGFuZGxlci9mYWN0b3J5L2ltcGwvSGFuZGxlckludm9rZXJGYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5oYW5kbGVyLmZhY3RvcnkuaW1wbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLk1lc3NhZ2VDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmhhbmRsZXIuSGFuZGxlckludm9rZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaGFuZGxlci5mYWN0b3J5LkhhbmRsZXJJbnZva2VyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5oYW5kbGVyLmltcGwuSGFuZGxlckludm9rZXJJbXBsOw0KLQ0KLS8qKg0KLSAqIFRoaXMgaXMgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIEhhbmRsZXJJbnZva2VyRmFjdG9yeSwgDQotICogYW5kIGl0IHdpbGwgYmUgcmVnaXN0ZXJlZCB3aXRoIHRoZSBGYWN0b3J5UmVnaXN0cnkuDQotICoNCi0gKi8NCi1wdWJsaWMgY2xhc3MgSGFuZGxlckludm9rZXJGYWN0b3J5SW1wbCBpbXBsZW1lbnRzIEhhbmRsZXJJbnZva2VyRmFjdG9yeSB7DQotDQotICAgIHB1YmxpYyBIYW5kbGVySW52b2tlciBjcmVhdGVIYW5kbGVySW52b2tlcihNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCkgew0KLSAgICAgICAgcmV0dXJuIG5ldyBIYW5kbGVySW52b2tlckltcGwoKTsNCi0gICAgfQ0KLSAgICANCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvaGFuZGxlci9mYWN0b3J5L2ltcGwvSGFuZGxlclBvc3RJbnZva2VyRmFjdG9yeUltcGwuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2hhbmRsZXIvZmFjdG9yeS9pbXBsL0hhbmRsZXJQb3N0SW52b2tlckZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4MmZjZDMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvaGFuZGxlci9mYWN0b3J5L2ltcGwvSGFuZGxlclBvc3RJbnZva2VyRmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaGFuZGxlci5mYWN0b3J5LmltcGw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaGFuZGxlci5IYW5kbGVyUG9zdEludm9rZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaGFuZGxlci5mYWN0b3J5LkhhbmRsZXJQb3N0SW52b2tlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaGFuZGxlci5pbXBsLkhhbmRsZXJQb3N0SW52b2tlckltcGw7DQotDQotLyoqDQotICogSGFuZGxlclBvc3RJbnZva2VyRmFjdG9yeUltcGwgLSB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbg0KLSAqIG9mIEhhbmRsZXJQb3N0SW52b2tlckZhY3RvcnkuICBBbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHNob3VsZA0KLSAqIGJlIHJlZ2lzdGVyZWQgd2l0aCB0aGUgRmFjdG9yeVJlZ2lzdHJ5Lg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBIYW5kbGVyUG9zdEludm9rZXJGYWN0b3J5SW1wbCBpbXBsZW1lbnRzIEhhbmRsZXJQb3N0SW52b2tlckZhY3Rvcnkgew0KLQ0KLQlwdWJsaWMgSGFuZGxlclBvc3RJbnZva2VyIGNyZWF0ZUhhbmRsZXJQb3N0SW52b2tlcigpIHsNCi0JCXJldHVybiBuZXcgSGFuZGxlclBvc3RJbnZva2VySW1wbCgpOw0KLQl9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2hhbmRsZXIvZmFjdG9yeS9pbXBsL0hhbmRsZXJQcmVJbnZva2VyRmFjdG9yeUltcGwuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2hhbmRsZXIvZmFjdG9yeS9pbXBsL0hhbmRsZXJQcmVJbnZva2VyRmFjdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzFhZmJkZi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9oYW5kbGVyL2ZhY3RvcnkvaW1wbC9IYW5kbGVyUHJlSW52b2tlckZhY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmhhbmRsZXIuZmFjdG9yeS5pbXBsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmhhbmRsZXIuSGFuZGxlclByZUludm9rZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaGFuZGxlci5mYWN0b3J5LkhhbmRsZXJQcmVJbnZva2VyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5oYW5kbGVyLmltcGwuSGFuZGxlclByZUludm9rZXJJbXBsOw0KLQ0KLS8qKg0KLSAqIEhhbmRsZXJQcmVJbnZva2VyRmFjdG9yeUltcGwgLSB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbg0KLSAqIG9mIEhhbmRsZXJQcmVJbnZva2VyRmFjdG9yeS4gIEFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgc2hvdWxkDQotICogYmUgcmVnaXN0ZXJlZCB3aXRoIHRoZSBGYWN0b3J5UmVnaXN0cnkuDQotICovDQotcHVibGljIGNsYXNzIEhhbmRsZXJQcmVJbnZva2VyRmFjdG9yeUltcGwgaW1wbGVtZW50cyBIYW5kbGVyUHJlSW52b2tlckZhY3Rvcnkgew0KLQ0KLQlwdWJsaWMgSGFuZGxlclByZUludm9rZXIgY3JlYXRlSGFuZGxlclByZUludm9rZXIoKSB7DQotCQlyZXR1cm4gbmV3IEhhbmRsZXJQcmVJbnZva2VySW1wbCgpOw0KLQl9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2hhbmRsZXIvaW1wbC9IYW5kbGVySW52b2tlckltcGwuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2hhbmRsZXIvaW1wbC9IYW5kbGVySW52b2tlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFkOWYzNS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9oYW5kbGVyL2ltcGwvSGFuZGxlckludm9rZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmhhbmRsZXIuaW1wbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5oYW5kbGVyLkhhbmRsZXJJbnZvY2F0aW9uQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5oYW5kbGVyLkhhbmRsZXJJbnZva2VyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmhhbmRsZXIuSGFuZGxlckludm9rZXJVdGlsczsNCi0NCi0vKioNCi0gKiBUaGlzIGNsYXNzIHdpbGwgYmUgcmVzcG9uc2libGUgZm9yIGRyaXZpbmcgYm90aCBpbmJvdW5kIGFuZA0KLSAqIG91dGJvdW5kIGhhbmRsZXIgY2hhaW5zIGZvciBhbiBlbmRwb2ludCBpbnZvY2F0aW9uLg0KLSAqDQotICovDQotcHVibGljIGNsYXNzIEhhbmRsZXJJbnZva2VySW1wbCBpbXBsZW1lbnRzIEhhbmRsZXJJbnZva2VyIHsNCi0NCi0gICAgLyoqDQotICAgICAqIFRoaXMgaW52b2tlcyB0aGUgaW5ib3VuZCBoYW5kbGVycyBmb3IgdGhlIGludm9jYXRpb24uDQotICAgICAqLw0KLSAgICBwdWJsaWMgYm9vbGVhbiBpbnZva2VJbmJvdW5kSGFuZGxlcnMoSGFuZGxlckludm9jYXRpb25Db250ZXh0IGNvbnRleHQpIHsNCi0gICAgICAgIHJldHVybiBIYW5kbGVySW52b2tlclV0aWxzLmludm9rZUluYm91bmRIYW5kbGVycyhjb250ZXh0LmdldE1lc3NhZ2VDb250ZXh0KCkuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRNRVBDb250ZXh0KCksIGNvbnRleHQuZ2V0SGFuZGxlcnMoKSwgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmdldE1FUCgpLCBjb250ZXh0LmlzT25lV2F5KCkpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBUaGlzIGludm9rZXMgdGhlIG91dGJvdW5kIGhhbmRsZXJzIGZvciB0aGUgaW52b2NhdGlvbi4NCi0gICAgICovDQotICAgIHB1YmxpYyBib29sZWFuIGludm9rZU91dGJvdW5kSGFuZGxlcnMoSGFuZGxlckludm9jYXRpb25Db250ZXh0IGNvbnRleHQpIHsNCi0gICAgICAgIHJldHVybiBIYW5kbGVySW52b2tlclV0aWxzLmludm9rZU91dGJvdW5kSGFuZGxlcnMoY29udGV4dC5nZXRNZXNzYWdlQ29udGV4dCgpLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE1FUENvbnRleHQoKSwgY29udGV4dC5nZXRIYW5kbGVycygpLCANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmdldE1FUCgpLCBjb250ZXh0LmlzT25lV2F5KCkpOw0KLSAgICB9DQotICAgIA0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9oYW5kbGVyL2ltcGwvSGFuZGxlclBvc3RJbnZva2VySW1wbC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvaGFuZGxlci9pbXBsL0hhbmRsZXJQb3N0SW52b2tlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZkNDgxNC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9oYW5kbGVyL2ltcGwvSGFuZGxlclBvc3RJbnZva2VySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5oYW5kbGVyLmltcGw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaGFuZGxlci5IYW5kbGVyUG9zdEludm9rZXI7DQotDQotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLk1lc3NhZ2VDb250ZXh0Ow0KLQ0KLXB1YmxpYyBjbGFzcyBIYW5kbGVyUG9zdEludm9rZXJJbXBsIGltcGxlbWVudHMgSGFuZGxlclBvc3RJbnZva2VyIHsNCi0NCi0JcHVibGljIHZvaWQgcG9zdEludm9rZShNZXNzYWdlQ29udGV4dCBtYykgew0KLQkJLy8gdGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGlzIGEgbm8tb3ANCi0JfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9oYW5kbGVyL2ltcGwvSGFuZGxlclByZUludm9rZXJJbXBsLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9oYW5kbGVyL2ltcGwvSGFuZGxlclByZUludm9rZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2NzE1MmIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvaGFuZGxlci9pbXBsL0hhbmRsZXJQcmVJbnZva2VySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5oYW5kbGVyLmltcGw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaGFuZGxlci5IYW5kbGVyUHJlSW52b2tlcjsNCi0NCi1pbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuTWVzc2FnZUNvbnRleHQ7DQotDQotcHVibGljIGNsYXNzIEhhbmRsZXJQcmVJbnZva2VySW1wbCBpbXBsZW1lbnRzIEhhbmRsZXJQcmVJbnZva2VyIHsNCi0NCi0JcHVibGljIHZvaWQgcHJlSW52b2tlKE1lc3NhZ2VDb250ZXh0IG1jKSB7DQotCQkvLyB0aGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gaXMgYSBuby1vcA0KLQl9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2hhbmRsZXIvbGlmZWN5Y2xlL2ZhY3RvcnkvSGFuZGxlckxpZmVjeWNsZU1hbmFnZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2hhbmRsZXIvbGlmZWN5Y2xlL2ZhY3RvcnkvSGFuZGxlckxpZmVjeWNsZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdkNTYyOS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9oYW5kbGVyL2xpZmVjeWNsZS9mYWN0b3J5L0hhbmRsZXJMaWZlY3ljbGVNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaGFuZGxlci5saWZlY3ljbGUuZmFjdG9yeTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmluamVjdGlvbi5SZXNvdXJjZUluamVjdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmxpZmVjeWNsZS5MaWZlY3ljbGVFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5IYW5kbGVyOwotCi0vKgotICogSGFuZGxlckxpZmVjeWNsZU1hbmFnZXIgaXMgcmVzcG9uc2libGUgdG8gaW52b2tlIGxpZnljeWNsZSBtZXRob2RzIG9uIEhhbmRsZXIuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSGFuZGxlckxpZmVjeWNsZU1hbmFnZXIgewotCi0gICAgcHVibGljIEhhbmRsZXIgY3JlYXRlSGFuZGxlckluc3RhbmNlKE1lc3NhZ2VDb250ZXh0IG1jLCBDbGFzcyBoYW5kbGVyQ2xhc3MpCi0gICAgICAgICAgICB0aHJvd3MgTGlmZWN5Y2xlRXhjZXB0aW9uLCBSZXNvdXJjZUluamVjdGlvbkV4Y2VwdGlvbjsKLQotICAgIHB1YmxpYyB2b2lkIGRlc3Ryb3lIYW5kbGVySW5zdGFuY2UoTWVzc2FnZUNvbnRleHQgbWMsIEhhbmRsZXIgaGFuZGxlcikKLSAgICAJCXRocm93cyBMaWZlY3ljbGVFeGNlcHRpb24sIFJlc291cmNlSW5qZWN0aW9uRXhjZXB0aW9uOwotICAgIAotICAgIC8qCi0gICAgICAqIEludm9rZXMgbWV0aG9kIG9uIGVuZHBvaW50IG1hcmtlZCB3aXRoIEBQb3N0Q29uc3RydWN0IGFubm90YXRpb24uCi0gICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGludm9rZVBvc3RDb25zdHJ1Y3QoKSB0aHJvd3MgTGlmZWN5Y2xlRXhjZXB0aW9uOwotCi0gICAgLyoKLSAgICAgICogSW52b2tlcyBtZXRob2Qgb24gZW5kcG9pbnQgbWFya2VkIHdpdGggQHByZURlc3Ryb3kgYW5ub3RhdGlvbi4KLSAgICAgICovCi0gICAgcHVibGljIHZvaWQgaW52b2tlUHJlRGVzdHJveSgpIHRocm93cyBMaWZlY3ljbGVFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9oYW5kbGVyL2xpZmVjeWNsZS9mYWN0b3J5L0hhbmRsZXJMaWZlY3ljbGVNYW5hZ2VyRmFjdG9yeS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvaGFuZGxlci9saWZlY3ljbGUvZmFjdG9yeS9IYW5kbGVyTGlmZWN5Y2xlTWFuYWdlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWViZjBjYS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9oYW5kbGVyL2xpZmVjeWNsZS9mYWN0b3J5L0hhbmRsZXJMaWZlY3ljbGVNYW5hZ2VyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmhhbmRsZXIubGlmZWN5Y2xlLmZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmhhbmRsZXIubGlmZWN5Y2xlLmltcGwuSGFuZGxlckxpZmVjeWNsZU1hbmFnZXJJbXBsOwotCi1wdWJsaWMgY2xhc3MgSGFuZGxlckxpZmVjeWNsZU1hbmFnZXJGYWN0b3J5IHsKLQotICAgIHB1YmxpYyBIYW5kbGVyTGlmZWN5Y2xlTWFuYWdlckZhY3RvcnkoKSB7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBIYW5kbGVyTGlmZWN5Y2xlTWFuYWdlciBjcmVhdGVIYW5kbGVyTGlmZWN5Y2xlTWFuYWdlcigpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBIYW5kbGVyTGlmZWN5Y2xlTWFuYWdlckltcGwoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9oYW5kbGVyL2xpZmVjeWNsZS9pbXBsL0hhbmRsZXJMaWZlY3ljbGVNYW5hZ2VySW1wbC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvaGFuZGxlci9saWZlY3ljbGUvaW1wbC9IYW5kbGVyTGlmZWN5Y2xlTWFuYWdlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA4ZTRkYS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9oYW5kbGVyL2xpZmVjeWNsZS9pbXBsL0hhbmRsZXJMaWZlY3ljbGVNYW5hZ2VySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmhhbmRsZXIubGlmZWN5Y2xlLmltcGw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLkV4Y2VwdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uU2VydmljZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaGFuZGxlci5saWZlY3ljbGUuZmFjdG9yeS5IYW5kbGVyTGlmZWN5Y2xlTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmkxOG4uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5pbmplY3Rpb24uUmVzb3VyY2VJbmplY3Rpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5saWZlY3ljbGUuQmFzZUxpZmVjeWNsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5saWZlY3ljbGUuTGlmZWN5Y2xlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MucnVudGltZS5kZXNjcmlwdGlvbi5pbmplY3Rpb24uUmVzb3VyY2VJbmplY3Rpb25TZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MucnVudGltZS5kZXNjcmlwdGlvbi5pbmplY3Rpb24uUmVzb3VyY2VJbmplY3Rpb25TZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLkhhbmRsZXI7Ci0KLXB1YmxpYyBjbGFzcyBIYW5kbGVyTGlmZWN5Y2xlTWFuYWdlckltcGwgZXh0ZW5kcyBCYXNlTGlmZWN5Y2xlTWFuYWdlciBpbXBsZW1lbnRzIEhhbmRsZXJMaWZlY3ljbGVNYW5hZ2VyIHsKLSAgICAgICAgCi0gICAgcHVibGljIEhhbmRsZXIgY3JlYXRlSGFuZGxlckluc3RhbmNlKE1lc3NhZ2VDb250ZXh0IG1jLCBDbGFzcyBoYW5kbGVyQ2xhc3MpIHRocm93cyBMaWZlY3ljbGVFeGNlcHRpb24sIFJlc291cmNlSW5qZWN0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGhhbmRsZXJDbGFzcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5LgotICAgICAgICAgICAgICBtYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJjcmVhdGVIYW5kbGVySW5zdGFuY2VFcnIiKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzZXJ2aWNlRGVzYyA9IG1jLmdldEVuZHBvaW50RGVzY3JpcHRpb24oKS5nZXRTZXJ2aWNlRGVzY3JpcHRpb24oKTsgICAgICAgIAotICAgICAgICBSZXNvdXJjZUluamVjdGlvblNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb24gaW5qZWN0aW9uRGVzYyA9IG51bGw7Ci0gICAgICAgIGlmIChzZXJ2aWNlRGVzYyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbmplY3Rpb25EZXNjID0gUmVzb3VyY2VJbmplY3Rpb25TZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uRmFjdG9yeS5nZXQoc2VydmljZURlc2MsIGhhbmRsZXJDbGFzcyk7ICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB0aGlzLmluc3RhbmNlID0gaGFuZGxlckNsYXNzLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgIC8vSW52b2tlIFBvc3RDb25zdHJ1Y3QKLSAgICAgICAgaWYgKGluamVjdGlvbkRlc2MgIT0gbnVsbCAmJiBpbmplY3Rpb25EZXNjLmdldFBvc3RDb25zdHJ1Y3RNZXRob2QoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnZva2VQb3N0Q29uc3RydWN0KGluamVjdGlvbkRlc2MuZ2V0UG9zdENvbnN0cnVjdE1ldGhvZCgpKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIChIYW5kbGVyKXRoaXMuaW5zdGFuY2U7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIGRlc3Ryb3lIYW5kbGVySW5zdGFuY2UgY2FsbHMgdGhlIGhhbmRsZXIncyBhbm5vdGF0ZWQgUHJlRGVzdHJveSBtZXRob2QsCi0gICAgICogaWYgaXQgZXhpc3RzLiAgQSBoYW5kbGVyIGluc3RhbmNlIHRoYXQgaGFzIGJlZW4gcGFzc2VkIHRocm91Z2ggdGhpcyBtZXRob2QgU0hPVUxEIE5PVCBiZSB1c2VkIGFnYWluCi0gICAgICogCi0gICAgICogQHBhcmFtIGhhbmRsZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkZXN0cm95SGFuZGxlckluc3RhbmNlKE1lc3NhZ2VDb250ZXh0IG1jLCBIYW5kbGVyIGhhbmRsZXIpIHRocm93cyBMaWZlY3ljbGVFeGNlcHRpb24sIFJlc291cmNlSW5qZWN0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGhhbmRsZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS4KLSAgICAgICAgICAgICAgbWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiZGVzdHJveUhhbmRsZXJJbnN0YW5jZUVyciIpKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgdGhpcy5pbnN0YW5jZSA9IGhhbmRsZXI7Ci0gICAgICAgIAotICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc2VydmljZURlc2MgPSBtYy5nZXRFbmRwb2ludERlc2NyaXB0aW9uKCkuZ2V0U2VydmljZURlc2NyaXB0aW9uKCk7ICAgICAgICAKLSAgICAgICAgUmVzb3VyY2VJbmplY3Rpb25TZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uIGluamVjdGlvbkRlc2MgPSBudWxsOwotICAgICAgICBpZiAoc2VydmljZURlc2MgIT0gbnVsbCkgewotICAgICAgICAgICAgaW5qZWN0aW9uRGVzYyA9IFJlc291cmNlSW5qZWN0aW9uU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbkZhY3RvcnkuZ2V0KHNlcnZpY2VEZXNjLCBoYW5kbGVyLmdldENsYXNzKCkpOyAgICAgICAgICAgIAotICAgICAgICB9Ci0KLSAgICAgICAgLy9JbnZva2UgUHJlRGVzdHJveQotICAgICAgICBpZiAoaW5qZWN0aW9uRGVzYyAhPSBudWxsICYmIGluamVjdGlvbkRlc2MuZ2V0UHJlRGVzdHJveU1ldGhvZCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIGludm9rZVByZURlc3Ryb3koaW5qZWN0aW9uRGVzYy5nZXRQcmVEZXN0cm95TWV0aG9kKCkpOwotICAgICAgICB9Ci0gICAgfQotICAKLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2luamVjdGlvbi9SZXNvdXJjZUluamVjdGlvbkV4Y2VwdGlvbi5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvaW5qZWN0aW9uL1Jlc291cmNlSW5qZWN0aW9uRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjYjkyOTIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvaW5qZWN0aW9uL1Jlc291cmNlSW5qZWN0aW9uRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaW5qZWN0aW9uOwotCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VJbmplY3Rpb25FeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewotCi0gICAgLyoqCi0gICAgICoKLSAgICAgKi8KLSAgICBwdWJsaWMgUmVzb3VyY2VJbmplY3Rpb25FeGNlcHRpb24oKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyoqIEBwYXJhbSBtZXNzYWdlICAqLwotICAgIHB1YmxpYyBSZXNvdXJjZUluamVjdGlvbkV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gbWVzc2FnZQotICAgICAqIEBwYXJhbSBjYXVzZQotICAgICAqLwotICAgIHB1YmxpYyBSZXNvdXJjZUluamVjdGlvbkV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGNhdXNlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UsIGNhdXNlKTsKLSAgICB9Ci0KLSAgICAvKiogQHBhcmFtIGNhdXNlICAqLwotICAgIHB1YmxpYyBSZXNvdXJjZUluamVjdGlvbkV4Y2VwdGlvbihUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIoY2F1c2UpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbGlmZWN5Y2xlL0Jhc2VMaWZlY3ljbGVNYW5hZ2VyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9saWZlY3ljbGUvQmFzZUxpZmVjeWNsZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzBjNGQyZC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9saWZlY3ljbGUvQmFzZUxpZmVjeWNsZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubGlmZWN5Y2xlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5pMThuLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXguYW5ub3RhdGlvbi5Qb3N0Q29uc3RydWN0OwotaW1wb3J0IGphdmF4LmFubm90YXRpb24uUHJlRGVzdHJveTsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb247Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmFzZUxpZmVjeWNsZU1hbmFnZXIgewotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhCYXNlTGlmZWN5Y2xlTWFuYWdlci5jbGFzcyk7Ci0gICAgCi0gICAgcHJvdGVjdGVkIE9iamVjdCBpbnN0YW5jZTsKLSAgICAKLSAgICBwdWJsaWMgdm9pZCBpbnZva2VQb3N0Q29uc3RydWN0KCkgdGhyb3dzIExpZmVjeWNsZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTGlmZWN5Y2xlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoIkVuZHBvaW50TGlmZWN5Y2xlTWFuYWdlckltcGxFcnIxIikpOwotICAgICAgICB9Ci0gICAgICAgIE1ldGhvZCBtZXRob2QgPSBnZXRQb3N0Q29uc3RydWN0TWV0aG9kKCk7Ci0gICAgICAgIGlmIChtZXRob2QgIT0gbnVsbCkgewotICAgICAgICAgICAgaW52b2tlUG9zdENvbnN0cnVjdChtZXRob2QpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgaW52b2tlUG9zdENvbnN0cnVjdChNZXRob2QgbWV0aG9kKSB0aHJvd3MgTGlmZWN5Y2xlRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIkludm9raW5nIE1ldGhvZCB3aXRoIEBQb3N0Q29uc3RydWN0IGFubm90YXRpb24iKTsKLSAgICAgICAgfQotICAgICAgICBpbnZva2VNZXRob2QobWV0aG9kLCBudWxsKTsKLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIkNvbXBsZXRlZCBpbnZva2Ugb24gTWV0aG9kIHdpdGggQFBvc3RDb25zdHJ1Y3QgYW5ub3RhdGlvbiIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaW52b2tlUHJlRGVzdHJveSgpIHRocm93cyBMaWZlY3ljbGVFeGNlcHRpb24gewotICAgICAgICBpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IExpZmVjeWNsZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJFbmRwb2ludExpZmVjeWNsZU1hbmFnZXJJbXBsRXJyMSIpKTsKLSAgICAgICAgfQotICAgICAgICBNZXRob2QgbWV0aG9kID0gZ2V0UHJlRGVzdHJveU1ldGhvZCgpOwotICAgICAgICBpZiAobWV0aG9kICE9IG51bGwpIHsKLSAgICAgICAgICAgIGludm9rZVByZURlc3Ryb3kobWV0aG9kKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGludm9rZVByZURlc3Ryb3koTWV0aG9kIG1ldGhvZCkgdGhyb3dzIExpZmVjeWNsZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJJbnZva2luZyBNZXRob2Qgd2l0aCBAUHJlRGVzdHJveSBhbm5vdGF0aW9uIik7Ci0gICAgICAgIH0KLSAgICAgICAgaW52b2tlTWV0aG9kKG1ldGhvZCwgbnVsbCk7Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJDb21wbGV0ZWQgaW52b2tlIG9uIE1ldGhvZCB3aXRoIEBQcmVEZXN0cm95IGFubm90YXRpb24iKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGludm9rZU1ldGhvZChmaW5hbCBNZXRob2QgbSwgZmluYWwgT2JqZWN0W10gcGFyYW1zKSB0aHJvd3MgTGlmZWN5Y2xlRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAotICAgICAgICAgICAgICAgICAgICBuZXcgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtLmludm9rZShpbnN0YW5jZSwgcGFyYW1zKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgKTsKLSAgICAgICAgfSBjYXRjaCAoUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTGlmZWN5Y2xlRXhjZXB0aW9uKGUuZ2V0RXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIE1ldGhvZCBnZXRQb3N0Q29uc3RydWN0TWV0aG9kKCkgewotICAgICAgICAvLyBSRVZJRVc6IFRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgY2FsbGVkIGluIHBlcmZvcm1hbnQgc2l0dWF0aW9ucy4KLSAgICAgICAgLy8gUGx1cyB0aGUgc3VwZXIgY2xhc3MgbWV0aG9kcyBhcmUgbm90IGJlaW5nIGNvbnNpZGVyZWQgCi0KLSAgICAgICAgLy9yZXR1cm4gTWV0aG9kIHdpdGggQFBvc3RDb25zdHJ1Y3QgQW5ub3RhdGlvbi4KLSAgICAgICAgaWYgKGluc3RhbmNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZpbmFsIENsYXNzIGVuZHBvaW50Q2xhenogPSBpbnN0YW5jZS5nZXRDbGFzcygpOwotICAgICAgICAgICAgTWV0aG9kW10gbWV0aG9kcyA9IChNZXRob2RbXSkgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoCi0gICAgICAgICAgICAgICAgICAgIG5ldyBQcml2aWxlZ2VkQWN0aW9uKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVuZHBvaW50Q2xhenouZ2V0TWV0aG9kcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICApOwotCi0gICAgICAgICAgICBmb3IgKE1ldGhvZCBtZXRob2QgOiBtZXRob2RzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGlzUG9zdENvbnN0cnVjdChtZXRob2QpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBtZXRob2Q7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBNZXRob2QgZ2V0UHJlRGVzdHJveU1ldGhvZCgpIHsKLSAgICAgICAgLy8gUkVWSUVXOiBUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGNhbGxlZCBpbiBwZXJmb3JtYW50IHNpdHVhdGlvbnMuCi0gICAgICAgIC8vIFBsdXMgdGhlIHN1cGVyIGNsYXNzIG1ldGhvZHMgYXJlIG5vdCBiZWluZyBjb25zaWRlcmVkIAotICAgICAgICAvL3JldHVybiBNZXRob2Qgd2l0aCBAUHJlRGVzdHJveSBBbm5vdGF0aW9uCi0gICAgICAgIGlmIChpbnN0YW5jZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmaW5hbCBDbGFzcyBlbmRwb2ludENsYXp6ID0gaW5zdGFuY2UuZ2V0Q2xhc3MoKTsKLSAgICAgICAgICAgIE1ldGhvZFtdIG1ldGhvZHMgPSAoTWV0aG9kW10pIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAotICAgICAgICAgICAgICAgICAgICBuZXcgUHJpdmlsZWdlZEFjdGlvbigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbmRwb2ludENsYXp6LmdldE1ldGhvZHMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgKTsKLQotICAgICAgICAgICAgZm9yIChNZXRob2QgbWV0aG9kIDogbWV0aG9kcykgewotICAgICAgICAgICAgICAgIGlmIChpc1ByZURlc3Ryb3kobWV0aG9kKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWV0aG9kOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1Bvc3RDb25zdHJ1Y3QoZmluYWwgTWV0aG9kIG1ldGhvZCkgewotICAgICAgICBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMgPSAoQW5ub3RhdGlvbltdKSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgKLSAgICAgICAgICAgICAgICBuZXcgUHJpdmlsZWdlZEFjdGlvbigpIHsKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWV0aG9kLmdldERlY2xhcmVkQW5ub3RhdGlvbnMoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgKTsKLSAgICAgICAgZm9yIChBbm5vdGF0aW9uIGFubm90YXRpb24gOiBhbm5vdGF0aW9ucykgewotICAgICAgICAgICAgcmV0dXJuIFBvc3RDb25zdHJ1Y3QuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShhbm5vdGF0aW9uLmFubm90YXRpb25UeXBlKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1ByZURlc3Ryb3koZmluYWwgTWV0aG9kIG1ldGhvZCkgewotICAgICAgICBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMgPSAoQW5ub3RhdGlvbltdKSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgKLSAgICAgICAgICAgICAgICBuZXcgUHJpdmlsZWdlZEFjdGlvbigpIHsKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWV0aG9kLmdldERlY2xhcmVkQW5ub3RhdGlvbnMoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgKTsKLSAgICAgICAgZm9yIChBbm5vdGF0aW9uIGFubm90YXRpb24gOiBhbm5vdGF0aW9ucykgewotICAgICAgICAgICAgcmV0dXJuIFByZURlc3Ryb3kuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShhbm5vdGF0aW9uLmFubm90YXRpb25UeXBlKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAKLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2xpZmVjeWNsZS9MaWZlY3ljbGVFeGNlcHRpb24uamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2xpZmVjeWNsZS9MaWZlY3ljbGVFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWZiNTUzNi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9saWZlY3ljbGUvTGlmZWN5Y2xlRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubGlmZWN5Y2xlOwotCi1wdWJsaWMgY2xhc3MgTGlmZWN5Y2xlRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKLQotICAgIHB1YmxpYyBMaWZlY3ljbGVFeGNlcHRpb24oKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyoqIEBwYXJhbSBtZXNzYWdlICAqLwotICAgIHB1YmxpYyBMaWZlY3ljbGVFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gY2F1c2UKLSAgICAgKi8KLSAgICBwdWJsaWMgTGlmZWN5Y2xlRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpOwotICAgIH0KLQotICAgIC8qKiBAcGFyYW0gY2F1c2UgICovCi0gICAgcHVibGljIExpZmVjeWNsZUV4Y2VwdGlvbihUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIoY2F1c2UpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWFyc2hhbGxlci9NZXRob2RNYXJzaGFsbGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tYXJzaGFsbGVyL01ldGhvZE1hcnNoYWxsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU3ZjZlMS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tYXJzaGFsbGVyL01ldGhvZE1hcnNoYWxsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWFyc2hhbGxlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uT3BlcmF0aW9uRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLlByb3RvY29sOwotCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247Ci0KLS8qKgotICogVGhpcyBjbGFzcyBtYXJzaGFscyBhbmQgdW5tYXJzaGFscyBtZXRob2QgaW52b2NhdGlvbnMuCi0gKiA8cC8+Ci0gKiBIZXJlIGlzIHRoZSBoaWdoLWxldmVsIHZpZXcgb2YgbWFyc2hhbGxpbmc6IFNJR05BVFVSRV9BUkdTIC0tLT4gVHlwZSBFbmFibGVkIE9iamVjdCAgLS0tLS0+Ci0gKiBFbGVtZW50IEVuYWJsZWQgT2JqZWN0IC0tLT4gTUVTU0FHRSAoWE1MKQotICogPHAvPgotICogVGhlIFNpZ25hdHVyZSBvYmplY3RzIGFyZSB0aGUgb2JqZWN0cyBmcm9tIHRoZSBTRUkgbWV0aG9kIHNpZ25hdHVyZS4gIFRoZXkgbWF5IGJlIHZhbHVlcyBvcgotICogaG9sZGVycyBvZiB2YWx1ZXMuIFRoZSB2YWx1ZXMgYXJlICJ0eXBlIGVuYWJsZWQgb2JqZWN0cyIgKGkuZS4gU3RyaW5nKSwgd2hpY2ggbWVhbnMgdGhhdCB0aGV5Ci0gKiBjYW5ub3QgYmUgbWFyc2hhbGxlZCBvciB1bm1hcnNoYWxsZWQuCi0gKgotICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnV0aWwuWE1MUm9vdEVsZW1lbnRVdGlscyBmb3IgZGV0YWlscyBvbiBUeXBlIEVuYWJsZWQgYW5kIEVsZW1lbnQKLSAqICAgICAgRW5hYmxlZCBvYmplY3RzLgotICogICAgICA8cC8+Ci0gKiAgICAgIFRoZSB2YWx1ZXMgYXJlIGVuaGFuY2VkIChpZiBuZWNlc3NhcnkpIGludG8gRWxlbWVudCBFbmFibGVkIE9iamVjdHMuICBUaGVzZSBjYW4gYmUKLSAqICAgICAgbWFyc2hhbGxlZCBvciB1bm1hcnNoYWxsZWQgdXNpbmcgSkFYQi4KLSAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tYXJzaGFsbGVyLmltcGwuYWx0LlBERWxlbWVudAotICogICAgICA8cC8+Ci0gKiAgICAgIFRoZSBlbGVtZW50IGVuYWJsZWQgb2JqZWN0cyBhcmUgcHV0IG9udG8gdGhlIG1lc3NhZ2UuCi0gKiAgICAgIDxwLz4KLSAqICAgICAgVGhlIGhpZ2gtbGV2ZWwgdmlldyBvZiB1bm1hcnNoYWxsaW5nIGlzIHRoZSByZXZlcnNlLiBTSUdOQVRVUkVfQVJHUyA8LS0tLSBUeXBlIEVuYWJsZWQKLSAqICAgICAgT2JqZWN0ICA8LS0tLS0gRWxlbWVudCBFbmFibGVkIE9iamVjdCA8LS0tLSBNRVNTQUdFIChYTUwpCi0gKiAgICAgIDxwLz4KLSAqICAgICAgU2VlIHRoZSBzcGVjaWZpYyBNZXRob2RNYXJzaGFsbGVyIGltcGxlbWVudGF0aW9ucyB0byBzZWUgaG93IGRvYy9saXQgd3JhcHBlZCwgZG9jL2xpdCBiYXJlCi0gKiAgICAgIGFuZCBycGMvbGl0IGFmZmVjdCB0aGUgcHJvY2VzcyBvZiBnb2luZyBmcm9tIFNJR05BVFVSRV9BUkdTIHRvIHRoZSBlbGVtZW50IGVuYWJsZWQgb2JqZWN0cy4KLSAqICAgICAgPHAvPgotICogICAgICBJZiB0aGVyZSBhcmUgYW55IHByb2JsZW1zLCBhIFdlYlNlcnZpY2VFeGNlcHRpb24gaXMgdGhyb3duLiAgKEVhY2ggb2YgdGhlIG1ldGhvZHMgaXMKLSAqICAgICAgZ3VyYW50ZWVkIHRvIGNhdGNoIGFueSB1bmNoZWNrZWQgZXhjZXB0aW9uIGFuZCB3cmFwIGl0IGluIGEgV2ViU2VydmljZUV4Y2VwdGlvbikuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWV0aG9kTWFyc2hhbGxlciB7Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCBjb252ZXJ0cyBTSUdOQVRVUkVfQVJHUyBpbnRvIGEgTWVzc2FnZS4gSXQgaXMgdXNlZCBvbiB0aGUgY2xpZW50Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gc2lnbmF0dXJlQXJncwotICAgICAqIEByZXR1cm4gTWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyBNZXNzYWdlIG1hcnNoYWxSZXF1ZXN0KE9iamVjdFtdIHNpZ25hdHVyZUFyZ3MsIE9wZXJhdGlvbkRlc2NyaXB0aW9uIG9wRGVzYykKLSAgICAgICAgICAgIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgY29udmVydHMgdGhlIFNJR05BVFVSRV9BUkdTIGFuZCBSRVRVUk4gb2JqZWN0IGludG8gYSBNZXNzYWdlLiBJdCBpcyB1c2VkIG9uIHRoZQotICAgICAqIHNlcnZlcgotICAgICAqCi0gICAgICogQHBhcmFtIHJldHVybk9iamVjdAotICAgICAqIEBwYXJhbSBzaWduYXR1cmVBcmdzCi0gICAgICogQHBhcmFtIE9wZXJhdGlvbkRlc2MKLSAgICAgKiBAcGFyYW0gUHJvdG9jb2wgICAgICBmb3IgcmVzcG9uc2UKLSAgICAgKiBAcmV0dXJuIE1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgTWVzc2FnZSBtYXJzaGFsUmVzcG9uc2UoT2JqZWN0IHJldHVybk9iamVjdCwgT2JqZWN0W10gc2lnbmF0dXJlQXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmF0aW9uRGVzY3JpcHRpb24gb3BEZXNjLCBQcm90b2NvbCBwcm90b2NvbCkKLSAgICAgICAgICAgIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uOwotCi0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCBjb252ZXJ0cyB0aGUgTWVzc2FnZSBpbnRvIGEgU0lHTkFUVVJFX0FSR1MgSXQgaXMgdXNlZCBvbiB0aGUgc2VydmVyCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVzc2FnZQotICAgICAqIEByZXR1cm4gc2lnbmF0dXJlIGFyZ3MKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0W10gZGVtYXJzaGFsUmVxdWVzdChNZXNzYWdlIG1lc3NhZ2UsIE9wZXJhdGlvbkRlc2NyaXB0aW9uIG9wRGVzYykKLSAgICAgICAgICAgIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgZ2V0cyB0aGUgb2JqZWN0cyBmcm9tIHRoZSBNZXNzYWdlIGFuZCBzZXRzIHRoZW0gb250byB0aGUgU0lHTkFUVVJFX0FSR1MgSXQgYWxzbwotICAgICAqIHJldHVybnMgdGhlIFJFVFVSTiBvYmplY3QuIENhbGxlZCBvbiBjbGllbnQKLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXNzYWdlCi0gICAgICogQHBhcmFtIHNpZ25hdHVyZUFncyAgKHNhbWUgYXJyYXkgb2YgYXJncyB0aGF0IHdlcmUgdXNlZCBmb3IgbWFyc2hhbFJlcXVlc3QuICBUaGUgb3V0L2lub3V0Ci0gICAgICogICAgICAgICAgICAgICAgICAgICAgaG9sZGVycyBhcmUgcG9wdWxhdGVkIHdpdGggbmV3IHZhbHVlcykKLSAgICAgKiBAcGFyYW0gT3BlcmF0aW9uRGVzYwotICAgICAqIEByZXR1cm4gcmV0dXJuT2JqZWN0Ci0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBkZW1hcnNoYWxSZXNwb25zZShNZXNzYWdlIG1lc3NhZ2UsIE9iamVjdFtdIHNpZ25hdHVyZUFyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYXRpb25EZXNjcmlwdGlvbiBvcERlc2MpIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgY29udmVydHMgYSBNZXNzYWdlIChjb250YWluaW5nIGEgZmF1bHQpIGludG8gYSBKQVgtV1MgU2VydmljZSBvcgotICAgICAqIFdlYlNlcnZpY2VFeGNlcHRpb24uIFVzZWQgb24gdGhlIGNsaWVudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXNzYWdlCi0gICAgICogQHBhcmFtIE1lc3NhZ2UKLSAgICAgKiBAcmV0dXJuIFRocm93YWJsZQotICAgICAqLwotICAgIHB1YmxpYyBUaHJvd2FibGUgZGVtYXJzaGFsRmF1bHRSZXNwb25zZShNZXNzYWdlIG1lc3NhZ2UsIE9wZXJhdGlvbkRlc2NyaXB0aW9uIG9wRGVzYykKLSAgICAgICAgICAgIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgY3JlYXRlcyBhIE1lc3NhZ2UgZnJvbSBhIFRocm93YWJsZSBpbnB1dCBwYXJhbWV0ZXIuIFVzZWQgb24gdGhlIHNlcnZlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBUaHJvd2FibGUKLSAgICAgKiBAcGFyYW0gT3BlcmF0aW9uRGVzYwotICAgICAqIEBwYXJhbSBQcm90b2NvbCAgICAgIGZvciByZXNwb25zZQotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWVzc2FnZSBtYXJzaGFsRmF1bHRSZXNwb25zZShUaHJvd2FibGUgdGhyb3dhYmxlLCBPcGVyYXRpb25EZXNjcmlwdGlvbiBvcERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvdG9jb2wgcHJvdG9jb2wpIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uOwotCi0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21hcnNoYWxsZXIvTWV0aG9kUGFyYW1ldGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tYXJzaGFsbGVyL01ldGhvZFBhcmFtZXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzdlM2RkLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21hcnNoYWxsZXIvTWV0aG9kUGFyYW1ldGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWFyc2hhbGxlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uUGFyYW1ldGVyRGVzY3JpcHRpb247Ci0KLS8qKgotICogU3RvcmVzIE1ldGhvZCBQYXJhbWV0ZXIgYXMgTmFtZSBhbmQgVmFsdWUuIE1ldGhvZCBQYXJhbWV0ZXIgY2FuIGJlIGFuIGlucHV0IE1ldGhvZCBQYXJhbWV0ZXIgb3IKLSAqIG91dHB1dCBNZXRob2QgcGFyYW1ldGVyLiBpbnB1dCBNZXRob2QgUGFyYW1ldGVyIGlzIGEgaW5wdXQgdG8gYSBqYXZhIE1ldGhvZC4gb3V0cHV0IE1ldGhvZAotICogUGFyYW1ldGVyIGlzIGEgcmV0dXJuIHBhcmFtZXRlciBmcm9tIGEgamF2YSBNZXRob2QuCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RQYXJhbWV0ZXIgewotICAgIHByaXZhdGUgUGFyYW1ldGVyRGVzY3JpcHRpb24gcGFyYW1ldGVyRGVzY3JpcHRpb24gPSBudWxsOwotICAgIHByaXZhdGUgU3RyaW5nIHdlYlJlc3VsdE5hbWUgPSBudWxsOwotICAgIHByaXZhdGUgU3RyaW5nIHdlYlJlc3VsdFROUyA9IG51bGw7Ci0gICAgcHJpdmF0ZSBDbGFzcyB3ZWJSZXN1bHRUeXBlID0gbnVsbDsKLSAgICBwcml2YXRlIGJvb2xlYW4gaXNXZWJSZXN1bHQgPSBmYWxzZTsKLSAgICBwcml2YXRlIE9iamVjdCB2YWx1ZSA9IG51bGw7Ci0KLSAgICBwdWJsaWMgTWV0aG9kUGFyYW1ldGVyKFBhcmFtZXRlckRlc2NyaXB0aW9uIHBhcmFtZXRlckRlc2NyaXB0aW9uLCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgdGhpcy5wYXJhbWV0ZXJEZXNjcmlwdGlvbiA9IHBhcmFtZXRlckRlc2NyaXB0aW9uOwotICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIE1ldGhvZFBhcmFtZXRlcihTdHJpbmcgd2ViUmVzdWx0TmFtZSwgU3RyaW5nIHdlYlJlc3VsdFROUywgQ2xhc3Mgd2ViUmVzdWx0VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCB2YWx1ZSkgewotICAgICAgICBzdXBlcigpOwotICAgICAgICB0aGlzLnBhcmFtZXRlckRlc2NyaXB0aW9uID0gbnVsbDsKLSAgICAgICAgdGhpcy53ZWJSZXN1bHROYW1lID0gd2ViUmVzdWx0TmFtZTsKLSAgICAgICAgdGhpcy53ZWJSZXN1bHRUTlMgPSB3ZWJSZXN1bHRUTlM7Ci0gICAgICAgIHRoaXMud2ViUmVzdWx0VHlwZSA9IHdlYlJlc3VsdFR5cGU7Ci0gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgICAgICAgdGhpcy5pc1dlYlJlc3VsdCA9IHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIFBhcmFtZXRlckRlc2NyaXB0aW9uIGdldFBhcmFtZXRlckRlc2NyaXB0aW9uKCkgewotICAgICAgICByZXR1cm4gcGFyYW1ldGVyRGVzY3JpcHRpb247Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGFyYW1ldGVyRGVzY3JpcHRpb24oUGFyYW1ldGVyRGVzY3JpcHRpb24gcGFyYW1ldGVyRGVzY3JpcHRpb24pIHsKLSAgICAgICAgdGhpcy5wYXJhbWV0ZXJEZXNjcmlwdGlvbiA9IHBhcmFtZXRlckRlc2NyaXB0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0V2ViUmVzdWx0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHdlYlJlc3VsdE5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0V2ViUmVzdWx0TmFtZShTdHJpbmcgd2ViUmVzdWx0TmFtZSkgewotICAgICAgICB0aGlzLndlYlJlc3VsdE5hbWUgPSB3ZWJSZXN1bHROYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzV2ViUmVzdWx0KCkgewotICAgICAgICByZXR1cm4gaXNXZWJSZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0V2ViUmVzdWx0KGJvb2xlYW4gaXNXZWJSZXN1bHQpIHsKLSAgICAgICAgdGhpcy5pc1dlYlJlc3VsdCA9IGlzV2ViUmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFdlYlJlc3VsdFROUygpIHsKLSAgICAgICAgcmV0dXJuIHdlYlJlc3VsdFROUzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRXZWJSZXN1bHRUTlMoU3RyaW5nIHdlYlJlc3VsdFROUykgewotICAgICAgICB0aGlzLndlYlJlc3VsdFROUyA9IHdlYlJlc3VsdFROUzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2xhc3MgZ2V0V2ViUmVzdWx0VHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIHdlYlJlc3VsdFR5cGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0V2ViUmVzdWx0VHlwZShDbGFzcyB3ZWJSZXN1bHRUeXBlKSB7Ci0gICAgICAgIHRoaXMud2ViUmVzdWx0VHlwZSA9IHdlYlJlc3VsdFR5cGU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWFyc2hhbGxlci9mYWN0b3J5L01ldGhvZE1hcnNoYWxsZXJGYWN0b3J5LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tYXJzaGFsbGVyL2ZhY3RvcnkvTWV0aG9kTWFyc2hhbGxlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU5NjIyYS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tYXJzaGFsbGVyL2ZhY3RvcnkvTWV0aG9kTWFyc2hhbGxlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWFyc2hhbGxlci5mYWN0b3J5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5FeGNlcHRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uT3BlcmF0aW9uRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5QYXJhbWV0ZXJEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLlNlcnZpY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1hcnNoYWxsZXIuTWV0aG9kTWFyc2hhbGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1hcnNoYWxsZXIuaW1wbC5hbHQuRG9jTGl0QmFyZU1ldGhvZE1hcnNoYWxsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tYXJzaGFsbGVyLmltcGwuYWx0LkRvY0xpdEJhcmVNaW5pbWFsTWV0aG9kTWFyc2hhbGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1hcnNoYWxsZXIuaW1wbC5hbHQuRG9jTGl0V3JhcHBlZE1ldGhvZE1hcnNoYWxsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tYXJzaGFsbGVyLmltcGwuYWx0LkRvY0xpdFdyYXBwZWRNaW5pbWFsTWV0aG9kTWFyc2hhbGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1hcnNoYWxsZXIuaW1wbC5hbHQuRG9jTGl0V3JhcHBlZFBsdXNNZXRob2RNYXJzaGFsbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWFyc2hhbGxlci5pbXBsLmFsdC5SUENMaXRNZXRob2RNYXJzaGFsbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5kYXRhYmluZGluZy5KQVhCVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5ydW50aW1lLmRlc2NyaXB0aW9uLm1hcnNoYWwuTWFyc2hhbFNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5ydW50aW1lLmRlc2NyaXB0aW9uLm1hcnNoYWwuTWFyc2hhbFNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmc7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkNvbnRleHQ7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwud3MuSG9sZGVyOwotCi0vKioKLSAqIFRoZSBNZXRob2RNYXJzaGFsbGVyRmFjdG9yeSBjcmVhdGVzIGEgRG9jL0xpdCBXcmFwcGVkLCBEb2MvTGl0IEJhcmUgb3IgUlBDIE1hcnNoYWxsZXIgdXNpbmcKLSAqIFNPQVBCaW5kaW5nIGluZm9ybWF0aW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RNYXJzaGFsbGVyRmFjdG9yeSB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKE1ldGhvZE1hcnNoYWxsZXJGYWN0b3J5LmNsYXNzKTsKLQkKLSAgICBwcml2YXRlIGVudW0gU1VCVFlQRSB7Ci0gICAgICAgIE5PUk1BTCwgUExVUywgTUlOSU1BTCB9Ci0KLSAgICA7Ci0KLSAgICAvKiogSW50ZW50aW9uYWxseSBwcml2YXRlICovCi0gICAgcHJpdmF0ZSBNZXRob2RNYXJzaGFsbGVyRmFjdG9yeSgpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgTWFyc2hhbGxlciB1c2luaW5nIHRoZSBCaW5kaW5nIGluZm9ybWF0aW9uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3R5bGUKLSAgICAgKiBAcGFyYW0gcGFyYW1TdHlsZQotICAgICAqIEBwYXJhbSBpc1BsdXMgICAgIHVzZWQgdG8gZGVzaWduYXRlZCBET0NMSVRXUkFQUEVEIHBsdXMgYWRkaXRpb25hbCBydWxlcyAoaS5lLiBoZWFkZXIKLSAgICAgKiAgICAgICAgICAgICAgICAgICBwcm9jZXNzaW5nKQotICAgICAqIEBwYXJhbSBpc0NsaWVudAotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBNZXRob2RNYXJzaGFsbGVyIGNyZWF0ZU1ldGhvZE1hcnNoYWxsZXIoU09BUEJpbmRpbmcuU3R5bGUgc3R5bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPQVBCaW5kaW5nLlBhcmFtZXRlclN0eWxlIHBhcmFtU3R5bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNVQlRZUEUgc3ViVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0NsaWVudCkgeyAgLy8gVGhpcyBmbGFnIGlzIGZvciB0ZXN0aW5nIG9ubHkgIQotICAgICAgICBpZiAoc3R5bGUgPT0gU09BUEJpbmRpbmcuU3R5bGUuUlBDKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFJQQ0xpdE1ldGhvZE1hcnNoYWxsZXIoKTsKLSAgICAgICAgfSBlbHNlIGlmIChwYXJhbVN0eWxlID09IFNPQVBCaW5kaW5nLlBhcmFtZXRlclN0eWxlLldSQVBQRUQpIHsKLSAgICAgICAgICAgIGlmIChzdWJUeXBlID09IFNVQlRZUEUuUExVUykgewotICAgICAgICAgICAgICAgIC8vIEFibm9ybWFsIGNhc2UKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERvY0xpdFdyYXBwZWRQbHVzTWV0aG9kTWFyc2hhbGxlcigpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChzdWJUeXBlID09IFNVQlRZUEUuTUlOSU1BTCkgewotICAgICAgICAgICAgICAgIC8vIEFibm9ybWFsIGNhc2UKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERvY0xpdFdyYXBwZWRNaW5pbWFsTWV0aG9kTWFyc2hhbGxlcigpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERvY0xpdFdyYXBwZWRNZXRob2RNYXJzaGFsbGVyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAocGFyYW1TdHlsZSA9PSBTT0FQQmluZGluZy5QYXJhbWV0ZXJTdHlsZS5CQVJFKSB7Ci0gICAgICAgICAgICBpZiAoc3ViVHlwZSA9PSBTVUJUWVBFLk1JTklNQUwpIHsKLSAgICAgICAgICAgICAgICAvLyBBYm5vcm1hbCBjYXNlCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEb2NMaXRCYXJlTWluaW1hbE1ldGhvZE1hcnNoYWxsZXIoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEb2NMaXRCYXJlTWV0aG9kTWFyc2hhbGxlcigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIE1ldGhvZE1hcnNoYWxsZXIgZ2V0TWFyc2hhbGxlcihPcGVyYXRpb25EZXNjcmlwdGlvbiBvcCwgYm9vbGVhbiBpc0NsaWVudCkgewotICAgICAgICByZXR1cm4gZ2V0TWFyc2hhbGxlcihvcCwgaXNDbGllbnQsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTWV0aG9kTWFyc2hhbGxlciBnZXRNYXJzaGFsbGVyKE9wZXJhdGlvbkRlc2NyaXB0aW9uIG9wLCBib29sZWFuIGlzQ2xpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzTG9hZGVyIGNsKSB7Ci0KLSAgICAgICAgTWV0aG9kTWFyc2hhbGxlciBtYXJzaGFsbGVyID0gbnVsbDsKLSAgICAgICAgaWYgKG9wLmdldFNvYXBCaW5kaW5nU3R5bGUoKSA9PSBTT0FQQmluZGluZy5TdHlsZS5ET0NVTUVOVCkgewotICAgICAgICAgICAgbWFyc2hhbGxlciA9IGNyZWF0ZURvY0xpdE1ldGhvZE1hcnNoYWxsZXIob3AsIGlzQ2xpZW50LCBjbCk7Ci0gICAgICAgIH0gZWxzZSBpZiAob3AuZ2V0U29hcEJpbmRpbmdTdHlsZSgpID09IFNPQVBCaW5kaW5nLlN0eWxlLlJQQykgewotICAgICAgICAgICAgbWFyc2hhbGxlciA9IGNyZWF0ZVJQQ0xpdE1ldGhvZE1hcnNoYWxsZXIoaXNDbGllbnQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtYXJzaGFsbGVyOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIE1ldGhvZE1hcnNoYWxsZXIgY3JlYXRlRG9jTGl0TWV0aG9kTWFyc2hhbGxlcihPcGVyYXRpb25EZXNjcmlwdGlvbiBvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0NsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NMb2FkZXIgY2wpIHsKLSAgICAgICAgU09BUEJpbmRpbmcuUGFyYW1ldGVyU3R5bGUgcGFyYW1ldGVyU3R5bGUgPSBudWxsOwotICAgICAgICBTVUJUWVBFIHN1YlR5cGUgPSBTVUJUWVBFLk5PUk1BTDsKLSAgICAgICAgaWYgKGlzRG9jTGl0QmFyZShvcCkpIHsKLSAgICAgICAgICAgIGlmIChpc0RvY0xpdEJhcmVNaW5pbWFsKG9wLCBjbCkpIHsKLSAgICAgICAgICAgICAgICBzdWJUeXBlID0gU1VCVFlQRS5NSU5JTUFMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcGFyYW1ldGVyU3R5bGUgPSBTT0FQQmluZGluZy5QYXJhbWV0ZXJTdHlsZS5CQVJFOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGlzRG9jTGl0V3JhcHBlZE1pbmltYWwob3ApKSB7Ci0gICAgICAgICAgICAgICAgc3ViVHlwZSA9IFNVQlRZUEUuTUlOSU1BTDsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNEb2NMaXRXcmFwcGVkUGx1cyhvcCkpIHsKLSAgICAgICAgICAgICAgICBzdWJUeXBlID0gU1VCVFlQRS5QTFVTOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcGFyYW1ldGVyU3R5bGUgPSBTT0FQQmluZGluZy5QYXJhbWV0ZXJTdHlsZS5XUkFQUEVEOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjcmVhdGVNZXRob2RNYXJzaGFsbGVyKFNPQVBCaW5kaW5nLlN0eWxlLkRPQ1VNRU5ULCBwYXJhbWV0ZXJTdHlsZSwgc3ViVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNDbGllbnQpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIE1ldGhvZE1hcnNoYWxsZXIgY3JlYXRlUlBDTGl0TWV0aG9kTWFyc2hhbGxlcihib29sZWFuIGlzQ2xpZW50KSB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVNZXRob2RNYXJzaGFsbGVyKFNPQVBCaW5kaW5nLlN0eWxlLlJQQywgU09BUEJpbmRpbmcuUGFyYW1ldGVyU3R5bGUuV1JBUFBFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1VCVFlQRS5OT1JNQUwsIGlzQ2xpZW50KTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gaXNEb2NMaXRCYXJlKE9wZXJhdGlvbkRlc2NyaXB0aW9uIG9wKSB7Ci0gICAgICAgIFNPQVBCaW5kaW5nLlBhcmFtZXRlclN0eWxlIG1ldGhvZFBhcmFtU3R5bGUgPSBvcC5nZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCk7Ci0gICAgICAgIGlmIChtZXRob2RQYXJhbVN0eWxlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBtZXRob2RQYXJhbVN0eWxlID09IFNPQVBCaW5kaW5nLlBhcmFtZXRlclN0eWxlLkJBUkU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBTT0FQQmluZGluZy5QYXJhbWV0ZXJTdHlsZSBTRUlQYXJhbVN0eWxlID0KLSAgICAgICAgICAgICAgICAgICAgb3AuZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbigpLmdldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKTsKLSAgICAgICAgICAgIHJldHVybiBTRUlQYXJhbVN0eWxlID09IFNPQVBCaW5kaW5nLlBhcmFtZXRlclN0eWxlLkJBUkU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gaXNEb2NMaXRXcmFwcGVkKE9wZXJhdGlvbkRlc2NyaXB0aW9uIG9wKSB7Ci0gICAgICAgIFNPQVBCaW5kaW5nLlBhcmFtZXRlclN0eWxlIG1ldGhvZFBhcmFtU3R5bGUgPSBvcC5nZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCk7Ci0gICAgICAgIGlmIChtZXRob2RQYXJhbVN0eWxlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBtZXRob2RQYXJhbVN0eWxlID09IFNPQVBCaW5kaW5nLlBhcmFtZXRlclN0eWxlLldSQVBQRUQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBTT0FQQmluZGluZy5QYXJhbWV0ZXJTdHlsZSBTRUlQYXJhbVN0eWxlID0KLSAgICAgICAgICAgICAgICAgICAgb3AuZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbigpLmdldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKTsKLSAgICAgICAgICAgIHJldHVybiBTRUlQYXJhbVN0eWxlID09IFNPQVBCaW5kaW5nLlBhcmFtZXRlclN0eWxlLldSQVBQRUQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJZiBhbiB3ZWIgc2VydmljZSBpcyBjcmVhdGVkIHVzaW5nIHdzZ2VuLCBpdCBpcyBwb3NzaWJsZSB0aGF0IHRoZSBzZWkgZG9lcyBub3QgY29tcGx5IHdpdGgKLSAgICAgKiB0aGUgd3JhcHBlZCBydWxlcy4gIEZvciBleGFtcGxlLCB3c2dlbiB3aWxsIGFsbG93IGhlYWRlciBwYXJhbWV0ZXJzIGFuZCByZXR1cm4gdmFsdWVzLiBJbgotICAgICAqIHN1Y2ggY2FzZXMgd2Ugd2lsbCB1c2UgdGhlIERvY0xpdFdyYXBwZWRQbHVzIG1hcnNoYWxsZXIgdG8gbWFyc2hhbCBhbmQgdW5tYXJzaGFsIHRoZSB4bWwgaW4KLSAgICAgKiB0aGVzZSBleHRyYW9yZGluYXJ5IHNpdHVhdGlvbnMKLSAgICAgKgotICAgICAqIEBwYXJhbSBvcAotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gaXNEb2NMaXRXcmFwcGVkUGx1cyhPcGVyYXRpb25EZXNjcmlwdGlvbiBvcCkgewotICAgICAgICBpZiAoaXNEb2NMaXRXcmFwcGVkKG9wKSkgewotICAgICAgICAgICAgaWYgKG9wLmlzUmVzdWx0SGVhZGVyKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFBhcmFtZXRlckRlc2NyaXB0aW9uW10gcGRzID0gb3AuZ2V0UGFyYW1ldGVyRGVzY3JpcHRpb25zKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBkcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChwZHNbaV0uaXNIZWFkZXIoKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIElmIGEgd2Vic2VydmljZXMgaXMgY3JlYXRlZCB3aXRob3V0IHhqYywgdGhlbiB0aGVyZSB3aWxsIGJlIG5vIE9iamVjdEZhY3RvcnkgY2xhc3NlcyBwYWNrYWdlZAotICAgICAqIHdpdGggdGhlIHdlYnNlcnZpY2UuICBJbiBzdWNoIGNhc2VzLCB1c2UgdGhlIGRvYy9saXQgYmFyZSBtaW5pbWFsIG1hcnNoYWxsZXIuIFRoaXMgbWFyc2hhbGxlcgotICAgICAqIHdpbGwgdXNlICJieSBqYXZhIHR5cGUiIG1hcnNoYWxsaW5nL3VubWFyc2hhbGxpbmcgZm9yIHByaW1pdGl2ZXMgYW5kIFN0cmluZ3MuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb3AKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGlzRG9jTGl0QmFyZU1pbmltYWwoT3BlcmF0aW9uRGVzY3JpcHRpb24gb3AsIENsYXNzTG9hZGVyIGNsKSB7Ci0gICAgICAgIHJldHVybiBpc0RvY0xpdEJhcmUob3ApICYmICFpc0NvbnRleHRQYXRoQ29uc3RydWN0aW9uKG9wLCBjbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIG9wCi0gICAgICogQHJldHVybiB0cnVlIGlmIEpBWEJDb250ZXh0IGNvbnN0cnVjdGVkIHVzaW5nIENPTlRFWFQgUEFUSAotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNDb250ZXh0UGF0aENvbnN0cnVjdGlvbihPcGVyYXRpb25EZXNjcmlwdGlvbiBvcCwgQ2xhc3NMb2FkZXIgY2wpIHsKLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNlcnZpY2VEZXNjID0gb3AuZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbigpCi0gICAgICAgICAgICAgICAgLmdldEVuZHBvaW50RGVzY3JpcHRpb24oKS5nZXRTZXJ2aWNlRGVzY3JpcHRpb24oKTsKLSAgICAgICAgTWFyc2hhbFNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb24gbWFyc2hhbERlc2MgPQotICAgICAgICAgICAgICAgIE1hcnNoYWxTZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uRmFjdG9yeS5nZXQoc2VydmljZURlc2MpOwotICAgICAgICAvLyBHZXQgdGhlIEpBWEJDb250ZXh0Li4uU2luY2UgdGhpcyBpcyBhIGNhY2hlZCBvYmplY3Qgd2UgaW5jdXIgbm8gcGVuYWx0eSBieSBsb29raW5nIGF0IHRoaXMgcG9pbnQuCi0gICAgICAgIEhvbGRlcjxKQVhCVXRpbHMuQ09OU1RSVUNUSU9OX1RZUEU+IGhvbGRlciA9IG5ldyBIb2xkZXI8SkFYQlV0aWxzLkNPTlNUUlVDVElPTl9UWVBFPigpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgSkFYQkNvbnRleHQgY29udGV4dCA9IEpBWEJVdGlscy5nZXRKQVhCQ29udGV4dChtYXJzaGFsRGVzYy5nZXRQYWNrYWdlcygpLCBob2xkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcnNoYWxEZXNjLmdldFBhY2thZ2VzS2V5KCksIGNsLCBudWxsKTsKLSAgICAgICAgfSBjYXRjaCAoSkFYQkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChob2xkZXIudmFsdWUgPT0gSkFYQlV0aWxzLkNPTlNUUlVDVElPTl9UWVBFLkJZX0NPTlRFWFRfUEFUSCkgewotICAgICAgICAgICAgLy8gSWYgSkFYQkNvbnRleHQgd2FzIGNvbnN0cnVjdGVkIHdpdGggYSBjb250ZXh0IHBhdGgsIHRoaXMgaW5kaWNhdGVzIHRoYXQgT2JqZWN0RmFjdG9yeSAob3Igb3RoZXIKLSAgICAgICAgICAgIC8vIG9iamVjdHMpIGFyZSBhdmFpbGFibGUuICAKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gSWYgSkFYQkNvbnRleHQgd2FzIGNvbnN0cnVjdGVkIHVzaW5nIGEgY2xhc3NbXSBvciB3ZSBkb24ndCBrbm93IGhvdyBpdCB3YXMgY29uc3RydWN0ZWQsIHRoZW4gYXNzdW1lCi0gICAgICAgICAgICAvLyB0aGF0IHdlIG5lZWQgdG8gZG8gdGhlIHNwZWNpYWxpemVkICJtaW5pbWFsIiBtYXJzaGFsbGluZy4KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIElmIGEgd2ViIHNlcnZpY2UgaXMgY3JlYXRlZCB3aXRob3V0IHdzZ2VuLCBpdCBpcyBwb3NzaWJsZSB0aGF0IHRoZSB3cmFwcGVyIGVsZW1lbnRzIGFyZQotICAgICAqIG1pc3NpbmcuICBJbiBzdWNoIGNhc2VzLCB1c2UgdGhlIGRvYy9saXQgd3JhcHBlZCBtaW5pbWFsIG1hcnNoYWxsZXIKLSAgICAgKgotICAgICAqIEBwYXJhbSBvcAotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gaXNEb2NMaXRXcmFwcGVkTWluaW1hbChPcGVyYXRpb25EZXNjcmlwdGlvbiBvcCkgewotICAgICAgICBpZiAoaXNEb2NMaXRXcmFwcGVkKG9wKSkgewotICAgICAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNlcnZpY2VEZXNjID0gb3AuZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbigpCi0gICAgICAgICAgICAgICAgICAgIC5nZXRFbmRwb2ludERlc2NyaXB0aW9uKCkuZ2V0U2VydmljZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgICAgICBNYXJzaGFsU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbiBtYXJzaGFsRGVzYyA9Ci0gICAgICAgICAgICAgICAgICAgIE1hcnNoYWxTZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uRmFjdG9yeS5nZXQoc2VydmljZURlc2MpOwotICAgICAgICAgICAgU3RyaW5nIHJlcXVlc3RXcmFwcGVyID0gbWFyc2hhbERlc2MuZ2V0UmVxdWVzdFdyYXBwZXJDbGFzc05hbWUob3ApOwotICAgICAgICAgICAgaWYgKCFleGlzdHMocmVxdWVzdFdyYXBwZXIpKSB7Ci0gICAgICAgICAgICAJaWYobG9nLmlzRGVidWdFbmFibGVkKCkpewotICAgICAgICAgICAgCQlsb2cuZGVidWcoIlJlcXVlc3Qgd3JhcHBlciBjbGFzcyBuYW1lIGlzIE5VTEwuIik7Ci0gICAgICAgICAgICAJfQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvL1N0cmluZyByZXNwb25zZVdyYXBwZXIgPSBtYXJzaGFsRGVzYy5nZXRSZXF1ZXN0V3JhcHBlckNsYXNzTmFtZShvcCk7Ci0gICAgICAgICAgICBTdHJpbmcgcmVzcG9uc2VXcmFwcGVyID0gbWFyc2hhbERlc2MuZ2V0UmVzcG9uc2VXcmFwcGVyQ2xhc3NOYW1lKG9wKTsKLSAgICAgICAgICAgIGlmICghZXhpc3RzKHJlc3BvbnNlV3JhcHBlcikpIHsKLSAgICAgICAgICAgIAlpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSl7Ci0gICAgICAgICAgICAJCWxvZy5kZWJ1ZygiUmVzcG9uc2Ugd3JhcHBlciBjbGFzcyBuYW1lIGlzIE5VTEwuIik7Ci0gICAgICAgICAgICAJfQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gVE9ETyBEbyB0aGUgc2FtZSBmb3IgdGhlIGZhdWx0IGJlYW5zCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gZXhpc3RzKFN0cmluZyBjbGFzc05hbWUpIHsKLSAgICAgICAgaWYgKGNsYXNzTmFtZSA9PSBudWxsIHx8IGNsYXNzTmFtZS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gVE9ETyB0cnkgYW5kIGxvYWQgdGhlIGNsYXNzCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21hcnNoYWxsZXIvaW1wbC9hbHQvQXR0YWNobWVudC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWFyc2hhbGxlci9pbXBsL2FsdC9BdHRhY2htZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyMDg2NmQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWFyc2hhbGxlci9pbXBsL2FsdC9BdHRhY2htZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tYXJzaGFsbGVyLmltcGwuYWx0Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLnV0aWwuVVVJREdlbmVyYXRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5FeGNlcHRpb25GYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkF0dGFjaG1lbnREZXNjcmlwdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5pMThuLk1lc3NhZ2VzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnV0aWxpdHkuQ29udmVydFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkhUVFBDb25zdGFudHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YXguYWN0aXZhdGlvbi5EYXRhSGFuZGxlcjsNCi1pbXBvcnQgamF2YXguaW1hZ2Vpby5JSU9JbWFnZTsNCi1pbXBvcnQgamF2YXguaW1hZ2Vpby5JbWFnZVdyaXRlcjsNCi1pbXBvcnQgamF2YXguaW1hZ2Vpby5zdHJlYW0uSW1hZ2VPdXRwdXRTdHJlYW07DQotaW1wb3J0IGphdmF4Lm1haWwuaW50ZXJuZXQuSW50ZXJuZXRIZWFkZXJzOw0KLWltcG9ydCBqYXZheC5tYWlsLmludGVybmV0Lk1pbWVCb2R5UGFydDsNCi1pbXBvcnQgamF2YXgubWFpbC5pbnRlcm5ldC5NaW1lUGFydERhdGFTb3VyY2U7DQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOw0KLWltcG9ydCBqYXZhLmF3dC4qOw0KLWltcG9ydCBqYXZhLmF3dC5pbWFnZS5CdWZmZXJlZEltYWdlOw0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KLQ0KLS8qKg0KLSAqIFRoZSBBdHRhY2htZW50IG9iamVjdCBoYXMgYSBzaW1pbGFyIGZ1bmN0aW9uIGFzIHRoZSANCi0gKiBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1hcnNoYWxsZXIuaW1wbC5hbHQuRWxlbWVudCBvYmplY3QuDQotICogVGhlIEVsZW1lbnQgb2JqZWN0IGlzIHVzZWQgdG8gDQotICogICAgMSkgR2V0IHRoZSAiZWxlbWVudCByZW5kZXJlZCIgb2JqZWN0IHRoYXQgaXMgbWFyc2hhbGxlZC91bm1hcnNoYWxsZWQgZnJvbSB0aGUgd2lyZQ0KLSAqICAgIDIpIEdldCB0aGUgInR5cGUgcmVuZGVyZWQiIG9iamVjdCB0aGF0IGlzIHVzZWQgYXMgdGhlIHBhcmFtZXRlciB2YWx1ZSBpbiB0aGUgc2lnbmF0dXJlLg0KLSAqICAgIA0KLSAqIFRoZSBBdHRhY2htZW50IG9iamVjdCBoYXMgYSBzaW1pbGFyIHJvbGUuICANCi0gKiBUaGUgRGF0YUhhbmRsZXIgb2JqZWN0IGlzIHVzZWQgZm9yIG1hcnNoYWxsaW5nL3VubWFyc2hhbGxpbmcuDQotICogQW5kIHRoZSBnZXRWYWx1ZSBtZXRob2QgaXMgdXNlZCB0byBnZXQgdGhlIHNpZ25hdHVyZSByZXByZXNlbnRhdGlvbi4NCi0gKiANCi0gKg0KLSAqLw0KLWNsYXNzIEF0dGFjaG1lbnQgew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coQXR0YWNobWVudC5jbGFzcyk7DQotICAgIERhdGFIYW5kbGVyIGRoID0gbnVsbDsNCi0gICAgU3RyaW5nIGNpZCA9IG51bGw7DQotICAgIEF0dGFjaG1lbnREZXNjcmlwdGlvbiBhRGVzYyA9IG51bGw7DQotICAgIE9iamVjdCBzaWdWYWx1ZSA9IG51bGw7DQotICAgIENsYXNzIHNpZ0NsYXNzID0gbnVsbDsNCi0gICAgU3RyaW5nIHBhcnROYW1lID0gbnVsbDsNCi0NCi0gICAgLyoqDQotICAgICAqIENvbnN0cnVjdG9yIHVzZWQgdG8gc2V0IEF0dGFjaG1lbnQgZnJvbSB3aXJlIHVubWFyc2hhbGxpbmcNCi0gICAgICogQHBhcmFtIGRoDQotICAgICAqIEBwYXJhbSBjaWQNCi0gICAgICovDQotICAgIHB1YmxpYyBBdHRhY2htZW50KERhdGFIYW5kbGVyIGRoLCBTdHJpbmcgY2lkKSB7DQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNvbnN0cnVjdCB3aXRoIGRoPSIgKyBkaC5nZXRDb250ZW50VHlwZSgpICsgIiBjaWQ9IiArIGNpZCk7DQotICAgICAgICB9DQotICAgICAgICB0aGlzLmRoID0gZGg7DQotICAgICAgICB0aGlzLmNpZCA9IGNpZDsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogQ29uc3RydWN0b3IgdXNlZCB0byBjcmVhdGUgQXR0YWNobWVudCBmcm9tIHNpZ25hdHVyZSBkYXRhDQotICAgICAqIEBwYXJhbSBzaWdWYWx1ZQ0KLSAgICAgKiBAcGFyYW0gc2lnQ2xhc3MNCi0gICAgICovDQotICAgIHB1YmxpYyBBdHRhY2htZW50KE9iamVjdCBzaWdWYWx1ZSwgQ2xhc3Mgc2lnQ2xhc3MsIEF0dGFjaG1lbnREZXNjcmlwdGlvbiBhRGVzYywgU3RyaW5nIHBhcnROYW1lKSB7DQotICAgICAgICB0aGlzLnNpZ1ZhbHVlID0gc2lnVmFsdWU7DQotICAgICAgICB0aGlzLnNpZ0NsYXNzID0gc2lnQ2xhc3M7DQotICAgICAgICB0aGlzLmFEZXNjID0gYURlc2M7DQotICAgICAgICB0aGlzLnBhcnROYW1lID0gcGFydE5hbWU7DQotICAgIH0NCi0NCi0NCi0gICAgLyoqDQotICAgICAqIEByZXR1cm4gRGF0YUhhbmRsZXINCi0gICAgICovDQotICAgIHB1YmxpYyBEYXRhSGFuZGxlciBnZXREYXRhSGFuZGxlcigpIHsNCi0gICAgICAgIGlmIChkaCA9PSBudWxsKSB7DQotICAgICAgICAJLy9pZiBudWxsIERIIHdhcyBzcGVjaWZpZWQgZXhwbGljaXRseSwgcmV0dXJuIGl0LCBkb24ndCBjcmVhdGUgc29tZXRoaW5nIGVsc2UuDQotICAgICAgICAgICAgaWYgKHNpZ1ZhbHVlID09IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGEgY29udGVudElEIGFuZCBudWxsIERhdGFIYW5kbGVyDQotICAgICAgICAgICAgICAgIGdldENvbnRlbnRJRCgpOyAvLyBGb3JjZSBzZXR0aW5nIG9mIGNvbnRlbnQgaWQNCi0gICAgICAgICAgICAgICAgZGggPSAoRGF0YUhhbmRsZXIpIG51bGw7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgLy8gTm9ybWFsIGNhc2U6IGNyZWF0ZSBhIERhdGFIYW5kbGVyIGZyb20gdGhlIHNpZ1ZhbHVlIG9iamVjdA0KLSAgICAgICAgICAgICAgICBkaCA9IGNyZWF0ZURhdGFIYW5kbGVyKHNpZ1ZhbHVlLCBzaWdDbGFzcywgYURlc2MuZ2V0TWltZVR5cGVzKCksIGdldENvbnRlbnRJRCgpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gZGg7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIEByZXR1cm4gQ29udGVudElEDQotICAgICAqLw0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRJRCgpIHsNCi0gICAgICAgIGlmIChjaWQgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIGNpZCA9IFVVSURHZW5lcmF0b3IuZ2V0VVVJRCgpOw0KLSAgICAgICAgICAgIC8vIFBlciBzcGVjLCB1c2UgdGhlIHBhcnROYW1lIGluIHRoZSBjb250ZW50LWlkDQotICAgICAgICAgICAgLy8gaHR0cDovL3d3dy53cy1pLm9yZy9Qcm9maWxlcy9BdHRhY2htZW50c1Byb2ZpbGUtMS4wLmh0bWwjVmFsdWUtc3BhY2Vfb2ZfQ29udGVudC1JZF9IZWFkZXINCi0gICAgICAgICAgICBpZiAocGFydE5hbWUgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICBjaWQgPSBwYXJ0TmFtZSArICI9IiArIGNpZDsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gY2lkOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIERhdGFIYW5kbGVyIGNyZWF0ZURhdGFIYW5kbGVyKE9iamVjdCB2YWx1ZSwgQ2xhc3MgY2xzLCBTdHJpbmdbXSBtaW1lVHlwZXMsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjaWQpIHsNCi0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ29uc3RydWN0IGRhdGEgaGFuZGxlciBmb3IgIiArIGNscyArICIgY2lkPSIgKyBjaWQpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgRGF0YUhhbmRsZXIgZGggPSBudWxsOw0KLSAgICAgICAgaWYgKGNscy5pc0Fzc2lnbmFibGVGcm9tKERhdGFIYW5kbGVyLmNsYXNzKSkgew0KLSAgICAgICAgICAgIGRoID0gKERhdGFIYW5kbGVyKSB2YWx1ZTsNCi0gICAgICAgICAgICBpZihkaCA9PSBudWxsKSAgDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gZGg7IC8vcmV0dXJuIGlmIERhdGFIYW5kbGVyIGlzIG51bGwNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICAgICAgT2JqZWN0IGNvbnRlbnQgPSBkaC5nZXRDb250ZW50KCk7DQotICAgICAgICAgICAgICAgIC8vIElmIHRoZSBjb250ZW50IGlzIGEgU291cmNlLCBjb252ZXJ0IHRvIGEgU3RyaW5nIGR1ZSB0byANCi0gICAgICAgICAgICAgICAgLy8gcHJvYmxlbXMgd2l0aCB0aGUgRGF0YUNvbnRlbnRIYW5kbGVyDQotICAgICAgICAgICAgICAgIGlmIChjb250ZW50IGluc3RhbmNlb2YgU291cmNlKSB7DQotICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNvbnZlcnRpbmcgRGF0YUhhbmRsZXIgU291cmNlIGNvbnRlbnQgdG8gIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiRGF0YUhhbmRsZXJTdHJpbmcgY29udGVudCIpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGJ5dGVzID0gKGJ5dGVbXSkgQ29udmVydFV0aWxzLmNvbnZlcnQoY29udGVudCwgYnl0ZVtdLmNsYXNzKTsNCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBuZXdDb250ZW50ID0gbmV3IFN0cmluZyhieXRlcyk7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERhdGFIYW5kbGVyKG5ld0NvbnRlbnQsIG1pbWVUeXBlc1swXSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICAgICAgYnl0ZVtdIGJ5dGVzID0gY3JlYXRlQnl0ZXModmFsdWUsIGNscywgbWltZVR5cGVzKTsNCi0gICAgICAgICAgICAgICAgLy8gQ3JlYXRlIE1JTUUgQm9keSBQYXJ0DQotICAgICAgICAgICAgICAgIEludGVybmV0SGVhZGVycyBpaCA9IG5ldyBJbnRlcm5ldEhlYWRlcnMoKTsNCi0gICAgICAgICAgICAgICAgaWguc2V0SGVhZGVyKEhUVFBDb25zdGFudHMuSEVBREVSX0NPTlRFTlRfVFlQRSwgbWltZVR5cGVzWzBdKTsNCi0gICAgICAgICAgICAgICAgTWltZUJvZHlQYXJ0IG1icCA9IG5ldyBNaW1lQm9keVBhcnQoaWgsIGJ5dGVzKTsNCi0NCi0gICAgICAgICAgICAgICAgLy9DcmVhdGUgYSBkYXRhIHNvdXJjZSBmb3IgdGhlIE1JTUUgQm9keSBQYXJ0DQotICAgICAgICAgICAgICAgIE1pbWVQYXJ0RGF0YVNvdXJjZSBkcyA9IG5ldyBNaW1lUGFydERhdGFTb3VyY2UobWJwKTsNCi0NCi0gICAgICAgICAgICAgICAgZGggPSBuZXcgRGF0YUhhbmRsZXIoZHMpOw0KLSAgICAgICAgICAgICAgICBtYnAuc2V0SGVhZGVyKEhUVFBDb25zdGFudHMuSEVBREVSX0NPTlRFTlRfSUQsIGNpZCk7DQotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gZGg7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIGNyZWF0ZUJ5dGVzKE9iamVjdCB2YWx1ZSwgQ2xhc3MgY2xzLCBTdHJpbmdbXSBtaW1lVHlwZXMpIHsNCi0gICAgICAgIGlmIChjbHMuaXNBc3NpZ25hYmxlRnJvbShieXRlW10uY2xhc3MpKSB7DQotICAgICAgICAgICAgcmV0dXJuIChieXRlW10pIHZhbHVlOw0KLSAgICAgICAgfSBlbHNlIGlmIChjbHMuaXNBc3NpZ25hYmxlRnJvbShTdHJpbmcuY2xhc3MpKSB7DQotICAgICAgICAgICAgcmV0dXJuICgoU3RyaW5nKSB2YWx1ZSkuZ2V0Qnl0ZXMoKTsNCi0gICAgICAgIH0gZWxzZSBpZiAoY2xzLmlzQXNzaWduYWJsZUZyb20oSW1hZ2UuY2xhc3MpKSB7DQotICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUJ5dGVzRnJvbUltYWdlKChJbWFnZSkgdmFsdWUsIG1pbWVUeXBlc1swXSk7DQotICAgICAgICB9IGVsc2UgaWYgKENvbnZlcnRVdGlscy5pc0NvbnZlcnRhYmxlKHZhbHVlLCBieXRlW10uY2xhc3MpKSB7DQotICAgICAgICAgICAgcmV0dXJuIChieXRlW10pIENvbnZlcnRVdGlscy5jb252ZXJ0KHZhbHVlLCBieXRlW10uY2xhc3MpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoImNvbnZlcnRQcm9ibGVtIiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xzLmdldE5hbWUoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJ5dGVbXSIpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBwcml2YXRlIHN0YXRpYyBieXRlW10gY3JlYXRlQnl0ZXNGcm9tSW1hZ2UoSW1hZ2UgaW1hZ2UsIFN0cmluZyBtaW1lVHlwZSkgIHsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgSW1hZ2VXcml0ZXIgaW1hZ2VXcml0ZXIgPSBudWxsOw0KLSAgICAgICAgICAgIEJ1ZmZlcmVkSW1hZ2UgYnVmZmVyZWRJbWFnZSA9IChCdWZmZXJlZEltYWdlKSBpbWFnZTsNCi0gICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsNCi0gICAgICAgICAgICBJdGVyYXRvciBpdGVyYXRvciA9IGphdmF4LmltYWdlaW8uSW1hZ2VJTy5nZXRJbWFnZVdyaXRlcnNCeU1JTUVUeXBlKG1pbWVUeXBlKTsNCi0gICAgICAgICAgICBpZiAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7DQotICAgICAgICAgICAgICAgIGltYWdlV3JpdGVyID0gKEltYWdlV3JpdGVyKSBpdGVyYXRvci5uZXh0KCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIEltYWdlT3V0cHV0U3RyZWFtIGlvcyA9IGphdmF4LmltYWdlaW8uSW1hZ2VJTy5jcmVhdGVJbWFnZU91dHB1dFN0cmVhbShiYW9zKTsNCi0gICAgICAgICAgICBpbWFnZVdyaXRlci5zZXRPdXRwdXQoaW9zKTsNCi0gICAgICAgICAgICBpbWFnZVdyaXRlci53cml0ZShuZXcgSUlPSW1hZ2UoYnVmZmVyZWRJbWFnZSwgbnVsbCwgbnVsbCkpOw0KLSAgICAgICAgICAgIGlvcy5mbHVzaCgpOw0KLSAgICAgICAgICAgIGltYWdlV3JpdGVyLmRpc3Bvc2UoKTsNCi0gICAgICAgICAgICByZXR1cm4gYmFvcy50b0J5dGVBcnJheSgpOw0KLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7DQotICAgICAgICB9DQotDQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWFyc2hhbGxlci9pbXBsL2FsdC9Eb2NMaXRCYXJlTWV0aG9kTWFyc2hhbGxlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWFyc2hhbGxlci9pbXBsL2FsdC9Eb2NMaXRCYXJlTWV0aG9kTWFyc2hhbGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmMzZjZkLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21hcnNoYWxsZXIvaW1wbC9hbHQvRG9jTGl0QmFyZU1ldGhvZE1hcnNoYWxsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWFyc2hhbGxlci5pbXBsLmFsdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuRXhjZXB0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5BdHRhY2htZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5BdHRhY2htZW50VHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkVuZHBvaW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5FbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uT3BlcmF0aW9uRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5QYXJhbWV0ZXJEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmkxOG4uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tYXJzaGFsbGVyLk1ldGhvZE1hcnNoYWxsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLlByb3RvY29sOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5mYWN0b3J5Lk1lc3NhZ2VGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MucmVnaXN0cnkuRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MucnVudGltZS5kZXNjcmlwdGlvbi5tYXJzaGFsLk1hcnNoYWxTZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MudXRpbGl0eS5Db252ZXJ0VXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkFycmF5OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7Ci0KLXB1YmxpYyBjbGFzcyBEb2NMaXRCYXJlTWV0aG9kTWFyc2hhbGxlciBpbXBsZW1lbnRzIE1ldGhvZE1hcnNoYWxsZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKERvY0xpdEJhcmVNZXRob2RNYXJzaGFsbGVyLmNsYXNzKTsKLQotICAgIHB1YmxpYyBEb2NMaXRCYXJlTWV0aG9kTWFyc2hhbGxlcigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGRlbWFyc2hhbFJlc3BvbnNlKE1lc3NhZ2UgbWVzc2FnZSwgT2JqZWN0W10gc2lnbmF0dXJlQXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhdGlvbkRlc2NyaXB0aW9uIG9wZXJhdGlvbkRlc2MpCi0gICAgICAgICAgICB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiBlZCA9IG9wZXJhdGlvbkRlc2MuZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbigpOwotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVuZHBvaW50RGVzYyA9IGVkLmdldEVuZHBvaW50RGVzY3JpcHRpb24oKTsKLQotICAgICAgICAvLyBOb3RlIGFsbCBleGNlcHRpb25zIGFyZSBjYXVnaHQgYW5kIHJldGhyb3duIHdpdGggYSBXZWJTZXJ2aWNlRXhjZXB0aW9uCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBTYW1wbGUgRG9jdW1lbnQgbWVzc2FnZQotICAgICAgICAgICAgLy8gLi4KLSAgICAgICAgICAgIC8vIDxzb2FwZW52OmJvZHk+Ci0gICAgICAgICAgICAvLyAgICA8bTpyZXR1cm4gLi4uID4uLi48L206cGFyYW0+Ci0gICAgICAgICAgICAvLyA8L3NvYXBlbnY6Ym9keT4KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBJbXBvcnRhbnQgcG9pbnRzLgotICAgICAgICAgICAgLy8gICAxKSBUaGVyZSBpcyBubyBvcGVyYXRpb24gZWxlbWVudCBpbiB0aGUgbWVzc2FnZQotICAgICAgICAgICAgLy8gICAyKSBUaGUgZGF0YSBibG9ja3MgYXJlIGxvY2F0ZWQgdW5kZXJuZWF0aCB0aGUgb3BlcmF0aW9uIGVsZW1lbnQuIAotICAgICAgICAgICAgLy8gICAzKSBUaGUgbmFtZSBvZiB0aGUgZGF0YSBibG9ja3MgKG06cGFyYW0pIGFyZSBkZWZpbmVkIGJ5IHRoZSBzY2hlbWEuCi0gICAgICAgICAgICAvLyAgICAgIChTT0FQIGluZGljYXRlcyB0aGF0IHRoZSBuYW1lIG9mIHRoZSBlbGVtZW50IGlzIG5vdCBpbXBvcnRhbnQsIGJ1dAotICAgICAgICAgICAgLy8gICAgICBmb3IgZG9jdW1lbnQgcHJvY2Vzc2luZywgd2Ugd2lsbCBhc3N1bWUgdGhhdCB0aGUgbmFtZSBjb3JyZXNwb25kcyB0byAKLSAgICAgICAgICAgIC8vICAgICAgYSBzY2hlbWEgcm9vdCBlbGVtZW50KQotICAgICAgICAgICAgLy8gICA0KSBUaGUgdHlwZSBvZiB0aGUgZGF0YSBibG9jayBpcyBkZWZpbmVkIGJ5IHNjaGVtYTsgdGh1cyBpbiBtb3N0IGNhc2VzCi0gICAgICAgICAgICAvLyAgICAgIGFuIHhzaTp0eXBlIHdpbGwgbm90IGJlIHByZXNlbnQKLSAgICAgICAgICAgIFBhcmFtZXRlckRlc2NyaXB0aW9uW10gcGRzID0gb3BlcmF0aW9uRGVzYy5nZXRQYXJhbWV0ZXJEZXNjcmlwdGlvbnMoKTsKLSAgICAgICAgICAgIE1hcnNoYWxTZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uIG1hcnNoYWxEZXNjID0KLSAgICAgICAgICAgICAgICAgICAgTWV0aG9kTWFyc2hhbGxlclV0aWxzLmdldE1hcnNoYWxEZXNjKGVuZHBvaW50RGVzYyk7Ci0gICAgICAgICAgICBUcmVlU2V0PFN0cmluZz4gcGFja2FnZXMgPSBtYXJzaGFsRGVzYy5nZXRQYWNrYWdlcygpOwotCi0gICAgICAgICAgICAvLyBSZW1lbWJlciB0aGlzIHVubWFyc2hhbCBpbmZvcm1hdGlvbiBzbyB0aGF0IHdlIGNhbiBzcGVlZCB1cCBwcm9jZXNzaW5nCi0gICAgICAgICAgICAvLyB0aGUgbmV4dCB0aW1lLgotICAgICAgICAgICAgaWYgKHNob3VsZFJlZ2lzdGVyVW5tYXJzaGFsSW5mbyhvcGVyYXRpb25EZXNjLCBtZXNzYWdlLmdldE1lc3NhZ2VDb250ZXh0KCkpKSB7Ci0gICAgICAgICAgICAgICAgTWV0aG9kTWFyc2hhbGxlclV0aWxzLnJlZ2lzdGVyVW5tYXJzaGFsSW5mbyhtZXNzYWdlLmdldE1lc3NhZ2VDb250ZXh0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcnNoYWxEZXNjLmdldFBhY2thZ2VzS2V5KCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBHZXQgdGhlIHJldHVybiB2YWx1ZS4KLSAgICAgICAgICAgIENsYXNzIHJldHVyblR5cGUgPSBvcGVyYXRpb25EZXNjLmdldFJlc3VsdEFjdHVhbFR5cGUoKTsKLSAgICAgICAgICAgIE9iamVjdCByZXR1cm5WYWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICBib29sZWFuIGhhc1JldHVybkluQm9keSA9IGZhbHNlOwotICAgICAgICAgICAgaWYgKHJldHVyblR5cGUgIT0gdm9pZC5jbGFzcykgewotICAgICAgICAgICAgICAgIEF0dGFjaG1lbnREZXNjcmlwdGlvbiBhdHRhY2htZW50RGVzYyA9IAotICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25EZXNjLmdldFJlc3VsdEF0dGFjaG1lbnREZXNjcmlwdGlvbigpOwotICAgICAgICAgICAgICAgIGlmIChhdHRhY2htZW50RGVzYyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhdHRhY2htZW50RGVzYy5nZXRBdHRhY2htZW50VHlwZSgpID09IEF0dGFjaG1lbnRUeXBlLlNXQSkgewotICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY2lkID0gbWVzc2FnZS5nZXRBdHRhY2htZW50SUQoMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlID0gbWVzc2FnZS5nZXREYXRhSGFuZGxlcihjaWQpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgicGRFbGVtZW50RXJyIikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHdlYnJlc3VsdCBpcyBpbiB0aGUgaGVhZGVyLCB3ZSBuZWVkIHRoZSBuYW1lIG9mIHRoZSBoZWFkZXIgc28gdGhhdCB3ZSBjYW4gZmluZCBpdC4KLSAgICAgICAgICAgICAgICAgICAgRWxlbWVudCByZXR1cm5FbGVtZW50ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG9wZXJhdGlvbkRlc2MuaXNSZXN1bHRIZWFkZXIoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuRWxlbWVudCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kTWFyc2hhbGxlclV0aWxzLmdldFJldHVybkVsZW1lbnQocGFja2FnZXMsIG1lc3NhZ2UsIG51bGwsIGZhbHNlLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbkRlc2MuZ2V0UmVzdWx0VGFyZ2V0TmFtZXNwYWNlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uRGVzYy5nZXRSZXN1bHROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kTWFyc2hhbGxlclV0aWxzLm51bU91dHB1dEJvZHlQYXJhbXMocGRzKSA+IDApOwotCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5FbGVtZW50ID0gTWV0aG9kTWFyc2hhbGxlclV0aWxzCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UmV0dXJuRWxlbWVudChwYWNrYWdlcywgbWVzc2FnZSwgbnVsbCwgZmFsc2UsIGZhbHNlLCBudWxsLCBudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kTWFyc2hhbGxlclV0aWxzLm51bU91dHB1dEJvZHlQYXJhbXMocGRzKSA+IDApOwotICAgICAgICAgICAgICAgICAgICAgICAgaGFzUmV0dXJuSW5Cb2R5ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZSA9IHJldHVybkVsZW1lbnQuZ2V0VHlwZVZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoQ29udmVydFV0aWxzLmlzQ29udmVydGFibGUocmV0dXJuVmFsdWUsIHJldHVyblR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlID0gQ29udmVydFV0aWxzLmNvbnZlcnQocmV0dXJuVmFsdWUsIHJldHVyblR5cGUpOwotICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgIAotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBVbm1hcnNoYWxsIHRoZSBQYXJhbVZhbHVlcyBmcm9tIHRoZSBNZXNzYWdlCi0gICAgICAgICAgICBMaXN0PFBERWxlbWVudD4gcHZMaXN0ID0gTWV0aG9kTWFyc2hhbGxlclV0aWxzLmdldFBERWxlbWVudHMocGRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIC8vIG91dHB1dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc1JldHVybkluQm9keSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsKTsgLy8gYWx3YXlzIHVubWFyc2hhbCB3aXRoICJieSBlbGVtZW50IiBtb2RlCi0KLSAgICAgICAgICAgIC8vIFBvcHVsYXRlIHRoZSByZXNwb25zZSBIb2xkZXJzCi0gICAgICAgICAgICBNZXRob2RNYXJzaGFsbGVyVXRpbHMudXBkYXRlUmVzcG9uc2VTaWduYXR1cmVBcmdzKHBkcywgcHZMaXN0LCBzaWduYXR1cmVBcmdzKTsKLQotICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3RbXSBkZW1hcnNoYWxSZXF1ZXN0KE1lc3NhZ2UgbWVzc2FnZSwgT3BlcmF0aW9uRGVzY3JpcHRpb24gb3BlcmF0aW9uRGVzYykKLSAgICAgICAgICAgIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLQotICAgICAgICBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uIGVkID0gb3BlcmF0aW9uRGVzYy5nZXRFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZW5kcG9pbnREZXNjID0gZWQuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbigpOwotCi0gICAgICAgIC8vIE5vdGUgYWxsIGV4Y2VwdGlvbnMgYXJlIGNhdWdodCBhbmQgcmV0aHJvd24gd2l0aCBhIFdlYlNlcnZpY2VFeGNlcHRpb24KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIFNhbXBsZSBEb2N1bWVudCBtZXNzYWdlCi0gICAgICAgICAgICAvLyAuLgotICAgICAgICAgICAgLy8gPHNvYXBlbnY6Ym9keT4KLSAgICAgICAgICAgIC8vICAgIDxtOnBhcmFtIC4uID4uLi48L206cGFyYW0+Ci0gICAgICAgICAgICAvLyA8L3NvYXBlbnY6Ym9keT4KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBJbXBvcnRhbnQgcG9pbnRzLgotICAgICAgICAgICAgLy8gICAxKSBUaGVyZSBpcyBubyBvcGVyYXRpb24gZWxlbWVudCB1bmRlciB0aGUgYm9keS4KLSAgICAgICAgICAgIC8vICAgMikgVGhlIGRhdGEgYmxvY2tzIGFyZSBsb2NhdGVkIHVuZGVybmVhdGggdGhlIGJvZHkuICAKLSAgICAgICAgICAgIC8vICAgMykgVGhlIG5hbWUgb2YgdGhlIGRhdGEgYmxvY2tzIChtOnBhcmFtKSBhcmUgZGVmaW5lZCBieSB0aGUgc2NoZW1hCi0gICAgICAgICAgICAvLyAgIDQpIFRoZSB0eXBlIG9mIHRoZSBkYXRhIGJsb2NrIChkYXRhOmZvbykgaXMgZGVmaW5lZCBieSBzY2hlbWEgKGFuZCBwcm9iYWJseQotICAgICAgICAgICAgLy8gICAgICBpcyBub3QgcHJlc2VudCBpbiB0aGUgbWVzc2FnZQotICAgICAgICAgICAgUGFyYW1ldGVyRGVzY3JpcHRpb25bXSBwZHMgPSBvcGVyYXRpb25EZXNjLmdldFBhcmFtZXRlckRlc2NyaXB0aW9ucygpOwotICAgICAgICAgICAgTWFyc2hhbFNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb24gbWFyc2hhbERlc2MgPQotICAgICAgICAgICAgICAgICAgICBNZXRob2RNYXJzaGFsbGVyVXRpbHMuZ2V0TWFyc2hhbERlc2MoZW5kcG9pbnREZXNjKTsKLSAgICAgICAgICAgIFRyZWVTZXQ8U3RyaW5nPiBwYWNrYWdlcyA9IG1hcnNoYWxEZXNjLmdldFBhY2thZ2VzKCk7Ci0KLSAgICAgICAgICAgIC8vIFJlbWVtYmVyIHRoaXMgdW5tYXJzaGFsIGluZm9ybWF0aW9uIHNvIHRoYXQgd2UgY2FuIHNwZWVkIHVwIHByb2Nlc3NpbmcKLSAgICAgICAgICAgIC8vIHRoZSBuZXh0IHRpbWUuCi0gICAgICAgICAgICBpZiAoc2hvdWxkUmVnaXN0ZXJVbm1hcnNoYWxJbmZvKG9wZXJhdGlvbkRlc2MsIG1lc3NhZ2UuZ2V0TWVzc2FnZUNvbnRleHQoKSkpIHsKLSAgICAgICAgICAgICAgICBNZXRob2RNYXJzaGFsbGVyVXRpbHMucmVnaXN0ZXJVbm1hcnNoYWxJbmZvKG1lc3NhZ2UuZ2V0TWVzc2FnZUNvbnRleHQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyc2hhbERlc2MuZ2V0UGFja2FnZXNLZXkoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFVubWFyc2hhbCB0aGUgUGFyYW1WYWx1ZXMgZnJvbSB0aGUgbWVzc2FnZQotICAgICAgICAgICAgTGlzdDxQREVsZW1lbnQ+IHB2TGlzdCA9IE1ldGhvZE1hcnNoYWxsZXJVdGlscy5nZXRQREVsZW1lbnRzKHBkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsIC8vIGlucHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCk7IC8vIGFsd2F5cyB1bm1hcnNoYWwgdXNpbmcgImJ5IGVsZW1lbnQiIG1vZGUKLQotICAgICAgICAgICAgLy8gQnVpbGQgdGhlIHNpZ25hdHVyZSBhcmd1bWVudHMKLSAgICAgICAgICAgIE9iamVjdFtdIHNpZ0FyZ3VtZW50cyA9IE1ldGhvZE1hcnNoYWxsZXJVdGlscy5jcmVhdGVSZXF1ZXN0U2lnbmF0dXJlQXJncyhwZHMsIHB2TGlzdCk7Ci0KLSAgICAgICAgICAgIHJldHVybiBzaWdBcmd1bWVudHM7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIE1lc3NhZ2UgbWFyc2hhbFJlc3BvbnNlKE9iamVjdCByZXR1cm5PYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdFtdIHNpZ25hdHVyZUFyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhdGlvbkRlc2NyaXB0aW9uIG9wZXJhdGlvbkRlc2MsIFByb3RvY29sIHByb3RvY29sKQotICAgICAgICAgICAgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotCi0gICAgICAgIEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24gZWQgPSBvcGVyYXRpb25EZXNjLmdldEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24oKTsKLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlbmRwb2ludERlc2MgPSBlZC5nZXRFbmRwb2ludERlc2NyaXB0aW9uKCk7Ci0KLSAgICAgICAgLy8gV2Ugd2FudCB0byByZXNwb25kIHdpdGggdGhlIHNhbWUgcHJvdG9jb2wgYXMgdGhlIHJlcXVlc3QsCi0gICAgICAgIC8vIEl0IHRoZSBwcm90b2NvbCBpcyBudWxsLCB0aGVuIHVzZSB0aGUgUHJvdG9jb2wgZGVmaW5lZCBieSB0aGUgYmluZGluZwotICAgICAgICBpZiAocHJvdG9jb2wgPT0gbnVsbCkgewotICAgICAgICAgICAgcHJvdG9jb2wgPSBQcm90b2NvbC5nZXRQcm90b2NvbEZvckJpbmRpbmcoZW5kcG9pbnREZXNjLmdldEJpbmRpbmdUeXBlKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTm90ZSBhbGwgZXhjZXB0aW9ucyBhcmUgY2F1Z2h0IGFuZCByZXRocm93biB3aXRoIGEgV2ViU2VydmljZUV4Y2VwdGlvbgotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gU2FtcGxlIERvY3VtZW50IG1lc3NhZ2UKLSAgICAgICAgICAgIC8vIC4uCi0gICAgICAgICAgICAvLyA8c29hcGVudjpib2R5PgotICAgICAgICAgICAgLy8gICAgPG06cmV0dXJuIC4uLiA+Li4uPC9tOnBhcmFtPgotICAgICAgICAgICAgLy8gPC9zb2FwZW52OmJvZHk+Ci0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gSW1wb3J0YW50IHBvaW50cy4KLSAgICAgICAgICAgIC8vICAgMSkgVGhlcmUgaXMgbm8gb3BlcmF0aW9uIGVsZW1lbnQgaW4gdGhlIG1lc3NhZ2UKLSAgICAgICAgICAgIC8vICAgMikgVGhlIGRhdGEgYmxvY2tzIGFyZSBsb2NhdGVkIHVuZGVybmVhdGggdGhlIG9wZXJhdGlvbiBlbGVtZW50LiAKLSAgICAgICAgICAgIC8vICAgMykgVGhlIG5hbWUgb2YgdGhlIGRhdGEgYmxvY2tzIChtOnBhcmFtKSBhcmUgZGVmaW5lZCBieSB0aGUgc2NoZW1hLgotICAgICAgICAgICAgLy8gICAgICAoU09BUCBpbmRpY2F0ZXMgdGhhdCB0aGUgbmFtZSBvZiB0aGUgZWxlbWVudCBpcyBub3QgaW1wb3J0YW50LCBidXQKLSAgICAgICAgICAgIC8vICAgICAgZm9yIGRvY3VtZW50IHByb2Nlc3NpbmcsIHdlIHdpbGwgYXNzdW1lIHRoYXQgdGhlIG5hbWUgY29ycmVzcG9uZHMgdG8gCi0gICAgICAgICAgICAvLyAgICAgIGEgc2NoZW1hIHJvb3QgZWxlbWVudCkKLSAgICAgICAgICAgIC8vICAgNCkgVGhlIHR5cGUgb2YgdGhlIGRhdGEgYmxvY2sgaXMgZGVmaW5lZCBieSBzY2hlbWE7IHRodXMgaW4gbW9zdCBjYXNlcwotICAgICAgICAgICAgLy8gICAgICBhbiB4c2k6dHlwZSB3aWxsIG5vdCBiZSBwcmVzZW50Ci0KLSAgICAgICAgICAgIC8vIEdldCB0aGUgb3BlcmF0aW9uIGluZm9ybWF0aW9uCi0gICAgICAgICAgICBQYXJhbWV0ZXJEZXNjcmlwdGlvbltdIHBkcyA9IG9wZXJhdGlvbkRlc2MuZ2V0UGFyYW1ldGVyRGVzY3JpcHRpb25zKCk7Ci0gICAgICAgICAgICBNYXJzaGFsU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbiBtYXJzaGFsRGVzYyA9Ci0gICAgICAgICAgICAgICAgICAgIE1ldGhvZE1hcnNoYWxsZXJVdGlscy5nZXRNYXJzaGFsRGVzYyhlbmRwb2ludERlc2MpOwotICAgICAgICAgICAgVHJlZVNldDxTdHJpbmc+IHBhY2thZ2VzID0gbWFyc2hhbERlc2MuZ2V0UGFja2FnZXMoKTsKLQotICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBtZXNzYWdlIAotICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkgbWYgPSAoTWVzc2FnZUZhY3RvcnkpRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoTWVzc2FnZUZhY3RvcnkuY2xhc3MpOwotICAgICAgICAgICAgTWVzc2FnZSBtID0gbWYuY3JlYXRlKHByb3RvY29sKTsKLQotICAgICAgICAgICAgLy8gUHV0IHRoZSByZXR1cm4gb2JqZWN0IG9udG8gdGhlIG1lc3NhZ2UKLSAgICAgICAgICAgIENsYXNzIHJldHVyblR5cGUgPSBvcGVyYXRpb25EZXNjLmdldFJlc3VsdEFjdHVhbFR5cGUoKTsKLSAgICAgICAgICAgIGlmIChyZXR1cm5UeXBlICE9IHZvaWQuY2xhc3MpIHsKLSAgICAgICAgICAgICAgICBBdHRhY2htZW50RGVzY3JpcHRpb24gYXR0YWNobWVudERlc2MgPSAKLSAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uRGVzYy5nZXRSZXN1bHRBdHRhY2htZW50RGVzY3JpcHRpb24oKTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0YWNobWVudERlc2MgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoYXR0YWNobWVudERlc2MuZ2V0QXR0YWNobWVudFR5cGUoKSA9PSBBdHRhY2htZW50VHlwZS5TV0EpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhbiBBdHRhY2htZW50IG9iamVjdCB3aXRoIHRoZSBzaWduYXR1cmUgdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgIEF0dGFjaG1lbnQgYXR0YWNobWVudCA9IG5ldyBBdHRhY2htZW50KHJldHVybk9iamVjdCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5UeXBlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnREZXNjLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbkRlc2MuZ2V0UmVzdWx0UGFydE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtLmFkZERhdGFIYW5kbGVyKGF0dGFjaG1lbnQuZ2V0RGF0YUhhbmRsZXIoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnQuZ2V0Q29udGVudElEKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgbS5zZXREb2luZ1NXQSh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkuCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoInBkRWxlbWVudEVyciIpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgcmV0dXJuRWxlbWVudCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIFFOYW1lIHJldHVyblFOYW1lID0gbmV3IFFOYW1lKG9wZXJhdGlvbkRlc2MuZ2V0UmVzdWx0VGFyZ2V0TmFtZXNwYWNlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbkRlc2MuZ2V0UmVzdWx0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1hcnNoYWxEZXNjLmdldEFubm90YXRpb25EZXNjKHJldHVyblR5cGUpLmhhc1htbFJvb3RFbGVtZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybkVsZW1lbnQgPSBuZXcgRWxlbWVudChyZXR1cm5PYmplY3QsIHJldHVyblFOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdoZW4gYSBzY2hlbWEgZGVmaW5lcyBhIFNpbXBsZVR5cGUgd2l0aCB4c2QgbGlzdCBqYXh3cyB0b29saW5nIGdlbmVyYXRlcyBhcnQtZWZmZWN0cyB3aXRoIGFycmF5IHJhdGhlciB0aGFuIGEgamF2YS51dGlsLkxpc3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIEhvd2V2ZXIgdGhlIE9iamVjdEZhY3RvcnkgZGVmaW5pdGlvbiB1c2VzIGEgTGlzdCBhbmQgdGh1cyBtYXJzaGFsbGluZyBmYWlscy4gTGV0cyBjb252ZXJ0IHRoZSBBcnJheXMgdG8gTGlzdC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYob3BlcmF0aW9uRGVzYy5pc0xpc3RUeXBlKCkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3QgbGlzdD0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJldHVyblR5cGUuaXNBcnJheSgpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGludCBjb3VudCA9IDA7IGNvdW50IDwgQXJyYXkuZ2V0TGVuZ3RoKHJldHVybk9iamVjdCk7IGNvdW50KyspewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IG9iaiA9IEFycmF5LmdldChyZXR1cm5PYmplY3QsIGNvdW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QuYWRkKG9iaik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuRWxlbWVudCA9IG5ldyBFbGVtZW50KGxpc3QsIHJldHVyblFOYW1lLCBMaXN0LmNsYXNzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybkVsZW1lbnQgPSBuZXcgRWxlbWVudChyZXR1cm5PYmplY3QsIHJldHVyblFOYW1lLCByZXR1cm5UeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBNZXRob2RNYXJzaGFsbGVyVXRpbHMudG9NZXNzYWdlKHJldHVybkVsZW1lbnQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uRGVzYy5pc0xpc3RUeXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyc2hhbERlc2MsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgLy8gYWx3YXlzIG1hcnNoYWwgdXNpbmcgImJ5IGVsZW1lbnQiIG1vZGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25EZXNjLmlzUmVzdWx0SGVhZGVyKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gQ29udmVydCB0aGUgaG9sZGVyIG9iamVjdHMgaW50byBhIGxpc3Qgb2YgSkFYQiBvYmplY3RzIGZvciBtYXJzaGFsbGluZwotICAgICAgICAgICAgTGlzdDxQREVsZW1lbnQ+IHB2TGlzdCA9IE1ldGhvZE1hcnNoYWxsZXJVdGlscy5nZXRQREVsZW1lbnRzKG1hcnNoYWxEZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduYXR1cmVBcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCAvLyBvdXRwdXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7Ci0KLSAgICAgICAgICAgIC8vIFB1dCB2YWx1ZXMgb250byB0aGUgbWVzc2FnZQotICAgICAgICAgICAgTWV0aG9kTWFyc2hhbGxlclV0aWxzLnRvTWVzc2FnZShwdkxpc3QsIG0sIHBhY2thZ2VzKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gRW5hYmxlIFNXQSBmb3IgbmVzdGVkIFN3YVJlZiBhdHRhY2htZW50cwotICAgICAgICAgICAgaWYgKG9wZXJhdGlvbkRlc2MuaGFzUmVzcG9uc2VTd2FSZWZBdHRhY2htZW50cygpKSB7Ci0gICAgICAgICAgICAgICAgbS5zZXREb2luZ1NXQSh0cnVlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG07Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIE1lc3NhZ2UgbWFyc2hhbFJlcXVlc3QoT2JqZWN0W10gc2lnbmF0dXJlQXJndW1lbnRzLCBPcGVyYXRpb25EZXNjcmlwdGlvbiBvcGVyYXRpb25EZXNjKQotICAgICAgICAgICAgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotCi0gICAgICAgIEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24gZWQgPSBvcGVyYXRpb25EZXNjLmdldEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24oKTsKLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlbmRwb2ludERlc2MgPSBlZC5nZXRFbmRwb2ludERlc2NyaXB0aW9uKCk7Ci0gICAgICAgIFByb3RvY29sIHByb3RvY29sID0gUHJvdG9jb2wuZ2V0UHJvdG9jb2xGb3JCaW5kaW5nKGVuZHBvaW50RGVzYy5nZXRDbGllbnRCaW5kaW5nSUQoKSk7Ci0KLSAgICAgICAgLy8gTm90ZSBhbGwgZXhjZXB0aW9ucyBhcmUgY2F1Z2h0IGFuZCByZXRocm93biB3aXRoIGEgV2ViU2VydmljZUV4Y2VwdGlvbgotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gU2FtcGxlIERvY3VtZW50IG1lc3NhZ2UKLSAgICAgICAgICAgIC8vIC4uCi0gICAgICAgICAgICAvLyA8c29hcGVudjpib2R5PgotICAgICAgICAgICAgLy8gICAgPG06cGFyYW0gLi4gPi4uLjwvbTpwYXJhbT4KLSAgICAgICAgICAgIC8vIDwvc29hcGVudjpib2R5PgotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8vIEltcG9ydGFudCBwb2ludHMuCi0gICAgICAgICAgICAvLyAgIDEpIFRoZXJlIGlzIG5vIG9wZXJhdGlvbiBlbGVtZW50IHVuZGVyIHRoZSBib2R5LgotICAgICAgICAgICAgLy8gICAyKSBUaGUgZGF0YSBibG9ja3MgYXJlIGxvY2F0ZWQgdW5kZXJuZWF0aCB0aGUgYm9keS4gIAotICAgICAgICAgICAgLy8gICAzKSBUaGUgbmFtZSBvZiB0aGUgZGF0YSBibG9ja3MgKG06cGFyYW0pIGFyZSBkZWZpbmVkIGJ5IHRoZSBzY2hlbWEKLSAgICAgICAgICAgIC8vICAgNCkgVGhlIHR5cGUgb2YgdGhlIGRhdGEgYmxvY2sgKGRhdGE6Zm9vKSBpcyBkZWZpbmVkIGJ5IHNjaGVtYSAoYW5kIHByb2JhYmx5Ci0gICAgICAgICAgICAvLyAgICAgIGlzIG5vdCBwcmVzZW50IGluIHRoZSBtZXNzYWdlCi0KLSAgICAgICAgICAgIC8vIEdldCB0aGUgb3BlcmF0aW9uIGluZm9ybWF0aW9uCi0gICAgICAgICAgICBQYXJhbWV0ZXJEZXNjcmlwdGlvbltdIHBkcyA9IG9wZXJhdGlvbkRlc2MuZ2V0UGFyYW1ldGVyRGVzY3JpcHRpb25zKCk7Ci0gICAgICAgICAgICBNYXJzaGFsU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbiBtYXJzaGFsRGVzYyA9Ci0gICAgICAgICAgICAgICAgICAgIE1ldGhvZE1hcnNoYWxsZXJVdGlscy5nZXRNYXJzaGFsRGVzYyhlbmRwb2ludERlc2MpOwotICAgICAgICAgICAgVHJlZVNldDxTdHJpbmc+IHBhY2thZ2VzID0gbWFyc2hhbERlc2MuZ2V0UGFja2FnZXMoKTsKLQotICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBtZXNzYWdlIAotICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkgbWYgPSAoTWVzc2FnZUZhY3RvcnkpRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoTWVzc2FnZUZhY3RvcnkuY2xhc3MpOwotICAgICAgICAgICAgTWVzc2FnZSBtID0gbWYuY3JlYXRlKHByb3RvY29sKTsKLQotICAgICAgICAgICAgLy8gVGhlIGlucHV0IG9iamVjdCByZXByZXNlbnQgdGhlIHNpZ25hdHVyZSBhcmd1bWVudHMuCi0gICAgICAgICAgICAvLyBTaWduYXR1cmUgYXJndW1lbnRzIGFyZSBib3RoIGhvbGRlcnMgYW5kIG5vbi1ob2xkZXJzCi0gICAgICAgICAgICAvLyBDb252ZXJ0IHRoZSBzaWduYXR1cmUgaW50byBhIGxpc3Qgb2YgSkFYQiBvYmplY3RzIGZvciBtYXJzaGFsbGluZwotICAgICAgICAgICAgTGlzdDxQREVsZW1lbnQ+IHB2TGlzdCA9IE1ldGhvZE1hcnNoYWxsZXJVdGlscy5nZXRQREVsZW1lbnRzKG1hcnNoYWxEZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduYXR1cmVBcmd1bWVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgIC8vIGlucHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlKTsKLQotICAgICAgICAgICAgLy8gUHV0IHZhbHVlcyBvbnRvIHRoZSBtZXNzYWdlCi0gICAgICAgICAgICBNZXRob2RNYXJzaGFsbGVyVXRpbHMudG9NZXNzYWdlKHB2TGlzdCwgbSwgcGFja2FnZXMpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBFbmFibGUgU1dBIGZvciBuZXN0ZWQgU3dhUmVmIGF0dGFjaG1lbnRzCi0gICAgICAgICAgICBpZiAob3BlcmF0aW9uRGVzYy5oYXNSZXF1ZXN0U3dhUmVmQXR0YWNobWVudHMoKSkgewotICAgICAgICAgICAgICAgIG0uc2V0RG9pbmdTV0EodHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBtOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBNZXNzYWdlIG1hcnNoYWxGYXVsdFJlc3BvbnNlKFRocm93YWJsZSB0aHJvd2FibGUsIE9wZXJhdGlvbkRlc2NyaXB0aW9uIG9wZXJhdGlvbkRlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvdG9jb2wgcHJvdG9jb2wpIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLQotICAgICAgICBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uIGVkID0gb3BlcmF0aW9uRGVzYy5nZXRFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZW5kcG9pbnREZXNjID0gZWQuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbigpOwotICAgICAgICBNYXJzaGFsU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbiBtYXJzaGFsRGVzYyA9Ci0gICAgICAgICAgICAgICAgTWV0aG9kTWFyc2hhbGxlclV0aWxzLmdldE1hcnNoYWxEZXNjKGVuZHBvaW50RGVzYyk7Ci0KLSAgICAgICAgLy8gV2Ugd2FudCB0byByZXNwb25kIHdpdGggdGhlIHNhbWUgcHJvdG9jb2wgYXMgdGhlIHJlcXVlc3QsCi0gICAgICAgIC8vIEl0IHRoZSBwcm90b2NvbCBpcyBudWxsLCB0aGVuIHVzZSB0aGUgUHJvdG9jb2wgZGVmaW5lZCBieSB0aGUgYmluZGluZwotICAgICAgICBpZiAocHJvdG9jb2wgPT0gbnVsbCkgewotICAgICAgICAgICAgcHJvdG9jb2wgPSBQcm90b2NvbC5nZXRQcm90b2NvbEZvckJpbmRpbmcoZW5kcG9pbnREZXNjLmdldEJpbmRpbmdUeXBlKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTm90ZSBhbGwgZXhjZXB0aW9ucyBhcmUgY2F1Z2h0IGFuZCByZXRocm93biB3aXRoIGEgV2ViU2VydmljZUV4Y2VwdGlvbgotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBtZXNzYWdlIAotICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkgbWYgPSAoTWVzc2FnZUZhY3RvcnkpRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoTWVzc2FnZUZhY3RvcnkuY2xhc3MpOwotICAgICAgICAgICAgTWVzc2FnZSBtID0gbWYuY3JlYXRlKHByb3RvY29sKTsKLQotICAgICAgICAgICAgLy8gUHV0IHRoZSBmYXVsdCBvbnRvIHRoZSBtZXNzYWdlCi0gICAgICAgICAgICBNZXRob2RNYXJzaGFsbGVyVXRpbHMubWFyc2hhbEZhdWx0UmVzcG9uc2UodGhyb3dhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcnNoYWxEZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbkRlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbSk7Ci0gICAgICAgICAgICByZXR1cm4gbTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgVGhyb3dhYmxlIGRlbWFyc2hhbEZhdWx0UmVzcG9uc2UoTWVzc2FnZSBtZXNzYWdlLCBPcGVyYXRpb25EZXNjcmlwdGlvbiBvcGVyYXRpb25EZXNjKQotICAgICAgICAgICAgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotCi0gICAgICAgIEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24gZWQgPSBvcGVyYXRpb25EZXNjLmdldEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24oKTsKLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlbmRwb2ludERlc2MgPSBlZC5nZXRFbmRwb2ludERlc2NyaXB0aW9uKCk7Ci0gICAgICAgIE1hcnNoYWxTZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uIG1hcnNoYWxEZXNjID0KLSAgICAgICAgICAgICAgICBNZXRob2RNYXJzaGFsbGVyVXRpbHMuZ2V0TWFyc2hhbERlc2MoZW5kcG9pbnREZXNjKTsKLQotICAgICAgICAvLyBOb3RlIGFsbCBleGNlcHRpb25zIGFyZSBjYXVnaHQgYW5kIHJldGhyb3duIHdpdGggYSBXZWJTZXJ2aWNlRXhjZXB0aW9uCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBUaHJvd2FibGUgdCA9IE1ldGhvZE1hcnNoYWxsZXJVdGlscwotICAgICAgICAgICAgICAgICAgICAuZGVtYXJzaGFsRmF1bHRSZXNwb25zZShvcGVyYXRpb25EZXNjLCBtYXJzaGFsRGVzYywgbWVzc2FnZSk7Ci0gICAgICAgICAgICByZXR1cm4gdDsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWdpc3RlcmluZyBVbm1hcnNoYWxJbmZvIHdpbGwgY2F1c2UgSkFYQiB1bm1hcnNoYWxsaW5nIHRvIG9jY3VyCi0gICAgICogZHVyaW5nIFN0QVhPTUJ1aWxkZXIgcHJvY2Vzc2luZyB0aGUgbmV4dCB0aW1lIGFuIHhtbCBtZXNzYWdlIGlzIHRhcmdlcmVkCi0gICAgICogYXQgdGhpcyB3c2RsIG9wZXJhdGlvbi4gIEluIHNvbWUgY2FzZXMgd2Ugd2FudCB0byBkaXNhYmxlIHRoaXMgZWFybHkgdW5tYXJzaGFsbGluZy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gT3BlcmF0aW9uRGVzY3JpcHRpb24KLSAgICAgKiBAcGFyYW0gTWVzc2FnZUNvbnRleHQKLSAgICAgKiBAcmV0dXJuIHRydWUgb3IgZmFsc2UKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIHNob3VsZFJlZ2lzdGVyVW5tYXJzaGFsSW5mbyhPcGVyYXRpb25EZXNjcmlwdGlvbiBvcERlc2MsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VDb250ZXh0IG1jKSB7Ci0gICAgICAgIAotICAgICAgICBQYXJhbWV0ZXJEZXNjcmlwdGlvbltdIHBkcyA9IG9wRGVzYy5nZXRQYXJhbWV0ZXJEZXNjcmlwdGlvbnMoKTsKLSAgICAgICAgCi0gICAgICAgIC8vIElmIG9uZSBvciBtb3JlIG9wZXJhdGlvbnMgaGF2ZSBhIGdlbmVyaWMgdHlwZSBvZiBPYmplY3QsIHRoZW4KLSAgICAgICAgLy8gYXZvaWQgZWFybHkgdW5tYXJzaGFsbGluZwotICAgICAgICBmb3IgKGludCBpPTA7IGk8cGRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBQYXJhbWV0ZXJEZXNjcmlwdGlvbiBwZCA9IHBkc1tpXTsKLSAgICAgICAgICAgIGlmIChwZC5nZXRQYXJhbWV0ZXJBY3R1YWxUeXBlKCkgPT0gbnVsbCB8fAotICAgICAgICAgICAgICAgIHBkLmdldFBhcmFtZXRlckFjdHVhbFR5cGUoKS5pc0Fzc2lnbmFibGVGcm9tKE9iamVjdC5jbGFzcykpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9ICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIGlmIChvcERlc2MuZ2V0UmVzdWx0QWN0dWFsVHlwZSgpID09IG51bGwgfHwKLSAgICAgICAgICAgICAgICBvcERlc2MuZ2V0UmVzdWx0QWN0dWFsVHlwZSgpLmlzQXNzaWduYWJsZUZyb20oT2JqZWN0LmNsYXNzKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21hcnNoYWxsZXIvaW1wbC9hbHQvRG9jTGl0QmFyZU1pbmltYWxNZXRob2RNYXJzaGFsbGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tYXJzaGFsbGVyL2ltcGwvYWx0L0RvY0xpdEJhcmVNaW5pbWFsTWV0aG9kTWFyc2hhbGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWE3MzVmLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21hcnNoYWxsZXIvaW1wbC9hbHQvRG9jTGl0QmFyZU1pbmltYWxNZXRob2RNYXJzaGFsbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1hcnNoYWxsZXIuaW1wbC5hbHQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLkV4Y2VwdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5BdHRhY2htZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5BdHRhY2htZW50VHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkVuZHBvaW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5FbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uT3BlcmF0aW9uRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5QYXJhbWV0ZXJEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmkxOG4uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tYXJzaGFsbGVyLk1ldGhvZE1hcnNoYWxsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLlByb3RvY29sOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5mYWN0b3J5Lk1lc3NhZ2VGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MucmVnaXN0cnkuRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MucnVudGltZS5kZXNjcmlwdGlvbi5tYXJzaGFsLk1hcnNoYWxTZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MudXRpbGl0eS5Db252ZXJ0VXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwotCi0KLS8qKgotICogVGhlIERvYy9MaXQgV3JhcHBlZCBNaW5pbWFsIE1hcnNoYWxsZXIgaXMgdXNlZCB3aGVuIDEpIFRoZSB3ZWIgc2VydmljZSBpcyBEb2MvTGl0IG1pbmluYWwsIGFuZCAyKQotICogSkFYQiBhcnRpZmFjdHMgYXJlIG1pc3NpbmcgKGkuZS4gd2UgZG9uJ3QgaGF2ZSBPYmplY3RGYWN0b3JpZXMpCi0gKi8KLXB1YmxpYyBjbGFzcyBEb2NMaXRCYXJlTWluaW1hbE1ldGhvZE1hcnNoYWxsZXIgaW1wbGVtZW50cyBNZXRob2RNYXJzaGFsbGVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhEb2NMaXRCYXJlTWluaW1hbE1ldGhvZE1hcnNoYWxsZXIuY2xhc3MpOwotCi0gICAgcHVibGljIERvY0xpdEJhcmVNaW5pbWFsTWV0aG9kTWFyc2hhbGxlcigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGRlbWFyc2hhbFJlc3BvbnNlKE1lc3NhZ2UgbWVzc2FnZSwgT2JqZWN0W10gc2lnbmF0dXJlQXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhdGlvbkRlc2NyaXB0aW9uIG9wZXJhdGlvbkRlc2MpCi0gICAgICAgICAgICB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiBlZCA9IG9wZXJhdGlvbkRlc2MuZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbigpOwotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVuZHBvaW50RGVzYyA9IGVkLmdldEVuZHBvaW50RGVzY3JpcHRpb24oKTsKLQotICAgICAgICAvLyBOb3RlIGFsbCBleGNlcHRpb25zIGFyZSBjYXVnaHQgYW5kIHJldGhyb3duIHdpdGggYSBXZWJTZXJ2aWNlRXhjZXB0aW9uCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBTYW1wbGUgRG9jdW1lbnQgbWVzc2FnZQotICAgICAgICAgICAgLy8gLi4KLSAgICAgICAgICAgIC8vIDxzb2FwZW52OmJvZHk+Ci0gICAgICAgICAgICAvLyAgICA8bTpyZXR1cm4gLi4uID4uLi48L206cGFyYW0+Ci0gICAgICAgICAgICAvLyA8L3NvYXBlbnY6Ym9keT4KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBJbXBvcnRhbnQgcG9pbnRzLgotICAgICAgICAgICAgLy8gICAxKSBUaGVyZSBpcyBubyBvcGVyYXRpb24gZWxlbWVudCBpbiB0aGUgbWVzc2FnZQotICAgICAgICAgICAgLy8gICAyKSBUaGUgZGF0YSBibG9ja3MgYXJlIGxvY2F0ZWQgdW5kZXJuZWF0aCB0aGUgb3BlcmF0aW9uIGVsZW1lbnQuIAotICAgICAgICAgICAgLy8gICAzKSBUaGUgbmFtZSBvZiB0aGUgZGF0YSBibG9ja3MgKG06cGFyYW0pIGFyZSBkZWZpbmVkIGJ5IHRoZSBzY2hlbWEuCi0gICAgICAgICAgICAvLyAgICAgIChTT0FQIGluZGljYXRlcyB0aGF0IHRoZSBuYW1lIG9mIHRoZSBlbGVtZW50IGlzIG5vdCBpbXBvcnRhbnQsIGJ1dAotICAgICAgICAgICAgLy8gICAgICBmb3IgZG9jdW1lbnQgcHJvY2Vzc2luZywgd2Ugd2lsbCBhc3N1bWUgdGhhdCB0aGUgbmFtZSBjb3JyZXNwb25kcyB0byAKLSAgICAgICAgICAgIC8vICAgICAgYSBzY2hlbWEgcm9vdCBlbGVtZW50KQotICAgICAgICAgICAgLy8gICA0KSBUaGUgdHlwZSBvZiB0aGUgZGF0YSBibG9jayBpcyBkZWZpbmVkIGJ5IHNjaGVtYTsgdGh1cyBpbiBtb3N0IGNhc2VzCi0gICAgICAgICAgICAvLyAgICAgIGFuIHhzaTp0eXBlIHdpbGwgbm90IGJlIHByZXNlbnQKLSAgICAgICAgICAgIFBhcmFtZXRlckRlc2NyaXB0aW9uW10gcGRzID0gb3BlcmF0aW9uRGVzYy5nZXRQYXJhbWV0ZXJEZXNjcmlwdGlvbnMoKTsKLSAgICAgICAgICAgIE1hcnNoYWxTZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uIG1hcnNoYWxEZXNjID0KLSAgICAgICAgICAgICAgICAgICAgTWV0aG9kTWFyc2hhbGxlclV0aWxzLmdldE1hcnNoYWxEZXNjKGVuZHBvaW50RGVzYyk7Ci0gICAgICAgICAgICBUcmVlU2V0PFN0cmluZz4gcGFja2FnZXMgPSBtYXJzaGFsRGVzYy5nZXRQYWNrYWdlcygpOwotCi0gICAgICAgICAgICAvLyBHZXQgdGhlIHJldHVybiB2YWx1ZS4KLSAgICAgICAgICAgIENsYXNzIHJldHVyblR5cGUgPSBvcGVyYXRpb25EZXNjLmdldFJlc3VsdEFjdHVhbFR5cGUoKTsKLSAgICAgICAgICAgIE9iamVjdCByZXR1cm5WYWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICBib29sZWFuIGhhc1JldHVybkluQm9keSA9IGZhbHNlOwotICAgICAgICAgICAgaWYgKHJldHVyblR5cGUgIT0gdm9pZC5jbGFzcykgewotICAgICAgICAgICAgICAgIEF0dGFjaG1lbnREZXNjcmlwdGlvbiBhdHRhY2htZW50RGVzYyA9IAotICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25EZXNjLmdldFJlc3VsdEF0dGFjaG1lbnREZXNjcmlwdGlvbigpOwotICAgICAgICAgICAgICAgIGlmIChhdHRhY2htZW50RGVzYyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhdHRhY2htZW50RGVzYy5nZXRBdHRhY2htZW50VHlwZSgpID09IEF0dGFjaG1lbnRUeXBlLlNXQSkgewotICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY2lkID0gbWVzc2FnZS5nZXRBdHRhY2htZW50SUQoMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlID0gbWVzc2FnZS5nZXREYXRhSGFuZGxlcihjaWQpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgicGRFbGVtZW50RXJyIikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVXNlICJieUphdmFUeXBlIiB1bm1hcnNoYWxsaW5nIGlmIG5lY2Vzc2FyeQotICAgICAgICAgICAgICAgICAgICBDbGFzcyBieUphdmFUeXBlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKE1ldGhvZE1hcnNoYWxsZXJVdGlscy5pc05vdEpBWEJSb290RWxlbWVudChyZXR1cm5UeXBlLCBtYXJzaGFsRGVzYykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ5SmF2YVR5cGUgPSByZXR1cm5UeXBlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSB3ZWJyZXN1bHQgaXMgaW4gdGhlIGhlYWRlciwgd2UgbmVlZCB0aGUgbmFtZSBvZiB0aGUgaGVhZGVyIHNvIHRoYXQgd2UgY2FuIGZpbmQgaXQuCi0gICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgcmV0dXJuRWxlbWVudCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvcGVyYXRpb25EZXNjLmlzUmVzdWx0SGVhZGVyKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybkVsZW1lbnQgPSBNZXRob2RNYXJzaGFsbGVyVXRpbHMKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRSZXR1cm5FbGVtZW50KHBhY2thZ2VzLCBtZXNzYWdlLCBieUphdmFUeXBlLCBvcGVyYXRpb25EZXNjLmlzTGlzdFR5cGUoKSwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbkRlc2MuZ2V0UmVzdWx0VGFyZ2V0TmFtZXNwYWNlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25EZXNjLmdldFJlc3VsdE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGhvZE1hcnNoYWxsZXJVdGlscy5udW1PdXRwdXRCb2R5UGFyYW1zKHBkcykgPiAwKTsKLQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuRWxlbWVudCA9IE1ldGhvZE1hcnNoYWxsZXJVdGlscwotICAgICAgICAgICAgICAgICAgICAgICAgLmdldFJldHVybkVsZW1lbnQocGFja2FnZXMsIG1lc3NhZ2UsIGJ5SmF2YVR5cGUsIG9wZXJhdGlvbkRlc2MuaXNMaXN0VHlwZSgpLCBmYWxzZSwgbnVsbCwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGhvZE1hcnNoYWxsZXJVdGlscy5udW1PdXRwdXRCb2R5UGFyYW1zKHBkcykgPiAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGhhc1JldHVybkluQm9keSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy9UT0RPIHNob3VsZCB3ZSBhbGxvdyBudWxsIGlmIHRoZSByZXR1cm4gaXMgYSBoZWFkZXI/Ci0gICAgICAgICAgICAgICAgICAgIC8vVmFsaWRhdGUgaW5wdXQgcGFyYW1ldGVycyBmb3Igb3BlcmF0aW9uIGFuZCBtYWtlIHN1cmUgbm8gaW5wdXQgcGFyYW1ldGVycyBhcmUgbnVsbC4KLSAgICAgICAgICAgICAgICAgICAgLy9BcyBwZXIgSkFYV1MgU3BlY2lmaWNhdGlvbiBzZWN0aW9uIDMuNi4yLjMgaWYgYSBudWxsIHZhbHVlIGlzIHBhc3NlcyBhcyBhbiBhcmd1bWVudCAKLSAgICAgICAgICAgICAgICAgICAgLy90byBhIG1ldGhvZCB0aGVuIGFuIGltcGxlbWVudGF0aW9uIE1VU1QgdGhyb3cgV2ViU2VydmljZUV4Y2VwdGlvbi4KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUgPSByZXR1cm5FbGVtZW50LmdldFR5cGVWYWx1ZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoQ29udmVydFV0aWxzLmlzQ29udmVydGFibGUocmV0dXJuVmFsdWUsIHJldHVyblR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlID0gQ29udmVydFV0aWxzLmNvbnZlcnQocmV0dXJuVmFsdWUsIHJldHVyblR5cGUpOwotICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gV2Ugd2FudCB0byB1c2UgImJ5IEphdmEgVHlwZSIgdW5tYXJzaGFsbGluZyBmb3IgCi0gICAgICAgICAgICAvLyBhbGxhbGwgbm9uLUpBWEIgb2JqZWN0cwotICAgICAgICAgICAgQ2xhc3NbXSBqYXZhVHlwZXMgPSBuZXcgQ2xhc3NbcGRzLmxlbmd0aF07Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBkcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIFBhcmFtZXRlckRlc2NyaXB0aW9uIHBkID0gcGRzW2ldOwotICAgICAgICAgICAgICAgIENsYXNzIHR5cGUgPSBwZC5nZXRQYXJhbWV0ZXJBY3R1YWxUeXBlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKE1ldGhvZE1hcnNoYWxsZXJVdGlscy5pc05vdEpBWEJSb290RWxlbWVudCh0eXBlLCBtYXJzaGFsRGVzYykpIHsKLSAgICAgICAgICAgICAgICAgICAgamF2YVR5cGVzW2ldID0gdHlwZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFVubWFyc2hhbGwgdGhlIFBhcmFtVmFsdWVzIGZyb20gdGhlIE1lc3NhZ2UKLSAgICAgICAgICAgIExpc3Q8UERFbGVtZW50PiBwdkxpc3QgPSBNZXRob2RNYXJzaGFsbGVyVXRpbHMuZ2V0UERFbGVtZW50cyhwZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgLy8gb3V0cHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzUmV0dXJuSW5Cb2R5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmFUeXBlcyk7IC8vIGJ5SmF2YVR5cGUgdW5tYXJzaGFsbGluZwotCi0gICAgICAgICAgICAvLyBQb3B1bGF0ZSB0aGUgcmVzcG9uc2UgSG9sZGVycwotICAgICAgICAgICAgTWV0aG9kTWFyc2hhbGxlclV0aWxzLnVwZGF0ZVJlc3BvbnNlU2lnbmF0dXJlQXJncyhwZHMsIHB2TGlzdCwgc2lnbmF0dXJlQXJncyk7Ci0KLSAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0W10gZGVtYXJzaGFsUmVxdWVzdChNZXNzYWdlIG1lc3NhZ2UsIE9wZXJhdGlvbkRlc2NyaXB0aW9uIG9wZXJhdGlvbkRlc2MpCi0gICAgICAgICAgICB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiBlZCA9IG9wZXJhdGlvbkRlc2MuZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbigpOwotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVuZHBvaW50RGVzYyA9IGVkLmdldEVuZHBvaW50RGVzY3JpcHRpb24oKTsKLQotICAgICAgICAvLyBOb3RlIGFsbCBleGNlcHRpb25zIGFyZSBjYXVnaHQgYW5kIHJldGhyb3duIHdpdGggYSBXZWJTZXJ2aWNlRXhjZXB0aW9uCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBTYW1wbGUgRG9jdW1lbnQgbWVzc2FnZQotICAgICAgICAgICAgLy8gLi4KLSAgICAgICAgICAgIC8vIDxzb2FwZW52OmJvZHk+Ci0gICAgICAgICAgICAvLyAgICA8bTpwYXJhbSAuLiA+Li4uPC9tOnBhcmFtPgotICAgICAgICAgICAgLy8gPC9zb2FwZW52OmJvZHk+Ci0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gSW1wb3J0YW50IHBvaW50cy4KLSAgICAgICAgICAgIC8vICAgMSkgVGhlcmUgaXMgbm8gb3BlcmF0aW9uIGVsZW1lbnQgdW5kZXIgdGhlIGJvZHkuCi0gICAgICAgICAgICAvLyAgIDIpIFRoZSBkYXRhIGJsb2NrcyBhcmUgbG9jYXRlZCB1bmRlcm5lYXRoIHRoZSBib2R5LiAgCi0gICAgICAgICAgICAvLyAgIDMpIFRoZSBuYW1lIG9mIHRoZSBkYXRhIGJsb2NrcyAobTpwYXJhbSkgYXJlIGRlZmluZWQgYnkgdGhlIHNjaGVtYQotICAgICAgICAgICAgLy8gICA0KSBUaGUgdHlwZSBvZiB0aGUgZGF0YSBibG9jayAoZGF0YTpmb28pIGlzIGRlZmluZWQgYnkgc2NoZW1hIChhbmQgcHJvYmFibHkKLSAgICAgICAgICAgIC8vICAgICAgaXMgbm90IHByZXNlbnQgaW4gdGhlIG1lc3NhZ2UKLSAgICAgICAgICAgIFBhcmFtZXRlckRlc2NyaXB0aW9uW10gcGRzID0gb3BlcmF0aW9uRGVzYy5nZXRQYXJhbWV0ZXJEZXNjcmlwdGlvbnMoKTsKLSAgICAgICAgICAgIE1hcnNoYWxTZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uIG1hcnNoYWxEZXNjID0KLSAgICAgICAgICAgICAgICAgICAgTWV0aG9kTWFyc2hhbGxlclV0aWxzLmdldE1hcnNoYWxEZXNjKGVuZHBvaW50RGVzYyk7Ci0gICAgICAgICAgICBUcmVlU2V0PFN0cmluZz4gcGFja2FnZXMgPSBtYXJzaGFsRGVzYy5nZXRQYWNrYWdlcygpOwotCi0gICAgICAgICAgICAvLyBXZSB3YW50IHRvIHVzZSAiYnkgSmF2YSBUeXBlIiB1bm1hcnNoYWxsaW5nIGZvciAKLSAgICAgICAgICAgIC8vIGFsbGFsbCBub24tSkFYQiBvYmplY3RzCi0gICAgICAgICAgICBDbGFzc1tdIGphdmFUeXBlcyA9IG5ldyBDbGFzc1twZHMubGVuZ3RoXTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgUGFyYW1ldGVyRGVzY3JpcHRpb24gcGQgPSBwZHNbaV07Ci0gICAgICAgICAgICAgICAgQ2xhc3MgdHlwZSA9IHBkLmdldFBhcmFtZXRlckFjdHVhbFR5cGUoKTsKLSAgICAgICAgICAgICAgICAvLyBJZiBpdCBpcyBub3QgYSBKQVhCIFJvb3QgRWxlbWVudAotICAgICAgICAgICAgICAgIGlmIChNZXRob2RNYXJzaGFsbGVyVXRpbHMuaXNOb3RKQVhCUm9vdEVsZW1lbnQodHlwZSwgbWFyc2hhbERlc2MpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGphdmFUeXBlc1tpXSA9IHR5cGU7Ci0gICAgICAgICAgICAgICAgfSAKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gVW5tYXJzaGFsIHRoZSBQYXJhbVZhbHVlcyBmcm9tIHRoZSBtZXNzYWdlCi0gICAgICAgICAgICBMaXN0PFBERWxlbWVudD4gcHZMaXN0ID0gTWV0aG9kTWFyc2hhbGxlclV0aWxzLmdldFBERWxlbWVudHMocGRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgLy8gaW5wdXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhVHlwZXMpOyAvLyBuZXZlciB1bm1hcnNoYWwgYnkgdHlwZSBmb3IgZG9jL2xpdCBiYXJlCi0KLSAgICAgICAgICAgIC8vIEJ1aWxkIHRoZSBzaWduYXR1cmUgYXJndW1lbnRzCi0gICAgICAgICAgICBPYmplY3RbXSBzaWdBcmd1bWVudHMgPSBNZXRob2RNYXJzaGFsbGVyVXRpbHMuY3JlYXRlUmVxdWVzdFNpZ25hdHVyZUFyZ3MocGRzLCBwdkxpc3QpOwotICAgICAgICAgICAgcmV0dXJuIHNpZ0FyZ3VtZW50czsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgTWVzc2FnZSBtYXJzaGFsUmVzcG9uc2UoT2JqZWN0IHJldHVybk9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0W10gc2lnbmF0dXJlQXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmF0aW9uRGVzY3JpcHRpb24gb3BlcmF0aW9uRGVzYywgUHJvdG9jb2wgcHJvdG9jb2wpCi0gICAgICAgICAgICB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiBlZCA9IG9wZXJhdGlvbkRlc2MuZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbigpOwotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVuZHBvaW50RGVzYyA9IGVkLmdldEVuZHBvaW50RGVzY3JpcHRpb24oKTsKLQotICAgICAgICAvLyBXZSB3YW50IHRvIHJlc3BvbmQgd2l0aCB0aGUgc2FtZSBwcm90b2NvbCBhcyB0aGUgcmVxdWVzdCwKLSAgICAgICAgLy8gSXQgdGhlIHByb3RvY29sIGlzIG51bGwsIHRoZW4gdXNlIHRoZSBQcm90b2NvbCBkZWZpbmVkIGJ5IHRoZSBiaW5kaW5nCi0gICAgICAgIGlmIChwcm90b2NvbCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBwcm90b2NvbCA9IFByb3RvY29sLmdldFByb3RvY29sRm9yQmluZGluZyhlbmRwb2ludERlc2MuZ2V0QmluZGluZ1R5cGUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBOb3RlIGFsbCBleGNlcHRpb25zIGFyZSBjYXVnaHQgYW5kIHJldGhyb3duIHdpdGggYSBXZWJTZXJ2aWNlRXhjZXB0aW9uCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBTYW1wbGUgRG9jdW1lbnQgbWVzc2FnZQotICAgICAgICAgICAgLy8gLi4KLSAgICAgICAgICAgIC8vIDxzb2FwZW52OmJvZHk+Ci0gICAgICAgICAgICAvLyAgICA8bTpyZXR1cm4gLi4uID4uLi48L206cGFyYW0+Ci0gICAgICAgICAgICAvLyA8L3NvYXBlbnY6Ym9keT4KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBJbXBvcnRhbnQgcG9pbnRzLgotICAgICAgICAgICAgLy8gICAxKSBUaGVyZSBpcyBubyBvcGVyYXRpb24gZWxlbWVudCBpbiB0aGUgbWVzc2FnZQotICAgICAgICAgICAgLy8gICAyKSBUaGUgZGF0YSBibG9ja3MgYXJlIGxvY2F0ZWQgdW5kZXJuZWF0aCB0aGUgb3BlcmF0aW9uIGVsZW1lbnQuIAotICAgICAgICAgICAgLy8gICAzKSBUaGUgbmFtZSBvZiB0aGUgZGF0YSBibG9ja3MgKG06cGFyYW0pIGFyZSBkZWZpbmVkIGJ5IHRoZSBzY2hlbWEuCi0gICAgICAgICAgICAvLyAgICAgIChTT0FQIGluZGljYXRlcyB0aGF0IHRoZSBuYW1lIG9mIHRoZSBlbGVtZW50IGlzIG5vdCBpbXBvcnRhbnQsIGJ1dAotICAgICAgICAgICAgLy8gICAgICBmb3IgZG9jdW1lbnQgcHJvY2Vzc2luZywgd2Ugd2lsbCBhc3N1bWUgdGhhdCB0aGUgbmFtZSBjb3JyZXNwb25kcyB0byAKLSAgICAgICAgICAgIC8vICAgICAgYSBzY2hlbWEgcm9vdCBlbGVtZW50KQotICAgICAgICAgICAgLy8gICA0KSBUaGUgdHlwZSBvZiB0aGUgZGF0YSBibG9jayBpcyBkZWZpbmVkIGJ5IHNjaGVtYTsgdGh1cyBpbiBtb3N0IGNhc2VzCi0gICAgICAgICAgICAvLyAgICAgIGFuIHhzaTp0eXBlIHdpbGwgbm90IGJlIHByZXNlbnQKLQotICAgICAgICAgICAgLy8gR2V0IHRoZSBvcGVyYXRpb24gaW5mb3JtYXRpb24KLSAgICAgICAgICAgIFBhcmFtZXRlckRlc2NyaXB0aW9uW10gcGRzID0gb3BlcmF0aW9uRGVzYy5nZXRQYXJhbWV0ZXJEZXNjcmlwdGlvbnMoKTsKLSAgICAgICAgICAgIE1hcnNoYWxTZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uIG1hcnNoYWxEZXNjID0KLSAgICAgICAgICAgICAgICAgICAgTWV0aG9kTWFyc2hhbGxlclV0aWxzLmdldE1hcnNoYWxEZXNjKGVuZHBvaW50RGVzYyk7Ci0gICAgICAgICAgICBUcmVlU2V0PFN0cmluZz4gcGFja2FnZXMgPSBtYXJzaGFsRGVzYy5nZXRQYWNrYWdlcygpOwotCi0gICAgICAgICAgICAvLyBDcmVhdGUgdGhlIG1lc3NhZ2UgCi0gICAgICAgICAgICBNZXNzYWdlRmFjdG9yeSBtZiA9IChNZXNzYWdlRmFjdG9yeSlGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShNZXNzYWdlRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgICAgICBNZXNzYWdlIG0gPSBtZi5jcmVhdGUocHJvdG9jb2wpOwotCi0gICAgICAgICAgICAvLyBQdXQgdGhlIHJldHVybiBvYmplY3Qgb250byB0aGUgbWVzc2FnZQotICAgICAgICAgICAgQ2xhc3MgcmV0dXJuVHlwZSA9IG9wZXJhdGlvbkRlc2MuZ2V0UmVzdWx0QWN0dWFsVHlwZSgpOwotICAgICAgICAgICAgaWYgKHJldHVyblR5cGUgIT0gdm9pZC5jbGFzcykgewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIEF0dGFjaG1lbnREZXNjcmlwdGlvbiBhdHRhY2htZW50RGVzYyA9IAotICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25EZXNjLmdldFJlc3VsdEF0dGFjaG1lbnREZXNjcmlwdGlvbigpOwotICAgICAgICAgICAgICAgIGlmIChhdHRhY2htZW50RGVzYyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhdHRhY2htZW50RGVzYy5nZXRBdHRhY2htZW50VHlwZSgpID09IEF0dGFjaG1lbnRUeXBlLlNXQSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGFuIEF0dGFjaG1lbnQgb2JqZWN0IHdpdGggdGhlIHNpZ25hdHVyZSB2YWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgQXR0YWNobWVudCBhdHRhY2htZW50ID0gbmV3IEF0dGFjaG1lbnQocmV0dXJuT2JqZWN0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblR5cGUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0YWNobWVudERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25EZXNjLmdldFJlc3VsdFBhcnROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgbS5hZGREYXRhSGFuZGxlcihhdHRhY2htZW50LmdldERhdGFIYW5kbGVyKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRhY2htZW50LmdldENvbnRlbnRJRCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG0uc2V0RG9pbmdTV0EodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5LgotICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJwZEVsZW1lbnRFcnIiKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotCi0gICAgICAgICAgICAgICAgICAgIC8vIFVzZSBieUphdmFUeXBlIG1hcnNoYWxsaW5nIGlmIG5lY2Vzc2FyeQotICAgICAgICAgICAgICAgICAgICBDbGFzcyBieUphdmFUeXBlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKE1ldGhvZE1hcnNoYWxsZXJVdGlscy5pc05vdEpBWEJSb290RWxlbWVudChyZXR1cm5UeXBlLCBtYXJzaGFsRGVzYykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ5SmF2YVR5cGUgPSByZXR1cm5UeXBlOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgRWxlbWVudCByZXR1cm5FbGVtZW50ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgUU5hbWUgcmV0dXJuUU5hbWUgPSBuZXcgUU5hbWUob3BlcmF0aW9uRGVzYy5nZXRSZXN1bHRUYXJnZXROYW1lc3BhY2UoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uRGVzYy5nZXRSZXN1bHROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICBpZiAobWFyc2hhbERlc2MuZ2V0QW5ub3RhdGlvbkRlc2MocmV0dXJuVHlwZSkuaGFzWG1sUm9vdEVsZW1lbnQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuRWxlbWVudCA9IG5ldyBFbGVtZW50KHJldHVybk9iamVjdCwgcmV0dXJuUU5hbWUpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuRWxlbWVudCA9IG5ldyBFbGVtZW50KHJldHVybk9iamVjdCwgcmV0dXJuUU5hbWUsIHJldHVyblR5cGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIE1ldGhvZE1hcnNoYWxsZXJVdGlscy50b01lc3NhZ2UocmV0dXJuRWxlbWVudCwgcmV0dXJuVHlwZSwgb3BlcmF0aW9uRGVzYy5pc0xpc3RUeXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyc2hhbERlc2MsIG0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnlKYXZhVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25EZXNjLmlzUmVzdWx0SGVhZGVyKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gQ29udmVydCB0aGUgaG9sZGVyIG9iamVjdHMgaW50byBhIGxpc3Qgb2YgSkFYQiBvYmplY3RzIGZvciBtYXJzaGFsbGluZwotICAgICAgICAgICAgTGlzdDxQREVsZW1lbnQ+IHBkZUxpc3QgPSBNZXRob2RNYXJzaGFsbGVyVXRpbHMuZ2V0UERFbGVtZW50cyhtYXJzaGFsRGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduYXR1cmVBcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgLy8gb3V0cHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSk7Ci0KLSAgICAgICAgICAgIC8vIFdlIHdhbnQgdG8gdXNlICJieSBKYXZhIFR5cGUiIG1hcnNoYWxsaW5nIGZvciAKLSAgICAgICAgICAgIC8vIGFsbCBib2R5IGVsZW1lbnRzIGFuZCBhbGwgbm9uLUpBWEIgb2JqZWN0cwotICAgICAgICAgICAgZm9yIChQREVsZW1lbnQgcGRlIDogcGRlTGlzdCkgewotICAgICAgICAgICAgICAgIFBhcmFtZXRlckRlc2NyaXB0aW9uIHBkID0gcGRlLmdldFBhcmFtKCk7Ci0gICAgICAgICAgICAgICAgQ2xhc3MgdHlwZSA9IHBkLmdldFBhcmFtZXRlckFjdHVhbFR5cGUoKTsKLSAgICAgICAgICAgICAgICBpZiAoTWV0aG9kTWFyc2hhbGxlclV0aWxzLmlzTm90SkFYQlJvb3RFbGVtZW50KHR5cGUsIG1hcnNoYWxEZXNjKSkgewotICAgICAgICAgICAgICAgICAgICBwZGUuc2V0QnlKYXZhVHlwZUNsYXNzKHR5cGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gUHV0IHZhbHVlcyBvbnRvIHRoZSBtZXNzYWdlCi0gICAgICAgICAgICBNZXRob2RNYXJzaGFsbGVyVXRpbHMudG9NZXNzYWdlKHBkZUxpc3QsIG0sIHBhY2thZ2VzKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gRW5hYmxlIFNXQSBmb3IgbmVzdGVkIFN3YVJlZiBhdHRhY2htZW50cwotICAgICAgICAgICAgaWYgKG9wZXJhdGlvbkRlc2MuaGFzUmVzcG9uc2VTd2FSZWZBdHRhY2htZW50cygpKSB7Ci0gICAgICAgICAgICAgICAgbS5zZXREb2luZ1NXQSh0cnVlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG07Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIE1lc3NhZ2UgbWFyc2hhbFJlcXVlc3QoT2JqZWN0W10gc2lnbmF0dXJlQXJndW1lbnRzLCBPcGVyYXRpb25EZXNjcmlwdGlvbiBvcGVyYXRpb25EZXNjKQotICAgICAgICAgICAgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotCi0gICAgICAgIEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24gZWQgPSBvcGVyYXRpb25EZXNjLmdldEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24oKTsKLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlbmRwb2ludERlc2MgPSBlZC5nZXRFbmRwb2ludERlc2NyaXB0aW9uKCk7Ci0gICAgICAgIFByb3RvY29sIHByb3RvY29sID0gUHJvdG9jb2wuZ2V0UHJvdG9jb2xGb3JCaW5kaW5nKGVuZHBvaW50RGVzYy5nZXRDbGllbnRCaW5kaW5nSUQoKSk7Ci0KLSAgICAgICAgLy8gTm90ZSBhbGwgZXhjZXB0aW9ucyBhcmUgY2F1Z2h0IGFuZCByZXRocm93biB3aXRoIGEgV2ViU2VydmljZUV4Y2VwdGlvbgotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gU2FtcGxlIERvY3VtZW50IG1lc3NhZ2UKLSAgICAgICAgICAgIC8vIC4uCi0gICAgICAgICAgICAvLyA8c29hcGVudjpib2R5PgotICAgICAgICAgICAgLy8gICAgPG06cGFyYW0gLi4gPi4uLjwvbTpwYXJhbT4KLSAgICAgICAgICAgIC8vIDwvc29hcGVudjpib2R5PgotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8vIEltcG9ydGFudCBwb2ludHMuCi0gICAgICAgICAgICAvLyAgIDEpIFRoZXJlIGlzIG5vIG9wZXJhdGlvbiBlbGVtZW50IHVuZGVyIHRoZSBib2R5LgotICAgICAgICAgICAgLy8gICAyKSBUaGUgZGF0YSBibG9ja3MgYXJlIGxvY2F0ZWQgdW5kZXJuZWF0aCB0aGUgYm9keS4gIAotICAgICAgICAgICAgLy8gICAzKSBUaGUgbmFtZSBvZiB0aGUgZGF0YSBibG9ja3MgKG06cGFyYW0pIGFyZSBkZWZpbmVkIGJ5IHRoZSBzY2hlbWEKLSAgICAgICAgICAgIC8vICAgNCkgVGhlIHR5cGUgb2YgdGhlIGRhdGEgYmxvY2sgKGRhdGE6Zm9vKSBpcyBkZWZpbmVkIGJ5IHNjaGVtYSAoYW5kIHByb2JhYmx5Ci0gICAgICAgICAgICAvLyAgICAgIGlzIG5vdCBwcmVzZW50IGluIHRoZSBtZXNzYWdlCi0KLSAgICAgICAgICAgIC8vIEdldCB0aGUgb3BlcmF0aW9uIGluZm9ybWF0aW9uCi0gICAgICAgICAgICBQYXJhbWV0ZXJEZXNjcmlwdGlvbltdIHBkcyA9IG9wZXJhdGlvbkRlc2MuZ2V0UGFyYW1ldGVyRGVzY3JpcHRpb25zKCk7Ci0gICAgICAgICAgICBNYXJzaGFsU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbiBtYXJzaGFsRGVzYyA9Ci0gICAgICAgICAgICAgICAgICAgIE1ldGhvZE1hcnNoYWxsZXJVdGlscy5nZXRNYXJzaGFsRGVzYyhlbmRwb2ludERlc2MpOwotICAgICAgICAgICAgVHJlZVNldDxTdHJpbmc+IHBhY2thZ2VzID0gbWFyc2hhbERlc2MuZ2V0UGFja2FnZXMoKTsKLQotICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBtZXNzYWdlIAotICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkgbWYgPSAoTWVzc2FnZUZhY3RvcnkpRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoTWVzc2FnZUZhY3RvcnkuY2xhc3MpOwotICAgICAgICAgICAgTWVzc2FnZSBtID0gbWYuY3JlYXRlKHByb3RvY29sKTsKLQotICAgICAgICAgICAgLy8gVGhlIGlucHV0IG9iamVjdCByZXByZXNlbnQgdGhlIHNpZ25hdHVyZSBhcmd1bWVudHMuCi0gICAgICAgICAgICAvLyBTaWduYXR1cmUgYXJndW1lbnRzIGFyZSBib3RoIGhvbGRlcnMgYW5kIG5vbi1ob2xkZXJzCi0gICAgICAgICAgICAvLyBDb252ZXJ0IHRoZSBzaWduYXR1cmUgaW50byBhIGxpc3Qgb2YgSkFYQiBvYmplY3RzIGZvciBtYXJzaGFsbGluZwotICAgICAgICAgICAgTGlzdDxQREVsZW1lbnQ+IHBkZUxpc3QgPSBNZXRob2RNYXJzaGFsbGVyVXRpbHMuZ2V0UERFbGVtZW50cyhtYXJzaGFsRGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduYXR1cmVBcmd1bWVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsICAvLyBpbnB1dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UpOwotCi0gICAgICAgICAgICAvLyBXZSB3YW50IHRvIHVzZSAiYnkgSmF2YSBUeXBlIiBtYXJzaGFsbGluZyBmb3IgCi0gICAgICAgICAgICAvLyBhbGwgYm9keSBlbGVtZW50cyBhbmQgYWxsIG5vbi1KQVhCIG9iamVjdHMKLSAgICAgICAgICAgIGZvciAoUERFbGVtZW50IHBkZSA6IHBkZUxpc3QpIHsKLSAgICAgICAgICAgICAgICBQYXJhbWV0ZXJEZXNjcmlwdGlvbiBwZCA9IHBkZS5nZXRQYXJhbSgpOwotICAgICAgICAgICAgICAgIENsYXNzIHR5cGUgPSBwZC5nZXRQYXJhbWV0ZXJBY3R1YWxUeXBlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKE1ldGhvZE1hcnNoYWxsZXJVdGlscy5pc05vdEpBWEJSb290RWxlbWVudCh0eXBlLCBtYXJzaGFsRGVzYykpIHsKLSAgICAgICAgICAgICAgICAgICAgcGRlLnNldEJ5SmF2YVR5cGVDbGFzcyh0eXBlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFB1dCB2YWx1ZXMgb250byB0aGUgbWVzc2FnZS4uLm1hcnNoYWxsaW5nIGJ5IHR5cGUKLSAgICAgICAgICAgIE1ldGhvZE1hcnNoYWxsZXJVdGlscy50b01lc3NhZ2UocGRlTGlzdCwgbSwgcGFja2FnZXMpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBFbmFibGUgU1dBIGZvciBuZXN0ZWQgU3dhUmVmIGF0dGFjaG1lbnRzCi0gICAgICAgICAgICBpZiAob3BlcmF0aW9uRGVzYy5oYXNSZXF1ZXN0U3dhUmVmQXR0YWNobWVudHMoKSkgewotICAgICAgICAgICAgICAgIG0uc2V0RG9pbmdTV0EodHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBtOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBNZXNzYWdlIG1hcnNoYWxGYXVsdFJlc3BvbnNlKFRocm93YWJsZSB0aHJvd2FibGUsIE9wZXJhdGlvbkRlc2NyaXB0aW9uIG9wZXJhdGlvbkRlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvdG9jb2wgcHJvdG9jb2wpIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLQotICAgICAgICBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uIGVkID0gb3BlcmF0aW9uRGVzYy5nZXRFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZW5kcG9pbnREZXNjID0gZWQuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbigpOwotICAgICAgICBNYXJzaGFsU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbiBtYXJzaGFsRGVzYyA9Ci0gICAgICAgICAgICAgICAgTWV0aG9kTWFyc2hhbGxlclV0aWxzLmdldE1hcnNoYWxEZXNjKGVuZHBvaW50RGVzYyk7Ci0KLSAgICAgICAgLy8gV2Ugd2FudCB0byByZXNwb25kIHdpdGggdGhlIHNhbWUgcHJvdG9jb2wgYXMgdGhlIHJlcXVlc3QsCi0gICAgICAgIC8vIEl0IHRoZSBwcm90b2NvbCBpcyBudWxsLCB0aGVuIHVzZSB0aGUgUHJvdG9jb2wgZGVmaW5lZCBieSB0aGUgYmluZGluZwotICAgICAgICBpZiAocHJvdG9jb2wgPT0gbnVsbCkgewotICAgICAgICAgICAgcHJvdG9jb2wgPSBQcm90b2NvbC5nZXRQcm90b2NvbEZvckJpbmRpbmcoZW5kcG9pbnREZXNjLmdldEJpbmRpbmdUeXBlKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTm90ZSBhbGwgZXhjZXB0aW9ucyBhcmUgY2F1Z2h0IGFuZCByZXRocm93biB3aXRoIGEgV2ViU2VydmljZUV4Y2VwdGlvbgotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBtZXNzYWdlIAotICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkgbWYgPSAoTWVzc2FnZUZhY3RvcnkpRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoTWVzc2FnZUZhY3RvcnkuY2xhc3MpOwotICAgICAgICAgICAgTWVzc2FnZSBtID0gbWYuY3JlYXRlKHByb3RvY29sKTsKLQotICAgICAgICAgICAgLy8gUHV0IHRoZSBmYXVsdCBvbnRvIHRoZSBtZXNzYWdlCi0gICAgICAgICAgICBNZXRob2RNYXJzaGFsbGVyVXRpbHMubWFyc2hhbEZhdWx0UmVzcG9uc2UodGhyb3dhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcnNoYWxEZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbkRlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbSk7Ci0gICAgICAgICAgICByZXR1cm4gbTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgVGhyb3dhYmxlIGRlbWFyc2hhbEZhdWx0UmVzcG9uc2UoTWVzc2FnZSBtZXNzYWdlLCBPcGVyYXRpb25EZXNjcmlwdGlvbiBvcGVyYXRpb25EZXNjKQotICAgICAgICAgICAgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotCi0gICAgICAgIEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24gZWQgPSBvcGVyYXRpb25EZXNjLmdldEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24oKTsKLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlbmRwb2ludERlc2MgPSBlZC5nZXRFbmRwb2ludERlc2NyaXB0aW9uKCk7Ci0gICAgICAgIE1hcnNoYWxTZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uIG1hcnNoYWxEZXNjID0KLSAgICAgICAgICAgICAgICBNZXRob2RNYXJzaGFsbGVyVXRpbHMuZ2V0TWFyc2hhbERlc2MoZW5kcG9pbnREZXNjKTsKLQotICAgICAgICAvLyBOb3RlIGFsbCBleGNlcHRpb25zIGFyZSBjYXVnaHQgYW5kIHJldGhyb3duIHdpdGggYSBXZWJTZXJ2aWNlRXhjZXB0aW9uCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBUaHJvd2FibGUgdCA9IE1ldGhvZE1hcnNoYWxsZXJVdGlscwotICAgICAgICAgICAgICAgICAgICAuZGVtYXJzaGFsRmF1bHRSZXNwb25zZShvcGVyYXRpb25EZXNjLCBtYXJzaGFsRGVzYywgbWVzc2FnZSk7Ci0gICAgICAgICAgICByZXR1cm4gdDsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21hcnNoYWxsZXIvaW1wbC9hbHQvRG9jTGl0V3JhcHBlZE1ldGhvZE1hcnNoYWxsZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21hcnNoYWxsZXIvaW1wbC9hbHQvRG9jTGl0V3JhcHBlZE1ldGhvZE1hcnNoYWxsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTEwMWFhYy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tYXJzaGFsbGVyL2ltcGwvYWx0L0RvY0xpdFdyYXBwZWRNZXRob2RNYXJzaGFsbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NjcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1hcnNoYWxsZXIuaW1wbC5hbHQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLkV4Y2VwdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5FbmRwb2ludERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLk9wZXJhdGlvbkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uUGFyYW1ldGVyRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5pMThuLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWFyc2hhbGxlci5NZXRob2RNYXJzaGFsbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5CbG9jazsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuTWVzc2FnZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuUHJvdG9jb2w7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmRhdGFiaW5kaW5nLkpBWEJCbG9ja0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmZhY3RvcnkuSkFYQkJsb2NrRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZmFjdG9yeS5NZXNzYWdlRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnJlZ2lzdHJ5LkZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnJ1bnRpbWUuZGVzY3JpcHRpb24ubWFyc2hhbC5NYXJzaGFsU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnV0aWxpdHkuQ29udmVydFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Mud3JhcHBlci5KQVhCV3JhcHBlclRvb2w7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy53cmFwcGVyLmltcGwuSkFYQldyYXBwZXJUb29sSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbS5Nb2RlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJFbGVtZW50OwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwotCi1wdWJsaWMgY2xhc3MgRG9jTGl0V3JhcHBlZE1ldGhvZE1hcnNoYWxsZXIgaW1wbGVtZW50cyBNZXRob2RNYXJzaGFsbGVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhEb2NMaXRXcmFwcGVkTWV0aG9kTWFyc2hhbGxlci5jbGFzcyk7Ci0KLQotICAgIHB1YmxpYyBEb2NMaXRXcmFwcGVkTWV0aG9kTWFyc2hhbGxlcigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGRlbWFyc2hhbFJlc3BvbnNlKE1lc3NhZ2UgbWVzc2FnZSwgT2JqZWN0W10gc2lnbmF0dXJlQXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhdGlvbkRlc2NyaXB0aW9uIG9wZXJhdGlvbkRlc2MpCi0gICAgICAgICAgICB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIE5vdGUgYWxsIGV4Y2VwdGlvbnMgYXJlIGNhdWdodCBhbmQgcmV0aHJvd24gd2l0aCBhIFdlYlNlcnZpY2VFeGNlcHRpb24KLQotICAgICAgICBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uIGVkID0gb3BlcmF0aW9uRGVzYy5nZXRFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZW5kcG9pbnREZXNjID0gZWQuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbigpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBTYW1wbGUgRG9jdW1lbnQgbWVzc2FnZQotICAgICAgICAgICAgLy8gLi4KLSAgICAgICAgICAgIC8vIDxzb2FwZW52OmJvZHk+Ci0gICAgICAgICAgICAvLyAgICA8bTpvcGVyYXRpb25SZXNwb25zZSAuLi4gPgotICAgICAgICAgICAgLy8gICAgICAgPHBhcmFtPmhlbGxvPC9wYXJhbT4KLSAgICAgICAgICAgIC8vICAgIDwvbTpvcGVyYXRpb25SZXNwb25zZT4KLSAgICAgICAgICAgIC8vIDwvc29hcGVudjpib2R5PgotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8vIEltcG9ydGFudCBwb2ludHMuCi0gICAgICAgICAgICAvLyAgIDEpIFRoZXJlIGlzIG5vIG9wZXJhdGlvbiBlbGVtZW50IGluIHRoZSBtZXNzYWdlCi0gICAgICAgICAgICAvLyAgIDIpIFRoZSBkYXRhIGJsb2NrcyBhcmUgbG9jYXRlZCB1bmRlcm5lYXRoIHRoZSBib2R5IGVsZW1lbnQuIAotICAgICAgICAgICAgLy8gICAzKSBUaGUgbmFtZSBvZiB0aGUgZGF0YSBibG9jayAobTpvcGVyYXRpb25SZXNwb25zZSkgaXMgZGVmaW5lZCBieSB0aGUgc2NoZW1hLgotICAgICAgICAgICAgLy8gICAgICBJdCBtYXRjaGVzIHRoZSBvcGVyYXRpb24gbmFtZSArICJSZXNwb25zZSIsIGFuZCBpdCBoYXMgYSBjb3JyZXNwb25kaW5nIEpBWEIgZWxlbWVudC4KLSAgICAgICAgICAgIC8vICAgICAgVGhpcyBlbGVtZW50IGlzIGNhbGxlZCB0aGUgd3JhcHBlciBlbGVtZW50Ci0gICAgICAgICAgICAvLyAgIDQpIFRoZSBwYXJhbWV0ZXJzIGFyZSAocGFyYW0pIGFyZSBjaGlsZCBlbGVtZW50cyBvZiB0aGUgd3JhcHBlciBlbGVtZW50LgotICAgICAgICAgICAgUGFyYW1ldGVyRGVzY3JpcHRpb25bXSBwZHMgPSBvcGVyYXRpb25EZXNjLmdldFBhcmFtZXRlckRlc2NyaXB0aW9ucygpOwotICAgICAgICAgICAgTWFyc2hhbFNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb24gbWFyc2hhbERlc2MgPQotICAgICAgICAgICAgICAgICAgICBNZXRob2RNYXJzaGFsbGVyVXRpbHMuZ2V0TWFyc2hhbERlc2MoZW5kcG9pbnREZXNjKTsKLSAgICAgICAgICAgIFRyZWVTZXQ8U3RyaW5nPiBwYWNrYWdlcyA9IG1hcnNoYWxEZXNjLmdldFBhY2thZ2VzKCk7Ci0gICAgICAgICAgICBTdHJpbmcgcGFja2FnZXNLZXkgPSBtYXJzaGFsRGVzYy5nZXRQYWNrYWdlc0tleSgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBSZW1lbWJlciB0aGlzIHVubWFyc2hhbCBpbmZvcm1hdGlvbiBzbyB0aGF0IHdlIGNhbiBzcGVlZCB1cCBwcm9jZXNzaW5nCi0gICAgICAgICAgICAvLyB0aGUgbmV4dCB0aW1lLgotICAgICAgICAgICAgTWV0aG9kTWFyc2hhbGxlclV0aWxzLnJlZ2lzdGVyVW5tYXJzaGFsSW5mbyhtZXNzYWdlLmdldE1lc3NhZ2VDb250ZXh0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlc0tleSk7Ci0KLSAgICAgICAgICAgIC8vIERldGVybWluZSBpZiBhIHJldHVyblZhbHVlIGlzIGV4cGVjdGVkLgotICAgICAgICAgICAgLy8gVGhlIHJldHVybiB2YWx1ZSBtYXkgYmUgYW4gY2hpbGQgZWxlbWVudAotICAgICAgICAgICAgLy8gVGhlIHdyYXBwZXIgZWxlbWVudCAKLSAgICAgICAgICAgIC8vIG9yIG51bGwKLSAgICAgICAgICAgIE9iamVjdCByZXR1cm5WYWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICBDbGFzcyByZXR1cm5UeXBlID0gb3BlcmF0aW9uRGVzYy5nZXRSZXN1bHRBY3R1YWxUeXBlKCk7Ci0gICAgICAgICAgICBib29sZWFuIGlzQ2hpbGRSZXR1cm4gPSAhb3BlcmF0aW9uRGVzYy5pc0pBWFdTQXN5bmNDbGllbnRNZXRob2QoKSAmJgotICAgICAgICAgICAgICAgICAgICAob3BlcmF0aW9uRGVzYy5nZXRSZXN1bHRQYXJ0TmFtZSgpICE9IG51bGwpOwotICAgICAgICAgICAgYm9vbGVhbiBpc05vUmV0dXJuID0gKHJldHVyblR5cGUgPT0gdm9pZC5jbGFzcyk7Ci0KLSAgICAgICAgICAgIC8vIEluIHVzYWdlPVdSQVBQRUQsIHRoZXJlIHdpbGwgYmUgYSBzaW5nbGUgSkFYQiBibG9jayBpbnNpZGUgdGhlIGJvZHkuCi0gICAgICAgICAgICAvLyBHZXQgdGhpcyBibG9jawotICAgICAgICAgICAgSkFYQkJsb2NrQ29udGV4dCBibG9ja0NvbnRleHQgPSBuZXcgSkFYQkJsb2NrQ29udGV4dChwYWNrYWdlcywgcGFja2FnZXNLZXkpOwotICAgICAgICAgICAgYmxvY2tDb250ZXh0LnNldFdlYlNlcnZpY2VOYW1lc3BhY2UoZWQuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICAgICAgSkFYQkJsb2NrRmFjdG9yeSBmYWN0b3J5ID0KLSAgICAgICAgICAgICAgICAgICAgKEpBWEJCbG9ja0ZhY3RvcnkpRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoSkFYQkJsb2NrRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgICAgICBCbG9jayBibG9jayA9IG1lc3NhZ2UuZ2V0Qm9keUJsb2NrKGJsb2NrQ29udGV4dCwgZmFjdG9yeSk7Ci0gICAgICAgICAgICBPYmplY3Qgd3JhcHBlck9iamVjdCA9IGJsb2NrLmdldEJ1c2luZXNzT2JqZWN0KHRydWUpOwotCi0gICAgICAgICAgICAvLyBUaGUgY2hpbGQgZWxlbWVudHMgYXJlIHdpdGhpbiB0aGUgb2JqZWN0IHRoYXQgCi0gICAgICAgICAgICAvLyByZXByZXNlbnRzIHRoZSB0eXBlCi0gICAgICAgICAgICBpZiAod3JhcHBlck9iamVjdCBpbnN0YW5jZW9mIEpBWEJFbGVtZW50KSB7Ci0gICAgICAgICAgICAgICAgd3JhcHBlck9iamVjdCA9ICgoSkFYQkVsZW1lbnQpd3JhcHBlck9iamVjdCkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gVXNlIHRoZSB3cmFwcGVyIHRvb2wgdG8gZ2V0IHRoZSBjaGlsZCBvYmplY3RzLgotICAgICAgICAgICAgSkFYQldyYXBwZXJUb29sIHdyYXBwZXJUb29sID0gbmV3IEpBWEJXcmFwcGVyVG9vbEltcGwoKTsKLQotICAgICAgICAgICAgLy8gR2V0IHRoZSBsaXN0IG9mIG5hbWVzIGZvciB0aGUgb3V0cHV0IHBhcmFtZXRlcnMKLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBuYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICAgICAgTGlzdDxQYXJhbWV0ZXJEZXNjcmlwdGlvbj4gcGRMaXN0ID0gbmV3IEFycmF5TGlzdDxQYXJhbWV0ZXJEZXNjcmlwdGlvbj4oKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgUGFyYW1ldGVyRGVzY3JpcHRpb24gcGQgPSBwZHNbaV07Ci0gICAgICAgICAgICAgICAgaWYgKHBkLmdldE1vZGUoKSA9PSBNb2RlLk9VVCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgcGQuZ2V0TW9kZSgpID09IE1vZGUuSU5PVVQpIHsKLSAgICAgICAgICAgICAgICAgICAgbmFtZXMuYWRkKHBkLmdldFBhcmFtZXRlck5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHBkTGlzdC5hZGQocGQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gVGhlIHJldHVybiBuYW1lIGlzIGFkZGVkIGFzIHRoZSBsYXN0IG5hbWUKLSAgICAgICAgICAgIGlmIChpc0NoaWxkUmV0dXJuICYmICFpc05vUmV0dXJuKSB7Ci0gICAgICAgICAgICAgICAgbmFtZXMuYWRkKG9wZXJhdGlvbkRlc2MuZ2V0UmVzdWx0UGFydE5hbWUoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEdldCB0aGUgY2hpbGQgb2JqZWN0cwotICAgICAgICAgICAgT2JqZWN0W10gb2JqZWN0cyA9IHdyYXBwZXJUb29sLnVuV3JhcCh3cmFwcGVyT2JqZWN0LCBuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyc2hhbERlc2MuZ2V0UHJvcGVydHlEZXNjcmlwdG9yTWFwKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBwZXJPYmplY3QuZ2V0Q2xhc3MoKSkpOwotCi0gICAgICAgICAgICAvLyBOb3cgY3JlYXRlIGEgbGlzdCBvZiBwYXJhbVZhbHVlcyBzbyB0aGF0IHdlIGNhbiBwb3B1bGF0ZSB0aGUgc2lnbmF0dXJlCi0gICAgICAgICAgICBMaXN0PFBERWxlbWVudD4gcHZMaXN0ID0gbmV3IEFycmF5TGlzdDxQREVsZW1lbnQ+KCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBkTGlzdC5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIFBhcmFtZXRlckRlc2NyaXB0aW9uIHBkID0gcGRMaXN0LmdldChpKTsKLSAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBvYmplY3RzW2ldOwotICAgICAgICAgICAgICAgIC8vIFRoZSBvYmplY3QgaW4gdGhlIFBERWxlbWVudCBtdXN0IGJlIGFuIGVsZW1lbnQKLSAgICAgICAgICAgICAgICBFbGVtZW50IGVsZW1lbnQgPSBudWxsOwotICAgICAgICAgICAgICAgIFFOYW1lIHFOYW1lID0gbmV3IFFOYW1lKHBkLmdldFRhcmdldE5hbWVzcGFjZSgpLCBwZC5nZXRQYXJ0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICBpZiAoIW1hcnNoYWxEZXNjLmdldEFubm90YXRpb25EZXNjKHBkLmdldFBhcmFtZXRlckFjdHVhbFR5cGUoKSkuaGFzWG1sUm9vdEVsZW1lbnQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgPSBuZXcgRWxlbWVudCh2YWx1ZSwgcU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZC5nZXRQYXJhbWV0ZXJBY3R1YWxUeXBlKCkpOwotCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZWxlbWVudCA9IG5ldyBFbGVtZW50KHZhbHVlLCBxTmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHB2TGlzdC5hZGQobmV3IFBERWxlbWVudChwZCwgZWxlbWVudCwgbnVsbCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBQb3B1bGF0ZSB0aGUgcmVzcG9uc2UgSG9sZGVycyBpbiB0aGUgc2lnbmF0dXJlCi0gICAgICAgICAgICBNZXRob2RNYXJzaGFsbGVyVXRpbHMudXBkYXRlUmVzcG9uc2VTaWduYXR1cmVBcmdzKHBkcywgcHZMaXN0LCBzaWduYXR1cmVBcmdzKTsKLQotICAgICAgICAgICAgLy8gTm93IGdldCB0aGUgcmV0dXJuIHZhbHVlCi0gICAgICAgICAgICBpZiAoaXNOb1JldHVybikgewotICAgICAgICAgICAgICAgIHJldHVyblZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNDaGlsZFJldHVybikgewotICAgICAgICAgICAgICAgIHJldHVyblZhbHVlID0gb2JqZWN0c1tvYmplY3RzLmxlbmd0aCAtIDFdOwotICAgICAgICAgICAgICAgIC8vIHJldHVyblZhbHVlIG1heSBiZSBpbmNvbXBhdGlibGUgd2l0aCBKQVgtV1Mgc2lnbmF0dXJlCi0gICAgICAgICAgICAgICAgaWYgKENvbnZlcnRVdGlscy5pc0NvbnZlcnRhYmxlKHJldHVyblZhbHVlLCByZXR1cm5UeXBlKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZSA9IENvbnZlcnRVdGlscy5jb252ZXJ0KHJldHVyblZhbHVlLCByZXR1cm5UeXBlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgb2JqZWN0Q2xhc3MgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZXR1cm5WYWx1ZSA9PSBudWxsKSA/ICJudWxsIiA6IHJldHVyblZhbHVlLmdldENsYXNzKCkuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoImNvbnZlcnRQcm9ibGVtIiwgb2JqZWN0Q2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5UeXBlLmdldE5hbWUoKSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUgPSB3cmFwcGVyT2JqZWN0OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdFtdIGRlbWFyc2hhbFJlcXVlc3QoTWVzc2FnZSBtZXNzYWdlLCBPcGVyYXRpb25EZXNjcmlwdGlvbiBvcGVyYXRpb25EZXNjKQotICAgICAgICAgICAgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotCi0gICAgICAgIEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24gZWQgPSBvcGVyYXRpb25EZXNjLmdldEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24oKTsKLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlbmRwb2ludERlc2MgPSBlZC5nZXRFbmRwb2ludERlc2NyaXB0aW9uKCk7Ci0KLSAgICAgICAgLy8gTm90ZSBhbGwgZXhjZXB0aW9ucyBhcmUgY2F1Z2h0IGFuZCByZXRocm93biB3aXRoIGEgV2ViU2VydmljZUV4Y2VwdGlvbgotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gU2FtcGxlIERvY3VtZW50IG1lc3NhZ2UKLSAgICAgICAgICAgIC8vIC4uCi0gICAgICAgICAgICAvLyA8c29hcGVudjpib2R5PgotICAgICAgICAgICAgLy8gICAgPG06b3BlcmF0aW9uPgotICAgICAgICAgICAgLy8gICAgICA8cGFyYW0+aGVsbG88L3BhcmFtPgotICAgICAgICAgICAgLy8gICAgPC9tOm9wZXJhdGlvbj4KLSAgICAgICAgICAgIC8vIDwvc29hcGVudjpib2R5PgotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8vIEltcG9ydGFudCBwb2ludHMuCi0gICAgICAgICAgICAvLyAgIDEpIFRoZXJlIGlzIG5vIG9wZXJhdGlvbiBlbGVtZW50IHVuZGVyIHRoZSBib2R5LgotICAgICAgICAgICAgLy8gICAyKSBUaGUgZGF0YSBibG9ja3MgYXJlIGxvY2F0ZWQgdW5kZXJuZWF0aCB0aGUgYm9keS4gIAotICAgICAgICAgICAgLy8gICAzKSBUaGUgbmFtZSBvZiB0aGUgZGF0YSBibG9jayAobTpvcGVyYXRpb24pIGlzIGRlZmluZWQgYnkgdGhlIHNjaGVtYSBhbmQgbWF0Y2ggdGhlIG5hbWUgb2YgdGhlIG9wZXJhdGlvbi4KLSAgICAgICAgICAgIC8vICAgICAgVGhpcyBpcyBjYWxsZWQgdGhlIHdyYXBwZXIgZWxlbWVudC4gIFRoZSB3cmFwcGVyIGVsZW1lbnQgaGFzIGEgY29ycmVzcG9uZGluZyBKQVhCIGVsZW1lbnQgcG9qby4KLSAgICAgICAgICAgIC8vICAgNCkgVGhlIHBhcmFtZXRlcnMgKG06cGFyYW0pIGFyZSBjaGlsZCBlbGVtZW50cyBvZiB0aGUgd3JhcHBlciBlbGVtZW50LgotICAgICAgICAgICAgUGFyYW1ldGVyRGVzY3JpcHRpb25bXSBwZHMgPSBvcGVyYXRpb25EZXNjLmdldFBhcmFtZXRlckRlc2NyaXB0aW9ucygpOwotICAgICAgICAgICAgTWFyc2hhbFNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb24gbWFyc2hhbERlc2MgPQotICAgICAgICAgICAgICAgICAgICBNZXRob2RNYXJzaGFsbGVyVXRpbHMuZ2V0TWFyc2hhbERlc2MoZW5kcG9pbnREZXNjKTsKLSAgICAgICAgICAgIFRyZWVTZXQ8U3RyaW5nPiBwYWNrYWdlcyA9IG1hcnNoYWxEZXNjLmdldFBhY2thZ2VzKCk7Ci0gICAgICAgICAgICBTdHJpbmcgcGFja2FnZXNLZXkgPSBtYXJzaGFsRGVzYy5nZXRQYWNrYWdlc0tleSgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBNZXRob2RNYXJzaGFsbGVyVXRpbHMucmVnaXN0ZXJVbm1hcnNoYWxJbmZvKG1lc3NhZ2UuZ2V0TWVzc2FnZUNvbnRleHQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VzS2V5KTsKLQotICAgICAgICAgICAgLy8gSW4gdXNhZ2U9V1JBUFBFRCwgdGhlcmUgd2lsbCBiZSBhIHNpbmdsZSBKQVhCIGJsb2NrIGluc2lkZSB0aGUgYm9keS4KLSAgICAgICAgICAgIC8vIEdldCB0aGlzIGJsb2NrCi0gICAgICAgICAgICBKQVhCQmxvY2tDb250ZXh0IGJsb2NrQ29udGV4dCA9IG5ldyBKQVhCQmxvY2tDb250ZXh0KHBhY2thZ2VzLCBwYWNrYWdlc0tleSk7Ci0gICAgICAgICAgICBibG9ja0NvbnRleHQuc2V0V2ViU2VydmljZU5hbWVzcGFjZShlZC5nZXRUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgICAgICBKQVhCQmxvY2tGYWN0b3J5IGZhY3RvcnkgPQotICAgICAgICAgICAgICAgICAgICAoSkFYQkJsb2NrRmFjdG9yeSlGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShKQVhCQmxvY2tGYWN0b3J5LmNsYXNzKTsKLSAgICAgICAgICAgIEJsb2NrIGJsb2NrID0gbWVzc2FnZS5nZXRCb2R5QmxvY2soYmxvY2tDb250ZXh0LCBmYWN0b3J5KTsKLSAgICAgICAgICAgIE9iamVjdCB3cmFwcGVyT2JqZWN0ID0gYmxvY2suZ2V0QnVzaW5lc3NPYmplY3QodHJ1ZSk7Ci0KLSAgICAgICAgICAgIC8vIFRoZSBjaGlsZCBlbGVtZW50cyBhcmUgd2l0aGluIHRoZSBvYmplY3QgdGhhdCAKLSAgICAgICAgICAgIC8vIHJlcHJlc2VudHMgdGhlIHR5cGUKLSAgICAgICAgICAgIGlmICh3cmFwcGVyT2JqZWN0IGluc3RhbmNlb2YgSkFYQkVsZW1lbnQpIHsKLSAgICAgICAgICAgICAgICB3cmFwcGVyT2JqZWN0ID0gKChKQVhCRWxlbWVudCl3cmFwcGVyT2JqZWN0KS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBVc2UgdGhlIHdyYXBwZXIgdG9vbCB0byBnZXQgdGhlIGNoaWxkIG9iamVjdHMuCi0gICAgICAgICAgICBKQVhCV3JhcHBlclRvb2wgd3JhcHBlclRvb2wgPSBuZXcgSkFYQldyYXBwZXJUb29sSW1wbCgpOwotCi0gICAgICAgICAgICAvLyBHZXQgdGhlIGxpc3Qgb2YgbmFtZXMgZm9yIHRoZSBpbnB1dCBwYXJhbWV0ZXJzCi0gICAgICAgICAgICBMaXN0PFN0cmluZz4gbmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgICAgIExpc3Q8UGFyYW1ldGVyRGVzY3JpcHRpb24+IHBkTGlzdCA9IG5ldyBBcnJheUxpc3Q8UGFyYW1ldGVyRGVzY3JpcHRpb24+KCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBkcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIFBhcmFtZXRlckRlc2NyaXB0aW9uIHBkID0gcGRzW2ldOwotICAgICAgICAgICAgICAgIGlmIChwZC5nZXRNb2RlKCkgPT0gTW9kZS5JTiB8fAotICAgICAgICAgICAgICAgICAgICAgICAgcGQuZ2V0TW9kZSgpID09IE1vZGUuSU5PVVQpIHsKLSAgICAgICAgICAgICAgICAgICAgbmFtZXMuYWRkKHBkLmdldFBhcmFtZXRlck5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHBkTGlzdC5hZGQocGQpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBHZXQgdGhlIGNoaWxkIG9iamVjdHMKLSAgICAgICAgICAgIE9iamVjdFtdIG9iamVjdHMgPSB3cmFwcGVyVG9vbC51bldyYXAod3JhcHBlck9iamVjdCwgbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcnNoYWxEZXNjLmdldFByb3BlcnR5RGVzY3JpcHRvck1hcCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVyT2JqZWN0LmdldENsYXNzKCkpKTsKLQotICAgICAgICAgICAgLy8gTm93IGNyZWF0ZSBhIGxpc3Qgb2YgcGFyYW1WYWx1ZXMgCi0gICAgICAgICAgICBMaXN0PFBERWxlbWVudD4gcHZMaXN0ID0gbmV3IEFycmF5TGlzdDxQREVsZW1lbnQ+KCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBkTGlzdC5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIFBhcmFtZXRlckRlc2NyaXB0aW9uIHBkID0gcGRMaXN0LmdldChpKTsKLSAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBvYmplY3RzW2ldOwotICAgICAgICAgICAgICAgIC8vIFRoZSBvYmplY3QgaW4gdGhlIFBERWxlbWVudCBtdXN0IGJlIGFuIGVsZW1lbnQKLSAgICAgICAgICAgICAgICBFbGVtZW50IGVsZW1lbnQgPSBudWxsOwotICAgICAgICAgICAgICAgIFFOYW1lIHFOYW1lID0gbmV3IFFOYW1lKHBkLmdldFRhcmdldE5hbWVzcGFjZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkLmdldFBhcnROYW1lKCkpOwotICAgICAgICAgICAgICAgIGlmICghbWFyc2hhbERlc2MuZ2V0QW5ub3RhdGlvbkRlc2MocGQuZ2V0UGFyYW1ldGVyQWN0dWFsVHlwZSgpKS5oYXNYbWxSb290RWxlbWVudCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZWxlbWVudCA9IG5ldyBFbGVtZW50KHZhbHVlLCBxTmFtZSwgcGQuZ2V0UGFyYW1ldGVyQWN0dWFsVHlwZSgpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBlbGVtZW50ID0gbmV3IEVsZW1lbnQodmFsdWUsIHFOYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcHZMaXN0LmFkZChuZXcgUERFbGVtZW50KHBkLCBlbGVtZW50LCBudWxsKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEJ1aWxkIHRoZSBzaWduYXR1cmUgYXJndW1lbnRzCi0gICAgICAgICAgICBPYmplY3RbXSBzaWdBcmd1bWVudHMgPSBNZXRob2RNYXJzaGFsbGVyVXRpbHMuY3JlYXRlUmVxdWVzdFNpZ25hdHVyZUFyZ3MocGRzLCBwdkxpc3QpOwotCi0gICAgICAgICAgICByZXR1cm4gc2lnQXJndW1lbnRzOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBNZXNzYWdlIG1hcnNoYWxSZXNwb25zZShPYmplY3QgcmV0dXJuT2JqZWN0LCBPYmplY3RbXSBzaWduYXR1cmVBcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYXRpb25EZXNjcmlwdGlvbiBvcGVyYXRpb25EZXNjLCBQcm90b2NvbCBwcm90b2NvbCkKLSAgICAgICAgICAgIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLQotICAgICAgICBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uIGVkID0gb3BlcmF0aW9uRGVzYy5nZXRFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZW5kcG9pbnREZXNjID0gZWQuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbigpOwotICAgICAgICBNYXJzaGFsU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbiBtYXJzaGFsRGVzYyA9Ci0gICAgICAgICAgICAgICAgTWV0aG9kTWFyc2hhbGxlclV0aWxzLmdldE1hcnNoYWxEZXNjKGVuZHBvaW50RGVzYyk7Ci0gICAgICAgIFRyZWVTZXQ8U3RyaW5nPiBwYWNrYWdlcyA9IG1hcnNoYWxEZXNjLmdldFBhY2thZ2VzKCk7Ci0gICAgICAgIFN0cmluZyBwYWNrYWdlc0tleSA9IG1hcnNoYWxEZXNjLmdldFBhY2thZ2VzS2V5KCk7Ci0KLSAgICAgICAgLy8gV2Ugd2FudCB0byByZXNwb25kIHdpdGggdGhlIHNhbWUgcHJvdG9jb2wgYXMgdGhlIHJlcXVlc3QsCi0gICAgICAgIC8vIEl0IHRoZSBwcm90b2NvbCBpcyBudWxsLCB0aGVuIHVzZSB0aGUgUHJvdG9jb2wgZGVmaW5lZCBieSB0aGUgYmluZGluZwotICAgICAgICBpZiAocHJvdG9jb2wgPT0gbnVsbCkgewotICAgICAgICAgICAgcHJvdG9jb2wgPSBQcm90b2NvbC5nZXRQcm90b2NvbEZvckJpbmRpbmcoZW5kcG9pbnREZXNjLmdldEJpbmRpbmdUeXBlKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTm90ZSBhbGwgZXhjZXB0aW9ucyBhcmUgY2F1Z2h0IGFuZCByZXRocm93biB3aXRoIGEgV2ViU2VydmljZUV4Y2VwdGlvbgotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gU2FtcGxlIERvY3VtZW50IG1lc3NhZ2UKLSAgICAgICAgICAgIC8vIC4uCi0gICAgICAgICAgICAvLyA8c29hcGVudjpib2R5PgotICAgICAgICAgICAgLy8gICAgPG06b3BlcmF0aW9uUmVzcG9uc2UgLi4uID4KLSAgICAgICAgICAgIC8vICAgICAgIDxwYXJhbT5oZWxsbzwvcGFyYW0+Ci0gICAgICAgICAgICAvLyAgICA8L206b3BlcmF0aW9uUmVzcG9uc2U+Ci0gICAgICAgICAgICAvLyA8L3NvYXBlbnY6Ym9keT4KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBJbXBvcnRhbnQgcG9pbnRzLgotICAgICAgICAgICAgLy8gICAxKSBUaGVyZSBpcyBubyBvcGVyYXRpb24gZWxlbWVudCBpbiB0aGUgbWVzc2FnZQotICAgICAgICAgICAgLy8gICAyKSBUaGUgZGF0YSBibG9ja3MgYXJlIGxvY2F0ZWQgdW5kZXJuZWF0aCB0aGUgYm9keSBlbGVtZW50LiAKLSAgICAgICAgICAgIC8vICAgMykgVGhlIG5hbWUgb2YgdGhlIGRhdGEgYmxvY2sgKG06b3BlcmF0aW9uUmVzcG9uc2UpIGlzIGRlZmluZWQgYnkgdGhlIHNjaGVtYS4KLSAgICAgICAgICAgIC8vICAgICAgSXQgbWF0Y2hlcyB0aGUgb3BlcmF0aW9uIG5hbWUgKyAiUmVzcG9uc2UiLCBhbmQgaXQgaGFzIGEgY29ycmVzcG9uZGluZyBKQVhCIGVsZW1lbnQuCi0gICAgICAgICAgICAvLyAgICAgIFRoaXMgZWxlbWVudCBpcyBjYWxsZWQgdGhlIHdyYXBwZXIgZWxlbWVudAotICAgICAgICAgICAgLy8gICA0KSBUaGUgcGFyYW1ldGVycyBhcmUgKHBhcmFtKSBhcmUgY2hpbGQgZWxlbWVudHMgb2YgdGhlIHdyYXBwZXIgZWxlbWVudC4KLQotICAgICAgICAgICAgLy8gR2V0IHRoZSBvcGVyYXRpb24gaW5mb3JtYXRpb24KLSAgICAgICAgICAgIFBhcmFtZXRlckRlc2NyaXB0aW9uW10gcGRzID0gb3BlcmF0aW9uRGVzYy5nZXRQYXJhbWV0ZXJEZXNjcmlwdGlvbnMoKTsKLQotICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBtZXNzYWdlIAotICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkgbWYgPSBtYXJzaGFsRGVzYy5nZXRNZXNzYWdlRmFjdG9yeSgpOwotICAgICAgICAgICAgTWVzc2FnZSBtID0gbWYuY3JlYXRlKHByb3RvY29sKTsKLQotICAgICAgICAgICAgLy8gSW4gdXNhZ2U9V1JBUFBFRCwgdGhlcmUgd2lsbCBiZSBhIHNpbmdsZSBibG9jayBpbiB0aGUgYm9keS4KLSAgICAgICAgICAgIC8vIFRoZSBzaWduYXR1cmVBcmd1bWVudHMgcmVwcmVzZW50IHRoZSBjaGlsZCBlbGVtZW50cyBvZiB0aGF0IGJsb2NrCi0gICAgICAgICAgICAvLyBUaGUgZmlyc3Qgc3RlcCBpcyB0byBjb252ZXJ0IHRoZSBzaWduYXR1cmUgYXJndW1lbnRzIGludG8gYSBsaXN0Ci0gICAgICAgICAgICAvLyBvZiBwYXJhbWV0ZXIgdmFsdWVzCi0gICAgICAgICAgICBMaXN0PFBERWxlbWVudD4gcGRlTGlzdCA9Ci0gICAgICAgICAgICAgICAgICAgIE1ldGhvZE1hcnNoYWxsZXJVdGlscy5nZXRQREVsZW1lbnRzKG1hcnNoYWxEZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZUFyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCAgLy8gb3V0cHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsIGZhbHNlKTsKLQotICAgICAgICAgICAgLy8gTm93IHdlIHdhbnQgdG8gY3JlYXRlIGEgc2luZ2xlIEpBWEIgZWxlbWVudCB0aGF0IGNvbnRhaW5zIHRoZSAKLSAgICAgICAgICAgIC8vIFBhcmFtZXRlclZhbHVlcy4gIFdlIHdpbGwgdXNlIHRoZSB3cmFwcGVyIHRvb2wgdG8gZG8gdGhpcy4KLSAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgaW5wdXRzIHRvIHRoZSB3cmFwcGVyIHRvb2wKLSAgICAgICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IG5hbWVMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG9iamVjdExpc3QgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIENsYXNzPiAgZGVjbGFyZWRDbGFzc01hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgQ2xhc3M+KCk7Ci0KLSAgICAgICAgICAgIGZvciAoUERFbGVtZW50IHBkZSA6IHBkZUxpc3QpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IHBkZS5nZXRQYXJhbSgpLmdldFBhcmFtZXRlck5hbWUoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBUaGUgb2JqZWN0IGxpc3QgY29udGFpbnMgdHlwZSByZW5kZXJlZCBvYmplY3RzCi0gICAgICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gcGRlLmdldEVsZW1lbnQoKS5nZXRUeXBlVmFsdWUoKTsKLSAgICAgICAgICAgICAgICBDbGFzcyBkY2xDbGFzcyA9IHBkZS5nZXRQYXJhbSgpLmdldFBhcmFtZXRlckFjdHVhbFR5cGUoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBuYW1lTGlzdC5hZGQobmFtZSk7Ci0gICAgICAgICAgICAgICAgb2JqZWN0TGlzdC5wdXQobmFtZSwgdmFsdWUpOwotICAgICAgICAgICAgICAgIGRlY2xhcmVkQ2xhc3NNYXAucHV0KG5hbWUsIGRjbENsYXNzKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gQWRkIHRoZSByZXR1cm4gb2JqZWN0IHRvIHRoZSBuYW1lTGlzdCBhbmQgb2JqZWN0TGlzdAotICAgICAgICAgICAgQ2xhc3MgcmV0dXJuVHlwZSA9IG9wZXJhdGlvbkRlc2MuZ2V0UmVzdWx0QWN0dWFsVHlwZSgpOwotICAgICAgICAgICAgaWYgKHJldHVyblR5cGUgIT0gdm9pZC5jbGFzcykgewotICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gb3BlcmF0aW9uRGVzYy5nZXRSZXN1bHROYW1lKCk7Ci0gICAgICAgICAgICAgICAgbmFtZUxpc3QuYWRkKG5hbWUpOwotICAgICAgICAgICAgICAgIG9iamVjdExpc3QucHV0KG5hbWUsIHJldHVybk9iamVjdCk7Ci0gICAgICAgICAgICAgICAgZGVjbGFyZWRDbGFzc01hcC5wdXQobmFtZSwgcmV0dXJuVHlwZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIE5vdyBjcmVhdGUgdGhlIHNpbmdsZSBKQVhCIGVsZW1lbnQKLSAgICAgICAgICAgIFN0cmluZyB3cmFwcGVyTmFtZSA9IG1hcnNoYWxEZXNjLmdldFJlc3BvbnNlV3JhcHBlckNsYXNzTmFtZShvcGVyYXRpb25EZXNjKTsKLSAgICAgICAgICAgIENsYXNzIGNsczsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgY2xzID0gTWV0aG9kTWFyc2hhbGxlclV0aWxzLmxvYWRDbGFzcyh3cmFwcGVyTmFtZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpewotICAgICAgICAgICAgICAgIGNscyA9IE1ldGhvZE1hcnNoYWxsZXJVdGlscy5sb2FkQ2xhc3Mod3JhcHBlck5hbWUsIGVuZHBvaW50RGVzYy5nZXRBeGlzU2VydmljZSgpLmdldENsYXNzTG9hZGVyKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgSkFYQldyYXBwZXJUb29sIHdyYXBwZXJUb29sID0gbmV3IEpBWEJXcmFwcGVyVG9vbEltcGwoKTsKLSAgICAgICAgICAgIE9iamVjdCBvYmplY3QgPSB3cmFwcGVyVG9vbC53cmFwKGNscywgbmFtZUxpc3QsIG9iamVjdExpc3QsIGRlY2xhcmVkQ2xhc3NNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJzaGFsRGVzYy5nZXRQcm9wZXJ0eURlc2NyaXB0b3JNYXAoY2xzKSk7Ci0KLSAgICAgICAgICAgIFFOYW1lIHdyYXBwZXJRTmFtZSA9IG5ldyBRTmFtZShvcGVyYXRpb25EZXNjLmdldFJlc3BvbnNlV3JhcHBlclRhcmdldE5hbWVzcGFjZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbkRlc2MuZ2V0UmVzcG9uc2VXcmFwcGVyTG9jYWxOYW1lKCkpOwotCi0gICAgICAgICAgICAvLyBNYWtlIHN1cmUgb2JqZWN0IGNhbiBiZSByZW5kZXJlZCBhcyBhbiBlbGVtZW50Ci0gICAgICAgICAgICBpZiAoIW1hcnNoYWxEZXNjLmdldEFubm90YXRpb25EZXNjKGNscykuaGFzWG1sUm9vdEVsZW1lbnQoKSkgewotICAgICAgICAgICAgICAgIG9iamVjdCA9IG5ldyBKQVhCRWxlbWVudCh3cmFwcGVyUU5hbWUsIGNscywgb2JqZWN0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gRW5hYmxlIFNXQSBmb3IgbmVzdGVkIFN3YVJlZiBhdHRhY2htZW50cwotICAgICAgICAgICAgaWYgKG9wZXJhdGlvbkRlc2MuaGFzUmVzcG9uc2VTd2FSZWZBdHRhY2htZW50cygpKSB7Ci0gICAgICAgICAgICAgICAgbS5zZXREb2luZ1NXQSh0cnVlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gUHV0IHRoZSBvYmplY3QgaW50byB0aGUgbWVzc2FnZQotICAgICAgICAgICAgSkFYQkJsb2NrRmFjdG9yeSBmYWN0b3J5ID0KLSAgICAgICAgICAgICAgICAgICAgKEpBWEJCbG9ja0ZhY3RvcnkpRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoSkFYQkJsb2NrRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgICAgICBKQVhCQmxvY2tDb250ZXh0IGJsb2NrQ29udGV4dCA9IG5ldyBKQVhCQmxvY2tDb250ZXh0KHBhY2thZ2VzLCBwYWNrYWdlc0tleSk7Ci0gICAgICAgICAgICBibG9ja0NvbnRleHQuc2V0V2ViU2VydmljZU5hbWVzcGFjZShlZC5nZXRUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgICAgICBCbG9jayBibG9jayA9IGZhY3RvcnkuY3JlYXRlRnJvbShvYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja0NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVyUU5hbWUpOwotICAgICAgICAgICAgbS5zZXRCb2R5QmxvY2soYmxvY2spOwotCi0gICAgICAgICAgICByZXR1cm4gbTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgTWVzc2FnZSBtYXJzaGFsUmVxdWVzdChPYmplY3RbXSBzaWduYXR1cmVBcmd1bWVudHMsIE9wZXJhdGlvbkRlc2NyaXB0aW9uIG9wZXJhdGlvbkRlc2MpCi0gICAgICAgICAgICB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiBlZCA9IG9wZXJhdGlvbkRlc2MuZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbigpOwotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVuZHBvaW50RGVzYyA9IGVkLmdldEVuZHBvaW50RGVzY3JpcHRpb24oKTsKLSAgICAgICAgUHJvdG9jb2wgcHJvdG9jb2wgPSBQcm90b2NvbC5nZXRQcm90b2NvbEZvckJpbmRpbmcoZW5kcG9pbnREZXNjLmdldENsaWVudEJpbmRpbmdJRCgpKTsKLSAgICAgICAgTWFyc2hhbFNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb24gbWFyc2hhbERlc2MgPQotICAgICAgICAgICAgICAgIE1ldGhvZE1hcnNoYWxsZXJVdGlscy5nZXRNYXJzaGFsRGVzYyhlbmRwb2ludERlc2MpOwotICAgICAgICBUcmVlU2V0PFN0cmluZz4gcGFja2FnZXMgPSBtYXJzaGFsRGVzYy5nZXRQYWNrYWdlcygpOwotICAgICAgICBTdHJpbmcgcGFja2FnZXNLZXkgPSBtYXJzaGFsRGVzYy5nZXRQYWNrYWdlc0tleSgpOwotCi0gICAgICAgIC8vIE5vdGUgYWxsIGV4Y2VwdGlvbnMgYXJlIGNhdWdodCBhbmQgcmV0aHJvd24gd2l0aCBhIFdlYlNlcnZpY2VFeGNlcHRpb24KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIFNhbXBsZSBEb2N1bWVudCBtZXNzYWdlCi0gICAgICAgICAgICAvLyAuLgotICAgICAgICAgICAgLy8gPHNvYXBlbnY6Ym9keT4KLSAgICAgICAgICAgIC8vICAgIDxtOm9wZXJhdGlvbj4KLSAgICAgICAgICAgIC8vICAgICAgPHBhcmFtPmhlbGxvPC9wYXJhbT4KLSAgICAgICAgICAgIC8vICAgIDwvbTpvcGVyYXRpb24+Ci0gICAgICAgICAgICAvLyA8L3NvYXBlbnY6Ym9keT4KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBJbXBvcnRhbnQgcG9pbnRzLgotICAgICAgICAgICAgLy8gICAxKSBUaGVyZSBpcyBubyBvcGVyYXRpb24gZWxlbWVudCB1bmRlciB0aGUgYm9keS4KLSAgICAgICAgICAgIC8vICAgMikgVGhlIGRhdGEgYmxvY2tzIGFyZSBsb2NhdGVkIHVuZGVybmVhdGggdGhlIGJvZHkuICAKLSAgICAgICAgICAgIC8vICAgMykgVGhlIG5hbWUgb2YgdGhlIGRhdGEgYmxvY2sgKG06b3BlcmF0aW9uKSBpcyBkZWZpbmVkIGJ5IHRoZSBzY2hlbWEgYW5kIG1hdGNoIHRoZSBuYW1lIG9mIHRoZSBvcGVyYXRpb24uCi0gICAgICAgICAgICAvLyAgICAgIFRoaXMgaXMgY2FsbGVkIHRoZSB3cmFwcGVyIGVsZW1lbnQuICBUaGUgd3JhcHBlciBlbGVtZW50IGhhcyBhIGNvcnJlc3BvbmRpbmcgSkFYQiBlbGVtZW50IHBvam8uCi0gICAgICAgICAgICAvLyAgIDQpIFRoZSBwYXJhbWV0ZXJzIChtOnBhcmFtKSBhcmUgY2hpbGQgZWxlbWVudHMgb2YgdGhlIHdyYXBwZXIgZWxlbWVudC4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gR2V0IHRoZSBvcGVyYXRpb24gaW5mb3JtYXRpb24KLSAgICAgICAgICAgIFBhcmFtZXRlckRlc2NyaXB0aW9uW10gcGRzID0gb3BlcmF0aW9uRGVzYy5nZXRQYXJhbWV0ZXJEZXNjcmlwdGlvbnMoKTsKLQotICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBtZXNzYWdlIAotICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkgbWYgPSBtYXJzaGFsRGVzYy5nZXRNZXNzYWdlRmFjdG9yeSgpOwotICAgICAgICAgICAgTWVzc2FnZSBtID0gbWYuY3JlYXRlKHByb3RvY29sKTsKLQotICAgICAgICAgICAgLy8gSW4gdXNhZ2U9V1JBUFBFRCwgdGhlcmUgd2lsbCBiZSBhIHNpbmdsZSBibG9jayBpbiB0aGUgYm9keS4KLSAgICAgICAgICAgIC8vIFRoZSBzaWduYXR1cmVBcmd1bWVudHMgcmVwcmVzZW50IHRoZSBjaGlsZCBlbGVtZW50cyBvZiB0aGF0IGJsb2NrCi0gICAgICAgICAgICAvLyBUaGUgZmlyc3Qgc3RlcCBpcyB0byBjb252ZXJ0IHRoZSBzaWduYXR1cmUgYXJndW1lbnRzIGludG8gbGlzdAotICAgICAgICAgICAgLy8gb2YgcGFyYW1ldGVyIHZhbHVlcwotICAgICAgICAgICAgTGlzdDxQREVsZW1lbnQ+IHB2TGlzdCA9IE1ldGhvZE1hcnNoYWxsZXJVdGlscy5nZXRQREVsZW1lbnRzKG1hcnNoYWxEZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduYXR1cmVBcmd1bWVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgICAvLyBpbnB1dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsIGZhbHNlKTsKLQotICAgICAgICAgICAgLy8gTm93IHdlIHdhbnQgdG8gY3JlYXRlIGEgc2luZ2xlIEpBWEIgZWxlbWVudCB0aGF0IGNvbnRhaW5zIHRoZSAKLSAgICAgICAgICAgIC8vIFBhcmFtZXRlclZhbHVlcy4gIFdlIHdpbGwgdXNlIHRoZSB3cmFwcGVyIHRvb2wgdG8gZG8gdGhpcy4KLSAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgaW5wdXRzIHRvIHRoZSB3cmFwcGVyIHRvb2wKLSAgICAgICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IG5hbWVMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG9iamVjdExpc3QgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIENsYXNzPiBkZWNsYXJlZENsYXNzTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBDbGFzcz4oKTsKLQotICAgICAgICAgICAgZm9yIChQREVsZW1lbnQgcHYgOiBwdkxpc3QpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IHB2LmdldFBhcmFtKCkuZ2V0UGFyYW1ldGVyTmFtZSgpOwotCi0gICAgICAgICAgICAgICAgLy8gVGhlIG9iamVjdCBsaXN0IGNvbnRhaW5zIHR5cGUgcmVuZGVyZWQgb2JqZWN0cwotICAgICAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IHB2LmdldEVsZW1lbnQoKS5nZXRUeXBlVmFsdWUoKTsKLSAgICAgICAgICAgICAgICBDbGFzcyBkY2xDbGFzcyA9IHB2LmdldFBhcmFtKCkuZ2V0UGFyYW1ldGVyQWN0dWFsVHlwZSgpOwotICAgICAgICAgICAgICAgIG5hbWVMaXN0LmFkZChuYW1lKTsKLSAgICAgICAgICAgICAgICBvYmplY3RMaXN0LnB1dChuYW1lLCB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgZGVjbGFyZWRDbGFzc01hcC5wdXQobmFtZSwgZGNsQ2xhc3MpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBOb3cgY3JlYXRlIHRoZSBzaW5nbGUgSkFYQiBlbGVtZW50IAotICAgICAgICAgICAgU3RyaW5nIHdyYXBwZXJOYW1lID0gbWFyc2hhbERlc2MuZ2V0UmVxdWVzdFdyYXBwZXJDbGFzc05hbWUob3BlcmF0aW9uRGVzYyk7Ci0gICAgICAgICAgICBDbGFzcyBjbHM7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGNscyA9IE1ldGhvZE1hcnNoYWxsZXJVdGlscy5sb2FkQ2xhc3Mod3JhcHBlck5hbWUpOwotICAgICAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKXsKLSAgICAgICAgICAgICAgICBjbHMgPSBNZXRob2RNYXJzaGFsbGVyVXRpbHMubG9hZENsYXNzKHdyYXBwZXJOYW1lLCBlbmRwb2ludERlc2MuZ2V0QXhpc1NlcnZpY2UoKS5nZXRDbGFzc0xvYWRlcigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEpBWEJXcmFwcGVyVG9vbCB3cmFwcGVyVG9vbCA9IG5ldyBKQVhCV3JhcHBlclRvb2xJbXBsKCk7Ci0gICAgICAgICAgICBPYmplY3Qgb2JqZWN0ID0gd3JhcHBlclRvb2wud3JhcChjbHMsIG5hbWVMaXN0LCBvYmplY3RMaXN0LCBkZWNsYXJlZENsYXNzTWFwLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcnNoYWxEZXNjLmdldFByb3BlcnR5RGVzY3JpcHRvck1hcChjbHMpKTsKLQotICAgICAgICAgICAgUU5hbWUgd3JhcHBlclFOYW1lID0gbmV3IFFOYW1lKG9wZXJhdGlvbkRlc2MuZ2V0UmVxdWVzdFdyYXBwZXJUYXJnZXROYW1lc3BhY2UoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25EZXNjLmdldFJlcXVlc3RXcmFwcGVyTG9jYWxOYW1lKCkpOwotCi0gICAgICAgICAgICAvLyBNYWtlIHN1cmUgb2JqZWN0IGNhbiBiZSByZW5kZXJlZCBhcyBhbiBlbGVtZW50Ci0gICAgICAgICAgICBpZiAoIW1hcnNoYWxEZXNjLmdldEFubm90YXRpb25EZXNjKGNscykuaGFzWG1sUm9vdEVsZW1lbnQoKSkgewotICAgICAgICAgICAgICAgIG9iamVjdCA9IG5ldyBKQVhCRWxlbWVudCh3cmFwcGVyUU5hbWUsIGNscywgb2JqZWN0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gRW5hYmxlIFNXQSBmb3IgbmVzdGVkIFN3YVJlZiBhdHRhY2htZW50cwotICAgICAgICAgICAgaWYgKG9wZXJhdGlvbkRlc2MuaGFzUmVxdWVzdFN3YVJlZkF0dGFjaG1lbnRzKCkpIHsKLSAgICAgICAgICAgICAgICBtLnNldERvaW5nU1dBKHRydWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBQdXQgdGhlIG9iamVjdCBpbnRvIHRoZSBtZXNzYWdlCi0gICAgICAgICAgICBKQVhCQmxvY2tGYWN0b3J5IGZhY3RvcnkgPQotICAgICAgICAgICAgICAgICAgICAoSkFYQkJsb2NrRmFjdG9yeSlGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShKQVhCQmxvY2tGYWN0b3J5LmNsYXNzKTsKLSAgICAgICAgICAgIEpBWEJCbG9ja0NvbnRleHQgYmxvY2tDb250ZXh0ID0gbmV3IEpBWEJCbG9ja0NvbnRleHQocGFja2FnZXMsIHBhY2thZ2VzS2V5KTsKLSAgICAgICAgICAgIGJsb2NrQ29udGV4dC5zZXRXZWJTZXJ2aWNlTmFtZXNwYWNlKGVkLmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgICAgIEJsb2NrIGJsb2NrID0gZmFjdG9yeS5jcmVhdGVGcm9tKG9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrQ29udGV4dCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVyUU5hbWUpOwotICAgICAgICAgICAgbS5zZXRCb2R5QmxvY2soYmxvY2spOwotCi0gICAgICAgICAgICByZXR1cm4gbTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgTWVzc2FnZSBtYXJzaGFsRmF1bHRSZXNwb25zZShUaHJvd2FibGUgdGhyb3dhYmxlLCBPcGVyYXRpb25EZXNjcmlwdGlvbiBvcGVyYXRpb25EZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3RvY29sIHByb3RvY29sKSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiBlZCA9IG9wZXJhdGlvbkRlc2MuZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbigpOwotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVuZHBvaW50RGVzYyA9IGVkLmdldEVuZHBvaW50RGVzY3JpcHRpb24oKTsKLSAgICAgICAgTWFyc2hhbFNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb24gbWFyc2hhbERlc2MgPQotICAgICAgICAgICAgICAgIE1ldGhvZE1hcnNoYWxsZXJVdGlscy5nZXRNYXJzaGFsRGVzYyhlbmRwb2ludERlc2MpOwotICAgICAgICBUcmVlU2V0PFN0cmluZz4gcGFja2FnZXMgPSBtYXJzaGFsRGVzYy5nZXRQYWNrYWdlcygpOwotCi0gICAgICAgIC8vIFdlIHdhbnQgdG8gcmVzcG9uZCB3aXRoIHRoZSBzYW1lIHByb3RvY29sIGFzIHRoZSByZXF1ZXN0LAotICAgICAgICAvLyBJdCB0aGUgcHJvdG9jb2wgaXMgbnVsbCwgdGhlbiB1c2UgdGhlIFByb3RvY29sIGRlZmluZWQgYnkgdGhlIGJpbmRpbmcKLSAgICAgICAgaWYgKHByb3RvY29sID09IG51bGwpIHsKLSAgICAgICAgICAgIHByb3RvY29sID0gUHJvdG9jb2wuZ2V0UHJvdG9jb2xGb3JCaW5kaW5nKGVuZHBvaW50RGVzYy5nZXRCaW5kaW5nVHlwZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIE5vdGUgYWxsIGV4Y2VwdGlvbnMgYXJlIGNhdWdodCBhbmQgcmV0aHJvd24gd2l0aCBhIFdlYlNlcnZpY2VFeGNlcHRpb24KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgbWVzc2FnZSAKLSAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5IG1mID0gKE1lc3NhZ2VGYWN0b3J5KUZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KE1lc3NhZ2VGYWN0b3J5LmNsYXNzKTsKLSAgICAgICAgICAgIE1lc3NhZ2UgbSA9IG1mLmNyZWF0ZShwcm90b2NvbCk7Ci0KLSAgICAgICAgICAgIC8vIFB1dCB0aGUgZmF1bHQgb250byB0aGUgbWVzc2FnZQotICAgICAgICAgICAgTWV0aG9kTWFyc2hhbGxlclV0aWxzLm1hcnNoYWxGYXVsdFJlc3BvbnNlKHRocm93YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJzaGFsRGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25EZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0pOwotICAgICAgICAgICAgcmV0dXJuIG07Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFRocm93YWJsZSBkZW1hcnNoYWxGYXVsdFJlc3BvbnNlKE1lc3NhZ2UgbWVzc2FnZSwgT3BlcmF0aW9uRGVzY3JpcHRpb24gb3BlcmF0aW9uRGVzYykKLSAgICAgICAgICAgIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLQotICAgICAgICBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uIGVkID0gb3BlcmF0aW9uRGVzYy5nZXRFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZW5kcG9pbnREZXNjID0gZWQuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbigpOwotICAgICAgICBNYXJzaGFsU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbiBtYXJzaGFsRGVzYyA9Ci0gICAgICAgICAgICAgICAgTWV0aG9kTWFyc2hhbGxlclV0aWxzLmdldE1hcnNoYWxEZXNjKGVuZHBvaW50RGVzYyk7Ci0KLSAgICAgICAgLy8gTm90ZSBhbGwgZXhjZXB0aW9ucyBhcmUgY2F1Z2h0IGFuZCByZXRocm93biB3aXRoIGEgV2ViU2VydmljZUV4Y2VwdGlvbgotICAgICAgICB0cnkgewotICAgICAgICAgICAgVGhyb3dhYmxlIHQgPSBNZXRob2RNYXJzaGFsbGVyVXRpbHMuZGVtYXJzaGFsRmF1bHRSZXNwb25zZShvcGVyYXRpb25EZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJzaGFsRGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSk7Ci0gICAgICAgICAgICByZXR1cm4gdDsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21hcnNoYWxsZXIvaW1wbC9hbHQvRG9jTGl0V3JhcHBlZE1pbmltYWxNZXRob2RNYXJzaGFsbGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tYXJzaGFsbGVyL2ltcGwvYWx0L0RvY0xpdFdyYXBwZWRNaW5pbWFsTWV0aG9kTWFyc2hhbGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjBiNDg5Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21hcnNoYWxsZXIvaW1wbC9hbHQvRG9jTGl0V3JhcHBlZE1pbmltYWxNZXRob2RNYXJzaGFsbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NDEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1hcnNoYWxsZXIuaW1wbC5hbHQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLkV4Y2VwdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5FbmRwb2ludERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLk9wZXJhdGlvbkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uUGFyYW1ldGVyRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5pMThuLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWFyc2hhbGxlci5NZXRob2RNYXJzaGFsbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5NZXNzYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5Qcm90b2NvbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZmFjdG9yeS5NZXNzYWdlRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnJlZ2lzdHJ5LkZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnJ1bnRpbWUuZGVzY3JpcHRpb24ubWFyc2hhbC5NYXJzaGFsU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlN0eWxlOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7Ci0KLS8qKgotICogVGhlIERvYy9MaXQgV3JhcHBlZCBNaW5pbWFsIE1hcnNoYWxsZXIgaXMgdXNlZCB3aGVuIDEpIFRoZSB3ZWIgc2VydmljZSBpcyBEb2MvTGl0IFdyYXBwZWQsIGFuZCAyKQotICogVGhlIHdyYXBwZXIgYW5kIGZhdWx0IGJlYW4gb2JqZWN0cyBhcmUgbWlzc2luZyAoaGVuY2UgdGhlIHRlcm0gJ01pbmltYWwnKQotICovCi1wdWJsaWMgY2xhc3MgRG9jTGl0V3JhcHBlZE1pbmltYWxNZXRob2RNYXJzaGFsbGVyIGltcGxlbWVudHMgTWV0aG9kTWFyc2hhbGxlciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coRG9jTGl0V3JhcHBlZE1pbmltYWxNZXRob2RNYXJzaGFsbGVyLmNsYXNzKTsKLQotICAgIHB1YmxpYyBEb2NMaXRXcmFwcGVkTWluaW1hbE1ldGhvZE1hcnNoYWxsZXIoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIE1lc3NhZ2UgbWFyc2hhbFJlcXVlc3QoT2JqZWN0W10gc2lnbmF0dXJlQXJndW1lbnRzLCBPcGVyYXRpb25EZXNjcmlwdGlvbiBvcGVyYXRpb25EZXNjKQotICAgICAgICAgICAgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotCi0gICAgICAgIEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24gZWQgPSBvcGVyYXRpb25EZXNjLmdldEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24oKTsKLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlbmRwb2ludERlc2MgPSBlZC5nZXRFbmRwb2ludERlc2NyaXB0aW9uKCk7Ci0gICAgICAgIFByb3RvY29sIHByb3RvY29sID0gUHJvdG9jb2wuZ2V0UHJvdG9jb2xGb3JCaW5kaW5nKGVuZHBvaW50RGVzYy5nZXRDbGllbnRCaW5kaW5nSUQoKSk7Ci0KLSAgICAgICAgLy8gTm90ZSBhbGwgZXhjZXB0aW9ucyBhcmUgY2F1Z2h0IGFuZCByZXRocm93biB3aXRoIGEgV2ViU2VydmljZUV4Y2VwdGlvbgotICAgICAgICB0cnkgewotCi0gICAgICAgICAgICAvLyBTYW1wbGUgRG9jdW1lbnQgbWVzc2FnZQotICAgICAgICAgICAgLy8gLi4KLSAgICAgICAgICAgIC8vIDxzb2FwZW52OmJvZHk+Ci0gICAgICAgICAgICAvLyAgICA8bTpvcGVyYXRpb24+Ci0gICAgICAgICAgICAvLyAgICAgIDxwYXJhbT5oZWxsbzwvcGFyYW0+Ci0gICAgICAgICAgICAvLyAgICA8L206b3BlcmF0aW9uPgotICAgICAgICAgICAgLy8gPC9zb2FwZW52OmJvZHk+Ci0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gSW1wb3J0YW50IHBvaW50cy4KLSAgICAgICAgICAgIC8vICAgMSkgVGhlcmUgaXMgbm8gb3BlcmF0aW9uIGVsZW1lbnQgdW5kZXIgdGhlIGJvZHkuCi0gICAgICAgICAgICAvLyAgIDIpIFRoZSBkYXRhIGJsb2NrcyBhcmUgbG9jYXRlZCB1bmRlcm5lYXRoIHRoZSBib2R5LiAgCi0gICAgICAgICAgICAvLyAgIDMpIFRoZSBuYW1lIG9mIHRoZSBkYXRhIGJsb2NrIChtOm9wZXJhdGlvbikgaXMgZGVmaW5lZCBieSB0aGUgc2NoZW1hIGFuZCBtYXRjaCB0aGUgbmFtZSBvZiB0aGUgb3BlcmF0aW9uLgotICAgICAgICAgICAgLy8gICAgICBUaGlzIGlzIGNhbGxlZCB0aGUgd3JhcHBlciBlbGVtZW50LiAgVGhlIHdyYXBwZXIgZWxlbWVudCBoYXMgYSBjb3JyZXNwb25kaW5nIEpBWEIgZWxlbWVudCBwb2pvLgotICAgICAgICAgICAgLy8gICA0KSBUaGUgcGFyYW1ldGVycyAobTpwYXJhbSkgYXJlIGNoaWxkIGVsZW1lbnRzIG9mIHRoZSB3cmFwcGVyIGVsZW1lbnQuCi0gICAgICAgICAgICAvLyAgIDUpIE5PVEU6IEZvciBkb2MvbGl0ZXJhbCB3cmFwcGVkICJtaW5pbWFsIiwgdGhlIHdyYXBwZXIgSkFYQiBlbGVtZW50IHBvam8gaXMgbWlzc2luZy4KLQotICAgICAgICAgICAgLy8gR2V0IHRoZSBvcGVyYXRpb24gaW5mb3JtYXRpb24KLSAgICAgICAgICAgIFBhcmFtZXRlckRlc2NyaXB0aW9uW10gcGRzID0gb3BlcmF0aW9uRGVzYy5nZXRQYXJhbWV0ZXJEZXNjcmlwdGlvbnMoKTsKLSAgICAgICAgICAgIE1hcnNoYWxTZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uIG1hcnNoYWxEZXNjID0KLSAgICAgICAgICAgICAgICAgICAgTWV0aG9kTWFyc2hhbGxlclV0aWxzLmdldE1hcnNoYWxEZXNjKGVuZHBvaW50RGVzYyk7Ci0gICAgICAgICAgICBUcmVlU2V0PFN0cmluZz4gcGFja2FnZXMgPSBtYXJzaGFsRGVzYy5nZXRQYWNrYWdlcygpOwotCi0gICAgICAgICAgICAvLyBUT0RPIFRoaXMgbmVlZHMgbW9yZSB3b3JrLiAgV2UgbmVlZCB0byBjaGVjayBpbnNpZGUgaG9sZGVycyBvZiBpbnB1dCBwYXJhbXMuICBXZSBhbHNvCi0gICAgICAgICAgICAvLyBtYXkgd2FudCB0byBleGNsdWRlIGhlYWRlciBwYXJhbXMgZnJvbSB0aGlzIGNoZWNrCi0gICAgICAgICAgICAvL1ZhbGlkYXRlIGlucHV0IHBhcmFtZXRlcnMgZm9yIG9wZXJhdGlvbiBhbmQgbWFrZSBzdXJlIG5vIGlucHV0IHBhcmFtZXRlcnMgYXJlIG51bGwuCi0gICAgICAgICAgICAvL0FzIHBlciBKQVhXUyBTcGVjaWZpY2F0aW9uIHNlY3Rpb24gMy42LjIuMyBpZiBhIG51bGwgdmFsdWUgaXMgcGFzc2VzIGFzIGFuIGFyZ3VtZW50IAotICAgICAgICAgICAgLy90byBhIG1ldGhvZCB0aGVuIGFuIGltcGxlbWVudGF0aW9uIE1VU1QgdGhyb3cgV2ViU2VydmljZUV4Y2VwdGlvbi4KLSAgICAgICAgICAgIGlmIChwZHMubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgICAgIGlmIChzaWduYXR1cmVBcmd1bWVudHMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIAl0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgIAkJCU1lc3NhZ2VzLmdldE1lc3NhZ2UoIk51bGxQYXJhbUVycjEiLG9wZXJhdGlvbkRlc2MuZ2V0SmF2YU1ldGhvZE5hbWUoKSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoc2lnbmF0dXJlQXJndW1lbnRzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChPYmplY3QgYXJndW1lbnQgOiBzaWduYXR1cmVBcmd1bWVudHMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcmd1bWVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAJdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgIAkJCU1lc3NhZ2VzLmdldE1lc3NhZ2UoIk51bGxQYXJhbUVycjEiLG9wZXJhdGlvbkRlc2MuZ2V0SmF2YU1ldGhvZE5hbWUoKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBDcmVhdGUgdGhlIG1lc3NhZ2UgCi0gICAgICAgICAgICBNZXNzYWdlRmFjdG9yeSBtZiA9IChNZXNzYWdlRmFjdG9yeSlGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShNZXNzYWdlRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgICAgICBNZXNzYWdlIG0gPSBtZi5jcmVhdGUocHJvdG9jb2wpOwotCi0gICAgICAgICAgICAvLyBJbmRpY2F0ZSB0aGUgc3R5bGUgYW5kIHdyYXBwZXIgZWxlbWVudCBuYW1lLiAgVGhpcyB0cmlnZ2VycyB0aGUgbWVzc2FnZSB0bwotICAgICAgICAgICAgLy8gcHV0IHRoZSBkYXRhIGJsb2NrcyB1bmRlcm5lYXRoIHRoZSB3cmFwcGVyIGVsZW1lbnQKLSAgICAgICAgICAgIG0uc2V0U3R5bGUoU3R5bGUuRE9DVU1FTlQpOwotICAgICAgICAgICAgbS5zZXRJbmRpcmVjdGlvbigxKTsKLSAgICAgICAgICAgIG0uc2V0T3BlcmF0aW9uRWxlbWVudChnZXRSZXF1ZXN0V3JhcHBlclFOYW1lKG9wZXJhdGlvbkRlc2MpKTsKLQotICAgICAgICAgICAgLy8gVGhlIGlucHV0IG9iamVjdCByZXByZXNlbnQgdGhlIHNpZ25hdHVyZSBhcmd1bWVudHMuCi0gICAgICAgICAgICAvLyBTaWduYXR1cmUgYXJndW1lbnRzIGFyZSBib3RoIGhvbGRlcnMgYW5kIG5vbi1ob2xkZXJzCi0gICAgICAgICAgICAvLyBDb252ZXJ0IHRoZSBzaWduYXR1cmUgaW50byBhIGxpc3Qgb2YgSkFYQiBvYmplY3RzIGZvciBtYXJzaGFsbGluZwotICAgICAgICAgICAgTGlzdDxQREVsZW1lbnQ+IHBkZUxpc3QgPQotICAgICAgICAgICAgICAgICAgICBNZXRob2RNYXJzaGFsbGVyVXRpbHMuZ2V0UERFbGVtZW50cyhtYXJzaGFsRGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduYXR1cmVBcmd1bWVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsICAvLyBpbnB1dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLCAgLy8gZG9jL2xpdCB3cmFwcGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOyAvLyBmYWxzZQotCi0gICAgICAgICAgICAvLyBXZSB3YW50IHRvIHVzZSAiYnkgSmF2YSBUeXBlIiBtYXJzaGFsbGluZyBmb3IgCi0gICAgICAgICAgICAvLyBhbGwgb2JqZWN0cwotICAgICAgICAgICAgZm9yIChQREVsZW1lbnQgcGRlIDogcGRlTGlzdCkgewotICAgICAgICAgICAgICAgIFBhcmFtZXRlckRlc2NyaXB0aW9uIHBkID0gcGRlLmdldFBhcmFtKCk7Ci0gICAgICAgICAgICAgICAgQ2xhc3MgdHlwZSA9IHBkLmdldFBhcmFtZXRlckFjdHVhbFR5cGUoKTsKLSAgICAgICAgICAgICAgICBwZGUuc2V0QnlKYXZhVHlwZUNsYXNzKHR5cGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBQdXQgdmFsdWVzIG9udG8gdGhlIG1lc3NhZ2UKLSAgICAgICAgICAgIE1ldGhvZE1hcnNoYWxsZXJVdGlscy50b01lc3NhZ2UocGRlTGlzdCwgbSwgcGFja2FnZXMpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBFbmFibGUgU1dBIGZvciBuZXN0ZWQgU3dhUmVmIGF0dGFjaG1lbnRzCi0gICAgICAgICAgICBpZiAob3BlcmF0aW9uRGVzYy5oYXNSZXF1ZXN0U3dhUmVmQXR0YWNobWVudHMoKSkgewotICAgICAgICAgICAgICAgIG0uc2V0RG9pbmdTV0EodHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBtOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3RbXSBkZW1hcnNoYWxSZXF1ZXN0KE1lc3NhZ2UgbWVzc2FnZSwgT3BlcmF0aW9uRGVzY3JpcHRpb24gb3BlcmF0aW9uRGVzYykKLSAgICAgICAgICAgIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLQotICAgICAgICBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uIGVkID0gb3BlcmF0aW9uRGVzYy5nZXRFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZW5kcG9pbnREZXNjID0gZWQuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbigpOwotCi0gICAgICAgIC8vIE5vdGUgYWxsIGV4Y2VwdGlvbnMgYXJlIGNhdWdodCBhbmQgcmV0aHJvd24gd2l0aCBhIFdlYlNlcnZpY2VFeGNlcHRpb24KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIFNhbXBsZSBSUEMgbWVzc2FnZQotICAgICAgICAgICAgLy8gLi4KLSAgICAgICAgICAgIC8vIDxzb2FwZW52OmJvZHk+Ci0gICAgICAgICAgICAvLyAgICA8bTpvcCB4bWxuczptPSJ1cm46Ly9hcGkiPgotICAgICAgICAgICAgLy8gICAgICAgPHBhcmFtIHhzaTp0eXBlPSJkYXRhOmZvbyIgPi4uLjwvcGFyYW0+Ci0gICAgICAgICAgICAvLyAgICA8L206b3A+Ci0gICAgICAgICAgICAvLyA8L3NvYXBlbnY6Ym9keT4KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBJbXBvcnRhbnQgcG9pbnRzLgotICAgICAgICAgICAgLy8gICAxKSBSUEMgaGFzIGFuIG9wZXJhdGlvbiBlbGVtZW50IHVuZGVyIHRoZSBib2R5LiAgVGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUKLSAgICAgICAgICAgIC8vICAgICAgd3NkbCBvcGVyYXRpb24uCi0gICAgICAgICAgICAvLyAgIDIpIFRoZSBkYXRhIGJsb2NrcyBhcmUgbG9jYXRlZCB1bmRlcm5lYXRoIHRoZSBvcGVyYXRpb24gZWxlbWVudC4gIChJbiBkb2MvbGl0Ci0gICAgICAgICAgICAvLyAgICAgIHRoZSBkYXRhIGVsZW1lbnRzIGFyZSB1bmRlcm5lYXRoIHRoZSBib2R5LgotICAgICAgICAgICAgLy8gICAzKSBUaGUgbmFtZSBvZiB0aGUgZGF0YSBibG9ja3MgKHBhcmFtKSBhcmUgZGVmaW5lZCBieSB0aGUgd3NkbDpwYXJ0IG5vdCB0aGUKLSAgICAgICAgICAgIC8vICAgICAgc2NoZW1hLiAgTm90ZSB0aGF0IGl0IGlzIHVucXVhbGlmaWVkIHBlciBXU0ktQlAKLSAgICAgICAgICAgIC8vICAgNCkgVGhlIHR5cGUgb2YgdGhlIGRhdGEgYmxvY2sgKGRhdGE6Zm9vKSBpcyBkZWZpbmVkIGJ5IHNjaGVtYSAodGh1cyB0aGVyZSBpcyAKLSAgICAgICAgICAgIC8vICAgICAgSkFYQiB0eXBlIHJlbmRlcmluZy4gIAotICAgICAgICAgICAgLy8gICA1KSBXZSBhbHdheXMgc2VuZCBhbiB4c2k6dHlwZSwgYnV0IG90aGVyIHZlbmRvcidzIG1heSBub3QuCi0gICAgICAgICAgICAvLyBHZXQgdGhlIG9wZXJhdGlvbiBpbmZvcm1hdGlvbgotICAgICAgICAgICAgUGFyYW1ldGVyRGVzY3JpcHRpb25bXSBwZHMgPSBvcGVyYXRpb25EZXNjLmdldFBhcmFtZXRlckRlc2NyaXB0aW9ucygpOwotICAgICAgICAgICAgTWFyc2hhbFNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb24gbWFyc2hhbERlc2MgPQotICAgICAgICAgICAgICAgICAgICBNZXRob2RNYXJzaGFsbGVyVXRpbHMuZ2V0TWFyc2hhbERlc2MoZW5kcG9pbnREZXNjKTsKLSAgICAgICAgICAgIFRyZWVTZXQ8U3RyaW5nPiBwYWNrYWdlcyA9IG1hcnNoYWxEZXNjLmdldFBhY2thZ2VzKCk7Ci0KLSAgICAgICAgICAgIC8vIEluZGljYXRlIHRoYXQgdGhlIHN0eWxlIGlzIERvY3VtZW50LCBidXQgdGhlIGJsb2NrcyBhcmUgdW5kZXJuZWF0aAotICAgICAgICAgICAgLy8gdGhlIHdyYXBwZXIgZWxlbWVudAotICAgICAgICAgICAgbWVzc2FnZS5zZXRTdHlsZShTdHlsZS5ET0NVTUVOVCk7Ci0gICAgICAgICAgICBtZXNzYWdlLnNldEluZGlyZWN0aW9uKDEpOwotCi0gICAgICAgICAgICAvLyBXZSB3YW50IHRvIHVzZSAiYnkgSmF2YSBUeXBlIiB1bm1hcnNoYWxsaW5nIGZvciAKLSAgICAgICAgICAgIC8vIGFsbCBvYmplY3RzCi0gICAgICAgICAgICBDbGFzc1tdIGphdmFUeXBlcyA9IG5ldyBDbGFzc1twZHMubGVuZ3RoXTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgUGFyYW1ldGVyRGVzY3JpcHRpb24gcGQgPSBwZHNbaV07Ci0gICAgICAgICAgICAgICAgamF2YVR5cGVzW2ldID0gcGQuZ2V0UGFyYW1ldGVyQWN0dWFsVHlwZSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBVbm1hcnNoYWwgdGhlIFBhcmFtVmFsdWVzIGZyb20gdGhlIE1lc3NhZ2UKLSAgICAgICAgICAgIExpc3Q8UERFbGVtZW50PiBwdkxpc3QgPSBNZXRob2RNYXJzaGFsbGVyVXRpbHMuZ2V0UERFbGVtZW50cyhwZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLCAvLyBpbnB1dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmFUeXBlcyk7ICAvLyBzaWdoLi4udW5tYXJzaGFsIGJ5IHR5cGUgYmVjYXVzZSB0aGVyZSBpcyBubyB3cmFwcGVyCi0KLSAgICAgICAgICAgIC8vIEJ1aWxkIHRoZSBzaWduYXR1cmUgYXJndW1lbnRzCi0gICAgICAgICAgICBPYmplY3RbXSBzaWdBcmd1bWVudHMgPSBNZXRob2RNYXJzaGFsbGVyVXRpbHMuY3JlYXRlUmVxdWVzdFNpZ25hdHVyZUFyZ3MocGRzLCBwdkxpc3QpOwotCi0gICAgICAgICAgICAvLyBUT0RPIFRoaXMgbmVlZHMgbW9yZSB3b3JrLiAgV2UgbmVlZCB0byBjaGVjayBpbnNpZGUgaG9sZGVycyBvZiBpbnB1dCBwYXJhbXMuICBXZSBhbHNvCi0gICAgICAgICAgICAvLyBtYXkgd2FudCB0byBleGNsdWRlIGhlYWRlciBwYXJhbXMgZnJvbSB0aGlzIGNoZWNrCi0gICAgICAgICAgICAvL1ZhbGlkYXRlIGlucHV0IHBhcmFtZXRlcnMgZm9yIG9wZXJhdGlvbiBhbmQgbWFrZSBzdXJlIG5vIGlucHV0IHBhcmFtZXRlcnMgYXJlIG51bGwuCi0gICAgICAgICAgICAvL0FzIHBlciBKQVhXUyBTcGVjaWZpY2F0aW9uIHNlY3Rpb24gMy42LjIuMyBpZiBhIG51bGwgdmFsdWUgaXMgcGFzc2VzIGFzIGFuIGFyZ3VtZW50IAotICAgICAgICAgICAgLy90byBhIG1ldGhvZCB0aGVuIGFuIGltcGxlbWVudGF0aW9uIE1VU1QgdGhyb3cgV2ViU2VydmljZUV4Y2VwdGlvbi4KLSAgICAgICAgICAgIGlmIChzaWdBcmd1bWVudHMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZvciAoT2JqZWN0IGFyZ3VtZW50IDogc2lnQXJndW1lbnRzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhcmd1bWVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAJCQlNZXNzYWdlcy5nZXRNZXNzYWdlKCJOdWxsUGFyYW1FcnIyIixvcGVyYXRpb25EZXNjLmdldEphdmFNZXRob2ROYW1lKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBzaWdBcmd1bWVudHM7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgTWVzc2FnZSBtYXJzaGFsUmVzcG9uc2UoT2JqZWN0IHJldHVybk9iamVjdCwgT2JqZWN0W10gc2lnbmF0dXJlQXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmF0aW9uRGVzY3JpcHRpb24gb3BlcmF0aW9uRGVzYywgUHJvdG9jb2wgcHJvdG9jb2wpCi0gICAgICAgICAgICB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0KLQotICAgICAgICBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uIGVkID0gb3BlcmF0aW9uRGVzYy5nZXRFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZW5kcG9pbnREZXNjID0gZWQuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbigpOwotICAgICAgICAvLyBXZSB3YW50IHRvIHJlc3BvbmQgd2l0aCB0aGUgc2FtZSBwcm90b2NvbCBhcyB0aGUgcmVxdWVzdCwKLSAgICAgICAgLy8gSXQgdGhlIHByb3RvY29sIGlzIG51bGwsIHRoZW4gdXNlIHRoZSBQcm90b2NvbCBkZWZpbmVkIGJ5IHRoZSBiaW5kaW5nCi0gICAgICAgIGlmIChwcm90b2NvbCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBwcm90b2NvbCA9IFByb3RvY29sLmdldFByb3RvY29sRm9yQmluZGluZyhlbmRwb2ludERlc2MuZ2V0QmluZGluZ1R5cGUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBOb3RlIGFsbCBleGNlcHRpb25zIGFyZSBjYXVnaHQgYW5kIHJldGhyb3duIHdpdGggYSBXZWJTZXJ2aWNlRXhjZXB0aW9uCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBTYW1wbGUgUlBDIG1lc3NhZ2UKLSAgICAgICAgICAgIC8vIC4uCi0gICAgICAgICAgICAvLyA8c29hcGVudjpib2R5PgotICAgICAgICAgICAgLy8gICAgPG06b3BSZXNwb25zZSB4bWxuczptPSJ1cm46Ly9hcGkiPgotICAgICAgICAgICAgLy8gICAgICAgPHBhcmFtIHhzaTp0eXBlPSJkYXRhOmZvbyIgPi4uLjwvcGFyYW0+Ci0gICAgICAgICAgICAvLyAgICA8L206b3A+Ci0gICAgICAgICAgICAvLyA8L3NvYXBlbnY6Ym9keT4KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBJbXBvcnRhbnQgcG9pbnRzLgotICAgICAgICAgICAgLy8gICAxKSBSUEMgaGFzIGFuIG9wZXJhdGlvbiBlbGVtZW50IHVuZGVyIHRoZSBib2R5LiAgVGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUKLSAgICAgICAgICAgIC8vICAgICAgd3NkbCBvcGVyYXRpb24uCi0gICAgICAgICAgICAvLyAgIDIpIFRoZSBkYXRhIGJsb2NrcyBhcmUgbG9jYXRlZCB1bmRlcm5lYXRoIHRoZSBvcGVyYXRpb24gZWxlbWVudC4gIChJbiBkb2MvbGl0Ci0gICAgICAgICAgICAvLyAgICAgIHRoZSBkYXRhIGVsZW1lbnRzIGFyZSB1bmRlcm5lYXRoIHRoZSBib2R5LgotICAgICAgICAgICAgLy8gICAzKSBUaGUgbmFtZSBvZiB0aGUgZGF0YSBibG9ja3MgKHBhcmFtKSBhcmUgZGVmaW5lZCBieSB0aGUgd3NkbDpwYXJ0IG5vdCB0aGUKLSAgICAgICAgICAgIC8vICAgICAgc2NoZW1hLiAgTm90ZSB0aGF0IGl0IGlzIHVucXVhbGlmaWVkLgotICAgICAgICAgICAgLy8gICA0KSBUaGUgdHlwZSBvZiB0aGUgZGF0YSBibG9jayAoZGF0YTpmb28pIGlzIGRlZmluZWQgYnkgc2NoZW1hICh0aHVzIHRoZXJlIGlzIAotICAgICAgICAgICAgLy8gICAgICBKQVhCIHR5cGUgcmVuZGVyaW5nLiAgU2luY2Ugd2UgYXJlIHVzaW5nIEpBWEIgdG8gbWFyc2hhbCB0aGUgZGF0YSwgCi0gICAgICAgICAgICAvLyAgICAgIHdlIGFsd2F5cyBnZW5lcmF0ZSBhbiB4c2k6dHlwZSBhdHRyaWJ1dGUuICBUaGlzIGlzIGFuIGltcGxlbWVuYXRpb24gZGV0YWlsCi0gICAgICAgICAgICAvLyAgICAgIGFuZCBpcyBub3QgZGVmaW5lZCBieSBhbnkgc3BlYy4KLQotICAgICAgICAgICAgLy8gR2V0IHRoZSBvcGVyYXRpb24gaW5mb3JtYXRpb24KLSAgICAgICAgICAgIFBhcmFtZXRlckRlc2NyaXB0aW9uW10gcGRzID0gb3BlcmF0aW9uRGVzYy5nZXRQYXJhbWV0ZXJEZXNjcmlwdGlvbnMoKTsKLSAgICAgICAgICAgIE1hcnNoYWxTZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uIG1hcnNoYWxEZXNjID0KLSAgICAgICAgICAgICAgICAgICAgTWV0aG9kTWFyc2hhbGxlclV0aWxzLmdldE1hcnNoYWxEZXNjKGVuZHBvaW50RGVzYyk7Ci0gICAgICAgICAgICBUcmVlU2V0PFN0cmluZz4gcGFja2FnZXMgPSBtYXJzaGFsRGVzYy5nZXRQYWNrYWdlcygpOwotCi0gICAgICAgICAgICAvLyBDcmVhdGUgdGhlIG1lc3NhZ2UgCi0gICAgICAgICAgICBNZXNzYWdlRmFjdG9yeSBtZiA9IChNZXNzYWdlRmFjdG9yeSlGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShNZXNzYWdlRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgICAgICBNZXNzYWdlIG0gPSBtZi5jcmVhdGUocHJvdG9jb2wpOwotCi0gICAgICAgICAgICAvLyBJbmRpY2F0ZSB0aGUgc3R5bGUgYW5kIHdyYXBwZXIgZWxlbWVudCBuYW1lLiAgVGhpcyB0cmlnZ2VycyB0aGUgbWVzc2FnZSB0bwotICAgICAgICAgICAgLy8gcHV0IHRoZSBkYXRhIGJsb2NrcyB1bmRlcm5lYXRoIHRoZSBvcGVyYXRpb24gZWxlbWVudAotICAgICAgICAgICAgbS5zZXRTdHlsZShTdHlsZS5ET0NVTUVOVCk7Ci0gICAgICAgICAgICBtLnNldEluZGlyZWN0aW9uKDEpOwotICAgICAgICAgICAgUU5hbWUgcmVzcG9uc2VPcCA9IGdldFJlc3BvbnNlV3JhcHBlclFOYW1lKG9wZXJhdGlvbkRlc2MpOwotICAgICAgICAgICAgbS5zZXRPcGVyYXRpb25FbGVtZW50KHJlc3BvbnNlT3ApOwotCi0gICAgICAgICAgICAvLyBQdXQgdGhlIHJldHVybiBvYmplY3Qgb250byB0aGUgbWVzc2FnZQotICAgICAgICAgICAgQ2xhc3MgcmV0dXJuVHlwZSA9IG9wZXJhdGlvbkRlc2MuZ2V0UmVzdWx0QWN0dWFsVHlwZSgpOwotICAgICAgICAgICAgU3RyaW5nIHJldHVybk5TID0gbnVsbDsKLSAgICAgICAgICAgIFN0cmluZyByZXR1cm5Mb2NhbFBhcnQgPSBudWxsOwotICAgICAgICAgICAgaWYgKG9wZXJhdGlvbkRlc2MuaXNSZXN1bHRIZWFkZXIoKSkgewotICAgICAgICAgICAgICAgIHJldHVybk5TID0gb3BlcmF0aW9uRGVzYy5nZXRSZXN1bHRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICAgICAgICAgICAgICByZXR1cm5Mb2NhbFBhcnQgPSBvcGVyYXRpb25EZXNjLmdldFJlc3VsdE5hbWUoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuTlMgPSBvcGVyYXRpb25EZXNjLmdldFJlc3VsdFRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgICAgICAgICAgIHJldHVybkxvY2FsUGFydCA9IG9wZXJhdGlvbkRlc2MuZ2V0UmVzdWx0UGFydE5hbWUoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHJldHVyblR5cGUgIT0gdm9pZC5jbGFzcykgewotCi0gICAgICAgICAgICAgICAgLy8gVE9ETyBzaG91bGQgd2UgYWxsb3cgbnVsbCBpZiB0aGUgcmV0dXJuIGlzIGEgaGVhZGVyPwotICAgICAgICAgICAgICAgIC8vVmFsaWRhdGUgaW5wdXQgcGFyYW1ldGVycyBmb3Igb3BlcmF0aW9uIGFuZCBtYWtlIHN1cmUgbm8gaW5wdXQgcGFyYW1ldGVycyBhcmUgbnVsbC4KLSAgICAgICAgICAgICAgICAvL0FzIHBlciBKQVhXUyBTcGVjaWZpY2F0aW9uIHNlY3Rpb24gMy42LjIuMyBpZiBhIG51bGwgdmFsdWUgaXMgcGFzc2VzIGFzIGFuIGFyZ3VtZW50IAotICAgICAgICAgICAgICAgIC8vdG8gYSBtZXRob2QgdGhlbiBhbiBpbXBsZW1lbnRhdGlvbiBNVVNUIHRocm93IFdlYlNlcnZpY2VFeGNlcHRpb24uCi0gICAgICAgICAgICAgICAgaWYgKHJldHVybk9iamVjdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgCQkJTWVzc2FnZXMuZ2V0TWVzc2FnZSgiTnVsbFBhcmFtRXJyMyIsb3BlcmF0aW9uRGVzYy5nZXRKYXZhTWV0aG9kTmFtZSgpKSk7Ci0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgRWxlbWVudCByZXR1cm5FbGVtZW50ID0gbnVsbDsKLSAgICAgICAgICAgICAgICBRTmFtZSByZXR1cm5RTmFtZSA9IG5ldyBRTmFtZShyZXR1cm5OUywgcmV0dXJuTG9jYWxQYXJ0KTsKLSAgICAgICAgICAgICAgICBpZiAobWFyc2hhbERlc2MuZ2V0QW5ub3RhdGlvbkRlc2MocmV0dXJuVHlwZSkuaGFzWG1sUm9vdEVsZW1lbnQoKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm5FbGVtZW50ID0gbmV3IEVsZW1lbnQocmV0dXJuT2JqZWN0LCByZXR1cm5RTmFtZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuRWxlbWVudCA9IG5ldyBFbGVtZW50KHJldHVybk9iamVjdCwgcmV0dXJuUU5hbWUsIHJldHVyblR5cGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBNZXRob2RNYXJzaGFsbGVyVXRpbHMudG9NZXNzYWdlKHJldHVybkVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uRGVzYy5pc0xpc3RUeXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJzaGFsRGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5UeXBlLCAvLyBmb3JjZSBtYXJzaGFsIGJ5IHR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbkRlc2MuaXNSZXN1bHRIZWFkZXIoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIENvbnZlcnQgdGhlIGhvbGRlciBvYmplY3RzIGludG8gYSBsaXN0IG9mIEpBWEIgb2JqZWN0cyBmb3IgbWFyc2hhbGxpbmcKLSAgICAgICAgICAgIExpc3Q8UERFbGVtZW50PiBwZGVMaXN0ID0KLSAgICAgICAgICAgICAgICAgICAgTWV0aG9kTWFyc2hhbGxlclV0aWxzLmdldFBERWxlbWVudHMobWFyc2hhbERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlQXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsICAvLyBvdXRwdXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgICAvLyBkb2MvbGl0IHdyYXBwZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOyAvLyBub3QgcnBjCi0KLSAgICAgICAgICAgIC8vIFdlIHdhbnQgdG8gdXNlICJieSBKYXZhIFR5cGUiIG1hcnNoYWxsaW5nIGZvciAKLSAgICAgICAgICAgIC8vIGFsbCBvYmplY3RzCi0gICAgICAgICAgICBmb3IgKFBERWxlbWVudCBwZGUgOiBwZGVMaXN0KSB7Ci0gICAgICAgICAgICAgICAgUGFyYW1ldGVyRGVzY3JpcHRpb24gcGQgPSBwZGUuZ2V0UGFyYW0oKTsKLSAgICAgICAgICAgICAgICBDbGFzcyB0eXBlID0gcGQuZ2V0UGFyYW1ldGVyQWN0dWFsVHlwZSgpOwotICAgICAgICAgICAgICAgIHBkZS5zZXRCeUphdmFUeXBlQ2xhc3ModHlwZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFRPRE8gU2hvdWxkIHdlIGNoZWNrIGZvciBudWxsIG91dHB1dCBib2R5IHZhbHVlcz8gIFNob3VsZCB3ZSBjaGVjayBmb3IgbnVsbCBvdXRwdXQgaGVhZGVyIHZhbHVlcyA/Ci0gICAgICAgICAgICAvLyBQdXQgdmFsdWVzIG9udG8gdGhlIG1lc3NhZ2UKLSAgICAgICAgICAgIE1ldGhvZE1hcnNoYWxsZXJVdGlscy50b01lc3NhZ2UocGRlTGlzdCwgbSwgcGFja2FnZXMpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBFbmFibGUgU1dBIGZvciBuZXN0ZWQgU3dhUmVmIGF0dGFjaG1lbnRzCi0gICAgICAgICAgICBpZiAob3BlcmF0aW9uRGVzYy5oYXNSZXNwb25zZVN3YVJlZkF0dGFjaG1lbnRzKCkpIHsKLSAgICAgICAgICAgICAgICBtLnNldERvaW5nU1dBKHRydWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gbTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIHB1YmxpYyBPYmplY3QgZGVtYXJzaGFsUmVzcG9uc2UoTWVzc2FnZSBtZXNzYWdlLCBPYmplY3RbXSBzaWduYXR1cmVBcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmF0aW9uRGVzY3JpcHRpb24gb3BlcmF0aW9uRGVzYykKLSAgICAgICAgICAgIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLQotICAgICAgICBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uIGVkID0gb3BlcmF0aW9uRGVzYy5nZXRFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZW5kcG9pbnREZXNjID0gZWQuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbigpOwotCi0gICAgICAgIC8vIE5vdGUgYWxsIGV4Y2VwdGlvbnMgYXJlIGNhdWdodCBhbmQgcmV0aHJvd24gd2l0aCBhIFdlYlNlcnZpY2VFeGNlcHRpb24KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIFNhbXBsZSBSUEMgbWVzc2FnZQotICAgICAgICAgICAgLy8gLi4KLSAgICAgICAgICAgIC8vIDxzb2FwZW52OmJvZHk+Ci0gICAgICAgICAgICAvLyAgICA8bTpvcFJlc3BvbnNlIHhtbG5zOm09InVybjovL2FwaSI+Ci0gICAgICAgICAgICAvLyAgICAgICA8cGFyYW0geHNpOnR5cGU9ImRhdGE6Zm9vIiA+Li4uPC9wYXJhbT4KLSAgICAgICAgICAgIC8vICAgIDwvbTpvcD4KLSAgICAgICAgICAgIC8vIDwvc29hcGVudjpib2R5PgotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8vIEltcG9ydGFudCBwb2ludHMuCi0gICAgICAgICAgICAvLyAgIDEpIFJQQyBoYXMgYW4gb3BlcmF0aW9uIGVsZW1lbnQgdW5kZXIgdGhlIGJvZHkuICBUaGlzIGlzIHRoZSBuYW1lIG9mIHRoZQotICAgICAgICAgICAgLy8gICAgICB3c2RsIG9wZXJhdGlvbi4KLSAgICAgICAgICAgIC8vICAgMikgVGhlIGRhdGEgYmxvY2tzIGFyZSBsb2NhdGVkIHVuZGVybmVhdGggdGhlIG9wZXJhdGlvbiBlbGVtZW50LiAgKEluIGRvYy9saXQKLSAgICAgICAgICAgIC8vICAgICAgdGhlIGRhdGEgZWxlbWVudHMgYXJlIHVuZGVybmVhdGggdGhlIGJvZHkuCi0gICAgICAgICAgICAvLyAgIDMpIFRoZSBuYW1lIG9mIHRoZSBkYXRhIGJsb2NrcyAocGFyYW0pIGFyZSBkZWZpbmVkIGJ5IHRoZSB3c2RsOnBhcnQgbm90IHRoZQotICAgICAgICAgICAgLy8gICAgICBzY2hlbWEuICBOb3RlIHRoYXQgaXQgaXMgdW5xdWFsaWZpZWQgcGVyIFdTSS1CUAotICAgICAgICAgICAgLy8gICA0KSBUaGUgdHlwZSBvZiB0aGUgZGF0YSBibG9jayAoZGF0YTpmb28pIGlzIGRlZmluZWQgYnkgc2NoZW1hICh0aHVzIHRoZXJlIGlzIAotICAgICAgICAgICAgLy8gICAgICBKQVhCIHR5cGUgcmVuZGVyaW5nLiAgCi0gICAgICAgICAgICAvLyAgIDUpIFdlIGFsd2F5cyBzZW5kIGFuIHhzaTp0eXBlLCBidXQgb3RoZXIgdmVuZG9yJ3MgbWF5IG5vdC4KLSAgICAgICAgICAgIC8vIEdldCB0aGUgb3BlcmF0aW9uIGluZm9ybWF0aW9uCi0gICAgICAgICAgICBQYXJhbWV0ZXJEZXNjcmlwdGlvbltdIHBkcyA9IG9wZXJhdGlvbkRlc2MuZ2V0UGFyYW1ldGVyRGVzY3JpcHRpb25zKCk7Ci0gICAgICAgICAgICBNYXJzaGFsU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbiBtYXJzaGFsRGVzYyA9Ci0gICAgICAgICAgICAgICAgICAgIE1ldGhvZE1hcnNoYWxsZXJVdGlscy5nZXRNYXJzaGFsRGVzYyhlbmRwb2ludERlc2MpOwotICAgICAgICAgICAgVHJlZVNldDxTdHJpbmc+IHBhY2thZ2VzID0gbWFyc2hhbERlc2MuZ2V0UGFja2FnZXMoKTsKLQotICAgICAgICAgICAgLy8gSW5kaWNhdGUgdGhhdCB0aGUgc3R5bGUgaXMgRG9jdW1lbnQuIAotICAgICAgICAgICAgbWVzc2FnZS5zZXRTdHlsZShTdHlsZS5ET0NVTUVOVCk7Ci0gICAgICAgICAgICBtZXNzYWdlLnNldEluZGlyZWN0aW9uKDEpOwotCi0gICAgICAgICAgICAvLyBHZXQgdGhlIHJldHVybiB2YWx1ZS4KLSAgICAgICAgICAgIENsYXNzIHJldHVyblR5cGUgPSBvcGVyYXRpb25EZXNjLmdldFJlc3VsdEFjdHVhbFR5cGUoKTsKLSAgICAgICAgICAgIE9iamVjdCByZXR1cm5WYWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICBib29sZWFuIGhhc1JldHVybkluQm9keSA9IGZhbHNlOwotICAgICAgICAgICAgaWYgKHJldHVyblR5cGUgIT0gdm9pZC5jbGFzcykgewotICAgICAgICAgICAgICAgIC8vIElmIHRoZSB3ZWJyZXN1bHQgaXMgaW4gdGhlIGhlYWRlciwgd2UgbmVlZCB0aGUgbmFtZSBvZiB0aGUgaGVhZGVyIHNvIHRoYXQgd2UgY2FuIGZpbmQgaXQuCi0gICAgICAgICAgICAgICAgRWxlbWVudCByZXR1cm5FbGVtZW50ID0gbnVsbDsKLSAgICAgICAgICAgICAgICBpZiAob3BlcmF0aW9uRGVzYy5pc1Jlc3VsdEhlYWRlcigpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybkVsZW1lbnQgPSBNZXRob2RNYXJzaGFsbGVyVXRpbHMuZ2V0UmV0dXJuRWxlbWVudChwYWNrYWdlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uRGVzYy5pc0xpc3RUeXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLCAgLy8gaXMgYSBoZWFkZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbkRlc2MuZ2V0UmVzdWx0VGFyZ2V0TmFtZXNwYWNlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBoZWFkZXIgbnMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbkRlc2MuZ2V0UmVzdWx0UGFydE5hbWUoKSwgICAgIC8vIGhlYWRlciBsb2NhbCBwYXJ0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRob2RNYXJzaGFsbGVyVXRpbHMubnVtT3V0cHV0Qm9keVBhcmFtcyhwZHMpID4gMCk7Ci0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZXR1cm5FbGVtZW50ID0gTWV0aG9kTWFyc2hhbGxlclV0aWxzLmdldFJldHVybkVsZW1lbnQocGFja2FnZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbkRlc2MuaXNMaXN0VHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGhvZE1hcnNoYWxsZXJVdGlscy5udW1PdXRwdXRCb2R5UGFyYW1zKHBkcykgPiAwKTsKLSAgICAgICAgICAgICAgICAgICAgaGFzUmV0dXJuSW5Cb2R5ID0gdHJ1ZTsKLQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZSA9IHJldHVybkVsZW1lbnQuZ2V0VHlwZVZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETyBzaG91bGQgd2UgYWxsb3cgbnVsbCBpZiB0aGUgcmV0dXJuIGlzIGEgaGVhZGVyPwotICAgICAgICAgICAgICAgIC8vVmFsaWRhdGUgaW5wdXQgcGFyYW1ldGVycyBmb3Igb3BlcmF0aW9uIGFuZCBtYWtlIHN1cmUgbm8gaW5wdXQgcGFyYW1ldGVycyBhcmUgbnVsbC4KLSAgICAgICAgICAgICAgICAvL0FzIHBlciBKQVhXUyBTcGVjaWZpY2F0aW9uIHNlY3Rpb24gMy42LjIuMyBpZiBhIG51bGwgdmFsdWUgaXMgcGFzc2VzIGFzIGFuIGFyZ3VtZW50IAotICAgICAgICAgICAgICAgIC8vdG8gYSBtZXRob2QgdGhlbiBhbiBpbXBsZW1lbnRhdGlvbiBNVVNUIHRocm93IFdlYlNlcnZpY2VFeGNlcHRpb24uCi0gICAgICAgICAgICAgICAgaWYgKHJldHVyblZhbHVlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAJdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAJCQlNZXNzYWdlcy5nZXRNZXNzYWdlKCJOdWxsUGFyYW1FcnIzIixvcGVyYXRpb25EZXNjLmdldEphdmFNZXRob2ROYW1lKCkpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFdlIHdhbnQgdG8gdXNlICJieSBKYXZhIFR5cGUiIHVubWFyc2hhbGxpbmcgZm9yIAotICAgICAgICAgICAgLy8gYWxsIG9iamVjdHMKLSAgICAgICAgICAgIENsYXNzW10gamF2YVR5cGVzID0gbmV3IENsYXNzW3Bkcy5sZW5ndGhdOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwZHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBQYXJhbWV0ZXJEZXNjcmlwdGlvbiBwZCA9IHBkc1tpXTsKLSAgICAgICAgICAgICAgICBDbGFzcyB0eXBlID0gcGQuZ2V0UGFyYW1ldGVyQWN0dWFsVHlwZSgpOwotICAgICAgICAgICAgICAgIGphdmFUeXBlc1tpXSA9IHR5cGU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFVubWFyc2hhbGwgdGhlIFBhcmFtVmFsdWVzIGZyb20gdGhlIE1lc3NhZ2UKLSAgICAgICAgICAgIExpc3Q8UERFbGVtZW50PiBwdkxpc3QgPSBNZXRob2RNYXJzaGFsbGVyVXRpbHMuZ2V0UERFbGVtZW50cyhwZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgLy8gb3V0cHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzUmV0dXJuSW5Cb2R5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmFUeXBlcyk7IC8vIHVubWFyc2hhbCBieSB0eXBlCi0KLSAgICAgICAgICAgIC8vIFRPRE8gU2hvdWxkIHdlIGNoZWNrIGZvciBudWxsIG91dHB1dCBib2R5IHZhbHVlcz8gIFNob3VsZCB3ZSBjaGVjayBmb3IgbnVsbCBvdXRwdXQgaGVhZGVyIHZhbHVlcyA/Ci0KLSAgICAgICAgICAgIC8vIFBvcHVsYXRlIHRoZSByZXNwb25zZSBIb2xkZXJzCi0gICAgICAgICAgICBNZXRob2RNYXJzaGFsbGVyVXRpbHMudXBkYXRlUmVzcG9uc2VTaWduYXR1cmVBcmdzKHBkcywgcHZMaXN0LCBzaWduYXR1cmVBcmdzKTsKLQotICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBNZXNzYWdlIG1hcnNoYWxGYXVsdFJlc3BvbnNlKFRocm93YWJsZSB0aHJvd2FibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmF0aW9uRGVzY3JpcHRpb24gb3BlcmF0aW9uRGVzYywgUHJvdG9jb2wgcHJvdG9jb2wpCi0gICAgICAgICAgICB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiBlZCA9IG9wZXJhdGlvbkRlc2MuZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbigpOwotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVuZHBvaW50RGVzYyA9IGVkLmdldEVuZHBvaW50RGVzY3JpcHRpb24oKTsKLSAgICAgICAgTWFyc2hhbFNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb24gbWFyc2hhbERlc2MgPQotICAgICAgICAgICAgICAgIE1ldGhvZE1hcnNoYWxsZXJVdGlscy5nZXRNYXJzaGFsRGVzYyhlbmRwb2ludERlc2MpOwotICAgICAgICBUcmVlU2V0PFN0cmluZz4gcGFja2FnZXMgPSBtYXJzaGFsRGVzYy5nZXRQYWNrYWdlcygpOwotCi0gICAgICAgIC8vIFdlIHdhbnQgdG8gcmVzcG9uZCB3aXRoIHRoZSBzYW1lIHByb3RvY29sIGFzIHRoZSByZXF1ZXN0LAotICAgICAgICAvLyBJdCB0aGUgcHJvdG9jb2wgaXMgbnVsbCwgdGhlbiB1c2UgdGhlIFByb3RvY29sIGRlZmluZWQgYnkgdGhlIGJpbmRpbmcKLSAgICAgICAgaWYgKHByb3RvY29sID09IG51bGwpIHsKLSAgICAgICAgICAgIHByb3RvY29sID0gUHJvdG9jb2wuZ2V0UHJvdG9jb2xGb3JCaW5kaW5nKGVuZHBvaW50RGVzYy5nZXRCaW5kaW5nVHlwZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIE5vdGUgYWxsIGV4Y2VwdGlvbnMgYXJlIGNhdWdodCBhbmQgcmV0aHJvd24gd2l0aCBhIFdlYlNlcnZpY2VFeGNlcHRpb24KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgbWVzc2FnZSAKLSAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5IG1mID0gKE1lc3NhZ2VGYWN0b3J5KUZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KE1lc3NhZ2VGYWN0b3J5LmNsYXNzKTsKLSAgICAgICAgICAgIE1lc3NhZ2UgbSA9IG1mLmNyZWF0ZShwcm90b2NvbCk7Ci0KLSAgICAgICAgICAgIC8vIFB1dCB0aGUgZmF1bHQgb250byB0aGUgbWVzc2FnZQotICAgICAgICAgICAgTWV0aG9kTWFyc2hhbGxlclV0aWxzLm1hcnNoYWxGYXVsdFJlc3BvbnNlKHRocm93YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJzaGFsRGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25EZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0pOwotICAgICAgICAgICAgcmV0dXJuIG07Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFRocm93YWJsZSBkZW1hcnNoYWxGYXVsdFJlc3BvbnNlKE1lc3NhZ2UgbWVzc2FnZSwgT3BlcmF0aW9uRGVzY3JpcHRpb24gb3BlcmF0aW9uRGVzYykKLSAgICAgICAgICAgIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLQotICAgICAgICBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uIGVkID0gb3BlcmF0aW9uRGVzYy5nZXRFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZW5kcG9pbnREZXNjID0gZWQuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbigpOwotICAgICAgICBNYXJzaGFsU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbiBtYXJzaGFsRGVzYyA9Ci0gICAgICAgICAgICAgICAgTWV0aG9kTWFyc2hhbGxlclV0aWxzLmdldE1hcnNoYWxEZXNjKGVuZHBvaW50RGVzYyk7Ci0KLSAgICAgICAgLy8gTm90ZSBhbGwgZXhjZXB0aW9ucyBhcmUgY2F1Z2h0IGFuZCByZXRocm93biB3aXRoIGEgV2ViU2VydmljZUV4Y2VwdGlvbgotICAgICAgICB0cnkgewotICAgICAgICAgICAgVGhyb3dhYmxlIHQgPSBNZXRob2RNYXJzaGFsbGVyVXRpbHMKLSAgICAgICAgICAgICAgICAgICAgLmRlbWFyc2hhbEZhdWx0UmVzcG9uc2Uob3BlcmF0aW9uRGVzYywgbWFyc2hhbERlc2MsIG1lc3NhZ2UpOwotICAgICAgICAgICAgcmV0dXJuIHQ7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIG9wRGVzYwotICAgICAqIEByZXR1cm4gcmVxdWVzdCB3cmFwcGVyIHFuYW1lCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgUU5hbWUgZ2V0UmVxdWVzdFdyYXBwZXJRTmFtZShPcGVyYXRpb25EZXNjcmlwdGlvbiBvcERlc2MpIHsKLQotICAgICAgICBRTmFtZSBxTmFtZSA9IG9wRGVzYy5nZXROYW1lKCk7Ci0KLSAgICAgICAgU3RyaW5nIGxvY2FsUGFydCA9IG9wRGVzYy5nZXRSZXF1ZXN0V3JhcHBlckxvY2FsTmFtZSgpOwotICAgICAgICBTdHJpbmcgdXJpID0gb3BEZXNjLmdldFJlcXVlc3RXcmFwcGVyVGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgIFN0cmluZyBwcmVmaXggPSAiZGx3bWluIjsgIC8vIFByZWZlciB1c2luZyBhbiBhY3R1YWwgcHJlZml4Ci0KLQotICAgICAgICBxTmFtZSA9IG5ldyBRTmFtZSh1cmksIGxvY2FsUGFydCwgcHJlZml4KTsKLSAgICAgICAgcmV0dXJuIHFOYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBvcERlc2MKLSAgICAgKiBAcmV0dXJuIHJlcXVlc3Qgd3JhcHBlciBxbmFtZQotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIFFOYW1lIGdldFJlc3BvbnNlV3JhcHBlclFOYW1lKE9wZXJhdGlvbkRlc2NyaXB0aW9uIG9wRGVzYykgewotCi0gICAgICAgIFFOYW1lIHFOYW1lID0gb3BEZXNjLmdldE5hbWUoKTsKLQotICAgICAgICBTdHJpbmcgbG9jYWxQYXJ0ID0gb3BEZXNjLmdldFJlc3BvbnNlV3JhcHBlckxvY2FsTmFtZSgpOwotICAgICAgICBTdHJpbmcgdXJpID0gb3BEZXNjLmdldFJlc3BvbnNlV3JhcHBlclRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgICBTdHJpbmcgcHJlZml4ID0gImRsd21pbiI7ICAvLyBQcmVmZXIgdXNpbmcgYW4gYWN0dWFsIHByZWZpeAotCi0KLSAgICAgICAgcU5hbWUgPSBuZXcgUU5hbWUodXJpLCBsb2NhbFBhcnQsIHByZWZpeCk7Ci0gICAgICAgIHJldHVybiBxTmFtZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21hcnNoYWxsZXIvaW1wbC9hbHQvRG9jTGl0V3JhcHBlZFBsdXNNZXRob2RNYXJzaGFsbGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tYXJzaGFsbGVyL2ltcGwvYWx0L0RvY0xpdFdyYXBwZWRQbHVzTWV0aG9kTWFyc2hhbGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTFlOGU1Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21hcnNoYWxsZXIvaW1wbC9hbHQvRG9jTGl0V3JhcHBlZFBsdXNNZXRob2RNYXJzaGFsbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NzggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1hcnNoYWxsZXIuaW1wbC5hbHQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLkV4Y2VwdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5FbmRwb2ludERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLk9wZXJhdGlvbkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uUGFyYW1ldGVyRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5pMThuLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWFyc2hhbGxlci5NZXRob2RNYXJzaGFsbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5CbG9jazsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuTWVzc2FnZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuUHJvdG9jb2w7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmRhdGFiaW5kaW5nLkpBWEJCbG9ja0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmRhdGFiaW5kaW5nLkpBWEJVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZmFjdG9yeS5KQVhCQmxvY2tGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5mYWN0b3J5Lk1lc3NhZ2VGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MucmVnaXN0cnkuRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MucnVudGltZS5kZXNjcmlwdGlvbi5tYXJzaGFsLk1hcnNoYWxTZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MudXRpbGl0eS5Db252ZXJ0VXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy53cmFwcGVyLkpBWEJXcmFwcGVyVG9vbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLndyYXBwZXIuaW1wbC5KQVhCV3JhcHBlclRvb2xJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXguandzLldlYlBhcmFtLk1vZGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7Ci0KLS8qKgotICogVGhlIERvY0xpdFdyYXBwZWQgInBsdXMiIG1hcnNoYWxsZXIgaXMgdXNlZCB3aGVuIHRoZSBqYXZhIG1ldGhvZCBpcyBkb2MvbGl0IHdyYXBwZWQsIGJ1dCBpdCBkb2VzCi0gKiBub3QgZXhhY3RseSBjb21wbHkgd2l0aCB0aGUgZG9jL2xpdCBydWxlcy4gIFRoaXMgY2FuIHJlc3VsdCBmcm9tIHRoZSBjdXN0b21lciBhZGRpbmcgYW5ub3RhdGlvbnMsCi0gKiBidXQgaXQgY2FuIGFsc28gYmUgdGhlIHJlc3VsdCBvZiBXU0dFTiBnZW5lcmF0aW9uCi0gKiA8cC8+Ci0gKiBIZXJlIGlzIGFuIGV4YW1wbGU6Ci0gKgotICogQFdlYk1ldGhvZChhY3Rpb24gPSAiaHR0cDovL2FkZGhlYWRlcnMuc2FtcGxlLnRlc3Qub3JnL2VjaG9TdHJpbmdXU0dFTjEiKQotICogQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJlY2hvU3RyaW5nV1NHRU4xIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly93cmFwLnNhbXBsZS50ZXN0Lm9yZyIsCi0gKiBjbGFzc05hbWUgPSAib3JnLnRlc3Quc2FtcGxlLndyYXAuRWNob1N0cmluZ1dTR0VOMSIpCi0gKiBAUmVzcG9uc2VXcmFwcGVyKGxvY2FsTmFtZSA9ICJlY2hvU3RyaW5nV1NHRU4xUmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPQotICogImh0dHA6Ly93cmFwLnNhbXBsZS50ZXN0Lm9yZyIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5zYW1wbGUud3JhcC5FY2hvU3RyaW5nV1NHRU4xUmVzcG9uc2UiKQotICogcHVibGljIFN0cmluZyBlY2hvU3RyaW5nV1NHRU4xKAotICogQFdlYlBhcmFtKG5hbWUgPSAiaGVhZGVyVmFsdWUiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3dyYXAuc2FtcGxlLnRlc3Qub3JnIiwgaGVhZGVyID0gdHJ1ZSkKLSAqIFN0cmluZyBoZWFkZXJWYWx1ZSApCi0gKiA8cC8+Ci0gKiBJbiB0aGlzIGNhc2UgdGhlIG1ldGhvZCBpcyBkb2MvbGl0LCBidXQgdGhlIGhlYWRlclZhbHVlIHBhcmFtZXRlciBpcyBwYXNzZWQgaW4gdGhlIGhlYWRlci4gIFRoZQotICogd3JhcHBlciBjbGFzcyBFY2hvU3RyaW5nV1NHRU4xIHdpbGwgbm90IGhhdmUgYW55IGNoaWxkIGVsZW1lbnRzLgotICogPHAvPgotICogQSBzaW1pbGFyIGV4YW1wbGUgaXM6Ci0gKiBAV2ViTWV0aG9kKGFjdGlvbiA9ICJodHRwOi8vYWRkaGVhZGVycy5zYW1wbGUudGVzdC5vcmcvZWNob1N0cmluZ1dTR0VOMiIpCi0gKiBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gImVjaG9TdHJpbmdXU0dFTjIiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3dyYXAuc2FtcGxlLnRlc3Qub3JnIiwKLSAqIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5zYW1wbGUud3JhcC5FY2hvU3RyaW5nV1NHRU4yIikKLSAqIEBSZXNwb25zZVdyYXBwZXIobG9jYWxOYW1lID0gImVjaG9TdHJpbmdXU0dFTjJSZXNwb25zZSIsIHRhcmdldE5hbWVzcGFjZSA9Ci0gKiAiaHR0cDovL3dyYXAuc2FtcGxlLnRlc3Qub3JnIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LnNhbXBsZS53cmFwLkVjaG9TdHJpbmdXU0dFTjJSZXNwb25zZSIpCi0gKiBAV2ViUmVzdWx0KG5hbWUgPSAiaGVhZGVyVmFsdWUiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3dyYXAuc2FtcGxlLnRlc3Qub3JnIiwgaGVhZGVyID0gdHJ1ZSkKLSAqIHB1YmxpYyBTdHJpbmcgZWNob1N0cmluZ1dTR0VOMigKLSAqIEBXZWJQYXJhbShuYW1lID0gImRhdGEiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikgU3RyaW5nIGRhdGEgKQotICogPHAvPgotICogSW4gdGhpcyBzZWNvbmQgY2FzZSwgdGhlIHJldHVybiBpcyBwYXNzZWQgaW4gYSBoZWFkZXIgKGFzIGRlZmluZWQgYnkgQFdlYlJlc3VsdCkKLSAqIDxwLz4KLSAqIEF0IHRoZSB0aW1lIG9mIHRoaXMgd3JpdGluZywgdGhlICJwbHVzIiBtYXJzaGFsbGVyIGlzIG9ubHkgdXNlZCBpZiBhIGRvYy9saXQgd3JhcHBlZCBtZXRob2QgaGFzCi0gKiAiaGVhZGVyIiBwYXJhbWV0ZXJzLiAgSWYgb3RoZXIgZGV2aWF0aW9ucyBhcmUgZm91bmQsIHRoaXMgY2xhc3Mgd2lsbCBiZSB1cGRhdGVkLiAgVGhlIGFkdmFudGFnZQotICogb2YgdXNpbmcgRG9jTGl0V3JhcHBlclBsdXMgZm9yIHRoZXNlIGRldmlhdGlvbnMgaXMgdGhhdCBpdCBkb2VzIG5vdCBpbXBhY3QgdGhlIG5vcm1hbAotICogRG9jTGl0V3JhcHBlciBtYXJzaGFsbGluZyAod2hpY2ggaXMgdXNlZCBmb3IgOTklIG9mIHRoZSBjYXNlcykuICBUaHVzIHRoZXNlIGRldmlhdGlvbnMgd2lsbCBub3QKLSAqIHBvbHV0ZSBvciBzbG93IGRvd24gdGhlIG5vcm1hbCBmbG93LgotICogPHAvPgotICogU2NoZXUKLSAqLwotcHVibGljIGNsYXNzIERvY0xpdFdyYXBwZWRQbHVzTWV0aG9kTWFyc2hhbGxlciBpbXBsZW1lbnRzIE1ldGhvZE1hcnNoYWxsZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKERvY0xpdFdyYXBwZWRQbHVzTWV0aG9kTWFyc2hhbGxlci5jbGFzcyk7Ci0KLQotICAgIHB1YmxpYyBEb2NMaXRXcmFwcGVkUGx1c01ldGhvZE1hcnNoYWxsZXIoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBkZW1hcnNoYWxSZXNwb25zZShNZXNzYWdlIG1lc3NhZ2UsIE9iamVjdFtdIHNpZ25hdHVyZUFyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYXRpb25EZXNjcmlwdGlvbiBvcGVyYXRpb25EZXNjKQotICAgICAgICAgICAgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ2FsbGluZyBEb2NMaXRXcmFwcGVyUGx1c01ldGhvZE1hcnNoYWxsZXIuZGVtYXJzaGFsUmVzcG9uc2UiKTsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygKLSAgICAgICAgICAgICAgICAgICAgIiAgVGhlIERvY0xpdFdyYXBwZWQgUGx1cyBtYXJzaGFsbGVyIGlzIHVzZWQgd2hlbiB0aGUgd2ViIHNlcnZpY2UgbWV0aG9kIGRldmlhdGVzIGZyb20gdGhlIG5vcm1hbCBkb2MvbGl0IHJ1bGVzLiIpOwotICAgICAgICB9Ci0gICAgICAgIC8vIE5vdGUgYWxsIGV4Y2VwdGlvbnMgYXJlIGNhdWdodCBhbmQgcmV0aHJvd24gd2l0aCBhIFdlYlNlcnZpY2VFeGNlcHRpb24KLQotICAgICAgICBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uIGVkID0gb3BlcmF0aW9uRGVzYy5nZXRFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZW5kcG9pbnREZXNjID0gZWQuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbigpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBTYW1wbGUgRG9jdW1lbnQgbWVzc2FnZQotICAgICAgICAgICAgLy8gLi4KLSAgICAgICAgICAgIC8vIDxzb2FwZW52OmJvZHk+Ci0gICAgICAgICAgICAvLyAgICA8bTpvcGVyYXRpb25SZXNwb25zZSAuLi4gPgotICAgICAgICAgICAgLy8gICAgICAgPHBhcmFtPmhlbGxvPC9wYXJhbT4KLSAgICAgICAgICAgIC8vICAgIDwvbTpvcGVyYXRpb25SZXNwb25zZT4KLSAgICAgICAgICAgIC8vIDwvc29hcGVudjpib2R5PgotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8vIEltcG9ydGFudCBwb2ludHMuCi0gICAgICAgICAgICAvLyAgIDEpIFRoZXJlIGlzIG5vIG9wZXJhdGlvbiBlbGVtZW50IGluIHRoZSBtZXNzYWdlCi0gICAgICAgICAgICAvLyAgIDIpIFRoZSBkYXRhIGJsb2NrcyBhcmUgbG9jYXRlZCB1bmRlcm5lYXRoIHRoZSBib2R5IGVsZW1lbnQuIAotICAgICAgICAgICAgLy8gICAzKSBUaGUgbmFtZSBvZiB0aGUgZGF0YSBibG9jayAobTpvcGVyYXRpb25SZXNwb25zZSkgaXMgZGVmaW5lZCBieSB0aGUgc2NoZW1hLgotICAgICAgICAgICAgLy8gICAgICBJdCBtYXRjaGVzIHRoZSBvcGVyYXRpb24gbmFtZSArICJSZXNwb25zZSIsIGFuZCBpdCBoYXMgYSBjb3JyZXNwb25kaW5nIEpBWEIgZWxlbWVudC4KLSAgICAgICAgICAgIC8vICAgICAgVGhpcyBlbGVtZW50IGlzIGNhbGxlZCB0aGUgd3JhcHBlciBlbGVtZW50Ci0gICAgICAgICAgICAvLyAgIDQpIFRoZSBwYXJhbWV0ZXJzIGFyZSAocGFyYW0pIGFyZSBjaGlsZCBlbGVtZW50cyBvZiB0aGUgd3JhcHBlciBlbGVtZW50LgotICAgICAgICAgICAgUGFyYW1ldGVyRGVzY3JpcHRpb25bXSBwZHMgPSBvcGVyYXRpb25EZXNjLmdldFBhcmFtZXRlckRlc2NyaXB0aW9ucygpOwotICAgICAgICAgICAgTWFyc2hhbFNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb24gbWFyc2hhbERlc2MgPQotICAgICAgICAgICAgICAgICAgICBNZXRob2RNYXJzaGFsbGVyVXRpbHMuZ2V0TWFyc2hhbERlc2MoZW5kcG9pbnREZXNjKTsKLSAgICAgICAgICAgIFRyZWVTZXQ8U3RyaW5nPiBwYWNrYWdlcyA9IG1hcnNoYWxEZXNjLmdldFBhY2thZ2VzKCk7Ci0gICAgICAgICAgICBTdHJpbmcgcGFja2FnZXNLZXkgPSBtYXJzaGFsRGVzYy5nZXRQYWNrYWdlc0tleSgpOwotCi0gICAgICAgICAgICAvLyBEZXRlcm1pbmUgaWYgYSByZXR1cm5WYWx1ZSBpcyBleHBlY3RlZC4KLSAgICAgICAgICAgIC8vIFRoZSByZXR1cm4gdmFsdWUgbWF5IGJlIGFuIGNoaWxkIGVsZW1lbnQKLSAgICAgICAgICAgIC8vIFRoZSB3cmFwcGVyIGVsZW1lbnQgCi0gICAgICAgICAgICAvLyBvciBudWxsCi0gICAgICAgICAgICBPYmplY3QgcmV0dXJuVmFsdWUgPSBudWxsOwotICAgICAgICAgICAgQ2xhc3MgcmV0dXJuVHlwZSA9IG9wZXJhdGlvbkRlc2MuZ2V0UmVzdWx0QWN0dWFsVHlwZSgpOwotICAgICAgICAgICAgYm9vbGVhbiBpc0NoaWxkUmV0dXJuID0gIW9wZXJhdGlvbkRlc2MuaXNKQVhXU0FzeW5jQ2xpZW50TWV0aG9kKCkgJiYKLSAgICAgICAgICAgICAgICAgICAgKG9wZXJhdGlvbkRlc2MuZ2V0UmVzdWx0UGFydE5hbWUoKSAhPSBudWxsKTsKLSAgICAgICAgICAgIGJvb2xlYW4gaXNOb1JldHVybiA9IChyZXR1cm5UeXBlID09IHZvaWQuY2xhc3MpOwotCi0gICAgICAgICAgICAvLyBJbiB1c2FnZT1XUkFQUEVELCB0aGVyZSB3aWxsIGJlIGEgc2luZ2xlIEpBWEIgYmxvY2sgaW5zaWRlIHRoZSBib2R5LgotICAgICAgICAgICAgLy8gR2V0IHRoaXMgYmxvY2sKLSAgICAgICAgICAgIEpBWEJCbG9ja0NvbnRleHQgYmxvY2tDb250ZXh0ID0gbmV3IEpBWEJCbG9ja0NvbnRleHQocGFja2FnZXMsIHBhY2thZ2VzS2V5KTsKLSAgICAgICAgICAgIGJsb2NrQ29udGV4dC5zZXRXZWJTZXJ2aWNlTmFtZXNwYWNlKGVkLmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgICAgIEpBWEJCbG9ja0ZhY3RvcnkgZmFjdG9yeSA9Ci0gICAgICAgICAgICAgICAgICAgIChKQVhCQmxvY2tGYWN0b3J5KUZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KEpBWEJCbG9ja0ZhY3RvcnkuY2xhc3MpOwotICAgICAgICAgICAgQmxvY2sgYmxvY2sgPSBtZXNzYWdlLmdldEJvZHlCbG9jayhibG9ja0NvbnRleHQsIGZhY3RvcnkpOwotICAgICAgICAgICAgT2JqZWN0IHdyYXBwZXJPYmplY3QgPSBibG9jay5nZXRCdXNpbmVzc09iamVjdCh0cnVlKTsKLQotICAgICAgICAgICAgLy8gVGhlIGNoaWxkIGVsZW1lbnRzIGFyZSB3aXRoaW4gdGhlIG9iamVjdCB0aGF0IAotICAgICAgICAgICAgLy8gcmVwcmVzZW50cyB0aGUgdHlwZQotICAgICAgICAgICAgaWYgKHdyYXBwZXJPYmplY3QgaW5zdGFuY2VvZiBKQVhCRWxlbWVudCkgewotICAgICAgICAgICAgICAgIHdyYXBwZXJPYmplY3QgPSAoKEpBWEJFbGVtZW50KXdyYXBwZXJPYmplY3QpLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFVzZSB0aGUgd3JhcHBlciB0b29sIHRvIGdldCB0aGUgY2hpbGQgb2JqZWN0cy4KLSAgICAgICAgICAgIEpBWEJXcmFwcGVyVG9vbCB3cmFwcGVyVG9vbCA9IG5ldyBKQVhCV3JhcHBlclRvb2xJbXBsKCk7Ci0KLSAgICAgICAgICAgIC8vIEdldCB0aGUgbGlzdCBvZiBuYW1lcyBmb3IgdGhlIG91dHB1dCBwYXJhbWV0ZXJzCi0gICAgICAgICAgICBMaXN0PFN0cmluZz4gbmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgICAgIExpc3Q8UGFyYW1ldGVyRGVzY3JpcHRpb24+IHBkTGlzdCA9IG5ldyBBcnJheUxpc3Q8UGFyYW1ldGVyRGVzY3JpcHRpb24+KCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBkcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIFBhcmFtZXRlckRlc2NyaXB0aW9uIHBkID0gcGRzW2ldOwotICAgICAgICAgICAgICAgIGlmIChwZC5nZXRNb2RlKCkgPT0gTW9kZS5PVVQgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBkLmdldE1vZGUoKSA9PSBNb2RlLklOT1VUKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghcGQuaXNIZWFkZXIoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gSGVhZGVyIG5hbWVzIGFyZSBub3QgaW4gdGhlIHdyYXBwZWQgZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXMuYWRkKHBkLmdldFBhcmFtZXRlck5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcGRMaXN0LmFkZChwZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0KLSAgICAgICAgICAgIGlmICghb3BlcmF0aW9uRGVzYy5pc1Jlc3VsdEhlYWRlcigpKSB7Ci0gICAgICAgICAgICAgICAgLy8gTm9ybWFsIGNhc2UgKEJvZHkgUmVzdWx0KSBUaGUgcmV0dXJuIG5hbWUgaXMgaW4gdGhlIHdyYXBwZWQgb2JqZWN0Ci0gICAgICAgICAgICAgICAgaWYgKGlzQ2hpbGRSZXR1cm4gJiYgIWlzTm9SZXR1cm4pIHsKLSAgICAgICAgICAgICAgICAgICAgbmFtZXMuYWRkKG9wZXJhdGlvbkRlc2MuZ2V0UmVzdWx0UGFydE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBHZXQgdGhlIGNoaWxkIG9iamVjdHMKLSAgICAgICAgICAgIE9iamVjdFtdIG9iamVjdHMgPSB3cmFwcGVyVG9vbC51bldyYXAod3JhcHBlck9iamVjdCwgbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcnNoYWxEZXNjLmdldFByb3BlcnR5RGVzY3JpcHRvck1hcCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVyT2JqZWN0LmdldENsYXNzKCkpKTsKLQotICAgICAgICAgICAgLy8gTm93IGNyZWF0ZSBhIGxpc3Qgb2YgcGFyYW1WYWx1ZXMgc28gdGhhdCB3ZSBjYW4gcG9wdWxhdGUgdGhlIHNpZ25hdHVyZQotICAgICAgICAgICAgTGlzdDxQREVsZW1lbnQ+IHB2TGlzdCA9IG5ldyBBcnJheUxpc3Q8UERFbGVtZW50PigpOwotICAgICAgICAgICAgaW50IGJvZHlJbmRleCA9IDA7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBkTGlzdC5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIFBhcmFtZXRlckRlc2NyaXB0aW9uIHBkID0gcGRMaXN0LmdldChpKTsKLSAgICAgICAgICAgICAgICBpZiAoIXBkLmlzSGVhZGVyKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gQm9keSBlbGVtZW50cyBhcmUgb2J0YWluZWQgZnJvbSB0aGUgdW53cmFwcGVkIGFycmF5IG9mIG9iamVjdHMKLSAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gb2JqZWN0c1tib2R5SW5kZXhdOwotICAgICAgICAgICAgICAgICAgICAvLyBUaGUgb2JqZWN0IGluIHRoZSBQREVsZW1lbnQgbXVzdCBiZSBhbiBlbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgIFFOYW1lIHFOYW1lID0gbmV3IFFOYW1lKHBkLmdldFRhcmdldE5hbWVzcGFjZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZC5nZXRQYXJ0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgRWxlbWVudCBlbGVtZW50ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFtYXJzaGFsRGVzYy5nZXRBbm5vdGF0aW9uRGVzYyhwZC5nZXRQYXJhbWV0ZXJBY3R1YWxUeXBlKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmhhc1htbFJvb3RFbGVtZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgPSBuZXcgRWxlbWVudCh2YWx1ZSwgcU5hbWUsIHBkLmdldFBhcmFtZXRlckFjdHVhbFR5cGUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50ID0gbmV3IEVsZW1lbnQodmFsdWUsIHFOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwdkxpc3QuYWRkKG5ldyBQREVsZW1lbnQocGQsIGVsZW1lbnQsIG51bGwpKTsKLSAgICAgICAgICAgICAgICAgICAgYm9keUluZGV4Kys7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSGVhZGVyCi0gICAgICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgQmxvY2sgZnJvbSB0aGUgaGVhZGVyCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBsb2NhbE5hbWUgPSBwZC5nZXRQYXJhbWV0ZXJOYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIEpBWEJCbG9ja0NvbnRleHQgYmxrQ29udGV4dCA9IG5ldyBKQVhCQmxvY2tDb250ZXh0KHBhY2thZ2VzLCBwYWNrYWdlc0tleSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gU2V0IHVwICJieSBqYXZhIHR5cGUiIHVubWFyc2hhbGxpbmcgaWYgbmVjZXNzYXJ5Ci0gICAgICAgICAgICAgICAgICAgIGlmIChibGtDb250ZXh0LmdldENvbnN0cnVjdGlvblR5cGUoKSAhPSBKQVhCVXRpbHMuQ09OU1RSVUNUSU9OX1RZUEUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuQllfQ09OVEVYVF9QQVRIKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyBhY3R1YWxUeXBlID0gcGQuZ2V0UGFyYW1ldGVyQWN0dWFsVHlwZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE1ldGhvZE1hcnNoYWxsZXJVdGlscy5pc05vdEpBWEJSb290RWxlbWVudChhY3R1YWxUeXBlLCBtYXJzaGFsRGVzYykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBibGtDb250ZXh0LnNldFByb2Nlc3NUeXBlKGFjdHVhbFR5cGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsa0NvbnRleHQuc2V0SXN4bWxMaXN0KHBkLmlzTGlzdFR5cGUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYmxvY2sgPSBtZXNzYWdlLmdldEhlYWRlckJsb2NrKHBkLmdldFRhcmdldE5hbWVzcGFjZSgpLCBsb2NhbE5hbWUsIGJsa0NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3J5KTsKLSAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gYmxvY2suZ2V0QnVzaW5lc3NPYmplY3QodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgZWxlbWVudCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEVsZW1lbnQodmFsdWUsIG5ldyBRTmFtZShwZC5nZXRUYXJnZXROYW1lc3BhY2UoKSwgbG9jYWxOYW1lKSk7Ci0gICAgICAgICAgICAgICAgICAgIHB2TGlzdC5hZGQobmV3IFBERWxlbWVudChwZCwgZWxlbWVudCwgYmxrQ29udGV4dC5nZXRQcm9jZXNzVHlwZSgpKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBQb3B1bGF0ZSB0aGUgcmVzcG9uc2UgSG9sZGVycyBpbiB0aGUgc2lnbmF0dXJlCi0gICAgICAgICAgICBNZXRob2RNYXJzaGFsbGVyVXRpbHMudXBkYXRlUmVzcG9uc2VTaWduYXR1cmVBcmdzKHBkcywgcHZMaXN0LCBzaWduYXR1cmVBcmdzKTsKLQotICAgICAgICAgICAgLy8gTm93IGdldCB0aGUgcmV0dXJuIHZhbHVlCi0KLSAgICAgICAgICAgIGlmIChpc05vUmV0dXJuKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUgPSBudWxsOwotICAgICAgICAgICAgfSBlbHNlIGlmIChpc0NoaWxkUmV0dXJuKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFvcGVyYXRpb25EZXNjLmlzUmVzdWx0SGVhZGVyKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gTm9ybWFsOiBHZXQgdGhlIHJldHVybiBmcm9tIHRoZSBqYXhiIG9iamVjdAotICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZSA9IG9iamVjdHNbb2JqZWN0cy5sZW5ndGggLSAxXTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBIZWFkZXIgcmVzdWx0OiBHZXQgdGhlIHZhbHVlIGZyb20gdGhlIGhlYWRlcnMKLSAgICAgICAgICAgICAgICAgICAgRWxlbWVudCByZXR1cm5FbGVtZW50ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRob2RNYXJzaGFsbGVyVXRpbHMuZ2V0UmV0dXJuRWxlbWVudChwYWNrYWdlcywgbWVzc2FnZSwgbnVsbCwgZmFsc2UsIHRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uRGVzYy5nZXRSZXN1bHRUYXJnZXROYW1lc3BhY2UoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25EZXNjLmdldFJlc3VsdFBhcnROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZSA9IHJldHVybkVsZW1lbnQuZ2V0VHlwZVZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIHJldHVyblZhbHVlIG1heSBiZSBpbmNvbXBhdGlibGUgd2l0aCBKQVgtV1Mgc2lnbmF0dXJlCi0gICAgICAgICAgICAgICAgaWYgKENvbnZlcnRVdGlscy5pc0NvbnZlcnRhYmxlKHJldHVyblZhbHVlLCByZXR1cm5UeXBlKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZSA9IENvbnZlcnRVdGlscy5jb252ZXJ0KHJldHVyblZhbHVlLCByZXR1cm5UeXBlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgb2JqZWN0Q2xhc3MgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZXR1cm5WYWx1ZSA9PSBudWxsKSA/ICJudWxsIiA6IHJldHVyblZhbHVlLmdldENsYXNzKCkuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoImNvbnZlcnRQcm9ibGVtIiwgb2JqZWN0Q2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5UeXBlLmdldE5hbWUoKSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUgPSB3cmFwcGVyT2JqZWN0OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdFtdIGRlbWFyc2hhbFJlcXVlc3QoTWVzc2FnZSBtZXNzYWdlLCBPcGVyYXRpb25EZXNjcmlwdGlvbiBvcGVyYXRpb25EZXNjKQotICAgICAgICAgICAgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotCi0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJDYWxsaW5nIERvY0xpdFdyYXBwZXJQbHVzTWV0aG9kTWFyc2hhbGxlci5kZW1hcnNoYWxSZXF1ZXN0Iik7Ci0gICAgICAgICAgICBsb2cuZGVidWcoCi0gICAgICAgICAgICAgICAgICAgICIgIFRoZSBEb2NMaXRXcmFwcGVkIFBsdXMgbWFyc2hhbGxlciBpcyB1c2VkIHdoZW4gdGhlIHdlYiBzZXJ2aWNlIG1ldGhvZCBkZXZpYXRlcyBmcm9tIHRoZSBub3JtYWwgZG9jL2xpdCBydWxlcy4iKTsKLSAgICAgICAgfQotICAgICAgICBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uIGVkID0gb3BlcmF0aW9uRGVzYy5nZXRFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZW5kcG9pbnREZXNjID0gZWQuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbigpOwotCi0gICAgICAgIC8vIE5vdGUgYWxsIGV4Y2VwdGlvbnMgYXJlIGNhdWdodCBhbmQgcmV0aHJvd24gd2l0aCBhIFdlYlNlcnZpY2VFeGNlcHRpb24KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIFNhbXBsZSBEb2N1bWVudCBtZXNzYWdlCi0gICAgICAgICAgICAvLyAuLgotICAgICAgICAgICAgLy8gPHNvYXBlbnY6Ym9keT4KLSAgICAgICAgICAgIC8vICAgIDxtOm9wZXJhdGlvbj4KLSAgICAgICAgICAgIC8vICAgICAgPHBhcmFtPmhlbGxvPC9wYXJhbT4KLSAgICAgICAgICAgIC8vICAgIDwvbTpvcGVyYXRpb24+Ci0gICAgICAgICAgICAvLyA8L3NvYXBlbnY6Ym9keT4KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBJbXBvcnRhbnQgcG9pbnRzLgotICAgICAgICAgICAgLy8gICAxKSBUaGVyZSBpcyBubyBvcGVyYXRpb24gZWxlbWVudCB1bmRlciB0aGUgYm9keS4KLSAgICAgICAgICAgIC8vICAgMikgVGhlIGRhdGEgYmxvY2tzIGFyZSBsb2NhdGVkIHVuZGVybmVhdGggdGhlIGJvZHkuICAKLSAgICAgICAgICAgIC8vICAgMykgVGhlIG5hbWUgb2YgdGhlIGRhdGEgYmxvY2sgKG06b3BlcmF0aW9uKSBpcyBkZWZpbmVkIGJ5IHRoZSBzY2hlbWEgYW5kIG1hdGNoIHRoZSBuYW1lIG9mIHRoZSBvcGVyYXRpb24uCi0gICAgICAgICAgICAvLyAgICAgIFRoaXMgaXMgY2FsbGVkIHRoZSB3cmFwcGVyIGVsZW1lbnQuICBUaGUgd3JhcHBlciBlbGVtZW50IGhhcyBhIGNvcnJlc3BvbmRpbmcgSkFYQiBlbGVtZW50IHBvam8uCi0gICAgICAgICAgICAvLyAgIDQpIFRoZSBwYXJhbWV0ZXJzIChtOnBhcmFtKSBhcmUgY2hpbGQgZWxlbWVudHMgb2YgdGhlIHdyYXBwZXIgZWxlbWVudC4KLSAgICAgICAgICAgIFBhcmFtZXRlckRlc2NyaXB0aW9uW10gcGRzID0gb3BlcmF0aW9uRGVzYy5nZXRQYXJhbWV0ZXJEZXNjcmlwdGlvbnMoKTsKLSAgICAgICAgICAgIE1hcnNoYWxTZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uIG1hcnNoYWxEZXNjID0KLSAgICAgICAgICAgICAgICAgICAgTWV0aG9kTWFyc2hhbGxlclV0aWxzLmdldE1hcnNoYWxEZXNjKGVuZHBvaW50RGVzYyk7Ci0gICAgICAgICAgICBUcmVlU2V0PFN0cmluZz4gcGFja2FnZXMgPSBtYXJzaGFsRGVzYy5nZXRQYWNrYWdlcygpOwotICAgICAgICAgICAgU3RyaW5nIHBhY2thZ2VzS2V5ID0gbWFyc2hhbERlc2MuZ2V0UGFja2FnZXNLZXkoKTsKLQotICAgICAgICAgICAgLy8gSW4gdXNhZ2U9V1JBUFBFRCwgdGhlcmUgd2lsbCBiZSBhIHNpbmdsZSBKQVhCIGJsb2NrIGluc2lkZSB0aGUgYm9keS4KLSAgICAgICAgICAgIC8vIEdldCB0aGlzIGJsb2NrCi0gICAgICAgICAgICBKQVhCQmxvY2tDb250ZXh0IGJsb2NrQ29udGV4dCA9IG5ldyBKQVhCQmxvY2tDb250ZXh0KHBhY2thZ2VzLCBwYWNrYWdlc0tleSk7ICAgICAgICAgICAgCi0gICAgICAgICAgICBibG9ja0NvbnRleHQuc2V0V2ViU2VydmljZU5hbWVzcGFjZShlZC5nZXRUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgICAgICBKQVhCQmxvY2tGYWN0b3J5IGZhY3RvcnkgPQotICAgICAgICAgICAgICAgICAgICAoSkFYQkJsb2NrRmFjdG9yeSlGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShKQVhCQmxvY2tGYWN0b3J5LmNsYXNzKTsKLSAgICAgICAgICAgIEJsb2NrIGJsb2NrID0gbWVzc2FnZS5nZXRCb2R5QmxvY2soYmxvY2tDb250ZXh0LCBmYWN0b3J5KTsKLSAgICAgICAgICAgIE9iamVjdCB3cmFwcGVyT2JqZWN0ID0gYmxvY2suZ2V0QnVzaW5lc3NPYmplY3QodHJ1ZSk7Ci0KLSAgICAgICAgICAgIC8vIFRoZSBjaGlsZCBlbGVtZW50cyBhcmUgd2l0aGluIHRoZSBvYmplY3QgdGhhdCAKLSAgICAgICAgICAgIC8vIHJlcHJlc2VudHMgdGhlIHR5cGUKLSAgICAgICAgICAgIGlmICh3cmFwcGVyT2JqZWN0IGluc3RhbmNlb2YgSkFYQkVsZW1lbnQpIHsKLSAgICAgICAgICAgICAgICB3cmFwcGVyT2JqZWN0ID0gKChKQVhCRWxlbWVudCl3cmFwcGVyT2JqZWN0KS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBVc2UgdGhlIHdyYXBwZXIgdG9vbCB0byBnZXQgdGhlIGNoaWxkIG9iamVjdHMuCi0gICAgICAgICAgICBKQVhCV3JhcHBlclRvb2wgd3JhcHBlclRvb2wgPSBuZXcgSkFYQldyYXBwZXJUb29sSW1wbCgpOwotCi0gICAgICAgICAgICAvLyBHZXQgdGhlIGxpc3Qgb2YgbmFtZXMgZm9yIHRoZSBpbnB1dCBwYXJhbWV0ZXJzCi0gICAgICAgICAgICBMaXN0PFN0cmluZz4geG1sTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgICAgIExpc3Q8UGFyYW1ldGVyRGVzY3JpcHRpb24+IHBkTGlzdCA9IG5ldyBBcnJheUxpc3Q8UGFyYW1ldGVyRGVzY3JpcHRpb24+KCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBkcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIFBhcmFtZXRlckRlc2NyaXB0aW9uIHBkID0gcGRzW2ldOwotICAgICAgICAgICAgICAgIGlmIChwZC5nZXRNb2RlKCkgPT0gTW9kZS5JTiB8fAotICAgICAgICAgICAgICAgICAgICAgICAgcGQuZ2V0TW9kZSgpID09IE1vZGUuSU5PVVQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFwZC5pc0hlYWRlcigpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IHRoZSBib2R5IHBhcmFtZXRlcnMgd2lsbCBiZSBwcmVzZW50IGluIHRoZSB3cmFwcGVyIG9iamVjdAotICAgICAgICAgICAgICAgICAgICAgICAgeG1sTmFtZXMuYWRkKHBkLmdldFBhcmFtZXRlck5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcGRMaXN0LmFkZChwZCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEdldCB0aGUgY2hpbGQgb2JqZWN0cwotICAgICAgICAgICAgT2JqZWN0W10gb2JqZWN0cyA9IHdyYXBwZXJUb29sLnVuV3JhcCh3cmFwcGVyT2JqZWN0LCB4bWxOYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyc2hhbERlc2MuZ2V0UHJvcGVydHlEZXNjcmlwdG9yTWFwKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBwZXJPYmplY3QuZ2V0Q2xhc3MoKSkpOwotCi0gICAgICAgICAgICAvLyBOb3cgY3JlYXRlIGEgbGlzdCBvZiBwYXJhbVZhbHVlcyAKLSAgICAgICAgICAgIExpc3Q8UERFbGVtZW50PiBwdkxpc3QgPSBuZXcgQXJyYXlMaXN0PFBERWxlbWVudD4oKTsKLSAgICAgICAgICAgIGludCBib2R5SW5kZXggPSAwOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwZExpc3Quc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBQYXJhbWV0ZXJEZXNjcmlwdGlvbiBwZCA9IHBkTGlzdC5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFwZC5pc0hlYWRlcigpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIE5vcm1hbCBjYXNlOiBHZXQgdGhlIHBhcmFtZXRlciB2YWx1ZSBmcm9tIHRoZSBsaXN0IG9mIG9iamVjdHMKLSAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gb2JqZWN0c1tib2R5SW5kZXhdOwotCi0gICAgICAgICAgICAgICAgICAgIC8vICBUaGUgb2JqZWN0IGluIHRoZSBQREVsZW1lbnQgbXVzdCBiZSBhbiBlbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgIFFOYW1lIHFOYW1lID0gbmV3IFFOYW1lKHBkLmdldFRhcmdldE5hbWVzcGFjZSgpLCBwZC5nZXRQYXJ0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgRWxlbWVudCBlbGVtZW50ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFtYXJzaGFsRGVzYy5nZXRBbm5vdGF0aW9uRGVzYyhwZC5nZXRQYXJhbWV0ZXJBY3R1YWxUeXBlKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmhhc1htbFJvb3RFbGVtZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgPSBuZXcgRWxlbWVudCh2YWx1ZSwgcU5hbWUsIHBkLmdldFBhcmFtZXRlckFjdHVhbFR5cGUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50ID0gbmV3IEVsZW1lbnQodmFsdWUsIHFOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwdkxpc3QuYWRkKG5ldyBQREVsZW1lbnQocGQsIGVsZW1lbnQsIG51bGwpKTsKLSAgICAgICAgICAgICAgICAgICAgYm9keUluZGV4Kys7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSGVhZGVyCi0gICAgICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgQmxvY2sgZnJvbSB0aGUgaGVhZGVyCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBsb2NhbE5hbWUgPSBwZC5nZXRQYXJhbWV0ZXJOYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIEpBWEJCbG9ja0NvbnRleHQgYmxrQ29udGV4dCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEpBWEJCbG9ja0NvbnRleHQocGFja2FnZXMsIG1hcnNoYWxEZXNjLmdldFBhY2thZ2VzS2V5KCkpOwotICAgICAgICAgICAgICAgICAgICAvLyBTZXQgdXAgImJ5IGphdmEgdHlwZSIgdW5tYXJzaGFsbGluZyBpZiBuZWNlc3NhcnkKLSAgICAgICAgICAgICAgICAgICAgaWYgKGJsa0NvbnRleHQuZ2V0Q29uc3RydWN0aW9uVHlwZSgpICE9IEpBWEJVdGlscy5DT05TVFJVQ1RJT05fVFlQRQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5CWV9DT05URVhUX1BBVEgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzIGFjdHVhbFR5cGUgPSBwZC5nZXRQYXJhbWV0ZXJBY3R1YWxUeXBlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoTWV0aG9kTWFyc2hhbGxlclV0aWxzLmlzTm90SkFYQlJvb3RFbGVtZW50KGFjdHVhbFR5cGUsIG1hcnNoYWxEZXNjKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsa0NvbnRleHQuc2V0UHJvY2Vzc1R5cGUoYWN0dWFsVHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFubm90YXRpb24gYW5ub3NbXSA9IGFjdHVhbFR5cGUuZ2V0QW5ub3RhdGlvbnMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYW5ub3MgPT0gbnVsbCB8fCBhbm5vcy5sZW5ndGggPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibGtDb250ZXh0LnNldFByb2Nlc3NUeXBlKGFjdHVhbFR5cGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibGtDb250ZXh0LnNldElzeG1sTGlzdChwZC5pc0xpc3RUeXBlKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBibG9jayA9IG1lc3NhZ2UuZ2V0SGVhZGVyQmxvY2socGQuZ2V0VGFyZ2V0TmFtZXNwYWNlKCksIGxvY2FsTmFtZSwgYmxrQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3RvcnkpOwotICAgICAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBibG9jay5nZXRCdXNpbmVzc09iamVjdCh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgRWxlbWVudCBlbGVtZW50ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRWxlbWVudCh2YWx1ZSwgbmV3IFFOYW1lKHBkLmdldFRhcmdldE5hbWVzcGFjZSgpLCBsb2NhbE5hbWUpKTsKLSAgICAgICAgICAgICAgICAgICAgcHZMaXN0LmFkZChuZXcgUERFbGVtZW50KHBkLCBlbGVtZW50LCBibGtDb250ZXh0LmdldFByb2Nlc3NUeXBlKCkpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gQnVpbGQgdGhlIHNpZ25hdHVyZSBhcmd1bWVudHMKLSAgICAgICAgICAgIE9iamVjdFtdIHNpZ0FyZ3VtZW50cyA9IE1ldGhvZE1hcnNoYWxsZXJVdGlscy5jcmVhdGVSZXF1ZXN0U2lnbmF0dXJlQXJncyhwZHMsIHB2TGlzdCk7Ci0KLSAgICAgICAgICAgIHJldHVybiBzaWdBcmd1bWVudHM7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIE1lc3NhZ2UgbWFyc2hhbFJlc3BvbnNlKE9iamVjdCByZXR1cm5PYmplY3QsIE9iamVjdFtdIHNpZ25hdHVyZUFyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhdGlvbkRlc2NyaXB0aW9uIG9wZXJhdGlvbkRlc2MsIFByb3RvY29sIHByb3RvY29sKQotICAgICAgICAgICAgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ2FsbGluZyBEb2NMaXRXcmFwcGVyUGx1c01ldGhvZE1hcnNoYWxsZXIubWFyc2hhbFJlc3BvbnNlIik7Ci0gICAgICAgICAgICBsb2cuZGVidWcoCi0gICAgICAgICAgICAgICAgICAgICIgIFRoZSBEb2NMaXRXcmFwcGVkIFBsdXMgbWFyc2hhbGxlciBpcyB1c2VkIHdoZW4gdGhlIHdlYiBzZXJ2aWNlIG1ldGhvZCBkZXZpYXRlcyBmcm9tIHRoZSBub3JtYWwgZG9jL2xpdCBydWxlcy4iKTsKLSAgICAgICAgfQotICAgICAgICBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uIGVkID0gb3BlcmF0aW9uRGVzYy5nZXRFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZW5kcG9pbnREZXNjID0gZWQuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbigpOwotICAgICAgICAvLyBXZSB3YW50IHRvIHJlc3BvbmQgd2l0aCB0aGUgc2FtZSBwcm90b2NvbCBhcyB0aGUgcmVxdWVzdCwKLSAgICAgICAgLy8gSXQgdGhlIHByb3RvY29sIGlzIG51bGwsIHRoZW4gdXNlIHRoZSBQcm90b2NvbCBkZWZpbmVkIGJ5IHRoZSBiaW5kaW5nCi0gICAgICAgIGlmIChwcm90b2NvbCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBwcm90b2NvbCA9IFByb3RvY29sLmdldFByb3RvY29sRm9yQmluZGluZyhlbmRwb2ludERlc2MuZ2V0QmluZGluZ1R5cGUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBOb3RlIGFsbCBleGNlcHRpb25zIGFyZSBjYXVnaHQgYW5kIHJldGhyb3duIHdpdGggYSBXZWJTZXJ2aWNlRXhjZXB0aW9uCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBTYW1wbGUgRG9jdW1lbnQgbWVzc2FnZQotICAgICAgICAgICAgLy8gLi4KLSAgICAgICAgICAgIC8vIDxzb2FwZW52OmJvZHk+Ci0gICAgICAgICAgICAvLyAgICA8bTpvcGVyYXRpb25SZXNwb25zZSAuLi4gPgotICAgICAgICAgICAgLy8gICAgICAgPHBhcmFtPmhlbGxvPC9wYXJhbT4KLSAgICAgICAgICAgIC8vICAgIDwvbTpvcGVyYXRpb25SZXNwb25zZT4KLSAgICAgICAgICAgIC8vIDwvc29hcGVudjpib2R5PgotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8vIEltcG9ydGFudCBwb2ludHMuCi0gICAgICAgICAgICAvLyAgIDEpIFRoZXJlIGlzIG5vIG9wZXJhdGlvbiBlbGVtZW50IGluIHRoZSBtZXNzYWdlCi0gICAgICAgICAgICAvLyAgIDIpIFRoZSBkYXRhIGJsb2NrcyBhcmUgbG9jYXRlZCB1bmRlcm5lYXRoIHRoZSBib2R5IGVsZW1lbnQuIAotICAgICAgICAgICAgLy8gICAzKSBUaGUgbmFtZSBvZiB0aGUgZGF0YSBibG9jayAobTpvcGVyYXRpb25SZXNwb25zZSkgaXMgZGVmaW5lZCBieSB0aGUgc2NoZW1hLgotICAgICAgICAgICAgLy8gICAgICBJdCBtYXRjaGVzIHRoZSBvcGVyYXRpb24gbmFtZSArICJSZXNwb25zZSIsIGFuZCBpdCBoYXMgYSBjb3JyZXNwb25kaW5nIEpBWEIgZWxlbWVudC4KLSAgICAgICAgICAgIC8vICAgICAgVGhpcyBlbGVtZW50IGlzIGNhbGxlZCB0aGUgd3JhcHBlciBlbGVtZW50Ci0gICAgICAgICAgICAvLyAgIDQpIFRoZSBwYXJhbWV0ZXJzIGFyZSAocGFyYW0pIGFyZSBjaGlsZCBlbGVtZW50cyBvZiB0aGUgd3JhcHBlciBlbGVtZW50LgotCi0gICAgICAgICAgICAvLyBHZXQgdGhlIG9wZXJhdGlvbiBpbmZvcm1hdGlvbgotICAgICAgICAgICAgUGFyYW1ldGVyRGVzY3JpcHRpb25bXSBwZHMgPSBvcGVyYXRpb25EZXNjLmdldFBhcmFtZXRlckRlc2NyaXB0aW9ucygpOwotICAgICAgICAgICAgTWFyc2hhbFNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb24gbWFyc2hhbERlc2MgPQotICAgICAgICAgICAgICAgICAgICBNZXRob2RNYXJzaGFsbGVyVXRpbHMuZ2V0TWFyc2hhbERlc2MoZW5kcG9pbnREZXNjKTsKLSAgICAgICAgICAgIFRyZWVTZXQ8U3RyaW5nPiBwYWNrYWdlcyA9IG1hcnNoYWxEZXNjLmdldFBhY2thZ2VzKCk7Ci0gICAgICAgICAgICBTdHJpbmcgcGFja2FnZXNLZXkgPSBtYXJzaGFsRGVzYy5nZXRQYWNrYWdlc0tleSgpOwotCi0gICAgICAgICAgICAvLyBDcmVhdGUgdGhlIG1lc3NhZ2UgCi0gICAgICAgICAgICBNZXNzYWdlRmFjdG9yeSBtZiA9IChNZXNzYWdlRmFjdG9yeSlGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShNZXNzYWdlRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgICAgICBNZXNzYWdlIG0gPSBtZi5jcmVhdGUocHJvdG9jb2wpOwotCi0gICAgICAgICAgICAvLyBJbiB1c2FnZT1XUkFQUEVELCB0aGVyZSB3aWxsIGJlIGEgc2luZ2xlIGJsb2NrIGluIHRoZSBib2R5LgotICAgICAgICAgICAgLy8gVGhlIHNpZ25hdHVyZUFyZ3VtZW50cyByZXByZXNlbnQgdGhlIGNoaWxkIGVsZW1lbnRzIG9mIHRoYXQgYmxvY2sKLSAgICAgICAgICAgIC8vIFRoZSBmaXJzdCBzdGVwIGlzIHRvIGNvbnZlcnQgdGhlIHNpZ25hdHVyZSBhcmd1bWVudHMgaW50byBhIGxpc3QKLSAgICAgICAgICAgIC8vIG9mIHBhcmFtZXRlciB2YWx1ZXMKLSAgICAgICAgICAgIExpc3Q8UERFbGVtZW50PiBwZGVMaXN0ID0KLSAgICAgICAgICAgICAgICAgICAgTWV0aG9kTWFyc2hhbGxlclV0aWxzLmdldFBERWxlbWVudHMobWFyc2hhbERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlQXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsICAvLyBvdXRwdXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgZmFsc2UpOwotCi0gICAgICAgICAgICAvLyBOb3cgd2Ugd2FudCB0byBjcmVhdGUgYSBzaW5nbGUgSkFYQiBlbGVtZW50IHRoYXQgY29udGFpbnMgdGhlIAotICAgICAgICAgICAgLy8gcGFyYW1ldGVyIHZhbHVlcy4gIFdlIHdpbGwgdXNlIHRoZSB3cmFwcGVyIHRvb2wgdG8gZG8gdGhpcy4KLSAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgaW5wdXRzIHRvIHRoZSB3cmFwcGVyIHRvb2wKLSAgICAgICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IG5hbWVMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG9iamVjdExpc3QgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIENsYXNzPiBkZWNsYXJlZENsYXNzTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBDbGFzcz4oKTsKLSAgICAgICAgICAgIExpc3Q8UERFbGVtZW50PiBoZWFkZXJQREVMaXN0ID0gbmV3IEFycmF5TGlzdDxQREVsZW1lbnQ+KCk7Ci0KLSAgICAgICAgICAgIEl0ZXJhdG9yPFBERWxlbWVudD4gaXQgPSBwZGVMaXN0Lml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgUERFbGVtZW50IHBkZSA9IGl0Lm5leHQoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IHBkZS5nZXRQYXJhbSgpLmdldFBhcmFtZXRlck5hbWUoKTsKLSAgICAgICAgICAgICAgICBpZiAoIXBkZS5nZXRQYXJhbSgpLmlzSGVhZGVyKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gTm9ybWFsIGNhc2UKLSAgICAgICAgICAgICAgICAgICAgLy8gVGhlIG9iamVjdCBsaXN0IGNvbnRhaW5zIHR5cGUgcmVuZGVyZWQgb2JqZWN0cwotICAgICAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBwZGUuZ2V0RWxlbWVudCgpLmdldFR5cGVWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICBDbGFzcyBkY2xDbGFzcyA9IHBkZS5nZXRQYXJhbSgpLmdldFBhcmFtZXRlckFjdHVhbFR5cGUoKTsKLSAgICAgICAgICAgICAgICAgICAgbmFtZUxpc3QuYWRkKG5hbWUpOwotICAgICAgICAgICAgICAgICAgICBvYmplY3RMaXN0LnB1dChuYW1lLCB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGRlY2xhcmVkQ2xhc3NNYXAucHV0KG5hbWUsIGRjbENsYXNzKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBIZWFkZXIgQ2FzZToKLSAgICAgICAgICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBoZWFkZXIgZnJvbSB0aGUgbGlzdCwgaXQgd2lsbAotICAgICAgICAgICAgICAgICAgICAvLyBub3QgYmUgcGxhY2VkIGluIHRoZSB3cmFwcGVyCi0gICAgICAgICAgICAgICAgICAgIGl0LnJlbW92ZSgpOwotICAgICAgICAgICAgICAgICAgICBoZWFkZXJQREVMaXN0LmFkZChwZGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQ2xhc3MgcmV0dXJuVHlwZSA9IG9wZXJhdGlvbkRlc2MuZ2V0UmVzdWx0QWN0dWFsVHlwZSgpOwotICAgICAgICAgICAgaWYgKCFvcGVyYXRpb25EZXNjLmlzUmVzdWx0SGVhZGVyKCkpIHsKLSAgICAgICAgICAgICAgICAvLyBOb3JtYWwgKEJvZHkgUmVzdWx0KTogQWRkIHRoZSByZXR1cm4gb2JqZWN0IHRvIHRoZSBuYW1lTGlzdCBhbmQgb2JqZWN0TGlzdAotCi0gICAgICAgICAgICAgICAgaWYgKHJldHVyblR5cGUgIT0gdm9pZC5jbGFzcykgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IG9wZXJhdGlvbkRlc2MuZ2V0UmVzdWx0TmFtZSgpOwotICAgICAgICAgICAgICAgICAgICBDbGFzcyBkY2xDbGFzcyA9IG9wZXJhdGlvbkRlc2MuZ2V0UmVzdWx0QWN0dWFsVHlwZSgpOwotICAgICAgICAgICAgICAgICAgICBuYW1lTGlzdC5hZGQobmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIG9iamVjdExpc3QucHV0KG5hbWUsIHJldHVybk9iamVjdCk7Ci0gICAgICAgICAgICAgICAgICAgIGRlY2xhcmVkQ2xhc3NNYXAucHV0KG5hbWUsIGRjbENsYXNzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIEhlYWRlciBSZXN1bHQ6Ci0gICAgICAgICAgICAgICAgLy8gUHV0IHRoZSByZXR1cm4gb2JqZWN0IG9udG8gdGhlIG1lc3NhZ2UKLSAgICAgICAgICAgICAgICBpZiAocmV0dXJuVHlwZSAhPSB2b2lkLmNsYXNzKSB7Ci0gICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgcmV0dXJuRWxlbWVudCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIFFOYW1lIHJldHVyblFOYW1lID0gbmV3IFFOYW1lKG9wZXJhdGlvbkRlc2MuZ2V0UmVzdWx0VGFyZ2V0TmFtZXNwYWNlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbkRlc2MuZ2V0UmVzdWx0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1hcnNoYWxEZXNjLmdldEFubm90YXRpb25EZXNjKHJldHVyblR5cGUpLmhhc1htbFJvb3RFbGVtZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybkVsZW1lbnQgPSBuZXcgRWxlbWVudChyZXR1cm5PYmplY3QsIHJldHVyblFOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybkVsZW1lbnQgPSBuZXcgRWxlbWVudChyZXR1cm5PYmplY3QsIHJldHVyblFOYW1lLCByZXR1cm5UeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIENsYXNzIGJ5SmF2YVR5cGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGhvZE1hcnNoYWxsZXJVdGlscy5pc05vdEpBWEJSb290RWxlbWVudChyZXR1cm5UeXBlLCBtYXJzaGFsRGVzYykgPyByZXR1cm5UeXBlIDogbnVsbDsKLQotICAgICAgICAgICAgICAgICAgICBNZXRob2RNYXJzaGFsbGVyVXRpbHMudG9NZXNzYWdlKHJldHVybkVsZW1lbnQsIAotICAgICAgICAgICAgICAgICAgICAJCQkJCQkJCXJldHVyblR5cGUsCi0gICAgICAgICAgICAgICAgICAgIAkJCQkJCQkJb3BlcmF0aW9uRGVzYy5pc0xpc3RUeXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyc2hhbERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieUphdmFUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gTm93IGNyZWF0ZSB0aGUgc2luZ2xlIEpBWEIgZWxlbWVudAotICAgICAgICAgICAgU3RyaW5nIHdyYXBwZXJOYW1lID0gbWFyc2hhbERlc2MuZ2V0UmVzcG9uc2VXcmFwcGVyQ2xhc3NOYW1lKG9wZXJhdGlvbkRlc2MpOwotICAgICAgICAgICAgQ2xhc3MgY2xzOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBjbHMgPSBNZXRob2RNYXJzaGFsbGVyVXRpbHMubG9hZENsYXNzKHdyYXBwZXJOYW1lKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgICAgICAgY2xzID0gTWV0aG9kTWFyc2hhbGxlclV0aWxzLmxvYWRDbGFzcyh3cmFwcGVyTmFtZSwgZW5kcG9pbnREZXNjLmdldEF4aXNTZXJ2aWNlKCkuZ2V0Q2xhc3NMb2FkZXIoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBKQVhCV3JhcHBlclRvb2wgd3JhcHBlclRvb2wgPSBuZXcgSkFYQldyYXBwZXJUb29sSW1wbCgpOwotICAgICAgICAgICAgT2JqZWN0IG9iamVjdCA9IHdyYXBwZXJUb29sLndyYXAoY2xzLCBuYW1lTGlzdCwgb2JqZWN0TGlzdCwgZGVjbGFyZWRDbGFzc01hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcnNoYWxEZXNjLmdldFByb3BlcnR5RGVzY3JpcHRvck1hcChjbHMpKTsKLQotICAgICAgICAgICAgUU5hbWUgd3JhcHBlclFOYW1lID0gbmV3IFFOYW1lKG9wZXJhdGlvbkRlc2MuZ2V0UmVzcG9uc2VXcmFwcGVyVGFyZ2V0TmFtZXNwYWNlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uRGVzYy5nZXRSZXNwb25zZVdyYXBwZXJMb2NhbE5hbWUoKSk7Ci0KLSAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBvYmplY3QgY2FuIGJlIHJlbmRlcmVkIGFzIGFuIGVsZW1lbnQKLSAgICAgICAgICAgIGlmICghbWFyc2hhbERlc2MuZ2V0QW5ub3RhdGlvbkRlc2MoY2xzKS5oYXNYbWxSb290RWxlbWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgb2JqZWN0ID0gbmV3IEpBWEJFbGVtZW50KHdyYXBwZXJRTmFtZSwgY2xzLCBvYmplY3QpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBQdXQgdGhlIG9iamVjdCBpbnRvIHRoZSBtZXNzYWdlCi0gICAgICAgICAgICBKQVhCQmxvY2tGYWN0b3J5IGZhY3RvcnkgPQotICAgICAgICAgICAgICAgICAgICAoSkFYQkJsb2NrRmFjdG9yeSlGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShKQVhCQmxvY2tGYWN0b3J5LmNsYXNzKTsKLSAgICAgICAgICAgIEpBWEJCbG9ja0NvbnRleHQgYmxvY2tDb250ZXh0ID0gbmV3IEpBWEJCbG9ja0NvbnRleHQocGFja2FnZXMsIHBhY2thZ2VzS2V5KTsKLSAgICAgICAgICAgIGJsb2NrQ29udGV4dC5zZXRXZWJTZXJ2aWNlTmFtZXNwYWNlKGVkLmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgICAgIEJsb2NrIGJsb2NrID0gZmFjdG9yeS5jcmVhdGVGcm9tKG9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrQ29udGV4dCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVyUU5hbWUpOyAgLy8gVGhlIGZhY3Rvcnkgd2lsbCBnZXQgdGhlIHFuYW1lIGZyb20gdGhlIHZhbHVlCi0gICAgICAgICAgICBtLnNldEJvZHlCbG9jayhibG9jayk7Ci0KLSAgICAgICAgICAgIC8vICBOb3cgcGxhY2UgdGhlIGhlYWRlcnMgaW4gdGhlIG1lc3NhZ2UKLSAgICAgICAgICAgIGlmIChoZWFkZXJQREVMaXN0LnNpemUoKSA+IDApIHsKLQotICAgICAgICAgICAgICAgIC8vIFVzZSAiYnkgamF2YSB0eXBlIiBtYXJzaGFsbGluZyBpZiBuZWNlc3NhcnkKLSAgICAgICAgICAgICAgICBmb3IgKFBERWxlbWVudCBwZGUgOiBoZWFkZXJQREVMaXN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIENsYXNzIGFjdHVhbFR5cGUgPSBwZGUuZ2V0UGFyYW0oKS5nZXRQYXJhbWV0ZXJBY3R1YWxUeXBlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChNZXRob2RNYXJzaGFsbGVyVXRpbHMuaXNOb3RKQVhCUm9vdEVsZW1lbnQoYWN0dWFsVHlwZSwgbWFyc2hhbERlc2MpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwZGUuc2V0QnlKYXZhVHlwZUNsYXNzKGFjdHVhbFR5cGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIE1ldGhvZE1hcnNoYWxsZXJVdGlscy50b01lc3NhZ2UoaGVhZGVyUERFTGlzdCwgbSwgcGFja2FnZXMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBFbmFibGUgU1dBIGZvciBuZXN0ZWQgU3dhUmVmIGF0dGFjaG1lbnRzCi0gICAgICAgICAgICBpZiAob3BlcmF0aW9uRGVzYy5oYXNSZXNwb25zZVN3YVJlZkF0dGFjaG1lbnRzKCkpIHsKLSAgICAgICAgICAgICAgICBtLnNldERvaW5nU1dBKHRydWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gbTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgTWVzc2FnZSBtYXJzaGFsUmVxdWVzdChPYmplY3RbXSBzaWduYXR1cmVBcmd1bWVudHMsIE9wZXJhdGlvbkRlc2NyaXB0aW9uIG9wZXJhdGlvbkRlc2MpCi0gICAgICAgICAgICB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJDYWxsaW5nIERvY0xpdFdyYXBwZXJQbHVzTWV0aG9kTWFyc2hhbGxlci5tYXJzaGFsUmVxdWVzdCIpOwotICAgICAgICAgICAgbG9nLmRlYnVnKAotICAgICAgICAgICAgICAgICAgICAiICBUaGUgRG9jTGl0V3JhcHBlZCBQbHVzIG1hcnNoYWxsZXIgaXMgdXNlZCB3aGVuIHRoZSB3ZWIgc2VydmljZSBtZXRob2QgZGV2aWF0ZXMgZnJvbSB0aGUgbm9ybWFsIGRvYy9saXQgcnVsZXMuIik7Ci0gICAgICAgIH0KLSAgICAgICAgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiBlZCA9IG9wZXJhdGlvbkRlc2MuZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbigpOwotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVuZHBvaW50RGVzYyA9IGVkLmdldEVuZHBvaW50RGVzY3JpcHRpb24oKTsKLSAgICAgICAgUHJvdG9jb2wgcHJvdG9jb2wgPSBQcm90b2NvbC5nZXRQcm90b2NvbEZvckJpbmRpbmcoZW5kcG9pbnREZXNjLmdldENsaWVudEJpbmRpbmdJRCgpKTsKLSAgICAgICAgTWFyc2hhbFNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb24gbWFyc2hhbERlc2MgPQotICAgICAgICAgICAgICAgIE1ldGhvZE1hcnNoYWxsZXJVdGlscy5nZXRNYXJzaGFsRGVzYyhlbmRwb2ludERlc2MpOwotICAgICAgICBUcmVlU2V0PFN0cmluZz4gcGFja2FnZXMgPSBtYXJzaGFsRGVzYy5nZXRQYWNrYWdlcygpOwotICAgICAgICBTdHJpbmcgcGFja2FnZXNLZXkgPSBtYXJzaGFsRGVzYy5nZXRQYWNrYWdlc0tleSgpOwotCi0gICAgICAgIC8vIE5vdGUgYWxsIGV4Y2VwdGlvbnMgYXJlIGNhdWdodCBhbmQgcmV0aHJvd24gd2l0aCBhIFdlYlNlcnZpY2VFeGNlcHRpb24KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIFNhbXBsZSBEb2N1bWVudCBtZXNzYWdlCi0gICAgICAgICAgICAvLyAuLgotICAgICAgICAgICAgLy8gPHNvYXBlbnY6Ym9keT4KLSAgICAgICAgICAgIC8vICAgIDxtOm9wZXJhdGlvbj4KLSAgICAgICAgICAgIC8vICAgICAgPHBhcmFtPmhlbGxvPC9wYXJhbT4KLSAgICAgICAgICAgIC8vICAgIDwvbTpvcGVyYXRpb24+Ci0gICAgICAgICAgICAvLyA8L3NvYXBlbnY6Ym9keT4KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBJbXBvcnRhbnQgcG9pbnRzLgotICAgICAgICAgICAgLy8gICAxKSBUaGVyZSBpcyBubyBvcGVyYXRpb24gZWxlbWVudCB1bmRlciB0aGUgYm9keS4KLSAgICAgICAgICAgIC8vICAgMikgVGhlIGRhdGEgYmxvY2tzIGFyZSBsb2NhdGVkIHVuZGVybmVhdGggdGhlIGJvZHkuICAKLSAgICAgICAgICAgIC8vICAgMykgVGhlIG5hbWUgb2YgdGhlIGRhdGEgYmxvY2sgKG06b3BlcmF0aW9uKSBpcyBkZWZpbmVkIGJ5IHRoZSBzY2hlbWEgYW5kIG1hdGNoIHRoZSBuYW1lIG9mIHRoZSBvcGVyYXRpb24uCi0gICAgICAgICAgICAvLyAgICAgIFRoaXMgaXMgY2FsbGVkIHRoZSB3cmFwcGVyIGVsZW1lbnQuICBUaGUgd3JhcHBlciBlbGVtZW50IGhhcyBhIGNvcnJlc3BvbmRpbmcgSkFYQiBlbGVtZW50IHBvam8uCi0gICAgICAgICAgICAvLyAgIDQpIFRoZSBwYXJhbWV0ZXJzIChtOnBhcmFtKSBhcmUgY2hpbGQgZWxlbWVudHMgb2YgdGhlIHdyYXBwZXIgZWxlbWVudC4KLQotICAgICAgICAgICAgLy8gR2V0IHRoZSBvcGVyYXRpb24gaW5mb3JtYXRpb24KLSAgICAgICAgICAgIFBhcmFtZXRlckRlc2NyaXB0aW9uW10gcGRzID0gb3BlcmF0aW9uRGVzYy5nZXRQYXJhbWV0ZXJEZXNjcmlwdGlvbnMoKTsKLQotICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBtZXNzYWdlIAotICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkgbWYgPSAoTWVzc2FnZUZhY3RvcnkpRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoTWVzc2FnZUZhY3RvcnkuY2xhc3MpOwotICAgICAgICAgICAgTWVzc2FnZSBtID0gbWYuY3JlYXRlKHByb3RvY29sKTsKLQotICAgICAgICAgICAgLy8gSW4gdXNhZ2U9V1JBUFBFRCwgdGhlcmUgd2lsbCBiZSBhIHNpbmdsZSBibG9jayBpbiB0aGUgYm9keS4KLSAgICAgICAgICAgIC8vIFRoZSBzaWduYXR1cmVBcmd1bWVudHMgcmVwcmVzZW50IHRoZSBjaGlsZCBlbGVtZW50cyBvZiB0aGF0IGJsb2NrCi0gICAgICAgICAgICAvLyBUaGUgZmlyc3Qgc3RlcCBpcyB0byBjb252ZXJ0IHRoZSBzaWduYXR1cmUgYXJndW1lbnRzIGludG8gbGlzdAotICAgICAgICAgICAgLy8gb2YgcGFyYW1ldGVyIHZhbHVlcwotICAgICAgICAgICAgTGlzdDxQREVsZW1lbnQ+IHBkZUxpc3QgPSBNZXRob2RNYXJzaGFsbGVyVXRpbHMuZ2V0UERFbGVtZW50cyhtYXJzaGFsRGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduYXR1cmVBcmd1bWVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsICAgLy8gaW5wdXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgZmFsc2UpOwotCi0gICAgICAgICAgICAvLyBOb3cgd2Ugd2FudCB0byBjcmVhdGUgYSBzaW5nbGUgSkFYQiBlbGVtZW50IHRoYXQgY29udGFpbnMgdGhlIAotICAgICAgICAgICAgLy8gUGFyYW1ldGVyVmFsdWVzLiAgV2Ugd2lsbCB1c2UgdGhlIHdyYXBwZXIgdG9vbCB0byBkbyB0aGlzLgotICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBpbnB1dHMgdG8gdGhlIHdyYXBwZXIgdG9vbAotICAgICAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gbmFtZUxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gb2JqZWN0TGlzdCA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotICAgICAgICAgICAgTWFwPFN0cmluZywgQ2xhc3M+IGRlY2xhcmRDbGFzc01hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgQ2xhc3M+KCk7Ci0gICAgICAgICAgICBMaXN0PFBERWxlbWVudD4gaGVhZGVyUERFTGlzdCA9IG5ldyBBcnJheUxpc3Q8UERFbGVtZW50PigpOwotCi0gICAgICAgICAgICBJdGVyYXRvcjxQREVsZW1lbnQ+IGl0ID0gcGRlTGlzdC5pdGVyYXRvcigpOwotICAgICAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIFBERWxlbWVudCBwZGUgPSBpdC5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBwZGUuZ2V0UGFyYW0oKS5nZXRQYXJhbWV0ZXJOYW1lKCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFwZGUuZ2V0UGFyYW0oKS5pc0hlYWRlcigpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIE5vcm1hbCBjYXNlOgotICAgICAgICAgICAgICAgICAgICAvLyBUaGUgb2JqZWN0IGxpc3QgY29udGFpbnMgdHlwZSByZW5kZXJlZCBvYmplY3RzCi0gICAgICAgICAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IHBkZS5nZXRFbGVtZW50KCkuZ2V0VHlwZVZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgIENsYXNzIGRjbENsYXNzID0gcGRlLmdldFBhcmFtKCkuZ2V0UGFyYW1ldGVyQWN0dWFsVHlwZSgpOwotICAgICAgICAgICAgICAgICAgICBuYW1lTGlzdC5hZGQobmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIG9iamVjdExpc3QucHV0KG5hbWUsIHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgZGVjbGFyZENsYXNzTWFwLnB1dChuYW1lLCBkY2xDbGFzcyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSGVhZGVyIENhc2U6Ci0gICAgICAgICAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgaGVhZGVyIGZyb20gdGhlIGxpc3QsIGl0IHdpbGwKLSAgICAgICAgICAgICAgICAgICAgLy8gbm90IGJlIHBsYWNlZCBpbiB0aGUgd3JhcHBlcgotICAgICAgICAgICAgICAgICAgICBpdC5yZW1vdmUoKTsKLSAgICAgICAgICAgICAgICAgICAgaGVhZGVyUERFTGlzdC5hZGQocGRlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIE5vdyBjcmVhdGUgdGhlIHNpbmdsZSBKQVhCIGVsZW1lbnQgCi0gICAgICAgICAgICBTdHJpbmcgd3JhcHBlck5hbWUgPSBtYXJzaGFsRGVzYy5nZXRSZXF1ZXN0V3JhcHBlckNsYXNzTmFtZShvcGVyYXRpb25EZXNjKTsKLSAgICAgICAgICAgIENsYXNzIGNsczsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgY2xzID0gTWV0aG9kTWFyc2hhbGxlclV0aWxzLmxvYWRDbGFzcyh3cmFwcGVyTmFtZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpewotICAgICAgICAgICAgICAgIGNscyA9IE1ldGhvZE1hcnNoYWxsZXJVdGlscy5sb2FkQ2xhc3Mod3JhcHBlck5hbWUsIGVuZHBvaW50RGVzYy5nZXRBeGlzU2VydmljZSgpLmdldENsYXNzTG9hZGVyKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgSkFYQldyYXBwZXJUb29sIHdyYXBwZXJUb29sID0gbmV3IEpBWEJXcmFwcGVyVG9vbEltcGwoKTsKLSAgICAgICAgICAgIE9iamVjdCBvYmplY3QgPSB3cmFwcGVyVG9vbC53cmFwKGNscywgbmFtZUxpc3QsIG9iamVjdExpc3QsIGRlY2xhcmRDbGFzc01hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcnNoYWxEZXNjLmdldFByb3BlcnR5RGVzY3JpcHRvck1hcChjbHMpKTsKLQotICAgICAgICAgICAgUU5hbWUgd3JhcHBlclFOYW1lID0gbmV3IFFOYW1lKG9wZXJhdGlvbkRlc2MuZ2V0UmVxdWVzdFdyYXBwZXJUYXJnZXROYW1lc3BhY2UoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25EZXNjLmdldFJlcXVlc3RXcmFwcGVyTG9jYWxOYW1lKCkpOwotCi0gICAgICAgICAgICAvLyBNYWtlIHN1cmUgb2JqZWN0IGNhbiBiZSByZW5kZXJlZCBhcyBhbiBlbGVtZW50Ci0gICAgICAgICAgICBpZiAoIW1hcnNoYWxEZXNjLmdldEFubm90YXRpb25EZXNjKGNscykuaGFzWG1sUm9vdEVsZW1lbnQoKSkgewotICAgICAgICAgICAgICAgIG9iamVjdCA9IG5ldyBKQVhCRWxlbWVudCh3cmFwcGVyUU5hbWUsIGNscywgb2JqZWN0KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gUHV0IHRoZSBvYmplY3QgaW50byB0aGUgbWVzc2FnZQotICAgICAgICAgICAgSkFYQkJsb2NrRmFjdG9yeSBmYWN0b3J5ID0KLSAgICAgICAgICAgICAgICAgICAgKEpBWEJCbG9ja0ZhY3RvcnkpRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoSkFYQkJsb2NrRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgICAgICBKQVhCQmxvY2tDb250ZXh0IGJsb2NrQ29udGV4dCA9IG5ldyBKQVhCQmxvY2tDb250ZXh0KHBhY2thZ2VzLCBwYWNrYWdlc0tleSk7Ci0gICAgICAgICAgICBibG9ja0NvbnRleHQuc2V0V2ViU2VydmljZU5hbWVzcGFjZShlZC5nZXRUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgICAgICBCbG9jayBibG9jayA9IGZhY3RvcnkuY3JlYXRlRnJvbShvYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja0NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVyUU5hbWUpOyAgLy8gVGhlIGZhY3Rvcnkgd2lsbCBnZXQgdGhlIHFuYW1lIGZyb20gdGhlIHZhbHVlCi0gICAgICAgICAgICBtLnNldEJvZHlCbG9jayhibG9jayk7Ci0KLSAgICAgICAgICAgIC8vIE5vdyBwbGFjZSB0aGUgaGVhZGVycyBpbiB0aGUgbWVzc2FnZQotICAgICAgICAgICAgaWYgKGhlYWRlclBERUxpc3Quc2l6ZSgpID4gMCkgewotCi0gICAgICAgICAgICAgICAgLy8gVXNlICJieSBqYXZhIHR5cGUiIG1hcnNoYWxsaW5nIGlmIG5lY2Vzc2FyeQotICAgICAgICAgICAgICAgIGZvciAoUERFbGVtZW50IHBkZSA6IGhlYWRlclBERUxpc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgQ2xhc3MgYWN0dWFsVHlwZSA9IHBkZS5nZXRQYXJhbSgpLmdldFBhcmFtZXRlckFjdHVhbFR5cGUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKE1ldGhvZE1hcnNoYWxsZXJVdGlscy5pc05vdEpBWEJSb290RWxlbWVudChhY3R1YWxUeXBlLCBtYXJzaGFsRGVzYykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBkZS5zZXRCeUphdmFUeXBlQ2xhc3MoYWN0dWFsVHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBNZXRob2RNYXJzaGFsbGVyVXRpbHMudG9NZXNzYWdlKGhlYWRlclBERUxpc3QsIG0sIHBhY2thZ2VzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gRW5hYmxlIFNXQSBmb3IgbmVzdGVkIFN3YVJlZiBhdHRhY2htZW50cwotICAgICAgICAgICAgaWYgKG9wZXJhdGlvbkRlc2MuaGFzUmVxdWVzdFN3YVJlZkF0dGFjaG1lbnRzKCkpIHsKLSAgICAgICAgICAgICAgICBtLnNldERvaW5nU1dBKHRydWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gbTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgTWVzc2FnZSBtYXJzaGFsRmF1bHRSZXNwb25zZShUaHJvd2FibGUgdGhyb3dhYmxlLCBPcGVyYXRpb25EZXNjcmlwdGlvbiBvcGVyYXRpb25EZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3RvY29sIHByb3RvY29sKSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJDYWxsaW5nIERvY0xpdFdyYXBwZXJQbHVzTWV0aG9kTWFyc2hhbGxlci5tYXJzaGFsRmF1bHRSZXNwb25zZSIpOwotICAgICAgICAgICAgbG9nLmRlYnVnKAotICAgICAgICAgICAgICAgICAgICAiICBUaGUgRG9jTGl0V3JhcHBlZCBQbHVzIG1hcnNoYWxsZXIgaXMgdXNlZCB3aGVuIHRoZSB3ZWIgc2VydmljZSBtZXRob2QgZGV2aWF0ZXMgZnJvbSB0aGUgbm9ybWFsIGRvYy9saXQgcnVsZXMuIik7Ci0gICAgICAgIH0KLSAgICAgICAgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiBlZCA9IG9wZXJhdGlvbkRlc2MuZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbigpOwotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVuZHBvaW50RGVzYyA9IGVkLmdldEVuZHBvaW50RGVzY3JpcHRpb24oKTsKLSAgICAgICAgTWFyc2hhbFNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb24gbWFyc2hhbERlc2MgPQotICAgICAgICAgICAgICAgIE1ldGhvZE1hcnNoYWxsZXJVdGlscy5nZXRNYXJzaGFsRGVzYyhlbmRwb2ludERlc2MpOwotICAgICAgICBUcmVlU2V0PFN0cmluZz4gcGFja2FnZXMgPSBtYXJzaGFsRGVzYy5nZXRQYWNrYWdlcygpOwotCi0gICAgICAgIC8vIFdlIHdhbnQgdG8gcmVzcG9uZCB3aXRoIHRoZSBzYW1lIHByb3RvY29sIGFzIHRoZSByZXF1ZXN0LAotICAgICAgICAvLyBJdCB0aGUgcHJvdG9jb2wgaXMgbnVsbCwgdGhlbiB1c2UgdGhlIFByb3RvY29sIGRlZmluZWQgYnkgdGhlIGJpbmRpbmcKLSAgICAgICAgaWYgKHByb3RvY29sID09IG51bGwpIHsKLSAgICAgICAgICAgIHByb3RvY29sID0gUHJvdG9jb2wuZ2V0UHJvdG9jb2xGb3JCaW5kaW5nKGVuZHBvaW50RGVzYy5nZXRCaW5kaW5nVHlwZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIE5vdGUgYWxsIGV4Y2VwdGlvbnMgYXJlIGNhdWdodCBhbmQgcmV0aHJvd24gd2l0aCBhIFdlYlNlcnZpY2VFeGNlcHRpb24KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgbWVzc2FnZSAKLSAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5IG1mID0gKE1lc3NhZ2VGYWN0b3J5KUZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KE1lc3NhZ2VGYWN0b3J5LmNsYXNzKTsKLSAgICAgICAgICAgIE1lc3NhZ2UgbSA9IG1mLmNyZWF0ZShwcm90b2NvbCk7Ci0KLSAgICAgICAgICAgIC8vIFB1dCB0aGUgZmF1bHQgb250byB0aGUgbWVzc2FnZQotICAgICAgICAgICAgTWV0aG9kTWFyc2hhbGxlclV0aWxzLm1hcnNoYWxGYXVsdFJlc3BvbnNlKHRocm93YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJzaGFsRGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25EZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0pOwotICAgICAgICAgICAgcmV0dXJuIG07Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFRocm93YWJsZSBkZW1hcnNoYWxGYXVsdFJlc3BvbnNlKE1lc3NhZ2UgbWVzc2FnZSwgT3BlcmF0aW9uRGVzY3JpcHRpb24gb3BlcmF0aW9uRGVzYykKLSAgICAgICAgICAgIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIkNhbGxpbmcgRG9jTGl0V3JhcHBlclBsdXNNZXRob2RNYXJzaGFsbGVyLmRlbWFyc2hhbEZhdWx0UmVzcG9uc2UiKTsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygKLSAgICAgICAgICAgICAgICAgICAgIiAgVGhlIERvY0xpdFdyYXBwZWQgUGx1cyBtYXJzaGFsbGVyIGlzIHVzZWQgd2hlbiB0aGUgd2ViIHNlcnZpY2UgbWV0aG9kIGRldmlhdGVzIGZyb20gdGhlIG5vcm1hbCBkb2MvbGl0IHJ1bGVzLiIpOwotICAgICAgICB9Ci0gICAgICAgIEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24gZWQgPSBvcGVyYXRpb25EZXNjLmdldEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24oKTsKLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlbmRwb2ludERlc2MgPSBlZC5nZXRFbmRwb2ludERlc2NyaXB0aW9uKCk7Ci0gICAgICAgIE1hcnNoYWxTZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uIG1hcnNoYWxEZXNjID0KLSAgICAgICAgICAgICAgICBNZXRob2RNYXJzaGFsbGVyVXRpbHMuZ2V0TWFyc2hhbERlc2MoZW5kcG9pbnREZXNjKTsKLQotICAgICAgICAvLyBOb3RlIGFsbCBleGNlcHRpb25zIGFyZSBjYXVnaHQgYW5kIHJldGhyb3duIHdpdGggYSBXZWJTZXJ2aWNlRXhjZXB0aW9uCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBUaHJvd2FibGUgdCA9IE1ldGhvZE1hcnNoYWxsZXJVdGlscy5kZW1hcnNoYWxGYXVsdFJlc3BvbnNlKG9wZXJhdGlvbkRlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcnNoYWxEZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlKTsKLSAgICAgICAgICAgIHJldHVybiB0OwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWFyc2hhbGxlci9pbXBsL2FsdC9FbGVtZW50LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tYXJzaGFsbGVyL2ltcGwvYWx0L0VsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzBkNGQ1OS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tYXJzaGFsbGVyL2ltcGwvYWx0L0VsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWFyc2hhbGxlci5pbXBsLmFsdDsKLQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJFbGVtZW50OwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLS8qKgotICogQ2hhcmFjdGVyaXN0aWNzIG9mIHRoZSAiRWxlbWVudCIgdmFsdWUuIAotICogVGhlIEVsZW1lbnQgdmFsdWUgaXMgcmVhZHkgZm9yIG1hcnNoYWxsaW5nIG9yIGlzIHRoZQotICogcmVzdWx0IG9mIHVubWFyc2hhbGxpbmcuIAotICogVGhlIEVsZW1lbnQgdmFsdWUgcmVwcmVzZW50cyB0aGUgZWxlbWVudCByZW5kZXJpbmcuICBUaHVzIGl0IGlzIGVpdGhlcgotICogYSBKQVhCRWxlbWVudCBvciBoYXMgdGhlIEBYbWxSb290RWxlbWVudCBhbm5vdGF0aW9uLiAgKGkuZS4gaXQgaXMgbmV2ZXIgYSBqYXZhLmxhbmcuU3RyaW5nKSAKLSAqIFRoZSBFbGVtZW50IHZhbHVlIGlzIG5vdCBhIEpBWC1XUyBvYmplY3QuIChpLmUuIGl0IGlzIG5vdCBhIGhvbGRlciBvciBleGNlcHRpb24pIAotICogQ2hhcmFjdGVyaXN0aWNzIG9mIHRoZSAiVHlwZSIgdmFsdWUgCi0gKiBJdCBpcyB0aGUgdHlwZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGVsZW1lbnQgdmFsdWUuICAoVGh1cyBpdCBpcyBlaXRoZXIKLSAqIHRoZSBlbGVtZW50IHZhbHVlIG9yIGl0IGlzIHZhbHVlIG9mIHRoZSBKQVhCRWxlbWVudCAKLSAqIFRoZSB0eXBlIHZhbHVlIGlzIHVzdWFsbHkgdGhlIG9iamVjdCBuZWVkZWQKLSAqIGZvciB0aGUgbWV0aG9kIHNpZ25hdHVyZSAoaS5lLiBTdHJpbmcpCi0gKiA8cC8+Ci0gKiBIZXJlIGlzIGFuIGV4YW1wbGUgZm9yIGlsbHVzdHJhdGlvbjogPGVsZW1lbnQgbmFtZT0nZTEnPiA8Y29tcGxleFR5cGU+Li4uPC9jb21wbGV4VHlwZT4KLSAqIDwvZWxlbWVudD4KLSAqIDxwLz4KLSAqIDxlbGVtZW50IG5hbWU9J2UyJyB0eXBlPSd0MicgLz4gPGNvbXBsZXhUeXBlIG5hbWU9ICd0Mic+Li4KLSAqIDxwLz4KLSAqIDxlbGVtZW50IG5hbWU9J2UzJyB0eXBlPSdlMycgLz4gIDwhLS0gbm90ZSBlbGVtZW50IGFuZCB0eXBlIGhhdmUgc2FtZSBuYW1lIC0tPiA8Y29tcGxleFR5cGUgbmFtZT0KLSAqICdlMyc+Li4KLSAqIDxwLz4KLSAqIEpBWEIgd2lsbCBnZW5lcmF0ZSB0aGUgZm9sbG93aW5nIG9iamVjdHM6ICBFMSwgVDIsIEUzIEUxIHdpbGwgaGF2ZSBhbiBAWE1MUm9vdEVsZW1lbnQgYW5ub3RhdGlvbi4KLSAqICBJdCBpcyAiZWxlbWVudCIgYW5kICJ0eXBlIiBlbmFibGVkLiBlMiBkb2VzIG5vdCBoYXZlIGEgZ2VuZXJhdGVkIG9iamVjdC4gIFNvIGl0IHdpbGwgYmUKLSAqIHJlcHJlc2VudGVkIGFzIGEgSkFYQkVsZW1lbnQgdGhhdCBjb250YWlucyBhbiBvYmplY3QgVDIuICBUaGUgSkFYQkVsZW1lbnQgaXMgImVsZW1lbnQiIGVuYWJsZWQuCi0gKiBUMiByZXByZXNlbnRzIGEgY29tcGxleFR5cGUuICBJdCBpcyBvbmx5ICJ0eXBlIiBlbmFibGVkLiBFMyByZXByZXNlbnRzIHRoZSBlMyBjb21wbGV4VHlwZSAoaXQKLSAqIGRvZXMgbm90IHJlcHJlc2VudCB0aGUgZTMgZWxlbWVudCkuICBUaHVzIEUzIGlzICJ0eXBlIGVuYWJsZWQiLgotICogPHAvPgotICogV2hlbiBKQVhCIHVubWFyc2hhbHMgYW4gb2JqZWN0LCBpdCB3aWxsIHJldHVybiBhbiAiZWxlbWVudCIgZW5hYmxlZCBvYmplY3QgKGVpdGhlciBhIGdlbmVyYXRhdGVkCi0gKiBvYmplY3Qgd2l0aCBAWE1MUm9vdEVsZW1lbnQgb3IgYSBKQVhCRWxlbWVudCkuIENvbnZlcnNlbHksIHlvdSBtdXN0IGFsd2F5cyBtYXJzaGFsICJlbGVtZW50IgotICogZW5hYmxlZCBvYmplY3RzLgotICoKLSAqIEBzZWUgUERFbGVtZW50Ci0gKiAgICAgIDxwLz4KLSAqICAgICAgQXQgdGhlIHNpZ25hdHVyZSBsZXZlbCwgdGhlIHZhbHVlcyBwYXNzZWQgYXMgYXJndW1lbnRzIGluIGFuIFNFSSBvcGVyYXRpb24gcmVwcmVzZW50IHR5cGUKLSAqICAgICAgZW5hYmxlZCBvYmplY3RzLiAgRWFjaCBvZiB0aGUgb2JqZWN0IG11c3QgYmUgY29udmVydGVkIHRvIGFuIGVsZW1lbnQgZW5hYmxlZCBvYmplY3QgdG8KLSAqICAgICAgbWFyc2hhbCAob3IgY29udmVyc2VseSBjb252ZXJ0ZWQgdG8gYSB0eXBlIGVuYWJsZWQgb2JqZWN0IHdoZW4gdW5tYXJzaGFsbGluZykKLSAqLwotcHVibGljIGNsYXNzIEVsZW1lbnQgewotCi0gICAgcHJpdmF0ZSBRTmFtZSBxTmFtZTsKLSAgICBwcml2YXRlIE9iamVjdCBlbGVtZW50VmFsdWU7Ci0gICAgcHJpdmF0ZSBPYmplY3QgdHlwZVZhbHVlOwotICAgIHByaXZhdGUgQ2xhc3MgdHlwZUNsYXNzOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIEVsZW1lbnQgZnJvbSBhbgotICAgICAqCi0gICAgICogQHBhcmFtIGVsZW1lbnRWYWx1ZSBtdXN0IGJlIEpBWEJFbGVtZW50IG9yIEBYbWxSb290RWxlbWVudCByZW5kZXJlZAotICAgICAqIEBwYXJhbSBxTmFtZSAgICAgICAgYXNzb2NpYXRlZCBRTmFtZQotICAgICAqLwotICAgIHB1YmxpYyBFbGVtZW50KE9iamVjdCBlbGVtZW50VmFsdWUsIFFOYW1lIHFOYW1lKSB7Ci0gICAgICAgIGlmIChlbGVtZW50VmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgdGhpcy5xTmFtZSA9IHFOYW1lOwotICAgICAgICAgICAgdGhpcy5lbGVtZW50VmFsdWUgPSBlbGVtZW50VmFsdWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aGlzLnFOYW1lID0gcU5hbWU7Ci0gICAgICAgICAgICB0aGlzLnR5cGVWYWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICB0aGlzLnR5cGVDbGFzcyA9IE9iamVjdC5jbGFzczsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSB0eXBlVmFsdWUgbXVzdCBub3QgYmUgYSBKQVhCRWxlbWVudC4gIE11c3Qgbm90IGhhdmUgQFhtbFJvb3RFbGVtZW50IHJlbmRlcmluZy4KLSAgICAgKiAgICAgICAgICAgICAgICAgIHR5cGVWYWx1ZSBtdXN0IG5vdCBiZSBhIEhvbGRlciBvciBvdGhlciBKQVhXUyBhcGkgdmFsdWUuCi0gICAgICogQHBhcmFtIHFOYW1lICAgICBhc3NvY2lhdGVkIFFOYW1lCi0gICAgICogQHBhcmFtIGNscwotICAgICAqLwotICAgIHB1YmxpYyBFbGVtZW50KE9iamVjdCB0eXBlVmFsdWUsIFFOYW1lIHFOYW1lLCBDbGFzcyBjbHMpIHsKLSAgICAgICAgdGhpcy5xTmFtZSA9IHFOYW1lOwotICAgICAgICB0aGlzLnR5cGVWYWx1ZSA9IHR5cGVWYWx1ZTsKLSAgICAgICAgdGhpcy50eXBlQ2xhc3MgPSBjbHM7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldEVsZW1lbnRWYWx1ZSgpIHsKLSAgICAgICAgaWYgKGVsZW1lbnRWYWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBDcmVhdGUgRWxlbWVudFZhbHVlIGZyb20gdHlwZSBpbmZvcm1hdGlvbgotICAgICAgICAgICAgZWxlbWVudFZhbHVlID0gbmV3IEpBWEJFbGVtZW50KHFOYW1lLCB0eXBlQ2xhc3MsIHR5cGVWYWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVsZW1lbnRWYWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldFR5cGVWYWx1ZSgpIHsKLSAgICAgICAgaWYgKGVsZW1lbnRWYWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoZWxlbWVudFZhbHVlLmdldENsYXNzKCkgPT0gSkFYQkVsZW1lbnQuY2xhc3MpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKChKQVhCRWxlbWVudCllbGVtZW50VmFsdWUpLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50VmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gdHlwZVZhbHVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFFOYW1lIGdldFFOYW1lKCkgewotICAgICAgICByZXR1cm4gcU5hbWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWFyc2hhbGxlci9pbXBsL2FsdC9MZWdhY3lFeGNlcHRpb25VdGlsLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tYXJzaGFsbGVyL2ltcGwvYWx0L0xlZ2FjeUV4Y2VwdGlvblV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZlOWUwMC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tYXJzaGFsbGVyL2ltcGwvYWx0L0xlZ2FjeUV4Y2VwdGlvblV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWFyc2hhbGxlci5pbXBsLmFsdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuRXhjZXB0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkZhdWx0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5pMThuLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MucnVudGltZS5kZXNjcmlwdGlvbi5tYXJzaGFsLkZhdWx0QmVhbkRlc2M7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5ydW50aW1lLmRlc2NyaXB0aW9uLm1hcnNoYWwuTWFyc2hhbFNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51dGlsaXR5LlByb3BlcnR5RGVzY3JpcHRvclBsdXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy53cmFwcGVyLkpBWEJXcmFwcGVyVG9vbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLndyYXBwZXIuaW1wbC5KQVhCV3JhcHBlclRvb2xJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5iZWFucy5JbnRyb3NwZWN0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogVGhlIEpBWC1XUyBTcGVjaWZpY2F0aW9uIChjaGFwdGVyIDMuNykgaW5kaWNhdGVzIHRoYXQgSkFYLVdTCi0gKiBzdXBwb3J0cyBleGNlcHRpb25zIHRoYXQgZG8gbm90IG1hdGNoIHRoZSBub3JtYWwgcGF0dGVybiAodGhlIG5vcm1hbAotICogcGF0dGVybiBpcyBkZWZpbmVkIGluIGNoYXB0ZXIgMi41LiAgCi0gKiAKLSAqIFRoZXNlIG5vbi1tYXRjaGluZyBleGNlcHRpb25zIGFyZSB0aGUgcmVzdWx0IG9mIHJ1bm5pbmcgV1NHZW4KLSAqIG9uIGEgcHJlLWV4aXN0aW5nIHdlYnNlcnZpY2UuICBJIGFtIGdvaW5nIHRvIHVzZSB0aGUgdGVybSwgbGVnYWN5IGV4Y2VwdGlvbiwKLSAqIHRvIGRlc2NyaWJlIHRoZXNlIG5vbi1tYXRjaGluZyBleGNlcHRpb25zLgotICogCi0gKiBUaGUgSkFYLVdTIG1hcnNoYWxsZXIgKHNlcnZlcikgbXVzdCBtYXJzaGFsIGEgbGVnYWN5IGV4Y2VwdGlvbiB0aHJvd24gZnJvbQotICogdGhlIHdlYiBzZXJ2aWNlIGltcGwuICBUaGUgbWFyc2hhbGxpbmcvbWFwcGluZyBhbGdvcml0aG0gaXMgZGVmaW5lZCBpbiBjaGFwdGVyIDMuNy4KLSAqIAotICogT24gdGhlIGNsaWVudCwgdGhlIEpBWC1XUyBlbmdpbmUgd2lsbCBuZWVkIHRvIGRlbWFyc2hhbCBleGNlcHRpb25zLiAgSG93ZXZlcgotICogdGhlIHNwZWNpZmljYXRpb24gYXNzdW1lcyB0aGF0IHRoZSBjbGllbnQgaXMgYWx3YXlzIGNyZWF0ZWQgdmlhIHdzaW1wb3J0OyB0aGVyZWZvcmUKLSAqIHRoZSBhc3N1bXB0aW9uIGlzIHRoYXQgYWxsIGV4Y2VwdGlvbnMgb24gdGhlIGNsaWVudCBhcmUgY29tcGxpYW50IChuZXZlciBsZWdhY3kgZXhjZXB0aW9ucykuCi0gKiBJIGhhdmUgaW5jbHVkZWQgc29tZSBjb2RlIGhlcmUgaW4gY2FzZSB3ZSBoYXZlIHRvIGRlYWwgd2l0aCBsZWdhY3kgZXhjZXB0aW9ucyBvbiB0aGUgY2xpZW50Li4udGhpcyBpcyBub24tc3BlYy4KLSAqIAotICoKLSAqLwotCi1jbGFzcyBMZWdhY3lFeGNlcHRpb25VdGlsIHsKLQotICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhMZWdhY3lFeGNlcHRpb25VdGlsLmNsYXNzKTsKLQotICAgIHByaXZhdGUgc3RhdGljIFNldDxTdHJpbmc+IGlnbm9yZSA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQotICAgIHN0YXRpYyB7Ci0gICAgICAgIC8vIFBlciBDaGFwIDMuNyBydWxlIDMsIGlnbm9yZSB0aGVzZSBwcm9wZXJ0aWVzIG9uIHRoZSBleGNlcHRpb24KLSAgICAgICAgaWdub3JlLmFkZCgibG9jYWxpemVkTWVzc2FnZSIpOwotICAgICAgICBpZ25vcmUuYWRkKCJzdGFja1RyYWNlIik7Ci0gICAgICAgIGlnbm9yZS5hZGQoImNsYXNzIik7Ci0gICAgICAgIGlnbm9yZS5hZGQoImNhdXNlIik7Ci0gICAgfQotCi0gICAgLyoqIFN0YXRpYyBjbGFzcy4gIENvbnN0cnVjdG9yIGlzIGludGVudGlvbmFsbHkgcHJpdmF0ZSAqLwotICAgIHByaXZhdGUgTGVnYWN5RXhjZXB0aW9uVXRpbCgpIHsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIEZhdWx0QmVhbiBwb3B1bGF0ZWQgd2l0aCB0aGUgZGF0YSBmcm9tIHRoZSBFeGNlcHRpb24gdCBUaGUgYWxnb3JpdGhtIHVzZWQgdG8KLSAgICAgKiBwb3B1bGF0ZSB0aGUgRmF1bHRCZWFuIGlzIGRlc2NyaWJlZCBpbiBKQVgtV1MgMy43Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gdAotICAgICAqIEBwYXJhbSBmZAotICAgICAqIEBwYXJhbSBtYXJzaGFsRGVzYwotICAgICAqIEByZXR1cm4gZmF1bHRCZWFuCi0gICAgICovCi0gICAgc3RhdGljIE9iamVjdCBjcmVhdGVGYXVsdEJlYW4oVGhyb3dhYmxlIHQsIEZhdWx0RGVzY3JpcHRpb24gZmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFyc2hhbFNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb24gbWFyc2hhbERlc2MpCi0gICAgICAgICAgICB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgT2JqZWN0IGZhdWx0QmVhbiA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBHZXQgdGhlIGZhdWx0IGJlYW4gbmFtZSBmcm9tIHRoZSBmYXVsdCBkZXNjcmlwdGlvbi4KLSAgICAgICAgICAgIC8vIFJFVklFVyBUaGUgZGVmYXVsdCBuYW1lIHNob3VsZCBiZToKLSAgICAgICAgICAgIC8vICAgICAgUGFja2FnZSA9IDxTRUkgcGFja2FnZT4gb3IgPFNFSSBwYWNrYWdlPi5qYXh3cwotICAgICAgICAgICAgLy8gICAgICBOYW1lID0gPGV4Y2VwdGlvbiBuYW1lPiArIEJlYW4KLSAgICAgICAgICAgIEZhdWx0QmVhbkRlc2MgZmF1bHRCZWFuRGVzYyA9IG1hcnNoYWxEZXNjLmdldEZhdWx0QmVhbkRlc2MoZmQpOwotICAgICAgICAgICAgU3RyaW5nIGZhdWx0QmVhbk5hbWUgPSBmYXVsdEJlYW5EZXNjLmdldEZhdWx0QmVhbkNsYXNzTmFtZSgpOwotCi0gICAgICAgICAgICAvLyBUT0RPIEFkZCBjaGVjayB0aGF0IGZhdWx0QmVhbk5hbWUgaXMgY29ycmVjdAotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJMZWdhY3kgRXhjZXB0aW9uIEZhdWx0QmVhbiBuYW1lIGlzID0gIiArIGZhdWx0QmVhbk5hbWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBMb2FkIHRoZSBGYXVsdEJlYW4gQ2xhc3MKLSAgICAgICAgICAgIENsYXNzIGZhdWx0QmVhbkNsYXNzID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChmYXVsdEJlYW5OYW1lICE9IG51bGwgJiYgZmF1bHRCZWFuTmFtZS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgZmF1bHRCZWFuQ2xhc3MgPSBNZXRob2RNYXJzaGFsbGVyVXRpbHMubG9hZENsYXNzKGZhdWx0QmVhbk5hbWUpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpewotICAgICAgICAgICAgICAgICAgICAgICAgZmF1bHRCZWFuQ2xhc3MgPSBNZXRob2RNYXJzaGFsbGVyVXRpbHMubG9hZENsYXNzKGZhdWx0QmVhbk5hbWUsIGZkLmdldE9wZXJhdGlvbkRlc2NyaXB0aW9uKCkuZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbigpLmdldEVuZHBvaW50RGVzY3JpcHRpb24oKS5nZXRBeGlzU2VydmljZSgpLmdldENsYXNzTG9hZGVyKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHRocm93YWJsZSkgewotICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ2Fubm90IGxvYWQgZmF1bHQgYmVhbiBjbGFzcyA9ICIgKyBmYXVsdEJlYW5OYW1lICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi4gIEZhbGxiYWNrIHRvIHVzaW5nIHRoZSBleGNlcHRpb24gb2JqZWN0Iik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChmYXVsdEJlYW5DbGFzcyAhPSBudWxsKSB7Ci0KLSAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIHByb3BlcnRpZXMgbmFtZXMgZnJvbSB0aGUgZXhjZXB0aW9uIGNsYXNzCi0gICAgICAgICAgICAgICAgTWFwPFN0cmluZywgUHJvcGVydHlEZXNjcmlwdG9yUGx1cz4gcGRNYXAgPQotICAgICAgICAgICAgICAgICAgICAgICAgbWFyc2hhbERlc2MuZ2V0UHJvcGVydHlEZXNjcmlwdG9yTWFwKHQuZ2V0Q2xhc3MoKSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIGFzc2lnbiB0aGUgbGVnYWN5IGV4Y2VwdGlvbiBkYXRhIHRvIHRoZSBqYXZhIGJlYW4gY2xhc3MuCi0gICAgICAgICAgICAgICAgLy8gV2Ugd2lsbCB1c2UgdGhlIEpBWEJXcmFwcGVyVG9vbC53cmFwIHV0aWxpdHkgdG8gZG8gdGhpcy4KLQotICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgbWFwIG9mIGNoaWxkIG9iamVjdHMKLSAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IGNoaWxkT2JqZWN0cyA9IGdldENoaWxkT2JqZWN0c01hcCh0LCBwZE1hcCk7Ci0gICAgICAgICAgICAgICAgTWFwPFN0cmluZywgQ2xhc3M+IGRlY2xhcmluZ0NsYXNzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBDbGFzcz4oKTsKLSAgICAgICAgICAgICAgICBMaXN0PFN0cmluZz4gY2hpbGROYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPihjaGlsZE9iamVjdHMua2V5U2V0KCkpOwotCi0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0Vycm9yRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiTGlzdCBvZiBwcm9wZXJ0aWVzIG9uIHRoZSBMZWdhY3kgRXhjZXB0aW9uIGlzICIgKyBjaGlsZE5hbWVzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gVXNlIHRoZSB3cmFwcGVyIHRvb2wgdG8gZ2V0IHRoZSBjaGlsZCBvYmplY3RzLgotICAgICAgICAgICAgICAgIEpBWEJXcmFwcGVyVG9vbCB3cmFwcGVyVG9vbCA9IG5ldyBKQVhCV3JhcHBlclRvb2xJbXBsKCk7Ci0gICAgICAgICAgICAgICAgTWFwPFN0cmluZywgUHJvcGVydHlEZXNjcmlwdG9yUGx1cz4gcGRNYXBGb3JCZWFuID0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1hcnNoYWxEZXNjLmdldFByb3BlcnR5RGVzY3JpcHRvck1hcChmYXVsdEJlYW5DbGFzcyk7Ci0gICAgICAgICAgICAgICAgZmF1bHRCZWFuID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBwZXJUb29sLndyYXAoZmF1bHRCZWFuQ2xhc3MsIGNoaWxkTmFtZXMsIGNoaWxkT2JqZWN0cywgZGVjbGFyaW5nQ2xhc3MsIHBkTWFwRm9yQmVhbik7Ci0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0Vycm9yRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ29tcGxldGVkIGNyZWF0aW9uIG9mIHRoZSBmYXVsdCBiZWFuLiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAJCU1lc3NhZ2VzLmdldE1lc3NhZ2UoImZhdWx0UHJvY2Vzc2luZ05vdFN1cHBvcnRlZCIsdC5nZXRDbGFzcygpLmdldE5hbWUoKSkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYXVsdEJlYW47Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIEV4Y2VwdGlvbiB1c2luZyB0aGUgZGF0YSBpbiB0aGUgSkFYQiBvYmplY3QuIFRoZSBzcGVjaWZpY2F0aW9uIGlzIHNpbGVudCBvbiB0aGlzCi0gICAgICogaXNzdWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZXhjZXB0aW9uQ2xhc3MKLSAgICAgKiBAcGFyYW0gamF4YgotICAgICAqIEBwYXJhbSBtYXJzaGFsRGVzYwotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBzdGF0aWMgRXhjZXB0aW9uIGNyZWF0ZUZhdWx0RXhjZXB0aW9uKENsYXNzIGV4Y2VwdGlvbkNsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGpheGIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXJzaGFsU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbiBtYXJzaGFsRGVzYykgewotICAgICAgICBFeGNlcHRpb24gZSA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRXJyb3JFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkNyZWF0ZSBMZWdhY3kgRXhjZXB0aW9uIGZvciAiICsgZXhjZXB0aW9uQ2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEdldCB0aGUgcHJvcGVydGllcyBuYW1lcyBmcm9tIHRoZSBleGNlcHRpb24gY2xhc3MKLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIFByb3BlcnR5RGVzY3JpcHRvclBsdXM+IHBkTWFwID0KLSAgICAgICAgICAgICAgICAgICAgbWFyc2hhbERlc2MuZ2V0UHJvcGVydHlEZXNjcmlwdG9yTWFwKGV4Y2VwdGlvbkNsYXNzKTsKLQotICAgICAgICAgICAgLy8gTm93IGdldCBhIGxpc3Qgb2YgUHJvcGVydHlEZXNjcmlwdG9yUGx1cyBvYmplY3RzIHRoYXQgbWFwIHRvIHRoZSBqYXhiIGJlYW4gcHJvcGVydGllcwotICAgICAgICAgICAgSXRlcmF0b3I8RW50cnk8U3RyaW5nLCBQcm9wZXJ0eURlc2NyaXB0b3JQbHVzPj4gaXQgPSBwZE1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICBMaXN0PFByb3BlcnR5RGVzY3JpcHRvclBsdXM+IHBpTGlzdCA9IG5ldyBBcnJheUxpc3Q8UHJvcGVydHlEZXNjcmlwdG9yUGx1cz4oKTsKLSAgICAgICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBFbnRyeTxTdHJpbmcsIFByb3BlcnR5RGVzY3JpcHRvclBsdXM+IGVudHJ5ID0gaXQubmV4dCgpOwotICAgICAgICAgICAgICAgIFN0cmluZyBwcm9wZXJ0eU5hbWUgPSBlbnRyeS5nZXRWYWx1ZSgpLmdldFByb3BlcnR5TmFtZSgpOwotICAgICAgICAgICAgICAgIC8vIFNvbWUgcHJvcGVydHlOYW1lcyBzaG91bGQgYmUgaWdub3JlZC4KLSAgICAgICAgICAgICAgICBpZiAoIWlnbm9yZS5jb250YWlucyhwcm9wZXJ0eU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBpTGlzdC5hZGQoZW50cnkuZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBGaW5kIGEgbWF0Y2hpbmcgY29uc3RydWN0b3IKLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiAgY2hpbGROYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICAgICAgaWYgKGxvZy5pc0Vycm9yRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJMaXN0IG9mIGNoaWxkTmFtZXMgb24gbGVnYWN5IGV4Y2VwdGlvbiBpcyAiICsgY2hpbGROYW1lcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvciA9IGZpbmRDb25zdHJ1Y3RvcihleGNlcHRpb25DbGFzcywgcGlMaXN0LCBjaGlsZE5hbWVzKTsKLQotICAgICAgICAgICAgaWYgKGxvZy5pc0Vycm9yRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJUaGUgY29uc3RydWN0b3IgdXNlZCB0byBjcmVhdGUgdGhlIGV4Y2VwdGlvbiBpcyAiICsgY29uc3RydWN0b3IpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gVXNlIHRoZSB3cmFwcGVyIHRvb2wgdG8gdW53cmFwIHRoZSBqYXhiIG9iamVjdAotICAgICAgICAgICAgSkFYQldyYXBwZXJUb29sIHdyYXBwZXJUb29sID0gbmV3IEpBWEJXcmFwcGVyVG9vbEltcGwoKTsKLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIFByb3BlcnR5RGVzY3JpcHRvclBsdXM+IHBkTWFwRm9yQmVhbiA9Ci0gICAgICAgICAgICAgICAgICAgIG1hcnNoYWxEZXNjLmdldFByb3BlcnR5RGVzY3JpcHRvck1hcChqYXhiLmdldENsYXNzKCkpOwotICAgICAgICAgICAgT2JqZWN0W10gY2hpbGRPYmplY3RzID0gd3JhcHBlclRvb2wudW5XcmFwKGpheGIsIGNoaWxkTmFtZXMsIHBkTWFwRm9yQmVhbik7Ci0KLSAgICAgICAgICAgIGlmIChsb2cuaXNFcnJvckVuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ2FsbGluZyBuZXdJbnN0YW5jZSBvbiB0aGUgY29uc3RydWN0b3IgIiArIGNvbnN0cnVjdG9yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGUgPSAoRXhjZXB0aW9uKWNvbnN0cnVjdG9yLm5ld0luc3RhbmNlKGNoaWxkT2JqZWN0cyk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihleCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmluZCBhIGNvbnN0cnVjb3IgdGhhdCBtYXRjaGVzIHRoaXMgc2V0IG9mIHByb3BlcnRpZXMKLSAgICAgKgotICAgICAqIEBwYXJhbSBjbHMKLSAgICAgKiBAcGFyYW0gcGRMaXN0Ci0gICAgICogQHBhcmFtIGNoaWxkTmFtZXMgcmV0dXJuZWQgaW4gdGhlIG9yZGVyIHRoYXQgdGhleSBvY2N1ciBpbiB0aGUgY29uc3RydWN0b3IKLSAgICAgKiBAcmV0dXJuIENvbnN0cnVjdG9yIG9yIG51bGwKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBDb25zdHJ1Y3RvciBmaW5kQ29uc3RydWN0b3IoQ2xhc3MgY2xzLCBMaXN0PFByb3BlcnR5RGVzY3JpcHRvclBsdXM+IHBkTGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxTdHJpbmc+IGNoaWxkTmFtZXMpIHsKLSAgICAgICAgQ29uc3RydWN0b3JbXSBjb25zdHJ1Y3RvcnMgPSBjbHMuZ2V0Q29uc3RydWN0b3JzKCk7Ci0gICAgICAgIENvbnN0cnVjdG9yIGNvbnN0cnVjdG9yID0gbnVsbDsKLSAgICAgICAgaWYgKGNvbnN0cnVjdG9ycyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbnN0cnVjdG9ycy5sZW5ndGggJiYgY29uc3RydWN0b3IgPT0gbnVsbDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgQ29uc3RydWN0b3IgdHJ5Q29uc3RydWN0b3IgPSBjb25zdHJ1Y3RvcnNbaV07Ci0gICAgICAgICAgICAgICAgaWYgKHRyeUNvbnN0cnVjdG9yLmdldFBhcmFtZXRlclR5cGVzKCkubGVuZ3RoID09IHBkTGlzdC5zaXplKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVHJ5IGFuZCBmaW5kIHRoZSBiZXN0IG1hdGNoIHVzaW5nIHRoZSBwcm9wZXJ0eSB0eXBlcwotICAgICAgICAgICAgICAgICAgICBMaXN0PFByb3BlcnR5RGVzY3JpcHRvclBsdXM+IGxpc3QgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8UHJvcGVydHlEZXNjcmlwdG9yUGx1cz4ocGRMaXN0KTsKLSAgICAgICAgICAgICAgICAgICAgTGlzdDxQcm9wZXJ0eURlc2NyaXB0b3JQbHVzPiBhcmdzID0gbmV3IEFycmF5TGlzdDxQcm9wZXJ0eURlc2NyaXB0b3JQbHVzPigpOwotCi0gICAgICAgICAgICAgICAgICAgIENsYXNzW10gcGFybXMgPSB0cnlDb25zdHJ1Y3Rvci5nZXRQYXJhbWV0ZXJUeXBlcygpOwotICAgICAgICAgICAgICAgICAgICBib29sZWFuIHZhbGlkID0gdHJ1ZTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBBc3N1bWUgdGhlIG1lc3NhZ2UgaXMgZmlyc3QgaW4gdGhlIGNvbnN0cnVjdG9yCi0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbGlzdC5zaXplKCk7IGorKykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCJtZXNzYWdlIi5lcXVhbHMobGlzdC5nZXQoaikuZ2V0UHJvcGVydHlOYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncy5hZGQobGlzdC5yZW1vdmUoaikpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhcmdzLnNpemUoKSAhPSAxIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIXBhcm1zWzBdLmlzQXNzaWduYWJsZUZyb20oYXJncy5nZXQoMCkuZ2V0UHJvcGVydHlUeXBlKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gTm93IHByb2Nlc3MgdGhlIHJlc3Qgb2YgdGhlIGFyZ3MKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDE7IGogPCBwYXJtcy5sZW5ndGggJiYgdmFsaWQ7IGorKykgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmluZCBhIGNvbXBhdGlibGUgYXJndW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzIHBhcm0gPSBwYXJtc1tqXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgbGlzdC5zaXplKCkgJiYgIWZvdW5kOyBrKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyBhcmcgPSBsaXN0LmdldChrKS5nZXRQcm9wZXJ0eVR5cGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFybS5pc0Fzc2lnbmFibGVGcm9tKGFyZykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLmFkZChsaXN0LnJlbW92ZShrKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgbm8gY29tcGF0aWJsZSBhcmd1bWVudCB0aGVuIHRoaXMgY29uc3RydWN0b3IgaXMgbm90IHZhbGlkCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBBIGNvbnN0cnVjdG9yIGlzIGZvdW5kCi0gICAgICAgICAgICAgICAgICAgIGlmICh2YWxpZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IgPSB0cnlDb25zdHJ1Y3RvcjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBhcmdzLnNpemUoKTsgaW5kZXgrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkTmFtZXMuYWRkKGFyZ3MuZ2V0KGluZGV4KS5nZXRQcm9wZXJ0eU5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gY29uc3RydWN0b3I7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGNoaWxkIG9iamVjdHMgbWFwIHRoYXQgaXMgcmVxdWlyZWQgYnkgdGhlIHdyYXBwZXIgdG9vbC4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0ICAgICAgICAgICAgICAgICAgICAgICBFeGNlcHRpb24KLSAgICAgKiBAcGFyYW0gUGFyYW1ldGVyRGVzY3JpcHRvclBsdXMgbWFwIGZvciBUaHJvd2FibGUgdAotICAgICAqIEByZXR1cm4gTWFwIHdpdGgga2V5IGlzIGJlYW4gcHJvcGVydHkgbmFtZXMgYW5kIHZhbHVlcyBhcmUgb2JqZWN0cyBmcm9tIHRoZSBFeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIEludHJvc3BlY3Rpb25FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGdldENoaWxkT2JqZWN0c01hcChUaHJvd2FibGUgdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBQcm9wZXJ0eURlc2NyaXB0b3JQbHVzPiBwZE1hcCkKLSAgICAgICAgICAgIHRocm93cyBJbnRyb3NwZWN0aW9uRXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHsKLQotCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gY29NYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLQotICAgICAgICBJdGVyYXRvcjxFbnRyeTxTdHJpbmcsIFByb3BlcnR5RGVzY3JpcHRvclBsdXM+PiBpdCA9IHBkTWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgRW50cnk8U3RyaW5nLCBQcm9wZXJ0eURlc2NyaXB0b3JQbHVzPiBlbnRyeSA9IGl0Lm5leHQoKTsKLSAgICAgICAgICAgIFN0cmluZyBwcm9wZXJ0eU5hbWUgPSBlbnRyeS5nZXRWYWx1ZSgpLmdldFByb3BlcnR5TmFtZSgpOwotICAgICAgICAgICAgU3RyaW5nIHhtbE5hbWUgPSBlbnRyeS5nZXRLZXkoKTsKLSAgICAgICAgICAgIC8vIFNvbWUgcHJvcGVydHlOYW1lcyBzaG91bGQgYmUgaWdub3JlZC4KLSAgICAgICAgICAgIGlmICghaWdub3JlLmNvbnRhaW5zKHByb3BlcnR5TmFtZSkpIHsKLSAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBlbnRyeS5nZXRWYWx1ZSgpLmdldCh0KTsKLSAgICAgICAgICAgICAgICBjb01hcC5wdXQoeG1sTmFtZSwgdmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjb01hcDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21hcnNoYWxsZXIvaW1wbC9hbHQvTWV0aG9kTWFyc2hhbGxlclV0aWxzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tYXJzaGFsbGVyL2ltcGwvYWx0L01ldGhvZE1hcnNoYWxsZXJVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNGIxMTJiLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21hcnNoYWxsZXIvaW1wbC9hbHQvTWV0aG9kTWFyc2hhbGxlclV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzY5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tYXJzaGFsbGVyLmltcGwuYWx0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5QYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5FeGNlcHRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkF0dGFjaG1lbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkF0dGFjaG1lbnRUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRW5kcG9pbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkZhdWx0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5PcGVyYXRpb25EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLlBhcmFtZXRlckRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uU2VydmljZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaTE4bi5NZXNzYWdlczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuQmxvY2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLlByb3RvY29sOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5YTUxGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuWE1MRmF1bHRSZWFzb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmRhdGFiaW5kaW5nLkpBWEJCbG9ja0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmRhdGFiaW5kaW5nLkpBWEJVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZmFjdG9yeS5KQVhCQmxvY2tGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS51dGlsLlhNTEZhdWx0VXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5yZWdpc3RyeS5GYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5ydW50aW1lLmRlc2NyaXB0aW9uLm1hcnNoYWwuQW5ub3RhdGlvbkRlc2M7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5ydW50aW1lLmRlc2NyaXB0aW9uLm1hcnNoYWwuRmF1bHRCZWFuRGVzYzsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnJ1bnRpbWUuZGVzY3JpcHRpb24ubWFyc2hhbC5NYXJzaGFsU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnJ1bnRpbWUuZGVzY3JpcHRpb24ubWFyc2hhbC5NYXJzaGFsU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51dGlsaXR5LkNsYXNzVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51dGlsaXR5LkNvbnZlcnRVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnV0aWxpdHkuU0FBSkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC5hY3RpdmF0aW9uLkRhdGFIYW5kbGVyOwotaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbS5Nb2RlOwotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJFbGVtZW50OwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEJvZHk7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUENvbnN0YW50czsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRmF1bHQ7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLndzLkFzeW5jSGFuZGxlcjsKLWltcG9ydCBqYXZheC54bWwud3MuSG9sZGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5Qcm90b2NvbEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5TT0FQRmF1bHRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5BcnJheTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5HcmVnb3JpYW5DYWxlbmRhcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKLQotLyoqIFN0YXRpYyBVdGlsdHkgQ2xhc3NlcyB1c2VkIGJ5IHRoZSBNZXRob2RNYXJzaGFsbGVyIGltcGxlbWVudGF0aW9ucyBpbiB0aGUgYWx0IHBhY2thZ2UuICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kTWFyc2hhbGxlclV0aWxzIHsKLQotICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhNZXRob2RNYXJzaGFsbGVyVXRpbHMuY2xhc3MpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgSkFYQkJsb2NrRmFjdG9yeSBmYWN0b3J5ID0KLSAgICAgICAgICAgIChKQVhCQmxvY2tGYWN0b3J5KUZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KEpBWEJCbG9ja0ZhY3RvcnkuY2xhc3MpOwotCi0gICAgLyoqIEludGVudGlvbmFsbHkgUHJpdmF0ZS4gIFRoaXMgaXMgYSBzdGF0aWMgdXRpbGl0eSBjbGFzcyAqLwotICAgIHByaXZhdGUgTWV0aG9kTWFyc2hhbGxlclV0aWxzKCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGxpc3Qgb2YgUERFbGVtZW50cyB0aGF0IG5lZWQgdG8gYmUgbWFyc2hhbGxlZCBvbnRvIHRoZSB3aXJlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWFyc2hhbERlc2MKLSAgICAgKiBAcGFyYW0gcGFyYW1zICAgICAgICAgIFBhcmFtZXRlckRlc2NyaXB0aW9uIGZvciB0aGlzIG9wZXJhdGlvbgotICAgICAqIEBwYXJhbSBzaWdBcmd1bWVudHMgICAgYXJndW1lbnRzCi0gICAgICogQHBhcmFtIGlzSW5wdXQgICAgICAgICBpbmRpY2F0ZXMgaWYgaW5wdXQgb3Igb3V0cHV0ICBwYXJhbXMoaW5wdXQgYXJncyBvbiBjbGllbnQsIAotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0IGFyZ3Mgb24gc2VydmVyKQotICAgICAqIEBwYXJhbSBpc0RvY0xpdFdyYXBwZWQKLSAgICAgKiBAcGFyYW0gaXNSUEMKLSAgICAgKiBAcmV0dXJuIFBERWxlbWVudHMKLSAgICAgKi8KLSAgICBzdGF0aWMgTGlzdDxQREVsZW1lbnQ+IGdldFBERWxlbWVudHMoTWFyc2hhbFNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb24gbWFyc2hhbERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtZXRlckRlc2NyaXB0aW9uW10gcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RbXSBzaWdBcmd1bWVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNJbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0RvY0xpdFdyYXBwZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNSUEMpIHsKLSAgICAgICAgTGlzdDxQREVsZW1lbnQ+IHBkZUxpc3QgPSBuZXcgQXJyYXlMaXN0PFBERWxlbWVudD4oKTsKLQotICAgICAgICBpbnQgaW5kZXggPSAwOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgUGFyYW1ldGVyRGVzY3JpcHRpb24gcGQgPSBwYXJhbXNbaV07Ci0KLSAgICAgICAgICAgIGlmIChwZC5nZXRNb2RlKCkgPT0gTW9kZS5JTiAmJiBpc0lucHV0IHx8Ci0gICAgICAgICAgICAgICAgICAgIHBkLmdldE1vZGUoKSA9PSBNb2RlLklOT1VUIHx8Ci0gICAgICAgICAgICAgICAgICAgIHBkLmdldE1vZGUoKSA9PSBNb2RlLk9VVCAmJiAhaXNJbnB1dCkgewotCi0gICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBtYXRjaGluZyBzaWduYXR1cmUgYXJndW1lbnQKLSAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBzaWdBcmd1bWVudHNbaV07Ci0KLSAgICAgICAgICAgICAgICAvLyBEb24ndCBjb25zaWRlciBhc3luYyBoYW5kbGVycywgdGhleSBhcmUgYXJlIG5vdCByZXByZXNlbnRlZCBvbiB0aGUgd2lyZSwKLSAgICAgICAgICAgICAgICAvLyB0aHVzIHRoZXkgZG9uJ3QgaGF2ZSBhIFBERWxlbWVudAotICAgICAgICAgICAgICAgIGlmIChpc0FzeW5jSGFuZGxlcih2YWx1ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gQ29udmVydCBmcm9tIEhvbGRlciBpbnRvIHZhbHVlCi0gICAgICAgICAgICAgICAgaWYgKGlzSG9sZGVyKHZhbHVlKSkgewotICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9ICgoSG9sZGVyKXZhbHVlKS52YWx1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIGZvcm1hbCB0eXBlIHJlcHJlc2VudGluZyB0aGUgdmFsdWUKLSAgICAgICAgICAgICAgICBDbGFzcyBmb3JtYWxUeXBlID0gcGQuZ2V0UGFyYW1ldGVyQWN0dWFsVHlwZSgpOwotCi0gICAgICAgICAgICAgICAgLy8gVGhlIG5hbWVzcGFjZSBhbmQgbG9jYWwgbmFtZSBhcmUgb2J0YWluZWQgZGlmZmVyZW50bHkgZGVwZW5kaW5nIG9uIAotICAgICAgICAgICAgICAgIC8vIHRoZSBzdHlsZS91c2UgYW5kIGhlYWRlcgotICAgICAgICAgICAgICAgIFFOYW1lIHFOYW1lID0gbnVsbDsKLSAgICAgICAgICAgICAgICBpZiAocGQuaXNIZWFkZXIoKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBIZWFkZXJzIChldmVuIHJwYykgYXJlIG1hcnNoYWxsZWQgd2l0aCB0aGUgbmFtZSBkZWZpbmVkIGJ5IHRoZSAKLSAgICAgICAgICAgICAgICAgICAgLy8gZWxlbWVudD0gYXR0cmlidXRlIG9uIHRoZSB3c2Q6cGFydAotICAgICAgICAgICAgICAgICAgICBxTmFtZSA9IG5ldyBRTmFtZShwZC5nZXRUYXJnZXROYW1lc3BhY2UoKSwgcGQuZ2V0UGFyYW1ldGVyTmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlzRG9jTGl0V3JhcHBlZCkgewotICAgICAgICAgICAgICAgICAgICAvLyBGb3IgZG9jL2xpdCB3cmFwcGVkLCB0aGUgbG9jYWxOYW1lIGNvbWVzIGZyb20gdGhlIFBhcnROYW1lCi0gICAgICAgICAgICAgICAgICAgIHFOYW1lID0gbmV3IFFOYW1lKHBkLmdldFRhcmdldE5hbWVzcGFjZSgpLCBwZC5nZXRQYXJ0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlzUlBDKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFBlciBXU0ktQlAsIHRoZSBuYW1lc3BhY2UgdXJpIGlzIHVucXVhbGlmaWVkCi0gICAgICAgICAgICAgICAgICAgIHFOYW1lID0gbmV3IFFOYW1lKHBkLmdldFBhcnROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHFOYW1lID0gbmV3IFFOYW1lKHBkLmdldFRhcmdldE5hbWVzcGFjZSgpLCBwZC5nZXRQYXJhbWV0ZXJOYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhbiBFbGVtZW50IHJlbmRlcmluZwotICAgICAgICAgICAgICAgIEVsZW1lbnQgZWxlbWVudCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgQXR0YWNobWVudERlc2NyaXB0aW9uIGF0dGFjaG1lbnREZXNjID0gcGQuZ2V0QXR0YWNobWVudERlc2NyaXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dGFjaG1lbnREZXNjICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgUERFbGVtZW50IHBkZSA9IGNyZWF0ZVBERWxlbWVudEZvckF0dGFjaG1lbnQocGQsIHFOYW1lLCB2YWx1ZSwgZm9ybWFsVHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgIHBkZUxpc3QuYWRkKHBkZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFtYXJzaGFsRGVzYy5nZXRBbm5vdGF0aW9uRGVzYyhmb3JtYWxUeXBlKS5oYXNYbWxSb290RWxlbWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiB3aGVuIGEgc2NoZW1hIGRlZmluZXMgYSBTaW1wbGVUeXBlIHdpdGggeHNkIGxpc3QgamF4d3MgdG9vbGluZyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIGdlbmVyYXRlcyBhcnRpZmFjdHMgd2l0aCBhcnJheSByYXRoZXIgdGhhbiBhIGphdmEudXRpbC5MaXN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgKiBIb3dldmVyIHRoZSBPYmplY3RGYWN0b3J5IGRlZmluaXRpb24gdXNlcyBhIExpc3QgYW5kIHRodXMgCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiBtYXJzaGFsbGluZyBmYWlscy4gTGV0cyBjb252ZXJ0IHRoZSBBcnJheXMgdG8gTGlzdCBhbmQgcmVjcmVhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIHRoZSBKQVhCRWxlbWVudHMgZm9yIHRoZSBzYW1lLgotICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGQuaXNMaXN0VHlwZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxPYmplY3Q+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm9ybWFsVHlwZS5pc0FycmF5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgY291bnQgPSAwOyBjb3VudCA8IEFycmF5LmdldExlbmd0aCh2YWx1ZSk7IGNvdW50KyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBvYmogPSBBcnJheS5nZXQodmFsdWUsIGNvdW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QuYWRkKG9iaik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50ID0gbmV3IEVsZW1lbnQobGlzdCwgcU5hbWUsIExpc3QuY2xhc3MpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50ID0gbmV3IEVsZW1lbnQodmFsdWUsIHFOYW1lLCBmb3JtYWxUeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2V7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50ID0gbmV3IEVsZW1lbnQodmFsdWUsIHFOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBUaGUgb2JqZWN0IGlzIG5vdyByZWFkeSBmb3IgbWFyc2hhbGxpbmcKLSAgICAgICAgICAgICAgICAgICAgUERFbGVtZW50IHBkZSA9IG5ldyBQREVsZW1lbnQocGQsIGVsZW1lbnQsIG51bGwpOwotICAgICAgICAgICAgICAgICAgICBwZGVMaXN0LmFkZChwZGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBwZGVMaXN0OwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAcGFyYW0gcGQKLSAgICAgKiBAcGFyYW0gcU5hbWUKLSAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKiBAcGFyYW0gZm9ybWFsVHlwZQotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBQREVsZW1lbnQgY3JlYXRlUERFbGVtZW50Rm9yQXR0YWNobWVudChQYXJhbWV0ZXJEZXNjcmlwdGlvbiBwZCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUU5hbWUgcU5hbWUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCB2YWx1ZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MgZm9ybWFsVHlwZSkgewotICAgICAgICBQREVsZW1lbnQgcGRlOwotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ3JlYXRpbmcgYSBQREVsZW1lbnQgZm9yIGFuIGF0dGFjaG1lbnQgdmFsdWU6ICIgKyAKLSAgICAgICAgICAgICAgICAgICAgICAoKHZhbHVlID09IG51bGwpPyAibnVsbCI6dmFsdWUuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpKTsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiUGFyYW1ldGVyRGVzY3JpcHRpb24gPSAiICsgcGQudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgQXR0YWNobWVudERlc2NyaXB0aW9uIGF0dGFjaG1lbnREZXNjID0gcGQuZ2V0QXR0YWNobWVudERlc2NyaXB0aW9uKCk7Ci0gICAgICAgIAotICAgICAgICBBdHRhY2htZW50VHlwZSBhdHRhY2htZW50VHlwZSA9IGF0dGFjaG1lbnREZXNjLmdldEF0dGFjaG1lbnRUeXBlKCk7Ci0gICAgICAgIGlmIChhdHRhY2htZW50VHlwZSA9PSBBdHRhY2htZW50VHlwZS5TV0EpIHsKLSAgICAgICAgICAgIC8vIENyZWF0ZSBhbiBBdHRhY2htZW50IG9iamVjdCB3aXRoIHRoZSBzaWduYXR1cmUgdmFsdWUKLSAgICAgICAgICAgIEF0dGFjaG1lbnQgYXR0YWNobWVudCA9IG5ldyBBdHRhY2htZW50KHZhbHVlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hbFR5cGUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0YWNobWVudERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZC5nZXRQYXJ0TmFtZSgpKTsKLSAgICAgICAgICAgIHBkZSA9IG5ldyBQREVsZW1lbnQocGQsIAotICAgICAgICAgICAgICAgICAgICBudWxsLCAvLyBGb3IgU1dBIEF0dGFjaG1lbnRzLCB0aGVyZSBpcyBubyBlbGVtZW50IHJlZmVyZW5jZSB0byB0aGUgYXR0YWNobWVudAotICAgICAgICAgICAgICAgICAgICBudWxsLCAKLSAgICAgICAgICAgICAgICAgICAgYXR0YWNobWVudCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoInBkRWxlbWVudEVyciIpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcGRlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgbGlzdCBvZiBQREVsZW1lbnRzIHRoYXQgaXMgdW5tYXJzaGFsbGVkIGZyb20gdGhlIHdpcmUKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGFyYW1zIFBhcmFtZXRlckRlc2NyaXB0aW9uIGZvciB0aGlzIG9wZXJhdGlvbgotICAgICAqIEBwYXJhbSBtZXNzYWdlIE1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gcGFja2FnZXMgc2V0IG9mIHBhY2thZ2VzIG5lZWRlZCB0byB1bm1hcnNoYWwgb2JqZWN0cyBmb3IgdGhpcyBvcGVyYXRpb24KLSAgICAgKiBAcGFyYW0gaXNJbnB1dCBpbmRpY2F0ZXMgaWYgaW5wdXQgb3Igb3V0cHV0ICBwYXJhbXMgKGlucHV0IG9uIHNlcnZlciwgb3V0cHV0IG9uIGNsaWVudCkKLSAgICAgKiBAcGFyYW0gaGFzUmV0dXJuSW5Cb2R5IGlmIGlzSW5wdXQ9ZmFsc2UsIHRoZW4gdGhpcyBwYXJhbWV0ZXIgaW5kaWNhdGVzIHdoZXRoZXIgYSAKLSAgICAgKiByZXR1cm4gdmFsdWUgaXMgZXhwZWN0ZWQgaW4gdGhlIGJvZHkuCi0gICAgICogQHBhcmFtIHVubWFyc2hhbEJ5SmF2YVR5cGUgaW4gbW9zdCBzY2VuYXJpb3MgdGhpcyBpcyBudWxsLiAgCi0gICAgICogT25seSB1c2UgdGhpcyBpbiB0aGUgc2NlbmFyaW9zIHRoYXQgcmVxdWlyZSB1bm1hcnNoYWxsaW5nIGJ5IGphdmEgdHlwZQotICAgICAqIEByZXR1cm4gUGFyYW1WYWx1ZXMKLSAgICAgKi8KLSAgICBzdGF0aWMgTGlzdDxQREVsZW1lbnQ+IGdldFBERWxlbWVudHMoUGFyYW1ldGVyRGVzY3JpcHRpb25bXSBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJlZVNldDxTdHJpbmc+IHBhY2thZ2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzSW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaGFzUmV0dXJuSW5Cb2R5LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NbXSB1bm1hcnNoYWxCeUphdmFUeXBlKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICBMaXN0PFBERWxlbWVudD4gcGRlTGlzdCA9IG5ldyBBcnJheUxpc3Q8UERFbGVtZW50PigpOwotCi0gICAgICAgIC8vIENvdW50IAotICAgICAgICBpbnQgdG90YWxCb2R5QmxvY2tzID0gMDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFBhcmFtZXRlckRlc2NyaXB0aW9uIHBkID0gcGFyYW1zW2ldOwotCi0gICAgICAgICAgICBpZiAocGQuZ2V0TW9kZSgpID09IE1vZGUuSU4gJiYgaXNJbnB1dCB8fAotICAgICAgICAgICAgICAgICAgICBwZC5nZXRNb2RlKCkgPT0gTW9kZS5JTk9VVCB8fAotICAgICAgICAgICAgICAgICAgICBwZC5nZXRNb2RlKCkgPT0gTW9kZS5PVVQgJiYgIWlzSW5wdXQpIHsKLSAgICAgICAgICAgICAgICBpZiAoIXBkLmlzSGVhZGVyKCkgJiYgIWlzU1dBQXR0YWNobWVudChwZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgdG90YWxCb2R5QmxvY2tzKys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFpc0lucHV0ICYmIGhhc1JldHVybkluQm9keSkgewotICAgICAgICAgICAgdG90YWxCb2R5QmxvY2tzKys7Ci0gICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICBpbnQgaW5kZXggPSAoIWlzSW5wdXQgJiYgaGFzUmV0dXJuSW5Cb2R5KSA/IDEgOiAwOwotICAgICAgICAvLyBUT0RPIFdoYXQgaWYgcmV0dXJuIGlzIGFuIHN3YSBhdHRhY2htZW50LCB0aGVuIHRoaXMgc2hvdWxkIHN0YXJ0Ci0gICAgICAgIC8vIGF0IDEgbm90IDAuCi0gICAgICAgIGludCBzd2FJbmRleCA9IDA7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBQYXJhbWV0ZXJEZXNjcmlwdGlvbiBwZCA9IHBhcmFtc1tpXTsKLQotICAgICAgICAgICAgaWYgKHBkLmdldE1vZGUoKSA9PSBNb2RlLklOICYmIGlzSW5wdXQgfHwKLSAgICAgICAgICAgICAgICAgICAgcGQuZ2V0TW9kZSgpID09IE1vZGUuSU5PVVQgfHwKLSAgICAgICAgICAgICAgICAgICAgcGQuZ2V0TW9kZSgpID09IE1vZGUuT1VUICYmICFpc0lucHV0KSB7Ci0KLSAgICAgICAgICAgICAgICAvLyBEb24ndCBjb25zaWRlciBhc3luYyBoYW5kbGVycywgdGhleSBhcmUgYXJlIG5vdCByZXByZXNlbnRlZCBvbiB0aGUgd2lyZSwKLSAgICAgICAgICAgICAgICAvLyB0aHVzIHRoZXkgZG9uJ3QgaGF2ZSBhIFBERWxlbWVudAotICAgICAgICAgICAgICAgIC8vIFRPRE8KLSAgICAgICAgICAgICAgICAvL2lmIChpc0FzeW5jSGFuZGxlcihwYXJhbSkpIHsKLSAgICAgICAgICAgICAgICAvLyAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAvL30KLQotICAgICAgICAgICAgICAgIEJsb2NrIGJsb2NrID0gbnVsbDsKLSAgICAgICAgICAgICAgICBKQVhCQmxvY2tDb250ZXh0IGNvbnRleHQgPSBuZXcgSkFYQkJsb2NrQ29udGV4dChwYWNrYWdlcyk7Ci0KLSAgICAgICAgICAgICAgICBBdHRhY2htZW50RGVzY3JpcHRpb24gYXR0YWNobWVudERlc2MgPSBwZC5nZXRBdHRhY2htZW50RGVzY3JpcHRpb24oKTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0YWNobWVudERlc2MgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgLy8gTm9ybWFsIFByb2Nlc3Npbmc6IE5vdCBhbiBBdHRhY2htZW50Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRyaWdnZXIgdW5tYXJzaGFsIGJ5IGphdmEgdHlwZSBpZiBuZWNlc3NhcnkKLSAgICAgICAgICAgICAgICAgICAgaWYgKHVubWFyc2hhbEJ5SmF2YVR5cGUgIT0gbnVsbCAmJiB1bm1hcnNoYWxCeUphdmFUeXBlW2ldICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0UHJvY2Vzc1R5cGUodW5tYXJzaGFsQnlKYXZhVHlwZVtpXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnNldElzeG1sTGlzdChwZC5pc0xpc3RUeXBlKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAvLyBVbm1hcnNoYWwgdGhlIG9iamVjdCBpbnRvIGEgSkFYQiBvYmplY3Qgb3IgSkFYQkVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBkLmlzSGVhZGVyKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBCbG9jayBmcm9tIHRoZSBoZWFkZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5PVEUgVGhlIHBhcmFtZXRlciBuYW1lIGlzIGFsd2F5cyB1c2VkIHRvIGdldCB0aGUgaGVhZGVyIAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gZWxlbWVudC4uLmV2ZW4gaWYgdGhlIHN0eWxlIGlzIFJQQy4KLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsb2NhbE5hbWUgPSBwZC5nZXRQYXJhbWV0ZXJOYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBibG9jayA9IG1lc3NhZ2UuZ2V0SGVhZGVyQmxvY2socGQuZ2V0VGFyZ2V0TmFtZXNwYWNlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yeSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodG90YWxCb2R5QmxvY2tzID4gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFlvdSBtdXN0IHVzZSB0aGlzIG1ldGhvZCBpZiB0aGVyZSBhcmUgbW9yZSB0aGFuIG9uZSBib2R5IGJsb2NrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBtZXRob2QgbWF5IGNhdXNlIE9NIGV4cGFuc2lvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrID0gbWVzc2FnZS5nZXRCb2R5QmxvY2soaW5kZXgsIGNvbnRleHQsIGZhY3RvcnkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVc2UgdGhpcyBtZXRob2QgaWYgeW91IGtub3cgdGhlcmUgaXMgb25seSBvbmUgYm9keSBibG9jay4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIG1ldGhvZCBwcmV2ZW50cyBPTSBleHBhbnNpb24uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2sgPSBtZXNzYWdlLmdldEJvZHlCbG9jayhjb250ZXh0LCBmYWN0b3J5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4Kys7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgZWxlbWVudCA9IG5ldyBFbGVtZW50KGJsb2NrLmdldEJ1c2luZXNzT2JqZWN0KHRydWUpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2suZ2V0UU5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIFBERWxlbWVudCBwZGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFBERWxlbWVudChwZCwgZWxlbWVudCwgdW5tYXJzaGFsQnlKYXZhVHlwZSA9PSBudWxsID8gbnVsbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHVubWFyc2hhbEJ5SmF2YVR5cGVbaV0pOwotICAgICAgICAgICAgICAgICAgICBwZGVMaXN0LmFkZChwZGUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEF0dGFjaG1lbnQgUHJvY2Vzc2luZwotICAgICAgICAgICAgICAgICAgICBpZiAoYXR0YWNobWVudERlc2MuZ2V0QXR0YWNobWVudFR5cGUoKSA9PSBBdHRhY2htZW50VHlwZS5TV0EpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXJ0TmFtZSA9IHBkLmdldFBhcnROYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY2lkID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiR2V0dGluZyB0aGUgYXR0YWNobWVudCBkYXRhSGFuZGxlciBmb3IgcGFydE5hbWU9IiArIHBhcnROYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJ0TmFtZSAhPSBudWxsICYmIHBhcnROYW1lLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbXBsaWFudCBXUy1JIGJlaGF2aW9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2lkID0gbWVzc2FnZS5nZXRBdHRhY2htZW50SUQocGFydE5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNpZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQXR0YWNobWVudCBkYXRhSGFuZGxlciB3YXMgbm90IGZvdW5kLiAgRmFsbGJhY2sgdG8gdXNlIGF0dGFjaG1lbnQgIiArIHN3YUluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVG9sZXJhdGlvbiBtb2RlIGZvciBub24tY29tcGxpYW50IGF0dGFjaG1lbnQgbmFtZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaWQgPSBtZXNzYWdlLmdldEF0dGFjaG1lbnRJRChzd2FJbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBEYXRhSGFuZGxlciBkaCA9IG1lc3NhZ2UuZ2V0RGF0YUhhbmRsZXIoY2lkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEF0dGFjaG1lbnQgYXR0YWNobWVudCA9IG5ldyBBdHRhY2htZW50KGRoLCBjaWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgUERFbGVtZW50IHBkZSA9IG5ldyBQREVsZW1lbnQocGQsIG51bGwsIG51bGwsIGF0dGFjaG1lbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgcGRlTGlzdC5hZGQocGRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN3YUluZGV4Kys7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoInBkRWxlbWVudEVyciIpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBwZGVMaXN0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIHJlcXVlc3Qgc2lnbmF0dXJlIGFyZ3VtZW50cyAoc2VydmVyKSBmcm9tIGEgbGlzdAotICAgICAqIG9mIGVsZW1lbnQgZWFibGVkIG9iamVjdCAoUERFZW1lbnRzKQotICAgICAqIEBwYXJhbSBwZHMgUGFyYW1ldGVyRGVzY3JpcHRpb25zIGZvciB0aGlzIE9wZXJhdGlvbgotICAgICAqIEBwYXJhbSBwdkxpc3QgRWxlbWVudCBlbmFibGVkIG9iamVjdAotICAgICAqIEByZXR1cm4gU2lnbmF0dXJlIEFyZ3MKLSAgICAgKiBAdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24KLSAgICAgKi8KLSAgICBzdGF0aWMgT2JqZWN0W10gY3JlYXRlUmVxdWVzdFNpZ25hdHVyZUFyZ3MoUGFyYW1ldGVyRGVzY3JpcHRpb25bXSBwZHMsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PFBERWxlbWVudD4gcGRlTGlzdCkKLSAgICB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sCi0gICAgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwKLSAgICBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgT2JqZWN0W10gYXJncyA9IG5ldyBPYmplY3RbcGRzLmxlbmd0aF07Ci0gICAgICAgIGludCBwZGVJbmRleCA9IDA7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgLy8gR2V0IHRoZSBwYXJhbVZhbHVlCi0gICAgICAgICAgICBQREVsZW1lbnQgcGRlID0gKHBkZUluZGV4IDwgcGRlTGlzdC5zaXplKCkpID8gcGRlTGlzdC5nZXQocGRlSW5kZXgpIDogbnVsbDsKLSAgICAgICAgICAgIFBhcmFtZXRlckRlc2NyaXB0aW9uIHBkID0gcGRzW2ldOwotICAgICAgICAgICAgaWYgKHBkZSA9PSBudWxsIHx8Ci0gICAgICAgICAgICAgICAgICAgIHBkZS5nZXRQYXJhbSgpICE9IHBkKSB7Ci0gICAgICAgICAgICAgICAgLy8gV2UgaGF2ZSBhIFBhcmFtZXRlckRlc2MgYnV0IHRoZXJlIGlzIG5vdCBhbiBlcXVpdmFsZW50IFBERWxlbWVudC4gCi0gICAgICAgICAgICAgICAgLy8gUHJvdmlkZSB0aGUgZGVmYXVsdAotICAgICAgICAgICAgICAgIGlmIChwZC5pc0hvbGRlclR5cGUoKSkgewotICAgICAgICAgICAgICAgICAgICBhcmdzW2ldID0gY3JlYXRlSG9sZGVyKHBkLmdldFBhcmFtZXRlclR5cGUoKSwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYXJnc1tpXSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLQotICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgYSBtYXRjaGluZyBwYXJhbVZhbHVlLiAgR2V0IHRoZSB0eXBlIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIHR5cGUKLSAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBudWxsOwotICAgICAgICAgICAgICAgIGlmIChwZGUuZ2V0QXR0YWNobWVudCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBwZGUuZ2V0QXR0YWNobWVudCgpLmdldERhdGFIYW5kbGVyKCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBwZGUuZ2V0RWxlbWVudCgpLmdldFR5cGVWYWx1ZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwZGVJbmRleCsrOwotCi0gICAgICAgICAgICAgICAgLy8gTm93IHRoYXQgd2UgaGF2ZSB0aGUgdHlwZSwgdGhlcmUgbWF5IGJlIGEgbWlzbWF0Y2gKLSAgICAgICAgICAgICAgICAvLyBiZXR3ZWVuIHRoZSB0eXBlIChhcyBkZWZpbmVkIGJ5IEpBWEIpIGFuZCB0aGUgZm9ybWFsCi0gICAgICAgICAgICAgICAgLy8gcGFyYW1ldGVyIChhcyBkZWZpbmVkIGJ5IEpBWFdTKS4gIEZyZXF1ZW50bHkgdGhpcyBvY2N1cnMKLSAgICAgICAgICAgICAgICAvLyB3aXRoIHJlc3BlY3QgdG8gVFtdIHZlcnN1cyBMaXN0PFQ+LiAgCi0gICAgICAgICAgICAgICAgLy8gVXNlIHRoZSBjb252ZXJ0IHV0aWxpdHkgdG8gc2lsZW50bHkgZG8gYW55IGNvbnZlcnNpb25zCi0gICAgICAgICAgICAgICAgaWYgKENvbnZlcnRVdGlscy5pc0NvbnZlcnRhYmxlKHZhbHVlLCBwZC5nZXRQYXJhbWV0ZXJBY3R1YWxUeXBlKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gQ29udmVydFV0aWxzLmNvbnZlcnQodmFsdWUsIHBkLmdldFBhcmFtZXRlckFjdHVhbFR5cGUoKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG9iamVjdENsYXNzID0gKHZhbHVlID09IG51bGwpID8gIm51bGwiIDogdmFsdWUuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZ2V0TWVzc2FnZSgiY29udmVydFByb2JsZW0iLCBvYmplY3RDbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkLmdldFBhcmFtZXRlckFjdHVhbFR5cGUoKS5nZXROYW1lKCkpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBUaGUgc2lnbmF0dXJlIG1heSB3YW50IGEgaG9sZGVyIHJlcHJlc2VudGF0aW9uCi0gICAgICAgICAgICAgICAgaWYgKHBkLmlzSG9sZGVyVHlwZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFyZ3NbaV0gPSBjcmVhdGVIb2xkZXIocGQuZ2V0UGFyYW1ldGVyVHlwZSgpLCB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYXJnc1tpXSA9IHZhbHVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBhcmdzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVwZGF0ZSB0aGUgc2lnbmF0dXJlIGFyZ3VtZW50cyBvbiB0aGUgY2xpZW50IHdpdGggdGhlIHVubWFyc2hhbGxlZCBlbGVtZW50IGVuYWJsZWQgb2JqZWN0cwotICAgICAqIChwdkxpc3QpCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGRzICAgICAgICAgICBQYXJhbWV0ZXJEZXNjcmlwdGlvbnMKLSAgICAgKiBAcGFyYW0gcGRlTGlzdCAgICAgICBFbGVtZW50IEVuYWJsZWQgb2JqZWN0cwotICAgICAqIEBwYXJhbSBzaWduYXR1cmVBcmdzIFNpZ25hdHVyZSBBcmd1bWVudHMgKHRoZSBvdXQvaW5vdXQgaG9sZGVycyBhcmUgdXBkYXRlZCkKLSAgICAgKiBAdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24KLSAgICAgKi8KLSAgICBzdGF0aWMgdm9pZCB1cGRhdGVSZXNwb25zZVNpZ25hdHVyZUFyZ3MoUGFyYW1ldGVyRGVzY3JpcHRpb25bXSBwZHMsIExpc3Q8UERFbGVtZW50PiBwZGVMaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RbXSBzaWduYXR1cmVBcmdzKQotICAgICAgICAgICAgdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICBpbnQgcGRlSW5kZXggPSAwOwotCi0gICAgICAgIC8vIEVhY2ggUGFyYW1ldGVyRGVzY3JpcHRvciBoYXMgYSBjb3JyZXNwb25kaW5naW5nIHNpZ25hdHVyZUFyZyBmcm9tIHRoZSAKLSAgICAgICAgLy8gdGhlIGluaXRpYWwgY2xpZW50IGNhbGwuICBUaGUgcHZMaXN0IGNvbnRhaW5zIHRoZSByZXNwb25zZSB2YWx1ZXMgZnJvbSB0aGUgbWVzc2FnZS4KLSAgICAgICAgLy8gV2FsayB0aGUgUGFyYW1ldGVyRGVzY3JpcHRvci9TaWduYXR1cmVBcmcgbGlzdCBhbmQgcG9wdWxhdGUgdGhlIGhvbGRlcnMgd2l0aCAKLSAgICAgICAgLy8gdGhlIG1hdGNoIFBERWxlbWVudAotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBkcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgLy8gR2V0IHRoZSBwYXJhbSB2YWx1ZQotICAgICAgICAgICAgUERFbGVtZW50IHBkZSA9IChwZGVJbmRleCA8IHBkZUxpc3Quc2l6ZSgpKSA/IHBkZUxpc3QuZ2V0KHBkZUluZGV4KSA6IG51bGw7Ci0gICAgICAgICAgICBQYXJhbWV0ZXJEZXNjcmlwdGlvbiBwZCA9IHBkc1tpXTsKLSAgICAgICAgICAgIGlmIChwZGUgIT0gbnVsbCAmJiBwZGUuZ2V0UGFyYW0oKSA9PSBwZCkgewotICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgYSBtYXRjaGluZyBwYXJhbVZhbHVlLiAgR2V0IHRoZSB2YWx1ZSB0aGF0IHJlcHJlc2VudHMgdGhlIHR5cGUKLSAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBudWxsOwotICAgICAgICAgICAgICAgIGlmIChwZGUuZ2V0QXR0YWNobWVudCgpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBwZGUuZ2V0RWxlbWVudCgpLmdldFR5cGVWYWx1ZSgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gcGRlLmdldEF0dGFjaG1lbnQoKS5nZXREYXRhSGFuZGxlcigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwZGVJbmRleCsrOwotCi0gICAgICAgICAgICAgICAgLy8gTm93IHRoYXQgd2UgaGF2ZSB0aGUgdHlwZSwgdGhlcmUgbWF5IGJlIGEgbWlzbWF0Y2gKLSAgICAgICAgICAgICAgICAvLyBiZXR3ZWVuIHRoZSB0eXBlIChhcyBkZWZpbmVkIGJ5IEpBWEIpIGFuZCB0aGUgZm9ybWFsCi0gICAgICAgICAgICAgICAgLy8gcGFyYW1ldGVyIChhcyBkZWZpbmVkIGJ5IEpBWFdTKS4gIEZyZXF1ZW50bHkgdGhpcyBvY2N1cnMKLSAgICAgICAgICAgICAgICAvLyB3aXRoIHJlc3BlY3QgdG8gVFtdIHZlcnN1cyBMaXN0PFQ+LiAgCi0gICAgICAgICAgICAgICAgLy8gVXNlIHRoZSBjb252ZXJ0IHV0aWxpdHkgdG8gc2lsZW50bHkgZG8gYW55IGNvbnZlcnNpb25zCi0gICAgICAgICAgICAgICAgaWYgKENvbnZlcnRVdGlscy5pc0NvbnZlcnRhYmxlKHZhbHVlLCBwZC5nZXRQYXJhbWV0ZXJBY3R1YWxUeXBlKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gQ29udmVydFV0aWxzLmNvbnZlcnQodmFsdWUsIHBkLmdldFBhcmFtZXRlckFjdHVhbFR5cGUoKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG9iamVjdENsYXNzID0gKHZhbHVlID09IG51bGwpID8gIm51bGwiIDogdmFsdWUuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZ2V0TWVzc2FnZSgiY29udmVydFByb2JsZW0iLCBvYmplY3RDbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkLmdldFBhcmFtZXRlckFjdHVhbFR5cGUoKS5nZXROYW1lKCkpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBUT0RPIEFzc2VydCB0aGF0IHRoaXMgUGFyYW1ldGVyRGVzY3JpcHRvciBtdXN0IHJlcHJlc2VudAotICAgICAgICAgICAgICAgIC8vIGFuIE9VVCBvciBJTk9VVCBhbmQgbXVzdCBoYXZlIGEgbm9uLW51bGwgaG9sZGVyIG9iamVjdCB0byAKLSAgICAgICAgICAgICAgICAvLyBzdG9yZSB0aGUgdmFsdWUKLSAgICAgICAgICAgICAgICBpZiAoaXNIb2xkZXIoc2lnbmF0dXJlQXJnc1tpXSkpIHsKLSAgICAgICAgICAgICAgICAgICAgKChIb2xkZXIpc2lnbmF0dXJlQXJnc1tpXSkudmFsdWUgPSB2YWx1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNYXJzaGFsIHRoZSBlbGVtZW50IGVuYWJsZWQgb2JqZWN0cyAocHZMaXN0KSB0byB0aGUgTWVzc2FnZQotICAgICAqCi0gICAgICogQHBhcmFtIHBkZUxpc3QgIGVsZW1lbnQgZW5hYmxlZCBvYmplY3RzCi0gICAgICogQHBhcmFtIG1lc3NhZ2UgIE1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gcGFja2FnZXMgUGFja2FnZXMgbmVlZGVkIHRvIGRvIGEgSkFYQiBNYXJzaGFsCi0gICAgICogQHRocm93cyBNZXNzYWdlRXhjZXB0aW9uCi0gICAgICovCi0gICAgc3RhdGljIHZvaWQgdG9NZXNzYWdlKExpc3Q8UERFbGVtZW50PiBwZGVMaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFRyZWVTZXQ8U3RyaW5nPiBwYWNrYWdlcykgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotCi0gICAgICAgIGludCB0b3RhbEJvZHlCbG9ja3MgPSAwOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBkZUxpc3Quc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIFBERWxlbWVudCBwZGUgPSBwZGVMaXN0LmdldChpKTsKLSAgICAgICAgICAgIGlmICghcGRlLmdldFBhcmFtKCkuaXNIZWFkZXIoKSAmJgotICAgICAgICAgICAgICAgICBwZGUuZ2V0RWxlbWVudCgpICE9IG51bGwpIHsgLy8gRWxlbWVudCBpcyBudWxsIGZvciBTV0FSZWYgYXR0YWNobWVudAotICAgICAgICAgICAgICAgIHRvdGFsQm9keUJsb2NrcysrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGluZGV4ID0gbWVzc2FnZS5nZXROdW1Cb2R5QmxvY2tzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGRlTGlzdC5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgUERFbGVtZW50IHBkZSA9IHBkZUxpc3QuZ2V0KGkpOwotCi0gICAgICAgICAgICAvLyBDcmVhdGUgSkFYQkNvbnRleHQKLSAgICAgICAgICAgIEpBWEJCbG9ja0NvbnRleHQgY29udGV4dCA9IG5ldyBKQVhCQmxvY2tDb250ZXh0KHBhY2thZ2VzKTsKLQotICAgICAgICAgICAgQXR0YWNobWVudCBhdHRhY2htZW50ID0gcGRlLmdldEF0dGFjaG1lbnQoKTsKLSAgICAgICAgICAgIGlmIChhdHRhY2htZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBOb3JtYWwgRmxvdzogTm90IGFuIGF0dGFjaG1lbnQKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBNYXJzaGFsIGJ5IHR5cGUgb25seSBpZiBuZWNlc3NhcnkKLSAgICAgICAgICAgICAgICBpZiAocGRlLmdldEJ5SmF2YVR5cGVDbGFzcygpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGV4dC5zZXRQcm9jZXNzVHlwZShwZGUuZ2V0QnlKYXZhVHlwZUNsYXNzKCkpOwotICAgICAgICAgICAgICAgICAgICBpZihwZGUuZ2V0UGFyYW0oKSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnNldElzeG1sTGlzdChwZGUuZ2V0UGFyYW0oKS5pc0xpc3RUeXBlKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIEpBWEJCbG9jayBvdXQgb2YgdGhlIHZhbHVlLgotICAgICAgICAgICAgICAgIC8vIChOb3RlIHRoYXQgdGhlIFBERWxlbWVudC5nZXRWYWx1ZSBhbHdheXMgcmV0dXJucyBhbiBvYmplY3QKLSAgICAgICAgICAgICAgICAvLyB0aGF0IGhhcyBhbiBlbGVtZW50IHJlbmRlcmluZy4uLmllLiBpdCBpcyBlaXRoZXIgYSBKQVhCRWxlbWVudCBvCi0gICAgICAgICAgICAgICAgLy8gaGFzIEBYbWxSb290RWxlbWVudCBkZWZpbmVkCi0gICAgICAgICAgICAgICAgQmxvY2sgYmxvY2sgPQotICAgICAgICAgICAgICAgICAgICBmYWN0b3J5LmNyZWF0ZUZyb20ocGRlLmdldEVsZW1lbnQoKS5nZXRFbGVtZW50VmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZGUuZ2V0RWxlbWVudCgpLmdldFFOYW1lKCkpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChwZGUuZ2V0UGFyYW0oKS5pc0hlYWRlcigpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEhlYWRlciBibG9jawotICAgICAgICAgICAgICAgICAgICBRTmFtZSBxbmFtZSA9IGJsb2NrLmdldFFOYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc2V0SGVhZGVyQmxvY2socW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCksIHFuYW1lLmdldExvY2FsUGFydCgpLCBibG9jayk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gQm9keSBibG9jawotICAgICAgICAgICAgICAgICAgICBpZiAodG90YWxCb2R5QmxvY2tzIDwgMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgb25seSBvbmUgYmxvY2ssIHVzZSB0aGUgZm9sbG93aW5nICJtb3JlIHBlcmZvcm1hbnQiIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5zZXRCb2R5QmxvY2soYmxvY2spOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5zZXRCb2R5QmxvY2soaW5kZXgsIGJsb2NrKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpbmRleCsrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhlIHBhcmFtZXRlciBpcyBhbiBhdHRhY2htZW50Ci0gICAgICAgICAgICAgICAgQXR0YWNobWVudFR5cGUgdHlwZSA9IHBkZS5nZXRQYXJhbSgpLgotICAgICAgICAgICAgICAgICAgIGdldEF0dGFjaG1lbnREZXNjcmlwdGlvbigpLmdldEF0dGFjaG1lbnRUeXBlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gQXR0YWNobWVudFR5cGUuU1dBKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEFsbCB3ZSBuZWVkIHRvIGRvIGlzIHNldCB0aGUgZGF0YSBoYW5kbGVyIG9uIHRoZSBtZXNzYWdlLiAgCi0gICAgICAgICAgICAgICAgICAgIC8vIEZvciBTV0EgYXR0YWNobWVudHMsIHRoZSBtZXNzYWdlIGRvZXMgbm90IHJlZmVyZW5jZSB0aGUgYXR0YWNobWVudC4KLSAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5hZGREYXRhSGFuZGxlcihhdHRhY2htZW50LmdldERhdGFIYW5kbGVyKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnQuZ2V0Q29udGVudElEKCkpOwotICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnNldERvaW5nU1dBKHRydWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgicGRFbGVtZW50RXJyIikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1hcnNoYWxzIHRoZSByZXR1cm4gb2JqZWN0IHRvIHRoZSBtZXNzYWdlICh1c2VkIG9uIHNlcnZlciB0byBtYXJzaGFsIHJldHVybiBvYmplY3QpCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcmV0dXJuRWxlbWVudCAgICAgICAgICAgICAgZWxlbWVudAotICAgICAqIEBwYXJhbSByZXR1cm5UeXBlCi0gICAgICogQHBhcmFtIG1hcnNoYWxEZXNjCi0gICAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gbWFyc2hhbEJ5SmF2YVR5cGVDbGFzcy4ud2UgbXVzdCBkbyB0aGlzIGZvciBSUEMuLi5kaXNjb3VyYWdlZCBvdGhlcndpc2UKLSAgICAgKiBAcGFyYW0gaXNIZWFkZXIKLSAgICAgKiBAdGhyb3dzIE1lc3NhZ2VFeGNlcHRpb24KLSAgICAgKi8KLSAgICBzdGF0aWMgdm9pZCB0b01lc3NhZ2UoRWxlbWVudCByZXR1cm5FbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyByZXR1cm5UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzTGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgTWFyc2hhbFNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb24gbWFyc2hhbERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MgbWFyc2hhbEJ5SmF2YVR5cGVDbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0hlYWRlcikKLSAgICAgICAgICAgIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLQotICAgICAgICAvLyBDcmVhdGUgdGhlIEpBWEJCbG9ja0NvbnRleHQKLSAgICAgICAgLy8gUlBDIHVzZXMgdHlwZSBtYXJzaGFsbGluZywgc28gcmVjb3JlZCB0aGUgcnBjVHlwZQotICAgICAgICBKQVhCQmxvY2tDb250ZXh0IGNvbnRleHQgPSBuZXcgSkFYQkJsb2NrQ29udGV4dChtYXJzaGFsRGVzYy5nZXRQYWNrYWdlcygpKTsKLSAgICAgICAgaWYgKG1hcnNoYWxCeUphdmFUeXBlQ2xhc3MgIT0gbnVsbCkgewotICAgICAgICAgICAgY29udGV4dC5zZXRQcm9jZXNzVHlwZShtYXJzaGFsQnlKYXZhVHlwZUNsYXNzKTsKLSAgICAgICAgICAgIGNvbnRleHQuc2V0SXN4bWxMaXN0KGlzTGlzdCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyAgQ3JlYXRlIGEgSkFYQkJsb2NrIG91dCBvZiB0aGUgdmFsdWUuCi0gICAgICAgIEJsb2NrIGJsb2NrID0gZmFjdG9yeS5jcmVhdGVGcm9tKHJldHVybkVsZW1lbnQuZ2V0RWxlbWVudFZhbHVlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybkVsZW1lbnQuZ2V0UU5hbWUoKSk7Ci0KLSAgICAgICAgaWYgKGlzSGVhZGVyKSB7Ci0gICAgICAgICAgICBtZXNzYWdlLnNldEhlYWRlckJsb2NrKHJldHVybkVsZW1lbnQuZ2V0UU5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuRWxlbWVudC5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpLCBibG9jayk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtZXNzYWdlLnNldEJvZHlCbG9jayhibG9jayk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVbm1hcnNoYWwgdGhlIHJldHVybiBvYmplY3QgZnJvbSB0aGUgbWVzc2FnZQotICAgICAqCi0gICAgICogQHBhcmFtIHBhY2thZ2VzCi0gICAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gdW5tYXJzaGFsQnlKYXZhVHlwZUNsYXNzIFVzZWQgb25seSB0byBpbmRpY2F0ZSB1bm1hcnNoYWxpbmcgYnkgdHlwZS4uLm9ubHkgbmVjZXNzYXJ5Ci0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBzb21lIHNjZW5hcmlvcwotICAgICAqIEBwYXJhbSBpc0hlYWRlcgotICAgICAqIEBwYXJhbSBoZWFkZXJOUyAgICAgICAgICAgICAgICAgKG9ubHkgbmVlZGVkIGlmIGlzSGVhZGVyKQotICAgICAqIEBwYXJhbSBoZWFkZXJMb2NhbFBhcnQgICAgICAgICAgKG9ubHkgbmVlZGVkIGlmIGlzSGVhZGVyKQotICAgICAqIEBwYXJhbSBoYXNPdXRwdXRCb2R5UGFyYW1zICh0cnVlIGlmIHRoZSBtZXRob2QgaGFzIG91dCBvciBpbm91dCBwYXJhbXMgb3RoZXIgCi0gICAgICogdGhhbiB0aGUgcmV0dXJuIHZhbHVlKQotICAgICAqIEByZXR1cm4gRWxlbWVudAotICAgICAqIEB0aHJvd3MgV2ViU2VydmljZQotICAgICAqIEB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uCi0gICAgICovCi0gICAgc3RhdGljIEVsZW1lbnQgZ2V0UmV0dXJuRWxlbWVudChUcmVlU2V0PFN0cmluZz4gcGFja2FnZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyB1bm1hcnNoYWxCeUphdmFUeXBlQ2xhc3MsICAvLyBub3JtYWxseSBudWxsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzTGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNIZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVhZGVyTlMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVhZGVyTG9jYWxQYXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBoYXNPdXRwdXRCb2R5UGFyYW1zKQotCi0gICAgICAgICAgICB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiwgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAvLyBUaGUgcmV0dXJuIG9iamVjdCBpcyB0aGUgZmlyc3QgYmxvY2sgaW4gdGhlIGJvZHkKLSAgICAgICAgSkFYQkJsb2NrQ29udGV4dCBjb250ZXh0ID0gbmV3IEpBWEJCbG9ja0NvbnRleHQocGFja2FnZXMpOwotICAgICAgICBpZiAodW5tYXJzaGFsQnlKYXZhVHlwZUNsYXNzICE9IG51bGwgJiYgIWlzSGVhZGVyKSB7Ci0gICAgICAgICAgICBjb250ZXh0LnNldFByb2Nlc3NUeXBlKHVubWFyc2hhbEJ5SmF2YVR5cGVDbGFzcyk7Ci0gICAgICAgICAgICBjb250ZXh0LnNldElzeG1sTGlzdChpc0xpc3QpOwotICAgICAgICB9Ci0gICAgICAgIEJsb2NrIGJsb2NrID0gbnVsbDsKLSAgICAgICAgYm9vbGVhbiBpc0JvZHkgPSBmYWxzZTsKLSAgICAgICAgaWYgKGlzSGVhZGVyKSB7Ci0gICAgICAgICAgICBibG9jayA9IG1lc3NhZ2UuZ2V0SGVhZGVyQmxvY2soaGVhZGVyTlMsIGhlYWRlckxvY2FsUGFydCwgY29udGV4dCwgZmFjdG9yeSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoaGFzT3V0cHV0Qm9keVBhcmFtcykgewotICAgICAgICAgICAgICAgIGJsb2NrID0gbWVzc2FnZS5nZXRCb2R5QmxvY2soMCwgY29udGV4dCwgZmFjdG9yeSk7Ci0gICAgICAgICAgICAgICAgaXNCb2R5ID0gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgb25seSAxIGJsb2NrLCB3ZSBjYW4gdXNlIHRoZSBnZXQgYm9keSBibG9jayBtZXRob2QKLSAgICAgICAgICAgICAgICAvLyB0aGF0IHN0cmVhbXMgdGhlIHdob2xlIGJsb2NrIGNvbnRlbnQuCi0gICAgICAgICAgICAgICAgYmxvY2sgPSBtZXNzYWdlLmdldEJvZHlCbG9jayhjb250ZXh0LCBmYWN0b3J5KTsKLSAgICAgICAgICAgICAgICAvL1dlIGxvb2sgZm9yIGJvZHkgYmxvY2sgb25seSB3aGVuIHRoZSByZXR1cm4gdHlwZSBhc3NvY2lhdGVkIHdpdGggb3BlcmF0aW9uIGlzIG5vdCB2b2lkLgotICAgICAgICAgICAgICAgIC8vSWYgYSBudWxsIGJvZHkgYmxvY2sgaXMgcmV0dXJuZWQgaW4gcmVzcG9uc2Ugb24gYSBvcGVyYXRpb24gdGhhdCBpcyBub3Qgdm9pZCwgaXRzIGEgdXNlciBlcnJvci4gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpc0JvZHkgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vV2UgbG9vayBmb3IgYm9keSBibG9jayBvbmx5IHdoZW4gdGhlIHJldHVybiB0eXBlIGFzc29jaWF0ZWQgd2l0aCBvcGVyYXRpb24gaXMgbm90IHZvaWQuCi0gICAgICAgIC8vSWYgYSBudWxsIGJvZHkgYmxvY2sgaXMgcmV0dXJuZWQgaW4gcmVzcG9uc2Ugb24gYSBvcGVyYXRpb24gdGhhdCBoYXMgbm9uIHZvaWQgcmV0dXJuIHR5cGUsIGl0cyBhIHVzZXIgZXJyb3IuCi0gICAgICAgIGlmKGlzQm9keSAmJiBibG9jayA9PSBudWxsKXsKLSAgICAgICAgICAgCWlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKXsKLSAgICAgICAgICAgCQlsb2cuZGVidWcoIkVtcHR5IEJvZHkgQmxvY2sgRm91bmQgaW4gcmVzcG9uc2UgTWVzc2FnZSBmb3Igd3NkbCBPcGVyYXRpb24gZGVmaW50aW9uIHRoYXQgZXhwZWN0cyBhbiBPdXRwdXQiKTsKLSAgICAgICAgICAgCQlsb2cuZGVidWcoIlJldHVybiB0eXBlIGFzc29jaWF0ZWQgd2l0aCBTRUkgb3BlcmF0aW9uIGlzIG5vdCB2b2lkLCBCb2R5IEJsb2NrIGNhbm5vdCBiZSBudWxsIik7Ci0gICAgICAgICAgIAl9Ci0gICAgICAgICAgIAl0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoIk1ldGhvZE1hcnNoYWxsZXJVdGlsRXJyMSIpKTsJCi0gICAgICAgIH0KLSAgICAgICAgLy8gR2V0IHRoZSBidXNpbmVzcyBvYmplY3QuICBXZSB3YW50IHRvIHJldHVybiB0aGUgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgdHlwZS4KLSAgICAgICAgRWxlbWVudCByZXR1cm5FbGVtZW50ID0gbmV3IEVsZW1lbnQoYmxvY2suZ2V0QnVzaW5lc3NPYmplY3QodHJ1ZSksIGJsb2NrLmdldFFOYW1lKCkpOwotICAgICAgICByZXR1cm4gcmV0dXJuRWxlbWVudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNYXJzaGFsaW5nIGEgZmF1bHQgaXMgZXNzZW50aWFsbHkgdGhlIHNhbWUgZm9yIHJwYy9saXQgYW5kIGRvYy9saXQuIFRoaXMgbWV0aG9kIGlzIHVzZWQgYnkKLSAgICAgKiBhbGwgb2YgdGhlIE1ldGhvZE1hcnNoYWxsZXJzCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdGhyb3dhYmxlICAgICBUaHJvd2FibGUgdG8gbWFyc2hhbAotICAgICAqIEBwYXJhbSBvcGVyYXRpb25EZXNjIE9wZXJhdGlvbkRlc2NyaXB0aW9uCi0gICAgICogQHBhcmFtIHBhY2thZ2VzICAgICAgUGFja2FnZXMgbmVlZGVkIHRvIG1hcnNoYWwgdGhlIG9iamVjdAotICAgICAqIEBwYXJhbSBtZXNzYWdlICAgICAgIE1lc3NhZ2UKLSAgICAgKi8KLSAgICBzdGF0aWMgdm9pZCBtYXJzaGFsRmF1bHRSZXNwb25zZShUaHJvd2FibGUgdGhyb3dhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcnNoYWxTZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uIG1hcnNoYWxEZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhdGlvbkRlc2NyaXB0aW9uIG9wZXJhdGlvbkRlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSBtZXNzYWdlKSB7Ci0gICAgICAgIC8vIEdldCB0aGUgcm9vdCBjYXVzZSBvZiB0aGUgdGhyb3dhYmxlIG9iamVjdAotICAgICAgICBUaHJvd2FibGUgdCA9IENsYXNzVXRpbHMuZ2V0Um9vdENhdXNlKHRocm93YWJsZSk7Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJNYXJzaGFsIFRocm93YWJsZSA9IiArIHRocm93YWJsZS5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIiAgcm9vdENhdXNlID0iICsgdC5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIiAgZXhjZXB0aW9uPSIgKyB0LnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgbG9nLmRlYnVnKCIgIHN0YWNrPSIgKyBzdGFja1RvU3RyaW5nKHQpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFhNTEZhdWx0IHhtbGZhdWx0ID0gbnVsbDsKLQotICAgICAgICB0cnkgewotCi0gICAgICAgICAgICAvLyBUaGVyZSBhcmUgNSBkaWZmZXJlbnQgY2F0ZWdvcmllcyBvZiBleGNlcHRpb25zLiAgCi0gICAgICAgICAgICAvLyBFYWNoIGNhdGVnb3J5IGhhcyBhIGxpdHRsZSBkaWZmZXJlbnQgbWFyc2hhbGluZyBjb2RlLgotICAgICAgICAgICAgLy8gQSkgU2VydmljZSBFeGNlcHRpb24gdGhhdCBtYXRjaGVzIHRoZSBKQVgtV1MgCi0gICAgICAgICAgICAvLyAgICBzcGVjaWZpY2F0aW9uIChjaGFwdGVyIDIuNSBvZiB0aGUgc3BlYykKLSAgICAgICAgICAgIC8vIEIpIFNlcnZpY2UgRXhjZXB0aW9uIHRoYXQgbWF0Y2hlcyB0aGUgSkFYLVdTICJsZWdhY3kiIAotICAgICAgICAgICAgLy8gICAgZXhjZXB0aW9uIChjaGFwdGVyIDMuNyBvZiB0aGUgc3BlYykKLSAgICAgICAgICAgIC8vIEMpIFNPQVBGYXVsdEV4Y2VwdGlvbgotICAgICAgICAgICAgLy8gRCkgV2ViU2VydmljZUV4Y2VwdGlvbgotICAgICAgICAgICAgLy8gRSkgT3RoZXIgcnVudGltZSBleGNlcHRpb25zIChpLmUuIE51bGxQb2ludGVyRXhjZXB0aW9uKQotCi0gICAgICAgICAgICAvLyBHZXQgdGhlIEZhdWx0RGVzY3JpcHRvciBtYXRjaGluZyB0aGlzIEV4Y2VwdGlvbi4KLSAgICAgICAgICAgIC8vIElmIEZhdWx0RGVzY3JpcHRvciBpcyBmb3VuZCwgdGhpcyBpcyBhIEpBWC1CIFNlcnZpY2UgRXhjZXB0aW9uLgotICAgICAgICAgICAgLy8gSWYgbm90IGZvdW5kLCB0aGlzIGlzIGEgU3lzdGVtIEV4Y2VwdGlvbgotICAgICAgICAgICAgRmF1bHREZXNjcmlwdGlvbiBmZCA9Ci0gICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbkRlc2MucmVzb2x2ZUZhdWx0QnlFeGNlcHRpb25OYW1lKHQuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkpOwotCi0gICAgICAgICAgICBpZiAoZmQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNFcnJvckVuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIk1hcnNoYWwgYXMgYSBTZXJ2aWNlIEV4Y2VwdGlvbiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBDcmVhdGUgdGhlIEpBWEIgQ29udGV4dAotICAgICAgICAgICAgICAgIEpBWEJCbG9ja0NvbnRleHQgY29udGV4dCA9IG5ldyBKQVhCQmxvY2tDb250ZXh0KG1hcnNoYWxEZXNjLmdldFBhY2thZ2VzKCkpOwotCi0gICAgICAgICAgICAgICAgLy8gVGhlIGV4Y2VwdGlvbiBpcyBhIFNlcnZpY2UgRXhjZXB0aW9uLiAgCi0gICAgICAgICAgICAgICAgLy8gSXQgbWF5IGJlIChBKSBKQVgtV1MgY29tcGxpYW50IGV4Y2VwdGlvbiBvciAKLSAgICAgICAgICAgICAgICAvLyAoQikgSkFYLVdTIGxlZ2FjeSBleGNlcHRpb24KLQotICAgICAgICAgICAgICAgIC8vIFRoZSBmYXVsdEJlYW5PYmplY3QgaXMgYSBKQVhCIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIGRhdGEgb2YgdGhlIGV4Y2VwdGlvbi4KLSAgICAgICAgICAgICAgICAvLyBJdCBpcyBtYXJzaGFsbGVkIGluIHRoZSBkZXRhaWwgc2VjdGlvbiBvZiB0aGUgc29hcCBmYXVsdC4gIAotICAgICAgICAgICAgICAgIC8vIFRoZSBmYXVsdEJlYW5PYmplY3QgaXMgb2J0YWluZWQgZGlyZWN0aW9uIGZyb20gdGhlIGV4Y2VwdGlvbiAoQSkgb3IgdmlhIAotICAgICAgICAgICAgICAgIC8vIHRoZSBsZWdhY3kgZXhjZXB0aW9uIHJ1bGVzIChCKS4KLSAgICAgICAgICAgICAgICBPYmplY3QgZmF1bHRCZWFuT2JqZWN0ID0gbnVsbDsKLQotICAgICAgICAgICAgICAgIEZhdWx0QmVhbkRlc2MgZmF1bHRCZWFuRGVzYyA9IG1hcnNoYWxEZXNjLmdldEZhdWx0QmVhbkRlc2MoZmQpOwotICAgICAgICAgICAgICAgIFN0cmluZyBmYXVsdEluZm8gPSBmZC5nZXRGYXVsdEluZm8oKTsKLSAgICAgICAgICAgICAgICBpZiAoZmF1bHRJbmZvID09IG51bGwgfHwgZmF1bHRJbmZvLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gTGVnYWN5IEV4Y2VwdGlvbiBjYXNlCi0gICAgICAgICAgICAgICAgICAgIGZhdWx0QmVhbk9iamVjdCA9IExlZ2FjeUV4Y2VwdGlvblV0aWwuY3JlYXRlRmF1bHRCZWFuKHQsIGZkLCBtYXJzaGFsRGVzYyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gTm9ybWFsIGNhc2UKLSAgICAgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBmYXVsdCBiZWFuIG9iamVjdC4gIAotICAgICAgICAgICAgICAgICAgICBNZXRob2QgZ2V0RmF1bHRJbmZvID0gdC5nZXRDbGFzcygpLmdldE1ldGhvZCgiZ2V0RmF1bHRJbmZvIiwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgIGZhdWx0QmVhbk9iamVjdCA9IGdldEZhdWx0SW5mby5pbnZva2UodCwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0Vycm9yRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiVGhlIGZhdWx0QmVhbiB0eXBlIGlzIiArIGZhdWx0QmVhbk9iamVjdC5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gVXNlICJieSBqYXZhIHR5cGUiIG1hcnNoYWxsaW5nIGlmIG5lY2Vzc2FyeQotICAgICAgICAgICAgICAgIGlmIChmYXVsdEJlYW5PYmplY3QgPT0gdCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnRleHQuZ2V0Q29uc3RydWN0aW9uVHlwZSgpICE9IEpBWEJVdGlscy5DT05TVFJVQ1RJT05fVFlQRQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuQllfQ09OVEVYVF9QQVRIICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzTm90SkFYQlJvb3RFbGVtZW50KGZhdWx0QmVhbk9iamVjdC5nZXRDbGFzcygpLCBtYXJzaGFsRGVzYykpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0UHJvY2Vzc1R5cGUoZmF1bHRCZWFuT2JqZWN0LmdldENsYXNzKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIFFOYW1lIGZhdWx0QmVhblFOYW1lID0gbmV3IFFOYW1lKGZhdWx0QmVhbkRlc2MuZ2V0RmF1bHRCZWFuTmFtZXNwYWNlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmF1bHRCZWFuRGVzYy5nZXRGYXVsdEJlYW5Mb2NhbE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBmYXVsdEJlYW5PYmplY3QgY2FuIGJlIG1hcnNoYWxsZWQgYXMgYW4gZWxlbWVudAotICAgICAgICAgICAgICAgIGlmICghbWFyc2hhbERlc2MuZ2V0QW5ub3RhdGlvbkRlc2MoZmF1bHRCZWFuT2JqZWN0LmdldENsYXNzKCkpLgotICAgICAgICAgICAgICAgICAgICAgICAgaGFzWG1sUm9vdEVsZW1lbnQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZhdWx0QmVhbk9iamVjdCA9IG5ldyBKQVhCRWxlbWVudChmYXVsdEJlYW5RTmFtZSwgZmF1bHRCZWFuT2JqZWN0LmdldENsYXNzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYXVsdEJlYW5PYmplY3QpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIGRldGFpbGJsb2NrIHJlcHJlc2VudGluZyB0aGUgZmF1bHRCZWFuT2JqZWN0Ci0gICAgICAgICAgICAgICAgQmxvY2tbXSBkZXRhaWxCbG9ja3MgPSBuZXcgQmxvY2tbMV07Ci0gICAgICAgICAgICAgICAgZGV0YWlsQmxvY2tzWzBdID0gZmFjdG9yeS5jcmVhdGVGcm9tKGZhdWx0QmVhbk9iamVjdCwgY29udGV4dCwgZmF1bHRCZWFuUU5hbWUpOwotCi0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ3JlYXRlIHRoZSB4bWxGYXVsdCBmb3IgdGhlIFNlcnZpY2UgRXhjZXB0aW9uIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgZmF1bHQgdGV4dCB1c2luZyBhbGdvcml0aG0gZGVmaW5lZCBpbiBKQVgtV1MgMTAuMi4yLjMKLSAgICAgICAgICAgICAgICBTdHJpbmcgdGV4dCA9IHQuZ2V0TWVzc2FnZSgpOwotICAgICAgICAgICAgICAgIGlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRleHQgPSB0LnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIE5vdyBtYWtlIGEgWE1MRmF1bHQgY29udGFpbmluZyB0aGUgZGV0YWlsYmxvY2sKLSAgICAgICAgICAgICAgICB4bWxmYXVsdCA9IG5ldyBYTUxGYXVsdChudWxsLCBuZXcgWE1MRmF1bHRSZWFzb24odGV4dCksIGRldGFpbEJsb2Nrcyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHhtbGZhdWx0ID0gY3JlYXRlWE1MRmF1bHRGcm9tU3lzdGVtRXhjZXB0aW9uKHQpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkgewotICAgICAgICAgICAgLy8gSWYgYW4gZXhjZXB0aW9uIG9jY3VycyB3aGlsZSBkZW1hcnNoYWxsaW5nIGFuIGV4Y2VwdGlvbiwgCi0gICAgICAgICAgICAvLyB0aGVuIHJpbnNlIGFuZCByZXBlYXQgd2l0aCBhIHN5c3RlbSBleGNlcHRpb24KLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQW4gZXhjZXB0aW9uICgiICsgZSArICIpIG9jY3VycmVkIHdoaWxlIG1hcnNoYWxsaW5nIGV4Y2VwdGlvbiAoIiArIHQgKwotICAgICAgICAgICAgICAgICAgICAgICAgIikiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFdlYlNlcnZpY2VFeGNlcHRpb24gd3NlID0gRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIHhtbGZhdWx0ID0gY3JlYXRlWE1MRmF1bHRGcm9tU3lzdGVtRXhjZXB0aW9uKHdzZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBBZGQgdGhlIGZhdWx0IHRvIHRoZSBtZXNzYWdlCi0gICAgICAgIG1lc3NhZ2Uuc2V0WE1MRmF1bHQoeG1sZmF1bHQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgYnkgV2ViU2VydmljZSBJbXBsIGFuZCBQcm92aWRlciB0byBjcmVhdGUgYW4gWE1MRmF1bHQgKGZvciBtYXJzaGFsbGluZykKLSAgICAgKiBmcm9tIGFuIGV4Y2VwdGlvbiB0aGF0IGlzIGEgbm9uLXNlcnZpY2UgZXhjZXB0aW9uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdCBUaHJvd2FibGUgdGhhdCByZXByZXNlbnRzIGEgU2VydmljZSBFeGNlcHRpb24KLSAgICAgKiBAcmV0dXJuIFhNTEZhdWx0Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBYTUxGYXVsdCBjcmVhdGVYTUxGYXVsdEZyb21TeXN0ZW1FeGNlcHRpb24oVGhyb3dhYmxlIHQpIHsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgWE1MRmF1bHQgeG1sZmF1bHQgPSBudWxsOwotICAgICAgICAgICAgaWYgKHQgaW5zdGFuY2VvZiBTT0FQRmF1bHRFeGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzRXJyb3JFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJNYXJzaGFsIFNPQVBGYXVsdEV4Y2VwdGlvbiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBDYXRlZ29yeSBDOiBTT0FQRmF1bHRFeGNlcHRpb24gCi0gICAgICAgICAgICAgICAgLy8gQ29uc3RydWN0IHRoZSB4bWxGYXVsdCBmcm9tIHRoZSBTT0FQRmF1bHRFeGNlcHRpb24ncyBGYXVsdAotICAgICAgICAgICAgICAgIFNPQVBGYXVsdEV4Y2VwdGlvbiBzZmUgPSAoU09BUEZhdWx0RXhjZXB0aW9uKXQ7Ci0gICAgICAgICAgICAgICAgU09BUEZhdWx0IHNvYXBGYXVsdCA9IHNmZS5nZXRGYXVsdCgpOwotICAgICAgICAgICAgICAgIGlmIChzb2FwRmF1bHQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAvLyBObyBmYXVsdCA/ICBJIHdpbGwgdHJlYXQgdGhpcyBsaWtlIGNhdGVnb3J5IEUKLSAgICAgICAgICAgICAgICAgICAgeG1sZmF1bHQgPSAKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYTUxGYXVsdChudWxsLCAgICAgICAvLyBVc2UgdGhlIGRlZmF1bHQgWE1MRmF1bHRDb2RlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhNTEZhdWx0UmVhc29uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQudG9TdHJpbmcoKSkpOyAgLy8gQXNzdW1lcyB0ZXh0IGxhbmcgb2YgY3VycmVudCBMb2NhbGUKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB4bWxmYXVsdCA9IFhNTEZhdWx0VXRpbHMuY3JlYXRlWE1MRmF1bHQoc29hcEZhdWx0KTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAodCBpbnN0YW5jZW9mIFdlYlNlcnZpY2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzRXJyb3JFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJNYXJzaGFsIGFzIGEgV2ViU2VydmljZUV4Y2VwdGlvbiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBDYXRlZ29yeSBEOiBXZWJTZXJ2aWNlRXhjZXB0aW9uCi0gICAgICAgICAgICAgICAgLy8gVGhlIHJlYXNvbiBpcyBjb25zdHJ1Y3RlZCB3aXRoIHRoZSBnZXRNZXNzYWdlIG9mIHRoZSBleGNlcHRpb24uICAKLSAgICAgICAgICAgICAgICAvLyBUaGVyZSBpcyBubyBkZXRhaWwKLSAgICAgICAgICAgICAgICBXZWJTZXJ2aWNlRXhjZXB0aW9uIHdzZSA9IChXZWJTZXJ2aWNlRXhjZXB0aW9uKXQ7Ci0KLSAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIGZhdWx0IHRleHQgdXNpbmcgYWxnb3JpdGhtIGRlZmluZWQgaW4gSkFYLVdTIDEwLjIuMi4zCi0gICAgICAgICAgICAgICAgU3RyaW5nIHRleHQgPSB3c2UuZ2V0TWVzc2FnZSgpOwotICAgICAgICAgICAgICAgIGlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRleHQgPSB3c2UudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgeG1sZmF1bHQgPSBuZXcgWE1MRmF1bHQobnVsbCwgICAgICAgLy8gVXNlIHRoZSBkZWZhdWx0IFhNTEZhdWx0Q29kZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYTUxGYXVsdFJlYXNvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQpKTsgIC8vIEFzc3VtZXMgdGV4dCBsYW5nIG9mIGN1cnJlbnQgTG9jYWxlCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNFcnJvckVuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIk1hcnNoYWwgYXMgYSB1bmNoZWNrZWQgU3lzdGVtIEV4Y2VwdGlvbiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBDYXRlZ29yeSBFOiBPdGhlciBTeXN0ZW0gRXhjZXB0aW9uCi0gICAgICAgICAgICAgICAgLy8gVGhlIHJlYXNvbiBpcyBjb25zdHJ1Y3RlZCB3aXRoIHRoZSB0b1N0cmluZyBvZiB0aGUgZXhjZXB0aW9uLiAgCi0gICAgICAgICAgICAgICAgLy8gVGhpcyBwbGFjZXMgdGhlIGNsYXNzIG5hbWUgb2YgdGhlIGV4Y2VwdGlvbiBpbiB0aGUgcmVhc29uCi0gICAgICAgICAgICAgICAgLy8gVGhlcmUgaXMgbm8gZGV0YWlsLgotICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgZmF1bHQgdGV4dCB1c2luZyBhbGdvcml0aG0gZGVmaW5lZCBpbiBKQVgtV1MgMTAuMi4yLjMKLSAgICAgICAgICAgICAgICBTdHJpbmcgdGV4dCA9IHQuZ2V0TWVzc2FnZSgpOwotICAgICAgICAgICAgICAgIGlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRleHQgPSB0LnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHhtbGZhdWx0ID0gbmV3IFhNTEZhdWx0KG51bGwsICAgICAgIC8vIFVzZSB0aGUgZGVmYXVsdCBYTUxGYXVsdENvZGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWE1MRmF1bHRSZWFzb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0KSk7ICAvLyBBc3N1bWVzIHRleHQgbGFuZyBvZiBjdXJyZW50IExvY2FsZQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHhtbGZhdWx0OwotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAvLyBJZiBhbiBleGNlcHRpb24gb2NjdXJzIHdoaWxlIGRlbWFyc2hhbGxpbmcgYW4gZXhjZXB0aW9uLCAKLSAgICAgICAgICAgICAgICAvLyB0aGVuIHJpbnNlIGFuZCByZXBlYXQgd2l0aCBhIHdlYnNlcnZpY2UgZXhjZXB0aW9uCi0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQW4gZXhjZXB0aW9uICgiICsgZSArICIpIG9jY3VycmVkIHdoaWxlIG1hcnNoYWxsaW5nIGV4Y2VwdGlvbiAoIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdCArICIpIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgZmF1bHQgdGV4dCB1c2luZyBhbGdvcml0aG0gZGVmaW5lZCBpbiBKQVgtV1MgMTAuMi4yLjMKLSAgICAgICAgICAgICAgICBTdHJpbmcgdGV4dCA9IGUuZ2V0TWVzc2FnZSgpOwotICAgICAgICAgICAgICAgIGlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRleHQgPSBlLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFdlYlNlcnZpY2VFeGNlcHRpb24gd3NlID0gRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWE1MRmF1bHQobnVsbCwgICAgICAgLy8gVXNlIHRoZSBkZWZhdWx0IFhNTEZhdWx0Q29kZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhNTEZhdWx0UmVhc29uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0KSk7ICAvLyBBc3N1bWVzIHRleHQgbGFuZyBvZiBjdXJyZW50IExvY2FsZQotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUyKSB7Ci0gICAgICAgICAgICAgICAgLy8gRXhjZXB0aW9uIHdoaWxlIGNyZWF0aW5nIEV4Y2VwdGlvbiBmb3IgRXhjZXB0aW9uCi0gICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlMik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVbm1hcnNoYWwgdGhlIHNlcnZpY2Uvc3lzdGVtIGV4Y2VwdGlvbiBmcm9tIGEgTWVzc2FnZS4gVGhpcyBpcyB1c2VkIGJ5IGFsbCBvZiB0aGUKLSAgICAgKiBtYXJzaGFsbGVycwotICAgICAqCi0gICAgICogQHBhcmFtIG9wZXJhdGlvbkRlc2MKLSAgICAgKiBAcGFyYW0gbWFyc2hhbERlc2MKLSAgICAgKiBAcGFyYW0gbWVzc2FnZQotICAgICAqIEByZXR1cm4gVGhyb3dhYmxlCi0gICAgICogQHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbgotICAgICAqLwotICAgIHN0YXRpYyBUaHJvd2FibGUgZGVtYXJzaGFsRmF1bHRSZXNwb25zZShPcGVyYXRpb25EZXNjcmlwdGlvbiBvcGVyYXRpb25EZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXJzaGFsU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbiBtYXJzaGFsRGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSBtZXNzYWdlKQotICAgICAgICAgICAgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sCi0gICAgICAgICAgICBJbnN0YW50aWF0aW9uRXhjZXB0aW9uLCBYTUxTdHJlYW1FeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sCi0gICAgICAgICAgICBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotCi0gICAgICAgIFRocm93YWJsZSBleGNlcHRpb24gPSBudWxsOwotICAgICAgICAKLSAgICAgICAgLy8gR2V0IHRoZSBmYXVsdCBmcm9tIHRoZSBtZXNzYWdlIGFuZCBnZXQgdGhlIGRldGFpbCBibG9ja3MgKHByb2JhYmx5IG9uZSkKLSAgICAgICAgWE1MRmF1bHQgeG1sZmF1bHQgPSBtZXNzYWdlLmdldFhNTEZhdWx0KCk7Ci0gICAgICAgIEJsb2NrW10gZGV0YWlsQmxvY2tzID0geG1sZmF1bHQuZ2V0RGV0YWlsQmxvY2tzKCk7Ci0KLSAgICAgICAgLy8gSWYgdGhlcmUgaXMgb25seSBvbmUgYmxvY2ssIGdldCB0aGUgZWxlbWVudCBuYW1lIG9mIHRoYXQgYmxvY2suCi0gICAgICAgIFFOYW1lIGVsZW1lbnRRTmFtZSA9IG51bGw7Ci0gICAgICAgIGlmIChkZXRhaWxCbG9ja3MgIT0gbnVsbCAmJiBkZXRhaWxCbG9ja3MubGVuZ3RoID09IDEpIHsKLSAgICAgICAgICAgIGVsZW1lbnRRTmFtZSA9IGRldGFpbEJsb2Nrc1swXS5nZXRRTmFtZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVXNlIHRoZSBlbGVtZW50IG5hbWUgdG8gZmluZCB0aGUgbWF0Y2hpbmcgRmF1bHREZXNjcmlwdG9yCi0gICAgICAgIEZhdWx0RGVzY3JpcHRpb24gZmF1bHREZXNjID0gbnVsbDsKLSAgICAgICAgaWYgKGVsZW1lbnRRTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG9wZXJhdGlvbkRlc2MuZ2V0RmF1bHREZXNjcmlwdGlvbnMoKS5sZW5ndGggJiYgZmF1bHREZXNjID09IG51bGw7Ci0gICAgICAgICAgICAgICAgIGkrKykgewotICAgICAgICAgICAgICAgIEZhdWx0RGVzY3JpcHRpb24gZmQgPSBvcGVyYXRpb25EZXNjLmdldEZhdWx0RGVzY3JpcHRpb25zKClbaV07Ci0gICAgICAgICAgICAgICAgRmF1bHRCZWFuRGVzYyBmYXVsdEJlYW5EZXNjID0gbWFyc2hhbERlc2MuZ2V0RmF1bHRCZWFuRGVzYyhmZCk7Ci0KLQkJCQlpZiAoZmF1bHRCZWFuRGVzYyAhPSBudWxsKSB7Ci0JCQkJCVFOYW1lIHRyeVFOYW1lID0gbmV3IFFOYW1lKGZhdWx0QmVhbkRlc2MuZ2V0RmF1bHRCZWFuTmFtZXNwYWNlKCksCi0JCQkJCQkJZmF1bHRCZWFuRGVzYy5nZXRGYXVsdEJlYW5Mb2NhbE5hbWUoKSk7Ci0JCQkJCWlmIChsb2cuaXNFcnJvckVuYWJsZWQoKSkgewotCQkJCQkJbG9nLmRlYnVnKCIgIEZhdWx0RGVzY3JpcHRpb24gcW5hbWUgaXMgKCIgKyB0cnlRTmFtZSArCi0JCQkJCQkJCSIpIGFuZCBkZXRhaWwgZWxlbWVudCBxbmFtZSBpcyAoIiArIGVsZW1lbnRRTmFtZSArICIpIik7Ci0JCQkJCX0KLQotCQkJCQlpZiAoZWxlbWVudFFOYW1lLmVxdWFscyh0cnlRTmFtZSkpIHsKLQkJCQkJCWZhdWx0RGVzYyA9IGZkOwotCQkJCQl9Ci0JCQkJfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGZhdWx0RGVzYyA9PSBudWxsICYmIGVsZW1lbnRRTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBJZiBub3QgZm91bmQsIHJldHJ5IHRoZSBzZWFyY2ggdXNpbmcganVzdCB0aGUgbG9jYWwgbmFtZQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvcGVyYXRpb25EZXNjLmdldEZhdWx0RGVzY3JpcHRpb25zKCkubGVuZ3RoICYmIGZhdWx0RGVzYyA9PSBudWxsOwotICAgICAgICAgICAgICAgICBpKyspIHsKLSAgICAgICAgICAgICAgICBGYXVsdERlc2NyaXB0aW9uIGZkID0gb3BlcmF0aW9uRGVzYy5nZXRGYXVsdERlc2NyaXB0aW9ucygpW2ldOwotICAgICAgICAgICAgICAgIEZhdWx0QmVhbkRlc2MgZmF1bHRCZWFuRGVzYyA9IG1hcnNoYWxEZXNjLmdldEZhdWx0QmVhbkRlc2MoZmQpOwotICAgICAgICAgICAgICAgIGlmIChmYXVsdEJlYW5EZXNjICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAJU3RyaW5nIHRyeU5hbWUgPSBmYXVsdEJlYW5EZXNjLmdldEZhdWx0QmVhbkxvY2FsTmFtZSgpOwotICAgICAgICAgICAgICAgIAlpZiAoZWxlbWVudFFOYW1lLmdldExvY2FsUGFydCgpLmVxdWFscyh0cnlOYW1lKSkgewotICAgICAgICAgICAgICAgIAkJZmF1bHREZXNjID0gZmQ7Ci0gICAgICAgICAgICAgICAgCX0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotCi0gICAgICAgIGlmIChmYXVsdERlc2MgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gVGhpcyBpcyBhIHN5c3RlbSBleGNlcHRpb24gaWYgdGhlIG1ldGhvZCBkb2VzIG5vdCB0aHJvdyBhIGNoZWNrZWQgZXhjZXB0aW9uIG9yIGlmCi0gICAgICAgICAgICAvLyB0aGUgZGV0YWlsIGJsb2NrIGlzIG1pc3Npbmcgb3IgY29udGFpbnMgbXVsdGlwbGUgaXRlbXMuCi0gICAgICAgICAgICBleGNlcHRpb24gPSBjcmVhdGVTeXN0ZW1FeGNlcHRpb24oeG1sZmF1bHQsIG1lc3NhZ2UpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGxvZy5pc0Vycm9yRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJSZWFkeSB0byBkZW1hcnNoYWwgc2VydmljZSBleGNlcHRpb24uICBUaGUgZGV0YWlsIGVudHJ5IG5hbWUgaXMgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50UU5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgRmF1bHRCZWFuRGVzYyBmYXVsdEJlYW5EZXNjID0gbWFyc2hhbERlc2MuZ2V0RmF1bHRCZWFuRGVzYyhmYXVsdERlc2MpOwotICAgICAgICAgICAgYm9vbGVhbiBpc0xlZ2FjeSA9Ci0gICAgICAgICAgICAgICAgICAgIChmYXVsdERlc2MuZ2V0RmF1bHRJbmZvKCkgPT0gbnVsbCB8fCBmYXVsdERlc2MuZ2V0RmF1bHRJbmZvKCkubGVuZ3RoKCkgPT0gMCk7Ci0KLSAgICAgICAgICAgIC8vIEdldCB0aGUgSkFYQiBvYmplY3QgZnJvbSB0aGUgYmxvY2sKLSAgICAgICAgICAgIEpBWEJCbG9ja0NvbnRleHQgYmxvY2tDb250ZXh0ID0gbmV3IEpBWEJCbG9ja0NvbnRleHQobWFyc2hhbERlc2MuZ2V0UGFja2FnZXMoKSk7Ci0KLSAgICAgICAgICAgIC8vIE5vdGUgdGhhdCBmYXVsdEJlYW4gbWF5IG5vdCBiZSBhIGJlYW4sIGl0IGNvdWxkIGJlIGEgcHJpbWl0aXZlIAotICAgICAgICAgICAgQ2xhc3MgZmF1bHRCZWFuRm9ybWFsQ2xhc3M7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGZhdWx0QmVhbkZvcm1hbENsYXNzID0gbG9hZENsYXNzKGZhdWx0QmVhbkRlc2MuZ2V0RmF1bHRCZWFuQ2xhc3NOYW1lKCkpOwotICAgICAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKXsKLSAgICAgICAgICAgICAgICBmYXVsdEJlYW5Gb3JtYWxDbGFzcyA9IGxvYWRDbGFzcyhmYXVsdEJlYW5EZXNjLmdldEZhdWx0QmVhbkNsYXNzTmFtZSgpLCBvcGVyYXRpb25EZXNjLmdldEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24oKS5nZXRFbmRwb2ludERlc2NyaXB0aW9uKCkuZ2V0QXhpc1NlcnZpY2UoKS5nZXRDbGFzc0xvYWRlcigpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gVXNlICJieSBqYXZhIHR5cGUiIG1hcnNoYWxsaW5nIGlmIG5lY2Vzc2FyeQotICAgICAgICAgICAgaWYgKGJsb2NrQ29udGV4dC5nZXRDb25zdHJ1Y3Rpb25UeXBlKCkgIT0gCi0gICAgICAgICAgICAgICAgSkFYQlV0aWxzLkNPTlNUUlVDVElPTl9UWVBFLkJZX0NPTlRFWFRfUEFUSCAmJgotICAgICAgICAgICAgICAgICAgICBpc05vdEpBWEJSb290RWxlbWVudChmYXVsdEJlYW5Gb3JtYWxDbGFzcywgbWFyc2hhbERlc2MpKSB7Ci0gICAgICAgICAgICAgICAgYmxvY2tDb250ZXh0LnNldFByb2Nlc3NUeXBlKGZhdWx0QmVhbkZvcm1hbENsYXNzKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gR2V0IHRoZSBqYXhiIGJsb2NrIGFuZCBidXNpbmVzcyBvYmplY3QKLSAgICAgICAgICAgIEJsb2NrIGpheGJCbG9jayA9IGZhY3RvcnkuY3JlYXRlRnJvbShkZXRhaWxCbG9ja3NbMF0sIGJsb2NrQ29udGV4dCk7Ci0gICAgICAgICAgICBPYmplY3QgZmF1bHRCZWFuT2JqZWN0ID0gamF4YkJsb2NrLmdldEJ1c2luZXNzT2JqZWN0KHRydWUpOwotCi0gICAgICAgICAgICAvLyBBdCB0aGlzIHBvaW50LCBmYXVsdEJlYW5PYmplY3QgaXMgYW4gb2JqZWN0IHRoYXQgY2FuIGJlIHJlbmRlcmVkIGFzIGFuCi0gICAgICAgICAgICAvLyBlbGVtZW50LiAgV2Ugd2FudCB0aGUgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgdHlwZS4KLSAgICAgICAgICAgIGlmIChmYXVsdEJlYW5PYmplY3QgaW5zdGFuY2VvZiBKQVhCRWxlbWVudCkgewotICAgICAgICAgICAgICAgIGZhdWx0QmVhbk9iamVjdCA9ICgoSkFYQkVsZW1lbnQpZmF1bHRCZWFuT2JqZWN0KS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobG9nLmlzRXJyb3JFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlVubWFyc2hhbGxlZCB0aGUgZGV0YWlsIGVsZW1lbnQgaW50byBhIEpBWEIgb2JqZWN0Iik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIENvbnN0cnVjdCB0aGUgSkFYLVdTIGdlbmVyYXRlZCBleGNlcHRpb24gdGhhdCBob2xkcyB0aGUgZmF1bHRCZWFuT2JqZWN0Ci0gICAgICAgICAgICBDbGFzcyBleGNlcHRpb25DbGFzczsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgZXhjZXB0aW9uQ2xhc3MgPSBsb2FkQ2xhc3MoZmF1bHREZXNjLmdldEV4Y2VwdGlvbkNsYXNzTmFtZSgpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgICAgICAgZXhjZXB0aW9uQ2xhc3MgPSBsb2FkQ2xhc3MoZmF1bHREZXNjLmdldEV4Y2VwdGlvbkNsYXNzTmFtZSgpLCBvcGVyYXRpb25EZXNjLmdldEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24oKS5nZXRFbmRwb2ludERlc2NyaXB0aW9uKCkuZ2V0QXhpc1NlcnZpY2UoKS5nZXRDbGFzc0xvYWRlcigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChsb2cuaXNFcnJvckVuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiRm91bmQgRmF1bHREZXNjcmlwdGlvbi4gIFRoZSBleGNlcHRpb24gbmFtZSBpcyAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbkNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBleGNlcHRpb24gPSBjcmVhdGVTZXJ2aWNlRXhjZXB0aW9uKHhtbGZhdWx0LmdldFJlYXNvbigpLmdldFRleHQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uQ2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhdWx0QmVhbk9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmF1bHRCZWFuRm9ybWFsQ2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcnNoYWxEZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0xlZ2FjeSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGV4Y2VwdGlvbjsKLSAgICB9Ci0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAcGFyYW0gcGRzCi0gICAgICogQHJldHVybiBOdW1iZXIgb2YgaW5vdXQgb3Igb3V0IHBhcmFtZXRlcnMKLSAgICAgKi8KLSAgICBzdGF0aWMgaW50IG51bU91dHB1dEJvZHlQYXJhbXMoUGFyYW1ldGVyRGVzY3JpcHRpb25bXSBwZHMpIHsKLSAgICAgICAgaW50IGNvdW50ID0gMDsKLSAgICAgICAgZm9yIChpbnQgaT0wOyBpPHBkcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgLy8gVE9ETyBOZWVkIHRvIGNoYW5nZSB0aGlzIHRvIGFsc28gZGV0ZWN0IG5vdCBhdHRhY2htZW50Ci0gICAgICAgICAgICBpZiAoIXBkc1tpXS5pc0hlYWRlcigpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBkc1tpXS5nZXRNb2RlKCkgPT0gTW9kZS5JTk9VVCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgcGRzW2ldLmdldE1vZGUoKSA9PSBNb2RlLk9VVCkgewotICAgICAgICAgICAgICAgICAgICBjb3VudCsrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY291bnQ7Ci0gICAgfQotICAgIAotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHZhbHVlCi0gICAgICogQHJldHVybiBpZiBhc3luYyBoYW5kbGVyCi0gICAgICovCi0gICAgc3RhdGljIGJvb2xlYW4gaXNBc3luY0hhbmRsZXIoT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiAodmFsdWUgaW5zdGFuY2VvZiBBc3luY0hhbmRsZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB2YWx1ZSBpcyBob2xkZXIKLSAgICAgKi8KLSAgICBzdGF0aWMgYm9vbGVhbiBpc0hvbGRlcihPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgSG9sZGVyLmNsYXNzLmlzQXNzaWduYWJsZUZyb20odmFsdWUuZ2V0Q2xhc3MoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JhdGUgYSBIb2xkZXIKLSAgICAgKgotICAgICAqIEBwYXJhbSA8VD4KLSAgICAgKiBAcGFyYW0gcGFyYW1UeXBlCi0gICAgICogQHBhcmFtIHZhbHVlCi0gICAgICogQHJldHVybgotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbgotICAgICAqLwotICAgIHN0YXRpYyA8VD4gSG9sZGVyPFQ+IGNyZWF0ZUhvbGRlcihDbGFzcyBwYXJhbVR5cGUsIFQgdmFsdWUpCi0gICAgICAgICAgICB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChIb2xkZXIuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShwYXJhbVR5cGUpKSB7Ci0gICAgICAgICAgICBIb2xkZXIgaG9sZGVyID0gKEhvbGRlcikgcGFyYW1UeXBlLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICBob2xkZXIudmFsdWUgPSB2YWx1ZTsKLSAgICAgICAgICAgIHJldHVybiBob2xkZXI7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTG9hZCB0aGUgY2xhc3MKLSAgICAgKgotICAgICAqIEBwYXJhbSBjbGFzc05hbWUKLSAgICAgKiBAcmV0dXJuIGxvYWRlZCBjbGFzcwotICAgICAqIEB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbgotICAgICAqLwotICAgIHN0YXRpYyBDbGFzcyBsb2FkQ2xhc3MoU3RyaW5nIGNsYXNzTmFtZSkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICAvLyBEb24ndCBtYWtlIHRoaXMgcHVibGljLCBpdHMgYSBzZWN1cml0eSBleHBvc3VyZQotICAgICAgICBDbGFzcyBjbHMgPSBDbGFzc1V0aWxzLmdldFByaW1pdGl2ZUNsYXNzKGNsYXNzTmFtZSk7Ci0gICAgICAgIGlmIChjbHMgPT0gbnVsbCkgewotICAgICAgICAgICAgY2xzID0gZm9yTmFtZShjbGFzc05hbWUsIHRydWUsIGdldENvbnRleHRDbGFzc0xvYWRlcigpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY2xzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIExvYWQgdGhlIGNsYXNzCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2xhc3NOYW1lCi0gICAgICogQHJldHVybiBsb2FkZWQgY2xhc3MKLSAgICAgKiBAdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24KLSAgICAgKi8KLSAgICBzdGF0aWMgQ2xhc3MgbG9hZENsYXNzKFN0cmluZyBjbGFzc05hbWUsIENsYXNzTG9hZGVyIGNsKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIERvbid0IG1ha2UgdGhpcyBwdWJsaWMsIGl0cyBhIHNlY3VyaXR5IGV4cG9zdXJlCi0gICAgICAgIENsYXNzIGNscyA9IENsYXNzVXRpbHMuZ2V0UHJpbWl0aXZlQ2xhc3MoY2xhc3NOYW1lKTsKLSAgICAgICAgaWYgKGNscyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBjbHMgPSBmb3JOYW1lKGNsYXNzTmFtZSwgdHJ1ZSwgY2wpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjbHM7Ci0gICAgfQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgY2xhc3MgZm9yIHRoaXMgbmFtZQotICAgICAqCi0gICAgICogQHJldHVybiBDbGFzcwotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIENsYXNzIGZvck5hbWUoZmluYWwgU3RyaW5nIGNsYXNzTmFtZSwgZmluYWwgYm9vbGVhbiBpbml0aWFsaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gTk9URTogVGhpcyBtZXRob2QgbXVzdCByZW1haW4gcHJpdmF0ZSBiZWNhdXNlIGl0IHVzZXMgQWNjZXNzQ29udHJvbGxlcgotICAgICAgICBDbGFzcyBjbCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjbCA9IChDbGFzcylBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgKLSAgICAgICAgICAgICAgICAgICAgbmV3IFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDbGFzcy5mb3JOYW1lIGRvZXMgbm90IHN1cHBvcnQgcHJpbWl0aXZlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzIGNscyA9IENsYXNzVXRpbHMuZ2V0UHJpbWl0aXZlQ2xhc3MoY2xhc3NOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xzID0gQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUsIGluaXRpYWxpemUsIGNsYXNzTG9hZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNsczsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgKTsKLSAgICAgICAgfSBjYXRjaCAoUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkV4Y2VwdGlvbiB0aHJvd24gZnJvbSBBY2Nlc3NDb250cm9sbGVyOiAiICsgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aHJvdyAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbikgZS5nZXRFeGNlcHRpb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjbDsKLSAgICB9Ci0KLSAgICAvKiogQHJldHVybiBDbGFzc0xvYWRlciAqLwotICAgIHByaXZhdGUgc3RhdGljIENsYXNzTG9hZGVyIGdldENvbnRleHRDbGFzc0xvYWRlcigpIHsKLSAgICAgICAgLy8gTk9URTogVGhpcyBtZXRob2QgbXVzdCByZW1haW4gcHJpdmF0ZSBiZWNhdXNlIGl0IHVzZXMgQWNjZXNzQ29udHJvbGxlcgotICAgICAgICBDbGFzc0xvYWRlciBjbCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjbCA9IChDbGFzc0xvYWRlcilBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgKLSAgICAgICAgICAgICAgICAgICAgbmV3IFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgKTsKLSAgICAgICAgfSBjYXRjaCAoUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkV4Y2VwdGlvbiB0aHJvd24gZnJvbSBBY2Nlc3NDb250cm9sbGVyOiAiICsgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGUuZ2V0RXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGNsOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgSkFYLVdTIFNlcnZpY2UgRXhjZXB0aW9uIChHZW5lcmF0ZWQgRXhjZXB0aW9uKQotICAgICAqCi0gICAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gZXhjZXB0aW9uY2xhc3MKLSAgICAgKiBAcGFyYW0gYmVhbgotICAgICAqIEBwYXJhbSBiZWFuRm9ybWFsVHlwZQotICAgICAqIEByZXR1cm4KLSAgICAgKiBAdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbgotICAgICAqIEBwYXJtYSBtYXJzaGFsRGVzYyBpcyB1c2VkIHRvIGdldCBjYWNoZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGV4Y2VwdGlvbiBjbGFzcyBhbmQgYmVhbgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIEV4Y2VwdGlvbiBjcmVhdGVTZXJ2aWNlRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzIGV4Y2VwdGlvbmNsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBiZWFuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzIGJlYW5Gb3JtYWxUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcnNoYWxTZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uIG1hcnNoYWxEZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNMZWdhY3lFeGNlcHRpb24pIHRocm93cwotICAgICAgICAgICAgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwKLSAgICAgICAgICAgIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIkNvbnN0cnVjdGluZyBKQVgtV1MgRXhjZXB0aW9uOiIgKyBleGNlcHRpb25jbGFzcyk7Ci0gICAgICAgIH0KLSAgICAgICAgRXhjZXB0aW9uIGV4Y2VwdGlvbiA9IG51bGw7Ci0gICAgICAgIGlmIChpc0xlZ2FjeUV4Y2VwdGlvbikgewotICAgICAgICAgICAgLy8gTGVnYWN5IEV4Y2VwdGlvbgotICAgICAgICAgICAgZXhjZXB0aW9uID0gTGVnYWN5RXhjZXB0aW9uVXRpbC5jcmVhdGVGYXVsdEV4Y2VwdGlvbihleGNlcHRpb25jbGFzcywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlYW4sIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJzaGFsRGVzYyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBOb3JtYWwgY2FzZSwgdXNlIHRoZSBjb250c3RydWN0b3IgdG8gY3JlYXRlIHRoZSBleGNlcHRpb24KLSAgICAgICAgICAgIENvbnN0cnVjdG9yIGNvbnN0cnVjdG9yID0KLSAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uY2xhc3MuZ2V0Q29uc3RydWN0b3IobmV3IENsYXNzW10geyBTdHJpbmcuY2xhc3MsIGJlYW5Gb3JtYWxUeXBlIH0pOwotICAgICAgICAgICAgZXhjZXB0aW9uID0gKEV4Y2VwdGlvbiljb25zdHJ1Y3Rvci5uZXdJbnN0YW5jZShuZXcgT2JqZWN0W10geyBtZXNzYWdlLCBiZWFuIH0pOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGV4Y2VwdGlvbjsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIHN5c3RlbSBleGNlcHRpb24KLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXNzYWdlCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgUHJvdG9jb2xFeGNlcHRpb24gY3JlYXRlU3lzdGVtRXhjZXB0aW9uKFhNTEZhdWx0IHhtbEZhdWx0LCBNZXNzYWdlIG1lc3NhZ2UpIHsKLSAgICAgICAgUHJvdG9jb2xFeGNlcHRpb24gZSA9IG51bGw7Ci0gICAgICAgIFByb3RvY29sIHByb3RvY29sID0gbWVzc2FnZS5nZXRQcm90b2NvbCgpOwotICAgICAgICBTdHJpbmcgdGV4dCA9IHhtbEZhdWx0LmdldFJlYXNvbigpLmdldFRleHQoKTsKLQotICAgICAgICBpZiAocHJvdG9jb2wgPT0gUHJvdG9jb2wuc29hcDExIHx8IHByb3RvY29sID09IFByb3RvY29sLnNvYXAxMikgewotICAgICAgICAgICAgLy8gVGhyb3cgYSBTT0FQRmF1bHRFeGNlcHRpb24KLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ29uc3RydWN0aW5nIFNPQVBGYXVsdEV4Y2VwdGlvbiBmb3IgIiArIHRleHQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgU3RyaW5nIHByb3RvY29sTlMgPSAocHJvdG9jb2wgPT0gUHJvdG9jb2wuc29hcDExKSA/Ci0gICAgICAgICAgICAgICAgICAgIFNPQVBDb25zdGFudHMuVVJJX05TX1NPQVBfMV8xX0VOVkVMT1BFIDoKLSAgICAgICAgICAgICAgICAgICAgU09BUENvbnN0YW50cy5VUklfTlNfU09BUF8xXzJfRU5WRUxPUEU7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgc2V0IG9mIGluc3RydWN0aW9ucyBpcyB1c2VkIHRvIGF2b2lkIAotICAgICAgICAgICAgICAgIC8vIHNvbWUgdW5pbXBsZW1lbnRlZCBtZXRob2RzIGluIHRoZSBBeGlzMiBTQUFKIGltcGxlbWVudGF0aW9uCi0gICAgICAgICAgICAgICAgamF2YXgueG1sLnNvYXAuTWVzc2FnZUZhY3RvcnkgbWYgPSBTQUFKRmFjdG9yeS5jcmVhdGVNZXNzYWdlRmFjdG9yeShwcm90b2NvbE5TKTsKLSAgICAgICAgICAgICAgICBTT0FQQm9keSBib2R5ID0gbWYuY3JlYXRlTWVzc2FnZSgpLmdldFNPQVBCb2R5KCk7Ci0gICAgICAgICAgICAgICAgU09BUEZhdWx0IHNvYXBGYXVsdCA9IFhNTEZhdWx0VXRpbHMuY3JlYXRlU0FBSkZhdWx0KHhtbEZhdWx0LCBib2R5KTsKLSAgICAgICAgICAgICAgICBlID0gbmV3IFNPQVBGYXVsdEV4Y2VwdGlvbihzb2FwRmF1bHQpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgLy8gRXhjZXB0aW9uIG9jY3VycmVkIGR1cmluZyBleGNlcHRpb24gcHJvY2Vzc2luZy4KLSAgICAgICAgICAgICAgICAvLyBUT0RPIFByb2JhYmx5IHNob3VsZCBkbyBzb21ldGhpbmcgYmV0dGVyIGhlcmUKLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJFeGNlcHRpb24gb2NjdXJyZWQgZHVyaW5nIGZhdWx0IHByb2Nlc3Npbmc6IiwgZXgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlID0gRXhjZXB0aW9uRmFjdG9yeS5tYWtlUHJvdG9jb2xFeGNlcHRpb24odGV4dCwgbnVsbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvdG9jb2wgPT0gUHJvdG9jb2wucmVzdCkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJDb25zdHJ1Y3RpbmcgUHJvdG9jb2xFeGNlcHRpb24gZm9yICIgKyB0ZXh0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIFRPRE8gSXMgdGhlcmUgYW4gZXhwbGljaXQgZXhjZXB0aW9uIGZvciBSRVNUCi0gICAgICAgICAgICBlID0gRXhjZXB0aW9uRmFjdG9yeS5tYWtlUHJvdG9jb2xFeGNlcHRpb24odGV4dCwgbnVsbCk7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvdG9jb2wgPT0gUHJvdG9jb2wudW5rbm93bikgewotICAgICAgICAgICAgLy8gUkVWSUVXIFdoYXQgc2hvdWxkIGhhcHBlbiBpZiB0aGVyZSBpcyBubyBwcm90b2NvbAotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJDb25zdHJ1Y3RpbmcgUHJvdG9jb2xFeGNlcHRpb24gZm9yICIgKyB0ZXh0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGUgPSBFeGNlcHRpb25GYWN0b3J5Lm1ha2VQcm90b2NvbEV4Y2VwdGlvbih0ZXh0LCBudWxsKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gZWQKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgc3RhdGljIE1hcnNoYWxTZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uIGdldE1hcnNoYWxEZXNjKEVuZHBvaW50RGVzY3JpcHRpb24gZWQpIHsKLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNkID0gZWQuZ2V0U2VydmljZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgIHJldHVybiBNYXJzaGFsU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbkZhY3RvcnkuZ2V0KHNkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHByb2JhYmx5IHNob3VsZCBiZSBhdmFpbGFibGUgZnJvbSB0aGUgUGFyYW1ldGVyRGVzY3JpcHRpb24KLSAgICAgKgotICAgICAqIEBwYXJhbSBjbHMKLSAgICAgKiBAcGFyYW0gbWFyc2hhbERlc2MKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgcHJpbWl0aXZlLCB3cmFwcGVyLCBqYXZhLmxhbmcuU3RyaW5nLiBDYWxlbmRhciAob3IgR3JlZ29yaWFuQ2FsZW5kYXIpLAotICAgICAqICAgICAgICAgQmlnSW50ZWdlciBldGMgb3IgYW55dGhpbmcgb3RoZXIgamF2YSB0eXBlIHRoYXQgaXMgbWFwcGVkIGJ5IHRoZSBiYXNpYyBzY2hlbWEgdHlwZXMKLSAgICAgKi8KLSAgICBzdGF0aWMgYm9vbGVhbiBpc05vdEpBWEJSb290RWxlbWVudChDbGFzcyBjbHMsIE1hcnNoYWxTZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uIG1hcnNoYWxEZXNjKSB7Ci0gICAgICAgIGlmIChjbHMgPT0gU3RyaW5nLmNsYXNzIHx8Ci0gICAgICAgICAgICAgICAgY2xzLmlzUHJpbWl0aXZlKCkgfHwKLSAgICAgICAgICAgICAgICBjbHMgPT0gQ2FsZW5kYXIuY2xhc3MgfHwKLSAgICAgICAgICAgICAgICBjbHMgPT0gYnl0ZVtdLmNsYXNzIHx8Ci0gICAgICAgICAgICAgICAgY2xzID09IEdyZWdvcmlhbkNhbGVuZGFyLmNsYXNzIHx8Ci0gICAgICAgICAgICAgICAgY2xzID09IERhdGUuY2xhc3MgfHwKLSAgICAgICAgICAgICAgICBjbHMgPT0gQmlnSW50ZWdlci5jbGFzcyB8fAotICAgICAgICAgICAgICAgIGNscyA9PSBCaWdEZWNpbWFsLmNsYXNzKSB7Ci0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIEFubm90YXRpb25EZXNjIGFEZXNjID0gbWFyc2hhbERlc2MuZ2V0QW5ub3RhdGlvbkRlc2MoY2xzKTsKLSAgICAgICAgaWYgKGFEZXNjICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIFhtbFJvb3RFbGVtZW50TmFtZSByZXR1cm5zIG51bGwgaWYgQFhtbFJvb3RFbGVtZW50IGlzIG5vdCBzcGVjaWZpZWQKLSAgICAgICAgICAgIHJldHVybiAoYURlc2MuZ2V0WG1sUm9vdEVsZW1lbnROYW1lKCkgPT0gbnVsbCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7ICAKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogR2V0IGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHN0YWNrIG9mIHRoZSBzcGVjaWZpZWQgZXhjZXB0aW9uICAgCi0gICAgICogQHBhcmFtIGUgICAKLSAgICAgKiBAcmV0dXJuICAgIAotICAgICAqLyAgIAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0YWNrVG9TdHJpbmcoVGhyb3dhYmxlIGUpIHsgICAgICAgCi0gICAgICAgIGphdmEuaW8uU3RyaW5nV3JpdGVyIHN3PSBuZXcgamF2YS5pby5TdHJpbmdXcml0ZXIoKTsgICAgICAgIAotICAgICAgICBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyIGJ3ID0gbmV3IGphdmEuaW8uQnVmZmVyZWRXcml0ZXIoc3cpOyAgICAgICAKLSAgICAgICAgamF2YS5pby5QcmludFdyaXRlciBwdz0gbmV3IGphdmEuaW8uUHJpbnRXcml0ZXIoYncpOyAgICAgICAKLSAgICAgICAgZS5wcmludFN0YWNrVHJhY2UocHcpOyAgICAgICAKLSAgICAgICAgcHcuY2xvc2UoKTsgICAgICAgCi0gICAgICAgIHJldHVybiBzdy5nZXRCdWZmZXIoKS50b1N0cmluZygpOyAgICAgIAotICAgIH0KLSAgICAKLSAgICBzdGF0aWMgYm9vbGVhbiBpc1NXQUF0dGFjaG1lbnQoUGFyYW1ldGVyRGVzY3JpcHRpb24gcGQpIHsKLSAgICAgICAgcmV0dXJuIHBkLmdldEF0dGFjaG1lbnREZXNjcmlwdGlvbigpICE9IG51bGwgJiYKLSAgICAgICAgICAgIHBkLmdldEF0dGFjaG1lbnREZXNjcmlwdGlvbigpLmdldEF0dGFjaG1lbnRUeXBlKCkgPT0gQXR0YWNobWVudFR5cGUuU1dBOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZWdpc3RlciB0aGUgdW5tYXJzaGFsbGluZyBpbmZvcm1hdGlvbiBzbyB0aGF0IGl0IGNhbiAKLSAgICAgKiBiZSB1c2VkIHRvIHNwZWVkIHVwIHN1YnNlcXVlbnQgbWFyc2hhbGxpbmcgZXZlbnRzLgotICAgICAqIEBwYXJhbSBtYwotICAgICAqIEBwYXJhbSBwYWNrYWdlcwotICAgICAqIEBwYXJhbSBwYWNrYWdlc0tleQotICAgICAqLwotICAgIHN0YXRpYyB2b2lkIHJlZ2lzdGVyVW5tYXJzaGFsSW5mbyhNZXNzYWdlQ29udGV4dCBtYywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmVlU2V0PFN0cmluZz4gcGFja2FnZXMsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhY2thZ2VzS2V5KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgCi0gICAgICAgIC8vIFRoZSBpbmZvcm1hdGlvbiBpcyByZWdpc3RlcmVkIG9uIHRoZSBBeGlzT3BlcmF0aW9uLgotICAgICAgICBpZiAobWMgPT0gbnVsbCB8fAotICAgICAgICAgICAgbWMuZ2V0QXhpc01lc3NhZ2VDb250ZXh0KCkgPT0gbnVsbCB8fAotICAgICAgICAgICAgbWMuZ2V0QXhpc01lc3NhZ2VDb250ZXh0KCkuZ2V0QXhpc1NlcnZpY2UoKSA9PSBudWxsIHx8Ci0gICAgICAgICAgICBtYy5nZXRBeGlzTWVzc2FnZUNvbnRleHQoKS5nZXRBeGlzT3BlcmF0aW9uKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBUaGlzIG5lZWRzIHRvIGJlIHN0b3JlZCBvbiB0aGUgQXhpc09wZXJhdGlvbiBhcyB1bm1hcnNoYWxsaW5nCi0gICAgICAgIC8vIGluZm8gd2lsbCBiZSBzcGVjaWZpYyB0byBhIG1ldGhvZCBhbmQgaXRzIHBhcmFtZXRlcnMKLSAgICAgICAgQXhpc09wZXJhdGlvbiBheGlzT3AgPSBtYy5nZXRBeGlzTWVzc2FnZUNvbnRleHQoKS5nZXRBeGlzT3BlcmF0aW9uKCk7Ci0gICAgICAgIAotICAgICAgICAvLyBUaGVyZSBhcmUgdHdvIHRoaW5ncyB0aGF0IG5lZWQgdG8gYmUgc2F2ZWQuCi0gICAgICAgIC8vIDEpIFRoZSBVbm1hcnNoYWxJbmZvIG9iamVjdCBjb250YWluaW5nIHRoZSBwYWNrYWdlcyAKLSAgICAgICAgLy8gICAgKHdoaWNoIHdpbGwgYmUgdXNlZCBieSB0aGUgQ3VzdG9tQnVpbGRlcikKLSAgICAgICAgLy8gMikgQSBNZXNzYWdlQ29udGV4dExpc3RlbmVyIHdoaWNoICh3aGVuIHRyaWdnZXJlZCkgcmVnaXN0ZXJzCi0gICAgICAgIC8vICAgIHRoZSBKQVhCQ3VzdG9tQnVpbGRlcgotICAgICAgICBQYXJhbWV0ZXIgcGFyYW0gPSBheGlzT3AuZ2V0UGFyYW1ldGVyKFVubWFyc2hhbEluZm8uS0VZKTsKLSAgICAgICAgaWYgKHBhcmFtID09IG51bGwpIHsKLSAgICAgICAgICAgIFVubWFyc2hhbEluZm8gaW5mbyA9IG5ldyBVbm1hcnNoYWxJbmZvKHBhY2thZ2VzLCBwYWNrYWdlc0tleSk7Ci0gICAgICAgICAgICBheGlzT3AuYWRkUGFyYW1ldGVyKFVubWFyc2hhbEluZm8uS0VZLCBpbmZvKTsKLSAgICAgICAgICAgIHBhcmFtID0gYXhpc09wLmdldFBhcmFtZXRlcihVbm1hcnNoYWxJbmZvLktFWSk7Ci0gICAgICAgICAgICBwYXJhbS5zZXRUcmFuc2llbnQodHJ1ZSk7Ci0gICAgICAgICAgICAvLyBBZGQgYSBsaXN0ZW5lciB0aGF0IHdpbGwgc2V0IHRoZSBKQVhCQ3VzdG9tQnVpbGRlcgotICAgICAgICAgICAgVW5tYXJzaGFsTWVzc2FnZUNvbnRleHRMaXN0ZW5lci4KLSAgICAgICAgICAgICAgICBjcmVhdGUobWMuZ2V0QXhpc01lc3NhZ2VDb250ZXh0KCkuZ2V0U2VydmljZUNvbnRleHQoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tYXJzaGFsbGVyL2ltcGwvYWx0L1BERWxlbWVudC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWFyc2hhbGxlci9pbXBsL2FsdC9QREVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQ5YjZmYy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tYXJzaGFsbGVyL2ltcGwvYWx0L1BERWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1hcnNoYWxsZXIuaW1wbC5hbHQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLlBhcmFtZXRlckRlc2NyaXB0aW9uOwotCi0KLS8qKiBBIFBERWxlbWVudCBvYmplY3QgaG9sZHMgYSBQYXJhbWV0ZXJEZXNjcmlwdGlvbiAgCi0gKiAgRWxlbWVudCBvYmplY3QuCi0gKiAKLSAqIElmIHRoaXMgRWxlbWVudCByZXByZXNlbnRzIGFuIGF0dGFjaG1lbnQsIAotICogICAxKSBUaGUgRWxlbWVudCByZXByZXNlbnRzIHRoZSB4bWwgZWxlbWVudCB0aGF0IHJlZmVyZW5jZXMgdGhlIGF0dGFjaG1lbnQgKG51bGwgaWYgU1dBIEF0dGFjaG1lbnQpCi0gKiAgIDIpIFRoZSBBdHRhY2htZW50IG9iamVjdCByZXByZXNlbnRzIHRoZSBhdHRhY2htZW50Ci0gKi8KLXB1YmxpYyBjbGFzcyBQREVsZW1lbnQgewotICAgIHByaXZhdGUgUGFyYW1ldGVyRGVzY3JpcHRpb24gcGFyYW07Ci0gICAgcHJpdmF0ZSBFbGVtZW50IGVsZW1lbnQ7Ci0gICAgcHJpdmF0ZSBBdHRhY2htZW50IGF0dGFjaG1lbnQ7IC8vIE51bGwgaWYgbm90IGFuIGF0dGFjaG1lbnQKLSAgICBwcml2YXRlIENsYXNzIGJ5SmF2YVR5cGVDbGFzczsgIC8vIENsYXNzIGZvciAiYnkgamF2YSB0eXBlIiBtYXJzaGFsbGluZyBhbmQgdW5tYXJzaGFsbGluZyBpcyB1c2VkLi4uLm5vcm1hbGx5IG51bGwKLQotICAgIHB1YmxpYyBQREVsZW1lbnQoUGFyYW1ldGVyRGVzY3JpcHRpb24gcGFyYW0sIEVsZW1lbnQgZWxlbWVudCwgQ2xhc3MgYnlUeXBlLCBBdHRhY2htZW50IGF0dGFjaG1lbnQpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgdGhpcy5wYXJhbSA9IHBhcmFtOwotICAgICAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotICAgICAgICB0aGlzLmJ5SmF2YVR5cGVDbGFzcyA9IGJ5VHlwZTsKLSAgICAgICAgdGhpcy5hdHRhY2htZW50ID0gYXR0YWNobWVudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUERFbGVtZW50KFBhcmFtZXRlckRlc2NyaXB0aW9uIHBhcmFtLCBFbGVtZW50IGVsZW1lbnQsIENsYXNzIGJ5VHlwZSkgewotICAgICAgICB0aGlzKHBhcmFtLCBlbGVtZW50LCBieVR5cGUsIG51bGwpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgUGFyYW1ldGVyRGVzY3JpcHRpb24gZ2V0UGFyYW0oKSB7Ci0gICAgICAgIHJldHVybiBwYXJhbTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRWxlbWVudCBnZXRFbGVtZW50KCkgewotCi0gICAgICAgIHJldHVybiBlbGVtZW50OwotICAgIH0KLQotICAgIHB1YmxpYyBDbGFzcyBnZXRCeUphdmFUeXBlQ2xhc3MoKSB7Ci0gICAgICAgIHJldHVybiBieUphdmFUeXBlQ2xhc3M7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QnlKYXZhVHlwZUNsYXNzKENsYXNzIGJ5VHlwZSkgewotICAgICAgICB0aGlzLmJ5SmF2YVR5cGVDbGFzcyA9IGJ5VHlwZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIEF0dGFjaG1lbnQgZ2V0QXR0YWNobWVudCgpIHsKLSAgICAgICAgcmV0dXJuIGF0dGFjaG1lbnQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWFyc2hhbGxlci9pbXBsL2FsdC9SUENMaXRNZXRob2RNYXJzaGFsbGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tYXJzaGFsbGVyL2ltcGwvYWx0L1JQQ0xpdE1ldGhvZE1hcnNoYWxsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmFlYjdkZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tYXJzaGFsbGVyL2ltcGwvYWx0L1JQQ0xpdE1ldGhvZE1hcnNoYWxsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWFyc2hhbGxlci5pbXBsLmFsdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuRXhjZXB0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkF0dGFjaG1lbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkF0dGFjaG1lbnRUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRW5kcG9pbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5PcGVyYXRpb25EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLlBhcmFtZXRlckRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaTE4bi5NZXNzYWdlczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1hcnNoYWxsZXIuTWV0aG9kTWFyc2hhbGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuTWVzc2FnZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuUHJvdG9jb2w7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmZhY3RvcnkuTWVzc2FnZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5yZWdpc3RyeS5GYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5ydW50aW1lLmRlc2NyaXB0aW9uLm1hcnNoYWwuTWFyc2hhbFNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51dGlsaXR5LkNvbnZlcnRVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlN0eWxlOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7Ci0KLXB1YmxpYyBjbGFzcyBSUENMaXRNZXRob2RNYXJzaGFsbGVyIGltcGxlbWVudHMgTWV0aG9kTWFyc2hhbGxlciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coUlBDTGl0TWV0aG9kTWFyc2hhbGxlci5jbGFzcyk7Ci0KLSAgICBwdWJsaWMgUlBDTGl0TWV0aG9kTWFyc2hhbGxlcigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWVzc2FnZSBtYXJzaGFsUmVxdWVzdChPYmplY3RbXSBzaWduYXR1cmVBcmd1bWVudHMsIE9wZXJhdGlvbkRlc2NyaXB0aW9uIG9wZXJhdGlvbkRlc2MpCi0gICAgICAgICAgICB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiBlZCA9IG9wZXJhdGlvbkRlc2MuZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbigpOwotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVuZHBvaW50RGVzYyA9IGVkLmdldEVuZHBvaW50RGVzY3JpcHRpb24oKTsKLSAgICAgICAgUHJvdG9jb2wgcHJvdG9jb2wgPSBQcm90b2NvbC5nZXRQcm90b2NvbEZvckJpbmRpbmcoZW5kcG9pbnREZXNjLmdldENsaWVudEJpbmRpbmdJRCgpKTsKLQotICAgICAgICAvLyBOb3RlIGFsbCBleGNlcHRpb25zIGFyZSBjYXVnaHQgYW5kIHJldGhyb3duIHdpdGggYSBXZWJTZXJ2aWNlRXhjZXB0aW9uCi0gICAgICAgIHRyeSB7Ci0KLSAgICAgICAgICAgIC8vIFNhbXBsZSBSUEMgbWVzc2FnZQotICAgICAgICAgICAgLy8gLi4KLSAgICAgICAgICAgIC8vIDxzb2FwZW52OmJvZHk+Ci0gICAgICAgICAgICAvLyAgICA8bTpvcCB4bWxuczptPSJ1cm46Ly9hcGkiPgotICAgICAgICAgICAgLy8gICAgICAgPHBhcmFtIHhzaTp0eXBlPSJkYXRhOmZvbyIgPi4uLjwvcGFyYW0+Ci0gICAgICAgICAgICAvLyAgICA8L206b3A+Ci0gICAgICAgICAgICAvLyA8L3NvYXBlbnY6Ym9keT4KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBJbXBvcnRhbnQgcG9pbnRzLgotICAgICAgICAgICAgLy8gICAxKSBSUEMgaGFzIGFuIG9wZXJhdGlvbiBlbGVtZW50IHVuZGVyIHRoZSBib2R5LiAgVGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUKLSAgICAgICAgICAgIC8vICAgICAgd3NkbCBvcGVyYXRpb24uCi0gICAgICAgICAgICAvLyAgIDIpIFRoZSBkYXRhIGJsb2NrcyBhcmUgbG9jYXRlZCB1bmRlcm5lYXRoIHRoZSBvcGVyYXRpb24gZWxlbWVudC4gIChJbiBkb2MvbGl0Ci0gICAgICAgICAgICAvLyAgICAgIHRoZSBkYXRhIGVsZW1lbnRzIGFyZSB1bmRlcm5lYXRoIHRoZSBib2R5LgotICAgICAgICAgICAgLy8gICAzKSBUaGUgbmFtZSBvZiB0aGUgZGF0YSBibG9ja3MgKHBhcmFtKSBhcmUgZGVmaW5lZCBieSB0aGUgd3NkbDpwYXJ0IG5vdCB0aGUKLSAgICAgICAgICAgIC8vICAgICAgc2NoZW1hLiAgTm90ZSB0aGF0IHRoZSBwYXJhbSBpcyB1bnF1YWxpZmllZC4uLnBlciBXUy1JIEJQLgotICAgICAgICAgICAgLy8gICA0KSBUaGUgdHlwZSBvZiB0aGUgZGF0YSBibG9jayAoZGF0YTpmb28pIGlzIGRlZmluZWQgYnkgc2NoZW1hICh0aHVzIHRoZXJlIGlzIAotICAgICAgICAgICAgLy8gICAgICBKQVhCIHR5cGUgcmVuZGVyaW5nLiAgU2luY2Ugd2UgYXJlIHVzaW5nIEpBWEIgdG8gbWFyc2hhbCB0aGUgZGF0YSwgCi0gICAgICAgICAgICAvLyAgICAgIHdlIGFsd2F5cyBnZW5lcmF0ZSBhbiB4c2k6dHlwZSBhdHRyaWJ1dGUuICBUaGlzIGlzIGFuIGltcGxlbWVuYXRpb24gZGV0YWlsCi0gICAgICAgICAgICAvLyAgICAgIGFuZCBpcyBub3QgZGVmaW5lZCBieSBhbnkgc3BlYy4KLQotICAgICAgICAgICAgLy8gR2V0IHRoZSBvcGVyYXRpb24gaW5mb3JtYXRpb24KLSAgICAgICAgICAgIFBhcmFtZXRlckRlc2NyaXB0aW9uW10gcGRzID0gb3BlcmF0aW9uRGVzYy5nZXRQYXJhbWV0ZXJEZXNjcmlwdGlvbnMoKTsKLSAgICAgICAgICAgIE1hcnNoYWxTZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uIG1hcnNoYWxEZXNjID0KLSAgICAgICAgICAgICAgICAgICAgTWV0aG9kTWFyc2hhbGxlclV0aWxzLmdldE1hcnNoYWxEZXNjKGVuZHBvaW50RGVzYyk7Ci0gICAgICAgICAgICBUcmVlU2V0PFN0cmluZz4gcGFja2FnZXMgPSBtYXJzaGFsRGVzYy5nZXRQYWNrYWdlcygpOwotCi0gICAgICAgICAgICAvLyBUT0RPIFRoaXMgbmVlZHMgbW9yZSB3b3JrLiAgV2UgbmVlZCB0byBjaGVjayBpbnNpZGUgaG9sZGVycyBvZiBpbnB1dCBwYXJhbXMuICBXZSBhbHNvCi0gICAgICAgICAgICAvLyBtYXkgd2FudCB0byBleGNsdWRlIGhlYWRlciBwYXJhbXMgZnJvbSB0aGlzIGNoZWNrCi0gICAgICAgICAgICAvL1ZhbGlkYXRlIGlucHV0IHBhcmFtZXRlcnMgZm9yIG9wZXJhdGlvbiBhbmQgbWFrZSBzdXJlIG5vIGlucHV0IHBhcmFtZXRlcnMgYXJlIG51bGwuCi0gICAgICAgICAgICAvL0FzIHBlciBKQVhXUyBTcGVjaWZpY2F0aW9uIHNlY3Rpb24gMy42LjIuMyBpZiBhIG51bGwgdmFsdWUgaXMgcGFzc2VzIGFzIGFuIGFyZ3VtZW50IAotICAgICAgICAgICAgLy90byBhIG1ldGhvZCB0aGVuIGFuIGltcGxlbWVudGF0aW9uIE1VU1QgdGhyb3cgV2ViU2VydmljZUV4Y2VwdGlvbi4KLSAgICAgICAgICAgIGlmIChwZHMubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgICAgIGlmIChzaWduYXR1cmVBcmd1bWVudHMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAJCU1lc3NhZ2VzLmdldE1lc3NhZ2UoIk51bGxQYXJhbUVycjIiLG9wZXJhdGlvbkRlc2MuZ2V0SmF2YU1ldGhvZE5hbWUoKSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoc2lnbmF0dXJlQXJndW1lbnRzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChPYmplY3QgYXJndW1lbnQgOiBzaWduYXR1cmVBcmd1bWVudHMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcmd1bWVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAJdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCU1lc3NhZ2VzLmdldE1lc3NhZ2UoIk51bGxQYXJhbUVycjIiLG9wZXJhdGlvbkRlc2MuZ2V0SmF2YU1ldGhvZE5hbWUoKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBDcmVhdGUgdGhlIG1lc3NhZ2UgCi0gICAgICAgICAgICBNZXNzYWdlRmFjdG9yeSBtZiA9IChNZXNzYWdlRmFjdG9yeSlGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShNZXNzYWdlRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgICAgICBNZXNzYWdlIG0gPSBtZi5jcmVhdGUocHJvdG9jb2wpOwotCi0gICAgICAgICAgICAvLyBJbmRpY2F0ZSB0aGUgc3R5bGUgYW5kIG9wZXJhdGlvbiBlbGVtZW50IG5hbWUuICBUaGlzIHRyaWdnZXJzIHRoZSBtZXNzYWdlIHRvCi0gICAgICAgICAgICAvLyBwdXQgdGhlIGRhdGEgYmxvY2tzIHVuZGVybmVhdGggdGhlIG9wZXJhdGlvbiBlbGVtZW50Ci0gICAgICAgICAgICBtLnNldFN0eWxlKFN0eWxlLlJQQyk7Ci0gICAgICAgICAgICBtLnNldE9wZXJhdGlvbkVsZW1lbnQoZ2V0UlBDT3BlcmF0aW9uUU5hbWUob3BlcmF0aW9uRGVzYywgdHJ1ZSkpOwotCi0gICAgICAgICAgICAvLyBUaGUgaW5wdXQgb2JqZWN0IHJlcHJlc2VudCB0aGUgc2lnbmF0dXJlIGFyZ3VtZW50cy4KLSAgICAgICAgICAgIC8vIFNpZ25hdHVyZSBhcmd1bWVudHMgYXJlIGJvdGggaG9sZGVycyBhbmQgbm9uLWhvbGRlcnMKLSAgICAgICAgICAgIC8vIENvbnZlcnQgdGhlIHNpZ25hdHVyZSBpbnRvIGEgbGlzdCBvZiBKQVhCIG9iamVjdHMgZm9yIG1hcnNoYWxsaW5nCi0gICAgICAgICAgICBMaXN0PFBERWxlbWVudD4gcGRlTGlzdCA9Ci0gICAgICAgICAgICAgICAgICAgIE1ldGhvZE1hcnNoYWxsZXJVdGlscy5nZXRQREVsZW1lbnRzKG1hcnNoYWxEZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZUFyZ3VtZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgIC8vIGlucHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsgLy8gdXNlIHBhcnROYW1lIHNpbmNlIHRoaXMgaXMgcnBjL2xpdAotCi0gICAgICAgICAgICAvLyBXZSB3YW50IHRvIHVzZSAiYnkgSmF2YSBUeXBlIiBtYXJzaGFsbGluZyBmb3IgCi0gICAgICAgICAgICAvLyBhbGwgYm9keSBlbGVtZW50cyBhbmQgYWxsIG5vbi1KQVhCIG9iamVjdHMKLSAgICAgICAgICAgIGZvciAoUERFbGVtZW50IHBkZSA6IHBkZUxpc3QpIHsKLSAgICAgICAgICAgICAgICBQYXJhbWV0ZXJEZXNjcmlwdGlvbiBwZCA9IHBkZS5nZXRQYXJhbSgpOwotICAgICAgICAgICAgICAgIENsYXNzIHR5cGUgPSBwZC5nZXRQYXJhbWV0ZXJBY3R1YWxUeXBlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFwZC5pc0hlYWRlcigpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBNZXRob2RNYXJzaGFsbGVyVXRpbHMuaXNOb3RKQVhCUm9vdEVsZW1lbnQodHlwZSwgbWFyc2hhbERlc2MpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBkZS5zZXRCeUphdmFUeXBlQ2xhc3ModHlwZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBQdXQgdmFsdWVzIG9udG8gdGhlIG1lc3NhZ2UKLSAgICAgICAgICAgIE1ldGhvZE1hcnNoYWxsZXJVdGlscy50b01lc3NhZ2UocGRlTGlzdCwgbSwgcGFja2FnZXMpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBFbmFibGUgU1dBIGZvciBuZXN0ZWQgU3dhUmVmIGF0dGFjaG1lbnRzCi0gICAgICAgICAgICBpZiAob3BlcmF0aW9uRGVzYy5oYXNSZXF1ZXN0U3dhUmVmQXR0YWNobWVudHMoKSkgewotICAgICAgICAgICAgICAgIG0uc2V0RG9pbmdTV0EodHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBtOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3RbXSBkZW1hcnNoYWxSZXF1ZXN0KE1lc3NhZ2UgbWVzc2FnZSwgT3BlcmF0aW9uRGVzY3JpcHRpb24gb3BlcmF0aW9uRGVzYykKLSAgICAgICAgICAgIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLQotICAgICAgICBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uIGVkID0gb3BlcmF0aW9uRGVzYy5nZXRFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZW5kcG9pbnREZXNjID0gZWQuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbigpOwotCi0gICAgICAgIC8vIE5vdGUgYWxsIGV4Y2VwdGlvbnMgYXJlIGNhdWdodCBhbmQgcmV0aHJvd24gd2l0aCBhIFdlYlNlcnZpY2VFeGNlcHRpb24KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIFNhbXBsZSBSUEMgbWVzc2FnZQotICAgICAgICAgICAgLy8gLi4KLSAgICAgICAgICAgIC8vIDxzb2FwZW52OmJvZHk+Ci0gICAgICAgICAgICAvLyAgICA8bTpvcCB4bWxuczptPSJ1cm46Ly9hcGkiPgotICAgICAgICAgICAgLy8gICAgICAgPHBhcmFtIHhzaTp0eXBlPSJkYXRhOmZvbyIgPi4uLjwvcGFyYW0+Ci0gICAgICAgICAgICAvLyAgICA8L206b3A+Ci0gICAgICAgICAgICAvLyA8L3NvYXBlbnY6Ym9keT4KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBJbXBvcnRhbnQgcG9pbnRzLgotICAgICAgICAgICAgLy8gICAxKSBSUEMgaGFzIGFuIG9wZXJhdGlvbiBlbGVtZW50IHVuZGVyIHRoZSBib2R5LiAgVGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUKLSAgICAgICAgICAgIC8vICAgICAgd3NkbCBvcGVyYXRpb24uCi0gICAgICAgICAgICAvLyAgIDIpIFRoZSBkYXRhIGJsb2NrcyBhcmUgbG9jYXRlZCB1bmRlcm5lYXRoIHRoZSBvcGVyYXRpb24gZWxlbWVudC4gIChJbiBkb2MvbGl0Ci0gICAgICAgICAgICAvLyAgICAgIHRoZSBkYXRhIGVsZW1lbnRzIGFyZSB1bmRlcm5lYXRoIHRoZSBib2R5LgotICAgICAgICAgICAgLy8gICAzKSBUaGUgbmFtZSBvZiB0aGUgZGF0YSBibG9ja3MgKHBhcmFtKSBhcmUgZGVmaW5lZCBieSB0aGUgd3NkbDpwYXJ0IG5vdCB0aGUKLSAgICAgICAgICAgIC8vICAgICAgc2NoZW1hLiAgTm90ZSB0aGF0IGl0IGlzIHVucXVhbGlmaWVkIHBlciBXU0ktQlAKLSAgICAgICAgICAgIC8vICAgNCkgVGhlIHR5cGUgb2YgdGhlIGRhdGEgYmxvY2sgKGRhdGE6Zm9vKSBpcyBkZWZpbmVkIGJ5IHNjaGVtYSAodGh1cyB0aGVyZSBpcyAKLSAgICAgICAgICAgIC8vICAgICAgSkFYQiB0eXBlIHJlbmRlcmluZy4gIAotICAgICAgICAgICAgLy8gICA1KSBXZSBhbHdheXMgc2VuZCBhbiB4c2k6dHlwZSwgYnV0IG90aGVyIHZlbmRvcidzIG1heSBub3QuCi0gICAgICAgICAgICAvLyBHZXQgdGhlIG9wZXJhdGlvbiBpbmZvcm1hdGlvbgotICAgICAgICAgICAgUGFyYW1ldGVyRGVzY3JpcHRpb25bXSBwZHMgPSBvcGVyYXRpb25EZXNjLmdldFBhcmFtZXRlckRlc2NyaXB0aW9ucygpOwotICAgICAgICAgICAgTWFyc2hhbFNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb24gbWFyc2hhbERlc2MgPQotICAgICAgICAgICAgICAgICAgICBNZXRob2RNYXJzaGFsbGVyVXRpbHMuZ2V0TWFyc2hhbERlc2MoZW5kcG9pbnREZXNjKTsKLSAgICAgICAgICAgIFRyZWVTZXQ8U3RyaW5nPiBwYWNrYWdlcyA9IG1hcnNoYWxEZXNjLmdldFBhY2thZ2VzKCk7Ci0KLSAgICAgICAgICAgIC8vIEluZGljYXRlIHRoYXQgdGhlIHN0eWxlIGlzIFJQQy4gIFRoaXMgaXMgaW1wb3J0YW50IHNvIHRoYXQgdGhlIG1lc3NhZ2UgdW5kZXJzdGFuZHMKLSAgICAgICAgICAgIC8vIHRoYXQgdGhlIGRhdGEgYmxvY2tzIGFyZSB1bmRlcm5lYXRoIHRoZSBvcGVyYXRpb24gZWxlbWVudAotICAgICAgICAgICAgbWVzc2FnZS5zZXRTdHlsZShTdHlsZS5SUEMpOwotCi0gICAgICAgICAgICAvLyBXZSB3YW50IHRvIHVzZSAiYnkgSmF2YSBUeXBlIiB1bm1hcnNoYWxsaW5nIGZvciAKLSAgICAgICAgICAgIC8vIGFsbCBib2R5IGVsZW1lbnRzIGFuZCBhbGwgbm9uLUpBWEIgb2JqZWN0cwotICAgICAgICAgICAgQ2xhc3NbXSBqYXZhVHlwZXMgPSBuZXcgQ2xhc3NbcGRzLmxlbmd0aF07Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBkcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIFBhcmFtZXRlckRlc2NyaXB0aW9uIHBkID0gcGRzW2ldOwotICAgICAgICAgICAgICAgIENsYXNzIHR5cGUgPSBwZC5nZXRQYXJhbWV0ZXJBY3R1YWxUeXBlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFwZC5pc0hlYWRlcigpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBNZXRob2RNYXJzaGFsbGVyVXRpbHMuaXNOb3RKQVhCUm9vdEVsZW1lbnQodHlwZSwgbWFyc2hhbERlc2MpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGphdmFUeXBlc1tpXSA9IHR5cGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBVbm1hcnNoYWwgdGhlIFBhcmFtVmFsdWVzIGZyb20gdGhlIE1lc3NhZ2UKLSAgICAgICAgICAgIExpc3Q8UERFbGVtZW50PiBwdkxpc3QgPSBNZXRob2RNYXJzaGFsbGVyVXRpbHMuZ2V0UERFbGVtZW50cyhwZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLCAvLyBpbnB1dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmFUeXBlcyk7IC8vIHVubWFyc2hhbCBieSB0eXBlCi0KLSAgICAgICAgICAgIC8vIEJ1aWxkIHRoZSBzaWduYXR1cmUgYXJndW1lbnRzCi0gICAgICAgICAgICBPYmplY3RbXSBzaWdBcmd1bWVudHMgPSBNZXRob2RNYXJzaGFsbGVyVXRpbHMuY3JlYXRlUmVxdWVzdFNpZ25hdHVyZUFyZ3MocGRzLCBwdkxpc3QpOwotCi0gICAgICAgICAgICAvLyBUT0RPIFRoaXMgbmVlZHMgbW9yZSB3b3JrLiAgV2UgbmVlZCB0byBjaGVjayBpbnNpZGUgaG9sZGVycyBvZiBpbnB1dCBwYXJhbXMuICBXZSBhbHNvCi0gICAgICAgICAgICAvLyBtYXkgd2FudCB0byBleGNsdWRlIGhlYWRlciBwYXJhbXMgZnJvbSB0aGlzIGNoZWNrCi0gICAgICAgICAgICAvL1ZhbGlkYXRlIGlucHV0IHBhcmFtZXRlcnMgZm9yIG9wZXJhdGlvbiBhbmQgbWFrZSBzdXJlIG5vIGlucHV0IHBhcmFtZXRlcnMgYXJlIG51bGwuCi0gICAgICAgICAgICAvL0FzIHBlciBKQVhXUyBTcGVjaWZpY2F0aW9uIHNlY3Rpb24gMy42LjIuMyBpZiBhIG51bGwgdmFsdWUgaXMgcGFzc2VzIGFzIGFuIGFyZ3VtZW50IAotICAgICAgICAgICAgLy90byBhIG1ldGhvZCB0aGVuIGFuIGltcGxlbWVudGF0aW9uIE1VU1QgdGhyb3cgV2ViU2VydmljZUV4Y2VwdGlvbi4KLSAgICAgICAgICAgIGlmIChzaWdBcmd1bWVudHMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZvciAoT2JqZWN0IGFyZ3VtZW50IDogc2lnQXJndW1lbnRzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhcmd1bWVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIAl0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgCQlNZXNzYWdlcy5nZXRNZXNzYWdlKCJOdWxsUGFyYW1FcnIyIixvcGVyYXRpb25EZXNjLmdldEphdmFNZXRob2ROYW1lKCkpKTsKLQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHNpZ0FyZ3VtZW50czsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIHB1YmxpYyBNZXNzYWdlIG1hcnNoYWxSZXNwb25zZShPYmplY3QgcmV0dXJuT2JqZWN0LCBPYmplY3RbXSBzaWduYXR1cmVBcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYXRpb25EZXNjcmlwdGlvbiBvcGVyYXRpb25EZXNjLCBQcm90b2NvbCBwcm90b2NvbCkKLSAgICAgICAgICAgIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLQotCi0gICAgICAgIEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24gZWQgPSBvcGVyYXRpb25EZXNjLmdldEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24oKTsKLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlbmRwb2ludERlc2MgPSBlZC5nZXRFbmRwb2ludERlc2NyaXB0aW9uKCk7Ci0gICAgICAgIC8vIFdlIHdhbnQgdG8gcmVzcG9uZCB3aXRoIHRoZSBzYW1lIHByb3RvY29sIGFzIHRoZSByZXF1ZXN0LAotICAgICAgICAvLyBJdCB0aGUgcHJvdG9jb2wgaXMgbnVsbCwgdGhlbiB1c2UgdGhlIFByb3RvY29sIGRlZmluZWQgYnkgdGhlIGJpbmRpbmcKLSAgICAgICAgaWYgKHByb3RvY29sID09IG51bGwpIHsKLSAgICAgICAgICAgIHByb3RvY29sID0gUHJvdG9jb2wuZ2V0UHJvdG9jb2xGb3JCaW5kaW5nKGVuZHBvaW50RGVzYy5nZXRCaW5kaW5nVHlwZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIE5vdGUgYWxsIGV4Y2VwdGlvbnMgYXJlIGNhdWdodCBhbmQgcmV0aHJvd24gd2l0aCBhIFdlYlNlcnZpY2VFeGNlcHRpb24KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIFNhbXBsZSBSUEMgbWVzc2FnZQotICAgICAgICAgICAgLy8gLi4KLSAgICAgICAgICAgIC8vIDxzb2FwZW52OmJvZHk+Ci0gICAgICAgICAgICAvLyAgICA8bTpvcFJlc3BvbnNlIHhtbG5zOm09InVybjovL2FwaSI+Ci0gICAgICAgICAgICAvLyAgICAgICA8cGFyYW0geHNpOnR5cGU9ImRhdGE6Zm9vIiA+Li4uPC9wYXJhbT4KLSAgICAgICAgICAgIC8vICAgIDwvbTpvcD4KLSAgICAgICAgICAgIC8vIDwvc29hcGVudjpib2R5PgotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8vIEltcG9ydGFudCBwb2ludHMuCi0gICAgICAgICAgICAvLyAgIDEpIFJQQyBoYXMgYW4gb3BlcmF0aW9uIGVsZW1lbnQgdW5kZXIgdGhlIGJvZHkuICBUaGlzIGlzIHRoZSBuYW1lIG9mIHRoZQotICAgICAgICAgICAgLy8gICAgICB3c2RsIG9wZXJhdGlvbi4KLSAgICAgICAgICAgIC8vICAgMikgVGhlIGRhdGEgYmxvY2tzIGFyZSBsb2NhdGVkIHVuZGVybmVhdGggdGhlIG9wZXJhdGlvbiBlbGVtZW50LiAgKEluIGRvYy9saXQKLSAgICAgICAgICAgIC8vICAgICAgdGhlIGRhdGEgZWxlbWVudHMgYXJlIHVuZGVybmVhdGggdGhlIGJvZHkuCi0gICAgICAgICAgICAvLyAgIDMpIFRoZSBuYW1lIG9mIHRoZSBkYXRhIGJsb2NrcyAocGFyYW0pIGFyZSBkZWZpbmVkIGJ5IHRoZSB3c2RsOnBhcnQgbm90IHRoZQotICAgICAgICAgICAgLy8gICAgICBzY2hlbWEuICBOb3RlIHRoYXQgaXQgaXMgdW5xdWFsaWZpZWQuCi0gICAgICAgICAgICAvLyAgIDQpIFRoZSB0eXBlIG9mIHRoZSBkYXRhIGJsb2NrIChkYXRhOmZvbykgaXMgZGVmaW5lZCBieSBzY2hlbWEgKHRodXMgdGhlcmUgaXMgCi0gICAgICAgICAgICAvLyAgICAgIEpBWEIgdHlwZSByZW5kZXJpbmcuICBTaW5jZSB3ZSBhcmUgdXNpbmcgSkFYQiB0byBtYXJzaGFsIHRoZSBkYXRhLCAKLSAgICAgICAgICAgIC8vICAgICAgd2UgYWx3YXlzIGdlbmVyYXRlIGFuIHhzaTp0eXBlIGF0dHJpYnV0ZS4gIFRoaXMgaXMgYW4gaW1wbGVtZW5hdGlvbiBkZXRhaWwKLSAgICAgICAgICAgIC8vICAgICAgYW5kIGlzIG5vdCBkZWZpbmVkIGJ5IGFueSBzcGVjLgotCi0gICAgICAgICAgICAvLyBHZXQgdGhlIG9wZXJhdGlvbiBpbmZvcm1hdGlvbgotICAgICAgICAgICAgUGFyYW1ldGVyRGVzY3JpcHRpb25bXSBwZHMgPSBvcGVyYXRpb25EZXNjLmdldFBhcmFtZXRlckRlc2NyaXB0aW9ucygpOwotICAgICAgICAgICAgTWFyc2hhbFNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb24gbWFyc2hhbERlc2MgPQotICAgICAgICAgICAgICAgICAgICBNZXRob2RNYXJzaGFsbGVyVXRpbHMuZ2V0TWFyc2hhbERlc2MoZW5kcG9pbnREZXNjKTsKLSAgICAgICAgICAgIFRyZWVTZXQ8U3RyaW5nPiBwYWNrYWdlcyA9IG1hcnNoYWxEZXNjLmdldFBhY2thZ2VzKCk7Ci0KLSAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgbWVzc2FnZSAKLSAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5IG1mID0gKE1lc3NhZ2VGYWN0b3J5KUZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KE1lc3NhZ2VGYWN0b3J5LmNsYXNzKTsKLSAgICAgICAgICAgIE1lc3NhZ2UgbSA9IG1mLmNyZWF0ZShwcm90b2NvbCk7Ci0KLSAgICAgICAgICAgIC8vIEluZGljYXRlIHRoZSBzdHlsZSBhbmQgb3BlcmF0aW9uIGVsZW1lbnQgbmFtZS4gIFRoaXMgdHJpZ2dlcnMgdGhlIG1lc3NhZ2UgdG8KLSAgICAgICAgICAgIC8vIHB1dCB0aGUgZGF0YSBibG9ja3MgdW5kZXJuZWF0aCB0aGUgb3BlcmF0aW9uIGVsZW1lbnQKLSAgICAgICAgICAgIG0uc2V0U3R5bGUoU3R5bGUuUlBDKTsKLQotCi0gICAgICAgICAgICBRTmFtZSBycGNPcFFOYW1lID0gZ2V0UlBDT3BlcmF0aW9uUU5hbWUob3BlcmF0aW9uRGVzYywgZmFsc2UpOwotICAgICAgICAgICAgU3RyaW5nIGxvY2FsUGFydCA9IHJwY09wUU5hbWUuZ2V0TG9jYWxQYXJ0KCkgKyAiUmVzcG9uc2UiOwotICAgICAgICAgICAgUU5hbWUgcmVzcG9uc2VPcCA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBRTmFtZShycGNPcFFOYW1lLmdldE5hbWVzcGFjZVVSSSgpLCBsb2NhbFBhcnQsIHJwY09wUU5hbWUuZ2V0UHJlZml4KCkpOwotICAgICAgICAgICAgbS5zZXRPcGVyYXRpb25FbGVtZW50KHJlc3BvbnNlT3ApOwotCi0gICAgICAgICAgICAvLyBQdXQgdGhlIHJldHVybiBvYmplY3Qgb250byB0aGUgbWVzc2FnZQotICAgICAgICAgICAgQ2xhc3MgcmV0dXJuVHlwZSA9IG9wZXJhdGlvbkRlc2MuZ2V0UmVzdWx0QWN0dWFsVHlwZSgpOwotICAgICAgICAgICAgU3RyaW5nIHJldHVybk5TID0gbnVsbDsKLSAgICAgICAgICAgIFN0cmluZyByZXR1cm5Mb2NhbFBhcnQgPSBudWxsOwotICAgICAgICAgICAgaWYgKG9wZXJhdGlvbkRlc2MuaXNSZXN1bHRIZWFkZXIoKSkgewotICAgICAgICAgICAgICAgIHJldHVybk5TID0gb3BlcmF0aW9uRGVzYy5nZXRSZXN1bHRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICAgICAgICAgICAgICByZXR1cm5Mb2NhbFBhcnQgPSBvcGVyYXRpb25EZXNjLmdldFJlc3VsdE5hbWUoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuTlMgPSAiIjsgIC8vIEFjY29yZGluZyB0byBXU0kgQlAgdGhlIGJvZHkgcGFydCBpcyB1bnF1YWxpZmllZAotICAgICAgICAgICAgICAgIHJldHVybkxvY2FsUGFydCA9IG9wZXJhdGlvbkRlc2MuZ2V0UmVzdWx0UGFydE5hbWUoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHJldHVyblR5cGUgIT0gdm9pZC5jbGFzcykgewotCi0gICAgICAgICAgICAgICAgQXR0YWNobWVudERlc2NyaXB0aW9uIGF0dGFjaG1lbnREZXNjID0gCi0gICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbkRlc2MuZ2V0UmVzdWx0QXR0YWNobWVudERlc2NyaXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dGFjaG1lbnREZXNjICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGF0dGFjaG1lbnREZXNjLmdldEF0dGFjaG1lbnRUeXBlKCkgPT0gQXR0YWNobWVudFR5cGUuU1dBKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYW4gQXR0YWNobWVudCBvYmplY3Qgd2l0aCB0aGUgc2lnbmF0dXJlIHZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICBBdHRhY2htZW50IGF0dGFjaG1lbnQgPSBuZXcgQXR0YWNobWVudChyZXR1cm5PYmplY3QsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVHlwZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRhY2htZW50RGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbkRlc2MuZ2V0UmVzdWx0UGFydE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtLmFkZERhdGFIYW5kbGVyKGF0dGFjaG1lbnQuZ2V0RGF0YUhhbmRsZXIoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnQuZ2V0Q29udGVudElEKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgbS5zZXREb2luZ1NXQSh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkuCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoInBkRWxlbWVudEVyciIpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRPRE8gc2hvdWxkIHdlIGFsbG93IG51bGwgaWYgdGhlIHJldHVybiBpcyBhIGhlYWRlcj8KLSAgICAgICAgICAgICAgICAgICAgLy9WYWxpZGF0ZSBpbnB1dCBwYXJhbWV0ZXJzIGZvciBvcGVyYXRpb24gYW5kIG1ha2Ugc3VyZSBubyBpbnB1dCBwYXJhbWV0ZXJzIGFyZSBudWxsLgotICAgICAgICAgICAgICAgICAgICAvL0FzIHBlciBKQVhXUyBTcGVjaWZpY2F0aW9uIHNlY3Rpb24gMy42LjIuMyBpZiBhIG51bGwgdmFsdWUgaXMgcGFzc2VzIGFzIGFuIGFyZ3VtZW50IAotICAgICAgICAgICAgICAgICAgICAvL3RvIGEgbWV0aG9kIHRoZW4gYW4gaW1wbGVtZW50YXRpb24gTVVTVCB0aHJvdyBXZWJTZXJ2aWNlRXhjZXB0aW9uLgotICAgICAgICAgICAgICAgICAgICBpZiAocmV0dXJuT2JqZWN0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoIk51bGxQYXJhbUVycjMiLG9wZXJhdGlvbkRlc2MuZ2V0SmF2YU1ldGhvZE5hbWUoKSkpOwotCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgRWxlbWVudCByZXR1cm5FbGVtZW50ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgUU5hbWUgcmV0dXJuUU5hbWUgPSBuZXcgUU5hbWUocmV0dXJuTlMsIHJldHVybkxvY2FsUGFydCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtYXJzaGFsRGVzYy5nZXRBbm5vdGF0aW9uRGVzYyhyZXR1cm5UeXBlKS5oYXNYbWxSb290RWxlbWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5FbGVtZW50ID0gbmV3IEVsZW1lbnQocmV0dXJuT2JqZWN0LCByZXR1cm5RTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5FbGVtZW50ID0gbmV3IEVsZW1lbnQocmV0dXJuT2JqZWN0LCByZXR1cm5RTmFtZSwgcmV0dXJuVHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvLyBVc2UgbWFyc2hhbGxpbmcgYnkgamF2YSB0eXBlIGlmIG5lY2Vzc2FyeQotICAgICAgICAgICAgICAgICAgICBDbGFzcyBieUphdmFUeXBlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFvcGVyYXRpb25EZXNjLmlzUmVzdWx0SGVhZGVyKCkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRob2RNYXJzaGFsbGVyVXRpbHMuaXNOb3RKQVhCUm9vdEVsZW1lbnQocmV0dXJuVHlwZSwgbWFyc2hhbERlc2MpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBieUphdmFUeXBlID0gcmV0dXJuVHlwZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBNZXRob2RNYXJzaGFsbGVyVXRpbHMudG9NZXNzYWdlKHJldHVybkVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25EZXNjLmlzTGlzdFR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJzaGFsRGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5SmF2YVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uRGVzYy5pc1Jlc3VsdEhlYWRlcigpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIENvbnZlcnQgdGhlIGhvbGRlciBvYmplY3RzIGludG8gYSBsaXN0IG9mIEpBWEIgb2JqZWN0cyBmb3IgbWFyc2hhbGxpbmcKLSAgICAgICAgICAgIExpc3Q8UERFbGVtZW50PiBwZGVMaXN0ID0KLSAgICAgICAgICAgICAgICAgICAgTWV0aG9kTWFyc2hhbGxlclV0aWxzLmdldFBERWxlbWVudHMobWFyc2hhbERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlQXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsICAvLyBvdXRwdXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOyAgIC8vIHVzZSBwYXJ0TmFtZSBzaW5jZSB0aGlzIGlzIHJwYy9saXQKLQotICAgICAgICAgICAgLy8gV2Ugd2FudCB0byB1c2UgImJ5IEphdmEgVHlwZSIgbWFyc2hhbGxpbmcgZm9yIAotICAgICAgICAgICAgLy8gYWxsIGJvZHkgZWxlbWVudHMgYW5kIGFsbCBub24tSkFYQiBvYmplY3RzCi0gICAgICAgICAgICBmb3IgKFBERWxlbWVudCBwZGUgOiBwZGVMaXN0KSB7Ci0gICAgICAgICAgICAgICAgUGFyYW1ldGVyRGVzY3JpcHRpb24gcGQgPSBwZGUuZ2V0UGFyYW0oKTsKLSAgICAgICAgICAgICAgICBDbGFzcyB0eXBlID0gcGQuZ2V0UGFyYW1ldGVyQWN0dWFsVHlwZSgpOwotICAgICAgICAgICAgICAgIGlmICghcGQuaXNIZWFkZXIoKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kTWFyc2hhbGxlclV0aWxzLmlzTm90SkFYQlJvb3RFbGVtZW50KHR5cGUsIG1hcnNoYWxEZXNjKSkgewotICAgICAgICAgICAgICAgICAgICBwZGUuc2V0QnlKYXZhVHlwZUNsYXNzKHR5cGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIFRPRE8gU2hvdWxkIHdlIGNoZWNrIGZvciBudWxsIG91dHB1dCBib2R5IHZhbHVlcz8gIFNob3VsZCB3ZSBjaGVjayBmb3IgbnVsbCBvdXRwdXQgaGVhZGVyIHZhbHVlcyA/Ci0gICAgICAgICAgICAvLyBQdXQgdmFsdWVzIG9udG8gdGhlIG1lc3NhZ2UKLSAgICAgICAgICAgIE1ldGhvZE1hcnNoYWxsZXJVdGlscy50b01lc3NhZ2UocGRlTGlzdCwgbSwgcGFja2FnZXMpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBFbmFibGUgU1dBIGZvciBuZXN0ZWQgU3dhUmVmIGF0dGFjaG1lbnRzCi0gICAgICAgICAgICBpZiAob3BlcmF0aW9uRGVzYy5oYXNSZXNwb25zZVN3YVJlZkF0dGFjaG1lbnRzKCkpIHsKLSAgICAgICAgICAgICAgICBtLnNldERvaW5nU1dBKHRydWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gbTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIHB1YmxpYyBPYmplY3QgZGVtYXJzaGFsUmVzcG9uc2UoTWVzc2FnZSBtZXNzYWdlLCBPYmplY3RbXSBzaWduYXR1cmVBcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmF0aW9uRGVzY3JpcHRpb24gb3BlcmF0aW9uRGVzYykKLSAgICAgICAgICAgIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLQotICAgICAgICBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uIGVkID0gb3BlcmF0aW9uRGVzYy5nZXRFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZW5kcG9pbnREZXNjID0gZWQuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbigpOwotCi0gICAgICAgIC8vIE5vdGUgYWxsIGV4Y2VwdGlvbnMgYXJlIGNhdWdodCBhbmQgcmV0aHJvd24gd2l0aCBhIFdlYlNlcnZpY2VFeGNlcHRpb24KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIFNhbXBsZSBSUEMgbWVzc2FnZQotICAgICAgICAgICAgLy8gLi4KLSAgICAgICAgICAgIC8vIDxzb2FwZW52OmJvZHk+Ci0gICAgICAgICAgICAvLyAgICA8bTpvcFJlc3BvbnNlIHhtbG5zOm09InVybjovL2FwaSI+Ci0gICAgICAgICAgICAvLyAgICAgICA8cGFyYW0geHNpOnR5cGU9ImRhdGE6Zm9vIiA+Li4uPC9wYXJhbT4KLSAgICAgICAgICAgIC8vICAgIDwvbTpvcD4KLSAgICAgICAgICAgIC8vIDwvc29hcGVudjpib2R5PgotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8vIEltcG9ydGFudCBwb2ludHMuCi0gICAgICAgICAgICAvLyAgIDEpIFJQQyBoYXMgYW4gb3BlcmF0aW9uIGVsZW1lbnQgdW5kZXIgdGhlIGJvZHkuICBUaGlzIGlzIHRoZSBuYW1lIG9mIHRoZQotICAgICAgICAgICAgLy8gICAgICB3c2RsIG9wZXJhdGlvbi4KLSAgICAgICAgICAgIC8vICAgMikgVGhlIGRhdGEgYmxvY2tzIGFyZSBsb2NhdGVkIHVuZGVybmVhdGggdGhlIG9wZXJhdGlvbiBlbGVtZW50LiAgKEluIGRvYy9saXQKLSAgICAgICAgICAgIC8vICAgICAgdGhlIGRhdGEgZWxlbWVudHMgYXJlIHVuZGVybmVhdGggdGhlIGJvZHkuCi0gICAgICAgICAgICAvLyAgIDMpIFRoZSBuYW1lIG9mIHRoZSBkYXRhIGJsb2NrcyAocGFyYW0pIGFyZSBkZWZpbmVkIGJ5IHRoZSB3c2RsOnBhcnQgbm90IHRoZQotICAgICAgICAgICAgLy8gICAgICBzY2hlbWEuICBOb3RlIHRoYXQgaXQgaXMgdW5xdWFsaWZpZWQgcGVyIFdTSS1CUAotICAgICAgICAgICAgLy8gICA0KSBUaGUgdHlwZSBvZiB0aGUgZGF0YSBibG9jayAoZGF0YTpmb28pIGlzIGRlZmluZWQgYnkgc2NoZW1hICh0aHVzIHRoZXJlIGlzIAotICAgICAgICAgICAgLy8gICAgICBKQVhCIHR5cGUgcmVuZGVyaW5nLiAgCi0gICAgICAgICAgICAvLyAgIDUpIFdlIGFsd2F5cyBzZW5kIGFuIHhzaTp0eXBlLCBidXQgb3RoZXIgdmVuZG9yJ3MgbWF5IG5vdC4KLSAgICAgICAgICAgIC8vIEdldCB0aGUgb3BlcmF0aW9uIGluZm9ybWF0aW9uCi0gICAgICAgICAgICBQYXJhbWV0ZXJEZXNjcmlwdGlvbltdIHBkcyA9IG9wZXJhdGlvbkRlc2MuZ2V0UGFyYW1ldGVyRGVzY3JpcHRpb25zKCk7Ci0gICAgICAgICAgICBNYXJzaGFsU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbiBtYXJzaGFsRGVzYyA9Ci0gICAgICAgICAgICAgICAgICAgIE1ldGhvZE1hcnNoYWxsZXJVdGlscy5nZXRNYXJzaGFsRGVzYyhlbmRwb2ludERlc2MpOwotICAgICAgICAgICAgVHJlZVNldDxTdHJpbmc+IHBhY2thZ2VzID0gbWFyc2hhbERlc2MuZ2V0UGFja2FnZXMoKTsKLQotICAgICAgICAgICAgLy8gSW5kaWNhdGUgdGhhdCB0aGUgc3R5bGUgaXMgUlBDLiAgVGhpcyBpcyBpbXBvcnRhbnQgc28gdGhhdCB0aGUgbWVzc2FnZSB1bmRlcnN0YW5kcwotICAgICAgICAgICAgLy8gdGhhdCB0aGUgZGF0YSBibG9ja3MgYXJlIHVuZGVybmVhdGggdGhlIG9wZXJhdGlvbiBlbGVtZW50Ci0gICAgICAgICAgICBtZXNzYWdlLnNldFN0eWxlKFN0eWxlLlJQQyk7Ci0KLSAgICAgICAgICAgIC8vIEdldCB0aGUgcmV0dXJuIHZhbHVlLgotICAgICAgICAgICAgQ2xhc3MgcmV0dXJuVHlwZSA9IG9wZXJhdGlvbkRlc2MuZ2V0UmVzdWx0QWN0dWFsVHlwZSgpOwotICAgICAgICAgICAgT2JqZWN0IHJldHVyblZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIGJvb2xlYW4gaGFzUmV0dXJuSW5Cb2R5ID0gZmFsc2U7Ci0gICAgICAgICAgICBpZiAocmV0dXJuVHlwZSAhPSB2b2lkLmNsYXNzKSB7Ci0gICAgICAgICAgICAgICAgQXR0YWNobWVudERlc2NyaXB0aW9uIGF0dGFjaG1lbnREZXNjID0gCi0gICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbkRlc2MuZ2V0UmVzdWx0QXR0YWNobWVudERlc2NyaXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dGFjaG1lbnREZXNjICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGF0dGFjaG1lbnREZXNjLmdldEF0dGFjaG1lbnRUeXBlKCkgPT0gQXR0YWNobWVudFR5cGUuU1dBKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjaWQgPSBtZXNzYWdlLmdldEF0dGFjaG1lbnRJRCgwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUgPSBtZXNzYWdlLmdldERhdGFIYW5kbGVyKGNpZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgIGlmIChDb252ZXJ0VXRpbHMuaXNDb252ZXJ0YWJsZShyZXR1cm5WYWx1ZSwgcmV0dXJuVHlwZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlID0gQ29udmVydFV0aWxzLmNvbnZlcnQocmV0dXJuVmFsdWUsIHJldHVyblR5cGUpOwotICAgICAgICAgICAgICAgICAgICAgICB9IAotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgicGRFbGVtZW50RXJyIikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHdlYnJlc3VsdCBpcyBpbiB0aGUgaGVhZGVyLCB3ZSBuZWVkIHRoZSBuYW1lIG9mIHRoZSBoZWFkZXIgc28gdGhhdCB3ZSBjYW4gZmluZCBpdC4KLSAgICAgICAgICAgICAgICAgICAgRWxlbWVudCByZXR1cm5FbGVtZW50ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgLy8gVXNlICJieUphdmFUeXBlIiB1bm1hcnNoYWxsaW5nIGlmIG5lY2Vzc2FyeQotICAgICAgICAgICAgICAgICAgICBDbGFzcyBieUphdmFUeXBlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFvcGVyYXRpb25EZXNjLmlzUmVzdWx0SGVhZGVyKCkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRob2RNYXJzaGFsbGVyVXRpbHMuaXNOb3RKQVhCUm9vdEVsZW1lbnQocmV0dXJuVHlwZSwgbWFyc2hhbERlc2MpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBieUphdmFUeXBlID0gcmV0dXJuVHlwZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAob3BlcmF0aW9uRGVzYy5pc1Jlc3VsdEhlYWRlcigpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5FbGVtZW50ID0gTWV0aG9kTWFyc2hhbGxlclV0aWxzCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UmV0dXJuRWxlbWVudChwYWNrYWdlcywgbWVzc2FnZSwgYnlKYXZhVHlwZSwgIG9wZXJhdGlvbkRlc2MuaXNMaXN0VHlwZSgpLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uRGVzYy5nZXRSZXN1bHRUYXJnZXROYW1lc3BhY2UoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbkRlc2MuZ2V0UmVzdWx0UGFydE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGhvZE1hcnNoYWxsZXJVdGlscy5udW1PdXRwdXRCb2R5UGFyYW1zKHBkcykgPiAwKTsKLQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuRWxlbWVudCA9IE1ldGhvZE1hcnNoYWxsZXJVdGlscwotICAgICAgICAgICAgICAgICAgICAgICAgLmdldFJldHVybkVsZW1lbnQocGFja2FnZXMsIG1lc3NhZ2UsIGJ5SmF2YVR5cGUsICBvcGVyYXRpb25EZXNjLmlzTGlzdFR5cGUoKSwgZmFsc2UsIG51bGwsIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRob2RNYXJzaGFsbGVyVXRpbHMubnVtT3V0cHV0Qm9keVBhcmFtcyhwZHMpID4gMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBoYXNSZXR1cm5JbkJvZHkgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlID0gcmV0dXJuRWxlbWVudC5nZXRUeXBlVmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyBzaG91bGQgd2UgYWxsb3cgbnVsbCBpZiB0aGUgcmV0dXJuIGlzIGEgaGVhZGVyPwotICAgICAgICAgICAgICAgICAgICAvL1ZhbGlkYXRlIGlucHV0IHBhcmFtZXRlcnMgZm9yIG9wZXJhdGlvbiBhbmQgbWFrZSBzdXJlIG5vIGlucHV0IHBhcmFtZXRlcnMgYXJlIG51bGwuCi0gICAgICAgICAgICAgICAgICAgIC8vQXMgcGVyIEpBWFdTIFNwZWNpZmljYXRpb24gc2VjdGlvbiAzLjYuMi4zIGlmIGEgbnVsbCB2YWx1ZSBpcyBwYXNzZXMgYXMgYW4gYXJndW1lbnQgCi0gICAgICAgICAgICAgICAgICAgIC8vdG8gYSBtZXRob2QgdGhlbiBhbiBpbXBsZW1lbnRhdGlvbiBNVVNUIHRocm93IFdlYlNlcnZpY2VFeGNlcHRpb24uCi0gICAgICAgICAgICAgICAgICAgIGlmIChyZXR1cm5WYWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRNZXNzYWdlKCJOdWxsUGFyYW1FcnIzIixvcGVyYXRpb25EZXNjLmdldEphdmFNZXRob2ROYW1lKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gIAotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBXZSB3YW50IHRvIHVzZSAiYnkgSmF2YSBUeXBlIiB1bm1hcnNoYWxsaW5nIGZvciAKLSAgICAgICAgICAgIC8vIGFsbCBib2R5IGVsZW1lbnRzIGFuZCBhbGwgbm9uLUpBWEIgb2JqZWN0cwotICAgICAgICAgICAgQ2xhc3NbXSBqYXZhVHlwZXMgPSBuZXcgQ2xhc3NbcGRzLmxlbmd0aF07Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBkcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIFBhcmFtZXRlckRlc2NyaXB0aW9uIHBkID0gcGRzW2ldOwotICAgICAgICAgICAgICAgIENsYXNzIHR5cGUgPSBwZC5nZXRQYXJhbWV0ZXJBY3R1YWxUeXBlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFwZC5pc0hlYWRlcigpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBNZXRob2RNYXJzaGFsbGVyVXRpbHMuaXNOb3RKQVhCUm9vdEVsZW1lbnQodHlwZSwgbWFyc2hhbERlc2MpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGphdmFUeXBlc1tpXSA9IHR5cGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBVbm1hcnNoYWxsIHRoZSBQYXJhbVZhbHVlcyBmcm9tIHRoZSBNZXNzYWdlCi0gICAgICAgICAgICBMaXN0PFBERWxlbWVudD4gcHZMaXN0ID0gTWV0aG9kTWFyc2hhbGxlclV0aWxzLmdldFBERWxlbWVudHMocGRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIC8vIG91dHB1dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc1JldHVybkluQm9keSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhVHlwZXMpOyAvLyB1bm1hcnNoYWwgYnkgdHlwZQotCi0gICAgICAgICAgICAvLyBUT0RPIFNob3VsZCB3ZSBjaGVjayBmb3IgbnVsbCBvdXRwdXQgYm9keSB2YWx1ZXM/ICBTaG91bGQgd2UgY2hlY2sgZm9yIG51bGwgb3V0cHV0IGhlYWRlciB2YWx1ZXMgPwotCi0gICAgICAgICAgICAvLyBQb3B1bGF0ZSB0aGUgcmVzcG9uc2UgSG9sZGVycwotICAgICAgICAgICAgTWV0aG9kTWFyc2hhbGxlclV0aWxzLnVwZGF0ZVJlc3BvbnNlU2lnbmF0dXJlQXJncyhwZHMsIHB2TGlzdCwgc2lnbmF0dXJlQXJncyk7Ci0KLSAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgTWVzc2FnZSBtYXJzaGFsRmF1bHRSZXNwb25zZShUaHJvd2FibGUgdGhyb3dhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhdGlvbkRlc2NyaXB0aW9uIG9wZXJhdGlvbkRlc2MsIFByb3RvY29sIHByb3RvY29sKQotICAgICAgICAgICAgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotCi0gICAgICAgIEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24gZWQgPSBvcGVyYXRpb25EZXNjLmdldEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24oKTsKLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlbmRwb2ludERlc2MgPSBlZC5nZXRFbmRwb2ludERlc2NyaXB0aW9uKCk7Ci0gICAgICAgIE1hcnNoYWxTZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uIG1hcnNoYWxEZXNjID0KLSAgICAgICAgICAgICAgICBNZXRob2RNYXJzaGFsbGVyVXRpbHMuZ2V0TWFyc2hhbERlc2MoZW5kcG9pbnREZXNjKTsKLSAgICAgICAgVHJlZVNldDxTdHJpbmc+IHBhY2thZ2VzID0gbWFyc2hhbERlc2MuZ2V0UGFja2FnZXMoKTsKLQotICAgICAgICAvLyBXZSB3YW50IHRvIHJlc3BvbmQgd2l0aCB0aGUgc2FtZSBwcm90b2NvbCBhcyB0aGUgcmVxdWVzdCwKLSAgICAgICAgLy8gSXQgdGhlIHByb3RvY29sIGlzIG51bGwsIHRoZW4gdXNlIHRoZSBQcm90b2NvbCBkZWZpbmVkIGJ5IHRoZSBiaW5kaW5nCi0gICAgICAgIGlmIChwcm90b2NvbCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBwcm90b2NvbCA9IFByb3RvY29sLmdldFByb3RvY29sRm9yQmluZGluZyhlbmRwb2ludERlc2MuZ2V0QmluZGluZ1R5cGUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBOb3RlIGFsbCBleGNlcHRpb25zIGFyZSBjYXVnaHQgYW5kIHJldGhyb3duIHdpdGggYSBXZWJTZXJ2aWNlRXhjZXB0aW9uCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBDcmVhdGUgdGhlIG1lc3NhZ2UgCi0gICAgICAgICAgICBNZXNzYWdlRmFjdG9yeSBtZiA9IChNZXNzYWdlRmFjdG9yeSlGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShNZXNzYWdlRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgICAgICBNZXNzYWdlIG0gPSBtZi5jcmVhdGUocHJvdG9jb2wpOwotCi0gICAgICAgICAgICAvLyBQdXQgdGhlIGZhdWx0IG9udG8gdGhlIG1lc3NhZ2UKLSAgICAgICAgICAgIE1ldGhvZE1hcnNoYWxsZXJVdGlscy5tYXJzaGFsRmF1bHRSZXNwb25zZSh0aHJvd2FibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyc2hhbERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uRGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtKTsKLSAgICAgICAgICAgIHJldHVybiBtOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBUaHJvd2FibGUgZGVtYXJzaGFsRmF1bHRSZXNwb25zZShNZXNzYWdlIG1lc3NhZ2UsIE9wZXJhdGlvbkRlc2NyaXB0aW9uIG9wZXJhdGlvbkRlc2MpCi0gICAgICAgICAgICB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiBlZCA9IG9wZXJhdGlvbkRlc2MuZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbigpOwotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVuZHBvaW50RGVzYyA9IGVkLmdldEVuZHBvaW50RGVzY3JpcHRpb24oKTsKLSAgICAgICAgTWFyc2hhbFNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb24gbWFyc2hhbERlc2MgPQotICAgICAgICAgICAgICAgIE1ldGhvZE1hcnNoYWxsZXJVdGlscy5nZXRNYXJzaGFsRGVzYyhlbmRwb2ludERlc2MpOwotCi0gICAgICAgIC8vIE5vdGUgYWxsIGV4Y2VwdGlvbnMgYXJlIGNhdWdodCBhbmQgcmV0aHJvd24gd2l0aCBhIFdlYlNlcnZpY2VFeGNlcHRpb24KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFRocm93YWJsZSB0ID0gTWV0aG9kTWFyc2hhbGxlclV0aWxzCi0gICAgICAgICAgICAgICAgICAgIC5kZW1hcnNoYWxGYXVsdFJlc3BvbnNlKG9wZXJhdGlvbkRlc2MsIG1hcnNoYWxEZXNjLCBtZXNzYWdlKTsKLSAgICAgICAgICAgIHJldHVybiB0OwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBvcERlc2MKLSAgICAgKiBAcmV0dXJuIHF1YWxpZmllZCBxbmFtZSB0byB1c2UgaW4gdGhlIHJwYyBtZXNzYWdlIHRvIHJlcHJlc2VudCB0aGUgb3BlcmF0aW9uIChwZXIgV1NJIEJQKQotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIFFOYW1lIGdldFJQQ09wZXJhdGlvblFOYW1lKE9wZXJhdGlvbkRlc2NyaXB0aW9uIG9wRGVzYywgYm9vbGVhbiBpc1JlcXVlc3QpIHsKLSAgICAgICAgUU5hbWUgcU5hbWUgPSBvcERlc2MuZ2V0TmFtZSgpOwotCi0gICAgICAgIFN0cmluZyBsb2NhbFBhcnQgPSBxTmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgU3RyaW5nIHVyaSA9IG51bGw7Ci0gICAgICAgIAotICAgICAgICBpZiAoaXNSZXF1ZXN0KSB7Ci0gICAgICAgICAgICB1cmkgPSBvcERlc2MuZ2V0QmluZGluZ0lucHV0TmFtZXNwYWNlKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB1cmkgPSBvcERlc2MuZ2V0QmluZGluZ091dHB1dE5hbWVzcGFjZSgpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgcHJlZml4ID0gInJwY09wIjsgIC8vIFByZWZlciB1c2luZyBhbiBhY3R1YWwgcHJlZml4Ci0KLQotICAgICAgICBxTmFtZSA9IG5ldyBRTmFtZSh1cmksIGxvY2FsUGFydCwgcHJlZml4KTsKLSAgICAgICAgcmV0dXJuIHFOYW1lOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWFyc2hhbGxlci9pbXBsL2FsdC9Vbm1hcnNoYWxJbmZvLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tYXJzaGFsbGVyL2ltcGwvYWx0L1VubWFyc2hhbEluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmMxMWNhYy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tYXJzaGFsbGVyL2ltcGwvYWx0L1VubWFyc2hhbEluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWFyc2hhbGxlci5pbXBsLmFsdDsNCi0NCi1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7DQotDQotLyoqDQotICogSW5mb3JtYXRpb24gc2F2ZWQgZnJvbSBhIHByaW9yIHVubWFyc2hhbCB0aGF0IGlzIHVzZWQNCi0gKiB0byBzcGVlZCB1cCBzdWJzZXF1ZW50IHVubWFyc2hhbGxpbmcuDQotICovDQotcHVibGljIGNsYXNzIFVubWFyc2hhbEluZm8gew0KLSAgICAvLyBUaGUgVW5tYXJzaGFsSW5mbyBpcyBzYXZlZCBvbiB0aGUgQXhpc1NlcnZpY2Ugd2l0aCB0aGUgZm9sbG93aW5nIEtFWQ0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVkgPSAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tYXJzaGFsbGVyLmltcGwuYWx0LlVubWFyc2hhbEluZm8iOw0KLSAgICANCi0gICAgcHJpdmF0ZSBUcmVlU2V0PFN0cmluZz4gcGFja2FnZXM7DQotICAgIHByaXZhdGUgU3RyaW5nIHBhY2thZ2VzS2V5Ow0KLSAgICANCi0gICAgLyoqDQotICAgICAqIEBwYXJhbSBwYWNrYWdlcw0KLSAgICAgKiBAcGFyYW0gcGFja2FnZXNLZXkNCi0gICAgICovDQotICAgIFVubWFyc2hhbEluZm8oVHJlZVNldDxTdHJpbmc+IHBhY2thZ2VzLCBTdHJpbmcgcGFja2FnZXNLZXkpIHsNCi0gICAgICAgIHRoaXMucGFja2FnZXMgPSBwYWNrYWdlczsNCi0gICAgICAgIHRoaXMucGFja2FnZXNLZXkgPSBwYWNrYWdlc0tleTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogQHJldHVybiBsaXN0IG9mIHBhY2thZ2VzLi4udXNlZCBieSBjYWxsZXIgdG8gYnVpbGQgYSBKQVhCQ29udGV4dA0KLSAgICAgKi8NCi0gICAgcHVibGljIFRyZWVTZXQ8U3RyaW5nPiBnZXRQYWNrYWdlcygpIHsNCi0gICAgICAgIHJldHVybiBwYWNrYWdlczsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogQHJldHVybiBwYWNrYWdlc0tleS4uLnVzZWQgYnkgY2FsbGVyIGFzIGEga2V5IHRvIGdldCBKQVhCQ29udGV4dA0KLSAgICAgKi8NCi0gICAgcHVibGljIFN0cmluZyBnZXRQYWNrYWdlc0tleSgpIHsNCi0gICAgICAgIHJldHVybiBwYWNrYWdlc0tleTsNCi0gICAgfQ0KLSAgICANCi0gICAgDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21hcnNoYWxsZXIvaW1wbC9hbHQvVW5tYXJzaGFsTWVzc2FnZUNvbnRleHRMaXN0ZW5lci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWFyc2hhbGxlci9pbXBsL2FsdC9Vbm1hcnNoYWxNZXNzYWdlQ29udGV4dExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmOGUzMDcuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWFyc2hhbGxlci9pbXBsL2FsdC9Vbm1hcnNoYWxNZXNzYWdlQ29udGV4dExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tYXJzaGFsbGVyLmltcGwuYWx0Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuYnVpbGRlci5TdEFYT01CdWlsZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5TZXJ2aWNlQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhc291cmNlLmpheGIuSkFYQkN1c3RvbUJ1aWxkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YXNvdXJjZS5qYXhiLkpBWEJEU0NvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5NZXNzYWdlQ29udGV4dExpc3RlbmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLS8qKg0KLSAqIFRoaXMgTWVzc2FnZUNvbnRleHRMaXN0ZW5lciBpcyB0cmlnZ2VyZWQgd2hlbiANCi0gKiBhIFNlcnZpY2VDb250ZXh0IGlzIGF0dGFjaGVkIHRvIHRoZSBNZXNzYWdlQ29udGV4dCBhbmQNCi0gKiB3aGVuIGEgU09BUEVudmVsb3BlIGlzIGF0dGFjaGVkIHRvIHRoZSBNZXNzYWdlQ29udGV4dC4NCi0gKiANCi0gKiBJbiBzdWNoIGNhc2VzLCBpdCBhdHRlbXB0cyB0byBnZXQgYSBwcmV2aW91c2x5IGNhY2hlZCAoZnJvbSBhIHByaW9yIHdlYiBzZXJ2aWNlIGNhbGwpDQotICogVW5tYXJzaGFsSW5mbyBvYmplY3QgZnJvbSB0aGUgQXhpc1NlcnZpY2UuICBUaGUgVW5tYXJzaGFsSW5mbw0KLSAqIGRhdGEgaXMgdXNlZCB0byBjcmVhdGUgYSBKQVhCQ3VzdG9tQnVpbGRlciBvbiB0aGUgU09BUEVudmVsb3BlJ3MgYnVpbGRlci4NCi0gKiANCi0gKiBUaGUgbmV0IGVmZmVjdCBpcyB0aGF0IHRoZSBTdEFYT01CdWlsZGVyIHdpbGwgdXNlIHRoZSBKQVhCQ3VzdG9tQnVpbGRlciBkdXJpbmcNCi0gKiB1bm1hcnNoYWxsaW5nLiAgVGhpcyBzYXZlcyB0aW1lIGFuZCBzcGFjZS4NCi0gKi8NCi1wdWJsaWMgY2xhc3MgVW5tYXJzaGFsTWVzc2FnZUNvbnRleHRMaXN0ZW5lciBpbXBsZW1lbnRzIE1lc3NhZ2VDb250ZXh0TGlzdGVuZXIgew0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gDQotICAgICAgICAgICAgTG9nRmFjdG9yeS5nZXRMb2coVW5tYXJzaGFsTWVzc2FnZUNvbnRleHRMaXN0ZW5lci5jbGFzcyk7DQotICAgIC8qKg0KLSAgICAgKiBDcmVhdGUgYW5kIGFkZCBhIGxpc3RlbmVyDQotICAgICAqIEBwYXJhbSBzYyBTZXJ2aWNlQ29udGV4dA0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZShTZXJ2aWNlQ29udGV4dCBzYykgew0KLSAgICAgICAgDQotICAgICAgICAvLyBPbmx5IGNyZWF0ZSBhbmQgYWRkIG9uZSBsaXN0ZW5lciANCi0gICAgICAgIGlmIChzYyA9PSBudWxsIHx8IA0KLSAgICAgICAgICAgIHNjLmdldEF4aXNTZXJ2aWNlKCkgPT0gbnVsbCB8fA0KLSAgICAgICAgICAgIHNjLmdldEF4aXNTZXJ2aWNlKCkuDQotICAgICAgICAgICAgICAgaGFzTWVzc2FnZUNvbnRleHRMaXN0ZW5lcihVbm1hcnNoYWxNZXNzYWdlQ29udGV4dExpc3RlbmVyLmNsYXNzKSkgew0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0gICAgICAgIFVubWFyc2hhbE1lc3NhZ2VDb250ZXh0TGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVW5tYXJzaGFsTWVzc2FnZUNvbnRleHRMaXN0ZW5lcigpOw0KLSAgICAgICAgc2MuZ2V0QXhpc1NlcnZpY2UoKS5hZGRNZXNzYWdlQ29udGV4dExpc3RlbmVyKGxpc3RlbmVyKTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFVzZXIgY3JlYXRlIGZhY3RvcnkgbWV0aG9kIHRvIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgbGlzdGVuZXINCi0gICAgICovDQotICAgIHByaXZhdGUgVW5tYXJzaGFsTWVzc2FnZUNvbnRleHRMaXN0ZW5lcigpIHsgIA0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogQXR0YWNoIHRoZSBKQVhCQ3VzdG9tQnVpbGRlciBvbiB0aGUgQXhpb20gYnVpbGRlci4NCi0gICAgICogVGhpcyB3aWxsIHNwZWVkdXAgdGhlIEpBWEIgdW5tYXJzaGFsbGluZyBjb2RlDQotICAgICAqIEBwYXJhbSBzYw0KLSAgICAgKiBAcGFyYW0gbWMNCi0gICAgICovDQotICAgIHByaXZhdGUgdm9pZCBpbnN0YWxsSkFYQkN1c3RvbUJ1aWxkZXIoU2VydmljZUNvbnRleHQgc2MsIE1lc3NhZ2VDb250ZXh0IG1jKSB7DQotICAgICAgICANCi0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiYXR0YWNoRXZlbnQgZm9yIHNjPSAiICsgc2MuZ2V0TmFtZSgpICsgImFuZCAgbWM9IiArIG1jLmdldExvZ0NvcnJlbGF0aW9uSUQoKSk7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgTWVzc2FnZUNvbnRleHQgaGFzIGEgU09BUEVudmVsb3BlIGFuZCBCdWlsZGVyDQotICAgICAgICBTT0FQRW52ZWxvcGUgZW52ZWxvcGUgPSBtYy5nZXRFbnZlbG9wZSgpOw0KLSAgICAgICAgDQotICAgICAgICBpZiAoZW52ZWxvcGUgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICghKGVudmVsb3BlLmdldEJ1aWxkZXIoKSBpbnN0YW5jZW9mIFN0QVhPTUJ1aWxkZXIpKSB7DQotICAgICAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAvLyBHZXQgdGhlIFVubWFyc2hhbEluZm8gb2JqZWN0Lg0KLSAgICAgICAgLy8gVGhpcyBjb250YWlucyBpbmZvcm1hdGlvbiBmcm9tIHByaW9yIHVubWFyc2hhbGxpbmcNCi0gICAgICAgIEF4aXNPcGVyYXRpb24gYXhpc09wID0gbWMuZ2V0QXhpc09wZXJhdGlvbigpOw0KLSAgICAgICAgaWYgKGF4aXNPcCA9PSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICBQYXJhbWV0ZXIgcGFyYW1ldGVySW5mbyA9IGF4aXNPcC5nZXRQYXJhbWV0ZXIoVW5tYXJzaGFsSW5mby5LRVkpOw0KLSAgICAgICAgaWYgKHBhcmFtZXRlckluZm8gPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0gICAgICAgIFVubWFyc2hhbEluZm8gaW5mbyA9ICAoVW5tYXJzaGFsSW5mbykgcGFyYW1ldGVySW5mby5nZXRWYWx1ZSgpOw0KLSAgICAgICAgDQotICAgICAgICBpZiAoaW5mbyA9PSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICAvLyBDcmF0ZSBhIEpBWEJDdXN0b21CdWlsZGVyIGFuZCByZWdpc3RlciBpdCBvbiB0aGUgQXhpb20gU3RBWE9NQnVpbGRlcg0KLSAgICAgICAgSkFYQkRTQ29udGV4dCBqYXhiRFNDID0gbmV3IEpBWEJEU0NvbnRleHQoaW5mby5nZXRQYWNrYWdlcygpLCBpbmZvLmdldFBhY2thZ2VzS2V5KCkpOw0KLSAgICAgICAgamF4YkRTQy5zZXRNZXNzYWdlQ29udGV4dChtYyk7DQotICAgICAgICBKQVhCQ3VzdG9tQnVpbGRlciBqY2IgPSBuZXcgSkFYQkN1c3RvbUJ1aWxkZXIoamF4YkRTQyk7DQotICAgICAgICAoKFN0QVhPTUJ1aWxkZXIpIGVudmVsb3BlLmdldEJ1aWxkZXIoKSkucmVnaXN0ZXJDdXN0b21CdWlsZGVyRm9yUGF5bG9hZChqY2IpOw0KLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKCJSZWdpc3RlcmluZyBKQVhCQ3VzdG9tQnVpbGRlcjogIiArIGpjYiArICIgZm9yIEF4aXNPcGVyYXRpb246ICIgKyBheGlzT3AuZ2V0TmFtZSgpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhdHRhY2hFbnZlbG9wZUV2ZW50KE1lc3NhZ2VDb250ZXh0IG1jKSB7DQotICAgICAgICBpZiAobWMuZ2V0U2VydmljZUNvbnRleHQoKSAhPSBudWxsKSB7DQotICAgICAgICAgICAgaW5zdGFsbEpBWEJDdXN0b21CdWlsZGVyKG1jLmdldFNlcnZpY2VDb250ZXh0KCksIG1jKTsNCi0gICAgICAgIH0gDQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgYXR0YWNoU2VydmljZUNvbnRleHRFdmVudChTZXJ2aWNlQ29udGV4dCBzYywgTWVzc2FnZUNvbnRleHQgbWMpIHsNCi0gICAgICAgIGlmIChtYy5nZXRFbnZlbG9wZSgpICE9IG51bGwpIHsNCi0gICAgICAgICAgICBpbnN0YWxsSkFYQkN1c3RvbUJ1aWxkZXIoc2MsIG1jKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL0Jsb2NrLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL0Jsb2NrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkNGI1Y2UuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9CbG9jay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTURhdGFTb3VyY2VFeHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmZhY3RvcnkuQmxvY2tGYWN0b3J5OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBCbG9jayBBIEJsb2NrIHJlcHJlc2VudHMgYW4geG1sIGVsZW1lbnQgYW5kIGFzc29jaWF0ZWQgc3ViLXRyZWUuIFRoZSBuYW1lIG9mIHRoZSBlbGVtZW50IG11c3QgYmUKLSAqIGRlZmluZWQgYnkgYSByb290IGVsZW1lbnQgaW4gYSBzY2hlbWEuIEFsbCBwcmVmaXhlcyB3aXRoaW4gdGhlIHN1YnRyZWUgbXVzdCBjb3JyZXNwb25kIHRvCi0gKiBuYW1lc3BhY2UgZGVjbGFyYXRpb25zIGRlZmluZWQgd2l0aGluIHRoZSB0cmVlLiBNYW55IHNwZWNpZmljYXRpb25zIHJlZmVyIHRvIHRoaXMgYXMgYSAiZW1iZWRkZWQKLSAqIGRvY3VtZW50IiBvciAieG1sIGJsb2NrIi4gIEkgY2hvc2UgdGhlIHRlcm0sIGJsb2NrLCBmb3Igc2ltcGxpY2l0eS4KLSAqIDxwLz4KLSAqIFRoZSBibG9jayBjYW4gYmUgZXhwb3NlZCBhczogKiBCdXNpbmVzc09iamVjdCAqIFN0QVggb2JqZWN0Ci0gKiA8cC8+Ci0gKiBOb3RlIHRoYXQgdGhlIHdob2xlIE1lc3NhZ2UgY2FuIGFsc28gYmUgdGhvdWdodCBvZiBhcyBhIEJsb2NrLiAgVGh1cyBhIE1lc3NhZ2UgY2FuIGJlIGNyZWF0ZUZyb20KLSAqIGEgQmxvY2sgYW5kIHdyaXR0ZW4gYXMgYSBCbG9jay4KLSAqIDxwLz4KLSAqIEluIGFkZGl0aW9uLCBlYWNoIG9mIHRoZSBhY2Nlc3NvcnMgaGFzIGEgY29uc3VtZSBwYXJhbWV0ZXIuICBJZiBjb25zdW1lIGlzIHRydWUsIHRoZSBCbG9jayBpcyBubwotICogbG9uZ2VyIHZhbGlkIGFmdGVyIHRoZSBtZXNzYWdlIGlzIGNhbGxlZC4gKGkuZS4gdGhlIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IG5lZWQgdG8gY2FjaGUgdGhlCi0gKiBpbmZvcm1hdGlvbikKLSAqLwotcHVibGljIGludGVyZmFjZSBCbG9jayBleHRlbmRzIE9NRGF0YVNvdXJjZUV4dCB7Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYSByZWZlcmVuY2UgdG8gdGhlIEJ1c2luZXNzIE9iamVjdCByZXByZXNlbnRlZCBieSB0aGlzIEJsb2NrCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29uc3VtZSB0cnVlIGlmIHRoaXMgaXMgdGhlIGxhc3QgcmVxdWVzdCBvbiB0aGUgYmxvY2suCi0gICAgICogQHJldHVybiBPYmplY3QgKEpBWEIsIFN0cmluZyBldGMuKQotICAgICAqIEB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRCdXNpbmVzc09iamVjdChib29sZWFuIGNvbnN1bWUpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sIFdlYlNlcnZpY2VFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBHZXRCdXNpbmVzQ29udGV4dCBTb21lIGJ1c2luZXNzIG9iamVjdHMgaGF2ZSBhbiBhc3NvY2lhdGVkIGNvbnRleHQgb2JqZWN0IChpLmUuIEpBWEJDb250ZXh0KQotICAgICAqCi0gICAgICogQHJldHVybiBDb250ZXh0IE9iamVjdCBvciBudWxsCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRCdXNpbmVzc0NvbnRleHQoKTsKLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgWE1MU3RyZWFtUmVhZGVyIHJlcHJlc2VudGVkIGJ5IHRoaXMgQmxvY2sKLSAgICAgKgotICAgICAqIEBwYXJhbSBjb25zdW1lIHRydWUgaWYgdGhpcyBpcyB0aGUgbGFzdCByZXF1ZXN0IG9uIHRoZSBibG9jay4KLSAgICAgKiBAcmV0dXJuIFhNTFN0cmVhbVJlYWRlcgotICAgICAqIEB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIFhNTFN0cmVhbVJlYWRlciBnZXRYTUxTdHJlYW1SZWFkZXIoYm9vbGVhbiBjb25zdW1lKQotICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgV2ViU2VydmljZUV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgT01FbGVtZW50IHJlcHJlc2VudGVkIGJ5IHRoaXMgQmxvY2suIFRoaXMgY2FsbCBhbHdheXMgY29uc3VtZXMgdGhlIGJsb2NrIGJlY2F1c2UgeW91IGFyZQotICAgICAqIHRha2luZyBjb250cm9sIG9mIHRoZSB1bmRlcmx5aW5nIE9NCi0gICAgICoKLSAgICAgKiBAcmV0dXJuCi0gICAgICogQHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgT01FbGVtZW50IGdldE9NRWxlbWVudCgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sIFdlYlNlcnZpY2VFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZSBvdXQgdGhlIEJsb2NrCi0gICAgICoKLSAgICAgKiBAcGFyYW0gd3JpdGVyICBYTUxTdHJlYW1Xcml0ZXIKLSAgICAgKiBAcGFyYW0gY29uc3VtZSB0cnVlIGlmIHRoaXMgaXMgdGhlIGxhc3QgcmVxdWVzdCBvbiB0aGUgYmxvY2suCi0gICAgICogQHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24KLSAgICAgKiBAdHJob3dzIFdlYlNlcnZpY2VFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvdXRwdXRUbyhYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyLCBib29sZWFuIGNvbnN1bWUpCi0gICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uLCBXZWJTZXJ2aWNlRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogaXNDb25zdW1lZCBSZXR1cm4gdHJ1ZSBpZiB0aGUgYmxvY2sgaXMgY29uc3VtZWQuICBPbmNlIGNvbnN1bWVkLCB0aGUgaW5mb3JtYXRpb24gaW4gdGhlIGJsb2NrCi0gICAgICogaXMgbm8gbG9uZ2VyIGF2YWlsYWJsZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgYmxvY2sgaXMgY29uc3VtZWQgKGEgbWV0aG9kIHdhcyBjYWxsZWQgd2l0aCBjb25zdW1lPXRydWUpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNDb25zdW1lZCgpOwotCi0gICAgLyoqCi0gICAgICogR2V0IGEgdHJhY2VTdHJpbmcuLi50aGUgdHJhY2Ugc3RyaW5nIGR1bXBzIHRoZSBjb250ZW50cyBvZiB0aGUgQmxvY2sgd2l0aG91dCBmb3JjaW5nIGFuCi0gICAgICogdW5kZXJseWluZyBpbGwtcGVyZm9ybWFudCB0cmFuc2Zvcm1hdGlvbiBvZiB0aGUgbWVzc2FnZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gU3RyaW5nIGNvbnRhaW5pbmcgdHJhY2UgaW5mb3JtYXRpb24KLSAgICAgKiBAYm9vbGVhbiBpbmRlbnQgU3RyaW5nIGNvbnRhaW5pbmcgaW5kZW50IGNoYXJhY3RlcnMKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHRyYWNlU3RyaW5nKFN0cmluZyBpbmRlbnQpOwotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBJZiBRTmFtZSBpcyBhdmFpbGFibGUgd2l0aG91dCBkb2luZyBhbiBleHBlbnNpdmUgcGFyc2Ugb2YgdGhlIGJ1c2luZXNzIG9iamVjdCwgdGhlbgotICAgICAqICAgICAgICAgcmV0dXJuIHRydWUgT3RoZXJ3aXNlIHJldHVybiBmYWxzZSBOb3RlOiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgdXNlZCBpbiBzaXR1YXRpb25zIHdoZXJlCi0gICAgICogICAgICAgICBpdCB3b3VsZCBiZSBuaWNlIHRvIGtub3cgdGhlIHFuYW1lIChsaWtlIGxvZ2dpbmcgb3IgYSBzcGVjaWFsIGNoZWNrKSBidXQgd2UgZG9uJ3Qgd2FudAotICAgICAqICAgICAgICAgdG8gY2F1c2UgYW4gaWxsLXBlcmZvcm1hbnQgcGFyc2UuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNRTmFtZUF2YWlsYWJsZSgpOwotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBRTmFtZSAobmFtZXNwYWNlLCBsb2NhbHBhcnQpIG9mIHRoZSBCbG9jay4gIERvIG5vdCBkZXBlbmQgb24gcHJlZml4IGJlaW5nIHNldCBjb3JyZWN0bHkuCi0gICAgICogQXNraW5nIGZvciB0aGUgUU5hbWUgY2FuIGNhdXNlIGEgcGVyZm9ybWFudCBoaXQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFFOYW1lIG9mIHRoZSBibG9jawotICAgICAqIEB0aHJvdyBXZWJTZXJ2aWNlRXhjZXB0aW9uCi0gICAgICogQHNlZSBpc1FOYW1lQXZhaWxhYmxlCi0gICAgICovCi0gICAgcHVibGljIFFOYW1lIGdldFFOYW1lKCkgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgQmxvY2tGYWN0b3J5Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIEJsb2NrRmFjdG9yeSB0aGF0IGNyZWF0ZWQgdGhlIEJsb2NrCi0gICAgICovCi0gICAgcHVibGljIEJsb2NrRmFjdG9yeSBnZXRCbG9ja0ZhY3RvcnkoKTsKLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgTWVzc2FnZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBibG9jawotICAgICAqCi0gICAgICogQHJldHVybiBNZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIE1lc3NhZ2UgZ2V0UGFyZW50KCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIE1lc3NhZ2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMgYmxvY2sgKFRoaXMgbWV0aG9kIGlzIGludGVuZGVkIHRvIGJlIGNhbGxlZCBieSB0aGUKLSAgICAgKiBNZXNzYWdlIEltcGxlbWVudGF0aW9uIG9ubHkpCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGFyZW50Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UGFyZW50KE1lc3NhZ2UgcGFyZW50KTsKLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBkYXRhIGlzIGFsd2F5cyBhbiBlbGVtZW50OyBmYWxzZSBpZiBwb3NzaWJseSBtaXhlZCBjb250ZW50IG9yIG11bHRpcGxlCi0gICAgICogICAgICAgICBlbGVtZW50cwotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRWxlbWVudERhdGEoKTsKLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvTWVzc2FnZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9NZXNzYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1ZmIzYzUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9NZXNzYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2U7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmZhY3RvcnkuQmxvY2tGYWN0b3J5OwotCi1pbXBvcnQgamF2YXguYWN0aXZhdGlvbi5EYXRhSGFuZGxlcjsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQTWVzc2FnZTsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIE1lc3NhZ2UKLSAqIDxwLz4KLSAqIEEgTWVzc2FnZSByZXByZXNlbnRzIHRoZSBYTUwgKyBBdHRhY2htZW50cwotICogPHAvPgotICogTW9zdCBvZiB0aGUgbWV0aG9kcyBhdmFpbGFibGUgb24gYSBtZXNzYWdlIGFyZSBvbmx5IGFwcGxpY2FibGUgdG8gdGhlIFhNTCBwYXJ0IG9mIHRoZSBNZXNzYWdlLgotICogU2VlIHRoZSBYTUxQYXJ0IGludGVyZmFjZSBmb3IgYW4gZXhwbGFudGF0aW9uIG9mIHRoZXNlIG1ldGhvZHMuCi0gKgotICogQHNlZSBYTUxQYXJ0Ci0gKiBAc2VlIEF0dGFjaG1lbnQKLSAqLwotcHVibGljIGludGVyZmFjZSBNZXNzYWdlIGV4dGVuZHMgWE1MUGFydCB7Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHByb3RvY29sIGZvciB0aGlzIE1lc3NhZ2UgKHNvYXAxMSwgc29hcDEyLCBldGMuKQotICAgICAqCi0gICAgICogQHJldHVybiBQcm90b2NsCi0gICAgICovCi0gICAgcHVibGljIFByb3RvY29sIGdldFByb3RvY29sKCk7Ci0KLSAgICAvKioKLSAgICAgKiBnZXRBc1NPQVBNZXNzYWdlIEdldCB0aGUgeG1sIHBhcnQgYXMgYSByZWFkL3dyaXRlIFNPQVBFbnZlbG9wZQotICAgICAqCi0gICAgICogQHJldHVybiBTT0FQRW52ZWxvcGUKLSAgICAgKi8KLSAgICBwdWJsaWMgU09BUE1lc3NhZ2UgZ2V0QXNTT0FQTWVzc2FnZSgpIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogQWRkIEF0dGFjaG1lbnQKLSAgICAgKiBAcGFyYW0gZGggRGF0YUhhbmRsZXIgKHR5cGUgb2YgQXR0YWNobWVudCBpcyBpbmZlcnJlZCBmcm9tIGRoLmdldENvbnRlbnRUeXBlKQotICAgICAqIEBwYXJhbSBpZCBTdHJpbmcgd2hpY2ggaXMgdGhlIEF0dGFjaG1lbnQgY29udGVudCBpZAotICAgICAqIEBzZWUgYWRkQXR0YWNobWVudChBdHRhY2htZW50KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZERhdGFIYW5kbGVyKERhdGFIYW5kbGVyIGRoLCBTdHJpbmcgaWQpOwotICAgIAotICAgIC8qKgotICAgICAqIEdldCB0aGUgbGlzdCBvZiBhdHRhY2htZW50IGNvbnRlbnQgaWRzIGZvciB0aGUgbWVzc2FnZQotICAgICAqIEByZXR1cm4gTGlzdDxTdHJpbmc+Ci0gICAgICovCi0gICAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRBdHRhY2htZW50SURzKCk7Ci0gIAotICAgIC8qKgotICAgICAqIEdldCB0aGUgaW5kaWNhdGVkIChub24tc29hcCBwYXJ0KSBhdHRhY2htZW50IGlkCi0gICAgICogQHBhcmFtIGluZGV4Ci0gICAgICogQHJldHVybiBDSUQgb3IgbnVsbCBpZiBub3QgcHJlc2VudAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0YWNobWVudElEKGludCBpbmRleCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBpbmRpY2F0ZWQgKG5vbi1zb2FwIHBhcnQpIGF0dGFjaG1lbnQgaWQKLSAgICAgKiBAcGFyYW0gcGFydE5hbWUgKFdTLUkgaW5kaWNhdGVzIHRoYXQgU1dBIGF0dGFjaG1lbnRzIGhhdmUgYSBwYXJ0TmFtZSBwcmVmaXgpCi0gICAgICogQHJldHVybiBDSUQgb3IgbnVsbCBpZiBub3QgcHJlc2VudAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0YWNobWVudElEKFN0cmluZyBwYXJ0TmFtZSk7Ci0gICAgCi0gICAgCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBhdHRhY2htZW50IGlkZW50aWZpZWQgYnkgdGhlIGNvbnRlbnRJRCAKLSAgICAgKiBAcGFyYW0gY2lkCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBEYXRhSGFuZGxlciBnZXREYXRhSGFuZGxlcihTdHJpbmcgY2lkKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBJbmRpY2F0ZSB0aGF0IGFuIFNXQSBEYXRhSGFuZGxlciB3YXMgYWRkZWQgdG8gdGhlIG1lc3NhZ2UuCi0gICAgICogVGhpcyBpbmZvcm1hdGlvbiB3aWxsIGJlIHVzZWQgdG8gdHJpZ2dlciBTV0Egc2VyaWFsaXphdGlvbi4KLSAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREb2luZ1NXQShib29sZWFuIHZhbHVlKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgU1dBIERhdGFIYW5kbGVyIGlzIHByZXNlbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0RvaW5nU1dBKCk7Ci0gICAgCi0gICAgLyoqIAotICAgICAqIEdldCB0aGUgYXR0YWNobWVudCBhbmQgcmVtb3ZlIGl0IGZyb20gdGhlIE1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gY2lkCi0gICAgICovCi0gICAgcHVibGljIERhdGFIYW5kbGVyIHJlbW92ZURhdGFIYW5kbGVyKFN0cmluZyBjaWQpOwotICAgIAotICAgIC8qKgotICAgICAqIEEgbWVzc2FnZSBpcyBNVE9NIGVuYWJsZWQgaWYgdGhlIAotICAgICAqIGFzc29jaWF0ZWQgZGlzcGF0Y2gvY2xpZW50L2ltcGwvcHJvdmlkZXIgaGFzIGEgYmluZGluZyB0eXBlIAotICAgICAqIHRoYXQgZW5hYmxlcyBNVE9NLgotICAgICAqIEByZXR1cm4gaWYgdGhpcyBpcyBhbiBNVE9NIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc01UT01FbmFibGVkKCk7Ci0KLSAgICAvKiogCi0gICAgICogQSBtZXNzYWdlIGlzIE1UT00gZW5hYmxlZCBpZiB0aGUgCi0gICAgICogYXNzb2NpYXRlZCBkaXNwYXRjaC9jbGllbnQvaW1wbC9wcm92aWRlciBoYXMgYSBiaW5kaW5nIHR5cGUgCi0gICAgICogdGhhdCBlbmFibGVzIE1UT00uCi0gICAgICogSW5kaWNhdGUgd2hldGhlciB0aGlzIGlzIGFuIE1UT00gbWVzc2FnZQotICAgICAqIEBwYXJhbSBiCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TVRPTUVuYWJsZWQoYm9vbGVhbiBiKTsKLSAgICAKLQotICAgIC8qKiAKLSAgICAgKiBAcmV0dXJuIGdldCB0aGUgdHJhbnNwb3J0IGhlYWRlcnMgbWFwLgotICAgICAqLwotICAgIHB1YmxpYyBNYXAgZ2V0TWltZUhlYWRlcnMoKTsKLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgdHJhbnNwb3J0IGhlYWRlcnMKLSAgICAgKiBAcGFyYW0gbWFwIE1hcAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE1pbWVIZWFkZXJzKE1hcCBtYXApOwotCi0gICAgLyoqCi0gICAgICogSW5kaWNhdGUgdGhhdCB0aGlzIG1lc3NhZ2UgaXMgcGFzc2VkIHRoZSBwaXZvdCBwb2ludC4gRm9yIGV4YW1wbGUsIHRoaXMgaXMgc2V0IGluIHRoZSBKQVgtV1MKLSAgICAgKiBEaXNwYXRjaGVyIHRvIGluZGljYXRlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UG9zdFBpdm90KCk7Ci0KLSAgICAvKiogQHJldHVybiB0cnVlIGlmIHBvc3QgcGl2b3QgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Bvc3RQaXZvdCgpOwotCi0gICAgLyoqCi0gICAgICogSkFYLVdTIE1lc3NhZ2UgQ29udGV4dCB0aGF0IG93bnMgdGhlIE1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gbWVzc2FnZUNvbnRleHQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXNzYWdlQ29udGV4dChNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHJldHVybiBKQVgtV1MgTWVzc2FnZUNvbnRleHQKLSAgICAgKi8KLSAgICBwdWJsaWMgTWVzc2FnZUNvbnRleHQgZ2V0TWVzc2FnZUNvbnRleHQoKTsKLQotICAgIC8qIAotICAgICogR2V0IHRoZSBlbnRpcmUgbWVzc2FnZSByZW5kZXJlZCBpbiBhIGNlcnRhaW4gdHlwZSBvZiB2YWx1ZSAoaS5lLiBTdHJpbmcsIFNvdXJjZSwgU09BUE1lc3NhZ2UsIGV0Yy4pCi0gICAgKiBAcGFyYW0gY29udGV4dAotICAgICogQHBhcmFtIGJsb2NrRmFjdG9yeSBibG9ja2ZhY3RvcnkgYXNzb2NpYXRlZCB3aXRoIHRoZSBraW5kIG9mIHJlbmRlcmluZwotICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRWYWx1ZShPYmplY3QgY29udGV4dCwgQmxvY2tGYWN0b3J5IGJsb2NrRmFjdG9yeSkKLSAgICAgICAgICAgIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9Qcm90b2NvbC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9Qcm90b2NvbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzFmMWM2Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvUHJvdG9jb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5NRFFDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC54bWwud3MuaHR0cC5IVFRQQmluZGluZzsKLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5TT0FQQmluZGluZzsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBQcm90b2NvbCBFYWNoIG1lc3NhZ2UgaGFzIGEgcHJvdG9jb2wgKHNvYXAxMSwgc29hcDEyLCByZXN0KSBUaGlzIGVudW0gcmVwcmVzZW50cyB0aGUgcHJvdG9jb2wKLSAqIHdpdGhpbiB0aGUgTWVzc2FnZSBzdWItY29tcG9uZW50Ci0gKi8KLXB1YmxpYyBlbnVtIFByb3RvY29sIHsKLSAgICBzb2FwMTEsIHNvYXAxMiwgcmVzdCwgdW5rbm93bjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhQcm90b2NvbC5jbGFzcyk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBQcm90b2NvbD4gcHJvdG9jb2xNYXBwaW5nczsgCi0gICAgCi0gICAgLy8gVGhlc2UgbmFtZXNwYWNlcyBhcmUgdXNlZCBpbiB0aGUgV1NETCBkb2N1bWVudCB0byBpbmRlbnRpZnkgYSAKLSAgICAvLyBTT0FQIDEuMSB2cy4gYSBTT0FQIDEuMiBiaW5kaW5nCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNPQVAxMV9XU0RMX0JJTkRJTkcgPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09BUDEyX1dTRExfQklORElORyA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAxMiI7Ci0KLSAgICBzdGF0aWMgewotICAgICAgICAvLyBOb3JtYWxseSBhIHN0YXRpYyBIYXNoTWFwIGNhbiBjYXVzZSBjb25jdXJyZW5jeSBpc3N1ZXMuCi0gICAgICAgIC8vIEhvd2V2ZXIsIGlmIHRoZSBIYXNoTWFwIGlzIG9ubHkgcXVlcmllZCAobmV2ZXIgbW9kaWZpZWQpIHRoZW4gCi0gICAgICAgIC8vIGFjY2VzcyBieSBtdWx0aXBsZSB0aGVhZHMgaXMgc2FmZS4KLSAgICAgICAgcHJvdG9jb2xNYXBwaW5ncyA9IG5ldyBIYXNoTWFwPFN0cmluZywgUHJvdG9jb2w+KCk7Ci0gICAgICAgIAotICAgICAgICBwcm90b2NvbE1hcHBpbmdzLnB1dChQcm90b2NvbC5TT0FQMTFfV1NETF9CSU5ESU5HLCBQcm90b2NvbC5zb2FwMTEpOwotICAgICAgICBwcm90b2NvbE1hcHBpbmdzLnB1dChTT0FQQmluZGluZy5TT0FQMTFIVFRQX0JJTkRJTkcsIFByb3RvY29sLnNvYXAxMSk7Ci0gICAgICAgIHByb3RvY29sTWFwcGluZ3MucHV0KFNPQVBCaW5kaW5nLlNPQVAxMUhUVFBfTVRPTV9CSU5ESU5HLCBQcm90b2NvbC5zb2FwMTEpOwotICAgICAgICBwcm90b2NvbE1hcHBpbmdzLnB1dChNRFFDb25zdGFudHMuU09BUDExSk1TX0JJTkRJTkcsIFByb3RvY29sLnNvYXAxMSk7Ci0gICAgICAgIHByb3RvY29sTWFwcGluZ3MucHV0KE1EUUNvbnN0YW50cy5TT0FQMTFKTVNfTVRPTV9CSU5ESU5HLCBQcm90b2NvbC5zb2FwMTEpOwotCi0gICAgICAgIHByb3RvY29sTWFwcGluZ3MucHV0KFByb3RvY29sLlNPQVAxMl9XU0RMX0JJTkRJTkcsIFByb3RvY29sLnNvYXAxMik7Ci0gICAgICAgIHByb3RvY29sTWFwcGluZ3MucHV0KFNPQVBCaW5kaW5nLlNPQVAxMkhUVFBfQklORElORywgUHJvdG9jb2wuc29hcDEyKTsKLSAgICAgICAgcHJvdG9jb2xNYXBwaW5ncy5wdXQoU09BUEJpbmRpbmcuU09BUDEySFRUUF9NVE9NX0JJTkRJTkcsIFByb3RvY29sLnNvYXAxMik7Ci0gICAgICAgIHByb3RvY29sTWFwcGluZ3MucHV0KEhUVFBCaW5kaW5nLkhUVFBfQklORElORywgUHJvdG9jb2wucmVzdCk7Ci0gICAgICAgIHByb3RvY29sTWFwcGluZ3MucHV0KE1EUUNvbnN0YW50cy5TT0FQMTJKTVNfQklORElORywgUHJvdG9jb2wuc29hcDEyKTsKLSAgICAgICAgcHJvdG9jb2xNYXBwaW5ncy5wdXQoTURRQ29uc3RhbnRzLlNPQVAxMkpNU19NVE9NX0JJTkRJTkcsIFByb3RvY29sLnNvYXAxMik7Ci0gICAgICAgIAotICAgICAgICAvLyBBZGQgZWFjaCBvZiB0aGUgVVJMcyB3aXRoIGEgIi8iIGF0IHRoZSBlbmQgZm9yIGZsZXhpYmlsaXR5Ci0gICAgICAgIE1hcDxTdHJpbmcsIFByb3RvY29sPiB1cGRhdGVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBQcm90b2NvbD4oKTsKLSAgICAgICAgSXRlcmF0b3I8U3RyaW5nPiBrZXlzID0gcHJvdG9jb2xNYXBwaW5ncy5rZXlTZXQoKS5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoa2V5cy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIFN0cmluZyBrZXkgPSBrZXlzLm5leHQoKTsKLSAgICAgICAgICAgIGlmICgha2V5LmVuZHNXaXRoKCIvIikpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVzLnB1dChrZXkgKyAiLyIsIHByb3RvY29sTWFwcGluZ3MuZ2V0KGtleSkpOyAgICAKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwcm90b2NvbE1hcHBpbmdzLnB1dEFsbCh1cGRhdGVzKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSByaWdodCB2YWx1ZSBmb3IgdGhlIFByb3RvY29sIGJhc2VkIG9uIHRoZSBiaW5kaW5nIFVSTCB0aGF0IHdhcyBwYXNzZWQgaW4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdXJsCi0gICAgICogQHJldHVybiBQcm90b2NvbCBvciBudWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBQcm90b2NvbCBnZXRQcm90b2NvbEZvckJpbmRpbmcoU3RyaW5nIHVybCkgewotICAgICAgICBib29sZWFuIGRlYnVnID0gbG9nLmlzRGVidWdFbmFibGVkKCk7Ci0gICAgICAgIGlmIChkZWJ1ZykgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJDb25maWd1cmluZyBtZXNzYWdlIHByb3RvY29sIGZvciBiaW5kaW5nIFsiICsgdXJsICsgIl0iKTsKLSAgICAgICAgfQotCi0gICAgICAgIFByb3RvY29sIHByb3RvID0gcHJvdG9jb2xNYXBwaW5ncy5nZXQodXJsKTsKLSAgICAgICAgaWYgKHByb3RvICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiRm91bmQgcHJvdG9jb2wgbWFwcGluZzogIiArIHByb3RvKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBwcm90bzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChkZWJ1ZykgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiUHJvdG9jb2wgd2FzIG5vdCBmb3VuZCBmb3I6IiArIHVybCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvWE1MRmF1bHQuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvWE1MRmF1bHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNjYWRlMi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL1hNTEZhdWx0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2U7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi0KLS8qKgotICogVGhpcyBpcyBhIHZhbHVlIGNsYXNzIHRoYXQgaXMgYW4gYWdub3N0aWMgcmVwcmVzZW50YXRpb24gb2YgYSBmYXVsdC4gVGhlIFhNTEZhdWx0IGNhbiBiZSBhZGRlZCB0bwotICogb3IgcXVlcmllZCBmcm9tIGEgTWVzc2FnZS9YTUxQYXJ0LgotICogPHAvPgotICogRXZlbiB0aG91Z2ggWE1MRmF1bHQgaXMgU09BUCAxLjEvU09BUCAxLjIgYWdub3N0aWMsIFNPQVAgMS4yIHRlcm1zIHdpbGwgYmUgdXNlZC4gRm9yIGV4YW1wbGUsCi0gKiAicmVhc29uIiBtZWFucyBTT0FQIDEuMiBSZWFzb24gb3IgU09BUCAxLjEgZmF1bHRzdHJpbmcuCi0gKgotICogQHNlZSBYTUxGYXVsdFV0aWxzCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxGYXVsdCB7Ci0KLSAgICAvLyBIZXJlIGlzIGEgc2FtcGxlIGNvbXByZWhlbnNpdmUgU09BUCAxLjIgZmF1bHQgd2hpY2ggd2lsbCBoZWxwIHlvdSB1bmRlcnN0YW5kIHRoZQotICAgIC8vIHN0cnVjdHVyZSBvZiBYTUxGYXVsdC4KLSAgICAvLyA8ZW52OkVudmVsb3BlIHhtbG5zOmVudj0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIgotICAgIC8vICAgICAgICAgICAgICAgeG1sbnM6bT0iaHR0cDovL3d3dy5leGFtcGxlLm9yZy90aW1lb3V0cyIKLSAgICAvLyAgICAgICAgICAgICAgIHhtbG5zOnhtbD0iaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIj4KLSAgICAvLyAgIDxlbnY6Qm9keT4KLSAgICAvLyAgICAgIDxlbnY6RmF1bHQ+Ci0gICAgLy8gICAgICAgIDxlbnY6Q29kZT4KLSAgICAvLyAgICAgICAgICA8ZW52OlZhbHVlPmVudjpTZW5kZXI8L2VudjpWYWx1ZT4KLSAgICAvLyAgICAgICAgICA8ZW52OlN1YmNvZGU+Ci0gICAgLy8gICAgICAgICAgICA8ZW52OlZhbHVlPm06TWVzc2FnZVRpbWVvdXQ8L2VudjpWYWx1ZT4KLSAgICAvLyAgICAgICAgICA8L2VudjpTdWJjb2RlPgotICAgIC8vICAgICAgICA8L2VudjpDb2RlPgotICAgIC8vICAgICAgICA8ZW52OlJlYXNvbj4KLSAgICAvLyAgICAgICAgICA8ZW52OlRleHQgeG1sOmxhbmc9ImVuIj5TZW5kZXIgVGltZW91dDwvZW52OlRleHQ+Ci0gICAgLy8gICAgICAgICAgPGVudjpUZXh0IHhtbDpsYW5nPSJkZSI+U2VuZGVyIFRpbWVvdXQ8L2VudjpUZXh0PgotICAgIC8vICAgICAgICA8L2VudjpSZWFzb24+Ci0gICAgLy8gICAgICAgIDxlbnY6Tm9kZT5odHRwOi8vbXkuZXhhbXBsZS5vcmcvTm9kZTwvZW52Ok5vZGU+Ci0gICAgLy8gICAgICAgIDxlbnY6Um9sZT5odHRwOi8vbXkuZXhhbXBsZS5vcmcvUm9sZTwvZW52OlJvbGU+Ci0gICAgLy8gICAgICAgIDxlbnY6RGV0YWlsPgotICAgIC8vICAgICAgICAgIDxtOk1heFRpbWU+UDVNPC9tOk1heFRpbWU+Ci0gICAgLy8gICAgICAgIDwvZW52OkRldGFpbD4gICAgCi0gICAgLy8gICAgICA8L2VudjpGYXVsdD4KLSAgICAvLyAgIDwvZW52OkJvZHk+Ci0gICAgLy8gPC9lbnY6RW52ZWxvcGU+Ci0KLSAgICAvLyBIZXJlIGlzIHRoZSBzYW1lIGluZm9ybWF0aW9uIHJlbmRlcmVkIGFzIGEgU09BUCAxLjEgZmF1bHQuICBOb3RpY2UKLSAgICAvLyB0aGF0IHRoaXMgaXMgYSBzdWJzZXQgb2YgaW5mb3JtYXRpb24uCi0gICAgLy8gPGVudjpFbnZlbG9wZSB4bWxuczplbnY9Imh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZSIKLSAgICAvLyAgICAgICAgICAgICAgIHhtbG5zOm09Imh0dHA6Ly93d3cuZXhhbXBsZS5vcmcvdGltZW91dHMiCi0gICAgLy8gICAgICAgICAgICAgICB4bWxuczp4bWw9Imh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSI+Ci0gICAgLy8gIDxlbnY6Qm9keT4KLSAgICAvLyAgICAgIDxlbnY6RmF1bHQ+Ci0gICAgLy8gICAgICAgIDxmYXVsdGNvZGU+ZW52LkNsaWVudDwvZmF1bHRjb2RlPgotICAgIC8vICAgICAgICA8ZmF1bHRzdHJpbmc+U2VuZGVyIFRpbWVvdXQ8L2ZhdWx0c3RyaW5nPgotICAgIC8vICAgICAgICA8YWN0b3I+aHR0cDovL215LmV4YW1wbGUub3JnL1JvbGU8L2FjdG9yPgotICAgIC8vICAgICAgICA8ZGV0YWlsPgotICAgIC8vICAgICAgICAgIDxtOk1heFRpbWU+UDVNPC9tOk1heFRpbWU+Ci0gICAgLy8gICAgICAgIDxkZXRhaWw+ICAgIAotICAgIC8vICAgICAgPC9lbnY6RmF1bHQ+Ci0gICAgLy8gICA8L2VudjpCb2R5PgotICAgIC8vIDwvZW52OkVudmVsb3BlPgotCi0gICAgLy8gVGhlIHJlcXVpcmVkIGluZm9ybWF0aW9uIChuZWNlc3NhcnkgZm9yIGJvdGggU09BUCAxLjEgYW5kIFNPQVAgMS4yKQotICAgIHByaXZhdGUgWE1MRmF1bHRDb2RlIGNvZGU7Ci0gICAgcHJpdmF0ZSBYTUxGYXVsdFJlYXNvbiByZWFzb247Ci0gICAgcHJpdmF0ZSBCbG9ja1tdIGRldGFpbEJsb2NrczsKLQotICAgIC8vIFRoZSBvcHRpb25hbCBpbmZvcm1hdGlvbiAoY2FuIGJlIHNldCBvbiBYTUxGYXVsdCwgYnV0IG9ubHkgcmVuZGVyZWQgaW4gU09BUCAxLjIgRmF1bHRzKQotICAgIHByaXZhdGUgU3RyaW5nIHJvbGU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbm9kZTsKLSAgICBwcml2YXRlIFFOYW1lW10gc3ViQ29kZXMgPQotICAgICAgICAgICAgbnVsbDsgIC8vIFRoZSBzdWJDb2RlcyBhcmUgdXNlci1kZWZpbmVkLiAgVGhlIHZhbHVlcyBhcmUgbm90IGRlZmluZWQgYnkgYSBzcGVjaWZpY2F0aW9uCi0gICAgcHJpdmF0ZSBYTUxGYXVsdFJlYXNvbltdIHNlY29uZGFyeVJlYXNvbnMgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0IEFwcGxpY2F0aW9uIFhNTEZhdWx0IHdpdGggbWluaW11bSByZXF1aXJlZCBpbmZvcm1hdGlvbgotICAgICAqCi0gICAgICogQHBhcmFtIGNvZGUgICAgICAgICAtIFhNTEZhdWx0Q29kZSBvciBudWxsIGlmIGRlZmF1bHQgWE1MRmF1bHRDb2RlCi0gICAgICogQHBhcmFtIHJlYXNvbiAgICAgICAtIFN0cmluZyByZWFzb24KLSAgICAgKiBAcGFyYW0gZGV0YWlsQmxvY2tzIC0gQmxvY2tbXSBvciBudWxsIGlmIG5vIGRldGFpbEJsb2NrcwotICAgICAqLwotICAgIHB1YmxpYyBYTUxGYXVsdChYTUxGYXVsdENvZGUgY29kZSwgWE1MRmF1bHRSZWFzb24gcmVhc29uLCBCbG9ja1tdIGRldGFpbEJsb2NrcykgewotICAgICAgICBpZiAoY29kZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBjb2RlID0gWE1MRmF1bHRDb2RlLlJFQ0VJVkVSOwotICAgICAgICB9Ci0gICAgICAgIHRoaXMuY29kZSA9IGNvZGU7Ci0gICAgICAgIHRoaXMucmVhc29uID0gcmVhc29uOwotICAgICAgICB0aGlzLmRldGFpbEJsb2NrcyA9IGRldGFpbEJsb2NrczsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdCBTeXN0ZW0gWE1MRmF1bHQgd2l0aCBtaW5pbXVtIHJlcXVpcmVkIGluZm9ybWF0aW9uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29kZSAgIC0gWE1MRmF1bHRDb2RlIG9yIG51bGwgaWYgZGVmYXVsdCBYTUxGYXVsdENvZGUKLSAgICAgKiBAcGFyYW0gcmVhc29uIC0gU3RyaW5nIHJlYXNvbgotICAgICAqLwotICAgIHB1YmxpYyBYTUxGYXVsdChYTUxGYXVsdENvZGUgY29kZSwgWE1MRmF1bHRSZWFzb24gcmVhc29uKSB7Ci0gICAgICAgIHRoaXMoY29kZSwgcmVhc29uLCBudWxsKTsKLSAgICB9Ci0KLQotICAgIC8qKiBAcmV0dXJuIFJldHVybnMgdGhlIGNvZGUuICovCi0gICAgcHVibGljIFhNTEZhdWx0Q29kZSBnZXRDb2RlKCkgewotICAgICAgICByZXR1cm4gY29kZTsKLSAgICB9Ci0KLQotICAgIC8qKiBAcmV0dXJuIFJldHVybnMgdGhlIGRldGFpbEJsb2Nrcy4gKi8KLSAgICBwdWJsaWMgQmxvY2tbXSBnZXREZXRhaWxCbG9ja3MoKSB7Ci0gICAgICAgIHJldHVybiBkZXRhaWxCbG9ja3M7Ci0gICAgfQotCi0KLSAgICAvKiogQHJldHVybiBSZXR1cm5zIHRoZSByZWFzb24uICovCi0gICAgcHVibGljIFhNTEZhdWx0UmVhc29uIGdldFJlYXNvbigpIHsKLSAgICAgICAgcmV0dXJuIHJlYXNvbjsKLSAgICB9Ci0KLQotICAgIC8qKiBAcmV0dXJuIFJldHVybnMgdGhlIG5vZGUuICovCi0gICAgcHVibGljIFN0cmluZyBnZXROb2RlKCkgewotICAgICAgICByZXR1cm4gbm9kZTsKLSAgICB9Ci0KLQotICAgIC8qKiBAcGFyYW0gbm9kZSBUaGUgbm9kZSB0byBzZXQuICovCi0gICAgcHVibGljIHZvaWQgc2V0Tm9kZShTdHJpbmcgbm9kZSkgewotICAgICAgICB0aGlzLm5vZGUgPSBub2RlOwotICAgIH0KLQotCi0gICAgLyoqIEByZXR1cm4gUmV0dXJucyB0aGUgcm9sZS4gKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFJvbGUoKSB7Ci0gICAgICAgIHJldHVybiByb2xlOwotICAgIH0KLQotCi0gICAgLyoqIEBwYXJhbSByb2xlIFRoZSByb2xlIHRvIHNldC4gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRSb2xlKFN0cmluZyByb2xlKSB7Ci0gICAgICAgIHRoaXMucm9sZSA9IHJvbGU7Ci0gICAgfQotCi0KLSAgICAvKiogQHJldHVybiBSZXR1cm5zIHRoZSBzZWNvbmRhcnlSZWFzb25zLiAqLwotICAgIHB1YmxpYyBYTUxGYXVsdFJlYXNvbltdIGdldFNlY29uZGFyeVJlYXNvbnMoKSB7Ci0gICAgICAgIHJldHVybiBzZWNvbmRhcnlSZWFzb25zOwotICAgIH0KLQotCi0gICAgLyoqIEBwYXJhbSBzZWNvbmRhcnlSZWFzb25zIFRoZSBzZWNvbmRhcnlSZWFzb25zIHRvIHNldC4gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTZWNvbmRhcnlSZWFzb25zKFhNTEZhdWx0UmVhc29uW10gc2Vjb25kYXJ5UmVhc29ucykgewotICAgICAgICB0aGlzLnNlY29uZGFyeVJlYXNvbnMgPSBzZWNvbmRhcnlSZWFzb25zOwotICAgIH0KLQotCi0gICAgLyoqIEByZXR1cm4gUmV0dXJucyB0aGUgc3ViQ29kZXMuICovCi0gICAgcHVibGljIFFOYW1lW10gZ2V0U3ViQ29kZXMoKSB7Ci0gICAgICAgIHJldHVybiBzdWJDb2RlczsKLSAgICB9Ci0KLQotICAgIC8qKiBAcGFyYW0gc3ViQ29kZXMgVGhlIHN1YkNvZGVzIHRvIHNldC4gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTdWJDb2RlcyhRTmFtZVtdIHN1YkNvZGVzKSB7Ci0gICAgICAgIHRoaXMuc3ViQ29kZXMgPSBzdWJDb2RlczsKLSAgICB9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9YTUxGYXVsdENvZGUuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvWE1MRmF1bHRDb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkZTk1ZWYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9YTUxGYXVsdENvZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQMTJDb25zdGFudHM7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi0vKioKLSAqIEFnbm9zdGljIHJlcHJlc2VudGF0aW9uIG9mIFNPQVAgMS4xIGFuZCBTT0FQIDEuMiBmYXVsdCBjb2RlIHZhbHVlcy4KLSAqCi0gKiBAc2VlIFhNTEZhdWx0Ci0gKi8KLXB1YmxpYyBjbGFzcyBYTUxGYXVsdENvZGUgewotCi0KLSAgICAvLyAgIFNFTkRFUiAgICAgICAgICAgICAtPiBTT0FQIDEuMiBTZW5kZXIgICAgICAgICAgICAgIC8gU09BUCAxLjEgIENsaWVudAotICAgIC8vICAgUkVDRUlWRVIgICAgICAgICAgIC0+IFNPQVAgMS4yIFJlY2VpdmVyICAgICAgICAgICAgLyBTT0FQIDEuMSAgU2VydmVyCi0gICAgLy8gICBNVVNUVU5ERVJTVEFORCAgICAgLT4gU09BUCAxLjIgTXVzdFVuZGVyc3RhbmQgICAgICAvIFNPQVAgMS4xICBNdXN0VW5kZXJzdGFuZAotICAgIC8vICAgREFUQUVOQ09ESU5HVU5LTk9XTi0+IFNPQVAgMS4yIERhdGFFbmNvZGluZ1Vua25vd24gLyBTT0FQIDEuMSAgU2VydmVyCi0gICAgLy8gICBWRVJTSU9OTUlTTUFUQ0ggICAgLT4gU09BUCAxLjIgVmVyc2lvbk1pc21hdGNoICAgICAvIFNPQVAgMS4xICBWZXJzaW9uTWlzbWF0Y2gKLSAgICAvLyAgIENVU1RPTV9TT0FQMTFfT05MWSAtPiBTT0FQIDEuMiBSZWNlaXZlciAgICAgICAgICAgIC8gU09BUCAxLjEgICJjdXN0b20gcW5hbWUiCi0KLSAgICAvLyBSZW5kZXJlZCBhcyBxbmFtZXMgd2l0aCB0aGUgZm9sbG93aW5nIGxvY2FsIG5hbWVzCi0gICAgLy8gICAgICh0aGUgbmFtZXNwYWNlIGlzIHRoZSBjb3JyZXNwb25kaW5nIGVudmVsb3BlIG5hbWVzcGFjZSkKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFhNTEZhdWx0Q29kZSBTRU5ERVIgPSAobmV3IFhNTEZhdWx0Q29kZSgpIHsKLSAgICAgICAgcHVibGljIFFOYW1lIHRvUU5hbWUoU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICAgICAgU3RyaW5nIGxvY2FsUGFydDsKLSAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKFNPQVAxMkNvbnN0YW50cy5TT0FQX0VOVkVMT1BFX05BTUVTUEFDRV9VUkkpKSB7Ci0gICAgICAgICAgICAgICAgbG9jYWxQYXJ0ID0gIlNlbmRlciI7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGxvY2FsUGFydCA9ICJDbGllbnQiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG5ldyBRTmFtZShuYW1lc3BhY2UsIGxvY2FsUGFydCk7Ci0gICAgICAgIH0KLSAgICB9KTsKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFhNTEZhdWx0Q29kZSBSRUNFSVZFUiA9IChuZXcgWE1MRmF1bHRDb2RlKCkgewotICAgICAgICBwdWJsaWMgUU5hbWUgdG9RTmFtZShTdHJpbmcgbmFtZXNwYWNlKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbG9jYWxQYXJ0OwotICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoU09BUDEyQ29uc3RhbnRzLlNPQVBfRU5WRUxPUEVfTkFNRVNQQUNFX1VSSSkpIHsKLSAgICAgICAgICAgICAgICBsb2NhbFBhcnQgPSAiUmVjZWl2ZXIiOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBsb2NhbFBhcnQgPSAiU2VydmVyIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBuZXcgUU5hbWUobmFtZXNwYWNlLCBsb2NhbFBhcnQpOwotICAgICAgICB9Ci0gICAgfSk7Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBYTUxGYXVsdENvZGUgTVVTVFVOREVSU1RBTkQgPSAobmV3IFhNTEZhdWx0Q29kZSgpIHsKLSAgICAgICAgcHVibGljIFFOYW1lIHRvUU5hbWUoU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBRTmFtZShuYW1lc3BhY2UsICJNdXN0VW5kZXJzdGFuZCIpOwotICAgICAgICB9Ci0gICAgfSk7Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBYTUxGYXVsdENvZGUgREFUQUVOQ09ESU5HVU5LTk9XTiA9IChuZXcgWE1MRmF1bHRDb2RlKCkgewotICAgICAgICBwdWJsaWMgUU5hbWUgdG9RTmFtZShTdHJpbmcgbmFtZXNwYWNlKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbG9jYWxQYXJ0OwotICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoU09BUDEyQ29uc3RhbnRzLlNPQVBfRU5WRUxPUEVfTkFNRVNQQUNFX1VSSSkpIHsKLSAgICAgICAgICAgICAgICBsb2NhbFBhcnQgPSAiRGF0YUVuY29kaW5nVW5rbm93biI7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGxvY2FsUGFydCA9ICJTZXJ2ZXIiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG5ldyBRTmFtZShuYW1lc3BhY2UsIGxvY2FsUGFydCk7Ci0gICAgICAgIH0KLSAgICB9KTsKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFhNTEZhdWx0Q29kZSBWRVJTSU9OTUlTTUFUQ0ggPSAobmV3IFhNTEZhdWx0Q29kZSgpIHsKLSAgICAgICAgcHVibGljIFFOYW1lIHRvUU5hbWUoU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBRTmFtZShuYW1lc3BhY2UsICJWZXJzaW9uTWlzbWF0Y2giKTsKLSAgICAgICAgfQotICAgIH0pOwotICAgIAotCi0gICAgcHJpdmF0ZSBRTmFtZSBmYXVsdENvZGU7Ci0gICAgCi0gICAgcHJpdmF0ZSBYTUxGYXVsdENvZGUoKSB7ICAgICAgICAKLSAgICB9Ci0gICAgICAgIAotICAgIHB1YmxpYyBYTUxGYXVsdENvZGUoUU5hbWUgZmF1bHRDb2RlKSB7Ci0gICAgICAgIGlmIChmYXVsdENvZGUgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJOdWxsIGZhdWx0IGNvZGUiKTsKLSAgICAgICAgfQotICAgICAgICB0aGlzLmZhdWx0Q29kZSA9IGZhdWx0Q29kZTsKLSAgICB9Ci0gICAgCi0gICAgLy8gVXRpbGl0eSBNZXRob2RzCi0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gUU5hbWUgZm9yIHRoZSBnaXZlbiBwcm90b2NvbAotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWVzcGFjZSBvZiB0aGUgZW52ZWxvcGUgZm9yIHRoZSBwcm90b2NvbAotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgUU5hbWUgdG9RTmFtZShTdHJpbmcgcHJvdG9jb2xOYW1lc3BhY2UpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuZmF1bHRDb2RlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGdldCB0aGUgWE1MUGFydCBjb3JyZXNwb25kaW5nIHRvIHRoaXMgc3BlY2lmaWVkIFFOYW1lCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcU5hbWUKLSAgICAgKiBAcmV0dXJuIGNvcnJlc3BvbmRpbmcgWE1MUGFydAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgWE1MRmF1bHRDb2RlIGZyb21RTmFtZShRTmFtZSBxTmFtZSkgewotICAgICAgICBpZiAocU5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gU3BlYyBpbmRpY2F0ZXMgdGhhdCB0aGUgZGVmYXVsdCBpcyByZWNlaXZlcgotICAgICAgICAgICAgcmV0dXJuIFJFQ0VJVkVSOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSBxTmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgU3RyaW5nIGxvY2FsUGFydCA9IHFOYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICBYTUxGYXVsdENvZGUgeG1sRmF1bHRDb2RlID0gbnVsbDsKLSAgICAgICAgLy8gRHVlIHRvIHByb2JsZW1zIGluIHRoZSBPTSwgc29tZXRpbWVzIHRoYXQgcW5hbWUgaXMgbm90IHJldHJpZXZlZCBjb3JyZWN0bHkuCi0gICAgICAgIC8vIFNvIHVzZSB0aGUgbG9jYWxOYW1lIHRvIGZpbmQgdGhlIFhNTEZhdWx0Q29kZQotICAgICAgICBpZiAobG9jYWxQYXJ0LmVxdWFsc0lnbm9yZUNhc2UoIlNlbmRlciIpKSB7ICAgICAgICAgIC8vIFNPQVAgMS4yCi0gICAgICAgICAgICB4bWxGYXVsdENvZGUgPSBTRU5ERVI7Ci0gICAgICAgIH0gZWxzZSBpZiAobG9jYWxQYXJ0LmVxdWFsc0lnbm9yZUNhc2UoIlJlY2VpdmVyIikpIHsgLy8gU09BUCAxLjIKLSAgICAgICAgICAgIHhtbEZhdWx0Q29kZSA9IFJFQ0VJVkVSOwotICAgICAgICB9IGVsc2UgaWYgKGxvY2FsUGFydC5lcXVhbHNJZ25vcmVDYXNlKCJDbGllbnQiKSkgeyAgIC8vIFNPQVAgMS4xCi0gICAgICAgICAgICB4bWxGYXVsdENvZGUgPSBTRU5ERVI7Ci0gICAgICAgIH0gZWxzZSBpZiAobG9jYWxQYXJ0LmVxdWFsc0lnbm9yZUNhc2UoIlNlcnZlciIpKSB7ICAgLy8gU09BUCAxLjEKLSAgICAgICAgICAgIHhtbEZhdWx0Q29kZSA9IFJFQ0VJVkVSOwotICAgICAgICB9IGVsc2UgaWYgKGxvY2FsUGFydC5lcXVhbHNJZ25vcmVDYXNlKCJNdXN0VW5kZXJzdGFuZCIpKSB7ICAvLyBCb3RoCi0gICAgICAgICAgICB4bWxGYXVsdENvZGUgPSBNVVNUVU5ERVJTVEFORDsKLSAgICAgICAgfSBlbHNlIGlmIChsb2NhbFBhcnQuZXF1YWxzSWdub3JlQ2FzZSgiRGF0YUVuY29kaW5nVW5rbm93biIpKSB7ICAvLyBTT0FQIDEuMgotICAgICAgICAgICAgeG1sRmF1bHRDb2RlID0gREFUQUVOQ09ESU5HVU5LTk9XTjsKLSAgICAgICAgfSBlbHNlIGlmIChsb2NhbFBhcnQuZXF1YWxzSWdub3JlQ2FzZSgiVmVyc2lvbk1pc21hdGNoIikpIHsgLy8gQm90aAotICAgICAgICAgICAgeG1sRmF1bHRDb2RlID0gVkVSU0lPTk1JU01BVENIOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgeG1sRmF1bHRDb2RlID0gbmV3IFhNTEZhdWx0Q29kZShxTmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiB4bWxGYXVsdENvZGU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9YTUxGYXVsdFJlYXNvbi5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9YTUxGYXVsdFJlYXNvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTQ2YTMwLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvWE1MRmF1bHRSZWFzb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlOwotCi1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotLyoqIEFnbm9zdGljIHJlcHJlc2VudGF0aW9uIG9mIGEgRmF1bHQgUmVhc29uL2ZhdWx0c3RyaW5nLiBTZWUgQFhNTEZhdWx0ICovCi1wdWJsaWMgY2xhc3MgWE1MRmF1bHRSZWFzb24gewotICAgIFN0cmluZyB0ZXh0OwotICAgIFN0cmluZyBsYW5nOwotCi0gICAgLyoqCi0gICAgICogQSBGYXVsdCBSZWFzb24gaGFzIHRoZSByZWFzb24gdGV4dCBhbmQgbGFuZ3VhZ2UKLSAgICAgKgotICAgICAqIEBwYXJhbSB0ZXh0Ci0gICAgICogQHBhcmFtIGxhbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgWE1MRmF1bHRSZWFzb24oU3RyaW5nIHRleHQsIFN0cmluZyBsYW5nKSB7Ci0gICAgICAgIHRoaXMudGV4dCA9IHRleHQ7Ci0gICAgICAgIHRoaXMubGFuZyA9IGxhbmc7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQSBGYXVsdCBSZWFzb24gd2l0aCB0aGUgZGVmYXVsdCBsYW5ndWFnZQotICAgICAqCi0gICAgICogQHBhcmFtIHRleHQKLSAgICAgKi8KLSAgICBwdWJsaWMgWE1MRmF1bHRSZWFzb24oU3RyaW5nIHRleHQpIHsKLSAgICAgICAgdGhpcyh0ZXh0LCBnZXREZWZhdWx0TGFuZygpKTsKLSAgICB9Ci0KLSAgICAvKiogQHJldHVybiBSZXR1cm5zIHRoZSBsYW5nLiAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGFuZygpIHsKLSAgICAgICAgcmV0dXJuIGxhbmc7Ci0gICAgfQotCi0gICAgLyoqIEByZXR1cm4gUmV0dXJucyB0aGUgdGV4dC4gKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0gICAgICAgIHJldHVybiB0ZXh0OwotICAgIH0KLQotICAgIC8qKiBAcmV0dXJuIHRoZSBJUzAgNjM5IGxhbmd1YWdlIGlkZW50aWZpZXIgZm9yIHRoZSBkZWZhdWx0IGxvY2FsZSAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERlZmF1bHRMYW5nKCkgewotICAgICAgICBMb2NhbGUgbG9jYWxlID0gTG9jYWxlLmdldERlZmF1bHQoKTsKLSAgICAgICAgLy8gVGhlIHNwZWMgaW5kaWNhdGVzIHRvIHVzZSBSRkMgMzA2Niwgd2hpY2ggdXNlcyB0aGUgdmFsdWVzIGRlZmluZWQgYnkgSVNPIDYzOSwKLSAgICAgICAgLy8gd2hpY2ggaXMgd2hhdCBnZXRMYW5ndWFnZSgpIHJldHVybnMuCi0gICAgICAgIHJldHVybiBsb2NhbGUuZ2V0TGFuZ3VhZ2UoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvWE1MUGFydC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9YTUxQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyMzJiZDUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9YTUxQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2U7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuUm9sZVBsYXllcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZmFjdG9yeS5CbG9ja0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5TdHlsZTsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBFbnZlbG9wZTsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0KLS8qKgotICogWE1MUGFydAotICogCi0gKiBUaGUgWE1MIHBvcnRpb24gb2YgYSBNZXNzYWdlCi0gKiAKLSAqIFRoZSBKQVgtV1MgaW1wbGVtZW50YXRpb24gKHByb3h5LCBtZXNzYWdlIHJlY2VpdmVyLCBldGMuKSBpbnRlcmFjdCB3aXRoIHRoZSAKLSAqIE1lc3NhZ2UgdmlhIEJsb2Nrcy4gIEEgQmxvY2sgaXMgcmVwcmVzZW50ZWQgaW4gdGhlIG1lc3NhZ2UgYXMgYSByb290IGVsZW1lbnQgdHJlZSAKLSAqIGluIGVpdGhlciB0aGUgaGVhZGVyLCBib2R5IG9yIGZhdWx0IGRldGFpbCBzZWN0aW9uLiAgVGhlIEJsb2NrcyBjYW4gYmUgZWFzaWx5Ci0gKiBkZWNvbXBvc2VkIGludG8gYnVzaW5lc3Mgb2JqZWN0cyAod2hpY2ggYXJlIG5lZWRlZCBvbiB0aGUgSkFYLVdTIGludGVyZmFjZXMpLgotICogCi0gKiBJbiBhZGRpdGlvbiwgdGhlIEpBWC1XUyBoYW5kbGVyIG1vZGVsIHJlcXVpcmVzIHRoYXQgdGhlIFhNTFBhcnQgYmUgZXhwb3NlZCBhcwotICogYW4gU0FBSiBTT0FQRW52ZWxvcGUuICAKLSAqIAotICogVGhlIFhNTFBhcnQgYWJzdHJhY3Rpb24gaGlkZXMgdGhlIGRldGFpbHMgb2YgdGhlIG1lc3NhZ2UgdHJhbnNmb3JtYXRpb25zIGZyb20KLSAqIHRoZSBKQVgtV1MgaW1wbGVtZW50YXRpb24uCi0gKiAKLSAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLk1lc3NhZ2UKLSAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLkJsb2NrCi0gKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5pbXBsLlhNTFBhcnRCYXNlIGZvciBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzCi0gKiAKLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIFhNTFBhcnQgewotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBwcm90b2NvbCBmb3IgdGhpcyBNZXNzYWdlIChzb2FwMTEsIHNvYXAxMiwgZXRjLikKLSAgICAgKgotICAgICAqIEByZXR1cm4gUHJvdG9jbAotICAgICAqLwotICAgIHB1YmxpYyBQcm90b2NvbCBnZXRQcm90b2NvbCgpOwotCi0gICAgLyoqCi0gICAgICogV3JpdGUgb3V0IHRoZSBNZXNzYWdlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gd3JpdGVyICBYTUxTdHJlYW1Xcml0ZXIKLSAgICAgKiBAcGFyYW0gY29uc3VtZSB0cnVlIGlmIHRoaXMgaXMgdGhlIGxhc3QgcmVxdWVzdCBvbiB0aGUgYmxvY2suCi0gICAgICogQHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb3V0cHV0VG8oWE1MU3RyZWFtV3JpdGVyIHdyaXRlciwgYm9vbGVhbiBjb25zdW1lKQotICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgV2ViU2VydmljZUV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgWE1MU3RyZWFtUmVhZGVyIHJlcHJlc2VudGVkIGJ5IHRoaXMgTWVzc2FnZSBmb3IgdGhlIHhtbCBwYXJ0Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gY29uc3VtZSB0cnVlIGlmIHRoaXMgaXMgdGhlIGxhc3QgcmVxdWVzdCBvbiB0aGUgTWVzc2FnZQotICAgICAqIEByZXR1cm4gWE1MU3RyZWFtUmVhZGVyCi0gICAgICogQHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgWE1MU3RyZWFtUmVhZGVyIGdldFhNTFN0cmVhbVJlYWRlcihib29sZWFuIGNvbnN1bWUpIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uOwotCi0gICAgLyoqIEByZXR1cm4gdGhlIFN0eWxlIChkb2N1bWVudCBvciBycGMpICovCi0gICAgcHVibGljIFN0eWxlIGdldFN0eWxlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIFN0eWxlLiBJZiB0aGUgc3R5bGUgaXMgRE9DVU1FTlQsIHRoZSBib2R5IGJsb2NrcyBhcmUgbG9jYXRlZCB1bmRlcm5lYXRoIHRoZSBib2R5Ci0gICAgICogZWxlbWVudC4gSWYgdGhlIHN0eWxlIGlzIHNldCB0byBSUEMsIHRoZW4gdGhlIGJvZHkgYmxvY2tzIGFyZSBsb2NhdGVkIHVuZGVybmVhdGggdGhlIHJwYwotICAgICAqIG9wZXJhdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzdHlsZSBTdHlsZQotICAgICAqIEBzZWUgc2V0IGluZGlyZWN0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U3R5bGUoU3R5bGUgc3R5bGUpIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogU2V0IGluZGlyZWN0aW9uLiAgVXNlZCB0byBmb3JjZSB0aGUgY29kZSB0byBsb29rIGZvciBibG9ja3MgYXQgYSBwYXJ0aWN1bGFyIGxvY2F0aW9uLiBGb3IKLSAgICAgKiBET0NVTUVOVCB0aGUgZGVmYXVsdCBpcyAwIEZvciBSUEMgdGhlIGRlZmF1bHQgaXMgMSBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIG92ZXJyaWRlIHRoZXNlCi0gICAgICogc2V0dGluZ3MgZm9yIHNwZWNpYWwgY2FzZXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaW5kaXJlY3Rpb24gKDAgb3IgMSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJbmRpcmVjdGlvbihpbnQgaW5kaXJlY3Rpb24pOwotCi0gICAgLyoqCi0gICAgICogR2V0IGluZGlyZWN0aW9uLiAgVXNlZCB0byBmb3JjZSB0aGUgY29kZSB0byBsb29rIGZvciBibG9ja3MgYXQgYSBwYXJ0aWN1bGFyIGxvY2F0aW9uLiBGb3IKLSAgICAgKiBET0NVTUVOVCB0aGUgZGVmYXVsdCBpcyAwIEZvciBSUEMgdGhlIGRlZmF1bHQgaXMgMSBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIG92ZXJyaWRlIHRoZXNlCi0gICAgICogc2V0dGluZ3MgZm9yIHNwZWNpYWwgY2FzZXMuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGluZGlyZWN0aW9uICgwIG9yIDEpCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRJbmRpcmVjdGlvbigpOwotCi0gICAgLyoqIEByZXR1cm4gdGhlIFFOYW1lIG9mIHRoZSBvcGVyYXRpb24gZWxlbWVudCBpZiBTdHlsZS5ycGMuICBPdGhlcndpc2UgbnVsbCAqLwotICAgIHB1YmxpYyBRTmFtZSBnZXRPcGVyYXRpb25FbGVtZW50KCkgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIG9wZXJhdGlvbiBlbGVtZW50IHFuYW1lLiAgVGhlIG9wZXJhdGlvbiBxbmFtZSBpcyBvbmx5IHVzZWQgaWYgU3R5bGUucnBjCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb3BlcmF0aW9uUU5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRPcGVyYXRpb25FbGVtZW50KFFOYW1lIG9wZXJhdGlvblFOYW1lKSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIGlzQ29uc3VtZWQgUmV0dXJuIHRydWUgaWYgdGhlIHBhcnQgaXMgY29uc3VtZWQuICBPbmNlIGNvbnN1bWVkLCB0aGUgaW5mb3JtYXRpb24gaW4gdGhlIHBhcnQgaXMKLSAgICAgKiBubyBsb25nZXIgYXZhaWxhYmxlLgotICAgICAqCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBibG9jayBpcyBjb25zdW1lZCAoYSBtZXRob2Qgd2FzIGNhbGxlZCB3aXRoIGNvbnN1bWU9dHJ1ZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0NvbnN1bWVkKCk7Ci0KLSAgICAvKioKLSAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIFhNTFBhcnQgcmVwcmVzZW50cyBhIEZhdWx0Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG1lc3NhZ2UgcmVwcmVzZW50cyBhIGZhdWx0Ci0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNGYXVsdCgpIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogSWYgdGhlIFhNTFBhcnQgcmVwcmVzZW50cyBhIGZhdWx0LCBhbiBYTUxGYXVsdCBpcyByZXR1cm5lZCB3aGljaCBkZXNjcmliZXMgdGhlIGZhdWx0IGluIGEKLSAgICAgKiBwcm90b2NvbCBhZ25vc3RpYyBtYW5uZXIKLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIFhNTEZhdWx0IG9iamVjdCBvciBudWxsCi0gICAgICogQHNlZSBYTUxGYXVsdAotICAgICAqLwotICAgIHB1YmxpYyBYTUxGYXVsdCBnZXRYTUxGYXVsdCgpIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogQ2hhbmdlIHRoZSBYTUxQYXJ0IHNvIHRoYXQgaXQgcmVwcmVzZW50cyB0aGUgZmF1bHQgZGVzY3JpYmVkIGJ5IFhNTEZhdWx0Ci0gICAgICoKLSAgICAgKiBAcGFyYW0geG1sZmF1bHQKLSAgICAgKiBAc2VlIFhNTEZhdWx0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0WE1MRmF1bHQoWE1MRmF1bHQgeG1sRmF1bHQpIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogZ2V0UGFyZW50IEdldCB0aGUgTWVzc2FnZSBvYmplY3QgdGhhdCB0aGlzIFhNTFBhcnQgaXMgYXR0YWNoZWQgdG8sIGlmIGl0IGlzIGF0dGFjaGVkIHRvIG9uZQotICAgICAqIGF0IGFsbC4KLSAgICAgKgotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWVzc2FnZSBnZXRQYXJlbnQoKTsKLQotICAgIC8qKgotICAgICAqIHNldFBhcmVudCBTZXQgdGhlIE1lc3NhZ2Ugb2JqZWN0IHRoYXQgd2lsbCBob2xkIHRoaXMgWE1MUGFydAotICAgICAqCi0gICAgICogQHBhcmFtIG0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJlbnQoTWVzc2FnZSBtKTsKLQotICAgIC8qKgotICAgICAqIGdldEFzRW52ZWxvcGUgR2V0IHRoZSB4bWwgcGFydCBhcyBhIHJlYWQvd3JpdGUgU09BUEVudmVsb3BlCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFNPQVBFbnZlbG9wZQotICAgICAqIEB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBTT0FQRW52ZWxvcGUgZ2V0QXNTT0FQRW52ZWxvcGUoKSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIGdldEFzT01FbGVtZW50IEdldCB0aGUgeG1sIHBhcnQgYXMgYSByZWFkL3dyaXRlIE9NLi4ubm90ZSB0aGlzIHJldHVybnMgYW4gT00gU09BUEVudmVsb3BlIGZvcgotICAgICAqIGFsbCBwcm90b2NvbHMuLi5ldmVuIFJFU1QKLSAgICAgKgotICAgICAqIEByZXR1cm4gT01FbGVtZW50Ci0gICAgICogQHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIE9NRWxlbWVudCBnZXRBc09NRWxlbWVudCgpIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogZ2V0TnVtQm9keUJsb2NrcyBDYWxsaW5nIHRoaXMgbWV0aG9kIHdpbGwgY2FjaGUgdGhlIE9NLiAgQXZvaWQgaXQgaW4gcGVyZm9ybWFudCBzaXR1YXRpb25zLgotICAgICAqCi0gICAgICogQHJldHVybiBudW1iZXIgb2YgYm9keSBibG9ja3MKLSAgICAgKiBAdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldE51bUJvZHlCbG9ja3MoKSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIGdldEJvZHlCbG9jayBHZXQgdGhlIGJvZHkgYmxvY2sgYXQgdGhlIHNwZWNpZmljZWQgaW5kZXguIFRoZSBCbG9ja0ZhY3RvcnkgYW5kIG9iamVjdCBjb250ZXh0IGFyZQotICAgICAqIHBhc3NlZCBpbiB0byBoZWxwIGNyZWF0ZSB0aGUgcHJvcGVyIGtpbmQgb2YgYmxvY2suIENhbGxpbmcgdGhpcyBtZXRob2Qgd2lsbCBjYWNoZSB0aGUgT00uICBBdm9pZAotICAgICAqIGl0IGluIHBlcmZvcm1hbnQgc2l0dWF0aW9ucy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpbmRleAotICAgICAqIEBwYXJhbSBjb250ZXh0Ci0gICAgICogQHBhcmFtIGJsb2NrRmFjdG9yeQotICAgICAqIEByZXR1cm4gQmxvY2sgb3IgbnVsbAotICAgICAqIEB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbgotICAgICAqIEBzZWUgZ2V0Qm9keUJsb2NrCi0gICAgICovCi0gICAgcHVibGljIEJsb2NrIGdldEJvZHlCbG9jayhpbnQgaW5kZXgsIE9iamVjdCBjb250ZXh0LCBCbG9ja0ZhY3RvcnkgYmxvY2tGYWN0b3J5KQotICAgICAgICAgICAgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBnZXRCb2R5QmxvY2sgR2V0IHRoZSBzaW5nbGUgQm9keSBCbG9jay4gVGhlIEJsb2NrRmFjdG9yeSBhbmQgb2JqZWN0IGNvbnRleHQgYXJlIHBhc3NlZCBpbiB0bwotICAgICAqIGhlbHAgY3JlYXRlIHRoZSBwcm9wZXIga2luZCBvZiBibG9jay4gVGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgaW52b2tlZCB3aGVuIGl0IGlzIGtub3duCi0gICAgICogdGhhdCB0aGVyZSBpcyB6ZXJvIG9yIG9uZSBibG9jay4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpbmRleAotICAgICAqIEBwYXJhbSBjb250ZXh0Ci0gICAgICogQHBhcmFtIGJsb2NrRmFjdG9yeQotICAgICAqIEByZXR1cm4gQmxvY2sgb3IgbnVsbAotICAgICAqIEB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBCbG9jayBnZXRCb2R5QmxvY2soT2JqZWN0IGNvbnRleHQsIEJsb2NrRmFjdG9yeSBibG9ja0ZhY3RvcnkpCi0gICAgICAgICAgICB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIHNldEJvZHlCbG9jayBTZXQgdGhlIGJsb2NrIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXggT25jZSBzZXQsIHRoZSBNZXNzYWdlIG93bnMgdGhlIGJsb2NrLiAgWW91Ci0gICAgICogbXVzdCB1c2UgdGhlIGdldEJvZHlCbG9jayBtZXRob2QgdG8gYWNjZXNzIGl0LgotICAgICAqCi0gICAgICogQHBhcmFtIGluZGV4Ci0gICAgICogQHBhcmFtIGJsb2NrCi0gICAgICogQHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Qm9keUJsb2NrKGludCBpbmRleCwgQmxvY2sgYmxvY2spIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogc2V0Qm9keUJsb2NrIFNldCB0aGlzIGFzIGJsb2NrIGFzIHRoZSBzaW5nbGUgYmxvY2sgZm9yIHRoZSBtZXNzYWdlLgotICAgICAqCi0gICAgICogQHBhcmFtIGluZGV4Ci0gICAgICogQHBhcmFtIGJsb2NrCi0gICAgICogQHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Qm9keUJsb2NrKEJsb2NrIGJsb2NrKSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIHJlbW92ZUJvZHlCbG9jayBSZW1vdmVzIHRoZSBpbmRpY2F0ZWQgQm9keUJsb2NrCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaW5kZXgKLSAgICAgKiBAdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVCb2R5QmxvY2soaW50IGluZGV4KSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbjsKLQotCi0gICAgLyoqCi0gICAgICogZ2V0TnVtSGVhZGVyQmxvY2tzCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIG51bWJlciBvZiBoZWFkZXIgYmxvY2tzCi0gICAgICogQHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXROdW1IZWFkZXJCbG9ja3MoKSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIGdldEhlYWRlckJsb2NrIAotICAgICAqIEdldCB0aGUgZmlyc3RoZWFkZXIgYmxvY2sgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0gICAgICogVGhlIEJsb2NrRmFjdG9yeSBhbmQgb2JqZWN0IGNvbnRleHQKLSAgICAgKiBhcmUgcGFzc2VkIGluIHRvIGhlbHAgY3JlYXRlIHRoZSBwcm9wZXIga2luZCBvZiBibG9jay4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lc3BhY2UKLSAgICAgKiBAcGFyYW0gbG9jYWxQYXJ0Ci0gICAgICogQHBhcmFtIGNvbnRleHQKLSAgICAgKiBAcGFyYW0gYmxvY2tGYWN0b3J5Ci0gICAgICogQHJldHVybiBCbG9jawotICAgICAqIEB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBCbG9jayBnZXRIZWFkZXJCbG9jayhTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbG9jYWxQYXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmxvY2tGYWN0b3J5IGJsb2NrRmFjdG9yeSkKLSAgICAgICAgICAgIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uOwotICAgIAotICAgIC8qKgotICAgICAqIGdldEhlYWRlckJsb2NrIAotICAgICAqIEdldCB0aGUgaGVhZGVyIGJsb2NrcyB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZQotICAgICAqIFRoZSBCbG9ja0ZhY3RvcnkgYW5kIG9iamVjdCBjb250ZXh0Ci0gICAgICogYXJlIHBhc3NlZCBpbiB0byBoZWxwIGNyZWF0ZSB0aGUgcHJvcGVyIGtpbmQgb2YgYmxvY2suCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZXNwYWNlIHVyaSBvZiBoZWFkZXIKLSAgICAgKiBAcGFyYW0gbG9jYWxQYXJ0IGxvY2FsIG5hbWUgb2YgaGVhZGVyCi0gICAgICogQHBhcmFtIGNvbnRleHQgY29udGV4dCBmb3IgYmxvY2tGYWN0b3J5Ci0gICAgICogQHBhcmFtIGJsb2NrRmFjdG9yeSAga2luZCBvZiBmYWN0b3J5IChpLmUuIEpBWEIpCi0gICAgICogQHBhcmFtIFJvbGVQbGF5ZXIgZGV0ZXJtaW5lcyBhY2NlcHRhYmxlIHJvbGVzIChvciBudWxsKQotICAgICAqIEByZXR1cm4gTGlzdDxCbG9jaz4KLSAgICAgKiBAdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxCbG9jaz4gZ2V0SGVhZGVyQmxvY2tzKFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBsb2NhbFBhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbG9ja0ZhY3RvcnkgYmxvY2tGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSb2xlUGxheWVyIHJvbGVQbGF5ZXIpCi0gICAgICAgICAgICB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIHNldEhlYWRlckJsb2NrIAotICAgICAqIHJlcGxhY2VzIHRoZSBmaXJzdCBleGlzdGluZyBoZWFkZXIgYmxvY2sgd2l0aCB0aGlzIG5ldyBibG9jay4gIElmIHRoZXJlIGlzIG5vCi0gICAgICogZXhpc3RpbmcgaGVhZGVyIGJsb2NrLCBvbmUgaXMgYWRkZWQgdG8gdGhlIGVuZCBvZiB0aGUgaGVhZGVycwotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWVzcGFjZQotICAgICAqIEBwYXJhbSBsb2NhbFBhcnQKLSAgICAgKiBAcGFyYW0gYmxvY2sKLSAgICAgKiBAdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRIZWFkZXJCbG9jayhTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbG9jYWxQYXJ0LCBCbG9jayBibG9jaykKLSAgICAgICAgICAgIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uOwotICAgIAotICAgIC8qKgotICAgICAqIGFwcGVuZEhlYWRlckJsb2NrIAotICAgICAqIEFwcGVuZCB0aGUgYmxvY2sgdG8gdGhlIGxpc3Qgb2YgaGVhZGVyIGJsb2Nrcy4gVGhlIE1lc3NhZ2Ugb3ducyB0aGUgYmxvY2suCi0gICAgICogWW91IG11c3QgdXNlIHRoZSBnZXRIZWFkZXJCbG9jayBtZXRob2QgdG8gYWNjZXNzIGl0LgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWVzcGFjZQotICAgICAqIEBwYXJhbSBsb2NhbFBhcnQKLSAgICAgKiBAcGFyYW0gYmxvY2sKLSAgICAgKiBAdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhcHBlbmRIZWFkZXJCbG9jayhTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbG9jYWxQYXJ0LCBCbG9jayBibG9jaykKLSAgICAgICAgICAgIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBRTmFtZXMgb2YgaGVhZGVycwotICAgICAqLwotICAgIHB1YmxpYyBTZXQ8UU5hbWU+IGdldEhlYWRlclFOYW1lcygpOwotICAgIAotICAgIC8qKgotICAgICAqIHJlbW92ZUhlYWRlckJsb2NrCi0gICAgICogUmVtb3ZlcyBhbGwgaGVhZGVyIGJsb2NrcyB3aXRoIHRoaXMgbmFtZXNwYWNlL2xvY2FscGFydAotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWVzcGFjZQotICAgICAqIEBwYXJhbSBsb2NhbFBhcnQKLSAgICAgKiBAdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVIZWFkZXJCbG9jayhTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbG9jYWxQYXJ0KQotICAgICAgICAgICAgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb247Ci0KLQotICAgIC8qKgotICAgICAqIEdldCBhIHRyYWNlU3RyaW5nLi4udGhlIHRyYWNlIHN0cmluZyBkdW1wcyB0aGUgY29udGVudHMgb2YgdGhlIEJsb2NrIHdpdGhvdXQgZm9yY2luZyBhbgotICAgICAqIHVuZGVybHlpbmcgaWxsLXBlcmZvcm1hbnQgdHJhbnNmb3JtYXRpb24gb2YgdGhlIG1lc3NhZ2UuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFN0cmluZyBjb250YWluaW5nIHRyYWNlIGluZm9ybWF0aW9uCi0gICAgICogQGJvb2xlYW4gaW5kZW50IFN0cmluZyBjb250YWluaW5nIGluZGVudCBjaGFyYWN0ZXJzCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyB0cmFjZVN0cmluZyhTdHJpbmcgaW5kZW50KTsKLQotCi0gICAgLyoqCi0gICAgICogVGhlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBYTUxQYXJ0IG1heSBiZSBpbiBhIG51bWJlciBvZiBkaWZmZXJlbnQgZm9ybXMuICBDdXJyZW50bHkgdGhlIGZvcm1zCi0gICAgICogYXJlIFVOS05PV04sIE9NLCBTT0FQRU5WRUxPUEUsIGFuZCBTUElORS4gIFRoaXMgbWV0aG9kIHJldHVybnMgYSBTdHJpbmcgY29udGFpbmluZyBvbmUgb2YKLSAgICAgKiB0aGVzZSB0eXBlcy4gIFRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIHRyYWNlIGFuZCB0ZXN0aW5nIHB1cnBvc2VzLiAgVGhlIGNvbnN1bWVyCi0gICAgICogb2YgYSBNZXNzYWdlIHNob3VsZCBub3QgbWFrZSBhbnkgZGVjaXNpb25zIGJhc2VkIG9uIHRoZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgWE1MUGFydAotICAgICAqCi0gICAgICogQHJldHVybiBTdHJpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFhNTFBhcnRDb250ZW50VHlwZSgpOwotCi0gICAgLyoqICAgIAotICAgICAqIFVzZWQgcHJpbWFyaWx5IHRvIGVuc3VyZSB0aGUgcGFyc2VyIGlzIGZvcndhcmRlZCB0byB0aGUgZW5kIHNvIGl0IGNhbiBiZSBjbG9zZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY2xvc2UoKTsKLX0gICAKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvYXR0YWNobWVudHMvQXR0YWNobWVudFV0aWxzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2F0dGFjaG1lbnRzL0F0dGFjaG1lbnRVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjdiMzY3Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvYXR0YWNobWVudHMvQXR0YWNobWVudFV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuYXR0YWNobWVudHM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLmF0dGFjaG1lbnRzLkF0dGFjaG1lbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uYXR0YWNobWVudHMuQ2FjaGVkRmlsZURhdGFTb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5vZGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTVRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmxsb20uT01OYXZpZ2F0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXI7Ci1pbXBvcnQgamF2YXguYWN0aXZhdGlvbi5EYXRhU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLS8qKiBBIHN1aXRlIG9mIHV0aWxpdGllcyB1c2VkIGZvciBoYW5kbGluZyBNVE9NIGF0dGFjaG1lbnQgZGF0YS4gKi8KLXB1YmxpYyBjbGFzcyBBdHRhY2htZW50VXRpbHMgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEF0dGFjaG1lbnRVdGlscy5jbGFzcyk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUU5hbWUgWE9QX0lOQ0xVREUgPQotICAgICAgICAgICAgbmV3IFFOYW1lKCJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3hvcC9pbmNsdWRlIiwgIkluY2x1ZGUiKTsKLQotICAgIC8qKgotICAgICAqIENhbiBiZSB1c2VkIHRvIGZpbmQgYWxsIGluc3RhbmNlcyBvZiB0aGUgPHByZT48eG9wOmluY2x1ZGU+PC9wcmU+IGVsZW1lbnQKLSAgICAgKiB3aXRoaW4gYSBnaXZlbiBPTSBTT0FQRW52ZWxvcGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZW52Ci0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQXJyYXlMaXN0PE9NRWxlbWVudD4gZmluZFhvcEVsZW1lbnRzKE9NRWxlbWVudCBlbnYpIHsKLSAgICAgICAgQXJyYXlMaXN0PE9NRWxlbWVudD4geG9wcyA9IG5ldyBBcnJheUxpc3Q8T01FbGVtZW50PigpOwotICAgICAgICBmaW5kWG9wRWxlbWVudHMoZW52LCB4b3BzKTsKLSAgICAgICAgcmV0dXJuIHhvcHM7Ci0gICAgfQotCi0gICAgLyoKLSAgICAqIEEgcmVjdXJzaXZlIHNlYXJjaCBmb3IgYWxsIG9mIHRoZSA8eG9wOmluY2x1ZGU+IGVsZW1lbnRzIGluIHRoZSB0cmVlLgotICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBmaW5kWG9wRWxlbWVudHMoT01FbGVtZW50IHJvb3QsIEFycmF5TGlzdDxPTUVsZW1lbnQ+IHhvcHMpIHsKLQotICAgICAgICAvLyAgICAgIEZvcmNlcyBhIHBhcnNlLiAgVGhpcyBzZWVtcyB0byBiZSBuZWNlc3NhcnkgZHVlIHRvIGJ1Z3MgaW4gT01OYXZpZ2F0b3IKLSAgICAgICAgcm9vdC5nZXROZXh0T01TaWJsaW5nKCk7Ci0KLSAgICAgICAgLy8gTmF2aWdhdG9yIGRvZXMgYSB0cmF2ZXJzYWwgdGhhdCBtaW1pY3MgdGhlIHN0cnVjdHVyZSBvZiBhbiB4bWwgZG9jdW1lbnQuIAotICAgICAgICAvLyBFYWNoIG5vbi1lbGVtZW50IG9iamVjdCBpcyBwcm9jZXNzZWQgb25jZS4KLSAgICAgICAgLy8gRWFjaCBlbGVtZW50IG9iamVjdCBpcyB2aXNpdGVkIHByaW9yIHRvIGl0cyBjaGlsZHJlbiBhbmQgYWZ0ZXIgaXRzIGNoaWxkcmVuLgotICAgICAgICAvLyAKLSAgICAgICAgLy8gU3VwcG9zZSB5b3UgaGF2ZSB0aGUgZm9sbG93aW5nIHRyZWUgKGNhcHMgYXJlIGVsZW1lbnRzLCBsb3dlcnMgYXJlIHRleHQpCi0gICAgICAgIC8vIAotICAgICAgICAvLyAgICAgQQotICAgICAgICAvLyAgICAvIFwKLSAgICAgICAgLy8gICBCICAgQwotICAgICAgICAvLyAgL1wgICAvXAotICAgICAgICAvLyAgRCBlIEYgIGcKLSAgICAgICAgLy8KLSAgICAgICAgLy8gVGhlIHRyYXZlcnNhbCBpcwotICAgICAgICAvLyBpcyBBIEIgRCBEJyBlIEInIEMgRiBGJyBnIEMnIEEnCi0gICAgICAgIC8vIFRoZSAnIGluZGljYXRlcyB0aGF0IHRoaXMgaXMgdGhlIHNlY29uZCB0aW1lIHRoZSBub2RlIGlzIHZpc2l0ZWQgKGkuZS4gbmF2LnZpc2l0ZWQoKSAKLSAgICAgICAgLy8gcmV0dXJucyB0cnVlKQotCi0gICAgICAgIE9NTmF2aWdhdG9yIG5hdiA9IG5ldyBPTU5hdmlnYXRvcihyb290KTsKLQotICAgICAgICB3aGlsZSAobmF2LmlzTmF2aWdhYmxlKCkpIHsKLSAgICAgICAgICAgIE9NTm9kZSBjdXJyID0gbmF2Lm5leHQoKTsKLQotICAgICAgICAgICAgLy8gSW5zcGVjdCBlbGVtZW50cyB0aGF0IGhhdmUgYmVlbiB2aXNpdGVkLiAKLSAgICAgICAgICAgIC8vIEl0IGlzIHByb2JhYmx5IHNhZmVyIHRvIGluc3BlY3QgdGhlIG5vZGUgd2hlbiBpdCBpcyB2aXNpdGVkLCBiZWNhdXNlIAotICAgICAgICAgICAgLy8gdGhpcyBndWFyYW50ZWVzIHRoYXQgaXRzIGNoaWxkcmVuIGhhdmUgYmVlbiBwcm9jZXNzZWQvZXhwYW5kZWQuCi0gICAgICAgICAgICBpZiAobmF2LnZpc2l0ZWQoKSAmJiBjdXJyIGluc3RhbmNlb2YgT01FbGVtZW50KSB7Ci0gICAgICAgICAgICAgICAgT01FbGVtZW50IGVsZW1lbnQgPSAoT01FbGVtZW50KWN1cnI7Ci0gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuZ2V0UU5hbWUoKS5lcXVhbHMoWE9QX0lOQ0xVREUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJbWE9QX0lOQ0xVREVdICIgKyBlbGVtZW50LmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB4b3BzLmFkZChlbGVtZW50KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYW4gYmUgdXNlZCB0byBmaW5kIGFsbCBvZiB0aGUgbm9kZXMgaW4gYSB0cmVlIHRoYXQgY29udGFpbiBiaW5hcnkgY29udGVudCB0aGF0IGlzIHRhcmdldHRlZAotICAgICAqIGZvciBvcHRpbWl6YXRpb24gdmlhIE1UT00uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZW52Ci0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQXJyYXlMaXN0PE9NVGV4dD4gZmluZEJpbmFyeU5vZGVzKFNPQVBFbnZlbG9wZSBlbnYpIHsKLSAgICAgICAgQXJyYXlMaXN0PE9NVGV4dD4gbm9kZXMgPSBuZXcgQXJyYXlMaXN0PE9NVGV4dD4oKTsKLSAgICAgICAgZmluZEJpbmFyeUVsZW1lbnRzKGVudiwgbm9kZXMpOwotICAgICAgICByZXR1cm4gbm9kZXM7Ci0gICAgfQotCi0gICAgLyoKLSAgICAqIEEgcmVjdXJzaXZlIHNlYXJjaCBmb3IgYWxsIG9mIHRoZSBiaW5hcnksIG9wdGltaXplZCBub2RlcyBpbiBhIHRyZWUuCi0gICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGZpbmRCaW5hcnlFbGVtZW50cyhPTU5vZGUgbm9kZSwgQXJyYXlMaXN0PE9NVGV4dD4gYXR0YWNobWVudHMpIHsKLQotICAgICAgICAvLyBGb3JjZXMgYSBwYXJzZS4gIFRoaXMgc2VlbXMgdG8gYmUgbmVjZXNzYXJ5IGR1ZSB0byBidWdzIGluIE9NTmF2aWdhdG9yCi0gICAgICAgIG5vZGUuZ2V0TmV4dE9NU2libGluZygpOwotCi0gICAgICAgIC8vIE5hdmlnYXRvciBkb2VzIGEgdHJhdmVyc2FsIHRoYXQgbWltaWNzIHRoZSBzdHJ1Y3R1cmUgb2YgYW4geG1sIGRvY3VtZW50LiAKLSAgICAgICAgLy8gRWFjaCBub24tZWxlbWVudCBvYmplY3QgaXMgcHJvY2Vzc2VkIG9uY2UuCi0gICAgICAgIC8vIEVhY2ggZWxlbWVudCBvYmplY3QgaXMgdmlzaXRlZCBwcmlvciB0byBpdHMgY2hpbGRyZW4gYW5kIGFmdGVyIGl0cyBjaGlsZHJlbi4KLSAgICAgICAgLy8gCi0gICAgICAgIC8vIFN1cHBvc2UgeW91IGhhdmUgdGhlIGZvbGxvd2luZyB0cmVlIChjYXBzIGFyZSBlbGVtZW50cywgbG93ZXJzIGFyZSB0ZXh0KQotICAgICAgICAvLyAKLSAgICAgICAgLy8gICAgIEEKLSAgICAgICAgLy8gICAgLyBcCi0gICAgICAgIC8vICAgQiAgIEMKLSAgICAgICAgLy8gIC9cICAgL1wKLSAgICAgICAgLy8gIEQgZSBGICBnCi0gICAgICAgIC8vIAotICAgICAgICAvLyBUaGUgdHJhdmVyc2FsIGlzCi0gICAgICAgIC8vIFRoZSB0cmF2ZXJzYWwgaXMKLSAgICAgICAgLy8gaXMgQSBCIEQgRCcgZSBCJyBDIEYgRicgZyBDJyBBJwotICAgICAgICAvLyBUaGUgJyBpbmRpY2F0ZXMgdGhhdCB0aGlzIGlzIHRoZSBzZWNvbmQgdGltZSB0aGUgbm9kZSBpcyB2aXNpdGVkIAotICAgICAgICAvLyAoaS5lLiBuYXYuaXNWaXNpdGVkKCkgcmV0dXJucyB0cnVlKQotICAgICAgICBPTU5hdmlnYXRvciBuYXYgPSBuZXcgT01OYXZpZ2F0b3Iobm9kZSk7Ci0KLSAgICAgICAgd2hpbGUgKG5hdi5pc05hdmlnYWJsZSgpKSB7Ci0gICAgICAgICAgICBPTU5vZGUgY3VyciA9IG5hdi5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAoY3VyciBpbnN0YW5jZW9mIE9NVGV4dCkgewotICAgICAgICAgICAgICAgIC8vIElmIGl0J3MgYW4gT01UZXh0LCBzZWUgaWYgaXRzIG9wdGltaXplZCBhbmQgYWRkIGl0IHRvIHRoZSBsaXN0Ci0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoInRleHQgbm9kZSBmb3VuZCIpOwotCi0gICAgICAgICAgICAgICAgT01UZXh0IHRleHROb2RlID0gKE9NVGV4dCljdXJyOwotICAgICAgICAgICAgICAgIGlmICh0ZXh0Tm9kZS5pc09wdGltaXplZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1Zygib3B0aW1pemVkIHRleHQgbm9kZSBmb3VuZCIpOwotCi0gICAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRzLmFkZCh0ZXh0Tm9kZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2l2ZW4gYW4gPHByZT48eG9wOmluY2x1ZGU+PC9wcmU+IGVsZW1lbnQsIGNyZWF0ZSBhbiBPTVRleHQgZWxlbWVudAotICAgICAqIHdpdGggdGhlIGFwcHJvcHJpYXRlIGF0dGFjaG1lbnQgZGF0YS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB4b3AKLSAgICAgKiBAcGFyYW0gZGF0YQotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE9NVGV4dCBtYWtlQmluYXJ5T01Ob2RlKE9NRWxlbWVudCB4b3AsIERhdGFIYW5kbGVyIGRoKSB7Ci0gICAgICAgIE9NRmFjdG9yeSBmYWN0b3J5ID0geG9wLmdldE9NRmFjdG9yeSgpOwotICAgICAgICBPTVRleHQgYmluYXJ5Tm9kZSA9IGZhY3RvcnkuY3JlYXRlT01UZXh0KGRoLCB0cnVlKTsKLSAgICAgICAgcmV0dXJuIGJpbmFyeU5vZGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2l2ZW4gYW4gT01UZXh0IG5vZGUsIGNyZWF0ZSBpdCdzIGNvcnJlc3BvbmRpbmcgPHByZT48eG9wOmluY2x1ZGU+PC9wcmU+Ci0gICAgICogZWxlbWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE9NRWxlbWVudCBtYWtlWG9wRWxlbWVudChPTVRleHQgZGF0YSkgewotICAgICAgICBPTUZhY3RvcnkgZmFjdG9yeSA9IGRhdGEuZ2V0T01GYWN0b3J5KCk7Ci0gICAgICAgIE9NRWxlbWVudCB4b3AgPSBmYWN0b3J5LmNyZWF0ZU9NRWxlbWVudChYT1BfSU5DTFVERSwgbnVsbCk7Ci0gICAgICAgIHhvcC5hZGRBdHRyaWJ1dGUoImhyZWYiLCBkYXRhLmdldENvbnRlbnRJRCgpLCBudWxsKTsKLSAgICAgICAgcmV0dXJuIHhvcDsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUHJvY2VzcyBhdHRhY2htZW50J3MgZGF0YUhhbmRsZXJzIGZvciBDYWNoZWRGaWxlRGF0YVNvdXJjZS4KLSAgICAgKiBJZiBleGlzdCwgZXhlY3V0ZSBmaWxlLmRlbGV0ZU9uRXhpdCgpIHJlcXVlc3Qgb24gdGhlIGNhY2hlZAotICAgICAqIGF0dGFjaG1lbnQgZmlsZSByZWZlcmVuY2VkIGJ5IGVhY2ggQ2FjaGVkRmlsZURhdGFTb3VyY2UuCi0gICAgICogVGhpcyB3aWxsIGRlbGV0ZSB0aGUgY2FjaGVkIGF0dGFjaG1lbnQgZmlsZSBvbiBKVk0gZXhpdC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYXR0YWNobWVudHMKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZmluZENhY2hlZEF0dGFjaG1lbnQoQXR0YWNobWVudHMgYXR0YWNobWVudHMpewotICAgIAlpZihhdHRhY2htZW50cyA9PSBudWxsKXsKLSAgICAJCXJldHVybjsKLSAgICAJfQotICAgIAkKLSAgICAJU3RyaW5nW10gY29udGVudElkcyA9IGF0dGFjaG1lbnRzLmdldEFsbENvbnRlbnRJRHMoKTsKLSAgICAJaWYoY29udGVudElkcy5sZW5ndGggPiAwKXsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgCWxvZy5kZWJ1ZygiQXR0YWNobWVudHMgZXhpc3QuLi4uIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIAlmb3IoaW50IGk9MDsgaSA8IGNvbnRlbnRJZHMubGVuZ3RoOyBpKyspewotICAgICAgICAJCURhdGFIYW5kbGVyIGRoID0gYXR0YWNobWVudHMuZ2V0RGF0YUhhbmRsZXIoY29udGVudElkc1tpXSk7Ci0gICAgICAgIAkJaWYoZGggIT0gbnVsbCl7Ci0gICAgICAgIAkJCURhdGFTb3VyY2UgZGF0YVNvdXJjZSA9IGRoLmdldERhdGFTb3VyY2UoKTsKLSAgICAgICAgCQkJaWYoZGggIT0gbnVsbCAmJiBkYXRhU291cmNlIGluc3RhbmNlb2YgQ2FjaGVkRmlsZURhdGFTb3VyY2UpewotICAgICAgICAJCQkJaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAJbG9nLmRlYnVnKCJBdHRhY2htZW50J3MgRGF0YUhhbmRsZXIgdXNlcyBDYWNoZWRGaWxlRGF0YVNvdXJjZS4uLiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAJRmlsZSBmaWxlID0gKChDYWNoZWRGaWxlRGF0YVNvdXJjZSlkYXRhU291cmNlKS5nZXRGaWxlKCk7Ci0gICAgICAgICAgICAgICAgICAgIAlpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIAlsb2cuZGVidWcoIiBNYWtpbmcgZmlsZS5kZWxldGVPbkV4aXQoKSByZXF1ZXN0IG9uICIrZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAlmaWxlLmRlbGV0ZU9uRXhpdCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgIAkJfQotICAgICAgICAJfQotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2F0dGFjaG1lbnRzL0pBWEJBdHRhY2htZW50TWFyc2hhbGxlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9hdHRhY2htZW50cy9KQVhCQXR0YWNobWVudE1hcnNoYWxsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Q2NGI5Ni4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2F0dGFjaG1lbnRzL0pBWEJBdHRhY2htZW50TWFyc2hhbGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuYXR0YWNobWVudHM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuTWVzc2FnZTsKLQotaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXI7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXI7Ci0KLS8qKgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIEpBWEIgQXR0YWNobWVudE1hcnNoYWxsZXIgdGhhdCBpcyB1c2VkIHRvIGhhbmRsZSBiaW5hcnkgZGF0YSBmcm9tIEpBWEIKLSAqIGFuZCBjcmVhdGUgcG9wdWxhdGUgdGhlIGFwcHJvcHJpYXRlIGNvbnN0cnVjdHMgd2l0aGluIHRoZSBKQVgtV1MgTWVzc2FnZSBNb2RlbC4KLSAqLwotcHVibGljIGNsYXNzIEpBWEJBdHRhY2htZW50TWFyc2hhbGxlciBleHRlbmRzIG9yZy5hcGFjaGUuYXhpczIuZGF0YXNvdXJjZS5qYXhiLkpBWEJBdHRhY2htZW50TWFyc2hhbGxlciB7Ci0gICAgcHJpdmF0ZSBNZXNzYWdlIG1lc3NhZ2U7Ci0gICAgCi0gICAgcHVibGljIEpBWEJBdHRhY2htZW50TWFyc2hhbGxlcihNZXNzYWdlIG1lc3NhZ2UsIFhNTFN0cmVhbVdyaXRlciB3cml0ZXIpIHsKLSAgICAgICAgc3VwZXIobnVsbCwgd3JpdGVyKTsKLSAgICAgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogQHJldHVybiBpZiBNVE9NIGVuYWJsZWQgY2FsY3VsYXRlZCBmcm9tIHRoZSBjb250ZXh0IGluZm9ybWF0aW9uCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNNVE9NRW5hYmxlZCgpIHsKLSAgICAgICAgaWYgKG1lc3NhZ2UgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2UuaXNNVE9NRW5hYmxlZCgpOwotICAgICAgICB9ICAKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogSW5kaWNhdGUgb24gdGhlIGNvbnRleHQgdGhhdCBTV0EgYXR0YWNobWVudHMgYXJlIGVuY291bnRlcmVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RG9pbmdTV0EoKSB7Ci0gICAgICAgIGlmIChtZXNzYWdlICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1lc3NhZ2Uuc2V0RG9pbmdTV0EodHJ1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogSW5mb3JtIHRoZSBjb250ZXh0IHRoYXQgYW4gQXR0YWNobWVudCAoRGF0YUhhbmRsZXIsIENJRCkgaXMgd3JpdHRlbi4KLSAgICAgKiBAcGFyYW0gZGgKLSAgICAgKiBAcGFyYW0gY2lkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkRGF0YUhhbmRsZXIoRGF0YUhhbmRsZXIgZGgsIFN0cmluZyBjaWQpIHsKLSAgICAgICAgaWYgKG1lc3NhZ2UgIT0gbnVsbCkgewotICAgICAgICAgICAgbWVzc2FnZS5hZGREYXRhSGFuZGxlcihkaCwgY2lkKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvYXR0YWNobWVudHMvSkFYQkF0dGFjaG1lbnRVbm1hcnNoYWxsZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvYXR0YWNobWVudHMvSkFYQkF0dGFjaG1lbnRVbm1hcnNoYWxsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA5MTc1ZC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2F0dGFjaG1lbnRzL0pBWEJBdHRhY2htZW50VW5tYXJzaGFsbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5hdHRhY2htZW50czsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01YTUxTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhc291cmNlLmpheGIuSkFYQkF0dGFjaG1lbnRVbm1hcnNoYWxsZXJNb25pdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5NZXNzYWdlOwotCi1pbXBvcnQgamF2YXguYWN0aXZhdGlvbi5EYXRhSGFuZGxlcjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKLQotLyoqCi0gKiBKQVhCQXR0YWNobWVudFVubWFyc2hhbGxlcgotICogPHAvPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIDxsaW5rPmphdmF4LnhtbC5iaW5kLmF0dGFjaG1lbnQuQXR0YWNobWVudFVubWFyc2hhbGxlcjwvbGluaz4gdGhhdCBpcwotICogdXNlZCBmb3IgZGVzZXJpYWxpemluZyBYT1AgZWxlbWVudHMgaW50byB0aGVpciBjb3JyZXNwb25kaW5nIGJpbmFyeSBkYXRhIHBhY2thZ2VzLgotICovCi1wdWJsaWMgY2xhc3MgSkFYQkF0dGFjaG1lbnRVbm1hcnNoYWxsZXIgZXh0ZW5kcyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFzb3VyY2UuamF4Yi5KQVhCQXR0YWNobWVudFVubWFyc2hhbGxlciB7Ci0KLSAgICBwcml2YXRlIE1lc3NhZ2UgbWVzc2FnZTsKLSAgICBwcml2YXRlIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXI7Ci0KLSAgICBwdWJsaWMgSkFYQkF0dGFjaG1lbnRVbm1hcnNoYWxsZXIoTWVzc2FnZSBtZXNzYWdlLCBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyKSB7Ci0gICAgICAgIHN1cGVyKG51bGwsIHhtbFN0cmVhbVJlYWRlcik7Ci0gICAgICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIERhdGFIYW5kbGVyIGdldERhdGFIYW5kbGVyKFN0cmluZyBjaWQpIHsKLSAgICAgICAgCi0gICAgICAgIC8vIEdldCB0aGUgYXR0YWNobWVudCBmcm9tIHRoZSBtZXNzYWdlIHVzaW5nIHRoZSBjaWQKLSAgICAgICAgaWYgKG1lc3NhZ2UgIT0gbnVsbCkgewotICAgICAgICAgICAgRGF0YUhhbmRsZXIgZGggPSBtZXNzYWdlLmdldERhdGFIYW5kbGVyKGNpZCk7Ci0gICAgICAgICAgICBpZiAoZGggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIEpBWEJBdHRhY2htZW50VW5tYXJzaGFsbGVyTW9uaXRvci5hZGRCbG9iQ0lEKGNpZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZGg7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmICh4bWxTdHJlYW1SZWFkZXIgaW5zdGFuY2VvZiBPTVhNTFN0cmVhbVJlYWRlcikgewotICAgICAgICAgICAgRGF0YUhhbmRsZXIgZGggPSAKLSAgICAgICAgICAgICAgICAoKE9NWE1MU3RyZWFtUmVhZGVyKSB4bWxTdHJlYW1SZWFkZXIpLmdldERhdGFIYW5kbGVyKGNpZCk7Ci0gICAgICAgICAgICBpZiAoZGggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIEpBWEJBdHRhY2htZW50VW5tYXJzaGFsbGVyTW9uaXRvci5hZGRCbG9iQ0lEKGNpZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZGg7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2RhdGFiaW5kaW5nL0NsYXNzRmluZGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2RhdGFiaW5kaW5nL0NsYXNzRmluZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzYTY3OWYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9kYXRhYmluZGluZy9DbGFzc0ZpbmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZGF0YWJpbmRpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotLyoKLSAqIENsYXNzRmluZGVyIHdpbGwgYmUgdXNlZCB0byBmaW5kIGNsYXNzZXMgd2l0aGluIGEgZ2l2ZW4gcGFja2FnZS4gVGhlIGdpdmVuIAotICogcGFja2FnZSBjYW4gYmUgZm91bmQgaW4gYSBEaXJlY3Rvcnkgb3IgaW4gYSBqYXIgZmlsZS4gQ2xhc3NGaW5kZXIgd2lsbCB1c2UgdGhlIAotICogQ2xhc3NMb2FkZXIgdG8gZ2V0IHRoZSBjbGFzc2VzIGZyb20gdGhlIGphciBmaWxlcy4gCi0gKi8KLQotcHVibGljIGludGVyZmFjZSBDbGFzc0ZpbmRlciB7Ci0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIHJlYWRzIGFsbCB0aGUgY2xhc3NlcyBmcm9tIGdpdmVuIHBhY2thZ2UgaW4gYSBqYXIgZmlsZS4gSXQgdXNlcyBDbGFzc0xvYWRlciB0byBmaW5kCi0gICAgICogdGhlIGdpdmVuIHBhY2thZ2UgaW4gYSBqYXIgZmlsZSB0aGF0IGlzIGxvY2F0ZWQgaW4gY2xhc3NwYXRoLgotICAgICAqCi0gICAgICogQHBhcmFtIHBrZwotICAgICAqIEBwYXJhbSBjbAotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBBcnJheUxpc3Q8Q2xhc3M+IGdldENsYXNzZXNGcm9tSmFyRmlsZShTdHJpbmcgcGtnLCBDbGFzc0xvYWRlciBjbCkKLSAgICAgICAgICAgIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9kYXRhYmluZGluZy9EYXRhU291cmNlQmxvY2suamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvZGF0YWJpbmRpbmcvRGF0YVNvdXJjZUJsb2NrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxYWY3M2QuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9kYXRhYmluZGluZy9EYXRhU291cmNlQmxvY2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5kYXRhYmluZGluZzsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLkJsb2NrOw0KLQ0KLS8qKiBEYXRhU291cmNlQmxvY2sgQmxvY2sgd2l0aCBhIGJ1c2luZXNzIG9iamVjdCB0aGF0IGlzIGEgamF2YXguYWN0aXZhdGlvbi5EYXRhU291cmNlICovDQotcHVibGljIGludGVyZmFjZSBEYXRhU291cmNlQmxvY2sgZXh0ZW5kcyBCbG9jayB7DQotDQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvZGF0YWJpbmRpbmcvSkFYQkJsb2NrLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2RhdGFiaW5kaW5nL0pBWEJCbG9jay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWY3ZDViLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvZGF0YWJpbmRpbmcvSkFYQkJsb2NrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5kYXRhYmluZGluZzsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5CbG9jazsKLQotLyoqIEpBWEJCbG9jayBCbG9jayByZXByZXNlbnRlZCBieSBhIEpBWEIgb2JqZWN0ICovCi1wdWJsaWMgaW50ZXJmYWNlIEpBWEJCbG9jayBleHRlbmRzIEJsb2NrIHsKLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9kYXRhYmluZGluZy9KQVhCQmxvY2tDb250ZXh0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2RhdGFiaW5kaW5nL0pBWEJCbG9ja0NvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWIwYzc4Mi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2RhdGFiaW5kaW5nL0pBWEJCbG9ja0NvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5kYXRhYmluZGluZzsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFzb3VyY2UuamF4Yi5KQVhCRFNDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5NZXNzYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5hdHRhY2htZW50cy5KQVhCQXR0YWNobWVudE1hcnNoYWxsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmF0dGFjaG1lbnRzLkpBWEJBdHRhY2htZW50VW5tYXJzaGFsbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc3BpLkNvbnN0YW50czsKLQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJDb250ZXh0OwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmF0dGFjaG1lbnQuQXR0YWNobWVudE1hcnNoYWxsZXI7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYXR0YWNobWVudC5BdHRhY2htZW50VW5tYXJzaGFsbGVyOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwotCi0vKgotICogQSBKQVhCQmxvY2tDb250ZXh0IGNvbnRyb2xzIGFjY2VzcyB0byB0aGUgSkFYQkNvbnRleHQKLSAqIEluIGFkZGl0aW9uIHRoZSBKQVhCQmxvY2tDb250ZXh0IGNvbnRhaW5zIGFkZGl0aW9uYWwgY29udGV4dHVyYWwgaW5mb3JtYXRpb24gbmVlZGVkCi0gKiBieSB0aGUgSkFYLVdTIGNvbXBvbmVudAotICovCi0KLXB1YmxpYyBjbGFzcyBKQVhCQmxvY2tDb250ZXh0IGV4dGVuZHMgSkFYQkRTQ29udGV4dCB7Ci0KLSAgICBNZXNzYWdlIG1lc3NhZ2UgPSBudWxsOwotICAgIC8qKgotICAgICAqIEZ1bGwgQ29uc3RydWN0b3IgSkFYQkJsb2NrQ29udGV4dCAobW9zdCBwZXJmb3JtYW50KQotICAgICAqCi0gICAgICogQHBhcmFtIHBhY2thZ2VzIFNldCBvZiBwYWNrYWdlcyBuZWVkZWQgYnkgdGhlIEpBWEJDb250ZXh0LgotICAgICAqLwotICAgIHB1YmxpYyBKQVhCQmxvY2tDb250ZXh0KFRyZWVTZXQ8U3RyaW5nPiBwYWNrYWdlcywgU3RyaW5nIHBhY2thZ2VzS2V5KSB7Ci0gICAgICAgIHN1cGVyKHBhY2thZ2VzLCBwYWNrYWdlc0tleSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2xpZ2h0bHkgc2xvd2VyIGNvbnN0cnVjdG9yCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGFja2FnZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgSkFYQkJsb2NrQ29udGV4dChUcmVlU2V0PFN0cmluZz4gcGFja2FnZXMpIHsKLSAgICAgICAgdGhpcyhwYWNrYWdlcywgcGFja2FnZXMudG9TdHJpbmcoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTm9ybWFsIENvbnN0cnVjdG9yIEpBWEJCbG9ja0NvbnRleHQKLSAgICAgKgotICAgICAqIEBwYXJhbSBjb250ZXh0UGFja2FnZQotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgcHVibGljIEpBWEJCbG9ja0NvbnRleHQoU3RyaW5nIGNvbnRleHRQYWNrYWdlKSB7Ci0gICAgICAgIHN1cGVyKGNvbnRleHRQYWNrYWdlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAiRGlzcGF0Y2giIENvbnN0cnVjdG9yIFVzZSB0aGlzIGZ1bGwgY29uc3RydWN0b3Igd2hlbiB0aGUgSkFYQkNvbnRlbnQgaXMgcHJvdmlkZWQgYnkgdGhlCi0gICAgICogY3VzdG9tZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gamF4YkNvbnRleHQKLSAgICAgKi8KLSAgICBwdWJsaWMgSkFYQkJsb2NrQ29udGV4dChKQVhCQ29udGV4dCBqYXhiQ29udGV4dCkgewotICAgICAgICBzdXBlcihqYXhiQ29udGV4dCk7Ci0gICAgfQotCi0gICAgcHVibGljIE1lc3NhZ2UgZ2V0TWVzc2FnZSgpIHsKLSAgICAgICAgcmV0dXJuIG1lc3NhZ2U7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKLSAgICAgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgQXR0YWNobWVudE1hcnNoYWxsZXIgY3JlYXRlQXR0YWNobWVudE1hcnNoYWxsZXIoWE1MU3RyZWFtV3JpdGVyIHdyaXRlcikgewotICAgICAgICByZXR1cm4gbmV3IEpBWEJBdHRhY2htZW50TWFyc2hhbGxlcihnZXRNZXNzYWdlKCksIHdyaXRlcik7Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBBdHRhY2htZW50VW5tYXJzaGFsbGVyIGNyZWF0ZUF0dGFjaG1lbnRVbm1hcnNoYWxsZXIoWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgewotICAgICAgICByZXR1cm4gbmV3IEpBWEJBdHRhY2htZW50VW5tYXJzaGFsbGVyKGdldE1lc3NhZ2UoKSwgcmVhZGVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2xhc3NMb2FkZXIgZ2V0Q2xhc3NMb2FkZXIoKSB7Ci0gICAgICAgIGlmKG1lc3NhZ2UgIT0gbnVsbCAmJiBtZXNzYWdlLmdldE1lc3NhZ2VDb250ZXh0KCkgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIChDbGFzc0xvYWRlcikgbWVzc2FnZS5nZXRNZXNzYWdlQ29udGV4dCgpLgotICAgICAgICAgICAgICAgIGdldFByb3BlcnR5KENvbnN0YW50cy5DQUNIRV9DTEFTU0xPQURFUik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldENsYXNzTG9hZGVyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIE1lc3NhZ2VDb250ZXh0IGdldE1lc3NhZ2VDb250ZXh0KCkgewotICAgICAgICBpZihtZXNzYWdlICE9IG51bGwgJiYgbWVzc2FnZS5nZXRNZXNzYWdlQ29udGV4dCgpICE9IG51bGwgJiYKLSAgICAgICAgICAgbWVzc2FnZS5nZXRNZXNzYWdlQ29udGV4dCgpLmdldEF4aXNNZXNzYWdlQ29udGV4dCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIHN1cGVyLnNldE1lc3NhZ2VDb250ZXh0KG1lc3NhZ2UuZ2V0TWVzc2FnZUNvbnRleHQoKS5nZXRBeGlzTWVzc2FnZUNvbnRleHQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9kYXRhYmluZGluZy9KQVhCQ29udGV4dEZyb21DbGFzc2VzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2RhdGFiaW5kaW5nL0pBWEJDb250ZXh0RnJvbUNsYXNzZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTgyZGYxYi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2RhdGFiaW5kaW5nL0pBWEJDb250ZXh0RnJvbUNsYXNzZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZGF0YWJpbmRpbmc7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJDb250ZXh0Ow0KLWltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50Ow0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGU7DQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotDQotaW1wb3J0IGphdmEuYXd0LkltYWdlOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOw0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Bbm5vdGF0ZWRFbGVtZW50Ow0KLWltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsNCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7DQotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbjsNCi1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb247DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogVGhpcyBjbGFzcyBwcm92aWRlcyBhIHV0aWxpdHkgbWV0aG9kLCBuZXdJbnN0YW5jZSwgd2hpY2gNCi0gKiBidWlsZHMgYSB2YWxpZCBKQVhCQ29udGV4dCBmcm9tIGEgc2VyaWVzIG9mIGNsYXNzZXMuDQotICovDQotcHVibGljIGNsYXNzIEpBWEJDb250ZXh0RnJvbUNsYXNzZXMgew0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coSkFYQkNvbnRleHRGcm9tQ2xhc3Nlcy5jbGFzcyk7DQotICAgIC8qKg0KLSAgICAgKiBTdGF0aWMgdXRpbGl0eSBjbGFzcy4gIENvbnN0cnVjdG9yIGlzIGludGVudGlvbmFsbHkgcHJpdmF0ZQ0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBKQVhCQ29udGV4dEZyb21DbGFzc2VzKCkgew0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBDcmVhdGUgYSBKQVhCQ29udGV4dCBmcm9tIHRoZSBnaXZlbiBjbGFzcyBhcnJheSBhbmQgY2xhc3MgbG9hZGVyLg0KLSAgICAgKiBJZiBlcnJvcnMgb2NjdXIsIHRoZW4gdGhlIEpBWEJDb250ZXh0IGlzIGNyZWF0ZWQgZnJvbSB0aGUgDQotICAgICAqIG1pbmltYWwgc2V0IG9mIHZhbGlkIGNsYXNzZXMuDQotICAgICAqIA0KLSAgICAgKiBOb3RlOiBTb21ldGltZXMgdXNlcnMgd2lsbCBpbnRlcm1pbmdsZSBKQVhCIGNsYXNzZXMgYW5kIG90aGVyDQotICAgICAqIG5vbi1KQVhCIHV0aWxpdHkgY2xhc3Nlcy4gIFRoaXMgaXMgbm90IGEgZ29vZCBwcmFjdGljZSwgYnV0IGRvZXMNCi0gICAgICogaGFwcGVuLiAgVGhlIHB1cnBvc2Ugb2YgdGhpcyBtZXRob2QgaXMgdG8gdHJ5IGFuZCBidWlsZCBhIHZhbGlkDQotICAgICAqIEpBWEJDb250ZXh0IGZyb20gb25seSB0aGUgJ3ZhbGlkJyBjbGFzc2VzLiANCi0gICAgICogDQotICAgICAqIEBwYXJhbSBjbGFzc0FycmF5DQotICAgICAqIEBwYXJhbSBjbA0KLSAgICAgKiBAcmV0dXJuIEpBWEJDb250ZXh0DQotICAgICAqIEB0aHJvd3MgSkFYQkV4Y2VwdGlvbg0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyBKQVhCQ29udGV4dCBuZXdJbnN0YW5jZShDbGFzc1tdIGNsYXNzQXJyYXksIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzTG9hZGVyIGNsLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsID8+IHByb3BlcnRpZXMpIA0KLSAgICAgICAgdGhyb3dzIEpBWEJFeGNlcHRpb24gew0KLSAgICAgICAgSkFYQkNvbnRleHQgamF4YkNvbnRleHQgPSBudWxsOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICAgICAgaWYgKGNsYXNzQXJyYXkgPT0gbnVsbCB8fCBjbGFzc0FycmF5Lmxlbmd0aCA9PSAwKSB7DQotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlRyeSB0byBjb25zdHJ1Y3QgSkFYQkNvbnRleHQgd2l0aCAwIGlucHV0IGNsYXNzZXMuIik7DQotICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlRyeSB0byBjb25zdHJ1Y3QgSkFYQkNvbnRleHQgd2l0aCAiICsgY2xhc3NBcnJheS5sZW5ndGggKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGlucHV0IGNsYXNzZXMuIik7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgamF4YkNvbnRleHQgPSBfbmV3SW5zdGFuY2UoY2xhc3NBcnJheSwgY2wsIHByb3BlcnRpZXMpOw0KLQ0KLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlN1Y2Nlc3NmdWxseSBjb25zdHJ1Y3RlZCBKQVhCQ29udGV4dCAiICsgamF4YkNvbnRleHQpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7DQotICAgICAgICAgICAgLy8gVHJ5IGZpbmRpbmcgdGhlIGJlc3Qgc2V0IG9mIGNsYXNzZXMNCi0gICAgICAgICAgICBBcnJheUxpc3Q8Q2xhc3M+IG9yaWdpbmFsID0gbmV3IEFycmF5TGlzdDxDbGFzcz4oKTsNCi0gICAgICAgICAgICBmb3IgKGludCBpPTA7IGkgPCBjbGFzc0FycmF5Lmxlbmd0aDsgaSsrKSB7DQotICAgICAgICAgICAgICAgIG9yaWdpbmFsLmFkZChjbGFzc0FycmF5W2ldKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgQXJyYXlMaXN0PENsYXNzPiBiZXN0ID0gbmV3IEFycmF5TGlzdDxDbGFzcz4oKTsNCi0gICAgICAgICAgICBqYXhiQ29udGV4dCA9IGZpbmRCZXN0U2V0KG9yaWdpbmFsLCBjbCwgYmVzdCwgcHJvcGVydGllcyk7DQotICAgICAgICAgICAgDQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gamF4YkNvbnRleHQ7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBVdGlsaXR5IG1ldGhvZCB0aGF0IGNyZWF0ZXMgYSBKQVhCQ29udGV4dCBmcm9tIHRoZSANCi0gICAgICogY2xhc3NbXSBhbmQgQ2xhc3NMb2FkZXIuDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gY2xhc3NBcnJheQ0KLSAgICAgKiBAcGFyYW0gY2wNCi0gICAgICogQHJldHVybiBKQVhCQ29udGV4dA0KLSAgICAgKiBAdGhyb3dzIFRocm93YWJsZQ0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBzdGF0aWMgSkFYQkNvbnRleHQgX25ld0luc3RhbmNlKGZpbmFsIENsYXNzW10gY2xhc3NBcnJheSwgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDbGFzc0xvYWRlciBjbCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsID8+IHByb3BlcnRpZXMpIA0KLSAgICAgICAgdGhyb3dzIFRocm93YWJsZSB7DQotICAgICAgICBKQVhCQ29udGV4dCBqYXhiQ29udGV4dDsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgamF4YkNvbnRleHQgPSAoSkFYQkNvbnRleHQpQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoDQotICAgICAgICAgICAgICAgbmV3IFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24oKSB7DQotICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgdGhyb3dzIEpBWEJFeGNlcHRpb24gew0KLSAgICAgICAgICAgICAgICAgICAgICAgLy8gVW5saWtlIHRoZSBKQVhCQ29udGV4dC5uZXdJbnN0YW5jZShDbGFzc1tdKSBtZXRob2QNCi0gICAgICAgICAgICAgICAgICAgICAgIC8vIGRvZXMgbm93IGFjY2VwdCBhIGNsYXNzbG9hZGVyLiAgVG8gd29ya2Fyb3VuZCB0aGlzDQotICAgICAgICAgICAgICAgICAgICAgICAvLyBpc3N1ZSwgdGhlIGNsYXNzbG9hZGVyIGlzIHRlbXBvcmFyaWx5IGNoYW5nZWQgdG8gY2wNCi0gICAgICAgICAgICAgICAgICAgICAgIFRocmVhZCBjdXJyZW50VGhyZWFkID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgIENsYXNzTG9hZGVyIHNhdmVkQ2xhc3NMb2FkZXIgPSBjdXJyZW50VGhyZWFkLmdldENvbnRleHRDbGFzc0xvYWRlcigpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50VGhyZWFkLnNldENvbnRleHRDbGFzc0xvYWRlcihjbCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEpBWEJDb250ZXh0Lm5ld0luc3RhbmNlKGNsYXNzQXJyYXksIHByb3BlcnRpZXMpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50VGhyZWFkLnNldENvbnRleHRDbGFzc0xvYWRlcihzYXZlZENsYXNzTG9hZGVyKTsNCi0gICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICApOw0KLSAgICAgICAgfSBjYXRjaCAoUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgdGhyb3cgKChQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uKSBlKS5nZXRFeGNlcHRpb24oKTsNCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7DQotICAgICAgICAgICAgdGhyb3cgdDsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBqYXhiQ29udGV4dDsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFV0aWxpdHkgY2xhc3MgdGhhdCBxdWlja2x5IGRpdmlkZXMgYSBsaXN0IG9mIGNsYXNzZXMgaW50byB0d28gY2F0ZWdvcmllcy4NCi0gICAgICogVGhlIHByaW1hcnkgY2F0ZWdvcnkgY2xhc3NlcyBjb250YWluIEpBWEIgYW5ub3RhdGlvbnMuDQotICAgICAqIFRoZSBzZWNvbmRhcnkgY2F0ZWdvcnkgY2xhc3NlcyBkbyBub3QgY29udGFpbiBKQVhCIGFubm90YXRpb25zDQotICAgICAqIEBwYXJhbSBvcmlnaW5hbA0KLSAgICAgKiBAcGFyYW0gcHJpbWFyeQ0KLSAgICAgKiBAcGFyYW0gc2Vjb25kYXJ5DQotICAgICAqLw0KLSAgICBzdGF0aWMgdm9pZCBzZXBhcmF0ZShMaXN0PENsYXNzPiBvcmlnaW5hbCwgTGlzdDxDbGFzcz4gcHJpbWFyeSwgTGlzdDxDbGFzcz4gc2Vjb25kYXJ5KSB7DQotICAgICAgICBmb3IgKGludCBpPTA7IGk8b3JpZ2luYWwuc2l6ZSgpOyBpKyspIHsNCi0gICAgICAgICAgICBDbGFzcyBjbHMgPSBvcmlnaW5hbC5nZXQoaSk7DQotICAgICAgICAgICAgaWYgKGNvbW1vbkFycmF5Q2xhc3Nlcy5jb250YWlucyhjbHMpKSB7DQotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJUaGlzIGxvb2tzIGxpa2UgYSBKQVhCIGNvbW1vbiBjbGFzcy4gQWRkaW5nIGl0IHRvIHByaW1hcnkgbGlzdDoiICsgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xzLmdldE5hbWUoKSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgcHJpbWFyeS5hZGQoY2xzKTsNCi0gICAgICAgICAgICB9IGVsc2UgaWYgKGdldEFubm90YXRpb24oY2xzLCBYbWxUeXBlLmNsYXNzKSAhPSBudWxsIHx8DQotICAgICAgICAgICAgICAgICAgICBnZXRBbm5vdGF0aW9uKGNscywgWG1sUm9vdEVsZW1lbnQuY2xhc3MpICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlRoaXMgbG9va3MgbGlrZSBhIEpBWEIgY2xhc3MuIEFkZGluZyBpdCB0byBwcmltYXJ5IGxpc3Q6IiArIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNscy5nZXROYW1lKCkpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHByaW1hcnkuYWRkKGNscyk7ICAvLyBUaGlzIGxvb2tzIGxpa2UgYSBKQVhCIGNsYXNzLi4uYWRkIGl0DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlRoaXMgbWF5IG5vdCBiZSBhIEpBWEIgY2xhc3MuIEFkZGluZyBpdCB0byBzZWNvbmRhcnkgbGlzdDoiICsgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xzLmdldE5hbWUoKSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgc2Vjb25kYXJ5LmFkZChjbHMpOyAgLy8gVGhpcyBsb29rcyBsaWtlIGl0IG1pZ2h0IGJlIHNvbWV0aGluZyBlbHNlLi4uDQotICAgICAgICAgICAgfSAgICAgICAgICAgIA0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogR2l2ZW4gYSBsaXN0IG9mIGNsYXNzZXMsIHRoaXMgbWV0aG9kIGRldGVybWluZXMgdGhlIGJlc3QgbWluaW1hbCBzZXQNCi0gICAgICogb2YgY2xhc3NlcyBhbmQgcmV0dXJucyB0aGUgSkFYQkNvbnRleHQgZm9yIHRoaXMgbWluaW1hbCBzZXQuDQotICAgICAqIEBwYXJhbSBvcmlnaW5hbCBMaXN0PENsYXNzPg0KLSAgICAgKiBAcGFyYW0gY2wgQ2xhc3NMb2FkZXINCi0gICAgICogQHBhcmFtIExpc3RNQ2xhc3M+IGlzIHBvcHVsYXRlZCB3aXRoIHRoZSBtaW5pbWFsLCBiZXN0IHNldCBvZiBjbGFzc2VzDQotICAgICAqIEByZXR1cm4gSkFYQkNvbnRleHQNCi0gICAgICovDQotICAgIHN0YXRpYyBKQVhCQ29udGV4dCBmaW5kQmVzdFNldChMaXN0PENsYXNzPiBvcmlnaW5hbCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzTG9hZGVyIGNsLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gYmVzdCwgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCA/PiBwcm9wZXJ0aWVzKSB7DQotICAgICAgICANCi0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ291bGQgbm90IGNvbnN0cnVjdCBKQVhCQ29udGV4dCB3aXRoIHRoZSBpbml0aWFsIGxpc3QuIik7DQotICAgICAgICAgICAgbG9nLmRlYnVnKCJOb3cgdHJ5aW5nIHRvIGNvbnN0cnVjdCBKQVhCQ29udGV4dCB3aXRoIG9ubHkgdGhlIHZhbGlkIGNsYXNzZXMgaW4gdGhlIGxpc3QiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIEpBWEJDb250ZXh0IGpjID0gbnVsbDsNCi0gICAgICAgIENsYXNzW10gY2xzQXJyYXkgPSBuZXcgQ2xhc3NbMF07DQotICAgICAgICAgICAgDQotICAgICAgICAvLyBEaXZpZGUgdGhlIGxpc3QgaW50byB0aGUgY2xhc3NlcyB0aGF0IGhhdmUgSkFYQiBhbm5vdGF0aW9ucyAocHJpbWFyeSkNCi0gICAgICAgIC8vIGFuZCB0aG9zZSB0aGF0IGRvIG5vdCAoc2Vjb25kYXJ5KQ0KLSAgICAgICAgQXJyYXlMaXN0PENsYXNzPiBwcmltYXJ5ID0gbmV3IEFycmF5TGlzdDxDbGFzcz4gKCk7DQotICAgICAgICBBcnJheUxpc3Q8Q2xhc3M+IHNlY29uZGFyeSA9IG5ldyBBcnJheUxpc3Q8Q2xhc3M+ICgpOw0KLSAgICAgICAgc2VwYXJhdGUob3JpZ2luYWwsIHByaW1hcnksIHNlY29uZGFyeSk7DQotICAgICAgICANCi0gICAgICAgIC8vIFByaW1lIHRoZSBwdW1wDQotICAgICAgICAvLyBCdWlsZCBhIEpBWEJDb250ZXh0IHdpdGggdGhlIHByaW1hcnkgY2xhc3Nlcw0KLSAgICAgICAgYmVzdC5hZGRBbGwocHJpbWFyeSk7DQotICAgICAgICBpZiAoYmVzdC5zaXplKCkgPiAwKSB7DQotICAgICAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICAgICAgamMgPSBfbmV3SW5zdGFuY2UoYmVzdC50b0FycmF5KGNsc0FycmF5KSwgY2wsIHByb3BlcnRpZXMpOw0KLSAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7DQotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJUaGUgSkFYQkNvbnRleHQgY3JlYXRpb24gZmFpbGVkIHdpdGggdGhlIHByaW1hcnkgbGlzdCIpOw0KLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJXaWxsIHRyeSBhIG1vcmUgYnJ1dGUgZm9yY2UgYWxnb3JpdGhtIik7DQotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIiAgVGhlIHJlYXNvbiBpcyAiICsgdCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgLy8gQWRkIGFsbCBvZiB0aGUgcHJpbWFyeSBjbGFzc2VzIHRvIHRoZSBzZWNvbmRhcnkgbGlzdCBzbyANCi0gICAgICAgICAgICAgICAgLy8gdGhhdCB3ZSBjYW4gd2FsayB0aGVtIG9uZSBieSBvbmUuDQotICAgICAgICAgICAgICAgIHNlY29uZGFyeS5hZGRBbGwocHJpbWFyeSk7DQotICAgICAgICAgICAgICAgIGJlc3QuY2xlYXIoKTsgLy8gQ2xlYXIgb3V0IHRoZSBiZXN0IGxpc3QNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIC8vIE5vdyBhZGQgc2Vjb25kYXJ5IGNsYXNzZXMgb25lIGF0IGEgdGltZS4NCi0gICAgICAgIC8vIElmIHRoZSBKQVhCQ29udGV4dCBjcmVhdGlvbiBpcyBzdWNjZXNzZnVsLCBhZGQgdGhlIGNsYXNzDQotICAgICAgICAvLyB0byB0aGUgYmVzdCBsaXN0LiAgT3RoZXJ3aXNlIGNvbnRpbnVlLg0KLSAgICAgICAgLy8gDQotICAgICAgICAvLyBAUkVWSUVXIE9uZSBvcHRpbWl6YXRpb24gaXMgdG8gZG8gYSB0b1N0cmluZygpIG9uIHRoZSBKQVhCQ29udGV4dA0KLSAgICAgICAgLy8gYW5kIGNoZWNrIGZvciB0aGUgcHJlc2Vuc2Ugb2YgdGhlIHNlY29uZGFyeSBjbGFzcy4gIFRoaXMgd291bGQNCi0gICAgICAgIC8vIHNhdmUgdGltZS4gIEhvd2V2ZXIsIHRoaXMgYWxzbyBhc3N1bWVzIHRoYXQgdGhlIHRvU3RyaW5nKCkgDQotICAgICAgICAvLyBvZiBKQVhCQ29udGV4dCBkb2VzIG5vdCBjaGFuZ2UuDQotICAgICAgICBmb3IgKGludCBpID0gMDsgaTxzZWNvbmRhcnkuc2l6ZSgpOyBpKyspIHsNCi0gICAgICAgICAgICBDbGFzcyBjbHMgPSBzZWNvbmRhcnkuZ2V0KGkpOw0KLSAgICAgICAgICAgIGJlc3QuYWRkKGNscyk7DQotICAgICAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICAgICAgamMgPSBfbmV3SW5zdGFuY2UoYmVzdC50b0FycmF5KGNsc0FycmF5KSwgY2wsIHByb3BlcnRpZXMpOw0KLSAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7DQotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJUaGUgZm9sbG93aW5nIGNsYXNzIGlzIG5vdCBhIEpBWEIgY2xhc3M6ICIgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNscy5nZXRDYW5vbmljYWxOYW1lKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgIEpBWEJDb250ZXh0IGNyZWF0aW9uIGNvbnRpbnVlcyB3aXRob3V0IHRoaXMgY2xhc3MuIik7DQotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIiAgVGhlIHJlYXNvbiBpcyAiICsgdCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYmVzdC5yZW1vdmUoY2xzKTsNCi0gICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgIC8vIEBSRVZJRVcNCi0gICAgICAgICAgICAgICAgLy8gV2UgY291bGQgc2F2ZSB0aGUgZXhjZXB0aW9ucyAocGVyaGFwcyBpbiBhIGxpc3QpIGFuZA0KLSAgICAgICAgICAgICAgICAvLyByZXR1cm4gdGhlIGV4Y2VwdGlvbnMuICBUaGVuIGlmIHByb2JsZW1zIG9jY3VyIGxhdGVyDQotICAgICAgICAgICAgICAgIC8vIChpLmUuIGRvIHRvIG1pc3NpbmcgZXhjZXB0aW9ucykgdGhlbiB3ZSBjb3VsZCB0aHJvdw0KLSAgICAgICAgICAgICAgICAvLyB0aGlzIGV4Y2VwdGlvbi4NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIHJldHVybiBqYzsNCi0gIA0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogR2V0IGFuIGFubm90YXRpb24uICBUaGlzIGlzIHdyYXBwZXJlZCB0byBhdm9pZCBhIEphdmEyU2VjdXJpdHkgdmlvbGF0aW9uLg0KLSAgICAgKiBAcGFyYW0gY2xzIENsYXNzIHRoYXQgY29udGFpbnMgYW5ub3RhdGlvbiANCi0gICAgICogQHBhcmFtIGFubm90YXRpb24gQ2xhc3Mgb2YgcmVxdXJlc3RlZCBBbm5vdGF0aW9uDQotICAgICAqIEByZXR1cm4gYW5ub3RhdGlvbiBvciBudWxsDQotICAgICAqLw0KLSAgICBwcml2YXRlIHN0YXRpYyBBbm5vdGF0aW9uIGdldEFubm90YXRpb24oZmluYWwgQW5ub3RhdGVkRWxlbWVudCBlbGVtZW50LCBmaW5hbCBDbGFzcyBhbm5vdGF0aW9uKSB7DQotICAgICAgICByZXR1cm4gKEFubm90YXRpb24pIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkQWN0aW9uKCkgew0KLSAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudC5nZXRBbm5vdGF0aW9uKGFubm90YXRpb24pOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0pOw0KLSAgICB9DQotICAgIA0KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PENsYXNzPiBjb21tb25BcnJheUNsYXNzZXMgPSBuZXcgQXJyYXlMaXN0PENsYXNzPigpOw0KLSAgICBzdGF0aWMgew0KLSAgICAgICAgY29tbW9uQXJyYXlDbGFzc2VzLmFkZChib29sZWFuW10uY2xhc3MpOw0KLSAgICAgICAgY29tbW9uQXJyYXlDbGFzc2VzLmFkZChieXRlW10uY2xhc3MpOw0KLSAgICAgICAgY29tbW9uQXJyYXlDbGFzc2VzLmFkZChjaGFyW10uY2xhc3MpOw0KLSAgICAgICAgY29tbW9uQXJyYXlDbGFzc2VzLmFkZChkb3VibGVbXS5jbGFzcyk7DQotICAgICAgICBjb21tb25BcnJheUNsYXNzZXMuYWRkKGZsb2F0W10uY2xhc3MpOw0KLSAgICAgICAgY29tbW9uQXJyYXlDbGFzc2VzLmFkZChpbnRbXS5jbGFzcyk7DQotICAgICAgICBjb21tb25BcnJheUNsYXNzZXMuYWRkKGxvbmdbXS5jbGFzcyk7DQotICAgICAgICBjb21tb25BcnJheUNsYXNzZXMuYWRkKHNob3J0W10uY2xhc3MpOw0KLSAgICAgICAgY29tbW9uQXJyYXlDbGFzc2VzLmFkZChTdHJpbmdbXS5jbGFzcyk7DQotICAgICAgICBjb21tb25BcnJheUNsYXNzZXMuYWRkKE9iamVjdFtdLmNsYXNzKTsNCi0gICAgICAgIGNvbW1vbkFycmF5Q2xhc3Nlcy5hZGQoSW1hZ2VbXS5jbGFzcyk7DQotICAgICAgICBjb21tb25BcnJheUNsYXNzZXMuYWRkKEJpZ0RlY2ltYWxbXS5jbGFzcyk7DQotICAgICAgICBjb21tb25BcnJheUNsYXNzZXMuYWRkKEJpZ0ludGVnZXJbXS5jbGFzcyk7DQotICAgICAgICBjb21tb25BcnJheUNsYXNzZXMuYWRkKENhbGVuZGFyW10uY2xhc3MpOw0KLSAgICAgICAgY29tbW9uQXJyYXlDbGFzc2VzLmFkZChRTmFtZVtdLmNsYXNzKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2RhdGFiaW5kaW5nL0pBWEJVdGlscy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9kYXRhYmluZGluZy9KQVhCVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc3MTRlOS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2RhdGFiaW5kaW5nL0pBWEJVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI1MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5kYXRhYmluZGluZzsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuRXhjZXB0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmkxOG4uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmZhY3RvcnkuQ2xhc3NGaW5kZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MucmVnaXN0cnkuRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MudXRpbGl0eS5DbGFzc1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MudXRpbGl0eS5KYXZhVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCQ29udGV4dDsKLWltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJJbnRyb3NwZWN0b3I7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuTWFyc2hhbGxlcjsKLWltcG9ydCBqYXZheC54bWwuYmluZC5Vbm1hcnNoYWxsZXI7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlOwotaW1wb3J0IGphdmF4LnhtbC53cy5Ib2xkZXI7Ci1pbXBvcnQgamF2YXgueG1sLndzLndzYWRkcmVzc2luZy5XM0NFbmRwb2ludFJlZmVyZW5jZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWYuU29mdFJlZmVyZW5jZTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5VUkxEZWNvZGVyOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb247Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRIYXNoTWFwOwotCi0KLS8qKgotICogSkFYQiBVdGlsaXRlcyB0byBwb29sIEpBWEJDb250ZXh0IGFuZCByZWxhdGVkIG9iamVjdHMuIAotICovCi1wdWJsaWMgY2xhc3MgSkFYQlV0aWxzIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhKQVhCVXRpbHMuY2xhc3MpOwotCi0gICAgLy8gQ3JlYXRlIGEgY29uY3VycmVudCBtYXAgdG8gZ2V0IHRoZSBKQVhCT2JqZWN0OiAKLSAgICAvLyAgICBrZXkgaXMgdGhlIFN0cmluZyAoc29ydGVkIHBhY2thZ2VzKQotICAgIC8vICAgIHZhbHVlIGlzIGEgU29mdFJlZmVyZW5jZSB0byBhIENvbmN1cnJlbnRIYXNoTWFwIG9mIENsYXNzbG9hZGVyIGtleXMgYW5kIEpBWEJDb250ZXh0VmFsdWUgb2JqZWN0cwotICAgIC8vICAgICAgICAgICAgICAgSXQgaXMgYSBzb2Z0IG1hcCB0byBlbmNvdXJhZ2UgR0MgaW4gbG93IG1lbW9yeSBzaXR1YXRpb25zCi0gICAgcHJpdmF0ZSBzdGF0aWMgTWFwPAotICAgICAgICBTdHJpbmcsIAotICAgICAgICBTb2Z0UmVmZXJlbmNlPENvbmN1cnJlbnRIYXNoTWFwPENsYXNzTG9hZGVyLCBKQVhCQ29udGV4dFZhbHVlPj4+IGpheGJNYXAgPQotICAgICAgICAgICAgbmV3IENvbmN1cnJlbnRIYXNoTWFwPFN0cmluZywgCi0gICAgICAgICAgICAgICAgU29mdFJlZmVyZW5jZTxDb25jdXJyZW50SGFzaE1hcDxDbGFzc0xvYWRlciwgSkFYQkNvbnRleHRWYWx1ZT4+PigpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgUG9vbDxKQVhCQ29udGV4dCwgTWFyc2hhbGxlcj4gICAgICAgbXBvb2wgPSBuZXcgUG9vbDxKQVhCQ29udGV4dCwgTWFyc2hhbGxlcj4oKTsKLSAgICBwcml2YXRlIHN0YXRpYyBQb29sPEpBWEJDb250ZXh0LCBVbm1hcnNoYWxsZXI+ICAgICB1cG9vbCA9IG5ldyBQb29sPEpBWEJDb250ZXh0LCBVbm1hcnNoYWxsZXI+KCk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgUG9vbDxKQVhCQ29udGV4dCwgSkFYQkludHJvc3BlY3Rvcj4gaXBvb2wgPSBuZXcgUG9vbDxKQVhCQ29udGV4dCwgSkFYQkludHJvc3BlY3Rvcj4oKTsKLSAgICAKLSAgICAvLyBGcm9tIExpemV0IEVybmFuZDoKLSAgICAvLyBJZiB5b3UgcmVhbGx5IGNhcmUgYWJvdXQgdGhlIHBlcmZvcm1hbmNlLCAKLSAgICAvLyBhbmQvb3IgeW91ciBhcHBsaWNhdGlvbiBpcyBnb2luZyB0byByZWFkIGEgbG90IG9mIHNtYWxsIGRvY3VtZW50cywgCi0gICAgLy8gdGhlbiBjcmVhdGluZyBVbm1hcnNoYWxsZXIgY291bGQgYmUgcmVsYXRpdmVseSBhbiBleHBlbnNpdmUgb3BlcmF0aW9uLiAKLSAgICAvLyBJbiB0aGF0IGNhc2UsIGNvbnNpZGVyIHBvb2xpbmcgVW5tYXJzaGFsbGVyIG9iamVjdHMuCi0gICAgLy8gRGlmZmVyZW50IHRocmVhZHMgbWF5IHJldXNlIG9uZSBVbm1hcnNoYWxsZXIgaW5zdGFuY2UsIAotICAgIC8vIGFzIGxvbmcgYXMgeW91IGRvbid0IHVzZSBvbmUgaW5zdGFuY2UgZnJvbSB0d28gdGhyZWFkcyBhdCB0aGUgc2FtZSB0aW1lLiAKLSAgICAvLyBFTkFCTEVfQURWX1BPT0xJTkcgaXMgZmFsc2UuLi53aGljaCBtZWFucyB0aGV5IGFyZSBvYnRhaW5lZCBmcm9tIHRoZSBKQVhCQ29udGV4dCBpbnN0ZWFkIG9mCi0gICAgLy8gZnJvbSB0aGUgcG9vbC4KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIEVOQUJMRV9NQVJTSEFMTF9QT09MSU5HID0gdHJ1ZTsKLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIEVOQUJMRV9VTk1BUlNIQUxMX1BPT0xJTkcgPSB0cnVlOwotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gRU5BQkxFX0lOVFJPU1BFQ1RJT05fUE9PTElORyA9IGZhbHNlOwotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGludCBNQVhfTE9BRF9GQUNUT1IgPSAzMjsgIC8vIE1heGltdW0gbnVtYmVyIG9mIEpBWEJDb250ZXh0IHRvIHN0b3JlCi0KLSAgICAvLyBDb25zdHJ1Y3Rpb24gVHlwZQotICAgIHB1YmxpYyBlbnVtIENPTlNUUlVDVElPTl9UWVBFIHsKLSAgICAgICAgQllfQ0xBU1NfQVJSQVksIEJZX0NPTlRFWFRfUEFUSCwgVU5LTk9XTn0KLQotICAgIDsKLSAgICAKLSAgICAvLyBTb21lIHBhY2thZ2VzIGhhdmUgYSBrbm93biBzZXQgb2YgY2xhc3Nlcy4KLSAgICAvLyBUaGlzIG1hcCBpcyBpbW11dGFibGUgYWZ0ZXIgaXRzIHN0YXRpYyBjcmVhdGlvbi4KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8U3RyaW5nLCBMaXN0PENsYXNzPj4gc3BlY2lhbE1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgTGlzdDxDbGFzcz4+KCk7Ci0gICAgc3RhdGljIHsKLSAgICAgICAgLy8gVGhlIGphdmF4LnhtbC53cy53c2FkZHJlc3NpbmcgcGFja2FnZSBoYXMgYSBzaW5nbGUgY2xhc3MgKFczQ0VuZHBvaW50UmVmZXJlbmNlKQotICAgICAgICBMaXN0PENsYXNzPiBjbGFzc2VzID0gbmV3IEFycmF5TGlzdDxDbGFzcz4oKTsKLSAgICAgICAgY2xhc3Nlcy5hZGQoVzNDRW5kcG9pbnRSZWZlcmVuY2UuY2xhc3MpOwotICAgICAgICBzcGVjaWFsTWFwLnB1dCgiamF2YXgueG1sLndzLndzYWRkcmVzc2luZyIsIGNsYXNzZXMpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX05BTUVTUEFDRV9SRU1BUCA9IGdldERlZmF1bHROYW1lc3BhY2VSZW1hcFByb3BlcnR5KCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogR2V0IGEgSkFYQkNvbnRleHQgZm9yIHRoZSBjbGFzcwotICAgICAqCi0gICAgICogQHBhcmFtIGNvbnRleHRQYWNrYWdlIFNldDxQYWNrYWdlPgotICAgICAqIEByZXR1cm4gSkFYQkNvbnRleHQKLSAgICAgKiBAdGhyb3dzIEpBWEJFeGNlcHRpb24KLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSkFYQkNvbnRleHQgZ2V0SkFYQkNvbnRleHQoVHJlZVNldDxTdHJpbmc+IGNvbnRleHRQYWNrYWdlcykgdGhyb3dzIEpBWEJFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZ2V0SkFYQkNvbnRleHQoY29udGV4dFBhY2thZ2VzLCBuZXcgSG9sZGVyPENPTlNUUlVDVElPTl9UWVBFPigpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHRQYWNrYWdlcy50b1N0cmluZygpLCBudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYSBKQVhCQ29udGV4dCBmb3IgdGhlIGNsYXNzCi0gICAgICogCi0gICAgICogTm90ZTogVGhlIGNvbnRleHRQYWNrYWdlIG9iamVjdCBpcyB1c2VkIGJ5IG11bHRpcGxlIHRocmVhZHMuICBJdCBzaG91bGQgYmUgY29uc2lkZXJlZCBpbW11dGFibGUKLSAgICAgKiBhbmQgbm90IGFsdGVyZWQgYnkgdGhpcyBtZXRob2QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29udGV4dFBhY2thZ2UgU2V0PFBhY2thZ2U+Ci0gICAgICogQHBhcmFtIGNhY2hlS2V5IENsYXNzTG9hZGVyCi0gICAgICogQHJldHVybiBKQVhCQ29udGV4dAotICAgICAqIEB0aHJvd3MgSkFYQkV4Y2VwdGlvbgotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBKQVhCQ29udGV4dCBnZXRKQVhCQ29udGV4dChUcmVlU2V0PFN0cmluZz4gY29udGV4dFBhY2thZ2VzLCBDbGFzc0xvYWRlciAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlS2V5KSB0aHJvd3MgSkFYQkV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBnZXRKQVhCQ29udGV4dChjb250ZXh0UGFja2FnZXMsIG5ldyBIb2xkZXI8Q09OU1RSVUNUSU9OX1RZUEU+KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0UGFja2FnZXMudG9TdHJpbmcoKSwgY2FjaGVLZXksIG51bGwpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIEpBWEJDb250ZXh0IGdldEpBWEJDb250ZXh0KFRyZWVTZXQ8U3RyaW5nPiBjb250ZXh0UGFja2FnZXMsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSG9sZGVyPENPTlNUUlVDVElPTl9UWVBFPiBjb25zdHJ1Y3Rpb25UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGtleSkKLSAgICAgICAgdGhyb3dzIEpBWEJFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZ2V0SkFYQkNvbnRleHQoY29udGV4dFBhY2thZ2VzLCBjb25zdHJ1Y3Rpb25UeXBlLCBrZXksIG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBhIEpBWEJDb250ZXh0IGZvciB0aGUgY2xhc3MKLSAgICAgKgotICAgICAqIE5vdGU6IFRoZSBjb250ZXh0UGFja2FnZSBvYmplY3QgaXMgdXNlZCBieSBtdWx0aXBsZSB0aHJlYWRzLiAgSXQgc2hvdWxkIGJlIGNvbnNpZGVyZWQgaW1tdXRhYmxlCi0gICAgICogYW5kIG5vdCBhbHRlcmVkIGJ5IHRoaXMgbWV0aG9kLgotICAgICAqIAotICAgICAqIEBwYXJhbSBjb250ZXh0UGFja2FnZSAgU2V0PFBhY2thZ2U+IAotICAgICAqIEBwYXJhbSBjb250cnVjdGlvblR5cGUgKG91dHB1dCB2YWx1ZSB0aGF0IGluZGljYXRlcyBob3cgdGhlIGNvbnRleHQgd2FzIGNvbnN0cnVjdGVkKQotICAgICAqIEBwYXJhbSBjYWNoZUtleSBDbGFzc0xvYWRlcgotICAgICAqIEByZXR1cm4gSkFYQkNvbnRleHQKLSAgICAgKiBAdGhyb3dzIEpBWEJFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEpBWEJDb250ZXh0IGdldEpBWEJDb250ZXh0KFRyZWVTZXQ8U3RyaW5nPiBjb250ZXh0UGFja2FnZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIb2xkZXI8Q09OU1RSVUNUSU9OX1RZUEU+IGNvbnN0cnVjdGlvblR5cGUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzTG9hZGVyIGNhY2hlS2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgPz4gcHJvcGVydGllcykKLSAgICAgICAgICAgIHRocm93cyBKQVhCRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gSkFYQkNvbnRleHRzIGZvciB0aGUgc2FtZSBjbGFzcyBjYW4gYmUgcmV1c2VkIGFuZCBhcmUgc3VwcG9zZWQgdG8gYmUgdGhyZWFkLXNhZmUKLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIkZvbGxvd2luZyBwYWNrYWdlcyBhcmUgaW4gdGhpcyBiYXRjaCBvZiBnZXRKQVhCQ29udGV4dCgpIDoiKTsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIHBrZyA6IGNvbnRleHRQYWNrYWdlcykgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1Zyhwa2cpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIEpBWEJVdGlsc01vbml0b3IuYWRkUGFja2FnZUtleShrZXkpOwotCi0gICAgICAgIC8vIEdldCBvciBDcmVhdGUgVGhlIElubmVyTWFwIHVzaW5nIHRoZSBwYWNrYWdlIGtleQotICAgICAgICBDb25jdXJyZW50SGFzaE1hcDxDbGFzc0xvYWRlciwgSkFYQkNvbnRleHRWYWx1ZT4gaW5uZXJNYXAgPSBudWxsOwotICAgICAgICBTb2Z0UmVmZXJlbmNlPENvbmN1cnJlbnRIYXNoTWFwPENsYXNzTG9hZGVyLCBKQVhCQ29udGV4dFZhbHVlPj4gCi0gICAgICAgICAgICBzb2Z0UmVmID0gamF4Yk1hcC5nZXQoa2V5KTsKLSAgICAgICAgCi0gICAgICAgIGlmIChzb2Z0UmVmICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlubmVyTWFwID0gc29mdFJlZi5nZXQoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKGlubmVyTWFwID09IG51bGwpIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZChqYXhiTWFwKSB7Ci0gICAgICAgICAgICAgICAgc29mdFJlZiA9IGpheGJNYXAuZ2V0KGtleSk7Ci0gICAgICAgICAgICAgICAgaWYgKHNvZnRSZWYgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpbm5lck1hcCA9IHNvZnRSZWYuZ2V0KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChpbm5lck1hcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlubmVyTWFwID0gbmV3IENvbmN1cnJlbnRIYXNoTWFwPENsYXNzTG9hZGVyLCBKQVhCQ29udGV4dFZhbHVlPigpOwotICAgICAgICAgICAgICAgICAgICBzb2Z0UmVmID0gCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgU29mdFJlZmVyZW5jZTxDb25jdXJyZW50SGFzaE1hcDxDbGFzc0xvYWRlciwgSkFYQkNvbnRleHRWYWx1ZT4+KGlubmVyTWFwKTsKLSAgICAgICAgICAgICAgICAgICAgamF4Yk1hcC5wdXQoa2V5LCBzb2Z0UmVmKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIE5vdyBnZXQgdGhlIGNvbnRleHRWYWx1ZSB1c2luZyBlaXRoZXIgdGhlIGNsYXNzbG9hZGVyIGtleSBvciAKLSAgICAgICAgLy8gdGhlIGN1cnJlbnQgQ2xhc3Nsb2FkZXIKLSAgICAgICAgQ2xhc3NMb2FkZXIgY2wgPSBnZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKLSAgICAgICAgSkFYQkNvbnRleHRWYWx1ZSBjb250ZXh0VmFsdWUgPSBudWxsOwotICAgICAgICBpZihjYWNoZUtleSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiVXNpbmcgc3VwcGxpZWQgY2xhc3Nsb2FkZXIgdG8gcmV0cmlldmUgSkFYQkNvbnRleHQ6ICIgKyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVLZXkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY29udGV4dFZhbHVlID0gaW5uZXJNYXAuZ2V0KGNhY2hlS2V5KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJVc2luZyBjbGFzc2xvYWRlciBmcm9tIFRocmVhZCB0byByZXRyaWV2ZSBKQVhCQ29udGV4dDogIiArIAotICAgICAgICAgICAgICAgICAgICAgICAgICBjbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjb250ZXh0VmFsdWUgPSBpbm5lck1hcC5nZXQoY2wpOwotICAgICAgICB9Ci0gICAgICAKLSAgICAgICAgCi0KLSAgICAgICAgaWYgKGNvbnRleHRQYWNrYWdlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBjb250ZXh0UGFja2FnZXMgPSBuZXcgVHJlZVNldDxTdHJpbmc+KCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNvbnRleHRWYWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGlubmVyTWFwKSB7Ci0gICAgICAgICAgICAgICAgLy8gVHJ5IHRvIGdldCB0aGUgY29udGV4dFZhbHVlIG9uY2UgbW9yZSBzaW5jZSBzeW5jIHdhcyB0ZW1wb3JhcmlseSBleGl0ZWQuCi0gICAgICAgICAgICAgICAgQ2xhc3NMb2FkZXIgY2xLZXkgPSAoY2FjaGVLZXkgIT0gbnVsbCkgPyBjYWNoZUtleTpjbDsKLSAgICAgICAgICAgICAgICBjb250ZXh0VmFsdWUgPSBpbm5lck1hcC5nZXQoY2xLZXkpOwotICAgICAgICAgICAgICAgIGFkanVzdFBvb2xTaXplKGlubmVyTWFwKTsKLSAgICAgICAgICAgICAgICBpZiAoY29udGV4dFZhbHVlPT1udWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIGNvcHkgb2YgdGhlIGNvbnRleHRQYWNrYWdlcy4gIFRoaXMgbmV3IFRyZWVTZXQgd2lsbAotICAgICAgICAgICAgICAgICAgICAvLyBjb250YWluIG9ubHkgdGhlIHZhbGlkIGNvbnRleHRQYWNrYWdlcy4KLSAgICAgICAgICAgICAgICAgICAgLy8gTm90ZTogVGhlIG9yaWdpbmFsIGNvbnRleHRQYWNrYWdlIHNldCBpcyBhY2Nlc3NlZCBieSBtdWx0aXBsZSAKLSAgICAgICAgICAgICAgICAgICAgLy8gdGhyZWFkcyBhbmQgc2hvdWxkIG5vdCBiZSBhbHRlcmVkLgotCi0gICAgICAgICAgICAgICAgICAgIFRyZWVTZXQ8U3RyaW5nPiB2YWxpZENvbnRleHRQYWNrYWdlcyA9IG5ldyBUcmVlU2V0PFN0cmluZz4oY29udGV4dFBhY2thZ2VzKTsgCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBDbGFzc0xvYWRlciB0cnlDbCA9IGNsOwotICAgICAgICAgICAgICAgICAgICBjb250ZXh0VmFsdWUgPSBjcmVhdGVKQVhCQ29udGV4dFZhbHVlKHZhbGlkQ29udGV4dFBhY2thZ2VzLCBjbCwgcHJvcGVydGllcyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gSWYgd2UgZG9uJ3QgZ2V0IGFsbCB0aGUgY2xhc3NlcywgdHJ5IHRoZSBjYWNoZWQgY2xhc3Nsb2FkZXIgCi0gICAgICAgICAgICAgICAgICAgIGlmIChjYWNoZUtleSAhPSBudWxsICYmIHZhbGlkQ29udGV4dFBhY2thZ2VzLnNpemUoKSAhPSBjb250ZXh0UGFja2FnZXMuc2l6ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnlDbCA9IGNhY2hlS2V5OwotICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRDb250ZXh0UGFja2FnZXMgPSBuZXcgVHJlZVNldDxTdHJpbmc+KGNvbnRleHRQYWNrYWdlcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0VmFsdWUgPSBjcmVhdGVKQVhCQ29udGV4dFZhbHVlKHZhbGlkQ29udGV4dFBhY2thZ2VzLCBjYWNoZUtleSwgcHJvcGVydGllcyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChqYXhiTWFwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIGNvbnRleHQgdmFsdWUgd2l0aCB0aGUgb3JpZ2luYWwgcGFja2FnZSBzZXQKLSAgICAgICAgICAgICAgICAgICAgICAgIENvbmN1cnJlbnRIYXNoTWFwPENsYXNzTG9hZGVyLCBKQVhCQ29udGV4dFZhbHVlPiBtYXAxID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNvZnRSZWZlcmVuY2U8Q29uY3VycmVudEhhc2hNYXA8Q2xhc3NMb2FkZXIsIEpBWEJDb250ZXh0VmFsdWU+PiAKLSAgICAgICAgICAgICAgICAgICAgICAgIHNvZnRSZWYxID0gamF4Yk1hcC5nZXQoa2V5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzb2Z0UmVmMSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwMSA9IHNvZnRSZWYuZ2V0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWFwMSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwMSA9IG5ldyBDb25jdXJyZW50SGFzaE1hcDxDbGFzc0xvYWRlciwgSkFYQkNvbnRleHRWYWx1ZT4oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2Z0UmVmMSA9IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU29mdFJlZmVyZW5jZTxDb25jdXJyZW50SGFzaE1hcDxDbGFzc0xvYWRlciwgSkFYQkNvbnRleHRWYWx1ZT4+KG1hcDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpheGJNYXAucHV0KGtleSwgc29mdFJlZjEpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbWFwMS5wdXQoY2xLZXksIGNvbnRleHRWYWx1ZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB2YWxpZFBhY2thZ2VzS2V5ID0gdmFsaWRDb250ZXh0UGFja2FnZXMudG9TdHJpbmcoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWRkIHRoZSBjb250ZXh0IHZhbHVlIHdpdGggdGhlIG5ldyBwYWNrYWdlIHNldAotICAgICAgICAgICAgICAgICAgICAgICAgQ29uY3VycmVudEhhc2hNYXA8Q2xhc3NMb2FkZXIsIEpBWEJDb250ZXh0VmFsdWU+IG1hcDIgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgU29mdFJlZmVyZW5jZTxDb25jdXJyZW50SGFzaE1hcDxDbGFzc0xvYWRlciwgSkFYQkNvbnRleHRWYWx1ZT4+IAotICAgICAgICAgICAgICAgICAgICAgICAgc29mdFJlZjIgPSBqYXhiTWFwLmdldCh2YWxpZFBhY2thZ2VzS2V5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzb2Z0UmVmMiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwMiA9IHNvZnRSZWYuZ2V0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWFwMiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwMiA9IG5ldyBDb25jdXJyZW50SGFzaE1hcDxDbGFzc0xvYWRlciwgSkFYQkNvbnRleHRWYWx1ZT4oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2Z0UmVmMiA9IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU29mdFJlZmVyZW5jZTxDb25jdXJyZW50SGFzaE1hcDxDbGFzc0xvYWRlciwgSkFYQkNvbnRleHRWYWx1ZT4+KG1hcDIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpheGJNYXAucHV0KGtleSwgc29mdFJlZjIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbWFwMi5wdXQoY2xLZXksIGNvbnRleHRWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiSkFYQkNvbnRleHQgW2NyZWF0ZWRdIGZvciAiICsga2V5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkpBWEJDb250ZXh0IGFsc28gc3RvcmVkIGJ5IHRoZSBsaXN0IG9mIHZhbGlkIHBhY2thZ2VzOiIgKyB2YWxpZFBhY2thZ2VzS2V5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJKQVhCQ29udGV4dCBbZnJvbSBwb29sXSBmb3IgIiArIGtleSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY29uc3RydWN0aW9uVHlwZS52YWx1ZSA9IGNvbnRleHRWYWx1ZS5jb25zdHJ1Y3Rpb25UeXBlOwotICAgICAgICByZXR1cm4gY29udGV4dFZhbHVlLmpheGJDb250ZXh0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIEpBWEJDb250ZXh0IHVzaW5nIHRoZSBjb250ZXh0UGFja2FnZXMKLSAgICAgKgotICAgICAqIEBwYXJhbSBjb250ZXh0UGFja2FnZXMgU2V0PFN0cmluZz4KLSAgICAgKiBAcGFyYW0gY2wgICAgICAgICAgICAgIENsYXNzTG9hZGVyCi0gICAgICogQHJldHVybiBKQVhCQ29udGV4dFZhbHVlIChKQVhCQ29udGV4dCArIGNvbnN0cnVjdGlvblR5cGUpCi0gICAgICogQHRocm93cyBKQVhCRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgSkFYQkNvbnRleHRWYWx1ZSBjcmVhdGVKQVhCQ29udGV4dFZhbHVlKFRyZWVTZXQ8U3RyaW5nPiBjb250ZXh0UGFja2FnZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzTG9hZGVyIGNsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCA/PiBwcm9wZXJ0aWVzKSB0aHJvd3MgSkFYQkV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgSkFYQkNvbnRleHRWYWx1ZSBjb250ZXh0VmFsdWUgPSBudWxsOwotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgbG9nLmRlYnVnKCJGb2xsb3dpbmcgcGFja2FnZXMgYXJlIGluIHRoaXMgYmF0Y2ggb2YgZ2V0SkFYQkNvbnRleHQoKSA6Iik7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIHBrZyA6IGNvbnRleHRQYWNrYWdlcykgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1Zyhwa2cpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbG9nLmRlYnVnKCJUaGlzIGNsYXNzbG9hZGVyIHdpbGwgYmUgdXNlZCB0byBjb25zdHJ1Y3QgdGhlIEpBWEJDb250ZXh0IiArIGNsKTsKLSAgICAgICAgfQotICAgICAgICAvLyBUaGUgY29udGV4dFBhY2thZ2VzIGlzIGEgc2V0IG9mIHBhY2thZ2UgbmFtZXMgdGhhdCBhcmUgY29uc3RydWN0ZWQgdXNpbmcgUGFja2FnZVNldEJ1aWxkZXIuCi0gICAgICAgIC8vIFBhY2thZ2VTZXRCdWlsZGVyIGdldHMgdGhlIHBhY2thZ2VzIG5hbWVzIGZyb20gdmFyaW91cyBzb3VyY2VzLgotICAgICAgICAvLyAgIGEpIEl0IHdhbGtzIHRoZSB2YXJpb3VzIGFubm90YXRpb25zIG9uIHRoZSBXZWJTZXJ2aWNlIGNvbGxlY3RpbmcgcGFja2FnZSBuYW1lcy4KLSAgICAgICAgLy8gICBiKSBJdCB3YWxrcyB0aGUgd3NkbC9zY2hlbWFzIGFuZCBidWlsZHMgcGFja2FnZSBuYW1lcyBmb3IgZWFjaCB0YXJnZXQgbmFtZXNwYWNlLgotICAgICAgICAvLwotICAgICAgICAvLyBUaGUgY29tYmluYXRpb24gb2YgdGhlc2UgdHdvIHNvdXJjZXMgc2hvdWxkIHByb2R1Y2UgYWxsIG9mIHRoZSBwYWNrYWdlIG5hbWVzLgotICAgICAgICAvLyAtLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIE5vdGUgdGhhdCAoYikgaXMgbmVjZXNzYXJ5IGZvciB0aGUgZm9sbG93aW5nIGNhc2U6Ci0gICAgICAgIC8vIEFuIG9wZXJhdGlvbiBoYXMgYSBwYXJhbWV0ZXIgbmFtZWQgQkFTRS4KLSAgICAgICAgLy8gT2JqZWN0IERFUklWRUQgaXMgYW4gZXh0ZW5zaW9uIG9mIEJBU0UgYW5kIGlzIGRlZmluZWQgaW4gYSBkaWZmZXJlbnQgcGFja2FnZS9zY2hlbWEuCi0gICAgICAgIC8vIEluIHRoaXMgY2FzZSwgdGhlcmUgd2lsbCBub3QgYmUgYW55IGFubm90YXRpb25zIG9uIHRoZSBXZWJTZXJ2aWNlIHRoYXQgcmVmZXJlbmNlIERFUklWRUQuCi0gICAgICAgIC8vIFRoZSBvbmx5IHdheSB0byBmaW5kIHRoZSBwYWNrYWdlIGZvciBERVJJVkVEIGlzIHRvIHdhbGsgdGhlIHNjaGVtYXMuCi0gICAgICAgIC8vIC0tLS0tLS0tLS0tLS0KLQotICAgICAgICBJdGVyYXRvcjxTdHJpbmc+IGl0ID0gY29udGV4dFBhY2thZ2VzLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIFN0cmluZyBwID0gaXQubmV4dCgpOwotICAgICAgICAgICAgLy8gRG9uJ3QgY29uc2lkZXIgamF2YSBhbmQgamF2YXggcGFja2FnZXMKLSAgICAgICAgICAgIC8vIFJFVklFVzogV2UgbWlnaHQgaGF2ZSB0byByZWZpbmUgdGhpcwotICAgICAgICAgICAgaWYgKHAuc3RhcnRzV2l0aCgiamF2YXgueG1sLndzLndzYWRkcmVzc2luZyIpKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocC5zdGFydHNXaXRoKCJqYXZhLiIpIHx8Ci0gICAgICAgICAgICAgICAgICAgIHAuc3RhcnRzV2l0aCgiamF2YXguIikpIHsKLSAgICAgICAgICAgICAgICBpdC5yZW1vdmUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIFRoZXJlIGFyZSB0d28gd2F5cyB0byBjb25zdHJ1Y3QgdGhlIGNvbnRleHQuCi0gICAgICAgIC8vIDEpIFVTRSBBIENPTlRFWFRQQVRILCB3aGljaCBpcyBhIHN0cmluZyBjb250YWluaW5nCi0gICAgICAgIC8vICAgIGFsbCBvZiB0aGUgcGFja2FnZXMgc2VwYXJhdGVkIGJ5IGNvbG9ucy4KLSAgICAgICAgLy8gMikgVVNFIEEgQ0xBU1NbXSwgd2hpY2ggaXMgYW4gYXJyYXkgb2YgYWxsIG9mIHRoZSBjbGFzc2VzCi0gICAgICAgIC8vICAgIGludm9sdmVkIGluIHRoZSBtYXJzaGFsL3VubWFyc2hhbC4KLSAgICAgICAgLy8gICAKLSAgICAgICAgLy8gVGhlcmUgYXJlIHByb3MvY29ucyB3aXRoIGJvdGggYXBwcm9hY2hlcy4KLSAgICAgICAgLy8gVVNFIEEgQ09OVEVYVFBBVEg6IAotICAgICAgICAvLyAgICBQcm9zOiBwcmVmZXJyZWQgd2F5IG9mIGRvaW5nIHRoaXMuICAKLSAgICAgICAgLy8gICAgICAgICAgcGVyZm9ybWFudAotICAgICAgICAvLyAgICAgICAgICBtb3N0IGR5bmFtaWMKLSAgICAgICAgLy8gICAgQ29uczogRWFjaCBwYWNrYWdlIGluIGNvbnRleHQgcGF0aCBtdXN0IGhhdmUgYW4gT2JqZWN0RmFjdG9yeQotICAgICAgICAvLyAgICAgICAgCi0gICAgICAgIC8vCi0gICAgICAgIC8vIFVTRSBDTEFTU1tdOgotICAgICAgICAvLyAgICBQcm9zOiBEb2Vzbid0IHJlcXVpcmUgT2JqZWN0RmFjdG9yeSBpbiBlYWNoIHBhY2thZ2UKLSAgICAgICAgLy8gICAgQ29uczogSGFyZCB0byBzZXQgdXAsIG11c3QgYWNjb3VudCBmb3IgSkFYLVdTIGNsYXNzZXMsIGV0Yy4KLSAgICAgICAgLy8gICAgICAgICAgRG9lcyBub3Qgd29yayBpZiBhcnJheXMgb2YgY2xhc3NlcyBhcmUgbmVlZGVkCi0gICAgICAgIC8vICAgICAgICAgIHNsb3dlcgotICAgICAgICAvLwotICAgICAgICAvLyAgVGhlIGZvbGxvd2luZyBjb2RlIGF0dGVtcHRzIHRvIGJ1aWxkIGEgY29udGV4dCBwYXRoLiAgSXQgdGhlbgotICAgICAgICAvLyAgY2hvb3NlIG9uZSBvZiB0aGUgdHdvIGNvbnN0cnVjdGlvbnMgYWJvdmUgKHByZWZlciBVU0UgQSBDT05URVhUX1BBVEgpCi0gICAgICAgIC8vCi0KLSAgICAgICAgLy8gVGhlIHBhY2thZ2VzIGFyZSBleGFtaW5lZCB0byBzZWUgaWYgdGhleSBoYXZlIE9iamVjdEZhY3RvcnkvcGFja2FnZS1pbmZvIGNsYXNzZXMuCi0gICAgICAgIC8vIEludmFsaWQgcGFja2FnZXMgYXJlIHJlbW92ZWQgZnJvbSB0aGUgbGlzdAotICAgICAgICBpdCA9IGNvbnRleHRQYWNrYWdlcy5pdGVyYXRvcigpOwotICAgICAgICBib29sZWFuIGNvbnRleHRDb25zdHJ1Y3Rpb24gPSB0cnVlOwotICAgICAgICBib29sZWFuIGlzSkFYQkZvdW5kID0gZmFsc2U7Ci0gICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIFN0cmluZyBwID0gaXQubmV4dCgpOwotICAgICAgICAgICAgLy8gU2VlIGlmIHRoaXMgcGFja2FnZSBoYXMgYW4gT2JqZWN0RmFjdG9yeSBvciBwYWNrYWdlLWluZm8KLSAgICAgICAgICAgIGlmIChjaGVja1BhY2thZ2UocCwgY2wpKSB7Ci0gICAgICAgICAgICAgICAgLy8gRmxvdyB0byBoZXJlIGluZGljYXRlcyBwYWNrYWdlIGNhbiBiZSB1c2VkIGZvciBDT05URVhUIGNvbnN0cnVjdGlvbgotICAgICAgICAgICAgICAgIGlzSkFYQkZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJQYWNrYWdlICIgKyBwICsgIiBjb250YWlucyBhbiBPYmplY3RGYWN0b3J5IG9yIHBhY2thZ2UtaW5mbyBjbGFzcy4iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIEZsb3cgdG8gaGVyZSBpbmRpY2F0ZXMgdGhhdCB0aGUgcGFja2FnZSBpcyBub3QgdmFsaWQgZm9yIGNvbnRleHQgY29uc3RydWN0aW9uLgotICAgICAgICAgICAgICAgIC8vIFBlcmhhcHMgdGhlIHBhY2thZ2UgaXMgaW52YWxpZC4KLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJQYWNrYWdlICIgKyBwICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGRvZXMgbm90IGNvbnRhaW4gYW4gT2JqZWN0RmFjdG9yeSBvciBwYWNrYWdlLWluZm8gY2xhc3MuICBTZWFyY2hpbmcgZm9yIEpBWEIgY2xhc3NlcyIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiBjbGFzc2VzID0gbnVsbDsKLSAgICAgICAgICAgICAgICBjbGFzc2VzID0gZ2V0QWxsQ2xhc3Nlc0Zyb21QYWNrYWdlKHAsIGNsKTsKLSAgICAgICAgICAgICAgICBpZiAoY2xhc3NlcyA9PSBudWxsIHx8IGNsYXNzZXMuc2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlBhY2thZ2UgIiArIHAgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGRvZXMgbm90IGhhdmUgYW55IEpBWEIgY2xhc3Nlcy4gIEl0IGlzIHJlbW92ZWQgZnJvbSB0aGUgSkFYQiBjb250ZXh0IHBhdGguIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaXQucmVtb3ZlKCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gQ2xhc3NlcyBhcmUgZm91bmQgaW4gdGhlIHBhY2thZ2UuICBXZSBjYW5ub3QgdXNlIHRoZSBDT05URVhUIGNvbnN0cnVjdGlvbgotICAgICAgICAgICAgICAgICAgICBjb250ZXh0Q29uc3RydWN0aW9uID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJQYWNrYWdlICIgKyBwICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBkb2VzIG5vdCBjb250YWluIE9iamVjdEZhY3RvcnksIGJ1dCBpdCBkb2VzIGNvbnRhaW4gb3RoZXIgSkFYQiBjbGFzc2VzLiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFpc0pBWEJGb3VuZCkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJCb3RoIE9iamVjdEZhY3RvcnkgJiBwYWNrYWdlLWluZm8gbm90IGZvdW5kIGluIHBhY2thZ2UgaGllcmFjaHkiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIFRoZSBjb2RlIGFib3ZlIG1heSBoYXZlIHJlbW92ZWQgc29tZSBwYWNrYWdlcyBmcm9tIHRoZSBsaXN0LiAKLSAgICAgICAgLy8gUmV0cnkgb3VyIGxvb2t1cCB3aXRoIHRoZSB1cGRhdGVkIGxpc3QKLSAgICAgICAgU3RyaW5nIGtleSA9IGNvbnRleHRQYWNrYWdlcy50b1N0cmluZygpOwotICAgICAgICBDb25jdXJyZW50SGFzaE1hcDxDbGFzc0xvYWRlciwgSkFYQkNvbnRleHRWYWx1ZT4gaW5uZXJNYXAgPSBudWxsOwotICAgICAgICBTb2Z0UmVmZXJlbmNlPENvbmN1cnJlbnRIYXNoTWFwPENsYXNzTG9hZGVyLCBKQVhCQ29udGV4dFZhbHVlPj4gc29mdFJlZiA9IGpheGJNYXAuZ2V0KGtleSk7Ci0gICAgICAgIGlmIChzb2Z0UmVmICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlubmVyTWFwID0gc29mdFJlZi5nZXQoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKGlubmVyTWFwICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNvbnRleHRWYWx1ZSA9IGlubmVyTWFwLmdldChjbCk7Ci0gICAgICAgICAgICBpZiAoY29udGV4dFZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJTdWNjZXNzZnVsbHkgZm91bmQgSkFYQkNvbnRleHQgd2l0aCB1cGRhdGVkIGNvbnRleHQgbGlzdDoiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0VmFsdWUuamF4YkNvbnRleHQudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0VmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBDT05URVhUIGNvbnN0cnVjdGlvbgotICAgICAgICBpZiAoY29udGV4dENvbnN0cnVjdGlvbikgewotICAgICAgICAgICAgSkFYQkNvbnRleHQgY29udGV4dCA9IGNyZWF0ZUpBWEJDb250ZXh0VXNpbmdDb250ZXh0UGF0aChjb250ZXh0UGFja2FnZXMsIGNsKTsKLSAgICAgICAgICAgIGlmIChjb250ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjb250ZXh0VmFsdWUgPSBuZXcgSkFYQkNvbnRleHRWYWx1ZShjb250ZXh0LCBDT05TVFJVQ1RJT05fVFlQRS5CWV9DT05URVhUX1BBVEgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQ0xBU1MgY29uc3RydWN0aW9uCi0gICAgICAgIGlmIChjb250ZXh0VmFsdWUgPT0gbnVsbCkgewotICAgICAgICAgICAgaXQgPSBjb250ZXh0UGFja2FnZXMuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIExpc3Q8Q2xhc3M+IGZ1bGxMaXN0ID0gbmV3IEFycmF5TGlzdDxDbGFzcz4oKTsKLSAgICAgICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcGtnID0gaXQubmV4dCgpOwotICAgICAgICAgICAgICAgIGZ1bGxMaXN0LmFkZEFsbChnZXRBbGxDbGFzc2VzRnJvbVBhY2thZ2UocGtnLCBjbCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy9MZXRzIGFkZCBhbGwgY29tbW9uIGFycmF5IGNsYXNzZXMKLSAgICAgICAgICAgIGFkZENvbW1vbkFycmF5Q2xhc3NlcyhmdWxsTGlzdCk7Ci0gICAgICAgICAgICBDbGFzc1tdIGNsYXNzQXJyYXkgPSBmdWxsTGlzdC50b0FycmF5KG5ldyBDbGFzc1swXSk7Ci0gICAgICAgICAgICBKQVhCQ29udGV4dCBjb250ZXh0ID0gSkFYQkNvbnRleHRfbmV3SW5zdGFuY2UoY2xhc3NBcnJheSwgY2wsIHByb3BlcnRpZXMpOwotICAgICAgICAgICAgaWYgKGNvbnRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNvbnRleHRWYWx1ZSA9IG5ldyBKQVhCQ29udGV4dFZhbHVlKGNvbnRleHQsIENPTlNUUlVDVElPTl9UWVBFLkJZX0NMQVNTX0FSUkFZKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiU3VjY2Vzc2Z1bGx5IGNyZWF0ZWQgSkFYQkNvbnRleHQgIiArIGNvbnRleHRWYWx1ZS5qYXhiQ29udGV4dC50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY29udGV4dFZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgdW5tYXJzaGFsbGVyLiAgWW91IG11c3QgY2FsbCByZWxlYXNlVW5tYXJzaGFsbGVyIHRvIHB1dCBpdCBiYWNrIGludG8gdGhlIHBvb2wKLSAgICAgKgotICAgICAqIEBwYXJhbSBjb250ZXh0IEpBWEJDb250ZXh0Ci0gICAgICogQHJldHVybiBVbm1hcnNoYWxsZXIKLSAgICAgKiBAdGhyb3dzIEpBWEJFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFVubWFyc2hhbGxlciBnZXRKQVhCVW5tYXJzaGFsbGVyKEpBWEJDb250ZXh0IGNvbnRleHQpIHRocm93cyBKQVhCRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFFTkFCTEVfVU5NQVJTSEFMTF9QT09MSU5HKSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlVubWFyc2hhbGxlciBjcmVhdGVkIFtubyBwb29saW5nXSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGludGVybmFsQ3JlYXRlVW5tYXJzaGFsbGVyKGNvbnRleHQpOwotICAgICAgICB9Ci0gICAgICAgIFVubWFyc2hhbGxlciB1bm0gPSB1cG9vbC5nZXQoY29udGV4dCk7Ci0gICAgICAgIGlmICh1bm0gPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJVbm1hcnNoYWxsZXIgY3JlYXRlZCBbbm90IGluIHBvb2xdIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB1bm0gPSBpbnRlcm5hbENyZWF0ZVVubWFyc2hhbGxlcihjb250ZXh0KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiVW5tYXJzaGFsbGVyIG9idGFpbmVkIFtmcm9tICBwb29sXSIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB1bm07Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgVW5tYXJzaGFsbGVyIGludGVybmFsQ3JlYXRlVW5tYXJzaGFsbGVyKGZpbmFsIEpBWEJDb250ZXh0IGNvbnRleHQpIHRocm93cyBKQVhCRXhjZXB0aW9uIHsKLSAgICAgICAgVW5tYXJzaGFsbGVyIHVubTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHVubSA9IChVbm1hcnNoYWxsZXIpIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAotICAgICAgICAgICAgICAgICAgICBuZXcgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgdGhyb3dzIEpBWEJFeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmNyZWF0ZVVubWFyc2hhbGxlcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICApOwotICAgICAgICB9IGNhdGNoIChQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IChKQVhCRXhjZXB0aW9uKSBlLmdldENhdXNlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHVubTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBNYXJzaGFsbGVyIGludGVybmFsQ3JlYXRlTWFyc2hhbGxlcihmaW5hbCBKQVhCQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgSkFYQkV4Y2VwdGlvbiB7Ci0gICAgICAgIE1hcnNoYWxsZXIgbWFyc2hhbGxlcjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1hcnNoYWxsZXIgPSAoTWFyc2hhbGxlcikgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoCi0gICAgICAgICAgICAgICAgICAgIG5ldyBQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB0aHJvd3MgSkFYQkV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuY3JlYXRlTWFyc2hhbGxlcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICApOwotICAgICAgICB9IGNhdGNoIChQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IChKQVhCRXhjZXB0aW9uKSBlLmdldENhdXNlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1hcnNoYWxsZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVsZWFzZSBVbm1hcnNoYWxsZXIgRG8gbm90IGNhbGwgdGhpcyBtZXRob2QgaWYgYW4gZXhjZXB0aW9uIG9jY3VycmVkIHdoaWxlIHVzaW5nIHRoZQotICAgICAqIFVubWFyc2hhbGxlci4gV2Ugb2JqZWN0IG15IGJlIGluIGFuIGludmFsaWQgc3RhdGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29udGV4dCAgICAgIEpBWEJDb250ZXh0Ci0gICAgICogQHBhcmFtIHVubWFyc2hhbGxlciBVbm1hcnNoYWxsZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVsZWFzZUpBWEJVbm1hcnNoYWxsZXIoSkFYQkNvbnRleHQgY29udGV4dCwgVW5tYXJzaGFsbGVyIHVubWFyc2hhbGxlcikgewotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiVW5tYXJzaGFsbGVyIHBsYWNlZCBiYWNrIGludG8gcG9vbCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChFTkFCTEVfVU5NQVJTSEFMTF9QT09MSU5HKSB7Ci0gICAgICAgIAl1bm1hcnNoYWxsZXIuc2V0QXR0YWNobWVudFVubWFyc2hhbGxlcihudWxsKTsKLSAgICAgICAgICAgIHVwb29sLnB1dChjb250ZXh0LCB1bm1hcnNoYWxsZXIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IEpBWEJNYXJzaGFsbGVyCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29udGV4dCBKQVhCQ29udGV4dAotICAgICAqIEByZXR1cm4gTWFyc2hhbGxlcgotICAgICAqIEB0aHJvd3MgSkFYQkV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTWFyc2hhbGxlciBnZXRKQVhCTWFyc2hhbGxlcihKQVhCQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgSkFYQkV4Y2VwdGlvbiB7Ci0gICAgICAgIE1hcnNoYWxsZXIgbSA9IG51bGw7Ci0gICAgICAgIGlmICghRU5BQkxFX01BUlNIQUxMX1BPT0xJTkcpIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiTWFyc2hhbGxlciBjcmVhdGVkIFtubyBwb29saW5nXSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbSA9IGludGVybmFsQ3JlYXRlTWFyc2hhbGxlcihjb250ZXh0KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG0gPSBtcG9vbC5nZXQoY29udGV4dCk7Ci0gICAgICAgICAgICBpZiAobSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiTWFyc2hhbGxlciBjcmVhdGVkIFtub3QgaW4gcG9vbF0iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbSA9IGludGVybmFsQ3JlYXRlTWFyc2hhbGxlcihjb250ZXh0KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiTWFyc2hhbGxlciBvYnRhaW5lZCBbZnJvbSAgcG9vbF0iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbS5zZXRQcm9wZXJ0eShNYXJzaGFsbGVyLkpBWEJfRlJBR01FTlQsIEJvb2xlYW4uVFJVRSk7IC8vIE5vIFBJcwotICAgICAgICByZXR1cm4gbTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiByZWxlYXNlSkFYQk1hcnNoYWxsbGVyIERvIG5vdCBjYWxsIHRoaXMgbWV0aG9kIGlmIGFuIGV4Y2VwdGlvbiBvY2N1cnJlZCB3aGlsZSB1c2luZyB0aGUKLSAgICAgKiBNYXJzaGFsbGVyLiBXZSBvYmplY3QgbXkgYmUgaW4gYW4gaW52YWxpZCBzdGF0ZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb250ZXh0ICAgIEpBWEJDb250ZXh0Ci0gICAgICogQHBhcmFtIG1hcnNoYWxsZXIgTWFyc2hhbGxlcgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZWxlYXNlSkFYQk1hcnNoYWxsZXIoSkFYQkNvbnRleHQgY29udGV4dCwgTWFyc2hhbGxlciBtYXJzaGFsbGVyKSB7Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJNYXJzaGFsbGVyIHBsYWNlZCBiYWNrIGludG8gcG9vbCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChFTkFCTEVfTUFSU0hBTExfUE9PTElORykgewotICAgICAgICAgICAgbWFyc2hhbGxlci5zZXRBdHRhY2htZW50TWFyc2hhbGxlcihudWxsKTsKLSAgICAgICAgICAgIG1wb29sLnB1dChjb250ZXh0LCBtYXJzaGFsbGVyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIGdldCBKQVhCIEludHJvc3BlY3RvcgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbnRleHQgSkFYQkNvbnRleHQKLSAgICAgKiBAcmV0dXJuIEpBWEJJbnRyb3NwZWN0b3IKLSAgICAgKiBAdGhyb3dzIEpBWEJFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEpBWEJJbnRyb3NwZWN0b3IgZ2V0SkFYQkludHJvc3BlY3RvcihmaW5hbCBKQVhCQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgSkFYQkV4Y2VwdGlvbiB7Ci0gICAgICAgIEpBWEJJbnRyb3NwZWN0b3IgaSA9IG51bGw7Ci0gICAgICAgIGlmICghRU5BQkxFX0lOVFJPU1BFQ1RJT05fUE9PTElORykgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJKQVhCSW50cm9zcGVjdG9yIGNyZWF0ZWQgW25vIHBvb2xpbmddIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpID0gaW50ZXJuYWxDcmVhdGVJbnRyb3NwZWN0b3IoY29udGV4dCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpID0gaXBvb2wuZ2V0KGNvbnRleHQpOwotICAgICAgICAgICAgaWYgKGkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkpBWEJJbnRyb3NwZWN0b3IgY3JlYXRlZCBbbm90IGluIHBvb2xdIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGkgPSBpbnRlcm5hbENyZWF0ZUludHJvc3BlY3Rvcihjb250ZXh0KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiSkFYQkludHJvc3BlY3RvciBvYnRhaW5lZCBbZnJvbSAgcG9vbF0iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgSkFYQkludHJvc3BlY3RvciBpbnRlcm5hbENyZWF0ZUludHJvc3BlY3RvcihmaW5hbCBKQVhCQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIEpBWEJJbnRyb3NwZWN0b3IgaTsKLSAgICAgICAgaSA9IChKQVhCSW50cm9zcGVjdG9yKSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgKLSAgICAgICAgICAgICAgICBuZXcgUHJpdmlsZWdlZEFjdGlvbigpIHsKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5jcmVhdGVKQVhCSW50cm9zcGVjdG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICk7Ci0gICAgICAgIHJldHVybiBpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbGVhc2UgSkFYQkludHJvc3BlY3RvciBEbyBub3QgY2FsbCB0aGlzIG1ldGhvZCBpZiBhbiBleGNlcHRpb24gb2NjdXJyZWQgd2hpbGUgdXNpbmcgdGhlCi0gICAgICogSkFYQkludHJvc3BlY3Rvci4gV2Ugb2JqZWN0IG15IGJlIGluIGFuIGludmFsaWQgc3RhdGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29udGV4dCAgICAgIEpBWEJDb250ZXh0Ci0gICAgICogQHBhcmFtIGludHJvc3BlY3RvciBKQVhCSW50cm9zcGVjdG9yCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlbGVhc2VKQVhCSW50cm9zcGVjdG9yKEpBWEJDb250ZXh0IGNvbnRleHQsIEpBWEJJbnRyb3NwZWN0b3IgaW50cm9zcGVjdG9yKSB7Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJKQVhCSW50cm9zcGVjdG9yIHBsYWNlZCBiYWNrIGludG8gcG9vbCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChFTkFCTEVfSU5UUk9TUEVDVElPTl9QT09MSU5HKSB7Ci0gICAgICAgICAgICBpcG9vbC5wdXQoY29udGV4dCwgaW50cm9zcGVjdG9yKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBwICBQYWNrYWdlCi0gICAgICogQHBhcmFtIGNsCi0gICAgICogQHJldHVybiB0cnVlIGlmIGVhY2ggcGFja2FnZSBoYXMgYSBPYmplY3RGYWN0b3J5IGNsYXNzIG9yIHBhY2thZ2UtaW5mbwotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gY2hlY2tQYWNrYWdlKFN0cmluZyBwLCBDbGFzc0xvYWRlciBjbCkgewotCi0gICAgICAgIC8vIEVhY2ggcGFja2FnZSBtdXN0IGhhdmUgYW4gT2JqZWN0RmFjdG9yeQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiY2hlY2tpbmcgcGFja2FnZSA6IiArIHApOwotCi0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIENsYXNzIGNscyA9IGZvck5hbWUocCArICIuT2JqZWN0RmFjdG9yeSIsIGZhbHNlLCBjbCk7Ci0gICAgICAgICAgICBpZiAoY2xzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vQ2F0Y2ggVGhyb3dhYmxlIGFzIENsYXNzTG9hZGVyIGNhbiB0aHJvdyBhbiBOb0NsYXNzRGVmRm91bmRFcnJvciB0aGF0Ci0gICAgICAgICAgICAvL2RvZXMgbm90IGV4dGVuZCBFeGNlcHRpb24uIFNvIHdlIHdpbGwgYWJzb3JiIGFueSBUaHJvd2FibGUgZXhjZXB0aW9uIGhlcmUuCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIk9iamVjdEZhY3RvcnkgQ2xhc3MgTm90IEZvdW5kICIgKyBlKTsKLSAgICAgICAgICAgICAgICBsb2cudHJhY2UoIi4uLmNhdXNlZCBieSAiICsgZS5nZXRDYXVzZSgpICsgIiAiICsgSmF2YVV0aWxzLnN0YWNrVG9TdHJpbmcoZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIENsYXNzIGNscyA9IGZvck5hbWUocCArICIucGFja2FnZS1pbmZvIiwgZmFsc2UsIGNsKTsKLSAgICAgICAgICAgIGlmIChjbHMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy9DYXRjaCBUaHJvd2FibGUgYXMgQ2xhc3NMb2FkZXIgY2FuIHRocm93IGFuIE5vQ2xhc3NEZWZGb3VuZEVycm9yIHRoYXQKLSAgICAgICAgICAgIC8vZG9lcyBub3QgZXh0ZW5kIEV4Y2VwdGlvbi4gU28gd2Ugd2lsbCBhYnNvcmIgYW55IFRocm93YWJsZSBleGNlcHRpb24gaGVyZS4KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygicGFja2FnZS1pbmZvIENsYXNzIE5vdCBGb3VuZCAiICsgZSk7Ci0gICAgICAgICAgICAgICAgbG9nLnRyYWNlKCIuLi5jYXVzZWQgYnkgIiArIGUuZ2V0Q2F1c2UoKSArICIgIiArIEphdmFVdGlscy5zdGFja1RvU3RyaW5nKGUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBKQVhCQ29udGV4dCB1c2luZyB0aGUgY29udGV4dHBhdGggYXBwcm9hY2gKLSAgICAgKgotICAgICAqIEBwYXJhbSBwYWNrYWdlcwotICAgICAqIEBwYXJhbSBjbCAgICAgICBDbGFzc0xvYWRlcgotICAgICAqIEByZXR1cm4gSkFYQkNvbnRleHQgb3IgbnVsbCBpZiB1bnN1Y2Nlc3NmdWwKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBKQVhCQ29udGV4dCBjcmVhdGVKQVhCQ29udGV4dFVzaW5nQ29udGV4dFBhdGgoVHJlZVNldDxTdHJpbmc+IHBhY2thZ2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc0xvYWRlciBjbCkgewotICAgICAgICBKQVhCQ29udGV4dCBjb250ZXh0ID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIGNvbnRleHRwYXRoID0gIiI7Ci0KLSAgICAgICAgLy8gSXRlcmF0ZSB0aHJvdWdoIHRoZSBjbGFzc2VzIGFuZCBidWlsZCB0aGUgY29udGV4dHBhdGgKLSAgICAgICAgSXRlcmF0b3I8U3RyaW5nPiBpdCA9IHBhY2thZ2VzLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIFN0cmluZyBwID0gaXQubmV4dCgpOwotICAgICAgICAgICAgaWYgKGNvbnRleHRwYXRoLmxlbmd0aCgpICE9IDApIHsKLSAgICAgICAgICAgICAgICBjb250ZXh0cGF0aCArPSAiOiI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjb250ZXh0cGF0aCArPSBwOwotCi0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQXR0ZW1wdGluZyB0byBjcmVhdGUgSkFYQkNvbnRleHQgd2l0aCBjb250ZXh0UGF0aD0iICsgY29udGV4dHBhdGgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY29udGV4dCA9IEpBWEJDb250ZXh0X25ld0luc3RhbmNlKGNvbnRleHRwYXRoLCBjbCk7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIiAgU3VjY2Vzc2Z1bGx5IGNyZWF0ZWQgSkFYQkNvbnRleHQ6IiArIGNvbnRleHQpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKAotICAgICAgICAgICAgICAgICAgICAgICAgIiAgVW5zdWNjZXNzZnVsOiBXZSB3aWxsIG5vdyB1c2UgYW4gYWx0ZXJhdGl2ZSBKQVhCQ29uc3RydWN0IGNvbnN0cnVjdGlvbiIpOwotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiICBSZWFzb24gIiArIGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNvbnRleHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gYWxsIHRoZSBDbGFzcyBuYW1lcyBuZWVkZWQgdG8gY29uc3RydWN0IGEgSkFYQkNvbnRleHQKLSAgICAgKgotICAgICAqIEBwYXJhbSBwa2cgICAgICAgICBQYWNrYWdlCi0gICAgICogQHBhcmFtIENsYXNzTG9hZGVyIGNsCi0gICAgICogQHJldHVybgotICAgICAqIEB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBpZiBlcnJvciBvY2N1cnMgZ2V0dGluZyBwYWNrYWdlCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxDbGFzcz4gZ2V0QWxsQ2xhc3Nlc0Zyb21QYWNrYWdlKFN0cmluZyBwa2csIENsYXNzTG9hZGVyIGNsKSB7Ci0gICAgICAgIGlmIChwa2cgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBBcnJheUxpc3Q8Q2xhc3M+KCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIFNlZSBpZiB0aGlzIGlzIGEgc3BlY2lhbCBwYWNrYWdlIHRoYXQgaGFzIGEgc2V0IG9mIGtub3duIGNsYXNzZXMuCi0gICAgICAgIExpc3Q8Q2xhc3M+IGtub3duQ2xhc3NlcyA9IHNwZWNpYWxNYXAuZ2V0KHBrZyk7Ci0gICAgICAgIGlmIChrbm93bkNsYXNzZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGtub3duQ2xhc3NlczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICogVGhpcyBtZXRob2QgaXMgYSBiZXN0IGVmZm9ydCBtZXRob2QuICBXZSBzaG91bGQgYWx3YXlzIHJldHVybiBhbiBvYmplY3QuCi0gICAgICAgICovCi0KLSAgICAgICAgQXJyYXlMaXN0PENsYXNzPiBjbGFzc2VzID0gbmV3IEFycmF5TGlzdDxDbGFzcz4oKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gVGhpcyB3aWxsIGxvYWQgY2xhc3NlcyBmcm9tIGRpcmVjdG9yeQotICAgICAgICAgICAgTGlzdDxDbGFzcz4gY2xhc3Nlc0Zyb21EaXIgPSBnZXRDbGFzc2VzRnJvbURpcmVjdG9yeShwa2csIGNsKTsKLSAgICAgICAgICAgIGNoZWNrQ2xhc3NlcyhjbGFzc2VzRnJvbURpciwgcGtnKTsKLSAgICAgICAgICAgIGNsYXNzZXMuYWRkQWxsKGNsYXNzZXNGcm9tRGlyKTsKLSAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoImdldENsYXNzZXNGcm9tRGlyZWN0b3J5IGZhaWxlZCB0byBnZXQgQ2xhc3NlcyIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvL0lmIENsYXNlcyBub3QgZm91bmQgaW4gZGlyZWN0b3J5IHRoZW4gbG9vayBmb3IgamFyIHRoYXQgaGFzIHRoZXNlIGNsYXNzZXMKLSAgICAgICAgICAgIGlmIChjbGFzc2VzLnNpemUoKSA8PSAwKSB7Ci0gICAgICAgICAgICAgICAgLy9UaGlzIHdpbGwgbG9hZCBjbGFzc2VzIGZyb20gamFyIGZpbGUuCi0gICAgICAgICAgICAgICAgQ2xhc3NGaW5kZXJGYWN0b3J5IGNmZiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoQ2xhc3NGaW5kZXJGYWN0b3J5KUZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KENsYXNzRmluZGVyRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgQ2xhc3NGaW5kZXIgY2YgPSBjZmYuZ2V0Q2xhc3NGaW5kZXIoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiBjbGFzc2VzRnJvbUphciA9IGNmLmdldENsYXNzZXNGcm9tSmFyRmlsZShwa2csIGNsKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBjaGVja0NsYXNzZXMoY2xhc3Nlc0Zyb21KYXIsIHBrZyk7Ci0gICAgICAgICAgICAgICAgY2xhc3Nlcy5hZGRBbGwoY2xhc3Nlc0Zyb21KYXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiZ2V0Q2xhc3Nlc0Zyb21KYXJGaWxlIGZhaWxlZCB0byBnZXQgQ2xhc3NlcyIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGNsYXNzZXM7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEBwYXJhbSBsaXN0Ci0gICAgICogQHBhcmFtIHBrZwotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY2hlY2tDbGFzc2VzKExpc3Q8Q2xhc3M+IGxpc3QsIFN0cmluZyBwa2cpIHsKLSAgICAgICAgLy8gVGhlIGluc3RhbGxlZCBjbGFzc2ZpbmRlciBvciBkaXJlY3Rvcnkgc2VhcmNoIG1heSBpbmFkdmVydGVudGx5IGFkZCB0b28gbWFueSAKLSAgICAgICAgLy8gY2xhc3Nlcy4gIFRoaXMgcm91bnRpbmUgaXMgYSAnZG91YmxlIGNoZWNrJyB0byBtYWtlIHN1cmUgdGhhdCB0aGUgY2xhc3NlcwotICAgICAgICAvLyBhcmUgYWNjZXB0YWJsZS4KLSAgICAgICAgZm9yIChpbnQgaT0wOyBpPGxpc3Quc2l6ZSgpOykgewotICAgICAgICAgICAgQ2xhc3MgY2xzID0gbGlzdC5nZXQoaSk7Ci0gICAgICAgICAgICBpZiAoIWNscy5pc0ludGVyZmFjZSgpICYmIAotICAgICAgICAgICAgICAgICAgICAoY2xzLmlzRW51bSgpIHx8Ci0gICAgICAgICAgICAgICAgICAgICBnZXRBbm5vdGF0aW9uKGNscywgWG1sVHlwZS5jbGFzcykgIT0gbnVsbCB8fAotICAgICAgICAgICAgICAgICAgICAgQ2xhc3NVdGlscy5nZXREZWZhdWx0UHVibGljQ29uc3RydWN0b3IoY2xzKSAhPSBudWxsKSAmJgotICAgICAgICAgICAgICAgICFDbGFzc1V0aWxzLmlzSkFYV1NDbGFzcyhjbHMpICYmCi0gICAgICAgICAgICAgICAgY2xzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkuZXF1YWxzKHBrZykpIHsKLSAgICAgICAgICAgICAgICBpKys7IC8vIEFjY2VwdGFibGUgY2xhc3MKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiUmVtb3ZpbmcgY2xhc3MgIiArIGNscyArICIgZnJvbSBjb25zaWRlcmF0aW9uIGJlY2F1c2UgaXQgaXMgbm90IGluIHBhY2thZ2UgIiArIHBrZyArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIG9yIGlzIGFuIGludGVyZmFjZSBvciBkb2VzIG5vdCBoYXZlIGEgcHVibGljIGNvbnN0cnVjdG9yIG9yIGlzIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGEgamF4d3MgY2xhc3MiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbGlzdC5yZW1vdmUoaSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBBcnJheUxpc3Q8Q2xhc3M+IGdldENsYXNzZXNGcm9tRGlyZWN0b3J5KFN0cmluZyBwa2csIENsYXNzTG9hZGVyIGNsKQotICAgICAgICAgICAgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICAvLyBUaGlzIHdpbGwgaG9sZCBhIGxpc3Qgb2YgZGlyZWN0b3JpZXMgbWF0Y2hpbmcgdGhlIHBja2duYW1lLiBUaGVyZSBtYXkgYmUgbW9yZSB0aGFuIG9uZSBpZiBhIHBhY2thZ2UgaXMgc3BsaXQgb3ZlciBtdWx0aXBsZSBqYXJzL3BhdGhzCi0gICAgICAgIFN0cmluZyBwY2tnbmFtZSA9IHBrZzsKLSAgICAgICAgQXJyYXlMaXN0PEZpbGU+IGRpcmVjdG9yaWVzID0gbmV3IEFycmF5TGlzdDxGaWxlPigpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBwY2tnbmFtZS5yZXBsYWNlKCcuJywgJy8nKTsKLSAgICAgICAgICAgIC8vIEFzayBmb3IgYWxsIHJlc291cmNlcyBmb3IgdGhlIHBhdGgKLSAgICAgICAgICAgIEVudW1lcmF0aW9uPFVSTD4gcmVzb3VyY2VzID0gY2wuZ2V0UmVzb3VyY2VzKHBhdGgpOwotICAgICAgICAgICAgd2hpbGUgKHJlc291cmNlcy5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgICAgIGRpcmVjdG9yaWVzLmFkZChuZXcgRmlsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIFVSTERlY29kZXIuZGVjb2RlKHJlc291cmNlcy5uZXh0RWxlbWVudCgpLmdldFBhdGgoKSwgIlVURi04IikpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoCi0gICAgICAgICAgICAgICAgICAgICAgICBwY2tnbmFtZSArICIgZG9lcyBub3QgYXBwZWFyIHRvIGJlIGEgdmFsaWQgcGFja2FnZSAoVW5zdXBwb3J0ZWQgZW5jb2RpbmcpIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJDbGFzc1V0aWxzRXJyMiIsIHBja2duYW1lKSk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygKLSAgICAgICAgICAgICAgICAgICAgICAgICJJT0V4Y2VwdGlvbiB3YXMgdGhyb3duIHdoZW4gdHJ5aW5nIHRvIGdldCBhbGwgcmVzb3VyY2VzIGZvciAiICsgcGNrZ25hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhyb3cgbmV3IENsYXNzTm90Rm91bmRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiQ2xhc3NVdGlsc0VycjMiLCBwY2tnbmFtZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgQXJyYXlMaXN0PENsYXNzPiBjbGFzc2VzID0gbmV3IEFycmF5TGlzdDxDbGFzcz4oKTsKLSAgICAgICAgLy8gRm9yIGV2ZXJ5IGRpcmVjdG9yeSBpZGVudGlmaWVkIGNhcHR1cmUgYWxsIHRoZSAuY2xhc3MgZmlsZXMKLSAgICAgICAgZm9yIChGaWxlIGRpcmVjdG9yeSA6IGRpcmVjdG9yaWVzKSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIiAgQWRkaW5nIEpBWEIgY2xhc3NlcyBmcm9tIGRpcmVjdG9yeTogIiArIGRpcmVjdG9yeS5nZXROYW1lKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGRpcmVjdG9yeS5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgbGlzdCBvZiB0aGUgZmlsZXMgY29udGFpbmVkIGluIHRoZSBwYWNrYWdlCi0gICAgICAgICAgICAgICAgU3RyaW5nW10gZmlsZXMgPSBkaXJlY3RvcnkubGlzdCgpOwotICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGZpbGUgOiBmaWxlcykgewotICAgICAgICAgICAgICAgICAgICAvLyB3ZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIC5jbGFzcyBmaWxlcwotICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZS5lbmRzV2l0aCgiLmNsYXNzIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZXMgdGhlIC5jbGFzcyBleHRlbnNpb24KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE8gSmF2YTIgU2VjCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gcGNrZ25hbWUgKyAnLicgKyBmaWxlLnN1YnN0cmluZygwLCBmaWxlLmxlbmd0aCgpIC0gNik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzIGNsYXp6ID0gZm9yTmFtZShjbGFzc05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBnZXRDb250ZXh0Q2xhc3NMb2FkZXIoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRG9uJ3QgYWRkIGFueSBpbnRlcmZhY2VzIG9yIEpBWFdTIHNwZWNpZmljIGNsYXNzZXMuICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IGNsYXNzZXMgdGhhdCByZXByZXNlbnQgZGF0YSBhbmQgY2FuIGJlIG1hcnNoYWxsZWQgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnkgSkFYQiBzaG91bGQgYmUgYWRkZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjbGF6ei5pc0ludGVyZmFjZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoY2xhenouaXNFbnVtKCkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRBbm5vdGF0aW9uKGNsYXp6LCBYbWxUeXBlLmNsYXNzKSAhPSBudWxsIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NVdGlscy5nZXREZWZhdWx0UHVibGljQ29uc3RydWN0b3IoY2xhenopICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAhQ2xhc3NVdGlscy5pc0pBWFdTQ2xhc3MoY2xhenopCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAhamF2YS5sYW5nLkV4Y2VwdGlvbi5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGNsYXp6KSkgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVuc3VyZSB0aGF0IGFsbCB0aGUgcmVmZXJlbmNlZCBjbGFzc2VzIGFyZSBsb2FkYWJsZSB0b28KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhenouZ2V0RGVjbGFyZWRNZXRob2RzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXp6LmdldERlY2xhcmVkRmllbGRzKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkFkZGluZyBjbGFzczogIiArIGZpbGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzZXMuYWRkKGNsYXp6KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSRVZJRVc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN1cHBvcnQgb2YgUlBDIGxpc3QgKGFuZCBwb3NzaWJseSBvdGhlciBzY2VuYXJpb3MpIHJlcXVpcmVzIHRoYXQgdGhlIGFycmF5IGNsYXNzZXMgc2hvdWxkIGFsc28gYmUgcHJlc2VudC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhIGhhY2sgdW50aWwgd2UgY2FuIGRldGVybWluZSBob3cgdG8gZ2V0IHRoaXMgaW5mb3JtYXRpb24uCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGFycmF5TmFtZSBhbmQgbG9hZGFibGUgbmFtZSBhcmUgZGlmZmVyZW50LiAgR2V0IHRoZSBsb2FkYWJsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuYW1lLCBsb2FkIHRoZSBhcnJheSBjbGFzcywgYW5kIGFkZCBpdCB0byBvdXIgbGlzdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NsYXNzTmFtZSArPSAiW10iOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1N0cmluZyBsb2FkYWJsZU5hbWUgPSBDbGFzc1V0aWxzLmdldExvYWRhYmxlQ2xhc3NOYW1lKGNsYXNzTmFtZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9DbGFzcyBhQ2xhenogPSBDbGFzcy5mb3JOYW1lKGxvYWRhYmxlTmFtZSwgZmFsc2UsIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0NhdGNoIFRocm93YWJsZSBhcyBDbGFzc0xvYWRlciBjYW4gdGhyb3cgYW4gTm9DbGFzc0RlZkZvdW5kRXJyb3IgdGhhdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZG9lcyBub3QgZXh0ZW5kIEV4Y2VwdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJUcmllZCB0byBsb2FkIGNsYXNzICIgKyBjbGFzc05hbWUgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgd2hpbGUgY29uc3RydWN0aW5nIGEgSkFYQkNvbnRleHQuICBUaGlzIGNsYXNzIHdpbGwgYmUgc2tpcHBlZC4gIFByb2Nlc3NpbmcgQ29udGludWVzLiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIiAgVGhlIHJlYXNvbiB0aGF0IGNsYXNzIGNvdWxkIG5vdCBiZSBsb2FkZWQ6IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLnRyYWNlKEphdmFVdGlscy5zdGFja1RvU3RyaW5nKGUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGNsYXNzZXM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gY29tbW9uQXJyYXlDbGFzc2VzID0gbmV3IFN0cmluZ1tdIHsKLSAgICAgICAgICAgIC8vIHByaW1pdGl2ZXMKLSAgICAgICAgICAgICJib29sZWFuW10iLAotICAgICAgICAgICAgImJ5dGVbXSIsCi0gICAgICAgICAgICAiY2hhcltdIiwKLSAgICAgICAgICAgICJkb3VibGVbXSIsCi0gICAgICAgICAgICAiZmxvYXRbXSIsCi0gICAgICAgICAgICAiaW50W10iLAotICAgICAgICAgICAgImxvbmdbXSIsCi0gICAgICAgICAgICAic2hvcnRbXSIsCi0gICAgICAgICAgICAiamF2YS5sYW5nLlN0cmluZ1tdIiwKLSAgICAgICAgICAgIC8vIE90aGVycwotICAgICAgICAgICAgImphdmEubGFuZy5PYmplY3RbXSIsCi0gICAgICAgICAgICAiamF2YS5hd3QuSW1hZ2VbXSIsCi0gICAgICAgICAgICAiamF2YS5tYXRoLkJpZ0RlY2ltYWxbXSIsCi0gICAgICAgICAgICAiamF2YS5tYXRoLkJpZ0ludGVnZXJbXSIsCi0gICAgICAgICAgICAiamF2YS51dGlsLkNhbGVuZGFyW10iLAotICAgICAgICAgICAgImphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWVbXSIgfTsKLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYWRkQ29tbW9uQXJyYXlDbGFzc2VzKExpc3Q8Q2xhc3M+IGxpc3QpIHsKLSAgICAgICAgLy8gQWRkIGNvbW1vbiBwcmltaXRpdmVzIGFycmF5cyAobmVjZXNzYXJ5IGZvciBSUEMgbGlzdCB0eXBlIHN1cHBvcnQpCi0gICAgICAgIENsYXNzTG9hZGVyIGNsID0gZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7Ci0KLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbW1vbkFycmF5Q2xhc3Nlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IGNvbW1vbkFycmF5Q2xhc3Nlc1tpXTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgLy8gTG9hZCBhbmQgYWRkIHRoZSBjbGFzcwotICAgICAgICAgICAgICAgIENsYXNzIGNscyA9IGZvck5hbWUoQ2xhc3NVdGlscy5nZXRMb2FkYWJsZUNsYXNzTmFtZShjbGFzc05hbWUpLCBmYWxzZSwgY2wpOwotICAgICAgICAgICAgICAgIGxpc3QuYWRkKGNscyk7Ci0gICAgICAgICAgICAgICAgLy9DYXRjaCBUaHJvd2FibGUgYXMgQ2xhc3NMb2FkZXIgY2FuIHRocm93IGFuIE5vQ2xhc3NEZWZGb3VuZEVycm9yIHRoYXQKLSAgICAgICAgICAgICAgICAvL2RvZXMgbm90IGV4dGVuZCBFeGNlcHRpb24KLSAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiVHJpZWQgdG8gbG9hZCBjbGFzcyAiICsgY2xhc3NOYW1lICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHdoaWxlIGNvbnN0cnVjdGluZyBhIEpBWEJDb250ZXh0LiAgVGhpcyBjbGFzcyB3aWxsIGJlIHNraXBwZWQuICBQcm9jZXNzaW5nIENvbnRpbnVlcy4iKTsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgIFRoZSByZWFzb24gdGhhdCBjbGFzcyBjb3VsZCBub3QgYmUgbG9hZGVkOiIgKyBlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICBsb2cudHJhY2UoSmF2YVV0aWxzLnN0YWNrVG9TdHJpbmcoZSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKiBAcmV0dXJuIENsYXNzTG9hZGVyICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3NMb2FkZXIgZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkgewotICAgICAgICAvLyBOT1RFOiBUaGlzIG1ldGhvZCBtdXN0IHJlbWFpbiBwcml2YXRlIGJlY2F1c2UgaXQgdXNlcyBBY2Nlc3NDb250cm9sbGVyCi0gICAgICAgIENsYXNzTG9hZGVyIGNsID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNsID0gKENsYXNzTG9hZGVyKUFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAotICAgICAgICAgICAgICAgICAgICBuZXcgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICApOwotICAgICAgICB9IGNhdGNoIChQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiRXhjZXB0aW9uIHRocm93biBmcm9tIEFjY2Vzc0NvbnRyb2xsZXI6ICIgKyBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZS5nZXRFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gY2w7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBjbGFzcyBmb3IgdGhpcyBuYW1lCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIENsYXNzCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3MgZm9yTmFtZShmaW5hbCBTdHJpbmcgY2xhc3NOYW1lLCBmaW5hbCBib29sZWFuIGluaXRpYWxpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDbGFzc0xvYWRlciBjbGFzc2xvYWRlcikgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICAvLyBOT1RFOiBUaGlzIG1ldGhvZCBtdXN0IHJlbWFpbiBwcml2YXRlIGJlY2F1c2UgaXQgdXNlcyBBY2Nlc3NDb250cm9sbGVyCi0gICAgICAgIENsYXNzIGNsID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNsID0gKENsYXNzKUFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAotICAgICAgICAgICAgICAgICAgICBuZXcgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENsYXNzLmZvck5hbWUgZG9lcyBub3Qgc3VwcG9ydCBwcmltaXRpdmVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MgY2xzID0gQ2xhc3NVdGlscy5nZXRQcmltaXRpdmVDbGFzcyhjbGFzc05hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbHMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHMgPSBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSwgaW5pdGlhbGl6ZSwgY2xhc3Nsb2FkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2xzOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICApOwotICAgICAgICB9IGNhdGNoIChQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiRXhjZXB0aW9uIHRocm93biBmcm9tIEFjY2Vzc0NvbnRyb2xsZXI6ICIgKyBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRocm93IChDbGFzc05vdEZvdW5kRXhjZXB0aW9uKWUuZ2V0RXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gY2w7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIEpBWEJDb250ZXh0IGZyb20gY29udGV4dCBTdHJpbmcgYW5kIENsYXNzTG9hZGVyCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29udGV4dAotICAgICAqIEBwYXJhbSBjbGFzc2xvYWRlcgotICAgICAqIEByZXR1cm4KLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIEpBWEJDb250ZXh0IEpBWEJDb250ZXh0X25ld0luc3RhbmNlKGZpbmFsIFN0cmluZyBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzTG9hZGVyIGNsYXNzbG9hZGVyKQotICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIE5PVEU6IFRoaXMgbWV0aG9kIG11c3QgcmVtYWluIHByaXZhdGUgYmVjYXVzZSBpdCB1c2VzIEFjY2Vzc0NvbnRyb2xsZXIKLSAgICAgICAgSkFYQkNvbnRleHQgamF4YkNvbnRleHQgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbnRleHQgPT0gbnVsbCB8fCBjb250ZXh0Lmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJKQVhCQ29udGV4dCBpcyBjb25zdHJ1Y3RlZCB3aXRob3V0IGEgY29udGV4dCBTdHJpbmcuIik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJKQVhCQ29udGV4dCBpcyBjb25zdHJ1Y3RlZCB3aXRoIGEgY29udGV4dCBvZjoiICsgY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgamF4YkNvbnRleHQgPSAoSkFYQkNvbnRleHQpQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoCi0gICAgICAgICAgICAgICAgICAgIG5ldyBQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB0aHJvd3MgSkFYQkV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEpBWEJDb250ZXh0Lm5ld0luc3RhbmNlKGNvbnRleHQsIGNsYXNzbG9hZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgKTsKLSAgICAgICAgfSBjYXRjaCAoUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkV4Y2VwdGlvbiB0aHJvd24gZnJvbSBBY2Nlc3NDb250cm9sbGVyOiAiICsgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aHJvdyBlLmdldEV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGpheGJDb250ZXh0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBKQVhCQ29udGV4dCBmcm9tIENsYXNzW10KLSAgICAgKgotICAgICAqIEBwYXJhbSBjbGFzc0FycmF5Ci0gICAgICogQHBhcmFtIGNsIENsYXNzTG9hZGVyIHRoYXQgbG9hZGVkIHRoZSBjbGFzc2VzCi0gICAgICogQHJldHVybgotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgSkFYQkNvbnRleHQgSkFYQkNvbnRleHRfbmV3SW5zdGFuY2UoZmluYWwgQ2xhc3NbXSBjbGFzc0FycmF5LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDbGFzc0xvYWRlciBjbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCA/PiBwcm9wZXJ0aWVzKQotICAgIHRocm93cyBKQVhCRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gTk9URTogVGhpcyBtZXRob2QgbXVzdCByZW1haW4gcHJpdmF0ZSBiZWNhdXNlIGl0IHVzZXMgQWNjZXNzQ29udHJvbGxlcgotICAgICAgICBKQVhCQ29udGV4dCBqYXhiQ29udGV4dCA9IG51bGw7Ci0KLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBpZiAoY2xhc3NBcnJheSA9PSBudWxsIHx8IGNsYXNzQXJyYXkubGVuZ3RoID09IDApIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkpBWEJDb250ZXh0IGlzIGNvbnN0cnVjdGVkIHdpdGggMCBpbnB1dCBjbGFzc2VzLiIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkpBWEJDb250ZXh0IGlzIGNvbnN0cnVjdGVkIHdpdGggIiArIGNsYXNzQXJyYXkubGVuZ3RoICsKLSAgICAgICAgICAgICAgICAiIGlucHV0IGNsYXNzZXMuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBHZXQgSkFYQkNvbnRleHQgZnJvbSBjbGFzc2VzCi0gICAgICAgIGpheGJDb250ZXh0ID0gSkFYQkNvbnRleHRGcm9tQ2xhc3Nlcy5uZXdJbnN0YW5jZShjbGFzc0FycmF5LCBjbCwgcHJvcGVydGllcyk7Ci0KLSAgICAgICAgcmV0dXJuIGpheGJDb250ZXh0OwotICAgIH0KLQotICAgIC8qKiBIb2xkcyB0aGUgSkFYQkNvbnRleHQgYW5kIHRoZSBtYW5uZXIgYnkgd2hpY2ggaXQgd2FzIGNvbnN0cnVjdGVkICovCi0gICAgc3RhdGljIGNsYXNzIEpBWEJDb250ZXh0VmFsdWUgewotCi0gICAgICAgIHB1YmxpYyBKQVhCQ29udGV4dCBqYXhiQ29udGV4dDsKLSAgICAgICAgcHVibGljIENPTlNUUlVDVElPTl9UWVBFIGNvbnN0cnVjdGlvblR5cGU7Ci0KLSAgICAgICAgcHVibGljIEpBWEJDb250ZXh0VmFsdWUoSkFYQkNvbnRleHQgamF4YkNvbnRleHQsIENPTlNUUlVDVElPTl9UWVBFIGNvbnN0cnVjdGlvblR5cGUpIHsKLSAgICAgICAgICAgIHRoaXMuamF4YkNvbnRleHQgPSBqYXhiQ29udGV4dDsKLSAgICAgICAgICAgIHRoaXMuY29uc3RydWN0aW9uVHlwZSA9IGNvbnN0cnVjdGlvblR5cGU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgc3RhdGljIHByaXZhdGUgdm9pZCBhZGp1c3RQb29sU2l6ZShNYXAgbWFwKSB7Ci0gICAgICAgIGlmIChtYXAuc2l6ZSgpID4gTUFYX0xPQURfRkFDVE9SKSB7Ci0gICAgICAgICAgICAvLyBSZW1vdmUgZXZlcnkgb3RoZXIgRW50cnkgaW4gdGhlIG1hcC4KLSAgICAgICAgICAgIEl0ZXJhdG9yIGl0ID0gbWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIGJvb2xlYW4gcmVtb3ZlSXQgPSBmYWxzZTsKLSAgICAgICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBpdC5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlbW92ZUl0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGl0LnJlbW92ZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZW1vdmVJdCA9ICFyZW1vdmVJdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBvb2wgYSBsaXN0IG9mIGl0ZW1zIGZvciBhIHNwZWNpZmljIGtleQotICAgICAqCi0gICAgICogQHBhcmFtIDxLPiBLZXkKLSAgICAgKiBAcGFyYW0gPFY+IFBvb2xlZCBvYmplY3QKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBQb29sPEssVj4gewotICAgICAgICBwcml2YXRlIFNvZnRSZWZlcmVuY2U8TWFwPEssTGlzdDxWPj4+IHNvZnRNYXAgPSAKLSAgICAgICAgICAgIG5ldyBTb2Z0UmVmZXJlbmNlPE1hcDxLLExpc3Q8Vj4+PigKLSAgICAgICAgICAgICAgICAgICAgbmV3IENvbmN1cnJlbnRIYXNoTWFwPEssIExpc3Q8Vj4+KCkpOwotCi0gICAgICAgIC8vIFRoZSBtYXBzIGFyZSBmcmVlZCB1cCB3aGVuIGEgTE9BRCBGQUNUT1IgaXMgaGl0Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGludCBNQVhfTElTVF9GQUNUT1IgPSA1MDsKLSAgICAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAgKiBAcGFyYW0ga2V5Ci0gICAgICAgICAqIEByZXR1cm4gcmVtb3ZlZCBpdGVtIGZyb20gcG9vbCBvciBudWxsLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFYgZ2V0KEsga2V5KSB7Ci0gICAgICAgICAgICBMaXN0PFY+IHZhbHVlcyA9IGdldFZhbHVlcyhrZXkpOwotICAgICAgICAgICAgc3luY2hyb25pemVkICh2YWx1ZXMpIHsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWVzLnNpemUoKT4wKSB7Ci0gICAgICAgICAgICAgICAgICAgIFYgdiA9IHZhbHVlcy5yZW1vdmUodmFsdWVzLnNpemUoKS0xKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHY7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFkZCBpdGVtIGJhY2sgdG8gcG9vbAotICAgICAgICAgKiBAcGFyYW0ga2V5Ci0gICAgICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgcHV0KEsga2V5LCBWIHZhbHVlKSB7Ci0gICAgICAgICAgICBhZGp1c3RTaXplKCk7Ci0gICAgICAgICAgICBMaXN0PFY+IHZhbHVlcyA9IGdldFZhbHVlcyhrZXkpOwotICAgICAgICAgICAgc3luY2hyb25pemVkICh2YWx1ZXMpIHsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWVzLnNpemUoKSA8IE1BWF9MSVNUX0ZBQ1RPUikgewotICAgICAgICAgICAgICAgICAgICB2YWx1ZXMuYWRkKHZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0IG9yIGNyZWF0ZSBhIGxpc3Qgb2YgdGhlIHZhbHVlcyBmb3IgdGhlIGtleQotICAgICAgICAgKiBAcGFyYW0ga2V5Ci0gICAgICAgICAqIEByZXR1cm4gbGlzdCBvZiB2YWx1ZXMuCi0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIExpc3Q8Vj4gZ2V0VmFsdWVzKEsga2V5KSB7Ci0gICAgICAgICAgICBNYXA8SyxMaXN0PFY+PiBtYXAgPSBzb2Z0TWFwLmdldCgpOwotICAgICAgICAgICAgTGlzdDxWPiB2YWx1ZXMgPSBudWxsOwotICAgICAgICAgICAgaWYgKG1hcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdmFsdWVzID0gbWFwLmdldChrZXkpOwotICAgICAgICAgICAgICAgIGlmKHZhbHVlcyAhPW51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlczsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgICAgICAgICAgICBpZiAobWFwICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gbWFwLmdldChrZXkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAodmFsdWVzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1hcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtYXAgPSBuZXcgQ29uY3VycmVudEhhc2hNYXA8SywgTGlzdDxWPj4oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNvZnRNYXAgPSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU29mdFJlZmVyZW5jZTxNYXA8SyxMaXN0PFY+Pj4obWFwKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBuZXcgQXJyYXlMaXN0PFY+KCk7Ci0gICAgICAgICAgICAgICAgICAgIG1hcC5wdXQoa2V5LCB2YWx1ZXMpOwotCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBZGp1c3RTaXplCi0gICAgICAgICAqIFdoZW4gdGhlIG51bWJlciBvZiBrZXlzIGV4Y2VlZHMgdGhlIG1heGltdW0gbG9hZCwgaGFsZgotICAgICAgICAgKiBvZiB0aGUgZW50cmllcyBhcmUgZGVsZXRlZC4KLSAgICAgICAgICogCi0gICAgICAgICAqIFRoZSBhc3N1bXB0aW9uIGlzIHRoYXQgdGhlIEpBWEJDb250ZXh0cywgVW5NYXJzaGFsbGVycywgTWFyc2hhbGxlcnMsIGV0Yy4gcmVxdWlyZQotICAgICAgICAgKiBhIGxhcmdlIGZvb3RwcmludC4KLSAgICAgICAgICovCi0gICAgICAgIHByaXZhdGUgdm9pZCBhZGp1c3RTaXplKCkgewotICAgICAgICAgICAgTWFwPEssTGlzdDxWPj4gbWFwID0gc29mdE1hcC5nZXQoKTsKLSAgICAgICAgICAgIGlmIChtYXAgIT0gbnVsbCAmJiBtYXAuc2l6ZSgpID4gTUFYX0xPQURfRkFDVE9SKSB7Ci0gICAgICAgICAgICAgICAgLy8gUmVtb3ZlIGV2ZXJ5IG90aGVyIEVudHJ5IGluIHRoZSBtYXAuCi0gICAgICAgICAgICAgICAgSXRlcmF0b3IgaXQgPSBtYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgIGJvb2xlYW4gcmVtb3ZlSXQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGl0Lm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlbW92ZUl0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpdC5yZW1vdmUoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZW1vdmVJdCA9ICFyZW1vdmVJdDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBBbm5vdGF0aW9uIGdldEFubm90YXRpb24oZmluYWwgQW5ub3RhdGVkRWxlbWVudCBlbGVtZW50LCBmaW5hbCBDbGFzcyBhbm5vdGF0aW9uKSB7Ci0gICAgICAgIHJldHVybiAoQW5ub3RhdGlvbikgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRBY3Rpb24oKSB7Ci0gICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudC5nZXRBbm5vdGF0aW9uKGFubm90YXRpb24pOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldERlZmF1bHROYW1lc3BhY2VSZW1hcFByb3BlcnR5KCkgewotICAgICAgICBTdHJpbmcgZXh0ZXJuYWwgPSAiY29tLnN1bi54bWwuYmluZC5kZWZhdWx0TmFtZXNwYWNlUmVtYXAiOwotICAgICAgICBTdHJpbmcgaW50ZXJuYWwgPSAiY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC5kZWZhdWx0TmFtZXNwYWNlUmVtYXAiOwotICAgICAgICAKLSAgICAgICAgQm9vbGVhbiBpc0V4dGVybmFsID0gdGVzdEpBWEJQcm9wZXJ0eShleHRlcm5hbCk7Ci0gICAgICAgIGlmIChCb29sZWFuLlRSVUUuZXF1YWxzKGlzRXh0ZXJuYWwpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXh0ZXJuYWw7Ci0gICAgICAgIH0gICAgICAgICAgICAgICAgCi0gICAgICAgIEJvb2xlYW4gaXNJbnRlcm5hbCA9IHRlc3RKQVhCUHJvcGVydHkoaW50ZXJuYWwpOwotICAgICAgICBpZiAoQm9vbGVhbi5UUlVFLmVxdWFscyhpc0ludGVybmFsKSkgewotICAgICAgICAgICAgcmV0dXJuIGludGVybmFsOwotICAgICAgICB9Ci0gICAgICAgIC8vIGhtbS4uLiBib3RoIHByb3BlcnRpZXMgY2Fubm90IGJlIHNldAotICAgICAgICByZXR1cm4gZXh0ZXJuYWw7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIEJvb2xlYW4gdGVzdEpBWEJQcm9wZXJ0eShTdHJpbmcgcHJvcE5hbWUpIHsKLSAgICAgICAgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBwcm9wcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotICAgICAgICBwcm9wcy5wdXQocHJvcE5hbWUsICJodHRwOi8vdGVzdCIpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoCi0gICAgICAgICAgICAgICAgICAgIG5ldyBQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB0aHJvd3MgSkFYQkV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEpBWEJDb250ZXh0Lm5ld0luc3RhbmNlKG5ldyBDbGFzc1tdIHtJbnRlZ2VyLmNsYXNzfSwgcHJvcHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIHJldHVybiBCb29sZWFuLlRSVUU7Ci0gICAgICAgIH0gY2F0Y2ggKFByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaWYgKGUuZ2V0Q2F1c2UoKSBpbnN0YW5jZW9mIEpBWEJFeGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbi5GQUxTRTsKLSAgICAgICAgICAgIH0gCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvZGF0YWJpbmRpbmcvSkFYQlV0aWxzTW9uaXRvci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9kYXRhYmluZGluZy9KQVhCVXRpbHNNb25pdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmMzY5N2QuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9kYXRhYmluZGluZy9KQVhCVXRpbHNNb25pdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmRhdGFiaW5kaW5nOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuSmF2YVV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLS8qKg0KLSAqIFRoZSBtb25pdG9yIGlzIHVzZWQgYnkgdGhlIHRlc3RzIHRvIGVuc3VyZQ0KLSAqIHRoYXQgdGhlIEpBWEJVdGlscyBjb2RlIGlzIHVzZWQgYW5kIGlzIGZ1bmN0aW9uaW5nIGNvcnJlY3RseS4NCi0gKiBJbiBub3JtYWwgdXNhZ2UsIG1vbml0b3JpbmcgaXMgb2ZmLg0KLSAqIA0KLSAqIEN1cnJlbnRseSB0aGUgSkFYQlV0aWxzTW9uaXRvciBrZWVwcyB0cmFjayBvZiB0aGUgcGFja2FnZUtleXMNCi0gKiBwYXNzZWQgdG8gY3JlYXRlSkFYQkNvbnRleHQoKikuICBGdXR1cmUgaW1wcm92ZW1lbnRzIG1heSBtb25pdG9yDQotICogdGhlIHNpemUgb2YgdGhlIHBvb2xzLCB0aGUgcG9vbCBoaXRzIHZlcnN1cyBtaXNzZXMsIGV0Yy4NCi0gKi8NCi1wdWJsaWMgY2xhc3MgSkFYQlV0aWxzTW9uaXRvciB7DQotICAgIA0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coSkFYQlV0aWxzTW9uaXRvci5jbGFzcyk7DQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gbW9uaXRvcmluZyA9IGZhbHNlOw0KLSAgICBwcml2YXRlIHN0YXRpYyBBcnJheUxpc3Q8U3RyaW5nPiBwYWNrYWdlS2V5cyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOyANCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHNlbWlmb3JlID0gIkpBWEJVdGlscyI7DQotICAgIA0KLSAgICAvKioNCi0gICAgICogSW50ZW50aW9uYWxseSBwcml2YXRlLiAgQWxsIG1ldGhvZHMgYXJlIHN0YXRpYy4NCi0gICAgICovDQotICAgIHByaXZhdGUgSkFYQlV0aWxzTW9uaXRvcigpIHsNCi0gICAgICAgIA0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgbW9uaXRvcmluZw0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzTW9uaXRvcmluZygpIHsNCi0gICAgICAgIHJldHVybiBtb25pdG9yaW5nOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBTZXQgbW9uaXRvcmluZw0KLSAgICAgKiBAcGFyYW0gbW9uaXRvcmluZyBib29sZWFuDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0TW9uaXRvcmluZyhib29sZWFuIG1vbml0b3JpbmcpIHsNCi0gICAgICAgIEpBWEJVdGlsc01vbml0b3IubW9uaXRvcmluZyA9IG1vbml0b3Jpbmc7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBDbGVhciB0aGUgbnVtYmVyIG9mIGNyZWF0ZXMgYW5kIGZhaWxlZCBjcmVhdGVzDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY2xlYXIoKSB7DQotICAgICAgICBzeW5jaHJvbml6ZWQoc2VtaWZvcmUpIHsNCi0gICAgICAgICAgICBwYWNrYWdlS2V5cy5jbGVhcigpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBAcmV0dXJuIHBhY2thZ2Uga2V5cw0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyBMaXN0PFN0cmluZz4gZ2V0UGFja2FnZUtleXMoKSB7DQotICAgICAgICBzeW5jaHJvbml6ZWQoc2VtaWZvcmUpIHsNCi0gICAgICAgICAgICByZXR1cm4gbmV3IEFycmF5TGlzdDxTdHJpbmc+KHBhY2thZ2VLZXlzKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBBZGQgUGFja2FnZUtleQ0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZFBhY2thZ2VLZXkoU3RyaW5nIHBhY2thZ2VLZXkpIHsNCi0gICAgICAgIGlmIChpc01vbml0b3JpbmcoKSkgew0KLSAgICAgICAgICAgIHN5bmNocm9uaXplZChzZW1pZm9yZSkgew0KLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIGxvZy50cmFjZShKYXZhVXRpbHMuY2FsbFN0YWNrVG9TdHJpbmcoKSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgaWYgKCFwYWNrYWdlS2V5cy5jb250YWlucyhwYWNrYWdlS2V5KSkgew0KLSAgICAgICAgICAgICAgICAgICAgcGFja2FnZUtleXMuYWRkKHBhY2thZ2VLZXkpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotICANCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9kYXRhYmluZGluZy9PTUJsb2NrLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2RhdGFiaW5kaW5nL09NQmxvY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDczYjQwMy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2RhdGFiaW5kaW5nL09NQmxvY2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmRhdGFiaW5kaW5nOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLkJsb2NrOwotCi0vKiogT01CbG9jayBCbG9jayByZXByZXNlbnRlZCBieSBhbiBPTUVsZW1lbnQgb2JqZWN0ICovCi1wdWJsaWMgaW50ZXJmYWNlIE9NQmxvY2sgZXh0ZW5kcyBCbG9jayB7Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvZGF0YWJpbmRpbmcvU09BUEVudmVsb3BlQmxvY2suamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvZGF0YWJpbmRpbmcvU09BUEVudmVsb3BlQmxvY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVhMWIxNy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2RhdGFiaW5kaW5nL1NPQVBFbnZlbG9wZUJsb2NrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5kYXRhYmluZGluZzsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5CbG9jazsKLQotLyoqCi0gKiBTT0FQRW52ZWxvcGVCbG9jayBCbG9jayByZXByZXNlbnRlZCBieSBhbiBTQUFKIFNPQVBFbnZlbG9wZS4gVGhpcyBraW5kIG9mIGJsb2NrIGlzIHVzZWZ1bCBmb3IKLSAqIGJ1aWxkaW5nIHRoZSBpbml0aWFsIE1lc3NhZ2UKLSAqLwotcHVibGljIGludGVyZmFjZSBTT0FQRW52ZWxvcGVCbG9jayBleHRlbmRzIEJsb2NrIHsKLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9kYXRhYmluZGluZy9Tb3VyY2VCbG9jay5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9kYXRhYmluZGluZy9Tb3VyY2VCbG9jay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzAwYjZlLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvZGF0YWJpbmRpbmcvU291cmNlQmxvY2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmRhdGFiaW5kaW5nOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLkJsb2NrOwotCi0vKiogU291cmNlQmxvY2sgQmxvY2sgd2l0aCBhIGJ1c2luZXNzIG9iamVjdCB0aGF0IGlzIGEgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2UgKi8KLXB1YmxpYyBpbnRlcmZhY2UgU291cmNlQmxvY2sgZXh0ZW5kcyBCbG9jayB7Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvZGF0YWJpbmRpbmcvWE1MU3RyaW5nQmxvY2suamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvZGF0YWJpbmRpbmcvWE1MU3RyaW5nQmxvY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjViYjQzZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2RhdGFiaW5kaW5nL1hNTFN0cmluZ0Jsb2NrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5kYXRhYmluZGluZzsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5CbG9jazsKLQotLyoqIFhNTFN0cmluZ0Jsb2NrIEJsb2NrIHdpdGggYSBidXNpbmVzcyBvYmplY3QgdGhhdCBpcyBhIFN0cmluZyBjb250YWluaW5nIHhtbCB0ZXh0ICovCi1wdWJsaWMgaW50ZXJmYWNlIFhNTFN0cmluZ0Jsb2NrIGV4dGVuZHMgQmxvY2sgewotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2RhdGFiaW5kaW5nL2ltcGwvQ2xhc3NGaW5kZXJJbXBsLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2RhdGFiaW5kaW5nL2ltcGwvQ2xhc3NGaW5kZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhMTllZGMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9kYXRhYmluZGluZy9pbXBsL0NsYXNzRmluZGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmRhdGFiaW5kaW5nLmltcGw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLkV4Y2VwdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5pMThuLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5kYXRhYmluZGluZy5DbGFzc0ZpbmRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnV0aWxpdHkuQ2xhc3NVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnV0aWxpdHkuSmF2YVV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmV0LlVSTENsYXNzTG9hZGVyOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLmphci5KYXJFbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuamFyLkphckZpbGU7Ci0KLQotcHVibGljIGNsYXNzIENsYXNzRmluZGVySW1wbCBpbXBsZW1lbnRzIENsYXNzRmluZGVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coQ2xhc3NGaW5kZXJJbXBsLmNsYXNzKTsKLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZGF0YWJpbmRpbmcuQ2xhc3NGaW5kZXIjZ2V0Q2xhc3Nlc0Zyb21KYXJGaWxlKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5DbGFzc0xvYWRlcikKLSAgICAgICovCi0gICAgcHVibGljIEFycmF5TGlzdDxDbGFzcz4gZ2V0Q2xhc3Nlc0Zyb21KYXJGaWxlKFN0cmluZyBwa2csIENsYXNzTG9hZGVyIGNsKQotICAgICAgICAgICAgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgQXJyYXlMaXN0PENsYXNzPiBjbGFzc2VzID0gbmV3IEFycmF5TGlzdDxDbGFzcz4oKTsKLSAgICAgICAgICAgIFVSTENsYXNzTG9hZGVyIHVjbCA9IChVUkxDbGFzc0xvYWRlciljbDsKLSAgICAgICAgICAgIFVSTFtdIHNyY1VSTCA9IHVjbC5nZXRVUkxzKCk7Ci0gICAgICAgICAgICBTdHJpbmcgcGF0aCA9IHBrZy5yZXBsYWNlKCcuJywgJy8nKTsKLSAgICAgICAgICAgIC8vUmVhZCByZXNvdXJjZXMgYXMgVVJMIGZyb20gY2xhc3MgbG9hZGVyLgotICAgICAgICAgICAgZm9yIChVUkwgdXJsIDogc3JjVVJMKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCJmaWxlIi5lcXVhbHModXJsLmdldFByb3RvY29sKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKHVybC50b1VSSSgpLmdldFBhdGgoKSk7IAotICAgICAgICAgICAgICAgICAgICAvL0lmIGZpbGUgaXMgbm90IG9mIHR5cGUgZGlyZWN0b3J5IHRoZW4gaXRzIGEgamFyIGZpbGUKLSAgICAgICAgICAgICAgICAgICAgaWYgKGYuZXhpc3RzKCkgJiYgIWYuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBKYXJGaWxlIGpmID0gbmV3IEphckZpbGUoZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRW51bWVyYXRpb248SmFyRW50cnk+IGVudHJpZXMgPSBqZi5lbnRyaWVzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9yZWFkIGFsbCBlbnRyaWVzIGluIGphciBmaWxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGVudHJpZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSmFyRW50cnkgamUgPSBlbnRyaWVzLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjbGF6ek5hbWUgPSBqZS5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGF6ek5hbWUgIT0gbnVsbCAmJiBjbGF6ek5hbWUuZW5kc1dpdGgoIi5jbGFzcyIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0FkZCB0byBjbGFzcyBsaXN0IGhlcmUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGF6ek5hbWUgPSBjbGF6ek5hbWUuc3Vic3RyaW5nKDAsIGNsYXp6TmFtZS5sZW5ndGgoKSAtIDYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhenpOYW1lID0gY2xhenpOYW1lLnJlcGxhY2UoJy8nLCAnLicpLnJlcGxhY2UoJ1xcJywgJy4nKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgnOicsICcuJyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1dlIGFyZSBvbmx5IGdvaW5nIHRvIGFkZCB0aGUgY2xhc3MgdGhhdCBiZWxvbmcgdG8gdGhlIHByb3ZpZGVkIHBhY2thZ2UuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xhenpOYW1lLnN0YXJ0c1dpdGgocGtnKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzIGNsYXp6ID0gZm9yTmFtZShjbGF6ek5hbWUsIGZhbHNlLCBjbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERvbid0IGFkZCBhbnkgaW50ZXJmYWNlcyBvciBKQVhXUyBzcGVjaWZpYyBjbGFzc2VzLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IGNsYXNzZXMgdGhhdCByZXByZXNlbnQgZGF0YSBhbmQgY2FuIGJlIG1hcnNoYWxsZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnkgSkFYQiBzaG91bGQgYmUgYWRkZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2xhenouaXNJbnRlcmZhY2UoKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXp6LmdldFBhY2thZ2UoKS5nZXROYW1lKCkuZXF1YWxzKHBrZykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBDbGFzc1V0aWxzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldERlZmF1bHRQdWJsaWNDb25zdHJ1Y3RvcihjbGF6eikgIT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICFDbGFzc1V0aWxzLmlzSkFYV1NDbGFzcyhjbGF6eikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQWRkaW5nIGNsYXNzOiAiICsgY2xhenpOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzZXMuYWRkKGNsYXp6KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vY2F0Y2ggVGhyb3dhYmxlIGFzIENsYXNzTG9hZGVyIGNhbiB0aHJvdyBhbiBOb0NsYXNzRGVmRm91bmRFcnJvciB0aGF0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZG9lcyBub3QgZXh0ZW5kIEV4Y2VwdGlvbiwgc28gbGV0cyBjYXRjaCBldmVyeXRoaW5nIHRoYXQgZXh0ZW5kcyBUaHJvd2FibGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9yYXRoZXIgdGhhbiBqdXN0IEV4Y2VwdGlvbi4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiVHJpZWQgdG8gbG9hZCBjbGFzcyAiICsgY2xhenpOYW1lICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiB3aGlsZSBjb25zdHJ1Y3RpbmcgYSBKQVhCQ29udGV4dC4gIFRoaXMgY2xhc3Mgd2lsbCBiZSBza2lwcGVkLiAgUHJvY2Vzc2luZyBDb250aW51ZXMuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIFRoZSByZWFzb24gdGhhdCBjbGFzcyBjb3VsZCBub3QgYmUgbG9hZGVkOiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cudHJhY2UoSmF2YVV0aWxzLnN0YWNrVG9TdHJpbmcoZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoIkNsYXNzVXRpbHNFcnI0IikpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGNsYXNzZXM7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgY2xhc3MgZm9yIHRoaXMgbmFtZQotICAgICAqCi0gICAgICogQHJldHVybiBDbGFzcwotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIENsYXNzIGZvck5hbWUoZmluYWwgU3RyaW5nIGNsYXNzTmFtZSwgZmluYWwgYm9vbGVhbiBpbml0aWFsaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ2xhc3NMb2FkZXIgY2xhc3Nsb2FkZXIpIHsKLSAgICAgICAgLy8gTk9URTogVGhpcyBtZXRob2QgbXVzdCByZW1haW4gcHJpdmF0ZSBiZWNhdXNlIGl0IHVzZXMgQWNjZXNzQ29udHJvbGxlcgotICAgICAgICBDbGFzcyBjbCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjbCA9IChDbGFzcylBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgKLSAgICAgICAgICAgICAgICAgICAgbmV3IFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUsIGluaXRpYWxpemUsIGNsYXNzbG9hZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgKTsKLSAgICAgICAgfSBjYXRjaCAoUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkV4Y2VwdGlvbiB0aHJvd24gZnJvbSBBY2Nlc3NDb250cm9sbGVyOiAiICsgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGUuZ2V0RXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGNsOwotICAgIH0KLQotICAgIC8qKiBAcmV0dXJuIENsYXNzTG9hZGVyICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3NMb2FkZXIgZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkgewotICAgICAgICAvLyBOT1RFOiBUaGlzIG1ldGhvZCBtdXN0IHJlbWFpbiBwcml2YXRlIGJlY2F1c2UgaXQgdXNlcyBBY2Nlc3NDb250cm9sbGVyCi0gICAgICAgIENsYXNzTG9hZGVyIGNsID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNsID0gKENsYXNzTG9hZGVyKUFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAotICAgICAgICAgICAgICAgICAgICBuZXcgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICApOwotICAgICAgICB9IGNhdGNoIChQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiRXhjZXB0aW9uIHRocm93biBmcm9tIEFjY2Vzc0NvbnRyb2xsZXI6ICIgKyBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZS5nZXRFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gY2w7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9kYXRhYmluZGluZy9pbXBsL0RhdGFTb3VyY2VCbG9ja0ZhY3RvcnlJbXBsLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2RhdGFiaW5kaW5nL2ltcGwvRGF0YVNvdXJjZUJsb2NrRmFjdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE5OTBmMC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2RhdGFiaW5kaW5nL2ltcGwvRGF0YVNvdXJjZUJsb2NrRmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5kYXRhYmluZGluZy5pbXBsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLkJsb2NrOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZmFjdG9yeS5Tb3VyY2VCbG9ja0ZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5mYWN0b3J5LkRhdGFTb3VyY2VCbG9ja0ZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5pbXBsLkJsb2NrRmFjdG9yeUltcGw7DQotDQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247DQotaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRGF0YVNvdXJjZTsNCi0NCi0vKioNCi0gKiBTb3VyY2VCbG9ja0ZhY3RvcnlJbXBsDQotICogPHAvPg0KLSAqIENyZWF0ZXMgYSBTb3VyY2VCbG9jaw0KLSAqLw0KLXB1YmxpYyBjbGFzcyBEYXRhU291cmNlQmxvY2tGYWN0b3J5SW1wbCBleHRlbmRzIEJsb2NrRmFjdG9yeUltcGwgaW1wbGVtZW50cyBEYXRhU291cmNlQmxvY2tGYWN0b3J5IHsNCi0NCi0gICAgLyoqIERlZmF1bHQgQ29uc3RydWN0b3IgcmVxdWlyZWQgZm9yIEZhY3RvcnkgKi8NCi0gICAgcHVibGljIERhdGFTb3VyY2VCbG9ja0ZhY3RvcnlJbXBsKCkgew0KLSAgICAgICAgc3VwZXIoKTsNCi0gICAgfQ0KLQ0KLSAgICAvKiAobm9uLUphdmFkb2MpDQotICAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5CbG9ja0ZhY3RvcnkjY3JlYXRlRnJvbShqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lKQ0KLSAgICAgICovDQotICAgIHB1YmxpYyBCbG9jayBjcmVhdGVGcm9tKE9iamVjdCBidXNpbmVzc09iamVjdCwgT2JqZWN0IGNvbnRleHQsIFFOYW1lIHFOYW1lKQ0KLSAgICAgICAgICAgIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsNCi0gICAgICAgIHJldHVybiBuZXcgRGF0YVNvdXJjZUJsb2NrSW1wbCgoRGF0YVNvdXJjZSlidXNpbmVzc09iamVjdCwgcU5hbWUsIHRoaXMpOw0KLSAgICB9DQotDQotDQotICAgIC8qIChub24tSmF2YWRvYykNCi0gICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLkJsb2NrRmFjdG9yeSNjcmVhdGVGcm9tKG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50LCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lKQ0KLSAgICAgICovDQotICAgIHB1YmxpYyBCbG9jayBjcmVhdGVGcm9tKE9NRWxlbWVudCBvbUVsZW1lbnQsIE9iamVjdCBjb250ZXh0LCBRTmFtZSBxTmFtZSkNCi0gICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsNCi0gICAgICAgIHJldHVybiBuZXcgRGF0YVNvdXJjZUJsb2NrSW1wbChvbUVsZW1lbnQsIHFOYW1lLCB0aGlzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VsZW1lbnQoKSB7DQotICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgIH0NCi0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9kYXRhYmluZGluZy9pbXBsL0RhdGFTb3VyY2VCbG9ja0ltcGwuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvZGF0YWJpbmRpbmcvaW1wbC9EYXRhU291cmNlQmxvY2tJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmNGJlODIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9kYXRhYmluZGluZy9pbXBsL0RhdGFTb3VyY2VCbG9ja0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZGF0YWJpbmRpbmcuaW1wbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5hdHRhY2htZW50cy5pbXBsLkJ1ZmZlclV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTmFtZXNwYWNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NT3V0cHV0Rm9ybWF0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NU291cmNlZEVsZW1lbnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5PTU5hbWVzcGFjZUltcGw7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5sbG9tLk9NU291cmNlZEVsZW1lbnRJbXBsOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLnV0aWwuU3RBWFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUDExQ29uc3RhbnRzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFzb3VyY2UuU291cmNlRGF0YVNvdXJjZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuRXhjZXB0aW9uRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5pMThuLk1lc3NhZ2VzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZGF0YWJpbmRpbmcuRGF0YVNvdXJjZUJsb2NrOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZmFjdG9yeS5CbG9ja0ZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5pbXBsLkJsb2NrSW1wbDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLnV0aWwuUmVhZGVyMldyaXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51dGlsaXR5LkNvbnZlcnRVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5hY3RpdmF0aW9uLkRhdGFTb3VyY2U7DQotaW1wb3J0IGphdmF4Lm1haWwudXRpbC5CeXRlQXJyYXlEYXRhU291cmNlOw0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOw0KLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTElucHV0RmFjdG9yeTsNCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247DQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOw0KLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247DQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07DQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb247DQotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbjsNCi0NCi0vKioNCi0gKiBTb3VyY2VCbG9jaw0KLSAqIDxwLz4NCi0gKiBCbG9jayBjb250YWluaW5nIGEgYnVzaW5lc3Mgb2JqZWN0IHRoYXQgaXMgYSBqYXZheC5hY3RpdmF0aW9uLkRhdGFTb3VyY2UNCi0gKiA8cC8+DQotICovDQotcHVibGljIGNsYXNzIERhdGFTb3VyY2VCbG9ja0ltcGwgZXh0ZW5kcyBCbG9ja0ltcGwgaW1wbGVtZW50cyBEYXRhU291cmNlQmxvY2sgew0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coRGF0YVNvdXJjZUJsb2NrSW1wbC5jbGFzcyk7DQotDQotICAgIC8qKg0KLSAgICAgKiBDb25zdHJ1Y3RvciBjYWxsZWQgZnJvbSBmYWN0b3J5DQotICAgICAqDQotICAgICAqIEBwYXJhbSBidXNPYmplY3QNCi0gICAgICogQHBhcmFtIHFOYW1lDQotICAgICAqIEBwYXJhbSBmYWN0b3J5DQotICAgICAqLw0KLSAgICBEYXRhU291cmNlQmxvY2tJbXBsKERhdGFTb3VyY2UgYnVzT2JqZWN0LCBRTmFtZSBxTmFtZSwgQmxvY2tGYWN0b3J5IGZhY3RvcnkpDQotICAgICAgICAgICAgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gew0KLSAgICAgICAgc3VwZXIoYnVzT2JqZWN0LCBudWxsLCBxTmFtZSwgZmFjdG9yeSk7DQotICAgICAgICAvLyBDaGVjayB2YWxpZGl0eSBvZiBEYXRhU291cmNlDQotICAgICAgICBpZiAoIShidXNPYmplY3QgaW5zdGFuY2VvZiBEYXRhU291cmNlKSkgew0KLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oDQotICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRNZXNzYWdlKCJTb3VyY2VOb3RTdXBwb3J0ZWQiLCBidXNPYmplY3QuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLQ0KLSAgICAvKioNCi0gICAgICogQ29uc3RydWN0b3IgY2FsbGVkIGZyb20gZmFjdG9yeQ0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gcmVhZGVyDQotICAgICAqIEBwYXJhbSBxTmFtZQ0KLSAgICAgKiBAcGFyYW0gZmFjdG9yeQ0KLSAgICAgKi8NCi0gICAgcHVibGljIERhdGFTb3VyY2VCbG9ja0ltcGwoT01FbGVtZW50IG9tRWxlbWVudCwgUU5hbWUgcU5hbWUsIEJsb2NrRmFjdG9yeSBmYWN0b3J5KSB7DQotICAgICAgICBzdXBlcihvbUVsZW1lbnQsIG51bGwsIHFOYW1lLCBmYWN0b3J5KTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IF9nZXRCT0Zyb21SZWFkZXIoWE1MU3RyZWFtUmVhZGVyIHJlYWRlciwgT2JqZWN0IGJ1c0NvbnRleHQpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sIFdlYlNlcnZpY2VFeGNlcHRpb24gew0KLSAgICAgICAgUmVhZGVyMldyaXRlciByMncgPSBuZXcgUmVhZGVyMldyaXRlcihyZWFkZXIpOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICByZXR1cm4gbmV3IEJ5dGVBcnJheURhdGFTb3VyY2UocjJ3LmdldEFzU3RyaW5nKCksICJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iKTsNCi0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgWE1MU3RyZWFtRXhjZXB0aW9uKGUpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBPTUVsZW1lbnQgZ2V0T01FbGVtZW50KCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgV2ViU2VydmljZUV4Y2VwdGlvbiB7DQotICAgICAgICBPTU5hbWVzcGFjZSBucyA9IG5ldyBPTU5hbWVzcGFjZUltcGwoIiIsICIiKTsNCi0gICAgICAgIE9NRmFjdG9yeSBmYWN0b3J5ID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCk7DQotICAgICAgICByZXR1cm4gbmV3IE9NU291cmNlZEVsZW1lbnRJbXBsKCJkdW1teSIsIG5zLCBmYWN0b3J5LCB0aGlzKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIE9iamVjdCBfZ2V0Qk9Gcm9tT00oT01FbGVtZW50IG9tRWxlbWVudCwgT2JqZWN0IGJ1c0NvbnRleHQpDQotICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uLCBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsNCi0gICAgICAgIE9iamVjdCBidXNPYmplY3Q7DQotICAgICAgICANCi0gICAgICAgIC8vIFNob3J0Y3V0IHRvIGdldCBidXNpbmVzcyBvYmplY3QgZnJvbSBleGlzdGluZyBkYXRhIHNvdXJjZQ0KLSAgICAgICAgaWYgKG9tRWxlbWVudCBpbnN0YW5jZW9mIE9NU291cmNlZEVsZW1lbnQpIHsNCi0gICAgICAgICAgICBPTURhdGFTb3VyY2UgZHMgPSAoKE9NU291cmNlZEVsZW1lbnQpIG9tRWxlbWVudCkuZ2V0RGF0YVNvdXJjZSgpOw0KLSAgICAgICAgICAgIGlmIChkcyBpbnN0YW5jZW9mIFNvdXJjZURhdGFTb3VyY2UpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuICgoU291cmNlRGF0YVNvdXJjZSkgZHMpLmdldE9iamVjdCgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgLy8gSWYgdGhlIG1lc3NhZ2UgaXMgYSBmYXVsdCwgdGhlcmUgYXJlIHNvbWUgc3BlY2lhbCBneW1uYXN0aWNzIHRoYXQgd2UgaGF2ZSB0byBkbw0KLSAgICAgICAgLy8gdG8gZ2V0IHRoaXMgd29ya2luZyBmb3IgYWxsIG9mIHRoZSBoYW5kbGVyIHNjZW5hcmlvcy4gIA0KLSAgICAgICAgYm9vbGVhbiBoYXNGYXVsdCA9IGZhbHNlOw0KLSAgICAgICAgaWYgKChwYXJlbnQgIT0gbnVsbCAmJiBwYXJlbnQuaXNGYXVsdCgpKSB8fCANCi0gICAgICAgICAgICBvbUVsZW1lbnQuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKS5lcXVhbHMoU09BUDExQ29uc3RhbnRzLlNPQVBGQVVMVF9MT0NBTF9OQU1FKSkgew0KLSAgICAgICAgICAgIGhhc0ZhdWx0ID0gdHJ1ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgLy8gVHJhbnNmb3JtIHJlYWRlciBpbnRvIGJ1c2luZXNzIG9iamVjdA0KLSAgICAgICAgaWYgKCFoYXNGYXVsdCkgew0KLSAgICAgICAgICAgIGJ1c09iamVjdCA9ICgoT01Tb3VyY2VkRWxlbWVudClvbUVsZW1lbnQpLmdldERhdGFTb3VyY2UoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2Ugew0KLSAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOw0KLSAgICAgICAgICAgIG9tRWxlbWVudC5zZXJpYWxpemUoYmFvcyk7DQotICAgICAgICAgICAgYnVzT2JqZWN0ID0gbmV3IEJ5dGVBcnJheURhdGFTb3VyY2UoYmFvcy50b0J5dGVBcnJheSgpLCAiVVRGLTgiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBidXNPYmplY3Q7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBYTUxTdHJlYW1SZWFkZXIgX2dldFJlYWRlckZyb21CTyhPYmplY3QgYnVzT2JqLCBPYmplY3QgYnVzQ29udGV4dCkNCi0gICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uLCBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgaWYgKGJ1c09iaiBpbnN0YW5jZW9mIERhdGFTb3VyY2UpIHsNCi0gICAgICAgICAgICAgICAgWE1MSW5wdXRGYWN0b3J5IGYgPSBTdEFYVXRpbHMuZ2V0WE1MSW5wdXRGYWN0b3J5KCk7DQotDQotICAgICAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciByZWFkZXIgPSBmLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcigoKERhdGFTb3VyY2UpYnVzT2JqKS5nZXRJbnB1dFN0cmVhbSgpKTsNCi0gICAgICAgICAgICAgICAgU3RBWFV0aWxzLnJlbGVhc2VYTUxJbnB1dEZhY3RvcnkoZik7DQotICAgICAgICAgICAgICAgIHJldHVybiByZWFkZXI7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oDQotICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRNZXNzYWdlKCJTb3VyY2VOb3RTdXBwb3J0ZWQiLCBidXNPYmplY3QuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpKTsNCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IChidXNPYmogPT0gbnVsbCkgPyAibm9uZSIgOiBidXNPYmouZ2V0Q2xhc3MoKS5nZXROYW1lKCk7DQotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeQ0KLSAgICAgICAgICAgICAgICAgICAgLm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoIlNvdXJjZVJlYWRFcnIiLCBjbGFzc05hbWUpLCBlKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIHZvaWQgc2VyaWFsaXplKE91dHB1dFN0cmVhbSBvdXRwdXQsIE9NT3V0cHV0Rm9ybWF0IGZvcm1hdCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIEJ1ZmZlclV0aWxzLmlucHV0U3RyZWFtMk91dHB1dFN0cmVhbSgoKERhdGFTb3VyY2UpYnVzT2JqZWN0KS5nZXRJbnB1dFN0cmVhbSgpLCBvdXRwdXQpOw0KLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBYTUxTdHJlYW1FeGNlcHRpb24oZSk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBfb3V0cHV0RnJvbUJPKE9iamVjdCBidXNPYmplY3QsIE9iamVjdCBidXNDb250ZXh0LCBYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyKQ0KLSAgICAgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sIFdlYlNlcnZpY2VFeGNlcHRpb24gew0KLSAgICAgICAgLy8gVGhlcmUgaXMgbm8gZmFzdCB3YXkgdG8gb3V0cHV0IHRoZSBTb3VyY2UgdG8gYSB3cml0ZXIsIHNvIGdldCB0aGUgcmVhZGVyDQotICAgICAgICAvLyBhbmQgcGFzcyB1c2UgdGhlIGRlZmF1bHQgcmVhZGVyLT53cml0ZXIuDQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcoIlN0YXJ0IF9vdXRwdXRGcm9tQk8iKTsNCi0gICAgICAgIH0NCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlciByZWFkZXIgPSBfZ2V0UmVhZGVyRnJvbUJPKGJ1c09iamVjdCwgYnVzQ29udGV4dCk7DQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcoIk9idGFpbmVkIHJlYWRlcj0iICsgcmVhZGVyKTsNCi0gICAgICAgIH0NCi0gICAgICAgIF9vdXRwdXRGcm9tUmVhZGVyKHJlYWRlciwgd3JpdGVyKTsNCi0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiRW5kIF9vdXRwdXRSZWFkZXJGcm9tQk8iKTsNCi0gICAgICAgIH0NCi0gICAgICAgIC8vIFJFVklFVyBTaG91bGQgd2UgY2FsbCBjbG9zZSgpIG9uIHRoZSBTb3VyY2UgPw0KLSAgICB9DQotDQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IF9nZXRCT0Zyb21CTyhPYmplY3QgYnVzT2JqZWN0LCBPYmplY3QgYnVzQ29udGV4dCwgYm9vbGVhbiBjb25zdW1lKSB7DQotICAgICAgICBpZiAoY29uc3VtZSkgew0KLSAgICAgICAgICAgIHJldHVybiBidXNPYmplY3Q7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIC8vIFRPRE8gTWlzc2luZyBJbXBsDQotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbigNCi0gICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoIlNvdXJjZU1pc3NpbmdTdXBwb3J0IiwgYnVzT2JqZWN0LmdldENsYXNzKCkuZ2V0TmFtZSgpKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbGVtZW50RGF0YSgpIHsNCi0gICAgICAgIHJldHVybiBmYWxzZTsgIC8vIFRoZSBzb3VyY2UgY291bGQgYmUgYSB0ZXh0IG9yIGVsZW1lbnQgZXRjLg0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBSZXR1cm4gdGhlIGNsYXNzIGZvciB0aGlzIG5hbWUNCi0gICAgICogQHJldHVybiBDbGFzcw0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3MgZm9yTmFtZShmaW5hbCBTdHJpbmcgY2xhc3NOYW1lKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7DQotICAgICAgICAvLyBOT1RFOiBUaGlzIG1ldGhvZCBtdXN0IHJlbWFpbiBwcml2YXRlIGJlY2F1c2UgaXQgdXNlcyBBY2Nlc3NDb250cm9sbGVyDQotICAgICAgICBDbGFzcyBjbCA9IG51bGw7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIGNsID0gKENsYXNzKUFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKA0KLSAgICAgICAgICAgICAgICAgICAgbmV3IFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24oKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICk7DQotICAgICAgICB9IGNhdGNoIChQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJFeGNlcHRpb24gdGhyb3duIGZyb20gQWNjZXNzQ29udHJvbGxlcjogIiArIGUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB0aHJvdyAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbillLmdldEV4Y2VwdGlvbigpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGNsOw0KLSAgICB9DQotICAgIA0KLSAgICANCi0gICAgcHVibGljIHZvaWQgY2xvc2UoKSB7DQotICAgICAgICByZXR1cm47IC8vIE5vdGhpbmcgdG8gY2xvc2UNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0WE1MSW5wdXRTdHJlYW0oU3RyaW5nIGVuY29kaW5nKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIGJ5dGVbXSBieXRlcyA9IChieXRlW10pIA0KLSAgICAgICAgICAgICAgICBDb252ZXJ0VXRpbHMuY29udmVydChnZXRCdXNpbmVzc09iamVjdChmYWxzZSksIGJ5dGVbXS5jbGFzcyk7DQotICAgICAgICAgICAgcmV0dXJuIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlcyk7DQotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIE9iamVjdCBnZXRPYmplY3QoKSB7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIHJldHVybiBnZXRCdXNpbmVzc09iamVjdChmYWxzZSk7DQotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaXNEZXN0cnVjdGl2ZVJlYWQoKSB7DQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0Rlc3RydWN0aXZlV3JpdGUoKSB7DQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLQ0KLSAgICBwdWJsaWMgYnl0ZVtdIGdldFhNTEJ5dGVzKFN0cmluZyBlbmNvZGluZykgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gew0KLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKCJTdGFydCBnZXRYTUxCeXRlcyIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgYnl0ZVtdIGJ5dGVzID0gbnVsbDsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgYnl0ZXMgPSAoYnl0ZVtdKSANCi0gICAgICAgICAgICAgICAgQ29udmVydFV0aWxzLmNvbnZlcnQoZ2V0QnVzaW5lc3NPYmplY3QoZmFsc2UpLCBieXRlW10uY2xhc3MpOw0KLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKCJFbmQgZ2V0WE1MQnl0ZXMiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBieXRlczsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2RhdGFiaW5kaW5nL2ltcGwvSkFYQkJsb2NrRmFjdG9yeUltcGwuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvZGF0YWJpbmRpbmcvaW1wbC9KQVhCQmxvY2tGYWN0b3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjQyMjExLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvZGF0YWJpbmRpbmcvaW1wbC9KQVhCQmxvY2tGYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmRhdGFiaW5kaW5nLmltcGw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NU291cmNlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhc291cmNlLmpheGIuSkFYQkRTQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFzb3VyY2UuamF4Yi5KQVhCRGF0YVNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLkV4Y2VwdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5pMThuLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5CbG9jazsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZGF0YWJpbmRpbmcuSkFYQkJsb2NrQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZmFjdG9yeS5KQVhCQmxvY2tGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5pbXBsLkJsb2NrRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51dGlsaXR5LlhNTFJvb3RFbGVtZW50VXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKLQotLyoqIEpBWEJCbG9ja0ZhY3RvcnlJbXBsIENyZWF0ZXMgYSBKQVhCQmxvY2sgKi8KLXB1YmxpYyBjbGFzcyBKQVhCQmxvY2tGYWN0b3J5SW1wbCBleHRlbmRzIEJsb2NrRmFjdG9yeUltcGwgaW1wbGVtZW50cyBKQVhCQmxvY2tGYWN0b3J5IHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coSkFYQkJsb2NrRmFjdG9yeUltcGwuY2xhc3MpOwotCi0gICAgLyoqIERlZmF1bHQgQ29uc3RydWN0b3IgcmVxdWlyZWQgZm9yIEZhY3RvcnkgKi8KLSAgICBwdWJsaWMgSkFYQkJsb2NrRmFjdG9yeUltcGwoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5CbG9ja0ZhY3RvcnkjY3JlYXRlRnJvbShvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCwgamF2YS5sYW5nLk9iamVjdCwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSkKLSAgICAgICovCi0gICAgcHVibGljIEJsb2NrIGNyZWF0ZUZyb20oT01FbGVtZW50IG9tRWxlbWVudCwgT2JqZWN0IGNvbnRleHQsIFFOYW1lIHFOYW1lKQotICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFRoZSBjb250ZXh0IGZvciBhIEpBWEJGYWN0b3J5IG11c3QgYmUgbm9uLW51bGwgYW5kIHNob3VsZCBiZSBhIEpBWEJCbG9ja0NvbnRleHQuCi0gICAgICAgIGlmIChjb250ZXh0ID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIEpBWFdTIHNwZWMgNC4zLjQgY29uZm9ybWFuY2UgcmVxdWlyZXMgYSBXZWJTZXJ2aWNlRXhjZXB0aW9uIHdob3NlIGNhdXNlIGlzIEpBWEJFeGNlcHRpb24KLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIG5ldyBKQVhCRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoIkpBWEJCbG9ja0ZhY3RvcnlFcnIxIiwgIm51bGwiKSkpOwotICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHQgaW5zdGFuY2VvZiBKQVhCQmxvY2tDb250ZXh0KSB7Ci0gICAgICAgICAgICA7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBKQVhXUyBzcGVjIDQuMy40IGNvbmZvcm1hbmNlIHJlcXVpcmVzIGEgV2ViU2VydmljZUV4Y2VwdGlvbiB3aG9zZSBjYXVzZSBpcyBKQVhCRXhjZXB0aW9uCi0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKG5ldyBKQVhCRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRNZXNzYWdlKCJKQVhCQmxvY2tGYWN0b3J5RXJyMSIsIGNvbnRleHQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHFOYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIHFOYW1lID0gb21FbGVtZW50LmdldFFOYW1lKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmIChvbUVsZW1lbnQgaW5zdGFuY2VvZiBPTVNvdXJjZWRFbGVtZW50KSB7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmICggKChPTVNvdXJjZWRFbGVtZW50KSBvbUVsZW1lbnQpLmdldERhdGFTb3VyY2UoKSBpbnN0YW5jZW9mIEpBWEJEYXRhU291cmNlKSB7Ci0gICAgICAgICAgICAgICAgSkFYQkRhdGFTb3VyY2UgZHMgPSAoSkFYQkRhdGFTb3VyY2UpICgoT01Tb3VyY2VkRWxlbWVudClvbUVsZW1lbnQpLmdldERhdGFTb3VyY2UoKTsKLSAgICAgICAgICAgICAgICBKQVhCRFNDb250ZXh0IGRzQ29udGV4dCA9IGRzLmdldENvbnRleHQoKTsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBpZiAoZHNDb250ZXh0LmdldEpBWEJDb250ZXh0KCkgPT0gKChKQVhCQmxvY2tDb250ZXh0KWNvbnRleHQpLmdldEpBWEJDb250ZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNob3J0Y3V0LCB1c2UgZXhpc3RpbmcgSkFYQiBvYmplY3QKLSAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBqYXhiID0gZHMuZ2V0T2JqZWN0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEpBWEJCbG9ja0ltcGwoamF4YiwgKEpBWEJCbG9ja0NvbnRleHQpY29udGV4dCwgcU5hbWUsIHRoaXMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSkFYQkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJGYWxsaW5nIGJhY2sgdG8gdXNpbmcgbm9ybWFsIHVubWFyc2hhbGxpbmcgYXBwcm9hY2guICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCAoKE9NU291cmNlZEVsZW1lbnQpIG9tRWxlbWVudCkuZ2V0RGF0YVNvdXJjZSgpIGluc3RhbmNlb2YgSkFYQkJsb2NrSW1wbCkgewotICAgICAgICAgICAgICAgIEpBWEJCbG9ja0ltcGwgYmxvY2sgPSAoSkFYQkJsb2NrSW1wbCkgKChPTVNvdXJjZWRFbGVtZW50KW9tRWxlbWVudCkuZ2V0RGF0YVNvdXJjZSgpOwotICAgICAgICAgICAgICAgIEpBWEJCbG9ja0NvbnRleHQgYmxvY2tDb250ZXh0ID0gKEpBWEJCbG9ja0NvbnRleHQpIGJsb2NrLmdldEJ1c2luZXNzQ29udGV4dCgpOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChibG9ja0NvbnRleHQuZ2V0SkFYQkNvbnRleHQoKSA9PSAoKEpBWEJCbG9ja0NvbnRleHQpY29udGV4dCkuZ2V0SkFYQkNvbnRleHQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2hvcnRjdXQsIHVzZSBleGlzdGluZyBKQVhCIG9iamVjdAotICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGpheGIgPSBibG9jay5nZXRPYmplY3QoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSkFYQkJsb2NrSW1wbChqYXhiLCAoSkFYQkJsb2NrQ29udGV4dCljb250ZXh0LCBxTmFtZSwgdGhpcyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGNhdGNoIChKQVhCRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkZhbGxpbmcgYmFjayB0byB1c2luZyBub3JtYWwgdW5tYXJzaGFsbGluZyBhcHByb2FjaC4gIiArIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIG5ldyBKQVhCQmxvY2tJbXBsKG9tRWxlbWVudCwgKEpBWEJCbG9ja0NvbnRleHQpY29udGV4dCwgcU5hbWUsIHRoaXMpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuQmxvY2tGYWN0b3J5I2NyZWF0ZUZyb20oamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSkKLSAgICAgICovCi0gICAgcHVibGljIEJsb2NrIGNyZWF0ZUZyb20oT2JqZWN0IGJ1c2luZXNzT2JqZWN0LCBPYmplY3QgY29udGV4dCwgUU5hbWUgcU5hbWUpCi0gICAgICAgICAgICB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgLy8gVGhlIGNvbnRleHQgbXVzdCBiZSBub24tbnVsbCBhbmQgc2hvdWxkIGJlIGEgSkFYQkJsb2NrQ29udGV4dC4KLSAgICAgICAgLy8gRm9yIGxlZ2FjeSByZWFzb25zLCBhIEpBWEJDb250ZXh0IGlzIGFsc28gc3VwcG9ydGVkIChhbmQgd3JhcHBlZCBpbnRvIGEgSkFYQkJsb2NrQ29udGV4dCkKLSAgICAgICAgaWYgKGNvbnRleHQgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gSkFYV1Mgc3BlYyA0LjMuNCBjb25mb3JtYW5jZSByZXF1aXJlcyBhIFdlYlNlcnZpY2VFeGNlcHRpb24gd2hvc2UgY2F1c2UgaXMgSkFYQkV4Y2VwdGlvbgotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgbmV3IEpBWEJFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiSkFYQkJsb2NrRmFjdG9yeUVycjEiLCAibnVsbCIpKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoY29udGV4dCBpbnN0YW5jZW9mIEpBWEJCbG9ja0NvbnRleHQpIHsKLSAgICAgICAgICAgIDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIEpBWFdTIHNwZWMgNC4zLjQgY29uZm9ybWFuY2UgcmVxdWlyZXMgYSBXZWJTZXJ2aWNlRXhjZXB0aW9uIHdob3NlIGNhdXNlIGlzIEpBWEJFeGNlcHRpb24KLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24obmV3IEpBWEJFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoIkpBWEJCbG9ja0ZhY3RvcnlFcnIxIiwgY29udGV4dC5nZXRDbGFzcygpLmdldE5hbWUoKSkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFRoZSBidXNpbmVzcyBvYmplY3QgbXVzdCBiZSBlaXRoZXIgYSBKQVhCRWxlbWVudCBvciBhIGJsb2NrIHdpdGggYW4gQFhtbFJvb3RFbGVtZW50IHFuYW1lLiAgCi0gICAgICAgIC8vIChDaGVja2luZyB0aGlzIGlzIGV4cGVuc2l2ZSwgc28gaXQgaXMgYXNzdW1lZCkKLSAgICAgICAgLy8gVGhlIGlucHV0IFFOYW1lIG11c3QgYmUgc2V0IG90aGVyd2lzZSB3ZSBoYXZlIHRvIGxvb2sgaXQgdXAsIHdoaWNoIGtpbGxzIHBlcmZvcm1hbmNlLgotICAgICAgICBpZiAocU5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgcU5hbWUgPSBYTUxSb290RWxlbWVudFV0aWwuZ2V0WG1sUm9vdEVsZW1lbnRRTmFtZUZyb21PYmplY3QoYnVzaW5lc3NPYmplY3QpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgSkFYQkJsb2NrSW1wbChidXNpbmVzc09iamVjdCwgKEpBWEJCbG9ja0NvbnRleHQpY29udGV4dCwgcU5hbWUsIHRoaXMpOwotICAgICAgICB9IGNhdGNoIChKQVhCRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VsZW1lbnQoKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9kYXRhYmluZGluZy9pbXBsL0pBWEJCbG9ja0ltcGwuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvZGF0YWJpbmRpbmcvaW1wbC9KQVhCQmxvY2tJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjNjI2YTcuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9kYXRhYmluZGluZy9pbXBsL0pBWEJCbG9ja0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5kYXRhYmluZGluZy5pbXBsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTURhdGFTb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTURhdGFTb3VyY2VFeHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NU291cmNlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTVhNTFN0cmVhbVJlYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLnV0aWwuU3RBWFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YXNvdXJjZS5qYXhiLkpBWEJEU0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhc291cmNlLmpheGIuSkFYQkRhdGFTb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5FeGNlcHRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5NZXNzYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5kYXRhYmluZGluZy5KQVhCQmxvY2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmRhdGFiaW5kaW5nLkpBWEJCbG9ja0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmZhY3RvcnkuQmxvY2tGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5pbXBsLkJsb2NrSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UudXRpbC5YTUxTdHJlYW1Xcml0ZXJXaXRoT1M7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLQotLyoqCi0gKiBKQVhCQmxvY2tJbXBsIDxwLz4gQSBCbG9jayBjb250YWluaW5nIGEgSkFYQiBidXNpbmVzcyBvYmplY3QgKGVpdGhlciBhIEpBWEJFbGVtZW50IG9yIGFuIG9iamVjdAotICogd2l0aCBAWG1sUm9vdEVsZW1lbnQpLgotICovCi1wdWJsaWMgY2xhc3MgSkFYQkJsb2NrSW1wbCBleHRlbmRzIEJsb2NrSW1wbCBpbXBsZW1lbnRzIEpBWEJCbG9jayB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coSkFYQkJsb2NrSW1wbC5jbGFzcyk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHX0VOQUJMRUQgPSBsb2cuaXNEZWJ1Z0VuYWJsZWQoKTsKLQotICAgIC8qKgotICAgICAqIENhbGxlZCBieSBKQVhCQmxvY2tGYWN0b3J5Ci0gICAgICogCi0gICAgICogQHBhcmFtIGJ1c09iamVjdC4uVGhlIGJ1c2luZXNzIG9iamVjdCBtdXN0IGJlIGEgSkFYQkVsZW1lbnQgb3IgYW4gb2JqZWN0IHdpdGggYW4KLSAgICAgKiBAWE1MUm9vdEVsZW1lbnQuIFRoaXMgaXMgYXNzZXJ0aW9uIGlzIHZhbGlkYXRlZCBpbiB0aGUgSkFYQkZhY3RvcnkuCi0gICAgICogQHBhcmFtIGJ1c0NvbnRleHQKLSAgICAgKiBAcGFyYW0gcU5hbWUgUU5hbWUgbXVzdCBiZSBub24tbnVsbAotICAgICAqIEBwYXJhbSBmYWN0b3J5Ci0gICAgICovCi0gICAgSkFYQkJsb2NrSW1wbChPYmplY3QgYnVzT2JqZWN0LCBKQVhCQmxvY2tDb250ZXh0IGJ1c0NvbnRleHQsIFFOYW1lIHFOYW1lLCAKLSAgICAgICAgICAgICAgICAgIEJsb2NrRmFjdG9yeSBmYWN0b3J5KQotICAgICAgICAgICAgdGhyb3dzIEpBWEJFeGNlcHRpb24gewotICAgICAgICBzdXBlcihidXNPYmplY3QsIGJ1c0NvbnRleHQsIHFOYW1lLCBmYWN0b3J5KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgYnkgSkFYQkJsb2NrRmFjdG9yeQotICAgICAqIAotICAgICAqIEBwYXJhbSBvbWVsZW1lbnQKLSAgICAgKiBAcGFyYW0gYnVzQ29udGV4dAotICAgICAqIEBwYXJhbSBxTmFtZSBtdXN0IGJlIG5vbi1udWxsCi0gICAgICogQHBhcmFtIGZhY3RvcnkKLSAgICAgKi8KLSAgICBKQVhCQmxvY2tJbXBsKE9NRWxlbWVudCBvbUVsZW1lbnQsIEpBWEJCbG9ja0NvbnRleHQgYnVzQ29udGV4dCwgUU5hbWUgcU5hbWUsCi0gICAgICAgICAgICBCbG9ja0ZhY3RvcnkgZmFjdG9yeSkgewotICAgICAgICBzdXBlcihvbUVsZW1lbnQsIGJ1c0NvbnRleHQsIHFOYW1lLCBmYWN0b3J5KTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IF9nZXRCT0Zyb21SZWFkZXIoWE1MU3RyZWFtUmVhZGVyIHJlYWRlciwgT2JqZWN0IGJ1c0NvbnRleHQpCi0gICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICAvLyBHZXQgdGhlIEpBWEJCbG9ja0NvbnRleHQuIEFsbCBvZiB0aGUgbmVjZXNzcnkgaW5mb3JtYXRpb24gaXMgcmVjb3JkZWQgb24gaXQKLSAgICAgICAgSkFYQkJsb2NrQ29udGV4dCBjdHggPSAoSkFYQkJsb2NrQ29udGV4dCkgYnVzQ29udGV4dDsKLSAgICAgICAgCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBidXNPYmplY3QgPSBjdHgudW5tYXJzaGFsKHJlYWRlcik7Ci0gICAgICAgIH0gY2F0Y2ggKEpBWEJFeGNlcHRpb24gamUpIHsKLSAgICAgICAgICAgIGlmIChERUJVR19FTkFCTEVEKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJKQVhCQ29udGV4dCBmb3IgdW5tYXJzaGFsIGZhaWx1cmU6IiArIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LmdldEpBWEJDb250ZXh0KGN0eC5nZXRDbGFzc0xvYWRlcigpKSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGplKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYnVzT2JqZWN0OwotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgT2JqZWN0IF9nZXRCT0Zyb21PTShPTUVsZW1lbnQgb21FbGVtZW50LCBPYmplY3QgYnVzQ29udGV4dCkKLSAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIAotICAgICAgICAvLyBTaG9ydGN1dCB0byBnZXQgYnVzaW5lc3Mgb2JqZWN0IGZyb20gZXhpc3RpbmcgZGF0YSBzb3VyY2UKLSAgICAgICAgaWYgKG9tRWxlbWVudCBpbnN0YW5jZW9mIE9NU291cmNlZEVsZW1lbnQpIHsKLSAgICAgICAgICAgIE9NRGF0YVNvdXJjZSBkcyA9ICgoT01Tb3VyY2VkRWxlbWVudCkgb21FbGVtZW50KS5nZXREYXRhU291cmNlKCk7Ci0gICAgICAgICAgICBpZiAoZHMgaW5zdGFuY2VvZiBKQVhCRGF0YVNvdXJjZSkgewotICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgYnVzaW5lc3MgY29udGV4dCB0byB1c2UgdGhlIG9uZSBwcm92aWRlZAotICAgICAgICAgICAgICAgIC8vIGJ5IHRoZSBkYXRhc291cmNlCi0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgSkFYQkRTQ29udGV4dCBkc0NvbnRleHQgPSAoKEpBWEJEYXRhU291cmNlKSBkcykuZ2V0Q29udGV4dCgpOwotICAgICAgICAgICAgICAgICAgICBidXNDb250ZXh0ID0gbmV3IEpBWEJCbG9ja0NvbnRleHQoZHNDb250ZXh0LmdldEpBWEJDb250ZXh0KCkpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEpBWEJFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gKChKQVhCRGF0YVNvdXJjZSkgZHMpLmdldE9iamVjdCgpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChkcyBpbnN0YW5jZW9mIEpBWEJCbG9ja0ltcGwpIHsKLSAgICAgICAgICAgICAgICAvLyBVcGRhdGUgdGhlIGJ1c2luZXNzIGNvbnRleHQgdG8gdXNlIHRoZSBvbmUgcHJvdmlkZWQgYnkgdGhlCi0gICAgICAgICAgICAgICAgLy8gYnkgdGhlIGRhdGFzb3VyY2UKLSAgICAgICAgICAgICAgICBKQVhCQmxvY2tDb250ZXh0IGJsb2NrQ29udGV4dCA9IChKQVhCQmxvY2tDb250ZXh0KSAoKEpBWEJCbG9ja0ltcGwpIGRzKS5nZXRCdXNpbmVzc0NvbnRleHQoKTsKLSAgICAgICAgICAgICAgICBidXNDb250ZXh0ID0gYmxvY2tDb250ZXh0OwotCi0gICAgICAgICAgICAgICAgcmV0dXJuICgoSkFYQkJsb2NrSW1wbCkgZHMpLmdldE9iamVjdCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdXBlci5fZ2V0Qk9Gcm9tT00ob21FbGVtZW50LCBidXNDb250ZXh0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gYnVzT2JqCi0gICAgICogQHBhcmFtIGJ1c0NvbnRleHQKLSAgICAgKiBAcmV0dXJuCi0gICAgICogQHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIGJ5dGVbXSBfZ2V0Qnl0ZXNGcm9tQk8oT2JqZWN0IGJ1c09iaiwgT2JqZWN0IGJ1c0NvbnRleHQsIFN0cmluZyBlbmNvZGluZykKLSAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCi0gICAgICAgIC8vIEV4cG9zZXMgZ2V0T3V0cHV0U3RyZWFtLCB3aGljaCBhbGxvd3MgZmFzdGVyIHdyaXRlcy4KLSAgICAgICAgWE1MU3RyZWFtV3JpdGVyV2l0aE9TIHdyaXRlciA9IG5ldyBYTUxTdHJlYW1Xcml0ZXJXaXRoT1MoYmFvcywgZW5jb2RpbmcpOwotCi0gICAgICAgIC8vIFdyaXRlIHRoZSBidXNpbmVzcyBvYmplY3QgdG8gdGhlIHdyaXRlcgotICAgICAgICBfb3V0cHV0RnJvbUJPKGJ1c09iaiwgYnVzQ29udGV4dCwgd3JpdGVyKTsKLQotICAgICAgICAvLyBGbHVzaCB0aGUgd3JpdGVyCi0gICAgICAgIHdyaXRlci5mbHVzaCgpOwotICAgICAgICB3cml0ZXIuY2xvc2UoKTsKLSAgICAgICAgcmV0dXJuIGJhb3MudG9CeXRlQXJyYXkoKTsKLSAgICB9Ci0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBYTUxTdHJlYW1SZWFkZXIgX2dldFJlYWRlckZyb21CTyhPYmplY3QgYnVzT2JqLCBPYmplY3QgYnVzQ29udGV4dCkKLSAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGJhb3MgPQotICAgICAgICAgICAgICAgIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShfZ2V0Qnl0ZXNGcm9tQk8oYnVzT2JqLCBidXNDb250ZXh0LCAidXRmLTgiKSk7Ci0gICAgICAgIHJldHVybiBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKGJhb3MsICJ1dGYtOCIpOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgWE1MU3RyZWFtUmVhZGVyIF9nZXRSZWFkZXJGcm9tT00oT01FbGVtZW50IG9tRWxlbWVudCkgewotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyOwotICAgICAgICBpZiAob21FbGVtZW50LmdldEJ1aWxkZXIoKSAhPSBudWxsICYmICFvbUVsZW1lbnQuZ2V0QnVpbGRlcigpLmlzQ29tcGxldGVkKCkpIHsKLSAgICAgICAgICAgIHJlYWRlciA9IG9tRWxlbWVudC5nZXRYTUxTdHJlYW1SZWFkZXJXaXRob3V0Q2FjaGluZygpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmVhZGVyID0gb21FbGVtZW50LmdldFhNTFN0cmVhbVJlYWRlcigpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChyZWFkZXIgaW5zdGFuY2VvZiBPTVhNTFN0cmVhbVJlYWRlcikgewotICAgICAgICAgICAgKChPTVhNTFN0cmVhbVJlYWRlcilyZWFkZXIpLnNldElubGluZU1UT00oZmFsc2UpOyAgLy8gT3B0aW1pemUgYXR0YWNobWVudCB1c2FnZQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZWFkZXI7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgX291dHB1dEZyb21CTyhPYmplY3QgYnVzT2JqZWN0LCBPYmplY3QgYnVzQ29udGV4dCwgWE1MU3RyZWFtV3JpdGVyIHdyaXRlcikKLSAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIEpBWEJCbG9ja0NvbnRleHQgY3R4ID0gKEpBWEJCbG9ja0NvbnRleHQpIGJ1c0NvbnRleHQ7Ci0gICAgICAgIAotICAgICAgICB0cnkgewotICAgICAgICAgICAgY3R4Lm1hcnNoYWwoYnVzT2JqZWN0LCB3cml0ZXIpOwotICAgICAgICB9IGNhdGNoIChKQVhCRXhjZXB0aW9uIGplKSB7Ci0gICAgICAgICAgICBpZiAoREVCVUdfRU5BQkxFRCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiSkFYQkNvbnRleHQgZm9yIG1hcnNoYWwgZmFpbHVyZToiICsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHguZ2V0SkFYQkNvbnRleHQoY3R4LmdldENsYXNzTG9hZGVyKCkpKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oamUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbGVtZW50RGF0YSgpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgewotICAgICAgICByZXR1cm47IC8vIE5vdGhpbmcgdG8gY2xvc2UKLSAgICB9Ci0KLSAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0WE1MSW5wdXRTdHJlYW0oU3RyaW5nIGVuY29kaW5nKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBieXRlW10gYnl0ZXM9IF9nZXRCeXRlc0Zyb21CTygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEJ1c2luZXNzT2JqZWN0KGZhbHNlKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXNDb250ZXh0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nKTsKLSAgICAgICAgICAgIHJldHVybiBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZXMpOwotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0KCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIGdldEJ1c2luZXNzT2JqZWN0KGZhbHNlKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0Rlc3RydWN0aXZlUmVhZCgpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRGVzdHJ1Y3RpdmVXcml0ZSgpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgT01EYXRhU291cmNlRXh0IGNvcHkoKSB0aHJvd3MgT01FeGNlcHRpb24gewotICAgICAgICAKLSAgICAgICAgaWYgKERFQlVHX0VOQUJMRUQpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiTWFraW5nIGEgY29weSBvZiB0aGUgSkFYQiBvYmplY3QiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IEpBWEJEYXRhU291cmNlKHRoaXMuZ2V0T2JqZWN0KCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChKQVhCRFNDb250ZXh0KSB0aGlzLmdldEJ1c2luZXNzQ29udGV4dCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYnl0ZVtdIGdldFhNTEJ5dGVzKFN0cmluZyBlbmNvZGluZykgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIF9nZXRCeXRlc0Zyb21CTyhnZXRCdXNpbmVzc09iamVjdChmYWxzZSksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXNDb250ZXh0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcpOwotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBhcmVudChNZXNzYWdlIG1lc3NhZ2UpIHsKLSAgICAgICAgaWYgKGJ1c0NvbnRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgKChKQVhCQmxvY2tDb250ZXh0KSBidXNDb250ZXh0KS5zZXRNZXNzYWdlKG1lc3NhZ2UpOwotICAgICAgICB9Ci0gICAgICAgIHN1cGVyLnNldFBhcmVudChtZXNzYWdlKTsKLSAgICB9Ci0KLSAgICAKLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9kYXRhYmluZGluZy9pbXBsL09NQmxvY2tGYWN0b3J5SW1wbC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9kYXRhYmluZGluZy9pbXBsL09NQmxvY2tGYWN0b3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmY4MjQ2Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvZGF0YWJpbmRpbmcvaW1wbC9PTUJsb2NrRmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmRhdGFiaW5kaW5nLmltcGw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuQmxvY2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmZhY3RvcnkuT01CbG9ja0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmltcGwuQmxvY2tGYWN0b3J5SW1wbDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci0KLS8qKgotICogT01CbG9ja0ZhY3RvcnlJbXBsCi0gKiA8cC8+Ci0gKiBDcmVhdGVzIGFuIE9NQmxvY2sKLSAqLwotcHVibGljIGNsYXNzIE9NQmxvY2tGYWN0b3J5SW1wbCBleHRlbmRzIEJsb2NrRmFjdG9yeUltcGwgaW1wbGVtZW50cyBPTUJsb2NrRmFjdG9yeSB7Ci0KLSAgICAvKiogRGVmYXVsdCBDb25zdHJ1Y3RvciByZXF1aXJlZCBmb3IgRmFjdG9yeSAqLwotICAgIHB1YmxpYyBPTUJsb2NrRmFjdG9yeUltcGwoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5CbG9ja0ZhY3RvcnkjY3JlYXRlRnJvbShvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCwgamF2YS5sYW5nLk9iamVjdCwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSkKLSAgICAgICovCi0gICAgcHVibGljIEJsb2NrIGNyZWF0ZUZyb20oT01FbGVtZW50IG9tRWxlbWVudCwgT2JqZWN0IGNvbnRleHQsIFFOYW1lIHFOYW1lKQotICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBuZXcgT01CbG9ja0ltcGwob21FbGVtZW50LCB0aGlzKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLkJsb2NrRmFjdG9yeSNjcmVhdGVGcm9tKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUpCi0gICAgICAqLwotICAgIHB1YmxpYyBCbG9jayBjcmVhdGVGcm9tKE9iamVjdCBidXNpbmVzc09iamVjdCwgT2JqZWN0IGNvbnRleHQsIFFOYW1lIHFOYW1lKSB7Ci0gICAgICAgIHJldHVybiBuZXcgT01CbG9ja0ltcGwoKE9NRWxlbWVudClidXNpbmVzc09iamVjdCwgdGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbGVtZW50KCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvZGF0YWJpbmRpbmcvaW1wbC9PTUJsb2NrSW1wbC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9kYXRhYmluZGluZy9pbXBsL09NQmxvY2tJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlZTQ5MDMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9kYXRhYmluZGluZy9pbXBsL09NQmxvY2tJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZGF0YWJpbmRpbmcuaW1wbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01PdXRwdXRGb3JtYXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5FeGNlcHRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5kYXRhYmluZGluZy5PTUJsb2NrOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5mYWN0b3J5LkJsb2NrRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuaW1wbC5CbG9ja0ltcGw7Ci0KLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci0KLS8qKiBPTUJsb2NrSW1wbCBCbG9jayB3aXRoIGEgYnVzaW5lc3Mgb2JqZWN0IHRoYXQgaXMgYW4gT01FbGVtZW50ICovCi1wdWJsaWMgY2xhc3MgT01CbG9ja0ltcGwgZXh0ZW5kcyBCbG9ja0ltcGwgaW1wbGVtZW50cyBPTUJsb2NrIHsKLQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIGJ5IE9NQmxvY2tGYWN0b3J5Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gYnVzT2JqZWN0Ci0gICAgICogQHBhcmFtIGZhY3RvcnkKLSAgICAgKi8KLSAgICBPTUJsb2NrSW1wbChPTUVsZW1lbnQgYnVzT2JqZWN0LCBCbG9ja0ZhY3RvcnkgZmFjdG9yeSkgewotICAgICAgICBzdXBlcihidXNPYmplY3QsCi0gICAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAgIGJ1c09iamVjdC5nZXRRTmFtZSgpLAotICAgICAgICAgICAgICBmYWN0b3J5KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgT2JqZWN0IF9nZXRCT0Zyb21SZWFkZXIoWE1MU3RyZWFtUmVhZGVyIHJlYWRlciwgT2JqZWN0IGJ1c0NvbnRleHQpCi0gICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uLCBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gVGFrZSBhIHNob3J0Y3V0IGFuZCByZXR1cm4gdGhlIE9NRWxlbWVudAotICAgICAgICByZXR1cm4gdGhpcy5nZXRPTUVsZW1lbnQoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgWE1MU3RyZWFtUmVhZGVyIF9nZXRSZWFkZXJGcm9tQk8oT2JqZWN0IGJ1c09iaiwgT2JqZWN0IGJ1c0NvbnRleHQpCi0gICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uLCBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgT01FbGVtZW50IG9tID0gKE9NRWxlbWVudClidXNPYmo7Ci0gICAgICAgIHJldHVybiBvbS5nZXRYTUxTdHJlYW1SZWFkZXIoKTsKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIE9iamVjdCBfZ2V0Qk9Gcm9tT00oT01FbGVtZW50IG9tLCBPYmplY3QgYnVzQ29udGV4dCkKLSAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBvbTsKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIE9NRWxlbWVudCBfZ2V0T01Gcm9tQk8oT2JqZWN0IGJ1c09iamVjdCwgT2JqZWN0IGJ1c0NvbnRleHQpCi0gICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gKE9NRWxlbWVudCkgYnVzT2JqZWN0OwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIF9vdXRwdXRGcm9tQk8oT2JqZWN0IGJ1c09iamVjdCwgT2JqZWN0IGJ1c0NvbnRleHQsIFhNTFN0cmVhbVdyaXRlciB3cml0ZXIpCi0gICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uLCBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgT01FbGVtZW50IG9tID0gKE9NRWxlbWVudClidXNPYmplY3Q7Ci0gICAgICAgIG9tLnNlcmlhbGl6ZSh3cml0ZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRWxlbWVudERhdGEoKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKLSAgICAgICAgcmV0dXJuOyAvLyBOb3RoaW5nIHRvIGNsb3NlCi0gICAgfQotCi0gICAgcHVibGljIElucHV0U3RyZWFtIGdldFhNTElucHV0U3RyZWFtKFN0cmluZyBlbmNvZGluZykgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gewotICAgICAgICBieXRlW10gYnl0ZXMgPSBnZXRYTUxCeXRlcyhlbmNvZGluZyk7Ci0gICAgICAgIHJldHVybiBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZXMpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0KCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIGdldEJ1c2luZXNzT2JqZWN0KGZhbHNlKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0Rlc3RydWN0aXZlUmVhZCgpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRGVzdHJ1Y3RpdmVXcml0ZSgpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBieXRlW10gZ2V0WE1MQnl0ZXMoU3RyaW5nIGVuY29kaW5nKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICBPTU91dHB1dEZvcm1hdCBmb3JtYXQgPSBuZXcgT01PdXRwdXRGb3JtYXQoKTsKLSAgICAgICAgZm9ybWF0LnNldENoYXJTZXRFbmNvZGluZyhlbmNvZGluZyk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzZXJpYWxpemUoYmFvcywgZm9ybWF0KTsKLSAgICAgICAgICAgIGJhb3MuZmx1c2goKTsKLSAgICAgICAgICAgIHJldHVybiBiYW9zLnRvQnl0ZUFycmF5KCk7Ci0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9kYXRhYmluZGluZy9pbXBsL1NPQVBFbnZlbG9wZUJsb2NrRmFjdG9yeUltcGwuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvZGF0YWJpbmRpbmcvaW1wbC9TT0FQRW52ZWxvcGVCbG9ja0ZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3MjI5OTguLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9kYXRhYmluZGluZy9pbXBsL1NPQVBFbnZlbG9wZUJsb2NrRmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmRhdGFiaW5kaW5nLmltcGw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuQmxvY2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmZhY3RvcnkuU09BUEVudmVsb3BlQmxvY2tGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5pbXBsLkJsb2NrRmFjdG9yeUltcGw7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBFbnZlbG9wZTsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKLQotLyoqIENyZWF0ZXMgYSBTT0FQRW52ZWxvcGVCbG9jayAqLwotcHVibGljIGNsYXNzIFNPQVBFbnZlbG9wZUJsb2NrRmFjdG9yeUltcGwgZXh0ZW5kcyBCbG9ja0ZhY3RvcnlJbXBsIGltcGxlbWVudHMKLSAgICAgICAgU09BUEVudmVsb3BlQmxvY2tGYWN0b3J5IHsKLQotICAgIC8qKiBEZWZhdWx0IENvbnN0cnVjdG9yIHJlcXVpcmVkIGZvciBGYWN0b3J5ICovCi0gICAgcHVibGljIFNPQVBFbnZlbG9wZUJsb2NrRmFjdG9yeUltcGwoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5mYWN0b3J5LkJsb2NrRmFjdG9yeSNjcmVhdGVGcm9tKG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50LCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lKQotICAgICAgKi8KLSAgICBwdWJsaWMgQmxvY2sgY3JlYXRlRnJvbShPTUVsZW1lbnQgb21FbGVtZW50LCBPYmplY3QgY29udGV4dCwgUU5hbWUgcU5hbWUpCi0gICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTT0FQRW52ZWxvcGVCbG9ja0ltcGwob21FbGVtZW50LCBudWxsLCBxTmFtZSwgdGhpcyk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5mYWN0b3J5LkJsb2NrRmFjdG9yeSNjcmVhdGVGcm9tKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUpCi0gICAgICAqLwotICAgIHB1YmxpYyBCbG9jayBjcmVhdGVGcm9tKE9iamVjdCBidXNpbmVzc09iamVjdCwgT2JqZWN0IGNvbnRleHQsIFFOYW1lIHFOYW1lKQotICAgICAgICAgICAgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbmV3IFNPQVBFbnZlbG9wZUJsb2NrSW1wbCgoU09BUEVudmVsb3BlKWJ1c2luZXNzT2JqZWN0LCBudWxsLCBxTmFtZSwgdGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbGVtZW50KCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvZGF0YWJpbmRpbmcvaW1wbC9TT0FQRW52ZWxvcGVCbG9ja0ltcGwuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvZGF0YWJpbmRpbmcvaW1wbC9TT0FQRW52ZWxvcGVCbG9ja0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTYwODAwYi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2RhdGFiaW5kaW5nL2ltcGwvU09BUEVudmVsb3BlQmxvY2tJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZGF0YWJpbmRpbmcuaW1wbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01PdXRwdXRGb3JtYXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5FeGNlcHRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5NZXNzYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5kYXRhYmluZGluZy5TT0FQRW52ZWxvcGVCbG9jazsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZmFjdG9yeS5CbG9ja0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmZhY3RvcnkuTWVzc2FnZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmltcGwuQmxvY2tJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS51dGlsLlNPQVBFbGVtZW50UmVhZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MucmVnaXN0cnkuRmFjdG9yeVJlZ2lzdHJ5OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRW52ZWxvcGU7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotCi0vKioKLSAqIAotICoKLSAqLwotcHVibGljIGNsYXNzIFNPQVBFbnZlbG9wZUJsb2NrSW1wbCBleHRlbmRzIEJsb2NrSW1wbCBpbXBsZW1lbnRzIFNPQVBFbnZlbG9wZUJsb2NrIHsKLQotICAgIC8qKgotICAgICAqIENhbGxlZCBieSBTT0FQRW52ZWxvcGVCbG9ja0ZhY3RvcnkKLSAgICAgKgotICAgICAqIEBwYXJhbSBidXNPYmplY3QKLSAgICAgKiBAcGFyYW0gYnVzQ29udGV4dAotICAgICAqIEBwYXJhbSBxTmFtZQotICAgICAqIEBwYXJhbSBmYWN0b3J5Ci0gICAgICovCi0gICAgcHVibGljIFNPQVBFbnZlbG9wZUJsb2NrSW1wbChPYmplY3QgYnVzT2JqZWN0LCBPYmplY3QgYnVzQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFOYW1lIHFOYW1lLCBCbG9ja0ZhY3RvcnkgZmFjdG9yeSkgewotICAgICAgICBzdXBlcihidXNPYmplY3QsCi0gICAgICAgICAgICAgIGJ1c0NvbnRleHQsCi0gICAgICAgICAgICAgIChxTmFtZSA9PSBudWxsKSA/IGdldFFOYW1lKChTT0FQRW52ZWxvcGUpYnVzT2JqZWN0KSA6IHFOYW1lLAotICAgICAgICAgICAgICBmYWN0b3J5KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgYnkgU09BUEVudmVsb3BlQmxvY2tGYWN0b3J5Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gb21FbGVtZW50Ci0gICAgICogQHBhcmFtIGJ1c0NvbnRleHQKLSAgICAgKiBAcGFyYW0gcU5hbWUKLSAgICAgKiBAcGFyYW0gZmFjdG9yeQotICAgICAqLwotICAgIHB1YmxpYyBTT0FQRW52ZWxvcGVCbG9ja0ltcGwoT01FbGVtZW50IG9tRWxlbWVudCwgT2JqZWN0IGJ1c0NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRTmFtZSBxTmFtZSwgQmxvY2tGYWN0b3J5IGZhY3RvcnkpIHsKLSAgICAgICAgc3VwZXIob21FbGVtZW50LCBidXNDb250ZXh0LCBxTmFtZSwgZmFjdG9yeSk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5pbXBsLkJsb2NrSW1wbCNfZ2V0Qk9Gcm9tUmVhZGVyKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyLCBqYXZhLmxhbmcuT2JqZWN0KQotICAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgT2JqZWN0IF9nZXRCT0Zyb21SZWFkZXIoWE1MU3RyZWFtUmVhZGVyIHJlYWRlciwgT2JqZWN0IGJ1c0NvbnRleHQpCi0gICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uLCBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgTWVzc2FnZUZhY3RvcnkgbWYgPSAoTWVzc2FnZUZhY3RvcnkpRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoTWVzc2FnZUZhY3RvcnkuY2xhc3MpOwotICAgICAgICBNZXNzYWdlIG1lc3NhZ2UgPSBtZi5jcmVhdGVGcm9tKHJlYWRlciwgbnVsbCk7Ci0gICAgICAgIFNPQVBFbnZlbG9wZSBlbnYgPSBtZXNzYWdlLmdldEFzU09BUEVudmVsb3BlKCk7Ci0gICAgICAgIHRoaXMuc2V0UU5hbWUoZ2V0UU5hbWUoZW52KSk7Ci0gICAgICAgIHJldHVybiBlbnY7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5pbXBsLkJsb2NrSW1wbCNfZ2V0UmVhZGVyRnJvbUJPKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCi0gICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBYTUxTdHJlYW1SZWFkZXIgX2dldFJlYWRlckZyb21CTyhPYmplY3QgYnVzT2JqLCBPYmplY3QgYnVzQ29udGV4dCkKLSAgICAgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbmV3IFNPQVBFbGVtZW50UmVhZGVyKChTT0FQRWxlbWVudClidXNPYmopOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuaW1wbC5CbG9ja0ltcGwjX291dHB1dEZyb21CTyhqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlcikKLSAgICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgX291dHB1dEZyb21CTyhPYmplY3QgYnVzT2JqZWN0LCBPYmplY3QgYnVzQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTFN0cmVhbVdyaXRlciB3cml0ZXIpCi0gICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uLCBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHJlYWRlciA9IF9nZXRSZWFkZXJGcm9tQk8oYnVzT2JqZWN0LCBidXNDb250ZXh0KTsKLSAgICAgICAgX291dHB1dEZyb21SZWFkZXIocmVhZGVyLCB3cml0ZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgUU5hbWUgb2YgdGhlIGVudmVsb3BlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZW52Ci0gICAgICogQHJldHVybiBRTmFtZQotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIFFOYW1lIGdldFFOYW1lKFNPQVBFbnZlbG9wZSBlbnYpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBRTmFtZShlbnYuZ2V0TmFtZXNwYWNlVVJJKCksIGVudi5nZXRMb2NhbE5hbWUoKSwgZW52LmdldFByZWZpeCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VsZW1lbnREYXRhKCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgY2xvc2UoKSB7Ci0gICAgICAgIHJldHVybjsgLy8gTm90aGluZyB0byBjbG9zZQotICAgIH0KLQotICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRYTUxJbnB1dFN0cmVhbShTdHJpbmcgZW5jb2RpbmcpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKLSAgICAgICAgYnl0ZVtdIGJ5dGVzID0gZ2V0WE1MQnl0ZXMoZW5jb2RpbmcpOwotICAgICAgICByZXR1cm4gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldE9iamVjdCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBnZXRCdXNpbmVzc09iamVjdChmYWxzZSk7Ci0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNEZXN0cnVjdGl2ZVJlYWQoKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0Rlc3RydWN0aXZlV3JpdGUoKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYnl0ZVtdIGdldFhNTEJ5dGVzKFN0cmluZyBlbmNvZGluZykgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gewotICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgT01PdXRwdXRGb3JtYXQgZm9ybWF0ID0gbmV3IE9NT3V0cHV0Rm9ybWF0KCk7Ci0gICAgICAgIGZvcm1hdC5zZXRDaGFyU2V0RW5jb2RpbmcoZW5jb2RpbmcpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgc2VyaWFsaXplKGJhb3MsIGZvcm1hdCk7Ci0gICAgICAgICAgICBiYW9zLmZsdXNoKCk7Ci0gICAgICAgICAgICByZXR1cm4gYmFvcy50b0J5dGVBcnJheSgpOwotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvZGF0YWJpbmRpbmcvaW1wbC9Tb3VyY2VCbG9ja0ZhY3RvcnlJbXBsLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2RhdGFiaW5kaW5nL2ltcGwvU291cmNlQmxvY2tGYWN0b3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMmQ2ZjE4Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvZGF0YWJpbmRpbmcvaW1wbC9Tb3VyY2VCbG9ja0ZhY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5kYXRhYmluZGluZy5pbXBsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLkJsb2NrOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5mYWN0b3J5LlNvdXJjZUJsb2NrRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuaW1wbC5CbG9ja0ZhY3RvcnlJbXBsOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBTb3VyY2VCbG9ja0ZhY3RvcnlJbXBsCi0gKiA8cC8+Ci0gKiBDcmVhdGVzIGEgU291cmNlQmxvY2sKLSAqLwotcHVibGljIGNsYXNzIFNvdXJjZUJsb2NrRmFjdG9yeUltcGwgZXh0ZW5kcyBCbG9ja0ZhY3RvcnlJbXBsIGltcGxlbWVudHMgU291cmNlQmxvY2tGYWN0b3J5IHsKLQotICAgIC8qKiBEZWZhdWx0IENvbnN0cnVjdG9yIHJlcXVpcmVkIGZvciBGYWN0b3J5ICovCi0gICAgcHVibGljIFNvdXJjZUJsb2NrRmFjdG9yeUltcGwoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5CbG9ja0ZhY3RvcnkjY3JlYXRlRnJvbShqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lKQotICAgICAgKi8KLSAgICBwdWJsaWMgQmxvY2sgY3JlYXRlRnJvbShPYmplY3QgYnVzaW5lc3NPYmplY3QsIE9iamVjdCBjb250ZXh0LCBRTmFtZSBxTmFtZSkKLSAgICAgICAgICAgIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTb3VyY2VCbG9ja0ltcGwoKFNvdXJjZSlidXNpbmVzc09iamVjdCwgcU5hbWUsIHRoaXMpOwotICAgIH0KLQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5CbG9ja0ZhY3RvcnkjY3JlYXRlRnJvbShvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCwgamF2YS5sYW5nLk9iamVjdCwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSkKLSAgICAgICovCi0gICAgcHVibGljIEJsb2NrIGNyZWF0ZUZyb20oT01FbGVtZW50IG9tRWxlbWVudCwgT2JqZWN0IGNvbnRleHQsIFFOYW1lIHFOYW1lKQotICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBuZXcgU291cmNlQmxvY2tJbXBsKG9tRWxlbWVudCwgcU5hbWUsIHRoaXMpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRWxlbWVudCgpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9kYXRhYmluZGluZy9pbXBsL1NvdXJjZUJsb2NrSW1wbC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9kYXRhYmluZGluZy9pbXBsL1NvdXJjZUJsb2NrSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjg5NDI1Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvZGF0YWJpbmRpbmcvaW1wbC9Tb3VyY2VCbG9ja0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5kYXRhYmluZGluZy5pbXBsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTURhdGFTb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTVNvdXJjZWRFbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5TdEFYVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVAxMUNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFzb3VyY2UuU291cmNlRGF0YVNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLkV4Y2VwdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5pMThuLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5kYXRhYmluZGluZy5Tb3VyY2VCbG9jazsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZmFjdG9yeS5CbG9ja0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmltcGwuQmxvY2tJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS51dGlsLlJlYWRlcjJXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51dGlsaXR5LkNvbnZlcnRVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLnV0aWwuSkFYQlNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MSW5wdXRGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnNheC5TQVhTb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbjsKLQotLyoqCi0gKiBTb3VyY2VCbG9jawotICogPHAvPgotICogQmxvY2sgY29udGFpbmluZyBhIGJ1c2luZXNzIG9iamVjdCB0aGF0IGlzIGEgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2UuCi0gKiA8cC8+Ci0gKiBUaGUgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2UgaXMgYW4gaW50ZXJmYWNlLiAgVGhlIGFjdHVhbCBjb25jcmV0ZSBjbGFzcyBtYXkgYmUgb25lIG9mIHRoZQotICogZm9sbG93aW5nOiAtIFN0cmVhbVNvdXJjZSAtIERPTVNvdXJjZSAtIEpBWEJTb3VyY2UgLSBTQVhTb3VyY2UgLSBTdEFYU291cmNlCi0gKiA8cC8+Ci0gKiBEdXJpbmcgcHJvY2Vzc2luZyBvZiB0aGUgYmxvY2ssIHRoZSBibG9jayBpcyBmcmVlIHRvIGNoYW5nZSB0aGUgcmVwcmVzZW50YXRpb24gZnJvbSBvbmUgc291cmNlCi0gKiB0byBhbm90aGVyLiAgKGkuZS4gaWYgeW91IGluaXRpYWxseSBzZWVkIHRoaXMgd2l0aCBhIFNBWFNvdXJjZSwgYnV0IGEgbGF0ZXIgYWNjZXNzIG1heSBnaXZlIHlvdQotICogYSBTdEFYU291cmNlKS4KLSAqIDxwLz4KLSAqIEEgU291cmNlIGlzIGNvbnN1bWVkIHdoZW4gcmVhZC4gIFRoZSBibG9jayB3aWxsIG1ha2UgYSBjb3B5IG9mIHRoZSBzb3VyY2UgaWYgYSBub24tY29uc3VtYWJsZQotICogcmVxdWVzdCBpcyBtYWRlLgotICovCi1wdWJsaWMgY2xhc3MgU291cmNlQmxvY2tJbXBsIGV4dGVuZHMgQmxvY2tJbXBsIGltcGxlbWVudHMgU291cmNlQmxvY2sgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFNvdXJjZUJsb2NrSW1wbC5jbGFzcyk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3Mgc3RheFNvdXJjZSA9IG51bGw7Ci0KLSAgICBzdGF0aWMgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gRHluYW1pY2FsbHkgZGlzY292ZXIgaWYgU3RBWFNvdXJjZSBpcyBhdmFpbGFibGUKLSAgICAgICAgICAgIHN0YXhTb3VyY2UgPSBmb3JOYW1lKCJqYXZheC54bWwudHJhbnNmb3JtLnN0YXguU3RBWFNvdXJjZSIpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJTdEFYU291cmNlIGlzIG5vdCBwcmVzZW50IGluIHRoZSBKREsuICAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoaXMgaXMgYWNjZXB0YWJsZS4gIFByb2Nlc3NpbmcgY29udGludWVzIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIFdvb2RzdG94IGRvZXMgbm90IHdvcmsgd2l0aCBTdEFYU291cmNlCi0gICAgICAgICAgICBpZihYTUxJbnB1dEZhY3RvcnkubmV3SW5zdGFuY2UoKS5nZXRDbGFzcygpLmdldE5hbWUoKS5pbmRleE9mKCJ3c3R4IikhPS0xKXsKLSAgICAgICAgICAgICAgICBzdGF4U291cmNlID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpewotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgY2FsbGVkIGZyb20gZmFjdG9yeQotICAgICAqCi0gICAgICogQHBhcmFtIGJ1c09iamVjdAotICAgICAqIEBwYXJhbSBxTmFtZQotICAgICAqIEBwYXJhbSBmYWN0b3J5Ci0gICAgICovCi0gICAgU291cmNlQmxvY2tJbXBsKFNvdXJjZSBidXNPYmplY3QsIFFOYW1lIHFOYW1lLCBCbG9ja0ZhY3RvcnkgZmFjdG9yeSkKLSAgICAgICAgICAgIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIoYnVzT2JqZWN0LCBudWxsLCBxTmFtZSwgZmFjdG9yeSk7Ci0KLSAgICAgICAgLy8gQ2hlY2sgdmFsaWRpdHkgb2YgU291cmNlCi0gICAgICAgIGlmIChidXNPYmplY3QgaW5zdGFuY2VvZiBET01Tb3VyY2UgfHwKLSAgICAgICAgICAgICAgICBidXNPYmplY3QgaW5zdGFuY2VvZiBTQVhTb3VyY2UgfHwKLSAgICAgICAgICAgICAgICBidXNPYmplY3QgaW5zdGFuY2VvZiBTdHJlYW1Tb3VyY2UgfHwKLSAgICAgICAgICAgICAgICAoYnVzT2JqZWN0LmdldENsYXNzKCkuZXF1YWxzKHN0YXhTb3VyY2UpKSB8fAotICAgICAgICAgICAgICAgIGJ1c09iamVjdCBpbnN0YW5jZW9mIEpBWEJTb3VyY2UpIHsKLSAgICAgICAgICAgIC8vIE9rYXksIHRoZXNlIGFyZSBzdXBwb3J0ZWQgU291cmNlIG9iamVjdHMKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiZGF0YSBvYmplY3QgaXMgYSAiICsgYnVzT2JqZWN0LmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoIlNvdXJjZU5vdFN1cHBvcnRlZCIsIGJ1c09iamVjdC5nZXRDbGFzcygpLmdldE5hbWUoKSkpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBjYWxsZWQgZnJvbSBmYWN0b3J5Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVhZGVyCi0gICAgICogQHBhcmFtIHFOYW1lCi0gICAgICogQHBhcmFtIGZhY3RvcnkKLSAgICAgKi8KLSAgICBwdWJsaWMgU291cmNlQmxvY2tJbXBsKE9NRWxlbWVudCBvbUVsZW1lbnQsIFFOYW1lIHFOYW1lLCBCbG9ja0ZhY3RvcnkgZmFjdG9yeSkgewotICAgICAgICBzdXBlcihvbUVsZW1lbnQsIG51bGwsIHFOYW1lLCBmYWN0b3J5KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgT2JqZWN0IF9nZXRCT0Zyb21SZWFkZXIoWE1MU3RyZWFtUmVhZGVyIHJlYWRlciwgT2JqZWN0IGJ1c0NvbnRleHQpCi0gICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAvLyBCZXN0IHNvbHV0aW9uIGlzIHRvIHVzZSBhIFN0QVhTb3VyY2UKLSAgICAgICAgLy8gSG93ZXZlciBTdEFYU291cmNlIGlzIG5vdCB3aWRlbHkgYWNjZXB0ZWQuICAKLSAgICAgICAgLy8gRm9yIG5vdywgYSBTdHJlYW1Tb3VyY2UgaXMgYWx3YXlzIHJldHVybmVkCi0gICAgICAgIC8qCi0gICAgICAgIGlmIChzdGF4U291cmNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETyBDb25zdHJ1Y3RvciBzaG91bGQgYmUgc3RhdGljYWxseSBjYWNoZWQgZm9yIHBlcmZvcm1hbmNlCi0gICAgICAgICAgICAgICAgQ29uc3RydWN0b3IgYyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF4U291cmNlLmdldERlY2xhcmVkQ29uc3RydWN0b3IobmV3IENsYXNzW10geyBYTUxTdHJlYW1SZWFkZXIuY2xhc3MgfSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGMubmV3SW5zdGFuY2UobmV3IE9iamVjdFtdIHsgcmVhZGVyIH0pOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAqLwotCi0gICAgICAgIC8vIFRPRE8gU3RyZWFtU291cmNlIGlzIG5vdCBwZXJmb3JtYW50Li4ud29yayBpcyBuZWVkZWQgaGVyZSB0byBtYWtlIHRoaXMgZmFzdGVyCi0gICAgICAgIFJlYWRlcjJXcml0ZXIgcjJ3ID0gbmV3IFJlYWRlcjJXcml0ZXIocmVhZGVyKTsKLSAgICAgICAgU3RyaW5nIHRleHQgPSByMncuZ2V0QXNTdHJpbmcoKTsKLSAgICAgICAgU3RyaW5nUmVhZGVyIHNyID0gbmV3IFN0cmluZ1JlYWRlcih0ZXh0KTsKLSAgICAgICAgcmV0dXJuIG5ldyBTdHJlYW1Tb3VyY2Uoc3IpOwotCi0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBPYmplY3QgX2dldEJPRnJvbU9NKE9NRWxlbWVudCBvbUVsZW1lbnQsIE9iamVjdCBidXNDb250ZXh0KQotICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uLCBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgT2JqZWN0IGJ1c09iamVjdDsKLSAgICAgICAgCi0gICAgICAgIC8vIFNob3J0Y3V0IHRvIGdldCBidXNpbmVzcyBvYmplY3QgZnJvbSBleGlzdGluZyBkYXRhIHNvdXJjZQotICAgICAgICBpZiAob21FbGVtZW50IGluc3RhbmNlb2YgT01Tb3VyY2VkRWxlbWVudCkgewotICAgICAgICAgICAgT01EYXRhU291cmNlIGRzID0gKChPTVNvdXJjZWRFbGVtZW50KSBvbUVsZW1lbnQpLmdldERhdGFTb3VyY2UoKTsKLSAgICAgICAgICAgIGlmIChkcyBpbnN0YW5jZW9mIFNvdXJjZURhdGFTb3VyY2UpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKChTb3VyY2VEYXRhU291cmNlKSBkcykuZ2V0T2JqZWN0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIElmIHRoZSBtZXNzYWdlIGlzIGEgZmF1bHQsIHRoZXJlIGFyZSBzb21lIHNwZWNpYWwgZ3ltbmFzdGljcyB0aGF0IHdlIGhhdmUgdG8gZG8KLSAgICAgICAgLy8gdG8gZ2V0IHRoaXMgd29ya2luZyBmb3IgYWxsIG9mIHRoZSBoYW5kbGVyIHNjZW5hcmlvcy4gIAotICAgICAgICBib29sZWFuIGhhc0ZhdWx0ID0gZmFsc2U7Ci0gICAgICAgIGlmICgocGFyZW50ICE9IG51bGwgJiYgcGFyZW50LmlzRmF1bHQoKSkgfHwgCi0gICAgICAgICAgICBvbUVsZW1lbnQuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKS5lcXVhbHMoU09BUDExQ29uc3RhbnRzLlNPQVBGQVVMVF9MT0NBTF9OQU1FKSkgewotICAgICAgICAgICAgaGFzRmF1bHQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBUcmFuc2Zvcm0gcmVhZGVyIGludG8gYnVzaW5lc3Mgb2JqZWN0Ci0gICAgICAgIGlmICghaGFzRmF1bHQpIHsKLSAgICAgICAgICAgIGJ1c09iamVjdCA9IHN1cGVyLl9nZXRCT0Zyb21PTShvbUVsZW1lbnQsIGJ1c0NvbnRleHQpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICBvbUVsZW1lbnQuc2VyaWFsaXplKGJhb3MpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBiYWlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSk7Ci0gICAgICAgICAgICBidXNPYmplY3QgPSBuZXcgU3RyZWFtU291cmNlKGJhaXMpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBidXNPYmplY3Q7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFhNTFN0cmVhbVJlYWRlciBfZ2V0UmVhZGVyRnJvbUJPKE9iamVjdCBidXNPYmosIE9iamVjdCBidXNDb250ZXh0KQotICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBUT0RPIG5vdCBzdXJlIGlmIHRoaXMgaXMgYWx3YXlzIHRoZSBtb3N0IHBlcmZvcm1hbnQgd2F5IHRvIGRvIHRoaXMuCi0gICAgICAgICAgICAvKiBUaGUgZm9sbG93aW5nIGNvZGUgZmFpbGVkIGluIHNvbWUgKENUUykgZW52aXJvbm1lbnRzLiAKLQkgICAgICAgIGlmIChidXNPYmogaW5zdGFuY2VvZiBET01Tb3VyY2UpIHsKLQkgICAgICAgICAgICAvLyBMZXQncyB1c2Ugb3VyIG93biBET01SZWFkZXIgZm9yIG5vdy4uLgotCSAgICAgICAgICAgIEVsZW1lbnQgZWxlbWVudCA9IG51bGw7Ci0JICAgICAgICAgICAgCi0JICAgICAgICAgICAgLy8gQnVzaW5lc3MgT2JqZWN0IG1zdXQgYmUgYSBEb2N1bWVudCBvciBFbGVtZW50Ci0JICAgICAgICAgICAgTm9kZSBub2RlID0gKChET01Tb3VyY2UpYnVzT2JqKS5nZXROb2RlKCk7Ci0JICAgICAgICAgICAgaWYobm9kZSBpbnN0YW5jZW9mIERvY3VtZW50KXsKLQkgICAgICAgICAgICAgICAgZWxlbWVudCA9ICgoRG9jdW1lbnQpbm9kZSkuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0JICAgICAgICAgICAgfWVsc2V7Ci0JICAgICAgICAgICAgICAgIGVsZW1lbnQgPSAoRWxlbWVudCkgKChET01Tb3VyY2UpYnVzT2JqKS5nZXROb2RlKCk7Ci0JICAgICAgICAgICAgfQotCSAgICAgICAgICAgIAotCSAgICAgICAgICAgIC8vIFdlIGhhZCBzb21lIHByb2JsZW1zIHdpdGggdGVzdGVycyBwcm9kdWNpbmcgRE9NU291cmNlcyB3L28gTmFtZXNwYWNlcy4gIAotCSAgICAgICAgICAgIC8vIEl0J3MgZWFzeSB0byBjYXRjaCB0aGlzIGhlcmUuCi0JICAgICAgICAgICAgaWYgKGVsZW1lbnQuZ2V0TG9jYWxOYW1lKCkgPT0gbnVsbCkgewotCSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWE1MU3RyZWFtRXhjZXB0aW9uKEV4Y2VwdGlvbkZhY3RvcnkuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJKQVhCU291cmNlTmFtZXNwYWNlRXJyIikpKTsKLQkgICAgICAgICAgICB9Ci0JICAgICAgICAgICAgCi0JICAgICAgICAgICAgcmV0dXJuIG5ldyBET01SZWFkZXIoZWxlbWVudCk7Ci0JICAgICAgICB9IAotICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgaWYgKGJ1c09iaiBpbnN0YW5jZW9mIFN0cmVhbVNvdXJjZSkgewotICAgICAgICAgICAgICAgIFhNTElucHV0RmFjdG9yeSBmID0gU3RBWFV0aWxzLmdldFhNTElucHV0RmFjdG9yeSgpOwotCi0gICAgICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHJlYWRlciA9IGYuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKChTb3VyY2UpYnVzT2JqKTsKLSAgICAgICAgICAgICAgICBTdEFYVXRpbHMucmVsZWFzZVhNTElucHV0RmFjdG9yeShmKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVhZGVyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy9UT0RPOiBGb3IgR00gd2UgbmVlZCB0byBvbmx5IHVzZSB0aGlzIGFwcHJvYWNoIHdoZW4gYWJzb2x1dGVseSBuZWNlc3NhcnkuCi0gICAgICAgICAgICAvLyBGb3IgZXhhbXBsZSwgd2UgZG9uJ3Qgd2FudCB0byBkbyB0aGlzIGlmIHRoaXMgaXMgYSAoMS42KSBTdGF4U291cmNlIG9yIGlmIHRoZSAKLSAgICAgICAgICAgIC8vIGluc3RhbGxlZCBwYXJzZXIgcHJvdmlkZXMgYSBiZXR0ZXIgc29sdXRpb24uCi0gICAgICAgICAgICAvL1RPRE86IFVuY29tbWVudCB0aGlzIGNvZGUgaWYgd29vZHN0b2NrIHBhcnNlciBoYW5kbGVzIAotICAgICAgICAgICAgLy8gSkFYQlNvdXJjZSBhbmQgU0FYU291cmNlIGNvcnJlY3RseS4KLSAgICAgICAgICAgIC8vcmV0dXJuIGlucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoKFNvdXJjZSkgYnVzT2JqKTsKLSAgICAgICAgICAgIHJldHVybiBfc2xvd19nZXRSZWFkZXJGcm9tU291cmNlKChTb3VyY2UpYnVzT2JqKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSAoYnVzT2JqID09IG51bGwpID8gIm5vbmUiIDogYnVzT2JqLmdldENsYXNzKCkuZ2V0TmFtZSgpOwotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeQotICAgICAgICAgICAgICAgICAgICAubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiU291cmNlUmVhZEVyciIsIGNsYXNzTmFtZSksIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqIENyZWF0ZXMgYW4gWE1MU3RyZWFtUmVhZGVyIGZyb20gYSBTb3VyY2UgdXNpbmcgYSBzbG93IGJ1dCBwcm92ZW4gYWxnb3JpdGhtLiAqLwotICAgIHByaXZhdGUgWE1MU3RyZWFtUmVhZGVyIF9zbG93X2dldFJlYWRlckZyb21Tb3VyY2UoU291cmNlIHNyYykgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJTdGFydCBfc2xvd19nZXRSZWFkZXJGcm9tU291cmNlIik7Ci0gICAgICAgIH0KLSAgICAgICAgYnl0ZVtdIGJ5dGVzID0gKGJ5dGVbXSkgQ29udmVydFV0aWxzLmNvbnZlcnQoc3JjLCBieXRlW10uY2xhc3MpOwotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiU3VjY2Vzc2Z1bGx5IGNvbnZlcnRlZCB0byBCeXRlQXJyYXkiKTsKLSAgICAgICAgfQotICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBiYWlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVzKTsKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHJlYWRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoYmFpcyk7Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJFbmQgX3Nsb3dfZ2V0UmVhZGVyRnJvbVNvdXJjZSA9IiArIHJlYWRlcik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlYWRlcjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBfb3V0cHV0RnJvbUJPKE9iamVjdCBidXNPYmplY3QsIE9iamVjdCBidXNDb250ZXh0LCBYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyKQotICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFRoZXJlIGlzIG5vIGZhc3Qgd2F5IHRvIG91dHB1dCB0aGUgU291cmNlIHRvIGEgd3JpdGVyLCBzbyBnZXQgdGhlIHJlYWRlcgotICAgICAgICAvLyBhbmQgcGFzcyB1c2UgdGhlIGRlZmF1bHQgcmVhZGVyLT53cml0ZXIuCi0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJTdGFydCBfb3V0cHV0RnJvbUJPIik7Ci0gICAgICAgIH0KLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHJlYWRlciA9IF9nZXRSZWFkZXJGcm9tQk8oYnVzT2JqZWN0LCBidXNDb250ZXh0KTsKLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIk9idGFpbmVkIHJlYWRlcj0iICsgcmVhZGVyKTsKLSAgICAgICAgfQotICAgICAgICBfb3V0cHV0RnJvbVJlYWRlcihyZWFkZXIsIHdyaXRlcik7Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJFbmQgX291dHB1dFJlYWRlckZyb21CTyIpOwotICAgICAgICB9Ci0gICAgICAgIC8vIFJFVklFVyBTaG91bGQgd2UgY2FsbCBjbG9zZSgpIG9uIHRoZSBTb3VyY2UgPwotICAgIH0KLQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIE9iamVjdCBfZ2V0Qk9Gcm9tQk8oT2JqZWN0IGJ1c09iamVjdCwgT2JqZWN0IGJ1c0NvbnRleHQsIGJvb2xlYW4gY29uc3VtZSkgewotICAgICAgICBpZiAoY29uc3VtZSkgewotICAgICAgICAgICAgcmV0dXJuIGJ1c09iamVjdDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFRPRE8gTWlzc2luZyBJbXBsCi0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRNZXNzYWdlKCJTb3VyY2VNaXNzaW5nU3VwcG9ydCIsIGJ1c09iamVjdC5nZXRDbGFzcygpLmdldE5hbWUoKSkpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VsZW1lbnREYXRhKCkgewotICAgICAgICByZXR1cm4gZmFsc2U7ICAvLyBUaGUgc291cmNlIGNvdWxkIGJlIGEgdGV4dCBvciBlbGVtZW50IGV0Yy4KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIGNsYXNzIGZvciB0aGlzIG5hbWUKLSAgICAgKiBAcmV0dXJuIENsYXNzCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3MgZm9yTmFtZShmaW5hbCBTdHJpbmcgY2xhc3NOYW1lKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIE5PVEU6IFRoaXMgbWV0aG9kIG11c3QgcmVtYWluIHByaXZhdGUgYmVjYXVzZSBpdCB1c2VzIEFjY2Vzc0NvbnRyb2xsZXIKLSAgICAgICAgQ2xhc3MgY2wgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY2wgPSAoQ2xhc3MpQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoCi0gICAgICAgICAgICAgICAgICAgIG5ldyBQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENsYXNzLmZvck5hbWUoY2xhc3NOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgKTsKLSAgICAgICAgfSBjYXRjaCAoUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkV4Y2VwdGlvbiB0aHJvd24gZnJvbSBBY2Nlc3NDb250cm9sbGVyOiAiICsgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aHJvdyAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbillLmdldEV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGNsOwotICAgIH0KLSAgICAKLSAgICAKLSAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKLSAgICAgICAgcmV0dXJuOyAvLyBOb3RoaW5nIHRvIGNsb3NlCi0gICAgfQotCi0gICAgcHVibGljIElucHV0U3RyZWFtIGdldFhNTElucHV0U3RyZWFtKFN0cmluZyBlbmNvZGluZykgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnl0ZVtdIGJ5dGVzID0gKGJ5dGVbXSkgCi0gICAgICAgICAgICAgICAgQ29udmVydFV0aWxzLmNvbnZlcnQoZ2V0QnVzaW5lc3NPYmplY3QoZmFsc2UpLCBieXRlW10uY2xhc3MpOwotICAgICAgICAgICAgcmV0dXJuIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlcyk7Ci0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRPYmplY3QoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0QnVzaW5lc3NPYmplY3QoZmFsc2UpOwotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRGVzdHJ1Y3RpdmVSZWFkKCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0Rlc3RydWN0aXZlV3JpdGUoKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotCi0gICAgcHVibGljIGJ5dGVbXSBnZXRYTUxCeXRlcyhTdHJpbmcgZW5jb2RpbmcpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIlN0YXJ0IGdldFhNTEJ5dGVzIik7Ci0gICAgICAgIH0KLSAgICAgICAgYnl0ZVtdIGJ5dGVzID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ5dGVzID0gKGJ5dGVbXSkgCi0gICAgICAgICAgICAgICAgQ29udmVydFV0aWxzLmNvbnZlcnQoZ2V0QnVzaW5lc3NPYmplY3QoZmFsc2UpLCBieXRlW10uY2xhc3MpOwotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiRW5kIGdldFhNTEJ5dGVzIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJ5dGVzOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvZGF0YWJpbmRpbmcvaW1wbC9YTUxTdHJpbmdCbG9ja0ZhY3RvcnlJbXBsLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2RhdGFiaW5kaW5nL2ltcGwvWE1MU3RyaW5nQmxvY2tGYWN0b3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTliMGVkLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvZGF0YWJpbmRpbmcvaW1wbC9YTUxTdHJpbmdCbG9ja0ZhY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5kYXRhYmluZGluZy5pbXBsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLkJsb2NrOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5mYWN0b3J5LlhNTFN0cmluZ0Jsb2NrRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuaW1wbC5CbG9ja0ZhY3RvcnlJbXBsOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBYTUxTdHJpbmdGYWN0b3J5SW1wbAotICogPHAvPgotICogQ3JlYXRlcyBhbiBYTUxTdHJpbmdCbG9jawotICovCi1wdWJsaWMgY2xhc3MgWE1MU3RyaW5nQmxvY2tGYWN0b3J5SW1wbCBleHRlbmRzIEJsb2NrRmFjdG9yeUltcGwgaW1wbGVtZW50cyBYTUxTdHJpbmdCbG9ja0ZhY3RvcnkgewotCi0gICAgLyoqIERlZmF1bHQgQ29uc3RydWN0b3IgcmVxdWlyZWQgZm9yIEZhY3RvcnkgKi8KLSAgICBwdWJsaWMgWE1MU3RyaW5nQmxvY2tGYWN0b3J5SW1wbCgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLkJsb2NrRmFjdG9yeSNjcmVhdGVGcm9tKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUpCi0gICAgICAqLwotICAgIHB1YmxpYyBCbG9jayBjcmVhdGVGcm9tKE9iamVjdCBidXNpbmVzc09iamVjdCwgT2JqZWN0IGNvbnRleHQsIFFOYW1lIHFOYW1lKSB7Ci0gICAgICAgIHJldHVybiBuZXcgWE1MU3RyaW5nQmxvY2tJbXBsKChTdHJpbmcpYnVzaW5lc3NPYmplY3QsIHFOYW1lLCB0aGlzKTsKLSAgICB9Ci0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuQmxvY2tGYWN0b3J5I2NyZWF0ZUZyb20ob3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQsIGphdmEubGFuZy5PYmplY3QsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUpCi0gICAgICAqLwotICAgIHB1YmxpYyBCbG9jayBjcmVhdGVGcm9tKE9NRWxlbWVudCBvbUVsZW1lbnQsIE9iamVjdCBjb250ZXh0LCBRTmFtZSBxTmFtZSkKLSAgICAgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbmV3IFhNTFN0cmluZ0Jsb2NrSW1wbChvbUVsZW1lbnQsIHFOYW1lLCB0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VsZW1lbnQoKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvZGF0YWJpbmRpbmcvaW1wbC9YTUxTdHJpbmdCbG9ja0ltcGwuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvZGF0YWJpbmRpbmcvaW1wbC9YTUxTdHJpbmdCbG9ja0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTYzNDFhNC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2RhdGFiaW5kaW5nL2ltcGwvWE1MU3RyaW5nQmxvY2tJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZGF0YWJpbmRpbmcuaW1wbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlRXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTVNvdXJjZWRFbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5TdEFYVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhc291cmNlLlhNTFN0cmluZ0RhdGFTb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5FeGNlcHRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5kYXRhYmluZGluZy5YTUxTdHJpbmdCbG9jazsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZmFjdG9yeS5CbG9ja0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmltcGwuQmxvY2tJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS51dGlsLlJlYWRlcjJXcml0ZXI7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci0KLS8qKgotICogWE1MU3RyaW5nQmxvY2sKLSAqIDxwLz4KLSAqIEJsb2NrIGNvbnRhaW5pbmcgYSBidXNpbmVzcyBvYmplY3QgdGhhdCBpcyBhIFN0cmluZyBvZiB4bWwgdGV4dAotICovCi1wdWJsaWMgY2xhc3MgWE1MU3RyaW5nQmxvY2tJbXBsIGV4dGVuZHMgQmxvY2tJbXBsIGltcGxlbWVudHMgWE1MU3RyaW5nQmxvY2sgewotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgY2FsbGVkIGZyb20gZmFjdG9yeQotICAgICAqCi0gICAgICogQHBhcmFtIGJ1c09iamVjdAotICAgICAqIEBwYXJhbSBxTmFtZQotICAgICAqIEBwYXJhbSBmYWN0b3J5Ci0gICAgICovCi0gICAgWE1MU3RyaW5nQmxvY2tJbXBsKFN0cmluZyBidXNPYmplY3QsIFFOYW1lIHFOYW1lLCBCbG9ja0ZhY3RvcnkgZmFjdG9yeSkgewotICAgICAgICBzdXBlcihidXNPYmplY3QsIG51bGwsIHFOYW1lLCBmYWN0b3J5KTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIGNhbGxlZCBmcm9tIGZhY3RvcnkKLSAgICAgKgotICAgICAqIEBwYXJhbSByZWFkZXIKLSAgICAgKiBAcGFyYW0gcU5hbWUKLSAgICAgKiBAcGFyYW0gZmFjdG9yeQotICAgICAqLwotICAgIHB1YmxpYyBYTUxTdHJpbmdCbG9ja0ltcGwoT01FbGVtZW50IG9tRWxlbWVudCwgUU5hbWUgcU5hbWUsIEJsb2NrRmFjdG9yeSBmYWN0b3J5KSB7Ci0gICAgICAgIHN1cGVyKG9tRWxlbWVudCwgbnVsbCwgcU5hbWUsIGZhY3RvcnkpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBPYmplY3QgX2dldEJPRnJvbVJlYWRlcihYTUxTdHJlYW1SZWFkZXIgcmVhZGVyLCBPYmplY3QgYnVzQ29udGV4dCkKLSAgICAgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAvLyBDcmVhdGUgYSBSZWFkZXIyV3JpdGVyIGNvbnZlcnRlciBhbmQgZ2V0IHRoZSBvdXRwdXQgYXMgYSBTdHJpbmcKLSAgICAgICAgUmVhZGVyMldyaXRlciByMncgPSBuZXcgUmVhZGVyMldyaXRlcihyZWFkZXIpOwotICAgICAgICByZXR1cm4gcjJ3LmdldEFzU3RyaW5nKCk7Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBPYmplY3QgX2dldEJPRnJvbU9NKE9NRWxlbWVudCBvbUVsZW1lbnQsIE9iamVjdCBidXNDb250ZXh0KQotICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uLCBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgCi0gICAgICAgIC8vIFNob3J0Y3V0IHRvIGdldCBidXNpbmVzcyBvYmplY3QgZnJvbSBleGlzdGluZyBkYXRhIHNvdXJjZQotICAgICAgICBpZiAob21FbGVtZW50IGluc3RhbmNlb2YgT01Tb3VyY2VkRWxlbWVudCkgewotICAgICAgICAgICAgT01EYXRhU291cmNlIGRzID0gKChPTVNvdXJjZWRFbGVtZW50KSBvbUVsZW1lbnQpLmdldERhdGFTb3VyY2UoKTsKLSAgICAgICAgICAgIGlmIChkcyBpbnN0YW5jZW9mIFhNTFN0cmluZ0RhdGFTb3VyY2UpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKChYTUxTdHJpbmdEYXRhU291cmNlKSBkcykuZ2V0T2JqZWN0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN1cGVyLl9nZXRCT0Zyb21PTShvbUVsZW1lbnQsIGJ1c0NvbnRleHQpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBYTUxTdHJlYW1SZWFkZXIgX2dldFJlYWRlckZyb21CTyhPYmplY3QgYnVzT2JqLCBPYmplY3QgYnVzQ29udGV4dCkKLSAgICAgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAvLyBDcmVhdGUgYW4gWE1MU3RyZWFtUmVhZGVyIGZyb20gdGhlIGlucHV0RmFjdG9yeSB1c2luZyB0aGUgU3RyaW5nIGFzIHRoZSBzb3VyY2VzCi0gICAgICAgIFN0cmluZyBzdHIgPSAoU3RyaW5nKWJ1c09iajsKLSAgICAgICAgU3RyaW5nUmVhZGVyIHNyID0gbmV3IFN0cmluZ1JlYWRlcihzdHIpOwotICAgICAgICByZXR1cm4gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihzcik7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgX291dHB1dEZyb21CTyhPYmplY3QgYnVzT2JqZWN0LCBPYmplY3QgYnVzQ29udGV4dCwgWE1MU3RyZWFtV3JpdGVyIHdyaXRlcikKLSAgICAgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAvLyBUaGVyZSBpcyBubyBmYXN0IHdheSB0byBvdXRwdXQgdGhlIFN0cmluZyB0byBhIHdyaXRlciwgc28gZ2V0IHRoZSByZWFkZXIKLSAgICAgICAgLy8gYW5kIHBhc3MgdXNlIHRoZSBkZWZhdWx0IHJlYWRlci0+d3JpdGVyLgotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyID0gX2dldFJlYWRlckZyb21CTyhidXNPYmplY3QsIGJ1c0NvbnRleHQpOwotICAgICAgICBfb3V0cHV0RnJvbVJlYWRlcihyZWFkZXIsIHdyaXRlcik7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VsZW1lbnREYXRhKCkgewotICAgICAgICByZXR1cm4gZmFsc2U7ICAvLyBUaGUgdGV4dCBjb3VsZCBiZSBlbGVtZW50IG9yIHRleHQgb3Igc29tZXRoaW5nIGVsc2UKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgY2xvc2UoKSB7Ci0gICAgICAgIHJldHVybjsgLy8gTm90aGluZyB0byBjbG9zZQotICAgIH0KLQotICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRYTUxJbnB1dFN0cmVhbShTdHJpbmcgZW5jb2RpbmcpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ5dGVbXSBieXRlcyA9ICgoU3RyaW5nKSBnZXRCdXNpbmVzc09iamVjdChmYWxzZSkpLmdldEJ5dGVzKGVuY29kaW5nKTsKLSAgICAgICAgICAgIHJldHVybiBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZXMpOwotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0KCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIGdldEJ1c2luZXNzT2JqZWN0KGZhbHNlKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0Rlc3RydWN0aXZlUmVhZCgpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRGVzdHJ1Y3RpdmVXcml0ZSgpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgT01EYXRhU291cmNlRXh0IGNvcHkoKSB0aHJvd3MgT01FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbmV3IFhNTFN0cmluZ0RhdGFTb3VyY2UoKFN0cmluZykgZ2V0T2JqZWN0KCkpOwotICAgIH0KLQotCi0gICAgcHVibGljIGJ5dGVbXSBnZXRYTUxCeXRlcyhTdHJpbmcgZW5jb2RpbmcpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiAoKFN0cmluZykgZ2V0QnVzaW5lc3NPYmplY3QoZmFsc2UpKS5nZXRCeXRlcyhlbmNvZGluZyk7Ci0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9mYWN0b3J5L0Jsb2NrRmFjdG9yeS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9mYWN0b3J5L0Jsb2NrRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWQwMzNkLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvZmFjdG9yeS9CbG9ja0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5mYWN0b3J5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLkJsb2NrOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBCbG9ja0ZhY3RvcnkKLSAqIDxwLz4KLSAqIEludGVyZmFjZSB0byBjcmVhdGUgQmxvY2sgb2JqZWN0cyBBbiBvYmplY3QgaXMgY3JlYXRlZCBmcm9tIGVpdGhlciBhIHJlYWRlciwgYW5vdGhlciBCbG9jayBvciB0aGUKLSAqIEJ1c2luZXNzT2JqZWN0LiBTb21lIGJ1c2luZXNzIG9iamVjdHMgKGxpa2UgSkFYQikgaGF2ZSBhbiBhc3NvY2lhdGVkIGNvbnRleHQgb2JqZWN0Ci0gKiAoSkFYQkNvbnRleHQpLCB0aGVzZSBhcmUgYWxzbyBwYXNzZWQgdG8gdGhlIGNyZWF0ZU1ldGhvZHMuCi0gKiA8cC8+Ci0gKiBUaGUgaW1wbGVtZW50YXRpb24gb2YgQmxvY2tGYWN0b3JpZXMgc2hvdWxkIGFsd2F5cyBiZSBzaW5nbGV0b24gb2JqZWN0cyBhbmQgbmV2ZXIgY2FycnkgYW55Ci0gKiBpbnN0YW5jZSBkYXRhLgotICogPHAvPgotICogVGhlIEZhY3RvcnlSZWdpc3RyeSBzaG91bGQgYmUgdXNlZCB0byBnZXQgYWNjZXNzIHRvIGEgRmFjdG9yeQotICoKLSAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5yZWdpc3RyeS5GYWN0b3J5UmVnaXN0cnkKLSAqLwotcHVibGljIGludGVyZmFjZSBCbG9ja0ZhY3RvcnkgewotCi0gICAgLyoqCi0gICAgICogY3JlYXRlQmxvY2sgZnJvbSBYTUxTdHJlYW1SZWFkZXIKLSAgICAgKgotICAgICAqIEBwYXJhbSByZWFkZXIgIFhNTFN0cmVhbVJlYWRlcgotICAgICAqIEBwYXJhbSBjb250ZXh0IEFzc29jaWF0ZWQgQ29udGV4dCBvciBudWxsCi0gICAgICogQHBhcmFtIFFOYW1lICAgbXVzdCBiZSBzdXBwbGllZCBpZiBrbm93bgotICAgICAqIEB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIEJsb2NrIGNyZWF0ZUZyb20oWE1MU3RyZWFtUmVhZGVyIHJlYWRlciwgT2JqZWN0IGNvbnRleHQsIFFOYW1lIHFOYW1lKQotICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgV2ViU2VydmljZUV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIGNyZWF0ZUJsb2NrIGZyb20gWE1MU3RyZWFtUmVhZGVyCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb21FbGVtZW50IE9NRWxlbWVudAotICAgICAqIEBwYXJhbSBjb250ZXh0ICAgQXNzb2NpYXRlZCBDb250ZXh0IG9yIG51bGwKLSAgICAgKiBAcGFyYW0gUU5hbWUgICAgIG11c3QgYmUgc3VwcGxpZWQgaWYga25vd24KLSAgICAgKiBAdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBCbG9jayBjcmVhdGVGcm9tKE9NRWxlbWVudCBvbUVsZW1lbnQsIE9iamVjdCBjb250ZXh0LCBRTmFtZSBxTmFtZSkKLSAgICAgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sIFdlYlNlcnZpY2VFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBjcmVhdGVCbG9jayBmcm9tIGFub3RoZXIgQmxvY2sgSWYgdGhlIG90aGVyIEJsb2NrIHdhcyBjcmVhdGVkIHdpdGggdGhlIHNhbWUgZmFjdG9yeSBhbmQgaGFzIHRoZQotICAgICAqIHNhbWUgY29udGV4dCwgdGhlIG90aGVyIEJsb2NrIGlzIHJldHVybmVkLiBJZiB0aGUgb3RoZXIgQmxvY2sgd2FzIGNyZWF0ZWQgYnkgYSBkaWZmZXJlbnQgZmFjdG9yeQotICAgICAqIG9yIGRpZmZlbnQgY29udGV4dCwgYSBuZXcgYmxvY2sgaXMgcmV0dXJuZWQgKGFuZCB0aGUgb3RoZXIgYmxvY2sgaXMgY29uc3VtZWQpCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb3RoZXIgICBCbG9jawotICAgICAqIEBwYXJhbSBjb250ZXh0IEFzc29jaWF0ZWQgQ29udGV4dCBvciBudWxsCi0gICAgICogQHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgQmxvY2sgY3JlYXRlRnJvbShCbG9jayBvdGhlciwgT2JqZWN0IGNvbnRleHQpCi0gICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uLCBXZWJTZXJ2aWNlRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGZyb20gYnVzaW5lc3Mgb2JqZWN0Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gYnVzaW5lc3NPYmplY3QKLSAgICAgKiBAcGFyYW0gY29udGV4dCAgICAgICAgQXNzb2NpYXRlZCBDb250ZXh0IG9yIG51bGwKLSAgICAgKiBAcGFyYW0gUU5hbWUgICAgICAgICAgbXVzdCBiZSBzdXBwbGllZCBpZiBrbm93bgotICAgICAqIEB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIEJsb2NrIGNyZWF0ZUZyb20oT2JqZWN0IGJ1c2luZXNzT2JqZWN0LCBPYmplY3QgY29udGV4dCwgUU5hbWUgcU5hbWUpCi0gICAgICAgICAgICB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBidXNpbmVzcyBvYmplY3QgbXVzdCBiZSByZW5kZXJlZCBhcyBhbiBlbGVtZW50Ci0gICAgICogZXhhbXBsZSBKQVhCRmFjdG9yeSAuLi50cnVlCi0gICAgICogZXhhbXBsZSBTb3VyY2VGYWN0b3J5Li4uZmFsc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VsZW1lbnQoKTsKLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvZmFjdG9yeS9DbGFzc0ZpbmRlckZhY3RvcnkuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvZmFjdG9yeS9DbGFzc0ZpbmRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThmYmJlMy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2ZhY3RvcnkvQ2xhc3NGaW5kZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5mYWN0b3J5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmRhdGFiaW5kaW5nLkNsYXNzRmluZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5kYXRhYmluZGluZy5pbXBsLkNsYXNzRmluZGVySW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotcHVibGljIGNsYXNzIENsYXNzRmluZGVyRmFjdG9yeSB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKENsYXNzRmluZGVyRmFjdG9yeS5jbGFzcyk7Ci0KLSAgICBwcml2YXRlIENsYXNzRmluZGVyIGZpbmRlciA9IG51bGw7Ci0KLSAgICBwdWJsaWMgQ2xhc3NGaW5kZXIgZ2V0Q2xhc3NGaW5kZXIoKSB7Ci0gICAgICAgIGlmIChmaW5kZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGZpbmRlcjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IENsYXNzRmluZGVySW1wbCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENsYXNzRmluZGVyKENsYXNzRmluZGVyIGZpbmRlcikgewotICAgICAgICBpZiAodGhpcy5maW5kZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhpcy5maW5kZXIgPSBmaW5kZXI7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2ZhY3RvcnkvRGF0YVNvdXJjZUJsb2NrRmFjdG9yeS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9mYWN0b3J5L0RhdGFTb3VyY2VCbG9ja0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmIyNWI4MS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2ZhY3RvcnkvRGF0YVNvdXJjZUJsb2NrRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmZhY3Rvcnk7DQotDQotDQotLyoqDQotICogRGF0YVNvdXJjZUJsb2NrRmFjdG9yeQ0KLSAqIDxwLz4NCi0gKiBDcmVhdGVzIGEgU291cmNlQmxvY2sNCi0gKiA8cC8+DQotICogVGhlIEZhY3RvcnlSZWdpc3RyeSBzaG91bGQgYmUgdXNlZCB0byBnZXQgYWNjZXNzIHRvIHRoZSBGYWN0b3J5DQotICoNCi0gKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MucmVnaXN0cnkuRmFjdG9yeVJlZ2lzdHJ5DQotICovDQotcHVibGljIGludGVyZmFjZSBEYXRhU291cmNlQmxvY2tGYWN0b3J5IGV4dGVuZHMgQmxvY2tGYWN0b3J5IHsNCi0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9mYWN0b3J5L0pBWEJCbG9ja0ZhY3RvcnkuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvZmFjdG9yeS9KQVhCQmxvY2tGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlMjI3OGUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9mYWN0b3J5L0pBWEJCbG9ja0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmZhY3Rvcnk7Ci0KLQotLyoqCi0gKiBKQVhCQmxvY2tGYWN0b3J5Ci0gKiA8cC8+Ci0gKiBDcmVhdGVzIGEgSkFYQkJsb2NrLiAgVGhlIGJ1c2luZXNzIG9iamVjdCBvZiBhIEpBWEJCbG9jayBtdXN0IGJlIGVpdGhlciBhIEpBWEJFbGVtZW50IG9yIGEKLSAqIGdlbmVyYXRlZCBvYmplY3Qgd2l0aCB0aGUgWE1MUm9vdEVsZW1lbnQgYW5ub3RhdGlvbgotICogPHAvPgotICogKiBUaGUgRmFjdG9yeVJlZ2lzdHJ5IHNob3VsZCBiZSB1c2VkIHRvIGdldCBhY2Nlc3MgdG8gdGhlIEZhY3RvcnkKLSAqCi0gKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MucmVnaXN0cnkuRmFjdG9yeVJlZ2lzdHJ5Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSkFYQkJsb2NrRmFjdG9yeSBleHRlbmRzIEJsb2NrRmFjdG9yeSB7Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2ZhY3RvcnkvTWVzc2FnZUZhY3RvcnkuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvZmFjdG9yeS9NZXNzYWdlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTcxOTFiLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvZmFjdG9yeS9NZXNzYWdlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZmFjdG9yeTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5CbG9jazsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuTWVzc2FnZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuUHJvdG9jb2w7Ci0KLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQTWVzc2FnZTsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBNZXNzYWdlRmFjdG9yeQotICogPHAvPgotICogQ3JlYXRlcyBhIE1lc3NhZ2Ugb2JqZWN0LiAgVGhlIGNvbW1vbiBwYXR0ZXJucyBhcmU6IC0gQ3JlYXRlIGFuIGVtcHR5IG1lc3NhZ2UgZm9yIGEgc3BlY2lmaWMKLSAqIHByb3RvY29sIC0gQ3JlYXRlIGEgbWVzc2FnZSB3aXRoIHRoZSB4bWwgc291cmNlZCBmcm9tIE9NIChYTUxTdHJlYW1SZWFkZXIpIC0gQ3JlYXRlIGEgbWVzc2FnZQotICogKHhtbCArIGF0dGFjaG1lbnRzKSBmcm9tIGEgU09BUE1lc3NhZ2UKLSAqIDxwLz4KLSAqIFRoZSBGYWN0b3J5UmVnaXN0cnkgc2hvdWxkIGJlIHVzZWQgdG8gZ2V0IGFjY2VzcyB0byB0aGUgRmFjdG9yeQotICoKLSAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5yZWdpc3RyeS5GYWN0b3J5UmVnaXN0cnkKLSAqLwotcHVibGljIGludGVyZmFjZSBNZXNzYWdlRmFjdG9yeSB7Ci0gICAgLyoqCi0gICAgICogY3JlYXRlIE1lc3NhZ2Ugd2l0aCB0aGUgeG1sIGZyb20gdGhlIFhNTFN0cmVhbVJlYWRlcgotICAgICAqCi0gICAgICogQHBhcmFtIHJlYWRlciAgIFhNTFN0cmVhbVJlYWRlcgotICAgICAqIEBwYXJhbSBwcm90b2NvbCAoaWYgbnVsbCwgdGhlIHNvYXAgcHJvdG9jb2wgaXMgaW5mZXJyZWQgZnJvbSB0aGUgbmFtZXNwYWNlKQotICAgICAqIEB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIE1lc3NhZ2UgY3JlYXRlRnJvbShYTUxTdHJlYW1SZWFkZXIgcmVhZGVyLCBQcm90b2NvbCBwcm90b2NvbCkKLSAgICAgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sIFdlYlNlcnZpY2VFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBjcmVhdGUgTWVzc2FnZSB3aXRoIHRoZSB4bWwgZnJvbSB0aGUgT01FbGVtZW50Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gb21FbGVtZW50IE9NRWxlbWVudAotICAgICAqIEBwYXJhbSBwcm90b2NvbCAgKGlmIG51bGwsIHRoZSBzb2FwIHByb3RvY29sIGlzIGluZmVycmVkIGZyb20gdGhlIG5hbWVzcGFjZSkKLSAgICAgKiBAdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBNZXNzYWdlIGNyZWF0ZUZyb20oT01FbGVtZW50IG9tRWxlbWVudCwgUHJvdG9jb2wgcHJvdG9jb2wpCi0gICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uLCBXZWJTZXJ2aWNlRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogY3JlYXRlIE1lc3NhZ2UgZnJvbSBhIEJsb2NrCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYmxvY2sKLSAgICAgKiBAcGFyYW0gY29udGV4dCAgQXNzb2NpYXRlZCBDb250ZXh0IG9yIG51bGwKLSAgICAgKiBAcGFyYW0gcHJvdG9jb2wgKGlmIG51bGwsIHRoZSBzb2FwIHByb3RvY29sIGlzIGluZmVycmVkIGZyb20gdGhlIG5hbWVzcGFjZSkKLSAgICAgKiBAdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBNZXNzYWdlIGNyZWF0ZUZyb20oQmxvY2sgb3RoZXIsIE9iamVjdCBjb250ZXh0LCBQcm90b2NvbCBwcm90b2NvbCkKLSAgICAgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sIFdlYlNlcnZpY2VFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBjcmVhdGUgTWVzc2FnZSBmcm9tIFNPQVBNZXNzYWdlIFRoZSB4bWwgYW5kIGF0dGFjaG1lbnRzIGZyb20gdGhlIFNPQVBNZXNzYWdlIGFyZSB1c2VkIHRvCi0gICAgICogcG9wdWxhdGUgdGhlIG5ldyBNZXNzYWdlIFRoZSBwcm90b2NvbCBpcyBpbmZlcnJlZCBmcm9tIHRoZSBTT0FQTWVzc2FnZQotICAgICAqCi0gICAgICogQHBhcmFtIFNPQVBNZXNzYWdlCi0gICAgICogQHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sIFdlYlNlcnZpY2VFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgTWVzc2FnZSBjcmVhdGVGcm9tKFNPQVBNZXNzYWdlIG1lc3NhZ2UpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sIFdlYlNlcnZpY2VFeGNlcHRpb247Ci0KLQotICAgIC8qKgotICAgICAqIGNyZWF0ZSBlbXB0eSBNZXNzYWdlIG9mIHRoZSBzcGVjaWZpZWQgcHJvdG9jb2wKLSAgICAgKiBAcGFyYW0gcHJvdG9jb2wKLSAgICAgKiBAdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBNZXNzYWdlIGNyZWF0ZShQcm90b2NvbCBwcm90b2NvbCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgV2ViU2VydmljZUV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvZmFjdG9yeS9PTUJsb2NrRmFjdG9yeS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9mYWN0b3J5L09NQmxvY2tGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlNTI0Y2UuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9mYWN0b3J5L09NQmxvY2tGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5mYWN0b3J5OwotCi0KLS8qKgotICogT01CbG9ja0ZhY3RvcnkKLSAqIDxwLz4KLSAqIENyZWF0ZXMgYW4gT01CbG9jawotICogPHAvPgotICogKiBUaGUgRmFjdG9yeVJlZ2lzdHJ5IHNob3VsZCBiZSB1c2VkIHRvIGdldCBhY2Nlc3MgdG8gdGhlIEZhY3RvcnkKLSAqCi0gKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MucmVnaXN0cnkuRmFjdG9yeVJlZ2lzdHJ5Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT01CbG9ja0ZhY3RvcnkgZXh0ZW5kcyBCbG9ja0ZhY3RvcnkgewotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2ZhY3RvcnkvU0FBSkNvbnZlcnRlckZhY3RvcnkuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvZmFjdG9yeS9TQUFKQ29udmVydGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTZiYTNjLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvZmFjdG9yeS9TQUFKQ29udmVydGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZmFjdG9yeTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS51dGlsLlNBQUpDb252ZXJ0ZXI7Ci0KLS8qKgotICogU0FBSkNvbnZlcnRlckZhY3RvcnkgQ3JlYXRlcyBhbiBTQUFKQ29udmVydGVyIG9iamVjdCBBIGZhY3RvcnkgaXMgbmVjZXNzYXJ5IGJlY2F1c2UKLSAqIGltcGxlbWVudGF0aW9ucyBtYXkgbmVlZCB0byBwbHVnIGluIHRoZWlyIG93biBTQUFKIG9yIE9NIGltcGxlbWVudGF0aW9ucy4KLSAqIDxwLz4KLSAqIEZhY3RvcmllcyBhcmUgb2J0YWluZWQgZnJvbSB0aGUgRmFjdG9yeVJlZ2lzdHJ5Ci0gKgotICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnJlZ2lzdHJ5LkZhY3RvcnlSZWdpc3RyeQotICovCi1wdWJsaWMgaW50ZXJmYWNlIFNBQUpDb252ZXJ0ZXJGYWN0b3J5IHsKLQotICAgIC8qKgotICAgICAqIEdldCBvciBjcmVhdGUgdGhlIFNBQUpDb252ZXJ0ZXIKLSAgICAgKgotICAgICAqIEByZXR1cm4gU0FBSkNvbnZlcnRlcgotICAgICAqLwotICAgIHB1YmxpYyBTQUFKQ29udmVydGVyIGdldFNBQUpDb252ZXJ0ZXIoKTsKLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvZmFjdG9yeS9TT0FQRW52ZWxvcGVCbG9ja0ZhY3RvcnkuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvZmFjdG9yeS9TT0FQRW52ZWxvcGVCbG9ja0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjIzNWM2MC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2ZhY3RvcnkvU09BUEVudmVsb3BlQmxvY2tGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5mYWN0b3J5OwotCi0KLS8qKgotICogU09BUEVudmVsb3BlQmxvY2tGYWN0b3J5Ci0gKiA8cC8+Ci0gKiBDcmVhdGVzIGEgU09BUEVudmVsb3BlQmxvY2sKLSAqIDxwLz4KLSAqIFRoZSBGYWN0b3J5UmVnaXN0cnkgc2hvdWxkIGJlIHVzZWQgdG8gZ2V0IGFjY2VzcyB0byB0aGUgRmFjdG9yeQotICoKLSAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5yZWdpc3RyeS5GYWN0b3J5UmVnaXN0cnkKLSAqLwotcHVibGljIGludGVyZmFjZSBTT0FQRW52ZWxvcGVCbG9ja0ZhY3RvcnkgZXh0ZW5kcyBCbG9ja0ZhY3RvcnkgewotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2ZhY3RvcnkvU291cmNlQmxvY2tGYWN0b3J5LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2ZhY3RvcnkvU291cmNlQmxvY2tGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyYjkwOWMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9mYWN0b3J5L1NvdXJjZUJsb2NrRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZmFjdG9yeTsKLQotCi0vKioKLSAqIFNvdXJjZUJsb2NrRmFjdG9yeQotICogPHAvPgotICogQ3JlYXRlcyBhIFNvdXJjZUJsb2NrCi0gKiA8cC8+Ci0gKiBUaGUgRmFjdG9yeVJlZ2lzdHJ5IHNob3VsZCBiZSB1c2VkIHRvIGdldCBhY2Nlc3MgdG8gdGhlIEZhY3RvcnkKLSAqCi0gKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MucmVnaXN0cnkuRmFjdG9yeVJlZ2lzdHJ5Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU291cmNlQmxvY2tGYWN0b3J5IGV4dGVuZHMgQmxvY2tGYWN0b3J5IHsKLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9mYWN0b3J5L1hNTFBhcnRGYWN0b3J5LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2ZhY3RvcnkvWE1MUGFydEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU5MGZmMC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2ZhY3RvcnkvWE1MUGFydEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuUHJvdG9jb2w7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLlhNTFBhcnQ7Ci0KLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRW52ZWxvcGU7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247Ci0KLS8qKgotICogWE1MUGFydEZhY3RvcnkKLSAqIDxwLz4KLSAqIENyZWF0ZXMgYW4gWE1MUGFydCBvYmplY3QuICBUaGUgdHdvIGNvbW1vbiBwYXR0ZXJucyBhcmU6IC0gQ3JlYXRlIGFuIGVtcHR5IG1lc3NhZ2UgZm9yIGEgc3BlY2lmaWMKLSAqIHByb3RvY29sIC0gQ3JlYXRlIGEgeG1sUGFydCBzb3VyY2VkIGZyb20gT00gKFhNTFN0cmVhbVJlYWRlcikKLSAqIDxwLz4KLSAqIFRoZSBGYWN0b3J5UmVnaXN0cnkgc2hvdWxkIGJlIHVzZWQgdG8gZ2V0IGFjY2VzcyB0byB0aGUgRmFjdG9yeQotICoKLSAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5yZWdpc3RyeS5GYWN0b3J5UmVnaXN0cnkKLSAqLwotcHVibGljIGludGVyZmFjZSBYTUxQYXJ0RmFjdG9yeSB7Ci0gICAgLyoqCi0gICAgICogY3JlYXRlIFhNTFBhcnQgZnJvbSBYTUxTdHJlYW1SZWFkZXIKLSAgICAgKgotICAgICAqIEBwYXJhbSByZWFkZXIgICBYTUxTdHJlYW1SZWFkZXIKLSAgICAgKiBAcGFyYW0gcHJvdG9jb2wgKGlmIG51bGwsIHRoZSBzb2FwIHByb3RvY29sIGlzIGluZmVycmVkIGZyb20gdGhlIG5hbWVzcGFjZSkKLSAgICAgKiBAdGhyb3dzIE1lc3NhZ2VTdHJlYW1FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgWE1MUGFydCBjcmVhdGVGcm9tKFhNTFN0cmVhbVJlYWRlciByZWFkZXIsIFByb3RvY29sIHByb3RvY29sKQotICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgV2ViU2VydmljZUV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIGNyZWF0ZSBYTUxQYXJ0IGZyb20gT01FbGVtZW50Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gb21FbGVtZW50IE9NRWxlbWVudAotICAgICAqIEBwYXJhbSBwcm90b2NvbCAgKGlmIG51bGwsIHRoZSBzb2FwIHByb3RvY29sIGlzIGluZmVycmVkIGZyb20gdGhlIG5hbWVzcGFjZSkKLSAgICAgKiBAdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgWE1MUGFydCBjcmVhdGVGcm9tKE9NRWxlbWVudCBvbUVsZW1lbnQsIFByb3RvY29sIHByb3RvY29sKQotICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgV2ViU2VydmljZUV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIGNyZWF0ZSBYTUxQYXJ0IGZyb20gU09BUEVudmVsb3BlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc29hcEVudmVsb3BlIFNPQVBFbnZlbG9wZQotICAgICAqIEB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBYTUxQYXJ0IGNyZWF0ZUZyb20oU09BUEVudmVsb3BlIHNvYXBFbnZlbG9wZSkKLSAgICAgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sIFdlYlNlcnZpY2VFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBjcmVhdGUgZW1wdHkgWE1MUGFydCBvZiB0aGUgc3BlY2lmaWVkIHByb3RvY29sCi0gICAgICogQHBhcmFtIHByb3RvY29sCi0gICAgICogQHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIFhNTFBhcnQgY3JlYXRlKFByb3RvY29sIHByb3RvY29sKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uLCBXZWJTZXJ2aWNlRXhjZXB0aW9uOwotCQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9mYWN0b3J5L1hNTFN0cmluZ0Jsb2NrRmFjdG9yeS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9mYWN0b3J5L1hNTFN0cmluZ0Jsb2NrRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDlmMTIzLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvZmFjdG9yeS9YTUxTdHJpbmdCbG9ja0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmZhY3Rvcnk7Ci0KLQotLyoqCi0gKiBYTUxTdHJpbmdCbG9ja0ZhY3RvcnkKLSAqIDxwLz4KLSAqIENyZWF0ZXMgYSBYTUxTdHJpbmdCbG9jawotICogPHAvPgotICogVGhlIEZhY3RvcnlSZWdpc3RyeSBzaG91bGQgYmUgdXNlZCB0byBnZXQgYWNjZXNzIHRvIHRoZSBGYWN0b3J5Ci0gKgotICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnJlZ2lzdHJ5LkZhY3RvcnlSZWdpc3RyeQotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhNTFN0cmluZ0Jsb2NrRmFjdG9yeSBleHRlbmRzIEJsb2NrRmFjdG9yeSB7Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvaW1wbC9CbG9ja0ZhY3RvcnlJbXBsLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2ltcGwvQmxvY2tGYWN0b3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDhjMTA2Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvaW1wbC9CbG9ja0ZhY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5pbXBsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmJ1aWxkZXIuU3RBWE9NQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuQmxvY2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmZhY3RvcnkuQmxvY2tGYWN0b3J5OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKLQotLyoqIEJsb2NrRmFjdG9yeUltcGwgQWJzdHJhY3QgQmFzZSBDbGFzcyBmb3IgdGhlIEJsb2NrIEZhY3RvcmllcyAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEJsb2NrRmFjdG9yeUltcGwgaW1wbGVtZW50cyBCbG9ja0ZhY3RvcnkgewotCi0gICAgcHVibGljIEJsb2NrRmFjdG9yeUltcGwoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5CbG9ja0ZhY3RvcnkjY3JlYXRlRnJvbShvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuQmxvY2ssIGphdmEubGFuZy5PYmplY3QpCi0gICAgICAqLwotICAgIHB1YmxpYyBCbG9jayBjcmVhdGVGcm9tKEJsb2NrIG90aGVyLCBPYmplY3QgY29udGV4dCkKLSAgICAgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICAvLyBUaGlzIGlzIHRoZSBkZWZhdWx0IGJlaGF2aW9yLiAgRGVyaXZlZCBGYWN0b3JpZXMgbWF5Ci0gICAgICAgIC8vIHByb3ZpZGUgYSBtb3JlIHBlcmZvcm1hbnQgaW1wbGVtZW50YXRpb24uCi0gICAgICAgIGlmIChvdGhlci5nZXRCbG9ja0ZhY3RvcnkoKS5lcXVhbHModGhpcykpIHsKLSAgICAgICAgICAgIGlmIChvdGhlci5nZXRCdXNpbmVzc0NvbnRleHQoKSA9PSBudWxsICYmCi0gICAgICAgICAgICAgICAgICAgIGNvbnRleHQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBvdGhlcjsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAob3RoZXIuZ2V0QnVzaW5lc3NDb250ZXh0KCkgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgICAgICBvdGhlci5nZXRCdXNpbmVzc0NvbnRleHQoKS5lcXVhbHMoY29udGV4dCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gb3RoZXI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgUU5hbWUgcU5hbWUgPSBudWxsOwotICAgICAgICBpZiAob3RoZXIuaXNRTmFtZUF2YWlsYWJsZSgpKSB7Ci0gICAgICAgICAgICBxTmFtZSA9IG90aGVyLmdldFFOYW1lKCk7Ci0gICAgICAgIH0KLSAgICAgICAgQmxvY2sgbmV3QmxvY2sgPSBjcmVhdGVGcm9tKG90aGVyLmdldFhNTFN0cmVhbVJlYWRlcih0cnVlKSwgY29udGV4dCwgcU5hbWUpOwotICAgICAgICByZXR1cm4gbmV3QmxvY2s7Ci0gICAgfQotCi0gICAgcHVibGljIEJsb2NrIGNyZWF0ZUZyb20oWE1MU3RyZWFtUmVhZGVyIHJlYWRlciwgT2JqZWN0IGNvbnRleHQsIFFOYW1lIHFOYW1lKQotICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0QVhPTUJ1aWxkZXIgYnVpbGRlciA9IG5ldyBTdEFYT01CdWlsZGVyKHJlYWRlcik7Ci0gICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSBidWlsZGVyLmdldERvY3VtZW50RWxlbWVudCgpOwotICAgICAgICByZXR1cm4gY3JlYXRlRnJvbShvbUVsZW1lbnQsIGNvbnRleHQsIG9tRWxlbWVudC5nZXRRTmFtZSgpKTsKLSAgICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9pbXBsL0Jsb2NrSW1wbC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9pbXBsL0Jsb2NrSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzg5NGFkLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvaW1wbC9CbG9ja0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwMiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5pbXBsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTURhdGFTb3VyY2VFeHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NT3V0cHV0Rm9ybWF0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uZHMuQnl0ZUFycmF5RGF0YVNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuTVRPTVhNTFN0cmVhbVdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuYnVpbGRlci5TdEFYT01CdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5TdEFYVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5FeGNlcHRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaTE4bi5NZXNzYWdlczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuQmxvY2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmZhY3RvcnkuQmxvY2tGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS51dGlsLlJlYWRlcjJXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zcGkuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MudXRpbGl0eS5KYXZhVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotLyoqCi0gKiBCbG9ja0ltcGwgQWJzdHJhY3QgQmFzZSBjbGFzcyBmb3IgdmFyaW91cyBCbG9jayBJbXBsZW1lbnRhdGlvbnMuCi0gKiA8cC8+Ci0gKiBUaGUgYmFzZSBjbGFzcyB0YWtlcyBjYXJlIG9mIGNvbnRyb2xsaW5nIHRoZSB0cmFuc2Zvcm1hdGlvbnMgYmV0d2VlbiBCdXNpbmVzc09iamVjdCwKLSAqIFhNTFN0cmVhbVJlYWRlciBhbmQgU09BUEVsZW1lbnQgQSBkZXJpdmVkIGNsYXNzIG11c3QgbWluaW1hbGx5IGRlZmluZSB0aGUgZm9sbG93aW5nOgotICogX2dldEJPRnJvbVJlYWRlciBfZ2V0UmVhZGVyRnJvbUJPIF9vdXRwdXRGcm9tQk8KLSAqIDxwLz4KLSAqIEluIGFkZHRpb24sIHRoZSBkZXJpdmVkIGNsYXNzIG1heSB3YW50IHRvIG92ZXJyaWRlIHRoZSBmb2xsb3dpbmc6IF9nZXRCT0Zyb21CTyAuLi5pZiB0aGUKLSAqIEJ1c2luZXNzT2JqZWN0IGlzIGNvbnN1bWVkIHdoZW4gcmVhZCAoaS5lLiBpdCBpcyBhbiBJbnB1dFNvdXJjZSkKLSAqIDxwLz4KLSAqIFRoZSBkZXJpdmVkIGNsYXNzZXMgZG9uJ3QgaGF2ZSBkaXJlY3QgYWNjZXNzIHRvIHRoZSBpbnN0YW5jZSBkYXRhLiBUaGlzIGVuc3VyZXMgdGhhdCBCbG9ja0ltcGwKLSAqIGNvbnRyb2xzIHRoZSB0cmFuc2Zvcm1hdGlvbnMuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCbG9ja0ltcGwgaW1wbGVtZW50cyBCbG9jayB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coQmxvY2tJbXBsLmNsYXNzKTsKLQotICAgIHByb3RlY3RlZCBPYmplY3QgYnVzT2JqZWN0OwotICAgIHByb3RlY3RlZCBPYmplY3QgYnVzQ29udGV4dDsKLQotICAgIHByb3RlY3RlZCBPTUVsZW1lbnQgb21FbGVtZW50ID0gbnVsbDsKLQotICAgIHByb3RlY3RlZCBRTmFtZSBxTmFtZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gbm9RTmFtZUF2YWlsYWJsZSA9IGZhbHNlOwotICAgIAotICAgIHByb3RlY3RlZCBCbG9ja0ZhY3RvcnkgZmFjdG9yeTsKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBjb25zdW1lZCA9IGZhbHNlOwotICAgIHByb3RlY3RlZCBNZXNzYWdlIHBhcmVudDsKLSAgICAKLSAgICBwcml2YXRlIEhhc2hNYXAgbWFwID0gbnVsbDsgLy8gT01EYXRhU291cmNlRXh0IHByb3BlcnRpZXMKLQotICAgIC8qKgotICAgICAqIEEgQmxvY2sgaGFzIHRoZSBmb2xsb3dpbmcgY29tcG9uZW50cwotICAgICAqCi0gICAgICogQHBhcmFtIGJ1c09iamVjdAotICAgICAqIEBwYXJhbSBidXNDb250ZXh0IG9yIG51bGwKLSAgICAgKiBAcGFyYW0gcU5hbWUgICAgICBvciBudWxsIGlmIHVua25vd24KLSAgICAgKiBAcGFyYW0gZmFjdG9yeSAgICB0aGF0IGNyZWF0ZXMgdGhlIEJsb2NrCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEJsb2NrSW1wbChPYmplY3QgYnVzT2JqZWN0LCBPYmplY3QgYnVzQ29udGV4dCwgUU5hbWUgcU5hbWUsIEJsb2NrRmFjdG9yeSBmYWN0b3J5KSB7Ci0gICAgICAgIHRoaXMuYnVzT2JqZWN0ID0gYnVzT2JqZWN0OwotICAgICAgICB0aGlzLmJ1c0NvbnRleHQgPSBidXNDb250ZXh0OwotICAgICAgICB0aGlzLnFOYW1lID0gcU5hbWU7Ci0gICAgICAgIHRoaXMuZmFjdG9yeSA9IGZhY3Rvcnk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQSBCbG9jayBoYXMgdGhlIGZvbGxvd2luZyBjb21wb25lbnRzCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVhZGVyCi0gICAgICogQHBhcmFtIGJ1c0NvbnRleHQgb3IgbnVsbAotICAgICAqIEBwYXJhbSBxTmFtZSAgICAgIG9yIG51bGwgaWYgdW5rbm93bgotICAgICAqIEBwYXJhbSBmYWN0b3J5ICAgIHRoYXQgY3JlYXRlcyB0aGUgQmxvY2sKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQmxvY2tJbXBsKE9NRWxlbWVudCBvbUVsZW1lbnQsIE9iamVjdCBidXNDb250ZXh0LCBRTmFtZSBxTmFtZSwgQmxvY2tGYWN0b3J5IGZhY3RvcnkpIHsKLSAgICAgICAgdGhpcy5vbUVsZW1lbnQgPSBvbUVsZW1lbnQ7Ci0gICAgICAgIHRoaXMuYnVzQ29udGV4dCA9IGJ1c0NvbnRleHQ7Ci0gICAgICAgIHRoaXMucU5hbWUgPSBxTmFtZTsKLSAgICAgICAgdGhpcy5mYWN0b3J5ID0gZmFjdG9yeTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLkJsb2NrI2dldEJsb2NrRmFjdG9yeSgpCi0gICAgICAqLwotICAgIHB1YmxpYyBCbG9ja0ZhY3RvcnkgZ2V0QmxvY2tGYWN0b3J5KCkgewotICAgICAgICByZXR1cm4gZmFjdG9yeTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLkJsb2NrI2dldEJ1c2luZXNzQ29udGV4dCgpCi0gICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0QnVzaW5lc3NDb250ZXh0KCkgewotICAgICAgICByZXR1cm4gYnVzQ29udGV4dDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWVzc2FnZSBnZXRQYXJlbnQoKSB7Ci0gICAgICAgIHJldHVybiBwYXJlbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGFyZW50KE1lc3NhZ2UgcCkgewotICAgICAgICBwYXJlbnQgPSBwOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuQmxvY2sjZ2V0QnVzaW5lc3NPYmplY3QoYm9vbGVhbikKLSAgICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRCdXNpbmVzc09iamVjdChib29sZWFuIGNvbnN1bWUpCi0gICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uLCBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGNvbnN1bWVkKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRNZXNzYWdlKCJCbG9ja0ltcGxFcnIxIiwgdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChidXNPYmplY3QgIT0gbnVsbCkgewotICAgICAgICAgICAgYnVzT2JqZWN0ID0gX2dldEJPRnJvbUJPKGJ1c09iamVjdCwgYnVzQ29udGV4dCwgY29uc3VtZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBUcmFuc2Zvcm0gcmVhZGVyIGludG8gYnVzaW5lc3Mgb2JqZWN0Ci0gICAgICAgICAgICBidXNPYmplY3QgPSBfZ2V0Qk9Gcm9tT00ob21FbGVtZW50LCBidXNDb250ZXh0KTsKLSAgICAgICAgICAgIG9tRWxlbWVudCA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTYXZlIHRoZSBidXNpbmVzc09iamVjdCBpbiBhIGxvY2FsIHZhcmlhYmxlCi0gICAgICAgIC8vIHNvIHRoYXQgd2UgY2FuIHJlc2V0IHRoZSBCbG9jayBpZiBjb25zdW1lIHdhcyBpbmRpY2F0ZWQKLSAgICAgICAgT2JqZWN0IG5ld0J1c09iamVjdCA9IGJ1c09iamVjdDsKLSAgICAgICAgc2V0Q29uc3VtZWQoY29uc3VtZSk7Ci0gICAgICAgIHJldHVybiBuZXdCdXNPYmplY3Q7Ci0gICAgfQotICAgIAotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5CbG9jayNnZXRRTmFtZSgpCi0gICAgICAqLwotICAgIHB1YmxpYyBRTmFtZSBnZXRRTmFtZSgpIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gSWYgdGhlIFFOYW1lIGlzIG5vdCBrbm93biwgZmluZCBpdAotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKHFOYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBJZiBhIHByaW9yIGNhbGwgZGlzY292ZXJlZCB0aGF0IHRoaXMgY29udGVudCBoYXMgbm8gUU5hbWUsIHRoZW4gcmV0dXJuIG51bGwKLSAgICAgICAgICAgICAgICBpZiAobm9RTmFtZUF2YWlsYWJsZSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG9tRWxlbWVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgbmV3UmVhZGVyID0gX2dldFJlYWRlckZyb21CTyhidXNPYmplY3QsIGJ1c0NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnVzT2JqZWN0ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0QVhPTUJ1aWxkZXIgYnVpbGRlciA9IG5ldyBTdEFYT01CdWlsZGVyKG5ld1JlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvbUVsZW1lbnQgPSBidWlsZGVyLmdldERvY3VtZW50RWxlbWVudCgpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gU29tZSBibG9ja3MgbWF5IHJlcHJlc2VudCBub24tZWxlbWVudCBkYXRhCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkV4Y2VwdGlvbiBvY2N1cnJlZCB3aGlsZSBvYnRhaW5pbmcgUU5hbWU6IiArIGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNFbGVtZW50RGF0YSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBibG9jayBjYW4gaG9sZCBub24tZWxlbWVudCBkYXRhLCB0aGVuIGFjY2VwdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBmYWN0IHRoYXQgdGhlcmUgaXMgbm8gcW5hbWUgYW5kIGNvbnRpbnVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiVGhlIGJsb2NrIGRvZXMgbm90IGNvbnRhaW4gYW4geG1sIGVsZW1lbnQuIFByb2Nlc3NpbmcgY29udGludWVzLiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbmRpY2F0ZSB0aGF0IHRoZSBjb250ZW50IGhhcyBubyBRTmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBleGNlcHRpb24gaXMgc3dhbGxvd2VkLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vUU5hbWVBdmFpbGFibGUgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgfSAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGNvbnRlbnQgc2hvdWxkIGNvbnRhaW4geG1sLiAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmV0aHJvd2luZyB0aGUgZXhjZXB0aW9uLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcU5hbWUgPSBvbUVsZW1lbnQuZ2V0UU5hbWUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBxTmFtZTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIHhzZSkgewotICAgICAgICAgICAgc2V0Q29uc3VtZWQodHJ1ZSk7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKHhzZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCBpcyBpbnRlbmRlZCBmb3IgZGVyaXZlZCBvYmplY3RzIHRvIHNldCB0aGUgcU5hbWUKLSAgICAgKgotICAgICAqIEBwYXJhbSBxTmFtZQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldFFOYW1lKFFOYW1lIHFOYW1lKSB7Ci0gICAgICAgIHRoaXMucU5hbWUgPSBxTmFtZTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLkJsb2NrI2dldFhNTFN0cmVhbVJlYWRlcihib29sZWFuKQotICAgICAgKi8KLSAgICBwdWJsaWMgWE1MU3RyZWFtUmVhZGVyIGdldFhNTFN0cmVhbVJlYWRlcihib29sZWFuIGNvbnN1bWUpCi0gICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uLCBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIG5ld1JlYWRlciA9IG51bGw7Ci0gICAgICAgIGlmIChjb25zdW1lZCkgewotICAgICAgICAgICAgLy8gSW4gc29tZSBzY2VuYXJpb3MsIHRoZSBtZXNzYWdlIGlzIHdyaXR0ZW4gb3V0IGFmdGVyIHRoZSBzZXJ2aWNlIGluc3RhbmNlIGlzIGludm9rZWQuCi0gICAgICAgICAgICAvLyBJbiB0aGVzZSBzaXR1YXRpb25zLCBpdCBpcyBwcmVmZXJhYmxlIHRvIHNpbXBseSBpZ25vcmUgdGhpcyBibG9jay4KLSAgICAgICAgICAgIGlmICh0aGlzLmdldFBhcmVudCgpICE9IG51bGwgJiYgZ2V0UGFyZW50KCkuaXNQb3N0UGl2b3QoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBfcG9zdFBpdm90X2dldFhNTFN0cmVhbVJlYWRlcigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZ2V0TWVzc2FnZSgiQmxvY2tJbXBsRXJyMSIsIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAob21FbGVtZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChjb25zdW1lKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG9tRWxlbWVudC5nZXRCdWlsZGVyKCkgIT0gbnVsbCAmJiAhb21FbGVtZW50LmdldEJ1aWxkZXIoKS5pc0NvbXBsZXRlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5ld1JlYWRlciA9IG9tRWxlbWVudC5nZXRYTUxTdHJlYW1SZWFkZXJXaXRob3V0Q2FjaGluZygpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG5ld1JlYWRlciA9IG9tRWxlbWVudC5nZXRYTUxTdHJlYW1SZWFkZXIoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb21FbGVtZW50ID0gbnVsbDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbmV3UmVhZGVyID0gb21FbGVtZW50LmdldFhNTFN0cmVhbVJlYWRlcigpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGJ1c09iamVjdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBHZXR0aW5nIHRoZSByZWFkZXIgZG9lcyBub3QgZGVzdHJveSB0aGUgQnVzaW5lc3NPYmplY3QKLSAgICAgICAgICAgIGJ1c09iamVjdCA9IF9nZXRCT0Zyb21CTyhidXNPYmplY3QsIGJ1c0NvbnRleHQsIGNvbnN1bWUpOwotICAgICAgICAgICAgbmV3UmVhZGVyID0gX2dldFJlYWRlckZyb21CTyhidXNPYmplY3QsIGJ1c0NvbnRleHQpOwotICAgICAgICB9Ci0gICAgICAgIHNldENvbnN1bWVkKGNvbnN1bWUpOwotICAgICAgICByZXR1cm4gbmV3UmVhZGVyOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZSNnZXRSZWFkZXIoKQotICAgICAgKi8KLSAgICBwdWJsaWMgWE1MU3RyZWFtUmVhZGVyIGdldFJlYWRlcigpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZ2V0WE1MU3RyZWFtUmVhZGVyKHRydWUpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZSNzZXJpYWxpemUoamF2YS5pby5PdXRwdXRTdHJlYW0sIG9yZy5hcGFjaGUuYXhpb20ub20uT01PdXRwdXRGb3JtYXQpCi0gICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShPdXRwdXRTdHJlYW0gb3V0cHV0LCBPTU91dHB1dEZvcm1hdCBmb3JtYXQpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBNVE9NWE1MU3RyZWFtV3JpdGVyIHdyaXRlciA9IG5ldyBNVE9NWE1MU3RyZWFtV3JpdGVyKG91dHB1dCwgZm9ybWF0KTsKLSAgICAgICAgc2VyaWFsaXplKHdyaXRlcik7Ci0gICAgICAgIHdyaXRlci5mbHVzaCgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgd3JpdGVyLmNsb3NlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBBbiBleGNlcHRpb24gY2FuIG9jY3VyIGlmIG5vdGhpbmcgaXMgd3JpdHRlbiB0byB0aGUgCi0gICAgICAgICAgICAvLyB3cml0ZXIuICBUaGlzIGlzIHBvc3NpYmxlIGlmIHRoZSB1bmRlcmx5aW5nIGRhdGEgc291cmNlCi0gICAgICAgICAgICAvLyB3cml0ZXJzIHRvIHRoZSBvdXRwdXQgc3RyZWFtIGRpcmVjdGx5LgotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJDYXRjaGluZyBhbmQgc3dhbGxvd2luZyBleGNlcHRpb24gIiArIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlI3NlcmlhbGl6ZShqYXZhLmlvLldyaXRlciwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU91dHB1dEZvcm1hdCkKLSAgICAgICovCi0gICAgcHVibGljIHZvaWQgc2VyaWFsaXplKFdyaXRlciB3cml0ZXJUYXJnZXQsIE9NT3V0cHV0Rm9ybWF0IGZvcm1hdCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIE1UT01YTUxTdHJlYW1Xcml0ZXIgd3JpdGVyID0KLSAgICAgICAgICAgICAgICBuZXcgTVRPTVhNTFN0cmVhbVdyaXRlcihTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtV3JpdGVyKHdyaXRlclRhcmdldCkpOwotICAgICAgICB3cml0ZXIuc2V0T3V0cHV0Rm9ybWF0KGZvcm1hdCk7Ci0gICAgICAgIHNlcmlhbGl6ZSh3cml0ZXIpOwotICAgICAgICB3cml0ZXIuZmx1c2goKTsKLSAgICAgICAgd3JpdGVyLmNsb3NlKCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlI3NlcmlhbGl6ZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlcikKLSAgICAgICovCi0gICAgcHVibGljIHZvaWQgc2VyaWFsaXplKFhNTFN0cmVhbVdyaXRlciB3cml0ZXIpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBvdXRwdXRUbyh3cml0ZXIsIGlzRGVzdHJ1Y3RpdmVXcml0ZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT01FbGVtZW50IGdldE9NRWxlbWVudCgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICBPTUVsZW1lbnQgbmV3T01FbGVtZW50ID0gbnVsbDsKLSAgICAgICAgYm9vbGVhbiBjb25zdW1lID0gdHJ1ZTsgIC8vIGdldCB0aGUgT00gY29uc3VtZXMgdGhlIG1lc3NhZ2UKLSAgICAgICAgaWYgKGNvbnN1bWVkKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRNZXNzYWdlKCJCbG9ja0ltcGxFcnIxIiwgdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChvbUVsZW1lbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgbmV3T01FbGVtZW50ID0gb21FbGVtZW50OwotICAgICAgICB9IGVsc2UgaWYgKGJ1c09iamVjdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBHZXR0aW5nIHRoZSByZWFkZXIgZG9lcyBub3QgZGVzdHJveSB0aGUgQnVzaW5lc3NPYmplY3QKLSAgICAgICAgICAgIGJ1c09iamVjdCA9IF9nZXRCT0Zyb21CTyhidXNPYmplY3QsIGJ1c0NvbnRleHQsIGNvbnN1bWUpOwotICAgICAgICAgICAgbmV3T01FbGVtZW50ID0gX2dldE9NRnJvbUJPKGJ1c09iamVjdCwgYnVzQ29udGV4dCk7Ci0gICAgICAgIH0KLSAgICAgICAgc2V0Q29uc3VtZWQoY29uc3VtZSk7Ci0gICAgICAgIHJldHVybiBuZXdPTUVsZW1lbnQ7Ci0gICAgfQotICAgIAotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5CbG9jayNpc0NvbnN1bWVkKCkKLSAgICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNDb25zdW1lZCgpIHsKLSAgICAgICAgcmV0dXJuIGNvbnN1bWVkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE9uY2UgY29uc3VtZWQsIGFsbCBpbnN0YW5jZSBkYXRhIG9iamVjdHMgYXJlIG51bGxpZmllZCB0byBwcmV2ZW50IHN1YnNlcXVlbnQgYWNjZXNzCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29uc3VtZQotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDb25zdW1lZChib29sZWFuIGNvbnN1bWUpIHsKLSAgICAgICAgaWYgKGNvbnN1bWUpIHsKLSAgICAgICAgICAgIHRoaXMuY29uc3VtZWQgPSB0cnVlOwotICAgICAgICAgICAgYnVzT2JqZWN0ID0gbnVsbDsKLSAgICAgICAgICAgIGJ1c0NvbnRleHQgPSBudWxsOwotICAgICAgICAgICAgb21FbGVtZW50ID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgc3RhY2sgdHJhY2UgY29uc3VtZXMgaW5kaWNhdGVzIHdoZXJlIHRoZSBtZXNzYWdlIGlzIGNvbnN1bWVkCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJNZXNzYWdlIEJsb2NrIE1vbml0b3I6IEFjdGlvbj1Db25zdW1lZCIpOwotICAgICAgICAgICAgICAgIGxvZy50cmFjZShKYXZhVXRpbHMuc3RhY2tUb1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNvbnN1bWVkID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1FOYW1lQXZhaWxhYmxlKCkgewotICAgICAgICByZXR1cm4gKHFOYW1lICE9IG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG91dHB1dFRvKFhNTFN0cmVhbVdyaXRlciB3cml0ZXIsIGJvb2xlYW4gY29uc3VtZSkKLSAgICAgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiU3RhcnQgb3V0cHV0VG8iKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY29uc3VtZWQpIHsKLSAgICAgICAgICAgIC8vIEluIHNvbWUgc2NlbmFyaW9zLCB0aGUgbWVzc2FnZSBpcyB3cml0dGVuIG91dCBhZnRlciB0aGUgc2VydmljZSBpbnN0YW5jZSBpcyBpbnZva2VkLgotICAgICAgICAgICAgLy8gSW4gdGhlc2Ugc2l0dWF0aW9ucywgaXQgaXMgcHJlZmVyYWJsZSB0byBzaW1wbHkgaWdub3JlIHRoaXMgYmxvY2suCi0gICAgICAgICAgICBpZiAodGhpcy5nZXRQYXJlbnQoKSAhPSBudWxsICYmIGdldFBhcmVudCgpLmlzUG9zdFBpdm90KCkpIHsKLSAgICAgICAgICAgICAgICBfcG9zdFBpdm90X291dHB1dFRvKHdyaXRlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRNZXNzYWdlKCJCbG9ja0ltcGxFcnIxIiwgdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChvbUVsZW1lbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgX291dHB1dEZyb21PTShvbUVsZW1lbnQsIHdyaXRlciwgY29uc3VtZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoYnVzT2JqZWN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiV3JpdGUgYnVzaW5lc3Mgb2JqZWN0Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBidXNPYmplY3QgPSBfZ2V0Qk9Gcm9tQk8oYnVzT2JqZWN0LCBidXNDb250ZXh0LCBjb25zdW1lKTsKLSAgICAgICAgICAgIF9vdXRwdXRGcm9tQk8oYnVzT2JqZWN0LCBidXNDb250ZXh0LCB3cml0ZXIpOwotICAgICAgICB9Ci0gICAgICAgIHNldENvbnN1bWVkKGNvbnN1bWUpOwotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiRW5kIG91dHB1dFRvIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCBpZiB3ZSBoYXZlIHBhc3NlZCB0aGUgcGl2b3QgcG9pbnQgYnV0IHNvbWVvbmUgd2FudHMgdG8gb3V0cHV0IHRoZSBibG9jay4gVGhlIGFjdHVhbAotICAgICAqIGJsb2NrIGltcGxlbWVudGF0aW9uIG1heSBjaG9vc2UgdG8gb3ZlcnJpZGUgdGhpcyBzZXR0aW5nCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgX3Bvc3RQaXZvdF9vdXRwdXRUbyhYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyKQotICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgUU5hbWUgdGhlUU5hbWUgPSBpc1FOYW1lQXZhaWxhYmxlKCkgPyBnZXRRTmFtZSgpIDogbmV3IFFOYW1lKCJ1bmtub3duIik7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIlRoZSBCbG9jayBmb3IgIiArIHRoZVFOYW1lICsKLSAgICAgICAgICAgICAgICAgICAgIiBpcyBhbHJlYWR5IGNvbnN1bWVkIGFuZCB0aGVyZWZvcmUgaXQgaXMgbm90IHdyaXR0ZW4uIik7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIklmIHlvdSBuZWVkIHRoaXMgYmxvY2sgcHJlc2VydmVkLCBwbGVhc2Ugc2V0IHRoZSAiICsgQ29uc3RhbnRzCi0gICAgICAgICAgICAgICAgICAgIC5TQVZFX1JFUVVFU1RfTVNHICsgIiBwcm9wZXJ0eSBvbiB0aGUgTWVzc2FnZUNvbnRleHQuIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCBpZiB3ZSBoYXZlIHBhc3NlZCB0aGUgcGl2b3QgcG9pbnQgYnV0IHNvbWVvbmUgd2FudHMgdG8gb3V0cHV0IHRoZSBibG9jay4gVGhlIGFjdHVhbAotICAgICAqIGJsb2NrIGltcGxlbWVudGF0aW9uIG1heSBjaG9vc2UgdG8gb3ZlcnJpZGUgdGhpcyBzZXR0aW5nLgotICAgICAqLwotICAgIHByb3RlY3RlZCBYTUxTdHJlYW1SZWFkZXIgX3Bvc3RQaXZvdF9nZXRYTUxTdHJlYW1SZWFkZXIoKQotICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgUU5hbWUgdGhlUU5hbWUgPSBpc1FOYW1lQXZhaWxhYmxlKCkgPyBnZXRRTmFtZSgpIDogbmV3IFFOYW1lKCJ1bmtub3duIik7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIlRoZSBCbG9jayBmb3IgIiArIHRoZVFOYW1lICsKLSAgICAgICAgICAgICAgICAgICAgIiBpcyBhbHJlYWR5IGNvbnN1bWVkIGFuZCB0aGVyZWZvcmUgaXQgaXMgb25seSBwYXJ0aWFsbHkgcmVhZC4iKTsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiSWYgeW91IG5lZWQgdGhpcyBibG9jayBwcmVzZXJ2ZWQsIHBsZWFzZSBzZXQgdGhlICIgKyBDb25zdGFudHMKLSAgICAgICAgICAgICAgICAgICAgLlNBVkVfUkVRVUVTVF9NU0cgKyAiIHByb3BlcnR5IG9uIHRoZSBNZXNzYWdlQ29udGV4dC4iKTsKLSAgICAgICAgfQotICAgICAgICBRTmFtZSBxTmFtZSA9IGdldFFOYW1lKCk7Ci0gICAgICAgIFN0cmluZyB0ZXh0ID0gIiI7Ci0gICAgICAgIGlmIChxTmFtZS5nZXROYW1lc3BhY2VVUkkoKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIHRleHQgPSAiPHByZWZpeDoiICsgcU5hbWUuZ2V0TG9jYWxQYXJ0KCkgKyAiIHhtbG5zOnByZWZpeD0nIiArIHFOYW1lLmdldE5hbWVzcGFjZVVSSSgpICsKLSAgICAgICAgICAgICAgICAgICAgIicvPiI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0ZXh0ID0gIjwiICsgcU5hbWUuZ2V0TG9jYWxQYXJ0KCkgKyAiLz4iOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZ1JlYWRlciBzciA9IG5ldyBTdHJpbmdSZWFkZXIodGV4dCk7Ci0gICAgICAgIHJldHVybiBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKHNyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBibG9jayBpcyBjdXJyZW50bHkgYSBidXNpbmVzcyBvYmplY3QuIERlcml2ZWQgY2xhc3NlcwotICAgICAqICAgICAgICAgbWF5IHVzZSB0aGlzIGluZm9ybWF0aW9uIHRvIGdldCBpbmZvcm1hdGlvbiBpbiBhIHBlcmZvcm1hbnQgd2F5LgotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGlzQnVzaW5lc3NPYmplY3QoKSB7Ci0gICAgICAgIHJldHVybiBidXNPYmplY3QgIT0gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRyYWNlU3RyaW5nKFN0cmluZyBpbmRlbnQpIHsKLSAgICAgICAgLy8gVE9ETyBhZGQgdHJhY2Ugc3RyaW5nCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGlzIHRvIHJldHVybiB0aGUgYnVzaW5lc3Mgb2JqZWN0LiBBIGRlcml2ZWQgYmxvY2sgbWF5IHdhbnQgdG8KLSAgICAgKiBvdmVycmlkZSB0aGlzIGNsYXNzIGlmIHRoZSBidXNpbmVzcyBvYmplY3QgaXMgY29uc3VtZWQgd2hlbiByZWFkICh0aHVzIHRoZSBkZXJ2aXZlZCBibG9jayBtYXkKLSAgICAgKiB3YW50IHRvIG1ha2UgYSBidWZmZXJlZCBjb3B5KSAoQW4gZXhhbXBsZSB1c2UgY2FzZSBmb3Igb3ZlcnJpZGluZyB0aGlzIG1ldGhvZCBpcyB0aGUKLSAgICAgKiBidXNpbmVzc09iamVjdCBpcyBhbiBJbnB1dFNvdXJjZSkKLSAgICAgKgotICAgICAqIEBwYXJhbSBidXNPYmplY3QKLSAgICAgKiBAcGFyYW0gYnVzQ29udGV4dAotICAgICAqIEBwYXJhbSBjb25zdW1lCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHByb3RlY3RlZCBPYmplY3QgX2dldEJPRnJvbUJPKE9iamVjdCBidXNPYmplY3QsIE9iamVjdCBidXNDb250ZXh0LCBib29sZWFuIGNvbnN1bWUpIHsKLSAgICAgICAgcmV0dXJuIGJ1c09iamVjdDsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFRoZSBkZXJpdmVkIGNsYXNzIG11c3QgcHJvdmlkZSBhbiBpbXBsZW1lbnRhdGlvbiB0aGF0IGJ1aWxkcyB0aGUgYnVzaW5lc3Mgb2JqZWN0IGZyb20gdGhlCi0gICAgICogcmVhZGVyCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVhZGVyICAgICBYTUxTdHJlYW1SZWFkZXIsIHdoaWNoIGlzIGNvbnN1bWVkCi0gICAgICogQHBhcmFtIGJ1c0NvbnRleHQKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IE9iamVjdCBfZ2V0Qk9Gcm9tUmVhZGVyKFhNTFN0cmVhbVJlYWRlciByZWFkZXIsIE9iamVjdCBidXNDb250ZXh0KQotICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgV2ViU2VydmljZUV4Y2VwdGlvbjsKLQotICAgIAotICAgIC8qKgotICAgICAqIERlZmF1bHQgbWV0aG9kIGZvciBnZXR0aW5nIGJ1c2luZXNzIG9iamVjdCBmcm9tIE9NLgotICAgICAqIERlcml2ZWQgY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gZ2V0IHRoZSBidXNpbmVzcyBvYmplY3QgZnJvbSBhCi0gICAgICogZGF0YSBzb3VyY2UuCi0gICAgICogCi0gICAgICogQHBhcmFtIG9tCi0gICAgICogQHBhcmFtIGJ1c0NvbnRleHQKLSAgICAgKiBAcmV0dXJuIEJ1c2luZXNzIE9iamVjdAotICAgICAqIEB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIE9iamVjdCBfZ2V0Qk9Gcm9tT00oT01FbGVtZW50IG9tRWxlbWVudCwgT2JqZWN0IGJ1c0NvbnRleHQpCi0gICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyID0gX2dldFJlYWRlckZyb21PTShvbUVsZW1lbnQpOwotICAgICAgICByZXR1cm4gX2dldEJPRnJvbVJlYWRlcihyZWFkZXIsIGJ1c0NvbnRleHQpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBHZXQgYW4gWE1MU3RyZWFtUmVhZGVyIGZvciB0aGUgQnVzaW5lc3NPYmplY3QgVGhlIGRlcml2ZWQgQmxvY2sgbXVzdCBpbXBsZW1lbnQgdGhpcyBtZXRob2QKLSAgICAgKgotICAgICAqIEBwYXJhbSBidXNPYmoKLSAgICAgKiBAcGFyYW0gYnVzQ29udGV4dAotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgWE1MU3RyZWFtUmVhZGVyIF9nZXRSZWFkZXJGcm9tQk8oT2JqZWN0IGJ1c09iaiwgT2JqZWN0IGJ1c0NvbnRleHQpCi0gICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uLCBXZWJTZXJ2aWNlRXhjZXB0aW9uOwotICAgIAotICAgIC8qKgotICAgICAqIEBwYXJhbSBvbUVsZW1lbnQKLSAgICAgKiBAcmV0dXJuIFhNTFN0cmVhbVJlYWRlcgotICAgICAqLwotICAgIHByb3RlY3RlZCBYTUxTdHJlYW1SZWFkZXIgX2dldFJlYWRlckZyb21PTShPTUVsZW1lbnQgb21FbGVtZW50KSB7Ci0gICAgICAgIFhNTFN0cmVhbVJlYWRlciByZWFkZXI7Ci0gICAgICAgIGlmIChvbUVsZW1lbnQuZ2V0QnVpbGRlcigpICE9IG51bGwgJiYgIW9tRWxlbWVudC5nZXRCdWlsZGVyKCkuaXNDb21wbGV0ZWQoKSkgewotICAgICAgICAgICAgcmVhZGVyID0gb21FbGVtZW50LmdldFhNTFN0cmVhbVJlYWRlcldpdGhvdXRDYWNoaW5nKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZWFkZXIgPSBvbUVsZW1lbnQuZ2V0WE1MU3RyZWFtUmVhZGVyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlYWRlcjsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGJ1c09iamVjdAotICAgICAqIEBwYXJhbSBidXNDb250ZXh0Ci0gICAgICogQHJldHVybiBPTUVsZW1lbnQKLSAgICAgKiBAdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCBPTUVsZW1lbnQgX2dldE9NRnJvbUJPKE9iamVjdCBidXNPYmplY3QsIE9iamVjdCBidXNDb250ZXh0KQotICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uLCBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gR2V0dGluZyB0aGUgcmVhZGVyIGRvZXMgbm90IGRlc3Ryb3kgdGhlIEJ1c2luZXNzT2JqZWN0Ci0gICAgICAgIFhNTFN0cmVhbVJlYWRlciBuZXdSZWFkZXIgPSBfZ2V0UmVhZGVyRnJvbUJPKGJ1c09iamVjdCwgYnVzQ29udGV4dCk7Ci0gICAgICAgIFN0QVhPTUJ1aWxkZXIgYnVpbGRlciA9IG5ldyBTdEFYT01CdWlsZGVyKG5ld1JlYWRlcik7Ci0gICAgICAgIHJldHVybiBidWlsZGVyLmdldERvY3VtZW50RWxlbWVudCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE91dHB1dCBSZWFkZXIgY29udGVudHMgdG8gYSBXcml0ZXIuIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGlzIHByb2JhYmx5IHN1ZmZpY2llbnQgZm9yIG1vc3QKLSAgICAgKiBkZXJpdmVkIGNsYXNzZXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVhZGVyCi0gICAgICogQHBhcmFtIHdyaXRlcgotICAgICAqIEB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgX291dHB1dEZyb21SZWFkZXIoWE1MU3RyZWFtUmVhZGVyIHJlYWRlciwgWE1MU3RyZWFtV3JpdGVyIHdyaXRlcikKLSAgICAgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBSZWFkZXIyV3JpdGVyIHIydyA9IG5ldyBSZWFkZXIyV3JpdGVyKHJlYWRlcik7Ci0gICAgICAgIHIydy5vdXRwdXRUbyh3cml0ZXIpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBPdXRwdXQgT01FbGVtZW50IGNvbnRlbnRzIHRvIGEgV3JpdGVyLiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpcyBwcm9iYWJseSBzdWZmaWNpZW50IGZvciBtb3N0Ci0gICAgICogZGVyaXZlZCBjbGFzc2VzLgotICAgICAqCi0gICAgICogQHBhcmFtIG9tCi0gICAgICogQHBhcmFtIHdyaXRlcgotICAgICAqIEB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgX291dHB1dEZyb21PTShPTUVsZW1lbnQgb21FbGVtZW50LCBYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyLCBib29sZWFuIGNvbnN1bWUpCi0gICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGNvbnN1bWUpIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiV3JpdGUgdXNpbmcgT01FbGVtZW50LnNlcmlhbGl6ZUFuZENvbnN1bWUiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG9tRWxlbWVudC5zZXJpYWxpemVBbmRDb25zdW1lKHdyaXRlcik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIldyaXRlIFVzaW5nIE9NRWxlbWVudC5zZXJpYWxpemUiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG9tRWxlbWVudC5zZXJpYWxpemUod3JpdGVyKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZUV4dCNjb3B5KCkKLSAgICAgKi8KLSAgICBwdWJsaWMgT01EYXRhU291cmNlRXh0IGNvcHkoKSB0aHJvd3MgT01FeGNlcHRpb24gewotICAgICAgICAvLyBUT0RPOiBUaGlzIGlzIGEgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbi4gIE11Y2gKLSAgICAgICAgLy8gbW9yZSByZWZhY3RvcmluZyBuZWVkcyB0byBvY2N1ciB0byBhY2NvdW50IGZvciBhdHRhY2htZW50cy4KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFN0cmluZyBlbmNvZGluZyA9ICJ1dGYtOCI7IC8vIENob29zZSBhIGNvbW1vbiBlbmNvZGluZwotICAgICAgICAgICAgYnl0ZVtdIGJ5dGVzID0gdGhpcy5nZXRYTUxCeXRlcyhlbmNvZGluZyk7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEJ5dGVBcnJheURhdGFTb3VyY2UoYnl0ZXMsIGVuY29kaW5nKTsKLSAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgT01FeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBPdXRwdXQgQnVzaW5lc3NPYmplY3QgY29udGVudHMgdG8gYSBXcml0ZXIuCi0gICAgICogRGVyaXZlZCBjbGFzc2VzIG11c3QgcHJvdmlkZSB0aGlzIGltcGxlbWVudGF0aW9uCi0gICAgICogQHBhcmFtIGJ1c09iamVjdAotICAgICAqIEBwYXJhbSBidXNDb250ZXh0Ci0gICAgICogQHBhcmFtIHdyaXRlcgotICAgICAqIEB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgX291dHB1dEZyb21CTyhPYmplY3QgYnVzT2JqZWN0LCBPYmplY3QgYnVzQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTFN0cmVhbVdyaXRlciB3cml0ZXIpCi0gICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uLCBXZWJTZXJ2aWNlRXhjZXB0aW9uOwotCQotICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIGtleSkgewotICAgICAgICBpZiAobWFwID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtYXAuZ2V0KGtleSk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBzZXRQcm9wZXJ0eShTdHJpbmcga2V5LCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgaWYgKG1hcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtYXAucHV0KGtleSwgdmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGhhc1Byb3BlcnR5KFN0cmluZyBrZXkpIHsKLSAgICAgICAgaWYgKG1hcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0gCi0gICAgICAgIHJldHVybiBtYXAuY29udGFpbnNLZXkoa2V5KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2ltcGwvTWVzc2FnZUZhY3RvcnlJbXBsLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2ltcGwvTWVzc2FnZUZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4NzcxOTkuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9pbXBsL01lc3NhZ2VGYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmltcGw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmJ1aWxkZXIuU3RBWE9NQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuT01OYW1lc3BhY2VJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5sbG9tLk9NU291cmNlZEVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLmltcGwuYnVpbGRlci5TdEFYU09BUE1vZGVsQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLkV4Y2VwdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLkJsb2NrOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5NZXNzYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5Qcm90b2NvbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZGF0YWJpbmRpbmcuU09BUEVudmVsb3BlQmxvY2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmRhdGFiaW5kaW5nLkRhdGFTb3VyY2VCbG9jazsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZmFjdG9yeS5NZXNzYWdlRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkhUVFBDb25zdGFudHM7Ci0KLWltcG9ydCBqYXZheC54bWwuc29hcC5BdHRhY2htZW50UGFydDsKLWltcG9ydCBqYXZheC54bWwuc29hcC5NaW1lSGVhZGVyOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLk1pbWVIZWFkZXJzOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBNZXNzYWdlOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotLyoqIE1lc3NhZ2VGYWN0b3J5SW1wbCAqLwotcHVibGljIGNsYXNzIE1lc3NhZ2VGYWN0b3J5SW1wbCBpbXBsZW1lbnRzIE1lc3NhZ2VGYWN0b3J5IHsKLQotICAgIC8qKiBEZWZhdWx0IENvbnN0cnVjdG9yIHJlcXVpcmVkIGZvciBGYWN0b3J5ICovCi0gICAgcHVibGljIE1lc3NhZ2VGYWN0b3J5SW1wbCgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmZhY3RvcnkuTWVzc2FnZUZhY3RvcnkjY3JlYXRlRnJvbShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcikKLSAgICAgICovCi0gICAgcHVibGljIE1lc3NhZ2UgY3JlYXRlRnJvbShYTUxTdHJlYW1SZWFkZXIgcmVhZGVyLCBQcm90b2NvbCBwcm90b2NvbCkKLSAgICAgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICBTdEFYT01CdWlsZGVyIGJ1aWxkZXI7Ci0gICAgICAgIGlmIChwcm90b2NvbCA9PSBQcm90b2NvbC5yZXN0KSB7Ci0gICAgICAgICAgICAvLyBCdWlsZCBhIG5vcm1hbCBPTSB0cmVlCi0gICAgICAgICAgICBidWlsZGVyID0gbmV3IFN0QVhPTUJ1aWxkZXIocmVhZGVyKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIEJ1aWxkIGEgU09BUCBPTSB0cmVlCi0gICAgICAgICAgICBidWlsZGVyID0gbmV3IFN0QVhTT0FQTW9kZWxCdWlsZGVyKHJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCk7ICAvLyBQYXNzIG51bGwgYXMgdGhlIHZlcnNpb24gdG8gdHJpZ2dlciBhdXRvZGV0ZWN0aW9uCi0gICAgICAgIH0KLSAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IGJ1aWxkZXIuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0gICAgICAgIHJldHVybiBjcmVhdGVGcm9tKG9tRWxlbWVudCwgcHJvdG9jb2wpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuTWVzc2FnZUZhY3RvcnkjY3JlYXRlRnJvbShvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCkKLSAgICAgICovCi0gICAgcHVibGljIE1lc3NhZ2UgY3JlYXRlRnJvbShPTUVsZW1lbnQgb21FbGVtZW50LCBQcm90b2NvbCBwcm90b2NvbCkKLSAgICAgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbmV3IE1lc3NhZ2VJbXBsKG9tRWxlbWVudCwgcHJvdG9jb2wpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuTWVzc2FnZUZhY3RvcnkjY3JlYXRlKG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5Qcm90b2NvbCkKLSAgICAgICovCi0gICAgcHVibGljIE1lc3NhZ2UgY3JlYXRlKFByb3RvY29sIHByb3RvY29sKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uLCBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNZXNzYWdlSW1wbChwcm90b2NvbCk7Ci0gICAgfQotCi0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmZhY3RvcnkuTWVzc2FnZUZhY3RvcnkjY3JlYXRlRnJvbShqYXZheC54bWwuc29hcC5TT0FQTWVzc2FnZSkKLSAgICAgICovCi0gICAgcHVibGljIE1lc3NhZ2UgY3JlYXRlRnJvbShTT0FQTWVzc2FnZSBtZXNzYWdlKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uLCBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIENyZWF0ZSBhIE1lc3NhZ2Ugd2l0aCBhbiBYTUxQYXJ0IGZyb20gdGhlIFNPQVBFbnZlbG9wZQotICAgICAgICAgICAgTWVzc2FnZSBtID0gbmV3IE1lc3NhZ2VJbXBsKG1lc3NhZ2UuZ2V0U09BUFBhcnQoKS5nZXRFbnZlbG9wZSgpKTsKLQotICAgICAgICAgICAgTWltZUhlYWRlcnMgbWltZUhlYWRlcnMgPSBtZXNzYWdlLmdldE1pbWVIZWFkZXJzKCk7Ci0gICAgICAgICAgICBIYXNoTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgICAgICBJdGVyYXRvciBpdGVyYXRvciA9IG1pbWVIZWFkZXJzLmdldEFsbEhlYWRlcnMoKTsKLSAgICAgICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBNaW1lSGVhZGVyIG1pbWVIZWFkZXIgPSAoTWltZUhlYWRlcilpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9IG1pbWVIZWFkZXIuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IG1pbWVIZWFkZXIuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBpZihrZXkgIT0gbnVsbCAmJiB2YWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCFIVFRQQ29uc3RhbnRzLkhFQURFUl9DT05URU5UX1RZUEUuZXF1YWxzSWdub3JlQ2FzZShrZXkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtYXAucHV0KGtleSwgdmFsdWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgbS5zZXRNaW1lSGVhZGVycyhtYXApOwotCi0gICAgICAgICAgICBpZiAobWVzc2FnZS5jb3VudEF0dGFjaG1lbnRzKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgSXRlcmF0b3IgaXQgPSBtZXNzYWdlLmdldEF0dGFjaG1lbnRzKCk7Ci0gICAgICAgICAgICAgICAgbS5zZXREb2luZ1NXQSh0cnVlKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEF0dGFjaG1lbnRQYXJ0IGFwID0gKEF0dGFjaG1lbnRQYXJ0KWl0Lm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgbS5hZGREYXRhSGFuZGxlcihhcC5nZXREYXRhSGFuZGxlcigpLCBhcC5nZXRDb250ZW50SWQoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG07Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5mYWN0b3J5Lk1lc3NhZ2VGYWN0b3J5I2NyZWF0ZUZyb20ob3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLkJsb2NrLCBqYXZhLmxhbmcuT2JqZWN0KQotICAgICAgKi8KLSAgICBwdWJsaWMgTWVzc2FnZSBjcmVhdGVGcm9tKEJsb2NrIGJsb2NrLCBPYmplY3QgY29udGV4dCwgUHJvdG9jb2wgcHJvdG9jb2wpCi0gICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uLCBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLQotICAgICAgICAvLyBTbWFsbCBvcHRpbWl6YXRpb24gdG8gcXVpY2tseSBjb25zaWRlciB0aGUgU09BUEVudmVsb3BlIGNhc2UKLSAgICAgICAgaWYgKGJsb2NrIGluc3RhbmNlb2YgU09BUEVudmVsb3BlQmxvY2spIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgTWVzc2FnZUltcGwoKFNPQVBFbnZlbG9wZSlibG9jay5nZXRCdXNpbmVzc09iamVjdCh0cnVlKSwgcHJvdG9jb2wpOwotICAgICAgICB9IGVsc2UgaWYgKGJsb2NrIGluc3RhbmNlb2YgRGF0YVNvdXJjZUJsb2NrKSB7Ci0gICAgICAgICAgICByZXR1cm4gY3JlYXRlRnJvbShibG9jay5nZXRPTUVsZW1lbnQoKSwgcHJvdG9jb2wpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjcmVhdGVGcm9tKGJsb2NrLmdldFhNTFN0cmVhbVJlYWRlcih0cnVlKSwgcHJvdG9jb2wpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9pbXBsL01lc3NhZ2VJbXBsLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2ltcGwvTWVzc2FnZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQxZWUwNy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2ltcGwvTWVzc2FnZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5pbXBsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5hdHRhY2htZW50cy5BdHRhY2htZW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5Sb2xlUGxheWVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5FeGNlcHRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmkxOG4uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLkJsb2NrOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5NZXNzYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5Qcm90b2NvbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuWE1MRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLlhNTFBhcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmF0dGFjaG1lbnRzLkF0dGFjaG1lbnRVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZmFjdG9yeS5CbG9ja0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmZhY3RvcnkuU0FBSkNvbnZlcnRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmZhY3RvcnkuU09BUEVudmVsb3BlQmxvY2tGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5mYWN0b3J5LlhNTFBhcnRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5mYWN0b3J5LlhNTFN0cmluZ0Jsb2NrRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UudXRpbC5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLnV0aWwuU0FBSkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnJlZ2lzdHJ5LkZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXI7Ci1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuU3R5bGU7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5BdHRhY2htZW50UGFydDsKLWltcG9ydCBqYXZheC54bWwuc29hcC5NZXNzYWdlRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5NaW1lSGVhZGVyczsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQQ29uc3RhbnRzOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBFbnZlbG9wZTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQTWVzc2FnZTsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiBNZXNzYWdlSW1wbAotICogQSBNZXNzYWdlIGlzIGFuIFhNTCBwYXJ0ICsgQXR0YWNobWVudHMuCi0gKiBNb3N0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBkZWxlZ2F0ZXMgdG8gdGhlIFhNTFBhcnQgaW1wbGVtZW50YXRpb24uCi0gKiAKLSAqIE5PVEU6IEZvciBYTUwvSFRUUCAoUkVTVCksIGEgU09BUCAxLjEuIEVudmVsb3BlIGlzIGJ1aWx0IGFuZCB0aGUgcmVzdCBwYXlsb2FkIGlzIHBsYWNlZAotICogaW4gdGhlIGJvZHkuICBUaGlzIHB1cnBvc2VseSBtaW1pY3MgdGhlIEF4aXMyIGltcGxlbWVudGF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgTWVzc2FnZUltcGwgaW1wbGVtZW50cyBNZXNzYWdlIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coTWVzc2FnZUltcGwuY2xhc3MpOwotICAgIAotICAgIFByb3RvY29sIHByb3RvY29sID0gUHJvdG9jb2wudW5rbm93bjsgLy8gdGhlIHByb3RvY29sLCBkZWZhdWx0cyB0byB1bmtub3duCi0gICAgWE1MUGFydCB4bWxQYXJ0ID0gbnVsbDsgLy8gdGhlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB4bWxwYXJ0Ci0gICAgCi0gICAgYm9vbGVhbiBtdG9tRW5hYmxlZDsKLSAgICAKLSAgICAvLyBUaGUgdHJhbnNwb3J0IGhlYWRlcnMgYXJlIHN0b3JlZCBpbiBhIE1hcCwgd2hpY2ggaXMgdGhlIAotICAgIC8vIHNhbWUgZGF0YSByZXByZXNlbnRhdGlvbiB1c2VkIGJ5IHRoZSBBeGlzMiBNZXNzYWdlQ29udGV4dCAoVFJBTlNQT1JUX0hFQURFUlMpLgotICAgIHByaXZhdGUgTWFwIHRyYW5zcG9ydEhlYWRlcnMgPSBudWxsOyAKLSAgICAKLSAgICAvLyBUaGUgTWVzc2FnZSBpcyBjb25uZWN0ZWQgdG8gYSBNZXNzYWdlQ29udGV4dC4KLSAgICAvLyBQcmlvciB0byB0aGF0IGNvbm5lY3Rpb24sIGF0dGFjaG1lbnRzIGFyZSBzdG9yZWQgbG9jYWxseQotICAgIC8vIEFmdGVyIHRoZSBjb25uZWN0aW9uLCBhdHRhY2htZW50cyBhcmUgb2J0YWluZWQgZnJvbSB0aGUgTWVzc2FnZUNvbnRleHQKLSAgICBBdHRhY2htZW50cyBhdHRhY2htZW50cyA9IG5ldyBBdHRhY2htZW50cygpOyAgLy8gTG9jYWwgQXR0YWNobWVudHMKLSAgICBwcml2YXRlIE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0OwotICAgIAotICAgIC8vIFNldCBhZnRlciB3ZSBoYXZlIHBhc3QgdGhlIHBpdm90IHBvaW50IHdoZW4gdGhlIG1lc3NhZ2UgaXMgY29uc3VtZWQKLSAgICBwcml2YXRlIGJvb2xlYW4gcG9zdFBpdm90ID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGRvaW5nU1dBID0gZmFsc2U7Ci0gICAgCi0gICAgLyoqCi0gICAgICogTWVzc2FnZUltcGwgc2hvdWxkIGJlIGNvbnN0cnVjdGVkIHZpYSB0aGUgTWVzc2FnZUZhY3RvcnkuCi0gICAgICogVGhpcyBjb25zdHJ1Y3RvciBjb25zdHJ1Y3RzIGFuIGVtcHR5IG1lc3NhZ2Ugd2l0aCB0aGUgc3BlY2lmaWVkIHByb3RvY29sCi0gICAgICogQHBhcmFtIHByb3RvY29sCi0gICAgICovCi0gICAgTWVzc2FnZUltcGwoUHJvdG9jb2wgcHJvdG9jb2wpIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uLCBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBjcmVhdGVYTUxQYXJ0KHByb3RvY29sKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogTWVzc2FnZSBpcyBjb25zdHJ1Y3RlZCBieSB0aGUgTWVzc2FnZUZhY3RvcnkuCi0gICAgICogVGhpcyBjb25zdHJ1Y3RvciBjcmVhdGVzIGEgbWVzc2FnZSBmcm9tIHRoZSBzcGVjaWZpZWQgcm9vdC4KLSAgICAgKiBAcGFyYW0gcm9vdAotICAgICAqIEBwYXJhbSBwcm90b2NvbCBvciBudWxsCi0gICAgICovCi0gICAgTWVzc2FnZUltcGwoT01FbGVtZW50IHJvb3QsIFByb3RvY29sIHByb3RvY29sKSAKLSAgICB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiwgWE1MU3RyZWFtRXhjZXB0aW9uICB7Ci0gICAgICAgIGNyZWF0ZVhNTFBhcnQocm9vdCwgcHJvdG9jb2wpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBNZXNzYWdlIGlzIGNvbnN0cnVjdGVkIGJ5IHRoZSBNZXNzYWdlRmFjdG9yeS4KLSAgICAgKiBUaGlzIGNvbnN0cnVjdG9yIGNyZWF0ZXMgYSBtZXNzYWdlIGZyb20gdGhlIHNwZWNpZmllZCByb290LgotICAgICAqIEBwYXJhbSByb290Ci0gICAgICogQHBhcmFtIHByb3RvY29sIG9yIG51bGwKLSAgICAgKi8KLSAgICBNZXNzYWdlSW1wbChTT0FQRW52ZWxvcGUgcm9vdCkgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24sIFhNTFN0cmVhbUV4Y2VwdGlvbiAgewotICAgICAgICBjcmVhdGVYTUxQYXJ0KHJvb3QpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBuZXcgWE1MUGFydCBhbmQgUHJvdG9jb2wgZnJvbSB0aGUgcm9vdAotICAgICAqIEBwYXJhbSByb290IFNPQVBFbnZlbG9wZQotICAgICAqIEB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVhNTFBhcnQoU09BUEVudmVsb3BlIHJvb3QpIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uLCBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBYTUxQYXJ0RmFjdG9yeSBmYWN0b3J5ID0gKFhNTFBhcnRGYWN0b3J5KSBGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShYTUxQYXJ0RmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgIHhtbFBhcnQgPSBmYWN0b3J5LmNyZWF0ZUZyb20ocm9vdCk7Ci0gICAgICAgIHRoaXMucHJvdG9jb2wgPSB4bWxQYXJ0LmdldFByb3RvY29sKCk7Ci0gICAgICAgIHhtbFBhcnQuc2V0UGFyZW50KHRoaXMpOyAKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbmV3IFhNTFBhcnQgYW5kIFByb3RvY29sIGZyb20gdGhlIHJvb3QKLSAgICAgKiBAcGFyYW0gcm9vdCBPTUVsZW1lbnQKLSAgICAgKiBAdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVYTUxQYXJ0KE9NRWxlbWVudCByb290LCBQcm90b2NvbCBwcm90b2NvbCkgCi0gICAgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24sIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIFhNTFBhcnRGYWN0b3J5IGZhY3RvcnkgPSAoWE1MUGFydEZhY3RvcnkpIEZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KFhNTFBhcnRGYWN0b3J5LmNsYXNzKTsKLSAgICAgICAgeG1sUGFydCA9IGZhY3RvcnkuY3JlYXRlRnJvbShyb290LCBwcm90b2NvbCk7Ci0gICAgICAgIHRoaXMucHJvdG9jb2wgPSB4bWxQYXJ0LmdldFByb3RvY29sKCk7Ci0gICAgICAgIHhtbFBhcnQuc2V0UGFyZW50KHRoaXMpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBuZXcgZW1wdHkgWE1MUGFydCBmcm9tIHRoZSBQcm90b2NvbAotICAgICAqIEBwYXJhbSBwcm90b2NvbAotICAgICAqIEB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVhNTFBhcnQoUHJvdG9jb2wgcHJvdG9jb2wpIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uLCBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICB0aGlzLnByb3RvY29sID0gcHJvdG9jb2w7Ci0gICAgICAgIGlmIChwcm90b2NvbC5lcXVhbHMoUHJvdG9jb2wudW5rbm93bikpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkuCi0gICAgICAgICAgICBtYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJQcm90b2NvbElzTm90S25vd24iKSk7Ci0gICAgICAgIH0gCi0gICAgICAgIFhNTFBhcnRGYWN0b3J5IGZhY3RvcnkgPSAoWE1MUGFydEZhY3RvcnkpIEZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KFhNTFBhcnRGYWN0b3J5LmNsYXNzKTsKLSAgICAgICAgeG1sUGFydCA9IGZhY3RvcnkuY3JlYXRlKHByb3RvY29sKTsKLSAgICAgICAgeG1sUGFydC5zZXRQYXJlbnQodGhpcyk7Ci0gICAgfQotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5NZXNzYWdlI2dldEFzU09BUE1lc3NhZ2UoKQotICAgICAqLwotICAgIHB1YmxpYyBTT0FQTWVzc2FnZSBnZXRBc1NPQVBNZXNzYWdlKCkgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICAKLSAgICAgICAgLy8gVE9ETzogCi0gICAgICAgIC8vIFRoaXMgaXMgYSBub24gcGVyZm9ybWFudCB3YXkgdG8gY3JlYXRlIFNPQVBNZXNzYWdlLiBJIHdpbGwgc2VyaWFsaXplCi0gICAgICAgIC8vIHRoZSB4bWxwYXJ0IGNvbnRlbnQgYW5kIHRoZW4gY3JlYXRlIGFuIElucHV0U3RyZWFtIG9mIGJ5dGUuCi0gICAgICAgIC8vIEZpbmFsbHkgY3JlYXRlIFNPQVBNZXNzYWdlIHVzaW5nIHRoaXMgSW5wdXRTdHJlYW0uCi0gICAgICAgIC8vIFRoZSByZWFsIHNvbHV0aW9uIG1heSBpbnZvbHZlIHVzaW5nIG5vbi1zcGVjLCBpbXBsZW1lbnRhdGlvbgotICAgICAgICAvLyBjb25zdHJ1Y3RvcnMgdG8gY3JlYXRlIGEgTWVzc2FnZSBmcm9tIGFuIEVudmVsb3BlCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoInN0YXJ0IGdldEFzU09BUE1lc3NhZ2UiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEdldCBPTUVsZW1lbnQgZnJvbSBYTUxQYXJ0LgotICAgICAgICAgICAgT01FbGVtZW50IGVsZW1lbnQgPSB4bWxQYXJ0LmdldEFzT01FbGVtZW50KCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIEdldCB0aGUgbmFtZXNwYWNlIHNvIHRoYXQgd2UgY2FuIGRldGVybWluZSBTT0FQMTEgb3IgU09BUDEyCi0gICAgICAgICAgICBPTU5hbWVzcGFjZSBucyA9IGVsZW1lbnQuZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICBlbGVtZW50LnNlcmlhbGl6ZShvdXRTdHJlYW0pOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBJbiBzb21lIGNhc2VzICh1c3VhbGx5IGluYm91bmQpIHRoZSBidWlsZGVyIHdpbGwgbm90IGJlIGNsb3NlZCBhZnRlcgotICAgICAgICAgICAgLy8gc2VyaWFsaXphdGlvbi4gIEluIHRoYXQgY2FzZSBpdCBzaG91bGQgYmUgY2xvc2VkIG1hbnVhbGx5LgotICAgICAgICAgICAgaWYgKGVsZW1lbnQuZ2V0QnVpbGRlcigpICE9IG51bGwgJiYgIWVsZW1lbnQuZ2V0QnVpbGRlcigpLmlzQ29tcGxldGVkKCkpIHsKLSAgICAgICAgICAgICAgICBlbGVtZW50LmNsb3NlKGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgYnl0ZVtdIGJ5dGVzID0gb3V0U3RyZWFtLnRvQnl0ZUFycmF5KCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyB0ZXh0ID0gbmV3IFN0cmluZyhieXRlcyk7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgIGlucHV0c3RyZWFtID0gIiArIHRleHQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBDcmVhdGUgSW5wdXRTdHJlYW0KLSAgICAgICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGluU3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVzKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gQ3JlYXRlIE1lc3NhZ2VGYWN0b3J5IHRoYXQgc3VwcG9ydHMgdGhlIHZlcnNpb24gb2YgU09BUCBpbiB0aGUgb20gZWxlbWVudAotICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkgbWYgPSBnZXRTQUFKQ29udmVydGVyKCkuY3JlYXRlTWVzc2FnZUZhY3RvcnkobnMuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBDcmVhdGUgc29hcE1lc3NhZ2Ugb2JqZWN0IGZyb20gTWVzc2FnZSBGYWN0b3J5IHVzaW5nIHRoZSBpbnB1dAotICAgICAgICAgICAgLy8gc3RyZWFtIGNyZWF0ZWQgZnJvbSBPTS4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gR2V0IHRoZSBNaW1lSGVhZGVycyBmcm9tIHRoZSB0cmFuc3BvcnRIZWFkZXJzIG1hcAotICAgICAgICAgICAgTWltZUhlYWRlcnMgZGVmYXVsdEhlYWRlcnMgPSBuZXcgTWltZUhlYWRlcnMoKTsKLSAgICAgICAgICAgIGlmICh0cmFuc3BvcnRIZWFkZXJzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBJdGVyYXRvciBpdCA9IHRyYW5zcG9ydEhlYWRlcnMuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXQubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcga2V5ID0gKFN0cmluZykgZW50cnkuZ2V0S2V5KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChlbnRyeS5nZXRWYWx1ZSgpIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3JtYWxseSB0aGVyZSBpcyBvbmUgdmFsdWUgcGVyIGtleQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgIGFkZCB0cmFuc3BvcnQgaGVhZGVyLiBoZWFkZXIgPSIgKyBrZXkgKyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiB2YWx1ZSA9ICIgKyBlbnRyeS5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRIZWFkZXJzLmFkZEhlYWRlcihrZXksIChTdHJpbmcpIGVudHJ5LmdldFZhbHVlKCkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlcmUgbWF5IGJlIG11bHRpcGxlIHZhbHVlcyBmb3IgZWFjaCBrZXkuICBUaGlzIGNvZGUKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFzc3VtZXMgdGhlIHZhbHVlIGlzIGFuIGFycmF5IG9mIFN0cmluZy4KLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZXNbXSA9IChTdHJpbmdbXSkgZW50cnkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTx2YWx1ZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgIGFkZCB0cmFuc3BvcnQgaGVhZGVyLiBoZWFkZXIgPSIgKyBrZXkgKyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgdmFsdWUgPSAiICsgdmFsdWVzW2ldKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdEhlYWRlcnMuYWRkSGVhZGVyKGtleSwgdmFsdWVzW2ldKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gVG9nZ2xlIGJhc2VkIG9uIFNPQVAgMS4xIG9yIFNPQVAgMS4yCi0gICAgICAgICAgICBTdHJpbmcgY29udGVudFR5cGUgPSBudWxsOwotICAgICAgICAgICAgaWYgKG5zLmdldE5hbWVzcGFjZVVSSSgpLmVxdWFscyhTT0FQQ29uc3RhbnRzLlVSSV9OU19TT0FQXzFfMV9FTlZFTE9QRSkpIHsKLSAgICAgICAgICAgICAgICBjb250ZW50VHlwZSA9IFNPQVBDb25zdGFudHMuU09BUF8xXzFfQ09OVEVOVF9UWVBFOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBjb250ZW50VHlwZSA9IFNPQVBDb25zdGFudHMuU09BUF8xXzJfQ09OVEVOVF9UWVBFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBPdmVycmlkZSB0aGUgY29udGVudC10eXBlCi0gICAgICAgICAgICBTdHJpbmcgY3RWYWx1ZSA9IGNvbnRlbnRUeXBlICsiOyBjaGFyc2V0PVVURi04IjsKLSAgICAgICAgICAgIGRlZmF1bHRIZWFkZXJzLnNldEhlYWRlcigiQ29udGVudC10eXBlIiwgY3RWYWx1ZSk7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIiAgc2V0Q29udGVudFR5cGUgPSIgKyBjdFZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFNPQVBNZXNzYWdlIHNvYXBNZXNzYWdlID0gbWYuY3JlYXRlTWVzc2FnZShkZWZhdWx0SGVhZGVycywgaW5TdHJlYW0pOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBBdCB0aGlzIHBvaW50IHRoZSBYTUxQYXJ0IGlzIHN0aWxsIGFuIE9NRWxlbWVudC4gIAotICAgICAgICAgICAgLy8gV2UgbmVlZCB0byBjaGFuZ2UgaXQgdG8gdGhlIG5ldyBTT0FQRW52ZWxvcGUuCi0gICAgICAgICAgICBjcmVhdGVYTUxQYXJ0KHNvYXBNZXNzYWdlLmdldFNPQVBQYXJ0KCkuZ2V0RW52ZWxvcGUoKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIElmIGF4aW9tIHJlYWQgdGhlIG1lc3NhZ2UgZnJvbSB0aGUgaW5wdXQgc3RyZWFtLCAKLSAgICAgICAgICAgIC8vIHRoZW4gb25lIG9mIHRoZSBhdHRhY2htZW50cyBpcyBhIFNPQVBQYXJ0LiAgSWdub3JlIHRoaXMgYXR0YWNobWVudAotICAgICAgICAgICAgU3RyaW5nIHNvYXBQYXJ0Q29udGVudElEID0gZ2V0U09BUFBhcnRDb250ZW50SUQoKTsgIC8vIFRoaXMgbWF5IGJlIG51bGwKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgIHNvYXBQYXJ0Q29udGVudElEID0iICsgc29hcFBhcnRDb250ZW50SUQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBMaXN0PFN0cmluZz4gZG9udENvcHkgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgICAgIGlmIChzb2FwUGFydENvbnRlbnRJRCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZG9udENvcHkuYWRkKHNvYXBQYXJ0Q29udGVudElEKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gQWRkIGFueSBuZXcgYXR0YWNobWVudHMgZnJvbSB0aGUgU09BUE1lc3NhZ2UgdG8gdGhpcyBNZXNzYWdlCi0gICAgICAgICAgICBJdGVyYXRvciBpdCA9IHNvYXBNZXNzYWdlLmdldEF0dGFjaG1lbnRzKCk7Ci0gICAgICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgQXR0YWNobWVudFBhcnQgYXAgPSAoQXR0YWNobWVudFBhcnQpIGl0Lm5leHQoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgY2lkID0gYXAuZ2V0Q29udGVudElkKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiICBhZGQgU09BUE1lc3NhZ2UgYXR0YWNobWVudCB0byBNZXNzYWdlLiAgY2lkID0gIiArIGNpZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGFkZERhdGFIYW5kbGVyKGFwLmdldERhdGFIYW5kbGVyKCksICBjaWQpOwotICAgICAgICAgICAgICAgIGRvbnRDb3B5LmFkZChjaWQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBBZGQgdGhlIGF0dGFjaG1lbnRzIGZyb20gdGhpcyBNZXNzYWdlIHRvIHRoZSBTT0FQTWVzc2FnZQotICAgICAgICAgICAgZm9yIChTdHJpbmcgY2lkOmdldEF0dGFjaG1lbnRJRHMoKSkgewotICAgICAgICAgICAgICAgIERhdGFIYW5kbGVyIGRoID0gYXR0YWNobWVudHMuZ2V0RGF0YUhhbmRsZXIoY2lkKTsKLSAgICAgICAgICAgICAgICBpZiAoIWRvbnRDb3B5LmNvbnRhaW5zKGNpZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIiAgYWRkIE1lc3NhZ2UgYXR0YWNobWVudCB0byBTb2FwTWVzc2FnZS4gIGNpZCA9ICIgKyBjaWQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIEF0dGFjaG1lbnRQYXJ0IGFwID0gTWVzc2FnZVV0aWxzLmNyZWF0ZUF0dGFjaG1lbnRQYXJ0KGNpZCwgZGgsIHNvYXBNZXNzYWdlKTsKLSAgICAgICAgICAgICAgICAgICAgc29hcE1lc3NhZ2UuYWRkQXR0YWNobWVudFBhcnQoYXApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgIFRoZSBTT0FQTWVzc2FnZSBoYXMgdGhlIGZvbGxvd2luZyBhdHRhY2htZW50cyIpOwotICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGl0MiA9IHNvYXBNZXNzYWdlLmdldEF0dGFjaG1lbnRzKCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGl0Mi5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgQXR0YWNobWVudFBhcnQgYXAgPSAoQXR0YWNobWVudFBhcnQpIGl0Mi5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiICAgIEF0dGFjaG1lbnRQYXJ0IGNpZD0iICsgYXAuZ2V0Q29udGVudElkKCkpOwotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIiAgICAgICAgY29udGVudFR5cGUgPSIgKyBhcC5nZXRDb250ZW50VHlwZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiZW5kIGdldEFzU09BUE1lc3NhZ2UiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBzb2FwTWVzc2FnZTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEdldCB0aGUgaW5kaWNhdGVkIChub24tc29hcCBwYXJ0KSBhdHRhY2htZW50IGlkCi0gICAgICogQHBhcmFtIGluZGV4Ci0gICAgICogQHJldHVybiBDSUQgb3IgbnVsbCBpZiBub3QgcHJlc2VudAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0YWNobWVudElEKGludCBpbmRleCkgewotICAgICAgICBMaXN0PFN0cmluZz4gY2lkcyA9IGdldEF0dGFjaG1lbnRJRHMoKTsKLSAgICAgICAgU3RyaW5nIHNwQ0lEID0gZ2V0U09BUFBhcnRDb250ZW50SUQoKTsKLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoImdldEF0dGFjaG1lbnRJRCBmb3IgaW5kZXggPSIgKyBpbmRleCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNpZHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkF0dGFjaG1lbnQgQ0lEICgiICsgaSArICIpID0gIiArIGNpZHMuaW5kZXhPZihpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBsb2cuZGVidWcoIlRoZSBTT0FQIFBhcnQgQ0lEIGlzIGlnbm9yZWQuICBJdCdzIENJRCBpcyAoIiArIHNwQ0lEICsgIikiKTsKLSAgICAgICAgfQotICAgICAgICBpbnQgc3BJbmRleCA9IChzcENJRCA9PSBudWxsKSA/IC0xIDogY2lkcy5pbmRleE9mKHNwQ0lEKTsKLSAgICAgICAgCi0gICAgICAgIC8vIEJ1bXAgaW5kZXggc28gd2UgZG9uJ3QgY29uc2lkZXIgdGhlIHNvYXAgcGFydAotICAgICAgICBpbmRleCA9IChzcEluZGV4ICE9IC0xICYmIHNwSW5kZXggPD0gaW5kZXgpID8gaW5kZXggKyAxIDogaW5kZXg7Ci0gICAgICAgIAotICAgICAgICAvLyBSZXR1cm4gdGhlIGNvbnRlbnQgaWQgYXQgdGhlIGNhbGN1bGF0ZWQgaW5kZXgKLSAgICAgICAgU3RyaW5nIHJlc3VsdENJRCA9IG51bGw7Ci0gICAgICAgIGlmIChpbmRleCA8IGNpZHMuc2l6ZSgpKSB7Ci0gICAgICAgICAgICByZXN1bHRDSUQgPSBjaWRzLmdldChpbmRleCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIlJldHVybmluZyBDSUQ9IiArIHJlc3VsdENJRCk7Ci0gICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHRDSUQ7Ci0gICAgfQotICAgIAotCi0gICAgcHVibGljIFN0cmluZyBnZXRBdHRhY2htZW50SUQoU3RyaW5nIHBhcnROYW1lKSB7Ci0gICAgICAgIC8vIEZpbmQgdGhlIHByZWZpeCB0aGF0IHN0YXJ0cyB3aXRoIHRoZSAKLSAgICAgICAgLy8gcGFydE5hbWU9Ci0gICAgICAgIFN0cmluZyBwcmVmaXggPSBwYXJ0TmFtZSArICI9IjsKLSAgICAgICAgTGlzdDxTdHJpbmc+IGNpZHMgPSBnZXRBdHRhY2htZW50SURzKCk7Ci0gICAgICAgIGZvciAoU3RyaW5nIGNpZDogY2lkcykgewotICAgICAgICAgICAgaWYgKGNpZC5zdGFydHNXaXRoKHByZWZpeCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gY2lkOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIAotICAgIHByaXZhdGUgU3RyaW5nIGdldFNPQVBQYXJ0Q29udGVudElEKCkgewotICAgICAgICBTdHJpbmcgY29udGVudElEID0gbnVsbDsKLSAgICAgICAgaWYgKG1lc3NhZ2VDb250ZXh0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOyAgLy8gQXR0YWNobWVudHMgc2V0IHVwIHByb2dyYW1tYXRpY2FsbHkuLi5zbyB0aGVyZSBpcyBubyBTT0FQUGFydAotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjb250ZW50SUQgPSBhdHRhY2htZW50cy5nZXRTT0FQUGFydENvbnRlbnRJRCgpOwotICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIE9NIHdpbGwga2luZGx5IHRocm93IGFuIE9NRXhjZXB0aW9uIG9yIE5QRSBpZiB0aGUgYXR0YWNobWVudHMgaXMgc2V0IHVwIAotICAgICAgICAgICAgLy8gcHJvZ3JhbW1hdGljYWxseS4gCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY29udGVudElEOwotICAgIH0KLSAgICAKLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuTWVzc2FnZSNnZXRWYWx1ZShqYXZhLmxhbmcuT2JqZWN0LCAKLSAgICAgKiBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZmFjdG9yeS5CbG9ja0ZhY3RvcnkpCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRWYWx1ZShPYmplY3QgY29udGV4dCwgQmxvY2tGYWN0b3J5IGJsb2NrRmFjdG9yeSkgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChwcm90b2NvbCA9PSBQcm90b2NvbC5yZXN0KSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhlIGltcGxlbWVudGF0aW9uIG9mIHJlc3Qgc3RvcmVzIHRoZSByZXN0IHhtbCBpbnNpZGUgYSBkdW1teSBzb2FwIDEuMSBlbnZlbG9wZS4KLSAgICAgICAgICAgICAgICAvLyBTbyB1c2UgdGhlIGdldCBib2R5IGJsb2NrIGxvZ2ljLgotICAgICAgICAgICAgICAgIEJsb2NrIGJsb2NrID0geG1sUGFydC5nZXRCb2R5QmxvY2soY29udGV4dCwgYmxvY2tGYWN0b3J5KTsKLSAgICAgICAgICAgICAgICBpZiAoYmxvY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGJsb2NrLmdldEJ1c2luZXNzT2JqZWN0KHRydWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gTXVzdCBiZSBTT0FQCi0gICAgICAgICAgICAgICAgaWYgKGJsb2NrRmFjdG9yeSBpbnN0YW5jZW9mIFNPQVBFbnZlbG9wZUJsb2NrRmFjdG9yeSkgewotICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGdldEFzU09BUE1lc3NhZ2UoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBUaGlzIGRvZXNuJ3Qgc2VlbSByaWdodCB0byBtZS4KLSAgICAgICAgICAgICAgICAgICAgLy8gV2Ugc2hvdWxkIG5vdCBoYXZlIGFuIGludGVybWVkaWF0ZSBTdHJpbmdCbG9jay4KLSAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBub3QgcGVyZm9ybWFudC4gU2NoZXUKLSAgICAgICAgICAgICAgICAgICAgT01FbGVtZW50IG1lc3NhZ2VPTSA9IGdldEFzT01FbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBzdHJpbmdWYWx1ZSA9IG1lc3NhZ2VPTS50b1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc29hcE5TID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHJvdG9jb2wgPT0gUHJvdG9jb2wuc29hcDExKSA/IFNPQVBDb25zdGFudHMuVVJJX05TX1NPQVBfMV8xX0VOVkVMT1BFCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFNPQVBDb25zdGFudHMuVVJJX05TX1NPQVBfMV8yX0VOVkVMT1BFOwotICAgICAgICAgICAgICAgICAgICBRTmFtZSBzb2FwRW52UW5hbWUgPSBuZXcgUU5hbWUoc29hcE5TLCAiRW52ZWxvcGUiKTsKLQotCi0gICAgICAgICAgICAgICAgICAgIFhNTFN0cmluZ0Jsb2NrRmFjdG9yeSBzdHJpbmdGYWN0b3J5ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoWE1MU3RyaW5nQmxvY2tGYWN0b3J5KSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShYTUxTdHJpbmdCbG9ja0ZhY3RvcnkuY2xhc3MpOwotICAgICAgICAgICAgICAgICAgICBCbG9jayBzdHJpbmdCbG9jayA9IHN0cmluZ0ZhY3RvcnkuY3JlYXRlRnJvbShzdHJpbmdWYWx1ZSwgbnVsbCwgc29hcEVudlFuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgQmxvY2sgYmxvY2sgPSBibG9ja0ZhY3RvcnkuY3JlYXRlRnJvbShzdHJpbmdCbG9jaywgY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gYmxvY2suZ2V0QnVzaW5lc3NPYmplY3QodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuTWVzc2FnZSNnZXRBdHRhY2htZW50SURzKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldEF0dGFjaG1lbnRJRHMoKSB7Ci0gICAgICAgIHJldHVybiBhdHRhY2htZW50cy5nZXRDb250ZW50SURMaXN0KCk7Ci0gICAgfQotICAgIAotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5NZXNzYWdlI2dldERhdGFIYW5kbGVyKGphdmEubGFuZy5TdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIERhdGFIYW5kbGVyIGdldERhdGFIYW5kbGVyKFN0cmluZyBjaWQpIHsKLSAgICAgICAgLy8gaWYgbnVsbCBESCB3YXMgc3BlY2lmaWVkIGV4cGxpY2l0bHksIGp1c3QgcmV0dXJuCi0gICAgICAgIGlmKGNpZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gKERhdGFIYW5kbGVyKSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZyBiY2lkID0gZ2V0QmxvYkNJRChjaWQpOwotICAgICAgICByZXR1cm4gYXR0YWNobWVudHMuZ2V0RGF0YUhhbmRsZXIoYmNpZCk7Ci0gICAgfQotICAgIAotICAgIAotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5NZXNzYWdlI3JlbW92ZURhdGFIYW5kbGVyKGphdmEubGFuZy5TdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIERhdGFIYW5kbGVyIHJlbW92ZURhdGFIYW5kbGVyKFN0cmluZyBjaWQpIHsKLSAgICAgICAgU3RyaW5nIGJjaWQgPSBnZXRCbG9iQ0lEKGNpZCk7Ci0gICAgICAgIERhdGFIYW5kbGVyIGRoID0gYXR0YWNobWVudHMuZ2V0RGF0YUhhbmRsZXIoYmNpZCk7Ci0gICAgICAgIGF0dGFjaG1lbnRzLnJlbW92ZURhdGFIYW5kbGVyKGJjaWQpOwotICAgICAgICByZXR1cm4gZGg7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgU3RyaW5nIGdldEJsb2JDSUQoU3RyaW5nIGNpZCkgewotICAgICAgICBTdHJpbmcgYmxvYkNJRCA9IGNpZDsKLSAgICAgICAgaWYgKGNpZC5zdGFydHNXaXRoKCJjaWQ6IikpIHsKLSAgICAgICAgICAgIGJsb2JDSUQgPSBjaWQuc3Vic3RyaW5nKDQpOyAgLy8gU2tpcCBvdmVyIGNpZDoKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYmxvYkNJRDsKLSAgICB9Ci0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLlhNTFBhcnQjZ2V0UHJvdG9jb2woKQotICAgICAqLwotICAgIHB1YmxpYyBQcm90b2NvbCBnZXRQcm90b2NvbCgpIHsKLSAgICAgICAgcmV0dXJuIHByb3RvY29sOwotICAgIH0KLSAgICAKLSAgICAKLSAgICBwdWJsaWMgT01FbGVtZW50IGdldEFzT01FbGVtZW50KCkgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICByZXR1cm4geG1sUGFydC5nZXRBc09NRWxlbWVudCgpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgamF2YXgueG1sLnNvYXAuU09BUEVudmVsb3BlIGdldEFzU09BUEVudmVsb3BlKCkgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICByZXR1cm4geG1sUGFydC5nZXRBc1NPQVBFbnZlbG9wZSgpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgQmxvY2sgZ2V0Qm9keUJsb2NrKGludCBpbmRleCwgT2JqZWN0IGNvbnRleHQsIEJsb2NrRmFjdG9yeSBibG9ja0ZhY3RvcnkpIAotICAgIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIHhtbFBhcnQuZ2V0Qm9keUJsb2NrKGluZGV4LCBjb250ZXh0LCBibG9ja0ZhY3RvcnkpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgQmxvY2sgZ2V0SGVhZGVyQmxvY2soU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIGxvY2FsUGFydCwgT2JqZWN0IGNvbnRleHQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbG9ja0ZhY3RvcnkgYmxvY2tGYWN0b3J5KSAKLSAgICB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiB4bWxQYXJ0LmdldEhlYWRlckJsb2NrKG5hbWVzcGFjZSwgbG9jYWxQYXJ0LCBjb250ZXh0LCBibG9ja0ZhY3RvcnkpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgTGlzdDxCbG9jaz4gZ2V0SGVhZGVyQmxvY2tzKFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBsb2NhbFBhcnQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnRleHQsIEJsb2NrRmFjdG9yeSBibG9ja0ZhY3RvcnksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUm9sZVBsYXllciByb2xlUGxheWVyKSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiB4bWxQYXJ0LmdldEhlYWRlckJsb2NrcyhuYW1lc3BhY2UsIGxvY2FsUGFydCwgY29udGV4dCwgYmxvY2tGYWN0b3J5LCByb2xlUGxheWVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldE51bUJvZHlCbG9ja3MoKSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiB4bWxQYXJ0LmdldE51bUJvZHlCbG9ja3MoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGludCBnZXROdW1IZWFkZXJCbG9ja3MoKSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiB4bWxQYXJ0LmdldE51bUhlYWRlckJsb2NrcygpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgWE1MU3RyZWFtUmVhZGVyIGdldFhNTFN0cmVhbVJlYWRlcihib29sZWFuIGNvbnN1bWUpIAotICAgIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIHhtbFBhcnQuZ2V0WE1MU3RyZWFtUmVhZGVyKGNvbnN1bWUpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0NvbnN1bWVkKCkgewotICAgICAgICByZXR1cm4geG1sUGFydC5pc0NvbnN1bWVkKCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIG91dHB1dFRvKFhNTFN0cmVhbVdyaXRlciB3cml0ZXIsIGJvb2xlYW4gY29uc3VtZSkgCi0gICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHhtbFBhcnQub3V0cHV0VG8od3JpdGVyLCBjb25zdW1lKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlQm9keUJsb2NrKGludCBpbmRleCkgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICB4bWxQYXJ0LnJlbW92ZUJvZHlCbG9jayhpbmRleCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHJlbW92ZUhlYWRlckJsb2NrKFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBsb2NhbFBhcnQpIAotICAgIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgeG1sUGFydC5yZW1vdmVIZWFkZXJCbG9jayhuYW1lc3BhY2UsIGxvY2FsUGFydCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldEJvZHlCbG9jayhpbnQgaW5kZXgsIEJsb2NrIGJsb2NrKSAKLSAgICB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHhtbFBhcnQuc2V0Qm9keUJsb2NrKGluZGV4LCBibG9jayk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldEhlYWRlckJsb2NrKFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBsb2NhbFBhcnQsIEJsb2NrIGJsb2NrKSAKLSAgICB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHhtbFBhcnQuc2V0SGVhZGVyQmxvY2sobmFtZXNwYWNlLCBsb2NhbFBhcnQsIGJsb2NrKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgYXBwZW5kSGVhZGVyQmxvY2soU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIGxvY2FsUGFydCwgQmxvY2sgYmxvY2spIAotICAgIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgeG1sUGFydC5hcHBlbmRIZWFkZXJCbG9jayhuYW1lc3BhY2UsIGxvY2FsUGFydCwgYmxvY2spOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIHRyYWNlU3RyaW5nKFN0cmluZyBpbmRlbnQpIHsKLSAgICAgICAgcmV0dXJuIHhtbFBhcnQudHJhY2VTdHJpbmcoaW5kZW50KTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogTG9hZCB0aGUgU0FBSkNvbnZlcnRlcgotICAgICAqIEByZXR1cm4gU0FBSkNvbnZlcnRlcgotICAgICAqLwotICAgIFNBQUpDb252ZXJ0ZXIgY29udmVydGVyID0gbnVsbDsKLSAgICBwcml2YXRlIFNBQUpDb252ZXJ0ZXIgZ2V0U0FBSkNvbnZlcnRlcigpIHsKLSAgICAgICAgaWYgKGNvbnZlcnRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBTQUFKQ29udmVydGVyRmFjdG9yeSBmYWN0b3J5ID0gKAotICAgICAgICAgICAgICAgICAgICBTQUFKQ29udmVydGVyRmFjdG9yeSlGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShTQUFKQ29udmVydGVyRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgICAgICBjb252ZXJ0ZXIgPSBmYWN0b3J5LmdldFNBQUpDb252ZXJ0ZXIoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY29udmVydGVyOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBhZGREYXRhSGFuZGxlcihEYXRhSGFuZGxlciBkaCwgU3RyaW5nIGlkKSB7Ci0gICAgICAgIGlmIChpZC5zdGFydHNXaXRoKCI8IikgICYmIGlkLmVuZHNXaXRoKCI+IikpIHsKLSAgICAgICAgICAgIGlkID0gaWQuc3Vic3RyaW5nKDEsIGlkLmxlbmd0aCgpLTEpOwotICAgICAgICB9Ci0gICAgICAgIGF0dGFjaG1lbnRzLmFkZERhdGFIYW5kbGVyKGlkLCBkaCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBNZXNzYWdlIGdldFBhcmVudCgpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldFBhcmVudChNZXNzYWdlIG1zZykgeyAKLSAgICAgICAgLy8gQSBNZXNzYWdlIGRvZXMgbm90IGhhdmUgYSBwYXJlbnQKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgYmluZGluZyBmb3IgdGhpcyBtZXNzYWdlIGluZGljYXRlcyBtdG9tCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNNVE9NRW5hYmxlZCgpIHsKLSAgICAgICAgLy8gSWYgdGhlIG1lc3NhZ2UgaGFzIFNXQSBhdHRhY2htZW50cywgdGhpcyAid2lucyIgb3ZlciB0aGUgbXRvbSBzZXR0aW5nLgotICAgICAgICByZXR1cm4gbXRvbUVuYWJsZWQgJiYgIWRvaW5nU1dBOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAcGFyYW0gdHJ1ZSBpZiB0aGUgYmluZGluZyBmb3IgdGhpcyBtZXNzYWdlIGluZGljYXRlcyBtdG9tCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TVRPTUVuYWJsZWQoYm9vbGVhbiBiKSB7Ci0gICAgICAgIG10b21FbmFibGVkID0gYjsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFhNTEZhdWx0IGdldFhNTEZhdWx0KCkgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICByZXR1cm4geG1sUGFydC5nZXRYTUxGYXVsdCgpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRYTUxGYXVsdChYTUxGYXVsdCB4bWxGYXVsdCkgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICB4bWxQYXJ0LnNldFhNTEZhdWx0KHhtbEZhdWx0KTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gaXNGYXVsdCgpIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIHhtbFBhcnQuaXNGYXVsdCgpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldFhNTFBhcnRDb250ZW50VHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIHhtbFBhcnQuZ2V0WE1MUGFydENvbnRlbnRUeXBlKCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHlsZSBnZXRTdHlsZSgpIHsKLSAgICAgICAgcmV0dXJuIHhtbFBhcnQuZ2V0U3R5bGUoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0U3R5bGUoU3R5bGUgc3R5bGUpIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgeG1sUGFydC5zZXRTdHlsZShzdHlsZSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBRTmFtZSBnZXRPcGVyYXRpb25FbGVtZW50KCkgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICByZXR1cm4geG1sUGFydC5nZXRPcGVyYXRpb25FbGVtZW50KCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldE9wZXJhdGlvbkVsZW1lbnQoUU5hbWUgb3BlcmF0aW9uUU5hbWUpIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgeG1sUGFydC5zZXRPcGVyYXRpb25FbGVtZW50KG9wZXJhdGlvblFOYW1lKTsKLSAgICB9Ci0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLkF0dGFjaG1lbnQjZ2V0TWltZUhlYWRlcnMoKQotICAgICAqLwotICAgIHB1YmxpYyBNYXAgZ2V0TWltZUhlYWRlcnMoKSB7Ci0gICAgICAgIC8vIExhemlseSBjcmVhdGUgdHJhbnNwb3J0IGhlYWRlcnMuCi0gICAgICAgIGlmICh0cmFuc3BvcnRIZWFkZXJzID09IG51bGwpIHsKLSAgICAgICAgICAgIHRyYW5zcG9ydEhlYWRlcnMgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cmFuc3BvcnRIZWFkZXJzOwotICAgICB9Ci0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLkF0dGFjaG1lbnQjc2V0TWltZUhlYWRlcnMoamF2YS51dGlsLk1hcCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRNaW1lSGVhZGVycyhNYXAgbWFwKSB7Ci0gICAgICAgIHRyYW5zcG9ydEhlYWRlcnMgPSBtYXA7Ci0gICAgICAgIGlmICh0cmFuc3BvcnRIZWFkZXJzID09IG51bGwpIHsKLSAgICAgICAgICAgIHRyYW5zcG9ydEhlYWRlcnMgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIEJsb2NrIGdldEJvZHlCbG9jayhPYmplY3QgY29udGV4dCwgQmxvY2tGYWN0b3J5IGJsb2NrRmFjdG9yeSkgCi0gICAgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICByZXR1cm4geG1sUGFydC5nZXRCb2R5QmxvY2soY29udGV4dCwgYmxvY2tGYWN0b3J5KTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0Qm9keUJsb2NrKEJsb2NrIGJsb2NrKSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHhtbFBhcnQuc2V0Qm9keUJsb2NrKGJsb2NrKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0UG9zdFBpdm90KCkgewotICAgICAgICB0aGlzLnBvc3RQaXZvdCA9IHRydWU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIGlzUG9zdFBpdm90KCkgewotICAgICAgICByZXR1cm4gcG9zdFBpdm90OwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgaW50IGdldEluZGlyZWN0aW9uKCkgewotICAgICAgICByZXR1cm4geG1sUGFydC5nZXRJbmRpcmVjdGlvbigpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRJbmRpcmVjdGlvbihpbnQgaW5kaXJlY3Rpb24pIHsKLSAgICAgICAgeG1sUGFydC5zZXRJbmRpcmVjdGlvbihpbmRpcmVjdGlvbik7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBNZXNzYWdlQ29udGV4dCBnZXRNZXNzYWdlQ29udGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIG1lc3NhZ2VDb250ZXh0OwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRNZXNzYWdlQ29udGV4dChNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCkgewotICAgICAgICBpZiAodGhpcy5tZXNzYWdlQ29udGV4dCAhPSBtZXNzYWdlQ29udGV4dCkgewotICAgICAgICAgICAgLy8gQ29weSBhdHRhY2htZW50cyB0byB0aGUgbmV3IG1hcAotICAgICAgICAgICAgQXR0YWNobWVudHMgbmV3TWFwID0gbWVzc2FnZUNvbnRleHQuZ2V0QXhpc01lc3NhZ2VDb250ZXh0KCkuZ2V0QXR0YWNobWVudE1hcCgpOwotICAgICAgICAgICAgQXR0YWNobWVudHMgb2xkTWFwID0gYXR0YWNobWVudHM7Ci0gICAgICAgICAgICBmb3IgKFN0cmluZyBjaWQ6b2xkTWFwLmdldEFsbENvbnRlbnRJRHMoKSkgewotICAgICAgICAgICAgICAgIERhdGFIYW5kbGVyIGRoID0gb2xkTWFwLmdldERhdGFIYW5kbGVyKGNpZCk7Ci0gICAgICAgICAgICAgICAgaWYgKGRoICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbmV3TWFwLmFkZERhdGFIYW5kbGVyKGNpZCwgZGgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIElmIG5vdCBNVE9NIGFuZCB0aGVyZSBhcmUgYXR0YWNobWVudHMsIHNldCBTV0Egc3R5bGUKLSAgICAgICAgICAgIGlmICghaXNNVE9NRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nW10gY2lkcyA9IG5ld01hcC5nZXRBbGxDb250ZW50SURzKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGNpZHMubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgICAgICAgICBtZXNzYWdlQ29udGV4dC5zZXRQcm9wZXJ0eShDb25maWd1cmF0aW9uLkVOQUJMRV9TV0EsICJ0cnVlIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgY2lkOm5ld01hcC5nZXRBbGxDb250ZW50SURzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJNZXNzYWdlIGhhcyBhbiBhdHRhY2htZW50IHdpdGggY29udGVudCBpZD0gIiArIGNpZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXR0YWNobWVudHMgPSBuZXdNYXA7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIENoZWNrIGZvciBjYWNoZWQgYXR0YWNobWVudCBmaWxlKHMpIGlmIGF0dGFjaG1lbnRzIGV4aXN0LgotICAgICAgICBpZihhdHRhY2htZW50cyAhPSBudWxsICYmICFtZXNzYWdlQ29udGV4dC5nZXRBeGlzTWVzc2FnZUNvbnRleHQoKS5pc1NlcnZlclNpZGUoKSl7Ci0gICAgICAgIAlBdHRhY2htZW50VXRpbHMuZmluZENhY2hlZEF0dGFjaG1lbnQoYXR0YWNobWVudHMpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICB0aGlzLm1lc3NhZ2VDb250ZXh0ID0gbWVzc2FnZUNvbnRleHQ7Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIHNldERvaW5nU1dBKGJvb2xlYW4gdmFsdWUpIHsKLSAgICAgICAgZG9pbmdTV0EgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0RvaW5nU1dBKCkgewotICAgICAgICByZXR1cm4gZG9pbmdTV0E7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgewotICAgICAgICBpZiAoeG1sUGFydCAhPSBudWxsKSB7Ci0gICAgICAgICAgICB4bWxQYXJ0LmNsb3NlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU2V0PFFOYW1lPiBnZXRIZWFkZXJRTmFtZXMoKSB7Ci0gICAgICAgIHJldHVybiAoeG1sUGFydCA9PSBudWxsKSA/IG51bGwgOiB4bWxQYXJ0LmdldEhlYWRlclFOYW1lcygpOyAgICAgCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2ltcGwvWE1MUGFydEJhc2UuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvaW1wbC9YTUxQYXJ0QmFzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjRhOWFiLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvaW1wbC9YTUxQYXJ0QmFzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzc0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmltcGw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NWE1MUGFyc2VyV3JhcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuYnVpbGRlci5TdEFYQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuUm9sZVBsYXllcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUDExQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQMTJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5FeGNlcHRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaTE4bi5NZXNzYWdlczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuQmxvY2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLlByb3RvY29sOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5YTUxGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuWE1MUGFydDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZmFjdG9yeS5CbG9ja0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLnV0aWwuWE1MRmF1bHRVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnV0aWxpdHkuSmF2YVV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuU3R5bGU7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5OYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLk5vZGU7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEVudmVsb3BlOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEhlYWRlcjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0KLS8qKgotICogWE1MUGFydEJhc2UgY2xhc3MgZm9yIGFuIFhNTFBhcnQgQW4gWE1MUGFydCBpcyBhbiBhYnN0cmFjdGlvbiBvZiB0aGUgeG1sIHBvcnRpb24gb2YgdGhlIG1lc3NhZ2UuCi0gKiBUaGUgYWN0dWFsIHJlcHJlc2VudGF0aW9uIGNhbiBiZSBpbiBvbmUgb2YgdGhyZWUgZGlmZmVyZW50IGZvcm1zOiAqIEFuIE9NIHRyZWUgKiBBIFNBQUoKLSAqIFNPQVBFbnZlbG9wZSAqIEFuIFhNTFNwaW5lIChhbiBvcHRpbWl6ZWQgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1lc3NhZ2UpIFRoZSByZXByZXNlbnRhdGlvbiBpcwotICogc3RvcmVkIGluIHRoZSBwcml2YXRlIHZhcmlhYmxlIChjb250ZW50KQotICogPHAvPgotICogVGhlIHJlcHJlc2VudGF0aW9uIGNoYW5nZXMgYXMgdGhlIE1lc3NhZ2UgZmxvd3MgdGhyb3VnaCB0aGUgSkFYLVdTIGZyYW1ld29yay4gIEZvciBleGFtcGxlLCBoZXJlCi0gKiBpcyBhIHR5cGljYWwgZmxvdyBvbiB0aGUgaW5ib3VuZCBjYXNlOiBhKSBNZXNzYWdlIGlzIGJ1aWx0IGZyb20gT00KLSAqIChyZXByZXNlbnRhdGlvbjogT00pIGIpIE1lc3NhZ2UgZmxvd3MgaW50byBTT0FQIEhhbmRsZXIgY2hhaW4gICAgICAgICAgICAgIChyZXByZXNlbnRhdGlvbjoKLSAqIE9NLT5TT0FQRW52ZWxvcGUpIGMpIE1lc3NhZ2UgZmxvd3Mgb3V0IG9mIHRoZSBTT0FQIEhhbmRsZXIgY2hhaW4gZCkgTWVzc2FnZSBmbG93cyBpbnRvIHRoZQotICogbG9naWNhbCBkaXNwYXRjaCBwcm9jZXNzaW5nIChyZXByZXNlbnRhdGlvbjogU09BUEVudmVsb3BlLT5YTUxTcGluZSkKLSAqIDxwLz4KLSAqIFRoZSBrZXkgdG8gcGVyZm9ybWFuY2UgaXMgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSB0cmFuc2Zvcm1hdGlvbnMgYmV0d2VlbiBPTSwgU0FBSiBTT0FQRW52ZWxvcGUKLSAqIGFuZCBYTUxTcGluZS4gICBUaGlzIGJhc2UgY2xhc3MgZGVmaW5lcyBhbGwgb2YgdGhlIG1ldGhvZHMgdGhhdCBhcmUgcmVxdWlyZWQgb24gYW4gWE1MUGFydCwgdGhlCi0gKiBhY3R1YWwgdHJhbnNmb3JtYXRpb25zIGFyZSBwcm92aWRlZCBieSB0aGUgZGVyaXZlZCBjbGFzcy4gIFRoaXMgZGl2aXNpb24gb2Ygd29yayBhbGxvd3MgdGhlCi0gKiBkZXJpdmVkIGNsYXNzIHRvIGNvbmNlbnRyYXRlIG9uIHRoZSBvcHRpbWl6YXRpb24gb2YgdGhlIHRyYW5zZm9ybWF0aW9ucy4gIEZvciBleGFtcGxlLCB0aGUKLSAqIGRlcml2ZWQgY2xhc3MgbWF5IGltcGxlbWVudCBYTUxTcGluZSAtPiBPTSB1c2luZyBPTU9iamVjdFdyYXBwZXJFbGVtZW50IGNvbnN0cnVjdHMuLi50aHVzIGF2b2lkCi0gKiBleHBlbnNpdmUgcGFyc2luZy4KLSAqIDxwLz4KLSAqIEhlcmUgYXJlIHRoZSBtZXRob2RzIHRoYXQgdGhlIGRlcml2ZWQgWE1MUGFydCBzaG91bGQgaW1wbGVtZW50LiBPTUVsZW1lbnQKLSAqIF9jb252ZXJ0U0UyT00oU09BUEVudmVsb3BlIHNlKSBPTUVsZW1lbnQgX2NvbnZlcnRTcGluZTJPTShYTUxTcGluZSBzcGluZSkgU09BUEVudmVsb3BlCi0gKiBfY29udmVydE9NMlNFKE9NRWxlbWVudCBvbSkgU09BUEVudmVsb3BlIF9jb252ZXJ0U3BpbmUyU0UoWE1MU3BpbmUgc3BpbmUpIFhNTFNwaW5lCi0gKiBfY29udmVydE9NMlNwaW5lKE9NRWxlbWVudCBvbSkgWE1MU3BpbmUgX2NvbnZlcnRTRTJTcGluZShTT0FQRW52ZWxvcGUgc2UpIFhNTFNwaW5lCi0gKiBfY3JlYXRlU3BpbmUoUHJvdG9jb2wgcHJvdG9jb2wpCi0gKiA8cC8+Ci0gKiBOT1RFOiBGb3IgWE1ML0hUVFAgKFJFU1QpLCBhIFNPQVAgMS4xLiBFbnZlbG9wZSBpcyBidWlsdCBhbmQgdGhlIHJlc3QgcGF5bG9hZCBpcyBwbGFjZWQgaW4gdGhlCi0gKiBib2R5LiAgVGhpcyBwdXJwb3NlbHkgbWltaWNzIHRoZSBBeGlzMiBpbXBsZW1lbnRhdGlvbi4KLSAqCi0gKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5YTUxQYXJ0Ci0gKiBAc2VlIFhNTFBhcnRJbXBsCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBYTUxQYXJ0QmFzZSBpbXBsZW1lbnRzIFhNTFBhcnQgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFhNTFBhcnRCYXNlLmNsYXNzKTsKLQotICAgIFByb3RvY29sIHByb3RvY29sID0gUHJvdG9jb2wudW5rbm93bjsgIC8vIFByb3RvY29sIGRlZmF1bHRzIHRvIHVua25vd24KLSAgICBTdHlsZSBzdHlsZSA9IFN0eWxlLkRPQ1VNRU5UOyAgICAgICAgICAvLyBTdHlsZSBkZWZhdWx0cyB0byBkb2N1bWVudAotICAgIGludCBpbmRpcmVjdGlvbiA9IDA7ICAgICAgICAgICAgICAgICAgIC8vIERlZmF1bHQgaW5kaXJlY3Rpb24gZm9yIERvY3VtZW50Ci0KLSAgICAvLyBUaGUgYWN0dWFsIHhtbCByZXByZXNlbnRhdGlvbiBpcyBhbHdheXMgb25lIG9mIHRoZSBmb2xsb3dpbmcKLSAgICAvLyAgIE9NIGlmIHRoZSBjb250ZW50IGlzIGFuIE9NIHRyZWUKLSAgICAvLyAgIFNPQVBFTlZFTE9QRSBpZiB0aGUgY29udGVudCBpcyBhIFNPQVBFbnZlbG9wZQotICAgIC8vICAgU1BJTkUgaWYgdGhlIGNvbnRlbnQgaXMgYSBPTSAic3BpbmUiICsgQmxvY2tzCi0gICAgT2JqZWN0IGNvbnRlbnQgPSBudWxsOwotICAgIGludCBjb250ZW50VHlwZSA9IFVOS05PV047Ci0KLSAgICBzdGF0aWMgZmluYWwgaW50IFVOS05PV04gPSAwOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgT00gPSAxOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgU09BUEVOVkVMT1BFID0gMjsKLSAgICBzdGF0aWMgZmluYWwgaW50IFNQSU5FID0gMzsKLQotICAgIGJvb2xlYW4gY29uc3VtZWQgPSBmYWxzZTsKLQotICAgIE1lc3NhZ2VJbXBsIHBhcmVudDsKLQotCi0gICAgLyoqCi0gICAgICogWE1MUGFydCBzaG91bGQgYmUgY29uc3RydWN0ZWQgdmlhIHRoZSBYTUxQYXJ0RmFjdG9yeS4gVGhpcyBjb25zdHJ1Y3RvciBjb25zdHJ1Y3RzIGFuIGVtcHR5Ci0gICAgICogWE1MUGFydCB3aXRoIHRoZSBzcGVjaWZpZWQgcHJvdG9jb2wKLSAgICAgKgotICAgICAqIEBwYXJhbSBwcm90b2NvbAotICAgICAqIEB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbgotICAgICAqLwotICAgIFhNTFBhcnRCYXNlKFByb3RvY29sIHByb3RvY29sKSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIGlmIChwcm90b2NvbC5lcXVhbHMoUHJvdG9jb2wudW5rbm93bikpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkKLSAgICAgICAgICAgICAgICAgICAgLm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoIlByb3RvY29sSXNOb3RLbm93biIpKTsKLSAgICAgICAgfQotICAgICAgICBjb250ZW50ID0gX2NyZWF0ZVNwaW5lKHByb3RvY29sLCBnZXRTdHlsZSgpLCBnZXRJbmRpcmVjdGlvbigpLCBudWxsKTsKLSAgICAgICAgdGhpcy5wcm90b2NvbCA9ICgoWE1MU3BpbmUpY29udGVudCkuZ2V0UHJvdG9jb2woKTsKLSAgICAgICAgY29udGVudFR5cGUgPSBTUElORTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBYTUxQYXJ0IHNob3VsZCBiZSBjb25zdHJ1Y3RlZCB2aWEgdGhlIFhNTFBhcnRGYWN0b3J5LiBUaGlzIGNvbnN0cnVjdG9yIGNyZWF0ZXMgYW4gWE1MUGFydCBmcm9tCi0gICAgICogdGhlIHNwZWNpZmllZCByb290LgotICAgICAqCi0gICAgICogQHBhcmFtIHJvb3QKLSAgICAgKiBAcGFyYW0gcHJvdG9jb2wgKGlmIG51bGwsIHRoZSBzb2FwIHByb3RvY29sIGlzIGluZmVycmVkIGZyb20gdGhlIG5hbWVzcGFjZSkKLSAgICAgKiBAdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24KLSAgICAgKi8KLSAgICBYTUxQYXJ0QmFzZShPTUVsZW1lbnQgcm9vdCwgUHJvdG9jb2wgcHJvdG9jb2wpIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgY29udGVudCA9IHJvb3Q7Ci0gICAgICAgIGNvbnRlbnRUeXBlID0gT007Ci0gICAgICAgIFFOYW1lIHFOYW1lID0gcm9vdC5nZXRRTmFtZSgpOwotICAgICAgICBpZiAocHJvdG9jb2wgPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKHFOYW1lLmdldE5hbWVzcGFjZVVSSSgpLmVxdWFscyhTT0FQMTFDb25zdGFudHMuU09BUF9FTlZFTE9QRV9OQU1FU1BBQ0VfVVJJKSkgewotICAgICAgICAgICAgICAgIHRoaXMucHJvdG9jb2wgPSBQcm90b2NvbC5zb2FwMTE7Ci0gICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIGlmIChxTmFtZS5nZXROYW1lc3BhY2VVUkkoKS5lcXVhbHMoU09BUDEyQ29uc3RhbnRzLlNPQVBfRU5WRUxPUEVfTkFNRVNQQUNFX1VSSSkpIHsKLSAgICAgICAgICAgICAgICB0aGlzLnByb3RvY29sID0gUHJvdG9jb2wuc29hcDEyOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHByb3RvY29sID09IFByb3RvY29sLnJlc3QpIHsKLSAgICAgICAgICAgIHRoaXMucHJvdG9jb2wgPSBQcm90b2NvbC5yZXN0OwotICAgICAgICAgICAgLy8gQXhpczIgc3RvcmVzIFhNTC9IVFRQIG1lc3NhZ2VzIGluc2lkZSBhIHNvYXAxMSBlbnZlbG9wZS4gIFdlIHdpbGwgbWltaWMgdGhpcyBiZWhhdmlvcgotICAgICAgICAgICAgaWYgKHFOYW1lLmdldE5hbWVzcGFjZVVSSSgpLmVxdWFscyhTT0FQMTFDb25zdGFudHMuU09BUF9FTlZFTE9QRV9OQU1FU1BBQ0VfVVJJKSkgewotICAgICAgICAgICAgICAgIC8vIE9rYXkKLSAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgaWYgKHFOYW1lLmdldE5hbWVzcGFjZVVSSSgpLmVxdWFscyhTT0FQMTJDb25zdGFudHMuU09BUF9FTlZFTE9QRV9OQU1FU1BBQ0VfVVJJKSkgewotICAgICAgICAgICAgICAgIC8vIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkuCi0gICAgICAgICAgICAgICAgLy8gICAgbWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgicmVzdFdpdGhTT0FQRXJyIikpOwotICAgICAgICAgICAgICAgIC8vIE9rZXkKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgY29udGVudCA9IF9jcmVhdGVTcGluZShQcm90b2NvbC5yZXN0LCBTdHlsZS5ET0NVTUVOVCwgMCwgcm9vdCk7Ci0gICAgICAgICAgICAgICAgY29udGVudFR5cGUgPSBTUElORTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRoaXMucHJvdG9jb2wgPSBwcm90b2NvbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFhNTFBhcnQgc2hvdWxkIGJlIGNvbnN0cnVjdGVkIHZpYSB0aGUgWE1MUGFydEZhY3RvcnkuIFRoaXMgY29uc3RydWN0b3IgY3JlYXRlcyBhbiBYTUxQYXJ0IGZyb20KLSAgICAgKiB0aGUgc3BlY2lmaWVkIHJvb3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcm9vdAotICAgICAqIEB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbgotICAgICAqLwotICAgIFhNTFBhcnRCYXNlKFNPQVBFbnZlbG9wZSByb290KSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGNvbnRlbnQgPSByb290OwotICAgICAgICBjb250ZW50VHlwZSA9IFNPQVBFTlZFTE9QRTsKLSAgICAgICAgU3RyaW5nIG5zID0gcm9vdC5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgaWYgKG5zLmVxdWFscyhTT0FQMTFDb25zdGFudHMuU09BUF9FTlZFTE9QRV9OQU1FU1BBQ0VfVVJJKSkgewotICAgICAgICAgICAgcHJvdG9jb2wgPSBQcm90b2NvbC5zb2FwMTE7Ci0gICAgICAgIH0gZWxzZSBpZiAobnMuZXF1YWxzKFNPQVAxMkNvbnN0YW50cy5TT0FQX0VOVkVMT1BFX05BTUVTUEFDRV9VUkkpKSB7Ci0gICAgICAgICAgICBwcm90b2NvbCA9IFByb3RvY29sLnNvYXAxMjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkKLSAgICAgICAgICAgICAgICAgICAgLm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoIlJFU1RJc05vdFN1cHBvcnRlZCIpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZXRDb250ZW50KE9iamVjdCBjb250ZW50LCBpbnQgY29udGVudFR5cGUpIHsKLSAgICAgICAgdGhpcy5jb250ZW50ID0gY29udGVudDsKLSAgICAgICAgdGhpcy5jb250ZW50VHlwZSA9IGNvbnRlbnRUeXBlOwotICAgIH0KLQotICAgIHByaXZhdGUgT01FbGVtZW50IGdldENvbnRlbnRBc09NRWxlbWVudCgpIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLQotICAgICAgICBPTUVsZW1lbnQgb20gPSBudWxsOwotICAgICAgICBzd2l0Y2ggKGNvbnRlbnRUeXBlKSB7Ci0gICAgICAgICAgICBjYXNlIChPTSk6Ci0gICAgICAgICAgICAgICAgb20gPSAoT01FbGVtZW50KWNvbnRlbnQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIChTUElORSk6Ci0gICAgICAgICAgICAgICAgb20gPSBfY29udmVydFNwaW5lMk9NKChYTUxTcGluZSljb250ZW50KTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgKFNPQVBFTlZFTE9QRSk6Ci0gICAgICAgICAgICAgICAgb20gPSBfY29udmVydFNFMk9NKChTT0FQRW52ZWxvcGUpY29udGVudCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJYTUxQYXJ0SW1wbEVycjIiKSk7Ci0gICAgICAgIH0KLSAgICAgICAgc2V0Q29udGVudChvbSwgT00pOwotICAgICAgICByZXR1cm4gb207Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTT0FQRW52ZWxvcGUgZ2V0Q29udGVudEFzU09BUEVudmVsb3BlKCkgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICBTT0FQRW52ZWxvcGUgc2UgPSBudWxsOwotICAgICAgICBzd2l0Y2ggKGNvbnRlbnRUeXBlKSB7Ci0gICAgICAgICAgICBjYXNlIChTT0FQRU5WRUxPUEUpOgotICAgICAgICAgICAgICAgIHNlID0gKFNPQVBFbnZlbG9wZSljb250ZW50OwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAoU1BJTkUpOgotICAgICAgICAgICAgICAgIHNlID0gX2NvbnZlcnRTcGluZTJTRSgoWE1MU3BpbmUpY29udGVudCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIChPTSk6Ci0gICAgICAgICAgICAgICAgc2UgPSBfY29udmVydE9NMlNFKChPTUVsZW1lbnQpY29udGVudCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJYTUxQYXJ0SW1wbEVycjIiKSk7Ci0gICAgICAgIH0KLSAgICAgICAgc2V0Q29udGVudChzZSwgU09BUEVOVkVMT1BFKTsKLSAgICAgICAgcmV0dXJuIHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgWE1MU3BpbmUgZ2V0Q29udGVudEFzWE1MU3BpbmUoKSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIFhNTFNwaW5lIHNwaW5lID0gbnVsbDsKLSAgICAgICAgc3dpdGNoIChjb250ZW50VHlwZSkgewotICAgICAgICAgICAgY2FzZSAoU1BJTkUpOgotICAgICAgICAgICAgICAgIHNwaW5lID0gKFhNTFNwaW5lKWNvbnRlbnQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIChTT0FQRU5WRUxPUEUpOgotICAgICAgICAgICAgICAgIHNwaW5lID0gX2NvbnZlcnRTRTJTcGluZSgoU09BUEVudmVsb3BlKWNvbnRlbnQpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAoT00pOgotICAgICAgICAgICAgICAgIHNwaW5lID0gX2NvbnZlcnRPTTJTcGluZSgoT01FbGVtZW50KWNvbnRlbnQpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Ci0gICAgICAgICAgICAgICAgICAgICAgICAubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiWE1MUGFydEltcGxFcnIyIikpOwotICAgICAgICB9Ci0gICAgICAgIHNwaW5lLnNldFBhcmVudChnZXRQYXJlbnQoKSk7Ci0gICAgICAgIHNldENvbnRlbnQoc3BpbmUsIFNQSU5FKTsKLSAgICAgICAgcmV0dXJuIHNwaW5lOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuWE1MUGFydCNnZXRBc09NRWxlbWVudCgpCi0gICAgICAqLwotICAgIHB1YmxpYyBPTUVsZW1lbnQgZ2V0QXNPTUVsZW1lbnQoKSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBnZXRDb250ZW50QXNPTUVsZW1lbnQoKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLlhNTFBhcnQjZ2V0QXNTT0FQRW52ZWxvcGUoKQotICAgICAgKi8KLSAgICBwdWJsaWMgU09BUEVudmVsb3BlIGdldEFzU09BUEVudmVsb3BlKCkgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZ2V0Q29udGVudEFzU09BUEVudmVsb3BlKCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5YTUxQYXJ0I2dldFByb3RvY29sKCkKLSAgICAgICovCi0gICAgcHVibGljIFByb3RvY29sIGdldFByb3RvY29sKCkgewotICAgICAgICByZXR1cm4gcHJvdG9jb2w7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5YTUxQYXJ0I2dldFN0eWxlKCkKLSAgICAgICovCi0gICAgcHVibGljIFN0eWxlIGdldFN0eWxlKCkgewotICAgICAgICByZXR1cm4gc3R5bGU7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuWE1MUGFydCNnZXRJbmRpcmVjdGlvbigpCi0gICAgKi8KLSAgICBwdWJsaWMgaW50IGdldEluZGlyZWN0aW9uKCkgewotICAgICAgICByZXR1cm4gaW5kaXJlY3Rpb247Ci0gICAgfQotCi0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5YTUxQYXJ0I3NldFN0eWxlKGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlN0eWxlKQotICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U3R5bGUoU3R5bGUgc3R5bGUpIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHRoaXMuc3R5bGUgIT0gc3R5bGUpIHsKLSAgICAgICAgICAgIGlmIChjb250ZW50VHlwZSA9PSBTUElORSkgewotICAgICAgICAgICAgICAgIC8vIE11c3Qgc3dpdGNoIHRvIHNvbWV0aGluZyBvdGhlciB0aGFuIFhNTFNwaW5lCi0gICAgICAgICAgICAgICAgZ2V0Q29udGVudEFzT01FbGVtZW50KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy5zdHlsZSA9IHN0eWxlOwotICAgICAgICBpZiAoc3R5bGUgPT0gU3R5bGUuUlBDKSB7Ci0gICAgICAgICAgICBzZXRJbmRpcmVjdGlvbigxKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNldEluZGlyZWN0aW9uKDApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SW5kaXJlY3Rpb24oaW50IGluZGlyZWN0aW9uKSB7Ci0gICAgICAgIGlmICh0aGlzLmluZGlyZWN0aW9uICE9IGluZGlyZWN0aW9uKSB7Ci0gICAgICAgICAgICBpZiAoY29udGVudFR5cGUgPT0gU1BJTkUpIHsKLSAgICAgICAgICAgICAgICAvLyBNdXN0IHN3aXRjaCB0byBzb21ldGhpbmcgb3RoZXIgdGhhbiBYTUxTcGluZQotICAgICAgICAgICAgICAgIGdldENvbnRlbnRBc09NRWxlbWVudCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHRoaXMuaW5kaXJlY3Rpb24gPSBpbmRpcmVjdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUU5hbWUgZ2V0T3BlcmF0aW9uRWxlbWVudCgpIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChzdHlsZSAhPSBTdHlsZS5SUEMpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN3aXRjaCAoY29udGVudFR5cGUpIHsKLSAgICAgICAgICAgICAgICBjYXNlIE9NOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gKChvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlKWNvbnRlbnQpLmdldEJvZHkoKS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRGaXJzdEVsZW1lbnQoKS5nZXRRTmFtZSgpOwotICAgICAgICAgICAgICAgIGNhc2UgU1BJTkU6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAoKFhNTFNwaW5lKWNvbnRlbnQpLmdldE9wZXJhdGlvbkVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICBjYXNlIFNPQVBFTlZFTE9QRToKLSAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3IgaXQgPSAoKFNPQVBFbnZlbG9wZSljb250ZW50KS5nZXRCb2R5KCkuZ2V0Q2hpbGRFbGVtZW50cygpOwotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBOb2RlIG5vZGUgPSAoTm9kZSlpdC5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIFNPQVBFbGVtZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSBuYW1lID0gKChTT0FQRWxlbWVudClub2RlKS5nZXRFbGVtZW50TmFtZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUU5hbWUobmFtZS5nZXRVUkkoKSwgbmFtZS5nZXRMb2NhbE5hbWUoKSwgbmFtZS5nZXRQcmVmaXgoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9IGNhdGNoIChTT0FQRXhjZXB0aW9uIHNlKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKHNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE9wZXJhdGlvbkVsZW1lbnQoUU5hbWUgb3BlcmF0aW9uUU5hbWUpIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGluZGlyZWN0aW9uID09IDEpIHsKLSAgICAgICAgICAgIHRoaXMuZ2V0Q29udGVudEFzWE1MU3BpbmUoKS5zZXRPcGVyYXRpb25FbGVtZW50KG9wZXJhdGlvblFOYW1lKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5YTUxQYXJ0I2dldFhNTFBhcnRDb250ZW50VHlwZSgpCi0JICovCi0gICAgcHVibGljIFN0cmluZyBnZXRYTUxQYXJ0Q29udGVudFR5cGUoKSB7Ci0gICAgICAgIHN3aXRjaCAoY29udGVudFR5cGUpIHsKLSAgICAgICAgICAgIGNhc2UgT006Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJPTSI7Ci0gICAgICAgICAgICBjYXNlIFNPQVBFTlZFTE9QRToKLSAgICAgICAgICAgICAgICByZXR1cm4gIlNPQVBFTlZFTE9QRSI7Ci0gICAgICAgICAgICBjYXNlIFNQSU5FOgotICAgICAgICAgICAgICAgIHJldHVybiAiU1BJTkUiOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICByZXR1cm4gIlVOS05PV04iOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLlhNTFBhcnQjZ2V0WE1MU3RyZWFtUmVhZGVyKGJvb2xlYW4pCi0gICAgICovCi0gICAgcHVibGljIFhNTFN0cmVhbVJlYWRlciBnZXRYTUxTdHJlYW1SZWFkZXIoYm9vbGVhbiBjb25zdW1lKSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChjb25zdW1lZCkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJYTUxQYXJ0SW1wbEVycjEiKSk7Ci0gICAgICAgIH0KLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHJlYWRlciA9IG51bGw7Ci0gICAgICAgIGlmIChjb250ZW50VHlwZSA9PSBTUElORSkgewotICAgICAgICAgICAgcmVhZGVyID0gZ2V0Q29udGVudEFzWE1MU3BpbmUoKS5nZXRYTUxTdHJlYW1SZWFkZXIoY29uc3VtZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gZ2V0Q29udGVudEFzT01FbGVtZW50KCk7Ci0gICAgICAgICAgICBpZiAoY29uc3VtZSkgewotICAgICAgICAgICAgICAgIHJlYWRlciA9IG9tRWxlbWVudC5nZXRYTUxTdHJlYW1SZWFkZXJXaXRob3V0Q2FjaGluZygpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZWFkZXIgPSBvbUVsZW1lbnQuZ2V0WE1MU3RyZWFtUmVhZGVyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgc2V0Q29uc3VtZWQoY29uc3VtZSk7Ci0gICAgICAgIHJldHVybiByZWFkZXI7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5YTUxQYXJ0I2dldFhNTEZhdWx0KCkKLSAgICAgICovCi0gICAgcHVibGljIFhNTEZhdWx0IGdldFhNTEZhdWx0KCkgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotCi0gICAgICAgIFhNTEZhdWx0IHhtbEZhdWx0ID0gbnVsbDsKLQotICAgICAgICBpZiAoaXNGYXVsdCgpKSB7Ci0gICAgICAgICAgICAvLyBBbiBYTUxGYXVsdCByZXByZXNlbnRzIHRoZSBkZXRhaWwgZWxlbWVudHMgYXMgQmxvY2tzLCBzbyAKLSAgICAgICAgICAgIC8vIGl0IG1ha2VzIHNlbnNlIHRvIGNvbnZlcnQgdGhlIHJlcHJlc2VudGF0aW9uIHRvIGEgU3BpbmUgc2luY2UKLSAgICAgICAgICAgIC8vIHRoYXQgaXMgd2hhdCB3ZSBkbyBpbiBvdGhlciBzaXR1YXRpb25zIHdoZXJlIHdlIG5lZWQgYSBCbG9jay4KLSAgICAgICAgICAgIC8vIE9mIGNvdXJzZSB0aGVyZSBpcyBzb21lIGFkZGl0aW9uYWwgb3B0aW1pemF0aW9uIHRoYXQgY291bGQgYmUgZG9uZS4KLSAgICAgICAgICAgIC8vIElmIHdlIGNhbiBkZXRlcm1pbmUgdGhhdCB0aGVyZSBhcmUgbm8gZGV0YWlsIGVsZW1lbnRzLCB0aGVuIHdlIGNvdWxkCi0gICAgICAgICAgICAvLyBidWlsZCB0aGUgZmF1bHQgZnJvbSBhbiBPTSBvciBTT0FQRW52ZWxvcGUuICAKLSAgICAgICAgICAgIFhNTFNwaW5lIHNwaW5lID0gZ2V0Q29udGVudEFzWE1MU3BpbmUoKTsKLSAgICAgICAgICAgIHhtbEZhdWx0ID0gc3BpbmUuZ2V0WE1MRmF1bHQoKTsKLQotICAgICAgICAgICAgLy8gRm9yIGVhY2ggYmxvY2sgaW4gdGhlIHhtbGZhdWx0LCBzZXQgdGhlIG1lc3NhZ2UKLSAgICAgICAgICAgIEJsb2NrW10gYmxvY2tzID0geG1sRmF1bHQuZ2V0RGV0YWlsQmxvY2tzKCk7Ci0gICAgICAgICAgICBpZiAoYmxvY2tzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJsb2Nrcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBibG9ja3NbaV0uc2V0UGFyZW50KGdldFBhcmVudCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHhtbEZhdWx0OwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuWE1MUGFydCNzZXRYTUxGYXVsdChvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuWE1MRmF1bHQpCi0gICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFhNTEZhdWx0KFhNTEZhdWx0IHhtbEZhdWx0KSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIEZvciBlYWNoIGJsb2NrIGluIHRoZSB4bWxmYXVsdCwgc2V0IHRoZSBtZXNzYWdlCi0gICAgICAgIEJsb2NrW10gYmxvY2tzID0geG1sRmF1bHQuZ2V0RGV0YWlsQmxvY2tzKCk7Ci0gICAgICAgIGlmIChibG9ja3MgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBibG9ja3MubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBibG9ja3NbaV0uc2V0UGFyZW50KGdldFBhcmVudCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBTaW5jZSB0aGUgWE1MRmF1bHQgY29udGFpbnMgZGV0YWlsIEJsb2NrcyBpdCBtYWtlcyBzZW5jZSB0byBjb252ZXJ0Ci0gICAgICAgIC8vIHRvIGFuIFhNTFNwaW5lIGZpcnN0IChzaW5jZSB0aGF0IGlzIHdoYXQgd2UgZG8gaW4gdGhlIG90aGVyIGNhbGxzIHRoYXQgc2V0IEJsb2NrcykuCi0gICAgICAgIC8vIE9mIGNvdXJzZSBpZiB0aGUgWE1MRmF1bHQgZGlkIG5vdCBoYXZlIGRldGFpbCBCbG9ja3Mgd2UgbWlnaHQgYmUgYWJsZSB0byAKLSAgICAgICAgLy8gZG8gdGhpcyB3aXRob3V0IGEgdHJhbnNmb3JtYXRpb24gb2YgdGhlIGRhdGEuICAKLSAgICAgICAgWE1MU3BpbmUgc3BpbmUgPSBnZXRDb250ZW50QXNYTUxTcGluZSgpOwotICAgICAgICBzcGluZS5zZXRYTUxGYXVsdCh4bWxGYXVsdCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5YTUxQYXJ0I2lzRmF1bHQoKQotICAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0ZhdWx0KCkgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICBpZiAoY29uc3VtZWQpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiWE1MUGFydEltcGxFcnIxIikpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHN3aXRjaCAoY29udGVudFR5cGUpIHsKLSAgICAgICAgICAgICAgICBjYXNlIE9NOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gWE1MRmF1bHRVdGlscy5pc0ZhdWx0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlKWdldENvbnRlbnRBc09NRWxlbWVudCgpKTsKLSAgICAgICAgICAgICAgICBjYXNlIFNPQVBFTlZFTE9QRToKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFhNTEZhdWx0VXRpbHMuaXNGYXVsdChnZXRDb250ZW50QXNTT0FQRW52ZWxvcGUoKSk7Ci0gICAgICAgICAgICAgICAgY2FzZSBTUElORToKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldENvbnRlbnRBc1hNTFNwaW5lKCkuaXNGYXVsdCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChTT0FQRXhjZXB0aW9uIHNlKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKHNlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5YTUxQYXJ0I2lzQ29uc3VtZWQoKQotICAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0NvbnN1bWVkKCkgewotICAgICAgICByZXR1cm4gY29uc3VtZWQ7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5YTUxQYXJ0I291dHB1dFRvKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyLCBib29sZWFuKQotICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvdXRwdXRUbyhYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyLCBib29sZWFuIGNvbnN1bWUpCi0gICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uLCBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGNvbnN1bWVkKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoIlhNTFBhcnRJbXBsRXJyMSIpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY29udGVudFR5cGUgPT0gU1BJTkUpIHsKLSAgICAgICAgICAgIGdldENvbnRlbnRBc1hNTFNwaW5lKCkub3V0cHV0VG8od3JpdGVyLCBjb25zdW1lKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSBnZXRDb250ZW50QXNPTUVsZW1lbnQoKTsKLSAgICAgICAgICAgIGlmIChjb25zdW1lKSB7Ci0gICAgICAgICAgICAgICAgb21FbGVtZW50LnNlcmlhbGl6ZUFuZENvbnN1bWUod3JpdGVyKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgb21FbGVtZW50LnNlcmlhbGl6ZSh3cml0ZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHNldENvbnN1bWVkKGNvbnN1bWUpOwotICAgICAgICByZXR1cm47Ci0KLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLlhNTFBhcnQjdHJhY2VTdHJpbmcoamF2YS5sYW5nLlN0cmluZykKLSAgICAgICovCi0gICAgcHVibGljIFN0cmluZyB0cmFjZVN0cmluZyhTdHJpbmcgaW5kZW50KSB7Ci0gICAgICAgIC8vIFRPRE8KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5YTUxQYXJ0I2dldEJvZHlCbG9jayhpbnQsIGphdmEubGFuZy5PYmplY3QsIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5mYWN0b3J5LkJsb2NrRmFjdG9yeSkKLSAgICAgICovCi0gICAgcHVibGljIEJsb2NrIGdldEJvZHlCbG9jayhpbnQgaW5kZXgsIE9iamVjdCBjb250ZXh0LCBCbG9ja0ZhY3RvcnkgYmxvY2tGYWN0b3J5KQotICAgICAgICAgICAgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICBCbG9jayBibG9jayA9IGdldENvbnRlbnRBc1hNTFNwaW5lKCkuZ2V0Qm9keUJsb2NrKGluZGV4LCBjb250ZXh0LCBibG9ja0ZhY3RvcnkpOwotICAgICAgICBpZiAoYmxvY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgYmxvY2suc2V0UGFyZW50KGdldFBhcmVudCgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYmxvY2s7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuWE1MUGFydCNnZXRCb2R5QmxvY2soamF2YS5sYW5nLk9iamVjdCwgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmZhY3RvcnkuQmxvY2tGYWN0b3J5KQotICAgICovCi0gICAgcHVibGljIEJsb2NrIGdldEJvZHlCbG9jayhPYmplY3QgY29udGV4dCwgQmxvY2tGYWN0b3J5IGJsb2NrRmFjdG9yeSkKLSAgICAgICAgICAgIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgQmxvY2sgYmxvY2sgPSBnZXRDb250ZW50QXNYTUxTcGluZSgpLmdldEJvZHlCbG9jayhjb250ZXh0LCBibG9ja0ZhY3RvcnkpOwotICAgICAgICBpZiAoYmxvY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgYmxvY2suc2V0UGFyZW50KGdldFBhcmVudCgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYmxvY2s7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5YTUxQYXJ0I2dldEhlYWRlckJsb2NrKGphdmEubGFuZy5TdHJpbmcsIAotICAgICAgKiBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0LCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZmFjdG9yeS5CbG9ja0ZhY3RvcnkpCi0gICAgICAqLwotICAgIHB1YmxpYyBCbG9jayBnZXRIZWFkZXJCbG9jayhTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbG9jYWxQYXJ0LCBPYmplY3QgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmxvY2tGYWN0b3J5IGJsb2NrRmFjdG9yeSkgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICBCbG9jayBibG9jayA9Ci0gICAgICAgICAgICAgICAgZ2V0Q29udGVudEFzWE1MU3BpbmUoKS5nZXRIZWFkZXJCbG9jayhuYW1lc3BhY2UsIGxvY2FsUGFydCwgY29udGV4dCwgYmxvY2tGYWN0b3J5KTsKLSAgICAgICAgaWYgKGJsb2NrICE9IG51bGwpIHsKLSAgICAgICAgICAgIGJsb2NrLnNldFBhcmVudChnZXRQYXJlbnQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJsb2NrOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU2V0PFFOYW1lPiBnZXRIZWFkZXJRTmFtZXMoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKGNvbnRlbnRUeXBlKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBPTTogewotICAgICAgICAgICAgICAgICAgICBIYXNoU2V0PFFOYW1lPiBxbmFtZXMgPSBuZXcgSGFzaFNldDxRTmFtZT4oKTsKLSAgICAgICAgICAgICAgICAgICAgT01FbGVtZW50IG9tID0gdGhpcy5nZXRBc09NRWxlbWVudCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAob20gaW5zdGFuY2VvZiBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlIHNlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZSkgb207Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEhlYWRlciBoZWFkZXIgPSBzZS5nZXRIZWFkZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoZWFkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGl0ID0gaGVhZGVyLmdldENoaWxkRWxlbWVudHMoKTsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGl0ICE9IG51bGwgJiYgaXQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBub2RlID0gaXQubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIE9NRWxlbWVudCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcW5hbWVzLmFkZCgoKE9NRWxlbWVudCkgbm9kZSkuZ2V0UU5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHFuYW1lczsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2FzZSBTT0FQRU5WRUxPUEU6IHsKLSAgICAgICAgICAgICAgICAgICAgSGFzaFNldDxRTmFtZT4gcW5hbWVzID0gbmV3IEhhc2hTZXQ8UU5hbWU+KCk7Ci0gICAgICAgICAgICAgICAgICAgIFNPQVBFbnZlbG9wZSBzZSA9IHRoaXMuZ2V0Q29udGVudEFzU09BUEVudmVsb3BlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTT0FQSGVhZGVyIGhlYWRlciA9IHNlLmdldEhlYWRlcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhlYWRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3IgaXQgPSBoZWFkZXIuZ2V0Q2hpbGRFbGVtZW50cygpOyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaXQgIT0gbnVsbCAmJiBpdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IG5vZGUgPSBpdC5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgU09BUEVsZW1lbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFuYW1lcy5hZGQoKChTT0FQRWxlbWVudCkgbm9kZSkuZ2V0RWxlbWVudFFOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBxbmFtZXM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhc2UgU1BJTkU6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRDb250ZW50QXNYTUxTcGluZSgpLmdldEhlYWRlclFOYW1lcygpOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChTT0FQRXhjZXB0aW9uIHNlKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKHNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PEJsb2NrPiBnZXRIZWFkZXJCbG9ja3MoU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIGxvY2FsUGFydCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb250ZXh0LCBCbG9ja0ZhY3RvcnkgYmxvY2tGYWN0b3J5LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUm9sZVBsYXllciByb2xlUGxheWVyKSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIExpc3Q8QmxvY2s+IGJsb2NrcyA9Ci0gICAgICAgICAgICBnZXRDb250ZW50QXNYTUxTcGluZSgpLmdldEhlYWRlckJsb2NrcyhuYW1lc3BhY2UsIGxvY2FsUGFydCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LCBibG9ja0ZhY3RvcnksIHJvbGVQbGF5ZXIpOwotICAgICAgICBmb3IoQmxvY2sgYmxvY2s6YmxvY2tzKSB7Ci0gICAgICAgICAgICBpZiAoYmxvY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGJsb2NrLnNldFBhcmVudChnZXRQYXJlbnQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJsb2NrczsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLlhNTFBhcnQjZ2V0TnVtQm9keUJsb2NrcygpCi0gICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0TnVtQm9keUJsb2NrcygpIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGdldENvbnRlbnRBc1hNTFNwaW5lKCkuZ2V0TnVtQm9keUJsb2NrcygpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuWE1MUGFydCNnZXROdW1IZWFkZXJCbG9ja3MoKQotICAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldE51bUhlYWRlckJsb2NrcygpIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGdldENvbnRlbnRBc1hNTFNwaW5lKCkuZ2V0TnVtSGVhZGVyQmxvY2tzKCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5YTUxQYXJ0I3JlbW92ZUJvZHlCbG9jayhpbnQpCi0gICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZUJvZHlCbG9jayhpbnQgaW5kZXgpIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgZ2V0Q29udGVudEFzWE1MU3BpbmUoKS5yZW1vdmVCb2R5QmxvY2soaW5kZXgpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuWE1MUGFydCNyZW1vdmVIZWFkZXJCbG9jayhqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVIZWFkZXJCbG9jayhTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbG9jYWxQYXJ0KSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGdldENvbnRlbnRBc1hNTFNwaW5lKCkucmVtb3ZlSGVhZGVyQmxvY2sobmFtZXNwYWNlLCBsb2NhbFBhcnQpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuWE1MUGFydCNzZXRCb2R5QmxvY2soaW50LCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuQmxvY2spCi0gICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEJvZHlCbG9jayhpbnQgaW5kZXgsIEJsb2NrIGJsb2NrKSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGJsb2NrLnNldFBhcmVudChnZXRQYXJlbnQoKSk7Ci0gICAgICAgIGdldENvbnRlbnRBc1hNTFNwaW5lKCkuc2V0Qm9keUJsb2NrKGluZGV4LCBibG9jayk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuWE1MUGFydCNzZXRCb2R5QmxvY2soaW50LCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuQmxvY2spCi0gICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRCb2R5QmxvY2soQmxvY2sgYmxvY2spIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgYmxvY2suc2V0UGFyZW50KGdldFBhcmVudCgpKTsKLSAgICAgICAgZ2V0Q29udGVudEFzWE1MU3BpbmUoKS5zZXRCb2R5QmxvY2soYmxvY2spOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuWE1MUGFydCNzZXRIZWFkZXJCbG9jayhqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuQmxvY2spCi0gICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEhlYWRlckJsb2NrKFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBsb2NhbFBhcnQsIEJsb2NrIGJsb2NrKQotICAgICAgICAgICAgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICBibG9jay5zZXRQYXJlbnQoZ2V0UGFyZW50KCkpOwotICAgICAgICBnZXRDb250ZW50QXNYTUxTcGluZSgpLnNldEhlYWRlckJsb2NrKG5hbWVzcGFjZSwgbG9jYWxQYXJ0LCBibG9jayk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGFwcGVuZEhlYWRlckJsb2NrKFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBsb2NhbFBhcnQsIEJsb2NrIGJsb2NrKQotICAgIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgYmxvY2suc2V0UGFyZW50KGdldFBhcmVudCgpKTsKLSAgICAgICAgZ2V0Q29udGVudEFzWE1MU3BpbmUoKS5hcHBlbmRIZWFkZXJCbG9jayhuYW1lc3BhY2UsIGxvY2FsUGFydCwgYmxvY2spOwotICAgIH0KLQotICAgIC8qCi0gICAgKiAobm9uLUphdmFkb2MpCi0gICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5YTUxQYXJ0I2dldFBhcmVudCgpCi0gICAgKi8KLSAgICBwdWJsaWMgTWVzc2FnZSBnZXRQYXJlbnQoKSB7Ci0gICAgICAgIHJldHVybiBwYXJlbnQ7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBTZXQgdGhlIGJhY2twb2ludGVyIHRvIHRoaXMgWE1MUGFydCdzIHBhcmVudCBNZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UGFyZW50KE1lc3NhZ2UgcCkgewotICAgICAgICBwYXJlbnQgPSAoTWVzc2FnZUltcGwpIHA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydCBTT0FQRW52ZWxvcGUgaW50byBhbiBPTSB0cmVlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2UgU09BUEVudmVsb3BlCi0gICAgICogQHJldHVybiBPTQotICAgICAqIEB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBPTUVsZW1lbnQgX2NvbnZlcnRTRTJPTShTT0FQRW52ZWxvcGUgc2UpIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogQ29udmVydCBYTUxTcGluZSBpbnRvIGFuIE9NIHRyZWUKLSAgICAgKgotICAgICAqIEBwYXJhbSBzcGluZSBYTUxTcGluZQotICAgICAqIEByZXR1cm4gT00KLSAgICAgKiBAdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgT01FbGVtZW50IF9jb252ZXJ0U3BpbmUyT00oWE1MU3BpbmUgc3BpbmUpIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogQ29udmVydCBPTSB0cmVlIGludG8gYSBTT0FQRW52ZWxvcGUKLSAgICAgKgotICAgICAqIEBwYXJhbSBvbQotICAgICAqIEByZXR1cm4gU09BUEVudmVsb3BlCi0gICAgICogQHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IFNPQVBFbnZlbG9wZSBfY29udmVydE9NMlNFKE9NRWxlbWVudCBvbSkgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0IFhNTFNwaW5lIGludG8gYSBTT0FQRW52ZWxvcGUKLSAgICAgKgotICAgICAqIEBwYXJhbSBzcGluZQotICAgICAqIEByZXR1cm4gU09BUEVudmVsb3BlCi0gICAgICogQHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IFNPQVBFbnZlbG9wZSBfY29udmVydFNwaW5lMlNFKFhNTFNwaW5lIHNwaW5lKSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIENvbnZlcnQgT00gaW50byBYTUxTcGluZQotICAgICAqCi0gICAgICogQHBhcmFtIG9tCi0gICAgICogQHJldHVybgotICAgICAqIEB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBYTUxTcGluZSBfY29udmVydE9NMlNwaW5lKE9NRWxlbWVudCBvbSkgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0IFNPQVBFbnZlbG9wZSBpbnRvIFhNTFNQaW5lCi0gICAgICoKLSAgICAgKiBAcGFyYW0gU09BUEVudmVsb3BlCi0gICAgICogQHJldHVybiBYTUxTcGluZQotICAgICAqIEB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBYTUxTcGluZSBfY29udmVydFNFMlNwaW5lKFNPQVBFbnZlbG9wZSBzZSkgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gZW1wdHksIGRlZmF1bHQgc3BpbmUgZm9yIHRoZSBzcGVjaWZpY2VkIHByb3RvY29sCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcHJvdG9jb2wKLSAgICAgKiBAcmV0dXJuCi0gICAgICogQHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBYTUxTcGluZSBfY3JlYXRlU3BpbmUoUHJvdG9jb2wgcHJvdG9jb2wsIFN0eWxlIHN0eWxlLCBpbnQgaW5kaXJlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01FbGVtZW50IHBheWxvYWQpIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpcyB0byBzaW1wbHkgY29uc3RydWN0IHRoZSBzcGluZS4KLSAgICAgICAgLy8gRGVyaXZlZCBjbGFzc2VzIG1heSB3aXNoIHRvIGNvbnN0cnVjdCBhIGRpZmZlcmVudCBraW5kIG9mIFhNTFNwaW5lCi0gICAgICAgIHJldHVybiBuZXcgWE1MU3BpbmVJbXBsKHByb3RvY29sLCBzdHlsZSwgaW5kaXJlY3Rpb24sIHBheWxvYWQpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZXRDb25zdW1lZChib29sZWFuIGNvbnN1bWUpIHsKLSAgICAgICAgaWYgKGNvbnN1bWUpIHsKLSAgICAgICAgICAgIHRoaXMuY29uc3VtZWQgPSB0cnVlOwotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJEZWJ1ZyBNb25pdG9yaW5nIFdoZW4gQmxvY2sgaXMgQ29uc3VtZWQiKTsKLSAgICAgICAgICAgICAgICBsb2cudHJhY2UoSmF2YVV0aWxzLnN0YWNrVG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjb25zdW1lZCA9IGZhbHNlOwotCQl9Ci0JfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgewotICAgICAgICBPTUVsZW1lbnQgb20gPSBnZXRDb250ZW50QXNPTUVsZW1lbnQoKTsKLSAgICAgICAgaWYgKG9tICE9bnVsbCkgewotICAgICAgICAgICAgT01YTUxQYXJzZXJXcmFwcGVyIGJ1aWxkZXIgPSBvbS5nZXRCdWlsZGVyKCk7Ci0gICAgICAgICAgICBpZiAoYnVpbGRlciBpbnN0YW5jZW9mIFN0QVhCdWlsZGVyKSB7Ci0gICAgICAgICAgICAgICAgIFN0QVhCdWlsZGVyIHN0YXhCdWlsZGVyID0gKFN0QVhCdWlsZGVyKSBidWlsZGVyOwotICAgICAgICAgICAgICAgICBzdGF4QnVpbGRlci5yZWxlYXNlUGFyc2VyT25DbG9zZSh0cnVlKTsKLSAgICAgICAgICAgICAgICAgaWYgKCFzdGF4QnVpbGRlci5pc0Nsb3NlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICBzdGF4QnVpbGRlci5jbG9zZSgpOwotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgfQotCQotCQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9pbXBsL1hNTFBhcnRGYWN0b3J5SW1wbC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9pbXBsL1hNTFBhcnRGYWN0b3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzQzZjhkLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvaW1wbC9YTUxQYXJ0RmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmltcGw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5pbXBsLmJ1aWxkZXIuU3RBWFNPQVBNb2RlbEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLlByb3RvY29sOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5YTUxQYXJ0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5mYWN0b3J5LlhNTFBhcnRGYWN0b3J5OwotCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247Ci0KLS8qKiBNZXNzYWdlRmFjdG9yeUltcGwgKi8KLXB1YmxpYyBjbGFzcyBYTUxQYXJ0RmFjdG9yeUltcGwgaW1wbGVtZW50cyBYTUxQYXJ0RmFjdG9yeSB7Ci0KLSAgICAvKiogRGVmYXVsdCBDb25zdHJ1Y3RvciByZXF1aXJlZCBmb3IgRmFjdG9yeSAqLwotICAgIHB1YmxpYyBYTUxQYXJ0RmFjdG9yeUltcGwoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5mYWN0b3J5LlhNTFBhcnRGYWN0b3J5I2NyZWF0ZUZyb20oamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIpCi0gICAgICAqLwotICAgIHB1YmxpYyBYTUxQYXJ0IGNyZWF0ZUZyb20oWE1MU3RyZWFtUmVhZGVyIHJlYWRlciwgUHJvdG9jb2wgcHJvdG9jb2wpCi0gICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uLCBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgU3RBWFNPQVBNb2RlbEJ1aWxkZXIgYnVpbGRlciA9IG5ldyBTdEFYU09BUE1vZGVsQnVpbGRlcihyZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCk7ICAvLyBQYXNzIG51bGwgaGFzIHRoZSB2ZXJzaW9uIHRvIHRyaWdnZXIgYXV0b2RldGVjdGlvbgotICAgICAgICBTT0FQRW52ZWxvcGUgb21FbnZlbG9wZSA9IGJ1aWxkZXIuZ2V0U09BUEVudmVsb3BlKCk7Ci0gICAgICAgIHJldHVybiBjcmVhdGVGcm9tKG9tRW52ZWxvcGUsIHByb3RvY29sKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLk1lc3NhZ2VGYWN0b3J5I2NyZWF0ZUZyb20ob3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQpCi0gICAgICAqLwotICAgIHB1YmxpYyBYTUxQYXJ0IGNyZWF0ZUZyb20oT01FbGVtZW50IG9tRWxlbWVudCwgUHJvdG9jb2wgcHJvdG9jb2wpCi0gICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uLCBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG5ldyBYTUxQYXJ0SW1wbChvbUVsZW1lbnQsIHByb3RvY29sKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLk1lc3NhZ2VGYWN0b3J5I2NyZWF0ZShvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuUHJvdG9jb2wpCi0gICAgICAqLwotICAgIHB1YmxpYyBYTUxQYXJ0IGNyZWF0ZShQcm90b2NvbCBwcm90b2NvbCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBuZXcgWE1MUGFydEltcGwocHJvdG9jb2wpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZmFjdG9yeS5YTUxQYXJ0RmFjdG9yeSNjcmVhdGVGcm9tKGphdmF4LnhtbC5zb2FwLlNPQVBFbnZlbG9wZSkKLSAgICAgICovCi0gICAgcHVibGljIFhNTFBhcnQgY3JlYXRlRnJvbShqYXZheC54bWwuc29hcC5TT0FQRW52ZWxvcGUgc29hcEVudmVsb3BlKQotICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBuZXcgWE1MUGFydEltcGwoc29hcEVudmVsb3BlKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvaW1wbC9YTUxQYXJ0SW1wbC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9pbXBsL1hNTFBhcnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzMWQyYTMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9pbXBsL1hNTFBhcnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuaW1wbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uYXR0YWNobWVudHMuQXR0YWNobWVudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLlByb3RvY29sOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5mYWN0b3J5LlNBQUpDb252ZXJ0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS51dGlsLlNBQUpDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5yZWdpc3RyeS5GYWN0b3J5UmVnaXN0cnk7Ci0KLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRW52ZWxvcGU7Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247Ci0KLS8qKgotICogWE1MUGFydEltcGwKLSAqIDxwLz4KLSAqIFRoaXMgY2xhc3MgZXh0ZW5kcyB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIFhNTFBhcnRCYXNlIHNvIHRoYXQgaXQgY2FuIGRlZmluZSB0aGUKLSAqIHRyYW5zZm9ybWF0aW9ucyBiZXR3ZWVuIE9NLCBTQUFKIFNPQVBFbnZlbG9wZSBhbmQgWE1MU3BpbmUuCi0gKgotICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmltcGwuWE1MUGFydEJhc2UKLSAqLwotcHVibGljIGNsYXNzIFhNTFBhcnRJbXBsIGV4dGVuZHMgWE1MUGFydEJhc2UgewotCi0gICAgU0FBSkNvbnZlcnRlciBjb252ZXJ0ZXIgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogWE1MUGFydCBzaG91bGQgYmUgY29uc3RydWN0ZWQgdmlhIHRoZSBYTUxQYXJ0RmFjdG9yeS4gVGhpcyBjb25zdHJ1Y3RvciBjb25zdHJ1Y3RzIGFuIGVtcHR5Ci0gICAgICogWE1MUGFydCB3aXRoIHRoZSBzcGVjaWZpZWQgcHJvdG9jb2wKLSAgICAgKgotICAgICAqIEBwYXJhbSBwcm90b2NvbAotICAgICAqIEB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbgotICAgICAqLwotICAgIFhNTFBhcnRJbXBsKFByb3RvY29sIHByb3RvY29sKSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyKHByb3RvY29sKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBYTUxQYXJ0IHNob3VsZCBiZSBjb25zdHJ1Y3RlZCB2aWEgdGhlIFhNTFBhcnRGYWN0b3J5LiBUaGlzIGNvbnN0cnVjdG9yIGNyZWF0ZXMgYW4gWE1MUGFydCBmcm9tCi0gICAgICogdGhlIHNwZWNpZmllZCByb290LgotICAgICAqCi0gICAgICogQHBhcmFtIHJvb3QKLSAgICAgKiBAcGFyYW0gcHJvdG9jb2wgKGlmIG51bGwsIHRoZSBzb2FwIHByb3RvY29sIGlzIGluZmVycmVkIGZyb20gdGhlIG5hbWVzcGFjZSkKLSAgICAgKiBAdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24KLSAgICAgKi8KLSAgICBYTUxQYXJ0SW1wbChPTUVsZW1lbnQgcm9vdCwgUHJvdG9jb2wgcHJvdG9jb2wpIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIocm9vdCwgcHJvdG9jb2wpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFhNTFBhcnQgc2hvdWxkIGJlIGNvbnN0cnVjdGVkIHZpYSB0aGUgWE1MUGFydEZhY3RvcnkuIFRoaXMgY29uc3RydWN0b3IgY3JlYXRlcyBhbiBYTUxQYXJ0IGZyb20KLSAgICAgKiB0aGUgc3BlY2lmaWVkIHJvb3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcm9vdAotICAgICAqIEB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbgotICAgICAqLwotICAgIFhNTFBhcnRJbXBsKFNPQVBFbnZlbG9wZSByb290KSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyKHJvb3QpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBPTUVsZW1lbnQgX2NvbnZlcnRTRTJPTShTT0FQRW52ZWxvcGUgc2UpIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgQXR0YWNobWVudHMgYXR0YWNobWVudHMgPSAocGFyZW50ID09IG51bGwpID8gCi0gICAgICAgICAgICAgICAgbnVsbCA6IHBhcmVudC5hdHRhY2htZW50czsKLSAgICAgICAgcmV0dXJuIGdldFNBQUpDb252ZXJ0ZXIoKS50b09NKHNlLCBhdHRhY2htZW50cyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIE9NRWxlbWVudCBfY29udmVydFNwaW5lMk9NKFhNTFNwaW5lIHNwaW5lKSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgT01FbGVtZW50IG9tRW52ZWxvcGUgPSBzcGluZS5nZXRBc09NRWxlbWVudCgpOwotICAgICAgICByZXR1cm4gb21FbnZlbG9wZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU09BUEVudmVsb3BlIF9jb252ZXJ0T00yU0UoT01FbGVtZW50IG9tKSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBnZXRTQUFKQ29udmVydGVyKCkudG9TQUFKKChvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlKW9tKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU09BUEVudmVsb3BlIF9jb252ZXJ0U3BpbmUyU0UoWE1MU3BpbmUgc3BpbmUpIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIF9jb252ZXJ0T00yU0UoX2NvbnZlcnRTcGluZTJPTShzcGluZSkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBYTUxTcGluZSBfY29udmVydE9NMlNwaW5lKE9NRWxlbWVudCBvbSkgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbmV3IFhNTFNwaW5lSW1wbCgob3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZSlvbSwgZ2V0U3R5bGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0SW5kaXJlY3Rpb24oKSwgZ2V0UHJvdG9jb2woKSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFhNTFNwaW5lIF9jb252ZXJ0U0UyU3BpbmUoU09BUEVudmVsb3BlIHNlKSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBfY29udmVydE9NMlNwaW5lKF9jb252ZXJ0U0UyT00oc2UpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMb2FkIHRoZSBTQUFKQ29udmVydGVyCi0gICAgICogQHJldHVybiBTQUFKQ29udmVydGVyCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFNBQUpDb252ZXJ0ZXIgZ2V0U0FBSkNvbnZlcnRlcigpIHsKLSAgICAgICAgaWYgKGNvbnZlcnRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBTQUFKQ29udmVydGVyRmFjdG9yeSBmYWN0b3J5ID0gKAotICAgICAgICAgICAgICAgICAgICBTQUFKQ29udmVydGVyRmFjdG9yeSlGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShTQUFKQ29udmVydGVyRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgICAgICBjb252ZXJ0ZXIgPSBmYWN0b3J5LmdldFNBQUpDb252ZXJ0ZXIoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY29udmVydGVyOwotICAgIH0KLQkKLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvaW1wbC9YTUxTcGluZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9pbXBsL1hNTFNwaW5lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmYTJhM2EuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9pbXBsL1hNTFNwaW5lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuaW1wbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5Sb2xlUGxheWVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5CbG9jazsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuTWVzc2FnZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuUHJvdG9jb2w7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLlhNTEZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5mYWN0b3J5LkJsb2NrRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlN0eWxlOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiBYTUxTcGluZQotICogPHAvPgotICogQW4gWE1MU3BpbmUgaXMgYW4gb3B0aW1pemVkIGZvcm0gb2YgdGhlIHhtbCBwYXJ0IG9mIHRoZSBtZXNzYWdlLiBDdXJyZW50bHkgdGhlcmUgaXMgb25seSBvbmUKLSAqIGltcGxlbWVudGF0aW9uIChYTUxTcGluZUltcGwpLgotICoKLSAqIEBzZWUgWE1MU3BpbmVJbXBsIGZvciBtb3JlIGRldGFpbHMKLSAqLwotaW50ZXJmYWNlIFhNTFNwaW5lIHsKLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHByb3RvY29sIGZvciB0aGlzIE1lc3NhZ2UgKHNvYXAxMSwgc29hcDEyLCBldGMuKQotICAgICAqCi0gICAgICogQHJldHVybiBQcm90b2NsCi0gICAgICovCi0gICAgcHVibGljIFByb3RvY29sIGdldFByb3RvY29sKCk7Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZSBvdXQgdGhlIE1lc3NhZ2UKLSAgICAgKgotICAgICAqIEBwYXJhbSB3cml0ZXIgIFhNTFN0cmVhbVdyaXRlcgotICAgICAqIEBwYXJhbSBjb25zdW1lIHRydWUgaWYgdGhpcyBpcyB0aGUgbGFzdCByZXF1ZXN0IG9uIHRoZSBibG9jay4KLSAgICAgKiBAdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvdXRwdXRUbyhYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyLCBib29sZWFuIGNvbnN1bWUpCi0gICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uLCBXZWJTZXJ2aWNlRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBYTUxTdHJlYW1SZWFkZXIgcmVwcmVzZW50ZWQgYnkgdGhpcyBNZXNzYWdlIGZvciB0aGUgeG1sIHBhcnQKLSAgICAgKgotICAgICAqIEBwYXJhbSBjb25zdW1lIHRydWUgaWYgdGhpcyBpcyB0aGUgbGFzdCByZXF1ZXN0IG9uIHRoZSBNZXNzYWdlCi0gICAgICogQHJldHVybiBYTUxTdHJlYW1SZWFkZXIKLSAgICAgKiBAdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBYTUxTdHJlYW1SZWFkZXIgZ2V0WE1MU3RyZWFtUmVhZGVyKGJvb2xlYW4gY29uc3VtZSkgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb247Ci0KLSAgICAvKiogQHJldHVybiB0aGUgU3R5bGUgKGRvY3VtZW50IG9yIHJwYykgKi8KLSAgICBwdWJsaWMgU3R5bGUgZ2V0U3R5bGUoKTsKLQotICAgIC8qKiBAcmV0dXJuIHRoZSBRTmFtZSBvZiB0aGUgb3BlcmF0aW9uIGVsZW1lbnQgaWYgU3R5bGUucnBjLiAgT3RoZXJ3aXNlIG51bGwgKi8KLSAgICBwdWJsaWMgUU5hbWUgZ2V0T3BlcmF0aW9uRWxlbWVudCgpIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBvcGVyYXRpb24gZWxlbWVudCBxbmFtZS4gIFRoZSBvcGVyYXRpb24gcW5hbWUgaXMgb25seSB1c2VkIGlmIFN0eWxlLnJwYwotICAgICAqCi0gICAgICogQHBhcmFtIG9wZXJhdGlvblFOYW1lCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0T3BlcmF0aW9uRWxlbWVudChRTmFtZSBvcGVyYXRpb25RTmFtZSkgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBpc0NvbnN1bWVkIFJldHVybiB0cnVlIGlmIHRoZSBwYXJ0IGlzIGNvbnN1bWVkLiAgT25jZSBjb25zdW1lZCwgdGhlIGluZm9ybWF0aW9uIGluIHRoZSBwYXJ0Ci0gICAgICogaXMgbm8gbG9uZ2VyIGF2YWlsYWJsZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgYmxvY2sgaXMgY29uc3VtZWQgKGEgbWV0aG9kIHdhcyBjYWxsZWQgd2l0aCBjb25zdW1lPXRydWUpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNDb25zdW1lZCgpOwotCi0gICAgLyoqCi0gICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBYTUxQYXJ0IHJlcHJlc2VudHMgYSBGYXVsdAotICAgICAqCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBtZXNzYWdlIHJlcHJlc2VudHMgYSBmYXVsdAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRmF1bHQoKSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIElmIHRoZSBYTUxQYXJ0IHJlcHJlc2VudHMgYSBmYXVsdCwgYW4gWE1MRmF1bHQgaXMgcmV0dXJuZWQgd2hpY2ggZGVzY3JpYmVzIHRoZSBmYXVsdCBpbiBhCi0gICAgICogcHJvdG9jb2wgYWdub3N0aWMgbWFubmVyCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBYTUxGYXVsdCBvYmplY3Qgb3IgbnVsbAotICAgICAqIEBzZWUgWE1MRmF1bHQKLSAgICAgKi8KLSAgICBwdWJsaWMgWE1MRmF1bHQgZ2V0WE1MRmF1bHQoKSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIENoYW5nZSB0aGUgWE1MUGFydCBzbyB0aGF0IGl0IHJlcHJlc2VudHMgdGhlIGZhdWx0IGRlc2NyaWJlZCBieSBYTUxGYXVsdAotICAgICAqCi0gICAgICogQHBhcmFtIHhtbGZhdWx0Ci0gICAgICogQHNlZSBYTUxGYXVsdAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFhNTEZhdWx0KFhNTEZhdWx0IHhtbEZhdWx0KSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIGdldEFzT01FbGVtZW50IEdldCB0aGUgeG1sIHBhcnQgYXMgYSByZWFkL3dyaXRlIE9NCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIE9NRWxlbWVudCAocHJvYmFibHkgT00gU09BUEVudmVsb3BlKQotICAgICAqIEB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBPTUVsZW1lbnQgZ2V0QXNPTUVsZW1lbnQoKSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIGdldE51bUJvZHlCbG9ja3MKLSAgICAgKgotICAgICAqIEByZXR1cm4gbnVtYmVyIG9mIGJvZHkgYmxvY2tzCi0gICAgICogQHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXROdW1Cb2R5QmxvY2tzKCkgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBnZXRCb2R5QmxvY2sgR2V0IHRoZSBib2R5IGJsb2NrIGF0IHRoZSBzcGVjaWZpY2VkIGluZGV4LiBUaGUgQmxvY2tGYWN0b3J5IGFuZCBvYmplY3QgCi0gICAgICogY29udGV4dCBhcmUgcGFzc2VkIGluIHRvIGhlbHAgY3JlYXRlIHRoZSBwcm9wZXIga2luZCBvZiBibG9jay4gQ2FsbGluZyB0aGlzIG1ldGhvZCAKLSAgICAgKiB3aWxsIGNhY2hlIHRoZSBPTS4KLSAgICAgKiBBdm9pZCBpdCBpbiBwZXJmb3JtYW50IHNpdHVhdGlvbnMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaW5kZXgKLSAgICAgKiBAcGFyYW0gY29udGV4dAotICAgICAqIEBwYXJhbSBibG9ja0ZhY3RvcnkKLSAgICAgKiBAcmV0dXJuIEJsb2NrIG9yIG51bGwKLSAgICAgKiBAdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24KLSAgICAgKiBAc2VlIGdldEJvZHlCbG9jawotICAgICAqLwotICAgIHB1YmxpYyBCbG9jayBnZXRCb2R5QmxvY2soaW50IGluZGV4LCBPYmplY3QgY29udGV4dCwgQmxvY2tGYWN0b3J5IGJsb2NrRmFjdG9yeSkKLSAgICAgICAgICAgIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogZ2V0Qm9keUJsb2NrIEdldCB0aGUgc2luZ2xlIEJvZHkgQmxvY2suIFRoZSBCbG9ja0ZhY3RvcnkgYW5kIG9iamVjdCBjb250ZXh0IGFyZSBwYXNzZWQgaW4gdG8KLSAgICAgKiBoZWxwIGNyZWF0ZSB0aGUgcHJvcGVyIGtpbmQgb2YgYmxvY2suIFRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIGludm9rZWQgd2hlbiBpdCBpcyBrbm93bgotICAgICAqIHRoYXQgdGhlcmUgaXMgemVybyBvciBvbmUgYmxvY2suCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaW5kZXgKLSAgICAgKiBAcGFyYW0gY29udGV4dAotICAgICAqIEBwYXJhbSBibG9ja0ZhY3RvcnkKLSAgICAgKiBAcmV0dXJuIEJsb2NrIG9yIG51bGwKLSAgICAgKiBAdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgQmxvY2sgZ2V0Qm9keUJsb2NrKE9iamVjdCBjb250ZXh0LCBCbG9ja0ZhY3RvcnkgYmxvY2tGYWN0b3J5KQotICAgICAgICAgICAgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBzZXRCb2R5QmxvY2sgU2V0IHRoZSBibG9jayBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IE9uY2Ugc2V0LCB0aGUgTWVzc2FnZSBvd25zIHRoZSBibG9jay4gIFlvdQotICAgICAqIG11c3QgdXNlIHRoZSBnZXRCb2R5QmxvY2sgbWV0aG9kIHRvIGFjY2VzcyBpdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpbmRleAotICAgICAqIEBwYXJhbSBibG9jawotICAgICAqIEB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEJvZHlCbG9jayhpbnQgaW5kZXgsIEJsb2NrIGJsb2NrKSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIHNldEJvZHlCbG9jayBTZXQgdGhpcyBhcyBibG9jayBhcyB0aGUgc2luZ2xlIGJsb2NrIGZvciB0aGUgbWVzc2FnZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpbmRleAotICAgICAqIEBwYXJhbSBibG9jawotICAgICAqIEB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEJvZHlCbG9jayhCbG9jayBibG9jaykgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiByZW1vdmVCb2R5QmxvY2sgUmVtb3ZlcyB0aGUgaW5kaWNhdGVkIEJvZHlCbG9jawotICAgICAqCi0gICAgICogQHBhcmFtIGluZGV4Ci0gICAgICogQHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlQm9keUJsb2NrKGludCBpbmRleCkgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb247Ci0KLQotICAgIC8qKgotICAgICAqIGdldE51bUhlYWRlckJsb2NrcwotICAgICAqCi0gICAgICogQHJldHVybiBudW1iZXIgb2YgaGVhZGVyIGJsb2NrcwotICAgICAqIEB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0TnVtSGVhZGVyQmxvY2tzKCkgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBnZXRIZWFkZXJCbG9jayBHZXQgdGhlIGZpcnN0IGhlYWRlciBibG9jayB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLSAgICAgKiBUaGUgQmxvY2tGYWN0b3J5IGFuZCBvYmplY3QKLSAgICAgKiBjb250ZXh0IGFyZSBwYXNzZWQgaW4gdG8gaGVscCBjcmVhdGUgdGhlIHByb3BlciBraW5kIG9mIGJsb2NrLgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWVzcGFjZQotICAgICAqIEBwYXJhbSBsb2NhbFBhcnQKLSAgICAgKiBAcGFyYW0gY29udGV4dAotICAgICAqIEBwYXJhbSBibG9ja0ZhY3RvcnkKLSAgICAgKiBAcmV0dXJuIEJsb2NrCi0gICAgICogQHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIEJsb2NrIGdldEhlYWRlckJsb2NrKFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBsb2NhbFBhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbG9ja0ZhY3RvcnkgYmxvY2tGYWN0b3J5KQotICAgICAgICAgICAgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb247Ci0gICAgCi0gICAgLyoqCi0gICAgICogZ2V0SGVhZGVyQmxvY2sgCi0gICAgICogR2V0IHRoZSBoZWFkZXIgYmxvY2tzIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotICAgICAqIFRoZSBCbG9ja0ZhY3RvcnkgYW5kIG9iamVjdAotICAgICAqIGNvbnRleHQgYXJlIHBhc3NlZCBpbiB0byBoZWxwIGNyZWF0ZSB0aGUgcHJvcGVyIGtpbmQgb2YgYmxvY2suCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZXNwYWNlCi0gICAgICogQHBhcmFtIGxvY2FsUGFydAotICAgICAqIEBwYXJhbSBjb250ZXh0Ci0gICAgICogQHBhcmFtIGJsb2NrRmFjdG9yeQotICAgICAqIEBwYXJhbSByb2xlUGxheWVyKGlmIHNldCkgaW5kaWNhdGVzIHRoZSBSb2xlcyB0aGF0IHNob3VsZCBiZSBjb25zaWRlcmVkCi0gICAgICogQHJldHVybiBCbG9jawotICAgICAqIEB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PEJsb2NrPiBnZXRIZWFkZXJCbG9ja3MoU3RyaW5nIG5hbWVzcGFjZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbG9jYWxQYXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbG9ja0ZhY3RvcnkgYmxvY2tGYWN0b3J5LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJvbGVQbGF5ZXIgcm9sZVBsYXllcikKLSAgICAgICAgICAgIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogc2V0SGVhZGVyQmxvY2sgCi0gICAgICogcmVwbGFjZXMgdGhlIGZpcnN0IGV4aXN0aW5nIGhlYWRlciBibG9jayB3aXRoIHRoaXMgbmV3IGJsb2NrLiAgSWYgdGhlcmUgaXMgbm8KLSAgICAgKiBleGlzdGluZyBoZWFkZXIgYmxvY2ssIG9uZSBpcyBhZGRlZCB0byB0aGUgZW5kIG9mIHRoZSBoZWFkZXJzCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZXNwYWNlCi0gICAgICogQHBhcmFtIGxvY2FsUGFydAotICAgICAqIEBwYXJhbSBibG9jawotICAgICAqIEB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEhlYWRlckJsb2NrKFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBsb2NhbFBhcnQsIEJsb2NrIGJsb2NrKQotICAgICAgICAgICAgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBhcHBlbmRIZWFkZXJCbG9jayAKLSAgICAgKiBBcHBlbmQgdGhlIGJsb2NrIHRvIHRoZSBsaXN0IG9mIGhlYWRlciBibG9ja3MuIFRoZSBNZXNzYWdlIG93bnMgdGhlIGJsb2NrLgotICAgICAqIFlvdSBtdXN0IHVzZSB0aGUgZ2V0SGVhZGVyQmxvY2sgbWV0aG9kIHRvIGFjY2VzcyBpdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lc3BhY2UKLSAgICAgKiBAcGFyYW0gbG9jYWxQYXJ0Ci0gICAgICogQHBhcmFtIGJsb2NrCi0gICAgICogQHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYXBwZW5kSGVhZGVyQmxvY2soU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIGxvY2FsUGFydCwgQmxvY2sgYmxvY2spCi0gICAgICAgIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uOwotICAgIC8qKgotICAgICAqIEByZXR1cm4gU2V0IG9mIFFOYW1lcwotICAgICAqLwotICAgIHB1YmxpYyBTZXQ8UU5hbWU+IGdldEhlYWRlclFOYW1lcygpOwotICAgIAotICAgIC8qKgotICAgICAqIHJlbW92ZVBheWxvYWQgCi0gICAgICogUmVtb3ZlcyBhbGwgaGVhZGVyIGJsb2NrcyB3aXRoIHRoaXMgbmFtZXNwYWNlL2xvY2FscGFydAotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWVzcGFjZQotICAgICAqIEBwYXJhbSBsb2NhbFBhcnQKLSAgICAgKiBAdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVIZWFkZXJCbG9jayhTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbG9jYWxQYXJ0KQotICAgICAgICAgICAgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb247Ci0KLQotICAgIC8qKgotICAgICAqIEdldCBhIHRyYWNlU3RyaW5nLi4udGhlIHRyYWNlIHN0cmluZyBkdW1wcyB0aGUgY29udGVudHMgb2YgdGhlIEJsb2NrIHdpdGhvdXQgZm9yY2luZyBhbgotICAgICAqIHVuZGVybHlpbmcgaWxsLXBlcmZvcm1hbnQgdHJhbnNmb3JtYXRpb24gb2YgdGhlIG1lc3NhZ2UuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFN0cmluZyBjb250YWluaW5nIHRyYWNlIGluZm9ybWF0aW9uCi0gICAgICogQGJvb2xlYW4gaW5kZW50IFN0cmluZyBjb250YWluaW5nIGluZGVudCBjaGFyYWN0ZXJzCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyB0cmFjZVN0cmluZyhTdHJpbmcgaW5kZW50KTsKLQotICAgIC8qKgotICAgICAqIFVzZWQgdG8gaWRlbnRpZnkgdGhlIE1lc3NhZ2UgcGFyZW50IG9mIHRoZSBYTUxTcGluZQotICAgICAqCi0gICAgICogQHBhcmFtIG1zZwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFBhcmVudChNZXNzYWdlIG1zZyk7Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvaW1wbC9YTUxTcGluZUltcGwuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvaW1wbC9YTUxTcGluZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA0MDI0MS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2ltcGwvWE1MU3BpbmVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3ODcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuaW1wbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01Db250YWluZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTm9kZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuT01Db250YWluZXJFeDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5PTUVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5Sb2xlUGxheWVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQMTFDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVAxMkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEJvZHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhdWx0RGV0YWlsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQSGVhZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQSGVhZGVyQmxvY2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLmltcGwubGxvbS5zb2FwMTEuU09BUDExRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuaW1wbC5sbG9tLnNvYXAxMi5TT0FQMTJGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuRXhjZXB0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmkxOG4uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLkJsb2NrOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5NZXNzYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5Qcm90b2NvbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuWE1MRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmZhY3RvcnkuQmxvY2tGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5mYWN0b3J5Lk9NQmxvY2tGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS51dGlsLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UudXRpbC5SZWFkZXIyV3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS51dGlsLlhNTEZhdWx0VXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5yZWdpc3RyeS5GYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51dGlsaXR5LkphdmFVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlN0eWxlOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Db25zdGFudHM7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiBYTUxTcGluZUltcGwKLSAqIDxwLz4KLSAqIEFuIFhNTFNwaW5lIGNvbnNpc3RzIGlzIGFuIE9NRW52ZWxvcGUgKGVpdGhlciBhIGRlZmF1bHQgb25lIG9yIG9uZSBjcmVhdGUgZnJvbSBhbiBpbmNvbWluZwotICogbWVzc2FnZSkuIEFzIEJsb2NrcyBhcmUgYWRkZWQgb3IgcmVxdWVzdGVkLCB0aGV5IGFyZSBwbGFjZWQgaW4gdGhlIHRyZWUgYXMgT01Tb3VyY2VkRWxlbWVudHMuCi0gKiA8cC8+Ci0gKiBOT1RFOiBGb3IgWE1ML0hUVFAgKFJFU1QpIG1lc3NhZ2VzLCBhIFNPQVAgMS4xIGVudmVsb3BlIGlzIGJ1aWx0IGFuZCB0aGUgeG1sIHBheWxvYWQgaXMgCi0gKiBwbGFjZWQgaW4gdGhlIGJvZHkuICBUaGlzIHB1cnBvc2VseSBtaW1pY3MgdGhlIGltcGxlbWVudGF0aW9uIHVzZWQgYnkgQXhpczIuCi0gKi8KLWNsYXNzIFhNTFNwaW5lSW1wbCBpbXBsZW1lbnRzIFhNTFNwaW5lIHsKLQotICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhYTUxTcGluZUltcGwuY2xhc3MpOwotICAgIHByaXZhdGUgc3RhdGljIE9NQmxvY2tGYWN0b3J5IG9iZiA9Ci0gICAgICAgICAgICAoT01CbG9ja0ZhY3RvcnkpRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoT01CbG9ja0ZhY3RvcnkuY2xhc3MpOwotCi0gICAgcHJpdmF0ZSBQcm90b2NvbCBwcm90b2NvbCA9IFByb3RvY29sLnVua25vd247Ci0gICAgcHJpdmF0ZSBTdHlsZSBzdHlsZSA9IFN0eWxlLkRPQ1VNRU5UOwotICAgIHByaXZhdGUgaW50IGluZGlyZWN0aW9uID0gMDsKLSAgICBwcml2YXRlIFNPQVBFbnZlbG9wZSByb290ID0gbnVsbDsKLSAgICBwcml2YXRlIFNPQVBGYWN0b3J5IHNvYXBGYWN0b3J5ID0gbnVsbDsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBjb25zdW1lZCA9IGZhbHNlOwotICAgIHByaXZhdGUgTWVzc2FnZSBwYXJlbnQgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbGlnaHR3ZWlnaHQgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBwcm90b2NvbCAoaS5lLiB0aGUgRW52ZWxvcGUsIEhlYWRlciBhbmQgQm9keSkKLSAgICAgKgotICAgICAqIEBwYXJhbSBwcm90b2NvbCAgICAgICBQcm90b2NvbAotICAgICAqIEBwYXJhbSBzdHlsZSAgICAgICAgICBTdHlsZQotICAgICAqIEBwYXJhbSBpbmRpcmVjdGlvbiAgICAoMCBvciAxKSBpbmRpY2F0ZXMgbG9jYXRpb24gb2YgYm9keSBibG9ja3MKLSAgICAgKiBAcGFyYW0gaW5pdGlhbFBheWxvYWQgKE9NRWxlbWVudCBvciBudWxsLi4udXNlZCB0byBhZGQgcmVzdCBwYXlsb2FkKQotICAgICAqLwotICAgIHB1YmxpYyBYTUxTcGluZUltcGwoUHJvdG9jb2wgcHJvdG9jb2wsIFN0eWxlIHN0eWxlLCBpbnQgaW5kaXJlY3Rpb24sIE9NRWxlbWVudCBwYXlsb2FkKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIHRoaXMucHJvdG9jb2wgPSBwcm90b2NvbDsKLSAgICAgICAgdGhpcy5zdHlsZSA9IHN0eWxlOwotICAgICAgICB0aGlzLmluZGlyZWN0aW9uID0gaW5kaXJlY3Rpb247Ci0gICAgICAgIHNvYXBGYWN0b3J5ID0gX2dldEZhY3RvcnkocHJvdG9jb2wpOwotICAgICAgICByb290ID0gX2NyZWF0ZUVtcHR5RW52ZWxvcGUoc3R5bGUsIHNvYXBGYWN0b3J5KTsKLSAgICAgICAgaWYgKHBheWxvYWQgIT0gbnVsbCkgewotICAgICAgICAgICAgKChTT0FQRW52ZWxvcGUpcm9vdCkuZ2V0Qm9keSgpLmFkZENoaWxkKHBheWxvYWQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIHNwaW5lIGZyb20gYW4gZXhpc3RpbmcgT00gdHJlZQotICAgICAqCi0gICAgICogQHBhcmFtIGVudmVsb3BlCi0gICAgICogQHBhcmFtIHN0eWxlICAgICAgIFN0eWxlCi0gICAgICogQHBhcmFtIGluZGlyZWN0aW9uICgwIG9yIDEpIGluZGljYXRlcyBsb2NhdGlvbiBvZiBib2R5IGJsb2NrcwotICAgICAqIEB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBYTUxTcGluZUltcGwoU09BUEVudmVsb3BlIGVudmVsb3BlLCBTdHlsZSBzdHlsZSwgaW50IGluZGlyZWN0aW9uLCBQcm90b2NvbCBwcm90b2NvbCkKLSAgICAgICAgICAgIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgdGhpcy5zdHlsZSA9IHN0eWxlOwotICAgICAgICB0aGlzLmluZGlyZWN0aW9uID0gaW5kaXJlY3Rpb247Ci0gICAgICAgIHRoaXMucHJvdG9jb2wgPSBwcm90b2NvbDsKLSAgICAgICAgaW5pdChlbnZlbG9wZSk7Ci0gICAgICAgIC8vIElmIG51bGwsIGRldGVjdCBwcm90b2NvbCBmcm9tIHNvYXAgbmFtZXNwYWNlCi0gICAgICAgIGlmIChwcm90b2NvbCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAocm9vdC5nZXROYW1lc3BhY2UoKS5nZXROYW1lc3BhY2VVUkkoKQotICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKFNPQVAxMUNvbnN0YW50cy5TT0FQX0VOVkVMT1BFX05BTUVTUEFDRV9VUkkpKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5wcm90b2NvbCA9IFByb3RvY29sLnNvYXAxMTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAocm9vdC5nZXROYW1lc3BhY2UoKS5nZXROYW1lc3BhY2VVUkkoKQotICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKFNPQVAxMkNvbnN0YW50cy5TT0FQX0VOVkVMT1BFX05BTUVTUEFDRV9VUkkpKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5wcm90b2NvbCA9IFByb3RvY29sLnNvYXAxMjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBlbnZlbG9wZQotICAgICAqIEB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBpbml0KFNPQVBFbnZlbG9wZSBlbnZlbG9wZSkgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICByb290ID0gZW52ZWxvcGU7Ci0gICAgICAgIHNvYXBGYWN0b3J5ID0gTWVzc2FnZVV0aWxzLmdldFNPQVBGYWN0b3J5KHJvb3QpOwotCi0gICAgICAgIC8vIEFkdmFuY2UgcGFzdCB0aGUgaGVhZGVyCi0gICAgICAgIFNPQVBIZWFkZXIgaGVhZGVyID0gcm9vdC5nZXRIZWFkZXIoKTsKLSAgICAgICAgaWYgKGhlYWRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBoZWFkZXIgPSBzb2FwRmFjdG9yeS5jcmVhdGVTT0FQSGVhZGVyKHJvb3QpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTm93IGFkdmFuY2UgdGhlIHBhcnNlciB0byB0aGUgYm9keSBlbGVtZW50Ci0gICAgICAgIFNPQVBCb2R5IGJvZHkgPSByb290LmdldEJvZHkoKTsKLSAgICAgICAgaWYgKGJvZHkgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBib2R5IGlmIG9uZSBkb2VzIG5vdCBleGlzdAotICAgICAgICAgICAgYm9keSA9IHNvYXBGYWN0b3J5LmNyZWF0ZVNPQVBCb2R5KHJvb3QpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLlhNTFBhcnQjZ2V0UHJvdG9jb2woKQotICAgICAgKi8KLSAgICBwdWJsaWMgUHJvdG9jb2wgZ2V0UHJvdG9jb2woKSB7Ci0gICAgICAgIHJldHVybiBwcm90b2NvbDsKLSAgICB9Ci0KLSAgICAvKgotICAgICogKG5vbi1KYXZhZG9jKQotICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuWE1MUGFydCNnZXRQYXJlbnQoKQotICAgICovCi0gICAgcHVibGljIE1lc3NhZ2UgZ2V0UGFyZW50KCkgewotICAgICAgICByZXR1cm4gcGFyZW50OwotICAgIH0KLQotICAgIC8qCi0gICAgKiBTZXQgdGhlIGJhY2twb2ludGVyIHRvIHRoaXMgWE1MUGFydCdzIHBhcmVudCBNZXNzYWdlCi0gICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJlbnQoTWVzc2FnZSBwKSB7Ci0gICAgICAgIHBhcmVudCA9IHA7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5YTUxQYXJ0I291dHB1dFRvKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyLCAKLSAgICAgICogYm9vbGVhbikKLSAgICAgICovCi0gICAgcHVibGljIHZvaWQgb3V0cHV0VG8oWE1MU3RyZWFtV3JpdGVyIHdyaXRlciwgYm9vbGVhbiBjb25zdW1lKQotICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIFJlYWRlcjJXcml0ZXIgcjJ3ID0gbmV3IFJlYWRlcjJXcml0ZXIoZ2V0WE1MU3RyZWFtUmVhZGVyKGNvbnN1bWUpKTsKLSAgICAgICAgcjJ3Lm91dHB1dFRvKHdyaXRlcik7Ci0gICAgfQotCi0gICAgcHVibGljIFhNTFN0cmVhbVJlYWRlciBnZXRYTUxTdHJlYW1SZWFkZXIoYm9vbGVhbiBjb25zdW1lKSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChjb25zdW1lKSB7Ci0gICAgICAgICAgICBpZiAocm9vdC5nZXRCdWlsZGVyKCkgIT0gbnVsbCAmJiAhcm9vdC5nZXRCdWlsZGVyKCkuaXNDb21wbGV0ZWQoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiByb290LmdldFhNTFN0cmVhbVJlYWRlcldpdGhvdXRDYWNoaW5nKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiByb290LmdldFhNTFN0cmVhbVJlYWRlcigpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIHJvb3QuZ2V0WE1MU3RyZWFtUmVhZGVyKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmltcGwuWE1MU3BpbmUjZ2V0WE1MRmF1bHQoKQotICAgICAgKi8KLSAgICBwdWJsaWMgWE1MRmF1bHQgZ2V0WE1MRmF1bHQoKSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghaXNGYXVsdCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEFkdmFuY2UgdGhyb3VnaCBhbGwgb2YgdGhlIGRldGFpbCBibG9ja3MKLSAgICAgICAgaW50IG51bURldGFpbEJsb2NrcyA9IGdldE51bURldGFpbEJsb2NrcygpOwotCi0gICAgICAgIEJsb2NrW10gYmxvY2tzID0gbnVsbDsKLSAgICAgICAgaWYgKG51bURldGFpbEJsb2NrcyA+IDApIHsKLSAgICAgICAgICAgIGJsb2NrcyA9IG5ldyBCbG9ja1tudW1EZXRhaWxCbG9ja3NdOwotICAgICAgICAgICAgU09BUEZhdWx0RGV0YWlsIGRldGFpbCA9IHJvb3QuZ2V0Qm9keSgpLmdldEZhdWx0KCkuZ2V0RGV0YWlsKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bURldGFpbEJsb2NrczsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgT01FbGVtZW50IG9tID0gdGhpcy5fZ2V0Q2hpbGRPTUVsZW1lbnQoZGV0YWlsLCBpKTsKLSAgICAgICAgICAgICAgICBibG9ja3NbaV0gPSB0aGlzLl9nZXRCbG9ja0Zyb21PTUVsZW1lbnQob20sIG51bGwsIG9iZiwgZmFsc2UpOwotCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBYTUxGYXVsdCB4bWxGYXVsdCA9IFhNTEZhdWx0VXRpbHMuY3JlYXRlWE1MRmF1bHQocm9vdC5nZXRCb2R5KCkuZ2V0RmF1bHQoKSwgYmxvY2tzKTsKLSAgICAgICAgcmV0dXJuIHhtbEZhdWx0OwotICAgIH0KLQotICAgIHByaXZhdGUgaW50IGdldE51bURldGFpbEJsb2NrcygpIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGlzRmF1bHQoKSkgewotICAgICAgICAgICAgU09BUEZhdWx0IGZhdWx0ID0gcm9vdC5nZXRCb2R5KCkuZ2V0RmF1bHQoKTsKLSAgICAgICAgICAgIHJldHVybiBfZ2V0TnVtQ2hpbGRFbGVtZW50cyhmYXVsdC5nZXREZXRhaWwoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0WE1MRmF1bHQoWE1MRmF1bHQgeG1sRmF1bHQpIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLQotICAgICAgICAvLyBDbGVhciBvdXQgdGhlIGV4aXN0aW5nIGJvZHkgYW5kIGRldGFpbCBibG9ja3MKLSAgICAgICAgU09BUEJvZHkgYm9keSA9IHJvb3QuZ2V0Qm9keSgpOwotICAgICAgICBnZXROdW1EZXRhaWxCbG9ja3MoKTsgLy8gRm9yY2VzIHBhcnNlIG9mIGV4aXN0aW5nIGRldGFpbCBibG9ja3MKLSAgICAgICAgZ2V0TnVtQm9keUJsb2NrcygpOyAgLy8gRm9yY2VzIHBhcnNlIG92ZXIgYm9keQotICAgICAgICBPTU5vZGUgY2hpbGQgPSBib2R5LmdldEZpcnN0T01DaGlsZCgpOwotICAgICAgICB3aGlsZSAoY2hpbGQgIT0gbnVsbCkgewotICAgICAgICAgICAgY2hpbGQuZGV0YWNoKCk7Ci0gICAgICAgICAgICBjaGlsZCA9IGJvZHkuZ2V0Rmlyc3RPTUNoaWxkKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBBZGQgYSBTT0FQRmF1bHQgdG8gdGhlIGJvZHkuCi0gICAgICAgIFNPQVBGYXVsdCBzb2FwRmF1bHQgPSBYTUxGYXVsdFV0aWxzLmNyZWF0ZVNPQVBGYXVsdCh4bWxGYXVsdCwgYm9keSwgZmFsc2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQ29uc3VtZWQoKSB7Ci0gICAgICAgIHJldHVybiBjb25zdW1lZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT01FbGVtZW50IGdldEFzT01FbGVtZW50KCkgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gcm9vdDsKLSAgICB9Ci0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuWE1MUGFydCNnZXROdW1Cb2R5QmxvY2tzKCkKLSAgICAgICovCi0gICAgcHVibGljIGludCBnZXROdW1Cb2R5QmxvY2tzKCkgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gX2dldE51bUNoaWxkRWxlbWVudHMoX2dldEJvZHlCbG9ja1BhcmVudCgpKTsKLSAgICB9Ci0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuaW1wbC5YTUxTcGluZSNnZXRCb2R5QmxvY2soaW50LCBqYXZhLmxhbmcuT2JqZWN0LCAKLSAgICAgICogb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmZhY3RvcnkuQmxvY2tGYWN0b3J5KQotICAgICAgKi8KLSAgICBwdWJsaWMgQmxvY2sgZ2V0Qm9keUJsb2NrKGludCBpbmRleCwgT2JqZWN0IGNvbnRleHQsIEJsb2NrRmFjdG9yeSBibG9ja0ZhY3RvcnkpCi0gICAgICAgICAgICB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoImdldEJvZHlCbG9jazogR2V0IHRoZSAiICsgaW5kZXggKyAiYmxvY2sgdXNpbmcgdGhlIGJsb2NrIGZhY3RvcnksICIgKwotICAgICAgICAgICAgICAgICAgICBibG9ja0ZhY3RvcnkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gRm9yY2VzIHRoZSBwYXJzZXIgdG8gcmVhZCBhbGwgb2YgdGhlIGJsb2NrcwotICAgICAgICBnZXROdW1Cb2R5QmxvY2tzKCk7Ci0KLSAgICAgICAgLy8gR2V0IHRoZSBpbmRpY2F0ZWQgYmxvY2sKLSAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IF9nZXRDaGlsZE9NRWxlbWVudChfZ2V0Qm9keUJsb2NrUGFyZW50KCksIGluZGV4KTsKLSAgICAgICAgaWYgKG9tRWxlbWVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBOdWxsIGluZGljYXRlcyB0aGF0IG5vIGJsb2NrIGlzIGF2YWlsYWJsZQotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJnZXRCb2R5QmxvY2s6IFRoZSBibG9jayB3YXMgbm90IGZvdW5kICIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoImdldEJvZHlCbG9jazogRm91bmQgb21FbGVtZW50ICIgKyBvbUVsZW1lbnQuZ2V0UU5hbWUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMuX2dldEJsb2NrRnJvbU9NRWxlbWVudChvbUVsZW1lbnQsIGNvbnRleHQsIGJsb2NrRmFjdG9yeSwgZmFsc2UpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmltcGwuWE1MU3BpbmUjZ2V0Qm9keUJsb2NrKGludCwgamF2YS5sYW5nLk9iamVjdCwgCi0gICAgKiBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZmFjdG9yeS5CbG9ja0ZhY3RvcnkpCi0gICAgKi8KLSAgICBwdWJsaWMgQmxvY2sgZ2V0Qm9keUJsb2NrKE9iamVjdCBjb250ZXh0LCBCbG9ja0ZhY3RvcnkgYmxvY2tGYWN0b3J5KQotICAgICAgICAgICAgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotCi0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJnZXRCb2R5QmxvY2sgUEVSRk9STUFOVDogR2V0IHRoZSBibG9jayB1c2luZyB0aGUgYmxvY2sgZmFjdG9yeSwgIiArCi0gICAgICAgICAgICAgICAgICAgIGJsb2NrRmFjdG9yeSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBUT0RPIE5lZWQgdG8gdXBncmFkZSB0aGUgY29kZSB0byBnZXQgQmxvY2tzIHRoYXQgcmVwcmVzZW50IHRleHQgYW5kIGVsZW1lbnRzLgotCi0gICAgICAgIC8vIENhbGxpbmcgZ2V0Qm9keUJsb2NrIGFzc3VtZXMgdGhhdCB0aGVyZSBpcyBvbmx5IG9uZSBvciB6ZXJvIGJvZHkgYmxvY2tzIGluIHRoZSBtZXNzYWdlLgotICAgICAgICAvLyBTdWJzZXF1ZW50IEJsb2NrcyBhcmUgbG9zdC4gIElmIHRoZSBjYWxsZXIgbmVlZHMgYWNjZXNzIHRvIG11bHRpcGxlIGJvZHkgYmxvY2tzLCAKLSAgICAgICAgLy8gdGhlbiBnZXRCb2R5QmxvY2tzKGluZGV4LC4uLikgc2hvdWxkIGJlIHVzZWQKLQotICAgICAgICAvLyBHZXQgdGhlIGluZGljYXRlZCBibG9jawotICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gX2dldENoaWxkT01FbGVtZW50KF9nZXRCb2R5QmxvY2tQYXJlbnQoKSwgMCk7Ci0gICAgICAgIGlmIChvbUVsZW1lbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gTnVsbCBpbmRpY2F0ZXMgdGhhdCBubyBibG9jayBpcyBhdmFpbGFibGUKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiZ2V0Qm9keUJsb2NrOiBUaGUgYmxvY2sgd2FzIG5vdCBmb3VuZCAiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJnZXRCb2R5QmxvY2s6IEZvdW5kIG9tRWxlbWVudCAiICsgb21FbGVtZW50LmdldFFOYW1lKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzLl9nZXRCbG9ja0Zyb21PTUVsZW1lbnQob21FbGVtZW50LCBjb250ZXh0LCBibG9ja0ZhY3RvcnksIHRydWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEJvZHlCbG9jayhpbnQgaW5kZXgsIEJsb2NrIGJsb2NrKSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgLy8gRm9yY2VzIHRoZSBwYXJzZXIgdG8gcmVhZCBhbGwgb2YgdGhlIGJsb2NrcwotICAgICAgICBnZXROdW1Cb2R5QmxvY2tzKCk7Ci0KLSAgICAgICAgYmxvY2suc2V0UGFyZW50KGdldFBhcmVudCgpKTsKLSAgICAgICAgT01FbGVtZW50IGJFbGVtZW50ID0gX2dldEJvZHlCbG9ja1BhcmVudCgpOwotICAgICAgICBPTUVsZW1lbnQgb20gPSB0aGlzLl9nZXRDaGlsZE9NRWxlbWVudChiRWxlbWVudCwgaW5kZXgpOwotCi0gICAgICAgIC8vIFRoZSBibG9jayBpcyBzdXBwb3NlZCB0byByZXByZXNlbnQgYSBzaW5nbGUgZWxlbWVudC4gIAotICAgICAgICAvLyBCdXQgaWYgaXQgZG9lcyBub3QgcmVwcmVzZW50IGFuIGVsZW1lbnQgLCB0aGUgZm9sbG93aW5nIHdpbGwgZmFpbC4KLSAgICAgICAgUU5hbWUgcU5hbWUgPSBibG9jay5nZXRRTmFtZSgpOwotICAgICAgICBPTU5hbWVzcGFjZSBucyA9IHNvYXBGYWN0b3J5LmNyZWF0ZU9NTmFtZXNwYWNlKHFOYW1lLmdldE5hbWVzcGFjZVVSSSgpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxTmFtZS5nZXRQcmVmaXgoKSk7Ci0KLSAgICAgICAgT01FbGVtZW50IG5ld09NID0gX2NyZWF0ZU9NRWxlbWVudEZyb21CbG9jayhxTmFtZS5nZXRMb2NhbFBhcnQoKSwgbnMsIGJsb2NrLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2FwRmFjdG9yeSwgZmFsc2UpOwotICAgICAgICBpZiAob20gPT0gbnVsbCkgewotICAgICAgICAgICAgYkVsZW1lbnQuYWRkQ2hpbGQobmV3T00pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgb20uaW5zZXJ0U2libGluZ0JlZm9yZShuZXdPTSk7Ci0gICAgICAgICAgICBvbS5kZXRhY2goKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEJvZHlCbG9jayhCbG9jayBibG9jaykgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotCi0gICAgICAgIC8vIEZvcmNlcyB0aGUgcGFyc2VyIHRvIHJlYWQgYWxsIG9mIHRoZSBibG9ja3MKLSAgICAgICAgZ2V0TnVtQm9keUJsb2NrcygpOwotCi0gICAgICAgIGJsb2NrLnNldFBhcmVudChnZXRQYXJlbnQoKSk7Ci0KLSAgICAgICAgLy8gUmVtb3ZlIGFsbCBvZiB0aGUgY2hpbGRyZW4KLSAgICAgICAgT01FbGVtZW50IGJFbGVtZW50ID0gX2dldEJvZHlCbG9ja1BhcmVudCgpOwotICAgICAgICBJdGVyYXRvciBpdCA9IGJFbGVtZW50LmdldENoaWxkcmVuKCk7Ci0gICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIGl0Lm5leHQoKTsKLSAgICAgICAgICAgIGl0LnJlbW92ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGJsb2NrLmlzRWxlbWVudERhdGEoKSkgewotICAgICAgICAgICAgLy8gSWYgdGhlIGJsb2NrIGlzIGVsZW1lbnQgZGF0YSB0aGVuICBpdCBpcyBzYWZlIHRvIGNyZWF0ZQotICAgICAgICAgICAgLy8gYW4gT01FbGVtZW50IHJlcHJlc2VudGluZyB0aGUgYmxvY2sKLQotICAgICAgICAgICAgLy8gVGhlIGJsb2NrIGlzIHN1cHBvc2VkIHRvIHJlcHJlc2VudCBhIHNpbmdsZSBlbGVtZW50LiAgCi0gICAgICAgICAgICAvLyBCdXQgaWYgaXQgZG9lcyBub3QgcmVwcmVzZW50IGFuIGVsZW1lbnQgLCB0aGUgZm9sbG93aW5nIHdpbGwgZmFpbC4KLSAgICAgICAgICAgIFFOYW1lIHFOYW1lID0gYmxvY2suZ2V0UU5hbWUoKTsKLSAgICAgICAgICAgIE9NTmFtZXNwYWNlIG5zID0gc29hcEZhY3RvcnkuY3JlYXRlT01OYW1lc3BhY2UocU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxTmFtZS5nZXRQcmVmaXgoKSk7Ci0KLSAgICAgICAgICAgIE9NRWxlbWVudCBuZXdPTSA9IF9jcmVhdGVPTUVsZW1lbnRGcm9tQmxvY2socU5hbWUuZ2V0TG9jYWxQYXJ0KCksIG5zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9jaywgc29hcEZhY3RvcnksIGZhbHNlKTsKLSAgICAgICAgICAgIGJFbGVtZW50LmFkZENoaWxkKG5ld09NKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFRoaXMgbmVlZHMgdG8gYmUgZml4ZWQsIGJ1dCBmb3Igbm93IHdlIHdpbGwgcmVxdWlyZSB0aGF0IHRoZXJlIG11c3QgYmUgYW4gCi0gICAgICAgICAgICAvLyBlbGVtZW50Li4ub3RoZXJ3aXNlIG5vIGJsb2NrIGlzIGFkZGVkCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIFFOYW1lIHFOYW1lID0gYmxvY2suZ2V0UU5hbWUoKTsKLSAgICAgICAgICAgICAgICBPTU5hbWVzcGFjZSBucyA9IHNvYXBGYWN0b3J5LmNyZWF0ZU9NTmFtZXNwYWNlKHFOYW1lLmdldE5hbWVzcGFjZVVSSSgpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFOYW1lLmdldFByZWZpeCgpKTsKLQotICAgICAgICAgICAgICAgIE9NRWxlbWVudCBuZXdPTSA9IF9jcmVhdGVPTUVsZW1lbnRGcm9tQmxvY2socU5hbWUuZ2V0TG9jYWxQYXJ0KCksIG5zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2ssIHNvYXBGYWN0b3J5LCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgYkVsZW1lbnQuYWRkQ2hpbGQobmV3T00pOwotICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBbiBhdHRlbXB0IHdhcyBtYWRlIHRvIHBhc3MgYSBTb3VyY2Ugb3IgU3RyaW5nIHRoYXQgZG9lcyBub3QgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgImhhdmUgYW4geG1sIGVsZW1lbnQuIFByb2Nlc3NpbmcgY29udGludWVzIHdpdGggYW4gZW1wdHkgcGF5bG9hZC4iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVCb2R5QmxvY2soaW50IGluZGV4KSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIEZvcmNlcyB0aGUgcGFyc2VyIHRvIHJlYWQgYWxsIG9mIHRoZSBibG9ja3MKLSAgICAgICAgZ2V0TnVtQm9keUJsb2NrcygpOwotCi0gICAgICAgIE9NRWxlbWVudCBvbSA9IHRoaXMuX2dldENoaWxkT01FbGVtZW50KF9nZXRCb2R5QmxvY2tQYXJlbnQoKSwgaW5kZXgpOwotICAgICAgICBpZiAob20gIT0gbnVsbCkgewotICAgICAgICAgICAgb20uZGV0YWNoKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldE51bUhlYWRlckJsb2NrcygpIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIF9nZXROdW1DaGlsZEVsZW1lbnRzKHJvb3QuZ2V0SGVhZGVyKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBCbG9jayBnZXRIZWFkZXJCbG9jayhTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbG9jYWxQYXJ0LCBPYmplY3QgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmxvY2tGYWN0b3J5IGJsb2NrRmFjdG9yeSkgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICBPTUVsZW1lbnQgb20gPSBfZ2V0Q2hpbGRPTUVsZW1lbnQocm9vdC5nZXRIZWFkZXIoKSwgbmFtZXNwYWNlLCBsb2NhbFBhcnQpOwotICAgICAgICBpZiAob20gPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMuX2dldEJsb2NrRnJvbU9NRWxlbWVudChvbSwgY29udGV4dCwgYmxvY2tGYWN0b3J5LCBmYWxzZSk7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8QmxvY2s+IGdldEhlYWRlckJsb2NrcyhTdHJpbmcgbmFtZXNwYWNlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsb2NhbFBhcnQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnRleHQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmxvY2tGYWN0b3J5IGJsb2NrRmFjdG9yeSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSb2xlUGxheWVyIHJvbGVQbGF5ZXIpIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgTGlzdDxCbG9jaz4gYmxvY2tzID0gbmV3IEFycmF5TGlzdDxCbG9jaz4oKTsKLSAgICAgICAgCi0gICAgICAgIC8vIEdldCB0aGUgbGlzdCBvZiBPTUVsZW1lbnRzIHRoYXQgaGF2ZSB0aGUgc2FtZSBoZWFkZXIgbmFtZQotICAgICAgICBTT0FQSGVhZGVyIGhlYWRlciA9IHJvb3QuZ2V0SGVhZGVyKCk7Ci0gICAgICAgIGlmIChoZWFkZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGJsb2NrczsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gR2V0IGFuIGl0ZXJhdG9yIG92ZXIgdGhlIGhlYWRlcnMgdGhhdCBoYXZlIGEgYWNjZXB0YWJsZSByb2xlCi0gICAgICAgIEl0ZXJhdG9yIGl0ID0gbnVsbDsKLSAgICAgICAgaWYgKHJvbGVQbGF5ZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgaXQgPSBoZWFkZXIuZ2V0Q2hpbGRFbGVtZW50cygpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaXQgPSBoZWFkZXIuZ2V0SGVhZGVyc1RvUHJvY2Vzcyhyb2xlUGxheWVyKTsKLSAgICAgICAgfQotICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgb20gPSAoT01FbGVtZW50KSBpdC5uZXh0KCk7Ci0gICAgICAgICAgICAvLyBDcmVhdGUgYSBibG9jayBvdXQgb2YgZWFjaCBoZWFkZXIgdGhhdCBtYXRjaGVzIAotICAgICAgICAgICAgLy8gdGhlIHJlcXVlc3RlZCBuYW1lc3BhY2UvbG9jYWxQYXJ0Ci0gICAgICAgICAgICBpZiAob20uZ2V0TmFtZXNwYWNlKCkuZ2V0TmFtZXNwYWNlVVJJKCkuZXF1YWxzKG5hbWVzcGFjZSkgJiYKLSAgICAgICAgICAgICAgICBvbS5nZXRMb2NhbE5hbWUoKS5lcXVhbHMobG9jYWxQYXJ0KSkgewotICAgICAgICAgICAgICAgIEJsb2NrIGJsb2NrID0gX2dldEJsb2NrRnJvbU9NRWxlbWVudChvbSwgY29udGV4dCwgYmxvY2tGYWN0b3J5LCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgYmxvY2tzLmFkZChibG9jayk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJsb2NrczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2V0PFFOYW1lPiBnZXRIZWFkZXJRTmFtZXMoKSB7Ci0gICAgICAgIEhhc2hTZXQ8UU5hbWU+IHFuYW1lcyA9IG5ldyBIYXNoU2V0PFFOYW1lPigpOwotICAgICAgICBTT0FQSGVhZGVyIGhlYWRlciA9IHJvb3QuZ2V0SGVhZGVyKCk7Ci0gICAgICAgIGlmIChoZWFkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgSXRlcmF0b3IgaXQgPSBoZWFkZXIuZ2V0Q2hpbGRFbGVtZW50cygpOyAKLSAgICAgICAgICAgIHdoaWxlIChpdCAhPSBudWxsICYmIGl0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIE9iamVjdCBub2RlID0gaXQubmV4dCgpOwotICAgICAgICAgICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgT01FbGVtZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIHFuYW1lcy5hZGQoKChPTUVsZW1lbnQpIG5vZGUpLmdldFFOYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcW5hbWVzOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRIZWFkZXJCbG9jayhTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbG9jYWxQYXJ0LCBCbG9jayBibG9jaykKLSAgICAgICAgICAgIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgYmxvY2suc2V0UGFyZW50KGdldFBhcmVudCgpKTsKLSAgICAgICAgT01OYW1lc3BhY2UgbnMgPSBzb2FwRmFjdG9yeS5jcmVhdGVPTU5hbWVzcGFjZShuYW1lc3BhY2UsIG51bGwpOwotICAgICAgICBPTUVsZW1lbnQgbmV3T00gPQotICAgICAgICAgICAgICAgIF9jcmVhdGVPTUVsZW1lbnRGcm9tQmxvY2sobG9jYWxQYXJ0LCBucywgYmxvY2ssIHNvYXBGYWN0b3J5LCB0cnVlKTsKLSAgICAgICAgT01FbGVtZW50IG9tID0gdGhpcy5fZ2V0Q2hpbGRPTUVsZW1lbnQocm9vdC5nZXRIZWFkZXIoKSwgbmFtZXNwYWNlLCBsb2NhbFBhcnQpOwotICAgICAgICBpZiAob20gPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKHJvb3QuZ2V0SGVhZGVyKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHNvYXBGYWN0b3J5LmNyZWF0ZVNPQVBIZWFkZXIocm9vdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByb290LmdldEhlYWRlcigpLmFkZENoaWxkKG5ld09NKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG9tLmluc2VydFNpYmxpbmdCZWZvcmUobmV3T00pOwotICAgICAgICAgICAgb20uZGV0YWNoKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgYXBwZW5kSGVhZGVyQmxvY2soU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIGxvY2FsUGFydCwgQmxvY2sgYmxvY2spCi0gICAgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICBibG9jay5zZXRQYXJlbnQoZ2V0UGFyZW50KCkpOwotICAgICAgICBPTU5hbWVzcGFjZSBucyA9IHNvYXBGYWN0b3J5LmNyZWF0ZU9NTmFtZXNwYWNlKG5hbWVzcGFjZSwgbnVsbCk7Ci0gICAgICAgIE9NRWxlbWVudCBuZXdPTSA9Ci0gICAgICAgICAgICBfY3JlYXRlT01FbGVtZW50RnJvbUJsb2NrKGxvY2FsUGFydCwgbnMsIGJsb2NrLCBzb2FwRmFjdG9yeSwgdHJ1ZSk7Ci0gICAgICAgIGlmIChyb290LmdldEhlYWRlcigpID09IG51bGwpIHsKLSAgICAgICAgICAgIHNvYXBGYWN0b3J5LmNyZWF0ZVNPQVBIZWFkZXIocm9vdCk7Ci0gICAgICAgIH0KLSAgICAgICAgcm9vdC5nZXRIZWFkZXIoKS5hZGRDaGlsZChuZXdPTSk7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVIZWFkZXJCbG9jayhTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbG9jYWxQYXJ0KSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIE9NRWxlbWVudCBvbSA9IHRoaXMuX2dldENoaWxkT01FbGVtZW50KHJvb3QuZ2V0SGVhZGVyKCksIG5hbWVzcGFjZSwgbG9jYWxQYXJ0KTsKLSAgICAgICAgd2hpbGUgKG9tICE9IG51bGwpIHsKLSAgICAgICAgICAgIG9tLmRldGFjaCgpOwotICAgICAgICAgICAgb20gPSB0aGlzLl9nZXRDaGlsZE9NRWxlbWVudChyb290LmdldEhlYWRlcigpLCBuYW1lc3BhY2UsIGxvY2FsUGFydCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRyYWNlU3RyaW5nKFN0cmluZyBpbmRlbnQpIHsKLSAgICAgICAgLy8gVE9ETyBUcmFjZSBTdHJpbmcgU3VwcG9ydAotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFhNTFBhcnRDb250ZW50VHlwZSgpIHsKLSAgICAgICAgcmV0dXJuICJTUElORSI7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNGYXVsdCgpIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIFhNTEZhdWx0VXRpbHMuaXNGYXVsdChyb290KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3R5bGUgZ2V0U3R5bGUoKSB7Ci0gICAgICAgIHJldHVybiBzdHlsZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUU5hbWUgZ2V0T3BlcmF0aW9uRWxlbWVudCgpIHsKLSAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IHRoaXMuX2dldEJvZHlCbG9ja1BhcmVudCgpOwotICAgICAgICBpZiAob21FbGVtZW50IGluc3RhbmNlb2YgU09BUEJvZHkpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG9tRWxlbWVudC5nZXRRTmFtZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0T3BlcmF0aW9uRWxlbWVudChRTmFtZSBvcGVyYXRpb25RTmFtZSkgewotICAgICAgICBPTUVsZW1lbnQgb3BFbGVtZW50ID0gdGhpcy5fZ2V0Qm9keUJsb2NrUGFyZW50KCk7Ci0gICAgICAgIGlmICghKG9wRWxlbWVudCBpbnN0YW5jZW9mIFNPQVBCb2R5KSkgewotICAgICAgICAgICAgT01OYW1lc3BhY2UgbnMgPSBzb2FwRmFjdG9yeS5jcmVhdGVPTU5hbWVzcGFjZShvcGVyYXRpb25RTmFtZS5nZXROYW1lc3BhY2VVUkkoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uUU5hbWUuZ2V0UHJlZml4KCkpOwotICAgICAgICAgICAgb3BFbGVtZW50LnNldExvY2FsTmFtZShvcGVyYXRpb25RTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICBvcEVsZW1lbnQuc2V0TmFtZXNwYWNlKG5zKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgQmxvY2sgX2dldEJsb2NrRnJvbU9NRWxlbWVudChPTUVsZW1lbnQgb20sIE9iamVjdCBjb250ZXh0LCBCbG9ja0ZhY3RvcnkgYmxvY2tGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNldENvbXBsZXRlKSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBRTmFtZSBxTmFtZSA9IG9tLmdldFFOYW1lKCk7Ci0gICAgICAgICAgICBPTU5hbWVzcGFjZSBucyA9IG9tLmdldE5hbWVzcGFjZSgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBTYXZlIHRoZSBST0xFCi0gICAgICAgICAgICAvLyBUT0RPIE5lZWQgdG8gZG8gdGhlIHNhbWUgZm9yIFJFTEFZIGFuZCBNVVNUVU5ERVJTVEFORAotICAgICAgICAgICAgU3RyaW5nIHJvbGUgPSBudWxsOwotICAgICAgICAgICAgaWYgKG9tIGluc3RhbmNlb2YgU09BUEhlYWRlckJsb2NrKSB7Ci0gICAgICAgICAgICAgICAgcm9sZSA9ICgoU09BUEhlYWRlckJsb2NrKW9tKS5nZXRSb2xlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8qIFRPRE8gV2UgY291bGQgZ2FpbiBwZXJmb3JtYW5jZSBpZiBPTVNvdXJjZWRFbGVtZW50IGV4cG9zZWQgYSBnZXREYXRhU291cmNlIG1ldGhvZCAKLSAgICAgICAgICAgICBpZiAob20gaW5zdGFuY2VvZiBPTVNvdXJjZWRFbGVtZW50SW1wbCAmJgotICAgICAgICAgICAgICgoT01Tb3VyY2VkRWxlbWVudEltcGwpIG9tKS5nZXREYXRhU291cmNlKCkgaW5zdGFuY2VvZiBCbG9jaykgewotICAgICAgICAgICAgIEJsb2NrIG9sZEJsb2NrID0gKEJsb2NrKSAoKE9NU291cmNlZEVsZW1lbnRJbXBsKSBvbSkuZ2V0RGF0YVNvdXJjZSgpOwotICAgICAgICAgICAgIEJsb2NrIG5ld0Jsb2NrID0gYmxvY2tGYWN0b3J5LmNyZWF0ZUZyb20ob2xkQmxvY2ssIGNvbnRleHQpOwotICAgICAgICAgICAgIG5ld0Jsb2NrLnNldFBhcmVudChnZXRQYXJlbnQoKSk7Ci0gICAgICAgICAgICAgaWYgKG5ld0Jsb2NrICE9IG9sZEJsb2NrKSB7Ci0gICAgICAgICAgICAgLy8gUmVwbGFjZSB0aGUgT01FbGVtZW50IHdpdGggdGhlIE9NU291cmNlZEVsZW1lbnQgdGhhdCBkZWxlZ2F0ZXMgdG8gdGhlIGJsb2NrCi0gICAgICAgICAgICAgIE9NU291cmNlZEVsZW1lbnRJbXBsIG5ld09NID0gbmV3IE9NU291cmNlZEVsZW1lbnRJbXBsKHFOYW1lLCBzb2FwRmFjdG9yeSwgbmV3QmxvY2spOwotICAgICAgICAgICAgICBvbS5pbnNlcnRTaWJsaW5nQmVmb3JlKG5ld09NKTsKLSAgICAgICAgICAgICAgb20uZGV0YWNoKCk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgcmV0dXJuIG5ld0Jsb2NrOwotICAgICAgICAgICAgICB9IAotICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAvLyBDcmVhdGUgdGhlIGJsb2NrCi0gICAgICAgICAgICBCbG9jayBibG9jayA9IGJsb2NrRmFjdG9yeS5jcmVhdGVGcm9tKG9tLCBjb250ZXh0LCBxTmFtZSk7Ci0gICAgICAgICAgICBibG9jay5zZXRQYXJlbnQoZ2V0UGFyZW50KCkpOwotICAgICAgICAgICAgaWYgKG9tIGluc3RhbmNlb2YgU09BUEhlYWRlckJsb2NrKSB7Ci0gICAgICAgICAgICAgICAgYmxvY2suc2V0UHJvcGVydHkoU09BUEhlYWRlckJsb2NrLlJPTEVfUFJPUEVSVFksIHJvbGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBHZXQgdGhlIGJ1c2luZXNzIG9iamVjdCB0byBmb3JjZSBhIHBhcnNlCi0gICAgICAgICAgICBibG9jay5nZXRCdXNpbmVzc09iamVjdChmYWxzZSk7Ci0KLSAgICAgICAgICAgIC8vIFJlcGxhY2UgdGhlIE9NRWxlbWVudCB3aXRoIHRoZSBPTVNvdXJjZWRFbGVtZW50IHRoYXQgZGVsZWdhdGVzIHRvIHRoZSBibG9jawotICAgICAgICAgICAgT01FbGVtZW50IG5ld09NID0gX2NyZWF0ZU9NRWxlbWVudEZyb21CbG9jayhxTmFtZS5nZXRMb2NhbFBhcnQoKSwgbnMsIGJsb2NrLCBzb2FwRmFjdG9yeSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob20uZ2V0UGFyZW50KCkgaW5zdGFuY2VvZiBTT0FQSGVhZGVyKSk7Ci0gICAgICAgICAgICBvbS5pbnNlcnRTaWJsaW5nQmVmb3JlKG5ld09NKTsKLQotICAgICAgICAgICAgLy8gV2Ugd2FudCB0byBzZXQgdGhlIG9tIGVsZW1lbnQgYW5kIGl0cyBwYXJlbnRzIHRvIGNvbXBsZXRlIHRvIAotICAgICAgICAgICAgLy8gc2h1dGRvd24gdGhlIHBhcnNpbmcuICAKLSAgICAgICAgICAgIGlmIChzZXRDb21wbGV0ZSkgewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgcm9vdCBvZiB0aGUgZG9jdW1lbnQKLSAgICAgICAgICAgICAgICBPTUVsZW1lbnRJbXBsIHJvb3QgPSAoT01FbGVtZW50SW1wbCkgb207Ci0gICAgICAgICAgICAgICAgd2hpbGUocm9vdC5nZXRQYXJlbnQoKSBpbnN0YW5jZW9mIE9NRWxlbWVudEltcGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcm9vdCA9IChPTUVsZW1lbnRJbXBsKSByb290LmdldFBhcmVudCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB0cnkgeyAgIAotICAgICAgICAgICAgICAgICAgICBpZiAoIXJvb3QuaXNDb21wbGV0ZSgpICYmIHJvb3QuZ2V0QnVpbGRlcigpICE9IG51bGwgJiYgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIXJvb3QuZ2V0QnVpbGRlcigpLmlzQ29tcGxldGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZvcndhcmQgdGhlIHBhcnNlciB0byB0aGUgZW5kIHNvIGl0IHdpbGwgY2xvc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChyb290LmdldEJ1aWxkZXIoKS5uZXh0KCkgIT0gWE1MU3RyZWFtQ29uc3RhbnRzLkVORF9ET0NVTUVOVCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZG8gbm90aGluZwotICAgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAvLyBMb2cgYW5kIGNvbnRpbnVlCi0gICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJCdWlsZGVyIG5leHQgZXJyb3I6IiArIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy50cmFjZShKYXZhVXRpbHMuc3RhY2tUb1N0cmluZyhlKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgT01Db250YWluZXIgbyA9IG9tOwotICAgICAgICAgICAgICAgIHdoaWxlIChvICE9IG51bGwgJiYgbyBpbnN0YW5jZW9mIE9NQ29udGFpbmVyRXgpIHsKLSAgICAgICAgICAgICAgICAgICAgKChPTUNvbnRhaW5lckV4KW8pLnNldENvbXBsZXRlKHRydWUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoKG8gaW5zdGFuY2VvZiBPTU5vZGUpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoT01Ob2RlKW8pLmdldFBhcmVudCgpKSBpbnN0YW5jZW9mIE9NQ29udGFpbmVyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvID0gKChPTU5vZGUpbykuZ2V0UGFyZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotCi0gICAgICAgICAgICBvbS5kZXRhY2goKTsKLSAgICAgICAgICAgIHJldHVybiBibG9jazsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIHhzZSkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbih4c2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgT01FbGVtZW50IF9jcmVhdGVPTUVsZW1lbnRGcm9tQmxvY2soU3RyaW5nIGxvY2FsTmFtZSwgT01OYW1lc3BhY2UgbnMsIEJsb2NrIGIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09BUEZhY3Rvcnkgc29hcEZhY3RvcnksIGJvb2xlYW4gaXNIZWFkZXJCbG9jaykgewotICAgICAgICBpZiAoaXNIZWFkZXJCbG9jaykgewotICAgICAgICAgICAgcmV0dXJuIHNvYXBGYWN0b3J5LmNyZWF0ZVNPQVBIZWFkZXJCbG9jayhsb2NhbE5hbWUsIG5zLCBiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBzb2FwRmFjdG9yeS5jcmVhdGVPTUVsZW1lbnQoYiwgbG9jYWxOYW1lLCBucyk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgT01FbGVtZW50IHRoYXQgaXMgdGhlIHBhcmVudCBvZiB3aGVyZSB0aGUgdGhlIGJvZHkgYmxvY2tzIGFyZSBsb2NhdGVkCi0gICAgICoKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHJpdmF0ZSBPTUVsZW1lbnQgX2dldEJvZHlCbG9ja1BhcmVudCgpIHsKLSAgICAgICAgU09BUEJvZHkgYm9keSA9IHJvb3QuZ2V0Qm9keSgpOwotICAgICAgICBpZiAoIWJvZHkuaGFzRmF1bHQoKSAmJiBpbmRpcmVjdGlvbiA9PSAxKSB7Ci0gICAgICAgICAgICAvLyAgRm9yIFJQQyB0aGUgYmxvY2tzIGFyZSB3aXRoaW4gdGhlIG9wZXJhdGlvbiBlbGVtZW50Ci0gICAgICAgICAgICBPTUVsZW1lbnQgb3AgPSBib2R5LmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgICAgICAgaWYgKG9wID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBDcmVhdGUgb25lCi0gICAgICAgICAgICAgICAgT01OYW1lc3BhY2UgbnMgPSBzb2FwRmFjdG9yeS5jcmVhdGVPTU5hbWVzcGFjZSgiIiwgIiIpOwotICAgICAgICAgICAgICAgIG9wID0gc29hcEZhY3RvcnkuY3JlYXRlT01FbGVtZW50KCJQTEFDRUhPTERFUl9PUEVSQVRJT04iLCBucywgYm9keSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gb3A7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJvZHk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgZmFjdG9yeSBmb3IgdGhlIHNwZWNpZmllZCBwcm90b2NvbAotICAgICAqCi0gICAgICogQHBhcmFtIHByb3RvY29sCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIFNPQVBGYWN0b3J5IF9nZXRGYWN0b3J5KFByb3RvY29sIHByb3RvY29sKSB7Ci0gICAgICAgIFNPQVBGYWN0b3J5IHNvYXBGYWN0b3J5OwotICAgICAgICBpZiAocHJvdG9jb2wgPT0gUHJvdG9jb2wuc29hcDExKSB7Ci0gICAgICAgICAgICBzb2FwRmFjdG9yeSA9IG5ldyBTT0FQMTFGYWN0b3J5KCk7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvdG9jb2wgPT0gUHJvdG9jb2wuc29hcDEyKSB7Ci0gICAgICAgICAgICBzb2FwRmFjdG9yeSA9IG5ldyBTT0FQMTJGYWN0b3J5KCk7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvdG9jb2wgPT0gUHJvdG9jb2wucmVzdCkgewotICAgICAgICAgICAgLy8gRm9yIFJFU1QsIGNyZWF0ZSBhIFNPQVAgMS4xIEVudmVsb3BlIHRvIGNvbnRhaW4gdGhlIG1lc3NhZ2UKLSAgICAgICAgICAgIC8vIFRoaXMgaXMgY29uc2lzdGVudCB3aXRoIEF4aXMyLgotICAgICAgICAgICAgc29hcEZhY3RvcnkgPSBuZXcgU09BUDExRmFjdG9yeSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeQotICAgICAgICAgICAgICAgICAgICAubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiUkVTVElzTm90U3VwcG9ydGVkIiksIG51bGwpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzb2FwRmFjdG9yeTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gZW10cHkgZW52ZWxvcGUKLSAgICAgKgotICAgICAqIEBwYXJhbSBwcm90b2NvbAotICAgICAqIEBwYXJhbSBzdHlsZQotICAgICAqIEBwYXJhbSBmYWN0b3J5Ci0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIFNPQVBFbnZlbG9wZSBfY3JlYXRlRW1wdHlFbnZlbG9wZShTdHlsZSBzdHlsZSwgU09BUEZhY3RvcnkgZmFjdG9yeSkgewotICAgICAgICBTT0FQRW52ZWxvcGUgZW52ID0gZmFjdG9yeS5jcmVhdGVTT0FQRW52ZWxvcGUoKTsKLSAgICAgICAgLy8gQWRkIGFuIGVtcHR5IGJvZHkgYW5kIGhlYWRlcgotICAgICAgICBmYWN0b3J5LmNyZWF0ZVNPQVBCb2R5KGVudik7Ci0gICAgICAgIGZhY3RvcnkuY3JlYXRlU09BUEhlYWRlcihlbnYpOwotCi0gICAgICAgIC8vIENyZWF0ZSBhIGR1bW15IG9wZXJhdGlvbiBlbGVtZW50IGlmIHRoaXMgaXMgYW4gcnBjIG1lc3NhZ2UKLSAgICAgICAgaWYgKHN0eWxlID09IFN0eWxlLlJQQykgewotICAgICAgICAgICAgT01OYW1lc3BhY2UgbnMgPSBmYWN0b3J5LmNyZWF0ZU9NTmFtZXNwYWNlKCIiLCAiIik7Ci0gICAgICAgICAgICBmYWN0b3J5LmNyZWF0ZU9NRWxlbWVudCgiUExBQ0VIT0xERVJfT1BFUkFUSU9OIiwgbnMsIGVudi5nZXRCb2R5KCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGVudjsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuWE1MUGFydCNnZXROdW1Cb2R5QmxvY2tzKCkKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgX2dldE51bUNoaWxkRWxlbWVudHMoT01FbGVtZW50IG9tKSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIEF2b2lkIGNhbGxpbmcgdGhpcyBtZXRob2QuICBJdCBhZHZhbmNlcyB0aGUgcGFyc2VyLgotICAgICAgICBpZiAob20gPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IG51bSA9IDA7Ci0gICAgICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gb20uZ2V0Q2hpbGRFbGVtZW50cygpOwotICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBudW0rKzsKLSAgICAgICAgICAgIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVtOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgY2hpbGQgb20gYXQgdGhlIGluZGljYXRlZCBpbmRleAotICAgICAqCi0gICAgICogQHBhcmFtIG9tCi0gICAgICogQHBhcmFtIGluZGV4Ci0gICAgICogQHJldHVybiBjaGlsZCBvbSBvciBudWxsCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgT01FbGVtZW50IF9nZXRDaGlsZE9NRWxlbWVudChPTUVsZW1lbnQgb20sIGludCBpbmRleCkgewotICAgICAgICBpZiAob20gPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IGkgPSAwOwotICAgICAgICBmb3IgKE9NTm9kZSBjaGlsZCA9IG9tLmdldEZpcnN0T01DaGlsZCgpOwotICAgICAgICAgICAgIGNoaWxkICE9IG51bGw7Ci0gICAgICAgICAgICAgY2hpbGQgPSBjaGlsZC5nZXROZXh0T01TaWJsaW5nKCkpIHsKLSAgICAgICAgICAgIGlmIChjaGlsZCBpbnN0YW5jZW9mIE9NRWxlbWVudCkgewotICAgICAgICAgICAgICAgIGlmIChpID09IGluZGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAoT01FbGVtZW50KWNoaWxkOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBjaGlsZCBvbSBhdCB0aGUgaW5kaWNhdGVkIGluZGV4Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gb20KLSAgICAgKiBAcGFyYW0gbmFtZXNwYWNlLAotICAgICAqIEBwYXJhbSBsb2NhbFBhcnQKLSAgICAgKiBAcmV0dXJuIGNoaWxkIG9tIG9yIG51bGwKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBPTUVsZW1lbnQgX2dldENoaWxkT01FbGVtZW50KE9NRWxlbWVudCBvbSwgU3RyaW5nIG5hbWVzcGFjZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbG9jYWxQYXJ0KSB7Ci0gICAgICAgIGlmIChvbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBRTmFtZSBxTmFtZSA9IG5ldyBRTmFtZShuYW1lc3BhY2UsIGxvY2FsUGFydCk7Ci0gICAgICAgIEl0ZXJhdG9yIGl0ID0gb20uZ2V0Q2hpbGRyZW5XaXRoTmFtZShxTmFtZSk7Ci0gICAgICAgIGlmIChpdCAhPSBudWxsICYmIGl0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgcmV0dXJuIChPTUVsZW1lbnQpaXQubmV4dCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvaW1wbC9YTUxTdHJlYW1SZWFkZXJGb3JYTUxTcGluZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9pbXBsL1hNTFN0cmVhbVJlYWRlckZvclhNTFNwaW5lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5YmM5MTUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9pbXBsL1hNTFN0cmVhbVJlYWRlckZvclhNTFNwaW5lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuaW1wbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5CbG9jazsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuUHJvdG9jb2w7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLnV0aWwuU3RhY2thYmxlUmVhZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS51dGlsLlhNTFN0cmVhbVJlYWRlckZpbHRlcjsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogWE1MU3RyZWFtUmVhZGVyRm9yWE1MU3BpbmUKLSAqIDxwLz4KLSAqIEFuIFhNTFNwaW5lIGlzIGNvbXBvc2VkIG9mIG1hbnkgZGlmZmVyZW50IHBhcnRzOiBhIHNwYXJzZSBPTSB0cmVlLCBoZWFkZXIgYmxvY2tzLCBib2R5IGJsb2NrcywKLSAqIGV0Yy4KLSAqIDxwLz4KLSAqIFRoZSBYTUxTdHJlYW1SZWFkZXJGb3JYTUxTcGluZSBwcm92aWRlcyBhbiBYTUxTdHJlYW1SZWFkZXIgdGhhdCBvdmVyIGFsbCBvZiB0aGVzZSBjb21iaW5lZAotICogb2JqZWN0cyAod2l0aG91dCBidWlsZGluZyBhIGZ1bGwgT00gdHJlZSkuIEl0IGRvZXMgdGhpcyBieSB1c2luZyBhIFN0YWNrYWJsZVhNTFN0cmVhbVJlYWRlciBmb3IKLSAqIHRoZSB1bmRlcmx5aW5nIGltcGxlbWVudGF0aW9uIGFuZCBwdXNoaW5nIHRoZSBYTUxTdHJlYW1SZWFkZXJzIGZvciB0aGUgYmxvY2tzIG9udG8gdGhlIHN0YWNrIGF0Ci0gKiB0aGUgYXBwcm9wcmlhdGUgcG9pbnRzIGluIHRoZSBtZXNzYWdlLgotICovCi1wdWJsaWMgY2xhc3MgWE1MU3RyZWFtUmVhZGVyRm9yWE1MU3BpbmUgZXh0ZW5kcyBYTUxTdHJlYW1SZWFkZXJGaWx0ZXIgewotCi0gICAgLy8gQ29tcG9uZW50cyBvZiBhbiBYTUxTcGluZQotICAgIE9NRWxlbWVudCByb290OwotICAgIHByaXZhdGUgTGlzdDxCbG9jaz4gaGVhZGVyQmxvY2tzID0gbnVsbDsKLSAgICBwcml2YXRlIExpc3Q8QmxvY2s+IGJvZHlCbG9ja3MgPSBudWxsOwotICAgIHByaXZhdGUgTGlzdDxCbG9jaz4gZGV0YWlsQmxvY2tzID0gbnVsbDsKLSAgICBwcml2YXRlIGJvb2xlYW4gY29uc3VtZSA9IGZhbHNlOwotICAgIFByb3RvY29sIHByb3RvY29sID0gbnVsbDsKLQotICAgIC8vIExvY2FsIENvbnN0YW50cwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCT0RZID0gIkJvZHkiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVIgPSAiSGVhZGVyIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFVTFQgPSAiRmF1bHQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERVRBSUwxMSA9ICJkZXRhaWwiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERVRBSUwxMiA9ICJEZXRhaWwiOwotCi0gICAgYm9vbGVhbiBpbkZhdWx0ID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBMaXN0PEJsb2NrPiBpbnNlcnRCbG9ja3MgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHJvb3QgICAgICAgICBvZiB0aGUgWE1MU3BpbmUKLSAgICAgKiBAcGFyYW0gaGVhZGVyQmxvY2tzCi0gICAgICogQHBhcmFtIGJvZHlCb2NrcwotICAgICAqIEBwYXJhbSBkZXRhaWxCbG9ja3MKLSAgICAgKiBAcGFyYW0gY29uc3VtZQotICAgICAqLwotICAgIHB1YmxpYyBYTUxTdHJlYW1SZWFkZXJGb3JYTUxTcGluZShPTUVsZW1lbnQgcm9vdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvdG9jb2wgcHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8QmxvY2s+IGhlYWRlckJsb2NrcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxCbG9jaz4gYm9keUJsb2NrcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxCbG9jaz4gZGV0YWlsQmxvY2tzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGNvbnN1bWUpIHsKLSAgICAgICAgLy8gQ3JlYXRlIGEgc3RhY2thYmxlIHJlYWRlciBhbmQgcHJpbWUgaXQgd2l0aCB0aGUgcm9vdCBvbSB0cmVlCi0gICAgICAgIC8vIFRoZSBYTUxTdHJlYW1SZWFkZXIncyBmb3IgdGhlIGJsb2NrcyB3aWxsIGJlIHB1c2hlZCBvbnRvIHRoZQotICAgICAgICAvLyBzdGFjayBhcyB0aGUgbWVzc2FnZSBpcyBwcm9jZXNzZWQuCi0gICAgICAgIHN1cGVyKG5ldyBTdGFja2FibGVSZWFkZXIocm9vdC5nZXRYTUxTdHJlYW1SZWFkZXIoKSkpOwotICAgICAgICB0aGlzLnJvb3QgPSByb290OwotICAgICAgICB0aGlzLnByb3RvY29sID0gcHJvdG9jb2w7Ci0gICAgICAgIHRoaXMuaGVhZGVyQmxvY2tzID0gaGVhZGVyQmxvY2tzOwotICAgICAgICB0aGlzLmJvZHlCbG9ja3MgPSBib2R5QmxvY2tzOwotICAgICAgICB0aGlzLmRldGFpbEJsb2NrcyA9IGRldGFpbEJsb2NrczsKLSAgICAgICAgdGhpcy5jb25zdW1lID0gY29uc3VtZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IG5leHQoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gVGhlIG5leHQgbWV0aG9kIGlzIG92ZXJyaWRkZW4gc28gdGhhdCB3ZSBjYW4gcHVzaAotICAgICAgICAvLyB0aGUgYmxvY2sncyBYTUxTdHJlYW1SZWFkZXJzIG9udG8gdGhlIHN0YWNrIGF0IHRoZQotICAgICAgICAvLyBhcHByb3ByaWF0ZSBwbGFjZXMgaW4gdGhlIG1lc3NhZ2UgKHByZXR0eSBzbGljaykuCi0KLSAgICAgICAgLy8gSW5zZXJ0IHBlbmRpbmcgYmxvY2tzIG9udG8gdGhlIHN0YWNrCi0gICAgICAgIGlmIChpbnNlcnRCbG9ja3MgIT0gbnVsbCkgewotICAgICAgICAgICAgcHVzaEJsb2NrcyhpbnNlcnRCbG9ja3MsIGNvbnN1bWUpOwotICAgICAgICAgICAgaW5zZXJ0QmxvY2tzID0gbnVsbDsKLQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gR2V0IHRoZSBuZXh0IGV2ZW50Ci0gICAgICAgIGludCBldmVudCA9IHN1cGVyLm5leHQoKTsKLQotICAgICAgICAvLyBJZiB0aGlzIGlzIGEgc3RhcnQgZWxlbWVudCBldmVudCwgdGhlbiB3ZSBtYXkgbmVlZCB0byBpbnNlcnQKLSAgICAgICAgLy8gdGhlIGJsb2NrcyBwcmlvciB0byB0aGUgbmV4dCBldmVudAotICAgICAgICBpZiAoaXNTdGFydEVsZW1lbnQoKSkgewotICAgICAgICAgICAgUU5hbWUgcU5hbWUgPSBzdXBlci5nZXROYW1lKCk7Ci0gICAgICAgICAgICAvLyBJbnNlcnQgYm9keSBibG9ja3MgYWZ0ZXIgdGhlIEJvZHkKLSAgICAgICAgICAgIGlmIChxTmFtZS5nZXRMb2NhbFBhcnQoKS5lcXVhbHMoQk9EWSkgJiYKLSAgICAgICAgICAgICAgICAgICAgcU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkuZXF1YWxzKHJvb3QuZ2V0TmFtZXNwYWNlKCkuZ2V0TmFtZXNwYWNlVVJJKCkpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGJvZHlCbG9ja3MgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpbnNlcnRCbG9ja3MgPSBib2R5QmxvY2tzOwotICAgICAgICAgICAgICAgICAgICBib2R5QmxvY2tzID0gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnNlcnQgaGVhZGVyIGJsb2NrcyBhZnRlciB0aGUgaGVhZGVyCi0gICAgICAgICAgICBlbHNlIGlmIChxTmFtZS5nZXRMb2NhbFBhcnQoKS5lcXVhbHMoSEVBREVSKSAmJgotICAgICAgICAgICAgICAgICAgICBxTmFtZS5nZXROYW1lc3BhY2VVUkkoKS5lcXVhbHMocm9vdC5nZXROYW1lc3BhY2UoKS5nZXROYW1lc3BhY2VVUkkoKSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoaGVhZGVyQmxvY2tzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaW5zZXJ0QmxvY2tzID0gaGVhZGVyQmxvY2tzOwotICAgICAgICAgICAgICAgICAgICBoZWFkZXJCbG9ja3MgPSBudWxsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAocU5hbWUuZ2V0TG9jYWxQYXJ0KCkuZXF1YWxzKEZBVUxUKSAmJgotICAgICAgICAgICAgICAgICAgICBxTmFtZS5nZXROYW1lc3BhY2VVUkkoKS5lcXVhbHMocm9vdC5nZXROYW1lc3BhY2UoKS5nZXROYW1lc3BhY2VVUkkoKSkpIHsKLSAgICAgICAgICAgICAgICBpbkZhdWx0ID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEluc2VydCBEZXRhaWwgYmxvY2tzIGFmZ2VyIHRoZSBkZXRhaWwuLi5ub3RlIHRoYXQKLSAgICAgICAgICAgIC8vIHRoZSBkZXRhaWwgbmFtZSBpcyBkaWZmZXJlbnQgaW4gU09BUCAxLjEgYW5kIFNPQVAgMS4yCi0gICAgICAgICAgICBlbHNlIGlmIChpbkZhdWx0KSB7Ci0gICAgICAgICAgICAgICAgaWYgKHFOYW1lLmdldExvY2FsUGFydCgpLmVxdWFscyhERVRBSUwxMSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvY29sLmVxdWFscyhQcm90b2NvbC5zb2FwMTEpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBxTmFtZS5nZXRMb2NhbFBhcnQoKS5lcXVhbHMoREVUQUlMMTIpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvY29sLmVxdWFscyhQcm90b2NvbC5zb2FwMTIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkZXRhaWxCbG9ja3MgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0QmxvY2tzID0gZGV0YWlsQmxvY2tzOwotICAgICAgICAgICAgICAgICAgICAgICAgZGV0YWlsQmxvY2tzID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZXZlbnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHVzaCB0aGUgWE1MU3RyZWFtUmVhZGVycyBmb3IgdGhlIGJsb2NrcwotICAgICAqCi0gICAgICogQHBhcmFtIGJsb2NrcwotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBwdXNoQmxvY2tzKExpc3Q8QmxvY2s+IGJsb2NrcywgYm9vbGVhbiBjb25zdW1lKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gUHVzaCB0aGUgWE1MU3RyZWFtUmVhZGVycyBmb3IgdGhlIGJsb2NrcyBvbnRvIHRoZQotICAgICAgICAvLyBkZWxlZ2F0ZS4gIFRoaXMgaXMgZG9uZSBpbiByZXZlcnNlIG9yZGVyIG9mIHRoZSBibG9ja3Mgc28gdGhhdCB0aGUKLSAgICAgICAgLy8gZmlyc3QgIGJsb2NrJ3MgeG1sc3RyZWFtcmVhZGVyIGlzIG9udG9wIG9mIHRoZSBzdGFjay4KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFN0YWNrYWJsZVJlYWRlciBzciA9IChTdGFja2FibGVSZWFkZXIpZGVsZWdhdGU7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gYmxvY2tzLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0gICAgICAgICAgICAgICAgQmxvY2sgYmxvY2sgPSBibG9ja3MuZ2V0KGkpOwotICAgICAgICAgICAgICAgIGlmIChibG9jayAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNyLnB1c2goYmxvY2suZ2V0WE1MU3RyZWFtUmVhZGVyKGNvbnN1bWUpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKFdlYlNlcnZpY2VFeGNlcHRpb24gbWUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBYTUxTdHJlYW1FeGNlcHRpb24obWUpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS91dGlsL0RPTVJlYWRlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS91dGlsL0RPTVJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTI4OGU0Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvdXRpbC9ET01SZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLnV0aWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UudXRpbC5pbXBsLlhNTFN0cmVhbVJlYWRlckZyb21ET007Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotCi0vKiogRE9NUmVhZGVyIENyZWF0ZXMgYW4gWE1MU3RyZWFtUmVhZGVyIGJhY2tlZCBieSBhIERPTSB0cmVlLiAqLwotcHVibGljIGNsYXNzIERPTVJlYWRlciBleHRlbmRzIFJlYWRlciB7Ci0KLSAgICBFbGVtZW50IGVsZW1lbnQ7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gcmVhZGVyCi0gICAgICogQHBhcmFtIHJlc2V0dGFibGUKLSAgICAgKi8KLSAgICBwdWJsaWMgRE9NUmVhZGVyKEVsZW1lbnQgZWxlbWVudCkgewotICAgICAgICBzdXBlcihfbmV3UmVhZGVyKGVsZW1lbnQpLCB0cnVlKTsKLQotICAgICAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UudXRpbC5SZWFkZXIjbmV3UmVhZGVyKCkKLSAgICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFhNTFN0cmVhbVJlYWRlciBuZXdSZWFkZXIoKSB7Ci0gICAgICAgIHJldHVybiBfbmV3UmVhZGVyKGVsZW1lbnQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFV0aWxpdHkgbWV0aG9kIHRvIGdldCB0aGUgc3RyZWFtIHJlYWRlcgotICAgICAqCi0gICAgICogQHBhcmFtIGVsZW1lbnQKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgWE1MU3RyZWFtUmVhZGVyIF9uZXdSZWFkZXIoRWxlbWVudCBlbGVtZW50KSB7Ci0gICAgICAgIC8vIENvbnN0cnVjdCBhIHJlYWRlciBmcm9tIGFuIGVsZW1lbnQKLSAgICAgICAgcmV0dXJuIG5ldyBYTUxTdHJlYW1SZWFkZXJGcm9tRE9NKGVsZW1lbnQpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvdXRpbC9NZXNzYWdlVXRpbHMuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvdXRpbC9NZXNzYWdlVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZhNjQzYS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL3V0aWwvTWVzc2FnZVV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UudXRpbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uYXR0YWNobWVudHMuQXR0YWNobWVudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTVRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTVhNTFBhcnNlcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLk1UT01Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmJ1aWxkZXIuU3RBWEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVAxMUNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50cy5Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk9wZXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5FeGNlcHRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaGFuZGxlci5BdHRhY2htZW50c0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5oYW5kbGVyLlNPQVBIZWFkZXJzQWRhcHRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmhhbmRsZXIuVHJhbnNwb3J0SGVhZGVyc0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5pMThuLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5NZXNzYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5Qcm90b2NvbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuYXR0YWNobWVudHMuQXR0YWNobWVudFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5mYWN0b3J5Lk1lc3NhZ2VGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MucmVnaXN0cnkuRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MudXRpbGl0eS5KYXZhVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5IVFRQQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXguYWN0aXZhdGlvbi5EYXRhSGFuZGxlcjsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLkF0dGFjaG1lbnRQYXJ0OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBNZXNzYWdlOwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKiBNaXNjZWxsYW5lb3VzIFV0aWxpdGllcyB0aGF0IG1heSBiZSB1c2VmdWwgaW5zaWRlIGFuZCBvdXRzaWRlIHRoZSBNZXNzYWdlIHN1YmNvbXBvbmVudC4gKi8KLXB1YmxpYyBjbGFzcyBNZXNzYWdlVXRpbHMgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKE1lc3NhZ2VVdGlscy5jbGFzcyk7Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYW4gYXhpb20gU09BUEZhY3RvcnkgZm9yIHRoZSBzcGVjaWZpZWQgZWxlbWVudAotICAgICAqCi0gICAgICogQHBhcmFtIGUgT01FbGVtZW50Ci0gICAgICogQHJldHVybiBTT0FQRmFjdG9yeQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU09BUEZhY3RvcnkgZ2V0U09BUEZhY3RvcnkoT01FbGVtZW50IGUpIHsKLSAgICAgICAgLy8gR2V0dGluZyBhIGZhY3RvcnkgZnJvbSBhIFNPQVBFbnZlbG9wZSBpcyBub3Qgc3RyYWlnaHQtZm9yd2FyZC4KLSAgICAgICAgLy8gUGxlYXNlIGNoYW5nZSB0aGlzIGNvZGUgaWYgYW4gZWFzaWVyIG1lY2hhbmlzbSBpcyBkaXNjb3ZlcmVkLgotCi0gICAgICAgIE9NWE1MUGFyc2VyV3JhcHBlciBidWlsZGVyID0gZS5nZXRCdWlsZGVyKCk7Ci0gICAgICAgIGlmIChidWlsZGVyIGluc3RhbmNlb2YgU3RBWEJ1aWxkZXIpIHsKLSAgICAgICAgICAgIFN0QVhCdWlsZGVyIHN0YXhCdWlsZGVyID0gKFN0QVhCdWlsZGVyKWJ1aWxkZXI7Ci0gICAgICAgICAgICBPTURvY3VtZW50IGRvY3VtZW50ID0gc3RheEJ1aWxkZXIuZ2V0RG9jdW1lbnQoKTsKLSAgICAgICAgICAgIGlmIChkb2N1bWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgT01GYWN0b3J5IGZhY3RvcnkgPSBkb2N1bWVudC5nZXRPTUZhY3RvcnkoKTsKLSAgICAgICAgICAgICAgICBpZiAoZmFjdG9yeSBpbnN0YW5jZW9mIFNPQVBGYWN0b3J5KSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAoU09BUEZhY3RvcnkpZmFjdG9yeTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gRmxvdyB0byBoZXJlIGluZGljYXRlcyB0aGF0IHRoZSBlbnZlbG9wZSBkb2VzIG5vdCBoYXZlCi0gICAgICAgIC8vIGFuIGFjY2Vzc2libGUgZmFjdG9yeS4gIENyZWF0ZSBhIG5ldyBmYWN0b3J5IGJhc2VkIG9uIHRoZSAKLSAgICAgICAgLy8gcHJvdG9jb2wuCi0KLSAgICAgICAgd2hpbGUgKGUgIT0gbnVsbCAmJiAhKGUgaW5zdGFuY2VvZiBTT0FQRW52ZWxvcGUpKSB7Ci0gICAgICAgICAgICBlID0gKE9NRWxlbWVudCllLmdldFBhcmVudCgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChlIGluc3RhbmNlb2YgU09BUEVudmVsb3BlKSB7Ci0gICAgICAgICAgICBpZiAoU09BUDExQ29uc3RhbnRzLlNPQVBfRU5WRUxPUEVfTkFNRVNQQUNFX1VSSS4KLSAgICAgICAgICAgICAgICAgICAgZXF1YWxzKGUuZ2V0TmFtZXNwYWNlKCkuZ2V0TmFtZXNwYWNlVVJJKCkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMUZhY3RvcnkoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMkZhY3RvcnkoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gU0FBSiBBdHRhY2htZW50UGFydCBmcm9tIGEgSkFYV1MgQXR0YWNobWVudAotICAgICAqIEBwYXJhbSBjaWQgU3RyaW5nIGNvbnRlbnQgaWQKLSAgICAgKiBAcGFyYW0gZGggRGF0YUhhbmRsZXIKLSAgICAgKiBAcGFyYW0gbWVzc2FnZSBTT0FQTWVzc2FnZQotICAgICAqIEByZXR1cm4gQXR0YWNobWVudFBhcnQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEF0dGFjaG1lbnRQYXJ0IGNyZWF0ZUF0dGFjaG1lbnRQYXJ0KFN0cmluZyBjaWQsIERhdGFIYW5kbGVyIGRoLCBTT0FQTWVzc2FnZSBtZXNzYWdlKSB7Ci0gICAgICAgIC8vIENyZWF0ZSB0aGUgQXR0YWNobWVudCBQYXJ0Ci0gICAgICAgIEF0dGFjaG1lbnRQYXJ0IGFwID0gbWVzc2FnZS5jcmVhdGVBdHRhY2htZW50UGFydChkaCk7Ci0gICAgICAgIAotICAgICAgICAvLyBSRVZJRVcKLSAgICAgICAgLy8gRG8gd2UgbmVlZCB0byBjb3B5IHRoZSBjb250ZW50IHR5cGUgZnJvbSB0aGUgZGF0YWhhbmRsZXIgPwotICAgICAgICAKLSAgICAgICAgLy8gUHJlc2VydmUgdGhlIG9yaWdpbmFsIGNvbnRlbnQgaWQKLSAgICAgICAgYXAuc2V0Q29udGVudElkKGNpZCk7Ci0gICAgICAgIHJldHVybiBhcDsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIEpBWC1XUyBNZXNzYWdlIGZyb20gdGhlIGluZm9ybWF0aW9uIG9uIGFuIEF4aXMgMiBNZXNzYWdlIENvbnRleHQKLSAgICAgKgotICAgICAqIEBwYXJhbSBtc2dDb250ZXh0Ci0gICAgICogQHJldHVybiBNZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBNZXNzYWdlIGdldE1lc3NhZ2VGcm9tTWVzc2FnZUNvbnRleHQoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkKLSAgICAgICAgICAgIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIlN0YXJ0IGdldE1lc3NhZ2VGcm9tTWVzc2FnZUNvbnRleHQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9IG51bGw7Ci0gICAgICAgIC8vIElmIHRoZSBBeGlzMiBNZXNzYWdlQ29udGV4dCB0aGF0IHdhcyBwYXNzZWQgaW4gaGFzIGEgU09BUEVudmVsb3BlCi0gICAgICAgIC8vIHNldCBvbiBpdCwgZ3JhYiB0aGF0IGFuZCBjcmVhdGUgYSBKQVgtV1MgTWVzc2FnZSBvdXQgb2YgaXQuCi0gICAgICAgIFNPQVBFbnZlbG9wZSBzb2FwRW52ID0gbXNnQ29udGV4dC5nZXRFbnZlbG9wZSgpOwotICAgICAgICBpZiAoc29hcEVudiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBNZXNzYWdlRmFjdG9yeSBtc2dGYWN0b3J5ID0KLSAgICAgICAgICAgICAgICAgICAgKE1lc3NhZ2VGYWN0b3J5KUZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KE1lc3NhZ2VGYWN0b3J5LmNsYXNzKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgUHJvdG9jb2wgcHJvdG9jb2wgPSBtc2dDb250ZXh0LmlzRG9pbmdSRVNUKCkgPyBQcm90b2NvbC5yZXN0IDogbnVsbDsKLSAgICAgICAgICAgICAgICBtZXNzYWdlID0gbXNnRmFjdG9yeS5jcmVhdGVGcm9tKHNvYXBFbnYsIHByb3RvY29sKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAJCU1lc3NhZ2VzLmdldE1lc3NhZ2UoIm1zZ0Zyb21Nc2dFcnIiKSwgZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIE9iamVjdCBwcm9wZXJ0eSA9IG1zZ0NvbnRleHQuZ2V0UHJvcGVydHkoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uRU5BQkxFX01UT00pOwotICAgICAgICAgICAgaWYgKHByb3BlcnR5ICE9IG51bGwgJiYgSmF2YVV0aWxzLmlzVHJ1ZUV4cGxpY2l0bHkocHJvcGVydHkpKSB7Ci0gICAgICAgICAgICAgICAgbWVzc2FnZS5zZXRNVE9NRW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gQWRkIGFsbCB0aGUgTWltZUhlYWRlcnMgZnJvbSB0aGUgQXhpczIgTWVzc2FnZUNvbnRleHQKLSAgICAgICAgICAgIE1hcCBoZWFkZXJNYXAgPSAoTWFwKW1zZ0NvbnRleHQuZ2V0UHJvcGVydHkoTWVzc2FnZUNvbnRleHQuVFJBTlNQT1JUX0hFQURFUlMpOwotICAgICAgICAgICAgaWYgKGhlYWRlck1hcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbWVzc2FnZS5zZXRNaW1lSGVhZGVycyhoZWFkZXJNYXApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBUT0RPOiBUaGlzIGlzIGEgV09SS0FST1VORCBmb3IgbWlzc2luZyBTT0FQRmF1bHQgZGF0YS4gIElmIHdlIGRvIGEgdG9TdHJpbmcgb24gdGhlCi0gICAgICAgICAgICAvLyBTT0FQRW52ZWxvcGUsIHRoZW4gYWxsIHRoZSBkYXRhIHdpbGwgYmUgYXZhaWxhYmxlIHRvIHRoZSBwcm92aWRlci4gIE90aGVyd2lzZSwgaXQKLSAgICAgICAgICAgIC8vIHdpbGwgYmUgbWlzc2luZyB0aGUgPFJlYXNvbj4gZWxlbWVudCBjb3JyZXNwb25kaW5nIHRvIHRoZSA8ZmF1bHRzdHJpbmc+IGVsZW1lbnQuICAKLSAgICAgICAgICAgIC8vIFRoZSBTT0FQRmF1bHRQcm92aWRlclRlc3RzIHdpbGwgY2hlY2sgZm9yIHRoaXMgZmFpbHVyZS4KLSAgICAgICAgICAgIGlmIChzb2FwRW52Lmhhc0ZhdWx0KCkpIHsKLSAgICAgICAgICAgICAgICBzb2FwRW52LnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChmYWxzZSkgewotICAgICAgICAgICAgICAgIG1ha2VYT1BJbmNsdWRlTm9kZXMobXNnQ29udGV4dCwgbWVzc2FnZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1lc3NhZ2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHV0IHRoZSBKQVgtV1MgTWVzc2FnZSBvbnRvIHRoZSBBeGlzMiBNZXNzYWdlQ29udGV4dAotICAgICAqCi0gICAgICogQHBhcmFtIG1lc3NhZ2UgICAgSkFYLVdTIE1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gbXNnQ29udGV4dCBBeGlzMk1lc3NhZ2VDb250ZXh0Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHB1dE1lc3NhZ2VPbk1lc3NhZ2VDb250ZXh0KE1lc3NhZ2UgbWVzc2FnZSwgTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQsIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICAvLyBQdXQgdGhlIFhNTCBtZXNzYWdlIG9uIHRoZSBBeGlzIDIgTWVzc2FnZSBDb250ZXh0Ci0gICAgICAgIFNPQVBFbnZlbG9wZSBlbnZlbG9wZSA9IChTT0FQRW52ZWxvcGUpbWVzc2FnZS5nZXRBc09NRWxlbWVudCgpOwotICAgICAgICBtc2dDb250ZXh0LnNldEVudmVsb3BlKGVudmVsb3BlKTsKLQotICAgICAgICAvLyBQdXQgdGhlIEhlYWRlcnMgb250byB0aGUgTWVzc2FnZUNvbnRleHQKLSAgICAgICAgTWFwIGhlYWRlck1hcCA9IG1lc3NhZ2UuZ2V0TWltZUhlYWRlcnMoKTsKLSAgICAgICAgbXNnQ29udGV4dC5zZXRQcm9wZXJ0eShNZXNzYWdlQ29udGV4dC5UUkFOU1BPUlRfSEVBREVSUywgaGVhZGVyTWFwKTsKLSAgICAgICAgbXNnQ29udGV4dC5zZXRQcm9wZXJ0eShIVFRQQ29uc3RhbnRzLkhUVFBfSEVBREVSUywgaGVhZGVyTWFwKTsKLQotICAgICAgICBpZiAobWVzc2FnZS5nZXRQcm90b2NvbCgpID09IFByb3RvY29sLnJlc3QpIHsKLSAgICAgICAgICAgIG1zZ0NvbnRleHQuc2V0RG9pbmdSRVNUKHRydWUpOwotICAgICAgICAgICAgbXNnQ29udGV4dC5zZXRQcm9wZXJ0eShDb25zdGFudHMuQ29uZmlndXJhdGlvbi5DT05URU5UX1RZUEUsIEhUVFBDb25zdGFudHMuTUVESUFfVFlQRV9BUFBMSUNBVElPTl9YTUwpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIHRoZSBKQVgtV1MgQXR0YWNobWVudEFkYXB0ZXIgaXMgY29ycmVjdGx5IGluc3RhbGxlZAotICAgICAgICAvLyBTbyB0aGF0IGFueSB1c2VyIGF0dGFjaG1lbnRzIHByb3ZpZGUgYXJlIG1vdmVkIHRvIHRoZSBBeGlvbSBBdHRhY2htZW50cwotICAgICAgICAvLyBNYXAKLSAgICAgICAgaWYgKG1lc3NhZ2UuZ2V0TWVzc2FnZUNvbnRleHQoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBBdHRhY2htZW50c0FkYXB0ZXIuaW5zdGFsbChtZXNzYWdlLmdldE1lc3NhZ2VDb250ZXh0KCkpOwotICAgICAgICAgICAgVHJhbnNwb3J0SGVhZGVyc0FkYXB0ZXIuaW5zdGFsbChtZXNzYWdlLmdldE1lc3NhZ2VDb250ZXh0KCkpOwotICAgICAgICAgICAgU09BUEhlYWRlcnNBZGFwdGVyLmluc3RhbGwobWVzc2FnZS5nZXRNZXNzYWdlQ29udGV4dCgpKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKG1lc3NhZ2UuaXNEb2luZ1NXQSgpKSB7Ci0gICAgICAgICAgICAvLyBFbmFibGUgU1dBIG9uIHRoZSBBeGlzMiBNZXNzYWdlQ29udGV4dAotICAgICAgICAgICAgbXNnQ29udGV4dC5zZXREb2luZ1N3QSh0cnVlKTsKLSAgICAgICAgICAgIG1zZ0NvbnRleHQuc2V0UHJvcGVydHkoQ29uZmlndXJhdGlvbi5FTkFCTEVfU1dBLCAidHJ1ZSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gRW5hYmxlIE1UT00gQXR0YWNobWVudHMgCi0gICAgICAgIGlmIChtZXNzYWdlLmlzTVRPTUVuYWJsZWQoKSkgewotICAgICAgICAgICAgLy8gRW5hYmxlIE1UT00gb24gdGhlIEF4aXMyIE1lc3NhZ2VDb250ZXh0Ci0gICAgICAgICAgICBtc2dDb250ZXh0LnNldFByb3BlcnR5KENvbmZpZ3VyYXRpb24uRU5BQkxFX01UT00sICJ0cnVlIik7Ci0gICAgICAgICAgICBpZiAoZmFsc2UpIHsKLSAgICAgICAgICAgICAgICBtYWtlQmluYXJ5Tm9kZXMobWVzc2FnZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVXNlZCB0byBleHBhbmQgdGhlIHRyZWUgYW5kIGNyZWF0ZSBiaW5hcnkgbm9kZXMKLSAgICAgKiBAcGFyYW0gbXNnCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIG1ha2VCaW5hcnlOb2RlcyhNZXNzYWdlIG1zZykgewotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiTVRPTSBpcyBlbmFibGVkIG9uIHRoZSBKQVgtV1MgTWVzc2FnZS4uLmxvb2sgZm9yIFhPUCBJbmNsdWRlcyIpOwotICAgICAgICB9Ci0gICAgICAgIC8vIElmIHdlIGhhdmUgTVRPTSBhdHRhY2htZW50cywgd2UgbmVlZCB0byByZXBsYWNlIHRoZSA8eG9wOmluY2x1ZGU+Ci0gICAgICAgIC8vIGVsZW1lbnRzIHdpdGggT01UZXh0IGJpbmFyeSBub2Rlcy4KLSAgICAgICAgCi0gICAgICAgIC8vIEZpcnN0IGZpbmQgYWxsIG9mIHRoZSA8eG9wOmluY2x1ZGU+IGVsZW1lbnRzCi0gICAgICAgIFNPQVBFbnZlbG9wZSBlbnZlbG9wZSA9IChTT0FQRW52ZWxvcGUpIG1zZy5nZXRBc09NRWxlbWVudCgpOwotICAgICAgICBBcnJheUxpc3Q8T01FbGVtZW50PiB4b3BzID0gQXR0YWNobWVudFV0aWxzLmZpbmRYb3BFbGVtZW50cyhlbnZlbG9wZSk7Ci0gICAgICAgIAotICAgICAgICBpZiAoeG9wcyAhPSBudWxsICYmIHhvcHMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJGb3VuZCBYT1A6SW5jbHVkZSBFbGVtZW50cyIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBRTmFtZSBocmVmID0gbmV3IFFOYW1lKCIiLCJocmVmIik7Ci0gICAgICAgICAgICBJdGVyYXRvcjxPTUVsZW1lbnQ+IGl0ciA9IHhvcHMuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgCi0gICAgICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIE9NRWxlbWVudCB4b3AgPSBpdHIubmV4dCgpOwotICAgICAgICAgICAgICAgIFN0cmluZyBjaWQgPSB4b3AuZ2V0QXR0cmlidXRlVmFsdWUoaHJlZik7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gRmluZCBhbmQgcmVtb3ZlIHRoZSBBdHRhY2htZW50IGZyb20gdGhlIEpBWC1XUyBNZXNzYWdlCi0gICAgICAgICAgICAgICAgLy8gKEl0IGlzIHJlbW92ZWQgc28gdGhhdCBpdCBpcyBub3QgY29uc2lkZXJlZCBhIFNXQSBBdHRhY2htZW50IC4uLnNlZSBiZWxvdykKLSAgICAgICAgICAgICAgICBEYXRhSGFuZGxlciBkaCA9IG1zZy5yZW1vdmVEYXRhSGFuZGxlcihjaWQpOwotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkNyZWF0ZSBCaW5hcnkgT01Ob2RlIGZvciBhdHRhY2htZW50OiIgKyBjaWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBDb252ZXJ0IHRoZSA8eG9wOmluY2x1ZGU+IE9NRWxlbWVudCBpbnRvIGFuIE9NVGV4dAotICAgICAgICAgICAgICAgIC8vIGJpbmFyeSBub2RlIGFuZCByZXBsYWNlIGl0IGluIHRoZSB0cmVlLiAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgT01UZXh0IGJpbmFyeU5vZGUgPSBBdHRhY2htZW50VXRpbHMubWFrZUJpbmFyeU9NTm9kZSh4b3AsIGRoKTsKLSAgICAgICAgICAgICAgICB4b3AuaW5zZXJ0U2libGluZ0FmdGVyKGJpbmFyeU5vZGUpOwotICAgICAgICAgICAgICAgIHhvcC5kZXRhY2goKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBFeHBhbmQgdGhlIHRyZWUgYW5kIGNyZWF0ZSBYT1Agbm9kZXMKLSAgICAgKiBAcGFyYW0gbXNnCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIG1ha2VYT1BJbmNsdWRlTm9kZXMoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCwgTWVzc2FnZSBtZXNzYWdlKSB7Ci0gICAgICAgIC8vIFRoaXMgZGVzdHJveXMgcGVyZm9ybWFuY2UgYnkgZm9yY2luZyBhIGRvdWJsZSBwYXNzIHRocm91Z2ggdGhlIG1lc3NhZ2UuCi0gICAgICAgIC8vSWYgYXR0YWNobWVudHMgYXJlIGZvdW5kIG9uIHRoZSBNZXNzYWdlQ29udGV4dCwgdGhlbiB0aGF0IG1lYW5zCi0gICAgICAgIC8vdGhlIGluYm91bmQgbWVzc2FnZSBoYXMgbW9yZSB0aGFuIGp1c3QgdGhlIG5vcm1hbCBYTUwgcGF5bG9hZAotICAgICAgICBBdHRhY2htZW50cyBhcyA9IChBdHRhY2htZW50cykgbXNnQ29udGV4dC5nZXRQcm9wZXJ0eShNVE9NQ29uc3RhbnRzLkFUVEFDSE1FTlRTKTsgCi0gICAgICAgIGlmIChhcyAhPSBudWxsKSB7IAotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJGb3VuZCBBeGlzIE1UT00gQXR0YWNobWVudHMiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy9XYWxrIHRoZSB0cmVlIGFuZCBmaW5kIGFsbCBvZiB0aGUgb3B0aW1pemVkIGJpbmFyeSBub2Rlcy4KLSAgICAgICAgICAgIEFycmF5TGlzdDxPTVRleHQ+IGJpbmFyeU5vZGVzID0gQXR0YWNobWVudFV0aWxzLmZpbmRCaW5hcnlOb2RlcygoU09BUEVudmVsb3BlKSBtZXNzYWdlLmdldEFzT01FbGVtZW50KCkpOwotICAgICAgICAgICAgaWYgKGJpbmFyeU5vZGVzICE9IG51bGwgICYmIGJpbmFyeU5vZGVzLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJGb3VuZCAiICsgYmluYXJ5Tm9kZXMuc2l6ZSgpICsiTVRPTSBCaW5hcnkgTm9kZXMiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy9SZXBsYWNlIGVhY2ggb2YgdGhlIG5vZGVzIHdpdGggaXQncyBjb3JyZXNwb25kaW5nIDx4b3A6aW5jbHVkZT4KLSAgICAgICAgICAgICAgICAvL2VsZW1lbnQsIHNvIEpBWEIgY2FuIHByb2Nlc3MgaXQgY29ycmVjdGx5LgotICAgICAgICAgICAgICAgIEl0ZXJhdG9yPE9NVGV4dD4gaXRyID0gYmluYXJ5Tm9kZXMuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICBPTVRleHQgbm9kZSA9IGl0ci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIE9NRWxlbWVudCB4b3AgPSBBdHRhY2htZW50VXRpbHMubWFrZVhvcEVsZW1lbnQobm9kZSk7Ci0gICAgICAgICAgICAgICAgICAgIG5vZGUuZ2V0UGFyZW50KCkuYWRkQ2hpbGQoeG9wKTsKLSAgICAgICAgICAgICAgICAgICAgbm9kZS5kZXRhY2goKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIC8vV2UgaGF2ZSB0byBhZGQgdGhlIGluZGl2aWR1YWwgYXR0YWNobWVudHMgaW4gdGhlaXIgcmF3Ci0gICAgICAgICAgICAgICAgICAgIC8vYmluYXJ5IGZvcm0sIHNvIHdlIGNhbiBhY2Nlc3MgdGhlbSBsYXRlci4KLSAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkNyZWF0ZSBNVE9NIE1lc3NhZ2UgQXR0YWNobWVudCBmb3IgIiArIG5vZGUuZ2V0Q29udGVudElEKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuYWRkRGF0YUhhbmRsZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKERhdGFIYW5kbGVyKSBub2RlLmdldERhdGFIYW5kbGVyKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuZ2V0Q29udGVudElEKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSAKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhpcyBpcyBmb3IgZGVidWcgcHVycG9zZXMgb25seQotICAgICAqIEBwYXJhbSBtYwotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcGVyc2lzdE1lc3NhZ2VDb250ZXh0KE1lc3NhZ2VDb250ZXh0IG1jKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBjYyA9IG1jLmdldENvbmZpZ3VyYXRpb25Db250ZXh0KCk7Ci0gICAgICAgICAgICBPcGVyYXRpb25Db250ZXh0IG9wID0gbWMuZ2V0T3BlcmF0aW9uQ29udGV4dCgpOwotICAgICAgICAgICAgaWYgKGNjID09IG51bGwgJiYgb3AgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNjID0gb3AuZ2V0Q29uZmlndXJhdGlvbkNvbnRleHQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgRmlsZSB0aGVGaWxlID0gbnVsbDsKLSAgICAgICAgICAgIHRoZUZpbGUgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJEZWJ1Z1BlcnNpc3QiLCBudWxsKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gU2V0dXAgYW4gb3V0cHV0IHN0cmVhbSB0byBhIHBoeXNpY2FsIGZpbGUKLSAgICAgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gb3V0U3RyZWFtID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0odGhlRmlsZSk7Ci0KLSAgICAgICAgICAgIC8vIEF0dGFjaCBhIHN0cmVhbSBjYXBhYmxlIG9mIHdyaXRpbmcgb2JqZWN0cyB0byB0aGUgCi0gICAgICAgICAgICAvLyBzdHJlYW0gY29ubmVjdGVkIHRvIHRoZSBmaWxlCi0gICAgICAgICAgICBPYmplY3RPdXRwdXRTdHJlYW0gb3V0T2JqU3RyZWFtID0gbmV3IE9iamVjdE91dHB1dFN0cmVhbShvdXRTdHJlYW0pOwotCi0gICAgICAgICAgICAvLyBUcnkgdG8gc2F2ZSB0aGUgbWVzc2FnZSBjb250ZXh0Ci0gICAgICAgICAgICBvdXRPYmpTdHJlYW0ud3JpdGVPYmplY3QobWMpOwotICAgICAgICAgICAgb3V0T2JqU3RyZWFtLmZsdXNoKCk7Ci0gICAgICAgICAgICBvdXRPYmpTdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgIG91dFN0cmVhbS5mbHVzaCgpOwotICAgICAgICAgICAgb3V0U3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIE5vdyByZWFkIGluIHRoZSBwZXJzaXN0ZWQgbWVzc2FnZQotICAgICAgICAgICAgLy8gU2V0dXAgYW4gaW5wdXQgc3RyZWFtIHRvIHRoZSBmaWxlCi0gICAgICAgICAgICBGaWxlSW5wdXRTdHJlYW0gaW5TdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKHRoZUZpbGUpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBhdHRhY2ggYSBzdHJlYW0gY2FwYWJsZSBvZiByZWFkaW5nIG9iamVjdHMgZnJvbSB0aGUgCi0gICAgICAgICAgICAvLyBzdHJlYW0gY29ubmVjdGVkIHRvIHRoZSBmaWxlCi0gICAgICAgICAgICBPYmplY3RJbnB1dFN0cmVhbSBpbk9ialN0cmVhbSA9IG5ldyBPYmplY3RJbnB1dFN0cmVhbShpblN0cmVhbSk7Ci0KLSAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dCByZXN0b3JlZE1DID0gCi0gICAgICAgICAgICAgICAgKG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dCkgaW5PYmpTdHJlYW0ucmVhZE9iamVjdCgpOwotICAgICAgICAgICAgaW5PYmpTdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgIGluU3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgICAgICBpZiAoY2MgPT0gbnVsbCAmJiBvcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoY2MgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJlc3RvcmVkTUMuYWN0aXZhdGUoY2MpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXN0b3JlZE1DLmFjdGl2YXRlV2l0aE9wZXJhdGlvbkNvbnRleHQob3ApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHJlc3RvcmVkTUMuZ2V0U2VydmljZUNvbnRleHQoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbigiTm8gU2VydmljZSBHcm91cCEiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChjYyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbWMuYWN0aXZhdGUoY2MpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtYy5hY3RpdmF0ZVdpdGhPcGVyYXRpb25Db250ZXh0KG9wKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtYy5nZXRPcGVyYXRpb25Db250ZXh0KCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJObyBPcGVyYXRpb24gQ29udGV4dCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1jLmdldE9wZXJhdGlvbkNvbnRleHQoKS5nZXRTZXJ2aWNlQ29udGV4dCgpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiTm8gU2VydmljZSBDb250ZXh0Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvdXRpbC9SZWFkZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvdXRpbC9SZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmExZmYyYi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL3V0aWwvUmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UudXRpbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuRXhjZXB0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmkxOG4uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLk5hbWVzcGFjZUNvbnRleHQ7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLkxvY2F0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOwotLyoqCi0gKiBSZWFkZXIgSW4gbWFueSBzaXR1YXRpb25zLCB5b3Ugd2FudCB0aGUgYWJpbGl0eSB0byByZXNldCBhbiBYTUxTdHJlYW1SZWFkZXIuIChPciBhdCBsZWFzdCBhc2sgaWYKLSAqIHRoZSBYTUxTdHJlYW1SZWFkZXIgaXMgcmVzZXR0YWJsZSkuCi0gKiA8cC8+Ci0gKiBUaGUgUmVhZGVyIGFic3RyYWN0IGNsYXNzOiAtIGFjY2VwdHMgYW4gWE1MU3RyZWFtUmVhZGVyIC0gcHJvdmlkZXMgcmVzZXQoKSBhbmQgaXNSZXNldHRhYmxlKCkKLSAqIG1ldGhvZHMgQWRkcyBzdXBwb3J0IHJlc2V0dGFibGUgc3VwcG9ydCB0byBYTUxTdHJlYW1SZWFkZXIKLSAqIDxwLz4KLSAqIERlcml2ZWQgY2xhc3NlcyBtdXN0IHBhc3MgdGhlIGluaXRpYWwgcmVhZGVyIHRvIHRoZSBjb25zdHJ1Y3RvciBhbmQgaW5kaWNhdGUgaWYgaXQgaXMgcmVzZXR0YWJsZS4KLSAqIERlcml2ZWQgY2xhc3NlcyBtdXN0IGFsc28gcHJvdmlkZSBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbmV3UmVhZGVyKCkgbWV0aG9kIGlmIHJlc2V0dGFibGUuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBSZWFkZXIgaW1wbGVtZW50cyBYTUxTdHJlYW1SZWFkZXIgewotICAgIHByb3RlY3RlZCBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyOwotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiByZXNldHRhYmxlOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhSZWFkZXIuY2xhc3MpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNEZWJ1ZyA9IGxvZy5pc0RlYnVnRW5hYmxlZCgpOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHJlYWRlcgotICAgICAqIEBwYXJhbSByZXNldHRhYmxlCi0gICAgICovCi0gICAgUmVhZGVyKFhNTFN0cmVhbVJlYWRlciByZWFkZXIsIGJvb2xlYW4gcmVzZXR0YWJsZSkgewotICAgICAgICB0aGlzLnJlYWRlciA9IHJlYWRlcjsKLSAgICAgICAgdGhpcy5yZXNldHRhYmxlID0gcmVzZXR0YWJsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYSBuZXdSZWFkZXIgZnJvbSB0aGUgT2JqZWN0Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIFhNTFN0cmVhbVJlYWRlcgotICAgICAqLwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBYTUxTdHJlYW1SZWFkZXIgbmV3UmVhZGVyKCk7Ci0KLSAgICAvKioKLSAgICAgKiBpc1Jlc2V0dGFibGUKLSAgICAgKgotICAgICAqIEByZXR1cm4gdHJ1ZSBvciBmYWxzZQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzUmVzZXR0YWJsZSgpIHsKLSAgICAJZGVidWcoIkVudGVyaW5nIGlzUmVzZXR0YWJsZS4uLi4iKTsKLSAgICAJZGVidWcoInJlc2V0dGFibGUgPSAiK3Jlc2V0dGFibGUpOwotICAgICAgICByZXR1cm4gcmVzZXR0YWJsZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZXNldCgpIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAJZGVidWcoIkVudGVyaW5nIHJlc2V0Li4uLiIpOwotICAgICAgICBpZiAoIXJlc2V0dGFibGUpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgicmVzZXRSZWFkZXJFcnIiKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmVhZGVyID0gbmV3UmVhZGVyKCk7Ci0gICAgICAgIAotICAgICAgICBkZWJ1ZygiRXhpdGluZyByZXNldC4uLi4iKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgIAlkZWJ1ZygiRW50ZXJpbmcgY2xvc2UuLi4uIik7Ci0gICAgICAgIHJlYWRlci5jbG9zZSgpOwotICAgICAgICBkZWJ1ZygiRXhpdGluZyBjbG9zZS4uLi4iKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldEF0dHJpYnV0ZUNvdW50KCkgewotICAgIAlkZWJ1ZygiRW50ZXJpbmcgZ2V0QXR0cmlidXRlQ291bnQuLi4uIik7Ci0gICAgCWludCBhYyA9IHJlYWRlci5nZXRBdHRyaWJ1dGVDb3VudCgpOwotICAgIAlkZWJ1ZygicmVhZGVyLmdldEF0dHJpYnV0ZUNvdW50KCkgPSAiK2FjKTsKLSAgICAgICAgcmV0dXJuIGFjOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlTG9jYWxOYW1lKGludCBhcmcwKSB7Ci0gICAgCWRlYnVnKCJFbnRlcmluZyBnZXRBdHRyaWJ1dGVMb2NhbE5hbWUuLi4uIik7Ci0gICAgCVN0cmluZyBhbG4gPSByZWFkZXIuZ2V0QXR0cmlidXRlTG9jYWxOYW1lKGFyZzApOwotICAgIAlkZWJ1ZygicmVhZGVyLmdldEF0dHJpYnV0ZUxvY2FsTmFtZShhcmcwKSA9ICIrYWxuKTsKLSAgICAgICAgcmV0dXJuIGFsbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUU5hbWUgZ2V0QXR0cmlidXRlTmFtZShpbnQgYXJnMCkgewotICAgIAlkZWJ1ZygiRW50ZXJpbmcgZ2V0QXR0cmlidXRlTmFtZS4uLi4iKTsKLSAgICAJUU5hbWUgcSA9IHJlYWRlci5nZXRBdHRyaWJ1dGVOYW1lKGFyZzApOwotICAgIAlkZWJ1ZygicmVhZGVyLmdldEF0dHJpYnV0ZU5hbWUoYXJnMCkgPSAiK3EpOwotICAgICAgICByZXR1cm4gcTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZU5hbWVzcGFjZShpbnQgYXJnMCkgewotICAgIAlkZWJ1ZygiRW50ZXJpbmcgZ2V0QXR0cmlidXRlTmFtZXNwYWNlLi4uLiIpOwotICAgIAlTdHJpbmcgYW4gPSByZWFkZXIuZ2V0QXR0cmlidXRlTmFtZXNwYWNlKGFyZzApOwotICAgIAlkZWJ1ZygicmVhZGVyLmdldEF0dHJpYnV0ZU5hbWVzcGFjZShhcmcwKSA9ICIrYW4pOwotICAgICAgICByZXR1cm4gYW47Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVQcmVmaXgoaW50IGFyZzApIHsKLSAgICAJZGVidWcoIkVudGVyaW5nIGdldEF0dHJpYnV0ZVByZWZpeC4uLi4iKTsKLSAgICAJU3RyaW5nIGFwID0gcmVhZGVyLmdldEF0dHJpYnV0ZVByZWZpeChhcmcwKTsKLSAgICAJZGVidWcoInJlYWRlci5nZXRBdHRyaWJ1dGVQcmVmaXgoYXJnMCkgPSAiK2FwKTsKLSAgICAgICAgcmV0dXJuIGFwOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlVHlwZShpbnQgYXJnMCkgewotICAgIAlkZWJ1ZygiRW50ZXJpbmcgZ2V0QXR0cmlidXRlVHlwZS4uLi4iKTsKLSAgICAJU3RyaW5nIGF0ID0gcmVhZGVyLmdldEF0dHJpYnV0ZVR5cGUoYXJnMCk7Ci0gICAgCWRlYnVnKCJyZWFkZXIuZ2V0QXR0cmlidXRlVHlwZShhcmcwKSA9ICIrYXQpOwotICAgICAgICByZXR1cm4gYXQ7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVWYWx1ZShpbnQgYXJnMCkgewotICAgIAlkZWJ1ZygiRW50ZXJpbmcgZ2V0QXR0cmlidXRlVmFsdWUuLi4uIik7Ci0gICAgCVN0cmluZyBhdiA9IHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZShhcmcwKTsKLSAgICAJZGVidWcoInJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZShhcmcwKSA9ICIrYXYpOwotICAgICAgICByZXR1cm4gYXY7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVWYWx1ZShTdHJpbmcgYXJnMCwgU3RyaW5nIGFyZzEpIHsKLSAgICAJZGVidWcoIkVudGVyaW5nIGdldEF0dHJpYnV0ZVZhbHVlLi4uLiIpOwotICAgIAlTdHJpbmcgYXYgPSByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoYXJnMCwgYXJnMSk7Ci0gICAgCWRlYnVnKCJyZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoYXJnMCwgYXJnMSkgPSAiK2F2KTsKLSAgICAgICAgcmV0dXJuIGF2OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2hhcmFjdGVyRW5jb2RpbmdTY2hlbWUoKSB7Ci0gICAgCWRlYnVnKCJFbnRlcmluZyBnZXRDaGFyYWN0ZXJFbmNvZGluZ1NjaGVtZS4uLi4iKTsKLSAgICAJU3RyaW5nIGNlcyA9IHJlYWRlci5nZXRDaGFyYWN0ZXJFbmNvZGluZ1NjaGVtZSgpOwotICAgIAlkZWJ1ZygicmVhZGVyLmdldENoYXJhY3RlckVuY29kaW5nU2NoZW1lID0gIitjZXMpOwotICAgICAgICByZXR1cm4gY2VzOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudFRleHQoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAJZGVidWcoIkVudGVyaW5nIGdldEVsZW1lbnRUZXh0Li4uLiIpOwotICAgIAlTdHJpbmcgZXQgPSByZWFkZXIuZ2V0RWxlbWVudFRleHQoKTsKLSAgICAJZGVidWcoInJlYWRlci5nZXRFbGVtZW50VGV4dCA9ICIrZXQpOwotICAgICAgICByZXR1cm4gZXQ7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRFbmNvZGluZygpIHsKLSAgICAJZGVidWcoIkVudGVyaW5nIGdldEVuY29kaW5nLi4uLiIpOwotICAgIAlTdHJpbmcgZSA9IHJlYWRlci5nZXRFbmNvZGluZygpOwotICAgIAlkZWJ1ZygicmVhZGVyLmdldEVuY29kaW5nKCkgPSAiK2UpOwotICAgICAgICByZXR1cm4gZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldEV2ZW50VHlwZSgpIHsKLSAgICAJZGVidWcoIkVudGVyaW5nIGdldEV2ZW50VHlwZS4uLi4iKTsKLSAgICAJaW50IGV0ID0gcmVhZGVyLmdldEV2ZW50VHlwZSgpOwotICAgIAlkZWJ1ZygicmVhZGVyLmdldEV2ZW50VHlwZSgpID0gIitldCk7Ci0gICAgICAgIHJldHVybiBldDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldExvY2FsTmFtZSgpIHsKLSAgICAJZGVidWcoIkVudGVyaW5nIGdldExvY2F0aW9uLi4uLiIpOwotICAgIAlTdHJpbmcgbG4gPSByZWFkZXIuZ2V0TG9jYWxOYW1lKCk7Ci0gICAgCWRlYnVnKCJyZWFkZXIuZ2V0TG9jYWxOYW1lKCkgPSAiK2xuKTsKLSAgICAgICAgcmV0dXJuIGxuOwotICAgIH0KLQotICAgIHB1YmxpYyBMb2NhdGlvbiBnZXRMb2NhdGlvbigpIHsKLSAgICAJZGVidWcoIkVudGVyaW5nIGdldExvY2F0aW9uLi4uLiIpOwotICAgIAlMb2NhdGlvbiBsID0gcmVhZGVyLmdldExvY2F0aW9uKCk7Ci0gICAgCWRlYnVnKCJyZWFkZXIuZ2V0TG9jYXRpb24oKSA9ICIrbCk7Ci0gICAgICAgIHJldHVybiBsOwotICAgIH0KLQotICAgIHB1YmxpYyBRTmFtZSBnZXROYW1lKCkgewotICAgIAlkZWJ1ZygiRW50ZXJpbmcgZ2V0TmFtZS4uLi4iKTsKLSAgICAJUU5hbWUgcW4gPSByZWFkZXIuZ2V0TmFtZSgpOwotICAgIAlkZWJ1ZygicmVhZGVyLmdldE5hbWUoKSA9ICIrcW4pOwotICAgICAgICByZXR1cm4gcW47Ci0gICAgfQotCi0gICAgcHVibGljIE5hbWVzcGFjZUNvbnRleHQgZ2V0TmFtZXNwYWNlQ29udGV4dCgpIHsKLSAgICAJZGVidWcoIkVudGVyaW5nIGdldE5hbWVzcGFjZUNvbnRleHQuLi4uIik7Ci0gICAgCU5hbWVzcGFjZUNvbnRleHQgbnNDb250ZXh0ID0gcmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKTsKLSAgICAJZGVidWcoInJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkgPSAiK25zQ29udGV4dCk7Ci0gICAgICAgIHJldHVybiBuc0NvbnRleHQ7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXROYW1lc3BhY2VDb3VudCgpIHsKLSAgICAJZGVidWcoIkVudGVyaW5nIGdldE5hbWVzcGFjZUNvdW50Li4uLiIpOwotICAgIAlpbnQgbnNDb3VudCA9IHJlYWRlci5nZXROYW1lc3BhY2VDb3VudCgpOwotICAgIAlkZWJ1ZygicmVhZGVyLmdldE5hbWVzcGFjZUNvdW50KCkgPSAiK25zQ291bnQpOwotICAgICAgICByZXR1cm4gbnNDb3VudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVByZWZpeChpbnQgYXJnMCkgewotICAgIAlkZWJ1ZygiRW50ZXJpbmcgZ2V0TmFtZXNwYWNlUHJlZml4Li4uLiIpOwotICAgIAlTdHJpbmcgbnNQcmVmaXggPSByZWFkZXIuZ2V0TmFtZXNwYWNlUHJlZml4KGFyZzApOwotICAgIAlkZWJ1ZygicmVhZGVyLmdldE5hbWVzcGFjZVByZWZpeChhcmcwID0gIituc1ByZWZpeCk7Ci0gICAgICAgIHJldHVybiBuc1ByZWZpeDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVVSSSgpIHsKLSAgICAJZGVidWcoIkVudGVyaW5nIGdldE5hbWVzcGFjZVVSSS4uLi4iKTsKLSAgICAJU3RyaW5nIG5zVXJpID0gcmVhZGVyLmdldE5hbWVzcGFjZVVSSSgpOwotICAgIAlkZWJ1ZygicmVhZGVyLmdldE5hbWVzcGFjZVVSSSgpID0gIituc1VyaSk7Ci0gICAgICAgIHJldHVybiBuc1VyaTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVVSSShpbnQgYXJnMCkgewotICAgIAlkZWJ1ZygiRW50ZXJpbmcgZ2V0TmFtZXNwYWNlVVJJLi4uLiIpOwotICAgIAlTdHJpbmcgbnNVcmkgPSByZWFkZXIuZ2V0TmFtZXNwYWNlVVJJKGFyZzApOwotICAgIAlkZWJ1ZygicmVhZGVyLmdldE5hbWVzcGFjZVVSSShhcmcwKSA9ICIrbnNVcmkpOwotICAgICAgICByZXR1cm4gbnNVcmk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VVUkkoU3RyaW5nIGFyZzApIHsKLSAgICAJZGVidWcoIkVudGVyaW5nIGdldE5hbWVzcGFjZVVSSS4uLi4iKTsKLSAgICAJU3RyaW5nIG5zVXJpID0gcmVhZGVyLmdldE5hbWVzcGFjZVVSSShhcmcwKTsKLSAgICAJZGVidWcoInJlYWRlci5nZXROYW1lc3BhY2VVUkkoYXJnMCkgPSAiK25zVXJpKTsKLSAgICAgICAgcmV0dXJuIG5zVXJpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UElEYXRhKCkgewotICAgIAlkZWJ1ZygiRW50ZXJpbmcgZ2V0UElEYXRhLi4uLiIpOwotICAgIAlTdHJpbmcgcGlkID0gcmVhZGVyLmdldFBJRGF0YSgpOwotICAgIAlkZWJ1ZygicmVhZGVyLmdldFBJRGF0YSgpID0gIitwaWQpOwotICAgICAgICByZXR1cm4gcGlkOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UElUYXJnZXQoKSB7Ci0gICAgCWRlYnVnKCJFbnRlcmluZyBnZXRQSVRhcmdldC4uLi4iKTsKLSAgICAJU3RyaW5nIHBpdCA9IHJlYWRlci5nZXRQSVRhcmdldCgpOwotICAgIAlkZWJ1ZygicmVhZGVyLmdldFBJVGFyZ2V0KCkgPSAiK3BpdCk7Ci0gICAgICAgIHJldHVybiBwaXQ7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQcmVmaXgoKSB7Ci0gICAgCWRlYnVnKCJFbnRlcmluZyBnZXRQcmVmaXguLi4uIik7Ci0gICAgCVN0cmluZyBncGYgPSByZWFkZXIuZ2V0UHJlZml4KCk7Ci0gICAgCWRlYnVnKCJyZWFkZXIuZ2V0UHJlZml4KCkgPSAiK2dwZik7Ci0gICAgICAgIHJldHVybiBncGY7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgYXJnMCkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0gICAgCWRlYnVnKCJFbnRlcmluZyBnZXRQcm9wZXJ0eSBmb3IgLi4uIiArIGFyZzApOwotICAgIAlPYmplY3QgbyA9IHJlYWRlci5nZXRQcm9wZXJ0eShhcmcwKTsKLSAgICAJZGVidWcoInJlYWRlci5nZXRQcm9wZXJ0eShhcmcwKSA9ICIrbyk7Ci0gICAgICAgIHJldHVybiBvOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLSAgICAJZGVidWcoIkVudGVyaW5nIGdldFRleHQuLi4uIik7Ci0gICAgCVN0cmluZyBndCA9IHJlYWRlci5nZXRUZXh0KCk7Ci0gICAgCWRlYnVnKCJyZWFkZXIuZ2V0VGV4dCgpID0gIitndCk7Ci0gICAgICAgIHJldHVybiBndDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgY2hhcltdIGdldFRleHRDaGFyYWN0ZXJzKCkgewotICAgIAlkZWJ1ZygiRW50ZXJpbmcgZ2V0VGV4dENoYXJhY3RlcnMuLi4uIik7Ci0gICAgCWNoYXJbXSBndGMgPSByZWFkZXIuZ2V0VGV4dENoYXJhY3RlcnMoKTsKLSAgICAJZGVidWcoInJlYWRlci5nZXRUZXh0Q2hhcmFjdGVycygpID0gIitndGMudG9TdHJpbmcoKSk7Ci0gICAgICAgIHJldHVybiBndGM7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRUZXh0Q2hhcmFjdGVycyhpbnQgYXJnMCwgY2hhcltdIGFyZzEsIGludCBhcmcyLCBpbnQgYXJnMykgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgCWRlYnVnKCJFbnRlcmluZyBnZXRUZXh0Q2hhcmFjdGVycy4uLi4iKTsKLSAgICAJaW50IGd0YyA9IHJlYWRlci5nZXRUZXh0Q2hhcmFjdGVycyhhcmcwLCBhcmcxLCBhcmcyLCBhcmczKTsKLSAgICAJZGVidWcoInJlYWRlci5nZXRUZXh0Q2hhcmFjdGVycygpID0gIitndGMpOwotICAgICAgICByZXR1cm4gZ3RjOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0VGV4dExlbmd0aCgpIHsKLSAgICAJZGVidWcoIkVudGVyaW5nIGdldFRleHRMZW5ndGguLi4uIik7Ci0gICAgCWludCBndGwgPSByZWFkZXIuZ2V0VGV4dExlbmd0aCgpOwotICAgIAlkZWJ1ZygicmVhZGVyLmdldFRleHRMZW5ndGgoKSA9ICIrZ3RsKTsKLSAgICAgICAgcmV0dXJuIGd0bDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldFRleHRTdGFydCgpIHsKLSAgICAJZGVidWcoIkVudGVyaW5nIGdldFRleHRTdGFydC4uLi4iKTsKLSAgICAJaW50IGd0cyA9IHJlYWRlci5nZXRUZXh0U3RhcnQoKTsKLSAgICAJZGVidWcoInJlYWRlci5nZXRUZXh0U3RhcnQoKSA9ICIrZ3RzKTsKLSAgICAgICAgcmV0dXJuIHJlYWRlci5nZXRUZXh0U3RhcnQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFZlcnNpb24oKSB7Ci0gICAgCWRlYnVnKCJFbnRlcmluZyBnZXRWZXJzaW9uLi4uLiIpOwotICAgIAlTdHJpbmcgZ3YgPSByZWFkZXIuZ2V0VmVyc2lvbigpOwotICAgIAlkZWJ1ZygicmVhZGVyLmdldFZlcnNpb24oKSA9ICIrZ3YpOwotICAgICAgICByZXR1cm4gZ3Y7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaGFzTmFtZSgpIHsKLSAgICAJZGVidWcoIkVudGVyaW5nIGhhc05hbWUuLi4uIik7Ci0gICAgCWJvb2xlYW4gYiA9IHJlYWRlci5oYXNOYW1lKCk7Ci0gICAgCWRlYnVnKCJyZWFkZXIuaGFzTmFtZSgpID0gIitiKTsKLSAgICAgICAgcmV0dXJuIGI7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgIAlkZWJ1ZygiRW50ZXJpbmcgaGFzTmV4dC4uLi4iKTsKLSAgICAJYm9vbGVhbiBiID0gcmVhZGVyLmhhc05leHQoKTsKLSAgICAJZGVidWcoInJlYWRlci5oYXNOZXh0KCkgPSAiK2IpOwotICAgICAgICByZXR1cm4gYjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNUZXh0KCkgewotICAgIAlkZWJ1ZygiRW50ZXJpbmcgaGFzVGV4dC4uLi4iKTsKLSAgICAJYm9vbGVhbiBiID0gcmVhZGVyLmhhc1RleHQoKTsKLSAgICAJZGVidWcoInJlYWRlci5oYXNUZXh0KCkgPSAiK2IpOwotICAgICAgICByZXR1cm4gYjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0F0dHJpYnV0ZVNwZWNpZmllZChpbnQgYXJnMCkgewotICAgIAlkZWJ1ZygiRW50ZXJpbmcgaXNBdHRyaWJ1dGVTcGVjaWZpZWQuLi4uIik7Ci0gICAgCWJvb2xlYW4gYiA9IHJlYWRlci5pc0F0dHJpYnV0ZVNwZWNpZmllZChhcmcwKTsKLSAgICAJZGVidWcoIkVudGVyaW5nIHJlYWRlci5pc0F0dHJpYnV0ZVNwZWNpZmllZChhcmcwKSAiK2IpOwotICAgICAgICByZXR1cm4gYjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0NoYXJhY3RlcnMoKSB7Ci0gICAgCWRlYnVnKCJFbnRlcmluZyBpc0NoYXJhY3RlcnMuLi4uIik7Ci0gICAgCWJvb2xlYW4gYiA9IHJlYWRlci5pc0NoYXJhY3RlcnMoKTsKLSAgICAJZGVidWcoInJlYWRlci5pc0NoYXJhY3RlcnMoKSA9ICIrYik7Ci0gICAgICAgIHJldHVybiBiOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRW5kRWxlbWVudCgpIHsKLSAgICAJZGVidWcoIkVudGVyaW5nIGlzRW5kRWxlbWVudC4uLi4iKTsKLSAgICAJYm9vbGVhbiBiID0gcmVhZGVyLmlzRW5kRWxlbWVudCgpOwotICAgIAlkZWJ1ZygicmVhZGVyLmlzRW5kRWxlbWVudCgpID0gIitiKTsKLSAgICAgICAgcmV0dXJuIGI7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNTdGFuZGFsb25lKCkgewotICAgIAlkZWJ1ZygiRW50ZXJpbmcgaXNTdGFuZGFsb25lLi4uLiIpOwotICAgIAlib29sZWFuIGIgPSByZWFkZXIuaXNTdGFuZGFsb25lKCk7Ci0gICAgCWRlYnVnKCJyZWFkZXIuaXNTdGFuZGFsb25lKCkgPSAiK2IpOwotICAgICAgICByZXR1cm4gYjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1N0YXJ0RWxlbWVudCgpIHsKLSAgICAJZGVidWcoIkVudGVyaW5nIGlzU3RhcnRFbGVtZW50Li4uLiIpOwotICAgIAlib29sZWFuIGIgPSByZWFkZXIuaXNTdGFydEVsZW1lbnQoKTsKLSAgICAJZGVidWcoInJlYWRlci5pc1N0YXJ0RWxlbWVudCgpID0gIitiKTsKLSAgICAgICAgcmV0dXJuIGI7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNXaGl0ZVNwYWNlKCkgewotICAgIAlkZWJ1ZygiRW50ZXJpbmcgaXNXaGl0ZVNwYWNlLi4uLiIpOwotICAgIAlib29sZWFuIGIgPSByZWFkZXIuaXNXaGl0ZVNwYWNlKCk7Ci0gICAgCWRlYnVnKCJyZWFkZXIuaXNXaGl0ZVNwYWNlKCkgPSAiK2IpOwotICAgICAgICByZXR1cm4gYjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IG5leHQoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAJZGVidWcoIkVudGVyaW5nIG5leHQuLi4uIik7Ci0gICAgCWludCBueHQgPSByZWFkZXIubmV4dCgpOwotICAgIAlkZWJ1ZygicmVhZGVyLm5leHQoKSA9ICIrbnh0KTsKLSAgICAgICAgcmV0dXJuIG54dDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IG5leHRUYWcoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAJZGVidWcoIkVudGVyaW5nIG5leHRUYWcuLi4uIik7Ci0gICAgCWludCB0YWcgPSByZWFkZXIubmV4dFRhZygpOwotICAgIAlkZWJ1ZygicmVhZGVyLm5leHRUYWcoKSA9ICIrdGFnKTsKLSAgICAgICAgcmV0dXJuIHRhZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZXF1aXJlKGludCBhcmcwLCBTdHJpbmcgYXJnMSwgU3RyaW5nIGFyZzIpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgIAlkZWJ1ZygiRW50ZXJpbmcgcmVxdWlyZS4uLi4iKTsKLSAgICAJZGVidWcoInJlYWRlci5yZXF1aXJlIC0+IGFyZzAgPSAiK2FyZzArIiAsYXJnMSA9ICIrYXJnMSsiICxhcmcyID0gIithcmcyKTsKLSAgICAgICAgcmVhZGVyLnJlcXVpcmUoYXJnMCwgYXJnMSwgYXJnMik7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gc3RhbmRhbG9uZVNldCgpIHsKLSAgICAJZGVidWcoIkVudGVyaW5nIHN0YW5kYWxvbmVTZXQuLi4uIik7Ci0gICAgCWJvb2xlYW4gYiA9IHJlYWRlci5zdGFuZGFsb25lU2V0KCk7Ci0gICAgCWRlYnVnKCJyZWFkZXIuc3RhbmRhbG9uZVNldCgpID0gIitiKTsKLSAgICAgICAgcmV0dXJuIGI7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGRlYnVnKFN0cmluZyBzdHIpIHsKLSAgICAgICAgaWYgKGlzRGVidWcpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhzdHIpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL3V0aWwvUmVhZGVyMldyaXRlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS91dGlsL1JlYWRlcjJXcml0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTY2Y2IyYS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL3V0aWwvUmVhZGVyMldyaXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UudXRpbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01Eb2N1bWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTm9kZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuYnVpbGRlci5TdEFYT01CdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5TdEFYVXRpbHM7Ci0KLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLS8qKgotICogUmVhZGVyMldyaXRlciBUaGlzIGlzIGEgc2ltcGxlIGNvbnZlcnRlciB0aGF0IGlzIGNvbnN0cnVjdGVkIHdpdGggYW4gWE1MU3RyZWFtUmVhZGVyIGFuZCBhbGxvd3MKLSAqIHlvdSB0byB3cml0ZSB0aGUgY29udGVudHMgdG8gYW4gWE1MU3RyZWFtV3JpdGVyLgotICovCi1wdWJsaWMgY2xhc3MgUmVhZGVyMldyaXRlciB7Ci0KLSAgICBwcml2YXRlIFhNTFN0cmVhbVJlYWRlciByZWFkZXI7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3QgZnJvbSBhIFJlYWRlcgotICAgICAqCi0gICAgICogQHBhcmFtIHJlYWRlciAtLSB0aGUgaW5wdXQgdG8gdGhlIGNvbnZlcnRlcgotICAgICAqLwotICAgIHB1YmxpYyBSZWFkZXIyV3JpdGVyKFhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKLSAgICAgICAgdGhpcy5yZWFkZXIgPSByZWFkZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogb3V0cHV0VG8gdGhlIHdyaXRlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSB3cml0ZXIgLS0gdGhlIG91dHB1dCBvZiB0aGUgY29udmVydGVyCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb3V0cHV0VG8oWE1MU3RyZWFtV3JpdGVyIHdyaXRlcikgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFVzaW5nIE9NIHRvIGNvbnZlcnQgdGhlIHJlYWRlciB0byBhIHdyaXRlci4gIFRoaXMgc2VlbXMgdG8gYmUKLSAgICAgICAgLy8gdGhlIHNhZmVzdCB3YXkgdG8gbWFrZSB0aGUgY29udmVyc2lvbiwgYW5kIGl0IHByb21vdGVzIGNvZGUgcmUtdXNlLgotICAgICAgICBTdEFYT01CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RBWE9NQnVpbGRlcihyZWFkZXIpOwotICAgICAgICBPTURvY3VtZW50IG9tRG9jdW1lbnQgPSBidWlsZGVyLmdldERvY3VtZW50KCk7Ci0gICAgICAgIEl0ZXJhdG9yIGl0ID0gb21Eb2N1bWVudC5nZXRDaGlsZHJlbigpOwotICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBPTU5vZGUgb21Ob2RlID0gKE9NTm9kZSlpdC5uZXh0KCk7Ci0gICAgICAgICAgICAvLyBUT0RPIFVzaW5nIHNlcmlhbGl6ZSBhbmQgY29uc3VtZQotICAgICAgICAgICAgLy8gY2F1c2VkIGFuIGF4aW9tIGJ1Zy4uLmZhbGxpbmcgYmFjayB0byBzZXJpYWxpemUKLSAgICAgICAgICAgIC8vICh3aGljaCBpcyBsZXNzIHBlcmZvcm1hbnQgZHVlIHRvIG9tIGNhY2hpbmcpCi0gICAgICAgICAgICAvL29tTm9kZS5zZXJpYWxpemVBbmRDb25zdW1lKHdyaXRlcik7Ci0gICAgICAgICAgICBvbU5vZGUuc2VyaWFsaXplKHdyaXRlcik7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gQ2xvc2UgdGhlIHJlYWRlcgotICAgICAgICByZWFkZXIuY2xvc2UoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVdGlsaXR5IG1ldGhvZCB0byB3cml0ZSB0aGUgcmVhZGVyIGNvbnRlbnRzIHRvIGEgU3RyaW5nCi0gICAgICogQHJldHVybiBTdHJpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEFzU3RyaW5nKCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICAgICAgWE1MU3RyZWFtV3JpdGVyIHdyaXRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1Xcml0ZXIoc3cpOwotCi0gICAgICAgIC8vIFdyaXRlIHRoZSByZWFkZXIgdG8gdGhlIHdyaXRlcgotICAgICAgICBvdXRwdXRUbyh3cml0ZXIpOwotCi0gICAgICAgIC8vIEZsdXNoIHRoZSB3cml0ZXIgYW5kIGdldCB0aGUgU3RyaW5nCi0gICAgICAgIHdyaXRlci5mbHVzaCgpOwotICAgICAgICBzdy5mbHVzaCgpOwotICAgICAgICBTdHJpbmcgc3RyID0gc3cudG9TdHJpbmcoKTsKLSAgICAgICAgd3JpdGVyLmNsb3NlKCk7Ci0gICAgICAgIHJldHVybiBzdHI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS91dGlsL1Jlc2V0dGFibGVSZWFkZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvdXRpbC9SZXNldHRhYmxlUmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzN2M0MjMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS91dGlsL1Jlc2V0dGFibGVSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLnV0aWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuYnVpbGRlci5TdEFYT01CdWlsZGVyOwotCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci0KLS8qKgotICogUmVzZXR0YWJsZVJlYWRlciBBIHJlc2V0dGFibGUgWE1MU3RyZWFtUmVhZGVyLgotICoKLSAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51dGlsLlJlYWRlcgotICovCi1wdWJsaWMgY2xhc3MgUmVzZXR0YWJsZVJlYWRlciBleHRlbmRzIFJlYWRlciB7Ci0KLSAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZSByZXNldHRhYmxlIFhNTFN0cmVhbVJlYWRlcgotICAgICAqCi0gICAgICogQHBhcmFtIHJlYWRlcgotICAgICAqIEBwYXJhbSByZXNldHRhYmxlCi0gICAgICovCi0gICAgcHVibGljIFJlc2V0dGFibGVSZWFkZXIoWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgewotICAgICAgICBzdXBlcihyZWFkZXIsIHRydWUpOwotICAgICAgICBTdEFYT01CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RBWE9NQnVpbGRlcihyZWFkZXIpOwotICAgICAgICBvbUVsZW1lbnQgPSBidWlsZGVyLmdldERvY3VtZW50RWxlbWVudCgpOwotICAgICAgICByZXNldCgpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UudXRpbC5SZWFkZXIjbmV3UmVhZGVyKCkKLSAgICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFhNTFN0cmVhbVJlYWRlciBuZXdSZWFkZXIoKSB7Ci0gICAgICAgIHJldHVybiBvbUVsZW1lbnQuZ2V0WE1MU3RyZWFtUmVhZGVyKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL3V0aWwvU0FBSkNvbnZlcnRlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS91dGlsL1NBQUpDb252ZXJ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjJmNmE2Mi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL3V0aWwvU0FBSkNvbnZlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLnV0aWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLmF0dGFjaG1lbnRzLkF0dGFjaG1lbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotCi1pbXBvcnQgamF2YXgueG1sLnNvYXAuTWVzc2FnZUZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEVudmVsb3BlOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247Ci0KLS8qKiBTQUFKQ29udmVydGVyIFByb3ZpZGVzIENvbnZlcnNpb24gYmV0d2VlbiBTQUFKIGFuZCBPTSBDb25zdHJ1Y3RlZCB2aWEgdGhlIFNBQUpDb252ZXJ0ZXJGYWN0b3J5ICovCi1wdWJsaWMgaW50ZXJmYWNlIFNBQUpDb252ZXJ0ZXIgewotICAgIC8qKgotICAgICAqIENvbnZlcnQgT00gU09BUEVudmxlb3BlIHRvIFNBQUogU09BUEVudmVsb3BlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb21FbGVtZW50Ci0gICAgICogQHJldHVybiBTT0FQRW52ZWxvcGUKLSAgICAgKiBAdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgU09BUEVudmVsb3BlIHRvU0FBSihvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlIG9tRWxlbWVudCkKLSAgICAgICAgICAgIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogQ29udmVydCBTQUFKIFNPQVBFbnZlbG9wZSB0byBPTSBTT0FQRW52ZWxvcGUKLSAgICAgKgotICAgICAqIEBwYXJhbSBzYWFqRW52ZWxvcGUKLSAgICAgKiBAcmV0dXJuIE9NIEVudmVsb3BlCi0gICAgICogQHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGUgdG9PTShTT0FQRW52ZWxvcGUgc2FhakVudmVsb3BlKQotICAgICAgICAgICAgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb247Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ29udmVydCBTQUFKIFNPQVBFbnZlbG9wZSB0byBPTSBTT0FQRW52ZWxvcGUKLSAgICAgKgotICAgICAqIEBwYXJhbSBzYWFqRW52ZWxvcGUKLSAgICAgKiBAcGFyYW0gQXR0YWNobWVudHMKLSAgICAgKiBAcmV0dXJuIE9NIEVudmVsb3BlCi0gICAgICogQHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGUgdG9PTShTT0FQRW52ZWxvcGUgc2FhakVudmVsb3BlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dGFjaG1lbnRzIGF0dGFjaG1lbnRzKQotICAgICAgICAgICAgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0IFNPQVBFbGVtZW50IGludG8gYW4gT01FbGVtZW50Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gc29hcEVsZW1lbnQKLSAgICAgKiBAcmV0dXJuIE9NRWxlbWVudAotICAgICAqIEB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBPTUVsZW1lbnQgdG9PTShTT0FQRWxlbWVudCBzb2FwRWxlbWVudCkKLSAgICAgICAgICAgIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogQ29udmVydCBvbUVsZW1lbnQgaW50byBhIFNPQVBFbGVtZW50IGFuZCBhZGQgaXQgdG8gdGhlIHBhcmVudCBTT0FQRWxlbWVudC4gVGhpcyBtZXRob2QgcmVxdWlyZXMKLSAgICAgKiB0aGF0IHRoZSBwYXJlbnQgZWxlbWVudCBoYXZlIGFuIGFuY2VzdG9yIHRoYXQgaXMgYSBTT0FQRW52ZWxvcGUuIElmIHRoaXMgaXMgbm90IHRoZSBjYXNlIHVzZSB0aGUKLSAgICAgKiB0b1NBQUooT01FbGVtZW50LCBTT0FQRWxlbWVudCwgU09BUEZhY3RvcnkpIG1ldGhvZAotICAgICAqCi0gICAgICogQHBhcmFtIG9tRWxlbWVudAotICAgICAqIEBwYXJhbSBwYXJlbnQgICAgU09BUEVsZW1lbnQKLSAgICAgKiBAcmV0dXJuIFNPQVBFbGVtZW50IHRoYXQgd2FzIGFkZGVkIHRvIHRoZSBwYXJlbnQuCi0gICAgICogQHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uCi0gICAgICogQHNlZSB0b1NBQUooT01FbGVtZW50LCBTT0FQRWxlbWVudCwgU09BUEZhY3RvcnkpCi0gICAgICovCi0gICAgcHVibGljIFNPQVBFbGVtZW50IHRvU0FBSihPTUVsZW1lbnQgb21FbGVtZW50LCBTT0FQRWxlbWVudCBwYXJlbnQpCi0gICAgICAgICAgICB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIENvbnZlcnQgb21FbGVtZW50IGludG8gYSBTT0FQRWxlbWVudCBhbmQgYWRkIGl0IHRvIHRoZSBwYXJlbnQgU09BUEVsZW1lbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb21FbGVtZW50Ci0gICAgICogQHBhcmFtIHBhcmVudCAgICBTT0FQRWxlbWVudAotICAgICAqIEBwYXJhbSBzZiAgICAgICAgU09BUEZhY3RvcnkgdGhhdCBpcyB1c2VkIHRvIGNyZWF0ZSBOYW1lIG9iamVjdHMKLSAgICAgKiBAcmV0dXJuIFNPQVBFbGVtZW50IHRoYXQgd2FzIGFkZGVkIHRvIHRoZSBwYXJlbnQuCi0gICAgICogQHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uICogQHNlZSB0b1NBQUooT01FbGVtZW50LCBTT0FQRWxlbWVudCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU09BUEVsZW1lbnQgdG9TQUFKKE9NRWxlbWVudCBvbUVsZW1lbnQsIFNPQVBFbGVtZW50IHBhcmVudCwgU09BUEZhY3Rvcnkgc2YpCi0gICAgICAgICAgICB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBNZXNzYWdlRmFjdG9yeSB0aGF0IGNhbiBzdXBwb3J0IHRoZSBTT0FQIHZlcnNpb24gaWRlbnRpZmllZAotICAgICAqIGJ5IHRoZSBzcGVjaWZpZWQgZW52ZWxvcGUgbmFtZXNwYWNlLgotICAgICAqIEBwYXJhbSBuYW1lc3BhY2UKLSAgICAgKiBAcmV0dXJuCi0gICAgICogQHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIGlmIHRoZSBuYW1lc3BhY2UgaXMgU09BUCAxLjIgYW5kIHRoZSBTQUFKIGRvZXMgbm90IHN1cHBvcnQKLSAgICAgKiBTT0FQIDEuMiBvciB0aGUgbmFtZXNwYWNlIGlzIHVua25vd24uCi0gICAgICovCi0gICAgcHVibGljIE1lc3NhZ2VGYWN0b3J5IGNyZWF0ZU1lc3NhZ2VGYWN0b3J5KFN0cmluZyBuYW1lc3BhY2UpCi0gICAgICAgICAgICB0aHJvd3MgU09BUEV4Y2VwdGlvbiwgV2ViU2VydmljZUV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvdXRpbC9TT0FQRWxlbWVudFJlYWRlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS91dGlsL1NPQVBFbGVtZW50UmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5NzU2NGEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS91dGlsL1NPQVBFbGVtZW50UmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS51dGlsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLnV0aWwuaW1wbC5YTUxTdHJlYW1SZWFkZXJGcm9tRE9NOwotCi1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci0KLS8qKiBTT0FQRWxlbWVudFJlYWRlciBDcmVhdGVzIGFuIFhNTFN0cmVhbVJlYWRlciBiYWNrZWQgYnkgYSBTT0FQRWxlbWVudCB0cmVlLiAqLwotcHVibGljIGNsYXNzIFNPQVBFbGVtZW50UmVhZGVyIGV4dGVuZHMgUmVhZGVyIHsKLQotICAgIFNPQVBFbGVtZW50IGVsZW1lbnQ7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gcmVhZGVyCi0gICAgICogQHBhcmFtIHJlc2V0dGFibGUKLSAgICAgKi8KLSAgICBwdWJsaWMgU09BUEVsZW1lbnRSZWFkZXIoU09BUEVsZW1lbnQgZWxlbWVudCkgewotICAgICAgICBzdXBlcihfbmV3UmVhZGVyKGVsZW1lbnQpLCB0cnVlKTsKLQotICAgICAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UudXRpbC5SZWFkZXIjbmV3UmVhZGVyKCkKLSAgICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFhNTFN0cmVhbVJlYWRlciBuZXdSZWFkZXIoKSB7Ci0gICAgICAgIHJldHVybiBfbmV3UmVhZGVyKGVsZW1lbnQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFV0aWxpdHkgbWV0aG9kIHRvIGdldCB0aGUgc3RyZWFtIHJlYWRlcgotICAgICAqCi0gICAgICogQHBhcmFtIGVsZW1lbnQKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgWE1MU3RyZWFtUmVhZGVyIF9uZXdSZWFkZXIoU09BUEVsZW1lbnQgZWxlbWVudCkgewotICAgICAgICAvLyBDb25zdHJ1Y3QgYSByZWFkZXIgZnJvbSBhbiBlbGVtZW50Ci0gICAgICAgIHJldHVybiBuZXcgWE1MU3RyZWFtUmVhZGVyRnJvbURPTShlbGVtZW50KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL3V0aWwvU3RhY2thYmxlUmVhZGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL3V0aWwvU3RhY2thYmxlUmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwNzUwMjMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS91dGlsL1N0YWNrYWJsZVJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLnV0aWw7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLk5hbWVzcGFjZUNvbnRleHQ7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLkxvY2F0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLQotLyoqCi0gKiBTdGFja2FibGVSZWFkZXIgQSBTdGFja2FibGVTdHJlYW1SZWFkZXIgcHJvdmlkZXMgYW4gYWRkaXRpb25hbCBtZXRob2QgcHVzaChYTUxTdHJlYW1SZWFkZXIpCi0gKiA8cC8+Ci0gKiBZb3UgY2FuIGNhbGwgcHVzaCguLi4pIHRvIGFkZCBhIG5ldyBYTUxTdHJlYW1SZWFkZXIuICBUaGUgbmV4dCBldmVudCB3aWxsIHVzZSB0aGUgcHVzaGVkIHN0cmVhbQotICogcmVhZGVyLiBBZnRlciB0aGUgWE1MU3RyZWFtUmVhZGVyIGlzIGNvbnN1bWVkLCBpdCBpcyBhdXRvbWF0aWNhbGx5IHBvcHBlZCBvZmYgb2YgdGhlIHN0YWNrLgotICogPHAvPgotICogTm90ZSB0aGUgaW5mb3JtYXRpb24gcmV0dXJuZWQgYnkgdGhlIFN0YWNrYWJsZVJlYWRlciBpcyBvbmx5IGFwcGxpY2FibGUgZm9yIHRoZSB0b3Btb3N0Ci0gKiBYTUxTdHJlYW1SZWFkZXIuICBGb3IgZXhhbXBsZSB0aGUgTmFtZXNwYWNlQ29udGV4dCB0aGF0IGlzIHJldHVybmVkIGlzIG5vdCBhIGNvbWJpbmF0aW9uIG9mIGFsbAotICogdGhlIG5hbWVzcGFjZSBjb250ZXh0cyBvbiB0aGUgc3RhY2suCi0gKi8KLXB1YmxpYyBjbGFzcyBTdGFja2FibGVSZWFkZXIgaW1wbGVtZW50cyBYTUxTdHJlYW1SZWFkZXIgewotCi0gICAgU3RhY2s8WE1MU3RyZWFtUmVhZGVyPiBzdGFjayA9IG5ldyBTdGFjazxYTUxTdHJlYW1SZWFkZXI+KCk7Ci0gICAgWE1MU3RyZWFtUmVhZGVyIGN1cnJlbnQgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgc3RhY2thYmxlIHJlYWRlciB3aXRoIHRoZSBpbml0aWFsIHJlYWRlcgotICAgICAqCi0gICAgICogQHBhcmFtIGZpcnN0Ci0gICAgICovCi0gICAgcHVibGljIFN0YWNrYWJsZVJlYWRlcihYTUxTdHJlYW1SZWFkZXIgZmlyc3QpIHsKLSAgICAgICAgY3VycmVudCA9IGZpcnN0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFB1c2ggYSBuZXcgU3RyZWFtUmVhZGVyCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3RyZWFtUmVhZGVyCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcHVzaChYTUxTdHJlYW1SZWFkZXIgc3RyZWFtUmVhZGVyKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gUHVzaCB0aGUgY3VycmVudCByZWFkZXIgaWYgaXQgaXMgbm90IGNvbnN1bWVkCi0gICAgICAgIGlmIChjdXJyZW50ICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICBjdXJyZW50Lmhhc05leHQoKSkgewotICAgICAgICAgICAgc3RhY2sucHVzaChjdXJyZW50KTsKLSAgICAgICAgfQotICAgICAgICBjdXJyZW50ID0gc3RyZWFtUmVhZGVyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIGN1cnJlbnQuY2xvc2UoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldEF0dHJpYnV0ZUNvdW50KCkgewotICAgICAgICByZXR1cm4gY3VycmVudC5nZXRBdHRyaWJ1dGVDb3VudCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlTG9jYWxOYW1lKGludCBhcmcwKSB7Ci0gICAgICAgIHJldHVybiBjdXJyZW50LmdldEF0dHJpYnV0ZUxvY2FsTmFtZShhcmcwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUU5hbWUgZ2V0QXR0cmlidXRlTmFtZShpbnQgYXJnMCkgewotICAgICAgICByZXR1cm4gY3VycmVudC5nZXRBdHRyaWJ1dGVOYW1lKGFyZzApOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlTmFtZXNwYWNlKGludCBhcmcwKSB7Ci0gICAgICAgIHJldHVybiBjdXJyZW50LmdldEF0dHJpYnV0ZU5hbWVzcGFjZShhcmcwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZVByZWZpeChpbnQgYXJnMCkgewotICAgICAgICByZXR1cm4gY3VycmVudC5nZXRBdHRyaWJ1dGVQcmVmaXgoYXJnMCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVUeXBlKGludCBhcmcwKSB7Ci0gICAgICAgIHJldHVybiBjdXJyZW50LmdldEF0dHJpYnV0ZVR5cGUoYXJnMCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVWYWx1ZShpbnQgYXJnMCkgewotICAgICAgICByZXR1cm4gY3VycmVudC5nZXRBdHRyaWJ1dGVWYWx1ZShhcmcwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZVZhbHVlKFN0cmluZyBhcmcwLCBTdHJpbmcgYXJnMSkgewotICAgICAgICByZXR1cm4gY3VycmVudC5nZXRBdHRyaWJ1dGVWYWx1ZShhcmcwLCBhcmcxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENoYXJhY3RlckVuY29kaW5nU2NoZW1lKCkgewotICAgICAgICByZXR1cm4gY3VycmVudC5nZXRDaGFyYWN0ZXJFbmNvZGluZ1NjaGVtZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudFRleHQoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGN1cnJlbnQuZ2V0RWxlbWVudFRleHQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEVuY29kaW5nKCkgewotICAgICAgICByZXR1cm4gY3VycmVudC5nZXRFbmNvZGluZygpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0RXZlbnRUeXBlKCkgewotICAgICAgICByZXR1cm4gY3VycmVudC5nZXRFdmVudFR5cGUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldExvY2FsTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGN1cnJlbnQuZ2V0TG9jYWxOYW1lKCk7Ci0gICAgfQotCi0gICAgcHVibGljIExvY2F0aW9uIGdldExvY2F0aW9uKCkgewotICAgICAgICByZXR1cm4gY3VycmVudC5nZXRMb2NhdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBRTmFtZSBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gY3VycmVudC5nZXROYW1lKCk7Ci0gICAgfQotCi0gICAgcHVibGljIE5hbWVzcGFjZUNvbnRleHQgZ2V0TmFtZXNwYWNlQ29udGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIGN1cnJlbnQuZ2V0TmFtZXNwYWNlQ29udGV4dCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0TmFtZXNwYWNlQ291bnQoKSB7Ci0gICAgICAgIHJldHVybiBjdXJyZW50LmdldE5hbWVzcGFjZUNvdW50KCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VQcmVmaXgoaW50IGFyZzApIHsKLSAgICAgICAgcmV0dXJuIGN1cnJlbnQuZ2V0TmFtZXNwYWNlUHJlZml4KGFyZzApOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKCkgewotICAgICAgICByZXR1cm4gY3VycmVudC5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVVSSShpbnQgYXJnMCkgewotICAgICAgICByZXR1cm4gY3VycmVudC5nZXROYW1lc3BhY2VVUkkoYXJnMCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VVUkkoU3RyaW5nIGFyZzApIHsKLSAgICAgICAgcmV0dXJuIGN1cnJlbnQuZ2V0TmFtZXNwYWNlVVJJKGFyZzApOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UElEYXRhKCkgewotICAgICAgICByZXR1cm4gY3VycmVudC5nZXRQSURhdGEoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBJVGFyZ2V0KCkgewotICAgICAgICByZXR1cm4gY3VycmVudC5nZXRQSVRhcmdldCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KCkgewotICAgICAgICByZXR1cm4gY3VycmVudC5nZXRQcmVmaXgoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBhcmcwKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGN1cnJlbnQuZ2V0UHJvcGVydHkoYXJnMCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotICAgICAgICByZXR1cm4gY3VycmVudC5nZXRUZXh0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIGNoYXJbXSBnZXRUZXh0Q2hhcmFjdGVycygpIHsKLSAgICAgICAgcmV0dXJuIGN1cnJlbnQuZ2V0VGV4dENoYXJhY3RlcnMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldFRleHRDaGFyYWN0ZXJzKGludCBhcmcwLCBjaGFyW10gYXJnMSwgaW50IGFyZzIsIGludCBhcmczKQotICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBjdXJyZW50LmdldFRleHRDaGFyYWN0ZXJzKGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0VGV4dExlbmd0aCgpIHsKLSAgICAgICAgcmV0dXJuIGN1cnJlbnQuZ2V0VGV4dExlbmd0aCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0VGV4dFN0YXJ0KCkgewotICAgICAgICByZXR1cm4gY3VycmVudC5nZXRUZXh0U3RhcnQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFZlcnNpb24oKSB7Ci0gICAgICAgIHJldHVybiBjdXJyZW50LmdldFZlcnNpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNOYW1lKCkgewotICAgICAgICByZXR1cm4gY3VycmVudC5oYXNOYW1lKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAvLyBUaGlzIGNvZGUgYXNzdW1lcyB0aGF0IHRoZSBzdGFjayBvbmx5IGNvbnRhaW5zIHJlYWRlcnMgdGhhdCBhcmUgbm90IGNvbnN1bWVkCi0gICAgICAgIGlmICghY3VycmVudC5oYXNOZXh0KCkgJiYKLSAgICAgICAgICAgICAgICAhc3RhY2suaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhY2sucGVlaygpLmhhc05leHQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY3VycmVudC5oYXNOZXh0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaGFzVGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIGN1cnJlbnQuaGFzVGV4dCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQXR0cmlidXRlU3BlY2lmaWVkKGludCBhcmcwKSB7Ci0gICAgICAgIHJldHVybiBjdXJyZW50LmlzQXR0cmlidXRlU3BlY2lmaWVkKGFyZzApOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQ2hhcmFjdGVycygpIHsKLSAgICAgICAgcmV0dXJuIGN1cnJlbnQuaXNDaGFyYWN0ZXJzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbmRFbGVtZW50KCkgewotICAgICAgICByZXR1cm4gY3VycmVudC5pc0VuZEVsZW1lbnQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1N0YW5kYWxvbmUoKSB7Ci0gICAgICAgIHJldHVybiBjdXJyZW50LmlzU3RhbmRhbG9uZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzU3RhcnRFbGVtZW50KCkgewotICAgICAgICByZXR1cm4gY3VycmVudC5pc1N0YXJ0RWxlbWVudCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzV2hpdGVTcGFjZSgpIHsKLSAgICAgICAgcmV0dXJuIGN1cnJlbnQuaXNXaGl0ZVNwYWNlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBuZXh0KCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIE9ubHkgbmV4dCBpcyBhbGxvd2VkIHRvIHBvcCB0aGUgc3RhY2sKLSAgICAgICAgaWYgKCFjdXJyZW50Lmhhc05leHQoKSAmJgotICAgICAgICAgICAgICAgICFzdGFjay5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGN1cnJlbnQgPSBzdGFjay5wb3AoKTsKLSAgICAgICAgfQotICAgICAgICAvLyBUaGUgYXNzdW1wdGlvbiBpcyB0aGF0IHRoZSBldmVudCBvbiB0aGUgc3RyZWFtIHJlYWRlciB3YXMgcHJvY2Vzc2VkCi0gICAgICAgIC8vIHByaW9yIHRvIHB1c2hpbmcgYSBuZXcgeG1sc3RyZWFtcmVhZGVyLiAgdGh1cyB3ZSBwcm9jZWVkIHRvIHRoZSBuZXh0Ci0gICAgICAgIC8vIGV2ZW50IGluIGFsbCBjYXNlcwotICAgICAgICBpbnQgdGFnID0gY3VycmVudC5uZXh0KCk7Ci0KLSAgICAgICAgLy8gU2tpcCBzdGFydCBkb2N1bWVudCBhbmQgZW5kIGRvY3VtZW50IGV2ZW50cyBmb3IKLSAgICAgICAgLy8gc3RhY2tlZCBzdHJlYW0gcmVhZGVycwotICAgICAgICBpZiAoKHRhZyA9PSB0aGlzLlNUQVJUX0RPQ1VNRU5UIHx8Ci0gICAgICAgICAgICAgICAgdGFnID09IHRoaXMuRU5EX0RPQ1VNRU5UKSAmJgotICAgICAgICAgICAgICAgICFzdGFjay5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIHRhZyA9IG5leHQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0YWc7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBuZXh0VGFnKCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghY3VycmVudC5oYXNOZXh0KCkgJiYKLSAgICAgICAgICAgICAgICAhc3RhY2suaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhY2sucGVlaygpLm5leHRUYWcoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY3VycmVudC5uZXh0VGFnKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVxdWlyZShpbnQgYXJnMCwgU3RyaW5nIGFyZzEsIFN0cmluZyBhcmcyKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgY3VycmVudC5yZXF1aXJlKGFyZzAsIGFyZzEsIGFyZzIpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHN0YW5kYWxvbmVTZXQoKSB7Ci0gICAgICAgIHJldHVybiBjdXJyZW50LnN0YW5kYWxvbmVTZXQoKTsKLSAgICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS91dGlsL1hNTEZhdWx0VXRpbHMuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvdXRpbC9YTUxGYXVsdFV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3ZDQxODAuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS91dGlsL1hNTEZhdWx0VXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS51dGlsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5PTVNvdXJjZWRFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUDExQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQMTJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBCb2R5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYXVsdENvZGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYXVsdERldGFpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhdWx0Tm9kZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhdWx0UmVhc29uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmF1bHRSb2xlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmF1bHRTdWJDb2RlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmF1bHRUZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmF1bHRWYWx1ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuaW1wbC5idWlsZGVyLlN0QVhTT0FQTW9kZWxCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuRXhjZXB0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuQmxvY2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLlByb3RvY29sOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5YTUxGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuWE1MRmF1bHRDb2RlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5YTUxGYXVsdFJlYXNvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZmFjdG9yeS5NZXNzYWdlRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZmFjdG9yeS5PTUJsb2NrRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZmFjdG9yeS5TQUFKQ29udmVydGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnJlZ2lzdHJ5LkZhY3RvcnlSZWdpc3RyeTsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuRGV0YWlsOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLkRldGFpbEVudHJ5OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBDb25zdGFudHM7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotCi0vKioKLSAqIENvbGxlY3Rpb24gb2YgdXRpbGl0aWVzIHVzZWQgYnkgdGhlIE1lc3NhZ2UgaW1wbGVtZW50YXRpb24gdG8gcHJvY2VzcyBYTUxGYXVsdHMuCi0gKgotICogQHNlZSBYTUxGYXVsdAotICovCi1wdWJsaWMgY2xhc3MgWE1MRmF1bHRVdGlscyB7Ci0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBlbnZlbG9wZSBqYXZheC54bWwuc29hcC5TT0FQRW52ZWxvcGUKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIFNPQVBFbnZlbG9wZSBjb250YWlucyBhIFNPQVBGYXVsdAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0ZhdWx0KGphdmF4LnhtbC5zb2FwLlNPQVBFbnZlbG9wZSBlbnZlbG9wZSkgdGhyb3dzIFNPQVBFeGNlcHRpb24gewotICAgICAgICBqYXZheC54bWwuc29hcC5TT0FQQm9keSBib2R5ID0gZW52ZWxvcGUuZ2V0Qm9keSgpOwotICAgICAgICBpZiAoYm9keSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gKGJvZHkuZ2V0RmF1bHQoKSAhPSBudWxsKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGVudmVsb3BlIG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGUKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIFNPQVBFbnZlbG9wZSBjb250YWlucyBhIFNPQVBGYXVsdAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0ZhdWx0KFNPQVBFbnZlbG9wZSBlbnZlbG9wZSkgewotICAgICAgICByZXR1cm4gZW52ZWxvcGUuaGFzRmF1bHQoKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGJsb2NrIHJlcHJlc2VudGluZyBhIG1lc3NhZ2UgcGF5bG9hZAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbG9jYWxuYW1lICYgbmFtZXNwYWNlIHJlcHJlc2VudCBhIFNPQVAgMS4xIG9yIFNPQVAgMS4yIGZhdWx0LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWluc0ZhdWx0KEJsb2NrIGIpIHsKLSAgICAgICAgaWYgKGIgIT0gbnVsbCkgewotICAgICAgICAgICAgUU5hbWUgcW4gPSBiLmdldFFOYW1lKCk7Ci0gICAgICAgICAgICBpZiAocW4gIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgIHFuLmdldExvY2FsUGFydCgpLmVxdWFscyhvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUENvbnN0YW50cy5TT0FQRkFVTFRfTE9DQUxfTkFNRSkKLSAgICAgICAgICAgICAgICAmJiAocW4uZ2V0TmFtZXNwYWNlVVJJKCkuZXF1YWxzKFNPQVAxMUNvbnN0YW50cy5TT0FQX0VOVkVMT1BFX05BTUVTUEFDRV9VUkkpCi0gICAgICAgICAgICAgICAgICAgIHx8IHFuLmdldE5hbWVzcGFjZVVSSSgpLmVxdWFscyhTT0FQMTJDb25zdGFudHMuU09BUF9FTlZFTE9QRV9OQU1FU1BBQ0VfVVJJKSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSAgICAgICAgCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBYTUxGYXVsdCBvYmplY3QgZnJvbSBhIFNPQVBGYXVsdCBhbmQgZGV0YWlsIEJsb2NrcwotICAgICAqCi0gICAgICogQHBhcmFtIHNvYXBGYXVsdAotICAgICAqIEBwYXJhbSBkZXRhaWxCbG9ja3MKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBYTUxGYXVsdCBjcmVhdGVYTUxGYXVsdChTT0FQRmF1bHQgc29hcEZhdWx0LCBCbG9ja1tdIGRldGFpbEJsb2NrcykKLSAgICAgICAgICAgIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLQotICAgICAgICAvLyBIZXJlIGlzIGEgc2FtcGxlIGNvbXByZWhlbnNpdmUgU09BUCAxLjIgZmF1bHQgd2hpY2ggd2lsbCBoZWxwIHlvdSAKLSAgICAgICAgLy8gdW5kZXJzdGFuZCB0aGUgc3RydWN0dXJlLgotICAgICAgICAvLyA8ZW52OkVudmVsb3BlIHhtbG5zOmVudj0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIgotICAgICAgICAvLyAgICAgICAgICAgICAgIHhtbG5zOm09Imh0dHA6Ly93d3cuZXhhbXBsZS5vcmcvdGltZW91dHMiCi0gICAgICAgIC8vICAgICAgICAgICAgICAgeG1sbnM6eG1sPSJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiPgotICAgICAgICAvLyAgIDxlbnY6Qm9keT4KLSAgICAgICAgLy8gICAgICA8ZW52OkZhdWx0PgotICAgICAgICAvLyAgICAgICAgPGVudjpDb2RlPgotICAgICAgICAvLyAgICAgICAgICA8ZW52OlZhbHVlPmVudjpTZW5kZXI8L2VudjpWYWx1ZT4KLSAgICAgICAgLy8gICAgICAgICAgPGVudjpTdWJjb2RlPgotICAgICAgICAvLyAgICAgICAgICAgIDxlbnY6VmFsdWU+bTpNZXNzYWdlVGltZW91dDwvZW52OlZhbHVlPgotICAgICAgICAvLyAgICAgICAgICA8L2VudjpTdWJjb2RlPgotICAgICAgICAvLyAgICAgICAgPC9lbnY6Q29kZT4KLSAgICAgICAgLy8gICAgICAgIDxlbnY6UmVhc29uPgotICAgICAgICAvLyAgICAgICAgICA8ZW52OlRleHQgeG1sOmxhbmc9ImVuIj5TZW5kZXIgVGltZW91dDwvZW52OlRleHQ+Ci0gICAgICAgIC8vICAgICAgICAgIDxlbnY6VGV4dCB4bWw6bGFuZz0iZGUiPlNlbmRlciBUaW1lb3V0PC9lbnY6VGV4dD4KLSAgICAgICAgLy8gICAgICAgIDwvZW52OlJlYXNvbj4KLSAgICAgICAgLy8gICAgICAgIDxlbnY6Tm9kZT5odHRwOi8vbXkuZXhhbXBsZS5vcmcvTm9kZTwvZW52Ok5vZGU+Ci0gICAgICAgIC8vICAgICAgICA8ZW52OlJvbGU+aHR0cDovL215LmV4YW1wbGUub3JnL1JvbGU8L2VudjpSb2xlPgotICAgICAgICAvLyAgICAgICAgPGVudjpEZXRhaWw+Ci0gICAgICAgIC8vICAgICAgICAgIDxtOk1heFRpbWU+UDVNPC9tOk1heFRpbWU+Ci0gICAgICAgIC8vICAgICAgICA8L2VudjpEZXRhaWw+ICAgIAotICAgICAgICAvLyAgICAgIDwvZW52OkZhdWx0PgotICAgICAgICAvLyAgIDwvZW52OkJvZHk+Ci0gICAgICAgIC8vIDwvZW52OkVudmVsb3BlPgotCi0gICAgICAgIC8vIEdldCB0aGUgY29kZQotICAgICAgICAvLyBUT0RPIHdoYXQgaWYgdGhpcyBmYWlscyA/ICBMb2cgYSBtZXNzYWdlIGFuZCB0cmVhdCBsaWtlIGEgUkVDRUlWRVIgZmF1bHQgPwotCi0gICAgICAgIC8vZmlndXJlb3V0IHRoZSBzb2FwIHZlcnNpb24KLSAgICAgICAgYm9vbGVhbiBpc1NvYXAxMSA9IHNvYXBGYXVsdC5nZXROYW1lc3BhY2UoKS5nZXROYW1lc3BhY2VVUkkoKS5lcXVhbHMoCi0gICAgICAgICAgICAgICAgU09BUDExQ29uc3RhbnRzLlNPQVBfRU5WRUxPUEVfTkFNRVNQQUNFX1VSSSk7Ci0KLSAgICAgICAgU09BUEZhdWx0Q29kZSBzb2FwQ29kZSA9IHNvYXBGYXVsdC5nZXRDb2RlKCk7Ci0gICAgICAgIFFOYW1lIGNvZGVRTmFtZSA9IG51bGw7Ci0gICAgICAgIGlmIChpc1NvYXAxMSkgewotICAgICAgICAgICAgY29kZVFOYW1lID0gc29hcENvZGUuZ2V0VGV4dEFzUU5hbWUoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNvZGVRTmFtZSA9IHNvYXBDb2RlLmdldFZhbHVlKCkuZ2V0VGV4dEFzUU5hbWUoKTsKLSAgICAgICAgfQotICAgICAgICBYTUxGYXVsdENvZGUgY29kZSA9IFhNTEZhdWx0Q29kZS5mcm9tUU5hbWUoY29kZVFOYW1lKTsKLQotICAgICAgICAvLyBHZXQgdGhlIHByaW1hcnkgcmVhc29uIHRleHQKLSAgICAgICAgLy8gVE9ETyB3aGF0IGlmIHRoaXMgZmFpbHMKLSAgICAgICAgU09BUEZhdWx0UmVhc29uIHNvYXBSZWFzb24gPSBzb2FwRmF1bHQuZ2V0UmVhc29uKCk7Ci0gICAgICAgIFN0cmluZyB0ZXh0ID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIGxhbmcgPSBudWxsOwotICAgICAgICBMaXN0IHNvYXBUZXh0cyA9IG51bGw7Ci0gICAgICAgIGlmIChpc1NvYXAxMSkgewotICAgICAgICAgICAgdGV4dCA9IHNvYXBSZWFzb24uZ2V0VGV4dCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc29hcFRleHRzID0gc29hcFJlYXNvbi5nZXRBbGxTb2FwVGV4dHMoKTsKLSAgICAgICAgICAgIFNPQVBGYXVsdFRleHQgcmVhc29uVGV4dCA9IChTT0FQRmF1bHRUZXh0KXNvYXBUZXh0cy5nZXQoMCk7Ci0gICAgICAgICAgICB0ZXh0ID0gcmVhc29uVGV4dC5nZXRUZXh0KCk7Ci0gICAgICAgICAgICBsYW5nID0gcmVhc29uVGV4dC5nZXRMYW5nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgWE1MRmF1bHRSZWFzb24gcmVhc29uID0gbmV3IFhNTEZhdWx0UmVhc29uKHRleHQsIGxhbmcpOwotCi0gICAgICAgIC8vIENvbnN0cnVjdCB0aGUgWE1MRmF1bHQgZnJvbSB0aGUgcmVxdWlyZWQgaW5mb3JtYXRpb24gKGNvZGUsIHJlYXNvbiwgZGV0YWlsIGJsb2NrcykKLSAgICAgICAgWE1MRmF1bHQgeG1sRmF1bHQgPSBuZXcgWE1MRmF1bHQoY29kZSwgcmVhc29uLCBkZXRhaWxCbG9ja3MpOwotCi0gICAgICAgIC8vIEFkZCB0aGUgc2Vjb25kYXJ5IGZhdWx0IGluZm9ybWF0aW9uCi0KLSAgICAgICAgLy8gR2V0IHRoZSBTdWJDb2RlcwotICAgICAgICBTT0FQRmF1bHRTdWJDb2RlIHNvYXBTdWJDb2RlID0gc29hcENvZGUuZ2V0U3ViQ29kZSgpOwotICAgICAgICBpZiAoc29hcFN1YkNvZGUgIT0gbnVsbCkgewotICAgICAgICAgICAgTGlzdDxRTmFtZT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8UU5hbWU+KCk7Ci0KLSAgICAgICAgICAgIC8vIFdhbGsgdGhlIG5lc3RlZCBzdWIgY29kZXMgYW5kIGNvbGxlY3QgdGhlIHFuYW1lcwotICAgICAgICAgICAgd2hpbGUgKHNvYXBTdWJDb2RlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTT0FQRmF1bHRWYWx1ZSBzb2FwU3ViQ29kZVZhbHVlID0gc29hcFN1YkNvZGUuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBRTmFtZSBxTmFtZSA9IHNvYXBTdWJDb2RlVmFsdWUuZ2V0VGV4dEFzUU5hbWUoKTsKLSAgICAgICAgICAgICAgICBsaXN0LmFkZChxTmFtZSk7Ci0gICAgICAgICAgICAgICAgc29hcFN1YkNvZGUgPSBzb2FwU3ViQ29kZS5nZXRTdWJDb2RlKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFB1dCB0aGUgY29sbGVjdGVkIHN1YiBjb2RlIHFuYW1lcyBvbnRvIHRoZSB4bWxGYXVsdAotICAgICAgICAgICAgUU5hbWVbXSBxTmFtZXMgPSBuZXcgUU5hbWVbbGlzdC5zaXplKCldOwotICAgICAgICAgICAgeG1sRmF1bHQuc2V0U3ViQ29kZXMobGlzdC50b0FycmF5KHFOYW1lcykpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gR2V0IHRoZSBzZWNvbmRhcnkgUmVhc29ucy4uLnRoZSBmaXJzdCByZWFzb24gd2FzIGFscmVhZHkgc2F2ZWQgYXMgdGhlIHByaW1hcnkgcmVhc29uCi0gICAgICAgIGlmIChzb2FwVGV4dHMgIT0gbnVsbCAmJiBzb2FwVGV4dHMuc2l6ZSgpID4gMSkgewotICAgICAgICAgICAgWE1MRmF1bHRSZWFzb25bXSBzZWNvbmRhcnlSZWFzb25zID0gbmV3IFhNTEZhdWx0UmVhc29uW3NvYXBUZXh0cy5zaXplKCkgLSAxXTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgc29hcFRleHRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgU09BUEZhdWx0VGV4dCBzb2FwUmVhc29uVGV4dCA9IChTT0FQRmF1bHRUZXh0KXNvYXBUZXh0cy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgc2Vjb25kYXJ5UmVhc29uc1tpIC0gMV0gPSBuZXcgWE1MRmF1bHRSZWFzb24oc29hcFJlYXNvblRleHQuZ2V0VGV4dCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvYXBSZWFzb25UZXh0LmdldExhbmcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB4bWxGYXVsdC5zZXRTZWNvbmRhcnlSZWFzb25zKHNlY29uZGFyeVJlYXNvbnMpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gR2V0IHRoZSBOb2RlCi0gICAgICAgIFNPQVBGYXVsdE5vZGUgc29hcE5vZGUgPSBzb2FwRmF1bHQuZ2V0Tm9kZSgpOwotICAgICAgICBpZiAoc29hcE5vZGUgIT0gbnVsbCkgewotICAgICAgICAgICAgeG1sRmF1bHQuc2V0Tm9kZShzb2FwTm9kZS5nZXRUZXh0KCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gR2V0IHRoZSBSb2xlCi0gICAgICAgIFNPQVBGYXVsdFJvbGUgc29hcFJvbGUgPSBzb2FwRmF1bHQuZ2V0Um9sZSgpOwotICAgICAgICBpZiAoc29hcFJvbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgeG1sRmF1bHQuc2V0Um9sZShzb2FwUm9sZS5nZXRUZXh0KCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB4bWxGYXVsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgWE1MRmF1bHQKLSAgICAgKgotICAgICAqIEBwYXJhbSBzb2FwRmF1bHQKLSAgICAgKiBAcmV0dXJuIHhtbEZhdWx0Ci0gICAgICogQHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBYTUxGYXVsdCBjcmVhdGVYTUxGYXVsdChqYXZheC54bWwuc29hcC5TT0FQRmF1bHQgc29hcEZhdWx0KQotICAgICAgICAgICAgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICBCbG9ja1tdIGRldGFpbEJsb2NrcyA9IGdldERldGFpbEJsb2Nrcyhzb2FwRmF1bHQpOwotICAgICAgICByZXR1cm4gY3JlYXRlWE1MRmF1bHQoc29hcEZhdWx0LCBkZXRhaWxCbG9ja3MpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBYTUxGYXVsdCBvYmplY3QgZnJvbSBhIFNPQVBGYXVsdCBhbmQgZGV0YWlsIEJsb2NrcwotICAgICAqCi0gICAgICogQHBhcmFtIHNvYXBGYXVsdAotICAgICAqIEBwYXJhbSBkZXRhaWxCbG9ja3MKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBYTUxGYXVsdCBjcmVhdGVYTUxGYXVsdChqYXZheC54bWwuc29hcC5TT0FQRmF1bHQgc29hcEZhdWx0LCBCbG9ja1tdIGRldGFpbEJsb2NrcykKLSAgICAgICAgICAgIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLQotICAgICAgICAvLyBUaGUgU09BUEZhdWx0IHN0cnVjdHVyZSBpcyBtb2RlbGVkIGFmdGVyIFNPQVAgMS4yLiAgCi0gICAgICAgIC8vIEhlcmUgaXMgYSBzYW1wbGUgY29tcHJlaGVuc2l2ZSBTT0FQIDEuMiBmYXVsdCB3aGljaCB3aWxsIGhlbHAgeW91IHVuZGVyc3RhbmQgdGhlCi0gICAgICAgIC8vIHN0cnVjdHVyZS4KLSAgICAgICAgLy8gPGVudjpFbnZlbG9wZSB4bWxuczplbnY9Imh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZSIKLSAgICAgICAgLy8gICAgICAgICAgICAgICB4bWxuczptPSJodHRwOi8vd3d3LmV4YW1wbGUub3JnL3RpbWVvdXRzIgotICAgICAgICAvLyAgICAgICAgICAgICAgIHhtbG5zOnhtbD0iaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIj4KLSAgICAgICAgLy8gICA8ZW52OkJvZHk+Ci0gICAgICAgIC8vICAgICAgPGVudjpGYXVsdD4KLSAgICAgICAgLy8gICAgICAgIDxlbnY6Q29kZT4KLSAgICAgICAgLy8gICAgICAgICAgPGVudjpWYWx1ZT5lbnY6U2VuZGVyPC9lbnY6VmFsdWU+Ci0gICAgICAgIC8vICAgICAgICAgIDxlbnY6U3ViY29kZT4KLSAgICAgICAgLy8gICAgICAgICAgICA8ZW52OlZhbHVlPm06TWVzc2FnZVRpbWVvdXQ8L2VudjpWYWx1ZT4KLSAgICAgICAgLy8gICAgICAgICAgPC9lbnY6U3ViY29kZT4KLSAgICAgICAgLy8gICAgICAgIDwvZW52OkNvZGU+Ci0gICAgICAgIC8vICAgICAgICA8ZW52OlJlYXNvbj4KLSAgICAgICAgLy8gICAgICAgICAgPGVudjpUZXh0IHhtbDpsYW5nPSJlbiI+U2VuZGVyIFRpbWVvdXQ8L2VudjpUZXh0PgotICAgICAgICAvLyAgICAgICAgICA8ZW52OlRleHQgeG1sOmxhbmc9ImRlIj5TZW5kZXIgVGltZW91dDwvZW52OlRleHQ+Ci0gICAgICAgIC8vICAgICAgICA8L2VudjpSZWFzb24+Ci0gICAgICAgIC8vICAgICAgICA8ZW52Ok5vZGU+aHR0cDovL215LmV4YW1wbGUub3JnL05vZGU8L2VudjpOb2RlPgotICAgICAgICAvLyAgICAgICAgPGVudjpSb2xlPmh0dHA6Ly9teS5leGFtcGxlLm9yZy9Sb2xlPC9lbnY6Um9sZT4KLSAgICAgICAgLy8gICAgICAgIDxlbnY6RGV0YWlsPgotICAgICAgICAvLyAgICAgICAgICA8bTpNYXhUaW1lPlA1TTwvbTpNYXhUaW1lPgotICAgICAgICAvLyAgICAgICAgPC9lbnY6RGV0YWlsPiAgICAKLSAgICAgICAgLy8gICAgICA8L2VudjpGYXVsdD4KLSAgICAgICAgLy8gICA8L2VudjpCb2R5PgotICAgICAgICAvLyA8L2VudjpFbnZlbG9wZT4KLQotICAgICAgICAvLyBHZXQgdGhlIGNvZGUgb3IgZGVmYXVsdCBjb2RlCi0gICAgICAgIFFOYW1lIGNvZGVRTmFtZSA9IHNvYXBGYXVsdC5nZXRGYXVsdENvZGVBc1FOYW1lKCk7Ci0gICAgICAgIFhNTEZhdWx0Q29kZSBjb2RlID0gWE1MRmF1bHRDb2RlLmZyb21RTmFtZShjb2RlUU5hbWUpOwotCi0gICAgICAgIC8vIEdldCB0aGUgcHJpbWFyeSByZWFzb24gdGV4dAotICAgICAgICAvLyBUT0RPIHdoYXQgaWYgdGhpcyBmYWlscwotICAgICAgICBTdHJpbmcgdGV4dCA9IHNvYXBGYXVsdC5nZXRGYXVsdFN0cmluZygpOwotICAgICAgICBMb2NhbGUgbG9jYWxlID0gc29hcEZhdWx0LmdldEZhdWx0U3RyaW5nTG9jYWxlKCk7Ci0gICAgICAgIFhNTEZhdWx0UmVhc29uIHJlYXNvbiA9IG5ldyBYTUxGYXVsdFJlYXNvbih0ZXh0LCBsb2NhbGVUb1htbExhbmcobG9jYWxlKSk7Ci0KLSAgICAgICAgLy8gQ29uc3RydWN0IHRoZSBYTUxGYXVsdCBmcm9tIHRoZSByZXF1aXJlZCBpbmZvcm1hdGlvbiAoY29kZSwgcmVhc29uLCBkZXRhaWwgYmxvY2tzKQotICAgICAgICBYTUxGYXVsdCB4bWxGYXVsdCA9IG5ldyBYTUxGYXVsdChjb2RlLCByZWFzb24sIGRldGFpbEJsb2Nrcyk7Ci0KLQotICAgICAgICBib29sZWFuIGlzU09BUDEyID0KLSAgICAgICAgICAgICAgICBzb2FwRmF1bHQuZ2V0TmFtZXNwYWNlVVJJKCkuZXF1YWxzKFNPQVBDb25zdGFudHMuVVJJX05TX1NPQVBfMV8yX0VOVkVMT1BFKTsKLQotICAgICAgICAvLyBBZGQgdGhlIHNlY29uZGFyeSBmYXVsdCBpbmZvcm1hdGlvbgotCi0gICAgICAgIC8vIEdldCB0aGUgU3ViQ29kZXMKLSAgICAgICAgaWYgKGlzU09BUDEyKSB7Ci0gICAgICAgICAgICBJdGVyYXRvciBpdCA9IHNvYXBGYXVsdC5nZXRGYXVsdFN1YmNvZGVzKCk7Ci0gICAgICAgICAgICBMaXN0PFFOYW1lPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxRTmFtZT4oKTsKLSAgICAgICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBRTmFtZSBxTmFtZSA9IChRTmFtZSlpdC5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgbGlzdC5hZGQocU5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGxpc3Quc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgICAgIFFOYW1lW10gc3ViQ29kZXMgPSBuZXcgUU5hbWVbbGlzdC5zaXplKCldOwotICAgICAgICAgICAgICAgIHN1YkNvZGVzID0gbGlzdC50b0FycmF5KHN1YkNvZGVzKTsKLSAgICAgICAgICAgICAgICB4bWxGYXVsdC5zZXRTdWJDb2RlcyhzdWJDb2Rlcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBHZXQgdGhlIHNlY29uZGFyeSBSZWFzb25zLi4udGhlIGZpcnN0IHJlYXNvbiB3YXMgYWxyZWFkeSBzYXZlZCBhcyB0aGUgcHJpbWFyeSByZWFzb24KLSAgICAgICAgaWYgKGlzU09BUDEyKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGl0ID0gc29hcEZhdWx0LmdldEZhdWx0UmVhc29uTG9jYWxlcygpOwotICAgICAgICAgICAgICAgIGJvb2xlYW4gZmlyc3QgPSB0cnVlOwotICAgICAgICAgICAgICAgIExpc3Q8WE1MRmF1bHRSZWFzb24+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFhNTEZhdWx0UmVhc29uPigpOwotICAgICAgICAgICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9jYWxlID0gKExvY2FsZSlpdC5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSBzb2FwRmF1bHQuZ2V0RmF1bHRSZWFzb25UZXh0KGxvY2FsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsaXN0LmFkZChuZXcgWE1MRmF1bHRSZWFzb24odGV4dCwgbG9jYWxlVG9YbWxMYW5nKGxvY2FsZSkpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobGlzdC5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIFhNTEZhdWx0UmVhc29uW10gc2Vjb25kYXJ5UmVhc29ucyA9IG5ldyBYTUxGYXVsdFJlYXNvbltsaXN0LnNpemUoKV07Ci0gICAgICAgICAgICAgICAgICAgIHNlY29uZGFyeVJlYXNvbnMgPSBsaXN0LnRvQXJyYXkoc2Vjb25kYXJ5UmVhc29ucyk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbEZhdWx0LnNldFNlY29uZGFyeVJlYXNvbnMoc2Vjb25kYXJ5UmVhc29ucyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoU09BUEV4Y2VwdGlvbiBzZSkgewotICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oc2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gR2V0IHRoZSBOb2RlCi0gICAgICAgIGlmIChpc1NPQVAxMikgewotICAgICAgICAgICAgU3RyaW5nIHNvYXBOb2RlID0gc29hcEZhdWx0LmdldEZhdWx0Tm9kZSgpOwotICAgICAgICAgICAgaWYgKHNvYXBOb2RlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB4bWxGYXVsdC5zZXROb2RlKHNvYXBOb2RlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIEdldCB0aGUgUm9sZQotICAgICAgICBTdHJpbmcgc29hcFJvbGUgPSBzb2FwRmF1bHQKLSAgICAgICAgICAgICAgICAuZ2V0RmF1bHRBY3RvcigpOyAgLy8gZ2V0RmF1bHRBY3RvciB3b3JrcyBmb3IgYm90aCBTT0FQIDEuMSBhbmQgU09BUCAxLjIgcGVyIHNwZWMKLSAgICAgICAgaWYgKHNvYXBSb2xlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHhtbEZhdWx0LnNldFJvbGUoc29hcFJvbGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHhtbEZhdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgWE1MRmF1bHQgY3JlYXRlWE1MRmF1bHQoQmxvY2sgYiwgUHJvdG9jb2wgcCkgewotICAgICAgICAvLyBCZWNhdXNlIG9mIHRoZSByZXF1aXJlbWVudCB0aGF0IHdlIGhhdmUgYSBmdWxsIFNPQVAgZW52ZWxvcGUgc3RydWN0dXJlIGFzCi0gICAgICAgIC8vIHRoZSBpbnB1dCB0byB0aGUgU3RBWFNPQVBNb2RlbEJ1aWxkZXIsIHdlIGhhdmUgdG8gaGF2ZSBhIGR1bW15IGVudmVsb3BlCi0gICAgICAgIC8vIHRoYXQgd3JhcHMgb3VyIGZhdWx0LiAgVGhpcyB3aWxsIGFsbG93IHRoZSBBeGlvbSBTT0FQRmF1bHQgb2JqZWN0IHRvCi0gICAgICAgIC8vIGJlIGNyZWF0ZWQuICAgICAgICAKLSAgICAgICAgTWVzc2FnZSBtID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5IG1mID0gKE1lc3NhZ2VGYWN0b3J5KSBGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShNZXNzYWdlRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgICAgICBtID0gbWYuY3JlYXRlKHApOwotICAgICAgICAgICAgbS5zZXRCb2R5QmxvY2soYik7Ci0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBTT0FQRW52ZWxvcGUgZHVtbXlFbnYgPSAoU09BUEVudmVsb3BlKSBtLmdldEFzT01FbGVtZW50KCk7ICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIFN0QVhTT0FQTW9kZWxCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RBWFNPQVBNb2RlbEJ1aWxkZXIoZHVtbXlFbnYuZ2V0WE1MU3RyZWFtUmVhZGVyV2l0aG91dENhY2hpbmcoKSk7Ci0gICAgICAgIFNPQVBFbnZlbG9wZSBuZXdFbnYgPSAoU09BUEVudmVsb3BlKSBidWlsZGVyLmdldERvY3VtZW50RWxlbWVudCgpOwotICAgICAgICAKLSAgICAgICAgU09BUEJvZHkgYm9keSA9IG5ld0Vudi5nZXRCb2R5KCk7Ci0gICAgICAgIFNPQVBGYXVsdCBmYXVsdCA9IGJvZHkuZ2V0RmF1bHQoKTsKLSAgICAgICAgCi0gICAgICAgIEJsb2NrW10gZGV0YWlscyA9IGdldERldGFpbEJsb2NrcyhmYXVsdCk7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gWE1MRmF1bHRVdGlscy5jcmVhdGVYTUxGYXVsdChmYXVsdCwgZGV0YWlscyk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIEJsb2NrW10gZ2V0RGV0YWlsQmxvY2tzKFNPQVBGYXVsdCBzb2FwRmF1bHQpIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEJsb2NrW10gYmxvY2tzID0gbnVsbDsKLSAgICAgICAgICAgIFNPQVBGYXVsdERldGFpbCBkZXRhaWwgPSBzb2FwRmF1bHQuZ2V0RGV0YWlsKCk7Ci0gICAgICAgICAgICBpZiAoZGV0YWlsICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBibG9jayBmb3IgZWFjaCBlbGVtZW50Ci0gICAgICAgICAgICAgICAgT01CbG9ja0ZhY3RvcnkgYmYgPQotICAgICAgICAgICAgICAgICAgICAgICAgKE9NQmxvY2tGYWN0b3J5KSBGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShPTUJsb2NrRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgQXJyYXlMaXN0PEJsb2NrPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxCbG9jaz4oKTsKLSAgICAgICAgICAgICAgICBJdGVyYXRvciBpdCA9IGRldGFpbC5nZXRDaGlsZEVsZW1lbnRzKCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICBPTUVsZW1lbnQgb20gPSAoT01FbGVtZW50KSBpdC5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIEJsb2NrIGIgPSBiZi5jcmVhdGVGcm9tKG9tLCBudWxsLCBvbS5nZXRRTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgbGlzdC5hZGQoYik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJsb2NrcyA9IG5ldyBCbG9ja1tsaXN0LnNpemUoKV07Ci0gICAgICAgICAgICAgICAgYmxvY2tzID0gbGlzdC50b0FycmF5KGJsb2Nrcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gYmxvY2tzOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIEJsb2NrW10gZ2V0RGV0YWlsQmxvY2tzKGphdmF4LnhtbC5zb2FwLlNPQVBGYXVsdCBzb2FwRmF1bHQpCi0gICAgICAgICAgICB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBCbG9ja1tdIGJsb2NrcyA9IG51bGw7Ci0gICAgICAgICAgICBEZXRhaWwgZGV0YWlsID0gc29hcEZhdWx0LmdldERldGFpbCgpOwotICAgICAgICAgICAgaWYgKGRldGFpbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gR2V0IGEgU0FBSi0+T00gY29udmVydGVyCi0gICAgICAgICAgICAgICAgU0FBSkNvbnZlcnRlckZhY3RvcnkgY29udmVydGVyRmFjdG9yeSA9IChTQUFKQ29udmVydGVyRmFjdG9yeSlGYWN0b3J5UmVnaXN0cnkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KFNBQUpDb252ZXJ0ZXJGYWN0b3J5LmNsYXNzKTsKLSAgICAgICAgICAgICAgICBTQUFKQ29udmVydGVyIGNvbnZlcnRlciA9IGNvbnZlcnRlckZhY3RvcnkuZ2V0U0FBSkNvbnZlcnRlcigpOwotCi0gICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGEgYmxvY2sgZm9yIGVhY2ggZWxlbWVudAotICAgICAgICAgICAgICAgIE9NQmxvY2tGYWN0b3J5IGJmID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChPTUJsb2NrRmFjdG9yeSlGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShPTUJsb2NrRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgQXJyYXlMaXN0PEJsb2NrPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxCbG9jaz4oKTsKLSAgICAgICAgICAgICAgICBJdGVyYXRvciBpdCA9IGRldGFpbC5nZXRDaGlsZEVsZW1lbnRzKCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICBEZXRhaWxFbnRyeSBkZSA9IChEZXRhaWxFbnRyeSlpdC5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIE9NRWxlbWVudCBvbSA9IGNvbnZlcnRlci50b09NKGRlKTsKLSAgICAgICAgICAgICAgICAgICAgQmxvY2sgYiA9IGJmLmNyZWF0ZUZyb20ob20sIG51bGwsIG9tLmdldFFOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICBsaXN0LmFkZChiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYmxvY2tzID0gbmV3IEJsb2NrW2xpc3Quc2l6ZSgpXTsKLSAgICAgICAgICAgICAgICBibG9ja3MgPSBsaXN0LnRvQXJyYXkoYmxvY2tzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBibG9ja3M7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgU09BUEZhdWx0IHJlcHJlc2VudGluZyB0aGUgWE1MRmF1bHQgYW5kIGF0dGFjaCBpdCB0byBib2R5LiBJZiB0aGVyZSBhcmUgMSBvciBtb3JlCi0gICAgICogZGV0YWlsIEJsb2NrcyBvbiB0aGUgWE1MRmF1bHQsIGEgU09BUEZhdWx0RGV0YWlsIGlzIGF0dGFjaGVkLiBJZiBpZ25vcmVEZXRhaWxCbG9ja3M9ZmFsc2UsCi0gICAgICogdGhlbiBPTUVsZW1lbnRzIGFyZSBhZGRlZCB0byB0aGUgU09BUEZhdWx0RGV0YWlsLiBJZiBpZ25vcmVEZXRhaWxCbG9ja3M9dHJ1ZSwgdGhlbiB0aGUgRGV0YWlsCi0gICAgICogQmxvY2tzIGFyZSBpZ25vcmVkICh0aGlzIGlzIG5lY2Vzc2FyeSBmb3IgWE1MU3BpbmUgcHJvY2Vzc2luZykKLSAgICAgKgotICAgICAqIEBwYXJhbSB4bWxGYXVsdAotICAgICAqIEBwYXJhbSBib2R5ICAgICAgICAgICAgICAgLSBBc3N1bWVzIHRoYXQgdGhlIGJvZHkgaXMgZW1wdHkKLSAgICAgKiBAcGFyYW0gaWdub3JlRGV0YWlsQmxvY2tzIHRydWUgb3IgZmFscwotICAgICAqIEByZXR1cm4gU09BUEZhdWx0ICh3aGljaCBpcyBhdHRhY2hlZCB0byBib2R5KQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU09BUEZhdWx0IGNyZWF0ZVNPQVBGYXVsdChYTUxGYXVsdCB4bWxGYXVsdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09BUEJvZHkgYm9keSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpZ25vcmVEZXRhaWxCbG9ja3MpIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLQotICAgICAgICAvLyBHZXQgdGhlIGZhY3RvcnkgYW5kIGNyZWF0ZSB0aGUgc29hcEZhdWx0Ci0gICAgICAgIFNPQVBGYWN0b3J5IGZhY3RvcnkgPSBNZXNzYWdlVXRpbHMuZ2V0U09BUEZhY3RvcnkoYm9keSk7Ci0gICAgICAgIFNPQVBGYXVsdCBzb2FwRmF1bHQgPSBmYWN0b3J5LmNyZWF0ZVNPQVBGYXVsdChib2R5KTsKLSAgICAgICAgT01OYW1lc3BhY2UgbnMgPSBib2R5LmdldE5hbWVzcGFjZSgpOwotCi0gICAgICAgIC8vIFRoZSBTT0FQRmF1bHQgc3RydWN0dXJlIGlzIG1vZGVsZWQgYWZ0ZXIgU09BUCAxLjIuICAKLSAgICAgICAgLy8gSGVyZSBpcyBhIHNhbXBsZSBjb21wcmVoZW5zaXZlIFNPQVAgMS4yIGZhdWx0IHdoaWNoIHdpbGwgaGVscCB5b3UgdW5kZXJzdGFuZCB0aGUKLSAgICAgICAgLy8gc3RydWN0dXJlLgotICAgICAgICAvLyA8ZW52OkVudmVsb3BlIHhtbG5zOmVudj0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIgotICAgICAgICAvLyAgICAgICAgICAgICAgIHhtbG5zOm09Imh0dHA6Ly93d3cuZXhhbXBsZS5vcmcvdGltZW91dHMiCi0gICAgICAgIC8vICAgICAgICAgICAgICAgeG1sbnM6eG1sPSJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiPgotICAgICAgICAvLyAgIDxlbnY6Qm9keT4KLSAgICAgICAgLy8gICAgICA8ZW52OkZhdWx0PgotICAgICAgICAvLyAgICAgICAgPGVudjpDb2RlPgotICAgICAgICAvLyAgICAgICAgICA8ZW52OlZhbHVlPmVudjpTZW5kZXI8L2VudjpWYWx1ZT4KLSAgICAgICAgLy8gICAgICAgICAgPGVudjpTdWJjb2RlPgotICAgICAgICAvLyAgICAgICAgICAgIDxlbnY6VmFsdWU+bTpNZXNzYWdlVGltZW91dDwvZW52OlZhbHVlPgotICAgICAgICAvLyAgICAgICAgICA8L2VudjpTdWJjb2RlPgotICAgICAgICAvLyAgICAgICAgPC9lbnY6Q29kZT4KLSAgICAgICAgLy8gICAgICAgIDxlbnY6UmVhc29uPgotICAgICAgICAvLyAgICAgICAgICA8ZW52OlRleHQgeG1sOmxhbmc9ImVuIj5TZW5kZXIgVGltZW91dDwvZW52OlRleHQ+Ci0gICAgICAgIC8vICAgICAgICAgIDxlbnY6VGV4dCB4bWw6bGFuZz0iZGUiPlNlbmRlciBUaW1lb3V0PC9lbnY6VGV4dD4KLSAgICAgICAgLy8gICAgICAgIDwvZW52OlJlYXNvbj4KLSAgICAgICAgLy8gICAgICAgIDxlbnY6Tm9kZT5odHRwOi8vbXkuZXhhbXBsZS5vcmcvTm9kZTwvZW52Ok5vZGU+Ci0gICAgICAgIC8vICAgICAgICA8ZW52OlJvbGU+aHR0cDovL215LmV4YW1wbGUub3JnL1JvbGU8L2VudjpSb2xlPgotICAgICAgICAvLyAgICAgICAgPGVudjpEZXRhaWw+Ci0gICAgICAgIC8vICAgICAgICAgIDxtOk1heFRpbWU+UDVNPC9tOk1heFRpbWU+Ci0gICAgICAgIC8vICAgICAgICA8L2VudjpEZXRhaWw+ICAgIAotICAgICAgICAvLyAgICAgIDwvZW52OkZhdWx0PgotICAgICAgICAvLyAgIDwvZW52OkJvZHk+Ci0gICAgICAgIC8vIDwvZW52OkVudmVsb3BlPgotCi0gICAgICAgIGJvb2xlYW4gaXNTb2FwMTEgPSBzb2FwRmF1bHQuZ2V0TmFtZXNwYWNlKCkuZ2V0TmFtZXNwYWNlVVJJKCkKLSAgICAgICAgICAgICAgICAuZXF1YWxzKFNPQVAxMUNvbnN0YW50cy5TT0FQX0VOVkVMT1BFX05BTUVTUEFDRV9VUkkpOwotCi0gICAgICAgIC8vIFNldCB0aGUgcHJpbWFyeSBDb2RlIFZhbHVlCi0gICAgICAgIFNPQVBGYXVsdENvZGUgc29hcENvZGUgPSBmYWN0b3J5LmNyZWF0ZVNPQVBGYXVsdENvZGUoc29hcEZhdWx0KTsKLSAgICAgICAgUU5hbWUgc29hcFZhbHVlUU5hbWUgPSB4bWxGYXVsdC5nZXRDb2RlKCkudG9RTmFtZShucy5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgIGlmIChpc1NvYXAxMSkgewotICAgICAgICAgICAgc29hcENvZGUuc2V0VGV4dChzb2FwVmFsdWVRTmFtZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBTT0FQRmF1bHRWYWx1ZSBzb2FwVmFsdWUgPSBmYWN0b3J5LmNyZWF0ZVNPQVBGYXVsdFZhbHVlKHNvYXBDb2RlKTsKLSAgICAgICAgICAgIHNvYXBWYWx1ZS5zZXRUZXh0KHNvYXBWYWx1ZVFOYW1lKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFNldCB0aGUgcHJpbWFyeSBSZWFzb24gVGV4dAotICAgICAgICBTT0FQRmF1bHRSZWFzb24gc29hcFJlYXNvbiA9IGZhY3RvcnkuY3JlYXRlU09BUEZhdWx0UmVhc29uKHNvYXBGYXVsdCk7Ci0gICAgICAgIGlmIChpc1NvYXAxMSkgewotICAgICAgICAgICAgc29hcFJlYXNvbi5zZXRUZXh0KHhtbEZhdWx0LmdldFJlYXNvbigpLmdldFRleHQoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBTT0FQRmF1bHRUZXh0IHNvYXBUZXh0ID0gZmFjdG9yeS5jcmVhdGVTT0FQRmF1bHRUZXh0KHNvYXBSZWFzb24pOwotICAgICAgICAgICAgc29hcFRleHQuc2V0VGV4dCh4bWxGYXVsdC5nZXRSZWFzb24oKS5nZXRUZXh0KCkpOwotICAgICAgICAgICAgc29hcFRleHQuc2V0TGFuZyh4bWxGYXVsdC5nZXRSZWFzb24oKS5nZXRMYW5nKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gU2V0IHRoZSBEZXRhaWwgYW5kIGNvbnRlbnRzIG9mIERldGFpbAotICAgICAgICBCbG9ja1tdIGJsb2NrcyA9IHhtbEZhdWx0LmdldERldGFpbEJsb2NrcygpOwotICAgICAgICBpZiAoYmxvY2tzICE9IG51bGwgJiYgYmxvY2tzLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgIFNPQVBGYXVsdERldGFpbCBkZXRhaWwgPSBmYWN0b3J5LmNyZWF0ZVNPQVBGYXVsdERldGFpbChzb2FwRmF1bHQpOwotICAgICAgICAgICAgaWYgKCFpZ25vcmVEZXRhaWxCbG9ja3MpIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJsb2Nrcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAvLyBBIEJsb2NrIGltcGxlbWVudHMgT01EYXRhU291cmNlLiAgU28gY3JlYXRlIE9NU291cmNlZEVsZW1lbnRzCi0gICAgICAgICAgICAgICAgICAgIC8vIGZvciBlYWNoIG9mIHRoZSBCbG9ja3MuCi0gICAgICAgICAgICAgICAgICAgIE9NU291cmNlZEVsZW1lbnRJbXBsIGVsZW1lbnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPTVNvdXJjZWRFbGVtZW50SW1wbChibG9ja3NbaV0uZ2V0UU5hbWUoKSwgZmFjdG9yeSwgYmxvY2tzW2ldKTsKLSAgICAgICAgICAgICAgICAgICAgZGV0YWlsLmFkZENoaWxkKGVsZW1lbnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIE5vdyBzZXQgYWxsIG9mIHRoZSBzZWNvbmRhcnkgZmF1bHQgaW5mb3JtYXRpb24KLSAgICAgICAgLy8gU2V0IHRoZSBTdWJDb2RlcwotICAgICAgICBRTmFtZVtdIHN1YkNvZGVzID0geG1sRmF1bHQuZ2V0U3ViQ29kZXMoKTsKLSAgICAgICAgaWYgKHN1YkNvZGVzICE9IG51bGwgJiYgc3ViQ29kZXMubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgT01FbGVtZW50IGN1cnIgPSBzb2FwQ29kZTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3ViQ29kZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBTT0FQRmF1bHRTdWJDb2RlIHN1YkNvZGUgPSAoaSA9PSAwKSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3J5LmNyZWF0ZVNPQVBGYXVsdFN1YkNvZGUoKFNPQVBGYXVsdENvZGUpY3VycikgOgotICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yeS5jcmVhdGVTT0FQRmF1bHRTdWJDb2RlKChTT0FQRmF1bHRTdWJDb2RlKWN1cnIpOwotICAgICAgICAgICAgICAgIFNPQVBGYXVsdFZhbHVlIHNvYXBTdWJDb2RlVmFsdWUgPSBmYWN0b3J5LmNyZWF0ZVNPQVBGYXVsdFZhbHVlKHN1YkNvZGUpOwotICAgICAgICAgICAgICAgIHNvYXBTdWJDb2RlVmFsdWUuc2V0VGV4dChzdWJDb2Rlc1tpXSk7Ci0gICAgICAgICAgICAgICAgY3VyciA9IHN1YkNvZGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTZXQgdGhlIHNlY29uZGFyeSByZWFzb25zIGFuZCBsYW5ndWFnZXMKLSAgICAgICAgWE1MRmF1bHRSZWFzb24gcmVhc29uc1tdID0geG1sRmF1bHQuZ2V0U2Vjb25kYXJ5UmVhc29ucygpOwotICAgICAgICBpZiAocmVhc29ucyAhPSBudWxsICYmIHJlYXNvbnMubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZWFzb25zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgU09BUEZhdWx0VGV4dCBzb2FwUmVhc29uVGV4dCA9IGZhY3RvcnkuY3JlYXRlU09BUEZhdWx0VGV4dChzb2FwUmVhc29uKTsKLSAgICAgICAgICAgICAgICBzb2FwUmVhc29uVGV4dC5zZXRUZXh0KHJlYXNvbnNbaV0uZ2V0VGV4dCgpKTsKLSAgICAgICAgICAgICAgICBzb2FwUmVhc29uVGV4dC5zZXRMYW5nKHJlYXNvbnNbaV0uZ2V0TGFuZygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIFNldCB0aGUgUm9sZQotICAgICAgICBpZiAoeG1sRmF1bHQuZ2V0Um9sZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIFNPQVBGYXVsdFJvbGUgc29hcFJvbGUgPSBmYWN0b3J5LmNyZWF0ZVNPQVBGYXVsdFJvbGUoKTsKLSAgICAgICAgICAgIHNvYXBSb2xlLnNldFRleHQoeG1sRmF1bHQuZ2V0Um9sZSgpKTsKLSAgICAgICAgICAgIHNvYXBGYXVsdC5zZXRSb2xlKHNvYXBSb2xlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFNldCB0aGUgTm9kZQotICAgICAgICBpZiAoeG1sRmF1bHQuZ2V0Tm9kZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIFNPQVBGYXVsdE5vZGUgc29hcE5vZGUgPSBmYWN0b3J5LmNyZWF0ZVNPQVBGYXVsdE5vZGUoKTsKLSAgICAgICAgICAgIHNvYXBOb2RlLnNldFRleHQoeG1sRmF1bHQuZ2V0Tm9kZSgpKTsKLSAgICAgICAgICAgIHNvYXBGYXVsdC5zZXROb2RlKHNvYXBOb2RlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzb2FwRmF1bHQ7Ci0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIFNPQVBGYXVsdCByZXByZXNlbnRpbmcgdGhlIFhNTEZhdWx0LiBJZiB0aGVyZSBhcmUgMSBvciBtb3JlIGRldGFpbCBCbG9ja3Mgb24gdGhlCi0gICAgICogWE1MRmF1bHQsIGEgU09BUEZhdWx0RGV0YWlsIGlzIGF0dGFjaGVkLgotICAgICAqCi0gICAgICogQHBhcmFtIHhtbEZhdWx0Ci0gICAgICogQHBhcmFtIGJvZHkKLSAgICAgKiBAcmV0dXJuIFNPQVBGYXVsdCAod2hpY2ggaXMgYXR0YWNoZWQgdG8gYm9keSkKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGphdmF4LnhtbC5zb2FwLlNPQVBGYXVsdCBjcmVhdGVTQUFKRmF1bHQoWE1MRmF1bHQgeG1sRmF1bHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zb2FwLlNPQVBCb2R5IGJvZHkpCi0gICAgICAgICAgICB0aHJvd3MgU09BUEV4Y2VwdGlvbiwgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgLy8gR2V0IHRoZSBmYWN0b3J5IGFuZCBjcmVhdGUgdGhlIHNvYXBGYXVsdAotICAgICAgICBTdHJpbmcgcHJvdG9jb2xOUyA9IGJvZHkuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLSAgICAgICAgamF2YXgueG1sLnNvYXAuU09BUEZhdWx0IHNvYXBGYXVsdCA9IGJvZHkuYWRkRmF1bHQoKTsKLQotICAgICAgICAvLyBUaGUgU09BUEZhdWx0IHN0cnVjdHVyZSBpcyBtb2RlbGVkIGFmdGVyIFNPQVAgMS4yLiAgCi0gICAgICAgIC8vIEhlcmUgaXMgYSBzYW1wbGUgY29tcHJlaGVuc2l2ZSBTT0FQIDEuMiBmYXVsdCB3aGljaCB3aWxsIGhlbHAgeW91IHVuZGVyc3RhbmQgdGhlCi0gICAgICAgIC8vIHN0cnVjdHVyZS4KLSAgICAgICAgLy8gPGVudjpFbnZlbG9wZSB4bWxuczplbnY9Imh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZSIKLSAgICAgICAgLy8gICAgICAgICAgICAgICB4bWxuczptPSJodHRwOi8vd3d3LmV4YW1wbGUub3JnL3RpbWVvdXRzIgotICAgICAgICAvLyAgICAgICAgICAgICAgIHhtbG5zOnhtbD0iaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIj4KLSAgICAgICAgLy8gICA8ZW52OkJvZHk+Ci0gICAgICAgIC8vICAgICAgPGVudjpGYXVsdD4KLSAgICAgICAgLy8gICAgICAgIDxlbnY6Q29kZT4KLSAgICAgICAgLy8gICAgICAgICAgPGVudjpWYWx1ZT5lbnY6U2VuZGVyPC9lbnY6VmFsdWU+Ci0gICAgICAgIC8vICAgICAgICAgIDxlbnY6U3ViY29kZT4KLSAgICAgICAgLy8gICAgICAgICAgICA8ZW52OlZhbHVlPm06TWVzc2FnZVRpbWVvdXQ8L2VudjpWYWx1ZT4KLSAgICAgICAgLy8gICAgICAgICAgPC9lbnY6U3ViY29kZT4KLSAgICAgICAgLy8gICAgICAgIDwvZW52OkNvZGU+Ci0gICAgICAgIC8vICAgICAgICA8ZW52OlJlYXNvbj4KLSAgICAgICAgLy8gICAgICAgICAgPGVudjpUZXh0IHhtbDpsYW5nPSJlbiI+U2VuZGVyIFRpbWVvdXQ8L2VudjpUZXh0PgotICAgICAgICAvLyAgICAgICAgICA8ZW52OlRleHQgeG1sOmxhbmc9ImRlIj5TZW5kZXIgVGltZW91dDwvZW52OlRleHQ+Ci0gICAgICAgIC8vICAgICAgICA8L2VudjpSZWFzb24+Ci0gICAgICAgIC8vICAgICAgICA8ZW52Ok5vZGU+aHR0cDovL215LmV4YW1wbGUub3JnL05vZGU8L2VudjpOb2RlPgotICAgICAgICAvLyAgICAgICAgPGVudjpSb2xlPmh0dHA6Ly9teS5leGFtcGxlLm9yZy9Sb2xlPC9lbnY6Um9sZT4KLSAgICAgICAgLy8gICAgICAgIDxlbnY6RGV0YWlsPgotICAgICAgICAvLyAgICAgICAgICA8bTpNYXhUaW1lPlA1TTwvbTpNYXhUaW1lPgotICAgICAgICAvLyAgICAgICAgPC9lbnY6RGV0YWlsPiAgICAKLSAgICAgICAgLy8gICAgICA8L2VudjpGYXVsdD4KLSAgICAgICAgLy8gICA8L2VudjpCb2R5PgotICAgICAgICAvLyA8L2VudjpFbnZlbG9wZT4KLQotICAgICAgICAvLyBTZXQgdGhlIHByaW1hcnkgQ29kZSBWYWx1ZQotICAgICAgICBRTmFtZSBzb2FwVmFsdWVRTmFtZSA9IHhtbEZhdWx0LmdldENvZGUoKS50b1FOYW1lKHByb3RvY29sTlMpOwotICAgICAgICBTdHJpbmcgcHJlZml4ID0gc29hcEZhdWx0LmdldFByZWZpeCgpOwotICAgICAgICBTdHJpbmcgc29hcFZhbHVlID0gbnVsbDsKLSAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsIHx8IHByZWZpeC5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICBzb2FwVmFsdWUgPSBzb2FwVmFsdWVRTmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNvYXBWYWx1ZSA9IHByZWZpeCArICI6IiArIHNvYXBWYWx1ZVFOYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICB9Ci0gICAgICAgIHNvYXBGYXVsdC5zZXRGYXVsdENvZGUoc29hcFZhbHVlKTsKLQotICAgICAgICAvLyBTZXQgdGhlIHByaW1hcnkgUmVhc29uIFRleHQKLSAgICAgICAgU3RyaW5nIHJlYXNvblRleHQgPSB4bWxGYXVsdC5nZXRSZWFzb24oKS5nZXRUZXh0KCk7Ci0gICAgICAgIFN0cmluZyByZWFzb25MYW5nID0geG1sRmF1bHQuZ2V0UmVhc29uKCkuZ2V0TGFuZygpOwotICAgICAgICBMb2NhbGUgbG9jYWxlID0gKHJlYXNvbkxhbmcgIT0gbnVsbCAmJiByZWFzb25MYW5nLmxlbmd0aCgpID4gMCkgPwotICAgICAgICAgICAgICAgIG5ldyBMb2NhbGUocmVhc29uTGFuZykgOgotICAgICAgICAgICAgICAgIExvY2FsZS5nZXREZWZhdWx0KCk7Ci0gICAgICAgIHNvYXBGYXVsdC5zZXRGYXVsdFN0cmluZyhyZWFzb25UZXh0LCBsb2NhbGUpOwotCi0gICAgICAgIC8vIFNldCB0aGUgRGV0YWlsIGFuZCBjb250ZW50cyBvZiBEZXRhaWwKLSAgICAgICAgQmxvY2tbXSBibG9ja3MgPSB4bWxGYXVsdC5nZXREZXRhaWxCbG9ja3MoKTsKLSAgICAgICAgaWYgKGJsb2NrcyAhPSBudWxsICYmIGJsb2Nrcy5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICBEZXRhaWwgZGV0YWlsID0gc29hcEZhdWx0LmFkZERldGFpbCgpOwotICAgICAgICAgICAgLy8gR2V0IGEgT00tPlNBQUogY29udmVydGVyCi0gICAgICAgICAgICBTQUFKQ29udmVydGVyRmFjdG9yeSBjb252ZXJ0ZXJGYWN0b3J5ID0KLSAgICAgICAgICAgICAgICAgICAgKFNBQUpDb252ZXJ0ZXJGYWN0b3J5KUZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KFNBQUpDb252ZXJ0ZXJGYWN0b3J5LmNsYXNzKTsKLSAgICAgICAgICAgIFNBQUpDb252ZXJ0ZXIgY29udmVydGVyID0gY29udmVydGVyRmFjdG9yeS5nZXRTQUFKQ29udmVydGVyKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJsb2Nrcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlci50b1NBQUooYmxvY2tzW2ldLmdldE9NRWxlbWVudCgpLCBkZXRhaWwpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiB4c2UpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbih4c2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTm93IHNldCBhbGwgb2YgdGhlIHNlY29uZGFyeSBmYXVsdCBpbmZvcm1hdGlvbgotICAgICAgICAvLyBTZXQgdGhlIFN1YkNvZGVzCi0gICAgICAgIFFOYW1lW10gc3ViQ29kZXMgPSB4bWxGYXVsdC5nZXRTdWJDb2RlcygpOwotICAgICAgICBpZiAoc3ViQ29kZXMgIT0gbnVsbCAmJiBzdWJDb2Rlcy5sZW5ndGggPiAwICYmCi0gICAgICAgICAgICAgICAgcHJvdG9jb2xOUy5lcXVhbHMoU09BUENvbnN0YW50cy5VUklfTlNfU09BUF8xXzJfRU5WRUxPUEUpKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN1YkNvZGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgc29hcEZhdWx0LmFwcGVuZEZhdWx0U3ViY29kZShzdWJDb2Rlc1tpXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTZXQgdGhlIHNlY29uZGFyeSByZWFzb25zIGFuZCBsYW5ndWFnZXMKLSAgICAgICAgWE1MRmF1bHRSZWFzb24gcmVhc29uc1tdID0geG1sRmF1bHQuZ2V0U2Vjb25kYXJ5UmVhc29ucygpOwotICAgICAgICBpZiAocmVhc29ucyAhPSBudWxsICYmIHJlYXNvbnMubGVuZ3RoID4gMCAmJgotICAgICAgICAgICAgICAgIHByb3RvY29sTlMuZXF1YWxzKFNPQVBDb25zdGFudHMuVVJJX05TX1NPQVBfMV8yX0VOVkVMT1BFKSkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZWFzb25zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHJlYXNvbnNbaV0uZ2V0TGFuZygpID09IG51bGwgfHwgcmVhc29uc1tpXS5nZXRMYW5nKCkubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBsb2NhbGUgPSBMb2NhbGUuZ2V0RGVmYXVsdCgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvY2FsZSA9IG5ldyBMb2NhbGUocmVhc29uc1tpXS5nZXRMYW5nKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzb2FwRmF1bHQuYWRkRmF1bHRSZWFzb25UZXh0KHJlYXNvbnNbaV0uZ2V0VGV4dCgpLCBsb2NhbGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gU2V0IHRoZSBSb2xlCi0gICAgICAgIGlmICh4bWxGYXVsdC5nZXRSb2xlKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgc29hcEZhdWx0LnNldEZhdWx0QWN0b3IoCi0gICAgICAgICAgICAgICAgICAgIHhtbEZhdWx0LmdldFJvbGUoKSk7ICAvLyBVc2UgRmF1bHQgYWN0b3IgYmVjYXVzZSBpdCBpcyBhcHBsaWNhYmxlIGZvciBTT0FQIDEuMSBhbmQgU09BUCAxLjIKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFNldCB0aGUgTm9kZS4uLm9ubHkgYXBwbGljYWJsZSBmb3IgU09BUCAxLjIKLSAgICAgICAgaWYgKHhtbEZhdWx0LmdldE5vZGUoKSAhPSBudWxsICYmIHByb3RvY29sTlMuZXF1YWxzKFNPQVBDb25zdGFudHMuVVJJX05TX1NPQVBfMV8yX0VOVkVMT1BFKSkKLSAgICAgICAgewotICAgICAgICAgICAgc29hcEZhdWx0LnNldEZhdWx0Um9sZSh4bWxGYXVsdC5nZXROb2RlKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHNvYXBGYXVsdDsKLQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDb252ZXJ0ZSBhIExvY2FsZSBvYmplY3QgdG8gYW4geG1sTGFuZyBTdHJpbmcKLSAgICAgKiBAcGFyYW0gbG9jYWxlCi0gICAgICogQHJldHVybiBTdHJpbmcgb2YgdGhlIGZvcm0gPGxvY2FsZS5nZXRMYW5ndWFnZSgpPi08bG9jYWxlLmdldENvdW50cnkoKT4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgbG9jYWxlVG9YbWxMYW5nKExvY2FsZSBsb2NhbGUpIHsKLSAgICAgICAgaWYgKGxvY2FsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gTG9jYWxlLmdldERlZmF1bHQoKS5nZXRMYW5ndWFnZSgpICsgIi0iICsgTG9jYWxlLmdldERlZmF1bHQoKS5nZXRDb3VudHJ5KCk7Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nIGxhbmcgPSBsb2NhbGUuZ2V0TGFuZ3VhZ2UoKTsKLSAgICAgICAgU3RyaW5nIGNvdW50cnlDb2RlID0gbG9jYWxlLmdldENvdW50cnkoKTsKLSAgICAgICAgaWYgKGNvdW50cnlDb2RlID09IG51bGwgfHwgY291bnRyeUNvZGUubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIGxhbmc7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhsYW5nICsgIi0iICsgY291bnRyeUNvZGUpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvdXRpbC9YTUxTdHJlYW1SZWFkZXJGaWx0ZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvdXRpbC9YTUxTdHJlYW1SZWFkZXJGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWM2MzRiMS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL3V0aWwvWE1MU3RyZWFtUmVhZGVyRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UudXRpbDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuTmFtZXNwYWNlQ29udGV4dDsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uTG9jYXRpb247Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci0KLS8qKgotICogWE1MU3RyZWFtUmVhZGVyRmlsdGVyIEFic3RyYWN0IGNsYXNzIHRoYXQgc2ltcGx5IGRlbGVnYXRlcyB0byB0aGUgaW5pdGlhbCByZWFkZXIuIFRoaXMgY2xhc3MgaXMKLSAqIHVzZWZ1bCBmb3IgYnVpbGRpbmcgZmlsdGVycwotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgWE1MU3RyZWFtUmVhZGVyRmlsdGVyIGltcGxlbWVudHMgWE1MU3RyZWFtUmVhZGVyIHsKLQotICAgIHByb3RlY3RlZCBYTUxTdHJlYW1SZWFkZXIgZGVsZWdhdGU7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3QgYSBGaWx0ZXIKLSAgICAgKgotICAgICAqIEBwYXJhbSByZWFkZXIgWE1MU3RyZWFtUmVhZGVyIHRoYXQgaXMgZmlsdGVyZWQuCi0gICAgICovCi0gICAgcHVibGljIFhNTFN0cmVhbVJlYWRlckZpbHRlcihYTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7Ci0gICAgICAgIGRlbGVnYXRlID0gcmVhZGVyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIGRlbGVnYXRlLmNsb3NlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRBdHRyaWJ1dGVDb3VudCgpIHsKLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldEF0dHJpYnV0ZUNvdW50KCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVMb2NhbE5hbWUoaW50IGFyZzApIHsKLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldEF0dHJpYnV0ZUxvY2FsTmFtZShhcmcwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUU5hbWUgZ2V0QXR0cmlidXRlTmFtZShpbnQgYXJnMCkgewotICAgICAgICByZXR1cm4gZGVsZWdhdGUuZ2V0QXR0cmlidXRlTmFtZShhcmcwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZU5hbWVzcGFjZShpbnQgYXJnMCkgewotICAgICAgICByZXR1cm4gZGVsZWdhdGUuZ2V0QXR0cmlidXRlTmFtZXNwYWNlKGFyZzApOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlUHJlZml4KGludCBhcmcwKSB7Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXRBdHRyaWJ1dGVQcmVmaXgoYXJnMCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVUeXBlKGludCBhcmcwKSB7Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXRBdHRyaWJ1dGVUeXBlKGFyZzApOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlVmFsdWUoaW50IGFyZzApIHsKLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldEF0dHJpYnV0ZVZhbHVlKGFyZzApOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlVmFsdWUoU3RyaW5nIGFyZzAsIFN0cmluZyBhcmcxKSB7Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXRBdHRyaWJ1dGVWYWx1ZShhcmcwLCBhcmcxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENoYXJhY3RlckVuY29kaW5nU2NoZW1lKCkgewotICAgICAgICByZXR1cm4gZGVsZWdhdGUuZ2V0Q2hhcmFjdGVyRW5jb2RpbmdTY2hlbWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnRUZXh0KCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXRFbGVtZW50VGV4dCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RW5jb2RpbmcoKSB7Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXRFbmNvZGluZygpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0RXZlbnRUeXBlKCkgewotICAgICAgICByZXR1cm4gZGVsZWdhdGUuZ2V0RXZlbnRUeXBlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRMb2NhbE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXRMb2NhbE5hbWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTG9jYXRpb24gZ2V0TG9jYXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXRMb2NhdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBRTmFtZSBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gZGVsZWdhdGUuZ2V0TmFtZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBOYW1lc3BhY2VDb250ZXh0IGdldE5hbWVzcGFjZUNvbnRleHQoKSB7Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXROYW1lc3BhY2VDb250ZXh0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXROYW1lc3BhY2VDb3VudCgpIHsKLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldE5hbWVzcGFjZUNvdW50KCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VQcmVmaXgoaW50IGFyZzApIHsKLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldE5hbWVzcGFjZVByZWZpeChhcmcwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVVSSSgpIHsKLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldE5hbWVzcGFjZVVSSSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKGludCBhcmcwKSB7Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXROYW1lc3BhY2VVUkkoYXJnMCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VVUkkoU3RyaW5nIGFyZzApIHsKLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldE5hbWVzcGFjZVVSSShhcmcwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBJRGF0YSgpIHsKLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldFBJRGF0YSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UElUYXJnZXQoKSB7Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXRQSVRhcmdldCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KCkgewotICAgICAgICByZXR1cm4gZGVsZWdhdGUuZ2V0UHJlZml4KCk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgYXJnMCkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXRQcm9wZXJ0eShhcmcwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXRUZXh0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIGNoYXJbXSBnZXRUZXh0Q2hhcmFjdGVycygpIHsKLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldFRleHRDaGFyYWN0ZXJzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRUZXh0Q2hhcmFjdGVycyhpbnQgYXJnMCwgY2hhcltdIGFyZzEsIGludCBhcmcyLCBpbnQgYXJnMykKLSAgICAgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZGVsZWdhdGUuZ2V0VGV4dENoYXJhY3RlcnMoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMyk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRUZXh0TGVuZ3RoKCkgewotICAgICAgICByZXR1cm4gZGVsZWdhdGUuZ2V0VGV4dExlbmd0aCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0VGV4dFN0YXJ0KCkgewotICAgICAgICByZXR1cm4gZGVsZWdhdGUuZ2V0VGV4dFN0YXJ0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRWZXJzaW9uKCkgewotICAgICAgICByZXR1cm4gZGVsZWdhdGUuZ2V0VmVyc2lvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGhhc05hbWUoKSB7Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5oYXNOYW1lKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZGVsZWdhdGUuaGFzTmV4dCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGhhc1RleHQoKSB7Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5oYXNUZXh0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNBdHRyaWJ1dGVTcGVjaWZpZWQoaW50IGFyZzApIHsKLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmlzQXR0cmlidXRlU3BlY2lmaWVkKGFyZzApOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQ2hhcmFjdGVycygpIHsKLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmlzQ2hhcmFjdGVycygpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRW5kRWxlbWVudCgpIHsKLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmlzRW5kRWxlbWVudCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzU3RhbmRhbG9uZSgpIHsKLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmlzU3RhbmRhbG9uZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzU3RhcnRFbGVtZW50KCkgewotICAgICAgICByZXR1cm4gZGVsZWdhdGUuaXNTdGFydEVsZW1lbnQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1doaXRlU3BhY2UoKSB7Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5pc1doaXRlU3BhY2UoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IG5leHQoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlLm5leHQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IG5leHRUYWcoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlLm5leHRUYWcoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZXF1aXJlKGludCBhcmcwLCBTdHJpbmcgYXJnMSwgU3RyaW5nIGFyZzIpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBkZWxlZ2F0ZS5yZXF1aXJlKGFyZzAsIGFyZzEsIGFyZzIpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHN0YW5kYWxvbmVTZXQoKSB7Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5zdGFuZGFsb25lU2V0KCk7Ci0gICAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS91dGlsL1hNTFN0cmVhbVdyaXRlcldpdGhPUy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS91dGlsL1hNTFN0cmVhbVdyaXRlcldpdGhPUy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjM5YTU1Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvdXRpbC9YTUxTdHJlYW1Xcml0ZXJXaXRoT1MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UudXRpbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS51dGlsLlN0QVhVdGlsczsNCi0NCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5OYW1lc3BhY2VDb250ZXh0Ow0KLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXI7DQotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOw0KLQ0KLS8qKg0KLSAqIFhNTFN0cmVhbVJlYWRlciB0aGF0IGV4cG9zZXMgZGlyZWN0IGFjY2VzcyB0byB0aGUgT3V0cHV0U3RyZWFtLg0KLSAqIFdyaXRpbmcgdG8gdGhlIG91dHB1dCBzdHJlYW0gaXMgZmFzdGVyIGluIHNvbWUgY2FzZXMuDQotICovDQotcHVibGljIGNsYXNzIFhNTFN0cmVhbVdyaXRlcldpdGhPUyBpbXBsZW1lbnRzIFhNTFN0cmVhbVdyaXRlciB7DQotICAgIFhNTFN0cmVhbVdyaXRlciB3cml0ZXI7DQotICAgIFN0cmluZyBjaGFyU2V0RW5jb2Rpbmc7DQotICAgIE91dHB1dFN0cmVhbSBvczsNCi0gICAgDQotDQotICAgIHB1YmxpYyBYTUxTdHJlYW1Xcml0ZXJXaXRoT1MoT3V0cHV0U3RyZWFtIG9zLCBTdHJpbmcgY2hhclNldEVuY29kaW5nKSANCi0gICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gew0KLSAgICAgICAgc3VwZXIoKTsNCi0gICAgICAgIHdyaXRlciA9IG51bGw7IC8vIFdyaXRlciBpcyBjcmVhdGVkIHdoZW4gbmVlZGVkDQotICAgICAgICB0aGlzLm9zID0gb3M7DQotICAgICAgICB0aGlzLmNoYXJTZXRFbmNvZGluZyA9IGNoYXJTZXRFbmNvZGluZzsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogVGhlIHdyaXRlciBpcyBjcmVhdGVkIGxhemlseS4gDQotICAgICAqIElmIG9ubHkgdGhlIG91dHB1dCBzdHJlYW0gaXMgdXNlZCwgdGhlbiB0aGUgd3JpdGVyIGlzIG5ldmVyIGNyZWF0ZWQuDQotICAgICAqLw0KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlV3JpdGVyKCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7DQotICAgICAgICBpZiAod3JpdGVyID09IG51bGwpIHsNCi0gICAgICAgICAgICB3cml0ZXIgPSAgU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVdyaXRlcihvcywgY2hhclNldEVuY29kaW5nKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICANCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7DQotICAgICAgICBpZiAod3JpdGVyICE9IG51bGwpIHsNCi0gICAgICAgICAgICB3cml0ZXIuY2xvc2UoKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBmbHVzaCgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gew0KLSAgICAgICAgaWYgKHdyaXRlciAhPSBudWxsKSB7DQotICAgICAgICAgICAgd3JpdGVyLmZsdXNoKCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIE5hbWVzcGFjZUNvbnRleHQgZ2V0TmFtZXNwYWNlQ29udGV4dCgpIHsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgY3JlYXRlV3JpdGVyKCk7DQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOw0KLSAgICAgICAgfSAgICAgICAgDQotICAgICAgICByZXR1cm4gd3JpdGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByZWZpeChTdHJpbmcgYXJnMCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7DQotICAgICAgICBjcmVhdGVXcml0ZXIoKTsNCi0gICAgICAgIHJldHVybiB3cml0ZXIuZ2V0UHJlZml4KGFyZzApOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIGFyZzApIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gew0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBjcmVhdGVXcml0ZXIoKTsNCi0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB3cml0ZXIuZ2V0UHJvcGVydHkoYXJnMCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdE5hbWVzcGFjZShTdHJpbmcgYXJnMCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7DQotICAgICAgICBjcmVhdGVXcml0ZXIoKTsNCi0gICAgICAgIHdyaXRlci5zZXREZWZhdWx0TmFtZXNwYWNlKGFyZzApOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE5hbWVzcGFjZUNvbnRleHQoTmFtZXNwYWNlQ29udGV4dCBhcmcwKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsNCi0gICAgICAgIGNyZWF0ZVdyaXRlcigpOw0KLSAgICAgICAgd3JpdGVyLnNldE5hbWVzcGFjZUNvbnRleHQoYXJnMCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0UHJlZml4KFN0cmluZyBhcmcwLCBTdHJpbmcgYXJnMSkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7DQotICAgICAgICBjcmVhdGVXcml0ZXIoKTsNCi0gICAgICAgIHdyaXRlci5zZXRQcmVmaXgoYXJnMCwgYXJnMSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgd3JpdGVBdHRyaWJ1dGUoU3RyaW5nIGFyZzAsIFN0cmluZyBhcmcxLCBTdHJpbmcgYXJnMiwgU3RyaW5nIGFyZzMpIA0KLSAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsNCi0gICAgICAgIGNyZWF0ZVdyaXRlcigpOw0KLSAgICAgICAgd3JpdGVyLndyaXRlQXR0cmlidXRlKGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHdyaXRlQXR0cmlidXRlKFN0cmluZyBhcmcwLCBTdHJpbmcgYXJnMSwgU3RyaW5nIGFyZzIpIA0KLSAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsNCi0gICAgICAgIGNyZWF0ZVdyaXRlcigpOw0KLSAgICAgICAgd3JpdGVyLndyaXRlQXR0cmlidXRlKGFyZzAsIGFyZzEsIGFyZzIpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHdyaXRlQXR0cmlidXRlKFN0cmluZyBhcmcwLCBTdHJpbmcgYXJnMSkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7DQotICAgICAgICBjcmVhdGVXcml0ZXIoKTsNCi0gICAgICAgIHdyaXRlci53cml0ZUF0dHJpYnV0ZShhcmcwLCBhcmcxKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUNEYXRhKFN0cmluZyBhcmcwKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsNCi0gICAgICAgIGNyZWF0ZVdyaXRlcigpOw0KLSAgICAgICAgd3JpdGVyLndyaXRlQ0RhdGEoYXJnMCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgd3JpdGVDaGFyYWN0ZXJzKGNoYXJbXSBhcmcwLCBpbnQgYXJnMSwgaW50IGFyZzIpIA0KLSAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsNCi0gICAgICAgIGNyZWF0ZVdyaXRlcigpOw0KLSAgICAgICAgd3JpdGVyLndyaXRlQ2hhcmFjdGVycyhhcmcwLCBhcmcxLCBhcmcyKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUNoYXJhY3RlcnMoU3RyaW5nIGFyZzApIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gew0KLSAgICAgICAgY3JlYXRlV3JpdGVyKCk7DQotICAgICAgICB3cml0ZXIud3JpdGVDaGFyYWN0ZXJzKGFyZzApOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHdyaXRlQ29tbWVudChTdHJpbmcgYXJnMCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7DQotICAgICAgICBjcmVhdGVXcml0ZXIoKTsNCi0gICAgICAgIHdyaXRlci53cml0ZUNvbW1lbnQoYXJnMCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgd3JpdGVEZWZhdWx0TmFtZXNwYWNlKFN0cmluZyBhcmcwKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsNCi0gICAgICAgIGNyZWF0ZVdyaXRlcigpOw0KLSAgICAgICAgd3JpdGVyLndyaXRlRGVmYXVsdE5hbWVzcGFjZShhcmcwKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZURURChTdHJpbmcgYXJnMCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7DQotICAgICAgICBjcmVhdGVXcml0ZXIoKTsNCi0gICAgICAgIHdyaXRlci53cml0ZURURChhcmcwKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUVtcHR5RWxlbWVudChTdHJpbmcgYXJnMCwgU3RyaW5nIGFyZzEsIFN0cmluZyBhcmcyKSANCi0gICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7DQotICAgICAgICBjcmVhdGVXcml0ZXIoKTsNCi0gICAgICAgIHdyaXRlci53cml0ZUVtcHR5RWxlbWVudChhcmcwLCBhcmcxLCBhcmcyKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUVtcHR5RWxlbWVudChTdHJpbmcgYXJnMCwgU3RyaW5nIGFyZzEpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gew0KLSAgICAgICAgY3JlYXRlV3JpdGVyKCk7DQotICAgICAgICB3cml0ZXIud3JpdGVFbXB0eUVsZW1lbnQoYXJnMCwgYXJnMSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgd3JpdGVFbXB0eUVsZW1lbnQoU3RyaW5nIGFyZzApIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gew0KLSAgICAgICAgY3JlYXRlV3JpdGVyKCk7DQotICAgICAgICB3cml0ZXIud3JpdGVFbXB0eUVsZW1lbnQoYXJnMCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgd3JpdGVFbmREb2N1bWVudCgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gew0KLSAgICAgICAgY3JlYXRlV3JpdGVyKCk7DQotICAgICAgICB3cml0ZXIud3JpdGVFbmREb2N1bWVudCgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHdyaXRlRW5kRWxlbWVudCgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gew0KLSAgICAgICAgY3JlYXRlV3JpdGVyKCk7DQotICAgICAgICB3cml0ZXIud3JpdGVFbmRFbGVtZW50KCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgd3JpdGVFbnRpdHlSZWYoU3RyaW5nIGFyZzApIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gew0KLSAgICAgICAgY3JlYXRlV3JpdGVyKCk7DQotICAgICAgICB3cml0ZXIud3JpdGVFbnRpdHlSZWYoYXJnMCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgd3JpdGVOYW1lc3BhY2UoU3RyaW5nIGFyZzAsIFN0cmluZyBhcmcxKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsNCi0gICAgICAgIGNyZWF0ZVdyaXRlcigpOw0KLSAgICAgICAgd3JpdGVyLndyaXRlTmFtZXNwYWNlKGFyZzAsIGFyZzEpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHdyaXRlUHJvY2Vzc2luZ0luc3RydWN0aW9uKFN0cmluZyBhcmcwLCBTdHJpbmcgYXJnMSkgDQotICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gew0KLSAgICAgICAgY3JlYXRlV3JpdGVyKCk7DQotICAgICAgICB3cml0ZXIud3JpdGVQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oYXJnMCwgYXJnMSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgd3JpdGVQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oU3RyaW5nIGFyZzApIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gew0KLSAgICAgICAgY3JlYXRlV3JpdGVyKCk7DQotICAgICAgICB3cml0ZXIud3JpdGVQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oYXJnMCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgd3JpdGVTdGFydERvY3VtZW50KCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7DQotICAgICAgICBjcmVhdGVXcml0ZXIoKTsNCi0gICAgICAgIHdyaXRlci53cml0ZVN0YXJ0RG9jdW1lbnQoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZVN0YXJ0RG9jdW1lbnQoU3RyaW5nIGFyZzAsIFN0cmluZyBhcmcxKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsNCi0gICAgICAgIGNyZWF0ZVdyaXRlcigpOw0KLSAgICAgICAgd3JpdGVyLndyaXRlU3RhcnREb2N1bWVudChhcmcwLCBhcmcxKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZVN0YXJ0RG9jdW1lbnQoU3RyaW5nIGFyZzApIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gew0KLSAgICAgICAgY3JlYXRlV3JpdGVyKCk7DQotICAgICAgICB3cml0ZXIud3JpdGVTdGFydERvY3VtZW50KGFyZzApOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHdyaXRlU3RhcnRFbGVtZW50KFN0cmluZyBhcmcwLCBTdHJpbmcgYXJnMSwgU3RyaW5nIGFyZzIpIA0KLSAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsNCi0gICAgICAgIGNyZWF0ZVdyaXRlcigpOw0KLSAgICAgICAgd3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KGFyZzAsIGFyZzEsIGFyZzIpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHdyaXRlU3RhcnRFbGVtZW50KFN0cmluZyBhcmcwLCBTdHJpbmcgYXJnMSkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7DQotICAgICAgICBjcmVhdGVXcml0ZXIoKTsNCi0gICAgICAgIHdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChhcmcwLCBhcmcxKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZVN0YXJ0RWxlbWVudChTdHJpbmcgYXJnMCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7DQotICAgICAgICBjcmVhdGVXcml0ZXIoKTsNCi0gICAgICAgIHdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChhcmcwKTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIElmIHRoaXMgWE1MU3RyZWFtV3JpdGVyIGlzIGNvbm5lY3RlZCB0byBhbiBPdXRwdXRTdHJlYW0NCi0gICAgICogdGhlbiB0aGUgT3V0cHV0U3RyZWFtIGlzIHJldHVybmVkLiAgVGhpcyBhbGxvd3MgYSBub2RlDQotICAgICAqIChwZXJoYXBzIGFuIE9NU291cmNlZEVsZW1lbnQpIHRvIHdyaXRlIGl0cyBjb250ZW50DQotICAgICAqIGRpcmVjdGx5IHRvIHRoZSBPdXRwdXRTdHJlYW0uDQotICAgICAqIEByZXR1cm4gT3V0cHV0U3RyZWFtIG9yIG51bGwNCi0gICAgICovDQotICAgIHB1YmxpYyBPdXRwdXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtKCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7DQotICAgICAgICANCi0gICAgICAgIGlmIChvcyAhPSBudWxsKSB7DQotICAgICAgICAgICAgLy8gRmx1c2ggdGhlIHN0YXRlIG9mIHRoZSB3cml0ZXIuLk1hbnkgdGltZXMgdGhlIA0KLSAgICAgICAgICAgIC8vIHdyaXRlIGRlZmVycyB0aGUgd3JpdGluZyBvZiB0YWcgY2hhcmFjdGVycyAoPikNCi0gICAgICAgICAgICAvLyB1bnRpbCB0aGUgbmV4dCB3cml0ZS4gIEZsdXNoIG91dCB0aGlzIGNoYXJhY3Rlcg0KLSAgICAgICAgICAgIGlmICh3cml0ZXIgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICB0aGlzLndyaXRlQ2hhcmFjdGVycygiIik7IA0KLSAgICAgICAgICAgICAgICB0aGlzLmZsdXNoKCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG9zOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvdXRpbC9pbXBsL05hbWVzcGFjZUNvbnRleHRGcm9tRE9NLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL3V0aWwvaW1wbC9OYW1lc3BhY2VDb250ZXh0RnJvbURPTS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTUwNWM3Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvdXRpbC9pbXBsL05hbWVzcGFjZUNvbnRleHRGcm9tRE9NLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UudXRpbC5pbXBsOwotCi1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5OYW1lc3BhY2VDb250ZXh0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi0vKioKLSAqIE5hbWVzcGFjZSBpbmZvcm1hdGlvbiBhdmFpbGFibGUgYXQgdGhlIGN1cnJlbnQgc2NvcGUuIFV0aWxpdHkgY2xhc3MgZm9yIFhNTFN0cmVhbVJlYWRlckZyb21ET00KLSAqCi0gKiBAc2VlIFhNTFN0cmVhbVJlYWRlckZyb21ET00KLSAqLwotcHVibGljIGNsYXNzIE5hbWVzcGFjZUNvbnRleHRGcm9tRE9NIGltcGxlbWVudHMgTmFtZXNwYWNlQ29udGV4dCB7Ci0KLSAgICBwcml2YXRlIEVsZW1lbnQgZWxlbWVudDsKLQotICAgIC8qKiBAcGFyYW0gZWxlbWVudCByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnQgc2NvcGUgKi8KLSAgICBOYW1lc3BhY2VDb250ZXh0RnJvbURPTShFbGVtZW50IGVsZW1lbnQpIHsKLSAgICAgICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgamF2YXgueG1sLm5hbWVzcGFjZS5OYW1lc3BhY2VDb250ZXh0I2dldFByZWZpeChqYXZhLmxhbmcuU3RyaW5nKQotICAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByZWZpeChTdHJpbmcgbmFtZXNwYWNlVVJJKSB7Ci0gICAgICAgIHJldHVybiBlbGVtZW50Lmxvb2t1cFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBqYXZheC54bWwubmFtZXNwYWNlLk5hbWVzcGFjZUNvbnRleHQjZ2V0UHJlZml4ZXMoamF2YS5sYW5nLlN0cmluZykKLSAgICAgICovCi0gICAgcHVibGljIEl0ZXJhdG9yIGdldFByZWZpeGVzKFN0cmluZyBuYW1lc3BhY2VVUkkpIHsKLSAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBqYXZheC54bWwuc29hcC5TT0FQRWxlbWVudCkgewotICAgICAgICAgICAgSXRlcmF0b3IgaXQgPSAoKGphdmF4LnhtbC5zb2FwLlNPQVBFbGVtZW50KWVsZW1lbnQpLmdldFZpc2libGVOYW1lc3BhY2VQcmVmaXhlcygpOwotICAgICAgICAgICAgQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHByZWZpeCA9IChTdHJpbmcpaXQubmV4dCgpOwotICAgICAgICAgICAgICAgIGlmIChnZXROYW1lc3BhY2VVUkkocHJlZml4KS5lcXVhbHMobmFtZXNwYWNlVVJJKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4ICE9IG51bGwgJiYgcHJlZml4Lmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbGlzdC5hZGQocHJlZml4KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbGlzdC5pdGVyYXRvcigpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICBOb2RlIG5vZGUgPSBlbGVtZW50OwotICAgICAgICAgICAgd2hpbGUgKG5vZGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgRWxlbWVudCkgewotICAgICAgICAgICAgICAgICAgICAvLyBXYWxrIHRoZSBhdHRyaWJ1dGVzIGxvb2tpbmcgZm9yIG5hbWVzcGFjZSBkZWNsYXJhdGlvbnMKLSAgICAgICAgICAgICAgICAgICAgTmFtZWROb2RlTWFwIGF0dHJzID0gKChFbGVtZW50KW5vZGUpLmdldEF0dHJpYnV0ZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRycy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBdHRyIGF0dHIgPSAoQXR0cilhdHRycy5pdGVtKGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF0dHIuZ2V0Tm9kZVZhbHVlKCkuZXF1YWxzKG5hbWVzcGFjZVVSSSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGF0dHIuZ2V0Tm9kZU5hbWUoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgoInhtbG5zIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHByZWZpeCA9ICIiOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZS5zdGFydHNXaXRoKCJ4bWxuczoiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gbmFtZS5zdWJzdHJpbmcoNik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRm91bmQgYSBuYW1lc3BhY2UgZGVjbGFyYXRpb24gd2l0aCB0aGUgcHJlZml4LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhpcyBpcyBub3Qgb3ZlcnJpZGRlbiBieSBhIGRlY2xhcmF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluIGEgY2xvc2VyIHNjb3BlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWxpc3QuY29udGFpbnMocHJlZml4KSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE5hbWVzcGFjZVVSSShwcmVmaXgpLmVxdWFscyhuYW1lc3BhY2VVUkkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0LmFkZChwcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIFBvcCB1cCB0byB0aGUgcGFyZW50IG5vZGUKLSAgICAgICAgICAgICAgICBub2RlID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbGlzdC5pdGVyYXRvcigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VVUkkoU3RyaW5nIHByZWZpeCkgewotICAgICAgICByZXR1cm4gZWxlbWVudC5sb29rdXBOYW1lc3BhY2VVUkkocHJlZml4KTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvdXRpbC9pbXBsL1NBQUpDb252ZXJ0ZXJGYWN0b3J5SW1wbC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS91dGlsL2ltcGwvU0FBSkNvbnZlcnRlckZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjNGIxMDIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS91dGlsL2ltcGwvU0FBSkNvbnZlcnRlckZhY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS51dGlsLmltcGw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZmFjdG9yeS5TQUFKQ29udmVydGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UudXRpbC5TQUFKQ29udmVydGVyOwotCi0vKioKLSAqIFNBQUpDb252ZXJ0ZXJGYWN0b3J5SW1wbCBHZXQgdGhlIGRlZmF1bHQgU0FBSkNvbnZlcnRlciBpbXBsZW1lbnRhdGlvbi4gT2J0YWluIHRoaXMgZmFjdG9yeSBmcm9tCi0gKiB0aGUgRmFjdG9yeVJlZ2lzdHJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBTQUFKQ29udmVydGVyRmFjdG9yeUltcGwgaW1wbGVtZW50cyBTQUFKQ29udmVydGVyRmFjdG9yeSB7Ci0KLSAgICBTQUFKQ29udmVydGVySW1wbCBjb252ZXJ0ZXIgPSBuZXcgU0FBSkNvbnZlcnRlckltcGwoKTsKLQotICAgIC8qKiBSZXF1aXJlZCBmb3IgRmFjdG9yeSBpbnN0YW50aWF0aW9uICovCi0gICAgcHVibGljIFNBQUpDb252ZXJ0ZXJGYWN0b3J5SW1wbCgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmZhY3RvcnkuU0FBSkNvbnZlcnRlckZhY3RvcnkjZ2V0U0FBSkNvbnZlcnRlcigpCi0gICAgICAqLwotICAgIHB1YmxpYyBTQUFKQ29udmVydGVyIGdldFNBQUpDb252ZXJ0ZXIoKSB7Ci0gICAgICAgIHJldHVybiBjb252ZXJ0ZXI7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL3V0aWwvaW1wbC9TQUFKQ29udmVydGVySW1wbC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS91dGlsL2ltcGwvU0FBSkNvbnZlcnRlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzUwNTkxMy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL3V0aWwvaW1wbC9TQUFKQ29udmVydGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQ5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLnV0aWwuaW1wbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uYXR0YWNobWVudHMuQXR0YWNobWVudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5idWlsZGVyLlN0QVhPTUJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmRvbS5FbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLnV0aWwuU3RBWFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQMTFDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVAxMkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuaW1wbC5idWlsZGVyLk1UT01TdEFYU09BUE1vZGVsQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuaW1wbC5idWlsZGVyLlN0QVhTT0FQTW9kZWxCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuRXhjZXB0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmkxOG4uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLnV0aWwuU0FBSkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UudXRpbC5TT0FQRWxlbWVudFJlYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnV0aWxpdHkuU0FBSkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuRGV0YWlsOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLk1lc3NhZ2VGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLk5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEJvZHk7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEVudmVsb3BlOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEZhdWx0OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBIZWFkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUE1lc3NhZ2U7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUFBhcnQ7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLS8qKiBTQUFKQ29udmVydGVySW1wbCBQcm92aWRlcyBhbiBjb252ZXJzaW9uIG1ldGhvZHMgYmV0d2VlbiBPTTwtPlNBQUogKi8KLXB1YmxpYyBjbGFzcyBTQUFKQ29udmVydGVySW1wbCBpbXBsZW1lbnRzIFNBQUpDb252ZXJ0ZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFNBQUpDb252ZXJ0ZXJJbXBsLmNsYXNzKTsKLQotICAgIC8qKiBDb25zdHJ1Y3RlZCB2aWEgU0FBSkNvbnZlcnRlckZhY3RvcnkgKi8KLSAgICBTQUFKQ29udmVydGVySW1wbCgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLnV0aWwuU0FBSkNvbnZlcnRlciN0b1NBQUoob3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZSkKLSAgICAgICovCi0gICAgcHVibGljIFNPQVBFbnZlbG9wZSB0b1NBQUoob3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZSBvbUVudmVsb3BlKQotICAgICAgICAgICAgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICBTT0FQRW52ZWxvcGUgc29hcEVudmVsb3BlID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEJ1aWxkIHRoZSBkZWZhdWx0IGVudmVsb3BlCi0gICAgICAgICAgICBPTU5hbWVzcGFjZSBucyA9IG9tRW52ZWxvcGUuZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgICAgICBNZXNzYWdlRmFjdG9yeSBtZiA9IGNyZWF0ZU1lc3NhZ2VGYWN0b3J5KG5zLmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICAgICAgICAgIFNPQVBNZXNzYWdlIHNtID0gbWYuY3JlYXRlTWVzc2FnZSgpOwotICAgICAgICAgICAgU09BUFBhcnQgc3AgPSBzbS5nZXRTT0FQUGFydCgpOwotICAgICAgICAgICAgc29hcEVudmVsb3BlID0gc3AuZ2V0RW52ZWxvcGUoKTsKLQotICAgICAgICAgICAgLy8gVGhlIGdldFNPQVBFbnZlbG9wZSgpIGNhbGwgY3JlYXRlcyBhIGRlZmF1bHQgU09BUEVudmVsb3BlIHdpdGggYSBTT0FQSGVhZGVyIGFuZCBTT0FQQm9keS4KLSAgICAgICAgICAgIC8vIFRoZSBTT0FQSGVhZGVyIGFuZCBTT0FQQm9keSBhcmUgcmVtb3ZlZCAodGhleSB3aWxsIGJlIGFkZGVkIGJhY2sgaW4gaWYgdGhleSBhcmUgcHJlc2VudCBpbiB0aGUKLSAgICAgICAgICAgIC8vIE9NRW52ZWxvcGUpLgotICAgICAgICAgICAgU09BUEJvZHkgc29hcEJvZHkgPSBzb2FwRW52ZWxvcGUuZ2V0Qm9keSgpOwotICAgICAgICAgICAgaWYgKHNvYXBCb2R5ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzb2FwQm9keS5kZXRhY2hOb2RlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTT0FQSGVhZGVyIHNvYXBIZWFkZXIgPSBzb2FwRW52ZWxvcGUuZ2V0SGVhZGVyKCk7Ci0gICAgICAgICAgICBpZiAoc29hcEhlYWRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc29hcEhlYWRlci5kZXRhY2hOb2RlKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFdlIGRvbid0IGtub3cgaWYgdGhlcmUgaXMgYSByZWFsIE9NIHRyZWUgb3IganVzdCBhIGJhY2tpbmcgWE1MU3RyZWFtUmVhZGVyLgotICAgICAgICAgICAgLy8gVGhlIGJlc3Qgd2F5IHRvIHdhbGsgdGhlIGRhdGEgaXMgdG8gZ2V0IHRoZSBYTUxTdHJlYW1SZWFkZXIgYW5kIHVzZSB0aGlzCi0gICAgICAgICAgICAvLyB0byBidWlsZCB0aGUgU09BUEVsZW1lbnRzCi0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyID0gb21FbnZlbG9wZS5nZXRYTUxTdHJlYW1SZWFkZXIoKTsKLQotICAgICAgICAgICAgTmFtZUNyZWF0b3IgbmMgPSBuZXcgTmFtZUNyZWF0b3Ioc29hcEVudmVsb3BlKTsKLSAgICAgICAgICAgIGJ1aWxkU09BUFRyZWUobmMsIHNvYXBFbnZlbG9wZSwgbnVsbCwgcmVhZGVyLCBmYWxzZSk7Ci0gICAgICAgIH0gY2F0Y2ggKFdlYlNlcnZpY2VFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgfSBjYXRjaCAoU09BUEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzb2FwRW52ZWxvcGU7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS51dGlsLlNBQUpDb252ZXJ0ZXIjdG9PTShqYXZheC54bWwuc29hcC5TT0FQRW52ZWxvcGUpCi0gICAgICAqLwotICAgIHB1YmxpYyBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlIHRvT00oU09BUEVudmVsb3BlIHNhYWpFbnZlbG9wZSkgewotICAgICAgICByZXR1cm4gdG9PTShzYWFqRW52ZWxvcGUsIG51bGwpOwotICAgIH0KLSAgICBwdWJsaWMgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZSB0b09NKFNPQVBFbnZlbG9wZSBzYWFqRW52ZWxvcGUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0YWNobWVudHMgYXR0YWNobWVudHMpCi0gICAgICAgICAgICB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgCWlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgIAkgICAgbG9nLmRlYnVnKCJDb252ZXJ0aW5nIFNBQUogU09BUEVudmVsb3BlIHRvIGFuIE9NIFNPQVBFbnZlbG9wZSIpOwotICAgIAl9ICAgIAkKLSAgICAJCi0gICAgCS8vIEJlZm9yZSB3ZSBkbyB0aGUgY29udmVyc2lvbiwgd2UgaGF2ZSB0byBmaXggdGhlIFFOYW1lcyBmb3IgZmF1bHQgZWxlbWVudHMKLSAgICAgICAgX2ZpeEZhdWx0RWxlbWVudHMoc2FhakVudmVsb3BlKTsgICAgICAgIAotICAgICAgICAvLyBHZXQgYSBYTUxTdHJlYW1SZWFkZXIgYmFja2VkIGJ5IGEgU09BUEVsZW1lbnQgdHJlZQotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyID0gbmV3IFNPQVBFbGVtZW50UmVhZGVyKHNhYWpFbnZlbG9wZSk7Ci0gICAgICAgIAotICAgICAgICAvLyBHZXQgYSBTT0FQIE9NIEJ1aWxkZXIuICBQYXNzaW5nIG51bGwgY2F1c2VzIHRoZSB2ZXJzaW9uIHRvIGJlIGF1dG9tYXRpY2FsbHkgdHJpZ2dlcmVkCi0gICAgICAgIFN0QVhTT0FQTW9kZWxCdWlsZGVyIGJ1aWxkZXIgPSBudWxsOwotICAgICAgICBpZiAoYXR0YWNobWVudHMgPT0gbnVsbCkgewotICAgICAgICAgICAgYnVpbGRlciA9IG5ldyBTdEFYU09BUE1vZGVsQnVpbGRlcihyZWFkZXIsIG51bGwpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYnVpbGRlciA9IG5ldyBNVE9NU3RBWFNPQVBNb2RlbEJ1aWxkZXIocmVhZGVyLCBhdHRhY2htZW50cywgbnVsbCk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gQ3JlYXRlIGFuZCByZXR1cm4gdGhlIE9NIEVudmVsb3BlCi0gICAgICAgIG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGUgb21FbnZlbG9wZSA9IGJ1aWxkZXIuZ2V0U09BUEVudmVsb3BlKCk7Ci0gICAgICAgIAotICAgICAgICAvLyBUT0RPIFRoZSBmb2xsb3dpbmcgc3RhdGVtZW50IGV4cGFuZHMgdGhlIE9NIHRyZWUuICBUaGlzIGlzIAotICAgICAgICAvLyBhIGJydXRlIGZvcmNlIHdvcmthcm91bmQgdG8gZ2V0IGFyb3VuZCBhbiBhcHBhcmVudCBidWcgaW4gdGhlIG9tIHNlcmlhbGl6YXRpb24KLSAgICAgICAgLy8gKHRoZSBwdWxsIHN0cmVhbSBwYXJzaW5nIHdhcyBub3QgcHVsbGluZyB0aGUgZmluYWwgdGFnKS4KLSAgICAgICAgLy8gRm91ciB0aGluZ3MgbmVlZCB0byBvY2N1cjoKLSAgICAgICAgLy8gICBhKSBhbmFseXplIGZpeCB0aGUgc2VyaWFsaXphdGlvbi9wdWxsIHN0cmVhbSBwcm9ibGVtLgotICAgICAgICAvLyAgIGIpIGFkZCBhIG1ldGhvZCBzaWduYXR1cmUgdG8gYWxsb3cgdGhlIGNhbGxlciB0byByZXF1ZXN0IGJ1aWxkIG9yIG5vIGJ1aWxkCi0gICAgICAgIC8vICAgYykgYWRkIGEgbWV0aG9kIHNpZ25hdHVyZSB0byBhbGxvdyB0aGUgY2FsbGVyIHRvIGVuYWJsZS9kaXNhYmxlIGNhY2hpbmcKLSAgICAgICAgLy8gICBkKSBwb3NzaWJseSBhZGQgYW4gb3B0aW1pemF0aW9uIHRvIHVzZSBPTVNFIGZvciB0aGUgYm9keSBlbGVtZW50cy4uLnRvIGZsYXR0ZW4gdGhlIHRyZWUuCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBvbUVudmVsb3BlLmJ1aWxkKCk7Ci0gICAgICAgIH0gY2F0Y2ggKE9NRXhjZXB0aW9uIGV4KXsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgLy8gTGV0J3MgdHJ5IHRvIHNlZSBpZiB3ZSBjYW4gc2F2ZSB0aGUgZW52ZWxvcGUgYXMgYSBzdHJpbmcKLSAgICAgICAgICAgICAgICAvLyBhbmQgdGhlbiBtYWtlIGl0IGludG8gYXhpb20gU09BUEVudmVsb3BlCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRvT00odG9TdHJpbmcoc2FhakVudmVsb3BlKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChUcmFuc2Zvcm1lckV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gb21FbnZlbG9wZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGUgdG9PTShTdHJpbmcgeG1sKQotICAgICAgICAgICAgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oeG1sLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gR2V0IGEgU09BUCBPTSBCdWlsZGVyLiAgUGFzc2luZyBudWxsIGNhdXNlcyB0aGUgdmVyc2lvbiB0byBiZSBhdXRvbWF0aWNhbGx5IHRyaWdnZXJlZAotICAgICAgICBTdEFYU09BUE1vZGVsQnVpbGRlciBidWlsZGVyID0gbmV3IFN0QVhTT0FQTW9kZWxCdWlsZGVyKHJlYWRlciwgbnVsbCk7Ci0gICAgICAgIC8vIENyZWF0ZSBhbmQgcmV0dXJuIHRoZSBPTSBFbnZlbG9wZQotICAgICAgICByZXR1cm4gYnVpbGRlci5nZXRTT0FQRW52ZWxvcGUoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyB0b1N0cmluZyhTT0FQRW52ZWxvcGUgc2FhakVudmVsb3BlKSB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24gewotICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgVHJhbnNmb3JtZXIgdGY7Ci0gICAgICAgIHRmID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3VHJhbnNmb3JtZXIoKTsKLSAgICAgICAgdGYudHJhbnNmb3JtKG5ldyBET01Tb3VyY2Uoc2FhakVudmVsb3BlLmdldE93bmVyRG9jdW1lbnQoKSksIG5ldyBTdHJlYW1SZXN1bHQoYmFvcykpOwotICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhiYW9zLnRvQnl0ZUFycmF5KCkpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UudXRpbC5TQUFKQ29udmVydGVyI3RvT00oamF2YXgueG1sLnNvYXAuU09BUEVsZW1lbnQpCi0gICAgICAqLwotICAgIHB1YmxpYyBPTUVsZW1lbnQgdG9PTShTT0FQRWxlbWVudCBzb2FwRWxlbWVudCkgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgIAlpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAJCWxvZy5kZWJ1ZygiQ29udmVydGluZyBTQUFKIFNPQVBFbGVtZW50IHRvIGFuIE9NRWxlbWVudCIpOwotICAgIAl9Ci0gICAgCQotICAgICAgICAvLyBHZXQgYSBYTUxTdHJlYW1SZWFkZXIgYmFja2VkIGJ5IGEgU09BUEVsZW1lbnQgdHJlZQotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyID0gbmV3IFNPQVBFbGVtZW50UmVhZGVyKHNvYXBFbGVtZW50KTsKLSAgICAgICAgLy8gR2V0IGEgT00gQnVpbGRlci4KLSAgICAgICAgU3RBWE9NQnVpbGRlciBidWlsZGVyID0gbmV3IFN0QVhPTUJ1aWxkZXIocmVhZGVyKTsKLSAgICAgICAgLy8gQ3JlYXRlIGFuZCByZXR1cm4gdGhlIEVsZW1lbnQKLSAgICAgICAgT01FbGVtZW50IG9tID0gYnVpbGRlci5nZXREb2N1bWVudEVsZW1lbnQoKTsKLSAgICAgICAgLy8gVE9ETyBUaGUgZm9sbG93aW5nIHN0YXRlbWVudCBleHBhbmRzIHRoZSBPTSB0cmVlLiAgVGhpcyBpcyAKLSAgICAgICAgLy8gYSBicnV0ZSBmb3JjZSB3b3JrYXJvdW5kIHRvIGdldCBhcm91bmQgYW4gYXBwYXJlbnQgYnVnIGluIHRoZSBvbSBzZXJpYWxpemF0aW9uCi0gICAgICAgIC8vICh0aGUgcHVsbCBzdHJlYW0gcGFyc2luZyB3YXMgbm90IHB1bGxpbmcgdGhlIGZpbmFsIHRhZykuCi0gICAgICAgIC8vIFRocmVlIHRoaW5ncyBuZWVkIHRvIG9jY3VyOgotICAgICAgICAvLyAgIGEpIGFuYWx5emUgZml4IHRoZSBzZXJpYWxpemF0aW9uL3B1bGwgc3RyZWFtIHByb2JsZW0uCi0gICAgICAgIC8vICAgYikgYWRkIGEgbWV0aG9kIHNpZ25hdHVyZSB0byBhbGxvdyB0aGUgY2FsbGVyIHRvIHJlcXVlc3QgYnVpbGQgb3Igbm8gYnVpbGQKLSAgICAgICAgLy8gICBjKSBhZGQgYSBtZXRob2Qgc2lnbmF0dXJlIHRvIGFsbG93IHRoZSBjYWxsZXIgdG8gZW5hYmxlL2Rpc2FibGUgY2FjaGluZwotICAgICAgICBvbS5idWlsZCgpOwotICAgICAgICByZXR1cm4gb207Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS51dGlsLlNBQUpDb252ZXJ0ZXIjdG9TQUFKKG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50LCBqYXZheC54bWwuc29hcC5TT0FQRWxlbWVudCkKLSAgICAgICovCi0gICAgcHVibGljIFNPQVBFbGVtZW50IHRvU0FBSihPTUVsZW1lbnQgb21FbGVtZW50LCBTT0FQRWxlbWVudCBwYXJlbnQpIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAJaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgCQlsb2cuZGVidWcoIkNvbnZlcnRpbmcgT01FbGVtZW50IHRvIGFuIFNBQUogU09BUEVsZW1lbnQiKTsKLSAgICAJfQotICAgIAkKLSAgICAJWE1MU3RyZWFtUmVhZGVyIHJlYWRlciA9IG51bGw7Ci0KLSAgICAgICAgLy8gSWYgdGhlIE9NIGVsZW1lbnQgaXMgbm90IGF0dGFjaGVkIHRvIGEgcGFyc2VyIChidWlsZGVyKSwgdGhlbiB0aGUgT00KLSAgICAgICAgLy8gaXMgYnVpbHQgYW5kIHlvdSBjYW5ub3QgYXNrIGZvciBYTUxTdHJlYW1SZWFkZXJXaXRob3V0Q2FjaGluZy4KLSAgICAgICAgLy8gVGhpcyBpcyBwcm9iYWJseSBhIGJ1ZyBpbiBPTS4gIFlvdSBzaG91bGQgYmUgYWJsZSB0byBhc2sgdGhlIE9NIHdoZXRoZXIKLSAgICAgICAgLy8gY2FjaGluZyBpcyBzdXBwb3J0ZWQuCi0gICAgICAgIGlmIChvbUVsZW1lbnQuZ2V0QnVpbGRlcigpID09IG51bGwpIHsKLSAgICAgICAgICAgIHJlYWRlciA9IG9tRWxlbWVudC5nZXRYTUxTdHJlYW1SZWFkZXIoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJlYWRlciA9IG9tRWxlbWVudC5nZXRYTUxTdHJlYW1SZWFkZXJXaXRob3V0Q2FjaGluZygpOwotICAgICAgICB9Ci0gICAgICAgIFNPQVBFbGVtZW50IGVudiA9IHBhcmVudDsKLSAgICAgICAgd2hpbGUgKGVudiAhPSBudWxsICYmICEoZW52IGluc3RhbmNlb2YgU09BUEVudmVsb3BlKSkgewotICAgICAgICAgICAgZW52ID0gZW52LmdldFBhcmVudEVsZW1lbnQoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZW52ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkKLSAgICAgICAgICAgICAgICAgICAgLm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoIlNBQUpDb252ZXJ0ZXJFcnIxIikpOwotICAgICAgICB9Ci0gICAgICAgIE5hbWVDcmVhdG9yIG5jID0gbmV3IE5hbWVDcmVhdG9yKChTT0FQRW52ZWxvcGUpZW52KTsKLSAgICAgICAgcmV0dXJuIGJ1aWxkU09BUFRyZWUobmMsIG51bGwsIHBhcmVudCwgcmVhZGVyLCBmYWxzZSk7Ci0gICAgfQotCi0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLnV0aWwuU0FBSkNvbnZlcnRlciN0b1NBQUoob3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQsIGphdmF4LnhtbC5zb2FwLlNPQVBFbGVtZW50LCBqYXZheC54bWwuc29hcC5TT0FQRmFjdG9yeSkKLSAgICAgICovCi0gICAgcHVibGljIFNPQVBFbGVtZW50IHRvU0FBSihPTUVsZW1lbnQgb21FbGVtZW50LCBTT0FQRWxlbWVudCBwYXJlbnQsIFNPQVBGYWN0b3J5IHNmKQotICAgICAgICAgICAgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgIAlpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAJCWxvZy5kZWJ1ZygiQ29udmVydGluZyBPTUVsZW1lbnQgdG8gYW4gU0FBSiBTT0FQRWxlbWVudCIpOwotICAgIAl9Ci0gICAgCQotICAgIAlYTUxTdHJlYW1SZWFkZXIgcmVhZGVyID0gbnVsbDsKLQotICAgICAgICAvLyBJZiB0aGUgT00gZWxlbWVudCBpcyBub3QgYXR0YWNoZWQgdG8gYSBwYXJzZXIgKGJ1aWxkZXIpLCB0aGVuIHRoZSBPTQotICAgICAgICAvLyBpcyBidWlsdCBhbmQgeW91IGNhbm5vdCBhc2sgZm9yIFhNTFN0cmVhbVJlYWRlcldpdGhvdXRDYWNoaW5nLgotICAgICAgICAvLyBUaGlzIGlzIHByb2JhYmx5IGEgYnVnIGluIE9NLiAgWW91IHNob3VsZCBiZSBhYmxlIHRvIGFzayB0aGUgT00gd2hldGhlcgotICAgICAgICAvLyBjYWNoaW5nIGlzIHN1cHBvcnRlZC4KLSAgICAgICAgaWYgKG9tRWxlbWVudC5nZXRCdWlsZGVyKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgcmVhZGVyID0gb21FbGVtZW50LmdldFhNTFN0cmVhbVJlYWRlcigpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmVhZGVyID0gb21FbGVtZW50LmdldFhNTFN0cmVhbVJlYWRlcldpdGhvdXRDYWNoaW5nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgTmFtZUNyZWF0b3IgbmMgPSBuZXcgTmFtZUNyZWF0b3Ioc2YpOwotICAgICAgICByZXR1cm4gYnVpbGRTT0FQVHJlZShuYywgbnVsbCwgcGFyZW50LCByZWFkZXIsIGZhbHNlKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIEJ1aWxkIFNPQVBUcmVlIEVpdGhlciB0aGUgcm9vdCBvciB0aGUgcGFyZW50IGlzIG51bGwuIElmIHRoZSByb290IGlzIG51bGwsIGEgbmV3IGVsZW1lbnQgaXMKLSAgICAgKiBjcmVhdGVkIHVuZGVyIHRoZSBwYXJlbnQgdXNpbmcgaW5mb3JtYXRpb24gZnJvbSB0aGUgcmVhZGVyIElmIHRoZSBwYXJlbnQgaXMgbnVsbCwgdGhlIGV4aXN0aW5nCi0gICAgICogcm9vdCBpcyB1cGRhdGVkIHdpdGggdGhlIGluZm9ybWF0aW9uIGZyb20gdGhlIHJlYWRlcgotICAgICAqCi0gICAgICogQHBhcmFtIG5jICAgICAgICAgTmFtZUNyZWF0b3IKLSAgICAgKiBAcGFyYW0gcm9vdCAgICAgICBTT0FQRWxlbWVudCAodGhlIGVsZW1lbnQgdGhhdCByZXByZXNlbnRzIHRoZSBkYXRhIGluIHRoZSByZWFkZXIpCi0gICAgICogQHBhcmFtIHBhcmVudCAgICAgKHRoZSBwYXJlbnQgb2YgdGhlIGVsZW1lbnQgcmVwcmVzZW50ZWQgYnkgdGhlIHJlYWRlcikKLSAgICAgKiBAcGFyYW0gcmVhZGVyICAgICBYTUxTdHJlYW1SZWFkZXIuIHRoZSBmaXJzdCBTVEFSVF9FTEVNRU5UIG1hdGNoZXMgdGhlIHJvb3QKLSAgICAgKiBAcGFyYW0gcXVpdEF0Qm9keSAtIHRydWUgaWYgcXVpdCByZWFkaW5nIGFmdGVyIHRoZSBib2R5IFNUQVJUX0VMRU1FTlQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU09BUEVsZW1lbnQgYnVpbGRTT0FQVHJlZShOYW1lQ3JlYXRvciBuYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT0FQRWxlbWVudCByb290LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPQVBFbGVtZW50IHBhcmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gcXVpdEF0Qm9keSkKLSAgICAgICAgICAgIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHdoaWxlIChyZWFkZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgaW50IGV2ZW50SUQgPSByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgIHN3aXRjaCAoZXZlbnRJRCkgewotICAgICAgICAgICAgICAgICAgICBjYXNlIFhNTFN0cmVhbVJlYWRlci5TVEFSVF9FTEVNRU5UOiB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBmaXJzdCBTVEFSVF9FTEVNRU5UIGRlZmluZXMgdGhlIHByZWZpeCBhbmQgYXR0cmlidXRlcyBvZiB0aGUgcm9vdAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlVGFnRGF0YShuYywgcm9vdCwgcmVhZGVyLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gcm9vdDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gY3JlYXRlRWxlbWVudEZyb21UYWcobmMsIHBhcmVudCwgcmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocm9vdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvb3QgPSBwYXJlbnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHF1aXRBdEJvZHkgJiYgcGFyZW50IGluc3RhbmNlb2YgU09BUEJvZHkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcm9vdDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgWE1MU3RyZWFtUmVhZGVyLkFUVFJJQlVURTogewotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGV2ZW50TmFtZSA9ICJBVFRSSUJVVEUiOwotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdW5leHBlY3RlZEV2ZW50KGV2ZW50TmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXNlIFhNTFN0cmVhbVJlYWRlci5OQU1FU1BBQ0U6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBldmVudE5hbWUgPSAiTkFNRVNQQUNFIjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3VuZXhwZWN0ZWRFdmVudChldmVudE5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBYTUxTdHJlYW1SZWFkZXIuRU5EX0VMRU1FTlQ6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBTT0FQRW52ZWxvcGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50RWxlbWVudCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBYTUxTdHJlYW1SZWFkZXIuQ0hBUkFDVEVSUzogewotICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50LmFkZFRleHROb2RlKHJlYWRlci5nZXRUZXh0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBYTUxTdHJlYW1SZWFkZXIuQ0RBVEE6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudC5hZGRUZXh0Tm9kZShyZWFkZXIuZ2V0VGV4dCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgWE1MU3RyZWFtUmVhZGVyLkNPTU1FTlQ6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNPQVAgcmVhbGx5IGRvZXNuJ3QgaGF2ZSBhbiBhZGVxdWF0ZSByZXByZXNlbnRhdGlvbiBmb3IgY29tbWVudHMuCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgZGVmYWN0byBzdGFuZGFyZCBpcyB0byBhZGQgdGhlIHdob2xlIGVsZW1lbnQgYXMgYSB0ZXh0IG5vZGUuCi0gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQuYWRkVGV4dE5vZGUoIjwhLS0iICsgcmVhZGVyLmdldFRleHQoKSArICItLT4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgWE1MU3RyZWFtUmVhZGVyLlNQQUNFOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQuYWRkVGV4dE5vZGUocmVhZGVyLmdldFRleHQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXNlIFhNTFN0cmVhbVJlYWRlci5TVEFSVF9ET0NVTUVOVDogewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXNlIFhNTFN0cmVhbVJlYWRlci5FTkRfRE9DVU1FTlQ6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIENsb3NlIHJlYWRlciBhbmQgaWdub3JlCi0gICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgWE1MU3RyZWFtUmVhZGVyLlBST0NFU1NJTkdfSU5TVFJVQ1RJT046IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBYTUxTdHJlYW1SZWFkZXIuRU5USVRZX1JFRkVSRU5DRTogewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlLiB0aGlzIGlzIHVuZXhwZWN0ZWQgaW4gYSB3ZWIgc2VydmljZSBtZXNzYWdlCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXNlIFhNTFN0cmVhbVJlYWRlci5EVEQ6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZS4gdGhpcyBpcyB1bmV4cGVjdGVkIGluIGEgd2ViIHNlcnZpY2UgbWVzc2FnZQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3VuZXhwZWN0ZWRFdmVudCgiRXZlbnRJRCAiICsgU3RyaW5nLnZhbHVlT2YoZXZlbnRJRCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoV2ViU2VydmljZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBjYXRjaCAoU09BUEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByb290OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBTT0FQRWxlbWVudCBmcm9tIHRoZSBjdXJyZW50IHRhZyBkYXRhCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmMgICAgIE5hbWVDcmVhdG9yCi0gICAgICogQHBhcmFtIHBhcmVudCBTT0FQRWxlbWVudCBmb3IgdGhlIG5ldyBTT0FQRWxlbWVudAotICAgICAqIEBwYXJhbSByZWFkZXIgWE1MU3RyZWFtUmVhZGVyIHdob3NlIGN1cnNvciBpcyBhdCB0aGUgU1RBUlRfRUxFTUVOVAotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU09BUEVsZW1lbnQgY3JlYXRlRWxlbWVudEZyb21UYWcoTmFtZUNyZWF0b3IgbmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPQVBFbGVtZW50IHBhcmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikKLSAgICAgICAgICAgIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gVW5mb3J0dW5hdGVseSwgdGhlIFNBQUogb2JqZWN0IGlzIGEgcHJvZHVjdCBvZiBib3RoIHRoZQotICAgICAgICAvLyBRTmFtZSBvZiB0aGUgZWxlbWVudCBhbmQgdGhlIHBhcmVudCBvYmplY3QuICBGb3IgZXhhbXBsZSwKLSAgICAgICAgLy8gQWxsIGVsZW1lbnQgY2hpbGRyZW4gb2YgYSBTT0FQQm9keSBtdXN0IGJlIG9iamVjdCdzIHRoYXQgYXJlIFNPQVBCb2R5RWxlbWVudHMuCi0gICAgICAgIC8vIGNyZWF0ZUVsZW1lbnQgY3JlYXRlcyB0aGUgcHJvcGVyIGNoaWxkIGVsZW1lbnQuCi0gICAgICAgIFFOYW1lIHFOYW1lID0gcmVhZGVyLmdldE5hbWUoKTsKLSAgICAgICAgU09BUEVsZW1lbnQgY2hpbGQgPSBjcmVhdGVFbGVtZW50KHBhcmVudCwgcU5hbWUpOwotCi0gICAgICAgIC8vIFVwZGF0ZSB0aGUgdGFnIGRhdGEgb24gdGhlIGNoaWxkCi0gICAgICAgIHVwZGF0ZVRhZ0RhdGEobmMsIGNoaWxkLCByZWFkZXIsIHRydWUpOwotICAgICAgICByZXR1cm4gY2hpbGQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGNoaWxkIFNPQVBFbGVtZW50Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gcGFyZW50IFNPQVBFbGVtZW50Ci0gICAgICogQHBhcmFtIG5hbWUgICBOYW1lCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHByb3RlY3RlZCBTT0FQRWxlbWVudCBjcmVhdGVFbGVtZW50KFNPQVBFbGVtZW50IHBhcmVudCwgUU5hbWUgcU5hbWUpCi0gICAgICAgICAgICB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7Ci0gICAgICAgIFNPQVBFbGVtZW50IGNoaWxkOwotICAgICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgU09BUEVudmVsb3BlKSB7Ci0gICAgICAgICAgICBpZiAocU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkuZXF1YWxzKHBhcmVudC5nZXROYW1lc3BhY2VVUkkoKSkpIHsKLSAgICAgICAgICAgICAgICBpZiAocU5hbWUuZ2V0TG9jYWxQYXJ0KCkuZXF1YWxzKCJCb2R5IikpIHsKLSAgICAgICAgICAgICAgICAgICAgY2hpbGQgPSAoKFNPQVBFbnZlbG9wZSlwYXJlbnQpLmFkZEJvZHkoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBjaGlsZCA9ICgoU09BUEVudmVsb3BlKXBhcmVudCkuYWRkSGVhZGVyKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBjaGlsZCA9IHBhcmVudC5hZGRDaGlsZEVsZW1lbnQocU5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFNPQVBCb2R5KSB7Ci0gICAgICAgICAgICBpZiAocU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkuZXF1YWxzKHBhcmVudC5nZXROYW1lc3BhY2VVUkkoKSkgJiYKLSAgICAgICAgICAgICAgICAgICAgcU5hbWUuZ2V0TG9jYWxQYXJ0KCkuZXF1YWxzKCJGYXVsdCIpKSB7Ci0gICAgICAgICAgICAgICAgY2hpbGQgPSAoKFNPQVBCb2R5KXBhcmVudCkuYWRkRmF1bHQoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgY2hpbGQgPSAoKFNPQVBCb2R5KXBhcmVudCkuYWRkQm9keUVsZW1lbnQocU5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFNPQVBIZWFkZXIpIHsKLSAgICAgICAgICAgIGNoaWxkID0gKChTT0FQSGVhZGVyKXBhcmVudCkuYWRkSGVhZGVyRWxlbWVudChxTmFtZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAocGFyZW50IGluc3RhbmNlb2YgU09BUEZhdWx0KSB7Ci0gICAgICAgICAgICAvLyBUaGlzIGNhbGwgYXNzdW1lcyB0aGF0IHRoZSBhZGRDaGlsZEVsZW1lbnQgaW1wbGVtZW50YXRpb24KLSAgICAgICAgICAgIC8vIGlzIHNtYXJ0IGVub3VnaCB0byBhZGQgIkRldGFpbCIgb3IgIlNPQVBGYXVsdEVsZW1lbnQiIG9iamVjdHMuCi0gICAgICAgICAgICBjaGlsZCA9IHBhcmVudC5hZGRDaGlsZEVsZW1lbnQocU5hbWUpOwotICAgICAgICB9IGVsc2UgaWYgKHBhcmVudCBpbnN0YW5jZW9mIERldGFpbCkgewotICAgICAgICAgICAgY2hpbGQgPSAoKERldGFpbClwYXJlbnQpLmFkZERldGFpbEVudHJ5KHFOYW1lKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNoaWxkID0gcGFyZW50LmFkZENoaWxkRWxlbWVudChxTmFtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gY2hpbGQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogdXBkYXRlIHRoZSB0YWcgZGF0YSBvZiB0aGUgU09BUEVsZW1lbnQKLSAgICAgKgotICAgICAqIEBwYXJhbSBOYW1lQ3JlYXRvciBuYwotICAgICAqIEBwYXJhbSBlbGVtZW50ICAgICBTT0FQRWxlbWVudAotICAgICAqIEBwYXJhbSByZWFkZXIgICAgICBYTUxTdHJlYW1SZWFkZXIgd2hvc2UgY3Vyc29yIGlzIGF0IFNUQVJUX0VMRU1FTlQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVUYWdEYXRhKE5hbWVDcmVhdG9yIG5jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09BUEVsZW1lbnQgZWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciByZWFkZXIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBuZXdFbGVtZW50KSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBwcmVmaXggPSByZWFkZXIuZ2V0UHJlZml4KCk7Ci0gICAgICAgIHByZWZpeCA9IChwcmVmaXggPT0gbnVsbCkgPyAiIiA6IHByZWZpeDsKLQotICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIHByZWZpeCBpcyBjb3JyZWN0Ci0gICAgICAgIGlmIChwcmVmaXgubGVuZ3RoKCkgPiAwICYmICFlbGVtZW50LmdldFByZWZpeCgpLmVxdWFscyhwcmVmaXgpKSB7Ci0gICAgICAgICAgICAvLyBEdWUgdG8gYSBidWcgaW4gQXhpb20gRE9NIG9yIGluIHRoZSByZWFkZXIuLi5ub3Qgc3VyZSB3aGVyZSB5ZXQsCi0gICAgICAgICAgICAvLyB0aGVyZSBtYXkgYmUgYSBub24tbnVsbCBwcmVmaXggYW5kIG5vIG5hbWVzcGFjZQotICAgICAgICAgICAgU3RyaW5nIG5zID0gcmVhZGVyLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgaWYgKG5zICE9IG51bGwgJiYgbnMubGVuZ3RoKCkgIT0gMCkgewotICAgICAgICAgICAgICAgIGVsZW1lbnQuc2V0UHJlZml4KHByZWZpeCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKCFuZXdFbGVtZW50KSB7ICAgIAotICAgICAgICAgICAgLy8gQWRkIHRoZSBuYW1lc3BhY2UgZGVjbGFyYXRpb25zIGZyb20gdGhlIHJlYWRlciBmb3IgdGhlIG1pc3NpbmcgbmFtZXNwYWNlcwotICAgICAgICAgICAgaW50IHNpemUgPSByZWFkZXIuZ2V0TmFtZXNwYWNlQ291bnQoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxzaXplOyBpKyspIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcHJlID0gcmVhZGVyLmdldE5hbWVzcGFjZVByZWZpeChpKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbnMgPSByZWFkZXIuZ2V0TmFtZXNwYWNlVVJJKGkpOwotICAgICAgICAgICAgICAgIFN0cmluZyBleGlzdGluZ05TID0gZWxlbWVudC5nZXROYW1lc3BhY2VVUkkocHJlKTsKLSAgICAgICAgICAgICAgICBpZiAoIW5zLmVxdWFscyhleGlzdGluZ05TKSkgewotICAgICAgICAgICAgICAgICAgICBlbGVtZW50LnJlbW92ZU5hbWVzcGFjZURlY2xhcmF0aW9uKHByZSk7ICAvLyBJcyBpdCBuZWNlc3NhcnkgdG8gcmVtb3ZlIHRoZSBleGlzdGluZyBwcmVmaXgvbnMKLSAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5hZGROYW1lc3BhY2VEZWNsYXJhdGlvbihwcmUsIG5zKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBBZGQgdGhlIG5hbWVzcGFjZSBkZWNsYXJhdGlvbnMgZnJvbSB0aGUgcmVhZGVyCi0gICAgICAgICAgICBpbnQgc2l6ZSA9IHJlYWRlci5nZXROYW1lc3BhY2VDb3VudCgpOwotICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPHNpemU7IGkrKykgewotICAgICAgICAgICAgICAgIGVsZW1lbnQuYWRkTmFtZXNwYWNlRGVjbGFyYXRpb24ocmVhZGVyLmdldE5hbWVzcGFjZVByZWZpeChpKSwgcmVhZGVyLmdldE5hbWVzcGFjZVVSSShpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBhZGRBdHRyaWJ1dGVzKG5jLCBlbGVtZW50LCByZWFkZXIpOwotCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBhZGQgYXR0cmlidXRlcwotICAgICAqCi0gICAgICogQHBhcmFtIE5hbWVDcmVhdG9yIG5jCi0gICAgICogQHBhcmFtIGVsZW1lbnQgICAgIFNPQVBFbGVtZW50IHdoaWNoIGlzIHRoZSB0YXJnZXQgb2YgdGhlIG5ldyBhdHRyaWJ1dGVzCi0gICAgICogQHBhcmFtIHJlYWRlciAgICAgIFhNTFN0cmVhbVJlYWRlciB3aG9zZSBjdXJzb3IgaXMgYXQgU1RBUlRfRUxFTUVOVAotICAgICAqIEB0aHJvd3MgU09BUEV4Y2VwdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGFkZEF0dHJpYnV0ZXMoTmFtZUNyZWF0b3IgbmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT0FQRWxlbWVudCBlbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgdGhyb3dzIFNPQVBFeGNlcHRpb24gewotCi0gICAgICAgIC8vIEFkZCB0aGUgYXR0cmlidXRlcyBmcm9tIHRoZSByZWFkZXIKLSAgICAgICAgaW50IHNpemUgPSByZWFkZXIuZ2V0QXR0cmlidXRlQ291bnQoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgICAgIFFOYW1lIHFOYW1lID0gcmVhZGVyLmdldEF0dHJpYnV0ZU5hbWUoaSk7Ci0gICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gcmVhZGVyLmdldEF0dHJpYnV0ZVByZWZpeChpKTsKLSAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZShpKTsKLSAgICAgICAgICAgIE5hbWUgbmFtZSA9IG5jLmNyZWF0ZU5hbWUocU5hbWUuZ2V0TG9jYWxQYXJ0KCksIHByZWZpeCwgcU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgICAgICAgICAgZWxlbWVudC5hZGRBdHRyaWJ1dGUobmFtZSwgdmFsdWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIF91bmV4cGVjdGVkRXZlbnQoU3RyaW5nIGV2ZW50KSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkKLSAgICAgICAgICAgICAgICAubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiU0FBSkNvbnZlcnRlckVycjIiLCBldmVudCkpOwotICAgIH0KLSAgICAKLSAgICAKLSAgICAvKgotICAgICAqIEEgdXRpbGl0eSBtZXRob2QgdG8gZml4IHRoZSBsb2NhbG5hbWVzIG9mIGVsZW1lbnRzIHdpdGggYW4gQXhpczIgU0FBSgotICAgICAqIHRyZWUuICBUaGUgU0FBSiBpbXBsIHJlbGllcyBvbiB0aGUgQXhpb20gU09BUCBBUElzLCB3aGljaCByZXByZXNlbnQgCi0gICAgICogYWxsIGZhdWx0cyBhcyBTT0FQIDEuMi4gIFRoaXMgaGFzIHRvIGJlIGNvcnJlY3RlZCBiZWZvcmUgd2UgY2FuIGNvbnZlcnQKLSAgICAgKiB0byBPTSBvciB0aGUgZmF1bHRzIHdpbGwgbm90IGJlIGhhbmRsZWQgY29ycmVjdGx5LiAKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgX2ZpeEZhdWx0RWxlbWVudHMoU09BUEVudmVsb3BlIGVudikgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSBhIFNPQVAgMS4yIGVudmVsb3BlLCB0aGVuIHRoZXJlJ3Mgbm90aGluZyB0byBkby4KLSAgICAgICAgICAgIGlmIChlbnYuZ2V0TmFtZXNwYWNlVVJJKCkuZXF1YWxzKFNPQVAxMkNvbnN0YW50cy5TT0FQX0VOVkVMT1BFX05BTUVTUEFDRV9VUkkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBTT0FQQm9keSBib2R5ID0gZW52LmdldEJvZHkoKTsKLSAgICAgICAgICAgIGlmIChib2R5ICE9IG51bGwgJiYgIWJvZHkuaGFzRmF1bHQoKSkgewotICAgICAgICAgICAgCWlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgCQlsb2cuZGVidWcoIk5vIGZhdWx0IGZvdW5kLiAgTm8gY29udmVyc2lvbiBuZWNlc3NhcnkuIik7Ci0gICAgICAgICAgICAJfQotICAgICAgICAgICAgCXJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGJvZHkgIT0gbnVsbCAmJiBib2R5Lmhhc0ZhdWx0KCkpIHsKLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAJbG9nLmRlYnVnKCJBIGZhdWx0IHdhcyBmb3VuZC4gIENvbnZlcnRpbmcgdGhlIGZhdWx0IGNoaWxkIGVsZW1lbnRzIHRvIFNPQVAgMS4xIGZvcm1hdCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAkKLSAgICAgICAgICAgIAlTT0FQRmF1bHQgZmF1bHQgPSBib2R5LmdldEZhdWx0KCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgSXRlcmF0b3IgaXRyID0gZmF1bHQuZ2V0Q2hpbGRFbGVtZW50cygpOwotICAgICAgICAgICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFNPQVBFbGVtZW50IHNlID0gKFNPQVBFbGVtZW50KSBpdHIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoc2UuZ2V0TG9jYWxOYW1lKCkuZXF1YWxzKFNPQVAxMkNvbnN0YW50cy5TT0FQX0ZBVUxUX0NPREVfTE9DQUxfTkFNRSkpIHsgCi0gICAgICAgICAgICAgICAgICAgIAlpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgCQlsb2cuZGVidWcoIkNvbnZlcnRpbmc6IGZhdWx0Y29kZSIpOwotICAgICAgICAgICAgICAgICAgICAJfQotICAgICAgICAgICAgICAgICAgICAJLy8gQXhpczIgU0FBSiBzdG9yZXMgdGhlIGFjdXRhbCBmYXVsdGNvZGUgdGV4dCB1bmRlciBhIFNPQVBGYXVsdFZhbHVlIG9iamVjdCwgc28gd2UgaGF2ZSB0byAKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldCB0aGF0IGFuZCBhZGQgaXQgYXMgYSB0ZXh0IG5vZGUgdW5kZXIgdGhlIG9yaWdpbmFsIGVsZW1lbnQuCi0gICAgICAgICAgICAgICAgICAgICAgICBOb2RlIHZhbHVlID0gc2UuZ2V0Rmlyc3RDaGlsZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUgaW5zdGFuY2VvZiBvcmcuYXBhY2hlLmF4aXMyLnNhYWouU09BUEVsZW1lbnRJbXBsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5zYWFqLlNPQVBFbGVtZW50SW1wbCB2YWx1ZUVsZW1lbnQgPSAob3JnLmFwYWNoZS5heGlzMi5zYWFqLlNPQVBFbGVtZW50SW1wbCkgdmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRWxlbWVudEltcGwgZSA9IHZhbHVlRWxlbWVudC5nZXRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNvbnRlbnQgPSBlLmdldFRleHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT0FQRWxlbWVudCBjaGlsZCA9IGZhdWx0LmFkZENoaWxkRWxlbWVudChuZXcgUU5hbWUoc2UuZ2V0TmFtZXNwYWNlVVJJKCksIFNPQVAxMUNvbnN0YW50cy5TT0FQX0ZBVUxUX0NPREVfTE9DQUxfTkFNRSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLmFkZFRleHROb2RlKGNvbnRlbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlLmRldGFjaE5vZGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzZS5nZXRMb2NhbE5hbWUoKS5lcXVhbHMoU09BUDEyQ29uc3RhbnRzLlNPQVBfRkFVTFRfREVUQUlMX0xPQ0FMX05BTUUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIAlpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgCQlsb2cuZGVidWcoIkNvbnZlcnRpbmc6IGRldGFpbCIpOwotICAgICAgICAgICAgICAgICAgICAJfQotICAgICAgICAgICAgICAgICAgICAgICAgc2Uuc2V0RWxlbWVudFFOYW1lKG5ldyBRTmFtZShzZS5nZXROYW1lc3BhY2VVUkkoKSwgU09BUDExQ29uc3RhbnRzLlNPQVBfRkFVTFRfREVUQUlMX0xPQ0FMX05BTUUpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzZS5nZXRMb2NhbE5hbWUoKS5lcXVhbHMoU09BUDEyQ29uc3RhbnRzLlNPQVBfRkFVTFRfUkVBU09OX0xPQ0FMX05BTUUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIAlpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgCQlsb2cuZGVidWcoIkNvbnZlcnRpbmc6IGZhdWx0c3RyaW5nIik7Ci0gICAgICAgICAgICAgICAgICAgIAl9Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZS5zZXRFbGVtZW50UU5hbWUobmV3IFFOYW1lKHNlLmdldE5hbWVzcGFjZVVSSSgpLCBTT0FQMTFDb25zdGFudHMuU09BUF9GQVVMVF9TVFJJTkdfTE9DQUxfTkFNRSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXhpczIgU0FBSiBzdG9yZXMgdGhlIGFjdXRhbCBmYXVsdHN0cmluZyB0ZXh0IHVuZGVyIGEgU09BUEZhdWx0VmFsdWUgb2JqZWN0LCBzbyB3ZSBoYXZlIHRvIAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IHRoYXQgYW5kIGFkZCBpdCBhcyBhIHRleHQgbm9kZSB1bmRlciB0aGUgb3JpZ2luYWwgZWxlbWVudC4KLSAgICAgICAgICAgICAgICAgICAgICAgIE5vZGUgdmFsdWUgPSBzZS5nZXRGaXJzdENoaWxkKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZSBpbnN0YW5jZW9mIG9yZy5hcGFjaGUuYXhpczIuc2Fhai5TT0FQRWxlbWVudEltcGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLnNhYWouU09BUEVsZW1lbnRJbXBsIHZhbHVlRWxlbWVudCA9IChvcmcuYXBhY2hlLmF4aXMyLnNhYWouU09BUEVsZW1lbnRJbXBsKSB2YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50SW1wbCBlID0gdmFsdWVFbGVtZW50LmdldEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY29udGVudCA9IGUuZ2V0VGV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU09BUEVsZW1lbnQgY2hpbGQgPSBmYXVsdC5hZGRDaGlsZEVsZW1lbnQobmV3IFFOYW1lKHNlLmdldE5hbWVzcGFjZVVSSSgpLCBTT0FQMTFDb25zdGFudHMuU09BUF9GQVVMVF9TVFJJTkdfTE9DQUxfTkFNRSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLmFkZFRleHROb2RlKGNvbnRlbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlLmRldGFjaE5vZGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoU09BUEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIAlpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgCQlsb2cuZGVidWcoIkFuIGVycm9yIG9jY3VyZWQgd2hpbGUgY29udmVydGluZyBmYXVsdCBlbGVtZW50czogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgCX0KLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBIE5hbWUgY2FuIGJlIGNyZWF0ZWQgZnJvbSBlaXRoZXIgYSBTT0FQRW52ZWxvcGUgb3IgU09BUEZhY3RvcnkuIEVpdGhlciBvbmUgb3IgdGhlIG90aGVyIGlzCi0gICAgICogYXZhaWxhYmxlIHdoZW4gdGhlIGNvbnZlcnRlciBpcyBjYWxsZWQuIE5hbWVDcmVhdG9yIHByb3ZpZGVzIGEgbGV2ZWwgb2YgYWJzdHJhY3Rpb24gd2hpY2gKLSAgICAgKiBzaW1wbGlmaWVzIHRoZSBjb2RlLgotICAgICAqLwotICAgIHByb3RlY3RlZCBjbGFzcyBOYW1lQ3JlYXRvciB7Ci0gICAgICAgIHByaXZhdGUgU09BUEVudmVsb3BlIGVudiA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgU09BUEZhY3Rvcnkgc2YgPSBudWxsOwotCi0gICAgICAgIHB1YmxpYyBOYW1lQ3JlYXRvcihTT0FQRW52ZWxvcGUgZW52KSB7Ci0gICAgICAgICAgICB0aGlzLmVudiA9IGVudjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBOYW1lQ3JlYXRvcihTT0FQRmFjdG9yeSBzZikgewotICAgICAgICAgICAgdGhpcy5zZiA9IHNmOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENyZWF0ZXMgYSBOYW1lCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBsb2NhbE5hbWUKLSAgICAgICAgICogQHBhcmFtIHByZWZpeAotICAgICAgICAgKiBAcGFyYW0gdXJpCi0gICAgICAgICAqIEByZXR1cm4gTmFtZQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIE5hbWUgY3JlYXRlTmFtZShTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcHJlZml4LCBTdHJpbmcgdXJpKQotICAgICAgICAgICAgICAgIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGlmIChzZiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHNmLmNyZWF0ZU5hbWUobG9jYWxOYW1lLCBwcmVmaXgsIHVyaSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBlbnYuY3JlYXRlTmFtZShsb2NhbE5hbWUsIHByZWZpeCwgdXJpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHVibGljIE1lc3NhZ2VGYWN0b3J5IGNyZWF0ZU1lc3NhZ2VGYWN0b3J5KFN0cmluZyBuYW1lc3BhY2UpCi0gICAgICAgICAgICB0aHJvd3MgU09BUEV4Y2VwdGlvbiwgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBTQUFKRmFjdG9yeS5jcmVhdGVNZXNzYWdlRmFjdG9yeShuYW1lc3BhY2UpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvdXRpbC9pbXBsL1hNTFN0cmVhbVJlYWRlckZyb21ET00uamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvdXRpbC9pbXBsL1hNTFN0cmVhbVJlYWRlckZyb21ET00uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY3MmFhZC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL3V0aWwvaW1wbC9YTUxTdHJlYW1SZWFkZXJGcm9tRE9NLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MzggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS51dGlsLmltcGw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmkxOG4uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5DREFUQVNlY3Rpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uQ2hhcmFjdGVyRGF0YTsKLWltcG9ydCBvcmcudzNjLmRvbS5Db21tZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50VHlwZTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVudGl0eVJlZmVyZW5jZTsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuTmFtZXNwYWNlQ29udGV4dDsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uTG9jYXRpb247Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotLyoqCi0gKiBYTUxTdHJlYW1SZWFkZXIgY3JlYXRlZCBmcm9tIHdhbGtpbmcgYSBET00uIFRoaXMgaXMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgdXNlZCBieQotICogU09BUEVsZW1lbnRSZWFkZXIuCi0gKgotICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnV0aWwuU09BUEVsZW1lbnRSZWFkZXIKLSAqLwotcHVibGljIGNsYXNzIFhNTFN0cmVhbVJlYWRlckZyb21ET00gaW1wbGVtZW50cyBYTUxTdHJlYW1SZWFkZXIgewotCi0gICAgcHJpdmF0ZSBOb2RlIGN1cnNvcjsKLSAgICBwcml2YXRlIFN0YWNrPE5vZGU+IG5leHRDdXJzb3JTdGFjayA9IG5ldyBTdGFjazxOb2RlPigpOwotICAgIHByaXZhdGUgTm9kZSByb290OwotICAgIHByaXZhdGUgaW50IGV2ZW50ID0gWE1MU3RyZWFtUmVhZGVyLlNUQVJUX0RPQ1VNRU5UOwotICAgIHByaXZhdGUgTm9kZSBuZXh0Q3Vyc29yID0gbnVsbDsKLSAgICBwcml2YXRlIGludCBuZXh0RXZlbnQgPSAtMTsKLQotICAgIHByaXZhdGUgTmFtZXNwYWNlQ29udGV4dEZyb21ET00gY2FjaGVOQ0kgPSBudWxsOwotICAgIHByaXZhdGUgRWxlbWVudCBjYWNoZU5DSUtleSA9IG51bGw7Ci0KLSAgICBwcml2YXRlIExpc3QgY2FjaGVORCA9IG51bGw7Ci0gICAgcHJpdmF0ZSBFbGVtZW50IGNhY2hlTkRLZXkgPSBudWxsOwotCi0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgdGhlIFhNTFN0cmVhbVJlYWRlciB3aXRoIGFuIEVudmVsb3BlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZW52ZWxvcGUgRWxlbWVudCAocHJvYmFibHkgYW4gU0FBSiBTT0FQRW52ZWxvcGUpIHJlcHJlc2VudGluZyB0aGUgRW52ZWxvcGUKLSAgICAgKi8KLSAgICBwdWJsaWMgWE1MU3RyZWFtUmVhZGVyRnJvbURPTShFbGVtZW50IGVudmVsb3BlKSB7Ci0gICAgICAgIHJvb3QgPSBlbnZlbG9wZTsKLSAgICAgICAgY3Vyc29yID0gcm9vdDsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIjZ2V0UHJvcGVydHkoamF2YS5sYW5nLlN0cmluZykKLSAgICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcga2V5KSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGtleSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoIlhNTFNSRXJyMSIpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIjbmV4dCgpCi0gICAgICAqLwotICAgIHB1YmxpYyBpbnQgbmV4dCgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBpZiAoIWhhc05leHQoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFhNTFN0cmVhbUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJYTUxTUkVycjIiKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZ2V0TmV4dCgpOwotICAgICAgICBjdXJzb3IgPSBuZXh0Q3Vyc29yOwotICAgICAgICBldmVudCA9IG5leHRFdmVudDsKLSAgICAgICAgcmV0dXJuIGV2ZW50OwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciNyZXF1aXJlKGludCwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLSAgICAgICovCi0gICAgcHVibGljIHZvaWQgcmVxdWlyZShpbnQgZXZlbnQsIFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBsb2NhbFBhcnQpCi0gICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChldmVudCAhPSB0aGlzLmV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhNTFN0cmVhbUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJYTUxTUkVycjMiLCBTdHJpbmcudmFsdWVPZihldmVudCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKHRoaXMuZXZlbnQpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobmFtZXNwYWNlICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAgICAgIW5hbWVzcGFjZS5lcXVhbHMoY3Vyc29yLmdldE5hbWVzcGFjZVVSSSgpKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBYTUxTdHJlYW1FeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRNZXNzYWdlKCJYTUxTUkVycjMiLCBuYW1lc3BhY2UsIHRoaXMuY3Vyc29yLmdldE5hbWVzcGFjZVVSSSgpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobG9jYWxQYXJ0ICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAgICAgIWxvY2FsUGFydC5lcXVhbHMoY3Vyc29yLmdldExvY2FsTmFtZSgpKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBYTUxTdHJlYW1FeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRNZXNzYWdlKCJYTUxTUkVycjMiLCBsb2NhbFBhcnQsIHRoaXMuY3Vyc29yLmdldExvY2FsTmFtZSgpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFhNTFN0cmVhbUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciNnZXRFbGVtZW50VGV4dCgpCi0gICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudFRleHQoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGV2ZW50ID09IFhNTFN0cmVhbVJlYWRlci5TVEFSVF9FTEVNRU5UKSB7Ci0gICAgICAgICAgICBuZXh0KCk7Ci0gICAgICAgICAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgd2hpbGUgKGV2ZW50ICE9IFhNTFN0cmVhbVJlYWRlci5FTkRfRUxFTUVOVCkgewotICAgICAgICAgICAgICAgIGlmIChldmVudCA9PSBYTUxTdHJlYW1SZWFkZXIuQ0hBUkFDVEVSUyB8fAotICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQgPT0gWE1MU3RyZWFtUmVhZGVyLkNEQVRBIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBldmVudCA9PSBYTUxTdHJlYW1SZWFkZXIuU1BBQ0UgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50ID09IFhNTFN0cmVhbVJlYWRlci5FTlRJVFlfUkVGRVJFTkNFKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoZ2V0VGV4dCgpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50ID09IFhNTFN0cmVhbVJlYWRlci5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBldmVudCA9PSBYTUxTdHJlYW1SZWFkZXIuQ09NTUVOVCkgewotICAgICAgICAgICAgICAgICAgICAvLyB3aGl0ZXNwYWNlCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhNTFN0cmVhbUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRNZXNzYWdlKCJYTUxTUkVycjQiLCAiZ2V0RWxlbWVudFRleHQoKSIpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbmV4dCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotICAgICAgICB9Ci0gICAgICAgIHRocm93IG5ldyBYTUxTdHJlYW1FeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiWE1MU1JFcnI0IiwgImdldEVsZW1lbnRUZXh0KCkiKSk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyI25leHRUYWcoKQotICAgICAgKi8KLSAgICBwdWJsaWMgaW50IG5leHRUYWcoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgbmV4dCgpOwotICAgICAgICB3aGlsZSAoZXZlbnQgPT0gWE1MU3RyZWFtUmVhZGVyLkNIQVJBQ1RFUlMgJiYgaXNXaGl0ZVNwYWNlKCkgfHwKLSAgICAgICAgICAgICAgICBldmVudCA9PSBYTUxTdHJlYW1SZWFkZXIuQ0RBVEEgJiYgaXNXaGl0ZVNwYWNlKCkgfHwKLSAgICAgICAgICAgICAgICBldmVudCA9PSBYTUxTdHJlYW1SZWFkZXIuU1BBQ0UgfHwKLSAgICAgICAgICAgICAgICBldmVudCA9PSBYTUxTdHJlYW1SZWFkZXIuUFJPQ0VTU0lOR19JTlNUUlVDVElPTiB8fAotICAgICAgICAgICAgICAgIGV2ZW50ID09IFhNTFN0cmVhbVJlYWRlci5DT01NRU5UKSB7Ci0gICAgICAgICAgICBldmVudCA9IG5leHQoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZXZlbnQgPT0gWE1MU3RyZWFtUmVhZGVyLlNUQVJUX0VMRU1FTlQgfHwKLSAgICAgICAgICAgICAgICBldmVudCA9PSBYTUxTdHJlYW1SZWFkZXIuRU5EX0VMRU1FTlQpIHsKLSAgICAgICAgICAgIHJldHVybiBldmVudDsKLSAgICAgICAgfQotICAgICAgICB0aHJvdyBuZXcgWE1MU3RyZWFtRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoIlhNTFNSRXJyNCIsICJuZXh0VGFnKCkiKSk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyI2hhc05leHQoKQotICAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiAoZXZlbnQgIT0gWE1MU3RyZWFtUmVhZGVyLkVORF9ET0NVTUVOVCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyI2Nsb3NlKCkKLSAgICAgICovCi0gICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciNnZXROYW1lc3BhY2VVUkkoamF2YS5sYW5nLlN0cmluZykKLSAgICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VVUkkoU3RyaW5nIHByZWZpeCkgewotICAgICAgICBpZiAoY3Vyc29yIGluc3RhbmNlb2YgRWxlbWVudCkgewotICAgICAgICAgICAgcmV0dXJuIGdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KTsKLSAgICAgICAgfQotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoIlhNTFNSRXJyNCIsICJnZXROYW1lc3BhY2VVUkkoU3RyaW5nKSIpKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIjaXNTdGFydEVsZW1lbnQoKQotICAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1N0YXJ0RWxlbWVudCgpIHsKLSAgICAgICAgcmV0dXJuIChldmVudCA9PSBYTUxTdHJlYW1SZWFkZXIuU1RBUlRfRUxFTUVOVCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyI2lzRW5kRWxlbWVudCgpCi0gICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRW5kRWxlbWVudCgpIHsKLSAgICAgICAgcmV0dXJuIChldmVudCA9PSBYTUxTdHJlYW1SZWFkZXIuRU5EX0VMRU1FTlQpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciNpc0NoYXJhY3RlcnMoKQotICAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0NoYXJhY3RlcnMoKSB7Ci0gICAgICAgIHJldHVybiAoZXZlbnQgPT0gWE1MU3RyZWFtUmVhZGVyLkNIQVJBQ1RFUlMpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciNpc1doaXRlU3BhY2UoKQotICAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1doaXRlU3BhY2UoKSB7Ci0gICAgICAgIGlmIChldmVudCA9PSBYTUxTdHJlYW1SZWFkZXIuQ0hBUkFDVEVSUyB8fAotICAgICAgICAgICAgICAgIGV2ZW50ID09IFhNTFN0cmVhbVJlYWRlci5DREFUQSkgewotICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gKChDaGFyYWN0ZXJEYXRhKWN1cnNvcikuZ2V0RGF0YSgpOwotICAgICAgICAgICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcih2YWx1ZSk7Ci0gICAgICAgICAgICByZXR1cm4gIShzdC5oYXNNb3JlVG9rZW5zKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKiogQHJldHVybiBsaXN0IG9mIGF0dHJpYnV0ZXMgdGhhdCBhcmUgbm90IG5hbWVzcGFjZSBkZWNsYXJhdGlvbnMgKi8KLSAgICBwcml2YXRlIExpc3QgZ2V0QXR0cmlidXRlcygpIHsKLSAgICAgICAgaWYgKGV2ZW50ID09IFhNTFN0cmVhbVJlYWRlci5TVEFSVF9FTEVNRU5UKSB7Ci0gICAgICAgICAgICBMaXN0IGF0dHJzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgTmFtZWROb2RlTWFwIG1hcCA9ICgoRWxlbWVudCljdXJzb3IpLmdldEF0dHJpYnV0ZXMoKTsKLSAgICAgICAgICAgIGlmIChtYXAgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWFwLmdldExlbmd0aCgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgQXR0ciBhdHRyID0gKEF0dHIpbWFwLml0ZW0oaSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhdHRyLmdldE5hbWUoKS5lcXVhbHMoInhtbG5zIikgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyLmdldE5hbWUoKS5zdGFydHNXaXRoKCJ4bWxuczoiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBhIG5hbWVzcGFjZSBkZWNsYXJhdGlvbgotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnMuYWRkKGF0dHIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGF0dHJzOwotICAgICAgICB9Ci0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiWE1MU1JFcnI0IiwgImdldEF0dHJpYnV0ZXMoKSIpKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIjZ2V0QXR0cmlidXRlVmFsdWUoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLSAgICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVWYWx1ZShTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbG9jYWxQYXJ0KSB7Ci0gICAgICAgIGlmIChldmVudCA9PSBYTUxTdHJlYW1SZWFkZXIuU1RBUlRfRUxFTUVOVCkgewotICAgICAgICAgICAgcmV0dXJuICgoRWxlbWVudCljdXJzb3IpLmdldEF0dHJpYnV0ZU5TKG5hbWVzcGFjZSwgbG9jYWxQYXJ0KTsKLSAgICAgICAgfQotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoIlhNTFNSRXJyNCIsICJnZXRBdHRyaWJ1dGVWYWx1ZShTdHJpbmcsIFN0cmluZykiKSk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyI2dldEF0dHJpYnV0ZUNvdW50KCkKLSAgICAgICovCi0gICAgcHVibGljIGludCBnZXRBdHRyaWJ1dGVDb3VudCgpIHsKLSAgICAgICAgcmV0dXJuIGdldEF0dHJpYnV0ZXMoKS5zaXplKCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyI2dldEF0dHJpYnV0ZU5hbWUoaW50KQotICAgICAgKi8KLSAgICBwdWJsaWMgUU5hbWUgZ2V0QXR0cmlidXRlTmFtZShpbnQgaW5kZXgpIHsKLSAgICAgICAgQXR0ciBhdHRyID0gKEF0dHIpZ2V0QXR0cmlidXRlcygpLmdldChpbmRleCk7Ci0gICAgICAgIHJldHVybiBuZXcgUU5hbWUoYXR0ci5nZXROYW1lc3BhY2VVUkkoKSwgYXR0ci5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyI2dldEF0dHJpYnV0ZU5hbWVzcGFjZShpbnQpCi0gICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlTmFtZXNwYWNlKGludCBpbmRleCkgewotICAgICAgICBBdHRyIGF0dHIgPSAoQXR0cilnZXRBdHRyaWJ1dGVzKCkuZ2V0KGluZGV4KTsKLSAgICAgICAgcmV0dXJuIGF0dHIuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyI2dldEF0dHJpYnV0ZUxvY2FsTmFtZShpbnQpCi0gICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlTG9jYWxOYW1lKGludCBpbmRleCkgewotICAgICAgICBBdHRyIGF0dHIgPSAoQXR0cilnZXRBdHRyaWJ1dGVzKCkuZ2V0KGluZGV4KTsKLSAgICAgICAgcmV0dXJuIGF0dHIuZ2V0TG9jYWxOYW1lKCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyI2dldEF0dHJpYnV0ZVByZWZpeChpbnQpCi0gICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlUHJlZml4KGludCBpbmRleCkgewotICAgICAgICBBdHRyIGF0dHIgPSAoQXR0cilnZXRBdHRyaWJ1dGVzKCkuZ2V0KGluZGV4KTsKLSAgICAgICAgcmV0dXJuIGF0dHIuZ2V0UHJlZml4KCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyI2dldEF0dHJpYnV0ZVR5cGUoaW50KQotICAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZVR5cGUoaW50IGluZGV4KSB7Ci0gICAgICAgIEF0dHIgYXR0ciA9IChBdHRyKWdldEF0dHJpYnV0ZXMoKS5nZXQoaW5kZXgpOwotICAgICAgICByZXR1cm4gYXR0ci5nZXRTY2hlbWFUeXBlSW5mbygpLmdldFR5cGVOYW1lKCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyI2dldEF0dHJpYnV0ZVZhbHVlKGludCkKLSAgICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVWYWx1ZShpbnQgaW5kZXgpIHsKLSAgICAgICAgQXR0ciBhdHRyID0gKEF0dHIpZ2V0QXR0cmlidXRlcygpLmdldChpbmRleCk7Ci0gICAgICAgIHJldHVybiBhdHRyLmdldFZhbHVlKCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyI2lzQXR0cmlidXRlU3BlY2lmaWVkKGludCkKLSAgICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNBdHRyaWJ1dGVTcGVjaWZpZWQoaW50IGFyZzApIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgICogQHJldHVybiBudW1iZXIgb2YgbmFtZXNwYWNlIGRlY2xhcmF0aW9ucyBvbiB0aGlzIGVsZW1lbnQKLSAgICAgICovCi0gICAgcHVibGljIGludCBnZXROYW1lc3BhY2VDb3VudCgpIHsKLSAgICAgICAgaWYgKGN1cnNvciBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLSAgICAgICAgICAgIExpc3QgbGlzdCA9IGdldE5hbWVzcGFjZURlY2xhcmF0aW9ucygpOwotICAgICAgICAgICAgcmV0dXJuIGxpc3Quc2l6ZSgpOwotICAgICAgICB9Ci0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiWE1MU1JFcnI0IiwgImdldE5hbWVzcGFjZUNvdW50KCkiKSk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyI2dldE5hbWVzcGFjZVByZWZpeChpbnQpCi0gICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlUHJlZml4KGludCBpbmRleCkgewotICAgICAgICBpZiAoY3Vyc29yIGluc3RhbmNlb2YgRWxlbWVudCkgewotICAgICAgICAgICAgTGlzdCBsaXN0ID0gZ2V0TmFtZXNwYWNlRGVjbGFyYXRpb25zKCk7Ci0gICAgICAgICAgICByZXR1cm4gKChOYW1lc3BhY2VEZWNsYXJlKWxpc3QuZ2V0KGluZGV4KSkuZ2V0UHJlZml4KCk7Ci0gICAgICAgIH0KLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRNZXNzYWdlKCJYTUxTUkVycjQiLCAiZ2V0TmFtZXNwYWNlUHJlZml4KGludCkiKSk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyI2dldE5hbWVzcGFjZVVSSShpbnQpCi0gICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKGludCBpbmRleCkgewotICAgICAgICBpZiAoY3Vyc29yIGluc3RhbmNlb2YgRWxlbWVudCkgewotICAgICAgICAgICAgTGlzdCBsaXN0ID0gZ2V0TmFtZXNwYWNlRGVjbGFyYXRpb25zKCk7Ci0gICAgICAgICAgICByZXR1cm4gKChOYW1lc3BhY2VEZWNsYXJlKWxpc3QuZ2V0KGluZGV4KSkuZ2V0VVJJKCk7Ci0gICAgICAgIH0KLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJYTUxTUkVycjQiLCAiZ2V0TmFtZXNwYWNlVVJJKGludCkiKSk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyI2dldE5hbWVzcGFjZUNvbnRleHQoKQotICAgICAgKi8KLSAgICBwdWJsaWMgTmFtZXNwYWNlQ29udGV4dCBnZXROYW1lc3BhY2VDb250ZXh0KCkgewotICAgICAgICBFbGVtZW50IGVsZW1lbnQgPSBudWxsOwotICAgICAgICBpZiAoY3Vyc29yIGluc3RhbmNlb2YgRWxlbWVudCkgewotICAgICAgICAgICAgZWxlbWVudCA9IChFbGVtZW50KWN1cnNvcjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEVsZW1lbnQgcGFyZW50ID0gKEVsZW1lbnQpY3Vyc29yLmdldFBhcmVudE5vZGUoKTsKLSAgICAgICAgICAgIGlmIChwYXJlbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHBhcmVudCA9IChFbGVtZW50KW5leHRDdXJzb3JTdGFjay5wZWVrKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbGVtZW50ID0gKEVsZW1lbnQpY3Vyc29yLmdldFBhcmVudE5vZGUoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZWxlbWVudCA9PSBjYWNoZU5DSUtleSkgewotICAgICAgICAgICAgcmV0dXJuIGNhY2hlTkNJOwotICAgICAgICB9Ci0gICAgICAgIGNhY2hlTkNJS2V5ID0gZWxlbWVudDsKLSAgICAgICAgY2FjaGVOQ0kgPSBuZXcgTmFtZXNwYWNlQ29udGV4dEZyb21ET00oZWxlbWVudCk7Ci0gICAgICAgIHJldHVybiBjYWNoZU5DSTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIjZ2V0RXZlbnRUeXBlKCkKLSAgICAgICovCi0gICAgcHVibGljIGludCBnZXRFdmVudFR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBldmVudDsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIjZ2V0VGV4dCgpCi0gICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLSAgICAgICAgaWYgKGV2ZW50ID09IFhNTFN0cmVhbVJlYWRlci5DSEFSQUNURVJTIHx8Ci0gICAgICAgICAgICAgICAgZXZlbnQgPT0gWE1MU3RyZWFtUmVhZGVyLkNEQVRBIHx8Ci0gICAgICAgICAgICAgICAgZXZlbnQgPT0gWE1MU3RyZWFtUmVhZGVyLkNPTU1FTlQpIHsKLSAgICAgICAgICAgIHJldHVybiAoKENoYXJhY3RlckRhdGEpY3Vyc29yKS5nZXREYXRhKCk7Ci0gICAgICAgIH0KLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJYTUxTUkVycjQiLCAiZ2V0VGV4dCgpIikpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciNnZXRUZXh0Q2hhcmFjdGVycygpCi0gICAgICAqLwotICAgIHB1YmxpYyBjaGFyW10gZ2V0VGV4dENoYXJhY3RlcnMoKSB7Ci0gICAgICAgIHJldHVybiBnZXRUZXh0KCkudG9DaGFyQXJyYXkoKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIjZ2V0VGV4dENoYXJhY3RlcnMoaW50LCBjaGFyW10sIGludCwgaW50KQotICAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFRleHRDaGFyYWN0ZXJzKGludCBzb3VyY2VTdGFydCwgY2hhcltdIHRhcmdldCwgaW50IHRhcmdldFN0YXJ0LCBpbnQgbGVuZ3RoKQotICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyB2YWx1ZSA9IGdldFRleHQoKTsKLSAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBzb3VyY2VFbmQgaW5kZXgKLSAgICAgICAgaW50IHNvdXJjZUVuZCA9IHNvdXJjZVN0YXJ0ICsgbGVuZ3RoOwotICAgICAgICBpZiAodmFsdWUubGVuZ3RoKCkgPCBzb3VyY2VFbmQpIHsKLSAgICAgICAgICAgIHNvdXJjZUVuZCA9IHZhbHVlLmxlbmd0aCgpOwotICAgICAgICB9Ci0gICAgICAgIHZhbHVlLmdldENoYXJzKHNvdXJjZVN0YXJ0LCBzb3VyY2VFbmQsIHRhcmdldCwgdGFyZ2V0U3RhcnQpOwotICAgICAgICByZXR1cm4gc291cmNlRW5kIC0gc291cmNlU3RhcnQ7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyI2dldFRleHRTdGFydCgpCi0gICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0VGV4dFN0YXJ0KCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIjZ2V0VGV4dExlbmd0aCgpCi0gICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0VGV4dExlbmd0aCgpIHsKLSAgICAgICAgcmV0dXJuIGdldFRleHQoKS5sZW5ndGgoKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIjZ2V0RW5jb2RpbmcoKQotICAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEVuY29kaW5nKCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIjaGFzVGV4dCgpCi0gICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGhhc1RleHQoKSB7Ci0gICAgICAgIHJldHVybiAoZXZlbnQgPT0gWE1MU3RyZWFtUmVhZGVyLkNIQVJBQ1RFUlMgfHwKLSAgICAgICAgICAgICAgICBldmVudCA9PSBYTUxTdHJlYW1SZWFkZXIuQ0RBVEEgfHwKLSAgICAgICAgICAgICAgICBldmVudCA9PSBYTUxTdHJlYW1SZWFkZXIuQ09NTUVOVCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyI2dldExvY2F0aW9uKCkKLSAgICAgICovCi0gICAgcHVibGljIExvY2F0aW9uIGdldExvY2F0aW9uKCkgewotICAgICAgICByZXR1cm4gZHVtbXlMb2NhdGlvbjsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIjZ2V0TmFtZSgpCi0gICAgICAqLwotICAgIHB1YmxpYyBRTmFtZSBnZXROYW1lKCkgewotICAgICAgICBpZiAoY3Vyc29yIGluc3RhbmNlb2YgRWxlbWVudCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBRTmFtZShjdXJzb3IuZ2V0TmFtZXNwYWNlVVJJKCksIGN1cnNvci5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJYTUxTUkVycjQiLCAiZ2V0TmFtZSgpIikpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciNnZXRMb2NhbE5hbWUoKQotICAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldExvY2FsTmFtZSgpIHsKLSAgICAgICAgaWYgKGN1cnNvciBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLSAgICAgICAgICAgIHJldHVybiBjdXJzb3IuZ2V0TG9jYWxOYW1lKCk7Ci0gICAgICAgIH0KLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJYTUxTUkVycjQiLCAiZ2V0TG9jYWxOYW1lKCkiKSk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyI2hhc05hbWUoKQotICAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNOYW1lKCkgewotICAgICAgICByZXR1cm4gKGlzU3RhcnRFbGVtZW50KCkgfHwgaXNFbmRFbGVtZW50KCkpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciNnZXROYW1lc3BhY2VVUkkoKQotICAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVVSSSgpIHsKLSAgICAgICAgaWYgKGN1cnNvciBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLSAgICAgICAgICAgIHJldHVybiBjdXJzb3IuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciNnZXRQcmVmaXgoKQotICAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByZWZpeCgpIHsKLSAgICAgICAgaWYgKGN1cnNvciBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLSAgICAgICAgICAgIHJldHVybiBjdXJzb3IuZ2V0UHJlZml4KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciNnZXRWZXJzaW9uKCkKLSAgICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRWZXJzaW9uKCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIjaXNTdGFuZGFsb25lKCkKLSAgICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNTdGFuZGFsb25lKCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyI3N0YW5kYWxvbmVTZXQoKQotICAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBzdGFuZGFsb25lU2V0KCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyI2dldENoYXJhY3RlckVuY29kaW5nU2NoZW1lKCkKLSAgICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRDaGFyYWN0ZXJFbmNvZGluZ1NjaGVtZSgpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyI2dldFBJVGFyZ2V0KCkKLSAgICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRQSVRhcmdldCgpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyI2dldFBJRGF0YSgpCi0gICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UElEYXRhKCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKiogU2V0cyBuZXh0Q3Vyc29yIGFuZCBuZXh0RXZlbnQgZnJvbSB1c2luZyB0aGUgY3VycmVudCBjdXJzb3IgYW5kIGV2ZW50LiAqLwotICAgIHByaXZhdGUgdm9pZCBnZXROZXh0KCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHN3aXRjaCAoZXZlbnQpIHsKLSAgICAgICAgICAgIGNhc2UgWE1MU3RyZWFtUmVhZGVyLlNUQVJUX0RPQ1VNRU5UOiB7Ci0gICAgICAgICAgICAgICAgbmV4dEN1cnNvciA9IGN1cnNvcjsKLSAgICAgICAgICAgICAgICBuZXh0RXZlbnQgPSBYTUxTdHJlYW1SZWFkZXIuU1RBUlRfRUxFTUVOVDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSBYTUxTdHJlYW1SZWFkZXIuU1RBUlRfRUxFTUVOVDogewotICAgICAgICAgICAgICAgIGlmIChjdXJzb3IuZ2V0Rmlyc3RDaGlsZCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbmV4dEN1cnNvclN0YWNrLnB1c2gobmV4dEN1cnNvcik7Ci0gICAgICAgICAgICAgICAgICAgIG5leHRDdXJzb3IgPSBjdXJzb3IuZ2V0Rmlyc3RDaGlsZCgpOwotICAgICAgICAgICAgICAgICAgICBuZXh0RXZlbnQgPSBzdGFydEV2ZW50KG5leHRDdXJzb3IpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG5leHRFdmVudCA9IFhNTFN0cmVhbVJlYWRlci5FTkRfRUxFTUVOVDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFhNTFN0cmVhbVJlYWRlci5BVFRSSUJVVEU6IHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoIlhNTFNSRXJyNSIsICJBVFRSSUJVVEUiKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFhNTFN0cmVhbVJlYWRlci5OQU1FU1BBQ0U6IHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoIlhNTFNSRXJyNSIsICJOQU1FU1BBQ0UiKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFhNTFN0cmVhbVJlYWRlci5FTkRfRUxFTUVOVDoKLSAgICAgICAgICAgIGNhc2UgWE1MU3RyZWFtUmVhZGVyLkNIQVJBQ1RFUlM6Ci0gICAgICAgICAgICBjYXNlIFhNTFN0cmVhbVJlYWRlci5DREFUQToKLSAgICAgICAgICAgIGNhc2UgWE1MU3RyZWFtUmVhZGVyLkNPTU1FTlQ6Ci0gICAgICAgICAgICBjYXNlIFhNTFN0cmVhbVJlYWRlci5TUEFDRToKLSAgICAgICAgICAgIGNhc2UgWE1MU3RyZWFtUmVhZGVyLlBST0NFU1NJTkdfSU5TVFJVQ1RJT046Ci0gICAgICAgICAgICBjYXNlIFhNTFN0cmVhbVJlYWRlci5FTlRJVFlfUkVGRVJFTkNFOgotICAgICAgICAgICAgY2FzZSBYTUxTdHJlYW1SZWFkZXIuRFREOiB7Ci0gICAgICAgICAgICAgICAgaWYgKGN1cnNvci5nZXROZXh0U2libGluZygpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbmV4dEN1cnNvciA9IGN1cnNvci5nZXROZXh0U2libGluZygpOwotICAgICAgICAgICAgICAgICAgICBuZXh0RXZlbnQgPSBzdGFydEV2ZW50KG5leHRDdXJzb3IpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY3Vyc29yID09IHJvb3QpIHsKLSAgICAgICAgICAgICAgICAgICAgbmV4dEV2ZW50ID0gWE1MU3RyZWFtUmVhZGVyLkVORF9ET0NVTUVOVDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBUaGUgZm9sbG93aW5nIGRvZXMgbm90IHdvcmsgd2l0aAotICAgICAgICAgICAgICAgICAgICAvLyBBeGlvbSBUZXh0IG5vZGVzCi0gICAgICAgICAgICAgICAgICAgIC8vIG5leHRDdXJzb3IgPSBjdXJzb3IuZ2V0UGFyZW50Tm9kZSgpOwotICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSByZWFzb24gd2h5IGEgc3RhY2sgaXMgdXNlZC4KLSAgICAgICAgICAgICAgICAgICAgbmV4dEN1cnNvciA9IG5leHRDdXJzb3JTdGFjay5wb3AoKTsKLQotICAgICAgICAgICAgICAgICAgICBuZXh0RXZlbnQgPSBYTUxTdHJlYW1SZWFkZXIuRU5EX0VMRU1FTlQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIFhNTFN0cmVhbVJlYWRlci5FTkRfRE9DVU1FTlQ6IHsKLSAgICAgICAgICAgICAgICBuZXh0Q3Vyc29yID0gbnVsbDsKLSAgICAgICAgICAgICAgICBuZXh0RXZlbnQgPSAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoIlhNTFNSRXJyNSIsIFN0cmluZy52YWx1ZU9mKGV2ZW50KSkpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzdGFydCBldmVudCBmb3IgdGhpcyBwYXJ0aWN1bGFyIG5vZGUKLSAgICAgKgotICAgICAqIEBwYXJhbSBub2RlCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHByaXZhdGUgaW50IHN0YXJ0RXZlbnQoTm9kZSBub2RlKSB7Ci0gICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgUHJvY2Vzc2luZ0luc3RydWN0aW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gWE1MU3RyZWFtUmVhZGVyLlBST0NFU1NJTkdfSU5TVFJVQ1RJT047Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBDREFUQVNlY3Rpb24pIHsKLSAgICAgICAgICAgIHJldHVybiBYTUxTdHJlYW1SZWFkZXIuQ0RBVEE7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBDb21tZW50KSB7Ci0gICAgICAgICAgICByZXR1cm4gWE1MU3RyZWFtUmVhZGVyLkNPTU1FTlQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBUZXh0KSB7Ci0gICAgICAgICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIGphdmF4LnhtbC5zb2FwLlRleHQpIHsKLSAgICAgICAgICAgICAgICBqYXZheC54bWwuc29hcC5UZXh0IHNvYXBUZXh0ID0gKGphdmF4LnhtbC5zb2FwLlRleHQpbm9kZTsKLSAgICAgICAgICAgICAgICBpZiAoc29hcFRleHQuaXNDb21tZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFhNTFN0cmVhbVJlYWRlci5DT01NRU5UOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBYTUxTdHJlYW1SZWFkZXIuQ0hBUkFDVEVSUzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gWE1MU3RyZWFtUmVhZGVyLkNIQVJBQ1RFUlM7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0gICAgICAgICAgICByZXR1cm4gWE1MU3RyZWFtUmVhZGVyLlNUQVJUX0VMRU1FTlQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBBdHRyKSB7Ci0gICAgICAgICAgICByZXR1cm4gWE1MU3RyZWFtUmVhZGVyLkFUVFJJQlVURTsKLSAgICAgICAgfQotICAgICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIERvY3VtZW50KSB7Ci0gICAgICAgICAgICByZXR1cm4gWE1MU3RyZWFtUmVhZGVyLlNUQVJUX0RPQ1VNRU5UOwotICAgICAgICB9Ci0gICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgRW50aXR5UmVmZXJlbmNlKSB7Ci0gICAgICAgICAgICByZXR1cm4gWE1MU3RyZWFtUmVhZGVyLkVOVElUWV9SRUZFUkVOQ0U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBEb2N1bWVudFR5cGUpIHsKLSAgICAgICAgICAgIHJldHVybiBYTUxTdHJlYW1SZWFkZXIuRFREOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICAvLyBUaGlzIGlzIHRoZSBkZWZpbml0aW9uIG9mIGEgZHVtbXkgTG9jYXRpb24KLSAgICBwcml2YXRlIER1bW15TG9jYXRpb24gZHVtbXlMb2NhdGlvbiA9IG5ldyBEdW1teUxvY2F0aW9uKCk7Ci0KLSAgICBwcml2YXRlIGNsYXNzIER1bW15TG9jYXRpb24gaW1wbGVtZW50cyBMb2NhdGlvbiB7Ci0KLSAgICAgICAgcHVibGljIGludCBnZXRMaW5lTnVtYmVyKCkgewotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBnZXRDb2x1bW5OdW1iZXIoKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0Q2hhcmFjdGVyT2Zmc2V0KCkgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFB1YmxpY0lkKCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFN5c3RlbUlkKCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0IGdldE5hbWVzcGFjZURlY2xhcmF0aW9ucygpIHsKLSAgICAgICAgRWxlbWVudCBlbGVtZW50ID0gbnVsbDsKLSAgICAgICAgaWYgKGN1cnNvciBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLSAgICAgICAgICAgIGVsZW1lbnQgPSAoRWxlbWVudCljdXJzb3I7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChlbGVtZW50ID09IGNhY2hlTkRLZXkpIHsKLSAgICAgICAgICAgIHJldHVybiBjYWNoZU5EOwotICAgICAgICB9Ci0gICAgICAgIGNhY2hlTkRLZXkgPSBlbGVtZW50OwotICAgICAgICBjYWNoZU5EID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBOYW1lZE5vZGVNYXAgYXR0cnMgPSBlbGVtZW50LmdldEF0dHJpYnV0ZXMoKTsKLSAgICAgICAgaWYgKGF0dHJzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0cnMuZ2V0TGVuZ3RoKCk7IGkrKykgewotICAgICAgICAgICAgICAgIEF0dHIgYXR0ciA9IChBdHRyKWF0dHJzLml0ZW0oaSk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBhdHRyLmdldE5vZGVOYW1lKCk7Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWUuc3RhcnRzV2l0aCgieG1sbnMiKSkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gIiI7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgoInhtbG5zOiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBuYW1lLnN1YnN0cmluZyg2KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBOYW1lc3BhY2VEZWNsYXJlIG5kID0gbmV3IE5hbWVzcGFjZURlY2xhcmUocHJlZml4LCBhdHRyLmdldE5vZGVWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgY2FjaGVORC5hZGQobmQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY2FjaGVORDsKLSAgICB9Ci0KLSAgICBjbGFzcyBOYW1lc3BhY2VEZWNsYXJlIHsKLSAgICAgICAgU3RyaW5nIHByZWZpeDsKLSAgICAgICAgU3RyaW5nIHVyaTsKLQotICAgICAgICBOYW1lc3BhY2VEZWNsYXJlKFN0cmluZyBwcmVmaXgsIFN0cmluZyB1cmkpIHsKLSAgICAgICAgICAgIHRoaXMucHJlZml4ID0gcHJlZml4OwotICAgICAgICAgICAgdGhpcy51cmkgPSB1cmk7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgZ2V0UHJlZml4KCkgewotICAgICAgICAgICAgcmV0dXJuIHByZWZpeDsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBnZXRVUkkoKSB7Ci0gICAgICAgICAgICByZXR1cm4gdXJpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgTm9kZSBnZXROb2RlKCkgewotICAgICAgICByZXR1cm4gY3Vyc29yOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3JlZ2lzdHJ5L0NsaWVudENvbmZpZ3VyYXRvclJlZ2lzdHJ5LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9yZWdpc3RyeS9DbGllbnRDb25maWd1cmF0b3JSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiN2U3MmZkLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3JlZ2lzdHJ5L0NsaWVudENvbmZpZ3VyYXRvclJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MucmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmFkZHJlc3NpbmcuU3VibWlzc2lvbkFkZHJlc3NpbmdGZWF0dXJlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY2xpZW50LmNvbmZpZy5BZGRyZXNzaW5nQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY2xpZW50LmNvbmZpZy5NVE9NQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY2xpZW50LmNvbmZpZy5SZXNwZWN0QmluZGluZ0NvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmZlYXR1cmUuQ2xpZW50Q29uZmlndXJhdG9yOwotCi1pbXBvcnQgamF2YXgueG1sLndzLlJlc3BlY3RCaW5kaW5nRmVhdHVyZTsKLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5BZGRyZXNzaW5nRmVhdHVyZTsKLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5NVE9NRmVhdHVyZTsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudEhhc2hNYXA7Ci0KLXB1YmxpYyBjbGFzcyBDbGllbnRDb25maWd1cmF0b3JSZWdpc3RyeSB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgQ2xpZW50Q29uZmlndXJhdG9yPiBtYXAgPQotICAgICAgICBuZXcgQ29uY3VycmVudEhhc2hNYXA8U3RyaW5nLCBDbGllbnRDb25maWd1cmF0b3I+KCk7Ci0gICAgCi0gICAgc3RhdGljIHsKLSAgICAgICAgbWFwLnB1dChBZGRyZXNzaW5nRmVhdHVyZS5JRCwgbmV3IEFkZHJlc3NpbmdDb25maWd1cmF0b3IoKSk7Ci0gICAgICAgIG1hcC5wdXQoU3VibWlzc2lvbkFkZHJlc3NpbmdGZWF0dXJlLklELCBuZXcgQWRkcmVzc2luZ0NvbmZpZ3VyYXRvcigpKTsKLSAgICAgICAgbWFwLnB1dChNVE9NRmVhdHVyZS5JRCwgbmV3IE1UT01Db25maWd1cmF0b3IoKSk7Ci0gICAgICAgIG1hcC5wdXQoUmVzcGVjdEJpbmRpbmdGZWF0dXJlLklELCBuZXcgUmVzcGVjdEJpbmRpbmdDb25maWd1cmF0b3IoKSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRDb25maWd1cmF0b3IoU3RyaW5nIGlkLCBDbGllbnRDb25maWd1cmF0b3IgY29uZmlndXJhdG9yKSB7Ci0gICAgICAgIG1hcC5wdXQoaWQsIGNvbmZpZ3VyYXRvcik7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgQ2xpZW50Q29uZmlndXJhdG9yIGdldENvbmZpZ3VyYXRvcihTdHJpbmcgaWQpIHsKLSAgICAgICAgcmV0dXJuIG1hcC5nZXQoaWQpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFNldDxTdHJpbmc+IGdldElkcygpIHsKLSAgICAgICAgcmV0dXJuIG1hcC5rZXlTZXQoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9yZWdpc3RyeS9GYWN0b3J5UmVnaXN0cnkuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3JlZ2lzdHJ5L0ZhY3RvcnlSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzRlZTNiLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3JlZ2lzdHJ5L0ZhY3RvcnlSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5yZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuYWRkcmVzc2luZy5mYWN0b3J5LkF4aXMyRW5kcG9pbnRSZWZlcmVuY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuYWRkcmVzc2luZy5mYWN0b3J5LkpBWFdTRW5kcG9pbnRSZWZlcmVuY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuYWRkcmVzc2luZy5mYWN0b3J5LmltcGwuQXhpczJFbmRwb2ludFJlZmVyZW5jZUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuYWRkcmVzc2luZy5mYWN0b3J5LmltcGwuSkFYV1NFbmRwb2ludFJlZmVyZW5jZUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS5jb250cm9sbGVyLkludm9jYXRpb25Db250cm9sbGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUuY29udHJvbGxlci5pbXBsLkludm9jYXRpb25Db250cm9sbGVyRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5oYW5kbGVyLmZhY3RvcnkuSGFuZGxlckludm9rZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaGFuZGxlci5mYWN0b3J5LkhhbmRsZXJQb3N0SW52b2tlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5oYW5kbGVyLmZhY3RvcnkuSGFuZGxlclByZUludm9rZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaGFuZGxlci5mYWN0b3J5LmltcGwuSGFuZGxlckludm9rZXJGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmhhbmRsZXIuZmFjdG9yeS5pbXBsLkhhbmRsZXJQb3N0SW52b2tlckZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaGFuZGxlci5mYWN0b3J5LmltcGwuSGFuZGxlclByZUludm9rZXJGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmhhbmRsZXIubGlmZWN5Y2xlLmZhY3RvcnkuSGFuZGxlckxpZmVjeWNsZU1hbmFnZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5kYXRhYmluZGluZy5pbXBsLkpBWEJCbG9ja0ZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5kYXRhYmluZGluZy5pbXBsLk9NQmxvY2tGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZGF0YWJpbmRpbmcuaW1wbC5TT0FQRW52ZWxvcGVCbG9ja0ZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5kYXRhYmluZGluZy5pbXBsLlNvdXJjZUJsb2NrRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmRhdGFiaW5kaW5nLmltcGwuWE1MU3RyaW5nQmxvY2tGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZGF0YWJpbmRpbmcuaW1wbC5EYXRhU291cmNlQmxvY2tGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZmFjdG9yeS5DbGFzc0ZpbmRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmZhY3RvcnkuSkFYQkJsb2NrRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZmFjdG9yeS5NZXNzYWdlRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZmFjdG9yeS5PTUJsb2NrRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZmFjdG9yeS5TQUFKQ29udmVydGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZmFjdG9yeS5TT0FQRW52ZWxvcGVCbG9ja0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmZhY3RvcnkuU291cmNlQmxvY2tGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5mYWN0b3J5LlhNTFBhcnRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5mYWN0b3J5LlhNTFN0cmluZ0Jsb2NrRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZmFjdG9yeS5EYXRhU291cmNlQmxvY2tGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5pbXBsLk1lc3NhZ2VGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuaW1wbC5YTUxQYXJ0RmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLnV0aWwuaW1wbC5TQUFKQ29udmVydGVyRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zZXJ2ZXIuU2VydmljZUluc3RhbmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNlcnZlci5TZXJ2aWNlSW5zdGFuY2VGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNlcnZlci5kaXNwYXRjaGVyLmZhY3RvcnkuRW5kcG9pbnREaXNwYXRjaGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNlcnZlci5kaXNwYXRjaGVyLmZhY3RvcnkuRW5kcG9pbnREaXNwYXRjaGVyRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zZXJ2ZXIuZW5kcG9pbnQuaW5qZWN0aW9uLldlYlNlcnZpY2VDb250ZXh0SW5qZWN0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zZXJ2ZXIuZW5kcG9pbnQuaW5qZWN0aW9uLmltcGwuV2ViU2VydmljZUNvbnRleHRJbmplY3RvckltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zZXJ2ZXIuZW5kcG9pbnQubGlmZWN5Y2xlLmZhY3RvcnkuRW5kcG9pbnRMaWZlY3ljbGVNYW5hZ2VyRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNlcnZlci5lbmRwb2ludC5saWZlY3ljbGUuZmFjdG9yeS5pbXBsLkVuZHBvaW50TGlmZWN5Y2xlTWFuYWdlckZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MudXRpbGl0eS5FeGVjdXRvckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51dGlsaXR5LkpBWFdTRXhlY3V0b3JGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VDb250ZXh0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKiAKLSAqIEZhY3RvcnlSZWdpc3RyeSBSZWdpc3RyeSBjb250YWluaW5nIEZhY3RvcmllcyByZWxhdGVkIHRvIHRoZSBKQVgtV1MgSW1wbGVtZW50YXRpb24uCi0gKiBUaGUgZXhwZWN0ZWQgc2NlbmFyaW8gaXM6Ci0gKiAgIDEpIE1vc3Qgb3IgYWxsIG9mIHRoZSBmYWN0b3JpZXMgYXJlIHJlZ2lzdGVyZWQgZHVyaW5nIHN0YXJ0dXAuCi0gKiAgIDIpIFRoZXJlIGFyZSBhIGxhcmdlIG51bWJlciBvZiBnZXRGYWN0b3J5IGNhbGxzCi0gKiAgIDMpIFRoZXJlIG1heSBiZSBhbiBpbmZyZXF1ZW50IGNhbGwgdG8gc2V0RmFjdG9yeS4KLSAqICAgCi0gKiBUaHVzIGEgImNvcHkgb24gcHV0IiBhcHByb2FjaCBpcyB1c2VkLiAgVGhpcyBlbnN1cmVzIHRoYXQgdGhlICJnZXRzIiBhcmUgCi0gKiBmYXN0IChiZWNhdXNlIHRoZXkgYXJlIHVuc3luY2hyb25pemVkKS4gIFRoZSAicHV0cyIgYXJlIHNsb3dlciBiZWNhdXNlIHRoZXkKLSAqIGNyZWF0ZSBhIG5ldyBjb3B5IG9mIHRoZSBIYXNoTWFwLgotICogU2VlIGh0dHA6Ly93d3cuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9qYXZhL2xpYnJhcnkvai1oYXNobWFwLmh0bWwKLSAqKi8KLXB1YmxpYyBjbGFzcyBGYWN0b3J5UmVnaXN0cnkgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9sYXRpbGUgTWFwPENsYXNzLCBPYmplY3Q+IHRhYmxlOwotICAgIHByaXZhdGUgc3RhdGljIE9iamVjdCBsb2NrYm94ID0gbmV3IE9iamVjdCgpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhGYWN0b3J5UmVnaXN0cnkuY2xhc3MpOwotICAgIAotICAgIHN0YXRpYyB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpbml0KCk7Ci0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KXsKLSAgICAgICAgICAgIGxvZy5lcnJvcih0LmdldE1lc3NhZ2UoKSwgdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgdm9pZCBpbml0KCkgewotICAgICAgICAKLSAgICAgICAgLy8gQW4gdW5zeW5jaHJvbml6ZWQgTWFwIGlzIHVzZWQgdG8gZW5zdXJlIHRoYXQgZ2V0cyBhcmUgZmFzdC4KLSAgICAgICAgdGFibGUgPSBuZXcgSGFzaE1hcDxDbGFzcywgT2JqZWN0Pig2NCwgLjVmKTsKLSAgICAgICAgCi0gICAgICAgIC8vIExvYWQgRmFjdG9yaWVzCi0gICAgICAgIHRhYmxlLnB1dChYTUxTdHJpbmdCbG9ja0ZhY3RvcnkuY2xhc3MsIG5ldyBYTUxTdHJpbmdCbG9ja0ZhY3RvcnlJbXBsKCkpOwotICAgICAgICB0YWJsZS5wdXQoRW5kcG9pbnREaXNwYXRjaGVyRmFjdG9yeS5jbGFzcywgbmV3IEVuZHBvaW50RGlzcGF0Y2hlckZhY3RvcnlJbXBsKCkpOwotICAgICAgICB0YWJsZS5wdXQoSkFYQkJsb2NrRmFjdG9yeS5jbGFzcywgbmV3IEpBWEJCbG9ja0ZhY3RvcnlJbXBsKCkpOwotICAgICAgICB0YWJsZS5wdXQoT01CbG9ja0ZhY3RvcnkuY2xhc3MsIG5ldyBPTUJsb2NrRmFjdG9yeUltcGwoKSk7Ci0gICAgICAgIHRhYmxlLnB1dChTb3VyY2VCbG9ja0ZhY3RvcnkuY2xhc3MsIG5ldyBTb3VyY2VCbG9ja0ZhY3RvcnlJbXBsKCkpOwotICAgICAgICB0YWJsZS5wdXQoRGF0YVNvdXJjZUJsb2NrRmFjdG9yeS5jbGFzcywgbmV3IERhdGFTb3VyY2VCbG9ja0ZhY3RvcnlJbXBsKCkpOwotICAgICAgICB0YWJsZS5wdXQoU09BUEVudmVsb3BlQmxvY2tGYWN0b3J5LmNsYXNzLCBuZXcgU09BUEVudmVsb3BlQmxvY2tGYWN0b3J5SW1wbCgpKTsKLSAgICAgICAgdGFibGUucHV0KE1lc3NhZ2VGYWN0b3J5LmNsYXNzLCBuZXcgTWVzc2FnZUZhY3RvcnlJbXBsKCkpOwotICAgICAgICB0YWJsZS5wdXQoWE1MUGFydEZhY3RvcnkuY2xhc3MsIG5ldyBYTUxQYXJ0RmFjdG9yeUltcGwoKSk7Ci0gICAgICAgIHRhYmxlLnB1dChTQUFKQ29udmVydGVyRmFjdG9yeS5jbGFzcywgbmV3IFNBQUpDb252ZXJ0ZXJGYWN0b3J5SW1wbCgpKTsKLSAgICAgICAgdGFibGUucHV0KEVuZHBvaW50TGlmZWN5Y2xlTWFuYWdlckZhY3RvcnkuY2xhc3MsIG5ldyBFbmRwb2ludExpZmVjeWNsZU1hbmFnZXJGYWN0b3J5SW1wbCgpKTsKLSAgICAgICAgdGFibGUucHV0KEhhbmRsZXJMaWZlY3ljbGVNYW5hZ2VyRmFjdG9yeS5jbGFzcywgbmV3IEhhbmRsZXJMaWZlY3ljbGVNYW5hZ2VyRmFjdG9yeSgpKTsKLSAgICAgICAgdGFibGUucHV0KENsYXNzRmluZGVyRmFjdG9yeS5jbGFzcywgbmV3IENsYXNzRmluZGVyRmFjdG9yeSgpKTsKLSAgICAgICAgdGFibGUucHV0KEpBWFdTRW5kcG9pbnRSZWZlcmVuY2VGYWN0b3J5LmNsYXNzLCBuZXcgSkFYV1NFbmRwb2ludFJlZmVyZW5jZUZhY3RvcnlJbXBsKCkpOwotICAgICAgICB0YWJsZS5wdXQoQXhpczJFbmRwb2ludFJlZmVyZW5jZUZhY3RvcnkuY2xhc3MsIG5ldyBBeGlzMkVuZHBvaW50UmVmZXJlbmNlRmFjdG9yeUltcGwoKSk7Ci0gICAgICAgIHRhYmxlLnB1dChFeGVjdXRvckZhY3RvcnkuY2xhc3MsIG5ldyBKQVhXU0V4ZWN1dG9yRmFjdG9yeSgpKTsKLSAgICAgICAgdGFibGUucHV0KFNlcnZpY2VJbnN0YW5jZUZhY3RvcnkuY2xhc3MsIG5ldyBTZXJ2aWNlSW5zdGFuY2VGYWN0b3J5SW1wbCgpKTsKLSAgICAgICAgdGFibGUucHV0KEludm9jYXRpb25Db250cm9sbGVyRmFjdG9yeS5jbGFzcywgbmV3IEludm9jYXRpb25Db250cm9sbGVyRmFjdG9yeUltcGwoKSk7Ci0gICAgICAgIHRhYmxlLnB1dChIYW5kbGVyUHJlSW52b2tlckZhY3RvcnkuY2xhc3MsIG5ldyBIYW5kbGVyUHJlSW52b2tlckZhY3RvcnlJbXBsKCkpOwotICAgICAgICB0YWJsZS5wdXQoSGFuZGxlclBvc3RJbnZva2VyRmFjdG9yeS5jbGFzcywgbmV3IEhhbmRsZXJQb3N0SW52b2tlckZhY3RvcnlJbXBsKCkpOwotICAgICAgICAKLSAgICAgICAgLy8gcmVnaXN0ZXIgdGhlIGltcGxlbWVudGF0aW9uIHJlc3BvbnNpYmxlIGZvciBib3RoIFdlYlNlcnZpY2VDb250ZXh0IAotICAgICAgICAvLyBpbmplY3Rpb24gYW5kIHRoZSB1cGRhdGluZyBvZiB0aGUgV2ViU2VydmljZUNvbnRleHQgaW5zdGFuY2VzIHRoYXQKLSAgICAgICAgLy8gaGF2ZSBhbHJlYWR5IGJlZW4gaW5qZWN0ZWQsIHdlIHdpbGwgcmVnaXN0ZXIgdGhlc2UgYnkgdHdvIGRpZmZlcmVudAotICAgICAgICAvLyBjbGFzc2VzIGJlY2F1c2UgaXQgaXMgcG9zc2libGUgdGhhdCB0aGUgaW1wbGVtZW50YXRpb24gaXMgaW4gZGlmZmVyZW50Ci0gICAgICAgIC8vIGNsYXNzZXMKLSAgICAgICAgV2ViU2VydmljZUNvbnRleHRJbmplY3RvckltcGwgd3NjaUltcGwgPSBuZXcgV2ViU2VydmljZUNvbnRleHRJbmplY3RvckltcGwoKTsKLSAgICAgICAgdGFibGUucHV0KFdlYlNlcnZpY2VDb250ZXh0LmNsYXNzLCB3c2NpSW1wbCk7Ci0gICAgICAgIHRhYmxlLnB1dChXZWJTZXJ2aWNlQ29udGV4dEluamVjdG9yLmNsYXNzLCB3c2NpSW1wbCk7Ci0gICAgICAgIHRhYmxlLnB1dChIYW5kbGVySW52b2tlckZhY3RvcnkuY2xhc3MsIG5ldyBIYW5kbGVySW52b2tlckZhY3RvcnlJbXBsKCkpOwotICAgIH0KLQotICAgIC8qKiBGYWN0b3J5UmVnaXN0cnkgaXMgY3VycmVudGx5IGEgc3RhdGljIHNpbmdsZXRvbiAqLwotICAgIHByaXZhdGUgRmFjdG9yeVJlZ2lzdHJ5KCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgZmFjdG9yeS4gIFRoaXMgbWF5IGJlIGNhbGxlZCBmcmVxdWVudGx5LgotICAgICAqIEBwYXJhbSBpbnRmYWNlIG9mIHRoZSBGYWN0b3J5Ci0gICAgICogQHJldHVybiBPYmplY3QgdGhhdCBpcyB0aGUgZmFjdG9yeSBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIGludGZhY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRGYWN0b3J5KENsYXNzIGludGZhY2UpIHsKLSAgICAgICAgTWFwIG0gPSB0YWJsZTsKLSAgICAgICAgcmV0dXJuIG0uZ2V0KGludGZhY2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZCB0aGUgZmFjdG9yeS4gIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBpbmZyZXF1ZW50bHkuCi0gICAgICogQHBhcmFtIGludGZhY2UKLSAgICAgKiBAcGFyYW0gZmFjdG9yeU9iamVjdAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRGYWN0b3J5KENsYXNzIGludGZhY2UsIE9iamVjdCBmYWN0b3J5T2JqZWN0KSB7Ci0gICAgICAgIHN5bmNocm9uaXplZChsb2NrYm94KSB7Ci0gICAgICAgICAgICAvLyBVc2UgY29weSBhbmQgcHV0IGFwcHJvYWNoIHRvIGVuc3VyZSB0aGF0ICJnZXQiIHNwZWVkIGlzIGZhc3QuCi0gICAgICAgICAgICBNYXA8Q2xhc3MsIE9iamVjdD4gbmV3TWFwID0gbmV3IEhhc2hNYXA8Q2xhc3MsIE9iamVjdD4odGFibGUpOwotICAgICAgICAgICAgbmV3TWFwLnB1dChpbnRmYWNlLCBmYWN0b3J5T2JqZWN0KTsKLSAgICAgICAgICAgIHRhYmxlID0gbmV3TWFwOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcmVnaXN0cnkvSW52b2NhdGlvbkxpc3RlbmVyUmVnaXN0cnkuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3JlZ2lzdHJ5L0ludm9jYXRpb25MaXN0ZW5lclJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmODgyODkuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcmVnaXN0cnkvSW52b2NhdGlvbkxpc3RlbmVyUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MucmVnaXN0cnk7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2VydmVyLkludm9jYXRpb25MaXN0ZW5lckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCi0NCi0NCi0vKioNCi0gKiBUaGlzIGNsYXNzIHdpbGwgcHJvdmlkZSBhIG1lYW5zIGZvciBKQVgtV1MgdXNlcnMgdG8gcmVnaXN0ZXINCi0gKiBJbnZvY2F0aW9uTGlzdGVuZXJGYWN0b3J5IGltcGxlbWVudGF0aW9ucy4gVGhpcyB3aWxsIG1hbmFnZQ0KLSAqIHRoZSBmYWN0b3J5IGltcGxlbWVudGF0aW9ucyBzdWNoIHRoYXQgdGhleSBsaXN0IG9mIGZhY3Rvcmllcw0KLSAqIGlzIG9ubHkgYnVpbHQgd2hlbiBuZWNlc3Nhcnkgc28gYXMgdG8gcmVkdWNlIHRoZSBvdmVyaGVhZCBvZg0KLSAqIGRvaW5nIHRoaXMgb24gYSBwZXItcmVxdWVzdCBiYXNpcy4NCi0gKg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBJbnZvY2F0aW9uTGlzdGVuZXJSZWdpc3RyeSB7DQotICAgIA0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coSW52b2NhdGlvbkxpc3RlbmVyUmVnaXN0cnkuY2xhc3MpOw0KLSAgICANCi0gICAgLy8gVGhpcyBpcyBhIGNvbGxlY3Rpb24gb2YgYWxsIHRoZSBJbnZvY2F0aW9uTGlzdGVuZXJGYWN0b3J5IGluc3RhbmNlcw0KLSAgICBwcml2YXRlIHN0YXRpYyBDb2xsZWN0aW9uPEludm9jYXRpb25MaXN0ZW5lckZhY3Rvcnk+IGZhY3RvcnlMaXN0ID0gbmV3IEFycmF5TGlzdDxJbnZvY2F0aW9uTGlzdGVuZXJGYWN0b3J5PigpOw0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFRoaXMgbWV0aG9kIGFjY2VwdHMgYW4gb2JqZWN0IGluc3RhbmNlIHRoYXQgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YNCi0gICAgICogdGhlIEludm9jYXRpb25MaXN0ZW5lckZhY3RvcnkuIFRoZSBpbnN0YW5jZSB3aWxsIGJlIHN0b3JlZCBpbiBhbiANCi0gICAgICogaW50ZXJuYWwgbWFwIGJ5IGl0cyBjbGFzcyBuYW1lLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgdm9pZCBhZGRGYWN0b3J5KEludm9jYXRpb25MaXN0ZW5lckZhY3RvcnkgZmFjSW5zdGFuY2UpIHsNCi0gICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKCJBZGRpbmcgSW52b2NhdGlvbkxpc3RlbmVyRmFjdG9yeSBpbnN0YW5jZTogIiArIGZhY0luc3RhbmNlLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIC8vIEVuc3VyZSBvbmx5IG9uZSBpbnN0YW5jZSBvZiBhIHNwZWNpZmljIGZhY3RvcnkgY2xhc3MgaXMgcmVnaXN0ZXJlZC4NCi0gICAgICAgIGJvb2xlYW4gZm91bmQgPSBmYWxzZTsNCi0gICAgICAgIGZvciAoSXRlcmF0b3I8SW52b2NhdGlvbkxpc3RlbmVyRmFjdG9yeT4gaXRlcmF0b3IgPSBmYWN0b3J5TGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7DQotICAgICAgICAgICAgSW52b2NhdGlvbkxpc3RlbmVyRmFjdG9yeSBmYWN0b3J5ID0gaXRlcmF0b3IubmV4dCgpOw0KLSAgICAgICAgICAgIGlmIChmYWNJbnN0YW5jZS5nZXRDbGFzcygpID09IGZhY3RvcnkuZ2V0Q2xhc3MoKSkgew0KLSAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYoIWZvdW5kKXsNCi0gICAgICAgICAgICBmYWN0b3J5TGlzdC5hZGQoZmFjSW5zdGFuY2UpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gYWxsIHRoZSBJbnZvY2F0aW9uTGlzdGVuZXJGYWN0b3J5IGluc3RhbmNlcyANCi0gICAgICogdGhhdCBoYXZlIGJlZW4gcmVnaXN0ZXJlZC4NCi0gICAgICovDQotICAgIHB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbjxJbnZvY2F0aW9uTGlzdGVuZXJGYWN0b3J5PiBnZXRGYWN0b3JpZXMoKSB7DQotICAgICAgICByZXR1cm4gZmFjdG9yeUxpc3Q7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcnVudGltZS9kZXNjcmlwdGlvbi9pbmplY3Rpb24vUmVzb3VyY2VJbmplY3Rpb25TZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9ydW50aW1lL2Rlc2NyaXB0aW9uL2luamVjdGlvbi9SZXNvdXJjZUluamVjdGlvblNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODU3Y2E5Mi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9ydW50aW1lL2Rlc2NyaXB0aW9uL2luamVjdGlvbi9SZXNvdXJjZUluamVjdGlvblNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5ydW50aW1lLmRlc2NyaXB0aW9uLmluamVjdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbjsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLQotCi0vKiogVXNlZCB0byBjYWNoZSBAUmVzb3VyY2UgaW5qZWN0aW9uIGluZm9ybWF0aW9uICovCi1wdWJsaWMgaW50ZXJmYWNlIFJlc291cmNlSW5qZWN0aW9uU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbiBleHRlbmRzIFNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb24gewotICAgIC8qKiBAcmV0dXJuIHRydWUgaWYgQFJlc291cmNlIGlzIGZvdW5kIG9uIGFueSBGaWVsZCBvciBNZXRob2Qgb2YgdGhlIEltcGxlbWVudGF0aW9uIGNsYXNzICovCi0gICAgYm9vbGVhbiBoYXNSZXNvdXJjZUFubm90YXRpb24oKTsKLQotICAgIC8qKiBAcmV0dXJuIE1ldGhvZCB3aXRoIEBQb3N0Q29uc3RydWN0IG9yIG51bGwgKi8KLSAgICBNZXRob2QgZ2V0UG9zdENvbnN0cnVjdE1ldGhvZCgpOwotCi0gICAgLyoqIEByZXR1cm4gTWV0aG9kIHdpdGggQFByZURlc3Ryb3kgb3IgbnVsbCAqLwotICAgIE1ldGhvZCBnZXRQcmVEZXN0cm95TWV0aG9kKCk7Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9ydW50aW1lL2Rlc2NyaXB0aW9uL2luamVjdGlvbi9SZXNvdXJjZUluamVjdGlvblNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb25GYWN0b3J5LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9ydW50aW1lL2Rlc2NyaXB0aW9uL2luamVjdGlvbi9SZXNvdXJjZUluamVjdGlvblNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb25GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlZGQzOGEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcnVudGltZS9kZXNjcmlwdGlvbi9pbmplY3Rpb24vUmVzb3VyY2VJbmplY3Rpb25TZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnJ1bnRpbWUuZGVzY3JpcHRpb24uaW5qZWN0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5TZXJ2aWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5ydW50aW1lLmRlc2NyaXB0aW9uLmluamVjdGlvbi5pbXBsLlJlc291cmNlSW5qZWN0aW9uU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbkJ1aWxkZXI7Ci0KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZUluamVjdGlvblNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb25GYWN0b3J5IHsKLQotICAgIC8qKiBpbnRlbnRpb25hbGx5IHByaXZhdGUgKi8KLSAgICBwcml2YXRlIFJlc291cmNlSW5qZWN0aW9uU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbkZhY3RvcnkoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IG9yIGNyZWF0ZSBNYXJzaGFsU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbgotICAgICAqCi0gICAgICogQHBhcmFtIHNlcnZpY2VEZXNjCi0gICAgICogQHBhcmFtIGltcGxDbGFzcwotICAgICAqIEByZXR1cm4gT3BlcmF0aW9uUnVudGltZURlc2NyaXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBSZXNvdXJjZUluamVjdGlvblNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb24gZ2V0KFNlcnZpY2VEZXNjcmlwdGlvbiBzZXJ2aWNlRGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MgaW1wbENsYXNzKSB7Ci0gICAgICAgIFN0cmluZyBrZXkgPSBSZXNvdXJjZUluamVjdGlvblNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb25CdWlsZGVyLmdldEtleShpbXBsQ2xhc3MpOwotICAgICAgICBSZXNvdXJjZUluamVjdGlvblNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb24gcmlzckRlc2MgPQotICAgICAgICAgICAgICAgIChSZXNvdXJjZUluamVjdGlvblNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb24pCi0gICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlRGVzYy5nZXRTZXJ2aWNlUnVudGltZURlc2Moa2V5KTsKLQotICAgICAgICBpZiAocmlzckRlc2MgPT0gbnVsbCkgewotICAgICAgICAgICAgcmlzckRlc2MgPSBSZXNvdXJjZUluamVjdGlvblNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb25CdWlsZGVyCi0gICAgICAgICAgICAgICAgICAgIC5jcmVhdGUoc2VydmljZURlc2MsIGltcGxDbGFzcyk7Ci0gICAgICAgICAgICBzZXJ2aWNlRGVzYy5zZXRTZXJ2aWNlUnVudGltZURlc2MocmlzckRlc2MpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByaXNyRGVzYzsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9ydW50aW1lL2Rlc2NyaXB0aW9uL2luamVjdGlvbi9pbXBsL1Jlc291cmNlSW5qZWN0aW9uU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbkJ1aWxkZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3J1bnRpbWUvZGVzY3JpcHRpb24vaW5qZWN0aW9uL2ltcGwvUmVzb3VyY2VJbmplY3Rpb25TZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uQnVpbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzUwMDQ0Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3J1bnRpbWUvZGVzY3JpcHRpb24vaW5qZWN0aW9uL2ltcGwvUmVzb3VyY2VJbmplY3Rpb25TZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uQnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5ydW50aW1lLmRlc2NyaXB0aW9uLmluamVjdGlvbi5pbXBsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5TZXJ2aWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5ydW50aW1lLmRlc2NyaXB0aW9uLmluamVjdGlvbi5SZXNvdXJjZUluamVjdGlvblNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb247Ci0KLWltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlBvc3RDb25zdHJ1Y3Q7Ci1pbXBvcnQgamF2YXguYW5ub3RhdGlvbi5QcmVEZXN0cm95OwotaW1wb3J0IGphdmF4LmFubm90YXRpb24uUmVzb3VyY2U7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGNsYXNzIFJlc291cmNlSW5qZWN0aW9uU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbkJ1aWxkZXIgewotCi0gICAgLyoqIEludGVudGlvbmFsbHkgUHJpdmF0ZSAqLwotICAgIHByaXZhdGUgUmVzb3VyY2VJbmplY3Rpb25TZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uQnVpbGRlcigpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBjcmVhdGUKLSAgICAgKgotICAgICAqIEBwYXJhbSBvcERlc2MKLSAgICAgKiBAcGFyYW0gaW1wbENsYXNzTmFtZQotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBzdGF0aWMgcHVibGljIFJlc291cmNlSW5qZWN0aW9uU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbiBjcmVhdGUoU2VydmljZURlc2NyaXB0aW9uIHNlcnZpY2VEZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyBpbXBsQ2xhc3MpIHsKLSAgICAgICAgUmVzb3VyY2VJbmplY3Rpb25TZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uSW1wbCBkZXNjID0KLSAgICAgICAgICAgICAgICBuZXcgUmVzb3VyY2VJbmplY3Rpb25TZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uSW1wbChnZXRLZXkoaW1wbENsYXNzKSwgc2VydmljZURlc2MpOwotCi0gICAgICAgIGJvb2xlYW4gdmFsdWUgPSBoYXNSZXNvdXJjZUFubm90YXRpb24oaW1wbENsYXNzKTsKLSAgICAgICAgZGVzYy5zZXRSZXNvdXJjZUFubm90YXRpb24odmFsdWUpOwotCi0gICAgICAgIE1ldGhvZCBtZXRob2QgPSBnZXRQb3N0Q29uc3RydWN0TWV0aG9kKGltcGxDbGFzcyk7Ci0gICAgICAgIGRlc2Muc2V0UG9zdENvbnN0cnVjdE1ldGhvZChtZXRob2QpOwotCi0gICAgICAgIG1ldGhvZCA9IGdldFByZURlc3Ryb3lNZXRob2QoaW1wbENsYXNzKTsKLSAgICAgICAgZGVzYy5zZXRQcmVEZXN0cm95TWV0aG9kKG1ldGhvZCk7Ci0KLSAgICAgICAgcmV0dXJuIGRlc2M7Ci0gICAgfQotCi0gICAgc3RhdGljIHB1YmxpYyBTdHJpbmcgZ2V0S2V5KENsYXNzIGltcGxDbGFzcykgewotICAgICAgICByZXR1cm4gaW1wbENsYXNzLmdldENhbm9uaWNhbE5hbWUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gaW1wbENsYXNzCi0gICAgICogQHJldHVybiB0cnVlIGlmIEZpZWxkIG9yIE1ldGhvZCBoYXMgYSBAUmVzb3VyY2UgYW5ub3RhdGlvbgotICAgICAqLwotICAgIHN0YXRpYyBwcml2YXRlIGJvb2xlYW4gaGFzUmVzb3VyY2VBbm5vdGF0aW9uKENsYXNzIGltcGxDbGFzcykgewotICAgICAgICAvLyBHZXR0aW5nIHRoaXMgaW5mb3JtYXRpb24gaXMgZXhwZW5zaXZlLCBidXQgZm9ydHVuYXRlbHkgaXMgY2FjaGVkLgotICAgICAgICBMaXN0PEZpZWxkPiBmaWVsZHMgPSBnZXRGaWVsZHMoaW1wbENsYXNzKTsKLSAgICAgICAgZm9yIChGaWVsZCBmaWVsZCA6IGZpZWxkcykgewotICAgICAgICAgICAgaWYgKGdldEFubm90YXRpb24oZmllbGQsUmVzb3VyY2UuY2xhc3MpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBMaXN0PE1ldGhvZD4gbWV0aG9kcyA9IGdldE1ldGhvZHMoaW1wbENsYXNzKTsKLSAgICAgICAgZm9yIChNZXRob2QgbWV0aG9kIDogbWV0aG9kcykgewotICAgICAgICAgICAgaWYgKGdldEFubm90YXRpb24obWV0aG9kLFJlc291cmNlLmNsYXNzKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgfQotCi0gICAgc3RhdGljIHByaXZhdGUgTWV0aG9kIGdldFBvc3RDb25zdHJ1Y3RNZXRob2QoQ2xhc3MgaW1wbENsYXNzKSB7Ci0gICAgICAgIExpc3Q8TWV0aG9kPiBtZXRob2RzID0gZ2V0TWV0aG9kcyhpbXBsQ2xhc3MpOwotICAgICAgICBmb3IgKE1ldGhvZCBtZXRob2QgOiBtZXRob2RzKSB7Ci0gICAgICAgICAgICBpZiAoZ2V0QW5ub3RhdGlvbihtZXRob2QsUG9zdENvbnN0cnVjdC5jbGFzcykgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBtZXRob2Q7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgc3RhdGljIHByaXZhdGUgTWV0aG9kIGdldFByZURlc3Ryb3lNZXRob2QoQ2xhc3MgaW1wbENsYXNzKSB7Ci0gICAgICAgIExpc3Q8TWV0aG9kPiBtZXRob2RzID0gZ2V0TWV0aG9kcyhpbXBsQ2xhc3MpOwotICAgICAgICBmb3IgKE1ldGhvZCBtZXRob2QgOiBtZXRob2RzKSB7Ci0gICAgICAgICAgICBpZiAoZ2V0QW5ub3RhdGlvbihtZXRob2QsUHJlRGVzdHJveS5jbGFzcykgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBtZXRob2Q7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhbGwgb2YgdGhlIGZpZWxkcyBpbiB0aGlzIGNsYXNzIGFuZCB0aGUgc3VwZXIgY2xhc3NlcwotICAgICAqCi0gICAgICogQHBhcmFtIGJlYW5DbGFzcwotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBzdGF0aWMgcHJpdmF0ZSBMaXN0PEZpZWxkPiBnZXRGaWVsZHMoZmluYWwgQ2xhc3MgYmVhbkNsYXNzKSB7Ci0gICAgICAgIC8vIFRoaXMgY2xhc3MgbXVzdCByZW1haW4gcHJpdmF0ZSBkdWUgdG8gSmF2YSAyIFNlY3VyaXR5IGNvbmNlcm5zCi0gICAgICAgIExpc3Q8RmllbGQ+IGZpZWxkczsKLSAgICAgICAgZmllbGRzID0gKExpc3Q8RmllbGQ+KUFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAotICAgICAgICAgICAgICAgIG5ldyBQcml2aWxlZ2VkQWN0aW9uKCkgewotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8RmllbGQ+IGZpZWxkcyA9IG5ldyBBcnJheUxpc3Q8RmllbGQ+KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyBjbHMgPSBiZWFuQ2xhc3M7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoY2xzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWVsZFtdIGZpZWxkQXJyYXkgPSBjbHMuZ2V0RGVjbGFyZWRGaWVsZHMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKEZpZWxkIGZpZWxkIDogZmllbGRBcnJheSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZHMuYWRkKGZpZWxkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xzID0gY2xzLmdldFN1cGVyY2xhc3MoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmaWVsZHM7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICk7Ci0KLSAgICAgICAgcmV0dXJuIGZpZWxkczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGFsbCBvZiB0aGUgZmllbGRzIGluIHRoaXMgY2xhc3MgYW5kIHRoZSBzdXBlciBjbGFzc2VzCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYmVhbkNsYXNzCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHN0YXRpYyBwcml2YXRlIExpc3Q8TWV0aG9kPiBnZXRNZXRob2RzKGZpbmFsIENsYXNzIGJlYW5DbGFzcykgewotICAgICAgICAvLyBUaGlzIGNsYXNzIG11c3QgcmVtYWluIHByaXZhdGUgZHVlIHRvIEphdmEgMiBTZWN1cml0eSBjb25jZXJucwotICAgICAgICBMaXN0PE1ldGhvZD4gbWV0aG9kczsKLSAgICAgICAgbWV0aG9kcyA9IChMaXN0PE1ldGhvZD4pQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoCi0gICAgICAgICAgICAgICAgbmV3IFByaXZpbGVnZWRBY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxNZXRob2Q+IG1ldGhvZHMgPSBuZXcgQXJyYXlMaXN0PE1ldGhvZD4oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzIGNscyA9IGJlYW5DbGFzczsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChjbHMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGhvZFtdIG1ldGhvZEFycmF5ID0gY2xzLmdldERlY2xhcmVkTWV0aG9kcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoTWV0aG9kIG1ldGhvZCA6IG1ldGhvZEFycmF5KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZHMuYWRkKG1ldGhvZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNscyA9IGNscy5nZXRTdXBlcmNsYXNzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWV0aG9kczsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgKTsKLQotICAgICAgICByZXR1cm4gbWV0aG9kczsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogR2V0IGFuIGFubm90YXRpb24uICBUaGlzIGlzIHdyYXBwZXJlZCB0byBhdm9pZCBhIEphdmEyU2VjdXJpdHkgdmlvbGF0aW9uLgotICAgICAqIEBwYXJhbSBjbHMgQ2xhc3MgdGhhdCBjb250YWlucyBhbm5vdGF0aW9uIAotICAgICAqIEBwYXJhbSBhbm5vdGF0aW9uIENsYXNzIG9mIHJlcXVyZXN0ZWQgQW5ub3RhdGlvbgotICAgICAqIEByZXR1cm4gYW5ub3RhdGlvbiBvciBudWxsCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKGZpbmFsIEFubm90YXRlZEVsZW1lbnQgZWxlbWVudCwgZmluYWwgQ2xhc3MgYW5ub3RhdGlvbikgewotICAgICAgICByZXR1cm4gKEFubm90YXRpb24pIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkQWN0aW9uKCkgewotICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuZ2V0QW5ub3RhdGlvbihhbm5vdGF0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcnVudGltZS9kZXNjcmlwdGlvbi9pbmplY3Rpb24vaW1wbC9SZXNvdXJjZUluamVjdGlvblNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb25JbXBsLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9ydW50aW1lL2Rlc2NyaXB0aW9uL2luamVjdGlvbi9pbXBsL1Jlc291cmNlSW5qZWN0aW9uU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGRjMTFkNi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9ydW50aW1lL2Rlc2NyaXB0aW9uL2luamVjdGlvbi9pbXBsL1Jlc291cmNlSW5qZWN0aW9uU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5ydW50aW1lLmRlc2NyaXB0aW9uLmluamVjdGlvbi5pbXBsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5TZXJ2aWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5ydW50aW1lLmRlc2NyaXB0aW9uLmluamVjdGlvbi5SZXNvdXJjZUluamVjdGlvblNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb247Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci0KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZUluamVjdGlvblNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb25JbXBsIGltcGxlbWVudHMKLSAgICAgICAgUmVzb3VyY2VJbmplY3Rpb25TZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uIHsKLQotICAgIHByaXZhdGUgU2VydmljZURlc2NyaXB0aW9uIHNlcnZpY2VEZXNjOwotICAgIHByaXZhdGUgU3RyaW5nIGtleTsKLSAgICBwcml2YXRlIGJvb2xlYW4gX2hhc1Jlc291cmNlQW5ub3RhdGlvbjsKLSAgICBwcml2YXRlIE1ldGhvZCBfcG9zdENvbnN0cnVjdE1ldGhvZDsKLSAgICBwcml2YXRlIE1ldGhvZCBfcHJlRGVzdHJveU1ldGhvZDsKLQotICAgIHByb3RlY3RlZCBSZXNvdXJjZUluamVjdGlvblNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb25JbXBsKFN0cmluZyBrZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNlcnZpY2VEZXNjKSB7Ci0gICAgICAgIHRoaXMuc2VydmljZURlc2MgPSBzZXJ2aWNlRGVzYzsKLSAgICAgICAgdGhpcy5rZXkgPSBrZXk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaGFzUmVzb3VyY2VBbm5vdGF0aW9uKCkgewotICAgICAgICByZXR1cm4gX2hhc1Jlc291cmNlQW5ub3RhdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWV0aG9kIGdldFBvc3RDb25zdHJ1Y3RNZXRob2QoKSB7Ci0gICAgICAgIHJldHVybiBfcG9zdENvbnN0cnVjdE1ldGhvZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWV0aG9kIGdldFByZURlc3Ryb3lNZXRob2QoKSB7Ci0gICAgICAgIHJldHVybiBfcHJlRGVzdHJveU1ldGhvZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2VydmljZURlc2NyaXB0aW9uIGdldFNlcnZpY2VEZXNjcmlwdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIHNlcnZpY2VEZXNjOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotICAgICAgICByZXR1cm4ga2V5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCBieSBCdWlsZGVyIGNvZGUKLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqLwotICAgIHZvaWQgc2V0UmVzb3VyY2VBbm5vdGF0aW9uKGJvb2xlYW4gdmFsdWUpIHsKLSAgICAgICAgX2hhc1Jlc291cmNlQW5ub3RhdGlvbiA9IHZhbHVlOwotICAgIH0KLQotICAgIHZvaWQgc2V0UG9zdENvbnN0cnVjdE1ldGhvZChNZXRob2QgbWV0aG9kKSB7Ci0gICAgICAgIF9wb3N0Q29uc3RydWN0TWV0aG9kID0gbWV0aG9kOwotICAgIH0KLQotICAgIHZvaWQgc2V0UHJlRGVzdHJveU1ldGhvZChNZXRob2QgbWV0aG9kKSB7Ci0gICAgICAgIF9wcmVEZXN0cm95TWV0aG9kID0gbWV0aG9kOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBuZXdsaW5lID0gIlxuIjsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHN0cmluZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotICAgICAgICBzdHJpbmcuYXBwZW5kKG5ld2xpbmUpOwotICAgICAgICBzdHJpbmcuYXBwZW5kKCIgIFJlc291cmNlSW5qZWN0aW9uU2VydmljZVJ1bnRpbWU6IiArIGdldEtleSgpKTsKLSAgICAgICAgc3RyaW5nLmFwcGVuZChuZXdsaW5lKTsKLSAgICAgICAgc3RyaW5nLmFwcGVuZCgiICAgIEBSZXNvdXJjZSBBbm5vdGF0aW9uID0gIiArIGhhc1Jlc291cmNlQW5ub3RhdGlvbigpKTsKLSAgICAgICAgc3RyaW5nLmFwcGVuZChuZXdsaW5lKTsKLSAgICAgICAgc3RyaW5nLmFwcGVuZCgiICAgIFBvc3RDb25zdHJ1Y3QgTWV0aG9kID0gIiArIGdldFBvc3RDb25zdHJ1Y3RNZXRob2QoKSk7Ci0gICAgICAgIHN0cmluZy5hcHBlbmQobmV3bGluZSk7Ci0gICAgICAgIHN0cmluZy5hcHBlbmQoIiAgICBQcmVEZXN0cm95IE1ldGhvZCAgICA9ICIgKyBnZXRQcmVEZXN0cm95TWV0aG9kKCkpOwotCi0gICAgICAgIHJldHVybiBzdHJpbmcudG9TdHJpbmcoKTsKLSAgICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcnVudGltZS9kZXNjcmlwdGlvbi9tYXJzaGFsL0Fubm90YXRpb25EZXNjLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9ydW50aW1lL2Rlc2NyaXB0aW9uL21hcnNoYWwvQW5ub3RhdGlvbkRlc2MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc3NWU3OS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9ydW50aW1lL2Rlc2NyaXB0aW9uL21hcnNoYWwvQW5ub3RhdGlvbkRlc2MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5ydW50aW1lLmRlc2NyaXB0aW9uLm1hcnNoYWw7Ci0KLS8qKiBBbm5vdGF0aW9uIGluZm9ybWF0aW9uIGNhY2hlZCBmb3IgYSBwYXJ0aWN1bGFyIGNsYXNzICovCi1wdWJsaWMgaW50ZXJmYWNlIEFubm90YXRpb25EZXNjIHsKLQotICAgIC8qKiBAcmV0dXJuIHRydWUgaWYgY2xhc3MgaGFzIEBYbWxSb290RWxlbWVudCAqLwotICAgIHB1YmxpYyBib29sZWFuIGhhc1htbFJvb3RFbGVtZW50KCk7Ci0KLSAgICAvKiogQHJldHVybiBAWG1sUm9vdEVsZW1lbnQgbmFtZSBvciBkZWZhdWx0ZWQgbmFtZSAobnVsbCBpZiAhaGFzWG1sUm9vdEVsZW1lbnQpICovCi0gICAgcHVibGljIFN0cmluZyBnZXRYbWxSb290RWxlbWVudE5hbWUoKTsKLQotICAgIC8qKiBAcmV0dXJuIEBYbWxSb290RWxlbWVudCBuYW1lc3BhY2Ugb3IgZGVmYXVsdCBuYW1lc3BhY2UgKG51bGwgaWYgIWhhc1htbFJvb3RFbGVtZW50KSAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0WG1sUm9vdEVsZW1lbnROYW1lc3BhY2UoKTsKLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gQFhtbFNlZUFsc28gY2xhc3NlcyBvciBudWxsCi0gICAgICovCi0gICAgcHVibGljIENsYXNzW10gZ2V0WG1sU2VlQWxzb0NsYXNzZXMoKTsKLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3J1bnRpbWUvZGVzY3JpcHRpb24vbWFyc2hhbC9GYXVsdEJlYW5EZXNjLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9ydW50aW1lL2Rlc2NyaXB0aW9uL21hcnNoYWwvRmF1bHRCZWFuRGVzYy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTZkNzI3Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3J1bnRpbWUvZGVzY3JpcHRpb24vbWFyc2hhbC9GYXVsdEJlYW5EZXNjLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MucnVudGltZS5kZXNjcmlwdGlvbi5tYXJzaGFsOwotCi0vKioKLSAqIERlc2NyaXB0aW9uIG9mIEZhdWx0QmVhbiBmb3IgYSBGYXVsdERlc2NyaXB0aW9uLiBUaGUgRmF1bHRCZWFuIGlzIHVzZWQgdG8gbWFyc2hhbCBhbmQgdW5tYXJzaGFsCi0gKiB0aGUgZXhjZXB0aW9uLiAgVGhlIEZhdWx0QmVhbiBpcyBkZXRlcm1pbmVkIHZpYSBhbm5vdGF0aW9uLCBmYXVsdEluZm8gYW5kIHBhY2thZ2UgaW50cm9zcGVjdGlvbi4KLSAqLwotcHVibGljIGludGVyZmFjZSBGYXVsdEJlYW5EZXNjIHsKLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgY2xhc3MgbmFtZSBvZiB0aGUgZmF1bHQgYmVhbiBmb3IgdGhlIEZhdWx0RGVzY3JpcHRpb24uIE5vdGUgdGhhdCB0aGUgRmF1bHRCZWFuIG1heQotICAgICAqIG5vdCBiZSBhIGJlYW4uICBJdCBjYW4gYmUgYSBub24tYmVhbiAoaS5lLiBTdHJpbmcgb3IgaW50KQotICAgICAqIDxwLz4KLSAgICAgKiBBbGdvcml0aG06IDEpIFRoZSBjbGFzcyBkZWZpbmVkIG9uIEBXZWJGYXVsdCBvZiB0aGUgZXhjZXB0aW9uIDIpIElmIG5vdCBwcmVzZW50IG9yIGludmFsaWQsCi0gICAgICogdGhlIGNsYXNzIGRlZmluZWQgYnkgZ2V0RmF1bHRJbmZvLiAzKSBJZiBub3QgcHJlc2VudCwgdGhlIGNsYXNzIGlzIGZvdW5kIGJ5IGxvb2tpbmcgZm9yIHRoZSBhCi0gICAgICogY2xhc3MgbmFtZWQgPGV4Y2VwdGlvbk5hbWU+QmVhbiBpbiB0aGUgaW50ZXJmYWNlJ3MgcGFja2FnZS4gNCkgSWYgbm90IHByZXNlbnQsIHRoZSBjbGFzcyBpcwotICAgICAqIGZvdW5kIGJ5IGxvb2tpbmcgZm9yIHRoZSBhIGNsYXNzIG5hbWVkIDxleGNlcHRpb25OYW1lPkJlYW4gaW4gdGhlIGludGVyZmFjZSArIGpheHdzIHBhY2thZ2UKLSAgICAgKgotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZhdWx0QmVhbkNsYXNzTmFtZSgpOwotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBsb2NhbCBuYW1lIG9mIHRoZSBmYXVsdCBiZWFuLiBBbGdvcml0aG06IDEpIFRoZSBuYW1lIGRlZmluZWQgb24gdGhlIEBXZWJGYXVsdCBvZiB0aGUKLSAgICAgKiBleGNlcHRpb24uIDIpIElmIG5vdCBwcmVzZW50LCB0aGUgbmFtZSBkZWZpbmVkIHZpYSB0aGUgQFhtbFJvb3RFbGVtZW50IG9mIHRoZSBmYXVsdCBiZWFuCi0gICAgICogY2xhc3MuIDMpIElmIG5vdCBwcmVzZW50LCB0aGUgPGV4Y2VwdGlvbk5hbWU+QmVhbgotICAgICAqCi0gICAgICogQHJldHVybiBsb2NhbCBuYW1lCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRGYXVsdEJlYW5Mb2NhbE5hbWUoKTsKLQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSB0YXJnZXROYW1lc3BhY2Ugb2YgdGhlIGZhdWx0IGJlYW4uIEFsZ29yaXRobTogMSkgVGhlIG5hbWVzcGFjZSBkZWZpbmVkIG9uIHRoZQotICAgICAqIEBXZWJGYXVsdCBvZiB0aGUgZXhjZXB0aW9uLiAyKSBJZiBub3QgcHJlc2VudCwgdGhlIG5hbWVzcGFjZSBkZWZpbmVkIHZpYSB0aGUgQFhtbFJvb3RFbGVtZW50Ci0gICAgICogb2YgdGhlIGNsYXNzIG5hbWUuIDMpIElmIG5vdCBwcmVzZW50LCB0aGUgbmFtZXNwYWNlIG9mIHRoZSBtZXRob2QncyBkZWNsYXJlZCBjbGFzcyArCi0gICAgICogIi9qYXh3cyIKLSAgICAgKgotICAgICAqIEByZXR1cm4gbG9jYWwgbmFtZQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmF1bHRCZWFuTmFtZXNwYWNlKCk7Ci0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcnVudGltZS9kZXNjcmlwdGlvbi9tYXJzaGFsL01hcnNoYWxTZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9ydW50aW1lL2Rlc2NyaXB0aW9uL21hcnNoYWwvTWFyc2hhbFNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzgwNWNjMy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9ydW50aW1lL2Rlc2NyaXB0aW9uL21hcnNoYWwvTWFyc2hhbFNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5ydW50aW1lLmRlc2NyaXB0aW9uLm1hcnNoYWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkZhdWx0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5PcGVyYXRpb25EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLlNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmZhY3RvcnkuTWVzc2FnZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51dGlsaXR5LlByb3BlcnR5RGVzY3JpcHRvclBsdXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwotCi0KLS8qKiBVc2VkIHRvIGNhY2hlIG1hcnNoYWwgaW5mb3JtYXRpb24gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWFyc2hhbFNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb24gZXh0ZW5kcyBTZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uIHsKLQotICAgIC8qKiBAcmV0dXJuIFNldCBvZiBwYWNrYWdlIG5hbWVzIGZvciB0aGlzIHNlcnZpY2UgKi8KLSAgICBwdWJsaWMgVHJlZVNldDxTdHJpbmc+IGdldFBhY2thZ2VzKCk7Ci0KLSAgICAvKiogQHJldHVybiBVbmlxdWUga2V5IHRoYXQgcmVwcmVzZW50cyB0aGUgb2JqZWN0IHJldHVybmVkIGJ5IGdldFBhY2thZ2VzICovCi0gICAgcHVibGljIFN0cmluZyBnZXRQYWNrYWdlc0tleSgpOwotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBBbm5vdGF0aW9uRGVzYyBmb3IgdGhpcyBjbGFzcy4gSWYgb25lIGlzIG5vdCBjYWNoZWQsIGEgbmV3IG9uZSBpcyBjcmVhdGQKLSAgICAgKgotICAgICAqIEBwYXJhbSBjbHMKLSAgICAgKiBAcmV0dXJuIEFubm90YXRpb25EZXNjCi0gICAgICovCi0gICAgcHVibGljIEFubm90YXRpb25EZXNjIGdldEFubm90YXRpb25EZXNjKENsYXNzIGNscyk7Ci0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgUHJvcGVydHlEZXNjcmlwdG9yIG1hcCBmb3IgdGhlIGNsYXNzLiBUaGUga2V5IG9mIHRoZSBtYXAgaXMgYSBjaGlsZCB4bWwgbG9jYWwgbmFtZS4KLSAgICAgKiBUaGUgdmFsdWUgaXMgYSBQcm9wZXJ0eURlc2NyaXB0b3IsIHRoYXQgd2lsbCBiZSB1c2VkIHRvIHNldC9nZXQgdmFsdWVzIGZyb20gYSBiZWFuIG9mIHRoZQotICAgICAqIGluZGljYXRlZCBjbGFzcwotICAgICAqCi0gICAgICogQHBhcmFtIGNscwotICAgICAqIEByZXR1cm4gZ2V0IHRoZSBjYWNoZWQgY29weSBvciBjcmVhdGUgYSBuZXcgb25lCi0gICAgICovCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIFByb3BlcnR5RGVzY3JpcHRvclBsdXM+IGdldFByb3BlcnR5RGVzY3JpcHRvck1hcChDbGFzcyBjbHMpOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIG9wZXJhdGlvbkRlc2MKLSAgICAgKiBAcmV0dXJuIHNwZWNpZmllZCBvciBkZWZhdWx0ZWQgd3JhcHBlciBjbGFzcyBuYW1lLiAgQWx3YXlzIHJldHVybnMgbnVsbCBpZiB0aGUgd3JhcHBlciBjbGFzcwotICAgICAqICAgICAgICAgZG9lcyBub3QgZXhpc3QuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRSZXF1ZXN0V3JhcHBlckNsYXNzTmFtZShPcGVyYXRpb25EZXNjcmlwdGlvbiBvcGVyYXRpb25EZXNjKTsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBvcGVyYXRpb25EZXNjCi0gICAgICogQHJldHVybiBzcGVjaWZpZWQgb3IgZGVmYXVsdGVkIHdyYXBwZXIgY2xhc3MgbmFtZS4gIEFsd2F5cyByZXR1cm5zIG51bGwgaWYgdGhlIHdyYXBwZXIgY2xhc3MKLSAgICAgKiAgICAgICAgIGRvZXMgbm90IGV4aXN0LgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVzcG9uc2VXcmFwcGVyQ2xhc3NOYW1lKE9wZXJhdGlvbkRlc2NyaXB0aW9uIG9wZXJhdGlvbkRlc2MpOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGZhdWx0RGVzYwotICAgICAqIEByZXR1cm4gRmF1bHRCZWFuRGVzY3JpcHRvciB0aGF0IGRlc2NyaWJlcyB0aGUgZmF1bHQgYmVhbgotICAgICAqLwotICAgIHB1YmxpYyBGYXVsdEJlYW5EZXNjIGdldEZhdWx0QmVhbkRlc2MoRmF1bHREZXNjcmlwdGlvbiBmYXVsdERlc2MpOwotCi0gICAgLyoqIEByZXR1cm4gTWVzc2FnZUZhY3RvcnkgZm9yIHRoaXMgTWFyc2hhbGxlciAqLwotICAgIHB1YmxpYyBNZXNzYWdlRmFjdG9yeSBnZXRNZXNzYWdlRmFjdG9yeSgpOwotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9ydW50aW1lL2Rlc2NyaXB0aW9uL21hcnNoYWwvTWFyc2hhbFNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb25GYWN0b3J5LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9ydW50aW1lL2Rlc2NyaXB0aW9uL21hcnNoYWwvTWFyc2hhbFNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb25GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2ZjE3N2IuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcnVudGltZS9kZXNjcmlwdGlvbi9tYXJzaGFsL01hcnNoYWxTZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnJ1bnRpbWUuZGVzY3JpcHRpb24ubWFyc2hhbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uU2VydmljZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MucnVudGltZS5kZXNjcmlwdGlvbi5tYXJzaGFsLmltcGwuTWFyc2hhbFNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb25CdWlsZGVyOwotCi1wdWJsaWMgY2xhc3MgTWFyc2hhbFNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb25GYWN0b3J5IHsKLQotICAgIC8qKiBpbnRlbnRpb25hbGx5IHByaXZhdGUgKi8KLSAgICBwcml2YXRlIE1hcnNoYWxTZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uRmFjdG9yeSgpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgb3IgY3JlYXRlIE1hcnNoYWxTZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2VydmljZURlc2MKLSAgICAgKiBAcGFyYW0gaW1wbENsYXNzCi0gICAgICogQHJldHVybiBNYXJzaGFsU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTWFyc2hhbFNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb24gZ2V0KFNlcnZpY2VEZXNjcmlwdGlvbiBzZXJ2aWNlRGVzYykgewotICAgICAgICBTdHJpbmcga2V5ID0gTWFyc2hhbFNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb25CdWlsZGVyLmdldEtleSgpOwotICAgICAgICBNYXJzaGFsU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbiBkZXNjID0KLSAgICAgICAgICAgICAgICAoTWFyc2hhbFNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb24pCi0gICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlRGVzYy5nZXRTZXJ2aWNlUnVudGltZURlc2Moa2V5KTsKLQotICAgICAgICBpZiAoZGVzYyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBkZXNjID0gTWFyc2hhbFNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb25CdWlsZGVyLmNyZWF0ZShzZXJ2aWNlRGVzYyk7Ci0gICAgICAgICAgICBzZXJ2aWNlRGVzYy5zZXRTZXJ2aWNlUnVudGltZURlc2MoZGVzYyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGRlc2M7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcnVudGltZS9kZXNjcmlwdGlvbi9tYXJzaGFsL2ltcGwvQW5ub3RhdGlvbkJ1aWxkZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3J1bnRpbWUvZGVzY3JpcHRpb24vbWFyc2hhbC9pbXBsL0Fubm90YXRpb25CdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmNGY3NmQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcnVudGltZS9kZXNjcmlwdGlvbi9tYXJzaGFsL2ltcGwvQW5ub3RhdGlvbkJ1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MucnVudGltZS5kZXNjcmlwdGlvbi5tYXJzaGFsLmltcGw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuRXhjZXB0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkVuZHBvaW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5FbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRmF1bHREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLk9wZXJhdGlvbkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uUGFyYW1ldGVyRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5TZXJ2aWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5pMThuLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MucnVudGltZS5kZXNjcmlwdGlvbi5tYXJzaGFsLkFubm90YXRpb25EZXNjOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MucnVudGltZS5kZXNjcmlwdGlvbi5tYXJzaGFsLkZhdWx0QmVhbkRlc2M7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51dGlsaXR5LkNsYXNzVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLkphdmFVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJFbGVtZW50OwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogV2Fsa3MgdGhlIFNlcnZpY2VEZXNjcmlwdGlvbiBhbmQgaXRzIGNoaWxkICpEZXNjcmlwdGlvbiBjbGFzc2VzIHRvIGZpbmQgYWxsIG9mIHRoZSB0eXBlcy4gIEFuCi0gKiBBbm5vdGF0aW9uRGVzYyBpcyBidWlsdCBmb3IgZWFjaCBvZiB0aGUgdHlwZXMKLSAqLwotcHVibGljIGNsYXNzIEFubm90YXRpb25CdWlsZGVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhBbm5vdGF0aW9uQnVpbGRlci5jbGFzcyk7Ci0KLQotICAgIC8qKiBUaGlzIGlzIGEgc3RhdGljIHV0aWxpdHkgY2xhc3MuICBUaGUgY29uc3RydWN0b3IgaXMgaW50ZW50aW9uYWxseSBwcml2YXRlICovCi0gICAgcHJpdmF0ZSBBbm5vdGF0aW9uQnVpbGRlcigpIHsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBzZXJ2aWNlRGVzY3JpcHRpb24gU2VydmljZURlc2NyaXB0aW9uCi0gICAgICogQHBhcmFtIGFwICAgICAgICAgICAgICAgICBBcnRpZmFjdFByb2Nlc3NvciB3aGljaCBmb3VuZC9wcm9kdWNlZCBhcnRpZmFjdCBjbGFzc2VzCi0gICAgICogQHJldHVybiBBbm5vdGF0aW9uRGVzYyBNYXAKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE1hcDxTdHJpbmcsIEFubm90YXRpb25EZXNjPiBnZXRBbm5vdGF0aW9uRGVzY3MoU2VydmljZURlc2NyaXB0aW9uIHNlcnZpY2VEZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnRpZmFjdFByb2Nlc3NvciBhcCkgewotICAgICAgICBNYXA8U3RyaW5nLCBBbm5vdGF0aW9uRGVzYz4gbWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBBbm5vdGF0aW9uRGVzYz4oKTsKLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbltdIGVuZHBvaW50RGVzY3MgPSBzZXJ2aWNlRGVzYy5nZXRFbmRwb2ludERlc2NyaXB0aW9ucygpOwotCi0gICAgICAgIC8vIEJ1aWxkIGEgc2V0IG9mIHBhY2thZ2VzIGZyb20gYWxsIG9mIHRoZSBlbmRwb2ludHMKLSAgICAgICAgaWYgKGVuZHBvaW50RGVzY3MgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbmRwb2ludERlc2NzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgZ2V0QW5ub3RhdGlvbkRlc2NzKGVuZHBvaW50RGVzY3NbaV0sIGFwLCBtYXApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtYXA7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gZW5kcG9pbnREZXNjCi0gICAgICogQHBhcmFtIGFwICAgICAgICAgICBBcnRpZmFjdFByb2Nlc3NvciB3aGljaCBmb3VuZC9wcm9kdWNlZCBhcnRpZmFjdCBjbGFzc2VzCi0gICAgICogQHBhcmFtIG1hcAotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZ2V0QW5ub3RhdGlvbkRlc2NzKEVuZHBvaW50RGVzY3JpcHRpb24gZW5kcG9pbnREZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFydGlmYWN0UHJvY2Vzc29yIGFwLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBBbm5vdGF0aW9uRGVzYz4gbWFwKSB7Ci0gICAgICAgIFN0cmluZyBpbXBsQ2xhc3NOYW1lID0gZ2V0U2VydmljZUltcGxDbGFzc05hbWUoZW5kcG9pbnREZXNjKTsKLSAgICAgICAgaWYgKGltcGxDbGFzc05hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgQ2xhc3MgY2x6OwotICAgICAgICAgICAgY2x6ID0gbG9hZENsYXNzKGltcGxDbGFzc05hbWUpOwotICAgICAgICAgICAgaWYoY2x6ID09IG51bGwpewotICAgICAgICAgICAgICAgIGNseiA9IGxvYWRDbGFzcyhpbXBsQ2xhc3NOYW1lLCBlbmRwb2ludERlc2MuZ2V0QXhpc1NlcnZpY2UoKS5nZXRDbGFzc0xvYWRlcigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChjbHogIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGFkZEFubm90YXRpb24oZW5kcG9pbnREZXNjLCBjbHosIG1hcCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiBlbmRwb2ludEludGVyZmFjZURlc2MgPQotICAgICAgICAgICAgICAgIGVuZHBvaW50RGVzYy5nZXRFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgIGlmIChlbmRwb2ludEludGVyZmFjZURlc2MgIT0gbnVsbCkgewotICAgICAgICAgICAgZ2V0QW5ub3RhdGlvbkRlc2NzKGVuZHBvaW50RGVzYywgZW5kcG9pbnRJbnRlcmZhY2VEZXNjLCBhcCwgbWFwKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGVuZHBvaW50SW50ZXJmYWNlRGVzYwotICAgICAqIEBwYXJhbSBhcCAgICAgICAgICAgICAgICAgICAgQXJ0aWZhY3RQcm9jZXNzb3Igd2hpY2ggZm91bmQvcHJvZHVjZWQgYXJ0aWZhY3QgY2xhc3NlcwotICAgICAqIEBwYXJhbSBtYXAKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGdldEFubm90YXRpb25EZXNjcyhFbmRwb2ludERlc2NyaXB0aW9uIGVuZHBvaW50RGVzYywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiBlbmRwb2ludEludGVyZmFjZURlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJ0aWZhY3RQcm9jZXNzb3IgYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgQW5ub3RhdGlvbkRlc2M+IG1hcCkgewotICAgICAgICBDbGFzcyBjbHogPSBlbmRwb2ludEludGVyZmFjZURlc2MuZ2V0U0VJQ2xhc3MoKTsKLSAgICAgICAgaWYgKGNseiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBhZGRBbm5vdGF0aW9uKGVuZHBvaW50RGVzYywgY2x6LCBtYXApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBEb24ndCBkaWcgaW50byB0aGUgYXN5bmMgb3BlcmF0aW9ucwotICAgICAgICBPcGVyYXRpb25EZXNjcmlwdGlvbltdIG9wRGVzY3MgPSBlbmRwb2ludEludGVyZmFjZURlc2MuZ2V0RGlzcGF0Y2hhYmxlT3BlcmF0aW9ucygpOwotCi0gICAgICAgIC8vIEJ1aWxkIGEgc2V0IG9mIHBhY2thZ2VzIGZyb20gYWxsIG9mIHRoZSBvcGVydGlvbnMKLSAgICAgICAgaWYgKG9wRGVzY3MgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvcERlc2NzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgZ2V0QW5ub3RhdGlvbkRlc2NzKGVuZHBvaW50RGVzYywgb3BEZXNjc1tpXSwgYXAsIG1hcCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIEdldCBhbm5vdGF0aW9ucyBmb3IgdGhpcyBvcGVyYXRpb24KLSAgICAgKgotICAgICAqIEBwYXJhbSBvcERlc2MKLSAgICAgKiBAcGFyYW0gYXAgICAgIEFydGlmYWN0UHJvY2Vzc29yIHdoaWNoIGZvdW5kL3Byb2R1Y2VkIGFydGlmYWN0IGNsYXNzZXMKLSAgICAgKiBAcGFyYW0gbWFwCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBnZXRBbm5vdGF0aW9uRGVzY3MoRW5kcG9pbnREZXNjcmlwdGlvbiBlbmRwb2ludERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmF0aW9uRGVzY3JpcHRpb24gb3BEZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFydGlmYWN0UHJvY2Vzc29yIGFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIEFubm90YXRpb25EZXNjPiBtYXApIHsKLQotICAgICAgICAvLyBXYWxrIHRoZSBwYXJhbWV0ZXIgaW5mb3JtYXRpb24KLSAgICAgICAgUGFyYW1ldGVyRGVzY3JpcHRpb25bXSBwYXJhbWV0ZXJEZXNjcyA9IG9wRGVzYy5nZXRQYXJhbWV0ZXJEZXNjcmlwdGlvbnMoKTsKLSAgICAgICAgaWYgKHBhcmFtZXRlckRlc2NzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1ldGVyRGVzY3MubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBnZXRBbm5vdGF0aW9uRGVzY3MoZW5kcG9pbnREZXNjLCBwYXJhbWV0ZXJEZXNjc1tpXSwgbWFwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIFdhbGsgdGhlIGZhdWx0IGluZm9ybWF0aW9uCi0gICAgICAgIEZhdWx0RGVzY3JpcHRpb25bXSBmYXVsdERlc2NzID0gb3BEZXNjLmdldEZhdWx0RGVzY3JpcHRpb25zKCk7Ci0gICAgICAgIGlmIChmYXVsdERlc2NzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmF1bHREZXNjcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGdldEFubm90YXRpb25EZXNjcyhlbmRwb2ludERlc2MsIGZhdWx0RGVzY3NbaV0sIGFwLCBtYXApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQWxzbyBjb25zaWRlciB0aGUgcmVxdWVzdCBhbmQgcmVzcG9uc2Ugd3JhcHBlcnMKLSAgICAgICAgU3RyaW5nIHdyYXBwZXJOYW1lID0gYXAuZ2V0UmVxdWVzdFdyYXBwZXJNYXAoKS5nZXQob3BEZXNjKTsKLSAgICAgICAgaWYgKHdyYXBwZXJOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIGFkZEFubm90YXRpb24oZW5kcG9pbnREZXNjLCB3cmFwcGVyTmFtZSwgbWFwKTsKLSAgICAgICAgfQotICAgICAgICB3cmFwcGVyTmFtZSA9IGFwLmdldFJlc3BvbnNlV3JhcHBlck1hcCgpLmdldChvcERlc2MpOwotICAgICAgICBpZiAod3JhcHBlck5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgYWRkQW5ub3RhdGlvbihlbmRwb2ludERlc2MsIHdyYXBwZXJOYW1lLCBtYXApOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gRmluYWxseSBjb25zaWRlciB0aGUgcmVzdWx0IHR5cGUKLSAgICAgICAgQ2xhc3MgY2xzID0gb3BEZXNjLmdldFJlc3VsdEFjdHVhbFR5cGUoKTsKLSAgICAgICAgaWYgKGNscyAhPSBudWxsICYmIGNscyAhPSB2b2lkLmNsYXNzICYmIGNscyAhPSBWb2lkLmNsYXNzKSB7Ci0gICAgICAgICAgICBhZGRBbm5vdGF0aW9uKGVuZHBvaW50RGVzYywgY2xzLCBtYXApOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGdldEFubm90YXRpb25EZXNjcyhFbmRwb2ludERlc2NyaXB0aW9uIGVuZHBvaW50RGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXJEZXNjcmlwdGlvbiBwYXJhbURlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgQW5ub3RhdGlvbkRlc2M+IG1hcCkgewotCi0gICAgICAgIC8vIEdldCB0aGUgdHlwZSB0aGF0IGRlZmluZXMgdGhlIGFjdHVhbCBkYXRhLiAgKHRoaXMgaXMgbmV2ZXIgYSBob2xkZXIgKQotICAgICAgICBDbGFzcyBwYXJhbUNsYXNzID0gcGFyYW1EZXNjLmdldFBhcmFtZXRlckFjdHVhbFR5cGUoKTsKLQotICAgICAgICBpZiAocGFyYW1DbGFzcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBnZXRUeXBlQW5ub3RhdGlvbkRlc2NzKGVuZHBvaW50RGVzYywgcGFyYW1DbGFzcywgbWFwKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXBkYXRlIHRoZSBwYWNrYWdlIHNldCB3aXRoIHRoZSBwYWNrYWdlcyByZWZlcmVuY2VkIGJ5IHRoaXMgRmF1bHREZXNjcmlwdGlvbgotICAgICAqCi0gICAgICogQHBhcmFtIGZhdWx0RGVzYyBGYXVsdERlc2NyaXB0aW9uCi0gICAgICogQHBhcmFtIHNldCAgICAgICBTZXQ8UGFja2FnZT4gdGhhdCBpcyB1cGRhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBnZXRBbm5vdGF0aW9uRGVzY3MoRW5kcG9pbnREZXNjcmlwdGlvbiBlbmRwb2ludERlc2MsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZhdWx0RGVzY3JpcHRpb24gZmF1bHREZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFydGlmYWN0UHJvY2Vzc29yIGFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIEFubm90YXRpb25EZXNjPiBtYXApIHsKLSAgICAgICAgRmF1bHRCZWFuRGVzYyBmYXVsdEJlYW5EZXNjID0gYXAuZ2V0RmF1bHRCZWFuRGVzY01hcCgpLmdldChmYXVsdERlc2MpOwotICAgICAgICBDbGFzcyBmYXVsdEJlYW4gPSBsb2FkQ2xhc3MoZmF1bHRCZWFuRGVzYy5nZXRGYXVsdEJlYW5DbGFzc05hbWUoKSk7Ci0gICAgICAgIGlmKGZhdWx0QmVhbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICBmYXVsdEJlYW4gPSBsb2FkQ2xhc3MoZmF1bHRCZWFuRGVzYy5nZXRGYXVsdEJlYW5DbGFzc05hbWUoKSwgZW5kcG9pbnREZXNjLmdldEF4aXNTZXJ2aWNlKCkuZ2V0Q2xhc3NMb2FkZXIoKSk7ICAgIAotICAgICAgICB9Ci0gICAgICAgIGlmIChmYXVsdEJlYW4gIT0gbnVsbCkgewotICAgICAgICAgICAgZ2V0VHlwZUFubm90YXRpb25EZXNjcyhlbmRwb2ludERlc2MsIGZhdWx0QmVhbiwgbWFwKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIENsYXNzW10gbm9DbGFzcyA9IG5ldyBDbGFzc1tdIHsgfTsKLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgYW5ub3RhdGlvbnMgZm9yIHRoaXMgdHlwZQotICAgICAqCi0gICAgICogQHBhcmFtIGNscwotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZ2V0VHlwZUFubm90YXRpb25EZXNjcyhFbmRwb2ludERlc2NyaXB0aW9uIGVuZHBvaW50RGVzYywgQ2xhc3MgY2xzLCBNYXA8U3RyaW5nLCBBbm5vdGF0aW9uRGVzYz4gbWFwKSB7Ci0KLSAgICAgICAgaWYgKEpBWEJFbGVtZW50LmNsYXNzLmlzQXNzaWduYWJsZUZyb20oY2xzKSkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBNZXRob2QgbSA9IGNscy5nZXRNZXRob2QoImdldFZhbHVlIiwgbm9DbGFzcyk7Ci0gICAgICAgICAgICAgICAgQ2xhc3MgY2xzMiA9IG0uZ2V0UmV0dXJuVHlwZSgpOwotICAgICAgICAgICAgICAgIGFkZEFubm90YXRpb24oZW5kcG9pbnREZXNjLCBjbHMyLCBtYXApOwotCi0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIFdlIHNob3VsZCBuZXZlciBnZXQgaGVyZQotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkNhbm5vdCBmaW5kIEpBWEJFbGVtZW50LmdldFZhbHVlIG1ldGhvZC4iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBhZGRBbm5vdGF0aW9uKGVuZHBvaW50RGVzYywgY2xzLCBtYXApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRBbm5vdGF0aW9uKEVuZHBvaW50RGVzY3JpcHRpb24gZW5kcG9pbnREZXNjLCBTdHJpbmcgY2xhc3NOYW1lLCBNYXA8U3RyaW5nLCBBbm5vdGF0aW9uRGVzYz4gbWFwKSB7Ci0KLSAgICAgICAgaWYgKG1hcC5nZXQoY2xhc3NOYW1lKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBDbGFzcyBjbHogPSBsb2FkQ2xhc3MoY2xhc3NOYW1lKTsKLSAgICAgICAgICAgIGlmIChjbHogPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNseiA9IGxvYWRDbGFzcyhjbGFzc05hbWUsIGVuZHBvaW50RGVzYy5nZXRBeGlzU2VydmljZSgpLmdldENsYXNzTG9hZGVyKCkpOyAgICAKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChjbHogIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGFkZEFubm90YXRpb24oZW5kcG9pbnREZXNjLCBjbHosIG1hcCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFkZEFubm90YXRpb24oRW5kcG9pbnREZXNjcmlwdGlvbiBlbmRwb2ludERlc2MsIENsYXNzIGNscywgTWFwPFN0cmluZywgQW5ub3RhdGlvbkRlc2M+IG1hcCkgewotCi0gICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBjbHMuZ2V0Q2Fub25pY2FsTmFtZSgpOwotICAgICAgICBpZiAobWFwLmdldChjbGFzc05hbWUpID09IG51bGwpIHsKLSAgICAgICAgICAgIEFubm90YXRpb25EZXNjIGRlc2MgPSBBbm5vdGF0aW9uRGVzY0ltcGwuY3JlYXRlKGNscyk7Ci0gICAgICAgICAgICBtYXAucHV0KGNsYXNzTmFtZSwgZGVzYyk7Ci0gICAgICAgICAgICBpZiAoY2xzLmlzUHJpbWl0aXZlKCkpIHsKLSAgICAgICAgICAgICAgICBDbGFzcyBjbGFzczIgPSBDbGFzc1V0aWxzLmdldFdyYXBwZXJDbGFzcyhjbHMpOwotICAgICAgICAgICAgICAgIEFubm90YXRpb25EZXNjIGRlc2MyID0gQW5ub3RhdGlvbkRlc2NJbXBsLmNyZWF0ZShjbGFzczIpOwotICAgICAgICAgICAgICAgIG1hcC5wdXQoY2xhc3MyLmdldENhbm9uaWNhbE5hbWUoKSwgZGVzYzIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBDbGFzcyBjbGFzczIgPSBDbGFzc1V0aWxzLmdldFByaW1pdGl2ZUNsYXNzKGNscyk7Ci0gICAgICAgICAgICAgICAgaWYgKGNsYXNzMiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFubm90YXRpb25EZXNjIGRlc2MyID0gQW5ub3RhdGlvbkRlc2NJbXBsLmNyZWF0ZShjbGFzczIpOwotICAgICAgICAgICAgICAgICAgICBtYXAucHV0KGNsYXNzMi5nZXRDYW5vbmljYWxOYW1lKCksIGRlc2MyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIEluc3BlY3QgdGhlIGludGVyZmFjZXMuICBUaGlzIGlzIGRvbmUgdG8gcGljayB1cCBvdGhlcgotICAgICAgICAgICAgLy8gQFhtbFNlZUFsc28gdXNhZ2VzLgotICAgICAgICAgICAgQ2xhc3NbXSBpbnRlcmZhY2VzID0gY2xzLmdldEludGVyZmFjZXMoKTsKLSAgICAgICAgICAgIGlmIChpbnRlcmZhY2VzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8aW50ZXJmYWNlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBhZGRBbm5vdGF0aW9uKGVuZHBvaW50RGVzYywgaW50ZXJmYWNlc1tpXSwgbWFwKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIExvYWRzIHRoZSBjbGFzcwotICAgICAqCi0gICAgICogQHBhcmFtIGNsYXNzTmFtZQotICAgICAqIEByZXR1cm4gQ2xhc3MgKG9yIG51bGwgaWYgdGhlIGNsYXNzIGNhbm5vdCBiZSBsb2FkZWQpCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3MgbG9hZENsYXNzKFN0cmluZyBjbGFzc05hbWUsIENsYXNzTG9hZGVyIGxvYWRlcikgewotICAgICAgICAvLyBEb24ndCBtYWtlIHRoaXMgcHVibGljLCBpdHMgYSBzZWN1cml0eSBleHBvc3VyZQotICAgICAgICBpZiAoY2xhc3NOYW1lID09IG51bGwgfHwgY2xhc3NOYW1lLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0KLSAgICAgICAgICAgIHJldHVybiBmb3JOYW1lKGNsYXNzTmFtZSwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlcik7Ci0gICAgICAgICAgICAvL0NhdGNoIFRocm93YWJsZSBhcyBDbGFzc0xvYWRlciBjYW4gdGhyb3cgYW4gTm9DbGFzc0RlZkZvdW5kRXJyb3IgdGhhdAotICAgICAgICAgICAgLy9kb2VzIG5vdCBleHRlbmQgRXhjZXB0aW9uLCBzbyBsZXRzIGNhdGNoIGV2ZXJ5dGhpbmcgdGhhdCBleHRlbmRzIFRocm93YWJsZQotICAgICAgICAgICAgLy9yYXRoZXIgdGhhbiBqdXN0IEV4Y2VwdGlvbi4KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLSAgICAgICAgICAgIC8vIERlcGVuZGluZyBvbiB0aGUgamF4d3Mgc2NlbmFyaW8sIGl0IGlzIG5vcm1hbCB0aGF0IHNvbWUgY2xhc3NlcyBhcmUgbm90IGF2YWlsYWJsZS4KLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQW5ub3RhdGlvbkJ1aWxkZXIgZGlkIG5vdCBmaW5kIHRoZSBmb2xsb3dpbmcgY2xhc3M6IiArIGNsYXNzTmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTG9hZHMgdGhlIGNsYXNzCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2xhc3NOYW1lCi0gICAgICogQHJldHVybiBDbGFzcyAob3IgbnVsbCBpZiB0aGUgY2xhc3MgY2Fubm90IGJlIGxvYWRlZCkKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBDbGFzcyBsb2FkQ2xhc3MoU3RyaW5nIGNsYXNzTmFtZSkgewotICAgICAgICAvLyBEb24ndCBtYWtlIHRoaXMgcHVibGljLCBpdHMgYSBzZWN1cml0eSBleHBvc3VyZQotICAgICAgICBpZiAoY2xhc3NOYW1lID09IG51bGwgfHwgY2xhc3NOYW1lLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0KLSAgICAgICAgICAgIHJldHVybiBmb3JOYW1lKGNsYXNzTmFtZSwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldENvbnRleHRDbGFzc0xvYWRlcigpKTsKLSAgICAgICAgICAgIC8vQ2F0Y2ggVGhyb3dhYmxlIGFzIENsYXNzTG9hZGVyIGNhbiB0aHJvdyBhbiBOb0NsYXNzRGVmRm91bmRFcnJvciB0aGF0Ci0gICAgICAgICAgICAvL2RvZXMgbm90IGV4dGVuZCBFeGNlcHRpb24sIHNvIGxldHMgY2F0Y2ggZXZlcnl0aGluZyB0aGF0IGV4dGVuZHMgVGhyb3dhYmxlCi0gICAgICAgICAgICAvL3JhdGhlciB0aGFuIGp1c3QgRXhjZXB0aW9uLgotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkgewotICAgICAgICAgICAgLy8gRGVwZW5kaW5nIG9uIHRoZSBqYXh3cyBzY2VuYXJpbywgaXQgaXMgbm9ybWFsIHRoYXQgc29tZSBjbGFzc2VzIGFyZSBub3QgYXZhaWxhYmxlLgotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJBbm5vdGF0aW9uQnVpbGRlciBkaWQgbm90IGZpbmQgdGhlIGZvbGxvd2luZyBjbGFzczoiICsgY2xhc3NOYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIGNsYXNzIGZvciB0aGlzIG5hbWUKLSAgICAgKgotICAgICAqIEByZXR1cm4gQ2xhc3MKLSAgICAgKi8KLSAgICBzdGF0aWMgQ2xhc3MgZm9yTmFtZShmaW5hbCBTdHJpbmcgY2xhc3NOYW1lLCBmaW5hbCBib29sZWFuIGluaXRpYWxpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ2xhc3NMb2FkZXIgY2xhc3Nsb2FkZXIpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gTk9URTogVGhpcyBtZXRob2QgbXVzdCByZW1haW4gcHJvdGVjdGVkIGJlY2F1c2UgaXQgdXNlcyBBY2Nlc3NDb250cm9sbGVyCi0gICAgICAgIENsYXNzIGNsID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNsID0gKENsYXNzKUFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAotICAgICAgICAgICAgICAgICAgICBuZXcgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENsYXNzLmZvck5hbWUgZG9lcyBub3Qgc3VwcG9ydCBwcmltaXRpdmVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MgY2xzID0gQ2xhc3NVdGlscy5nZXRQcmltaXRpdmVDbGFzcyhjbGFzc05hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbHMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHMgPSBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSwgaW5pdGlhbGl6ZSwgY2xhc3Nsb2FkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2xzOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICApOwotICAgICAgICB9IGNhdGNoIChQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8qIEFuIGV4Y2VwdGlvbiBzaG91bGQgTk9UIGJlIGxvZ2dlZC4gIERlcGVuZGluZyBvbiB0aGUgSkFYV1Mgc2NlbmFyaW8sIGNlcnRhaW4gY2xhc3NlcyAKLSAgICAgICAgICAgICAqIG1heSBvciBtYXkgbm90IGV4aXN0LiAgUHV0dGluZyBhbiBleGNlcHRpb24gaW4gdGhlIGxvZyB3aWxsIGNvbmZ1c2UgcHJvZ3JhbW1lcnMgd2hvCi0gICAgICAgICAgICAgKiBhcmUgc2VydmljaW5nIHRoZSBwcm9kdWN0Ci0gICAgICAgICAgICAgKiAKLSAgICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiRXhjZXB0aW9uIHRocm93biBmcm9tIEFjY2Vzc0NvbnRyb2xsZXI6ICIgKyBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICovCi0gICAgICAgICAgICB0aHJvdyAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbillLmdldEV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGNsOwotICAgIH0KLQotICAgIC8qKiBAcmV0dXJuIENsYXNzTG9hZGVyICovCi0gICAgc3RhdGljIENsYXNzTG9hZGVyIGdldENvbnRleHRDbGFzc0xvYWRlcigpIHsKLSAgICAgICAgLy8gTk9URTogVGhpcyBtZXRob2QgbXVzdCByZW1haW4gcHJpdmF0ZSBiZWNhdXNlIGl0IHVzZXMgQWNjZXNzQ29udHJvbGxlcgotICAgICAgICBDbGFzc0xvYWRlciBjbCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjbCA9IChDbGFzc0xvYWRlcilBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgKLSAgICAgICAgICAgICAgICAgICAgbmV3IFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgKTsKLSAgICAgICAgfSBjYXRjaCAoUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkV4Y2VwdGlvbiB0aHJvd24gZnJvbSBBY2Nlc3NDb250cm9sbGVyOiAiICsgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbillLmdldEV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGNsOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIFNlcml2Y2UgSW1wbCBDbGFzcyBieSBsb29raW5nIGF0IHRoZSBBeGlzU2VydmljZQotICAgICAqIEBwYXJhbSBlbmRwb2ludERlc2NyaXB0aW9uCi0gICAgICogQHJldHVybiBjbGFzcyBuYW1lIG9yIG51bGwKLSAgICAgKi8KLSAgICBzdGF0aWMgcHJpdmF0ZSBTdHJpbmcgZ2V0U2VydmljZUltcGxDbGFzc05hbWUoRW5kcG9pbnREZXNjcmlwdGlvbiBlbmRwb2ludERlc2NyaXB0aW9uKSB7Ci0gICAgICAgIFN0cmluZyByZXN1bHQgPSBudWxsOwotICAgICAgICBpZiAoZW5kcG9pbnREZXNjcmlwdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBBeGlzU2VydmljZSBhcyA9IGVuZHBvaW50RGVzY3JpcHRpb24uZ2V0QXhpc1NlcnZpY2UoKTsKLSAgICAgICAgICAgIGlmIChhcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgUGFyYW1ldGVyIHBhcmFtID0gYXMuZ2V0UGFyYW1ldGVyKG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzLlNFUlZJQ0VfQ0xBU1MpOwotCi0gICAgICAgICAgICAgICAgLy8gSWYgdGhlcmUgd2FzIG5vIGltcGxlbWVudGF0aW9uIGNsYXNzLCB3ZSBzaG91bGQgbm90IGdvIGFueSBmdXJ0aGVyCi0gICAgICAgICAgICAgICAgaWYgKHBhcmFtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKChTdHJpbmcpcGFyYW0uZ2V0VmFsdWUoKSkudHJpbSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3J1bnRpbWUvZGVzY3JpcHRpb24vbWFyc2hhbC9pbXBsL0Fubm90YXRpb25EZXNjSW1wbC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcnVudGltZS9kZXNjcmlwdGlvbi9tYXJzaGFsL2ltcGwvQW5ub3RhdGlvbkRlc2NJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4YTk0MzIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcnVudGltZS9kZXNjcmlwdGlvbi9tYXJzaGFsL2ltcGwvQW5ub3RhdGlvbkRlc2NJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnJ1bnRpbWUuZGVzY3JpcHRpb24ubWFyc2hhbC5pbXBsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5ydW50aW1lLmRlc2NyaXB0aW9uLm1hcnNoYWwuQW5ub3RhdGlvbkRlc2M7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51dGlsaXR5LlhNTFJvb3RFbGVtZW50VXRpbDsKLQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sU2VlQWxzbzsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbjsKLQotLyoqCi0gKiBDb21tb24gYW5ub3RhdGlvbiBpbmZvcm1hdGlvbiBmb3IgYSBjbGFzcy4gVGhpcyBpcyBzZXR1cCBvbmNlCi0gKiBzbyB0aGF0IGFuZCBzdG9yZWQgaW4gdGhlIEFubm90YXRpb25EZXNjIHNvIHRoYXQgaXQgaXMgZWFzaWx5IGFjY2Vzc2libGUuCi0gKi8KLWNsYXNzIEFubm90YXRpb25EZXNjSW1wbCBpbXBsZW1lbnRzIEFubm90YXRpb25EZXNjIHsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBfaGFzWG1sUm9vdEVsZW1lbnQgPSBmYWxzZTsKLSAgICBwcml2YXRlIFN0cmluZyBfWG1sUm9vdEVsZW1lbnROYW1lID0gbnVsbDsKLSAgICBwcml2YXRlIFN0cmluZyBfWG1sUm9vdEVsZW1lbnROYW1lc3BhY2UgPSBudWxsOwotICAgIHByaXZhdGUgQ2xhc3NbXSBfWG1sU2VlQWxzb0NsYXNzZXMgPSBudWxsOwotCi0gICAgcHJpdmF0ZSBBbm5vdGF0aW9uRGVzY0ltcGwoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaGFzWG1sUm9vdEVsZW1lbnQoKSB7Ci0gICAgICAgIHJldHVybiBfaGFzWG1sUm9vdEVsZW1lbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRYbWxSb290RWxlbWVudE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBfWG1sUm9vdEVsZW1lbnROYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0WG1sUm9vdEVsZW1lbnROYW1lc3BhY2UoKSB7Ci0gICAgICAgIHJldHVybiBfWG1sUm9vdEVsZW1lbnROYW1lc3BhY2U7Ci0gICAgfQotCi0gICAgc3RhdGljIEFubm90YXRpb25EZXNjIGNyZWF0ZShDbGFzcyBjbHMpIHsKLSAgICAgICAgQW5ub3RhdGlvbkRlc2NJbXBsIGFEZXNjID0gbmV3IEFubm90YXRpb25EZXNjSW1wbCgpOwotCi0gICAgICAgIC8vIFhNTFNlZUFsc28gaXMgcGFydCBvZiBKQVhCIDIuMS4yLiAgCi0gICAgICAgIC8vIFRoZSBhc3N1bXB0aW9uIGlzIHRoYXQgdGhpcyBpcyBhIHByZXJlcSBmb3IgSkFYV1MgMi4xOyB0aHVzCi0gICAgICAgIC8vIHdlIGNhbiBzYWZlbHkgcmVmZXJlbmNlIHRoaXMgY2xhc3MKLSAgICAgICAgWG1sU2VlQWxzbyB4bWxTZWVBbHNvID0gKFhtbFNlZUFsc28pCi0gICAgICAgICAgICBnZXRBbm5vdGF0aW9uKGNscywgWG1sU2VlQWxzby5jbGFzcyk7Ci0gICAgICAgIAotICAgICAgICBpZiAoeG1sU2VlQWxzbyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBhRGVzYy5fWG1sU2VlQWxzb0NsYXNzZXMgPSB4bWxTZWVBbHNvLnZhbHVlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIFFOYW1lIHFOYW1lID0gWE1MUm9vdEVsZW1lbnRVdGlsLmdldFhtbFJvb3RFbGVtZW50UU5hbWUoY2xzKTsKLSAgICAgICAgaWYgKHFOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIGFEZXNjLl9oYXNYbWxSb290RWxlbWVudCA9IHRydWU7Ci0gICAgICAgICAgICBhRGVzYy5fWG1sUm9vdEVsZW1lbnROYW1lID0gcU5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICBhRGVzYy5fWG1sUm9vdEVsZW1lbnROYW1lc3BhY2UgPSBxTmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYURlc2M7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIG5ld2xpbmUgPSAiXG4iOwotICAgICAgICBTdHJpbmdCdWZmZXIgc3RyaW5nID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0gICAgICAgIHN0cmluZy5hcHBlbmQobmV3bGluZSk7Ci0gICAgICAgIHN0cmluZy5hcHBlbmQoIiAgICAgIEBYTUxSb290RWxlbWVudCBleGlzdHMgPSAiICsgdGhpcy5oYXNYbWxSb290RWxlbWVudCgpKTsKLQotICAgICAgICBpZiAodGhpcy5oYXNYbWxSb290RWxlbWVudCgpKSB7Ci0gICAgICAgICAgICBzdHJpbmcuYXBwZW5kKG5ld2xpbmUpOwotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZCgiICAgICAgQFhNTFJvb3RFbGVtZW50IG5hbWVzcGFjZSA9ICIgKyB0aGlzLmdldFhtbFJvb3RFbGVtZW50TmFtZXNwYWNlKCkpOwotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZChuZXdsaW5lKTsKLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQoIiAgICAgIEBYTUxSb290RWxlbWVudCBuYW1lICAgICAgPSAiICsgdGhpcy5nZXRYbWxSb290RWxlbWVudE5hbWUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodGhpcy5fWG1sU2VlQWxzb0NsYXNzZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPF9YbWxTZWVBbHNvQ2xhc3Nlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIHN0cmluZy5hcHBlbmQobmV3bGluZSk7Ci0gICAgICAgICAgICAgICAgc3RyaW5nLmFwcGVuZCgiICAgICAgQFhNTFNlZUFsc28gY2xhc3MgPSAiICsgdGhpcy5fWG1sU2VlQWxzb0NsYXNzZXNbaV0uZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzdHJpbmcudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2xhc3NbXSBnZXRYbWxTZWVBbHNvQ2xhc3NlcygpIHsKLSAgICAgICAgcmV0dXJuIF9YbWxTZWVBbHNvQ2xhc3NlczsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogR2V0IGFuIGFubm90YXRpb24uICBUaGlzIGlzIHdyYXBwZXJlZCB0byBhdm9pZCBhIEphdmEyU2VjdXJpdHkgdmlvbGF0aW9uLgotICAgICAqIEBwYXJhbSBjbHMgQ2xhc3MgdGhhdCBjb250YWlucyBhbm5vdGF0aW9uIAotICAgICAqIEBwYXJhbSBhbm5vdGF0aW9uIENsYXNzIG9mIHJlcXVyZXN0ZWQgQW5ub3RhdGlvbgotICAgICAqIEByZXR1cm4gYW5ub3RhdGlvbiBvciBudWxsCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKGZpbmFsIEFubm90YXRlZEVsZW1lbnQgZWxlbWVudCwgZmluYWwgQ2xhc3MgYW5ub3RhdGlvbikgewotICAgICAgICByZXR1cm4gKEFubm90YXRpb24pIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkQWN0aW9uKCkgewotICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuZ2V0QW5ub3RhdGlvbihhbm5vdGF0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcnVudGltZS9kZXNjcmlwdGlvbi9tYXJzaGFsL2ltcGwvQXJ0aWZhY3RQcm9jZXNzb3IuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3J1bnRpbWUvZGVzY3JpcHRpb24vbWFyc2hhbC9pbXBsL0FydGlmYWN0UHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5ZTc4YWIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcnVudGltZS9kZXNjcmlwdGlvbi9tYXJzaGFsL2ltcGwvQXJ0aWZhY3RQcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MucnVudGltZS5kZXNjcmlwdGlvbi5tYXJzaGFsLmltcGw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLkV4Y2VwdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5FbmRwb2ludERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRmF1bHREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLk9wZXJhdGlvbkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uU2VydmljZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MucnVudGltZS5kZXNjcmlwdGlvbi5tYXJzaGFsLkFubm90YXRpb25EZXNjOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MucnVudGltZS5kZXNjcmlwdGlvbi5tYXJzaGFsLkZhdWx0QmVhbkRlc2M7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51dGlsaXR5LkNsYXNzVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogRXhhbWluZXMgYSBTZXJ2aWNlRGVzYyBhbmQgbG9jYXRlcyBhbmQvb3IgYnVpbGRzIHRoZSBKQVgtV1MgYXJ0aWZhY3RzLiBUaGUgSkFYLVdTIGFydGlmYWN0cyBhcmU6Ci0gKiAtIHJlcXVlc3Qgd3JhcHBlciBjbGFzc2VzIC0gcmVzcG9uc2Ugd3JhcHBlciBjbGFzc2VzIC0gZmF1bHQgYmVhbnMgZm9yIG5vbi1KQVgtV1MgY29tcGxpYW50Ci0gKiBleGNlcHRpb25zCi0gKi8KLWNsYXNzIEFydGlmYWN0UHJvY2Vzc29yIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhBcnRpZmFjdFByb2Nlc3Nvci5jbGFzcyk7Ci0KLSAgICBwcml2YXRlIFNlcnZpY2VEZXNjcmlwdGlvbiBzZXJ2aWNlRGVzYzsKLSAgICBwcml2YXRlIE1hcDxPcGVyYXRpb25EZXNjcmlwdGlvbiwgU3RyaW5nPiByZXF1ZXN0V3JhcHBlck1hcCA9Ci0gICAgICAgICAgICBuZXcgSGFzaE1hcDxPcGVyYXRpb25EZXNjcmlwdGlvbiwgU3RyaW5nPigpOwotICAgIHByaXZhdGUgTWFwPE9wZXJhdGlvbkRlc2NyaXB0aW9uLCBTdHJpbmc+IHJlc3BvbnNlV3JhcHBlck1hcCA9Ci0gICAgICAgICAgICBuZXcgSGFzaE1hcDxPcGVyYXRpb25EZXNjcmlwdGlvbiwgU3RyaW5nPigpOwotICAgIHByaXZhdGUgTWFwPEZhdWx0RGVzY3JpcHRpb24sIEZhdWx0QmVhbkRlc2M+IGZhdWx0QmVhbkRlc2NNYXAgPQotICAgICAgICAgICAgbmV3IEhhc2hNYXA8RmF1bHREZXNjcmlwdGlvbiwgRmF1bHRCZWFuRGVzYz4oKTsKLQotICAgIC8qKgotICAgICAqIEFydGlmYWN0IFByb2Nlc3NvcgotICAgICAqCi0gICAgICogQHBhcmFtIHNlcnZpY2VEZXNjCi0gICAgICovCi0gICAgQXJ0aWZhY3RQcm9jZXNzb3IoU2VydmljZURlc2NyaXB0aW9uIHNlcnZpY2VEZXNjKSB7Ci0gICAgICAgIHRoaXMuc2VydmljZURlc2MgPSBzZXJ2aWNlRGVzYzsKLSAgICB9Ci0KLSAgICBNYXA8T3BlcmF0aW9uRGVzY3JpcHRpb24sIFN0cmluZz4gZ2V0UmVxdWVzdFdyYXBwZXJNYXAoKSB7Ci0gICAgICAgIHJldHVybiByZXF1ZXN0V3JhcHBlck1hcDsKLSAgICB9Ci0KLSAgICBNYXA8T3BlcmF0aW9uRGVzY3JpcHRpb24sIFN0cmluZz4gZ2V0UmVzcG9uc2VXcmFwcGVyTWFwKCkgewotICAgICAgICByZXR1cm4gcmVzcG9uc2VXcmFwcGVyTWFwOwotICAgIH0KLQotICAgIE1hcDxGYXVsdERlc2NyaXB0aW9uLCBGYXVsdEJlYW5EZXNjPiBnZXRGYXVsdEJlYW5EZXNjTWFwKCkgewotICAgICAgICByZXR1cm4gZmF1bHRCZWFuRGVzY01hcDsKLSAgICB9Ci0KLSAgICB2b2lkIGJ1aWxkKCkgewotICAgICAgICBmb3IgKEVuZHBvaW50RGVzY3JpcHRpb24gZWQgOiBzZXJ2aWNlRGVzYy5nZXRFbmRwb2ludERlc2NyaXB0aW9ucygpKSB7Ci0gICAgICAgICAgICBpZiAoZWQuZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbigpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb3IgKE9wZXJhdGlvbkRlc2NyaXB0aW9uIG9wRGVzYyA6IGVkLmdldEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24oKQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldE9wZXJhdGlvbnMoKSkgewotCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBkZWNsYXJpbmdDbGFzc05hbWUgPSBvcERlc2MuZ2V0SmF2YURlY2xhcmluZ0NsYXNzTmFtZSgpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSBnZXRQYWNrYWdlTmFtZShkZWNsYXJpbmdDbGFzc05hbWUpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2ltcGxlTmFtZSA9IGdldFNpbXBsZUNsYXNzTmFtZShkZWNsYXJpbmdDbGFzc05hbWUpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbWV0aG9kTmFtZSA9IG9wRGVzYy5nZXRKYXZhTWV0aG9kTmFtZSgpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIFRoZXJlIGlzIG5vIGRlZmF1bHQgZm9yIEBSZXF1ZXN0V3JhcHBlci9AUmVzcG9uc2VXcmFwcGVyIGNsYXNzbmFtZSAgTm9uZSBpcyBsaXN0ZWQgaW4gU2VjLiA3LjMgb24gcC4gODAgb2YKLSAgICAgICAgICAgICAgICAgICAgLy8gdGhlIEpBWC1XUyBzcGVjLCBCVVQgQ29uZm9ybWFuY2UoVXNpbmcgamF2YXgueG1sLndzLlJlcXVlc3RXcmFwcGVyKSBpbiBTZWMgMi4zLjEuMiBvbiBwLiAxMwotICAgICAgICAgICAgICAgICAgICAvLyBzYXlzIHRoZSBlbnRpcmUgYW5ub3RhdGlvbiAiLi4uTUFZIGJlIG9taXR0ZWQgaWYgYWxsIGl0cyBwcm9wZXJ0aWVzIHdvdWxkIGhhdmUgZGVmYXVsdCB2YXVsZXMuIgotICAgICAgICAgICAgICAgICAgICAvLyBXZSB3aWxsIGFzc3VtZSB0aGF0IHRoaXMgc3RhdGVtZW50IGdpdmVzIHVzIHRoZSBsaWJlcnR5IHRvIGZpbmQgYSB3cmFwcGVyIGNsYXNzL2J1aWxkIGEgd3JhcHBlciBjbGFzcyBvciAKLSAgICAgICAgICAgICAgICAgICAgLy8gaW1wbGVtZW50IGFuIGVuZ2luZSB3L28gdGhlIHdyYXBwZXIgY2xhc3MuCi0KLSAgICAgICAgICAgICAgICAgICAgLy8gQFJlcXVlc3RXcmFwcGVyIGNsYXNzTmFtZSBwcm9jZXNzaW5nCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyByZXF1ZXN0V3JhcHBlck5hbWUgPSBvcERlc2MuZ2V0UmVxdWVzdFdyYXBwZXJDbGFzc05hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlcXVlc3RXcmFwcGVyTmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFja2FnZU5hbWUubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFdyYXBwZXJOYW1lID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VOYW1lICsgIi4iICsgamF2YU1ldGhvZFRvQ2xhc3NOYW1lKG1ldGhvZE5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0V3JhcHBlck5hbWUgPSBqYXZhTWV0aG9kVG9DbGFzc05hbWUobWV0aG9kTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZvdW5kUmVxdWVzdFdyYXBwZXJOYW1lID0gZmluZEFydGlmYWN0KHJlcXVlc3RXcmFwcGVyTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmb3VuZFJlcXVlc3RXcmFwcGVyTmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3VuZFJlcXVlc3RXcmFwcGVyTmFtZSA9IGZpbmRBcnRpZmFjdChyZXF1ZXN0V3JhcHBlck5hbWUsIGVkLmdldEF4aXNTZXJ2aWNlKCkuZ2V0Q2xhc3NMb2FkZXIoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGZvdW5kUmVxdWVzdFdyYXBwZXJOYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kUmVxdWVzdFdyYXBwZXJOYW1lID0gbWlzc2luZ0FydGlmYWN0KHJlcXVlc3RXcmFwcGVyTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGZvdW5kUmVxdWVzdFdyYXBwZXJOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RXcmFwcGVyTWFwLnB1dChvcERlc2MsIGZvdW5kUmVxdWVzdFdyYXBwZXJOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8vIEBSZXNwb25zZVdyYXBwZXIgY2xhc3NOYW1lIHByb2Nlc3NpbmcKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlc3BvbnNlV3JhcHBlck5hbWUgPSBvcERlc2MuZ2V0UmVzcG9uc2VXcmFwcGVyQ2xhc3NOYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZVdyYXBwZXJOYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYWNrYWdlTmFtZS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZVdyYXBwZXJOYW1lID0gcGFja2FnZU5hbWUgKyAiLiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YU1ldGhvZFRvQ2xhc3NOYW1lKG1ldGhvZE5hbWUpICsgIlJlc3BvbnNlIjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VXcmFwcGVyTmFtZSA9IGphdmFNZXRob2RUb0NsYXNzTmFtZShtZXRob2ROYW1lKSArICJSZXNwb25zZSI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZvdW5kUmVzcG9uc2VXcmFwcGVyTmFtZSA9IGZpbmRBcnRpZmFjdChyZXNwb25zZVdyYXBwZXJOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZvdW5kUmVzcG9uc2VXcmFwcGVyTmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3VuZFJlc3BvbnNlV3JhcHBlck5hbWUgPSBmaW5kQXJ0aWZhY3QocmVzcG9uc2VXcmFwcGVyTmFtZSwgZWQuZ2V0QXhpc1NlcnZpY2UoKS5nZXRDbGFzc0xvYWRlcigpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoZm91bmRSZXNwb25zZVdyYXBwZXJOYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kUmVzcG9uc2VXcmFwcGVyTmFtZSA9IG1pc3NpbmdBcnRpZmFjdChyZXNwb25zZVdyYXBwZXJOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoZm91bmRSZXNwb25zZVdyYXBwZXJOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlV3JhcHBlck1hcC5wdXQob3BEZXNjLCBmb3VuZFJlc3BvbnNlV3JhcHBlck5hbWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgZm9yIChGYXVsdERlc2NyaXB0aW9uIGZhdWx0RGVzYyA6IG9wRGVzYy5nZXRGYXVsdERlc2NyaXB0aW9ucygpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBGYXVsdEJlYW5EZXNjIGZhdWx0QmVhbkRlc2MgPSBjcmVhdGUoZWQsIGZhdWx0RGVzYywgb3BEZXNjKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZhdWx0QmVhbkRlc2NNYXAucHV0KGZhdWx0RGVzYywgZmF1bHRCZWFuRGVzYyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIEZhdWx0QmVhbkRlc2MgY3JlYXRlKEVuZHBvaW50RGVzY3JpcHRpb24gZWQsIEZhdWx0RGVzY3JpcHRpb24gZmF1bHREZXNjLCBPcGVyYXRpb25EZXNjcmlwdGlvbiBvcERlc2MpIHsKLSAgICAgICAgLyogRmF1bHRCZWFuQ2xhc3MgYWxnb3JpdGhtCi0gICAgICAgICAqICAgMSkgVGhlIGNsYXNzIGRlZmluZWQgb24gQFdlYkZhdWx0IG9mIHRoZSBleGNlcHRpb24KLSAgICAgICAgICogICAyKSBJZiBub3QgcHJlc2VudCBvciBpbnZhbGlkLCB0aGUgY2xhc3MgZGVmaW5lZCBieSBnZXRGYXVsdEluZm8uCi0gICAgICAgICAqICAgMykgSWYgbm90IHByZXNlbnQsIHRoZSBjbGFzcyBpcyBmb3VuZCBieSBsb29raW5nIGZvciB0aGUKLSAgICAgICAgICogICAgICBhIGNsYXNzIG5hbWVkIDxleGNlcHRpb25OYW1lPkJlYW4gaW4gdGhlIGludGVyZmFjZSdzIHBhY2thZ2UuCi0gICAgICAgICAqICAgNCkgSWYgbm90IHByZXNlbnQsIHRoZSBjbGFzcyBpcyBmb3VuZCBieSBsb29raW5nIGZvciB0aGUKLSAgICAgICAgICogICAgICBhIGNsYXNzIG5hbWVkIDxleGNlcHRpb25OYW1lPkJlYW4gaW4gdGhlIGludGVyZmFjZSArIGpheHdzIHBhY2thZ2UKLSAgICAgICAgICovCi0gICAgICAgIFN0cmluZyBmYXVsdEJlYW5DbGFzc05hbWUgPSBmYXVsdERlc2MuZ2V0RmF1bHRCZWFuKCk7Ci0gICAgICAgIGlmIChmYXVsdEJlYW5DbGFzc05hbWUgPT0gbnVsbCB8fCBmYXVsdEJlYW5DbGFzc05hbWUubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgZmF1bHRCZWFuQ2xhc3NOYW1lID0gZmF1bHREZXNjLmdldEZhdWx0SW5mbygpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChmYXVsdEJlYW5DbGFzc05hbWUgPT0gbnVsbCB8fCBmYXVsdEJlYW5DbGFzc05hbWUubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgU3RyaW5nIGRlY2xhcmluZ0NsYXNzTmFtZSA9IG9wRGVzYy5nZXRKYXZhRGVjbGFyaW5nQ2xhc3NOYW1lKCk7Ci0gICAgICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSBnZXRQYWNrYWdlTmFtZShkZWNsYXJpbmdDbGFzc05hbWUpOwotICAgICAgICAgICAgU3RyaW5nIHNpbXBsZU5hbWUgPSBnZXRTaW1wbGVDbGFzc05hbWUoZmF1bHREZXNjLmdldEV4Y2VwdGlvbkNsYXNzTmFtZSgpKTsKLSAgICAgICAgICAgIGlmIChwYWNrYWdlTmFtZS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBmYXVsdEJlYW5DbGFzc05hbWUgPSBwYWNrYWdlTmFtZSArICIuIiArIHNpbXBsZU5hbWUgKyAiQmVhbiI7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZhdWx0QmVhbkNsYXNzTmFtZSA9IHNpbXBsZU5hbWUgKyAiQmVhbiI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nIGZvdW5kQ2xhc3NOYW1lID0gZmluZEFydGlmYWN0KGZhdWx0QmVhbkNsYXNzTmFtZSk7Ci0gICAgICAgIGlmIChmb3VuZENsYXNzTmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBmYXVsdEJlYW5DbGFzc05hbWUgPSBmaW5kQXJ0aWZhY3QoZmF1bHRCZWFuQ2xhc3NOYW1lLCBlZC5nZXRBeGlzU2VydmljZSgpLmdldENsYXNzTG9hZGVyKCkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChmb3VuZENsYXNzTmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBmYXVsdEJlYW5DbGFzc05hbWUgPSBtaXNzaW5nQXJ0aWZhY3QoZmF1bHRCZWFuQ2xhc3NOYW1lKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZm91bmRDbGFzc05hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgZmF1bHRCZWFuQ2xhc3NOYW1lID0gZm91bmRDbGFzc05hbWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBMb2NhbCBOYW1lQWxnb3JpdGhtOgotICAgICAgICAqICAgMSkgVGhlIG5hbWUgZGVmaW5lZCBvbiB0aGUgQFdlYkZhdWx0IG9mIHRoZSBleGNlcHRpb24uCi0gICAgICAgICogICAyKSBJZiBub3QgcHJlc2VudCwgdGhlIG5hbWUgZGVmaW5lZCB2aWEgdGhlIEBYbWxSb290RWxlbWVudCBvZiB0aGUgZmF1bHQgYmVhbiBjbGFzcy4KLSAgICAgICAgKiAgIDMpIElmIG5vdCBwcmVzZW50LCB0aGUgPGV4Y2VwdGlvbk5hbWU+QmVhbgotICAgICAgICAqLwotICAgICAgICBTdHJpbmcgZmF1bHRCZWFuTG9jYWxOYW1lID0gZmF1bHREZXNjLmdldE5hbWUoKTsKLSAgICAgICAgaWYgKGZhdWx0QmVhbkxvY2FsTmFtZSA9PSBudWxsIHx8IGZhdWx0QmVhbkxvY2FsTmFtZS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICBpZiAoZmF1bHRCZWFuQ2xhc3NOYW1lICE9IG51bGwgJiYgZmF1bHRCZWFuQ2xhc3NOYW1lLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIENsYXNzIGZhdWx0QmVhbjsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZhdWx0QmVhbiA9IGxvYWRDbGFzcyhmYXVsdEJlYW5DbGFzc05hbWUsIGdldENvbnRleHRDbGFzc0xvYWRlcigpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZhdWx0QmVhbiA9IGxvYWRDbGFzcyhmYXVsdEJlYW5DbGFzc05hbWUsIGVkLmdldEF4aXNTZXJ2aWNlKCkuZ2V0Q2xhc3NMb2FkZXIoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvbkRlc2MgYURlc2MgPSBBbm5vdGF0aW9uRGVzY0ltcGwuY3JlYXRlKGZhdWx0QmVhbik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhRGVzYy5oYXNYbWxSb290RWxlbWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmYXVsdEJlYW5Mb2NhbE5hbWUgPSBhRGVzYy5nZXRYbWxSb290RWxlbWVudE5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24odCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChmYXVsdEJlYW5Mb2NhbE5hbWUgPT0gbnVsbCB8fCBmYXVsdEJlYW5Mb2NhbE5hbWUubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgZmF1bHRCZWFuTG9jYWxOYW1lID0gZ2V0U2ltcGxlQ2xhc3NOYW1lKGZhdWx0RGVzYy5nZXRFeGNlcHRpb25DbGFzc05hbWUoKSkgKyAiQmVhbiI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBBbGdvcml0aG0gZm9yIGZhdWx0IGJlYW4gbmFtZXNwYWNlCi0gICAgICAgICogICAxKSBUaGUgbmFtZXNwYWNlIGRlZmluZWQgb24gdGhlIEBXZWJGYXVsdCBvZiB0aGUgZXhjZXB0aW9uLgotICAgICAgICAqICAgMikgSWYgbm90IHByZXNlbnQsIHRoZSBuYW1lc3BhY2UgZGVmaW5lZCB2aWEgdGhlIEBYbWxSb290RWxlbWVudCBvZiB0aGUgY2xhc3MgbmFtZS4KLSAgICAgICAgKiAgIDMpIElmIG5vdCBwcmVzZW50LCB0aGUgbmFtZXNwYWNlIG9mIHRoZSBtZXRob2QncyBkZWNsYXJlZCBjbGFzcyArICIvamF4d3MiCi0gICAgICAgICovCi0gICAgICAgIFN0cmluZyBmYXVsdEJlYW5OYW1lc3BhY2UgPSBmYXVsdERlc2MuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgIGlmIChmYXVsdEJlYW5OYW1lc3BhY2UgPT0gbnVsbCB8fCBmYXVsdEJlYW5OYW1lc3BhY2UubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgaWYgKGZhdWx0QmVhbkNsYXNzTmFtZSAhPSBudWxsICYmIGZhdWx0QmVhbkNsYXNzTmFtZS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBDbGFzcyBmYXVsdEJlYW47Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmYXVsdEJlYW4gPSBsb2FkQ2xhc3MoZmF1bHRCZWFuQ2xhc3NOYW1lLCBnZXRDb250ZXh0Q2xhc3NMb2FkZXIoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmYXVsdEJlYW4gPSBsb2FkQ2xhc3MoZmF1bHRCZWFuQ2xhc3NOYW1lLCBlZC5nZXRBeGlzU2VydmljZSgpLmdldENsYXNzTG9hZGVyKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIEFubm90YXRpb25EZXNjIGFEZXNjID0gQW5ub3RhdGlvbkRlc2NJbXBsLmNyZWF0ZShmYXVsdEJlYW4pOwotICAgICAgICAgICAgICAgICAgICBpZiAoYURlc2MuaGFzWG1sUm9vdEVsZW1lbnQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZmF1bHRCZWFuTmFtZXNwYWNlID0gYURlc2MuZ2V0WG1sUm9vdEVsZW1lbnROYW1lc3BhY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0gICAgICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbih0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGZhdWx0QmVhbk5hbWVzcGFjZSA9PSBudWxsIHx8IGZhdWx0QmVhbk5hbWVzcGFjZS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICBmYXVsdEJlYW5OYW1lc3BhY2UgPSBvcERlc2MuZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbigpLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBGYXVsdEJlYW5EZXNjSW1wbCgKLSAgICAgICAgICAgICAgICBmYXVsdEJlYW5DbGFzc05hbWUsCi0gICAgICAgICAgICAgICAgZmF1bHRCZWFuTG9jYWxOYW1lLAotICAgICAgICAgICAgICAgIGZhdWx0QmVhbk5hbWVzcGFjZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGNsYXNzTmFtZQotICAgICAqIEByZXR1cm4gcGFja2FnZSBuYW1lCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lKFN0cmluZyBjbGFzc05hbWUpIHsKLSAgICAgICAgaW50IGluZGV4ID0gY2xhc3NOYW1lLmxhc3RJbmRleE9mKCIuIik7Ci0gICAgICAgIGlmIChpbmRleCA8PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gY2xhc3NOYW1lLnN1YnN0cmluZygwLCBpbmRleCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gY2xhc3NOYW1lCi0gICAgICogQHJldHVybiBzaW1wbGUgY2xhc3MgbmFtZQotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRTaW1wbGVDbGFzc05hbWUoU3RyaW5nIGNsYXNzTmFtZSkgewotICAgICAgICBpbnQgaW5kZXggPSBjbGFzc05hbWUubGFzdEluZGV4T2YoIi4iKTsKLSAgICAgICAgaWYgKGluZGV4IDw9IDApIHsKLSAgICAgICAgICAgIHJldHVybiBjbGFzc05hbWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gY2xhc3NOYW1lLnN1YnN0cmluZyhpbmRleCArIDEpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIG1ldGhvZE5hbWUKLSAgICAgKiBAcmV0dXJuIG1ldGhvZCBuYW1lIGNvbnZlcnRlZCBpbnRvIGEgY2xhc3MgbmFtZQotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBqYXZhTWV0aG9kVG9DbGFzc05hbWUoU3RyaW5nIG1ldGhvZE5hbWUpIHsKLSAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IG51bGw7Ci0gICAgICAgIGlmIChtZXRob2ROYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBidWlsZENsYXNzTmFtZSA9IG5ldyBTdHJpbmdCdWZmZXIobWV0aG9kTmFtZSk7Ci0gICAgICAgICAgICBidWlsZENsYXNzTmFtZS5yZXBsYWNlKDAsIDEsIG1ldGhvZE5hbWUuc3Vic3RyaW5nKDAsIDEpLnRvVXBwZXJDYXNlKCkpOwotICAgICAgICAgICAgY2xhc3NOYW1lID0gYnVpbGRDbGFzc05hbWUudG9TdHJpbmcoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY2xhc3NOYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIGlzIGludm9rZWQgaWYgdGhlIGFydGlmYWN0IGlzIG1pc3NpbmcKLSAgICAgKgotICAgICAqIEBwYXJhbSBhcnRpZmFjdE5hbWUKLSAgICAgKiBAcmV0dXJuIG5ld2x5IGNvbnN0cnVjdGVkIG5hbWUgb3IgbnVsbAotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIG1pc3NpbmdBcnRpZmFjdChTdHJpbmcgYXJ0aWZhY3ROYW1lKSB7Ci0KLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIlRoZSBmb2xsb3dpbmcgY2xhc3Mgd2FzIG5vdCBmb3VuZDogIiArIGFydGlmYWN0TmFtZSArICIgUHJvY2Vzc2luZyBjb250aW51ZXMgd2l0aG91dCB0aGlzIGNsYXNzLiIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERldGVybWluZSB0aGUgYWN0dWFsIHBhY2thZ2VyIG5hbWUgZm9yIHRoZSBnZW5lcmF0ZWQgYXJ0aWZhY3RzIGJ5IHRyeWluZyB0byBsb2FkIHRoZSBjbGFzcwotICAgICAqIGZyb20gb25lIG9mIHR3byBwYWNrYWdlcy4gIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgdGhlIFJJIGltcGxlbWVudGF0aW9ucyBvZiBXU0dlbiBhbmQKLSAgICAgKiBXU0ltcG9ydCBnZW5lcmF0ZSB0aGUgYXJ0aWZhY3RzIGluIGRpZmZlcmVudCBwYWNrYWdlczogLSBXU0ltcG9ydCBnZW5lcmF0ZXMgdGhlIGFydGlmYWN0cyBpbgotICAgICAqIHRoZSBzYW1lIHBhY2thZ2UgYXMgdGhlIFNFSSAtIFdTR2VuIGdlbmVyYXRlcyB0aGUgYXJ0aWZhY3RzIGluIGEgImpheHdzIiBzdWIgcGFja2FnZSB1bmRlcgotICAgICAqIHRoZSBTRUkgcGFja2FnZS4gTm90ZSB0aGF0IGZyb20gcmVhZGluZyB0aGUgSkFYLVdTIHNwZWMsIGl0IHNlZW1zIHRoYXQgV1NHZW4gaXMgZG9pbmcgdGhhdAotICAgICAqIGNvcnJlY3RseTsgU2VlIHRoZSBjb25mb3JtYW5jZSByZXF1aXJlbWVudCBpbiBKQVgtV1MgMi4wIFNwZWMgU2VjdGlvbiAzLjYuMi4xIERvY3VtZW50Ci0gICAgICogV3JhcHBlZCBvbiBwYWdlIDM2OiBDb25mb3JtYW5jZSAoRGVmYXVsdCB3cmFwcGVyIGJlYW4gcGFja2FnZSk6IEluIHRoZSBhYnNlbmNlIG9mCi0gICAgICogY3VzdG9taXphdGlvbnMsIHRoZSB3cmFwcGVyIGJlYW5zIHBhY2thZ2UgTVVTVCBiZSBhIGdlbmVyYXRlZCBqYXh3cyBzdWJwYWNrYWdlIG9mIHRoZSBTRUkKLSAgICAgKiBwYWNrYWdlLiBeXl5eXl5eXl5eXl5eXl5eCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYXJ0aWZhY3RDbGFzc05hbWUKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBKQVhXU19TVUJQQUNLQUdFID0gImpheHdzIjsKLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBmaW5kQXJ0aWZhY3QoU3RyaW5nIGFydGlmYWN0Q2xhc3NOYW1lKSB7Ci0gICAgICAgIHJldHVybiBmaW5kQXJ0aWZhY3QoYXJ0aWZhY3RDbGFzc05hbWUsIGdldENvbnRleHRDbGFzc0xvYWRlcigpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZmluZEFydGlmYWN0KFN0cmluZyBhcnRpZmFjdENsYXNzTmFtZSwgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpIHsKLSAgICAgICAgU3RyaW5nIHJldHVybkFydGlmYWN0Q2xhc3NOYW1lID0gbnVsbDsKLSAgICAgICAgaWYgKGFydGlmYWN0Q2xhc3NOYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiByZXR1cm5BcnRpZmFjdENsYXNzTmFtZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFRyeSB0byBsb2FkIHRoZSBjbGFzcyB0aGF0IHdhcyBwYXNzZWQgaW4KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZvck5hbWUoYXJ0aWZhY3RDbGFzc05hbWUsIHRydWUsIGNsYXNzTG9hZGVyKTsKLSAgICAgICAgICAgIHJldHVybkFydGlmYWN0Q2xhc3NOYW1lID0gYXJ0aWZhY3RDbGFzc05hbWU7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gQ291bGRuJ3QgbG9hZCB0aGUgY2xhc3M7IHdlJ2xsIHRyeSBhbm90aGVyIG9uZSBiZWxvdy4KLSAgICAgICAgfQotCi0gICAgICAgIC8vIElmIHRoZSBvcmlnaW5hbCBjbGFzcyBjb3VsZG4ndCBiZSBsb2FkZWQsIHRyeSBhZGRpbmcgIi5qYXh3cy4iIHRvIHRoZSBwYWNrYWdlCi0gICAgICAgIGlmIChyZXR1cm5BcnRpZmFjdENsYXNzTmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgb3JpZ2luYWxQYWNrYWdlID0gZ2V0UGFja2FnZU5hbWUoYXJ0aWZhY3RDbGFzc05hbWUpOwotICAgICAgICAgICAgaWYgKG9yaWdpbmFsUGFja2FnZS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgYWx0ZXJuYXRlUGFja2FnZSA9IG9yaWdpbmFsUGFja2FnZSArICIuIiArIEpBWFdTX1NVQlBBQ0tBR0U7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IGdldFNpbXBsZUNsYXNzTmFtZShhcnRpZmFjdENsYXNzTmFtZSk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGFsdGVybmF0ZVdyYXBwZXJDbGFzcyA9IGFsdGVybmF0ZVBhY2thZ2UgKyAiLiIgKyBjbGFzc05hbWU7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgbG9hZENsYXNzKGFsdGVybmF0ZVdyYXBwZXJDbGFzcywgZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm5BcnRpZmFjdENsYXNzTmFtZSA9IGFsdGVybmF0ZVdyYXBwZXJDbGFzczsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAvLyBDb3VsZG4ndCBsb2FkIHRoZSBjbGFzcwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXR1cm5BcnRpZmFjdENsYXNzTmFtZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBDbGFzcyBsb2FkQ2xhc3MoU3RyaW5nIGNsYXNzTmFtZSwgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gRG9uJ3QgbWFrZSB0aGlzIHB1YmxpYywgaXRzIGEgc2VjdXJpdHkgZXhwb3N1cmUKLSAgICAgICAgcmV0dXJuIGZvck5hbWUoY2xhc3NOYW1lLCB0cnVlLCBjbGFzc0xvYWRlcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBjbGFzcyBmb3IgdGhpcyBuYW1lCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIENsYXNzCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3MgZm9yTmFtZShmaW5hbCBTdHJpbmcgY2xhc3NOYW1lLCBmaW5hbCBib29sZWFuIGluaXRpYWxpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDbGFzc0xvYWRlciBjbGFzc2xvYWRlcikgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICAvLyBOT1RFOiBUaGlzIG1ldGhvZCBtdXN0IHJlbWFpbiBwcm90ZWN0ZWQgYmVjYXVzZSBpdCB1c2VzIEFjY2Vzc0NvbnRyb2xsZXIKLSAgICAgICAgQ2xhc3MgY2wgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY2wgPSAoQ2xhc3MpQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoCi0gICAgICAgICAgICAgICAgICAgIG5ldyBQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2xhc3MuZm9yTmFtZSBkb2VzIG5vdCBzdXBwb3J0IHByaW1pdGl2ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgIAlDbGFzcyBjbHMgPSBDbGFzc1V0aWxzLmdldFByaW1pdGl2ZUNsYXNzKGNsYXNzTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAJdHJ5ewotICAgICAgICAgICAgICAgICAgICAgICAgCQlpZiAoY2xzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIAkJCWNscyA9IENsYXNzLmZvck5hbWUoY2xhc3NOYW1lLCBpbml0aWFsaXplLCBjbGFzc2xvYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAJCX0KLSAgICAgICAgICAgICAgICAgICAgICAgIAkJcmV0dXJuIGNsczsKLSAgICAgICAgICAgICAgICAgICAgICAgIAkJLy9MZXRzIGNhdGNoIE5vQ2xhc3NEZWZGb3VuZEVycm9yIGFzIGl0cyBwYXJ0IG9mIFRocm93YWJsZQotICAgICAgICAgICAgICAgICAgICAgICAgCQkvL0FueSBFeGNlcHRpb24gdGhhdCBleHRlbmRzIEV4Y2VwdGlvbiB3aWxsIGJlIGhhbmRsZWQgYnkgZG9Qcml2IG1ldGhvZC4gICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAJfSBjYXRjaCAoTm9DbGFzc0RlZkZvdW5kRXJyb3IgZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICogSW4gZGlmZmVyZW50IGpheHdzIHNjZW5hcmlvcywgc29tZSBjbGFzc2VzIG1heSBiZSBtaXNzaW5nLiAgU28gaXQgaXMgbm9ybWFsIGJlaGF2aW9yCi0gICAgICAgICAgICAgICAgICAgICAgICAJICAgICAqIHRvIGdldCB0byB0aGlzIHBvaW50LiAgVGhlIGV4Y2VwdGlvbiBpcyBzd2FsbG93ZWQgYW5kIGEgbnVsbCBpcyByZXR1cm5lZC4gIAotICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgKiBUaGUgZXhjZXB0aW9uIGlzIG5vdCBsb2dnZWQuLi5hcyB0aGlzIHdvdWxkIGdpdmUgc2VydmljYWJpbGl0eSBmb2xrcyB0aGUgaWRlYSB0aGF0IGEgcHJvYmxlbSBvY2N1cnJlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAJfSAKLSAgICAgICAgICAgICAgICAgICAgICAgIAlyZXR1cm4gY2xzOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICApOwotICAgICAgICB9IGNhdGNoIChQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogSW4gZGlmZmVyZW50IGpheHdzIHNjZW5hcmlvcywgc29tZSBjbGFzc2VzIG1heSBiZSBtaXNzaW5nLiAgU28gaXQgaXMgbm9ybWFsIGJlaGF2aW9yCi0gICAgICAgICAgICAgKiB0byBnZXQgdG8gdGhpcyBwb2ludC4gCi0gICAgICAgICAgICAgKiBUaGUgZXhjZXB0aW9uIGlzIG5vdCBsb2dnZWQuLi5hcyB0aGlzIHdvdWxkIGdpdmUgc2VydmljYWJpbGl0eSBmb2xrcyB0aGUgaWRlYSB0aGF0IGEgcHJvYmxlbSBvY2N1cnJlZC4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgdGhyb3cgKENsYXNzTm90Rm91bmRFeGNlcHRpb24pZS5nZXRFeGNlcHRpb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjbDsKLSAgICB9Ci0KLSAgICAvKiogQHJldHVybiBDbGFzc0xvYWRlciAqLwotICAgIHByaXZhdGUgc3RhdGljIENsYXNzTG9hZGVyIGdldENvbnRleHRDbGFzc0xvYWRlcigpIHsKLSAgICAgICAgLy8gTk9URTogVGhpcyBtZXRob2QgbXVzdCByZW1haW4gcHJpdmF0ZSBiZWNhdXNlIGl0IHVzZXMgQWNjZXNzQ29udHJvbGxlcgotICAgICAgICBDbGFzc0xvYWRlciBjbCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjbCA9IChDbGFzc0xvYWRlcilBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgKLSAgICAgICAgICAgICAgICAgICAgbmV3IFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgKTsKLSAgICAgICAgfSBjYXRjaCAoUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkV4Y2VwdGlvbiB0aHJvd24gZnJvbSBBY2Nlc3NDb250cm9sbGVyOiAiICsgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbillLmdldEV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGNsOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3J1bnRpbWUvZGVzY3JpcHRpb24vbWFyc2hhbC9pbXBsL0ZhdWx0QmVhbkRlc2NJbXBsLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9ydW50aW1lL2Rlc2NyaXB0aW9uL21hcnNoYWwvaW1wbC9GYXVsdEJlYW5EZXNjSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2I1NDkxLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3J1bnRpbWUvZGVzY3JpcHRpb24vbWFyc2hhbC9pbXBsL0ZhdWx0QmVhbkRlc2NJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MucnVudGltZS5kZXNjcmlwdGlvbi5tYXJzaGFsLmltcGw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnJ1bnRpbWUuZGVzY3JpcHRpb24ubWFyc2hhbC5GYXVsdEJlYW5EZXNjOwotCi1jbGFzcyBGYXVsdEJlYW5EZXNjSW1wbCBpbXBsZW1lbnRzIEZhdWx0QmVhbkRlc2MgewotCi0gICAgU3RyaW5nIGZhdWx0QmVhbkNsYXNzTmFtZTsKLSAgICBTdHJpbmcgZmF1bHRCZWFuTG9jYWxOYW1lOwotICAgIFN0cmluZyBmYXVsdEJlYW5OYW1lc3BhY2U7Ci0KLSAgICBGYXVsdEJlYW5EZXNjSW1wbChTdHJpbmcgZmF1bHRCZWFuQ2xhc3NOYW1lLCBTdHJpbmcgZmF1bHRCZWFuTG9jYWxOYW1lLAotICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBmYXVsdEJlYW5OYW1lc3BhY2UpIHsKLSAgICAgICAgdGhpcy5mYXVsdEJlYW5DbGFzc05hbWUgPSBmYXVsdEJlYW5DbGFzc05hbWU7Ci0gICAgICAgIHRoaXMuZmF1bHRCZWFuTG9jYWxOYW1lID0gZmF1bHRCZWFuTG9jYWxOYW1lOwotICAgICAgICB0aGlzLmZhdWx0QmVhbk5hbWVzcGFjZSA9IGZhdWx0QmVhbk5hbWVzcGFjZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZhdWx0QmVhbkNsYXNzTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGZhdWx0QmVhbkNsYXNzTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZhdWx0QmVhbkxvY2FsTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGZhdWx0QmVhbkxvY2FsTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZhdWx0QmVhbk5hbWVzcGFjZSgpIHsKLSAgICAgICAgcmV0dXJuIGZhdWx0QmVhbk5hbWVzcGFjZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBmaW5hbCBTdHJpbmcgbmV3bGluZSA9ICJcbiI7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBzdHJpbmcgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIHN0cmluZy5hcHBlbmQobmV3bGluZSk7Ci0gICAgICAgIHN0cmluZy5hcHBlbmQoIiAgICAgIEZhdWx0QmVhbiBDbGFzcyBOYW1lIDoiICsgZmF1bHRCZWFuQ2xhc3NOYW1lKTsKLSAgICAgICAgc3RyaW5nLmFwcGVuZChuZXdsaW5lKTsKLSAgICAgICAgc3RyaW5nLmFwcGVuZCgiICAgICAgRmF1bHRCZWFuIE5hbWVzcGFjZSAgOiIgKyBmYXVsdEJlYW5OYW1lc3BhY2UpOwotICAgICAgICBzdHJpbmcuYXBwZW5kKG5ld2xpbmUpOwotICAgICAgICBzdHJpbmcuYXBwZW5kKCIgICAgICBGYXVsdEJlYW4gTG9jYWwgTmFtZSA6IiArIGZhdWx0QmVhbkxvY2FsTmFtZSk7Ci0gICAgICAgIHN0cmluZy5hcHBlbmQobmV3bGluZSk7Ci0gICAgICAgIHJldHVybiBzdHJpbmcudG9TdHJpbmcoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9ydW50aW1lL2Rlc2NyaXB0aW9uL21hcnNoYWwvaW1wbC9NYXJzaGFsU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbkJ1aWxkZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3J1bnRpbWUvZGVzY3JpcHRpb24vbWFyc2hhbC9pbXBsL01hcnNoYWxTZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uQnVpbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMGNmZmQ1Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3J1bnRpbWUvZGVzY3JpcHRpb24vbWFyc2hhbC9pbXBsL01hcnNoYWxTZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uQnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5ydW50aW1lLmRlc2NyaXB0aW9uLm1hcnNoYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuRXhjZXB0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLlNlcnZpY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnJ1bnRpbWUuZGVzY3JpcHRpb24ubWFyc2hhbC5Bbm5vdGF0aW9uRGVzYzsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnJ1bnRpbWUuZGVzY3JpcHRpb24ubWFyc2hhbC5NYXJzaGFsU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnV0aWxpdHkuUHJvcGVydHlEZXNjcmlwdG9yUGx1czsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7Ci0KLXB1YmxpYyBjbGFzcyBNYXJzaGFsU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbkJ1aWxkZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKE1hcnNoYWxTZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uQnVpbGRlci5jbGFzcyk7Ci0KLSAgICAvKiogSW50ZW50aW9uYWxseSBQcml2YXRlICovCi0gICAgcHJpdmF0ZSBNYXJzaGFsU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbkJ1aWxkZXIoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogY3JlYXRlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb3BEZXNjCi0gICAgICogQHBhcmFtIGltcGxDbGFzc05hbWUKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgc3RhdGljIHB1YmxpYyBNYXJzaGFsU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbiBjcmVhdGUoU2VydmljZURlc2NyaXB0aW9uIHNlcnZpY2VEZXNjKSB7Ci0gICAgICAgIE1hcnNoYWxTZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uSW1wbCBkZXNjID0KLSAgICAgICAgICAgICAgICBuZXcgTWFyc2hhbFNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb25JbXBsKGdldEtleSgpLCBzZXJ2aWNlRGVzYyk7Ci0gICAgICAgIGluaXQoZGVzYywgc2VydmljZURlc2MpOwotICAgICAgICByZXR1cm4gZGVzYzsKLSAgICB9Ci0KLSAgICBzdGF0aWMgcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0gICAgICAgIHJldHVybiAiSkFYV1MtTUFSU0hBTCI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGltcGxDbGFzcwotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBGaWVsZCBvciBNZXRob2QgaGFzIGEgQFJlc291cmNlIGFubm90YXRpb24KLSAgICAgKi8KLSAgICBzdGF0aWMgcHJpdmF0ZSB2b2lkIGluaXQoTWFyc2hhbFNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb25JbXBsIG1hcnNoYWxEZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc2VydmljZURlc2MpIHsKLQotICAgICAgICAvLyBBcnRpZmFjdCBjbGFzcyBkaXNjb3ZlcnkvYnVpbGRlcgotICAgICAgICBBcnRpZmFjdFByb2Nlc3NvciBhcnRpZmFjdFByb2Nlc3NvciA9IG5ldyBBcnRpZmFjdFByb2Nlc3NvcihzZXJ2aWNlRGVzYyk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhcnRpZmFjdFByb2Nlc3Nvci5idWlsZCgpOwotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbih0KTsKLSAgICAgICAgfQotICAgICAgICBtYXJzaGFsRGVzYy5zZXRSZXF1ZXN0V3JhcHBlck1hcChhcnRpZmFjdFByb2Nlc3Nvci5nZXRSZXF1ZXN0V3JhcHBlck1hcCgpKTsKLSAgICAgICAgbWFyc2hhbERlc2Muc2V0UmVzcG9uc2VXcmFwcGVyTWFwKGFydGlmYWN0UHJvY2Vzc29yLmdldFJlc3BvbnNlV3JhcHBlck1hcCgpKTsKLSAgICAgICAgbWFyc2hhbERlc2Muc2V0RmF1bHRCZWFuRGVzY01hcChhcnRpZmFjdFByb2Nlc3Nvci5nZXRGYXVsdEJlYW5EZXNjTWFwKCkpOwotCi0gICAgICAgIC8vIEJ1aWxkIHRoZSBhbm5vdGF0aW9uIG1hcAotICAgICAgICBNYXA8U3RyaW5nLCBBbm5vdGF0aW9uRGVzYz4gbWFwOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbWFwID0gQW5ub3RhdGlvbkJ1aWxkZXIuZ2V0QW5ub3RhdGlvbkRlc2NzKHNlcnZpY2VEZXNjLCBhcnRpZmFjdFByb2Nlc3Nvcik7Ci0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0gICAgICAgICAgICAvLyBTaW5jZSB3ZSBhcmUgYnVpbGRpbmcgYSBjYWNoZSwgcHJvY2VlZCB3aXRob3V0IGV4Y2VwdGlvbgotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKAotICAgICAgICAgICAgICAgICAgICAgICAgIkV4Y2VwdGlvbiBvY2N1cnJlZCBkdXJpbmcgY2FjaGUgcHJvY2Vzc2luZy4gIFRoaXMgd2lsbCBpbXBhY3QgcGVyZm9ybWFuY2U6IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBBbm5vdGF0aW9uRGVzYz4oKTsKLSAgICAgICAgfQotICAgICAgICBtYXJzaGFsRGVzYy5zZXRBbm5vdGF0aW9uTWFwKG1hcCk7Ci0KLSAgICAgICAgLy8gQnVpbGQgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3IgbWFwCi0gICAgICAgIE1hcDxDbGFzcywgTWFwPFN0cmluZywgUHJvcGVydHlEZXNjcmlwdG9yUGx1cz4+IGNhY2hlOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY2FjaGUgPSBQcm9wZXJ0eURlc2NyaXB0b3JNYXBCdWlsZGVyCi0gICAgICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eURlc2NNYXBzKHNlcnZpY2VEZXNjLCBhcnRpZmFjdFByb2Nlc3Nvcik7Ci0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0gICAgICAgICAgICAvLyBTaW5jZSB3ZSBhcmUgYnVpbGRpbmcgYSBjYWNoZSwgcHJvY2VlZCB3aXRob3V0IGV4Y2VwdGlvbgotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKAotICAgICAgICAgICAgICAgICAgICAgICAgIkV4Y2VwdGlvbiBvY2N1cnJlZCBkdXJpbmcgY2FjaGUgcHJvY2Vzc2luZy4gIFRoaXMgd2lsbCBpbXBhY3QgcGVyZm9ybWFuY2U6IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FjaGUgPSBuZXcgSGFzaE1hcDxDbGFzcywgTWFwPFN0cmluZywgUHJvcGVydHlEZXNjcmlwdG9yUGx1cz4+KCk7Ci0gICAgICAgIH0KLSAgICAgICAgbWFyc2hhbERlc2Muc2V0UHJvcGVydHlEZXNjcmlwdG9yTWFwQ2FjaGUoY2FjaGUpOwotCi0gICAgICAgIC8vIEBUT0RPIFRoZXJlIGFyZSB0d28gd2F5cyB0byBnZXQgdGhlIHBhY2thZ2VzLgotICAgICAgICAvLyBTY2hlbWEgV2FsayAocHJlZmVyZWQpIGFuZCBBbm5vdGF0aW9uIFdhbGsuCi0gICAgICAgIC8vIFRoZSBTY2hlbWEgd2FsayByZXF1aXJlcyBhbiBleGlzdGluZyBvciBnZW5lcmF0ZWQgc2NoZW1hLgotICAgICAgICAvLyAKLSAgICAgICAgLy8gVGhlcmUgYXJlIHNvbWUgbGltaXRhdGlvbnMgaW4gdGhlIGN1cnJlbnQgc2NoZW1hIHdhbGsKLSAgICAgICAgLy8gQW5kIHRoZXJlIGFyZSBwcm9ibGVtcyBpbiB0aGUgYW5ub3RhdGlvbiB3YWxrLgotICAgICAgICAvLyBTbyBmb3Igbm93IHdlIHdpbGwgZG8gYm90aC4KLSAgICAgICAgVHJlZVNldDxTdHJpbmc+IHBhY2thZ2VzID0gbmV3IFRyZWVTZXQ8U3RyaW5nPigpOwotICAgICAgICBib29sZWFuIGRvU2NoZW1hV2FsayA9IHRydWU7Ci0gICAgICAgIGJvb2xlYW4gZG9Bbm5vdGF0aW9uV2FsayA9IHRydWU7Ci0gICAgICAgIHBhY2thZ2VzID0gbmV3IFRyZWVTZXQ8U3RyaW5nPigpOwotICAgICAgICBpZiAoZG9TY2hlbWFXYWxrKSB7Ci0gICAgICAgICAgICBwYWNrYWdlcy5hZGRBbGwoUGFja2FnZVNldEJ1aWxkZXIuZ2V0UGFja2FnZXNGcm9tU2NoZW1hKHNlcnZpY2VEZXNjKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGRvQW5ub3RhdGlvbldhbGspIHsKLSAgICAgICAgICAgIC8vIEdldCB0aGUgcGFja2FnZSBuYW1lcyBmcm9tIHRoZSBhbm5vdGF0aW9ucy4gIFVzZSB0aGUgYW5ub3RhdGlvbiBtYXAgdG8gcmVkdWNlIEFubm90YXRpb24gaW50cm9zcGVjdGlvbgotICAgICAgICAgICAgcGFja2FnZXMuYWRkQWxsKFBhY2thZ2VTZXRCdWlsZGVyLmdldFBhY2thZ2VzRnJvbUFubm90YXRpb25zKHNlcnZpY2VEZXNjLCBtYXJzaGFsRGVzYykpOwotICAgICAgICB9Ci0gICAgICAgIG1hcnNoYWxEZXNjLnNldFBhY2thZ2VzKHBhY2thZ2VzKTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcnVudGltZS9kZXNjcmlwdGlvbi9tYXJzaGFsL2ltcGwvTWFyc2hhbFNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb25JbXBsLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9ydW50aW1lL2Rlc2NyaXB0aW9uL21hcnNoYWwvaW1wbC9NYXJzaGFsU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjAxNmM4Zi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9ydW50aW1lL2Rlc2NyaXB0aW9uL21hcnNoYWwvaW1wbC9NYXJzaGFsU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MucnVudGltZS5kZXNjcmlwdGlvbi5tYXJzaGFsLmltcGw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLkV4Y2VwdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5GYXVsdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uT3BlcmF0aW9uRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5TZXJ2aWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmZhY3RvcnkuTWVzc2FnZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5yZWdpc3RyeS5GYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5ydW50aW1lLmRlc2NyaXB0aW9uLm1hcnNoYWwuQW5ub3RhdGlvbkRlc2M7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5ydW50aW1lLmRlc2NyaXB0aW9uLm1hcnNoYWwuRmF1bHRCZWFuRGVzYzsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnJ1bnRpbWUuZGVzY3JpcHRpb24ubWFyc2hhbC5NYXJzaGFsU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnV0aWxpdHkuUHJvcGVydHlEZXNjcmlwdG9yUGx1czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnV0aWxpdHkuWE1MUm9vdEVsZW1lbnRVdGlsOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OwotaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwotCi0KLXB1YmxpYyBjbGFzcyBNYXJzaGFsU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbkltcGwgaW1wbGVtZW50cwotICAgICAgICBNYXJzaGFsU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbiB7Ci0KLSAgICBwcml2YXRlIFNlcnZpY2VEZXNjcmlwdGlvbiBzZXJ2aWNlRGVzYzsKLSAgICBwcml2YXRlIFN0cmluZyBrZXk7Ci0gICAgcHJpdmF0ZSBUcmVlU2V0PFN0cmluZz4gcGFja2FnZXM7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgcGFja2FnZXNLZXk7Ci0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBBbm5vdGF0aW9uRGVzYz4gYW5ub3RhdGlvbk1hcCA9IG51bGw7Ci0gICAgcHJpdmF0ZSBNYXA8Q2xhc3MsIE1hcDxTdHJpbmcsIFByb3BlcnR5RGVzY3JpcHRvclBsdXM+PiBwZE1hcENhY2hlID0gbnVsbDsKLSAgICBwcml2YXRlIE1hcDxPcGVyYXRpb25EZXNjcmlwdGlvbiwgU3RyaW5nPiByZXF1ZXN0V3JhcHBlck1hcCA9IG51bGw7Ci0gICAgcHJpdmF0ZSBNYXA8T3BlcmF0aW9uRGVzY3JpcHRpb24sIFN0cmluZz4gcmVzcG9uc2VXcmFwcGVyTWFwID0gbnVsbDsKLSAgICBwcml2YXRlIE1hcDxGYXVsdERlc2NyaXB0aW9uLCBGYXVsdEJlYW5EZXNjPiBmYXVsdEJlYW5EZXNjTWFwID0gbnVsbDsKLSAgICBwcml2YXRlIE1lc3NhZ2VGYWN0b3J5IG1lc3NhZ2VGYWN0b3J5ID0KLSAgICAgICAgICAgIChNZXNzYWdlRmFjdG9yeSlGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShNZXNzYWdlRmFjdG9yeS5jbGFzcyk7Ci0KLQotICAgIHByb3RlY3RlZCBNYXJzaGFsU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbkltcGwoU3RyaW5nIGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzZXJ2aWNlRGVzYykgewotICAgICAgICB0aGlzLnNlcnZpY2VEZXNjID0gc2VydmljZURlc2M7Ci0gICAgICAgIHRoaXMua2V5ID0ga2V5OwotICAgIH0KLQotCi0gICAgcHVibGljIFNlcnZpY2VEZXNjcmlwdGlvbiBnZXRTZXJ2aWNlRGVzY3JpcHRpb24oKSB7Ci0gICAgICAgIHJldHVybiBzZXJ2aWNlRGVzYzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLSAgICAgICAgcmV0dXJuIGtleTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVHJlZVNldDxTdHJpbmc+IGdldFBhY2thZ2VzKCkgewotICAgICAgICByZXR1cm4gcGFja2FnZXM7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQYWNrYWdlc0tleSgpIHsKLSAgICAgICAgcmV0dXJuIHBhY2thZ2VzS2V5OwotICAgIH0KLQotICAgIHZvaWQgc2V0UGFja2FnZXMoVHJlZVNldDxTdHJpbmc+IHBhY2thZ2VzKSB7Ci0gICAgICAgIHRoaXMucGFja2FnZXMgPSBwYWNrYWdlczsKLSAgICAgICAgdGhpcy5wYWNrYWdlc0tleSA9IHBhY2thZ2VzLnRvU3RyaW5nKCk7ICAvLyBVbmlxdWUga2V5IGZvciBzZWFyY2hlcwotICAgIH0KLQotICAgIHB1YmxpYyBBbm5vdGF0aW9uRGVzYyBnZXRBbm5vdGF0aW9uRGVzYyhDbGFzcyBjbHMpIHsKLSAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IGNscy5nZXRDYW5vbmljYWxOYW1lKCk7Ci0gICAgICAgIEFubm90YXRpb25EZXNjIGFEZXNjID0gYW5ub3RhdGlvbk1hcC5nZXQoY2xhc3NOYW1lKTsKLSAgICAgICAgaWYgKGFEZXNjICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIENhY2hlIGhpdAotICAgICAgICAgICAgcmV0dXJuIGFEZXNjOwotICAgICAgICB9Ci0gICAgICAgIC8vIENhY2hlIG1pc3MuLi53ZSBjYW5ub3QgdXBkYXRlIHRoZSBtYXAgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvIGludHJvZHVjZSBhIHN5bmMgY2FsbC4KLSAgICAgICAgYURlc2MgPSBBbm5vdGF0aW9uRGVzY0ltcGwuY3JlYXRlKGNscyk7Ci0KLSAgICAgICAgcmV0dXJuIGFEZXNjOwotICAgIH0KLQotCi0gICAgdm9pZCBzZXRBbm5vdGF0aW9uTWFwKE1hcDxTdHJpbmcsIEFubm90YXRpb25EZXNjPiBtYXApIHsKLSAgICAgICAgdGhpcy5hbm5vdGF0aW9uTWFwID0gbWFwOwotICAgIH0KLQotCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIFByb3BlcnR5RGVzY3JpcHRvclBsdXM+IGdldFByb3BlcnR5RGVzY3JpcHRvck1hcChDbGFzcyBjbHMpIHsKLSAgICAgICAgLy8gV2UgYXJlIGNhY2hpbmcgYnkgY2xhc3MuICAKLSAgICAgICAgTWFwPFN0cmluZywgUHJvcGVydHlEZXNjcmlwdG9yUGx1cz4gcGRNYXAgPSBwZE1hcENhY2hlLmdldChjbHMpOwotICAgICAgICBpZiAocGRNYXAgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gQ2FjaGUgaGl0Ci0gICAgICAgICAgICByZXR1cm4gcGRNYXA7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBDYWNoZSBtaXNzLi4udGhpcyBjYW4gb2NjdXIgaWYgdGhlIGNsYXNzbG9hZGVyIGNoYW5nZWQuCi0gICAgICAgIC8vIFdlIGNhbm5vdCBhZGQgdGhpcyBuZXcgcGRNYXAgYXQgdGhpcyBwb2ludCBkdWUgdG8gc3luYyBpc3N1ZXMuCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBwZE1hcCA9IFhNTFJvb3RFbGVtZW50VXRpbC5jcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3JNYXAoY2xzKTsKLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24odCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHBkTWFwOwotICAgIH0KLQotICAgIHZvaWQgc2V0UHJvcGVydHlEZXNjcmlwdG9yTWFwQ2FjaGUoTWFwPENsYXNzLCBNYXA8U3RyaW5nLCBQcm9wZXJ0eURlc2NyaXB0b3JQbHVzPj4gY2FjaGUpIHsKLSAgICAgICAgdGhpcy5wZE1hcENhY2hlID0gY2FjaGU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRSZXF1ZXN0V3JhcHBlckNsYXNzTmFtZShPcGVyYXRpb25EZXNjcmlwdGlvbiBvcGVyYXRpb25EZXNjKSB7Ci0gICAgICAgIHJldHVybiByZXF1ZXN0V3JhcHBlck1hcC5nZXQob3BlcmF0aW9uRGVzYyk7Ci0gICAgfQotCi0gICAgdm9pZCBzZXRSZXF1ZXN0V3JhcHBlck1hcChNYXA8T3BlcmF0aW9uRGVzY3JpcHRpb24sIFN0cmluZz4gbWFwKSB7Ci0gICAgICAgIHJlcXVlc3RXcmFwcGVyTWFwID0gbWFwOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVzcG9uc2VXcmFwcGVyQ2xhc3NOYW1lKE9wZXJhdGlvbkRlc2NyaXB0aW9uIG9wZXJhdGlvbkRlc2MpIHsKLSAgICAgICAgcmV0dXJuIHJlc3BvbnNlV3JhcHBlck1hcC5nZXQob3BlcmF0aW9uRGVzYyk7Ci0gICAgfQotCi0gICAgdm9pZCBzZXRSZXNwb25zZVdyYXBwZXJNYXAoTWFwPE9wZXJhdGlvbkRlc2NyaXB0aW9uLCBTdHJpbmc+IG1hcCkgewotICAgICAgICByZXNwb25zZVdyYXBwZXJNYXAgPSBtYXA7Ci0gICAgfQotCi0gICAgcHVibGljIEZhdWx0QmVhbkRlc2MgZ2V0RmF1bHRCZWFuRGVzYyhGYXVsdERlc2NyaXB0aW9uIGZhdWx0RGVzYykgewotICAgICAgICByZXR1cm4gZmF1bHRCZWFuRGVzY01hcC5nZXQoZmF1bHREZXNjKTsKLSAgICB9Ci0KLSAgICB2b2lkIHNldEZhdWx0QmVhbkRlc2NNYXAoTWFwPEZhdWx0RGVzY3JpcHRpb24sIEZhdWx0QmVhbkRlc2M+IG1hcCkgewotICAgICAgICBmYXVsdEJlYW5EZXNjTWFwID0gbWFwOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBuZXdsaW5lID0gIlxuIjsKLSAgICAgICAgZmluYWwgU3RyaW5nIHNhbWVsaW5lID0gIiAiOwotICAgICAgICBTdHJpbmdCdWZmZXIgc3RyaW5nID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0gICAgICAgIHN0cmluZy5hcHBlbmQobmV3bGluZSk7Ci0gICAgICAgIHN0cmluZy5hcHBlbmQoIiAgTWFyc2hhbFNlcnZpY2VSdW50aW1lOiIgKyBnZXRLZXkoKSk7Ci0gICAgICAgIHN0cmluZy5hcHBlbmQobmV3bGluZSk7Ci0gICAgICAgIHN0cmluZy5hcHBlbmQoIiAgICBQYWNrYWdlcyA9ICIgKyBnZXRQYWNrYWdlcygpLnRvU3RyaW5nKCkpOwotCi0gICAgICAgIGZvciAoRW50cnk8U3RyaW5nLCBBbm5vdGF0aW9uRGVzYz4gZW50cnkgOiB0aGlzLmFubm90YXRpb25NYXAuZW50cnlTZXQoKSkgewotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZChuZXdsaW5lKTsKLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQoIiAgICBBbm5vdGF0aW9uRGVzYyBjYWNoZWQgZm9yOiIgKyBlbnRyeS5nZXRLZXkoKSk7Ci0gICAgICAgICAgICBzdHJpbmcuYXBwZW5kKGVudHJ5LmdldFZhbHVlKCkudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKEVudHJ5PENsYXNzLCBNYXA8U3RyaW5nLCBQcm9wZXJ0eURlc2NyaXB0b3JQbHVzPj4gZW50cnkgOiB0aGlzLnBkTWFwQ2FjaGUuZW50cnlTZXQoKSkgewotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZChuZXdsaW5lKTsKLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQoIiAgICBQcm9wZXJ0eURlc2NyaXB0b3JQbHVzIE1hcCBjYWNoZWQgZm9yOiIgKwotICAgICAgICAgICAgICAgICAgICBlbnRyeS5nZXRLZXkoKS5nZXRDYW5vbmljYWxOYW1lKCkpOwotICAgICAgICAgICAgZm9yIChQcm9wZXJ0eURlc2NyaXB0b3JQbHVzIHBkcCA6IGVudHJ5LmdldFZhbHVlKCkudmFsdWVzKCkpIHsKLSAgICAgICAgICAgICAgICBzdHJpbmcuYXBwZW5kKG5ld2xpbmUpOwotICAgICAgICAgICAgICAgIHN0cmluZy5hcHBlbmQoIiAgICAgIHByb3BlcnR5TmFtZSAgID0iICsgcGRwLmdldFByb3BlcnR5TmFtZSgpKTsKLSAgICAgICAgICAgICAgICBzdHJpbmcuYXBwZW5kKG5ld2xpbmUpOwotICAgICAgICAgICAgICAgIHN0cmluZy5hcHBlbmQoIiAgICAgICAgeG1sTmFtZSAgICAgID0iICsgcGRwLmdldFhtbE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgc3RyaW5nLmFwcGVuZChuZXdsaW5lKTsKLSAgICAgICAgICAgICAgICBzdHJpbmcuYXBwZW5kKCIgICAgICAgIHByb3BlcnR5VHlwZSA9IiArIHBkcC5nZXRQcm9wZXJ0eVR5cGUoKS5nZXRDYW5vbmljYWxOYW1lKCkpOwotICAgICAgICAgICAgICAgIHN0cmluZy5hcHBlbmQobmV3bGluZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBzdHJpbmcuYXBwZW5kKCIgICAgUmVxdWVzdFdyYXBwZXJzIik7Ci0gICAgICAgIGZvciAoRW50cnk8T3BlcmF0aW9uRGVzY3JpcHRpb24sIFN0cmluZz4gZW50cnkgOiB0aGlzLnJlcXVlc3RXcmFwcGVyTWFwLmVudHJ5U2V0KCkpIHsKLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQobmV3bGluZSk7Ci0gICAgICAgICAgICBzdHJpbmcuYXBwZW5kKCIgICAgT3BlcmF0aW9uOiIgKyBlbnRyeS5nZXRLZXkoKS5nZXRKYXZhTWV0aG9kTmFtZSgpICsKLSAgICAgICAgICAgICAgICAgICAgIiBSZXF1ZXN0V3JhcHBlcjoiICsgZW50cnkuZ2V0VmFsdWUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBzdHJpbmcuYXBwZW5kKCIgICAgUmVzcG9uc2VXcmFwcGVycyIpOwotICAgICAgICBmb3IgKEVudHJ5PE9wZXJhdGlvbkRlc2NyaXB0aW9uLCBTdHJpbmc+IGVudHJ5IDogdGhpcy5yZXNwb25zZVdyYXBwZXJNYXAuZW50cnlTZXQoKSkgewotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZChuZXdsaW5lKTsKLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQoIiAgICBPcGVyYXRpb246IiArIGVudHJ5LmdldEtleSgpLmdldEphdmFNZXRob2ROYW1lKCkgKwotICAgICAgICAgICAgICAgICAgICAiIFJlc3BvbnNlV3JhcHBlcjoiICsgZW50cnkuZ2V0VmFsdWUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBzdHJpbmcuYXBwZW5kKCIgICAgRmF1bHRCZWFuRGVzYyIpOwotICAgICAgICBmb3IgKEVudHJ5PEZhdWx0RGVzY3JpcHRpb24sIEZhdWx0QmVhbkRlc2M+IGVudHJ5IDogdGhpcy5mYXVsdEJlYW5EZXNjTWFwLmVudHJ5U2V0KCkpIHsKLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQobmV3bGluZSk7Ci0gICAgICAgICAgICBzdHJpbmcuYXBwZW5kKCIgICAgRmF1bHRFeGNlcHRpb246IiArIGVudHJ5LmdldEtleSgpLmdldEV4Y2VwdGlvbkNsYXNzTmFtZSgpKTsKLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQobmV3bGluZSk7Ci0gICAgICAgICAgICBzdHJpbmcuYXBwZW5kKGVudHJ5LmdldFZhbHVlKCkudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIHJldHVybiBzdHJpbmcudG9TdHJpbmcoKTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyBNZXNzYWdlRmFjdG9yeSBnZXRNZXNzYWdlRmFjdG9yeSgpIHsKLSAgICAgICAgcmV0dXJuIG1lc3NhZ2VGYWN0b3J5OwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcnVudGltZS9kZXNjcmlwdGlvbi9tYXJzaGFsL2ltcGwvUGFja2FnZVNldEJ1aWxkZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3J1bnRpbWUvZGVzY3JpcHRpb24vbWFyc2hhbC9pbXBsL1BhY2thZ2VTZXRCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhNzM0NjQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcnVudGltZS9kZXNjcmlwdGlvbi9tYXJzaGFsL2ltcGwvUGFja2FnZVNldEJ1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MucnVudGltZS5kZXNjcmlwdGlvbi5tYXJzaGFsLmltcGw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuRXhjZXB0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkVuZHBvaW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5FbmRwb2ludERlc2NyaXB0aW9uSmF2YTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5GYXVsdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uT3BlcmF0aW9uRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5QYXJhbWV0ZXJEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLlNlcnZpY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLlNlcnZpY2VEZXNjcmlwdGlvbldTREw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5ydW50aW1lLmRlc2NyaXB0aW9uLm1hcnNoYWwuQW5ub3RhdGlvbkRlc2M7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5ydW50aW1lLmRlc2NyaXB0aW9uLm1hcnNoYWwuRmF1bHRCZWFuRGVzYzsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnJ1bnRpbWUuZGVzY3JpcHRpb24ubWFyc2hhbC5NYXJzaGFsU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnV0aWwuV1NETDRKV3JhcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnV0aWwuV1NETFdyYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51dGlsaXR5LkNsYXNzVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51dGlsaXR5LkphdmFVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLndzZGwuU2NoZW1hUmVhZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Mud3NkbC5TY2hlbWFSZWFkZXJFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy53c2RsLmltcGwuU2NoZW1hUmVhZGVySW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLldTRExFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkVsZW1lbnQ7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwotCi0vKioKLSAqIEluIG9yZGVyIHRvIG1hcnNoYWwgb3IgdW5tYXJzaGFsIHRoZSB1c2VyIGRhdGEsIHdlIG5lZWQgdG8ga25vdyB0aGUgc2V0IG9mIHBhY2thZ2VzIGludm9sdmVkLgotICogVGhlIHNldCBvZiBwYWNrYWdlcyBpcyB1c2VkIHRvIGNvbnN0cnVjdCBhbiBhcHByb3ByaWF0ZSBKQVhCQ29udGV4dCBvYmplY3QgZHVyaW5nIHRoZQotICogbWFyc2hhbGxpbmcvdW5tYXJzaGFsbGluZy4KLSAqIDxwLz4KLSAqIFRoZXJlIGFyZSB0d28gd2F5cyB0byBnZXQgdGhpcyBkYXRhLgotICogPHAvPgotICogU2NoZW1hIFdhbGsgKHByZWZlcnJlZCk6ICBHZXQgdGhlIGxpc3Qgb2YgcGFja2FnZXMgYnkgd2Fsa2luZyB0aGUgc2NoZW1hcyB0aGF0IGFyZSByZWZlcmVuY2VkIGJ5Ci0gKiB0aGUgd3NkbCAob3IgZ2VuZXJhdGVkIHdzZGwpLiAgRWFjaCBzY2hlbWEgcmVwcmVzZW50cyBhIGRpZmZlcmVudCBwYWNrYWdlLiAgVGhlIHBhY2thZ2UgaXMKLSAqIG9idGFpbmVkIHVzaW5nIHRoZSBqYXhiIGN1c3RvbWl6YXRpb24gb3IgSkFYQiBkZWZhdWx0IG5zPC0+cGFja2FnZSBydWxlLgotICogPHAvPgotICogQW5ub3RhdGlvbiBXYWxrKHNlY29uZGFyeSkgOiBXYWxrIHRoZSBsaXN0IG9mIEVuZHBvaW50cywgT3BlcmF0aW9ucywgUGFyYW1ldGVycywgZXRjLiBhbmQgYnVpbGQgYQotICogbGlzdCBvZiBwYWNrYWdlcyBieSBsb29raW5nIGF0IHRoZSBjbGFzc2VzIGludm9sdmVkLgotICogPHAvPgotICogVGhlIFNjaGVtYSBXYWxrIGlzIGZhc3RlciBhbmQgbW9yZSBjb21wbGV0ZSwgYnV0IHJlbGllcyBvbiB0aGUgcHJlc2VuY2Ugb2YgdGhlIHNjaGVtYSBvciB3c2RsLgotICogPHAvPgotICogVGhlIEFubm90YXRpb24gV2FsayBpcyBzbG93ZXIgYW5kIGlzIG5vdCBjb21wbGV0ZS4gIEZvciBleGFtcGxlLCB0aGUgYW5ub3RhdGlvbiB3YWxrIG1heSBub3QKLSAqIGRpc2NvdmVyIHRoZSBwYWNrYWdlcyBmb3IgZGVyaXZlZCB0eXBlcyB0aGF0IGFyZSBkZWZpbmVkIGluIGEgZGlmZmVyZW50IHNjaGVtYSB0aGFuIHRoZSBmb3JtYWwKLSAqIHBhcmFtZXRlciB0eXBlcy4KLSAqLwotcHVibGljIGNsYXNzIFBhY2thZ2VTZXRCdWlsZGVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhQYWNrYWdlU2V0QnVpbGRlci5jbGFzcyk7Ci0KLSAgICAvKiogVGhpcyBpcyBhIHN0YXRpYyB1dGlsaXR5IGNsYXNzLiAgVGhlIGNvbnN0cnVjdG9yIGlzIGludGVudGlvbmFsbHkgcHJpdmF0ZSAqLwotICAgIHByaXZhdGUgUGFja2FnZVNldEJ1aWxkZXIoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV2Fsa3MgdGhlIHNjaGVtYXMgb2YgdGhlIHNlcnZpY2VEZXNjJ3Mgd3NkbCAob3IgZ2VuZXJhdGVkIHdzZGwpIHRvIGRldGVybWluZSB0aGUgbGlzdCBvZgotICAgICAqIHBhY2thZ2VzLiBUaGlzIGlzIHRoZSBwcmVmZXJyZWQgYWxnb3JpdGhtIGZvciBkaXNjb3ZlcmluZyB0aGUgcGFja2FnZSBzZXQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2VydmljZURlc2MgU2VydmljZURlc2NyaXB0aW9uCi0gICAgICogQHJldHVybiBTZXQgb2YgUGFja2FnZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFRyZWVTZXQ8U3RyaW5nPiBnZXRQYWNrYWdlc0Zyb21TY2hlbWEoU2VydmljZURlc2NyaXB0aW9uIHNlcnZpY2VEZXNjKSB7Ci0KLSAgICAgICAgVHJlZVNldDxTdHJpbmc+IHNldCA9IG5ldyBUcmVlU2V0PFN0cmluZz4oKTsKLSAgICAgICAgLy9JZiB3ZSBhcmUgb24gY2xpZW50IHNpZGUgd2Ugd2lsbCBnZXQgd3NkbCBkZWZpbml0aW9uIGZyb20gU2VydmljZURlc2NyaXB0aW9uLiBJZiB3ZSBhcmUgb24gc2VydmVyIHNpZGUgd2Ugd2lsbCBoYXZlIHRvCi0gICAgICAgIC8vcmVhZCB3c2RsTG9jYXRpb24gZnJvbSBAV2ViU2VydmljZSBBbm5vdGF0aW9uLgotICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb25XU0RMIHNkdyA9IChTZXJ2aWNlRGVzY3JpcHRpb25XU0RMKXNlcnZpY2VEZXNjOwotICAgICAgICBEZWZpbml0aW9uIHdzZGxEZWZpbml0aW9uID0gc2R3LmdldFdTRExEZWZpbml0aW9uKCk7Ci0gICAgICAgIENvbGxlY3Rpb248RW5kcG9pbnREZXNjcmlwdGlvbj4gZW5kcG9pbnREZXNjcyA9IHNlcnZpY2VEZXNjLmdldEVuZHBvaW50RGVzY3JpcHRpb25zX0FzQ29sbGVjdGlvbigpOwotICAgICAgICBpZiAoZW5kcG9pbnREZXNjcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKEVuZHBvaW50RGVzY3JpcHRpb24gZWQ6ZW5kcG9pbnREZXNjcykgewotCi0gICAgICAgICAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyBJIGRvbid0IHRoaW5rIHdlIHNob3VsZCBiZSB0cnlpbmcgdG8gbG9hZCB0aGUgd3NkbERlZmluaXRpb24gaGVyZS4KLQotICAgICAgICAgICAgICAgICAgICAvL0xldCBzZWUgaWYgd2UgY2FuIGdldCB3c2RsIGRlZmluaXRpb24gZnJvbSBlbmRwb2ludCBAV2ViU2VydmljZSBhbm5vdGF0aW9uLgotICAgICAgICAgICAgICAgICAgICBpZiAoZWQgaW5zdGFuY2VvZiBFbmRwb2ludERlc2NyaXB0aW9uSmF2YSkgewotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHdzZGxMb2NhdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRW5kcG9pbnREZXNjcmlwdGlvbkphdmEpZWQpLmdldEFubm9XZWJTZXJ2aWNlV1NETExvY2F0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3c2RsRGVmaW5pdGlvbiA9IGdldFdTRExEZWZpbml0aW9uKHdzZGxMb2NhdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy9TbyBhdCB0aGlzIHBvaW50IGVpdGhlciB3ZSBnb3Qgd3NkbCBkZWZpbml0aW9uIGZyb20gU2VydmljZURlc2NyaXB0aW9uICh3aGljaCBtZWFucyB3ZSBhcmUgcnVubmluZyB0aGlzIGNvZGUKLSAgICAgICAgICAgICAgICAvL29uIGNsaWVudCBzaWRlKSBvciB3ZSBnb3QgaXQgZnJvbSB0aGUgQFdlYlNlcnZpY2UgYW5ub3RhdGlvbiAod2hpY2ggbWVhbnMgd2UgYXJlIHJ1bm5pbmcgdGhpcyBjb2RlIG9uIHNlcnZlciBzaWRlKQotICAgICAgICAgICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIFNjaGVtYVJlYWRlciBzciA9IG5ldyBTY2hlbWFSZWFkZXJJbXBsKCk7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTZXQ8U3RyaW5nPiBwa2dTZXQgPSBzci5yZWFkUGFja2FnZXNGcm9tU2NoZW1hKHdzZGxEZWZpbml0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldC5hZGRBbGwocGtnU2V0KTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoU2NoZW1hUmVhZGVyRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNldDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gc2VydmljZURlc2NyaXB0aW9uIFNlcnZpY2VEZXNjcmlwdGlvbgotICAgICAqIEByZXR1cm4gU2V0IG9mIFBhY2thZ2VzCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBUcmVlU2V0PFN0cmluZz4gZ2V0UGFja2FnZXNGcm9tQW5ub3RhdGlvbnMoU2VydmljZURlc2NyaXB0aW9uIHNlcnZpY2VEZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcnNoYWxTZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uIG1zcmQpIHsKLSAgICAgICAgVHJlZVNldDxTdHJpbmc+IHNldCA9IG5ldyBUcmVlU2V0PFN0cmluZz4oKTsKLSAgICAgICAgQ29sbGVjdGlvbjxFbmRwb2ludERlc2NyaXB0aW9uPiBlbmRwb2ludERlc2NzID0gc2VydmljZURlc2MuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbnNfQXNDb2xsZWN0aW9uKCk7Ci0gICAgICAgIAotICAgICAgICAvLyBCdWlsZCBhIHNldCBvZiBwYWNrYWdlcyBmcm9tIGFsbCBvZiB0aGUgZW5kcG9pbnRzCi0gICAgICAgIGlmIChlbmRwb2ludERlc2NzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoRW5kcG9pbnREZXNjcmlwdGlvbiBlbmRwb2ludERlc2M6IGVuZHBvaW50RGVzY3MpIHsKLSAgICAgICAgICAgICAgICBzZXQuYWRkQWxsKGdldFBhY2thZ2VzRnJvbUFubm90YXRpb25zKGVuZHBvaW50RGVzYywgbXNyZCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzZXQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGVuZHBvaW50RGVzYyBFbmRwb2ludERlc2NyaXB0aW9uCi0gICAgICogQHJldHVybiBTZXQgb2YgUGFja2FnZXMKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBUcmVlU2V0PFN0cmluZz4gZ2V0UGFja2FnZXNGcm9tQW5ub3RhdGlvbnMoRW5kcG9pbnREZXNjcmlwdGlvbiBlbmRwb2ludERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcnNoYWxTZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uIG1zcmQpIHsKLSAgICAgICAgCi0gICAgICAgIFRyZWVTZXQ8U3RyaW5nPiBzZXQgPSBuZXcgVHJlZVNldDxTdHJpbmc+KCk7Ci0gICAgICAgIFN0cmluZyBpbXBsQ2xhc3NOYW1lID0gZ2V0U2VydmljZUltcGxDbGFzc05hbWUoZW5kcG9pbnREZXNjKTsKLSAgICAgICAgaWYgKGltcGxDbGFzc05hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgQ2xhc3MgY2x6ID0gbG9hZENsYXNzKGltcGxDbGFzc05hbWUpOwotICAgICAgICAgICAgaWYoY2x6ID09IG51bGwpewotICAgICAgICAgICAgICAgIGNseiA9IGxvYWRDbGFzcyhpbXBsQ2xhc3NOYW1lLCBlbmRwb2ludERlc2MuZ2V0QXhpc1NlcnZpY2UoKS5nZXRDbGFzc0xvYWRlcigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChjbHogIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGFkZFhtbFNlZUFsc29QYWNrYWdlcyhjbHosIG1zcmQsIHNldCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiBlbmRwb2ludEludGVyZmFjZURlc2MgPQotICAgICAgICAgICAgICAgIGVuZHBvaW50RGVzYy5nZXRFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgIGlmIChlbmRwb2ludEludGVyZmFjZURlc2MgIT0gbnVsbCkgewotICAgICAgICAgICAgZ2V0UGFja2FnZXNGcm9tQW5ub3RhdGlvbnMoZW5kcG9pbnREZXNjLCBlbmRwb2ludEludGVyZmFjZURlc2MsIHNldCwgbXNyZCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNldDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gZW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uCi0gICAgICogQHBhcmFtIFNldCBvZiBQYWNrYWdlcwotICAgICAqIEBwYXJhbSBtc3JkCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBnZXRQYWNrYWdlc0Zyb21Bbm5vdGF0aW9ucygKLSAgICAgICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZWQsCi0gICAgICAgICAgICBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uIGVuZHBvaW50SW50ZXJmYWNlRGVzYywKLSAgICAgICAgICAgIFRyZWVTZXQ8U3RyaW5nPiBzZXQsCi0gICAgICAgICAgICBNYXJzaGFsU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbiBtc3JkKSB7Ci0gICAgICAgIAotICAgICAgICBPcGVyYXRpb25EZXNjcmlwdGlvbltdIG9wRGVzY3MgPSBlbmRwb2ludEludGVyZmFjZURlc2MuZ2V0RGlzcGF0Y2hhYmxlT3BlcmF0aW9ucygpOwotCi0gICAgICAgIC8vIEluc3BlY3QgdGhlIEBYbWxTZWVBbHNvIGNsYXNzZXMgb24gdGhlIGludGVyZmFjZQotICAgICAgICBhZGRYbWxTZWVBbHNvUGFja2FnZXMoZW5kcG9pbnRJbnRlcmZhY2VEZXNjLmdldFNFSUNsYXNzKCksIG1zcmQsIHNldCk7Ci0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgLy8gQnVpbGQgYSBzZXQgb2YgcGFja2FnZXMgZnJvbSBhbGwgb2YgdGhlIG9wZXJhdGlvbnMKLSAgICAgICAgaWYgKG9wRGVzY3MgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvcERlc2NzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgZ2V0UGFja2FnZXNGcm9tQW5ub3RhdGlvbnMoZWQsIG9wRGVzY3NbaV0sIHNldCwgbXNyZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVwZGF0ZSB0aGUgcGFja2FnZSBzZXQgd2l0aCB0aGUgcGFja2FnZXMgcmVmZXJlbmNlZCBieSB0aGlzIE9wZXJhdGlvbkRlc2MKLSAgICAgKgotICAgICAqIEBwYXJhbSBvcERlc2MgT3BlcmF0aW9uRGVzY3JpcHRpb24KLSAgICAgKiBAcGFyYW0gc2V0ICAgIFNldDxQYWNrYWdlPiB0aGF0IGlzIHVwZGF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGdldFBhY2thZ2VzRnJvbUFubm90YXRpb25zKEVuZHBvaW50RGVzY3JpcHRpb24gZWQsIE9wZXJhdGlvbkRlc2NyaXB0aW9uIG9wRGVzYywgVHJlZVNldDxTdHJpbmc+IHNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcnNoYWxTZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uIG1zcmQpIHsKLQotICAgICAgICAvLyBXYWxrIHRoZSBwYXJhbWV0ZXIgaW5mb3JtYXRpb24KLSAgICAgICAgUGFyYW1ldGVyRGVzY3JpcHRpb25bXSBwYXJhbWV0ZXJEZXNjcyA9IG9wRGVzYy5nZXRQYXJhbWV0ZXJEZXNjcmlwdGlvbnMoKTsKLSAgICAgICAgaWYgKHBhcmFtZXRlckRlc2NzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1ldGVyRGVzY3MubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBnZXRQYWNrYWdlc0Zyb21Bbm5vdGF0aW9ucyhwYXJhbWV0ZXJEZXNjc1tpXSwgc2V0LCBtc3JkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIFdhbGsgdGhlIGZhdWx0IGluZm9ybWF0aW9uCi0gICAgICAgIEZhdWx0RGVzY3JpcHRpb25bXSBmYXVsdERlc2NzID0gb3BEZXNjLmdldEZhdWx0RGVzY3JpcHRpb25zKCk7Ci0gICAgICAgIGlmIChmYXVsdERlc2NzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmF1bHREZXNjcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGdldFBhY2thZ2VzRnJvbUFubm90YXRpb25zKGVkLCBmYXVsdERlc2NzW2ldLCBzZXQsIG1zcmQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQWxzbyBjb25zaWRlciB0aGUgcmVxdWVzdCBhbmQgcmVzcG9uc2Ugd3JhcHBlcnMKLSAgICAgICAgU3RyaW5nIHBrZyA9IGdldFBhY2thZ2VGcm9tQ2xhc3NOYW1lKG1zcmQuZ2V0UmVxdWVzdFdyYXBwZXJDbGFzc05hbWUob3BEZXNjKSk7Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJQYWNrYWdlIGZyb20gUmVxdWVzdCBXcmFwcGVyIGFubm90YXRpb24gPSAiICsgcGtnKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocGtnICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNldC5hZGQocGtnKTsKLSAgICAgICAgfQotICAgICAgICBwa2cgPSBnZXRQYWNrYWdlRnJvbUNsYXNzTmFtZShtc3JkLmdldFJlc3BvbnNlV3JhcHBlckNsYXNzTmFtZShvcERlc2MpKTsKLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIlBhY2thZ2UgZnJvbSBSZXNwb25zZSBXcmFwcGVyIGFubm90YXRpb24gPSAiICsgcGtnKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocGtnICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNldC5hZGQocGtnKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEZpbmFsbHkgY29uc2lkZXIgdGhlIHJlc3VsdCB0eXBlCi0gICAgICAgIENsYXNzIGNscyA9IG9wRGVzYy5nZXRSZXN1bHRBY3R1YWxUeXBlKCk7Ci0gICAgICAgIGlmIChjbHMgIT0gbnVsbCAmJiBjbHMgIT0gdm9pZC5jbGFzcyAmJiBjbHMgIT0gVm9pZC5jbGFzcykgewotICAgICAgICAgICAgUGFja2FnZSByZXR1cm5UeXBlUGtnID0gY2xzLmdldFBhY2thZ2UoKTsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiUGFja2FnZSBmcm9tIFJldHVybiBUeXBlID0gIiArIHBrZyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocmV0dXJuVHlwZVBrZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcGtnID0gcmV0dXJuVHlwZVBrZy5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgc2V0LmFkZChwa2cpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXBkYXRlIHRoZSBwYWNrYWdlIHNldCB3aXRoIHRoZSBwYWNrYWdlcyByZWZlcmVuY2VkIGJ5IHRoaXMgUGFyYW1ldGVyRGVzY3JpcHRpb24KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJhbURlc2MgUGFyYW1ldGVyRGVzYwotICAgICAqIEBwYXJhbSBzZXQgICAgICAgU2V0PFBhY2thZ2U+IHRoYXQgaXMgdXBkYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZ2V0UGFja2FnZXNGcm9tQW5ub3RhdGlvbnMoUGFyYW1ldGVyRGVzY3JpcHRpb24gcGFyYW1EZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJlZVNldDxTdHJpbmc+IHNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcnNoYWxTZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uIG1zcmQpIHsKLQotICAgICAgICAvLyBHZXQgdGhlIHR5cGUgdGhhdCBkZWZpbmVzIHRoZSBhY3R1YWwgZGF0YS4gICh0aGlzIGlzIG5ldmVyIGEgaG9sZGVyICkKLSAgICAgICAgQ2xhc3MgcGFyYW1DbGFzcyA9IHBhcmFtRGVzYy5nZXRQYXJhbWV0ZXJBY3R1YWxUeXBlKCk7Ci0KLSAgICAgICAgaWYgKHBhcmFtQ2xhc3MgIT0gbnVsbCkgewotICAgICAgICAgICAgc2V0VHlwZUFuZEVsZW1lbnRQYWNrYWdlcyhwYXJhbUNsYXNzLCBwYXJhbURlc2MuZ2V0VGFyZ2V0TmFtZXNwYWNlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtRGVzYy5nZXRQYXJ0TmFtZSgpLCBzZXQsIG1zcmQpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVcGRhdGUgdGhlIHBhY2thZ2Ugc2V0IHdpdGggdGhlIHBhY2thZ2VzIHJlZmVyZW5jZWQgYnkgdGhpcyBGYXVsdERlc2NyaXB0aW9uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZmF1bHREZXNjIEZhdWx0RGVzY3JpcHRpb24KLSAgICAgKiBAcGFyYW0gc2V0ICAgICAgIFNldDxQYWNrYWdlPiB0aGF0IGlzIHVwZGF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGdldFBhY2thZ2VzRnJvbUFubm90YXRpb25zKEVuZHBvaW50RGVzY3JpcHRpb24gZWQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmF1bHREZXNjcmlwdGlvbiBmYXVsdERlc2MsIFRyZWVTZXQ8U3RyaW5nPiBzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXJzaGFsU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbiBtc3JkKSB7Ci0KLSAgICAgICAgRmF1bHRCZWFuRGVzYyBmYXVsdEJlYW5EZXNjID0gbXNyZC5nZXRGYXVsdEJlYW5EZXNjKGZhdWx0RGVzYyk7Ci0gICAgICAgIGlmKGZhdWx0QmVhbkRlc2MgPT0gbnVsbCl7Ci0gICAgICAgICAgICBpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSl7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJmYXVsdEJlYW5EZXNjIGZyb20gTWFyc2hhbGxTZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uIGlzIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vTk8gRmF1bHRCZWFuRGVzYyBmb3VuZCBub3RoaW5nIHdlIGNhbiBkby4KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgZmF1bHRCZWFuTmFtZSA9IGZhdWx0QmVhbkRlc2MuZ2V0RmF1bHRCZWFuQ2xhc3NOYW1lKCk7Ci0gICAgICAgIGlmKGZhdWx0QmVhbk5hbWUgPT0gbnVsbCl7Ci0gICAgICAgICAgICBpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSl7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJGYXVsdEJlYW5OYW1lIGlzIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vV2UgY2Fubm90IGxvYWQgdGhlIGZhdWx0QmVhbk5hbWUKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBDbGFzcyBmYXVsdEJlYW4gPSBsb2FkQ2xhc3MoZmF1bHRCZWFuTmFtZSk7Ci0gICAgICAgIGlmKGZhdWx0QmVhbiA9PSBudWxsKXsKLSAgICAgICAgICAgIGZhdWx0QmVhbiA9IGxvYWRDbGFzcyhmYXVsdEJlYW5OYW1lLCBlZC5nZXRBeGlzU2VydmljZSgpLmdldENsYXNzTG9hZGVyKCkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChmYXVsdEJlYW4gIT0gbnVsbCkgewotICAgICAgICAgICAgc2V0VHlwZUFuZEVsZW1lbnRQYWNrYWdlcyhmYXVsdEJlYW4sIGZhdWx0QmVhbkRlc2MuZ2V0RmF1bHRCZWFuTmFtZXNwYWNlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhdWx0QmVhbkRlc2MuZ2V0RmF1bHRCZWFuTG9jYWxOYW1lKCksIHNldCwgbXNyZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGb3IgZWFjaCBkYXRhIGVsZW1lbnQsIHdlIG5lZWQgdGhlIHBhY2thZ2UgZm9yIGJvdGggdGhlIGVsZW1lbnQgYW5kIGl0cyB0eXBlLgotICAgICAqCi0gICAgICogQHBhcmFtIGNscyAgICAgICBDbGFzcyByZXByZXNlbnRpbmcgZWxlbWVudCwgdHlwZSBvciBib3RoCi0gICAgICogQHBhcmFtIG5hbWVzcGFjZSBvZiB0aGUgZWxlbWVudAotICAgICAqIEBwYXJhbSBsb2NhbFBhcnQgb2YgdGhlIGVsZW1lbnQKLSAgICAgKiBAcGFyYW0gc2V0ICAgICAgIHdpdGggYm90aCB0eXBlIGFuZCBlbGVtZW50IHBhY2thZ2VzIHNldAotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgc2V0VHlwZUFuZEVsZW1lbnRQYWNrYWdlcyhDbGFzcyBjbHMsIFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBsb2NhbFBhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyZWVTZXQ8U3RyaW5nPiBzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcnNoYWxTZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uIG1zcmQpIHsKLQotICAgICAgICAvLyBHZXQgdGhlIGVsZW1lbnQgYW5kIHR5cGUgY2xhc3NlcwotICAgICAgICBDbGFzcyBlQ2xhc3MgPSBnZXRFbGVtZW50KGNscywgbXNyZCk7Ci0gICAgICAgIENsYXNzIHRDbGFzcyA9IGdldFR5cGUoY2xzKTsKLQotICAgICAgICAvLyBTZXQgdGhlIHBhY2thZ2UgZm9yIHRoZSB0eXBlCi0gICAgICAgIGlmICh0Q2xhc3MgIT0gbnVsbCkgewotICAgICAgICAgICAgUGFja2FnZSB0eXBlUGtnID0gdENsYXNzLmdldFBhY2thZ2UoKTsKLSAgICAgICAgICAgIC8vRm9yIHByaW1pdGl2ZSB0eXBlcyB0aGVyZSBpcyBubyBwYWNrYWdlCi0gICAgICAgICAgICBTdHJpbmcgcGtnID0gKHR5cGVQa2cgIT0gbnVsbCkgPyB0eXBlUGtnLmdldE5hbWUoKSA6IG51bGw7Ci0KLSAgICAgICAgICAgIGlmIChwa2cgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHNldC5hZGQocGtnKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFkZFhtbFNlZUFsc29QYWNrYWdlcyh0Q2xhc3MsIG1zcmQsIHNldCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTZXQgdGhlIHBhY2thZ2UgZm9yIHRoZSBlbGVtZW50Ci0gICAgICAgIGlmICh0Q2xhc3MgIT0gZUNsYXNzKSB7Ci0gICAgICAgICAgICBpZiAoZUNsYXNzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBBIG51bGwgb3IgZW1wdHkgbmFtZXNwYWNlIGluZGljYXRlcyB0aGF0IHRoZSBlbGVtZW50IGlzCi0gICAgICAgICAgICAgICAgLy8gdW5xdWFsaWZpZWQuICBUaGlzIGNhbiBvY2N1ciBpZiB0aGUgcGFyYW1ldGVyIGlzIHJlcHJlc2VudGVkIGFzIGEgY2hpbGQgZWxlbWVudCAKLSAgICAgICAgICAgICAgICAvLyBpbiBkb2MvbGl0IHdyYXBwZWQuICBUaGUgcGFja2FnZSBpcyBkZXRlcm1pbmVkIGZyb20gdGhlIHdyYXBwZXIgZWxlbWVudCBpbiBzdWNoIGNhc3Nlcy4KLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlICE9IG51bGwgJiYgbmFtZXNwYWNlLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAvLyBVc2UgZGVmYXVsdCBuYW1lc3BhY2UgdG8gcGFja2FnZSBhbGdvcml0aG0KLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBrZyA9IG1ha2VQYWNrYWdlKG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwa2cgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc2V0LmFkZChwa2cpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBQYWNrYWdlIGVsZW1lbnRQa2cgPSBlQ2xhc3MuZ2V0UGFja2FnZSgpOwotICAgICAgICAgICAgICAgIFN0cmluZyBwa2cgPSAoZWxlbWVudFBrZyAhPSBudWxsKSA/IGVsZW1lbnRQa2cuZ2V0TmFtZSgpIDogbnVsbDsKLSAgICAgICAgICAgICAgICBpZiAocGtnICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0LmFkZChwa2cpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBhZGRYbWxTZWVBbHNvUGFja2FnZXModENsYXNzLCBtc3JkLCBzZXQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSWYgY2xzIHJlcHJlc2VudHMgYW4geG1sIGVsZW1lbnQgdGhlbiBjbHMgaXMgcmV0dXJuZWQuIE90aGVyd2lzZSBudWxsIGlzIHJldHVybmVkCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2xzIENsYXNzCi0gICAgICogQHJldHVybiBDbGFzcyBvciBudWxsCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3MgZ2V0RWxlbWVudChDbGFzcyBjbHMsIE1hcnNoYWxTZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uIG1zcmQpIHsKLSAgICAgICAgQW5ub3RhdGlvbkRlc2MgYW5ub3RhdGlvbkRlc2MgPSBtc3JkLmdldEFubm90YXRpb25EZXNjKGNscyk7Ci0gICAgICAgIGlmIChhbm5vdGF0aW9uRGVzYyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBUaGlzIHNob3VsZG4ndCBoYXBwZW4KLSAgICAgICAgICAgIGFubm90YXRpb25EZXNjID0gQW5ub3RhdGlvbkRlc2NJbXBsLmNyZWF0ZShjbHMpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChhbm5vdGF0aW9uRGVzYy5oYXNYbWxSb290RWxlbWVudCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gY2xzOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIENsYXNzW10gbm9DbGFzcyA9IG5ldyBDbGFzc1tdIHsgfTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNsYXNzIHRoYXQgZGVmaW5lcyB0aGUgdHlwZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjbHMKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3MgZ2V0VHlwZShDbGFzcyBjbHMpIHsKLSAgICAgICAgaWYgKEpBWEJFbGVtZW50LmNsYXNzLmlzQXNzaWduYWJsZUZyb20oY2xzKSkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBNZXRob2QgbSA9IGNscy5nZXRNZXRob2QoImdldFZhbHVlIiwgbm9DbGFzcyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG0uZ2V0UmV0dXJuVHlwZSgpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBXZSBzaG91bGQgbmV2ZXIgZ2V0IGhlcmUKLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJDYW5ub3QgZmluZCBKQVhCRWxlbWVudC5nZXRWYWx1ZSBtZXRob2QuIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGNsczsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIERlZmF1bHQgTmFtZXNwYWNlIHRvIFBhY2thZ2UgYWxnb3JpdGhtCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbnMKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIG1ha2VQYWNrYWdlKFN0cmluZyBucykgewotICAgICAgICBTdHJpbmcgcGtnTmFtZSA9IEphdmFVdGlscy5nZXRQYWNrYWdlRnJvbU5hbWVzcGFjZShucyk7Ci0gICAgICAgIHJldHVybiBwa2dOYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgcGFja2FnZSBhc3NvY2lhdGVkIHdpdGggdGhlIGNsYXNzIG5hbWUuICBUaGUgY2xhc3NOYW1lIG1heSBub3QgYmUgc3BlY2lmaWVkIChpbgotICAgICAqIHdoaWNoIGNhc2UgYSBudWxsIFBhY2thZ2UgaXMgcmV0dXJuZWQpLiBpZiBjbGFzcyBoYXMgdW5uYW1lZCBwYWNrYWdlIHJldHVybiAiIgotICAgICAqCi0gICAgICogQHBhcmFtIGNsYXNzTmFtZSBTdHJpbmcgKG1heSBiZSBudWxsIG9yIGVtcHR5KQotICAgICAqIEByZXR1cm4gUGFja2FnZSBvciBudWxsIGlmIHByb2JsZW1zIG9jY3VyCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFBhY2thZ2VGcm9tQ2xhc3NOYW1lKFN0cmluZyBjbGFzc05hbWUpIHsKLSAgICAgICAgQ2xhc3MgY2x6ID0gbG9hZENsYXNzKGNsYXNzTmFtZSk7Ci0gICAgICAgIFN0cmluZyBwa2cgPQotICAgICAgICAgICAgICAgIChjbHogPT0gbnVsbCkgPyBudWxsIDogKGNsei5nZXRQYWNrYWdlKCkgPT0gbnVsbCkgPyAiIiA6IGNsei5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpOwotICAgICAgICByZXR1cm4gcGtnOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYWRkWG1sU2VlQWxzb1BhY2thZ2VzKENsYXNzIGNseiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFyc2hhbFNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb24gbXNyZCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJlZVNldDxTdHJpbmc+IHNldCkgewotICAgICAgICBpZiAoY2x6ICE9IG51bGwpIHsKLSAgICAgICAgICAgIEFubm90YXRpb25EZXNjIGFEZXNjID0gbXNyZC5nZXRBbm5vdGF0aW9uRGVzYyhjbHopOwotICAgICAgICAgICAgaWYgKGFEZXNjICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBDbGFzc1tdIHNlZUFsc28gPSBhRGVzYy5nZXRYbWxTZWVBbHNvQ2xhc3NlcygpOwotICAgICAgICAgICAgICAgIGlmIChzZWVBbHNvICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPHNlZUFsc28ubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwa2cgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWVBbHNvW2ldID09IG51bGwpID8gbnVsbCA6IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VlQWxzb1tpXS5nZXRQYWNrYWdlKCkgPT0gbnVsbCkgPyAiIiA6IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VlQWxzb1tpXS5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBrZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0LmFkZChwa2cpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBDbGFzc1tdIGludGVyZmFjZXMgPSBjbHouZ2V0SW50ZXJmYWNlcygpOwotICAgICAgICAgICAgaWYgKGludGVyZmFjZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxpbnRlcmZhY2VzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZFhtbFNlZUFsc29QYWNrYWdlcyhpbnRlcmZhY2VzW2ldLCBtc3JkLCBzZXQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAvKioKLSAgICAgKiBMb2FkcyB0aGUgY2xhc3MKLSAgICAgKgotICAgICAqIEBwYXJhbSBjbGFzc05hbWUKLSAgICAgKiBAcmV0dXJuIENsYXNzIChvciBudWxsIGlmIHRoZSBjbGFzcyBjYW5ub3QgYmUgbG9hZGVkKQotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIENsYXNzIGxvYWRDbGFzcyhTdHJpbmcgY2xhc3NOYW1lKSB7Ci0gICAgICAgIC8vIERvbid0IG1ha2UgdGhpcyBwdWJsaWMsIGl0cyBhIHNlY3VyaXR5IGV4cG9zdXJlCi0gICAgICAgIGlmIChjbGFzc05hbWUgPT0gbnVsbCB8fCBjbGFzc05hbWUubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIENsYXNzLmZvck5hbWUgZG9lcyBub3Qgc3VwcG9ydCBwcmltaXRpdmVzCi0gICAgICAgICAgICBDbGFzcyBjbHMgPSBDbGFzc1V0aWxzLmdldFByaW1pdGl2ZUNsYXNzKGNsYXNzTmFtZSk7Ci0gICAgICAgICAgICBpZiAoY2xzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjbHMgPSBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSwgdHJ1ZSwgZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGNsczsKLSAgICAgICAgICAgIC8vQ2F0Y2ggVGhyb3dhYmxlIGFzIENsYXNzTG9hZGVyIGNhbiB0aHJvdyBhbiBOb0NsYXNzRGVmRm91bmRFcnJvciB0aGF0Ci0gICAgICAgICAgICAvL2RvZXMgbm90IGV4dGVuZCBFeGNlcHRpb24sIHNvIGxldHMgY2F0Y2ggZXZlcnl0aGluZyB0aGF0IGV4dGVuZHMgVGhyb3dhYmxlCi0gICAgICAgICAgICAvL3JhdGhlciB0aGFuIGp1c3QgRXhjZXB0aW9uLgotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkgewotICAgICAgICAgICAgLy8gVE9ETyBTaG91bGQgdGhlIGV4Y2VwdGlvbiBiZSBzd2FsbG93ZWQgPwotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJQYWNrYWdlU2V0QnVpbGRlciBjYW5ub3QgbG9hZCB0aGUgZm9sbG93aW5nIGNsYXNzOiIgKyBjbGFzc05hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIExvYWRzIHRoZSBjbGFzcwotICAgICAqCi0gICAgICogQHBhcmFtIGNsYXNzTmFtZQotICAgICAqIEByZXR1cm4gQ2xhc3MgKG9yIG51bGwgaWYgdGhlIGNsYXNzIGNhbm5vdCBiZSBsb2FkZWQpCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3MgbG9hZENsYXNzKFN0cmluZyBjbGFzc05hbWUsIENsYXNzTG9hZGVyIGxvYWRlcikgewotICAgICAgICAvLyBEb24ndCBtYWtlIHRoaXMgcHVibGljLCBpdHMgYSBzZWN1cml0eSBleHBvc3VyZQotICAgICAgICBpZiAoY2xhc3NOYW1lID09IG51bGwgfHwgY2xhc3NOYW1lLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBDbGFzcy5mb3JOYW1lIGRvZXMgbm90IHN1cHBvcnQgcHJpbWl0aXZlcwotICAgICAgICAgICAgQ2xhc3MgY2xzID0gQ2xhc3NVdGlscy5nZXRQcmltaXRpdmVDbGFzcyhjbGFzc05hbWUpOwotICAgICAgICAgICAgaWYgKGNscyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY2xzID0gQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUsIHRydWUsIGxvYWRlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gY2xzOwotICAgICAgICAgICAgLy9DYXRjaCBUaHJvd2FibGUgYXMgQ2xhc3NMb2FkZXIgY2FuIHRocm93IGFuIE5vQ2xhc3NEZWZGb3VuZEVycm9yIHRoYXQKLSAgICAgICAgICAgIC8vZG9lcyBub3QgZXh0ZW5kIEV4Y2VwdGlvbiwgc28gbGV0cyBjYXRjaCBldmVyeXRoaW5nIHRoYXQgZXh0ZW5kcyBUaHJvd2FibGUKLSAgICAgICAgICAgIC8vcmF0aGVyIHRoYW4ganVzdCBFeGNlcHRpb24uCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0gICAgICAgICAgICAvLyBUT0RPIFNob3VsZCB0aGUgZXhjZXB0aW9uIGJlIHN3YWxsb3dlZCA/Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlBhY2thZ2VTZXRCdWlsZGVyIGNhbm5vdCBsb2FkIHRoZSBmb2xsb3dpbmcgY2xhc3M6IiArIGNsYXNzTmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgRGVmaW5pdGlvbiBnZXRXU0RMRGVmaW5pdGlvbihTdHJpbmcgd3NkbExvYyl7Ci0gICAgICAgIERlZmluaXRpb24gd3NkbERlZmluaXRpb24gPSBudWxsOwotICAgICAgICBmaW5hbCBTdHJpbmcgd3NkbExvY2F0aW9uID0gd3NkbExvYzsKLSAgICAgICAgaWYgKHdzZGxMb2NhdGlvbiAhPSBudWxsICYmIHdzZGxMb2NhdGlvbi50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHdzZGxEZWZpbml0aW9uID0gKERlZmluaXRpb24pIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgV1NETEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBiYXNlRGlyID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJiYXNlZGlyIiwiLiIpKS5nZXRDYW5vbmljYWxQYXRoKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB3c2RsTG9jYXRpb25QYXRoID0gbmV3IEZpbGUoYmFzZURpciArRmlsZS5zZXBhcmF0b3IrIHdzZGxMb2NhdGlvbikuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKHdzZGxMb2NhdGlvblBhdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkwgdXJsID0gZmlsZS50b1VSTCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlJlYWRpbmcgV1NETCBmcm9tIFVSTDoiICt1cmwudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhIHRlbXBvcmFyeSB3c2RsIGFuZCB3ZSB1c2UgaXQgdG8gZGlnIGludG8gdGhlIHNjaGVtYXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRodXMgdGhlIG1lbW9yeSBsaW1pdCBpcyBzZXQgdG8gZmFsc2UuICBJdCB3aWxsIGJlIGRpc2NhcmRlZCBhZnRlciBpdCBpcyB1c2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ5IHRoZSBQYWNrYWdlU2V0QnVpbGRlciBpbXBsZW1lbnRhdGlvbi4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NETFdyYXBwZXIgd3NkbFdyYXBwZXIgPSBuZXcgV1NETDRKV3JhcHBlcih1cmwsIGZhbHNlLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdzZGxXcmFwcGVyLmdldERlZmluaXRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIFN3YWxsb3cgYW5kIGNvbnRpbnVlCi0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiRXhjZXB0aW9uIGdldHRpbmcgd3NkbExvY2F0aW9uOiAiICtlLmdldEV4Y2VwdGlvbigpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gd3NkbERlZmluaXRpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBjbGFzcyBmb3IgdGhpcyBuYW1lCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIENsYXNzCi0gICAgICovCi0gICAgc3RhdGljIENsYXNzIGZvck5hbWUoZmluYWwgU3RyaW5nIGNsYXNzTmFtZSwgZmluYWwgYm9vbGVhbiBpbml0aWFsaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzTG9hZGVyIGNsYXNzbG9hZGVyKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIE5PVEU6IFRoaXMgbWV0aG9kIG11c3QgcmVtYWluIHByb3RlY3RlZCBiZWNhdXNlIGl0IHVzZXMgQWNjZXNzQ29udHJvbGxlcgotICAgICAgICBDbGFzcyBjbCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjbCA9IChDbGFzcylBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgKLSAgICAgICAgICAgICAgICAgICAgbmV3IFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDbGFzcy5mb3JOYW1lIGRvZXMgbm90IHN1cHBvcnQgcHJpbWl0aXZlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzIGNscyA9IENsYXNzVXRpbHMuZ2V0UHJpbWl0aXZlQ2xhc3MoY2xhc3NOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xzID0gQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUsIGluaXRpYWxpemUsIGNsYXNzbG9hZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNsczsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgKTsKLSAgICAgICAgfSBjYXRjaCAoUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkV4Y2VwdGlvbiB0aHJvd24gZnJvbSBBY2Nlc3NDb250cm9sbGVyOiAiICsgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aHJvdyAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbillLmdldEV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGNsOwotICAgIH0KLQotICAgIC8qKiBAcmV0dXJuIENsYXNzTG9hZGVyICovCi0gICAgc3RhdGljIENsYXNzTG9hZGVyIGdldENvbnRleHRDbGFzc0xvYWRlcigpIHsKLSAgICAgICAgLy8gTk9URTogVGhpcyBtZXRob2QgbXVzdCByZW1haW4gcHJpdmF0ZSBiZWNhdXNlIGl0IHVzZXMgQWNjZXNzQ29udHJvbGxlcgotICAgICAgICBDbGFzc0xvYWRlciBjbCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjbCA9IChDbGFzc0xvYWRlcilBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgKLSAgICAgICAgICAgICAgICAgICAgbmV3IFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgKTsKLSAgICAgICAgfSBjYXRjaCAoUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkV4Y2VwdGlvbiB0aHJvd24gZnJvbSBBY2Nlc3NDb250cm9sbGVyOiAiICsgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbillLmdldEV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGNsOwotICAgIH0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIFNlcml2Y2UgSW1wbCBDbGFzcyBieSBsb29raW5nIGF0IHRoZSBBeGlzU2VydmljZQotICAgICAqIEBwYXJhbSBlbmRwb2ludERlc2NyaXB0aW9uCi0gICAgICogQHJldHVybiBjbGFzcyBuYW1lIG9yIG51bGwKLSAgICAgKi8KLSAgICBzdGF0aWMgcHJpdmF0ZSBTdHJpbmcgZ2V0U2VydmljZUltcGxDbGFzc05hbWUoRW5kcG9pbnREZXNjcmlwdGlvbiBlbmRwb2ludERlc2NyaXB0aW9uKSB7Ci0gICAgICAgIFN0cmluZyByZXN1bHQgPSBudWxsOwotICAgICAgICBpZiAoZW5kcG9pbnREZXNjcmlwdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBBeGlzU2VydmljZSBhcyA9IGVuZHBvaW50RGVzY3JpcHRpb24uZ2V0QXhpc1NlcnZpY2UoKTsKLSAgICAgICAgICAgIGlmIChhcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgUGFyYW1ldGVyIHBhcmFtID0gYXMuZ2V0UGFyYW1ldGVyKG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzLlNFUlZJQ0VfQ0xBU1MpOwotCi0gICAgICAgICAgICAgICAgLy8gSWYgdGhlcmUgd2FzIG5vIGltcGxlbWVudGF0aW9uIGNsYXNzLCB3ZSBzaG91bGQgbm90IGdvIGFueSBmdXJ0aGVyCi0gICAgICAgICAgICAgICAgaWYgKHBhcmFtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKChTdHJpbmcpcGFyYW0uZ2V0VmFsdWUoKSkudHJpbSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3J1bnRpbWUvZGVzY3JpcHRpb24vbWFyc2hhbC9pbXBsL1Byb3BlcnR5RGVzY3JpcHRvck1hcEJ1aWxkZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3J1bnRpbWUvZGVzY3JpcHRpb24vbWFyc2hhbC9pbXBsL1Byb3BlcnR5RGVzY3JpcHRvck1hcEJ1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE1OWQ0Zi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9ydW50aW1lL2Rlc2NyaXB0aW9uL21hcnNoYWwvaW1wbC9Qcm9wZXJ0eURlc2NyaXB0b3JNYXBCdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnJ1bnRpbWUuZGVzY3JpcHRpb24ubWFyc2hhbC5pbXBsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5FeGNlcHRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRW5kcG9pbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5GYXVsdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uT3BlcmF0aW9uRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5TZXJ2aWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5ydW50aW1lLmRlc2NyaXB0aW9uLm1hcnNoYWwuRmF1bHRCZWFuRGVzYzsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnV0aWxpdHkuQ2xhc3NVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnV0aWxpdHkuUHJvcGVydHlEZXNjcmlwdG9yUGx1czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnV0aWxpdHkuWE1MUm9vdEVsZW1lbnRVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIFdhbGtzIHRoZSBTZXJ2aWNlRGVzY3JpcHRpb24gYW5kIGl0cyBjaGlsZCAqRGVzY3JpcHRpb24gY2xhc3NlcyB0byBmaW5kIGFsbCBvZiB0aGUgdHlwZXMuICBBbgotICogQW5ub3RhdGlvbkRlc2MgaXMgYnVpbHQgZm9yIGVhY2ggb2YgdGhlIHR5cGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eURlc2NyaXB0b3JNYXBCdWlsZGVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhQcm9wZXJ0eURlc2NyaXB0b3JNYXBCdWlsZGVyLmNsYXNzKTsKLQotCi0gICAgLyoqIFRoaXMgaXMgYSBzdGF0aWMgdXRpbGl0eSBjbGFzcy4gIFRoZSBjb25zdHJ1Y3RvciBpcyBpbnRlbnRpb25hbGx5IHByaXZhdGUgKi8KLSAgICBwcml2YXRlIFByb3BlcnR5RGVzY3JpcHRvck1hcEJ1aWxkZXIoKSB7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gc2VydmljZURlc2NyaXB0aW9uIFNlcnZpY2VEZXNjcmlwdGlvbgotICAgICAqIEBwYXJhbSBhcCAgICAgICAgICAgICAgICAgQXJ0aWZhY3RQcm9jZXNzb3Igd2hpY2ggZm91bmQgdGhlIGFydGlmYWN0IGNsYXNzZXMKLSAgICAgKiBAcmV0dXJuIFByb3BlcnR5RGVzY3JpcHRvciBNYXAKLSAgICAgKi8KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gc2VydmljZURlc2NyaXB0aW9uIFNlcnZpY2VEZXNjcmlwdGlvbgotICAgICAqIEBwYXJhbSBhcCBBcnRpZmFjdFByb2Nlc3NvciB3aGljaCBmb3VuZCB0aGUgYXJ0aWZhY3QgY2xhc3NlcwotICAgICAqIEByZXR1cm4gUHJvcGVydHlEZXNjcmlwdG9yIE1hcAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTWFwPENsYXNzLE1hcDxTdHJpbmcsIFByb3BlcnR5RGVzY3JpcHRvclBsdXM+PiBnZXRQcm9wZXJ0eURlc2NNYXBzKAotICAgICAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNlcnZpY2VEZXNjLAotICAgICAgICAgICAgQXJ0aWZhY3RQcm9jZXNzb3IgYXApIHsKLSAgICAgICAgTWFwPENsYXNzLE1hcDxTdHJpbmcsIFByb3BlcnR5RGVzY3JpcHRvclBsdXM+PiBtYXAgPSBuZXcgSGFzaE1hcDxDbGFzcyxNYXA8U3RyaW5nLCBQcm9wZXJ0eURlc2NyaXB0b3JQbHVzPj4oKTsKLSAgICAgICAgQ29sbGVjdGlvbjxFbmRwb2ludERlc2NyaXB0aW9uPiBlbmRwb2ludERlc2NzID0gc2VydmljZURlc2MuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbnNfQXNDb2xsZWN0aW9uKCk7Ci0gICAgICAgIAotICAgICAgICAvLyBCdWlsZCBhIHNldCBvZiBwYWNrYWdlcyBmcm9tIGFsbCBvZiB0aGUgZW5kcG9pbnRzCi0gICAgICAgIGlmIChlbmRwb2ludERlc2NzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoRW5kcG9pbnREZXNjcmlwdGlvbiBlZDplbmRwb2ludERlc2NzKSB7Ci0gICAgICAgICAgICAgICAgZ2V0UHJvcGVydHlEZXNjTWFwcyhlZCwgYXAsIG1hcCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1hcDsKLSAgICB9Ci0KLQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGVuZHBvaW50RGVzYwotICAgICAqIEBwYXJhbSBhcCAgICAgICAgICAgQXJ0aWZhY3RQcm9jZXNzb3Igd2hpY2ggZm91bmQgdGhlIGFydGlmYWN0IGNsYXNzZXMKLSAgICAgKiBAcGFyYW0gbWFwCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBnZXRQcm9wZXJ0eURlc2NNYXBzKEVuZHBvaW50RGVzY3JpcHRpb24gZW5kcG9pbnREZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnRpZmFjdFByb2Nlc3NvciBhcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPENsYXNzLCBNYXA8U3RyaW5nLCBQcm9wZXJ0eURlc2NyaXB0b3JQbHVzPj4gbWFwKSB7Ci0gICAgICAgIEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24gZW5kcG9pbnRJbnRlcmZhY2VEZXNjID0KLSAgICAgICAgICAgICAgICBlbmRwb2ludERlc2MuZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbigpOwotICAgICAgICBpZiAoZW5kcG9pbnRJbnRlcmZhY2VEZXNjICE9IG51bGwpIHsKLSAgICAgICAgICAgIGdldFByb3BlcnR5RGVzY01hcHMoZW5kcG9pbnREZXNjLCBlbmRwb2ludEludGVyZmFjZURlc2MsIGFwLCBtYXApOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gZW5kcG9pbnRJbnRlcmZhY2VEZXNjCi0gICAgICogQHBhcmFtIGFwICAgICAgICAgICAgICAgICAgICBBcnRpZmFjdFByb2Nlc3NvciB3aGljaCBmb3VuZCB0aGUgYXJ0aWZhY3QgY2xhc3NlcwotICAgICAqIEBwYXJhbSBtYXAKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGdldFByb3BlcnR5RGVzY01hcHMoRW5kcG9pbnREZXNjcmlwdGlvbiBlbmRwb2ludERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24gZW5kcG9pbnRJbnRlcmZhY2VEZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnRpZmFjdFByb2Nlc3NvciBhcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPENsYXNzLCBNYXA8U3RyaW5nLCBQcm9wZXJ0eURlc2NyaXB0b3JQbHVzPj4gbWFwKSB7Ci0gICAgICAgIE9wZXJhdGlvbkRlc2NyaXB0aW9uW10gb3BEZXNjcyA9IGVuZHBvaW50SW50ZXJmYWNlRGVzYy5nZXRPcGVyYXRpb25zKCk7Ci0KLSAgICAgICAgLy8gQnVpbGQgYSBzZXQgb2YgcGFja2FnZXMgZnJvbSBhbGwgb2YgdGhlIG9wZXJ0aW9ucwotICAgICAgICBpZiAob3BEZXNjcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG9wRGVzY3MubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBnZXRQcm9wZXJ0eURlc2NNYXBzKGVuZHBvaW50RGVzYywgb3BEZXNjc1tpXSwgYXAsIG1hcCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBvcERlc2MKLSAgICAgKiBAcGFyYW0gbWFwCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBnZXRQcm9wZXJ0eURlc2NNYXBzKEVuZHBvaW50RGVzY3JpcHRpb24gZW5kcG9pbnREZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYXRpb25EZXNjcmlwdGlvbiBvcERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFydGlmYWN0UHJvY2Vzc29yIGFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8Q2xhc3MsIE1hcDxTdHJpbmcsIFByb3BlcnR5RGVzY3JpcHRvclBsdXM+PiBtYXApIHsKLQotICAgICAgICAvLyBXYWxrIHRoZSBmYXVsdCBpbmZvcm1hdGlvbgotICAgICAgICBGYXVsdERlc2NyaXB0aW9uW10gZmF1bHREZXNjcyA9IG9wRGVzYy5nZXRGYXVsdERlc2NyaXB0aW9ucygpOwotICAgICAgICBpZiAoZmF1bHREZXNjcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZhdWx0RGVzY3MubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBnZXRQcm9wZXJ0eURlc2NNYXBzKGVuZHBvaW50RGVzYywgZmF1bHREZXNjc1tpXSwgYXAsIG1hcCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBBbHNvIGNvbnNpZGVyIHRoZSByZXF1ZXN0IGFuZCByZXNwb25zZSB3cmFwcGVycwotICAgICAgICBTdHJpbmcgd3JhcHBlck5hbWUgPSBhcC5nZXRSZXF1ZXN0V3JhcHBlck1hcCgpLmdldChvcERlc2MpOwotICAgICAgICBpZiAod3JhcHBlck5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgYWRkUHJvcGVydHlEZXNjKGVuZHBvaW50RGVzYywgd3JhcHBlck5hbWUsIG1hcCk7Ci0gICAgICAgIH0KLSAgICAgICAgd3JhcHBlck5hbWUgPSBhcC5nZXRSZXNwb25zZVdyYXBwZXJNYXAoKS5nZXQob3BEZXNjKTsKLSAgICAgICAgaWYgKHdyYXBwZXJOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIGFkZFByb3BlcnR5RGVzYyhlbmRwb2ludERlc2MsIHdyYXBwZXJOYW1lLCBtYXApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIG9wRGVzYwotICAgICAqIEBwYXJhbSBtYXAKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGdldFByb3BlcnR5RGVzY01hcHMoRW5kcG9pbnREZXNjcmlwdGlvbiBlbmRwb2ludERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZhdWx0RGVzY3JpcHRpb24gZmF1bHREZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnRpZmFjdFByb2Nlc3NvciBhcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPENsYXNzLCBNYXA8U3RyaW5nLCBQcm9wZXJ0eURlc2NyaXB0b3JQbHVzPj4gbWFwKSB7Ci0gICAgICAgIC8vIFRPRE8gVGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciBsZWdhY3kgZXhjZXB0aW9ucyBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgZmF1bHQgYmVhbnMgY291bGQgYmUgY2FjaGVkIGF0IHRoaXMgcG9pbnQuCi0gICAgICAgIFN0cmluZyBmYXVsdERlc2NFeGNlcHRpb25OYW1lID0gZmF1bHREZXNjLmdldEV4Y2VwdGlvbkNsYXNzTmFtZSgpOwotICAgICAgICBDbGFzcyBmYXVsdERlc2NFeGNlcHRpb24gPSBsb2FkQ2xhc3MoZmF1bHREZXNjRXhjZXB0aW9uTmFtZSk7Ci0gICAgICAgIGlmIChmYXVsdERlc2NFeGNlcHRpb24gIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgIChmYXVsdERlc2MuZ2V0RmF1bHRJbmZvKCkgPT0gbnVsbCB8fCBmYXVsdERlc2MuZ2V0RmF1bHRJbmZvKCkubGVuZ3RoKCkgPT0gMCkpIHsKLQotICAgICAgICAgICAgLy8gRm9yIGxlZ2FjeSBleGNlcHRpb25zLCB0aGUgZmF1bHQgYmVhbiBpcyBhICJ3cmFwcGVyIGNsYXNzIiB0aGF0IGhhcyB0aGUgc2FtZSBwcm9wZXJ0aWVzCi0gICAgICAgICAgICAvLyBhcyB0aGUgZXhjZXB0aW9uLiAgVG8gbWFyc2hhbCBhbiBleGNlcHRpb246Ci0gICAgICAgICAgICAvLyAgICAxKSB0aGUgdmFsdWVzIGFyZSBvYnRhaW5lZCBmcm9tIHRoZSBsZWdhY3kgZXhjZXB0aW9uICh1c2luZyB0aGUgZXhjZXB0aW9uJ3MgcHJvcGVydHkgZGVzYyBtYXApCi0gICAgICAgICAgICAvLyAgICAyKSB0aGUgdmFsdWVzIGFyZSBwbGFjZWQgb24gdGhlIGZhdWx0IGJlYW4gKHVzaW5nIHRoZSBiZWFuJ3MgcHJvcGVydHkgZGVzYyBtYXApCi0gICAgICAgICAgICAvLyAgICAzKSB0aGUgYmVhbiBpcyBtYXJzaGFsbGVkLgotICAgICAgICAgICAgLy8gCi0gICAgICAgICAgICAvLyBVbm1hcnNoYWxsaW5nIGlzIG91dHNpZGUgdGhlIHNwZWMsIGJ1dCB3ZSBkbyBwcm92aWRlIHByb3ByaWV0YXJ5IHN1cHBvcnQuCi0gICAgICAgICAgICAvLyBUaGUgYWxnb3JpdGhtIGlzIGJhc2ljYWxseQotICAgICAgICAgICAgLy8gICAgMSkgdW5tYXJzaGFsbCBpbnRvIHRoZSBmYXVsdCBiZWFuCi0gICAgICAgICAgICAvLyAgICAyKSB0aGUgdmFsdWVzIG9uIHRoZSBmYXVsdCBiZWFuIGFyZSBvYnRhaW5lZCAodXNpbmcgdGhlIGJlYW4ncyBwcm9wZXJ0eSBkZXNjIG1hcCkKLSAgICAgICAgICAgIC8vICAgIDMpIHVzZSBoZXVyaXN0aWNzIHRvIGZpbmQgYSBtYXRjaGluZyBjb25zdHJ1Y3RvciBvbiB0aGUgZXhjZXB0aW9uIGNsYXNzLiAgSWYgZm91bmQgaXQgaXMgaW5zdGFudGlhdGVkLgotCi0gICAgICAgICAgICAvLyBUbyBhY2NvbXBsaXNoIHRoZSBhYm92ZSBtYXJzaGFsbGluZyBhbmQgdW5tYXJzaGFsbGluZyB3ZSBuZWVkIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9yIG1hcHMKLSAgICAgICAgICAgIC8vIGZvciB0aGUgZXhjZXB0aW9uIGFuZCB0aGUgYmVhbi4KLSAgICAgICAgICAgIEZhdWx0QmVhbkRlc2MgZmF1bHRCZWFuRGVzYyA9IGFwLmdldEZhdWx0QmVhbkRlc2NNYXAoKS5nZXQoZmF1bHREZXNjKTsKLSAgICAgICAgICAgIFN0cmluZyBmYXVsdERlc2NCZWFuTmFtZSA9IGZhdWx0QmVhbkRlc2MuZ2V0RmF1bHRCZWFuQ2xhc3NOYW1lKCk7Ci0gICAgICAgICAgICBDbGFzcyBmYXVsdERlc2NCZWFuID0gbG9hZENsYXNzKGZhdWx0RGVzY0JlYW5OYW1lKTsKLSAgICAgICAgICAgIGlmIChmYXVsdERlc2NCZWFuICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBhZGRQcm9wZXJ0eURlc2MoZW5kcG9pbnREZXNjLCBmYXVsdERlc2NCZWFuTmFtZSwgbWFwKTsKLSAgICAgICAgICAgICAgICBhZGRQcm9wZXJ0eURlc2MoZW5kcG9pbnREZXNjLCBmYXVsdERlc2NFeGNlcHRpb25OYW1lLCBtYXApOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFkZFByb3BlcnR5RGVzYyhFbmRwb2ludERlc2NyaXB0aW9uIGVuZHBvaW50RGVzYywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNsc05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPENsYXNzLCBNYXA8U3RyaW5nLCBQcm9wZXJ0eURlc2NyaXB0b3JQbHVzPj4gbWFwKSB7Ci0KLSAgICAgICAgQ2xhc3MgY2xzID0gbG9hZENsYXNzKGNsc05hbWUpOwotICAgICAgICBpZiAoY2xzID09IG51bGwpIHsKLSAgICAgICAgICAgIGNscyA9IGxvYWRDbGFzcyhjbHNOYW1lLCBlbmRwb2ludERlc2MuZ2V0QXhpc1NlcnZpY2UoKS5nZXRDbGFzc0xvYWRlcigpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY2xzID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtYXAuZ2V0KGNscykgPT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBQcm9wZXJ0eURlc2NyaXB0b3JQbHVzPiBwZE1hcCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBYTUxSb290RWxlbWVudFV0aWwuY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yTWFwKGNscyk7Ci0gICAgICAgICAgICAgICAgbWFwLnB1dChjbHMsIHBkTWFwKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbih0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIExvYWRzIHRoZSBjbGFzcwotICAgICAqCi0gICAgICogQHBhcmFtIGNsYXNzTmFtZQotICAgICAqIEByZXR1cm4gQ2xhc3MgKG9yIG51bGwgaWYgdGhlIGNsYXNzIGNhbm5vdCBiZSBsb2FkZWQpCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3MgbG9hZENsYXNzKFN0cmluZyBjbGFzc05hbWUpIHsKLSAgICAgICAgLy8gRG9uJ3QgbWFrZSB0aGlzIHB1YmxpYywgaXRzIGEgc2VjdXJpdHkgZXhwb3N1cmUKLSAgICAgICAgaWYgKGNsYXNzTmFtZSA9PSBudWxsIHx8IGNsYXNzTmFtZS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotCi0gICAgICAgICAgICByZXR1cm4gZm9yTmFtZShjbGFzc05hbWUsIHRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRDb250ZXh0Q2xhc3NMb2FkZXIoKSk7Ci0gICAgICAgICAgICAvL0NhdGNoIFRocm93YWJsZSBhcyBDbGFzc0xvYWRlciBjYW4gdGhyb3cgYW4gTm9DbGFzc0RlZkZvdW5kRXJyb3IgdGhhdAotICAgICAgICAgICAgLy9kb2VzIG5vdCBleHRlbmQgRXhjZXB0aW9uLCBzbyBsZXRzIGNhdGNoIGV2ZXJ5dGhpbmcgdGhhdCBleHRlbmRzIFRocm93YWJsZQotICAgICAgICAgICAgLy9yYXRoZXIgdGhhbiBqdXN0IEV4Y2VwdGlvbi4KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLSAgICAgICAgICAgIC8vIFRPRE8gU2hvdWxkIHRoZSBleGNlcHRpb24gYmUgc3dhbGxvd2VkID8KLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiUGFja2FnZVNldEJ1aWxkZXIgY2Fubm90IGxvYWQgdGhlIGZvbGxvd2luZyBjbGFzczoiICsgY2xhc3NOYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMb2FkcyB0aGUgY2xhc3MKLSAgICAgKgotICAgICAqIEBwYXJhbSBjbGFzc05hbWUKLSAgICAgKiBAcmV0dXJuIENsYXNzIChvciBudWxsIGlmIHRoZSBjbGFzcyBjYW5ub3QgYmUgbG9hZGVkKQotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIENsYXNzIGxvYWRDbGFzcyhTdHJpbmcgY2xhc3NOYW1lLCBDbGFzc0xvYWRlciBjbCkgewotICAgICAgICAvLyBEb24ndCBtYWtlIHRoaXMgcHVibGljLCBpdHMgYSBzZWN1cml0eSBleHBvc3VyZQotICAgICAgICBpZiAoY2xhc3NOYW1lID09IG51bGwgfHwgY2xhc3NOYW1lLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0KLSAgICAgICAgICAgIHJldHVybiBmb3JOYW1lKGNsYXNzTmFtZSwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsKTsKLSAgICAgICAgICAgIC8vQ2F0Y2ggVGhyb3dhYmxlIGFzIENsYXNzTG9hZGVyIGNhbiB0aHJvdyBhbiBOb0NsYXNzRGVmRm91bmRFcnJvciB0aGF0Ci0gICAgICAgICAgICAvL2RvZXMgbm90IGV4dGVuZCBFeGNlcHRpb24sIHNvIGxldHMgY2F0Y2ggZXZlcnl0aGluZyB0aGF0IGV4dGVuZHMgVGhyb3dhYmxlCi0gICAgICAgICAgICAvL3JhdGhlciB0aGFuIGp1c3QgRXhjZXB0aW9uLgotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkgewotICAgICAgICAgICAgLy8gVE9ETyBTaG91bGQgdGhlIGV4Y2VwdGlvbiBiZSBzd2FsbG93ZWQgPwotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJQYWNrYWdlU2V0QnVpbGRlciBjYW5ub3QgbG9hZCB0aGUgZm9sbG93aW5nIGNsYXNzOiIgKyBjbGFzc05hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgY2xhc3MgZm9yIHRoaXMgbmFtZQotICAgICAqCi0gICAgICogQHJldHVybiBDbGFzcwotICAgICAqLwotICAgIHN0YXRpYyBDbGFzcyBmb3JOYW1lKGZpbmFsIFN0cmluZyBjbGFzc05hbWUsIGZpbmFsIGJvb2xlYW4gaW5pdGlhbGl6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDbGFzc0xvYWRlciBjbGFzc2xvYWRlcikgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICAvLyBOT1RFOiBUaGlzIG1ldGhvZCBtdXN0IHJlbWFpbiBwcm90ZWN0ZWQgYmVjYXVzZSBpdCB1c2VzIEFjY2Vzc0NvbnRyb2xsZXIKLSAgICAgICAgQ2xhc3MgY2wgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY2wgPSAoQ2xhc3MpQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoCi0gICAgICAgICAgICAgICAgICAgIG5ldyBQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2xhc3MuZm9yTmFtZSBkb2VzIG5vdCBzdXBwb3J0IHByaW1pdGl2ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyBjbHMgPSBDbGFzc1V0aWxzLmdldFByaW1pdGl2ZUNsYXNzKGNsYXNzTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNscyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNscyA9IENsYXNzLmZvck5hbWUoY2xhc3NOYW1lLCBpbml0aWFsaXplLCBjbGFzc2xvYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjbHM7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICk7Ci0gICAgICAgIH0gY2F0Y2ggKFByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJFeGNlcHRpb24gdGhyb3duIGZyb20gQWNjZXNzQ29udHJvbGxlcjogIiArIGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhyb3cgKENsYXNzTm90Rm91bmRFeGNlcHRpb24pZS5nZXRFeGNlcHRpb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjbDsKLSAgICB9Ci0KLSAgICAvKiogQHJldHVybiBDbGFzc0xvYWRlciAqLwotICAgIHN0YXRpYyBDbGFzc0xvYWRlciBnZXRDb250ZXh0Q2xhc3NMb2FkZXIoKSB7Ci0gICAgICAgIC8vIE5PVEU6IFRoaXMgbWV0aG9kIG11c3QgcmVtYWluIHByaXZhdGUgYmVjYXVzZSBpdCB1c2VzIEFjY2Vzc0NvbnRyb2xsZXIKLSAgICAgICAgQ2xhc3NMb2FkZXIgY2wgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY2wgPSAoQ2xhc3NMb2FkZXIpQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoCi0gICAgICAgICAgICAgICAgICAgIG5ldyBQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICk7Ci0gICAgICAgIH0gY2F0Y2ggKFByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJFeGNlcHRpb24gdGhyb3duIGZyb20gQWNjZXNzQ29udHJvbGxlcjogIiArIGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pZS5nZXRFeGNlcHRpb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjbDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zZXJ2ZXIvRW5kcG9pbnRDYWxsYmFjay5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2VydmVyL0VuZHBvaW50Q2FsbGJhY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ5MzU1Zi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zZXJ2ZXIvRW5kcG9pbnRDYWxsYmFjay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2VydmVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk9wZXJhdGlvbkNvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNFbmdpbmU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuRXhjZXB0aW9uRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLk1lc3NhZ2VDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmhhbmRsZXIuSGFuZGxlckNoYWluUHJvY2Vzc29yOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmhhbmRsZXIuSGFuZGxlckludm9jYXRpb25Db250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmhhbmRsZXIuSGFuZGxlckludm9rZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaGFuZGxlci5mYWN0b3J5LkhhbmRsZXJJbnZva2VyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLnV0aWwuTWVzc2FnZVV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnJlZ2lzdHJ5LkZhY3RvcnlSZWdpc3RyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51dGlsLkNvbnN0YW50czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLlRocmVhZENvbnRleHRNaWdyYXRvclV0aWw7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotcHVibGljIGNsYXNzIEVuZHBvaW50Q2FsbGJhY2sgew0KLSAgICANCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEVuZHBvaW50Q2FsbGJhY2suY2xhc3MpOw0KLSAgICANCi0gICAgcHVibGljIHZvaWQgaGFuZGxlUmVzcG9uc2UoRW5kcG9pbnRJbnZvY2F0aW9uQ29udGV4dCBlaWMpIHsNCi0gICAgICAgIE1lc3NhZ2VDb250ZXh0IHJlc3BvbnNlTXNnQ3R4ID0gZWljLmdldFJlc3BvbnNlTWVzc2FnZUNvbnRleHQoKTsNCi0gICAgICAgIG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dCBheGlzUmVzcG9uc2VNc2dDdHggPQ0KLSAgICAgICAgICAgICAgICByZXNwb25zZU1zZ0N0eC5nZXRBeGlzTWVzc2FnZUNvbnRleHQoKTsNCi0NCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgaW52b2tlT3V0Ym91bmRIYW5kbGVyRmxvdyhlaWMpOw0KLSAgICAgICAgICAgIHJlc3BvbnNlUmVhZHkoZWljKTsNCi0gICAgICAgICAgICBNZXNzYWdlVXRpbHMucHV0TWVzc2FnZU9uTWVzc2FnZUNvbnRleHQocmVzcG9uc2VNc2dDdHguZ2V0TWVzc2FnZSgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzUmVzcG9uc2VNc2dDdHgpOw0KLQ0KLSAgICAgICAgICAgIE9wZXJhdGlvbkNvbnRleHQgb3BDdHggPSBheGlzUmVzcG9uc2VNc2dDdHguZ2V0T3BlcmF0aW9uQ29udGV4dCgpOw0KLSAgICAgICAgICAgIG9wQ3R4LmFkZE1lc3NhZ2VDb250ZXh0KGF4aXNSZXNwb25zZU1zZ0N0eCk7ICAgICAgICAgICAgDQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gVGhpcyBhc3N1bWVzIHRoYXQgd2UgYXJlIG9uIHRoZSB1bHRpbWF0ZSBleGVjdXRpb24gdGhyZWFkDQotICAgICAgICAgICAgVGhyZWFkQ29udGV4dE1pZ3JhdG9yVXRpbC5wZXJmb3JtTWlncmF0aW9uVG9Db250ZXh0KENvbnN0YW50cy5USFJFQURfQ09OVEVYVF9NSUdSQVRPUl9MSVNUX0lELA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzUmVzcG9uc2VNc2dDdHgpOw0KLSAgICANCi0gICAgICAgICAgICAvL0NyZWF0ZSB0aGUgQXhpc0VuZ2luZSBmb3IgdGhlIHJlcG9uc2UgYW5kIHNlbmQgaXQuDQotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiU2VuZGluZyBhc3luYyByZXNwb25zZS4iKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgQXhpc0VuZ2luZS5zZW5kKGF4aXNSZXNwb25zZU1zZ0N0eCk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy9UaGlzIGFzc3VtZXMgdGhhdCB3ZSBhcmUgb24gdGhlIHVsdGltYXRlIGV4ZWN1dGlvbiB0aHJlYWQNCi0gICAgICAgICAgICBUaHJlYWRDb250ZXh0TWlncmF0b3JVdGlsLnBlcmZvcm1Db250ZXh0Q2xlYW51cChDb25zdGFudHMuVEhSRUFEX0NPTlRFWFRfTUlHUkFUT1JfTElTVF9JRCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzUmVzcG9uc2VNc2dDdHgpOw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsNCi0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBhdHRlbXB0aW5nIHRvIHNlbmQgdGhlIGFzeW5jIHJlc3BvbnNlLiIpOw0KLSAgICAgICAgICAgICAgICB0LnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBUaHJvd2FibGUgZmF1bHRNZXNzYWdlID0gSW52b2NhdGlvbkhlbHBlci5kZXRlcm1pbmVNYXBwZWRFeGNlcHRpb24odCwgZWljKTsNCi0gICAgICAgICAgICBpZihmYXVsdE1lc3NhZ2UgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICB0ID0gZmF1bHRNZXNzYWdlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlaWMuZ2V0UmVzcG9uc2VNZXNzYWdlQ29udGV4dCgpLnNldENhdXNlZEJ5RXhjZXB0aW9uKEF4aXNGYXVsdC5tYWtlRmF1bHQodCkpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIFRocmVhZENvbnRleHRNaWdyYXRvclV0aWwucGVyZm9ybVRocmVhZENsZWFudXAoQ29uc3RhbnRzLlRIUkVBRF9DT05URVhUX01JR1JBVE9SX0xJU1RfSUQsDQotICAgICAgICAgICAgICAgIGVpYy5nZXRSZXF1ZXN0TWVzc2FnZUNvbnRleHQoKS5nZXRBeGlzTWVzc2FnZUNvbnRleHQoKSk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gRklYTUUgKE5MRyk6IFRoaXMgaXMgcHJvYmFibHkgbm90IHJpZ2h0DQotICAgICAgICAgICAgaGFuZGxlRmF1bHRSZXNwb25zZShlaWMpOw0KLSAgICAgICAgfSANCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIHZvaWQgaGFuZGxlRmF1bHRSZXNwb25zZShFbmRwb2ludEludm9jYXRpb25Db250ZXh0IGVpYykgew0KLSAgICAgICAgTWVzc2FnZUNvbnRleHQgcmVzcG9uc2VNc2dDdHggPSBlaWMuZ2V0UmVzcG9uc2VNZXNzYWdlQ29udGV4dCgpOw0KLSAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0IGF4aXNSZXNwb25zZU1zZ0N0eCA9DQotICAgICAgICAgICAgICAgIHJlc3BvbnNlTXNnQ3R4LmdldEF4aXNNZXNzYWdlQ29udGV4dCgpOw0KLSAgICAgICAgDQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIHJlc3BvbnNlUmVhZHkoZWljKTsNCi0gICAgICAgICAgICBNZXNzYWdlVXRpbHMucHV0TWVzc2FnZU9uTWVzc2FnZUNvbnRleHQocmVzcG9uc2VNc2dDdHguZ2V0TWVzc2FnZSgpLA0KLSAgICAgICAgICAgICAgICBheGlzUmVzcG9uc2VNc2dDdHgpOw0KLQ0KLSAgICAgICAgICAgIE9wZXJhdGlvbkNvbnRleHQgb3BDdHggPSBheGlzUmVzcG9uc2VNc2dDdHguZ2V0T3BlcmF0aW9uQ29udGV4dCgpOw0KLSAgICAgICAgICAgIG9wQ3R4LmFkZE1lc3NhZ2VDb250ZXh0KGF4aXNSZXNwb25zZU1zZ0N0eCk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgVGhyZWFkQ29udGV4dE1pZ3JhdG9yVXRpbC5wZXJmb3JtVGhyZWFkQ2xlYW51cChDb25zdGFudHMuVEhSRUFEX0NPTlRFWFRfTUlHUkFUT1JfTElTVF9JRCwNCi0gICAgICAgICAgICAgICAgZWljLmdldFJlcXVlc3RNZXNzYWdlQ29udGV4dCgpLmdldEF4aXNNZXNzYWdlQ29udGV4dCgpKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvL0NyZWF0ZSB0aGUgQXhpc0VuZ2luZSBmb3IgdGhlIHJlcG9uc2UgYW5kIHNlbmQgaXQuDQotICAgICAgICAgICAgQXhpc0VuZ2luZS5zZW5kRmF1bHQoYXhpc1Jlc3BvbnNlTXNnQ3R4KTsNCi0gICAgICAgICAgICANCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7DQotICAgICAgICAgICAgVGhyb3dhYmxlIGZhdWx0TWVzc2FnZSA9IEludm9jYXRpb25IZWxwZXIuZGV0ZXJtaW5lTWFwcGVkRXhjZXB0aW9uKHQsIGVpYyk7DQotICAgICAgICAgICAgaWYoZmF1bHRNZXNzYWdlICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgdCA9IGZhdWx0TWVzc2FnZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihBeGlzRmF1bHQubWFrZUZhdWx0KHQpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICANCi0gICAgLyoqIA0KLSAgICAgKiBUaGlzIHdpbGwgY2FsbCB0aGUgSW52b2NhdGlvbkxpc3RlbmVyIGluc3RhbmNlcyB0aGF0IHdlcmUgY2FsbGVkIGR1cmluZw0KLSAgICAgKiB0aGUgcmVxdWVzdCBwcm9jZXNzaW5nIGZvciB0aGlzIG1lc3NhZ2UuDQotICAgICAqLw0KLSAgICBwcm90ZWN0ZWQgdm9pZCByZXNwb25zZVJlYWR5KEVuZHBvaW50SW52b2NhdGlvbkNvbnRleHQgZWljKSAgew0KLSAgICAgICAgTGlzdDxJbnZvY2F0aW9uTGlzdGVuZXI+IGxpc3RlbmVyTGlzdCA9IGVpYy5nZXRJbnZvY2F0aW9uTGlzdGVuZXJzKCk7DQotICAgICAgICBpZihsaXN0ZW5lckxpc3QgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIEludm9jYXRpb25MaXN0ZW5lckJlYW4gYmVhbiA9IG5ldyBJbnZvY2F0aW9uTGlzdGVuZXJCZWFuKGVpYywgSW52b2NhdGlvbkxpc3RlbmVyQmVhbi5TdGF0ZS5SRVNQT05TRSk7DQotICAgICAgICAgICAgZm9yKEludm9jYXRpb25MaXN0ZW5lciBsaXN0ZW5lciA6IGxpc3RlbmVyTGlzdCkgew0KLSAgICAgICAgICAgICAgICB0cnkgew0KLSAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIubm90aWZ5KGJlYW4pOyANCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBjYXRjaChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgZHJpdmUgdGhlIGludm9jYXRpb24gb2YgdGhlIG91dGJvdW5kIEpBWC1XUw0KLSAgICAgKiBhcHBsaWNhdGlvbiBoYW5kbGVyIGZsb3cuDQotICAgICAqLw0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbnZva2VPdXRib3VuZEhhbmRsZXJGbG93KEVuZHBvaW50SW52b2NhdGlvbkNvbnRleHQgZWljKSB7DQotICAgICAgICBNZXNzYWdlQ29udGV4dCByZXF1ZXN0ID0gZWljLmdldFJlcXVlc3RNZXNzYWdlQ29udGV4dCgpOw0KLSAgICAgICAgTWVzc2FnZUNvbnRleHQgcmVzcG9uc2UgPSBlaWMuZ2V0UmVzcG9uc2VNZXNzYWdlQ29udGV4dCgpOw0KLSAgICAgICAgaWYgKHJlc3BvbnNlICE9IG51bGwpIHsNCi0gICAgICAgICAgICAvLyBJbnZva2UgdGhlIG91dGJvdW5kIHJlc3BvbnNlIGhhbmRsZXJzLg0KLSAgICAgICAgICAgIC8vIFdlIGNhbiBiZSBzdXJlIHdlIG5lZWQgdG8gaW52b2tlIGFueSBoYW5kbGVycyBiZWNhdXNlIHRoaXMNCi0gICAgICAgICAgICAvLyBjYW5ub3QgYmUgYSBvbmUtd2F5IGZsb3cNCi0gICAgICAgICAgICByZXNwb25zZS5zZXRNRVBDb250ZXh0KHJlcXVlc3QuZ2V0TUVQQ29udGV4dCgpKTsNCi0gICAgICAgICAgICBIYW5kbGVySW52b2NhdGlvbkNvbnRleHQgaGlDb250ZXh0ID0gRW5kcG9pbnRDb250cm9sbGVyLmJ1aWxkSGFuZGxlckludm9jYXRpb25Db250ZXh0KA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LCANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWljLmdldEhhbmRsZXJzKCksIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IuTUVQLlJFU1BPTlNFLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7DQotICAgICAgICAgICAgSGFuZGxlckludm9rZXJGYWN0b3J5IGhpRmFjdG9yeSA9IChIYW5kbGVySW52b2tlckZhY3RvcnkpIA0KLSAgICAgICAgICAgICAgICBGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShIYW5kbGVySW52b2tlckZhY3RvcnkuY2xhc3MpOw0KLSAgICAgICAgICAgIEhhbmRsZXJJbnZva2VyIGhhbmRsZXJJbnZva2VyID0gaGlGYWN0b3J5LmNyZWF0ZUhhbmRsZXJJbnZva2VyKHJlc3BvbnNlKTsNCi0gICAgICAgICAgICBoYW5kbGVySW52b2tlci5pbnZva2VPdXRib3VuZEhhbmRsZXJzKGhpQ29udGV4dCk7DQotICAgICAgICB9IA0KLSAgICB9DQotICAgIA0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zZXJ2ZXIvRW5kcG9pbnRDb250cm9sbGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zZXJ2ZXIvRW5kcG9pbnRDb250cm9sbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2MTcyOTUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2VydmVyL0VuZHBvaW50Q29udHJvbGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzExICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zZXJ2ZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLnV0aWwuU3RBWFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5QYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5XU0RMMkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLkV4Y2VwdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS51dGlsLk1lc3NhZ2VDb250ZXh0VXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5FbmRwb2ludERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaGFuZGxlci5IYW5kbGVyQ2hhaW5Qcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5oYW5kbGVyLkhhbmRsZXJJbnZvY2F0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmhhbmRsZXIuSGFuZGxlckludm9rZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5oYW5kbGVyLkhhbmRsZXJSZXNvbHZlckltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5oYW5kbGVyLkhhbmRsZXJVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmhhbmRsZXIuZmFjdG9yeS5IYW5kbGVySW52b2tlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5oYW5kbGVyLmxpZmVjeWNsZS5mYWN0b3J5LkhhbmRsZXJMaWZlY3ljbGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaGFuZGxlci5saWZlY3ljbGUuZmFjdG9yeS5IYW5kbGVyTGlmZWN5Y2xlTWFuYWdlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5pMThuLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5NZXNzYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5Qcm90b2NvbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZmFjdG9yeS5NZXNzYWdlRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnJlZ2lzdHJ5LkZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNlcnZlci5kaXNwYXRjaGVyLkVuZHBvaW50RGlzcGF0Y2hlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNlcnZlci5kaXNwYXRjaGVyLlByb3ZpZGVyRGlzcGF0Y2hlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNlcnZlci5kaXNwYXRjaGVyLmZhY3RvcnkuRW5kcG9pbnREaXNwYXRjaGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNlcnZlci5lbmRwb2ludC5VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNwaS5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLldTRExDb25zdGFudHMuV1NETDIwXzIwMDRfQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMQ29uc3RhbnRzLldTREwyMF8yMDA2Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5IYW5kbGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLlBvcnRJbmZvOwotCi1pbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBUaGUgRW5kcG9pbnRDb250cm9sbGVyIGlzIHRoZSBzZXJ2ZXIgc2lkZSBlcXVpdmFsZW50IHRvIHRoZSBJbnZvY2F0aW9uQ29udHJvbGxlciBvbiB0aGUgY2xpZW50Ci0gKiBzaWRlLiAgSXQgaXMgYW4gYWJzdHJhY3Rpb24gb2YgdGhlIHNlcnZlciBzaWRlIGVuZHBvaW50IGludm9jYXRpb24gdGhhdCBlbmNhcHN1bGF0ZXMgYWxsIG9mIHRoZQotICogQXhpczIgc2VtYW50aWNzLgotICogPHAvPgotICogTGlrZSB0aGUgSW52b2NhdGlvbkNvbnRyb2xsZXIsIHRoaXMgY2xhc3MgaXMgcmVzcG9uc2libGUgZm9yIGludm9raW5nIHRoZSBKQVgtV1MgYXBwbGljYXRpb24KLSAqIGhhbmRsZXIgY2hhaW4gYWxvbmcgd2l0aCB0YWtpbmcgYWxsIG9mIHRoZSBwcm92aWRlZCBpbmZvcm1hdGlvbiBhbmQgc2V0dGluZyB1cCB3aGF0J3MgbmVlZGVkIHRvCi0gKiBwZXJmb3JtIHRoZSBhY3R1YWwgaW52b2NhdGlvbiBvZiB0aGUgZW5kcG9pbnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBFbmRwb2ludENvbnRyb2xsZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEVuZHBvaW50Q29udHJvbGxlci5jbGFzcyk7Ci0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gc3RhcnQgdGhlIEpBWC1XUyBpbnZvY2F0aW9uIG9mIGEgdGFyZ2V0IGVuZHBvaW50LiBJdCB0YWtlcyBhbgotICAgICAqIEludm9jYXRpb25Db250ZXh0LCB3aGljaCBtdXN0IGhhdmUgYSBNZXNzYWdlQ29udGV4dCBzcGVjaWVkIGZvciB0aGUgcmVxdWVzdC4gIE9uY2UgdGhlCi0gICAgICogaW52b2NhdGlvbiBpcyBjb21wbGV0ZSwgdGhlIGluZm9ybWF0aW9uIHdpbGwgYmUgc3RvcmVkCi0gICAgICogCi0gICAgICogQHBhcmFtIGVpYwotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgRW5kcG9pbnRJbnZvY2F0aW9uQ29udGV4dCBpbnZva2UoRW5kcG9pbnRJbnZvY2F0aW9uQ29udGV4dCBlaWMpIHRocm93cyBBeGlzRmF1bHQsIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiSW52b2NhdGlvbiBwYXR0ZXJuOiBzeW5jaHJvbm91cyIpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBNZXNzYWdlQ29udGV4dCByZXF1ZXN0ID0gZWljLmdldFJlcXVlc3RNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBib29sZWFuIGdvb2QgPSB0cnVlOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZ29vZCA9IGhhbmRsZVJlcXVlc3QoZWljKTsKLQotICAgICAgICAgICAgaWYgKCFnb29kKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVpYzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE1lc3NhZ2VDb250ZXh0IHJlc3BvbnNlID0gbnVsbDsKLSAgICAgICAgICAgIEVuZHBvaW50RGlzcGF0Y2hlciBkaXNwYXRjaGVyID0gZWljLmdldERpc3BhdGNoZXIoKTsKLSAgICAgICAgICAgIGlmIChyZXF1ZXN0ICE9IG51bGwgJiYgZGlzcGF0Y2hlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBkaXNwYXRjaGVyLmludm9rZShyZXF1ZXN0KTsgICAgCi0gICAgICAgICAgICAgICAgZWljLnNldFJlc3BvbnNlTWVzc2FnZUNvbnRleHQocmVzcG9uc2UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJpbnZva2VFcnIiKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBhZikgewotICAgICAgICAgICAgdGhyb3cgYWY7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBUaHJvd2FibGUgdG9CZVRocm93biA9IEludm9jYXRpb25IZWxwZXIuZGV0ZXJtaW5lTWFwcGVkRXhjZXB0aW9uKGUsIGVpYyk7Ci0gICAgICAgICAgICBpZih0b0JlVGhyb3duID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0b0JlVGhyb3duID0gZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24odG9CZVRocm93bik7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoZ29vZCkgewotICAgICAgICAgICAgICAgIC8vIFBhc3NlZCBwaXZvdCBwb2ludAotICAgICAgICAgICAgICAgIHJlcXVlc3QuZ2V0TWVzc2FnZSgpLnNldFBvc3RQaXZvdCgpOwotICAgICAgICAgICAgICAgIGhhbmRsZVJlc3BvbnNlKGVpYyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGRlc3Ryb3lIYW5kbGVycyhlaWMsIHJlcXVlc3QpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gZWljOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBpbnZva2VBc3luYyhFbmRwb2ludEludm9jYXRpb25Db250ZXh0IGVpYykgewotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiSW52b2NhdGlvbiBwYXR0ZXJuOiBhc3luY2hyb25vdXMiKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgTWVzc2FnZUNvbnRleHQgcmVxdWVzdCA9IGVpYy5nZXRSZXF1ZXN0TWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJvb2xlYW4gZ29vZCA9IGhhbmRsZVJlcXVlc3QoZWljKTsKLQotICAgICAgICAgICAgaWYgKCFnb29kKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgRW5kcG9pbnREaXNwYXRjaGVyIGRpc3BhdGNoZXIgPSBlaWMuZ2V0RGlzcGF0Y2hlcigpOwotICAgICAgICAgICAgaWYgKHJlcXVlc3QgIT0gbnVsbCAmJiBkaXNwYXRjaGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBkaXNwYXRjaGVyLmludm9rZUFzeW5jKHJlcXVlc3QsIGVpYy5nZXRDYWxsYmFjaygpKTsgICAgCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoImludm9rZUVyciIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIFRocm93YWJsZSB0b0JlVGhyb3duID0gSW52b2NhdGlvbkhlbHBlci5kZXRlcm1pbmVNYXBwZWRFeGNlcHRpb24oZSwgZWljKTsKLSAgICAgICAgICAgIGlmKHRvQmVUaHJvd24gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRvQmVUaHJvd24gPSBlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbih0b0JlVGhyb3duKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIC8vIEZJWE1FIChOTEcpOiBQcm9iYWJseSBuZWVkIHRvIHJldmlzaXQgdGhpcyBsb2NhdGlvbi4gIFNob3VsZCBpdCBiZSBtb3ZlZCBkb3duPwotICAgICAgICAgICAgLy8gUGFzc2VkIHBpdm90IHBvaW50Ci0gICAgICAgICAgICByZXF1ZXN0LmdldE1lc3NhZ2UoKS5zZXRQb3N0UGl2b3QoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBpbnZva2VPbmVXYXkoRW5kcG9pbnRJbnZvY2F0aW9uQ29udGV4dCBlaWMpIHsKLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIkludm9jYXRpb24gcGF0dGVybjogb25lLXdheSIpOwotICAgICAgICB9Ci0gICAgCi0KLSAgICAgICAgTWVzc2FnZUNvbnRleHQgcmVxdWVzdCA9IGVpYy5nZXRSZXF1ZXN0TWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJvb2xlYW4gZ29vZCA9IGhhbmRsZVJlcXVlc3QoZWljKTsKLQotICAgICAgICAgICAgaWYgKCFnb29kKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgRW5kcG9pbnREaXNwYXRjaGVyIGRpc3BhdGNoZXIgPSBlaWMuZ2V0RGlzcGF0Y2hlcigpOwotICAgICAgICAgICAgaWYgKHJlcXVlc3QgIT0gbnVsbCAmJiBkaXNwYXRjaGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBkaXNwYXRjaGVyLmludm9rZU9uZVdheShyZXF1ZXN0KTsgICAgCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoImludm9rZUVyciIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIFRocm93YWJsZSB0b0JlVGhyb3duID0gSW52b2NhdGlvbkhlbHBlci5kZXRlcm1pbmVNYXBwZWRFeGNlcHRpb24oZSwgZWljKTsKLSAgICAgICAgICAgIGlmKHRvQmVUaHJvd24gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRvQmVUaHJvd24gPSBlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbih0b0JlVGhyb3duKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIC8vIFBhc3NlZCBwaXZvdCBwb2ludAotICAgICAgICAgICAgcmVxdWVzdC5nZXRNZXNzYWdlKCkuc2V0UG9zdFBpdm90KCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaGFuZGxlUmVxdWVzdChFbmRwb2ludEludm9jYXRpb25Db250ZXh0IGVpYykgdGhyb3dzIEF4aXNGYXVsdCwgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIAotICAgICAgICBNZXNzYWdlQ29udGV4dCByZXNwb25zZU1zZ0NvbnRleHQgPSBudWxsOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXF1ZXN0UmVjZWl2ZWQoZWljKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgTWVzc2FnZUNvbnRleHQgcmVxdWVzdCA9IGVpYy5nZXRSZXF1ZXN0TWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgQ2xhc3Mgc2VydmljZUVuZHBvaW50ID0gZ2V0U2VydmljZUltcGxlbWVudGF0aW9uKHJlcXVlc3QpOwotICAgICAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlbmRwb2ludERlc2MgPSBnZXRFbmRwb2ludERlc2NyaXB0aW9uKHJlcXVlc3QpOwotICAgICAgICAgICAgcmVxdWVzdC5zZXRFbmRwb2ludERlc2NyaXB0aW9uKGVuZHBvaW50RGVzYyk7Ci0gICAgICAgICAgIAotICAgICAgICAgICAgLy8gIFRPRE86IHJldmlldzogbWFrZSBzdXJlIHRoZSBoYW5kbGVycyBhcmUgc2V0IG9uIHRoZSBJbnZvY2F0aW9uQ29udGV4dAotICAgICAgICAgICAgLy8gIFRoaXMgaW1wbGVtZW50YXRpb24gb2YgdGhlIEpBWFdTIHJ1bnRpbWUgZG9lcyBub3QgdXNlIEVuZHBvaW50LCB3aGljaAotICAgICAgICAgICAgLy8gIHdvdWxkIG5vcm1hbGx5IGJlIHRoZSBwbGFjZSB0byBpbml0aWFsaXplIGFuZCBzdG9yZSB0aGUgaGFuZGxlciBsaXN0LgotICAgICAgICAgICAgLy8gIEluIGxpZXUgb2YgdGhhdCwgd2Ugd2lsbCBoYXZlIHRvIGludGlhbGl6ZSBhbmQgc3RvcmUgdGhlbSBvbiB0aGUgCi0gICAgICAgICAgICAvLyAgSW52b2NhdGlvbkNvbnRleHQuICBhbHNvIHNlZSB0aGUgSW52b2NhdGlvbkNvbnRleHRGYWN0b3J5LiAgT24gdGhlIGNsaWVudAotICAgICAgICAgICAgLy8gIHNpZGUsIHRoZSBiaW5kaW5nIGlzIG5vdCB5ZXQgc2V0IHdoZW4gd2UgY2FsbCBpbnRvIHRoYXQgZmFjdG9yeSwgc28gdGhlCi0gICAgICAgICAgICAvLyAgaGFuZGxlciBsaXN0IGRvZXNuJ3QgZ2V0IHNldCBvbiB0aGUgSW52b2NhdGlvbkNvbnRleHQgb2JqZWN0IHRoZXJlLiAgVGh1cwotICAgICAgICAgICAgLy8gIHdlIGdvdHRhIGRvIGl0IGhlcmUuCi0gICAgICAgICAgICAvLyAgCi0gICAgICAgICAgICAvLyAgU2luY2Ugd2UncmUgb24gdGhlIHNlcnZlciwgYW5kIHRoZXJlIGFwcGFyZW50bHkgaXMgbm8gQmluZGluZyBvYmplY3QKLSAgICAgICAgICAgIC8vICBhbnl3aGVyZSB0byBiZSBmb3VuZC4uLgotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IGhhbmRsZXJSb2xlcyA9IG51bGw7Ci0gICAgICAgICAgICBpZiAoZWljLmdldEhhbmRsZXJzKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIk5vIGhhbmRsZXJzIGZvdW5kIG9uIHRoZSBJbnZvY2F0aW9uQ29udGV4dCwgaW5pdGlhbGl6aW5nIGhhbmRsZXIgbGlzdC4iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgSGFuZGxlclJlc29sdmVySW1wbCBocmkgPSBuZXcgSGFuZGxlclJlc29sdmVySW1wbChlbmRwb2ludERlc2MuZ2V0U2VydmljZURlc2NyaXB0aW9uKCkpOwotICAgICAgICAgICAgICAgIFBvcnRJbmZvIHBvcnRJbmZvID0gZW5kcG9pbnREZXNjLmdldFBvcnRJbmZvKCk7Ci0gICAgICAgICAgICAgICAgZWljLnNldEhhbmRsZXJzKGhyaS5nZXRIYW5kbGVyQ2hhaW4ocG9ydEluZm8pKTsKLSAgICAgICAgICAgICAgICBoYW5kbGVyUm9sZXMgPSBocmkuZ2V0Um9sZXMocG9ydEluZm8pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyAgR2V0IHRoZSBzZXJ2aWNlIGluc3RhbmNlLiAgVGhpcyB3aWxsIHJ1biB0aGUgQFBvc3RDb25zdHJ1Y3QgY29kZS4KLSAgICAgICAgICAgIFNlcnZpY2VJbnN0YW5jZUZhY3RvcnkgaW5zdGFuY2VGYWN0b3J5ID0gKFNlcnZpY2VJbnN0YW5jZUZhY3RvcnkpIAotICAgICAgICAgICAgICAgIEZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KFNlcnZpY2VJbnN0YW5jZUZhY3RvcnkuY2xhc3MpOwotICAgICAgICAgICAgT2JqZWN0IHNlcnZpY2VJbnN0YW5jZSA9IGluc3RhbmNlRmFjdG9yeS5jcmVhdGVTZXJ2aWNlSW5zdGFuY2UocmVxdWVzdCwgc2VydmljZUVuZHBvaW50KTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gVGhlIGFwcGxpY2F0aW9uIGhhbmRsZXJzIGFuZCBkaXNwYXRjaGVyIGludm9rZSB3aWxsIAotICAgICAgICAgICAgLy8gbW9kaWZ5L2Rlc3Ryb3kgcGFydHMgb2YgdGhlIG1lc3NhZ2UuICBNYWtlIHN1cmUgdG8gc2F2ZQotICAgICAgICAgICAgLy8gdGhlIHJlcXVlc3QgbWVzc2FnZSBpZiBhcHByb3ByaWF0ZS4KLSAgICAgICAgICAgIHNhdmVSZXF1ZXN0TWVzc2FnZShyZXF1ZXN0KTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgYm9vbGVhbiBzdWNjZXNzID0gdHJ1ZTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gUGVyZm9ybSBpbmJvdW5kIGhlYWRlci9oYW5kbGVyIHByb2Nlc3Npbmcgb25seSBpZiB0aGVyZSBpcyBhcmUgaGVhZGVycyBPUiBoYW5kbGVycwotICAgICAgICAgICAgaWYgKCAocmVxdWVzdC5nZXRBeGlzTWVzc2FnZUNvbnRleHQoKSAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgIHJlcXVlc3QuZ2V0QXhpc01lc3NhZ2VDb250ZXh0KCkuZ2V0RW52ZWxvcGUoKS5nZXRIZWFkZXIoKSAhPSBudWxsKSB8fAotICAgICAgICAgICAgICAgICAoZWljLmdldEhhbmRsZXJzKCkgIT0gbnVsbCAmJiAhZWljLmdldEhhbmRsZXJzKCkuaXNFbXB0eSgpKSkgewotICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSBpbmJvdW5kSGVhZGVyQW5kSGFuZGxlclByb2Nlc3NpbmcocmVxdWVzdCwgZWljLCBoYW5kbGVyUm9sZXMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoc3VjY2VzcykgewotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkpBWC1XUyBpbmJvdW5kIGhhbmRsZXIgY2hhaW4gaW52b2NhdGlvbiBjb21wbGV0ZS4iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gU2V0IHRoZSBkaXNwYXRjaGVyLgotICAgICAgICAgICAgICAgIEVuZHBvaW50RGlzcGF0Y2hlciBkaXNwYXRjaGVyID0gZ2V0RW5kcG9pbnREaXNwYXRjaGVyKHJlcXVlc3QsIHNlcnZpY2VFbmRwb2ludCwgc2VydmljZUluc3RhbmNlKTsKLSAgICAgICAgICAgICAgICBCb29sZWFuIGlnbm9yZVNPQVBWZXJzaW9uID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgaWYobG9nLmlzRGVidWdFbmFibGVkKCkpewotICAgICAgICAgICAgICAgIAlsb2cuZGVidWcoIkNoZWNraW5nIGZvciBQcm92aWRlckRpc3BhdGNoZXIgaW5zdGFuY2UiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYoZGlzcGF0Y2hlciBpbnN0YW5jZW9mIFByb3ZpZGVyRGlzcGF0Y2hlcil7Ci0gICAgICAgICAgICAgICAgCWlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKXsKLSAgICAgICAgICAgICAgICAJCWxvZy5kZWJ1ZygiUHJvdmlkZXJEaXNwYXRjaGVyIGluc3RhbmNlIEZvdW5kIik7Ci0gICAgICAgICAgICAgICAgCX0KLSAgICAgICAgICAgICAgICAJU3RyaW5nIGJpbmRpbmdUeXBlID0gZW5kcG9pbnREZXNjLmdldEJpbmRpbmdUeXBlKCk7Ci0gICAgICAgICAgICAgICAgCWlmKGJpbmRpbmdUeXBlLmVxdWFscyhvcmcuYXBhY2hlLmF4aXMyLmpheHdzLkNvbnN0YW50cy5TT0FQX0hUVFBfQklORElORykpewotICAgICAgICAgICAgICAgIAkJaWdub3JlU09BUFZlcnNpb24gPSB0cnVlOwotICAgICAgICAgICAgICAgIAl9ICAgCi0gICAgICAgICAgICAgICAgCWlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKXsKLSAgICAgICAgICAgICAgICAJCWxvZy5kZWJ1ZygiaWdub3JlU09BUFZlcnNpb24gVmFsdWUgPSIraWdub3JlU09BUFZlcnNpb24uYm9vbGVhblZhbHVlKCkpOwotICAgICAgICAgICAgICAgIAl9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vTmVlZCB0byBtYWtlIHN1cmUgdGhlIHByb3RvY29sIChlbnZlbG9wZSBucykgIG9mIHRoZSByZXF1ZXN0IG1hdGNoZXMgdGhlIGJpbmRpbmcKLSAgICAgICAgICAgICAgICAvLyBleHBlY3RlZCBieSB0aGUgc2VydmljZSBkZXNjcmlwdGlvbgotICAgICAgICAgICAgICAgIGlmICghaWdub3JlU09BUFZlcnNpb24gJiYgIVV0aWxzLmJpbmRpbmdUeXBlc01hdGNoKHJlcXVlc3QsIGVuZHBvaW50RGVzYykpIHsKLSAgICAgICAgICAgICAgICAJUHJvdG9jb2wgcHJvdG9jb2wgPSByZXF1ZXN0LmdldE1lc3NhZ2UoKS5nZXRQcm90b2NvbCgpOwotICAgICAgICAgICAgICAgIAlNZXNzYWdlQ29udGV4dCBmYXVsdENvbnRleHQgPSBVdGlscy5jcmVhdGVWZXJzaW9uTWlzbWF0Y2hNZXNzYWdlKHJlcXVlc3QsIHByb3RvY29sKTsKLSAgICAgICAgICAgICAgICAJZWljLnNldFJlc3BvbnNlTWVzc2FnZUNvbnRleHQoZmF1bHRDb250ZXh0KTsKLSAgICAgICAgICAgICAgICAJcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBlaWMuc2V0RW5kcG9pbnREaXNwYXRjaGVyKGRpc3BhdGNoZXIpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIHsgLy8gdGhlIGluYm91bmQgaGFuZGxlciBjaGFpbiBtdXN0IGhhdmUgaGFkIGEgcHJvYmxlbSwgYW5kIHdlJ3ZlIHJldmVyc2VkIGRpcmVjdGlvbnMKLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJKQVgtV1MgaW5ib3VuZCBoYW5kbGVyIGNoYWluIGludm9jYXRpb24gY29tcGxldGVkIHdpdGggZXJyb3JzLiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXNwb25zZU1zZ0NvbnRleHQgPQotICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUNvbnRleHRVdGlscy5jcmVhdGVSZXNwb25zZU1lc3NhZ2VDb250ZXh0KHJlcXVlc3QpOwotICAgICAgICAgICAgICAgIC8vIHNpbmNlIHdlJ3ZlIHJldmVyc2VkIGRpcmVjdGlvbnMsIHRoZSBtZXNzYWdlIGhhcyAiYmVjb21lIGEgcmVzcG9uc2UgbWVzc2FnZSIgKHNlY3Rpb24gOS4zLjIuMSwgZm9vdG5vdGUgc3VwZXJzY3JpcHQgMikKLSAgICAgICAgICAgICAgICByZXNwb25zZU1zZ0NvbnRleHQuc2V0TWVzc2FnZShyZXF1ZXN0LmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgZWljLnNldFJlc3BvbnNlTWVzc2FnZUNvbnRleHQocmVzcG9uc2VNc2dDb250ZXh0KTsKLSAgICAgICAgICAgICAgICByZXNwb25zZVJlYWR5KGVpYyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgYWYpIHsKLSAgICAgICAgICAgIHRocm93IGFmOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gVE9ETyBmb3Igbm93LCB0aHJvdyBpdC4gIFdlIHByb2JhYmx5IHNob3VsZCB0cnkgdG8gbWFrZSBhbiBYTUxGYXVsdCBvYmplY3QgYW5kIHNldCBpdCBvbiB0aGUgbWVzc2FnZQotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSAKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUGVyZm9ybSBpbmJvdW5kIEhhbmRsZXIgYW5kIEhlYWRlciBwcm9jZXNzaW5nCi0gICAgICogVGhpcyBpbmNsdWRlcyB0aGUgbXVzdCB1bmRlcnN0YW5kIGNoZWNraW5nIGFuZAotICAgICAqIGludm9raW5nIHRoZSBpbmJvdW5kIGhhbmRsZXIgY2hhaW4KLSAgICAgKiBAcGFyYW0gcmVxdWVzdAotICAgICAqIEBwYXJhbSBlaWMKLSAgICAgKiBAcGFyYW0gaGFuZGxlclJvbGVzCi0gICAgICogQHJldHVybgotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0Ci0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGluYm91bmRIZWFkZXJBbmRIYW5kbGVyUHJvY2Vzc2luZyhNZXNzYWdlQ29udGV4dCByZXF1ZXN0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW5kcG9pbnRJbnZvY2F0aW9uQ29udGV4dCBlaWMsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PFN0cmluZz4gaGFuZGxlclJvbGVzKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgLy9MZXRzIEluaXRpYWxpemUgdGhlIHVuZGVyc3Rvb2QgUU5hbWUgaGVyZSwgYWRkIG9ubHkgdGhlIGhlYWRlcnMgdGhhdCB0aGUgaGFuZGxlciAKLSAgICAgICAgLy9pbmplY3RzIHdoZW4gd2UgaW52b2tlIHRoZSBnZXRIZWFkZXIoKS4KLSAgICAgICAgLy9TaW5jZSB3ZSBhcmUgYWRkaW5nIHRoZSBoYW5kbGVycyB0byBkZXNjcmlwdGlvbiBsYXllciBoZXJlIHdlIHdpbGwgcmVnaXN0ZXIgYWxsIHRoZQotICAgICAgICAvL2hlYWRlcnMgc2V0IGJ5IFNPQVBIYW5kbGVyLT5nZXRIZWFkZXIoKS4KLSAgICAgICAgIExpc3Q8UU5hbWU+IHVuZGVyc3Rvb2QgPQotICAgICAgICAgICAgIEhhbmRsZXJVdGlscy5yZWdpc3RlclNPQVBIYW5kbGVySGVhZGVycyhyZXF1ZXN0LmdldEF4aXNNZXNzYWdlQ29udGV4dCgpLCBlaWMuZ2V0SGFuZGxlcnMoKSk7Ci0KLSAgICAgICAgLy9BcyBwZXIgc2VjdGlvbiAxMC4yLjEgb2YgSkFYV1MgU3BlY2lmaWNhdGlvbiwgcGVyZm9ybSBhIG11c3RVbmRlcnN0YW5kIHByb2Nlc3NpbmcgYmVmb3JlCi0gICAgICAgIC8vaW52b2tpbmcgaW5ib3VuZCBoYW5kbGVycy4KLSAgICAgICAgSGFuZGxlclV0aWxzLmNoZWNrTXVzdFVuZGVyc3RhbmQocmVxdWVzdC5nZXRBeGlzTWVzc2FnZUNvbnRleHQoKSwgdW5kZXJzdG9vZCwgaGFuZGxlclJvbGVzKTsKLQotICAgICAgICAvLyBJbnZva2UgaW5ib3VuZCBhcHBsaWNhdGlvbiBoYW5kbGVycy4gIEl0J3Mgc2FmZSB0byB1c2UgdGhlIGZpcnN0IG9iamVjdCBvbiB0aGUgaXRlcmF0b3IgYmVjYXVzZSB0aGVyZSBpcwotICAgICAgICAvLyBhbHdheXMgZXhhY3RseSBvbmUgRW5kcG9pbnREZXNjcmlwdGlvbiBvbiBhIHNlcnZlciBpbnZva2UKLSAgICAgICAgSGFuZGxlckludm9jYXRpb25Db250ZXh0IGhpQ29udGV4dCA9IGJ1aWxkSGFuZGxlckludm9jYXRpb25Db250ZXh0KHJlcXVlc3QsIGVpYy5nZXRIYW5kbGVycygpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZXJDaGFpblByb2Nlc3Nvci5NRVAuUkVRVUVTVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzT25lV2F5KHJlcXVlc3QuZ2V0QXhpc01lc3NhZ2VDb250ZXh0KCkpKTsKLSAgICAgICAgSGFuZGxlckludm9rZXJGYWN0b3J5IGhpRmFjdG9yeSA9IChIYW5kbGVySW52b2tlckZhY3RvcnkpIAotICAgICAgICBGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShIYW5kbGVySW52b2tlckZhY3RvcnkuY2xhc3MpOwotICAgICAgICBIYW5kbGVySW52b2tlciBoYW5kbGVySW52b2tlciA9IGhpRmFjdG9yeS5jcmVhdGVIYW5kbGVySW52b2tlcihyZXF1ZXN0KTsKLSAgICAgICAgYm9vbGVhbiBzdWNjZXNzID0gaGFuZGxlckludm9rZXIuaW52b2tlSW5ib3VuZEhhbmRsZXJzKGhpQ29udGV4dCk7Ci0KLSAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7Ci0gICAgICAgIAotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBoYW5kbGVSZXNwb25zZShFbmRwb2ludEludm9jYXRpb25Db250ZXh0IGVpYykgewotICAgICAgICBNZXNzYWdlQ29udGV4dCByZXF1ZXN0ID0gZWljLmdldFJlcXVlc3RNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBNZXNzYWdlQ29udGV4dCByZXNwb25zZSA9IGVpYy5nZXRSZXNwb25zZU1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIAotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKHJlc3BvbnNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIAkvL0JlZm9yZSBydW5uaW5nIGluYm91bmQgaGFuZGxlcnMgbGV0cyBtYWtlIHN1cmUgdGhhdCB0aGUgcmVxdWVzdCBhbmQgcmVzcG9uc2UgaGF2ZSBubyBwcm90b2NvbCBtaXNtYXRjaC4KLSAgICAgICAgICAgIAlFbmRwb2ludERlc2NyaXB0aW9uIGVuZHBvaW50RGVzYyA9cmVxdWVzdC5nZXRFbmRwb2ludERlc2NyaXB0aW9uKCk7Ci0gICAgICAgICAgICAJU3RyaW5nIGJpbmRpbmdUeXBlID0gZW5kcG9pbnREZXNjLmdldEJpbmRpbmdUeXBlKCk7Ci0gICAgICAgICAgICAJaWYoYmluZGluZ1R5cGUuZXF1YWxzKG9yZy5hcGFjaGUuYXhpczIuamF4d3MuQ29uc3RhbnRzLlNPQVBfSFRUUF9CSU5ESU5HKSl7Ci0gICAgICAgICAgICAJCWlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKXsKLSAgICAgICAgICAgIAkJCWxvZy5kZWJ1ZygiQ2hlY2sgZm9yIHByb3RvY29sIG1pc21hdGNoIik7Ci0gICAgICAgICAgICAJCX0KLSAgICAgICAgICAgIAkJTWVzc2FnZUNvbnRleHQgZmF1bHRDb250ZXh0ID0gaXNQcm90b2NvbE1pc21hdGNoKHJlcXVlc3QsIHJlc3BvbnNlKTsKLSAgICAgICAgICAgIAkJaWYoZmF1bHRDb250ZXh0IT1udWxsKXsKLSAgICAgICAgICAgIAkJCWlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKXsKLSAgICAgICAgICAgIAkJCQlsb2cuZGVidWcoIlRoZXJlIGlzIGEgcHJvdG9jb2wgbWlzbWF0Y2gsIGdlbmVyYXRpbmcgZmF1bHQgbWVzc2FnZSIpOwotICAgICAgICAgICAgCQkJfQotICAgICAgICAgICAgCQkJZWljLnNldFJlc3BvbnNlTWVzc2FnZUNvbnRleHQoZmF1bHRDb250ZXh0KTsKLSAgICAgICAgICAgIAkJCXJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIAkJfQotICAgICAgICAgICAgCQlpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSl7Ci0gICAgICAgICAgICAJCQlsb2cuZGVidWcoIlRoZXJlIGlzIG5vIHByb3RvY29sIG1pc21hdGNoIik7Ci0gICAgICAgICAgICAJCX0KLSAgICAgICAgICAgIAl9Ci0gICAgICAgICAgICAgICAvLyBJbnZva2UgdGhlIG91dGJvdW5kIHJlc3BvbnNlIGhhbmRsZXJzLgotICAgICAgICAgICAgICAgLy8gSWYgdGhlIG1lc3NhZ2UgaXMgb25lIHdheSwgd2Ugc2hvdWxkIG5vdCBpbnZva2UgdGhlIHJlc3BvbnNlIGhhbmRsZXJzLiAgVGhlcmUgaXMgbm8gcmVzcG9uc2UKLSAgICAgICAgICAgICAgIC8vIE1lc3NhZ2VDb250ZXh0IHNpbmNlIGEgb25lIHdheSBpbnZvY2F0aW9uIGlzIGNvbnNpZGVyZWQgdG8gaGF2ZSBhICJ2b2lkIiByZXR1cm4uCi0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIGlmICghaXNPbmVXYXkocmVxdWVzdC5nZXRBeGlzTWVzc2FnZUNvbnRleHQoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2V0TUVQQ29udGV4dChyZXF1ZXN0LmdldE1FUENvbnRleHQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBIYW5kbGVySW52b2NhdGlvbkNvbnRleHQgaGlDb250ZXh0ID0gYnVpbGRIYW5kbGVySW52b2NhdGlvbkNvbnRleHQocmVxdWVzdCwgZWljLmdldEhhbmRsZXJzKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlckNoYWluUHJvY2Vzc29yLk1FUC5SRVNQT05TRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgSGFuZGxlckludm9rZXJGYWN0b3J5IGhpRmFjdG9yeSA9IChIYW5kbGVySW52b2tlckZhY3RvcnkpIAotICAgICAgICAgICAgICAgICAgICAgICAgRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoSGFuZGxlckludm9rZXJGYWN0b3J5LmNsYXNzKTsKLSAgICAgICAgICAgICAgICAgICAgSGFuZGxlckludm9rZXIgaGFuZGxlckludm9rZXIgPSBoaUZhY3RvcnkuY3JlYXRlSGFuZGxlckludm9rZXIocmVzcG9uc2UpOwotICAgICAgICAgICAgICAgICAgICBoYW5kbGVySW52b2tlci5pbnZva2VPdXRib3VuZEhhbmRsZXJzKGhpQ29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgfQotICAgICAgICAgICB9IAotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gVE9ETyBmb3Igbm93LCB0aHJvdyBpdC4gIFdlIHByb2JhYmx5IHNob3VsZCB0cnkgdG8gbWFrZSBhbiBYTUxGYXVsdCBvYmplY3QgYW5kIHNldCBpdCBvbiB0aGUgbWVzc2FnZQotICAgICAgICAgICAgVGhyb3dhYmxlIHRvQmVUaHJvd24gPSBJbnZvY2F0aW9uSGVscGVyLmRldGVybWluZU1hcHBlZEV4Y2VwdGlvbihlLCBlaWMpOwotICAgICAgICAgICAgaWYodG9CZVRocm93biA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdG9CZVRocm93biA9IGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKHRvQmVUaHJvd24pOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAJLy8gYXQgdGhpcyBwb2ludCwgd2UgYXJlIGRvbmUgd2l0aCBoYW5kbGVyIGluc3RhbmNlcyBvbiB0aGUgc2VydmVyOyBjYWxsIEBQcmVEZXN0cm95IG9uIGFsbCBvZiB0aGVtCi0gICAgICAgICAgICBkZXN0cm95SGFuZGxlcnMoZWljLCByZXF1ZXN0KTsKLSAgICAgICAgICAgIHJlc3BvbnNlUmVhZHkoZWljKTsKLSAgICAgICAgICAgIHJlc3RvcmVSZXF1ZXN0TWVzc2FnZShyZXF1ZXN0KTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZWljLnNldFJlc3BvbnNlTWVzc2FnZUNvbnRleHQocmVzcG9uc2UpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZGVzdHJveUhhbmRsZXJzKEVuZHBvaW50SW52b2NhdGlvbkNvbnRleHQgZWljLCBNZXNzYWdlQ29udGV4dCByZXF1ZXN0KSB7Ci0gICAgICAgIEhhbmRsZXJMaWZlY3ljbGVNYW5hZ2VyIGhsbSA9IGNyZWF0ZUhhbmRsZXJsaWZlY3ljbGVNYW5hZ2VyKCk7Ci0gICAgICAgIExpc3Q8SGFuZGxlcj4gbGlzdCA9IGVpYy5nZXRIYW5kbGVycygpOwotICAgICAgICBpZihsaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBIYW5kbGVyIGhhbmRsZXIgPSAoSGFuZGxlcikgaXQubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBobG0uZGVzdHJveUhhbmRsZXJJbnN0YW5jZShyZXF1ZXN0LCBoYW5kbGVyKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBjYW4gd2UgaWdub3JlIHRoaXM/Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBSZXR1cm5zIHRoZSBDbGFzcyBvYmplY3QgZm9yIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgd2ViIHNlcnZpY2UuCi0gICAgICovCi0gICAgcHJpdmF0ZSBDbGFzcyBnZXRTZXJ2aWNlSW1wbGVtZW50YXRpb24oTWVzc2FnZUNvbnRleHQgbWMpIHsKLSAgICAgICAgU3RyaW5nIGltcGxDbGFzc05hbWUgPSBnZXRTZXJ2aWNlSW1wbENsYXNzTmFtZShtYyk7Ci0gICAgICAgIENsYXNzIGltcGxDbGFzcyA9IGxvYWRTZXJ2aWNlSW1wbENsYXNzKGltcGxDbGFzc05hbWUsIG1jLmdldENsYXNzTG9hZGVyKCkpOwotICAgICAgICByZXR1cm4gaW1wbENsYXNzOwotICAgIH0KLQotICAgIC8qCi0gICAgICAqIEdldCB0aGUgYXBwcm9wcmlhdGUgRW5kcG9pbnREaXNwYXRjaGVyIGZvciBhIGdpdmVuIHNlcnZpY2UgZW5kcG9pbnQuCi0gICAgICAqLwotICAgIHByb3RlY3RlZCBFbmRwb2ludERpc3BhdGNoZXIgZ2V0RW5kcG9pbnREaXNwYXRjaGVyKENsYXNzIHNlcnZpY2VJbXBsQ2xhc3MsIE9iamVjdCBzZXJ2aWNlSW5zdGFuY2UpCi0gICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRFbmRwb2ludERpc3BhdGNoZXIobnVsbCwgc2VydmljZUltcGxDbGFzcywgc2VydmljZUluc3RhbmNlKTsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIEVuZHBvaW50RGlzcGF0Y2hlciBnZXRFbmRwb2ludERpc3BhdGNoZXIoTWVzc2FnZUNvbnRleHQgbWMsIENsYXNzIHNlcnZpY2VJbXBsQ2xhc3MsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBzZXJ2aWNlSW5zdGFuY2UpIAotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgRW5kcG9pbnREaXNwYXRjaGVyRmFjdG9yeSBmYWN0b3J5ID0gCi0gICAgICAgICAgICAoRW5kcG9pbnREaXNwYXRjaGVyRmFjdG9yeSlGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShFbmRwb2ludERpc3BhdGNoZXJGYWN0b3J5LmNsYXNzKTsgICAgICAgIAotICAgICAgICByZXR1cm4gZmFjdG9yeS5jcmVhdGVFbmRwb2ludERpc3BhdGNoZXIobWMsIHNlcnZpY2VJbXBsQ2xhc3MsIHNlcnZpY2VJbnN0YW5jZSk7ICAgCi0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0U2VydmljZUltcGxDbGFzc05hbWUoTWVzc2FnZUNvbnRleHQgbWMpIHsKLSAgICAgICAgLy8gVGhlIFBBUkFNX1NFUlZJQ0VfQ0xBU1MgcHJvcGVydHkgdGhhdCBpcyBzZXQgb24gdGhlIEF4aXNTZXJ2aWNlCi0gICAgICAgIC8vIHdpbGwgdGVsbCB1cyB3aGF0IHRoZSBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIGNsYXNzIGlzLgotICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQgYXhpc01zZ0NvbnRleHQgPSBtYy5nZXRBeGlzTWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgQXhpc1NlcnZpY2UgYXMgPSBheGlzTXNnQ29udGV4dC5nZXRBeGlzU2VydmljZSgpOwotICAgICAgICBQYXJhbWV0ZXIgcGFyYW0gPSBhcy5nZXRQYXJhbWV0ZXIob3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHMuU0VSVklDRV9DTEFTUyk7Ci0KLSAgICAgICAgLy8gSWYgdGhlcmUgd2FzIG5vIGltcGxlbWVudGF0aW9uIGNsYXNzLCB3ZSBzaG91bGQgbm90IGdvIGFueSBmdXJ0aGVyCi0gICAgICAgIGlmIChwYXJhbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoCi0gICAgICAgICAgICAgICAgICAgICJFbmRwb2ludENvbnRyb2xsZXJFcnIyIikpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9ICgoU3RyaW5nKXBhcmFtLmdldFZhbHVlKCkpLnRyaW0oKTsKLSAgICAgICAgcmV0dXJuIGNsYXNzTmFtZTsKLSAgICB9Ci0gICAgCi0gICAgLyoKLSAgICAgICogVHJpZXMgdG8gbG9hZCB0aGUgaW1wbGVtZW50YXRpb24gY2xhc3MgdGhhdCB3YXMgc3BlY2lmaWVkIGZvciB0aGUKLSAgICAgICogdGFyZ2V0IGVuZHBvaW50Ci0gICAgICAqLwotICAgIHByaXZhdGUgQ2xhc3MgbG9hZFNlcnZpY2VJbXBsQ2xhc3MoU3RyaW5nIGNsYXNzTmFtZSwgQ2xhc3NMb2FkZXIgY2wpIHsKLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIkF0dGVtcHRpbmcgdG8gbG9hZCBzZXJ2aWNlIGltcGwgY2xhc3M6ICIgKyBjbGFzc05hbWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vVE9ETzogV2hhdCBzaG91bGQgYmUgZG9uZSBpZiB0aGUgc3VwcGxpZWQgQ2xhc3NMb2FkZXIgaXMgbnVsbD8KLSAgICAgICAgICAgIENsYXNzIF9jbGFzcyA9IGZvck5hbWUoY2xhc3NOYW1lLCB0cnVlLCBjbCk7Ci0gICAgICAgICAgICByZXR1cm4gX2NsYXNzOwotICAgICAgICAgICAgLy9DYXRjaCBUaHJvd2FibGUgYXMgQ2xhc3NMb2FkZXIgY2FuIHRocm93IGFuIE5vQ2xhc3NEZWZGb3VuZEVycm9yIHRoYXQKLSAgICAgICAgICAgIC8vZG9lcyBub3QgZXh0ZW5kIEV4Y2VwdGlvbiwgc28gbGV0cyBjYXRjaCBldmVyeXRoaW5nIHRoYXQgZXh0ZW5kcyBUaHJvd2FibGUKLSAgICAgICAgICAgIC8vcmF0aGVyIHRoYW4ganVzdCBFeGNlcHRpb24uCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBjbmYpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgKLSAgICAgICAgICAgICAgICAgICAgIkVuZHBvaW50Q29udHJvbGxlckVycjQiLCBjbGFzc05hbWUpLCBjbmYpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBjbGFzcyBmb3IgdGhpcyBuYW1lCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIENsYXNzCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3MgZm9yTmFtZShmaW5hbCBTdHJpbmcgY2xhc3NOYW1lLCBmaW5hbCBib29sZWFuIGluaXRpYWxpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDbGFzc0xvYWRlciBjbGFzc2xvYWRlcikgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICAvLyBOT1RFOiBUaGlzIG1ldGhvZCBtdXN0IHJlbWFpbiBwcml2YXRlIGJlY2F1c2UgaXQgdXNlcyBBY2Nlc3NDb250cm9sbGVyCi0gICAgICAgIENsYXNzIGNsID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNsID0gKENsYXNzKUFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAotICAgICAgICAgICAgICAgICAgICBuZXcgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSwgaW5pdGlhbGl6ZSwgY2xhc3Nsb2FkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICApOwotICAgICAgICB9IGNhdGNoIChQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiB0aHJvd24gZnJvbSBBY2Nlc3NDb250cm9sbGVyOiAiICsgZSk7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJSZWFsIENhdXNlIGlzICIgKyBlLmdldEV4Y2VwdGlvbigpLmdldENhdXNlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhyb3cgKENsYXNzTm90Rm91bmRFeGNlcHRpb24pZS5nZXRFeGNlcHRpb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjbDsKLSAgICB9Ci0KLSAgICAvKgotICAgICogR2V0cyB0aGUgRW5kcG9pbnREZXNjcmlwdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIHJlcXVlc3QgdGhhdCBpcyBjdXJyZW50bHkKLSAgICAqIGJlaW5nIHByb2Nlc3NlZC4KLSAgICAqLwotICAgIHByaXZhdGUgRW5kcG9pbnREZXNjcmlwdGlvbiBnZXRFbmRwb2ludERlc2NyaXB0aW9uKE1lc3NhZ2VDb250ZXh0IG1jKSB7Ci0gICAgICAgIEF4aXNTZXJ2aWNlIGF4aXNTdmMgPSBtYy5nZXRBeGlzTWVzc2FnZUNvbnRleHQoKS5nZXRBeGlzU2VydmljZSgpOwotICAgICAgICBQYXJhbWV0ZXIgcGFyYW0gPSBheGlzU3ZjLmdldFBhcmFtZXRlcihFbmRwb2ludERlc2NyaXB0aW9uLkFYSVNfU0VSVklDRV9QQVJBTUVURVIpOwotICAgICAgICAKLSAgICAgICAgaWYgKHBhcmFtID09IG51bGwpIHsKLSAgICAgICAgCS8vIElmIHdlJ3ZlIG1hZGUgaXQgaGVyZSwgaXRzIHZlcnkgbGlrZWx5IHRoYXQgYWx0aG91Z2ggdGhlIEF4aXNTZXJ2aWNlIHdhcyBkZXBsb3llZCwgdGhlIAotICAgICAgICAJLy8gYXNzb2NpYXRlZCBTZXJ2aWNlRGVzY3JpcHRpb24gd2FzIG5vdCBjcmVhdGVkIHN1Y2Nlc3NmdWxseQotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJlbmRwb2ludERlc2NFcnIxIikpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVkID0gKEVuZHBvaW50RGVzY3JpcHRpb24pIHBhcmFtLmdldFZhbHVlKCk7Ci0gICAgICAgIHJldHVybiBlZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTYXZlIHRoZSByZXF1ZXN0IG1lc3NhZ2UgaWYgaW5kaWNhdGVkIGJ5IHRoZSBTQVZFX1JFUVVFU1RfTVNHIHByb3BlcnR5Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVxdWVzdE1zZ0NvbnRleHQKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2F2ZVJlcXVlc3RNZXNzYWdlKE1lc3NhZ2VDb250ZXh0IHJlcXVlc3RNc2dDb250ZXh0KSB7Ci0KLSAgICAgICAgLy8gVE9ETzogVEVTVElORy4uLkZPUkNFIFNBVklORyBUSEUgUkVRVUVTVCBNRVNTQUdFCi0gICAgICAgIC8vIHJlcXVlc3RNc2dDb250ZXh0LmdldEF4aXNNZXNzYWdlQ29udGV4dCgpLnNldFByb3BlcnR5KENvbnN0YW50cy5TQVZFX1JFUVVFU1RfTVNHLCBCb29sZWFuLlRSVUUpOwotICAgICAgICAvLyBFTkQgVEVTVElORwotCi0gICAgICAgIEJvb2xlYW4gdmFsdWUgPSAoQm9vbGVhbikKLSAgICAgICAgICAgICAgICByZXF1ZXN0TXNnQ29udGV4dC5nZXRBeGlzTWVzc2FnZUNvbnRleHQoKS5nZXRQcm9wZXJ0eShDb25zdGFudHMuU0FWRV9SRVFVRVNUX01TRyk7Ci0gICAgICAgIGlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmJvb2xlYW5WYWx1ZSgpKSB7Ci0gICAgICAgICAgICAvLyBSRVZJRVc6IFRoaXMgZG9lcyBub3QgcHJvcGVybHkgYWNjb3VudCBmb3IgYXR0YWNobWVudHMuCi0gICAgICAgICAgICBNZXNzYWdlIG0gPSByZXF1ZXN0TXNnQ29udGV4dC5nZXRNZXNzYWdlKCk7Ci0gICAgICAgICAgICBTdHJpbmcgc2F2ZWRNc2cgPSBtLmdldEFzT01FbGVtZW50KCkudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIHJlcXVlc3RNc2dDb250ZXh0LmdldEF4aXNNZXNzYWdlQ29udGV4dCgpCi0gICAgICAgICAgICAgICAgICAgIC5zZXRQcm9wZXJ0eShDb25zdGFudHMuU0FWRURfUkVRVUVTVF9NU0dfVEVYVCwgc2F2ZWRNc2cpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVzdG9yZSB0aGUgcmVxdWVzdCBtZXNzYWdlIGZyb20gdGhlIHNhdmVkIG1lc3NhZ2UgdGV4dAotICAgICAqCi0gICAgICogQHBhcmFtIHJlcXVlc3RNc2dDb250ZXh0Ci0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHJlc3RvcmVSZXF1ZXN0TWVzc2FnZShNZXNzYWdlQ29udGV4dCByZXF1ZXN0TXNnQ29udGV4dCkgewotCi0gICAgICAgIEJvb2xlYW4gdmFsdWUgPSAoQm9vbGVhbikKLSAgICAgICAgICAgICAgICByZXF1ZXN0TXNnQ29udGV4dC5nZXRBeGlzTWVzc2FnZUNvbnRleHQoKS5nZXRQcm9wZXJ0eShDb25zdGFudHMuU0FWRV9SRVFVRVNUX01TRyk7Ci0gICAgICAgIGlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmJvb2xlYW5WYWx1ZSgpKSB7Ci0gICAgICAgICAgICAvLyBSRVZJRVc6IFRoaXMgZG9lcyBub3QgcHJvcGVybHkgYWNjb3VudCBmb3IgYXR0YWNobWVudHMuCi0gICAgICAgICAgICBTdHJpbmcgc2F2ZWRNc2cgPSAoU3RyaW5nKXJlcXVlc3RNc2dDb250ZXh0LmdldEF4aXNNZXNzYWdlQ29udGV4dCgpCi0gICAgICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eShDb25zdGFudHMuU0FWRURfUkVRVUVTVF9NU0dfVEVYVCk7Ci0gICAgICAgICAgICBpZiAoc2F2ZWRNc2cgIT0gbnVsbCAmJiBzYXZlZE1zZy5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWFkZXIgc3IgPSBuZXcgU3RyaW5nUmVhZGVyKHNhdmVkTXNnKTsKLSAgICAgICAgICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbHJlYWRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoc3IpOwotICAgICAgICAgICAgICAgICAgICBNZXNzYWdlRmFjdG9yeSBtZiA9IChNZXNzYWdlRmFjdG9yeSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShNZXNzYWdlRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgICAgIFByb3RvY29sIHByb3RvY29sID0gcmVxdWVzdE1zZ0NvbnRleHQuZ2V0QXhpc01lc3NhZ2VDb250ZXh0KCkuaXNEb2luZ1JFU1QoKSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvdG9jb2wucmVzdCA6IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gbWYuY3JlYXRlRnJvbSh4bWxyZWFkZXIsIHByb3RvY29sKTsKLSAgICAgICAgICAgICAgICAgICAgcmVxdWVzdE1zZ0NvbnRleHQuc2V0TWVzc2FnZShtc2cpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVEVTVElORy4uLi5TSU1VTEFURSBBIFBFUlNJU1QgT0YgVEhFIFJFUVVFU1QgTUVTU0FHRQotICAgICAgICAvLyBTdHJpbmcgdGV4dCA9IHJlcXVlc3RNc2dDb250ZXh0LmdldE1lc3NhZ2UoKS5nZXRBc09NRWxlbWVudCgpLnRvU3RyaW5nKCk7Ci0gICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiUGVyc2lzdCBNZXNzYWdlIiArIHRleHQpOwotICAgICAgICAvLyBFTkQgVEVTVElORwotICAgIH0KLQotICAgIC8qCi0gICAgKiBEZXRlcm1pbmUgaWYgdGhpcyBpcyBhIG9uZS13YXkgaW52b2NhdGlvbiBvciBub3QuCi0gICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNPbmVXYXkob3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0IG1jKSB7Ci0gICAgICAgIGlmIChtYyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBBeGlzT3BlcmF0aW9uIG9wID0gbWMuZ2V0QXhpc09wZXJhdGlvbigpOwotICAgICAgICAgICAgU3RyaW5nIG1lcCA9IG9wLmdldE1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4oKTsKLQotICAgICAgICAgICAgaWYgKG1lcC5lcXVhbHMoV1NETDIwXzIwMDRfQ29uc3RhbnRzLk1FUF9VUklfUk9CVVNUX0lOX09OTFkpIHx8Ci0gICAgICAgICAgICAgICAgICAgIG1lcC5lcXVhbHMoV1NETDIwXzIwMDRfQ29uc3RhbnRzLk1FUF9VUklfSU5fT05MWSkgfHwKLSAgICAgICAgICAgICAgICAgICAgbWVwLmVxdWFscyhXU0RMMjBfMjAwNkNvbnN0YW50cy5NRVBfVVJJX1JPQlVTVF9JTl9PTkxZKSB8fAotICAgICAgICAgICAgICAgICAgICBtZXAuZXF1YWxzKFdTREwyMF8yMDA2Q29uc3RhbnRzLk1FUF9VUklfSU5fT05MWSl8fAotICAgICAgICAgICAgICAgICAgICBtZXAuZXF1YWxzKFdTREwyQ29uc3RhbnRzLk1FUF9VUklfUk9CVVNUX0lOX09OTFkpfHwKLSAgICAgICAgICAgICAgICAgICAgbWVwLmVxdWFscyhXU0RMMkNvbnN0YW50cy5NRVBfVVJJX0lOX09OTFkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBCdWlsZHMgdGhlIEhhbmRsZXJJbnZvY2F0aW9uQ29udGV4dCB0aGF0IHdpbGwgYmUgdXNlZCB3aGVuIGludm9raW5nIAotICAgICAqIGluYm91bmQvb3V0Ym91bmQgaGFuZGxlciBjaGFpbnMuCi0gICAgICovCi0gICAgc3RhdGljIEhhbmRsZXJJbnZvY2F0aW9uQ29udGV4dCBidWlsZEhhbmRsZXJJbnZvY2F0aW9uQ29udGV4dChNZXNzYWdlQ29udGV4dCByZXF1ZXN0LCBMaXN0PEhhbmRsZXI+IGhhbmRsZXJzLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IuTUVQIG1lcCwgYm9vbGVhbiBpc09uZVdheSkgewotICAgICAgICBIYW5kbGVySW52b2NhdGlvbkNvbnRleHQgaGlDb250ZXh0ID0gbmV3IEhhbmRsZXJJbnZvY2F0aW9uQ29udGV4dCgpOwotICAgICAgICBoaUNvbnRleHQuc2V0TWVzc2FnZUNvbnRleHQocmVxdWVzdCk7Ci0gICAgICAgIGhpQ29udGV4dC5zZXRNRVAobWVwKTsKLSAgICAgICAgaGlDb250ZXh0LnNldEhhbmRsZXJzKGhhbmRsZXJzKTsKLSAgICAgICAgaGlDb250ZXh0LnNldE9uZVdheShpc09uZVdheSk7Ci0gICAgICAgIHJldHVybiBoaUNvbnRleHQ7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgcmV0cmlldmUgYWxsIHRoZSBJbnZvY2F0aW9uTGlzdGVuZXJGYWN0b3J5IGluc3RhbmNlcyBhbmQKLSAgICAgKiBjYWxsIHRoZSAnY3JlYXRlSW52b2NhdGlvbkxpc3RlbmVyJyBpbnN0YW5jZSBvbiBlYWNoLiBJZiBhIG5vbi1udWxsIGxpc3RlbmVyCi0gICAgICogaXMgcmV0dXJuZWQsIHRoZSAncmVxdWVzdFJlY2VpdmVkJyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgb24gdGhlIGluc3RhbmNlLAotICAgICAqIGFuZCBpdCB3aWxsIGJlIGFkZGVkIHRvIHRoZSBFbmRwb2ludEludm9jYXRpb25Db250ZXh0LgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHJlcXVlc3RSZWNlaXZlZChFbmRwb2ludEludm9jYXRpb25Db250ZXh0IGVpYykgIHsKLSAgICAgICAgQ29sbGVjdGlvbjxJbnZvY2F0aW9uTGlzdGVuZXJGYWN0b3J5PiBmYWN0b3J5TGlzdCA9IGVpYy5nZXRJbnZvY2F0aW9uTGlzdGVuZXJGYWN0b3JpZXMoKTsKLSAgICAgICAgaWYoZmFjdG9yeUxpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgSW52b2NhdGlvbkxpc3RlbmVyQmVhbiBiZWFuID0gbmV3IEludm9jYXRpb25MaXN0ZW5lckJlYW4oZWljLCBJbnZvY2F0aW9uTGlzdGVuZXJCZWFuLlN0YXRlLlJFUVVFU1QpOwotICAgICAgICAgICAgSXRlcmF0b3I8SW52b2NhdGlvbkxpc3RlbmVyRmFjdG9yeT4gZmFjdG9yeUl0ZXIgPSBmYWN0b3J5TGlzdC5pdGVyYXRvcigpOwotICAgICAgICAgICAgd2hpbGUoZmFjdG9yeUl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgSW52b2NhdGlvbkxpc3RlbmVyRmFjdG9yeSBmYWN0b3J5ICA9IGZhY3RvcnlJdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBJbnZvY2F0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBmYWN0b3J5LmNyZWF0ZUludm9jYXRpb25MaXN0ZW5lcihlaWMuZ2V0UmVxdWVzdE1lc3NhZ2VDb250ZXh0KCkpOwotICAgICAgICAgICAgICAgIGlmKGxpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLm5vdGlmeShiZWFuKTsgCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2F0Y2goRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGQgdGhpcyBpbnN0YW5jZSBzbyBpdCBjYW4gYmUgY2FsbGVkIG9uIHRoZSByZXNwb25zZSBhbHNvCi0gICAgICAgICAgICAgICAgICAgICAgICBlaWMuYWRkSW52b2NhdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE1lc3NhZ2VDb250ZXh0IHJlcXVlc3QgPSBlaWMuZ2V0UmVxdWVzdE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgICAgICByZXF1ZXN0LnNldFByb3BlcnR5KG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc3BpLkNvbnN0YW50cy5JTlZPQ0FUSU9OX0xJU1RFTkVSX0xJU1QsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlaWMuZ2V0SW52b2NhdGlvbkxpc3RlbmVycygpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKiogCi0gICAgICogVGhpcyB3aWxsIGNhbGwgdGhlIEludm9jYXRpb25MaXN0ZW5lciBpbnN0YW5jZXMgdGhhdCB3ZXJlIGNhbGxlZCBkdXJpbmcKLSAgICAgKiB0aGUgcmVxdWVzdCBwcm9jZXNzaW5nIGZvciB0aGlzIG1lc3NhZ2UuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVzcG9uc2VSZWFkeShFbmRwb2ludEludm9jYXRpb25Db250ZXh0IGVpYykgIHsKLSAgICAgICAgTGlzdDxJbnZvY2F0aW9uTGlzdGVuZXI+IGxpc3RlbmVyTGlzdCA9IGVpYy5nZXRJbnZvY2F0aW9uTGlzdGVuZXJzKCk7Ci0gICAgICAgIGlmKGxpc3RlbmVyTGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBJbnZvY2F0aW9uTGlzdGVuZXJCZWFuIGJlYW4gPSBuZXcgSW52b2NhdGlvbkxpc3RlbmVyQmVhbihlaWMsIEludm9jYXRpb25MaXN0ZW5lckJlYW4uU3RhdGUuUkVTUE9OU0UpOwotICAgICAgICAgICAgZm9yKEludm9jYXRpb25MaXN0ZW5lciBsaXN0ZW5lciA6IGxpc3RlbmVyTGlzdCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLm5vdGlmeShiZWFuKTsgCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIHdlIG5lZWQgYSBIYW5kbGVyTGlmZWN5Y2xlTWFuYWdlciBzbyB3ZSBjYW4gY2FsbCB0aGUgQFByZURlc3Ryb3kgd2hlbiB3ZSBhcmUgZG9uZSB3aXRoIHRoZSBzZXJ2ZXItc2lkZSBoYW5kbGVyIGluc3RhbmNlcwotICAgICAqLwotICAgIHByaXZhdGUgSGFuZGxlckxpZmVjeWNsZU1hbmFnZXIgY3JlYXRlSGFuZGxlcmxpZmVjeWNsZU1hbmFnZXIoKSB7Ci0gICAgICAgIEhhbmRsZXJMaWZlY3ljbGVNYW5hZ2VyRmFjdG9yeSBlbG1mID0gKEhhbmRsZXJMaWZlY3ljbGVNYW5hZ2VyRmFjdG9yeSlGYWN0b3J5UmVnaXN0cnkKLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShIYW5kbGVyTGlmZWN5Y2xlTWFuYWdlckZhY3RvcnkuY2xhc3MpOwotICAgICAgICByZXR1cm4gZWxtZi5jcmVhdGVIYW5kbGVyTGlmZWN5Y2xlTWFuYWdlcigpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIE1lc3NhZ2VDb250ZXh0IGlzUHJvdG9jb2xNaXNtYXRjaChNZXNzYWdlQ29udGV4dCByZXF1ZXN0LCBNZXNzYWdlQ29udGV4dCByZXNwb25zZSl7Ci0gICAgCVByb3RvY29sIHJlcXVlc3RQcm90b2NvbCA9cmVxdWVzdC5nZXRNZXNzYWdlKCkuZ2V0UHJvdG9jb2woKTsKLSAgICAJUHJvdG9jb2wgcmVzcG9uc2VQcm90b2NvbCA9IHJlc3BvbnNlLmdldE1lc3NhZ2UoKS5nZXRQcm90b2NvbCgpOwotICAgIAlib29sZWFuIHByb3RvY29sTWlzbWF0Y2ggPSBmYWxzZTsKLSAgICAJU3RyaW5nIG1zZyA9IG51bGw7Ci0gICAgCWlmKHJlcXVlc3RQcm90b2NvbC5lcXVhbHMoUHJvdG9jb2wuc29hcDExKSl7Ci0gICAgCQlpZighcmVzcG9uc2VQcm90b2NvbC5lcXVhbHMoUHJvdG9jb2wuc29hcDExKSl7Ci0gICAgCQkJcHJvdG9jb2xNaXNtYXRjaCA9IHRydWU7Ci0gICAgCQkJbXNnID0gIlJlcXVlc3QgU09BUCBtZXNzYWdlIHByb3RvY29sIGlzIHZlcnNpb24gMS4xLCBidXQgUmVzcG9uc2UgU09BUCBtZXNzYWdlIGlzIGNvbmZpZ3VyZWQgZm9yIFNPQVAgMS4yLiAgVGhpcyBpcyBub3Qgc3VwcG9ydGVkLiI7Ci0gICAgCQl9Ci0gICAgCX0KLSAgICAJZWxzZSBpZihyZXF1ZXN0UHJvdG9jb2wuZXF1YWxzKFByb3RvY29sLnNvYXAxMikpewotICAgIAkJaWYoIXJlc3BvbnNlUHJvdG9jb2wuZXF1YWxzKFByb3RvY29sLnNvYXAxMikpewotICAgIAkJCXByb3RvY29sTWlzbWF0Y2ggPSB0cnVlOwotICAgIAkJCW1zZyA9ICJSZXF1ZXN0IFNPQVAgbWVzc2FnZSBwcm90b2NvbCBpcyB2ZXJzaW9uIDEuMiwgYnV0IFJlc3BvbnNlIFNPQVAgbWVzc2FnZSBpcyBjb25maWd1cmVkIGZvciBTT0FQIDEuMS4gIFRoaXMgaXMgbm90IHN1cHBvcnRlZC4iOwotICAgIAkJfQotICAgIAl9Ci0gICAgCU1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQgPSBudWxsOwotICAgIAlpZihwcm90b2NvbE1pc21hdGNoKXsKLSAgICAJCW1zZ0NvbnRleHQgPSBVdGlscy5jcmVhdGVGYXVsdE1lc3NhZ2UocmVzcG9uc2UsIG1zZyk7Ci0gICAgCX0KLSAgICAJcmV0dXJuIG1zZ0NvbnRleHQ7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2VydmVyL0VuZHBvaW50SW52b2NhdGlvbkNvbnRleHQuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NlcnZlci9FbmRwb2ludEludm9jYXRpb25Db250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4MDliN2MuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2VydmVyL0VuZHBvaW50SW52b2NhdGlvbkNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNlcnZlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLkludm9jYXRpb25Db250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNlcnZlci5kaXNwYXRjaGVyLkVuZHBvaW50RGlzcGF0Y2hlcjsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLS8qKg0KLSAqIFRoZSBFbmRwb2ludEludm9jYXRpb25Db250ZXh0IGlzIGFuIGV4dGVuc2lvbiBvZiB0aGUgYmFzZSBJbnZvY2F0aW9uQ29udGV4dA0KLSAqIHRoYXQgcHJvdmlkZXMgZXh0ZW5zaW9ucyBzcGVjaWZpYyB0byB0aGUgZW52aXJvbm1lbnQgb2YgdGhlIHNlcnZpY2UNCi0gKiBlbmRwb2ludC4gIA0KLSAqLw0KLXB1YmxpYyBpbnRlcmZhY2UgRW5kcG9pbnRJbnZvY2F0aW9uQ29udGV4dCBleHRlbmRzIEludm9jYXRpb25Db250ZXh0IHsNCi0NCi0gICAgLyoqDQotICAgICAqIFJldHVybnMgdGhlIGNhbGxiYWNrIG9iamVjdCB0byBiZSB1c2VkIGZvciBhc3luY2hyb25vdXMgDQotICAgICAqIGVuZHBvaW50IGludm9jYXRpb25zLg0KLSAgICAgKiANCi0gICAgICogQHJldHVybiBFbmRwb2ludENhbGxiYWNrIC0gdGhlIEVuZHBvaW50Q2FsbGJhY2sgaW5zdGFuY2UuDQotICAgICAqLw0KLSAgICBwdWJsaWMgRW5kcG9pbnRDYWxsYmFjayBnZXRDYWxsYmFjaygpOw0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFNldHMgdGhlIGNhbGxiYWNrIG9iamVjdCB0byBiZSB1c2VkIGZvciBhc3luY2hyb25vdXMgDQotICAgICAqIGVuZHBvaW50IGludm9jYXRpb25zLg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGNiIC0gdGhlIEVuZHBvaW50Q2FsbGJhY2sgaW5zdGFuY2UgdG8gYmUgdXNlZC4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHNldENhbGxiYWNrKEVuZHBvaW50Q2FsbGJhY2sgY2IpOw0KLSAgICANCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqLw0KLSAgICBwdWJsaWMgRW5kcG9pbnREaXNwYXRjaGVyIGdldERpc3BhdGNoZXIoKTsNCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGVkDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBzZXRFbmRwb2ludERpc3BhdGNoZXIoRW5kcG9pbnREaXNwYXRjaGVyIGVkKTsNCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBSZXR1cm5zIGEgYm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IHRoZSBpbnZvY2F0aW9uDQotICAgICAqIHBhdHRlcm4gZm9yIHRoZSByZXF1ZXN0IGlzIG9uZSB3YXkgb3Igbm90Lg0KLSAgICAgKiANCi0gICAgICogQHJldHVybg0KLSAgICAgKi8NCi0gICAgcHVibGljIGJvb2xlYW4gaXNPbmVXYXkoKTsgDQotICAgIA0KLSAgICAvKioNCi0gICAgICogU2V0cyB0aGUgdmFsdWUgZm9yIG1hcmtpbmcgdGhlIHJlcXVlc3QgYXMgYSBvbmUgd2F5IGludm9jYXRpb24uDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gdmFsdWUNCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHNldElzT25lV2F5KGJvb2xlYW4gdmFsdWUpOw0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFNldHMgdGhlIEludm9jYXRpb25MaXN0ZW5lckZhY3RvcnkgaW5zdGFuY2VzIHJlZ2lzdGVyZWQgd2l0aCBKQVgtV1MuDQotICAgICAqIEByZXR1cm4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHNldEludm9jYXRpb25MaXN0ZW5lckZhY3RvcmllcyhDb2xsZWN0aW9uPEludm9jYXRpb25MaXN0ZW5lckZhY3Rvcnk+IGZhY3Rvcmllcyk7DQotICAgIA0KLSAgICAvKioNCi0gICAgICogUmV0dXJucyB0aGUgSW52b2NhdGlvbkxpc3RlbmVyRmFjdG9yeSBpbnN0YW5jZXMgcmVnaXN0ZXJlZCB3aXRoIEpBWC1XUy4NCi0gICAgICogQHJldHVybg0KLSAgICAgKi8NCi0gICAgcHVibGljIENvbGxlY3Rpb248SW52b2NhdGlvbkxpc3RlbmVyRmFjdG9yeT4gZ2V0SW52b2NhdGlvbkxpc3RlbmVyRmFjdG9yaWVzKCk7DQotICAgIA0KLSAgICAvKioNCi0gICAgICogQWRkcyBhbiBJbnZvY2F0aW9uTGlzdGVuZXIgdG8gdGhlIGNvbnRleC4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIGFkZEludm9jYXRpb25MaXN0ZW5lcihJbnZvY2F0aW9uTGlzdGVuZXIgbGlzdGVuZXIpOw0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFNldHMgbGlzdCBvZiBJbnZvY2F0aW9uTGlzdGVuZXIgaW5zdGFuY2VzDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBzZXRJbnZvY2F0aW9uTGlzdGVuZXJzKExpc3Q8SW52b2NhdGlvbkxpc3RlbmVyPiBsaXN0ZW5lcnMpOw0KLSAgICANCi0gICAgLyoqDQotICAgICAqIEdldHMgdGhlIEludm9jYXRpb25MaXN0ZW5lciBpbnN0YW5jZXMgZnJvbSB0aGUgY29udGV4dC4NCi0gICAgICovDQotICAgIHB1YmxpYyBMaXN0PEludm9jYXRpb25MaXN0ZW5lcj4gZ2V0SW52b2NhdGlvbkxpc3RlbmVycygpOw0KLQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zZXJ2ZXIvRW5kcG9pbnRJbnZvY2F0aW9uQ29udGV4dEltcGwuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NlcnZlci9FbmRwb2ludEludm9jYXRpb25Db250ZXh0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDI0MzEzLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NlcnZlci9FbmRwb2ludEludm9jYXRpb25Db250ZXh0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2VydmVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUuSW52b2NhdGlvbkNvbnRleHRJbXBsOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNlcnZlci5kaXNwYXRjaGVyLkVuZHBvaW50RGlzcGF0Y2hlcjsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi1wdWJsaWMgY2xhc3MgRW5kcG9pbnRJbnZvY2F0aW9uQ29udGV4dEltcGwgZXh0ZW5kcyBJbnZvY2F0aW9uQ29udGV4dEltcGwNCi0gICAgaW1wbGVtZW50cyBFbmRwb2ludEludm9jYXRpb25Db250ZXh0IHsNCi0NCi0gICAgcHJpdmF0ZSBFbmRwb2ludENhbGxiYWNrIGNhbGxiYWNrOw0KLSAgICBwcml2YXRlIEVuZHBvaW50RGlzcGF0Y2hlciBkaXNwYXRjaGVyOw0KLSAgICBwcml2YXRlIEJvb2xlYW4gb25lV2F5Ow0KLSAgICBwcml2YXRlIENvbGxlY3Rpb248SW52b2NhdGlvbkxpc3RlbmVyRmFjdG9yeT4gaWxGYWN0b3JpZXM7DQotICAgIHByaXZhdGUgTGlzdDxJbnZvY2F0aW9uTGlzdGVuZXI+IGlsSW5zdGFuY2VzID0gbmV3IExpbmtlZExpc3Q8SW52b2NhdGlvbkxpc3RlbmVyPigpOw0KLSAgICANCi0gICAgLyoNCi0gICAgICogKG5vbi1KYXZhZG9jKQ0KLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2VydmVyLkVuZHBvaW50SW52b2NhdGlvbkNvbnRleHQjZ2V0Q2FsbGJhY2soKQ0KLSAgICAgKi8NCi0gICAgcHVibGljIEVuZHBvaW50Q2FsbGJhY2sgZ2V0Q2FsbGJhY2soKSB7DQotICAgICAgICByZXR1cm4gY2FsbGJhY2s7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogKG5vbi1KYXZhZG9jKQ0KLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2VydmVyLkVuZHBvaW50SW52b2NhdGlvbkNvbnRleHQjZ2V0RGlzcGF0Y2hlcigpDQotICAgICAqLw0KLSAgICBwdWJsaWMgRW5kcG9pbnREaXNwYXRjaGVyIGdldERpc3BhdGNoZXIoKSB7DQotICAgICAgICByZXR1cm4gZGlzcGF0Y2hlcjsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiAobm9uLUphdmFkb2MpDQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zZXJ2ZXIuRW5kcG9pbnRJbnZvY2F0aW9uQ29udGV4dCNzZXRDYWxsYmFjayhvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNlcnZlci5FbmRwb2ludENhbGxiYWNrKQ0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgc2V0Q2FsbGJhY2soRW5kcG9pbnRDYWxsYmFjayBjYikgew0KLSAgICAgICAgY2FsbGJhY2sgPSBjYjsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiAobm9uLUphdmFkb2MpDQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zZXJ2ZXIuRW5kcG9pbnRJbnZvY2F0aW9uQ29udGV4dCNzZXRFbmRwb2ludERpc3BhdGNoZXIob3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zZXJ2ZXIuZGlzcGF0Y2hlci5FbmRwb2ludERpc3BhdGNoZXIpDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBzZXRFbmRwb2ludERpc3BhdGNoZXIoRW5kcG9pbnREaXNwYXRjaGVyIGVkKSB7DQotICAgICAgICBkaXNwYXRjaGVyID0gZWQ7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogKG5vbi1KYXZhZG9jKQ0KLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2VydmVyLkVuZHBvaW50SW52b2NhdGlvbkNvbnRleHQjaXNPbmVXYXkoKQ0KLSAgICAgKi8NCi0gICAgcHVibGljIGJvb2xlYW4gaXNPbmVXYXkoKSB7DQotICAgICAgICBpZiAob25lV2F5ICE9IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gb25lV2F5LmJvb2xlYW5WYWx1ZSgpOyAgICANCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2Ugew0KLSAgICAgICAgICAgIC8vIFRPRE86IFdlIGNhbiBhZGQgc29tZSBjb2RlIHRvIGRlcml2ZSBpdCBoZXJlIA0KLSAgICAgICAgICAgIC8vIHNob3VsZCB3ZSBzZWUgZml0Lg0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiAobm9uLUphdmFkb2MpDQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zZXJ2ZXIuRW5kcG9pbnRJbnZvY2F0aW9uQ29udGV4dCNzZXRJc09uZVdheShib29sZWFuKQ0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgc2V0SXNPbmVXYXkoYm9vbGVhbiB2YWx1ZSkgew0KLSAgICAgICAgb25lV2F5ID0gdmFsdWU7DQotICAgIH0NCi0gICAgDQotICAgIC8qDQotICAgICAqIChub24tSmF2YWRvYykNCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNlcnZlci5FbmRwb2ludEludm9jYXRpb25Db250ZXh0I3NldEludm9jYXRpb25MaXN0ZW5lckZhY3Rvcmllcw0KLSAgICAgKiAoQ29sbGVjdGlvbjxJbnZvY2F0aW9uTGlzdGVuZXJGYWN0b3J5PikNCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHNldEludm9jYXRpb25MaXN0ZW5lckZhY3RvcmllcyhDb2xsZWN0aW9uPEludm9jYXRpb25MaXN0ZW5lckZhY3Rvcnk+IGlsRmFjdG9yaWVzKSB7DQotICAgICAgICB0aGlzLmlsRmFjdG9yaWVzID0gaWxGYWN0b3JpZXM7DQotICAgIH0NCi0gICAgDQotICAgIC8qDQotICAgICAqIChub24tSmF2YWRvYykNCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNlcnZlci5FbmRwb2ludEludm9jYXRpb25Db250ZXh0I2dldEludm9jYXRpb25MaXN0ZW5lckZhY3RvcmllcygpDQotICAgICAqLw0KLSAgICBwdWJsaWMgQ29sbGVjdGlvbjxJbnZvY2F0aW9uTGlzdGVuZXJGYWN0b3J5PiBnZXRJbnZvY2F0aW9uTGlzdGVuZXJGYWN0b3JpZXMoKSB7DQotICAgICAgICByZXR1cm4gaWxGYWN0b3JpZXM7DQotICAgIH0NCi0gICAgDQotICAgIC8qDQotICAgICAqIChub24tSmF2YWRvYykNCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNlcnZlci5FbmRwb2ludEludm9jYXRpb25Db250ZXh0I3NldEludm9jYXRpb25MaXN0ZW5lcnMoTGlzdDxJbnZvY2F0aW9uTGlzdGVuZXI+IGxpc3RlbmVycykNCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHNldEludm9jYXRpb25MaXN0ZW5lcnMoTGlzdDxJbnZvY2F0aW9uTGlzdGVuZXI+IGxpc3RlbmVycykgew0KLSAgICAgICAgdGhpcy5pbEluc3RhbmNlcyA9IGxpc3RlbmVyczsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoNCi0gICAgICogKG5vbi1KYXZhZG9jKQ0KLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2VydmVyLkVuZHBvaW50SW52b2NhdGlvbkNvbnRleHQjYWRkSW52b2NhdGlvbkxpc3RlbmVyKEludm9jYXRpb25MaXN0ZW5lcikNCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIGFkZEludm9jYXRpb25MaXN0ZW5lcihJbnZvY2F0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsNCi0gICAgICAgIGlsSW5zdGFuY2VzLmFkZChsaXN0ZW5lcik7DQotICAgIH0NCi0gICAgDQotICAgIC8qDQotICAgICAqIChub24tSmF2YWRvYykNCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNlcnZlci5FbmRwb2ludEludm9jYXRpb25Db250ZXh0I2dldEludm9jYXRpb25MaXN0ZW5lcnMoKQ0KLSAgICAgKi8NCi0gICAgcHVibGljIExpc3Q8SW52b2NhdGlvbkxpc3RlbmVyPiBnZXRJbnZvY2F0aW9uTGlzdGVuZXJzKCkgew0KLSAgICAgICAgcmV0dXJuIGlsSW5zdGFuY2VzOw0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NlcnZlci9JbnZvY2F0aW9uSGVscGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zZXJ2ZXIvSW52b2NhdGlvbkhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzRmYWFiLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NlcnZlci9JbnZvY2F0aW9uSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zZXJ2ZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS5NZXNzYWdlQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi0vKioNCi0gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgc3RhdGljIG1ldGhvZHMgdGhhdCBhcmUgdXRpbGl6ZWQgZHVyaW5nIHRoZSBjb3Vyc2UNCi0gKiBvZiBpbnZvY2F0aW9uIG9mIGEgSkFYLVdTIGVuZHBvaW50LiBUaGlzIHV0aWxpdHkgY2xhc3MgaXMgc3BlY2lmaWNhbGx5DQotICogbWVhbnQgdG8gYmUgdXNlZCB3aXRoaW4gdGhlIEpBWC1XUyBzZXJ2ZXItc2lkZSBmbG93Lg0KLSAqDQotICovDQotcHVibGljIGNsYXNzIEludm9jYXRpb25IZWxwZXIgew0KLSAgICANCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEludm9jYXRpb25IZWxwZXIuY2xhc3MpOw0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFRoaXMgbWV0aG9kIGlzIHJlc3BvbnNpYmxlIGZvciBkcml2aW5nIHRoZSBtZXRob2QgYmVsb3cuIEl0IHdpbGwgYXBwcm9wcmlhdGVseQ0KLSAgICAgKiB3cmFwIHRoZSBNZXNzYWdlQ29udGV4dCBpbiBhbiBFbmRwb2ludEludm9jYXRpb25Db250ZXh0LiBUaGUgTWVzc2FnZUNvbnRleHQgDQotICAgICAqIGluc3RhbmNlIE1VU1QgYmUgYSByZXF1ZXN0IE1lc3NhZ2VDb250ZXh0Lg0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGNhbGxMaXN0ZW5lcnNGb3JFeGNlcHRpb24oVGhyb3dhYmxlIHQsIE1lc3NhZ2VDb250ZXh0IGNvbnRleHQpIHsNCi0gICAgICAgIEVuZHBvaW50SW52b2NhdGlvbkNvbnRleHQgZWljID0gbmV3IEVuZHBvaW50SW52b2NhdGlvbkNvbnRleHRJbXBsKCk7DQotICAgICAgICBlaWMuc2V0UmVxdWVzdE1lc3NhZ2VDb250ZXh0KGNvbnRleHQpOw0KLSAgICAgICAgZWljLnNldEludm9jYXRpb25MaXN0ZW5lcnMoKExpc3Q8SW52b2NhdGlvbkxpc3RlbmVyPiljb250ZXh0LmdldFByb3BlcnR5KG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc3BpLkNvbnN0YW50cy5JTlZPQ0FUSU9OX0xJU1RFTkVSX0xJU1QpKTsNCi0gICAgICAgIGNhbGxMaXN0ZW5lcnNGb3JFeGNlcHRpb24odCwgZWljKTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFRoaXMgbWV0aG9kIGlzIHJlc3BvbnNpYmxlIGZvciBkcml2aW5nIHRoZSBJbnZvY2F0aW9uTGlzdGVuZXIgaW5zdGFuY2VzJw0KLSAgICAgKiAnbm90aWZ5T25FeGNlcHRpb24nIG1ldGhvZC4gVGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgYW55dGltZSB0aGF0IGFuDQotICAgICAqIGV4Y2VwdGlvbiBvY2N1cnMgd2l0aGluIHRoZSBKQVgtV1Mgc2VydmVyIHNpZGUgY29kZSBmbG93Lg0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGNhbGxMaXN0ZW5lcnNGb3JFeGNlcHRpb24oVGhyb3dhYmxlIHQsIEVuZHBvaW50SW52b2NhdGlvbkNvbnRleHQgZWljKSB7DQotICAgICAgICBMaXN0PEludm9jYXRpb25MaXN0ZW5lcj4gaW52b2NhdGlvbkxpc3RlbmVycyA9IGVpYy5nZXRJbnZvY2F0aW9uTGlzdGVuZXJzKCk7DQotICAgICAgICBUaHJvd2FibGUgcmV0dXJuRXhjZXB0aW9uID0gbnVsbDsNCi0gICAgICAgIGlmKGludm9jYXRpb25MaXN0ZW5lcnMgIT0gbnVsbCAmJiAhaW52b2NhdGlvbkxpc3RlbmVycy5pc0VtcHR5KCkpIHsNCi0gICAgICAgICAgICBJbnZvY2F0aW9uTGlzdGVuZXJCZWFuIGJlYW4gPSBuZXcgSW52b2NhdGlvbkxpc3RlbmVyQmVhbigpOw0KLSAgICAgICAgICAgIGJlYW4uc2V0RW5kcG9pbnRJbnZvY2F0aW9uQ29udGV4dChlaWMpOw0KLSAgICAgICAgICAgIGJlYW4uc2V0U3RhdGUoZWljLmdldFJlc3BvbnNlTWVzc2FnZUNvbnRleHQoKSAhPSBudWxsID8gSW52b2NhdGlvbkxpc3RlbmVyQmVhbi5TdGF0ZS5SRVNQT05TRSA6IA0KLSAgICAgICAgICAgICAgICBJbnZvY2F0aW9uTGlzdGVuZXJCZWFuLlN0YXRlLlJFUVVFU1QpOw0KLSAgICAgICAgICAgIGJlYW4uc2V0VGhyb3dhYmxlKHQpOw0KLSAgICAgICAgICAgIGZvcihJbnZvY2F0aW9uTGlzdGVuZXIgbGlzdGVuZXIgOiBpbnZvY2F0aW9uTGlzdGVuZXJzKSB7DQotICAgICAgICAgICAgICAgIGxpc3RlbmVyLm5vdGlmeU9uRXhjZXB0aW9uKGJlYW4pOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgZHJpdmUgdGhlIGNhbGwgdG8gdGhlIGFib3ZlIG1ldGhvZHMuIEl0IHdpbGwgZHJpdmUgdGhlIGNhbGwgdG8NCi0gICAgICogdGhlICdub3RpZnlPbkV4Y2VwdGlvbicgbWV0aG9kcyBvZiBhbGwgSW52b2NhdGlvbkxpc3RlbmVycy4gQWZ0ZXIgZG9pbmcgdGhpcywgaXQNCi0gICAgICogd2lsbCBkZXRlcm1pbmUgaWYgYW5vdGhlciBleGNlcHRpb24gaGFzIGJlZW4gc2V0IGFzIHRoZSBtYXBwZWQgZXhjZXB0aW9uLCBhbmQgaWYNCi0gICAgICogc28gaXQgd2lsbCByZXR1cm4gdGhpcyBleGNlcHRpb24uIE90aGVyd2lzZSwgbnVsbCBpcyByZXR1cm5lZC4NCi0gICAgICovDQotICAgIHB1YmxpYyBzdGF0aWMgVGhyb3dhYmxlIGRldGVybWluZU1hcHBlZEV4Y2VwdGlvbihUaHJvd2FibGUgdCwgRW5kcG9pbnRJbnZvY2F0aW9uQ29udGV4dCBlaWMpIHsNCi0gICAgICAgIFRocm93YWJsZSByZXR1cm5UaHJvd2FibGUgPSBudWxsOw0KLSAgICAgICAgY2FsbExpc3RlbmVyc0ZvckV4Y2VwdGlvbih0LCBlaWMpOw0KLSAgICAgICAgTWVzc2FnZUNvbnRleHQgcmVxdWVzdENvbnRleHQgPSBlaWMuZ2V0UmVxdWVzdE1lc3NhZ2VDb250ZXh0KCk7DQotICAgICAgICBNZXNzYWdlQ29udGV4dCByZXNwb25zZUNvbnRleHQgPSBlaWMuZ2V0UmVzcG9uc2VNZXNzYWdlQ29udGV4dCgpOw0KLSAgICAgICAgaWYocmVxdWVzdENvbnRleHQgIT0gbnVsbCANCi0gICAgICAgICAgICAgICAgJiYgDQotICAgICAgICAgICAgICAgIHJlcXVlc3RDb250ZXh0LmdldFByb3BlcnR5KG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc3BpLkNvbnN0YW50cy5NQVBQRURfRVhDRVBUSU9OKSAhPSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuVGhyb3dhYmxlID0gKFRocm93YWJsZSkgcmVxdWVzdENvbnRleHQuZ2V0UHJvcGVydHkob3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zcGkuQ29uc3RhbnRzLk1BUFBFRF9FWENFUFRJT04pOw0KLSAgICAgICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiU2V0dGluZyBtYXBwZWQgZXhjZXB0aW9uIHRvOiAiICsgcmV0dXJuVGhyb3dhYmxlICsgIiBmcm9tIHJlcXVlc3QgIiArDQotICAgICAgICAgICAgICAgIAkJIk1lc3NhZ2VDb250ZXh0Iik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZihyZXNwb25zZUNvbnRleHQgIT0gbnVsbA0KLSAgICAgICAgICAgICAgICAmJg0KLSAgICAgICAgICAgICAgICByZXNwb25zZUNvbnRleHQuZ2V0UHJvcGVydHkob3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zcGkuQ29uc3RhbnRzLk1BUFBFRF9FWENFUFRJT04pICE9IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm5UaHJvd2FibGUgPSAoVGhyb3dhYmxlKSByZXNwb25zZUNvbnRleHQuZ2V0UHJvcGVydHkob3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zcGkuQ29uc3RhbnRzLk1BUFBFRF9FWENFUFRJT04pOw0KLSAgICAgICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiU2V0dGluZyBtYXBwZWQgZXhjZXB0aW9uIHRvOiAiICsgcmV0dXJuVGhyb3dhYmxlICsgIiBmcm9tIHJlc3BvbnNlICIgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1lc3NhZ2VDb250ZXh0Iik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHJldHVyblRocm93YWJsZTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgZHJpdmUgdGhlIGNhbGwgdG8gdGhlIGFib3ZlIG1ldGhvZHMuIEl0IHdpbGwgZHJpdmUgdGhlIGNhbGwgdG8NCi0gICAgICogdGhlICdub3RpZnlPbkV4Y2VwdGlvbicgbWV0aG9kcyBvZiBhbGwgSW52b2NhdGlvbkxpc3RlbmVycy4gQWZ0ZXIgZG9pbmcgdGhpcywgaXQNCi0gICAgICogd2lsbCBkZXRlcm1pbmUgaWYgYW5vdGhlciBleGNlcHRpb24gaGFzIGJlZW4gc2V0IGFzIHRoZSBtYXBwZWQgZXhjZXB0aW9uLCBhbmQgaWYNCi0gICAgICogc28gaXQgd2lsbCByZXR1cm4gdGhpcyBleGNlcHRpb24uIE90aGVyd2lzZSwgbnVsbCBpcyByZXR1cm5lZC4NCi0gICAgICovDQotICAgIHB1YmxpYyBzdGF0aWMgVGhyb3dhYmxlIGRldGVybWluZU1hcHBlZEV4Y2VwdGlvbihUaHJvd2FibGUgdCwgTWVzc2FnZUNvbnRleHQgY29udGV4dCkgew0KLSAgICAgICAgRW5kcG9pbnRJbnZvY2F0aW9uQ29udGV4dCBlaWMgPSAoRW5kcG9pbnRJbnZvY2F0aW9uQ29udGV4dCljb250ZXh0LmdldEludm9jYXRpb25Db250ZXh0KCk7DQotICAgICAgICBpZiAoZWljID09IG51bGwpIHsNCi0gICAgICAgICAgICBlaWMgPSBuZXcgRW5kcG9pbnRJbnZvY2F0aW9uQ29udGV4dEltcGwoKTsNCi0gICAgICAgICAgICBlaWMuc2V0UmVxdWVzdE1lc3NhZ2VDb250ZXh0KGNvbnRleHQpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWljLnNldEludm9jYXRpb25MaXN0ZW5lcnMoKExpc3Q8SW52b2NhdGlvbkxpc3RlbmVyPiljb250ZXh0LmdldFByb3BlcnR5KG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc3BpLkNvbnN0YW50cy5JTlZPQ0FUSU9OX0xJU1RFTkVSX0xJU1QpKTsNCi0gICAgICAgIHJldHVybiBkZXRlcm1pbmVNYXBwZWRFeGNlcHRpb24odCwgZWljKTsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zZXJ2ZXIvSW52b2NhdGlvbkxpc3RlbmVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zZXJ2ZXIvSW52b2NhdGlvbkxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2YjJjOGMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2VydmVyL0ludm9jYXRpb25MaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zZXJ2ZXI7DQotDQotLyoqDQotICogVGhpcyBpbnRlcmZhY2Ugd2lsbCBiZSBpbXBsZW1lbnRlZCBieSB0aG9zZSBjb21wb25lbnRzIHdpc2hpbmcgdG8NCi0gKiBiZSBub3RpZmllZCB3aGVuIHJlcXVlc3RzIGFyZSByZWNlaXZlZCBvbiB0aGUgc2VydmVyLXNpZGUgYW5kIHdoZW4NCi0gKiByZXNwb25zZXMgaGF2ZSBiZWVuIGNvbnN0cnVjdGVkIG9uIHRoZSBzZXJ2ZXItc2lkZS4gSW1wbGVtZW50YXRpb25zDQotICogY2FuIGJlIHJlZ2lzdGVyZWQgd2l0aCB0aGUgRmFjdG9yeVJlZ2lzdHJ5Lg0KLSAqDQotICovDQotcHVibGljIGludGVyZmFjZSBJbnZvY2F0aW9uTGlzdGVuZXIgew0KLQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIGJ5IEpBWC1XUyB3aGVuIGEgbWVzc2FnZSBoYXMgYmVlbg0KLSAgICAgKiByZWNlaXZlZCBvciBqdXN0IGJlZm9yZSBhIHJlc3BvbnNlIGlzIHNlbnQgdG8gdGhlIGNsaWVudC4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIG5vdGlmeShJbnZvY2F0aW9uTGlzdGVuZXJCZWFuIGJlYW4pIHRocm93cyBFeGNlcHRpb247DQotICAgIA0KLSAgICAvKioNCi0gICAgICogVGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgYW55dGltZSB0aGF0IGFuIGV4Y2VwdGlvbiBvY2N1cnMNCi0gICAgICogd2l0aGluIHRoZSBKQVgtV1Mgc2VydmVyLXNpZGUgY29kZSBmbG93LiBJbnZvY2F0aW9uTGlzdGVuZXINCi0gICAgICogaW5zdGFuY2VzIG1heSBjaGFuZ2UgdGhlIGV4Y2VwdGlvbiBiZWluZyBvcGVyYXRlZCBvbiBieSBzZXR0aW5nIA0KLSAgICAgKiB0aGUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zcGkuQ29uc3RhbnRzLk1BUFBFRF9FWENFUFRJT04NCi0gICAgICogcHJvcGVydHkgb24gZWl0aGVyIHRoZSByZXF1ZXN0IG9yIHJlc3BvbnNlIE1lc3NhZ2VDb250ZXh0LiBUaGUNCi0gICAgICogdmFsdWUgb2YgdGhlIHByb3BlcnR5IHNob3VsZCBiZSBhbiBpbnN0YW5jZSBvZiBUaHJvd2FibGUuDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBub3RpZnlPbkV4Y2VwdGlvbihJbnZvY2F0aW9uTGlzdGVuZXJCZWFuIGJlYW4pOw0KLSAgICANCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2VydmVyL0ludm9jYXRpb25MaXN0ZW5lckJlYW4uamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NlcnZlci9JbnZvY2F0aW9uTGlzdGVuZXJCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwY2NiMjcuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2VydmVyL0ludm9jYXRpb25MaXN0ZW5lckJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2VydmVyOw0KLQ0KLS8qKg0KLSAqIEFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIEludm9jYXRpb25MaXN0ZW5lciANCi0gKiBpbnN0YW5jZXMgaW4gYm90aCB0aGUgcmVxdWVzdCBhbmQgcmVzcG9uc2UgZmxvdy4gVGhpcyBiZWFuIHdpbGwgDQotICogaG9sZCBkYXRhIHRoYXQgYWxsb3dzIHRoZSBJbnZvY2F0aW9uTGlzdGVuZXIgdG8gZGV0ZXJtaW5lIHRoZSBtZXNzYWdlDQotICogZmxvdyAocmVxdWVzdCB2cy4gcmVzcG9uc2UpIGFzIHdlbGwgYXMgb3RoZXIgY29udGV4dCBpbmZvcm1hdGlvbi4NCi0gKg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBJbnZvY2F0aW9uTGlzdGVuZXJCZWFuIHsNCi0gICAgDQotICAgIHByaXZhdGUgVGhyb3dhYmxlIHRocm93YWJsZTsNCi0gICAgDQotICAgIHB1YmxpYyBJbnZvY2F0aW9uTGlzdGVuZXJCZWFuKCkgew0KLSAgICAgICAgDQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyBJbnZvY2F0aW9uTGlzdGVuZXJCZWFuKEVuZHBvaW50SW52b2NhdGlvbkNvbnRleHQgZWljLCBTdGF0ZSBzdGF0ZSkgew0KLSAgICAgICAgdGhpcy5laWMgPSBlaWM7DQotICAgICAgICB0aGlzLnN0YXRlID0gc3RhdGU7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyBzdGF0aWMgZW51bSBTdGF0ZSB7DQotICAgICAgICBSRVFVRVNULA0KLSAgICAgICAgUkVTUE9OU0UsDQotICAgICAgICBFWENFUFRJT04NCi0gICAgfQ0KLSAgICANCi0gICAgcHJpdmF0ZSBFbmRwb2ludEludm9jYXRpb25Db250ZXh0IGVpYzsNCi0gICAgDQotICAgIHByaXZhdGUgU3RhdGUgc3RhdGU7DQotDQotICAgIHB1YmxpYyBFbmRwb2ludEludm9jYXRpb25Db250ZXh0IGdldEVuZHBvaW50SW52b2NhdGlvbkNvbnRleHQoKSB7DQotICAgICAgICByZXR1cm4gZWljOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldEVuZHBvaW50SW52b2NhdGlvbkNvbnRleHQoRW5kcG9pbnRJbnZvY2F0aW9uQ29udGV4dCBlaWMpIHsNCi0gICAgICAgIHRoaXMuZWljID0gZWljOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdGF0ZSBnZXRTdGF0ZSgpIHsNCi0gICAgICAgIHJldHVybiBzdGF0ZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRTdGF0ZShTdGF0ZSBzdGF0ZSkgew0KLSAgICAgICAgdGhpcy5zdGF0ZSA9IHN0YXRlOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCBzZXRUaHJvd2FibGUoVGhyb3dhYmxlIHRocm93YWJsZSkgew0KLSAgICAgICAgdGhpcy50aHJvd2FibGUgPSB0aHJvd2FibGU7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyBUaHJvd2FibGUgZ2V0VGhyb3dhYmxlKCkgew0KLSAgICAgICAgcmV0dXJuIHRocm93YWJsZTsNCi0gICAgfQ0KLSAgICANCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2VydmVyL0ludm9jYXRpb25MaXN0ZW5lckZhY3RvcnkuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NlcnZlci9JbnZvY2F0aW9uTGlzdGVuZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczOGJiMDIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2VydmVyL0ludm9jYXRpb25MaXN0ZW5lckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2VydmVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUuTWVzc2FnZUNvbnRleHQ7DQotDQotLyoqDQotICogVGhpcyBpbnRlcmZhY2Ugd2lsbCBiZSBpbXBsZW1lbnRlZCBieSB0aG9zZSB3aXNoaW5nIHRvDQotICogY3JlYXRlIGluc3RhbmNlcyBvZiBhbiBJbnZvY2F0aW9uTGlzdGVuZXIgYmFzZWQgb24gY2VydGFpbg0KLSAqIGNvbnRleHQgaW5mb3JtYXRpb24gZm9yIGEgZ2l2ZW4gcmVxdWVzdC4gVGhlIGNvbnRleHQgaW5mb3JtYXRpb24NCi0gKiBtYXkgYmUgb2J0YWluZWQgdmlhIHRoZSBNZXNzYWdlQ29udGV4dCBwcm92aWRlZC4NCi0gKg0KLSAqLw0KLXB1YmxpYyBpbnRlcmZhY2UgSW52b2NhdGlvbkxpc3RlbmVyRmFjdG9yeSB7DQotICAgIA0KLSAgICBwdWJsaWMgSW52b2NhdGlvbkxpc3RlbmVyIGNyZWF0ZUludm9jYXRpb25MaXN0ZW5lcihNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCk7DQotICAgIA0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zZXJ2ZXIvSkFYV1NNZXNzYWdlUmVjZWl2ZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NlcnZlci9KQVhXU01lc3NhZ2VSZWNlaXZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2FiNzU0Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NlcnZlci9KQVhXU01lc3NhZ2VSZWNlaXZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zZXJ2ZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuQWRkcmVzc2luZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuT3BlcmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLldTREwyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNFbmdpbmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuTWVzc2FnZVJlY2VpdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuRXhjZXB0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUuSW52b2NhdGlvbkNvbnRleHRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkRlc2NyaXB0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkVuZHBvaW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5TZXJ2aWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5oYW5kbGVyLkF0dGFjaG1lbnRzQWRhcHRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmhhbmRsZXIuTUVQQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmhhbmRsZXIuU09BUEhlYWRlcnNBZGFwdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaGFuZGxlci5UcmFuc3BvcnRIZWFkZXJzQWRhcHRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmkxOG4uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLnV0aWwuTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MucmVnaXN0cnkuSW52b2NhdGlvbkxpc3RlbmVyUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51dGlsLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuSmF2YVV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5UaHJlYWRDb250ZXh0TWlncmF0b3JVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMQ29uc3RhbnRzLldTREwyMF8yMDA0X0NvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuV1NETENvbnN0YW50cy5XU0RMMjBfMjAwNkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LnhtbC53cy5CaW5kaW5nOwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOwotCi0vKioKLSAqIFRoZSBKQVhXU01lc3NhZ2VSZWNlaXZlciBpcyB0aGUgZW50cnkgcG9pbnQsIGZyb20gdGhlIHNlcnZlcidzIHBlcnNwZWN0aXZlLCB0byB0aGUgSkFYLVdTIGNvZGUuCi0gKiBUaGlzIHdpbGwgYmUgY2FsbGVkIGJ5IHRoZSBBeGlzIEVuZ2luZSBhbmQgaXMgdGhlIGVuZCBvZiB0aGUgY2hhaW4gZnJvbSBhbiBBeGlzMiBwZXJzcGVjdGl2ZS4KLSAqLwotcHVibGljIGNsYXNzIEpBWFdTTWVzc2FnZVJlY2VpdmVyIGltcGxlbWVudHMgTWVzc2FnZVJlY2VpdmVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhKQVhXU01lc3NhZ2VSZWNlaXZlci5jbGFzcyk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgUEFSQU1fU0VSVklDRV9DTEFTUyA9ICJTZXJ2aWNlQ2xhc3MiOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFBBUkFNX0JJTkRJTkcgPSAiQmluZGluZyI7Ci0KLSAgICAvKioKLSAgICAgKiBXZSBzaG91bGQgaGF2ZSBhbHJlYWR5IGRldGVybWluZWQgd2hpY2ggQXhpc1NlcnZpY2Ugd2UncmUgdGFyZ2V0dGluZyBhdCB0aGlzIHBvaW50LiAgU28gbm93LAotICAgICAqIGp1c3QgZ2V0IHRoZSBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIGFuZCBpbnZva2UgdGhlIGFwcHJvcHJpYXRlIG1ldGhvZC4KLSAgICAgKiBAcGFyYW0gYXhpc1JlcXVlc3RNc2dDdHgKLSAgICAgKiBAdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVjZWl2ZShvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQgYXhpc1JlcXVlc3RNc2dDdHgpCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgQXhpc0ZhdWx0IGZhdWx0VG9SZXR1cm4gPSBudWxsOwotCi0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJuZXcgcmVxdWVzdCByZWNlaXZlZCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy9HZXQgdGhlIG5hbWUgb2YgdGhlIHNlcnZpY2UgaW1wbCB0aGF0IHdhcyBzdG9yZWQgYXMgYSBwYXJhbWV0ZXIKLSAgICAgICAgLy8gaW5zaWRlIG9mIHRoZSBzZXJ2aWNlcy54bWwuCi0gICAgICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2UgPSBheGlzUmVxdWVzdE1zZ0N0eC5nZXRBeGlzU2VydmljZSgpOwotICAgICAgICAKLSAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5QYXJhbWV0ZXIgc3ZjQ2xhc3NQYXJhbSA9Ci0gICAgICAgICAgICAgICAgc2VydmljZS5nZXRQYXJhbWV0ZXIoUEFSQU1fU0VSVklDRV9DTEFTUyk7Ci0KLSAgICAgICAgaWYgKHN2Y0NsYXNzUGFyYW0gPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoIkpBWFdTTWVzc2FnZVJlY2VpdmVyTm9TZXJ2aWNlQ2xhc3MiKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBQYXJhbWV0ZXIgZW5kcG9pbnREZXNjUGFyYW0gPQotICAgICAgICAgICAgICAgIHNlcnZpY2UuZ2V0UGFyYW1ldGVyKEVuZHBvaW50RGVzY3JpcHRpb24uQVhJU19TRVJWSUNFX1BBUkFNRVRFUik7Ci0gICAgICAgIGlmIChlbmRwb2ludERlc2NQYXJhbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJKQVhXU01lc3NhZ2VSZWNlaXZlck5vU2VydmljZUNsYXNzIikpOwotICAgICAgICB9Ci0gICAgICAgIEF4aXNPcGVyYXRpb24gb3BlcmF0aW9uID0gYXhpc1JlcXVlc3RNc2dDdHguZ2V0QXhpc09wZXJhdGlvbigpOwotICAgICAgICBTdHJpbmcgbWVwID0gb3BlcmF0aW9uLmdldE1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4oKTsKLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIk1FUDogIiArIG1lcCk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotCi0gICAgICAgICAgICAvL1RoaXMgYXNzdW1lcyB0aGF0IHdlIGFyZSBvbiB0aGUgdWx0aW1hdGUgZXhlY3V0aW9uIHRocmVhZAotICAgICAgICAgICAgVGhyZWFkQ29udGV4dE1pZ3JhdG9yVXRpbC5wZXJmb3JtTWlncmF0aW9uVG9UaHJlYWQoCi0gICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5USFJFQURfQ09OVEVYVF9NSUdSQVRPUl9MSVNUX0lELCBheGlzUmVxdWVzdE1zZ0N0eCk7Ci0KLSAgICAgICAgICAgIC8vV2UnbGwgbmVlZCBhbiBpbnN0YW5jZSBvZiB0aGUgRW5kcG9pbnRDb250cm9sbGVyIHRvIGFjdHVhbGx5Ci0gICAgICAgICAgICAvL2RyaXZlIHRoZSBpbnZvY2F0aW9uLgotICAgICAgICAgICAgLy9UT0RPOiBNb3JlIHdvcmsgbmVlZGVkIHRvIGRldGVybWluZSB0aGUgbGlmZWN5Y2xlIG9mIHRoaXMgdGhpbmcKLSAgICAgICAgICAgIEVuZHBvaW50Q29udHJvbGxlciBlbmRwb2ludEN0bHIgPSBuZXcgRW5kcG9pbnRDb250cm9sbGVyKCk7Ci0KLSAgICAgICAgICAgIE1lc3NhZ2VDb250ZXh0IHJlcXVlc3RNc2dDdHggPSBuZXcgTWVzc2FnZUNvbnRleHQoYXhpc1JlcXVlc3RNc2dDdHgpOwotICAgICAgICAgICAgcmVxdWVzdE1zZ0N0eC5zZXRTZXJ2ZXIodHJ1ZSk7Ci0gICAgICAgICAgICByZXF1ZXN0TXNnQ3R4LnNldE1FUENvbnRleHQobmV3IE1FUENvbnRleHQocmVxdWVzdE1zZ0N0eCkpOwotICAgICAgICAgICAgQ2xhc3NMb2FkZXIgbG9hZGVyID0gZ2V0Q2FjaGVkQ2xhc3NMb2FkZXIoYXhpc1JlcXVlc3RNc2dDdHgpOwotICAgICAgICAgICAgaWYgKGxvYWRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmVxdWVzdE1zZ0N0eC5zZXRQcm9wZXJ0eShvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNwaS5Db25zdGFudHMuQ0FDSEVfQ0xBU1NMT0FERVIsCi0gICAgICAgICAgICAgICAgICAgICAgICBsb2FkZXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gVGhlIGFkYXB0ZXJzIG5lZWQgdG8gYmUgaW5zdGFsbGVkIG9uIHRoZSBuZXcgcmVxdWVzdCBNZXNzYWdlIENvbnRleHQKLSAgICAgICAgICAgIEF0dGFjaG1lbnRzQWRhcHRlci5pbnN0YWxsKHJlcXVlc3RNc2dDdHgpOwotICAgICAgICAgICAgVHJhbnNwb3J0SGVhZGVyc0FkYXB0ZXIuaW5zdGFsbChyZXF1ZXN0TXNnQ3R4KTsKLSAgICAgICAgICAgIFNPQVBIZWFkZXJzQWRhcHRlci5pbnN0YWxsKHJlcXVlc3RNc2dDdHgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBCaW5kaW5nIGJpbmRpbmcgPSAoQmluZGluZylheGlzUmVxdWVzdE1zZ0N0eC5nZXRQcm9wZXJ0eShQQVJBTV9CSU5ESU5HKTsKLSAgICAgICAgICAgIEVuZHBvaW50SW52b2NhdGlvbkNvbnRleHQgZWljID0gSW52b2NhdGlvbkNvbnRleHRGYWN0b3J5LmNyZWF0ZUVuZHBvaW50SW52b2NhdGlvbkNvbnRleHQoYmluZGluZyk7Ci0gICAgICAgICAgICBhZGRJbnZvY2F0aW9uTGlzdGVuZXJGYWN0b3JpZXMoZWljKTsKLSAgICAgICAgICAgIGVpYy5zZXRSZXF1ZXN0TWVzc2FnZUNvbnRleHQocmVxdWVzdE1zZ0N0eCk7Ci0KLSAgICAgICAgICAgIC8vIFdBUk5JTkc6IFRoaXMgc2hvdWxkIGJlIGxlZnQgZGlzYWJsZWQgZm9yIG5vdy4gIFRoaXMgbG9ja3MgdGhlIHNlcnZlciBzaWRlCi0gICAgICAgICAgICAvLyBpbnRvIGEgc2luZ2xlIHRocmVhZGVkIGludm9jYXRpb24uCi0gICAgICAgICAgICBlaWMuZ2V0UmVxdWVzdE1lc3NhZ2VDb250ZXh0KCkuc2V0UHJvcGVydHkoU2VydmVyQ29uc3RhbnRzLlNFUlZFUl9ESVNBQkxFX1RIUkVBRF9TV0lUQ0gsIHRydWUpOwotCi0gICAgICAgICAgICBpZiAoaXNNZXBJbk9ubHkobWVwKSkgewotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkRldGVjdGVkIGEgb25lIHdheSBpbnZvY2F0aW9uLiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlaWMuc2V0SXNPbmVXYXkodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgZW5kcG9pbnRDdGxyLmludm9rZU9uZVdheShlaWMpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChKYXZhVXRpbHMuaXNUcnVlRXhwbGljaXRseShheGlzUmVxdWVzdE1zZ0N0eC5nZXRQcm9wZXJ0eSgKLSAgICAgICAgICAgICAgICBBZGRyZXNzaW5nQ29uc3RhbnRzLklTX0FERFJfSU5GT19BTFJFQURZX1BST0NFU1NFRCkpCi0gICAgICAgICAgICAgICAgJiYgKGF4aXNSZXF1ZXN0TXNnQ3R4LmdldFJlcGx5VG8oKSAhPSBudWxsCi0gICAgICAgICAgICAgICAgJiYgIWF4aXNSZXF1ZXN0TXNnQ3R4LmdldFJlcGx5VG8oKS5oYXNBbm9ueW1vdXNBZGRyZXNzKCkpKSB7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiRGV0ZWN0ZWQgYW4gYXN5bmMgaW52b2NhdGlvbi4iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgRW5kcG9pbnRDYWxsYmFjayBlY2IgPSBuZXcgRW5kcG9pbnRDYWxsYmFjaygpOwotICAgICAgICAgICAgICAgIGVpYy5zZXRDYWxsYmFjayhlY2IpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGVuZHBvaW50Q3Rsci5pbnZva2VBc3luYyhlaWMpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJEZXRlY3RlZCBhIHN5bmMgaW52b2NhdGlvbi4iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWljID0gZW5kcG9pbnRDdGxyLmludm9rZShlaWMpOwotCi0gICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBpcyBhIHR3by13YXkgZXhjaGFuZ2UsIHRoZXJlIHNob3VsZCBhbHJlYWR5IGJlIGEgCi0gICAgICAgICAgICAgICAgLy8gSkFYLVdTIE1lc3NhZ2VDb250ZXh0IGZvciB0aGUgcmVzcG9uc2UuICBXZSBuZWVkIHRvIHB1bGwgCi0gICAgICAgICAgICAgICAgLy8gdGhlIE1lc3NhZ2UgZGF0YSBvdXQgb2YgdGhlcmUgYW5kIHNldCBpdCBvbiB0aGUgQXhpczIgCi0gICAgICAgICAgICAgICAgLy8gTWVzc2FnZUNvbnRleHQuCi0gICAgICAgICAgICAgICAgTWVzc2FnZUNvbnRleHQgcmVzcG9uc2VNc2dDdHggPSBlaWMuZ2V0UmVzcG9uc2VNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dCBheGlzUmVzcG9uc2VNc2dDdHggPQotICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VNc2dDdHguZ2V0QXhpc01lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKGxvYWRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlTXNnQ3R4LnNldFByb3BlcnR5KG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc3BpLkNvbnN0YW50cy5DQUNIRV9DTEFTU0xPQURFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBNZXNzYWdlVXRpbHMucHV0TWVzc2FnZU9uTWVzc2FnZUNvbnRleHQocmVzcG9uc2VNc2dDdHguZ2V0TWVzc2FnZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzUmVzcG9uc2VNc2dDdHgpOwotCi0gICAgICAgICAgICAgICAgT3BlcmF0aW9uQ29udGV4dCBvcEN0eCA9IGF4aXNSZXNwb25zZU1zZ0N0eC5nZXRPcGVyYXRpb25Db250ZXh0KCk7Ci0gICAgICAgICAgICAgICAgb3BDdHguYWRkTWVzc2FnZUNvbnRleHQoYXhpc1Jlc3BvbnNlTXNnQ3R4KTsKLQotICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgaXMgYSBmYXVsdCBtZXNzYWdlLCB3ZSB3YW50IHRvIHRocm93IGl0IGFzIGFuCi0gICAgICAgICAgICAgICAgLy8gZXhjZXB0aW9uIHNvIHRoYXQgdGhlIHRyYW5zcG9ydCBjYW4gZG8gdGhlIGFwcHJvcHJpYXRlIHRoaW5ncwotICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZU1zZ0N0eC5nZXRNZXNzYWdlKCkuaXNGYXVsdCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAvL1JhdGhlciB0aGFuIGNyZWF0ZSBhIG5ldyBBeGlzRmF1bHQsIHdlIHNob3VsZCB1c2UgdGhlIEF4aXNGYXVsdCB0aGF0IHdhcwotICAgICAgICAgICAgICAgICAgICAvL2NyZWF0ZWQgYXQgdGhlIGNhdXNlZEJ5Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZU1zZ0N0eC5nZXRDYXVzZWRCeUV4Y2VwdGlvbigpICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICBmYXVsdFRvUmV0dXJuID0gcmVzcG9uc2VNc2dDdHguZ2V0Q2F1c2VkQnlFeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmYXVsdFRvUmV0dXJuID0gbmV3IEF4aXNGYXVsdCgiQW4gZXJyb3Igd2FzIGRldGVjdGVkIGR1cmluZyBKQVhXUyBwcm9jZXNzaW5nIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzUmVzcG9uc2VNc2dDdHgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy9UaGlzIGFzc3VtZXMgdGhhdCB3ZSBhcmUgb24gdGhlIHVsdGltYXRlIGV4ZWN1dGlvbiB0aHJlYWQKLSAgICAgICAgICAgICAgICAgICAgVGhyZWFkQ29udGV4dE1pZ3JhdG9yVXRpbC5wZXJmb3JtTWlncmF0aW9uVG9Db250ZXh0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5USFJFQURfQ09OVEVYVF9NSUdSQVRPUl9MSVNUX0lELCBheGlzUmVzcG9uc2VNc2dDdHgpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vQ3JlYXRlIHRoZSBBeGlzRW5naW5lIGZvciB0aGUgcmVwb25zZSBhbmQgc2VuZCBpdC4KLSAgICAgICAgICAgICAgICAgICAgQXhpc0VuZ2luZS5zZW5kKGF4aXNSZXNwb25zZU1zZ0N0eCk7Ci0gICAgICAgICAgICAgICAgICAgIC8vVGhpcyBhc3N1bWVzIHRoYXQgd2UgYXJlIG9uIHRoZSB1bHRpbWF0ZSBleGVjdXRpb24gdGhyZWFkCi0gICAgICAgICAgICAgICAgICAgIFRocmVhZENvbnRleHRNaWdyYXRvclV0aWwucGVyZm9ybUNvbnRleHRDbGVhbnVwKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5USFJFQURfQ09OVEVYVF9NSUdSQVRPUl9MSVNUX0lELCBheGlzUmVzcG9uc2VNc2dDdHgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgYWYpIHsKLSAgICAgICAgICAgIHRocm93IGFmOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgVGhyZWFkQ29udGV4dE1pZ3JhdG9yVXRpbC5wZXJmb3JtVGhyZWFkQ2xlYW51cCgKLSAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLlRIUkVBRF9DT05URVhUX01JR1JBVE9SX0xJU1RfSUQsIGF4aXNSZXF1ZXN0TXNnQ3R4KTsKLQotICAgICAgICAgICAgLy9lLnByaW50U3RhY2tUcmFjZSgpOwotCi0gICAgICAgICAgICAvLyBUT0RPLiAgVGhpcyBpcyB0aHJvd2luZyBhIGNsaWVudCBleGNlcHRpb24gPwotICAgICAgICAgICAgLy8gVE9ETyBXaHkgYXJlIHdlIHByZXNlcnZpbmcgdGhlIHN0YWNrIGluZm9ybWF0aW9uICA/ICAKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gTWFrZSBhIHdlYnNlcnZpY2UgZXhjZXB0aW9uICh3aGljaCB3aWxsIHN0cmlwIG91dCBhIHVubmVjZXNzYXJ5IHN0dWZmKQotICAgICAgICAgICAgV2ViU2VydmljZUV4Y2VwdGlvbiB3c2UgPSBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOwotCi0gICAgICAgICAgICAvLyBUaGUgQXhpc0VuZ2luZSBleHBlY3RzIGFuIEF4aXNGYXVsdAotICAgICAgICAgICAgdGhyb3cgQXhpc0ZhdWx0Lm1ha2VGYXVsdCh3c2UpOwotCi0gICAgICAgIH0KLQotICAgICAgICAvL1RoaXMgYXNzdW1lcyB0aGF0IHdlIGFyZSBvbiB0aGUgdWx0aW1hdGUgZXhlY3V0aW9uIHRocmVhZAotICAgICAgICBUaHJlYWRDb250ZXh0TWlncmF0b3JVdGlsCi0gICAgICAgICAgICAgICAgLnBlcmZvcm1UaHJlYWRDbGVhbnVwKENvbnN0YW50cy5USFJFQURfQ09OVEVYVF9NSUdSQVRPUl9MSVNUX0lELCBheGlzUmVxdWVzdE1zZ0N0eCk7Ci0KLSAgICAgICAgaWYgKGZhdWx0VG9SZXR1cm4gIT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgZmF1bHRUb1JldHVybjsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzTWVwSW5Pbmx5KFN0cmluZyBtZXApIHsKLSAgICAgICAgYm9vbGVhbiBpbk9ubHkgPSBtZXAuZXF1YWxzKFdTREwyMF8yMDA0X0NvbnN0YW50cy5NRVBfVVJJX1JPQlVTVF9JTl9PTkxZKSB8fAotICAgICAgICAgICAgICAgIG1lcC5lcXVhbHMoV1NETDIwXzIwMDRfQ29uc3RhbnRzLk1FUF9VUklfSU5fT05MWSkgfHwKLSAgICAgICAgICAgICAgICBtZXAuZXF1YWxzKFdTREwyQ29uc3RhbnRzLk1FUF9VUklfSU5fT05MWSkgfHwKLSAgICAgICAgICAgICAgICBtZXAuZXF1YWxzKFdTREwyQ29uc3RhbnRzLk1FUF9VUklfUk9CVVNUX0lOX09OTFkpIHx8Ci0gICAgICAgICAgICAgICAgbWVwLmVxdWFscyhXU0RMMjBfMjAwNkNvbnN0YW50cy5NRVBfVVJJX1JPQlVTVF9JTl9PTkxZKSB8fAotICAgICAgICAgICAgICAgIG1lcC5lcXVhbHMoV1NETDIwXzIwMDZDb25zdGFudHMuTUVQX1VSSV9JTl9PTkxZKTsKLSAgICAgICAgcmV0dXJuIGluT25seTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0cmlldmVzIHRoZSByZWdpc3RlcmVkIEludm9jYXRpb25MaXN0ZW5lckZhY3RvcnkgaW5zdGFuY2VzIGFuZCBzZXRzIHRoZW0KLSAgICAgKiBvbiB0aGUgY3VycmVudCBFbmRwb2ludEludm9jYXRpb25Db250ZXh0LgotICAgICAqIEBwYXJhbSBlaWMKLSAgICAgKi8KLSAgICB2b2lkIGFkZEludm9jYXRpb25MaXN0ZW5lckZhY3RvcmllcyhFbmRwb2ludEludm9jYXRpb25Db250ZXh0IGVpYykgewotICAgICAgICBlaWMuc2V0SW52b2NhdGlvbkxpc3RlbmVyRmFjdG9yaWVzKEludm9jYXRpb25MaXN0ZW5lclJlZ2lzdHJ5LmdldEZhY3RvcmllcygpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2xhc3NMb2FkZXIgZ2V0Q2FjaGVkQ2xhc3NMb2FkZXIob3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHsKLSAgICAgICAgcmV0dXJuIChDbGFzc0xvYWRlcikgbXNnQ29udGV4dC5nZXRBeGlzU2VydmljZSgpLmdldFBhcmFtZXRlclZhbHVlKG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc3BpLkNvbnN0YW50cy5DQUNIRV9DTEFTU0xPQURFUik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2VydmVyL1NlcnZlckNvbnN0YW50cy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2VydmVyL1NlcnZlckNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODc3M2RlLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NlcnZlci9TZXJ2ZXJDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2VydmVyOw0KLQ0KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJDb25zdGFudHMgew0KLQ0KLSAgICAvKioNCi0gICAgICogQSBjb25zdGFudCBmb3IgdGhlIHByb3BlcnR5IHVzZWQgdG8gZGlzYWJsZSB0aGUgc2VydmVyIHNpZGUNCi0gICAgICogdGhyZWFkIHN3aXRjaCBvbiBhc3luYyBhbmQgb25lIHdheSByZXF1ZXN0cy4gIFRoaXMgcHJvcGVydHkNCi0gICAgICogbXVzdCBiZSBzZXQgb24gdGhlIE1lc3NhZ2VDb250ZXh0IGZvciB0aGUgcmVxdWVzdC4NCi0gICAgICovDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZFUl9ESVNBQkxFX1RIUkVBRF9TV0lUQ0ggPSAic2VydmVyRGlzYWJsZVRocmVhZFN3aXRjaCI7DQotICAgIA0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zZXJ2ZXIvU2VydmljZUluc3RhbmNlRmFjdG9yeS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2VydmVyL1NlcnZpY2VJbnN0YW5jZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFmMzQxOS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zZXJ2ZXIvU2VydmljZUluc3RhbmNlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zZXJ2ZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS5NZXNzYWdlQ29udGV4dDsNCi0NCi0vKioNCi0gKiBDb2RlIHdpc2hpbmcgdG8gY3JlYXRlIHdlYiBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIGluc3RhbmNlcyBmb3IgSkFYLVdTDQotICogcmVxdWVzdHMgbXVzdCBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UgYW5kIHJlZ2lzdGVyIGl0IHdpdGggdGhlIHRoZQ0KLSAqIEpBWC1XUyBGYWN0b3J5UmVnaXN0cnkuIFRoZSBpbnN0YW5jZSBvZiB0aGlzIGZhY3Rvcnkgd2lsbCBiZSBsb29rZWQgdXANCi0gKiBhbmQgdXRpbGl6ZWQgYnkgdGhlIEpBWC1XUyBydW50aW1lIGluIG9yZGVyIHRvIGNyZWF0ZSBvciBvdGhlcndpc2UNCi0gKiBvYnRhaW4gYSB3ZWIgc2VydmljZSBpbXBsZW1lbnRhdGlvbiBpbnN0YW5jZSBmb3IgYW55IHJlcXVlc3QuDQotICoNCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIFNlcnZpY2VJbnN0YW5jZUZhY3Rvcnkgew0KLQ0KLSAgICAgICAgLyoqDQotICAgICAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGNyZWF0ZSwgb3Igb3RoZXJ3aXNlIG9idGFpbiBhIHJlZmVyZW5jZSB0byBhbiANCi0gICAgICAgICAqIGluc3RhbmNlIG9mIGEgd2ViIHNlcnZpY2UgaW1wbGVtZW50YXRpb24gY2xhc3MuIFRoZSBleHBlY3RhdGlvbg0KLSAgICAgICAgICogaXMgdGhhdCB1cG9uIHRoZSBjb21wbGV0aW9uIG9mIHRoaXMgbWV0aG9kIHRoZXJlIHdpbGwgYmUgYSB3ZWINCi0gICAgICAgICAqIHNlcnZpY2UgaW1wbGVtZW50YXRpb24gaW5zdGFuY2UgY3JldGFlZCBhbmQgYWxsIG5lY2Vzc2FyeSByZXNvdXJjZQ0KLSAgICAgICAgICogaW5qZWN0aW9uIHdpbGwgaGF2ZSB0YWtlbiBwbGFjZS4NCi0gICAgICAgICAqLw0KLSAgICAgICAgcHVibGljIE9iamVjdCBjcmVhdGVTZXJ2aWNlSW5zdGFuY2UoTWVzc2FnZUNvbnRleHQgcmVxdWVzdCwgQ2xhc3Mgc2VydmljZUNsYXNzKSANCi0gICAgICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbjsNCi0gICAgICAgIA0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zZXJ2ZXIvU2VydmljZUluc3RhbmNlRmFjdG9yeUltcGwuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NlcnZlci9TZXJ2aWNlSW5zdGFuY2VGYWN0b3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzA2NWZiLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NlcnZlci9TZXJ2aWNlSW5zdGFuY2VGYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zZXJ2ZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS5NZXNzYWdlQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5yZWdpc3RyeS5GYWN0b3J5UmVnaXN0cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2VydmVyLmVuZHBvaW50LmxpZmVjeWNsZS5FbmRwb2ludExpZmVjeWNsZU1hbmFnZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2VydmVyLmVuZHBvaW50LmxpZmVjeWNsZS5mYWN0b3J5LkVuZHBvaW50TGlmZWN5Y2xlTWFuYWdlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi0vKioNCi0gKiBUaGlzIGNsYXNzIHdpbGwgYmUgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIGFuIGluc3RhbmNlIG9mDQotICogYSB3ZWIgc2VydmljZSBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgZWFjaCBpbmNvbWluZyByZXF1ZXN0DQotICogaW50byB0aGUgSkFYLVdTIHJ1bnRpbWUuDQotICoNCi0gKi8NCi1wdWJsaWMgY2xhc3MgU2VydmljZUluc3RhbmNlRmFjdG9yeUltcGwgaW1wbGVtZW50cyBTZXJ2aWNlSW5zdGFuY2VGYWN0b3J5IHsNCi0gICAgICAgIA0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFNlcnZpY2VJbnN0YW5jZUZhY3RvcnlJbXBsLmNsYXNzKTsNCi0NCi0gICAgICAgIHB1YmxpYyBPYmplY3QgY3JlYXRlU2VydmljZUluc3RhbmNlKE1lc3NhZ2VDb250ZXh0IHJlcXVlc3QsIENsYXNzIHNlcnZpY2VDbGFzcykgdGhyb3dzIA0KLSAgICAgICAgICAgICAgICBFeGNlcHRpb24gDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYobG9nLmlzRGVidWdFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJDcmVhdGluZyB3ZWIgc2VydmljZSBpbXBsZW1lbnRhdGlvbiBpbnN0YW5jZSBmb3I6ICIgKyBzZXJ2aWNlQ2xhc3MuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXROYW1lKCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBFbmRwb2ludExpZmVjeWNsZU1hbmFnZXJGYWN0b3J5IGVsbWYgPSAoRW5kcG9pbnRMaWZlY3ljbGVNYW5hZ2VyRmFjdG9yeSkgDQotICAgICAgICAgICAgICAgIEZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KEVuZHBvaW50TGlmZWN5Y2xlTWFuYWdlckZhY3RvcnkuY2xhc3MpOw0KLSAgICAgICAgICAgIEVuZHBvaW50TGlmZWN5Y2xlTWFuYWdlciBlbG0gPSBlbG1mLmNyZWF0ZUVuZHBvaW50TGlmZWN5Y2xlTWFuYWdlcigpOw0KLSAgICAgICAgICAgIHJldHVybiBlbG0uY3JlYXRlU2VydmljZUluc3RhbmNlKHJlcXVlc3QsIHNlcnZpY2VDbGFzcyk7DQotICAgICAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NlcnZlci9kaXNwYXRjaGVyL0VuZHBvaW50RGlzcGF0Y2hlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2VydmVyL2Rpc3BhdGNoZXIvRW5kcG9pbnREaXNwYXRjaGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlZWM0ZWUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2VydmVyL2Rpc3BhdGNoZXIvRW5kcG9pbnREaXNwYXRjaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2VydmVyLmRpc3BhdGNoZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zZXJ2ZXIuRW5kcG9pbnRDYWxsYmFjazsKLQotLyoqCi0gKiBUaGUgRW5kcG9pbnREaXNwYXRjaGVyIGlzIGFuIGFic3RyYWN0aW9uIGZvciB0aGUgb2JqZWN0IHRoYXQgd2lsbCBiZSBkb2luZyB0aGUgaW52b2NhdGlvbiBvZiBhbgotICogZW5kcG9pbnRzIHRhcmdldCBKYXZhIG9iamVjdC4KLSAqLwotcHVibGljIGludGVyZmFjZSBFbmRwb2ludERpc3BhdGNoZXIgewotCi0gICAgLyoqCi0gICAgICogSW52b2tlIHRoZSB0YXJnZXQgZW5kcG9pbnQgc3luY2hyb25vdXNseQotICAgICAqCi0gICAgICogQHBhcmFtIG1jCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBNZXNzYWdlQ29udGV4dCBpbnZva2UoTWVzc2FnZUNvbnRleHQgcmVxdWVzdCkgdGhyb3dzIEV4Y2VwdGlvbjsKLSAgICAKLSAgICBwdWJsaWMgdm9pZCBpbnZva2VPbmVXYXkoTWVzc2FnZUNvbnRleHQgcmVxdWVzdCk7Ci0gICAgCi0gICAgcHVibGljIHZvaWQgaW52b2tlQXN5bmMoTWVzc2FnZUNvbnRleHQgcmVxdWVzdCwgRW5kcG9pbnRDYWxsYmFjayBjYWxsYmFjayk7Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NlcnZlci9kaXNwYXRjaGVyL0phdmFCZWFuRGlzcGF0Y2hlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2VydmVyL2Rpc3BhdGNoZXIvSmF2YUJlYW5EaXNwYXRjaGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZWZhMjkuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2VydmVyL2Rpc3BhdGNoZXIvSmF2YUJlYW5EaXNwYXRjaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNlcnZlci5kaXNwYXRjaGVyOwotCi0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLkV4Y2VwdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5iaW5kaW5nLkJpbmRpbmdVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvbnRleHQudXRpbHMuQ29udGV4dFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUudXRpbC5NZXNzYWdlQ29udGV4dFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRW5kcG9pbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLk9wZXJhdGlvbkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaTE4bi5NZXNzYWdlczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1hcnNoYWxsZXIuTWV0aG9kTWFyc2hhbGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1hcnNoYWxsZXIuZmFjdG9yeS5NZXRob2RNYXJzaGFsbGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuTWVzc2FnZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuUHJvdG9jb2w7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5yZWdpc3RyeS5GYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zZXJ2ZXIuRW5kcG9pbnRDYWxsYmFjazsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNlcnZlci5FbmRwb2ludEludm9jYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2VydmVyLkludm9jYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zZXJ2ZXIuU2VydmVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2VydmVyLmVuZHBvaW50LlV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc3BpLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnV0aWxpdHkuRXhlY3V0b3JGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MudXRpbGl0eS5TaW5nbGVUaHJlYWRlZEV4ZWN1dG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZVRhc2s7Ci0KLS8qKgotICogVGhlIEphdmFCZWFuRGlzcGF0Y2hlciBpcyB1c2VkIHRvIG1hbmFnZSBjcmVhdGluZyBhbiBpbnN0YW5jZSBvZiBhIEpBWC1XUyBzZXJ2aWNlIGltcGxlbWVudGF0aW9uCi0gKiBiZWFuIGFuZCBkaXNwYXRjaGluZyB0aGUgaW5ib3VuZCByZXF1ZXN0IHRvIHRoYXQgaW5zdGFuY2UuCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhQmVhbkRpc3BhdGNoZXIgZXh0ZW5kcyBKYXZhRGlzcGF0Y2hlciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coSmF2YUJlYW5EaXNwYXRjaGVyLmNsYXNzKTsKLQotICAgIHByaXZhdGUgRW5kcG9pbnREZXNjcmlwdGlvbiBlbmRwb2ludERlc2MgPSBudWxsOwotCi0gICAgcHVibGljIEphdmFCZWFuRGlzcGF0Y2hlcihDbGFzcyBpbXBsQ2xhc3MsIE9iamVjdCBzZXJ2aWNlSW5zdGFuY2UpIHsKLSAgICAgICAgc3VwZXIoaW1wbENsYXNzLCBzZXJ2aWNlSW5zdGFuY2UpOwotICAgIH0KLQotICAgIC8qCi0gICAgKiAobm9uLUphdmFkb2MpCi0gICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2VydmVyLkVuZHBvaW50RGlzcGF0Y2hlciNpbnZva2Uob3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLk1lc3NhZ2VDb250ZXh0KQotICAgICovCi0gICAgcHVibGljIE1lc3NhZ2VDb250ZXh0IGludm9rZShNZXNzYWdlQ29udGV4dCBtYykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJJbnZva2luZyBzZXJ2aWNlIGVuZHBvaW50OiAiICsgc2VydmljZUltcGxDbGFzcy5nZXROYW1lKCkpOwotICAgICAgICAgICAgbG9nLmRlYnVnKCJJbnZvY2F0aW9uIHBhdHRlcm46IHR3byB3YXksIHN5bmMiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGluaXRpYWxpemUobWMpOwotICAgICAgICAKLSAgICAgICAgT3BlcmF0aW9uRGVzY3JpcHRpb24gb3BlcmF0aW9uRGVzYyA9IFV0aWxzLmdldE9wZXJhdGlvbkRlc2NyaXB0aW9uKG1jKTsKLSAgICAgICAgCi0gICAgICAgIE9iamVjdFtdIG1ldGhvZElucHV0UGFyYW1zID0gY3JlYXRlUmVxdWVzdFBhcmFtZXRlcnMobWMpOwotICAgICAgICAKLSAgICAgICAgTWV0aG9kIHRhcmdldCA9IGdldEphdmFNZXRob2QobWMsIHNlcnZpY2VJbXBsQ2xhc3MpOwotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIC8vIEF0IHRoaXMgcG9pbnQsIHRoZSBPcERlc2MgaW5jbHVkZXMgZXZlcnl0aGluZyB3ZSBrbm93LCBpbmNsdWRpbmcgdGhlIGFjdHVhbCBtZXRob2QKLSAgICAgICAgICAgIC8vIG9uIHRoZSBzZXJ2aWNlIGltcGwgd2Ugd2lsbCBkZWxlZ2F0ZSB0bzsgaXQgd2FzIHNldCBieSBnZXRKYXZhTWV0aG9kKC4uLikgYWJvdmUuCi0gICAgICAgICAgICBsb2cuZGVidWcoIkphdmFCZWFuRGlzcGF0Y2hlciBhYm91dCB0byBpbnZva2UgdXNpbmcgT3BlcmF0aW9uRGVzYzogIiArCi0gICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbkRlc2MudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBXZSBoYXZlIHRoZSBtZXRob2QgdGhhdCBpcyBnb2luZyB0byBiZSBpbnZva2VkIGFuZCB0aGUgcGFyYW1ldGVyIGRhdGEgdG8gaW52b2tlIGl0IAotICAgICAgICAvLyB3aXRoLCBzbyBqdXN0IGludm9rZSB0aGUgb3BlcmF0aW9uLgotICAgICAgICBib29sZWFuIGZhdWx0VGhyb3duID0gZmFsc2U7Ci0gICAgICAgIFRocm93YWJsZSBmYXVsdCA9IG51bGw7Ci0gICAgICAgIE9iamVjdCBvdXRwdXQgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgb3V0cHV0ID0gaW52b2tlVGFyZ2V0T3BlcmF0aW9uKHRhcmdldCwgbWV0aG9kSW5wdXRQYXJhbXMpOwotICAgICAgICB9IAotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLSAgICAgICAgICAgIGZhdWx0VGhyb3duID0gdHJ1ZTsKLSAgICAgICAgICAgIGZhdWx0ID0gZTsKLSAgICAgICAgfQotCi0gICAgICAgIE1lc3NhZ2VDb250ZXh0IHJlc3BvbnNlID0gbnVsbDsKLSAgICAgICAgaWYgKG9wZXJhdGlvbkRlc2MuaXNPbmVXYXkoKSkgewotICAgICAgICAgICAgLy8gSWYgdGhlIG9wZXJhdGlvbiBpcyBvbmUtd2F5LCB0aGVuIHdlIGNhbiBqdXN0IHJldHVybiBudWxsIGJlY2F1c2UKLSAgICAgICAgICAgIC8vIHdlIGNhbm5vdCBjcmVhdGUgYSBNZXNzYWdlQ29udGV4dCBmb3Igb25lLXdheSByZXNwb25zZXMuCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfSBlbHNlIGlmIChmYXVsdFRocm93bikgewotICAgICAgICAgICAgcmVzcG9uc2UgPSBjcmVhdGVGYXVsdFJlc3BvbnNlKG1jLCBtYy5nZXRNZXNzYWdlKCkuZ2V0UHJvdG9jb2woKSwgZmF1bHQpOwotICAgICAgICAgICAgc2V0RXhjZXB0aW9uUHJvcGVydGllcyhyZXNwb25zZSwgdGFyZ2V0LCBmYXVsdCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXNwb25zZSA9IGNyZWF0ZVJlc3BvbnNlKG1jLCBtYy5nZXRNZXNzYWdlKCkuZ2V0UHJvdG9jb2woKSwgbWV0aG9kSW5wdXRQYXJhbXMsIG91dHB1dCk7Ci0gICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgcmV0dXJuIHJlc3BvbnNlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGludm9rZU9uZVdheShNZXNzYWdlQ29udGV4dCByZXF1ZXN0KSB7Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJJbnZva2luZyBzZXJ2aWNlIGVuZHBvaW50OiAiICsgc2VydmljZUltcGxDbGFzcy5nZXROYW1lKCkpOwotICAgICAgICAgICAgbG9nLmRlYnVnKCJJbnZvY2F0aW9uIHBhdHRlcm46IG9uZSB3YXkiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGluaXRpYWxpemUocmVxdWVzdCk7Ci0gICAgICAgIAotICAgICAgICBPcGVyYXRpb25EZXNjcmlwdGlvbiBvcGVyYXRpb25EZXNjID0gVXRpbHMuZ2V0T3BlcmF0aW9uRGVzY3JpcHRpb24ocmVxdWVzdCk7Ci0gICAgICAgIAotICAgICAgICBPYmplY3RbXSBtZXRob2RJbnB1dFBhcmFtcyA9IGNyZWF0ZVJlcXVlc3RQYXJhbWV0ZXJzKHJlcXVlc3QpOwotICAgICAgICAKLSAgICAgICAgTWV0aG9kIHRhcmdldCA9IGdldEphdmFNZXRob2QocmVxdWVzdCwgc2VydmljZUltcGxDbGFzcyk7Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgLy8gQXQgdGhpcyBwb2ludCwgdGhlIE9wRGVzYyBpbmNsdWRlcyBldmVyeXRoaW5nIHdlIGtub3csIGluY2x1ZGluZyB0aGUgYWN0dWFsIG1ldGhvZAotICAgICAgICAgICAgLy8gb24gdGhlIHNlcnZpY2UgaW1wbCB3ZSB3aWxsIGRlbGVnYXRlIHRvOyBpdCB3YXMgc2V0IGJ5IGdldEphdmFNZXRob2QoLi4uKSBhYm92ZS4KLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiSmF2YUJlYW5EaXNwYXRjaGVyIGFib3V0IHRvIGludm9rZSB1c2luZyBPcGVyYXRpb25EZXNjOiAiCi0gICAgICAgICAgICAgICAgICAgICsgb3BlcmF0aW9uRGVzYy50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgRW5kcG9pbnRJbnZvY2F0aW9uQ29udGV4dCBlaWMgPSAoRW5kcG9pbnRJbnZvY2F0aW9uQ29udGV4dCkgcmVxdWVzdC5nZXRJbnZvY2F0aW9uQ29udGV4dCgpOwotICAgICAgICBDbGFzc0xvYWRlciBjbCA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7Ci0gICAgICAgIAotICAgICAgICBBc3luY0ludm9jYXRpb25Xb3JrZXIgd29ya2VyID0gbmV3IEFzeW5jSW52b2NhdGlvbldvcmtlcih0YXJnZXQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RJbnB1dFBhcmFtcywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsLCBlaWMpOwotICAgICAgICBGdXR1cmVUYXNrIHRhc2sgPSBuZXcgRnV0dXJlVGFzazxBc3luY0ludm9jYXRpb25Xb3JrZXI+KHdvcmtlcik7Ci0gICAgICAgIAotICAgICAgICBFeGVjdXRvckZhY3RvcnkgZWYgPSAoRXhlY3V0b3JGYWN0b3J5KSBGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShFeGVjdXRvckZhY3RvcnkuY2xhc3MpOwotICAgICAgICBFeGVjdXRvciBleGVjdXRvciA9IGVmLmdldEV4ZWN1dG9ySW5zdGFuY2UoRXhlY3V0b3JGYWN0b3J5LlNFUlZFUl9FWEVDVVRPUik7Ci0gICAgICAgIAotICAgICAgICAvLyBJZiB0aGUgcHJvcGVydHkgaGFzIGJlZW4gc2V0IHRvIGRpc2FibGUgdGhyZWFkIHN3aXRjaGluZywgdGhlbiB3ZSBjYW4gCi0gICAgICAgIC8vIGRvIHNvIGJ5IHVzaW5nIGEgU2luZ2xlVGhyZWFkZWRFeGVjdXRvciBpbnN0YW5jZSB0byBjb250aW51ZSBwcm9jZXNzaW5nCi0gICAgICAgIC8vIHdvcmsgb24gdGhlIGV4aXN0aW5nIHRocmVhZC4KLSAgICAgICAgQm9vbGVhbiBkaXNhYmxlID0gKEJvb2xlYW4pIAotICAgICAgICAgICAgcmVxdWVzdC5nZXRQcm9wZXJ0eShTZXJ2ZXJDb25zdGFudHMuU0VSVkVSX0RJU0FCTEVfVEhSRUFEX1NXSVRDSCk7Ci0gICAgICAgIGlmIChkaXNhYmxlICE9IG51bGwgJiYgZGlzYWJsZS5ib29sZWFuVmFsdWUoKSkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJTZXJ2ZXIgc2lkZSB0aHJlYWQgc3dpdGNoIGRpc2FibGVkLiAgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTZXR0aW5nIEV4ZWN1dG9yIHRvIHRoZSBTaW5nbGVUaHJlYWRlZEV4ZWN1dG9yLiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZXhlY3V0b3IgPSBuZXcgU2luZ2xlVGhyZWFkZWRFeGVjdXRvcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgZXhlY3V0b3IuZXhlY3V0ZSh0YXNrKTsgICAgIAotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaW52b2tlQXN5bmMoTWVzc2FnZUNvbnRleHQgcmVxdWVzdCwgRW5kcG9pbnRDYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiSW52b2tpbmcgc2VydmljZSBlbmRwb2ludDogIiArIHNlcnZpY2VJbXBsQ2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiSW52b2NhdGlvbiBwYXR0ZXJuOiB0d28gd2F5LCBhc3luYyIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW5pdGlhbGl6ZShyZXF1ZXN0KTsKLSAgICAgICAgCi0gICAgICAgIE9wZXJhdGlvbkRlc2NyaXB0aW9uIG9wZXJhdGlvbkRlc2MgPSBVdGlscy5nZXRPcGVyYXRpb25EZXNjcmlwdGlvbihyZXF1ZXN0KTsKLSAgICAgICAgCi0gICAgICAgIE9iamVjdFtdIG1ldGhvZElucHV0UGFyYW1zID0gY3JlYXRlUmVxdWVzdFBhcmFtZXRlcnMocmVxdWVzdCk7Ci0gICAgICAgIAotICAgICAgICBNZXRob2QgdGFyZ2V0ID0gZ2V0SmF2YU1ldGhvZChyZXF1ZXN0LCBzZXJ2aWNlSW1wbENsYXNzKTsKLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAvLyBBdCB0aGlzIHBvaW50LCB0aGUgT3BEZXNjIGluY2x1ZGVzIGV2ZXJ5dGhpbmcgd2Uga25vdywgaW5jbHVkaW5nIHRoZSBhY3R1YWwgbWV0aG9kCi0gICAgICAgICAgICAvLyBvbiB0aGUgc2VydmljZSBpbXBsIHdlIHdpbGwgZGVsZWdhdGUgdG87IGl0IHdhcyBzZXQgYnkgZ2V0SmF2YU1ldGhvZCguLi4pIGFib3ZlLgotICAgICAgICAgICAgbG9nLmRlYnVnKCJKYXZhQmVhbkRpc3BhdGNoZXIgYWJvdXQgdG8gaW52b2tlIHVzaW5nIE9wZXJhdGlvbkRlc2M6ICIKLSAgICAgICAgICAgICAgICAgICAgKyBvcGVyYXRpb25EZXNjLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBFbmRwb2ludEludm9jYXRpb25Db250ZXh0IGVpYyA9IChFbmRwb2ludEludm9jYXRpb25Db250ZXh0KSByZXF1ZXN0LmdldEludm9jYXRpb25Db250ZXh0KCk7Ci0gICAgICAgIENsYXNzTG9hZGVyIGNsID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKLSAgICAgICAgCi0gICAgICAgIEFzeW5jSW52b2NhdGlvbldvcmtlciB3b3JrZXIgPSBuZXcgQXN5bmNJbnZvY2F0aW9uV29ya2VyKHRhcmdldCwgbWV0aG9kSW5wdXRQYXJhbXMsIGNsLCBlaWMpOwotICAgICAgICBGdXR1cmVUYXNrIHRhc2sgPSBuZXcgRnV0dXJlVGFzazxBc3luY0ludm9jYXRpb25Xb3JrZXI+KHdvcmtlcik7Ci0gICAgICAgIAotICAgICAgICBFeGVjdXRvckZhY3RvcnkgZWYgPSAoRXhlY3V0b3JGYWN0b3J5KSBGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShFeGVjdXRvckZhY3RvcnkuY2xhc3MpOwotICAgICAgICBFeGVjdXRvciBleGVjdXRvciA9IGVmLmdldEV4ZWN1dG9ySW5zdGFuY2UoRXhlY3V0b3JGYWN0b3J5LlNFUlZFUl9FWEVDVVRPUik7Ci0gICAgICAgIC8vIElmIHRoZSBwcm9wZXJ0eSBoYXMgYmVlbiBzZXQgdG8gZGlzYWJsZSB0aHJlYWQgc3dpdGNoaW5nLCB0aGVuIHdlIGNhbiAKLSAgICAgICAgLy8gZG8gc28gYnkgdXNpbmcgYSBTaW5nbGVUaHJlYWRlZEV4ZWN1dG9yIGluc3RhbmNlIHRvIGNvbnRpbnVlIHByb2Nlc3NpbmcKLSAgICAgICAgLy8gd29yayBvbiB0aGUgZXhpc3RpbmcgdGhyZWFkLgotICAgICAgICBCb29sZWFuIGRpc2FibGUgPSAoQm9vbGVhbikgcmVxdWVzdC5nZXRQcm9wZXJ0eShTZXJ2ZXJDb25zdGFudHMuU0VSVkVSX0RJU0FCTEVfVEhSRUFEX1NXSVRDSCk7Ci0gICAgICAgIGlmIChkaXNhYmxlICE9IG51bGwgJiYgZGlzYWJsZS5ib29sZWFuVmFsdWUoKSkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJTZXJ2ZXIgc2lkZSB0aHJlYWQgc3dpdGNoIGRpc2FibGVkLiAgU2V0dGluZyBFeGVjdXRvciB0byB0aGUgU2luZ2xlVGhyZWFkZWRFeGVjdXRvci4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGV4ZWN1dG9yID0gbmV3IFNpbmdsZVRocmVhZGVkRXhlY3V0b3IoKTsKLSAgICAgICAgfQotICAgICAgICBleGVjdXRvci5leGVjdXRlKHRhc2spOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKE1lc3NhZ2VDb250ZXh0IG1jKSB7Ci0gICAgICAgIG1jLnNldE9wZXJhdGlvbk5hbWUobWMuZ2V0QXhpc01lc3NhZ2VDb250ZXh0KCkuZ2V0QXhpc09wZXJhdGlvbigpLmdldE5hbWUoKSk7Ci0gICAgICAgIG1jLnNldE9wZXJhdGlvbkRlc2NyaXB0aW9uKFV0aWxzLmdldE9wZXJhdGlvbkRlc2NyaXB0aW9uKG1jKSk7Ci0gICAgICAgIGVuZHBvaW50RGVzYyA9IG1jLmdldEVuZHBvaW50RGVzY3JpcHRpb24oKTsKLSAgICAgICAgaWYgKGVuZHBvaW50RGVzYy5pc01UT01FbmFibGVkKCkpIHsKLSAgICAgICAgICAgIG1jLmdldE1lc3NhZ2UoKS5zZXRNVE9NRW5hYmxlZCh0cnVlKTsKLSAgICAgICAgfQotICAgICAgCi0gICAgICAgIAotICAgICAgICAvL1NldCBTT0FQIE9wZXJhdGlvbiBSZWxhdGVkIHByb3BlcnRpZXMgaW4gU09BUE1lc3NhZ2VDb250ZXh0LgotICAgICAgICBDb250ZXh0VXRpbHMuYWRkV1NETFByb3BlcnRpZXMobWMpOwotICAgIH0KLQotICAgIHByaXZhdGUgTWV0aG9kTWFyc2hhbGxlciBnZXRNZXRob2RNYXJzaGFsbGVyKFByb3RvY29sIHByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhdGlvbkRlc2NyaXB0aW9uIG9wZXJhdGlvbkRlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUNvbnRleHQgbWMpIHsKLSAgICAgICAgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuU3R5bGUgc3R5bGVPblNFSSA9Ci0gICAgICAgICAgICAgICAgZW5kcG9pbnREZXNjLmdldEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24oKS5nZXRTb2FwQmluZGluZ1N0eWxlKCk7Ci0gICAgICAgIGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlN0eWxlIHN0eWxlT25NZXRob2QgPSBvcGVyYXRpb25EZXNjLmdldFNvYXBCaW5kaW5nU3R5bGUoKTsKLSAgICAgICAgaWYgKHN0eWxlT25NZXRob2QgIT0gbnVsbCAmJiBzdHlsZU9uU0VJICE9IHN0eWxlT25NZXRob2QpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgicHJveHlFcnIyIikpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBjaGVjayBmb3IgYSBzdG9yZWQgY2xhc3Nsb2FkZXIgdG8gYmUgdXNlZCBhcyB0aGUgY2FjaGUga2V5Ci0gICAgICAgIENsYXNzTG9hZGVyIGNsID0gbnVsbDsKLSAgICAgICAgaWYobWMgIT0gbnVsbCkgewotICAgICAgICAgICAgY2wgPSAoQ2xhc3NMb2FkZXIpIG1jLmdldFByb3BlcnR5KENvbnN0YW50cy5DQUNIRV9DTEFTU0xPQURFUik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIE1ldGhvZE1hcnNoYWxsZXJGYWN0b3J5LmdldE1hcnNoYWxsZXIob3BlcmF0aW9uRGVzYywgZmFsc2UsIGNsKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgTWV0aG9kIGdldEphdmFNZXRob2QoTWVzc2FnZUNvbnRleHQgbWMsIENsYXNzIHNlcnZpY2VJbXBsQ2xhc3MpIHsKLQotICAgICAgICBPcGVyYXRpb25EZXNjcmlwdGlvbiBvcERlc2MgPSBtYy5nZXRPcGVyYXRpb25EZXNjcmlwdGlvbigpOwotICAgICAgICBpZiAob3BEZXNjID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgicHJveHlFcnIzIikpOwotICAgICAgICB9Ci0KLSAgICAgICAgTWV0aG9kIHJldHVybk1ldGhvZCA9IG9wRGVzYy5nZXRNZXRob2RGcm9tU2VydmljZUltcGwoc2VydmljZUltcGxDbGFzcyk7Ci0gICAgICAgIGlmIChyZXR1cm5NZXRob2QgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeQotICAgICAgICAgICAgICAgICAgICAubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiSmF2YUJlYW5EaXNwYXRjaGVyRXJyMSIpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXR1cm5NZXRob2Q7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgT2JqZWN0W10gY3JlYXRlUmVxdWVzdFBhcmFtZXRlcnMoTWVzc2FnZUNvbnRleHQgcmVxdWVzdCkgewotICAgICAgICAvLyBHZXQgdGhlIGFwcHJvcHJpYXRlIE1ldGhvZE1hcnNoYWxsZXIgZm9yIHRoZSBXU0RMIHR5cGUuICBUaGlzIHdpbGwgcmVmbGVjdAotICAgICAgICAvLyB0aGUgInN0eWxlIiBhbmQgInVzZSIgb2YgdGhlIFdTREwuCi0gICAgICAgIFByb3RvY29sIHJlcXVlc3RQcm90b2NvbCA9IHJlcXVlc3QuZ2V0TWVzc2FnZSgpLmdldFByb3RvY29sKCk7Ci0gICAgICAgIE1ldGhvZE1hcnNoYWxsZXIgbWV0aG9kTWFyc2hhbGxlciA9Ci0gICAgICAgICAgICAgICAgZ2V0TWV0aG9kTWFyc2hhbGxlcihyZXF1ZXN0UHJvdG9jb2wsIHJlcXVlc3QuZ2V0T3BlcmF0aW9uRGVzY3JpcHRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QpOwotICAgICAgICAKLSAgICAgICAgLy8gVGhlIE1ldGhvZE1hcnNoYWxsZXIgd2lsbCByZXR1cm4gdGhlIGlucHV0IHBhcmFtZXRlcnMgdGhhdCBhcmUgbmVlZGVkIHRvIAotICAgICAgICAvLyBpbnZva2UgdGhlIHRhcmdldCBtZXRob2QuCi0gICAgICAgIE9iamVjdFtdIG1ldGhvZElucHV0UGFyYW1zID0KLSAgICAgICAgICAgICAgICBtZXRob2RNYXJzaGFsbGVyLmRlbWFyc2hhbFJlcXVlc3QocmVxdWVzdC5nZXRNZXNzYWdlKCksIHJlcXVlc3QuZ2V0T3BlcmF0aW9uRGVzY3JpcHRpb24oKSk7Ci0gICAgICAgIAotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiVW5tYXJzaGFsbGVkIHBhcmFtZXRlcnMgZm9yIHJlcXVlc3QiKTsKLSAgICAgICAgICAgIGlmIChtZXRob2RJbnB1dFBhcmFtcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKG1ldGhvZElucHV0UGFyYW1zLmxlbmd0aCArICIgcGFyYW1ldGVycyB3ZXJlIGZvdW5kLiIpOyAgICAKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIG1ldGhvZElucHV0UGFyYW1zOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgTWVzc2FnZUNvbnRleHQgY3JlYXRlUmVzcG9uc2UoTWVzc2FnZUNvbnRleHQgcmVxdWVzdCwgT2JqZWN0W10gaW5wdXQsIE9iamVjdCBvdXRwdXQpIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZVJlc3BvbnNlKHJlcXVlc3QsIHJlcXVlc3QuZ2V0TWVzc2FnZSgpLmdldFByb3RvY29sKCksIGlucHV0LCBvdXRwdXQpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgTWVzc2FnZUNvbnRleHQgY3JlYXRlUmVzcG9uc2UoTWVzc2FnZUNvbnRleHQgcmVxdWVzdCwgUHJvdG9jb2wgcCwgT2JqZWN0W10gcGFyYW1zLCBPYmplY3Qgb3V0cHV0KSB7Ci0gICAgICAgIE9wZXJhdGlvbkRlc2NyaXB0aW9uIG9wZXJhdGlvbkRlc2MgPSByZXF1ZXN0LmdldE9wZXJhdGlvbkRlc2NyaXB0aW9uKCk7Ci0gICAgICAgIE1ldGhvZCBtZXRob2QgPSBvcGVyYXRpb25EZXNjLmdldE1ldGhvZEZyb21TZXJ2aWNlSW1wbChzZXJ2aWNlSW1wbENsYXNzKTsKLSAgICAgICAgCi0gICAgICAgIC8vIENyZWF0ZSB0aGUgYXBwcm9wcmlhdGUgcmVzcG9uc2UgbWVzc2FnZSwgdXNpbmcgdGhlIHByb3RvY29sIGZyb20gdGhlCi0gICAgICAgIC8vIHJlcXVlc3QgbWVzc2FnZS4KLSAgICAgICAgTWV0aG9kTWFyc2hhbGxlciBtYXJzaGFsbGVyID0gZ2V0TWV0aG9kTWFyc2hhbGxlcihwLCByZXF1ZXN0LmdldE9wZXJhdGlvbkRlc2NyaXB0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdCk7Ci0gICAgICAgIE1lc3NhZ2UgbSA9IG51bGw7Ci0gICAgICAgIGlmIChtZXRob2QuZ2V0UmV0dXJuVHlwZSgpLmdldE5hbWUoKS5lcXVhbHMoInZvaWQiKSkgewotICAgICAgICAgICAgbSA9IG1hcnNoYWxsZXIubWFyc2hhbFJlc3BvbnNlKG51bGwsIHBhcmFtcywgb3BlcmF0aW9uRGVzYywgcCk7IAotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbSA9IG1hcnNoYWxsZXIubWFyc2hhbFJlc3BvbnNlKG91dHB1dCwgcGFyYW1zLCBvcGVyYXRpb25EZXNjLCBwKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gV2UnbGwgbmVlZCBhIE1lc3NhZ2VDb250ZXh0IGNvbmZpZ3VyZWQgYmFzZWQgb24gdGhlIHJlc3BvbnNlLgotICAgICAgICBNZXNzYWdlQ29udGV4dCByZXNwb25zZSA9IE1lc3NhZ2VDb250ZXh0VXRpbHMuY3JlYXRlUmVzcG9uc2VNZXNzYWdlQ29udGV4dChyZXF1ZXN0KTsKLSAgICAgICAgcmVzcG9uc2Uuc2V0TWVzc2FnZShtKTsKLSAgICAgICAgCi0gICAgICAgIC8vIEVuYWJsZSBNVE9NIGZvciB0aGUgcmVzcG9uc2UgaWYgbmVjZXNzYXJ5LgotICAgICAgICAvLyAoTVRPTSBpcyBub3QgZW5hYmxlZCBpdCB0aGlzIG9wZXJhdGlvbiBoYXMgU1dBIHBhcmFtZXRlcnMKLSAgICAgICAgICAgCi0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZXBEZXNjID0gcmVxdWVzdC5nZXRFbmRwb2ludERlc2NyaXB0aW9uKCk7Ci0gICAgICAgIFN0cmluZyBiaW5kaW5nVHlwZSA9IGVwRGVzYy5nZXRCaW5kaW5nVHlwZSgpOwotICAgICAgICBib29sZWFuIGlzTVRPTUJpbmRpbmcgPSBlcERlc2MuaXNNVE9NRW5hYmxlZCgpOwotICAgICAgICBib29sZWFuIGlzRG9pbmdTV0EgPSBtLmlzRG9pbmdTV0EoKTsKLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIkVuZHBvaW50RGVzY3JpcHRpb24gPSAiICsgZXBEZXNjLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgbG9nLmRlYnVnKCJCaW5kaW5nVHlwZSA9ICIgKyBiaW5kaW5nVHlwZSk7Ci0gICAgICAgICAgICBsb2cuZGVidWcoImlzTVRPTUJpbmRpbmcgPSAiICsgaXNNVE9NQmluZGluZyk7Ci0gICAgICAgICAgICBsb2cuZGVidWcoImlzRG9pbmdTV0EgPSAiICsgaXNEb2luZ1NXQSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFtLmlzRG9pbmdTV0EoKSAmJiBpc01UT01CaW5kaW5nKSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIk1UT00gZW5hYmxlZCBmb3IgdGhlIHJlc3BvbnNlIG1lc3NhZ2UuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtLnNldE1UT01FbmFibGVkKHRydWUpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gcmVzcG9uc2U7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBNZXNzYWdlQ29udGV4dCBjcmVhdGVGYXVsdFJlc3BvbnNlKE1lc3NhZ2VDb250ZXh0IHJlcXVlc3QsIFRocm93YWJsZSB0KSB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVGYXVsdFJlc3BvbnNlKHJlcXVlc3QsIHJlcXVlc3QuZ2V0TWVzc2FnZSgpLmdldFByb3RvY29sKCksIHQpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgTWVzc2FnZUNvbnRleHQgY3JlYXRlRmF1bHRSZXNwb25zZShNZXNzYWdlQ29udGV4dCByZXF1ZXN0LCBQcm90b2NvbCBwLCBUaHJvd2FibGUgdCkgewotICAgICAgICAKLSAgICAgICAgLy8gY2FsbCB0aGUgSW52b2NhdGlvbkxpc3RlbmVyIGluc3RhbmNlcyBiZWZvcmUgbWFyc2hhbGxpbmcKLSAgICAgICAgLy8gdGhlIGZhdWx0IGludG8gYSBtZXNzYWdlCi0gICAgICAgIC8vIGNhbGwgdGhlIEludm9jYXRpb25MaXN0ZW5lciBpbnN0YW5jZXMgYmVmb3JlIG1hcnNoYWxsaW5nCi0gICAgICAgIC8vIHRoZSBmYXVsdCBpbnRvIGEgbWVzc2FnZQotICAgICAgICBUaHJvd2FibGUgZmF1bHRNZXNzYWdlID0gSW52b2NhdGlvbkhlbHBlci5kZXRlcm1pbmVNYXBwZWRFeGNlcHRpb24odCwgcmVxdWVzdCk7Ci0gICAgICAgIGlmKGZhdWx0TWVzc2FnZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0ID0gZmF1bHRNZXNzYWdlOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBNZXRob2RNYXJzaGFsbGVyIG1hcnNoYWxsZXIgPSBnZXRNZXRob2RNYXJzaGFsbGVyKHAsIHJlcXVlc3QuZ2V0T3BlcmF0aW9uRGVzY3JpcHRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0KTsKLSAgICAgICAgCi0gICAgICAgIE1lc3NhZ2UgbSA9IG1hcnNoYWxsZXIubWFyc2hhbEZhdWx0UmVzcG9uc2UodCwgcmVxdWVzdC5nZXRPcGVyYXRpb25EZXNjcmlwdGlvbigpLCBwKTsKLSAgICAgICAgCi0gICAgICAgIE1lc3NhZ2VDb250ZXh0IHJlc3BvbnNlID0gTWVzc2FnZUNvbnRleHRVdGlscy5jcmVhdGVGYXVsdE1lc3NhZ2VDb250ZXh0KHJlcXVlc3QpOwotICAgICAgICByZXNwb25zZS5zZXRNZXNzYWdlKG0pOwotCi0gICAgICAgIEF4aXNGYXVsdCBheGlzRmF1bHQgPSBuZXcgQXhpc0ZhdWx0KCJUaGUgZW5kcG9pbnQgcmV0dXJuZWQgYSBmYXVsdCB3aGVuIGludm9raW5nIHRoZSB0YXJnZXQgb3BlcmF0aW9uLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmdldEF4aXNNZXNzYWdlQ29udGV4dCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0KTsKLSAgICAgICAgCi0gICAgICAgIHJlc3BvbnNlLnNldENhdXNlZEJ5RXhjZXB0aW9uKGF4aXNGYXVsdCk7Ci0gICAgICAgIAotICAgICAgICBzZXRGYXVsdFJlc3BvbnNlQWN0aW9uKHQsIHJlcXVlc3QsIHJlc3BvbnNlKTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiByZXNwb25zZTsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zZXJ2ZXIvZGlzcGF0Y2hlci9KYXZhRGlzcGF0Y2hlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2VydmVyL2Rpc3BhdGNoZXIvSmF2YURpc3BhdGNoZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg0NmM0Yi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zZXJ2ZXIvZGlzcGF0Y2hlci9KYXZhRGlzcGF0Y2hlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zZXJ2ZXIuZGlzcGF0Y2hlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLldlYlNlcnZpY2VFeGNlcHRpb25Mb2dnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5FeGNlcHRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNlcnZlci5FbmRwb2ludENhbGxiYWNrOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2VydmVyLkVuZHBvaW50SW52b2NhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zZXJ2ZXIuSW52b2NhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNlcnZlci5JbnZvY2F0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zZXJ2ZXIuSW52b2NhdGlvbkxpc3RlbmVyQmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnV0aWxpdHkuQ2xhc3NVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnV0aWxpdHkuSmF2YVV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0LlRyYW5zcG9ydFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ2FsbGFibGU7Ci0vKioKLSAqIEphdmFEaXNwYXRjaGVyIGlzIGFuIGFic3RyYWN0IGNsYXNzIHRoYXQgY2FuIGJlIGV4dGVuZGVkIHRvIGltcGxlbWVudCBhbiBFbmRwb2ludERpc3BhdGNoZXIgdG8gYQotICogSmF2YSBvYmplY3QuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBKYXZhRGlzcGF0Y2hlciBpbXBsZW1lbnRzIEVuZHBvaW50RGlzcGF0Y2hlciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coSmF2YURpc3BhdGNoZXIuY2xhc3MpOwotCi0gICAgcHJvdGVjdGVkIENsYXNzIHNlcnZpY2VJbXBsQ2xhc3M7Ci0gICAgcHJvdGVjdGVkIE9iamVjdCBzZXJ2aWNlSW5zdGFuY2U7Ci0KLSAgICBwcm90ZWN0ZWQgSmF2YURpc3BhdGNoZXIoQ2xhc3MgaW1wbCwgT2JqZWN0IHNlcnZpY2VJbnN0YW5jZSkgewotICAgICAgICB0aGlzLnNlcnZpY2VJbXBsQ2xhc3MgPSBpbXBsOwotICAgICAgICB0aGlzLnNlcnZpY2VJbnN0YW5jZSA9IHNlcnZpY2VJbnN0YW5jZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgTWVzc2FnZUNvbnRleHQgaW52b2tlKE1lc3NhZ2VDb250ZXh0IHJlcXVlc3QpIHRocm93cyBFeGNlcHRpb247Ci0gICAgCi0gICAgcHVibGljIGFic3RyYWN0IHZvaWQgaW52b2tlT25lV2F5KE1lc3NhZ2VDb250ZXh0IHJlcXVlc3QpOwotICAgIAotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGludm9rZUFzeW5jKE1lc3NhZ2VDb250ZXh0IHJlcXVlc3QsIEVuZHBvaW50Q2FsbGJhY2sgY2FsbGJhY2spOwotCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IE1lc3NhZ2VDb250ZXh0IGNyZWF0ZVJlc3BvbnNlKE1lc3NhZ2VDb250ZXh0IHJlcXVlc3QsIE9iamVjdFtdIGlucHV0LCBPYmplY3Qgb3V0cHV0KTsKLSAgICAKLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgTWVzc2FnZUNvbnRleHQgY3JlYXRlRmF1bHRSZXNwb25zZShNZXNzYWdlQ29udGV4dCByZXF1ZXN0LCBUaHJvd2FibGUgZmF1bHQpOwotICAgIAotICAgIAotICAgIHB1YmxpYyBDbGFzcyBnZXRTZXJ2aWNlSW1wbGVtZW50YXRpb25DbGFzcygpIHsKLSAgICAgICAgcmV0dXJuIHNlcnZpY2VJbXBsQ2xhc3M7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBPYmplY3QgaW52b2tlVGFyZ2V0T3BlcmF0aW9uKE1ldGhvZCBtZXRob2QsIE9iamVjdFtdIGFyZ3MpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBPYmplY3Qgb3V0cHV0ID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG91dHB1dCA9IG1ldGhvZC5pbnZva2Uoc2VydmljZUluc3RhbmNlLCBhcmdzKTsKLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gRGVsZWdhdGUgbG9nZ2luZyB0aGUgZXhjZXB0aW9uIHRvIHRoZSBXZWJTZXJ2aWNlRXhjZXB0aW9uTG9nZ2VyLgotICAgICAgICAgICAgLy8gVXNlcnMgY2FuIHNwZWNpZml5IGRlYnVnIHRyYWNpbmcgb2YgdGhlIFdlYlNlcnZpY2VFeGNlcHRpb25Mb2dnZXIgdG8gc2VlCi0gICAgICAgICAgICAvLyBhbGwgZXhjZXB0aW9ucy4KLSAgICAgICAgICAgIC8vIE90aGVyd2lzZSB0aGUgV2ViU2VydmljZUV4Y2VwdGlvbkxvZ2dlciBvbmx5IGxvZ3MgZXJyb3JzIGZvciBub24tY2hlY2tlZCBleGNlcHRpb25zCi0gICAgICAgICAgICBXZWJTZXJ2aWNlRXhjZXB0aW9uTG9nZ2VyLmxvZyhtZXRob2QsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZUltcGxDbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICB0aHJvdyB0OwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gb3V0cHV0OwotICAgIH0KLSAgICAKLSAgICAKLSAgICBwcm90ZWN0ZWQgY2xhc3MgQXN5bmNJbnZvY2F0aW9uV29ya2VyIGltcGxlbWVudHMgQ2FsbGFibGUgewotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBNZXRob2QgbWV0aG9kOwotICAgICAgICBwcml2YXRlIE9iamVjdFtdIHBhcmFtczsKLSAgICAgICAgcHJpdmF0ZSBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcjsKLSAgICAgICAgcHJpdmF0ZSBFbmRwb2ludEludm9jYXRpb25Db250ZXh0IGVpYzsKLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBBc3luY0ludm9jYXRpb25Xb3JrZXIoTWV0aG9kIG0sIE9iamVjdFtdIHAsIENsYXNzTG9hZGVyIGNsLCBFbmRwb2ludEludm9jYXRpb25Db250ZXh0IGN0eCkgewotICAgICAgICAgICAgbWV0aG9kID0gbTsKLSAgICAgICAgICAgIHBhcmFtcyA9IHA7Ci0gICAgICAgICAgICBjbGFzc0xvYWRlciA9IGNsOwotICAgICAgICAgICAgZWljID0gY3R4OwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgT2JqZWN0IGNhbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiSW52b2tpbmcgdGFyZ2V0IGVuZHBvaW50IHZpYSB0aGUgYXN5bmMgd29ya2VyLiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBTZXQgdGhlIHByb3BlciBjbGFzcyBsb2FkZXIgc28gdGhhdCB3ZSBjYW4gcHJvcGVybHkgbWFyc2hhbGwgdGhlCi0gICAgICAgICAgICAgICAgLy8gb3V0Ym91bmQgcmVzcG9uc2UuCi0gICAgICAgICAgICAgICAgQ2xhc3NMb2FkZXIgY3VycmVudExvYWRlciA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGNsYXNzTG9hZGVyICE9IG51bGwgJiYgKGNsYXNzTG9hZGVyICE9IGN1cnJlbnRMb2FkZXIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyKGNsYXNzTG9hZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkNvbnRleHQgQ2xhc3NMb2FkZXIgc2V0IHRvOiIgKyBjbGFzc0xvYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gV2UgaGF2ZSB0aGUgbWV0aG9kIHRoYXQgaXMgZ29pbmcgdG8gYmUgaW52b2tlZCBhbmQgdGhlIHBhcmFtZXRlciBkYXRhIHRvIGludm9rZSBpdCAKLSAgICAgICAgICAgICAgICAvLyB3aXRoLCBzbyBqdXN0IGludm9rZSB0aGUgb3BlcmF0aW9uLgotICAgICAgICAgICAgICAgIE9iamVjdCBvdXRwdXQgPSBudWxsOwotICAgICAgICAgICAgICAgIGJvb2xlYW4gZmF1bHRUaHJvd24gPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBUaHJvd2FibGUgZmF1bHQgPSBudWxsOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIG91dHB1dCA9IGludm9rZVRhcmdldE9wZXJhdGlvbihtZXRob2QsIHBhcmFtcyk7Ci0gICAgICAgICAgICAgICAgfSAKLSAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgZmF1bHQgPSBDbGFzc1V0aWxzLmdldFJvb3RDYXVzZShlKTsKLSAgICAgICAgICAgICAgICAgICAgVGhyb3dhYmxlIG5ld0ZhdWx0ID0gSW52b2NhdGlvbkhlbHBlci5kZXRlcm1pbmVNYXBwZWRFeGNlcHRpb24oZmF1bHQsIGVpYyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmKG5ld0ZhdWx0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZhdWx0ID0gbmV3RmF1bHQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZmF1bHRUaHJvd24gPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBJZiB0aGlzIGlzIGEgb25lIHdheSBpbnZvY2F0aW9uLCB3ZSBhcmUgZG9uZSBhbmQganVzdCBuZWVkIHRvIHJldHVybi4KLSAgICAgICAgICAgICAgICBpZiAoZWljLmlzT25lV2F5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkludm9jYXRpb24gcGF0dGVybiB3YXMgb25lIHdheSwgd29yayBjb21wbGV0ZS4iKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VSZWFkeShlaWMpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSByZXNwb25zZSBNZXNzYWdlQ29udGV4dAotICAgICAgICAgICAgICAgIE1lc3NhZ2VDb250ZXh0IHJlcXVlc3QgPSBlaWMuZ2V0UmVxdWVzdE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgICAgICAgICAgTWVzc2FnZUNvbnRleHQgcmVzcG9uc2UgPSBudWxsOwotICAgICAgICAgICAgICAgIGlmIChmYXVsdFRocm93bikgewotICAgICAgICAgICAgICAgICAgICAvLyBJZiBhIGZhdWx0IHdhcyB0aHJvd24sIHdlIG5lZWQgdG8gY3JlYXRlIGEgc2xpZ2h0bHkgZGlmZmVyZW50Ci0gICAgICAgICAgICAgICAgICAgIC8vIE1lc3NhZ2VDb250ZXh0LCB0aGFuIGluIHRoZSByZXNwb25zZSBwYXRoLgotICAgICAgICAgICAgICAgICAgICByZXNwb25zZSA9IGNyZWF0ZUZhdWx0UmVzcG9uc2UocmVxdWVzdCwgZmF1bHQpOwotICAgICAgICAgICAgICAgICAgICBzZXRFeGNlcHRpb25Qcm9wZXJ0aWVzKHJlc3BvbnNlLCBtZXRob2QsIGZhdWx0KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQXN5bmMgaW52b2NhdGlvbiBvZiB0aGUgZW5kcG9pbnQgd2FzIHN1Y2Nlc3NmdWwuICBDcmVhdGluZyByZXNwb25zZSBtZXNzYWdlLiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gY3JlYXRlUmVzcG9uc2UocmVxdWVzdCwgcGFyYW1zLCBvdXRwdXQpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIEVuZHBvaW50SW52b2NhdGlvbkNvbnRleHQgZWljID0gbnVsbDsKLSAgICAgICAgICAgICAgICBpZiAocmVxdWVzdC5nZXRJbnZvY2F0aW9uQ29udGV4dCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZWljID0gKEVuZHBvaW50SW52b2NhdGlvbkNvbnRleHQpIHJlcXVlc3QuZ2V0SW52b2NhdGlvbkNvbnRleHQoKTsKLSAgICAgICAgICAgICAgICAgICAgZWljLnNldFJlc3BvbnNlTWVzc2FnZUNvbnRleHQocmVzcG9uc2UpOyAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgRW5kcG9pbnRDYWxsYmFjayBjYWxsYmFjayA9IGVpYy5nZXRDYWxsYmFjaygpOwotICAgICAgICAgICAgICAgIGJvb2xlYW4gaGFuZGxlRmF1bHQgPSByZXNwb25zZS5nZXRNZXNzYWdlKCkuaXNGYXVsdCgpOwotICAgICAgICAgICAgICAgIGlmICghaGFuZGxlRmF1bHQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIk5vIGZhdWx0IGRldGVjdGVkIGluIHJlc3BvbnNlIG1lc3NhZ2UsIHNlbmRpbmcgYmFjayBhcHBsaWNhdGlvbiByZXNwb25zZS4iKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5oYW5kbGVSZXNwb25zZShlaWMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkEgZmF1bHQgd2FzIGRldGVjdGVkLiAgU2VuZGluZyBiYWNrIGEgZmF1bHQgcmVzcG9uc2UuIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suaGFuZGxlRmF1bHRSZXNwb25zZShlaWMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBTZXQgdGhlIHRocmVhZCdzIENsYXNzTG9hZGVyIGJhY2sgdG8gd2hhdCBpdCBvcmlnaW5hbGx5IHdhcy4KLSAgICAgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcihjdXJyZW50TG9hZGVyKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBDbGVhbiB1cCB0aGUgY2FjaGVkIGF0dGFjaG1lbnRzIGZyb20gdGhlIHJlcXVlc3QgYW5kIHRoZSByZXNwb25zZS4KLSAgICAgICAgICAgICAgICBUcmFuc3BvcnRVdGlscy5kZWxldGVBdHRhY2htZW50cyhlaWMuZ2V0UmVxdWVzdE1lc3NhZ2VDb250ZXh0KCkuZ2V0QXhpc01lc3NhZ2VDb250ZXh0KCkpOwotICAgICAgICAgICAgICAgIFRyYW5zcG9ydFV0aWxzLmRlbGV0ZUF0dGFjaG1lbnRzKGVpYy5nZXRSZXNwb25zZU1lc3NhZ2VDb250ZXh0KCkuZ2V0QXhpc01lc3NhZ2VDb250ZXh0KCkpOyAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gRXhjZXB0aW9ucyBhcmUgc3dhbGxvd2VkLCB0aGVyZSBpcyBubyByZWFzb24gdG8gcmV0aHJvdyB0aGVtCi0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQU4gVU5FWFBFQ1RFRCBFUlJPUiBPQ0NVUlJFRCBJTiBUSEUgQVNZTkMgV09SS0VSIFRIUkVBRCIpOwotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkV4Y2VwdGlvbiBpczoiICsgZSwgZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKiogCi0gICAgICogVGhpcyB3aWxsIGNhbGwgdGhlIEludm9jYXRpb25MaXN0ZW5lciBpbnN0YW5jZXMgdGhhdCB3ZXJlIGNhbGxlZCBkdXJpbmcKLSAgICAgKiB0aGUgcmVxdWVzdCBwcm9jZXNzaW5nIGZvciB0aGlzIG1lc3NhZ2UuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVzcG9uc2VSZWFkeShFbmRwb2ludEludm9jYXRpb25Db250ZXh0IGVpYykgIHsKLSAgICAgICAgTGlzdDxJbnZvY2F0aW9uTGlzdGVuZXI+IGxpc3RlbmVyTGlzdCA9IGVpYy5nZXRJbnZvY2F0aW9uTGlzdGVuZXJzKCk7Ci0gICAgICAgIGlmKGxpc3RlbmVyTGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBJbnZvY2F0aW9uTGlzdGVuZXJCZWFuIGJlYW4gPSBuZXcgSW52b2NhdGlvbkxpc3RlbmVyQmVhbihlaWMsIEludm9jYXRpb25MaXN0ZW5lckJlYW4uU3RhdGUuUkVTUE9OU0UpOwotICAgICAgICAgICAgZm9yKEludm9jYXRpb25MaXN0ZW5lciBsaXN0ZW5lciA6IGxpc3RlbmVyTGlzdCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLm5vdGlmeShiZWFuKTsgCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHNldEZhdWx0UmVzcG9uc2VBY3Rpb24oVGhyb3dhYmxlIGV4Y2VwdGlvbiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUNvbnRleHQgcmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlQ29udGV4dCByZXNwb25zZSkgewotICAgICAgICAgQXhpc09wZXJhdGlvbiBvcGVyYXRpb24gPSByZXF1ZXN0LmdldE9wZXJhdGlvbkRlc2NyaXB0aW9uKCkuZ2V0QXhpc09wZXJhdGlvbigpOwotICAgICAgICAgaWYgKG9wZXJhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgZXhjZXB0aW9uID0gQ2xhc3NVdGlscy5nZXRSb290Q2F1c2UoZXhjZXB0aW9uKTsgICAgICAgIAotICAgICAgICAgICAgIFN0cmluZyBhY3Rpb24gPSBvcGVyYXRpb24uZ2V0RmF1bHRBY3Rpb24oZXhjZXB0aW9uLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAKLSAgICAgICAgICAgICBpZiAoYWN0aW9uICE9IG51bGwpCi0gICAgICAgICAgICAgICAgIHJlc3BvbnNlLmdldEF4aXNNZXNzYWdlQ29udGV4dCgpLnNldFdTQUFjdGlvbihhY3Rpb24pOwotICAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBEZXRlcm1pbmUgaWYgdGhlIHRocm93biBleGNlcHRpb24gaXMgYSBjaGVja2VkIGV4Y2VwdGlvbi4KLSAgICAgKiBJZiBzbywgdGhlbiBzZXQgdGhlIG5hbWUgb2YgdGhlIGNoZWNrZWQgZXhjZXB0aW9uIG9uIHRoZSByZXNwb25zZSBjb250ZXh0Ci0gICAgICogQHBhcmFtIHJlc3BvbnNlIE1lc3NhZ2VDb250ZXh0Ci0gICAgICogQHBhcmFtIG0gTWV0aG9kCi0gICAgICogQHBhcmFtIHQgVGhyb3dhYmxlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHNldENoZWNrZWRFeGNlcHRpb25Qcm9wZXJ0eShNZXNzYWdlQ29udGV4dCByZXNwb25zZSwgTWV0aG9kIG0sIFRocm93YWJsZSB0KSB7Ci0gICAgICAgIC8vIEdldCB0aGUgcm9vdCBvZiB0aGUgZXhjZXB0aW9uCi0gICAgICAgIGlmICh0IGluc3RhbmNlb2YgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbikgewotICAgICAgICAgICAgdCA9ICgoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbikgdCkuZ2V0VGFyZ2V0RXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIERldGVybWluZSBpZiB0aGUgdGhyb3duIGV4Y2VwdGlvbiBpcyBjaGVja2VkCi0gICAgICAgIENsYXNzIGNoZWNrZWRFeGNlcHRpb24gPSBKYXZhVXRpbHMuZ2V0Q2hlY2tlZEV4Y2VwdGlvbih0LCBtKTsKLSAgICAgICAgCi0gICAgICAgIC8vIEFkZCB0aGUgcHJvcGVydHkKLSAgICAgICAgaWYgKGNoZWNrZWRFeGNlcHRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgcmVzcG9uc2Uuc2V0UHJvcGVydHkoQ29uc3RhbnRzLkNIRUNLRURfRVhDRVBUSU9OLCBjaGVja2VkRXhjZXB0aW9uLmdldENhbm9uaWNhbE5hbWUoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogU3RvcmUgdGhlIGFjdHVhbCBleGNlcHRpb24gb24gdGhlIHJlc3BvbnNlIGNvbnRleHQKLSAgICAgKiBAcGFyYW0gcmVzcG9uc2UgTWVzc2FnZUNvbnRleHQKLSAgICAgKiBAcGFyYW0gdCBUaHJvd2FibGUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIHZvaWQgc2V0V2ViTWV0aG9kRXhjZXB0aW9uUHJvcGVydHkoTWVzc2FnZUNvbnRleHQgcmVzcG9uc2UsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJvd2FibGUgdCkgewotICAgICAgICAvLyBHZXQgdGhlIHJvb3Qgb2YgdGhlIGV4Y2VwdGlvbgotICAgICAgICBpZiAodCBpbnN0YW5jZW9mIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHQgPSAoKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24pIHQpLmdldFRhcmdldEV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBBZGQgdGhlIHByb3BlcnR5Ci0gICAgICAgIGlmICh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJlc3BvbnNlLnNldFByb3BlcnR5KENvbnN0YW50cy5KQVhXU19XRUJNRVRIT0RfRVhDRVBUSU9OLCB0KTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgZXhjZXB0aW9uIGlzIHN0b3JlZCBvbiB0aGUgb3V0Ym91bmQgcmVzcG9uc2UgY29udGV4dAotICAgICAqIEBwYXJhbSByZXNwb25zZSBNZXNzYWdlQ29udGV4dAotICAgICAqIEBwYXJhbSBtIE1ldGhvZAotICAgICAqIEBwYXJhbSB0IFRocm93YWJsZQotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgdm9pZCBzZXRFeGNlcHRpb25Qcm9wZXJ0aWVzKE1lc3NhZ2VDb250ZXh0IHJlc3BvbnNlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRob2QgbSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgc2V0Q2hlY2tlZEV4Y2VwdGlvblByb3BlcnR5KHJlc3BvbnNlLCBtLCB0KTsKLSAgICAgICAgc2V0V2ViTWV0aG9kRXhjZXB0aW9uUHJvcGVydHkocmVzcG9uc2UsIHQpOwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NlcnZlci9kaXNwYXRjaGVyL1Byb3ZpZGVyRGlzcGF0Y2hlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2VydmVyL2Rpc3BhdGNoZXIvUHJvdmlkZXJEaXNwYXRjaGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzMmE4Y2MuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2VydmVyL2Rpc3BhdGNoZXIvUHJvdmlkZXJEaXNwYXRjaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2ODAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNlcnZlci5kaXNwYXRjaGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5FeGNlcHRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29udGV4dC51dGlscy5Db250ZXh0VXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS51dGlsLk1lc3NhZ2VDb250ZXh0VXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5FbmRwb2ludERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaTE4bi5NZXNzYWdlczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1hcnNoYWxsZXIuaW1wbC5hbHQuTWV0aG9kTWFyc2hhbGxlclV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5CbG9jazsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuTWVzc2FnZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuUHJvdG9jb2w7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLlhNTEZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5kYXRhYmluZGluZy5PTUJsb2NrOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5mYWN0b3J5LkJsb2NrRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZmFjdG9yeS5EYXRhU291cmNlQmxvY2tGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5mYWN0b3J5Lk1lc3NhZ2VGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5mYWN0b3J5Lk9NQmxvY2tGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5mYWN0b3J5LlNPQVBFbnZlbG9wZUJsb2NrRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZmFjdG9yeS5Tb3VyY2VCbG9ja0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmZhY3RvcnkuWE1MU3RyaW5nQmxvY2tGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS51dGlsLlhNTEZhdWx0VXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5yZWdpc3RyeS5GYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zZXJ2ZXIuRW5kcG9pbnRDYWxsYmFjazsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNlcnZlci5FbmRwb2ludEludm9jYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2VydmVyLkludm9jYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zZXJ2ZXIuU2VydmVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MudXRpbGl0eS5DbGFzc1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MudXRpbGl0eS5EYXRhU291cmNlRm9ybWF0dGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MudXRpbGl0eS5FeGVjdXRvckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51dGlsaXR5LlNpbmdsZVRocmVhZGVkRXhlY3V0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZTsKLQotaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRGF0YVNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQTWVzc2FnZTsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwud3MuUHJvdmlkZXI7Ci1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlBhcmFtZXRlcml6ZWRUeXBlOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3I7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlVGFzazsKLQotLyoqCi0gKiBUaGUgUHJvdmlkZXJEaXNwYXRjaGVyIGlzIHVzZWQgdG8gaW52b2tlIGluc3RhbmNlcyBvZiBhIHRhcmdldCBlbmRwb2ludCB0aGF0IGltcGxlbWVudCB0aGUge0BsaW5rCi0gKiBqYXZheC54bWwud3MuUHJvdmlkZXJ9IGludGVyZmFjZS4KLSAqIDxwLz4KLSAqIFRoZSBQcm92aWRlcjxUPiBpcyBhIGdlbmVyaWMgY2xhc3MsIHdpdGggY2VydGFpbiByZXN0cmljdGlvbnMgb24gdGhlIHBhcmFtZXRlcml6ZWQgdHlwZSBULiAgVGhpcwotICogaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgdGhlIGZvbGxvd2luZyB0eXBlczoKLSAqIDxwLz4KLSAqIGphdmEubGFuZy5TdHJpbmcgamF2YXguYWN0aXZhdGlvbi5EYXRhU291cmNlIGphdmF4LnhtbC5zb2FwLlNPQVBNZXNzYWdlCi0gKiBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZQotICovCi1wdWJsaWMgY2xhc3MgUHJvdmlkZXJEaXNwYXRjaGVyIGV4dGVuZHMgSmF2YURpc3BhdGNoZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFByb3ZpZGVyRGlzcGF0Y2hlci5jbGFzcyk7Ci0KLSAgICBwcml2YXRlIEJsb2NrRmFjdG9yeSBfYmxvY2tGYWN0b3J5ID0gbnVsbDsgIC8vIENhY2hlIHRoZSBibG9jayBmYWN0b3J5Ci0gICAgcHJpdmF0ZSBDbGFzcyBfcHJvdmlkZXJUeXBlID0gbnVsbDsgICAgICAgIC8vIENhY2hlIHRoZSBwcm92aWRlciB0eXBlCi0gICAgcHJpdmF0ZSBQcm92aWRlciBwcm92aWRlckluc3RhbmNlID0gbnVsbDsKLSAgICBwcml2YXRlIE1lc3NhZ2UgbWVzc2FnZSA9IG51bGw7Ci0gICAgcHJpdmF0ZSBFbmRwb2ludERlc2NyaXB0aW9uIGVuZHBvaW50RGVzYyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvcgotICAgICAqCi0gICAgICogQHBhcmFtIF9jbGFzcwotICAgICAqIEBwYXJhbSBzZXJ2aWNlSW5zdGFuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgUHJvdmlkZXJEaXNwYXRjaGVyKENsYXNzIF9jbGFzcywgT2JqZWN0IHNlcnZpY2VJbnN0YW5jZSkgewotICAgICAgICBzdXBlcihfY2xhc3MsIHNlcnZpY2VJbnN0YW5jZSk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNlcnZlci5FbmRwb2ludERpc3BhdGNoZXIjZXhlY3V0ZSgpCi0gICAgKi8KLSAgICBwdWJsaWMgTWVzc2FnZUNvbnRleHQgaW52b2tlKE1lc3NhZ2VDb250ZXh0IHJlcXVlc3QpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiUHJlcGFyaW5nIHRvIGludm9rZSBqYXZheC54bWwud3MuUHJvdmlkZXIgYmFzZWQgZW5kcG9pbnQiKTsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiSW52b2NhdGlvbiBwYXR0ZXJuOiB0d28gd2F5LCBzeW5jIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpbml0aWFsaXplKHJlcXVlc3QpOwotCi0gICAgICAgIHByb3ZpZGVySW5zdGFuY2UgPSBnZXRQcm92aWRlckluc3RhbmNlKCk7Ci0KLSAgICAgICAgT2JqZWN0IHBhcmFtID0gY3JlYXRlUmVxdWVzdFBhcmFtZXRlcnMocmVxdWVzdCk7Ci0KLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBDbGFzcyBwcm92aWRlclR5cGUgPSBnZXRQcm92aWRlclR5cGUoKTsKLSAgICAgICAgICAgIGZpbmFsIE9iamVjdCBpbnB1dCA9IHByb3ZpZGVyVHlwZS5jYXN0KHBhcmFtKTsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiSW52b2tpbmcgUHJvdmlkZXI8IiArIHByb3ZpZGVyVHlwZS5nZXROYW1lKCkgKyAiPiIpOwotICAgICAgICAgICAgaWYgKGlucHV0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlBhcmFtZXRlciB0eXBlOiAiICsgaW5wdXQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJQYXJhbWV0ZXIgaXMgTlVMTCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSW52b2tlIHRoZSBhY3R1YWwgUHJvdmlkZXIuaW52b2tlKCkgbWV0aG9kCi0gICAgICAgIGJvb2xlYW4gZmF1bHRUaHJvd24gPSBmYWxzZTsKLSAgICAgICAgVGhyb3dhYmxlIGZhdWx0ID0gbnVsbDsKLSAgICAgICAgT2JqZWN0W10gaW5wdXQgPSBuZXcgT2JqZWN0W10ge3BhcmFtfTsKLSAgICAgICAgT2JqZWN0IHJlc3BvbnNlUGFyYW1WYWx1ZSA9IG51bGw7Ci0gICAgICAgIE1ldGhvZCB0YXJnZXQgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgdGFyZ2V0ID0gZ2V0SmF2YU1ldGhvZCgpOwotICAgICAgICAgICAgcmVzcG9uc2VQYXJhbVZhbHVlID0gaW52b2tlVGFyZ2V0T3BlcmF0aW9uKHRhcmdldCwgaW5wdXQpOwotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkgewotICAgICAgICAgICAgZmF1bHQgPSBDbGFzc1V0aWxzLmdldFJvb3RDYXVzZShlKTsKLSAgICAgICAgICAgIGZhdWx0VGhyb3duID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gQ3JlYXRlIHRoZSByZXNwb25zZSBNZXNzYWdlQ29udGV4dAotICAgICAgICBNZXNzYWdlQ29udGV4dCByZXNwb25zZU1zZ0N0eCA9IG51bGw7Ci0gICAgICAgIGlmIChmYXVsdFRocm93bikgewotICAgICAgICAgICAgLy8gSWYgYSBmYXVsdCB3YXMgdGhyb3duLCB3ZSBuZWVkIHRvIGNyZWF0ZSBhIHNsaWdodGx5IGRpZmZlcmVudAotICAgICAgICAgICAgLy8gTWVzc2FnZUNvbnRleHQsIHRoYW4gaW4gdGhlIHJlc3BvbnNlIHBhdGguCi0gICAgICAgICAgICByZXNwb25zZU1zZ0N0eCA9IGNyZWF0ZUZhdWx0UmVzcG9uc2UocmVxdWVzdCwgZmF1bHQpOwotICAgICAgICAgICAgc2V0RXhjZXB0aW9uUHJvcGVydGllcyhyZXNwb25zZU1zZ0N0eCwgdGFyZ2V0LCBmYXVsdCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXNwb25zZU1zZ0N0eCA9IGNyZWF0ZVJlc3BvbnNlKHJlcXVlc3QsIGlucHV0LCByZXNwb25zZVBhcmFtVmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3BvbnNlTXNnQ3R4OwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBpbnZva2VPbmVXYXkoTWVzc2FnZUNvbnRleHQgcmVxdWVzdCkgewotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiUHJlcGFyaW5nIHRvIGludm9rZSBqYXZheC54bWwud3MuUHJvdmlkZXIgYmFzZWQgZW5kcG9pbnQiKTsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiSW52b2NhdGlvbiBwYXR0ZXJuOiBvbmUgd2F5Iik7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGluaXRpYWxpemUocmVxdWVzdCk7Ci0KLSAgICAgICAgcHJvdmlkZXJJbnN0YW5jZSA9IGdldFByb3ZpZGVySW5zdGFuY2UoKTsKLQotICAgICAgICBPYmplY3QgcGFyYW0gPSBjcmVhdGVSZXF1ZXN0UGFyYW1ldGVycyhyZXF1ZXN0KTsKLQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIENsYXNzIHByb3ZpZGVyVHlwZSA9IGdldFByb3ZpZGVyVHlwZSgpOwotICAgICAgICAgICAgZmluYWwgT2JqZWN0IGlucHV0ID0gcHJvdmlkZXJUeXBlLmNhc3QocGFyYW0pOwotICAgICAgICAgICAgbG9nLmRlYnVnKCJJbnZva2luZyBQcm92aWRlcjwiICsgcHJvdmlkZXJUeXBlLmdldE5hbWUoKSArICI+Iik7Ci0gICAgICAgICAgICBpZiAoaW5wdXQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiUGFyYW1ldGVyIHR5cGU6ICIgKyBpbnB1dC5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlBhcmFtZXRlciBpcyBOVUxMIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBFeGVjdXRvckZhY3RvcnkgZWYgPSAoRXhlY3V0b3JGYWN0b3J5KSBGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShFeGVjdXRvckZhY3RvcnkuY2xhc3MpOwotICAgICAgICBFeGVjdXRvciBleGVjdXRvciA9IGVmLmdldEV4ZWN1dG9ySW5zdGFuY2UoRXhlY3V0b3JGYWN0b3J5LlNFUlZFUl9FWEVDVVRPUik7Ci0gICAgICAgIAotICAgICAgICAvLyBJZiB0aGUgcHJvcGVydHkgaGFzIGJlZW4gc2V0IHRvIGRpc2FibGUgdGhyZWFkIHN3aXRjaGluZywgdGhlbiB3ZSBjYW4gCi0gICAgICAgIC8vIGRvIHNvIGJ5IHVzaW5nIGEgU2luZ2xlVGhyZWFkZWRFeGVjdXRvciBpbnN0YW5jZSB0byBjb250aW51ZSBwcm9jZXNzaW5nCi0gICAgICAgIC8vIHdvcmsgb24gdGhlIGV4aXN0aW5nIHRocmVhZC4KLSAgICAgICAgQm9vbGVhbiBkaXNhYmxlID0gKEJvb2xlYW4pIHJlcXVlc3QuZ2V0UHJvcGVydHkoU2VydmVyQ29uc3RhbnRzLlNFUlZFUl9ESVNBQkxFX1RIUkVBRF9TV0lUQ0gpOwotICAgICAgICBpZiAoZGlzYWJsZSAhPSBudWxsICYmIGRpc2FibGUuYm9vbGVhblZhbHVlKCkpIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiU2VydmVyIHNpZGUgdGhyZWFkIHN3aXRjaCBkaXNhYmxlZC4gIFNldHRpbmcgRXhlY3V0b3IgdG8gdGhlIFNpbmdsZVRocmVhZGVkRXhlY3V0b3IuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBleGVjdXRvciA9IG5ldyBTaW5nbGVUaHJlYWRlZEV4ZWN1dG9yKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIE1ldGhvZCBtID0gZ2V0SmF2YU1ldGhvZCgpOwotICAgICAgICBPYmplY3RbXSBwYXJhbXMgPSBuZXcgT2JqZWN0W10ge3BhcmFtfTsKLSAgICAgICAgCi0gICAgICAgIEVuZHBvaW50SW52b2NhdGlvbkNvbnRleHQgZWljID0gKEVuZHBvaW50SW52b2NhdGlvbkNvbnRleHQpIHJlcXVlc3QuZ2V0SW52b2NhdGlvbkNvbnRleHQoKTsKLSAgICAgICAgQ2xhc3NMb2FkZXIgY2wgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOwotICAgICAgICAKLSAgICAgICAgQXN5bmNJbnZvY2F0aW9uV29ya2VyIHdvcmtlciA9IG5ldyBBc3luY0ludm9jYXRpb25Xb3JrZXIobSwgcGFyYW1zLCBjbCwgZWljKTsKLSAgICAgICAgRnV0dXJlVGFzayB0YXNrID0gbmV3IEZ1dHVyZVRhc2s8QXN5bmNJbnZvY2F0aW9uV29ya2VyPih3b3JrZXIpOwotICAgICAgICBleGVjdXRvci5leGVjdXRlKHRhc2spOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBpbnZva2VBc3luYyhNZXNzYWdlQ29udGV4dCByZXF1ZXN0LCBFbmRwb2ludENhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJQcmVwYXJpbmcgdG8gaW52b2tlIGphdmF4LnhtbC53cy5Qcm92aWRlciBiYXNlZCBlbmRwb2ludCIpOwotICAgICAgICAgICAgbG9nLmRlYnVnKCJJbnZvY2F0aW9uIHBhdHRlcm46IHR3byB3YXksIGFzeW5jIik7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGluaXRpYWxpemUocmVxdWVzdCk7Ci0KLSAgICAgICAgcHJvdmlkZXJJbnN0YW5jZSA9IGdldFByb3ZpZGVySW5zdGFuY2UoKTsKLQotICAgICAgICBPYmplY3QgcGFyYW0gPSBjcmVhdGVSZXF1ZXN0UGFyYW1ldGVycyhyZXF1ZXN0KTsKLQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIENsYXNzIHByb3ZpZGVyVHlwZSA9IGdldFByb3ZpZGVyVHlwZSgpOwotICAgICAgICAgICAgZmluYWwgT2JqZWN0IGlucHV0ID0gcHJvdmlkZXJUeXBlLmNhc3QocGFyYW0pOwotICAgICAgICAgICAgbG9nLmRlYnVnKCJJbnZva2luZyBQcm92aWRlcjwiICsgcHJvdmlkZXJUeXBlLmdldE5hbWUoKSArICI+Iik7Ci0gICAgICAgICAgICBpZiAoaW5wdXQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiUGFyYW1ldGVyIHR5cGU6ICIgKyBpbnB1dC5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlBhcmFtZXRlciBpcyBOVUxMIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBFeGVjdXRvckZhY3RvcnkgZWYgPSAoRXhlY3V0b3JGYWN0b3J5KSBGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShFeGVjdXRvckZhY3RvcnkuY2xhc3MpOwotICAgICAgICBFeGVjdXRvciBleGVjdXRvciA9IGVmLmdldEV4ZWN1dG9ySW5zdGFuY2UoRXhlY3V0b3JGYWN0b3J5LlNFUlZFUl9FWEVDVVRPUik7Ci0gICAgICAgIAotICAgICAgICAvLyBJZiB0aGUgcHJvcGVydHkgaGFzIGJlZW4gc2V0IHRvIGRpc2FibGUgdGhyZWFkIHN3aXRjaGluZywgdGhlbiB3ZSBjYW4gCi0gICAgICAgIC8vIGRvIHNvIGJ5IHVzaW5nIGEgU2luZ2xlVGhyZWFkZWRFeGVjdXRvciBpbnN0YW5jZSB0byBjb250aW51ZSBwcm9jZXNzaW5nCi0gICAgICAgIC8vIHdvcmsgb24gdGhlIGV4aXN0aW5nIHRocmVhZC4KLSAgICAgICAgQm9vbGVhbiBkaXNhYmxlID0gKEJvb2xlYW4pIHJlcXVlc3QuZ2V0UHJvcGVydHkoU2VydmVyQ29uc3RhbnRzLlNFUlZFUl9ESVNBQkxFX1RIUkVBRF9TV0lUQ0gpOwotICAgICAgICBpZiAoZGlzYWJsZSAhPSBudWxsICYmIGRpc2FibGUuYm9vbGVhblZhbHVlKCkpIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiU2VydmVyIHNpZGUgdGhyZWFkIHN3aXRjaCBkaXNhYmxlZC4gIFNldHRpbmcgRXhlY3V0b3IgdG8gdGhlIFNpbmdsZVRocmVhZGVkRXhlY3V0b3IuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBleGVjdXRvciA9IG5ldyBTaW5nbGVUaHJlYWRlZEV4ZWN1dG9yKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIE1ldGhvZCBtID0gZ2V0SmF2YU1ldGhvZCgpOwotICAgICAgICBPYmplY3RbXSBwYXJhbXMgPSBuZXcgT2JqZWN0W10ge3BhcmFtfTsKLSAgICAgICAgCi0gICAgICAgIEVuZHBvaW50SW52b2NhdGlvbkNvbnRleHQgZWljID0gKEVuZHBvaW50SW52b2NhdGlvbkNvbnRleHQpIHJlcXVlc3QuZ2V0SW52b2NhdGlvbkNvbnRleHQoKTsKLSAgICAgICAgQ2xhc3NMb2FkZXIgY2wgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOwotICAgICAgICAKLSAgICAgICAgQXN5bmNJbnZvY2F0aW9uV29ya2VyIHdvcmtlciA9IG5ldyBBc3luY0ludm9jYXRpb25Xb3JrZXIobSwgcGFyYW1zLCBjbCwgZWljKTsKLSAgICAgICAgRnV0dXJlVGFzayB0YXNrID0gbmV3IEZ1dHVyZVRhc2s8QXN5bmNJbnZvY2F0aW9uV29ya2VyPih3b3JrZXIpOwotICAgICAgICBleGVjdXRvci5leGVjdXRlKHRhc2spOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgT2JqZWN0IGNyZWF0ZVJlcXVlc3RQYXJhbWV0ZXJzKE1lc3NhZ2VDb250ZXh0IHJlcXVlc3QpIHsKLSAgICAgICAgLy8gRmlyc3Qgd2UgbmVlZCB0byBrbm93IHdoYXQga2luZCBvZiBQcm92aWRlciBpbnN0YW5jZSB3ZSdyZSBnb2luZwotICAgICAgICAvLyB0byBiZSBpbnZva2luZyBhZ2FpbnN0Ci0gICAgICAgIENsYXNzIHByb3ZpZGVyVHlwZSA9IGdldFByb3ZpZGVyVHlwZSgpOwotCi0gICAgICAgIC8vIFJFVklFVzogVGhpcyBhc3N1bWVzIHRoZXJlIGlzIG9ubHkgb25lIGVuZHBvaW50IGRlc2NyaXB0aW9uIG9uIHRoZSBzZXJ2aWNlLiAgSXMgdGhhdCBhbHdheXMgdGhlIGNhc2U/Ci0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZW5kcG9pbnREZXNjID0gcmVxdWVzdC5nZXRFbmRwb2ludERlc2NyaXB0aW9uKCk7Ci0KLSAgICAgICAgLy8gTm93IHRoYXQgd2Uga25vdyB3aGF0IGtpbmQgb2YgUHJvdmlkZXIgd2UgaGF2ZSwgd2UgY2FuIGNyZWF0ZSB0aGUgCi0gICAgICAgIC8vIHJpZ2h0IHR5cGUgb2YgQmxvY2sgZm9yIHRoZSByZXF1ZXN0IHBhcmFtZXRlciBkYXRhCi0gICAgICAgIE9iamVjdCByZXF1ZXN0UGFyYW1WYWx1ZSA9IG51bGw7Ci0gICAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9IHJlcXVlc3QuZ2V0TWVzc2FnZSgpOwotICAgICAgICBpZiAobWVzc2FnZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIEVuYWJsZSBNVE9NIGlmIGluZGljYXRlZAotICAgICAgICAgICAgaWYgKGVuZHBvaW50RGVzYy5pc01UT01FbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBtZXNzYWdlLnNldE1UT01FbmFibGVkKHRydWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBTYXZlIG9mZiB0aGUgcHJvdG9jb2wgaW5mbyBzbyB3ZSBjYW4gdXNlIGl0IHdoZW4gY3JlYXRpbmcgdGhlIHJlc3BvbnNlIG1lc3NhZ2UuCi0gICAgICAgICAgICBQcm90b2NvbCBtZXNzYWdlUHJvdG9jb2wgPSBtZXNzYWdlLmdldFByb3RvY29sKCk7Ci0gICAgICAgICAgICAvLyBEZXRlcm1pbmUgd2hhdCB0eXBlIGJsb2NrcyB3ZSB3YW50IHRvIGNyZWF0ZSAoU3RyaW5nLCBTb3VyY2UsIGV0YykgYmFzZWQgb24gUHJvdmlkZXIgVHlwZQotICAgICAgICAgICAgQmxvY2tGYWN0b3J5IGZhY3RvcnkgPSBjcmVhdGVCbG9ja0ZhY3RvcnkocHJvdmlkZXJUeXBlKTsKLQotCi0gICAgICAgICAgICBTZXJ2aWNlLk1vZGUgcHJvdmlkZXJTZXJ2aWNlTW9kZSA9IGVuZHBvaW50RGVzYy5nZXRTZXJ2aWNlTW9kZSgpOwotCi0gICAgICAgICAgICBpZiAocHJvdmlkZXJTZXJ2aWNlTW9kZSAhPSBudWxsICYmIHByb3ZpZGVyU2VydmljZU1vZGUgPT0gU2VydmljZS5Nb2RlLk1FU1NBR0UpIHsKLSAgICAgICAgICAgICAgICBpZiAocHJvdmlkZXJUeXBlLmVxdWFscyhTT0FQTWVzc2FnZS5jbGFzcykpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gV2UgY2FuIGdldCB0aGUgU09BUE1lc3NhZ2UgZGlyZWN0bHkgZnJvbSB0aGUgbWVzc2FnZSBpdHNlbGYKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlByb3ZpZGVyIFR5cGUgaXMgU09BUE1lc3NhZ2UuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIk51bWJlciBNZXNzYWdlIGF0dGFjaG1lbnRzPSIgKyBtZXNzYWdlLmdldEF0dGFjaG1lbnRJRHMoKS5zaXplKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChwcm92aWRlclR5cGUuZXF1YWxzKE9NRWxlbWVudC5jbGFzcykpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFBhcmFtVmFsdWUgPSBtZXNzYWdlLmdldEFzT01FbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFBhcmFtVmFsdWUgPSBtZXNzYWdlLmdldFZhbHVlKG51bGwsIGZhY3RvcnkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAocmVxdWVzdFBhcmFtVmFsdWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoZXJlIGFyZSBubyBlbGVtZW50cyB0byB1bm1hcnNoYWwuICBQcm92aWRlckRpc3BhdGNoIHdpbGwgcGFzcyBhIG51bGwgYXMgaW5wdXQiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gSWYgaXQgaXMgbm90IE1FU1NBR0UsIHRoZW4gaXQgaXMgUEFZTE9BRCAod2hpY2ggaXMgdGhlIGRlZmF1bHQpOyBvbmx5IHdvcmsgd2l0aCB0aGUgYm9keSAKLSAgICAgICAgICAgICAgICBCbG9jayBibG9jayA9IG1lc3NhZ2UuZ2V0Qm9keUJsb2NrKG51bGwsIGZhY3RvcnkpOwotICAgICAgICAgICAgICAgIGlmIChibG9jayAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0UGFyYW1WYWx1ZSA9IGJsb2NrLmdldEJ1c2luZXNzT2JqZWN0KHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcXVlc3RQYXJhbVZhbHVlIGluc3RhbmNlb2YgT01CbG9jaykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RQYXJhbVZhbHVlID0gKChPTUJsb2NrKXJlcXVlc3RQYXJhbVZhbHVlKS5nZXRPTUVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoV2ViU2VydmljZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm8gYm9keSBibG9ja3MgaW4gU09BUE1lc3NhZ2UsIENhbGxpbmcgcHJvdmlkZXIgbWV0aG9kIHdpdGggbnVsbCBpbnB1dCBwYXJhbWV0ZXJzIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFBhcmFtVmFsdWUgPSBudWxsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIHJldHVybiByZXF1ZXN0UGFyYW1WYWx1ZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIE1lc3NhZ2VDb250ZXh0IGNyZWF0ZVJlc3BvbnNlKE1lc3NhZ2VDb250ZXh0IHJlcXVlc3QsIE9iamVjdFtdIGlucHV0LCBPYmplY3Qgb3V0cHV0KSB7Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJTdGFydCBjcmVhdGVSZXNwb25zZSIpOwotICAgICAgICB9Ci0gICAgICAgIE1lc3NhZ2UgbTsKLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlbmRwb2ludERlc2MgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZW5kcG9pbnREZXNjID0gcmVxdWVzdC5nZXRFbmRwb2ludERlc2NyaXB0aW9uKCk7Ci0gICAgICAgICAgICBTZXJ2aWNlLk1vZGUgbW9kZSA9IGVuZHBvaW50RGVzYy5nZXRTZXJ2aWNlTW9kZSgpOwotICAgICAgICAgICAgbSA9IGNyZWF0ZU1lc3NhZ2VGcm9tVmFsdWUob3V0cHV0LCByZXF1ZXN0LmdldE1lc3NhZ2UoKS5nZXRQcm90b2NvbCgpLCBtb2RlKTsKLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiVGhyb3dhYmxlIGNhdWdodCIpOwotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiVGhyb3dhYmxlPSIgKyB0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24odCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiUmVzcG9uc2UgbWVzc2FnZSBpcyBjcmVhdGVkLiIpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBNZXNzYWdlQ29udGV4dCByZXNwb25zZSA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBFbmFibGUgTVRPTSBpZiBpbmRpY2F0ZWQgCi0gICAgICAgICAgICBpZiAoZW5kcG9pbnREZXNjLmlzTVRPTUVuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIG0uc2V0TVRPTUVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLQotICAgICAgICAgICAgcmVzcG9uc2UgPSBNZXNzYWdlQ29udGV4dFV0aWxzLmNyZWF0ZVJlc3BvbnNlTWVzc2FnZUNvbnRleHQocmVxdWVzdCk7Ci0gICAgICAgICAgICBpbml0TWVzc2FnZUNvbnRleHQocmVzcG9uc2UsIG0sIG91dHB1dCk7Ci0gICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJUaHJvd2FibGUgY2F1Z2h0IGNyZWF0aW5nIFJlc3BvbnNlIE1lc3NhZ2VDb250ZXh0Iik7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJUaHJvd2FibGU9IiArIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJFbmQgY3JlYXRlUmVzcG9uc2UiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHJlc3BvbnNlOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0TWVzc2FnZUNvbnRleHQoTWVzc2FnZUNvbnRleHQgcmVzcG9uc2VNc2dDdHgsIE1lc3NhZ2UgbSwgT2JqZWN0IG91dHB1dCkgewotICAgICAgICByZXNwb25zZU1zZ0N0eC5zZXRNZXNzYWdlKG0pOwotICAgICAgICBpZihvdXRwdXQgaW5zdGFuY2VvZiBEYXRhU291cmNlKXsKLSAgICAgICAgICAgIHJlc3BvbnNlTXNnQ3R4LnNldFByb3BlcnR5KENvbnN0YW50cy5Db25maWd1cmF0aW9uLk1FU1NBR0VfRk9STUFUVEVSLCAKLSAgICAgICAgICAgICAgICAgICAgbmV3IERhdGFTb3VyY2VGb3JtYXR0ZXIoKChEYXRhU291cmNlKW91dHB1dCkuZ2V0Q29udGVudFR5cGUoKSkpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBNZXNzYWdlQ29udGV4dCBjcmVhdGVGYXVsdFJlc3BvbnNlKE1lc3NhZ2VDb250ZXh0IHJlcXVlc3QsIFRocm93YWJsZSBmYXVsdCkgewotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ3JlYXRlIFhNTEZhdWx0IGZvciBjcmVhdGVGYXVsdFJlc3BvbnNlIik7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIGNhbGwgdGhlIEludm9jYXRpb25MaXN0ZW5lciBpbnN0YW5jZXMgYmVmb3JlIG1hcnNoYWxsaW5nCi0gICAgICAgIC8vIHRoZSBmYXVsdCBpbnRvIGEgbWVzc2FnZQotICAgICAgICBUaHJvd2FibGUgZmF1bHRNZXNzYWdlID0gSW52b2NhdGlvbkhlbHBlci5kZXRlcm1pbmVNYXBwZWRFeGNlcHRpb24oZmF1bHQsIHJlcXVlc3QpOwotICAgICAgICBpZihmYXVsdE1lc3NhZ2UgIT0gbnVsbCkgewotICAgICAgICAgICAgZmF1bHQgPSBmYXVsdE1lc3NhZ2U7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIE1lc3NhZ2UgbTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZW5kcG9pbnREZXNjID0gcmVxdWVzdC5nZXRFbmRwb2ludERlc2NyaXB0aW9uKCk7Ci0gICAgICAgICAgICBTZXJ2aWNlLk1vZGUgbW9kZSA9IGVuZHBvaW50RGVzYy5nZXRTZXJ2aWNlTW9kZSgpOwotICAgICAgICAgICAgWE1MRmF1bHQgeG1sRmF1bHQgPSBNZXRob2RNYXJzaGFsbGVyVXRpbHMuY3JlYXRlWE1MRmF1bHRGcm9tU3lzdGVtRXhjZXB0aW9uKGZhdWx0KTsKLSAgICAgICAgICAgIG0gPSBjcmVhdGVNZXNzYWdlRnJvbVZhbHVlKHhtbEZhdWx0LCByZXF1ZXN0LmdldE1lc3NhZ2UoKS5nZXRQcm90b2NvbCgpLCBtb2RlKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIE1lc3NhZ2VDb250ZXh0IHJlc3BvbnNlID0gTWVzc2FnZUNvbnRleHRVdGlscy5jcmVhdGVGYXVsdE1lc3NhZ2VDb250ZXh0KHJlcXVlc3QpOwotICAgICAgICByZXNwb25zZS5zZXRNZXNzYWdlKG0pOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHJlc3BvbnNlOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGVuZHBvaW50IHByb3ZpZGVyIGluc3RhbmNlCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFByb3ZpZGVyCi0gICAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgUHJvdmlkZXIgZ2V0UHJvdmlkZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgUHJvdmlkZXIgcCA9IGdldFByb3ZpZGVySW5zdGFuY2UoKTsKLSAgICAgICAgc2V0UHJvdmlkZXIocCk7Ci0gICAgICAgIHJldHVybiBwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgZW5kcG9pbnQgcHJvdmlkZXIgaW5zdGFuY2UKLSAgICAgKgotICAgICAqIEBwYXJhbSBfcHJvdmlkZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm92aWRlcihQcm92aWRlciBfcHJvdmlkZXIpIHsKLSAgICAgICAgdGhpcy5wcm92aWRlckluc3RhbmNlID0gX3Byb3ZpZGVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgcGFyYW1ldGVyIGZvciBhIGdpdmVuIGVuZHBvaW50IGludm9jYXRpb24KLSAgICAgKgotICAgICAqIEByZXR1cm4KLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBNZXNzYWdlIGdldE1lc3NhZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG1lc3NhZ2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBwYXJhbWV0ZXIgZm9yIGEgZ2l2ZW4gZW5kcG9pbnQgaW52b2NhdGlvbgotICAgICAqCi0gICAgICogQHBhcmFtIG1zZwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKLSAgICAgICAgdGhpcy5tZXNzYWdlID0gbXNnOwotICAgIH0KLQotICAgIC8qCi0gICAgKiBDcmVhdGUgYSBNZXNzYWdlIG9iamVjdCBvdXQgb2YgdGhlIHZhbHVlIG9iamVjdCB0aGF0IHdhcyByZXR1cm5lZC4KLSAgICAqLwotICAgIHByaXZhdGUgTWVzc2FnZSBjcmVhdGVNZXNzYWdlRnJvbVZhbHVlKE9iamVjdCB2YWx1ZSwgUHJvdG9jb2wgcHJvdG9jb2wsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZpY2UuTW9kZSBtb2RlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgTWVzc2FnZUZhY3RvcnkgbXNnRmFjdG9yeSA9Ci0gICAgICAgICAgICAgICAgKE1lc3NhZ2VGYWN0b3J5KUZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KE1lc3NhZ2VGYWN0b3J5LmNsYXNzKTsKLSAgICAgICAgTWVzc2FnZSBtZXNzYWdlID0gbnVsbDsKLQotICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgQ2xhc3MgcHJvdmlkZXJUeXBlID0gZ2V0UHJvdmlkZXJUeXBlKCk7Ci0gICAgICAgICAgICBCbG9ja0ZhY3RvcnkgZmFjdG9yeSA9IGNyZWF0ZUJsb2NrRmFjdG9yeShwcm92aWRlclR5cGUpOwotCi0gICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBYTUxGYXVsdCkgewotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkNyZWF0aW5nIG1lc3NhZ2UgZnJvbSBYTUxGYXVsdCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtZXNzYWdlID0gbXNnRmFjdG9yeS5jcmVhdGUocHJvdG9jb2wpOwotICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc2V0WE1MRmF1bHQoKFhNTEZhdWx0KXZhbHVlKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobW9kZSAhPSBudWxsICYmIG1vZGUgPT0gU2VydmljZS5Nb2RlLk1FU1NBR0UpIHsKLSAgICAgICAgICAgICAgICAvLyBGb3IgTUVTU0FHRSBtb2RlLCB3b3JrIHdpdGggdGhlIGVudGlyZSBtZXNzYWdlLCBIZWFkZXJzIGFuZCBCb2R5Ci0gICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBiYXNlZCBvbiBsb2dpYyBpbiBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNsaWVudC5YTUxEaXNwYXRjaC5jcmVhdGVNZXNzYWdlRnJvbUJ1bmRsZSgpCi0gICAgICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU09BUE1lc3NhZ2UpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkNyZWF0aW5nIG1lc3NhZ2UgZnJvbSBTT0FQTWVzc2FnZSIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBtc2dGYWN0b3J5LmNyZWF0ZUZyb20oKFNPQVBNZXNzYWdlKXZhbHVlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgU09BUEVudmVsb3BlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRoZSB2YWx1ZSBmcm9tIHRoZSBwcm92aWRlciBpcyBhbHJlYWR5IGFuIFNPQVBFbnZlbG9wZSBPTUVsZW1lbnQsIHNvCi0gICAgICAgICAgICAgICAgICAgIC8vIGl0IGRvZXNuJ3QgbmVlZCB0byBiZSBwYXJzZWQgaW50byBvbmUuCi0gICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJDcmVhdGluZyBtZXNzYWdlIGZyb20gT01FbGVtZW50Iik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IG1zZ0ZhY3RvcnkuY3JlYXRlRnJvbSgoU09BUEVudmVsb3BlKSB2YWx1ZSwgcHJvdG9jb2wpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJDcmVhdGluZyBtZXNzYWdlIHVzaW5nICIgKyBmYWN0b3J5KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBCbG9jayBibG9jayA9IGZhY3RvcnkuY3JlYXRlRnJvbSh2YWx1ZSwgbnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBtc2dGYWN0b3J5LmNyZWF0ZUZyb20oYmxvY2ssIG51bGwsIHByb3RvY29sKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIFBBWUxPQUQgbW9kZSBkZWFscyBvbmx5IHdpdGggdGhlIGJvZHkgb2YgdGhlIG1lc3NhZ2UuCi0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ3JlYXRpbmcgbWVzc2FnZSAocGF5bG9hZCkgdXNpbmcgIiArIGZhY3RvcnkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBCbG9jayBibG9jayA9IGZhY3RvcnkuY3JlYXRlRnJvbSh2YWx1ZSwgbnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgbWVzc2FnZSA9IG1zZ0ZhY3RvcnkuY3JlYXRlKHByb3RvY29sKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAoWE1MRmF1bHRVdGlscy5jb250YWluc0ZhdWx0KGJsb2NrKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiVGhlIHJlc3BvbnNlIGJsb2NrIGNyZWF0ZWQgY29udGFpbmVkIGEgZmF1bHQuICBDb252ZXJ0aW5nIHRvIGFuIFhNTEZhdWx0IG9iamVjdC4iKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgUHJvdmlkZXIgcmV0dXJuZWQgYSBmYXVsdCwgdGhlbiBsZXQncyBjb3JyZWN0IHRoZSBvdXRwdXQgYW5kIAotICAgICAgICAgICAgICAgICAgICAvLyBwdXQgYW4gWE1MRmF1bHQgb24gdGhlIE1lc3NhZ2UuICBUaGlzIG1ha2VzIGl0IGVhc2llciBmb3IgZG93bnN0cmVhbSAKLSAgICAgICAgICAgICAgICAgICAgLy8gY29uc3VtZXJzIHRvIGdldCB0aGUgU09BUEZhdWx0IGZyb20gdGhlIE9NIFNPQVBFbnZlbG9wZS4KLSAgICAgICAgICAgICAgICAgICAgWE1MRmF1bHQgZmF1bHQgPSBYTUxGYXVsdFV0aWxzLmNyZWF0ZVhNTEZhdWx0KGJsb2NrLCBtZXNzYWdlLmdldFByb3RvY29sKCkpOwotICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnNldFhNTEZhdWx0KGZhdWx0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc2V0Qm9keUJsb2NrKGJsb2NrKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobWVzc2FnZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBJZiB3ZSBkaWRuJ3QgY3JlYXRlIGEgbWVzc2FnZSBhYm92ZSAoYmVjYXVzZSB0aGVyZSB3YXMgbm8gdmFsdWUpLCBjcmVhdGUgb25lIGhlcmUKLSAgICAgICAgICAgIG1lc3NhZ2UgPSBtc2dGYWN0b3J5LmNyZWF0ZShwcm90b2NvbCk7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIHJldHVybiBtZXNzYWdlOwotICAgIH0KLQotICAgIC8qCi0gICAgICAqIERldGVybWluZSB0aGUgUHJvdmlkZXIgdHlwZSBmb3IgdGhpcyBpbnN0YW5jZQotICAgICAgKi8KLSAgICBwcml2YXRlIFByb3ZpZGVyIGdldFByb3ZpZGVySW5zdGFuY2UoKSB7Ci0gICAgICAgIENsYXNzPD8+IGNsYXp6ID0gZ2V0UHJvdmlkZXJUeXBlKCk7Ci0KLSAgICAgICAgaWYgKCFpc1ZhbGlkUHJvdmlkZXJUeXBlKGNsYXp6KSkgewotICAgICAgICAgICAgLy8gVE9ETyBUaGlzIHdpbGwgY2hhbmdlIG9uY2UgZGVwbG95bWVudCBjb2RlIGl0IGluIHBsYWNlCi0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoIkludmFsaWRQcm92aWRlciIsIGNsYXp6LmdldE5hbWUoKSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgUHJvdmlkZXIgcHJvdmlkZXIgPSBudWxsOwotICAgICAgICBpZiAoY2xhenogPT0gU3RyaW5nLmNsYXNzKSB7Ci0gICAgICAgICAgICBwcm92aWRlciA9IChQcm92aWRlcjxTdHJpbmc+KXNlcnZpY2VJbnN0YW5jZTsKLSAgICAgICAgfSBlbHNlIGlmIChjbGF6eiA9PSBTb3VyY2UuY2xhc3MpIHsKLSAgICAgICAgICAgIHByb3ZpZGVyID0gKFByb3ZpZGVyPFNvdXJjZT4pc2VydmljZUluc3RhbmNlOwotICAgICAgICB9IGVsc2UgaWYgKGNsYXp6ID09IFNPQVBNZXNzYWdlLmNsYXNzKSB7Ci0gICAgICAgICAgICBwcm92aWRlciA9IChQcm92aWRlcjxTT0FQTWVzc2FnZT4pc2VydmljZUluc3RhbmNlOwotICAgICAgICB9IGVsc2UgaWYgKGNsYXp6ID09IERhdGFTb3VyY2UuY2xhc3MpIHsKLSAgICAgICAgICAgIHByb3ZpZGVyID0gKFByb3ZpZGVyPERhdGFTb3VyY2U+KXNlcnZpY2VJbnN0YW5jZTsKLSAgICAgICAgfSBlbHNlIGlmIChjbGF6eiA9PSBPTUVsZW1lbnQuY2xhc3MpIHsKLSAgICAgICAgICAgIHByb3ZpZGVyID0gKFByb3ZpZGVyPE9NRWxlbWVudD4pc2VydmljZUluc3RhbmNlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHByb3ZpZGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoIkludmFsaWRQcm92aWRlckNyZWF0ZSIsIGNsYXp6LmdldE5hbWUoKSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHByb3ZpZGVyOwotCi0gICAgfQotCi0gICAgLyoKLSAgICAgKiBHZXQgdGhlIHByb3ZpZGVyIHR5cGUgZnJvbSBhIGdpdmVuIGltcGxlbWVudGlvbiBjbGFzcyBpbnN0YW5jZQotICAgICAqLwotICAgIHByaXZhdGUgQ2xhc3M8Pz4gZ2V0UHJvdmlkZXJUeXBlKCkgewotCi0gICAgICAgIGlmIChfcHJvdmlkZXJUeXBlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBfcHJvdmlkZXJUeXBlOwotICAgICAgICB9Ci0gICAgICAgIENsYXNzIHByb3ZpZGVyVHlwZSA9IG51bGw7Ci0KLSAgICAgICAgVHlwZVtdIGdpVHlwZXMgPSBzZXJ2aWNlSW1wbENsYXNzLmdldEdlbmVyaWNJbnRlcmZhY2VzKCk7Ci0gICAgICAgIGZvciAoVHlwZSBnaVR5cGUgOiBnaVR5cGVzKSB7Ci0gICAgICAgICAgICBQYXJhbWV0ZXJpemVkVHlwZSBwYXJhbVR5cGUgPSBudWxsOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBwYXJhbVR5cGUgPSAoUGFyYW1ldGVyaXplZFR5cGUpZ2lUeXBlOwotICAgICAgICAgICAgfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyB0aGlzIG1heSBub3QgYmUgYSBwYXJhbWV0ZXJpemVkIGludGVyZmFjZQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQ2xhc3MgaW50ZXJmYWNlTmFtZSA9IChDbGFzcylwYXJhbVR5cGUuZ2V0UmF3VHlwZSgpOwotCi0gICAgICAgICAgICBpZiAoaW50ZXJmYWNlTmFtZSA9PSBqYXZheC54bWwud3MuUHJvdmlkZXIuY2xhc3MpIHsKLSAgICAgICAgICAgICAgICBpZiAocGFyYW1UeXBlLmdldEFjdHVhbFR5cGVBcmd1bWVudHMoKS5sZW5ndGggPiAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgicFR5cGVFcnIiKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHByb3ZpZGVyVHlwZSA9IChDbGFzcylwYXJhbVR5cGUuZ2V0QWN0dWFsVHlwZUFyZ3VtZW50cygpWzBdOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIF9wcm92aWRlclR5cGUgPSBwcm92aWRlclR5cGU7Ci0gICAgICAgIHJldHVybiBwcm92aWRlclR5cGU7Ci0gICAgfQotCi0gICAgLyoKLSAgICAqIFZhbGlkYXRlIHdoZXRoZXIgb3Igbm90IHRoZSBDbGFzcyBwYXNzZWQgaW4gaXMgYSB2YWxpZCB0eXBlIG9mCi0gICAgKiBqYXZheC54bWwud3MuUHJvdmlkZXI8VD4uICBQZXIgdGhlIEpBWC1XUyAyLjAgc3BlY2lmaWNhdGlvbiwgdGhlCi0gICAgKiBwYXJhbWV0ZXJpemVkIHR5cGUgb2YgYSBQcm92aWRlciBjYW4gb25seSBiZToKLSAgICAqCi0gICAgKiAgIGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlCi0gICAgKiAgIGphdmF4LnhtbC5zb2FwLlNPQVBNZXNzYWdlCi0gICAgKiAgIGphdmF4LmFjdGl2YXRpb24uRGF0YVNvdXJjZQotICAgICogICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudAotICAgICoKLSAgICAqIFdlJ3ZlIGFsc28gYWRkZWQgc3VwcG9ydCBmb3IgU3RyaW5nIHR5cGVzIHdoaWNoIGlzIE5PVCBkaWN0YXRlZAotICAgICogYnkgdGhlIHNwZWMuCi0gICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNWYWxpZFByb3ZpZGVyVHlwZShDbGFzcyBjbGF6eikgewotICAgICAgICBib29sZWFuIHZhbGlkID0gY2xhenogPT0gU3RyaW5nLmNsYXNzIHx8Ci0gICAgICAgICAgICAgICAgY2xhenogPT0gU09BUE1lc3NhZ2UuY2xhc3MgfHwKLSAgICAgICAgICAgICAgICBjbGF6eiA9PSBTb3VyY2UuY2xhc3MgfHwKLSAgICAgICAgICAgICAgICBjbGF6eiA9PSBEYXRhU291cmNlLmNsYXNzIHx8Ci0gICAgICAgICAgICAgICAgY2xhenogPT0gT01FbGVtZW50LmNsYXNzOwotCi0gICAgICAgIGlmICghdmFsaWQpIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ2xhc3MgIiArIGNsYXp6LmdldE5hbWUoKSArICIgaXMgbm90IGEgdmFsaWQgUHJvdmlkZXI8VD4gdHlwZSIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHZhbGlkOwotICAgIH0KLQotICAgIC8qCi0gICAgKiBHaXZlbiBhIHRhcmdldCBjbGFzcyB0eXBlIGZvciBhIHBheWxvYWQsIGxvYWQgdGhlIGFwcHJvcHJpYXRlIEJsb2NrRmFjdG9yeS4KLSAgICAqLwotICAgIHByaXZhdGUgQmxvY2tGYWN0b3J5IGNyZWF0ZUJsb2NrRmFjdG9yeShDbGFzcyB0eXBlKSB7Ci0gICAgICAgIGlmIChfYmxvY2tGYWN0b3J5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBfYmxvY2tGYWN0b3J5OwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHR5cGUuZXF1YWxzKFN0cmluZy5jbGFzcykpIHsKLSAgICAgICAgICAgIF9ibG9ja0ZhY3RvcnkgPSAoWE1MU3RyaW5nQmxvY2tGYWN0b3J5KUZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KAotICAgICAgICAgICAgICAgICAgICBYTUxTdHJpbmdCbG9ja0ZhY3RvcnkuY2xhc3MpOwotICAgICAgICB9IGVsc2UgaWYgKHR5cGUuZXF1YWxzKERhdGFTb3VyY2UuY2xhc3MpKSB7Ci0gICAgICAgICAgICBfYmxvY2tGYWN0b3J5ID0gKERhdGFTb3VyY2VCbG9ja0ZhY3RvcnkpRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoCi0gICAgICAgICAgICAgICAgICAgIERhdGFTb3VyY2VCbG9ja0ZhY3RvcnkuY2xhc3MpOwotICAgICAgICB9IGVsc2UgaWYgKHR5cGUuZXF1YWxzKFNvdXJjZS5jbGFzcykpIHsKLSAgICAgICAgICAgIF9ibG9ja0ZhY3RvcnkgPSAoU291cmNlQmxvY2tGYWN0b3J5KUZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KAotICAgICAgICAgICAgICAgICAgICBTb3VyY2VCbG9ja0ZhY3RvcnkuY2xhc3MpOwotICAgICAgICB9IGVsc2UgaWYgKHR5cGUuZXF1YWxzKFNPQVBNZXNzYWdlLmNsYXNzKSkgewotICAgICAgICAgICAgX2Jsb2NrRmFjdG9yeSA9IChTT0FQRW52ZWxvcGVCbG9ja0ZhY3RvcnkpRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoCi0gICAgICAgICAgICAgICAgICAgIFNPQVBFbnZlbG9wZUJsb2NrRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgIH0gZWxzZSBpZiAodHlwZS5lcXVhbHMoT01FbGVtZW50LmNsYXNzKSkgewotICAgICAgICAgICAgX2Jsb2NrRmFjdG9yeSA9IChPTUJsb2NrRmFjdG9yeSlGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeSgKLSAgICAgICAgICAgICAgICAgICAgT01CbG9ja0ZhY3RvcnkuY2xhc3MpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbigKLSAgICAgICAgICAgIAkJTWVzc2FnZXMuZ2V0TWVzc2FnZSgiYkZhY3RvcnlFcnIiLHR5cGUuZ2V0TmFtZSgpKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gX2Jsb2NrRmFjdG9yeTsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIE1ldGhvZCBnZXRKYXZhTWV0aG9kKCkgewotICAgICAgICBNZXRob2QgbSA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtID0gcHJvdmlkZXJJbnN0YW5jZS5nZXRDbGFzcygpLmdldE1ldGhvZCgiaW52b2tlIiwgbmV3IENsYXNzW10ge2dldFByb3ZpZGVyVHlwZSgpfSk7Ci0gICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gbTsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZShNZXNzYWdlQ29udGV4dCBtYykgewotCi0gICAgICAgIG1jLnNldE9wZXJhdGlvbk5hbWUobWMuZ2V0QXhpc01lc3NhZ2VDb250ZXh0KCkuZ2V0QXhpc09wZXJhdGlvbigpLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgZW5kcG9pbnREZXNjID0gbWMuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbigpOwotICAgICAgICBpZiAoZW5kcG9pbnREZXNjLmlzTVRPTUVuYWJsZWQoKSkgewotICAgICAgICAgICAgbWMuZ2V0TWVzc2FnZSgpLnNldE1UT01FbmFibGVkKHRydWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy9TZXQgU09BUCBPcGVyYXRpb24gUmVsYXRlZCBwcm9wZXJ0aWVzIGluIFNPQVBNZXNzYWdlQ29udGV4dC4KLQotICAgICAgICBDb250ZXh0VXRpbHMuYWRkV1NETFByb3BlcnRpZXNfcHJvdmlkZXIobWMpOwotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zZXJ2ZXIvZGlzcGF0Y2hlci9mYWN0b3J5L0VuZHBvaW50RGlzcGF0Y2hlckZhY3RvcnkuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NlcnZlci9kaXNwYXRjaGVyL2ZhY3RvcnkvRW5kcG9pbnREaXNwYXRjaGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzkwNGQ0Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NlcnZlci9kaXNwYXRjaGVyL2ZhY3RvcnkvRW5kcG9pbnREaXNwYXRjaGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNlcnZlci5kaXNwYXRjaGVyLmZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zZXJ2ZXIuZGlzcGF0Y2hlci5FbmRwb2ludERpc3BhdGNoZXI7Ci0KLQotcHVibGljIGludGVyZmFjZSBFbmRwb2ludERpc3BhdGNoZXJGYWN0b3J5IHsKLQotICAgIHB1YmxpYyBFbmRwb2ludERpc3BhdGNoZXIgY3JlYXRlRW5kcG9pbnREaXNwYXRjaGVyKENsYXNzIHNlcnZpY2VJbXBsLCAKLSAgICAgICAgT2JqZWN0IHNlcnZpY2VJbnN0YW5jZSk7Ci0gICAgCi0gICAgcHVibGljIEVuZHBvaW50RGlzcGF0Y2hlciBjcmVhdGVFbmRwb2ludERpc3BhdGNoZXIoTWVzc2FnZUNvbnRleHQgbWMsIAotICAgICAgICBDbGFzcyBzZXJ2aWNlSW1wbCwgT2JqZWN0IHNlcnZpY2VJbnN0YW5jZSk7Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NlcnZlci9kaXNwYXRjaGVyL2ZhY3RvcnkvRW5kcG9pbnREaXNwYXRjaGVyRmFjdG9yeUltcGwuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NlcnZlci9kaXNwYXRjaGVyL2ZhY3RvcnkvRW5kcG9pbnREaXNwYXRjaGVyRmFjdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZjN2Q2Yi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zZXJ2ZXIvZGlzcGF0Y2hlci9mYWN0b3J5L0VuZHBvaW50RGlzcGF0Y2hlckZhY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNlcnZlci5kaXNwYXRjaGVyLmZhY3Rvcnk7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS5NZXNzYWdlQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zZXJ2ZXIuZGlzcGF0Y2hlci5FbmRwb2ludERpc3BhdGNoZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2VydmVyLmRpc3BhdGNoZXIuSmF2YUJlYW5EaXNwYXRjaGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNlcnZlci5kaXNwYXRjaGVyLlByb3ZpZGVyRGlzcGF0Y2hlcjsNCi0NCi1pbXBvcnQgamF2YXgueG1sLndzLlByb3ZpZGVyOw0KLQ0KLXB1YmxpYyBjbGFzcyBFbmRwb2ludERpc3BhdGNoZXJGYWN0b3J5SW1wbCBpbXBsZW1lbnRzIEVuZHBvaW50RGlzcGF0Y2hlckZhY3Rvcnkgew0KLQ0KLSAgICBwdWJsaWMgRW5kcG9pbnREaXNwYXRjaGVyIGNyZWF0ZUVuZHBvaW50RGlzcGF0Y2hlcihNZXNzYWdlQ29udGV4dCBtYywgDQotICAgICAgICBDbGFzcyBzZXJ2aWNlSW1wbCwgT2JqZWN0IHNlcnZpY2VJbnN0YW5jZSkgew0KLSAgICAgICAgLy8gVE9ETzogIFRoaXMgY2hlY2sgc2hvdWxkIGJlIGJhc2VkIG9uIHRoZSBFbmRwb2ludERlc2NyaXB0aW9uIHByb2Nlc3Npbmcgb2YgYW5ub3RhdGlvbnMNCi0gICAgICAgIC8vIEl0IGlzIGxlZnQgdGhpcyB3YXkgZm9yIG5vdyBiZWNhdXNlIHNvbWUgdGVzdHMgaGF2ZSBhbiBAV2ViU2VydmljZSBhbm5vdGF0aW9uIG9uDQotICAgICAgICAvLyBQcm92aWRlci1iYXNlZCBlbmRwb2ludHMgYXMgYSBwcmUtZXhpc3Rpbmcgd29ya2Fyb3VuZC4NCi0gICAgICAgIGlmIChQcm92aWRlci5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHNlcnZpY2VJbXBsKSkgew0KLSAgICAgICAgICAgIHJldHVybiBuZXcgUHJvdmlkZXJEaXNwYXRjaGVyKHNlcnZpY2VJbXBsLCBzZXJ2aWNlSW5zdGFuY2UpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICByZXR1cm4gbmV3IEphdmFCZWFuRGlzcGF0Y2hlcihzZXJ2aWNlSW1wbCwgc2VydmljZUluc3RhbmNlKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgRW5kcG9pbnREaXNwYXRjaGVyIGNyZWF0ZUVuZHBvaW50RGlzcGF0Y2hlcihDbGFzcyBzZXJ2aWNlSW1wbCwNCi0gICAgICAgIE9iamVjdCBzZXJ2aWNlSW5zdGFuY2UpIHsNCi0gICAgICAgIHJldHVybiBjcmVhdGVFbmRwb2ludERpc3BhdGNoZXIobnVsbCwgc2VydmljZUltcGwsIHNlcnZpY2VJbnN0YW5jZSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2VydmVyL2VuZHBvaW50L0VuZHBvaW50SW1wbC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2VydmVyL2VuZHBvaW50L0VuZHBvaW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGI3ZGUxLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NlcnZlci9lbmRwb2ludC9FbmRwb2ludEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2VydmVyLmVuZHBvaW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5FeGNlcHRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuYWRkcmVzc2luZy51dGlsLkVuZHBvaW50UmVmZXJlbmNlVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5iaW5kaW5nLkJpbmRpbmdVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkRlc2NyaXB0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkVuZHBvaW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5TZXJ2aWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5pMThuLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuSFRUUFdvcmtlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5zZXJ2ZXIuU2ltcGxlSHR0cFNlcnZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLnNlcnZlci5Xb3JrZXJGYWN0b3J5OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC53cy5CaW5kaW5nOwotaW1wb3J0IGphdmF4LnhtbC53cy5FbmRwb2ludFJlZmVyZW5jZTsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwud3Mud3NhZGRyZXNzaW5nLlczQ0VuZHBvaW50UmVmZXJlbmNlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yOwotCi1wdWJsaWMgY2xhc3MgRW5kcG9pbnRJbXBsIGV4dGVuZHMgamF2YXgueG1sLndzLkVuZHBvaW50IHsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBwdWJsaXNoZWQ7Ci0gICAgcHJpdmF0ZSBPYmplY3QgaW1wbGVtZW50b3I7Ci0gICAgcHJpdmF0ZSBFbmRwb2ludERlc2NyaXB0aW9uIGVuZHBvaW50RGVzYzsKLSAgICBwcml2YXRlIEJpbmRpbmcgYmluZGluZzsKLSAgICBwcml2YXRlIFNpbXBsZUh0dHBTZXJ2ZXIgc2VydmVyOwotICAgIHByaXZhdGUgTGlzdDxTb3VyY2U+IG1ldGFkYXRhOwotICAgIHByaXZhdGUgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzOwotICAgIHByaXZhdGUgRXhlY3V0b3IgZXhlY3V0b3I7Ci0KLSAgICBwdWJsaWMgRW5kcG9pbnRJbXBsKE9iamVjdCBvKSB7Ci0gICAgICAgIGltcGxlbWVudG9yID0gbzsKLSAgICAgICAgaW5pdGlhbGl6ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBFbmRwb2ludEltcGwoT2JqZWN0IG8sIEJpbmRpbmcgYm5kLCBFbmRwb2ludERlc2NyaXB0aW9uIGVkKSB7Ci0gICAgICAgIGltcGxlbWVudG9yID0gbzsKLSAgICAgICAgZW5kcG9pbnREZXNjID0gZWQ7Ci0gICAgICAgIGluaXRpYWxpemUoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLSAgICAgICAgaWYgKGltcGxlbWVudG9yID09IG51bGwpIHsKLSAgICAgICAgCQotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJpbml0RXJyIikpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIHRoZSBuZWNlc3NhcnkgbWV0YWRhdGEsIGxldCdzIGdvIGFoZWFkIGFuZAotICAgICAgICAvLyBjcmVhdGUgaXQuCi0gICAgICAgIGlmIChlbmRwb2ludERlc2MgPT0gbnVsbCkgeyAgICAgICAgCi0gICAgICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc2QgPSBEZXNjcmlwdGlvbkZhY3RvcnkuY3JlYXRlU2VydmljZURlc2NyaXB0aW9uKGltcGxlbWVudG9yLmdldENsYXNzKCkpOwotICAgICAgICAgICAgZW5kcG9pbnREZXNjID0gc2QuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbnNfQXNDb2xsZWN0aW9uKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmIChlbmRwb2ludERlc2MgIT0gbnVsbCAmJiBiaW5kaW5nID09IG51bGwpIHsKLSAgICAgICAgICAgIGJpbmRpbmcgPSBCaW5kaW5nVXRpbHMuY3JlYXRlQmluZGluZyhlbmRwb2ludERlc2MpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaXNoZWQgPSBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKgotICAgICogKG5vbi1KYXZhZG9jKQotICAgICogQHNlZSBqYXZheC54bWwud3MuRW5kcG9pbnQjZ2V0TWV0YWRhdGEoKQotICAgICovCi0gICAgcHVibGljIExpc3Q8U291cmNlPiBnZXRNZXRhZGF0YSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMubWV0YWRhdGE7Ci0gICAgfQotCi0gICAgLyoKLSAgICAqIChub24tSmF2YWRvYykKLSAgICAqIEBzZWUgamF2YXgueG1sLndzLkVuZHBvaW50I3NldE1ldGFkYXRhKGphdmEudXRpbC5MaXN0KQotICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TWV0YWRhdGEoTGlzdDxTb3VyY2U+IGxpc3QpIHsKLSAgICAgICAgdGhpcy5tZXRhZGF0YSA9IGxpc3Q7Ci0gICAgfQotCi0gICAgLyoKLSAgICAqIChub24tSmF2YWRvYykKLSAgICAqIEBzZWUgamF2YXgueG1sLndzLkVuZHBvaW50I2dldFByb3BlcnRpZXMoKQotICAgICovCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD4gZ2V0UHJvcGVydGllcygpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucHJvcGVydGllczsKLSAgICB9Ci0KLSAgICAvKgotICAgICogKG5vbi1KYXZhZG9jKQotICAgICogQHNlZSBqYXZheC54bWwud3MuRW5kcG9pbnQjc2V0UHJvcGVydGllcyhqYXZhLnV0aWwuTWFwKQotICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydGllcyhNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpIHsKLSAgICAgICAgdGhpcy5wcm9wZXJ0aWVzID0gcHJvcGVydGllczsKLSAgICB9Ci0KLSAgICAvKgotICAgICogKG5vbi1KYXZhZG9jKQotICAgICogQHNlZSBqYXZheC54bWwud3MuRW5kcG9pbnQjZ2V0QmluZGluZygpCi0gICAgKi8KLSAgICBwdWJsaWMgQmluZGluZyBnZXRCaW5kaW5nKCkgewotICAgICAgICByZXR1cm4gYmluZGluZzsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIGphdmF4LnhtbC53cy5FbmRwb2ludCNnZXRFeGVjdXRvcigpCi0gICAgICovCi0gICAgcHVibGljIEV4ZWN1dG9yIGdldEV4ZWN1dG9yKCkgewotICAgICAgICByZXR1cm4gdGhpcy5leGVjdXRvcjsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIGphdmF4LnhtbC53cy5FbmRwb2ludCNnZXRJbXBsZW1lbnRvcigpCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRJbXBsZW1lbnRvcigpIHsKLSAgICAgICAgcmV0dXJuIGltcGxlbWVudG9yOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgamF2YXgueG1sLndzLkVuZHBvaW50I2lzUHVibGlzaGVkKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1B1Ymxpc2hlZCgpIHsKLSAgICAgICAgcmV0dXJuIHB1Ymxpc2hlZDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIGphdmF4LnhtbC53cy5FbmRwb2ludCNwdWJsaXNoKGphdmEubGFuZy5PYmplY3QpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcHVibGlzaChPYmplY3Qgb2JqKSB7Ci0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIGphdmF4LnhtbC53cy5FbmRwb2ludCNwdWJsaXNoKGphdmEubGFuZy5TdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcHVibGlzaChTdHJpbmcgcykgewotICAgICAgICBpbnQgcG9ydCA9IC0xOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgVVJJIHVyaSA9IG5ldyBVUkkocyk7Ci0gICAgICAgICAgICBwb3J0ID0gdXJpLmdldFBvcnQoKTsKLSAgICAgICAgfSBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfQotICAgICAgICAvLyBEZWZhdWx0IHRvIDgwODAKLSAgICAgICAgaWYocG9ydCA9PSAtMSl7Ci0gICAgICAgICAgICBwb3J0ID0gODA4MDsKLSAgICAgICAgfQotICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBjdHggPSBlbmRwb2ludERlc2MuZ2V0U2VydmljZURlc2NyaXB0aW9uKCkuZ2V0QXhpc0NvbmZpZ0NvbnRleHQoKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gRm9yIHNvbWUgcmVhc29uIHRoZSBBeGlzU2VydmljZSBoYXMgbm90IGJlZW4gYWRkZWQgdG8gdGhlIENvbmZpZ3VyYXRpb25Db250ZXh0Ci0gICAgICAgICAgICAvLyBhdCB0aGlzIHBvaW50LCBzbyB3ZSBuZWVkIHRvIGRvIGl0IGZvciB0aGUgc2VydmljZSB0byBiZSBhdmFpbGFibGUuCi0gICAgICAgICAgICBBeGlzU2VydmljZSBzdmMgPSBlbmRwb2ludERlc2MuZ2V0QXhpc1NlcnZpY2UoKTsKLSAgICAgICAgICAgIGN0eC5nZXRBeGlzQ29uZmlndXJhdGlvbigpLmFkZFNlcnZpY2Uoc3ZjKTsKLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGUpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gICAgICAgIAotCi0gICAgICAgIC8vIFJlbW92ZSB0aGUgZGVmYXVsdCAiYXhpczIiIGNvbnRleHQgcm9vdC4KLSAgICAgICAgY3R4LnNldENvbnRleHRSb290KCIvIik7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICBXb3JrZXJGYWN0b3J5IHdmID0gbmV3IEhUVFBXb3JrZXJGYWN0b3J5KCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNlcnZlciA9IG5ldyBTaW1wbGVIdHRwU2VydmVyKGN0eCwgd2YsIHBvcnQpOwotICAgICAgICAgICAgc2VydmVyLmluaXQoKTsgICAgICAgICAgICAKLSAgICAgICAgICAgIHNlcnZlci5zdGFydCgpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGlzaGVkID0gdHJ1ZTsgICAgICAKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIGphdmF4LnhtbC53cy5FbmRwb2ludCNzZXRFeGVjdXRvcihqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRFeGVjdXRvcihFeGVjdXRvciBleGVjdXRvcikgewotICAgICAgICB0aGlzLmV4ZWN1dG9yID0gZXhlY3V0b3I7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBqYXZheC54bWwud3MuRW5kcG9pbnQjc3RvcCgpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc3RvcCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmKHNlcnZlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc2VydmVyLmRlc3Ryb3koKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgPFQgZXh0ZW5kcyBFbmRwb2ludFJlZmVyZW5jZT4gVCBnZXRFbmRwb2ludFJlZmVyZW5jZShDbGFzczxUPiBjbGF6eiwgRWxlbWVudC4uLiByZWZlcmVuY2VQYXJhbWV0ZXJzKSB7Ci0gICAgICAgIGlmICghaXNQdWJsaXNoZWQoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oIkVuZHBvaW50IGlzIG5vdCBwdWJsaXNoZWQiKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKCFCaW5kaW5nVXRpbHMuaXNTT0FQQmluZGluZyhiaW5kaW5nLmdldEJpbmRpbmdJRCgpKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJUaGlzIG1ldGhvZCBpcyB1bnN1cHBvcnRlZCBmb3IgdGhlIGJpbmRpbmc6ICIgKyBiaW5kaW5nLmdldEJpbmRpbmdJRCgpKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgRW5kcG9pbnRSZWZlcmVuY2UgamF4d3NFUFIgPSBudWxsOwotICAgICAgICBTdHJpbmcgYWRkcmVzc2luZ05hbWVzcGFjZSA9IEVuZHBvaW50UmVmZXJlbmNlVXRpbHMuZ2V0QWRkcmVzc2luZ05hbWVzcGFjZShjbGF6eik7Ci0gICAgICAgIFN0cmluZyBhZGRyZXNzID0gZW5kcG9pbnREZXNjLmdldEVuZHBvaW50QWRkcmVzcygpOwotICAgICAgICBRTmFtZSBzZXJ2aWNlTmFtZSA9IGVuZHBvaW50RGVzYy5nZXRTZXJ2aWNlUU5hbWUoKTsKLSAgICAgICAgUU5hbWUgcG9ydE5hbWUgPSBlbmRwb2ludERlc2MuZ2V0UG9ydFFOYW1lKCk7Ci0gICAgICAgIAotICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2UgYXhpczJFUFIgPQotICAgICAgICAJRW5kcG9pbnRSZWZlcmVuY2VVdGlscy5jcmVhdGVBeGlzMkVuZHBvaW50UmVmZXJlbmNlKGFkZHJlc3MsIHNlcnZpY2VOYW1lLCBwb3J0TmFtZSwgbnVsbCwgYWRkcmVzc2luZ05hbWVzcGFjZSk7Ci0gICAgICAgIAotICAgICAgICB0cnkgewotICAgICAgICAgICAgRW5kcG9pbnRSZWZlcmVuY2VVdGlscy5hZGRSZWZlcmVuY2VQYXJhbWV0ZXJzKGF4aXMyRVBSLCByZWZlcmVuY2VQYXJhbWV0ZXJzKTsKLSAgICAgICAgICAgIGpheHdzRVBSID0gRW5kcG9pbnRSZWZlcmVuY2VVdGlscy5jb252ZXJ0RnJvbUF4aXMyKGF4aXMyRVBSLCBhZGRyZXNzaW5nTmFtZXNwYWNlKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkuCi0gICAgICAgICAgICAgIG1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoImVuZHBvaW50UmVmQ3JlYXRpb25FcnJvciIpLCBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjbGF6ei5jYXN0KGpheHdzRVBSKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgRW5kcG9pbnRSZWZlcmVuY2UgZ2V0RW5kcG9pbnRSZWZlcmVuY2UoRWxlbWVudC4uLiByZWZlcmVuY2VQYXJhbWV0ZXJzKSB7Ci0gICAgICAgIHJldHVybiBnZXRFbmRwb2ludFJlZmVyZW5jZShXM0NFbmRwb2ludFJlZmVyZW5jZS5jbGFzcywgcmVmZXJlbmNlUGFyYW1ldGVycyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2VydmVyL2VuZHBvaW50L1V0aWxzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zZXJ2ZXIvZW5kcG9pbnQvVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBkMjFlMS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zZXJ2ZXIvZW5kcG9pbnQvVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNlcnZlci5lbmRwb2ludDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5FeGNlcHRpb25GYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmJpbmRpbmcuQmluZGluZ1V0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUuTWVzc2FnZUNvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS51dGlsLk1lc3NhZ2VDb250ZXh0VXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRW5kcG9pbnREZXNjcmlwdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5FbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLk9wZXJhdGlvbkRlc2NyaXB0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLlNlcnZpY2VEZXNjcmlwdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5pMThuLk1lc3NhZ2VzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuTWVzc2FnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLlByb3RvY29sOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuWE1MRmF1bHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5YTUxGYXVsdENvZGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5YTUxGYXVsdFJlYXNvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmZhY3RvcnkuTWVzc2FnZUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MucmVnaXN0cnkuRmFjdG9yeVJlZ2lzdHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC54bWwud3MuaHR0cC5IVFRQQmluZGluZzsNCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCi0NCi1wdWJsaWMgY2xhc3MgVXRpbHMgew0KLSAgICANCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coVXRpbHMuY2xhc3MpOw0KLSAgICANCi0gICAgQERlcHJlY2F0ZWQNCi0gICAgLyoqDQotICAgICAqIENvbXBhcmVzIHRoZSB2ZXJzaW9uIG9mIHRoZSBtZXNzYWdlIGluIHRoZSBNZXNzYWdlQ29udGV4dCB0byB3aGF0J3MgZXhwZWN0ZWQNCi0gICAgICogZ2l2ZW4gdGhlIFNlcnZpY2VEZXNjcmlwdGlvbi4gIFRoZSBiZWhhdmlvciBpcyBkZXNjcmliZWQgaW4gdGhlIFNPQVAgMS4yDQotICAgICAqIHNwZWNpZmljYXRpb24gdW5kZXIgQXBwZW5kaXggJ0EnLg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIG1jDQotICAgICAqIEBwYXJhbSBzZXJ2aWNlRGVzYw0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gYmluZGluZ1R5cGVzTWF0Y2goTWVzc2FnZUNvbnRleHQgbWMsIFNlcnZpY2VEZXNjcmlwdGlvbiBzZXJ2aWNlRGVzYykgew0KLSAgICAgICAgQ29sbGVjdGlvbjxFbmRwb2ludERlc2NyaXB0aW9uPiBlZHMgPSBzZXJ2aWNlRGVzYy5nZXRFbmRwb2ludERlc2NyaXB0aW9uc19Bc0NvbGxlY3Rpb24oKTsNCi0NCi0gICAgICAgIC8vIERpc3BhdGNoIGVuZHBvaW50cyBkbyBub3QgaGF2ZSBTRUlzLCBzbyB3YXRjaCBvdXQgZm9yIG51bGwgb3IgZW1wdHkgYXJyYXkNCi0gICAgICAgIGlmICgoZWRzICE9IG51bGwpICYmIChlZHMuc2l6ZSgpID4gMCkpIHsNCi0gICAgICAgICAgICBJdGVyYXRvcjxFbmRwb2ludERlc2NyaXB0aW9uPiBpID0gZWRzLml0ZXJhdG9yKCk7DQotICAgICAgICAgICAgaWYgKGkuaGFzTmV4dCgpKSB7DQotICAgICAgICAgICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZWQgPSBlZHMuaXRlcmF0b3IoKS5uZXh0KCk7DQotICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICBQcm90b2NvbCBwcm90b2NvbCA9IG1jLmdldE1lc3NhZ2UoKS5nZXRQcm90b2NvbCgpOw0KLSAgICAgICAgICAgICAgICBTdHJpbmcgYmluZGluZ1R5cGUgPSBlZC5nZXRCaW5kaW5nVHlwZSgpOw0KLSAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkNoZWNraW5nIGZvciBtYXRjaGluZyBiaW5kaW5nIHR5cGVzLiIpOw0KLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgICAgbWVzc2FnZSBwcm90b2NvbDogIiArIHByb3RvY29sKTsNCi0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiICAgICAgICBiaW5kaW5nIHR5cGU6ICIgKyBiaW5kaW5nVHlwZSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgIGlmIChwcm90b2NvbC5lcXVhbHMoUHJvdG9jb2wuc29hcDExKSkgeyANCi0gICAgICAgICAgICAgICAgCXJldHVybiAoQmluZGluZ1V0aWxzLmlzU09BUDExQmluZGluZyhiaW5kaW5nVHlwZSkpOw0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHByb3RvY29sLmVxdWFscyhQcm90b2NvbC5zb2FwMTIpKSB7DQotICAgICAgICAgICAgICAgIAlyZXR1cm4gKEJpbmRpbmdVdGlscy5pc1NPQVAxMkJpbmRpbmcoYmluZGluZ1R5cGUpKTsgICAgICAgICAgICAgICAJDQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvdG9jb2wuZXF1YWxzKFByb3RvY29sLnJlc3QpKSB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gSFRUUEJpbmRpbmcuSFRUUF9CSU5ESU5HLmVxdWFsc0lnbm9yZUNhc2UoYmluZGluZ1R5cGUpOw0KLSAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlIHsNCi0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlRoZXJlIHdlcmUgbm8gZW5kcG9pbnQgZGVzY3JpcHRpb25zIGZvdW5kLCB0aHVzIHRoZSBiaW5kaW5nIG1hdGNoIGZhaWxlZC4iKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7IA0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogQ29tcGFyZXMgdGhlIHZlcnNpb24gb2YgdGhlIG1lc3NhZ2UgaW4gdGhlIE1lc3NhZ2VDb250ZXh0IHRvIHdoYXQncyBleHBlY3RlZA0KLSAgICAgKiBnaXZlbiB0aGUgU2VydmljZURlc2NyaXB0aW9uLiAgVGhlIGJlaGF2aW9yIGlzIGRlc2NyaWJlZCBpbiB0aGUgU09BUCAxLjINCi0gICAgICogc3BlY2lmaWNhdGlvbiB1bmRlciBBcHBlbmRpeCAnQScuDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gbWMNCi0gICAgICogQHBhcmFtIHNlcnZpY2VEZXNjDQotICAgICAqIEByZXR1cm4NCi0gICAgICovDQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBiaW5kaW5nVHlwZXNNYXRjaChNZXNzYWdlQ29udGV4dCBtYywgRW5kcG9pbnREZXNjcmlwdGlvbiBlZCkgew0KLSAgICAgICAgDQotICAgICAgICBQcm90b2NvbCBwcm90b2NvbCA9IG1jLmdldE1lc3NhZ2UoKS5nZXRQcm90b2NvbCgpOw0KLSAgICAgICAgU3RyaW5nIGJpbmRpbmdUeXBlID0gZWQuZ2V0QmluZGluZ1R5cGUoKTsNCi0gICAgICAgIA0KLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKCJDaGVja2luZyBmb3IgbWF0Y2hpbmcgYmluZGluZyB0eXBlcy4iKTsNCi0gICAgICAgICAgICBsb2cuZGVidWcoIiAgICBtZXNzYWdlIHByb3RvY29sOiAiICsgcHJvdG9jb2wpOw0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiICAgICAgICBiaW5kaW5nIHR5cGU6ICIgKyBiaW5kaW5nVHlwZSk7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIGlmIChwcm90b2NvbC5lcXVhbHMoUHJvdG9jb2wuc29hcDExKSkgeyANCi0gICAgICAgICAgICAgICAgcmV0dXJuIChCaW5kaW5nVXRpbHMuaXNTT0FQMTFCaW5kaW5nKGJpbmRpbmdUeXBlKSk7DQotICAgICAgICB9IGVsc2UgaWYgKHByb3RvY29sLmVxdWFscyhQcm90b2NvbC5zb2FwMTIpKSB7DQotICAgICAgICAgICAgICAgIHJldHVybiAoQmluZGluZ1V0aWxzLmlzU09BUDEyQmluZGluZyhiaW5kaW5nVHlwZSkpOyAgICAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgfSBlbHNlIGlmIChwcm90b2NvbC5lcXVhbHMoUHJvdG9jb2wucmVzdCkpIHsNCi0gICAgICAgICAgICByZXR1cm4gSFRUUEJpbmRpbmcuSFRUUF9CSU5ESU5HLmVxdWFsc0lnbm9yZUNhc2UoYmluZGluZ1R5cGUpOw0KLSAgICAgICAgfSAgICAgICAgICAgICAgIA0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBDcmVhdGVzIGEgZmF1bHQgbWVzc2FnZSB0aGF0IHJlZmxlY3RzIGEgdmVyc2lvbiBtaXNtYXRjaCBmb3IgdGhlIGNvbmZpZ3VyZWQgbWVzc2FnZSBwcm90b2NvbC4NCi0gICAgICogVGhlIHJldHVybmVkIG1lc3NhZ2Ugd2lsbCBhbHdheXMgYmUgYSBTT0FQIDEuMSBtZXNzYWdlIHBlciB0aGUgc3BlY2lmaWNhdGlvbi4NCi0gICAgICogDQotICAgICAqIEBwYXJhbSBtYw0KLSAgICAgKiBAcGFyYW0gbXNnDQotICAgICAqIEByZXR1cm4NCi0gICAgICovDQotICAgIHB1YmxpYyBzdGF0aWMgTWVzc2FnZUNvbnRleHQgY3JlYXRlVmVyc2lvbk1pc21hdGNoTWVzc2FnZShNZXNzYWdlQ29udGV4dCBtYywgUHJvdG9jb2wgcHJvdG9jb2wpIHsNCi0gICAgICAgIC8vIE9ubHkgaWYgcHJvdG9jb2wgaXMgc29hcDEyIGFuZCBNSVNtYXRjaGVzIHRoZSBlbmRwb2ludCBkbyB3ZSBoYWx0IHByb2Nlc3NpbmcNCi0gICAgICAgIGlmIChwcm90b2NvbC5lcXVhbHMoUHJvdG9jb2wuc29hcDEyKSkgew0KLSAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiSW5jb21pbmcgU09BUCBtZXNzYWdlIHByb3RvY29sIGlzIHZlcnNpb24gMS4yLCBidXQgZW5kcG9pbnQgaXMgY29uZmlndXJlZCBmb3IgU09BUCAxLjEiOw0KLSAgICAgICAgICAgIHJldHVybiBVdGlscy5jcmVhdGVGYXVsdE1lc3NhZ2UobWMsIG1zZyk7DQotICAgICAgICB9IGVsc2UgaWYgKHByb3RvY29sLmVxdWFscyhQcm90b2NvbC5zb2FwMTEpKSB7DQotICAgICAgICAgICAgLy8gU09BUCAxLjEgbWVzc2FnZSBhbmQgU09BUCAxLjIgYmluZGluZw0KLQ0KLSAgICAgICAgICAgIC8vIFRoZSBjYW5TdXBwb3J0IGZsYWcgaW5kaWNhdGVzIHRoYXQgd2UgY2FuIHN1cHBvcnQgdGhpcyBzY2VuYXJpby4NCi0gICAgICAgICAgICAvLyBQb3NzaWJsZSBFeGFtcGxlcyBvZiBjYW5TdXBwb3J0OiAgSkFYQiBpbXBsIGJpbmRpbmcsIEpBWEIgUHJvdmlkZXINCi0gICAgICAgICAgICAvLyBQb3NzaWJsZSBFeGFtcGxlIG9mICFjYW5TdXBwb3J0OiBBcHBsaWNhdGlvbiBoYW5kbGVyIHVzYWdlLCBub24tSkFYQiBQcm92aWRlcg0KLSAgICAgICAgICAgIC8vIEluaXRpYWxseSBJIHZvdGUgdG8gaGFyZCBjb2RlIHRoaXMgYXMgZmFsc2UuDQotICAgICAgICAgICAgYm9vbGVhbiBjYW5TdXBwb3J0ID0gZmFsc2U7DQotICAgICAgICAgICAgaWYgKGNhblN1cHBvcnQpIHsNCi0gICAgICAgICAgICAgICAgLy8gVE9ETzogT2theSwgYnV0IHdlIG5lZWQgdG8gc2NydWIgdGhlIE1lc3NhZ2UgY3JlYXRlIGNvZGUgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIHJlc3BvbnNlIG1lc3NhZ2UNCi0gICAgICAgICAgICAgICAgLy8gaXMgYWx3YXlzIGJ1aWx0IGZyb20gdGhlIHJlY2VpdmVyIHByb3RvY29sLi4ubm90IHRoZSBiaW5kaW5nIHByb3RvY29sDQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiSW5jb21pbmcgU09BUCBtZXNzYWdlIHByb3RvY29sIGlzIHZlcnNpb24gMS4xLCBidXQgZW5kcG9pbnQgaXMgY29uZmlndXJlZCBmb3IgU09BUCAxLjIuICBUaGlzIGlzIG5vdCBzdXBwb3J0ZWQuIjsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIFV0aWxzLmNyZWF0ZUZhdWx0TWVzc2FnZShtYywgbXNnKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiSW5jb21pbmcgbWVzc2FnZSBwcm90b2NvbCBkb2VzIG5vdCBtYXRjaCBlbmRwb2ludCBwcm90b2NvbC4iOw0KLSAgICAgICAgICAgIHJldHVybiBVdGlscy5jcmVhdGVGYXVsdE1lc3NhZ2UobWMsIG1zZyk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyBzdGF0aWMgTWVzc2FnZUNvbnRleHQgY3JlYXRlRmF1bHRNZXNzYWdlKE1lc3NhZ2VDb250ZXh0IG1jLCBTdHJpbmcgbXNnKSB7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIFhNTEZhdWx0IHhtbGZhdWx0ID0NCi0gICAgICAgICAgICAgICAgICAgIG5ldyBYTUxGYXVsdChYTUxGYXVsdENvZGUuVkVSU0lPTk1JU01BVENILCBuZXcgWE1MRmF1bHRSZWFzb24obXNnKSk7DQotICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkgbWYgPSAoTWVzc2FnZUZhY3RvcnkpIEZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KE1lc3NhZ2VGYWN0b3J5LmNsYXNzKTsNCi0gICAgICAgICAgICBNZXNzYWdlIG1lc3NhZ2UgPSBtZi5jcmVhdGUoUHJvdG9jb2wuc29hcDExKTsNCi0gICAgICAgICAgICBtZXNzYWdlLnNldFhNTEZhdWx0KHhtbGZhdWx0KTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBNZXNzYWdlQ29udGV4dCByZXNwb25zZU1zZ0N0eCA9IE1lc3NhZ2VDb250ZXh0VXRpbHMuY3JlYXRlRmF1bHRNZXNzYWdlQ29udGV4dChtYyk7DQotICAgICAgICAgICAgcmVzcG9uc2VNc2dDdHguc2V0TWVzc2FnZShtZXNzYWdlKTsNCi0gICAgICAgICAgICByZXR1cm4gcmVzcG9uc2VNc2dDdHg7DQotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIC8vIE5lZWQgdG8gZml4IHRoaXMgISAgIEF0IGxlYXN0IHByb3ZpZGUgbG9nZ2luZw0KLSAgICAgICAgICAgIC8vIFRPRE8gZm9yIG5vdywgdGhyb3cgaXQuICBXZSBwcm9iYWJseSBzaG91bGQgdHJ5IHRvIG1ha2UgYW4gWE1MRmF1bHQgb2JqZWN0IGFuZCBzZXQgaXQgb24gdGhlIG1lc3NhZ2UNCi0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICAvKg0KLSAgICAgKiBHZXRzIHRoZSBPcGVyYXRpb25EZXNjcmlwdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIHJlcXVlc3QgdGhhdCBpcyBjdXJyZW50bHkNCi0gICAgICogYmVpbmcgcHJvY2Vzc2VkLg0KLSAgICAgKiANCi0gICAgICogIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCBkb25lIGluIHRoZSBFbmRwb2ludENvbnRyb2xsZXIgc2luY2Ugb3BlcmF0aW9ucyBhcmUgb25seSByZWxldmFudA0KLSAgICAgKiAgdG8gRW5kcG9pbnQtYmFzZWQgaW1wbGVtZW50YXRpb24gKGkuZS4gbm90IHRvIFByb3h5LWJhc2VkIG9uZXMpcw0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyBPcGVyYXRpb25EZXNjcmlwdGlvbiBnZXRPcGVyYXRpb25EZXNjcmlwdGlvbihNZXNzYWdlQ29udGV4dCBtYykgew0KLSAgICAgICAgT3BlcmF0aW9uRGVzY3JpcHRpb24gb3AgPSBudWxsOw0KLSAgICAgICAgDQotICAgICAgICBvcCA9IG1jLmdldE9wZXJhdGlvbkRlc2NyaXB0aW9uKCk7DQotICAgICAgICBpZiAob3AgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIk5vIE9wZXJhdGlvbkRlc2NyaXB0aW9uIGZvdW5kIG9uIE1lc3NhZ2VDb250ZXh0LCBzZWFyY2hpbmcgZXhpc3Rpbmcgb3BlcmF0aW9ucyIpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVkID0gbWMuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbigpOw0KLSAgICAgICAgICAgIEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24gZWlkID0gZWQuZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbigpOw0KLQ0KLSAgICAgICAgICAgIE9wZXJhdGlvbkRlc2NyaXB0aW9uW10gb3BzID0gZWlkLmdldERpc3BhdGNoYWJsZU9wZXJhdGlvbihtYy5nZXRPcGVyYXRpb25OYW1lKCkpOw0KLSAgICAgICAgICAgIC8vIFRPRE86IEltcGxlbWVudCBzaWduYXR1cmUgbWF0Y2hpbmcuICBDdXJyZW50bHkgb25seSBtYXRjaGluZyBvbiB0aGUgd3NkbDpPcGVyYXRpb25OYW1lIGlzIHN1cHBvcnRlZC4NCi0gICAgICAgICAgICAvLyAgICAgICBUaGF0IG1lYW5zIHRoYXQgb3ZlcmxvYWRpbmcgb2Ygd3NkbCBvcGVyYXRpb25zIGlzIG5vdCBzdXBwb3J0ZWQgKGFsdGhvdWdoIHRoYXQncyBub3Qgc3VwcG9ydGVkIGluIA0KLSAgICAgICAgICAgIC8vICAgICAgIFdTREwgMS4xIGFueXdheSkuDQotICAgICAgICAgICAgaWYgKG9wcyA9PSBudWxsIHx8IG9wcy5sZW5ndGggPT0gMCkgew0KLSAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKA0KLSAgICAgICAgICAgICAgICAJCU1lc3NhZ2VzLmdldE1lc3NhZ2UoIm9wckRlc2NyRXJyIixtYy5nZXRPcGVyYXRpb25OYW1lKCkudG9TdHJpbmcoKSkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZiAob3BzLmxlbmd0aCA+IDEpIHsNCi0gICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbigNCi0gICAgICAgICAgICAgICAgCQlNZXNzYWdlcy5nZXRNZXNzYWdlKCJvcHJEZXNjckVycjEiLG1jLmdldE9wZXJhdGlvbk5hbWUoKS50b1N0cmluZygpKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIG9wID0gb3BzWzBdOw0KLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIndzZGwgb3BlcmF0aW9uOiAiICsgb3AuZ2V0TmFtZSgpKTsNCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgICBqYXZhIG1ldGhvZDogIiArIG9wLmdldEphdmFNZXRob2ROYW1lKCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2Ugew0KLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkFuIGV4aXN0aW5nIE9wZXJhdGlvbkRlc2NyaXB0aW9uIHdhcyBmb3VuZCBvbiB0aGUgTWVzc2FnZUNvbnRleHQuIik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICByZXR1cm4gb3A7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2VydmVyL2VuZHBvaW50L2luamVjdGlvbi9SZXNvdXJjZUluamVjdG9yLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zZXJ2ZXIvZW5kcG9pbnQvaW5qZWN0aW9uL1Jlc291cmNlSW5qZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZmNmQyNC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zZXJ2ZXIvZW5kcG9pbnQvaW5qZWN0aW9uL1Jlc291cmNlSW5qZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zZXJ2ZXIuZW5kcG9pbnQuaW5qZWN0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5pbmplY3Rpb24uUmVzb3VyY2VJbmplY3Rpb25FeGNlcHRpb247Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci0KLS8qCi0gKiBSZXNvdXJjZSBJbmplY3Rpb24gaXMgcmVzcG9uc2libGUgdG8gSW5qZWN0aW5nIFJlc291cmNlIE9iamVjdCB0byBlbmRwb2ludCBJbnN0YW5jZSBhdCBydW50aW1lLgotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgUmVzb3VyY2VJbmplY3RvciB7Ci0KLSAgICAvKioKLSAgICAgKiBJbmplY3QgcmVzb3VyY2Ugb24gRmlsZWQsIE1ldGhvZCBvciBDbGFzcyBkZXBlbmRpbmcgb24gaG93IHRoZSBAUmVzb3VyY2UgYW5ub3RhdGlvbiBpcyBkZWZpbmVkLgotICAgICAqCi0gICAgICogQHBhcmFtIHJlc291cmNlCi0gICAgICogQHBhcmFtIGluc3RhbmNlCi0gICAgICovCi0gICAgYWJzdHJhY3Qgdm9pZCBpbmplY3QoT2JqZWN0IHJlc291cmNlLCBPYmplY3QgaW5zdGFuY2UpIHRocm93cyBSZXNvdXJjZUluamVjdGlvbkV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIFJlc291cmNlIHdpbGwgYmUgaW5qZWN0ZWQgb24gdGhlIGZpZWxkLgotICAgICAqCi0gICAgICogQHBhcmFtIHJlc291cmNlCi0gICAgICogQHBhcmFtIGluc3RhbmNlCi0gICAgICogQHBhcmFtIGZpZWxkCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIGFic3RyYWN0IHZvaWQgaW5qZWN0T25GaWVsZChPYmplY3QgcmVzb3VyY2UsIE9iamVjdCBpbnN0YW5jZSwgRmllbGQgZmllbGQpCi0gICAgICAgICAgICB0aHJvd3MgUmVzb3VyY2VJbmplY3Rpb25FeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBSZXNvdXJjZSB3aWxsIGJlIGluamVjdGVkIG9uIHRoZSBNZXRob2QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVzb3VyY2UKLSAgICAgKiBAcGFyYW0gaW5zdGFuY2UKLSAgICAgKiBAcGFyYW0gbWV0aG9kCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIGFic3RyYWN0IHZvaWQgaW5qZWN0T25NZXRob2QoT2JqZWN0IHJlc291cmNlLCBPYmplY3QgaW5zdGFuY2UsIE1ldGhvZCBtZXRob2QpCi0gICAgICAgICAgICB0aHJvd3MgUmVzb3VyY2VJbmplY3Rpb25FeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBSZXNvdXJjZSB3aWxsIGJlIGluamVjdGlvbiBvbiB0aGUgY2xhc3MuCi0gICAgICogQHBhcmFtIHJlc291cmNlCi0gICAgICogQHBhcmFtIGluc3RhbmNlCi0gICAgICogQHBhcmFtIGNsYXp6Ci0gICAgICogQHJldHVybgotICAgICAqLwotICAgIGFic3RyYWN0IHZvaWQgaW5qZWN0T25DbGFzcyhPYmplY3QgcmVzb3VyY2UsIE9iamVjdCBpbnN0YW5jZSwgQ2xhc3MgY2xhenopCi0gICAgICAgICAgICB0aHJvd3MgUmVzb3VyY2VJbmplY3Rpb25FeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zZXJ2ZXIvZW5kcG9pbnQvaW5qZWN0aW9uL1dlYlNlcnZpY2VDb250ZXh0SW5qZWN0b3IuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NlcnZlci9lbmRwb2ludC9pbmplY3Rpb24vV2ViU2VydmljZUNvbnRleHRJbmplY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODliZDg2Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NlcnZlci9lbmRwb2ludC9pbmplY3Rpb24vV2ViU2VydmljZUNvbnRleHRJbmplY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNlcnZlci5lbmRwb2ludC5pbmplY3Rpb247Ci0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUNvbnRleHQ7Ci1pbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuTWVzc2FnZUNvbnRleHQ7Ci0KLS8qCi0gKiBXZWJzZXJ2aWNlQ29udGV4dCBJbmplY3Rpb24gaXMgcmVzcG9uc2libGUgdG8gSW5qZWN0aW5nIFdlYlNlcnZpY2VDb250ZXh0IE9iamVjdCB0byBhIEpBWFdTIGVuZHBvaW50IEluc3RhbmNlIGF0IHJ1bnRpbWUuCi0gKiBJbmplY3Rpb24gd2lsbCBoYXBwZW4gd2hlbiB0aGUgRW5kcG9pbnQgaW5zdGFuY2UgaXMgZmlyc3QgaW5pdGlhbGl6ZWQuCi0gKiBXZWJTZXJ2aWNlQ29udGV4dCBtZXRob2RzIHNob3VsZCBiZSBpbnZva2VkIHdoZW4gb25lIG9mIHRoZSB3ZWJzZXJ2aWNlIG1ldGhvZHMgaXMgaW52b2tlZC4KLSAqIEludm9jYXRpb24gb2YgV2ViU2VydmljZUNvbnRleHQgbWV0aG9kIG91dHNpZGUgb2YgaW52b2NhdGlvbiBvZiBpdHMgd2Vic2VydmljZSBtZXRob2QgaXMgaWxsaWdhbCBhcyBwZXIgamF4d3Mgc3BlYyBzZWN0aW9uIDUuMy4KLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIFdlYlNlcnZpY2VDb250ZXh0SW5qZWN0b3IgZXh0ZW5kcyBSZXNvdXJjZUluamVjdG9yIHsKLQotICAgIC8qKgotICAgICAqIE1lc3NhZ2VDb250ZXh0IGlzIG1hZGUgYXZhaWxibGUgdG8gdGhlIGVuZHBvaW50IGluc3RhbmNlIHZpYSB0aGUgV2ViU2VydmljZUNvbnRleHQuIFRoaXMgbWV0aG9kCi0gICAgICogd2lsbCBhZGQgTWVzc2FnZUNvbnRleHQgdG8gV2ViU2VydmljZUNvbnRleHQgdGhhdCBpcyBpbmplY3RlZCBpbiBXZWJTZXJ2aWNlLiBNZXNzYWdlQ29udGV4dAotICAgICAqIHJlcHJlc2VudHMgdGhlIGNvbnRleHQgb2YgSW5ib3VuZCBtZXNzYWdlIGZvbGxvd2luZyB0aGUgSGFuZGxlciBFeGVjdXRpb24uIE9ubHkgcHJvcGVydGllcyB3aXRoCi0gICAgICogQXBwbGljYXRpb24gc2NvcGUgd2lsbCBiZSBleHBvc2VkLgotICAgICAqCi0gICAgICogQHBhcmFtIHdjCi0gICAgICogQHBhcmFtIG1jCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkTWVzc2FnZUNvbnRleHQoV2ViU2VydmljZUNvbnRleHQgd2MsIE1lc3NhZ2VDb250ZXh0IG1jKTsKLQkKLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NlcnZlci9lbmRwb2ludC9pbmplY3Rpb24vZmFjdG9yeS9SZXNvdXJjZUluamVjdGlvbkZhY3RvcnkuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NlcnZlci9lbmRwb2ludC9pbmplY3Rpb24vZmFjdG9yeS9SZXNvdXJjZUluamVjdGlvbkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzYwODdiYS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zZXJ2ZXIvZW5kcG9pbnQvaW5qZWN0aW9uL2ZhY3RvcnkvUmVzb3VyY2VJbmplY3Rpb25GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2VydmVyLmVuZHBvaW50LmluamVjdGlvbi5mYWN0b3J5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5pMThuLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaW5qZWN0aW9uLlJlc291cmNlSW5qZWN0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MucmVnaXN0cnkuRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2VydmVyLmVuZHBvaW50LmluamVjdGlvbi5SZXNvdXJjZUluamVjdG9yOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgaXMgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIGluc3RhbmNlcyB0aGF0IGNhbiAKLSAqIGhhbmRsZSByZXNvdXJjZSBpbmplY3Rpb24uCi0gKgotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VJbmplY3Rpb25GYWN0b3J5IHsKLQotICAgIC8qKgotICAgICAqCi0gICAgICovCi0gICAgcHVibGljIFJlc291cmNlSW5qZWN0aW9uRmFjdG9yeSgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgcmV0cmlldmVzIHRoZSBhcHByb3ByaWF0ZSBSZXNvdXJjZUluamVjdG9yIGluc3RhbmNlCi0gICAgICogYmFzZWQgb24gdGhlIHR5cGUgdGhhdCBpcyBzdXBwbGllZC4KLSAgICAgKiAKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFJlc291cmNlSW5qZWN0b3IgY3JlYXRlUmVzb3VyY2VJbmplY3RvcihDbGFzcyByZXNvdXJjZVR5cGUpCi0gICAgICAgIHRocm93cyBSZXNvdXJjZUluamVjdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIE9iamVjdCBvYmogPSBGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShyZXNvdXJjZVR5cGUpOwotICAgICAgICBSZXNvdXJjZUluamVjdG9yIGluamVjdG9yID0gbnVsbDsKLQotICAgICAgICAvLyBtYWtlIHN1cmUgd2UgaGF2ZSBhIFJlc291cmNlSW5qZWN0b3IgaW5zdGFuY2UKLSAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFJlc291cmNlSW5qZWN0b3IpIHsKLSAgICAgICAgICAgIGluamVjdG9yID0gKFJlc291cmNlSW5qZWN0b3IpIG9iajsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpbmplY3RvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUmVzb3VyY2VJbmplY3Rpb25FeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiUmVzb3VyY2VJbmplY3Rpb25GYWN0b3J5RXJyMSIpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBpbmplY3RvcjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zZXJ2ZXIvZW5kcG9pbnQvaW5qZWN0aW9uL2ltcGwvV2ViU2VydmljZUNvbnRleHRJbmplY3RvckltcGwuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NlcnZlci9lbmRwb2ludC9pbmplY3Rpb24vaW1wbC9XZWJTZXJ2aWNlQ29udGV4dEluamVjdG9ySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzg5ZjUwLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NlcnZlci9lbmRwb2ludC9pbmplY3Rpb24vaW1wbC9XZWJTZXJ2aWNlQ29udGV4dEluamVjdG9ySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzg5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zZXJ2ZXIuZW5kcG9pbnQuaW5qZWN0aW9uLmltcGw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvbnRleHQuV2ViU2VydmljZUNvbnRleHRJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaTE4bi5NZXNzYWdlczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmluamVjdGlvbi5SZXNvdXJjZUluamVjdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNlcnZlci5lbmRwb2ludC5pbmplY3Rpb24uV2ViU2VydmljZUNvbnRleHRJbmplY3RvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LmFubm90YXRpb24uUmVzb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VDb250ZXh0OwotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQWNjZXNzaWJsZU9iamVjdDsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VDb250ZXh0SW5qZWN0b3JJbXBsIGltcGxlbWVudHMgV2ViU2VydmljZUNvbnRleHRJbmplY3RvciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFdlYlNlcnZpY2VDb250ZXh0SW5qZWN0b3JJbXBsLmNsYXNzKTsKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgTUVUSE9EX05BTUUgPSAic2V0IjsKLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgTlVNQkVSX09GX1BBUkFNRVRFUlMgPSAxOwotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBSRVRVUk5fVFlQRSA9ICJ2b2lkIjsKLQotICAgIHB1YmxpYyBXZWJTZXJ2aWNlQ29udGV4dEluamVjdG9ySW1wbCgpIHsKLSAgICAgICAgc3VwZXIoKTsKLQotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNlcnZlci5lbmRwb2ludC5pbmplY3Rpb24uV2ViU2VydmljZUNvbnRleHRJbmplY3Rpb24jYWRkTWVzc2FnZUNvbnRleHQoamF2YXgueG1sLndzLldlYlNlcnZpY2VDb250ZXh0LCBqYXZheC54bWwud3MuaGFuZGxlci5NZXNzYWdlQ29udGV4dCkKLSAgICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkTWVzc2FnZUNvbnRleHQoV2ViU2VydmljZUNvbnRleHQgd2MsIE1lc3NhZ2VDb250ZXh0IG1jKSB7Ci0gICAgICAgIFdlYlNlcnZpY2VDb250ZXh0SW1wbCB3c0NvbnRleHQgPSAoV2ViU2VydmljZUNvbnRleHRJbXBsKXdjOwotICAgICAgICB3c0NvbnRleHQuc2V0U29hcE1lc3NhZ2VDb250ZXh0KG1jKTsKLQotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNlcnZlci5lbmRwb2ludC5pbmplY3Rpb24uUmVzb3VyY2VJbmplY3Rpb24jaW5qZWN0KGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCi0gICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGluamVjdChPYmplY3QgcmVzb3VyY2UsIE9iamVjdCBpbnN0YW5jZSkgdGhyb3dzIFJlc291cmNlSW5qZWN0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGluc3RhbmNlID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ2Fubm90IGluamVjdCBSZXNvdXJjZSBvbiBhIG51bGwgU2VydmljZSBJbnN0YW5jZS4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRocm93IG5ldyBSZXNvdXJjZUluamVjdGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZ2V0TWVzc2FnZSgiV2ViU2VydmljZUNvbnRleHRJbmplY3Rpb25JbXBsRXJyMSIpKTsKLSAgICAgICAgfQotCi0gICAgICAgIENsYXNzIHNlcnZpY2VDbGF6eiA9IGluc3RhbmNlLmdldENsYXNzKCk7Ci0KLSAgICAgICAgLypMb29rIGZvciBAUmVzb3VyY2UgYW5ub3RhdGlvbiBvbiBGaWVsZC4gSWYgZm91bmQgdGhlbiBsb29rIGZvciB0eXBlIG9uIHRoZSBhbm5vdGF0aW9uLiBJZiBmb3VuZCwgdGhlbgotICAgICAgICAgICAqIGlmIHR5cGUgaXMgamF2YS5sYW5nLk9iamVjdCB0aGVuIG1ha2Ugc3VyZSB0eXBlIG9uIGRlY2xhcmVkIGZpZWxkIGluIGphdmF4LnhtbC5XZWJTZXJ2aWNlQ29udGV4dCBhbmQgYXNzaWduIHRoZSByZXNvdXJjZSB2YWx1ZQotICAgICAgICAgICAqIGlmIHR5cGUgaXMgamF2YXgueG1sLldlYlNlcnZpY2VDb250ZXh0IHRoZW4gYXNzaWduIHRoZSByZXNvdXJjZSB2YWx1ZQotICAgICAgICAgICovCi0gICAgICAgIEZpZWxkIHJlc291cmNlRmllbGQgPSBzZWFyY2hGaWVsZHNGb3JSZXNvdXJjZUFubm90YXRpb24oc2VydmljZUNsYXp6KTsKLSAgICAgICAgaWYgKHJlc291cmNlRmllbGQgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJBdHRlbXB0aW5nIHRvIGluamVjdCBSZXNvdXJjZSBvbiBGaWVsZCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy9Gb3VuZCBmaWVsZCB0aGF0IGhhcyBhIEBSZXNvdXJjZSBmb3IgV2ViU2VydmljZUNvbnRleHQKLSAgICAgICAgICAgIC8vSW5qZWN0IFJlc291cmNlLgotICAgICAgICAgICAgaW5qZWN0T25GaWVsZChyZXNvdXJjZSwgaW5zdGFuY2UsIHJlc291cmNlRmllbGQpOwotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJSZXNvdXJjZSBJbmplY3RlZCBvbiBGaWVsZCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogSWYgQFJlc291cmNlIGFubm90YXRpb24gbm90IGZvdW5kIG9uIGRlY2xhcmVkIEZpbGVkcywgdGhlbiBsb29rIGZvciBpdCBvbiBNZXRob2RzLiBJZiBmb3VuZCB0aGVuLAotICAgICAgICAgICAqIGlmIEBSZXNvdXJjZSB0eXBlIGlzIGphdmEubGFuZy5PYmplY3QgdGhlbiwKLSAgICAgICAgICAgKiBsb29rIGZvciBQcm9wZXJ0eURlc2NyaXB0b3Igd2hvJ3Mgd3JpdGUgTWV0aG9kIG9yIHNldHRlciBpcyB0aGUgTWV0aG9kIG9uIHdoaWNoIHlvdSBmb3VuZCB0aGUgYW5ub3RhdGlvbiBhbmQKLSAgICAgICAgICAgKiBtYWtlIHN1cmUgdGhhdCB0aGUgZGVjbGFyZWQgdHlwZSBvZiB0aGF0IHByb3BlcnR5IGlzIGphdmF4LnhtbC5XZWJTZXJ2aWNlQ29udGV4dCBhbmQgaW52b2tlIHRoZSBNZXRob2Qgd2l0aCBSZXNvdXJjZS4KLSAgICAgICAgICAgKiBpZiBAUmVzb3VyY2UgdHlwZSBpcyBqYXZheC54bWwud3MuV2ViU2VydmljZUNvbnRleHQsIEludm9rZSB0aGUgTWV0aG9kIHdpdGggUmVzb3VyY2UuCi0gICAgICAgICAgICovCi0gICAgICAgIE1ldGhvZCBtZXRob2QgPSBzZWFyY2hNZXRob2RzUmVzb3VyY2VBbm5vdGF0aW9uKHNlcnZpY2VDbGF6eik7Ci0gICAgICAgIGlmIChtZXRob2QgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJBdHRlbXB0aW5nIHRvIGluamVjdCByZXNvdXJjZSBvbiBNZXRob2QiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghaXNWYWxpZE1ldGhvZChtZXRob2QpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5qZWN0aW9uIGNhbiBoYXBwZW4gdXNpbmcgbWV0aG9kIGlmIG1ldGhvZCBuYW1lIHN0YXJ0cyB3aXRoIFwic2V0XCIgcmV0dXJucyBhIHZvaWQgYW5kIG9ubHkgaGFzIG9uZSBwYXJhbWV0ZXIgYW5kIHRoZSB0eXBlIG9mIHRoaXMgcGFyYW1ldGVyIG11c3QgYmUgY29tcGF0aWJsZSB3aXRoIHJlc291cmNlLiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmVzb3VyY2VJbmplY3Rpb25FeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRNZXNzYWdlKCJXZWJTZXJ2aWNlQ29udGV4dEluamVjdGlvbkltcGxFcnI2IikpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW5qZWN0T25NZXRob2QocmVzb3VyY2UsIGluc3RhbmNlLCBtZXRob2QpOwotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJSZXNvdXJjZSBJbmplY3RlZCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy9Ob3RoaW5nIHRvIGluamVjdAotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNlcnZlci5lbmRwb2ludC5pbmplY3Rpb24uUmVzb3VyY2VJbmplY3Rpb24jaW5qZWN0T25DbGFzcyhqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuQ2xhc3MpCi0gICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGluamVjdE9uQ2xhc3MoT2JqZWN0IHJlc291cmNlLCBPYmplY3QgaW5zdGFuY2UsIENsYXNzIGNsYXp6KQotICAgICAgICAgICAgdGhyb3dzIFJlc291cmNlSW5qZWN0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoImluamVjdE9uQ2xzRXJyIikpOwotCi0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2VydmVyLmVuZHBvaW50LmluamVjdGlvbi5SZXNvdXJjZUluamVjdGlvbiNpbmplY3RPbkZpZWxkKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5yZWZsZWN0LkZpZWxkKQotICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbmplY3RPbkZpZWxkKE9iamVjdCByZXNvdXJjZSwgT2JqZWN0IGluc3RhbmNlLCBGaWVsZCBmaWVsZCkKLSAgICAgICAgICAgIHRocm93cyBSZXNvdXJjZUluamVjdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkNhbm5vdCBpbmplY3QgUmVzb3VyY2Ugb24gYSBudWxsIFNlcnZpY2UgSW5zdGFuY2UuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUmVzb3VyY2VJbmplY3Rpb25FeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoIldlYlNlcnZpY2VDb250ZXh0SW5qZWN0aW9uSW1wbEVycjEiKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGZpZWxkID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygKLSAgICAgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgaW5qZWN0IFdlYlNlcnZpY2VDb250ZXh0IG9uIFNlcnZpY2VJbnN0YW5jZSBGaWVsZCwgZmllbGQgY2Fubm90IGJlIE5VTEwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRocm93IG5ldyBSZXNvdXJjZUluamVjdGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZ2V0TWVzc2FnZSgiV2ViU2VydmljZUNvbnRleHRJbmplY3Rpb25JbXBsRXJyMyIpKTsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKCFNb2RpZmllci5pc1B1YmxpYyhmaWVsZC5nZXRNb2RpZmllcnMoKSkpIHsKLSAgICAgICAgICAgICAgICBzZXRBY2Nlc3NpYmxlKGZpZWxkLCB0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vSW5qZWN0IFJlc291cmNlLgotICAgICAgICAgICAgZmllbGQuc2V0KGluc3RhbmNlLCByZXNvdXJjZSk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJlc291cmNlSW5qZWN0aW9uRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zZXJ2ZXIuZW5kcG9pbnQuaW5qZWN0aW9uLlJlc291cmNlSW5qZWN0aW9uI2luamVjdE9uTWV0aG9kKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCkKLSAgICAgICovCi0gICAgcHVibGljIHZvaWQgaW5qZWN0T25NZXRob2QoT2JqZWN0IHJlc291cmNlLCBPYmplY3QgaW5zdGFuY2UsIE1ldGhvZCBtZXRob2QpCi0gICAgICAgICAgICB0aHJvd3MgUmVzb3VyY2VJbmplY3Rpb25FeGNlcHRpb24gewotICAgICAgICBpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJDYW5ub3QgaW5qZWN0IFJlc291cmNlIG9uIGEgbnVsbCBTZXJ2aWNlIEluc3RhbmNlLiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhyb3cgbmV3IFJlc291cmNlSW5qZWN0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRNZXNzYWdlKCJXZWJTZXJ2aWNlQ29udGV4dEluamVjdGlvbkltcGxFcnIxIikpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtZXRob2QgPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKAotICAgICAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCBpbmplY3QgV2ViU2VydmljZUNvbnRleHQgb24gU2VydmljZUluc3RhbmNlIE1ldGhvZCwgbWV0aG9kIGNhbm5vdCBiZSBOVUxMIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUmVzb3VyY2VJbmplY3Rpb25FeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoIldlYlNlcnZpY2VDb250ZXh0SW5qZWN0aW9uSW1wbEVycjMiKSk7Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmICghTW9kaWZpZXIuaXNQdWJsaWMobWV0aG9kLmdldE1vZGlmaWVycygpKSkgewotICAgICAgICAgICAgICAgIHNldEFjY2Vzc2libGUobWV0aG9kLCB0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1ldGhvZC5pbnZva2UoaW5zdGFuY2UsIHJlc291cmNlKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUmVzb3VyY2VJbmplY3Rpb25FeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJlc291cmNlSW5qZWN0aW9uRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0KLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCBhY2Nlc3NpYmxlLiAgVGhpcyBtZXRob2QgbXVzdCByZW1haW4gcHJpdmF0ZQotICAgICAqCi0gICAgICogQHBhcmFtIG9iaiAgIEFjY2Vzc2libGVPYmplY3QKLSAgICAgKiBAcGFyYW0gdmFsdWUgdHJ1ZSBvciBmYWxzZQotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgc2V0QWNjZXNzaWJsZShmaW5hbCBBY2Nlc3NpYmxlT2JqZWN0IG9iaiwgZmluYWwgYm9vbGVhbiB2YWx1ZSkgewotICAgICAgICBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEFjdGlvbigpIHsKLSAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgewotICAgICAgICAgICAgICAgIG9iai5zZXRBY2Nlc3NpYmxlKHZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICB9Ci0KLSAgICAvKgotICAgICAgKiBTZWFyY2ggZm9yIEZpZWxkIHdpdGggQFJlc291cmNlIEFubm90YXRpb24uCi0gICAgICAqLwotICAgIHByaXZhdGUgRmllbGQgc2VhcmNoRmllbGRzRm9yUmVzb3VyY2VBbm5vdGF0aW9uKENsYXNzIGJlYW4pIHsKLSAgICAgICAgaWYgKGJlYW4gPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgTGlzdDxGaWVsZD4gZmllbGRzID0gZ2V0RmllbGRzKGJlYW4pOwotICAgICAgICBmb3IgKEZpZWxkIGZpZWxkIDogZmllbGRzKSB7Ci0gICAgICAgICAgICBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMgPSBmaWVsZC5nZXRBbm5vdGF0aW9ucygpOwotICAgICAgICAgICAgZm9yIChBbm5vdGF0aW9uIGFuIDogYW5ub3RhdGlvbnMpIHsKLSAgICAgICAgICAgICAgICBpZiAoUmVzb3VyY2UuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShhbi5nZXRDbGFzcygpKSkgewotICAgICAgICAgICAgICAgICAgICAvL2NoZWNrIHRvIG1ha2Ugc3VyZSBpdCBpcyBhIEBSZXNvdXJjZSBmb3IgV2ViU2VydmljZUNvbnRleHQuCi0gICAgICAgICAgICAgICAgICAgIFJlc291cmNlIGF0UmVzb3VyY2UgPSAoUmVzb3VyY2UpYW47Ci0gICAgICAgICAgICAgICAgICAgIENsYXNzIHR5cGUgPSBhdFJlc291cmNlLnR5cGUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzV2ViU2VydmljZUNvbnRleHRSZXNvdXJjZShhdFJlc291cmNlLCBmaWVsZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmaWVsZDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGFsbCBvZiB0aGUgZmllbGRzIGluIHRoaXMgY2xhc3MgYW5kIHRoZSBzdXBlciBjbGFzc2VzCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYmVhbkNsYXNzCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHN0YXRpYyBwcml2YXRlIExpc3Q8RmllbGQ+IGdldEZpZWxkcyhmaW5hbCBDbGFzcyBiZWFuQ2xhc3MpIHsKLSAgICAgICAgLy8gVGhpcyBjbGFzcyBtdXN0IHJlbWFpbiBwcml2YXRlIGR1ZSB0byBKYXZhIDIgU2VjdXJpdHkgY29uY2VybnMKLSAgICAgICAgTGlzdDxGaWVsZD4gZmllbGRzOwotICAgICAgICBmaWVsZHMgPSAoTGlzdDxGaWVsZD4pQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoCi0gICAgICAgICAgICAgICAgbmV3IFByaXZpbGVnZWRBY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxGaWVsZD4gZmllbGRzID0gbmV3IEFycmF5TGlzdDxGaWVsZD4oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzIGNscyA9IGJlYW5DbGFzczsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChjbHMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkW10gZmllbGRBcnJheSA9IGNscy5nZXREZWNsYXJlZEZpZWxkcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoRmllbGQgZmllbGQgOiBmaWVsZEFycmF5KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkcy5hZGQoZmllbGQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHMgPSBjbHMuZ2V0U3VwZXJjbGFzcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpZWxkczsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgKTsKLQotICAgICAgICByZXR1cm4gZmllbGRzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgYWxsIG9mIHRoZSBmaWVsZHMgaW4gdGhpcyBjbGFzcyBhbmQgdGhlIHN1cGVyIGNsYXNzZXMKLSAgICAgKgotICAgICAqIEBwYXJhbSBiZWFuQ2xhc3MKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgc3RhdGljIHByaXZhdGUgTGlzdDxNZXRob2Q+IGdldE1ldGhvZHMoZmluYWwgQ2xhc3MgYmVhbkNsYXNzKSB7Ci0gICAgICAgIC8vIFRoaXMgY2xhc3MgbXVzdCByZW1haW4gcHJpdmF0ZSBkdWUgdG8gSmF2YSAyIFNlY3VyaXR5IGNvbmNlcm5zCi0gICAgICAgIExpc3Q8TWV0aG9kPiBtZXRob2RzOwotICAgICAgICBtZXRob2RzID0gKExpc3Q8TWV0aG9kPilBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgKLSAgICAgICAgICAgICAgICBuZXcgUHJpdmlsZWdlZEFjdGlvbigpIHsKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMaXN0PE1ldGhvZD4gbWV0aG9kcyA9IG5ldyBBcnJheUxpc3Q8TWV0aG9kPigpOwotICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MgY2xzID0gYmVhbkNsYXNzOwotICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGNscyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kW10gbWV0aG9kQXJyYXkgPSBjbHMuZ2V0RGVjbGFyZWRNZXRob2RzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChNZXRob2QgbWV0aG9kIDogbWV0aG9kQXJyYXkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kcy5hZGQobWV0aG9kKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xzID0gY2xzLmdldFN1cGVyY2xhc3MoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtZXRob2RzOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICApOwotCi0gICAgICAgIHJldHVybiBtZXRob2RzOwotICAgIH0KLQotICAgIC8qCi0gICAgICAqIFNlYXJjaCBmb3IgTWV0aG9kIHdpdGggQFJlc291cmNlIEFubm90YXRpb24KLSAgICAgICovCi0gICAgcHJpdmF0ZSBNZXRob2Qgc2VhcmNoTWV0aG9kc1Jlc291cmNlQW5ub3RhdGlvbihDbGFzcyBiZWFuKSB7Ci0gICAgICAgIGlmIChiZWFuID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIExpc3Q8TWV0aG9kPiBtZXRob2RzID0gZ2V0TWV0aG9kcyhiZWFuKTsKLSAgICAgICAgZm9yIChNZXRob2QgbWV0aG9kIDogbWV0aG9kcykgewotICAgICAgICAgICAgQW5ub3RhdGlvbltdIGFubm90YXRpb25zID0gbWV0aG9kLmdldEFubm90YXRpb25zKCk7Ci0gICAgICAgICAgICBmb3IgKEFubm90YXRpb24gYW4gOiBhbm5vdGF0aW9ucykgewotICAgICAgICAgICAgICAgIGlmIChSZXNvdXJjZS5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGFuLmdldENsYXNzKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vY2hlY2sgdG8gbWFrZSBzdXJlIGl0IGlzIGEgQFJlc291cmNlIGZvciBXZWJTZXJ2aWNlQ29udGV4dC4KLSAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2UgYXRSZXNvdXJjZSA9IChSZXNvdXJjZSlhbjsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzV2ViU2VydmljZUNvbnRleHRSZXNvdXJjZShhdFJlc291cmNlLCBtZXRob2QpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWV0aG9kOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1dlYlNlcnZpY2VDb250ZXh0UmVzb3VyY2UoUmVzb3VyY2UgYXRSZXNvdXJjZSwgRmllbGQgZmllbGQpIHsKLSAgICAgICAgQ2xhc3MgdHlwZSA9IGF0UmVzb3VyY2UudHlwZSgpOwotICAgICAgICBpZiAodHlwZSA9PSBqYXZhLmxhbmcuT2JqZWN0LmNsYXNzKSB7Ci0gICAgICAgICAgICBpZiAoZmllbGQgIT0gbnVsbCAmJiBmaWVsZC5nZXRUeXBlKCkgPT0gV2ViU2VydmljZUNvbnRleHQuY2xhc3MpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IFdlYlNlcnZpY2VDb250ZXh0LmNsYXNzKSB7Ci0gICAgICAgICAgICAvL1RPRE86IFNob3VsZCBJIGNoZWNrIGlmIHRoZSBmaWVsZCBkZWNsYXJlZCB0eXBlIGlzIGFzc2lnbmFibGUgZnJvbSBXZWJTZXJ2aWNlQ29udGV4dC4gU3BlYyBpcyBub3QgY2xlYXIgYWJvdXQgdGhpcy4KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKAotICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBGaWVsZCB0eXBlIG9yIFJlc291cmNlIFR5cGUgZm91bmQsIGNhbm5vdCBpbmplY3QgV2ViU2VydmljZUNvbnRleHQgb24gdGhpcyBmaWVsZCIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNXZWJTZXJ2aWNlQ29udGV4dFJlc291cmNlKFJlc291cmNlIGF0UmVzb3VyY2UsIE1ldGhvZCBtZXRob2QpIHsKLSAgICAgICAgLy9BcyBwZXIgSlNSLTI1MCB0aGUgbWV0aG9kIGluamVjdGlvbiBpcyBub3RoaW5nIGJ1dCBzZXR0ZXIgYmFzZWQgaW5qZWN0aW9uLAotICAgICAgICAvL1N1Y2ggYSBpbmplY3Rpb24gY2FuIGhhcHBlbiBpZiBtZXRob2QgbmFtZSBzdGFydHMgd2l0aCAic2V0IiByZXR1cm5zIGEgdm9pZCBhbmQKLSAgICAgICAgLy9vbmx5IGhhcyBvbmUgcGFyYW1ldGVyIGFuZCB0aGUgdHlwZSBvZiB0aGlzIHBhcmFtZXRlciBtdXN0IGJlIGNvbXBhdGlibGUgd2l0aAotICAgICAgICAvL3Jlc291cmNlLgotCi0gICAgICAgIENsYXNzIHR5cGUgPSBhdFJlc291cmNlLnR5cGUoKTsKLSAgICAgICAgQ2xhc3NbXSBwYXJhbVR5cGVzID0gbWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCk7Ci0gICAgICAgIGZvciAoQ2xhc3MgcGFyYW1UeXBlIDogcGFyYW1UeXBlcykKLSAgICAgICAgICAgIGlmICh0eXBlID09IGphdmEubGFuZy5PYmplY3QuY2xhc3MpIHsKLSAgICAgICAgICAgICAgICBpZiAocGFyYW1UeXBlID09IFdlYlNlcnZpY2VDb250ZXh0LmNsYXNzIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbVR5cGUuaXNBc3NpZ25hYmxlRnJvbShXZWJTZXJ2aWNlQ29udGV4dC5jbGFzcykpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IFdlYlNlcnZpY2VDb250ZXh0LmNsYXNzKSB7Ci0gICAgICAgICAgICAgICAgLy9UT0RPOiBTaG91bGQgSSBjaGVjayBpZiB0aGUgZmllbGQgZGVjbGFyZWQgdHlwZSBpcyBhc3NpZ25hYmxlIGZyb20gV2ViU2VydmljZUNvbnRleHQuIFNwZWMgaXMgbm90IGNsZWFyIGFib3V0IHRoaXMuCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKAotICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBGaWVsZCB0eXBlIG9yIFJlc291cmNlIFR5cGUgZm91bmQsIGNhbm5vdCBpbmplY3QgV2ViU2VydmljZUNvbnRleHQgb24gdGhpcyBtZXRob2QiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzVmFsaWRNZXRob2QoTWV0aG9kIG1ldGhvZCkgewotICAgICAgICAvL0FzIHBlciBKU1ItMjUwIHRoZSBtZXRob2QgaW5qZWN0aW9uIGlzIG5vdGhpbmcgYnV0IHNldHRlciBiYXNlZCBpbmplY3Rpb24sCi0gICAgICAgIC8vU3VjaCBhIGluamVjdGlvbiBjYW4gaGFwcGVuIGlmIG1ldGhvZCBuYW1lIHN0YXJ0cyB3aXRoICJzZXQiIHJldHVybnMgYSB2b2lkIGFuZAotICAgICAgICAvL29ubHkgaGFzIG9uZSBwYXJhbWV0ZXIgYW5kIHRoZSB0eXBlIG9mIHRoaXMgcGFyYW1ldGVyIG11c3QgYmUgY29tcGF0aWJsZSB3aXRoCi0gICAgICAgIC8vcmVzb3VyY2UuCi0gICAgICAgIFN0cmluZyBuYW1lID0gbWV0aG9kLmdldE5hbWUoKTsKLSAgICAgICAgQ2xhc3MgcmV0dXJuVHlwZSA9IG1ldGhvZC5nZXRSZXR1cm5UeXBlKCk7Ci0gICAgICAgIENsYXNzW10gdHlwZXMgPSBtZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKTsKLSAgICAgICAgaW50IG5vT2ZEZWNsYXJlZFBhcmFtZXRlciA9IDA7Ci0gICAgICAgIGlmICh0eXBlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBub09mRGVjbGFyZWRQYXJhbWV0ZXIgPSB0eXBlcy5sZW5ndGg7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobmFtZS5zdGFydHNXaXRoKE1FVEhPRF9OQU1FKSAmJiBub09mRGVjbGFyZWRQYXJhbWV0ZXIgPT0gTlVNQkVSX09GX1BBUkFNRVRFUlMgJiYKLSAgICAgICAgICAgICAgICByZXR1cm5UeXBlLmdldE5hbWUoKS5lcXVhbHMoUkVUVVJOX1RZUEUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygKLSAgICAgICAgICAgICAgICAgICAgIk1ldGhvZCBmb3VuZCB3aXRoIEBSZXNvdXJjZSBhbm5vdGFpb24gYW5kIGlucHV0IHBhcmFtIHRvIHNldCBXZWJTZXJ2aWNlQ29udGV4dCBPYmplY3QsIEhvd2V2ZXIgbWV0aG9kIGRpZCBub3QgbWVldCB0aGUgY3JpdGVyaWEgZm9yIGluamVjdGlvbiBhcyBwZXIgSlNSLTI1MCIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zZXJ2ZXIvZW5kcG9pbnQvbGlmZWN5Y2xlL0VuZHBvaW50TGlmZWN5Y2xlRXhjZXB0aW9uLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zZXJ2ZXIvZW5kcG9pbnQvbGlmZWN5Y2xlL0VuZHBvaW50TGlmZWN5Y2xlRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllY2UxYWMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2VydmVyL2VuZHBvaW50L2xpZmVjeWNsZS9FbmRwb2ludExpZmVjeWNsZUV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNlcnZlci5lbmRwb2ludC5saWZlY3ljbGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmxpZmVjeWNsZS5MaWZlY3ljbGVFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBFbmRwb2ludExpZmVjeWNsZUV4Y2VwdGlvbiBleHRlbmRzIExpZmVjeWNsZUV4Y2VwdGlvbiB7Ci0KLSAgICBwdWJsaWMgRW5kcG9pbnRMaWZlY3ljbGVFeGNlcHRpb24oKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyoqIEBwYXJhbSBtZXNzYWdlICAqLwotICAgIHB1YmxpYyBFbmRwb2ludExpZmVjeWNsZUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gbWVzc2FnZQotICAgICAqIEBwYXJhbSBjYXVzZQotICAgICAqLwotICAgIHB1YmxpYyBFbmRwb2ludExpZmVjeWNsZUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGNhdXNlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UsIGNhdXNlKTsKLSAgICB9Ci0KLSAgICAvKiogQHBhcmFtIGNhdXNlICAqLwotICAgIHB1YmxpYyBFbmRwb2ludExpZmVjeWNsZUV4Y2VwdGlvbihUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIoY2F1c2UpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2VydmVyL2VuZHBvaW50L2xpZmVjeWNsZS9FbmRwb2ludExpZmVjeWNsZU1hbmFnZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NlcnZlci9lbmRwb2ludC9saWZlY3ljbGUvRW5kcG9pbnRMaWZlY3ljbGVNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlYWRhY2MuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2VydmVyL2VuZHBvaW50L2xpZmVjeWNsZS9FbmRwb2ludExpZmVjeWNsZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zZXJ2ZXIuZW5kcG9pbnQubGlmZWN5Y2xlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaW5qZWN0aW9uLlJlc291cmNlSW5qZWN0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubGlmZWN5Y2xlLkxpZmVjeWNsZUV4Y2VwdGlvbjsKLQotLyoKLSAqIEVuZHBvaW50TGlmZWN5Y2xlTWFuYWdlciBpcyByZXNwb25zaWJsZSB0byBpbnZva2UgbGlmeWN5Y2xlIG1ldGhvZHMgb24gRW5kcG9pbnQuIEFuIEVuZHBvaW50IGNvdWxkIGJlIGEgCi0gKiBKYXZhIEJlYW4gRW5kcG9pbnQgb3IgUHJvdmlkZXIgRW5kcG9pbnQuIExpZmVjeWNsZSBtYW5hZ2VyIHNob3VsZCBiZSBpbnZva2VkIHdpdGggcHJvcGVyIEVuZHBvaW50IE9iamVjdC4KLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIEVuZHBvaW50TGlmZWN5Y2xlTWFuYWdlciB7Ci0KLSAgICAvKioKLSAgICAgKiBFbmRwb2ludExpZmVjeWNsZU1hbmFnZXIgd2lsbCBjcmVhdGUgYSBzZXJ2aWNlIGluc3RhbmNlLiBJdCB3aWxsIGluamVjdCBSZXNvdXJjZXMgYW5kIHRoZW4gY2FsbAotICAgICAqIHRoZSBsaWZlY3ljbGUgbWV0aG9kcyBvbiB0aGUgc2VydmljZSBpbnN0YW5jZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtYwotICAgICAqIEBwYXJhbSBzZXJ2aWNlSW1wbENsYXNzCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgY3JlYXRlU2VydmljZUluc3RhbmNlKE1lc3NhZ2VDb250ZXh0IG1jLCBDbGFzcyBzZXJ2aWNlSW1wbENsYXNzKQotICAgICAgICAgICAgdGhyb3dzIExpZmVjeWNsZUV4Y2VwdGlvbiwgUmVzb3VyY2VJbmplY3Rpb25FeGNlcHRpb247Ci0KLSAgICAvKgotICAgICAgKiBJbnZva2VzIG1ldGhvZCBvbiBlbmRwb2ludCBtYXJrZWQgd2l0aCBAUG9zdENvbnN0cnVjdCBhbm5vdGF0aW9uLgotICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbnZva2VQb3N0Q29uc3RydWN0KCkgdGhyb3dzIExpZmVjeWNsZUV4Y2VwdGlvbjsKLQotICAgIC8qCi0gICAgICAqIEludm9rZXMgbWV0aG9kIG9uIGVuZHBvaW50IG1hcmtlZCB3aXRoIEBwcmVEZXN0cm95IGFubm90YXRpb24uCi0gICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGludm9rZVByZURlc3Ryb3koKSB0aHJvd3MgTGlmZWN5Y2xlRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2VydmVyL2VuZHBvaW50L2xpZmVjeWNsZS9mYWN0b3J5L0VuZHBvaW50TGlmZWN5Y2xlTWFuYWdlckZhY3RvcnkuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NlcnZlci9lbmRwb2ludC9saWZlY3ljbGUvZmFjdG9yeS9FbmRwb2ludExpZmVjeWNsZU1hbmFnZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhY2FlNjcuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2VydmVyL2VuZHBvaW50L2xpZmVjeWNsZS9mYWN0b3J5L0VuZHBvaW50TGlmZWN5Y2xlTWFuYWdlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zZXJ2ZXIuZW5kcG9pbnQubGlmZWN5Y2xlLmZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNlcnZlci5lbmRwb2ludC5saWZlY3ljbGUuRW5kcG9pbnRMaWZlY3ljbGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zZXJ2ZXIuZW5kcG9pbnQubGlmZWN5Y2xlLkVuZHBvaW50TGlmZWN5Y2xlTWFuYWdlcjsKLQotcHVibGljIGludGVyZmFjZSBFbmRwb2ludExpZmVjeWNsZU1hbmFnZXJGYWN0b3J5IHsKLQotICAgIHB1YmxpYyBFbmRwb2ludExpZmVjeWNsZU1hbmFnZXIgY3JlYXRlRW5kcG9pbnRMaWZlY3ljbGVNYW5hZ2VyKE9iamVjdCBlbmRwb2ludEluc3RhbmNlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBFbmRwb2ludExpZmVjeWNsZUV4Y2VwdGlvbjsKLQotICAgIHB1YmxpYyBFbmRwb2ludExpZmVjeWNsZU1hbmFnZXIgY3JlYXRlRW5kcG9pbnRMaWZlY3ljbGVNYW5hZ2VyKCk7Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zZXJ2ZXIvZW5kcG9pbnQvbGlmZWN5Y2xlL2ZhY3RvcnkvaW1wbC9FbmRwb2ludExpZmVjeWNsZU1hbmFnZXJGYWN0b3J5SW1wbC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2VydmVyL2VuZHBvaW50L2xpZmVjeWNsZS9mYWN0b3J5L2ltcGwvRW5kcG9pbnRMaWZlY3ljbGVNYW5hZ2VyRmFjdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ4MmFkMS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zZXJ2ZXIvZW5kcG9pbnQvbGlmZWN5Y2xlL2ZhY3RvcnkvaW1wbC9FbmRwb2ludExpZmVjeWNsZU1hbmFnZXJGYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zZXJ2ZXIuZW5kcG9pbnQubGlmZWN5Y2xlLmZhY3RvcnkuaW1wbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5pMThuLk1lc3NhZ2VzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNlcnZlci5lbmRwb2ludC5saWZlY3ljbGUuRW5kcG9pbnRMaWZlY3ljbGVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2VydmVyLmVuZHBvaW50LmxpZmVjeWNsZS5FbmRwb2ludExpZmVjeWNsZU1hbmFnZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2VydmVyLmVuZHBvaW50LmxpZmVjeWNsZS5mYWN0b3J5LkVuZHBvaW50TGlmZWN5Y2xlTWFuYWdlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2VydmVyLmVuZHBvaW50LmxpZmVjeWNsZS5pbXBsLkVuZHBvaW50TGlmZWN5Y2xlTWFuYWdlckltcGw7DQotDQotLyoqDQotICogVGhpcyBpcyB0aGUgc3VwcGxpZWQgaW1wbGVtZW50YXRpb24gb2YgdGhlIEVuZHBvaW50TGlmZWN5Y2xlTWFuYWdlckZhY3RvcnkuDQotICogVGhpcyB3aWxsIHJldHVybiBhbiBpbnN0YW5jZSBjYXBhYmxlIG9mIGNyZWF0aW5nIGluc3RhbmNlcyBvZiB3ZWIgc2VydmljZQ0KLSAqIGVuZHBvaW50IG9iamVjdHMuDQotICoNCi0gKi8NCi1wdWJsaWMgY2xhc3MgRW5kcG9pbnRMaWZlY3ljbGVNYW5hZ2VyRmFjdG9yeUltcGwgaW1wbGVtZW50cyBFbmRwb2ludExpZmVjeWNsZU1hbmFnZXJGYWN0b3J5IHsNCi0NCi0gICAgcHVibGljIEVuZHBvaW50TGlmZWN5Y2xlTWFuYWdlckZhY3RvcnlJbXBsKCkgew0KLSAgICAgICAgc3VwZXIoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgRW5kcG9pbnRMaWZlY3ljbGVNYW5hZ2VyIGNyZWF0ZUVuZHBvaW50TGlmZWN5Y2xlTWFuYWdlcihPYmplY3QgZW5kcG9pbnRJbnN0YW5jZSkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIEVuZHBvaW50TGlmZWN5Y2xlRXhjZXB0aW9uIHsNCi0gICAgICAgIGlmIChlbmRwb2ludEluc3RhbmNlID09IG51bGwpIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgRW5kcG9pbnRMaWZlY3ljbGVFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiRW5kcG9pbnRMaWZlY3ljbGVNYW5hZ2VySW1wbEVycjEiKSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbmV3IEVuZHBvaW50TGlmZWN5Y2xlTWFuYWdlckltcGwoZW5kcG9pbnRJbnN0YW5jZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEVuZHBvaW50TGlmZWN5Y2xlTWFuYWdlciBjcmVhdGVFbmRwb2ludExpZmVjeWNsZU1hbmFnZXIoKSB7DQotDQotICAgICAgICByZXR1cm4gbmV3IEVuZHBvaW50TGlmZWN5Y2xlTWFuYWdlckltcGwoKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zZXJ2ZXIvZW5kcG9pbnQvbGlmZWN5Y2xlL2ltcGwvRW5kcG9pbnRMaWZlY3ljbGVNYW5hZ2VySW1wbC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2VydmVyL2VuZHBvaW50L2xpZmVjeWNsZS9pbXBsL0VuZHBvaW50TGlmZWN5Y2xlTWFuYWdlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDMyN2E5YS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zZXJ2ZXIvZW5kcG9pbnQvbGlmZWN5Y2xlL2ltcGwvRW5kcG9pbnRMaWZlY3ljbGVNYW5hZ2VySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zZXJ2ZXIuZW5kcG9pbnQubGlmZWN5Y2xlLmltcGw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuU2VydmljZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLkV4Y2VwdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb250ZXh0LldlYlNlcnZpY2VDb250ZXh0SW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvbnRleHQuZmFjdG9yeS5NZXNzYWdlQ29udGV4dEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uU2VydmljZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaGFuZGxlci5Tb2FwTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5pMThuLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaW5qZWN0aW9uLlJlc291cmNlSW5qZWN0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubGlmZWN5Y2xlLkJhc2VMaWZlY3ljbGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubGlmZWN5Y2xlLkxpZmVjeWNsZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnJ1bnRpbWUuZGVzY3JpcHRpb24uaW5qZWN0aW9uLlJlc291cmNlSW5qZWN0aW9uU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnJ1bnRpbWUuZGVzY3JpcHRpb24uaW5qZWN0aW9uLlJlc291cmNlSW5qZWN0aW9uU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zZXJ2ZXIuZW5kcG9pbnQuaW5qZWN0aW9uLlJlc291cmNlSW5qZWN0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zZXJ2ZXIuZW5kcG9pbnQuaW5qZWN0aW9uLldlYlNlcnZpY2VDb250ZXh0SW5qZWN0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zZXJ2ZXIuZW5kcG9pbnQuaW5qZWN0aW9uLmZhY3RvcnkuUmVzb3VyY2VJbmplY3Rpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2VydmVyLmVuZHBvaW50LmxpZmVjeWNsZS5FbmRwb2ludExpZmVjeWNsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLkxvYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlQ29udGV4dDsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci0KLXB1YmxpYyBjbGFzcyBFbmRwb2ludExpZmVjeWNsZU1hbmFnZXJJbXBsIGV4dGVuZHMgQmFzZUxpZmVjeWNsZU1hbmFnZXIgaW1wbGVtZW50cwotICAgICAgICBFbmRwb2ludExpZmVjeWNsZU1hbmFnZXIgewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQlNFUlZJQ0VfTUVTU0FHRV9DT05URVhUID0gImphdmF4LnhtbC53cy5XZWJTZXJ2aWNlQ29udGV4dCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEVuZHBvaW50TGlmZWN5Y2xlTWFuYWdlckltcGwuY2xhc3MpOwotCi0gICAgcHVibGljIEVuZHBvaW50TGlmZWN5Y2xlTWFuYWdlckltcGwoT2JqZWN0IGVuZHBvaW50SW5zdGFuY2UpIHsKLSAgICAgICAgdGhpcy5pbnN0YW5jZSA9IGVuZHBvaW50SW5zdGFuY2U7Ci0gICAgfQotCi0gICAgcHVibGljIEVuZHBvaW50TGlmZWN5Y2xlTWFuYWdlckltcGwoKSB7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2VydmVyLmVuZHBvaW50LmxpZmVjeWNsZS5FbmRwb2ludExpZmVjeWNsZU1hbmFnZXIjY3JlYXRlU2VydmljZUluc3RhbmNlKG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS5NZXNzYWdlQ29udGV4dCwgamF2YS5sYW5nLkNsYXNzKQotICAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGNyZWF0ZVNlcnZpY2VJbnN0YW5jZShNZXNzYWdlQ29udGV4dCBtYywgQ2xhc3Mgc2VydmljZUltcGxDbGFzcykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgTGlmZWN5Y2xlRXhjZXB0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlSW5qZWN0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQgPSBtYy5nZXRBeGlzTWVzc2FnZUNvbnRleHQoKTsKLQotICAgICAgICAvLyBHZXQgdGhlIFNlcnZpY2VEZXNjcmlwdGlvbiBhbmQgaW5qZWN0aW9uRGVzYyB3aGljaCBjb250YWluCi0gICAgICAgIC8vIGNhY2hlZCBpbmZvcm1hdGlvbgotICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc2VydmljZURlc2MgPSBtYy5nZXRFbmRwb2ludERlc2NyaXB0aW9uKCkuZ2V0U2VydmljZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgIFJlc291cmNlSW5qZWN0aW9uU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbiBpbmplY3Rpb25EZXNjID0KLSAgICAgICAgICAgICAgICBnZXRJbmplY3Rpb25EZXNjKHNlcnZpY2VEZXNjLCBzZXJ2aWNlSW1wbENsYXNzKTsKLQotCi0gICAgICAgIE9iamVjdCBzZXJ2aWNlaW1wbCA9IHJldHJpZXZlU2VydmljZUluc3RhbmNlKG1jKTsKLSAgICAgICAgaWYgKHNlcnZpY2VpbXBsICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRoaXMuaW5zdGFuY2UgPSBzZXJ2aWNlaW1wbDsKLQotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJTZXJ2aWNlIEluc3RhbmNlIGZvdW5kIGluIHRoZSBzZXJ2aWNlIGNvbnRleHQsIHJldXNpbmcgdGhlIGluc3RhbmNlIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIElmIHJlc291cmNlIGluamVjdGlvbiBpcyBuZWVkZWQsIGNyZWF0ZSB0aGUgU09BUE1lc3NhZ2VDb250ZXh0IGFuZCB1cGRhdGUgdGhlIFdlYlNlcnZpY2VDb250ZXh0Ci0gICAgICAgICAgICAvLyBDcmVhdGUgTWVzc2FnZUNvbnRleHQgZm9yIGN1cnJlbnQgaW52b2NhdGlvbi4KLSAgICAgICAgICAgIGlmIChoYXNSZXNvdXJjZUFubm90YXRpb24oaW5qZWN0aW9uRGVzYykpIHsKLSAgICAgICAgICAgICAgICBwZXJmb3JtV2ViU2VydmljZUNvbnRleHRVcGRhdGUobWMpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvL3NpbmNlIHNlcnZpY2UgaW1wbCBpcyB0aGVyZSBpbiBzZXJ2aWNlIGNvbnRleHQgLCB0YWtlIHRoYXQgZnJvbSB0aGVyZQotICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2VpbXBsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gY3JlYXRlIGEgbmV3IHNlcnZpY2UgaW1wbCBjbGFzcyBmb3IgdGhhdCBzZXJ2aWNlCi0gICAgICAgICAgICBzZXJ2aWNlaW1wbCA9IGNyZWF0ZVNlcnZpY2VJbnN0YW5jZShtc2dDb250ZXh0LmdldEF4aXNTZXJ2aWNlKCksIHNlcnZpY2VJbXBsQ2xhc3MpOwotICAgICAgICAgICAgdGhpcy5pbnN0YW5jZSA9IHNlcnZpY2VpbXBsOwotCi0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIk5ldyBTZXJ2aWNlIEluc3RhbmNlIGNyZWF0ZWQiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gSWYgcmVzb3VyY2UgaW5qZWN0aW9uIGlzIG5lZWRlZCwgY3JlYXRlIHRoZSBTT0FQTWVzc2FnZUNvbnRleHQgYW5kIGJ1aWxkIHRoZSBXZWJTZXJ2aWNlQ29udGV4dAotICAgICAgICAgICAgLy8gQ3JlYXRlIE1lc3NhZ2VDb250ZXh0IGZvciBjdXJyZW50IGludm9jYXRpb24uCi0gICAgICAgICAgICBpZiAoaGFzUmVzb3VyY2VBbm5vdGF0aW9uKGluamVjdGlvbkRlc2MpKSB7Ci0gICAgICAgICAgICAgICAgcGVyZm9ybVdlYlNlcnZpY2VDb250ZXh0SW5qZWN0aW9uKG1jLCBzZXJ2aWNlaW1wbCk7Ci0gICAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAgLy9JbnZva2UgUG9zdENvbnN0cnVjdAotICAgICAgICAgICAgaWYgKGluamVjdGlvbkRlc2MgIT0gbnVsbCAmJiBpbmplY3Rpb25EZXNjLmdldFBvc3RDb25zdHJ1Y3RNZXRob2QoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaW52b2tlUG9zdENvbnN0cnVjdChpbmplY3Rpb25EZXNjLmdldFBvc3RDb25zdHJ1Y3RNZXRob2QoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTZXJ2aWNlQ29udGV4dCBzZXJ2aWNlQ29udGV4dCA9IG1zZ0NvbnRleHQuZ2V0U2VydmljZUNvbnRleHQoKTsKLSAgICAgICAgICAgIHNlcnZpY2VDb250ZXh0LnNldFByb3BlcnR5KFNlcnZpY2VDb250ZXh0LlNFUlZJQ0VfT0JKRUNULCBzZXJ2aWNlaW1wbCk7Ci0gICAgICAgICAgICByZXR1cm4gc2VydmljZWltcGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCBsb2NhdGVzIGFuIGV4aXN0aW5nIHNlcnZpY2UgaW1wbGVtZW50YXRpb24gaW5zdGFuY2UgaWYKLSAgICAgKiBvbmUgaGFzIGJlZW4gcHJldmlvdXNseSBzdG9yZWQgYXdheS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IHJldHJpZXZlU2VydmljZUluc3RhbmNlKE1lc3NhZ2VDb250ZXh0IG1jKSB7Ci0gICAgICAgIE9iamVjdCBpbnN0YW5jZSA9IG51bGw7Ci0gICAgICAgIFNlcnZpY2VDb250ZXh0IHNlcnZpY2VDb250ZXh0ID0gbWMuZ2V0QXhpc01lc3NhZ2VDb250ZXh0KCkuZ2V0U2VydmljZUNvbnRleHQoKTsKLSAgICAgICAgaW5zdGFuY2UgPSBzZXJ2aWNlQ29udGV4dC5nZXRQcm9wZXJ0eShTZXJ2aWNlQ29udGV4dC5TRVJWSUNFX09CSkVDVCk7Ci0gICAgICAgIHJldHVybiBpbnN0YW5jZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIHByb3ZpZGUgdGhlIG5lY2Vzc2FyeSBmdW5jdGlvbiBpbiBvcmRlciB0byBpbmplY3QKLSAgICAgKiBhIFdlYlNlcnZpY2VDb250ZXh0IGluc3RhbmNlIG9uIGEgbWVtYmVyIG9mIHRoZSBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIGNsYXNzLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHBlcmZvcm1XZWJTZXJ2aWNlQ29udGV4dEluamVjdGlvbihNZXNzYWdlQ29udGV4dCBtYywgT2JqZWN0IHNlcnZpY2VJbXBsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBSZXNvdXJjZUluamVjdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIFdlYlNlcnZpY2VDb250ZXh0IHdzQ29udGV4dCA9IGNyZWF0ZVdlYlNlcnZpY2VDb250ZXh0KG1jKTsKLSAgICAgICAgLy8gSW5qZWN0IFdlYlNlcnZpY2VDb250ZXh0Ci0gICAgICAgIGluamVjdFdlYlNlcnZpY2VDb250ZXh0KG1jLCB3c0NvbnRleHQsIHNlcnZpY2VJbXBsKTsKLSAgICAgICAgc2F2ZVdlYlNlcnZpY2VDb250ZXh0KG1jLCB3c0NvbnRleHQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgcHJvdmlkZSB0aGUgbmVjZXNzYXJ5IGZ1bmN0aW9uIGluIG9yZGVyIHRvIHVwZGF0ZQotICAgICAqIGFuIGV4aXN0aW5nIFdlYlNlcnZpY2VDb250ZXh0IGluc3RhbmNlIHdpdGggYSBNZXNzYWdlQ29udGV4dCBmb3IKLSAgICAgKiB0aGUgY3VycmVudCByZXF1ZXN0LgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHBlcmZvcm1XZWJTZXJ2aWNlQ29udGV4dFVwZGF0ZShNZXNzYWdlQ29udGV4dCBtYykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIFJlc291cmNlSW5qZWN0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgamF2YXgueG1sLndzLmhhbmRsZXIuTWVzc2FnZUNvbnRleHQgc29hcE1lc3NhZ2VDb250ZXh0ID0gY3JlYXRlU09BUE1lc3NhZ2VDb250ZXh0KG1jKTsKLSAgICAgICAgU2VydmljZUNvbnRleHQgc2VydmljZUNvbnRleHQgPSBtYy5nZXRBeGlzTWVzc2FnZUNvbnRleHQoKS5nZXRTZXJ2aWNlQ29udGV4dCgpOwotCi0gICAgICAgIC8vR2V0IFdlYlNlcnZpY2VDb250ZXh0IGZyb20gU2VydmljZUNvbnRleHQKLSAgICAgICAgV2ViU2VydmljZUNvbnRleHQgd3MgPQotICAgICAgICAgICAgICAgIChXZWJTZXJ2aWNlQ29udGV4dCkgc2VydmljZUNvbnRleHQuZ2V0UHJvcGVydHkoV0VCU0VSVklDRV9NRVNTQUdFX0NPTlRFWFQpOwotCi0gICAgICAgIC8vQWRkIHRoZSBNZXNzYWdlQ29udGV4dCBmb3IgY3VycmVudCBpbnZvY2F0aW9uCi0gICAgICAgIGlmICh3cyAhPSBudWxsKSB7Ci0gICAgICAgICAgICB1cGRhdGVXZWJTZXJ2aWNlQ29udGV4dCh3cywgc29hcE1lc3NhZ2VDb250ZXh0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgcHJvdmlkZSB0aGUgZnVuY3Rpb24gbmVjZXNzYXJ5IHRvIHNhdmUgdGhlIFdlYlNlcnZpY2VDb250ZXh0Ci0gICAgICogYXNzb2NpYXRlZCB3aXRoIHRoZSBlbmRwb2ludC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzYXZlV2ViU2VydmljZUNvbnRleHQoTWVzc2FnZUNvbnRleHQgbWMsIFdlYlNlcnZpY2VDb250ZXh0IHdzQ29udGV4dCkgewotICAgICAgICBTZXJ2aWNlQ29udGV4dCBzYyA9IG1jLmdldEF4aXNNZXNzYWdlQ29udGV4dCgpLmdldFNlcnZpY2VDb250ZXh0KCk7Ci0gICAgICAgIHNjLnNldFByb3BlcnR5KFdFQlNFUlZJQ0VfTUVTU0FHRV9DT05URVhULCB3c0NvbnRleHQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgYmUgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIGFuIGluc3RhbmNlIG9mIGEgV2ViU2VydmljZUNvbnRleHQKLSAgICAgKiBhbmQgaW5pdGlhbGl6aW5nIHRoZSBpbnN0YW5jZSB3aXRoIGEgTWVzc2FnZUNvbnRleHQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFdlYlNlcnZpY2VDb250ZXh0IGNyZWF0ZVdlYlNlcnZpY2VDb250ZXh0KE1lc3NhZ2VDb250ZXh0IG1jKSB7Ci0gICAgICAgIGphdmF4LnhtbC53cy5oYW5kbGVyLk1lc3NhZ2VDb250ZXh0IHNvYXBNZXNzYWdlQ29udGV4dCA9IGNyZWF0ZVNPQVBNZXNzYWdlQ29udGV4dChtYyk7Ci0gICAgICAgIC8vIENyZWF0ZSBXZWJTZXJ2aWNlQ29udGV4dAotICAgICAgICBXZWJTZXJ2aWNlQ29udGV4dEltcGwgd3NDb250ZXh0ID0gbmV3IFdlYlNlcnZpY2VDb250ZXh0SW1wbCgpOwotICAgICAgICAvL0FkZCBNZXNzYWdlQ29udGV4dCBmb3IgdGhpcyByZXF1ZXN0LgotICAgICAgICB3c0NvbnRleHQuc2V0U29hcE1lc3NhZ2VDb250ZXh0KHNvYXBNZXNzYWdlQ29udGV4dCk7Ci0gICAgICAgIHJldHVybiB3c0NvbnRleHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2Qgd2lsbCByZXRyaWV2ZSBhIFJlc291cmNlSW5qZWN0aW9uU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbiBpZiBvbmUKLSAgICAgKiBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgU2VydmljZURlc2NyaXB0aW9uLgotICAgICAqLwotICAgIHByb3RlY3RlZCBSZXNvdXJjZUluamVjdGlvblNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb24gZ2V0SW5qZWN0aW9uRGVzYygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNlcnZpY2VEZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyBzZXJ2aWNlSW1wbENsYXNzKSB7Ci0gICAgICAgIFJlc291cmNlSW5qZWN0aW9uU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbiBpbmplY3Rpb25EZXNjID0gbnVsbDsKLSAgICAgICAgaWYgKHNlcnZpY2VEZXNjICE9IG51bGwpIHsKLSAgICAgICAgICAgIGluamVjdGlvbkRlc2MgPQotICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZUluamVjdGlvblNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb25GYWN0b3J5LmdldChzZXJ2aWNlRGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZUltcGxDbGFzcyk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gaW5qZWN0aW9uRGVzYzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCBpbmRpY2F0ZXMgd2hldGhlciBvciBub3Qgd2UgbmVlZCB0byBwZXJmb3JtIFdlYlNlcnZpY2VDb250ZXh0IGluamVjdGlvbgotICAgICAqIG9uIGEgZmllbGQgd2l0aGluIG91ciBlbmRwb2ludCBpbnN0YW5jZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBoYXNSZXNvdXJjZUFubm90YXRpb24oUmVzb3VyY2VJbmplY3Rpb25TZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uIGluamVjdGlvbkRlc2MpIHsKLSAgICAgICAgcmV0dXJuIChpbmplY3Rpb25EZXNjICE9IG51bGwgJiYgaW5qZWN0aW9uRGVzYy5oYXNSZXNvdXJjZUFubm90YXRpb24oKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBPYmplY3QgY3JlYXRlU2VydmljZUluc3RhbmNlKEF4aXNTZXJ2aWNlIHNlcnZpY2UsIENsYXNzIHNlcnZpY2VJbXBsQ2xhc3MpIHsKLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIkNyZWF0aW5nIG5ldyBpbnN0YW5jZSBvZiBzZXJ2aWNlIGVuZHBvaW50Iik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc2VydmljZUltcGxDbGFzcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoIkVuZHBvaW50Q29udHJvbGxlckVycjUiKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBPYmplY3QgaW5zdGFuY2UgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gYWxsb3cgYWx0ZXJuYXRpdmUgZGVmaW5pdGlvbiBvZiBtYWtlTmV3U2VydmljZU9iamVjdAotICAgICAgICAgICAgaWYgKHNlcnZpY2UgIT0gbnVsbCAmJiBzZXJ2aWNlLmdldFBhcmFtZXRlcihDb25zdGFudHMuU0VSVklDRV9PQkpFQ1RfU1VQUExJRVIpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBDbGFzc0xvYWRlciBjbGFzc0xvYWRlciA9IHNlcnZpY2UuZ2V0Q2xhc3NMb2FkZXIoKTsKLQotICAgICAgICAgICAgICAgIFBhcmFtZXRlciBzZXJ2aWNlT2JqZWN0UGFyYW0gPQotICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZS5nZXRQYXJhbWV0ZXIoQ29uc3RhbnRzLlNFUlZJQ0VfT0JKRUNUX1NVUFBMSUVSKTsKLSAgICAgICAgICAgICAgICBDbGFzcyBzZXJ2aWNlT2JqZWN0TWFrZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgTG9hZGVyLmxvYWRDbGFzcyhjbGFzc0xvYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTdHJpbmcpIHNlcnZpY2VPYmplY3RQYXJhbS5nZXRWYWx1ZSgpKS50cmltKCkpOwotCi0gICAgICAgICAgICAgICAgLy8gRmluZCBzdGF0aWMgZ2V0U2VydmljZU9iamVjdCgpIG1ldGhvZCwgY2FsbCBpdCBpZiB0aGVyZQotICAgICAgICAgICAgICAgIE1ldGhvZCBtZXRob2QgPQotICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZU9iamVjdE1ha2VyLmdldE1ldGhvZCgiZ2V0U2VydmljZU9iamVjdCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdIHsgQXhpc1NlcnZpY2UuY2xhc3MgfSk7Ci0gICAgICAgICAgICAgICAgaWYgKG1ldGhvZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBtZXRob2QuaW52b2tlKHNlcnZpY2VPYmplY3RNYWtlci5uZXdJbnN0YW5jZSgpLCBuZXcgT2JqZWN0W10geyBzZXJ2aWNlIH0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGluc3RhbmNlID0gc2VydmljZUltcGxDbGFzcy5uZXdJbnN0YW5jZSgpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiRW5kcG9pbnRDb250cm9sbGVyRXJyNiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZUltcGxDbGFzcy5nZXROYW1lKCkpKTsKLSAgICAgICAgfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoIkVuZHBvaW50Q29udHJvbGxlckVycjYiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VJbXBsQ2xhc3MuZ2V0TmFtZSgpKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoIkVuZHBvaW50Q29udHJvbGxlckVycjYiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VJbXBsQ2xhc3MuZ2V0TmFtZSgpKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gaW5zdGFuY2U7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGphdmF4LnhtbC53cy5oYW5kbGVyLk1lc3NhZ2VDb250ZXh0IGNyZWF0ZVNPQVBNZXNzYWdlQ29udGV4dChNZXNzYWdlQ29udGV4dCBtYykgewotICAgICAgICBTb2FwTWVzc2FnZUNvbnRleHQgc29hcE1lc3NhZ2VDb250ZXh0ID0KLSAgICAgICAgICAgICAgICAoU29hcE1lc3NhZ2VDb250ZXh0KSBNZXNzYWdlQ29udGV4dEZhY3RvcnkuY3JlYXRlU29hcE1lc3NhZ2VDb250ZXh0KG1jKTsKLSAgICAgICAgcmV0dXJuIHNvYXBNZXNzYWdlQ29udGV4dDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbmplY3RXZWJTZXJ2aWNlQ29udGV4dChNZXNzYWdlQ29udGV4dCBtYywgV2ViU2VydmljZUNvbnRleHQgd3NDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBzZXJ2aWNlSW5zdGFuY2UpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgUmVzb3VyY2VJbmplY3Rpb25FeGNlcHRpb24gewotICAgICAgICBSZXNvdXJjZUluamVjdG9yIHJpID0KLSAgICAgICAgICAgICAgICBSZXNvdXJjZUluamVjdGlvbkZhY3RvcnkuY3JlYXRlUmVzb3VyY2VJbmplY3RvcihXZWJTZXJ2aWNlQ29udGV4dC5jbGFzcyk7Ci0gICAgICAgIHJpLmluamVjdCh3c0NvbnRleHQsIHNlcnZpY2VJbnN0YW5jZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlV2ViU2VydmljZUNvbnRleHQoV2ViU2VydmljZUNvbnRleHQgd3NDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC53cy5oYW5kbGVyLk1lc3NhZ2VDb250ZXh0IHNvYXBNZXNzYWdlQ29udGV4dCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIFJlc291cmNlSW5qZWN0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgV2ViU2VydmljZUNvbnRleHRJbmplY3RvciB3Y2kgPQotICAgICAgICAgICAgICAgIChXZWJTZXJ2aWNlQ29udGV4dEluamVjdG9yKSBSZXNvdXJjZUluamVjdGlvbkZhY3RvcnkuY3JlYXRlUmVzb3VyY2VJbmplY3RvcihXZWJTZXJ2aWNlQ29udGV4dEluamVjdG9yLmNsYXNzKTsKLSAgICAgICAgd2NpLmFkZE1lc3NhZ2VDb250ZXh0KHdzQ29udGV4dCwgc29hcE1lc3NhZ2VDb250ZXh0KTsKLQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc3BpL0JpbmRpbmcuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NwaS9CaW5kaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwYjlkMWMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc3BpL0JpbmRpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc3BpOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS5NZXNzYWdlQ29udGV4dDsNCi0NCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VGZWF0dXJlOw0KLQ0KLS8qKg0KLSAqIA0KLSAqLw0KLXB1YmxpYyBpbnRlcmZhY2UgQmluZGluZyBleHRlbmRzIGphdmF4LnhtbC53cy5CaW5kaW5nIHsNCi0gICAgcHVibGljIHZvaWQgc2V0RmVhdHVyZXMoV2ViU2VydmljZUZlYXR1cmUuLi4gZmVhdHVyZXMpOw0KLSAgICANCi0gICAgcHVibGljIFdlYlNlcnZpY2VGZWF0dXJlIGdldEZlYXR1cmUoU3RyaW5nIGlkKTsNCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZShNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCwgQmluZGluZ1Byb3ZpZGVyIHByb3ZpZGVyKTsNCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHNldEF4aXMyRW5kcG9pbnRSZWZlcmVuY2UoRW5kcG9pbnRSZWZlcmVuY2UgZXByKTsNCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHNldEFkZHJlc3NpbmdOYW1lc3BhY2UoU3RyaW5nIGFkZHJlc3NpbmdOYW1lc3BhY2UpOw0KLSAgICANCi0gICAgcHVibGljIEVuZHBvaW50UmVmZXJlbmNlIGdldEF4aXMyRW5kcG9pbnRSZWZlcmVuY2UoKTsNCi0gICAgDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWRkcmVzc2luZ05hbWVzcGFjZSgpOw0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zcGkvQmluZGluZ1Byb3ZpZGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zcGkvQmluZGluZ1Byb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3MDA2NDkuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc3BpL0JpbmRpbmdQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNwaTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRW5kcG9pbnREZXNjcmlwdGlvbjsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBCaW5kaW5nUHJvdmlkZXIgZXh0ZW5kcyBqYXZheC54bWwud3MuQmluZGluZ1Byb3ZpZGVyIHsKLSAgICBwdWJsaWMgRW5kcG9pbnREZXNjcmlwdGlvbiBnZXRFbmRwb2ludERlc2NyaXB0aW9uKCk7Ci0KLSAgICBwdWJsaWMgU2VydmljZURlbGVnYXRlIGdldFNlcnZpY2VEZWxlZ2F0ZSgpOwotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc3BpL0NvbnN0YW50cy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc3BpL0NvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNWI3YzU4Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NwaS9Db25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zcGk7Ci0KLS8qKiBKQVhXUyBTUEkgQ29uc3RhbnRzICovCi1wdWJsaWMgY2xhc3MgQ29uc3RhbnRzIHsKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBNZXNzYWdlQ29udGV4dCBQcm9wZXJ0eSBLZXlzCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLy8gVmFsdWUgPSBCb29sZWFuCi0gICAgLy8gVXNhZ2U6IFNldHRpbmcgdGhpcyBwcm9wZXJ0eSB0byB0cnVlIHdpbGwgY2F1c2UgdGhlIGVudGlyZSByZXF1ZXN0IG1lc3NhZ2UKLSAgICAvLyAgIHRvIGJlIHNhdmVkIGFuZCByZXN0b3JlZC4gQSByZWxpYWJsZSBtZXNzYWdpbmcgaW5ib3VuZCBoYW5kbGVyIHNob3VsZCBzZXQgCi0gICAgLy8gICB0aGlzIGZsYWcgaWYgdGhlIGVudGlyZSBtZXNzYWdlIHNob3VsZCBiZSBzYXZlZC4gIFNldHRpbmcgdGhpcyBmbGFnIHdpbGwgc3Vic3RhbnRpYWxseQotICAgIC8vICAgZGVncmFkZSBwZXJmb3JtYW5jZS4KLSAgICAvLwotICAgIC8vICAgVGhlIGRlZmF1bHQgaXMgdG8gbm90IHNhdmUgdGhlIGVudGlyZSBtZXNzYWdlLiAgQWZ0ZXIgc2VydmVyIGRpc3BhdGNoIHByb2Nlc3NpbmcsIHRoZSAKLSAgICAvLyAgIGJvZHkgb2YgdGhlIHJlcXVlc3QgbWVzc2FnZSB3aWxsIG5vdCBiZSBhdmFpbGFibGUuICBUaGlzIGlzIGFjY2VwdGFibGUgaW4gbW9zdCBzY2VuYXJpb3MuCi0gICAgLy8KLSAgICAvLyBSRVZJRVcgT25seSBob25vcmVkIG9uIHRoZSBzZXJ2ZXI6IFNhdmVkIGJlZm9yZSBpbmJvdW5kIGFwcGxpY2F0aW9uIGhhbmRsZXIgcHJvY2Vzc2luZyBhbmQKLSAgICAvLyAgIHJlc3RvcmVkIGFmdGVyIG91dGJvdW5kIGFwcGxpY2F0aW9uIGhhbmRsZXIgcHJvY2Vzc2luZy4KLSAgICAvLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNBVkVfUkVRVUVTVF9NU0cgPSAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zcGkuU0FWRV9SRVFVRVNUX01TRyI7Ci0KLSAgICAvLyBWYWx1ZSA9IFN0cmluZwotICAgIC8vIFVzYWdlOiBWYWx1ZSBvZiBzYXZlZCByZXF1ZXN0Ci0gICAgLy8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQVZFRF9SRVFVRVNUX01TR19URVhUID0KLSAgICAgICAgICAgICJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNwaS5TQVZFRF9SRVFVRVNUX01TR19URVhUIjsKLQotICAgIC8vIFZhbHVlID0gQ29sbGVjdGlvbgotICAgIC8vIFVzYWdlOiBBIGxpc3Qgb2YgQXBwbGljYXRpb25Db250ZXh0TWlncmF0b3Igb2JqZWN0cyB0aGF0IGFyZSB0byBiZSBjYWxsZWQgZm9yIGFuIGludm9jYXRpb24uCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQTElDQVRJT05fQ09OVEVYVF9NSUdSQVRPUl9MSVNUX0lEID0KLSAgICAgICAgICAgICJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNwaS5BcHBsaWNhdGlvbkNvbnRleHRNaWdyYXRvcnMiOwotICAgIAotICAgIC8vIFZhbHVlID0gQ2xhc3NMb2FkZXIKLSAgICAvLyBVc2FnZTogU3RvcmVzIENsYXNzTG9hZGVyIGluc3RhbmNlIG9uIHJlc3BvbnNlIG1lc3NhZ2UgY29udGV4dCB0aGF0IGVuc3VyZXMgdGhlIAotICAgIC8vIEpBWEJVdGlscyBjbGFzcyB3aWxsIHVzZSB0aGUgc2FtZSBDbGFzc0xvYWRlciB0byByZXRyaWV2ZSBhIEpBWEJDb250ZXh0IGFzIHRoZQotICAgIC8vIG9uZSB0aGF0IHdhcyB1c2VkIHRvIGNyZWF0ZSB0aGUgcmVxdWVzdAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBQ0hFX0NMQVNTTE9BREVSID0gIkNBQ0hFX0NMQVNTTE9BREVSIjsKLSAgICAKLSAgICAvLyBWYWx1ZSA9IExpc3QKLSAgICAvLyBVc2FnZTogU3RvcmUgbGlzdCBvZiBJbnZvY2F0aW9uTGlzdGVuZXIgaW5zdGFuY2VzIGZvciBhIGdpdmVuIHJlcXVlc3QvcmVzcG9uc2UKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTlZPQ0FUSU9OX0xJU1RFTkVSX0xJU1QgPSAKLSAgICAgICAgIm9yZy5hcGFjaGUuYXhpczIuamF4d3Muc3BpLklOVk9DQVRJT05fTElTVEVORVJfTElTVCI7Ci0gICAgCi0gICAgLy8gVmFsdWUgPSBUaHJvd2FibGUKLSAgICAvLyBVc2FnZTogU3RvcmUgVGhyb3dhYmxlIHR5cGUgdGhhdCBzaG91bGQgYmUgdXNlZCB3aGVuIGNvbnN0cnVjdGluZyBtZXNzYWdlIHRvIGJlCi0gICAgLy8gc2VudCBiYWNrIHRvIHRoZSBjbGllbnQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQRURfRVhDRVBUSU9OID0gIm9yZy5hcGFjaGUuYXhpczIuamF4d3Muc3BpLk1BUFBFRF9FWENFUFRJT04iOwotICAgIAotICAgIC8qKiBJbnRlbnRpb25hbGx5IFByaXZhdGUgKi8KLSAgICBwcml2YXRlIENvbnN0YW50cygpIHsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NwaS9Qcm92aWRlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc3BpL1Byb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlMDExZGEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc3BpL1Byb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNwaTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZUhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcubWV0YWRhdGEuU2VydmljZU5hbWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLm1ldGFkYXRhLldTRExMb2NhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLkV4Y2VwdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5hZGRyZXNzaW5nLnV0aWwuRW5kcG9pbnRSZWZlcmVuY2VVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmkxOG4uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zZXJ2ZXIuZW5kcG9pbnQuRW5kcG9pbnRJbXBsOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC53cy5FbmRwb2ludDsKLWltcG9ydCBqYXZheC54bWwud3MuRW5kcG9pbnRSZWZlcmVuY2U7Ci1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VGZWF0dXJlOwotaW1wb3J0IGphdmF4LnhtbC53cy5zcGkuU2VydmljZURlbGVnYXRlOwotaW1wb3J0IGphdmF4LnhtbC53cy53c2FkZHJlc3NpbmcuVzNDRW5kcG9pbnRSZWZlcmVuY2U7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1wdWJsaWMgY2xhc3MgUHJvdmlkZXIgZXh0ZW5kcyBqYXZheC54bWwud3Muc3BpLlByb3ZpZGVyIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBFbGVtZW50W10gWkVST19MRU5HVEhfQVJSQVkgPSBuZXcgRWxlbWVudFswXTsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBFbmRwb2ludCBjcmVhdGVBbmRQdWJsaXNoRW5kcG9pbnQoU3RyaW5nIHMsIE9iamVjdCBvYmopIHsKLSAgICAgICAgRW5kcG9pbnQgZXAgPSBuZXcgRW5kcG9pbnRJbXBsKG9iaik7Ci0gICAgICAgIGVwLnB1Ymxpc2gocyk7Ci0gICAgICAgIHJldHVybiBlcDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgRW5kcG9pbnQgY3JlYXRlRW5kcG9pbnQoU3RyaW5nIGJpbmRpbmcsIE9iamVjdCBvYmopIHsKLSAgICAgICAgcmV0dXJuIG5ldyBFbmRwb2ludEltcGwob2JqKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU2VydmljZURlbGVnYXRlIGNyZWF0ZVNlcnZpY2VEZWxlZ2F0ZShVUkwgdXJsLCBRTmFtZSBxbmFtZSwgQ2xhc3MgY2xhenopIHsKLSAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNwaS5TZXJ2aWNlRGVsZWdhdGUodXJsLCBxbmFtZSwgY2xhenopOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBXM0NFbmRwb2ludFJlZmVyZW5jZSBjcmVhdGVXM0NFbmRwb2ludFJlZmVyZW5jZShTdHJpbmcgYWRkcmVzcywKLSAgICAgICAgICAgIFFOYW1lIHNlcnZpY2VOYW1lLAotICAgICAgICAgICAgUU5hbWUgcG9ydE5hbWUsCi0gICAgICAgICAgICBMaXN0PEVsZW1lbnQ+IG1ldGFkYXRhLAotICAgICAgICAgICAgU3RyaW5nIHdzZGxEb2N1bWVudExvY2F0aW9uLAotICAgICAgICAgICAgTGlzdDxFbGVtZW50PiByZWZlcmVuY2VQYXJhbWV0ZXJzKSB7Ci0gICAgICAgIFN0cmluZyBhZGRyZXNzaW5nTmFtZXNwYWNlID0KLSAgICAgICAgCUVuZHBvaW50UmVmZXJlbmNlVXRpbHMuZ2V0QWRkcmVzc2luZ05hbWVzcGFjZShXM0NFbmRwb2ludFJlZmVyZW5jZS5jbGFzcyk7ICAgIAkKLSAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlIGF4aXMyRVBSID0KLSAgICAgICAgCUVuZHBvaW50UmVmZXJlbmNlVXRpbHMuY3JlYXRlQXhpczJFbmRwb2ludFJlZmVyZW5jZShhZGRyZXNzLCBzZXJ2aWNlTmFtZSwgcG9ydE5hbWUsIHdzZGxEb2N1bWVudExvY2F0aW9uLCBhZGRyZXNzaW5nTmFtZXNwYWNlKTsKLSAgICAgICAgCi0gICAgICAgIFczQ0VuZHBvaW50UmVmZXJlbmNlIHczY0VQUiA9IG51bGw7Ci0gICAgICAgIAotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKG1ldGFkYXRhICE9IG51bGwpCi0gICAgICAgICAgICAgICAgRW5kcG9pbnRSZWZlcmVuY2VVdGlscy5hZGRNZXRhZGF0YShheGlzMkVQUiwgbWV0YWRhdGEudG9BcnJheShaRVJPX0xFTkdUSF9BUlJBWSkpOwotICAgICAgICAJCi0gICAgICAgICAgICBpZiAocmVmZXJlbmNlUGFyYW1ldGVycyAhPSBudWxsKQotICAgICAgICAgICAgICAgIEVuZHBvaW50UmVmZXJlbmNlVXRpbHMuYWRkUmVmZXJlbmNlUGFyYW1ldGVycyhheGlzMkVQUiwgcmVmZXJlbmNlUGFyYW1ldGVycy50b0FycmF5KFpFUk9fTEVOR1RIX0FSUkFZKSk7Ci0gICAgICAgIAkKLSAgICAgICAgICAgIHczY0VQUiA9Ci0gICAgICAgICAgICAgICAgKFczQ0VuZHBvaW50UmVmZXJlbmNlKSBFbmRwb2ludFJlZmVyZW5jZVV0aWxzLmNvbnZlcnRGcm9tQXhpczIoYXhpczJFUFIsIGFkZHJlc3NpbmdOYW1lc3BhY2UpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS4KLSAgICAgICAgICAgICAgbWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgicmVmZXJlbmNlUGFyYW1ldGVyQ29uc3RydWN0aW9uRXJyIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHczY0VQUjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgPFQ+IFQgZ2V0UG9ydChFbmRwb2ludFJlZmVyZW5jZSBqYXh3c0VQUiwgQ2xhc3M8VD4gc2VpLCBXZWJTZXJ2aWNlRmVhdHVyZS4uLiBmZWF0dXJlcykgewotICAgICAgICBpZiAoamF4d3NFUFIgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS4KLSAgICAgICAgICAgICAgICBtYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJkaXNwYXRjaE5vRW5kcG9pbnRSZWZlcmVuY2UyIikpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAoc2VpID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoImdldFBvcnRJbnZhbGlkU0VJIiwgamF4d3NFUFIudG9TdHJpbmcoKSwgIm51bGwiKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZSBheGlzMkVQUiA9Ci0gICAgICAgICAgICBFbmRwb2ludFJlZmVyZW5jZVV0aWxzLmNyZWF0ZUF4aXMyRW5kcG9pbnRSZWZlcmVuY2UoIiIpOwotICAgICAgICBTdHJpbmcgYWRkcmVzc2luZ05hbWVzcGFjZSA9IG51bGw7Ci0gICAgICAgIAotICAgICAgICB0cnkgewotICAgICAgICAgICAgYWRkcmVzc2luZ05hbWVzcGFjZSA9IEVuZHBvaW50UmVmZXJlbmNlVXRpbHMuY29udmVydFRvQXhpczIoYXhpczJFUFIsIGpheHdzRVBSKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkuCi0gICAgICAgICAgICAgIG1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoImludmFsaWRFbmRwb2ludFJlZmVyZW5jZSIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUudG9TdHJpbmcoKSkpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNwaS5TZXJ2aWNlRGVsZWdhdGUgc2VydmljZURlbGVnYXRlID0gbnVsbDsKLSAgICAgICAgCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTZXJ2aWNlTmFtZSBzZXJ2aWNlTmFtZSA9Ci0gICAgICAgICAgICAJRW5kcG9pbnRSZWZlcmVuY2VIZWxwZXIuZ2V0U2VydmljZU5hbWVNZXRhZGF0YShheGlzMkVQUiwgYWRkcmVzc2luZ05hbWVzcGFjZSk7Ci0gICAgICAgICAgICBXU0RMTG9jYXRpb24gd3NkbExvY2F0aW9uID0KLSAgICAgICAgICAgIAlFbmRwb2ludFJlZmVyZW5jZUhlbHBlci5nZXRXU0RMTG9jYXRpb25NZXRhZGF0YShheGlzMkVQUiwgYWRkcmVzc2luZ05hbWVzcGFjZSk7Ci0gICAgICAgICAgICBVUkwgd3NkbExvY2F0aW9uVVJMID0gbnVsbDsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKHdzZGxMb2NhdGlvbi5nZXRMb2NhdGlvbigpICE9IG51bGwpCi0gICAgICAgICAgICAJd3NkbExvY2F0aW9uVVJMID0gbmV3IFVSTCh3c2RsTG9jYXRpb24uZ2V0TG9jYXRpb24oKSk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAJd3NkbExvY2F0aW9uVVJMID0gbmV3IFVSTChheGlzMkVQUi5nZXRBZGRyZXNzKCkgKyAiP3dzZGwiKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgc2VydmljZURlbGVnYXRlID0KLSAgICAgICAgICAgIAluZXcgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zcGkuU2VydmljZURlbGVnYXRlKHdzZGxMb2NhdGlvblVSTCwgc2VydmljZU5hbWUuZ2V0TmFtZSgpLCBTZXJ2aWNlLmNsYXNzKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiZW5kcG9pbnRVcGRhdGVFcnJvciIpLCBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzZXJ2aWNlRGVsZWdhdGUuZ2V0UG9ydChheGlzMkVQUiwgYWRkcmVzc2luZ05hbWVzcGFjZSwgc2VpLCBmZWF0dXJlcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEVuZHBvaW50UmVmZXJlbmNlIHJlYWRFbmRwb2ludFJlZmVyZW5jZShTb3VyY2UgZXBySW5mb3NldCkgewotICAgICAgICBFbmRwb2ludFJlZmVyZW5jZSBqYXh3c0VQUiA9IG51bGw7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGpheHdzRVBSID0gRW5kcG9pbnRSZWZlcmVuY2VVdGlscy5jb252ZXJ0RnJvbVNvdXJjZShlcHJJbmZvc2V0KTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkuCi0gICAgICAgICAgICAgIG1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoImVuZHBvaW50UmVmQ3JlYXRpb25FcnJvciIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGpheHdzRVBSOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NwaS9TZXJ2aWNlRGVsZWdhdGUuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NwaS9TZXJ2aWNlRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWRlNDhkZC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zcGkvU2VydmljZURlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NzAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNwaTsKLQotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuUHJveHk7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcjsKLQotaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRGF0YVNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCQ29udGV4dDsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBNZXNzYWdlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC53cy5EaXNwYXRjaDsKLWltcG9ydCBqYXZheC54bWwud3MuRW5kcG9pbnRSZWZlcmVuY2U7Ci1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VGZWF0dXJlOwotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlLk1vZGU7Ci1pbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuSGFuZGxlclJlc29sdmVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5TZXJ2aWNlQ2xpZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLkV4Y2VwdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5hZGRyZXNzaW5nLnV0aWwuRW5kcG9pbnRSZWZlcmVuY2VVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNsaWVudC5Qcm9wZXJ0eU1pZ3JhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY2xpZW50LmRpc3BhdGNoLkpBWEJEaXNwYXRjaDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNsaWVudC5kaXNwYXRjaC5YTUxEaXNwYXRjaDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNsaWVudC5wcm94eS5KQVhXU1Byb3h5SGFuZGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkRlc2NyaXB0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkVuZHBvaW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5TZXJ2aWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5TZXJ2aWNlRGVzY3JpcHRpb25XU0RMOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5EZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5oYW5kbGVyLkhhbmRsZXJSZXNvbHZlckltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5pMThuLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MucmVnaXN0cnkuRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc3BpLm1pZ3JhdG9yLkFwcGxpY2F0aW9uQ29udGV4dE1pZ3JhdG9yVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnV0aWwuV1NETFdyYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51dGlsaXR5LkV4ZWN1dG9yRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotLyoqCi0gKiBUaGUgU2VydmljZURlbGVnYXRlIHNlcnZlcyBhcyB0aGUgYmFja2luZyBpbXBsZW1lbnRhdGlvbiBmb3IgYWxsIG9mIHRoZSBtZXRob2RzIGluIHRoZSB7QGxpbmsKLSAqIGphdmF4LnhtbC53cy5TZXJ2aWNlfSBBUEkuICBUaGlzIGlzIHRoZSBwbHVnIHBvaW50IGZvciB0aGUgY2xpZW50IGltcGxlbWVudGF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgU2VydmljZURlbGVnYXRlIGV4dGVuZHMgamF2YXgueG1sLndzLnNwaS5TZXJ2aWNlRGVsZWdhdGUgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhTZXJ2aWNlRGVsZWdhdGUuY2xhc3MpOwotICAgIHByaXZhdGUgc3RhdGljIFRocmVhZExvY2FsPERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZT4gc3BhcnNlU2VydmljZUNvbXBvc2l0ZVRocmVhZExvY2FsID0gbmV3IFRocmVhZExvY2FsPERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZT4oKTsKLSAgICBwcml2YXRlIHN0YXRpYyBUaHJlYWRMb2NhbDxEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGU+IHNwYXJzZVBvcnRDb21wb3NpdGVUaHJlYWRMb2NhbCA9IG5ldyBUaHJlYWRMb2NhbDxEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGU+KCk7Ci0gICAgCi0gICAgcHJpdmF0ZSBFeGVjdXRvciBleGVjdXRvcjsKLQotICAgIHByaXZhdGUgU2VydmljZURlc2NyaXB0aW9uIHNlcnZpY2VEZXNjcmlwdGlvbjsKLSAgICBwcml2YXRlIFFOYW1lIHNlcnZpY2VRbmFtZTsKLSAgICBwcml2YXRlIFNlcnZpY2VDbGllbnQgc2VydmljZUNsaWVudCA9IG51bGw7Ci0KLSAgICBwcml2YXRlIEhhbmRsZXJSZXNvbHZlciBoYW5kbGVyUmVzb2x2ZXIgPSBudWxsOwotICAgIAotICAgIC8qKgotICAgICAqIE5PTi1TVEFOREFSRCBTUEkhIFNldCBhbnkgbWV0YWRhdGEgdG8gYmUgdXNlZCBvbiB0aGUgY3JlYXRpb24gb2YgdGhlIE5FWFQgU2VydmljZSBieSB0aGlzIHRocmVhZC4KLSAgICAgKiBOT1RFIHRoYXQgdGhpcyB1c2VzIFRocmVhZExvY2FsIHRvIHN0b3JlIHRoZSBtZXRhZGF0YSwgYW5kIHRoYXQgVGhyZWFkTG9jYWwgaXMgY2xlYXJlZCBhZnRlciBpdCBpcwotICAgICAqIHVzZWQgdG8gY3JlYXRlIGEgU2VydmljZS4gIFRoYXQgbWVhbnM6Ci0gICAgICogMSkgVGhlIHRocmVhZCB0aGF0IHNldHMgdGhlIG1ldGFkYXRhIHRvIHVzZSBNVVNUIGJlIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVzIHRoZSBTZXJ2aWNlCi0gICAgICogMikgQ3JlYXRpb24gb2YgdGhlIFNlcnZpY2Ugc2hvdWxkIGJlIHRoZSB2ZXJ5IG5leHQgdGhpbmcgdGhlIHRocmVhZCBkb2VzCi0gICAgICogMykgVGhlIG1ldGFkYXRhIHdpbGwgYmUgc2V0IHRvIG51bGwgd2hlbiB0aGUgU2VydmljZSBpcyBjcmVhdGVkLCBzbyB0byBjcmVhdGUgYW5vdGhlciAKLSAgICAgKiAgICBzZXJ2aWNlIHdpdGggdGhlIHNhbWUgbWV0YWRhdGEsIGl0IHdpbGwgbmVlZCB0byBiZSBzZXQgYWdhaW4gcHJpb3IgdG8gY3JlYXRpbmcgdGhlCi0gICAgICogICAgc2VydmljZQotICAgICAqIDQpIFRoZSBtZXRhZGF0YSBjYW4gYmUgc2V0IHByaW9yIHRvIGNyZWF0aW5nIGJvdGggZ2VuZXJpYyBTZXJ2aWNlIGFuZCBnZW5lcmF0ZWQgU2VydmljZSAKLSAgICAgKiAgICBpbnN0YW5jZXMuICAgICAgCi0gICAgICogCi0gICAgICogVGhpcyBhbGxvd3MgY3JlYXRpbmcgYSBnZW5lcmljIFNlcnZpY2UgKGphdmF4LnhtbC53cy5TZXJ2aWNlKSBvciBhIGdlbmVyYXRlZCBTZXJ2aWNlCi0gICAgICogKHN1YmNsYXNzIG9mIGphdmF4LnhtbC53cy5TZXJ2aWNlKSBzcGVjaWZ5aW5nIGFkZGl0aW9uYWwgbWV0YWRhdGEgdmlhIGEKLSAgICAgKiBzcGFyc2UgY29tcG9zaXRlLiAgVGhpcyBjYW4gYmUgdXNlZCBieSBhIHJ1bnRpbWUgdG8gY3JlYXRlIGEgU2VydmljZSBmb3IgYSByZXF1ZXN0ZXIgdXNpbmcKLSAgICAgKiBhZGRpdGlvbmFsIG1ldGFkYXRhIHN1Y2ggYXMgbWlnaHQgY29tZSBmcm9tIGEgZGVwbG95bWVudCBkZXNjcmlwdG9yIG9yIGZyb20gcmVzb3VyY2UKLSAgICAgKiBpbmplY3Rpb24gcHJvY2Vzc2luZyBvZiBAUmVzb3VyY2Ugb3IgQFdlYlNlcnZpY2VSZWYocykgYW5ub3RhdGlvbnMuICBBZGRpdGlvbmFsIG1ldGFkYXRhCi0gICAgICogbWF5IGluY2x1ZGUgdGhpbmdzIGxpa2UgQFdlYlNlcnZpY2VDbGllbnQud3NkbExvY2F0aW9uIG9yIGEgQEhhbmRsZXJDaGFpbiBzcGVjaWZpY2F0aW9uLgotICAgICAqIAotICAgICAqICAgIEBzZWUgamF2YXgueG1sLndzLlNlcnZpY2UjY3JlYXRlKFFOYW1lKQotICAgICAqICAgIEBzZWUgamF2YXgueG1sLndzLlNlcnZpY2UjY3JlYXRlKFVSTCwgUU5hbWUpCi0gICAgICogCi0gICAgICogQHBhcmFtIGNvbXBvc2l0ZSBBZGRpdGlvbmFsIG1ldGFkYXRhIChpZiBhbnkpIHRvIGJlIHVzZWQgaW4gY3JlYXRpb24gb2YgdGhlIHNlcnZpY2UKLSAgICAgKi8KLSAgICBzdGF0aWMgcHVibGljIHZvaWQgc2V0U2VydmljZU1ldGFkYXRhKERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLSAgICAgICAgc3BhcnNlU2VydmljZUNvbXBvc2l0ZVRocmVhZExvY2FsLnNldChjb21wb3NpdGUpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBOT04tU1RBTkRBUkQgU1BJISBSZXR1cm5zIHRoZSBjb21wb3NpdGUgdGhhdCB3aWxsIGJlIHVzZWQgb24gdGhlIGNyZWF0aW9uIG9mIHRoZSBuZXh0IAotICAgICAqIFNlcnZpY2UgYnkgdGhpcyB0aHJlYWQuCi0gICAgICogCi0gICAgICogQHNlZSAjc2V0U2VydmljZU1ldGFkYXRhKERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSkKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGNvbXBvc2l0ZSB0aGF0IHdpbGwgYmUgdXNlZCBvbiB0aGUgY3JlYXRpb24gb2YgdGhlIG5leHQgU2VydmljZSBieSB0aGlzIHRocmVhZCwgb3IgbnVsbAotICAgICAqICAgICAgICAgaWYgbm8gY29tcG9zaXRlIGlzIHRvIGJlIHVzZWQuCi0gICAgICovCi0gICAgc3RhdGljIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBnZXRTZXJ2aWNlTWV0YWRhdGEoKSB7Ci0gICAgICAgIHJldHVybiBzcGFyc2VTZXJ2aWNlQ29tcG9zaXRlVGhyZWFkTG9jYWwuZ2V0KCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJlbW92ZSBhbnkgY29tcG9zaXRlIHNvIHRoYXQgY3JlYXRpb24gb2YgdGhlIG5leHQgU2VydmljZSBieSB0aGlzIHRocmVhZCB3aWxsIE5PVCBiZSAKLSAgICAgKiBhZmZlY3RlZCBieSBhbnkgYWRkaXRpb25hbCBtZXRhZGF0YS4KLSAgICAgKiAKLSAgICAgKiBAc2VlICNzZXRTZXJ2aWNlTWV0YWRhdGEoRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKQotICAgICAqIAotICAgICAqLwotICAgIHN0YXRpYyB2b2lkIHJlc2V0U2VydmljZU1ldGFkYXRhKCkgewotICAgICAgICBzcGFyc2VTZXJ2aWNlQ29tcG9zaXRlVGhyZWFkTG9jYWwuc2V0KG51bGwpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBOT04tU1RBTkRBUkQgU1BJISBTZXQgYW55IG1ldGFkYXRhIHRvIGJlIHVzZWQgb24gdGhlIGNyZWF0aW9uIG9mIHRoZSBORVhUIFBvcnQgYnkgdGhpcyB0aHJlYWQuCi0gICAgICogTk9URSB0aGF0IHRoaXMgdXNlcyBUaHJlYWRMb2NhbCB0byBzdG9yZSB0aGUgbWV0YWRhdGEsIGFuZCB0aGF0IFRocmVhZExvY2FsIGlzIGNsZWFyZWQgYWZ0ZXIgaXQgaXMKLSAgICAgKiB1c2VkIHRvIGNyZWF0ZSBhIFBvcnQuICBUaGF0IG1lYW5zOgotICAgICAqIDEpIFRoZSB0aHJlYWQgdGhhdCBzZXRzIHRoZSBtZXRhZGF0YSB0byB1c2UgTVVTVCBiZSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlcyB0aGUgUG9ydAotICAgICAqIDIpIENyZWF0aW9uIG9mIHRoZSBQb3J0IHNob3VsZCBiZSB0aGUgdmVyeSBuZXh0IHRoaW5nIHRoZSB0aHJlYWQgZG9lcwotICAgICAqIDMpIFRoZSBtZXRhZGF0YSB3aWxsIGJlIHNldCB0byBudWxsIHdoZW4gdGhlIFBvcnQgaXMgY3JlYXRlZCwgc28gdG8gY3JlYXRlIGFub3RoZXIgCi0gICAgICogICAgUG9ydCB3aXRoIHRoZSBzYW1lIG1ldGFkYXRhLCBpdCB3aWxsIG5lZWQgdG8gYmUgc2V0IGFnYWluIHByaW9yIHRvIGNyZWF0aW5nIHRoZQotICAgICAqICAgIFBvcnQKLSAgICAgKiA0KSBUaGUgbWV0YWRhdGEgY2FuIGJlIHNldCBwcmlvciB0byBjcmVhdGluZyBQb3J0IHdoaWNoIHNwZWNpZmllcyBhIFFOYW1lIHZpYSAKLSAgICAgKiAgICBTZXJ2aWNlLmdldFBvcnQoUU5hbWUsIENsYXNzKSBvciBvbmUgdGhhdCBvbmx5IHNwZWNpZmllcyB0aGUgU0VJIGNsYXNzIHZpYSAKLSAgICAgKiAgICBTZXJ2aWNlLmdldFBvcnQoQ2xhc3MpCi0gICAgICogNSkgTWV0YWRhdGEgY2FuIG5vdCBiZSBzcGVjaWZpZWQgZm9yIGR5bmFtaWMgcG9ydHMsIGkuZS4gdGhvc2UgYWRkZWQgdmlhIAotICAgICAqICAgIFNlcnZpY2UuYWRkUG9ydCguLi4pLgotICAgICAqIDYpIE1ldGFkYXRhIGNhbiBub3QgYmUgc3BlY2ZpZWQgd2hlbiBjcmVhdGluZyBhIGRpc3BhdGNoIGNsaWVudCwgaS5lLiB2aWEgCi0gICAgICogICAgU2VydmljZS5jcmVhdGVEaXNwYXRjaCguLi4pCi0gICAgICogNykgVGhlIFNlcnZpY2UgdXNlZCB0byBjcmVhdGUgdGhlIHBvcnQgY2FuIGJlIHRoZSBnZW5lcmljIHNlcnZpY2Ugb3IgYSBnZW5lcmF0ZWQgCi0gICAgICogICAgc2VydmljZS4gICAgICAKLSAgICAgKiAKLSAgICAgKiBUaGlzIGFsbG93cyBjcmVhdGluZyBQb3J0IHNwZWNpZnlpbmcgYWRkaXRpb25hbCBtZXRhZGF0YSB2aWEgYSBzcGFyc2UgY29tcG9zaXRlLiAgCi0gICAgICogVGhpcyBjYW4gYmUgdXNlZCBieSBhIHJ1bnRpbWUgdG8gY3JlYXRlIGEgUG9ydCBmb3IgYSByZXF1ZXN0ZXIgdXNpbmcKLSAgICAgKiBhZGRpdGlvbmFsIG1ldGFkYXRhIHN1Y2ggYXMgbWlnaHQgY29tZSBmcm9tIGEgZGVwbG95bWVudCBkZXNjcmlwdG9yIG9yIGZyb20gcmVzb3VyY2UKLSAgICAgKiBpbmplY3Rpb24gcHJvY2Vzc2luZy4gIEFkZGl0aW9uYWwgbWV0YWRhdGEgbWlnaHQgaW5jbHVkZSB0aGluZ3MgbGlrZSAKLSAgICAgKiBhIEBIYW5kbGVyQ2hhaW4gc3BlY2lmaWNhdGlvbi4KLSAgICAgKiAKLSAgICAgKiAgICBAc2VlIGphdmF4LnhtbC53cy5TZXJ2aWNlI2dldFBvcnQoQ2xhc3MpCi0gICAgICogICAgQHNlZSBqYXZheC54bWwud3MuU2VydmljZSNnZXRQb3J0KFFOYW1lLCBDbGFzcykKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29tcG9zaXRlIEFkZGl0aW9uYWwgbWV0YWRhdGEgKGlmIGFueSkgdG8gYmUgdXNlZCBpbiBjcmVhdGlvbiBvZiB0aGUgcG9ydAotICAgICAqLwotICAgIHN0YXRpYyBwdWJsaWMgdm9pZCBzZXRQb3J0TWV0YWRhdGEoRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotICAgICAgICBzcGFyc2VQb3J0Q29tcG9zaXRlVGhyZWFkTG9jYWwuc2V0KGNvbXBvc2l0ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTk9OLVNUQU5EQVJEIFNQSSEgUmV0dXJucyB0aGUgY29tcG9zaXRlIHRoYXQgd2lsbCBiZSB1c2VkIG9uIHRoZSBjcmVhdGlvbiBvZiB0aGUgbmV4dCAKLSAgICAgKiBQb3J0IGJ5IHRoaXMgdGhyZWFkLgotICAgICAqIAotICAgICAqIEBzZWUgI3NldFBvcnRNZXRhZGF0YShEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUpCi0gICAgICogCi0gICAgICogQHJldHVybiBjb21wb3NpdGUgdGhhdCB3aWxsIGJlIHVzZWQgb24gdGhlIGNyZWF0aW9uIG9mIHRoZSBuZXh0IFBvcnQgYnkgdGhpcyB0aHJlYWQsIG9yIG51bGwKLSAgICAgKiAgICAgICAgIGlmIG5vIGNvbXBvc2l0ZSBpcyB0byBiZSB1c2VkLgotICAgICAqLwotICAgIHN0YXRpYyBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgZ2V0UG9ydE1ldGFkYXRhKCkgewotICAgICAgICByZXR1cm4gc3BhcnNlUG9ydENvbXBvc2l0ZVRocmVhZExvY2FsLmdldCgpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZW1vdmUgYW55IGNvbXBvc2l0ZSBzbyB0aGF0IGNyZWF0aW9uIG9mIHRoZSBuZXh0IFBvcnQgYnkgdGhpcyB0aHJlYWQgd2lsbCBOT1QgYmUgCi0gICAgICogYWZmZWN0ZWQgYnkgYW55IGFkZGl0aW9uYWwgbWV0YWRhdGEuCi0gICAgICogCi0gICAgICogQHNlZSAjc2V0UG9ydE1ldGFkYXRhKERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSkKLSAgICAgKiAKLSAgICAgKi8KLSAgICBzdGF0aWMgdm9pZCByZXNldFBvcnRNZXRhZGF0YSgpIHsKLSAgICAgICBzcGFyc2VQb3J0Q29tcG9zaXRlVGhyZWFkTG9jYWwuc2V0KG51bGwpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU2VydmljZURlbGVnYXRlKFVSTCB1cmwsIFFOYW1lIHFuYW1lLCBDbGFzcyBjbGF6eikgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICBzdXBlcigpOwotICAgICAgICB0aGlzLnNlcnZpY2VRbmFtZSA9IHFuYW1lOwotCi0gICAgICAgIGlmICghaXNWYWxpZFNlcnZpY2VOYW1lKCkpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkKLSAgICAgICAgICAgICAgICAgICAgLm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoInNlcnZpY2VEZWxlZ2F0ZUNvbnN0cnVjdDAiLCAiIikpOwotICAgICAgICB9Ci0gICAgICAgIC8vIEdldCBhbnkgbWV0YWRhdGEgdGhhdCBpcyB0byBiZSB1c2VkIHRvIGJ1aWxkIHVwIHRoaXMgc2VydmljZSwgdGhlbiByZXNldCBpdCBzbyBpdCBpc24ndCB1c2VkCi0gICAgICAgIC8vIHRvIGNyZWF0ZSBhbnkgb3RoZXIgc2VydmljZXMuCi0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBzcGFyc2VDb21wb3NpdGUgPSBnZXRTZXJ2aWNlTWV0YWRhdGEoKTsKLSAgICAgICAgcmVzZXRTZXJ2aWNlTWV0YWRhdGEoKTsKLSAgICAgICAgaWYgKHNwYXJzZUNvbXBvc2l0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzZXJ2aWNlRGVzY3JpcHRpb24gPSBEZXNjcmlwdGlvbkZhY3RvcnkuY3JlYXRlU2VydmljZURlc2NyaXB0aW9uKHVybCwgc2VydmljZVFuYW1lLCBjbGF6eiwgc3BhcnNlQ29tcG9zaXRlLCB0aGlzKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNlcnZpY2VEZXNjcmlwdGlvbiA9IERlc2NyaXB0aW9uRmFjdG9yeS5jcmVhdGVTZXJ2aWNlRGVzY3JpcHRpb24odXJsLCBzZXJ2aWNlUW5hbWUsIGNsYXp6KTsKLSAgICAgICAgfQotICAgICAgICAvLyBUT0RPOiBUaGlzIGNoZWNrIHNob3VsZCBiZSBkb25lIHdoZW4gdGhlIFNlcnZpY2UgRGVzY3JpcHRpb24gaXMgY3JlYXRlZCBhYm92ZTsgdGhhdCBzaG91bGQgdGhyb3cgdGhpcyBleGNlcHRpb24uCi0gICAgICAgIC8vIFRoYXQgaXMgYmVjYXVzZSB3ZSAoZm9sbG93aW5nIHRoZSBiZWhhdmlvciBvZiB0aGUgUkkpIHJlcXVpcmUgdGhlIFdTREwgYmUgZnVsbHkgc3BlY2lmaWVkIChub3QgcGFydGlhbCkgb24gdGhlIGNsaWVudAotICAgICAgICBpZiAoaXNWYWxpZFdTRExMb2NhdGlvbigpKSB7Ci0gICAgICAgICAgICBpZiAoIWlzU2VydmljZURlZmluZWQoc2VydmljZVFuYW1lKSkgewotICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJzZXJ2aWNlRGVsZWdhdGVDb25zdHJ1Y3QwIiwgc2VydmljZVFuYW1lLnRvU3RyaW5nKCksIHVybC50b1N0cmluZygpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vVE9ETzogSXMgdGhpcyB0aGUgYmVzdCBwbGFjZSBmb3IgdGhpcyBjb2RlPwotICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBjb250ZXh0ID0gc2VydmljZURlc2NyaXB0aW9uLmdldEF4aXNDb25maWdDb250ZXh0KCk7Ci0KLSAgICAgICAgLy8gUmVnaXN0ZXIgdGhlIG5lY2Vzc2FyeSBBcHBsaWNhdGlvbkNvbnRleHRNaWdyYXRvcnMKLSAgICAgICAgQXBwbGljYXRpb25Db250ZXh0TWlncmF0b3JVdGlsLmFkZEFwcGxpY2F0aW9uQ29udGV4dE1pZ3JhdG9yKGNvbnRleHQsCi0gICAgICAgICAgICAgICAgQ29uc3RhbnRzLkFQUExJQ0FUSU9OX0NPTlRFWFRfTUlHUkFUT1JfTElTVF9JRCwgbmV3IFByb3BlcnR5TWlncmF0b3IoKSk7Ci0gICAgfQotCi0gICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAvLyBKQVgtV1MgQVBJIG1ldGhvZHMKLSAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gICAgLyoKLSAgICAqIChub24tSmF2YWRvYykKLSAgICAqIEBzZWUgamF2YXgueG1sLndzLnNwaS5TZXJ2aWNlRGVsZWdhdGUjYWRkUG9ydChqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotICAgICovCi0gICAgLy8gQ3JlYXRlcyBhIERJU1BBVENIIE9OTFkgcG9ydC4gIFBlciBKQVhXUyBTZWMgNC4xIGphdmF4LnhtLi53cy5TZXJ2aWNlLCBwLiA0OSwgcG9ydHMgYWRkZWQgdmlhIGFkZFBvcnQgbWV0aG9kCi0gICAgLy8gYXJlIG9ubHkgc3VpdGliYWxlIGZvciBjcmVhdGluZyBEaXN0cGFjaCBpbnN0YW5jZXMuCi0gICAgcHVibGljIHZvaWQgYWRkUG9ydChRTmFtZSBwb3J0TmFtZSwgU3RyaW5nIGJpbmRpbmdJZCwgU3RyaW5nIGVuZHBvaW50QWRkcmVzcykKLSAgICAgICAgICAgIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgdmVyaWZ5U2VydmljZURlc2NyaXB0aW9uQWN0aXZlKCk7Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJDYWxsaW5nIGFkZFBvcnQgOiAoIgotICAgICAgICAgICAgICAgICAgICAgICsgcG9ydE5hbWUgKyAiLCIgKyBiaW5kaW5nSWQgKyAiLCIgKyBlbmRwb2ludEFkZHJlc3MgKyAiKSIpOwotICAgICAgICB9Ci0gICAgCWlmKGVuZHBvaW50QWRkcmVzcyE9bnVsbCAmJiBlbmRwb2ludEFkZHJlc3MudHJpbSgpLmxlbmd0aCgpPT0wKXsKLSAgICAJCUV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiYWRkUG9ydEVycjEiLCAocG9ydE5hbWUhPW51bGwpP3BvcnROYW1lLmdldExvY2FsUGFydCgpOiIiLCBlbmRwb2ludEFkZHJlc3MpKTsKLSAgICAJfQotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVuZHBvaW50RGVzYyA9Ci0gICAgICAgICAgICAgICAgRGVzY3JpcHRpb25GYWN0b3J5LnVwZGF0ZUVuZHBvaW50KHNlcnZpY2VEZXNjcmlwdGlvbiwgbnVsbCwgcG9ydE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uRmFjdG9yeS5VcGRhdGVUeXBlLkFERF9QT1JULCB0aGlzLCBiaW5kaW5nSWQsIGVuZHBvaW50QWRkcmVzcyk7Ci0gICAgICAgIC8vIFRPRE86IE5lZWQgdG8gc2V0IGVuZHBvaW50QWRkcmVzcyBhbmQgc2V0IG9yIGNoZWNrIGJpbmRpbmdJZCBvbiB0aGUgRW5kcG9pbnREZXNjCi0gICAgICAgIGVuZHBvaW50RGVzYy5zZXRFbmRwb2ludEFkZHJlc3MoZW5kcG9pbnRBZGRyZXNzKTsKLSAgICAgICAgZW5kcG9pbnREZXNjLnNldENsaWVudEJpbmRpbmdJRChiaW5kaW5nSWQpOwotICAgIH0KLQotICAgIC8qCi0gICAgKiAobm9uLUphdmFkb2MpCi0gICAgKiBAc2VlIGphdmF4LnhtbC53cy5zcGkuU2VydmljZURlbGVnYXRlI2NyZWF0ZURpc3BhdGNoKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUsIGphdmEubGFuZy5DbGFzcywgamF2YXgueG1sLndzLlNlcnZpY2UuTW9kZSkKLSAgICAqLwotICAgIHB1YmxpYyA8VD4gRGlzcGF0Y2g8VD4gY3JlYXRlRGlzcGF0Y2goUU5hbWUgcG9ydE5hbWUsIENsYXNzPFQ+IHR5cGUsIE1vZGUgbW9kZSkKLSAgICAgICAgICAgIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZURpc3BhdGNoKHBvcnROYW1lLCB0eXBlLCBtb2RlLCAoV2ViU2VydmljZUZlYXR1cmVbXSkgbnVsbCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAqIChub24tSmF2YWRvYykKLSAgICAqIEBzZWUgamF2YXgueG1sLndzLnNwaS5TZXJ2aWNlRGVsZWdhdGUjY3JlYXRlRGlzcGF0Y2goamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSwgamF2YXgueG1sLmJpbmQuSkFYQkNvbnRleHQsIGphdmF4LnhtbC53cy5TZXJ2aWNlLk1vZGUpCi0gICAgKi8KLSAgICBwdWJsaWMgRGlzcGF0Y2g8amF2YS5sYW5nLk9iamVjdD4gY3JlYXRlRGlzcGF0Y2goUU5hbWUgcG9ydE5hbWUsIEpBWEJDb250ZXh0IGNvbnRleHQsIE1vZGUgbW9kZSkgewotICAgICAgICByZXR1cm4gY3JlYXRlRGlzcGF0Y2gocG9ydE5hbWUsIGNvbnRleHQsIG1vZGUsIChXZWJTZXJ2aWNlRmVhdHVyZVtdKSBudWxsKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgPFQ+IERpc3BhdGNoPFQ+IGNyZWF0ZURpc3BhdGNoKEVuZHBvaW50UmVmZXJlbmNlIGpheHdzRVBSLCBDbGFzczxUPiB0eXBlLCBNb2RlIG1vZGUsIFdlYlNlcnZpY2VGZWF0dXJlLi4uIGZlYXR1cmVzKSB7Ci0gICAgICAgIHZlcmlmeVNlcnZpY2VEZXNjcmlwdGlvbkFjdGl2ZSgpOwotICAgICAgICBpZiAoamF4d3NFUFIgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeQotICAgICAgICAgICAgICAgICAgICAubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiZGlzcGF0Y2hOb0VuZHBvaW50UmVmZXJlbmNlIikpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAoIWlzVmFsaWREaXNwYXRjaFR5cGUodHlwZSkpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkKLSAgICAgICAgICAgICAgICAgICAgLm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoImRpc3BhdGNoSW52YWxpZFR5cGUiKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmICghaXNWYWxpZERpc3BhdGNoVHlwZVdpdGhNb2RlKHR5cGUsIG1vZGUpKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Ci0gICAgICAgICAgICAgICAgICAgIC5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJkaXNwYXRjaEludmFsaWRUeXBlV2l0aE1vZGUiKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZSBheGlzMkVQUiA9Ci0gICAgICAgICAgICBFbmRwb2ludFJlZmVyZW5jZVV0aWxzLmNyZWF0ZUF4aXMyRW5kcG9pbnRSZWZlcmVuY2UoIiIpOwotICAgICAgICBTdHJpbmcgYWRkcmVzc2luZ05hbWVzcGFjZSA9IG51bGw7Ci0gICAgICAgIAotICAgICAgICB0cnkgewotICAgICAgICAgICAgYWRkcmVzc2luZ05hbWVzcGFjZSA9IEVuZHBvaW50UmVmZXJlbmNlVXRpbHMuY29udmVydFRvQXhpczIoYXhpczJFUFIsIGpheHdzRVBSKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkuCi0gICAgICAgICAgICAgICBtYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJpbnZhbGlkRW5kcG9pbnRSZWZlcmVuY2UiLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS50b1N0cmluZygpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZW5kcG9pbnREZXNjID0KLSAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkZhY3RvcnkudXBkYXRlRW5kcG9pbnQoc2VydmljZURlc2NyaXB0aW9uLCBudWxsLCBheGlzMkVQUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzc2luZ05hbWVzcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb25GYWN0b3J5LlVwZGF0ZVR5cGUuQ1JFQVRFX0RJU1BBVENILAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzKTsKLSAgICAgICAgaWYgKGVuZHBvaW50RGVzYyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoImVuZHBvaW50RGVzY3JpcHRpb25Db25zdHJ1Y3Rpb25GYWlsdXJlIiwgCi0gICAgICAgICAgICAgICAgICAgIGpheHdzRVBSLnRvU3RyaW5nKCkpKTsgCi0gICAgICAgIH0KLQotICAgICAgICBYTUxEaXNwYXRjaDxUPiBkaXNwYXRjaCA9IG5ldyBYTUxEaXNwYXRjaDxUPih0aGlzLCBlbmRwb2ludERlc2MsIGF4aXMyRVBSLCBhZGRyZXNzaW5nTmFtZXNwYWNlLCBmZWF0dXJlcyk7Ci0KLSAgICAgICAgaWYgKG1vZGUgIT0gbnVsbCkgewotICAgICAgICAgICAgZGlzcGF0Y2guc2V0TW9kZShtb2RlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGRpc3BhdGNoLnNldE1vZGUoU2VydmljZS5Nb2RlLlBBWUxPQUQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNlcnZpY2VDbGllbnQgPT0gbnVsbCkKLSAgICAgICAgICAgIHNlcnZpY2VDbGllbnQgPSBnZXRTZXJ2aWNlQ2xpZW50KGVuZHBvaW50RGVzYy5nZXRQb3J0UU5hbWUoKSk7Ci0KLSAgICAgICAgZGlzcGF0Y2guc2V0U2VydmljZUNsaWVudChzZXJ2aWNlQ2xpZW50KTsKLSAgICAgICAgZGlzcGF0Y2guc2V0VHlwZSh0eXBlKTsKLSAgICAgICAgcmV0dXJuIGRpc3BhdGNoOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBEaXNwYXRjaDxPYmplY3Q+IGNyZWF0ZURpc3BhdGNoKEVuZHBvaW50UmVmZXJlbmNlIGpheHdzRVBSLCBKQVhCQ29udGV4dCBjb250ZXh0LCBNb2RlIG1vZGUsIFdlYlNlcnZpY2VGZWF0dXJlLi4uIGZlYXR1cmVzKSB7Ci0gICAgICAgIHZlcmlmeVNlcnZpY2VEZXNjcmlwdGlvbkFjdGl2ZSgpOwotICAgICAgICBpZiAoamF4d3NFUFIgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeQotICAgICAgICAgICAgICAgICAgICAubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiZGlzcGF0Y2hOb0VuZHBvaW50UmVmZXJlbmNlIikpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2UgYXhpczJFUFIgPQotICAgICAgICAgICAgRW5kcG9pbnRSZWZlcmVuY2VVdGlscy5jcmVhdGVBeGlzMkVuZHBvaW50UmVmZXJlbmNlKCIiKTsKLSAgICAgICAgU3RyaW5nIGFkZHJlc3NpbmdOYW1lc3BhY2UgPSBudWxsOwotICAgICAgICAKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFkZHJlc3NpbmdOYW1lc3BhY2UgPSBFbmRwb2ludFJlZmVyZW5jZVV0aWxzLmNvbnZlcnRUb0F4aXMyKGF4aXMyRVBSLCBqYXh3c0VQUik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5LgotICAgICAgICAgICAgICAgIG1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoImludmFsaWRFbmRwb2ludFJlZmVyZW5jZSIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS50b1N0cmluZygpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZW5kcG9pbnREZXNjID0KLSAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkZhY3RvcnkudXBkYXRlRW5kcG9pbnQoc2VydmljZURlc2NyaXB0aW9uLCBudWxsLCBheGlzMkVQUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzc2luZ05hbWVzcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb25GYWN0b3J5LlVwZGF0ZVR5cGUuQ1JFQVRFX0RJU1BBVENILAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzKTsKLSAgICAgICAgaWYgKGVuZHBvaW50RGVzYyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5LgotICAgICAgICAgICAgICBtYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJlbmRwb2ludERlc2NyaXB0aW9uQ29uc3RydWN0aW9uRmFpbHVyZSIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXh3c0VQUi50b1N0cmluZygpKSk7IAotICAgICAgICB9Ci0KLSAgICAgICAgSkFYQkRpc3BhdGNoPE9iamVjdD4gZGlzcGF0Y2ggPSBuZXcgSkFYQkRpc3BhdGNoKHRoaXMsIGVuZHBvaW50RGVzYywgYXhpczJFUFIsIGFkZHJlc3NpbmdOYW1lc3BhY2UsIGZlYXR1cmVzKTsKLQotICAgICAgICBpZiAobW9kZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBkaXNwYXRjaC5zZXRNb2RlKG1vZGUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZGlzcGF0Y2guc2V0TW9kZShTZXJ2aWNlLk1vZGUuUEFZTE9BRCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc2VydmljZUNsaWVudCA9PSBudWxsKQotICAgICAgICAgICAgc2VydmljZUNsaWVudCA9IGdldFNlcnZpY2VDbGllbnQoZW5kcG9pbnREZXNjLmdldFBvcnRRTmFtZSgpKTsKLQotICAgICAgICBkaXNwYXRjaC5zZXRKQVhCQ29udGV4dChjb250ZXh0KTsKLSAgICAgICAgZGlzcGF0Y2guc2V0U2VydmljZUNsaWVudChzZXJ2aWNlQ2xpZW50KTsKLQotICAgICAgICByZXR1cm4gZGlzcGF0Y2g7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIDxUPiBEaXNwYXRjaDxUPiBjcmVhdGVEaXNwYXRjaChRTmFtZSBwb3J0TmFtZSwgQ2xhc3M8VD4gdHlwZSwgTW9kZSBtb2RlLCBXZWJTZXJ2aWNlRmVhdHVyZS4uLiBmZWF0dXJlcykgewotICAgICAgICB2ZXJpZnlTZXJ2aWNlRGVzY3JpcHRpb25BY3RpdmUoKTsKLSAgICAgICAgaWYgKHBvcnROYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkKLSAgICAgICAgICAgICAgICAgICAgLm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoImNyZWF0ZURpc3BhdGNoRmFpbDAiKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmICghaXNWYWxpZERpc3BhdGNoVHlwZSh0eXBlKSkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeQotICAgICAgICAgICAgICAgICAgICAubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiZGlzcGF0Y2hJbnZhbGlkVHlwZSIpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghaXNWYWxpZERpc3BhdGNoVHlwZVdpdGhNb2RlKHR5cGUsIG1vZGUpKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Ci0gICAgICAgICAgICAgICAgICAgIC5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJkaXNwYXRjaEludmFsaWRUeXBlV2l0aE1vZGUiKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVuZHBvaW50RGVzYyA9Ci0gICAgICAgICAgICAgICAgRGVzY3JpcHRpb25GYWN0b3J5LnVwZGF0ZUVuZHBvaW50KHNlcnZpY2VEZXNjcmlwdGlvbiwgCi0gICAgICAgICAgICAgICAgCQkJCQkJCQkgIG51bGwsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb25GYWN0b3J5LlVwZGF0ZVR5cGUuQ1JFQVRFX0RJU1BBVENILAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzKTsKLQotICAgICAgICBpZiAoZW5kcG9pbnREZXNjID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoImNyZWF0ZURpc3BhdGNoRmFpbDIiLCBwb3J0TmFtZS50b1N0cmluZygpKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBYTUxEaXNwYXRjaDxUPiBkaXNwYXRjaCA9IG5ldyBYTUxEaXNwYXRjaDxUPih0aGlzLCBlbmRwb2ludERlc2MsIGZlYXR1cmVzKTsKLQotICAgICAgICBpZiAobW9kZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBkaXNwYXRjaC5zZXRNb2RlKG1vZGUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZGlzcGF0Y2guc2V0TW9kZShTZXJ2aWNlLk1vZGUuUEFZTE9BRCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc2VydmljZUNsaWVudCA9PSBudWxsKQotICAgICAgICAgICAgc2VydmljZUNsaWVudCA9IGdldFNlcnZpY2VDbGllbnQocG9ydE5hbWUpOwotCi0gICAgICAgIGRpc3BhdGNoLnNldFNlcnZpY2VDbGllbnQoc2VydmljZUNsaWVudCk7Ci0gICAgICAgIGRpc3BhdGNoLnNldFR5cGUodHlwZSk7Ci0gICAgICAgIHJldHVybiBkaXNwYXRjaDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgRGlzcGF0Y2g8T2JqZWN0PiBjcmVhdGVEaXNwYXRjaChRTmFtZSBwb3J0TmFtZSwgSkFYQkNvbnRleHQgY29udGV4dCwgTW9kZSBtb2RlLCBXZWJTZXJ2aWNlRmVhdHVyZS4uLiBmZWF0dXJlcykgewotICAgICAgICB2ZXJpZnlTZXJ2aWNlRGVzY3JpcHRpb25BY3RpdmUoKTsKLSAgICAgICAgaWYgKHBvcnROYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkKLSAgICAgICAgICAgICAgICAgICAgLm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoImNyZWF0ZURpc3BhdGNoRmFpbDAiKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVuZHBvaW50RGVzYyA9Ci0gICAgICAgICAgICAgICAgRGVzY3JpcHRpb25GYWN0b3J5LnVwZGF0ZUVuZHBvaW50KHNlcnZpY2VEZXNjcmlwdGlvbiwgCi0gICAgICAgICAgICAgICAgCQkJCQkJCQkgIG51bGwsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb25GYWN0b3J5LlVwZGF0ZVR5cGUuQ1JFQVRFX0RJU1BBVENILAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzKTsKLQotICAgICAgICBpZiAoZW5kcG9pbnREZXNjID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoImNyZWF0ZURpc3BhdGNoRmFpbDIiLCBwb3J0TmFtZS50b1N0cmluZygpKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBKQVhCRGlzcGF0Y2g8T2JqZWN0PiBkaXNwYXRjaCA9IG5ldyBKQVhCRGlzcGF0Y2godGhpcywgZW5kcG9pbnREZXNjLCBmZWF0dXJlcyk7Ci0KLSAgICAgICAgaWYgKG1vZGUgIT0gbnVsbCkgewotICAgICAgICAgICAgZGlzcGF0Y2guc2V0TW9kZShtb2RlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGRpc3BhdGNoLnNldE1vZGUoU2VydmljZS5Nb2RlLlBBWUxPQUQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNlcnZpY2VDbGllbnQgPT0gbnVsbCkKLSAgICAgICAgICAgIHNlcnZpY2VDbGllbnQgPSBnZXRTZXJ2aWNlQ2xpZW50KHBvcnROYW1lKTsKLQotICAgICAgICBkaXNwYXRjaC5zZXRKQVhCQ29udGV4dChjb250ZXh0KTsKLSAgICAgICAgZGlzcGF0Y2guc2V0U2VydmljZUNsaWVudChzZXJ2aWNlQ2xpZW50KTsKLQotICAgICAgICByZXR1cm4gZGlzcGF0Y2g7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBqYXZheC54bWwud3Muc3BpLlNlcnZpY2VEZWxlZ2F0ZSNnZXRQb3J0KGphdmEubGFuZy5DbGFzcykKLSAgICAgKi8KLSAgICBwdWJsaWMgPFQ+IFQgZ2V0UG9ydChDbGFzczxUPiBzZWkpIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGdldFBvcnQoKFFOYW1lKSBudWxsLCBzZWksIChXZWJTZXJ2aWNlRmVhdHVyZVtdKSBudWxsKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICogKG5vbi1KYXZhZG9jKQotICAgICogQHNlZSBqYXZheC54bWwud3Muc3BpLlNlcnZpY2VEZWxlZ2F0ZSNnZXRQb3J0KGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUsIGphdmEubGFuZy5DbGFzcykKLSAgICAqLwotICAgIHB1YmxpYyA8VD4gVCBnZXRQb3J0KFFOYW1lIHBvcnROYW1lLCBDbGFzczxUPiBzZWkpIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGdldFBvcnQocG9ydE5hbWUsIHNlaSwgKFdlYlNlcnZpY2VGZWF0dXJlW10pIG51bGwpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyA8VD4gVCBnZXRQb3J0KENsYXNzPFQ+IHNlaSwgV2ViU2VydmljZUZlYXR1cmUuLi4gZmVhdHVyZXMpIHsKLSAgICAgICAgcmV0dXJuIGdldFBvcnQoKFFOYW1lKSBudWxsLCBzZWksIGZlYXR1cmVzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgPFQ+IFQgZ2V0UG9ydChFbmRwb2ludFJlZmVyZW5jZSBqYXh3c0VQUiwgQ2xhc3M8VD4gc2VpLCBXZWJTZXJ2aWNlRmVhdHVyZS4uLiBmZWF0dXJlcykgewotICAgICAgICAvKiBUT0RPIENoZWNrIHRvIHNlZSBpZiBXU0RMIExvY2F0aW9uIGlzIHByb3ZpZGVkLgotICAgICAgICAgKiBpZiBub3QgY2hlY2sgV2ViU2VydmljZSBhbm5vdGF0aW9uJ3MgV1NETExvY2F0aW9uCi0gICAgICAgICAqIGlmIGJvdGggYXJlIG5vdCBwcm92aWRlZCB0aGVuIHRocm93IGV4Y2VwdGlvbi4KLSAgICAgICAgICogKEpMQik6IEknbSBub3Qgc3VyZSBsYWNrIG9mIFdTREwgc2hvdWxkIGNhdXNlIGFuIGV4Y2VwdGlvbgotICAgICAgICAgKi8KLQotCi0gICAgICAgIGlmICghaXNWYWxpZFdTRExMb2NhdGlvbigpKSB7Ci0gICAgICAgICAgICAvL1RPRE86IFNob3VsZCBJIHRocm93IEV4Y2VwdGlvbiBpZiBubyBXU0RMCi0gICAgICAgICAgICAvL3Rocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oIldTTEQgTm90IGZvdW5kIik7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmIChqYXh3c0VQUiA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5LgotICAgICAgICAgICAgICAgbWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiZGlzcGF0Y2hOb0VuZHBvaW50UmVmZXJlbmNlMiIpKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKHNlaSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRNZXNzYWdlKCJnZXRQb3J0SW52YWxpZFNFSSIsIGpheHdzRVBSLnRvU3RyaW5nKCksICJudWxsIikpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2UgYXhpczJFUFIgPQotICAgICAgICAgICAgRW5kcG9pbnRSZWZlcmVuY2VVdGlscy5jcmVhdGVBeGlzMkVuZHBvaW50UmVmZXJlbmNlKCIiKTsKLSAgICAgICAgU3RyaW5nIGFkZHJlc3NpbmdOYW1lc3BhY2UgPSBudWxsOwotICAgICAgICAKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFkZHJlc3NpbmdOYW1lc3BhY2UgPSBFbmRwb2ludFJlZmVyZW5jZVV0aWxzLmNvbnZlcnRUb0F4aXMyKGF4aXMyRVBSLCBqYXh3c0VQUik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5LgotICAgICAgICAgICAgICBtYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJpbnZhbGlkRW5kcG9pbnRSZWZlcmVuY2UiLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnRvU3RyaW5nKCkpKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGdldFBvcnQoYXhpczJFUFIsIGFkZHJlc3NpbmdOYW1lc3BhY2UsIHNlaSwgZmVhdHVyZXMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyA8VD4gVCBnZXRQb3J0KFFOYW1lIHBvcnROYW1lLCBDbGFzczxUPiBzZWksIFdlYlNlcnZpY2VGZWF0dXJlLi4uIGZlYXR1cmVzKSB7Ci0gICAgICAgIHZlcmlmeVNlcnZpY2VEZXNjcmlwdGlvbkFjdGl2ZSgpOwotICAgICAgICAvKiBUT0RPIENoZWNrIHRvIHNlZSBpZiBXU0RMIExvY2F0aW9uIGlzIHByb3ZpZGVkLgotICAgICAgICAgKiBpZiBub3QgY2hlY2sgV2ViU2VydmljZSBhbm5vdGF0aW9uJ3MgV1NETExvY2F0aW9uCi0gICAgICAgICAqIGlmIGJvdGggYXJlIG5vdCBwcm92aWRlZCB0aGVuIHRocm93IGV4Y2VwdGlvbi4KLSAgICAgICAgICogKEpMQik6IEknbSBub3Qgc3VyZSBsYWNrIG9mIFdTREwgc2hvdWxkIGNhdXNlIGFuIGV4Y2VwdGlvbgotICAgICAgICAgKi8KLQotCi0gICAgICAgIGlmICghaXNWYWxpZFdTRExMb2NhdGlvbigpKSB7Ci0gICAgICAgICAgICAvL1RPRE86IFNob3VsZCBJIHRocm93IEV4Y2VwdGlvbiBpZiBubyBXU0RMCi0gICAgICAgICAgICAvL3Rocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oIldTTEQgTm90IGZvdW5kIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNlaSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRNZXNzYWdlKCJnZXRQb3J0SW52YWxpZFNFSSIsIHBvcnROYW1lLnRvU3RyaW5nKCksICJudWxsIikpOwotICAgICAgICB9Ci0KLSAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIHNwYXJzZUNvbXBvc2l0ZSA9IGdldFBvcnRNZXRhZGF0YSgpOwotICAgICAgICByZXNldFBvcnRNZXRhZGF0YSgpOwotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVuZHBvaW50RGVzYyA9IG51bGw7Ci0gICAgICAgIGlmIChzcGFyc2VDb21wb3NpdGUgIT0gbnVsbCkgewotICAgICAgICAgICAgZW5kcG9pbnREZXNjID0KLSAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkZhY3RvcnkudXBkYXRlRW5kcG9pbnQoc2VydmljZURlc2NyaXB0aW9uLCBzZWksIHBvcnROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkZhY3RvcnkuVXBkYXRlVHlwZS5HRVRfUE9SVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhcnNlQ29tcG9zaXRlLCB0aGlzKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGVuZHBvaW50RGVzYyA9Ci0gICAgICAgICAgICAgICAgRGVzY3JpcHRpb25GYWN0b3J5LnVwZGF0ZUVuZHBvaW50KHNlcnZpY2VEZXNjcmlwdGlvbiwgc2VpLCBwb3J0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb25GYWN0b3J5LlVwZGF0ZVR5cGUuR0VUX1BPUlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIHRoaXMpOwotICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgaWYgKGVuZHBvaW50RGVzYyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKAotICAgICAgICAgICAgCQlNZXNzYWdlcy5nZXRNZXNzYWdlKCJwb3J0RXJyIixwb3J0TmFtZS50b1N0cmluZygpKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmdbXSBpbnRlcmZhY2VzTmFtZXMgPSAKLSAgICAgICAgICAgIG5ldyBTdHJpbmcgW10ge3NlaS5nZXROYW1lKCksIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc3BpLkJpbmRpbmdQcm92aWRlci5jbGFzcy5nZXROYW1lKCl9OwotICAgICAgICAKLSAgICAgICAgLy8gQXMgcmVxdWlyZWQgYnkgamF2YS5sYW5nLnJlZmxlY3QuUHJveHksIGVuc3VyZSB0aGF0IHRoZSBpbnRlcmZhY2VzCi0gICAgICAgIC8vIGZvciB0aGUgcHJveHkgYXJlIGxvYWRhYmxlIGJ5IHRoZSBzYW1lIGNsYXNzIGxvYWRlci4gCi0gICAgICAgIENsYXNzW10gaW50ZXJmYWNlcyA9IG51bGw7Ci0gICAgICAgIC8vIEZpcnN0LCBsZXQncyB0cnkgbG9hZGluZyB0aGUgaW50ZXJmYWNlcyB3aXRoIHRoZSBTRUkgY2xhc3NMb2FkZXIKLSAgICAgICAgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIgPSBnZXRDbGFzc0xvYWRlcihzZWkpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaW50ZXJmYWNlcyA9IGxvYWRDbGFzc2VzKGNsYXNzTG9hZGVyLCBpbnRlcmZhY2VzTmFtZXMpOwotICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUxKSB7Ci0gICAgICAgICAgICAvLyBMZXQncyB0cnkgd2l0aCBjb250ZXh0IGNsYXNzTG9hZGVyIG5vdwotICAgICAgICAgICAgY2xhc3NMb2FkZXIgPSBnZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaW50ZXJmYWNlcyA9IGxvYWRDbGFzc2VzKGNsYXNzTG9hZGVyLCBpbnRlcmZhY2VzTmFtZXMpOwotICAgICAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlMikgewotICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgicG9ydEVycjEiKSwgZTIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBKQVhXU1Byb3h5SGFuZGxlciBwcm94eUhhbmRsZXIgPSBuZXcgSkFYV1NQcm94eUhhbmRsZXIodGhpcywgaW50ZXJmYWNlc1swXSwgZW5kcG9pbnREZXNjLCBmZWF0dXJlcyk7Ci0gICAgICAgIE9iamVjdCBwcm94eUNsYXNzID0gUHJveHkubmV3UHJveHlJbnN0YW5jZShjbGFzc0xvYWRlciwgaW50ZXJmYWNlcywgcHJveHlIYW5kbGVyKTsKLSAgICAgICAgcmV0dXJuIHNlaS5jYXN0KHByb3h5Q2xhc3MpOwotICAgIH0KLQotICAgIC8qCi0gICAgKiAobm9uLUphdmFkb2MpCi0gICAgKiBAc2VlIGphdmF4LnhtbC53cy5zcGkuU2VydmljZURlbGVnYXRlI2dldEV4ZWN1dG9yKCkKLSAgICAqLwotICAgIHB1YmxpYyBFeGVjdXRvciBnZXRFeGVjdXRvcigpIHsKLSAgICAgICAgLy9GSVhNRTogVXNlIGNsaWVudCBwcm92aWRlciBleGVjdXRvciB0b28uCi0gICAgICAgIGlmIChleGVjdXRvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBleGVjdXRvciA9IGdldERlZmF1bHRFeGVjdXRvcigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBleGVjdXRvcjsKLSAgICB9Ci0KLSAgICAvKgotICAgICogKG5vbi1KYXZhZG9jKQotICAgICogQHNlZSBqYXZheC54bWwud3Muc3BpLlNlcnZpY2VEZWxlZ2F0ZSNnZXRIYW5kbGVyUmVzb2x2ZXIoKQotICAgICovCi0gICAgcHVibGljIEhhbmRsZXJSZXNvbHZlciBnZXRIYW5kbGVyUmVzb2x2ZXIoKSB7Ci0gICAgICAgIHZlcmlmeVNlcnZpY2VEZXNjcmlwdGlvbkFjdGl2ZSgpOwotICAgICAgICBpZiAoaGFuZGxlclJlc29sdmVyID09IG51bGwpIHsKLSAgICAgICAgICAgIGhhbmRsZXJSZXNvbHZlciA9IG5ldyBIYW5kbGVyUmVzb2x2ZXJJbXBsKHNlcnZpY2VEZXNjcmlwdGlvbiwgdGhpcyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGhhbmRsZXJSZXNvbHZlcjsKLSAgICB9Ci0KLSAgICAvKgotICAgICogKG5vbi1KYXZhZG9jKQotICAgICogQHNlZSBqYXZheC54bWwud3Muc3BpLlNlcnZpY2VEZWxlZ2F0ZSNnZXRQb3J0cygpCi0gICAgKi8KLSAgICBwdWJsaWMgSXRlcmF0b3I8UU5hbWU+IGdldFBvcnRzKCkgewotICAgICAgICB2ZXJpZnlTZXJ2aWNlRGVzY3JpcHRpb25BY3RpdmUoKTsKLSAgICAgICAgcmV0dXJuIGdldFNlcnZpY2VEZXNjcmlwdGlvbigpLmdldFBvcnRzKHRoaXMpLml0ZXJhdG9yKCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAqIChub24tSmF2YWRvYykKLSAgICAqIEBzZWUgamF2YXgueG1sLndzLnNwaS5TZXJ2aWNlRGVsZWdhdGUjZ2V0U2VydmljZU5hbWUoKQotICAgICovCi0gICAgcHVibGljIFFOYW1lIGdldFNlcnZpY2VOYW1lKCkgewotICAgICAgICByZXR1cm4gc2VydmljZVFuYW1lOwotICAgIH0KLQotICAgIC8qCi0gICAgKiAobm9uLUphdmFkb2MpCi0gICAgKiBAc2VlIGphdmF4LnhtbC53cy5zcGkuU2VydmljZURlbGVnYXRlI2dldFdTRExEb2N1bWVudExvY2F0aW9uKCkKLSAgICAqLwotICAgIHB1YmxpYyBVUkwgZ2V0V1NETERvY3VtZW50TG9jYXRpb24oKSB7Ci0gICAgICAgIHZlcmlmeVNlcnZpY2VEZXNjcmlwdGlvbkFjdGl2ZSgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgU3RyaW5nIHdzZGxMb2NhdGlvbiA9ICgoU2VydmljZURlc2NyaXB0aW9uV1NETCkgc2VydmljZURlc2NyaXB0aW9uKS5nZXRXU0RMTG9jYXRpb24oKTsKLSAgICAgICAgICAgIGlmKHdzZGxMb2NhdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFVSTCh3c2RsTG9jYXRpb24pOwotICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeQotICAgICAgICAgICAgICAgICAgICAubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICogKG5vbi1KYXZhZG9jKQotICAgICogQHNlZSBqYXZheC54bWwud3Muc3BpLlNlcnZpY2VEZWxlZ2F0ZSNzZXRFeGVjdXRvcihqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcikKLSAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEV4ZWN1dG9yKEV4ZWN1dG9yIGUpIHsKLSAgICAgICAgaWYgKGUgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeQotICAgICAgICAgICAgICAgICAgICAubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiY2Fubm90U2V0RXhjdXRvclRvTnVsbCIpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGV4ZWN1dG9yID0gZTsKLSAgICB9Ci0KLSAgICAvKgotICAgICogKG5vbi1KYXZhZG9jKQotICAgICogQHNlZSBqYXZheC54bWwud3Muc3BpLlNlcnZpY2VEZWxlZ2F0ZSNzZXRIYW5kbGVyUmVzb2x2ZXIoamF2YXgueG1sLndzLmhhbmRsZXIuSGFuZGxlclJlc29sdmVyKQotICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SGFuZGxlclJlc29sdmVyKEhhbmRsZXJSZXNvbHZlciBoYW5kbGVycmVzb2x2ZXIpIHsKLSAgICAgICAgdGhpcy5oYW5kbGVyUmVzb2x2ZXIgPSBoYW5kbGVycmVzb2x2ZXI7Ci0gICAgfQotCi0gICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAvLyBJbnRlcm5hbCBwdWJsaWMgQVBJcwotICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgICAvKiogR2V0IHRoZSBTZXJ2aWNlRGVzY3JpcHRpb24gdHJlZSB0aGF0IHRoaXMgU2VydmljZURlbGVnYXRlICovCi0gICAgcHVibGljIFNlcnZpY2VEZXNjcmlwdGlvbiBnZXRTZXJ2aWNlRGVzY3JpcHRpb24oKSB7Ci0gICAgICAgIHJldHVybiBzZXJ2aWNlRGVzY3JpcHRpb247Ci0gICAgfQotCi0gICAgLy9UT0RPIENoYW5nZSB3aGVuIFNlcnZpY2VEZXNjcmlwdGlvbiBoYXMgdG8gcmV0dXJuIFNlcnZpY2VDbGllbnQgb3IgT3BlcmF0aW9uQ2xpZW50Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKi8KLSAgICBwdWJsaWMgU2VydmljZUNsaWVudCBnZXRTZXJ2aWNlQ2xpZW50KFFOYW1lIHBvcnRRTmFtZSkgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICB2ZXJpZnlTZXJ2aWNlRGVzY3JpcHRpb25BY3RpdmUoKTsKLSAgICAgICAgcmV0dXJuIHNlcnZpY2VEZXNjcmlwdGlvbi5nZXRTZXJ2aWNlQ2xpZW50KHBvcnRRTmFtZSwgdGhpcyk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyA8VD4gVCBnZXRQb3J0KG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZSBheGlzMkVQUiwgU3RyaW5nIGFkZHJlc3NpbmdOYW1lc3BhY2UsIENsYXNzPFQ+IHNlaSwgV2ViU2VydmljZUZlYXR1cmUuLi4gZmVhdHVyZXMpIHsKLSAgICAgICAgdmVyaWZ5U2VydmljZURlc2NyaXB0aW9uQWN0aXZlKCk7Ci0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBzcGFyc2VDb21wb3NpdGUgPSBnZXRQb3J0TWV0YWRhdGEoKTsKLSAgICAgICAgcmVzZXRQb3J0TWV0YWRhdGEoKTsKLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlbmRwb2ludERlc2MgPSBudWxsOwotICAgICAgICAKLSAgICAgICAgaWYgKHNwYXJzZUNvbXBvc2l0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBlbmRwb2ludERlc2MgPQotICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uRmFjdG9yeS51cGRhdGVFbmRwb2ludChzZXJ2aWNlRGVzY3JpcHRpb24sIHNlaSwgYXhpczJFUFIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3NpbmdOYW1lc3BhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uRmFjdG9yeS5VcGRhdGVUeXBlLkdFVF9QT1JULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFyc2VDb21wb3NpdGUsIHRoaXMpOwotCi0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBlbmRwb2ludERlc2MgPQotICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uRmFjdG9yeS51cGRhdGVFbmRwb2ludChzZXJ2aWNlRGVzY3JpcHRpb24sIHNlaSwgYXhpczJFUFIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3NpbmdOYW1lc3BhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uRmFjdG9yeS5VcGRhdGVUeXBlLkdFVF9QT1JULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCB0aGlzKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKGVuZHBvaW50RGVzYyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRNZXNzYWdlKCJzZXJ2aWNlRGVsZWdhdGVOb1BvcnQiLCBheGlzMkVQUi50b1N0cmluZygpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nW10gaW50ZXJmYWNlc05hbWVzID0gCi0gICAgICAgICAgICBuZXcgU3RyaW5nIFtdIHtzZWkuZ2V0TmFtZSgpLCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNwaS5CaW5kaW5nUHJvdmlkZXIuY2xhc3MuZ2V0TmFtZSgpfTsKLSAgICAgICAgCi0gICAgICAgIC8vIEFzIHJlcXVpcmVkIGJ5IGphdmEubGFuZy5yZWZsZWN0LlByb3h5LCBlbnN1cmUgdGhhdCB0aGUgaW50ZXJmYWNlcwotICAgICAgICAvLyBmb3IgdGhlIHByb3h5IGFyZSBsb2FkYWJsZSBieSB0aGUgc2FtZSBjbGFzcyBsb2FkZXIuIAotICAgICAgICBDbGFzc1tdIGludGVyZmFjZXMgPSBudWxsOwotICAgICAgICAvLyBGaXJzdCwgbGV0J3MgdHJ5IGxvYWRpbmcgdGhlIGludGVyZmFjZXMgd2l0aCB0aGUgU0VJIGNsYXNzTG9hZGVyCi0gICAgICAgIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyID0gZ2V0Q2xhc3NMb2FkZXIoc2VpKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGludGVyZmFjZXMgPSBsb2FkQ2xhc3NlcyhjbGFzc0xvYWRlciwgaW50ZXJmYWNlc05hbWVzKTsKLSAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlMSkgewotICAgICAgICAgICAgLy8gTGV0J3MgdHJ5IHdpdGggY29udGV4dCBjbGFzc0xvYWRlciBub3cKLSAgICAgICAgICAgIGNsYXNzTG9hZGVyID0gZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGludGVyZmFjZXMgPSBsb2FkQ2xhc3NlcyhjbGFzc0xvYWRlciwgaW50ZXJmYWNlc05hbWVzKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZTIpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZ2V0TWVzc2FnZSgic2VydmljZURlbGVnYXRlUHJveHlFcnJvciIsIGUyLmdldE1lc3NhZ2UoKSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgSkFYV1NQcm94eUhhbmRsZXIgcHJveHlIYW5kbGVyID0gbmV3IEpBWFdTUHJveHlIYW5kbGVyKHRoaXMsIGludGVyZmFjZXNbMF0sIGVuZHBvaW50RGVzYywgYXhpczJFUFIsIGFkZHJlc3NpbmdOYW1lc3BhY2UsIGZlYXR1cmVzKTsKLSAgICAgICAgT2JqZWN0IHByb3h5Q2xhc3MgPSBQcm94eS5uZXdQcm94eUluc3RhbmNlKGNsYXNzTG9hZGVyLCBpbnRlcmZhY2VzLCBwcm94eUhhbmRsZXIpOwotICAgICAgICByZXR1cm4gc2VpLmNhc3QocHJveHlDbGFzcyk7ICAgICAgICAKLSAgICB9Ci0KLSAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIC8vIEltcGwgbWV0aG9kcwotICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgICAvL1RPRE86IE5lZWQgdG8gbWFrZSB0aGUgZGVmYXVsdCBudW1iZXIgb2YgdGhyZWFkcyBjb25maWd1cmFibGUKLSAgICBwcml2YXRlIEV4ZWN1dG9yIGdldERlZmF1bHRFeGVjdXRvcigpIHsKLSAgICAJRXhlY3V0b3JGYWN0b3J5IGV4ZWN1dG9yRmFjdG9yeSA9IChFeGVjdXRvckZhY3RvcnkpIEZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KAotICAgIAkJCUV4ZWN1dG9yRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgIHJldHVybiBleGVjdXRvckZhY3RvcnkuZ2V0RXhlY3V0b3JJbnN0YW5jZShFeGVjdXRvckZhY3RvcnkuQ0xJRU5UX0VYRUNVVE9SKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNWYWxpZFNlcnZpY2VOYW1lKCkgewotICAgICAgICByZXR1cm4gc2VydmljZVFuYW1lICE9IG51bGwgJiYgISIiLmVxdWFscyhzZXJ2aWNlUW5hbWUudG9TdHJpbmcoKS50cmltKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkV1NETExvY2F0aW9uKCkgewotICAgICAgICBVUkwgd3NkbExvY2F0aW9uID0gZ2V0V1NETERvY3VtZW50TG9jYXRpb24oKTsKLSAgICAgICAgcmV0dXJuIHdzZGxMb2NhdGlvbiAhPSBudWxsICYmICEiIi5lcXVhbHMod3NkbExvY2F0aW9uLnRvU3RyaW5nKCkudHJpbSgpKTsKLSAgICB9Ci0KLSAgICAvLyBUT0RPOiBSZW1vdmUgdGhpcyBtZXRob2QgYW5kIHB1dCB0aGUgV1NETFdyYXBwZXIgbWV0aG9kcyBvbiB0aGUgU2VydmljZURlc2NyaXB0b3IgZGlyZWN0bHkKLSAgICBwcml2YXRlIFdTRExXcmFwcGVyIGdldFdTRExXcmFwcGVyKCkgewotICAgICAgICB2ZXJpZnlTZXJ2aWNlRGVzY3JpcHRpb25BY3RpdmUoKTsKLSAgICAgICAgcmV0dXJuICgoU2VydmljZURlc2NyaXB0aW9uV1NETClzZXJ2aWNlRGVzY3JpcHRpb24pLmdldFdTRExXcmFwcGVyKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzU2VydmljZURlZmluZWQoUU5hbWUgc2VydmljZU5hbWUpIHsKLSAgICAgICAgcmV0dXJuIGdldFdTRExXcmFwcGVyKCkuZ2V0U2VydmljZShzZXJ2aWNlTmFtZSkgIT0gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNWYWxpZERpc3BhdGNoVHlwZShDbGFzcyBjbGF6eikgewotICAgICAgICByZXR1cm4gY2xhenogIT0gbnVsbCAmJiAoY2xhenogPT0gU3RyaW5nLmNsYXNzIHx8Ci0gICAgICAgICAgICAgICAgY2xhenogPT0gU291cmNlLmNsYXNzIHx8Ci0gICAgICAgICAgICAgICAgY2xhenogPT0gRGF0YVNvdXJjZS5jbGFzcyB8fAotICAgICAgICAgICAgICAgIGNsYXp6ID09IFNPQVBNZXNzYWdlLmNsYXNzIHx8Ci0gICAgICAgICAgICAgICAgY2xhenogPT0gT01FbGVtZW50LmNsYXNzKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNWYWxpZERpc3BhdGNoVHlwZVdpdGhNb2RlKENsYXNzIGNsYXp6LCBNb2RlIG1vZGUpIHsKLQotICAgIAlpZiAoY2xhenogIT0gbnVsbCAmJiAhKGNsYXp6ID09IFNPQVBNZXNzYWdlLmNsYXNzICYmIG1vZGUuZXF1YWxzKFNlcnZpY2UuTW9kZS5QQVlMT0FEKSkpIHsKLSAgICAJCQlyZXR1cm4gdHJ1ZTsKLSAgICAJfSBlbHNlIHsKLSAgICAJCXJldHVybiBmYWxzZTsKLSAgICAJfQotICAKLSAgICB9Ci0KLSAgICAvKiogQHJldHVybiBDbGFzc0xvYWRlciAqLwotICAgIHByaXZhdGUgc3RhdGljIENsYXNzTG9hZGVyIGdldENsYXNzTG9hZGVyKGZpbmFsIENsYXNzIGNscykgewotICAgICAgICAvLyBOT1RFOiBUaGlzIG1ldGhvZCBtdXN0IHJlbWFpbiBwcml2YXRlIGJlY2F1c2UgaXQgdXNlcyBBY2Nlc3NDb250cm9sbGVyCi0gICAgICAgIENsYXNzTG9hZGVyIGNsID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNsID0gKENsYXNzTG9hZGVyKUFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAotICAgICAgICAgICAgICAgICAgICBuZXcgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjbHMuZ2V0Q2xhc3NMb2FkZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgKTsKLSAgICAgICAgfSBjYXRjaCAoUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkV4Y2VwdGlvbiB0aHJvd24gZnJvbSBBY2Nlc3NDb250cm9sbGVyOiAiICsgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGUuZ2V0RXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGNsOwotICAgIH0KLSAgICAKLSAgICAvKiogQHJldHVybiBDbGFzc0xvYWRlciAqLwotICAgIHByaXZhdGUgc3RhdGljIENsYXNzTG9hZGVyIGdldENvbnRleHRDbGFzc0xvYWRlcigpIHsKLSAgICAgICAgLy8gTk9URTogVGhpcyBtZXRob2QgbXVzdCByZW1haW4gcHJpdmF0ZSBiZWNhdXNlIGl0IHVzZXMgQWNjZXNzQ29udHJvbGxlcgotICAgICAgICBDbGFzc0xvYWRlciBjbCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjbCA9IChDbGFzc0xvYWRlcilBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgKLSAgICAgICAgICAgICAgICAgICAgbmV3IFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgKTsKLSAgICAgICAgfSBjYXRjaCAoUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkV4Y2VwdGlvbiB0aHJvd24gZnJvbSBBY2Nlc3NDb250cm9sbGVyOiAiICsgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGUuZ2V0RXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGNsOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIGNsYXNzIGZvciB0aGlzIG5hbWUKLSAgICAgKgotICAgICAqIEByZXR1cm4gQ2xhc3MKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBDbGFzcyBmb3JOYW1lKGZpbmFsIFN0cmluZyBjbGFzc05hbWUsIGZpbmFsIGJvb2xlYW4gaW5pdGlhbGl6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIE5PVEU6IFRoaXMgbWV0aG9kIG11c3QgcmVtYWluIHByb3RlY3RlZCBiZWNhdXNlIGl0IHVzZXMgQWNjZXNzQ29udHJvbGxlcgotICAgICAgICBDbGFzcyBjbCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjbCA9IChDbGFzcylBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgKLSAgICAgICAgICAgICAgICAgICAgbmV3IFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUsIGluaXRpYWxpemUsIGNsYXNzTG9hZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgKTsKLSAgICAgICAgfSBjYXRjaCAoUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkV4Y2VwdGlvbiB0aHJvd24gZnJvbSBBY2Nlc3NDb250cm9sbGVyOiAiICsgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aHJvdyAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbillLmdldEV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGNsOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBDbGFzc1tdIGxvYWRDbGFzc2VzKENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyLCBTdHJpbmdbXSBjbGFzc05hbWVzKQotICAgICAgICB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIENsYXNzW10gY2xhc3NlcyA9IG5ldyBDbGFzc1tjbGFzc05hbWVzLmxlbmd0aF07Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2xhc3NOYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgY2xhc3Nlc1tpXSA9IGZvck5hbWUoY2xhc3NOYW1lc1tpXSwgdHJ1ZSwgY2xhc3NMb2FkZXIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjbGFzc2VzOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBQUk9QUklFVEFSWSBNRVRIT0QgVE8gUkVMRUFTRSBSRVNPVUNFUy4gIFVTRSBPRiBUSElTIE1FVEhPRCBJUyBOT1QgSkFYLVdTIENPTVBMSUFOVCAKLSAgICAgKiBBTkQgSVMgTk9OLVBPUlRBQkxFISAgCi0gICAgICogCi0gICAgICogVGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCBieSBjbGllbnQgY29kZSB0byB0cnkgdG8gcmVsZWFzZQotICAgICAqIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggdGhlIFNlcnZpY2UgaW5zdGFuY2UgcGFyYW1ldGVyLiAgVGhlc2UgcmVzb3VyY2VzIGluY2x1ZGUKLSAgICAgKiB0aGUgSkFYLVdTIG1ldGFkYXRhIG9iamVjdHMgKGUuZy4gU2VydmljZURlc2NyaXB0aW9uLCBFbmRwb2ludERlc2NyaXB0aW9uKSBhbmQgdGhlCi0gICAgICogYXNzb2NpYXRlZCBBeGlzMiBvYmplY3RzIChlLmcuIEF4aXNTZXJ2aWNlIGFuZCByZWFsdGVkIG9iamVjdHMpLiAgTm90ZSB0aGF0IHRoZXNlIAotICAgICAqIHJlc291cmNlcyBjYW4gYmUgc2hhcmVkIGFjcm9zcyBtdWx0aXBsZSBzZXJ2aWNlIGRlbGVnYXRlcywgYW5kIHNvIHRoZXkgd2lsbCBub3QgYWN0dWFsbHkgCi0gICAgICogYmUgcmVsZWFzZWQgdW50aWwgdGhlIGxhc3Qgc2VydmljZSBkZWxlZ2F0ZSB1c2luZyB0aGVtIGlzIGNsb3NlZC4KLSAgICAgKiAKLSAgICAgKiBOb3RlIHRoYXQgaXQgaXMgbm90IG5lY2Vzc2FyeSB0byBjYWxsIHRoaXMgbWV0aG9kIHNpbmNlIHRoZSBzZXJ2aWNlIGRlbGVnYXRlIGZpbmFsaXplcgotICAgICAqIHdpbGwgYWxzbyByZWxlYXNlIHRoZSByZXNvdXJjZXMgYXMgYXBwcm9wcmlhdGUuICBIb3dldmVyLCBmaW5hbGl6ZXJzIGFyZSBub3QgbmVjZXNzYXJpbHkgcnVuCi0gICAgICogaW4gYSB0aW1lbHkgZmFzaGlvbiBhbmQgdGhlIHRpbWluZyB2YXJpZXMgYWNyb3NzIEpWTXMuICBUbyBwcmVkaWN0aWJseSByZWxlYXNlIHJlc291cmNlcwotICAgICAqIHRvIHByZXZlbnQgbGFyZ2UgbWVtb3J5IHJlcXVpcmVtZW50cyBhbmQvb3IgT3V0T2ZNZW1vcnkgZXJyb3JzLCB0aGlzIHByb3ByaWV0YXJ5IHJlbGVhc2UgCi0gICAgICogbWV0aG9kIGNhbiBiZSBjYWxsZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIHNlcnZpY2UgSW5zdGFuY2Ugb2YgdGhlIFNlcnZpY2UgZm9yIHdoaWNoIHJlc291cmNlcyBtYXkgYmUgcmVsZWFzZWQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlbGVhc2VTZXJ2aWNlKFNlcnZpY2Ugc2VydmljZSkgewotICAgICAgICAvLyBGaW5kIHRoZSBTZXJ2aWNlRGVsZWdhdGUgY29ycmVzcG9uZGluZyB0byB0aGUgc2VydmljZSB0byBiZSBjbG9zZWQKLSAgICAgICAgLy8gVGhpcyBpcyB0aGUgYmFjayB3YXkgYXJvdW5kIHNpbmNlIHRoZXJlIGlzIG5vIGNsb3NlIG9uIHRoZSBTZXJ2aWNlCi0gICAgICAgIFNlcnZpY2VEZWxlZ2F0ZSBzZXJ2aWNlRGVsZWdhdGUgPSBnZXRTZXJ2aWNlRGVsZWdhdGVGb3JTZXJ2aWNlKHNlcnZpY2UpOwotICAgICAgICBzZXJ2aWNlRGVsZWdhdGUucmVsZWFzZVNlcnZpY2VSZXNvdXJjZXMoKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgU2VydmljZURlbGVnYXRlIGdldFNlcnZpY2VEZWxlZ2F0ZUZvclNlcnZpY2UoU2VydmljZSBzZXJ2aWNlKSB7Ci0gICAgICAgIC8vIE5lZWQgdG8gZ2V0IHRvIHRoZSBwcml2YXRlIFNlcnZpY2UuX2RlbGVnYXRlCi0gICAgICAgIFNlcnZpY2VEZWxlZ2F0ZSByZXR1cm5TZXJ2aWNlRGVsZWdhdGUgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBGaWVsZCBzZXJ2aWNlRGVsZ2F0ZUZpZWxkID0gc2VydmljZS5nZXRDbGFzcygpLmdldERlY2xhcmVkRmllbGRzKClbMF07Ci0gICAgICAgICAgICAgICAgc2VydmljZURlbGdhdGVGaWVsZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwotICAgICAgICAgICAgICAgIHJldHVyblNlcnZpY2VEZWxlZ2F0ZSA9IChTZXJ2aWNlRGVsZWdhdGUpIHNlcnZpY2VEZWxnYXRlRmllbGQuZ2V0KHNlcnZpY2UpOwotICAgICAgICAgICAgfSBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBUaGlzIG1heSBiZSBhIGdlbmVyYXRlZCBzZXJ2aWNlIHN1YmNsYXNzLCBzbyBnZXQgdGhlIGRlbGVnYXRlIGZyb20gdGhlIHN1cGVyY2xhc3MKLSAgICAgICAgICAgICAgICBGaWVsZCBzZXJ2aWNlRGVsZWdhdGVGaWVsZCA9IHNlcnZpY2UuZ2V0Q2xhc3MoKS5nZXRTdXBlcmNsYXNzKCkuZ2V0RGVjbGFyZWRGaWVsZHMoKVswXTsKLSAgICAgICAgICAgICAgICBzZXJ2aWNlRGVsZWdhdGVGaWVsZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwotICAgICAgICAgICAgICAgIHJldHVyblNlcnZpY2VEZWxlZ2F0ZSA9IChTZXJ2aWNlRGVsZWdhdGUpIHNlcnZpY2VEZWxlZ2F0ZUZpZWxkLmdldChzZXJ2aWNlKTsKLSAgICAgICAgICAgIH0gCi0gICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQXR0ZW1wdCB0byBnZXQgc2VydmljZSBkZWxlZ2F0ZSBmb3Igc2VydmljZSBjYXVnaHQgZXhjZXB0aW9uLiIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkF0dGVtcHQgdG8gZ2V0IHNlcnZpY2UgZGVsZWdhdGUgZm9yIHNlcnZpY2UgY2F1Z2h0IGV4Y2VwdGlvbi4iLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldHVyblNlcnZpY2VEZWxlZ2F0ZTsKLQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGlzIGNhbiBiZSBjYWxsZWQgZnJvbSB0aGUgcHJvcHJpZXRhcnkgc3RhdGljIHJlbGVhc2UgbWV0aG9kICh3aGljaCBjYW4gYmUgY2FsbGVkIHZpYSAKLSAgICAgKiBjbGllbnQgY29kZSksIG9yIGl0IGNhbiBiZSBjYWxsZWQgYnkgdGhlIGZpbmFsaXplci4gIFRoaXMgbWV0aG9kIHRyaWVzIHRvIHJlbGVhc2UgcmVzb3VyY2VzIAotICAgICAqIGFzc29jaWF0ZWQgd2l0aCB0aGUgU2VydmljZURlbGVnYXRlLiAgTm90ZSB0aGF0IHNpbmNlIG90aGVyIFNlcnZpY2VEZWxlZ2F0ZXMgY2FuIHNoYXJlIHRoZXNlIAotICAgICAqIHJlc291cmNlcyAoZS5nLiBTZXJ2aWNlRGVzY3JpcHRpb24sIEVuZHBvaW50RGVzY3JpcHRpb24sIEF4aXNTZXJ2aWNlKSwgdGhlIHJlc291cmNlcyBtYXkgCi0gICAgICogbm90IGJlIHJlbGVhc2VlZCB1bnRpbCB0aGUgbGFzdCBTZXJ2aWNlRGVsZWdhdGUgdXNpbmcgdGhlbSBpc3N1ZXMgYSBjbG9zZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcmVsZWFzZVNlcnZpY2VSZXNvdXJjZXMoKSB7Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJTZXJ2aWNlRGVsZWdhdGUucmVsZWFzZVNlcnZpY2VSZXNvdWNlcyBlbnRyeSIpOwotICAgICAgICB9Ci0gICAgICAgIC8vIFRoaXMgY2FuIGJlIGNhbGxlZCBpbmRpcmVjdGx5IGJ5IGNsaWVudCBjb2RlIG9yIGJ5IHRoZSBmaW5hbGl6ZXIuICBJZiBpdCBoYXNuJ3QgYmVlbgotICAgICAgICAvLyBjYWxsZWQgeWV0LCBoYXZlIHRoZSBlbmRwb2ludERlc2NyaXB0aW9ucyByZWxlYXNlIHJlc291cmNlcy4KLSAgICAgICAgaWYgKHNlcnZpY2VEZXNjcmlwdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzZXJ2aWNlRGVzY3JpcHRpb24ucmVsZWFzZVJlc291cmNlcyh0aGlzKTsKLSAgICAgICAgICAgIHNlcnZpY2VEZXNjcmlwdGlvbiA9IG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBWZXJpZnkgdGhhdCB0aGVyZSBpcyBhbiBhc3NvY2lhdGVkIHNlcnZpY2VEZXNjcmlwdGlvbiBmb3IgdGhpcyBkZWxlZ2F0ZS4gIElmIG5vdCwgYQotICAgICAqIHdlYlNlcnZpY2VFeGNlcHRpb24gd2lsbCBiZSB0aHJvd24uICBBIHNlcnZpY2VEZWxlZ2F0ZSBtYXkgaGF2ZSBhIG51bGwgc2VydmljZURlc2NyaXB0aW9uCi0gICAgICogaWYgdGhlIGNsaWVudCBjb2RlIGlzc3VlcyB0aGUgcHJvcHJpZXRhcnkgbWV0aG9kIGNhbGwgcmVsZWFsc2VTZXJ2aWNlUmVzb3VyY2VzLiAKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgdmVyaWZ5U2VydmljZURlc2NyaXB0aW9uQWN0aXZlKCkgewotICAgICAgICBpZiAoc2VydmljZURlc2NyaXB0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIFRPRE86IFRoaXMgc2hvdWxkIGJlIE5MUydkCi0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKCJBdHRlbXB0IHRvIHVzZSBTZXJ2aWNlIGFmdGVyIGl0IHdhcyByZWxlYXNlZCIpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZWxlYXNlU2VydmljZVJlc291cmNlcygpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJTZXJ2aWNlRGVsZ2F0ZSBGaW5hbGl6ZXIgY2F1Z2h0IGV4Y2VwdGlvbiIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgc3VwZXIuZmluYWxpemUoKTsKLSAgICAgICAgfQotICAgIH0gICAKLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NwaS9oYW5kbGVyL0Jhc2VIYW5kbGVyUmVzb2x2ZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NwaS9oYW5kbGVyL0Jhc2VIYW5kbGVyUmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGE0MjZkNi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zcGkvaGFuZGxlci9CYXNlSGFuZGxlclJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zcGkuaGFuZGxlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuRXhjZXB0aW9uRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5pbXBsLkRlc2NyaXB0aW9uVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24ueG1sLmhhbmRsZXIuSGFuZGxlckNoYWluVHlwZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi54bWwuaGFuZGxlci5IYW5kbGVyQ2hhaW5zVHlwZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOw0KLWltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5IYW5kbGVyUmVzb2x2ZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLlBvcnRJbmZvOw0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb247DQotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOw0KLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsNCi0NCi0vKioNCi0gKiBUaGlzIGNsYXNzIGNhbiBiZSBzdWJjbGFzc2VkIHRvIHByb2R1Y2UgZGlmZmVyZW50IGltcGxlbWVudGF0aW9ucyBvZiB7QGxpbmsgSGFuZGxlclJlc29sdmVyfQ0KLSAqDQotICovDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VIYW5kbGVyUmVzb2x2ZXIgaW1wbGVtZW50cyBIYW5kbGVyUmVzb2x2ZXIgew0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coQmFzZUhhbmRsZXJSZXNvbHZlci5jbGFzcyk7DQotDQotICAgIC8vIFRPRE8gc2hvdWxkIHByb2JhYmx5IHVzZSBjb25zdGFudHMgZGVmaW5lZCBlbHNld2hlcmUNCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IHByb3RvY29sQmluZGluZ3NNYXAgPQ0KLSAgICAgICAgbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KDUpOw0KLQ0KLSAgICBwcm90ZWN0ZWQgSGFuZGxlckNoYWluc1R5cGUgaGFuZGxlckNoYWluc1R5cGU7DQotICAgIA0KLSAgICBwcm90ZWN0ZWQgQmFzZUhhbmRsZXJSZXNvbHZlcigpIHsNCi0gICAgfQ0KLSAgICANCi0gICAgcHJvdGVjdGVkIEJhc2VIYW5kbGVyUmVzb2x2ZXIoU3RyaW5nIGZpbGUpIHsNCi0gICAgICAgIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyID0gdGhpcy5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCk7DQotICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKTsNCi0gICAgICAgIElucHV0U3RyZWFtIGlzID0NCi0gICAgICAgICAgICBEZXNjcmlwdGlvblV0aWxzLm9wZW5IYW5kbGVyQ29uZmlnU3RyZWFtKGZpbGUsIGNsYXNzTmFtZSwgY2xhc3NMb2FkZXIpOw0KLSAgICAgICAgDQotICAgICAgICBpZihpcyA9PSBudWxsKSB7DQotICAgICAgICAgICAgbG9nLndhcm4oIlVuYWJsZSB0byBsb2FkIGhhbmRsZXJzIGZyb20gZmlsZTogIiArIGZpbGUpOyAgICAgICAgICAgICAgICAgICAgDQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGhhbmRsZXJDaGFpbnNUeXBlID0gRGVzY3JpcHRpb25VdGlscy5sb2FkSGFuZGxlckNoYWlucyhpcywgY2xhc3NMb2FkZXIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gY2hhaW5SZXNvbHZlc1RvUG9ydChIYW5kbGVyQ2hhaW5UeXBlIGhjdCwgUG9ydEluZm8gcG9ydGluZm8pIHsNCi0gICAgICAgIA0KLSAgICAgICAgTGlzdDxTdHJpbmc+IHByb3RvY29sQmluZGluZ3MgPSBoY3QuZ2V0UHJvdG9jb2xCaW5kaW5ncygpOw0KLSAgICAgICAgaWYgKHByb3RvY29sQmluZGluZ3MgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIGJvb2xlYW4gbWF0Y2ggPSB0cnVlOw0KLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3I8U3RyaW5nPiBpdCA9IHByb3RvY29sQmluZGluZ3MuaXRlcmF0b3IoKSA7IGl0Lmhhc05leHQoKTspIHsNCi0gICAgICAgICAgICAgICAgbWF0Y2ggPSBmYWxzZTsgIC8vIGRlZmF1bHQgdG8gZmFsc2UgaW4gdGhlIHByb3RvY29sIGJpbmRpbmdzIHVudGlsIHdlIGZpbmQgYSBtYXRjaA0KLSAgICAgICAgICAgICAgICBTdHJpbmcgcHJvdG9jb2xCaW5kaW5nID0gaXQubmV4dCgpOw0KLSAgICAgICAgICAgICAgICBwcm90b2NvbEJpbmRpbmcgPSBwcm90b2NvbEJpbmRpbmcuc3RhcnRzV2l0aCgiIyMiKSA/IHByb3RvY29sQmluZGluZ3NNYXAuZ2V0KHByb3RvY29sQmluZGluZykgOiBwcm90b2NvbEJpbmRpbmc7DQotICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBwcm90b2NvbEJpbmRpbmdzTWFwIHJldHVybnMgbnVsbCwgaXQgd291bGQgbWVhbiBzb21lb25lIGhhcyBzb21lIG5vbnNlbnNlICMjYmluZGluZw0KLSAgICAgICAgICAgICAgICBpZiAoKHByb3RvY29sQmluZGluZyAhPSBudWxsKSAmJiAocHJvdG9jb2xCaW5kaW5nLmVxdWFscyhwb3J0aW5mby5nZXRCaW5kaW5nSUQoKSkpKSB7DQotICAgICAgICAgICAgICAgICAgICBtYXRjaCA9IHRydWU7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZiAobWF0Y2ggPT0gZmFsc2UpIHsNCi0gICAgICAgICAgICAgICAgLy8gd2UndmUgY2hlY2tlZCBhbGwgdGhlIHByb3RvY29sQmluZGluZ3MsIGJ1dCBkaWRuJ3QgZmluZCBhIG1hdGNoLCBubyBuZWVkIHRvIGNvbnRpbnVlDQotICAgICAgICAgICAgICAgIHJldHVybiBtYXRjaDsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICAvKg0KLSAgICAgICAgICogbmVlZCB0byBmaWd1cmUgb3V0IGhvdyB0byBnZXQgdGhlIG5hbWVzcGFjZSBkZWNsYXJhdGlvbiBvdXQgb2YgdGhlIHBvcnQtbmFtZS1wYXR0ZXJuIGFuZCBzZXJ2aWNlLW5hbWUtcGF0dGVybg0KLSAgICAgICAgICovDQotICAgICAgICANCi0gICAgICAgIGlmICghZG9lc1BhdHRlcm5NYXRjaChwb3J0aW5mby5nZXRQb3J0TmFtZSgpLCBoY3QuZ2V0UG9ydE5hbWVQYXR0ZXJuKCkpKSB7DQotICAgICAgICAgICAgICAgIC8vIHdlJ3ZlIGNoZWNrZWQgdGhlIHBvcnQtbmFtZS1wYXR0ZXJuLCBhbmQgZGlkbid0IGZpbmQgYSBtYXRjaCwgbm8gbmVlZCB0byBjb250aW51ZQ0KLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIGlmICghZG9lc1BhdHRlcm5NYXRjaChwb3J0aW5mby5nZXRTZXJ2aWNlTmFtZSgpLCBoY3QuZ2V0U2VydmljZU5hbWVQYXR0ZXJuKCkpKSB7DQotICAgICAgICAgICAgICAgIC8vIHdlJ3ZlIGNoZWNrZWQgdGhlIHNlcnZpY2UtbmFtZS1wYXR0ZXJuLCBhbmQgZGlkbid0IGZpbmQgYSBtYXRjaCwgbm8gbmVlZCB0byBjb250aW51ZQ0KLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBDbGFzcyBsb2FkQ2xhc3MoU3RyaW5nIGNsYXp6KSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIHJldHVybiBmb3JOYW1lKGNsYXp6LCB0cnVlLCBnZXRDb250ZXh0Q2xhc3NMb2FkZXIoKSk7DQotICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICB0aHJvdyBlOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGRvZXNQYXR0ZXJuTWF0Y2goUU5hbWUgcG9ydEluZm9RTmFtZSwgUU5hbWUgcGF0dGVybikgew0KLSAgICAgICAgaWYgKHBhdHRlcm4gPT0gbnVsbCkNCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgIHZhbGlkYXRlUGF0dGVybihwYXR0ZXJuKTsNCi0gICAgICAgIC8vIGJ1aWxkIHVwIHRoZSBzdHJpbmdzIGFjY29yZGluZyB0byB0aGUgcmVndWxhciBleHByZXNzaW9uIGRlZmluZWQgYXQgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL2phdmFlZV93ZWJfc2VydmljZXNfMV8yLnhzZA0KLSAgICAgICAgLy8gdXNlIHRoZSBwcmVmaXgsIG5vdCB0aGUgbGl0ZXJhbCBuYW1lc3BhY2UNCi0gICAgICAgIFN0cmluZyBwb3J0SW5mb1ByZWZpeCA9IHBvcnRJbmZvUU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7IC8vUHJlZml4KCk7DQotICAgICAgICBTdHJpbmcgcG9ydEluZm9Mb2NhbFBhcnQgPSBwb3J0SW5mb1FOYW1lLmdldExvY2FsUGFydCgpOw0KLSAgICAgICAgU3RyaW5nIHBvcnRJbmZvU3RyaW5nID0gKChwb3J0SW5mb1ByZWZpeCA9PSBudWxsKSB8fCAocG9ydEluZm9QcmVmaXguZXF1YWxzKCIiKSkpID8gIiIgOiBwb3J0SW5mb1ByZWZpeCArICI6IjsNCi0gICAgICAgIHBvcnRJbmZvU3RyaW5nICs9IHBvcnRJbmZvTG9jYWxQYXJ0Ow0KLSAgICAgICAgDQotICAgICAgICBTdHJpbmcgcGF0dGVyblN0cmluZ1ByZWZpeCA9IHBhdHRlcm4uZ2V0TmFtZXNwYWNlVVJJKCk7IC8vUHJlZml4KCk7DQotICAgICAgICBTdHJpbmcgcGF0dGVybkluZm9Mb2NhbFBhcnQgPSBwYXR0ZXJuLmdldExvY2FsUGFydCgpOw0KLSAgICAgICAgU3RyaW5nIHBhdHRlcm5TdHJpbmcgPSAoKHBhdHRlcm5TdHJpbmdQcmVmaXggPT0gbnVsbCkgfHwgKHBhdHRlcm5TdHJpbmdQcmVmaXguZXF1YWxzKCIiKSkpID8gIiIgOiBwYXR0ZXJuU3RyaW5nUHJlZml4ICsgIjoiOw0KLSAgICAgICAgcGF0dGVyblN0cmluZyArPSBwYXR0ZXJuSW5mb0xvY2FsUGFydDsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gbm93IG1hdGNoIHRoZSBwb3J0SW5mb1FOYW1lIHRvIHRoZSB1c2VyIHBhdHRlcm4NCi0gICAgICAgIC8vIEJ1dCBmaXJzdCwgY29udmVydCB0aGUgdXNlciBwYXR0ZXJuIHRvIGEgcmVndWxhciBleHByZXNzaW9uLiAgUmVtZW1iZXIsIHRoZSBvbmx5IG5vbi1RTmFtZSBjaGFyYWN0ZXIgYWxsb3dlZCBpcyAiKiIsIHdoaWNoDQotICAgICAgICAvLyBpcyBhIHdpbGRjYXJkLCB3aXRoIG9idmlvdXMgcmVzdHJpY3Rpb25zIG9uIHdoYXQgY2hhcmFjdGVycyBjYW4gbWF0Y2ggKGZvciBleGFtcGxlLCBhIC5qYXZhIGZpbGVuYW1lIGNhbm5vdCBjb250YWluIHBlcmVudGhlc2VzKS4NCi0gICAgICAgIC8vIFdlJ2xsIGp1c3QgdXNlIHBhcnQgb2YgdGhlIGFib3ZlIHJlZyBleCB0byBmb3JtIHRoZSBhcHByb3ByaWF0ZSByZXN0cmljdGlvbnMgb24gdGhlIHVzZXItc3BlY2lmaWVkICIqIiBjaGFyYWN0ZXI6DQotICAgICAgICBQYXR0ZXJuIHVzZXJwID0gUGF0dGVybi5jb21waWxlKHBhdHRlcm5TdHJpbmcucmVwbGFjZSgiKiIsICIoXFx3fFxcLnwtfF8pKiIpKTsNCi0gICAgICAgIE1hdGNoZXIgdXNlcm0gPSB1c2VycC5tYXRjaGVyKHBvcnRJbmZvU3RyaW5nKTsNCi0gICAgICAgIGJvb2xlYW4gbWF0Y2ggPSB1c2VybS5tYXRjaGVzKCk7DQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICBpZiAoIW1hdGNoKSB7DQotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiUGF0dGVybiBtYXRjaCBmYWlsZWQ6IFwiIiArIHBvcnRJbmZvU3RyaW5nICsgIlwiIGRvZXMgbm90IG1hdGNoIFwiIiArIHBhdHRlcm5TdHJpbmcgKyAiXCIiKTsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlBhdHRlcm4gbWF0Y2ggc3VjY2VlZGVkOiBcIiIgKyBwb3J0SW5mb1N0cmluZyArICJcIiBtYXRjaGVzIFwiIiArIHBhdHRlcm5TdHJpbmcgKyAiXCIiKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbWF0Y2g7DQotICAgICAgICANCi0gICAgfQ0KLSAgICANCi0gICAgDQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdmFsaWRhdGVQYXR0ZXJuKFFOYW1lIHBhdHRlcm4pIHsNCi0gICAgICAgIFN0cmluZyBwYXR0ZXJuU3RyaW5nUHJlZml4ID0gcGF0dGVybi5nZXRQcmVmaXgoKTsNCi0gICAgICAgIFN0cmluZyBwYXR0ZXJuSW5mb0xvY2FsUGFydCA9IHBhdHRlcm4uZ2V0TG9jYWxQYXJ0KCk7DQotICAgICAgICBTdHJpbmcgcGF0dGVyblN0cmluZyA9ICgocGF0dGVyblN0cmluZ1ByZWZpeCA9PSBudWxsKSB8fCAocGF0dGVyblN0cmluZ1ByZWZpeC5lcXVhbHMoIiIpKSkgPyAiIiA6IHBhdHRlcm5TdHJpbmdQcmVmaXggKyAiOiI7DQotICAgICAgICBwYXR0ZXJuU3RyaW5nICs9IHBhdHRlcm5JbmZvTG9jYWxQYXJ0Ow0KLQ0KLSAgICAgICAgLyoNCi0gICAgICAgICAqIEJlbG93IHBhdHRlcm4gaXMgcG9ydGVkIGZyb206ICBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvamF2YWVlX3dlYl9zZXJ2aWNlc18xXzIueHNkDQotICAgICAgICAgKiBTY2hlbWEgcmVndWxhciBleHByZXNzaW9ucyBhcmUgZGVmaW5lZCBkaWZmZXJlbnRseSBmcm9tIEphdmEgcmVndWxhciBleHByZXNzaW9ucyB3aGljaCBhcmUgZGlmZmVyZW50IGZyb20gUGVybCByZWd1bGFyDQotICAgICAgICAgKiBleHByZXNzaW9ucy4gIEkndmUgY29udmVydGVkIHRoZSBwYXR0ZXJuIGRlZmluZWQgaW4gdGhlIGFib3ZlIGxpbmtlZCBzY2hlbWEgdG8gaXRzIEphdmEgZXF1aXZhbGVudCwgYXMgYmVzdCBhcyBJIGNhbi4NCi0gICAgICAgICAqIA0KLSAgICAgICAgICogU2NoZW1hIHJlZyBleDogICJcKnwoW1xpLVs6XV1bXGMtWzpdXSo6KT9bXGktWzpdXVtcYy1bOl1dKlwqPyINCi0gICAgICAgICAqIEphdmEgcmVnIGV4OiAgIlxcKnwoKFxcd3xfKShcXHd8XFwufC18XykqOik/KFxcd3xfKShcXHd8XFwufC18XykqXFwqPyINCi0gICAgICAgICAqLw0KLQ0KLSAgICAgICAgLy8gZmlyc3QsIGNvbmZpcm0gdGhlIGRlZmluZWQgcGF0dGVybiBpcyBsZWdhbA0KLSAgICAgICAgUGF0dGVybiBwID0gUGF0dGVybi5jb21waWxlKCJcXCp8KChcXHd8XykoXFx3fFxcLnwtfF8pKjopPyhcXHd8XykoXFx3fFxcLnwtfF8pKlxcKj8iKTsNCi0gICAgICAgIE1hdGNoZXIgbSA9IHAubWF0Y2hlcihwYXR0ZXJuU3RyaW5nKTsNCi0gICAgICAgIGlmICghbS5tYXRjaGVzKCkpIHsNCi0gICAgICAgICAgICAvLyBwYXR0ZXJuIGRlZmluZWQgYnkgdXNlciBpbiBoYW5kbGVyIGNoYWluIHhtbCBmaWxlIGlzIGlsbGVnYWwgLS0gcmVwb3J0IGl0IGJ1dCBjb250aW51ZQ0KLSAgICAgICAgICAgIGxvZy53YXJuKCJQYXR0ZXJuIGRlZmluZWQgYnkgdXNlciBpcyBpbGxlZ2FsOiAgXCIiICsgcGF0dGVyblN0cmluZyArICJcIiBkb2VzIG5vdCBtYXRjaCByZWd1bGFyIGV4cHJlc3Npb24gaW4gc2NoZW1hIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS9qYXZhZWVfd2ViX3NlcnZpY2VzXzFfMi54c2QuICBQYXR0ZXJuIG1hdGNoaW5nIHNob3VsZCBub3cgYmUgY29uc2lkZXJlZCBcImJlc3QtZWZmb3J0LlwiIik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFJldHVybiB0aGUgY2xhc3MgZm9yIHRoaXMgbmFtZQ0KLSAgICAgKg0KLSAgICAgKiBAcmV0dXJuIENsYXNzDQotICAgICAqLw0KLSAgICBwcml2YXRlIHN0YXRpYyBDbGFzcyBmb3JOYW1lKGZpbmFsIFN0cmluZyBjbGFzc05hbWUsIGZpbmFsIGJvb2xlYW4gaW5pdGlhbGl6ZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gew0KLSAgICAgICAgLy8gTk9URTogVGhpcyBtZXRob2QgbXVzdCByZW1haW4gcHJvdGVjdGVkIGJlY2F1c2UgaXQgdXNlcyBBY2Nlc3NDb250cm9sbGVyDQotICAgICAgICBDbGFzcyBjbCA9IG51bGw7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIGNsID0gKENsYXNzKUFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKA0KLSAgICAgICAgICAgICAgICAgICAgbmV3IFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24oKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeXsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiSGFuZGxlclJlc29sdmVySW1wbCBhdHRlbXB0aW5nIHRvIGxvYWQgQ2xhc3M6ICIrY2xhc3NOYW1lKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSwgaW5pdGlhbGl6ZSwgY2xhc3NMb2FkZXIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyBTaG91bGQgdGhlIGV4Y2VwdGlvbiBiZSBzd2FsbG93ZWQgPw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJIYW5kbGVyUmVzb2x2ZXJJbXBsIGNhbm5vdCBsb2FkIHRoZSBmb2xsb3dpbmcgY2xhc3MgVGhyb3dhYmxlIEV4Y2VwdGlvbiBPY2N1cmVkOiAiICsgY2xhc3NOYW1lKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uKCJIYW5kbGVyUmVzb2x2ZXJJbXBsIGNhbm5vdCBsb2FkIHRoZSBmb2xsb3dpbmcgY2xhc3MgVGhyb3dhYmxlIEV4Y2VwdGlvbiBPY2N1cmVkOiIgKyBjbGFzc05hbWUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICk7DQotICAgICAgICB9IGNhdGNoIChQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJFeGNlcHRpb24gdGhyb3duIGZyb20gQWNjZXNzQ29udHJvbGxlcjogIiArIGUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB0aHJvdyAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbillLmdldEV4Y2VwdGlvbigpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGNsOw0KLSAgICB9DQotDQotDQotICAgIC8qKiBAcmV0dXJuIENsYXNzTG9hZGVyICovDQotICAgIHByaXZhdGUgc3RhdGljIENsYXNzTG9hZGVyIGdldENvbnRleHRDbGFzc0xvYWRlcigpIHsNCi0gICAgICAgIC8vIE5PVEU6IFRoaXMgbWV0aG9kIG11c3QgcmVtYWluIHByaXZhdGUgYmVjYXVzZSBpdCB1c2VzIEFjY2Vzc0NvbnRyb2xsZXINCi0gICAgICAgIENsYXNzTG9hZGVyIGNsID0gbnVsbDsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgY2wgPSAoQ2xhc3NMb2FkZXIpQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoDQotICAgICAgICAgICAgICAgICAgICBuZXcgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbigpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICk7DQotICAgICAgICB9IGNhdGNoIChQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJFeGNlcHRpb24gdGhyb3duIGZyb20gQWNjZXNzQ29udHJvbGxlcjogIiArIGUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGUuZ2V0RXhjZXB0aW9uKCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGNsOw0KLSAgICB9DQotICAgIA0KLSAgICBzdGF0aWMgew0KLSAgICAgICAgcHJvdG9jb2xCaW5kaW5nc01hcC5wdXQoIiMjU09BUDExX0hUVFAiLCAgICAgICAgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC9odHRwIik7DQotICAgICAgICBwcm90b2NvbEJpbmRpbmdzTWFwLnB1dCgiIyNTT0FQMTFfSFRUUF9NVE9NIiwgICAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwL2h0dHA/bXRvbT10cnVlIik7DQotICAgICAgICBwcm90b2NvbEJpbmRpbmdzTWFwLnB1dCgiIyNTT0FQMTJfSFRUUCIsICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwL2JpbmRpbmdzL0hUVFAvIik7DQotICAgICAgICBwcm90b2NvbEJpbmRpbmdzTWFwLnB1dCgiIyNTT0FQMTJfSFRUUF9NVE9NIiwgICAiaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwL2JpbmRpbmdzL0hUVFAvP210b209dHJ1ZSIpOw0KLSAgICAgICAgcHJvdG9jb2xCaW5kaW5nc01hcC5wdXQoIiMjWE1MX0hUVFAiLCAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgvd3NkbC9odHRwIik7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc3BpL2hhbmRsZXIvSGFuZGxlclJlc29sdmVySW1wbC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc3BpL2hhbmRsZXIvSGFuZGxlclJlc29sdmVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDY4MmQ2Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NwaS9oYW5kbGVyL0hhbmRsZXJSZXNvbHZlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNwaS5oYW5kbGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLkV4Y2VwdGlvbkZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24ueG1sLmhhbmRsZXIuSGFuZGxlckNoYWluVHlwZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi54bWwuaGFuZGxlci5IYW5kbGVyVHlwZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5pMThuLk1lc3NhZ2VzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmxpZmVjeWNsZS5MaWZlY3ljbGVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5Mb2dnaW5nQ29udHJvbDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5IYW5kbGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5IYW5kbGVyUmVzb2x2ZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLkxvZ2ljYWxIYW5kbGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5Qb3J0SW5mbzsNCi1pbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuc29hcC5TT0FQSGFuZGxlcjsNCi1pbXBvcnQgamF2YS5pby5GaWxlOw0KLWltcG9ydCBqYXZhLm5ldC5VUkk7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotLyoqDQotICogVGhpcyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgSGFuZGxlclJlc29sdmVyfSB0aGF0IGNhbiBiZSB1c2VkIHdpdGggYSBKQVgtV1MgY2xpZW50DQotICogdG8gc2V0IHRoZSBoYW5kbGVyIGxpc3QuDQotICoNCi0gKiBAc2VlIGphdmF4LnhtbC53cy5TZXJ2aWNlI3NldEhhbmRsZXJSZXNvbHZlcihIYW5kbGVyUmVzb2x2ZXIpDQotICovDQotcHVibGljIGNsYXNzIEhhbmRsZXJSZXNvbHZlckltcGwgZXh0ZW5kcyBCYXNlSGFuZGxlclJlc29sdmVyIHsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEhhbmRsZXJSZXNvbHZlckltcGwuY2xhc3MpOw0KLQ0KLSAgICAvKioNCi0gICAgICogQ29uc3RydWN0b3INCi0gICAgICogDQotICAgICAqIEBwYXJhbSBmaWxlUGF0aCB0aGUgcGF0aCB0byB0aGUgaGFuZGxlciBjb25maWd1cmF0aW9uIGZpbGUgaW4gVVJJIGZvcm1hdA0KLSAgICAgKi8NCi0gICAgcHVibGljIEhhbmRsZXJSZXNvbHZlckltcGwoU3RyaW5nIGZpbGVQYXRoKSB7DQotICAgICAgICBzdXBlcihmaWxlUGF0aCk7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBDb25zdHJ1Y3Rvcg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGZpbGVVUkkgdGhlIDxjb2RlPlVSSTwvY29kZT4gb2YgdGhlIGhhbmRsZXIgY29uZmlndXJhdGlvbiBmaWxlDQotICAgICAqLw0KLSAgICBwdWJsaWMgSGFuZGxlclJlc29sdmVySW1wbChVUkkgZmlsZVVSSSkgew0KLSAgICAgICAgdGhpcyhmaWxlVVJJLnRvU3RyaW5nKCkpOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogQ29uc3RydWN0b3INCi0gICAgICogDQotICAgICAqIEBwYXJhbSBmaWxlIHRoZSBoYW5kbGVyIGNvbmZpZ3VyYXRpb24gZmlsZQ0KLSAgICAgKi8NCi0gICAgcHVibGljIEhhbmRsZXJSZXNvbHZlckltcGwoRmlsZSBmaWxlKSB7DQotICAgICAgICB0aGlzKGZpbGUudG9VUkkoKSk7DQotICAgIH0NCi0gICAgDQotICAgIC8qDQotICAgICAqICAobm9uLUphdmFkb2MpDQotICAgICAqIEBzZWUgamF2YXgueG1sLndzLmhhbmRsZXIuSGFuZGxlclJlc29sdmVyI2dldEhhbmRsZXJDaGFpbihqYXZheC54bWwud3MuaGFuZGxlci5Qb3J0SW5mbykNCi0gICAgICovDQotICAgIHB1YmxpYyBMaXN0PEhhbmRsZXI+IGdldEhhbmRsZXJDaGFpbihQb3J0SW5mbyBwb3J0aW5mbykgew0KLSAgICAgICAgQXJyYXlMaXN0PEhhbmRsZXI+IGhhbmRsZXJzID0gbmV3IEFycmF5TGlzdDxIYW5kbGVyPigpOw0KLSAgICAgICAgSXRlcmF0b3IgaXQgPSBoYW5kbGVyQ2hhaW5zVHlwZSA9PSBudWxsID8gbnVsbCA6IGhhbmRsZXJDaGFpbnNUeXBlLmdldEhhbmRsZXJDaGFpbigpLml0ZXJhdG9yKCk7DQotDQotICAgICAgICB3aGlsZSAoKGl0ICE9IG51bGwpICYmIChpdC5oYXNOZXh0KCkpKSB7DQotICAgICAgICAgICAgSGFuZGxlckNoYWluVHlwZSBoYW5kbGVyQ2hhaW5UeXBlID0gKChIYW5kbGVyQ2hhaW5UeXBlKWl0Lm5leHQoKSk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gaWYgIW1hdGNoLCBjb250aW51ZSAodG8gbmV4dCBjaGFpbikNCi0gICAgICAgICAgICBpZiAoIShjaGFpblJlc29sdmVzVG9Qb3J0KGhhbmRsZXJDaGFpblR5cGUsIHBvcnRpbmZvKSkpDQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIExpc3Q8SGFuZGxlclR5cGU+IGhhbmRsZXJUeXBlTGlzdCA9IGhhbmRsZXJDaGFpblR5cGUuZ2V0SGFuZGxlcigpOw0KLSAgICAgICAgICAgIEl0ZXJhdG9yIGh0ID0gaGFuZGxlclR5cGVMaXN0Lml0ZXJhdG9yKCk7DQotICAgICAgICAgICAgd2hpbGUgKGh0Lmhhc05leHQoKSkgew0KLSAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgSGFuZGxlclR5cGUgaGFuZGxlclR5cGUgPSAoSGFuZGxlclR5cGUpaHQubmV4dCgpOw0KLSAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgLy8gVE9ETyBtdXN0IGRvIGJldHRlciBqb2IgY29tcGFyaW5nIHRoZSBoYW5kbGVyVHlwZSB3aXRoIHRoZSBQb3J0SW5mbyBwYXJhbQ0KLSAgICAgICAgICAgICAgICAvLyB0byBzZWUgaWYgdGhlIGN1cnJlbnQgaXRlcmF0b3IgaGFuZGxlciBpcyBpbnRlbmRlZCBmb3IgdGhpcyBzZXJ2aWNlLg0KLQ0KLSAgICAgICAgICAgICAgICAvLyBUT0RPIHJldmlldzogbmVlZCB0byBjaGVjayBmb3IgbnVsbCBnZXRIYW5kbGVyQ2xhc3MoKSByZXR1cm4/DQotICAgICAgICAgICAgICAgIC8vIG9yIHdpbGwgc2NoZW1hIG5vdCBhbGxvdyBpdD8NCi0gICAgICAgICAgICAgICAgU3RyaW5nIHBvcnRIYW5kbGVyID0gaGFuZGxlclR5cGUuZ2V0SGFuZGxlckNsYXNzKCkuZ2V0VmFsdWUoKTsNCi0gICAgICAgICAgICAgICAgSGFuZGxlciBoYW5kbGVyID0gbnVsbDsNCi0gICAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICAvLyAgaW5zdGFudGlhdGUgcG9ydEhhbmRsZXIgY2xhc3MgDQotICAgICAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgICAgICBoYW5kbGVyID0gY3JlYXRlSGFuZGxlckluc3RhbmNlKGxvYWRDbGFzcyhwb3J0SGFuZGxlcikpOw0KLSAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogc2hvdWxkIHdlIGp1c3QgaWdub3JlIHRoaXMgcHJvYmxlbT8NCi0gICAgICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkICYmIGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlN1Y2Nlc3NmdWxseSBpbnN0YW50aWF0ZWQgdGhlIGNsYXNzOiAiICsgaGFuZGxlci5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgLy8gOS4yLjEuMiBzb3J0IHRoZW0gYnkgTG9naWNhbCwgdGhlbiBTT0FQDQotICAgICAgICAgICAgICAgIGlmIChMb2dpY2FsSGFuZGxlci5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGhhbmRsZXIuZ2V0Q2xhc3MoKSkpDQotICAgICAgICAgICAgICAgICAgICBoYW5kbGVycy5hZGQoKExvZ2ljYWxIYW5kbGVyKSBoYW5kbGVyKTsNCi0gICAgICAgICAgICAgICAgZWxzZSBpZiAoU09BUEhhbmRsZXIuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShoYW5kbGVyLmdldENsYXNzKCkpKQ0KLSAgICAgICAgICAgICAgICAgICAgLy8gaW5zdGFuY2VvZiBQcm90b2NvbEhhbmRsZXINCi0gICAgICAgICAgICAgICAgICAgIGhhbmRsZXJzLmFkZCgoU09BUEhhbmRsZXIpIGhhbmRsZXIpOw0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChIYW5kbGVyLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oaGFuZGxlci5nZXRDbGFzcygpKSkgew0KLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0TWVzc2FnZSgiaGFuZGxlckNoYWluRXJyMSIsIGhhbmRsZXINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpKTsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldE1lc3NhZ2UoImhhbmRsZXJDaGFpbkVycjIiLCBoYW5kbGVyDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldENsYXNzKCkuZ2V0TmFtZSgpKSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gaGFuZGxlcnM7DQotICAgIH0NCi0gICAgDQotICAgIC8vQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBoYW5kbGVyIGNsYXNzIGFuZCBwZXJmb3JtIGFwcHJvcHJpYXRlIGxpZmVjeWNsZSBhY3Rpdml0aWVzDQotICAgIC8vdG8gaXQuDQotICAgIHByaXZhdGUgSGFuZGxlciBjcmVhdGVIYW5kbGVySW5zdGFuY2UoQ2xhc3MgaGFuZGxlckNsYXNzKSB0aHJvd3MgTGlmZWN5Y2xlRXhjZXB0aW9uIHsNCi0gICAgICAgIGlmIChoYW5kbGVyQ2xhc3MgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkuDQotICAgICAgICAgICAgICBtYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJjcmVhdGVIYW5kbGVySW5zdGFuY2VFcnIiKSk7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIC8vUmVzb3VyY2UgaW5qZWN0aW9uIG5vdCBzdXBwb3J0ZWQuDQotICAgICAgICANCi0gICAgICAgIE9iamVjdCBvYmplY3QgPSBudWxsOw0KLSAgICAgICAgDQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIG9iamVjdCA9IGhhbmRsZXJDbGFzcy5uZXdJbnN0YW5jZSgpOw0KLSAgICAgICAgfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKTsNCi0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7DQotICAgICAgICB9DQotICAgICAgICAgICAgICAgIA0KLSAgICAgICAgLy9JbnZva2UgUG9zdENvbnN0cnVjdA0KLSAgICAgICAgTGlmZWN5Y2xlTWFuYWdlciBtYW5hZ2VyID0gbmV3IExpZmVjeWNsZU1hbmFnZXIob2JqZWN0KTsNCi0gICAgICAgIG1hbmFnZXIuaW52b2tlUG9zdENvbnN0cnVjdCgpOw0KLSAgICAgICAgDQotICAgICAgICByZXR1cm4gKEhhbmRsZXIpIG9iamVjdDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zcGkvaGFuZGxlci9MaWZlY3ljbGVNYW5hZ2VyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zcGkvaGFuZGxlci9MaWZlY3ljbGVNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxMTIzNzcuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc3BpL2hhbmRsZXIvTGlmZWN5Y2xlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc3BpLmhhbmRsZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmxpZmVjeWNsZS5CYXNlTGlmZWN5Y2xlTWFuYWdlcjsNCi0NCi1pbXBvcnQgamF2YXguYW5ub3RhdGlvbi5Qb3N0Q29uc3RydWN0Ow0KLWltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlByZURlc3Ryb3k7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247DQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkFubm90YXRlZEVsZW1lbnQ7DQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsNCi1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi1wdWJsaWMgY2xhc3MgTGlmZWN5Y2xlTWFuYWdlciBleHRlbmRzIEJhc2VMaWZlY3ljbGVNYW5hZ2VyIHsNCi0NCi0gICAgcHVibGljIExpZmVjeWNsZU1hbmFnZXIoT2JqZWN0IGluc3RhbmNlKSB7DQotICAgICAgICB0aGlzLmluc3RhbmNlID0gaW5zdGFuY2U7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIE1ldGhvZCBnZXRQb3N0Q29uc3RydWN0TWV0aG9kKCkgew0KLSAgICAgICAgaWYgKGluc3RhbmNlICE9IG51bGwpIHsNCi0gICAgICAgICAgICBMaXN0PE1ldGhvZD4gbWV0aG9kcyA9IGdldE1ldGhvZHMoaW5zdGFuY2UuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgZm9yIChNZXRob2QgbWV0aG9kIDogbWV0aG9kcykgew0KLSAgICAgICAgICAgICAgICBpZiAoZ2V0QW5ub3RhdGlvbihtZXRob2QsUG9zdENvbnN0cnVjdC5jbGFzcykgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1ldGhvZDsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBNZXRob2QgZ2V0UHJlRGVzdHJveU1ldGhvZCgpIHsNCi0gICAgICAgIGlmIChpbnN0YW5jZSAhPSBudWxsKSB7DQotICAgICAgICAgICAgTGlzdDxNZXRob2Q+IG1ldGhvZHMgPSBnZXRNZXRob2RzKGluc3RhbmNlLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgIGZvciAoTWV0aG9kIG1ldGhvZCA6IG1ldGhvZHMpIHsNCi0gICAgICAgICAgICAgICAgaWYgKGdldEFubm90YXRpb24obWV0aG9kLFByZURlc3Ryb3kuY2xhc3MpICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBtZXRob2Q7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogR2V0cyBhbGwgb2YgdGhlIG1ldGhvZHMgaW4gdGhpcyBjbGFzcyBhbmQgdGhlIHN1cGVyIGNsYXNzZXMNCi0gICAgICoNCi0gICAgICogQHBhcmFtIGJlYW5DbGFzcw0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqLw0KLSAgICBwcml2YXRlIExpc3Q8TWV0aG9kPiBnZXRNZXRob2RzKGZpbmFsIENsYXNzIGJlYW5DbGFzcykgew0KLSAgICAgICAgLy8gVGhpcyBjbGFzcyBtdXN0IHJlbWFpbiBwcml2YXRlIGR1ZSB0byBKYXZhIDIgU2VjdXJpdHkgY29uY2VybnMNCi0gICAgICAgIExpc3Q8TWV0aG9kPiBtZXRob2RzOw0KLSAgICAgICAgbWV0aG9kcyA9IChMaXN0PE1ldGhvZD4pQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoDQotICAgICAgICAgICAgICAgIG5ldyBQcml2aWxlZ2VkQWN0aW9uKCkgew0KLSAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxNZXRob2Q+IG1ldGhvZHMgPSBuZXcgQXJyYXlMaXN0PE1ldGhvZD4oKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyBjbHMgPSBiZWFuQ2xhc3M7DQotICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGNscyAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGhvZFtdIG1ldGhvZEFycmF5ID0gY2xzLmdldERlY2xhcmVkTWV0aG9kcygpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKE1ldGhvZCBtZXRob2QgOiBtZXRob2RBcnJheSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kcy5hZGQobWV0aG9kKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHMgPSBjbHMuZ2V0U3VwZXJjbGFzcygpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWV0aG9kczsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgKTsNCi0NCi0gICAgICAgIHJldHVybiBtZXRob2RzOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogR2V0IGFuIGFubm90YXRpb24uICBUaGlzIGlzIHdyYXBwZXJlZCB0byBhdm9pZCBhIEphdmEyU2VjdXJpdHkgdmlvbGF0aW9uLg0KLSAgICAgKiBAcGFyYW0gY2xzIENsYXNzIHRoYXQgY29udGFpbnMgYW5ub3RhdGlvbiANCi0gICAgICogQHBhcmFtIGFubm90YXRpb24gQ2xhc3Mgb2YgcmVxdXJlc3RlZCBBbm5vdGF0aW9uDQotICAgICAqIEByZXR1cm4gYW5ub3RhdGlvbiBvciBudWxsDQotICAgICAqLw0KLSAgICBwcml2YXRlIHN0YXRpYyBBbm5vdGF0aW9uIGdldEFubm90YXRpb24oZmluYWwgQW5ub3RhdGVkRWxlbWVudCBlbGVtZW50LCBmaW5hbCBDbGFzcyBhbm5vdGF0aW9uKSB7DQotICAgICAgICByZXR1cm4gKEFubm90YXRpb24pIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkQWN0aW9uKCkgew0KLSAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudC5nZXRBbm5vdGF0aW9uKGFubm90YXRpb24pOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0pOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NwaS9taWdyYXRvci9BcHBsaWNhdGlvbkNvbnRleHRNaWdyYXRvci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc3BpL21pZ3JhdG9yL0FwcGxpY2F0aW9uQ29udGV4dE1pZ3JhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxZGEyZDEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc3BpL21pZ3JhdG9yL0FwcGxpY2F0aW9uQ29udGV4dE1pZ3JhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc3BpLm1pZ3JhdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLk1lc3NhZ2VDb250ZXh0OwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBUaGUgQ29udGV4dFByb3BlcnR5TWlncmF0b3IgaXMgYSB1dGlsaXR5IGludGVyZmFjZSB0aGF0IGNhbiBiZSBpbXBsZW1lbnRlZCB0byBoYW5kbGUgYW55Ci0gKiB0cmFuc2Zvcm1hdGlvbiBvciBtaWdyYXRpb24gdGhhdCBuZWVkcyB0byBoYXBwZW4gYmV0d2VlbiB0aGUgaW50ZXJuYWwgSkFYLVdTIE1lc3NhZ2VDb250ZXh0IGZvciBhCi0gKiByZXF1ZXN0IG9yIGEgcmVzcG9uc2UgYW5kIHRoZSBhc3NvY2lhdGVkIGNvbnRleHQgZm9yIHRoZSBjbGllbnQgb3IgdGhlIHNlcnZlci4KLSAqIDxwLz4KLSAqIGNsaWVudCAtIE9uIHRoZSBjbGllbnQgc2lkZSwgdGhpcyB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZSByZXF1ZXN0IG9yIHJlc3BvbnNlIGNvbnRleHQgZnJvbSB0aGUKLSAqIEJpbmRpbmdQcm92aWRlciBpbnN0YW5jZS4KLSAqIDxwLz4KLSAqIHNlcnZlciAtIE9uIHRoZSBzZXJ2ZXIgc2lkZSwgdGhpcyB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZSBqYXZheC54bWwud3MuaGFuZGxlci5NZXNzYWdlQ29udGV4dAotICogaW5zdGFuY2UgdGhhdCB0aGUgc2VydmljZSBlbmRwb2ludCB3aWxsIHNlZS4gIFRoaXMgaXMgdGhlIHNhbWUgY29udGV4dCB0aGF0IHdpbGwgYmUgaW5qZWN0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBBcHBsaWNhdGlvbkNvbnRleHRNaWdyYXRvciB7Ci0KLSAgICAvKioKLSAgICAgKiBJcyBjYWxsZWQgdG8gaGFuZGxlIHByb3BlcnR5IG1pZ3JhdGlvbiBGUk9NIHRoZSB1c2VyIGNvbnRleHQgKEJpbmRpbmdQcm92aWRlciBjbGllbnQgY29udGV4dAotICAgICAqIG9yIHNlcnZlciBNZXNzYWdlQ29udGV4dCkgVE8gYSB0YXJnZXQgaW50ZXJuYWwgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLk1lc3NhZ2VDb250ZXh0LgotICAgICAqCi0gICAgICogQHBhcmFtIHVzZXJDb250ZXh0ICAgIC0gVGhlIHNvdXJjZSBjb250ZXh0IHRoYXQgY29udGFpbnMgdGhlIHVzZXIgY29udGV4dCBwcm9wZXJ0aWVzLgotICAgICAqIEBwYXJhbSBtZXNzYWdlQ29udGV4dCAtIFRoZSB0YXJnZXQgTWVzc2FnZUNvbnRleHQgdG8gcmVjZWl2ZSB0aGUgcHJvcGVydGllcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBtaWdyYXRlUHJvcGVydGllc1RvTWVzc2FnZUNvbnRleHQoTWFwPFN0cmluZywgT2JqZWN0PiB1c2VyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQpOwotCi0gICAgLyoqCi0gICAgICogSXMgY2FsbGVkIHRvIGhhbmRsZSBwcm9wZXJ0eSBtaWdyYXRvbSBGUk9NIHRoZSBpbnRlcm5hbCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUuTWVzc2FnZUNvbnRleHQKLSAgICAgKiBUTyBhIHRhcmdldCB1c2VyIGNvbnRleHQgKEJpbmRpbmdQcm92aWRlciBjbGllbnQgY29udGV4dCBvciBzZXJ2ZXIgTWVzc2FnZUNvbnRleHQpIHRoYXQgdGhlCi0gICAgICogdXNlciB3aWxsIGFjY2Vzcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSB1c2VyQ29udGV4dCAgICAtIFRoZSB0YXJnZXQgdXNlciBjb250ZXh0IHRvIHJlY2VpdmUgdGhlIHByb3BlcnRpZXMuCi0gICAgICogQHBhcmFtIG1lc3NhZ2VDb250ZXh0IC0gVGhlIHNvdXJjZSBNZXNzYWdlQ29udGV4dCB0aGF0IGNvbnRhaW5zIHRoZSBwcm9wZXJ0eSB2YWx1ZXMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgbWlncmF0ZVByb3BlcnRpZXNGcm9tTWVzc2FnZUNvbnRleHQoTWFwPFN0cmluZywgT2JqZWN0PiB1c2VyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NwaS9taWdyYXRvci9BcHBsaWNhdGlvbkNvbnRleHRNaWdyYXRvclV0aWwuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NwaS9taWdyYXRvci9BcHBsaWNhdGlvbkNvbnRleHRNaWdyYXRvclV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI1NTQ5My4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zcGkvbWlncmF0b3IvQXBwbGljYXRpb25Db250ZXh0TWlncmF0b3JVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNwaS5taWdyYXRvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLkV4Y2VwdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uU2VydmljZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaGFuZGxlci5NRVBDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaTE4bi5NZXNzYWdlczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLk1lc3NhZ2VDb250ZXh0LlNjb3BlOwotaW1wb3J0IGphdmEudXRpbC5BYnN0cmFjdFNldDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotcHVibGljIGNsYXNzIEFwcGxpY2F0aW9uQ29udGV4dE1pZ3JhdG9yVXRpbCB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coQXBwbGljYXRpb25Db250ZXh0TWlncmF0b3IuY2xhc3MpOwotCi0gICAgLyoqCi0gICAgICogUmVnaXN0ZXIgYSBuZXcgQ29udGV4dFByb3BlcnR5TWlncmF0b3IuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29uZmlndXJhdGlvbkNvbnRleHQKLSAgICAgKiBAcGFyYW0gY29udGV4dE1pZ3JhdG9yTGlzdElEIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBpbiB0aGUgQ29uZmlndXJhdGlvbkNvbnRleHQgdGhhdAotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbnMgdGhlIGxpc3Qgb2YgbWlncmF0b3JzLgotICAgICAqIEBwYXJhbSBtaWdyYXRvcgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRBcHBsaWNhdGlvbkNvbnRleHRNaWdyYXRvcihDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWd1cmF0aW9uQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNvbnRleHRNaWdyYXRvckxpc3RJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBwbGljYXRpb25Db250ZXh0TWlncmF0b3IgbWlncmF0b3IpIHsKLSAgICAgICAgTGlzdDxBcHBsaWNhdGlvbkNvbnRleHRNaWdyYXRvcj4gbWlncmF0b3JMaXN0ID0KLSAgICAgICAgICAgICAgICAoTGlzdDxBcHBsaWNhdGlvbkNvbnRleHRNaWdyYXRvcj4pY29uZmlndXJhdGlvbkNvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eShjb250ZXh0TWlncmF0b3JMaXN0SUQpOwotCi0gICAgICAgIGlmIChtaWdyYXRvckxpc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgbWlncmF0b3JMaXN0ID0gbmV3IExpbmtlZExpc3Q8QXBwbGljYXRpb25Db250ZXh0TWlncmF0b3I+KCk7Ci0gICAgICAgICAgICBjb25maWd1cmF0aW9uQ29udGV4dC5zZXRQcm9wZXJ0eShjb250ZXh0TWlncmF0b3JMaXN0SUQsIG1pZ3JhdG9yTGlzdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBzeW5jaHJvbml6ZWQgKG1pZ3JhdG9yTGlzdCkgewotICAgICAgICAgICAgLy8gQ2hlY2sgdG8gbWFrZSBzdXJlIHdlIGhhdmVuJ3QgYWxyZWFkeSBhZGRlZCB0aGlzIG1pZ3JhdG9yIHRvIHRoZQotICAgICAgICAgICAgLy8gbGlzdC4KLSAgICAgICAgICAgIExpc3RJdGVyYXRvcjxBcHBsaWNhdGlvbkNvbnRleHRNaWdyYXRvcj4gaXRyID0gbWlncmF0b3JMaXN0Lmxpc3RJdGVyYXRvcigpOwotICAgICAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBBcHBsaWNhdGlvbkNvbnRleHRNaWdyYXRvciBtID0gaXRyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBpZiAobS5nZXRDbGFzcygpLmVxdWFscyhtaWdyYXRvci5nZXRDbGFzcygpKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkFkZGluZyBBcHBsaWNhdGlvbkNvbnRleHRNaWdyYXRvcjogIiArIG1pZ3JhdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1pZ3JhdG9yTGlzdC5hZGQobWlncmF0b3IpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGNvbnRleHRNaWdyYXRvckxpc3RJRAotICAgICAqIEBwYXJhbSByZXF1ZXN0Q29udGV4dAotICAgICAqIEBwYXJhbSBtZXNzYWdlQ29udGV4dAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwZXJmb3JtTWlncmF0aW9uVG9NZXNzYWdlQ29udGV4dChTdHJpbmcgY29udGV4dE1pZ3JhdG9yTGlzdElELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHJlcXVlc3RDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCkgewotICAgICAgICBpZiAobWVzc2FnZUNvbnRleHQgPT0gbnVsbCkgewotICAgICAgICAJCi0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoIm51bGxNc2dDdHhFcnIiKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc2QgPSBtZXNzYWdlQ29udGV4dC5nZXRFbmRwb2ludERlc2NyaXB0aW9uKCkuZ2V0U2VydmljZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgIGlmIChzZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDdHggPSBzZC5nZXRBeGlzQ29uZmlnQ29udGV4dCgpOwotICAgICAgICAgICAgTGlzdDxBcHBsaWNhdGlvbkNvbnRleHRNaWdyYXRvcj4gbWlncmF0b3JMaXN0ID0gKExpc3Q8QXBwbGljYXRpb25Db250ZXh0TWlncmF0b3I+KSBjb25maWdDdHguZ2V0UHJvcGVydHkoY29udGV4dE1pZ3JhdG9yTGlzdElEKTsKLSAgICAgICAgICAgIGlmIChtaWdyYXRvckxpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBjb3B5IHRvIGF2b2lkIHVzaW5nIHNoYXJlZCBsaXN0Ci0gICAgICAgICAgICAgICAgTGlzdCBsaXN0Q1BNID0gbnVsbDsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBzeW5jaHJvbml6ZSBvbiBub24tbnVsbCBtaWdyYXRvckxpc3QKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQobWlncmF0b3JMaXN0KXsKLSAgICAgICAgICAgICAgICAgICAgIGxpc3RDUE0gPSBuZXcgQXJyYXlMaXN0KG1pZ3JhdG9yTGlzdCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIExpc3RJdGVyYXRvcjxBcHBsaWNhdGlvbkNvbnRleHRNaWdyYXRvcj4gaXRyID0gbGlzdENQTS5saXN0SXRlcmF0b3IoKTsgICAvLyBJdGVyYXRlIG92ZXIgbm9uLXNoYXJlZCBsaXN0Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgQXBwbGljYXRpb25Db250ZXh0TWlncmF0b3IgY3BtID0gaXRyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIm1pZ3JhdG9yOiAiICsgY3BtLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIi5taWdyYXRlUHJvcGVydGllc1RvTWVzc2FnZUNvbnRleHQiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogU3luY2hyb25pemluZyBoZXJlIGlzIGV4cGVuc2l2ZSB0b28uCi0gICAgICAgICAgICAgICAgICAgIC8vIElmIGEgY3BtIHJlcXVpcmVzIHN5bmNocm9uaXphdGlvbiwgaXQgc2hvdWxkIHByb3ZpZGUgaXQgaW5zaWRlIG9mIGl0cyBtaWdyYXRlUHJvcGVydGllc0Zyb21NZXNzYWdlQ29udGV4dCBpbXBsZW1lbnRhdGlvbi4KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGNwbS5taWdyYXRlUHJvcGVydGllc1RvTWVzc2FnZUNvbnRleHQobmV3IEFwcGxpY2F0aW9uUHJvcGVydHlNYXBSZWFkZXIocmVxdWVzdENvbnRleHQsIG1lc3NhZ2VDb250ZXh0LmdldE1FUENvbnRleHQoKSksIG1lc3NhZ2VDb250ZXh0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gY29udGV4dE1pZ3JhdG9yTGlzdElECi0gICAgICogQHBhcmFtIHJlc3BvbnNlQ29udGV4dAotICAgICAqIEBwYXJhbSBtZXNzYWdlQ29udGV4dAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwZXJmb3JtTWlncmF0aW9uRnJvbU1lc3NhZ2VDb250ZXh0KFN0cmluZyBjb250ZXh0TWlncmF0b3JMaXN0SUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByZXNwb25zZUNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQpIHsKLSAgICAgICAgaWYgKG1lc3NhZ2VDb250ZXh0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgibnVsbE1zZ0N0eEVyciIpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzZCA9IG1lc3NhZ2VDb250ZXh0LmdldEVuZHBvaW50RGVzY3JpcHRpb24oKS5nZXRTZXJ2aWNlRGVzY3JpcHRpb24oKTsKLSAgICAgICAgaWYgKHNkICE9IG51bGwpIHsKLSAgICAgICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0N0eCA9IHNkLmdldEF4aXNDb25maWdDb250ZXh0KCk7Ci0gICAgICAgICAgICBMaXN0PEFwcGxpY2F0aW9uQ29udGV4dE1pZ3JhdG9yPiBtaWdyYXRvckxpc3QgPQotICAgICAgICAgICAgICAgICAgICAoTGlzdDxBcHBsaWNhdGlvbkNvbnRleHRNaWdyYXRvcj4pY29uZmlnQ3R4LmdldFByb3BlcnR5KGNvbnRleHRNaWdyYXRvckxpc3RJRCk7Ci0KLSAgICAgICAgICAgIGlmIChtaWdyYXRvckxpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBjb3B5IHRvIGF2b2lkIHVzaW5nIHNoYXJlZCBsaXN0Ci0gICAgICAgICAgICAgICAgTGlzdCBsaXN0Q1BNID0gbnVsbDsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBzeW5jaHJvbml6ZSBvbiBub24tbnVsbCBtaWdyYXRvckxpc3QKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQobWlncmF0b3JMaXN0KXsKLSAgICAgICAgICAgICAgICAgICAgIGxpc3RDUE0gPSBuZXcgQXJyYXlMaXN0KG1pZ3JhdG9yTGlzdCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgTGlzdEl0ZXJhdG9yPEFwcGxpY2F0aW9uQ29udGV4dE1pZ3JhdG9yPiBpdHIgPSBsaXN0Q1BNLmxpc3RJdGVyYXRvcigpOyAgIC8vIEl0ZXJhdGUgb3ZlciBub24tc2hhcmVkIGxpc3QKLSAgICAgICAgICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICBBcHBsaWNhdGlvbkNvbnRleHRNaWdyYXRvciBjcG0gPSBpdHIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygibWlncmF0b3I6ICIgKyBjcG0uZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiLm1pZ3JhdGVQcm9wZXJ0aWVzRnJvbU1lc3NhZ2VDb250ZXh0Iik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBTeW5jaHJvbml6aW5nIGhlcmUgaXMgZXhwZW5zaXZlIHRvby4KLSAgICAgICAgICAgICAgICAgICAgLy8gSWYgYSBjcG0gcmVxdWlyZXMgc3luY2hyb25pemF0aW9uLCBpdCBzaG91bGQgcHJvdmlkZSBpdCBpbnNpZGUgb2YgaXRzIG1pZ3JhdGVQcm9wZXJ0aWVzRnJvbU1lc3NhZ2VDb250ZXh0IGltcGxlbWVudGF0aW9uLgotCi0gICAgICAgICAgICAgICAgICAgIGNwbS5taWdyYXRlUHJvcGVydGllc0Zyb21NZXNzYWdlQ29udGV4dChuZXcgQXBwbGljYXRpb25Qcm9wZXJ0eU1hcFdyaXRlcihyZXNwb25zZUNvbnRleHQsIG1lc3NhZ2VDb250ZXh0LmdldE1FUENvbnRleHQoKSksIG1lc3NhZ2VDb250ZXh0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0KLSAgICAvKioKLSAgICAgKgotICAgICAqIEFwcGxpY2F0aW9uUHJvcGVydHlNYXBSZWFkZXIgaXMgYSB3cmFwcGVyIGZvciB0aGUgU09VUkNFIHByb3BlcnR5IG1hcCBwYXNzZWQgdG8gaW5kaXZpZHVhbAotICAgICAqIHByb3BlcnR5IG1pZ3JhdG9ycy4gIFdoZW4gYSBwcm9wZXJ0eSBtaWdyYXRvciBjb3BpZXMgcHJvcGVydGllcyBmcm9tIGEgcmVxdWVzdCBjb250ZXh0IG1hcAotICAgICAqIHRvIGEgSkFYV1MgTWVzc2FnZUNvbnRleHQgb2JqZWN0LCBhbGwgb2YgdGhvc2UgcHJvcGVydGllcyBzaG91bGQgYmUgbWFya2VkIEFQUExJQ0FUSU9OCi0gICAgICogc2NvcGUgc28gdGhleSBjYW4gbGF0ZXIgYmUgcmV0cmlldmVkIGZyb20gdGhlIHJlcXVlc3QgY29udGV4dCBvciByZXNwb25zZSBjb250ZXh0Ci0gICAgICogaW4gdGhlIGNsaWVudCBhcHBsaWNhdGlvbi4KLSAgICAgKgotICAgICAqIFdlIG92ZXJyaWRlIHRoZSBFbnRyeVNldCBhbmQgSXRlcmF0b3IgdG8gbWFrZSBzdXJlIHRoZSBzY29wZSBpcyBwcm9wZXJseSBzZXQgaW4gdGhlCi0gICAgICogInJlcXVlc3QgY29udGV4dCB0byBKQVhXUyBtZXNzYWdlIGNvbnRleHQiIGNhc2Ugd2hlcmUgdGhlIHByb3BlcnR5IG1pZ3JhdG9yIHVzZXMKLSAgICAgKiBnZXQoU3RyaW5nIGtleSkgb3IgcHV0QWxsKE1hcCBzb3VyY2UpLiAgVGhpcyBpcyBub3QgZ3VhcmFudGVlZCB0byBiZSBjb3JyZWN0LCBob3dldmVyLAotICAgICAqIGJlY2F1c2UgYSBwcm9wZXJ0eSBtaWdyYXRvciBjb3VsZCBzaW1wbHkgYmUgZG9pbmcgYSBnZXQoU3RyaW5nIGtleSkgdG8gb2JzZXJ2ZSBwcm9wZXJ0aWVzCi0gICAgICogcmF0aGVyIHRoYW4gY29weSB0aGVtLiAgVGhpcyBqdXN0IG1lYW5zIHdlIG1pZ2h0IGJlIHNldHRpbmcgc2NvcGUgZm9yIGEgcHJvcGVydHkgdGhhdAotICAgICAqIG5ldmVyIGFjdHVhbGx5IG1ha2VzIGl0cyB3YXkgaW50byB0aGUgSkFYV1MgbWVzc2FnZSBjb250ZXh0LiAgSWYgc29tZW9uZSAoYSBoYW5kZXIsCi0gICAgICogcGVyaGFwcykgbGF0ZXIgc2V0cyBhIHByb3BlcnR5IHdpdGggdGhlIHNhbWUga2V5LCBpdHMgc2NvcGUgbWF5IGJlICJwcmUtc2V0IiBhbmQKLSAgICAgKiB0aGVyZWZvcmUgaW5jb3JyZWN0LgotICAgICAqIAotICAgICAqIFRPRE86ICBmaW5kIHNvbHV0aW9uIHRvIGFib3ZlIHByb2JsZW0uICBUaGUgTUVQQ29udGV4dC5wdXQgc2V0cyBhbiBleHBsaWNpdCBzY29wZSB3aGVuZXZlcgotICAgICAqIGEgcHJvcGVydHkgaXMgYW5kIGEgc2NvcGUgaXMgbm90IGFscmVhZHkgcHJlc2VudCBmb3IgdGhhdCBwcm9wZXJ0eS4gIEFuIGV4YW1wbGUKLSAgICAgKiBvZiB3aGVyZSB0aGlzIGlkZWEgd291bGQgcHJvZHVjZSB1bmV4cGVjdGVkIHJlc3VsdHMgaXMgd2hlcmUgYSBzY29wZSB3YXMgc2V0IHRvIEFQUExJQ0FUSU9OCi0gICAgICogaW4gdGhlIHByb3BlcnR5IG1pZ3JhdG9yIGZvciBrZXkvdmFsdWUgcGFpciAibXlLZXkvc29tZVZhbHVlIiwgYnV0IG15S2V5IG5ldmVyIGFjdHVhbGx5IG1hZGUKLSAgICAgKiBpdCBpbnRvIHRoZSBtZXNzYWdlY29udGV4dC4gIExhdGVyIGEgaGFuZGxlciBtaWdodCBwdXQgYSAibXlLZXkvdGhlSGFuZGxlclZhbHVlIi4gIEluIHRoaXMKLSAgICAgKiBjYXNlIHRoZSBzY29wZSB3YXMgYWxyZWFkeSBzZXQgdG8gQVBQTElDQVRJT04gYW5kIHdvdWxkIHRoZXJlZm9yZSBub3QgYmUgc2V0IGJ5IHRoZQotICAgICAqIE1FUENvbnRleHQucHV0IGFuZCB0aGVyZWZvcmUgYmUgaW5jb3JyZWN0LgotICAgICAqCi0gICAgICogQXBwbGljYXRpb25Qcm9wZXJ0eU1hcFJlYWRlciBvbmx5IHNldHMgdGhlIHNjb3BlIGlmIGEgbWlncmF0b3IgY2FsbHMgImdldCIgb24gdGhpcyBtYXAgb3IKLSAgICAgKiBpdGVyYXRlcyBvdmVyIHRoZSBlbnRyeVNldCwgd2hpY2ggbWF5IG9jY3VyIGV4cGxpY2l0bHkgaW4gdGhlIG1pZ3JhdG9yLCBvciBpbXBsaWNpdGx5IHdoZW4KLSAgICAgKiB0aGlzIG1hcCBpcyB0aGUgc291cmNlIGZvciBhIGNhbGwgc3VjaCBhcyBvdGhlck1hcC5wdXRBbGwoTWFwIHNvdXJjZSkuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQXBwbGljYXRpb25Qcm9wZXJ0eU1hcFJlYWRlciBleHRlbmRzIEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+IHsKLQotICAgICAgICBwcml2YXRlIE1hcDxTdHJpbmcsIE9iamVjdD4gdXNlck1hcDsKLSAgICAgICAgcHJpdmF0ZSBNRVBDb250ZXh0IG1lcEN0eDsKLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBBcHBsaWNhdGlvblByb3BlcnR5TWFwUmVhZGVyKE1hcDxTdHJpbmcsIE9iamVjdD4gdXNlck1hcCwgTUVQQ29udGV4dCBtZXBDdHgpIHsKLSAgICAgICAgICAgIHRoaXMudXNlck1hcCA9IHVzZXJNYXA7Ci0gICAgICAgICAgICB0aGlzLm1lcEN0eCA9IG1lcEN0eDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBPYmplY3QgcHV0KFN0cmluZyBrZXksIE9iamVjdCB2YWx1ZSkgewotICAgICAgICAgICAgLy9tZXBDdHguc2V0U2NvcGUoa2V5LCBTY29wZS5BUFBMSUNBVElPTik7Ci0gICAgICAgICAgICByZXR1cm4gdXNlck1hcC5wdXQoa2V5LCB2YWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgcHV0QWxsKE1hcDw/IGV4dGVuZHMgU3RyaW5nLCA/IGV4dGVuZHMgT2JqZWN0PiBtKSB7Ci0gICAgICAgICAgICAvLyB3ZSBuZWVkIHRvIHRha2UgYWR2YW50YWdlIG9mIHRoZSBzbWFydGVyIHB1dChTdHJpbmcsIE9iamVjdCkKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBtLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIE1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpaXQubmV4dCgpOwotICAgICAgICAgICAgICAgIHB1dCgoU3RyaW5nKWVudHJ5LmdldEtleSgpLCBlbnRyeS5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zS2V5KE9iamVjdCBrZXkpIHsKLSAgICAgICAgICAgIHJldHVybiB1c2VyTWFwLmNvbnRhaW5zS2V5KGtleSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNWYWx1ZShPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgICAgIHJldHVybiB1c2VyTWFwLmNvbnRhaW5zVmFsdWUodmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTZXQgZW50cnlTZXQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEFwcGxpY2F0aW9uUHJvcGVydHlNYXBFbnRyeVNldCh1c2VyTWFwLmVudHJ5U2V0KCksIG1lcEN0eCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIE9iamVjdCBnZXQoT2JqZWN0IGtleSkgewotICAgICAgICAgICAgLy8gV0FSTklORzogIHRoZXJlJ3Mgbm8gcmVhbCBndWFyYW50ZWUgdGhhdCB0aGUgcmVhc29uIGEgbWlncmF0b3IgaXMgZ2V0dGluZwotICAgICAgICAgICAgLy8gYSBwcm9wZXJ0eSBpcyBkdWUgdG8gaXQgYmVpbmcgcHV0IG9uIHRoZSBNZXNzYWdlQ29udGV4dC4KLSAgICAgICAgICAgIC8vIFdlIHdvdWxkIHRoZXJlZm9yZSBiZSBzZXR0aW5nIHNjb3BlIGZvciBhIHByb3BlcnR5IHRoYXQgbmV2ZXIgYWN0dWFsbHkgbWFrZXMKLSAgICAgICAgICAgIC8vIGl0cyB3YXkgaW50byB0aGUgbWVzc2FnZUNvbnRleHQuCi0gICAgICAgICAgICBPYmplY3Qgb2JqID0gdXNlck1hcC5nZXQoa2V5KTsKLSAgICAgICAgICAgIGlmIChvYmogIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1lcEN0eC5zZXRTY29wZSgoU3RyaW5nKWtleSwgU2NvcGUuQVBQTElDQVRJT04pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG9iajsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotICAgICAgICAgICAgcmV0dXJuIHVzZXJNYXAuaXNFbXB0eSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTZXQga2V5U2V0KCkgewotICAgICAgICAgICAgcmV0dXJuIHVzZXJNYXAua2V5U2V0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIE9iamVjdCByZW1vdmUoT2JqZWN0IGtleSkgewotICAgICAgICAgICAgcmV0dXJuIHVzZXJNYXAucmVtb3ZlKGtleSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGludCBzaXplKCkgewotICAgICAgICAgICAgcmV0dXJuIHVzZXJNYXAuc2l6ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBDb2xsZWN0aW9uIHZhbHVlcygpIHsKLSAgICAgICAgICAgIHJldHVybiB1c2VyTWFwLnZhbHVlcygpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIGNsYXNzIEFwcGxpY2F0aW9uUHJvcGVydHlNYXBFbnRyeVNldCBleHRlbmRzIEFic3RyYWN0U2V0IHsKLQotICAgICAgICAgICAgU2V0IGNvbnRhaW5lZFNldDsKLSAgICAgICAgICAgIE1FUENvbnRleHQgbWVwQ3R4OwotICAgICAgICAgICAgCi0gICAgICAgICAgICBwdWJsaWMgQXBwbGljYXRpb25Qcm9wZXJ0eU1hcEVudHJ5U2V0KFNldCBzZXQsIE1FUENvbnRleHQgbWVwQ3R4KSB7Ci0gICAgICAgICAgICAgICAgY29udGFpbmVkU2V0ID0gc2V0OwotICAgICAgICAgICAgICAgIHRoaXMubWVwQ3R4ID0gbWVwQ3R4OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBFbnRyeVNldEl0ZXJhdG9yIGl0ZXJhdG9yKCkgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRW50cnlTZXRJdGVyYXRvcihjb250YWluZWRTZXQuaXRlcmF0b3IoKSwgbWVwQ3R4KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgaW50IHNpemUoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5lZFNldC5zaXplKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBjbGFzcyBFbnRyeVNldEl0ZXJhdG9yIGltcGxlbWVudHMgSXRlcmF0b3IgewotICAgICAgICAgICAgCi0gICAgICAgICAgICBwcml2YXRlIEl0ZXJhdG9yIGNvbnRhaW5lZEl0ZXJhdG9yOwotICAgICAgICAgICAgcHJpdmF0ZSBNRVBDb250ZXh0IG1lcEN0eDsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgcHJpdmF0ZSBFbnRyeVNldEl0ZXJhdG9yKEl0ZXJhdG9yIGNvbnRhaW5lZEl0ZXJhdG9yLCBNRVBDb250ZXh0IG1lcEN0eCkgewotICAgICAgICAgICAgICAgIHRoaXMuY29udGFpbmVkSXRlcmF0b3IgPSBjb250YWluZWRJdGVyYXRvcjsKLSAgICAgICAgICAgICAgICB0aGlzLm1lcEN0eCA9IG1lcEN0eDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gb3ZlcnJpZGUgcmVtb3ZlKCkgdG8gbWFrZSB0aGlzIEl0ZXJhdG9yIGNsYXNzIHJlYWQtb25seQotICAgICAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlKCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotICAgICAgICAgICAgICAgIHJldHVybiBjb250YWluZWRJdGVyYXRvci5oYXNOZXh0KCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgbmV4dCgpIHsKLSAgICAgICAgICAgICAgICAvLyBXQVJOSU5HOiAgdGhlcmUncyBubyByZWFsIGd1YXJhbnRlZSB0aGF0IHRoZSByZWFzb24gYSBtaWdyYXRvciBpcyBpdGVyYXRpbmcKLSAgICAgICAgICAgICAgICAvLyBvdmVyIHRoZSBwcm9wZXJ0aWVzIGlzIGR1ZSB0byB0aGlzIGJlaW5nIHRoZSBzb3VyY2Ugb2JqZWN0IGZvciBhIHB1dEFsbChzb3VyY2UpCi0gICAgICAgICAgICAgICAgLy8gV2Ugd291bGQgdGhlcmVmb3JlIGJlIHNldHRpbmcgc2NvcGUgZm9yIGEgcHJvcGVydHkgdGhhdCBuZXZlciBhY3R1YWxseSBtYWtlcwotICAgICAgICAgICAgICAgIC8vIGl0cyB3YXkgaW50byB0aGUgbWVzc2FnZUNvbnRleHQKLSAgICAgICAgICAgICAgICBNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KWNvbnRhaW5lZEl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgICAgICBtZXBDdHguc2V0U2NvcGUoKFN0cmluZyllbnRyeS5nZXRLZXkoKSwgU2NvcGUuQVBQTElDQVRJT04pOwotICAgICAgICAgICAgICAgIHJldHVybiBlbnRyeTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQXBwbGljYXRpb25Qcm9wZXJ0eU1hcFdyaXRlciBpcyBzaW1pbGFyIHRvIHRoZSBBcHBsaWNhdGlvblByb3BlcnR5TWFwUmVhZGVyIGluIHRoYXQgaXQKLSAgICAgKiBvYnNlcnZlcyBzY29wZSB0byBkZXRlcm1pbmUgd2hhdCBjYW4gYmUgcmV0dXJuZWQgdG8gYSBwcm9wZXJ0eSBtaWdyYXRvci4gIEluZGl2aWR1YWwKLSAgICAgKiBwcm9wZXJ0eSBtaWdyYXRvcnMgc2hvdWxkIG9ubHkgYmUgYWxsb3dlZCB0byByZXRyaWV2ZSBBUFBMSUNBVElPTi1zY29wZWQgcHJvcGVydGllcy4KLSAgICAgKiAKLSAgICAgKiBUT0RPOiAgVGhlcmUncyBxdWl0ZSBhIGJpdCBvZiBleHBlbnNpdmUgbG9naWMgdGhhdCB3b3VsZCBuZWVkIHRvIGdvIGludG8gdGhpcyB0byBiZQotICAgICAqIGZ1bGx5IGNvcnJlY3QuICBGb3IgZXhhbXBsZSwgaWYgYSBtaWdyYXRvciBjYWxscyBzaXplLCB3ZSBjYW5ub3Qgc2ltcGx5IHJldHVybgotICAgICAqIHVzZXJNYXAuc2l6ZSgpLiAgUmF0aGVyLCB3ZSB3b3VsZCBoYXZlIHRvIGNvdW50IG9ubHkgdGhlIEFQUExJQ0FUSU9OIHNjb3BlZCBwcm9wZXJ0aWVzCi0gICAgICogYW5kIHJldHVybiB0aG9zZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBBcHBsaWNhdGlvblByb3BlcnR5TWFwV3JpdGVyIGV4dGVuZHMgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4gewotCi0gICAgICAgIHByaXZhdGUgTWFwPFN0cmluZywgT2JqZWN0PiB1c2VyTWFwOwotICAgICAgICBwcml2YXRlIE1FUENvbnRleHQgbWVwQ3R4OwotICAgICAgICAKLSAgICAgICAgcHVibGljIEFwcGxpY2F0aW9uUHJvcGVydHlNYXBXcml0ZXIoTWFwPFN0cmluZywgT2JqZWN0PiB1c2VyTWFwLCBNRVBDb250ZXh0IG1lcEN0eCkgewotICAgICAgICAgICAgdGhpcy51c2VyTWFwID0gdXNlck1hcDsKLSAgICAgICAgICAgIHRoaXMubWVwQ3R4ID0gbWVwQ3R4OwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIE9iamVjdCBwdXQoU3RyaW5nIGtleSwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgICAgICAvLyBub3RpY2UgdGhlIGxvZ2ljIGhlcmUhICBXZSB3b24ndCBwdXQgYSBwcm9wZXJ0eSBvbiB0aGUgdXNlck1hcCB0aGF0IGlzIG5vdCBBUFBMSUNBVElPTiBzY29wZWQKLSAgICAgICAgICAgIGlmIChtZXBDdHguZ2V0U2NvcGUoa2V5KSA9PSBTY29wZS5BUFBMSUNBVElPTikgewotICAgICAgICAgICAgICAgIHJldHVybiB1c2VyTWFwLnB1dChrZXksIHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHB1dEFsbChNYXA8PyBleHRlbmRzIFN0cmluZywgPyBleHRlbmRzIE9iamVjdD4gbSkgewotICAgICAgICAgICAgLy8gd2UgbmVlZCB0byB0YWtlIGFkdmFudGFnZSBvZiB0aGUgc21hcnRlciBwdXQoU3RyaW5nLCBPYmplY3QpCi0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gbS5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICBNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KWl0Lm5leHQoKTsKLSAgICAgICAgICAgICAgICBwdXQoKFN0cmluZyllbnRyeS5nZXRLZXkoKSwgZW50cnkuZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0tleShPYmplY3Qga2V5KSB7Ci0gICAgICAgICAgICBpZiAobWVwQ3R4LmdldFNjb3BlKChTdHJpbmcpa2V5KSA9PSBTY29wZS5BUFBMSUNBVElPTikgewotICAgICAgICAgICAgICAgIHJldHVybiB1c2VyTWFwLmNvbnRhaW5zS2V5KGtleSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNWYWx1ZShPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgICAgIHJldHVybiB1c2VyTWFwLmNvbnRhaW5zVmFsdWUodmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTZXQgZW50cnlTZXQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gdXNlck1hcC5lbnRyeVNldCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0KE9iamVjdCBrZXkpIHsKLSAgICAgICAgICAgIHJldHVybiB1c2VyTWFwLmdldChrZXkpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0gICAgICAgICAgICByZXR1cm4gdXNlck1hcC5pc0VtcHR5KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFNldCBrZXlTZXQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gdXNlck1hcC5rZXlTZXQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgT2JqZWN0IHJlbW92ZShPYmplY3Qga2V5KSB7Ci0gICAgICAgICAgICByZXR1cm4gdXNlck1hcC5yZW1vdmUoa2V5KTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgaW50IHNpemUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gdXNlck1hcC5zaXplKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIENvbGxlY3Rpb24gdmFsdWVzKCkgewotICAgICAgICAgICAgcmV0dXJuIHVzZXJNYXAudmFsdWVzKCk7Ci0gICAgICAgIH0KLSAgICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvdXRpbGl0eS9BdHRhY2htZW50VXRpbHMuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3V0aWxpdHkvQXR0YWNobWVudFV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkZmRkZDUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvdXRpbGl0eS9BdHRhY2htZW50VXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51dGlsaXR5Ow0KLQ0KLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1pbXBvcnQgamF2YS5hd3QuSW1hZ2U7DQotaW1wb3J0IGphdmEuYXd0LmltYWdlLkJ1ZmZlcmVkSW1hZ2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1wdWJsaWMgY2xhc3MgQXR0YWNobWVudFV0aWxzIHsNCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coQXR0YWNobWVudFV0aWxzLmNsYXNzKTsNCi0JDQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb21wYXJlSW1hZ2VzKEltYWdlIGltZzEsIEltYWdlIGltZzIpew0KLQkJaWYoaW1nMSA9PSBudWxsICYmIGltZzI9PW51bGwpew0KLQkJCWlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKXsNCi0JCQkJbG9nLmRlYnVnKCJCb3RoIEltYWdlIE9iamVjdHMgYXJlIG51bGwsIGNhbm5vdCBjb21wYXJlIEltYWdlcyByZXR1cm5pbmcgZmFsc2UiKTsNCi0JCQl9DQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJfQ0KLQkJaW50IGgxID0gaW1nMS5nZXRIZWlnaHQobnVsbCk7DQotCQlpbnQgaDIgPSBpbWcyLmdldEhlaWdodChudWxsKTsNCi0JCWludCB3MSA9IGltZzEuZ2V0V2lkdGgobnVsbCk7DQotCQlpbnQgdzIgPSBpbWcxLmdldFdpZHRoKG51bGwpOw0KLQkJaWYoaDEgIT0gaDIgfHwgdzEgIT0gdzIpew0KLQkJCXJldHVybiBmYWxzZTsNCi0JCX0NCi0JCWlmKGltZzEgaW5zdGFuY2VvZiBCdWZmZXJlZEltYWdlICYmIGltZzIgaW5zdGFuY2VvZiBCdWZmZXJlZEltYWdlKXsNCi0JCQlCdWZmZXJlZEltYWdlIGJpMSA9IChCdWZmZXJlZEltYWdlKWltZzE7DQotCQkJQnVmZmVyZWRJbWFnZSBiaTIgPSAoQnVmZmVyZWRJbWFnZSlpbWcyOw0KLQkJCWZvcihpbnQgaD0wO2g8aDE7KytoKXsNCi0JCQkJZm9yKGludCB3PTA7IHc8dzE7ICsrdyl7DQotCQkJCQlpbnQgSW1nMVBpeGVsID1iaTEuZ2V0UkdCKHcsIGgpOw0KLQkJCQkJaW50IEltZzJQaXhlbCA9YmkyLmdldFJHQih3LCBoKTsNCi0JCQkJCWlmKEltZzFQaXhlbCE9SW1nMlBpeGVsKXsNCi0JCQkJCQlyZXR1cm4gZmFsc2U7DQotCQkJCQl9DQotCQkJCX0NCi0JCQl9DQotCQl9DQotCQlyZXR1cm4gdHJ1ZTsJCQ0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3V0aWxpdHkvQ2xhc3NVdGlscy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvdXRpbGl0eS9DbGFzc1V0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlMWYxNTguLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvdXRpbGl0eS9DbGFzc1V0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnV0aWxpdHk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOwotaW1wb3J0IGphdmF4LnhtbC53cy5Ib2xkZXI7Ci1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYkZhdWx0OwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlQ2xpZW50OwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlUHJvdmlkZXI7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi0vKiogQ29udGFpbnMgc3RhdGljIENsYXNzIHV0aWxpdHkgbWV0aG9kcyByZWxhdGVkIHRvIG1ldGhvZCBwYXJhbWV0ZXIvYXJndW1lbnQgbWFyc2hhbGxpbmcuICovCi1wdWJsaWMgY2xhc3MgQ2xhc3NVdGlscyB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coQ2xhc3NVdGlscy5jbGFzcyk7Ci0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIFJvb3RDYXVzZSBmb3IgYW4gdGhyb3dhYmxlLiBUaGUgcm9vdCBjYXVzZSBpcyBkZWZpbmVkIGFzIHRoZSBmaXJzdAotICAgICAqIG5vbi1JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLgotICAgICAqCi0gICAgICogQHBhcmFtIGUgVGhyb3dhYmxlCi0gICAgICogQHJldHVybiBUaHJvd2FibGUgcm9vdCBjYXVzZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgVGhyb3dhYmxlIGdldFJvb3RDYXVzZShUaHJvd2FibGUgZSkgewotICAgICAgICBUaHJvd2FibGUgdCA9IG51bGw7Ci0KLSAgICAgICAgaWYgKGUgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgdCA9ICgoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbillKS5nZXRUYXJnZXRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdCA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBlID0gZ2V0Um9vdENhdXNlKHQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBlOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIEhhc2hNYXAgbG9hZENsYXNzTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotICAgIHN0YXRpYyB7Ci0gICAgICAgIGxvYWRDbGFzc01hcC5wdXQoImJ5dGUiLCBieXRlLmNsYXNzKTsKLSAgICAgICAgbG9hZENsYXNzTWFwLnB1dCgiaW50IiwgaW50LmNsYXNzKTsKLSAgICAgICAgbG9hZENsYXNzTWFwLnB1dCgic2hvcnQiLCBzaG9ydC5jbGFzcyk7Ci0gICAgICAgIGxvYWRDbGFzc01hcC5wdXQoImxvbmciLCBsb25nLmNsYXNzKTsKLSAgICAgICAgbG9hZENsYXNzTWFwLnB1dCgiZmxvYXQiLCBmbG9hdC5jbGFzcyk7Ci0gICAgICAgIGxvYWRDbGFzc01hcC5wdXQoImRvdWJsZSIsIGRvdWJsZS5jbGFzcyk7Ci0gICAgICAgIGxvYWRDbGFzc01hcC5wdXQoImJvb2xlYW4iLCBib29sZWFuLmNsYXNzKTsKLSAgICAgICAgbG9hZENsYXNzTWFwLnB1dCgiY2hhciIsIGNoYXIuY2xhc3MpOwotICAgICAgICBsb2FkQ2xhc3NNYXAucHV0KCJ2b2lkIiwgdm9pZC5jbGFzcyk7Ci0gICAgfQotCi0gICAgLyoqIENvbnZlcnRzIHRleHQgb2YgdGhlIGZvcm0gRm9vW10gdG8gdGhlIHByb3BlciBjbGFzcyBuYW1lIGZvciBsb2FkaW5nIFtMRm9vICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgSGFzaE1hcCBsb2FkYWJsZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICBzdGF0aWMgewotICAgICAgICBsb2FkYWJsZU1hcC5wdXQoImJ5dGUiLCAiQiIpOwotICAgICAgICBsb2FkYWJsZU1hcC5wdXQoImNoYXIiLCAiQyIpOwotICAgICAgICBsb2FkYWJsZU1hcC5wdXQoImRvdWJsZSIsICJEIik7Ci0gICAgICAgIGxvYWRhYmxlTWFwLnB1dCgiZmxvYXQiLCAiRiIpOwotICAgICAgICBsb2FkYWJsZU1hcC5wdXQoImludCIsICJJIik7Ci0gICAgICAgIGxvYWRhYmxlTWFwLnB1dCgibG9uZyIsICJKIik7Ci0gICAgICAgIGxvYWRhYmxlTWFwLnB1dCgic2hvcnQiLCAiUyIpOwotICAgICAgICBsb2FkYWJsZU1hcC5wdXQoImJvb2xlYW4iLCAiWiIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSB0ZXh0IFN0cmluZwotICAgICAqIEByZXR1cm4gU3RyaW5nIHRoYXQgY2FuIGJlIHVzZWQgZm9yIENsYXNzLmZvck5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRMb2FkYWJsZUNsYXNzTmFtZShTdHJpbmcgdGV4dCkgewotICAgICAgICBpbnQgYnJhY2tldCA9IHRleHQuaW5kZXhPZigiWyIpOwotICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gdGV4dDsKLQotICAgICAgICAvLyBHZXQgdGhlIGNsYXNzTmFtZSB3aXRob3V0IGFueSBhcnJheSBicmFja2V0cwotICAgICAgICBpZiAoYnJhY2tldCA+IDApIHsKLSAgICAgICAgICAgIGNsYXNzTmFtZSA9IGNsYXNzTmFtZS5zdWJzdHJpbmcoMCwgYnJhY2tldCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBOb3cgZ2V0IHRoZSBsb2FkYWJsZSBuYW1lIGZyb20gdGhlIG1hcCBvciAKLSAgICAgICAgLy8gaXRzIEw8Y2xhc3NOYW1lPjsKLSAgICAgICAgU3RyaW5nIGxvYWRDbGFzcyA9IChTdHJpbmcpbG9hZGFibGVNYXAuZ2V0KGNsYXNzTmFtZSk7Ci0gICAgICAgIGlmIChsb2FkQ2xhc3MgPT0gbnVsbCkgewotICAgICAgICAgICAgbG9hZENsYXNzID0gIkwiICsgY2xhc3NOYW1lICsgIjsiOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTm93IHByZXBlbmQgWyBmb3IgZWFjaCBhcnJheSBkaW1lbnNpb24KLSAgICAgICAgaWYgKGJyYWNrZXQgPiAwKSB7Ci0gICAgICAgICAgICBpbnQgaSA9IHRleHQuaW5kZXhPZigiXSIpOwotICAgICAgICAgICAgd2hpbGUgKGkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgbG9hZENsYXNzID0gIlsiICsgbG9hZENsYXNzOwotICAgICAgICAgICAgICAgIGkgPSB0ZXh0LmluZGV4T2YoIl0iLCBpICsgMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGxvYWRDbGFzczsKLSAgICB9Ci0KLSAgICAvKiogQ29udmVydHMgdGV4dCBvZiB0aGUgZm9ybSBbTEZvbyB0byB0aGUgRm9vW10gKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRUZXh0Q2xhc3NOYW1lKFN0cmluZyB0ZXh0KSB7Ci0gICAgICAgIGlmICh0ZXh0ID09IG51bGwgfHwKLSAgICAgICAgICAgICAgICB0ZXh0LmluZGV4T2YoIlsiKSAhPSAwKQotICAgICAgICAgICAgcmV0dXJuIHRleHQ7Ci0gICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSAiIjsKLSAgICAgICAgaW50IGluZGV4ID0gMDsKLSAgICAgICAgd2hpbGUgKGluZGV4IDwgdGV4dC5sZW5ndGgoKSAmJgotICAgICAgICAgICAgICAgIHRleHQuY2hhckF0KGluZGV4KSA9PSAnWycpIHsKLSAgICAgICAgICAgIGluZGV4ICsrOwotICAgICAgICAgICAgY2xhc3NOYW1lICs9ICJbXSI7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGluZGV4IDwgdGV4dC5sZW5ndGgoKSkgewotICAgICAgICAgICAgaWYgKHRleHQuY2hhckF0KGluZGV4KSA9PSAnQicpCi0gICAgICAgICAgICAgICAgY2xhc3NOYW1lID0gImJ5dGUiICsgY2xhc3NOYW1lOwotICAgICAgICAgICAgZWxzZSBpZiAodGV4dC5jaGFyQXQoaW5kZXgpID09ICdDJykKLSAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSAiY2hhciIgKyBjbGFzc05hbWU7Ci0gICAgICAgICAgICBlbHNlIGlmICh0ZXh0LmNoYXJBdChpbmRleCkgPT0gJ0QnKQotICAgICAgICAgICAgICAgIGNsYXNzTmFtZSA9ICJkb3VibGUiICsgY2xhc3NOYW1lOwotICAgICAgICAgICAgZWxzZSBpZiAodGV4dC5jaGFyQXQoaW5kZXgpID09ICdGJykKLSAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSAiZmxvYXQiICsgY2xhc3NOYW1lOwotICAgICAgICAgICAgZWxzZSBpZiAodGV4dC5jaGFyQXQoaW5kZXgpID09ICdJJykKLSAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSAiaW50IiArIGNsYXNzTmFtZTsKLSAgICAgICAgICAgIGVsc2UgaWYgKHRleHQuY2hhckF0KGluZGV4KSA9PSAnSicpCi0gICAgICAgICAgICAgICAgY2xhc3NOYW1lID0gImxvbmciICsgY2xhc3NOYW1lOwotICAgICAgICAgICAgZWxzZSBpZiAodGV4dC5jaGFyQXQoaW5kZXgpID09ICdTJykKLSAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSAic2hvcnQiICsgY2xhc3NOYW1lOwotICAgICAgICAgICAgZWxzZSBpZiAodGV4dC5jaGFyQXQoaW5kZXgpID09ICdaJykKLSAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSAiYm9vbGVhbiIgKyBjbGFzc05hbWU7Ci0gICAgICAgICAgICBlbHNlIGlmICh0ZXh0LmVxdWFscygidm9pZCIpKQotICAgICAgICAgICAgICAgIGNsYXNzTmFtZSA9ICJ2b2lkIjsKLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGNsYXNzTmFtZSA9IHRleHQuc3Vic3RyaW5nKGluZGV4ICsgMSwgdGV4dC5pbmRleE9mKCI7IikpICsgY2xhc3NOYW1lOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjbGFzc05hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHByaW1pdGl2ZQotICAgICAqIEByZXR1cm4gamF2YSB3cmFwcGVyIGNsYXNzIG9yIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIENsYXNzIGdldFdyYXBwZXJDbGFzcyhDbGFzcyBwcmltaXRpdmUpIHsKLSAgICAgICAgaWYgKHByaW1pdGl2ZSA9PSBpbnQuY2xhc3MpCi0gICAgICAgICAgICByZXR1cm4gamF2YS5sYW5nLkludGVnZXIuY2xhc3M7Ci0gICAgICAgIGVsc2UgaWYgKHByaW1pdGl2ZSA9PSBzaG9ydC5jbGFzcykKLSAgICAgICAgICAgIHJldHVybiBqYXZhLmxhbmcuU2hvcnQuY2xhc3M7Ci0gICAgICAgIGVsc2UgaWYgKHByaW1pdGl2ZSA9PSBib29sZWFuLmNsYXNzKQotICAgICAgICAgICAgcmV0dXJuIGphdmEubGFuZy5Cb29sZWFuLmNsYXNzOwotICAgICAgICBlbHNlIGlmIChwcmltaXRpdmUgPT0gYnl0ZS5jbGFzcykKLSAgICAgICAgICAgIHJldHVybiBqYXZhLmxhbmcuQnl0ZS5jbGFzczsKLSAgICAgICAgZWxzZSBpZiAocHJpbWl0aXZlID09IGxvbmcuY2xhc3MpCi0gICAgICAgICAgICByZXR1cm4gamF2YS5sYW5nLkxvbmcuY2xhc3M7Ci0gICAgICAgIGVsc2UgaWYgKHByaW1pdGl2ZSA9PSBkb3VibGUuY2xhc3MpCi0gICAgICAgICAgICByZXR1cm4gamF2YS5sYW5nLkRvdWJsZS5jbGFzczsKLSAgICAgICAgZWxzZSBpZiAocHJpbWl0aXZlID09IGZsb2F0LmNsYXNzKQotICAgICAgICAgICAgcmV0dXJuIGphdmEubGFuZy5GbG9hdC5jbGFzczsKLSAgICAgICAgZWxzZSBpZiAocHJpbWl0aXZlID09IGNoYXIuY2xhc3MpCi0gICAgICAgICAgICByZXR1cm4gamF2YS5sYW5nLkNoYXJhY3Rlci5jbGFzczsKLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSB3cmFwcGVyCi0gICAgICogQHJldHVybiBwcmltaXRpdmUgY2xhcyBvciBudWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBDbGFzcyBnZXRQcmltaXRpdmVDbGFzcyhDbGFzcyB3cmFwcGVyKSB7Ci0gICAgICAgIGlmICh3cmFwcGVyID09IGphdmEubGFuZy5JbnRlZ2VyLmNsYXNzKQotICAgICAgICAgICAgcmV0dXJuIGludC5jbGFzczsKLSAgICAgICAgZWxzZSBpZiAod3JhcHBlciA9PSBqYXZhLmxhbmcuU2hvcnQuY2xhc3MpCi0gICAgICAgICAgICByZXR1cm4gc2hvcnQuY2xhc3M7Ci0gICAgICAgIGVsc2UgaWYgKHdyYXBwZXIgPT0gamF2YS5sYW5nLkJvb2xlYW4uY2xhc3MpCi0gICAgICAgICAgICByZXR1cm4gYm9vbGVhbi5jbGFzczsKLSAgICAgICAgZWxzZSBpZiAod3JhcHBlciA9PSBqYXZhLmxhbmcuQnl0ZS5jbGFzcykKLSAgICAgICAgICAgIHJldHVybiBieXRlLmNsYXNzOwotICAgICAgICBlbHNlIGlmICh3cmFwcGVyID09IGphdmEubGFuZy5Mb25nLmNsYXNzKQotICAgICAgICAgICAgcmV0dXJuIGxvbmcuY2xhc3M7Ci0gICAgICAgIGVsc2UgaWYgKHdyYXBwZXIgPT0gamF2YS5sYW5nLkRvdWJsZS5jbGFzcykKLSAgICAgICAgICAgIHJldHVybiBkb3VibGUuY2xhc3M7Ci0gICAgICAgIGVsc2UgaWYgKHdyYXBwZXIgPT0gamF2YS5sYW5nLkZsb2F0LmNsYXNzKQotICAgICAgICAgICAgcmV0dXJuIGZsb2F0LmNsYXNzOwotICAgICAgICBlbHNlIGlmICh3cmFwcGVyID09IGphdmEubGFuZy5DaGFyYWN0ZXIuY2xhc3MpCi0gICAgICAgICAgICByZXR1cm4gY2hhci5jbGFzczsKLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzc1tdIG5vQ2xhc3MgPSBuZXcgQ2xhc3NbXSB7IH07Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGRlZmF1bHQgcHVibGljIGNvbnN0cnVjdG9yCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2xhenoKLSAgICAgKiBAcmV0dXJuIENvbnN0cnVjdG9yIG9yIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIENvbnN0cnVjdG9yIGdldERlZmF1bHRQdWJsaWNDb25zdHJ1Y3RvcihDbGFzcyBjbGF6eikgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIGNsYXp6LmdldENvbnN0cnVjdG9yKG5vQ2xhc3MpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gbmFtZSBvZiBwcmltaXRpdmUgdHlwZQotICAgICAqIEByZXR1cm4gcHJpbWl0aXZlIENsYXNzIG9yIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIENsYXNzIGdldFByaW1pdGl2ZUNsYXNzKFN0cmluZyB0ZXh0KSB7Ci0gICAgICAgIHJldHVybiAoQ2xhc3MpbG9hZENsYXNzTWFwLmdldCh0ZXh0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gY2xzCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgaXMgYSBKQVgtV1Mgb3IgSkFYLVdTIGdlbmVyYXRlZCBjbGFzcwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc0pBWFdTQ2xhc3MoQ2xhc3MgY2xzKSB7Ci0gICAgICAgIC8vIFRPRE8gUHJvY2Vzc2luZyBhbGwgb2YgdGhlc2UgYW5ub3RhdGlvbnMgaXMgdmVyeSBleHBlbnNpdmUuICBXZSBuZWVkIHRvIGNhY2hlIHRoZSAKLSAgICAgICAgLy8gcmVzdWx0IGluIGEgc3RhdGljIFdlYWtIYXNoTWFwPENsYXNzLCBCb29sZWFuPgotCi0gICAgICAgIC8vIEtpbmRzIG9mIGdlbmVyYXRlZCBjbGFzc2VzOiBTZXJ2aWNlLCBQcm92aWRlciwgSW1wbCwgRXhjZXB0aW9uLCBIb2xkZXIKLSAgICAgICAgLy8gT3IgdGhlIGNsYXNzIGlzIGluIHRoZSBqYXh3cy54bWwud3MgcGFja2FnZQotCi0gICAgICAgIC8vIENoZWNrIGZvciBJbXBsCi0gICAgICAgIFdlYlNlcnZpY2Ugd3NBbm4gPSAoV2ViU2VydmljZSlnZXRBbm5vdGF0aW9uKGNscyxXZWJTZXJ2aWNlLmNsYXNzKTsKLSAgICAgICAgaWYgKHdzQW5uICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQ2hlY2sgZm9yIHNlcnZpY2UKLSAgICAgICAgV2ViU2VydmljZUNsaWVudCB3c2NBbm4gPSAoV2ViU2VydmljZUNsaWVudClnZXRBbm5vdGF0aW9uKGNscyxXZWJTZXJ2aWNlQ2xpZW50LmNsYXNzKTsKLSAgICAgICAgaWYgKHdzY0FubiAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIENoZWNrIGZvciBwcm92aWRlcgotICAgICAgICBXZWJTZXJ2aWNlUHJvdmlkZXIgd3NwQW5uID0gKFdlYlNlcnZpY2VQcm92aWRlcikKLSAgICAgICAgICAgIGdldEFubm90YXRpb24oY2xzLFdlYlNlcnZpY2VQcm92aWRlci5jbGFzcyk7Ci0gICAgICAgIGlmICh3c3BBbm4gIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBDaGVjayBmb3IgRXhjZXB0aW9uCi0gICAgICAgIFdlYkZhdWx0IHdmQW5uID0gKFdlYkZhdWx0KWdldEFubm90YXRpb24oY2xzLFdlYkZhdWx0LmNsYXNzKTsKLSAgICAgICAgaWYgKHdmQW5uICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQ2hlY2sgZm9yIEhvbGRlcgotICAgICAgICBpZiAoSG9sZGVyLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oY2xzKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBDaGVjayBmb3IgYSBqYXZheC54bWwud3MuU2VydmljZSBjbGFzcyBpbnN0YW5jZQotICAgICAgICBpZiAoU2VydmljZS5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGNscykpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IGNscy5nZXRQYWNrYWdlKCkgPT0gbnVsbCA/IG51bGwgOiBjbHMuZ2V0UGFja2FnZSgpLmdldE5hbWUoKTsKLSAgICAgICAgaWYgKGNsYXNzTmFtZSAhPSBudWxsICYmIGNsYXNzTmFtZS5zdGFydHNXaXRoKCJqYXZheC54bWwud3MiKSAmJiAhY2xhc3NOYW1lLnN0YXJ0c1dpdGgoImphdmF4LnhtbC53cy53c2FkZHJlc3NpbmciKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogR2V0IGFuIGFubm90YXRpb24uICBUaGlzIGlzIHdyYXBwZXJlZCB0byBhdm9pZCBhIEphdmEyU2VjdXJpdHkgdmlvbGF0aW9uLgotICAgICAqIEBwYXJhbSBjbHMgQ2xhc3MgdGhhdCBjb250YWlucyBhbm5vdGF0aW9uIAotICAgICAqIEBwYXJhbSBhbm5vdGF0aW9uIENsYXNzIG9mIHJlcXVyZXN0ZWQgQW5ub3RhdGlvbgotICAgICAqIEByZXR1cm4gYW5ub3RhdGlvbiBvciBudWxsCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKGZpbmFsIEFubm90YXRlZEVsZW1lbnQgZWxlbWVudCwgZmluYWwgQ2xhc3MgYW5ub3RhdGlvbikgewotICAgICAgICByZXR1cm4gKEFubm90YXRpb24pIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkQWN0aW9uKCkgewotICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuZ2V0QW5ub3RhdGlvbihhbm5vdGF0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy91dGlsaXR5L0NvbnZlcnRVdGlscy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvdXRpbGl0eS9Db252ZXJ0VXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhjMWIzZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy91dGlsaXR5L0NvbnZlcnRVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzgzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51dGlsaXR5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5FeGNlcHRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaTE4bi5NZXNzYWdlczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXI7Ci1pbXBvcnQgamF2YXguaW1hZ2Vpby5JbWFnZUlPOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uUmVzdWx0OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXI7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmF3dC4qOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5BcnJheTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKioKLSAqIFByb3ZpZGVzIHV0aWxpdGllcyB0byBjb252ZXJ0IGFuIG9iamVjdCBpbnRvIGEgZGlmZmVyZW50IGtpbmQgb2YgT2JqZWN0LiBGb3IgZXhhbXBsZSwgY29udmVydCBhCi0gKiBTdHJpbmdbXSBpbnRvIGEgTGlzdDxTdHJpbmc+Ci0gKi8KLXB1YmxpYyBjbGFzcyBDb252ZXJ0VXRpbHMgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKENvbnZlcnRVdGlscy5jbGFzcyk7Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuIHRydWUgaWYgdGhlIGNvbnZlcnQgbWV0aG9kIHdpbGwgc3VjY2VlZC4KLSAgICAgKiA8cC8+Ci0gICAgICogTm90ZSB0aGF0IGFueSBjaGFuZ2VzIHRvIGlzQ29udmVydGFibGUoKSBtdXN0IGFsc28gYmUgYWNjb21wYW5pZWQgYnkgc2ltaWxhciBjaGFuZ2VzIHRvCi0gICAgICogY29udmVydCgpCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb2JqICBzb3VyY2Ugb2JqZWN0IG9yIGNsYXNzCi0gICAgICogQHBhcmFtIGRlc3QgZGVzdGluYXRpb24gY2xhc3MKLSAgICAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiBjb252ZXJ0KC4uKSBjYW4gY29udmVydCBvYmogdG8gdGhlIGRlc3RpbmF0aW9uIGNsYXNzCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQ29udmVydGFibGUoT2JqZWN0IG9iaiwgQ2xhc3MgZGVzdCkgewotICAgICAgICBDbGFzcyBzcmMgPSBudWxsOwotCi0gICAgICAgIGlmIChvYmogIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIENsYXNzKSB7Ci0gICAgICAgICAgICAgICAgc3JjID0gKENsYXNzKW9iajsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc3JjID0gb2JqLmdldENsYXNzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZGVzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc3JjID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSWYgd2UncmUgZGlyZWN0bHkgYXNzaWduYWJsZSwgd2UncmUgZ29vZC4KLSAgICAgICAgaWYgKGRlc3QuaXNBc3NpZ25hYmxlRnJvbShzcmMpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIElmIGl0J3MgYSB3cmFwcGluZyBjb252ZXJzaW9uLCB3ZSdyZSBnb29kLgotICAgICAgICBpZiAoSmF2YVV0aWxzLmdldFdyYXBwZXJDbGFzcyhzcmMpID09IGRlc3QpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChKYXZhVXRpbHMuZ2V0V3JhcHBlckNsYXNzKGRlc3QpID09IHNyYykgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBJZiBpdCdzIExpc3QgLT4gQXJyYXkgb3IgdmljZSB2ZXJzYSwgd2UncmUgZ29vZC4KLSAgICAgICAgaWYgKChDb2xsZWN0aW9uLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oc3JjKSB8fCBzcmMuaXNBcnJheSgpKSAmJgotICAgICAgICAgICAgICAgIChDb2xsZWN0aW9uLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oZGVzdCkgfHwgZGVzdC5pc0FycmF5KCkpKSB7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIFRPRE8gdGhpcyBzaG91bGQgY29uc2lkZXIgdGhlIGNvbXBvbmVudCB0eXBlcyBpbnN0ZWFkIG9mIHJldHVybmluZyB0cnVlLgotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBBbGxvdyBtYXBwaW5nIG9mIEhhc2hNYXBzIHRvIEhhc2h0YWJsZXMKLSAgICAgICAgaWYgKHNyYyA9PSBIYXNoTWFwLmNsYXNzICYmIGRlc3QgPT0gSGFzaHRhYmxlLmNsYXNzKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAgICAgLy8gQWxsb3cgbWFwcGluZyBvZiBDYWxlbmRhciB0byBEYXRlCi0gICAgICAgIGlmIChDYWxlbmRhci5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHNyYykgJiYgZGVzdCA9PSBEYXRlLmNsYXNzKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzcmMuaXNQcmltaXRpdmUoKSkgewotICAgICAgICAgICAgcmV0dXJuIGlzQ29udmVydGFibGUoSmF2YVV0aWxzLmdldFdyYXBwZXJDbGFzcyhzcmMpLCBkZXN0KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChJbnB1dFN0cmVhbS5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHNyYykgJiYgZGVzdCA9PSBieXRlW10uY2xhc3MpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgfQotICAgICAgICAgCi0gICAgICAgICBpZiAoU291cmNlLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oc3JjKSAmJiBkZXN0ID09IGJ5dGVbXS5jbGFzcykgewotICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgfQotICAgICAgICAgCi0gICAgICAgICBpZiAoRGF0YUhhbmRsZXIuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShzcmMpICYmIGlzQ29udmVydGFibGUoYnl0ZVtdLmNsYXNzLCBkZXN0KSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoRGF0YUhhbmRsZXIuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShzcmMpICYmIGRlc3QgPT0gSW1hZ2UuY2xhc3MpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKERhdGFIYW5kbGVyLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oc3JjKSAmJiBkZXN0ID09IFNvdXJjZS5jbGFzcykgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYnl0ZVtdLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oc3JjKSAmJiBkZXN0ID09IFN0cmluZy5jbGFzcykgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgIAotICAgICAgICAvLyBJZiBpdCdzIGEgTUlNRSB0eXBlIG1hcHBpbmcgYW5kIHdlIHdhbnQgYSBEYXRhSGFuZGxlciwKLSAgICAgICAgLy8gdGhlbiB3ZSdyZSBnb29kLgotICAgICAgICAvLyBSRVZJRVcgRG8gd2Ugd2FudCB0byBzdXBwb3J0IHRoaXMKLSAgICAgICAgLyoKLSAgICAgICAgaWYgKGRlc3QuZ2V0TmFtZSgpLmVxdWFscygiamF2YXguYWN0aXZhdGlvbi5EYXRhSGFuZGxlciIpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9IHNyYy5nZXROYW1lKCk7Ci0gICAgICAgICAgICBpZiAoc3JjID09IFN0cmluZy5jbGFzcwotICAgICAgICAgICAgICAgICAgICB8fCBzcmMgPT0gamF2YS5hd3QuSW1hZ2UuY2xhc3MKLSAgICAgICAgICAgICAgICAgICAgfHwgbmFtZS5lcXVhbHMoImphdmF4Lm1haWwuaW50ZXJuZXQuTWltZU11bHRpcGFydCIpCi0gICAgICAgICAgICAgICAgICAgIHx8IG5hbWUuZXF1YWxzKCJqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZSIpKQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgICovCi0KLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXRpbGl0eSBmdW5jdGlvbiB0byBjb252ZXJ0IGFuIE9iamVjdCB0byBzb21lIGRlc2lyZWQgQ2xhc3MuCi0gICAgICogPHAvPgotICAgICAqIE5vcm1hbGx5IHRoaXMgaXMgdXNlZCBmb3IgVFtdIHRvIExpc3Q8VD4gcHJvY2Vzc2luZy4gT3RoZXIgY29udmVyc2lvbnMgYXJlIGFsc28gZG9uZSAoaS5lLgotICAgICAqIEhhc2hNYXAgPC0+SGFzaHRhYmxlLCBldGMuKQotICAgICAqIDxwLz4KLSAgICAgKiBVc2UgdGhlIGlzQ29udmVydGFibGUoKSBtZXRob2QgdG8gZGV0ZXJtaW5lIGlmIGNvbnZlcnNpb24gaXMgcG9zc2libGUuIE5vdGUgdGhhdCBhbnkgY2hhbmdlcwotICAgICAqIHRvIGNvbnZlcnQoKSBtdXN0IGFsc28gYmUgYWNjb21wYW5pZWQgYnkgc2ltaWxhciBjaGFuZ2VzIHRvIGlzQ29udmVydGFibGUoKQotICAgICAqCi0gICAgICogQHBhcmFtIGFyZyAgICAgICB0aGUgYXJyYXkgdG8gY29udmVydAotICAgICAqIEBwYXJhbSBkZXN0Q2xhc3MgdGhlIGFjdHVhbCBjbGFzcyB3ZSB3YW50Ci0gICAgICogQHJldHVybiBvYmplY3Qgb2YgZGVzdENsYXNzIGlmIGNvbnZlcnNpb24gcG9zc2libGUsIG90aGVyd2lzZSByZXR1cm5zIGFyZwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGNvbnZlcnQoT2JqZWN0IGFyZywgQ2xhc3MgZGVzdENsYXNzKSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChkZXN0Q2xhc3MgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGFyZzsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChhcmcgIT0gbnVsbCAmJiBkZXN0Q2xhc3MuaXNBc3NpZ25hYmxlRnJvbShhcmcuZ2V0Q2xhc3MoKSkpIHsKLSAgICAgICAgICAgIHJldHVybiBhcmc7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIFN0cmluZyBjbHNOYW1lID0gIm51bGwiOwotICAgICAgICAgICAgaWYgKGFyZyAhPSBudWxsKSBjbHNOYW1lID0gYXJnLmdldENsYXNzKCkuZ2V0TmFtZSgpOwotICAgICAgICAgICAgbG9nLmRlYnVnKCJDb252ZXJ0aW5nIGFuIG9iamVjdCBvZiB0eXBlICIgKyBjbHNOYW1lICsgIiB0byBhbiBvYmplY3Qgb2YgdHlwZSAiICsKLSAgICAgICAgICAgICAgICAgICAgZGVzdENsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBDb252ZXJ0IGJldHdlZW4gQ2FsZW5kYXIgYW5kIERhdGUKLSAgICAgICAgaWYgKGFyZyBpbnN0YW5jZW9mIENhbGVuZGFyICYmIGRlc3RDbGFzcyA9PSBEYXRlLmNsYXNzKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChDYWxlbmRhcilhcmcpLmdldFRpbWUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIENvbnZlcnQgYmV0d2VlbiBIYXNoTWFwIGFuZCBIYXNodGFibGUKLSAgICAgICAgaWYgKGFyZyBpbnN0YW5jZW9mIEhhc2hNYXAgJiYgZGVzdENsYXNzID09IEhhc2h0YWJsZS5jbGFzcykgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBIYXNodGFibGUoKEhhc2hNYXApYXJnKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKGFyZyBpbnN0YW5jZW9mIElucHV0U3RyZWFtICYmIGRlc3RDbGFzcyA9PSBieXRlW10uY2xhc3MpIHsKLQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IChJbnB1dFN0cmVhbSkgYXJnOwotICAgICAgICAgICAgICAgIHJldHVybiBnZXRCeXRlc0Zyb21TdHJlYW0oaXMpOwotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYXJnIGluc3RhbmNlb2YgU291cmNlICYmIGRlc3RDbGFzcyA9PSBieXRlW10uY2xhc3MpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaWYgKGFyZyBpbnN0YW5jZW9mIFN0cmVhbVNvdXJjZSkgewotICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBpcyA9ICgoU3RyZWFtU291cmNlKSBhcmcpLmdldElucHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0Qnl0ZXNGcm9tU3RyZWFtKGlzKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICAgICAgICAgIFJlc3VsdCByZXN1bHQgPSBuZXcgU3RyZWFtUmVzdWx0KG91dCk7Ci0gICAgICAgICAgICAgICAgVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdUcmFuc2Zvcm1lcigpOwotICAgICAgICAgICAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybSgoU291cmNlKSBhcmcsIHJlc3VsdCk7Ci0gICAgICAgICAgICAgICAgYnl0ZVtdIGJ5dGVzID0gb3V0LnRvQnl0ZUFycmF5KCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGJ5dGVzOwotCi0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotCi0gICAgICAgIGlmIChhcmcgaW5zdGFuY2VvZiBEYXRhSGFuZGxlcikgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBpcyA9ICgoRGF0YUhhbmRsZXIpIGFyZykuZ2V0SW5wdXRTdHJlYW0oKTsKLSAgICAgICAgICAgICAgICBpZiAoZGVzdENsYXNzID09IEltYWdlLmNsYXNzKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBJbWFnZUlPLnJlYWQoaXMpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGVzdENsYXNzID09IFNvdXJjZS5jbGFzcykgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmVhbVNvdXJjZShpcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJ5dGVbXSBieXRlcyA9IGdldEJ5dGVzRnJvbVN0cmVhbShpcyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnQoYnl0ZXMsIGRlc3RDbGFzcyk7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYXJnIGluc3RhbmNlb2YgYnl0ZVtdICYmIGRlc3RDbGFzcyA9PSBTdHJpbmcuY2xhc3MpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKChieXRlW10pIGFyZyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBJZiB0aGUgZGVzdGluYXRpb24gaXMgYW4gYXJyYXkgYW5kIHRoZSBzb3VyY2UKLSAgICAgICAgLy8gaXMgYSBzdWl0YWJsZSBjb21wb25lbnQsIHJldHVybiBhbiBhcnJheSB3aXRoIAotICAgICAgICAvLyB0aGUgc2luZ2xlIGl0ZW0uCi0gICAgICAgIC8qIFJFVklFVyBkbyB3ZSBuZWVkIHRvIHN1cHBvcnQgYXRvbWljIHRvIGFycmF5IGNvbnZlcnNpb24gPwotICAgICAgICBpZiAoYXJnICE9IG51bGwgJiYKLSAgICAgICAgICAgIGRlc3RDbGFzcy5pc0FycmF5KCkgJiYKLSAgICAgICAgICAgICFkZXN0Q2xhc3MuZ2V0Q29tcG9uZW50VHlwZSgpLmVxdWFscyhPYmplY3QuY2xhc3MpICYmCi0gICAgICAgICAgICBkZXN0Q2xhc3MuZ2V0Q29tcG9uZW50VHlwZSgpLmlzQXNzaWduYWJsZUZyb20oYXJnLmdldENsYXNzKCkpKSB7Ci0gICAgICAgICAgICBPYmplY3QgYXJyYXkgPSAKLSAgICAgICAgICAgICAgICBBcnJheS5uZXdJbnN0YW5jZShkZXN0Q2xhc3MuZ2V0Q29tcG9uZW50VHlwZSgpLCAxKTsKLSAgICAgICAgICAgIEFycmF5LnNldChhcnJheSwgMCwgYXJnKTsKLSAgICAgICAgICAgIHJldHVybiBhcnJheTsKLSAgICAgICAgfQotICAgICAgICAqLwotCi0gICAgICAgIC8vIFJldHVybiBpZiBubyBjb252ZXJzaW9uIGlzIGF2YWlsYWJsZQotICAgICAgICBpZiAoIShhcmcgaW5zdGFuY2VvZiBDb2xsZWN0aW9uIHx8Ci0gICAgICAgICAgICAgICAgKGFyZyAhPSBudWxsICYmIGFyZy5nZXRDbGFzcygpLmlzQXJyYXkoKSkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gYXJnOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGFyZyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFRoZSBhcmcgbWF5IGJlIGFuIGFycmF5IG9yIExpc3QgCi0gICAgICAgIE9iamVjdCBkZXN0VmFsdWUgPSBudWxsOwotICAgICAgICBpbnQgbGVuZ3RoID0gMDsKLSAgICAgICAgaWYgKGFyZy5nZXRDbGFzcygpLmlzQXJyYXkoKSkgewotICAgICAgICAgICAgbGVuZ3RoID0gQXJyYXkuZ2V0TGVuZ3RoKGFyZyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBsZW5ndGggPSAoKENvbGxlY3Rpb24pYXJnKS5zaXplKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoZGVzdENsYXNzLmlzQXJyYXkoKSkgewotICAgICAgICAgICAgICAgIGlmIChkZXN0Q2xhc3MuZ2V0Q29tcG9uZW50VHlwZSgpLmlzUHJpbWl0aXZlKCkpIHsKLQotICAgICAgICAgICAgICAgICAgICBPYmplY3QgYXJyYXkgPSBBcnJheS5uZXdJbnN0YW5jZShkZXN0Q2xhc3MuZ2V0Q29tcG9uZW50VHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICAvLyBBc3NpZ24gYXJyYXkgZWxlbWVudHMKLSAgICAgICAgICAgICAgICAgICAgaWYgKGFyZy5nZXRDbGFzcygpLmlzQXJyYXkoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5LnNldChhcnJheSwgaSwgQXJyYXkuZ2V0KGFyZywgaSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlkeCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSAoKENvbGxlY3Rpb24pYXJnKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheS5zZXQoYXJyYXksIGlkeCsrLCBpLm5leHQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZGVzdFZhbHVlID0gYXJyYXk7Ci0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBPYmplY3QgW10gYXJyYXk7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhcnJheSA9IChPYmplY3QgW10pQXJyYXkubmV3SW5zdGFuY2UoZGVzdENsYXNzLmdldENvbXBvbmVudFR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFyZzsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8vIFVzZSBjb252ZXJ0IHRvIGFzc2lnbiBhcnJheSBlbGVtZW50cy4KLSAgICAgICAgICAgICAgICAgICAgaWYgKGFyZy5nZXRDbGFzcygpLmlzQXJyYXkoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5W2ldID0gY29udmVydChBcnJheS5nZXQoYXJnLCBpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdENsYXNzLmdldENvbXBvbmVudFR5cGUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWR4ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9ICgoQ29sbGVjdGlvbilhcmcpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5W2lkeCsrXSA9IGNvbnZlcnQoaS5uZXh0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0Q2xhc3MuZ2V0Q29tcG9uZW50VHlwZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBkZXN0VmFsdWUgPSBhcnJheTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKENvbGxlY3Rpb24uY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShkZXN0Q2xhc3MpKSB7Ci0gICAgICAgICAgICAgICAgQ29sbGVjdGlvbiBuZXdMaXN0ID0gbnVsbDsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAvLyBpZiB3ZSBhcmUgdHJ5aW5nIHRvIGNyZWF0ZSBhbiBpbnRlcmZhY2UsIGJ1aWxkIHNvbWV0aGluZwotICAgICAgICAgICAgICAgICAgICAvLyB0aGF0IGltcGxlbWVudHMgdGhlIGludGVyZmFjZQotICAgICAgICAgICAgICAgICAgICBpZiAoZGVzdENsYXNzID09IENvbGxlY3Rpb24uY2xhc3MgfHwgZGVzdENsYXNzID09IExpc3QuY2xhc3MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ld0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGVzdENsYXNzID09IFNldC5jbGFzcykgewotICAgICAgICAgICAgICAgICAgICAgICAgbmV3TGlzdCA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZXdMaXN0ID0gKENvbGxlY3Rpb24pZGVzdENsYXNzLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAvLyBObyBGRkRDIGNvZGUgbmVlZGVkCi0gICAgICAgICAgICAgICAgICAgIC8vIENvdWxkbid0IGJ1aWxkIG9uZSBmb3Igc29tZSByZWFzb24uLi4gc28gZm9yZ2V0IGl0LgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXJnOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChhcmcuZ2V0Q2xhc3MoKS5pc0FycmF5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBsZW5ndGg7IGorKykgewotICAgICAgICAgICAgICAgICAgICAgICAgbmV3TGlzdC5hZGQoQXJyYXkuZ2V0KGFyZywgaikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBqID0gKChDb2xsZWN0aW9uKWFyZykuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICBqLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ld0xpc3QuYWRkKGoubmV4dCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkZXN0VmFsdWUgPSBuZXdMaXN0OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBkZXN0VmFsdWUgPSBhcmc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5LgotICAgICAgICAgICAgICBtYWtlV2ViU2VydmljZUV4Y2VwdGlvbiggCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRNZXNzYWdlKCJjb252ZXJ0VXRpbHMiLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnLmdldENsYXNzKCkudG9TdHJpbmcoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RDbGFzcy50b1N0cmluZygpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQpOyAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gZGVzdFZhbHVlOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBieXRlW10gZ2V0Qnl0ZXNGcm9tU3RyZWFtKElucHV0U3RyZWFtIGlzKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAvLyBUT0RPIFRoaXMgY29kZSBhc3N1bWVzIHRoYXQgYXZhaWxhYmxlIGlzIHRoZSBsZW5ndGggb2YgdGhlIHN0cmVhbS4KLSAgICAgICAgYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbaXMuYXZhaWxhYmxlKCldOwotICAgICAgICBpcy5yZWFkKGJ5dGVzKTsKLSAgICAgICAgcmV0dXJuIGJ5dGVzOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3V0aWxpdHkvRGF0YVNvdXJjZUZvcm1hdHRlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvdXRpbGl0eS9EYXRhU291cmNlRm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4MmNhOTkuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvdXRpbGl0eS9EYXRhU291cmNlRm9ybWF0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51dGlsaXR5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU91dHB1dEZvcm1hdDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTVNvdXJjZWRFbGVtZW50Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuTUlNRU91dHB1dFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5oYW5kbGVyLkF0dGFjaG1lbnRzQWRhcHRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmRhdGFiaW5kaW5nLkRhdGFTb3VyY2VCbG9jazsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuTWVzc2FnZUZvcm1hdHRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5BcHBsaWNhdGlvblhNTEZvcm1hdHRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC51dGlsLlVSTFRlbXBsYXRpbmdVdGlsOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXI7DQotaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRGF0YVNvdXJjZTsNCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247DQotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLk1lc3NhZ2VDb250ZXh0Ow0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLQ0KLXB1YmxpYyBjbGFzcyBEYXRhU291cmNlRm9ybWF0dGVyIGltcGxlbWVudHMgTWVzc2FnZUZvcm1hdHRlciB7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhBcHBsaWNhdGlvblhNTEZvcm1hdHRlci5jbGFzcyk7DQotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGNvbnRlbnRUeXBlOw0KLQ0KLSAgICBwdWJsaWMgRGF0YVNvdXJjZUZvcm1hdHRlcihTdHJpbmcgY29udGVudFR5cGUpIHsNCi0gICAgICAgIHRoaXMuY29udGVudFR5cGUgPSBjb250ZW50VHlwZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYnl0ZVtdIGdldEJ5dGVzKG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCwgT01PdXRwdXRGb3JtYXQgZm9ybWF0KSB0aHJvd3MgQXhpc0ZhdWx0IHsNCi0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiRklYTUUiKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCwgT01PdXRwdXRGb3JtYXQgZm9ybWF0LCBPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtLCBib29sZWFuIHByZXNlcnZlKSB0aHJvd3MgQXhpc0ZhdWx0IHsNCi0gICAgICAgIEF0dGFjaG1lbnRzQWRhcHRlciBhdHRhY2htZW50cyA9IChBdHRhY2htZW50c0FkYXB0ZXIpIG1lc3NhZ2VDb250ZXh0LmdldFByb3BlcnR5KE1lc3NhZ2VDb250ZXh0Lk9VVEJPVU5EX01FU1NBR0VfQVRUQUNITUVOVFMpOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJzdGFydCB3cml0ZVRvKCkiKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYgKGF0dGFjaG1lbnRzICE9IG51bGwgJiYgIWF0dGFjaG1lbnRzLmlzRW1wdHkoKSkgew0KLSAgICAgICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gbWVzc2FnZUNvbnRleHQuZ2V0RW52ZWxvcGUoKS5nZXRCb2R5KCkuZ2V0Rmlyc3RFbGVtZW50KCk7DQotICAgICAgICAgICAgICAgIERhdGFTb3VyY2UgYnVzT2JqZWN0Ow0KLSAgICAgICAgICAgICAgICB0cnkgew0KLSAgICAgICAgICAgICAgICAgICAgYnVzT2JqZWN0ID0gKERhdGFTb3VyY2UpKChEYXRhU291cmNlQmxvY2spKChPTVNvdXJjZWRFbGVtZW50KSBvbUVsZW1lbnQpLmdldERhdGFTb3VyY2UoKSkuZ2V0QnVzaW5lc3NPYmplY3QodHJ1ZSk7DQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBBeGlzRmF1bHQubWFrZUZhdWx0KGUpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIE1JTUVPdXRwdXRVdGlscy53cml0ZURhdGFIYW5kbGVyV2l0aEF0dGFjaG1lbnRzTWVzc2FnZSgNCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgRGF0YUhhbmRsZXIoYnVzT2JqZWN0KSwgDQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFR5cGUsIA0KLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFN0cmVhbSwgDQotICAgICAgICAgICAgICAgICAgICAgICAgYXR0YWNobWVudHMsIA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCk7DQotICAgICAgICAgICAgfSBlbHNlIHsgDQotICAgICAgICAgICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gbWVzc2FnZUNvbnRleHQuZ2V0RW52ZWxvcGUoKS5nZXRCb2R5KCkuZ2V0Rmlyc3RFbGVtZW50KCk7DQotICAgICAgICAgICAgICAgICAgICBpZiAob21FbGVtZW50ICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICB0cnkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlc2VydmUpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9tRWxlbWVudC5zZXJpYWxpemUob3V0cHV0U3RyZWFtLCBmb3JtYXQpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb21FbGVtZW50LnNlcmlhbGl6ZUFuZENvbnN1bWUob3V0cHV0U3RyZWFtLCBmb3JtYXQpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB0cnkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFN0cmVhbS5mbHVzaCgpOw0KLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IEF4aXNGYXVsdC5tYWtlRmF1bHQoZSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJlbmQgd3JpdGVUbygpIik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudFR5cGUob3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0LCBPTU91dHB1dEZvcm1hdCBmb3JtYXQsIFN0cmluZyBzb2FwQWN0aW9uKSB7DQotICAgICAgICBBdHRhY2htZW50c0FkYXB0ZXIgYXR0YWNobWVudHMgPSAoQXR0YWNobWVudHNBZGFwdGVyKSBtZXNzYWdlQ29udGV4dC5nZXRQcm9wZXJ0eShNZXNzYWdlQ29udGV4dC5PVVRCT1VORF9NRVNTQUdFX0FUVEFDSE1FTlRTKTsNCi0gICAgICAgIGlmIChhdHRhY2htZW50cyAhPSBudWxsICYmICFhdHRhY2htZW50cy5pc0VtcHR5KCkpIHsNCi0gICAgICAgICAgICByZXR1cm4gZm9ybWF0LmdldENvbnRlbnRUeXBlRm9yU3dBKGNvbnRlbnRUeXBlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBjb250ZW50VHlwZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgVVJMIGdldFRhcmdldEFkZHJlc3Mob3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0LCBPTU91dHB1dEZvcm1hdCBmb3JtYXQsIFVSTCB0YXJnZXRVUkwpIHRocm93cyBBeGlzRmF1bHQgew0KLSAgICAgICAgLy8gQ2hlY2sgd2hldGhlciB0aGVyZSBpcyBhIHRlbXBsYXRlIGluIHRoZSBVUkwsIGlmIHNvIHdlIGhhdmUgdG8gcmVwbGFjZSB0aGVuIHdpdGggZGF0YQ0KLSAgICAgICAgLy8gdmFsdWVzIGFuZCBjcmVhdGUgYSBuZXcgdGFyZ2V0IFVSTC4NCi0gICAgICAgIHRhcmdldFVSTCA9IFVSTFRlbXBsYXRpbmdVdGlsLmdldFRlbXBsYXRlZFVSTCh0YXJnZXRVUkwsIG1lc3NhZ2VDb250ZXh0LCBmYWxzZSk7DQotICAgICAgICByZXR1cm4gdGFyZ2V0VVJMOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZm9ybWF0U09BUEFjdGlvbihvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQsIE9NT3V0cHV0Rm9ybWF0IGZvcm1hdCwgU3RyaW5nIHNvYXBBY3Rpb24pIHsNCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3V0aWxpdHkvRXhlY3V0b3JGYWN0b3J5LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy91dGlsaXR5L0V4ZWN1dG9yRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDM1MmI0Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3V0aWxpdHkvRXhlY3V0b3JGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MudXRpbGl0eTsKLQotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGludGVyZmFjZSB0aGF0IHNob3VsZCBiZSBpbXBsZW1lbnRlZCBieSBjbGFzc2VzIHRoYXQgd2lzaCB0bwotICogcHJvdmlkZSBFeGVjdXRvciBpbnN0YW5jZXMgdG8gdGhlIEpBWC1XUyBydW50aW1lLiBXaGVuIHRoZSBydW50aW1lIG5lZWRzIGFuCi0gKiBFeGVjdXRvciBpbnN0YW5jZSBpdCB3aWxsIGxvb2sgaW4gdGhlIEZhY3RvcnlSZWdpc3RyeSBmb3IgYW4gaW1wbGVtZW50YXRpb24KLSAqIG9mIHRoaXMgZmFjdG9yeSBhbmQgcmV0cmlldmUgdGhlIGluc3RhbmNlLgotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBFeGVjdXRvckZhY3RvcnkgewotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMSUVOVF9FWEVDVVRPUiA9IDA7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFUlZFUl9FWEVDVVRPUiA9IDE7Ci0gICAgCi0gICAgICAgIC8qKgotICAgICAgICAgKiAKLSAgICAgICAgICogQHJldHVybgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEV4ZWN1dG9yIGdldEV4ZWN1dG9ySW5zdGFuY2UoKTsKLSAgICAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIGV4ZWN1dG9yVHlwZQotICAgICAgICAgKiBAcmV0dXJuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgRXhlY3V0b3IgZ2V0RXhlY3V0b3JJbnN0YW5jZShpbnQgZXhlY3V0b3JUeXBlKTsKLQkKLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3V0aWxpdHkvSkFYV1NFeGVjdXRvckZhY3RvcnkuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3V0aWxpdHkvSkFYV1NFeGVjdXRvckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRmMjk0Yi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy91dGlsaXR5L0pBWFdTRXhlY3V0b3JGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MudXRpbGl0eTsKLQotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yczsKLQotLyoqCi0gKiBUaGlzIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBFeGVjdXRvckZhY3RvcnkgaW50ZXJmYWNlLiBJdCBpcyB1c2VkCi0gKiB0byBwcm92aWRlIGFuIEV4ZWN1dG9yIHRvIGEgU2VydmljZURlbGVnYXRlIGluc3RhbmNlLiBUaGUgRXhlY3V0b3IgaW5zdGFuY2UKLSAqIHdpbGwgYmUgYmFja2VkIGJ5IHRoZSBKQVhXU1RocmVhZEZhY3RvcnkuCi0gKgotICovCi1wdWJsaWMgY2xhc3MgSkFYV1NFeGVjdXRvckZhY3RvcnkgaW1wbGVtZW50cyBFeGVjdXRvckZhY3RvcnkgewotCi0gICAgcHVibGljIEV4ZWN1dG9yIGdldEV4ZWN1dG9ySW5zdGFuY2UoKSB7Ci0gICAgICAgIHJldHVybiBFeGVjdXRvcnMubmV3Rml4ZWRUaHJlYWRQb29sKDMsIG5ldyBKQVhXU1RocmVhZEZhY3RvcnkoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIEV4ZWN1dG9yIGdldEV4ZWN1dG9ySW5zdGFuY2UoaW50IGV4ZWN1dG9yVHlwZSkgewotICAgICAgICByZXR1cm4gZ2V0RXhlY3V0b3JJbnN0YW5jZSgpOwotICAgIH0KLSAgICAgICAgCi0JCi0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3V0aWxpdHkvSkFYV1NUaHJlYWRGYWN0b3J5LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy91dGlsaXR5L0pBWFdTVGhyZWFkRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YmM5MjdlLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3V0aWxpdHkvSkFYV1NUaHJlYWRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MudXRpbGl0eTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuRXhjZXB0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkRmFjdG9yeTsKLQotLyoqCi0gKiBGYWN0b3J5IHRvIGNyZWF0ZSB0aHJlYWRzIGluIHRoZSBUaHJlYWRQb29sIEV4ZWN1dG9yLiAgV2UgcHJvdmlkZSBhIGZhY3Rvcnkgc28gCi0gKiB0aGUgdGhyZWFkcyBjYW4gYmUgc2V0IGFzIGRhZW1vbiB0aHJlYWRzIHNvIHRoYXQgdGhleSBkbyBub3QgcHJldmVudCB0aGUgSlZNIGZyb20gCi0gKiBleGl0aW5nIG5vcm1hbGx5IHdoZW4gdGhlIG1haW4gY2xpZW50IHRocmVhZCBpcyBmaW5pc2hlZC4KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBKQVhXU1RocmVhZEZhY3RvcnkgaW1wbGVtZW50cyBUaHJlYWRGYWN0b3J5IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coSkFYV1NUaHJlYWRGYWN0b3J5LmNsYXNzKTsKLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgZ3JvdXBOdW1iZXIgPSAwOwotICAgIHByaXZhdGUgaW50IHRocmVhZE51bWJlciA9IDA7Ci0gICAgLy8gV2UgcHV0IHRoZSB0aHJlYWRzIGludG8gYSB1bmlxdWUgdGhyZWFkIGdyb3VwIG9ubHkgZm9yIGVhc2Ugb2YgaWRlbnRpZnlpbmcgdGhlbQotICAgIHByaXZhdGUgVGhyZWFkR3JvdXAgdGhyZWFkR3JvdXAgPSBudWxsOwotCi0gICAgcHVibGljIFRocmVhZCBuZXdUaHJlYWQoZmluYWwgUnVubmFibGUgcikgewotICAgICAgICBpZiAodGhyZWFkR3JvdXAgPT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICB0aHJlYWRHcm91cCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoVGhyZWFkR3JvdXApIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRocmVhZEdyb3VwKCJKQVgtV1MgRGVmYXVsdCBFeGVjdXRvciBHcm91cCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBncm91cE51bWJlcisrKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkV4Y2VwdGlvbiB0aHJvd24gZnJvbSBBY2Nlc3NDb250cm9sbGVyOiAiICsgZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZS5nZXRFeGNlcHRpb24oKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB0aHJlYWROdW1iZXIrKzsKLSAgICAgICAgVGhyZWFkIHJldHVyblRocmVhZCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm5UaHJlYWQgPSAoVGhyZWFkKSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbigpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgVGhyZWFkIG5ld1RocmVhZCA9IG5ldyBUaHJlYWQodGhyZWFkR3JvdXAsIHIpOwotICAgICAgICAgICAgICAgICAgICBuZXdUaHJlYWQuc2V0RGFlbW9uKHRydWUpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3VGhyZWFkOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICB9IGNhdGNoIChQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiRXhjZXB0aW9uIHRocm93biBmcm9tIEFjY2Vzc0NvbnRyb2xsZXI6ICIgKyBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZS5nZXRFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmV0dXJuVGhyZWFkOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3V0aWxpdHkvSmF2YVV0aWxzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy91dGlsaXR5L0phdmFVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNGMxYjJjLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3V0aWxpdHkvSmF2YVV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnV0aWxpdHk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi0vKiogQ29tbW9uIEphdmEgVXRpbGl0ZXMgKi8KLXB1YmxpYyBjbGFzcyBKYXZhVXRpbHMgZXh0ZW5kcyBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuSmF2YVV0aWxzIHsKLQotICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhKYXZhVXRpbHMuY2xhc3MpOwotICAgIAotICAgIC8qKiBQcml2YXRlIENvbnN0cnVjdG9yLi4uQWxsIG1ldGhvZHMgb2YgdGhpcyBjbGFzcyBhcmUgc3RhdGljICovCi0gICAgcHJpdmF0ZSBKYXZhVXRpbHMoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTmFtZXNwYWNlIDIgUGFja2FnZSBhbGdvcml0aG0gYXMgZGVmaW5lZCBieSB0aGUgSkFYQiBTcGVjaWZpY2F0aW9uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gTmFtZXNwYWNlCi0gICAgICogQHJldHVybiBTdHJpbmcgcmVwcmVzZXRpbmcgTmFtZXNwYWNlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UGFja2FnZUZyb21OYW1lc3BhY2UoU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICAvLyBUaGUgZm9sbG93aW5nIHN0ZXBzIGNvcnJlc3BvbmQgdG8gc3RlcHMgZGVzY3JpYmVkIGluIHRoZSBKQVhCIFNwZWNpZmljYXRpb24KLQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygibmFtZXNwYWNlICgiICtuYW1lc3BhY2UgKyIpIik7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gU3RlcCAxOiBTY2FuIG9mZiB0aGUgaG9zdCBuYW1lCi0gICAgICAgIFN0cmluZyBob3N0bmFtZSA9IG51bGw7Ci0gICAgICAgIFN0cmluZyBwYXRoID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFVSTCB1cmwgPSBuZXcgVVJMKG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICBob3N0bmFtZSA9IHVybC5nZXRIb3N0KCk7Ci0gICAgICAgICAgICBwYXRoID0gdXJsLmdldFBhdGgoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIE5vIEZGREMgY29kZSBuZWVkZWQKLSAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuaW5kZXhPZigiOiIpID4gLTEpIHsKLSAgICAgICAgICAgICAgICAvLyBCcmFpbi1kZWFkIGNvZGUgdG8gc2tpcCBvdmVyIHRoZSBwcm90b2NvbAotICAgICAgICAgICAgICAgIGhvc3RuYW1lID0gbmFtZXNwYWNlLnN1YnN0cmluZyhuYW1lc3BhY2UuaW5kZXhPZigiOiIpICsgMSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGhvc3RuYW1lID0gbmFtZXNwYWNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJob3N0bmFtZSAoIiAraG9zdG5hbWUgKyIpIik7Ci0gICAgICAgICAgICBsb2cuZGVidWcoInBhdGggKCIgK3BhdGggKyIpIik7Ci0gICAgICAgIH0KLSAgICAgICAgCi0KLSAgICAgICAgLy8gU3RlcCAzOiBUb2tlbml6ZSB0aGUgaG9zdCBuYW1lIHVzaW5nICI6IiBhbmQgIi8iCi0gICAgICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoaG9zdG5hbWUsICI6LyIpOwotCi0gICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IHdvcmRMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0KLSAgICAgICAgLy9SZWFkIEhvc3RuYW1lIGZpcnN0LgotICAgICAgICBmb3IgKGludCBpID0gMDsgc3QgIT0gbnVsbCAmJiBpIDwgc3QuY291bnRUb2tlbnMoKTsgKytpKSB7Ci0gICAgICAgICAgICB3b3JkTGlzdC5hZGQoc3QubmV4dFRva2VuKCkpOwotICAgICAgICB9Ci0gICAgICAgIC8vUmVhZCByZXN0IE9mIHRoZSBwYXRoIG5vdwotICAgICAgICBpZiAocGF0aCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmdUb2tlbml6ZXIgcGF0aHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihwYXRoLCAiLyIpOwotICAgICAgICAgICAgd2hpbGUgKHBhdGhzdCAhPSBudWxsICYmIHBhdGhzdC5oYXNNb3JlVG9rZW5zKCkpIHsKLSAgICAgICAgICAgICAgICB3b3JkTGlzdC5hZGQocGF0aHN0Lm5leHRUb2tlbigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBTdHJpbmdbXSB3b3JkcyA9IHdvcmRMaXN0LnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0KLSAgICAgICAgLy8gTm93IGRvIHN0ZXAgMjogU3RyaXAgb2ZmIHRoZSB0cmFpbGluZyAiLiIgKGkuZS4gc3RyaXAgb2ZmIC5odG1sKQotICAgICAgICBpZiAod29yZHMgIT0gbnVsbCAmJiB3b3Jkcy5sZW5ndGggPiAxKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbGFzdFdvcmQgPSB3b3Jkc1t3b3Jkcy5sZW5ndGggLSAxXTsKLSAgICAgICAgICAgIGludCBpbmRleCA9IGxhc3RXb3JkLmxhc3RJbmRleE9mKCcuJyk7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPiAwKSB7Ci0gICAgICAgICAgICAgICAgd29yZHNbd29yZHMubGVuZ3RoIC0gMV0gPSBsYXN0V29yZC5zdWJzdHJpbmcoMCwgaW5kZXgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gU3RlcCA0OiBVbmVzY2FwZSBlYWNoIGVzY2FwZSBzZXF1ZW5jZQotICAgICAgICAvLyBUT0RPIEkgZG9uJ3Qga25vdyB3aGF0IHRvIGRvIGhlcmUuCi0KLSAgICAgICAgLy8gU3RlcCA1OiBJZiBwcm90b2NvbCBpcyB1cm4sIHJlcGxhY2UgLSB3aXRoIC4gaW4gdGhlIGZpcnN0IHdvcmQKLSAgICAgICAgaWYgKG5hbWVzcGFjZS5zdGFydHNXaXRoKCJ1cm46IikpIHsKLSAgICAgICAgICAgIHdvcmRzWzBdID0gcmVwbGFjZSh3b3Jkc1swXSwgIi0iLCAiLiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gU3RlcCA2OiBUb2tlbml6ZSB0aGUgZmlyc3Qgd29yZCB3aXRoICIuIiBhbmQgcmV2ZXJzZSB0aGUgb3JkZXIuICh0aGUgd3d3IGlzIGFsc28gcmVtb3ZlZCkuCi0gICAgICAgIC8vIFRPRE8gVGhpcyBpcyBub3QgZXhhY3RseSBlcXVpdmFsZW50IHRvIHRoZSBKQVhCIFJ1bGUuCi0gICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgaWYgKHdvcmRzLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgIFN0cmluZ1Rva2VuaXplciBzdDIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHdvcmRzWzBdLCAiLiIpOwotICAgICAgICAKLSAgICAgICAgICAgIHdoaWxlIChzdDIuaGFzTW9yZVRva2VucygpKSB7Ci0gICAgICAgICAgICAgICAgLy8gQWRkIHRoZSBzdHJpbmdzIHNvIHRoZXkgYXJlIGluIHJldmVyc2Ugb3JkZXIKLSAgICAgICAgICAgICAgICBsaXN0LmFkZCgwLCBzdDIubmV4dFRva2VuKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBSZW1vdmUgd3d3Ci0gICAgICAgIGlmIChsaXN0LnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIFN0cmluZyBsYXN0ID0gbGlzdC5nZXQobGlzdC5zaXplKCkgLSAxKTsKLSAgICAgICAgICAgIGlmIChsYXN0LmVxdWFscygid3d3IikpIHsKLSAgICAgICAgICAgICAgICBsaXN0LnJlbW92ZShsaXN0LnNpemUoKSAtIDEpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIE5vdyBlYWNoIG9mIHdvcmRzIGlzIHJlcHJlc2VudGVkIGJ5IGxpc3QKLSAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCB3b3Jkcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgbGlzdC5hZGQod29yZHNbaV0pOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gU3RlcCA3OiBsb3dlcmNhc2UgZWFjaCB3b3JkCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgU3RyaW5nIHdvcmQgPSBsaXN0LnJlbW92ZShpKTsKLSAgICAgICAgICAgIHdvcmQgPSB3b3JkLnRvTG93ZXJDYXNlKCk7Ci0gICAgICAgICAgICBsaXN0LmFkZChpLCB3b3JkKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFN0ZXAgODogbWFrZSBpbnRvIGFuZCBhbiBhcHByb3ByaWF0ZSBqYXZhIHdvcmQKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBTdHJpbmcgd29yZCA9IGxpc3QuZ2V0KGkpOwotCi0gICAgICAgICAgICAvLyA4YTogQ29udmVydCBzcGVjaWFsIGNoYXJhY3RlcnMgdG8gdW5kZXJzY29yZQotICAgICAgICAgICAgLy8gQ29udmVydCBub24tamF2YSB3b3JkcyB0byB1bmRlcnNjb3JlLgotICAgICAgICAgICAgLy8gVE9ETzogTmVlZCB0byBkbyB0aGlzIGZvciBhbGwgY2hhcnMuLm5vdCBqdXN0IGh5cGhlbnMKLSAgICAgICAgICAgIHdvcmQgPSByZXBsYWNlKHdvcmQsICItIiwgIl8iKTsKLQotICAgICAgICAgICAgLy8gOGI6IEFwcGVuZCBfIHRvIGphdmEga2V5d29yZHMKLSAgICAgICAgICAgIGlmIChKYXZhVXRpbHMuaXNKYXZhS2V5d29yZCh3b3JkKSkgewotICAgICAgICAgICAgICAgIHdvcmQgPSB3b3JkICsgIl8iOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gOGM6IHByZXBlbmQgXyBpZiBmaXJzdCBjaGFyYWN0ZXIgY2Fubm90IGJlIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgYSBqYXZhIGlkZW50aWZpZXIKLSAgICAgICAgICAgIGlmICghQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJTdGFydCh3b3JkLmNoYXJBdCgwKSkpIHsKLSAgICAgICAgICAgICAgICB3b3JkID0gIl8iICsgd29yZDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbGlzdC5zZXQoaSwgd29yZCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTdGVwIDk6IENvbmNhdGVuYXRlIGFuZCByZXR1cm4KLSAgICAgICAgU3RyaW5nIG5hbWUgPSAiIjsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoaSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgbmFtZSA9IGxpc3QuZ2V0KDApOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBuYW1lID0gbmFtZSArICIuIiArIGxpc3QuZ2V0KGkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygicGFja2FnZSBuYW1lICgiICtuYW1lICsiKSIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogR2V0IGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHN0YWNrIG9mIHRoZSBjdXJyZW50IGxvY2F0aW9uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFN0cmluZwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0YWNrVG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiBzdGFja1RvU3RyaW5nKG5ldyBSdW50aW1lRXhjZXB0aW9uKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBhIHN0cmluZyBjb250YWluaW5nIHRoZSBzdGFjayBvZiB0aGUgc3BlY2lmaWVkIGV4Y2VwdGlvbgotICAgICAqCi0gICAgICogQHBhcmFtIGUKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgc3RhY2tUb1N0cmluZyhUaHJvd2FibGUgZSkgewotICAgICAgICBqYXZhLmlvLlN0cmluZ1dyaXRlciBzdyA9IG5ldyBqYXZhLmlvLlN0cmluZ1dyaXRlcigpOwotICAgICAgICBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyIGJ3ID0gbmV3IGphdmEuaW8uQnVmZmVyZWRXcml0ZXIoc3cpOwotICAgICAgICBqYXZhLmlvLlByaW50V3JpdGVyIHB3ID0gbmV3IGphdmEuaW8uUHJpbnRXcml0ZXIoYncpOwotICAgICAgICBlLnByaW50U3RhY2tUcmFjZShwdyk7Ci0gICAgICAgIHB3LmNsb3NlKCk7Ci0gICAgICAgIFN0cmluZyB0ZXh0ID0gc3cuZ2V0QnVmZmVyKCkudG9TdHJpbmcoKTsKLSAgICAgICAgLy8gSnVtcCBwYXN0IHRoZSB0aHJvd2FibGUKLSAgICAgICAgdGV4dCA9IHRleHQuc3Vic3RyaW5nKHRleHQuaW5kZXhPZigiYXQiKSk7Ci0gICAgICAgIHRleHQgPSByZXBsYWNlKHRleHQsICJhdCAiLCAiREVCVUdfRlJBTUUgPSAiKTsKLSAgICAgICAgcmV0dXJuIHRleHQ7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEdldCBjaGVja2VkIGV4Y2VwdGlvbgotICAgICAqIEBwYXJhbSB0aHJvd2FibGUgVGhyb3dhYmxlCi0gICAgICogQHBhcmFtIG1ldGhvZCBNZXRob2QKLSAgICAgKiBAcmV0dXJuIENsYXNzIG9mIHRoZSBjaGVja2VkIGV4Y2VwdGlvbiBvciBudWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBDbGFzcyBnZXRDaGVja2VkRXhjZXB0aW9uKFRocm93YWJsZSB0aHJvd2FibGUsIE1ldGhvZCBtZXRob2QpIHsKLSAgICAgICAgaWYgKG1ldGhvZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBDbGFzc1tdIGV4Y2VwdGlvbnMgPSBtZXRob2QuZ2V0RXhjZXB0aW9uVHlwZXMoKTsKLSAgICAgICAgaWYgKGV4Y2VwdGlvbnMgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPCBleGNlcHRpb25zLmxlbmd0aDsgaSsrICkgewotICAgICAgICAgICAgICAgIGlmIChleGNlcHRpb25zW2ldLmlzQXNzaWduYWJsZUZyb20odGhyb3dhYmxlLmdldENsYXNzKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBleGNlcHRpb25zW2ldOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgICAgIAotICAgIC8qKgotICAgICAqIENvbnZlcnQgYSBTdHJpbmcgdG8gYSBVUkksIGhhbmRsaW5nIHNwZWNpYWwgY2hhcmFjdGVycyBpbiB0aGUgU3RyaW5nIHN1Y2ggYXMKLSAgICAgKiBzcGFjZXMuCi0gICAgICogCi0gICAgICogQHBhcmFtIHBhdGhTdHJpbmcgVGhlIFN0cmluZyB0byBiZSBjb252ZXJ0ZWQgdG8gYSBVUkkKLSAgICAgKiBAcmV0dXJuIGEgVVJJIG9yIG51bGwgaWYgdGhlIFN0cmluZyBjYW4ndCBiZSBjb252ZXJ0ZWQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBVUkkgY3JlYXRlVVJJKFN0cmluZyBwYXRoU3RyaW5nKSB7Ci0gICAgICAgIFVSSSBwYXRoVVJJID0gbnVsbDsKLSAgICAgICAgaWYgKHBhdGhTdHJpbmcgPT0gbnVsbCB8fCAiIi5lcXVhbHMocGF0aFN0cmluZykpIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiUGF0aCBzdHJpbmcgYXJndW1lbnQgaXMgaW52YWxpZCBbIiArIHBhdGhTdHJpbmcgKyAiXTsgcmV0dXJuaW5nIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHBhdGhVUkkgPSBuZXcgVVJJKHBhdGhTdHJpbmcpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZXgxKSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlVuYWJsZSB0byBjcmVhdGUgVVJJIGZyb20gWyIgKyBwYXRoU3RyaW5nICsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJdLCB0cnlpbmcgYWx0ZXJuYXRpdmUgYXBwcm9hY2giKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBUaGUgVVJJIGNyZWF0aW9uIHJlcXVpcmVzIHNwZWNpYWwgY2hhcmFjdGVycywgc3VjaCBhcyBzcGFjZXMsIGJlIGVzY2FwZWQgb3IKLSAgICAgICAgICAgICAqIGNvbnZlcnRlZC4gIFRoZSA1IGFyZ3VtZW50IGNvbnN0dWN0b3Igd2lsbCBkbyB0aGF0IGZvciB1cy4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBwYXRoVVJJID0gbmV3IFVSSShudWxsLCBudWxsLCBwYXRoU3RyaW5nLCBudWxsKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBleDIpIHsKLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLnRyYWNlKCJVbmFibGUgdG8gY3JlYXRlIFVSSSB1c2luZyBhbHRlcm5hdGl2ZSBhcHByb2FjaDsgcmV0dXJuaW5nIG51bGwuICBFeGNlcHRpb24gY2F1Z2h0IGR1cmluZyBpbml0YWwgYXR0ZW1wdDogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBKYXZhVXRpbHMuc3RhY2tUb1N0cmluZyhleDEpKTsKLSAgICAgICAgICAgICAgICAgICAgbG9nLnRyYWNlKCJFeGNlcHRpb24gY2F1Z2h0IGR1cmluZyBhbHRlcm5ldCBhdHRlbXQgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBKYXZhVXRpbHMuc3RhY2tUb1N0cmluZyhleDIpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbG9nLmVycm9yKGV4Mi50b1N0cmluZygpLCBleDIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwYXRoVVJJOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3V0aWxpdHkvUHJvcGVydHlEZXNjcmlwdG9yUGx1cy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvdXRpbGl0eS9Qcm9wZXJ0eURlc2NyaXB0b3JQbHVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2ZmM0NTMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvdXRpbGl0eS9Qcm9wZXJ0eURlc2NyaXB0b3JQbHVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnV0aWxpdHk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLkV4Y2VwdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5pMThuLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Mud3JhcHBlci5pbXBsLkpBWEJXcmFwcGVyRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCRWxlbWVudDsKLWltcG9ydCBqYXZhLmJlYW5zLkluZGV4ZWRQcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLS8qKgotICogQSBQcm9wZXJ0eURlc2NyaXB0b3IgcHJvdmlkZXMgYWNlc3NzIHRvIGEgYmVhbiBwcm9wZXJ0eS4gIFZhbHVlcyBjYW4gYmUgcXVlcmllZC9jaGFuZ2VkIHVzaW5nIHRoZQotICogcmVhZCBhbmQgd3JpdGVyIG1ldGhvZHMgb2YgdGhlIFByb3BlcnR5RGVzY3JpcHRvci4KLSAqIDxwLz4KLSAqIEEgUHJvcGVydHlEZXNjcmlwdG9yUGx1cyBvYmplY3Qgd3JhcHMgYSBQcm9wZXJ0eURlc2NyaXB0b3IgYW5kIHN1cHBsaWVzIGVuaGFuY2VkIHNldC9nZXQgbWV0aG9kcwotICogdGhhdCBtYXRjaCBKQVhCIHNlbWFudGlzLgotICogPHAvPgotICogRm9yIGV4YW1wbGUsIHRoZSBzZXQoLi4pIG1ldGhvZCBpcyBzbWFydCBlbm91Z2ggdG8gYWRkIGxpc3RzLCBhcnJheXMgYW5kIGF0b21pYyB2YWx1ZXMgb24gSkFYQgotICogYmVhbnMuCi0gKiA8cC8+Ci0gKiBUaGUgUHJvcGVydHlEZXNjcmlwdG9yUGx1cyBvYmplY3QgYWxzbyBzdG9yZXMgdGhlIHhtbE5hbWUgb2YgdGhlIHByb3BlcnR5LgotICoKLSAqIEBTZWUgWE1MUm9vdEVsZW1lbnRVdGlsLmNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvck1hcCAsIHdoaWNoIGNyZWF0ZXMgdGhlIFByb3BlcnR5RGVzY3JpcHRvclBsdXMKLSAqIG9iamVjdHMKLSAqLwotcHVibGljIGNsYXNzIFByb3BlcnR5RGVzY3JpcHRvclBsdXMgewotICAgIFByb3BlcnR5RGVzY3JpcHRvciBkZXNjcmlwdG9yOwotICAgIFFOYW1lIHhtbE5hbWUgPSBudWxsOwotICAgIAotICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhQcm9wZXJ0eURlc2NyaXB0b3JQbHVzLmNsYXNzKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHX0VOQUJMRUQgPSBsb2cuaXNEZWJ1Z0VuYWJsZWQoKTsKLQotICAgIC8qKgotICAgICAqIFBhY2thZ2UgcHJvdGVjdGVkIGNvbnN0cnVjdG9yLiAgT25seSBjcmVhdGVkIGJ5IFhNTFJvb3RFbGVtZW50VXRpbC5jcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3JNYXAKLSAgICAgKgotICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLSAgICAgKiBAcGFyYW0gZGVzY3JpcHRvcgotICAgICAqIEBzZWUgWE1MUm9vdEVsZW1lbnRVdGlsLmNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvck1hcAotICAgICAqLwotICAgIFByb3BlcnR5RGVzY3JpcHRvclBsdXMoUHJvcGVydHlEZXNjcmlwdG9yIGRlc2NyaXB0b3IsIFFOYW1lIHhtbE5hbWUpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgdGhpcy5kZXNjcmlwdG9yID0gZGVzY3JpcHRvcjsKLSAgICAgICAgdGhpcy54bWxOYW1lID0geG1sTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQYWNrYWdlIHByb3RlY3RlZCBjb25zdHJ1Y3Rvci4gIE9ubHkgY3JlYXRlZCBieSBYTUxSb290RWxlbWVudFV0aWwuY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yTWFwCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0gICAgICogQHBhcmFtIGRlc2NyaXB0b3IKLSAgICAgKiBAc2VlIFhNTFJvb3RFbGVtZW50VXRpbC5jcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3JNYXAKLSAgICAgKi8KLSAgICBQcm9wZXJ0eURlc2NyaXB0b3JQbHVzKFByb3BlcnR5RGVzY3JpcHRvciBkZXNjcmlwdG9yLCBTdHJpbmcgeG1sTmFtZSkgewotICAgICAgICBzdXBlcigpOwotICAgICAgICB0aGlzLmRlc2NyaXB0b3IgPSBkZXNjcmlwdG9yOwotICAgICAgICB0aGlzLnhtbE5hbWUgPSBuZXcgUU5hbWUoIiIsIHhtbE5hbWUpOwotICAgIH0KLQotICAgIC8qKiBAcmV0dXJuIHhtbG5hbWUgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFhtbE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiB4bWxOYW1lLmdldExvY2FsUGFydCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBRTmFtZSBnZXRYbWxRTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHhtbE5hbWU7Ci0gICAgfQotICAgIAotICAgIC8qKiBAcmV0dXJuIHByb3BlcnR5IHR5cGUgKi8KLSAgICBwdWJsaWMgQ2xhc3MgZ2V0UHJvcGVydHlUeXBlKCkgewotICAgICAgICByZXR1cm4gZGVzY3JpcHRvci5nZXRQcm9wZXJ0eVR5cGUoKTsKLSAgICB9Ci0KLSAgICAvKiogQHJldHVybiBwcm9wZXJ0eSBuYW1lICovCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBkZXNjcmlwdG9yLmdldE5hbWUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIG9iamVjdAotICAgICAqCi0gICAgICogQHBhcmFtIHRhcmdldEJlYW4KLSAgICAgKiBAcmV0dXJuIE9iamVjdCBmb3IgdGhpcyBwcm9wZXJ0eSBvciBudWxsCi0gICAgICogQHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uCi0gICAgICogQHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXQoT2JqZWN0IHRhcmdldEJlYW4pIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGlmKGRlc2NyaXB0b3IgPT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgicERlc2NyRXJyIikpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTWV0aG9kIG1ldGhvZCA9IGRlc2NyaXB0b3IuZ2V0UmVhZE1ldGhvZCgpOwotICAgICAgICAgICAgaWYobWV0aG9kID09IG51bGwgJiYgZGVzY3JpcHRvci5nZXRQcm9wZXJ0eVR5cGUoKSA9PSBCb29sZWFuLmNsYXNzKXsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcHJvcGVydHlOYW1lID0gZGVzY3JpcHRvci5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgaWYocHJvcGVydHlOYW1lICE9IG51bGwpewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbWV0aG9kTmFtZSA9ICJpcyI7Ci0gICAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSBtZXRob2ROYW1lICsgKChwcm9wZXJ0eU5hbWUubGVuZ3RoKCk+MCk/cHJvcGVydHlOYW1lLnN1YnN0cmluZygwLDEpLnRvVXBwZXJDYXNlKCk6IiIpOwotICAgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gbWV0aG9kTmFtZSArICgocHJvcGVydHlOYW1lLmxlbmd0aCgpID4gMSk/cHJvcGVydHlOYW1lLnN1YnN0cmluZygxKToiIik7Ci0gICAgICAgICAgICAgICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiTWV0aG9kIE5hbWUgPSIgK21ldGhvZE5hbWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgdHJ5ewotICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QgPSB0YXJnZXRCZWFuLmdldENsYXNzKCkuZ2V0TWV0aG9kKG1ldGhvZE5hbWUsIG51bGwpOwotICAgICAgICAgICAgICAgICAgIH1jYXRjaChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgICAgICAgICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiTWV0aG9kIG5vdCBmb3VuZCIgKyBtZXRob2ROYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZihtZXRob2QgPT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgicERlc2NyRXJyMiIsdGFyZ2V0QmVhbi5nZXRDbGFzcygpLmdldE5hbWUoKSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgT2JqZWN0IHJldCA9IG1ldGhvZC5pbnZva2UodGFyZ2V0QmVhbiwgbnVsbCk7Ci0gICAgICAgICAgICBpZiAocmV0ICE9IG51bGwgJiYgbWV0aG9kLmdldFJldHVyblR5cGUoKSA9PSBKQVhCRWxlbWVudC5jbGFzcykgewotICAgICAgICAgICAgICAgIHJldCA9ICgoSkFYQkVsZW1lbnQpIHJldCkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBvYmplY3QKLSAgICAgKgotICAgICAqIEBwYXJhbSB0YXJnZXRCZWFuCi0gICAgICogQHBhcmFtIHByb3BWYWx1ZQotICAgICAqIEB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgSkFYQldyYXBwZXJFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXQoT2JqZWN0IHRhcmdldEJlYW4sIE9iamVjdCBwcm9wVmFsdWUsIENsYXNzIGRjbENsYXNzKQotICAgICAgICAgICAgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIEpBWEJXcmFwcGVyRXhjZXB0aW9uIHsKLQotICAgICAgICBNZXRob2Qgd3JpdGVNZXRob2QgID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIE5vIHNldCBvY2N1cnMgaWYgdGhlIHZhbHVlIGlzIG51bGwKLSAgICAgICAgICAgIGlmIChwcm9wVmFsdWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gVGhlcmUgYXJlIDMgZGlmZmVyZW50IHR5cGVzIG9mIHNldHRlcnMgdGhhdCBjYW4gb2NjdXIuCi0gICAgICAgICAgICAvLyAxKSBOb3JtYWwgQXR0b21pYyBTZXR0ZXIgOiBzZXRGb28odHlwZSkKLSAgICAgICAgICAgIC8vIDIpIEluZGV4ZWQgQXJyYXkgU2V0dGVyIDogc2V0Rm9vKHR5cGVbXSkKLSAgICAgICAgICAgIC8vIDMpIE5vIFNldHRlciBjYXNlIGlmIHRoZSBwcm9wZXJ0eSBpcyBhIExpc3Q8VD4uCi0KLSAgICAgICAgICAgIHdyaXRlTWV0aG9kID0gZGVzY3JpcHRvci5nZXRXcml0ZU1ldGhvZCgpOwotICAgICAgICAgICAgaWYgKGRlc2NyaXB0b3IgaW5zdGFuY2VvZiBJbmRleGVkUHJvcGVydHlEZXNjcmlwdG9yKSB7Ci0gICAgICAgICAgICAgICAgLy8gU2V0IGZvciBpbmRleGVkICBUW10KLSAgICAgICAgICAgICAgICBzZXRJbmRleGVkQXJyYXkodGFyZ2V0QmVhbiwgcHJvcFZhbHVlLCB3cml0ZU1ldGhvZCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHdyaXRlTWV0aG9kID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBTZXQgZm9yIExpc3Q8VD4KLSAgICAgICAgICAgICAgICBzZXRMaXN0KHRhcmdldEJlYW4sIHByb3BWYWx1ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGRlc2NyaXB0b3IuZ2V0UHJvcGVydHlUeXBlKCkgPT0gSkFYQkVsZW1lbnQuY2xhc3MpIHsKLSAgICAgICAgICAgICAgICBpZiAocHJvcFZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgQ2xhc3MgY2xhenogPSBkY2xDbGFzcyE9bnVsbCA/IGRjbENsYXNzIDogcHJvcFZhbHVlLmdldENsYXNzKCk7Ci0gICAgICAgICAgICAgICAgICAgIEpBWEJFbGVtZW50IGVsZW1lbnQgPSBuZXcgSkFYQkVsZW1lbnQoeG1sTmFtZSwgY2xhenosIHByb3BWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIHNldEF0b21pYyh0YXJnZXRCZWFuLCBlbGVtZW50LCB3cml0ZU1ldGhvZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBOb3JtYWwgY2FzZQotICAgICAgICAgICAgICAgIHNldEF0b21pYyh0YXJnZXRCZWFuLCBwcm9wVmFsdWUsIHdyaXRlTWV0aG9kKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChERUJVR19FTkFCTEVEKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHByb3BDbGFzcyA9IHByb3BWYWx1ZS5nZXRDbGFzcygpLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkFuIGV4Y2VwdGlvbiBvY2N1cnJlZCB3aGlsZSBhdHRlbXB0aW5nIHRvIHNldCBhIHByb3BlcnR5IG9uICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRCZWFuLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlRoZSBzZXR0ZXIgbWV0aG9kIGlzICIgKyB3cml0ZU1ldGhvZCApOwotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiVGhlIGNsYXNzIG9mIHRoZSBhcmd1bWVudCBpcyA6IiArcHJvcENsYXNzKTsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlRoZSBQcm9wZXJ0eURlc2NyaXB0b3IgaXM6ICIgKyB0aGlzLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiVGhlIGV4Y2VwdGlvbiBpczogIiArIGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgcHJvcGVydHkgdmFsdWUgb250byB0YXJnZXRCZWFuIHVzaW5nIHRoZSB3cml0ZU1ldGhvZAotICAgICAqCi0gICAgICogQHBhcmFtIHRhcmdldEJlYW4KLSAgICAgKiBAcGFyYW0gcHJvcFZhbHVlCi0gICAgICogQHBhcmFtIHdyaXRlTWV0aG9kIChzZXQoVCkpCi0gICAgICogQHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uCi0gICAgICogQHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBKQVhCV3JhcHBlckV4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzZXRBdG9taWMoT2JqZWN0IHRhcmdldEJlYW4sIE9iamVjdCBwcm9wVmFsdWUsIE1ldGhvZCB3cml0ZU1ldGhvZCkgCi0gICAgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIEpBWEJXcmFwcGVyRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gSkFYQiBwcm92aWRlcyBzZXR0ZXJzIGZvciBhdG9taWMgdmFsdWUuCi0gICAgICAgIAotICAgICAgICBpZiAocHJvcFZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIE5vcm1hbCBjYXNlCi0gICAgICAgIAlPYmplY3RbXSBTSU5HTEVfUEFSQU0gPSBuZXcgT2JqZWN0WzFdOwotICAgICAgICAgICAgU0lOR0xFX1BBUkFNWzBdID0gcHJvcFZhbHVlOwotICAgICAgICAgICAgd3JpdGVNZXRob2QuaW52b2tlKHRhcmdldEJlYW4sIFNJTkdMRV9QQVJBTSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBDbGFzc1tdIHBhcmFtVHlwZXMgPSB3cml0ZU1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZihwYXJhbVR5cGVzICE9bnVsbCAmJiBwYXJhbVR5cGVzLmxlbmd0aCA9PTEpewotICAgICAgICAgICAgICAgIENsYXNzIHBhcmFtVHlwZSA9IHBhcmFtVHlwZXNbMF07Ci0gICAgICAgICAgICAgICAgaWYocGFyYW1UeXBlLmlzUHJpbWl0aXZlKCkgJiYgcHJvcFZhbHVlID09IG51bGwpewotICAgICAgICAgICAgICAgICAgICAvL0lnbm9yaW5nIG51bGwgdmFsdWUgZm9yIHByaW1pdGl2ZSB0eXBlLCB0aGlzIGNvdWxkIHBvdGVudGlhbGx5IGJlIHRoZSB3YXkgb2YgYSBjdXN0b21lciBpbmRpY2F0aW5nIHRvIHNldAotICAgICAgICAgICAgICAgICAgICAvL2RlZmF1bHQgdmFsdWVzIGRlZmluZWQgaW4gSkFYQk9iamVjdC94bWxTY2hlbWEuCi0gICAgICAgICAgICAgICAgICAgIGlmKERFQlVHX0VOQUJMRUQpewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJJZ25vcmluZyBudWxsIHZhbHVlIGZvciBwcmltaXRpdmUgdHlwZSwgdGhpcyBpcyB0aGUgd2F5IHRvIHNldCBkZWZhdWx0IHZhbHVlcyBkZWZpbmVkIGluIEpBWEJPYmplY3QveG1sU2NoZW1hLiBmb3IgcHJpbWl0aXZlIHR5cGVzIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIHByb3BlcnR5IHZhbHVlIHVzaW5nIHRoZSBpbmRleGVkIGFycmF5IHNldHRlcgotICAgICAqCi0gICAgICogQHBhcmFtIHRhcmdldEJlYW4KLSAgICAgKiBAcGFyYW0gcHJvcFZhbHVlCi0gICAgICogQHBhcmFtIHdyaXRlTWV0aG9kIHNldChUW10pCi0gICAgICogQHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uCi0gICAgICogQHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBKQVhCV3JhcHBlckV4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzZXRJbmRleGVkQXJyYXkoT2JqZWN0IHRhcmdldEJlYW4sIE9iamVjdCBwcm9wVmFsdWUsIE1ldGhvZCB3cml0ZU1ldGhvZCkKLSAgICAgICAgICAgIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBKQVhCV3JhcHBlckV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgQ2xhc3MgcGFyYW1UeXBlID0gd3JpdGVNZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKVswXTsKLSAgICAgICAgT2JqZWN0IHZhbHVlID0gYXNBcnJheShwcm9wVmFsdWUsIHBhcmFtVHlwZSk7Ci0gICAgICAgIC8vIEpBWEIgcHJvdmlkZXMgc2V0dGVycyBmb3IgYXRvbWljIHZhbHVlLgotICAgICAgICBPYmplY3RbXSBTSU5HTEVfUEFSQU0gPSBuZXcgT2JqZWN0WzFdOwotICAgICAgICBTSU5HTEVfUEFSQU1bMF0gPXZhbHVlOwotICAgICAgICAKLSAgICAgICAgd3JpdGVNZXRob2QuaW52b2tlKHRhcmdldEJlYW4sIFNJTkdMRV9QQVJBTSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBwcm9wZXJ0eSB2YWx1ZSBmb3IgdGhlIGNvbGxlY3Rpb24gY2FzZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0YXJnZXRCZWFuCi0gICAgICogQHBhcmFtIHByb3BWYWx1ZQotICAgICAqIEB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgSkFYQldyYXBwZXJFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2V0TGlzdChPYmplY3QgdGFyZ2V0QmVhbiwgT2JqZWN0IHByb3BWYWx1ZSkKLSAgICAgICAgICAgIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBKQVhCV3JhcHBlckV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIEZvciB0aGUgTGlzdDxUPiBjYXNlLCB0aGVyZSBpcyBubyBzZXR0ZXIuIAotICAgICAgICAvLyBZb3UgYXJlIHN1cHBvc2VkIHRvIHVzZSB0aGUgZ2V0dGVyIHRvIG9idGFpbiBhY2Nlc3MgdG8gdGhlIGNvbGxlY3Rpb24gYW5kIHRoZW4gYWRkIHRoZSBjb2xsZWN0aW9uCi0KLSAgICAgICAgQ29sbGVjdGlvbiB2YWx1ZSA9IGFzQ29sbGVjdGlvbihwcm9wVmFsdWUsIGRlc2NyaXB0b3IuZ2V0UHJvcGVydHlUeXBlKCkpOwotICAgICAgICBDb2xsZWN0aW9uIGNvbGxlY3Rpb24gPSAoQ29sbGVjdGlvbilnZXQodGFyZ2V0QmVhbik7Ci0KLSAgICAgICAgLy8gTm93IGFkZCBvdXIgb3VyIG9iamVjdCB0byB0aGUgY29sbGVjdGlvbgotICAgICAgICBjb2xsZWN0aW9uLmNsZWFyKCk7Ci0gICAgICAgIGlmIChwcm9wVmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgY29sbGVjdGlvbi5hZGRBbGwodmFsdWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHByb3BWYWx1ZQotICAgICAqIEBwYXJhbSBkZXN0VHlwZQotICAgICAqIEByZXR1cm4gcHJvcFZhbHVlIGFzIGEgQ29sbGVjdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIENvbGxlY3Rpb24gYXNDb2xsZWN0aW9uKE9iamVjdCBwcm9wVmFsdWUsIENsYXNzIGRlc3RUeXBlKSB7Ci0gICAgICAgIC8vIFRPRE8gTWlzc2luZyBmdW5jdGlvbgotICAgICAgICAvLyBDb252ZXJ0IHRoZSBvYmplY3QgaW50byBhbiBlcXVpdmFsZW50IG9iamVjdCB0aGF0IGlzIGEgY29sbGVjdGlvbgotICAgICAgICBpZiAoQ29udmVydFV0aWxzLmlzQ29udmVydGFibGUocHJvcFZhbHVlLCBkZXN0VHlwZSkpIHsKLSAgICAgICAgICAgIHJldHVybiAoQ29sbGVjdGlvbilDb252ZXJ0VXRpbHMuY29udmVydChwcm9wVmFsdWUsIGRlc3RUeXBlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFN0cmluZyBvYmplY3RDbGFzcyA9IChwcm9wVmFsdWUgPT0gbnVsbCkgPyAibnVsbCIgOiBwcm9wVmFsdWUuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRNZXNzYWdlKCJjb252ZXJ0UHJvYmxlbSIsIG9iamVjdENsYXNzLCBkZXN0VHlwZS5nZXROYW1lKCkpKTsKLQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHByb3BWYWx1ZQotICAgICAqIEBwYXJhbSBkZXN0VHlwZSAgVFtdCi0gICAgICogQHJldHVybiBhcnJheSBvZiBjb21wb25lbnQgdHlwZQotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIE9iamVjdCBhc0FycmF5KE9iamVjdCBwcm9wVmFsdWUsIENsYXNzIGRlc3RUeXBlKSB7Ci0gICAgICAgIGlmIChDb252ZXJ0VXRpbHMuaXNDb252ZXJ0YWJsZShwcm9wVmFsdWUsIGRlc3RUeXBlKSkgewotICAgICAgICAgICAgcmV0dXJuIENvbnZlcnRVdGlscy5jb252ZXJ0KHByb3BWYWx1ZSwgZGVzdFR5cGUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgU3RyaW5nIG9iamVjdENsYXNzID0gKHByb3BWYWx1ZSA9PSBudWxsKSA/ICJudWxsIiA6IHByb3BWYWx1ZS5nZXRDbGFzcygpLmdldE5hbWUoKTsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoImNvbnZlcnRQcm9ibGVtIiwgb2JqZWN0Q2xhc3MsIGRlc3RUeXBlLmdldE5hbWUoKSkpOwotCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBTdHJpbmcgdmFsdWUgPSAiUHJvcGVydHlEZXNjcmlwdG9yUGx1c1siOwotICAgICAgICB2YWx1ZSArPSAiIG5hbWU9IiArIHRoaXMuZ2V0UHJvcGVydHlOYW1lKCk7Ci0gICAgICAgIHZhbHVlICs9ICIgdHlwZT0iICsgdGhpcy5nZXRQcm9wZXJ0eVR5cGUoKS5nZXROYW1lKCk7Ci0gICAgICAgIHZhbHVlICs9ICIgcHJvcGVydHlEZWNyaXB0b3I9IiArIHRoaXMuZGVzY3JpcHRvcjsKLSAgICAgICAgcmV0dXJuIHZhbHVlICsgIl0iOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3V0aWxpdHkvU0FBSkZhY3RvcnkuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3V0aWxpdHkvU0FBSkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTgzODNlMi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy91dGlsaXR5L1NBQUpGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnV0aWxpdHk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLkV4Y2VwdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5pMThuLk1lc3NhZ2VzOwotCi1pbXBvcnQgamF2YXgueG1sLnNvYXAuTWVzc2FnZUZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci0KLS8qKgotICogUHJvdmlkZXMgY29udmVuaWVuY2UgbWV0aG9kcyB0byBjb25zdHJ1Y3QgYSBTT0FQIDEuMSBvciBTT0FQIDEuMiBTQUFKIE1lc3NhZ2VGYWN0b3J5IG9yCi0gKiBTT0FQRmFjdG9yeS4gVGhlIGNvZGUgdXNlcyByZWZsZWN0aW9uOyB0aHVzLCB3aGVuIEF4aXMyIHVwZ3JhZGVzIHRvIFNBQUogMS4zLCBubyBjaGFuZ2VzIHdpbGwgYmUKLSAqIG5lZGVkIHRvIHRoaXMgY2xhc3MuCi0gKi8KLXB1YmxpYyBjbGFzcyBTQUFKRmFjdG9yeSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09BUDExX0VOVl9OUyA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNPQVAxMl9FTlZfTlMgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIjsKLQotICAgIC8vIFByb3RvY29sIE5hbWVzIHBlciB0aGUgU0FBSiAxLjMgc3BlY2lmaWNhdGlvbi4KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTT0FQXzFfMV9QUk9UT0NPTCA9ICJTT0FQIDEuMSBQcm90b2NvbCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09BUF8xXzJfUFJPVE9DT0wgPSAiU09BUCAxLjIgUHJvdG9jb2wiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERZTkFNSUNfUFJPVE9DT0wgPSAiRHluYW1pYyBQcm90b2NvbCI7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgU09BUEZhY3RvcnkgdXNpbmcgaW5mb3JtYXRpb24gZnJvbSB0aGUgZW52ZWxvcGUgbmFtZXNwYWNlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZXNwYWNlCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU09BUEZhY3RvcnkgY3JlYXRlU09BUEZhY3RvcnkoU3RyaW5nIG5hbWVzcGFjZSkKLSAgICAgICAgICAgIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uLCBTT0FQRXhjZXB0aW9uIHsKLSAgICAgICAgTWV0aG9kIG0gPSBnZXRTT0FQRmFjdG9yeU5ld0luc3RhbmNlUHJvdG9jb2xNZXRob2QoKTsKLSAgICAgICAgU09BUEZhY3Rvcnkgc2YgPSBudWxsOwotICAgICAgICBpZiAobSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscyhTT0FQMTFfRU5WX05TKSkgewotICAgICAgICAgICAgICAgIHNmID0gU09BUEZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeQotICAgICAgICAgICAgICAgICAgICAgICAgLm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoIlNPQVAxMldpdGhTQUFKMTJFcnIiKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBTdHJpbmcgcHJvdG9jb2wgPSBEWU5BTUlDX1BST1RPQ09MOwotICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoU09BUDExX0VOVl9OUykpIHsKLSAgICAgICAgICAgICAgICBwcm90b2NvbCA9IFNPQVBfMV8xX1BST1RPQ09MOwotICAgICAgICAgICAgfSBlbHNlIGlmIChuYW1lc3BhY2UuZXF1YWxzKFNPQVAxMl9FTlZfTlMpKSB7Ci0gICAgICAgICAgICAgICAgcHJvdG9jb2wgPSBTT0FQXzFfMl9QUk9UT0NPTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgc2YgPSAoU09BUEZhY3RvcnkpbS5pbnZva2UobnVsbCwgbmV3IE9iamVjdFtdIHsgcHJvdG9jb2wgfSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNmOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBNZXNzYWdlRmFjdG9yeSB1c2luZyBpbmZvcm1hdGlvbiBmcm9tIHRoZSBlbnZlbG9wZSBuYW1lc3BhY2UKLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lc3BhY2UKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBNZXNzYWdlRmFjdG9yeSBjcmVhdGVNZXNzYWdlRmFjdG9yeShTdHJpbmcgbmFtZXNwYWNlKQotICAgICAgICAgICAgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24sIFNPQVBFeGNlcHRpb24gewotICAgICAgICBNZXRob2QgbSA9IGdldE1lc3NhZ2VGYWN0b3J5TmV3SW5zdGFuY2VQcm90b2NvbE1ldGhvZCgpOwotICAgICAgICBNZXNzYWdlRmFjdG9yeSBtZiA9IG51bGw7Ci0gICAgICAgIGlmIChtID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKFNPQVAxMV9FTlZfTlMpKSB7Ci0gICAgICAgICAgICAgICAgbWYgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Ci0gICAgICAgICAgICAgICAgICAgICAgICAubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiU09BUDEyV2l0aFNBQUoxMkVyciIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFN0cmluZyBwcm90b2NvbCA9IERZTkFNSUNfUFJPVE9DT0w7Ci0gICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscyhTT0FQMTFfRU5WX05TKSkgewotICAgICAgICAgICAgICAgIHByb3RvY29sID0gU09BUF8xXzFfUFJPVE9DT0w7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG5hbWVzcGFjZS5lcXVhbHMoU09BUDEyX0VOVl9OUykpIHsKLSAgICAgICAgICAgICAgICBwcm90b2NvbCA9IFNPQVBfMV8yX1BST1RPQ09MOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtZiA9IChNZXNzYWdlRmFjdG9yeSltLmludm9rZShudWxsLCBuZXcgT2JqZWN0W10geyBwcm90b2NvbCB9KTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbWY7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTWV0aG9kIG1lc3NhZ2VGYWN0b3J5TmV3SW5zdGFuY2VQcm90b2NvbE1ldGhvZCA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBTQUFKIDEuMyBoYXMgYSBuZXdJbnN0YW5jZSBtZXRob2QgdGhhdCBoYXMgYSBwcm90b2NvbCBwYXJhbWV0ZXIuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIG5ld0luc3RhbmNlKFN0cmluZykgbWV0aG9kIGlmIGF2YWlsYWJsZQotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIE1ldGhvZCBnZXRNZXNzYWdlRmFjdG9yeU5ld0luc3RhbmNlUHJvdG9jb2xNZXRob2QoKSB7Ci0gICAgICAgIGlmIChtZXNzYWdlRmFjdG9yeU5ld0luc3RhbmNlUHJvdG9jb2xNZXRob2QgPT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtZXNzYWdlRmFjdG9yeU5ld0luc3RhbmNlUHJvdG9jb2xNZXRob2QgPQotICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkuY2xhc3MuZ2V0TWV0aG9kKCJuZXdJbnN0YW5jZSIsIG5ldyBDbGFzc1tdIHsgU3RyaW5nLmNsYXNzIH0pOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBUT0RPIE1pZ2h0IHdhbnQgdG8gbG9nIHRoaXMuCi0gICAgICAgICAgICAgICAgLy8gRmxvdyB0byBoZXJlIGluZGljYXRlcyB0aGF0IHRoZSBpbnN0YWxsZWQgU0FBSiBtb2RlbCBkb2VzIG5vdCBzdXBwb3J0IHZlcnNpb24gMS4zCi0gICAgICAgICAgICAgICAgbWVzc2FnZUZhY3RvcnlOZXdJbnN0YW5jZVByb3RvY29sTWV0aG9kID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnlOZXdJbnN0YW5jZVByb3RvY29sTWV0aG9kOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIE1ldGhvZCBzb2FwRmFjdG9yeU5ld0luc3RhbmNlUHJvdG9jb2xNZXRob2QgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogU0FBSiAxLjMgaGFzIGEgbmV3SW5zdGFuY2UgbWV0aG9kIHRoYXQgaGFzIGEgcHJvdG9jb2wgcGFyYW1ldGVyLgotICAgICAqCi0gICAgICogQHJldHVybiBuZXdJbnN0YW5jZShTdHJpbmcpIG1ldGhvZCBpZiBhdmFpbGFibGUKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBNZXRob2QgZ2V0U09BUEZhY3RvcnlOZXdJbnN0YW5jZVByb3RvY29sTWV0aG9kKCkgewotICAgICAgICBpZiAoc29hcEZhY3RvcnlOZXdJbnN0YW5jZVByb3RvY29sTWV0aG9kID09IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgc29hcEZhY3RvcnlOZXdJbnN0YW5jZVByb3RvY29sTWV0aG9kID0KLSAgICAgICAgICAgICAgICAgICAgICAgIFNPQVBGYWN0b3J5LmNsYXNzLmdldE1ldGhvZCgibmV3SW5zdGFuY2UiLCBuZXcgQ2xhc3NbXSB7IFN0cmluZy5jbGFzcyB9KTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETyBNaWdodCB3YW50IHRvIGxvZyB0aGlzLgotICAgICAgICAgICAgICAgIC8vIEZsb3cgdG8gaGVyZSBpbmRpY2F0ZXMgdGhhdCB0aGUgaW5zdGFsbGVkIFNBQUogbW9kZWwgZG9lcyBub3Qgc3VwcG9ydCB2ZXJzaW9uIDEuMwotICAgICAgICAgICAgICAgIHNvYXBGYWN0b3J5TmV3SW5zdGFuY2VQcm90b2NvbE1ldGhvZCA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNvYXBGYWN0b3J5TmV3SW5zdGFuY2VQcm90b2NvbE1ldGhvZDsKLSAgICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvdXRpbGl0eS9TaW5nbGVUaHJlYWRlZEV4ZWN1dG9yLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy91dGlsaXR5L1NpbmdsZVRocmVhZGVkRXhlY3V0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJmYmVkZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy91dGlsaXR5L1NpbmdsZVRocmVhZGVkRXhlY3V0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MudXRpbGl0eTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5pMThuLk1lc3NhZ2VzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLkV4Y2VwdGlvbkZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3I7DQotDQotLyoqDQotICogQSBzaW1wbGUgRXhlY3V0b3IgaW1wbGVtZW50YXRpb24gdGhhdCBkb2VzIG5vdCBjcmVhdGUgYSBuZXcgdGhyZWFkIA0KLSAqIGZvciBwcm9jZXNzaW5nIHdvcmssIGJ1dCBqdXN0IGJvcnJvd3MgdGhlIGN1cnJlbnQgdGhyZWFkLg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBTaW5nbGVUaHJlYWRlZEV4ZWN1dG9yIGltcGxlbWVudHMgRXhlY3V0b3Igew0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhTaW5nbGVUaHJlYWRlZEV4ZWN1dG9yLmNsYXNzKTsNCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoUnVubmFibGUgY29tbWFuZCkgew0KLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKCJKQVgtV1Mgd29yayBvbiBTaW5nbGVUaHJlYWRlZEV4ZWN0b3Igc3RhcnRlZC4iKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgaWYgKGNvbW1hbmQgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oDQotICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoInNpbmdsZVRocmVhZGVkRXhlY3V0b3JFcnIxIikpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIGNvbW1hbmQucnVuKCk7DQotICAgICAgICANCi0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiSkFYLVdTIHdvcmsgb24gU2luZ2xlVGhyZWFkZWRFeGVjdHVvciBjb21wbGV0ZS4iKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy91dGlsaXR5L1hNTFJvb3RFbGVtZW50VXRpbC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvdXRpbGl0eS9YTUxSb290RWxlbWVudFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTY4YTA5MS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy91dGlsaXR5L1hNTFJvb3RFbGVtZW50VXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51dGlsaXR5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCRWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbnVtVmFsdWU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSb290RWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFNjaGVtYTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnRSZWY7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZhLmJlYW5zLkludHJvc3BlY3Rpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5iZWFucy5JbnRyb3NwZWN0b3I7Ci1pbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFhNTFJvb3RFbGVtZW50VXRpbCB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coWE1MUm9vdEVsZW1lbnRVdGlsLmNsYXNzKTsKLQotICAgIC8qKiBDb25zdHJ1Y3RvciBpcyBpbnRlbnRpb25hbGx5IHByaXZhdGUuICBUaGlzIGNsYXNzIG9ubHkgcHJvdmlkZXMgc3RhdGljIHV0aWxpdHkgbWV0aG9kcyAqLwotICAgIHByaXZhdGUgWE1MUm9vdEVsZW1lbnRVdGlsKCkgewotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGNsYXp6Ci0gICAgICogQHJldHVybiBuYW1lc3BhY2Ugb2Ygcm9vdCBlbGVtZW50IHFuYW1lIG9yIG51bGwgaWYgdGhpcyBpcyBub3Qgb2JqZWN0IGRvZXMgbm90IHJlcHJlc2VudCBhCi0gICAgICogICAgICAgICByb290IGVsZW1lbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFFOYW1lIGdldFhtbFJvb3RFbGVtZW50UU5hbWVGcm9tT2JqZWN0KE9iamVjdCBvYmopIHsKLQotICAgICAgICAvLyBBIEpBWEJFbGVtZW50IHN0b3JlcyBpdHMgbmFtZQotICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgSkFYQkVsZW1lbnQpIHsKLSAgICAgICAgICAgIHJldHVybiAoKEpBWEJFbGVtZW50KW9iaikuZ2V0TmFtZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQ2xhc3MgY2xhenogPSAob2JqIGluc3RhbmNlb2YgamF2YS5sYW5nLkNsYXNzKSA/IChDbGFzcylvYmogOiBvYmouZ2V0Q2xhc3MoKTsKLSAgICAgICAgcmV0dXJuIGdldFhtbFJvb3RFbGVtZW50UU5hbWUoY2xhenopOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBjbGF6egotICAgICAqIEByZXR1cm4gbmFtZXNwYWNlIG9mIHJvb3QgZWxlbWVudCBxbmFtZSBvciBudWxsIGlmIHRoaXMgaXMgbm90IG9iamVjdCBkb2VzIG5vdCByZXByZXNlbnQgYQotICAgICAqICAgICAgICAgcm9vdCBlbGVtZW50Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBRTmFtZSBnZXRYbWxSb290RWxlbWVudFFOYW1lKENsYXNzIGNsYXp6KSB7Ci0KLSAgICAgICAgLy8gU2VlIGlmIHRoZSBvYmplY3QgcmVwcmVzZW50cyBhIHJvb3QgZWxlbWVudAotICAgICAgICBYbWxSb290RWxlbWVudCByb290ID0gKFhtbFJvb3RFbGVtZW50KQotICAgICAgICAgICAgZ2V0QW5ub3RhdGlvbihjbGF6eixYbWxSb290RWxlbWVudC5jbGFzcyk7Ci0gICAgICAgIGlmIChyb290ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIG5hbWUgPSByb290Lm5hbWUoKTsKLSAgICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9IHJvb3QubmFtZXNwYWNlKCk7Ci0KLSAgICAgICAgLy8gVGhlIG5hbWUgbWF5IG5lZWQgdG8gYmUgZGVmYXVsdGVkCi0gICAgICAgIGlmIChuYW1lID09IG51bGwgfHwgbmFtZS5sZW5ndGgoKSA9PSAwIHx8IG5hbWUuZXF1YWxzKCIjI2RlZmF1bHQiKSkgewotICAgICAgICAgICAgbmFtZSA9IGdldFNpbXBsZU5hbWUoY2xhenouZ2V0Q2Fub25pY2FsTmFtZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFRoZSBuYW1lc3BhY2UgbWF5IG5lZWQgdG8gYmUgZGVmYXVsdGVkCi0gICAgICAgIGlmIChuYW1lc3BhY2UgPT0gbnVsbCB8fCBuYW1lc3BhY2UubGVuZ3RoKCkgPT0gMCB8fCBuYW1lc3BhY2UuZXF1YWxzKCIjI2RlZmF1bHQiKSkgewotICAgICAgICAgICAgUGFja2FnZSBwa2cgPSBjbGF6ei5nZXRQYWNrYWdlKCk7Ci0gICAgICAgICAgICBYbWxTY2hlbWEgc2NoZW1hID0gKFhtbFNjaGVtYSkKLSAgICAgICAgICAgICAgICBnZXRBbm5vdGF0aW9uKHBrZywgWG1sU2NoZW1hLmNsYXNzKTsKLSAgICAgICAgICAgIGlmIChzY2hlbWEgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG5hbWVzcGFjZSA9IHNjaGVtYS5uYW1lc3BhY2UoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbmFtZXNwYWNlID0gIiI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbmV3IFFOYW1lKG5hbWVzcGFjZSwgbmFtZSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEBwYXJhbSBjbGF6egotICAgICAqIEByZXR1cm4gbmFtZXNwYWNlIG9mIHJvb3QgZWxlbWVudCBxbmFtZSBvciBudWxsIGlmIHRoaXMgaXMgbm90IG9iamVjdCBkb2VzIG5vdCByZXByZXNlbnQgYSByb290IGVsZW1lbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRFbnVtVmFsdWUoRW51bSBteUVudW0pewotCQlGaWVsZCBmOwotCQlTdHJpbmcgdmFsdWU7Ci0JCXRyeSB7Ci0JCQlmID0gbXlFbnVtLmdldENsYXNzKCkuZ2V0RmllbGQobXlFbnVtLm5hbWUoKSk7Ci0JCQkKLQkJCWYuc2V0QWNjZXNzaWJsZSh0cnVlKTsKLQkJCQotCQkJWG1sRW51bVZhbHVlIHhldiA9IChYbWxFbnVtVmFsdWUpIGdldEFubm90YXRpb24oZiwgWG1sRW51bVZhbHVlLmNsYXNzKTsKLQkJCWlmICh4ZXYgPT0gbnVsbCl7Ci0JCQkJdmFsdWUgPSBmLmdldE5hbWUoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdmFsdWUgPSB4ZXYudmFsdWUoKTsKLQkJCX0KLQkJfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgewotCQkJdmFsdWUgPSBudWxsOwotCQl9IGNhdGNoIChOb1N1Y2hGaWVsZEV4Y2VwdGlvbiBlKSB7Ci0JCQl2YWx1ZSA9IG51bGw7Ci0JCX0KLQkJCi0JCXJldHVybiB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB1dGlsaXR5IG1ldGhvZCB0byBnZXQgdGhlIGxhc3QgdG9rZW4gaW4gYSAiLiItZGVsaW1pdGVkIHBhY2thZ2UrY2xhc3NuYW1lIHN0cmluZwotICAgICAqCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRTaW1wbGVOYW1lKFN0cmluZyBpbikgewotICAgICAgICBpZiAoaW4gPT0gbnVsbCB8fCBpbi5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gaW47Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nIG91dCA9IG51bGw7Ci0gICAgICAgIFN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGluLCAiLiIpOwotICAgICAgICBpZiAodG9rZW5pemVyLmNvdW50VG9rZW5zKCkgPT0gMCkKLSAgICAgICAgICAgIG91dCA9IGluOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0gICAgICAgICAgICAgICAgb3V0ID0gdG9rZW5pemVyLm5leHRUb2tlbigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBvdXQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIEpBWEJDbGFzcyBoYXMgYSBzZXQgb2YgYmVhbiBwcm9wZXJ0aWVzIGVhY2ggcmVwcmVzZW50ZWQgYnkgYSBQcm9wZXJ0eURlc2NyaXB0b3IgRWFjaCBvZgotICAgICAqIHRoZSBmaWVsZHMgb2YgdGhlIGNsYXNzIGhhcyBhbiBhc3NvY2lhdGVkIHhtbCBuYW1lLiBUaGUgbWV0aG9kIHJldHVybnMgYSBtYXAgd2hlcmUgdGhlIGtleSBpcwotICAgICAqIHRoZSB4bWwgbmFtZSBhbmQgdmFsdWUgaXMgdGhlIFByb3BlcnR5RGVzY3JpcHRvcgotICAgICAqCi0gICAgICogQHBhcmFtIGpheGJDbGFzcwotICAgICAqIEByZXR1cm4gbWFwCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBNYXA8U3RyaW5nLCBQcm9wZXJ0eURlc2NyaXB0b3JQbHVzPiBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3JNYXAoQ2xhc3MgamF4YkNsYXNzKQotICAgICAgICAgICAgdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uLCBJbnRyb3NwZWN0aW9uRXhjZXB0aW9uIHsKLQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiR2V0IHRoZSBQcm9wZXJ0eURlc2NyaXB0b3JbXSBmb3IgIiArIGpheGJDbGFzcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBQcm9wZXJ0eURlc2NyaXB0b3JbXSBwZHMgPSBJbnRyb3NwZWN0b3IuZ2V0QmVhbkluZm8oamF4YkNsYXNzKS5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKCk7Ci0gICAgICAgIE1hcDxTdHJpbmcsIFByb3BlcnR5RGVzY3JpcHRvclBsdXM+IG1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgUHJvcGVydHlEZXNjcmlwdG9yUGx1cz4oKTsKLQotICAgICAgICAvLyBVbmZvcnR1bmF0ZWx5IHRoZSBlbGVtZW50IG5hbWVzIGFyZSBzdG9yZWQgb24gdGhlIGZpZWxkcy4KLSAgICAgICAgLy8gR2V0IGFsbCBvZiB0aGUgZmllbGRzIGluIHRoZSBjbGFzcyBhbmQgc3VwZXIgY2xhc3NlcwotCi0gICAgICAgIExpc3Q8RmllbGQ+IGZpZWxkcyA9IGdldEZpZWxkcyhqYXhiQ2xhc3MpOwotCi0gICAgICAgIC8vIE5vdyBtYXRjaCB1cCB0aGUgZmllbGRzIHdpdGggdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzLi4uU2lnaCB3aHkgZGlkbid0IEpBWEIgcHV0IHRoZSBAWE1MRWxlbWVudCBhbm5vdGF0aW9ucyBvbiB0aGUgCi0gICAgICAgIC8vIHByb3BlcnR5IG1ldGhvZHMhCi0gICAgICAgIGZvciAoUHJvcGVydHlEZXNjcmlwdG9yIHBkIDogcGRzKSB7Ci0KLSAgICAgICAgICAgIC8vIFNraXAgb3ZlciB0aGUgY2xhc3MgcHJvcGVydHkuLml0IGlzIG5ldmVyIHJlcHJlc2VudGVkIGFzIGFuIHhtbCBlbGVtZW50Ci0gICAgICAgICAgICBpZiAocGQuZ2V0TmFtZSgpLmVxdWFscygiY2xhc3MiKSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBGb3IgdGhlIGN1cnJlbnQgcHJvcGVydHksIGZpbmQgYSBtYXRjaGluZyBmaWVsZC4uLnNvIHRoYXQgd2UgY2FuIGdldCB0aGUgeG1sIG5hbWUKLSAgICAgICAgICAgIGJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiICBTdGFydDogRmluZCB4bWxuYW1lIGZvciBwcm9wZXJ0eToiICsgcGQuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoRmllbGQgZmllbGQgOiBmaWVsZHMpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZmllbGROYW1lID0gZmllbGQuZ2V0TmFtZSgpOwotCi0gICAgICAgICAgICAgICAgLy8gVXNlIHRoZSBuYW1lIG9mIHRoZSBmaWVsZCBhbmQgcHJvcGVydHkgdG8gZmluZCB0aGUgbWF0Y2gKLSAgICAgICAgICAgICAgICBpZiAoZmllbGROYW1lLmVxdWFsc0lnbm9yZUNhc2UocGQuZ2V0RGlzcGxheU5hbWUoKSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkTmFtZS5lcXVhbHNJZ25vcmVDYXNlKHBkLmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSB4bWxFbGVtZW50IG5hbWUgZm9yIHRoaXMgZmllbGQKLSAgICAgICAgICAgICAgICAgICAgUU5hbWUgeG1sTmFtZSA9IGdldFhtbEVsZW1lbnRSZWZPckVsZW1lbnRRTmFtZShmaWVsZC5nZXREZWNsYXJpbmdDbGFzcygpLCBmaWVsZCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIiAgICBGb3VuZCBmaWVsZCAiICsgZmllbGQuZ2V0TmFtZSgpICsgIiB3aGljaCBoYXMgeG1sbmFtZT0iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1hcC5nZXQoeG1sTmFtZSkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgICAgQUxFUlQ6IHByb3BlcnR5ICIgKyBtYXAuZ2V0KHhtbE5hbWUpLmdldFByb3BlcnR5TmFtZSgpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgYWxyZWFkeSBoYXMgdGhpcyBzYW1lIHhtbE5hbWUuLnRoaXMgbWF5IGNhdXNlIHByb2JsZW1zLiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1hcC5wdXQoeG1sTmFtZS5nZXRMb2NhbFBhcnQoKSwgbmV3IFByb3BlcnR5RGVzY3JpcHRvclBsdXMocGQsIHhtbE5hbWUpKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gVW5mb3J0dW5hdGVseSwgc29tZXRpbWVzIHRoZSBmaWVsZCBuYW1lIGlzIHByZWNlZWRlZCBieSBhbiB1bmRlcnNjb3JlCi0gICAgICAgICAgICAgICAgaWYgKGZpZWxkTmFtZS5zdGFydHNXaXRoKCJfIikpIHsKLSAgICAgICAgICAgICAgICAgICAgZmllbGROYW1lID0gZmllbGROYW1lLnN1YnN0cmluZygxKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkTmFtZS5lcXVhbHNJZ25vcmVDYXNlKHBkLmdldERpc3BsYXlOYW1lKCkpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGROYW1lLmVxdWFsc0lnbm9yZUNhc2UocGQuZ2V0TmFtZSgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSB4bWxFbGVtZW50IG5hbWUgZm9yIHRoaXMgZmllbGQKLSAgICAgICAgICAgICAgICAgICAgICAgIFFOYW1lIHhtbE5hbWUgPSBnZXRYbWxFbGVtZW50UmVmT3JFbGVtZW50UU5hbWUoZmllbGQuZ2V0RGVjbGFyaW5nQ2xhc3MoKSwgZmllbGQpOwotICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgICAgRm91bmQgZmllbGQgIiArIGZpZWxkLmdldE5hbWUoKSArICIgd2hpY2ggaGFzIHhtbG5hbWU9IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXAuZ2V0KHhtbE5hbWUpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgICAgQUxFUlQ6IHByb3BlcnR5ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcC5nZXQoeG1sTmFtZSkuZ2V0UHJvcGVydHlOYW1lKCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgYWxyZWFkeSBoYXMgdGhpcyBzYW1lIHhtbE5hbWUuLnRoaXMgbWF5IGNhdXNlIHByb2JsZW1zLiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1hcC5wdXQoeG1sTmFtZS5nZXRMb2NhbFBhcnQoKSwgbmV3IFByb3BlcnR5RGVzY3JpcHRvclBsdXMocGQsIHhtbE5hbWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBXZSBkaWRuJ3QgZmluZCBhIGZpZWxkLiAgRGVmYXVsdCB0aGUgeG1sbmFtZSB0byB0aGUgcHJvcGVydHkgbmFtZQotICAgICAgICAgICAgaWYgKCFmb3VuZCkgewotICAgICAgICAgICAgICAgIFN0cmluZyB4bWxOYW1lID0gcGQuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIiAgICBBIG1hdGNoaW5nIGZpZWxkIHdhcyBub3QgZm91bmQuICBEZWZhdWx0aW5nIHhtbG5hbWUgdG8gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sTmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtYXAuZ2V0KHhtbE5hbWUpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIiAgICBBTEVSVDogcHJvcGVydHkgIiArIG1hcC5nZXQoeG1sTmFtZSkuZ2V0UHJvcGVydHlOYW1lKCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGFscmVhZHkgaGFzIHRoaXMgc2FtZSB4bWxOYW1lLi50aGlzIG1heSBjYXVzZSBwcm9ibGVtcy4iKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtYXAucHV0KHhtbE5hbWUsIG5ldyBQcm9wZXJ0eURlc2NyaXB0b3JQbHVzKHBkLCB4bWxOYW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIiAgRW5kOiBGaW5kIHhtbG5hbWUgZm9yIHByb3BlcnR5OiIgKyBwZC5nZXROYW1lKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtYXA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhbGwgb2YgdGhlIGZpZWxkcyBpbiB0aGlzIGNsYXNzIGFuZCB0aGUgc3VwZXIgY2xhc3NlcwotICAgICAqCi0gICAgICogQHBhcmFtIGJlYW5DbGFzcwotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBzdGF0aWMgcHJpdmF0ZSBMaXN0PEZpZWxkPiBnZXRGaWVsZHMoZmluYWwgQ2xhc3MgYmVhbkNsYXNzKSB7Ci0gICAgICAgIC8vIFRoaXMgY2xhc3MgbXVzdCByZW1haW4gcHJpdmF0ZSBkdWUgdG8gSmF2YSAyIFNlY3VyaXR5IGNvbmNlcm5zCi0gICAgICAgIExpc3Q8RmllbGQ+IGZpZWxkczsKLSAgICAgICAgZmllbGRzID0gKExpc3Q8RmllbGQ+KUFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAotICAgICAgICAgICAgICAgIG5ldyBQcml2aWxlZ2VkQWN0aW9uKCkgewotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8RmllbGQ+IGZpZWxkcyA9IG5ldyBBcnJheUxpc3Q8RmllbGQ+KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyBjbHMgPSBiZWFuQ2xhc3M7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoY2xzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWVsZFtdIGZpZWxkQXJyYXkgPSBjbHMuZ2V0RGVjbGFyZWRGaWVsZHMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKEZpZWxkIGZpZWxkIDogZmllbGRBcnJheSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZHMuYWRkKGZpZWxkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xzID0gY2xzLmdldFN1cGVyY2xhc3MoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmaWVsZHM7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICk7Ci0KLSAgICAgICAgcmV0dXJuIGZpZWxkczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIG5hbWUgb2YgdGhlIGZpZWxkIGJ5IGxvb2tpbmcgYXQgdGhlIFhtbEVsZW1lbnQgYW5ub3RhdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBqYXhiQ2xhc3MKLSAgICAgKiBAcGFyYW0gZmllbGROYW1lCi0gICAgICogQHJldHVybgotICAgICAqIEB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBRTmFtZSBnZXRYbWxFbGVtZW50UmVmT3JFbGVtZW50UU5hbWUoQ2xhc3MgamF4YkNsYXNzLCBGaWVsZCBmaWVsZCkKLSAgICAgICAgICAgIHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIFhtbEVsZW1lbnRSZWYgeG1sRWxlbWVudFJlZiA9IChYbWxFbGVtZW50UmVmKQotICAgICAgICAgICAgICAgIGdldEFubm90YXRpb24oZmllbGQsIFhtbEVsZW1lbnRSZWYuY2xhc3MpOwotICAgICAgICBpZiAoeG1sRWxlbWVudFJlZiAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFFOYW1lKHhtbEVsZW1lbnRSZWYubmFtZXNwYWNlKCksCi0gICAgICAgICAgICAgICAgICAgIHhtbEVsZW1lbnRSZWYubmFtZSgpKTsKLSAgICAgICAgfQotICAgICAgICBYbWxFbGVtZW50IHhtbEVsZW1lbnQgPSAoWG1sRWxlbWVudCkKLSAgICAgICAgICAgICAgICBnZXRBbm5vdGF0aW9uKGZpZWxkLCBYbWxFbGVtZW50LmNsYXNzKTsKLQotICAgICAgICAvLyBJZiBYbWxFbGVtZW50IGRvZXMgbm90IGV4aXN0LCBkZWZhdWx0IHRvIHVzaW5nIHRoZSBmaWVsZCBuYW1lCi0gICAgICAgIGlmICh4bWxFbGVtZW50ID09IG51bGwgfHwKLSAgICAgICAgICAgICAgICB4bWxFbGVtZW50Lm5hbWUoKS5lcXVhbHMoIiMjZGVmYXVsdCIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFFOYW1lKCIiLCBmaWVsZC5nZXROYW1lKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgUU5hbWUoeG1sRWxlbWVudC5uYW1lc3BhY2UoKSwKLSAgICAgICAgICAgICAgICB4bWxFbGVtZW50Lm5hbWUoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGFuIGFubm90YXRpb24uICBUaGlzIGlzIHdyYXBwZXJlZCB0byBhdm9pZCBhIEphdmEyU2VjdXJpdHkgdmlvbGF0aW9uLgotICAgICAqIEBwYXJhbSBjbHMgQ2xhc3MgdGhhdCBjb250YWlucyBhbm5vdGF0aW9uIAotICAgICAqIEBwYXJhbSBhbm5vdGF0aW9uIENsYXNzIG9mIHJlcXVyZXN0ZWQgQW5ub3RhdGlvbgotICAgICAqIEByZXR1cm4gYW5ub3RhdGlvbiBvciBudWxsCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKGZpbmFsIEFubm90YXRlZEVsZW1lbnQgZWxlbWVudCwgZmluYWwgQ2xhc3MgYW5ub3RhdGlvbikgewotICAgICAgICByZXR1cm4gKEFubm90YXRpb24pIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkQWN0aW9uKCkgewotICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuZ2V0QW5ub3RhdGlvbihhbm5vdGF0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvd3JhcHBlci9KQVhCV3JhcHBlclRvb2wuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3dyYXBwZXIvSkFYQldyYXBwZXJUb29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiNzk1YjkuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvd3JhcHBlci9KQVhCV3JhcHBlclRvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy53cmFwcGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51dGlsaXR5LlByb3BlcnR5RGVzY3JpcHRvclBsdXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy53cmFwcGVyLmltcGwuSkFYQldyYXBwZXJFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIFRoZSBKQVhCV3JhcHBlciB0b29sIGlzIHVzZWQgdG8gY3JlYXRlIGEgSkFYQiBPYmplY3QgZnJvbSBhIHNlcmllcyBvZiBjaGlsZCBvYmplY3RzICh3cmFwKSBvciBnZXQKLSAqIHRoZSBjaGlsZCBvYmplY3RzIGZyb20gYSBKQVhCIE9iamVjdCAodW53cmFwKQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEpBWEJXcmFwcGVyVG9vbCB7Ci0gICAgLyoqCi0gICAgICogdW53cmFwIFJldHVybnMgdGhlIGxpc3Qgb2YgY2hpbGQgb2JqZWN0cyBvZiB0aGUgamF4YiBvYmplY3QKLSAgICAgKgotICAgICAqIEBwYXJhbSBqYXhiT2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgdHlwZQotICAgICAqIEBwYXJhbSBjaGlsZE5hbWVzIGxpc3Qgb2YgeG1sIGNoaWxkIG5hbWVzIGFzIFN0cmluZwotICAgICAqIEBwYXJhbSBwZE1hcCAgICAgIFByb3BlcnR5RGVzY3JpcHRvck1hcCBkZXNjcmliaW5nIHRoZSBqYXhiT2JqZWN0Ci0gICAgICogQHJldHVybiBsaXN0IG9mIE9iamVjdHMgaW4gdGhlIHNhbWUgb3JkZXIgYXMgdGhlIGVsZW1lbnQgbmFtZXMuCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdFtdIHVuV3JhcChPYmplY3QgamF4Yk9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBjaGlsZE5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgUHJvcGVydHlEZXNjcmlwdG9yUGx1cz4gcGRNYXApIHRocm93cyBKQVhCV3JhcHBlckV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIHVud3JhcCBSZXR1cm5zIHRoZSBsaXN0IG9mIGNoaWxkIG9iamVjdHMgb2YgdGhlIGpheGIgb2JqZWN0Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gamF4Yk9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIHR5cGUKLSAgICAgKiBAcGFyYW0gY2hpbGROYW1lcyBsaXN0IG9mIHhtbCBjaGlsZCBuYW1lcyBhcyBTdHJpbmcKLSAgICAgKiBAcmV0dXJuIGxpc3Qgb2YgT2JqZWN0cyBpbiB0aGUgc2FtZSBvcmRlciBhcyB0aGUgZWxlbWVudCBuYW1lcy4gTm90ZTogVGhpcyBtZXRob2QgY3JlYXRlcyBhCi0gICAgICogICAgICAgICBQcm9wZXJ0eURlc2NyaXB0b3IgbWFwOyB0aHVzIGl0IGlzIGxlc3MgcGVyZm9ybWFudCB0aGFuIHRoZSBvdGhlciB1bldyYXAgbWV0aG9kCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdFtdIHVuV3JhcChPYmplY3QgamF4Yk9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBjaGlsZE5hbWVzKSB0aHJvd3MgSkFYQldyYXBwZXJFeGNlcHRpb247Ci0KLQotICAgIC8qKgotICAgICAqIHdyYXAgQ3JlYXRlcyBhIGpheGIgb2JqZWN0IHRoYXQgaXMgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgY2hpbGQgb2JqZWN0cy4KLSAgICAgKiA8cC8+Ci0gICAgICogTm90ZSB0aGF0IHRoZSBqYXhiQ2xhc3MgbXVzdCBiZSB0aGUgY2xhc3MgdGhlIHJlcHJlc2VudHMgdGhlIGNvbXBsZXhUeXBlLiAoSXQgc2hvdWxkIG5ldmVyIGJlCi0gICAgICogSkFYQkVsZW1lbnQpCi0gICAgICoKLSAgICAgKiBAcGFyYW0gamF4YkNsYXNzCi0gICAgICogQHBhcmFtIGNoaWxkTmFtZXMgICAgbGlzdCBvZiB4bWwgY2hpbGQgbmFtZXMgYXMgU3RyaW5nCi0gICAgICogQHBhcmFtIGNoaWxkT2JqZWN0cywgY29tcG9uZW50IHR5cGUgb2JqZWN0cwotICAgICAqIEBwYXJhbSBwZE1hcCAgICAgICAgIFByb3BlcnR5RGVzY3JpcHRvck1hcCBkZXNjcmliaW5nIHRoZSBqYXhiT2JqZWN0Ci0gICAgICovCi0gICAgcHVibGljIE9iamVjdCB3cmFwKENsYXNzIGpheGJDbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxTdHJpbmc+IGNoaWxkTmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gY2hpbGRPYmplY3RzLAotICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBDbGFzcz4gZGVjbGFyZWRDbGFzc01hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgUHJvcGVydHlEZXNjcmlwdG9yUGx1cz4gcGRNYXApIHRocm93cyBKQVhCV3JhcHBlckV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIHdyYXAgQ3JlYXRlcyBhIGpheGIgb2JqZWN0IHRoYXQgaXMgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgY2hpbGQgb2JqZWN0cy4KLSAgICAgKiA8cC8+Ci0gICAgICogTm90ZSB0aGF0IHRoZSBqYXhiQ2xhc3MgbXVzdCBiZSB0aGUgY2xhc3MgdGhlIHJlcHJlc2VudHMgdGhlIGNvbXBsZXhUeXBlLiAoSXQgc2hvdWxkIG5ldmVyIGJlCi0gICAgICogSkFYQkVsZW1lbnQpCi0gICAgICoKLSAgICAgKiBAcGFyYW0gamF4YkNsYXNzCi0gICAgICogQHBhcmFtIGNoaWxkTmFtZXMgICAgbGlzdCBvZiB4bWwgY2hpbGQgbmFtZXMgYXMgU3RyaW5nCi0gICAgICogQHBhcmFtIGNoaWxkT2JqZWN0cywgY29tcG9uZW50IHR5cGUgb2JqZWN0cwotICAgICAqIEBwYXJhbSBwZE1hcCAgICAgICAgIFByb3BlcnR5RGVzY3JpcHRvck1hcCBkZXNjcmliaW5nIHRoZSBqYXhiT2JqZWN0IE5vdGU6IFRoaXMgbWV0aG9kCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgY3JlYXRlcyBhIFByb3BlcnR5RGVzY3JpcHRvciBtYXA7IHRodXMgaXQgaXMgbGVzcyBwZXJmb3JtYW50IHRoYW4gdGhlCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgb3RoZXIgdW5XcmFwIG1ldGhvZAotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3Qgd3JhcChDbGFzcyBqYXhiQ2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBjaGlsZE5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IGNoaWxkT2JqZWN0cykgdGhyb3dzIEpBWEJXcmFwcGVyRXhjZXB0aW9uOwotCi0KLX0KLQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvd3JhcHBlci9pbXBsL0pBWEJXcmFwcGVyRXhjZXB0aW9uLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy93cmFwcGVyL2ltcGwvSkFYQldyYXBwZXJFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjEwOTRkZC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy93cmFwcGVyL2ltcGwvSkFYQldyYXBwZXJFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy53cmFwcGVyLmltcGw7Ci0KLQotcHVibGljIGNsYXNzIEpBWEJXcmFwcGVyRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKLQotICAgIC8qKgotICAgICAqCi0gICAgICovCi0gICAgcHVibGljIEpBWEJXcmFwcGVyRXhjZXB0aW9uKCkgewotICAgICAgICBzdXBlcigpOwotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gY2F1c2UKLSAgICAgKi8KLSAgICBwdWJsaWMgSkFYQldyYXBwZXJFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlLCBjYXVzZSk7Ci0KLSAgICB9Ci0KLSAgICAvKiogQHBhcmFtIG1lc3NhZ2UgICovCi0gICAgcHVibGljIEpBWEJXcmFwcGVyRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UpOwotCi0gICAgfQotCi0gICAgLyoqIEBwYXJhbSBjYXVzZSAgKi8KLSAgICBwdWJsaWMgSkFYQldyYXBwZXJFeGNlcHRpb24oVGhyb3dhYmxlIGNhdXNlKSB7Ci0gICAgICAgIHN1cGVyKGNhdXNlKTsKLQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvd3JhcHBlci9pbXBsL0pBWEJXcmFwcGVyVG9vbEltcGwuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3dyYXBwZXIvaW1wbC9KQVhCV3JhcHBlclRvb2xJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjMDRmYjMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvd3JhcHBlci9pbXBsL0pBWEJXcmFwcGVyVG9vbEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Mud3JhcHBlci5pbXBsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5pMThuLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MudXRpbGl0eS5Qcm9wZXJ0eURlc2NyaXB0b3JQbHVzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MudXRpbGl0eS5YTUxSb290RWxlbWVudFV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy53cmFwcGVyLkpBWEJXcmFwcGVyVG9vbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBUaGUgSkFYQldyYXBwZXIgdG9vbCBpcyB1c2VkIHRvIGNyZWF0ZSBhIEpBWEIgT2JqZWN0IGZyb20gYSBzZXJpZXMgb2YgY2hpbGQgb2JqZWN0cyAod3JhcCkgb3IgZ2V0Ci0gKiB0aGUgY2hpbGQgb2JqZWN0cyBmcm9tIGEgSkFYQiBPYmplY3QgKHVud3JhcCkKLSAqLwotcHVibGljIGNsYXNzIEpBWEJXcmFwcGVyVG9vbEltcGwgaW1wbGVtZW50cyBKQVhCV3JhcHBlclRvb2wgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEpBWEJXcmFwcGVyVG9vbC5jbGFzcyk7Ci0KLSAgICAvKioKLSAgICAgKiB1bndyYXAgUmV0dXJucyB0aGUgbGlzdCBvZiBjaGlsZCBvYmplY3RzIG9mIHRoZSBqYXhiIG9iamVjdAotICAgICAqCi0gICAgICogQHBhcmFtIGpheGJPYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSB0eXBlCi0gICAgICogQHBhcmFtIGNoaWxkTmFtZXMgbGlzdCBvZiB4bWwgY2hpbGQgbmFtZXMgYXMgU3RyaW5nCi0gICAgICogQHBhcmFtIHBkTWFwICAgICAgUHJvcGVydHlEZXNjcmlwdG9yIG1hcCBmb3IgdGhpcyBqYXhiT2JqZWN0Ci0gICAgICogQHJldHVybiBsaXN0IG9mIE9iamVjdHMgaW4gdGhlIHNhbWUgb3JkZXIgYXMgdGhlIGVsZW1lbnQgbmFtZXMuCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdFtdIHVuV3JhcChPYmplY3QgamF4Yk9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBjaGlsZE5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgUHJvcGVydHlEZXNjcmlwdG9yUGx1cz4gcGRNYXApIHRocm93cyBKQVhCV3JhcHBlckV4Y2VwdGlvbiB7Ci0KLQotICAgICAgICBpZiAoamF4Yk9iamVjdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSkFYQldyYXBwZXJFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiSkFYQldyYXBwZXJFcnIxIikpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjaGlsZE5hbWVzID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKQVhCV3JhcHBlckV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJKQVhCV3JhcHBlckVycjIiKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBHZXQgdGhlIG9iamVjdCB0aGF0IHdpbGwgaGF2ZSB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgKGkuZS4gdGhlIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGNvbXBsZXhUeXBlKQotICAgICAgICBPYmplY3QgamF4YkNvbXBsZXhUeXBlT2JqID0gamF4Yk9iamVjdDsKLQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiSW52b2tpbmcgdW5XcmFwKCkgbWV0aG9kIHdpdGggamF4YiBvYmplY3Q6IiArCi0gICAgICAgICAgICAgICAgICAgIGpheGJDb21wbGV4VHlwZU9iai5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIlRoZSBpbnB1dCBjaGlsZCB4bWxuYW1lcyBhcmU6ICIgKyB0b1N0cmluZyhjaGlsZE5hbWVzKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIENoZWNrIHRoZSBQcm9wZXJ0eURlc2NyaXB0b3JQbHVzIG1hcCBpZiBkZWJ1ZyBpcyBlbmFibGVkLgotICAgICAgICAvLyBUaGUgbWV0aG9kIG1ha2VzIHN1cmUgdGhhdCBlYWNoIGNoaWxkIG5hbWUgaGFzIGEgbWF0Y2hpbmcgamF4YiBwcm9wZXJ0eQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGNoZWNrUHJvcGVydHlEZXNjcmlwdG9yTWFwKGpheGJDb21wbGV4VHlwZU9iai5nZXRDbGFzcygpLCBjaGlsZE5hbWVzLCBwZE1hcCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBHZXQgdGhlIGNvcnJlc3BvbnNpbmcgb2JqZWN0cyBmcm9tIHRoZSBqYXhiIGJlYW4KLSAgICAgICAgQXJyYXlMaXN0PE9iamVjdD4gb2JqTGlzdCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotICAgICAgICBmb3IgKFN0cmluZyBjaGlsZE5hbWUgOiBjaGlsZE5hbWVzKSB7Ci0gICAgICAgICAgICBQcm9wZXJ0eURlc2NyaXB0b3JQbHVzIHByb3BJbmZvID0gcGRNYXAuZ2V0KGNoaWxkTmFtZSk7Ci0gICAgICAgICAgICBPYmplY3Qgb2JqZWN0ID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChwcm9wSW5mbyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEpBWEJXcmFwcGVyRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoIkpBWEJXcmFwcGVyRXJyNiIsIAotICAgICAgICAgICAgICAgICAgICAgIGpheGJDb21wbGV4VHlwZU9iai5nZXRDbGFzcygpLmdldE5hbWUoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgY2hpbGROYW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG9iamVjdCA9IHByb3BJbmZvLmdldChqYXhiQ29tcGxleFR5cGVPYmopOwotICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJBbiBleGNlcHRpb24gIiArIGUuZ2V0Q2xhc3MoKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9jY3VycmVkIHdoaWxlIHRyeWluZyB0byBjYWxsIGdldCgpIG9uICIgKyBwcm9wSW5mbyk7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiVGhlIGNvcnJlc3BvbmRpbmcgeG1sIGNoaWxkIG5hbWUgaXM6ICIgKyBjaGlsZE5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSkFYQldyYXBwZXJFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvYmpMaXN0LmFkZChvYmplY3QpOwotICAgICAgICB9Ci0gICAgICAgIE9iamVjdFtdIGpheGJPYmplY3RzID0gb2JqTGlzdC50b0FycmF5KCk7Ci0gICAgICAgIG9iakxpc3QgPSBudWxsOwotICAgICAgICByZXR1cm4gamF4Yk9iamVjdHM7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB3cmFwIENyZWF0ZXMgYSBqYXhiIG9iamVjdCB0aGF0IGlzIGluaXRpYWxpemVkIHdpdGggdGhlIGNoaWxkIG9iamVjdHMuCi0gICAgICogPHAvPgotICAgICAqIE5vdGUgdGhhdCB0aGUgamF4YkNsYXNzIG11c3QgYmUgdGhlIGNsYXNzIHRoZSByZXByZXNlbnRzIHRoZSBjb21wbGV4VHlwZS4gKEl0IHNob3VsZCBuZXZlciBiZQotICAgICAqIEpBWEJFbGVtZW50KQotICAgICAqCi0gICAgICogQHBhcmFtIGpheGJDbGFzcwotICAgICAqIEBwYXJhbSBjaGlsZE5hbWVzICAgIGxpc3Qgb2YgeG1sIGNoaWxkIG5hbWVzIGFzIFN0cmluZwotICAgICAqIEBwYXJhbSBjaGlsZE9iamVjdHMsIGNvbXBvbmVudCB0eXBlIG9iamVjdHMKLSAgICAgKiBAcGFyYW0gcGRNYXAgICAgICAgICBQcm9wZXJ0eURlc2NyaXB0b3IgbWFwIGZvciB0aGlzIGpheGJPYmplY3QKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IHdyYXAoQ2xhc3MgamF4YkNsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICBMaXN0PFN0cmluZz4gY2hpbGROYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBjaGlsZE9iamVjdHMsCi0gICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIENsYXNzPiBkZWNsYXJlZENsYXNzTWFwLAotICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBQcm9wZXJ0eURlc2NyaXB0b3JQbHVzPiBwZE1hcCkgdGhyb3dzIEpBWEJXcmFwcGVyRXhjZXB0aW9uIHsKLQotCi0gICAgICAgIGlmIChjaGlsZE5hbWVzID09IG51bGwgfHwgY2hpbGRPYmplY3RzID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKQVhCV3JhcHBlckV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJKQVhCV3JhcHBlckVycjMiKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNoaWxkTmFtZXMuc2l6ZSgpICE9IGNoaWxkT2JqZWN0cy5zaXplKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKQVhCV3JhcHBlckV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJKQVhCV3JhcHBlckVycjQiKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiSW52b2tpbmcgdW53cmFwKCkgbWV0aG9kIHRvIGNyZWF0ZSBqYXhiIG9iamVjdDoiICsgamF4YkNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIlRoZSBpbnB1dCBjaGlsZCB4bWxuYW1lcyBhcmU6ICIgKyB0b1N0cmluZyhjaGlsZE5hbWVzKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBKdXN0IGxpa2UgdW5XcmFwLCBjaGVjayB0aGUgcHJvcGVydHkgZGVzY3JpcHRvciBtYXAgdG8gbWFrZSBzdXJlIGl0IGlzIGFjY3VyYXRlCi0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgY2hlY2tQcm9wZXJ0eURlc2NyaXB0b3JNYXAoamF4YkNsYXNzLCBjaGlsZE5hbWVzLCBwZE1hcCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBUaGUgamF4YiBvYmplY3QgYWx3YXlzIGhhcyBhIGRlZmF1bHQgY29uc3RydWN0b3IuICBDcmVhdGUgdGhlIG9iamVjdAotICAgICAgICBPYmplY3QgamF4Yk9iamVjdCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBqYXhiT2JqZWN0ID0gamF4YkNsYXNzLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkFuIGV4Y2VwdGlvbiAiICsgdC5nZXRDbGFzcygpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJvY2N1cnJlZCB3aGlsZSB0cnlpbmcgdG8gY3JlYXRlIGpheGJvYmplY3QgICIgKyBqYXhiQ2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRocm93IG5ldyBKQVhCV3JhcHBlckV4Y2VwdGlvbih0KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIE5vdyBzZXQgZWFjaCBvYmplY3Qgb250byB0aGUgamF4YiBvYmplY3QKLSAgICAgICAgZm9yIChTdHJpbmcgY2hpbGROYW1lIDogY2hpbGROYW1lcykgewotICAgICAgICAgICAgUHJvcGVydHlEZXNjcmlwdG9yUGx1cyBwcm9wSW5mbyA9IHBkTWFwLmdldChjaGlsZE5hbWUpOwotICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gY2hpbGRPYmplY3RzLmdldChjaGlsZE5hbWUpOwotICAgICAgICAgICAgQ2xhc3MgZGNsQ2xhc3MgPSBkZWNsYXJlZENsYXNzTWFwLmdldChjaGlsZE5hbWUpOwotICAgICAgICAgICAgaWYgKHByb3BJbmZvID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSkFYQldyYXBwZXJFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiSkFYQldyYXBwZXJFcnI2IiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF4YkNsYXNzLmdldE5hbWUoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGROYW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHByb3BJbmZvLnNldChqYXhiT2JqZWN0LCB2YWx1ZSwgZGNsQ2xhc3MpOwotICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkFuIGV4Y2VwdGlvbiAiICsgdC5nZXRDbGFzcygpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAib2NjdXJyZWQgd2hpbGUgdHJ5aW5nIHRvIGNhbGwgc2V0KCkgb24gICIgKyBwcm9wSW5mbyk7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiVGhlIGNvcnJlc3BvbmRpbmcgeG1sIGNoaWxkIG5hbWUgaXM6ICIgKyBjaGlsZE5hbWUpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9ICh2YWx1ZSA9PSBudWxsKSA/ICI8bnVsbD4iIDogdmFsdWUuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiVGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgb2JqZWN0IGlzOiAiICsgbmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBKQVhCV3JhcHBlckV4Y2VwdGlvbih0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIFJldHVybiB0aGUgamF4YiBvYmplY3QgCi0gICAgICAgIHJldHVybiBqYXhiT2JqZWN0OwotICAgIH0KLQotICAgIC8qKiAKLSAgICAgKiBUaGlzIGNvZGUgY2hlY2tzIHRoZSBwZE1hcCB0byBtYWtlIHN1cmUgdGhhdCBhIFByb3BlcnR5RGVzY3JpcHRvcgotICAgICAqIGV4aXN0cyBmb3IgZWFjaCBjaGlsZCBuYW1lLiAgVGhpcyBjb2RlIHNob3VsZCBvbmx5IGJlIGNhbGxlZCB3aGVuCi0gICAgICogZGVidWcgaXMgZW5hYmxlZCBvciBhbiBleGNlcHRpb24gb2NjdXJzLiAgKEl0IGlzIHRvbyBzbG93IGZvciB0aGUgbWFpbmxpbmUgcGF0aCkgCi0gICAgICogQHBhcmFtIGpheGJDbGFzcwotICAgICAqIEBwYXJhbSB4bWxDaGlsZE5hbWVzCi0gICAgICogQHBhcmFtIHBkTWFwCi0gICAgICogQHRocm93cyBKQVhCV3JhcHBlckV4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjaGVja1Byb3BlcnR5RGVzY3JpcHRvck1hcChDbGFzcyBqYXhiQ2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8U3RyaW5nPiB4bWxDaGlsZE5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBQcm9wZXJ0eURlc2NyaXB0b3JQbHVzPiBwZE1hcCkKLSAgICB0aHJvd3MgSkFYQldyYXBwZXJFeGNlcHRpb24gewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHhtbENoaWxkTmFtZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIFN0cmluZyB4bWxDaGlsZE5hbWUgPSB4bWxDaGlsZE5hbWVzLmdldChpKTsKLSAgICAgICAgICAgIFByb3BlcnR5RGVzY3JpcHRvclBsdXMgcGQgPSBwZE1hcC5nZXQoeG1sQ2hpbGROYW1lKTsKLSAgICAgICAgICAgIGlmIChwZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gRWFjaCB4bWwgY2hpbGQgbmFtZSBtdXN0IGhhdmUgYSBtYXRjaGluZyBwcm9wZXJ0eS4gIAotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoCi0gICAgICAgICAgICAgICAgICAgICJFcnJvciBvY2N1cnJlZCB0cnlpbmcgdG8gbWF0Y2ggYW4geG1sIG5hbWUgdG8gYSBjaGlsZCBvZiBhIGpheGIgb2JqZWN0Iik7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiICBUaGUgSkFYQkNsYXNzIGlzOiIgKyBqYXhiQ2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgIFRoZSBjaGlsZCBuYW1lIHRoYXQgd2UgYXJlIGxvb2tpbmcgZm9yIGlzOiIgKyB4bWxDaGlsZE5hbWUpOwotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIiAgVGhlIEpBWEJDbGFzcyBoYXMgdGhlIGZvbGxvd2luZyBjaGlsZCB4bWwgbmFtZXM6IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b1N0cmluZyhwZE1hcC5rZXlTZXQoKSkpOwotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIiAgQ29tcGxldGUgbGlzdCBvZiBjaGlsZCBuYW1lcyB0aGF0IHdlIGFyZSBsb29raW5nIGZvcjoiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvU3RyaW5nKHhtbENoaWxkTmFtZXMpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSkFYQldyYXBwZXJFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoIkpBWEJXcmFwcGVyRXJyNiIsIGpheGJDbGFzcy5nZXROYW1lKCksIHhtbENoaWxkTmFtZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gY29sbGVjdGlvbgotICAgICAqIEByZXR1cm4gbGlzdCBvZiB0aGUgbmFtZXMgaW4gdGhlIGNvbGxlY3Rpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyB0b1N0cmluZyhDb2xsZWN0aW9uPFN0cmluZz4gY29sbGVjdGlvbikgewotICAgICAgICBTdHJpbmcgdGV4dCA9ICJbIjsKLSAgICAgICAgaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuICJbXSI7Ci0gICAgICAgIH0KLSAgICAgICAgYm9vbGVhbiBmaXJzdCA9IHRydWU7Ci0gICAgICAgIGZvciAoU3RyaW5nIG5hbWUgOiBjb2xsZWN0aW9uKSB7Ci0gICAgICAgICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIHRleHQgKz0gbmFtZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGV4dCArPSAiLCIgKyBuYW1lOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0ZXh0ICsgIl0iOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3RbXSB1bldyYXAoT2JqZWN0IGpheGJPYmplY3QsIExpc3Q8U3RyaW5nPiBjaGlsZE5hbWVzKSB0aHJvd3MgSkFYQldyYXBwZXJFeGNlcHRpb24gewotICAgICAgICAvLyBHZXQgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3IgbWFwIGZvciB0aGlzIEpBWEJDbGFzcwotICAgICAgICBDbGFzcyBqYXhiQ2xhc3MgPSBqYXhiT2JqZWN0LmdldENsYXNzKCk7Ci0gICAgICAgIE1hcDxTdHJpbmcsIFByb3BlcnR5RGVzY3JpcHRvclBsdXM+ICBwZE1hcCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBwZE1hcCA9IFhNTFJvb3RFbGVtZW50VXRpbC5jcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3JNYXAoamF4YkNsYXNzKTsKLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiRXJyb3Igb2NjdXJyZWQgdG8gYnVpbGQgdGhlIFByb3BlcnR5RGVzY3JpcHRvciBtYXAiKTsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiICBUaGUgSkFYQkNsYXNzIGlzOiIgKyBqYXhiQ2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBKQVhCV3JhcHBlckV4Y2VwdGlvbih0KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIERlbGVnYXRlCi0gICAgICAgIHJldHVybiB1bldyYXAoamF4Yk9iamVjdCwgY2hpbGROYW1lcywgcGRNYXApOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3Qgd3JhcChDbGFzcyBqYXhiQ2xhc3MsIExpc3Q8U3RyaW5nPiBjaGlsZE5hbWVzLCBNYXA8U3RyaW5nLCBPYmplY3Q+IGNoaWxkT2JqZWN0cykKLSAgICAgICAgICAgIHRocm93cyBKQVhCV3JhcHBlckV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIEdldCB0aGUgcHJvcGVydHkgZGVzY3JpcHRvciBtYXAKLSAgICAgICAgTWFwPFN0cmluZywgUHJvcGVydHlEZXNjcmlwdG9yUGx1cz4gIHBkTWFwID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHBkTWFwID0gWE1MUm9vdEVsZW1lbnRVdGlsLmNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvck1hcChqYXhiQ2xhc3MpOwotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJFcnJvciBvY2N1cnJlZCB0byBidWlsZCB0aGUgUHJvcGVydHlEZXNjcmlwdG9yIG1hcCIpOwotICAgICAgICAgICAgbG9nLmRlYnVnKCIgIFRoZSBKQVhCQ2xhc3MgaXM6IiArIGpheGJDbGFzcy5nZXROYW1lKCkpOwotICAgICAgICAgICAgdGhyb3cgbmV3IEpBWEJXcmFwcGVyRXhjZXB0aW9uKHQpOwotICAgICAgICB9Ci0gICAgICAgIEhhc2hNYXA8U3RyaW5nLCBDbGFzcz4gZGVjbGFyaW5nQ2xhc3MgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIENsYXNzPigpOwotICAgICAgICAvLyBEZWxlZ2F0ZQotICAgICAgICByZXR1cm4gd3JhcChqYXhiQ2xhc3MsIGNoaWxkTmFtZXMsIGNoaWxkT2JqZWN0cywgZGVjbGFyaW5nQ2xhc3MsIHBkTWFwKTsKLSAgICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvd3NkbC9TY2hlbWFSZWFkZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3dzZGwvU2NoZW1hUmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxMzZiYWEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvd3NkbC9TY2hlbWFSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy53c2RsOwotCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogU2NoZW1hIFJlYWRlciBpbnRlcmZhY2UgaXMgdXNlZCB0byByZWFkIHNjaGVtYSBmcm9tIHdzZGwgYW5kIGRlcml2ZSBhcHByb3ByaWF0ZSBwYWNrYWdlIG5hbWVzCi0gKiBmcm9tIHRhcmdldG5hbWVzcGFjZS4gVGhlIGFsZ29yaXRobSBmb3IgZGVyaXZpbmcgcmVhZGluZyBwYWNrYWdlcyBuYW1lcyBmcm9tIHNjaGVtYSBpcyBhcwotICogZm9sbG93czogMSkgUmVhZCB0aGUgaW5saW5lIHNjaGVtYSBkZWZpbmVkIGluIHRoZSB3c2RsIDIpIGNoZWNrIGlmIHRoZXJlIGlzIGFueSBqYXhiCi0gKiBjdXN0b21pemF0aW9uL2JpbmRpbmcgZGVmaW5lZCBuYW1lbHkgc2NoZW1hQmluZGluZy4gaWYoc2NoZW1hQmluZGluZyBkZWZpbmVkKSB0aGVuIHJlYWQgdGhlCi0gKiBwYWNrYWdlIG5hbWUgYW5kIGFkZCB0aGF0IHRvIHRoZSBwYWNrYWdlIHNldC4gZWxzZSByZWFkIHRoZSB0YXJnZXRuYW1lc3BhY2UgY29udmVydCB0bnMgdG8KLSAqIHBhY2thZ2UgYW5kIGFkZCB0byBwa2cgc2V0LiAzKSBjaGVjayBpZiB0aGVyZSBhcmUgYW55IHhzZCBpbXBvcnRzIG9yIGluY2x1ZGVzIHRoZW4gZm9yKGVhY2gKLSAqIGltcG9ydCkgcmVhZCB0aGUgaW5saW5lIHNjaGVtYSBvciBwZXJmb3Igc3RlcCAxIGNoZWNrIGlmIHRoZXJlIGlzIGFueSBqYXhiIHNjaGVtYUJpbmRpbmcKLSAqIGN1c3RvbWl6YXRpb24gZGVmaW5lZCBpZihzY2hlbWFCaW5kaW5nIGRlZmluZWQpIHRoZW4gcmVhZCB0aGUgcGFja2FnZSBuYW1lIGFuZCBhZGQgdGhhdCB0byB0aGUKLSAqIHBhY2thZ2Ugc2V0LiBlbHNlIHJlYWQgdGhlIHRhcmdldG5hbWVzcGFjZSBjb252ZXJ0IHRucyB0byBwYWNrYWdlIGFuZCBhZGQgdG8gcGtnIHNldC4gRG8gU3RlcCAzCi0gKiByZWN1cnNpdmVseSBzbyB3ZSBjb3ZlciBTY2hlbWEgaW1wb3J0cyB3aXRoaW4gaW1wb3J0IG4gdGltZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU2NoZW1hUmVhZGVyIHsKLSAgICBwdWJsaWMgU2V0PFN0cmluZz4gcmVhZFBhY2thZ2VzRnJvbVNjaGVtYShEZWZpbml0aW9uIHdzZGxEZWZpbml0aW9uKQotICAgICAgICAgICAgdGhyb3dzIFNjaGVtYVJlYWRlckV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3dzZGwvU2NoZW1hUmVhZGVyRXhjZXB0aW9uLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy93c2RsL1NjaGVtYVJlYWRlckV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjY0ZWM1Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3dzZGwvU2NoZW1hUmVhZGVyRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Mud3NkbDsKLQotcHVibGljIGNsYXNzIFNjaGVtYVJlYWRlckV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7Ci0KLSAgICBwdWJsaWMgU2NoZW1hUmVhZGVyRXhjZXB0aW9uKCkgewotICAgICAgICBzdXBlcigpOwotCi0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYVJlYWRlckV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGNhdXNlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UsIGNhdXNlKTsKLQotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFSZWFkZXJFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSk7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hUmVhZGVyRXhjZXB0aW9uKFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICBzdXBlcihjYXVzZSk7Ci0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3dzZGwvaW1wbC9TY2hlbWFSZWFkZXJJbXBsLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy93c2RsL2ltcGwvU2NoZW1hUmVhZGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzU1MGIyLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3dzZGwvaW1wbC9TY2hlbWFSZWFkZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLndzZGwuaW1wbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaTE4bi5NZXNzYWdlczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnV0aWwuV1NETFdyYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51dGlsaXR5LkphdmFVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLndzZGwuU2NoZW1hUmVhZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Mud3NkbC5TY2hlbWFSZWFkZXJFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5UeXBlczsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNjaGVtYS5TY2hlbWE7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNjaGVtYS5TY2hlbWFJbXBvcnQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLXB1YmxpYyBjbGFzcyBTY2hlbWFSZWFkZXJJbXBsIGltcGxlbWVudHMgU2NoZW1hUmVhZGVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBKQVhCX1NDSEVNQV9CSU5ESU5HID0gInNjaGVtYUJpbmRpbmdzIjsKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgSkFYQl9TQ0hFTUFfQklORElOR19QQUNLQUdFID0gInBhY2thZ2UiOwotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBKQVhCX1NDSEVNQV9CaW5kaW5nX1BBQ0tBR0VOQU1FID0gIm5hbWUiOwotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBTQ0hFTUFfVEFSR0VUTkFNRVNQQUNFID0gInRhcmdldE5hbWVzcGFjZSI7Ci0gICAgcHJpdmF0ZSBEZWZpbml0aW9uIHdzZGxEZWZpbml0aW9uID0gbnVsbDsKLSAgICBwcml2YXRlIHN0YXRpYyBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coU2NoZW1hUmVhZGVySW1wbC5jbGFzcyk7Ci0gICAgCi0gICAgCi0gICAgLy8gVGhlIGZvbGxvd2luZyBsaXN0IG9mIHNjaGVtYSBzaG91bGQgYmUgaWdub3JlZCBieSB0aGUgc2NoZW1hLT5wYWNrYWdlcwotICAgIC8vIGFsZ29yaXRobS4KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PFN0cmluZz4gaWdub3JlU2NoZW1hID0gbnVsbDsKLSAgICBzdGF0aWMgewotICAgICAgICBpZ25vcmVTY2hlbWEgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgaWdub3JlU2NoZW1hLmFkZCgiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOC9hZGRyZXNzaW5nIik7Ci0gICAgICAgIGlnbm9yZVNjaGVtYS5hZGQoImh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDgvYWRkcmVzc2luZyIpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLndzZGwuU2NoZW1hUmVhZGVyI3JlYWRQYWNrYWdlc0Zyb21TY2hlbWEoamF2YXgud3NkbC5EZWZpbml0aW9uKQotICAgICAgKi8KLSAgICBwdWJsaWMgU2V0PFN0cmluZz4gcmVhZFBhY2thZ2VzRnJvbVNjaGVtYShEZWZpbml0aW9uIHdzZGxEZWZpbml0aW9uKQotICAgICAgICAgICAgdGhyb3dzIFNjaGVtYVJlYWRlckV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkludmFsaWQgd3NkbCBkZWZpbml0aW9uIHByb3ZpZGVkLCBOVUxMIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hUmVhZGVyRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoIlNjaGVtYVJlYWRlckVycjEiKSk7Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy53c2RsRGVmaW5pdGlvbiA9IHdzZGxEZWZpbml0aW9uOwotICAgICAgICBMaXN0PFNjaGVtYT4gc2NoZW1hTGlzdCA9IG5ldyBBcnJheUxpc3Q8U2NoZW1hPigpOwotICAgICAgICBTZXQ8U3RyaW5nPiBwYWNrYWdlTGlzdCA9IG5ldyBUcmVlU2V0PFN0cmluZz4oKTsKLSAgICAgICAgLy9BZGQgV1NETCBUYXJnZXROYW1lc3BhY2UKLSAgICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9IHdzZGxEZWZpbml0aW9uLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgICBTdHJpbmcgcGFja2FnZVN0cmluZyA9IEphdmFVdGlscy5nZXRQYWNrYWdlRnJvbU5hbWVzcGFjZShuYW1lc3BhY2UpOwotICAgICAgICBwYWNrYWdlTGlzdC5hZGQocGFja2FnZVN0cmluZyk7Ci0KLSAgICAgICAgLy9SZWFkIEFsbCBTY2hlbWEgRGVmaW5pdGlvbiBpbiB3c2RsOwotICAgICAgICBUeXBlcyB0eXBlcyA9IHdzZGxEZWZpbml0aW9uLmdldFR5cGVzKCk7Ci0gICAgICAgIGlmICh0eXBlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIldBUk5JTkc6IENvdWxkIG5vdCBmaW5kIGFueSBTY2hlbWEvVHlwZXMgZnJvbSBXU0RMIik7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJubyBwYWNrYWdlcyB3aWxsIGRlcml2ZWQgZnJvbSBXU0RMIHNjaGVtYSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHBhY2thZ2VMaXN0OwotICAgICAgICB9Ci0gICAgICAgIExpc3QgZXh0ZW5zaWJpbGl0eUVsZW1lbnRzID0gdHlwZXMuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgICAgIGZvciAoT2JqZWN0IG9iaiA6IGV4dGVuc2liaWxpdHlFbGVtZW50cykgewotICAgICAgICAgICAgaWYgKG9iaiAhPSBudWxsICYmIGlzU2NoZW1hKChFeHRlbnNpYmlsaXR5RWxlbWVudClvYmopKSB7Ci0gICAgICAgICAgICAgICAgU2NoZW1hIHNjaGVtYSA9IChTY2hlbWEpb2JqOwotICAgICAgICAgICAgICAgIC8vcHJvY2VzcyBzY2hlbWFzIGFuZCByZWFkIHBhY2thZ2VzIGZyb20gdGhlbS4KLSAgICAgICAgICAgICAgICBwcm9jZXNzU2NoZW1hKHNjaGVtYSwgc2NoZW1hTGlzdCwgcGFja2FnZUxpc3QpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy9TZXQgYWx3YXlzIHN0b3JlcyB1bmlxdWUgb2JqZWN0cywgc28gSSBkb250IGhhdmUgdG8gd29ycnkgYWJvdXQgcmVtb3ZpbmcgZHVwbGljYXRlcyBmcm9tIHRoaXMgc2V0LgotICAgICAgICByZXR1cm4gcGFja2FnZUxpc3Q7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NTY2hlbWEoU2NoZW1hIHNjaGVtYSwgTGlzdDxTY2hlbWE+IHNjaGVtYUxpc3QsIFNldDxTdHJpbmc+IHBhY2thZ2VMaXN0KQotICAgICAgICAgICAgdGhyb3dzIFNjaGVtYVJlYWRlckV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChzY2hlbWFMaXN0LmNvbnRhaW5zKHNjaGVtYSkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBMaXN0PFNjaGVtYUltcG9ydD4gaW1wb3J0TGlzdCA9IG5ldyBBcnJheUxpc3Q8U2NoZW1hSW1wb3J0PigpOwotICAgICAgICAvL1N0YXJ0IHJlYWRpbmcgaW5saW5lIHNjaGVtYQotICAgICAgICAvL0NoZWNrIGlmIHRoZXJlIGlzIEJpbmRpbmcgY3VzdG9taXphdGlvbiBhbmQgcmVhZCBwYWNrYWdlIGZyb20gaXQuCi0gICAgICAgIFN0cmluZyBwYWNrYWdlU3RyaW5nID0gcmVhZFNjaGVtYUJpbmRpbmdQYWNrYWdlTmFtZShzY2hlbWEpOwotICAgICAgICAvL05vIGJpbmRpbmcgY3VzdG9taXphdGlvbiBwcmVzZW50IHRoZW4gZ2V0IHRoZSBUYXJnZXRuYW1lc3BhY2Ugb2YgU2NoZW1hCi0gICAgICAgIGlmIChwYWNrYWdlU3RyaW5nID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vbm8gU2NoZW1hIEJpbmRpbmcgcGFja2FnZSBuYW1lIGZvdW5kLCB0aGlzIG1lYW5zIG5vIGpheGIgY3VzdG9taXphdGlvbnMgaW4gc2NoZW1hLCBsZXRzIHJlYWQgd3NkbAotICAgICAgICAgICAgLy90YXJnZXRuYW1lc3BhY2UuIFRoYXRzIHdoYXQgd2lsbCBiZSB1c2VkIGJ5IFJJIHRvb2xpbmcgdG8gc3RvcmUgamF2YSBCZWFucwotICAgICAgICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9IHJlYWRTY2hlbWFUYXJnZXRuYW1lc3BhY2Uoc2NoZW1hKTsKLSAgICAgICAgICAgIGlmIChpZ25vcmVTY2hlbWEuY29udGFpbnMobmFtZXNwYWNlKSkgewotICAgICAgICAgICAgICAgIC8vIGlnbm9yZSB0aGlzIHNjaGVtYSBhbmQgaXRzIGNvbnRlbnRzLi4uY29udGludWUKLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJJZ25vcmluZyB0YXJnZXRuYW1lc3BhY2UgIiArIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNjaGVtYUxpc3QuYWRkKHNjaGVtYSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG5hbWVzcGFjZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcGFja2FnZVN0cmluZyA9IEphdmFVdGlscy5nZXRQYWNrYWdlRnJvbU5hbWVzcGFjZShuYW1lc3BhY2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vR2F0aGVyIGFsbCBpbXBvcnRzIGFuZCBwcm9jZXNzIFNjaGVtYSBmcm9tIHRoZXNlIGltcG9ydHMKLSAgICAgICAgTWFwIG1hcCA9IHNjaGVtYS5nZXRJbXBvcnRzKCk7Ci0gICAgICAgIENvbGxlY3Rpb24gY29sbGVjdGlvbiA9IG1hcC52YWx1ZXMoKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIFZlY3RvciB2YWx1ZSA9IChWZWN0b3IpaS5uZXh0KCk7Ci0gICAgICAgICAgICBmb3IgKE9iamVjdCB2ZWN0b3JPYmogOiB2YWx1ZSkgewotICAgICAgICAgICAgICAgIFNjaGVtYUltcG9ydCBzaSA9IChTY2hlbWFJbXBvcnQpdmVjdG9yT2JqOwotICAgICAgICAgICAgICAgIGltcG9ydExpc3QuYWRkKHNpKTsKLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNpICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZWFkaW5nIGltcG9ydCBmb3IgU2NoZW1hTG9jYXRpb24gPSIgKyBzaS5nZXRTY2hlbWFMb2NhdGlvblVSSSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvL0dldCBuYW1lc3BhY2UgYW5kIGZsYWcgdGhlIHNjaGVtYSBhcyByZWFkCi0gICAgICAgIHNjaGVtYUxpc3QuYWRkKHNjaGVtYSk7Ci0gICAgICAgIC8vUGFja2FnZSBTdHJpbmcgY291bGQgYmUgbnVsbCBpZiB0aGVyZSBpcyBubyBzY2hlbWEgZGVmaW50aW9uIGluc2lkZSB0eXBlcwotICAgICAgICBpZiAocGFja2FnZVN0cmluZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwYWNrYWdlTGlzdC5hZGQocGFja2FnZVN0cmluZyk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChTY2hlbWFJbXBvcnQgc2kgOiBpbXBvcnRMaXN0KSB7Ci0gICAgICAgICAgICBwcm9jZXNzSW1wb3J0KHNpLCBzY2hlbWFMaXN0LCBwYWNrYWdlTGlzdCk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzSW1wb3J0KFNjaGVtYUltcG9ydCBzaSwgTGlzdDxTY2hlbWE+IHNjaGVtYUxpc3QsIFNldDxTdHJpbmc+IHBhY2thZ2VMaXN0KQotICAgICAgICAgICAgdGhyb3dzIFNjaGVtYVJlYWRlckV4Y2VwdGlvbiB7Ci0gICAgICAgIFNjaGVtYSByZWZTY2hlbWEgPSBzaS5nZXRSZWZlcmVuY2VkU2NoZW1hKCk7Ci0gICAgICAgIGlmIChyZWZTY2hlbWEgIT0gbnVsbCkgewotICAgICAgICAgICAgcHJvY2Vzc1NjaGVtYShyZWZTY2hlbWEsIHNjaGVtYUxpc3QsIHBhY2thZ2VMaXN0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIHJlYWRTY2hlbWFUYXJnZXRuYW1lc3BhY2UoU2NoZW1hIHNjaGVtYSkgewotICAgICAgICBOb2RlIHJvb3QgPSBzY2hlbWEuZ2V0RWxlbWVudCgpOwotICAgICAgICBpZiAocm9vdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBOYW1lZE5vZGVNYXAgbm9kZU1hcCA9IHJvb3QuZ2V0QXR0cmlidXRlcygpOwotICAgICAgICAgICAgTm9kZSBhdHRyaWJ1dGVOb2RlID0gbm9kZU1hcC5nZXROYW1lZEl0ZW0oU0NIRU1BX1RBUkdFVE5BTUVTUEFDRSk7Ci0gICAgICAgICAgICBpZiAoYXR0cmlidXRlTm9kZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZU5vZGUuZ2V0Tm9kZVZhbHVlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgcmVhZFNjaGVtYUJpbmRpbmdQYWNrYWdlTmFtZShTY2hlbWEgc2NoZW1hKSB7Ci0KLSAgICAgICAgLyogSkFYQiBTcGVjaWZpY2F0aW9uIHNlY3Rpb24gNy42IGhhdmUgZm9sbG93aW5nIGltcG9ydGFudCBwb2ludHMKLSAgICAgICAgICAgKiAxKSA8c2NoZW1hQmluZGluZ3M+IGJpbmRpbmcgZGVjbGFyYXRpb24gaGF2ZSBzY2hlbWEgc2NvcGUKLSAgICAgICAgICAgKiAyKSBGb3IgaW5saW5lIGFubm90YXRpb24gIGEgPHNjaGVtYUJpbmRpbmdzPiBpcyB2YWxpZCBvbmx5IGluIHRoZSBhbm5vdGF0aW9uIGVsZW1lbnQgb2YgdGhlIDxzY2hlbWE+IGVsZW1lbnQuCi0gICAgICAgICAgICogMykgVGhlcmUgbXVzdCBvbmx5IGJlIGEgc2luZ2xlIGluc3RhbmNlIG9mIDxzY2hlbWFCaW5kaW5ncz4gZGVjbGFyYXRpb24gaW4gdGhlIGFubm90YXRpb24gZWxlbWVudCBvZiB0aGUgPHNjaGVtYT4gZWxlbWVudC4KLSAgICAgICAgICAgKi8KLQotICAgICAgICAvL0dldCByb290IG5vZGUgZm9yIHNjaGVtYS4KLSAgICAgICAgTm9kZSByb290ID0gc2NoZW1hLmdldEVsZW1lbnQoKTsKLSAgICAgICAgaWYgKHJvb3QuaGFzQ2hpbGROb2RlcygpKSB7Ci0KLSAgICAgICAgICAgIC8vZ2V0IGFsbCBjaGlsZCBub2RlcyBmb3Igc2NoZW1hCi0gICAgICAgICAgICBOb2RlTGlzdCBsaXN0ID0gcm9vdC5nZXRDaGlsZE5vZGVzKCk7Ci0KLSAgICAgICAgICAgIC8vc2VhcmNoIGZvciBKQVhCIHNjaGVtYUJpbmRpbmcgY3VzdG9taXphdGlvbiBpbiBzY2hlbWEgZWxlbWVudCBkZWZpbml0aW9ucy4KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgTm9kZSBjaGlsZE5vZGUgPSBsaXN0Lml0ZW0oaSk7Ci0gICAgICAgICAgICAgICAgaWYgKGlzRWxlbWVudE5hbWUoSkFYQl9TQ0hFTUFfQklORElORywgY2hpbGROb2RlKSkgewotCi0gICAgICAgICAgICAgICAgICAgIC8vU2NoZW1hQmluZGluZyBoYXMgYmVlbiBkZWZpbmVkLCBzbyBsZXRzIGxvb2sgZm9yIHBhY2thZ2UgZWxlbWVudC4KLSAgICAgICAgICAgICAgICAgICAgTm9kZUxpc3Qgc2NoZW1hQmluZGluZ05vZGVMaXN0ID0gY2hpbGROb2RlLmdldENoaWxkTm9kZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBzY2hlbWFCaW5kaW5nTm9kZUxpc3QuZ2V0TGVuZ3RoKCk7IGorKykgewotICAgICAgICAgICAgICAgICAgICAgICAgTm9kZSBzY2hlbWFCaW5kaW5nTm9kZSA9IHNjaGVtYUJpbmRpbmdOb2RlTGlzdC5pdGVtKGopOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzRWxlbWVudE5hbWUoSkFYQl9TQ0hFTUFfQklORElOR19QQUNLQUdFLCBzY2hlbWFCaW5kaW5nTm9kZSkpIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vUGFja2FnZSBFbGVtZW50IGZvdW5kLCBzbyBsZXRzIHJlYWQgdGhlIHBhY2thZ2UgbmFtZSBhdHRyaWJ1dGUgYW5kIHJldHVybiB0aGF0LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWVkTm9kZU1hcCBub2RlTWFwID0gc2NoZW1hQmluZGluZ05vZGUuZ2V0QXR0cmlidXRlcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vZGUgYXR0cmlidXRlTm9kZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlTWFwLmdldE5hbWVkSXRlbShKQVhCX1NDSEVNQV9CaW5kaW5nX1BBQ0tBR0VOQU1FKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXR0cmlidXRlTm9kZS5nZXROb2RlVmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNFbGVtZW50TmFtZShTdHJpbmcgbmFtZSwgTm9kZSBkb21Ob2RlKSB7Ci0gICAgICAgIGlmIChkb21Ob2RlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZG9tTm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbG9jYWxOYW1lID0gZG9tTm9kZS5nZXRMb2NhbE5hbWUoKTsKLSAgICAgICAgICAgIHJldHVybiBsb2NhbE5hbWUgIT0gbnVsbCAmJiBsb2NhbE5hbWUuZXF1YWxzKG5hbWUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNTY2hlbWEoRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZXhFbGVtZW50KSB7Ci0gICAgICAgIHJldHVybiBXU0RMV3JhcHBlci5TQ0hFTUEuZXF1YWxzKGV4RWxlbWVudC5nZXRFbGVtZW50VHlwZSgpKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3QtcmVzb3VyY2VzL2F4aXMyLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3QtcmVzb3VyY2VzL2F4aXMyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGVlOWE2MC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy9heGlzMi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMDMgKzAsMCBAQAotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+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+ZmFsc2U8L3BhcmFtZXRlcj4NCi0NCi0gICAgPCEtLUpBWFdTIGRlcGxveWVyIGZvciBzZXJ2aWNlamFycywgdGhpcyB3aWxsIGFsbG93IHVzZXJzIHRvIGRyb3AgLmphciBmaWxlcyBhbmQgaGF2ZSB0aGVtIGRlcGxveWVkIGFzIGEgc2VydmljZSAtLT4NCi0gICAgPGRlcGxveWVyIGV4dGVuc2lvbj0iamFyIiBkaXJlY3Rvcnk9InNlcnZpY2VqYXJzIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5mcmFtZXdvcmsuSkFYV1NEZXBsb3llciIvPg0KLSAgICANCi0gICAgPCEtLSBGb2xsb3dpbmcgcGFyYW1ldGVyIHdpbGwgc2V0IHRoZSBob3N0IG5hbWUgZm9yIHRoZSBlcHItLT4NCi0gICAgPCEtLTxwYXJhbWV0ZXIgbmFtZT0iaG9zdG5hbWUiIGxvY2tlZD0idHJ1ZSI+bXlob3N0LmNvbTwvcGFyYW1ldGVyPi0tPg0KLQ0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+DQotICAgIDwhLS0gTWVzc2FnZSBSZWNlaXZlcnMgLS0+DQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4NCi0gICAgPCEtLVRoaXMgaXMgdGhlIERlZmF1bHQgTWVzc2FnZSBSZWNlaXZlciBmb3IgdGhlIHN5c3RlbSAsIGlmIHlvdSB3YW50IHRvIGhhdmUgTWVzc2FnZVJlY2VpdmVycyBmb3IgLS0+DQotICAgIDwhLS1hbGwgdGhlIG90aGVyIE1FUCBpbXBsZW1lbnQgaXQgYW5kIGFkZCB0aGUgY29ycmVjdCBlbnRyeSB0byBoZXJlICwgc28gdGhhdCB5b3UgY2FuIHJlZmVyIGZyb20tLT4NCi0gICAgPCEtLWFueSBvcGVyYXRpb24gLS0+DQotICAgIDwhLS1Ob3RlIDogWW91IGNhbiBvdmVycmlkZSB0aGlzIGZvciBwYXJ0aWN1bGFyIHNlcnZpY2UgYnkgYWRkaW5nIHRoZSBzYW1lIGVsZW1lbnQgd2l0aCB5b3VyIHJlcXVpcmVtZW50LS0+DQotICAgIDxtZXNzYWdlUmVjZWl2ZXJzPg0KLSAgICAgICAgPG1lc3NhZ2VSZWNlaXZlciBtZXA9Imh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgvd3NkbC9pbi1vbmx5Ig0KLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuUmF3WE1MSU5Pbmx5TWVzc2FnZVJlY2VpdmVyIi8+DQotICAgICAgICA8bWVzc2FnZVJlY2VpdmVyIG1lcD0iaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC93c2RsL2luLW91dCINCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLlJhd1hNTElOT3V0TWVzc2FnZVJlY2VpdmVyIi8+DQotICAgICAgICA8bWVzc2FnZVJlY2VpdmVyIG1lcD0iaHR0cDovL3d3dy53My5vcmcvMjAwNi8wMS93c2RsL2luLW9ubHkiDQotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5SYXdYTUxJTk9ubHlNZXNzYWdlUmVjZWl2ZXIiLz4NCi0gICAgICAgIDxtZXNzYWdlUmVjZWl2ZXIgbWVwPSJodHRwOi8vd3d3LnczLm9yZy8yMDA2LzAxL3dzZGwvaW4tb3V0Ig0KLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuUmF3WE1MSU5PdXRNZXNzYWdlUmVjZWl2ZXIiLz4NCi0gICAgPC9tZXNzYWdlUmVjZWl2ZXJzPg0KLQ0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+DQotICAgIDwhLS0gTWVzc2FnZSBGb3JtYXR0ZXIgLS0+DQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4NCi0gICAgPCEtLUZvbGxvd2luZyBjb250ZW50IHR5cGUgdG8gbWVzc2FnZSBmb3JtYXR0ZXIgbWFwcGluZyBjYW4gYmUgdXNlZCB0byBpbXBsZW1lbnQgc3VwcG9ydCBmb3IgZGlmZmVyZW50IG1lc3NhZ2UgLS0+DQotICAgIDwhLS1mb3JtYXQgIHNlcmlhbGl6YXRpb24gaW4gQXhpczIuIFRoZXNlIG1lc3NhZ2UgZm9ybWF0cyBhcmUgZXhwZWN0ZWQgdG8gYmUgcmVzb2x2ZWQgYmFzZWQgb24gdGhlIGNvbnRlbnQgdHlwZS4gLS0+DQotICAgIDxtZXNzYWdlRm9ybWF0dGVycz4NCi0gICAgICAgIDxtZXNzYWdlRm9ybWF0dGVyIGNvbnRlbnRUeXBlPSJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiDQotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLlhGb3JtVVJMRW5jb2RlZEZvcm1hdHRlciIvPg0KLSAgICAgICAgPG1lc3NhZ2VGb3JtYXR0ZXIgY29udGVudFR5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiDQotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLk11bHRpcGFydEZvcm1EYXRhRm9ybWF0dGVyIi8+DQotICAgICAgICA8bWVzc2FnZUZvcm1hdHRlciBjb250ZW50VHlwZT0iYXBwbGljYXRpb24veG1sIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5BcHBsaWNhdGlvblhNTEZvcm1hdHRlciIvPg0KLSAgICA8L21lc3NhZ2VGb3JtYXR0ZXJzPg0KLQ0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+DQotICAgIDwhLS0gTWVzc2FnZSBCdWlsZGVycyAtLT4NCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPg0KLSAgICA8IS0tRm9sbG93aW5nIGNvbnRlbnQgdHlwZSB0byBidWlsZGVyIG1hcHBpbmcgY2FuIGJlIHVzZWQgdG8gaW1wbGVtZW50IHN1cHBvcnQgZm9yIGRpZmZlcmVudCBtZXNzYWdlIC0tPg0KLSAgICA8IS0tZm9ybWF0cyBpbiBBeGlzMi4gVGhlc2UgbWVzc2FnZSBmb3JtYXRzIGFyZSBleHBlY3RlZCB0byBiZSByZXNvbHZlZCBiYXNlZCBvbiB0aGUgY29udGVudCB0eXBlLiAtLT4NCi0gICAgPG1lc3NhZ2VCdWlsZGVycz4NCi0gICAgICAgIDxtZXNzYWdlQnVpbGRlciBjb250ZW50VHlwZT0iYXBwbGljYXRpb24veG1sIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5idWlsZGVyLkFwcGxpY2F0aW9uWE1MQnVpbGRlciIvPg0KLSAgICAgICAgPG1lc3NhZ2VCdWlsZGVyIGNvbnRlbnRUeXBlPSJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiDQotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmJ1aWxkZXIuWEZvcm1VUkxFbmNvZGVkQnVpbGRlciIvPg0KLSAgICAgICAgPCEtLUxlZnQgY29tbWVudGVkIGJlY2F1c2UgaXQgYWRkcyB0aGUgZGVwYW5kYW5jeSBvZiBzZXJ2bGV0LWFwaSB0byBvdGhlciBtb2R1bGVzLg0KLSAgICAgICAgUGxlYXNlIHVuY29tbWVudCB0byBSZWNlaXZlIG1lc3NhZ2VzIGluIG11bHRpcGFydC9mb3JtLWRhdGEgZm9ybWF0LS0+DQotICAgICAgICA8IS0tPG1lc3NhZ2VCdWlsZGVyIGNvbnRlbnRUeXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIi0tPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuYnVpbGRlci5NdWx0aXBhcnRGb3JtRGF0YUJ1aWxkZXIiLz4tLT4NCi0gICAgPC9tZXNzYWdlQnVpbGRlcnM+DQotDQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4NCi0gICAgPCEtLSBUYXJnZXQgUmVzb2x2ZXJzIC0tPg0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+DQotICAgIDwhLS0gVW5jb21tZW50IHRoZSBmb2xsb3dpbmcgYW5kIHNwZWNpZnkgdGhlIGNsYXNzIG5hbWUgZm9yIHlvdXIgVGFyZ2V0UmVzb2x2ZXIgdG8gYWRkIC0tPg0KLSAgICA8IS0tIGEgVGFyZ2V0UmVzb2x2ZXIuIFRhcmdldFJlc29sdmVycyBhcmUgdXNlZCB0byBwcm9jZXNzIHRoZSBUbyBFUFIgZm9yIGV4YW1wbGUgdG8gLS0+DQotICAgIDwhLS0gY2hvb3NlIGEgc2VydmVyIGluIGEgY2x1c3RlciAtLT4NCi0gICAgPCEtLTx0YXJnZXRSZXNvbHZlcnM+LS0+DQotICAgIDwhLS08dGFyZ2V0UmVzb2x2ZXIgY2xhc3M9IiIgLz4tLT4NCi0gICAgPCEtLTwvdGFyZ2V0UmVzb2x2ZXJzPi0tPg0KLQ0KLQ0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+DQotICAgIDwhLS0gVHJhbnNwb3J0IElucyAtLT4NCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPg0KLSAgICA8dHJhbnNwb3J0UmVjZWl2ZXIgbmFtZT0iaHR0cCINCi0gICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLlNpbXBsZUhUVFBTZXJ2ZXIiPg0KLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJwb3J0Ij42MDYwPC9wYXJhbWV0ZXI+DQotICAgICAgICA8IS0tSWYgeW91IHdhbnQgdG8gZ2l2ZSB5b3VyIG93biBob3N0IGFkZHJlc3MgZm9yIEVQUiBnZW5lcmF0aW9uLS0+DQotICAgICAgICA8IS0tdW5jb21tZW50IGZvbGxvd2luZyBwYXJhbWV0ZXIgLCBhbmQgc2V0IGFzIHlvdSByZXF1aXJlZC4tLT4NCi0gICAgICAgIDwhLS08cGFyYW1ldGVyIG5hbWU9Imhvc3RuYW1lIj5odHRwOi8vbXlBcHAuY29tL3dzPC9wYXJhbWV0ZXI+LS0+DQotICAgIDwvdHJhbnNwb3J0UmVjZWl2ZXI+DQotDQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4NCi0gICAgPCEtLSBUcmFuc3BvcnQgT3V0cyAtLT4NCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPg0KLQ0KLSAgICA8dHJhbnNwb3J0U2VuZGVyIG5hbWU9ImxvY2FsIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5sb2NhbC5Mb2NhbFRyYW5zcG9ydFNlbmRlciIvPg0KLSAgICA8dHJhbnNwb3J0U2VuZGVyIG5hbWU9Imh0dHAiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuQ29tbW9uc0hUVFBUcmFuc3BvcnRTZW5kZXIiPg0KLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJQUk9UT0NPTCI+SFRUUC8xLjE8L3BhcmFtZXRlcj4NCi0gICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iVHJhbnNmZXItRW5jb2RpbmciPmNodW5rZWQ8L3BhcmFtZXRlcj4NCi0gICAgPC90cmFuc3BvcnRTZW5kZXI+DQotICAgIDx0cmFuc3BvcnRTZW5kZXIgbmFtZT0iaHR0cHMiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuQ29tbW9uc0hUVFBUcmFuc3BvcnRTZW5kZXIiPg0KLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJQUk9UT0NPTCI+SFRUUC8xLjE8L3BhcmFtZXRlcj4NCi0gICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iVHJhbnNmZXItRW5jb2RpbmciPmNodW5rZWQ8L3BhcmFtZXRlcj4NCi0gICAgPC90cmFuc3BvcnRTZW5kZXI+DQotDQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4NCi0gICAgPCEtLSBQaGFzZXMgIC0tPg0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+DQotICAgIDxwaGFzZU9yZGVyIHR5cGU9IkluRmxvdyI+DQotICAgICAgICA8IS0tICBTeXN0ZW0gcHJlLWRlZmluZWQgcGhhc2VzICAgICAgIC0tPg0KLSAgICAgICAgIDxwaGFzZSBuYW1lPSJUcmFuc3BvcnQiPg0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciI+DQotICAgICAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iVHJhbnNwb3J0Ii8+DQotICAgICAgICAgICAgPC9oYW5kbGVyPg0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciI+DQotICAgICAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iVHJhbnNwb3J0Ii8+DQotICAgICAgICAgICAgPC9oYW5kbGVyPg0KLSAgICAgICAgPC9waGFzZT4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJBZGRyZXNzaW5nIj4NCi0gICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5BZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIj4NCi0gICAgICAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iQWRkcmVzc2luZyIvPg0KLSAgICAgICAgICAgIDwvaGFuZGxlcj4NCi0gICAgICAgIDwvcGhhc2U+DQotICAgICAgICA8cGhhc2UgbmFtZT0iU2VjdXJpdHkiLz4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJQcmVEaXNwYXRjaCIvPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9IkRpc3BhdGNoIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuRGlzcGF0Y2hQaGFzZSI+DQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5SZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIj4NCi0gICAgICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJEaXNwYXRjaCIvPg0KLSAgICAgICAgICAgIDwvaGFuZGxlcj4NCi0NCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiPg0KLSAgICAgICAgICAgICAgICA8b3JkZXIgcGhhc2U9IkRpc3BhdGNoIi8+DQotICAgICAgICAgICAgPC9oYW5kbGVyPg0KLQ0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlJlcXVlc3RVUklPcGVyYXRpb25EaXNwYXRjaGVyIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklPcGVyYXRpb25EaXNwYXRjaGVyIj4NCi0gICAgICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJEaXNwYXRjaCIvPg0KLSAgICAgICAgICAgIDwvaGFuZGxlcj4NCi0NCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIj4NCi0gICAgICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJEaXNwYXRjaCIvPg0KLSAgICAgICAgICAgIDwvaGFuZGxlcj4NCi0NCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJIVFRQTG9jYXRpb25CYXNlZERpc3BhdGNoZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuSFRUUExvY2F0aW9uQmFzZWREaXNwYXRjaGVyIj4NCi0gICAgICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJEaXNwYXRjaCIvPg0KLSAgICAgICAgICAgIDwvaGFuZGxlcj4NCi0NCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJHZW5lcmljUHJvdmlkZXJEaXNwYXRjaGVyIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRpc3BhdGNoZXJzLkdlbmVyaWNQcm92aWRlckRpc3BhdGNoZXIiPg0KLSAgICAgICAgICAgICAgICA8b3JkZXIgcGhhc2U9IkRpc3BhdGNoIi8+DQotICAgICAgICAgICAgPC9oYW5kbGVyPg0KLQ0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9Ik11c3RVbmRlcnN0YW5kVmFsaWRhdGlvbkRpc3BhdGNoZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGlzcGF0Y2hlcnMuTXVzdFVuZGVyc3RhbmRWYWxpZGF0aW9uRGlzcGF0Y2hlciI+DQotICAgICAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iRGlzcGF0Y2giLz4NCi0gICAgICAgICAgICA8L2hhbmRsZXI+DQotICAgICAgICA8L3BoYXNlPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9IlJNUGhhc2UiLz4NCi0gICAgICAgIDwhLS0gIFN5c3RlbSBwcmUgZGVmaW5lZCBwaGFzZXMgICAgICAgLS0+DQotICAgICAgICA8IS0tICAgQWZ0ZXIgUG9zdGRpc3BhdGNoIHBoYXNlIG1vZHVsZSBhdXRob3Igb3Igb3Igc2VydmljZSBhdXRob3IgY2FuIGFkZCBhbnkgcGhhc2UgaGUgd2FudCAgICAgIC0tPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik9wZXJhdGlvbkluUGhhc2UiPg0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNvYXBNZXNzYWdlTVVQcm92aWRlckNoZWNrZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJvdmlkZXIuU29hcE1lc3NhZ2VNVVByb3ZpZGVyQ2hlY2tlciI+DQotICAgICAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iT3BlcmF0aW9uSW5QaGFzZSIvPg0KLSAgICAgICAgICAgIDwvaGFuZGxlcj4NCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJNdXN0VW5kZXJzdGFuZENoZWNrZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGlzcGF0Y2hlcnMuTXVzdFVuZGVyc3RhbmRDaGVja2VyIj4NCi0gICAgICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJPcGVyYXRpb25JblBoYXNlIi8+DQotICAgICAgICAgICAgPC9oYW5kbGVyPg0KLSAgICAgICAgPC9waGFzZT4NCi0gICAgPC9waGFzZU9yZGVyPg0KLSAgICA8cGhhc2VPcmRlciB0eXBlPSJPdXRGbG93Ij4NCi0gICAgICAgIDwhLS0gICAgICB1c2VyIGNhbiBhZGQgaGlzIG93biBwaGFzZXMgdG8gdGhpcyBhcmVhICAtLT4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJPcGVyYXRpb25PdXRQaGFzZSIvPg0KLSAgICAgICAgPCEtLXN5c3RlbSBwcmVkZWZpbmVkIHBoYXNlLS0+DQotICAgICAgICA8IS0tdGhlc2UgcGhhc2Ugd2lsbCBydW4gaXJyZXNwZWN0aXZlIG9mIHRoZSBzZXJ2aWNlLS0+DQotICAgICAgICA8cGhhc2UgbmFtZT0iUk1QaGFzZSIvPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9IlBvbGljeURldGVybWluYXRpb24iLz4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJNZXNzYWdlT3V0Ii8+DQotICAgICAgICA8cGhhc2UgbmFtZT0iU2VjdXJpdHkiLz4NCi0gICAgPC9waGFzZU9yZGVyPg0KLSAgICA8cGhhc2VPcmRlciB0eXBlPSJJbkZhdWx0RmxvdyI+DQotICAgICAgICA8cGhhc2UgbmFtZT0iQWRkcmVzc2luZyI+DQotICAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciI+DQotICAgICAgICAgICAgICAgICA8b3JkZXIgcGhhc2U9IkFkZHJlc3NpbmciLz4NCi0gICAgICAgICAgICA8L2hhbmRsZXI+DQotICAgICAgICA8L3BoYXNlPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9IlByZURpc3BhdGNoIi8+DQotICAgICAgICA8cGhhc2UgbmFtZT0iRGlzcGF0Y2giIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5EaXNwYXRjaFBoYXNlIj4NCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJSZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiPg0KLSAgICAgICAgICAgICAgICA8b3JkZXIgcGhhc2U9IkRpc3BhdGNoIi8+DQotICAgICAgICAgICAgPC9oYW5kbGVyPg0KLQ0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciI+DQotICAgICAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iRGlzcGF0Y2giLz4NCi0gICAgICAgICAgICA8L2hhbmRsZXI+DQotDQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iUmVxdWVzdFVSSU9wZXJhdGlvbkRpc3BhdGNoZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSU9wZXJhdGlvbkRpc3BhdGNoZXIiPg0KLSAgICAgICAgICAgICAgICA8b3JkZXIgcGhhc2U9IkRpc3BhdGNoIi8+DQotICAgICAgICAgICAgPC9oYW5kbGVyPg0KLQ0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiPg0KLSAgICAgICAgICAgICAgICA8b3JkZXIgcGhhc2U9IkRpc3BhdGNoIi8+DQotICAgICAgICAgICAgPC9oYW5kbGVyPg0KLQ0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IkhUVFBMb2NhdGlvbkJhc2VkRGlzcGF0Y2hlciINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5IVFRQTG9jYXRpb25CYXNlZERpc3BhdGNoZXIiPg0KLSAgICAgICAgICAgICAgICA8b3JkZXIgcGhhc2U9IkRpc3BhdGNoIi8+DQotICAgICAgICAgICAgPC9oYW5kbGVyPg0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IkdlbmVyaWNQcm92aWRlckRpc3BhdGNoZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGlzcGF0Y2hlcnMuR2VuZXJpY1Byb3ZpZGVyRGlzcGF0Y2hlciI+DQotICAgICAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iRGlzcGF0Y2giLz4NCi0gICAgICAgICAgICA8L2hhbmRsZXI+DQotDQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iTXVzdFVuZGVyc3RhbmRWYWxpZGF0aW9uRGlzcGF0Y2hlciINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kaXNwYXRjaGVycy5NdXN0VW5kZXJzdGFuZFZhbGlkYXRpb25EaXNwYXRjaGVyIj4NCi0gICAgICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJEaXNwYXRjaCIvPg0KLSAgICAgICAgICAgIDwvaGFuZGxlcj4NCi0gICAgICAgIDwvcGhhc2U+DQotICAgICAgICA8cGhhc2UgbmFtZT0iUk1QaGFzZSIvPg0KLSAgICAgICAgPCEtLSAgICAgIHVzZXIgY2FuIGFkZCBoaXMgb3duIHBoYXNlcyB0byB0aGlzIGFyZWEgIC0tPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik9wZXJhdGlvbkluUGhhc2UiPg0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNvYXBNZXNzYWdlTVVQcm92aWRlckNoZWNrZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJvdmlkZXIuU29hcE1lc3NhZ2VNVVByb3ZpZGVyQ2hlY2tlciI+DQotICAgICAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iT3BlcmF0aW9uSW5QaGFzZSIvPg0KLSAgICAgICAgICAgIDwvaGFuZGxlcj4NCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJNdXN0VW5kZXJzdGFuZENoZWNrZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGlzcGF0Y2hlcnMuTXVzdFVuZGVyc3RhbmRDaGVja2VyIj4NCi0gICAgICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJPcGVyYXRpb25JblBoYXNlIi8+DQotICAgICAgICAgICAgPC9oYW5kbGVyPg0KLSAgICAgICAgPC9waGFzZT4NCi0gICAgPC9waGFzZU9yZGVyPg0KLSAgICA8cGhhc2VPcmRlciB0eXBlPSJPdXRGYXVsdEZsb3ciPg0KLSAgICAgICAgPCEtLSAgICAgIHVzZXIgY2FuIGFkZCBoaXMgb3duIHBoYXNlcyB0byB0aGlzIGFyZWEgIC0tPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik9wZXJhdGlvbk91dEZhdWx0UGhhc2UiLz4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJSTVBoYXNlIi8+DQotICAgICAgICA8cGhhc2UgbmFtZT0iUG9saWN5RGV0ZXJtaW5hdGlvbiIvPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik1lc3NhZ2VPdXQiLz4NCi0gICAgPC9waGFzZU9yZGVyPg0KLTwvYXhpc2NvbmZpZz4NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy9jYXRhbG9nL2Jhc2ljLWNhdGFsb2cueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMvY2F0YWxvZy9iYXNpYy1jYXRhbG9nLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWM0MmEzOC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy9jYXRhbG9nL2Jhc2ljLWNhdGFsb2cueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08Y2F0YWxvZyB4bWxucz0idXJuOm9hc2lzOm5hbWVzOnRjOmVudGl0eTp4bWxuczp4bWw6Y2F0YWxvZyI+Ci0gICA8c3lzdGVtCi0gICAgICAgc3lzdGVtSWQ9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvYXBwbGljYXRpb25fMV80LnhzZCIKLSAgICAgICB1cmk9ImNhdGFsb2cvc2NoZW1hL2FwcGxpY2F0aW9uXzFfNC54c2QiIC8+Ci0gICA8c3lzdGVtCi0gICAgICAgc3lzdGVtSWQ9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkMiIKLSAgICAgICB1cmk9ImltcG9ydEF1eC54c2QiIC8+Ci0gICA8c3lzdGVtCi0gICAgICAgc3lzdGVtSWQ9Imh0dHA6Ly9leGFtcGxlLmNvbS90ZXN0L2RvZXNub3RleGlzdC53c2RsIgotICAgICAgIHVyaT0iZGlyMS9hYnN0cmFjdC53c2RsIiAvPgotICAgPHN5c3RlbQotICAgICAgIHN5c3RlbUlkPSJkb2Vzbm90ZXhpc3QueHNkIgotICAgICAgIHVyaT0iZGlyMi9pbXBvcnRlZDEueHNkIiAvPgotICAgPHN5c3RlbQotICAgICAgIHN5c3RlbUlkPSJodHRwOi8vZXhhbXBsZS5jb20vbmV2ZXJFeGlzdGVkLnhzZCIKLSAgICAgICB1cmk9ImRpcjMvaW1wb3J0ZWQyLnhzZCIgLz4KLSAgIDxwdWJsaWMKLSAgICAgICBwdWJsaWNJZD0iLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEVudGVycHJpc2UgSmF2YUJlYW5zIDEuMS8vRU4iCi0gICAgICAgdXJpPSJjYXRhbG9nL2R0ZC9lamItamFyLmR0ZCIgLz4KLSAgIDxwdWJsaWMKLSAgICAgICBwdWJsaWNJZD0iLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEVudGVycHJpc2UgSmF2YUJlYW5zIDIuMC8vRU4iCi0gICAgICAgdXJpPSJjYXRhbG9nL2R0ZC9lamItamFyXzJfMC5kdGQiIC8+Ci08L2NhdGFsb2c+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy9jYXRhbG9nL2NoaWxkLWNhdGFsb2cueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMvY2F0YWxvZy9jaGlsZC1jYXRhbG9nLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTcwMzRmYS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy9jYXRhbG9nL2NoaWxkLWNhdGFsb2cueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08Y2F0YWxvZyB4bWxucz0idXJuOm9hc2lzOm5hbWVzOnRjOmVudGl0eTp4bWxuczp4bWw6Y2F0YWxvZyI+Ci0gICA8c3lzdGVtCi0gICAgICAgc3lzdGVtSWQ9Imh0dHA6Ly9leGFtcGxlLmNvbS90ZXN0L2RvZXNub3RleGlzdC53c2RsIgotICAgICAgIHVyaT0iZGlyMS9hYnN0cmFjdC53c2RsIiAvPgotICAgPHN5c3RlbQotICAgICAgIHN5c3RlbUlkPSJkb2Vzbm90ZXhpc3QueHNkIgotICAgICAgIHVyaT0iZGlyMi9pbXBvcnRlZDEueHNkIiAvPgotICAgPHN5c3RlbQotICAgICAgIHN5c3RlbUlkPSJodHRwOi8vZXhhbXBsZS5jb20vbmV2ZXJFeGlzdGVkLnhzZCIKLSAgICAgICB1cmk9ImRpcjMvaW1wb3J0ZWQyLnhzZCIgLz4KLSAgIDxwdWJsaWMKLSAgICAgICBwdWJsaWNJZD0iLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEVudGVycHJpc2UgSmF2YUJlYW5zIDEuMS8vRU4iCi0gICAgICAgdXJpPSJjYXRhbG9nL2R0ZC9lamItamFyLmR0ZCIgLz4KLSAgIDxuZXh0Q2F0YWxvZyBjYXRhbG9nPSJuZXh0LnhtbCIvPgotPC9jYXRhbG9nPgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMvY2F0YWxvZy9kaXIxL2Fic3RyYWN0LndzZGwgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy9jYXRhbG9nL2RpcjEvYWJzdHJhY3Qud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTIwZDE2Yy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy9jYXRhbG9nL2RpcjEvYWJzdHJhY3Qud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTx3c2RsOmRlZmluaXRpb25zCi0gIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy5leGFtcGxlLmNvbS90ZXN0L21lc3NhZ2VUeXBlcyIKLSAgeG1sbnM9Imh0dHA6Ly93d3cuZXhhbXBsZS5jb20vdGVzdC9tZXNzYWdlVHlwZXMiCi0gIHhtbG5zOmh0dHA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvaHR0cC8iCi0gIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iIAotICB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIKLSAgeG1sbnM6bnMxPSJ1cm46dHlwZXMxIgotICB4bWxuczpuczI9InVybjp0eXBlczIiPgotICAKLSAgPHdzZGw6dHlwZXMgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iPgotICAKLSAgICA8eHM6c2NoZW1hIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIKLSAgICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3LmV4YW1wbGUuY29tL3Rlc3QvbWVzc2FnZVR5cGVzIgotICAgICAgeG1sbnM6bnM9Imh0dHA6Ly93d3cuZXhhbXBsZS5jb20vdGVzdC9tZXNzYWdlVHlwZXMiIAotICAgICAgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4KLSAgICAgIDx4czplbGVtZW50IG5hbWU9ImdldFRvdGFsIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4czpzZXF1ZW5jZS8+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzOmVsZW1lbnQ+ICAgICAKLSAgICAgIDx4czplbGVtZW50IG5hbWU9ImdldFRvdGFsUmVzcG9uc2UiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0icmV0dXJuIiB0eXBlPSJ4czppbnQiLz4KLSAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgPC94czplbGVtZW50PgotICAgICAgPHhzOmltcG9ydCBuYW1lc3BhY2U9InVybjp0eXBlczEiIHNjaGVtYUxvY2F0aW9uPSJkb2Vzbm90ZXhpc3QueHNkIi8+Ci0gICAgPC94czpzY2hlbWE+Ci0gICAgCi0gIDwvd3NkbDp0eXBlcz4KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJnZXRUb3RhbFJlcXVlc3QiIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLSAgICA8d3NkbDpwYXJ0IGVsZW1lbnQ9ImdldFRvdGFsIiBuYW1lPSJwYXJ0MSIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iLz4KLSAgPC93c2RsOm1lc3NhZ2U+Ci0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0iZ2V0VG90YWxSZXNwb25zZU1lc3NhZ2UiIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLSAgICA8d3NkbDpwYXJ0IGVsZW1lbnQ9ImdldFRvdGFsUmVzcG9uc2UiIG5hbWU9InBhcnQxIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIvPgotICA8L3dzZGw6bWVzc2FnZT4KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJhZGRSZXF1ZXN0IiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0gICAgPHdzZGw6cGFydCBlbGVtZW50PSJuczE6YWRkIiBuYW1lPSJwYXJ0MSIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iLz4KLSAgPC93c2RsOm1lc3NhZ2U+Ci0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0iYWRkUmVzcG9uc2VNZXNzYWdlIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0gICAgPHdzZGw6cGFydCBlbGVtZW50PSJuczE6YWRkUmVzcG9uc2UiIG5hbWU9InBhcnQxIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIvPgotICA8L3dzZGw6bWVzc2FnZT4KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJjbGVhclJlcXVlc3QiIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLSAgICA8d3NkbDpwYXJ0IGVsZW1lbnQ9Im5zMTpjbGVhciIgbmFtZT0icGFydDEiIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIi8+Ci0gIDwvd3NkbDptZXNzYWdlPgotICA8d3NkbDptZXNzYWdlIG5hbWU9ImNsZWFyUmVzcG9uc2VNZXNzYWdlIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0gICAgPHdzZGw6cGFydCBlbGVtZW50PSJuczE6Y2xlYXJSZXNwb25zZSIgbmFtZT0icGFydDEiIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIi8+Ci0gIDwvd3NkbDptZXNzYWdlPgotICA8d3NkbDptZXNzYWdlIG5hbWU9ImRpdmlkZVJlcXVlc3QiIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLSAgICA8d3NkbDpwYXJ0IGVsZW1lbnQ9Im5zMTpkaXZpZGUiIG5hbWU9InBhcnQxIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIvPgotICA8L3dzZGw6bWVzc2FnZT4KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJkaXZpZGVSZXNwb25zZU1lc3NhZ2UiIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLSAgICA8d3NkbDpwYXJ0IGVsZW1lbnQ9Im5zMTpkaXZpZGVSZXNwb25zZSIgbmFtZT0icGFydDEiIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIi8+Ci0gIDwvd3NkbDptZXNzYWdlPgotICA8d3NkbDptZXNzYWdlIG5hbWU9ImRpdmlkZUJ5WmVyb0V4Y2VwdGlvbiIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iPgotICAgIDx3c2RsOnBhcnQgZWxlbWVudD0ibnMxOmRpdmlkZUJ5WmVyb0ZhdWx0IiBuYW1lPSJwYXJ0MSIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iLz4KLSAgPC93c2RsOm1lc3NhZ2U+Ci0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0ibXVsdGlwbHlSZXF1ZXN0IiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0gICAgPHdzZGw6cGFydCBlbGVtZW50PSJuczE6bXVsdGlwbHkiIG5hbWU9InBhcnQxIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIvPgotICA8L3dzZGw6bWVzc2FnZT4KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJtdWx0aXBseVJlc3BvbnNlTWVzc2FnZSIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iPgotICAgIDx3c2RsOnBhcnQgZWxlbWVudD0ibnMyOm11bHRpcGx5UmVzcG9uc2UiIG5hbWU9InBhcnQxIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIvPgotICA8L3dzZGw6bWVzc2FnZT4KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJzdWJ0cmFjdFJlcXVlc3QiIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLSAgICA8d3NkbDpwYXJ0IGVsZW1lbnQ9Im5zMjpzdWJ0cmFjdCIgbmFtZT0icGFydDEiIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIi8+Ci0gIDwvd3NkbDptZXNzYWdlPgotICA8d3NkbDptZXNzYWdlIG5hbWU9InN1YnRyYWN0UmVzcG9uc2VNZXNzYWdlIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0gICAgPHdzZGw6cGFydCBlbGVtZW50PSJuczI6c3VidHJhY3RSZXNwb25zZSIgbmFtZT0icGFydDEiIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIi8+Ci0gIDwvd3NkbDptZXNzYWdlPgotICAKLTwvd3NkbDpkZWZpbml0aW9ucz4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3QtcmVzb3VyY2VzL2NhdGFsb2cvZGlyMi9pbXBvcnRlZDEueHNkIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMvY2F0YWxvZy9kaXIyL2ltcG9ydGVkMS54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1OGZmMzEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMvY2F0YWxvZy9kaXIyL2ltcG9ydGVkMS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08eHNkOnNjaGVtYSB0YXJnZXROYW1lc3BhY2U9InVybjp0eXBlczEiCi0gICAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIj4KLSAgICAgIDx4c2Q6aW1wb3J0IG5hbWVzcGFjZT0idXJuOnR5cGVzMiIgc2NoZW1hTG9jYXRpb249Imh0dHA6Ly9leGFtcGxlLmNvbS9uZXZlckV4aXN0ZWQueHNkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWRkIj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhcmFtMCIgdHlwZT0ieHNkOmludCIvPgotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWRkUmVzcG9uc2UiPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2UvPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2xlYXIiPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2UvPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2xlYXJSZXNwb25zZSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZS8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXZpZGUiPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFyYW0wIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXZpZGVSZXNwb25zZSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZS8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXZpZGVCeVplcm9GYXVsdCIgdHlwZT0ieHNkOmludCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im11bHRpcGx5Ij4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhcmFtMCIgdHlwZT0ieHNkOmludCIvPgotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gIDwveHNkOnNjaGVtYT4KLSAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMvY2F0YWxvZy9kaXIzL2ltcG9ydGVkMi54c2QgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy9jYXRhbG9nL2RpcjMvaW1wb3J0ZWQyLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJmYjc0MS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy9jYXRhbG9nL2RpcjMvaW1wb3J0ZWQyLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTx4c2Q6c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0idXJuOnR5cGVzMiIKLSAgICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im11bHRpcGx5UmVzcG9uc2UiPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2UvPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3VidHJhY3QiPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFyYW0wIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdWJ0cmFjdFJlc3BvbnNlIj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICA8L3hzZDpzY2hlbWE+Ci0gIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3QtcmVzb3VyY2VzL2NhdGFsb2cvZmFpbC9maXJzdEltcG9ydEZhaWwueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMvY2F0YWxvZy9mYWlsL2ZpcnN0SW1wb3J0RmFpbC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjY2NkOGQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMvY2F0YWxvZy9mYWlsL2ZpcnN0SW1wb3J0RmFpbC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxjYXRhbG9nIHhtbG5zPSJ1cm46b2FzaXM6bmFtZXM6dGM6ZW50aXR5OnhtbG5zOnhtbDpjYXRhbG9nIj4KLSAgIDxzeXN0ZW0KLSAgICAgICBzeXN0ZW1JZD0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS9hcHBsaWNhdGlvbl8xXzQueHNkIgotICAgICAgIHVyaT0iY2F0YWxvZy9zY2hlbWEvYXBwbGljYXRpb25fMV80LnhzZCIgLz4KLSAgIDxzeXN0ZW0KLSAgICAgICBzeXN0ZW1JZD0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2QyIgotICAgICAgIHVyaT0iaW1wb3J0QXV4LnhzZCIgLz4KLSAgIDwhLS1zeXN0ZW0KLSAgICAgICBzeXN0ZW1JZD0iaHR0cDovL2V4YW1wbGUuY29tL3Rlc3QvZG9lc25vdGV4aXN0LndzZGwiCi0gICAgICAgdXJpPSJkaXIxL2Fic3RyYWN0LndzZGwiIC8tLT4KLSAgIDxzeXN0ZW0KLSAgICAgICBzeXN0ZW1JZD0iZG9lc25vdGV4aXN0LnhzZCIKLSAgICAgICB1cmk9ImRpcjIvaW1wb3J0ZWQxLnhzZCIgLz4KLSAgIDxzeXN0ZW0KLSAgICAgICBzeXN0ZW1JZD0iaHR0cDovL2V4YW1wbGUuY29tL25ldmVyRXhpc3RlZC54c2QiCi0gICAgICAgdXJpPSJkaXIzL2ltcG9ydGVkMi54c2QiIC8+Ci0gICA8cHVibGljCi0gICAgICAgcHVibGljSWQ9Ii0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBFbnRlcnByaXNlIEphdmFCZWFucyAxLjEvL0VOIgotICAgICAgIHVyaT0iY2F0YWxvZy9kdGQvZWpiLWphci5kdGQiIC8+Ci0gICA8cHVibGljCi0gICAgICAgcHVibGljSWQ9Ii0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBFbnRlcnByaXNlIEphdmFCZWFucyAyLjAvL0VOIgotICAgICAgIHVyaT0iY2F0YWxvZy9kdGQvZWpiLWphcl8yXzAuZHRkIiAvPgotPC9jYXRhbG9nPgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMvY2F0YWxvZy9mYWlsL3Jvb3QtY2F0YWxvZy54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy9jYXRhbG9nL2ZhaWwvcm9vdC1jYXRhbG9nLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFmN2RhMi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy9jYXRhbG9nL2ZhaWwvcm9vdC1jYXRhbG9nLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGNhdGFsb2cgeG1sbnM9InVybjpvYXNpczpuYW1lczp0YzplbnRpdHk6eG1sbnM6eG1sOmNhdGFsb2ciPgotICAgPHN5c3RlbQotICAgICAgIHN5c3RlbUlkPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL2FwcGxpY2F0aW9uXzFfNC54c2QiCi0gICAgICAgdXJpPSJjYXRhbG9nL3NjaGVtYS9hcHBsaWNhdGlvbl8xXzQueHNkIiAvPgotICAgPHN5c3RlbQotICAgICAgIHN5c3RlbUlkPSJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZDIiCi0gICAgICAgdXJpPSJpbXBvcnRBdXgueHNkIiAvPgotICAgPHB1YmxpYwotICAgICAgIHB1YmxpY0lkPSItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgRW50ZXJwcmlzZSBKYXZhQmVhbnMgMS4xLy9FTiIKLSAgICAgICB1cmk9ImNhdGFsb2cvZHRkL2VqYi1qYXIuZHRkIiAvPgotICAgPHB1YmxpYwotICAgICAgIHB1YmxpY0lkPSItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgRW50ZXJwcmlzZSBKYXZhQmVhbnMgMi4wLy9FTiIKLSAgICAgICB1cmk9ImNhdGFsb2cvZHRkL2VqYi1qYXJfMl8wLmR0ZCIgLz4KLSAgIDxuZXh0Q2F0YWxvZyBjYXRhbG9nPSJ0aGlyZEltcG9ydEZhaWwueG1sIi8+Ci08L2NhdGFsb2c+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy9jYXRhbG9nL2ZhaWwvc2Vjb25kSW1wb3J0RmFpbC54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy9jYXRhbG9nL2ZhaWwvc2Vjb25kSW1wb3J0RmFpbC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxOWZiNjMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMvY2F0YWxvZy9mYWlsL3NlY29uZEltcG9ydEZhaWwueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08Y2F0YWxvZyB4bWxucz0idXJuOm9hc2lzOm5hbWVzOnRjOmVudGl0eTp4bWxuczp4bWw6Y2F0YWxvZyI+Ci0gICA8c3lzdGVtCi0gICAgICAgc3lzdGVtSWQ9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvYXBwbGljYXRpb25fMV80LnhzZCIKLSAgICAgICB1cmk9ImNhdGFsb2cvc2NoZW1hL2FwcGxpY2F0aW9uXzFfNC54c2QiIC8+Ci0gICA8c3lzdGVtCi0gICAgICAgc3lzdGVtSWQ9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkMiIKLSAgICAgICB1cmk9ImltcG9ydEF1eC54c2QiIC8+Ci0gICA8c3lzdGVtCi0gICAgICAgc3lzdGVtSWQ9Imh0dHA6Ly9leGFtcGxlLmNvbS90ZXN0L2RvZXNub3RleGlzdC53c2RsIgotICAgICAgIHVyaT0iZGlyMS9hYnN0cmFjdC53c2RsIiAvPgotICAgPCEtLXN5c3RlbQotICAgICAgIHN5c3RlbUlkPSJkb2Vzbm90ZXhpc3QueHNkIgotICAgICAgIHVyaT0iZGlyMi9pbXBvcnRlZDEueHNkIiAvLS0+Ci0gICA8c3lzdGVtCi0gICAgICAgc3lzdGVtSWQ9Imh0dHA6Ly9leGFtcGxlLmNvbS9uZXZlckV4aXN0ZWQueHNkIgotICAgICAgIHVyaT0iZGlyMy9pbXBvcnRlZDIueHNkIiAvPgotICAgPHB1YmxpYwotICAgICAgIHB1YmxpY0lkPSItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgRW50ZXJwcmlzZSBKYXZhQmVhbnMgMS4xLy9FTiIKLSAgICAgICB1cmk9ImNhdGFsb2cvZHRkL2VqYi1qYXIuZHRkIiAvPgotICAgPHB1YmxpYwotICAgICAgIHB1YmxpY0lkPSItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgRW50ZXJwcmlzZSBKYXZhQmVhbnMgMi4wLy9FTiIKLSAgICAgICB1cmk9ImNhdGFsb2cvZHRkL2VqYi1qYXJfMl8wLmR0ZCIgLz4KLTwvY2F0YWxvZz4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3QtcmVzb3VyY2VzL2NhdGFsb2cvZmFpbC90aGlyZEltcG9ydEZhaWwueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMvY2F0YWxvZy9mYWlsL3RoaXJkSW1wb3J0RmFpbC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliOWNiZWYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMvY2F0YWxvZy9mYWlsL3RoaXJkSW1wb3J0RmFpbC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxjYXRhbG9nIHhtbG5zPSJ1cm46b2FzaXM6bmFtZXM6dGM6ZW50aXR5OnhtbG5zOnhtbDpjYXRhbG9nIj4KLSAgIDxzeXN0ZW0KLSAgICAgICBzeXN0ZW1JZD0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS9hcHBsaWNhdGlvbl8xXzQueHNkIgotICAgICAgIHVyaT0iY2F0YWxvZy9zY2hlbWEvYXBwbGljYXRpb25fMV80LnhzZCIgLz4KLSAgIDxzeXN0ZW0KLSAgICAgICBzeXN0ZW1JZD0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2QyIgotICAgICAgIHVyaT0iaW1wb3J0QXV4LnhzZCIgLz4KLSAgIDxzeXN0ZW0KLSAgICAgICBzeXN0ZW1JZD0iaHR0cDovL2V4YW1wbGUuY29tL3Rlc3QvZG9lc25vdGV4aXN0LndzZGwiCi0gICAgICAgdXJpPSJkaXIxL2Fic3RyYWN0LndzZGwiIC8+Ci0gICA8c3lzdGVtCi0gICAgICAgc3lzdGVtSWQ9ImRvZXNub3RleGlzdC54c2QiCi0gICAgICAgdXJpPSJkaXIyL2ltcG9ydGVkMS54c2QiIC8+Ci0gICA8IS0tIHN5c3RlbQotICAgICAgIHN5c3RlbUlkPSJodHRwOi8vZXhhbXBsZS5jb20vbmV2ZXJFeGlzdGVkLnhzZCIKLSAgICAgICB1cmk9ImRpcjMvaW1wb3J0ZWQyLnhzZCIgLy0tPgotICAgPHB1YmxpYwotICAgICAgIHB1YmxpY0lkPSItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgRW50ZXJwcmlzZSBKYXZhQmVhbnMgMS4xLy9FTiIKLSAgICAgICB1cmk9ImNhdGFsb2cvZHRkL2VqYi1qYXIuZHRkIiAvPgotICAgPHB1YmxpYwotICAgICAgIHB1YmxpY0lkPSItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgRW50ZXJwcmlzZSBKYXZhQmVhbnMgMi4wLy9FTiIKLSAgICAgICB1cmk9ImNhdGFsb2cvZHRkL2VqYi1qYXJfMl8wLmR0ZCIgLz4KLTwvY2F0YWxvZz4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3QtcmVzb3VyY2VzL2NhdGFsb2cvaW1wb3J0QXV4LnhzZCBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3QtcmVzb3VyY2VzL2NhdGFsb2cvaW1wb3J0QXV4LnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDEyNjQ1Zi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy9jYXRhbG9nL2ltcG9ydEF1eC54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZDIiCi0gICAgICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iCi0gICAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgIHhtbG5zOnhzZDE9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkMiIKLSAgICAgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPgotICAgIDxjb21wbGV4VHlwZSBuYW1lPSJTT0FQU3RydWN0Ij4KLSAgICAgICAgPGFsbD4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InZhckZsb2F0IiB0eXBlPSJ4c2Q6ZmxvYXQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InZhckludCIgdHlwZT0ieHNkOmludCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0idmFyU3RyaW5nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwvYWxsPgotICAgIDwvY29tcGxleFR5cGU+Ci0gICAgPGVsZW1lbnQgbmFtZT0iU09BUFdyYXBwZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMvY2F0YWxvZy9pbXBvcnRBdXgyLnhzZCBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3QtcmVzb3VyY2VzL2NhdGFsb2cvaW1wb3J0QXV4Mi54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlM2FiYTQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMvY2F0YWxvZy9pbXBvcnRBdXgyLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkMiIKLSAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIKLSAgICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgeG1sbnM6eHNkMT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2QyIgotICAgICAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+Ci0gICAgPGNvbXBsZXhUeXBlIG5hbWU9IlNPQVBTdHJ1Y3QiPgotICAgICAgICA8YWxsPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0idmFyRmxvYXQiIHR5cGU9InhzZDpmbG9hdCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0idmFySW50IiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ2YXJTdHJpbmciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC9hbGw+Ci0gICAgPC9jb21wbGV4VHlwZT4KLSAgICA8ZWxlbWVudCBuYW1lPSJTT0FQV3JhcHBlcjIiIHR5cGU9InhzZDpzdHJpbmciLz4KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMvY2F0YWxvZy9pbXBvcnRCYWQueHNkIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMvY2F0YWxvZy9pbXBvcnRCYWQueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2YyYWIyLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3QtcmVzb3VyY2VzL2NhdGFsb2cvaW1wb3J0QmFkLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkIgotICAgICAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIgotICAgICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICB4bWxuczp4c2QxPSJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZCIKLSAgICAgICAgeG1sbnM6eHNkMj0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2QyIgotICAgICAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+Ci0gICAgPGltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkMiIgc2NoZW1hTG9jYXRpb249ImltcG9ydEF1eDIueHNkIj48L2ltcG9ydD4KLSAgICA8ZWxlbWVudCBuYW1lPSJlY2hvU3RydWN0UGFyYW0iIHR5cGU9InhzZDI6U09BUFN0cnVjdCIvPgotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy9jYXRhbG9nL2ltcG9ydEJhc2UueHNkIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMvY2F0YWxvZy9pbXBvcnRCYXNlLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ4ZDg3MC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy9jYXRhbG9nL2ltcG9ydEJhc2UueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2QiCi0gICAgICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iCi0gICAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgIHhtbG5zOnhzZDE9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkIgotICAgICAgICB4bWxuczp4c2QyPSJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZDIiCi0gICAgICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIj4KLSAgICA8aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2QyIiBzY2hlbWFMb2NhdGlvbj0iaW1wb3J0QXV4LnhzZCI+PC9pbXBvcnQ+Ci0gICAgPGVsZW1lbnQgbmFtZT0iZWNob1N0cnVjdFBhcmFtIiB0eXBlPSJ4c2QyOlNPQVBTdHJ1Y3QiLz4KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMvY2F0YWxvZy9yb290LWNhdGFsb2cueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMvY2F0YWxvZy9yb290LWNhdGFsb2cueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmI4OGZjLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3QtcmVzb3VyY2VzL2NhdGFsb2cvcm9vdC1jYXRhbG9nLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGNhdGFsb2cgeG1sbnM9InVybjpvYXNpczpuYW1lczp0YzplbnRpdHk6eG1sbnM6eG1sOmNhdGFsb2ciPgotICAgPHN5c3RlbQotICAgICAgIHN5c3RlbUlkPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL2FwcGxpY2F0aW9uXzFfNC54c2QiCi0gICAgICAgdXJpPSJjYXRhbG9nL3NjaGVtYS9hcHBsaWNhdGlvbl8xXzQueHNkIiAvPgotICAgPHN5c3RlbQotICAgICAgIHN5c3RlbUlkPSJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZDIiCi0gICAgICAgdXJpPSJpbXBvcnRBdXgueHNkIiAvPgotICAgPHB1YmxpYwotICAgICAgIHB1YmxpY0lkPSItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgRW50ZXJwcmlzZSBKYXZhQmVhbnMgMS4xLy9FTiIKLSAgICAgICB1cmk9ImNhdGFsb2cvZHRkL2VqYi1qYXIuZHRkIiAvPgotICAgPHB1YmxpYwotICAgICAgIHB1YmxpY0lkPSItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgRW50ZXJwcmlzZSBKYXZhQmVhbnMgMi4wLy9FTiIKLSAgICAgICB1cmk9ImNhdGFsb2cvZHRkL2VqYi1qYXJfMl8wLmR0ZCIgLz4KLSAgIDxuZXh0Q2F0YWxvZyBjYXRhbG9nPSJjaGlsZC1jYXRhbG9nLnhtbCIvPgotPC9jYXRhbG9nPgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMvY2F0YWxvZy9yb290LndzZGwgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy9jYXRhbG9nL3Jvb3Qud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTAxMDk4OC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy9jYXRhbG9nL3Jvb3Qud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDE4NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08d3NkbDpkZWZpbml0aW9ucwotICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cuZXhhbXBsZS5jb20vdGVzdC9jYWxjdWxhdG9yIgotICB4bWxuczpheGlzMm5zMT0iaHR0cDovL3d3dy5leGFtcGxlLmNvbS90ZXN0L2NhbGN1bGF0b3IiCi0gIHhtbG5zOmh0dHA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvaHR0cC8iCi0gIHhtbG5zOm1pbWU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvbWltZS8iCi0gIHhtbG5zOm1zZ3R5cGVzPSJodHRwOi8vd3d3LmV4YW1wbGUuY29tL3Rlc3QvbWVzc2FnZVR5cGVzIgotICB4bWxuczpuczE9InVybjp0eXBlczEiCi0gIHhtbG5zOm5zMj0idXJuOnR5cGVzMiIKLSAgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIgCi0gIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLSAgPHdzZGw6aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3d3dy5leGFtcGxlLmNvbS90ZXN0L21lc3NhZ2VUeXBlcyIgbG9jYXRpb249Imh0dHA6Ly9leGFtcGxlLmNvbS90ZXN0L2RvZXNub3RleGlzdC53c2RsIi8+Ci0gIAotICA8IS0tIEltcG9ydGluZyBkb2VzIG5vdCBhY3R1YWxseSBicmluZyBpbiB0aGUgbWVzc2FnZXMsIGp1c3QgdGhlIGFiaWxpdHkgdG8gcmVmZXIgdG8gdGhlbS4KLSAgICAgICBXaXRob3V0IHRoZSBmb2xsb3dpbmcgKGR1cGxpY2F0ZWQpIG1lc3NhZ2VzIHRoZSB3c2RsIGRlZmluaXRpb24gd291bGQgbm90IGhhdmUgYW55IG1lc3NhZ2VzLgotICAgICAgIEhvd2V2ZXIsIGRvIHVzZSB0aGUgaW1wb3J0ZWQgdmVyc2lvbnMgb2YgdGhlc2UgbWVzc2FnZXMgaW4gdGhlIG9wZXJhdGlvbiBkZXNjcmlwdGlvbnMgYmVsb3cuCi0gIC0tPgotICA8d3NkbDptZXNzYWdlIG5hbWU9ImdldFRvdGFsUmVxdWVzdCIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iPgotICAgIDx3c2RsOnBhcnQgZWxlbWVudD0ibXNndHlwZXM6Z2V0VG90YWwiIG5hbWU9InBhcnQxIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIvPgotICA8L3dzZGw6bWVzc2FnZT4KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJnZXRUb3RhbFJlc3BvbnNlTWVzc2FnZSIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iPgotICAgIDx3c2RsOnBhcnQgZWxlbWVudD0ibXNndHlwZXM6Z2V0VG90YWxSZXNwb25zZSIgbmFtZT0icGFydDEiIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIi8+Ci0gIDwvd3NkbDptZXNzYWdlPgotICA8d3NkbDptZXNzYWdlIG5hbWU9ImFkZFJlcXVlc3QiIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLSAgICA8d3NkbDpwYXJ0IGVsZW1lbnQ9Im5zMTphZGQiIG5hbWU9InBhcnQxIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIvPgotICA8L3dzZGw6bWVzc2FnZT4KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJhZGRSZXNwb25zZU1lc3NhZ2UiIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLSAgICA8d3NkbDpwYXJ0IGVsZW1lbnQ9Im5zMTphZGRSZXNwb25zZSIgbmFtZT0icGFydDEiIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIi8+Ci0gIDwvd3NkbDptZXNzYWdlPgotICA8d3NkbDptZXNzYWdlIG5hbWU9ImNsZWFyUmVxdWVzdCIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iPgotICAgIDx3c2RsOnBhcnQgZWxlbWVudD0ibnMxOmNsZWFyIiBuYW1lPSJwYXJ0MSIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iLz4KLSAgPC93c2RsOm1lc3NhZ2U+Ci0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0iY2xlYXJSZXNwb25zZU1lc3NhZ2UiIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLSAgICA8d3NkbDpwYXJ0IGVsZW1lbnQ9Im5zMTpjbGVhclJlc3BvbnNlIiBuYW1lPSJwYXJ0MSIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iLz4KLSAgPC93c2RsOm1lc3NhZ2U+Ci0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0iZGl2aWRlUmVxdWVzdCIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iPgotICAgIDx3c2RsOnBhcnQgZWxlbWVudD0ibnMxOmRpdmlkZSIgbmFtZT0icGFydDEiIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIi8+Ci0gIDwvd3NkbDptZXNzYWdlPgotICA8d3NkbDptZXNzYWdlIG5hbWU9ImRpdmlkZVJlc3BvbnNlTWVzc2FnZSIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iPgotICAgIDx3c2RsOnBhcnQgZWxlbWVudD0ibnMxOmRpdmlkZVJlc3BvbnNlIiBuYW1lPSJwYXJ0MSIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iLz4KLSAgPC93c2RsOm1lc3NhZ2U+Ci0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0iZGl2aWRlQnlaZXJvRXhjZXB0aW9uIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0gICAgPHdzZGw6cGFydCBlbGVtZW50PSJuczE6ZGl2aWRlQnlaZXJvRmF1bHQiIG5hbWU9InBhcnQxIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIvPgotICA8L3dzZGw6bWVzc2FnZT4KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJtdWx0aXBseVJlcXVlc3QiIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLSAgICA8d3NkbDpwYXJ0IGVsZW1lbnQ9Im5zMTptdWx0aXBseSIgbmFtZT0icGFydDEiIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIi8+Ci0gIDwvd3NkbDptZXNzYWdlPgotICA8d3NkbDptZXNzYWdlIG5hbWU9Im11bHRpcGx5UmVzcG9uc2VNZXNzYWdlIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0gICAgPHdzZGw6cGFydCBlbGVtZW50PSJuczI6bXVsdGlwbHlSZXNwb25zZSIgbmFtZT0icGFydDEiIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIi8+Ci0gIDwvd3NkbDptZXNzYWdlPgotICA8d3NkbDptZXNzYWdlIG5hbWU9InN1YnRyYWN0UmVxdWVzdCIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iPgotICAgIDx3c2RsOnBhcnQgZWxlbWVudD0ibnMyOnN1YnRyYWN0IiBuYW1lPSJwYXJ0MSIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iLz4KLSAgPC93c2RsOm1lc3NhZ2U+Ci0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0ic3VidHJhY3RSZXNwb25zZU1lc3NhZ2UiIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLSAgICA8d3NkbDpwYXJ0IGVsZW1lbnQ9Im5zMjpzdWJ0cmFjdFJlc3BvbnNlIiBuYW1lPSJwYXJ0MSIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iLz4KLSAgPC93c2RsOm1lc3NhZ2U+Ci0gIDx3c2RsOnBvcnRUeXBlIG5hbWU9IkNhbGN1bGF0b3JTZXJ2aWNlIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0gICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImdldFRvdGFsIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0gICAgICA8d3NkbDppbnB1dCBtZXNzYWdlPSJtc2d0eXBlczpnZXRUb3RhbFJlcXVlc3QiIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIi8+Ci0gICAgICA8d3NkbDpvdXRwdXQgbWVzc2FnZT0ibXNndHlwZXM6Z2V0VG90YWxSZXNwb25zZU1lc3NhZ2UiIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIi8+Ci0gICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iYWRkIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0gICAgICA8d3NkbDppbnB1dCBtZXNzYWdlPSJtc2d0eXBlczphZGRSZXF1ZXN0IiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIvPgotICAgICAgPHdzZGw6b3V0cHV0IG1lc3NhZ2U9Im1zZ3R5cGVzOmFkZFJlc3BvbnNlTWVzc2FnZSIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iLz4KLSAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJjbGVhciIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iPgotICAgICAgPHdzZGw6aW5wdXQgbWVzc2FnZT0ibXNndHlwZXM6Y2xlYXJSZXF1ZXN0IiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIvPgotICAgICAgPHdzZGw6b3V0cHV0IG1lc3NhZ2U9Im1zZ3R5cGVzOmNsZWFyUmVzcG9uc2VNZXNzYWdlIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIvPgotICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImRpdmlkZSIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iPgotICAgICAgPHdzZGw6aW5wdXQgbWVzc2FnZT0ibXNndHlwZXM6ZGl2aWRlUmVxdWVzdCIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iLz4KLSAgICAgIDx3c2RsOm91dHB1dCBtZXNzYWdlPSJtc2d0eXBlczpkaXZpZGVSZXNwb25zZU1lc3NhZ2UiIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIi8+Ci0gICAgICA8d3NkbDpmYXVsdCBtZXNzYWdlPSJtc2d0eXBlczpkaXZpZGVCeVplcm9FeGNlcHRpb24iCi0gICAgICAgIG5hbWU9ImRpdmlkZUJ5WmVyb0V4Y2VwdGlvbiIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iLz4KLSAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJtdWx0aXBseSIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iPgotICAgICAgPHdzZGw6aW5wdXQgbWVzc2FnZT0ibXNndHlwZXM6bXVsdGlwbHlSZXF1ZXN0IiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIvPgotICAgICAgPHdzZGw6b3V0cHV0IG1lc3NhZ2U9Im1zZ3R5cGVzOm11bHRpcGx5UmVzcG9uc2VNZXNzYWdlIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIvPgotICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InN1YnRyYWN0IiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0gICAgICA8d3NkbDppbnB1dCBtZXNzYWdlPSJtc2d0eXBlczpzdWJ0cmFjdFJlcXVlc3QiIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIi8+Ci0gICAgICA8d3NkbDpvdXRwdXQgbWVzc2FnZT0ibXNndHlwZXM6c3VidHJhY3RSZXNwb25zZU1lc3NhZ2UiIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIi8+Ci0gICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgPC93c2RsOnBvcnRUeXBlPgotICA8d3NkbDpiaW5kaW5nIG5hbWU9IkNhbGN1bGF0b3JTZXJ2aWNlU09BUDExQmluZGluZyIKLSAgICB0eXBlPSJheGlzMm5zMTpDYWxjdWxhdG9yU2VydmljZSIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iPgotICAgIDxzb2FwOmJpbmRpbmcgc3R5bGU9ImRvY3VtZW50IgotICAgICAgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iLz4KLSAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iZ2V0VG90YWwiIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLSAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46Z2V0VG90YWwiIHN0eWxlPSJkb2N1bWVudCIgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIvPgotICAgICAgPHdzZGw6aW5wdXQgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iPgotICAgICAgICA8c29hcDpib2R5IG5hbWVzcGFjZT0iaHR0cDovL3d3dy5leGFtcGxlLmNvbS90ZXN0L2NhbGN1bGF0b3IiCi0gICAgICAgICAgdXNlPSJsaXRlcmFsIiB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIi8+Ci0gICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICA8d3NkbDpvdXRwdXQgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iPgotICAgICAgICA8c29hcDpib2R5IG5hbWVzcGFjZT0iaHR0cDovL3d3dy5leGFtcGxlLmNvbS90ZXN0L2NhbGN1bGF0b3IiCi0gICAgICAgICAgdXNlPSJsaXRlcmFsIiB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIi8+Ci0gICAgICA8L3dzZGw6b3V0cHV0PgotICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImFkZCIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iPgotICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjphZGQiIHN0eWxlPSJkb2N1bWVudCIgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIvPgotICAgICAgPHdzZGw6aW5wdXQgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iPgotICAgICAgICA8c29hcDpib2R5IG5hbWVzcGFjZT0iaHR0cDovL3d3dy5leGFtcGxlLmNvbS90ZXN0L2NhbGN1bGF0b3IiCi0gICAgICAgICAgdXNlPSJsaXRlcmFsIiB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIi8+Ci0gICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICA8d3NkbDpvdXRwdXQgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iPgotICAgICAgICA8c29hcDpib2R5IG5hbWVzcGFjZT0iaHR0cDovL3d3dy5leGFtcGxlLmNvbS90ZXN0L2NhbGN1bGF0b3IiCi0gICAgICAgICAgdXNlPSJsaXRlcmFsIiB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIi8+Ci0gICAgICA8L3dzZGw6b3V0cHV0PgotICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImNsZWFyIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0gICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOmNsZWFyIiBzdHlsZT0iZG9jdW1lbnQiIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iLz4KLSAgICAgIDx3c2RsOmlucHV0IHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLSAgICAgICAgPHNvYXA6Ym9keSBuYW1lc3BhY2U9Imh0dHA6Ly93d3cuZXhhbXBsZS5jb20vdGVzdC9jYWxjdWxhdG9yIgotICAgICAgICAgIHVzZT0ibGl0ZXJhbCIgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIvPgotICAgICAgPC93c2RsOmlucHV0PgotICAgICAgPHdzZGw6b3V0cHV0IHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLSAgICAgICAgPHNvYXA6Ym9keSBuYW1lc3BhY2U9Imh0dHA6Ly93d3cuZXhhbXBsZS5jb20vdGVzdC9jYWxjdWxhdG9yIgotICAgICAgICAgIHVzZT0ibGl0ZXJhbCIgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIvPgotICAgICAgPC93c2RsOm91dHB1dD4KLSAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJkaXZpZGUiIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLSAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46ZGl2aWRlIiBzdHlsZT0iZG9jdW1lbnQiIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iLz4KLSAgICAgIDx3c2RsOmlucHV0IHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLSAgICAgICAgPHNvYXA6Ym9keSBuYW1lc3BhY2U9Imh0dHA6Ly93d3cuZXhhbXBsZS5jb20vdGVzdC9jYWxjdWxhdG9yIgotICAgICAgICAgIHVzZT0ibGl0ZXJhbCIgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIvPgotICAgICAgPC93c2RsOmlucHV0PgotICAgICAgPHdzZGw6b3V0cHV0IHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLSAgICAgICAgPHNvYXA6Ym9keSBuYW1lc3BhY2U9Imh0dHA6Ly93d3cuZXhhbXBsZS5jb20vdGVzdC9jYWxjdWxhdG9yIgotICAgICAgICAgIHVzZT0ibGl0ZXJhbCIgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIvPgotICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgIDx3c2RsOmZhdWx0IG5hbWU9ImRpdmlkZUJ5WmVyb0V4Y2VwdGlvbiIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iPgotICAgICAgICA8c29hcDpmYXVsdCBib2R5PSJ1c2UiIG5hbWU9ImRpdmlkZUJ5WmVyb0V4Y2VwdGlvbiIKLSAgICAgICAgICBuYW1lc3BhY2U9Imh0dHA6Ly93d3cuZXhhbXBsZS5jb20vdGVzdC9jYWxjdWxhdG9yIiB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIi8+Ci0gICAgICA8L3dzZGw6ZmF1bHQ+Ci0gICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0ibXVsdGlwbHkiIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLSAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46bXVsdGlwbHkiIHN0eWxlPSJkb2N1bWVudCIgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIvPgotICAgICAgPHdzZGw6aW5wdXQgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iPgotICAgICAgICA8c29hcDpib2R5IG5hbWVzcGFjZT0iaHR0cDovL3d3dy5leGFtcGxlLmNvbS90ZXN0L2NhbGN1bGF0b3IiCi0gICAgICAgICAgdXNlPSJsaXRlcmFsIiB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIi8+Ci0gICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICA8d3NkbDpvdXRwdXQgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iPgotICAgICAgICA8c29hcDpib2R5IG5hbWVzcGFjZT0iaHR0cDovL3d3dy5leGFtcGxlLmNvbS90ZXN0L2NhbGN1bGF0b3IiCi0gICAgICAgICAgdXNlPSJsaXRlcmFsIiB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIi8+Ci0gICAgICA8L3dzZGw6b3V0cHV0PgotICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InN1YnRyYWN0IiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0gICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOnN1YnRyYWN0IiBzdHlsZT0iZG9jdW1lbnQiIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iLz4KLSAgICAgIDx3c2RsOmlucHV0IHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLSAgICAgICAgPHNvYXA6Ym9keSBuYW1lc3BhY2U9Imh0dHA6Ly93d3cuZXhhbXBsZS5jb20vdGVzdC9jYWxjdWxhdG9yIgotICAgICAgICAgIHVzZT0ibGl0ZXJhbCIgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIvPgotICAgICAgPC93c2RsOmlucHV0PgotICAgICAgPHdzZGw6b3V0cHV0IHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLSAgICAgICAgPHNvYXA6Ym9keSBuYW1lc3BhY2U9Imh0dHA6Ly93d3cuZXhhbXBsZS5jb20vdGVzdC9jYWxjdWxhdG9yIgotICAgICAgICAgIHVzZT0ibGl0ZXJhbCIgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIvPgotICAgICAgPC93c2RsOm91dHB1dD4KLSAgICA8L3dzZGw6b3BlcmF0aW9uPgotICA8L3dzZGw6YmluZGluZz4KLSAgPHdzZGw6c2VydmljZSBuYW1lPSJDYWxjdWxhdG9yU2VydmljZVdlYlNlcnZpY2UiIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLSAgICA8d3NkbDpwb3J0IGJpbmRpbmc9ImF4aXMybnMxOkNhbGN1bGF0b3JTZXJ2aWNlU09BUDExQmluZGluZyIKLSAgICAgIG5hbWU9IkNhbGN1bGF0b3JTZXJ2aWNlU09BUDExcG9ydCIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iPgotICAgICAgPHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iIiB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIi8+Ci0gICAgPC93c2RsOnBvcnQ+Ci0gIDwvd3NkbDpzZXJ2aWNlPgotPC93c2RsOmRlZmluaXRpb25zPgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMvY2F0YWxvZy91bmlxdWUtY2F0YWxvZy54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy9jYXRhbG9nL3VuaXF1ZS1jYXRhbG9nLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2FmZmYzOS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy9jYXRhbG9nL3VuaXF1ZS1jYXRhbG9nLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGNhdGFsb2cgeG1sbnM9InVybjpvYXNpczpuYW1lczp0YzplbnRpdHk6eG1sbnM6eG1sOmNhdGFsb2ciPgotCi08cHVibGljIHB1YmxpY0lkPSItLy9PQVNJUy8vRFREIFhNTCBEb2NCb29rIFY0LjEuMi8vRU4iCi0gICAgICAgIHVyaT0iZG9jYm9vay94bWwvZG9jYm9va3guZHRkIi8+Ci0KLTxzeXN0ZW0gc3lzdGVtSWQ9InVybjp4LW9hc2lzOmRvY2Jvb2steG1sLXY0LjEuMiIKLSAgICAgICAgdXJpPSJkb2Nib29rL3htbC9kb2Nib29reC5kdGQiLz4KLQotPGRlbGVnYXRlUHVibGljIHB1YmxpY0lkU3RhcnRTdHJpbmc9Ii0vL0V4YW1wbGUvLyIKLSAgICAgICAgICBjYXRhbG9nPSJodHRwOi8vd3d3LmV4YW1wbGUuY29tL2NhdGFsb2ciLz4KLTwvY2F0YWxvZz4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3QtcmVzb3VyY2VzL2NvbW1vbnMtbG9nZ2luZy5wcm9wZXJ0aWVzIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMvY29tbW9ucy1sb2dnaW5nLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5ZmRkMGEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMvY29tbW9ucy1sb2dnaW5nLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jDQotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSMNCi0NCi0NCi0jIFRoaXMgaXMgdGhlIGxvZ2dpbmcgcHJvcGVydGllcyB0aGF0IGdvZXMgdG8gdGhlIHdhciwgdGhlcmUgYXJlIHR3byBsb2dnaW5nIGNvbmYga2VwdCBhdCB0aGUgDQotIyBzdm4sIG9uZSBmb3IgZGV2ZWxvcGVtZW50IChvbmUgYXQgc3JjL3Rlc3QtcmVzb3VyY2VzKSBhbmQgb3RoZXIgZm9yIHByb2R1Y2F0aW9uDQotIA0KLSMgVW5jb21tZW50IHRoZSBuZXh0IGxpbmUgdG8gZGlzYWJsZSBhbGwgbG9nZ2luZy4NCi0jb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nPW9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLmltcGwuTm9PcExvZw0KLQ0KLSMgVW5jb21tZW50IHRoZSBuZXh0IGxpbmUgdG8gZW5hYmxlIHRoZSBzaW1wbGUgbG9nIGJhc2VkIGxvZ2dpbmcNCi0jb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nPW9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLmltcGwuU2ltcGxlTG9nDQotDQotIyBVbmNvbW1lbnQgdGhlIG5leHQgbGluZSB0byBlbmFibGUgbG9nNGogYmFzZWQgbG9nZ2luZw0KLW9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZz1vcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5pbXBsLkxvZzRKTG9nZ2VyDQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMvY29uZmlndXJhdGlvbi9oYW5kbGVycy9DbGllbnRNZXRhZGF0YUhhbmRsZXJDaGFpblRlc3QueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMvY29uZmlndXJhdGlvbi9oYW5kbGVycy9DbGllbnRNZXRhZGF0YUhhbmRsZXJDaGFpblRlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjFjOGUyLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3QtcmVzb3VyY2VzL2NvbmZpZ3VyYXRpb24vaGFuZGxlcnMvQ2xpZW50TWV0YWRhdGFIYW5kbGVyQ2hhaW5UZXN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotDQotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPGp3czpoYW5kbGVyLWNoYWlucyB4bWxuczpqd3M9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSI+DQotDQotCTxqd3M6aGFuZGxlci1jaGFpbiBuYW1lPSJMb2dnaW5nSGFuZGxlckNoYWluIj4NCi0JCTxqd3M6aGFuZGxlcj4NCi0JCQk8andzOmhhbmRsZXItY2xhc3M+b3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zcGkuQ2xpZW50TWV0YWRhdGFIYW5kbGVyQ2hhaW5IYW5kbGVyPC9qd3M6aGFuZGxlci1jbGFzcz4NCi0JCTwvandzOmhhbmRsZXI+DQotCTwvandzOmhhbmRsZXItY2hhaW4+DQotCQ0KLTwvandzOmhhbmRsZXItY2hhaW5zPg0KLQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3QtcmVzb3VyY2VzL2NvbmZpZ3VyYXRpb24vaGFuZGxlcnMvaGFuZGxlci54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy9jb25maWd1cmF0aW9uL2hhbmRsZXJzL2hhbmRsZXIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTFiY2RiLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3QtcmVzb3VyY2VzL2NvbmZpZ3VyYXRpb24vaGFuZGxlcnMvaGFuZGxlci54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08andzOmhhbmRsZXItY2hhaW5zIHhtbG5zOmp3cz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIj4NCi0gIDxqd3M6aGFuZGxlci1jaGFpbj4NCi0gICAgPGp3czpoYW5kbGVyPg0KLSAgICAgIDxqd3M6aGFuZGxlci1jbGFzcz5vcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNwaS5oYW5kbGVyLkR1bW15U09BUEhhbmRsZXI8L2p3czpoYW5kbGVyLWNsYXNzPg0KLSAgICA8L2p3czpoYW5kbGVyPg0KLSAgICA8andzOmhhbmRsZXI+DQotICAgICAgPGp3czpoYW5kbGVyLWNsYXNzPm9yZy5hcGFjaGUuYXhpczIuamF4d3Muc3BpLmhhbmRsZXIuRHVtbXlMb2dpY2FsSGFuZGxlcjwvandzOmhhbmRsZXItY2xhc3M+DQotICAgIDwvandzOmhhbmRsZXI+DQotICA8L2p3czpoYW5kbGVyLWNoYWluPg0KLTwvandzOmhhbmRsZXItY2hhaW5zPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3QtcmVzb3VyY2VzL2ltYWdlL2ltYWdlMS5qcGVnIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMvaW1hZ2UvaW1hZ2UxLmpwZWcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3MzNiZjEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMvaW1hZ2UvaW1hZ2UxLmpwZWcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy9pbWFnZS9pbWFnZTIuanBlZyBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3QtcmVzb3VyY2VzL2ltYWdlL2ltYWdlMi5qcGVnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWZkN2I5Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3QtcmVzb3VyY2VzL2ltYWdlL2ltYWdlMi5qcGVnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMvaW1hZ2UvdGVzdC5qcGcgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy9pbWFnZS90ZXN0LmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFkMjk1ZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy9pbWFnZS90ZXN0LmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3QtcmVzb3VyY2VzL2xvZzRqLnByb3BlcnRpZXMgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy9sb2c0ai5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NmM1ZGU4Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3QtcmVzb3VyY2VzL2xvZzRqLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0jDQotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSMNCi0NCi0jIFNldCByb290IGNhdGVnb3J5IHByaW9yaXR5IHRvIElORk8gYW5kIGl0cyBvbmx5IGFwcGVuZGVyIHRvIENPTlNPTEUuDQotI2xvZzRqLnJvb3RDYXRlZ29yeT1ERUJVRywgQ09OU09MRQ0KLSNsb2c0ai5yb290Q2F0ZWdvcnk9REVCVUcsIENPTlNPTEUsIExPR0ZJTEUNCi0jbG9nNGoucm9vdENhdGVnb3J5PURFQlVHLCBMT0dGSUxFDQotbG9nNGoucm9vdENhdGVnb3J5PUVSUk9SLCBDT05TT0xFDQotDQotIyBTZXQgc2VsZWN0ZWQgbG9nZ2luZw0KLSMgKFlvdSBtaWdodCB3YW50IHRvIGRvIHRoaXMgdG8gY3V0IGRvd24gb24gdGhlIHNpemUgb2YgdGhlIGZpbGUpDQotIyBUaGUgZXhhbXBsZSBiZWxvdyBhZGRzIGRlYnVnIHRyYWNlIGZvciBTdEFYVXRpbHMgb3IgamF4d3Mgc2VydmVyIHRvIA0KLSMgdGhlIGF4aXMyLnNtYWxsLmxvZy4NCi0jIFlvdSBjYW4gYWRkIHRoaXMgd2l0aG91dCBjaGFuZ2luZyB0aGUgcm9vdCBjYXRlZ29yeS4NCi1sb2c0ai5jYXRlZ29yeS5vcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2U9REVCVUcsIFNNQUxMDQotDQotIyBFbmFibGUgdGhlIGZvbGxvd2luZyB0byBnZXQgSkFYV1MgVGVzdExvZ2dlciB0cmFjZS4NCi0jbG9nNGouY2F0ZWdvcnkuSkFYV1MtVGVzdHM9REVCVUcsIFNNQUxMDQotDQotIyBTZXQgdGhlIGVudGVycHJpc2UgbG9nZ2VyIHByaW9yaXR5IHRvIEZBVEFMDQotbG9nNGoubG9nZ2VyLm9yZy5hcGFjaGUuYXhpczIuZW50ZXJwcmlzZT1GQVRBTA0KLWxvZzRqLmxvZ2dlci5kZS5odW5zaWNrZXIuamFsb3B5LmlvPUZBVEFMDQotbG9nNGoubG9nZ2VyLmh0dHBjbGllbnQud2lyZS5oZWFkZXI9RkFUQUwNCi1sb2c0ai5sb2dnZXIub3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQ9RkFUQUwNCi0NCi0jIENPTlNPTEUgaXMgc2V0IHRvIGJlIGEgQ29uc29sZUFwcGVuZGVyIHVzaW5nIGEgUGF0dGVybkxheW91dC4NCi1sb2c0ai5hcHBlbmRlci5DT05TT0xFPW9yZy5hcGFjaGUubG9nNGouQ29uc29sZUFwcGVuZGVyDQotbG9nNGouYXBwZW5kZXIuQ09OU09MRS5sYXlvdXQ9b3JnLmFwYWNoZS5sb2c0ai5QYXR0ZXJuTGF5b3V0DQotbG9nNGouYXBwZW5kZXIuQ09OU09MRS5sYXlvdXQuQ29udmVyc2lvblBhdHRlcm49JWQgJS01cCAlYyAtICVtJW4NCi0NCi0jIExPR0ZJTEUgaXMgc2V0IHRvIGJlIGEgRmlsZSBhcHBlbmRlciB1c2luZyBhIFBhdHRlcm5MYXlvdXQuDQotbG9nNGouYXBwZW5kZXIuTE9HRklMRT1vcmcuYXBhY2hlLmxvZzRqLkZpbGVBcHBlbmRlcg0KLWxvZzRqLmFwcGVuZGVyLkxPR0ZJTEUuRmlsZT1heGlzMi5sb2cNCi1sb2c0ai5hcHBlbmRlci5MT0dGSUxFLkFwcGVuZD10cnVlDQotbG9nNGouYXBwZW5kZXIuTE9HRklMRS5sYXlvdXQ9b3JnLmFwYWNoZS5sb2c0ai5QYXR0ZXJuTGF5b3V0DQotbG9nNGouYXBwZW5kZXIuTE9HRklMRS5sYXlvdXQuQ29udmVyc2lvblBhdHRlcm49JWQgWyV0XSAlLTVwICVjICV4IC0gJW0lbg0KLQ0KLSMgU01BTEwgaXMgc2V0IHRvIGJlIGEgRmlsZSBhcHBlbmRlciB1c2luZyBhIFBhdHRlcm5MYXlvdXQuDQotbG9nNGouYXBwZW5kZXIuU01BTEw9b3JnLmFwYWNoZS5sb2c0ai5GaWxlQXBwZW5kZXINCi1sb2c0ai5hcHBlbmRlci5TTUFMTC5GaWxlPWF4aXMyLnNtYWxsLmxvZw0KLWxvZzRqLmFwcGVuZGVyLlNNQUxMLkFwcGVuZD10cnVlDQotbG9nNGouYXBwZW5kZXIuU01BTEwubGF5b3V0PW9yZy5hcGFjaGUubG9nNGouUGF0dGVybkxheW91dA0KLWxvZzRqLmFwcGVuZGVyLlNNQUxMLmxheW91dC5Db252ZXJzaW9uUGF0dGVybj0lZCBbJXRdICUtNXAgJWMgJXggLSAlbSVuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMvcHJvdmlkZXIveG1sL3dlYi54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy9wcm92aWRlci94bWwvd2ViLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNiOGU1Yi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy9wcm92aWRlci94bWwvd2ViLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHRlc3RPcGVyYXRpb24+Ci0gIDx0ZXN0UGFyYW0+SGVsbG8gV29ybGQ8L3Rlc3RQYXJhbT4KLTwvdGVzdE9wZXJhdGlvbj4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3QtcmVzb3VyY2VzL3dzZGwvQWRkTnVtYmVycy53c2RsIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMvd3NkbC9BZGROdW1iZXJzLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjMDI4ZWIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMvd3NkbC9BZGROdW1iZXJzLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+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+Ci08L2RlZmluaXRpb25zPgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMvd3NkbC9CYWRFbmRwb2ludEFkZHJlc3Mud3NkbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3QtcmVzb3VyY2VzL3dzZGwvQmFkRW5kcG9pbnRBZGRyZXNzLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzY2Y3MDIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMvd3NkbC9CYWRFbmRwb2ludEFkZHJlc3Mud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGRlZmluaXRpb25zIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2pheHdzLmF4aXMyLmFwYWNoZS5vcmciCi0gICAgICB4bWxuczp0bnM9Imh0dHA6Ly9qYXh3cy5heGlzMi5hcGFjaGUub3JnIgotICAgICAgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiAKLSAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIj4KLQotICAgPHR5cGVzPgotICAgICAgPHhzZDpzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vamF4d3MuYXhpczIuYXBhY2hlLm9yZyIKLSAgICAgICAgIHhtbG5zOnRucz0iaHR0cDovL2pheHdzLmF4aXMyLmFwYWNoZS5vcmciCi0gICAgICAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+Ci0KLSAgICAgICAgIDxjb21wbGV4VHlwZSBuYW1lPSJlY2hvVHlwZSI+Ci0gICAgICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJyZXF1ZXN0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPC9jb21wbGV4VHlwZT4KLQotICAgICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9ImVjaG9SZXNwb25zZVR5cGUiPgotICAgICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0icmVzcG9uc2UiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8L2NvbXBsZXhUeXBlPgotCi0gICAgICAgICA8ZWxlbWVudCBuYW1lPSJlY2hvIiB0eXBlPSJ0bnM6ZWNob1R5cGUiLz4KLSAgICAgICAgIDxlbGVtZW50IG5hbWU9ImVjaG9SZXNwb25zZSIgdHlwZT0idG5zOmVjaG9SZXNwb25zZVR5cGUiLz4KLQotICAgICAgPC94c2Q6c2NoZW1hPgotICAgPC90eXBlcz4KLQotICAgPG1lc3NhZ2UgbmFtZT0iZWNobyI+Ci0gICAgICA8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJ0bnM6ZWNobyIvPgotICAgPC9tZXNzYWdlPgotCi0gICA8bWVzc2FnZSBuYW1lPSJlY2hvUmVzcG9uc2UiPgotICAgICAgPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0idG5zOmVjaG9SZXNwb25zZSIvPgotICAgPC9tZXNzYWdlPgotCi0gICA8cG9ydFR5cGUgbmFtZT0iRWNobyI+Ci0gICAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG8iPgotICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczplY2hvIiAvPgotICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6ZWNob1Jlc3BvbnNlIiAvPgotICAgICAgPC9vcGVyYXRpb24+Ci0gICA8L3BvcnRUeXBlPgotCi0gICA8YmluZGluZyBuYW1lPSJFY2hvQmluZGluZyIgdHlwZT0idG5zOkVjaG8iPgotICAgICAgPHNvYXA6YmluZGluZyBzdHlsZT0iZG9jdW1lbnQiIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIi8+Ci0gICAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG8iPgotICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPgotICAgICAgICAgPGlucHV0PgotICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgIDwvaW5wdXQ+Ci0KLSAgICAgICAgIDxvdXRwdXQ+Ci0gICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgPC9vdXRwdXQ+Ci0gICAgICA8L29wZXJhdGlvbj4KLSAgIDwvYmluZGluZz4KLQotICAgPHNlcnZpY2UgbmFtZT0iRWNob1NlcnZpY2UiPgotICAgICAgPHBvcnQgYmluZGluZz0idG5zOkVjaG9CaW5kaW5nIiBuYW1lPSJFY2hvUG9ydCI+Ci0gICAgICAgICA8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJ0aGlzIGlzIGFuIGludmFsaWQgc3RyaW5nIi8+Ci0gICAgICA8L3BvcnQ+Ci0gICA8L3NlcnZpY2U+Ci08L2RlZmluaXRpb25zPgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMvd3NkbC9DbGllbnRNZXRhZGF0YS53c2RsIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMvd3NkbC9DbGllbnRNZXRhZGF0YS53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODg2YWFkLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3QtcmVzb3VyY2VzL3dzZGwvQ2xpZW50TWV0YWRhdGEud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+ICANCi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08ZGVmaW5pdGlvbnMgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vZGVzY3JpcHRpb24uamF4d3MuYXhpczIuYXBhY2hlLm9yZyINCi0gICAgICAgICAgICAgeG1sbnM6dG5zPSJodHRwOi8vZGVzY3JpcHRpb24uamF4d3MuYXhpczIuYXBhY2hlLm9yZyINCi0gICAgICAgICAgICAgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIg0KLSAgICAgICAgICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIg0KLSAgICAgICAgICAgICB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIj4gICAgIA0KLSAgPHR5cGVzPiAgICAgIA0KLSAgICA8eHNkOnNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9kZXNjcmlwdGlvbi5qYXh3cy5heGlzMi5hcGFjaGUub3JnIiANCi0gICAgICAgICAgICAgICAgeG1sbnM6dHM9Imh0dHA6Ly9kZXNjcmlwdGlvbi5qYXh3cy5heGlzMi5hcGFjaGUub3JnL3hzZCINCi0gICAgICAgICAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+ICAgICAgICAgICANCi0gICAgICA8Y29tcGxleFR5cGUgbmFtZT0iZWNob01lc3NhZ2UiPg0KLSAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJyZXF1ZXN0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+DQotICAgICAgICA8L3NlcXVlbmNlPiAgICAgICAgICANCi0gICAgICA8L2NvbXBsZXhUeXBlPiAgICAgICAgICAgDQotICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9ImVjaG9NZXNzYWdlUmVzcG9uc2UiPiAgICAgICAgICAgICANCi0gICAgICAgIDxzZXF1ZW5jZT4gICAgICAgICAgICAgICAgDQotICAgICAgICAgIDxlbGVtZW50IG5hbWU9InJlc3BvbnNlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+ICAgICAgICAgICAgDQotICAgICAgICA8L3NlcXVlbmNlPiAgICAgICAgICANCi0gICAgICA8L2NvbXBsZXhUeXBlPiAgICAgICAgICAgDQotICAgICAgPGVsZW1lbnQgbmFtZT0iZWNob01lc3NhZ2UiIHR5cGU9InRuczplY2hvTWVzc2FnZSIvPiAgICAgICAgICANCi0gICAgICA8ZWxlbWVudCBuYW1lPSJlY2hvTWVzc2FnZVJlc3BvbnNlIiB0eXBlPSJ0bnM6ZWNob01lc3NhZ2VSZXNwb25zZSIvPiAgICAgICAgDQotICAgIDwveHNkOnNjaGVtYT4gICAgDQotICA8L3R5cGVzPiAgICAgDQotDQotICA8bWVzc2FnZSBuYW1lPSJlY2hvTWVzc2FnZSI+ICAgICAgIA0KLSAgICA8cGFydCBuYW1lPSJtZXNzYWdlIiBlbGVtZW50PSJ0bnM6ZWNob01lc3NhZ2UiLz4gICAgDQotICA8L21lc3NhZ2U+ICAgICANCi0NCi0gIDxtZXNzYWdlIG5hbWU9ImVjaG9NZXNzYWdlUmVzcG9uc2UiPiAgICAgICANCi0gICAgPHBhcnQgbmFtZT0icmVzdWx0IiBlbGVtZW50PSJ0bnM6ZWNob01lc3NhZ2VSZXNwb25zZSIvPiAgICANCi0gIDwvbWVzc2FnZT4gICAgIA0KLQ0KLSAgPHBvcnRUeXBlIG5hbWU9IkVjaG9NZXNzYWdlUG9ydFR5cGUiPiAgICAgICANCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvTWVzc2FnZSI+ICAgICAgICAgIA0KLSAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6ZWNob01lc3NhZ2UiIC8+ICAgICAgICAgIA0KLSAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmVjaG9NZXNzYWdlUmVzcG9uc2UiIC8+ICAgICAgIA0KLSAgICA8L29wZXJhdGlvbj4gICAgDQotICA8L3BvcnRUeXBlPiAgICAgDQotDQotICA8YmluZGluZyBuYW1lPSJFY2hvTWVzc2FnZUJpbmRpbmciIHR5cGU9InRuczpFY2hvTWVzc2FnZVBvcnRUeXBlIj4gICAgICAgDQotICAgIDxzb2FwOmJpbmRpbmcgc3R5bGU9ImRvY3VtZW50IiB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIvPiAgICAgICANCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvTWVzc2FnZSI+ICAgICAgICAgIA0KLSAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4gICAgICAgICANCi0gICAgICA8aW5wdXQ+ICAgICAgICAgICAgIA0KLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIG5hbWVzcGFjZT0iaHR0cDovL29yZy5hcGFjaGUuYmluZGluZy5ucyIvPiAgICAgICAgICANCi0gICAgICA8L2lucHV0PiAgICAgICAgICAgDQotICAgICAgPG91dHB1dD4gICAgICAgICAgICAgDQotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgbmFtZXNwYWNlPSJodHRwOi8vb3JnLmFwYWNoZS5iaW5kaW5nLm5zIi8+ICAgICAgICAgDQotICAgICAgPC9vdXRwdXQ+ICAgICAgIA0KLSAgICA8L29wZXJhdGlvbj4gICAgDQotICA8L2JpbmRpbmc+ICAgICANCi0NCi0gIDxzZXJ2aWNlIG5hbWU9InN2Y0xvY2FsUGFydCI+ICAgICAgIA0KLSAgICA8cG9ydCBiaW5kaW5nPSJ0bnM6RWNob01lc3NhZ2VCaW5kaW5nIiBuYW1lPSJwb3J0TG9jYWxQYXJ0Ij4gICAgICAgICAgDQotICAgICAgPHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo2MDYwL0VjaG9NZXNzYWdlU2VydmljZS9FY2hvTWVzc2FnZVNlcnZpY2UiLz4gICAgICAgDQotICAgIDwvcG9ydD4gICAgIA0KLSAgPC9zZXJ2aWNlPiAgDQotPC9kZWZpbml0aW9ucz4NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy93c2RsL0NsaWVudE1ldGFkYXRhTXVsdGlQb3J0LndzZGwgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy93c2RsL0NsaWVudE1ldGFkYXRhTXVsdGlQb3J0LndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiMmFlZDcuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMvd3NkbC9DbGllbnRNZXRhZGF0YU11bHRpUG9ydC53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4gIA0KLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTxkZWZpbml0aW9ucyB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9kZXNjcmlwdGlvbi5qYXh3cy5heGlzMi5hcGFjaGUub3JnIg0KLSAgICAgICAgICAgICB4bWxuczp0bnM9Imh0dHA6Ly9kZXNjcmlwdGlvbi5qYXh3cy5heGlzMi5hcGFjaGUub3JnIg0KLSAgICAgICAgICAgICB4bWxucz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iDQotICAgICAgICAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiDQotICAgICAgICAgICAgIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iPiAgICAgDQotICA8dHlwZXM+ICAgICAgDQotICAgIDx4c2Q6c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2Rlc2NyaXB0aW9uLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciIA0KLSAgICAgICAgICAgICAgICB4bWxuczp0cz0iaHR0cDovL2Rlc2NyaXB0aW9uLmpheHdzLmF4aXMyLmFwYWNoZS5vcmcveHNkIg0KLSAgICAgICAgICAgICAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIj4gICAgICAgICAgIA0KLSAgICAgIDxjb21wbGV4VHlwZSBuYW1lPSJlY2hvTWVzc2FnZSI+DQotICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgIDxlbGVtZW50IG5hbWU9InJlcXVlc3QiIHR5cGU9InhzZDpzdHJpbmciLz4NCi0gICAgICAgIDwvc2VxdWVuY2U+ICAgICAgICAgIA0KLSAgICAgIDwvY29tcGxleFR5cGU+ICAgICAgICAgICANCi0gICAgICA8Y29tcGxleFR5cGUgbmFtZT0iZWNob01lc3NhZ2VSZXNwb25zZSI+ICAgICAgICAgICAgIA0KLSAgICAgICAgPHNlcXVlbmNlPiAgICAgICAgICAgICAgICANCi0gICAgICAgICAgPGVsZW1lbnQgbmFtZT0icmVzcG9uc2UiIHR5cGU9InhzZDpzdHJpbmciLz4gICAgICAgICAgICANCi0gICAgICAgIDwvc2VxdWVuY2U+ICAgICAgICAgIA0KLSAgICAgIDwvY29tcGxleFR5cGU+ICAgICAgICAgICANCi0gICAgICA8ZWxlbWVudCBuYW1lPSJlY2hvTWVzc2FnZSIgdHlwZT0idG5zOmVjaG9NZXNzYWdlIi8+ICAgICAgICAgIA0KLSAgICAgIDxlbGVtZW50IG5hbWU9ImVjaG9NZXNzYWdlUmVzcG9uc2UiIHR5cGU9InRuczplY2hvTWVzc2FnZVJlc3BvbnNlIi8+ICAgICAgICANCi0gICAgPC94c2Q6c2NoZW1hPiAgICANCi0gIDwvdHlwZXM+ICAgICANCi0NCi0gIDxtZXNzYWdlIG5hbWU9ImVjaG9NZXNzYWdlIj4gICAgICAgDQotICAgIDxwYXJ0IG5hbWU9Im1lc3NhZ2UiIGVsZW1lbnQ9InRuczplY2hvTWVzc2FnZSIvPiAgICANCi0gIDwvbWVzc2FnZT4gICAgIA0KLQ0KLSAgPG1lc3NhZ2UgbmFtZT0iZWNob01lc3NhZ2VSZXNwb25zZSI+ICAgICAgIA0KLSAgICA8cGFydCBuYW1lPSJyZXN1bHQiIGVsZW1lbnQ9InRuczplY2hvTWVzc2FnZVJlc3BvbnNlIi8+ICAgIA0KLSAgPC9tZXNzYWdlPiAgICAgDQotDQotICA8cG9ydFR5cGUgbmFtZT0iRWNob01lc3NhZ2VQb3J0VHlwZSI+ICAgICAgIA0KLSAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9NZXNzYWdlIj4gICAgICAgICAgDQotICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczplY2hvTWVzc2FnZSIgLz4gICAgICAgICAgDQotICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6ZWNob01lc3NhZ2VSZXNwb25zZSIgLz4gICAgICAgDQotICAgIDwvb3BlcmF0aW9uPiAgICANCi0gIDwvcG9ydFR5cGU+ICAgICANCi0NCi0gIDxiaW5kaW5nIG5hbWU9IkVjaG9NZXNzYWdlQmluZGluZyIgdHlwZT0idG5zOkVjaG9NZXNzYWdlUG9ydFR5cGUiPiAgICAgICANCi0gICAgPHNvYXA6YmluZGluZyBzdHlsZT0iZG9jdW1lbnQiIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIi8+ICAgICAgIA0KLSAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9NZXNzYWdlIj4gICAgICAgICAgDQotICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPiAgICAgICAgIA0KLSAgICAgIDxpbnB1dD4gICAgICAgICAgICAgDQotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgbmFtZXNwYWNlPSJodHRwOi8vb3JnLmFwYWNoZS5iaW5kaW5nLm5zIi8+ICAgICAgICAgIA0KLSAgICAgIDwvaW5wdXQ+ICAgICAgICAgICANCi0gICAgICA8b3V0cHV0PiAgICAgICAgICAgICANCi0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9Imh0dHA6Ly9vcmcuYXBhY2hlLmJpbmRpbmcubnMiLz4gICAgICAgICANCi0gICAgICA8L291dHB1dD4gICAgICAgDQotICAgIDwvb3BlcmF0aW9uPiAgICANCi0gIDwvYmluZGluZz4gICAgIA0KLQ0KLSAgPHNlcnZpY2UgbmFtZT0ic3ZjTG9jYWxQYXJ0Ij4gICAgICAgDQotICAgIDxwb3J0IGJpbmRpbmc9InRuczpFY2hvTWVzc2FnZUJpbmRpbmciIG5hbWU9InBvcnRMb2NhbFBhcnRNdWx0aTEiPiAgICAgICAgICANCi0gICAgICA8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjYwNjAvRWNob01lc3NhZ2VTZXJ2aWNlL0VjaG9NZXNzYWdlU2VydmljZS9wb3J0TG9jYWxQYXJ0TXVsdGkxIi8+ICAgICAgIA0KLSAgICA8L3BvcnQ+ICAgICANCi0gICAgPHBvcnQgYmluZGluZz0idG5zOkVjaG9NZXNzYWdlQmluZGluZyIgbmFtZT0icG9ydExvY2FsUGFydE11bHRpMiI+ICAgICAgICAgIA0KLSAgICAgIDxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6NjA2MC9FY2hvTWVzc2FnZVNlcnZpY2UvRWNob01lc3NhZ2VTZXJ2aWNlL3BvcnRMb2NhbFBhcnRNdWx0aTIiLz4gICAgICAgDQotICAgIDwvcG9ydD4gICAgIA0KLSAgICA8cG9ydCBiaW5kaW5nPSJ0bnM6RWNob01lc3NhZ2VCaW5kaW5nIiBuYW1lPSJwb3J0TG9jYWxQYXJ0TXVsdGkzIj4gICAgICAgICAgDQotICAgICAgPHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo2MDYwL0VjaG9NZXNzYWdlU2VydmljZS9FY2hvTWVzc2FnZVNlcnZpY2UvcG9ydExvY2FsUGFydE11bHRpMyIvPiAgICAgICANCi0gICAgPC9wb3J0PiAgICAgDQotICA8L3NlcnZpY2U+ICANCi08L2RlZmluaXRpb25zPg0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3QtcmVzb3VyY2VzL3dzZGwvQ2xpZW50TWV0YWRhdGFPdGhlci53c2RsIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMvd3NkbC9DbGllbnRNZXRhZGF0YU90aGVyLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhZTJkMTUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMvd3NkbC9DbGllbnRNZXRhZGF0YU90aGVyLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PiAgDQotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPGRlZmluaXRpb25zIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2Rlc2NyaXB0aW9uLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciDQotICAgICAgICAgICAgIHhtbG5zOnRucz0iaHR0cDovL2Rlc2NyaXB0aW9uLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciDQotICAgICAgICAgICAgIHhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyINCi0gICAgICAgICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSINCi0gICAgICAgICAgICAgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyI+ICAgICANCi0gIDx0eXBlcz4gICAgICANCi0gICAgPHhzZDpzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vZGVzY3JpcHRpb24uamF4d3MuYXhpczIuYXBhY2hlLm9yZyIgDQotICAgICAgICAgICAgICAgIHhtbG5zOnRzPSJodHRwOi8vZGVzY3JpcHRpb24uamF4d3MuYXhpczIuYXBhY2hlLm9yZy94c2QiDQotICAgICAgICAgICAgICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPiAgICAgICAgICAgDQotICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9ImVjaG9NZXNzYWdlIj4NCi0gICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgPGVsZW1lbnQgbmFtZT0icmVxdWVzdCIgdHlwZT0ieHNkOnN0cmluZyIvPg0KLSAgICAgICAgPC9zZXF1ZW5jZT4gICAgICAgICAgDQotICAgICAgPC9jb21wbGV4VHlwZT4gICAgICAgICAgIA0KLSAgICAgIDxjb21wbGV4VHlwZSBuYW1lPSJlY2hvTWVzc2FnZVJlc3BvbnNlIj4gICAgICAgICAgICAgDQotICAgICAgICA8c2VxdWVuY2U+ICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJyZXNwb25zZSIgdHlwZT0ieHNkOnN0cmluZyIvPiAgICAgICAgICAgIA0KLSAgICAgICAgPC9zZXF1ZW5jZT4gICAgICAgICAgDQotICAgICAgPC9jb21wbGV4VHlwZT4gICAgICAgICAgIA0KLSAgICAgIDxlbGVtZW50IG5hbWU9ImVjaG9NZXNzYWdlIiB0eXBlPSJ0bnM6ZWNob01lc3NhZ2UiLz4gICAgICAgICAgDQotICAgICAgPGVsZW1lbnQgbmFtZT0iZWNob01lc3NhZ2VSZXNwb25zZSIgdHlwZT0idG5zOmVjaG9NZXNzYWdlUmVzcG9uc2UiLz4gICAgICAgIA0KLSAgICA8L3hzZDpzY2hlbWE+ICAgIA0KLSAgPC90eXBlcz4gICAgIA0KLQ0KLSAgPG1lc3NhZ2UgbmFtZT0iZWNob01lc3NhZ2UiPiAgICAgICANCi0gICAgPHBhcnQgbmFtZT0ibWVzc2FnZSIgZWxlbWVudD0idG5zOmVjaG9NZXNzYWdlIi8+ICAgIA0KLSAgPC9tZXNzYWdlPiAgICAgDQotDQotICA8bWVzc2FnZSBuYW1lPSJlY2hvTWVzc2FnZVJlc3BvbnNlIj4gICAgICAgDQotICAgIDxwYXJ0IG5hbWU9InJlc3VsdCIgZWxlbWVudD0idG5zOmVjaG9NZXNzYWdlUmVzcG9uc2UiLz4gICAgDQotICA8L21lc3NhZ2U+ICAgICANCi0NCi0gIDxwb3J0VHlwZSBuYW1lPSJFY2hvTWVzc2FnZVBvcnRUeXBlIj4gICAgICAgDQotICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob01lc3NhZ2UiPiAgICAgICAgICANCi0gICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmVjaG9NZXNzYWdlIiAvPiAgICAgICAgICANCi0gICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczplY2hvTWVzc2FnZVJlc3BvbnNlIiAvPiAgICAgICANCi0gICAgPC9vcGVyYXRpb24+ICAgIA0KLSAgPC9wb3J0VHlwZT4gICAgIA0KLQ0KLSAgPGJpbmRpbmcgbmFtZT0iRWNob01lc3NhZ2VCaW5kaW5nIiB0eXBlPSJ0bnM6RWNob01lc3NhZ2VQb3J0VHlwZSI+ICAgICAgIA0KLSAgICA8c29hcDpiaW5kaW5nIHN0eWxlPSJkb2N1bWVudCIgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiLz4gICAgICAgDQotICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob01lc3NhZ2UiPiAgICAgICAgICANCi0gICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+ICAgICAgICAgDQotICAgICAgPGlucHV0PiAgICAgICAgICAgICANCi0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9Imh0dHA6Ly9vcmcuYXBhY2hlLmJpbmRpbmcubnMiLz4gICAgICAgICAgDQotICAgICAgPC9pbnB1dD4gICAgICAgICAgIA0KLSAgICAgIDxvdXRwdXQ+ICAgICAgICAgICAgIA0KLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIG5hbWVzcGFjZT0iaHR0cDovL29yZy5hcGFjaGUuYmluZGluZy5ucyIvPiAgICAgICAgIA0KLSAgICAgIDwvb3V0cHV0PiAgICAgICANCi0gICAgPC9vcGVyYXRpb24+ICAgIA0KLSAgPC9iaW5kaW5nPiAgICAgDQotDQotICA8c2VydmljZSBuYW1lPSJzdmNMb2NhbFBhcnQiPiAgICAgICANCi0gICAgPHBvcnQgYmluZGluZz0idG5zOkVjaG9NZXNzYWdlQmluZGluZyIgbmFtZT0icG9ydExvY2FsUGFydE90aGVyIj4gICAgICAgICAgDQotICAgICAgPHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo2MDYwL0VjaG9NZXNzYWdlU2VydmljZS9FY2hvTWVzc2FnZVNlcnZpY2UiLz4gICAgICAgDQotICAgIDwvcG9ydD4gICAgIA0KLSAgPC9zZXJ2aWNlPiAgDQotPC9kZWZpbml0aW9ucz4NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy93c2RsL0NsaWVudE1ldGFkYXRhT3ZlcnJpZGVuLndzZGwgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy93c2RsL0NsaWVudE1ldGFkYXRhT3ZlcnJpZGVuLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkOWQ1MzYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMvd3NkbC9DbGllbnRNZXRhZGF0YU92ZXJyaWRlbi53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4gIA0KLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTxkZWZpbml0aW9ucyB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9kZXNjcmlwdGlvbi5qYXh3cy5heGlzMi5hcGFjaGUub3JnIg0KLSAgICAgICAgICAgICB4bWxuczp0bnM9Imh0dHA6Ly9kZXNjcmlwdGlvbi5qYXh3cy5heGlzMi5hcGFjaGUub3JnIg0KLSAgICAgICAgICAgICB4bWxucz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iDQotICAgICAgICAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiDQotICAgICAgICAgICAgIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iPiAgICAgDQotICA8dHlwZXM+ICAgICAgDQotICAgIDx4c2Q6c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2Rlc2NyaXB0aW9uLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciIA0KLSAgICAgICAgICAgICAgICB4bWxuczp0cz0iaHR0cDovL2Rlc2NyaXB0aW9uLmpheHdzLmF4aXMyLmFwYWNoZS5vcmcveHNkIg0KLSAgICAgICAgICAgICAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIj4gICAgICAgICAgIA0KLSAgICAgIDxjb21wbGV4VHlwZSBuYW1lPSJlY2hvTWVzc2FnZSI+DQotICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgIDxlbGVtZW50IG5hbWU9InJlcXVlc3QiIHR5cGU9InhzZDpzdHJpbmciLz4NCi0gICAgICAgIDwvc2VxdWVuY2U+ICAgICAgICAgIA0KLSAgICAgIDwvY29tcGxleFR5cGU+ICAgICAgICAgICANCi0gICAgICA8Y29tcGxleFR5cGUgbmFtZT0iZWNob01lc3NhZ2VSZXNwb25zZSI+ICAgICAgICAgICAgIA0KLSAgICAgICAgPHNlcXVlbmNlPiAgICAgICAgICAgICAgICANCi0gICAgICAgICAgPGVsZW1lbnQgbmFtZT0icmVzcG9uc2UiIHR5cGU9InhzZDpzdHJpbmciLz4gICAgICAgICAgICANCi0gICAgICAgIDwvc2VxdWVuY2U+ICAgICAgICAgIA0KLSAgICAgIDwvY29tcGxleFR5cGU+ICAgICAgICAgICANCi0gICAgICA8ZWxlbWVudCBuYW1lPSJlY2hvTWVzc2FnZSIgdHlwZT0idG5zOmVjaG9NZXNzYWdlIi8+ICAgICAgICAgIA0KLSAgICAgIDxlbGVtZW50IG5hbWU9ImVjaG9NZXNzYWdlUmVzcG9uc2UiIHR5cGU9InRuczplY2hvTWVzc2FnZVJlc3BvbnNlIi8+ICAgICAgICANCi0gICAgPC94c2Q6c2NoZW1hPiAgICANCi0gIDwvdHlwZXM+ICAgICANCi0NCi0gIDxtZXNzYWdlIG5hbWU9ImVjaG9NZXNzYWdlIj4gICAgICAgDQotICAgIDxwYXJ0IG5hbWU9Im1lc3NhZ2UiIGVsZW1lbnQ9InRuczplY2hvTWVzc2FnZSIvPiAgICANCi0gIDwvbWVzc2FnZT4gICAgIA0KLQ0KLSAgPG1lc3NhZ2UgbmFtZT0iZWNob01lc3NhZ2VSZXNwb25zZSI+ICAgICAgIA0KLSAgICA8cGFydCBuYW1lPSJyZXN1bHQiIGVsZW1lbnQ9InRuczplY2hvTWVzc2FnZVJlc3BvbnNlIi8+ICAgIA0KLSAgPC9tZXNzYWdlPiAgICAgDQotDQotICA8cG9ydFR5cGUgbmFtZT0iRWNob01lc3NhZ2VQb3J0VHlwZSI+ICAgICAgIA0KLSAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9NZXNzYWdlIj4gICAgICAgICAgDQotICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczplY2hvTWVzc2FnZSIgLz4gICAgICAgICAgDQotICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6ZWNob01lc3NhZ2VSZXNwb25zZSIgLz4gICAgICAgDQotICAgIDwvb3BlcmF0aW9uPiAgICANCi0gIDwvcG9ydFR5cGU+ICAgICANCi0NCi0gIDxiaW5kaW5nIG5hbWU9IkVjaG9NZXNzYWdlQmluZGluZyIgdHlwZT0idG5zOkVjaG9NZXNzYWdlUG9ydFR5cGUiPiAgICAgICANCi0gICAgPHNvYXA6YmluZGluZyBzdHlsZT0iZG9jdW1lbnQiIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIi8+ICAgICAgIA0KLSAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9NZXNzYWdlIj4gICAgICAgICAgDQotICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPiAgICAgICAgIA0KLSAgICAgIDxpbnB1dD4gICAgICAgICAgICAgDQotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgbmFtZXNwYWNlPSJodHRwOi8vb3JnLmFwYWNoZS5iaW5kaW5nLm5zIi8+ICAgICAgICAgIA0KLSAgICAgIDwvaW5wdXQ+ICAgICAgICAgICANCi0gICAgICA8b3V0cHV0PiAgICAgICAgICAgICANCi0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9Imh0dHA6Ly9vcmcuYXBhY2hlLmJpbmRpbmcubnMiLz4gICAgICAgICANCi0gICAgICA8L291dHB1dD4gICAgICAgDQotICAgIDwvb3BlcmF0aW9uPiAgICANCi0gIDwvYmluZGluZz4gICAgIA0KLQ0KLSAgPHNlcnZpY2UgbmFtZT0ic3ZjTG9jYWxQYXJ0Ij4gICAgICAgDQotICAgIDxwb3J0IGJpbmRpbmc9InRuczpFY2hvTWVzc2FnZUJpbmRpbmciIG5hbWU9InBvcnRMb2NhbFBhcnRPdmVycmlkZW4iPiAgICAgICAgICANCi0gICAgICA8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjYwNjAvRWNob01lc3NhZ2VTZXJ2aWNlL0VjaG9NZXNzYWdlU2VydmljZSIvPiAgICAgICANCi0gICAgPC9wb3J0PiAgICAgDQotICA8L3NlcnZpY2U+ICANCi08L2RlZmluaXRpb25zPg0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3QtcmVzb3VyY2VzL3dzZGwvUGFydGlhbFdTREwxX3NjaGVtYS54c2QgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy93c2RsL1BhcnRpYWxXU0RMMV9zY2hlbWEueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTk1MDYxLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3QtcmVzb3VyY2VzL3dzZGwvUGFydGlhbFdTREwxX3NjaGVtYS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ieWVzIj8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHhzOnNjaGVtYSB2ZXJzaW9uPSIxLjAiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3NlcnZlclBhcnRpYWwxLmNoZWNrZXhjZXB0aW9uLndlYmZhdWx0LmFubm90YXRpb25zLyIgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJBZGROZWdhdGl2ZU51bWJlcnNFeGNlcHRpb24iIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4czpzdHJpbmciLz4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJhZGRUd29OdW1iZXJzIiB0eXBlPSJuczE6YWRkVHdvTnVtYmVycyIgeG1sbnM6bnMxPSJodHRwOi8vc2VydmVyUGFydGlhbDEuY2hlY2tleGNlcHRpb24ud2ViZmF1bHQuYW5ub3RhdGlvbnMvIi8+Ci0KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImFkZFR3b051bWJlcnMiPgotICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgIDx4czplbGVtZW50IG5hbWU9ImFyZzAiIHR5cGU9InhzOmludCIvPgotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iYXJnMSIgdHlwZT0ieHM6aW50Ii8+Ci0gICAgPC94czpzZXF1ZW5jZT4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJhZGRUd29OdW1iZXJzUmVzcG9uc2UiIHR5cGU9Im5zMjphZGRUd29OdW1iZXJzUmVzcG9uc2UiIHhtbG5zOm5zMj0iaHR0cDovL3NlcnZlclBhcnRpYWwxLmNoZWNrZXhjZXB0aW9uLndlYmZhdWx0LmFubm90YXRpb25zLyIvPgotCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJhZGRUd29OdW1iZXJzUmVzcG9uc2UiPgotICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgIDx4czplbGVtZW50IG5hbWU9InJldHVybiIgdHlwZT0ieHM6aW50Ii8+Ci0gICAgPC94czpzZXF1ZW5jZT4KLSAgPC94czpjb21wbGV4VHlwZT4KLTwveHM6c2NoZW1hPgotCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy93c2RsL1Byb3h5RG9jTGl0V3JhcHBlZC53c2RsIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMvd3NkbC9Qcm94eURvY0xpdFdyYXBwZWQud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY2ZWZjNy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy93c2RsL1Byb3h5RG9jTGl0V3JhcHBlZC53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsMzAyICswLDAgQEAKLTw/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+Ci0KLTwvd3NkbDpkZWZpbml0aW9ucz4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3QtcmVzb3VyY2VzL3dzZGwvV1NETE11bHRpVGVzdHMud3NkbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3QtcmVzb3VyY2VzL3dzZGwvV1NETE11bHRpVGVzdHMud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY3ZGQ5ZC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy93c2RsL1dTRExNdWx0aVRlc3RzLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyMzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+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+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy93c2RsL1dTRExUZXN0cy53c2RsIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMvd3NkbC9XU0RMVGVzdHMud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTY2NzY4NC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy93c2RsL1dTRExUZXN0cy53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08IS0tIFdTREwgZGVzY3JpcHRpb24gb2YgdGhlIFdTUyBQaW5nIGludGVyb3Agc2NlbmFyaW9zIC0tPgotCi08ZGVmaW5pdGlvbnMgbmFtZT0iRWNobyIKLSAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL3Rlc3RzIgotICAgIHhtbG5zOndzdT0iaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NzLzIwMDQvMDEvb2FzaXMtMjAwNDAxLXdzcy13c3NlY3VyaXR5LXV0aWxpdHktMS4wLnhzZCIgCi0gICAgeG1sbnM6dG5zPSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi90ZXN0cyIKLSAgICB4bWxucz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iCi0gICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIgotICAgIHhtbG5zOndzcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOS9wb2xpY3kiCi0gICAgeG1sbnM6d3NhPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA4L2FkZHJlc3NpbmciCi0gICAgeG1sbnM6aW50Zj0iaHR0cDovL3dzLXBvbGljeS50ZXN0cyI+Ci0gICAgCSAgCi0gIDx0eXBlcz4KLSAgICA8c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvdGVzdHMiCi0gICAgICAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPgotICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9ImVjaG8iPgotICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgPGVsZW1lbnQgbmFtZT0idGV4dCIgdHlwZT0ieHNkOnN0cmluZyIgbmlsbGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgICA8Y29tcGxleFR5cGUgbmFtZT0iZWNob1Jlc3BvbnNlIj4KLSAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgIDxlbGVtZW50IG5hbWU9InRleHQiIHR5cGU9InhzZDpzdHJpbmciIG5pbGxhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgICAgPGVsZW1lbnQgbmFtZT0iRWNobyIgdHlwZT0idG5zOmVjaG8iLz4KLSAgICAgIDxlbGVtZW50IG5hbWU9IkVjaG9SZXNwb25zZSIgdHlwZT0idG5zOmVjaG9SZXNwb25zZSIvPgotICAgIDwvc2NoZW1hPgotICA8L3R5cGVzPgotCi0gIDxtZXNzYWdlIG5hbWU9IkVjaG9SZXF1ZXN0Ij4KLSAgICA8cGFydCBuYW1lPSJlY2hvIiBlbGVtZW50PSJ0bnM6RWNobyIvPgotICA8L21lc3NhZ2U+Ci0KLSAgPG1lc3NhZ2UgbmFtZT0iRWNob1Jlc3BvbnNlIj4KLSAgICA8cGFydCBuYW1lPSJlY2hvUmVzcG9uc2UiIGVsZW1lbnQ9InRuczpFY2hvUmVzcG9uc2UiLz4KLSAgPC9tZXNzYWdlPgotCi0gIDxwb3J0VHlwZSBuYW1lPSJFY2hvUG9ydCI+Ci0gICAgPG9wZXJhdGlvbiBuYW1lPSJFY2hvIj4KLSAgICAgIDxpbnB1dCAgbWVzc2FnZT0idG5zOkVjaG9SZXF1ZXN0IiB3c2E6QWN0aW9uPSJodHRwOi8vdGVzdHMub3JnL2VjaG8vaW4iIC8+Ci0gICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczpFY2hvUmVzcG9uc2UiIHdzYTpBY3Rpb249Imh0dHA6Ly90ZXN0cy5vcmcvZWNoby9vdXQiIC8+Ci0gICAgPC9vcGVyYXRpb24+Ci0gIDwvcG9ydFR5cGU+Ci0KLSAgPGJpbmRpbmcgbmFtZT0iRWNob0JpbmRpbmciIHR5cGU9InRuczpFY2hvUG9ydCI+Ci0gICAgPHNvYXA6YmluZGluZyB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIKLXN0eWxlPSJkb2N1bWVudCIvPgotICAgIDxvcGVyYXRpb24gbmFtZT0iRWNobyI+Ci0gICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvdGVzdHMvZWNobyIvPgotICAgICAgPGlucHV0PiAKLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgIDwvaW5wdXQ+Ci0gICAgICA8b3V0cHV0PgotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgPC9vdXRwdXQ+Ci0gICAgPC9vcGVyYXRpb24+Ci0gIDwvYmluZGluZz4KLSAgIAotICA8c2VydmljZSBuYW1lPSJFY2hvU2VydmljZSI+Ci0gICAgPHBvcnQgbmFtZT0iRWNob1BvcnQiIGJpbmRpbmc9InRuczpFY2hvQmluZGluZyI+Ci0gICAgICA8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjYwNjAvYXhpczIvc2VydmljZXMvRWNob1NlcnZpY2UiLz4KLSAgICA8L3BvcnQ+Ci0gIDwvc2VydmljZT4KLQotPC9kZWZpbml0aW9ucz4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3QtcmVzb3VyY2VzL3dzZGwvV1NHZW5TZXJ2aWNlX3NjaGVtYTEueHNkIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMvd3NkbC9XU0dlblNlcnZpY2Vfc2NoZW1hMS54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiMTkzMzQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMvd3NkbC9XU0dlblNlcnZpY2Vfc2NoZW1hMS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ieWVzIj8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHhzOnNjaGVtYSB2ZXJzaW9uPSIxLjAiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3dzZ2VuLnNhbXBsZS5qYXh3cy5heGlzMi5hcGFjaGUub3JnIiB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPgotCi0gIDx4czplbGVtZW50IG5hbWU9ImVjaG9TdHJpbmciIHR5cGU9Im5zMTplY2hvU3RyaW5nIiB4bWxuczpuczE9Imh0dHA6Ly93c2dlbi5zYW1wbGUuamF4d3MuYXhpczIuYXBhY2hlLm9yZyIvPgotCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJlY2hvU3RyaW5nIj4KLSAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJhcmcwIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHM6c2VxdWVuY2U+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0iZWNob1N0cmluZ1Jlc3BvbnNlIiB0eXBlPSJuczI6ZWNob1N0cmluZ1Jlc3BvbnNlIiB4bWxuczpuczI9Imh0dHA6Ly93c2dlbi5zYW1wbGUuamF4d3MuYXhpczIuYXBhY2hlLm9yZyIvPgotCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJlY2hvU3RyaW5nUmVzcG9uc2UiPgotICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgIDx4czplbGVtZW50IG5hbWU9InJldHVybiIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzOnNlcXVlbmNlPgotICA8L3hzOmNvbXBsZXhUeXBlPgotPC94czpzY2hlbWE+Ci0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3QtcmVzb3VyY2VzL3dzZGwvc2hhcGVzLndzZGwgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy93c2RsL3NoYXBlcy53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTlkOWZlLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3QtcmVzb3VyY2VzL3dzZGwvc2hhcGVzLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotICB+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+Ci0JCTwvd3NkbDpwb3J0PgotCTwvd3NkbDpzZXJ2aWNlPgotCQotPC93c2RsOmRlZmluaXRpb25zPgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMveG1sL2FkZG51bWJlcnN0ZXN0LnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3QtcmVzb3VyY2VzL3htbC9hZGRudW1iZXJzdGVzdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjNzVjZGIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMveG1sL2FkZG51bWJlcnN0ZXN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTxzb2FwOkVudmVsb3BlIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIj4NCi0gICAgICAgIDxzb2FwOkhlYWRlcj4gDQotCQkJPG5zMTpteUhlYWRlciB4bWxuczpuczE9Imh0dHA6Ly9vcmcvdGVzdC9hZGRudW1iZXJzaGFuZGxlciI+R29vZDE8L25zMTpteUhlYWRlcj4NCi0JCQk8bnMxOm15SGVhZGVyIHhtbG5zOm5zMT0iaHR0cDovL29yZy90ZXN0L2FkZG51bWJlcnNoYW5kbGVyIiBzb2FwOmFjdG9yPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2FjdG9yL25leHQiPkdvb2QyPC9uczE6bXlIZWFkZXI+DQotCQkJPG5zMTpteUhlYWRlciB4bWxuczpuczE9Imh0dHA6Ly9vcmcvdGVzdC9hZGRudW1iZXJzaGFuZGxlciIgc29hcDphY3Rvcj0iaHR0cDovL2JhZEFjdG9yIj5CYWQ8L25zMTpteUhlYWRlcj4NCi0JCTwvc29hcDpIZWFkZXI+DQotIAkJPHNvYXA6Qm9keT4gDQotCQkJPG5zMjphZGROdW1iZXJzSGFuZGxlciB4bWxuczpuczI9Imh0dHA6Ly9vcmcvdGVzdC9hZGRudW1iZXJzaGFuZGxlciI+DQotCQkJPG5zMjphcmcwPjEwPC9uczI6YXJnMD4NCi0JCQk8bnMyOmFyZzE+MTA8L25zMjphcmcxPg0KLQkJCTwvbnMyOmFkZE51bWJlcnNIYW5kbGVyPg0KLQkJPC9zb2FwOkJvZHk+DQotCTwvc29hcDpFbnZlbG9wZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy94bWwvcmVmZXJlbmNlcGFyYW1ldGVycy54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy94bWwvcmVmZXJlbmNlcGFyYW1ldGVycy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhNTdjODguLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMveG1sL3JlZmVyZW5jZXBhcmFtZXRlcnMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPHNvYXBlbnY6RW52ZWxvcGUgeG1sbnM6c29hcGVudj0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iDQotICAgICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIg0KLSAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgIHhtbG5zOndzYT0iaHR0cDovL3d3dy53My5vcmcvMjAwNS8wOC9hZGRyZXNzaW5nIj4NCi0gICAgPHNvYXBlbnY6SGVhZGVyIHhtbG5zOmZhYnJpa2FtPSJodHRwOi8vZXhhbXBsZS5jb20vZmFicmlrYW0iIHhtbG5zOmF4aXMyPSJodHRwOi8vd3MuYXBhY2hlLm9yZy9uYW1lc3BhY2VzL2F4aXMyIj4NCi0gICAgICAgIDx3c2E6TWVzc2FnZUlEIGF4aXMyOkF0dHJFeHQ9IjEyMzQ1Njc4OSIgc29hcGVudjptdXN0VW5kZXJzdGFuZD0iMCI+DQotICAgICAgICAgICAgdXVpZDo5MjBDNTE5MC0wQjhGLTExRDktOENFRC1GMjJFREVFQkY3RTU8L3dzYTpNZXNzYWdlSUQ+DQotICAgICAgICA8d3NhOlRvIGF4aXMyOkF0dHJFeHQ9IjEyMzQ1Njc4OSIgc29hcGVudjptdXN0VW5kZXJzdGFuZD0iMCI+aHR0cDovL2xvY2FsaG9zdDo4MDgxL2F4aXMvc2VydmljZXMvQmFua1BvcnQ8L3dzYTpUbz4NCi0gICAgICAgIDxheGlzMjpQYXJhbU9uZSB3c2E6SXNSZWZlcmVuY2VQYXJhbWV0ZXI9J3RydWUnPjAxMjM0NTY3ODk8L2F4aXMyOlBhcmFtT25lPg0KLSAgICAgICAgPGF4aXMyOlBhcmFtVHdvIHdzYTpJc1JlZmVyZW5jZVBhcmFtZXRlcj0ndHJ1ZSc+QUJDREVGRzwvYXhpczI6UGFyYW1Ud28+DQotICAgICAgICA8YXhpczI6UGFyYW1UaHJlZSB3c2E6SXNSZWZlcmVuY2VQYXJhbWV0ZXI9J3RydWUnPmFiY2RlZmc8L2F4aXMyOlBhcmFtVGhyZWU+DQotICAgICAgICA8YXhpczI6UGFyYW1Gb3VyIHdzYTpJc1JlZmVyZW5jZVBhcmFtZXRlcj0nMSc+eHl6PC9heGlzMjpQYXJhbUZvdXI+DQotICAgICAgICA8d3NhOkFjdGlvbiBheGlzMjpBdHRyRXh0PSIxMjM0NTY3ODkiPmh0dHA6Ly93cy5hcGFjaGUub3JnL3Rlc3RzL2FjdGlvbjwvd3NhOkFjdGlvbj4NCi0gICAgICAgIDx3c2E6UmVwbHlUbyBheGlzMjpBdHRyRXh0PSIxMjM0NTY3ODkiPg0KLSAgICAgICAgICAgIDx3c2E6QWRkcmVzcz5odHRwOi8vZXhhbXBsZS5jb20vZmFicmlrYW0vYWNjdDwvd3NhOkFkZHJlc3M+DQotICAgICAgICAgICAgPHdzYTpSZWZlcmVuY2VQYXJhbWV0ZXJzPg0KLSAgICAgICAgICAgICAgICA8ZmFicmlrYW06Q3VzdG9tZXJLZXk+MTIzNDU2Nzg5PC9mYWJyaWthbTpDdXN0b21lcktleT4NCi0gICAgICAgICAgICAgICAgPGZhYnJpa2FtOlNob3BwaW5nQ2FydD5BQkNERUZHPC9mYWJyaWthbTpTaG9wcGluZ0NhcnQ+DQotICAgICAgICAgICAgPC93c2E6UmVmZXJlbmNlUGFyYW1ldGVycz4NCi0gICAgICAgICAgICA8d3NhOk1ldGFkYXRhPg0KLSAgICAgICAgICAgICAgICA8YXhpczI6TWV0YUV4dCBheGlzMjpBdHRyRXh0PSIxMjM0NTY3ODkiPjEyMzQ1Njc4OTwvYXhpczI6TWV0YUV4dD4NCi0gICAgICAgICAgICA8L3dzYTpNZXRhZGF0YT4NCi0gICAgICAgICAgICA8YXhpczI6RVBSRXh0IGF4aXMyOkF0dHJFeHQ9IjEyMzQ1Njc4OSI+MTIzNDU2Nzg5PC9heGlzMjpFUFJFeHQ+DQotICAgICAgICA8L3dzYTpSZXBseVRvPg0KLSAgICA8L3NvYXBlbnY6SGVhZGVyPg0KLSAgICA8c29hcGVudjpCb2R5Pg0KLSAgICAgICAgPG5zMTpnZXRCYWxhbmNlIHNvYXBlbnY6ZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iDQotICAgICAgICAgICAgICAgIHhtbG5zOm5zMT0iaHR0cDovL2xvY2FsaG9zdDo4MDgxL2F4aXMvc2VydmljZXMvQmFua1BvcnQiPg0KLSAgICAgICAgICAgIDxhY2NvdW50Tm8gaHJlZj0iI2lkMCIvPg0KLSAgICAgICAgPC9uczE6Z2V0QmFsYW5jZT4NCi0gICAgICAgIDxtdWx0aVJlZiBpZD0iaWQwIiBzb2FwZW5jOnJvb3Q9IjAiDQotICAgICAgICAgICAgICAgIHNvYXBlbnY6ZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iDQotICAgICAgICAgICAgICAgIHhzaTp0eXBlPSJ4c2Q6aW50IiB4bWxuczpzb2FwZW5jPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyI+DQotICAgICAgICAgICAgMTAwMTwvbXVsdGlSZWY+DQotICAgIDwvc29hcGVudjpCb2R5Pg0KLTwvc29hcGVudjpFbnZlbG9wZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy94bWwvc29hcG1lc3NhZ2UueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMveG1sL3NvYXBtZXNzYWdlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUxNTZlMy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy94bWwvc29hcG1lc3NhZ2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLSAKLQk8IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0gCi0JPHNvYXA6RW52ZWxvcGUgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iPgotIAkJPHNvYXA6Qm9keT4gCi0JCQk8bnMyOmludm9rZSB4bWxuczpuczI9Imh0dHA6Ly9vcmcudGVzdC5zb2FwbWVzc2FnZSI+PGludm9rZV9zdHI+c29tZSByZXF1ZXN0PC9pbnZva2Vfc3RyPjwvbnMyOmludm9rZT4KLQkJPC9zb2FwOkJvZHk+Ci0JPC9zb2FwOkVudmVsb3BlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3QtcmVzb3VyY2VzL3hzZC8zRFNoYXBlLnhzZCBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3QtcmVzb3VyY2VzL3hzZC8zRFNoYXBlLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWEyN2IwNS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy94c2QvM0RTaGFwZS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTx4c2Q6c2NoZW1hIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0JCXhtbG5zOnRuczE9Imh0dHA6Ly9zaGFwZS50ZXN0Lm9yZyIKLQkJeG1sbnM6dG5zPSJodHRwOi8vdGhyZWVkLnNoYXBlLnRlc3Qub3JnIiAKLQkJeG1sbnM6amF4Yj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF4YiIgIGpheGI6dmVyc2lvbj0iMi4wIgotCQl0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90aHJlZWQuc2hhcGUudGVzdC5vcmciPgotCQkKLQkJPHhzZDppbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vc2hhcGUudGVzdC5vcmciCi0JCQkgICAgc2NoZW1hTG9jYXRpb249InNoYXBlLnhzZCIgLz4KLQkJCi0JCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVGhyZWVEU3F1YXJlIj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InRuczE6U3F1YXJlIj4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iYnJlZHRoIiB0eXBlPSJ4c2Q6aW50IiAvPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JCQotCQkKLTwveHNkOnNjaGVtYT4JCQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMveHNkL2VjaG8ueHNkIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMveHNkL2VjaG8ueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzljNWIxLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3QtcmVzb3VyY2VzL3hzZC9lY2hvLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPCEtLSBUaGlzIHNjaGVtYSBpcyB1c2VkIHRvIGdlbmVyYXRlIHRoZSBKQVgtQiBhcnRpZmFjdHMKLSAgICAgdXNlZCBieSB0aGUgSkFYLUIgRGlzcGF0Y2ggdGVzdHMgLS0+Ci08czpzY2hlbWEgeG1sbnM6cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0JZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIAotCXRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3Rlc3QiPgotICA8czplbGVtZW50IG5hbWU9ImVjaG9TdHJpbmciPgotICAgIDxzOmNvbXBsZXhUeXBlPgotICAgICAgPHM6c2VxdWVuY2U+Ci0gICAgICAgIDxzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9ImlucHV0IiB0eXBlPSJzOnN0cmluZyIgLz4KLSAgICAgIDwvczpzZXF1ZW5jZT4KLSAgICA8L3M6Y29tcGxleFR5cGU+Ci0gIDwvczplbGVtZW50PgotICA8czplbGVtZW50IG5hbWU9ImVjaG9TdHJpbmdSZXNwb25zZSI+Ci0gICAgPHM6Y29tcGxleFR5cGU+Ci0gICAgICA8czpzZXF1ZW5jZT4KLSAgICAgICAgPHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0iZWNob1N0cmluZ1JldHVybiIgdHlwZT0iczpzdHJpbmciIC8+Ci0gICAgICA8L3M6c2VxdWVuY2U+Ci0gICAgPC9zOmNvbXBsZXhUeXBlPgotICA8L3M6ZWxlbWVudD4KLTwvczpzY2hlbWE+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMveHNkL3NhbXBsZW10b20ueHNkIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMveHNkL3NhbXBsZW10b20ueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGQ0MWMwLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3QtcmVzb3VyY2VzL3hzZC9zYW1wbGVtdG9tLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTx4czpzY2hlbWEgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0gICAgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgIHhtbG5zOnhtaW1lPSJodHRwOi8vd3d3LnczLm9yZy8yMDA1LzA1L3htbG1pbWUiCi0gICAgeG1sbnM6dG5zPSJ1cm46Ly9tdG9tLnRlc3Qub3JnIgotICAgIHRhcmdldE5hbWVzcGFjZT0idXJuOi8vbXRvbS50ZXN0Lm9yZyI+Ci0gICAgPCEtLSBVc2UgbG9jYWwgZmlsZSBmb3Igc3BlZWQgLS0+Ci0gICAgPCEtLSA8eHM6aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3d3dy53My5vcmcvMjAwNS8wNS94bWxtaW1lIgotICAgICAgICAgICAgICAgc2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDUveG1sbWltZSIvPi0tPgotICAgIDx4czppbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vd3d3LnczLm9yZy8yMDA1LzA1L3htbG1pbWUiCi0gICAgICAgICAgICAgICBzY2hlbWFMb2NhdGlvbj0ieG1sbWltZS54c2QiLz4KLSAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iSW1hZ2VEZXBvdCI+Ci0gICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJpbWFnZURhdGEiIAotICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4czpiYXNlNjRCaW5hcnkiCi0gICAgICAgICAgICAgICAgICAgICAgIHhtaW1lOmV4cGVjdGVkQ29udGVudFR5cGVzPSJtdWx0aXBhcnQvKiIvPgotICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAKLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJzZW5kSW1hZ2UiPgotICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9ImlucHV0IiB0eXBlPSJ0bnM6SW1hZ2VEZXBvdCIvPgotICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0ic2VuZEltYWdlUmVzcG9uc2UiPgotICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9Im91dHB1dCIgdHlwZT0idG5zOkltYWdlRGVwb3QiLz4KLSAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIAotICAgIDx4czplbGVtZW50IG5hbWU9InNlbmRUZXh0Ij4KLSAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgIDx4czplbGVtZW50IG5pbGxhYmxlPSJmYWxzZSIgbmFtZT0iaW5wdXQiIAotICAgICAgICAgICAgICAgIHR5cGU9InhzOmJhc2U2NEJpbmFyeSIgeG1pbWU6ZXhwZWN0ZWRDb250ZW50VHlwZT0idGV4dC94bWwiLz4KLSAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIAotICAgIDx4czplbGVtZW50IG5hbWU9InNlbmRUZXh0UmVzcG9uc2UiPgotICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9Im91dHB1dCIgdHlwZT0idG5zOkltYWdlRGVwb3QiLz4KLSAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotCi08L3hzOnNjaGVtYT4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3QtcmVzb3VyY2VzL3hzZC9zaGFwZS54c2QgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy94c2Qvc2hhcGUueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDkzMjQzLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3QtcmVzb3VyY2VzL3hzZC9zaGFwZS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTx4c2Q6c2NoZW1hIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0JCXhtbG5zOnRucz0iaHR0cDovL3NoYXBlLnRlc3Qub3JnIiAKLQkJeG1sbnM6amF4Yj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF4YiIgIGpheGI6dmVyc2lvbj0iMi4wIgotCQl0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9zaGFwZS50ZXN0Lm9yZyI+Ci0JCQotCQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlNoYXBlIiBhYnN0cmFjdD0idHJ1ZSI+Ci0JCQk8eHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJ4QXhpcyIgdHlwZT0ieHNkOmZsb2F0IiAvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJ5QXhpcyIgdHlwZT0ieHNkOmZsb2F0IiAvPgotCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCTwveHNkOmNvbXBsZXhUeXBlPgotCQkKLQkJPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJTcXVhcmUiID4KLQkJCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idG5zOlNoYXBlIj4KLQkJCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJsZW5ndGgiIHR5cGU9InhzZDppbnQiIC8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0id2lkdGgiIHR5cGU9InhzZDppbnQiIC8+Ci0JCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJCTwveHNkOmNvbXBsZXhDb250ZW50PgotCQk8L3hzZDpjb21wbGV4VHlwZT4KLQkJCi0JCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ2lyY2xlIiA+Ci0JCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InRuczpTaGFwZSI+Ci0JCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0icmFkaXVzIiB0eXBlPSJ4c2Q6aW50IiAvPgotCQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8L3hzZDpleHRlbnNpb24+Ci0JCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQkJPC94c2Q6Y29tcGxleFR5cGU+CQotCQkKLTwveHNkOnNjaGVtYT4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3QtcmVzb3VyY2VzL3hzZC9zaGFwZV93cmFwcGVycy54c2QgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy94c2Qvc2hhcGVfd3JhcHBlcnMueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWQwZjI5Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3QtcmVzb3VyY2VzL3hzZC9zaGFwZV93cmFwcGVycy54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTx4c2Q6c2NoZW1hIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0JCXhtbG5zOnRucz0iaHR0cDovL3dyYXBwZXIuc2hhcGUudGVzdC5vcmciIAotCQl4bWxuczp0bnMxPSJodHRwOi8vc2hhcGUudGVzdC5vcmciCi0JCXhtbG5zOmpheGI9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2pheGIiICBqYXhiOnZlcnNpb249IjIuMCIKLQkJdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3JhcHBlci5zaGFwZS50ZXN0Lm9yZyI+Ci0JCQotCQk8eHNkOmltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly9zaGFwZS50ZXN0Lm9yZyIKLQkJCSAgICBzY2hlbWFMb2NhdGlvbj0ic2hhcGUueHNkIiAvPgotCQkKLQkJPHhzZDplbGVtZW50IG5hbWU9ImRyYXczRCI+Ci0JCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJyZXF1ZXN0IiB0eXBlPSJ0bnMxOlNoYXBlIiAvPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JCTwveHNkOmVsZW1lbnQ+Ci0JCQotCQk8eHNkOmVsZW1lbnQgbmFtZT0iZHJhdyI+Ci0JCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJyZXF1ZXN0IiB0eXBlPSJ0bnMxOlNoYXBlIiAvPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JCTwveHNkOmVsZW1lbnQ+Ci0JCQotCQk8eHNkOmVsZW1lbnQgbmFtZT0iZHJhd1Jlc3BvbnNlIj4KLQkJCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9InJlc3BvbnNlIiB0eXBlPSJ0bnMxOlNoYXBlIiAvPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JCTwveHNkOmVsZW1lbnQ+Ci0JCQotPC94c2Q6c2NoZW1hPgkJCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy94c2Qvc3RvY2sxLnhzZCBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3QtcmVzb3VyY2VzL3hzZC9zdG9jazEueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWE0ODRlLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3QtcmVzb3VyY2VzL3hzZC9zdG9jazEueHNkCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08IS0tIFRoaXMgc2NoZW1hIGlzIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIEpBWC1CIGFydGlmYWN0cyBmb3IgdGhlIEpBWEJXcmFwcGVyVGVzdHMgLS0+Ci08czpzY2hlbWEgeG1sbnM6cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0JdGFyZ2V0TmFtZXNwYWNlPSJ1cm46Ly9zdG9jazEudGVzdC5vcmciCi0JeG1sbnM6dG5zPSJ1cm46Ly9zdG9jazEudGVzdC5vcmciID4KLQk8czplbGVtZW50IG5hbWU9ImdldFByaWNlIiB0eXBlPSJ0bnM6Z2V0UHJpY2UiIC8+Ci0JPHM6Y29tcGxleFR5cGUgbmFtZT0iZ2V0UHJpY2UiPgotICAgICAgPHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgIDxzOnJlc3RyaWN0aW9uIGJhc2U9InM6YW55VHlwZSI+Ci0gICAgICAgICAgPHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8czplbGVtZW50IG5hbWU9ImZ1bmQiIHR5cGU9InM6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8czplbGVtZW50IG5hbWU9ImhvbGRpbmdzLiIgdHlwZT0iczpzdHJpbmciLz4KLSAgICAgICAgICAgIDxzOmVsZW1lbnQgbmFtZT0ibmF2IiB0eXBlPSJzOnN0cmluZyIvPgotICAgICAgICAgIDwvczpzZXF1ZW5jZT4KLSAgICAgICAgPC9zOnJlc3RyaWN0aW9uPgotICAgICAgPC9zOmNvbXBsZXhDb250ZW50PgotICAgIDwvczpjb21wbGV4VHlwZT4KLSAgICAKLSAgICA8czplbGVtZW50IG5hbWU9ImdldFByaWNlUmVzcG9uc2UiIHR5cGU9InRuczpTdG9ja1ByaWNlIiAvPgotCTxzOmNvbXBsZXhUeXBlIG5hbWU9IlN0b2NrUHJpY2UiPgotICAgICAgPHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgIDxzOnJlc3RyaWN0aW9uIGJhc2U9InM6YW55VHlwZSI+Ci0gICAgICAgICAgPHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8czplbGVtZW50IG5hbWU9InByaWNlIiB0eXBlPSJzOnN0cmluZyIvPgotICAgICAgICAgIDwvczpzZXF1ZW5jZT4KLSAgICAgICAgPC9zOnJlc3RyaWN0aW9uPgotICAgICAgPC9zOmNvbXBsZXhDb250ZW50PgotICAgIDwvczpjb21wbGV4VHlwZT4KLTwvczpzY2hlbWE+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMveHNkL3N0b2NrMi54c2QgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy94c2Qvc3RvY2syLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ2OWIyOC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy94c2Qvc3RvY2syLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPCEtLSBUaGlzIHNjaGVtYSBpcyB1c2VkIHRvIGdlbmVyYXRlIHRoZSBKQVgtQiBhcnRpZmFjdHMgZm9yIHRoZSBKQVhCV3JhcHBlclRlc3RzLS0+Ci08czpzY2hlbWEgeG1sbnM6cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0JdGFyZ2V0TmFtZXNwYWNlPSJ1cm46Ly9zdG9jazIudGVzdC5vcmciCi0JeG1sbnM6dG5zPSJ1cm46Ly9zdG9jazIudGVzdC5vcmciID4KLQk8czplbGVtZW50IG5hbWU9ImdldFByaWNlIiB0eXBlPSJ0bnM6Z2V0UHJpY2UiIC8+Ci0JPHM6Y29tcGxleFR5cGUgbmFtZT0iZ2V0UHJpY2UiPgotICAgICAgPHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgIDxzOnJlc3RyaWN0aW9uIGJhc2U9InM6YW55VHlwZSI+Ci0gICAgICAgICAgPHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8czplbGVtZW50IG5hbWU9InN5bWJvbCIgdHlwZT0iczpzdHJpbmciLz4KLSAgICAgICAgICA8L3M6c2VxdWVuY2U+Ci0gICAgICAgIDwvczpyZXN0cmljdGlvbj4KLSAgICAgIDwvczpjb21wbGV4Q29udGVudD4KLSAgICA8L3M6Y29tcGxleFR5cGU+Ci0gICAgCi0gICAgPHM6ZWxlbWVudCBuYW1lPSJnZXRQcmljZVJlc3BvbnNlIiB0eXBlPSJ0bnM6U3RvY2tQcmljZSIvPgotCTxzOmNvbXBsZXhUeXBlIG5hbWU9IlN0b2NrUHJpY2UiPgotICAgICAgPHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgIDxzOnJlc3RyaWN0aW9uIGJhc2U9InM6YW55VHlwZSI+Ci0gICAgICAgICAgPHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8czplbGVtZW50IG5hbWU9InByaWNlIiB0eXBlPSJzOnN0cmluZyIvPgotICAgICAgICAgIDwvczpzZXF1ZW5jZT4KLSAgICAgICAgPC9zOnJlc3RyaWN0aW9uPgotICAgICAgPC9zOmNvbXBsZXhDb250ZW50PgotICAgIDwvczpjb21wbGV4VHlwZT4KLTwvczpzY2hlbWE+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMveHNkL3htbG1pbWUueHNkIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMveHNkL3htbG1pbWUueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmY5ZWRkLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3QtcmVzb3VyY2VzL3hzZC94bWxtaW1lLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgPz4KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPCEtLQotICAgVzNDIFhNTCBTY2hlbWEgZGVmaW5lZCBpbiB0aGUgRGVzY3JpYmluZyBNZWRpYSBDb250ZW50IG9mIEJpbmFyeSBEYXRhIGluIFhNTAotICAgc3BlY2lmaWNhdGlvbgotICAgICBodHRwOi8vd3d3LnczLm9yZy9UUi94bWwtbWVkaWEtdHlwZXMKLQotICAgQ29weXJpZ2h0IChDKSAyMDA1IFdvcmxkIFdpZGUgV2ViIENvbnNvcnRpdW0sCi0gIAotICAgKE1hc3NhY2h1c2V0dHMgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksIEV1cm9wZWFuIFJlc2VhcmNoIENvbnNvcnRpdW0gZm9yCi0gICBJbmZvcm1hdGljcyBhbmQgTWF0aGVtYXRpY3MsIEtlaW8gVW5pdmVyc2l0eSkuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIFRoaXMKLSAgIHdvcmsgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFczQyhSKSBTb2Z0d2FyZSBMaWNlbnNlIFsxXSBpbiB0aGUgaG9wZSB0aGF0Ci0gICBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKLSAgIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLSAgCi0gICBbMV0gaHR0cDovL3d3dy53My5vcmcvQ29uc29ydGl1bS9MZWdhbC8yMDAyL2NvcHlyaWdodC1zb2Z0d2FyZS0yMDAyMTIzMQotCi0gICAkSWQ6IHhtbG1pbWUueHNkLHYgMS4xIDIwMDUvMDQvMjUgMTc6MDg6MzUgaHVnbyBFeHAgJAotLS0+Ci08eHM6c2NoZW1hIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgICAgeG1sbnM6eG1pbWU9Imh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDUveG1sbWltZSIKLSAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3LnczLm9yZy8yMDA1LzA1L3htbG1pbWUiID4KLQotICA8eHM6YXR0cmlidXRlIG5hbWU9ImNvbnRlbnRUeXBlIj4KLSAgICA8eHM6c2ltcGxlVHlwZT4KLSAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciID4KLSAgICAgIDx4czptaW5MZW5ndGggdmFsdWU9IjMiIC8+Ci0gICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgPC94czphdHRyaWJ1dGU+Ci0KLSAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJleHBlY3RlZENvbnRlbnRUeXBlcyIgdHlwZT0ieHM6c3RyaW5nIiAvPgotCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJiYXNlNjRCaW5hcnkiID4KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpiYXNlNjRCaW5hcnkiID4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgcmVmPSJ4bWltZTpjb250ZW50VHlwZSIgLz4KLSAgICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJoZXhCaW5hcnkiID4KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpoZXhCaW5hcnkiID4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgcmVmPSJ4bWltZTpjb250ZW50VHlwZSIgLz4KLSAgICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi08L3hzOnNjaGVtYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1Y2FlNjEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjANCi1BbnQtVmVyc2lvbjogQXBhY2hlIEFudCAxLjYuNQ0KLUNyZWF0ZWQtQnk6IDIuMyAoSUJNIENvcnBvcmF0aW9uKQ0KLQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9NRVRBLUlORi9zZXJ2aWNlcy54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvTUVUQS1JTkYvc2VydmljZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjkyMzQ4Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9NRVRBLUlORi9zZXJ2aWNlcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzZXJ2aWNlR3JvdXA+Ci0gPHNlcnZpY2UgbmFtZT0iRWNob1NlcnZpY2UiPgotICA8bWVzc2FnZVJlY2VpdmVycz4KLSAgIDxtZXNzYWdlUmVjZWl2ZXIgbWVwPSJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaW4tb3V0IiBjbGFzcz0ic2VydmVyLkVjaG9TZXJ2aWNlTWVzc2FnZVJlY2VpdmVySW5PdXQiLz4KLSAgPC9tZXNzYWdlUmVjZWl2ZXJzPgotICA8cGFyYW1ldGVyIG5hbWU9IlNlcnZpY2VDbGFzcyI+c2VydmVyLkVjaG9TZXJ2aWNlU2tlbGV0b248L3BhcmFtZXRlcj4KLSAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvU3RyaW5nIiBtZXA9Imh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgvd3NkbC9pbi1vdXQiPgotICAgIDxhY3Rpb25NYXBwaW5nLz4KLSAgPC9vcGVyYXRpb24+Ci0gPC9zZXJ2aWNlPgotPC9zZXJ2aWNlR3JvdXA+Ci0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kYXRhc291cmNlL2pheGIvSkFYQkN1c3RvbUJ1aWxkZXJEaXNhYmxlU3RyZWFtaW5nVGVzdHMuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kYXRhc291cmNlL2pheGIvSkFYQkN1c3RvbUJ1aWxkZXJEaXNhYmxlU3RyZWFtaW5nVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RmMzkyZC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGF0YXNvdXJjZS9qYXhiL0pBWEJDdXN0b21CdWlsZGVyRGlzYWJsZVN0cmVhbWluZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICogDQotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKiAgICAgIA0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YXNvdXJjZS5qYXhiOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuQ29uc3RhbnRzOw0KLQ0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLk5hbWVzcGFjZUNvbnRleHQ7DQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uTG9jYXRpb247DQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQotDQotLyoqDQotICogVGVzdCB0aGF0IHRoZSBKQVhCIFBheWxvYWQgc3RyZWFtaW5nIGNhbiBiZSBkaXNhYmxlZC4gDQotICovDQotcHVibGljIGNsYXNzIEpBWEJDdXN0b21CdWlsZGVyRGlzYWJsZVN0cmVhbWluZ1Rlc3RzIGV4dGVuZHMgVGVzdENhc2Ugew0KLSAgICANCi0gICAgcHVibGljIHZvaWQgdGVzdERpc2FibGVKQVhCUGF5bG9hZFN0cmVhbWluZygpIHsNCi0gICAgICAgIA0KLSAgICAgICAgSkFYQkRTQ29udGV4dCBqYXhiRFNDID0gbmV3IEpBWEJEU0NvbnRleHQobnVsbCwgbnVsbCk7DQotICAgICAgICBKQVhCQ3VzdG9tQnVpbGRlciBqYXhiQ0IgPSBuZXcgSkFYQkN1c3RvbUJ1aWxkZXIoamF4YkRTQyk7DQotICAgICAgICBNZXNzYWdlQ29udGV4dCBtc2dDdHggPSBuZXcgTWVzc2FnZUNvbnRleHQoKTsNCi0gICAgICAgIC8vIERpc2FibGUgdGhlIEpBWEIgUGF5bG9hZCBzdHJlYW1pbmcNCi0gICAgICAgIG1zZ0N0eC5zZXRQcm9wZXJ0eShDb25zdGFudHMuSkFYV1NfRU5BQkxFX0pBWEJfUEFZTE9BRF9TVFJFQU1JTkcsIG5ldyBCb29sZWFuKGZhbHNlKSk7DQotICAgICAgICBqYXhiRFNDLnNldE1lc3NhZ2VDb250ZXh0KG1zZ0N0eCk7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIGFzc2VydE51bGwoamF4YkNCLmNyZWF0ZSgibnMiLCAibHAiLCBudWxsLCBuZXcgTW9ja1hNTFN0cmVhbVJlYWRlcigpLCBudWxsKSk7DQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIC8vIFNpbmNlIHdlIGRpZG4ndCBzZXQgdXAgdGhlIEpBWEJEU0NvbnRleHQgZnVsbHksIGlmIHRoZSBkaXNhYmxpbmcgb2YgaXQgZGlkbid0DQotICAgICAgICAgICAgLy8gd29yaywgdGhlbiB3ZSdsbCBnZXQgc29tZSBzb3J0IG9mIGV4Y2VwdGlvbi4NCi0gICAgICAgICAgICBmYWlsKCJKQVhCIFBheWxvYWQgc3RyZWFtaW5nIHdhcyBub3QgZGlzYWJsZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIHZvaWQgdGVzdERlZmF1bHRKQVhCUGF5bG9hZFN0cmVhbWluZygpIHsNCi0gICAgICAgIA0KLSAgICAgICAgSkFYQkRTQ29udGV4dCBqYXhiRFNDID0gbmV3IEpBWEJEU0NvbnRleHQobnVsbCwgbnVsbCk7DQotICAgICAgICBKQVhCQ3VzdG9tQnVpbGRlciBqYXhiQ0IgPSBuZXcgSkFYQkN1c3RvbUJ1aWxkZXIoamF4YkRTQyk7DQotICAgICAgICBNZXNzYWdlQ29udGV4dCBtc2dDdHggPSBuZXcgTWVzc2FnZUNvbnRleHQoKTsNCi0gICAgICAgIC8vIERvIE5PVCBEaXNhYmxlIHRoZSBKQVhCIFBheWxvYWQgc3RyZWFtaW5nOyB0aGUgZGVmYXVsdCBzaG91bGQgYmUgT04NCi0gICAgICAgIC8vIG1zZ0N0eC5zZXRQcm9wZXJ0eShDb25zdGFudHMuSkFYV1NfRU5BQkxFX0pBWEJfUEFZTE9BRF9TVFJFQU1JTkcsIG5ldyBCb29sZWFuKGZhbHNlKSk7DQotICAgICAgICBqYXhiRFNDLnNldE1lc3NhZ2VDb250ZXh0KG1zZ0N0eCk7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIGpheGJDQi5jcmVhdGUoIm5zIiwgImxwIiwgbnVsbCwgbmV3IE1vY2tYTUxTdHJlYW1SZWFkZXIoKSwgbnVsbCk7DQotICAgICAgICAgICAgZmFpbCgiSkFYQiBQYXlsb2FkIHN0cmVhbWluZyBkZWZhdWx0IHdhcyBub3QgZW5hYmxlZCIpOw0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICAvLyBFeHBlY3RlZCBjb2RlIHBhdGgNCi0gICAgICAgICAgICAvLyBTaW5jZSB3ZSBkaWRuJ3Qgc2V0IHVwIHRoZSBKQVhCRFNDb250ZXh0IGZ1bGx5LCBpZiB0aGUgZGlzYWJsaW5nIG9mIGl0IGRpZG4ndA0KLSAgICAgICAgICAgIC8vIHdvcmssIHRoZW4gd2UnbGwgZ2V0IHNvbWUgc29ydCBvZiBleGNlcHRpb24uDQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgDQotICAgIGNsYXNzIE1vY2tYTUxTdHJlYW1SZWFkZXIgaW1wbGVtZW50cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciB7DQotDQotICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gew0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIGludCBnZXRBdHRyaWJ1dGVDb3VudCgpIHsNCi0gICAgICAgICAgICByZXR1cm4gMDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlTG9jYWxOYW1lKGludCBpKSB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgUU5hbWUgZ2V0QXR0cmlidXRlTmFtZShpbnQgaSkgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVOYW1lc3BhY2UoaW50IGkpIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlUHJlZml4KGludCBpKSB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZVR5cGUoaW50IGkpIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlVmFsdWUoaW50IGkpIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlVmFsdWUoU3RyaW5nIHMsIFN0cmluZyBzMSkgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRDaGFyYWN0ZXJFbmNvZGluZ1NjaGVtZSgpIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudFRleHQoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RW5jb2RpbmcoKSB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgaW50IGdldEV2ZW50VHlwZSgpIHsNCi0gICAgICAgICAgICByZXR1cm4gMDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxOYW1lKCkgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIExvY2F0aW9uIGdldExvY2F0aW9uKCkgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIFFOYW1lIGdldE5hbWUoKSB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgTmFtZXNwYWNlQ29udGV4dCBnZXROYW1lc3BhY2VDb250ZXh0KCkgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIGludCBnZXROYW1lc3BhY2VDb3VudCgpIHsNCi0gICAgICAgICAgICByZXR1cm4gMDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlUHJlZml4KGludCBpKSB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVVSSSgpIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKGludCBpKSB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVVSSShTdHJpbmcgcykgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRQSURhdGEoKSB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFBJVGFyZ2V0KCkgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRQcmVmaXgoKSB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBzKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyBjaGFyW10gZ2V0VGV4dENoYXJhY3RlcnMoKSB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgaW50IGdldFRleHRDaGFyYWN0ZXJzKGludCBpLCBjaGFyW10gYWMsIGludCBqLCBpbnQgaykgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7DQotICAgICAgICAgICAgcmV0dXJuIDA7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgaW50IGdldFRleHRMZW5ndGgoKSB7DQotICAgICAgICAgICAgcmV0dXJuIDA7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgaW50IGdldFRleHRTdGFydCgpIHsNCi0gICAgICAgICAgICByZXR1cm4gMDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGhhc05hbWUoKSB7DQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gew0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGhhc1RleHQoKSB7DQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNBdHRyaWJ1dGVTcGVjaWZpZWQoaW50IGkpIHsNCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0NoYXJhY3RlcnMoKSB7DQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNFbmRFbGVtZW50KCkgew0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzU3RhbmRhbG9uZSgpIHsNCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1N0YXJ0RWxlbWVudCgpIHsNCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1doaXRlU3BhY2UoKSB7DQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIGludCBuZXh0KCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7DQotICAgICAgICAgICAgcmV0dXJuIDA7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgaW50IG5leHRUYWcoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsNCi0gICAgICAgICAgICByZXR1cm4gMDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlcXVpcmUoaW50IGksIFN0cmluZyBzLCBTdHJpbmcgczEpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gew0KLSAgICAgICAgICAgIA0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gc3RhbmRhbG9uZVNldCgpIHsNCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvYWRkcmVzc2luZy9Qcm94eUFjdGlvblRlc3RzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvYWRkcmVzc2luZy9Qcm94eUFjdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxNWQwMDUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2FkZHJlc3NpbmcvUHJveHlBY3Rpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5hZGRyZXNzaW5nOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY2xpZW50LkludGVyY2VwdGFibGVDbGllbnRUZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNsaWVudC5UZXN0Q2xpZW50SW52b2NhdGlvbkNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLkludm9jYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLk9wZXJhdGlvbkRlc2NyaXB0aW9uOwotCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwud3MuQWN0aW9uOwotaW1wb3J0IGphdmF4LnhtbC53cy5GYXVsdEFjdGlvbjsKLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViRmF1bHQ7Ci0KLS8qKgotICogVGhpcyBzdWl0ZSBvZiB0ZXN0cyBpcyBmb3IgdGhlIEFjdGlvbiBhbm5vdGF0aW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm94eUFjdGlvblRlc3RzIGV4dGVuZHMgSW50ZXJjZXB0YWJsZUNsaWVudFRlc3RDYXNlIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgbnMgPSAiaHR0cDovL2pheHdzLmF4aXMyLmFwYWNoZS5vcmcvbWV0YWRhdGEvYWRkcmVzc2luZy9hY3Rpb24iOwotICAgIAotICAgIC8qCi0gICAgICogTWFrZSBzdXJlIFdTLUFkZHJlc3NpbmcgRGVmYXVsdCBBY3Rpb24gUGF0dGVybiBpcyB1c2VkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3ROb0FjdGlvbkFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU2VydmljZSBzdmMgPSBTZXJ2aWNlLmNyZWF0ZShuZXcgUU5hbWUoImh0dHA6Ly90ZXN0IiwgIlByb3h5QWRkcmVzc2luZ1NlcnZpY2UiKSk7Ci0gICAgICAgIFByb3h5QWRkcmVzc2luZ1NlcnZpY2UgcHJveHkgPSBzdmMuZ2V0UG9ydChQcm94eUFkZHJlc3NpbmdTZXJ2aWNlLmNsYXNzKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChwcm94eSk7Ci0gICAgICAgIAotICAgICAgICBwcm94eS5kb1NvbWV0aGluZygiMTIzNDUiKTsKLSAgICAgICAgCi0gICAgICAgIFRlc3RDbGllbnRJbnZvY2F0aW9uQ29udHJvbGxlciB0ZXN0Q29udHJvbGxlciA9IGdldEludm9jYXRpb25Db250cm9sbGVyKCk7Ci0gICAgICAgIEludm9jYXRpb25Db250ZXh0IGljID0gdGVzdENvbnRyb2xsZXIuZ2V0SW52b2NhdGlvbkNvbnRleHQoKTsKLSAgICAgICAgTWVzc2FnZUNvbnRleHQgcmVxdWVzdCA9IGljLmdldFJlcXVlc3RNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICAKLSAgICAgICAgT3BlcmF0aW9uRGVzY3JpcHRpb24gb2QgPSByZXF1ZXN0LmdldE9wZXJhdGlvbkRlc2NyaXB0aW9uKCk7Ci0gICAgICAgIEF4aXNPcGVyYXRpb24gYXhpc09wZXJhdGlvbiA9IChBeGlzT3BlcmF0aW9uKSBvZC5nZXRBeGlzT3BlcmF0aW9uKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiaHR0cDovL2pheHdzLmF4aXMyLmFwYWNoZS5vcmcvbWV0YWRhdGEvYWRkcmVzc2luZy9hY3Rpb24vU2VydmljZTEvZG9Tb21ldGhpbmdSZXF1ZXN0IiwgYXhpc09wZXJhdGlvbi5nZXRPdXRwdXRBY3Rpb24oKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiaHR0cDovL2pheHdzLmF4aXMyLmFwYWNoZS5vcmcvbWV0YWRhdGEvYWRkcmVzc2luZy9hY3Rpb24vU2VydmljZTEvZG9Tb21ldGhpbmdSZXNwb25zZSIsIGF4aXNPcGVyYXRpb24uZ2V0SW5wdXRBY3Rpb24oKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiaHR0cDovL2pheHdzLmF4aXMyLmFwYWNoZS5vcmcvbWV0YWRhdGEvYWRkcmVzc2luZy9hY3Rpb24vU2VydmljZTEvZG9Tb21ldGhpbmcvRmF1bHQvVGVzdEV4Y2VwdGlvbiIsIGF4aXNPcGVyYXRpb24uZ2V0RmF1bHRBY3Rpb24oKSk7Ci0gICAgfQotICAgIAotICAgIC8qCi0gICAgICogVGVzdCB0aGUgdXNlIG9mIHRoZSBBY3Rpb24gYW5ub3RhdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QWN0aW9uQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTZXJ2aWNlIHN2YyA9IFNlcnZpY2UuY3JlYXRlKG5ldyBRTmFtZSgiaHR0cDovL3Rlc3QiLCAiUHJveHlBZGRyZXNzaW5nU2VydmljZSIpKTsKLSAgICAgICAgUHJveHlBZGRyZXNzaW5nU2VydmljZVdpdGhBY3Rpb24gcHJveHkgPSBzdmMuZ2V0UG9ydChQcm94eUFkZHJlc3NpbmdTZXJ2aWNlV2l0aEFjdGlvbi5jbGFzcyk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocHJveHkpOwotICAgICAgICAKLSAgICAgICAgcHJveHkuZG9Tb21ldGhpbmcoIjEyMzQ1Iik7Ci0gICAgICAgIAotICAgICAgICBUZXN0Q2xpZW50SW52b2NhdGlvbkNvbnRyb2xsZXIgdGVzdENvbnRyb2xsZXIgPSBnZXRJbnZvY2F0aW9uQ29udHJvbGxlcigpOwotICAgICAgICBJbnZvY2F0aW9uQ29udGV4dCBpYyA9IHRlc3RDb250cm9sbGVyLmdldEludm9jYXRpb25Db250ZXh0KCk7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IHJlcXVlc3QgPSBpYy5nZXRSZXF1ZXN0TWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgCi0gICAgICAgIE9wZXJhdGlvbkRlc2NyaXB0aW9uIG9kID0gcmVxdWVzdC5nZXRPcGVyYXRpb25EZXNjcmlwdGlvbigpOwotICAgICAgICBBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb24gPSAoQXhpc09wZXJhdGlvbikgb2QuZ2V0QXhpc09wZXJhdGlvbigpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly90ZXN0L2lucHV0IiwgYXhpc09wZXJhdGlvbi5nZXRPdXRwdXRBY3Rpb24oKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiaHR0cDovL3Rlc3Qvb3V0cHV0IiwgYXhpc09wZXJhdGlvbi5nZXRJbnB1dEFjdGlvbigpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJodHRwOi8vdGVzdC9mYXVsdCIsIGF4aXNPcGVyYXRpb24uZ2V0RmF1bHRBY3Rpb24oKSk7Ci0gICAgfQotICAgIAotICAgIEBXZWJTZXJ2aWNlKG5hbWU9IlNlcnZpY2UxIiwgdGFyZ2V0TmFtZXNwYWNlPW5zKQotICAgIGludGVyZmFjZSBQcm94eUFkZHJlc3NpbmdTZXJ2aWNlIHsKLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZG9Tb21ldGhpbmcoU3RyaW5nIGlkKSB0aHJvd3MgVGVzdEV4Y2VwdGlvbjsKLSAgICAgICAgCi0gICAgfQotICAgIAotICAgIEBXZWJTZXJ2aWNlKG5hbWU9IlNlcnZpY2UyIiwgdGFyZ2V0TmFtZXNwYWNlPW5zKQotICAgIGludGVyZmFjZSBQcm94eUFkZHJlc3NpbmdTZXJ2aWNlV2l0aEFjdGlvbiB7Ci0gICAgICAgIAotICAgICAgICBAQWN0aW9uKGlucHV0PSJodHRwOi8vdGVzdC9pbnB1dCIsIG91dHB1dD0iaHR0cDovL3Rlc3Qvb3V0cHV0IiwKLSAgICAgICAgICAgICAgICBmYXVsdD17IEBGYXVsdEFjdGlvbihjbGFzc05hbWU9VGVzdEV4Y2VwdGlvbi5jbGFzcywgdmFsdWU9Imh0dHA6Ly90ZXN0L2ZhdWx0IikgfSkgICAgCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZG9Tb21ldGhpbmcoU3RyaW5nIGlkKSB0aHJvd3MgVGVzdEV4Y2VwdGlvbjsKLSAgICAgICAgCi0gICAgfQotICAgIAotICAgIEBXZWJGYXVsdChuYW1lPSJUZXN0RXhjZXB0aW9uIiwgdGFyZ2V0TmFtZXNwYWNlPW5zKQotICAgIGNsYXNzIFRlc3RFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9hZGRyZXNzaW5nL3V0aWwvRW5kcG9pbnRSZWZlcmVuY2VVdGlsc1Rlc3RzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvYWRkcmVzc2luZy91dGlsL0VuZHBvaW50UmVmZXJlbmNlVXRpbHNUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNGJjODg5Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9hZGRyZXNzaW5nL3V0aWwvRW5kcG9pbnRSZWZlcmVuY2VVdGlsc1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5hZGRyZXNzaW5nLnV0aWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmJ1aWxkZXIuU3RBWE9NQnVpbGRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkFkZHJlc3NpbmdDb25zdGFudHMuRmluYWw7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5BZGRyZXNzaW5nQ29uc3RhbnRzLlN1Ym1pc3Npb247DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlSGVscGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmFkZHJlc3NpbmcuU3VibWlzc2lvbkVuZHBvaW50UmVmZXJlbmNlOw0KLWltcG9ydCBvcmcuY3VzdG9tbW9ua2V5LnhtbHVuaXQuWE1MVGVzdENhc2U7DQotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50Ow0KLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsNCi0NCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOw0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5Ow0KLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTElucHV0RmFjdG9yeTsNCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7DQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOw0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLmRvbS5ET01Tb3VyY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy53c2FkZHJlc3NpbmcuVzNDRW5kcG9pbnRSZWZlcmVuY2U7DQotaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOw0KLQ0KLS8qKg0KLSAqIFRoaXMgY2xhc3MgdGVzdHMgdGhlIGVucG9pbnQgcmVmZXJlbmNlIGNsYXNzZXMgdXNlZCBpbiB0aGUgSkFYLVdTIDIuMSBBUEkuDQotICovDQotcHVibGljIGNsYXNzIEVuZHBvaW50UmVmZXJlbmNlVXRpbHNUZXN0cyBleHRlbmRzIFhNTFRlc3RDYXNlIHsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgT01GYWN0b3J5IE9NRiA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBRTmFtZSBFTEVNRU5UMjAwNTA4ID0NCi0gICAgICAgIG5ldyBRTmFtZShGaW5hbC5XU0FfTkFNRVNQQUNFLCAiRW5kcG9pbnRSZWZlcmVuY2UiLCAid3NhIik7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFFOYW1lIEVMRU1FTlQyMDA0MDggPQ0KLSAgICAgICAgbmV3IFFOYW1lKFN1Ym1pc3Npb24uV1NBX05BTUVTUEFDRSwgIkVuZHBvaW50UmVmZXJlbmNlIiwgIndzYSIpOw0KLSAgICANCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVQUjIwMDUwOCA9DQotICAgICI8d3NhOkVuZHBvaW50UmVmZXJlbmNlIHhtbG5zOmF4aXMyPVwiaHR0cDovL3dzLmFwYWNoZS5vcmcvbmFtZXNwYWNlcy9heGlzMlwiIHhtbG5zOndzYT1cImh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDgvYWRkcmVzc2luZ1wiIGF4aXMyOkF0dHJFeHQ9XCIxMjM0NTY3ODlcIj4iKw0KLSAgICAgICAgIjx3c2E6QWRkcmVzcz5odHRwOi8vd3d3LnczLm9yZy8yMDA1LzA4L2FkZHJlc3NpbmcvYW5vbnltb3VzPC93c2E6QWRkcmVzcz4iKw0KLSAgICAgICAgIjx3c2E6UmVmZXJlbmNlUGFyYW1ldGVycyB4bWxuczpmYWJyaWthbT1cImh0dHA6Ly9leGFtcGxlLmNvbS9mYWJyaWthbVwiPiIrDQotICAgICAgICAgICAgIjxmYWJyaWthbTpDdXN0b21lcktleT4xMjM0NTY3ODk8L2ZhYnJpa2FtOkN1c3RvbWVyS2V5PiIrDQotICAgICAgICAgICAgIjxmYWJyaWthbTpTaG9wcGluZ0NhcnQ+QUJDREVGRzwvZmFicmlrYW06U2hvcHBpbmdDYXJ0PiIrDQotICAgICAgICAiPC93c2E6UmVmZXJlbmNlUGFyYW1ldGVycz4iKw0KLSAgICAgICAgIjx3c2E6TWV0YWRhdGE+IisNCi0gICAgICAgICAgICAiPGF4aXMyOk1ldGFFeHQgYXhpczI6QXR0ckV4dD1cIjEyMzQ1Njc4OVwiPjEyMzQ1Njc4OTwvYXhpczI6TWV0YUV4dD4iKw0KLSAgICAgICAgIjwvd3NhOk1ldGFkYXRhPiIrDQotICAgICAgICAiPGF4aXMyOkVQUkV4dCBheGlzMjpBdHRyRXh0PVwiMTIzNDU2Nzg5XCI+MTIzNDU2Nzg5PC9heGlzMjpFUFJFeHQ+IisNCi0gICAgIjwvd3NhOkVuZHBvaW50UmVmZXJlbmNlPiI7DQotICAgIA0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVBSMjAwNDA4ID0NCi0gICAgIjx3c2E6RW5kcG9pbnRSZWZlcmVuY2UgeG1sbnM6YXhpczI9XCJodHRwOi8vd3MuYXBhY2hlLm9yZy9uYW1lc3BhY2VzL2F4aXMyXCIgeG1sbnM6d3NhPVwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOC9hZGRyZXNzaW5nXCIgYXhpczI6QXR0ckV4dD1cIjEyMzQ1Njc4OVwiPiIrDQotICAgICAgICAiPHdzYTpBZGRyZXNzPmh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDgvYWRkcmVzc2luZy9hbm9ueW1vdXM8L3dzYTpBZGRyZXNzPiIrDQotICAgICAgICAiPHdzYTpSZWZlcmVuY2VQYXJhbWV0ZXJzIHhtbG5zOmZhYnJpa2FtPVwiaHR0cDovL2V4YW1wbGUuY29tL2ZhYnJpa2FtXCI+IisNCi0gICAgICAgICAgICAiPGZhYnJpa2FtOkN1c3RvbWVyS2V5PjEyMzQ1Njc4OTwvZmFicmlrYW06Q3VzdG9tZXJLZXk+IisNCi0gICAgICAgICAgICAiPGZhYnJpa2FtOlNob3BwaW5nQ2FydD5BQkNERUZHPC9mYWJyaWthbTpTaG9wcGluZ0NhcnQ+IisNCi0gICAgICAgICI8L3dzYTpSZWZlcmVuY2VQYXJhbWV0ZXJzPiIrDQotICAgICAgICAiPHdzYTpQb3J0VHlwZT5heGlzMjpKYW5lPC93c2E6UG9ydFR5cGU+IisNCi0gICAgICAgICI8d3NhOlNlcnZpY2VOYW1lIFBvcnROYW1lPVwiRnJlZFwiPmF4aXMyOkpvaG48L3dzYTpTZXJ2aWNlTmFtZT4iKw0KLSAgICAgICAgIjxheGlzMjpFUFJFeHQgYXhpczI6QXR0ckV4dD1cIjEyMzQ1Njc4OVwiPjEyMzQ1Njc4OTwvYXhpczI6RVBSRXh0PiIrDQotICAgICI8L3dzYTpFbmRwb2ludFJlZmVyZW5jZT4iOw0KLSAgICANCi0gICAgcHVibGljIEVuZHBvaW50UmVmZXJlbmNlVXRpbHNUZXN0cyhTdHJpbmcgbmFtZSkgew0KLSAgICAgICAgc3VwZXIobmFtZSk7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHRlc3QyMDA1MDhDb252ZXJzaW9uU3RhcnRpbmdGcm9tQXhpczIoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlciBwYXJzZXIgPQ0KLSAgICAgICAgICAgIFhNTElucHV0RmFjdG9yeS5uZXdJbnN0YW5jZSgpLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKEVQUjIwMDUwOCkpOw0KLSAgICAgICAgU3RBWE9NQnVpbGRlciBidWlsZGVyID0gbmV3IFN0QVhPTUJ1aWxkZXIocGFyc2VyKTsNCi0gICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSBidWlsZGVyLmdldERvY3VtZW50RWxlbWVudCgpOw0KLSAgICAgICAgDQotICAgICAgICBFbmRwb2ludFJlZmVyZW5jZSBheGlzMkVQUiA9DQotICAgICAgICAgICAgRW5kcG9pbnRSZWZlcmVuY2VIZWxwZXIuZnJvbU9NKG9tRWxlbWVudCk7DQotICAgICAgICBXM0NFbmRwb2ludFJlZmVyZW5jZSBqYXh3c0VQUiA9DQotICAgICAgICAgICAgKFczQ0VuZHBvaW50UmVmZXJlbmNlKSBFbmRwb2ludFJlZmVyZW5jZVV0aWxzLmNvbnZlcnRGcm9tQXhpczIoYXhpczJFUFIsIEZpbmFsLldTQV9OQU1FU1BBQ0UpOw0KLSAgICAgICAgYXNzZXJ0WE1MRXF1YWwoRVBSMjAwNTA4LCBqYXh3c0VQUi50b1N0cmluZygpKTsNCi0gICAgIA0KLSAgICAgICAgRW5kcG9pbnRSZWZlcmVuY2UgYXhpczJSZXN1bHQgPQ0KLSAgICAgICAgICAgIEVuZHBvaW50UmVmZXJlbmNlVXRpbHMuY3JlYXRlQXhpczJFbmRwb2ludFJlZmVyZW5jZSgiIik7DQotICAgICAgICBTdHJpbmcgYWRkcmVzc2luZ05hbWVzcGFjZSA9IEVuZHBvaW50UmVmZXJlbmNlVXRpbHMuY29udmVydFRvQXhpczIoYXhpczJSZXN1bHQsIGpheHdzRVBSKTsNCi0gICAgICAgIE9NRWxlbWVudCBlcHJFbGVtZW50ID0NCi0gICAgICAgICAgICBFbmRwb2ludFJlZmVyZW5jZUhlbHBlci50b09NKE9NRiwgYXhpczJSZXN1bHQsIEVMRU1FTlQyMDA1MDgsIGFkZHJlc3NpbmdOYW1lc3BhY2UpOw0KLSAgICAgICAgYXNzZXJ0WE1MRXF1YWwoRVBSMjAwNTA4LCBlcHJFbGVtZW50LnRvU3RyaW5nKCkpOw0KLSAgICB9DQotICAgIA0KLS8vIEZJWE1FOiBCcmVha3MgaW4gSkRLMS42IGFzIGl0IHBpY2tzIHVwIFczQ0VuZHBvaW50UmVmZXJlbmNlIGNsYXNzIGZyb20gdGhlIEpESyAgICANCi0vLyAgICBwdWJsaWMgdm9pZCB0ZXN0MjAwNTA4Q29udmVyc2lvblN0YXJ0aW5nRnJvbUpBWFdTKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotLy8gICAgICAgIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZGJmYWMgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7DQotLy8gICAgICAgIGRiZmFjLnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOw0KLS8vICAgICAgICBEb2N1bWVudEJ1aWxkZXIgZG9jQnVpbGRlciA9IGRiZmFjLm5ld0RvY3VtZW50QnVpbGRlcigpOw0KLS8vICAgICAgICBEb2N1bWVudCBqYXh3c0RvYyA9IGRvY0J1aWxkZXIucGFyc2UobmV3IElucHV0U291cmNlKG5ldyBTdHJpbmdSZWFkZXIoRVBSMjAwNTA4KSkpOw0KLS8vICAgICAgICBTb3VyY2Ugc291cmNlID0gbmV3IERPTVNvdXJjZShqYXh3c0RvYyk7DQotLy8gICAgICAgIA0KLS8vICAgICAgICBXM0NFbmRwb2ludFJlZmVyZW5jZSBqYXh3c0VQUiA9IG5ldyBXM0NFbmRwb2ludFJlZmVyZW5jZShzb3VyY2UpOw0KLS8vICAgICAgICBFbmRwb2ludFJlZmVyZW5jZSBheGlzMkVQUiA9DQotLy8gICAgICAgICAgICBFbmRwb2ludFJlZmVyZW5jZVV0aWxzLmNyZWF0ZUF4aXMyRW5kcG9pbnRSZWZlcmVuY2UoIiIpOw0KLS8vICAgICAgICBTdHJpbmcgYWRkcmVzc2luZ05hbWVzcGFjZSA9IEVuZHBvaW50UmVmZXJlbmNlVXRpbHMuY29udmVydFRvQXhpczIoYXhpczJFUFIsIGpheHdzRVBSKTsNCi0vLyAgICAgICAgT01FbGVtZW50IGVwckVsZW1lbnQgPQ0KLS8vICAgICAgICAgICAgRW5kcG9pbnRSZWZlcmVuY2VIZWxwZXIudG9PTShPTUYsIGF4aXMyRVBSLCBFTEVNRU5UMjAwNTA4LCBhZGRyZXNzaW5nTmFtZXNwYWNlKTsNCi0vLyAgICAgICAgYXNzZXJ0WE1MRXF1YWwoRVBSMjAwNTA4LCBlcHJFbGVtZW50LnRvU3RyaW5nKCkpOw0KLS8vDQotLy8gICAgICAgIFczQ0VuZHBvaW50UmVmZXJlbmNlIGpheHdzUmVzdWx0ID0NCi0vLyAgICAgICAgICAgIChXM0NFbmRwb2ludFJlZmVyZW5jZSkgRW5kcG9pbnRSZWZlcmVuY2VVdGlscy5jb252ZXJ0RnJvbUF4aXMyKGF4aXMyRVBSLCBGaW5hbC5XU0FfTkFNRVNQQUNFKTsNCi0vLyAgICAgICAgYXNzZXJ0WE1MRXF1YWwoRVBSMjAwNTA4LCBqYXh3c1Jlc3VsdC50b1N0cmluZygpKTsNCi0vLyAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0MjAwNDA4Q29udmVyc2lvblN0YXJ0aW5nRnJvbUF4aXMyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgcGFyc2VyID0NCi0gICAgICAgICAgICBYTUxJbnB1dEZhY3RvcnkubmV3SW5zdGFuY2UoKS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IFN0cmluZ1JlYWRlcihFUFIyMDA0MDgpKTsNCi0gICAgICAgIFN0QVhPTUJ1aWxkZXIgYnVpbGRlciA9IG5ldyBTdEFYT01CdWlsZGVyKHBhcnNlcik7DQotICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gYnVpbGRlci5nZXREb2N1bWVudEVsZW1lbnQoKTsNCi0gICAgICAgIA0KLSAgICAgICAgRW5kcG9pbnRSZWZlcmVuY2UgYXhpczJFUFIgPQ0KLSAgICAgICAgICAgIEVuZHBvaW50UmVmZXJlbmNlSGVscGVyLmZyb21PTShvbUVsZW1lbnQpOw0KLSAgICAgICAgU3VibWlzc2lvbkVuZHBvaW50UmVmZXJlbmNlIGpheHdzRVBSID0NCi0gICAgICAgICAgICAoU3VibWlzc2lvbkVuZHBvaW50UmVmZXJlbmNlKSBFbmRwb2ludFJlZmVyZW5jZVV0aWxzLmNvbnZlcnRGcm9tQXhpczIoYXhpczJFUFIsIFN1Ym1pc3Npb24uV1NBX05BTUVTUEFDRSk7DQotICAgICAgICBhc3NlcnRYTUxFcXVhbChFUFIyMDA0MDgsIGpheHdzRVBSLnRvU3RyaW5nKCkpOw0KLSAgICAgDQotICAgICAgICBFbmRwb2ludFJlZmVyZW5jZSBheGlzMlJlc3VsdCA9DQotICAgICAgICAgICAgRW5kcG9pbnRSZWZlcmVuY2VVdGlscy5jcmVhdGVBeGlzMkVuZHBvaW50UmVmZXJlbmNlKCIiKTsNCi0gICAgICAgIFN0cmluZyBhZGRyZXNzaW5nTmFtZXNwYWNlID0gRW5kcG9pbnRSZWZlcmVuY2VVdGlscy5jb252ZXJ0VG9BeGlzMihheGlzMlJlc3VsdCwgamF4d3NFUFIpOw0KLSAgICAgICAgT01FbGVtZW50IGVwckVsZW1lbnQgPQ0KLSAgICAgICAgICAgIEVuZHBvaW50UmVmZXJlbmNlSGVscGVyLnRvT00oT01GLCBheGlzMlJlc3VsdCwgRUxFTUVOVDIwMDQwOCwgYWRkcmVzc2luZ05hbWVzcGFjZSk7DQotICAgICAgICBhc3NlcnRYTUxFcXVhbChFUFIyMDA0MDgsIGVwckVsZW1lbnQudG9TdHJpbmcoKSk7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHRlc3QyMDA0MDhDb252ZXJzaW9uU3RhcnRpbmdGcm9tSkFYV1MoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZGJmYWMgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7DQotICAgICAgICBkYmZhYy5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsNCi0gICAgICAgIERvY3VtZW50QnVpbGRlciBkb2NCdWlsZGVyID0gZGJmYWMubmV3RG9jdW1lbnRCdWlsZGVyKCk7DQotICAgICAgICBEb2N1bWVudCBqYXh3c0RvYyA9IGRvY0J1aWxkZXIucGFyc2UobmV3IElucHV0U291cmNlKG5ldyBTdHJpbmdSZWFkZXIoRVBSMjAwNDA4KSkpOw0KLSAgICAgICAgU291cmNlIHNvdXJjZSA9IG5ldyBET01Tb3VyY2UoamF4d3NEb2MpOw0KLSAgICAgICAgDQotICAgICAgICBTdWJtaXNzaW9uRW5kcG9pbnRSZWZlcmVuY2UgamF4d3NFUFIgPSBuZXcgU3VibWlzc2lvbkVuZHBvaW50UmVmZXJlbmNlKHNvdXJjZSk7DQotICAgICAgICBFbmRwb2ludFJlZmVyZW5jZSBheGlzMkVQUiA9DQotICAgICAgICAgICAgRW5kcG9pbnRSZWZlcmVuY2VVdGlscy5jcmVhdGVBeGlzMkVuZHBvaW50UmVmZXJlbmNlKCIiKTsNCi0gICAgICAgIFN0cmluZyBhZGRyZXNzaW5nTmFtZXNwYWNlID0gRW5kcG9pbnRSZWZlcmVuY2VVdGlscy5jb252ZXJ0VG9BeGlzMihheGlzMkVQUiwgamF4d3NFUFIpOw0KLSAgICAgICAgT01FbGVtZW50IGVwckVsZW1lbnQgPQ0KLSAgICAgICAgICAgIEVuZHBvaW50UmVmZXJlbmNlSGVscGVyLnRvT00oT01GLCBheGlzMkVQUiwgRUxFTUVOVDIwMDQwOCwgYWRkcmVzc2luZ05hbWVzcGFjZSk7DQotICAgICAgICBhc3NlcnRYTUxFcXVhbChFUFIyMDA0MDgsIGVwckVsZW1lbnQudG9TdHJpbmcoKSk7DQotDQotICAgICAgICBTdWJtaXNzaW9uRW5kcG9pbnRSZWZlcmVuY2UgamF4d3NSZXN1bHQgPQ0KLSAgICAgICAgICAgIChTdWJtaXNzaW9uRW5kcG9pbnRSZWZlcmVuY2UpIEVuZHBvaW50UmVmZXJlbmNlVXRpbHMuY29udmVydEZyb21BeGlzMihheGlzMkVQUiwgU3VibWlzc2lvbi5XU0FfTkFNRVNQQUNFKTsNCi0gICAgICAgIGFzc2VydFhNTEVxdWFsKEVQUjIwMDQwOCwgamF4d3NSZXN1bHQudG9TdHJpbmcoKSk7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHRlc3RGYWlsdXJlcygpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBFbmRwb2ludFJlZmVyZW5jZVV0aWxzLmNvbnZlcnRGcm9tQXhpczIoKEVuZHBvaW50UmVmZXJlbmNlKSBudWxsLCBGaW5hbC5XU0FfTkFNRVNQQUNFKTsNCi0gICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBhIGZhaWx1cmUuIik7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICAvL3Bhc3MNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgRW5kcG9pbnRSZWZlcmVuY2VVdGlscy5jb252ZXJ0RnJvbUF4aXMyKChFbmRwb2ludFJlZmVyZW5jZSkgbnVsbCwgU3VibWlzc2lvbi5XU0FfTkFNRVNQQUNFKTsNCi0gICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBhIGZhaWx1cmUuIik7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICAvL3Bhc3MNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgRW5kcG9pbnRSZWZlcmVuY2VVdGlscy5jb252ZXJ0RnJvbUF4aXMyKChFbmRwb2ludFJlZmVyZW5jZSkgbnVsbCwgbnVsbCk7DQotICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgYSBmYWlsdXJlLiIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgLy9wYXNzDQotICAgICAgICB9DQotDQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIEVuZHBvaW50UmVmZXJlbmNlIGF4aXMyRVBSID0NCi0gICAgICAgICAgICAgICAgRW5kcG9pbnRSZWZlcmVuY2VVdGlscy5jcmVhdGVBeGlzMkVuZHBvaW50UmVmZXJlbmNlKCIiKTsNCi0gICAgICAgICAgICBFbmRwb2ludFJlZmVyZW5jZVV0aWxzLmNvbnZlcnRUb0F4aXMyKGF4aXMyRVBSLCBudWxsKTsNCi0gICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBhIGZhaWx1cmUuIik7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICAvL3Bhc3MNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvYWRkcmVzc2luZy91dGlsL1JlZmVyZW5jZVBhcmFtZXRlckxpc3RUZXN0cy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2FkZHJlc3NpbmcvdXRpbC9SZWZlcmVuY2VQYXJhbWV0ZXJMaXN0VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQwMjVjZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvYWRkcmVzc2luZy91dGlsL1JlZmVyZW5jZVBhcmFtZXRlckxpc3RUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5hZGRyZXNzaW5nLnV0aWw7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS51dGlsLlN0QVhVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBIZWFkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5pbXBsLmJ1aWxkZXIuU3RBWFNPQVBNb2RlbEJ1aWxkZXI7DQotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7DQotDQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOw0KLWltcG9ydCBqYXZhLmlvLkZpbGU7DQotaW1wb3J0IGphdmEuaW8uRmlsZVJlYWRlcjsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLQ0KLXB1YmxpYyBjbGFzcyBSZWZlcmVuY2VQYXJhbWV0ZXJMaXN0VGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7DQotICAgIHByaXZhdGUgU3RyaW5nIHRlc3RSZXNvdXJjZURpciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiYmFzZWRpciIsICIuIikgKyAiL3Rlc3QtcmVzb3VyY2VzIjsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgcmVzb3VyY2VGaWxlTmFtZSA9ICJ4bWwvcmVmZXJlbmNlcGFyYW1ldGVycy54bWwiOw0KLSAgICBwcml2YXRlIFNPQVBIZWFkZXIgaGVhZGVyOw0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgRmlsZSByZXNvdXJjZUZpbGUgPSBuZXcgRmlsZSh0ZXN0UmVzb3VyY2VEaXIsIHJlc291cmNlRmlsZU5hbWUpOw0KLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHBhcnNlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEZpbGVSZWFkZXIocmVzb3VyY2VGaWxlKSk7DQotICAgICAgICBTdEFYU09BUE1vZGVsQnVpbGRlciBidWlsZGVyID0gbmV3IFN0QVhTT0FQTW9kZWxCdWlsZGVyKHBhcnNlciwgbnVsbCk7DQotICAgICAgICBoZWFkZXIgPSAoKFNPQVBFbnZlbG9wZSlidWlsZGVyLmdldERvY3VtZW50RWxlbWVudCgpKS5nZXRIZWFkZXIoKTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIHZvaWQgdGVzdFJlZmVyZW5jZVBhcmFtZXRlckxpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIExpc3Q8RWxlbWVudD4gZW1wdHlMaXN0ID0gbmV3IFJlZmVyZW5jZVBhcmFtZXRlckxpc3QoKTsNCi0gICAgICAgIGFzc2VydFRydWUoZW1wdHlMaXN0LmlzRW1wdHkoKSk7DQotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgZW1wdHlMaXN0LnNpemUoKSk7DQotICAgICAgICANCi0gICAgICAgIFNldDxTdHJpbmc+cmVzdWx0cyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsNCi0gICAgICAgIHJlc3VsdHMuYWRkKCIwMTIzNDU2Nzg5Iik7DQotICAgICAgICByZXN1bHRzLmFkZCgiQUJDREVGRyIpOw0KLSAgICAgICAgcmVzdWx0cy5hZGQoImFiY2RlZmciKTsNCi0gICAgICAgIHJlc3VsdHMuYWRkKCJ4eXoiKTsNCi0gICAgICAgIA0KLSAgICAgICAgTGlzdDxFbGVtZW50PiBycExpc3QgPSBuZXcgUmVmZXJlbmNlUGFyYW1ldGVyTGlzdChoZWFkZXIpOw0KLSAgICAgICAgYXNzZXJ0RmFsc2UocnBMaXN0LmlzRW1wdHkoKSk7DQotICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0cy5zaXplKCksIHJwTGlzdC5zaXplKCkpOw0KLQ0KLSAgICAgICAgZm9yIChFbGVtZW50IHJwIDogcnBMaXN0KSB7DQotICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gcnAuZ2V0VGV4dENvbnRlbnQoKTsNCi0gICAgICAgICAgICBpZiAocmVzdWx0cy5jb250YWlucyh2YWx1ZSkpIHsNCi0gICAgICAgICAgICAgICAgcmVzdWx0cy5yZW1vdmUodmFsdWUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlIHsNCi0gICAgICAgICAgICAgICAgZmFpbCgiVmFsdWUgbm90IHJlY29nbml6ZWQ6ICIgKyB2YWx1ZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgcmVzdWx0cy5zaXplKCkpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9hdHRhY2htZW50cy9NVE9NU2VyaWFsaXphdGlvblRlc3RzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvYXR0YWNobWVudHMvTVRPTVNlcmlhbGl6YXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWYwN2IxLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9hdHRhY2htZW50cy9NVE9NU2VyaWFsaXphdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmF0dGFjaG1lbnRzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NT3V0cHV0Rm9ybWF0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01UZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQQm9keTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuaW1wbC5sbG9tLnNvYXAxMS5TT0FQMTFGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5CbG9jazsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuTWVzc2FnZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuUHJvdG9jb2w7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmRhdGFiaW5kaW5nLkpBWEJCbG9ja0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmZhY3RvcnkuQmxvY2tGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5mYWN0b3J5LkpBWEJCbG9ja0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmZhY3RvcnkuTWVzc2FnZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm92aWRlcmFwaS5EYXRhU291cmNlSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnJlZ2lzdHJ5LkZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnVuaXRUZXN0LlRlc3RMb2dnZXI7Ci1pbXBvcnQgb3JnLnRlc3QubXRvbS5JbWFnZURlcG90OwotaW1wb3J0IG9yZy50ZXN0Lm10b20uT2JqZWN0RmFjdG9yeTsKLWltcG9ydCBvcmcudGVzdC5tdG9tLlNlbmRJbWFnZTsKLQotaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXI7Ci1pbXBvcnQgamF2YXguYWN0aXZhdGlvbi5EYXRhU291cmNlOwotaW1wb3J0IGphdmF4LmltYWdlaW8uSW1hZ2VJTzsKLWltcG9ydCBqYXZheC5pbWFnZWlvLnN0cmVhbS5GaWxlSW1hZ2VJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZheC5pbWFnZWlvLnN0cmVhbS5JbWFnZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuYXd0Lio7Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1wdWJsaWMgY2xhc3MgTVRPTVNlcmlhbGl6YXRpb25UZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHByaXZhdGUgRGF0YVNvdXJjZSBpbWFnZURTOwotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBpbWFnZVJlc291cmNlRGlyID0gU3lzdGVtLmdldFByb3BlcnR5KCJiYXNlZGlyIiwiLiIpKyIvIisidGVzdC1yZXNvdXJjZXMiK0ZpbGUuc2VwYXJhdG9yKyJpbWFnZSI7Ci0gICAgICAgIAotICAgICAgICAvL0NyZWF0ZSBhIERhdGFTb3VyY2UgZnJvbSBhbiBpbWFnZSAKLSAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoaW1hZ2VSZXNvdXJjZURpcitGaWxlLnNlcGFyYXRvcisidGVzdC5qcGciKTsKLSAgICAgICAgSW1hZ2VJbnB1dFN0cmVhbSBmaWlzID0gbmV3IEZpbGVJbWFnZUlucHV0U3RyZWFtKGZpbGUpOwotICAgICAgICBJbWFnZSBpbWFnZSA9IEltYWdlSU8ucmVhZChmaWlzKTsKLSAgICAgICAgaW1hZ2VEUyA9IG5ldyBEYXRhU291cmNlSW1wbCgiaW1hZ2UvanBlZyIsInRlc3QuanBnIixpbWFnZSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBNVE9NU2VyaWFsaXphdGlvblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0KLSAgICAKLSAgICAvKgotICAgICAqIFNpbXVsYXRlIGJ1aWxkaW5nIHVwIGFuIE9NIHRoYXQgaXMgc291cmNlZCBmcm9tIEpBWEIgYW5kIGNvbnRhaW5zCi0gICAgICogYmluYXJ5IGRhdGEgdGhhdCBzaG91bGQgYmUgb3B0aW1pemVkIHdoZW4gc2VyaWFsaXplZC4gIAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RQbGFpbk9NU2VyaWFsaXphdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7Ci0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJ0ZXN0OiAiICsgZ2V0TmFtZSgpKTsKLSAgICAgICAgCi0gICAgICAgIE9NRWxlbWVudCBwYXlsb2FkID0gY3JlYXRlUGF5bG9hZCgpOwotICAgICAgICAKLSAgICAgICAgT01PdXRwdXRGb3JtYXQgZm9ybWF0ID0gbmV3IE9NT3V0cHV0Rm9ybWF0KCk7Ci0gICAgICAgIGZvcm1hdC5zZXREb09wdGltaXplKHRydWUpOwotICAgICAgICBmb3JtYXQuc2V0U09BUDExKHRydWUpOwotICAgICAgICAgICAgICAgCi0gICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICBwYXlsb2FkLnNlcmlhbGl6ZUFuZENvbnN1bWUoYmFvcywgZm9ybWF0KTsKLQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOwotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZyhiYW9zLnRvU3RyaW5nKCkpOwotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOwotICAgIH0KLSAgICAKLSAgICAvKgotICAgICAqIFNpbXVsYXRlIGJ1aWxkaW5nIHVwIGFuIE9NIFNPQVBFbnZlbG9wZSB0aGF0IGhhcyB0aGUgY29udGVudHMgb2YKLSAgICAgKiB0aGUgYm9keSBzb3VyY2VkIGZyb20gSkFYQiBhbmQgY29udGFpbnMgYmluYXJ5IGRhdGEgdGhhdCBzaG91bGQgYmUgCi0gICAgICogb3B0aW1pemVkIHdoZW4gc2VyaWFsaXplZC4gIAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RTb2FwT01TZXJpYWxpemF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoInRlc3Q6ICIgKyBnZXROYW1lKCkpOwotICAgICAgICAKLSAgICAgICAgT01FbGVtZW50IHBheWxvYWQgPSBjcmVhdGVQYXlsb2FkKCk7Ci0gICAgICAgIAotICAgICAgICBTT0FQRmFjdG9yeSBmYWN0b3J5ID0gbmV3IFNPQVAxMUZhY3RvcnkoKTsKLSAgICAgICAgU09BUEVudmVsb3BlIGVudiA9IGZhY3RvcnkuY3JlYXRlU09BUEVudmVsb3BlKCk7Ci0gICAgICAgIFNPQVBCb2R5IGJvZHkgPSBmYWN0b3J5LmNyZWF0ZVNPQVBCb2R5KGVudik7Ci0gICAgICAgIAotICAgICAgICBib2R5LmFkZENoaWxkKHBheWxvYWQpOwotICAgICAgICAKLSAgICAgICAgT01PdXRwdXRGb3JtYXQgZm9ybWF0ID0gbmV3IE9NT3V0cHV0Rm9ybWF0KCk7Ci0gICAgICAgIGZvcm1hdC5zZXREb09wdGltaXplKHRydWUpOwotICAgICAgICBmb3JtYXQuc2V0U09BUDExKHRydWUpOwotICAgICAgICAgICAgICAgCi0gICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICBlbnYuc2VyaWFsaXplQW5kQ29uc3VtZShiYW9zLCBmb3JtYXQpOwotCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7Ci0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKGJhb3MudG9TdHJpbmcoKSk7Ci0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RNVE9NQXR0YWNobWVudFdyaXRlcigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7Ci0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJ0ZXN0OiAiICsgZ2V0TmFtZSgpKTsKLSAgICAgICAgCi0gICAgICAgIC8vQ3JlYXRlIGEgRGF0YUhhbmRsZXIgd2l0aCB0aGUgU3RyaW5nIERhdGFTb3VyY2Ugb2JqZWN0Ci0gICAgICAgIERhdGFIYW5kbGVyIGRhdGFIYW5kbGVyID0gbmV3IERhdGFIYW5kbGVyKGltYWdlRFMpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIC8vU3RvcmUgdGhlIGRhdGEgaGFuZGxlciBpbiBJbWFnZURlcG90IGJlYW4KLSAgICAgICAgSW1hZ2VEZXBvdCBpbWFnZURlcG90ID0gbmV3IE9iamVjdEZhY3RvcnkoKS5jcmVhdGVJbWFnZURlcG90KCk7Ci0gICAgICAgIGltYWdlRGVwb3Quc2V0SW1hZ2VEYXRhKGRhdGFIYW5kbGVyKTsKLSAgICAgICAgCi0gICAgICAgIC8vSkFYQkNvbnRleHQgamJjID0gSkFYQkNvbnRleHQubmV3SW5zdGFuY2UoIm9yZy50ZXN0Lm10b20iKTsKLSAgICAgICAgSkFYQkJsb2NrQ29udGV4dCBjb250ZXh0ID0gbmV3IEpBWEJCbG9ja0NvbnRleHQoU2VuZEltYWdlLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOwotICAgICAgICAKLSAgICAgICAgLy9DcmVhdGUgYSByZXF1ZXN0IGJlYW4gd2l0aCBpbWFnZWRlcG90IGJlYW4gYXMgdmFsdWUKLSAgICAgICAgT2JqZWN0RmFjdG9yeSBmYWN0b3J5ID0gbmV3IE9iamVjdEZhY3RvcnkoKTsKLSAgICAgICAgU2VuZEltYWdlIHJlcXVlc3QgPSBmYWN0b3J5LmNyZWF0ZVNlbmRJbWFnZSgpOwotICAgICAgICByZXF1ZXN0LnNldElucHV0KGltYWdlRGVwb3QpOwotICAgICAgICAKLSAgICAgICAgQmxvY2tGYWN0b3J5IGJsa0ZhY3RvcnkgPSAoSkFYQkJsb2NrRmFjdG9yeSkgRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoSkFYQkJsb2NrRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgIEJsb2NrIGJsb2NrID0gYmxrRmFjdG9yeS5jcmVhdGVGcm9tKHJlcXVlc3QsIGNvbnRleHQsIG51bGwpOwotICAgICAgICAKLSAgICAgICAgTWVzc2FnZUZhY3RvcnkgbXNnRmFjdG9yeSA9IChNZXNzYWdlRmFjdG9yeSkgRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoTWVzc2FnZUZhY3RvcnkuY2xhc3MpOwotICAgICAgICBNZXNzYWdlIG1zZyA9IG1zZ0ZhY3RvcnkuY3JlYXRlKFByb3RvY29sLnNvYXAxMSk7Ci0gICAgICAgIAotICAgICAgICBtc2cuc2V0Qm9keUJsb2NrKGJsb2NrKTsKLSAgICAgICAgCi0gICAgICAgIG1zZy5zZXRNVE9NRW5hYmxlZCh0cnVlKTsKLSAgICAgICAgCi0gICAgICAgIFNPQVBFbnZlbG9wZSBzb2FwT00gPSAoU09BUEVudmVsb3BlKSBtc2cuZ2V0QXNPTUVsZW1lbnQoKTsKLSAgICAgICAgCi0gICAgICAgIE9NT3V0cHV0Rm9ybWF0IGZvcm1hdCA9IG5ldyBPTU91dHB1dEZvcm1hdCgpOwotICAgICAgICBmb3JtYXQuc2V0RG9PcHRpbWl6ZSh0cnVlKTsKLSAgICAgICAgZm9ybWF0LnNldFNPQVAxMSh0cnVlKTsKLSAgICAgICAgICAgICAgIAotICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgc29hcE9NLnNlcmlhbGl6ZUFuZENvbnN1bWUoYmFvcywgZm9ybWF0KTsKLSAgICAgICAgU3RyaW5nIG91dHB1dFRleHQgPSBiYW9zLnRvU3RyaW5nKCk7Ci0gICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgYXR0YWNobWVudCBpcyBzZXJpYWxpemVkCi0gICAgICAgIGFzc2VydFRydWUob3V0cHV0VGV4dC5pbmRleE9mKCJDb250ZW50LVR5cGU6IGltYWdlL2pwZWciKSA+IDApOwotCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7Ci0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKG91dHB1dFRleHQpOwotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0TVRPTUF0dGFjaG1lbnRXcml0ZXIyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoInRlc3Q6ICIgKyBnZXROYW1lKCkpOwotICAgICAgICAKLSAgICAgICAgLy9DcmVhdGUgYSBEYXRhSGFuZGxlciB3aXRoIHRoZSBTdHJpbmcgRGF0YVNvdXJjZSBvYmplY3QKLSAgICAgICAgRGF0YUhhbmRsZXIgZGF0YUhhbmRsZXIgPSBuZXcgRGF0YUhhbmRsZXIoaW1hZ2VEUyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgLy9TdG9yZSB0aGUgZGF0YSBoYW5kbGVyIGluIEltYWdlRGVwb3QgYmVhbgotICAgICAgICBJbWFnZURlcG90IGltYWdlRGVwb3QgPSBuZXcgT2JqZWN0RmFjdG9yeSgpLmNyZWF0ZUltYWdlRGVwb3QoKTsKLSAgICAgICAgaW1hZ2VEZXBvdC5zZXRJbWFnZURhdGEoZGF0YUhhbmRsZXIpOwotICAgICAgICAKLSAgICAgICAgLy9KQVhCQ29udGV4dCBqYmMgPSBKQVhCQ29udGV4dC5uZXdJbnN0YW5jZSgib3JnLnRlc3QubXRvbSIpOwotICAgICAgICBKQVhCQmxvY2tDb250ZXh0IGNvbnRleHQgPSBuZXcgSkFYQkJsb2NrQ29udGV4dChTZW5kSW1hZ2UuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7Ci0gICAgICAgIAotICAgICAgICAvL0NyZWF0ZSBhIHJlcXVlc3QgYmVhbiB3aXRoIGltYWdlZGVwb3QgYmVhbiBhcyB2YWx1ZQotICAgICAgICBPYmplY3RGYWN0b3J5IGZhY3RvcnkgPSBuZXcgT2JqZWN0RmFjdG9yeSgpOwotICAgICAgICBTZW5kSW1hZ2UgcmVxdWVzdCA9IGZhY3RvcnkuY3JlYXRlU2VuZEltYWdlKCk7Ci0gICAgICAgIHJlcXVlc3Quc2V0SW5wdXQoaW1hZ2VEZXBvdCk7Ci0gICAgICAgIAotICAgICAgICBCbG9ja0ZhY3RvcnkgYmxrRmFjdG9yeSA9IChKQVhCQmxvY2tGYWN0b3J5KSBGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShKQVhCQmxvY2tGYWN0b3J5LmNsYXNzKTsKLSAgICAgICAgQmxvY2sgYmxvY2sgPSBibGtGYWN0b3J5LmNyZWF0ZUZyb20ocmVxdWVzdCwgY29udGV4dCwgbnVsbCk7Ci0gICAgICAgIAotICAgICAgICBNZXNzYWdlRmFjdG9yeSBtc2dGYWN0b3J5ID0gKE1lc3NhZ2VGYWN0b3J5KSBGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShNZXNzYWdlRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgIE1lc3NhZ2UgbXNnID0gbXNnRmFjdG9yeS5jcmVhdGUoUHJvdG9jb2wuc29hcDExKTsKLSAgICAgICAgCi0gICAgICAgIG1zZy5zZXRCb2R5QmxvY2soYmxvY2spOwotICAgICAgICAKLSAgICAgICAgbXNnLnNldE1UT01FbmFibGVkKHRydWUpOwotICAgICAgICAKLSAgICAgICAgLy8gQ29udmVydCBtZXNzYWdlIHRvIFNBQUogdG8gc2ltdWxhdGUgYW4gb3V0Ym91bmQgaGFuZGxlcgotICAgICAgICBtc2cuZ2V0QXNTT0FQTWVzc2FnZSgpOwotICAgICAgICAKLSAgICAgICAgLy8gTm93IGNvbnZlcnQgaXQgYmFjayB0byBBWElPTQotICAgICAgICAKLSAgICAgICAgU09BUEVudmVsb3BlIHNvYXBPTSA9IChTT0FQRW52ZWxvcGUpIG1zZy5nZXRBc09NRWxlbWVudCgpOwotICAgICAgICAKLSAgICAgICAgT01PdXRwdXRGb3JtYXQgZm9ybWF0ID0gbmV3IE9NT3V0cHV0Rm9ybWF0KCk7Ci0gICAgICAgIGZvcm1hdC5zZXREb09wdGltaXplKHRydWUpOwotICAgICAgICBmb3JtYXQuc2V0U09BUDExKHRydWUpOwotICAgICAgICAgICAgICAgCi0gICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICBzb2FwT00uc2VyaWFsaXplQW5kQ29uc3VtZShiYW9zLCBmb3JtYXQpOwotICAgICAgICBTdHJpbmcgb3V0cHV0VGV4dCA9IGJhb3MudG9TdHJpbmcoKTsKLSAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBhdHRhY2htZW50IGlzIHNlcmlhbGl6ZWQKLSAgICAgICAgYXNzZXJ0VHJ1ZShvdXRwdXRUZXh0LmluZGV4T2YoIkNvbnRlbnQtVHlwZTogaW1hZ2UvanBlZyIpID4gMCk7Ci0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKTsKLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcob3V0cHV0VGV4dCk7Ci0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgT01FbGVtZW50IGNyZWF0ZVBheWxvYWQoKSB7Ci0gICAgICAgIC8vQ3JlYXRlIGEgRGF0YUhhbmRsZXIgd2l0aCB0aGUgU3RyaW5nIERhdGFTb3VyY2Ugb2JqZWN0Ci0gICAgICAgIERhdGFIYW5kbGVyIGRhdGFIYW5kbGVyID0gbmV3IERhdGFIYW5kbGVyKGltYWdlRFMpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIE9NRmFjdG9yeSBmYWMgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKTsKLSAgICAgICAgT01OYW1lc3BhY2Ugb21OcyA9IGZhYy5jcmVhdGVPTU5hbWVzcGFjZSgidXJuOi8vbXRvbS50ZXN0Lm9yZyIsICJtdG9tIik7Ci0gICAgICAgIAotICAgICAgICBPTUVsZW1lbnQgc2VuZEltYWdlID0gZmFjLmNyZWF0ZU9NRWxlbWVudCgic2VuZEltYWdlIiwgb21Ocyk7Ci0gICAgICAgIAotICAgICAgICBPTUVsZW1lbnQgaW5wdXQgPSBmYWMuY3JlYXRlT01FbGVtZW50KCJpbnB1dCIsIG9tTnMpOwotICAgICAgICBzZW5kSW1hZ2UuYWRkQ2hpbGQoaW5wdXQpOwotICAgICAgICAKLSAgICAgICAgT01FbGVtZW50IGltYWdlRGF0YSA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoImltYWdlRGF0YSIsIG9tTnMpOwotICAgICAgICBpbnB1dC5hZGRDaGlsZChpbWFnZURhdGEpOwotICAgICAgICAKLSAgICAgICAgT01UZXh0IGJpbmFyeURhdGEgPSBmYWMuY3JlYXRlT01UZXh0KGRhdGFIYW5kbGVyLCB0cnVlKTsKLSAgICAgICAgaW1hZ2VEYXRhLmFkZENoaWxkKGJpbmFyeURhdGEpOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHNlbmRJbWFnZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2F0YWxvZy9NdWx0aVJlZGlyZWN0aW9uQ2F0YWxvZ1Rlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jYXRhbG9nL011bHRpUmVkaXJlY3Rpb25DYXRhbG9nVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTIxMzAyLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jYXRhbG9nL011bHRpUmVkaXJlY3Rpb25DYXRhbG9nVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY2F0YWxvZzsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNhdGFsb2cuaW1wbC5PQVNJU0NhdGFsb2dNYW5hZ2VyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnV0aWwuV1NETDRKV3JhcHBlcjsNCi0NCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOw0KLWltcG9ydCBqYXZheC53c2RsLklucHV0Ow0KLWltcG9ydCBqYXZheC53c2RsLk1lc3NhZ2U7DQotaW1wb3J0IGphdmF4LndzZGwuT3BlcmF0aW9uOw0KLWltcG9ydCBqYXZheC53c2RsLlBhcnQ7DQotaW1wb3J0IGphdmF4LndzZGwuUG9ydFR5cGU7DQotaW1wb3J0IGphdmF4LndzZGwuV1NETEV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi1pbXBvcnQgamF2YS5pby5GaWxlOw0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247DQotaW1wb3J0IGphdmEubmV0LlVSTDsNCi0NCi0vKioNCi0gKiBUZXN0cyB0aGUgdXNlIG9mIHRoZSBBcGFjaGUgQ29tbW9ucyBSZXNvbHZlciBBUEkgdG8gcmVzb2x2ZSBVUklzLg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBNdWx0aVJlZGlyZWN0aW9uQ2F0YWxvZ1Rlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBST09UX1dTREwgPSAiL3Rlc3QtcmVzb3VyY2VzL2NhdGFsb2cvcm9vdC53c2RsIjsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfUkVTT1VSQ0VTID0gIi90ZXN0LXJlc291cmNlcy9jYXRhbG9nLyI7DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0T25lQ2F0YWxvZ1N1Y2Nlc3MoKSB7DQotCQl2ZXJpZnlTdWNjZXNzKFJPT1RfV1NETCwgVEVTVF9SRVNPVVJDRVMgKyAiYmFzaWMtY2F0YWxvZy54bWwiKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV4dENhdGFsb2dTdWNjZXNzKCkgew0KLQkJdmVyaWZ5U3VjY2VzcyhST09UX1dTREwsIFRFU1RfUkVTT1VSQ0VTICsgInJvb3QtY2F0YWxvZy54bWwiKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdE5leHRDYXRhbG9nRmFpbHVyZSgpIHsNCi0JCXZlcmlmeUZhaWx1cmUoUk9PVF9XU0RMLCBURVNUX1JFU09VUkNFUyArICJmYWlsL3Jvb3QtY2F0YWxvZy54bWwiKTsJCQ0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm9DYXRFbnRyeUZvckZpcnN0SW1wb3J0KCkgew0KLQkJdmVyaWZ5RmFpbHVyZShST09UX1dTREwsIFRFU1RfUkVTT1VSQ0VTICsgImZhaWwvZmlyc3RJbXBvcnRGYWlsLnhtbCIpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm9DYXRFbnRyeUZvclNlY29uZEltcG9ydCgpIHsNCi0JCXZlcmlmeUZhaWx1cmUoUk9PVF9XU0RMLCBURVNUX1JFU09VUkNFUyArICJmYWlsL3NlY29uZEltcG9ydEZhaWwueG1sIik7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3ROb0NhdEVudHJ5Rm9yVGhpcmRJbXBvcnQoKSB7DQotCQl2ZXJpZnlGYWlsdXJlKFJPT1RfV1NETCwgVEVTVF9SRVNPVVJDRVMgKyAiZmFpbC90aGlyZEltcG9ydEZhaWwueG1sIik7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBFbnN1cmUgdGhhdCB0aGUgY2F0YWxvZyBpcyB1c2VkIHRvIGxvY2F0ZSBpbXBvcnRlZCByZXNvdXJjZXMuDQotCSAqLw0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5U3VjY2VzcyhTdHJpbmcgd3NkbExvY2F0aW9uLCBTdHJpbmcgY2F0YWxvZ0ZpbGUpIHsNCi0JICAgIFVSTCB1cmwgPSBnZXRVUkxGcm9tTG9jYXRpb24od3NkbExvY2F0aW9uKTsNCi0JICAgIA0KLQkgICAgdHJ5ew0KLQkJCU9BU0lTQ2F0YWxvZ01hbmFnZXIgY2F0YWxvZ01hbmFnZXIgPSBuZXcgT0FTSVNDYXRhbG9nTWFuYWdlcigpOw0KLQkJCWNhdGFsb2dNYW5hZ2VyLnNldENhdGFsb2dGaWxlcyhnZXRVUkxGcm9tTG9jYXRpb24oY2F0YWxvZ0ZpbGUpLnRvU3RyaW5nKCkpOw0KLSAgICAgICAgICAgIFdTREw0SldyYXBwZXIgdzRqID0gbmV3IFdTREw0SldyYXBwZXIodXJsLCBjYXRhbG9nTWFuYWdlciwgZmFsc2UsIDApOw0KLQkgICAgCURlZmluaXRpb24gd3NkbERlZiA9IHc0ai5nZXREZWZpbml0aW9uKCk7DQotCSAgICAJYXNzZXJ0Tm90TnVsbCh3c2RsRGVmKTsgICANCi0JICAgIAlRTmFtZSBwb3J0VHlwZU5hbWUgPSBuZXcgUU5hbWUoImh0dHA6Ly93d3cuZXhhbXBsZS5jb20vdGVzdC9jYWxjdWxhdG9yIiwNCi0JICAgIAkJCSAgICAgICAgICAgICAgICAgICAgICAgIkNhbGN1bGF0b3JTZXJ2aWNlIiwNCi0JICAgIAkJCSAgICAgICAgICAgICAgICAgICAgICAgIiIpOw0KLQkgICAgCVBvcnRUeXBlIHBvcnRUeXBlID0gd3NkbERlZi5nZXRQb3J0VHlwZShwb3J0VHlwZU5hbWUpOw0KLQkgICAgCWFzc2VydE5vdE51bGwocG9ydFR5cGUpOw0KLQkgICAgCU9wZXJhdGlvbiBjbGVhck9wID0gcG9ydFR5cGUuZ2V0T3BlcmF0aW9uKCJjbGVhciIsIG51bGwsIG51bGwpOw0KLQkgICAgCWFzc2VydE5vdE51bGwoY2xlYXJPcCk7DQotCSAgICAJSW5wdXQgY2xlYXJPcElucHV0ID0gY2xlYXJPcC5nZXRJbnB1dCgpOw0KLQkgICAgCWFzc2VydE5vdE51bGwoY2xlYXJPcElucHV0KTsNCi0JICAgIAlNZXNzYWdlIG1zZyA9IGNsZWFyT3BJbnB1dC5nZXRNZXNzYWdlKCk7DQotCSAgICAJYXNzZXJ0Tm90TnVsbChtc2cpOw0KLQkgICAgCVBhcnQgZXhwZWN0ZWRQYXJ0ID0gbXNnLmdldFBhcnQoInBhcnQxIik7DQotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChleHBlY3RlZFBhcnQpOw0KLQkgICAgfWNhdGNoKEV4Y2VwdGlvbiBlKXsNCi0JICAgIAllLnByaW50U3RhY2tUcmFjZSgpOw0KLQkgICAgCWZhaWwoKTsNCi0JICAgIH0NCi0JfQkNCi0JDQotCS8qKg0KLQkgKiBFbnN1cmUgdGhhdCB0aGUgdGVzdCBjYXNlIGlzIHZhbGlkIGJ5IGZhaWxpbmcgaW4gdGhlIGFic2VuY2Ugb2YgYSBuZWVkZWQNCi0JICogY2F0YWxvZyBlbnRyeS4NCi0JICovDQotCXByaXZhdGUgdm9pZCB2ZXJpZnlGYWlsdXJlKFN0cmluZyB3c2RsTG9jYXRpb24sIFN0cmluZyBjYXRhbG9nRmlsZSkgew0KLQkgICAgVVJMIHVybCA9IGdldFVSTEZyb21Mb2NhdGlvbih3c2RsTG9jYXRpb24pOw0KLQkgICAgDQotCSAgICB0cnl7DQotCQkJT0FTSVNDYXRhbG9nTWFuYWdlciBjYXRhbG9nTWFuYWdlciA9IG5ldyBPQVNJU0NhdGFsb2dNYW5hZ2VyKCk7DQotICAgICAgICAgICAgY2F0YWxvZ01hbmFnZXIuc2V0Q2F0YWxvZ0ZpbGVzKGdldFVSTEZyb21Mb2NhdGlvbihjYXRhbG9nRmlsZSkudG9TdHJpbmcoKSk7DQotCSAgICAJV1NETDRKV3JhcHBlciB3NGogPSBuZXcgV1NETDRKV3JhcHBlcih1cmwsIGNhdGFsb2dNYW5hZ2VyLCBmYWxzZSwgMCk7DQotCSAgICAJdzRqLmdldERlZmluaXRpb24oKTsNCi0JICAgIAlmYWlsKCJTaG91bGQgaGF2ZSByZWNlaXZlZCBhIFdTRExFeGNlcHRpb24gZHVlIHRvIHRoZSBpbnZhbGlkIFdTREwgbG9jYXRpb24gIiANCi0JICAgICAgICAJCSsgIm5vdCByZWRpcmVjdGVkIGJ5IHRoZSBjYXRhbG9nLiIpOw0KLQkgICAgfSBjYXRjaChXU0RMRXhjZXB0aW9uIGUpIHsNCi0JICAgIAkvLyBkbyBub3RoaW5nIC0gc3VjY2Vzc2Z1bCB0ZXN0IGNhc2UNCi0JICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpew0KLQkgICAgCWUucHJpbnRTdGFja1RyYWNlKCk7DQotCSAgICAJZmFpbCgpOw0KLQkgICAgfQ0KLQl9DQotCQ0KLQkvKioNCi0JICogR2l2ZW4gYSBTdHJpbmcgcmVwcmVzZW50aW5nIGEgZmlsZSBsb2NhdGlvbiwgcmV0dXJuIGEgVVJMLg0KLQkgKiBAcGFyYW0gd3NkbExvY2F0aW9uDQotCSAqIEByZXR1cm4NCi0JICovDQotCXByaXZhdGUgVVJMIGdldFVSTEZyb21Mb2NhdGlvbihTdHJpbmcgd3NkbExvY2F0aW9uKSB7DQotCQlVUkwgdXJsID0gbnVsbDsNCi0JICAgIHRyeSB7DQotCSAgICAJdHJ5ew0KLQkgICAgICAgIAlTdHJpbmcgYmFzZURpciA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiYmFzZWRpciIsIi4iKSkuZ2V0Q2Fub25pY2FsUGF0aCgpOw0KLQkgICAgICAgIAl3c2RsTG9jYXRpb24gPSBuZXcgRmlsZShiYXNlRGlyICsgd3NkbExvY2F0aW9uKS5nZXRBYnNvbHV0ZVBhdGgoKTsNCi0gICAgICAgIAl9Y2F0Y2goRXhjZXB0aW9uIGUpew0KLSAgICAgICAgCQllLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgCQlmYWlsKCk7DQotICAgICAgICAJfQ0KLQkgICAgICAgCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHdzZGxMb2NhdGlvbik7DQotCSAgICAgICAJdXJsID0gZmlsZS50b1VSTCgpOw0KLQkgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsNCi0JICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLQkgICAgICAgIGZhaWwoKTsNCi0JICAgIH0NCi0JICAgIA0KLQkgICAgcmV0dXJuIHVybDsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2F0YWxvZy9YTUxDYXRhbG9nVGVzdHMuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jYXRhbG9nL1hNTENhdGFsb2dUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzQyM2I3Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jYXRhbG9nL1hNTENhdGFsb2dUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jYXRhbG9nOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY2F0YWxvZy5pbXBsLk9BU0lTQ2F0YWxvZ01hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51dGlsLkNhdGFsb2dVUklSZXNvbHZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYTsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYUNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLS8qKgotICogVGVzdHMgdGhlIHVzZSBvZiB0aGUgQXBhY2hlIENvbW1vbnMgUmVzb2x2ZXIgQVBJIHRvIHJlc29sdmUgVVJJcy4KLSAqLwotcHVibGljIGNsYXNzIFhNTENhdGFsb2dUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9SRVNPVVJDRVMgPSAidGVzdC1yZXNvdXJjZXMvY2F0YWxvZy8iOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCQVNJQ19DQVRBTE9HID0gIi8iICsgVEVTVF9SRVNPVVJDRVMgKyAiYmFzaWMtY2F0YWxvZy54bWwiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTVBPUlRfQkFTRSA9IFRFU1RfUkVTT1VSQ0VTICsgImltcG9ydEJhc2UueHNkIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1QT1JUX0JBRCA9IFRFU1RfUkVTT1VSQ0VTICsgImltcG9ydEJhZC54c2QiOwkKLQotICAgIC8qKgotICAgICAqIFZlcmlmeSB0aGF0IGFsbCB0aGUgZXhwZWN0ZWQgY29uZGl0aW9ucyBhcmUgbWV0ICh0aGUgY29udHJvbCBjYXNlKS4KLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RTY2hlbWFJbXBvcnROb0NhdGFsb2dOb05lZWQoKSB0aHJvd3MgRXhjZXB0aW9uewotICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShJTVBPUlRfQkFTRSk7Ci0gICAgICAgIC8vY3JlYXRlIGEgRE9NIGRvY3VtZW50Ci0gICAgICAgIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZG9jdW1lbnRCdWlsZGVyRmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgZG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKLSAgICAgICAgRG9jdW1lbnQgZG9jID0gZG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKS4KLSAgICAgICAgICAgICAgICBwYXJzZShmaWxlLnRvVVJMKCkudG9TdHJpbmcoKSk7Ci0KLSAgICAgICAgWG1sU2NoZW1hQ29sbGVjdGlvbiBzY2hlbWFDb2wgPSBuZXcgWG1sU2NoZW1hQ29sbGVjdGlvbigpOwotICAgICAgICBYbWxTY2hlbWEgc2NoZW1hID0gc2NoZW1hQ29sLnJlYWQoZG9jLGZpbGUudG9VUkwoKS50b1N0cmluZygpLG51bGwpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNjaGVtYSk7Ci0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzY2hlbWEuZ2V0VHlwZUJ5TmFtZShuZXcgUU5hbWUoImh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkMiIsIlNPQVBTdHJ1Y3QiKSkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNjaGVtYS5nZXRFbGVtZW50QnlOYW1lKG5ldyBRTmFtZSgiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2QyIiwiU09BUFdyYXBwZXIiKSkpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBWZXJpZnkgdGhhdCB0aGUgZWxlbWVudCBpcyBub3QgcHJlc2VudCB3aGVuIHVzaW5nIElNUE9SVF9CQUQgaW4gdGhlIAotICAgICAqIGFic2VuY2Ugb2YgYSBDYXRhbG9nTWFuYWdlci4KLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RTY2hlbWFJbXBvcnRDYXRhbG9nTmVlZE5vdFByZXNlbnQoKSB0aHJvd3MgRXhjZXB0aW9uewotICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShJTVBPUlRfQkFEKTsKLSAgICAgICAgLy9jcmVhdGUgYSBET00gZG9jdW1lbnQKLSAgICAgICAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBkb2N1bWVudEJ1aWxkZXJGYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICBkb2N1bWVudEJ1aWxkZXJGYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOwotICAgICAgICBEb2N1bWVudCBkb2MgPSBkb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpLgotICAgICAgICAgICAgICAgIHBhcnNlKGZpbGUudG9VUkwoKS50b1N0cmluZygpKTsKLQotICAgICAgICBYbWxTY2hlbWFDb2xsZWN0aW9uIHNjaGVtYUNvbCA9IG5ldyBYbWxTY2hlbWFDb2xsZWN0aW9uKCk7Ci0gICAgICAgIFhtbFNjaGVtYSBzY2hlbWEgPSBzY2hlbWFDb2wucmVhZChkb2MsZmlsZS50b1VSTCgpLnRvU3RyaW5nKCksbnVsbCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2NoZW1hKTsKLQotICAgICAgICBhc3NlcnROb3ROdWxsKHNjaGVtYS5nZXRUeXBlQnlOYW1lKG5ldyBRTmFtZSgiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2QyIiwiU09BUFN0cnVjdCIpKSk7Ci0gICAgICAgIGFzc2VydE51bGwoc2NoZW1hLmdldEVsZW1lbnRCeU5hbWUobmV3IFFOYW1lKCJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZDIiLCJTT0FQV3JhcHBlciIpKSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFZlcmlmeSB0aGF0IHRoZSBlbGVtZW50IGlzIHByZXNlbnQgdXNpbmcgSU1QT1JUX0JBRCBpZiB0aGUgWE1MIFJlc29sdmVyIAotICAgICAqIGlzIHVzZWQuICBUaGlzIHRlc3QgaXMgZm9yIGEgc2ltcGxlLCBzaW5nbGUtZmlsZSBjYXRhbG9nLgotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFNjaGVtYUltcG9ydEJhc2ljQ2F0YWxvZygpIHRocm93cyBFeGNlcHRpb257Ci0JCU9BU0lTQ2F0YWxvZ01hbmFnZXIgY2F0YWxvZ01hbmFnZXIgPSBuZXcgT0FTSVNDYXRhbG9nTWFuYWdlcigpOwotCQljYXRhbG9nTWFuYWdlci5zZXRDYXRhbG9nRmlsZXMoZ2V0VVJMRnJvbUxvY2F0aW9uKEJBU0lDX0NBVEFMT0cpLnRvU3RyaW5nKCkpOwotCQkKLSAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoSU1QT1JUX0JBRCk7Ci0gICAgICAgIC8vY3JlYXRlIGEgRE9NIGRvY3VtZW50Ci0gICAgICAgIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZG9jdW1lbnRCdWlsZGVyRmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgZG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKLSAgICAgICAgRG9jdW1lbnQgZG9jID0gZG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKS4KLSAgICAgICAgICAgICAgICBwYXJzZShmaWxlLnRvVVJMKCkudG9TdHJpbmcoKSk7Ci0KLSAgICAgICAgWG1sU2NoZW1hQ29sbGVjdGlvbiBzY2hlbWFDb2wgPSBuZXcgWG1sU2NoZW1hQ29sbGVjdGlvbigpOwotICAgICAgICBzY2hlbWFDb2wuc2V0U2NoZW1hUmVzb2x2ZXIobmV3IENhdGFsb2dVUklSZXNvbHZlcihjYXRhbG9nTWFuYWdlcikpOwotICAgICAgICBYbWxTY2hlbWEgc2NoZW1hID0gc2NoZW1hQ29sLnJlYWQoZG9jLGZpbGUudG9VUkwoKS50b1N0cmluZygpLG51bGwpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNjaGVtYSk7Ci0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzY2hlbWEuZ2V0VHlwZUJ5TmFtZShuZXcgUU5hbWUoImh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkMiIsIlNPQVBTdHJ1Y3QiKSkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNjaGVtYS5nZXRFbGVtZW50QnlOYW1lKG5ldyBRTmFtZSgiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2QyIiwiU09BUFdyYXBwZXIiKSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdpdmVuIGEgU3RyaW5nIHJlcHJlc2VudGluZyBhIGZpbGUgbG9jYXRpb24sIHJldHVybiBhIFVSTC4KLSAgICAgKiBAcGFyYW0gd3NkbExvY2F0aW9uCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHByaXZhdGUgVVJMIGdldFVSTEZyb21Mb2NhdGlvbihTdHJpbmcgd3NkbExvY2F0aW9uKSB7Ci0gICAgICAgIFVSTCB1cmwgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgdHJ5ewotICAgICAgICAgICAgICAgIFN0cmluZyBiYXNlRGlyID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJiYXNlZGlyIiwiLiIpKS5nZXRDYW5vbmljYWxQYXRoKCk7Ci0gICAgICAgICAgICAgICAgd3NkbExvY2F0aW9uID0gbmV3IEZpbGUoYmFzZURpciArIHdzZGxMb2NhdGlvbikuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0gICAgICAgICAgICB9Y2F0Y2goRXhjZXB0aW9uIGUpewotICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUod3NkbExvY2F0aW9uKTsKLSAgICAgICAgICAgICAgIHVybCA9IGZpbGUudG9VUkwoKTsKLSAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLQkgICAgCi0gICAgICAgIHJldHVybiB1cmw7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NsaWVudC9DbGllbnRDb25maWdUZXN0cy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NsaWVudC9DbGllbnRDb25maWdUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjRkZmVlLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jbGllbnQvQ2xpZW50Q29uZmlnVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jbGllbnQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnVuaXRUZXN0LlRlc3RMb2dnZXI7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC53cy5EaXNwYXRjaDsKLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsKLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZS5Nb2RlOwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1wdWJsaWMgY2xhc3MgQ2xpZW50Q29uZmlnVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwdWJsaWMgQ2xpZW50Q29uZmlnVGVzdHMoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RCYWRXc2RsVXJsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIAotICAgICAgICBVUkwgdXJsID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIHdzZGxMb2NhdGlvbiA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB0cnl7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGJhc2VEaXIgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoImJhc2VkaXIiLCIuIikpLmdldENhbm9uaWNhbFBhdGgoKTsKLSAgICAgICAgICAgICAgICB3c2RsTG9jYXRpb24gPSBuZXcgRmlsZShiYXNlRGlyICsgIi90ZXN0LXJlc291cmNlcy93c2RsL0JhZEVuZHBvaW50QWRkcmVzcy53c2RsIikuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0gICAgICAgICAgICB9Y2F0Y2goRXhjZXB0aW9uIGUpewotICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZSh3c2RsTG9jYXRpb24pOwotICAgICAgICAgICAgdXJsID0gZmlsZS50b1VSTCgpOwotICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgU2VydmljZSBzdmMgPSBTZXJ2aWNlLmNyZWF0ZSh1cmwsIG5ldyBRTmFtZSgiaHR0cDovL2pheHdzLmF4aXMyLmFwYWNoZS5vcmciLCAiRWNob1NlcnZpY2UiKSk7Ci0gICAgICAgIERpc3BhdGNoIGRpc3BhdGNoID0gc3ZjLmNyZWF0ZURpc3BhdGNoKG5ldyBRTmFtZSgiaHR0cDovL2pheHdzLmF4aXMyLmFwYWNoZS5vcmciLCAiRWNob1BvcnQiKSwgCi0gICAgICAgICAgICAgICAgU3RyaW5nLmNsYXNzLCBNb2RlLlBBWUxPQUQpOwotICAgICAgICAKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGRpc3BhdGNoLmludm9rZSgiIik7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIElmIGFuIGV4Y2VwdGlvbiB3YXNuJ3QgdGhyb3duLCB0aGVuIGl0J3MgYW4gZXJyb3IuCi0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFdlYlNlcnZpY2VFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gV2Ugc2hvdWxkIG9ubHkgZ2V0IGEgV2ViU2VydmljZUV4Y2VwdGlvbiBoZXJlLiAgQW55dGhpbmcgZWxzZQotICAgICAgICAgICAgLy8gaXMgYSBmYWlsdXJlLgotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIltwYXNzXSAtIHRoZSBwcm9wZXIgZmF1bHQgdHlwZSB3YXMgdGhyb3duIik7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2xpZW50L0ludGVyY2VwdGFibGVDbGllbnRUZXN0Q2FzZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NsaWVudC9JbnRlcmNlcHRhYmxlQ2xpZW50VGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE5NTQ4Mi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2xpZW50L0ludGVyY2VwdGFibGVDbGllbnRUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jbGllbnQ7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS5jb250cm9sbGVyLkludm9jYXRpb25Db250cm9sbGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5yZWdpc3RyeS5GYWN0b3J5UmVnaXN0cnk7DQotaW1wb3J0IG9yZy5jdXN0b21tb25rZXkueG1sdW5pdC5YTUxUZXN0Q2FzZTsNCi0NCi0vKioNCi0gKiBUaGlzIFRlc3RDYXNlIGNhbiBiZSBleHRlbmRlZCB0byB3cml0ZSBKQVgtV1MgY2xpZW50IHNpZGUgdW5pdCB0ZXN0cyB3aXRob3V0IA0KLSAqIGhhdmluZyB0byBoYXZlIGFuIGVuZC10by1lbmQgdGVzdC4gIFRoZSA8c291cmNlPlRlc3RDbGllbnRJbnZvY2F0aW9uQ29udHJvbGxlcjwvc291cmNlPg0KLSAqIHdpbGwgYmUgdXNlZCB0byBjYXB0dXJlIHRoZSByZXF1ZXN0LiAgDQotICovDQotcHVibGljIGNsYXNzIEludGVyY2VwdGFibGVDbGllbnRUZXN0Q2FzZSBleHRlbmRzIFhNTFRlc3RDYXNlIHsNCi0NCi0gICAgcHJpdmF0ZSBJbnZvY2F0aW9uQ29udHJvbGxlckZhY3Rvcnkgb2xkRmFjdG9yeTsNCi0gICAgcHJpdmF0ZSBUZXN0Q2xpZW50SW52b2NhdGlvbkNvbnRyb2xsZXJGYWN0b3J5IG5ld0ZhY3Rvcnk7DQotICAgIHByaXZhdGUgVGVzdENsaWVudEludm9jYXRpb25Db250cm9sbGVyIHRlc3RDb250cm9sbGVyOw0KLSAgICANCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBzdXBlci5zZXRVcCgpOw0KLSAgICAgICAgDQotICAgICAgICBJbnZvY2F0aW9uQ29udHJvbGxlckZhY3RvcnkgaWNmID0gKEludm9jYXRpb25Db250cm9sbGVyRmFjdG9yeSkgRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoSW52b2NhdGlvbkNvbnRyb2xsZXJGYWN0b3J5LmNsYXNzKTsNCi0gICAgICAgIG9sZEZhY3RvcnkgPSBpY2Y7DQotICAgICAgICANCi0gICAgICAgIHRlc3RDb250cm9sbGVyID0gbmV3IFRlc3RDbGllbnRJbnZvY2F0aW9uQ29udHJvbGxlcigpOw0KLSAgICAgICAgDQotICAgICAgICBuZXdGYWN0b3J5ID0gbmV3IFRlc3RDbGllbnRJbnZvY2F0aW9uQ29udHJvbGxlckZhY3RvcnkoKTsNCi0gICAgICAgIG5ld0ZhY3Rvcnkuc2V0SW52b2NhdGlvbkNvbnRyb2xsZXIodGVzdENvbnRyb2xsZXIpOw0KLSAgICAgICAgDQotICAgICAgICBGYWN0b3J5UmVnaXN0cnkuc2V0RmFjdG9yeShJbnZvY2F0aW9uQ29udHJvbGxlckZhY3RvcnkuY2xhc3MsIG5ld0ZhY3RvcnkpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsNCi0NCi0gICAgICAgIEZhY3RvcnlSZWdpc3RyeS5zZXRGYWN0b3J5KEludm9jYXRpb25Db250cm9sbGVyRmFjdG9yeS5jbGFzcywgb2xkRmFjdG9yeSk7DQotICAgIH0NCi0gICAgDQotICAgIHByb3RlY3RlZCBUZXN0Q2xpZW50SW52b2NhdGlvbkNvbnRyb2xsZXIgZ2V0SW52b2NhdGlvbkNvbnRyb2xsZXIoKSB7DQotICAgICAgICByZXR1cm4gdGVzdENvbnRyb2xsZXI7DQotICAgIH0NCi0gICAgDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jbGllbnQvSW52YWxpZEVQUlRlc3RzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2xpZW50L0ludmFsaWRFUFJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmUyNzdmLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jbGllbnQvSW52YWxpZEVQUlRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKiANCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqICAgICAgDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jbGllbnQ7DQotDQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5CaW5kaW5nUHJvdmlkZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5EaXNwYXRjaDsNCi1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQotDQotLyoqDQotICogVGVzdCBmb3IgdGhlIGNvcnJlY3QgZXhjZXB0aW9ucyBpZiBhbiBpbnZhbGlkIEVQUiBpcyBzcGVjaWZpZWQuDQotICovDQotcHVibGljIGNsYXNzIEludmFsaWRFUFJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsNCi0NCi0gICAgcHJpdmF0ZSBRTmFtZSBzZXJ2aWNlTmFtZSA9IG5ldyBRTmFtZSgiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIiLCAiU3RyaW5nUHJvdmlkZXJTZXJ2aWNlIik7DQotICAgIHByaXZhdGUgUU5hbWUgcG9ydE5hbWUgPSBuZXcgUU5hbWUoImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyIiwgIlNpbXBsZVByb3ZpZGVyU2VydmljZVNPQVAxMXBvcnQwIik7DQotDQotICAgIHByaXZhdGUgU3RyaW5nIENBTk5PVF9JTkZFUl9FWENFUFRJT04gPSAiVGhlIHN5c3RlbSBjYW5ub3QgaW5mZXIgdGhlIHRyYW5zcG9ydCBpbmZvcm1hdGlvbiBmcm9tIHRoZSI7DQotICAgIA0KLSAgICAvKioNCi0gICAgICogVmFsaWRhdGUgdGhhdCB3ZSBnZXQgYSByZWFvbnNhYmx5IGRlc3JpcHRpdmUgZXhjZXB0aW9uIGlmIHRoZSBUcmFuc3BvcnRPdXQNCi0gICAgICogY2FuJ3QgYmUgZm91bmQgZm9yIGEgYmFkIEVQUiBmb3JtYXQuDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZEVQUkZvcm1hdCgpIHsNCi0gICAgICAgIFN0cmluZyBlbmRwb2ludFVybCA9ICJJbnZhbGlkX0VQUiBqbXM6L3F1ZXVlP2Rlc3RpbmF0aW9uPWptcy9Td2FwUXVldWUmY29ubmVjdGlvbkZhY3Rvcnk9am1zL1N3YXBRQ0YmdGFyZ2V0U2VydmljZT1Td2FwSk1TQmVhbiZpbml0aWFsQ29udGV4dEZhY3Rvcnk9Y29tLmlibS53ZWJzcGhlcmUubmFtaW5nLldzbkluaXRpYWxDb250ZXh0RmFjdG9yeSZqbmRpUHJvdmlkZXJVUkw9Y29yYmFsb2M6aWlvcDpzYXQuaHVyc2xleS5pYm0uY29tOjk4MTAsaWlvcDpzYXQuaHVyc2xleS5pYm0uY29tOjk4MTEiOw0KLSAgICAgICAgRGlzcGF0Y2g8U3RyaW5nPiBkaXNwYXRjaCA9IGdldERpc3BhdGNoKGVuZHBvaW50VXJsKTsNCi0gICAgICAgIA0KLSAgICAgICAgU3RyaW5nIHJlcXVlc3QgPSAiPGludm9rZT5oZWxsbyB3b3JsZDwvaW52b2tlPiI7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIFN0cmluZyByZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0gICAgICAgICAgICBmYWlsKCJTaG91bGQgaGF2ZSBjYXVnaHQgZXhjZXB0aW9uIGZvciBpbnZhbGlkIEVQUiAiICsgZW5kcG9pbnRVcmwpOw0KLSAgICAgICAgfSBjYXRjaCAoV2ViU2VydmljZUV4Y2VwdGlvbiBleCkgew0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZXgudG9TdHJpbmcoKS5jb250YWlucyhDQU5OT1RfSU5GRVJfRVhDRVBUSU9OKSk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgcHJpdmF0ZSBEaXNwYXRjaDxTdHJpbmc+IGdldERpc3BhdGNoKFN0cmluZyBlbmRwb2ludFVybCkgew0KLSAgICAgICAgU2VydmljZSBzdmMgPSBTZXJ2aWNlLmNyZWF0ZShzZXJ2aWNlTmFtZSk7DQotICAgICAgICBzdmMuYWRkUG9ydChwb3J0TmFtZSwgbnVsbCwgZW5kcG9pbnRVcmwpOw0KLSAgICAgICAgDQotICAgICAgICBEaXNwYXRjaDxTdHJpbmc+IGRpc3BhdGNoID0gc3ZjDQotICAgICAgICAgICAgICAgIC5jcmVhdGVEaXNwYXRjaChwb3J0TmFtZSwgU3RyaW5nLmNsYXNzLCBTZXJ2aWNlLk1vZGUuUEFZTE9BRCk7DQotICAgICAgICANCi0gICAgICAgIC8vIEZvcmNlIHNvYXAgYWN0aW9uIGJlY2F1c2Ugd2UgYXJlIHBhc3NpbmcganVuayBvdmVyIHRoZSB3aXJlDQotICAgICAgICBkaXNwYXRjaC5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dChCaW5kaW5nUHJvdmlkZXIuU09BUEFDVElPTl9VU0VfUFJPUEVSVFksIEJvb2xlYW4uVFJVRSk7DQotICAgICAgICBkaXNwYXRjaC5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dChCaW5kaW5nUHJvdmlkZXIuU09BUEFDVElPTl9VUklfUFJPUEVSVFksImh0dHA6Ly9zdHJpbmdwcm92aWRlci5zYW1wbGUudGVzdC5vcmcvZWNob1N0cmluZyIpOw0KLSAgICAgICAgDQotICAgICAgICByZXR1cm4gZGlzcGF0Y2g7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NsaWVudC9Qcm9wZXJ0eVZhbHVlVGVzdHMuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jbGllbnQvUHJvcGVydHlWYWx1ZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiNTQ2ZjQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NsaWVudC9Qcm9wZXJ0eVZhbHVlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY2xpZW50OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51bml0VGVzdC5UZXN0TG9nZ2VyOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwud3MuQmluZGluZ1Byb3ZpZGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5EaXNwYXRjaDsKLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsKLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZS5Nb2RlOwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQSBzdWl0ZSB0byB0ZXN0IHRoZSB2YWxpZGF0aW9uIG9mIHRoZSBjbGllbnQgcmVxdWVzdC9yZXNwb25zZSBjb250ZXh0IHByb3BlcnRpZXMKLSAqLwotcHVibGljIGNsYXNzIFByb3BlcnR5VmFsdWVUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICAKLSAgICBwdWJsaWMgUHJvcGVydHlWYWx1ZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0SW52YWxpZENsaWVudFByb3BlcnRpZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU2VydmljZSBzdmMgPSBTZXJ2aWNlLmNyZWF0ZShuZXcgUU5hbWUoImh0dHA6Ly90ZXN0IiwgIlRlc3RTZXJ2aWNlIikpOwotICAgICAgICBRTmFtZSBwb3J0UU5hbWUgPSBuZXcgUU5hbWUoImh0dHA6Ly90ZXN0IiwgIlRlc3RQb3J0Iik7Ci0gICAgICAgIHN2Yy5hZGRQb3J0KHBvcnRRTmFtZSwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIERpc3BhdGNoIGRpc3BhdGNoID0gc3ZjLmNyZWF0ZURpc3BhdGNoKHBvcnRRTmFtZSwgU3RyaW5nLmNsYXNzLCBNb2RlLlBBWUxPQUQpOwotICAgICAgICAKLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtYXAgPSBkaXNwYXRjaC5nZXRSZXF1ZXN0Q29udGV4dCgpOwotICAgICAgICAKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1hcC5wdXQoQmluZGluZ1Byb3ZpZGVyLkVORFBPSU5UX0FERFJFU1NfUFJPUEVSVFksIG5ldyBJbnRlZ2VyKDQpKTsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoV2ViU2VydmljZUV4Y2VwdGlvbiB3c2UpIHsKLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJbcGFzc10gLSBleGNlcHRpb24gdGhyb3duIGFzIGV4cGVjdGVkIik7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgbWFwLnB1dChCaW5kaW5nUHJvdmlkZXIuVVNFUk5BTUVfUFJPUEVSVFksIG5ldyBJbnRlZ2VyKDQpKTsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoV2ViU2VydmljZUV4Y2VwdGlvbiB3c2UpIHsKLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJbcGFzc10gLSBleGNlcHRpb24gdGhyb3duIGFzIGV4cGVjdGVkIik7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtYXAucHV0KEJpbmRpbmdQcm92aWRlci5QQVNTV09SRF9QUk9QRVJUWSwgbmV3IEludGVnZXIoNCkpOwotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChXZWJTZXJ2aWNlRXhjZXB0aW9uIHdzZSkgewotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIltwYXNzXSAtIGV4Y2VwdGlvbiB0aHJvd24gYXMgZXhwZWN0ZWQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtYXAucHV0KEJpbmRpbmdQcm92aWRlci5TRVNTSU9OX01BSU5UQUlOX1BST1BFUlRZLCAidHJ1ZSIpOwotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChXZWJTZXJ2aWNlRXhjZXB0aW9uIHdzZSkgewotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIltwYXNzXSAtIGV4Y2VwdGlvbiB0aHJvd24gYXMgZXhwZWN0ZWQiKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1hcC5wdXQoQmluZGluZ1Byb3ZpZGVyLlNPQVBBQ1RJT05fVVNFX1BST1BFUlRZLCAidHJ1ZSIpOwotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChXZWJTZXJ2aWNlRXhjZXB0aW9uIHdzZSkgewotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIltwYXNzXSAtIGV4Y2VwdGlvbiB0aHJvd24gYXMgZXhwZWN0ZWQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtYXAucHV0KEJpbmRpbmdQcm92aWRlci5TT0FQQUNUSU9OX1VSSV9QUk9QRVJUWSwgbmV3IEludGVnZXIoNCkpOwotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChXZWJTZXJ2aWNlRXhjZXB0aW9uIHdzZSkgewotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIltwYXNzXSAtIGV4Y2VwdGlvbiB0aHJvd24gYXMgZXhwZWN0ZWQiKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NsaWVudC9SZWxlYXNlU2VydmljZVRlc3RzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2xpZW50L1JlbGVhc2VTZXJ2aWNlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODAzMzkzYS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2xpZW50L1JlbGVhc2VTZXJ2aWNlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwMSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKiANCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqICAgICAgDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jbGllbnQ7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkRlc2NyaXB0aW9uVGVzdFV0aWxzMjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5FbmRwb2ludERlc2NyaXB0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLlNlcnZpY2VEZXNjcmlwdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zcGkuQ2xpZW50TWV0YWRhdGFUZXN0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNwaS5TZXJ2aWNlRGVsZWdhdGU7DQotDQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOw0KLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VDbGllbnQ7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOw0KLQ0KLWltcG9ydCBqYXZhLmlvLkZpbGU7DQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOw0KLQ0KLS8qKg0KLSAqIFZlcmlmeSB0aGF0IHdoZW4gYSBTZXJ2aWNlIChpLmUuIGEgSkFYV1MgU2VydmljZSBEZWxlZ2F0ZSBpbnN0YW5jZSkgaXMgbm8gbG9uZ2VyIG5lZWRlZA0KLSAqIHRoZSByZXNvdXJjZXMgaXQgdXNlcyBhcmUgY2xlYW5lZCB1cCAoaS5lIHRoZSBFbmRwb2ludERlc2NyaXB0aW9uLCBBeGlzU2VydmljZSwgZXRjKS4NCi0gKiBUaGUgcmVsZWFzZSBjYW4gYmUgZHJpdmVuIGJ5IGFuIGV4cGxpY2l0IHByb3ByaWV0YXJ5IGNhbGwgb3IgdmlhIHRoZSBmaW5hbGl6ZXIgb24gdGhlDQotICogU2VydmljZURlbGVnYXRlIHRoYXQgaXMgcnVuIGR1cmluZyBnYXJiYWdlIGNvbGxlY3Rpb24uDQotICovDQotcHVibGljIGNsYXNzIFJlbGVhc2VTZXJ2aWNlVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7DQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgbmFtZXNwYWNlVVJJID0gImh0dHA6Ly9kaXNwYXRjaC5jbGllbnQuamF4d3MuYXhpczIuYXBhY2hlLm9yZyI7DQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgc3ZjTG9jYWxQYXJ0ID0gInN2Y0xvY2FsUGFydCI7DQotICAgIA0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGR5bmFtaWNQb3J0MSA9ICJkeW5hbWljUG9ydDEiOw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGJpbmRpbmdJRDEgPSBudWxsOw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGVwcjEgPSBudWxsOw0KLQ0KLSAgICAvKioNCi0gICAgICogV2hlbiBhIFNlcnZpY2VEZWxlZ2F0ZSB3aWxsIG5vdCBiZSB1c2VkIGFueW1vcmUsIGEgY2xvc2UgY2FsbCBvbiBpdCBzaG91bGQgcmVsZWFzZQ0KLSAgICAgKiB0aGUgQXhpc1NlcnZpY2VzIGFuZCBzdWNoIGl0IGhvbGRzLiBWZXJpZnkgdGhpcyBmb3IgZHluYW1pYyBwb3J0cy4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJ2aWNlUmVsZWFzZUR5bmFtaWNQb3J0KCkgew0KLSAgICAgICAgUU5hbWUgc3ZjUU4gPSBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBzdmNMb2NhbFBhcnQpOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBDbGllbnRNZXRhZGF0YVRlc3QuaW5zdGFsbENhY2hpbmdGYWN0b3J5KCk7DQotDQotICAgICAgICAgICAgU2VydmljZSBzdmMxID0gU2VydmljZS5jcmVhdGUoc3ZjUU4pOw0KLSAgICAgICAgICAgIFFOYW1lIHBvcnRRTiA9IG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIGR5bmFtaWNQb3J0MSk7DQotICAgICAgICAgICAgc3ZjMS5hZGRQb3J0KHBvcnRRTiwgYmluZGluZ0lEMSwgZXByMSk7DQotDQotICAgICAgICAgICAgLy8gVXNlciBpbnRlcm5hbCBzdGF0ZSB0byB2ZXJpZnkgdGhlIHBvcnQgaW5mb3JtYXRpb24gYmVmb3JlIGFuZCBhZnRlciB0aGUgY2xvc2UNCi0gICAgICAgICAgICBTZXJ2aWNlRGVsZWdhdGUgZGVsZWdhdGUgPSBEZXNjcmlwdGlvblRlc3RVdGlsczIuZ2V0U2VydmljZURlbGVnYXRlKHN2YzEpOw0KLSAgICAgICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzdmNEZXNjID0gZGVsZWdhdGUuZ2V0U2VydmljZURlc2NyaXB0aW9uKCk7DQotICAgICAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlcERlc2M9IHN2Y0Rlc2MuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbihwb3J0UU4sIGRlbGVnYXRlKTsNCi0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGVwRGVzYyk7DQotICAgICAgICAgICAgQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZyA9IHN2Y0Rlc2MuZ2V0QXhpc0NvbmZpZ0NvbnRleHQoKS5nZXRBeGlzQ29uZmlndXJhdGlvbigpOw0KLSAgICAgICAgICAgIEhhc2hNYXAgYXhpc1NlcnZpY2VzID0gYXhpc0NvbmZpZy5nZXRTZXJ2aWNlcygpOw0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBheGlzU2VydmljZXMuc2l6ZSgpKTsNCi0NCi0gICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNwaS5TZXJ2aWNlRGVsZWdhdGUucmVsZWFzZVNlcnZpY2Uoc3ZjMSk7DQotDQotICAgICAgICAgICAgYXhpc1NlcnZpY2VzID0gYXhpc0NvbmZpZy5nZXRTZXJ2aWNlcygpOw0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCBheGlzU2VydmljZXMuc2l6ZSgpKTsNCi0NCi0gICAgICAgICAgICBlcERlc2M9IHN2Y0Rlc2MuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbihwb3J0UU4sIGRlbGVnYXRlKTsNCi0gICAgICAgICAgICBhc3NlcnROdWxsKGVwRGVzYyk7ICAgICAgICAgICAgICAgIA0KLQ0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsNCi0gICAgICAgICAgICBmYWlsKCJDYXVnaHQgdGhyb3dhYmxlICIgKyB0KTsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgICAgQ2xpZW50TWV0YWRhdGFUZXN0LnJlc3RvcmVPcmlnaW5hbEZhY3RvcnkoKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogU2ltcGxlIHRlc3QgdG8gY3JlYXRlIGEgc2VydmljZSwgYWRkIHF1aXRlIGEgZmV3IGR5bmFtaWMgcG9ydHMgdW5kZXIgaXQsIHRoZW4gcmVsZWFzZQ0KLSAgICAgKiB0aGUgc2VydmljZS4gVGhpcyB0ZXN0IGlzIG1vc3RseSBmb3IgZGVidWdnaW5nIHRoZSByZWxlYXNlIGxvZ2ljIG91dHNpZGUgdGhlIHRlc3RzIHRoYXQgDQotICAgICAqIGNyZWF0ZSBhIGxvdCBvZiBzZXJ2aWNlcyB0byB0ZXN0IGFuIE9PTSBpc24ndCBwcm9kdWNlZC4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJ2aWNlUmVsZWFzZVNpbmdsZVNlcnZpY2VEZXNjcmlwdGlvblJlbGVhc2UoKSB7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIENsaWVudE1ldGFkYXRhVGVzdC5pbnN0YWxsQ2FjaGluZ0ZhY3RvcnkoKTsNCi0NCi0gICAgICAgICAgICBRTmFtZSBzdmNRTiA9IG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIHN2Y0xvY2FsUGFydCk7DQotICAgICAgICAgICAgU2VydmljZSBzdmMxID0gU2VydmljZS5jcmVhdGUoc3ZjUU4pOw0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyBpKyspIHsNCi0gICAgICAgICAgICAgICAgUU5hbWUgcG9ydFFOID0gbmV3IFFOYW1lKG5hbWVzcGFjZVVSSSwgZHluYW1pY1BvcnQxICsgIl8iICsgaSk7DQotICAgICAgICAgICAgICAgIHN2YzEuYWRkUG9ydChwb3J0UU4sIGJpbmRpbmdJRDEsIGVwcjEpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNwaS5TZXJ2aWNlRGVsZWdhdGUucmVsZWFzZVNlcnZpY2Uoc3ZjMSk7DQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgew0KLSAgICAgICAgICAgIGZhaWwoIkNhdWdodCB0aHJvd2FibGUgIiArIHQpOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgICBDbGllbnRNZXRhZGF0YVRlc3QucmVzdG9yZU9yaWdpbmFsRmFjdG9yeSgpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogQ3JlYXRlIGEgYnVuY2ggb2Ygc2VydmljZXMgd2l0aCBhIGJ1bmNoIG9mIHBvcnRzIHVuZGVyIGVhY2gsIGNsb3NpbmcgdGhlIHNlcnZpY2UNCi0gICAgICogYmVmb3JlIHRoZSBuZXh0IG9uZSBpcyBjcmVhdGVkLiAgVGhpcyBzaG91bGQgcmVsZWFzZSB0aGUgcmVzb3VyY2VzIGZvciB0aGF0IHNlcnZpY2UuICBUaGUNCi0gICAgICogbnVtYmVyIG9mIHNlcnZpY2VzIGFuZCBwb3J0cyBjcmVhdGVkIGlzIGxhcmdlIGVub3VnaCB0byBjYXVzZSBhbiBPT00gaWYgdGhlIHJlbGVhc2UgaXNuJ3QNCi0gICAgICogYmVpbmcgZG9uZSBjb3JyZWN0bHkuDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVTZXJ2aWNlTXVsdGlwbGVQb3J0UmVsZWFzZUxvb3AoKSB7DQotICAgICAgICAvLyBDcmVhdGUgYSBidW5jaCBvZiBkaWZmZXJlbnQgc2VydmljZXMsIG1ha2Ugc3VyZSB0aGUgc2VydmljZSBkZXNjIGZpbmFsaXplciBpcyBjYWxsZWQNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgQ2xpZW50TWV0YWRhdGFUZXN0Lmluc3RhbGxDYWNoaW5nRmFjdG9yeSgpOw0KLQ0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwMDsgaSsrKSB7DQotICAgICAgICAgICAgICAgIFFOYW1lIHN2Y1FOID0gbmV3IFFOYW1lKG5hbWVzcGFjZVVSSSwgc3ZjTG9jYWxQYXJ0ICsgIl8iICsgaSk7DQotICAgICAgICAgICAgICAgIFNlcnZpY2Ugc3ZjMSA9IFNlcnZpY2UuY3JlYXRlKHN2Y1FOKTsNCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAyMDA7IGorKykgew0KLSAgICAgICAgICAgICAgICAgICAgUU5hbWUgcG9ydFFOID0gbmV3IFFOYW1lKG5hbWVzcGFjZVVSSSwgZHluYW1pY1BvcnQxICsgIl9zdmNfIiArIGkgKyAiX3BvcnRfIiArIGopOw0KLSAgICAgICAgICAgICAgICAgICAgc3ZjMS5hZGRQb3J0KHBvcnRRTiwgYmluZGluZ0lEMSwgZXByMSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zcGkuU2VydmljZURlbGVnYXRlLnJlbGVhc2VTZXJ2aWNlKHN2YzEpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7DQotICAgICAgICAgICAgZmFpbCgiQ2F1Z2h0IHRocm93YWJsZSAiICsgdCk7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICAgIENsaWVudE1ldGFkYXRhVGVzdC5yZXN0b3JlT3JpZ2luYWxGYWN0b3J5KCk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBUZXN0IHRoYXQgY3JlYXRpbmcgYSBsYXJnZSBudW1iZXIgb2Ygc2VydmljZXMgYW5kIHBvcnRzLCBhbmQgdGhlbiBoYXZpbmcgdGhlbSByZWxlYXNlZCBieQ0KLSAgICAgKiB0aGUgZmluYWxpemVycyBkdXJpbmcgZ2FyYmFnZSBjb2xsZWN0aW9ucyBkb2VzIG5vdCBwcm9kdWNlIG9uIE91dCBvZiBNZW1vcnkgRXJyb3IuDQotICAgICAqIA0KLSAgICAgKiBOT1RFOiBUaGlzIHRlc3QgaXMgZGlzYWJsZWQgYmVjYXVzZSBmb3JjaW5nIGdhcmJhZ2UgY29sbGVjdGlvbiBpcyBhbiBpbmV4YWN0IHNjaWVuY2UNCi0gICAgICogYXQgYmVzdC4gIFlvdSBjYW4gb25seSBhc2sgdGhlIEpWTSB0byBjb25zaWRlciBkb2luZyBHQywgYW5kIHRoYXQgYmVoYXZlcyBkaWZmZXJudGx5DQotICAgICAqIG9uIGRpZmZlcmVudCBKVk1TLiAgU28sIHRoZXJlJ3Mgbm8gcmVsaWFibGUgd2F5IHRvIG1ha2Ugc3VyZSB0aGlzIHRlc3QgcnVucyBvbiB2YXJpb3VzDQotICAgICAqIEpWTXMuICBTbywgaXQgaXMgZGlzYWJsZWQuICBTZWUgdGhlIHRlc3QgdGhhdCBydW5ucyBpbiBhIHNpbWlsYXIgbG9vcCBjcmVhdGluZyBsb3RzIG9mIA0KLSAgICAgKiBzZXJ2aWNlcyBhbmQgcG9ydHMsIGFuZCB0aGVuIGV4cGxpY2l0bHkgY2FsbHMgdGhlIHJlbGVzZSBtZXRob2QuICBUaGF0IHRlc3Qgc2hvdWxkIA0KLSAgICAgKiByZWxpYWJseSBhbmQgcHJlZGljdGFibHkgbm90IHByb2R1Y2UgYW4gT09NIGJlY2F1c2Ugb2YgdGhlIGV4cGxpY2l0IHJlbGVhc2UgY2FsbC4gIA0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgX0RJU0FCTEVEX3Rlc3RTZXJ2aWNlUmVsZWFzZVNlcnZpY2VEZXNjcmlwdGlvbkZpbmFsaXplcigpIHsNCi0gICAgICAgIC8vIENyZWF0ZSBhIGJ1bmNoIG9mIGRpZmZlcmVudCBzZXJ2aWNlcywgbWFrZSBzdXJlIHRoZSBzZXJ2aWNlIGRlc2MgZmluYWxpemVyIGlzIGNhbGxlZA0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBDbGllbnRNZXRhZGF0YVRlc3QuaW5zdGFsbENhY2hpbmdGYWN0b3J5KCk7DQotDQotICAgICAgICAgICAgZmluYWwgaW50IE1BWF9PT01fQ09VTlQgPSA1Ow0KLSAgICAgICAgICAgIGludCBvb21Db3VudFNlcnZpY2UgPSAwOw0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwMDsgaSsrKSB7DQotICAgICAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgICAgICBpbnQgb29tQ291bnQgPSAwOw0KLSAgICAgICAgICAgICAgICAgICAgUU5hbWUgc3ZjUU4gPSBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBzdmNMb2NhbFBhcnQgKyAiXyIgKyBpKTsNCi0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ3JlYXRpbmcgc2VydmljZSAiICsgc3ZjUU4pOw0KLSAgICAgICAgICAgICAgICAgICAgU2VydmljZSBzdmMxID0gU2VydmljZS5jcmVhdGUoc3ZjUU4pOw0KLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAyMDA7IGorKykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFOYW1lIHBvcnRRTiA9IG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIGR5bmFtaWNQb3J0MSArICJfc3ZjXyIgKyBpICsgIl9wb3J0XyIgKyBqKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJBZGRpbmcgcG9ydCAiICsgcG9ydFFOKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ZjMS5hZGRQb3J0KHBvcnRRTiwgYmluZGluZ0lEMSwgZXByMSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBhdXNlIGV2ZXJ5IHNvIG9mdGVuIHRvIGdpdmUgdGhlIGdhcmJhZ2UgY29sbGVjdGlvbiB0aHJlYWQgYSBjaGFuY2UgdG8gcnVuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoaiA+IDApICYmIChqICUgNTApID09IDApIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUGF1c2luZyBwb3J0IGFkZCBmb3IgR0MgdG8gcnVuIik7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoNTAwKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE91dE9mTWVtb3J5RXJyb3IgZSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNhdWdodCBPT00gbnVtYmVyICIgKyArK29vbUNvdW50KTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9vbUNvdW50IDw9IE1BWF9PT01fQ09VTlQpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU2xlZXBpbmcgdG8gYWxsb3cgZm9yIEdDIGFmdGVyIE9PTSBjYXVnaHQiKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxNTAwMCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIldha2luZyB1cCBhbmQgZm9jaW5nIGdjIik7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZ2MoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZ2MoKSBtZXRob2QgcmV0dXJuZWQ7IGNvbnRpbnVpbmcgbG9vcCIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFpbCAoIk1heGltdW0gT09NIGNvdW50IGV4Y2VlZGVkICIgKyBNQVhfT09NX0NPVU5UKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIC8vIGRvbid0IGNhbGwgcmVsZWFzZTsgdGhlIGZpbmFsaXplciBzaG91bGQgZG8gaXQNCi0vLyAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc3BpLlNlcnZpY2VEZWxlZ2F0ZS5yZWxlYXNlU2VydmljZShzdmMxKTsNCi0NCi0gICAgICAgICAgICAgICAgICAgIC8vIFBhdXNlIHRvIGdpdmUgdGhlIGdhcmJhZ2UgY29sbGVjdGlvbiB0aHJlYWQgYSBjaGFuY2UgdG8gcnVuDQotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlBhdXNpbmcgc2VydmljZSBhZGQgZm9yIEdDIHRvIHJ1biIpOw0KLSAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDUwMCk7DQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE91dE9mTWVtb3J5RXJyb3IgZSkgew0KLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDYXVnaHQgU2VydmljZSBPT00gbnVtYmVyICIgKyArK29vbUNvdW50U2VydmljZSk7DQotICAgICAgICAgICAgICAgICAgICBpZiAob29tQ291bnRTZXJ2aWNlIDw9IE1BWF9PT01fQ09VTlQpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlNsZWVwaW5nIHRvIGFsbG93IGZvciBHQyBhZnRlciBTZXJ2aWNlIE9PTSBjYXVnaHQiKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTUwMDApOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiV2FraW5nIHVwIGFuZCBmb3JjaW5nIGdjIik7DQotICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmdjKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJGb3JjZWQgZ2MgY29tcGxldGUsIGNvbnRpbnVpbmcgc2VydmljZSBsb29wIik7DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZhaWwgKCJNYXhpbXVtIFNlcnZjaWNlIE9PTSBjb3VudCBleGNlZWRlZCAiICsgTUFYX09PTV9DT1VOVCk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgew0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGVzdCBmYWlsZWQsIGNhdWdodDogIiArIHQudG9TdHJpbmcoKSk7DQotICAgICAgICAgICAgdC5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgICAgICBmYWlsKCJDYXVnaHQgdGhyb3dhYmxlICIgKyB0KTsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgICAgQ2xpZW50TWV0YWRhdGFUZXN0LnJlc3RvcmVPcmlnaW5hbEZhY3RvcnkoKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFZlcmlmeSB0aGF0IGFmdGVyIGEgc2VydmljZSBpcyByZWxlYXNlZCwgaXQgY2FuIGJlIHJlLXVzZWQgd2l0aCB0aGUgc2FtZSBkeW5hbWljIHBvcnRzDQotICAgICAqIGJlaW5nIGFkZGVkIA0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdFNlcnZpY2VSZXVzZUR5bmFtaWNQb3J0KCkgew0KLSAgICAgICAgUU5hbWUgc3ZjUU4gPSBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBzdmNMb2NhbFBhcnQpOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBDbGllbnRNZXRhZGF0YVRlc3QuaW5zdGFsbENhY2hpbmdGYWN0b3J5KCk7DQotDQotICAgICAgICAgICAgU2VydmljZSBzdmMxID0gU2VydmljZS5jcmVhdGUoc3ZjUU4pOw0KLSAgICAgICAgICAgIFFOYW1lIHBvcnRRTiA9IG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIGR5bmFtaWNQb3J0MSk7DQotICAgICAgICAgICAgc3ZjMS5hZGRQb3J0KHBvcnRRTiwgYmluZGluZ0lEMSwgZXByMSk7DQotDQotICAgICAgICAgICAgLy8gVXNlIGludGVybmFsIHN0YXRlIHRvIHZlcmlmeSBhbGwgaXMgd2VsbA0KLSAgICAgICAgICAgIFNlcnZpY2VEZWxlZ2F0ZSBkZWxlZ2F0ZTEgPSBEZXNjcmlwdGlvblRlc3RVdGlsczIuZ2V0U2VydmljZURlbGVnYXRlKHN2YzEpOw0KLSAgICAgICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzdmNEZXNjMSA9IGRlbGVnYXRlMS5nZXRTZXJ2aWNlRGVzY3JpcHRpb24oKTsNCi0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHN2Y0Rlc2MxKTsNCi0gICAgICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVwRGVzYzE9IHN2Y0Rlc2MxLmdldEVuZHBvaW50RGVzY3JpcHRpb24ocG9ydFFOLCBkZWxlZ2F0ZTEpOw0KLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoZXBEZXNjMSk7DQotICAgICAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UxID0gZXBEZXNjMS5nZXRBeGlzU2VydmljZSgpOw0KLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYXhpc1NlcnZpY2UxKTsNCi0gICAgICAgICAgICBBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlnMSA9IHN2Y0Rlc2MxLmdldEF4aXNDb25maWdDb250ZXh0KCkuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKTsNCi0gICAgICAgICAgICBIYXNoTWFwIGF4aXNTZXJ2aWNlczEgPSBheGlzQ29uZmlnMS5nZXRTZXJ2aWNlcygpOw0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBheGlzU2VydmljZXMxLnNpemUoKSk7DQotDQotICAgICAgICAgICAgLy8gQ2xvc2UgdGhlIGRlbGVnYXRlLCB3aGljaCBzaG91bGQgcmVsZWFzZSByZXNvdXJjZXMgYW5kIHJlbW92ZSBvYmplY3RzIGZyb20gY2FjaGVzDQotICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zcGkuU2VydmljZURlbGVnYXRlLnJlbGVhc2VTZXJ2aWNlKHN2YzEpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIFNlcnZpY2Ugc3ZjMiA9IFNlcnZpY2UuY3JlYXRlKHN2Y1FOKTsNCi0gICAgICAgICAgICBzdmMyLmFkZFBvcnQocG9ydFFOLCBiaW5kaW5nSUQxLCBlcHIxKTsNCi0NCi0gICAgICAgICAgICAvLyBVc2UgaW50ZXJuYWwgc3RhdGUgdG8gdmVyaWZ5IGFsbCBpcyB3ZWxsOyBjb21wYXJlIHRvIHZhbHVlcyBmcm9tIHRoZSBmaXJzdCB0aW1lDQotICAgICAgICAgICAgLy8gYXJvdW5kIHRvIG1ha2Ugc3VyZSB0aGUgY2FjaGUgdmFsdWVzIGZvciB0aGluZ3MgbGlrZSB0aGUgU2VydmljZURlc2NyaXB0aW9uIGdvdCANCi0gICAgICAgICAgICAvLyBjbGVhcmVkIG91dCB3aGVuIHRoZSBsYXN0IFNlcnZpY2VEZWxlZ2F0ZSAoaW4gdGhlIHRlc3QgdGhlIG9ubHkgb25lKSByZWxlc2FlZA0KLSAgICAgICAgICAgIC8vIHRoZSByZXNvdXJjZXMuDQotICAgICAgICAgICAgU2VydmljZURlbGVnYXRlIGRlbGVnYXRlMiA9IERlc2NyaXB0aW9uVGVzdFV0aWxzMi5nZXRTZXJ2aWNlRGVsZWdhdGUoc3ZjMik7DQotICAgICAgICAgICAgYXNzZXJ0Tm90U2FtZShkZWxlZ2F0ZTEsIGRlbGVnYXRlMik7DQotICAgICAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHN2Y0Rlc2MyID0gZGVsZWdhdGUyLmdldFNlcnZpY2VEZXNjcmlwdGlvbigpOw0KLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoc3ZjRGVzYzIpOw0KLSAgICAgICAgICAgIGFzc2VydE5vdFNhbWUoc3ZjRGVzYzEsIHN2Y0Rlc2MyKTsNCi0gICAgICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVwRGVzYzI9IHN2Y0Rlc2MyLmdldEVuZHBvaW50RGVzY3JpcHRpb24ocG9ydFFOLCBkZWxlZ2F0ZTIpOw0KLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoZXBEZXNjMik7DQotICAgICAgICAgICAgYXNzZXJ0Tm90U2FtZShlcERlc2MxLCBlcERlc2MyKTsNCi0gICAgICAgICAgICBBeGlzU2VydmljZSBheGlzU2VydmljZTIgPSBlcERlc2MyLmdldEF4aXNTZXJ2aWNlKCk7DQotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChheGlzU2VydmljZTIpOw0KLSAgICAgICAgICAgIGFzc2VydE5vdFNhbWUoYXhpc1NlcnZpY2UxLCBheGlzU2VydmljZTIpOw0KLSAgICAgICAgICAgIEF4aXNDb25maWd1cmF0aW9uIGF4aXNDb25maWcyID0gc3ZjRGVzYzIuZ2V0QXhpc0NvbmZpZ0NvbnRleHQoKS5nZXRBeGlzQ29uZmlndXJhdGlvbigpOw0KLSAgICAgICAgICAgIEhhc2hNYXAgYXhpc1NlcnZpY2VzMiA9IGF4aXNDb25maWcyLmdldFNlcnZpY2VzKCk7DQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGF4aXNTZXJ2aWNlczIuc2l6ZSgpKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBWZXJpZnkgdGhlIHNlcnZpY2UgZnJvbSB0aGUgbWFwIGFuZCBFbmRwb2ludERlc2MgYXJlIHRoZSBzYW1lDQotICAgICAgICAgICAgLy8gU2luY2UgdGhlcmUncyBvbmx5IG9uZSBlbGVtZW50IGluIHRoZSBtYXAsIHdlIGNhbiBnZXQgaXQgZGlyZWN0bHkgb2ZmIHRoZSBpdGVyYXRvcg0KLSAgICAgICAgICAgIGFzc2VydFNhbWUoYXhpc1NlcnZpY2UyLCAoKE1hcC5FbnRyeSkgYXhpc1NlcnZpY2VzMi5lbnRyeVNldCgpLml0ZXJhdG9yKCkubmV4dCgpKS5nZXRWYWx1ZSgpKTsNCi0NCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgICAgQ2xpZW50TWV0YWRhdGFUZXN0LnJlc3RvcmVPcmlnaW5hbEZhY3RvcnkoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogVmVyaWZ5IHRoYXQgaWYgbXVsdGlwbGUgc2VydmljZSBhcmUgc2hhcmluZyBhIHNlcnZpY2UgZGVzY3JpcHRpb24sIHRoZSByZWxlYXNlIG9mDQotICAgICAqIHJlc291cmNlcyBkb2VzIG5vdCBoYXBwZW4gb24gdGhlIGZpcnN0IGNsb3NlLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdE11bHRpcGxlU2VydmljZU11bHRpcGxlUG9ydFJlbGVhc2UoKSB7DQotICAgICAgICBRTmFtZSBzdmNRTiA9IG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIHN2Y0xvY2FsUGFydCk7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIENsaWVudE1ldGFkYXRhVGVzdC5pbnN0YWxsQ2FjaGluZ0ZhY3RvcnkoKTsNCi0gICAgICAgICAgICBTZXJ2aWNlIHN2YzEgPSBTZXJ2aWNlLmNyZWF0ZShzdmNRTik7DQotICAgICAgICAgICAgU2VydmljZSBzdmMyID0gU2VydmljZS5jcmVhdGUoc3ZjUU4pOw0KLQ0KLSAgICAgICAgICAgIFFOYW1lIHBvcnRRTjEgPSBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBkeW5hbWljUG9ydDEpOw0KLSAgICAgICAgICAgIFFOYW1lIHBvcnRRTjIgPSBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBkeW5hbWljUG9ydDEgKyAiXzIiKTsNCi0gICAgICAgICAgICBzdmMxLmFkZFBvcnQocG9ydFFOMSxiaW5kaW5nSUQxLCBlcHIxKTsNCi0gICAgICAgICAgICBzdmMxLmFkZFBvcnQocG9ydFFOMiwgYmluZGluZ0lEMSwgZXByMSk7DQotDQotICAgICAgICAgICAgc3ZjMi5hZGRQb3J0KHBvcnRRTjEsYmluZGluZ0lEMSwgZXByMSk7DQotICAgICAgICAgICAgc3ZjMi5hZGRQb3J0KHBvcnRRTjIsIGJpbmRpbmdJRDEsIGVwcjEpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIFNlcnZpY2VEZWxlZ2F0ZSBzZDEgPSBEZXNjcmlwdGlvblRlc3RVdGlsczIuZ2V0U2VydmljZURlbGVnYXRlKHN2YzEpOw0KLSAgICAgICAgICAgIFNlcnZpY2VEZWxlZ2F0ZSBzZDIgPSBEZXNjcmlwdGlvblRlc3RVdGlsczIuZ2V0U2VydmljZURlbGVnYXRlKHN2YzIpOw0KLSAgICAgICAgICAgIGFzc2VydE5vdFNhbWUoc2QxLCBzZDIpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzdmNEZXNjMSA9IHNkMS5nZXRTZXJ2aWNlRGVzY3JpcHRpb24oKTsNCi0gICAgICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc3ZjRGVzYzIgPSBzZDIuZ2V0U2VydmljZURlc2NyaXB0aW9uKCk7DQotICAgICAgICAgICAgQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZyA9IHN2Y0Rlc2MxLmdldEF4aXNDb25maWdDb250ZXh0KCkuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKTsNCi0gICAgICAgICAgICBhc3NlcnRTYW1lKHN2Y0Rlc2MxLCBzdmNEZXNjMik7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlcERlc2MxX3BvcnQxID0gc3ZjRGVzYzEuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbihwb3J0UU4xLCBzZDEpOw0KLSAgICAgICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZXBEZXNjMl9wb3J0MSA9IHN2Y0Rlc2MxLmdldEVuZHBvaW50RGVzY3JpcHRpb24ocG9ydFFOMSwgc2QyKTsNCi0gICAgICAgICAgICBhc3NlcnRTYW1lKGVwRGVzYzFfcG9ydDEsIGVwRGVzYzJfcG9ydDEpOw0KLSAgICAgICAgICAgIEF4aXNTZXJ2aWNlIGF4aXNTdmMxX3BvcnQxID0gZXBEZXNjMV9wb3J0MS5nZXRBeGlzU2VydmljZSgpOw0KLSAgICAgICAgICAgIEF4aXNTZXJ2aWNlIGF4aXNTdmMyX3BvcnQxID0gZXBEZXNjMl9wb3J0MS5nZXRBeGlzU2VydmljZSgpOw0KLSAgICAgICAgICAgIGFzc2VydFNhbWUoYXhpc1N2YzFfcG9ydDEsIGF4aXNTdmMyX3BvcnQxKTsNCi0NCi0gICAgICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVwRGVzYzFfcG9ydDIgPSBzdmNEZXNjMS5nZXRFbmRwb2ludERlc2NyaXB0aW9uKHBvcnRRTjIsIHNkMSk7DQotICAgICAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlcERlc2MyX3BvcnQyID0gc3ZjRGVzYzEuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbihwb3J0UU4yLCBzZDIpOw0KLSAgICAgICAgICAgIGFzc2VydFNhbWUoZXBEZXNjMV9wb3J0MiwgZXBEZXNjMl9wb3J0Mik7DQotICAgICAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1N2YzFfcG9ydDIgPSBlcERlc2MxX3BvcnQyLmdldEF4aXNTZXJ2aWNlKCk7DQotICAgICAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1N2YzJfcG9ydDIgPSBlcERlc2MyX3BvcnQyLmdldEF4aXNTZXJ2aWNlKCk7DQotICAgICAgICAgICAgYXNzZXJ0U2FtZShheGlzU3ZjMV9wb3J0MiwgYXhpc1N2YzJfcG9ydDIpOw0KLQ0KLSAgICAgICAgICAgIC8vIEZpcnN0IGNsb3NlIHNob3VsZCBOT1QgY2xlYW51cCB0aGUgZW5kcG9pbnRzIHNpbmNlIHRoZSBvdGhlciBzZXJ2aWNlIGlzDQotICAgICAgICAgICAgLy8gc3RpbGwgdXNpbmcgdGhlbS4NCi0gICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNwaS5TZXJ2aWNlRGVsZWdhdGUucmVsZWFzZVNlcnZpY2Uoc3ZjMSk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHN2Y0Rlc2MyX2FmdGVyQ2xvc2UgPSBzZDIuZ2V0U2VydmljZURlc2NyaXB0aW9uKCk7DQotICAgICAgICAgICAgYXNzZXJ0U2FtZShzdmNEZXNjMiwgc3ZjRGVzYzJfYWZ0ZXJDbG9zZSk7DQotICAgICAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlcERlc2MyX3BvcnQxX2FmdGVyQ2xvc2UgPSANCi0gICAgICAgICAgICAgICAgc3ZjRGVzYzJfYWZ0ZXJDbG9zZS5nZXRFbmRwb2ludERlc2NyaXB0aW9uKHBvcnRRTjEsIHNkMik7DQotICAgICAgICAgICAgYXNzZXJ0U2FtZShlcERlc2MyX3BvcnQxLCBlcERlc2MyX3BvcnQxX2FmdGVyQ2xvc2UpOw0KLSAgICAgICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZXBEZXNjMl9wb3J0Ml9hZnRlckNsb3NlID0gDQotICAgICAgICAgICAgICAgIHN2Y0Rlc2MyX2FmdGVyQ2xvc2UuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbihwb3J0UU4yLCBzZDIpOw0KLSAgICAgICAgICAgIGFzc2VydFNhbWUoZXBEZXNjMl9wb3J0MiwgZXBEZXNjMl9wb3J0Ml9hZnRlckNsb3NlKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBBZGQgYSB0aGlyZCwgc2hvdWxkIHVzZSB0aGUgc2FtZQ0KLSAgICAgICAgICAgIFNlcnZpY2Ugc3ZjMyA9IFNlcnZpY2UuY3JlYXRlKHN2Y1FOKTsNCi0gICAgICAgICAgICBzdmMzLmFkZFBvcnQocG9ydFFOMSxiaW5kaW5nSUQxLCBlcHIxKTsNCi0gICAgICAgICAgICBzdmMzLmFkZFBvcnQocG9ydFFOMiwgYmluZGluZ0lEMSwgZXByMSk7DQotICAgICAgICAgICAgU2VydmljZURlbGVnYXRlIHNkMyA9IERlc2NyaXB0aW9uVGVzdFV0aWxzMi5nZXRTZXJ2aWNlRGVsZWdhdGUoc3ZjMyk7DQotICAgICAgICAgICAgYXNzZXJ0Tm90U2FtZShzZDIsIHNkMyk7DQotICAgICAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHN2Y0Rlc2MzID0gc2QzLmdldFNlcnZpY2VEZXNjcmlwdGlvbigpOw0KLSAgICAgICAgICAgIGFzc2VydFNhbWUoc3ZjRGVzYzJfYWZ0ZXJDbG9zZSwgc3ZjRGVzYzMpOw0KLSAgICAgICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZXBEZXNjM19wb3J0MSA9IHN2Y0Rlc2MzLmdldEVuZHBvaW50RGVzY3JpcHRpb24ocG9ydFFOMSwgc2QzKTsNCi0gICAgICAgICAgICBhc3NlcnRTYW1lKGVwRGVzYzNfcG9ydDEsIGVwRGVzYzJfcG9ydDFfYWZ0ZXJDbG9zZSk7DQotICAgICAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlcERlc2MzX3BvcnQyID0gc3ZjRGVzYzMuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbihwb3J0UU4yLCBzZDMpOw0KLSAgICAgICAgICAgIGFzc2VydFNhbWUoZXBEZXNjM19wb3J0MiwgZXBEZXNjMl9wb3J0Ml9hZnRlckNsb3NlKTsNCi0NCi0gICAgICAgICAgICAvLyBDbG9zZSB0aGUgMm5kIGRlbGVnYXRlIGFuZCBtYWtlIHN1cmUgY2FoY2VkIG9iamVjdHMgYXJlIHN0aWxsIHRoZXJlDQotICAgICAgICAgICAgLy8gc2luY2UgdGhlcmUncyBhIDNyZCBkZWxlZ2F0ZSBub3cNCi0gICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNwaS5TZXJ2aWNlRGVsZWdhdGUucmVsZWFzZVNlcnZpY2Uoc3ZjMik7DQotDQotICAgICAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHN2Y0Rlc2MzX2FmdGVyQ2xvc2UgPSBzZDMuZ2V0U2VydmljZURlc2NyaXB0aW9uKCk7DQotICAgICAgICAgICAgYXNzZXJ0U2FtZShzdmNEZXNjMywgc3ZjRGVzYzNfYWZ0ZXJDbG9zZSk7DQotICAgICAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlcERlc2MzX3BvcnQxX2FmdGVyQ2xvc2UgPSANCi0gICAgICAgICAgICAgICAgc3ZjRGVzYzNfYWZ0ZXJDbG9zZS5nZXRFbmRwb2ludERlc2NyaXB0aW9uKHBvcnRRTjEsIHNkMyk7DQotICAgICAgICAgICAgYXNzZXJ0U2FtZShlcERlc2MzX3BvcnQxLCBlcERlc2MzX3BvcnQxX2FmdGVyQ2xvc2UpOw0KLSAgICAgICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZXBEZXNjM19wb3J0Ml9hZnRlckNsb3NlID0gDQotICAgICAgICAgICAgICAgIHN2Y0Rlc2MzX2FmdGVyQ2xvc2UuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbihwb3J0UU4yLCBzZDMpOw0KLSAgICAgICAgICAgIGFzc2VydFNhbWUoZXBEZXNjM19wb3J0MiwgZXBEZXNjM19wb3J0Ml9hZnRlckNsb3NlKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBDbG9zZSB0aGUgbGFzdCBkZWxlZ2F0ZSB0aGVuIHZlcmlmeSBhbGwgdGhlIHNlcnZpY2VzIGhhdmUgYmVlbiByZW1vdmVkIA0KLSAgICAgICAgICAgIC8vIGZyb20gdGhlIEF4aXNDb25maWd1cmF0aW9uIA0KLSAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc3BpLlNlcnZpY2VEZWxlZ2F0ZS5yZWxlYXNlU2VydmljZShzdmMzKTsNCi0gICAgICAgICAgICBIYXNoTWFwIGF4aXNTZXJ2aWNlcyA9IGF4aXNDb25maWcuZ2V0U2VydmljZXMoKTsNCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgYXhpc1NlcnZpY2VzLnNpemUoKSk7DQotICAgICAgICAgICAgDQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICAgIENsaWVudE1ldGFkYXRhVGVzdC5yZXN0b3JlT3JpZ2luYWxGYWN0b3J5KCk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXZpY2VVc2VBZnRlckNsb3NlKCkgew0KLSAgICAgICAgUU5hbWUgc3ZjUU4gPSBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBzdmNMb2NhbFBhcnQpOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBDbGllbnRNZXRhZGF0YVRlc3QuaW5zdGFsbENhY2hpbmdGYWN0b3J5KCk7DQotDQotICAgICAgICAgICAgU2VydmljZSBzdmMxID0gU2VydmljZS5jcmVhdGUoc3ZjUU4pOw0KLSAgICAgICAgICAgIFFOYW1lIHBvcnRRTiA9IG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIGR5bmFtaWNQb3J0MSk7DQotICAgICAgICAgICAgc3ZjMS5hZGRQb3J0KHBvcnRRTiwgYmluZGluZ0lEMSwgZXByMSk7DQotICAgICAgICANCi0gICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNwaS5TZXJ2aWNlRGVsZWdhdGUucmVsZWFzZVNlcnZpY2Uoc3ZjMSk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgc3ZjMS5hZGRQb3J0KHBvcnRRTiwgYmluZGluZ0lEMSwgZXByMSk7DQotICAgICAgICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgY2F1Z2h0IGFuIGV4Y2VwdGlvbiIpOw0KLQ0KLSAgICAgICAgfSBjYXRjaCAoV2ViU2VydmljZUV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgLy8gZXhwZWN0ZWQgcGF0aA0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBmYWlsKCJDYXVnaHQgd3JvbmcgZXhjZXB0aW9uICIgKyBlKTsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgICAgQ2xpZW50TWV0YWRhdGFUZXN0LnJlc3RvcmVPcmlnaW5hbEZhY3RvcnkoKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGRlY2xhcmVkX25hbWVzcGFjZVVSSSA9ICJodHRwOi8vZGVzY3JpcHRpb24uamF4d3MuYXhpczIuYXBhY2hlLm9yZyI7DQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGVjbGFyZWRfc3ZjTG9jYWxQYXJ0ID0gInN2Y0xvY2FsUGFydCI7DQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgbXVsdGlQb3J0V3NkbCA9ICJDbGllbnRNZXRhZGF0YU11bHRpUG9ydC53c2RsIjsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBtdWx0aVBvcnRXc2RsX3BvcnRMb2NhbFBhcnQxID0gInBvcnRMb2NhbFBhcnRNdWx0aTEiOw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIG11bHRpUG9ydFdzZGxfcG9ydExvY2FsUGFydDIgPSAicG9ydExvY2FsUGFydE11bHRpMiI7DQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgbXVsdGlQb3J0V3NkbF9wb3J0TG9jYWxQYXJ0MyA9ICJwb3J0TG9jYWxQYXJ0TXVsdGkzIjsNCi0gICAgcHVibGljIHZvaWQgdGVzdE11bHRpcGxlU2VydmljZU11bHRpcGVEZWNsYXJlZFBvcnRzKCkgew0KLSAgICAgICAgUU5hbWUgc2VydmljZVFOYW1lID0gbmV3IFFOYW1lKGRlY2xhcmVkX25hbWVzcGFjZVVSSSAsIGRlY2xhcmVkX3N2Y0xvY2FsUGFydCk7DQotICAgICAgICBVUkwgd3NkbFVybCA9IGdldFdzZGxVUkwobXVsdGlQb3J0V3NkbCk7DQotICAgICAgICBRTmFtZSBwb3J0UU4xID0gbmV3IFFOYW1lKG5hbWVzcGFjZVVSSSwgbXVsdGlQb3J0V3NkbF9wb3J0TG9jYWxQYXJ0MSk7DQotICAgICAgICBRTmFtZSBwb3J0UU4yID0gbmV3IFFOYW1lKG5hbWVzcGFjZVVSSSwgbXVsdGlQb3J0V3NkbF9wb3J0TG9jYWxQYXJ0Mik7DQotICAgICAgICBRTmFtZSBwb3J0UU4zID0gbmV3IFFOYW1lKG5hbWVzcGFjZVVSSSwgbXVsdGlQb3J0V3NkbF9wb3J0TG9jYWxQYXJ0Myk7DQotDQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIENsaWVudE1ldGFkYXRhVGVzdC5pbnN0YWxsQ2FjaGluZ0ZhY3RvcnkoKTsNCi0gICAgICAgICAgICAvLyBPcGVuIDIgc2VydmljZXMNCi0gICAgICAgICAgICBTZXJ2aWNlIHN2YzEgPSBTZXJ2aWNlLmNyZWF0ZSh3c2RsVXJsLCBzZXJ2aWNlUU5hbWUpOw0KLSAgICAgICAgICAgIFNlcnZpY2Ugc3ZjMiA9IFNlcnZpY2UuY3JlYXRlKHdzZGxVcmwsIHNlcnZpY2VRTmFtZSk7DQotDQotICAgICAgICAgICAgQ2xpZW50TWV0YWRhdGFQb3J0U0VJIHN2YzFfcG9ydDEgPSBzdmMxLmdldFBvcnQocG9ydFFOMSwgQ2xpZW50TWV0YWRhdGFQb3J0U0VJLmNsYXNzKTsNCi0gICAgICAgICAgICBDbGllbnRNZXRhZGF0YVBvcnRTRUkgc3ZjMV9wb3J0MiA9IHN2YzEuZ2V0UG9ydChwb3J0UU4yLCBDbGllbnRNZXRhZGF0YVBvcnRTRUkuY2xhc3MpOw0KLSAgICAgICAgICAgIENsaWVudE1ldGFkYXRhUG9ydFNFSSBzdmMxX3BvcnQzID0gc3ZjMS5nZXRQb3J0KHBvcnRRTjMsIENsaWVudE1ldGFkYXRhUG9ydFNFSS5jbGFzcyk7DQotDQotICAgICAgICAgICAgQ2xpZW50TWV0YWRhdGFQb3J0U0VJIHN2YzJfcG9ydDEgPSBzdmMyLmdldFBvcnQocG9ydFFOMSwgQ2xpZW50TWV0YWRhdGFQb3J0U0VJLmNsYXNzKTsNCi0gICAgICAgICAgICBDbGllbnRNZXRhZGF0YVBvcnRTRUkgc3ZjMl9wb3J0MiA9IHN2YzIuZ2V0UG9ydChwb3J0UU4yLCBDbGllbnRNZXRhZGF0YVBvcnRTRUkuY2xhc3MpOw0KLSAgICAgICAgICAgIENsaWVudE1ldGFkYXRhUG9ydFNFSSBzdmMyX3BvcnQzID0gc3ZjMi5nZXRQb3J0KHBvcnRRTjMsIENsaWVudE1ldGFkYXRhUG9ydFNFSS5jbGFzcyk7DQotDQotICAgICAgICAgICAgU2VydmljZURlbGVnYXRlIHNkMSA9IERlc2NyaXB0aW9uVGVzdFV0aWxzMi5nZXRTZXJ2aWNlRGVsZWdhdGUoc3ZjMSk7DQotICAgICAgICAgICAgU2VydmljZURlbGVnYXRlIHNkMiA9IERlc2NyaXB0aW9uVGVzdFV0aWxzMi5nZXRTZXJ2aWNlRGVsZWdhdGUoc3ZjMik7DQotICAgICAgICAgICAgYXNzZXJ0Tm90U2FtZShzZDEsIHNkMik7DQotDQotICAgICAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHN2Y0Rlc2MxID0gc2QxLmdldFNlcnZpY2VEZXNjcmlwdGlvbigpOw0KLSAgICAgICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzdmNEZXNjMiA9IHNkMi5nZXRTZXJ2aWNlRGVzY3JpcHRpb24oKTsNCi0gICAgICAgICAgICBBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlnID0gc3ZjRGVzYzEuZ2V0QXhpc0NvbmZpZ0NvbnRleHQoKS5nZXRBeGlzQ29uZmlndXJhdGlvbigpOw0KLSAgICAgICAgICAgIGFzc2VydFNhbWUoc3ZjRGVzYzEsIHN2Y0Rlc2MyKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVwRGVzYzFfcG9ydDEgPSBzdmNEZXNjMS5nZXRFbmRwb2ludERlc2NyaXB0aW9uKHBvcnRRTjEsIHNkMSk7DQotICAgICAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlcERlc2MyX3BvcnQxID0gc3ZjRGVzYzEuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbihwb3J0UU4xLCBzZDIpOw0KLSAgICAgICAgICAgIGFzc2VydFNhbWUoZXBEZXNjMV9wb3J0MSwgZXBEZXNjMl9wb3J0MSk7DQotICAgICAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1N2YzFfcG9ydDEgPSBlcERlc2MxX3BvcnQxLmdldEF4aXNTZXJ2aWNlKCk7DQotICAgICAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1N2YzJfcG9ydDEgPSBlcERlc2MyX3BvcnQxLmdldEF4aXNTZXJ2aWNlKCk7DQotICAgICAgICAgICAgYXNzZXJ0U2FtZShheGlzU3ZjMV9wb3J0MSwgYXhpc1N2YzJfcG9ydDEpOw0KLQ0KLSAgICAgICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZXBEZXNjMV9wb3J0MiA9IHN2Y0Rlc2MxLmdldEVuZHBvaW50RGVzY3JpcHRpb24ocG9ydFFOMiwgc2QxKTsNCi0gICAgICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVwRGVzYzJfcG9ydDIgPSBzdmNEZXNjMS5nZXRFbmRwb2ludERlc2NyaXB0aW9uKHBvcnRRTjIsIHNkMik7DQotICAgICAgICAgICAgYXNzZXJ0U2FtZShlcERlc2MxX3BvcnQyLCBlcERlc2MyX3BvcnQyKTsNCi0gICAgICAgICAgICBBeGlzU2VydmljZSBheGlzU3ZjMV9wb3J0MiA9IGVwRGVzYzFfcG9ydDIuZ2V0QXhpc1NlcnZpY2UoKTsNCi0gICAgICAgICAgICBBeGlzU2VydmljZSBheGlzU3ZjMl9wb3J0MiA9IGVwRGVzYzJfcG9ydDIuZ2V0QXhpc1NlcnZpY2UoKTsNCi0gICAgICAgICAgICBhc3NlcnRTYW1lKGF4aXNTdmMxX3BvcnQyLCBheGlzU3ZjMl9wb3J0Mik7DQotDQotICAgICAgICAgICAgLy8gRmlyc3QgY2xvc2Ugc2hvdWxkIE5PVCBjbGVhbnVwIHRoZSBlbmRwb2ludHMgc2luY2UgdGhlIG90aGVyIHNlcnZpY2UgaXMNCi0gICAgICAgICAgICAvLyBzdGlsbCB1c2luZyB0aGVtLg0KLSAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc3BpLlNlcnZpY2VEZWxlZ2F0ZS5yZWxlYXNlU2VydmljZShzdmMxKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc3ZjRGVzYzJfYWZ0ZXJDbG9zZSA9IHNkMi5nZXRTZXJ2aWNlRGVzY3JpcHRpb24oKTsNCi0gICAgICAgICAgICBhc3NlcnRTYW1lKHN2Y0Rlc2MyLCBzdmNEZXNjMl9hZnRlckNsb3NlKTsNCi0gICAgICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVwRGVzYzJfcG9ydDFfYWZ0ZXJDbG9zZSA9IA0KLSAgICAgICAgICAgICAgICBzdmNEZXNjMl9hZnRlckNsb3NlLmdldEVuZHBvaW50RGVzY3JpcHRpb24ocG9ydFFOMSwgc2QyKTsNCi0gICAgICAgICAgICBhc3NlcnRTYW1lKGVwRGVzYzJfcG9ydDEsIGVwRGVzYzJfcG9ydDFfYWZ0ZXJDbG9zZSk7DQotICAgICAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlcERlc2MyX3BvcnQyX2FmdGVyQ2xvc2UgPSANCi0gICAgICAgICAgICAgICAgc3ZjRGVzYzJfYWZ0ZXJDbG9zZS5nZXRFbmRwb2ludERlc2NyaXB0aW9uKHBvcnRRTjIsIHNkMik7DQotICAgICAgICAgICAgYXNzZXJ0U2FtZShlcERlc2MyX3BvcnQyLCBlcERlc2MyX3BvcnQyX2FmdGVyQ2xvc2UpOw0KLQ0KLSAgICAgICAgICAgIC8vIEFkZCBhIHRoaXJkLCBzaG91bGQgdXNlIHRoZSBzYW1lDQotICAgICAgICAgICAgU2VydmljZSBzdmMzID0gU2VydmljZS5jcmVhdGUod3NkbFVybCwgc2VydmljZVFOYW1lKTsNCi0gICAgICAgICAgICBDbGllbnRNZXRhZGF0YVBvcnRTRUkgc3ZjM19wb3J0MSA9IHN2YzMuZ2V0UG9ydChwb3J0UU4xLCBDbGllbnRNZXRhZGF0YVBvcnRTRUkuY2xhc3MpOw0KLSAgICAgICAgICAgIENsaWVudE1ldGFkYXRhUG9ydFNFSSBzdmMzX3BvcnQyID0gc3ZjMy5nZXRQb3J0KHBvcnRRTjIsIENsaWVudE1ldGFkYXRhUG9ydFNFSS5jbGFzcyk7DQotICAgICAgICAgICAgU2VydmljZURlbGVnYXRlIHNkMyA9IERlc2NyaXB0aW9uVGVzdFV0aWxzMi5nZXRTZXJ2aWNlRGVsZWdhdGUoc3ZjMyk7DQotICAgICAgICAgICAgYXNzZXJ0Tm90U2FtZShzZDIsIHNkMyk7DQotICAgICAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHN2Y0Rlc2MzID0gc2QzLmdldFNlcnZpY2VEZXNjcmlwdGlvbigpOw0KLSAgICAgICAgICAgIGFzc2VydFNhbWUoc3ZjRGVzYzJfYWZ0ZXJDbG9zZSwgc3ZjRGVzYzMpOw0KLSAgICAgICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZXBEZXNjM19wb3J0MSA9IHN2Y0Rlc2MzLmdldEVuZHBvaW50RGVzY3JpcHRpb24ocG9ydFFOMSwgc2QzKTsNCi0gICAgICAgICAgICBhc3NlcnRTYW1lKGVwRGVzYzNfcG9ydDEsIGVwRGVzYzJfcG9ydDFfYWZ0ZXJDbG9zZSk7DQotICAgICAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlcERlc2MzX3BvcnQyID0gc3ZjRGVzYzMuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbihwb3J0UU4yLCBzZDMpOw0KLSAgICAgICAgICAgIGFzc2VydFNhbWUoZXBEZXNjM19wb3J0MiwgZXBEZXNjMl9wb3J0Ml9hZnRlckNsb3NlKTsNCi0NCi0gICAgICAgICAgICAvLyBDbG9zZSB0aGUgMm5kIGRlbGVnYXRlIGFuZCBtYWtlIHN1cmUgY2FoY2VkIG9iamVjdHMgYXJlIHN0aWxsIHRoZXJlDQotICAgICAgICAgICAgLy8gc2luY2UgdGhlcmUncyBhIDNyZCBkZWxlZ2F0ZSBub3cNCi0gICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNwaS5TZXJ2aWNlRGVsZWdhdGUucmVsZWFzZVNlcnZpY2Uoc3ZjMik7DQotDQotICAgICAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHN2Y0Rlc2MzX2FmdGVyQ2xvc2UgPSBzZDMuZ2V0U2VydmljZURlc2NyaXB0aW9uKCk7DQotICAgICAgICAgICAgYXNzZXJ0U2FtZShzdmNEZXNjMywgc3ZjRGVzYzNfYWZ0ZXJDbG9zZSk7DQotICAgICAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlcERlc2MzX3BvcnQxX2FmdGVyQ2xvc2UgPSANCi0gICAgICAgICAgICAgICAgc3ZjRGVzYzNfYWZ0ZXJDbG9zZS5nZXRFbmRwb2ludERlc2NyaXB0aW9uKHBvcnRRTjEsIHNkMyk7DQotICAgICAgICAgICAgYXNzZXJ0U2FtZShlcERlc2MzX3BvcnQxLCBlcERlc2MzX3BvcnQxX2FmdGVyQ2xvc2UpOw0KLSAgICAgICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZXBEZXNjM19wb3J0Ml9hZnRlckNsb3NlID0gDQotICAgICAgICAgICAgICAgIHN2Y0Rlc2MzX2FmdGVyQ2xvc2UuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbihwb3J0UU4yLCBzZDMpOw0KLSAgICAgICAgICAgIGFzc2VydFNhbWUoZXBEZXNjM19wb3J0MiwgZXBEZXNjM19wb3J0Ml9hZnRlckNsb3NlKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBDbG9zZSB0aGUgbGFzdCBkZWxlZ2F0ZSB0aGVuIHZlcmlmeSBhbGwgdGhlIHNlcnZpY2VzIGhhdmUgYmVlbiByZW1vdmVkIA0KLSAgICAgICAgICAgIC8vIGZyb20gdGhlIEF4aXNDb25maWd1cmF0aW9uIA0KLSAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc3BpLlNlcnZpY2VEZWxlZ2F0ZS5yZWxlYXNlU2VydmljZShzdmMzKTsNCi0gICAgICAgICAgICBIYXNoTWFwIGF4aXNTZXJ2aWNlcyA9IGF4aXNDb25maWcuZ2V0U2VydmljZXMoKTsNCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgYXhpc1NlcnZpY2VzLnNpemUoKSk7DQotDQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICAgIENsaWVudE1ldGFkYXRhVGVzdC5yZXN0b3JlT3JpZ2luYWxGYWN0b3J5KCk7DQotICAgICAgICB9DQotDQotICAgIH0NCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFURURfU0VSVklDRV9XU0RMID0gIkNsaWVudE1ldGFkYXRhLndzZGwiOw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSQVRFRF9TRVJWSUNFX05TID0gImh0dHA6Ly9kZXNjcmlwdGlvbi5qYXh3cy5heGlzMi5hcGFjaGUub3JnIjsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFURURfU0VSVklDRV9MUCA9ICJzdmNMb2NhbFBhcnQiOw0KLSAgICANCi0gICAgcHVibGljIHZvaWQgdGVzdEdlbmVyYXRlZFNlcnZpY2VSZWxlYXNlKCkgew0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBDbGllbnRNZXRhZGF0YVRlc3QuaW5zdGFsbENhY2hpbmdGYWN0b3J5KCk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgQ2xpZW50TWV0YWRhdGFHZW5lcmF0ZWRTZXJ2aWNlIGdlblN2YyA9IG5ldyBDbGllbnRNZXRhZGF0YUdlbmVyYXRlZFNlcnZpY2UoKTsNCi0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGdlblN2Yyk7DQotICAgICAgICAgICAgQ2xpZW50TWV0YWRhdGFQb3J0U0VJIHBvcnQgPSBnZW5TdmMuZ2V0UG9ydChDbGllbnRNZXRhZGF0YVBvcnRTRUkuY2xhc3MpOw0KLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwocG9ydCk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gVXNlciBpbnRlcm5hbCBzdGF0ZSB0byB2ZXJpZnkgdGhlIHBvcnQgaW5mb3JtYXRpb24gYmVmb3JlIGFuZCBhZnRlciB0aGUgY2xvc2UNCi0gICAgICAgICAgICBTZXJ2aWNlRGVsZWdhdGUgZGVsZWdhdGUgPSBEZXNjcmlwdGlvblRlc3RVdGlsczIuZ2V0U2VydmljZURlbGVnYXRlKGdlblN2Yyk7DQotICAgICAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHN2Y0Rlc2MgPSBkZWxlZ2F0ZS5nZXRTZXJ2aWNlRGVzY3JpcHRpb24oKTsNCi0gICAgICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uW10gZXBEZXNjQXJyYXk9IHN2Y0Rlc2MuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbnMoKTsNCi0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGVwRGVzY0FycmF5KTsNCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgZXBEZXNjQXJyYXkubGVuZ3RoKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlnID0gc3ZjRGVzYy5nZXRBeGlzQ29uZmlnQ29udGV4dCgpLmdldEF4aXNDb25maWd1cmF0aW9uKCk7DQotICAgICAgICAgICAgSGFzaE1hcCBheGlzU2VydmljZXMgPSBheGlzQ29uZmlnLmdldFNlcnZpY2VzKCk7DQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGF4aXNTZXJ2aWNlcy5zaXplKCkpOw0KLQ0KLSAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc3BpLlNlcnZpY2VEZWxlZ2F0ZS5yZWxlYXNlU2VydmljZShnZW5TdmMpOw0KLQ0KLSAgICAgICAgICAgIGF4aXNTZXJ2aWNlcyA9IGF4aXNDb25maWcuZ2V0U2VydmljZXMoKTsNCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgYXhpc1NlcnZpY2VzLnNpemUoKSk7DQotDQotICAgICAgICAgICAgZXBEZXNjQXJyYXk9IHN2Y0Rlc2MuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbnMoKTsNCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgZXBEZXNjQXJyYXkubGVuZ3RoKTsgICAgICAgICAgICAgICAgDQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICAgIENsaWVudE1ldGFkYXRhVGVzdC5yZXN0b3JlT3JpZ2luYWxGYWN0b3J5KCk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHRlc3RHZW5lcmF0ZWRTZXJ2aWNlUmVsYXNlTG9vcCgpIHsNCi0gICAgICAgIC8vIENyZWF0ZSBhIGJ1bmNoIG9mIGRpZmZlcmVudCBzZXJ2aWNlcywgbWFrZSBzdXJlIHRoZSBzZXJ2aWNlIGRlc2MgZmluYWxpemVyIGlzIGNhbGxlZA0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBDbGllbnRNZXRhZGF0YVRlc3QuaW5zdGFsbENhY2hpbmdGYWN0b3J5KCk7DQotDQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDAwOyBpKyspIHsNCi0gICAgICAgICAgICAgICAgQ2xpZW50TWV0YWRhdGFHZW5lcmF0ZWRTZXJ2aWNlIGdlblN2YyA9IG5ldyBDbGllbnRNZXRhZGF0YUdlbmVyYXRlZFNlcnZpY2UoKTsNCi0gICAgICAgICAgICAgICAgQ2xpZW50TWV0YWRhdGFQb3J0U0VJIHBvcnQgPSBnZW5TdmMuZ2V0UG9ydChDbGllbnRNZXRhZGF0YVBvcnRTRUkuY2xhc3MpOw0KLSAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNwaS5TZXJ2aWNlRGVsZWdhdGUucmVsZWFzZVNlcnZpY2UoZ2VuU3ZjKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgew0KLSAgICAgICAgICAgIGZhaWwoIkNhdWdodCB0aHJvd2FibGUgIiArIHQpOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgICBDbGllbnRNZXRhZGF0YVRlc3QucmVzdG9yZU9yaWdpbmFsRmFjdG9yeSgpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSAgICAvLyBVdGlsaXR5IG1ldGhvZHMNCi0gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotICAgIC8qKg0KLSAgICAgKiBHaXZlbiBhIHNpbXBsZSBmaWxlIG5hbWUgKHdpdGggbm8gYmFzZSBkaWN0b3J5IG9yIHBhdGgpLCByZXR1cm5zIGEgVVJMIHRvIHRoZSBXU0RMIGZpbGUNCi0gICAgICogd2l0aCB0aGUgYmFzZSBkaXJlY3RvcnkgYW5kIHBhdGggcHJlcGVuZGVkLg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIHdzZGxGaWxlTmFtZQ0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqLw0KLSAgICBzdGF0aWMgVVJMIGdldFdzZGxVUkwoU3RyaW5nIHdzZGxGaWxlTmFtZSkgew0KLSAgICAgICAgVVJMIHVybCA9IG51bGw7DQotICAgICAgICBTdHJpbmcgd3NkbExvY2F0aW9uID0gZ2V0V3NkbExvY2F0aW9uKHdzZGxGaWxlTmFtZSk7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKHdzZGxMb2NhdGlvbik7DQotICAgICAgICAgICAgdXJsID0gZmlsZS50b1VSTCgpOw0KLSAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiBjb252ZXJ0aW5nIFdTREwgZmlsZSB0byBVUkw6ICIgKyBlLnRvU3RyaW5nKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHVybDsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogUHJlcGVuZHMgdGhlIGJhc2UgZGlyZWN0b3J5IGFuZCB0aGUgcGF0aCB3aGVyZSB0aGUgdGVzdCBXU0RMIGxpdmVzIHRvIGEgZmlsZW5hbWUuDQotICAgICAqIEBwYXJhbSB3c2RsRmlsZU5hbWUNCi0gICAgICogQHJldHVybg0KLSAgICAgKi8NCi0gICAgc3RhdGljIFN0cmluZyBnZXRXc2RsTG9jYXRpb24oU3RyaW5nIHdzZGxGaWxlTmFtZSkgew0KLSAgICAgICAgU3RyaW5nIHdzZGxMb2NhdGlvbiA9IG51bGw7DQotICAgICAgICBTdHJpbmcgYmFzZURpciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiYmFzZWRpciIsIi4iKTsNCi0gICAgICAgIHdzZGxMb2NhdGlvbiA9IGJhc2VEaXIgKyAiL3Rlc3QtcmVzb3VyY2VzL3dzZGwvIiArIHdzZGxGaWxlTmFtZTsNCi0gICAgICAgIHJldHVybiB3c2RsTG9jYXRpb247DQotICAgIH0NCi19DQotDQotQFdlYlNlcnZpY2UobmFtZT0iRWNob01lc3NhZ2VQb3J0VHlwZSIsIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2Rlc2NyaXB0aW9uLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciKQ0KLWludGVyZmFjZSBDbGllbnRNZXRhZGF0YVBvcnRTRUkgew0KLSAgICBwdWJsaWMgU3RyaW5nIGVjaG9NZXNzYWdlKFN0cmluZyBzdHJpbmcpOw0KLX0NCi0NCi1AV2ViU2VydmljZUNsaWVudCgpDQotY2xhc3MgQ2xpZW50TWV0YWRhdGFHZW5lcmF0ZWRTZXJ2aWNlIGV4dGVuZHMgamF2YXgueG1sLndzLlNlcnZpY2Ugew0KLSAgICBwdWJsaWMgQ2xpZW50TWV0YWRhdGFHZW5lcmF0ZWRTZXJ2aWNlKCkgew0KLSAgICAgICAgc3VwZXIoUmVsZWFzZVNlcnZpY2VUZXN0cy5nZXRXc2RsVVJMKFJlbGVhc2VTZXJ2aWNlVGVzdHMuR0VORVJBVEVEX1NFUlZJQ0VfV1NETCksDQotICAgICAgICAgICAgICBuZXcgUU5hbWUoUmVsZWFzZVNlcnZpY2VUZXN0cy5HRU5FUkFURURfU0VSVklDRV9OUywgUmVsZWFzZVNlcnZpY2VUZXN0cy5HRU5FUkFURURfU0VSVklDRV9MUCkpOw0KLSAgICB9DQotICAgIHB1YmxpYyBDbGllbnRNZXRhZGF0YUdlbmVyYXRlZFNlcnZpY2UoVVJMIHdzZGxMb2NhdGlvbiwgUU5hbWUgc2VydmljZU5hbWUpIHsNCi0gICAgICAgIHN1cGVyKHdzZGxMb2NhdGlvbiwgc2VydmljZU5hbWUpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jbGllbnQvVGVzdENsaWVudEludm9jYXRpb25Db250cm9sbGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2xpZW50L1Rlc3RDbGllbnRJbnZvY2F0aW9uQ29udHJvbGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjBhMGRkLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jbGllbnQvVGVzdENsaWVudEludm9jYXRpb25Db250cm9sbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNsaWVudDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLkludm9jYXRpb25Db250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUuTWVzc2FnZUNvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS5jb250cm9sbGVyLkludm9jYXRpb25Db250cm9sbGVyOw0KLQ0KLWltcG9ydCBqYXZheC54bWwud3MuQXN5bmNIYW5kbGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuUmVzcG9uc2U7DQotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTsNCi0NCi1wdWJsaWMgY2xhc3MgVGVzdENsaWVudEludm9jYXRpb25Db250cm9sbGVyIGltcGxlbWVudHMgSW52b2NhdGlvbkNvbnRyb2xsZXIgew0KLQ0KLSAgICBwcml2YXRlIEludm9jYXRpb25Db250ZXh0IGNhY2hlZEN0eDsNCi0gICAgDQotICAgIHB1YmxpYyBJbnZvY2F0aW9uQ29udGV4dCBpbnZva2UoSW52b2NhdGlvbkNvbnRleHQgaWMpIHsNCi0gICAgICAgIGNhY2hlZEN0eCA9IGljOw0KLSAgICAgICAgDQotICAgICAgICBNZXNzYWdlQ29udGV4dCByZXF1ZXN0ID0gaWMuZ2V0UmVxdWVzdE1lc3NhZ2VDb250ZXh0KCk7ICAgICAgICANCi0gICAgICAgIE1lc3NhZ2VDb250ZXh0IHJlc3BvbnNlID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7DQotICAgICAgICANCi0gICAgICAgIHJlc3BvbnNlLnNldEVuZHBvaW50RGVzY3JpcHRpb24ocmVxdWVzdC5nZXRFbmRwb2ludERlc2NyaXB0aW9uKCkpOw0KLSAgICAgICAgcmVzcG9uc2Uuc2V0TWVzc2FnZShyZXF1ZXN0LmdldE1lc3NhZ2UoKSk7ICAgICAgICANCi0gICAgICAgIA0KLSAgICAgICAgaWMuc2V0UmVzcG9uc2VNZXNzYWdlQ29udGV4dChyZXNwb25zZSk7DQotICAgICAgICByZXR1cm4gaWM7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEZ1dHVyZTw/PiBpbnZva2VBc3luYyhJbnZvY2F0aW9uQ29udGV4dCBpYywgQXN5bmNIYW5kbGVyIGFzeW5jSGFuZGxlcikgew0KLSAgICAgICAgY2FjaGVkQ3R4ID0gaWM7DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUmVzcG9uc2UgaW52b2tlQXN5bmMoSW52b2NhdGlvbkNvbnRleHQgaWMpIHsNCi0gICAgICAgIGNhY2hlZEN0eCA9IGljOw0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgaW52b2tlT25lV2F5KEludm9jYXRpb25Db250ZXh0IGljKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIGNhY2hlZEN0eCA9IGljOw0KLQ0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgSW52b2NhdGlvbkNvbnRleHQgZ2V0SW52b2NhdGlvbkNvbnRleHQoKSB7DQotICAgICAgICByZXR1cm4gY2FjaGVkQ3R4Ow0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jbGllbnQvVGVzdENsaWVudEludm9jYXRpb25Db250cm9sbGVyRmFjdG9yeS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NsaWVudC9UZXN0Q2xpZW50SW52b2NhdGlvbkNvbnRyb2xsZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4NGExZjguLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NsaWVudC9UZXN0Q2xpZW50SW52b2NhdGlvbkNvbnRyb2xsZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNsaWVudDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLmNvbnRyb2xsZXIuSW52b2NhdGlvbkNvbnRyb2xsZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS5jb250cm9sbGVyLkludm9jYXRpb25Db250cm9sbGVyRmFjdG9yeTsNCi0NCi1wdWJsaWMgY2xhc3MgVGVzdENsaWVudEludm9jYXRpb25Db250cm9sbGVyRmFjdG9yeSBpbXBsZW1lbnRzIEludm9jYXRpb25Db250cm9sbGVyRmFjdG9yeSB7DQotICAgIA0KLSAgICBwcml2YXRlIEludm9jYXRpb25Db250cm9sbGVyIGljOw0KLSAgICANCi0gICAgcHVibGljIEludm9jYXRpb25Db250cm9sbGVyIGdldEludm9jYXRpb25Db250cm9sbGVyKCkgew0KLSAgICAgICAgaWYgKGljICE9IG51bGwpDQotICAgICAgICAgICAgcmV0dXJuIGljOw0KLSAgICAgICAgZWxzZSANCi0gICAgICAgICAgICByZXR1cm4gbmV3IFRlc3RDbGllbnRJbnZvY2F0aW9uQ29udHJvbGxlcigpOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCBzZXRJbnZvY2F0aW9uQ29udHJvbGxlcihJbnZvY2F0aW9uQ29udHJvbGxlciBpbnN0KSB7DQotICAgICAgICBpYyA9IGluc3Q7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NsaWVudC9kaXNwYXRjaC9EaXNwYXRjaEFkZHJlc3NpbmdGZWF0dXJlVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NsaWVudC9kaXNwYXRjaC9EaXNwYXRjaEFkZHJlc3NpbmdGZWF0dXJlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTI0NzNiLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jbGllbnQvZGlzcGF0Y2gvRGlzcGF0Y2hBZGRyZXNzaW5nRmVhdHVyZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY2xpZW50LmRpc3BhdGNoOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuQWRkcmVzc2luZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuQWRkcmVzc2luZ0NvbnN0YW50cy5GaW5hbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5hZGRyZXNzaW5nLlN1Ym1pc3Npb25FbmRwb2ludFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmFkZHJlc3NpbmcuU3VibWlzc2lvbkVuZHBvaW50UmVmZXJlbmNlQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNsaWVudC5JbnRlcmNlcHRhYmxlQ2xpZW50VGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jbGllbnQuVGVzdENsaWVudEludm9jYXRpb25Db250cm9sbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS5JbnZvY2F0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUuTWVzc2FnZUNvbnRleHQ7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC53cy5EaXNwYXRjaDsKLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5BZGRyZXNzaW5nRmVhdHVyZTsKLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5TT0FQQmluZGluZzsKLWltcG9ydCBqYXZheC54bWwud3Mud3NhZGRyZXNzaW5nLlczQ0VuZHBvaW50UmVmZXJlbmNlOwotaW1wb3J0IGphdmF4LnhtbC53cy53c2FkZHJlc3NpbmcuVzNDRW5kcG9pbnRSZWZlcmVuY2VCdWlsZGVyOwotCi0vKioKLSAqIFRoaXMgc3VpdGUgb2YgdGVzdHMgaXMgZm9yIHRoZSBBZGRyZXNzaW5nRmVhdHVyZSBjb25maWd1cmF0aW9uIHRoYXQgY2FuCi0gKiBiZSB1c2VkIG9uIERpc3BhdGNoIGNsaWVudHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBEaXNwYXRjaEFkZHJlc3NpbmdGZWF0dXJlVGVzdCBleHRlbmRzIEludGVyY2VwdGFibGVDbGllbnRUZXN0Q2FzZSB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgT01GYWN0b3J5IE9NRiA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFFOYW1lIEVMRU1FTlQyMDA1MDggPQotICAgICAgICBuZXcgUU5hbWUoRmluYWwuV1NBX05BTUVTUEFDRSwgIkVuZHBvaW50UmVmZXJlbmNlIiwgIndzYSIpOwotICAgIAotICAgIHByaXZhdGUgVzNDRW5kcG9pbnRSZWZlcmVuY2UgdzNjRVBSOwotICAgIHByaXZhdGUgU3VibWlzc2lvbkVuZHBvaW50UmVmZXJlbmNlIHN1YkVQUjsKLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgICAgICAKLSAgICAgICAgVzNDRW5kcG9pbnRSZWZlcmVuY2VCdWlsZGVyIHczY0J1aWxkZXIgPSBuZXcgVzNDRW5kcG9pbnRSZWZlcmVuY2VCdWlsZGVyKCk7Ci0gICAgICAgIHczY0J1aWxkZXIgPSB3M2NCdWlsZGVyLmFkZHJlc3MoImh0dHA6Ly9zb21ld2hlcmUuY29tL3NvbWVob3ciKTsKLSAgICAgICAgdzNjQnVpbGRlciA9IHczY0J1aWxkZXIuc2VydmljZU5hbWUobmV3IFFOYW1lKCJodHRwOi8vdGVzdCIsICJUZXN0U2VydmljZSIpKTsKLSAgICAgICAgdzNjQnVpbGRlciA9IHczY0J1aWxkZXIuZW5kcG9pbnROYW1lKG5ldyBRTmFtZSgiaHR0cDovL3Rlc3QiLCAiVGVzdFBvcnQiKSk7Ci0gICAgICAgIHczY0VQUiA9IHczY0J1aWxkZXIuYnVpbGQoKTsKLSAgICAgICAgCi0gICAgICAgIFN1Ym1pc3Npb25FbmRwb2ludFJlZmVyZW5jZUJ1aWxkZXIgc3ViQnVpbGRlciA9IG5ldyBTdWJtaXNzaW9uRW5kcG9pbnRSZWZlcmVuY2VCdWlsZGVyKCk7Ci0gICAgICAgIHN1YkJ1aWxkZXIgPSBzdWJCdWlsZGVyLmFkZHJlc3MoImh0dHA6Ly9zb21ld2hlcmUuY29tL3NvbWVob3ciKTsKLSAgICAgICAgc3ViQnVpbGRlciA9IHN1YkJ1aWxkZXIuc2VydmljZU5hbWUobmV3IFFOYW1lKCJodHRwOi8vdGVzdCIsICJUZXN0U2VydmljZSIpKTsKLSAgICAgICAgc3ViQnVpbGRlciA9IHN1YkJ1aWxkZXIuZW5kcG9pbnROYW1lKG5ldyBRTmFtZSgiaHR0cDovL3Rlc3QiLCAiVGVzdFBvcnQiKSk7Ci0gICAgICAgIHN1YkVQUiA9IHN1YkJ1aWxkZXIuYnVpbGQoKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIE1ha2Ugc3VyZSBBZGRyZXNzaW5nIGlzIG5vdCBlbmFibGVkIGJ5IGRlZmF1bHQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdE5vQWRkcmVzc2luZ0ZlYXR1cmUoKSB7Ci0gICAgICAgIFNlcnZpY2Ugc3ZjID0gU2VydmljZS5jcmVhdGUobmV3IFFOYW1lKCJodHRwOi8vdGVzdCIsICJUZXN0U2VydmljZSIpKTsKLSAgICAgICAgc3ZjLmFkZFBvcnQobmV3IFFOYW1lKCJodHRwOi8vdGVzdCIsICJUZXN0UG9ydCIpLCBTT0FQQmluZGluZy5TT0FQMTFIVFRQX0JJTkRJTkcsICJodHRwOi8vbG9jYWxob3N0Iik7Ci0gICAgICAgIERpc3BhdGNoPFNvdXJjZT4gZCA9IHN2Yy5jcmVhdGVEaXNwYXRjaCh3M2NFUFIsIFNvdXJjZS5jbGFzcywgU2VydmljZS5Nb2RlLlBBWUxPQUQpOwotICAgICAgICAKLSAgICAgICAgZC5pbnZva2UobnVsbCk7Ci0gICAgICAgIAotICAgICAgICBUZXN0Q2xpZW50SW52b2NhdGlvbkNvbnRyb2xsZXIgdGVzdENvbnRyb2xsZXIgPSBnZXRJbnZvY2F0aW9uQ29udHJvbGxlcigpOwotICAgICAgICBJbnZvY2F0aW9uQ29udGV4dCBpYyA9IHRlc3RDb250cm9sbGVyLmdldEludm9jYXRpb25Db250ZXh0KCk7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IHJlcXVlc3QgPSBpYy5nZXRSZXF1ZXN0TWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyB2ZXJzaW9uID0gKFN0cmluZykgcmVxdWVzdC5nZXRQcm9wZXJ0eShBZGRyZXNzaW5nQ29uc3RhbnRzLldTX0FERFJFU1NJTkdfVkVSU0lPTik7Ci0gICAgICAgIEJvb2xlYW4gZGlzYWJsZWQgPSAoQm9vbGVhbikgcmVxdWVzdC5nZXRQcm9wZXJ0eShBZGRyZXNzaW5nQ29uc3RhbnRzLkRJU0FCTEVfQUREUkVTU0lOR19GT1JfT1VUX01FU1NBR0VTKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydE51bGwodmVyc2lvbik7Ci0gICAgICAgIGFzc2VydFRydWUoZGlzYWJsZWQpOwotICAgICAgICAKLSAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0IGF4aXMyUmVxdWVzdCA9Ci0gICAgICAgICAgICByZXF1ZXN0LmdldEF4aXNNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2UgZXByID0KLSAgICAgICAgICAgIGF4aXMyUmVxdWVzdC5nZXRUbygpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0TnVsbChlcHIpOwotICAgIH0KLSAgICAKLSAgICAvKgotICAgICAqIFRlc3QgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBvZiB0aGUgQWRkcmVzc2luZ0ZlYXR1cmUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdERlZmF1bHRBZGRyZXNzaW5nRmVhdHVyZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBVc2UgdGhlIGRlZmF1bHQgZmVhdHVyZSBjb25maWcKLSAgICAgICAgQWRkcmVzc2luZ0ZlYXR1cmUgZmVhdHVyZSA9IG5ldyBBZGRyZXNzaW5nRmVhdHVyZSgpOwotICAgICAgICAKLSAgICAgICAgU2VydmljZSBzdmMgPSBTZXJ2aWNlLmNyZWF0ZShuZXcgUU5hbWUoImh0dHA6Ly90ZXN0IiwgIlRlc3RTZXJ2aWNlIikpOwotICAgICAgICBzdmMuYWRkUG9ydChuZXcgUU5hbWUoImh0dHA6Ly90ZXN0IiwgIlRlc3RQb3J0IiksIFNPQVBCaW5kaW5nLlNPQVAxMUhUVFBfQklORElORywgImh0dHA6Ly9sb2NhbGhvc3QiKTsKLSAgICAgICAgRGlzcGF0Y2g8U291cmNlPiBkID0gc3ZjLmNyZWF0ZURpc3BhdGNoKHczY0VQUiwgU291cmNlLmNsYXNzLCBTZXJ2aWNlLk1vZGUuUEFZTE9BRCwgZmVhdHVyZSk7Ci0gICAgICAgIAotICAgICAgICBkLmludm9rZShudWxsKTsKLSAgICAgICAgCi0gICAgICAgIFRlc3RDbGllbnRJbnZvY2F0aW9uQ29udHJvbGxlciB0ZXN0Q29udHJvbGxlciA9IGdldEludm9jYXRpb25Db250cm9sbGVyKCk7Ci0gICAgICAgIEludm9jYXRpb25Db250ZXh0IGljID0gdGVzdENvbnRyb2xsZXIuZ2V0SW52b2NhdGlvbkNvbnRleHQoKTsKLSAgICAgICAgTWVzc2FnZUNvbnRleHQgcmVxdWVzdCA9IGljLmdldFJlcXVlc3RNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICAKLSAgICAgICAgU3RyaW5nIHZlcnNpb24gPSAoU3RyaW5nKSByZXF1ZXN0LmdldFByb3BlcnR5KEFkZHJlc3NpbmdDb25zdGFudHMuV1NfQUREUkVTU0lOR19WRVJTSU9OKTsKLSAgICAgICAgQm9vbGVhbiBkaXNhYmxlZCA9IChCb29sZWFuKSByZXF1ZXN0LmdldFByb3BlcnR5KEFkZHJlc3NpbmdDb25zdGFudHMuRElTQUJMRV9BRERSRVNTSU5HX0ZPUl9PVVRfTUVTU0FHRVMpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEZpbmFsLldTQV9OQU1FU1BBQ0UsIHZlcnNpb24pOwotICAgICAgICBhc3NlcnRGYWxzZShkaXNhYmxlZCk7Ci0gICAgICAgIAotICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQgYXhpczJSZXF1ZXN0ID0KLSAgICAgICAgICAgIHJlcXVlc3QuZ2V0QXhpc01lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZSBlcHIgPQotICAgICAgICAgICAgYXhpczJSZXF1ZXN0LmdldFRvKCk7Ci0gICAgICAgIAotICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0KLSAgICAgICAgICAgIEVuZHBvaW50UmVmZXJlbmNlSGVscGVyLnRvT00oT01GLCBlcHIsIEVMRU1FTlQyMDA1MDgsIEZpbmFsLldTQV9OQU1FU1BBQ0UpOwotICAgICAgICBhc3NlcnRYTUxFcXVhbCh3M2NFUFIudG9TdHJpbmcoKSwgb21FbGVtZW50LnRvU3RyaW5nKCkpOwotICAgIH0KLSAgICAKLSAgICAvKgotICAgICAqIFRlc3QgZGlzYWJsaW5nIHRoZSBBZGRyZXNzaW5nIGZlYXR1cmUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdERpc2FibGVkQWRkcmVzc2luZ0ZlYXR1cmUoKSB7Ci0gICAgICAgIC8vIFNldCB0aGUgZmVhdHVyZSB0byBiZSBkaXNhYmxlZC4KLSAgICAgICAgQWRkcmVzc2luZ0ZlYXR1cmUgZmVhdHVyZSA9IG5ldyBBZGRyZXNzaW5nRmVhdHVyZShmYWxzZSk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgIFNlcnZpY2Ugc3ZjID0gU2VydmljZS5jcmVhdGUobmV3IFFOYW1lKCJodHRwOi8vdGVzdCIsICJUZXN0U2VydmljZSIpKTsKLSAgICAgICAgc3ZjLmFkZFBvcnQobmV3IFFOYW1lKCJodHRwOi8vdGVzdCIsICJUZXN0UG9ydCIpLCBTT0FQQmluZGluZy5TT0FQMTFIVFRQX0JJTkRJTkcsICJodHRwOi8vbG9jYWxob3N0Iik7ICAgICAgICAKLSAgICAgICAgRGlzcGF0Y2g8U291cmNlPiBkID0gc3ZjLmNyZWF0ZURpc3BhdGNoKHczY0VQUiwgU291cmNlLmNsYXNzLCBTZXJ2aWNlLk1vZGUuUEFZTE9BRCwgZmVhdHVyZSk7Ci0gICAgICAgIAotICAgICAgICBkLmludm9rZShudWxsKTsKLSAgICAgICAgCi0gICAgICAgIFRlc3RDbGllbnRJbnZvY2F0aW9uQ29udHJvbGxlciB0ZXN0Q29udHJvbGxlciA9IGdldEludm9jYXRpb25Db250cm9sbGVyKCk7Ci0gICAgICAgIEludm9jYXRpb25Db250ZXh0IGljID0gdGVzdENvbnRyb2xsZXIuZ2V0SW52b2NhdGlvbkNvbnRleHQoKTsKLSAgICAgICAgTWVzc2FnZUNvbnRleHQgcmVxdWVzdCA9IGljLmdldFJlcXVlc3RNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICAKLSAgICAgICAgU3RyaW5nIHZlcnNpb24gPSAoU3RyaW5nKSByZXF1ZXN0LmdldFByb3BlcnR5KEFkZHJlc3NpbmdDb25zdGFudHMuV1NfQUREUkVTU0lOR19WRVJTSU9OKTsKLSAgICAgICAgQm9vbGVhbiBkaXNhYmxlZCA9IChCb29sZWFuKSByZXF1ZXN0LmdldFByb3BlcnR5KEFkZHJlc3NpbmdDb25zdGFudHMuRElTQUJMRV9BRERSRVNTSU5HX0ZPUl9PVVRfTUVTU0FHRVMpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEZpbmFsLldTQV9OQU1FU1BBQ0UsIHZlcnNpb24pOwotICAgICAgICBhc3NlcnRUcnVlKGRpc2FibGVkKTsKLSAgICAgICAgCi0gICAgICAgIG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dCBheGlzMlJlcXVlc3QgPQotICAgICAgICAgICAgcmVxdWVzdC5nZXRBeGlzTWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlIGVwciA9Ci0gICAgICAgICAgICBheGlzMlJlcXVlc3QuZ2V0VG8oKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydE51bGwoZXByKTsKLSAgICB9Ci0gICAgCi0gICAgLy8gVGVzdCBjb25maWd1cmF0aW9ucyB0aGF0IGFyZSBub3QgYWxsb3dlZCB3aXRoIHRoZSBBZGRyZXNzaW5nRmVhdHVyZQotICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkQWRkcmVzc2luZ0ZlYXR1cmUoKSB7Ci0gICAgICAgIC8vIFVzZSB0aGUgZGVmYXVsdCBmZWF0dXJlIGNvbmZpZwotICAgICAgICBBZGRyZXNzaW5nRmVhdHVyZSBmZWF0dXJlID0gbmV3IEFkZHJlc3NpbmdGZWF0dXJlKCk7Ci0gICAgICAgIAotICAgICAgICBTZXJ2aWNlIHN2YyA9IFNlcnZpY2UuY3JlYXRlKG5ldyBRTmFtZSgiaHR0cDovL3Rlc3QiLCAiVGVzdFNlcnZpY2UiKSk7Ci0gICAgICAgIHN2Yy5hZGRQb3J0KG5ldyBRTmFtZSgiaHR0cDovL3Rlc3QiLCAiVGVzdFBvcnQiKSwgU09BUEJpbmRpbmcuU09BUDExSFRUUF9CSU5ESU5HLCAiaHR0cDovL2xvY2FsaG9zdCIpOwotICAgICAgICBEaXNwYXRjaDxTb3VyY2U+IGQgPSBzdmMuY3JlYXRlRGlzcGF0Y2goc3ViRVBSLCBTb3VyY2UuY2xhc3MsIFNlcnZpY2UuTW9kZS5QQVlMT0FELCBmZWF0dXJlKTsKLSAgICAgICAgCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBkLmludm9rZShudWxsKTsKLSAgICAgICAgICAgIGZhaWwoIkFuIGV4Y2VwdGlvbiBzaG91bGQgaGF2ZSBiZWVuIHRocm93biIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChXZWJTZXJ2aWNlRXhjZXB0aW9uIHdzZSkgewotICAgICAgICAgICAgLy9wYXNzCi0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJUaGUgd3JvbmcgZXhjZXB0aW9uIHR5cGUgd2FzIHRocm93bi4iKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jbGllbnQvZGlzcGF0Y2gvRGlzcGF0Y2hNVE9NRmVhdHVyZVRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jbGllbnQvZGlzcGF0Y2gvRGlzcGF0Y2hNVE9NRmVhdHVyZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVkYmYzYS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2xpZW50L2Rpc3BhdGNoL0Rpc3BhdGNoTVRPTUZlYXR1cmVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jbGllbnQuZGlzcGF0Y2g7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY2xpZW50LkludGVyY2VwdGFibGVDbGllbnRUZXN0Q2FzZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jbGllbnQuVGVzdENsaWVudEludm9jYXRpb25Db250cm9sbGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUuSW52b2NhdGlvbkNvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS5NZXNzYWdlQ29udGV4dDsNCi0NCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5EaXNwYXRjaDsNCi1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5zb2FwLk1UT01GZWF0dXJlOw0KLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5TT0FQQmluZGluZzsNCi0NCi0vKioNCi0gKiBUaGlzIHN1aXRlIG9mIHRlc3RzIGlzIGZvciB0aGUgTVRPTUZlYXR1cmUgY29uZmlndXJhdGlvbiB0aGF0IGNhbg0KLSAqIGJlIHVzZWQgb24gRGlzcGF0Y2ggY2xpZW50cy4NCi0gKi8NCi1wdWJsaWMgY2xhc3MgRGlzcGF0Y2hNVE9NRmVhdHVyZVRlc3QgZXh0ZW5kcyBJbnRlcmNlcHRhYmxlQ2xpZW50VGVzdENhc2Ugew0KLQ0KLSAgICAvKg0KLSAgICAgKiBNYWtlIHN1cmUgTVRPTSBpcyBub3QgZW5hYmxlZCBieSBkZWZhdWx0Lg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdE5vTVRPTUZlYXR1cmUoKSB7DQotICAgICAgICBTZXJ2aWNlIHN2YyA9IFNlcnZpY2UuY3JlYXRlKG5ldyBRTmFtZSgiaHR0cDovL3Rlc3QiLCAiVGVzdFNlcnZpY2UiKSk7DQotICAgICAgICBzdmMuYWRkUG9ydChuZXcgUU5hbWUoImh0dHA6Ly90ZXN0IiwgIlRlc3RQb3J0IiksIFNPQVBCaW5kaW5nLlNPQVAxMUhUVFBfQklORElORywgImh0dHA6Ly9sb2NhbGhvc3QiKTsNCi0gICAgICAgIERpc3BhdGNoPFNvdXJjZT4gZCA9IHN2Yy5jcmVhdGVEaXNwYXRjaChuZXcgUU5hbWUoImh0dHA6Ly90ZXN0IiwgIlRlc3RQb3J0IiksIFNvdXJjZS5jbGFzcywgU2VydmljZS5Nb2RlLlBBWUxPQUQpOw0KLSAgICAgICAgDQotICAgICAgICBTT0FQQmluZGluZyBzYiA9IChTT0FQQmluZGluZykgZC5nZXRCaW5kaW5nKCk7DQotICAgICAgICBhc3NlcnRUcnVlKCJTT0FQQmluZGluZyBzaG91bGQgbm90IGJlIG51bGwuIiwgc2IgIT0gbnVsbCk7DQotICAgICAgICBhc3NlcnRUcnVlKCJNVE9NIHNob3VsZCBub3QgYmUgZW5hYmxlZCBvbiB0aGUgYmluZGluZyBieSBkZWZhdWx0LiIsICFzYi5pc01UT01FbmFibGVkKCkpOw0KLSAgICAgICAgDQotICAgICAgICBkLmludm9rZShudWxsKTsNCi0gICAgICAgIA0KLSAgICAgICAgVGVzdENsaWVudEludm9jYXRpb25Db250cm9sbGVyIHRlc3RDb250cm9sbGVyID0gZ2V0SW52b2NhdGlvbkNvbnRyb2xsZXIoKTsNCi0gICAgICAgIEludm9jYXRpb25Db250ZXh0IGljID0gdGVzdENvbnRyb2xsZXIuZ2V0SW52b2NhdGlvbkNvbnRleHQoKTsNCi0gICAgICAgIE1lc3NhZ2VDb250ZXh0IHJlcXVlc3QgPSBpYy5nZXRSZXF1ZXN0TWVzc2FnZUNvbnRleHQoKTsNCi0gICAgICAgIA0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiUmVxdWVzdCBzaG91bGQgbm90IGJlIG51bGwuIiwgcmVxdWVzdCAhPSBudWxsKTsNCi0gICAgICAgIGFzc2VydEZhbHNlKCJNVE9NIHNob3VsZCBub3QgYmUgZW5hYmxlZCBieSBkZWZhdWx0LiIsIHJlcXVlc3QuZ2V0TWVzc2FnZSgpLmlzTVRPTUVuYWJsZWQoKSk7DQotICAgIH0NCi0gICAgDQotICAgIC8qDQotICAgICAqIFRlc3QgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBvZiB0aGUgTVRPTUZlYXR1cmUuDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdE1UT01GZWF0dXJlKCkgew0KLSAgICAgICAgLy8gVXNlIHRoZSBkZWZhdWx0IGZlYXR1cmUgY29uZmlnDQotICAgICAgICBNVE9NRmVhdHVyZSBmZWF0dXJlID0gbmV3IE1UT01GZWF0dXJlKCk7DQotICAgICAgICANCi0gICAgICAgIFNlcnZpY2Ugc3ZjID0gU2VydmljZS5jcmVhdGUobmV3IFFOYW1lKCJodHRwOi8vdGVzdCIsICJUZXN0U2VydmljZSIpKTsNCi0gICAgICAgIHN2Yy5hZGRQb3J0KG5ldyBRTmFtZSgiaHR0cDovL3Rlc3QiLCAiVGVzdFBvcnQiKSwgU09BUEJpbmRpbmcuU09BUDExSFRUUF9CSU5ESU5HLCAiaHR0cDovL2xvY2FsaG9zdCIpOw0KLSAgICAgICAgRGlzcGF0Y2g8U291cmNlPiBkID0gc3ZjLmNyZWF0ZURpc3BhdGNoKG5ldyBRTmFtZSgiaHR0cDovL3Rlc3QiLCAiVGVzdFBvcnQiKSwgDQotICAgICAgICAgICAgU291cmNlLmNsYXNzLCBTZXJ2aWNlLk1vZGUuUEFZTE9BRCwgZmVhdHVyZSk7DQotICAgICAgICANCi0gICAgICAgIGQuaW52b2tlKG51bGwpOw0KLSAgICAgICAgDQotICAgICAgICBUZXN0Q2xpZW50SW52b2NhdGlvbkNvbnRyb2xsZXIgdGVzdENvbnRyb2xsZXIgPSBnZXRJbnZvY2F0aW9uQ29udHJvbGxlcigpOw0KLSAgICAgICAgSW52b2NhdGlvbkNvbnRleHQgaWMgPSB0ZXN0Q29udHJvbGxlci5nZXRJbnZvY2F0aW9uQ29udGV4dCgpOw0KLSAgICAgICAgTWVzc2FnZUNvbnRleHQgcmVxdWVzdCA9IGljLmdldFJlcXVlc3RNZXNzYWdlQ29udGV4dCgpOw0KLSAgICAgICAgDQotICAgICAgICBhc3NlcnRUcnVlKCJNVE9NIHNob3VsZCBiZSBlbmFibGVkIHZpYSB0aGUgTVRPTUZlYXR1cmUuIiwgcmVxdWVzdC5nZXRNZXNzYWdlKCkuaXNNVE9NRW5hYmxlZCgpKTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoNCi0gICAgICogVGVzdCBkaXNhYmxpbmcgdGhlIE1UT00gZmVhdHVyZS4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3REaXNhYmxlZE1UT01GZWF0dXJlKCkgew0KLSAgICAgICAgU2VydmljZSBzdmMgPSBTZXJ2aWNlLmNyZWF0ZShuZXcgUU5hbWUoImh0dHA6Ly90ZXN0IiwgIlRlc3RTZXJ2aWNlIikpOw0KLSAgICAgICAgc3ZjLmFkZFBvcnQobmV3IFFOYW1lKCJodHRwOi8vdGVzdCIsICJUZXN0UG9ydCIpLCBTT0FQQmluZGluZy5TT0FQMTFIVFRQX0JJTkRJTkcsICJodHRwOi8vbG9jYWxob3N0Iik7DQotICAgICAgICANCi0gICAgICAgIC8vIFNldCB0aGUgZmVhdHVyZSB0byBiZSBkaXNhYmxlZC4NCi0gICAgICAgIE1UT01GZWF0dXJlIGZlYXR1cmUgPSBuZXcgTVRPTUZlYXR1cmUoZmFsc2UpOw0KLSAgICAgICAgICAgICAgICANCi0gICAgICAgIERpc3BhdGNoPFNvdXJjZT4gZCA9IHN2Yy5jcmVhdGVEaXNwYXRjaChuZXcgUU5hbWUoImh0dHA6Ly90ZXN0IiwgIlRlc3RQb3J0IiksIA0KLSAgICAgICAgICAgIFNvdXJjZS5jbGFzcywgU2VydmljZS5Nb2RlLlBBWUxPQUQsIGZlYXR1cmUpOw0KLSAgICAgICAgDQotICAgICAgICBkLmludm9rZShudWxsKTsNCi0gICAgICAgIA0KLSAgICAgICAgVGVzdENsaWVudEludm9jYXRpb25Db250cm9sbGVyIHRlc3RDb250cm9sbGVyID0gZ2V0SW52b2NhdGlvbkNvbnRyb2xsZXIoKTsNCi0gICAgICAgIA0KLSAgICAgICAgSW52b2NhdGlvbkNvbnRleHQgaWMgPSB0ZXN0Q29udHJvbGxlci5nZXRJbnZvY2F0aW9uQ29udGV4dCgpOw0KLSAgICAgICAgTWVzc2FnZUNvbnRleHQgcmVxdWVzdCA9IGljLmdldFJlcXVlc3RNZXNzYWdlQ29udGV4dCgpOw0KLSAgICAgICAgDQotICAgICAgICBhc3NlcnRGYWxzZSgiTVRPTSBzaG91bGQgYmUgZGlzYWJsZWQgdmlhIHRoZSBNVE9NRmVhdHVyZS4iLCByZXF1ZXN0LmdldE1lc3NhZ2UoKS5pc01UT01FbmFibGVkKCkpOw0KLSAgICB9DQotICAgIA0KLSAgICAvKg0KLSAgICAgKiBUZXN0IHRoZSBjb25maWd1cmF0aW9uIG9mIHRoZSB0aHJlc2hvbGQgZm9yIE1UT00gd2hlbiBubyBhdHRhY2htZW50IGlzIA0KLSAgICAgKiBzcGVjaWZpZWQuICBJbiB0aGlzIGNhc2UsIGFsdGhvdWdoIGVuYWJsZWQgcGVyIHRoZSBNVE9NRmVhdHVyZSwgTVRPTSBzaG91bGQNCi0gICAgICogbm90IGJlIGVuYWJsZWQgb24gdGhlIE1lc3NhZ2UsIHNpbmNlIHRoZSBhdHRhY2htZW50IHNpemUgaXMgdG9vIHNtYWxsLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdE1UT01GZWF0dXJlVGhyZXNob2xkV2l0aE5vQXR0YWNobWVudCgpIHsNCi0gICAgICAgIFNlcnZpY2Ugc3ZjID0gU2VydmljZS5jcmVhdGUobmV3IFFOYW1lKCJodHRwOi8vdGVzdCIsICJUZXN0U2VydmljZSIpKTsNCi0gICAgICAgIHN2Yy5hZGRQb3J0KG5ldyBRTmFtZSgiaHR0cDovL3Rlc3QiLCAiVGVzdFBvcnQiKSwgU09BUEJpbmRpbmcuU09BUDExSFRUUF9CSU5ESU5HLCAiaHR0cDovL2xvY2FsaG9zdCIpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBTZXQgdGhlIGZlYXR1cmUgdG8gYmUgZGlzYWJsZWQuDQotICAgICAgICBpbnQgdGhyZXNob2xkID0gMjAwMDA7DQotICAgICAgICBNVE9NRmVhdHVyZSBmZWF0dXJlID0gbmV3IE1UT01GZWF0dXJlKHRocmVzaG9sZCk7DQotICAgICAgICAgICAgICAgIA0KLSAgICAgICAgRGlzcGF0Y2g8U291cmNlPiBkID0gc3ZjLmNyZWF0ZURpc3BhdGNoKG5ldyBRTmFtZSgiaHR0cDovL3Rlc3QiLCAiVGVzdFBvcnQiKSwgDQotICAgICAgICAgICAgU291cmNlLmNsYXNzLCBTZXJ2aWNlLk1vZGUuUEFZTE9BRCwgZmVhdHVyZSk7DQotICAgICAgICANCi0gICAgICAgIGQuaW52b2tlKG51bGwpOw0KLSAgICAgICAgDQotICAgICAgICBUZXN0Q2xpZW50SW52b2NhdGlvbkNvbnRyb2xsZXIgdGVzdENvbnRyb2xsZXIgPSBnZXRJbnZvY2F0aW9uQ29udHJvbGxlcigpOw0KLSAgICAgICAgDQotICAgICAgICBJbnZvY2F0aW9uQ29udGV4dCBpYyA9IHRlc3RDb250cm9sbGVyLmdldEludm9jYXRpb25Db250ZXh0KCk7DQotICAgICAgICBNZXNzYWdlQ29udGV4dCByZXF1ZXN0ID0gaWMuZ2V0UmVxdWVzdE1lc3NhZ2VDb250ZXh0KCk7DQotICAgICAgICANCi0gICAgICAgIC8vIEEgVGhyZXNob2xkIGluZGljYXRlcyB0aGF0IE1UT00gc2hvdWxkIGJlIGVuYWJsZWQuDQotICAgICAgICAvLyBUaGUgZGVjaXNpb24gYWJvdXQgd2hldGhlciB0aGUgYXR0YWNobWVudCBpcyBpbmxpbmVkIGlzIG1hZGUgb24gYSBwZXIgYXR0YWNobWVudA0KLSAgICAgICAgLy8gYmFzaXMgaW4gQXhpb20uLi5hbmQgY2Fubm90IGJlIHRlc3RlZCBpbiB1bml0IHRlc3QgdGhhdCBkb2VzIG5vdCBzZW5kIHRoZSBtZXNzYWdlDQotICAgICAgICAvLyB0byB0aGUgc2VydmVyLg0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiTVRPTSBzaG91bGQgYmUgZW5hYmxlZC4iLCByZXF1ZXN0LmdldE1lc3NhZ2UoKS5pc01UT01FbmFibGVkKCkpOw0KLSAgICB9DQotICAgIA0KLSAgICAvKg0KLSAgICAgKiBUZXN0IHRoZSBjby1leGlzdGVuY2Ugb2YgYW4gTVRPTUZlYXR1cmUgYW5kIGEgTVRPTSBiaW5kaW5nIHR5cGUgZm9yIGEgY2xpZW50Lg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdE1UT01GZWF0dXJlQW5kQmluZGluZygpIHsNCi0gICAgICAgIFNlcnZpY2Ugc3ZjID0gU2VydmljZS5jcmVhdGUobmV3IFFOYW1lKCJodHRwOi8vdGVzdCIsICJUZXN0U2VydmljZSIpKTsNCi0gICAgICAgIHN2Yy5hZGRQb3J0KG5ldyBRTmFtZSgiaHR0cDovL3Rlc3QiLCAiVGVzdFBvcnQiKSwgU09BUEJpbmRpbmcuU09BUDExSFRUUF9NVE9NX0JJTkRJTkcsICJodHRwOi8vbG9jYWxob3N0Iik7DQotICAgICAgICANCi0gICAgICAgIC8vIFVzZSB0aGUgZGVmYXVsdCBmZWF0dXJlIGNvbmZpZw0KLSAgICAgICAgTVRPTUZlYXR1cmUgZmVhdHVyZSA9IG5ldyBNVE9NRmVhdHVyZSgpOw0KLSAgICAgICAgDQotICAgICAgICBEaXNwYXRjaDxTb3VyY2U+IGQgPSBzdmMuY3JlYXRlRGlzcGF0Y2gobmV3IFFOYW1lKCJodHRwOi8vdGVzdCIsICJUZXN0UG9ydCIpLCANCi0gICAgICAgICAgICBTb3VyY2UuY2xhc3MsIFNlcnZpY2UuTW9kZS5QQVlMT0FELCBmZWF0dXJlKTsNCi0gICAgICAgIA0KLSAgICAgICAgZC5pbnZva2UobnVsbCk7DQotICAgICAgICANCi0gICAgICAgIFRlc3RDbGllbnRJbnZvY2F0aW9uQ29udHJvbGxlciB0ZXN0Q29udHJvbGxlciA9IGdldEludm9jYXRpb25Db250cm9sbGVyKCk7DQotICAgICAgICANCi0gICAgICAgIEludm9jYXRpb25Db250ZXh0IGljID0gdGVzdENvbnRyb2xsZXIuZ2V0SW52b2NhdGlvbkNvbnRleHQoKTsNCi0gICAgICAgIE1lc3NhZ2VDb250ZXh0IHJlcXVlc3QgPSBpYy5nZXRSZXF1ZXN0TWVzc2FnZUNvbnRleHQoKTsNCi0gICAgICAgIA0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiTVRPTSBzaG91bGQgYmUgZW5hYmxlZCB2aWEgdGhlIE1UT01GZWF0dXJlLiIsIHJlcXVlc3QuZ2V0TWVzc2FnZSgpLmlzTVRPTUVuYWJsZWQoKSk7DQotICAgIH0NCi0gICAgDQotICAgIC8qDQotICAgICAqIFRlc3QgdGhlIG92ZXJyaWRlIG9mIGFuIE1UT00gYmluZGluZyBieSBkaXNhYmxpbmcgTVRPTSB2aWEgdGhlIE1UT01GZWF0dXJlLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdE1UT01GZWF0dXJlQW5kQmluZGluZ092ZXJyaWRlKCkgew0KLSAgICAgICAgU2VydmljZSBzdmMgPSBTZXJ2aWNlLmNyZWF0ZShuZXcgUU5hbWUoImh0dHA6Ly90ZXN0IiwgIlRlc3RTZXJ2aWNlIikpOw0KLSAgICAgICAgc3ZjLmFkZFBvcnQobmV3IFFOYW1lKCJodHRwOi8vdGVzdCIsICJUZXN0UG9ydCIpLCBTT0FQQmluZGluZy5TT0FQMTFIVFRQX01UT01fQklORElORywgImh0dHA6Ly9sb2NhbGhvc3QiKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gVXNlIHRoZSBkZWZhdWx0IGZlYXR1cmUgY29uZmlnDQotICAgICAgICBNVE9NRmVhdHVyZSBmZWF0dXJlID0gbmV3IE1UT01GZWF0dXJlKGZhbHNlKTsNCi0gICAgICAgIA0KLSAgICAgICAgRGlzcGF0Y2g8U291cmNlPiBkID0gc3ZjLmNyZWF0ZURpc3BhdGNoKG5ldyBRTmFtZSgiaHR0cDovL3Rlc3QiLCAiVGVzdFBvcnQiKSwgDQotICAgICAgICAgICAgU291cmNlLmNsYXNzLCBTZXJ2aWNlLk1vZGUuUEFZTE9BRCwgZmVhdHVyZSk7DQotICAgICAgICANCi0gICAgICAgIGQuaW52b2tlKG51bGwpOw0KLSAgICAgICAgDQotICAgICAgICBUZXN0Q2xpZW50SW52b2NhdGlvbkNvbnRyb2xsZXIgdGVzdENvbnRyb2xsZXIgPSBnZXRJbnZvY2F0aW9uQ29udHJvbGxlcigpOw0KLSAgICAgICAgDQotICAgICAgICBJbnZvY2F0aW9uQ29udGV4dCBpYyA9IHRlc3RDb250cm9sbGVyLmdldEludm9jYXRpb25Db250ZXh0KCk7DQotICAgICAgICBNZXNzYWdlQ29udGV4dCByZXF1ZXN0ID0gaWMuZ2V0UmVxdWVzdE1lc3NhZ2VDb250ZXh0KCk7DQotICAgICAgICANCi0gICAgICAgIGFzc2VydEZhbHNlKCJNVE9NIHNob3VsZCBiZSBkaXNhYmxlZCB2aWEgdGhlIE1UT01GZWF0dXJlLiIsIHJlcXVlc3QuZ2V0TWVzc2FnZSgpLmlzTVRPTUVuYWJsZWQoKSk7ICAgICAgICANCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2xpZW50L2Rpc3BhdGNoL0Rpc3BhdGNoU3VibWlzc2lvbkFkZHJlc3NpbmdGZWF0dXJlVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NsaWVudC9kaXNwYXRjaC9EaXNwYXRjaFN1Ym1pc3Npb25BZGRyZXNzaW5nRmVhdHVyZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGIzNTNiYy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2xpZW50L2Rpc3BhdGNoL0Rpc3BhdGNoU3VibWlzc2lvbkFkZHJlc3NpbmdGZWF0dXJlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jbGllbnQuZGlzcGF0Y2g7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5BZGRyZXNzaW5nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5BZGRyZXNzaW5nQ29uc3RhbnRzLlN1Ym1pc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlSGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuYWRkcmVzc2luZy5TdWJtaXNzaW9uQWRkcmVzc2luZ0ZlYXR1cmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5hZGRyZXNzaW5nLlN1Ym1pc3Npb25FbmRwb2ludFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmFkZHJlc3NpbmcuU3VibWlzc2lvbkVuZHBvaW50UmVmZXJlbmNlQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNsaWVudC5JbnRlcmNlcHRhYmxlQ2xpZW50VGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jbGllbnQuVGVzdENsaWVudEludm9jYXRpb25Db250cm9sbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS5JbnZvY2F0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUuTWVzc2FnZUNvbnRleHQ7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC53cy5EaXNwYXRjaDsKLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5TT0FQQmluZGluZzsKLWltcG9ydCBqYXZheC54bWwud3Mud3NhZGRyZXNzaW5nLlczQ0VuZHBvaW50UmVmZXJlbmNlOwotaW1wb3J0IGphdmF4LnhtbC53cy53c2FkZHJlc3NpbmcuVzNDRW5kcG9pbnRSZWZlcmVuY2VCdWlsZGVyOwotCi0vKioKLSAqIFRoaXMgc3VpdGUgb2YgdGVzdHMgaXMgZm9yIHRoZSBTdWJtaXNzaW9uQWRkcmVzc2luZ0ZlYXR1cmUgY29uZmlndXJhdGlvbiB0aGF0IGNhbgotICogYmUgdXNlZCBvbiBEaXNwYXRjaCBjbGllbnRzLgotICovCi1wdWJsaWMgY2xhc3MgRGlzcGF0Y2hTdWJtaXNzaW9uQWRkcmVzc2luZ0ZlYXR1cmVUZXN0IGV4dGVuZHMgSW50ZXJjZXB0YWJsZUNsaWVudFRlc3RDYXNlIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBPTUZhY3RvcnkgT01GID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUU5hbWUgRUxFTUVOVDIwMDQwOCA9Ci0gICAgICAgIG5ldyBRTmFtZShTdWJtaXNzaW9uLldTQV9OQU1FU1BBQ0UsICJFbmRwb2ludFJlZmVyZW5jZSIsICJ3c2EiKTsKLSAgICAKLSAgICBwcml2YXRlIFczQ0VuZHBvaW50UmVmZXJlbmNlIHczY0VQUjsKLSAgICBwcml2YXRlIFN1Ym1pc3Npb25FbmRwb2ludFJlZmVyZW5jZSBzdWJFUFI7Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICAgICAgCi0gICAgICAgIFczQ0VuZHBvaW50UmVmZXJlbmNlQnVpbGRlciB3M2NCdWlsZGVyID0gbmV3IFczQ0VuZHBvaW50UmVmZXJlbmNlQnVpbGRlcigpOwotICAgICAgICB3M2NCdWlsZGVyID0gdzNjQnVpbGRlci5hZGRyZXNzKCJodHRwOi8vc29tZXdoZXJlLmNvbS9zb21laG93Iik7Ci0gICAgICAgIHczY0J1aWxkZXIgPSB3M2NCdWlsZGVyLnNlcnZpY2VOYW1lKG5ldyBRTmFtZSgiaHR0cDovL3Rlc3QiLCAiVGVzdFNlcnZpY2UiKSk7Ci0gICAgICAgIHczY0J1aWxkZXIgPSB3M2NCdWlsZGVyLmVuZHBvaW50TmFtZShuZXcgUU5hbWUoImh0dHA6Ly90ZXN0IiwgIlRlc3RQb3J0IikpOwotICAgICAgICB3M2NFUFIgPSB3M2NCdWlsZGVyLmJ1aWxkKCk7Ci0gICAgICAgIAotICAgICAgICBTdWJtaXNzaW9uRW5kcG9pbnRSZWZlcmVuY2VCdWlsZGVyIHN1YkJ1aWxkZXIgPSBuZXcgU3VibWlzc2lvbkVuZHBvaW50UmVmZXJlbmNlQnVpbGRlcigpOwotICAgICAgICBzdWJCdWlsZGVyID0gc3ViQnVpbGRlci5hZGRyZXNzKCJodHRwOi8vc29tZXdoZXJlLmNvbS9zb21laG93Iik7Ci0gICAgICAgIHN1YkJ1aWxkZXIgPSBzdWJCdWlsZGVyLnNlcnZpY2VOYW1lKG5ldyBRTmFtZSgiaHR0cDovL3Rlc3QiLCAiVGVzdFNlcnZpY2UiKSk7Ci0gICAgICAgIHN1YkJ1aWxkZXIgPSBzdWJCdWlsZGVyLmVuZHBvaW50TmFtZShuZXcgUU5hbWUoImh0dHA6Ly90ZXN0IiwgIlRlc3RQb3J0IikpOwotICAgICAgICBzdWJFUFIgPSBzdWJCdWlsZGVyLmJ1aWxkKCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBNYWtlIHN1cmUgU3VibWlzc2lvbkFkZHJlc3NpbmcgaXMgbm90IGVuYWJsZWQgYnkgZGVmYXVsdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9TdWJtaXNzaW9uQWRkcmVzc2luZ0ZlYXR1cmUoKSB7Ci0gICAgICAgIFNlcnZpY2Ugc3ZjID0gU2VydmljZS5jcmVhdGUobmV3IFFOYW1lKCJodHRwOi8vdGVzdCIsICJUZXN0U2VydmljZSIpKTsKLSAgICAgICAgc3ZjLmFkZFBvcnQobmV3IFFOYW1lKCJodHRwOi8vdGVzdCIsICJUZXN0UG9ydCIpLCBTT0FQQmluZGluZy5TT0FQMTFIVFRQX0JJTkRJTkcsICJodHRwOi8vbG9jYWxob3N0Iik7Ci0gICAgICAgIERpc3BhdGNoPFNvdXJjZT4gZCA9IHN2Yy5jcmVhdGVEaXNwYXRjaChzdWJFUFIsIFNvdXJjZS5jbGFzcywgU2VydmljZS5Nb2RlLlBBWUxPQUQpOwotICAgICAgICAKLSAgICAgICAgZC5pbnZva2UobnVsbCk7Ci0gICAgICAgIAotICAgICAgICBUZXN0Q2xpZW50SW52b2NhdGlvbkNvbnRyb2xsZXIgdGVzdENvbnRyb2xsZXIgPSBnZXRJbnZvY2F0aW9uQ29udHJvbGxlcigpOwotICAgICAgICBJbnZvY2F0aW9uQ29udGV4dCBpYyA9IHRlc3RDb250cm9sbGVyLmdldEludm9jYXRpb25Db250ZXh0KCk7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IHJlcXVlc3QgPSBpYy5nZXRSZXF1ZXN0TWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyB2ZXJzaW9uID0gKFN0cmluZykgcmVxdWVzdC5nZXRQcm9wZXJ0eShBZGRyZXNzaW5nQ29uc3RhbnRzLldTX0FERFJFU1NJTkdfVkVSU0lPTik7Ci0gICAgICAgIEJvb2xlYW4gZGlzYWJsZWQgPSAoQm9vbGVhbikgcmVxdWVzdC5nZXRQcm9wZXJ0eShBZGRyZXNzaW5nQ29uc3RhbnRzLkRJU0FCTEVfQUREUkVTU0lOR19GT1JfT1VUX01FU1NBR0VTKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydE51bGwodmVyc2lvbik7Ci0gICAgICAgIGFzc2VydFRydWUoZGlzYWJsZWQpOwotICAgICAgICAKLSAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0IGF4aXMyUmVxdWVzdCA9Ci0gICAgICAgICAgICByZXF1ZXN0LmdldEF4aXNNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2UgZXByID0KLSAgICAgICAgICAgIGF4aXMyUmVxdWVzdC5nZXRUbygpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0TnVsbChlcHIpOwotICAgIH0KLSAgICAKLSAgICAvKgotICAgICAqIFRlc3QgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBvZiB0aGUgU3VibWlzc2lvbkFkZHJlc3NpbmdGZWF0dXJlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3REZWZhdWx0U3VibWlzc2lvbkFkZHJlc3NpbmdGZWF0dXJlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFVzZSB0aGUgZGVmYXVsdCBmZWF0dXJlIGNvbmZpZwotICAgICAgICBTdWJtaXNzaW9uQWRkcmVzc2luZ0ZlYXR1cmUgZmVhdHVyZSA9IG5ldyBTdWJtaXNzaW9uQWRkcmVzc2luZ0ZlYXR1cmUoKTsKLSAgICAgICAgCi0gICAgICAgIFNlcnZpY2Ugc3ZjID0gU2VydmljZS5jcmVhdGUobmV3IFFOYW1lKCJodHRwOi8vdGVzdCIsICJUZXN0U2VydmljZSIpKTsKLSAgICAgICAgc3ZjLmFkZFBvcnQobmV3IFFOYW1lKCJodHRwOi8vdGVzdCIsICJUZXN0UG9ydCIpLCBTT0FQQmluZGluZy5TT0FQMTFIVFRQX0JJTkRJTkcsICJodHRwOi8vbG9jYWxob3N0Iik7Ci0gICAgICAgIERpc3BhdGNoPFNvdXJjZT4gZCA9IHN2Yy5jcmVhdGVEaXNwYXRjaChzdWJFUFIsIFNvdXJjZS5jbGFzcywgU2VydmljZS5Nb2RlLlBBWUxPQUQsIGZlYXR1cmUpOwotICAgICAgICAKLSAgICAgICAgZC5pbnZva2UobnVsbCk7Ci0gICAgICAgIAotICAgICAgICBUZXN0Q2xpZW50SW52b2NhdGlvbkNvbnRyb2xsZXIgdGVzdENvbnRyb2xsZXIgPSBnZXRJbnZvY2F0aW9uQ29udHJvbGxlcigpOwotICAgICAgICBJbnZvY2F0aW9uQ29udGV4dCBpYyA9IHRlc3RDb250cm9sbGVyLmdldEludm9jYXRpb25Db250ZXh0KCk7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IHJlcXVlc3QgPSBpYy5nZXRSZXF1ZXN0TWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyB2ZXJzaW9uID0gKFN0cmluZykgcmVxdWVzdC5nZXRQcm9wZXJ0eShBZGRyZXNzaW5nQ29uc3RhbnRzLldTX0FERFJFU1NJTkdfVkVSU0lPTik7Ci0gICAgICAgIEJvb2xlYW4gZGlzYWJsZWQgPSAoQm9vbGVhbikgcmVxdWVzdC5nZXRQcm9wZXJ0eShBZGRyZXNzaW5nQ29uc3RhbnRzLkRJU0FCTEVfQUREUkVTU0lOR19GT1JfT1VUX01FU1NBR0VTKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydEVxdWFscyhTdWJtaXNzaW9uLldTQV9OQU1FU1BBQ0UsIHZlcnNpb24pOwotICAgICAgICBhc3NlcnRGYWxzZShkaXNhYmxlZCk7Ci0gICAgICAgIAotICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQgYXhpczJSZXF1ZXN0ID0KLSAgICAgICAgICAgIHJlcXVlc3QuZ2V0QXhpc01lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZSBlcHIgPQotICAgICAgICAgICAgYXhpczJSZXF1ZXN0LmdldFRvKCk7Ci0gICAgICAgIAotICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0KLSAgICAgICAgICAgIEVuZHBvaW50UmVmZXJlbmNlSGVscGVyLnRvT00oT01GLCBlcHIsIEVMRU1FTlQyMDA0MDgsIFN1Ym1pc3Npb24uV1NBX05BTUVTUEFDRSk7Ci0gICAgICAgIGFzc2VydFhNTEVxdWFsKHN1YkVQUi50b1N0cmluZygpLCBvbUVsZW1lbnQudG9TdHJpbmcoKSk7Ci0gICAgfQotICAgIAotICAgIC8qCi0gICAgICogVGVzdCBkaXNhYmxpbmcgdGhlIFN1Ym1pc3Npb25BZGRyZXNzaW5nIGZlYXR1cmUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdERpc2FibGVkU3VibWlzc2lvbkFkZHJlc3NpbmdGZWF0dXJlKCkgewotICAgICAgICAvLyBTZXQgdGhlIGZlYXR1cmUgdG8gYmUgZGlzYWJsZWQuCi0gICAgICAgIFN1Ym1pc3Npb25BZGRyZXNzaW5nRmVhdHVyZSBmZWF0dXJlID0gbmV3IFN1Ym1pc3Npb25BZGRyZXNzaW5nRmVhdHVyZShmYWxzZSk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgIFNlcnZpY2Ugc3ZjID0gU2VydmljZS5jcmVhdGUobmV3IFFOYW1lKCJodHRwOi8vdGVzdCIsICJUZXN0U2VydmljZSIpKTsKLSAgICAgICAgc3ZjLmFkZFBvcnQobmV3IFFOYW1lKCJodHRwOi8vdGVzdCIsICJUZXN0UG9ydCIpLCBTT0FQQmluZGluZy5TT0FQMTFIVFRQX0JJTkRJTkcsICJodHRwOi8vbG9jYWxob3N0Iik7ICAgICAgICAKLSAgICAgICAgRGlzcGF0Y2g8U291cmNlPiBkID0gc3ZjLmNyZWF0ZURpc3BhdGNoKHN1YkVQUiwgU291cmNlLmNsYXNzLCBTZXJ2aWNlLk1vZGUuUEFZTE9BRCwgZmVhdHVyZSk7Ci0gICAgICAgIAotICAgICAgICBkLmludm9rZShudWxsKTsKLSAgICAgICAgCi0gICAgICAgIFRlc3RDbGllbnRJbnZvY2F0aW9uQ29udHJvbGxlciB0ZXN0Q29udHJvbGxlciA9IGdldEludm9jYXRpb25Db250cm9sbGVyKCk7Ci0gICAgICAgIEludm9jYXRpb25Db250ZXh0IGljID0gdGVzdENvbnRyb2xsZXIuZ2V0SW52b2NhdGlvbkNvbnRleHQoKTsKLSAgICAgICAgTWVzc2FnZUNvbnRleHQgcmVxdWVzdCA9IGljLmdldFJlcXVlc3RNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICAKLSAgICAgICAgU3RyaW5nIHZlcnNpb24gPSAoU3RyaW5nKSByZXF1ZXN0LmdldFByb3BlcnR5KEFkZHJlc3NpbmdDb25zdGFudHMuV1NfQUREUkVTU0lOR19WRVJTSU9OKTsKLSAgICAgICAgQm9vbGVhbiBkaXNhYmxlZCA9IChCb29sZWFuKSByZXF1ZXN0LmdldFByb3BlcnR5KEFkZHJlc3NpbmdDb25zdGFudHMuRElTQUJMRV9BRERSRVNTSU5HX0ZPUl9PVVRfTUVTU0FHRVMpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFN1Ym1pc3Npb24uV1NBX05BTUVTUEFDRSwgdmVyc2lvbik7Ci0gICAgICAgIGFzc2VydFRydWUoZGlzYWJsZWQpOwotICAgICAgICAKLSAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0IGF4aXMyUmVxdWVzdCA9Ci0gICAgICAgICAgICByZXF1ZXN0LmdldEF4aXNNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2UgZXByID0KLSAgICAgICAgICAgIGF4aXMyUmVxdWVzdC5nZXRUbygpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0TnVsbChlcHIpOwotICAgIH0KLSAgICAKLSAgICAvLyBUZXN0IGNvbmZpZ3VyYXRpb25zIHRoYXQgYXJlIG5vdCBhbGxvd2VkIHdpdGggdGhlIFN1Ym1pc3Npb25BZGRyZXNzaW5nRmVhdHVyZQotICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkU3VibWlzc2lvbkFkZHJlc3NpbmdGZWF0dXJlKCkgewotICAgICAgICAvLyBVc2UgdGhlIGRlZmF1bHQgZmVhdHVyZSBjb25maWcKLSAgICAgICAgU3VibWlzc2lvbkFkZHJlc3NpbmdGZWF0dXJlIGZlYXR1cmUgPSBuZXcgU3VibWlzc2lvbkFkZHJlc3NpbmdGZWF0dXJlKCk7Ci0gICAgICAgIAotICAgICAgICBTZXJ2aWNlIHN2YyA9IFNlcnZpY2UuY3JlYXRlKG5ldyBRTmFtZSgiaHR0cDovL3Rlc3QiLCAiVGVzdFNlcnZpY2UiKSk7Ci0gICAgICAgIHN2Yy5hZGRQb3J0KG5ldyBRTmFtZSgiaHR0cDovL3Rlc3QiLCAiVGVzdFBvcnQiKSwgU09BUEJpbmRpbmcuU09BUDExSFRUUF9CSU5ESU5HLCAiaHR0cDovL2xvY2FsaG9zdCIpOwotICAgICAgICBEaXNwYXRjaDxTb3VyY2U+IGQgPSBzdmMuY3JlYXRlRGlzcGF0Y2godzNjRVBSLCBTb3VyY2UuY2xhc3MsIFNlcnZpY2UuTW9kZS5QQVlMT0FELCBmZWF0dXJlKTsKLSAgICAgICAgCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBkLmludm9rZShudWxsKTsKLSAgICAgICAgICAgIGZhaWwoIkFuIGV4Y2VwdGlvbiBzaG91bGQgaGF2ZSBiZWVuIHRocm93biIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChXZWJTZXJ2aWNlRXhjZXB0aW9uIHdzZSkgewotICAgICAgICAgICAgLy9wYXNzCi0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJUaGUgd3JvbmcgZXhjZXB0aW9uIHR5cGUgd2FzIHRocm93bi4iKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jbGllbnQvZGlzcGF0Y2gvRHluYW1pY1BvcnRDYWNoaW5nVGVzdHMuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jbGllbnQvZGlzcGF0Y2gvRHluYW1pY1BvcnRDYWNoaW5nVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjAzOTY3OC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2xpZW50L2Rpc3BhdGNoL0R5bmFtaWNQb3J0Q2FjaGluZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICogDQotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKiAgICAgIA0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY2xpZW50LmRpc3BhdGNoOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRGVzY3JpcHRpb25UZXN0VXRpbHMyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLlNlcnZpY2VEZXNjcmlwdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zcGkuQ2xpZW50TWV0YWRhdGFUZXN0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNwaS5TZXJ2aWNlRGVsZWdhdGU7DQotDQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlOw0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLS8qKg0KLSAqIFRlc3RzIHRoZSBjYWNoaW5nIGFuZCBpc29sYXRpb24gb2YgZHluYW1pYyBwb3J0cyxpLmUuIHRob3NlIGNyZWF0ZWQgd2l0aA0KLSAqIFNlcnZpY2UuYWRkUG9ydCguLi4pLiAgRHluYW1pYyBwb3J0cyBzaG91bGQNCi0gKiAxKSBPbmx5IGJlIHZpc2libGUgdG8gc2VydmljZXMgb24gd2hpY2ggYW4gYWRkUG9ydCB3YXMgZG9uZQ0KLSAqIDIpIFNoYXJlIGluc3RhbmNlcyBvZiB0aGUgZGVzY3JpcHRpb24gb2JqZWN0cyAoZS5nLiBBeGlzU2VydmljZSkgZm9yIHBvcnRzDQotICogYWRkZWQgdG8gZGlmZmVyZW50IGluc3RhbmNlcyBvZiB0aGUgc2FtZSBzZXJ2aWNlIHRoYXQgdXNlIHRoZSBzYW1lIGNsaWVudA0KLSAqIGNvbmZpZ3VyYXRpb24NCi0gKiAzKSBJZGVudGljYWwgcG9ydHMgb24gc2VydmljZXMgdXNpbmcgZGlmZmVyZW50IGNsaWVudCBjb25maWd1cmF0aW9uIHNob3VsZA0KLSAqIG5vdCBiZSBzaGFyZWQgDQotICovDQotcHVibGljIGNsYXNzIER5bmFtaWNQb3J0Q2FjaGluZ1Rlc3RzIGV4dGVuZHMgVGVzdENhc2Ugew0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIG5hbWVzcGFjZVVSSSA9ICJodHRwOi8vZGlzcGF0Y2guY2xpZW50LmpheHdzLmF4aXMyLmFwYWNoZS5vcmciOw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIHN2Y0xvY2FsUGFydCA9ICJzdmNMb2NhbFBhcnQiOw0KLSAgICANCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBkeW5hbWljUG9ydDEgPSAiZHluYW1pY1BvcnQxIjsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBiaW5kaW5nSUQxID0gbnVsbDsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBlcHIxID0gbnVsbDsNCi0NCi0gICAgLyoqDQotICAgICAqIFR3byBkaWZmZXJlbnQgaW5zdGFuY2VzIG9mIHRoZSBzYW1lIHNlcnZpY2Ugc2hvdWxkIHNoYXJlIHRoZSBzYW1lDQotICAgICAqIGRlc2NyaXB0aW9uIGluZm9ybWF0aW9uIChlLmcuIEF4aXNTZXJ2aWNlKSBpZiB0aGUgc2FtZSBwb3J0IGlzIGFkZGVkDQotICAgICAqIHRvIGJvdGggDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBfdGVzdFNhbWVQb3J0c1NhbWVTZXJ2aWNlKCkgew0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBDbGllbnRNZXRhZGF0YVRlc3QuaW5zdGFsbENhY2hpbmdGYWN0b3J5KCk7DQotICAgICAgICAgICAgUU5hbWUgc3ZjUU4gPSBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBzdmNMb2NhbFBhcnQpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIFNlcnZpY2Ugc3ZjMSA9IFNlcnZpY2UuY3JlYXRlKHN2Y1FOKTsNCi0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHN2YzEpOw0KLSAgICAgICAgICAgIFNlcnZpY2VEZWxlZ2F0ZSBzdmNEbGcxID0gRGVzY3JpcHRpb25UZXN0VXRpbHMyLmdldFNlcnZpY2VEZWxlZ2F0ZShzdmMxKTsNCi0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHN2Y0RsZzEpOw0KLSAgICAgICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzdmNEZXNjMSA9IHN2Y0RsZzEuZ2V0U2VydmljZURlc2NyaXB0aW9uKCk7DQotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChzdmNEZXNjMSk7DQotDQotICAgICAgICAgICAgU2VydmljZSBzdmMyID0gU2VydmljZS5jcmVhdGUoc3ZjUU4pOw0KLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoc3ZjMik7DQotICAgICAgICAgICAgU2VydmljZURlbGVnYXRlIHN2Y0RsZzIgPSBEZXNjcmlwdGlvblRlc3RVdGlsczIuZ2V0U2VydmljZURlbGVnYXRlKHN2YzIpOw0KLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoc3ZjRGxnMik7DQotICAgICAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHN2Y0Rlc2MyID0gc3ZjRGxnMi5nZXRTZXJ2aWNlRGVzY3JpcHRpb24oKTsNCi0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHN2Y0Rlc2MyKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBhc3NlcnROb3RTYW1lKCJTZXJ2aWNlIGluc3RhbmNlcyBzaG91bGQgbm90IGJlIHRoZSBzYW1lIiwgc3ZjMSwgc3ZjMik7DQotICAgICAgICAgICAgYXNzZXJ0Tm90U2FtZSgiU2VydmljZSBkZWxlZ2F0ZXMgc2hvdWxkIG5vdCBiZSB0aGUgc2FtZSIsIHN2Y0RsZzEsIHN2Y0RsZzIpOw0KLSAgICAgICAgICAgIGFzc2VydFNhbWUoIkluc3RhbmNlIG9mIFNlcnZpY2VEZXNjcmlwdGlvbiBzaG91bGQgYmUgdGhlIHNhbWUiLCBzdmNEZXNjMSwgc3ZjRGVzYzIpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIEFkZCBhIHBvcnQgdG8gMXN0IHNlcnZpY2UsIHNob3VsZCBub3QgYmUgdmlzaWJsZSB1bmRlciB0aGUgMm5kIHNlcnZpY2UNCi0gICAgICAgICAgICBzdmMxLmFkZFBvcnQobmV3IFFOYW1lKG5hbWVzcGFjZVVSSSwgZHluYW1pY1BvcnQxKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgYmluZGluZ0lEMSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgZXByMSk7DQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGdldExpc3Qoc3ZjMS5nZXRQb3J0cygpKS5zaXplKCkpOw0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCBnZXRMaXN0KHN2YzIuZ2V0UG9ydHMoKSkuc2l6ZSgpKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBBZGQgdGhlIHNhbWUgcG9ydCB0byAybmQgc2VydmljZSwgc2hvdWxkIG5vdyBoYXZlIHNhbWUgcG9ydHMgYW5kIGRlc2NyaXB0aW9uDQotICAgICAgICAgICAgLy8gb2JqZWN0cw0KLSAgICAgICAgICAgIHN2YzIuYWRkUG9ydChuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBkeW5hbWljUG9ydDEpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kaW5nSUQxLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICBlcHIxKTsNCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgZ2V0TGlzdChzdmMxLmdldFBvcnRzKCkpLnNpemUoKSk7DQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGdldExpc3Qoc3ZjMi5nZXRQb3J0cygpKS5zaXplKCkpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIA0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgICBDbGllbnRNZXRhZGF0YVRlc3QucmVzdG9yZU9yaWdpbmFsRmFjdG9yeSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRQb3J0T09NKCkgew0KLSAgICAgICAgUU5hbWUgc3ZjUU4gPSBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBzdmNMb2NhbFBhcnQpOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBDbGllbnRNZXRhZGF0YVRlc3QuaW5zdGFsbENhY2hpbmdGYWN0b3J5KCk7DQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1MDAwIDsgaSsrKSB7DQotICAgICAgICAgICAgICAgIFNlcnZpY2Ugc3ZjMSA9IFNlcnZpY2UuY3JlYXRlKHN2Y1FOKTsNCi0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJQb3J0IG51bWJlciAiICsgaSk7DQotICAgICAgICAgICAgICAgIHN2YzEuYWRkUG9ydChuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBkeW5hbWljUG9ydDEgKyAiXyIgLyorIGkqLyksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kaW5nSUQxLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXByMSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsNCi0gICAgICAgICAgICBmYWlsKCJDYXVnaHQgdGhyb3dhYmxlICIgKyB0KTsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgICAgQ2xpZW50TWV0YWRhdGFUZXN0LnJlc3RvcmVPcmlnaW5hbEZhY3RvcnkoKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIExpc3QgZ2V0TGlzdChJdGVyYXRvciBpdCkgew0KLSAgICAgICAgTGlzdCByZXR1cm5MaXN0ID0gbmV3IEFycmF5TGlzdCgpOw0KLSAgICAgICAgd2hpbGUgKGl0ICE9IG51bGwgJiYgaXQuaGFzTmV4dCgpKSB7DQotICAgICAgICAgICAgcmV0dXJuTGlzdC5hZGQoaXQubmV4dCgpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiByZXR1cm5MaXN0Ow0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jbGllbnQvZGlzcGF0Y2gvSW52b2NhdGlvbkNvbnRyb2xsZXJUZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2xpZW50L2Rpc3BhdGNoL0ludm9jYXRpb25Db250cm9sbGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODJlZjQ1Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jbGllbnQvZGlzcGF0Y2gvSW52b2NhdGlvbkNvbnRyb2xsZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNsaWVudC5kaXNwYXRjaDsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUuSW52b2NhdGlvbkNvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS5jb250cm9sbGVyLkludm9jYXRpb25Db250cm9sbGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUuY29udHJvbGxlci5JbnZvY2F0aW9uQ29udHJvbGxlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS5jb250cm9sbGVyLmltcGwuQXhpc0ludm9jYXRpb25Db250cm9sbGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUuY29udHJvbGxlci5pbXBsLkludm9jYXRpb25Db250cm9sbGVyRmFjdG9yeUltcGw7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MucmVnaXN0cnkuRmFjdG9yeVJlZ2lzdHJ5Ow0KLQ0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOw0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLkFzeW5jSGFuZGxlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLkRpc3BhdGNoOw0KLWltcG9ydCBqYXZheC54bWwud3MuUmVzcG9uc2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5TT0FQQmluZGluZzsNCi1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOw0KLQ0KLXB1YmxpYyBjbGFzcyBJbnZvY2F0aW9uQ29udHJvbGxlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7DQotDQotICAgIHByaXZhdGUgUU5hbWUgc3ZjUW5hbWUgPSBuZXcgUU5hbWUoImh0dHA6Ly90ZXN0IiwgIlRlc3RTZXJ2aWNlIik7DQotICAgIHByaXZhdGUgUU5hbWUgcG9ydFFuYW1lID0gbmV3IFFOYW1lKCJodHRwOi8vdGVzdCIsICJUZXN0UG9ydCIpOw0KLSAgICANCi0gICAgcHVibGljIHZvaWQgdGVzdERlZmF1bHRJbnZvY2F0aW9uQ29udHJvbGxlcigpIHsNCi0gICAgICAgIFNlcnZpY2Ugc3ZjID0gU2VydmljZS5jcmVhdGUoc3ZjUW5hbWUpOw0KLSAgICAgICAgc3ZjLmFkZFBvcnQocG9ydFFuYW1lLCBTT0FQQmluZGluZy5TT0FQMTFIVFRQX0JJTkRJTkcsICJodHRwOi8vbG9jYWxob3N0Iik7DQotICAgICAgICBEaXNwYXRjaCBkID0gc3ZjLmNyZWF0ZURpc3BhdGNoKHBvcnRRbmFtZSwgU291cmNlLmNsYXNzLCBTZXJ2aWNlLk1vZGUuUEFZTE9BRCk7DQotICAgICAgICANCi0gICAgICAgIEJhc2VEaXNwYXRjaCBiZCA9IChCYXNlRGlzcGF0Y2gpIGQ7DQotICAgICAgICANCi0gICAgICAgIGFzc2VydFRydWUoIkFuIEludm9jYXRpb25Db250cm9sbGVyIGluc3RhbmNlIHdhcyBub3QgY3JlYXRlZCIsIGJkLmljICE9IG51bGwpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIGRlZmF1bHQgSW52b2NhdGlvbkNvbnRyb2xsZXIgdHlwZSB3YXMgaW5jb3JyZWN0LiIsIA0KLSAgICAgICAgICAgIEF4aXNJbnZvY2F0aW9uQ29udHJvbGxlci5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGJkLmljLmdldENsYXNzKCkpKTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIHZvaWQgdGVzdFBsdWdnYWJsZUludm9jYXRpb25Db250cm9sbGVyKCkgew0KLSAgICAgICAgRmFjdG9yeVJlZ2lzdHJ5LnNldEZhY3RvcnkoSW52b2NhdGlvbkNvbnRyb2xsZXJGYWN0b3J5LmNsYXNzLCBuZXcgVGVzdEludm9jYXRpb25Db250cm9sbGVyRmFjdG9yeSgpKTsNCi0gICAgICAgIA0KLSAgICAgICAgU2VydmljZSBzdmMgPSBTZXJ2aWNlLmNyZWF0ZShzdmNRbmFtZSk7DQotICAgICAgICBzdmMuYWRkUG9ydChwb3J0UW5hbWUsIFNPQVBCaW5kaW5nLlNPQVAxMUhUVFBfQklORElORywgImh0dHA6Ly9sb2NhbGhvc3QiKTsNCi0gICAgICAgIERpc3BhdGNoIGQgPSBzdmMuY3JlYXRlRGlzcGF0Y2gocG9ydFFuYW1lLCBTb3VyY2UuY2xhc3MsIFNlcnZpY2UuTW9kZS5QQVlMT0FEKTsNCi0gICAgICAgIA0KLSAgICAgICAgQmFzZURpc3BhdGNoIGJkID0gKEJhc2VEaXNwYXRjaCkgZDsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gU2V0IGl0IGJhY2sgdG8gdGhlIGRlZmF1bHQgc28gd2UgZG9uJ3QgYnJlYWsgb3RoZXIgdGVzdHMuDQotICAgICAgICBGYWN0b3J5UmVnaXN0cnkuc2V0RmFjdG9yeShJbnZvY2F0aW9uQ29udHJvbGxlckZhY3RvcnkuY2xhc3MsIG5ldyBJbnZvY2F0aW9uQ29udHJvbGxlckZhY3RvcnlJbXBsKCkpOw0KLSAgICAgICAgDQotICAgICAgICBhc3NlcnRUcnVlKCJBbiBJbnZvY2F0aW9uQ29udHJvbGxlciBpbnN0YW5jZSB3YXMgbm90IGNyZWF0ZWQiLCBiZC5pYyAhPSBudWxsKTsNCi0gICAgICAgIGFzc2VydFRydWUoIlRoZSBkZWZhdWx0IEludm9jYXRpb25Db250cm9sbGVyIHR5cGUgd2FzIGluY29ycmVjdC4iLCANCi0gICAgICAgICAgICBUZXN0SW52b2NhdGlvbkNvbnRyb2xsZXIuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShiZC5pYy5nZXRDbGFzcygpKSk7DQotICAgIH0NCi19DQotDQotY2xhc3MgVGVzdEludm9jYXRpb25Db250cm9sbGVyRmFjdG9yeSBpbXBsZW1lbnRzIEludm9jYXRpb25Db250cm9sbGVyRmFjdG9yeSB7DQotICAgIHB1YmxpYyBJbnZvY2F0aW9uQ29udHJvbGxlciBnZXRJbnZvY2F0aW9uQ29udHJvbGxlcigpIHsNCi0gICAgICAgIHJldHVybiBuZXcgVGVzdEludm9jYXRpb25Db250cm9sbGVyKCk7IA0KLSAgICB9DQotfQ0KLQ0KLWNsYXNzIFRlc3RJbnZvY2F0aW9uQ29udHJvbGxlciBpbXBsZW1lbnRzIEludm9jYXRpb25Db250cm9sbGVyIHsNCi0NCi0gICAgcHVibGljIEludm9jYXRpb25Db250ZXh0IGludm9rZShJbnZvY2F0aW9uQ29udGV4dCBpYykgew0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEZ1dHVyZTw/PiBpbnZva2VBc3luYyhJbnZvY2F0aW9uQ29udGV4dCBpYywgQXN5bmNIYW5kbGVyIGFzeW5jSGFuZGxlcikgew0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFJlc3BvbnNlIGludm9rZUFzeW5jKEludm9jYXRpb25Db250ZXh0IGljKSB7DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBpbnZva2VPbmVXYXkoSW52b2NhdGlvbkNvbnRleHQgaWMpIHRocm93cyBFeGNlcHRpb24ge30gICAgDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jbGllbnQvcHJveHkvUHJveHlBZGRyZXNzaW5nRmVhdHVyZVRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jbGllbnQvcHJveHkvUHJveHlBZGRyZXNzaW5nRmVhdHVyZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QwNjY3OC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2xpZW50L3Byb3h5L1Byb3h5QWRkcmVzc2luZ0ZlYXR1cmVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNsaWVudC5wcm94eTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkFkZHJlc3NpbmdDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkFkZHJlc3NpbmdDb25zdGFudHMuRmluYWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlSGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuYWRkcmVzc2luZy5TdWJtaXNzaW9uRW5kcG9pbnRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5hZGRyZXNzaW5nLlN1Ym1pc3Npb25FbmRwb2ludFJlZmVyZW5jZUJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jbGllbnQuSW50ZXJjZXB0YWJsZUNsaWVudFRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY2xpZW50LlRlc3RDbGllbnRJbnZvY2F0aW9uQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUuSW52b2NhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLk1lc3NhZ2VDb250ZXh0OwotCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5BZGRyZXNzaW5nRmVhdHVyZTsKLWltcG9ydCBqYXZheC54bWwud3Mud3NhZGRyZXNzaW5nLlczQ0VuZHBvaW50UmVmZXJlbmNlOwotaW1wb3J0IGphdmF4LnhtbC53cy53c2FkZHJlc3NpbmcuVzNDRW5kcG9pbnRSZWZlcmVuY2VCdWlsZGVyOwotCi0vKioKLSAqIFRoaXMgc3VpdGUgb2YgdGVzdHMgaXMgZm9yIHRoZSBBZGRyZXNzaW5nRmVhdHVyZSBjb25maWd1cmF0aW9uIHRoYXQgY2FuCi0gKiBiZSB1c2VkIG9uIFByb3h5IGNsaWVudHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm94eUFkZHJlc3NpbmdGZWF0dXJlVGVzdCBleHRlbmRzIEludGVyY2VwdGFibGVDbGllbnRUZXN0Q2FzZSB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgT01GYWN0b3J5IE9NRiA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFFOYW1lIEVMRU1FTlQyMDA1MDggPQotICAgICAgICBuZXcgUU5hbWUoRmluYWwuV1NBX05BTUVTUEFDRSwgIkVuZHBvaW50UmVmZXJlbmNlIiwgIndzYSIpOwotICAgIAotICAgIHByaXZhdGUgVzNDRW5kcG9pbnRSZWZlcmVuY2UgdzNjRVBSOwotICAgIHByaXZhdGUgU3VibWlzc2lvbkVuZHBvaW50UmVmZXJlbmNlIHN1YkVQUjsKLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgICAgIAotICAgICAgICBXM0NFbmRwb2ludFJlZmVyZW5jZUJ1aWxkZXIgdzNjQnVpbGRlciA9IG5ldyBXM0NFbmRwb2ludFJlZmVyZW5jZUJ1aWxkZXIoKTsKLSAgICAgICAgdzNjQnVpbGRlciA9IHczY0J1aWxkZXIuYWRkcmVzcygiaHR0cDovL3NvbWV3aGVyZS5jb20vc29tZWhvdyIpOwotICAgICAgICB3M2NCdWlsZGVyID0gdzNjQnVpbGRlci5zZXJ2aWNlTmFtZShuZXcgUU5hbWUoImh0dHA6Ly90ZXN0IiwgIlByb3h5QWRkcmVzc2luZ1NlcnZpY2UiKSk7Ci0gICAgICAgIHczY0J1aWxkZXIgPSB3M2NCdWlsZGVyLmVuZHBvaW50TmFtZShuZXcgUU5hbWUoImh0dHA6Ly90ZXN0IiwgIlRlc3RQb3J0IikpOwotICAgICAgICB3M2NFUFIgPSB3M2NCdWlsZGVyLmJ1aWxkKCk7Ci0gICAgICAgIAotICAgICAgICBTdWJtaXNzaW9uRW5kcG9pbnRSZWZlcmVuY2VCdWlsZGVyIHN1YkJ1aWxkZXIgPSBuZXcgU3VibWlzc2lvbkVuZHBvaW50UmVmZXJlbmNlQnVpbGRlcigpOwotICAgICAgICBzdWJCdWlsZGVyID0gc3ViQnVpbGRlci5hZGRyZXNzKCJodHRwOi8vc29tZXdoZXJlLmNvbS9zb21laG93Iik7Ci0gICAgICAgIHN1YkJ1aWxkZXIgPSBzdWJCdWlsZGVyLnNlcnZpY2VOYW1lKG5ldyBRTmFtZSgiaHR0cDovL3Rlc3QiLCAiUHJveHlBZGRyZXNzaW5nU2VydmljZSIpKTsKLSAgICAgICAgc3ViQnVpbGRlciA9IHN1YkJ1aWxkZXIuZW5kcG9pbnROYW1lKG5ldyBRTmFtZSgiaHR0cDovL3Rlc3QiLCAiVGVzdFBvcnQiKSk7Ci0gICAgICAgIHN1YkVQUiA9IHN1YkJ1aWxkZXIuYnVpbGQoKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIE1ha2Ugc3VyZSBBZGRyZXNzaW5nIGlzIG5vdCBlbmFibGVkIGJ5IGRlZmF1bHQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdE5vQWRkcmVzc2luZ0ZlYXR1cmUoKSB7Ci0gICAgICAgIFNlcnZpY2Ugc3ZjID0gU2VydmljZS5jcmVhdGUobmV3IFFOYW1lKCJodHRwOi8vdGVzdCIsICJQcm94eUFkZHJlc3NpbmdTZXJ2aWNlIikpOwotICAgICAgICBQcm94eUFkZHJlc3NpbmdTZXJ2aWNlIHByb3h5ID0gc3ZjLmdldFBvcnQoUHJveHlBZGRyZXNzaW5nU2VydmljZS5jbGFzcyk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocHJveHkpOwotICAgICAgICAKLSAgICAgICAgcHJveHkuZG9Tb21ldGhpbmcoIjEyMzQ1Iik7Ci0gICAgICAgIAotICAgICAgICBUZXN0Q2xpZW50SW52b2NhdGlvbkNvbnRyb2xsZXIgdGVzdENvbnRyb2xsZXIgPSBnZXRJbnZvY2F0aW9uQ29udHJvbGxlcigpOwotICAgICAgICBJbnZvY2F0aW9uQ29udGV4dCBpYyA9IHRlc3RDb250cm9sbGVyLmdldEludm9jYXRpb25Db250ZXh0KCk7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IHJlcXVlc3QgPSBpYy5nZXRSZXF1ZXN0TWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyB2ZXJzaW9uID0gKFN0cmluZykgcmVxdWVzdC5nZXRQcm9wZXJ0eShBZGRyZXNzaW5nQ29uc3RhbnRzLldTX0FERFJFU1NJTkdfVkVSU0lPTik7Ci0gICAgICAgIEJvb2xlYW4gZGlzYWJsZWQgPSAoQm9vbGVhbikgcmVxdWVzdC5nZXRQcm9wZXJ0eShBZGRyZXNzaW5nQ29uc3RhbnRzLkRJU0FCTEVfQUREUkVTU0lOR19GT1JfT1VUX01FU1NBR0VTKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydE51bGwodmVyc2lvbik7Ci0gICAgICAgIGFzc2VydFRydWUoZGlzYWJsZWQpOwotICAgICAgICAKLSAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0IGF4aXMyUmVxdWVzdCA9Ci0gICAgICAgICAgICByZXF1ZXN0LmdldEF4aXNNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2UgZXByID0KLSAgICAgICAgICAgIGF4aXMyUmVxdWVzdC5nZXRUbygpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0TnVsbChlcHIpOwotICAgIH0KLSAgICAKLSAgICAvKgotICAgICAqIFRlc3QgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBvZiB0aGUgQWRkcmVzc2luZ0ZlYXR1cmUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdERlZmF1bHRBZGRyZXNzaW5nRmVhdHVyZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBVc2UgdGhlIGRlZmF1bHQgZmVhdHVyZSBjb25maWcKLSAgICAgICAgQWRkcmVzc2luZ0ZlYXR1cmUgZmVhdHVyZSA9IG5ldyBBZGRyZXNzaW5nRmVhdHVyZSgpOwotICAgICAgICAKLSAgICAgICAgU2VydmljZSBzdmMgPSBTZXJ2aWNlLmNyZWF0ZShuZXcgUU5hbWUoImh0dHA6Ly90ZXN0IiwgIlByb3h5QWRkcmVzc2luZ1NlcnZpY2UiKSk7Ci0gICAgICAgIFByb3h5QWRkcmVzc2luZ1NlcnZpY2UgcHJveHkgPSBzdmMuZ2V0UG9ydCh3M2NFUFIsIFByb3h5QWRkcmVzc2luZ1NlcnZpY2UuY2xhc3MsIGZlYXR1cmUpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHByb3h5KTsKLSAgICAgICAgCi0gICAgICAgIHByb3h5LmRvU29tZXRoaW5nKCIxMjM0NSIpOwotICAgICAgICAKLSAgICAgICAgVGVzdENsaWVudEludm9jYXRpb25Db250cm9sbGVyIHRlc3RDb250cm9sbGVyID0gZ2V0SW52b2NhdGlvbkNvbnRyb2xsZXIoKTsKLSAgICAgICAgSW52b2NhdGlvbkNvbnRleHQgaWMgPSB0ZXN0Q29udHJvbGxlci5nZXRJbnZvY2F0aW9uQ29udGV4dCgpOwotICAgICAgICBNZXNzYWdlQ29udGV4dCByZXF1ZXN0ID0gaWMuZ2V0UmVxdWVzdE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgdmVyc2lvbiA9IChTdHJpbmcpIHJlcXVlc3QuZ2V0UHJvcGVydHkoQWRkcmVzc2luZ0NvbnN0YW50cy5XU19BRERSRVNTSU5HX1ZFUlNJT04pOwotICAgICAgICBCb29sZWFuIGRpc2FibGVkID0gKEJvb2xlYW4pIHJlcXVlc3QuZ2V0UHJvcGVydHkoQWRkcmVzc2luZ0NvbnN0YW50cy5ESVNBQkxFX0FERFJFU1NJTkdfRk9SX09VVF9NRVNTQUdFUyk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRFcXVhbHMoRmluYWwuV1NBX05BTUVTUEFDRSwgdmVyc2lvbik7Ci0gICAgICAgIGFzc2VydEZhbHNlKGRpc2FibGVkKTsKLSAgICAgICAgCi0gICAgICAgIG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dCBheGlzMlJlcXVlc3QgPQotICAgICAgICAgICAgcmVxdWVzdC5nZXRBeGlzTWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlIGVwciA9Ci0gICAgICAgICAgICBheGlzMlJlcXVlc3QuZ2V0VG8oKTsKLSAgICAgICAgCi0gICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPQotICAgICAgICAgICAgRW5kcG9pbnRSZWZlcmVuY2VIZWxwZXIudG9PTShPTUYsIGVwciwgRUxFTUVOVDIwMDUwOCwgRmluYWwuV1NBX05BTUVTUEFDRSk7Ci0gICAgICAgIGFzc2VydFhNTEVxdWFsKHczY0VQUi50b1N0cmluZygpLCBvbUVsZW1lbnQudG9TdHJpbmcoKSk7Ci0gICAgfQotICAgIAotICAgIC8qCi0gICAgICogVGVzdCBkaXNhYmxpbmcgdGhlIEFkZHJlc3NpbmcgZmVhdHVyZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGlzYWJsZWRBZGRyZXNzaW5nRmVhdHVyZSgpIHsKLSAgICAgICAgLy8gVXNlIHRoZSBkZWZhdWx0IGZlYXR1cmUgY29uZmlnCi0gICAgICAgIEFkZHJlc3NpbmdGZWF0dXJlIGZlYXR1cmUgPSBuZXcgQWRkcmVzc2luZ0ZlYXR1cmUoZmFsc2UpOwotICAgICAgICAKLSAgICAgICAgU2VydmljZSBzdmMgPSBTZXJ2aWNlLmNyZWF0ZShuZXcgUU5hbWUoImh0dHA6Ly90ZXN0IiwgIlByb3h5QWRkcmVzc2luZ1NlcnZpY2UiKSk7Ci0gICAgICAgIFByb3h5QWRkcmVzc2luZ1NlcnZpY2UgcHJveHkgPSBzdmMuZ2V0UG9ydCh3M2NFUFIsIFByb3h5QWRkcmVzc2luZ1NlcnZpY2UuY2xhc3MsIGZlYXR1cmUpOwotICAgICAgICBhc3NlcnRUcnVlKCJQcm94eSBpbnN0YW5jZSB3YXMgbnVsbCIsIHByb3h5ICE9IG51bGwpOwotICAgICAgICAKLSAgICAgICAgcHJveHkuZG9Tb21ldGhpbmcoIjEyMzQ1Iik7Ci0gICAgICAgIAotICAgICAgICBUZXN0Q2xpZW50SW52b2NhdGlvbkNvbnRyb2xsZXIgdGVzdENvbnRyb2xsZXIgPSBnZXRJbnZvY2F0aW9uQ29udHJvbGxlcigpOwotICAgICAgICBJbnZvY2F0aW9uQ29udGV4dCBpYyA9IHRlc3RDb250cm9sbGVyLmdldEludm9jYXRpb25Db250ZXh0KCk7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IHJlcXVlc3QgPSBpYy5nZXRSZXF1ZXN0TWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyB2ZXJzaW9uID0gKFN0cmluZykgcmVxdWVzdC5nZXRQcm9wZXJ0eShBZGRyZXNzaW5nQ29uc3RhbnRzLldTX0FERFJFU1NJTkdfVkVSU0lPTik7Ci0gICAgICAgIEJvb2xlYW4gZGlzYWJsZWQgPSAoQm9vbGVhbikgcmVxdWVzdC5nZXRQcm9wZXJ0eShBZGRyZXNzaW5nQ29uc3RhbnRzLkRJU0FCTEVfQUREUkVTU0lOR19GT1JfT1VUX01FU1NBR0VTKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydEVxdWFscyhGaW5hbC5XU0FfTkFNRVNQQUNFLCB2ZXJzaW9uKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShkaXNhYmxlZCk7Ci0gICAgICAgIAotICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQgYXhpczJSZXF1ZXN0ID0KLSAgICAgICAgICAgIHJlcXVlc3QuZ2V0QXhpc01lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZSBlcHIgPQotICAgICAgICAgICAgYXhpczJSZXF1ZXN0LmdldFRvKCk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnROdWxsKGVwcik7Ci0gICAgfQotICAgIAotICAgIC8qCi0gICAgICogVGVzdCB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIG9mIHRoZSBBZGRyZXNzaW5nRmVhdHVyZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZEFkZHJlc3NpbmdGZWF0dXJlKCkgewotICAgICAgICAvLyBVc2UgdGhlIGRlZmF1bHQgZmVhdHVyZSBjb25maWcKLSAgICAgICAgQWRkcmVzc2luZ0ZlYXR1cmUgZmVhdHVyZSA9IG5ldyBBZGRyZXNzaW5nRmVhdHVyZSgpOwotICAgICAgICAKLSAgICAgICAgU2VydmljZSBzdmMgPSBTZXJ2aWNlLmNyZWF0ZShuZXcgUU5hbWUoImh0dHA6Ly90ZXN0IiwgIlByb3h5QWRkcmVzc2luZ1NlcnZpY2UiKSk7Ci0gICAgICAgIFByb3h5QWRkcmVzc2luZ1NlcnZpY2UgcHJveHkgPSBzdmMuZ2V0UG9ydChzdWJFUFIsIFByb3h5QWRkcmVzc2luZ1NlcnZpY2UuY2xhc3MsIGZlYXR1cmUpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHByb3h5KTsKLSAgICAgICAgCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBwcm94eS5kb1NvbWV0aGluZygiMTIzNDUiKTsKLSAgICAgICAgICAgIGZhaWwoIkFuIGV4Y2VwdGlvbiBzaG91bGQgaGF2ZSBiZWVuIHRocm93biIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChXZWJTZXJ2aWNlRXhjZXB0aW9uIHdzZSkgewotICAgICAgICAgICAgLy9wYXNzCi0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJUaGUgd3JvbmcgZXhjZXB0aW9uIHR5cGUgd2FzIHRocm93bi4iKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBAV2ViU2VydmljZSgpCi0gICAgcHVibGljIGludGVyZmFjZSBQcm94eUFkZHJlc3NpbmdTZXJ2aWNlIHsKLSAgICAKLSAgICAgICAgcHVibGljIFN0cmluZyBkb1NvbWV0aGluZyhTdHJpbmcgaWQpOwotICAgICAgICAKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2xpZW50L3Byb3h5L1Byb3h5TVRPTUZlYXR1cmVUZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2xpZW50L3Byb3h5L1Byb3h5TVRPTUZlYXR1cmVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlNjdmNGEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NsaWVudC9wcm94eS9Qcm94eU1UT01GZWF0dXJlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY2xpZW50LnByb3h5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNsaWVudC5JbnRlcmNlcHRhYmxlQ2xpZW50VGVzdENhc2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY2xpZW50LlRlc3RDbGllbnRJbnZvY2F0aW9uQ29udHJvbGxlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLkludm9jYXRpb25Db250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUuTWVzc2FnZUNvbnRleHQ7DQotDQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOw0KLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuTVRPTUZlYXR1cmU7DQotDQotLyoqDQotICogVGhpcyBzdWl0ZSBvZiB0ZXN0cyBpcyBmb3IgdGhlIE1UT01GZWF0dXJlIGNvbmZpZ3VyYXRpb24gdGhhdCBjYW4NCi0gKiBiZSB1c2VkIG9uIFByb3h5IGNsaWVudHMuDQotICovDQotcHVibGljIGNsYXNzIFByb3h5TVRPTUZlYXR1cmVUZXN0IGV4dGVuZHMgSW50ZXJjZXB0YWJsZUNsaWVudFRlc3RDYXNlIHsNCi0NCi0gICAgLyoNCi0gICAgICogTWFrZSBzdXJlIE1UT00gaXMgbm90IGVuYWJsZWQgYnkgZGVmYXVsdC4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3ROb01UT01GZWF0dXJlKCkgew0KLSAgICAgICAgU2VydmljZSBzdmMgPSBTZXJ2aWNlLmNyZWF0ZShuZXcgUU5hbWUoImh0dHA6Ly90ZXN0IiwgIlByb3h5TVRPTVNlcnZpY2UiKSk7DQotICAgICAgICBQcm94eU1UT01TZXJ2aWNlIHByb3h5ID0gc3ZjLmdldFBvcnQoUHJveHlNVE9NU2VydmljZS5jbGFzcyk7DQotICAgICAgICBhc3NlcnRUcnVlKCJQcm94eSBpbnN0YW5jZSB3YXMgbnVsbCIsIHByb3h5ICE9IG51bGwpOw0KLSAgICAgICAgDQotICAgICAgICBwcm94eS5zZW5kQXR0YWNobWVudCgiMTIzNDUiKTsNCi0gICAgICAgIA0KLSAgICAgICAgVGVzdENsaWVudEludm9jYXRpb25Db250cm9sbGVyIHRlc3RDb250cm9sbGVyID0gZ2V0SW52b2NhdGlvbkNvbnRyb2xsZXIoKTsNCi0gICAgICAgIEludm9jYXRpb25Db250ZXh0IGljID0gdGVzdENvbnRyb2xsZXIuZ2V0SW52b2NhdGlvbkNvbnRleHQoKTsNCi0gICAgICAgIE1lc3NhZ2VDb250ZXh0IHJlcXVlc3QgPSBpYy5nZXRSZXF1ZXN0TWVzc2FnZUNvbnRleHQoKTsNCi0gICAgICAgIA0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiUmVxdWVzdCBzaG91bGQgbm90IGJlIG51bGwuIiwgcmVxdWVzdCAhPSBudWxsKTsNCi0gICAgICAgIGFzc2VydFRydWUoIk1UT00gc2hvdWxkIG5vdCBiZSBhYmxlZCBvbiB0aGUgTWVzc2FnZSBieSBkZWZhdWx0LiIsICFyZXF1ZXN0LmdldE1lc3NhZ2UoKS5pc01UT01FbmFibGVkKCkpOw0KLSAgICB9DQotICAgIA0KLSAgICAvKg0KLSAgICAgKiBUZXN0IHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gb2YgdGhlIE1UT01GZWF0dXJlLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdERlZmF1bHRNVE9NRmVhdHVyZSgpIHsNCi0gICAgICAgIC8vIFVzZSB0aGUgZGVmYXVsdCBmZWF0dXJlIGNvbmZpZw0KLSAgICAgICAgTVRPTUZlYXR1cmUgZmVhdHVyZSA9IG5ldyBNVE9NRmVhdHVyZSgpOw0KLSAgICAgICAgDQotICAgICAgICBTZXJ2aWNlIHN2YyA9IFNlcnZpY2UuY3JlYXRlKG5ldyBRTmFtZSgiaHR0cDovL3Rlc3QiLCAiUHJveHlNVE9NU2VydmljZSIpKTsNCi0gICAgICAgIFByb3h5TVRPTVNlcnZpY2UgcHJveHkgPSBzdmMuZ2V0UG9ydChQcm94eU1UT01TZXJ2aWNlLmNsYXNzLCBmZWF0dXJlKTsNCi0gICAgICAgIGFzc2VydFRydWUoIlByb3h5IGluc3RhbmNlIHdhcyBudWxsIiwgcHJveHkgIT0gbnVsbCk7DQotICAgICAgICANCi0gICAgICAgIHByb3h5LnNlbmRBdHRhY2htZW50KCIxMjM0NSIpOw0KLSAgICAgICAgDQotICAgICAgICBUZXN0Q2xpZW50SW52b2NhdGlvbkNvbnRyb2xsZXIgdGVzdENvbnRyb2xsZXIgPSBnZXRJbnZvY2F0aW9uQ29udHJvbGxlcigpOw0KLSAgICAgICAgSW52b2NhdGlvbkNvbnRleHQgaWMgPSB0ZXN0Q29udHJvbGxlci5nZXRJbnZvY2F0aW9uQ29udGV4dCgpOw0KLSAgICAgICAgTWVzc2FnZUNvbnRleHQgcmVxdWVzdCA9IGljLmdldFJlcXVlc3RNZXNzYWdlQ29udGV4dCgpOw0KLSAgICAgICAgDQotICAgICAgICBhc3NlcnRUcnVlKCJSZXF1ZXN0IHNob3VsZCBub3QgYmUgbnVsbC4iLCByZXF1ZXN0ICE9IG51bGwpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiTVRPTSBzaG91bGQgYmUgYWJsZWQgb24gdGhlIE1lc3NhZ2UgYnkgZGVmYXVsdC4iLCByZXF1ZXN0LmdldE1lc3NhZ2UoKS5pc01UT01FbmFibGVkKCkpOw0KLSAgICB9DQotICAgIA0KLSAgICAvKg0KLSAgICAgKiBUZXN0IGRpc2FibGluZyB0aGUgTVRPTSBmZWF0dXJlLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdERpc2FibGVkTVRPTUZlYXR1cmUoKSB7DQotICAgICAgICAvLyBVc2UgdGhlIGRlZmF1bHQgZmVhdHVyZSBjb25maWcNCi0gICAgICAgIE1UT01GZWF0dXJlIGZlYXR1cmUgPSBuZXcgTVRPTUZlYXR1cmUoZmFsc2UpOw0KLSAgICAgICAgDQotICAgICAgICBTZXJ2aWNlIHN2YyA9IFNlcnZpY2UuY3JlYXRlKG5ldyBRTmFtZSgiaHR0cDovL3Rlc3QiLCAiUHJveHlNVE9NU2VydmljZSIpKTsNCi0gICAgICAgIFByb3h5TVRPTVNlcnZpY2UgcHJveHkgPSBzdmMuZ2V0UG9ydChQcm94eU1UT01TZXJ2aWNlLmNsYXNzLCBmZWF0dXJlKTsNCi0gICAgICAgIGFzc2VydFRydWUoIlByb3h5IGluc3RhbmNlIHdhcyBudWxsIiwgcHJveHkgIT0gbnVsbCk7DQotICAgICAgICANCi0gICAgICAgIHByb3h5LnNlbmRBdHRhY2htZW50KCIxMjM0NSIpOw0KLSAgICAgICAgDQotICAgICAgICBUZXN0Q2xpZW50SW52b2NhdGlvbkNvbnRyb2xsZXIgdGVzdENvbnRyb2xsZXIgPSBnZXRJbnZvY2F0aW9uQ29udHJvbGxlcigpOw0KLSAgICAgICAgSW52b2NhdGlvbkNvbnRleHQgaWMgPSB0ZXN0Q29udHJvbGxlci5nZXRJbnZvY2F0aW9uQ29udGV4dCgpOw0KLSAgICAgICAgTWVzc2FnZUNvbnRleHQgcmVxdWVzdCA9IGljLmdldFJlcXVlc3RNZXNzYWdlQ29udGV4dCgpOw0KLSAgICAgICAgDQotICAgICAgICBhc3NlcnRUcnVlKCJSZXF1ZXN0IHNob3VsZCBub3QgYmUgbnVsbC4iLCByZXF1ZXN0ICE9IG51bGwpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiTVRPTSBzaG91bGQgTk9UIGJlIGFibGVkIG9uIHRoZSBNZXNzYWdlIGJ5IGRlZmF1bHQuIiwgIXJlcXVlc3QuZ2V0TWVzc2FnZSgpLmlzTVRPTUVuYWJsZWQoKSk7DQotICAgIH0NCi0gICAgDQotICAgIC8qDQotICAgICAqIFRlc3QgdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIHRocmVzaG9sZCBmb3IgTVRPTSB3aGVuIG5vIGF0dGFjaG1lbnQgaXMgDQotICAgICAqIHNwZWNpZmllZC4gIEluIHRoaXMgY2FzZSwgYWx0aG91Z2ggZW5hYmxlZCBwZXIgdGhlIE1UT01GZWF0dXJlLCBNVE9NIHNob3VsZA0KLSAgICAgKiBub3QgYmUgZW5hYmxlZCBvbiB0aGUgTWVzc2FnZSwgc2luY2UgdGhlIGF0dGFjaG1lbnQgc2l6ZSBpcyB0b28gc21hbGwuDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TVRPTUZlYXR1cmVUaHJlc2hvbGQoKSB7DQotICAgICAgICAvLyBTZXQgYSB0aHJlc2hvbGQgdGhhdCB3ZSB3aWxsIG5vdCBtZWV0Lg0KLSAgICAgICAgaW50IHRocmVzaG9sZCA9IDIwMDAwOw0KLSAgICAgICAgTVRPTUZlYXR1cmUgZmVhdHVyZSA9IG5ldyBNVE9NRmVhdHVyZSh0aHJlc2hvbGQpOw0KLSAgICAgICAgDQotICAgICAgICBTZXJ2aWNlIHN2YyA9IFNlcnZpY2UuY3JlYXRlKG5ldyBRTmFtZSgiaHR0cDovL3Rlc3QiLCAiUHJveHlNVE9NU2VydmljZSIpKTsNCi0gICAgICAgIFByb3h5TVRPTVNlcnZpY2UgcHJveHkgPSBzdmMuZ2V0UG9ydChQcm94eU1UT01TZXJ2aWNlLmNsYXNzLCBmZWF0dXJlKTsNCi0gICAgICAgIGFzc2VydFRydWUoIlByb3h5IGluc3RhbmNlIHdhcyBudWxsIiwgcHJveHkgIT0gbnVsbCk7DQotICAgICAgICANCi0gICAgICAgIHByb3h5LnNlbmRBdHRhY2htZW50KCIxMjM0NSIpOw0KLSAgICAgICAgDQotICAgICAgICBUZXN0Q2xpZW50SW52b2NhdGlvbkNvbnRyb2xsZXIgdGVzdENvbnRyb2xsZXIgPSBnZXRJbnZvY2F0aW9uQ29udHJvbGxlcigpOw0KLSAgICAgICAgSW52b2NhdGlvbkNvbnRleHQgaWMgPSB0ZXN0Q29udHJvbGxlci5nZXRJbnZvY2F0aW9uQ29udGV4dCgpOw0KLSAgICAgICAgTWVzc2FnZUNvbnRleHQgcmVxdWVzdCA9IGljLmdldFJlcXVlc3RNZXNzYWdlQ29udGV4dCgpOw0KLSAgICAgICAgDQotICAgICAgICBhc3NlcnRUcnVlKCJSZXF1ZXN0IHNob3VsZCBub3QgYmUgbnVsbC4iLCByZXF1ZXN0ICE9IG51bGwpOw0KLSAgICAgICAgLy8gQSBUaHJlc2hvbGQgaW5kaWNhdGVzIHRoYXQgTVRPTSBzaG91bGQgYmUgZW5hYmxlZC4NCi0gICAgICAgIC8vIFRoZSBkZWNpc2lvbiBhYm91dCB3aGV0aGVyIHRoZSBhdHRhY2htZW50IGlzIGlubGluZWQgaXMgbWFkZSBvbiBhIHBlciBhdHRhY2htZW50DQotICAgICAgICAvLyBiYXNpcyBpbiBBeGlvbS4uLmFuZCBjYW5ub3QgYmUgdGVzdGVkIGluIHVuaXQgdGVzdCB0aGF0IGRvZXMgbm90IHNlbmQgdGhlIG1lc3NhZ2UNCi0gICAgICAgIC8vIHRvIHRoZSBzZXJ2ZXIuDQotICAgICAgICBhc3NlcnRUcnVlKCJNVE9NIHNob3VsZCBiZSBlbmFibGVkLiIsIHJlcXVlc3QuZ2V0TWVzc2FnZSgpLmlzTVRPTUVuYWJsZWQoKSk7DQotICAgIH0NCi0gICAgDQotICAgIEBXZWJTZXJ2aWNlKCkNCi0gICAgcHVibGljIGludGVyZmFjZSBQcm94eU1UT01TZXJ2aWNlIHsNCi0gICAgDQotICAgICAgICBwdWJsaWMgU3RyaW5nIHNlbmRBdHRhY2htZW50KFN0cmluZyBpZCk7DQotICAgICAgICANCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2xpZW50L3Byb3h5L1Byb3h5U3VibWlzc2lvbkFkZHJlc3NpbmdGZWF0dXJlVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NsaWVudC9wcm94eS9Qcm94eVN1Ym1pc3Npb25BZGRyZXNzaW5nRmVhdHVyZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDgyYzExNS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2xpZW50L3Byb3h5L1Byb3h5U3VibWlzc2lvbkFkZHJlc3NpbmdGZWF0dXJlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jbGllbnQucHJveHk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5BZGRyZXNzaW5nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5BZGRyZXNzaW5nQ29uc3RhbnRzLlN1Ym1pc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlSGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuYWRkcmVzc2luZy5TdWJtaXNzaW9uQWRkcmVzc2luZ0ZlYXR1cmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5hZGRyZXNzaW5nLlN1Ym1pc3Npb25FbmRwb2ludFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmFkZHJlc3NpbmcuU3VibWlzc2lvbkVuZHBvaW50UmVmZXJlbmNlQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNsaWVudC5JbnRlcmNlcHRhYmxlQ2xpZW50VGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jbGllbnQuVGVzdENsaWVudEludm9jYXRpb25Db250cm9sbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS5JbnZvY2F0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUuTWVzc2FnZUNvbnRleHQ7Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlOwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC53cy53c2FkZHJlc3NpbmcuVzNDRW5kcG9pbnRSZWZlcmVuY2U7Ci1pbXBvcnQgamF2YXgueG1sLndzLndzYWRkcmVzc2luZy5XM0NFbmRwb2ludFJlZmVyZW5jZUJ1aWxkZXI7Ci0KLS8qKgotICogVGhpcyBzdWl0ZSBvZiB0ZXN0cyBpcyBmb3IgdGhlIFN1Ym1pc3Npb25BZGRyZXNzaW5nRmVhdHVyZSBjb25maWd1cmF0aW9uIHRoYXQgY2FuCi0gKiBiZSB1c2VkIG9uIFByb3h5IGNsaWVudHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm94eVN1Ym1pc3Npb25BZGRyZXNzaW5nRmVhdHVyZVRlc3QgZXh0ZW5kcyBJbnRlcmNlcHRhYmxlQ2xpZW50VGVzdENhc2UgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE9NRmFjdG9yeSBPTUYgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBRTmFtZSBFTEVNRU5UMjAwNDA4ID0KLSAgICAgICAgbmV3IFFOYW1lKFN1Ym1pc3Npb24uV1NBX05BTUVTUEFDRSwgIkVuZHBvaW50UmVmZXJlbmNlIiwgIndzYSIpOwotICAgIAotICAgIHByaXZhdGUgVzNDRW5kcG9pbnRSZWZlcmVuY2UgdzNjRVBSOwotICAgIHByaXZhdGUgU3VibWlzc2lvbkVuZHBvaW50UmVmZXJlbmNlIHN1YkVQUjsKLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgICAgICAKLSAgICAgICAgVzNDRW5kcG9pbnRSZWZlcmVuY2VCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgVzNDRW5kcG9pbnRSZWZlcmVuY2VCdWlsZGVyKCk7Ci0gICAgICAgIGJ1aWxkZXIgPSBidWlsZGVyLmFkZHJlc3MoImh0dHA6Ly9zb21ld2hlcmUuY29tL3NvbWVob3ciKTsKLSAgICAgICAgYnVpbGRlciA9IGJ1aWxkZXIuc2VydmljZU5hbWUobmV3IFFOYW1lKCJodHRwOi8vdGVzdCIsICJQcm94eUFkZHJlc3NpbmdTZXJ2aWNlIikpOwotICAgICAgICBidWlsZGVyID0gYnVpbGRlci5lbmRwb2ludE5hbWUobmV3IFFOYW1lKCJodHRwOi8vdGVzdCIsICJUZXN0UG9ydCIpKTsKLSAgICAgICAgdzNjRVBSID0gYnVpbGRlci5idWlsZCgpOwotICAgICAgICAKLSAgICAgICAgU3VibWlzc2lvbkVuZHBvaW50UmVmZXJlbmNlQnVpbGRlciBzdWJCdWlsZGVyID0gbmV3IFN1Ym1pc3Npb25FbmRwb2ludFJlZmVyZW5jZUJ1aWxkZXIoKTsKLSAgICAgICAgc3ViQnVpbGRlciA9IHN1YkJ1aWxkZXIuYWRkcmVzcygiaHR0cDovL3NvbWV3aGVyZS5jb20vc29tZWhvdyIpOwotICAgICAgICBzdWJCdWlsZGVyID0gc3ViQnVpbGRlci5zZXJ2aWNlTmFtZShuZXcgUU5hbWUoImh0dHA6Ly90ZXN0IiwgIlByb3h5QWRkcmVzc2luZ1NlcnZpY2UiKSk7Ci0gICAgICAgIHN1YkJ1aWxkZXIgPSBzdWJCdWlsZGVyLmVuZHBvaW50TmFtZShuZXcgUU5hbWUoImh0dHA6Ly90ZXN0IiwgIlRlc3RQb3J0IikpOwotICAgICAgICBzdWJFUFIgPSBzdWJCdWlsZGVyLmJ1aWxkKCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBNYWtlIHN1cmUgU3VibWlzc2lvbkFkZHJlc3NpbmcgaXMgbm90IGVuYWJsZWQgYnkgZGVmYXVsdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9TdWJtaXNzaW9uQWRkcmVzc2luZ0ZlYXR1cmUoKSB7Ci0gICAgICAgIFNlcnZpY2Ugc3ZjID0gU2VydmljZS5jcmVhdGUobmV3IFFOYW1lKCJodHRwOi8vdGVzdCIsICJQcm94eUFkZHJlc3NpbmdTZXJ2aWNlIikpOwotICAgICAgICBQcm94eUFkZHJlc3NpbmdTZXJ2aWNlIHByb3h5ID0gc3ZjLmdldFBvcnQoUHJveHlBZGRyZXNzaW5nU2VydmljZS5jbGFzcyk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocHJveHkpOwotICAgICAgICAKLSAgICAgICAgcHJveHkuZG9Tb21ldGhpbmcoIjEyMzQ1Iik7Ci0gICAgICAgIAotICAgICAgICBUZXN0Q2xpZW50SW52b2NhdGlvbkNvbnRyb2xsZXIgdGVzdENvbnRyb2xsZXIgPSBnZXRJbnZvY2F0aW9uQ29udHJvbGxlcigpOwotICAgICAgICBJbnZvY2F0aW9uQ29udGV4dCBpYyA9IHRlc3RDb250cm9sbGVyLmdldEludm9jYXRpb25Db250ZXh0KCk7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IHJlcXVlc3QgPSBpYy5nZXRSZXF1ZXN0TWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyB2ZXJzaW9uID0gKFN0cmluZykgcmVxdWVzdC5nZXRQcm9wZXJ0eShBZGRyZXNzaW5nQ29uc3RhbnRzLldTX0FERFJFU1NJTkdfVkVSU0lPTik7Ci0gICAgICAgIEJvb2xlYW4gZGlzYWJsZWQgPSAoQm9vbGVhbikgcmVxdWVzdC5nZXRQcm9wZXJ0eShBZGRyZXNzaW5nQ29uc3RhbnRzLkRJU0FCTEVfQUREUkVTU0lOR19GT1JfT1VUX01FU1NBR0VTKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydE51bGwodmVyc2lvbik7Ci0gICAgICAgIGFzc2VydFRydWUoZGlzYWJsZWQpOwotICAgICAgICAKLSAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0IGF4aXMyUmVxdWVzdCA9Ci0gICAgICAgICAgICByZXF1ZXN0LmdldEF4aXNNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2UgZXByID0KLSAgICAgICAgICAgIGF4aXMyUmVxdWVzdC5nZXRUbygpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0TnVsbChlcHIpOwotICAgIH0KLSAgICAKLSAgICAvKgotICAgICAqIFRlc3QgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBvZiB0aGUgU3VibWlzc2lvbkFkZHJlc3NpbmdGZWF0dXJlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3REZWZhdWx0U3VibWlzc2lvbkFkZHJlc3NpbmdGZWF0dXJlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFVzZSB0aGUgZGVmYXVsdCBmZWF0dXJlIGNvbmZpZwotICAgICAgICBTdWJtaXNzaW9uQWRkcmVzc2luZ0ZlYXR1cmUgZmVhdHVyZSA9IG5ldyBTdWJtaXNzaW9uQWRkcmVzc2luZ0ZlYXR1cmUoKTsKLSAgICAgICAgCi0gICAgICAgIFNlcnZpY2Ugc3ZjID0gU2VydmljZS5jcmVhdGUobmV3IFFOYW1lKCJodHRwOi8vdGVzdCIsICJQcm94eUFkZHJlc3NpbmdTZXJ2aWNlIikpOwotICAgICAgICBQcm94eUFkZHJlc3NpbmdTZXJ2aWNlIHByb3h5ID0gc3ZjLmdldFBvcnQoc3ViRVBSLCBQcm94eUFkZHJlc3NpbmdTZXJ2aWNlLmNsYXNzLCBmZWF0dXJlKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChwcm94eSk7Ci0gICAgICAgIAotICAgICAgICBwcm94eS5kb1NvbWV0aGluZygiMTIzNDUiKTsKLSAgICAgICAgCi0gICAgICAgIFRlc3RDbGllbnRJbnZvY2F0aW9uQ29udHJvbGxlciB0ZXN0Q29udHJvbGxlciA9IGdldEludm9jYXRpb25Db250cm9sbGVyKCk7Ci0gICAgICAgIEludm9jYXRpb25Db250ZXh0IGljID0gdGVzdENvbnRyb2xsZXIuZ2V0SW52b2NhdGlvbkNvbnRleHQoKTsKLSAgICAgICAgTWVzc2FnZUNvbnRleHQgcmVxdWVzdCA9IGljLmdldFJlcXVlc3RNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICAKLSAgICAgICAgU3RyaW5nIHZlcnNpb24gPSAoU3RyaW5nKSByZXF1ZXN0LmdldFByb3BlcnR5KEFkZHJlc3NpbmdDb25zdGFudHMuV1NfQUREUkVTU0lOR19WRVJTSU9OKTsKLSAgICAgICAgQm9vbGVhbiBkaXNhYmxlZCA9IChCb29sZWFuKSByZXF1ZXN0LmdldFByb3BlcnR5KEFkZHJlc3NpbmdDb25zdGFudHMuRElTQUJMRV9BRERSRVNTSU5HX0ZPUl9PVVRfTUVTU0FHRVMpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFN1Ym1pc3Npb24uV1NBX05BTUVTUEFDRSwgdmVyc2lvbik7Ci0gICAgICAgIGFzc2VydEZhbHNlKGRpc2FibGVkKTsKLSAgICAgICAgCi0gICAgICAgIG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dCBheGlzMlJlcXVlc3QgPQotICAgICAgICAgICAgcmVxdWVzdC5nZXRBeGlzTWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlIGVwciA9Ci0gICAgICAgICAgICBheGlzMlJlcXVlc3QuZ2V0VG8oKTsKLSAgICAgICAgCi0gICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPQotICAgICAgICAgICAgRW5kcG9pbnRSZWZlcmVuY2VIZWxwZXIudG9PTShPTUYsIGVwciwgRUxFTUVOVDIwMDQwOCwgU3VibWlzc2lvbi5XU0FfTkFNRVNQQUNFKTsKLSAgICAgICAgYXNzZXJ0WE1MRXF1YWwoc3ViRVBSLnRvU3RyaW5nKCksIG9tRWxlbWVudC50b1N0cmluZygpKTsKLSAgICB9Ci0gICAgCi0gICAgLyoKLSAgICAgKiBUZXN0IGRpc2FibGluZyB0aGUgU3VibWlzc2lvbkFkZHJlc3NpbmcgZmVhdHVyZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGlzYWJsZWRTdWJtaXNzaW9uQWRkcmVzc2luZ0ZlYXR1cmUoKSB7Ci0gICAgICAgIC8vIFVzZSB0aGUgZGVmYXVsdCBmZWF0dXJlIGNvbmZpZwotICAgICAgICBTdWJtaXNzaW9uQWRkcmVzc2luZ0ZlYXR1cmUgZmVhdHVyZSA9IG5ldyBTdWJtaXNzaW9uQWRkcmVzc2luZ0ZlYXR1cmUoZmFsc2UpOwotICAgICAgICAKLSAgICAgICAgU2VydmljZSBzdmMgPSBTZXJ2aWNlLmNyZWF0ZShuZXcgUU5hbWUoImh0dHA6Ly90ZXN0IiwgIlByb3h5QWRkcmVzc2luZ1NlcnZpY2UiKSk7Ci0gICAgICAgIFByb3h5QWRkcmVzc2luZ1NlcnZpY2UgcHJveHkgPSBzdmMuZ2V0UG9ydChzdWJFUFIsIFByb3h5QWRkcmVzc2luZ1NlcnZpY2UuY2xhc3MsIGZlYXR1cmUpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHByb3h5KTsKLSAgICAgICAgCi0gICAgICAgIHByb3h5LmRvU29tZXRoaW5nKCIxMjM0NSIpOwotICAgICAgICAKLSAgICAgICAgVGVzdENsaWVudEludm9jYXRpb25Db250cm9sbGVyIHRlc3RDb250cm9sbGVyID0gZ2V0SW52b2NhdGlvbkNvbnRyb2xsZXIoKTsKLSAgICAgICAgSW52b2NhdGlvbkNvbnRleHQgaWMgPSB0ZXN0Q29udHJvbGxlci5nZXRJbnZvY2F0aW9uQ29udGV4dCgpOwotICAgICAgICBNZXNzYWdlQ29udGV4dCByZXF1ZXN0ID0gaWMuZ2V0UmVxdWVzdE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgdmVyc2lvbiA9IChTdHJpbmcpIHJlcXVlc3QuZ2V0UHJvcGVydHkoQWRkcmVzc2luZ0NvbnN0YW50cy5XU19BRERSRVNTSU5HX1ZFUlNJT04pOwotICAgICAgICBCb29sZWFuIGRpc2FibGVkID0gKEJvb2xlYW4pIHJlcXVlc3QuZ2V0UHJvcGVydHkoQWRkcmVzc2luZ0NvbnN0YW50cy5ESVNBQkxFX0FERFJFU1NJTkdfRk9SX09VVF9NRVNTQUdFUyk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRFcXVhbHMoU3VibWlzc2lvbi5XU0FfTkFNRVNQQUNFLCB2ZXJzaW9uKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShkaXNhYmxlZCk7Ci0gICAgICAgIAotICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQgYXhpczJSZXF1ZXN0ID0KLSAgICAgICAgICAgIHJlcXVlc3QuZ2V0QXhpc01lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZSBlcHIgPQotICAgICAgICAgICAgYXhpczJSZXF1ZXN0LmdldFRvKCk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnROdWxsKGVwcik7Ci0gICAgfQotICAgIAotICAgIC8qCi0gICAgICogVGVzdCB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIG9mIHRoZSBTdWJtaXNzaW9uQWRkcmVzc2luZ0ZlYXR1cmUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEludmFsaWRTdWJtaXNzaW9uQWRkcmVzc2luZ0ZlYXR1cmUoKSB7Ci0gICAgICAgIC8vIFVzZSB0aGUgZGVmYXVsdCBmZWF0dXJlIGNvbmZpZwotICAgICAgICBTdWJtaXNzaW9uQWRkcmVzc2luZ0ZlYXR1cmUgZmVhdHVyZSA9IG5ldyBTdWJtaXNzaW9uQWRkcmVzc2luZ0ZlYXR1cmUoKTsKLSAgICAgICAgCi0gICAgICAgIFNlcnZpY2Ugc3ZjID0gU2VydmljZS5jcmVhdGUobmV3IFFOYW1lKCJodHRwOi8vdGVzdCIsICJQcm94eUFkZHJlc3NpbmdTZXJ2aWNlIikpOwotICAgICAgICBQcm94eUFkZHJlc3NpbmdTZXJ2aWNlIHByb3h5ID0gc3ZjLmdldFBvcnQodzNjRVBSLCBQcm94eUFkZHJlc3NpbmdTZXJ2aWNlLmNsYXNzLCBmZWF0dXJlKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChwcm94eSk7Ci0gICAgICAgIAotICAgICAgICB0cnkgewotICAgICAgICAgICAgcHJveHkuZG9Tb21ldGhpbmcoIjEyMzQ1Iik7Ci0gICAgICAgICAgICBmYWlsKCJBbiBleGNlcHRpb24gc2hvdWxkIGhhdmUgYmVlbiB0aHJvd24iKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoV2ViU2VydmljZUV4Y2VwdGlvbiB3c2UpIHsKLSAgICAgICAgICAgIC8vcGFzcwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiVGhlIHdyb25nIGV4Y2VwdGlvbiB0eXBlIHdhcyB0aHJvd24uIik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgQFdlYlNlcnZpY2UoKQotICAgIHB1YmxpYyBpbnRlcmZhY2UgUHJveHlBZGRyZXNzaW5nU2VydmljZSB7Ci0gICAgCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZG9Tb21ldGhpbmcoU3RyaW5nIGlkKTsKLSAgICAgICAgCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NvcmUvTWVzc2FnZUNvbnRleHRUZXN0cy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NvcmUvTWVzc2FnZUNvbnRleHRUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDg4OWYxLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jb3JlL01lc3NhZ2VDb250ZXh0VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZTsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qDQotICogVGVzdGluZyBqYXh3cyBtZXNzYWdlIGNvbnRleHQncyBpbnRlcmF0aW9uIHdpdGggYXhpczIgbWVzc2FnZSBjb250ZXh0Lg0KLSAqIEpBWFdTIGRlbGVnYXRlcyBhbGwgcHJvcGVydHkgc2V0dGluZy9nZXR0aW5nIHVwIHRvIGF4aXMyLCBidXQgd2UgbmVlZCB0byANCi0gKiBiZSBjYXJlZnVsIGhvdyB3ZSB1c2UgYXhpczIncyBNQy4gIFdlIHNob3VsZCBub3QgaGF2ZSBhY2Nlc3MgdG8gdGhlIG9wdGlvbnMNCi0gKiBiYWcgaW4gdGhlIGF4aXMyIE1DLCBmb3IgZXhhbXBsZS4NCi0gKi8NCi0NCi1wdWJsaWMgY2xhc3MgTWVzc2FnZUNvbnRleHRUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBrZXkxID0gIk9OYXhpc01DIjsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBrZXkyID0gIk9OYXhpc01DT3B0aW9ucyI7DQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcga2V5MyA9ICJPTmpheHdzTUMiOw0KLSAgICANCi0gICAgLyogVE9ETzoNCi0gICAgICogc2hvdWxkIGFsc28gdGVzdCB0byBtYWtlIHN1cmUgc2VydmljZSBvciBvcGVyYXRpb24gY29udGV4dCBwcm9wZXJ0aWVzDQotICAgICAqIG9uIHRoZSBheGlzMiBNQyBhcmUgbm90IGFjY2Vzc2libGUuICBUaGF0J3MgcHJvYmFibHkgYmVzdCBsZWZ0IGZvciBhbm90aGVyIHRlc3QuDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWVzc2FnZUNvbnRleHRQcm9wZXJ0aWVzQWNjZXNzaWJpbGl0eSgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0IGF4aXNNQyA9IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQoKTsNCi0gICAgICAgIE1lc3NhZ2VDb250ZXh0IGpheHdzTUMgPSBuZXcgTWVzc2FnZUNvbnRleHQoYXhpc01DKTsNCi0gICAgICAgIGF4aXNNQy5zZXRQcm9wZXJ0eShrZXkxLCAidmFsdWUiKTsNCi0gICAgICAgIGF4aXNNQy5nZXRPcHRpb25zKCkuc2V0UHJvcGVydHkoa2V5MiwgInZhbHVlIik7DQotICAgICAgICBqYXh3c01DLnNldFByb3BlcnR5KGtleTMsICJ2YWx1ZSIpOw0KLSAgICAgICAgDQotICAgICAgICBhc3NlcnROb3ROdWxsKGpheHdzTUMuZ2V0UHJvcGVydHkoa2V5MSkpOw0KLSAgICAgICAgYXNzZXJ0TnVsbChqYXh3c01DLmdldFByb3BlcnR5KGtleTIpKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwoamF4d3NNQy5nZXRQcm9wZXJ0eShrZXkzKSk7DQotICAgICAgICANCi0gICAgICAgIE1hcCBwcm9wcyA9IGpheHdzTUMuZ2V0UHJvcGVydGllcygpOw0KLSAgICAgICAgDQotICAgICAgICBhc3NlcnROb3ROdWxsKHByb3BzLmdldChrZXkxKSk7DQotICAgICAgICBhc3NlcnROdWxsKHByb3BzLmdldChrZXkyKSk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHByb3BzLmdldChrZXkzKSk7DQotICAgIH0NCi0gICAgDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kYXRhYmluZGluZy9CaW5kaW5nVG9Qcm90b2NvbFRlc3RzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGF0YWJpbmRpbmcvQmluZGluZ1RvUHJvdG9jb2xUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWM2Y2VkLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kYXRhYmluZGluZy9CaW5kaW5nVG9Qcm90b2NvbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRhdGFiaW5kaW5nOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotLyoqCi0gKiBBIHN1aXRlIG9mIHRlc3RzIGZvciByZWFkaW5nIHRoZSBiaW5kaW5nIGZyb20gYSBXU0RMIGZpbGUgYW5kCi0gKiBtYWtpbmcgc3VyZSB3ZSBhcmUgY29uZmlndXJpbmcgdGhlIFByb3RvY29sIGNvcnJlY3RseSBmb3IgCi0gKiBtZXNzYWdlcyBiYXNlZCBvbiB0aGF0IGJpbmRpbmcgSUQuCi0gKi8KLXB1YmxpYyBjbGFzcyBCaW5kaW5nVG9Qcm90b2NvbFRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTT0FQMTFfVEVTVF9OUyA9ICJodHRwOi8vamF4d3MuYXhpczIuYXBhY2hlLm9yZy9iaW5kaW5ndGVzdC9zb2FwMTEiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTT0FQMTJfVEVTVF9OUyA9ICJodHRwOi8vamF4d3MuYXhpczIuYXBhY2hlLm9yZy9iaW5kaW5ndGVzdC9zb2FwMTIiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFFOYW1lIFNPQVAxMV9TVkNfUU5BTUUgPSBuZXcgUU5hbWUoU09BUDExX1RFU1RfTlMsICJTT0FQMTFFY2hvU2VydmljZSIpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFFOYW1lIFNPQVAxMl9TVkNfUU5BTUUgPSBuZXcgUU5hbWUoU09BUDEyX1RFU1RfTlMsICJTT0FQMTJFY2hvU2VydmljZSIpOwotICAgIAotICAgIHB1YmxpYyBCaW5kaW5nVG9Qcm90b2NvbFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUZXN0IHRvIHNlZSBpZiB3ZSBjYW4gcmVhZCB0aGUgU09BUCAxLjEgYmluZGluZyB0cmFuc3BvcnQgVVJMCi0gICAgICogaW4gYSBXU0RMLCBhcyBzcGVjaWZpZWQgYnkgSkFYLVdTIHNlY3Rpb24gMTAuNC4xLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RSZWFkSkFYV1NTT0FQMTFCaW5kaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8qCi0gICAgICAgIC8vIEdldCB0aGUgV1NETCB3aXRoIHRoZSBKQVgtV1MgYmluZGluZyB1cmwKLSAgICAgICAgVVJMIHdzZGxVcmwgPSBuZXcgVVJMKCJmaWxlOi4vdGVzdC1yZXNvdXJjZXMvd3NkbC9TT0FQMTFCaW5kaW5nLUpBWFdTLndzZGwiKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFRPRE86IFRoZXJlIHNob3VsZCBiZSBhbiBlYXNpZXIgd2F5IHRvIGRvIHRoaXMgd2l0aG91dAotICAgICAgICAvLyByZXF1cmluZyB0aGUgY3JlYXRpbmcgb2YgYSBTZXJ2aWNlIG9iamVjdC4gIFNob3VsZCB0aGUKLSAgICAgICAgLy8gU2VydmljZURlc2NyaXB0aW9uIGJlIGNvbnN0cnVjdGVkIGZyb20ganVzdCBhIFdTREwgZmlsZT8KLSAgICAgICAgU2VydmljZSBzdmMgPSBTZXJ2aWNlLmNyZWF0ZSh3c2RsVXJsLCBTT0FQMTFfU1ZDX1FOQU1FKTsKLSAgICAgICAgU2VydmljZURlbGVnYXRlIGRlbGVnYXRlID0gRGVzY3JpcHRpb25UZXN0VXRpbHMuZ2V0U2VydmljZURlbGVnYXRlKHN2Yyk7Ci0gICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzZCA9IGRlbGVnYXRlLmdldFNlcnZpY2VEZXNjcmlwdGlvbigpOwotICAgICAgICAKLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbltdIGVkcyA9IHNkLmdldEVuZHBvaW50RGVzY3JpcHRpb25zKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZWRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInBvcnQgWyIgKyBlZHNbaV0uZ2V0VGFyZ2V0TmFtZXNwYWNlKCkgKyAiOiIgKyBlZHNbaV0uZ2V0TmFtZSgpICsgIl0iKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlZCA9IHNkLmdldEVuZHBvaW50RGVzY3JpcHRpb24obmV3IFFOYW1lKFNPQVAxMV9URVNUX05TLCAiRWNob1BvcnQiKSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoIlRoZSBFbmRwb2ludERlc2NyaXB0aW9uIHdhcyBub3QgY3JlYXRlZC4iLCBlZCk7Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgYmluZGluZ0lEID0gZWQuZ2V0Q2xpZW50QmluZGluZ0lEKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoIlRoZSBiaW5kaW5nIElEIHdhcyBudWxsLiIsIGJpbmRpbmdJRCk7Ci0gICAgICAgIAotICAgICAgICBQcm90b2NvbCBwID0gUHJvdG9jb2wuZ2V0UHJvdG9jb2xGb3JCaW5kaW5nKGJpbmRpbmdJRCk7Ci0gICAgICAgIGFzc2VydFRydWUoIlByb3RvY29sIGNvbmZpZ3VyZWQgaW5jb3JyZWN0bHkiLCBwLmVxdWFscyhQcm90b2NvbC5zb2FwMTEpKTsKLSAgICAgICAgKi8KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGVzdCB0byBzZWUgaWYgd2UgY2FuIHJlYWQgdGhlIFNPQVAgMS4xIGJpbmRpbmcgdHJhbnNwb3J0IFVSTAotICAgICAqIGluIGEgV1NETCwgYXMgc3BlY2lmaWVkIGJ5IFdTLUkgQmFzaWMgUHJvZmlsZSAxLjEuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFJlYWRXU0lTT0FQMTFCaW5kaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8qCi0gICAgICAgIC8vIEdldCB0aGUgV1NETCB3aXRoIHRoZSBKQVgtV1MgYmluZGluZyB1cmwKLSAgICAgICAgVVJMIHdzZGxVcmwgPSBuZXcgVVJMKCJmaWxlOi4vdGVzdC1yZXNvdXJjZXMvd3NkbC9TT0FQMTFCaW5kaW5nLVdTSS53c2RsIik7Ci0gICAgICAgIAotICAgICAgICAvLyBUT0RPOiBUaGVyZSBzaG91bGQgYmUgYW4gZWFzaWVyIHdheSB0byBkbyB0aGlzIHdpdGhvdXQKLSAgICAgICAgLy8gcmVxdXJpbmcgdGhlIGNyZWF0aW5nIG9mIGEgU2VydmljZSBvYmplY3QuICBTaG91bGQgdGhlCi0gICAgICAgIC8vIFNlcnZpY2VEZXNjcmlwdGlvbiBiZSBjb25zdHJ1Y3RlZCBmcm9tIGp1c3QgYSBXU0RMIGZpbGU/Ci0gICAgICAgIFNlcnZpY2Ugc3ZjID0gU2VydmljZS5jcmVhdGUod3NkbFVybCwgU09BUDExX1NWQ19RTkFNRSk7Ci0gICAgICAgIFNlcnZpY2VEZWxlZ2F0ZSBkZWxlZ2F0ZSA9IERlc2NyaXB0aW9uVGVzdFV0aWxzLmdldFNlcnZpY2VEZWxlZ2F0ZShzdmMpOwotICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc2QgPSBkZWxlZ2F0ZS5nZXRTZXJ2aWNlRGVzY3JpcHRpb24oKTsKLSAgICAgICAgCi0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb25bXSBlZHMgPSBzZC5nZXRFbmRwb2ludERlc2NyaXB0aW9ucygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVkcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJwb3J0IFsiICsgZWRzW2ldLmdldFRhcmdldE5hbWVzcGFjZSgpICsgIjoiICsgZWRzW2ldLmdldE5hbWUoKSArICJdIik7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZWQgPSBzZC5nZXRFbmRwb2ludERlc2NyaXB0aW9uKG5ldyBRTmFtZShTT0FQMTFfVEVTVF9OUywgIkVjaG9Qb3J0IikpOwotICAgICAgICBhc3NlcnROb3ROdWxsKCJUaGUgRW5kcG9pbnREZXNjcmlwdGlvbiB3YXMgbm90IGNyZWF0ZWQuIiwgZWQpOwotICAgICAgICAKLSAgICAgICAgU3RyaW5nIGJpbmRpbmdJRCA9IGVkLmdldENsaWVudEJpbmRpbmdJRCgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKCJUaGUgYmluZGluZyBJRCB3YXMgbnVsbC4iLCBiaW5kaW5nSUQpOwotICAgICAgICAKLSAgICAgICAgUHJvdG9jb2wgcCA9IFByb3RvY29sLmdldFByb3RvY29sRm9yQmluZGluZyhiaW5kaW5nSUQpOwotICAgICAgICBhc3NlcnRUcnVlKCJQcm90b2NvbCBjb25maWd1cmVkIGluY29ycmVjdGx5IiwgcC5lcXVhbHMoUHJvdG9jb2wuc29hcDExKSk7Ci0gICAgICAgICovCi0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFRlc3QgdG8gc2VlIGlmIHdlIGNhbiByZWFkIHRoZSBTT0FQIDEuMiBiaW5kaW5nIHRyYW5zcG9ydCBVUkwKLSAgICAgKiBpbiBhIFdTREwsIGFzIHNwZWNpZmllZCBieSBKQVgtV1MuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFJlYWRKQVhXU1NPQVAxMkJpbmRpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLyoKLSAgICAgICAgLy8gR2V0IHRoZSBXU0RMIHdpdGggdGhlIEpBWC1XUyBiaW5kaW5nIHVybAotICAgICAgICBVUkwgd3NkbFVybCA9IG5ldyBVUkwoImZpbGU6Li90ZXN0LXJlc291cmNlcy93c2RsL1NPQVAxMkJpbmRpbmctSkFYV1Mud3NkbCIpOwotICAgICAgICAKLSAgICAgICAgLy8gVE9ETzogVGhlcmUgc2hvdWxkIGJlIGFuIGVhc2llciB3YXkgdG8gZG8gdGhpcyB3aXRob3V0Ci0gICAgICAgIC8vIHJlcXVyaW5nIHRoZSBjcmVhdGluZyBvZiBhIFNlcnZpY2Ugb2JqZWN0LiAgU2hvdWxkIHRoZQotICAgICAgICAvLyBTZXJ2aWNlRGVzY3JpcHRpb24gYmUgY29uc3RydWN0ZWQgZnJvbSBqdXN0IGEgV1NETCBmaWxlPwotICAgICAgICBTZXJ2aWNlIHN2YyA9IFNlcnZpY2UuY3JlYXRlKHdzZGxVcmwsIFNPQVAxMl9TVkNfUU5BTUUpOwotICAgICAgICBTZXJ2aWNlRGVsZWdhdGUgZGVsZWdhdGUgPSBEZXNjcmlwdGlvblRlc3RVdGlscy5nZXRTZXJ2aWNlRGVsZWdhdGUoc3ZjKTsKLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNkID0gZGVsZWdhdGUuZ2V0U2VydmljZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgIAotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uW10gZWRzID0gc2QuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbnMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlZHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigicG9ydCBbIiArIGVkc1tpXS5nZXRUYXJnZXROYW1lc3BhY2UoKSArICI6IiArIGVkc1tpXS5nZXROYW1lKCkgKyAiXSIpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVkID0gc2QuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbihuZXcgUU5hbWUoU09BUDEyX1RFU1RfTlMsICJFY2hvUG9ydCIpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgiVGhlIEVuZHBvaW50RGVzY3JpcHRpb24gd2FzIG5vdCBjcmVhdGVkLiIsIGVkKTsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBiaW5kaW5nSUQgPSBlZC5nZXRDbGllbnRCaW5kaW5nSUQoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgiVGhlIGJpbmRpbmcgSUQgd2FzIG51bGwuIiwgYmluZGluZ0lEKTsKLSAgICAgICAgCi0gICAgICAgIFByb3RvY29sIHAgPSBQcm90b2NvbC5nZXRQcm90b2NvbEZvckJpbmRpbmcoYmluZGluZ0lEKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiUHJvdG9jb2wgY29uZmlndXJlZCBpbmNvcnJlY3RseSIsIHAuZXF1YWxzKFByb3RvY29sLnNvYXAxMikpOwotICAgICAgICAqLwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUZXN0IHRvIHNlZSBpZiB3ZSBhcmUgZGVmYXVsdGluZyB0aGUgc29hcCBiaW5kaW5nIHRvIFNPQVAgMS4xCi0gICAgICogY29ycmVjdGx5IGluIHRoZSBhYnNlbmNlIG9mIGEgV1NETCBkb2N1bWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdEJpbmRpbmdOb1dTREwoKSB7Ci0gICAgICAgIAotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9Bbm5vdGF0aW9uRGVzY3JpcHRpb25UZXN0cy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL0Fubm90YXRpb25EZXNjcmlwdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmNzFlNTguLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL0Fubm90YXRpb25EZXNjcmlwdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zcGkuU2VydmljZURlbGVnYXRlOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci0KLS8qKgotICogRGlyZWN0bHkgdGVzdCB0aGUgRGVzY3JpcHRpb24gY2xhc3NlcyBidWlsdCB2aWEgYW5ub3RhdGlvbnMgd2l0aG91dCBhIFdTREwgZmlsZS4KLSAqIFRoZXNlIHRlc3RzIGZvY3VzIG9uIGNvbWJpbmF0aW9ucyBvZiB0aGUgZm9sbG93aW5nOgotICogLSBBIGdlbmVyaWMgc2VydmljZSAobm8gYW5ub3RhdGlvbnMpCi0gKiAtIEEgZ2VuZXJhdGVkIHNlcnZpY2UgKGFubm90YXRpb25zKQotICogLSBBbiBTRUkKLSAqLwotcHVibGljIGNsYXNzIEFubm90YXRpb25EZXNjcmlwdGlvblRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotICAgIAotICAgIC8qIAotICAgICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICAqIFNlcnZpY2VEZXNjcmlwdGlvbiBUZXN0cwotICAgICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVTZXJ2aWNlKCkgewotICAgICAgICBTdHJpbmcgbmFtZXNwYWNlVVJJPSAiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvdGVzdHMiOwotICAgICAgICBTdHJpbmcgbG9jYWxQYXJ0ID0gIkVjaG9TZXJ2aWNlQW5ub3RhdGVkIjsKLSAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gU2VydmljZS5jcmVhdGUobnVsbCwgIG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIGxvY2FsUGFydCkpOwotICAgICAgICBTZXJ2aWNlRGVsZWdhdGUgc2VydmljZURlbGVnYXRlID0gRGVzY3JpcHRpb25UZXN0VXRpbHMyLmdldFNlcnZpY2VEZWxlZ2F0ZShzZXJ2aWNlKTsKLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNlcnZpY2VEZXNjcmlwdGlvbiA9IHNlcnZpY2VEZWxlZ2F0ZS5nZXRTZXJ2aWNlRGVzY3JpcHRpb24oKTsKLSAgICAgICAgU3RyaW5nIHBvcnRMb2NhbFBhcnQgPSAiRWNob1NlcnZpY2VBbm5vdGF0ZWRQb3J0IjsKLSAgICAgICAgUU5hbWUgcG9ydFFOYW1lID0gbmV3IFFOYW1lKG5hbWVzcGFjZVVSSSwgcG9ydExvY2FsUGFydCk7Ci0gICAgICAgIERvY3VtZW50TGl0ZXJhbFdyYXBwZWRQcm94eSBkbHdwID0gc2VydmljZS5nZXRQb3J0KHBvcnRRTmFtZSwgRG9jdW1lbnRMaXRlcmFsV3JhcHBlZFByb3h5LmNsYXNzKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFZhbGlkYXRlIHRoYXQgdGhlIEVuZHBvaW50IGFuZCBFbmRwb2ludEludGVyZmFjZSBEZXNjcmlwdGlvbnMgd2VyZSBjcmVhdGVkIGNvcnJlY3RseQotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVuZHBvaW50RGVzY3JpcHRpb24gPSBzZXJ2aWNlRGVzY3JpcHRpb24uZ2V0RW5kcG9pbnREZXNjcmlwdGlvbihwb3J0UU5hbWUpOwotICAgICAgICBhc3NlcnROb3ROdWxsKCJFbmRwb2ludCBub3QgY3JlYXRlZCAiLCBlbmRwb2ludERlc2NyaXB0aW9uKTsKLSAgICAgICAgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiBlbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uID0gZW5kcG9pbnREZXNjcmlwdGlvbi5nZXRFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoIkVuZHBvaW50SW50ZXJmYWNlIG5vdCBjcmVhdGVkIiwgZW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbik7Ci0gICAgICAgIC8vIFZlcmlmeSB3ZSBjYW4gZ2V0IHRoZSBzYW1lIGVuZHBvaW50IGRlc2NyaXB0aW9uIGJhc2VkIG9uIHRoZSBTRUkgY2xhc3MKLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbltdIGZyb21TRUlDbGFzcyA9IHNlcnZpY2VEZXNjcmlwdGlvbi5nZXRFbmRwb2ludERlc2NyaXB0aW9uKERvY3VtZW50TGl0ZXJhbFdyYXBwZWRQcm94eS5jbGFzcyk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLGZyb21TRUlDbGFzcy5sZW5ndGgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZW5kcG9pbnREZXNjcmlwdGlvbiwgZnJvbVNFSUNsYXNzWzBdKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFRlc3QgZ2V0T3BlcmF0aW9uIG1ldGhvZHMgcGFyYW1ldGVyIHZhbGlkYXRpb24KLSAgICAgICAgT3BlcmF0aW9uRGVzY3JpcHRpb25bXSBvcGVyYXRpb25SZXN1bHRBcnJheSA9IGVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24uZ2V0T3BlcmF0aW9uKChRTmFtZSkgbnVsbCk7Ci0gICAgICAgIGFzc2VydE51bGwob3BlcmF0aW9uUmVzdWx0QXJyYXkpOwotICAgICAgICBvcGVyYXRpb25SZXN1bHRBcnJheSA9IGVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24uZ2V0T3BlcmF0aW9uKG5ldyBRTmFtZSgiIiwiIikpOwotICAgICAgICBhc3NlcnROdWxsKG9wZXJhdGlvblJlc3VsdEFycmF5KTsKLSAgICAgICAgT3BlcmF0aW9uRGVzY3JpcHRpb24gb3BlcmF0aW9uUmVzdWx0ID0gZW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbi5nZXRPcGVyYXRpb24oKE1ldGhvZCkgbnVsbCk7Ci0gICAgICAgIGFzc2VydE51bGwob3BlcmF0aW9uUmVzdWx0KTsKLSAgICAgICAgCi0gICAgICAgIC8vIFRlc3QgZ2V0T3BlcmF0aW9ucygpOiBOdW1iZXIgb2YgbWV0aG9kcyBvbiBTRUkgc2hvdWxkIG1hdGNoIG51bWJlciBvZiBvcGVyYXRpb25EZXNjcmlwdGlvbnMKLSAgICAgICAgTWV0aG9kW10gc2VpTWV0aG9kcyA9IERvY3VtZW50TGl0ZXJhbFdyYXBwZWRQcm94eS5jbGFzcy5nZXRNZXRob2RzKCk7Ci0gICAgICAgIG9wZXJhdGlvblJlc3VsdEFycmF5ID0gZW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbi5nZXRPcGVyYXRpb25zKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiTnVtYmVyIG9mIFNFSSBtZXRob2RzIGFuZCBvcGVyYXRpb25zIGRpZCBub3QgbWF0Y2giLCBzZWlNZXRob2RzLmxlbmd0aCwgb3BlcmF0aW9uUmVzdWx0QXJyYXkubGVuZ3RoKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFRlc3QgZ2V0T3BlcmF0aW9uKFFOYW1lKQotICAgICAgICAvLyBWZXJpZnkgQFdlYk1ldGhvZC5uYW1lIGlzIHVzZWQgaWYgcHJlc2VudC4gIFNlZSB0aGUgU0VJIGNsYXNzIGFubm90YXRpb25zIGZvciBtb3JlIGluZm9ybWF0aW9uCi0gICAgICAgIC8vIFRoZSBTRUkgaGFzIEBXZWJNZXRob2QgYW5ub3RhdGlvbnMgdGhhdCBvdmVycmlkZSB0aGUgbmFtZSBvZiAiaW52b2tlQXN5bmMiLCBzbyBub25lIHNob3VsZCBiZSBmb3VuZC4KLSAgICAgICAgUU5hbWUgamF2YU1ldGhvZFFOYW1lID0gbmV3IFFOYW1lKCIiLCAiaW52b2tlQXN5bmMiKTsKLSAgICAgICAgb3BlcmF0aW9uUmVzdWx0QXJyYXkgPSBlbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uLmdldE9wZXJhdGlvbihqYXZhTWV0aG9kUU5hbWUpOwotICAgICAgICBhc3NlcnROdWxsKG9wZXJhdGlvblJlc3VsdEFycmF5KTsKLSAgICAgICAgLy8gVGhlIFNFSSBoYXMgQFdlYk1ldGhvZCBhbm5vdGF0aW9ucyB0aGF0IG5hbWUgdGhyZWUgb3BlcmF0aW9ucyAiaW52b2tlIgotICAgICAgICBqYXZhTWV0aG9kUU5hbWUgPSBuZXcgUU5hbWUoIiIsICJpbnZva2UiKTsKLSAgICAgICAgb3BlcmF0aW9uUmVzdWx0QXJyYXkgPSBlbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uLmdldE9wZXJhdGlvbihqYXZhTWV0aG9kUU5hbWUpOwotICAgICAgICBhc3NlcnROb3ROdWxsKG9wZXJhdGlvblJlc3VsdEFycmF5KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIG9wZXJhdGlvblJlc3VsdEFycmF5Lmxlbmd0aCk7Ci0gICAgICAgIAotICAgICAgICAvLyBUZXN0IGdldE9wZXJhdGlvbihNZXRob2QpCi0gICAgICAgIC8vIFZlcmlmeSBhbiBTRUkgbWV0aG9kIGxvb2t1cCB3b3JrcwotICAgICAgICBvcGVyYXRpb25SZXN1bHQgPSBlbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uLmdldE9wZXJhdGlvbihzZWlNZXRob2RzWzBdKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChvcGVyYXRpb25SZXN1bHQpOwotICAgICAgICAvLyBWZXJpZnkgYSBub24tU0VJIG1ldGhvZCByZXR1cm5zIGEgbnVsbAotICAgICAgICBvcGVyYXRpb25SZXN1bHQgPSBlbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uLmdldE9wZXJhdGlvbih0aGlzLmdldENsYXNzKCkuZ2V0TWV0aG9kcygpWzBdKTsKLSAgICAgICAgYXNzZXJ0TnVsbChvcGVyYXRpb25SZXN1bHQpOwotICAgIH0KLSAgICAKLSAgICAgICAKLSAgICAvKgotICAgICAqIFRPIFRFU1QKLSAgICAgKiAtIEludmFsaWQgbmFtZXNwYWNlLiAgVE5TIGluIGFubm90YXRpb24gZG9lc24ndCBtYXRjaCBvbmUgZnJvbSBnZXRQb3J0Ci0gICAgICogLSBNdWx0aXBsZSBzZXJ2aWNlLmdldFBvcnQoKSBjYWxscyB3aXRoIHNhbWUgU0VJIGFuZCBkaWZmZXJlbnQgUU5hbWUsIGFuZCB0aGF0IHNlcnZpY2VEZXNjLmdldEVuZHBvaW50RGVzYyhDbGFzcykgcmV0dXJucyBtdWx0aWVsZW1lbnQgYXJyYXkKLSAgICAgKiAtIFRlc3Qgc2VydmljZS5nZXRQb3J0KC4uKSB3aXRoIHNhbWUgUU5hbWU7IHNob3VsZCByZXR1cm4gc2FtZSBkZXNjcnBwdGlvbgotICAgICAqLwotLyogICAgCi0gICAgcHVibGljIHZvaWQgdGVzdFZhbGlkU2VydmljZUdldEVuZHBvaW50KCkgewotICAgICAgICBRTmFtZSB2YWxpZFBvcnRRbmFtZSA9IG5ldyBRTmFtZSgiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvdGVzdHMiLCAiRWNob1BvcnQiKTsKLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlbmRwb2ludERlc2NyaXB0aW9uID0gc2VydmljZURlc2NyaXB0aW9uLmdldEVuZHBvaW50RGVzY3JpcHRpb24odmFsaWRQb3J0UW5hbWUpOwotICAgICAgICBhc3NlcnROb3ROdWxsKCJFbmRwb2ludERlc2NyaXB0aW9uIHNob3VsZCBiZSBmb3VuZCIsIGVuZHBvaW50RGVzY3JpcHRpb24pOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZExvY2FscGFydFNlcnZpY2VHZXRFbmRwb2ludCgpIHsKLSAgICAgICAgUU5hbWUgdmFsaWRQb3J0UW5hbWUgPSBuZXcgUU5hbWUoImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL3Rlc3RzIiwgIkludmFsaWRFY2hvUG9ydCIpOwotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVuZHBvaW50RGVzY3JpcHRpb24gPSBzZXJ2aWNlRGVzY3JpcHRpb24uZ2V0RW5kcG9pbnREZXNjcmlwdGlvbih2YWxpZFBvcnRRbmFtZSk7Ci0gICAgICAgIGFzc2VydE51bGwoIkVuZHBvaW50RGVzY3JpcHRpb24gc2hvdWxkIG5vdCBiZSBmb3VuZCIsIGVuZHBvaW50RGVzY3JpcHRpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkTmFtZXNwYWNlU2VydmljZUdldEVuZHBvaW50KCkgewotICAgICAgICBRTmFtZSB2YWxpZFBvcnRRbmFtZSA9IG5ldyBRTmFtZSgiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvdGVzdHMvSU5WQUxJRCIsICJFY2hvUG9ydCIpOwotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVuZHBvaW50RGVzY3JpcHRpb24gPSBzZXJ2aWNlRGVzY3JpcHRpb24uZ2V0RW5kcG9pbnREZXNjcmlwdGlvbih2YWxpZFBvcnRRbmFtZSk7Ci0gICAgICAgIGFzc2VydE51bGwoIkVuZHBvaW50RGVzY3JpcHRpb24gc2hvdWxkIG5vdCBiZSBmb3VuZCIsIGVuZHBvaW50RGVzY3JpcHRpb24pOwotICAgIH0KLSovICAgIAotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL0NsaWVudEFubm90YXRpb25UZXN0cy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL0NsaWVudEFubm90YXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjVhY2RiLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9DbGllbnRBbm5vdGF0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb247DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCi0NCi1pbXBvcnQgamF2YXguandzLkhhbmRsZXJDaGFpbjsNCi1pbXBvcnQgamF2YXguandzLk9uZXdheTsNCi1pbXBvcnQgamF2YXguandzLldlYk1ldGhvZDsNCi1pbXBvcnQgamF2YXguandzLldlYlBhcmFtOw0KLWltcG9ydCBqYXZheC5qd3MuV2ViUmVzdWx0Ow0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsNCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLlJlcXVlc3RXcmFwcGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuUmVzcG9uc2VXcmFwcGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VDbGllbnQ7DQotaW1wb3J0IGphdmEubmV0LlVSTDsNCi0NCi0vKioNCi0gKiBUZXN0IHRoYXQgdGhlIGFubm90YXRpb25zIHZhbGlkIG9uIGEgc2VydmljZSByZXF1ZXN0ZXIgY2FuIGJlIA0KLSAqIHByb2Nlc3NlZC4gDQotICovDQotcHVibGljIGNsYXNzIENsaWVudEFubm90YXRpb25UZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZXNwYWNlVVJJID0gImh0dHA6Ly9vcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkNsaWVudEFubm90YXRpb25UZXN0cyI7DQotICAgIHByaXZhdGUgU3RyaW5nIHN2Y0xvY2FsUGFydCA9ICJzdmNMb2NhbFBhcnQiOw0KLSAgICBwcml2YXRlIFN0cmluZyBwb3J0TG9jYWxQYXJ0ID0gInBvcnRMb2NhbFBhcnQiOw0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U0VJQW5ub3RhdGlvbnMoKSB7DQotICAgICAgICBRTmFtZSBzZXJ2aWNlUU5hbWUgPSBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBzdmNMb2NhbFBhcnQpOw0KLSAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gbmV3IENsaWVudEFubm90YXRpb25UZXN0c1NlcnZpY2UobnVsbCwgc2VydmljZVFOYW1lKTsNCi0gICAgICAgIFFOYW1lIHBvcnRRTmFtZSA9IG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIHBvcnRMb2NhbFBhcnQpOw0KLSAgICAgICAgQ2xpZW50QW5ub3RhdGlvblRlc3RzU0VJIHBvcnQgPSBzZXJ2aWNlLmdldFBvcnQocG9ydFFOYW1lLCBDbGllbnRBbm5vdGF0aW9uVGVzdHNTRUkuY2xhc3MpOw0KLSAgICB9DQotDQotfQ0KLQ0KLUBXZWJTZXJ2aWNlQ2xpZW50DQotY2xhc3MgQ2xpZW50QW5ub3RhdGlvblRlc3RzU2VydmljZSBleHRlbmRzIGphdmF4LnhtbC53cy5TZXJ2aWNlIHsNCi0gICAgcHJvdGVjdGVkIENsaWVudEFubm90YXRpb25UZXN0c1NlcnZpY2UoVVJMIHdzZGxEb2N1bWVudExvY2F0aW9uLCBRTmFtZSBzZXJ2aWNlTmFtZSkgew0KLSAgICAgICAgc3VwZXIod3NkbERvY3VtZW50TG9jYXRpb24sIHNlcnZpY2VOYW1lKTsNCi0gICAgfQ0KLX0NCi0NCi1AV2ViU2VydmljZQ0KLUBIYW5kbGVyQ2hhaW4oZmlsZT0iQ2xpZW50QW5ub3RhdGlvblRlc3RzSGFuZGxlci54bWwiKQ0KLWludGVyZmFjZSBDbGllbnRBbm5vdGF0aW9uVGVzdHNTRUkgew0KLSANCi0gICAgQFdlYk1ldGhvZA0KLSAgICBAV2ViUmVzdWx0DQotICAgIHB1YmxpYyBTdHJpbmcgZWNobyhAV2ViUGFyYW0NCi0gICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhcmcpOw0KLSAgICANCi0gICAgQE9uZXdheQ0KLSAgICBwdWJsaWMgdm9pZCBvbmVXYXkoKTsNCi0gICAgDQotICAgIEBSZXNwb25zZVdyYXBwZXINCi0gICAgQFJlcXVlc3RXcmFwcGVyDQotICAgIHB1YmxpYyBTdHJpbmcgZWNob1dyYXAoU3RyaW5nIGFydCk7DQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9DbGllbnRBbm5vdGF0aW9uVGVzdHNIYW5kbGVyLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9DbGllbnRBbm5vdGF0aW9uVGVzdHNIYW5kbGVyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTk5OTYzMy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vQ2xpZW50QW5ub3RhdGlvblRlc3RzSGFuZGxlci54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08andzOmhhbmRsZXItY2hhaW5zIHhtbG5zOmp3cz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIj4NCi0gIDxqd3M6aGFuZGxlci1jaGFpbj4NCi0gICAgPGp3czpoYW5kbGVyPg0KLSAgICAgIDxqd3M6aGFuZGxlci1jbGFzcz5vcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNwaS5oYW5kbGVyLkR1bW15U09BUEhhbmRsZXI8L2p3czpoYW5kbGVyLWNsYXNzPg0KLSAgICA8L2p3czpoYW5kbGVyPg0KLSAgICA8andzOmhhbmRsZXI+DQotICAgICAgPGp3czpoYW5kbGVyLWNsYXNzPm9yZy5hcGFjaGUuYXhpczIuamF4d3Muc3BpLmhhbmRsZXIuRHVtbXlMb2dpY2FsSGFuZGxlcjwvandzOmhhbmRsZXItY2xhc3M+DQotICAgIDwvandzOmhhbmRsZXI+DQotICA8L2p3czpoYW5kbGVyLWNoYWluPg0KLTwvandzOmhhbmRsZXItY2hhaW5zPg0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9EZXNjcmlwdGlvblRlc3RVdGlsczIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9EZXNjcmlwdGlvblRlc3RVdGlsczIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjVkNmQyZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vRGVzY3JpcHRpb25UZXN0VXRpbHMyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc3BpLlNlcnZpY2VEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnVuaXRUZXN0LlRlc3RMb2dnZXI7Ci0KLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5mYWN0b3J5LldTRExGYWN0b3J5OwotaW1wb3J0IGphdmF4LndzZGwueG1sLldTRExSZWFkZXI7Ci1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIERlc2NyaXB0aW9uVGVzdFV0aWxzMiB7Ci0gICAgCi0gICAgLyoKLSAgICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgKiBUZXN0IHV0aWxpdHkgbWV0aG9kcwotICAgICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICAqLwotCi0gICAgc3RhdGljIHB1YmxpYyBVUkwgZ2V0V1NETFVSTCgpIHsKLSAgICAgICAgcmV0dXJuIGdldFdTRExVUkwoIldTRExUZXN0cy53c2RsIik7Ci0gICAgICAgIAotICAgIH0KLSAgICAKLSAgICBzdGF0aWMgcHVibGljIFN0cmluZyBnZXRXU0RMTG9jYXRpb24oU3RyaW5nIHdzZGxGaWxlTmFtZSkgewotICAgICAgICAvLyBHZXQgdGhlIFVSTCB0byB0aGUgV1NETCBmaWxlLiAgTm90ZSB0aGF0ICdiYXNlZGlyJyBpcyBzZXR1cCBieSBNYXZlbgotICAgICAgICBTdHJpbmcgYmFzZWRpciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiYmFzZWRpciIsIi4iKTsKLSAgICAgICAgcmV0dXJuIGJhc2VkaXIgKyAiL3Rlc3QtcmVzb3VyY2VzL3dzZGwvIiArIHdzZGxGaWxlTmFtZTsKLSAgICB9Ci0gICAgCi0gICAgc3RhdGljIHB1YmxpYyBVUkwgZ2V0V1NETFVSTChTdHJpbmcgd3NkbEZpbGVOYW1lKSB7Ci0gICAgICAgIFVSTCB3c2RsVVJMID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIHVybFN0cmluZyA9IGdldFdTRExMb2NhdGlvbih3c2RsRmlsZU5hbWUpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgd3NkbFVSTCA9IG5ldyBGaWxlKHVybFN0cmluZykuZ2V0QWJzb2x1dGVGaWxlKCkudG9VUkwoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKAotICAgICAgICAgICAgICAgICAgICAiQ2F1Z2h0IGV4Y2VwdGlvbiBjcmVhdGluZyBXU0RMIFVSTCA6IiArIHVybFN0cmluZyArICI7IGV4Y2VwdGlvbjogIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gd3NkbFVSTDsKLSAgICB9Ci0gICAgCi0gICAgc3RhdGljIERlZmluaXRpb24gY3JlYXRlV1NETERlZmluaXRpb24oVVJMIHdzZGxVUkwpIHsKLSAgICAgICAgRGVmaW5pdGlvbiB3c2RsRGVmaW5pdGlvbiA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBXU0RMRmFjdG9yeSBmYWN0b3J5ID0gV1NETEZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIFdTRExSZWFkZXIgcmVhZGVyID0gZmFjdG9yeS5uZXdXU0RMUmVhZGVyKCk7Ci0gICAgICAgICAgICB3c2RsRGVmaW5pdGlvbiA9IHJlYWRlci5yZWFkV1NETCh3c2RsVVJMLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIKLSAgICAgICAgICAgICAgICAgICAgLmRlYnVnKCIqKiogRVJST1IgKioqOiBDYXVnaHQgZXhjZXB0aW9uIHRyeWluZyB0byBjcmVhdGUgV1NETCBEZWZpbml0aW9uOiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlKTsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gd3NkbERlZmluaXRpb247Ci0gICAgfQotCi0gICAgc3RhdGljIHB1YmxpYyBTZXJ2aWNlRGVsZWdhdGUgZ2V0U2VydmljZURlbGVnYXRlKFNlcnZpY2Ugc2VydmljZSkgewotICAgICAgICAvLyBOZWVkIHRvIGdldCB0byB0aGUgcHJpdmF0ZSBTZXJ2aWNlLl9kZWxlZ2F0ZSBmaWVsZCBpbiBvcmRlciB0byBnZXQgdG8gdGhlIFNlcnZpY2VEZXNjcmlwdGlvbiB0byB0ZXN0Ci0gICAgICAgIFNlcnZpY2VEZWxlZ2F0ZSByZXR1cm5TZXJ2aWNlRGVsZWdhdGUgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBGaWVsZCBzZXJ2aWNlRGVsZ2F0ZUZpZWxkID0gc2VydmljZS5nZXRDbGFzcygpLmdldERlY2xhcmVkRmllbGRzKClbMF07Ci0gICAgICAgICAgICAgICAgc2VydmljZURlbGdhdGVGaWVsZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwotICAgICAgICAgICAgICAgIHJldHVyblNlcnZpY2VEZWxlZ2F0ZSA9IChTZXJ2aWNlRGVsZWdhdGUpIHNlcnZpY2VEZWxnYXRlRmllbGQuZ2V0KHNlcnZpY2UpOwotICAgICAgICAgICAgfSBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBUaGlzIG1heSBiZSBhIGdlbmVyYXRlZCBzZXJ2aWNlIHN1YmNsYXNzLCBzbyBnZXQgdGhlIGRlbGVnYXRlIGZyb20gdGhlIHN1cGVyY2xhc3MKLSAgICAgICAgICAgICAgICBGaWVsZCBzZXJ2aWNlRGVsZWdhdGVGaWVsZCA9IHNlcnZpY2UuZ2V0Q2xhc3MoKS5nZXRTdXBlcmNsYXNzKCkuZ2V0RGVjbGFyZWRGaWVsZHMoKVswXTsKLSAgICAgICAgICAgICAgICBzZXJ2aWNlRGVsZWdhdGVGaWVsZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwotICAgICAgICAgICAgICAgIHJldHVyblNlcnZpY2VEZWxlZ2F0ZSA9IChTZXJ2aWNlRGVsZWdhdGUpIHNlcnZpY2VEZWxlZ2F0ZUZpZWxkLmdldChzZXJ2aWNlKTsKLSAgICAgICAgICAgIH0gCi0gICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0dXJuU2VydmljZURlbGVnYXRlOwotICAgIH0KLSAgICAKLSAgICBzdGF0aWMgcHVibGljIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBnZXRTZXJ2aWNlRGVzY3JpcHRpb25Db21wb3NpdGUoU2VydmljZURlc2NyaXB0aW9uIHN2Y0Rlc2MpIHsKLSAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIHJldHVybkNvbXBvc2l0ZSA9IG51bGw7Ci0gICAgICAgIC8vIE5lZWQgdG8gZ2V0IHRoZSBjb21wb3NpdGUgb2ZmIHRoZSBpbXBsZW1lbnRhdGlvbiB1c2luZyB0aGUgZ2V0dGVyIG1ldGhvZCwgYnV0IGl0IGlzIGFsbAotICAgICAgICAvLyBwYWNrYWdlZCBwcm90ZWN0ZWQgYW5kIG5vdCBwYXJ0IG9mIHRoZSBpbnRlcmZhY2UuCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBNZXRob2QgZ2V0Q29tcG9zaXRlID0gc3ZjRGVzYy5nZXRDbGFzcygpLmdldERlY2xhcmVkTWV0aG9kKCJnZXREZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUiKTsKLSAgICAgICAgICAgIGdldENvbXBvc2l0ZS5zZXRBY2Nlc3NpYmxlKHRydWUpOwotICAgICAgICAgICAgcmV0dXJuQ29tcG9zaXRlID0gKERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSkgZ2V0Q29tcG9zaXRlLmludm9rZShzdmNEZXNjLCBudWxsKTsKLSAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHJldHVybkNvbXBvc2l0ZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9Eb2N1bWVudExpdGVyYWxXcmFwcGVkUHJveHkuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9Eb2N1bWVudExpdGVyYWxXcmFwcGVkUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNjZDQ2ZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vRG9jdW1lbnRMaXRlcmFsV3JhcHBlZFByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDkgKzAsMCBAQAotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb247Ci0KLWltcG9ydCBvcmcudGVzdC5wcm94eS5kb2NsaXR3cmFwcGVkLkZpbk9wUmVzcG9uc2U7Ci1pbXBvcnQgb3JnLnRlc3QucHJveHkuZG9jbGl0d3JhcHBlZC5GaW5hbmNpYWxPcGVyYXRpb247Ci1pbXBvcnQgb3JnLnRlc3QucHJveHkuZG9jbGl0d3JhcHBlZC5SZXR1cm5UeXBlOwotaW1wb3J0IG9yZy50ZXN0LnByb3h5LmRvY2xpdHdyYXBwZWQuVHdvV2F5SG9sZGVyOwotCi1pbXBvcnQgamF2YXguandzLk9uZXdheTsKLWltcG9ydCBqYXZheC5qd3MuV2ViTWV0aG9kOwotaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbTsKLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW0uTW9kZTsKLWltcG9ydCBqYXZheC5qd3MuV2ViUmVzdWx0OwotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOwotaW1wb3J0IGphdmF4LnhtbC53cy5Bc3luY0hhbmRsZXI7Ci1pbXBvcnQgamF2YXgueG1sLndzLkhvbGRlcjsKLWltcG9ydCBqYXZheC54bWwud3MuUmVxdWVzdFdyYXBwZXI7Ci1pbXBvcnQgamF2YXgueG1sLndzLlJlc3BvbnNlOwotaW1wb3J0IGphdmF4LnhtbC53cy5SZXNwb25zZVdyYXBwZXI7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOwotCi0vKioKLSAqIFRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBieSB0aGUgSkFYV1MgU0kuCi0gKiBKQVgtV1MgUkkgMi4wXzAxLWIxNS1mY3MKLSAqIEdlbmVyYXRlZCBzb3VyY2UgdmVyc2lvbjogMi4wCi0gKiAKLSAqLwotQFdlYlNlcnZpY2UobmFtZSA9ICJEb2NMaXRXcmFwcGVkUHJveHkiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvdGVzdHMiKQotcHVibGljIGludGVyZmFjZSBEb2N1bWVudExpdGVyYWxXcmFwcGVkUHJveHkgewotCi0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKi8KLSAgICBAV2ViTWV0aG9kKGFjdGlvbiA9ICJodHRwOi8vb3JnLmFwYWNoZS5heGlzMi5wcm94eS5kb2NsaXR3cmFwcGVkL3R3b1dheVJldHVybiIpCi0gICAgQE9uZXdheQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAib25lV2F5Vm9pZCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnLmFwYWNoZS5heGlzMi5wcm94eS5kb2NsaXR3cmFwcGVkIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LnByb3h5LmRvY2xpdHdyYXBwZWQuT25lV2F5Vm9pZCIpCi0gICAgcHVibGljIHZvaWQgb25lV2F5Vm9pZCgpOwotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHBhcmFtIG9uZXdheVN0cgotICAgICAqLwotICAgIEBXZWJNZXRob2QoYWN0aW9uID0gImh0dHA6Ly9vcmcuYXBhY2hlLmF4aXMyLnByb3h5LmRvY2xpdHdyYXBwZWQvdHdvV2F5UmV0dXJuIikKLSAgICBAT25ld2F5Ci0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJvbmVXYXkiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy5hcGFjaGUuYXhpczIucHJveHkuZG9jbGl0d3JhcHBlZCIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5wcm94eS5kb2NsaXR3cmFwcGVkLnNlaS5PbmVXYXkiKQotICAgIHB1YmxpYyB2b2lkIG9uZVdheSgKLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAib25ld2F5X3N0ciIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQotICAgICAgICBTdHJpbmcgb25ld2F5U3RyKTsKLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEBwYXJhbSB0d29XYXlIb2xkZXJJbnQKLSAgICAgKiBAcGFyYW0gdHdvV2F5SG9sZGVyU3RyCi0gICAgICogQHJldHVybgotICAgICAqICAgICByZXR1cm5zIGphdmF4LnhtbC53cy5SZXNwb25zZTxvcmcuYXBhY2hlLmF4aXMyLnByb3h5LmRvY2xpdHdyYXBwZWQuc2VpLlR3b1dheUhvbGRlcj4KLSAgICAgKi8KLSAgICBAV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWUgPSAidHdvV2F5SG9sZGVyIiwgYWN0aW9uID0gImh0dHA6Ly9vcmcuYXBhY2hlLmF4aXMyLnByb3h5LmRvY2xpdHdyYXBwZWQvdHdvV2F5UmV0dXJuIikKLSAgICBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gInR3b1dheUhvbGRlciIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnLmFwYWNoZS5heGlzMi5wcm94eS5kb2NsaXR3cmFwcGVkIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LnByb3h5LmRvY2xpdHdyYXBwZWQuVHdvV2F5SG9sZGVyIikKLSAgICBAUmVzcG9uc2VXcmFwcGVyKGxvY2FsTmFtZSA9ICJ0d29XYXlIb2xkZXIiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy5hcGFjaGUuYXhpczIucHJveHkuZG9jbGl0d3JhcHBlZCIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5wcm94eS5kb2NsaXR3cmFwcGVkLlR3b1dheUhvbGRlciIpCi0gICAgcHVibGljIFJlc3BvbnNlPFR3b1dheUhvbGRlcj4gdHdvV2F5SG9sZGVyQXN5bmMoCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gInR3b1dheUhvbGRlcl9zdHIiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikKLSAgICAgICAgU3RyaW5nIHR3b1dheUhvbGRlclN0ciwKLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAidHdvV2F5SG9sZGVyX2ludCIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQotICAgICAgICBpbnQgdHdvV2F5SG9sZGVySW50KTsKLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEBwYXJhbSB0d29XYXlIb2xkZXJJbnQKLSAgICAgKiBAcGFyYW0gYXN5bmNIYW5kbGVyCi0gICAgICogQHBhcmFtIHR3b1dheUhvbGRlclN0cgotICAgICAqIEByZXR1cm4KLSAgICAgKiAgICAgcmV0dXJucyBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU8PyBleHRlbmRzIGphdmEubGFuZy5PYmplY3Q+Ci0gICAgICovCi0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lID0gInR3b1dheUhvbGRlciIsIGFjdGlvbiA9ICJodHRwOi8vb3JnLmFwYWNoZS5heGlzMi5wcm94eS5kb2NsaXR3cmFwcGVkL3R3b1dheVJldHVybiIpCi0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJ0d29XYXlIb2xkZXIiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy5hcGFjaGUuYXhpczIucHJveHkuZG9jbGl0d3JhcHBlZCIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5wcm94eS5kb2NsaXR3cmFwcGVkLlR3b1dheUhvbGRlciIpCi0gICAgQFJlc3BvbnNlV3JhcHBlcihsb2NhbE5hbWUgPSAidHdvV2F5SG9sZGVyIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcuYXBhY2hlLmF4aXMyLnByb3h5LmRvY2xpdHdyYXBwZWQiLCBjbGFzc05hbWUgPSAib3JnLnRlc3QucHJveHkuZG9jbGl0d3JhcHBlZC5Ud29XYXlIb2xkZXIiKQotICAgIHB1YmxpYyBGdXR1cmU8Pz4gdHdvV2F5SG9sZGVyQXN5bmMoCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gInR3b1dheUhvbGRlcl9zdHIiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikKLSAgICAgICAgU3RyaW5nIHR3b1dheUhvbGRlclN0ciwKLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAidHdvV2F5SG9sZGVyX2ludCIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQotICAgICAgICBpbnQgdHdvV2F5SG9sZGVySW50LAotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJhc3luY0hhbmRsZXIiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikKLSAgICAgICAgQXN5bmNIYW5kbGVyPFR3b1dheUhvbGRlcj4gYXN5bmNIYW5kbGVyKTsKLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEBwYXJhbSB0d29XYXlIb2xkZXJJbnQKLSAgICAgKiBAcGFyYW0gdHdvV2F5SG9sZGVyU3RyCi0gICAgICovCi0gICAgQFdlYk1ldGhvZChhY3Rpb24gPSAiaHR0cDovL29yZy5hcGFjaGUuYXhpczIucHJveHkuZG9jbGl0d3JhcHBlZC90d29XYXlSZXR1cm4iKQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAidHdvV2F5SG9sZGVyIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcuYXBhY2hlLmF4aXMyLnByb3h5LmRvY2xpdHdyYXBwZWQiLCBjbGFzc05hbWUgPSAib3JnLnRlc3QucHJveHkuZG9jbGl0d3JhcHBlZC5Ud29XYXlIb2xkZXIiKQotICAgIEBSZXNwb25zZVdyYXBwZXIobG9jYWxOYW1lID0gInR3b1dheUhvbGRlciIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnLmFwYWNoZS5heGlzMi5wcm94eS5kb2NsaXR3cmFwcGVkIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LnByb3h5LmRvY2xpdHdyYXBwZWQuVHdvV2F5SG9sZGVyIikKLSAgICBwdWJsaWMgdm9pZCB0d29XYXlIb2xkZXIoCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gInR3b1dheUhvbGRlcl9zdHIiLCB0YXJnZXROYW1lc3BhY2UgPSAiIiwgbW9kZSA9IE1vZGUuSU5PVVQpCi0gICAgICAgIEhvbGRlcjxTdHJpbmc+IHR3b1dheUhvbGRlclN0ciwKLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAidHdvV2F5SG9sZGVyX2ludCIsIHRhcmdldE5hbWVzcGFjZSA9ICIiLCBtb2RlID0gTW9kZS5JTk9VVCkKLSAgICAgICAgSG9sZGVyPEludGVnZXI+IHR3b1dheUhvbGRlckludCk7Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdHdvd2F5U3RyCi0gICAgICogQHJldHVybgotICAgICAqICAgICByZXR1cm5zIGphdmF4LnhtbC53cy5SZXNwb25zZTxvcmcuYXBhY2hlLmF4aXMyLnByb3h5LmRvY2xpdHdyYXBwZWQuc2VpLlJldHVyblR5cGU+Ci0gICAgICovCi0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lID0gInR3b1dheSIsIGFjdGlvbiA9ICJodHRwOi8vb3JnLmFwYWNoZS5heGlzMi5wcm94eS5kb2NsaXR3cmFwcGVkL3R3b1dheVJldHVybiIpCi0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJ0d29XYXkiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy5hcGFjaGUuYXhpczIucHJveHkuZG9jbGl0d3JhcHBlZCIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5wcm94eS5kb2NsaXR3cmFwcGVkLlR3b1dheSIpCi0gICAgQFJlc3BvbnNlV3JhcHBlcihsb2NhbE5hbWUgPSAiUmV0dXJuVHlwZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnLmFwYWNoZS5heGlzMi5wcm94eS5kb2NsaXR3cmFwcGVkIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LnByb3h5LmRvY2xpdHdyYXBwZWQuc2VpLlJldHVyblR5cGUiKQotICAgIHB1YmxpYyBSZXNwb25zZTxSZXR1cm5UeXBlPiB0d29XYXlBc3luYygKLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAidHdvd2F5X3N0ciIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQotICAgICAgICBTdHJpbmcgdHdvd2F5U3RyKTsKLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEBwYXJhbSB0d293YXlTdHIKLSAgICAgKiBAcGFyYW0gYXN5bmNIYW5kbGVyCi0gICAgICogQHJldHVybgotICAgICAqICAgICByZXR1cm5zIGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTw/IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdD4KLSAgICAgKi8KLSAgICBAV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWUgPSAidHdvV2F5IiwgYWN0aW9uID0gImh0dHA6Ly9vcmcuYXBhY2hlLmF4aXMyLnByb3h5LmRvY2xpdHdyYXBwZWQvdHdvV2F5UmV0dXJuIikKLSAgICBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gInR3b1dheSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnLmFwYWNoZS5heGlzMi5wcm94eS5kb2NsaXR3cmFwcGVkIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LnByb3h5LmRvY2xpdHdyYXBwZWQuVHdvV2F5IikKLSAgICBAUmVzcG9uc2VXcmFwcGVyKGxvY2FsTmFtZSA9ICJSZXR1cm5UeXBlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcuYXBhY2hlLmF4aXMyLnByb3h5LmRvY2xpdHdyYXBwZWQiLCBjbGFzc05hbWUgPSAib3JnLnRlc3QucHJveHkuZG9jbGl0d3JhcHBlZC5SZXR1cm5UeXBlIikKLSAgICBwdWJsaWMgRnV0dXJlPD8+IHR3b1dheUFzeW5jKAotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJ0d293YXlfc3RyIiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpCi0gICAgICAgIFN0cmluZyB0d293YXlTdHIsCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImFzeW5jSGFuZGxlciIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQotICAgICAgICBBc3luY0hhbmRsZXI8UmV0dXJuVHlwZT4gYXN5bmNIYW5kbGVyKTsKLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEBwYXJhbSB0d293YXlTdHIKLSAgICAgKiBAcmV0dXJuCi0gICAgICogICAgIHJldHVybnMgamF2YS5sYW5nLlN0cmluZwotICAgICAqLwotICAgIEBXZWJNZXRob2QoYWN0aW9uID0gImh0dHA6Ly9vcmcuYXBhY2hlLmF4aXMyLnByb3h5LmRvY2xpdHdyYXBwZWQvdHdvV2F5UmV0dXJuIikKLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAicmV0dXJuX3N0ciIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAidHdvV2F5IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcuYXBhY2hlLmF4aXMyLnByb3h5LmRvY2xpdHdyYXBwZWQiLCBjbGFzc05hbWUgPSAib3JnLnRlc3QucHJveHkuZG9jbGl0d3JhcHBlZC5Ud29XYXkiKQotICAgIEBSZXNwb25zZVdyYXBwZXIobG9jYWxOYW1lID0gIlJldHVyblR5cGUiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy5hcGFjaGUuYXhpczIucHJveHkuZG9jbGl0d3JhcHBlZCIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5wcm94eS5kb2NsaXR3cmFwcGVkLlJldHVyblR5cGUiKQotICAgIHB1YmxpYyBTdHJpbmcgdHdvV2F5KAotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJ0d293YXlfc3RyIiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpCi0gICAgICAgIFN0cmluZyB0d293YXlTdHIpOwotCi0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW52b2tlU3RyCi0gICAgICogQHJldHVybgotICAgICAqICAgICByZXR1cm5zIGphdmF4LnhtbC53cy5SZXNwb25zZTxvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnByb3h5LmRvY2xpdHdyYXBwZWQuc2VpLlJldHVyblR5cGU+Ci0gICAgICovCi0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lID0gImludm9rZSIsIGFjdGlvbiA9ICJodHRwOi8vb3JnLmFwYWNoZS5heGlzMi5wcm94eS5kb2NsaXR3cmFwcGVkL3R3b1dheVJldHVybiIpCi0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJpbnZva2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy5hcGFjaGUuYXhpczIucHJveHkuZG9jbGl0d3JhcHBlZCIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5wcm94eS5kb2NsaXR3cmFwcGVkLkludm9rZSIpCi0gICAgQFJlc3BvbnNlV3JhcHBlcihsb2NhbE5hbWUgPSAiUmV0dXJuVHlwZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnLmFwYWNoZS5heGlzMi5wcm94eS5kb2NsaXR3cmFwcGVkIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LnByb3h5LmRvY2xpdHdyYXBwZWQuUmV0dXJuVHlwZSIpCi0gICAgcHVibGljIFJlc3BvbnNlPFJldHVyblR5cGU+IGludm9rZUFzeW5jKAotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJpbnZva2Vfc3RyIiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpCi0gICAgICAgIFN0cmluZyBpbnZva2VTdHIpOwotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHBhcmFtIGludm9rZVN0cgotICAgICAqIEBwYXJhbSBhc3luY0hhbmRsZXIKLSAgICAgKiBAcmV0dXJuCi0gICAgICogICAgIHJldHVybnMgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlPD8gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0PgotICAgICAqLwotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJpbnZva2UiLCBhY3Rpb24gPSAiaHR0cDovL29yZy5hcGFjaGUuYXhpczIucHJveHkuZG9jbGl0d3JhcHBlZC90d29XYXlSZXR1cm4iKQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAiaW52b2tlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcuYXBhY2hlLmF4aXMyLnByb3h5LmRvY2xpdHdyYXBwZWQiLCBjbGFzc05hbWUgPSAib3JnLnRlc3QucHJveHkuZG9jbGl0d3JhcHBlZC5JbnZva2UiKQotICAgIEBSZXNwb25zZVdyYXBwZXIobG9jYWxOYW1lID0gIlJldHVyblR5cGUiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy5hcGFjaGUuYXhpczIucHJveHkuZG9jbGl0d3JhcHBlZCIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5wcm94eS5kb2NsaXR3cmFwcGVkLlJldHVyblR5cGUiKQotICAgIHB1YmxpYyBGdXR1cmU8Pz4gaW52b2tlQXN5bmMoCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImludm9rZV9zdHIiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikKLSAgICAgICAgU3RyaW5nIGludm9rZVN0ciwKLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiYXN5bmNIYW5kbGVyIiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpCi0gICAgICAgIEFzeW5jSGFuZGxlcjxSZXR1cm5UeXBlPiBhc3luY0hhbmRsZXIpOwotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHBhcmFtIGludm9rZVN0cgotICAgICAqIEByZXR1cm4KLSAgICAgKiAgICAgcmV0dXJucyBqYXZhLmxhbmcuU3RyaW5nCi0gICAgICovCi0gICAgQFdlYk1ldGhvZChhY3Rpb24gPSAiaHR0cDovL29yZy5hcGFjaGUuYXhpczIucHJveHkuZG9jbGl0d3JhcHBlZC90d29XYXlSZXR1cm4iKQotICAgIEBXZWJSZXN1bHQobmFtZSA9ICJyZXR1cm5fc3RyIiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpCi0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJpbnZva2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy5hcGFjaGUuYXhpczIucHJveHkuZG9jbGl0d3JhcHBlZCIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5wcm94eS5kb2NsaXR3cmFwcGVkLkludm9rZSIpCi0gICAgQFJlc3BvbnNlV3JhcHBlcihsb2NhbE5hbWUgPSAiUmV0dXJuVHlwZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnLmFwYWNoZS5heGlzMi5wcm94eS5kb2NsaXR3cmFwcGVkIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LnByb3h5LmRvY2xpdHdyYXBwZWQuUmV0dXJuVHlwZSIpCi0gICAgcHVibGljIFN0cmluZyBpbnZva2UoCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImludm9rZV9zdHIiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikKLSAgICAgICAgU3RyaW5nIGludm9rZVN0cik7Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gb3AKLSAgICAgKiBAcmV0dXJuCi0gICAgICogICAgIHJldHVybnMgamF2YXgueG1sLndzLlJlc3BvbnNlPG9yZy5hcGFjaGUuYXhpczIucHJveHkuZG9jbGl0d3JhcHBlZC5zZWkuRmluT3BSZXNwb25zZT4KLSAgICAgKi8KLSAgICBAV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWUgPSAiZmluT3AiLCBhY3Rpb24gPSAiaHR0cDovL29yZy5hcGFjaGUuYXhpczIucHJveHkuZG9jbGl0d3JhcHBlZC9maW5PcCIpCi0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJmaW5PcCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnLmFwYWNoZS5heGlzMi5wcm94eS5kb2NsaXR3cmFwcGVkIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LnByb3h5LmRvY2xpdHdyYXBwZWQuRmluT3AiKQotICAgIEBSZXNwb25zZVdyYXBwZXIobG9jYWxOYW1lID0gImZpbk9wUmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy5hcGFjaGUuYXhpczIucHJveHkuZG9jbGl0d3JhcHBlZCIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5wcm94eS5kb2NsaXR3cmFwcGVkLkZpbk9wUmVzcG9uc2UiKQotICAgIHB1YmxpYyBSZXNwb25zZTxGaW5PcFJlc3BvbnNlPiBmaW5PcEFzeW5jKAotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJvcCIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQotICAgICAgICBGaW5hbmNpYWxPcGVyYXRpb24gb3ApOwotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHBhcmFtIG9wCi0gICAgICogQHBhcmFtIGFzeW5jSGFuZGxlcgotICAgICAqIEByZXR1cm4KLSAgICAgKiAgICAgcmV0dXJucyBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU8PyBleHRlbmRzIGphdmEubGFuZy5PYmplY3Q+Ci0gICAgICovCi0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lID0gImZpbk9wIiwgYWN0aW9uID0gImh0dHA6Ly9vcmcuYXBhY2hlLmF4aXMyLnByb3h5LmRvY2xpdHdyYXBwZWQvZmluT3AiKQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAiZmluT3AiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy5hcGFjaGUuYXhpczIucHJveHkuZG9jbGl0d3JhcHBlZCIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5wcm94eS5kb2NsaXR3cmFwcGVkLkZpbk9wIikKLSAgICBAUmVzcG9uc2VXcmFwcGVyKGxvY2FsTmFtZSA9ICJmaW5PcFJlc3BvbnNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcuYXBhY2hlLmF4aXMyLnByb3h5LmRvY2xpdHdyYXBwZWQiLCBjbGFzc05hbWUgPSAib3JnLnRlc3QucHJveHkuZG9jbGl0d3JhcHBlZC5GaW5PcFJlc3BvbnNlIikKLSAgICBwdWJsaWMgRnV0dXJlPD8+IGZpbk9wQXN5bmMoCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gIm9wIiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpCi0gICAgICAgIEZpbmFuY2lhbE9wZXJhdGlvbiBvcCwKLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiYXN5bmNIYW5kbGVyIiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpCi0gICAgICAgIEFzeW5jSGFuZGxlcjxGaW5PcFJlc3BvbnNlPiBhc3luY0hhbmRsZXIpOwotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHBhcmFtIG9wCi0gICAgICogQHJldHVybgotICAgICAqICAgICByZXR1cm5zIG9yZy5hcGFjaGUuYXhpczIucHJveHkuZG9jbGl0d3JhcHBlZC5zZWkuRmluYW5jaWFsT3BlcmF0aW9uCi0gICAgICovCi0gICAgQFdlYk1ldGhvZChhY3Rpb24gPSAiaHR0cDovL29yZy5hcGFjaGUuYXhpczIucHJveHkuZG9jbGl0d3JhcHBlZC9maW5PcCIpCi0gICAgQFdlYlJlc3VsdChuYW1lID0gInJlc3BvbnNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpCi0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJmaW5PcCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnLmFwYWNoZS5heGlzMi5wcm94eS5kb2NsaXR3cmFwcGVkIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LnByb3h5LmRvY2xpdHdyYXBwZWQuRmluT3AiKQotICAgIEBSZXNwb25zZVdyYXBwZXIobG9jYWxOYW1lID0gImZpbk9wUmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy5hcGFjaGUuYXhpczIucHJveHkuZG9jbGl0d3JhcHBlZCIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5wcm94eS5kb2NsaXR3cmFwcGVkLkZpbk9wUmVzcG9uc2UiKQotICAgIHB1YmxpYyBGaW5hbmNpYWxPcGVyYXRpb24gZmluT3AoCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gIm9wIiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpCi0gICAgICAgIEZpbmFuY2lhbE9wZXJhdGlvbiBvcCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9HZXREZXNjRnJvbUJpbmRpbmdQcm92aWRlclRlc3RzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vR2V0RGVzY0Zyb21CaW5kaW5nUHJvdmlkZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTMyMWIwLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9HZXREZXNjRnJvbUJpbmRpbmdQcm92aWRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zcGkuQmluZGluZ1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc3BpLlNlcnZpY2VEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnVuaXRUZXN0LmVjaG8uRWNob1BvcnQ7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC53cy5EaXNwYXRjaDsKLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Qcm94eTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLS8qKgotICogVGVzdCB0aGF0IHRoZSBFbmRwb2ludERlc2NyaXB0aW9uIGNhbiBiZSBnb3R0ZW4gZnJvbQotICogdGhlIEJpbmRpbmcgUHJvdmlkZXIgaW1wbCBjbGFzcyBhbmQgdGhhdCB0aGUgQXhpc1NlcnZpY2UgY2FuIGJlIAotICogZ290dGVuIGZyb20gdGhlIEVuZHBvaW50RGVzYy4gIE5vdGUgdGhhdCB0aGUgQmluZGluZ1Byb3ZpZGVyIGNsYXNzIGlzIE5PVAotICogdGhlIGpheHdzIEFQSSBvbmU7IGl0IGlzIHRoZSBpbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBCaW5kaW5nUHJvdmlkZXIgY2xhc3MuCi0gKi8KLXB1YmxpYyBjbGFzcyBHZXREZXNjRnJvbUJpbmRpbmdQcm92aWRlclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyB3c2RsU09BUEFkZHJlc3MgPSAiaHR0cDovL2xvY2FsaG9zdDo2MDYwL2F4aXMyL3NlcnZpY2VzL0VjaG9TZXJ2aWNlIjsKLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Rm9yUHJveHkoKSB7Ci0gICAgICAgIFN0cmluZyBuYW1lc3BhY2VVUkkgPSAiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvdGVzdHMiOwotICAgICAgICBTdHJpbmcgbG9jYWxQYXJ0ID0gIkVjaG9TZXJ2aWNlIjsKLQotICAgICAgICBVUkwgd3NkbFVSTCA9IERlc2NyaXB0aW9uVGVzdFV0aWxzMi5nZXRXU0RMVVJMKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwod3NkbFVSTCk7Ci0gICAgICAgIAotICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSBTZXJ2aWNlLmNyZWF0ZSh3c2RsVVJMLCBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBsb2NhbFBhcnQpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlKTsKLSAgICAgICAgCi0gICAgICAgIFFOYW1lIHZhbGlkUG9ydFFOYW1lID0gbmV3IFFOYW1lKG5hbWVzcGFjZVVSSSwgIkVjaG9Qb3J0Iik7Ci0gICAgICAgIEVjaG9Qb3J0IGVjaG9Qb3J0ID0gc2VydmljZS5nZXRQb3J0KHZhbGlkUG9ydFFOYW1lLCBFY2hvUG9ydC5jbGFzcyk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZWNob1BvcnQpOwotICAgICAgICAKLSAgICAgICAgQmluZGluZ1Byb3ZpZGVyIGJpbmRpbmdQcm92aWRlciA9IChCaW5kaW5nUHJvdmlkZXIpUHJveHkuZ2V0SW52b2NhdGlvbkhhbmRsZXIoZWNob1BvcnQpOwotICAgICAgICBTZXJ2aWNlRGVsZWdhdGUgc2VydmljZURlbGVnYXRlID0gYmluZGluZ1Byb3ZpZGVyLmdldFNlcnZpY2VEZWxlZ2F0ZSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2VEZWxlZ2F0ZSk7Ci0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZW5kcG9pbnREZXNjID0gYmluZGluZ1Byb3ZpZGVyLmdldEVuZHBvaW50RGVzY3JpcHRpb24oKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChlbmRwb2ludERlc2MpOwotICAgICAgICBBeGlzU2VydmljZSBheGlzU2VydmljZSA9IGVuZHBvaW50RGVzYy5nZXRBeGlzU2VydmljZSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGF4aXNTZXJ2aWNlKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFRoZSBlbmRwb2ludCBhZGRyZXNzIHNob3VsZCBtYXRjaCB3aGF0IGlzIGluIHRoZSBXU0RMCi0gICAgICAgIFN0cmluZyBlbmRwb2ludEFkZHJlc3MgPSBlbmRwb2ludERlc2MuZ2V0RW5kcG9pbnRBZGRyZXNzKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyh3c2RsU09BUEFkZHJlc3MsIGVuZHBvaW50QWRkcmVzcyk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RGb3JEaXNwYXRjaCgpIHsKLSAgICAgICAgU3RyaW5nIG5hbWVzcGFjZVVSSSA9ICJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi90ZXN0cyI7Ci0gICAgICAgIFN0cmluZyBsb2NhbFBhcnQgPSAiRWNob1NlcnZpY2UiOwotCi0gICAgICAgIFVSTCB3c2RsVVJMID0gRGVzY3JpcHRpb25UZXN0VXRpbHMyLmdldFdTRExVUkwoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh3c2RsVVJMKTsKLSAgICAgICAgCi0gICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IFNlcnZpY2UuY3JlYXRlKHdzZGxVUkwsIG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIGxvY2FsUGFydCkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2UpOwotICAgICAgICAKLSAgICAgICAgUU5hbWUgdmFsaWRQb3J0UU5hbWUgPSBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCAiRWNob1BvcnQiKTsKLSAgICAgICAgRGlzcGF0Y2g8U3RyaW5nPiBkaXNwYXRjaCA9IHNlcnZpY2UuY3JlYXRlRGlzcGF0Y2godmFsaWRQb3J0UU5hbWUsIFN0cmluZy5jbGFzcywgbnVsbCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZGlzcGF0Y2gpOwotICAgICAgICAKLSAgICAgICAgQmluZGluZ1Byb3ZpZGVyIGJpbmRpbmdQcm92aWRlciA9IChCaW5kaW5nUHJvdmlkZXIpIGRpc3BhdGNoOwotICAgICAgICBTZXJ2aWNlRGVsZWdhdGUgc2VydmljZURlbGVnYXRlID0gYmluZGluZ1Byb3ZpZGVyLmdldFNlcnZpY2VEZWxlZ2F0ZSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2VEZWxlZ2F0ZSk7Ci0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZW5kcG9pbnREZXNjID0gYmluZGluZ1Byb3ZpZGVyLmdldEVuZHBvaW50RGVzY3JpcHRpb24oKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChlbmRwb2ludERlc2MpOwotICAgICAgICBBeGlzU2VydmljZSBheGlzU2VydmljZSA9IGVuZHBvaW50RGVzYy5nZXRBeGlzU2VydmljZSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGF4aXNTZXJ2aWNlKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFRoZSBlbmRwb2ludCBhZGRyZXNzIHNob3VsZCBtYXRjaCB3aGF0IGlzIGluIHRoZSBXU0RMCi0gICAgICAgIFN0cmluZyBlbmRwb2ludEFkZHJlc3MgPSBlbmRwb2ludERlc2MuZ2V0RW5kcG9pbnRBZGRyZXNzKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyh3c2RsU09BUEFkZHJlc3MsIGVuZHBvaW50QWRkcmVzcyk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RGb3JBZGRQb3J0KCkgewotICAgICAgICBTdHJpbmcgbmFtZXNwYWNlVVJJID0gImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL3Rlc3RzIjsKLSAgICAgICAgU3RyaW5nIGxvY2FsUGFydCA9ICJFY2hvU2VydmljZSI7Ci0KLSAgICAgICAgVVJMIHdzZGxVUkwgPSBEZXNjcmlwdGlvblRlc3RVdGlsczIuZ2V0V1NETFVSTCgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHdzZGxVUkwpOwotICAgICAgICAKLSAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gU2VydmljZS5jcmVhdGUod3NkbFVSTCwgbmV3IFFOYW1lKG5hbWVzcGFjZVVSSSwgbG9jYWxQYXJ0KSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZSk7Ci0gICAgICAgIAotICAgICAgICBRTmFtZSB2YWxpZFBvcnRRTmFtZSA9IG5ldyBRTmFtZShuYW1lc3BhY2VVUkksICJFY2hvUG9ydEFkZGVkIik7Ci0gICAgICAgIHNlcnZpY2UuYWRkUG9ydCh2YWxpZFBvcnRRTmFtZSwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIERpc3BhdGNoPFN0cmluZz4gZGlzcGF0Y2ggPSBzZXJ2aWNlLmNyZWF0ZURpc3BhdGNoKHZhbGlkUG9ydFFOYW1lLCBTdHJpbmcuY2xhc3MsIG51bGwpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGRpc3BhdGNoKTsKLSAgICAgICAgCi0gICAgICAgIEJpbmRpbmdQcm92aWRlciBiaW5kaW5nUHJvdmlkZXIgPSAoQmluZGluZ1Byb3ZpZGVyKSBkaXNwYXRjaDsKLSAgICAgICAgU2VydmljZURlbGVnYXRlIHNlcnZpY2VEZWxlZ2F0ZSA9IGJpbmRpbmdQcm92aWRlci5nZXRTZXJ2aWNlRGVsZWdhdGUoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlRGVsZWdhdGUpOwotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVuZHBvaW50RGVzYyA9IGJpbmRpbmdQcm92aWRlci5nZXRFbmRwb2ludERlc2NyaXB0aW9uKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZW5kcG9pbnREZXNjKTsKLSAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UgPSBlbmRwb2ludERlc2MuZ2V0QXhpc1NlcnZpY2UoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChheGlzU2VydmljZSk7Ci0gICAgICAgIC8vIFRoZSBlbmRwb2ludCBhZGRyZXNzIHNob3VsZCBiZSBudWxsIHNpbmNlIGl0IHdhc24ndCBzcGVjaWZpZWQgb24gdGhlIGFkZFBvcnQKLSAgICAgICAgU3RyaW5nIGVuZHBvaW50QWRkcmVzcyA9IGVuZHBvaW50RGVzYy5nZXRFbmRwb2ludEFkZHJlc3MoKTsKLSAgICAgICAgYXNzZXJ0TnVsbChlbmRwb2ludEFkZHJlc3MpOwotICAgICAgICAKLSAgICAgICAgUU5hbWUgdmFsaWRQb3J0UU5hbWUyID0gbmV3IFFOYW1lKG5hbWVzcGFjZVVSSSwgIkVjaG9Qb3J0QWRkZWQyIik7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBwb3J0MkVuZHBvaW50QWRkcmVzcyA9ICJodHRwOi8vdGVzdEFkZHJlc3M6NjA2MC9teS90ZXN0L2FkZHJlc3MiOyAKLSAgICAgICAgc2VydmljZS5hZGRQb3J0KHZhbGlkUG9ydFFOYW1lMiwgbnVsbCwgcG9ydDJFbmRwb2ludEFkZHJlc3MpOwotICAgICAgICBkaXNwYXRjaCA9IHNlcnZpY2UuY3JlYXRlRGlzcGF0Y2godmFsaWRQb3J0UU5hbWUyLCBTdHJpbmcuY2xhc3MsIG51bGwpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGRpc3BhdGNoKTsKLSAgICAgICAgYmluZGluZ1Byb3ZpZGVyID0gKEJpbmRpbmdQcm92aWRlcikgZGlzcGF0Y2g7Ci0gICAgICAgIGVuZHBvaW50RGVzYyA9IGJpbmRpbmdQcm92aWRlci5nZXRFbmRwb2ludERlc2NyaXB0aW9uKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZW5kcG9pbnREZXNjKTsKLSAgICAgICAgLy8gVGhlIGVuZHBvaW50IGFkZHJlc3Mgc2hvdWxkIGJlIGFzIHNldCBvbiB0aGUgYWRkUG9ydCBhYm92ZS4KLSAgICAgICAgZW5kcG9pbnRBZGRyZXNzID0gZW5kcG9pbnREZXNjLmdldEVuZHBvaW50QWRkcmVzcygpOwotICAgICAgICBhc3NlcnRFcXVhbHMocG9ydDJFbmRwb2ludEFkZHJlc3MsIGVuZHBvaW50QWRkcmVzcyk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RGb3JQcm94eU5vV1NETCgpIHsKLSAgICAgICAgU3RyaW5nIG5hbWVzcGFjZVVSSSA9ICJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi90ZXN0cyI7Ci0gICAgICAgIFN0cmluZyBsb2NhbFBhcnQgPSAiRWNob1NlcnZpY2UiOwotCi0gICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IFNlcnZpY2UuY3JlYXRlKG51bGwsIG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIGxvY2FsUGFydCkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2UpOwotICAgICAgICAKLSAgICAgICAgUU5hbWUgdmFsaWRQb3J0UU5hbWUgPSBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCAiRWNob1BvcnQiKTsKLSAgICAgICAgRWNob1BvcnQgZWNob1BvcnQgPSBzZXJ2aWNlLmdldFBvcnQodmFsaWRQb3J0UU5hbWUsIEVjaG9Qb3J0LmNsYXNzKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChlY2hvUG9ydCk7Ci0gICAgICAgIAotICAgICAgICBCaW5kaW5nUHJvdmlkZXIgYmluZGluZ1Byb3ZpZGVyID0gKEJpbmRpbmdQcm92aWRlcilQcm94eS5nZXRJbnZvY2F0aW9uSGFuZGxlcihlY2hvUG9ydCk7Ci0gICAgICAgIFNlcnZpY2VEZWxlZ2F0ZSBzZXJ2aWNlRGVsZWdhdGUgPSBiaW5kaW5nUHJvdmlkZXIuZ2V0U2VydmljZURlbGVnYXRlKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZURlbGVnYXRlKTsKLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlbmRwb2ludERlc2MgPSBiaW5kaW5nUHJvdmlkZXIuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbigpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGVuZHBvaW50RGVzYyk7Ci0gICAgICAgIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlID0gZW5kcG9pbnREZXNjLmdldEF4aXNTZXJ2aWNlKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoYXhpc1NlcnZpY2UpOwotICAgICAgICAvLyBUaGUgZW5kcG9pbnQgYWRkcmVzcyBzaG91bGQgYmUgbnVsbCBzaW5jZSB0aGVyZSB3YXMgbm8gV1NETCBhbmQgaXQgaGFzbid0IGJlZW4gc2V0IHlldAotICAgICAgICBTdHJpbmcgZW5kcG9pbnRBZGRyZXNzID0gZW5kcG9pbnREZXNjLmdldEVuZHBvaW50QWRkcmVzcygpOwotICAgICAgICBhc3NlcnROdWxsKGVuZHBvaW50QWRkcmVzcyk7Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIHRlc3RGb3JEaXNwYXRjaE5vV1NETCgpIHsKLSAgICAgICAgU3RyaW5nIG5hbWVzcGFjZVVSSSA9ICJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi90ZXN0cyI7Ci0gICAgICAgIFN0cmluZyBsb2NhbFBhcnQgPSAiRWNob1NlcnZpY2UiOwotCi0gICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IFNlcnZpY2UuY3JlYXRlKG51bGwsIG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIGxvY2FsUGFydCkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2UpOwotICAgICAgICAKLSAgICAgICAgUU5hbWUgdmFsaWRQb3J0UU5hbWUgPSBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCAiRWNob1BvcnQiKTsKLSAgICAgICAgRWNob1BvcnQgZWNob1BvcnQgPSBzZXJ2aWNlLmdldFBvcnQodmFsaWRQb3J0UU5hbWUsIEVjaG9Qb3J0LmNsYXNzKTsKLSAgICAgICAgRGlzcGF0Y2g8U3RyaW5nPiBkaXNwYXRjaCA9IHNlcnZpY2UuY3JlYXRlRGlzcGF0Y2godmFsaWRQb3J0UU5hbWUsIFN0cmluZy5jbGFzcywgbnVsbCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZGlzcGF0Y2gpOwotICAgICAgICAKLSAgICAgICAgQmluZGluZ1Byb3ZpZGVyIGJpbmRpbmdQcm92aWRlciA9IChCaW5kaW5nUHJvdmlkZXIpIGRpc3BhdGNoOwotICAgICAgICBTZXJ2aWNlRGVsZWdhdGUgc2VydmljZURlbGVnYXRlID0gYmluZGluZ1Byb3ZpZGVyLmdldFNlcnZpY2VEZWxlZ2F0ZSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2VEZWxlZ2F0ZSk7Ci0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZW5kcG9pbnREZXNjID0gYmluZGluZ1Byb3ZpZGVyLmdldEVuZHBvaW50RGVzY3JpcHRpb24oKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChlbmRwb2ludERlc2MpOwotICAgICAgICBBeGlzU2VydmljZSBheGlzU2VydmljZSA9IGVuZHBvaW50RGVzYy5nZXRBeGlzU2VydmljZSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGF4aXNTZXJ2aWNlKTsKLSAgICB9Ci0gICAgcHVibGljIHZvaWQgdGVzdEZvckFkZFBvcnROb1dTREwoKSB7Ci0gICAgICAgIFN0cmluZyBuYW1lc3BhY2VVUkkgPSAiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvdGVzdHMiOwotICAgICAgICBTdHJpbmcgbG9jYWxQYXJ0ID0gIkVjaG9TZXJ2aWNlIjsKLQotICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSBTZXJ2aWNlLmNyZWF0ZShudWxsLCBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBsb2NhbFBhcnQpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlKTsKLSAgICAgICAgCi0gICAgICAgIFFOYW1lIHZhbGlkUG9ydFFOYW1lID0gbmV3IFFOYW1lKG5hbWVzcGFjZVVSSSwgIkVjaG9Qb3J0QWRkZWQiKTsKLSAgICAgICAgc2VydmljZS5hZGRQb3J0KHZhbGlkUG9ydFFOYW1lLCBudWxsLCBudWxsKTsKLSAgICAgICAgRGlzcGF0Y2g8U3RyaW5nPiBkaXNwYXRjaCA9IHNlcnZpY2UuY3JlYXRlRGlzcGF0Y2godmFsaWRQb3J0UU5hbWUsIFN0cmluZy5jbGFzcywgbnVsbCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZGlzcGF0Y2gpOwotICAgICAgICAKLSAgICAgICAgQmluZGluZ1Byb3ZpZGVyIGJpbmRpbmdQcm92aWRlciA9IChCaW5kaW5nUHJvdmlkZXIpIGRpc3BhdGNoOwotICAgICAgICBTZXJ2aWNlRGVsZWdhdGUgc2VydmljZURlbGVnYXRlID0gYmluZGluZ1Byb3ZpZGVyLmdldFNlcnZpY2VEZWxlZ2F0ZSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2VEZWxlZ2F0ZSk7Ci0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZW5kcG9pbnREZXNjID0gYmluZGluZ1Byb3ZpZGVyLmdldEVuZHBvaW50RGVzY3JpcHRpb24oKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChlbmRwb2ludERlc2MpOwotICAgICAgICBBeGlzU2VydmljZSBheGlzU2VydmljZSA9IGVuZHBvaW50RGVzYy5nZXRBeGlzU2VydmljZSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGF4aXNTZXJ2aWNlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vUG9ydFNlbGVjdGlvblRlc3RzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vUG9ydFNlbGVjdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmYTVlNWYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL1BvcnRTZWxlY3Rpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uc2FtcGxlLmFkZG51bWJlcnMuQWRkTnVtYmVyc1BvcnRUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc3BpLkJpbmRpbmdQcm92aWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNwaS5TZXJ2aWNlRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51bml0VGVzdC5lY2hvLkVjaG9Qb3J0OwotCi1pbXBvcnQgamF2YXgud3NkbC5Qb3J0OwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuUHJveHk7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBQb3J0U2VsZWN0aW9uVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFZBTElEX1NFUlZJQ0VfTkFNRVNQQUNFID0gImh0dHA6Ly9vcmcvdGVzdC9hZGRudW1iZXJzIjsKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgVkFMSURfU0VSVklDRV9MT0NBTFBBUlRfMyA9ICJBZGROdW1iZXJzU2VydmljZTMiOwotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJ2aWNlRGVzY1BvcnRTZWxlY3Rpb25NZXRob2RzKCkgewotICAgICAgICBVUkwgd3NkbFVSTCA9IERlc2NyaXB0aW9uVGVzdFV0aWxzMi5nZXRXU0RMVVJMKCJXU0RMTXVsdGlUZXN0cy53c2RsIik7Ci0KLSAgICAgICAgUU5hbWUgc2VydmljZVFOID0gbmV3IFFOYW1lKFZBTElEX1NFUlZJQ0VfTkFNRVNQQUNFLCBWQUxJRF9TRVJWSUNFX0xPQ0FMUEFSVF8zKTsKLSAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gU2VydmljZS5jcmVhdGUod3NkbFVSTCwgc2VydmljZVFOKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlKTsKLSAgICAgICAgU2VydmljZURlbGVnYXRlIHNlcnZpY2VEZWxlZ2F0ZSA9IERlc2NyaXB0aW9uVGVzdFV0aWxzMi5nZXRTZXJ2aWNlRGVsZWdhdGUoc2VydmljZSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZURlbGVnYXRlKTsKLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNlcnZpY2VEZXNjID0gc2VydmljZURlbGVnYXRlLmdldFNlcnZpY2VEZXNjcmlwdGlvbigpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2VEZXNjKTsKLSAgICAgICAgCi0gICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbldTREwgc2VydmljZURlc2NXU0RMID0gKFNlcnZpY2VEZXNjcmlwdGlvbldTREwpIHNlcnZpY2VEZXNjOwotICAgICAgICAKLSAgICAgICAgTWFwIGFsbFBvcnRzID0gc2VydmljZURlc2NXU0RMLmdldFdTRExQb3J0cygpOwotICAgICAgICBhc3NlcnRFcXVhbHMoNCwgYWxsUG9ydHMuc2l6ZSgpKTsKLSAgICAgICAgCi0gICAgICAgIFFOYW1lIHBvcnRUeXBlUU5hbWUgPSBuZXcgUU5hbWUoVkFMSURfU0VSVklDRV9OQU1FU1BBQ0UsICJBZGROdW1iZXJzUG9ydFR5cGUiKTsgCi0gICAgICAgIExpc3Q8UG9ydD4gcG9ydHNVc2luZ1BvcnRUeXBlID0gc2VydmljZURlc2NXU0RMLmdldFdTRExQb3J0c1VzaW5nUG9ydFR5cGUocG9ydFR5cGVRTmFtZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygzLCBwb3J0c1VzaW5nUG9ydFR5cGUuc2l6ZSgpKTsKLQotICAgICAgICBRTmFtZSBvdGhlclBvcnRUeXBlUU5hbWUgPSBuZXcgUU5hbWUoVkFMSURfU0VSVklDRV9OQU1FU1BBQ0UsICJBZGROdW1iZXJzUG9ydFR5cGVPdGhlclBUIik7IAotICAgICAgICBMaXN0PFBvcnQ+IHBvcnRzVXNpbmdPdGhlclBvcnRUeXBlID0gc2VydmljZURlc2NXU0RMLmdldFdTRExQb3J0c1VzaW5nUG9ydFR5cGUob3RoZXJQb3J0VHlwZVFOYW1lKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHBvcnRzVXNpbmdPdGhlclBvcnRUeXBlLnNpemUoKSk7Ci0KLSAgICAgICAgTGlzdDxQb3J0PiBwb3J0c1VzaW5nU09BUEFkZHJlc3MgPSBzZXJ2aWNlRGVzY1dTREwuZ2V0V1NETFBvcnRzVXNpbmdTT0FQQWRkcmVzcyhwb3J0c1VzaW5nUG9ydFR5cGUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgcG9ydHNVc2luZ1NPQVBBZGRyZXNzLnNpemUoKSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RQb3J0U2VsZWN0aW9uKCkgewotICAgICAgICAvLyBUZXN0IHRoZSBTZXJ2aWNlLmdldFBvcnQgY2FsbAotICAgICAgICBVUkwgd3NkbFVSTCA9IERlc2NyaXB0aW9uVGVzdFV0aWxzMi5nZXRXU0RMVVJMKCJXU0RMTXVsdGlUZXN0cy53c2RsIik7Ci0KLSAgICAgICAgUU5hbWUgc2VydmljZVFOID0gbmV3IFFOYW1lKFZBTElEX1NFUlZJQ0VfTkFNRVNQQUNFLCBWQUxJRF9TRVJWSUNFX0xPQ0FMUEFSVF8zKTsKLSAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gU2VydmljZS5jcmVhdGUod3NkbFVSTCwgc2VydmljZVFOKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlKTsKLSAgICAgICAgQWRkTnVtYmVyc1BvcnRUeXBlIHNlbGVjdFBvcnQgPSBzZXJ2aWNlLmdldFBvcnQoQWRkTnVtYmVyc1BvcnRUeXBlLmNsYXNzKTsKLSAgICAgICAgQmluZGluZ1Byb3ZpZGVyIGJpbmRpbmdQcm92aWRlciA9IChCaW5kaW5nUHJvdmlkZXIpUHJveHkuZ2V0SW52b2NhdGlvbkhhbmRsZXIoc2VsZWN0UG9ydCk7Ci0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZW5kcG9pbnREZXNjID0gYmluZGluZ1Byb3ZpZGVyLmdldEVuZHBvaW50RGVzY3JpcHRpb24oKTsKLSAgICAgICAgUU5hbWUgc2VsZWN0ZWRQb3J0UU5hbWUgPSBlbmRwb2ludERlc2MuZ2V0UG9ydFFOYW1lKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2VsZWN0ZWRQb3J0UU5hbWUpOwotICAgICAgICAvLyBXZSBleHBlY3QgdGhlIGZpcnN0IHBvcnQgaW4gdGhlIFdTREwgd2hpY2ggdXNlcyB0aGUgUG9ydFR5cGUgZm9yIHRoZSBTRUkgQWRkTnVtYmVyc1BvcnRUeXBlIHRvIGJlIHNlbGVjdGVkCi0gICAgICAgIC8vIFVORk9SVFVOQVRFTFkhICBXU0RMNEogU2VydmljZS5nZXRQb3J0cygpLCB3aGljaCByZXR1cm5zIGEgTWFwIG9mIHBvcnRzIHVuZGVyIHRoZSBzZXJ2aWNlIERPRVMgTk9UIHJldHVybgotICAgICAgICAvLyB0aGVtIGluIHRoZSBvcmRlciBkZWZpbmVkIGluIHRoZSBXU0RMLiAgVGhlcmVmb3JlLCB3ZSBjYW4ndCBuZWNlc3NhcmlseSBwcmVkaWN0IHdoaWNoIG9uZSB3ZSdsbCBnZXQgYmFjay4KLSAgICAgICAgLy8gU28sIHRoZSBmb2xsb3dpbmcgdHdvIGxpbmVzIG1heSBjYXVzZSB0aGUgdGVzdCB0byBmYWlsLgotLy8gICAgICAgIFFOYW1lIGV4cGVjdGVkUU5hbWUgPSBuZXcgUU5hbWUoVkFMSURfU0VSVklDRV9OQU1FU1BBQ0UsICJBZGROdW1iZXJzUG9ydFMzUDIiKTsKLS8vICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRRTmFtZSwgc2VsZWN0ZWRQb3J0UU5hbWUpOwotICAgICAgICAvLyBTbywgdGhlIGJlc3Qgd2UgY2FuIGRvIGlzIGp1c3QgdGVzdCB0aGF0IE9ORSBvZiB0aGUgdmFsaWQgcG9ydHMgaXMgdGhlIG9uZSB0aGF0IHdhcyBzZWxlY3RlZC4KLSAgICAgICAgYm9vbGVhbiB0ZXN0U3VjY2Vzc2Z1bCA9IGZhbHNlOwotICAgICAgICBRTmFtZVtdIHZhbGlkUG9ydHMgPSBuZXcgUU5hbWVbM107Ci0gICAgICAgIHZhbGlkUG9ydHNbMF0gPSBuZXcgUU5hbWUoVkFMSURfU0VSVklDRV9OQU1FU1BBQ0UsICJBZGROdW1iZXJzUG9ydFMzUDIiKTsKLSAgICAgICAgdmFsaWRQb3J0c1sxXSA9IG5ldyBRTmFtZShWQUxJRF9TRVJWSUNFX05BTUVTUEFDRSwgIkFkZE51bWJlcnNQb3J0UzNQMyIpOwotICAgICAgICB2YWxpZFBvcnRzWzJdID0gbmV3IFFOYW1lKFZBTElEX1NFUlZJQ0VfTkFNRVNQQUNFLCAiQWRkTnVtYmVyc1BvcnRTM1A0Iik7Ci0gICAgICAgIGZvciAoUU5hbWUgY2hlY2tQb3J0IDogdmFsaWRQb3J0cykgewotICAgICAgICAgICAgaWYgKHNlbGVjdGVkUG9ydFFOYW1lLmVxdWFscyhjaGVja1BvcnQpKSB7Ci0gICAgICAgICAgICAgICAgdGVzdFN1Y2Nlc3NmdWwgPSB0cnVlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUodGVzdFN1Y2Nlc3NmdWwpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZFBvcnRTZWxlY3Rpb24oKSB7Ci0gICAgICAgIFVSTCB3c2RsVVJMID0gRGVzY3JpcHRpb25UZXN0VXRpbHMyLmdldFdTRExVUkwoIldTRExNdWx0aVRlc3RzLndzZGwiKTsKLQotICAgICAgICBRTmFtZSBzZXJ2aWNlUU4gPSBuZXcgUU5hbWUoVkFMSURfU0VSVklDRV9OQU1FU1BBQ0UsIFZBTElEX1NFUlZJQ0VfTE9DQUxQQVJUXzMpOwotICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSBTZXJ2aWNlLmNyZWF0ZSh3c2RsVVJMLCBzZXJ2aWNlUU4pOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2UpOwotICAgICAgICAvLyBUaGVyZSBzaG91bGQgYmUgbm8gcG9ydHMgaW4gdGhlIHNlcnZpY2UgdGhhdCB1c2UgdGhpcyBTRUkhCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBFY2hvUG9ydCBzZWxlY3RQb3J0ID0gc2VydmljZS5nZXRQb3J0KEVjaG9Qb3J0LmNsYXNzKTsKLSAgICAgICAgICAgIGZhaWwoIlNob3VsZG4ndCBoYXZlIGZvdW5kIGEgcG9ydCBmb3IgdGhlIGdpdmVuIFNFSSEiKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoV2ViU2VydmljZUV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgLy8gRXhwZWN0ZWQgY29kZSBwYXRoCi0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBleGNlcHRpb24gIiArIGV4LnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vU2VydmljZVRlc3RzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vU2VydmljZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzYzQzOGUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL1NlcnZpY2VUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uc2FtcGxlLmFkZG51bWJlcnMuQWRkTnVtYmVyc1BvcnRUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc3BpLlNlcnZpY2VEZWxlZ2F0ZTsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLndzLkRpc3BhdGNoOwotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlOwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFZBTElEX1NFUlZJQ0VfTkFNRVNQQUNFID0gImh0dHA6Ly9vcmcvdGVzdC9hZGRudW1iZXJzIjsKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgVkFMSURfU0VSVklDRV9MT0NBTFBBUlRfMSA9ICJBZGROdW1iZXJzU2VydmljZTEiOwotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBWQUxJRF9TRVJWSUNFX0xPQ0FMUEFSVF8yID0gIkFkZE51bWJlcnNTZXJ2aWNlMiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFZBTElEX1BPUlRfUzFQMSA9ICJBZGROdW1iZXJzUG9ydFMxUDEiOwotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBWQUxJRF9QT1JUX1MxUDIgPSAiQWRkTnVtYmVyc1BvcnRTMVAyIjsKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgVkFMSURfUE9SVF9TMVAzID0gIkFkZE51bWJlcnNQb3J0UzFQMyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFZBTElEX1BPUlRfUzJQMSA9ICJBZGROdW1iZXJzUG9ydFMyUDEiOwotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBWQUxJRF9QT1JUX1MyUDIgPSAiQWRkTnVtYmVyc1BvcnRTMlAyIjsKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgVkFMSURfUE9SVF9TMlAzID0gIkFkZE51bWJlcnNQb3J0UzJQMyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFZBTElEX1BPUlRfUzJQNCA9ICJBZGROdW1iZXJzUG9ydFMyUDQiOwotCi0gICAgcHVibGljIHZvaWQgdGVzdEludmFsaWRTZXJ2aWNlTmFtZXNwYWNlKCkgewotICAgICAgICBVUkwgd3NkbFVSTCA9IERlc2NyaXB0aW9uVGVzdFV0aWxzMi5nZXRXU0RMVVJMKCJXU0RMTXVsdGlUZXN0cy53c2RsIik7Ci0gICAgICAgIFFOYW1lIGludmFsaWRTZXJ2aWNlUU4gPSBuZXcgUU5hbWUoImludmFsaWRTZXJ2aWNlTmFtZXNwYWNlIiwgVkFMSURfU0VSVklDRV9MT0NBTFBBUlRfMSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTZXJ2aWNlIGludmFsaWRTZXJ2aWNlID0gU2VydmljZS5jcmVhdGUod3NkbFVSTCwgaW52YWxpZFNlcnZpY2VRTik7Ci0gICAgICAgICAgICBmYWlsKCJDcmVhdGVkIHNlcnZpY2Ugd2l0aCBpbnZhbGlkIG5hbWVzcGFjZSIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChXZWJTZXJ2aWNlRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAvLyBFeHBlY3RlZCBjb2RlIHBhdGgKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBmYWlsKCJDYXVnaHQgdW5leHBlY3RlZCBleGNlcHRpb24gIiArIGV4LnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkU2VydmljZUxvY2FsUGFydCgpIHsKLSAgICAgICAgVVJMIHdzZGxVUkwgPSBEZXNjcmlwdGlvblRlc3RVdGlsczIuZ2V0V1NETFVSTCgiV1NETE11bHRpVGVzdHMud3NkbCIpOwotICAgICAgICBRTmFtZSBpbnZhbGlkU2VydmljZVFOID0gbmV3IFFOYW1lKFZBTElEX1NFUlZJQ0VfTkFNRVNQQUNFLCAiaW52YWxpZFNlcnZpY2VOYW1lIik7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTZXJ2aWNlIGludmFsaWRTZXJ2aWNlID0gU2VydmljZS5jcmVhdGUod3NkbFVSTCwgaW52YWxpZFNlcnZpY2VRTik7Ci0gICAgICAgICAgICBmYWlsKCJDcmVhdGVkIHNlcnZpY2Ugd2l0aCBpbnZhbGlkIG5hbWVzcGFjZSIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChXZWJTZXJ2aWNlRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAvLyBFeHBlY3RlZCBjb2RlIHBhdGgKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBmYWlsKCJDYXVnaHQgdW5leHBlY3RlZCBleGNlcHRpb24gIiArIGV4LnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZFNhbWVTZXJ2aWNlKCkgewotICAgICAgICBVUkwgd3NkbFVSTCA9IERlc2NyaXB0aW9uVGVzdFV0aWxzMi5nZXRXU0RMVVJMKCJXU0RMTXVsdGlUZXN0cy53c2RsIik7Ci0gICAgICAgIAotICAgICAgICBRTmFtZSB2YWxpZFNlcnZpY2UxUU4gPSBuZXcgUU5hbWUoVkFMSURfU0VSVklDRV9OQU1FU1BBQ0UsIFZBTElEX1NFUlZJQ0VfTE9DQUxQQVJUXzEpOwotICAgICAgICBTZXJ2aWNlIHZhbGlkU2VydmljZTEgPSBTZXJ2aWNlLmNyZWF0ZSh3c2RsVVJMLCB2YWxpZFNlcnZpY2UxUU4pOwotICAgICAgICBhc3NlcnROb3ROdWxsKHZhbGlkU2VydmljZTEpOwotCi0gICAgICAgIFFOYW1lIHZhbGlkU2VydmljZTJRTiA9IG5ldyBRTmFtZShWQUxJRF9TRVJWSUNFX05BTUVTUEFDRSwgVkFMSURfU0VSVklDRV9MT0NBTFBBUlRfMSk7Ci0gICAgICAgIFNlcnZpY2UgdmFsaWRTZXJ2aWNlMiA9IFNlcnZpY2UuY3JlYXRlKHdzZGxVUkwsIHZhbGlkU2VydmljZTJRTik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwodmFsaWRTZXJ2aWNlMik7Ci0gICAgICAgIAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZE11bHRpU2VydmljZXMoKSB7Ci0gICAgICAgIFVSTCB3c2RsVVJMID0gRGVzY3JpcHRpb25UZXN0VXRpbHMyLmdldFdTRExVUkwoIldTRExNdWx0aVRlc3RzLndzZGwiKTsKLSAgICAgICAgCi0gICAgICAgIFFOYW1lIHZhbGlkU2VydmljZTFRTiA9IG5ldyBRTmFtZShWQUxJRF9TRVJWSUNFX05BTUVTUEFDRSwgVkFMSURfU0VSVklDRV9MT0NBTFBBUlRfMSk7Ci0gICAgICAgIFNlcnZpY2UgdmFsaWRTZXJ2aWNlMSA9IFNlcnZpY2UuY3JlYXRlKHdzZGxVUkwsIHZhbGlkU2VydmljZTFRTik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwodmFsaWRTZXJ2aWNlMSk7Ci0KLSAgICAgICAgUU5hbWUgdmFsaWRTZXJ2aWNlMlFOID0gbmV3IFFOYW1lKFZBTElEX1NFUlZJQ0VfTkFNRVNQQUNFLCBWQUxJRF9TRVJWSUNFX0xPQ0FMUEFSVF8yKTsKLSAgICAgICAgU2VydmljZSB2YWxpZFNlcnZpY2UyID0gU2VydmljZS5jcmVhdGUod3NkbFVSTCwgdmFsaWRTZXJ2aWNlMlFOKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh2YWxpZFNlcnZpY2UyKTsKLSAgICAgICAgYXNzZXJ0Tm90U2FtZSh2YWxpZFNlcnZpY2UxLCB2YWxpZFNlcnZpY2UyKTsKLSAgICAgICAgCi0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRTZXJ2aWNlRGVjbGFyZWRQb3J0cygpIHsKLSAgICAgICAgVVJMIHdzZGxVUkwgPSBEZXNjcmlwdGlvblRlc3RVdGlsczIuZ2V0V1NETFVSTCgiV1NETE11bHRpVGVzdHMud3NkbCIpOwotCi0gICAgICAgIFFOYW1lIHNlcnZpY2UxUU4gPSBuZXcgUU5hbWUoVkFMSURfU0VSVklDRV9OQU1FU1BBQ0UsIFZBTElEX1NFUlZJQ0VfTE9DQUxQQVJUXzEpOwotICAgICAgICBTZXJ2aWNlIHNlcnZpY2UxID0gU2VydmljZS5jcmVhdGUod3NkbFVSTCwgc2VydmljZTFRTik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZTEpOwotICAgICAgICBTZXJ2aWNlRGVsZWdhdGUgc2VydmljZTFEZWxlZ2F0ZSA9IERlc2NyaXB0aW9uVGVzdFV0aWxzMi5nZXRTZXJ2aWNlRGVsZWdhdGUoc2VydmljZTEpOwotICAgICAgICBhc3NlcnROb3ROdWxsIChzZXJ2aWNlMURlbGVnYXRlKTsKLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNlcnZpY2UxRGVzYyA9IHNlcnZpY2UxRGVsZWdhdGUuZ2V0U2VydmljZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZTFEZXNjKTsKLSAgICAgICAgTGlzdDxRTmFtZT4gc2VydmljZTFQb3J0c0xpc3QgPSBzZXJ2aWNlMURlc2MuZ2V0UG9ydHMoc2VydmljZTFEZWxlZ2F0ZSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZTFQb3J0c0xpc3QpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMywgc2VydmljZTFQb3J0c0xpc3Quc2l6ZSgpKTsKLSAgICAgICAgSXRlcmF0b3I8UU5hbWU+IHNlcnZpY2UxUG9ydEl0ZXJhdG9yID0gc2VydmljZTEuZ2V0UG9ydHMoKTsKLSAgICAgICAgYXNzZXJ0UU5hbWVJdGVyYXRvclNhbWVBc0xpc3Qoc2VydmljZTFQb3J0SXRlcmF0b3IsIHNlcnZpY2UxUG9ydHNMaXN0KTsKLQotICAgICAgICBRTmFtZSBzZXJ2aWNlMlFOID0gbmV3IFFOYW1lKFZBTElEX1NFUlZJQ0VfTkFNRVNQQUNFLCBWQUxJRF9TRVJWSUNFX0xPQ0FMUEFSVF8yKTsKLSAgICAgICAgU2VydmljZSBzZXJ2aWNlMiA9IFNlcnZpY2UuY3JlYXRlKHdzZGxVUkwsIHNlcnZpY2UyUU4pOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2UyKTsKLSAgICAgICAgU2VydmljZURlbGVnYXRlIHNlcnZpY2UyRGVsZWdhdGUgPSBEZXNjcmlwdGlvblRlc3RVdGlsczIuZ2V0U2VydmljZURlbGVnYXRlKHNlcnZpY2UyKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCAoc2VydmljZTJEZWxlZ2F0ZSk7Ci0gICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzZXJ2aWNlMkRlc2MgPSBzZXJ2aWNlMkRlbGVnYXRlLmdldFNlcnZpY2VEZXNjcmlwdGlvbigpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2UyRGVzYyk7Ci0gICAgICAgIExpc3Q8UU5hbWU+IHNlcnZpY2UyUG9ydHNMaXN0ID0gc2VydmljZTJEZXNjLmdldFBvcnRzKHNlcnZpY2UyRGVsZWdhdGUpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2UyUG9ydHNMaXN0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDQsIHNlcnZpY2UyUG9ydHNMaXN0LnNpemUoKSk7Ci0gICAgICAgIEl0ZXJhdG9yPFFOYW1lPiBzZXJ2aWNlMlBvcnRJdGVyYXRvciA9IHNlcnZpY2UyLmdldFBvcnRzKCk7Ci0gICAgICAgIGFzc2VydFFOYW1lSXRlcmF0b3JTYW1lQXNMaXN0KHNlcnZpY2UyUG9ydEl0ZXJhdG9yLCBzZXJ2aWNlMlBvcnRzTGlzdCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEdldFNlcnZpY2VBZGRlZFBvcnRzKCkgewotICAgICAgICBVUkwgd3NkbFVSTCA9IERlc2NyaXB0aW9uVGVzdFV0aWxzMi5nZXRXU0RMVVJMKCJXU0RMTXVsdGlUZXN0cy53c2RsIik7Ci0KLSAgICAgICAgUU5hbWUgc2VydmljZTFRTiA9IG5ldyBRTmFtZShWQUxJRF9TRVJWSUNFX05BTUVTUEFDRSwgVkFMSURfU0VSVklDRV9MT0NBTFBBUlRfMSk7Ci0gICAgICAgIFNlcnZpY2Ugc2VydmljZTEgPSBTZXJ2aWNlLmNyZWF0ZSh3c2RsVVJMLCBzZXJ2aWNlMVFOKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlMSk7Ci0gICAgICAgIFNlcnZpY2VEZWxlZ2F0ZSBzZXJ2aWNlMURlbGVnYXRlID0gRGVzY3JpcHRpb25UZXN0VXRpbHMyLmdldFNlcnZpY2VEZWxlZ2F0ZShzZXJ2aWNlMSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwgKHNlcnZpY2UxRGVsZWdhdGUpOwotICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc2VydmljZTFEZXNjID0gc2VydmljZTFEZWxlZ2F0ZS5nZXRTZXJ2aWNlRGVzY3JpcHRpb24oKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlMURlc2MpOwotICAgICAgICBMaXN0PFFOYW1lPiBzZXJ2aWNlMVBvcnRzTGlzdCA9IHNlcnZpY2UxRGVzYy5nZXRQb3J0cyhzZXJ2aWNlMURlbGVnYXRlKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlMVBvcnRzTGlzdCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygzLCBzZXJ2aWNlMVBvcnRzTGlzdC5zaXplKCkpOwotICAgICAgICBzZXJ2aWNlMS5hZGRQb3J0KG5ldyBRTmFtZShWQUxJRF9TRVJWSUNFX05BTUVTUEFDRSwgImFkZGVkUG9ydFMxUDEiKSwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIHNlcnZpY2UxLmFkZFBvcnQobmV3IFFOYW1lKFZBTElEX1NFUlZJQ0VfTkFNRVNQQUNFLCAiYWRkZWRQb3J0UzFQMiIpLCBudWxsLCBudWxsKTsKLSAgICAgICAgc2VydmljZTFQb3J0c0xpc3QgPSBzZXJ2aWNlMURlc2MuZ2V0UG9ydHMoc2VydmljZTFEZWxlZ2F0ZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyg1LCBzZXJ2aWNlMVBvcnRzTGlzdC5zaXplKCkpOwotICAgICAgICBJdGVyYXRvcjxRTmFtZT4gc2VydmljZTFQb3J0SXRlcmF0b3IgPSBzZXJ2aWNlMS5nZXRQb3J0cygpOwotICAgICAgICBhc3NlcnRRTmFtZUl0ZXJhdG9yU2FtZUFzTGlzdChzZXJ2aWNlMVBvcnRJdGVyYXRvciwgc2VydmljZTFQb3J0c0xpc3QpOwotCi0gICAgICAgIFFOYW1lIHNlcnZpY2UyUU4gPSBuZXcgUU5hbWUoVkFMSURfU0VSVklDRV9OQU1FU1BBQ0UsIFZBTElEX1NFUlZJQ0VfTE9DQUxQQVJUXzIpOwotICAgICAgICBTZXJ2aWNlIHNlcnZpY2UyID0gU2VydmljZS5jcmVhdGUod3NkbFVSTCwgc2VydmljZTJRTik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZTIpOwotICAgICAgICBTZXJ2aWNlRGVsZWdhdGUgc2VydmljZTJEZWxlZ2F0ZSA9IERlc2NyaXB0aW9uVGVzdFV0aWxzMi5nZXRTZXJ2aWNlRGVsZWdhdGUoc2VydmljZTIpOwotICAgICAgICBhc3NlcnROb3ROdWxsIChzZXJ2aWNlMkRlbGVnYXRlKTsKLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNlcnZpY2UyRGVzYyA9IHNlcnZpY2UyRGVsZWdhdGUuZ2V0U2VydmljZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZTJEZXNjKTsKLSAgICAgICAgTGlzdDxRTmFtZT4gc2VydmljZTJQb3J0c0xpc3QgPSBzZXJ2aWNlMkRlc2MuZ2V0UG9ydHMoc2VydmljZTJEZWxlZ2F0ZSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZTJQb3J0c0xpc3QpOwotICAgICAgICBhc3NlcnRFcXVhbHMoNCwgc2VydmljZTJQb3J0c0xpc3Quc2l6ZSgpKTsKLSAgICAgICAgc2VydmljZTIuYWRkUG9ydChuZXcgUU5hbWUoVkFMSURfU0VSVklDRV9OQU1FU1BBQ0UsICJhZGRlZFBvcnRTMlAxIiksIG51bGwsIG51bGwpOwotICAgICAgICBzZXJ2aWNlMi5hZGRQb3J0KG5ldyBRTmFtZShWQUxJRF9TRVJWSUNFX05BTUVTUEFDRSwgImFkZGVkUG9ydFMyUDIiKSwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIHNlcnZpY2UyUG9ydHNMaXN0ID0gc2VydmljZTJEZXNjLmdldFBvcnRzKHNlcnZpY2UyRGVsZWdhdGUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoNiwgc2VydmljZTJQb3J0c0xpc3Quc2l6ZSgpKTsKLSAgICAgICAgSXRlcmF0b3I8UU5hbWU+IHNlcnZpY2UyUG9ydEl0ZXJhdG9yID0gc2VydmljZTIuZ2V0UG9ydHMoKTsKLSAgICAgICAgYXNzZXJ0UU5hbWVJdGVyYXRvclNhbWVBc0xpc3Qoc2VydmljZTJQb3J0SXRlcmF0b3IsIHNlcnZpY2UyUG9ydHNMaXN0KTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdEdldFNlcnZpY2VEZWNsYXJlZFBvcnRzQWZ0ZXJHZXRQb3J0KCkgewotICAgICAgICBVUkwgd3NkbFVSTCA9IERlc2NyaXB0aW9uVGVzdFV0aWxzMi5nZXRXU0RMVVJMKCJXU0RMTXVsdGlUZXN0cy53c2RsIik7Ci0KLSAgICAgICAgUU5hbWUgc2VydmljZTFRTiA9IG5ldyBRTmFtZShWQUxJRF9TRVJWSUNFX05BTUVTUEFDRSwgVkFMSURfU0VSVklDRV9MT0NBTFBBUlRfMSk7Ci0gICAgICAgIFNlcnZpY2Ugc2VydmljZTEgPSBTZXJ2aWNlLmNyZWF0ZSh3c2RsVVJMLCBzZXJ2aWNlMVFOKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlMSk7Ci0gICAgICAgIFNlcnZpY2VEZWxlZ2F0ZSBzZXJ2aWNlMURlbGVnYXRlID0gRGVzY3JpcHRpb25UZXN0VXRpbHMyLmdldFNlcnZpY2VEZWxlZ2F0ZShzZXJ2aWNlMSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwgKHNlcnZpY2UxRGVsZWdhdGUpOwotICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc2VydmljZTFEZXNjID0gc2VydmljZTFEZWxlZ2F0ZS5nZXRTZXJ2aWNlRGVzY3JpcHRpb24oKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlMURlc2MpOwotICAgICAgICBMaXN0PFFOYW1lPiBzZXJ2aWNlMVBvcnRzTGlzdCA9IHNlcnZpY2UxRGVzYy5nZXRQb3J0cyhzZXJ2aWNlMURlbGVnYXRlKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlMVBvcnRzTGlzdCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygzLCBzZXJ2aWNlMVBvcnRzTGlzdC5zaXplKCkpOwotICAgICAgICBBZGROdW1iZXJzUG9ydFR5cGUgYWRkTnVtYmVyc1BvcnRTMVAxID0gc2VydmljZTEuZ2V0UG9ydChuZXcgUU5hbWUoVkFMSURfU0VSVklDRV9OQU1FU1BBQ0UsIFZBTElEX1BPUlRfUzFQMSksIEFkZE51bWJlcnNQb3J0VHlwZS5jbGFzcyk7IAotICAgICAgICBzZXJ2aWNlMVBvcnRzTGlzdCA9IHNlcnZpY2UxRGVzYy5nZXRQb3J0cyhzZXJ2aWNlMURlbGVnYXRlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIHNlcnZpY2UxUG9ydHNMaXN0LnNpemUoKSk7Ci0gICAgICAgIEFkZE51bWJlcnNQb3J0VHlwZSBhZGROdW1iZXJzUG9ydFMxUDMgPSBzZXJ2aWNlMS5nZXRQb3J0KG5ldyBRTmFtZShWQUxJRF9TRVJWSUNFX05BTUVTUEFDRSwgVkFMSURfUE9SVF9TMVAzKSwgQWRkTnVtYmVyc1BvcnRUeXBlLmNsYXNzKTsgCi0gICAgICAgIGFzc2VydEVxdWFscygzLCBzZXJ2aWNlMVBvcnRzTGlzdC5zaXplKCkpOwotICAgICAgICBzZXJ2aWNlMS5hZGRQb3J0KG5ldyBRTmFtZShWQUxJRF9TRVJWSUNFX05BTUVTUEFDRSwgImFkZGVkUG9ydFMxUDEiKSwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIHNlcnZpY2UxLmFkZFBvcnQobmV3IFFOYW1lKFZBTElEX1NFUlZJQ0VfTkFNRVNQQUNFLCAiYWRkZWRQb3J0UzFQMiIpLCBudWxsLCBudWxsKTsKLSAgICAgICAgc2VydmljZTFQb3J0c0xpc3QgPSBzZXJ2aWNlMURlc2MuZ2V0UG9ydHMoc2VydmljZTFEZWxlZ2F0ZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyg1LCBzZXJ2aWNlMVBvcnRzTGlzdC5zaXplKCkpOwotICAgICAgICBJdGVyYXRvcjxRTmFtZT4gc2VydmljZTFQb3J0SXRlcmF0b3IgPSBzZXJ2aWNlMS5nZXRQb3J0cygpOwotICAgICAgICBhc3NlcnRRTmFtZUl0ZXJhdG9yU2FtZUFzTGlzdChzZXJ2aWNlMVBvcnRJdGVyYXRvciwgc2VydmljZTFQb3J0c0xpc3QpOwotICAgICAgICAKLSAgICAgICAgUU5hbWUgc2VydmljZTJRTiA9IG5ldyBRTmFtZShWQUxJRF9TRVJWSUNFX05BTUVTUEFDRSwgVkFMSURfU0VSVklDRV9MT0NBTFBBUlRfMik7Ci0gICAgICAgIFNlcnZpY2Ugc2VydmljZTIgPSBTZXJ2aWNlLmNyZWF0ZSh3c2RsVVJMLCBzZXJ2aWNlMlFOKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlMik7Ci0gICAgICAgIFNlcnZpY2VEZWxlZ2F0ZSBzZXJ2aWNlMkRlbGVnYXRlID0gRGVzY3JpcHRpb25UZXN0VXRpbHMyLmdldFNlcnZpY2VEZWxlZ2F0ZShzZXJ2aWNlMik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwgKHNlcnZpY2UyRGVsZWdhdGUpOwotICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc2VydmljZTJEZXNjID0gc2VydmljZTJEZWxlZ2F0ZS5nZXRTZXJ2aWNlRGVzY3JpcHRpb24oKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlMkRlc2MpOwotICAgICAgICBMaXN0PFFOYW1lPiBzZXJ2aWNlMlBvcnRzTGlzdCA9IHNlcnZpY2UyRGVzYy5nZXRQb3J0cyhzZXJ2aWNlMkRlbGVnYXRlKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlMlBvcnRzTGlzdCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyg0LCBzZXJ2aWNlMlBvcnRzTGlzdC5zaXplKCkpOwotICAgICAgICBBZGROdW1iZXJzUG9ydFR5cGUgYWRkTnVtYmVyc1BvcnRTMlAxID0gc2VydmljZTIuZ2V0UG9ydChuZXcgUU5hbWUoVkFMSURfU0VSVklDRV9OQU1FU1BBQ0UsIFZBTElEX1BPUlRfUzJQMSksIEFkZE51bWJlcnNQb3J0VHlwZS5jbGFzcyk7IAotICAgICAgICBzZXJ2aWNlMlBvcnRzTGlzdCA9IHNlcnZpY2UyRGVzYy5nZXRQb3J0cyhzZXJ2aWNlMkRlbGVnYXRlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDQsIHNlcnZpY2UyUG9ydHNMaXN0LnNpemUoKSk7Ci0gICAgICAgIEFkZE51bWJlcnNQb3J0VHlwZSBhZGROdW1iZXJzUG9ydFMyUDMgPSBzZXJ2aWNlMi5nZXRQb3J0KG5ldyBRTmFtZShWQUxJRF9TRVJWSUNFX05BTUVTUEFDRSwgVkFMSURfUE9SVF9TMlAzKSwgQWRkTnVtYmVyc1BvcnRUeXBlLmNsYXNzKTsgCi0gICAgICAgIGFzc2VydEVxdWFscyg0LCBzZXJ2aWNlMlBvcnRzTGlzdC5zaXplKCkpOwotICAgICAgICBBZGROdW1iZXJzUG9ydFR5cGUgYWRkTnVtYmVyc1BvcnRTMlA0ID0gc2VydmljZTIuZ2V0UG9ydChuZXcgUU5hbWUoVkFMSURfU0VSVklDRV9OQU1FU1BBQ0UsIFZBTElEX1BPUlRfUzJQNCksIEFkZE51bWJlcnNQb3J0VHlwZS5jbGFzcyk7IAotICAgICAgICBhc3NlcnRFcXVhbHMoNCwgc2VydmljZTJQb3J0c0xpc3Quc2l6ZSgpKTsKLSAgICAgICAgc2VydmljZTIuYWRkUG9ydChuZXcgUU5hbWUoVkFMSURfU0VSVklDRV9OQU1FU1BBQ0UsICJhZGRlZFBvcnRTMlAxIiksIG51bGwsIG51bGwpOwotICAgICAgICBzZXJ2aWNlMi5hZGRQb3J0KG5ldyBRTmFtZShWQUxJRF9TRVJWSUNFX05BTUVTUEFDRSwgImFkZGVkUG9ydFMyUDIiKSwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIHNlcnZpY2UyUG9ydHNMaXN0ID0gc2VydmljZTJEZXNjLmdldFBvcnRzKHNlcnZpY2UyRGVsZWdhdGUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoNiwgc2VydmljZTJQb3J0c0xpc3Quc2l6ZSgpKTsKLSAgICAgICAgSXRlcmF0b3I8UU5hbWU+IHNlcnZpY2UyUG9ydEl0ZXJhdG9yID0gc2VydmljZTIuZ2V0UG9ydHMoKTsKLSAgICAgICAgYXNzZXJ0UU5hbWVJdGVyYXRvclNhbWVBc0xpc3Qoc2VydmljZTJQb3J0SXRlcmF0b3IsIHNlcnZpY2UyUG9ydHNMaXN0KTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdER5bmFtaWNTZXJ2aWNlKCkgewotICAgICAgICBRTmFtZSBzZXJ2aWNlMVFOID0gbmV3IFFOYW1lKFZBTElEX1NFUlZJQ0VfTkFNRVNQQUNFLCAiRHluYW1pY1NlcnZpY2UxIik7Ci0gICAgICAgIFNlcnZpY2Ugc2VydmljZTEgPSBTZXJ2aWNlLmNyZWF0ZShudWxsLCBzZXJ2aWNlMVFOKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlMSk7Ci0gICAgICAgIFNlcnZpY2VEZWxlZ2F0ZSBzZXJ2aWNlMURlbGVnYXRlID0gRGVzY3JpcHRpb25UZXN0VXRpbHMyLmdldFNlcnZpY2VEZWxlZ2F0ZShzZXJ2aWNlMSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwgKHNlcnZpY2UxRGVsZWdhdGUpOwotICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc2VydmljZTFEZXNjID0gc2VydmljZTFEZWxlZ2F0ZS5nZXRTZXJ2aWNlRGVzY3JpcHRpb24oKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlMURlc2MpOwotICAgICAgICBMaXN0PFFOYW1lPiBzZXJ2aWNlMVBvcnRzTGlzdCA9IHNlcnZpY2UxRGVzYy5nZXRQb3J0cyhzZXJ2aWNlMURlbGVnYXRlKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlMVBvcnRzTGlzdCk7Ci0gICAgICAgIGFzc2VydFRydWUoc2VydmljZTFQb3J0c0xpc3QuaXNFbXB0eSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHNlcnZpY2UxUG9ydHNMaXN0LnNpemUoKSk7Ci0gICAgICAgIEFkZE51bWJlcnNQb3J0VHlwZSBhZGROdW1iZXJzUG9ydFMxUDEgPSBzZXJ2aWNlMS5nZXRQb3J0KG5ldyBRTmFtZShWQUxJRF9TRVJWSUNFX05BTUVTUEFDRSwgImR5bmFtaWNQb3J0UzFQMSIpLCBBZGROdW1iZXJzUG9ydFR5cGUuY2xhc3MpOyAKLSAgICAgICAgc2VydmljZTFQb3J0c0xpc3QgPSBzZXJ2aWNlMURlc2MuZ2V0UG9ydHMoc2VydmljZTFEZWxlZ2F0ZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBzZXJ2aWNlMVBvcnRzTGlzdC5zaXplKCkpOwotICAgICAgICBBZGROdW1iZXJzUG9ydFR5cGUgYWRkTnVtYmVyc1BvcnRTMVAzID0gc2VydmljZTEuZ2V0UG9ydChuZXcgUU5hbWUoVkFMSURfU0VSVklDRV9OQU1FU1BBQ0UsICJkeW5hbWljUG9ydFMxUDIiKSwgQWRkTnVtYmVyc1BvcnRUeXBlLmNsYXNzKTsgCi0gICAgICAgIHNlcnZpY2UxUG9ydHNMaXN0ID0gc2VydmljZTFEZXNjLmdldFBvcnRzKHNlcnZpY2UxRGVsZWdhdGUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgc2VydmljZTFQb3J0c0xpc3Quc2l6ZSgpKTsKLSAgICAgICAgc2VydmljZTEuYWRkUG9ydChuZXcgUU5hbWUoVkFMSURfU0VSVklDRV9OQU1FU1BBQ0UsICJhZGRlZFBvcnRTMVAxIiksIG51bGwsIG51bGwpOwotICAgICAgICBzZXJ2aWNlMS5hZGRQb3J0KG5ldyBRTmFtZShWQUxJRF9TRVJWSUNFX05BTUVTUEFDRSwgImFkZGVkUG9ydFMxUDIiKSwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIHNlcnZpY2UxUG9ydHNMaXN0ID0gc2VydmljZTFEZXNjLmdldFBvcnRzKHNlcnZpY2UxRGVsZWdhdGUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoNCwgc2VydmljZTFQb3J0c0xpc3Quc2l6ZSgpKTsKLSAgICAgICAgSXRlcmF0b3I8UU5hbWU+IHNlcnZpY2UxUG9ydEl0ZXJhdG9yID0gc2VydmljZTEuZ2V0UG9ydHMoKTsKLSAgICAgICAgYXNzZXJ0UU5hbWVJdGVyYXRvclNhbWVBc0xpc3Qoc2VydmljZTFQb3J0SXRlcmF0b3IsIHNlcnZpY2UxUG9ydHNMaXN0KTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZURpc3BhdGNoV1NETCgpIHsKLSAgICAgICAgVVJMIHdzZGxVUkwgPSBEZXNjcmlwdGlvblRlc3RVdGlsczIuZ2V0V1NETFVSTCgiV1NETE11bHRpVGVzdHMud3NkbCIpOwotCi0gICAgICAgIFFOYW1lIHNlcnZpY2UxUU4gPSBuZXcgUU5hbWUoVkFMSURfU0VSVklDRV9OQU1FU1BBQ0UsIFZBTElEX1NFUlZJQ0VfTE9DQUxQQVJUXzEpOwotICAgICAgICBTZXJ2aWNlIHNlcnZpY2UxID0gU2VydmljZS5jcmVhdGUod3NkbFVSTCwgc2VydmljZTFRTik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZTEpOwotICAgICAgICAvLyBDcmVhdGUgRGlzcGF0Y2ggc2hvdWxkIHdvcmsgb24gYSBXU0RMIGRlY2xhcmVkIHBvcnQgcHJpb3IgdG8gYSBnZXRQb3J0Ci0gICAgICAgIC8vIGFuZCBhZ2FpbiBhZnRlciB0aGUgY2FsbCB0byBnZXRQb3J0Ci0gICAgICAgIFFOYW1lIHZhbGlkUG9ydFFOYW1lID0gbmV3IFFOYW1lKFZBTElEX1NFUlZJQ0VfTkFNRVNQQUNFLCBWQUxJRF9QT1JUX1MxUDEpOwotICAgICAgICBEaXNwYXRjaDxTdHJpbmc+IGRpc3BhdGNoID0gc2VydmljZTEuY3JlYXRlRGlzcGF0Y2godmFsaWRQb3J0UU5hbWUsIFN0cmluZy5jbGFzcywgbnVsbCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZGlzcGF0Y2gpOwotICAgICAgICBBZGROdW1iZXJzUG9ydFR5cGUgYWRkTnVtYmVyc1BvcnRTMVAxID0gc2VydmljZTEuZ2V0UG9ydCh2YWxpZFBvcnRRTmFtZSwgQWRkTnVtYmVyc1BvcnRUeXBlLmNsYXNzKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChhZGROdW1iZXJzUG9ydFMxUDEpOwotICAgICAgICAKLSAgICAgICAgLy8gQ3JlYXRlIERpc3BhdGNoIHNob3VsZCBOT1Qgd29yayBvbiBhIGR5bmFtaWMgcG9ydCB0aGF0IGhhcyBub3QgYmVlbiBhZGRlZCB5ZXQKLSAgICAgICAgLy8gYnV0IHNob3VsZCB3b3JrIGFmdGVyIGl0IGhhcyBiZWVuIGFkZGVkCi0gICAgICAgIFFOYW1lIGFkZGVkUG9ydCA9IG5ldyBRTmFtZShWQUxJRF9TRVJWSUNFX05BTUVTUEFDRSwgImFkZGVkUG9ydFMxUDEiKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIERpc3BhdGNoPFN0cmluZz4gZGlzcGF0Y2gyID0gc2VydmljZTEuY3JlYXRlRGlzcGF0Y2goYWRkZWRQb3J0LCBTdHJpbmcuY2xhc3MsIG51bGwpOwotICAgICAgICAgICAgZmFpbCgiQ3JlYXRlIERpc3BhdGNoIG9uIG5vbi1leGlzdGFudCBwb3J0IHNob3VsZCBoYXZlIHRocm93biBhbiBleGNlcHRpb24iKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoV2ViU2VydmljZUV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgLy8gRXhwZWN0ZWQgcGF0aAotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgZXhjZXB0aW9uIHRocm93biAiICsgZXgudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgc2VydmljZTEuYWRkUG9ydChhZGRlZFBvcnQsIG51bGwsIG51bGwpOwotICAgICAgICBEaXNwYXRjaDxTdHJpbmc+IGRpc3BhdGNoMiA9IHNlcnZpY2UxLmNyZWF0ZURpc3BhdGNoKGFkZGVkUG9ydCwgU3RyaW5nLmNsYXNzLCBudWxsKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChkaXNwYXRjaDIpOwotCi0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVEaXNwYXRjaE5vV1NETCgpIHsKLSAgICAgICAgCi0gICAgICAgIC8vIE5vdGUgdGhhdCB0aGlzIHRlc3QgaXMgaW50ZW50aW9uYWxseSB1c2luZyB0aGUgc2FtZSBuYW1lcyBhcyB0aGUgV1NETCB0ZXN0LCBldmVuIHRob3VnaCBubyBXU0RMIGlzCi0gICAgICAgIC8vIHByb3ZpZGVkLiAgVGhpcyBpcyB0byB2ZXJpZnkgdGhhdCB1c2luZyB0aGUgc2FtZSBuYW1lcyBpbiB0aGUgYWJzY2Vuc2Ugb2YgV1NETCBkb2Vzbid0IGNhdXNlIGFueQotICAgICAgICAvLyBpc3N1ZXMuCi0gICAgICAgIAotICAgICAgICBRTmFtZSBzZXJ2aWNlMVFOID0gbmV3IFFOYW1lKFZBTElEX1NFUlZJQ0VfTkFNRVNQQUNFLCBWQUxJRF9TRVJWSUNFX0xPQ0FMUEFSVF8xKTsKLSAgICAgICAgU2VydmljZSBzZXJ2aWNlMSA9IFNlcnZpY2UuY3JlYXRlKHNlcnZpY2UxUU4pOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2UxKTsKLSAgICAgICAgLy8gQ3JlYXRlIERpc3BhdGNoIHNob3VsZCBOT1Qgd29yayBvbiBhIGR5bmFtaWMgcG9ydCBwcmlvciB0byBhIGdldFBvcnQKLSAgICAgICAgLy8gYnV0IHNob3VsZCB3b3JrIGFmdGVyIHRoZSBnZXRQb3J0IGNhdXNlcyB0aGUgcG9ydCB0byBiZSBhZGRlZC4KLSAgICAgICAgUU5hbWUgdmFsaWRQb3J0UU5hbWUgPSBuZXcgUU5hbWUoVkFMSURfU0VSVklDRV9OQU1FU1BBQ0UsIFZBTElEX1BPUlRfUzFQMSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBEaXNwYXRjaDxTdHJpbmc+IGRpc3BhdGNoID0gc2VydmljZTEuY3JlYXRlRGlzcGF0Y2godmFsaWRQb3J0UU5hbWUsIFN0cmluZy5jbGFzcywgbnVsbCk7Ci0gICAgICAgICAgICBmYWlsKCJDcmVhdGUgRGlzcGF0Y2ggb24gbm9uLWV4aXN0YW50IHBvcnQgc2hvdWxkIGhhdmUgdGhyb3duIGFuZCBleGNlcHRpb24iKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoV2ViU2VydmljZUV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgLy8gRXhwZWN0ZWQgcGF0aAotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgZXhjZXB0aW9uIHRocm93biAiICsgZXgudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgQWRkTnVtYmVyc1BvcnRUeXBlIGFkZE51bWJlcnNQb3J0UzFQMSA9IHNlcnZpY2UxLmdldFBvcnQodmFsaWRQb3J0UU5hbWUsIEFkZE51bWJlcnNQb3J0VHlwZS5jbGFzcyk7Ci0gICAgICAgIERpc3BhdGNoPFN0cmluZz4gZGlzcGF0Y2ggPSBzZXJ2aWNlMS5jcmVhdGVEaXNwYXRjaCh2YWxpZFBvcnRRTmFtZSwgU3RyaW5nLmNsYXNzLCBudWxsKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChkaXNwYXRjaCk7Ci0KLSAgICAgICAgLy8gQ3JlYXRlIERpc3BhdGNoIHNob3VsZCBOT1Qgd29yayBvbiBhIGR5bmFtaWMgcG9ydCB0aGF0IGhhcyBub3QgYmVlbiBhZGRlZCB5ZXQKLSAgICAgICAgLy8gYnV0IHNob3VsZCB3b3JrIGFmdGVyIGl0IGhhcyBiZWVuIGFkZGVkCi0gICAgICAgIFFOYW1lIGFkZGVkUG9ydCA9IG5ldyBRTmFtZShWQUxJRF9TRVJWSUNFX05BTUVTUEFDRSwgImFkZGVkUG9ydFMxUDEiKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIERpc3BhdGNoPFN0cmluZz4gZGlzcGF0Y2gyID0gc2VydmljZTEuY3JlYXRlRGlzcGF0Y2goYWRkZWRQb3J0LCBTdHJpbmcuY2xhc3MsIG51bGwpOwotICAgICAgICAgICAgZmFpbCgiQ3JlYXRlIERpc3BhdGNoIG9uIG5vbi1leGlzdGFudCBwb3J0IHNob3VsZCBoYXZlIHRocm93biBhbiBleGNlcHRpb24iKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoV2ViU2VydmljZUV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgLy8gRXhwZWN0ZWQgcGF0aAotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgZXhjZXB0aW9uIHRocm93biAiICsgZXgudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgc2VydmljZTEuYWRkUG9ydChhZGRlZFBvcnQsIG51bGwsIG51bGwpOwotICAgICAgICBEaXNwYXRjaDxTdHJpbmc+IGRpc3BhdGNoMiA9IHNlcnZpY2UxLmNyZWF0ZURpc3BhdGNoKGFkZGVkUG9ydCwgU3RyaW5nLmNsYXNzLCBudWxsKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChkaXNwYXRjaDIpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgYXNzZXJ0UU5hbWVJdGVyYXRvclNhbWVBc0xpc3QoSXRlcmF0b3I8UU5hbWU+IGl0ZXJhdG9yLCBMaXN0PFFOYW1lPiBsaXN0KSB7Ci0gICAgICAgIGludCBpdGVyYXRvclNpemUgPSAwOwotICAgICAgICBmb3IgKFFOYW1lIGl0ZXJhdG9yRWxlbWVudCA9IG51bGw7IGl0ZXJhdG9yLmhhc05leHQoKTsgKSB7IAotICAgICAgICAgICAgaXRlcmF0b3JFbGVtZW50ID0gaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgaXRlcmF0b3JTaXplKys7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGxpc3QuY29udGFpbnMoaXRlcmF0b3JFbGVtZW50KSk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKGxpc3Quc2l6ZSgpLCBpdGVyYXRvclNpemUpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9XU0RMRGVzY3JpcHRpb25UZXN0cy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL1dTRExEZXNjcmlwdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhN2I1YmIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL1dTRExEZXNjcmlwdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zcGkuU2VydmljZURlbGVnYXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MudW5pdFRlc3QuZWNoby5FY2hvUG9ydDsKLQotaW1wb3J0IGphdmF4Lmp3cy5XZWJNZXRob2Q7Ci1pbXBvcnQgamF2YXguandzLldlYlBhcmFtOwotaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbS5Nb2RlOwotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLndzLkRpc3BhdGNoOwotaW1wb3J0IGphdmF4LnhtbC53cy5Ib2xkZXI7Ci1pbXBvcnQgamF2YXgueG1sLndzLlJlcXVlc3RXcmFwcGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5SZXNwb25zZVdyYXBwZXI7Ci1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi0vKioKLSAqIERpcmVjdGx5IHRlc3QgdGhlIERlc2NyaXB0aW9uIGNsYXNzZXMgYnVpbHQgd2l0aCBhIFdTREwgZmlsZS4KLSAqLwotcHVibGljIGNsYXNzIFdTRExEZXNjcmlwdGlvblRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotICAgIAotICAgIHByaXZhdGUgU2VydmljZSBzZXJ2aWNlOwotICAgIHByaXZhdGUgU2VydmljZURlbGVnYXRlIHNlcnZpY2VEZWxlZ2F0ZTsKLSAgICBwcml2YXRlIFNlcnZpY2VEZXNjcmlwdGlvbiBzZXJ2aWNlRGVzY3JpcHRpb247Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURfUE9SVCA9ICJFY2hvUG9ydCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEX05BTUVTUEFDRSA9ICJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi90ZXN0cyI7Ci0gICAgcHJpdmF0ZSBRTmFtZSB2YWxpZFBvcnRRTmFtZSA9IG5ldyBRTmFtZShWQUxJRF9OQU1FU1BBQ0UsIFZBTElEX1BPUlQpOwotCi0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0gICAgICAgIC8vIENyZWF0ZSBhIG5ldyBzZXJ2aWNlIGZvciBlYWNoIHRlc3QgdG8gdGVzdCB2YXJpb3VzIHZhbGlkIGFuZCBpbnZhbGlkCi0gICAgICAgIC8vIGZsb3dzCi0gICAgICAgIFN0cmluZyBuYW1lc3BhY2VVUkkgPSBWQUxJRF9OQU1FU1BBQ0U7Ci0gICAgICAgIFN0cmluZyBsb2NhbFBhcnQgPSAiRWNob1NlcnZpY2UiOwotICAgICAgICBVUkwgd3NkbFVSTCA9IERlc2NyaXB0aW9uVGVzdFV0aWxzMi5nZXRXU0RMVVJMKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwod3NkbFVSTCk7Ci0gICAgICAgIHNlcnZpY2UgPSBTZXJ2aWNlLmNyZWF0ZSh3c2RsVVJMLCBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBsb2NhbFBhcnQpKTsKLSAgICAgICAgc2VydmljZURlbGVnYXRlID0gRGVzY3JpcHRpb25UZXN0VXRpbHMyLmdldFNlcnZpY2VEZWxlZ2F0ZShzZXJ2aWNlKTsKLSAgICAgICAgc2VydmljZURlc2NyaXB0aW9uID0gc2VydmljZURlbGVnYXRlLmdldFNlcnZpY2VEZXNjcmlwdGlvbigpOwotICAgIH0KLSAgICAKLSAgICAvKgotICAgICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICAqIFNlcnZpY2VEZXNjcmlwdGlvbiBUZXN0cwotICAgICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkTG9jYWxwYXJ0U2VydmljZUdldEVuZHBvaW50KCkgewotICAgICAgICBRTmFtZSBpbnZhbGlkUG9ydFFuYW1lID0gbmV3IFFOYW1lKFZBTElEX05BTUVTUEFDRSwgIkludmFsaWRFY2hvUG9ydCIpOwotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVuZHBvaW50RGVzY3JpcHRpb24gPSBzZXJ2aWNlRGVzY3JpcHRpb24uZ2V0RW5kcG9pbnREZXNjcmlwdGlvbihpbnZhbGlkUG9ydFFuYW1lKTsKLSAgICAgICAgYXNzZXJ0TnVsbCgiRW5kcG9pbnREZXNjcmlwdGlvbiBzaG91bGQgbm90IGJlIGZvdW5kIiwgZW5kcG9pbnREZXNjcmlwdGlvbik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEludmFsaWROYW1lc3BhY2VTZXJ2aWNlR2V0RW5kcG9pbnQoKSB7Ci0gICAgICAgIFFOYW1lIGludmFsaWRQb3J0UW5hbWUgPSBuZXcgUU5hbWUoImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL3Rlc3RzL0lOVkFMSUQiLCBWQUxJRF9QT1JUKTsKLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlbmRwb2ludERlc2NyaXB0aW9uID0gc2VydmljZURlc2NyaXB0aW9uLmdldEVuZHBvaW50RGVzY3JpcHRpb24oaW52YWxpZFBvcnRRbmFtZSk7Ci0gICAgICAgIGFzc2VydE51bGwoIkVuZHBvaW50RGVzY3JpcHRpb24gc2hvdWxkIG5vdCBiZSBmb3VuZCIsIGVuZHBvaW50RGVzY3JpcHRpb24pOwotICAgIH0KLQotICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIC8vIEVuZHBvaW50RGVzY3JpcHRpb24gVGVzdHMKLSAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRHZXRQb3J0V2l0aENsYXNzKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgRWNob1BvcnQgZWNob1BvcnQgPSBzZXJ2aWNlLmdldFBvcnQoRWNob1BvcnQuY2xhc3MpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiQ2F1Z2h0IHVuZXhwZWN0ZWQgZXhjZXB0aW9uIik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdFZhbGlkR2V0UG9ydFdpdGhDbGFzc0FuZFFOYW1lKCkgewotICAgICAgICBFY2hvUG9ydCBlY2hvUG9ydCA9IHNlcnZpY2UuZ2V0UG9ydCh2YWxpZFBvcnRRTmFtZSwgRWNob1BvcnQuY2xhc3MpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGVjaG9Qb3J0KTsKLQotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVuZHBvaW50RGVzYyA9IHNlcnZpY2VEZXNjcmlwdGlvbi5nZXRFbmRwb2ludERlc2NyaXB0aW9uKHZhbGlkUG9ydFFOYW1lKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChlbmRwb2ludERlc2MpOwotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVuZHBvaW50RGVzY1ZpYVNFSSA9IHNlcnZpY2VEZXNjcmlwdGlvbi5nZXRFbmRwb2ludERlc2NyaXB0aW9uKEVjaG9Qb3J0LmNsYXNzKVswXTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChlbmRwb2ludERlc2NWaWFTRUkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZW5kcG9pbnREZXNjLCBlbmRwb2ludERlc2NWaWFTRUkpOwotICAgICAgICAKLSAgICAgICAgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiBlbmRwb2ludEludGVyZmFjZURlc2MgPSBlbmRwb2ludERlc2MuZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbigpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGVuZHBvaW50SW50ZXJmYWNlRGVzYyk7Ci0gICAgICAgIENsYXNzIHNlaSA9IGVuZHBvaW50SW50ZXJmYWNlRGVzYy5nZXRTRUlDbGFzcygpOwotICAgICAgICBhc3NlcnRFcXVhbHMoRWNob1BvcnQuY2xhc3MsIHNlaSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZE11bHRpcGxlR2V0UG9ydCgpIHsKLSAgICAgICAgRWNob1BvcnQgZWNob1BvcnQgPSBzZXJ2aWNlLmdldFBvcnQodmFsaWRQb3J0UU5hbWUsIEVjaG9Qb3J0LmNsYXNzKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChlY2hvUG9ydCk7Ci0KLSAgICAgICAgRWNob1BvcnQgZWNob1BvcnQyID0gc2VydmljZS5nZXRQb3J0KHZhbGlkUG9ydFFOYW1lLCBFY2hvUG9ydC5jbGFzcyk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZWNob1BvcnQyKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdEludmFsaWRNdWx0aXBsZUdldFBvcnQoKSB7Ci0gICAgICAgIEVjaG9Qb3J0IGVjaG9Qb3J0ID0gc2VydmljZS5nZXRQb3J0KHZhbGlkUG9ydFFOYW1lLCBFY2hvUG9ydC5jbGFzcyk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZWNob1BvcnQpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBFY2hvUG9ydDIgZWNob1BvcnQyID0gc2VydmljZS5nZXRQb3J0KHZhbGlkUG9ydFFOYW1lLCBFY2hvUG9ydDIuY2xhc3MpOwotICAgICAgICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgY2F1Z2h0IGV4Y2VwdGlvbiIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChXZWJTZXJ2aWNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIEV4cGVjdGVkIGZsb3cKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIkNhdWdodCB1bmV4cGVjdGVkIGV4Y2VwdGlvbiIgKyBlKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdFZhbGlkQWRkUG9ydCgpIHsKLSAgICAgICAgUU5hbWUgZGlzcGF0Y2hQb3J0UU4gPSBuZXcgUU5hbWUoVkFMSURfTkFNRVNQQUNFLCAiZGlzcGF0Y2hQb3J0Iik7Ci0gICAgICAgIHNlcnZpY2UuYWRkUG9ydChkaXNwYXRjaFBvcnRRTiwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIAotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVuZHBvaW50RGVzYyA9IHNlcnZpY2VEZXNjcmlwdGlvbi5nZXRFbmRwb2ludERlc2NyaXB0aW9uKGRpc3BhdGNoUG9ydFFOLCBzZXJ2aWNlRGVsZWdhdGUpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGVuZHBvaW50RGVzYyk7Ci0gICAgICAgCi0gICAgICAgIEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24gZW5kcG9pbnRJbnRlcmZhY2VEZXNjID0gZW5kcG9pbnREZXNjLmdldEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24oKTsKLSAgICAgICAgYXNzZXJ0TnVsbChlbmRwb2ludEludGVyZmFjZURlc2MpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZEFkZFBvcnRFeGlzdHMoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzZXJ2aWNlLmFkZFBvcnQodmFsaWRQb3J0UU5hbWUsIG51bGwsIG51bGwpOwotICAgICAgICAgICAgZmFpbCgiU2hvdWxkbid0IGJlIGFibGUgdG8gYWRkIGEgcG9ydCB0aGF0IGV4aXN0cyBpbiB0aGUgV1NETCIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChXZWJTZXJ2aWNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIEV4cGVjdGVkIHBhdGgKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZEFkZFBvcnQoKSB7Ci0gICAgICAgIC8vIE51bGwgcG9ydFFuYW1lCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzZXJ2aWNlLmFkZFBvcnQobnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICBmYWlsKCJTaG91bGRuJ3QgYmUgYWJsZSB0byBhZGQgYSBwb3J0IHdpdGggYSBudWxsIFFOYW1lIik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFdlYlNlcnZpY2VFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gRXhwZWN0ZWQgcGF0aAotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBleGNlcHRpb24gY2F1Z2h0ICIgKyBlKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gRW1wdHkgUG9ydCBRTmFtZQotICAgICAgICB0cnkgewotICAgICAgICAgICAgc2VydmljZS5hZGRQb3J0KG5ldyBRTmFtZSgiIiwgIiIpLCBudWxsLCBudWxsKTsKLSAgICAgICAgICAgIGZhaWwoIlNob3VsZG4ndCBiZSBhYmxlIHRvIGFkZCBhbiBlbXB0eSBwb3J0IFFOYW1lIik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFdlYlNlcnZpY2VFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gRXhwZWN0ZWQgcGF0aAotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBleGNlcHRpb24gY2F1Z2h0ICIgKyBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEVtcHR5IGJpbmRpbmcgSUQKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNlcnZpY2UuYWRkUG9ydChuZXcgUU5hbWUoVkFMSURfTkFNRVNQQUNFLCAiZGlzcGF0Y2hQb3J0MiIpLCAiIiwgbnVsbCk7Ci0gICAgICAgICAgICBmYWlsKCJTaG91bGRuJ3QgYmUgYWJsZSB0byBhZGQgYSBwb3J0IHdpdGggYW4gZW1wdHkgYmluZGluZyB0eXBlIik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFdlYlNlcnZpY2VFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gRXhwZWN0ZWQgcGF0aAotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBleGNlcHRpb24gY2F1Z2h0ICIgKyBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEludmFsaWQgYmluZGluZyBJRAotICAgICAgICB0cnkgewotICAgICAgICAgICAgc2VydmljZS5hZGRQb3J0KG5ldyBRTmFtZShWQUxJRF9OQU1FU1BBQ0UsICJkaXNwYXRjaFBvcnQzIiksICJJbnZhbGlkQmluZGluZ1R5cGUiLCBudWxsKTsKLSAgICAgICAgICAgIGZhaWwoIlNob3VsZG4ndCBiZSBhYmxlIHRvIGFkZCBhIHBvcnQgd2l0aCBhbiBpbnZhbGlkIGJpbmRpbmcgdHlwZSIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChXZWJTZXJ2aWNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIEV4cGVjdGVkIHBhdGgKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgZXhjZXB0aW9uIGNhdWdodCAiICsgZSk7Ci0gICAgICAgIH0KLQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRBZGRBbmRHZXRQb3J0KCkgewotICAgICAgICBRTmFtZSBkaXNwYXRjaFBvcnRRTiA9IG5ldyBRTmFtZShWQUxJRF9OQU1FU1BBQ0UsICJkaXNwYXRjaFBvcnQiKTsKLSAgICAgICAgc2VydmljZS5hZGRQb3J0KGRpc3BhdGNoUG9ydFFOLCBudWxsLCBudWxsKTsKLSAgICAgICAgCi0gICAgICAgIEVjaG9Qb3J0IGVjaG9Qb3J0ID0gc2VydmljZS5nZXRQb3J0KHZhbGlkUG9ydFFOYW1lLCBFY2hvUG9ydC5jbGFzcyk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZWNob1BvcnQpOwotICAgICAgICAKLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlbmRwb2ludERlc2MgPSBzZXJ2aWNlRGVzY3JpcHRpb24uZ2V0RW5kcG9pbnREZXNjcmlwdGlvbih2YWxpZFBvcnRRTmFtZSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZW5kcG9pbnREZXNjKTsKLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlbmRwb2ludERlc2NWaWFTRUkgPSBzZXJ2aWNlRGVzY3JpcHRpb24uZ2V0RW5kcG9pbnREZXNjcmlwdGlvbihFY2hvUG9ydC5jbGFzcylbMF07Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZW5kcG9pbnREZXNjVmlhU0VJKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGVuZHBvaW50RGVzYywgZW5kcG9pbnREZXNjVmlhU0VJKTsKLSAgICAgICAgCi0gICAgICAgIEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24gZW5kcG9pbnRJbnRlcmZhY2VEZXNjID0gZW5kcG9pbnREZXNjLmdldEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24oKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChlbmRwb2ludEludGVyZmFjZURlc2MpOwotICAgICAgICBDbGFzcyBzZWkgPSBlbmRwb2ludEludGVyZmFjZURlc2MuZ2V0U0VJQ2xhc3MoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEVjaG9Qb3J0LmNsYXNzLCBzZWkpOwotCi0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZW5kcG9pbnREZXNjRGlzcGF0Y2ggPSBzZXJ2aWNlRGVzY3JpcHRpb24uZ2V0RW5kcG9pbnREZXNjcmlwdGlvbihkaXNwYXRjaFBvcnRRTiwgc2VydmljZURlbGVnYXRlKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChlbmRwb2ludERlc2NEaXNwYXRjaCk7Ci0gICAgICAgCi0gICAgICAgIEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24gZW5kcG9pbnRJbnRlcmZhY2VEZXNjRGlzcGF0Y2ggPSBlbmRwb2ludERlc2NEaXNwYXRjaC5nZXRFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgIGFzc2VydE51bGwoZW5kcG9pbnRJbnRlcmZhY2VEZXNjRGlzcGF0Y2gpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRDcmVhdGVEaXNwYXRjaCgpIHsKLSAgICAgICAgRGlzcGF0Y2g8U291cmNlPiBkaXNwYXRjaCA9IHNlcnZpY2UuY3JlYXRlRGlzcGF0Y2godmFsaWRQb3J0UU5hbWUsIFNvdXJjZS5jbGFzcywgU2VydmljZS5Nb2RlLlBBWUxPQUQpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGRpc3BhdGNoKTsKLQotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVuZHBvaW50RGVzYyA9IHNlcnZpY2VEZXNjcmlwdGlvbi5nZXRFbmRwb2ludERlc2NyaXB0aW9uKHZhbGlkUG9ydFFOYW1lKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChlbmRwb2ludERlc2MpOwotICAgICAgICAvLyBTaW5jZSB0aGVyIGlzIG5vIFNFSSwgY2FuIG5vdCBnZXQgdGhlIGVuZHBvaW50RGVzY3JpcHRpb24gYmFzZWQgb24gdGhlIHNlaSBjbGFzcwotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uW10gZW5kcG9pbnREZXNjVmlhU0VJID0gc2VydmljZURlc2NyaXB0aW9uLmdldEVuZHBvaW50RGVzY3JpcHRpb24oRWNob1BvcnQuY2xhc3MpOwotICAgICAgICBhc3NlcnROdWxsKGVuZHBvaW50RGVzY1ZpYVNFSSk7Ci0gICAgICAgIAotICAgICAgICAvLyBUaGVyZSB3aWxsIGJlIGFuIEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24gYmVjYXVzZSB0aGUgc2VydmljZSB3YXMgY3JlYXRlZCB3aXRoIAotICAgICAgICAvLyBXU0RMLCBob3dldmVyIHRoZXJlIHdpbGwgYmUgbm8gU0VJIGNyZWF0ZWQgYmVjYXVzZSBhIGdldFBvcnQgaGFzIG5vdCBiZWVuIGRvbmUKLSAgICAgICAgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiBlbmRwb2ludEludGVyZmFjZURlc2MgPSBlbmRwb2ludERlc2MuZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbigpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGVuZHBvaW50SW50ZXJmYWNlRGVzYyk7Ci0gICAgICAgIGFzc2VydE51bGwoZW5kcG9pbnRJbnRlcmZhY2VEZXNjLmdldFNFSUNsYXNzKCkpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRDcmVhdGVBbmRHZXQoKSB7Ci0gICAgICAgIERpc3BhdGNoPFNvdXJjZT4gZGlzcGF0Y2ggPSBzZXJ2aWNlLmNyZWF0ZURpc3BhdGNoKHZhbGlkUG9ydFFOYW1lLCBTb3VyY2UuY2xhc3MsIFNlcnZpY2UuTW9kZS5QQVlMT0FEKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChkaXNwYXRjaCk7Ci0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZW5kcG9pbnREZXNjID0gc2VydmljZURlc2NyaXB0aW9uLmdldEVuZHBvaW50RGVzY3JpcHRpb24odmFsaWRQb3J0UU5hbWUpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGVuZHBvaW50RGVzYyk7Ci0gICAgICAgIC8vIFNpbmNlIHRoZXIgaXMgbm8gU0VJLCBjYW4gbm90IGdldCB0aGUgZW5kcG9pbnREZXNjcmlwdGlvbiBiYXNlZCBvbiB0aGUgc2VpIGNsYXNzCi0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb25bXSBlbmRwb2ludERlc2NWaWFTRUkgPSBzZXJ2aWNlRGVzY3JpcHRpb24uZ2V0RW5kcG9pbnREZXNjcmlwdGlvbihFY2hvUG9ydC5jbGFzcyk7Ci0gICAgICAgIGFzc2VydE51bGwoZW5kcG9pbnREZXNjVmlhU0VJKTsKLSAgICAgICAgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiBlbmRwb2ludEludGVyZmFjZURlc2MgPSBlbmRwb2ludERlc2MuZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbigpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGVuZHBvaW50SW50ZXJmYWNlRGVzYyk7Ci0gICAgICAgIGFzc2VydE51bGwoZW5kcG9pbnRJbnRlcmZhY2VEZXNjLmdldFNFSUNsYXNzKCkpOwotCi0gICAgICAgIEVjaG9Qb3J0IGVjaG9Qb3J0ID0gc2VydmljZS5nZXRQb3J0KHZhbGlkUG9ydFFOYW1lLCBFY2hvUG9ydC5jbGFzcyk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZWNob1BvcnQpOwotICAgICAgICAvLyBTaW5jZSBhIGdldFBvcnQgaGFzIGJlZW4gZG9uZSwgc2hvdWxkIG5vdyBiZSBhYmxlIHRvIGdldCB0aGluZ3MgYmFzZWQgb24gdGhlIFNFSQotICAgICAgICBlbmRwb2ludERlc2MgPSBzZXJ2aWNlRGVzY3JpcHRpb24uZ2V0RW5kcG9pbnREZXNjcmlwdGlvbih2YWxpZFBvcnRRTmFtZSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZW5kcG9pbnREZXNjKTsKLSAgICAgICAgLy8gU2luY2UgdGhlciBpcyBubyBTRUksIGNhbiBub3QgZ2V0IHRoZSBlbmRwb2ludERlc2NyaXB0aW9uIGJhc2VkIG9uIHRoZSBzZWkgY2xhc3MKLSAgICAgICAgZW5kcG9pbnREZXNjVmlhU0VJID0gc2VydmljZURlc2NyaXB0aW9uLmdldEVuZHBvaW50RGVzY3JpcHRpb24oRWNob1BvcnQuY2xhc3MpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGVuZHBvaW50RGVzY1ZpYVNFSSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhlbmRwb2ludERlc2MsIGVuZHBvaW50RGVzY1ZpYVNFSVswXSk7Ci0gICAgICAgIGVuZHBvaW50SW50ZXJmYWNlRGVzYyA9IGVuZHBvaW50RGVzYy5nZXRFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZW5kcG9pbnRJbnRlcmZhY2VEZXNjKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEVjaG9Qb3J0LmNsYXNzLCBlbmRwb2ludEludGVyZmFjZURlc2MuZ2V0U0VJQ2xhc3MoKSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZEdldEFuZENyZWF0ZSgpIHsKLSAgICAgICAgRWNob1BvcnQgZWNob1BvcnQgPSBzZXJ2aWNlLmdldFBvcnQodmFsaWRQb3J0UU5hbWUsIEVjaG9Qb3J0LmNsYXNzKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChlY2hvUG9ydCk7Ci0gICAgICAgIERpc3BhdGNoPFNvdXJjZT4gZGlzcGF0Y2ggPSBzZXJ2aWNlLmNyZWF0ZURpc3BhdGNoKHZhbGlkUG9ydFFOYW1lLCBTb3VyY2UuY2xhc3MsIFNlcnZpY2UuTW9kZS5QQVlMT0FEKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChkaXNwYXRjaCk7Ci0KLSAgICAgICAgLy8gU2luY2UgYSBnZXRQb3J0IGhhcyBiZWVuIGRvbmUsIHNob3VsZCBub3cgYmUgYWJsZSB0byBnZXQgdGhpbmdzIGJhc2VkIG9uIHRoZSBTRUkKLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlbmRwb2ludERlc2MgPSBzZXJ2aWNlRGVzY3JpcHRpb24uZ2V0RW5kcG9pbnREZXNjcmlwdGlvbih2YWxpZFBvcnRRTmFtZSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZW5kcG9pbnREZXNjKTsKLSAgICAgICAgLy8gU2luY2UgdGhlciBpcyBubyBTRUksIGNhbiBub3QgZ2V0IHRoZSBlbmRwb2ludERlc2NyaXB0aW9uIGJhc2VkIG9uIHRoZSBzZWkgY2xhc3MKLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbltdIGVuZHBvaW50RGVzY1ZpYVNFSSA9IHNlcnZpY2VEZXNjcmlwdGlvbi5nZXRFbmRwb2ludERlc2NyaXB0aW9uKEVjaG9Qb3J0LmNsYXNzKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChlbmRwb2ludERlc2NWaWFTRUkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZW5kcG9pbnREZXNjLCBlbmRwb2ludERlc2NWaWFTRUlbMF0pOwotICAgICAgICBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uIGVuZHBvaW50SW50ZXJmYWNlRGVzYyA9IGVuZHBvaW50RGVzYy5nZXRFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZW5kcG9pbnRJbnRlcmZhY2VEZXNjKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEVjaG9Qb3J0LmNsYXNzLCBlbmRwb2ludEludGVyZmFjZURlc2MuZ2V0U0VJQ2xhc3MoKSk7Ci0gICAgfQotICAgIC8vIFRPRE86IE5lZWQgdG8gYWRkIGEgc2ltaWxhciB0ZXN0IHdpdGggbm8gV1NETCBwcmVzZW50OyBub3RlIHRoYXQgaXQgY3VycmVudGx5IHdvdWxkIG5vdCBwYXNzCi0gICAgcHVibGljIHZvaWQgdGVzdEludmFsaWRBZGRBbmRHZXRQb3J0KCkgewotICAgICAgICAvLyBTaG91bGQgbm90IGJlIGFibGUgdG8gZG8gYSBnZXRQb3J0IG9uIG9uZSB0aGF0IHdhcyBhZGRlZCB3aXRoIGFkZFBvcnQKLSAgICAgICAgUU5hbWUgZGlzcGF0Y2hQb3J0UU4gPSBuZXcgUU5hbWUoVkFMSURfTkFNRVNQQUNFLCAiZGlzcGF0Y2hQb3J0Iik7Ci0gICAgICAgIHNlcnZpY2UuYWRkUG9ydChkaXNwYXRjaFBvcnRRTiwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBFY2hvUG9ydCBlY2hvUG9ydCA9IHNlcnZpY2UuZ2V0UG9ydChkaXNwYXRjaFBvcnRRTiwgRWNob1BvcnQuY2xhc3MpOwotICAgICAgICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIGEgV2ViU2VydmljZUV4Y2VwdGlvbiIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChXZWJTZXJ2aWNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIEV4cGVjdGVkIHBhdGgKLSAgICAgICAgfQotICAgIH0KLX0KLQotLy8gRWNob1BvcnQyIGlzIGlkZW50aWNhbCB0byBFY2hvUG9ydCwgYnV0IGl0IHNob3VsZCBzdGlsbCBjYXVzZSBhbiBleGNlcHRpb24KLS8vIGlmIGl0IGlzIHVzZWQgb24gYSBzdWJzZXF1ZW50IGdldFBvcnQgYWZ0ZXIgZ2V0UG9ydChFY2hvUG9ydC5jbGFzcykgaXMgZG9uZS4KLUBXZWJTZXJ2aWNlKG5hbWUgPSAiRWNob1BvcnQiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvdGVzdHMiLCB3c2RsTG9jYXRpb24gPSAiXFx3b3JrXFxhcHBzXFxlY2xpcHNlXFx3b3Jrc3BhY2VcXGF4aXMyLWxpdmVcXG1vZHVsZXNcXGpheHdzXFx0ZXN0LXJlc291cmNlc1xcd3NkbFxcV1NETFRlc3RzLndzZGwiKQotaW50ZXJmYWNlIEVjaG9Qb3J0MiB7Ci0KLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEBwYXJhbSB0ZXh0Ci0gICAgICovCi0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lID0gIkVjaG8iLCBhY3Rpb24gPSAiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvdGVzdHMvZWNobyIpCi0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJFY2hvIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL3Rlc3RzIiwgY2xhc3NOYW1lID0gIm9yZy5hcGFjaGUud3MuYXhpczIudGVzdHMuRWNobyIpCi0gICAgQFJlc3BvbnNlV3JhcHBlcihsb2NhbE5hbWUgPSAiRWNob1Jlc3BvbnNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL3Rlc3RzIiwgY2xhc3NOYW1lID0gIm9yZy5hcGFjaGUud3MuYXhpczIudGVzdHMuRWNob1Jlc3BvbnNlIikKLSAgICBwdWJsaWMgdm9pZCBlY2hvKAotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJ0ZXh0IiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIsIG1vZGUgPSBNb2RlLklOT1VUKQotICAgICAgICBIb2xkZXI8U3RyaW5nPiB0ZXh0KTsKLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL1dTRExUZXN0cy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL1dTRExUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTY2MjM0Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9XU0RMVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc3BpLlNlcnZpY2VEZWxlZ2F0ZTsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi0vKioKLSAqIFRlc3RzIGJ1aWxkaW5nIGEgU2VydmljZURlc2NyaXB0aW9uIHVzaW5nIFdTREwgYW5kIHRoZSBKQVhXUyBTZXJ2aWNlIEFQSS4gIAotICogTm90ZSB0aGF0IGEgU2VydmljZURlc2NyaXB0aW9uIGlzIGJ1aWx0IHdoZW4gYSBqYXZheC54bWwud3MuU2VydmljZSBpcyBjcmVhdGVkLiAgU2luY2UgdGhhdCBpcyB0aGUgYWN0dWFsIEFQSSAKLSAqIHRoYXQgc2hvdWxkIGJlIHVzZWQsIHRoaXMgdGVzdCB3aWxsIGNyZWF0ZSBTZXJ2aWNlIG9iamVjdHMgYW5kIHRoZW4gdXNlIGludHJvc3BlY3Rpb24KLSAqIHRvIGNoZWNrIHRoZSB1bmRlcmx5aW5nIFNlcnZpY2VEZWxlZ2F0ZSB3aGljaCBjb250YWlucyB0aGUgU2VydmljZURlc2NyaXB0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgV1NETFRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZFdTRExTZXJ2aWNlKCkgewotICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSBudWxsOwotICAgICAgICBTZXJ2aWNlRGVsZWdhdGUgc2VydmljZURlbGVnYXRlID0gbnVsbDsKLSAKLSAgICAgICAgU3RyaW5nIG5hbWVzcGFjZVVSST0gImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL3Rlc3RzIjsKLSAgICAgICAgU3RyaW5nIGxvY2FsUGFydCA9ICJFY2hvU2VydmljZSI7Ci0gICAgICAgIFVSTCB3c2RsVVJMID0gRGVzY3JpcHRpb25UZXN0VXRpbHMyLmdldFdTRExVUkwoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh3c2RsVVJMKTsKLSAgICAgICAgc2VydmljZSA9IFNlcnZpY2UuY3JlYXRlKHdzZGxVUkwsIG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIGxvY2FsUGFydCkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKCJTZXJ2aWNlIG5vdCBjcmVhdGVkIiwgc2VydmljZSk7Ci0KLSAgICAgICAgc2VydmljZURlbGVnYXRlID0gRGVzY3JpcHRpb25UZXN0VXRpbHMyLmdldFNlcnZpY2VEZWxlZ2F0ZShzZXJ2aWNlKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgiU2VydmljZURlbGVnYXRlIG5vdCBjcmVhdGVkIiwgc2VydmljZURlbGVnYXRlKTsKLSAgICAgICAgCi0gICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzZXJ2aWNlRGVzY3JpcHRpb24gPSBzZXJ2aWNlRGVsZWdhdGUuZ2V0U2VydmljZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoIlNlcnZpY2VEZXNjcmlwdGlvbiBub3QgY3JlYXRlZCIsIHNlcnZpY2VEZXNjcmlwdGlvbik7Ci0gICAgICAgIAotLy8gICAgICAgIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlID0gc2VydmljZURlc2NyaXB0aW9uLmdldEF4aXNTZXJ2aWNlKCk7Ci0vLyAgICAgICAgYXNzZXJ0Tm90TnVsbCgiQXhpc1NlcnZpY2Ugbm90IGNyZWF0ZWQiLCBheGlzU2VydmljZSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkU2VydmljZUxvY2FsTmFtZSgpIHsKLSAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gbnVsbDsKLSAKLSAgICAgICAgU3RyaW5nIG5hbWVzcGFjZVVSST0gImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL3Rlc3RzIjsKLSAgICAgICAgU3RyaW5nIGxvY2FsUGFydCA9ICJCQURFY2hvU2VydmljZSI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBVUkwgd3NkbFVSTCA9IERlc2NyaXB0aW9uVGVzdFV0aWxzMi5nZXRXU0RMVVJMKCk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHdzZGxVUkwpOwotICAgICAgICAgICAgc2VydmljZSA9IFNlcnZpY2UuY3JlYXRlKHdzZGxVUkwsIG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIGxvY2FsUGFydCkpOwotICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIHNob3VsZCBoYXZlIGJlZW4gdGhyb3duIGZvciBpbnZhbGlkIFNlcnZpY2UgbmFtZSIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChXZWJTZXJ2aWNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIGV4cGVjdGVkIGZsb3c7IGl0IGlzIHJlYWxseSBtb3JlIGEgdGVzdCBvZiBTZXJ2aWNlRGVsZWdhdGUgdGhhdCBTZXJ2aWNlRGVzY3JpcHRpb24KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3ROdWxsV1NETExvY2F0aW9uKCkgewotICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSBudWxsOwotCi0gICAgICAgIFN0cmluZyBuYW1lc3BhY2VVUkk9ICJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi90ZXN0cyI7Ci0gICAgICAgIFN0cmluZyBsb2NhbFBhcnQgPSAiRWNob1NlcnZpY2VfbnVsbFdTREwiOwotICAgICAgICBzZXJ2aWNlID0gU2VydmljZS5jcmVhdGUobmV3IFFOYW1lKG5hbWVzcGFjZVVSSSwgbG9jYWxQYXJ0KSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoIlNlcnZpY2Ugbm90IGNyZWF0ZWQiLCBzZXJ2aWNlKTsKLSAgICAgICAgCi0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3ROdWxsU2VydmljZU5hbWUoKSB7Ci0gICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IG51bGw7Ci0gICAgICAgIAotICAgICAgICB0cnkgewotICAgICAgICAgICAgc2VydmljZSA9IFNlcnZpY2UuY3JlYXRlKG51bGwpOwotICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIHNob3VsZCBoYXZlIGJlZW4gdGhyb3duIGZvciBudWxsIFNlcnZpY2UgbmFtZSIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChXZWJTZXJ2aWNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIGV4cGVjdGVkIGZsb3c7IGl0IGlzIHJlYWxseSBtb3JlIGEgdGVzdCBvZiBTZXJ2aWNlRGVsZWdhdGUgdGhhdCBTZXJ2aWNlRGVzY3JpcHRpb24KLSAgICAgICAgICAgIC8vIGJ1dCB3ZSBhcmUgdmVyaWZ5aW5nIGV4cGVjdGVkIGJlaGF2aW9yLgotICAgICAgICB9Ci0gICAgICAgIAotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9zYW1wbGUvYWRkbnVtYmVycy9BZGROdW1iZXJzRmF1bHRfRXhjZXB0aW9uLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vc2FtcGxlL2FkZG51bWJlcnMvQWRkTnVtYmVyc0ZhdWx0X0V4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzE1ZGNjLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9zYW1wbGUvYWRkbnVtYmVycy9BZGROdW1iZXJzRmF1bHRfRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uc2FtcGxlLmFkZG51bWJlcnM7Ci0KLWltcG9ydCBvcmcudGVzdC5hZGRudW1iZXJzLkFkZE51bWJlcnNGYXVsdDsKLQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJGYXVsdDsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBieSB0aGUgSkFYV1MgU0kuCi0gKiBKQVgtV1MgUkkgMi4wXzAxLWIxNS1mY3MKLSAqIEdlbmVyYXRlZCBzb3VyY2UgdmVyc2lvbjogMi4wCi0gKiAKLSAqLwotQFdlYkZhdWx0KGZhdWx0QmVhbj0iIiwgbmFtZSA9ICJBZGROdW1iZXJzRmF1bHQiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL2R1a2Uvb3JnIikKLXB1YmxpYyBjbGFzcyBBZGROdW1iZXJzRmF1bHRfRXhjZXB0aW9uCi0gICAgZXh0ZW5kcyBFeGNlcHRpb24KLXsKLQotICAgIC8qKgotICAgICAqIEphdmEgdHlwZSB0aGF0IGdvZXMgYXMgc29hcGVudjpGYXVsdCBkZXRhaWwgZWxlbWVudC4KLSAgICAgKiAKLSAgICAgKi8KLSAgICBwcml2YXRlIEFkZE51bWJlcnNGYXVsdCBmYXVsdEluZm87Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZmF1bHRJbmZvCi0gICAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgQWRkTnVtYmVyc0ZhdWx0X0V4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgQWRkTnVtYmVyc0ZhdWx0IGZhdWx0SW5mbykgewotICAgICAgICBzdXBlcihtZXNzYWdlKTsKLSAgICAgICAgdGhpcy5mYXVsdEluZm8gPSBmYXVsdEluZm87Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHBhcmFtIGZhdWx0SW5mbwotICAgICAqIEBwYXJhbSBtZXNzYWdlCi0gICAgICogQHBhcmFtIGNhdXNlCi0gICAgICovCi0gICAgcHVibGljIEFkZE51bWJlcnNGYXVsdF9FeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIEFkZE51bWJlcnNGYXVsdCBmYXVsdEluZm8sIFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlLCBjYXVzZSk7Ci0gICAgICAgIHRoaXMuZmF1bHRJbmZvID0gZmF1bHRJbmZvOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEByZXR1cm4KLSAgICAgKiAgICAgcmV0dXJucyBmYXVsdCBiZWFuOiBkdWtlLm9yZy5BZGROdW1iZXJzRmF1bHQKLSAgICAgKi8KLSAgICBwdWJsaWMgQWRkTnVtYmVyc0ZhdWx0IGdldEZhdWx0SW5mbygpIHsKLSAgICAgICAgcmV0dXJuIGZhdWx0SW5mbzsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9zYW1wbGUvYWRkbnVtYmVycy9BZGROdW1iZXJzUG9ydFR5cGUuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9zYW1wbGUvYWRkbnVtYmVycy9BZGROdW1iZXJzUG9ydFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2IyOWJkYi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vc2FtcGxlL2FkZG51bWJlcnMvQWRkTnVtYmVyc1BvcnRUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uc2FtcGxlLmFkZG51bWJlcnM7Ci0KLWltcG9ydCBqYXZheC5qd3MuT25ld2F5OwotaW1wb3J0IGphdmF4Lmp3cy5XZWJNZXRob2Q7Ci1pbXBvcnQgamF2YXguandzLldlYlBhcmFtOwotaW1wb3J0IGphdmF4Lmp3cy5XZWJSZXN1bHQ7Ci1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7Ci1pbXBvcnQgamF2YXgueG1sLndzLlJlcXVlc3RXcmFwcGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5SZXNwb25zZVdyYXBwZXI7Ci0KLQotCi0KLS8qKgotICogVGhpcyBjbGFzcyB3YXMgZ2VuZXJhdGVkIGJ5IHRoZSBKQVhXUyBTSS4KLSAqIEpBWC1XUyBSSSAyLjBfMDEtYjE1LWZjcwotICogR2VuZXJhdGVkIHNvdXJjZSB2ZXJzaW9uOiAyLjAKLSAqIAotICovCi1AV2ViU2VydmljZShuYW1lID0gIkFkZE51bWJlcnNQb3J0VHlwZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL3Rlc3QvYWRkbnVtYmVycyIpCi1wdWJsaWMgaW50ZXJmYWNlIEFkZE51bWJlcnNQb3J0VHlwZSB7Ci0KLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEBwYXJhbSBhcmcxCi0gICAgICogQHBhcmFtIGFyZzAKLSAgICAgKiBAcmV0dXJuCi0gICAgICogICAgIHJldHVybnMgaW50Ci0gICAgICogQHRocm93cyBBZGROdW1iZXJzRmF1bHRfRXhjZXB0aW9uCi0gICAgICovCi0gICAgQFdlYk1ldGhvZAotICAgIEBXZWJSZXN1bHQodGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9hZGRudW1iZXJzIikKLSAgICBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gImFkZE51bWJlcnMiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L2FkZG51bWJlcnMiLCBjbGFzc05hbWUgPSAib3JnLnRlc3QuYWRkbnVtYmVycy5BZGROdW1iZXJzIikKLSAgICBAUmVzcG9uc2VXcmFwcGVyKGxvY2FsTmFtZSA9ICJhZGROdW1iZXJzUmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L2FkZG51bWJlcnMiLCBjbGFzc05hbWUgPSAib3JnLnRlc3QuYWRkbnVtYmVycy5BZGROdW1iZXJzUmVzcG9uc2UiKQotICAgIHB1YmxpYyBpbnQgYWRkTnVtYmVycygKLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiYXJnMCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL3Rlc3QvYWRkbnVtYmVycyIpCi0gICAgICAgIGludCBhcmcwLAotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJhcmcxIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9hZGRudW1iZXJzIikKLSAgICAgICAgaW50IGFyZzEpCi0gICAgICAgIHRocm93cyBBZGROdW1iZXJzRmF1bHRfRXhjZXB0aW9uCi0gICAgOwotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHBhcmFtIGFyZzAKLSAgICAgKi8KLSAgICBAV2ViTWV0aG9kCi0gICAgQE9uZXdheQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAib25lV2F5SW50IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9hZGRudW1iZXJzIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LmFkZG51bWJlcnMuT25lV2F5SW50IikKLSAgICBwdWJsaWMgdm9pZCBvbmVXYXlJbnQoCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImFyZzAiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L2FkZG51bWJlcnMiKQotICAgICAgICBpbnQgYXJnMCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9zYW1wbGUvYWRkbnVtYmVycy9BZGROdW1iZXJzUG9ydFR5cGVJbXBsLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vc2FtcGxlL2FkZG51bWJlcnMvQWRkTnVtYmVyc1BvcnRUeXBlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzUxOWEyLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9zYW1wbGUvYWRkbnVtYmVycy9BZGROdW1iZXJzUG9ydFR5cGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uc2FtcGxlLmFkZG51bWJlcnM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnVuaXRUZXN0LlRlc3RMb2dnZXI7Ci0KLWltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlJlc291cmNlOwotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlQ29udGV4dDsKLWltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0KLUBXZWJTZXJ2aWNlKHNlcnZpY2VOYW1lPSJBZGROdW1iZXJzU2VydmljZSIsZW5kcG9pbnRJbnRlcmZhY2U9Im9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uc2FtcGxlLmFkZG51bWJlcnMuQWRkTnVtYmVyc1BvcnRUeXBlIikKLXB1YmxpYyBjbGFzcyBBZGROdW1iZXJzUG9ydFR5cGVJbXBsIGltcGxlbWVudHMgQWRkTnVtYmVyc1BvcnRUeXBlIHsKLQotICAgIEBSZXNvdXJjZQotICAgIHByaXZhdGUgV2ViU2VydmljZUNvbnRleHQgY3R4OwotICAgIAotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLmFkZG51bWJlcnMuQWRkTnVtYmVyc1BvcnRUeXBlI2FkZE51bWJlcnMoaW50LCBpbnQpCi0JICovCi0JcHVibGljIGludCBhZGROdW1iZXJzKGludCBhcmcwLCBpbnQgYXJnMSkgdGhyb3dzIEFkZE51bWJlcnNGYXVsdF9FeGNlcHRpb24gewotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gUmVjZWl2ZWQgYWRkTnVtYmVycyByZXF1ZXN0IGZvciAiICsgYXJnMCArICIgYW5kICIgKyBhcmcxKTsKLSAgICAgICAgCi0gICAgICAgIGNoZWNrUHJvcGVydGllcygpOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGFyZzArYXJnMTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNoZWNrUHJvcGVydGllcygpIHsKLQkgICAgTWVzc2FnZUNvbnRleHQgbWMgPSBjdHguZ2V0TWVzc2FnZUNvbnRleHQoKTsKLQkgICAgTWFwIGhlYWRlcnMgPSAoTWFwKW1jLmdldChNZXNzYWdlQ29udGV4dC5IVFRQX1JFUVVFU1RfSEVBREVSUyk7Ci0JICAgIC8vIHRoZSBtYXAgc2hvdWxkIGNvbnRhaW4gc29tZSBoZWFkZXJzCi0JICAgIGlmIChoZWFkZXJzID09IG51bGwgfHwgaGVhZGVycy5pc0VtcHR5KCkpIHsKLQkgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJIVFRQIHJlcXVlc3QgaGVhZGVycyBtYXAgaXMgbnVsbCBvciBlbXB0eSEiKTsKLQkgICAgfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLmFkZG51bWJlcnMuQWRkTnVtYmVyc1BvcnRUeXBlI29uZVdheUludChpbnQpCi0JICovCi0JcHVibGljIHZvaWQgb25lV2F5SW50KGludCBhcmcwKSB7Ci0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBSZWNlaXZlZCBvbmUtd2F5IHJlcXVlc3QuIik7Ci0gICAgICAgIHJldHVybjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9zYW1wbGUvYWRkbnVtYmVycy9BZGROdW1iZXJzU2VydmljZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3NhbXBsZS9hZGRudW1iZXJzL0FkZE51bWJlcnNTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyYTljN2MuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3NhbXBsZS9hZGRudW1iZXJzL0FkZE51bWJlcnNTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5zYW1wbGUuYWRkbnVtYmVyczsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYkVuZHBvaW50OwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlQ2xpZW50OwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi0vKioKLSAqIFRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBieSB0aGUgSkFYV1MgU0kuCi0gKiBKQVgtV1MgUkkgMi4wXzAxLWIxNS1mY3MKLSAqIEdlbmVyYXRlZCBzb3VyY2UgdmVyc2lvbjogMi4wCi0gKiAKLSAqLwotQFdlYlNlcnZpY2VDbGllbnQobmFtZSA9ICJBZGROdW1iZXJzU2VydmljZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL3Rlc3QvYWRkbnVtYmVycyIsIHdzZGxMb2NhdGlvbiA9ICJBZGROdW1iZXJzMS53c2RsIikKLXB1YmxpYyBjbGFzcyBBZGROdW1iZXJzU2VydmljZQotICAgIGV4dGVuZHMgU2VydmljZQotewotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgVVJMIEFERE5VTUJFUlNTRVJWSUNFX1dTRExfTE9DQVRJT047Ci0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHdzZGxMb2NhdGlvbj0iL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkbnVtYmVycy9NRVRBLUlORi9BZGROdW1iZXJzLndzZGwiOwotICAgIHN0YXRpYyB7Ci0gICAgICAgIFVSTCB1cmwgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAJdHJ5ewotCSAgICAgICAgCVN0cmluZyBiYXNlRGlyID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJiYXNlZGlyIiwiLiIpKS5nZXRDYW5vbmljYWxQYXRoKCk7Ci0JICAgICAgICAJd3NkbExvY2F0aW9uID0gbmV3IEZpbGUoYmFzZURpciArIHdzZGxMb2NhdGlvbikuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0gICAgICAgIAl9Y2F0Y2goRXhjZXB0aW9uIGUpewotICAgICAgICAJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIAl9Ci0gICAgICAgIAlGaWxlIGZpbGUgPSBuZXcgRmlsZSh3c2RsTG9jYXRpb24pOwotICAgICAgICAJdXJsID0gZmlsZS50b1VSTCgpOwotICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgICAgICBBREROVU1CRVJTU0VSVklDRV9XU0RMX0xPQ0FUSU9OID0gdXJsOwotICAgIH0KLQotICAgIHB1YmxpYyBBZGROdW1iZXJzU2VydmljZShVUkwgd3NkbExvY2F0aW9uLCBRTmFtZSBzZXJ2aWNlTmFtZSkgewotICAgICAgICBzdXBlcih3c2RsTG9jYXRpb24sIHNlcnZpY2VOYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQWRkTnVtYmVyc1NlcnZpY2UoKSB7Ci0gICAgICAgIHN1cGVyKEFERE5VTUJFUlNTRVJWSUNFX1dTRExfTE9DQVRJT04sIG5ldyBRTmFtZSgiaHR0cDovL29yZy90ZXN0L2FkZG51bWJlcnMiLCAiQWRkTnVtYmVyc1NlcnZpY2UiKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHJldHVybgotICAgICAqICAgICByZXR1cm5zIEFkZE51bWJlcnNQb3J0VHlwZQotICAgICAqLwotICAgIEBXZWJFbmRwb2ludChuYW1lID0gIkFkZE51bWJlcnNQb3J0IikKLSAgICBwdWJsaWMgQWRkTnVtYmVyc1BvcnRUeXBlIGdldEFkZE51bWJlcnNQb3J0KCkgewotICAgICAgICByZXR1cm4gKEFkZE51bWJlcnNQb3J0VHlwZSlzdXBlci5nZXRQb3J0KG5ldyBRTmFtZSgiaHR0cDovL29yZy90ZXN0L2FkZG51bWJlcnMiLCAiQWRkTnVtYmVyc1BvcnQiKSwgQWRkTnVtYmVyc1BvcnRUeXBlLmNsYXNzKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9zYW1wbGUvYWRkbnVtYmVycy9NRVRBLUlORi9BZGROdW1iZXJzLndzZGwgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vc2FtcGxlL2FkZG51bWJlcnMvTUVUQS1JTkYvQWRkTnVtYmVycy53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMGFmM2E3Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9zYW1wbGUvYWRkbnVtYmVycy9NRVRBLUlORi9BZGROdW1iZXJzLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+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+Ci0JPC9zZXJ2aWNlPgotPC9kZWZpbml0aW9ucz4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9zYW1wbGUvYWRkbnVtYmVycy9NRVRBLUlORi9zZXJ2aWNlcy54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vc2FtcGxlL2FkZG51bWJlcnMvTUVUQS1JTkYvc2VydmljZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzM1MTM3Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9zYW1wbGUvYWRkbnVtYmVycy9NRVRBLUlORi9zZXJ2aWNlcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzZXJ2aWNlR3JvdXA+Ci0gPHNlcnZpY2UgbmFtZT0iQWRkTnVtYmVyc1NlcnZpY2UiPgotICA8bWVzc2FnZVJlY2VpdmVycz4KLSAgIDxtZXNzYWdlUmVjZWl2ZXIgbWVwPSJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaW4tb3V0IiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zZXJ2ZXIuSkFYV1NNZXNzYWdlUmVjZWl2ZXIiLz4KLSAgPC9tZXNzYWdlUmVjZWl2ZXJzPgotICA8cGFyYW1ldGVyIG5hbWU9IlNlcnZpY2VDbGFzcyI+b3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuYWRkbnVtYmVycy5BZGROdW1iZXJzUG9ydFR5cGVJbXBsPC9wYXJhbWV0ZXI+Ci0gIDxvcGVyYXRpb24gbmFtZT0iYWRkTnVtYmVycyIgbWVwPSJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaW4tb3V0Ij4KLSAgICA8YWN0aW9uTWFwcGluZy8+Ci0gIDwvb3BlcmF0aW9uPgotICA8b3BlcmF0aW9uIG5hbWU9Im9uZVdheUludCIgbWVwPSJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaW4tb25seSI+Ci0gICAgPGFjdGlvbk1hcHBpbmcvPgotICA8L29wZXJhdGlvbj4KLSA8L3NlcnZpY2U+Ci08L3NlcnZpY2VHcm91cD4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9lbmRwb2ludC9CYXNpY0VuZHBvaW50VGVzdHMuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9lbmRwb2ludC9CYXNpY0VuZHBvaW50VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjM2OTM2Mi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZW5kcG9pbnQvQmFzaWNFbmRwb2ludFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZW5kcG9pbnQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKLWltcG9ydCBqYXZheC54bWwud3MuQmluZGluZzsKLWltcG9ydCBqYXZheC54bWwud3MuRW5kcG9pbnQ7Ci1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuU09BUEJpbmRpbmc7Ci0KLXB1YmxpYyBjbGFzcyBCYXNpY0VuZHBvaW50VGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlU2ltcGxlRW5kcG9pbnQoKSB7Ci0gICAgICAgIFNhbXBsZUVuZHBvaW50IHNhbXBsZSA9IG5ldyBTYW1wbGVFbmRwb2ludCgpOwotICAgICAgICAKLSAgICAgICAgRW5kcG9pbnQgZXAgPSBFbmRwb2ludC5jcmVhdGUoc2FtcGxlKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIHJldHVybmVkIEVuZHBvaW50IGluc3RhbmNlIHdhcyBudWxsIiwgZXAgIT0gbnVsbCk7Ci0gICAgICAgIAotICAgICAgICBlcC5wdWJsaXNoKCJ0ZXN0Iik7Ci0gICAgICAgIGFzc2VydFRydWUoIlRoZSBlbmRwb2ludCB3YXMgbm90IHB1Ymxpc2hlZCBzdWNjZXNzZnVsbHkiLCBlcC5pc1B1Ymxpc2hlZCgpKTsKLSAgICAgICAgZXAuc3RvcCgpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlQW5kUHVibGlzaEVuZHBvaW50KCkgewotICAgICAgICBTYW1wbGVFbmRwb2ludCBzYW1wbGUgPSBuZXcgU2FtcGxlRW5kcG9pbnQoKTsKLQotICAgICAgICBFbmRwb2ludCBlcCA9IEVuZHBvaW50LnB1Ymxpc2goInRlc3QiICwgc2FtcGxlKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIHJldHVybmVkIEVuZHBvaW50IGluc3RhbmNlIHdhcyBudWxsIiwgZXAgIT0gbnVsbCk7Ci0gICAgICAgIGFzc2VydFRydWUoIlRoZSBlbmRwb2ludCB3YXMgbm90IHB1Ymxpc2hlZCBzdWNjZXNzZnVsbHkiLCBlcC5pc1B1Ymxpc2hlZCgpKTsKLSAgICAgICAgZXAuc3RvcCgpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QmluZGluZygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTYW1wbGVFbmRwb2ludCBzYW1wbGUgPSBuZXcgU2FtcGxlRW5kcG9pbnQoKTsKLQotICAgICAgICBFbmRwb2ludCBlcCA9IEVuZHBvaW50LmNyZWF0ZShzYW1wbGUpOwotICAgICAgICBhc3NlcnRUcnVlKCJUaGUgcmV0dXJuZWQgRW5kcG9pbnQgaW5zdGFuY2Ugd2FzIG51bGwiLCBlcCAhPSBudWxsKTsKLQotICAgICAgICBCaW5kaW5nIGJuZCA9IGVwLmdldEJpbmRpbmcoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIHJldHVybmVkIEJpbmRpbmcgaW5zdGFuY2Ugd2FzIG51bGwiLCBibmQgIT0gbnVsbCk7Ci0gICAgICAgIGFzc2VydFRydWUoIlRoZSByZXR1cm5lZCBCaW5kaW5nIGluc3RhbmNlIHdhcyBvZiB0aGUgd3JvbmcgdHlwZSAoIiArIGJuZC5nZXRDbGFzcygpLmdldE5hbWUoKSArICIpLCBleHBlY3RlZCBTT0FQQmluZGluZyIsIAotICAgICAgICAgICAgICAgIFNPQVBCaW5kaW5nLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oYm5kLmdldENsYXNzKCkpKTsKLSAgICAgICAgZXAuc3RvcCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVBbmRQdWJsaXNoT25BbHRlcm5hdGVQb3J0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEVuZHBvaW50IGVwID0gRW5kcG9pbnQuY3JlYXRlKG5ldyBTYW1wbGVFbmRwb2ludCgpKTsKLSAgICAgICAgZXAucHVibGlzaCgiaHR0cDovL2xvY2FsaG9zdDoxNjA2MC9TYW1wbGVFbmRwb2ludCIpOwotICAgICAgICBhc3NlcnRUcnVlKCJUaGUgcmV0dXJuZWQgRW5kcG9pbnQgaW5zdGFuY2Ugd2FzIG51bGwiLCBlcCAhPSBudWxsKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIGVuZHBvaW50IHdhcyBub3QgcHVibGlzaGVkIHN1Y2Nlc3NmdWxseSIsIGVwLmlzUHVibGlzaGVkKCkpOwotICAgICAgICBlcC5zdG9wKCk7Ci0gICAgfQotCi0gICAgQFdlYlNlcnZpY2UKLSAgICBjbGFzcyBTYW1wbGVFbmRwb2ludCB7Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgaW50IGZvbyhTdHJpbmcgYmFyKSB7Ci0gICAgICAgICAgICByZXR1cm4gYmFyLmxlbmd0aCgpOwotICAgICAgICB9Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9leGNlcHRpb24vRXhjZXB0aW9uRmFjdG9yeVRlc3RzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZXhjZXB0aW9uL0V4Y2VwdGlvbkZhY3RvcnlUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGNkNTI1Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9leGNlcHRpb24vRXhjZXB0aW9uRmFjdG9yeVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZXhjZXB0aW9uOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuRXhjZXB0aW9uRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LnhtbC53cy5Qcm90b2NvbEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBUZXN0cyB0aGUgRXhjZXB0aW9uRmFjdG9yeQotICovCi1wdWJsaWMgY2xhc3MgRXhjZXB0aW9uRmFjdG9yeVRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBzYW1wbGVUZXh0ID0gIlNhbXBsZSI7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gbmFtZQotICAgICAqLwotICAgIHB1YmxpYyBFeGNlcHRpb25GYWN0b3J5VGVzdHMoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEB0ZXN0c3RyYXRlZ3kgVGVzdHMgY3JlYXRpb24gb2YgYSBXZWJTZXJ2aWNlRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEV4Y2VwdGlvbkZhY3RvcnkwMCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIAl0cnl7Ci0gICAgCQl0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKHNhbXBsZVRleHQpOwotICAgIAl9IGNhdGNoKFdlYlNlcnZpY2VFeGNlcHRpb24gZSl7Ci0gICAgCQlhc3NlcnRUcnVlKHNhbXBsZVRleHQuZXF1YWxzKGUuZ2V0TWVzc2FnZSgpKSk7Ci0gICAgCQlhc3NlcnRUcnVlKGUuZ2V0Q2F1c2UoKSA9PSBudWxsKTsKLSAgICAJfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAdGVzdHN0cmF0ZWd5IFRlc3RzIGNyZWF0aW9uIG9mIGEgV2ViU2VydmljZUV4Y2VwdGlvbiBmcm9tIGFub3RoZXIgV2ViU2VydmljZUV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RFeGNlcHRpb25GYWN0b3J5MDEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAJdHJ5ewotICAgIAkJV2ViU2VydmljZUV4Y2VwdGlvbiB3c2UgPSAoV2ViU2VydmljZUV4Y2VwdGlvbikgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihzYW1wbGVUZXh0KTsKLSAgICAJCXRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24od3NlKTsKLSAgICAJfSBjYXRjaChXZWJTZXJ2aWNlRXhjZXB0aW9uIGUpewotICAgIAkJLy8gU2hvdWxkIG9ubHkgYmUgYSBzaW5nbGUgV2ViU2VydmljZUV4Y2VwdGlvbgotICAgIAkJYXNzZXJ0VHJ1ZShzYW1wbGVUZXh0LmVxdWFscyhlLmdldE1lc3NhZ2UoKSkpOwotICAgIAkJYXNzZXJ0VHJ1ZShlLmdldENhdXNlKCkgPT0gbnVsbCk7Ci0gICAgCX0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHRlc3RzdHJhdGVneSBUZXN0cyBjcmVhdGlvbiBvZiBhIFdlYlNlcnZpY2VFeGNlcHRpb24tPldlYlNlcnZpY2VFeGNlcHRpb24tPlByb3RvY29sRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEV4Y2VwdGlvbkZhY3RvcnkwMigpIHRocm93cyBFeGNlcHRpb24gewotICAgIAlQcm90b2NvbEV4Y2VwdGlvbiBwZSA9IG5ldyBQcm90b2NvbEV4Y2VwdGlvbihzYW1wbGVUZXh0KTsKLSAgICAJdHJ5ewotICAgIAkJV2ViU2VydmljZUV4Y2VwdGlvbiB3c2UgPSAoV2ViU2VydmljZUV4Y2VwdGlvbikgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihwZSk7Ci0gICAgCQl0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKHdzZSk7Ci0gICAgCX0gY2F0Y2goV2ViU2VydmljZUV4Y2VwdGlvbiBlKXsKLSAgICAJCS8vIFNob3VsZCBvbmx5IGJlIGEgc2luZ2xlIFdlYlNlcnZpY2VFeGNlcHRpb24gd2l0aCBhIFByb3RvY29sIEV4Y2VwdGlvbgotICAgIAkJYXNzZXJ0VHJ1ZShzYW1wbGVUZXh0LmVxdWFscyhlLmdldE1lc3NhZ2UoKSkpOwotICAgIAkJYXNzZXJ0VHJ1ZShlLmdldENhdXNlKCkgPT0gbnVsbCk7Ci0gICAgCX0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHRlc3RzdHJhdGVneSBUZXN0cyBjcmVhdGlvbiBvZiBhIFdlYlNlcnZpY2VFeGNlcHRpb24tPldlYlNlcnZpY2VFeGNlcHRpb24tPk51bGxQb2ludGVyRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEV4Y2VwdGlvbkZhY3RvcnkwMygpIHRocm93cyBFeGNlcHRpb24gewotICAgIAlOdWxsUG9pbnRlckV4Y2VwdGlvbiBucGUgPSBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLSAgICAJdHJ5ewotICAgIAkJV2ViU2VydmljZUV4Y2VwdGlvbiB3c2UgPSAoV2ViU2VydmljZUV4Y2VwdGlvbikgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihucGUpOwotICAgIAkJdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbih3c2UpOwotICAgIAl9IGNhdGNoKFdlYlNlcnZpY2VFeGNlcHRpb24gZSl7Ci0gICAgCQkvLyBTaG91bGQgb25seSBiZSBhIHNpbmdsZSBXZWJTZXJ2aWNlRXhjZXB0aW9uIHdpdGggYSBQcm90b2NvbCBFeGNlcHRpb24KLSAgICAJCWFzc2VydFRydWUoZS5nZXRDYXVzZSgpID09IG5wZSk7Ci0gICAgCQlhc3NlcnRUcnVlKGUuZ2V0Q2F1c2UoKS5nZXRNZXNzYWdlKCkgPT0gbnVsbCk7Ci0gICAgCX0KLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvaGFuZGxlci9IYW5kbGVyQ2hhaW5Qcm9jZXNzb3JUZXN0cy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2hhbmRsZXIvSGFuZGxlckNoYWluUHJvY2Vzc29yVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNhNDJkZC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvaGFuZGxlci9IYW5kbGVyQ2hhaW5Qcm9jZXNzb3JUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaGFuZGxlcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5oYW5kbGVyLmZhY3RvcnkuSGFuZGxlckludm9rZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5Qcm90b2NvbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnJlZ2lzdHJ5LkZhY3RvcnlSZWdpc3RyeTsKLQotaW1wb3J0IGphdmF4LnhtbC53cy5Qcm90b2NvbEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5IYW5kbGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLkxvZ2ljYWxIYW5kbGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLnNvYXAuU09BUEhhbmRsZXI7Ci1pbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuc29hcC5TT0FQTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKgotICogVGhlcmUgYXJlIG15cmlhZCBzY2VuYXJpb3MgdG8gdGVzdCBoZXJlOgotICogSGFuZGxlciBpbXBsZW1lbnRhdGlvbnMgY2FuIGltcGxlbWVudCB0d28gY2xhc3NlczogIFNPQVBIYW5kbGVyIG9yIExvZ2ljYWxIYW5kbGVyICgyKQotICogVGhleSBpbXBsZW1lbnQgdHdvIGNyaXRpY2FsIG1ldGhvZHM6ICBoYW5kbGVNZXNzYWdlIGFuZCBoYW5kbGVGYXVsdCAoMikKLSAqIFRoZXNlIG1ldGhvZHMgaGF2ZSBmb3VyIHBvc3NpYmxlIHJlc3VsdHM6ICB0cnVlLCBmYWxzZSwgUHJvdG9jb2xFeGNlcHRpb24sIG90aGVyIGV4Y2VwdGlvbgotICogCi0gKiBCZXNpZGVzIHRoZSBwb3NzaWJsZSBiZWhhdmlvcnMgb2YgdGhlIEhhbmRsZXIgaW1wbGVtZW50YXRpb25zLCB3ZSBhbHNvCi0gKiBoYXZlIHRvIGNvbnNpZGVyIHdoZXRoZXIgdGhlIG1lc3NhZ2UgaXMgaW5jb21pbmcgb3Igb3V0Z29pbmcsIHdoZXRoZXIKLSAqIGl0J3MgYSByZXNwb25zZSBvciBhIHJlcXVlc3QsIGFuZCBpZiBhIHJlc3BvbnNlIGlzIGV4cGVjdGVkLgotICogCi0gKiBEbyBvdXIgYmVzdCB0byBjb3ZlciBhbGwgc2NlbmFyaW9zLgotICogCi0gKiBUaGUgdGVzdEhhbmRsZU1lc3NhZ2VfKiBtZXRob2RzIHRlc3QgdGhlIEhhbmRsZXJDaGFpblByb2Nlc3Nvci5wcm9jZXNzQ2hhaW4oKSBtZXRob2QKLSAqIFRoZSB0ZXN0SGFuZGxlRmF1bHRfKiBtZXRob2RzIHRlc3QgdGhlIEhhbmRsZXJDaGFpblByb2Nlc3Nvci5wcm9jZXNzRmF1bHQoKSBtZXRob2QKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgSGFuZGxlckNoYWluUHJvY2Vzc29yVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICAvLyBTdHJpbmcgcmVzdWx0IGlzIGhvdyB3ZSdsbCB2ZXJpZnkgdGhlIHJpZ2h0IG1ldGhvZHMgZnJvbQotICAgIC8vIHRoZSBIYW5kbGVyIGltcGxlbWVudGF0aW9ucyB3ZXJlIGNhbGxlZAotICAgIHByaXZhdGUgU3RyaW5nIHJlc3VsdCA9IG5ldyBTdHJpbmcoKTsKLQotICAgIHByaXZhdGUgZW51bSBSZXN1bHREZXNpcmVkIHsKLSAgICAgICAgVFJVRSwgRkFMU0UsIFBST1RPQ09MX0VYQ0VQVElPTiwgT1RIRVJfRVhDRVBUSU9OCi0gICAgfTsKLQotICAgIC8vIHVzZSB0aGUgZm9sbG93aW5nIHRvIGRpY3RhdGUgaG93IHRoZSBIYW5kbGVyIG1ldGhvZHMgYmVoYXZlCi0gICAgcHJpdmF0ZSBSZXN1bHREZXNpcmVkIHNvYXBoYW5kbGVyMV9NZXNzYWdlUmVzdWx0RGVzaXJlZDsKLSAgICBwcml2YXRlIFJlc3VsdERlc2lyZWQgc29hcGhhbmRsZXIxX0ZhdWx0UmVzdWx0RGVzaXJlZDsKLSAgICBwcml2YXRlIFJlc3VsdERlc2lyZWQgc29hcGhhbmRsZXIyX01lc3NhZ2VSZXN1bHREZXNpcmVkOwotICAgIHByaXZhdGUgUmVzdWx0RGVzaXJlZCBzb2FwaGFuZGxlcjJfRmF1bHRSZXN1bHREZXNpcmVkOwotICAgIHByaXZhdGUgUmVzdWx0RGVzaXJlZCBsb2dpY2FsaGFuZGxlcjFfTWVzc2FnZVJlc3VsdERlc2lyZWQ7Ci0gICAgcHJpdmF0ZSBSZXN1bHREZXNpcmVkIGxvZ2ljYWxoYW5kbGVyMV9GYXVsdFJlc3VsdERlc2lyZWQ7Ci0gICAgcHJpdmF0ZSBSZXN1bHREZXNpcmVkIGxvZ2ljYWxoYW5kbGVyMl9NZXNzYWdlUmVzdWx0RGVzaXJlZDsKLSAgICBwcml2YXRlIFJlc3VsdERlc2lyZWQgbG9naWNhbGhhbmRsZXIyX0ZhdWx0UmVzdWx0RGVzaXJlZDsKLQotICAgIEFycmF5TGlzdDxIYW5kbGVyPiBoYW5kbGVycyA9IG5ldyBBcnJheUxpc3Q8SGFuZGxlcj4oKTsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIEhhbmRsZXJDaGFpblByb2Nlc3NvciBleHBlY3RzIGEgc29ydGVkIGNoYWluCi0gICAgICAgIGhhbmRsZXJzLmFkZChuZXcgTG9naWNhbEhhbmRsZXIyKCkpOwotICAgICAgICBoYW5kbGVycy5hZGQobmV3IExvZ2ljYWxIYW5kbGVyMSgpKTsKLSAgICAgICAgaGFuZGxlcnMuYWRkKG5ldyBTT0FQSGFuZGxlcjEoKSk7Ci0gICAgICAgIGhhbmRsZXJzLmFkZChuZXcgU09BUEhhbmRsZXIyKCkpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogZW1wdHkgbGlzdAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RIYW5kbGVNZXNzYWdlX2VtcHR5MSgpIHsKLQotICAgICAgICBFeGNlcHRpb24gbG9jYWxfZXhjZXB0aW9uID0gbnVsbDsKLQotICAgICAgICBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IgcHJvY2Vzc29yMSA9IG5ldyBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IobnVsbCwgUHJvdG9jb2wuc29hcDExKTsKLSAgICAgICAgSGFuZGxlckNoYWluUHJvY2Vzc29yIHByb2Nlc3NvcjIgPQotICAgICAgICAgICAgICAgIG5ldyBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IobmV3IEFycmF5TGlzdDxIYW5kbGVyPigpLCBQcm90b2NvbC5zb2FwMTEpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgTWVzc2FnZUNvbnRleHQgbWMxID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgICAgICBtYzEuc2V0TUVQQ29udGV4dChuZXcgTUVQQ29udGV4dChtYzEpKTsKLSAgICAgICAgICAgIHByb2Nlc3NvcjEucHJvY2Vzc0NoYWluKG1jMS5nZXRNRVBDb250ZXh0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IuRGlyZWN0aW9uLklOLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlckNoYWluUHJvY2Vzc29yLk1FUC5SRVFVRVNULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7Ci0gICAgICAgICAgICBNZXNzYWdlQ29udGV4dCBtYzIgPSBuZXcgTWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgICAgIG1jMi5zZXRNRVBDb250ZXh0KG5ldyBNRVBDb250ZXh0KG1jMikpOwotICAgICAgICAgICAgcHJvY2Vzc29yMi5wcm9jZXNzQ2hhaW4obWMyLmdldE1FUENvbnRleHQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZXJDaGFpblByb2Nlc3Nvci5EaXJlY3Rpb24uSU4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IuTUVQLlJFUVVFU1QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGxvY2FsX2V4Y2VwdGlvbiA9IGU7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBubyBleGNlcHRpb25zIQotICAgICAgICBhc3NlcnROdWxsKGxvY2FsX2V4Y2VwdGlvbik7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBvbmUgcHJvdG9jb2wgaGFuZGxlcgotICAgICAqIHByb2Nlc3NpbmcgZXhwZWN0ZWQ6ICBMb2dpY2FsIGFuZCBTT0FQLCByZXZlcnNlIG9yZGVyLCBjbG9zZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RIYW5kbGVNZXNzYWdlX29uZXByb3RvMSgpIHsKLQotICAgICAgICAvLyByZXNldCByZXN1bHQKLSAgICAgICAgcmVzdWx0ID0gIiI7Ci0KLSAgICAgICAgLy8gdXNlIGEgbG9jYWwgbGlzdAotICAgICAgICBBcnJheUxpc3Q8SGFuZGxlcj4gbG9jYWxfbGlzdCA9IG5ldyBBcnJheUxpc3Q8SGFuZGxlcj4oKTsKLSAgICAgICAgbG9jYWxfbGlzdC5hZGQobmV3IFNPQVBIYW5kbGVyMSgpKTsKLQotICAgICAgICAvLyB3ZSB3YW50IGFsbCBnb29kIHJlc3BvbnNlczoKLSAgICAgICAgc29hcGhhbmRsZXIxX01lc3NhZ2VSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotICAgICAgICBzb2FwaGFuZGxlcjFfRmF1bHRSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotCi0gICAgICAgIEhhbmRsZXJDaGFpblByb2Nlc3NvciBwcm9jZXNzb3IgPSBuZXcgSGFuZGxlckNoYWluUHJvY2Vzc29yKGxvY2FsX2xpc3QsIFByb3RvY29sLnNvYXAxMSk7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1jMSA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBtYzEuc2V0TUVQQ29udGV4dChuZXcgTUVQQ29udGV4dChtYzEpKTsKLSAgICAgICAgcHJvY2Vzc29yLnByb2Nlc3NDaGFpbihtYzEuZ2V0TUVQQ29udGV4dCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZXJDaGFpblByb2Nlc3Nvci5EaXJlY3Rpb24uSU4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlckNoYWluUHJvY2Vzc29yLk1FUC5SRVFVRVNULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoIlMxbTpTMWM6IiwgcmVzdWx0KTsKLQotICAgIH0KLQotICAgIC8qCi0gICAgICogb25lIHByb3RvY29sIGhhbmRsZXIgaW4gYSBsb2dpY2FsIGNvbnRleHQKLSAgICAgKiBubyBoYW5kbGVycyB3aWxsIGJlIHByb2Nlc3NlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RIYW5kbGVNZXNzYWdlX29uZXByb3RvMigpIHsKLQotICAgICAgICAvLyByZXNldCByZXN1bHQKLSAgICAgICAgcmVzdWx0ID0gIiI7Ci0KLSAgICAgICAgLy8gdXNlIGEgbG9jYWwgbGlzdAotICAgICAgICBBcnJheUxpc3Q8SGFuZGxlcj4gbG9jYWxfbGlzdCA9IG5ldyBBcnJheUxpc3Q8SGFuZGxlcj4oKTsKLSAgICAgICAgbG9jYWxfbGlzdC5hZGQobmV3IFNPQVBIYW5kbGVyMSgpKTsKLQotICAgICAgICAvLyB3ZSB3YW50IGFsbCBnb29kIHJlc3BvbnNlczoKLSAgICAgICAgc29hcGhhbmRsZXIxX01lc3NhZ2VSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotICAgICAgICBzb2FwaGFuZGxlcjFfRmF1bHRSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotCi0gICAgICAgIEhhbmRsZXJDaGFpblByb2Nlc3NvciBwcm9jZXNzb3IgPSBuZXcgSGFuZGxlckNoYWluUHJvY2Vzc29yKGxvY2FsX2xpc3QsIFByb3RvY29sLnNvYXAxMSk7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1jMSA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBtYzEuc2V0TUVQQ29udGV4dChuZXcgTUVQQ29udGV4dChtYzEpKTsKLSAgICAgICAgcHJvY2Vzc29yLnByb2Nlc3NDaGFpbihtYzEuZ2V0TUVQQ29udGV4dCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZXJDaGFpblByb2Nlc3Nvci5EaXJlY3Rpb24uSU4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlckNoYWluUHJvY2Vzc29yLk1FUC5SRVFVRVNULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoIlMxbTpTMWM6IiwgcmVzdWx0KTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIG9uZSBsb2dpY2FsIGhhbmRsZXIKLSAgICAgKiBwcm9jZXNzaW5nIGV4cGVjdGVkOiAgTG9naWNhbCBhbmQgU09BUCwgcmV2ZXJzZSBvcmRlciwgY2xvc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SGFuZGxlTWVzc2FnZV9vbmVsb2dpY2FsKCkgewotCi0gICAgICAgIC8vIHJlc2V0IHJlc3VsdAotICAgICAgICByZXN1bHQgPSAiIjsKLQotICAgICAgICAvLyB1c2UgYSBsb2NhbCBsaXN0Ci0gICAgICAgIEFycmF5TGlzdDxIYW5kbGVyPiBsb2NhbF9saXN0ID0gbmV3IEFycmF5TGlzdDxIYW5kbGVyPigpOwotICAgICAgICBsb2NhbF9saXN0LmFkZChuZXcgTG9naWNhbEhhbmRsZXIxKCkpOwotCi0gICAgICAgIC8vIHdlIHdhbnQgYWxsIGdvb2QgcmVzcG9uc2VzOgotICAgICAgICBsb2dpY2FsaGFuZGxlcjFfTWVzc2FnZVJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0gICAgICAgIGxvZ2ljYWxoYW5kbGVyMV9GYXVsdFJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0KLSAgICAgICAgSGFuZGxlckNoYWluUHJvY2Vzc29yIHByb2Nlc3NvciA9IG5ldyBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IobG9jYWxfbGlzdCwgUHJvdG9jb2wuc29hcDExKTsKLSAgICAgICAgTWVzc2FnZUNvbnRleHQgbWMxID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIG1jMS5zZXRNRVBDb250ZXh0KG5ldyBNRVBDb250ZXh0KG1jMSkpOwotICAgICAgICBwcm9jZXNzb3IucHJvY2Vzc0NoYWluKG1jMS5nZXRNRVBDb250ZXh0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlckNoYWluUHJvY2Vzc29yLkRpcmVjdGlvbi5JTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IuTUVQLlJFUVVFU1QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygiTDFtOkwxYzoiLCByZXN1bHQpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogaW5jb21pbmcgcmVxdWVzdCAod2UgbXVzdCBiZSBvbiB0aGUgc2VydmVyKSwgcmVzcG9uc2UgZXhwZWN0ZWQKLSAgICAgKiBwcm9jZXNzaW5nIGV4cGVjdGVkOiAgTG9naWNhbCBhbmQgU09BUCwgcmV2ZXJzZSBvcmRlciwgbm8gY2xvc2luZwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RIYW5kbGVNZXNzYWdlX3RydWUxKCkgewotCi0gICAgICAgIC8vIHJlc2V0IHJlc3VsdAotICAgICAgICByZXN1bHQgPSAiIjsKLQotICAgICAgICAvLyB3ZSB3YW50IGFsbCBnb29kIHJlc3BvbnNlczoKLSAgICAgICAgc29hcGhhbmRsZXIxX01lc3NhZ2VSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotICAgICAgICBzb2FwaGFuZGxlcjFfRmF1bHRSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotICAgICAgICBzb2FwaGFuZGxlcjJfTWVzc2FnZVJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0gICAgICAgIHNvYXBoYW5kbGVyMl9GYXVsdFJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0gICAgICAgIGxvZ2ljYWxoYW5kbGVyMV9NZXNzYWdlUmVzdWx0RGVzaXJlZCA9IFJlc3VsdERlc2lyZWQuVFJVRTsKLSAgICAgICAgbG9naWNhbGhhbmRsZXIxX0ZhdWx0UmVzdWx0RGVzaXJlZCA9IFJlc3VsdERlc2lyZWQuVFJVRTsKLSAgICAgICAgbG9naWNhbGhhbmRsZXIyX01lc3NhZ2VSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotICAgICAgICBsb2dpY2FsaGFuZGxlcjJfRmF1bHRSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotCi0gICAgICAgIEhhbmRsZXJDaGFpblByb2Nlc3NvciBwcm9jZXNzb3IgPSBuZXcgSGFuZGxlckNoYWluUHJvY2Vzc29yKGhhbmRsZXJzLCBQcm90b2NvbC5zb2FwMTEpOwotICAgICAgICBNZXNzYWdlQ29udGV4dCBtYzEgPSBuZXcgTWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgbWMxLnNldE1FUENvbnRleHQobmV3IE1FUENvbnRleHQobWMxKSk7Ci0gICAgICAgIHByb2Nlc3Nvci5wcm9jZXNzQ2hhaW4obWMxLmdldE1FUENvbnRleHQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IuRGlyZWN0aW9uLklOLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZXJDaGFpblByb2Nlc3Nvci5NRVAuUkVRVUVTVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoIlMybTpTMW06TDFtOkwybToiLCByZXN1bHQpOwotCi0gICAgfQotCi0gICAgLyoKLSAgICAgKiBpbmNvbWluZyByZXF1ZXN0ICh3ZSBtdXN0IGJlIG9uIHRoZSBzZXJ2ZXIpLCByZXNwb25zZSBOT1QgZXhwZWN0ZWQKLSAgICAgKiBwcm9jZXNzaW5nIGV4cGVjdGVkOiAgTG9naWNhbCBhbmQgU09BUCwgcmV2ZXJzZSBvcmRlciwgY2xvc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SGFuZGxlTWVzc2FnZV90cnVlMigpIHsKLQotICAgICAgICAvLyByZXNldCByZXN1bHQKLSAgICAgICAgcmVzdWx0ID0gIiI7Ci0KLSAgICAgICAgLy8gd2Ugd2FudCBhbGwgZ29vZCByZXNwb25zZXM6Ci0gICAgICAgIHNvYXBoYW5kbGVyMV9NZXNzYWdlUmVzdWx0RGVzaXJlZCA9IFJlc3VsdERlc2lyZWQuVFJVRTsKLSAgICAgICAgc29hcGhhbmRsZXIxX0ZhdWx0UmVzdWx0RGVzaXJlZCA9IFJlc3VsdERlc2lyZWQuVFJVRTsKLSAgICAgICAgc29hcGhhbmRsZXIyX01lc3NhZ2VSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotICAgICAgICBzb2FwaGFuZGxlcjJfRmF1bHRSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotICAgICAgICBsb2dpY2FsaGFuZGxlcjFfTWVzc2FnZVJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0gICAgICAgIGxvZ2ljYWxoYW5kbGVyMV9GYXVsdFJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0gICAgICAgIGxvZ2ljYWxoYW5kbGVyMl9NZXNzYWdlUmVzdWx0RGVzaXJlZCA9IFJlc3VsdERlc2lyZWQuVFJVRTsKLSAgICAgICAgbG9naWNhbGhhbmRsZXIyX0ZhdWx0UmVzdWx0RGVzaXJlZCA9IFJlc3VsdERlc2lyZWQuVFJVRTsKLQotICAgICAgICBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IgcHJvY2Vzc29yID0gbmV3IEhhbmRsZXJDaGFpblByb2Nlc3NvcihoYW5kbGVycywgUHJvdG9jb2wuc29hcDExKTsKLSAgICAgICAgTWVzc2FnZUNvbnRleHQgbWMxID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIG1jMS5zZXRNRVBDb250ZXh0KG5ldyBNRVBDb250ZXh0KG1jMSkpOwotICAgICAgICBwcm9jZXNzb3IucHJvY2Vzc0NoYWluKG1jMS5nZXRNRVBDb250ZXh0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlckNoYWluUHJvY2Vzc29yLkRpcmVjdGlvbi5JTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IuTUVQLlJFUVVFU1QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygiUzJtOlMxbTpMMW06TDJtOkwyYzpMMWM6UzFjOlMyYzoiLCByZXN1bHQpOwotCi0gICAgfQotCi0gICAgLyoKLSAgICAgKiBpbmNvbWluZyByZXNwb25zZSAod2UgbXVzdCBiZSBvbiB0aGUgY2xpZW50KSwgcmVzcG9uc2UgZXhwZWN0ZWQgKGlnbm9yZWQpCi0gICAgICogcHJvY2Vzc2luZyBleHBlY3RlZDogIExvZ2ljYWwgYW5kIFNPQVAsIHJldmVyc2Ugb3JkZXIsIGNsb3NlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEhhbmRsZU1lc3NhZ2VfdHJ1ZTMoKSB7Ci0KLSAgICAgICAgLy8gcmVzZXQgcmVzdWx0Ci0gICAgICAgIHJlc3VsdCA9ICIiOwotCi0gICAgICAgIC8vIHdlIHdhbnQgYWxsIGdvb2QgcmVzcG9uc2VzOgotICAgICAgICBzb2FwaGFuZGxlcjFfTWVzc2FnZVJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0gICAgICAgIHNvYXBoYW5kbGVyMV9GYXVsdFJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0gICAgICAgIHNvYXBoYW5kbGVyMl9NZXNzYWdlUmVzdWx0RGVzaXJlZCA9IFJlc3VsdERlc2lyZWQuVFJVRTsKLSAgICAgICAgc29hcGhhbmRsZXIyX0ZhdWx0UmVzdWx0RGVzaXJlZCA9IFJlc3VsdERlc2lyZWQuVFJVRTsKLSAgICAgICAgbG9naWNhbGhhbmRsZXIxX01lc3NhZ2VSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotICAgICAgICBsb2dpY2FsaGFuZGxlcjFfRmF1bHRSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotICAgICAgICBsb2dpY2FsaGFuZGxlcjJfTWVzc2FnZVJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0gICAgICAgIGxvZ2ljYWxoYW5kbGVyMl9GYXVsdFJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0KLSAgICAgICAgSGFuZGxlckNoYWluUHJvY2Vzc29yIHByb2Nlc3NvciA9IG5ldyBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IoaGFuZGxlcnMsIFByb3RvY29sLnNvYXAxMSk7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1jMSA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBtYzEuc2V0TUVQQ29udGV4dChuZXcgTUVQQ29udGV4dChtYzEpKTsKLSAgICAgICAgcHJvY2Vzc29yLnByb2Nlc3NDaGFpbihtYzEuZ2V0TUVQQ29udGV4dCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZXJDaGFpblByb2Nlc3Nvci5EaXJlY3Rpb24uSU4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlckNoYWluUHJvY2Vzc29yLk1FUC5SRVNQT05TRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBzaW5jZSB0aGlzIGlzIGNsaWVudCBpbmJvdW5kIHJlc3BvbnNlLCB0aGUgb3JpZ2luYWwgb3V0Ym91bmQgaW52b2NhdGlvbgotICAgICAgICAgKiB3b3VsZCBoYXZlIGJlZW4gTDJtOkwxbTpTMW06UzJtLCBzbyB0aGUgY2xvc2VzIHdvdWxkIGJlIFMyYzpTMWM6TDFjOkwyYwotICAgICAgICAgKi8KLQotICAgICAgICBhc3NlcnRFcXVhbHMoIlMybTpTMW06TDFtOkwybTpTMmM6UzFjOkwxYzpMMmM6IiwgcmVzdWx0KTsKLQotICAgIH0KLQotICAgIC8qCi0gICAgICogb3V0Z29pbmcgcmVxdWVzdCAod2UgbXVzdCBiZSBvbiB0aGUgY2xpZW50KSwgcmVzcG9uc2UgZXhwZWN0ZWQKLSAgICAgKiBwcm9jZXNzaW5nIGV4cGVjdGVkOiAgTG9naWNhbCBhbmQgU09BUCwgbm9ybWFsIG9yZGVyLCBubyBjbG9zaW5nCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEhhbmRsZU1lc3NhZ2VfdHJ1ZTQoKSB7Ci0KLSAgICAgICAgLy8gcmVzZXQgcmVzdWx0Ci0gICAgICAgIHJlc3VsdCA9ICIiOwotCi0gICAgICAgIC8vIHdlIHdhbnQgYWxsIGdvb2QgcmVzcG9uc2VzOgotICAgICAgICBzb2FwaGFuZGxlcjFfTWVzc2FnZVJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0gICAgICAgIHNvYXBoYW5kbGVyMV9GYXVsdFJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0gICAgICAgIHNvYXBoYW5kbGVyMl9NZXNzYWdlUmVzdWx0RGVzaXJlZCA9IFJlc3VsdERlc2lyZWQuVFJVRTsKLSAgICAgICAgc29hcGhhbmRsZXIyX0ZhdWx0UmVzdWx0RGVzaXJlZCA9IFJlc3VsdERlc2lyZWQuVFJVRTsKLSAgICAgICAgbG9naWNhbGhhbmRsZXIxX01lc3NhZ2VSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotICAgICAgICBsb2dpY2FsaGFuZGxlcjFfRmF1bHRSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotICAgICAgICBsb2dpY2FsaGFuZGxlcjJfTWVzc2FnZVJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0gICAgICAgIGxvZ2ljYWxoYW5kbGVyMl9GYXVsdFJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0KLSAgICAgICAgSGFuZGxlckNoYWluUHJvY2Vzc29yIHByb2Nlc3NvciA9IG5ldyBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IoaGFuZGxlcnMsIFByb3RvY29sLnNvYXAxMSk7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1jMSA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBtYzEuc2V0TUVQQ29udGV4dChuZXcgTUVQQ29udGV4dChtYzEpKTsKLSAgICAgICAgcHJvY2Vzc29yLnByb2Nlc3NDaGFpbihtYzEuZ2V0TUVQQ29udGV4dCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZXJDaGFpblByb2Nlc3Nvci5EaXJlY3Rpb24uT1VULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZXJDaGFpblByb2Nlc3Nvci5NRVAuUkVRVUVTVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoIkwybTpMMW06UzFtOlMybToiLCByZXN1bHQpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogb3V0Z29pbmcgcmVxdWVzdCAod2UgbXVzdCBiZSBvbiB0aGUgY2xpZW50KSwgcmVzcG9uc2UgTk9UIGV4cGVjdGVkCi0gICAgICogcHJvY2Vzc2luZyBleHBlY3RlZDogIExvZ2ljYWwgYW5kIFNPQVAsIG5vcm1hbCBvcmRlciwgY2xvc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SGFuZGxlTWVzc2FnZV90cnVlNSgpIHsKLQotICAgICAgICAvLyByZXNldCByZXN1bHQKLSAgICAgICAgcmVzdWx0ID0gIiI7Ci0KLSAgICAgICAgLy8gd2Ugd2FudCBhbGwgZ29vZCByZXNwb25zZXM6Ci0gICAgICAgIHNvYXBoYW5kbGVyMV9NZXNzYWdlUmVzdWx0RGVzaXJlZCA9IFJlc3VsdERlc2lyZWQuVFJVRTsKLSAgICAgICAgc29hcGhhbmRsZXIxX0ZhdWx0UmVzdWx0RGVzaXJlZCA9IFJlc3VsdERlc2lyZWQuVFJVRTsKLSAgICAgICAgc29hcGhhbmRsZXIyX01lc3NhZ2VSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotICAgICAgICBzb2FwaGFuZGxlcjJfRmF1bHRSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotICAgICAgICBsb2dpY2FsaGFuZGxlcjFfTWVzc2FnZVJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0gICAgICAgIGxvZ2ljYWxoYW5kbGVyMV9GYXVsdFJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0gICAgICAgIGxvZ2ljYWxoYW5kbGVyMl9NZXNzYWdlUmVzdWx0RGVzaXJlZCA9IFJlc3VsdERlc2lyZWQuVFJVRTsKLSAgICAgICAgbG9naWNhbGhhbmRsZXIyX0ZhdWx0UmVzdWx0RGVzaXJlZCA9IFJlc3VsdERlc2lyZWQuVFJVRTsKLQotICAgICAgICBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IgcHJvY2Vzc29yID0gbmV3IEhhbmRsZXJDaGFpblByb2Nlc3NvcihoYW5kbGVycywgUHJvdG9jb2wuc29hcDExKTsKLSAgICAgICAgTWVzc2FnZUNvbnRleHQgbWMxID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIG1jMS5zZXRNRVBDb250ZXh0KG5ldyBNRVBDb250ZXh0KG1jMSkpOwotICAgICAgICBwcm9jZXNzb3IucHJvY2Vzc0NoYWluKG1jMS5nZXRNRVBDb250ZXh0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlckNoYWluUHJvY2Vzc29yLkRpcmVjdGlvbi5PVVQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlckNoYWluUHJvY2Vzc29yLk1FUC5SRVFVRVNULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoIkwybTpMMW06UzFtOlMybTpTMmM6UzFjOkwxYzpMMmM6IiwgcmVzdWx0KTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIG91dGdvaW5nIHJlc3BvbnNlICh3ZSBtdXN0IGJlIG9uIHRoZSBzZXJ2ZXIpLCByZXNwb25zZSBleHBlY3RlZCAoaWdub3JlZCkKLSAgICAgKiBwcm9jZXNzaW5nIGV4cGVjdGVkOiAgTG9naWNhbCBhbmQgU09BUCwgbm9ybWFsIG9yZGVyLCBjbG9zZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RIYW5kbGVNZXNzYWdlX3RydWU2KCkgewotCi0gICAgICAgIC8vIHJlc2V0IHJlc3VsdAotICAgICAgICByZXN1bHQgPSAiIjsKLQotICAgICAgICAvLyB3ZSB3YW50IGFsbCBnb29kIHJlc3BvbnNlczoKLSAgICAgICAgc29hcGhhbmRsZXIxX01lc3NhZ2VSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotICAgICAgICBzb2FwaGFuZGxlcjFfRmF1bHRSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotICAgICAgICBzb2FwaGFuZGxlcjJfTWVzc2FnZVJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0gICAgICAgIHNvYXBoYW5kbGVyMl9GYXVsdFJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0gICAgICAgIGxvZ2ljYWxoYW5kbGVyMV9NZXNzYWdlUmVzdWx0RGVzaXJlZCA9IFJlc3VsdERlc2lyZWQuVFJVRTsKLSAgICAgICAgbG9naWNhbGhhbmRsZXIxX0ZhdWx0UmVzdWx0RGVzaXJlZCA9IFJlc3VsdERlc2lyZWQuVFJVRTsKLSAgICAgICAgbG9naWNhbGhhbmRsZXIyX01lc3NhZ2VSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotICAgICAgICBsb2dpY2FsaGFuZGxlcjJfRmF1bHRSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotCi0gICAgICAgIEhhbmRsZXJDaGFpblByb2Nlc3NvciBwcm9jZXNzb3IgPSBuZXcgSGFuZGxlckNoYWluUHJvY2Vzc29yKGhhbmRsZXJzLCBQcm90b2NvbC5zb2FwMTEpOwotICAgICAgICBNZXNzYWdlQ29udGV4dCBtYzEgPSBuZXcgTWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgbWMxLnNldE1FUENvbnRleHQobmV3IE1FUENvbnRleHQobWMxKSk7Ci0gICAgICAgIHByb2Nlc3Nvci5wcm9jZXNzQ2hhaW4obWMxLmdldE1FUENvbnRleHQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IuRGlyZWN0aW9uLk9VVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IuTUVQLlJFU1BPTlNFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIHNpbmNlIHRoaXMgaXMgc2VydmVyIG91dGJvdW5kIHJlc3BvbnNlLCB0aGUgb3JpZ2luYWwgaW5ib3VuZCBpbnZvY2F0aW9uCi0gICAgICAgICAqIHdvdWxkIGhhdmUgYmVlbiBTMm06UzFtOkwxbTpMMm0sIHNvIHRoZSBjbG9zZXMgd291bGQgYmUgTDJjOkwxYzpTMWM6UzJjCi0gICAgICAgICAqLwotCi0gICAgICAgIGFzc2VydEVxdWFscygiTDJtOkwxbTpTMW06UzJtOkwyYzpMMWM6UzFjOlMyYzoiLCByZXN1bHQpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogQXQgdGhpcyBwb2ludCB3ZSBrbm93IHRoZSBzb3J0aW5nIGFuZCBjbG9zaW5nIGxvZ2ljIGlzIGFsbCBnb29kLAotICAgICAqIGFsbCB0aGF0J3MgbGVmdCBpcyB0byBtYWtlIHN1cmUgdGhlIFNPQVAgaGFuZGxlcnMgYXJlIGV4Y2x1ZGVkIHdoZW4KLSAgICAgKiB3ZSdyZSBpbiBhIExvZ2ljYWxNZXNzYWdlQ29udGV4dC4KLSAgICAgKiAKLSAgICAgKiBvdXRnb2luZyByZXNwb25zZSAod2UgbXVzdCBiZSBvbiB0aGUgc2VydmVyKSwgcmVzcG9uc2UgZXhwZWN0ZWQgKGlnbm9yZWQpCi0gICAgICogcHJvY2Vzc2luZyBleHBlY3RlZDogIExvZ2ljYWwgb25seSwgbm9ybWFsIG9yZGVyLCBjbG9zZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RIYW5kbGVNZXNzYWdlX3RydWU3KCkgewotCi0gICAgICAgIC8vIHJlc2V0IHJlc3VsdAotICAgICAgICByZXN1bHQgPSAiIjsKLQotICAgICAgICAvLyB3ZSB3YW50IGFsbCBnb29kIHJlc3BvbnNlczoKLSAgICAgICAgc29hcGhhbmRsZXIxX01lc3NhZ2VSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotICAgICAgICBzb2FwaGFuZGxlcjFfRmF1bHRSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotICAgICAgICBzb2FwaGFuZGxlcjJfTWVzc2FnZVJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0gICAgICAgIHNvYXBoYW5kbGVyMl9GYXVsdFJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0gICAgICAgIGxvZ2ljYWxoYW5kbGVyMV9NZXNzYWdlUmVzdWx0RGVzaXJlZCA9IFJlc3VsdERlc2lyZWQuVFJVRTsKLSAgICAgICAgbG9naWNhbGhhbmRsZXIxX0ZhdWx0UmVzdWx0RGVzaXJlZCA9IFJlc3VsdERlc2lyZWQuVFJVRTsKLSAgICAgICAgbG9naWNhbGhhbmRsZXIyX01lc3NhZ2VSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotICAgICAgICBsb2dpY2FsaGFuZGxlcjJfRmF1bHRSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotCi0gICAgICAgIEhhbmRsZXJDaGFpblByb2Nlc3NvciBwcm9jZXNzb3IgPSBuZXcgSGFuZGxlckNoYWluUHJvY2Vzc29yKGhhbmRsZXJzLCBQcm90b2NvbC5zb2FwMTEpOwotICAgICAgICBNZXNzYWdlQ29udGV4dCBtYzEgPSBuZXcgTWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgbWMxLnNldE1FUENvbnRleHQobmV3IE1FUENvbnRleHQobWMxKSk7Ci0gICAgICAgIHByb2Nlc3Nvci5wcm9jZXNzQ2hhaW4obWMxLmdldE1FUENvbnRleHQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IuRGlyZWN0aW9uLk9VVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IuTUVQLlJFU1BPTlNFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIHNpbmNlIHRoaXMgaXMgc2VydmVyIG91dGJvdW5kIHJlc3BvbnNlLCB0aGUgb3JpZ2luYWwgaW52b2NhdGlvbgotICAgICAgICAgKiB3b3VsZCBoYXZlIGJlZW4gUzJtOlMxbTpMMW06TDJtLCBzbyB0aGUgY2xvc2VzIHdvdWxkIGJlIEwyYzpMMWM6UzFjOlMyYwotICAgICAgICAgKi8KLQotICAgICAgICBhc3NlcnRFcXVhbHMoIkwybTpMMW06UzFtOlMybTpMMmM6TDFjOlMxYzpTMmM6IiwgcmVzdWx0KTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIGluY29taW5nIHJlcXVlc3QgKHdlIG11c3QgYmUgb24gdGhlIHNlcnZlciksIHJlc3BvbnNlIGV4cGVjdGVkCi0gICAgICogYSBtaWRkbGUgSGFuZGxlci5oYW5kbGVNZXNzYWdlIHJldHVybnMgZmFsc2UKLSAgICAgKiBwcm9jZXNzaW5nIGV4cGVjdGVkOiAgTG9naWNhbCBhbmQgU09BUCwgcmV2ZXJzZSBvcmRlciwgbWVzc2FnZSByZXZlcnNlZCwgY2xvc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SGFuZGxlTWVzc2FnZV9mYWxzZTEoKSB7Ci0KLSAgICAgICAgLy8gcmVzZXQgcmVzdWx0Ci0gICAgICAgIHJlc3VsdCA9ICIiOwotCi0gICAgICAgIC8vIHdlIHdhbnQgb25lIGZhbHNlIHJlc3BvbnNlOgotICAgICAgICBzb2FwaGFuZGxlcjFfTWVzc2FnZVJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0gICAgICAgIHNvYXBoYW5kbGVyMV9GYXVsdFJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0gICAgICAgIHNvYXBoYW5kbGVyMl9NZXNzYWdlUmVzdWx0RGVzaXJlZCA9IFJlc3VsdERlc2lyZWQuVFJVRTsKLSAgICAgICAgc29hcGhhbmRsZXIyX0ZhdWx0UmVzdWx0RGVzaXJlZCA9IFJlc3VsdERlc2lyZWQuVFJVRTsKLSAgICAgICAgbG9naWNhbGhhbmRsZXIxX01lc3NhZ2VSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5GQUxTRTsKLSAgICAgICAgbG9naWNhbGhhbmRsZXIxX0ZhdWx0UmVzdWx0RGVzaXJlZCA9IFJlc3VsdERlc2lyZWQuVFJVRTsKLSAgICAgICAgbG9naWNhbGhhbmRsZXIyX01lc3NhZ2VSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotICAgICAgICBsb2dpY2FsaGFuZGxlcjJfRmF1bHRSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotCi0gICAgICAgIEhhbmRsZXJDaGFpblByb2Nlc3NvciBwcm9jZXNzb3IgPSBuZXcgSGFuZGxlckNoYWluUHJvY2Vzc29yKGhhbmRsZXJzLCBQcm90b2NvbC5zb2FwMTEpOwotICAgICAgICBNZXNzYWdlQ29udGV4dCBtYzEgPSBuZXcgTWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgbWMxLnNldE1FUENvbnRleHQobmV3IE1FUENvbnRleHQobWMxKSk7Ci0gICAgICAgIHByb2Nlc3Nvci5wcm9jZXNzQ2hhaW4obWMxLmdldE1FUENvbnRleHQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IuRGlyZWN0aW9uLklOLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZXJDaGFpblByb2Nlc3Nvci5NRVAuUkVRVUVTVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoIlMybTpTMW06TDFtOlMxbTpTMm06TDFjOlMxYzpTMmM6IiwgcmVzdWx0KTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIG91dGdvaW5nIHJlcXVlc3QgKHdlIG11c3QgYmUgb24gdGhlIGNsaWVudCksIHJlc3BvbnNlIGV4cGVjdGVkCi0gICAgICogYSBtaWRkbGUgSGFuZGxlci5oYW5kbGVNZXNzYWdlIHJldHVybnMgZmFsc2UKLSAgICAgKiBwcm9jZXNzaW5nIGV4cGVjdGVkOiAgTG9naWNhbCBhbmQgU09BUCwgbm9ybWFsIG9yZGVyLCBtZXNzYWdlIHJldmVyc2VkLCBjbG9zZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RIYW5kbGVNZXNzYWdlX2ZhbHNlMigpIHsKLQotICAgICAgICAvLyByZXNldCByZXN1bHQKLSAgICAgICAgcmVzdWx0ID0gIiI7Ci0KLSAgICAgICAgLy8gd2Ugd2FudCBvbmUgZmFsc2UgcmVzcG9uc2U6Ci0gICAgICAgIHNvYXBoYW5kbGVyMV9NZXNzYWdlUmVzdWx0RGVzaXJlZCA9IFJlc3VsdERlc2lyZWQuVFJVRTsKLSAgICAgICAgc29hcGhhbmRsZXIxX0ZhdWx0UmVzdWx0RGVzaXJlZCA9IFJlc3VsdERlc2lyZWQuVFJVRTsKLSAgICAgICAgc29hcGhhbmRsZXIyX01lc3NhZ2VSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotICAgICAgICBzb2FwaGFuZGxlcjJfRmF1bHRSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotICAgICAgICBsb2dpY2FsaGFuZGxlcjFfTWVzc2FnZVJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLkZBTFNFOwotICAgICAgICBsb2dpY2FsaGFuZGxlcjFfRmF1bHRSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotICAgICAgICBsb2dpY2FsaGFuZGxlcjJfTWVzc2FnZVJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0gICAgICAgIGxvZ2ljYWxoYW5kbGVyMl9GYXVsdFJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0KLSAgICAgICAgSGFuZGxlckNoYWluUHJvY2Vzc29yIHByb2Nlc3NvciA9IG5ldyBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IoaGFuZGxlcnMsIFByb3RvY29sLnNvYXAxMSk7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1jMSA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBtYzEuc2V0TUVQQ29udGV4dChuZXcgTUVQQ29udGV4dChtYzEpKTsKLSAgICAgICAgcHJvY2Vzc29yLnByb2Nlc3NDaGFpbihtYzEuZ2V0TUVQQ29udGV4dCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZXJDaGFpblByb2Nlc3Nvci5EaXJlY3Rpb24uT1VULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZXJDaGFpblByb2Nlc3Nvci5NRVAuUkVRVUVTVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoIkwybTpMMW06TDJtOkwxYzpMMmM6IiwgcmVzdWx0KTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIG91dGdvaW5nIHJlcXVlc3QgKHdlIG11c3QgYmUgb24gdGhlIGNsaWVudCksIHJlc3BvbnNlIE5PVCBleHBlY3RlZAotICAgICAqIGEgbWlkZGxlIEhhbmRsZXIuaGFuZGxlTWVzc2FnZSByZXR1cm5zIGZhbHNlCi0gICAgICogcHJvY2Vzc2luZyBleHBlY3RlZDogIExvZ2ljYWwgYW5kIFNPQVAsIG5vcm1hbCBvcmRlciwgbWVzc2FnZSBOT1QgcmV2ZXJzZWQsIGNsb3NlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEhhbmRsZU1lc3NhZ2VfZmFsc2UzKCkgewotCi0gICAgICAgIC8vIHJlc2V0IHJlc3VsdAotICAgICAgICByZXN1bHQgPSAiIjsKLQotICAgICAgICAvLyB3ZSB3YW50IG9uZSBmYWxzZSByZXNwb25zZToKLSAgICAgICAgc29hcGhhbmRsZXIxX01lc3NhZ2VSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotICAgICAgICBzb2FwaGFuZGxlcjFfRmF1bHRSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotICAgICAgICBzb2FwaGFuZGxlcjJfTWVzc2FnZVJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0gICAgICAgIHNvYXBoYW5kbGVyMl9GYXVsdFJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0gICAgICAgIGxvZ2ljYWxoYW5kbGVyMV9NZXNzYWdlUmVzdWx0RGVzaXJlZCA9IFJlc3VsdERlc2lyZWQuRkFMU0U7Ci0gICAgICAgIGxvZ2ljYWxoYW5kbGVyMV9GYXVsdFJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0gICAgICAgIGxvZ2ljYWxoYW5kbGVyMl9NZXNzYWdlUmVzdWx0RGVzaXJlZCA9IFJlc3VsdERlc2lyZWQuVFJVRTsKLSAgICAgICAgbG9naWNhbGhhbmRsZXIyX0ZhdWx0UmVzdWx0RGVzaXJlZCA9IFJlc3VsdERlc2lyZWQuVFJVRTsKLQotICAgICAgICBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IgcHJvY2Vzc29yID0gbmV3IEhhbmRsZXJDaGFpblByb2Nlc3NvcihoYW5kbGVycywgUHJvdG9jb2wuc29hcDExKTsKLSAgICAgICAgTWVzc2FnZUNvbnRleHQgbWMxID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIG1jMS5zZXRNRVBDb250ZXh0KG5ldyBNRVBDb250ZXh0KG1jMSkpOwotICAgICAgICBwcm9jZXNzb3IucHJvY2Vzc0NoYWluKG1jMS5nZXRNRVBDb250ZXh0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlckNoYWluUHJvY2Vzc29yLkRpcmVjdGlvbi5PVVQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlckNoYWluUHJvY2Vzc29yLk1FUC5SRVFVRVNULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoIkwybTpMMW06TDFjOkwyYzoiLCByZXN1bHQpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogaW5jb21pbmcgcmVxdWVzdCAod2UgbXVzdCBiZSBvbiB0aGUgc2VydmVyKSwgcmVzcG9uc2UgZXhwZWN0ZWQKLSAgICAgKiBhIG1pZGRsZSBIYW5kbGVyLmhhbmRsZU1lc3NhZ2UgdGhyb3dzIFByb3RvY29sRXhjZXB0aW9uCi0gICAgICogcHJvY2Vzc2luZyBleHBlY3RlZDogIExvZ2ljYWwgYW5kIFNPQVAsIHJldmVyc2Ugb3JkZXIsIG1lc3NhZ2UgcmV2ZXJzZWQsIGhhbmRsZUZhdWx0LCBjbG9zZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RIYW5kbGVNZXNzYWdlX3Byb3RvY29sZXhfdHJ1ZTEoKSB7Ci0KLSAgICAgICAgLy8gcmVzZXQgcmVzdWx0Ci0gICAgICAgIHJlc3VsdCA9ICIiOwotCi0gICAgICAgIC8vIHdlIHdhbnQgb25lIGZhbHNlIHJlc3BvbnNlOgotICAgICAgICBzb2FwaGFuZGxlcjFfTWVzc2FnZVJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0gICAgICAgIHNvYXBoYW5kbGVyMV9GYXVsdFJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0gICAgICAgIHNvYXBoYW5kbGVyMl9NZXNzYWdlUmVzdWx0RGVzaXJlZCA9IFJlc3VsdERlc2lyZWQuVFJVRTsKLSAgICAgICAgc29hcGhhbmRsZXIyX0ZhdWx0UmVzdWx0RGVzaXJlZCA9IFJlc3VsdERlc2lyZWQuVFJVRTsKLSAgICAgICAgbG9naWNhbGhhbmRsZXIxX01lc3NhZ2VSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5QUk9UT0NPTF9FWENFUFRJT047Ci0gICAgICAgIGxvZ2ljYWxoYW5kbGVyMV9GYXVsdFJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0gICAgICAgIGxvZ2ljYWxoYW5kbGVyMl9NZXNzYWdlUmVzdWx0RGVzaXJlZCA9IFJlc3VsdERlc2lyZWQuVFJVRTsKLSAgICAgICAgbG9naWNhbGhhbmRsZXIyX0ZhdWx0UmVzdWx0RGVzaXJlZCA9IFJlc3VsdERlc2lyZWQuVFJVRTsKLQotICAgICAgICBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IgcHJvY2Vzc29yID0gbmV3IEhhbmRsZXJDaGFpblByb2Nlc3NvcihoYW5kbGVycywgUHJvdG9jb2wuc29hcDExKTsKLSAgICAgICAgTWVzc2FnZUNvbnRleHQgbWMxID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIG1jMS5zZXRNRVBDb250ZXh0KG5ldyBNRVBDb250ZXh0KG1jMSkpOwotICAgICAgICBwcm9jZXNzb3IucHJvY2Vzc0NoYWluKG1jMS5nZXRNRVBDb250ZXh0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlckNoYWluUHJvY2Vzc29yLkRpcmVjdGlvbi5JTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IuTUVQLlJFUVVFU1QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7Ci0KLSAgICAgICAgLy8gaGFuZGxlRmF1bHQgcHJvY2Vzc2luZwotICAgICAgICBhc3NlcnRFcXVhbHMoIlMybTpTMW06TDFtOlMxZjpTMmY6TDFjOlMxYzpTMmM6IiwgcmVzdWx0KTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIGluY29taW5nIHJlcXVlc3QgKHdlIG11c3QgYmUgb24gdGhlIHNlcnZlciksIHJlc3BvbnNlIE5PVCBleHBlY3RlZAotICAgICAqIGEgbWlkZGxlIEhhbmRsZXIuaGFuZGxlTWVzc2FnZSB0aHJvd3MgUHJvdG9jb2xFeGNlcHRpb24KLSAgICAgKiBwcm9jZXNzaW5nIGV4cGVjdGVkOiAgTG9naWNhbCBhbmQgU09BUCwgcmV2ZXJzZSBvcmRlciwgbWVzc2FnZSBOT1QgcmV2ZXJzZWQsIGNsb3NlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEhhbmRsZU1lc3NhZ2VfcHJvdG9jb2xleF90cnVlMigpIHsKLQotICAgICAgICAvLyByZXNldCByZXN1bHQKLSAgICAgICAgcmVzdWx0ID0gIiI7Ci0KLSAgICAgICAgc29hcGhhbmRsZXIxX01lc3NhZ2VSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotICAgICAgICBzb2FwaGFuZGxlcjFfRmF1bHRSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotICAgICAgICBzb2FwaGFuZGxlcjJfTWVzc2FnZVJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0gICAgICAgIHNvYXBoYW5kbGVyMl9GYXVsdFJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0gICAgICAgIGxvZ2ljYWxoYW5kbGVyMV9NZXNzYWdlUmVzdWx0RGVzaXJlZCA9IFJlc3VsdERlc2lyZWQuUFJPVE9DT0xfRVhDRVBUSU9OOwotICAgICAgICBsb2dpY2FsaGFuZGxlcjFfRmF1bHRSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotICAgICAgICBsb2dpY2FsaGFuZGxlcjJfTWVzc2FnZVJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0gICAgICAgIGxvZ2ljYWxoYW5kbGVyMl9GYXVsdFJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0KLSAgICAgICAgSGFuZGxlckNoYWluUHJvY2Vzc29yIHByb2Nlc3NvciA9IG5ldyBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IoaGFuZGxlcnMsIFByb3RvY29sLnNvYXAxMSk7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1jMSA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBtYzEuc2V0TUVQQ29udGV4dChuZXcgTUVQQ29udGV4dChtYzEpKTsKLSAgICAgICAgRXhjZXB0aW9uIGUgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcHJvY2Vzc29yLnByb2Nlc3NDaGFpbihtYzEuZ2V0TUVQQ29udGV4dCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IuRGlyZWN0aW9uLklOLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IuTUVQLlJFUVVFU1QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKLSAgICAgICAgfSBjYXRjaCAoUHJvdG9jb2xFeGNlcHRpb24gcGUpIHsKLSAgICAgICAgICAgIGUgPSBwZTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnROdWxsKGUpOwotICAgICAgICAvLyBubyBoYW5kbGVGYXVsdCBjYWxscwotICAgICAgICBhc3NlcnRFcXVhbHMoIlMybTpTMW06TDFtOkwxYzpTMWM6UzJjOiIsIHJlc3VsdCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBpbmNvbWluZyByZXF1ZXN0ICh3ZSBtdXN0IGJlIG9uIHRoZSBzZXJ2ZXIpLCByZXNwb25zZSBleHBlY3RlZAotICAgICAqIGEgbWlkZGxlIEhhbmRsZXIuaGFuZGxlTWVzc2FnZSB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbgotICAgICAqIHByb2Nlc3NpbmcgZXhwZWN0ZWQ6ICBMb2dpY2FsIGFuZCBTT0FQLCByZXZlcnNlIG9yZGVyLCBtZXNzYWdlIHJldmVyc2VkLCAobm8gaGFuZGxlRmF1bHQpLCBjbG9zZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RIYW5kbGVNZXNzYWdlX3J1bnRpbWVleF90cnVlKCkgewotCi0gICAgICAgIC8vIHJlc2V0IHJlc3VsdAotICAgICAgICByZXN1bHQgPSAiIjsKLQotICAgICAgICAvLyB3ZSB3YW50IG9uZSBmYWxzZSByZXNwb25zZToKLSAgICAgICAgc29hcGhhbmRsZXIxX01lc3NhZ2VSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotICAgICAgICBzb2FwaGFuZGxlcjFfRmF1bHRSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotICAgICAgICBzb2FwaGFuZGxlcjJfTWVzc2FnZVJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0gICAgICAgIHNvYXBoYW5kbGVyMl9GYXVsdFJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0gICAgICAgIGxvZ2ljYWxoYW5kbGVyMV9NZXNzYWdlUmVzdWx0RGVzaXJlZCA9IFJlc3VsdERlc2lyZWQuT1RIRVJfRVhDRVBUSU9OOwotICAgICAgICBsb2dpY2FsaGFuZGxlcjFfRmF1bHRSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotICAgICAgICBsb2dpY2FsaGFuZGxlcjJfTWVzc2FnZVJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0gICAgICAgIGxvZ2ljYWxoYW5kbGVyMl9GYXVsdFJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0KLSAgICAgICAgSGFuZGxlckNoYWluUHJvY2Vzc29yIHByb2Nlc3NvciA9IG5ldyBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IoaGFuZGxlcnMsIFByb3RvY29sLnNvYXAxMSk7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1jMSA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBtYzEuc2V0TUVQQ29udGV4dChuZXcgTUVQQ29udGV4dChtYzEpKTsKLSAgICAgICAgRXhjZXB0aW9uIGUgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcHJvY2Vzc29yLnByb2Nlc3NDaGFpbihtYzEuZ2V0TUVQQ29udGV4dCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IuRGlyZWN0aW9uLklOLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IuTUVQLlJFUVVFU1QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOwotICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7Ci0gICAgICAgICAgICBlID0gcmU7Ci0gICAgICAgIH0KLQotICAgICAgICBhc3NlcnROb3ROdWxsKGUpOwotICAgICAgICAvLyBubyBoYW5kbGVGYXVsdCBjYWxscwotICAgICAgICBhc3NlcnRFcXVhbHMoIlMybTpTMW06TDFtOkwxYzpTMWM6UzJjOiIsIHJlc3VsdCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBpbmNvbWluZyByZXF1ZXN0ICh3ZSBtdXN0IGJlIG9uIHRoZSBzZXJ2ZXIpLCByZXNwb25zZSBleHBlY3RlZAotICAgICAqIGEgbWlkZGxlIEhhbmRsZXIuaGFuZGxlTWVzc2FnZSB0aHJvd3MgUHJvdG9jb2xFeGNlcHRpb24sIGxhdGVyIGEgSGFuZGxlci5oYW5kbGVGYXVsdCByZXR1cm5zIGZhbHNlCi0gICAgICogcHJvY2Vzc2luZyBleHBlY3RlZDogIExvZ2ljYWwgYW5kIFNPQVAsIHJldmVyc2Ugb3JkZXIsIG1lc3NhZ2UgcmV2ZXJzZWQsIGhhbmRsZUZhdWx0LCBjbG9zZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RIYW5kbGVNZXNzYWdlX3Byb3RvY29sZXhfZmFsc2UoKSB7Ci0KLSAgICAgICAgLy8gcmVzZXQgcmVzdWx0Ci0gICAgICAgIHJlc3VsdCA9ICIiOwotCi0gICAgICAgIC8vIHdlIHdhbnQgb25lIGZhbHNlIHJlc3BvbnNlOgotICAgICAgICBzb2FwaGFuZGxlcjFfTWVzc2FnZVJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0gICAgICAgIHNvYXBoYW5kbGVyMV9GYXVsdFJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLkZBTFNFOwotICAgICAgICBzb2FwaGFuZGxlcjJfTWVzc2FnZVJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0gICAgICAgIHNvYXBoYW5kbGVyMl9GYXVsdFJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0gICAgICAgIGxvZ2ljYWxoYW5kbGVyMV9NZXNzYWdlUmVzdWx0RGVzaXJlZCA9IFJlc3VsdERlc2lyZWQuUFJPVE9DT0xfRVhDRVBUSU9OOwotICAgICAgICBsb2dpY2FsaGFuZGxlcjFfRmF1bHRSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotICAgICAgICBsb2dpY2FsaGFuZGxlcjJfTWVzc2FnZVJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0gICAgICAgIGxvZ2ljYWxoYW5kbGVyMl9GYXVsdFJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0KLSAgICAgICAgSGFuZGxlckNoYWluUHJvY2Vzc29yIHByb2Nlc3NvciA9IG5ldyBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IoaGFuZGxlcnMsIFByb3RvY29sLnNvYXAxMSk7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1jMSA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBtYzEuc2V0TUVQQ29udGV4dChuZXcgTUVQQ29udGV4dChtYzEpKTsKLSAgICAgICAgcHJvY2Vzc29yLnByb2Nlc3NDaGFpbihtYzEuZ2V0TUVQQ29udGV4dCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZXJDaGFpblByb2Nlc3Nvci5EaXJlY3Rpb24uSU4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlckNoYWluUHJvY2Vzc29yLk1FUC5SRVFVRVNULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOwotCi0gICAgICAgIC8vIGhhbmRsZUZhdWx0IHByb2Nlc3NpbmcsIGJ1dCBub3RpY2UgUzJmIGRvZXMgbm90IGdldCBjYWxsZWQKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJTMm06UzFtOkwxbTpTMWY6TDFjOlMxYzpTMmM6IiwgcmVzdWx0KTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIGluY29taW5nIHJlcXVlc3QgKHdlIG11c3QgYmUgb24gdGhlIHNlcnZlciksIHJlc3BvbnNlIGV4cGVjdGVkCi0gICAgICogYSBtaWRkbGUgSGFuZGxlci5oYW5kbGVNZXNzYWdlIHRocm93cyBQcm90b2NvbEV4Y2VwdGlvbiwgbGF0ZXIgYSBIYW5kbGVyLmhhbmRsZUZhdWx0IHRocm93cyBQcm90b2NvbEV4Y2VwdGlvbgotICAgICAqIHByb2Nlc3NpbmcgZXhwZWN0ZWQ6ICBMb2dpY2FsIGFuZCBTT0FQLCByZXZlcnNlIG9yZGVyLCBtZXNzYWdlIHJldmVyc2VkLCBoYW5kbGVGYXVsdCwgY2xvc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SGFuZGxlTWVzc2FnZV9wcm90b2NvbGV4X3Byb3RvY29sZXgoKSB7Ci0KLSAgICAgICAgLy8gcmVzZXQgcmVzdWx0Ci0gICAgICAgIHJlc3VsdCA9ICIiOwotCi0gICAgICAgIC8vIHdlIHdhbnQgb25lIGZhbHNlIHJlc3BvbnNlOgotICAgICAgICBzb2FwaGFuZGxlcjFfTWVzc2FnZVJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0gICAgICAgIHNvYXBoYW5kbGVyMV9GYXVsdFJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlBST1RPQ09MX0VYQ0VQVElPTjsKLSAgICAgICAgc29hcGhhbmRsZXIyX01lc3NhZ2VSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotICAgICAgICBzb2FwaGFuZGxlcjJfRmF1bHRSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotICAgICAgICBsb2dpY2FsaGFuZGxlcjFfTWVzc2FnZVJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlBST1RPQ09MX0VYQ0VQVElPTjsKLSAgICAgICAgbG9naWNhbGhhbmRsZXIxX0ZhdWx0UmVzdWx0RGVzaXJlZCA9IFJlc3VsdERlc2lyZWQuVFJVRTsKLSAgICAgICAgbG9naWNhbGhhbmRsZXIyX01lc3NhZ2VSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotICAgICAgICBsb2dpY2FsaGFuZGxlcjJfRmF1bHRSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotCi0gICAgICAgIEhhbmRsZXJDaGFpblByb2Nlc3NvciBwcm9jZXNzb3IgPSBuZXcgSGFuZGxlckNoYWluUHJvY2Vzc29yKGhhbmRsZXJzLCBQcm90b2NvbC5zb2FwMTEpOwotICAgICAgICBNZXNzYWdlQ29udGV4dCBtYzEgPSBuZXcgTWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgbWMxLnNldE1FUENvbnRleHQobmV3IE1FUENvbnRleHQobWMxKSk7Ci0gICAgICAgIEV4Y2VwdGlvbiBlID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIGhhbmRsZUZhdWx0IHByb2Nlc3NpbmcsIGJ1dCBub3RpY2UgUzJmIGRvZXMgbm90IGdldCBjYWxsZWQsIGFuZCB3ZSBnZXQgYW4gZXhjZXB0aW9uCi0gICAgICAgICAgICBwcm9jZXNzb3IucHJvY2Vzc0NoYWluKG1jMS5nZXRNRVBDb250ZXh0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZXJDaGFpblByb2Nlc3Nvci5EaXJlY3Rpb24uSU4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZXJDaGFpblByb2Nlc3Nvci5NRVAuUkVRVUVTVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7Ci0gICAgICAgIH0gY2F0Y2ggKFByb3RvY29sRXhjZXB0aW9uIHBlKSB7Ci0gICAgICAgICAgICBlID0gcGU7Ci0gICAgICAgIH0KLQotICAgICAgICBhc3NlcnROb3ROdWxsKGUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlMybTpTMW06TDFtOlMxZjpMMWM6UzFjOlMyYzoiLCByZXN1bHQpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogaW5jb21pbmcgcmVxdWVzdCAod2UgbXVzdCBiZSBvbiB0aGUgc2VydmVyKSwgcmVzcG9uc2UgZXhwZWN0ZWQKLSAgICAgKiBhIG1pZGRsZSBIYW5kbGVyLmhhbmRsZU1lc3NhZ2UgdGhyb3dzIFByb3RvY29sRXhjZXB0aW9uLCBsYXRlciBhIEhhbmRsZXIuaGFuZGxlRmF1bHQgdGhyb3dzIFByb3RvY29sRXhjZXB0aW9uCi0gICAgICogcHJvY2Vzc2luZyBleHBlY3RlZDogIExvZ2ljYWwgYW5kIFNPQVAsIHJldmVyc2Ugb3JkZXIsIGhhbmRsZUZhdWx0LCBjbG9zZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RIYW5kbGVNZXNzYWdlX3Byb3RvY29sZXhfcnVudGltZWV4KCkgewotCi0gICAgICAgIC8vIHJlc2V0IHJlc3VsdAotICAgICAgICByZXN1bHQgPSAiIjsKLQotICAgICAgICAvLyB3ZSB3YW50IG9uZSBmYWxzZSByZXNwb25zZToKLSAgICAgICAgc29hcGhhbmRsZXIxX01lc3NhZ2VSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotICAgICAgICBzb2FwaGFuZGxlcjFfRmF1bHRSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5PVEhFUl9FWENFUFRJT047Ci0gICAgICAgIHNvYXBoYW5kbGVyMl9NZXNzYWdlUmVzdWx0RGVzaXJlZCA9IFJlc3VsdERlc2lyZWQuVFJVRTsKLSAgICAgICAgc29hcGhhbmRsZXIyX0ZhdWx0UmVzdWx0RGVzaXJlZCA9IFJlc3VsdERlc2lyZWQuVFJVRTsKLSAgICAgICAgbG9naWNhbGhhbmRsZXIxX01lc3NhZ2VSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5QUk9UT0NPTF9FWENFUFRJT047Ci0gICAgICAgIGxvZ2ljYWxoYW5kbGVyMV9GYXVsdFJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0gICAgICAgIGxvZ2ljYWxoYW5kbGVyMl9NZXNzYWdlUmVzdWx0RGVzaXJlZCA9IFJlc3VsdERlc2lyZWQuVFJVRTsKLSAgICAgICAgbG9naWNhbGhhbmRsZXIyX0ZhdWx0UmVzdWx0RGVzaXJlZCA9IFJlc3VsdERlc2lyZWQuVFJVRTsKLQotICAgICAgICBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IgcHJvY2Vzc29yID0gbmV3IEhhbmRsZXJDaGFpblByb2Nlc3NvcihoYW5kbGVycywgUHJvdG9jb2wuc29hcDExKTsKLSAgICAgICAgTWVzc2FnZUNvbnRleHQgbWMxID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIG1jMS5zZXRNRVBDb250ZXh0KG5ldyBNRVBDb250ZXh0KG1jMSkpOwotICAgICAgICBFeGNlcHRpb24gZSA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBzYW1lIHJlc3VsdHMgYXMgdGVzdEhhbmRsZXJzX3Byb3RvY29sZXhfcHJvdG9jb2xleAotICAgICAgICAgICAgcHJvY2Vzc29yLnByb2Nlc3NDaGFpbihtYzEuZ2V0TUVQQ29udGV4dCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IuRGlyZWN0aW9uLklOLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IuTUVQLlJFUVVFU1QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOwotICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHBlKSB7Ci0gICAgICAgICAgICBlID0gcGU7Ci0gICAgICAgIH0KLQotICAgICAgICBhc3NlcnROb3ROdWxsKGUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlMybTpTMW06TDFtOlMxZjpMMWM6UzFjOlMyYzoiLCByZXN1bHQpOwotICAgIH0KLQotCi0gICAgLyoKLSAgICAgKiBlbXB0eSBsaXN0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEhhbmRsZUZhdWx0X2VtcHR5MSgpIHsKLQotICAgICAgICBFeGNlcHRpb24gbG9jYWxfZXhjZXB0aW9uID0gbnVsbDsKLQotICAgICAgICBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IgcHJvY2Vzc29yMSA9IG5ldyBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IobnVsbCwgUHJvdG9jb2wuc29hcDExKTsKLSAgICAgICAgSGFuZGxlckNoYWluUHJvY2Vzc29yIHByb2Nlc3NvcjIgPQotICAgICAgICAgICAgICAgIG5ldyBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IobmV3IEFycmF5TGlzdDxIYW5kbGVyPigpLCBQcm90b2NvbC5zb2FwMTEpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgTWVzc2FnZUNvbnRleHQgbWMxID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgICAgICBtYzEuc2V0TUVQQ29udGV4dChuZXcgTUVQQ29udGV4dChtYzEpKTsKLSAgICAgICAgICAgIHByb2Nlc3NvcjEucHJvY2Vzc0ZhdWx0KG1jMS5nZXRNRVBDb250ZXh0KCksIEhhbmRsZXJDaGFpblByb2Nlc3Nvci5EaXJlY3Rpb24uSU4pOwotICAgICAgICAgICAgTWVzc2FnZUNvbnRleHQgbWMyID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgICAgICBtYzIuc2V0TUVQQ29udGV4dChuZXcgTUVQQ29udGV4dChtYzIpKTsKLSAgICAgICAgICAgIHByb2Nlc3NvcjIucHJvY2Vzc0ZhdWx0KG1jMi5nZXRNRVBDb250ZXh0KCksIEhhbmRsZXJDaGFpblByb2Nlc3Nvci5EaXJlY3Rpb24uSU4pOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbG9jYWxfZXhjZXB0aW9uID0gZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIG5vIGV4Y2VwdGlvbnMhCi0gICAgICAgIGFzc2VydE51bGwobG9jYWxfZXhjZXB0aW9uKTsKLSAgICB9Ci0KLQotICAgIC8qCi0gICAgICogb3V0Z29pbmcgcmVzcG9uc2UgKHdlIG11c3QgYmUgb24gdGhlIHNlcnZlciksIHJlc3BvbnNlIGV4cGVjdGVkIChpZ25vcmVkKQotICAgICAqIHByb2Nlc3NpbmcgZXhwZWN0ZWQ6ICBMb2dpY2FsIGFuZCBTT0FQLCBub3JtYWwgb3JkZXIsIGhhbmRsZUZhdWx0LCBjbG9zZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RIYW5kbGVGYXVsdF90cnVlMSgpIHsKLQotICAgICAgICAvLyByZXNldCByZXN1bHQKLSAgICAgICAgcmVzdWx0ID0gIiI7Ci0KLSAgICAgICAgLy8gd2Ugd2FudCBvbmUgZmFsc2UgcmVzcG9uc2U6Ci0gICAgICAgIHNvYXBoYW5kbGVyMV9NZXNzYWdlUmVzdWx0RGVzaXJlZCA9IFJlc3VsdERlc2lyZWQuVFJVRTsKLSAgICAgICAgc29hcGhhbmRsZXIxX0ZhdWx0UmVzdWx0RGVzaXJlZCA9IFJlc3VsdERlc2lyZWQuVFJVRTsKLSAgICAgICAgc29hcGhhbmRsZXIyX01lc3NhZ2VSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotICAgICAgICBzb2FwaGFuZGxlcjJfRmF1bHRSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotICAgICAgICBsb2dpY2FsaGFuZGxlcjFfTWVzc2FnZVJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0gICAgICAgIGxvZ2ljYWxoYW5kbGVyMV9GYXVsdFJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0gICAgICAgIGxvZ2ljYWxoYW5kbGVyMl9NZXNzYWdlUmVzdWx0RGVzaXJlZCA9IFJlc3VsdERlc2lyZWQuVFJVRTsKLSAgICAgICAgbG9naWNhbGhhbmRsZXIyX0ZhdWx0UmVzdWx0RGVzaXJlZCA9IFJlc3VsdERlc2lyZWQuVFJVRTsKLQotICAgICAgICBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IgcHJvY2Vzc29yID0gbmV3IEhhbmRsZXJDaGFpblByb2Nlc3NvcihoYW5kbGVycywgUHJvdG9jb2wuc29hcDExKTsKLSAgICAgICAgTWVzc2FnZUNvbnRleHQgbWMxID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIG1jMS5zZXRNRVBDb250ZXh0KG5ldyBNRVBDb250ZXh0KG1jMSkpOwotICAgICAgICBwcm9jZXNzb3IucHJvY2Vzc0ZhdWx0KG1jMS5nZXRNRVBDb250ZXh0KCksIEhhbmRsZXJDaGFpblByb2Nlc3Nvci5EaXJlY3Rpb24uT1VUKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoIkwyZjpMMWY6UzFmOlMyZjpMMmM6TDFjOlMxYzpTMmM6IiwgcmVzdWx0KTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIG91dGdvaW5nIHJlc3BvbnNlICh3ZSBtdXN0IGJlIG9uIHRoZSBzZXJ2ZXIpCi0gICAgICogYSBtaWRkbGUgSGFuZGxlci5oYW5kbGVGYXVsdCByZXR1cm5zIGZhbHNlCi0gICAgICogcHJvY2Vzc2luZyBleHBlY3RlZDogIExvZ2ljYWwgYW5kIFNPQVAsIG5vcm1hbCBvcmRlciwgaGFuZGxlRmF1bHQsIGNsb3NlIChhbGwpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEhhbmRsZUZhdWx0X2ZhbHNlMSgpIHsKLQotICAgICAgICAvLyByZXNldCByZXN1bHQKLSAgICAgICAgcmVzdWx0ID0gIiI7Ci0KLSAgICAgICAgLy8gd2Ugd2FudCBvbmUgZmFsc2UgcmVzcG9uc2U6Ci0gICAgICAgIHNvYXBoYW5kbGVyMV9NZXNzYWdlUmVzdWx0RGVzaXJlZCA9IFJlc3VsdERlc2lyZWQuVFJVRTsKLSAgICAgICAgc29hcGhhbmRsZXIxX0ZhdWx0UmVzdWx0RGVzaXJlZCA9IFJlc3VsdERlc2lyZWQuVFJVRTsKLSAgICAgICAgc29hcGhhbmRsZXIyX01lc3NhZ2VSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotICAgICAgICBzb2FwaGFuZGxlcjJfRmF1bHRSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotICAgICAgICBsb2dpY2FsaGFuZGxlcjFfTWVzc2FnZVJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0gICAgICAgIGxvZ2ljYWxoYW5kbGVyMV9GYXVsdFJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLkZBTFNFOwotICAgICAgICBsb2dpY2FsaGFuZGxlcjJfTWVzc2FnZVJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0gICAgICAgIGxvZ2ljYWxoYW5kbGVyMl9GYXVsdFJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0KLSAgICAgICAgSGFuZGxlckNoYWluUHJvY2Vzc29yIHByb2Nlc3NvciA9IG5ldyBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IoaGFuZGxlcnMsIFByb3RvY29sLnNvYXAxMSk7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1jMSA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBtYzEuc2V0TUVQQ29udGV4dChuZXcgTUVQQ29udGV4dChtYzEpKTsKLSAgICAgICAgcHJvY2Vzc29yLnByb2Nlc3NGYXVsdChtYzEuZ2V0TUVQQ29udGV4dCgpLCBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IuRGlyZWN0aW9uLk9VVCk7Ci0KLSAgICAgICAgLy8gbm90aWNlIGFsbCBoYW5kbGVycyBhcmUgY2xvc2VkIGluIHRoaXMgc2NlbmFyaW8KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJMMmY6TDFmOkwyYzpMMWM6UzFjOlMyYzoiLCByZXN1bHQpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogaW5jb21pbmcgcmVzcG9uc2UgKHdlIG11c3QgYmUgb24gdGhlIGNsaWVudCkKLSAgICAgKiBhIG1pZGRsZSBIYW5kbGVyLmhhbmRsZUZhdWx0IHRocm93cyBQcm90b2NvbEV4Y2VwdGlvbgotICAgICAqIHByb2Nlc3NpbmcgZXhwZWN0ZWQ6ICBMb2dpY2FsIGFuZCBTT0FQLCByZXZlcnNlIG9yZGVyLCBoYW5kbGVGYXVsdCwgY2xvc2UgKGFsbCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SGFuZGxlRmF1bHRfcHJvdG9jb2xleCgpIHsKLQotICAgICAgICAvLyByZXNldCByZXN1bHQKLSAgICAgICAgcmVzdWx0ID0gIiI7Ci0KLSAgICAgICAgLy8gd2Ugd2FudCBvbmUgZmFsc2UgcmVzcG9uc2U6Ci0gICAgICAgIHNvYXBoYW5kbGVyMV9NZXNzYWdlUmVzdWx0RGVzaXJlZCA9IFJlc3VsdERlc2lyZWQuVFJVRTsKLSAgICAgICAgc29hcGhhbmRsZXIxX0ZhdWx0UmVzdWx0RGVzaXJlZCA9IFJlc3VsdERlc2lyZWQuVFJVRTsKLSAgICAgICAgc29hcGhhbmRsZXIyX01lc3NhZ2VSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotICAgICAgICBzb2FwaGFuZGxlcjJfRmF1bHRSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotICAgICAgICBsb2dpY2FsaGFuZGxlcjFfTWVzc2FnZVJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0gICAgICAgIGxvZ2ljYWxoYW5kbGVyMV9GYXVsdFJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlBST1RPQ09MX0VYQ0VQVElPTjsKLSAgICAgICAgbG9naWNhbGhhbmRsZXIyX01lc3NhZ2VSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotICAgICAgICBsb2dpY2FsaGFuZGxlcjJfRmF1bHRSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotCi0gICAgICAgIEhhbmRsZXJDaGFpblByb2Nlc3NvciBwcm9jZXNzb3IgPSBuZXcgSGFuZGxlckNoYWluUHJvY2Vzc29yKGhhbmRsZXJzLCBQcm90b2NvbC5zb2FwMTEpOwotICAgICAgICBNZXNzYWdlQ29udGV4dCBtYzEgPSBuZXcgTWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgbWMxLnNldE1FUENvbnRleHQobmV3IE1FUENvbnRleHQobWMxKSk7Ci0gICAgICAgIEV4Y2VwdGlvbiBlID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIG5vdGljZSBhbGwgaGFuZGxlcnMgYXJlIGNsb3NlZCBpbiB0aGlzIHNjZW5hcmlvLCBhbmQgd2UgZ2V0IGFuIGV4Y2VwdGlvbgotICAgICAgICAgICAgcHJvY2Vzc29yLnByb2Nlc3NGYXVsdChtYzEuZ2V0TUVQQ29udGV4dCgpLCBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IuRGlyZWN0aW9uLklOKTsKLSAgICAgICAgfSBjYXRjaCAoUHJvdG9jb2xFeGNlcHRpb24gcGUpIHsKLSAgICAgICAgICAgIGUgPSBwZTsKLSAgICAgICAgfQotCi0gICAgICAgIGFzc2VydE5vdE51bGwoZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiUzJmOlMxZjpMMWY6UzJjOlMxYzpMMWM6TDJjOiIsIHJlc3VsdCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFRoaXMgd2lsbCB2ZXJpZnkgdGhhdCB0aGVyZSBpcyBhIGRlZmF1bHQgSGFuZGxlckludm9rZXJGYWN0b3J5IHJlZ2lzdGVyZWQKLSAgICAgKiB3aXRoIHRoZSBGYWN0b3J5UmVnaXN0cnkgYW5kIHRoYXQgdGhlIGZhY3RvcnkgcmV0dXJucyBhIG5vbi1udWxsIEhhbmRsZXJJbnZva2VyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RSZWdpc3RlckhhbmRsZXJGYWN0b3J5KCkgewotICAgICAgICBIYW5kbGVySW52b2tlckZhY3RvcnkgZmFjdG9yeSA9IChIYW5kbGVySW52b2tlckZhY3RvcnkpIAotICAgICAgICAgICAgRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoSGFuZGxlckludm9rZXJGYWN0b3J5LmNsYXNzKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChmYWN0b3J5KTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChmYWN0b3J5LmNyZWF0ZUhhbmRsZXJJbnZva2VyKG5ldyBNZXNzYWdlQ29udGV4dCgpKSk7Ci0gICAgfQotCi0KLSAgICBwcml2YXRlIGNsYXNzIFNPQVBIYW5kbGVyMSBpbXBsZW1lbnRzIFNPQVBIYW5kbGVyPFNPQVBNZXNzYWdlQ29udGV4dD4gewotCi0gICAgICAgIHB1YmxpYyBTZXQgZ2V0SGVhZGVycygpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoamF2YXgueG1sLndzLmhhbmRsZXIuTWVzc2FnZUNvbnRleHQgbWVzc2FnZWNvbnRleHQpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5jb25jYXQoIlMxYzoiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGhhbmRsZUZhdWx0KFNPQVBNZXNzYWdlQ29udGV4dCBtZXNzYWdlY29udGV4dCkgewotICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmNvbmNhdCgiUzFmOiIpOwotICAgICAgICAgICAgaWYgKHNvYXBoYW5kbGVyMV9GYXVsdFJlc3VsdERlc2lyZWQgPT0gUmVzdWx0RGVzaXJlZC5UUlVFKQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgZWxzZSBpZiAoc29hcGhhbmRsZXIxX0ZhdWx0UmVzdWx0RGVzaXJlZCA9PSBSZXN1bHREZXNpcmVkLkZBTFNFKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIGVsc2UgaWYgKHNvYXBoYW5kbGVyMV9GYXVsdFJlc3VsdERlc2lyZWQgPT0gUmVzdWx0RGVzaXJlZC5QUk9UT0NPTF9FWENFUFRJT04pCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFByb3RvY29sRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICBlbHNlIGlmIChzb2FwaGFuZGxlcjFfRmF1bHRSZXN1bHREZXNpcmVkID09IFJlc3VsdERlc2lyZWQuT1RIRVJfRVhDRVBUSU9OKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7Ci0KLSAgICAgICAgICAgIC8vIGRlZmF1bHQKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaGFuZGxlTWVzc2FnZShTT0FQTWVzc2FnZUNvbnRleHQgbWVzc2FnZWNvbnRleHQpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5jb25jYXQoIlMxbToiKTsKLSAgICAgICAgICAgIGlmIChzb2FwaGFuZGxlcjFfTWVzc2FnZVJlc3VsdERlc2lyZWQgPT0gUmVzdWx0RGVzaXJlZC5UUlVFKQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgZWxzZSBpZiAoc29hcGhhbmRsZXIxX01lc3NhZ2VSZXN1bHREZXNpcmVkID09IFJlc3VsdERlc2lyZWQuRkFMU0UpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgZWxzZSBpZiAoc29hcGhhbmRsZXIxX01lc3NhZ2VSZXN1bHREZXNpcmVkID09IFJlc3VsdERlc2lyZWQuUFJPVE9DT0xfRVhDRVBUSU9OKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBQcm90b2NvbEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgZWxzZSBpZiAoc29hcGhhbmRsZXIxX01lc3NhZ2VSZXN1bHREZXNpcmVkID09IFJlc3VsdERlc2lyZWQuT1RIRVJfRVhDRVBUSU9OKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7Ci0KLSAgICAgICAgICAgIC8vIGRlZmF1bHQKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLQotICAgIHByaXZhdGUgY2xhc3MgU09BUEhhbmRsZXIyIGltcGxlbWVudHMgU09BUEhhbmRsZXI8U09BUE1lc3NhZ2VDb250ZXh0PiB7Ci0KLSAgICAgICAgcHVibGljIFNldCBnZXRIZWFkZXJzKCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZShqYXZheC54bWwud3MuaGFuZGxlci5NZXNzYWdlQ29udGV4dCBtZXNzYWdlY29udGV4dCkgewotICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmNvbmNhdCgiUzJjOiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaGFuZGxlRmF1bHQoU09BUE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2Vjb250ZXh0KSB7Ci0gICAgICAgICAgICByZXN1bHQgPSByZXN1bHQuY29uY2F0KCJTMmY6Iik7Ci0gICAgICAgICAgICBpZiAoc29hcGhhbmRsZXIyX0ZhdWx0UmVzdWx0RGVzaXJlZCA9PSBSZXN1bHREZXNpcmVkLlRSVUUpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICBlbHNlIGlmIChzb2FwaGFuZGxlcjJfRmF1bHRSZXN1bHREZXNpcmVkID09IFJlc3VsdERlc2lyZWQuRkFMU0UpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgZWxzZSBpZiAoc29hcGhhbmRsZXIyX0ZhdWx0UmVzdWx0RGVzaXJlZCA9PSBSZXN1bHREZXNpcmVkLlBST1RPQ09MX0VYQ0VQVElPTikKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUHJvdG9jb2xFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKHNvYXBoYW5kbGVyMl9GYXVsdFJlc3VsdERlc2lyZWQgPT0gUmVzdWx0RGVzaXJlZC5PVEhFUl9FWENFUFRJT04pCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKLQotICAgICAgICAgICAgLy8gZGVmYXVsdAotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYW5kbGVNZXNzYWdlKFNPQVBNZXNzYWdlQ29udGV4dCBtZXNzYWdlY29udGV4dCkgewotICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmNvbmNhdCgiUzJtOiIpOwotICAgICAgICAgICAgaWYgKHNvYXBoYW5kbGVyMl9NZXNzYWdlUmVzdWx0RGVzaXJlZCA9PSBSZXN1bHREZXNpcmVkLlRSVUUpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICBlbHNlIGlmIChzb2FwaGFuZGxlcjJfTWVzc2FnZVJlc3VsdERlc2lyZWQgPT0gUmVzdWx0RGVzaXJlZC5GQUxTRSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICBlbHNlIGlmIChzb2FwaGFuZGxlcjJfTWVzc2FnZVJlc3VsdERlc2lyZWQgPT0gUmVzdWx0RGVzaXJlZC5QUk9UT0NPTF9FWENFUFRJT04pCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFByb3RvY29sRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICBlbHNlIGlmIChzb2FwaGFuZGxlcjJfTWVzc2FnZVJlc3VsdERlc2lyZWQgPT0gUmVzdWx0RGVzaXJlZC5PVEhFUl9FWENFUFRJT04pCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKLQotICAgICAgICAgICAgLy8gZGVmYXVsdAotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgIH0KLQotCi0gICAgcHJpdmF0ZSBjbGFzcyBMb2dpY2FsSGFuZGxlcjEgaW1wbGVtZW50cyBMb2dpY2FsSGFuZGxlcjxMb2dpY2FsTWVzc2FnZUNvbnRleHQ+IHsKLQotICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZShqYXZheC54bWwud3MuaGFuZGxlci5NZXNzYWdlQ29udGV4dCBtZXNzYWdlY29udGV4dCkgewotICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmNvbmNhdCgiTDFjOiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaGFuZGxlRmF1bHQoTG9naWNhbE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2Vjb250ZXh0KSB7Ci0gICAgICAgICAgICByZXN1bHQgPSByZXN1bHQuY29uY2F0KCJMMWY6Iik7Ci0gICAgICAgICAgICBpZiAobG9naWNhbGhhbmRsZXIxX0ZhdWx0UmVzdWx0RGVzaXJlZCA9PSBSZXN1bHREZXNpcmVkLlRSVUUpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICBlbHNlIGlmIChsb2dpY2FsaGFuZGxlcjFfRmF1bHRSZXN1bHREZXNpcmVkID09IFJlc3VsdERlc2lyZWQuRkFMU0UpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgZWxzZSBpZiAobG9naWNhbGhhbmRsZXIxX0ZhdWx0UmVzdWx0RGVzaXJlZCA9PSBSZXN1bHREZXNpcmVkLlBST1RPQ09MX0VYQ0VQVElPTikKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUHJvdG9jb2xFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKGxvZ2ljYWxoYW5kbGVyMV9GYXVsdFJlc3VsdERlc2lyZWQgPT0gUmVzdWx0RGVzaXJlZC5PVEhFUl9FWENFUFRJT04pCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKLQotICAgICAgICAgICAgLy8gZGVmYXVsdAotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYW5kbGVNZXNzYWdlKExvZ2ljYWxNZXNzYWdlQ29udGV4dCBtZXNzYWdlY29udGV4dCkgewotICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmNvbmNhdCgiTDFtOiIpOwotICAgICAgICAgICAgaWYgKGxvZ2ljYWxoYW5kbGVyMV9NZXNzYWdlUmVzdWx0RGVzaXJlZCA9PSBSZXN1bHREZXNpcmVkLlRSVUUpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICBlbHNlIGlmIChsb2dpY2FsaGFuZGxlcjFfTWVzc2FnZVJlc3VsdERlc2lyZWQgPT0gUmVzdWx0RGVzaXJlZC5GQUxTRSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICBlbHNlIGlmIChsb2dpY2FsaGFuZGxlcjFfTWVzc2FnZVJlc3VsdERlc2lyZWQgPT0gUmVzdWx0RGVzaXJlZC5QUk9UT0NPTF9FWENFUFRJT04pCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFByb3RvY29sRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICBlbHNlIGlmIChsb2dpY2FsaGFuZGxlcjFfTWVzc2FnZVJlc3VsdERlc2lyZWQgPT0gUmVzdWx0RGVzaXJlZC5PVEhFUl9FWENFUFRJT04pCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKLQotICAgICAgICAgICAgLy8gZGVmYXVsdAotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgIH0KLQotCi0gICAgcHJpdmF0ZSBjbGFzcyBMb2dpY2FsSGFuZGxlcjIgaW1wbGVtZW50cyBMb2dpY2FsSGFuZGxlcjxMb2dpY2FsTWVzc2FnZUNvbnRleHQ+IHsKLQotICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZShqYXZheC54bWwud3MuaGFuZGxlci5NZXNzYWdlQ29udGV4dCBtZXNzYWdlY29udGV4dCkgewotICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmNvbmNhdCgiTDJjOiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaGFuZGxlRmF1bHQoTG9naWNhbE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2Vjb250ZXh0KSB7Ci0gICAgICAgICAgICByZXN1bHQgPSByZXN1bHQuY29uY2F0KCJMMmY6Iik7Ci0gICAgICAgICAgICBpZiAobG9naWNhbGhhbmRsZXIyX0ZhdWx0UmVzdWx0RGVzaXJlZCA9PSBSZXN1bHREZXNpcmVkLlRSVUUpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICBlbHNlIGlmIChsb2dpY2FsaGFuZGxlcjJfRmF1bHRSZXN1bHREZXNpcmVkID09IFJlc3VsdERlc2lyZWQuRkFMU0UpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgZWxzZSBpZiAobG9naWNhbGhhbmRsZXIyX0ZhdWx0UmVzdWx0RGVzaXJlZCA9PSBSZXN1bHREZXNpcmVkLlBST1RPQ09MX0VYQ0VQVElPTikKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUHJvdG9jb2xFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKGxvZ2ljYWxoYW5kbGVyMl9GYXVsdFJlc3VsdERlc2lyZWQgPT0gUmVzdWx0RGVzaXJlZC5PVEhFUl9FWENFUFRJT04pCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKLQotICAgICAgICAgICAgLy8gZGVmYXVsdAotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYW5kbGVNZXNzYWdlKExvZ2ljYWxNZXNzYWdlQ29udGV4dCBtZXNzYWdlY29udGV4dCkgewotICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmNvbmNhdCgiTDJtOiIpOwotICAgICAgICAgICAgaWYgKGxvZ2ljYWxoYW5kbGVyMl9NZXNzYWdlUmVzdWx0RGVzaXJlZCA9PSBSZXN1bHREZXNpcmVkLlRSVUUpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICBlbHNlIGlmIChsb2dpY2FsaGFuZGxlcjJfTWVzc2FnZVJlc3VsdERlc2lyZWQgPT0gUmVzdWx0RGVzaXJlZC5GQUxTRSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICBlbHNlIGlmIChsb2dpY2FsaGFuZGxlcjJfTWVzc2FnZVJlc3VsdERlc2lyZWQgPT0gUmVzdWx0RGVzaXJlZC5QUk9UT0NPTF9FWENFUFRJT04pCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFByb3RvY29sRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICBlbHNlIGlmIChsb2dpY2FsaGFuZGxlcjJfTWVzc2FnZVJlc3VsdERlc2lyZWQgPT0gUmVzdWx0RGVzaXJlZC5PVEhFUl9FWENFUFRJT04pCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKLQotICAgICAgICAgICAgLy8gZGVmYXVsdAotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2hhbmRsZXIvSGFuZGxlclByZVBvc3RJbnZva2VyVGVzdHMuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9oYW5kbGVyL0hhbmRsZXJQcmVQb3N0SW52b2tlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjMjYxMjMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2hhbmRsZXIvSGFuZGxlclByZVBvc3RJbnZva2VyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmhhbmRsZXI7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLk1lc3NhZ2VDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmhhbmRsZXIuZmFjdG9yeS5IYW5kbGVyUG9zdEludm9rZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmhhbmRsZXIuZmFjdG9yeS5IYW5kbGVyUHJlSW52b2tlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5CbG9jazsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLk1lc3NhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5Qcm90b2NvbDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmZhY3RvcnkuTWVzc2FnZUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5mYWN0b3J5LlhNTFN0cmluZ0Jsb2NrRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5yZWdpc3RyeS5GYWN0b3J5UmVnaXN0cnk7DQotDQotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLkhhbmRsZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLnNvYXAuU09BUEhhbmRsZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLnNvYXAuU09BUE1lc3NhZ2VDb250ZXh0Ow0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLQ0KLS8qKg0KLSAqIEhhbmRsZXJQcmVQb3N0SW52b2tlclRlc3RzIHZlcmlmaWVzIHRoYXQgdGhlIG1lY2hhbmlzbXMgZm9yIGZpbmRpbmcgdGhlIGltcGxlbWVudGF0aW9uIGNsYXNzZXMgdG8gDQotICogY2FsbCBiZWZvcmUgYW5kIGFmdGVyIGhhbmRsZXIuaGFuZGxlTWVzc2FnZSB3b3JrLCBhbmQgdGhhdCB0aGUgY2FsbHMgYXJlIGFjdHVhbGx5IG1hZGUuICBTaW1wbGUgYXMgdGhhdC4NCi0gKi8NCi1wdWJsaWMgY2xhc3MgSGFuZGxlclByZVBvc3RJbnZva2VyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7DQotDQotCXByaXZhdGUgTWVzc2FnZUNvbnRleHQgbWMgPSBudWxsOw0KLQlwcml2YXRlIGJvb2xlYW4gcHJlSW52b2tlckNhbGxlZCA9IGZhbHNlOw0KLQlwcml2YXRlIGJvb2xlYW4gcG9zdEludm9rZXJDYWxsZWQgPSBmYWxzZTsNCi0JDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBzb2FwMTFlbnYgPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iOw0KLQkNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09BUDExX0VOVkVMT1BFID0gDQotICAgICAgICAiPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0ndXRmLTgnPz4iICsgDQotICAgICAgICAiPHNvYXBlbnY6RW52ZWxvcGUgeG1sbnM6c29hcGVudj1cIiIgKyBzb2FwMTFlbnYgKyAiXCI+IiArDQotICAgICAgICAiPHNvYXBlbnY6SGVhZGVyIC8+IiArIA0KLSAgICAgICAgIjxzb2FwZW52OkJvZHk+IiArDQotICAgICAgICAiPC9zb2FwZW52OkJvZHk+IiArIA0KLSAgICAgICAgIjwvc29hcGVudjpFbnZlbG9wZT4iOw0KLQ0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0NCi0gICAgICAgIC8vIENyZWF0ZSBhIFNPQVAgMS4xIE1lc3NhZ2UgYW5kIE1lc3NhZ2VDb250ZXh0DQotCQkvLyBJIGp1c3QgZ3JhYmJlZCB0aGlzIGNvZGUgZnJvbSB0aGUgSkFYV1MgTWVzc2FnZVRlc3RzDQotICAgICAgICBNZXNzYWdlRmFjdG9yeSBtZiA9IChNZXNzYWdlRmFjdG9yeSkgRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoTWVzc2FnZUZhY3RvcnkuY2xhc3MpOw0KLSAgICAgICAgTWVzc2FnZSBtID0gbWYuY3JlYXRlKFByb3RvY29sLnNvYXAxMSk7DQotICAgICAgICBYTUxTdHJpbmdCbG9ja0ZhY3RvcnkgZiA9DQotICAgICAgICAgICAgICAgIChYTUxTdHJpbmdCbG9ja0ZhY3RvcnkpIEZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KFhNTFN0cmluZ0Jsb2NrRmFjdG9yeS5jbGFzcyk7DQotICAgICAgICBCbG9jayBibG9jayA9IGYuY3JlYXRlRnJvbShTT0FQMTFfRU5WRUxPUEUsIG51bGwsIG51bGwpOw0KLSAgICAgICAgbS5zZXRCb2R5QmxvY2soYmxvY2spOw0KLQ0KLSAgICAgICAgbWMgPSBuZXcgTWVzc2FnZUNvbnRleHQoKTsNCi0gICAgICAgIG1jLnNldE1lc3NhZ2UobSk7DQotICAgICAgICBtYy5zZXRNRVBDb250ZXh0KG5ldyBNRVBDb250ZXh0KG1jKSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIG1ha2Ugc3VyZSB0aGUgZGVmYXVsdHMgYXJlIGFzIGV4cGVjdGVkDQotCSAqDQotCSAqLw0KLQlwdWJsaWMgdm9pZCB0ZXN0RmFjdG9yeVJlZ2lzdHJ5KCkgew0KLQkJSGFuZGxlclByZUludm9rZXJGYWN0b3J5IHByZUZhY3QgPSAoSGFuZGxlclByZUludm9rZXJGYWN0b3J5KUZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KEhhbmRsZXJQcmVJbnZva2VyRmFjdG9yeS5jbGFzcyk7DQotCQlIYW5kbGVyUG9zdEludm9rZXJGYWN0b3J5IHBvc3RGYWN0ID0gKEhhbmRsZXJQb3N0SW52b2tlckZhY3RvcnkpRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoSGFuZGxlclBvc3RJbnZva2VyRmFjdG9yeS5jbGFzcyk7DQotCQlIYW5kbGVyUHJlSW52b2tlciBwcmVJbnZva2VyID0gcHJlRmFjdC5jcmVhdGVIYW5kbGVyUHJlSW52b2tlcigpOw0KLQkJSGFuZGxlclBvc3RJbnZva2VyIHBvc3RJbnZva2VyID0gcG9zdEZhY3QuY3JlYXRlSGFuZGxlclBvc3RJbnZva2VyKCk7DQotCQlhc3NlcnRUcnVlKCJwcmVJbnZva2VyIHNob3VsZCBiZSBpbnN0YW5jZW9mICIgKyBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmhhbmRsZXIuaW1wbC5IYW5kbGVyUHJlSW52b2tlckltcGwuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpLCBwcmVJbnZva2VyIGluc3RhbmNlb2Ygb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5oYW5kbGVyLmltcGwuSGFuZGxlclByZUludm9rZXJJbXBsKTsNCi0JCWFzc2VydFRydWUoInBvc3RJbnZva2VyIHNob3VsZCBiZSBpbnN0YW5jZW9mICIgKyBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmhhbmRsZXIuaW1wbC5IYW5kbGVyUG9zdEludm9rZXJJbXBsLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSwgcG9zdEludm9rZXIgaW5zdGFuY2VvZiBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmhhbmRsZXIuaW1wbC5IYW5kbGVyUG9zdEludm9rZXJJbXBsKTsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIG1ha2Ugc3VyZSB0aGUgcmVnaXN0ZXJlZCBmYWN0b3JpZXMgYXJlIHVzZWQsIGFuZCB0aGUgY2FsbHMgYXJlIG1hZGUgaW4gdGhlIHBsYWNlcyB3ZSBleHBlY3QNCi0JICoNCi0JICovDQotCXB1YmxpYyB2b2lkIHRlc3RGYWN0b3J5UHJlUG9zdCgpIHsNCi0JCQ0KLQkJRmFjdG9yeVJlZ2lzdHJ5LnNldEZhY3RvcnkoSGFuZGxlclByZUludm9rZXJGYWN0b3J5LmNsYXNzLCBuZXcgSGFuZGxlclByZUludm9rZXJGYWN0b3J5SW1wbCgpKTsNCi0JCUZhY3RvcnlSZWdpc3RyeS5zZXRGYWN0b3J5KEhhbmRsZXJQb3N0SW52b2tlckZhY3RvcnkuY2xhc3MsIG5ldyBIYW5kbGVyUG9zdEludm9rZXJGYWN0b3J5SW1wbCgpKTsNCi0JCQ0KLQkJQXJyYXlMaXN0PEhhbmRsZXI+IGhhbmRsZXJzID0gbmV3IEFycmF5TGlzdDxIYW5kbGVyPigpOw0KLQkJaGFuZGxlcnMuYWRkKG5ldyBTT0FQSGFuZGxlcjEoKSk7DQotICAgICAgICBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IgcHJvY2Vzc29yID0NCi0gICAgICAgICAgICAgICAgbmV3IEhhbmRsZXJDaGFpblByb2Nlc3NvcihoYW5kbGVycywgUHJvdG9jb2wuc29hcDExKTsNCi0gICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9IHRydWU7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIC8vIHNlcnZlci1zaWRlIGluY29taW5nIHJlcXVlc3QNCi0gICAgICAgICAgICBzdWNjZXNzID0gcHJvY2Vzc29yLnByb2Nlc3NDaGFpbihtYy5nZXRNRVBDb250ZXh0KCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlckNoYWluUHJvY2Vzc29yLkRpcmVjdGlvbi5JTiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IuTUVQLlJFUVVFU1QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7DQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGFzc2VydE51bGwoZSk7ICAvLyBzaG91bGQgbm90IGdldCBleGNlcHRpb24NCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgicHJvY2Vzc0NoYWluIHNob3VsZCBoYXZlIHN1Y2NlZWRlZCIsIHN1Y2Nlc3MpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgicHJlSW52b2tlciBzaG91bGQgaGF2ZSBiZWVuIGNhbGxlZCIsIHByZUludm9rZXJDYWxsZWQpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgicG9zdEludm9rZXIgc2hvdWxkIGhhdmUgYmVlbiBjYWxsZWQiLCBwb3N0SW52b2tlckNhbGxlZCk7DQotDQotCX0NCi0JDQotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLQkgKiBDbGFzc2VzIG5lZWRlZCBmb3IganVuaXQgdGVzdGNhc2UgICAgICoNCi0JICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLQkNCi0gICAgcHJpdmF0ZSBjbGFzcyBTT0FQSGFuZGxlcjEgaW1wbGVtZW50cyBTT0FQSGFuZGxlcjxTT0FQTWVzc2FnZUNvbnRleHQ+IHsNCi0NCi0gICAgICAgIHB1YmxpYyBTZXQgZ2V0SGVhZGVycygpIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlKGphdmF4LnhtbC53cy5oYW5kbGVyLk1lc3NhZ2VDb250ZXh0IG1lc3NhZ2Vjb250ZXh0KSB7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYW5kbGVGYXVsdChTT0FQTWVzc2FnZUNvbnRleHQgbWVzc2FnZWNvbnRleHQpIHsNCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGhhbmRsZU1lc3NhZ2UoU09BUE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2Vjb250ZXh0KSB7DQotICAgICAgICAJcmV0dXJuIHRydWU7DQotICAgICAgICB9DQotDQotICAgIH0NCi0gICAgDQotICAgIHByaXZhdGUgY2xhc3MgSGFuZGxlclByZUludm9rZXJGYWN0b3J5SW1wbCBpbXBsZW1lbnRzIEhhbmRsZXJQcmVJbnZva2VyRmFjdG9yeSB7DQotCQlwdWJsaWMgSGFuZGxlclByZUludm9rZXIgY3JlYXRlSGFuZGxlclByZUludm9rZXIoKSB7DQotCQkJcmV0dXJuIG5ldyBIYW5kbGVyUHJlSW52b2tlckltcGwoKTsNCi0JCX0NCi0gICAgfQ0KLSAgICANCi0gICAgcHJpdmF0ZSBjbGFzcyBIYW5kbGVyUG9zdEludm9rZXJGYWN0b3J5SW1wbCBpbXBsZW1lbnRzIEhhbmRsZXJQb3N0SW52b2tlckZhY3Rvcnkgew0KLSAgICAJcHVibGljIEhhbmRsZXJQb3N0SW52b2tlciBjcmVhdGVIYW5kbGVyUG9zdEludm9rZXIoKSB7DQotICAgIAkJcmV0dXJuIG5ldyBIYW5kbGVyUG9zdEludm9rZXJJbXBsKCk7DQotICAgIAl9DQotICAgIH0NCi0gICAgDQotICAgIHByaXZhdGUgY2xhc3MgSGFuZGxlclByZUludm9rZXJJbXBsIGltcGxlbWVudHMgSGFuZGxlclByZUludm9rZXIgew0KLQkJcHVibGljIHZvaWQgcHJlSW52b2tlKGphdmF4LnhtbC53cy5oYW5kbGVyLk1lc3NhZ2VDb250ZXh0IG1jKSB7DQotCQkJcHJlSW52b2tlckNhbGxlZCA9IHRydWU7DQotCQl9DQotICAgIH0NCi0gICAgDQotICAgIHByaXZhdGUgY2xhc3MgSGFuZGxlclBvc3RJbnZva2VySW1wbCBpbXBsZW1lbnRzIEhhbmRsZXJQb3N0SW52b2tlciB7DQotCQlwdWJsaWMgdm9pZCBwb3N0SW52b2tlKGphdmF4LnhtbC53cy5oYW5kbGVyLk1lc3NhZ2VDb250ZXh0IG1jKSB7DQotCQkJcG9zdEludm9rZXJDYWxsZWQgPSB0cnVlOw0KLQkJfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9oYW5kbGVyL0hhbmRsZXJSZXNvbHZlclRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9oYW5kbGVyL0hhbmRsZXJSZXNvbHZlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDgzOTI5Ny4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvaGFuZGxlci9IYW5kbGVyUmVzb2x2ZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5oYW5kbGVyOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRGVzY3JpcHRpb25GYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkVuZHBvaW50RGVzY3JpcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uU2VydmljZURlc2NyaXB0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmltcGwuRGVzY3JpcHRpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi54bWwuaGFuZGxlci5IYW5kbGVyQ2hhaW5zVHlwZTsNCi0NCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlQ2xpZW50Ow0KLWltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5IYW5kbGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5IYW5kbGVyUmVzb2x2ZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLlBvcnRJbmZvOw0KLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5TT0FQQmluZGluZzsNCi1pbXBvcnQgamF2YS5pby5GaWxlOw0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLm5ldC5VUkw7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLS8qKg0KLSAqIFZlcmlmeSB0aGUgSGFuZGxlclJlc29sdmVySW1wbCBmdW5jdGlvbmFsaXR5Lg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBIYW5kbGVyUmVzb2x2ZXJUZXN0IGV4dGVuZHMgVGVzdENhc2Ugew0KLSAgICBwcml2YXRlIFN0cmluZyBuYW1lc3BhY2VVUkkgPSAiaHR0cDovL3d3dy5hcGFjaGUub3JnL3Rlc3QvbmFtZXNwYWNlIjsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgc3ZjTG9jYWxQYXJ0ID0gIkR1bW15U2VydmljZSI7DQotICAgIHByaXZhdGUgU3RyaW5nIHBvcnRMb2NhbFBhcnQgPSAiRHVtbXlQb3J0IjsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgcG9ydFdyb25nTG9jYWxQYXJ0ID0gIldyb25nUG9ydCI7DQotICAgIA0KLSAgICAvKioNCi0gICAgICogIFRlc3QgdGhhdCBzZXR0aW5nIHRoZSBoYW5kbGVyIGNoYWluIHR5cGUgb24gYSBzcGFyc2UgY29tcG9zaXRlLCBidXQgbm90IA0KLSAgICAgKiAgc3BlY2lmeWluZyB0aGF0IGNvbXBvc2l0ZSBkdXJpbmcgY29uc3RydWN0aW9uIG9mIHRoZSBIYW5kbGVyUmVzb2x2ZXIgKGkuZS4gbm8NCi0gICAgICogIERlbGVnYXRlIGtleSBzcGVjaWZpZWQpIHJlc3VsdHMgaW4gbm8gaGFubGRlcnMgcmV0dXJuZWQgZnJvbSB0aGlzIHJlc29sdmVyLiANCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RIYW5kbGVyUmVzb2x2ZXJOb0tleSgpIHsNCi0gICAgICAgIFFOYW1lIHNlcnZpY2VRTmFtZSA9IG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIHN2Y0xvY2FsUGFydCk7DQotICAgICAgICAvLyBDcmVhdGUgYSBjb21wb3NpdGUgd2l0aCBhIEpBWEIgSGFuZGxlciBDb25maWcgDQotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgc3BhcnNlQ29tcG9zaXRlID0gbmV3IERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSgpOw0KLQ0KLSAgICAgICAgSGFuZGxlckNoYWluc1R5cGUgaGFuZGxlckNoYWluc1R5cGUgPSBnZXRIYW5kbGVyQ2hhaW5zVHlwZSgpOw0KLSAgICAgICAgc3BhcnNlQ29tcG9zaXRlLnNldEhhbmRsZXJDaGFpbnNUeXBlKGhhbmRsZXJDaGFpbnNUeXBlKTsNCi0gICAgICAgIE9iamVjdCBzZXJ2aWNlRGVsZWdhdGVLZXkgPSAiQ29tcG9zaXRlS2V5IjsNCi0gICAgICAgIA0KLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNlcnZpY2VEZXNjID0gDQotICAgICAgICAgICAgRGVzY3JpcHRpb25GYWN0b3J5LmNyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbihudWxsLCBzZXJ2aWNlUU5hbWUsIEhhbmRsZXJSZXNvbHZlclRlc3RTZXJ2aWNlLmNsYXNzLCBzcGFyc2VDb21wb3NpdGUsIHNlcnZpY2VEZWxlZ2F0ZUtleSk7DQotICAgICAgICBIYW5kbGVyUmVzb2x2ZXIgcmVzb2x2ZXIgPSBuZXcgSGFuZGxlclJlc29sdmVySW1wbChzZXJ2aWNlRGVzYyk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHJlc29sdmVyKTsNCi0gICAgICAgIFBvcnRJbmZvIHBpID0gbmV3IER1bW15UG9ydEluZm8oKTsNCi0gICAgICAgIExpc3Q8SGFuZGxlcj4gbGlzdCA9IHJlc29sdmVyLmdldEhhbmRsZXJDaGFpbihwaSk7DQotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbGlzdC5zaXplKCkpOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogVGhlIHNwYXJzZSBjb21wb3NpdGUgaGFzIGhhbmRsZXIgY29uZmlnIGluZm9ybWF0aW9uIGZvciB0aGUga2V5IHRoYXQgdGhlIEhhbmRsZXJSZXNvbHZlcg0KLSAgICAgKiBpcyBjcmVhdGVkIHdpdGgsIHNvIHRoYXQgaGFuZGxlciByZXNvbHZlciBjb250YWlucyB0aG9zZSBoYW5kbGVycy4gIEhvd2V2ZXIsIHRoZSANCi0gICAgICogcG9ydEluZm8gc3BlY2lmaWVkIG9uIHRoZSBnZXRIYW5kbGVyQ2hhaW4gZG9lcyBOT1QgbWF0Y2ggdGhlIFFOYW1lIGluIHRoZSBjb25maWcgZmlsZQ0KLSAgICAgKiBzbyBubyBoYW5kbGVycyBzaG91bGQgYmUgcmV0dXJuZWQuDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SGFuZGxlclJlc29sdmVySW52YWxpZFBvcnRJbmZvKCkgew0KLSAgICAgICAgUU5hbWUgc2VydmljZVFOYW1lID0gbmV3IFFOYW1lKG5hbWVzcGFjZVVSSSwgc3ZjTG9jYWxQYXJ0KTsNCi0gICAgICAgIFFOYW1lIHBvcnRRTmFtZSA9IG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIHBvcnRXcm9uZ0xvY2FsUGFydCk7DQotICAgICAgICAvLyBDcmVhdGUgYSBjb21wb3NpdGUgd2l0aCBhIEpBWEIgSGFuZGxlciBDb25maWcgDQotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgc3BhcnNlQ29tcG9zaXRlID0gbmV3IERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSgpOw0KLQ0KLSAgICAgICAgSGFuZGxlckNoYWluc1R5cGUgaGFuZGxlckNoYWluc1R5cGUgPSBnZXRIYW5kbGVyQ2hhaW5zVHlwZSgpOw0KLSAgICAgICAgc3BhcnNlQ29tcG9zaXRlLnNldEhhbmRsZXJDaGFpbnNUeXBlKGhhbmRsZXJDaGFpbnNUeXBlKTsNCi0gICAgICAgIE9iamVjdCBzZXJ2aWNlRGVsZWdhdGVLZXkgPSAiQ29tcG9zaXRlS2V5IjsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gVGhlIGdldEhhbmRsZXJDaGFpbiB3aWxsIGRvIGhhbmRsZXIgbGlmZWN5Y2xlIG1hbmFnZW1lbnQgYXMgd2VsbCwgc28gdGhlcmUgbmVlZHMgdG8gYmUNCi0gICAgICAgIC8vIGFuZCBFbnBkb2ludERlc2NyaXB0aW9uIChyZXByZXNlbnRpbmcgdGhlIFBvcnQpIHVuZGVyIHRoZSBTZXJ2aWNlRGVzY3JpcHRpb24NCi0gICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzZXJ2aWNlRGVzYyA9IA0KLSAgICAgICAgICAgIERlc2NyaXB0aW9uRmFjdG9yeS5jcmVhdGVTZXJ2aWNlRGVzY3JpcHRpb24obnVsbCwgc2VydmljZVFOYW1lLCBIYW5kbGVyUmVzb2x2ZXJUZXN0U2VydmljZS5jbGFzcywgc3BhcnNlQ29tcG9zaXRlLCBzZXJ2aWNlRGVsZWdhdGVLZXkpOw0KLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlbmRwb2ludERlc2MgPSANCi0gICAgICAgICAgICBEZXNjcmlwdGlvbkZhY3RvcnkudXBkYXRlRW5kcG9pbnQoc2VydmljZURlc2MsIEhhbmRsZXJSZXNvbHZlclRlc3RTRUkuY2xhc3MsIHBvcnRRTmFtZSwgRGVzY3JpcHRpb25GYWN0b3J5LlVwZGF0ZVR5cGUuR0VUX1BPUlQpOw0KLSAgICAgICAgSGFuZGxlclJlc29sdmVyIHJlc29sdmVyID0gbmV3IEhhbmRsZXJSZXNvbHZlckltcGwoc2VydmljZURlc2MsIHNlcnZpY2VEZWxlZ2F0ZUtleSk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHJlc29sdmVyKTsNCi0gICAgICAgIFBvcnRJbmZvIHBpID0gbmV3IER1bW15UG9ydEluZm8oKTsNCi0gICAgICAgIExpc3Q8SGFuZGxlcj4gbGlzdCA9IHJlc29sdmVyLmdldEhhbmRsZXJDaGFpbihwaSk7DQotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbGlzdC5zaXplKCkpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBUaGUgc3BhcnNlIGNvbXBvc2l0ZSBoYXMgaGFuZGxlciBjb25maWcgaW5mb3JtYXRpb24gZm9yIHRoZSBrZXkgdGhhdCB0aGUgSGFuZGxlclJlc29sdmVyDQotICAgICAqIGlzIGNyZWF0ZWQgd2l0aCwgc28gdGhhdCBoYW5kbGVyIHJlc29sdmVyIGNvbnRhaW5zIHRob3NlIGhhbmRsZXJzLiAgDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SGFuZGxlclJlc29sdmVyVmFsaWRQb3J0SW5mbygpIHsNCi0gICAgICAgIFFOYW1lIHNlcnZpY2VRTmFtZSA9IG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIHN2Y0xvY2FsUGFydCk7DQotICAgICAgICBRTmFtZSBwb3J0UU5hbWUgPSBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBwb3J0TG9jYWxQYXJ0KTsNCi0gICAgICAgIC8vIENyZWF0ZSBhIGNvbXBvc2l0ZSB3aXRoIGEgSkFYQiBIYW5kbGVyIENvbmZpZyANCi0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBzcGFyc2VDb21wb3NpdGUgPSBuZXcgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCk7DQotDQotICAgICAgICBIYW5kbGVyQ2hhaW5zVHlwZSBoYW5kbGVyQ2hhaW5zVHlwZSA9IGdldEhhbmRsZXJDaGFpbnNUeXBlKCk7DQotICAgICAgICBzcGFyc2VDb21wb3NpdGUuc2V0SGFuZGxlckNoYWluc1R5cGUoaGFuZGxlckNoYWluc1R5cGUpOw0KLSAgICAgICAgT2JqZWN0IHNlcnZpY2VEZWxlZ2F0ZUtleSA9ICJDb21wb3NpdGVLZXkiOw0KLSAgICAgICAgDQotICAgICAgICAvLyBUaGUgZ2V0SGFuZGxlckNoYWluIHdpbGwgZG8gaGFuZGxlciBsaWZlY3ljbGUgbWFuYWdlbWVudCBhcyB3ZWxsLCBzbyB0aGVyZSBuZWVkcyB0byBiZQ0KLSAgICAgICAgLy8gYW5kIEVucGRvaW50RGVzY3JpcHRpb24gKHJlcHJlc2VudGluZyB0aGUgUG9ydCkgdW5kZXIgdGhlIFNlcnZpY2VEZXNjcmlwdGlvbg0KLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNlcnZpY2VEZXNjID0gDQotICAgICAgICAgICAgRGVzY3JpcHRpb25GYWN0b3J5LmNyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbihudWxsLCBzZXJ2aWNlUU5hbWUsIEhhbmRsZXJSZXNvbHZlclRlc3RTZXJ2aWNlLmNsYXNzLCBzcGFyc2VDb21wb3NpdGUsIHNlcnZpY2VEZWxlZ2F0ZUtleSk7DQotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVuZHBvaW50RGVzYyA9IA0KLSAgICAgICAgICAgIERlc2NyaXB0aW9uRmFjdG9yeS51cGRhdGVFbmRwb2ludChzZXJ2aWNlRGVzYywgSGFuZGxlclJlc29sdmVyVGVzdFNFSS5jbGFzcywgcG9ydFFOYW1lLCBEZXNjcmlwdGlvbkZhY3RvcnkuVXBkYXRlVHlwZS5HRVRfUE9SVCk7DQotICAgICAgICBIYW5kbGVyUmVzb2x2ZXIgcmVzb2x2ZXIgPSBuZXcgSGFuZGxlclJlc29sdmVySW1wbChzZXJ2aWNlRGVzYywgc2VydmljZURlbGVnYXRlS2V5KTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwocmVzb2x2ZXIpOw0KLSAgICAgICAgUG9ydEluZm8gcGkgPSBuZXcgRHVtbXlQb3J0SW5mbygpOw0KLSAgICAgICAgTGlzdDxIYW5kbGVyPiBsaXN0ID0gcmVzb2x2ZXIuZ2V0SGFuZGxlckNoYWluKHBpKTsNCi0gICAgICAgIGFzc2VydEVxdWFscygyLCBsaXN0LnNpemUoKSk7DQotICAgICAgICANCi0gICAgfQ0KLSAgICANCi0gICAgcHJpdmF0ZSBIYW5kbGVyQ2hhaW5zVHlwZSBnZXRIYW5kbGVyQ2hhaW5zVHlwZSgpIHsNCi0gICAgICAgIElucHV0U3RyZWFtIGlzID0gZ2V0WE1MRmlsZVN0cmVhbSgpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChpcyk7DQotICAgICAgICBIYW5kbGVyQ2hhaW5zVHlwZSByZXR1cm5IQ1QgPSBEZXNjcmlwdGlvblV0aWxzLmxvYWRIYW5kbGVyQ2hhaW5zKGlzLCB0aGlzLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHJldHVybkhDVCk7DQotICAgICAgICByZXR1cm4gcmV0dXJuSENUOw0KLSAgICB9DQotICAgIHByaXZhdGUgSW5wdXRTdHJlYW0gZ2V0WE1MRmlsZVN0cmVhbSgpIHsNCi0gICAgICAgIElucHV0U3RyZWFtIGlzID0gbnVsbDsNCi0gICAgICAgIFN0cmluZyBjb25maWdMb2MgPSBudWxsOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBTdHJpbmcgc2VwID0gIi8iOw0KLSAgICAgICAgICAgIGNvbmZpZ0xvYyA9IHNlcCArICJ0ZXN0LXJlc291cmNlcyIgKyBzZXAgKyAiY29uZmlndXJhdGlvbiIgKyBzZXAgKyAiaGFuZGxlcnMiICsgc2VwICsgImhhbmRsZXIueG1sIjsNCi0gICAgICAgICAgICBTdHJpbmcgYmFzZURpciA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiYmFzZWRpciIsIi4iKSkuZ2V0Q2Fub25pY2FsUGF0aCgpOw0KLSAgICAgICAgICAgIGlzID0gbmV3IEZpbGUoYmFzZURpciArIGNvbmZpZ0xvYykudG9VUkwoKS5vcGVuU3RyZWFtKCk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gaXM7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGNsYXNzIER1bW15UG9ydEluZm8gaW1wbGVtZW50cyBQb3J0SW5mbyB7DQotDQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEJpbmRpbmdJRCgpIHsNCi0gICAgICAgICAgICByZXR1cm4gU09BUEJpbmRpbmcuU09BUDExSFRUUF9CSU5ESU5HOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIFFOYW1lIGdldFBvcnROYW1lKCkgew0KLSAgICAgICAgICAgIHJldHVybiBuZXcgUU5hbWUoImh0dHA6Ly93d3cuYXBhY2hlLm9yZy90ZXN0L25hbWVzcGFjZSIsICJEdW1teVBvcnQiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyBRTmFtZSBnZXRTZXJ2aWNlTmFtZSgpIHsNCi0gICAgICAgICAgICByZXR1cm4gbmV3IFFOYW1lKCJodHRwOi8vd3d3LmFwYWNoZS5vcmcvdGVzdC9uYW1lc3BhY2UiLCAiRHVtbXlTZXJ2aWNlIik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi19DQotDQotQFdlYlNlcnZpY2VDbGllbnQNCi1jbGFzcyBIYW5kbGVyUmVzb2x2ZXJUZXN0U2VydmljZSBleHRlbmRzIGphdmF4LnhtbC53cy5TZXJ2aWNlIHsNCi0gICAgcHJvdGVjdGVkIEhhbmRsZXJSZXNvbHZlclRlc3RTZXJ2aWNlKFVSTCB3c2RsRG9jdW1lbnRMb2NhdGlvbiwgUU5hbWUgc2VydmljZU5hbWUpIHsNCi0gICAgICAgIHN1cGVyKHdzZGxEb2N1bWVudExvY2F0aW9uLCBzZXJ2aWNlTmFtZSk7DQotICAgIH0NCi19DQotDQotQFdlYlNlcnZpY2UNCi1pbnRlcmZhY2UgSGFuZGxlclJlc29sdmVyVGVzdFNFSSB7DQotICAgIHB1YmxpYyBTdHJpbmcgZWNobyhTdHJpbmcgdG9FY2hvKTsNCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2hhbmRsZXIvUm9sZUJhc2VkTXVzdFVuZGVyc3RhbmRIYW5kbGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvaGFuZGxlci9Sb2xlQmFzZWRNdXN0VW5kZXJzdGFuZEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRiZGJkMS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvaGFuZGxlci9Sb2xlQmFzZWRNdXN0VW5kZXJzdGFuZEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaGFuZGxlcjsNCi0NCi1pbXBvcnQgamF2YS51dGlsLlNldDsNCi0NCi1pbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuTWVzc2FnZUNvbnRleHQ7DQotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLk1lc3NhZ2VDb250ZXh0LlNjb3BlOw0KLWltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5zb2FwLlNPQVBNZXNzYWdlQ29udGV4dDsNCi0NCi0vKg0KLSAqIFlvdSBjYW4ndCBhY3R1YWxseSBzcGVjaWZ5IHdoZXRoZXIgYSBoYW5kbGVyIGlzIGZvciBjbGllbnQgb3Igc2VydmVyLA0KLSAqIHlvdSBqdXN0IGhhdmUgdG8gY2hlY2sgaW4gdGhlIGhhbmRsZU1lc3NhZ2UgYW5kL29yIGhhbmRsZUZhdWx0IHRvIG1ha2UNCi0gKiBzdXJlIHdoYXQgZGlyZWN0aW9uIHdlJ3JlIGdvaW5nLg0KLSAqLw0KLQ0KLXB1YmxpYyBjbGFzcyBSb2xlQmFzZWRNdXN0VW5kZXJzdGFuZEhhbmRsZXIgaW1wbGVtZW50cyBqYXZheC54bWwud3MuaGFuZGxlci5zb2FwLlNPQVBIYW5kbGVyPFNPQVBNZXNzYWdlQ29udGV4dD4gew0KLQ0KLSAgICBwdWJsaWMgdm9pZCBjbG9zZShNZXNzYWdlQ29udGV4dCBtZXNzYWdlY29udGV4dCkgew0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGhhbmRsZUZhdWx0KFNPQVBNZXNzYWdlQ29udGV4dCBtZXNzYWdlY29udGV4dCkgew0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFNldCBnZXRIZWFkZXJzKCkgew0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaGFuZGxlTWVzc2FnZShTT0FQTWVzc2FnZUNvbnRleHQgbWVzc2FnZWNvbnRleHQpIHsNCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9oYW5kbGVyL1JvbGVCYXNlZE11c3RVbmRlcnN0YW5kVGVzdHMueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2hhbmRsZXIvUm9sZUJhc2VkTXVzdFVuZGVyc3RhbmRUZXN0cy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4ODQ3Y2UuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2hhbmRsZXIvUm9sZUJhc2VkTXVzdFVuZGVyc3RhbmRUZXN0cy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLQ0KLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLTxqd3M6aGFuZGxlci1jaGFpbnMgeG1sbnM6andzPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiPg0KLQk8andzOmhhbmRsZXItY2hhaW4gbmFtZT0iUm9sZUJhc2VkTXVzdFVuZGVyc3RhbmRIYW5kbGVyQ2hhaW4iPg0KLQkJPGp3czpoYW5kbGVyPg0KLQkJCTxqd3M6aGFuZGxlci1jbGFzcz5vcmcuYXBhY2hlLmF4aXMyLmpheHdzLmhhbmRsZXIuUm9sZUJhc2VkTXVzdFVuZGVyc3RhbmRIYW5kbGVyPC9qd3M6aGFuZGxlci1jbGFzcz4NCi0JCQk8andzOnNvYXAtcm9sZT5odHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9oYW5kbGVyL0FkZGVkUm9sZTwvandzOnNvYXAtcm9sZT4NCi0JCTwvandzOmhhbmRsZXI+DQotCTwvandzOmhhbmRsZXItY2hhaW4+DQotPC9qd3M6aGFuZGxlci1jaGFpbnM+DQotDQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2hhbmRsZXIvUm9sZUJhc2VkTXVzdFVuZGVyc3RhbmRUZXN0czIueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2hhbmRsZXIvUm9sZUJhc2VkTXVzdFVuZGVyc3RhbmRUZXN0czIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzZhM2E4Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9oYW5kbGVyL1JvbGVCYXNlZE11c3RVbmRlcnN0YW5kVGVzdHMyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotDQotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotPGp3czpoYW5kbGVyLWNoYWlucyB4bWxuczpqd3M9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSI+DQotCTxqd3M6aGFuZGxlci1jaGFpbiBuYW1lPSJSb2xlQmFzZWRNdXN0VW5kZXJzdGFuZEhhbmRsZXJDaGFpbiI+DQotCQk8andzOmhhbmRsZXI+DQotCQkJPGp3czpoYW5kbGVyLWNsYXNzPm9yZy5hcGFjaGUuYXhpczIuamF4d3MuaGFuZGxlci5Sb2xlQmFzZWRNdXN0VW5kZXJzdGFuZEhhbmRsZXI8L2p3czpoYW5kbGVyLWNsYXNzPg0KLQkJCTxqd3M6c29hcC1yb2xlPmh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2hhbmRsZXIvQWRkZWRSb2xlPC9qd3M6c29hcC1yb2xlPg0KLQkJCTxqd3M6c29hcC1yb2xlPmh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2hhbmRsZXIvQWRkZWRSb2xlMjwvandzOnNvYXAtcm9sZT4NCi0JCTwvandzOmhhbmRsZXI+DQotCTwvandzOmhhbmRsZXItY2hhaW4+DQotPC9qd3M6aGFuZGxlci1jaGFpbnM+DQotDQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2hhbmRsZXIvUm9sZUJhc2VkTXVzdFVuZGVydGFuZFRlc3RzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvaGFuZGxlci9Sb2xlQmFzZWRNdXN0VW5kZXJ0YW5kVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTIyN2YwYS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvaGFuZGxlci9Sb2xlQmFzZWRNdXN0VW5kZXJ0YW5kVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKiANCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqICAgICAgDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5oYW5kbGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlJvbGVQbGF5ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBIZWFkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQSGVhZGVyQmxvY2s7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkRlc2NyaXB0aW9uRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5FbmRwb2ludERlc2NyaXB0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLlNlcnZpY2VEZXNjcmlwdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi54bWwuaGFuZGxlci5IYW5kbGVyQ2hhaW5UeXBlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLnhtbC5oYW5kbGVyLkhhbmRsZXJDaGFpbnNUeXBlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLnhtbC5oYW5kbGVyLkhhbmRsZXJUeXBlOw0KLQ0KLWltcG9ydCBqYXZheC5qd3MuSGFuZGxlckNoYWluOw0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsNCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuSGFuZGxlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuUG9ydEluZm87DQotDQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCi0NCi0vKioNCi0gKiBUZXN0IFJvbGUgKFNPQVAgMS4yIHRlcm1pbm9sb2d5KSBvciBBY3RvciAoU09BUCAxLjEgdGVybWlub2xvZ3kpIG11c3RVbmRlcnRhbmQgcHJvY2Vzc2luZy4NCi0gKi8NCi1wdWJsaWMgY2xhc3MgUm9sZUJhc2VkTXVzdFVuZGVydGFuZFRlc3RzIGV4dGVuZHMgVGVzdENhc2Ugew0KLSAgICBwcml2YXRlIFNPQVBGYWN0b3J5IHNvYXAxMUZhY3Rvcnk7DQotICAgIHByaXZhdGUgU09BUEZhY3Rvcnkgc29hcDEyRmFjdG9yeTsNCi0gICAgcHJpdmF0ZSBPTUZhY3Rvcnkgb21GYWN0b3J5Ow0KLSAgICANCi0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZXNwYWNlID0gImh0dHA6Ly9Sb2xlQmFzZWRNdXN0VW5kZXJzdGFuZFRlc3QvZ29vZC9uYW1lc3BhY2UiOw0KLSAgICBwcml2YXRlIFN0cmluZyBzb2FwMTFOYW1lc3BhY2UgPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iOw0KLSAgICBwcml2YXRlIFN0cmluZyBoZWFkZXJfdWx0aW1hdGVSZWNlaXZlciA9ICJoZWFkZXJfdWx0aW1hdGVSZWNlaXZlciI7DQotICAgIHByaXZhdGUgU3RyaW5nIGhlYWRlcl91bHRpbWF0ZVJlY2VpdmVyX3Byb2Nlc3NlZCA9ICJoZWFkZXJfdWx0bWlhdGVSZWNlaXZlcl9wcm9jZXNzZWQiOw0KLSAgICBwcml2YXRlIFN0cmluZyBoZWFkZXJfcm9sZVBsYXllZCA9ICJoZWFkZXJfcm9sZVBsYXllZCI7DQotICAgIHByaXZhdGUgU3RyaW5nIGhlYWRlcl9yb2xlTm90UGxheWVkID0gImhlYWRlcl9yb2xlTm90UGxheWVkIjsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgaGVhZGVyX2JpbmRpbmdBZGRlZCA9ICJoZWFkZXJfYmluZGluZ0FkZGVkIjsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgaGVhZGVyX1NvYXBOZXh0ID0gImhlYWRlcl9Tb2FwTmV4dCI7DQotICAgIA0KLSAgICBwcml2YXRlIFN0cmluZyByb2xlUGxheWVkMSA9ICJodHRwOi8vUm9sZS9QbGF5ZWQvcm9sZTEiOw0KLSAgICBwcml2YXRlIFN0cmluZyByb2xlTm90UGxheWVkID0gImh0dHA6Ly9Sb2xlL05vdC9QbGF5ZWQvcm9sZTEiOw0KLSAgICBwcml2YXRlIFN0cmluZyByb2xlQmluZGluZ0FkZGVkID0gImh0dHA6Ly9Sb2xlL0FkZGVkL0J5L0JpbmRpbmciOw0KLSAgICBwcml2YXRlIFN0cmluZyByb2xlTm9IZWFkZXJzID0gImh0dHA6Ly9Sb2xlL1BsYXllZC9Oby9IZWFkZXJzIjsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgcm9sZUhhbmRsZXJBZGRlZCA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9oYW5kbGVyL0FkZGVkUm9sZSI7DQotICAgIHByaXZhdGUgU3RyaW5nIHJvbGVIYW5kbGVyQWRkZWQyID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2hhbmRsZXIvQWRkZWRSb2xlMiI7DQotICAgIHByaXZhdGUgU3RyaW5nIHJvbGVTb2FwMTFOZXh0ID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvYWN0b3IvbmV4dCI7DQotDQotICAgIHB1YmxpYyBSb2xlQmFzZWRNdXN0VW5kZXJ0YW5kVGVzdHMoU3RyaW5nIHRlc3ROYW1lKSB7DQotICAgICAgICBzdXBlcih0ZXN0TmFtZSk7DQotICAgICAgICBzb2FwMTFGYWN0b3J5ID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDExRmFjdG9yeSgpOw0KLSAgICAgICAgc29hcDEyRmFjdG9yeSA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMkZhY3RvcnkoKTsNCi0gICAgICAgIG9tRmFjdG9yeSA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogVmFsaWRhdGUgdGhhdCBoYW5kbGVyIGluZm9ybWF0aW9uIGNhbiBiZSBjYWNoZWQgb24gdGhlIFNlcnZpY2VEZXNjcml0cGlvbiBvbiB0aGUgc2VydmVyIHNpZGUuIA0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdENhY2hpbmdPblNlcnZlcigpIHsNCi0gICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzZXJ2aWNlRGVzYyA9IERlc2NyaXB0aW9uRmFjdG9yeS5jcmVhdGVTZXJ2aWNlRGVzY3JpcHRpb24oUm9sZUJhc2VkTVVTZXJ2aWNlSW1wbC5jbGFzcyk7DQotICAgICAgICBIYW5kbGVyUmVzb2x2ZXJJbXBsIGhhbmRsZXJSZXNvbHZlcjEgPSBuZXcgSGFuZGxlclJlc29sdmVySW1wbChzZXJ2aWNlRGVzYyk7DQotICAgICAgICBIYW5kbGVyUmVzb2x2ZXJJbXBsIGhhbmRsZXJSZXNvbHZlcjIgPSBuZXcgSGFuZGxlclJlc29sdmVySW1wbChzZXJ2aWNlRGVzYyk7DQotDQotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVwRGVzYyA9IHNlcnZpY2VEZXNjLmdldEVuZHBvaW50RGVzY3JpcHRpb25zKClbMF07DQotICAgICAgICBQb3J0SW5mbyBwb3J0SW5mbyA9IGVwRGVzYy5nZXRQb3J0SW5mbygpOw0KLSAgICAgICAgDQotICAgICAgICBMaXN0PFN0cmluZz4gcm9sZXMxID0gaGFuZGxlclJlc29sdmVyMS5nZXRSb2xlcyhwb3J0SW5mbyk7DQotICAgICAgICBMaXN0PFN0cmluZz4gcm9sZXMyID0gaGFuZGxlclJlc29sdmVyMi5nZXRSb2xlcyhwb3J0SW5mbyk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHJvbGVzMSk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHJvbGVzMik7DQotICAgICAgICBhc3NlcnRUcnVlKHJvbGVzMSA9PSByb2xlczIpOw0KLSAgICB9DQotICAgIA0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFZhbGlkYXRlIHRoYXQgaGFuZGxlciBpbmZvcm1hdGlvbiBjYW4gTk9UIGJlIGNhY2hlZCBvbiB0aGUgY2xpZW50LiAgVGhhdCBpcyBiZWNhdXNlIHRoZSBjbGllbnQNCi0gICAgICogY2FuIHNwZWNpZnkgaGFuZGxlciBpbmZvcm1hdGlvbiBwZXIgaW5zdGFuY2Ugb2YgYSBzZXJ2aWNlIGRlbGVnYXRlLiAgVGhvc2Ugc2VydmljZQ0KLSAgICAgKiBkZWxlZ2F0ZXMgY291bGQgc2hhcmUgYSBTZXJ2aWNlRGVzY3JpcHRpb24sIGJ1dCBzaW5jZSBlYWNoIHNlcnZpY2UgZGVsZWdhdGUgY291bGQgc3BlY2lmeQ0KLSAgICAgKiB1bmlxdWUgaGFuZGxlciBpbmZvcm1hdGlvbiwgd2UgY2FuJ3QgdXNlIGNvbW1vbiBoYW5kbGVyIGluZm9ybWF0aW9uIHN0b3JlZCBvbiB0aGUNCi0gICAgICogU2VydmljZURlc2NyaXB0aW9uIA0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdENhY2hpbmdPbkNsaWVudCgpIHsNCi0gICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzZXJ2aWNlRGVzYyA9IERlc2NyaXB0aW9uRmFjdG9yeS5jcmVhdGVTZXJ2aWNlRGVzY3JpcHRpb24oUm9sZUJhc2VkTVVTZXJ2aWNlSW1wbC5jbGFzcyk7DQotICAgICAgICBIYW5kbGVyUmVzb2x2ZXJJbXBsIGhhbmRsZXJSZXNvbHZlcjEgPSBuZXcgSGFuZGxlclJlc29sdmVySW1wbChzZXJ2aWNlRGVzYywgInNkMSIpOw0KLSAgICAgICAgSGFuZGxlclJlc29sdmVySW1wbCBoYW5kbGVyUmVzb2x2ZXIyID0gbmV3IEhhbmRsZXJSZXNvbHZlckltcGwoc2VydmljZURlc2MsICJzZDIiKTsNCi0NCi0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZXBEZXNjID0gc2VydmljZURlc2MuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbnMoKVswXTsNCi0gICAgICAgIFBvcnRJbmZvIHBvcnRJbmZvID0gZXBEZXNjLmdldFBvcnRJbmZvKCk7DQotICAgICAgICANCi0gICAgICAgIExpc3Q8U3RyaW5nPiByb2xlczEgPSBoYW5kbGVyUmVzb2x2ZXIxLmdldFJvbGVzKHBvcnRJbmZvKTsNCi0gICAgICAgIExpc3Q8U3RyaW5nPiByb2xlczIgPSBoYW5kbGVyUmVzb2x2ZXIyLmdldFJvbGVzKHBvcnRJbmZvKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwocm9sZXMxKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwocm9sZXMyKTsNCi0gICAgICAgIGFzc2VydFRydWUocm9sZXMxICE9IHJvbGVzMik7DQotICAgICAgICANCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFRoZSBKQVhXUyBTcGVjLCBzZWN0aW9uIDEwLCBzYXlzIHJvbGVzIGNhbiBiZSBzZXQgb24gdGhlIFNPQVAgYmluZGluZy4gIFZlcmlmeSB0aGF0IGEgDQotICAgICAqIG11c3RVbmRlcnN0YW5kIGhlYWRlciB3aGljaCBpcyBub3QgcHJvY2Vzc2VkIGZvciBhIHJvbGUgYWRkZWQgYnkgdGhlIFNPQVBCaW5kaW5nIGNhdXNlcw0KLSAgICAgKiBhIE5vdCBVbmRlcnN0b29kIGZhdWx0IA0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdFJvbGVBZGRlZFRvU29hcEJpbmRpbmcoKSB7DQotICAgICAgICBSb2xlUGxheWVyIHJvbGVQbGF5ZXIgPSBuZXcgVWx0aW1hdGVEZXN0aW5hdGlvblJvbGVzKCk7DQotICAgICAgICANCi0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1zY0N0eDExID0gY3JlYXRlTWVzc2FnZUNvbnRleHQoc29hcDExRmFjdG9yeSk7DQotICAgICAgICAvLyBOb3RlIHRoYXQgc2luY2UgdGhpcyByb2xlIGlzIFVsdGltYXRlUmVjZWl2ZXIsIGFsbCB1bnByb2Nlc3NlZCBoZWFkZXJzIHdpbGwgYmUgc2V0DQotICAgICAgICAvLyBvbiB0aGUgbWVzc2FnZSBjb250ZXh0DQotICAgICAgICBzZXRVbnByb2Nlc3NlZEhlYWRlcnMobXNjQ3R4MTEsIHJvbGVQbGF5ZXIpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBJbmRpY2F0ZSB3ZSB1bmRlcnN0YW5kIChlLmcuIHZpYSBoYW5kbGVycykgdGhlIGhlYWRlcnMgZm9yIFVsdGltYXRlIFJlY2VpdmVyIGFuZCB0aGUNCi0gICAgICAgIC8vIHJvbGUgd2UgYXJlIGFjdGluZyBpbi4gIFdlIGRvbid0IGluZGljYXRlIHdlIHVuZGVyc3RhbmQgdGhlIGhlYWRlciB0aGF0IHRoZSBTT0FQQmluZGluZw0KLSAgICAgICAgLy8gYWRkZWQsIHNvIHRoYXQgc2hvdWxkIGNhdXNlIGFuIGV4Y2VwdGlvbg0KLSAgICAgICAgTGlzdDxRTmFtZT4gdW5kZXJzdG9vZEhlYWRlcnMgPSBuZXcgQXJyYXlMaXN0PFFOYW1lPigpOw0KLSAgICAgICAgdW5kZXJzdG9vZEhlYWRlcnMuYWRkKG5ldyBRTmFtZShuYW1lc3BhY2UsIGhlYWRlcl91bHRpbWF0ZVJlY2VpdmVyKSk7DQotICAgICAgICB1bmRlcnN0b29kSGVhZGVycy5hZGQobmV3IFFOYW1lKG5hbWVzcGFjZSwgaGVhZGVyX3JvbGVQbGF5ZWQpKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQ3JlYXRlIGEgbGlzdCBvZiBhZGRpdGlvbmFsIHJvbGVzIHRoYXQgYWN0ZWQgaW4gKGUuZy4gb25lIHBsYXllZCBieSBhIEpBWFdTDQotICAgICAgICAvLyBoYW5kbGVyKQ0KLSAgICAgICAgTGlzdDxTdHJpbmc+IGhlYWRlclJvbGVzUGxheWVkID0gYmluZGluZ0FkZGVkUm9sZSgpOw0KLQ0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBIYW5kbGVyVXRpbHMuY2hlY2tNdXN0VW5kZXJzdGFuZChtc2NDdHgxMSwgdW5kZXJzdG9vZEhlYWRlcnMsIGhlYWRlclJvbGVzUGxheWVkKTsNCi0gICAgICAgICAgICBmYWlsKCJTaG91bGQgaGF2ZSBnb3R0ZW4gTm90VW5kZXJzdG9vZCBmYXVsdCBmb3IgaGVhZGVyIGZvciByb2xlIGFkZGVkIGJ5IGJpbmRpbmc6ICIgKyBoZWFkZXJfYmluZGluZ0FkZGVkKTsNCi0gICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBhZikgew0KLSAgICAgICAgICAgIC8vIEV4cGVjdGVkIHBhdGg7IHNob3VsZCBnZXQgZXhjZXB0aW9uIGZvciB1bHRpbWF0ZSByZWNlaXZlciBub3QgcHJvY2Vzc2VkLg0KLSAgICAgICAgICAgIFN0cmluZyBjaGVja0ZhdWx0ID0gYWYudG9TdHJpbmcoKTsNCi0gICAgICAgICAgICBpZiAoIWNoZWNrRmF1bHQuY29udGFpbnMoIk11c3QgVW5kZXJzdGFuZCBjaGVjayBmYWlsZWQiKQ0KLSAgICAgICAgICAgICAgICB8fCAhY2hlY2tGYXVsdC5jb250YWlucyhoZWFkZXJfYmluZGluZ0FkZGVkKSkgew0KLSAgICAgICAgICAgICAgICBmYWlsKCJEaWQgbm90IGdldCBleHBlY3RlZCBOb3RVbmRlcnN0b29kIEF4aXNGYXVsdC4gIFVuZXhwZWN0ZWQgZmF1bHQgIiArIGFmKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGZhaWwoIkNhdWdodCB1bmV4cGVjdGVkIGV4Y2VwdGlvbiAgKyBlIik7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBUZXN0IHdoZXJlIHRoZXJlIGFyZSBubyBwcmV2aW91cyBub24tdW5kZXJzdG9vZCBoZWFkZXJzIG9uIHRoZSBNZXNzYWdlQ29udGV4dCBhbmQgdGhlcmUncyBhbiANCi0gICAgICogYWRkaXRpb25hbCBSb2xlIGFkZGVkIGJ5IGEgSkFYV1MgaGFuZGxlcg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdE9ubHlTb2FwQmluZGluZ1JvbGUoKSB7DQotICAgICAgICBNZXNzYWdlQ29udGV4dCBtc2NDdHgxMSA9IGNyZWF0ZU1lc3NhZ2VDb250ZXh0KHNvYXAxMUZhY3RvcnkpOw0KLSAgICAgICAgLy8gTm90ZSB0aGF0IHdlIGFyZSBub3QgcHV0dGluZyBhbnkgbm9uLXVuZGVyc3Rvb2QgaGVhZGVycyBvbiB0aGUgbWVzc2FnZSBjb250ZXh0DQotICAgICAgICAvLyBDcmVhdGUgYSBsaXN0IG9mIGFkZGl0aW9uYWwgcm9sZXMgKGUuZy4gb25lIHBsYXllZCBieSBhIEpBWFdTDQotICAgICAgICAvLyBoYW5kbGVyDQotICAgICAgICBMaXN0PFN0cmluZz4gaGVhZGVyUm9sZXNQbGF5ZWQgPSBiaW5kaW5nQWRkZWRSb2xlKCk7DQotDQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIEhhbmRsZXJVdGlscy5jaGVja011c3RVbmRlcnN0YW5kKG1zY0N0eDExLCBudWxsLCBoZWFkZXJSb2xlc1BsYXllZCk7DQotICAgICAgICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgZ290dGVuIE5vdFVuZGVyc3Rvb2QgZmF1bHQgZm9yIGhlYWRlciBmb3Igcm9sZSBhZGRlZCBieSBiaW5kaW5nOiAiICsgaGVhZGVyX2JpbmRpbmdBZGRlZCk7DQotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgYWYpIHsNCi0gICAgICAgICAgICAvLyBFeHBlY3RlZCBwYXRoOyBzaG91bGQgZ2V0IGV4Y2VwdGlvbiBmb3IgdWx0aW1hdGUgcmVjZWl2ZXIgbm90IHByb2Nlc3NlZC4NCi0gICAgICAgICAgICBTdHJpbmcgY2hlY2tGYXVsdCA9IGFmLnRvU3RyaW5nKCk7DQotICAgICAgICAgICAgaWYgKCFjaGVja0ZhdWx0LmNvbnRhaW5zKCJNdXN0IFVuZGVyc3RhbmQgY2hlY2sgZmFpbGVkIikNCi0gICAgICAgICAgICAgICAgfHwgIWNoZWNrRmF1bHQuY29udGFpbnMoaGVhZGVyX2JpbmRpbmdBZGRlZCkpIHsNCi0gICAgICAgICAgICAgICAgZmFpbCgiRGlkIG5vdCBnZXQgZXhwZWN0ZWQgTm90VW5kZXJzdG9vZCBBeGlzRmF1bHQuICBVbmV4cGVjdGVkIGZhdWx0ICIgKyBhZik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBmYWlsKCJDYXVnaHQgdW5leHBlY3RlZCBleGNlcHRpb24gICsgZSIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogVGVzdCB0aGF0IGFkZGluZyBhIHJvbGUgZm9yIGhlYWRlcnMgdGhhdCBkb2VzIG5vdCBleGlzdCBkb2VzIG5vdCBjYXVzZSBhbnkgZmF1bHQNCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3ROb0hlYWRlcnNGb3JTb2FwQmluZGluZ1JvbGUoKSB7DQotICAgICAgICBNZXNzYWdlQ29udGV4dCBtc2NDdHgxMSA9IGNyZWF0ZU1lc3NhZ2VDb250ZXh0KHNvYXAxMUZhY3RvcnkpOw0KLQ0KLSAgICAgICAgTGlzdDxTdHJpbmc+IGhlYWRlclJvbGVzUGxheWVkID0gbm9IZWFkZXJzUm9sZSgpOw0KLQ0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBIYW5kbGVyVXRpbHMuY2hlY2tNdXN0VW5kZXJzdGFuZChtc2NDdHgxMSwgbnVsbCwgaGVhZGVyUm9sZXNQbGF5ZWQpOw0KLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGFmKSB7DQotICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBBeGlzRmF1bHQgIisgYWYpOw0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBmYWlsKCJDYXVnaHQgdW5leHBlY3RlZCBleGNlcHRpb24gICsgZSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgIH0NCi0gICAgLyoqDQotICAgICAqIEEgbXVzdFVuZGVyc3RhbmQgaGVhZGVyIGZvciBhIHJvbGUgbm90IGJlaW5nIGFjdGVkIGluIHNob3VsZCBOT1QgY2F1c2UgYSBub3RVbmRlcnN0b29kDQotICAgICAqIGZhdWx0LiANCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RSb2xlTm90QWN0aW5nSW4oKSB7DQotICAgICAgICBSb2xlUGxheWVyIHJvbGVQbGF5ZXIgPSBuZXcgVWx0aW1hdGVEZXN0aW5hdGlvblJvbGVzKCk7DQotICAgICAgICANCi0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1zY0N0eDExID0gY3JlYXRlTWVzc2FnZUNvbnRleHQoc29hcDExRmFjdG9yeSk7DQotICAgICAgICAvLyBOb3RlIHRoYXQgc2luY2UgdGhpcyByb2xlIGlzIFVsdGltYXRlUmVjZWl2ZXIsIGFsbCB1bnByb2Nlc3NlZCBoZWFkZXJzIHdpbGwgYmUgc2V0DQotICAgICAgICAvLyBvbiB0aGUgbWVzc2FnZSBjb250ZXh0DQotICAgICAgICBzZXRVbnByb2Nlc3NlZEhlYWRlcnMobXNjQ3R4MTEsIHJvbGVQbGF5ZXIpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBJbmRpY2F0ZSB3ZSB1bmRlcnN0YW5kIChlLmcuIHZpYSBoYW5kbGVycykgdGhlIGhlYWRlcnMgZm9yIFVsdGltYXRlIFJlY2VpdmVyIGFuZCB0aGUNCi0gICAgICAgIC8vIHJvbGUgd2UgYXJlIGFjdGluZyBpbi4gIFRoaXMgbGVhdmVzIHRoZSBtdXN0VW5kZXJzdGFuZCBoZWFkZXIgZm9yIHRoZSByb2xlIHdlIGFyZSBub3QgDQotICAgICAgICAvLyBhY3RpbmcgaW4sIHdoaWNoIHNob3VsZCBub3QgY2F1c2UgYW4gZXhjZXB0aW9uLg0KLSAgICAgICAgTGlzdDxRTmFtZT4gdW5kZXJzdG9vZEhlYWRlcnMgPSBuZXcgQXJyYXlMaXN0PFFOYW1lPigpOw0KLSAgICAgICAgdW5kZXJzdG9vZEhlYWRlcnMuYWRkKG5ldyBRTmFtZShuYW1lc3BhY2UsIGhlYWRlcl91bHRpbWF0ZVJlY2VpdmVyKSk7DQotICAgICAgICB1bmRlcnN0b29kSGVhZGVycy5hZGQobmV3IFFOYW1lKG5hbWVzcGFjZSwgaGVhZGVyX3JvbGVQbGF5ZWQpKTsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgSGFuZGxlclV0aWxzLmNoZWNrTXVzdFVuZGVyc3RhbmQobXNjQ3R4MTEsIHVuZGVyc3Rvb2RIZWFkZXJzLCBudWxsKTsNCi0gICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBlKSB7DQotICAgICAgICAgICAgZmFpbCgiU2hvdWxkIG5vdCBoYXZlIGNhdWdodCBhbiBBeGlzRmF1bHQgIiArIGUpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogVGVzdCBtdXN0VW5kZXJzdGFuZCBwcm9jZXNzaW5nIGZvciBVbHRpbWF0ZSBSZWNlaXZlciB3aXRoIGFuIHVuZGVyc3Rvb2QgaGVhZGVyIGxpc3QNCi0gICAgICogcGFzc2VkIHRvIHRoZSBtdXN0VW5kZXJzdGFuZCBjaGVja2luZw0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdFVsdGltYXRlUmVjZWl2ZXJSb2xlcygpIHsNCi0gICAgICAgIA0KLSAgICAgICAgUm9sZVBsYXllciByb2xlUGxheWVyID0gbmV3IFVsdGltYXRlRGVzdGluYXRpb25Sb2xlcygpOw0KLSAgICAgICAgTWVzc2FnZUNvbnRleHQgbXNjQ3R4MTEgPSBjcmVhdGVNZXNzYWdlQ29udGV4dChzb2FwMTFGYWN0b3J5KTsNCi0gICAgICAgIHNldFVucHJvY2Vzc2VkSGVhZGVycyhtc2NDdHgxMSwgcm9sZVBsYXllcik7DQotICAgICAgICAvLyBJbmRpY2F0ZSB3ZSB1bmRlcnN0YW5kIChlLmcuIHZpYSBoYW5kbGVycykgYWxsIHRoZSBoZWFkZXJzLg0KLSAgICAgICAgTGlzdDxRTmFtZT4gdW5kZXJzdG9vZEhlYWRlcnMgPSBuZXcgQXJyYXlMaXN0PFFOYW1lPigpOw0KLSAgICAgICAgdW5kZXJzdG9vZEhlYWRlcnMuYWRkKG5ldyBRTmFtZShuYW1lc3BhY2UsIGhlYWRlcl91bHRpbWF0ZVJlY2VpdmVyKSk7DQotICAgICAgICB1bmRlcnN0b29kSGVhZGVycy5hZGQobmV3IFFOYW1lKG5hbWVzcGFjZSwgaGVhZGVyX3JvbGVQbGF5ZWQpKTsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgSGFuZGxlclV0aWxzLmNoZWNrTXVzdFVuZGVyc3RhbmQobXNjQ3R4MTEsIHVuZGVyc3Rvb2RIZWFkZXJzLCBudWxsKTsNCi0gICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBlKSB7DQotICAgICAgICAgICAgZmFpbCgiU2hvdWxkIG5vdCBoYXZlIGNhdWdodCBhbiBBeGlzRmF1bHQgIiArIGUpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBWZXJpZnkgdGhhdCBhbiBVbHRpbWF0ZSBSZWNlaXZlciB3aXRoIG5vIHJvbGVzIG9ubHkgeWllbGRzIHRoZSBoZWFkZXIgd2l0aCBubyByb2xlIHNwZWNpZmllZA0KLSAgICAgKiBhcyB1bnByb2Nlc3NlZCBhbmQgdGhhdCBwYXNzaW5nIGEgbGlzdCBvZiB1bmRlcnN0b29kIGhlYWRlcnMgaW5jbHVkaW5nIGp1c3QgdGhhdCBvbmUgY2F1c2VzDQotICAgICAqIHRoZSBtdXN0VW5kZXJzdGFuZCBjaGVja3MgdG8gcGFzcy4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RVbHRpbWF0ZVJlY2VpdmVyKCkgew0KLSAgICAgICAgUm9sZVBsYXllciByb2xlUGxheWVyID0gbmV3IFVsdGltYXRlRGVzdGluYXRpb25Ob1JvbGVzKCk7DQotICAgICAgICBNZXNzYWdlQ29udGV4dCBtc2dDdHggPSBjcmVhdGVNZXNzYWdlQ29udGV4dChzb2FwMTFGYWN0b3J5KTsNCi0gICAgICAgIC8vIEluZGljYXRlIHRoZSBtdXN0IHVuZGVyc3RhbmQgaGVhZGVyIHdpdGhvdXQgYW4gZXhwbGljaXQgcm9sZSB3aWxsIGJlIHVuZGVyc3Rvb2QuDQotICAgICAgICAvLyBUaGUgb3RoZXIgaGVhZGVycywgd2l0aCBleHBsaWNpdCByb2xlcywgc2hvdWxkIG5vdCBjYXVzZSBhbiBlcnJvci4NCi0gICAgICAgIHNldFVucHJvY2Vzc2VkSGVhZGVycyhtc2dDdHgsIHJvbGVQbGF5ZXIpOw0KLSAgICAgICAgTGlzdDxRTmFtZT4gdW5kZXJzdG9vZEhlYWRlcnMgPSBuZXcgQXJyYXlMaXN0PFFOYW1lPigpOw0KLSAgICAgICAgdW5kZXJzdG9vZEhlYWRlcnMuYWRkKG5ldyBRTmFtZShuYW1lc3BhY2UsIGhlYWRlcl91bHRpbWF0ZVJlY2VpdmVyKSk7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIEhhbmRsZXJVdGlscy5jaGVja011c3RVbmRlcnN0YW5kKG1zZ0N0eCwgdW5kZXJzdG9vZEhlYWRlcnMsIG51bGwpOw0KLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGUpIHsNCi0gICAgICAgICAgICBmYWlsKCJTaG91bGQgbm90IGhhdmUgY2F1Z2h0IGFuZCBBeGlzRmF1bHQgIiArIGUpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIC8qKg0KLSAgICAgKiBUZXN0IG11c3RVbmRlcnN0YW5kIHByb2Nlc3NpbmcgZm9yIFVsdGltYXRlIFJlY2VpdmVyIHdpdGhvdXQgYWRkaXRpb25hbCB1bmRlcnN0b29kIGhlYWRlcnMNCi0gICAgICogYmVpbmcgcGFzc2VkIHRvIHRoZSBjaGVja2VyLiAgVGhpcyBzaG91bGQgY2F1c2UgYSBub3RVbmRlcnN0b29kIGZhdWx0DQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VWx0aW1hdGVSZWNlaXZlck5vUm9sZXMoKSB7DQotICAgICAgICBSb2xlUGxheWVyIHJvbGVQbGF5ZXIgPSBuZXcgVWx0aW1hdGVEZXN0aW5hdGlvbk5vUm9sZXMoKTsNCi0NCi0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0MTEgPSBjcmVhdGVNZXNzYWdlQ29udGV4dChzb2FwMTFGYWN0b3J5KTsNCi0gICAgICAgIHNldFVucHJvY2Vzc2VkSGVhZGVycyhtZXNzYWdlQ29udGV4dDExLCByb2xlUGxheWVyKTsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgSGFuZGxlclV0aWxzLmNoZWNrTXVzdFVuZGVyc3RhbmQobWVzc2FnZUNvbnRleHQxMSwgbnVsbCwgbnVsbCk7DQotICAgICAgICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgZ290dGVuIE11c3RVbmRlcnN0YW5kIEhlYWRlciBOb3QgVW5kZXJzdG9vZCBmYXVsdCIpOw0KLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGFmKSB7DQotICAgICAgICAgICAgLy8gRXhwZWN0ZWQgcGF0aDsgc2hvdWxkIGdldCBleGNlcHRpb24gZm9yIHVsdGltYXRlIHJlY2VpdmVyIG5vdCBwcm9jZXNzZWQuDQotICAgICAgICAgICAgU3RyaW5nIGNoZWNrRmF1bHQgPSBhZi50b1N0cmluZygpOw0KLSAgICAgICAgICAgIGlmICghY2hlY2tGYXVsdC5jb250YWlucygiTXVzdCBVbmRlcnN0YW5kIGNoZWNrIGZhaWxlZCIpDQotICAgICAgICAgICAgICAgIHx8ICFjaGVja0ZhdWx0LmNvbnRhaW5zKGhlYWRlcl91bHRpbWF0ZVJlY2VpdmVyKSkgew0KLSAgICAgICAgICAgICAgICBmYWlsKCJEaWQgbm90IGdldCBleHBlY3RlZCBOb3RVbmRlcnN0b29kIEF4aXNGYXVsdC4gIFVuZXhwZWN0ZWQgZmF1bHQgIiArIGFmKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGZhaWwoIkNhdWdodCB1bmV4cGVjdGVkIGV4Y2VwdGlvbiAgKyBlIik7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0MTIgPSBjcmVhdGVNZXNzYWdlQ29udGV4dChzb2FwMTJGYWN0b3J5KTsNCi0gICAgICAgIHNldFVucHJvY2Vzc2VkSGVhZGVycyhtZXNzYWdlQ29udGV4dDEyLCByb2xlUGxheWVyKTsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgSGFuZGxlclV0aWxzLmNoZWNrTXVzdFVuZGVyc3RhbmQobWVzc2FnZUNvbnRleHQxMiwgbnVsbCwgbnVsbCk7DQotICAgICAgICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgZ290dGVuIE11c3RVbmRlcnN0YW5kIEhlYWRlciBOb3QgVW5kZXJzdG9vZCBmYXVsdCIpOw0KLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGFmKSB7DQotICAgICAgICAgICAgLy8gRXhwZWN0ZWQgcGF0aDsgc2hvdWxkIGdldCBleGNlcHRpb24gZm9yIHVsdGltYXRlIHJlY2VpdmVyIG5vdCBwcm9jZXNzZWQuDQotICAgICAgICAgICAgaWYgKCFhZi50b1N0cmluZygpLmNvbnRhaW5zKCJNdXN0IFVuZGVyc3RhbmQgY2hlY2sgZmFpbGVkIikpIHsNCi0gICAgICAgICAgICAgICAgZmFpbCgiRGlkIG5vdCBnZXQgZXhwZWN0ZWQgTm90VW5kZXJzdG9vZCBBeGlzRmF1bHQuICBVbmV4cGVjdGVkIGZhdWx0ICIgKyBhZik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBmYWlsKCJDYXVnaHQgdW5leHBlY3RlZCBleGNlcHRpb24gICsgZSIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogVGVzdCBhIFJvbGVQbGF5ZXIgdGhhdCBpcyBub3QgYW4gdWx0aW1hdGUgcmVjZWl2ZXIgYW5kIGRvZXMgbm90IGFjdCBpbiBhbnkgcm9sZXMNCi0gICAgICogY29ycmVzcG9uZGluZyB0byBoZWFkZXJzLiAgVGhlcmUgc2hvdWxkIGJlIG5vIGZhdWx0cyBjYXVzZSBieSB0aGUgbXVzdFVuZGVyc3RhbmQgaGVhZGVycw0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdE5vdFVsdGltYXRlUmVjZWl2ZXJOb1JvbGVzKCkgew0KLSAgICAgICAgUm9sZVBsYXllciByb2xlUGxheWVyID0gbmV3IE5vdFVsdGltYXRlRGVzdGluYXRpb25Ob1JvbGVzKCk7DQotICAgICAgICANCi0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1zZ0N0eDExID0gY3JlYXRlTWVzc2FnZUNvbnRleHQoc29hcDExRmFjdG9yeSk7DQotICAgICAgICBzZXRVbnByb2Nlc3NlZEhlYWRlcnMobXNnQ3R4MTEsIHJvbGVQbGF5ZXIpOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBIYW5kbGVyVXRpbHMuY2hlY2tNdXN0VW5kZXJzdGFuZChtc2dDdHgxMSwgbnVsbCwgbnVsbCk7DQotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgZSkgew0KLSAgICAgICAgICAgIGZhaWwoIlNob3VsZCBub3QgaGF2ZSBjYXVnaHQgYW5kIEF4aXNGYXVsdCIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICBNZXNzYWdlQ29udGV4dCBtc2dDdHgxMiA9IGNyZWF0ZU1lc3NhZ2VDb250ZXh0KHNvYXAxMkZhY3RvcnkpOw0KLSAgICAgICAgc2V0VW5wcm9jZXNzZWRIZWFkZXJzKG1zZ0N0eDEyLCByb2xlUGxheWVyKTsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgSGFuZGxlclV0aWxzLmNoZWNrTXVzdFVuZGVyc3RhbmQobXNnQ3R4MTIsIG51bGwsIG51bGwpOw0KLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGUpIHsNCi0gICAgICAgICAgICBmYWlsKCJTaG91bGQgbm90IGhhdmUgY2F1Z2h0IGFuZCBBeGlzRmF1bHQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFRlc3QgdGhhdCB0aGUgSGFuZGxlclJlc29sdmVySW1wbCByZXR1cm5zIHRoZSBjb3JyZWN0IHJvbGVzIGRlZmluZWQgaW4gdGhlIGhhbmRsZXIgY29uZmlnDQotICAgICAqIGZpbGUgPHNvYXAtcm9sZT4gZWxlbWVudHMuDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SGFuZGxlclJlc29sdmVyR2V0Um9sZXMoKSB7DQotICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc2VydmljZURlc2MgPSBEZXNjcmlwdGlvbkZhY3RvcnkuY3JlYXRlU2VydmljZURlc2NyaXB0aW9uKFJvbGVCYXNlZE1VU2VydmljZUltcGwuY2xhc3MpOw0KLSAgICAgICAgSGFuZGxlclJlc29sdmVySW1wbCBoYW5kbGVyUmVzb2x2ZXIgPSBuZXcgSGFuZGxlclJlc29sdmVySW1wbChzZXJ2aWNlRGVzYyk7DQotICAgICAgICANCi0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZXBEZXNjID0gc2VydmljZURlc2MuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbnMoKVswXTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSByb2xlIGluZm9ybWF0aW9uIGlzIHNwZWNpZmllZCBpbiB0aGUgaGFuZGxlciBjb25maWcgZmlsZQ0KLSAgICAgICAgSGFuZGxlckNoYWluc1R5cGUgZXBIYW5kbGVyQ2hhaW5zID0gZXBEZXNjLmdldEhhbmRsZXJDaGFpbigpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChlcEhhbmRsZXJDaGFpbnMpOw0KLSAgICAgICAgTGlzdDxIYW5kbGVyQ2hhaW5UeXBlPiBlcEhhbmRsZXJDaGFpbiA9IGVwSGFuZGxlckNoYWlucy5nZXRIYW5kbGVyQ2hhaW4oKTsNCi0gICAgICAgIGFzc2VydEVxdWFscygxLCBlcEhhbmRsZXJDaGFpbi5zaXplKCkpOw0KLSAgICAgICAgTGlzdDxIYW5kbGVyVHlwZT4gZXBIYW5kbGVyID0gZXBIYW5kbGVyQ2hhaW4uZ2V0KDApLmdldEhhbmRsZXIoKTsNCi0gICAgICAgIGFzc2VydEVxdWFscygxLCBlcEhhbmRsZXIuc2l6ZSgpKTsNCi0gICAgICAgIEhhbmRsZXJUeXBlIGhhbmRsZXJUeXBlID0gZXBIYW5kbGVyLmdldCgwKTsNCi0gICAgICAgIExpc3Q8b3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi54bWwuaGFuZGxlci5TdHJpbmc+IHNvYXBSb2xlcyA9IA0KLSAgICAgICAgICAgIGhhbmRsZXJUeXBlLmdldFNvYXBSb2xlKCk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHNvYXBSb2xlcyk7DQotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgc29hcFJvbGVzLnNpemUoKSk7DQotICAgICAgICBTdHJpbmcgYWRkZWRSb2xlID0gc29hcFJvbGVzLmdldCgwKS5nZXRWYWx1ZSgpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJvbGVIYW5kbGVyQWRkZWQsIGFkZGVkUm9sZSk7DQotICAgICAgICANCi0gICAgICAgIC8vIE5vdyB2ZXJpZnkgdGhlIHJvbGUgaW5mb3JtYXRpb24gaW4gdGhlIGhhbmRsZXIgY29uZmlnIGZpbGUgY29ycmVjdGx5IGFmZmVjdHMgdGhlDQotICAgICAgICAvLyByb2xlcyBwbGF5ZWQgcmV0dXJuZWQgZnJvbSB0aGUgUmVzb2x2ZXINCi0gICAgICAgIFBvcnRJbmZvIHBvcnRJbmZvID0gZXBEZXNjLmdldFBvcnRJbmZvKCk7DQotDQotICAgICAgICBMaXN0PFN0cmluZz4gaGFuZGxlclJvbGVzID0gaGFuZGxlclJlc29sdmVyLmdldFJvbGVzKHBvcnRJbmZvKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwoaGFuZGxlclJvbGVzKTsNCi0gICAgICAgIGFzc2VydEVxdWFscygxLCBoYW5kbGVyUm9sZXMuc2l6ZSgpKTsNCi0gICAgICAgIGFzc2VydEVxdWFscyhyb2xlSGFuZGxlckFkZGVkLCBoYW5kbGVyUm9sZXMuZ2V0KDApKTsNCi0gICAgICAgIA0KLSAgICAgICAgTGlzdDxIYW5kbGVyPiBoYW5kbGVyQ2hhaW4gPSBoYW5kbGVyUmVzb2x2ZXIuZ2V0SGFuZGxlckNoYWluKHBvcnRJbmZvKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwoaGFuZGxlckNoYWluKTsNCi0gICAgICAgIGFzc2VydEVxdWFscygxLCBoYW5kbGVyQ2hhaW4uc2l6ZSgpKTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFRlc3QgdGhhdCBtdWx0aXBsZSA8c29hcC1yb2xlPiBlbGVtZW50cyBpbiB0aGUgaGFuZGxlciBjb25maWcgZmlsZSB3b3JrIGNvcnJlY3RseS4gDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SGFuZGxlclJlc29sdmVyR2VyUm9sZXMyKCkgew0KLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNlcnZpY2VEZXNjID0gRGVzY3JpcHRpb25GYWN0b3J5LmNyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbihSb2xlQmFzZWRNVVNlcnZpY2VJbXBsMi5jbGFzcyk7DQotICAgICAgICBIYW5kbGVyUmVzb2x2ZXJJbXBsIGhhbmRsZXJSZXNvbHZlciA9IG5ldyBIYW5kbGVyUmVzb2x2ZXJJbXBsKHNlcnZpY2VEZXNjKTsNCi0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZXBEZXNjID0gc2VydmljZURlc2MuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbnMoKVswXTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSByb2xlIGluZm9ybWF0aW9uIGlzIHNwZWNpZmllZCBpbiB0aGUgaGFuZGxlciBjb25maWcgZmlsZQ0KLSAgICAgICAgSGFuZGxlckNoYWluc1R5cGUgZXBIYW5kbGVyQ2hhaW5zID0gZXBEZXNjLmdldEhhbmRsZXJDaGFpbigpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChlcEhhbmRsZXJDaGFpbnMpOw0KLSAgICAgICAgTGlzdDxIYW5kbGVyQ2hhaW5UeXBlPiBlcEhhbmRsZXJDaGFpbiA9IGVwSGFuZGxlckNoYWlucy5nZXRIYW5kbGVyQ2hhaW4oKTsNCi0gICAgICAgIGFzc2VydEVxdWFscygxLCBlcEhhbmRsZXJDaGFpbi5zaXplKCkpOw0KLSAgICAgICAgTGlzdDxIYW5kbGVyVHlwZT4gZXBIYW5kbGVyID0gZXBIYW5kbGVyQ2hhaW4uZ2V0KDApLmdldEhhbmRsZXIoKTsNCi0gICAgICAgIGFzc2VydEVxdWFscygxLCBlcEhhbmRsZXIuc2l6ZSgpKTsNCi0gICAgICAgIEhhbmRsZXJUeXBlIGhhbmRsZXJUeXBlID0gZXBIYW5kbGVyLmdldCgwKTsNCi0gICAgICAgIExpc3Q8b3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi54bWwuaGFuZGxlci5TdHJpbmc+IHNvYXBSb2xlcyA9IA0KLSAgICAgICAgICAgIGhhbmRsZXJUeXBlLmdldFNvYXBSb2xlKCk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHNvYXBSb2xlcyk7DQotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgc29hcFJvbGVzLnNpemUoKSk7DQotICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBjaGVja1JvbGVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQotICAgICAgICBjaGVja1JvbGVzLmFkZChzb2FwUm9sZXMuZ2V0KDApLmdldFZhbHVlKCkpOw0KLSAgICAgICAgY2hlY2tSb2xlcy5hZGQoc29hcFJvbGVzLmdldCgxKS5nZXRWYWx1ZSgpKTsNCi0gICAgICAgIGFzc2VydFRydWUoY2hlY2tSb2xlcy5jb250YWlucyhyb2xlSGFuZGxlckFkZGVkKSk7DQotICAgICAgICBhc3NlcnRUcnVlKGNoZWNrUm9sZXMuY29udGFpbnMocm9sZUhhbmRsZXJBZGRlZDIpKTsNCi0NCi0gICAgICAgIC8vIE5vdyB2ZXJpZnkgdGhlIHJvbGUgaW5mb3JtYXRpb24gaW4gdGhlIGhhbmRsZXIgY29uZmlnIGZpbGUgY29ycmVjdGx5IGFmZmVjdHMgdGhlDQotICAgICAgICAvLyByb2xlcyBwbGF5ZWQgcmV0dXJuZWQgZnJvbSB0aGUgUmVzb2x2ZXINCi0gICAgICAgIFBvcnRJbmZvIHBvcnRJbmZvID0gZXBEZXNjLmdldFBvcnRJbmZvKCk7DQotDQotICAgICAgICBMaXN0PFN0cmluZz4gaGFuZGxlclJvbGVzID0gaGFuZGxlclJlc29sdmVyLmdldFJvbGVzKHBvcnRJbmZvKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwoaGFuZGxlclJvbGVzKTsNCi0gICAgICAgIGFzc2VydEVxdWFscygyLCBoYW5kbGVyUm9sZXMuc2l6ZSgpKTsNCi0gICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IGNoZWNrUmVzb2x2ZXJSb2xlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLSAgICAgICAgY2hlY2tSZXNvbHZlclJvbGVzLmFkZCgoU3RyaW5nKSBoYW5kbGVyUm9sZXMuZ2V0KDApKTsNCi0gICAgICAgIGNoZWNrUmVzb2x2ZXJSb2xlcy5hZGQoKFN0cmluZykgaGFuZGxlclJvbGVzLmdldCgxKSk7DQotICAgICAgICBhc3NlcnRUcnVlKGNoZWNrUmVzb2x2ZXJSb2xlcy5jb250YWlucyhyb2xlSGFuZGxlckFkZGVkKSk7DQotICAgICAgICBhc3NlcnRUcnVlKGNoZWNrUmVzb2x2ZXJSb2xlcy5jb250YWlucyhyb2xlSGFuZGxlckFkZGVkMikpOw0KLSAgICAgICAgDQotICAgICAgICBMaXN0PEhhbmRsZXI+IGhhbmRsZXJDaGFpbiA9IGhhbmRsZXJSZXNvbHZlci5nZXRIYW5kbGVyQ2hhaW4ocG9ydEluZm8pOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChoYW5kbGVyQ2hhaW4pOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGhhbmRsZXJDaGFpbi5zaXplKCkpOw0KLQ0KLSAgICANCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFRlc3QgdGhhdCBhIFJvbGVQbGF5ZXIgd2l0aCBubyByb2xlcyBkb2Vzbid0IGNhdXNlIGFueSBwcm9ibGVtcyBpbiB0aGUgbXVzdFVuZGVyc3RhbmQNCi0gICAgICogY2hlY2tpbmcuDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SGFuZGxlclJlc29sdmVyRW1wdHlSb2xlc1BsYXllZCgpIHsNCi0gICAgICAgIA0KLSAgICAgICAgUm9sZVBsYXllciByb2xlUGxheWVyID0gbmV3IFVsdGltYXRlRGVzdGluYXRpb25Sb2xlcygpOw0KLSAgICAgICAgTWVzc2FnZUNvbnRleHQgbXNnQ3R4MTEgPSBjcmVhdGVNZXNzYWdlQ29udGV4dChzb2FwMTFGYWN0b3J5KTsNCi0gICAgICAgIHNldFVucHJvY2Vzc2VkSGVhZGVycyhtc2dDdHgxMSwgcm9sZVBsYXllcik7DQotICAgICAgICAvLyBJbmRpY2F0ZSB3ZSB1bmRlcnN0YW5kIChlLmcuIHZpYSBoYW5kbGVycykgYWxsIHRoZSBoZWFkZXJzLg0KLSAgICAgICAgTGlzdDxRTmFtZT4gdW5kZXJzdG9vZEhlYWRlcnMgPSBuZXcgQXJyYXlMaXN0PFFOYW1lPigpOw0KLSAgICAgICAgdW5kZXJzdG9vZEhlYWRlcnMuYWRkKG5ldyBRTmFtZShuYW1lc3BhY2UsIGhlYWRlcl91bHRpbWF0ZVJlY2VpdmVyKSk7DQotICAgICAgICB1bmRlcnN0b29kSGVhZGVycy5hZGQobmV3IFFOYW1lKG5hbWVzcGFjZSwgaGVhZGVyX3JvbGVQbGF5ZWQpKTsNCi0NCi0gICAgICAgIExpc3Q8U3RyaW5nPiBoYW5kbGVyUm9sZVBsYXllciA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBIYW5kbGVyVXRpbHMuY2hlY2tNdXN0VW5kZXJzdGFuZChtc2dDdHgxMSwgdW5kZXJzdG9vZEhlYWRlcnMsIGhhbmRsZXJSb2xlUGxheWVyKTsNCi0gICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBlKSB7DQotICAgICAgICAgICAgZmFpbCgiU2hvdWxkIG5vdCBoYXZlIGNhdWdodCBhbmQgQXhpc0ZhdWx0Iik7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSAgICAvLyBVdGlsaXR5IG1ldGhvZHMNCi0gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotDQotICAgIHByaXZhdGUgTWVzc2FnZUNvbnRleHQgY3JlYXRlTWVzc2FnZUNvbnRleHQoU09BUEZhY3Rvcnkgc29hcEZhY3RvcnkpIHsNCi0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0ID0gbnVsbDsNCi0gICAgICAgIEF4aXNTZXJ2aWNlIGFzMSA9IG5ldyBBeGlzU2VydmljZSgiU2VydmljZTEiKTsNCi0gICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNjID0gbnVsbDsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgY2MgPSBDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkuY3JlYXRlRW1wdHlDb25maWd1cmF0aW9uQ29udGV4dCgpOw0KLSAgICAgICAgICAgIEF4aXNDb25maWd1cmF0aW9uIGFjID0gY2MuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKTsNCi0gICAgICAgICAgICBhYy5hZGRTZXJ2aWNlKGFzMSk7DQotICAgICAgICAgICAgbWVzc2FnZUNvbnRleHQgPSBjYy5jcmVhdGVNZXNzYWdlQ29udGV4dCgpOw0KLSAgICAgICAgICAgIG1lc3NhZ2VDb250ZXh0LnNldEF4aXNTZXJ2aWNlKGFzMSk7DQotDQotICAgICAgICAgICAgU09BUEVudmVsb3BlIHNlID0gc29hcEZhY3RvcnkuY3JlYXRlU09BUEVudmVsb3BlKCk7DQotDQotICAgICAgICAgICAgU09BUEhlYWRlciBzaCA9IHNvYXBGYWN0b3J5LmNyZWF0ZVNPQVBIZWFkZXIoc2UpOw0KLQ0KLSAgICAgICAgICAgIFNPQVBIZWFkZXJCbG9jayBzaGIxID0gc2guYWRkSGVhZGVyQmxvY2soaGVhZGVyX3VsdGltYXRlUmVjZWl2ZXIsIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb21GYWN0b3J5LmNyZWF0ZU9NTmFtZXNwYWNlKG5hbWVzcGFjZSwgaGVhZGVyX3VsdGltYXRlUmVjZWl2ZXIpKTsNCi0gICAgICAgICAgICAvLyBTaW5jZSBubyByb2xlIHdhcyBzZXQgb24gdGhlIHNoYjEsIGRlZmF1bHQgaXMgdWx0aW1hdGUgcmVjZWl2ZXINCi0gICAgICAgICAgICBzaGIxLnNldE11c3RVbmRlcnN0YW5kKHRydWUpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIFNPQVBIZWFkZXJCbG9jayBzaGIyID0gc2guYWRkSGVhZGVyQmxvY2soaGVhZGVyX3JvbGVQbGF5ZWQsIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb21GYWN0b3J5LmNyZWF0ZU9NTmFtZXNwYWNlKG5hbWVzcGFjZSwgaGVhZGVyX3JvbGVQbGF5ZWQpKTsNCi0gICAgICAgICAgICBzaGIyLnNldFJvbGUocm9sZVBsYXllZDEpOw0KLSAgICAgICAgICAgIHNoYjIuc2V0TXVzdFVuZGVyc3RhbmQodHJ1ZSk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgU09BUEhlYWRlckJsb2NrIHNoYjMgPSBzaC5hZGRIZWFkZXJCbG9jayhoZWFkZXJfcm9sZU5vdFBsYXllZCwgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbUZhY3RvcnkuY3JlYXRlT01OYW1lc3BhY2UobmFtZXNwYWNlLCBoZWFkZXJfcm9sZU5vdFBsYXllZCkpOw0KLSAgICAgICAgICAgIHNoYjMuc2V0Um9sZShyb2xlTm90UGxheWVkKTsNCi0gICAgICAgICAgICBzaGIzLnNldE11c3RVbmRlcnN0YW5kKHRydWUpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIFNPQVBIZWFkZXJCbG9jayBzaGI0ID0gc2guYWRkSGVhZGVyQmxvY2soaGVhZGVyX2JpbmRpbmdBZGRlZCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9tRmFjdG9yeS5jcmVhdGVPTU5hbWVzcGFjZShuYW1lc3BhY2UsIGhlYWRlcl9iaW5kaW5nQWRkZWQpKTsNCi0gICAgICAgICAgICBzaGI0LnNldFJvbGUocm9sZUJpbmRpbmdBZGRlZCk7DQotICAgICAgICAgICAgc2hiNC5zZXRNdXN0VW5kZXJzdGFuZCh0cnVlKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBUaGlzIGhlYWRlciBpcyBkZXN0aW5lZCBmb3IgdGhlIHVsbWlhdGUgcmVjZWl2ZXIsIGJ1dCBpdCBpcyBhbHJlYWR5IHByb2Nlc3NlZA0KLSAgICAgICAgICAgIC8vIHNvIGl0IHNob3VsZG4ndCBjYXVzZSBtdXN0VW5kZXJzdGFuZCBmYXVsdA0KLSAgICAgICAgICAgIFNPQVBIZWFkZXJCbG9jayBzaGI1ID0gc2guYWRkSGVhZGVyQmxvY2soaGVhZGVyX3VsdGltYXRlUmVjZWl2ZXJfcHJvY2Vzc2VkLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb21GYWN0b3J5LmNyZWF0ZU9NTmFtZXNwYWNlKG5hbWVzcGFjZSwgaGVhZGVyX3VsdGltYXRlUmVjZWl2ZXJfcHJvY2Vzc2VkKSk7DQotICAgICAgICAgICAgLy8gU2luY2Ugbm8gcm9sZSB3YXMgc2V0IG9uIHRoZSBzaGIxLCBkZWZhdWx0IGlzIHVsdGltYXRlIHJlY2VpdmVyDQotICAgICAgICAgICAgc2hiNS5zZXRNdXN0VW5kZXJzdGFuZCh0cnVlKTsNCi0gICAgICAgICAgICBzaGI1LnNldFByb2Nlc3NlZCgpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIEhlYWRlciB0YXJnZXRlZCBmb3IgU09BUDExIHJvbGUgb2YgTmV4dCwgbm90IHNldCB0byBNdXN0VW5kZXJzdGFuZA0KLSAgICAgICAgICAgIFNPQVBIZWFkZXJCbG9jayBzaGI2ID0gc2guYWRkSGVhZGVyQmxvY2soaGVhZGVyX1NvYXBOZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb21GYWN0b3J5LmNyZWF0ZU9NTmFtZXNwYWNlKHNvYXAxMU5hbWVzcGFjZSwgaGVhZGVyX1NvYXBOZXh0KSk7DQotICAgICAgICAgICAgc2hiNi5zZXRSb2xlKHJvbGVTb2FwMTFOZXh0KTsNCi0NCi0gICAgICAgICAgICBtZXNzYWdlQ29udGV4dC5zZXRFbnZlbG9wZShzZSk7DQotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgZSkgew0KLSAgICAgICAgICAgIGZhaWwoIkNhdWdodCB1bmV4cGVjdGVkIGV4Y2VwdGlvbiBjcmVhdGluZyBtZXNzYWdlIGNvbnRleHQiICsgZSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbWVzc2FnZUNvbnRleHQ7DQotICAgIH0NCi0gICAgDQotICAgIHByaXZhdGUgdm9pZCBzZXRVbnByb2Nlc3NlZEhlYWRlcnMoTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQsIFJvbGVQbGF5ZXIgcm9sZVBsYXllcikgew0KLSAgICAgICAgU09BUEVudmVsb3BlIGVudmVsb3BlID0gbWVzc2FnZUNvbnRleHQuZ2V0RW52ZWxvcGUoKTsNCi0gICAgICAgIEl0ZXJhdG9yIGhlYWRlckJsb2NrcyA9IGVudmVsb3BlLmdldEhlYWRlcigpLmdldEhlYWRlcnNUb1Byb2Nlc3Mocm9sZVBsYXllcik7DQotICAgICAgICBMaXN0PFFOYW1lPiB1bnByb2Nlc3NlZEhlYWRlcnMgPSBuZXcgQXJyYXlMaXN0PFFOYW1lPigpOw0KLSAgICAgICAgd2hpbGUgKGhlYWRlckJsb2Nrcy5oYXNOZXh0KCkpIHsNCi0gICAgICAgICAgICBTT0FQSGVhZGVyQmxvY2sgaGVhZGVyQmxvY2sgPSAoU09BUEhlYWRlckJsb2NrKSBoZWFkZXJCbG9ja3MubmV4dCgpOw0KLSAgICAgICAgICAgIFFOYW1lIGhlYWRlck5hbWUgPSBoZWFkZXJCbG9jay5nZXRRTmFtZSgpOw0KLSAgICAgICAgICAgIC8vIGlmIHRoaXMgaGVhZGVyIGJsb2NrIGhhcyBiZWVuIHByb2Nlc3NlZCBvciBtdXN0VW5kZXJzdGFuZCBpc24ndA0KLSAgICAgICAgICAgIC8vIHR1cm5lZCBvbiB0aGVuIGl0cyBjb29sDQotICAgICAgICAgICAgaWYgKGhlYWRlckJsb2NrLmlzUHJvY2Vzc2VkKCkgfHwgIWhlYWRlckJsb2NrLmdldE11c3RVbmRlcnN0YW5kKCkpIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgdW5wcm9jZXNzZWRIZWFkZXJzLmFkZChoZWFkZXJOYW1lKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBpZih1bnByb2Nlc3NlZEhlYWRlcnMgIT1udWxsICYmIHVucHJvY2Vzc2VkSGVhZGVycy5zaXplKCk+MCl7DQotICAgICAgICAgICAgbWVzc2FnZUNvbnRleHQuc2V0UHJvcGVydHkoQ29uc3RhbnRzLlVOUFJPQ0VTU0VEX0hFQURFUl9RTkFNRVMsIHVucHJvY2Vzc2VkSGVhZGVycyk7ICAgICAgICAgICANCi0gICAgICAgIH0gICAgICAgDQotICAgIH0NCi0gICAgDQotICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IGJpbmRpbmdBZGRlZFJvbGUoKSB7DQotICAgICAgICBMaXN0PFN0cmluZz4gcm9sZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0gICAgICAgIHJvbGVzLmFkZChyb2xlQmluZGluZ0FkZGVkKTsNCi0gICAgICAgIHJldHVybiByb2xlczsNCi0gICAgfQ0KLSAgICANCi0gICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gbm9IZWFkZXJzUm9sZSgpIHsNCi0gICAgICAgIExpc3Q8U3RyaW5nPiByb2xlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLSAgICAgICAgcm9sZXMuYWRkKHJvbGVOb0hlYWRlcnMpOw0KLSAgICAgICAgcmV0dXJuIHJvbGVzOw0KLSAgICB9DQotICAgIA0KLSAgICANCi0gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotICAgIC8vIElubmVyIFRlc3QgQ2xhc3Nlcw0KLSAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0gICAgDQotICAgIGNsYXNzIFVsdGltYXRlRGVzdGluYXRpb25Ob1JvbGVzIGltcGxlbWVudHMgUm9sZVBsYXllciB7DQotICAgICAgICBwdWJsaWMgTGlzdCBnZXRSb2xlcygpIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzVWx0aW1hdGVEZXN0aW5hdGlvbigpIHsNCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBjbGFzcyBOb3RVbHRpbWF0ZURlc3RpbmF0aW9uTm9Sb2xlcyBpbXBsZW1lbnRzIFJvbGVQbGF5ZXIgew0KLSAgICAgICAgcHVibGljIExpc3QgZ2V0Um9sZXMoKSB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1VsdGltYXRlRGVzdGluYXRpb24oKSB7DQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICBjbGFzcyBVbHRpbWF0ZURlc3RpbmF0aW9uUm9sZXMgaW1wbGVtZW50cyBSb2xlUGxheWVyIHsNCi0gICAgICAgIExpc3Q8U3RyaW5nPiByb2xlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLSAgICAgICAgcHVibGljIFVsdGltYXRlRGVzdGluYXRpb25Sb2xlcygpIHsNCi0gICAgICAgICAgICByb2xlcy5hZGQocm9sZVBsYXllZDEpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcHVibGljIExpc3QgZ2V0Um9sZXMoKSB7DQotICAgICAgICAgICAgcmV0dXJuIHJvbGVzOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNVbHRpbWF0ZURlc3RpbmF0aW9uKCkgew0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICBAV2ViU2VydmljZQ0KLSAgICBASGFuZGxlckNoYWluKGZpbGU9IlJvbGVCYXNlZE11c3RVbmRlcnN0YW5kVGVzdHMueG1sIikNCi0gICAgY2xhc3MgUm9sZUJhc2VkTVVTZXJ2aWNlSW1wbCB7DQotICAgICAgICANCi0gICAgfQ0KLQ0KLSAgICBAV2ViU2VydmljZQ0KLSAgICBASGFuZGxlckNoYWluKGZpbGU9IlJvbGVCYXNlZE11c3RVbmRlcnN0YW5kVGVzdHMyLnhtbCIpDQotICAgIGNsYXNzIFJvbGVCYXNlZE1VU2VydmljZUltcGwyIHsNCi0gICAgICAgIA0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9oYW5kbGVyL2NvbnRleHQvQ29tcG9zaXRlTWVzc2FnZUNvbnRleHRUZXN0cy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2hhbmRsZXIvY29udGV4dC9Db21wb3NpdGVNZXNzYWdlQ29udGV4dFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxOTliZDguLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2hhbmRsZXIvY29udGV4dC9Db21wb3NpdGVNZXNzYWdlQ29udGV4dFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmhhbmRsZXIuY29udGV4dDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvbnRleHQuZmFjdG9yeS5NZXNzYWdlQ29udGV4dEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaGFuZGxlci5NRVBDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaGFuZGxlci5Tb2FwTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLlByb3RvY29sOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5YTUxGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuWE1MRmF1bHRDb2RlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5YTUxGYXVsdFJlYXNvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZmFjdG9yeS5NZXNzYWdlRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnJlZ2lzdHJ5LkZhY3RvcnlSZWdpc3RyeTsKLQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBNZXNzYWdlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXI7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0OwotaW1wb3J0IGphdmF4LnhtbC53cy5Mb2dpY2FsTWVzc2FnZTsKLWltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5Mb2dpY2FsTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci0KLS8qKgotICogQSB0ZXN0IHN1aXRlIGZvciBzY2VuYXJpb3Mgd2hlcmUgdGhlIGludGVybmFsIE1lc3NhZ2VDb250ZXh0IGlzIGNvbnZlcnRlZAotICogYmV0d2VlbiBoYW5kbGVyIGNvbnRleHQgZm9ybWF0cyAoU09BUE1lc3NhZ2VDb250ZXh0IGFuZCBMb2dpY2FsTWVzc2FnZUNvbnRleHQpLgotICogCi0gKiBUaGUgZmxvd3MgdGhhdCBuZWVkIHRvIGJlIHRlc3RlZCBoZXJlIGFyZToKLSAqIAotICogMSkgSU5CT1VORDogVGhlIE1lc3NhZ2VDb250ZXh0IHdpbGwgYmUgY29udmVydGVkIGZyb20gYSBMb2dpY2FsTWVzc2FnZUNvbnRleHQKLSAqICAgICAgICAgICAgIHRvIGEgU09BUE1lc3NhZ2VDb250ZXh0LiAgVGhpcyBkcml2ZXMgY29udmVydGluZyB0aGUgT00gbWVzc2FnZSAKLSAqICAgICAgICAgICAgIHRvIGFuIFNBQUogU09BUE1lc3NhZ2UgYW1vbmcgb3RoZXIgdGhpbmdzLgotICogICAgCi0gKiAgICBzcGVjaWZpYyB0ZXN0czogICAgICAgICAKLSAqICAgIC0gTm9ybWFsIG1lc3NhZ2UKLSAqICAgIC0gRmF1bHQgbWVzc2FnZQotICogICAgCi0gKiAyKSBPVVRCT1VORDogVGhlIE1lc3NhZ2VDb250ZXh0IHdpbGwgYmUgY29udmVydGVkIGZyb20gYSBTT0FQTWVzc2FnZUNvbnRleHQgCi0gKiAgICAgICAgICAgICAgdG8gYSBMb2dpY2FsTWVzc2FnZUNvbnRleHQuICBUaGlzIHdpbGwgZHJpdmUgY29udmVyc2lvbiBmcm9tIAotICogICAgICAgICAgICAgIGFuIFNBQUogU09BUE1lc3NhZ2UgYmFjayB0byBhbiBPTSAodGhlcmUgYXJlIHNvbWUgdmVyeSB0cmlja3kgCi0gKiAgICAgICAgICAgICAgcGllY2VzIG9mIGNvZGUgY29udGFpbmVkIHdpdGhpbiB0aGF0IHNjZW5hcmlvKS4gCi0gKiAgICAgICAgICAgICAgCi0gKiAgICBzcGVjaWZpYyB0ZXN0OgotICogICAgLSBOb3JtYWwgbWVzc2FnZQotICogICAgLSBGYXVsdCBtZXNzYWdlCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21wb3NpdGVNZXNzYWdlQ29udGV4dFRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgRkFVTFRfSU5QVVQgPSAic2FtcGxlIGZhdWx0IGlucHV0IjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBBIHRlc3QgdGhhdCBtaW1pY3MgdGhlIGluYm91bmQgZmxvdyB0aHJvdWdoIGEgaGFuZGxlciBjaGFpbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW5ib3VuZEZhdWx0RmxvdygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBNZXNzYWdlQ29udGV4dCBtYyA9IGNyZWF0ZVNhbXBsZUZhdWx0TWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgCi0gICAgICAgIExvZ2ljYWxNZXNzYWdlQ29udGV4dCBsbWMgPSBNZXNzYWdlQ29udGV4dEZhY3RvcnkuY3JlYXRlTG9naWNhbE1lc3NhZ2VDb250ZXh0KG1jKTsKLSAgICAgICAgTG9naWNhbE1lc3NhZ2UgbG0gPSBsbWMuZ2V0TWVzc2FnZSgpOwotICAgICAgICBTb3VyY2UgcGF5bG9hZCA9IGxtLmdldFBheWxvYWQoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIHJldHVybmVkIHBheWxvYWQgKFNvdXJjZSkgd2FzIG51bGwiLCBwYXlsb2FkICE9IG51bGwpOwotICAgICAgICAKLSAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgIFN0cmVhbVJlc3VsdCByZXN1bHQgPSBuZXcgU3RyZWFtUmVzdWx0KGJhb3MpOwotICAgICAgICBUcmFuc2Zvcm1lciB0ID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3VHJhbnNmb3JtZXIoKTsKLSAgICAgICAgdC50cmFuc2Zvcm0ocGF5bG9hZCwgcmVzdWx0KTsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBjb250ZW50ID0gbmV3IFN0cmluZyhiYW9zLnRvQnl0ZUFycmF5KCkpOwotICAgICAgICBhc3NlcnRUcnVlKCJUaGUgcmV0dXJuZWQgY29udGVudCAoU3RyaW5nKSBmcm9tIHRoZSBwYXlsb2FkIHdhcyBudWxsIiwgY29udGVudCAhPSBudWxsKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIDxmYXVsdGNvZGU+IGVsZW1lbnQgd2FzIG5vdCBmb3VuZCIsIGNvbnRlbnQuaW5kZXhPZigiZmF1bHRjb2RlIikgPiAtMSk7Ci0gICAgICAgIGFzc2VydFRydWUoIlRoZSA8ZmF1bHRzdHJpbmc+IGVsZW1lbnQgd2FzIG5vdCBmb3VuZCIsIGNvbnRlbnQuaW5kZXhPZigiZmF1bHRzdHJpbmciKSA+IC0xKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIGZhdWx0IGRpZCBub3QgY29udGFpbiB0aGUgZXhwZWN0ZWQgZmF1bHQgc3RyaW5nIiwgY29udGVudC5pbmRleE9mKEZBVUxUX0lOUFVUKSA+IC0xKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgU29hcE1lc3NhZ2VDb250ZXh0IHNtYyA9IE1lc3NhZ2VDb250ZXh0RmFjdG9yeS5jcmVhdGVTb2FwTWVzc2FnZUNvbnRleHQobWMpOwotICAgICAgICBTT0FQTWVzc2FnZSBzbSA9IHNtYy5nZXRNZXNzYWdlKCk7Ci0gICAgICAgIGFzc2VydFRydWUoIlRoZSByZXR1cm5lZCBTT0FQTWVzc2FnZSB3YXMgbnVsbCIsIHNtICE9IG51bGwpOwotICAgICAgICBhc3NlcnRUcnVlKCJUaGUgU09BUE1lc3NhZ2UgZGlkIG5vdCBjb250YWluIGEgU09BUEJvZHkiLCBzbS5nZXRTT0FQQm9keSgpICE9IG51bGwpOwotICAgICAgICBhc3NlcnRUcnVlKCJUaGUgU09BUEJvZHkgZGlkIG5vdCBjb250YWluIGEgU09BUEZhdWx0Iiwgc20uZ2V0U09BUEJvZHkoKS5nZXRGYXVsdCgpICE9IG51bGwpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBBIHRlc3QgdGhhdCBtaW1pY3MgdGhlIG91dGJvdW5kIGZsb3cgdGhyb3VnaCBhIGhhbmRsZXIgY2hhaW4uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdE91dGJvdW5kRmF1bHRGbG93KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1jID0gY3JlYXRlU2FtcGxlRmF1bHRNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICAKLSAgICAgICAgU29hcE1lc3NhZ2VDb250ZXh0IHNtYyA9IE1lc3NhZ2VDb250ZXh0RmFjdG9yeS5jcmVhdGVTb2FwTWVzc2FnZUNvbnRleHQobWMpOwotICAgICAgICBTT0FQTWVzc2FnZSBzbSA9IHNtYy5nZXRNZXNzYWdlKCk7Ci0gICAgICAgIGFzc2VydFRydWUoIlRoZSByZXR1cm5lZCBTT0FQTWVzc2FnZSB3YXMgbnVsbCIsIHNtICE9IG51bGwpOwotICAgICAgICBhc3NlcnRUcnVlKCJUaGUgU09BUE1lc3NhZ2UgZGlkIG5vdCBjb250YWluIGEgU09BUEJvZHkiLCBzbS5nZXRTT0FQQm9keSgpICE9IG51bGwpOwotICAgICAgICBhc3NlcnRUcnVlKCJUaGUgU09BUEJvZHkgZGlkIG5vdCBjb250YWluIGEgU09BUEZhdWx0Iiwgc20uZ2V0U09BUEJvZHkoKS5nZXRGYXVsdCgpICE9IG51bGwpOwotICAgICAgICAKLSAgICAgICAgTG9naWNhbE1lc3NhZ2VDb250ZXh0IGxtYyA9IE1lc3NhZ2VDb250ZXh0RmFjdG9yeS5jcmVhdGVMb2dpY2FsTWVzc2FnZUNvbnRleHQobWMpOwotICAgICAgICBMb2dpY2FsTWVzc2FnZSBsbSA9IGxtYy5nZXRNZXNzYWdlKCk7Ci0gICAgICAgIFNvdXJjZSBwYXlsb2FkID0gbG0uZ2V0UGF5bG9hZCgpOwotICAgICAgICBhc3NlcnRUcnVlKCJUaGUgcmV0dXJuZWQgcGF5bG9hZCAoU291cmNlKSB3YXMgbnVsbCIsIHBheWxvYWQgIT0gbnVsbCk7Ci0gICAgICAgIAotICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgU3RyZWFtUmVzdWx0IHJlc3VsdCA9IG5ldyBTdHJlYW1SZXN1bHQoYmFvcyk7Ci0gICAgICAgIFRyYW5zZm9ybWVyIHQgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdUcmFuc2Zvcm1lcigpOwotICAgICAgICB0LnRyYW5zZm9ybShwYXlsb2FkLCByZXN1bHQpOwotICAgICAgICAKLSAgICAgICAgU3RyaW5nIGNvbnRlbnQgPSBuZXcgU3RyaW5nKGJhb3MudG9CeXRlQXJyYXkoKSk7Ci0gICAgICAgIGFzc2VydFRydWUoIlRoZSByZXR1cm5lZCBjb250ZW50IChTdHJpbmcpIGZyb20gdGhlIHBheWxvYWQgd2FzIG51bGwiLCBjb250ZW50ICE9IG51bGwpOwotICAgICAgICBhc3NlcnRUcnVlKCJUaGUgPGZhdWx0Y29kZT4gZWxlbWVudCB3YXMgbm90IGZvdW5kIiwgY29udGVudC5pbmRleE9mKCJmYXVsdGNvZGUiKSA+IC0xKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIDxmYXVsdHN0cmluZz4gZWxlbWVudCB3YXMgbm90IGZvdW5kIiwgY29udGVudC5pbmRleE9mKCJmYXVsdHN0cmluZyIpID4gLTEpOwotICAgICAgICBhc3NlcnRUcnVlKCJUaGUgZmF1bHQgZGlkIG5vdCBjb250YWluIHRoZSBleHBlY3RlZCBmYXVsdCBzdHJpbmciLCBjb250ZW50LmluZGV4T2YoRkFVTFRfSU5QVVQpID4gLTEpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIE1lc3NhZ2VDb250ZXh0IGNyZWF0ZVNhbXBsZUZhdWx0TWVzc2FnZUNvbnRleHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgTWVzc2FnZUZhY3RvcnkgZmFjdG9yeSA9IChNZXNzYWdlRmFjdG9yeSkgRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoTWVzc2FnZUZhY3RvcnkuY2xhc3MpOwotICAgICAgICBNZXNzYWdlIG1zZyA9IGZhY3RvcnkuY3JlYXRlKFByb3RvY29sLnNvYXAxMSk7Ci0KLSAgICAgICAgWE1MRmF1bHRSZWFzb24gcmVhc29uID0gbmV3IFhNTEZhdWx0UmVhc29uKEZBVUxUX0lOUFVUKTsKLSAgICAgICAgWE1MRmF1bHQgZmF1bHQgPSBuZXcgWE1MRmF1bHQoWE1MRmF1bHRDb2RlLlNFTkRFUiwgcmVhc29uKTsKLSAgICAgICAgbXNnLnNldFhNTEZhdWx0KGZhdWx0KTsKLQotICAgICAgICBNZXNzYWdlQ29udGV4dCBtYyA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBtYy5zZXRNRVBDb250ZXh0KG5ldyBNRVBDb250ZXh0KG1jKSk7Ci0gICAgICAgIG1jLnNldE1lc3NhZ2UobXNnKTsKLQotICAgICAgICByZXR1cm4gbWM7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9oYW5kbGVyL2NvbnRleHQvTG9naWNhbE1lc3NhZ2VDb250ZXh0VGVzdHMuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9oYW5kbGVyL2NvbnRleHQvTG9naWNhbE1lc3NhZ2VDb250ZXh0VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTBiN2M5YS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvaGFuZGxlci9jb250ZXh0L0xvZ2ljYWxNZXNzYWdlQ29udGV4dFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmhhbmRsZXIuY29udGV4dDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvbnRleHQuZmFjdG9yeS5NZXNzYWdlQ29udGV4dEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaGFuZGxlci5NRVBDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5CbG9jazsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuTWVzc2FnZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuUHJvdG9jb2w7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLlhNTEZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5YTUxGYXVsdENvZGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLlhNTEZhdWx0UmVhc29uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5kYXRhYmluZGluZy5KQVhCQmxvY2tDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5mYWN0b3J5LkpBWEJCbG9ja0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmZhY3RvcnkuTWVzc2FnZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5yZWdpc3RyeS5GYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgdGVzdC5FY2hvU3RyaW5nOwotaW1wb3J0IHRlc3QuT2JqZWN0RmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJDb250ZXh0OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uT3V0cHV0S2V5czsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdDsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLndzLkxvZ2ljYWxNZXNzYWdlOwotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLkxvZ2ljYWxNZXNzYWdlQ29udGV4dDsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotCi0vKioKLSAqIFVuaXQgdGVzdHMgZm9yIHRoZSBjcmVhdGlvbiBhbmQgdXNhZ2Ugb2YgdGhlIExvZ2ljYWxNZXNzYWdlQ29udGV4dCB0aGF0IGlzCi0gKiB1c2VkIGZvciBoYW5kbGVyIHByb2Nlc3NpbmcuCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2dpY2FsTWVzc2FnZUNvbnRleHRUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICAKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBJTlBVVCA9ICJzYW1wbGUgaW5wdXQiOwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIEZBVUxUX0lOUFVUID0gInNhbXBsZSBmYXVsdCBpbnB1dCI7Ci0gICAgCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgc2FtcGxlU09BUDExRmF1bHRQYXlsb2FkID0KLSAgICAgICAgIjxzb2FwZW52OkZhdWx0IHhtbG5zOnNvYXBlbnY9XCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlL1wiPiIKLSAgICAgICAgKyAiPGZhdWx0Y29kZT5zb2FwZW52OlNlcnZlcjwvZmF1bHRjb2RlPiIgKyAiPGZhdWx0c3RyaW5nPiIgKyBGQVVMVF9JTlBVVAotICAgICAgICArICI8L2ZhdWx0c3RyaW5nPiIgKyAiPC9zb2FwZW52OkZhdWx0PiI7Ci0gICAKLSAgICBwdWJsaWMgTG9naWNhbE1lc3NhZ2VDb250ZXh0VGVzdHMoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFRlc3QgdGhlIGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlIGJhc2VkIEFQSXMgb24gdGhlIExvZ2ljYWxNZXNzYWdlIGludGVyZmFjZS4KLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRQYXlsb2FkQXNTb3VyY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgTG9naWNhbE1lc3NhZ2VDb250ZXh0IGxtYyA9IGNyZWF0ZVNhbXBsZUNvbnRleHQoKTsKLSAgICAgICAgCi0gICAgICAgIExvZ2ljYWxNZXNzYWdlIG1zZyA9IGxtYy5nZXRNZXNzYWdlKCk7Ci0gICAgICAgIGFzc2VydFRydWUoIlRoZSByZXR1cm5lZCBMb2dpY2FsTWVzc2FnZSB3YXMgbnVsbCIsIG1zZyAhPSBudWxsKTsKLSAgICAgICAgCi0gICAgICAgIFNvdXJjZSBwYXlsb2FkID0gbXNnLmdldFBheWxvYWQoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIHJldHVybmVkIHBheWxvYWQgKFNvdXJjZSkgd2FzIG51bGwiLCBwYXlsb2FkICE9IG51bGwpOwotICAgICAgICAKLSAgICAgICAgU3RyaW5nIHJlc3VsdENvbnRlbnQgPSBfZ2V0U3RyaW5nRnJvbVNvdXJjZShwYXlsb2FkKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIGNvbnRlbnQgcmV0dXJuZWQgd2FzIG51bGwiLCByZXN1bHRDb250ZW50ICE9IG51bGwpOwotICAgICAgICBhc3NlcnRUcnVlKCJUaGUgY29udGVudCByZXR1cm5lZCB3YXMgaW5jb21wbGV0ZSwgdW5leHBlY3RlZCBlbGVtZW50IiwgcmVzdWx0Q29udGVudC5pbmRleE9mKCJlY2hvU3RyaW5nIikgPiAtMSk7Ci0gICAgICAgIGFzc2VydFRydWUoIlRoZSBjb250ZW50IHJldHVybmVkIHdhcyBpbmNvbXBsZXRlLCB1bmV4cGVjdGVkIGNvbnRlbnQiLCByZXN1bHRDb250ZW50LmluZGV4T2YoSU5QVVQpID4gLTEpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUZXN0cyB0aGUgc2V0dGluZyBvZiB0aGUgcGF5bG9hZCBhbmQgbWFrZSBzdXJlIHdlIGRvbid0IGNhY2hlIGltcHJvcGVybHkuCi0gICAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QW5kU2V0UGF5bG9hZEFzU291cmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIExvZ2ljYWxNZXNzYWdlQ29udGV4dCBsbWMgPSBjcmVhdGVTYW1wbGVDb250ZXh0KCk7Ci0gICAgICAgIAotICAgICAgICBMb2dpY2FsTWVzc2FnZSBtc2cgPSBsbWMuZ2V0TWVzc2FnZSgpOwotICAgICAgICBhc3NlcnRUcnVlKCJUaGUgcmV0dXJuZWQgTG9naWNhbE1lc3NhZ2Ugd2FzIG51bGwiLCBtc2cgIT0gbnVsbCk7Ci0gICAgICAgIAotICAgICAgICBTb3VyY2UgcGF5bG9hZCA9IG1zZy5nZXRQYXlsb2FkKCk7Ci0gICAgICAgIGFzc2VydFRydWUoIlRoZSByZXR1cm5lZCBwYXlsb2FkIChTb3VyY2UpIHdhcyBudWxsIiwgcGF5bG9hZCAhPSBudWxsKTsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyByZXN1bHRDb250ZW50ID0gX2dldFN0cmluZ0Zyb21Tb3VyY2UocGF5bG9hZCk7Ci0gICAgICAgIGFzc2VydFRydWUoIlRoZSBjb250ZW50IHJldHVybmVkIHdhcyBudWxsIiwgcmVzdWx0Q29udGVudCAhPSBudWxsKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIGNvbnRlbnQgcmV0dXJuZWQgd2FzIGluY29ycmVjdCIsIHJlc3VsdENvbnRlbnQuaW5kZXhPZihJTlBVVCkgPiAwKTsKLQotICAgICAgICAvLyBOb3cgbWFuaXBsdWF0ZSB0aGUgY29udGVudCBhbmQgc2V0IGl0IGJhY2sgb24gdGhlIG1lc3NhZ2UuCi0gICAgICAgIGludCBzdGFydCA9IHJlc3VsdENvbnRlbnQuaW5kZXhPZihJTlBVVCk7Ci0gICAgICAgIGludCBlbmQgPSBzdGFydCArIElOUFVULmxlbmd0aCgpOwotICAgICAgICAKLSAgICAgICAgU3RyaW5nIG5ld0lucHV0ID0gIm5ldyBjb250ZW50IGdvZXMgaGVyZSI7Ci0gICAgICAgIFN0cmluZyBuZXdDb250ZW50ID0gcmVzdWx0Q29udGVudC5zdWJzdHJpbmcoMCwgc3RhcnQpICsgbmV3SW5wdXQgKyByZXN1bHRDb250ZW50LnN1YnN0cmluZyhlbmQpOwotICAgICAgICAKLSAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmFpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShuZXdDb250ZW50LmdldEJ5dGVzKCkpOwotICAgICAgICBTdHJlYW1Tb3VyY2UgbmV3UGF5bG9hZCA9IG5ldyBTdHJlYW1Tb3VyY2UoYmFpcyk7IAotICAgICAgICAKLSAgICAgICAgbXNnLnNldFBheWxvYWQobmV3UGF5bG9hZCk7Ci0gICAgICAgIAotICAgICAgICAvLyBDaGVjayB0aGUgcGF5bG9hZCB0byBtYWtlIHN1cmUgdGhlIG5ldyBjb250ZW50IHRoYXQgd2UgYWRkZWQgCi0gICAgICAgIC8vIHdhcyBpbnN0ZXJ0ZWQgY29ycmVjdGx5LgotICAgICAgICBTb3VyY2UgcGF5bG9hZDIgPSBtc2cuZ2V0UGF5bG9hZCgpOwotICAgICAgICBhc3NlcnRUcnVlKCJUaGUgcmV0dXJuZWQgcGF5bG9hZCAoU291cmNlKSB3YXMgbnVsbCIsIHBheWxvYWQyICE9IG51bGwpOwotICAgICAgICAKLSAgICAgICAgU3RyaW5nIHJlc3VsdENvbnRlbnQyID0gX2dldFN0cmluZ0Zyb21Tb3VyY2UocGF5bG9hZDIpOwotICAgICAgICBhc3NlcnRUcnVlKCJUaGUgdXBkYXRlZCBjb250ZW50IHJldHVybmVkIHdhcyBudWxsIiwgcmVzdWx0Q29udGVudDIgIT0gbnVsbCk7Ci0gICAgICAgIGFzc2VydFRydWUoIlRoZSB1cGRhdGVkIGNvbnRlbnQgcmV0dXJuZWQgd2FzIGluY29ycmVjdCwgb2xkIGNvbnRlbnQgZm91bmQiLCByZXN1bHRDb250ZW50Mi5pbmRleE9mKElOUFVUKSA8IDApOwotICAgICAgICBhc3NlcnRUcnVlKCJUaGUgdXBkYXRlZCBjb250ZW50IHJldHVybmVkIHdhcyBpbmNvcnJlY3QsIG5ldyBjb250ZW50IG5vdCBmb3VuZCIsIHJlc3VsdENvbnRlbnQyLmluZGV4T2YobmV3SW5wdXQpID4gLTEpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUZXN0IHRvIG1ha2Ugc3VyZSB3ZSBjYW4gZ2V0IHRoZSBwYXlsb2FkIG11bHRpcGxlIHRpbWVzIGZyb20gdGhlIHNhbWUgTG9naWNhbE1lc3NhZ2UuCi0gICAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TXVsdGlwbGVQYXlsb2Fkc0FzU291cmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIExvZ2ljYWxNZXNzYWdlQ29udGV4dCBsbWMgPSBjcmVhdGVTYW1wbGVDb250ZXh0KCk7Ci0KLSAgICAgICAgTG9naWNhbE1lc3NhZ2UgbXNnID0gbG1jLmdldE1lc3NhZ2UoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIHJldHVybmVkIExvZ2ljYWxNZXNzYWdlIHdhcyBudWxsIiwgbXNnICE9IG51bGwpOwotCi0gICAgICAgIGludCBsb29wQ291bnQgPSAzOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxvb3BDb3VudDsgKytpKSB7Ci0gICAgICAgICAgICBTb3VyY2UgcGF5bG9hZCA9IG1zZy5nZXRQYXlsb2FkKCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKCJBdHRlbXB0IG51bWJlciAiICArIGkgKyAiIHRvIGdldCB0aGUgcGF5bG9hZCAoU291cmNlKSB3YXMgbnVsbCIsIHBheWxvYWQgIT0gbnVsbCk7Ci0KLQotICAgICAgICAgICAgU3RyaW5nIHJlc3VsdENvbnRlbnQgPSBfZ2V0U3RyaW5nRnJvbVNvdXJjZShwYXlsb2FkKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoIlRoZSBjb250ZW50IHJldHVybmVkIGluIGxvb3AgIiArIGkgKyAiIHdhcyBudWxsIiwgcmVzdWx0Q29udGVudCAhPSBudWxsKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoIlRoZSBjb250ZW50IHJldHVybmVkIGluIGxvb3AgIiArIGkgKyAiIHdhcyBpbmNvbXBsZXRlLCB1bmV4cGVjdGVkIGVsZW1lbnQiLCByZXN1bHRDb250ZW50LmluZGV4T2YoImVjaG9TdHJpbmciKSA+IC0xKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoIlRoZSBjb250ZW50IHJldHVybmVkIGluIGxvb3AgIiArIGkgKyAiIHdhcyBpbmNvbXBsZXRlLCB1bmV4cGVjdGVkIGNvbnRlbnQiLCByZXN1bHRDb250ZW50LmluZGV4T2YoSU5QVVQpID4gLTEpOyAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFRlc3RzIHRoZSBzZXR0aW5nIG9mIHRoZSBwYXlsb2FkIHdoZW4gdGhlIG9yaWdpbmFsIGNvbnRlbnQgaXMgYSBmYXVsdC4KLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRBbmRTZXRGYXVsdFBheWxvYWRBc1NvdXJjZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBMb2dpY2FsTWVzc2FnZUNvbnRleHQgbG1jID0gY3JlYXRlU2FtcGxlRmF1bHRDb250ZXh0KCk7Ci0gICAgICAgIAotICAgICAgICBMb2dpY2FsTWVzc2FnZSBtc2cgPSBsbWMuZ2V0TWVzc2FnZSgpOwotICAgICAgICBhc3NlcnRUcnVlKCJUaGUgcmV0dXJuZWQgTG9naWNhbE1lc3NhZ2Ugd2FzIG51bGwiLCBtc2cgIT0gbnVsbCk7Ci0gICAgICAgIAotICAgICAgICBTb3VyY2UgcGF5bG9hZCA9IG1zZy5nZXRQYXlsb2FkKCk7Ci0gICAgICAgIGFzc2VydFRydWUoIlRoZSByZXR1cm5lZCBwYXlsb2FkIChTb3VyY2UpIHdhcyBudWxsIiwgcGF5bG9hZCAhPSBudWxsKTsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyByZXN1bHRDb250ZW50ID0gX2dldFN0cmluZ0Zyb21Tb3VyY2UocGF5bG9hZCk7Ci0gICAgICAgIGFzc2VydFRydWUoIlRoZSBjb250ZW50IHJldHVybmVkIHdhcyBudWxsIiwgcmVzdWx0Q29udGVudCAhPSBudWxsKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIGNvbnRlbnQgcmV0dXJuZWQgd2FzIGluY29ycmVjdCIsIHJlc3VsdENvbnRlbnQuaW5kZXhPZihGQVVMVF9JTlBVVCkgPiAwKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIGNvbnRlbnQgcmV0dXJuZWQgd2FzIGluY29ycmVjdCwgbm8gZmF1bHQgZm91bmQiLCByZXN1bHRDb250ZW50LmluZGV4T2YoIkZhdWx0IikgPiAwKTsKLSAgICAgICAgCi0gICAgICAgIC8vIE5vdyBtYW5pcGx1YXRlIHRoZSBjb250ZW50IGFuZCBzZXQgaXQgYmFjayBvbiB0aGUgbWVzc2FnZS4KLSAgICAgICAgaW50IHN0YXJ0ID0gcmVzdWx0Q29udGVudC5pbmRleE9mKEZBVUxUX0lOUFVUKTsKLSAgICAgICAgaW50IGVuZCA9IHN0YXJ0ICsgRkFVTFRfSU5QVVQubGVuZ3RoKCk7Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgbmV3RmF1bHRJbnB1dCA9ICJuZXcgZmF1bHQgY29udGVudCBnb2VzIGhlcmUiOwotICAgICAgICBTdHJpbmcgbmV3Q29udGVudCA9IHJlc3VsdENvbnRlbnQuc3Vic3RyaW5nKDAsIHN0YXJ0KSArIG5ld0ZhdWx0SW5wdXQgKyByZXN1bHRDb250ZW50LnN1YnN0cmluZyhlbmQpOwotICAgICAgICAKLSAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmFpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShuZXdDb250ZW50LmdldEJ5dGVzKCkpOwotICAgICAgICBTdHJlYW1Tb3VyY2UgbmV3UGF5bG9hZCA9IG5ldyBTdHJlYW1Tb3VyY2UoYmFpcyk7IAotICAgICAgICAKLSAgICAgICAgbXNnLnNldFBheWxvYWQobmV3UGF5bG9hZCk7Ci0gICAgICAgIAotICAgICAgICAvLyBDaGVjayB0aGUgcGF5bG9hZCB0byBtYWtlIHN1cmUgdGhlIG5ldyBjb250ZW50IHRoYXQgd2UgYWRkZWQgCi0gICAgICAgIC8vIHdhcyBpbnN0ZXJ0ZWQgY29ycmVjdGx5LgotICAgICAgICBTb3VyY2UgcGF5bG9hZDIgPSBtc2cuZ2V0UGF5bG9hZCgpOwotICAgICAgICBhc3NlcnRUcnVlKCJUaGUgcmV0dXJuZWQgcGF5bG9hZCAoU291cmNlKSB3YXMgbnVsbCIsIHBheWxvYWQyICE9IG51bGwpOwotICAgICAgICAKLSAgICAgICAgU3RyaW5nIHJlc3VsdENvbnRlbnQyID0gX2dldFN0cmluZ0Zyb21Tb3VyY2UocGF5bG9hZDIpOwotICAgICAgICBhc3NlcnRUcnVlKCJUaGUgdXBkYXRlZCBjb250ZW50IHJldHVybmVkIHdhcyBudWxsIiwgcmVzdWx0Q29udGVudDIgIT0gbnVsbCk7Ci0gICAgICAgIGFzc2VydFRydWUoIlRoZSB1cGRhdGVkIGNvbnRlbnQgcmV0dXJuZWQgd2FzIGluY29ycmVjdCwgb2xkIGNvbnRlbnQgZm91bmQiLCByZXN1bHRDb250ZW50Mi5pbmRleE9mKEZBVUxUX0lOUFVUKSA8IDApOwotICAgICAgICBhc3NlcnRUcnVlKCJUaGUgdXBkYXRlZCBjb250ZW50IHJldHVybmVkIHdhcyBpbmNvcnJlY3QsIG5vIGZhdWx0IGZvdW5kIiwgcmVzdWx0Q29udGVudC5pbmRleE9mKCJGYXVsdCIpID4gMCk7Ci0gICAgICAgIGFzc2VydFRydWUoIlRoZSB1cGRhdGVkIGNvbnRlbnQgcmV0dXJuZWQgd2FzIGluY29ycmVjdCwgbmV3IGNvbnRlbnQgbm90IGZvdW5kIiwgcmVzdWx0Q29udGVudDIuaW5kZXhPZihuZXdGYXVsdElucHV0KSA+IC0xKTsKLSAgICB9Ci0KLS8vIEZJWE1FOiBUZW1wb3JhcmlseSBjb21tZW50IG91dCB0ZXN0IGJlY2F1c2Ugb2YgYnVpbGQgYnJlYWsuICAgIAotLy8gICAgLyoqCi0vLyAgICAgKiBUZXN0IHRoZSBKQVhCIGJhc2VkIEFQSXMgb24gdGhlIExvZ2ljYWxNZXNzYWdlIGludGVyZmFjZS4KLS8vICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0vLyAgICAgKi8KLS8vICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRQYXlsb2FkQXNKQVhCKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vLyAgICAgICAgTG9naWNhbE1lc3NhZ2VDb250ZXh0IGxtYyA9IGNyZWF0ZVNhbXBsZUNvbnRleHQoKTsKLS8vICAgICAgICAgICAgICAgIAotLy8gICAgICAgIExvZ2ljYWxNZXNzYWdlIG1zZyA9IGxtYy5nZXRNZXNzYWdlKCk7Ci0vLyAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIHJldHVybmVkIExvZ2ljYWxNZXNzYWdlIHdhcyBudWxsIiwgbXNnICE9IG51bGwpOwotLy8gICAgICAgIAotLy8gICAgICAgIEpBWEJDb250ZXh0IGpiYyA9IEpBWEJDb250ZXh0Lm5ld0luc3RhbmNlKCJ0ZXN0Iik7Ci0vLyAgICAgICAgCi0vLyAgICAgICAgT2JqZWN0IG9iaiA9IG1zZy5nZXRQYXlsb2FkKGpiYyk7Ci0vLyAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIHJldHVybmVkIHBheWxvYWQgKE9iamVjdCkgd2FzIG51bGwiLCBvYmogIT0gbnVsbCk7Ci0vLyAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIHJldHVybmVkIHBheWxvYWQgKE9iamVjdCkgd2FzIG9mIHRoZSB3cm9uZyB0eXBlOiAiICsgb2JqLmdldENsYXNzKCkuZ2V0TmFtZSgpLCBvYmouZ2V0Q2xhc3MoKS5lcXVhbHMoRWNob1N0cmluZy5jbGFzcykpOwotLy8gICAgICAgIAotLy8gICAgICAgIEVjaG9TdHJpbmcgZWNobyA9IChFY2hvU3RyaW5nKSBvYmo7Ci0vLyAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIEVjaG9TdHJpbmcgb2JqZWN0IGhhZCBudWxsIGlucHV0IiwgZWNoby5nZXRJbnB1dCgpICE9IG51bGwpOwotLy8gICAgICAgIGFzc2VydFRydWUoIlRoZSBFY2hvU3RyaW5nIG9iamVjdCBoYWQgYmFkIGlucHV0OiAiICsgZWNoby5nZXRJbnB1dCgpLCBlY2hvLmdldElucHV0KCkuZXF1YWxzKElOUFVUKSk7Ci0vLyAgICB9Ci0gICAgCi0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdENvbnZlcnRNZXNzYWdlVG9GYXVsdCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBMb2dpY2FsTWVzc2FnZUNvbnRleHQgbG1jID0gY3JlYXRlU2FtcGxlQ29udGV4dCgpOwotIAotICAgICAgICBMb2dpY2FsTWVzc2FnZSBtc2cgPSBsbWMuZ2V0TWVzc2FnZSgpOwotICAgICAgICBhc3NlcnRUcnVlKCJUaGUgcmV0dXJuZWQgTG9naWNhbE1lc3NhZ2Ugd2FzIG51bGwiLCBtc2cgIT0gbnVsbCk7Ci0KLSAgICAgICAgU291cmNlIHBheWxvYWQgPSBtc2cuZ2V0UGF5bG9hZCgpOwotICAgICAgICBhc3NlcnRUcnVlKCJUaGUgcmV0dXJuZWQgcGF5bG9hZCAoU291cmNlKSB3YXMgbnVsbCIsIHBheWxvYWQgIT0gbnVsbCk7Ci0KLSAgICAgICAgU3RyaW5nIHJlc3VsdENvbnRlbnQgPSBfZ2V0U3RyaW5nRnJvbVNvdXJjZShwYXlsb2FkKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIGNvbnRlbnQgcmV0dXJuZWQgd2FzIG51bGwiLCByZXN1bHRDb250ZW50ICE9IG51bGwpOwotICAgICAgICAKLSAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmFpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShzYW1wbGVTT0FQMTFGYXVsdFBheWxvYWQuZ2V0Qnl0ZXMoKSk7Ci0gICAgICAgIFN0cmVhbVNvdXJjZSBmYXVsdFNvdXJjZSA9IG5ldyBTdHJlYW1Tb3VyY2UoYmFpcyk7Ci0gICAgICAgIAotICAgICAgICBtc2cuc2V0UGF5bG9hZChmYXVsdFNvdXJjZSk7Ci0gICAgICAgIAotICAgICAgICBTb3VyY2UgbmV3RmF1bHRTb3VyY2UgPSBtc2cuZ2V0UGF5bG9hZCgpOwotICAgICAgICBhc3NlcnRUcnVlKCJUaGUgbmV3IGZhdWx0IGNvbnRlbnQgcmV0dXJuZWQgd2FzIG51bGwiLCBmYXVsdFNvdXJjZSAhPSBudWxsKTsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBuZXdGYXVsdENvbnRlbnQgPSBfZ2V0U3RyaW5nRnJvbVNvdXJjZShuZXdGYXVsdFNvdXJjZSk7Ci0gICAgICAgIGFzc2VydFRydWUoIlRoZSBuZXcgZmF1bHQgY29udGVudCByZXR1cm5lZCB3YXMgaW52YWxpZCIsIG5ld0ZhdWx0Q29udGVudC5lcXVhbHMoc2FtcGxlU09BUDExRmF1bHRQYXlsb2FkKSk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgTG9naWNhbE1lc3NhZ2VDb250ZXh0IGNyZWF0ZVNhbXBsZUNvbnRleHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgTWVzc2FnZUZhY3RvcnkgZmFjdG9yeSA9IChNZXNzYWdlRmFjdG9yeSkgRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoTWVzc2FnZUZhY3RvcnkuY2xhc3MpOwotICAgICAgICBNZXNzYWdlIG1zZyA9IGZhY3RvcnkuY3JlYXRlKFByb3RvY29sLnNvYXAxMSk7Ci0gICAgICAgIAotICAgICAgICAvLyBDcmVhdGUgYSBqYXhiIG9iamVjdAotICAgICAgICBPYmplY3RGYWN0b3J5IG9iakZhY3RvcnkgPSBuZXcgT2JqZWN0RmFjdG9yeSgpOwotICAgICAgICBFY2hvU3RyaW5nIGVjaG8gPSBvYmpGYWN0b3J5LmNyZWF0ZUVjaG9TdHJpbmcoKTsKLSAgICAgICAgZWNoby5zZXRJbnB1dChJTlBVVCk7Ci0gICAgICAgIAotICAgICAgICAvLyBDcmVhdGUgdGhlIG5lY2Vzc2FyeSBKQVhCQ29udGV4dAotICAgICAgICBKQVhCQ29udGV4dCBqYmMgPSBKQVhCQ29udGV4dC5uZXdJbnN0YW5jZSgidGVzdCIpOwotICAgICAgICBKQVhCQmxvY2tDb250ZXh0IGJsb2NrQ3R4ID0gbmV3IEpBWEJCbG9ja0NvbnRleHQoamJjKTsKLSAgICAgICAgCi0gICAgICAgIC8vIENyZWF0ZSB0aGUgQmxvY2sgCi0gICAgICAgIEpBWEJCbG9ja0ZhY3RvcnkgYmxvY2tGYWN0b3J5ID0gKEpBWEJCbG9ja0ZhY3RvcnkpIEZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KEpBWEJCbG9ja0ZhY3RvcnkuY2xhc3MpOwotICAgICAgICBCbG9jayBibG9jayA9IGJsb2NrRmFjdG9yeS5jcmVhdGVGcm9tKGVjaG8sIGJsb2NrQ3R4LCBudWxsKTsKLSAgICAgICAgCi0gICAgICAgIG1zZy5zZXRCb2R5QmxvY2soYmxvY2spOwotICAgICAgICAKLSAgICAgICAgTWVzc2FnZUNvbnRleHQgbWMgPSBuZXcgTWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgbWMuc2V0TUVQQ29udGV4dChuZXcgTUVQQ29udGV4dChtYykpOwotICAgICAgICBtYy5zZXRNZXNzYWdlKG1zZyk7Ci0gICAgICAgIAotICAgICAgICBMb2dpY2FsTWVzc2FnZUNvbnRleHQgbG1jID0gTWVzc2FnZUNvbnRleHRGYWN0b3J5LmNyZWF0ZUxvZ2ljYWxNZXNzYWdlQ29udGV4dChtYyk7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gbG1jOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIExvZ2ljYWxNZXNzYWdlQ29udGV4dCBjcmVhdGVTYW1wbGVGYXVsdENvbnRleHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgTWVzc2FnZUZhY3RvcnkgZmFjdG9yeSA9IChNZXNzYWdlRmFjdG9yeSkgRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoTWVzc2FnZUZhY3RvcnkuY2xhc3MpOwotICAgICAgICBNZXNzYWdlIG1zZyA9IGZhY3RvcnkuY3JlYXRlKFByb3RvY29sLnNvYXAxMSk7Ci0gICAgICAgIAotICAgICAgICBYTUxGYXVsdFJlYXNvbiByZWFzb24gPSBuZXcgWE1MRmF1bHRSZWFzb24oRkFVTFRfSU5QVVQpOyAgICAgICAgCi0gICAgICAgIFhNTEZhdWx0IGZhdWx0ID0gbmV3IFhNTEZhdWx0KFhNTEZhdWx0Q29kZS5TRU5ERVIsIHJlYXNvbik7Ci0gICAgICAgIG1zZy5zZXRYTUxGYXVsdChmYXVsdCk7Ci0gICAgICAgIAotICAgICAgICBNZXNzYWdlQ29udGV4dCBtYyA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBtYy5zZXRNRVBDb250ZXh0KG5ldyBNRVBDb250ZXh0KG1jKSk7Ci0gICAgICAgIG1jLnNldE1lc3NhZ2UobXNnKTsKLSAgICAgICAgCi0gICAgICAgIExvZ2ljYWxNZXNzYWdlQ29udGV4dCBsbWMgPSBNZXNzYWdlQ29udGV4dEZhY3RvcnkuY3JlYXRlTG9naWNhbE1lc3NhZ2VDb250ZXh0KG1jKTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiBsbWM7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgU3RyaW5nIF9nZXRTdHJpbmdGcm9tU291cmNlKFNvdXJjZSBzb3VyY2UpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBUcmFuc2Zvcm1lckZhY3RvcnkgZmFjdG9yeSA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICBUcmFuc2Zvcm1lciB0cmFucyA9IGZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKLSAgICAgICAgCi0gICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICBTdHJlYW1SZXN1bHQgcmVzdWx0ID0gbmV3IFN0cmVhbVJlc3VsdChiYW9zKTsKLSAgICAgICAgCi0gICAgICAgIHRyYW5zLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuT01JVF9YTUxfREVDTEFSQVRJT04sICJ5ZXMiKTsKLSAgICAgICAgdHJhbnMudHJhbnNmb3JtKHNvdXJjZSwgcmVzdWx0KTsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBjb250ZW50ID0gbmV3IFN0cmluZyhiYW9zLnRvQnl0ZUFycmF5KCkpOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGNvbnRlbnQ7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9oYW5kbGVyL2NvbnRleHQvU09BUE1lc3NhZ2VDb250ZXh0VGVzdHMuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9oYW5kbGVyL2NvbnRleHQvU09BUE1lc3NhZ2VDb250ZXh0VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjcxNzlmYy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvaGFuZGxlci9jb250ZXh0L1NPQVBNZXNzYWdlQ29udGV4dFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5oYW5kbGVyLmNvbnRleHQ7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb250ZXh0LmZhY3RvcnkuTWVzc2FnZUNvbnRleHRGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUuTWVzc2FnZUNvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaGFuZGxlci5NRVBDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmhhbmRsZXIuU29hcE1lc3NhZ2VDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuQmxvY2s7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5NZXNzYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuUHJvdG9jb2w7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5kYXRhYmluZGluZy5KQVhCQmxvY2tDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZmFjdG9yeS5KQVhCQmxvY2tGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZmFjdG9yeS5NZXNzYWdlRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5yZWdpc3RyeS5GYWN0b3J5UmVnaXN0cnk7DQotaW1wb3J0IHRlc3QuRWNob1N0cmluZzsNCi1pbXBvcnQgdGVzdC5PYmplY3RGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCQ29udGV4dDsNCi1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUE1lc3NhZ2U7DQotDQotcHVibGljIGNsYXNzIFNPQVBNZXNzYWdlQ29udGV4dFRlc3RzIGV4dGVuZHMgVGVzdENhc2Ugew0KLQ0KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBJTlBVVF8xID0gInNhbXBsZSBpbnB1dCI7DQotCXByaXZhdGUgZmluYWwgU3RyaW5nIElOUFVUXzIgPSAic2FtcGxlIGlucHV0IHR3byI7DQotCQ0KLSAgICBwcml2YXRlIE1lc3NhZ2UgY3JlYXRlTWVzc2FnZShTdHJpbmcgaW5wdXQpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgTWVzc2FnZUZhY3RvcnkgZmFjdG9yeSA9IChNZXNzYWdlRmFjdG9yeSkgRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoTWVzc2FnZUZhY3RvcnkuY2xhc3MpOw0KLSAgICAgICAgTWVzc2FnZSBtc2cgPSBmYWN0b3J5LmNyZWF0ZShQcm90b2NvbC5zb2FwMTEpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBDcmVhdGUgYSBqYXhiIG9iamVjdA0KLSAgICAgICAgT2JqZWN0RmFjdG9yeSBvYmpGYWN0b3J5ID0gbmV3IE9iamVjdEZhY3RvcnkoKTsNCi0gICAgICAgIEVjaG9TdHJpbmcgZWNobyA9IG9iakZhY3RvcnkuY3JlYXRlRWNob1N0cmluZygpOw0KLSAgICAgICAgZWNoby5zZXRJbnB1dChpbnB1dCk7DQotICAgICAgICANCi0gICAgICAgIC8vIENyZWF0ZSB0aGUgbmVjZXNzYXJ5IEpBWEJDb250ZXh0DQotICAgICAgICBKQVhCQ29udGV4dCBqYmMgPSBKQVhCQ29udGV4dC5uZXdJbnN0YW5jZSgidGVzdCIpOw0KLSAgICAgICAgSkFYQkJsb2NrQ29udGV4dCBibG9ja0N0eCA9IG5ldyBKQVhCQmxvY2tDb250ZXh0KGpiYyk7DQotICAgICAgICANCi0gICAgICAgIC8vIENyZWF0ZSB0aGUgQmxvY2sgDQotICAgICAgICBKQVhCQmxvY2tGYWN0b3J5IGJsb2NrRmFjdG9yeSA9IChKQVhCQmxvY2tGYWN0b3J5KSBGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShKQVhCQmxvY2tGYWN0b3J5LmNsYXNzKTsNCi0gICAgICAgIEJsb2NrIGJsb2NrID0gYmxvY2tGYWN0b3J5LmNyZWF0ZUZyb20oZWNobywgYmxvY2tDdHgsIG51bGwpOw0KLSAgICAgICAgDQotICAgICAgICBtc2cuc2V0Qm9keUJsb2NrKGJsb2NrKTsNCi0gICAgICAgIA0KLSAgICAgICAgcmV0dXJuIG1zZzsNCi0gICAgfQ0KLSAgICANCi0gICAgcHJpdmF0ZSBTb2FwTWVzc2FnZUNvbnRleHQgY3JlYXRlU2FtcGxlQ29udGV4dCgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgTWVzc2FnZSBtc2cgPSBjcmVhdGVNZXNzYWdlKElOUFVUXzEpOw0KLSAgICAgICAgTWVzc2FnZUNvbnRleHQgbWMgPSBuZXcgTWVzc2FnZUNvbnRleHQoKTsNCi0gICAgICAgIG1jLnNldE1FUENvbnRleHQobmV3IE1FUENvbnRleHQobWMpKTsNCi0gICAgICAgIG1jLnNldE1lc3NhZ2UobXNnKTsNCi0gICAgICAgIA0KLSAgICAgICAgcmV0dXJuIE1lc3NhZ2VDb250ZXh0RmFjdG9yeS5jcmVhdGVTb2FwTWVzc2FnZUNvbnRleHQobWMpOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QXNTb2FwTWVzc2FnZU9iamVjdElEKCkgew0KLSAgICAJdHJ5IHsNCi0gICAgCQlTb2FwTWVzc2FnZUNvbnRleHQgc21jID0gY3JlYXRlU2FtcGxlQ29udGV4dCgpOw0KLSAgICAJCVNPQVBNZXNzYWdlIG0xID0gc21jLmdldE1lc3NhZ2UoKTsNCi0gICAgCQlTT0FQTWVzc2FnZSBtMiA9IHNtYy5nZXRNZXNzYWdlKCk7DQotICAgIAkJLy8gbm90IHVzaW5nIGFzc2VydEVxdWFscyBiZWNhdXNlIEkgd2FudCBvYmplY3QgaWQgZXF1YWxpdHkNCi0gICAgCQlhc3NlcnRUcnVlKCJyZXRyaWV2YWwgb2YgbWVzc2FnZSBmcm9tIFNvYXBNZXNzYWdlQ29udGV4dCB0d2ljZSBpbiBhIHJvdyBzaG91bGQgcmVzdWx0IGluIHNhbWUgb2JqZWN0IiwgbTEgPT0gbTIpOw0KLSAgICAJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgCQlhc3NlcnROdWxsKCJzaG91bGQgbm90IGdldCBhbiBleGNlcHRpb24gaW4gdGhpcyB0ZXN0IiwgZSk7DQotICAgIAl9DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHRlc3RTb2FwTWVzc2FnZUNhY2hpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIE1lc3NhZ2UgbXNnMSA9IGNyZWF0ZU1lc3NhZ2UoSU5QVVRfMSk7DQotICAgICAgICBNZXNzYWdlIG1zZzIgPSBjcmVhdGVNZXNzYWdlKElOUFVUXzIpOw0KLSAgICAgICAgDQotICAgICAgICBNZXNzYWdlQ29udGV4dCBtYyA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOw0KLSAgICAgICAgbWMuc2V0TWVzc2FnZShtc2cxKTsNCi0gICAgICAgIFNvYXBNZXNzYWdlQ29udGV4dCBzb2FwQ3R4ID0gTWVzc2FnZUNvbnRleHRGYWN0b3J5LmNyZWF0ZVNvYXBNZXNzYWdlQ29udGV4dChtYyk7DQotICAgICAgICANCi0gICAgICAgIFNPQVBNZXNzYWdlIG0xID0gc29hcEN0eC5nZXRNZXNzYWdlKCk7DQotICAgICAgICBTT0FQTWVzc2FnZSBtMiA9IHNvYXBDdHguZ2V0TWVzc2FnZSgpOw0KLSAgICAgICAgDQotICAgICAgICBhc3NlcnRUcnVlKCJyZXRyaWV2YWwgb2YgbWVzc2FnZSBmcm9tIFNvYXBNZXNzYWdlQ29udGV4dCB0d2ljZSBpbiBhIHJvdyBzaG91bGQgcmVzdWx0IGluIHNhbWUgb2JqZWN0IiwgbTEgPT0gbTIpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBsZXQncyBjaGFuZ2UgdW5kZXJseWluZyBtZXNzYWdlIGFzIA0KLSAgICAgICAgLy8gSGFuZGxlckNoYWluUHJvY2Vzc29yLmNvbnZlcnRUb0ZhdWx0TWVzc2FnZSgpIGRvZXMNCi0gICAgICAgIG1jLnNldE1lc3NhZ2UobXNnMik7DQotICAgICAgICANCi0gICAgICAgIFNPQVBNZXNzYWdlIG0zID0gc29hcEN0eC5nZXRNZXNzYWdlKCk7DQotICAgICAgICBTT0FQTWVzc2FnZSBtNCA9IHNvYXBDdHguZ2V0TWVzc2FnZSgpOw0KLSAgICAgICAgDQotICAgICAgICBhc3NlcnRUcnVlKCJyZXRyaWV2YWwgb2YgbWVzc2FnZSBmcm9tIFNvYXBNZXNzYWdlQ29udGV4dCB0d2ljZSBpbiBhIHJvdyBzaG91bGQgcmVzdWx0IGluIHNhbWUgb2JqZWN0IiwgbTMgPT0gbTQpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBTb2FwIG1lc3NhZ2VzIGZyb20gYmVmb3JlIGFuZCBhZnRlciBtdXN0IGJlIGRpZmZlcmVudCENCi0gICAgICAgIGFzc2VydFRydWUoInJldHJpZXZhbCBvZiBtZXNzYWdlIGZyb20gU29hcE1lc3NhZ2VDb250ZXh0IGFmdGVyIG1lc3NhZ2UgaGFzIGNoYW5nZWQgaW4gdGhlIHVuZGVybHlpbmcgY29udGV4dCIsIG0xICE9IG0zKTsgIA0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9pMThuL0pheHdzTWVzc2FnZUJ1bmRsZVRlc3RzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvaTE4bi9KYXh3c01lc3NhZ2VCdW5kbGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjYzODMxLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9pMThuL0pheHdzTWVzc2FnZUJ1bmRsZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaTE4bjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotLyoqCi0gKiBUZXN0cyBiYXNpYyBmdW5jdGlvbiBvZiB0aGUgTWVzc2FnZSBCdW5kbGUKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXh3c01lc3NhZ2VCdW5kbGVUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICAKLSAgICBwdWJsaWMgSmF4d3NNZXNzYWdlQnVuZGxlVGVzdHMoKSB7IAotICAgICAgICBzdXBlcigpOwotICAgIH0KLSAgIAotICAgIHB1YmxpYyBKYXh3c01lc3NhZ2VCdW5kbGVUZXN0cyhTdHJpbmcgYXJnKSB7Ci0gICAgICAgIHN1cGVyKGFyZyk7ICAgCi0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEB0ZXN0U3RyYXRlZ3k6IFRlc3QgdGhhdCB0aGUgcmVzb3VyY2UgYnVuZGxlCi0gICAgICogaXMgaW5zdGFsbGVkIGJ5IG9idGFpbmluZyBhIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWVzc2FnZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIHN0ciA9ICJUaGlzIHN0cmluZyBpcyBhIHRlc3Qgc3RyaW5nIDAxLiI7Ci0gICAgICAgIFN0cmluZyB0ZW1wU3RyID0gTWVzc2FnZXMuZ2V0TWVzc2FnZSgidGVzdDAxIik7Ci0gICAgICAgIC8vIENoZWNrIHRoZSBTdHJpbmcgZm9yIGFjY3VyYWN5Ci0gICAgICAgIGFzc2VydFRydWUoc3RyLmVxdWFscyh0ZW1wU3RyKSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvaW5qZWN0aW9uL1Jlc291cmNlSW5qZWN0aW9uVGVzdEltcGwxLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvaW5qZWN0aW9uL1Jlc291cmNlSW5qZWN0aW9uVGVzdEltcGwxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmNDg0Y2UuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2luamVjdGlvbi9SZXNvdXJjZUluamVjdGlvblRlc3RJbXBsMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5pbmplY3Rpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MudW5pdFRlc3QuVGVzdExvZ2dlcjsNCi0NCi1pbXBvcnQgamF2YXguYW5ub3RhdGlvbi5Qb3N0Q29uc3RydWN0Ow0KLWltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlByZURlc3Ryb3k7DQotaW1wb3J0IGphdmF4LmFubm90YXRpb24uUmVzb3VyY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlQ29udGV4dDsNCi0NCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VJbmplY3Rpb25UZXN0SW1wbDEgew0KLQ0KLQlAUmVzb3VyY2UNCi0JcHVibGljIFdlYlNlcnZpY2VDb250ZXh0IGN0eCA9IG51bGw7DQotCQ0KLQlwdWJsaWMgUmVzb3VyY2VJbmplY3Rpb25UZXN0SW1wbDEoKSB7DQotCQlzdXBlcigpOw0KLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViDQotCX0NCi0JDQotCUBQb3N0Q29uc3RydWN0DQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoKXsNCi0JCS8vQ2FsbGVkIGFmdGVyIHJlc291cmNlIGluamVjdGlvbiBhbmQgYmVmb3JlIGEgbWV0aG9kIGlzIGNhbGxlZC4NCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJDYWxsaW5nIFBvc3RDb25zdHJ1Y3QgdG8gSW5pdGlhbGl6ZSIpOw0KLQl9DQotCQ0KLQlAUHJlRGVzdHJveQ0KLQlwdWJsaWMgdm9pZCBkaXN0cnVjdG9yKCl7DQotCQkvL0NhbGxlZCBiZWZvcmUgdGhlIHNjb3BlIG9mIHJlcXVlc3Qgb3Igc2Vzc2lvbiBvciBhcHBsaWNhdGlvbiBlbmRzLg0KLQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIkNhbGxpbmcgUHJlRGVzdHJveSAiKTsNCi0JCQ0KLQl9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9pbmplY3Rpb24vUmVzb3VyY2VJbmplY3Rpb25UZXN0SW1wbDIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9pbmplY3Rpb24vUmVzb3VyY2VJbmplY3Rpb25UZXN0SW1wbDIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE5MjZhNC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvaW5qZWN0aW9uL1Jlc291cmNlSW5qZWN0aW9uVGVzdEltcGwyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmluamVjdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51bml0VGVzdC5UZXN0TG9nZ2VyOw0KLQ0KLWltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlBvc3RDb25zdHJ1Y3Q7DQotaW1wb3J0IGphdmF4LmFubm90YXRpb24uUHJlRGVzdHJveTsNCi1pbXBvcnQgamF2YXguYW5ub3RhdGlvbi5SZXNvdXJjZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VDb250ZXh0Ow0KLQ0KLQ0KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZUluamVjdGlvblRlc3RJbXBsMnsNCi0NCi0JDQotCXB1YmxpYyBXZWJTZXJ2aWNlQ29udGV4dCBjdHggPSBudWxsOw0KLQkNCi0JcHVibGljIFJlc291cmNlSW5qZWN0aW9uVGVzdEltcGwyKCkgew0KLQkJc3VwZXIoKTsNCi0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1Yg0KLQl9DQotDQotCUBQb3N0Q29uc3RydWN0DQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoKXsNCi0JCS8vQ2FsbGVkIGFmdGVyIHJlc291cmNlIGluamVjdGlvbiBhbmQgYmVmb3JlIGEgbWV0aG9kIGlzIGNhbGxlZC4NCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJDYWxsaW5nIFBvc3RDb25zdHJ1Y3QgdG8gSW5pdGlhbGl6ZSIpOw0KLQl9DQotCQ0KLQlAUHJlRGVzdHJveQ0KLQlwdWJsaWMgdm9pZCBkaXN0cnVjdG9yKCl7DQotCQkvL0NhbGxlZCBiZWZvcmUgdGhlIHNjb3BlIG9mIHJlcXVlc3Qgb3Igc2Vzc2lvbiBvciBhcHBsaWNhdGlvbiBlbmRzLg0KLQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIkNhbGxpbmcgUHJlRGVzdHJveSAiKTsNCi0JCQ0KLQl9DQotCUBSZXNvdXJjZQ0KLQlwdWJsaWMgdm9pZCBzZXRDdHgoV2ViU2VydmljZUNvbnRleHQgY3R4KSB7DQotCQl0aGlzLmN0eCA9IGN0eDsNCi0JfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvaW5qZWN0aW9uL1Jlc291cmNlSW5qZWN0aW9uVGVzdEltcGwzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvaW5qZWN0aW9uL1Jlc291cmNlSW5qZWN0aW9uVGVzdEltcGwzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlNDVkZGMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2luamVjdGlvbi9SZXNvdXJjZUluamVjdGlvblRlc3RJbXBsMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5pbmplY3Rpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MudW5pdFRlc3QuVGVzdExvZ2dlcjsNCi0NCi1pbXBvcnQgamF2YXguYW5ub3RhdGlvbi5Qb3N0Q29uc3RydWN0Ow0KLWltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlByZURlc3Ryb3k7DQotaW1wb3J0IGphdmF4LmFubm90YXRpb24uUmVzb3VyY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlQ29udGV4dDsNCi0NCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VJbmplY3Rpb25UZXN0SW1wbDMgew0KLQ0KLQlAUmVzb3VyY2UNCi0JcHJpdmF0ZSBXZWJTZXJ2aWNlQ29udGV4dCBjdHggPSBudWxsOw0KLQkNCi0JcHVibGljIFJlc291cmNlSW5qZWN0aW9uVGVzdEltcGwzKCkgew0KLQkJc3VwZXIoKTsNCi0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1Yg0KLQl9DQotCQ0KLQlAUG9zdENvbnN0cnVjdA0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKCl7DQotCQkvL0NhbGxlZCBhZnRlciByZXNvdXJjZSBpbmplY3Rpb24gYW5kIGJlZm9yZSBhIG1ldGhvZCBpcyBjYWxsZWQuDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiQ2FsbGluZyBQb3N0Q29uc3RydWN0IHRvIEluaXRpYWxpemUiKTsNCi0JfQ0KLQkNCi0JQFByZURlc3Ryb3kNCi0JcHVibGljIHZvaWQgZGlzdHJ1Y3Rvcigpew0KLQkJLy9DYWxsZWQgYmVmb3JlIHRoZSBzY29wZSBvZiByZXF1ZXN0IG9yIHNlc3Npb24gb3IgYXBwbGljYXRpb24gZW5kcy4NCi0NCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJDYWxsaW5nIFByZURlc3Ryb3kgIik7DQotCQkNCi0JfQ0KLQlwdWJsaWMgV2ViU2VydmljZUNvbnRleHQgZ2V0Q3R4KCl7DQotCQlyZXR1cm4gY3R4Ow0KLQl9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9pbmplY3Rpb24vUmVzb3VyY2VJbmplY3Rpb25UZXN0SW1wbDQuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9pbmplY3Rpb24vUmVzb3VyY2VJbmplY3Rpb25UZXN0SW1wbDQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFjNTdhNy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvaW5qZWN0aW9uL1Jlc291cmNlSW5qZWN0aW9uVGVzdEltcGw0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmluamVjdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51bml0VGVzdC5UZXN0TG9nZ2VyOw0KLQ0KLWltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlBvc3RDb25zdHJ1Y3Q7DQotaW1wb3J0IGphdmF4LmFubm90YXRpb24uUHJlRGVzdHJveTsNCi1pbXBvcnQgamF2YXguYW5ub3RhdGlvbi5SZXNvdXJjZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VDb250ZXh0Ow0KLQ0KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZUluamVjdGlvblRlc3RJbXBsNCB7DQotDQotCQ0KLQlwcml2YXRlIFdlYlNlcnZpY2VDb250ZXh0IGN0eCA9IG51bGw7DQotCQ0KLQlwdWJsaWMgUmVzb3VyY2VJbmplY3Rpb25UZXN0SW1wbDQoKSB7DQotCQlzdXBlcigpOw0KLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViDQotCX0NCi0JDQotCUBQb3N0Q29uc3RydWN0DQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoKXsNCi0JCS8vQ2FsbGVkIGFmdGVyIHJlc291cmNlIGluamVjdGlvbiBhbmQgYmVmb3JlIGEgbWV0aG9kIGlzIGNhbGxlZC4NCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJDYWxsaW5nIFBvc3RDb25zdHJ1Y3QgdG8gSW5pdGlhbGl6ZSIpOw0KLQl9DQotCQ0KLQlAUHJlRGVzdHJveQ0KLQlwdWJsaWMgdm9pZCBkaXN0cnVjdG9yKCl7DQotCQkvL0NhbGxlZCBiZWZvcmUgdGhlIHNjb3BlIG9mIHJlcXVlc3Qgb3Igc2Vzc2lvbiBvciBhcHBsaWNhdGlvbiBlbmRzLg0KLQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIkNhbGxpbmcgUHJlRGVzdHJveSAiKTsNCi0JCQ0KLQl9DQotCUBSZXNvdXJjZQ0KLQlwcml2YXRlIHZvaWQgc2V0Q3R4KFdlYlNlcnZpY2VDb250ZXh0IGN0eCkgew0KLQkJdGhpcy5jdHggPSBjdHg7DQotCX0NCi0JDQotCXB1YmxpYyBXZWJTZXJ2aWNlQ29udGV4dCBnZXRDdHgoKXsNCi0JCXJldHVybiBjdHg7DQotCX0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2luamVjdGlvbi9SZXNvdXJjZUluamVjdGlvblRlc3RJbXBsNS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2luamVjdGlvbi9SZXNvdXJjZUluamVjdGlvblRlc3RJbXBsNS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDhhYTQ4Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9pbmplY3Rpb24vUmVzb3VyY2VJbmplY3Rpb25UZXN0SW1wbDUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaW5qZWN0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnVuaXRUZXN0LlRlc3RMb2dnZXI7DQotDQotaW1wb3J0IGphdmF4LmFubm90YXRpb24uUG9zdENvbnN0cnVjdDsNCi1pbXBvcnQgamF2YXguYW5ub3RhdGlvbi5QcmVEZXN0cm95Ow0KLWltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlJlc291cmNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUNvbnRleHQ7DQotDQotDQotcHVibGljIGNsYXNzIFJlc291cmNlSW5qZWN0aW9uVGVzdEltcGw1IHsNCi0NCi0JQFJlc291cmNlKHR5cGU9V2ViU2VydmljZUNvbnRleHQuY2xhc3MpDQotCXB1YmxpYyBXZWJTZXJ2aWNlQ29udGV4dCBjdHggPSBudWxsOw0KLQkNCi0JcHVibGljIFJlc291cmNlSW5qZWN0aW9uVGVzdEltcGw1KCkgew0KLQkJc3VwZXIoKTsNCi0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1Yg0KLQl9DQotCQ0KLQlAUG9zdENvbnN0cnVjdA0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKCl7DQotCQkvL0NhbGxlZCBhZnRlciByZXNvdXJjZSBpbmplY3Rpb24gYW5kIGJlZm9yZSBhIG1ldGhvZCBpcyBjYWxsZWQuDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiQ2FsbGluZyBQb3N0Q29uc3RydWN0IHRvIEluaXRpYWxpemUiKTsNCi0JfQ0KLQkNCi0JQFByZURlc3Ryb3kNCi0JcHVibGljIHZvaWQgZGlzdHJ1Y3Rvcigpew0KLQkJLy9DYWxsZWQgYmVmb3JlIHRoZSBzY29wZSBvZiByZXF1ZXN0IG9yIHNlc3Npb24gb3IgYXBwbGljYXRpb24gZW5kcy4NCi0NCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJDYWxsaW5nIFByZURlc3Ryb3kgIik7DQotCQkNCi0JfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvaW5qZWN0aW9uL1Jlc291cmNlSW5qZWN0aW9uVGVzdHMuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9pbmplY3Rpb24vUmVzb3VyY2VJbmplY3Rpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTdiZGJjLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9pbmplY3Rpb24vUmVzb3VyY2VJbmplY3Rpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaW5qZWN0aW9uOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29udGV4dC5XZWJTZXJ2aWNlQ29udGV4dEltcGw7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2VydmVyLmVuZHBvaW50LmluamVjdGlvbi5SZXNvdXJjZUluamVjdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNlcnZlci5lbmRwb2ludC5pbmplY3Rpb24uZmFjdG9yeS5SZXNvdXJjZUluamVjdGlvbkZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MudW5pdFRlc3QuVGVzdExvZ2dlcjsNCi0NCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VDb250ZXh0Ow0KLQ0KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZUluamVjdGlvblRlc3RzIGV4dGVuZHMgVGVzdENhc2Ugew0KLSAgICBTdHJpbmcgYXhpc0VuZHBvaW50ID0gImh0dHA6Ly9sb2NhbGhvc3Q6NjA2MC9heGlzMi9zZXJ2aWNlcy9SZXNvdXJjZUluamVjdGlvblNlcnZpY2UuUmVzb3VyY2VJbmplY3Rpb25Qb3J0VHlwZUltcGxQb3J0IjsNCi0NCi0gICAgcHJpdmF0ZSBPYmplY3QgcmVzb3VyY2UgPSBuZXcgV2ViU2VydmljZUNvbnRleHRJbXBsKCk7DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RJbmplY3Rpb25PbkZpZWxkKCl7DQotICAgICAgICBPYmplY3Qgc2VydmljZUluc3RhbmNlID0gbmV3IFJlc291cmNlSW5qZWN0aW9uVGVzdEltcGwxKCk7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiVGVzdCA6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgdHJ5ew0KLSAgICAgICAgICAgIFJlc291cmNlSW5qZWN0b3IgaW5qZWN0b3IgPSBSZXNvdXJjZUluamVjdGlvbkZhY3RvcnkuY3JlYXRlUmVzb3VyY2VJbmplY3RvcihXZWJTZXJ2aWNlQ29udGV4dC5jbGFzcyk7DQotICAgICAgICAgICAgaW5qZWN0b3IuaW5qZWN0KHJlc291cmNlLCBzZXJ2aWNlSW5zdGFuY2UpOw0KLSAgICAgICAgICAgIFJlc291cmNlSW5qZWN0aW9uVGVzdEltcGwxIHNlcnZpY2VJbXBsID0oUmVzb3VyY2VJbmplY3Rpb25UZXN0SW1wbDEpc2VydmljZUluc3RhbmNlOw0KLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZUltcGwuY3R4KTsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiUmVzb3VyY2UgSW5qZWN0ZWQgb24gRmllbGQiKTsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICB9Y2F0Y2goRXhjZXB0aW9uIGUpew0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAgICAgZmFpbCgpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RJbmplY3Rpb25Pbk1ldGhvZCgpew0KLSAgICAgICAgT2JqZWN0IHNlcnZpY2VJbnN0YW5jZSA9IG5ldyBSZXNvdXJjZUluamVjdGlvblRlc3RJbXBsMigpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIlRlc3QgOiAiICsgZ2V0TmFtZSgpKTsNCi0gICAgICAgIHRyeXsNCi0gICAgICAgICAgICBSZXNvdXJjZUluamVjdG9yIGluamVjdG9yID0gUmVzb3VyY2VJbmplY3Rpb25GYWN0b3J5LmNyZWF0ZVJlc291cmNlSW5qZWN0b3IoV2ViU2VydmljZUNvbnRleHQuY2xhc3MpOw0KLSAgICAgICAgICAgIGluamVjdG9yLmluamVjdChyZXNvdXJjZSwgc2VydmljZUluc3RhbmNlKTsNCi0gICAgICAgICAgICBSZXNvdXJjZUluamVjdGlvblRlc3RJbXBsMiBzZXJ2aWNlSW1wbCA9KFJlc291cmNlSW5qZWN0aW9uVGVzdEltcGwyKXNlcnZpY2VJbnN0YW5jZTsNCi0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2VJbXBsLmN0eCk7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIlJlc291cmNlIEluamVjdGVkIG9uIE1ldGhvZCIpOw0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIH1jYXRjaChFeGNlcHRpb24gZSl7DQotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgICAgICBmYWlsKCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdEluamVjdGlvbk9uUHJpdmF0ZUZpZWxkKCl7DQotICAgICAgICBPYmplY3Qgc2VydmljZUluc3RhbmNlID0gbmV3IFJlc291cmNlSW5qZWN0aW9uVGVzdEltcGwzKCk7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiVGVzdCA6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgdHJ5ew0KLSAgICAgICAgICAgIFJlc291cmNlSW5qZWN0b3IgaW5qZWN0b3IgPSBSZXNvdXJjZUluamVjdGlvbkZhY3RvcnkuY3JlYXRlUmVzb3VyY2VJbmplY3RvcihXZWJTZXJ2aWNlQ29udGV4dC5jbGFzcyk7DQotICAgICAgICAgICAgaW5qZWN0b3IuaW5qZWN0KHJlc291cmNlLCBzZXJ2aWNlSW5zdGFuY2UpOw0KLSAgICAgICAgICAgIFJlc291cmNlSW5qZWN0aW9uVGVzdEltcGwzIHNlcnZpY2VJbXBsID0oUmVzb3VyY2VJbmplY3Rpb25UZXN0SW1wbDMpc2VydmljZUluc3RhbmNlOw0KLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZUltcGwuZ2V0Q3R4KCkpOw0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJSZXNvdXJjZSBJbmplY3RlZCBvbiBQcml2YXRlIEZpZWxkIik7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgfWNhdGNoKEV4Y2VwdGlvbiBlKXsNCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgICAgIGZhaWwoKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW5qZWN0aW9uT25Qcm92YXRlTWV0aG9kKCl7DQotICAgICAgICBPYmplY3Qgc2VydmljZUluc3RhbmNlID0gbmV3IFJlc291cmNlSW5qZWN0aW9uVGVzdEltcGw0KCk7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiVGVzdCA6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgdHJ5ew0KLSAgICAgICAgICAgIFJlc291cmNlSW5qZWN0b3IgaW5qZWN0b3IgPSBSZXNvdXJjZUluamVjdGlvbkZhY3RvcnkuY3JlYXRlUmVzb3VyY2VJbmplY3RvcihXZWJTZXJ2aWNlQ29udGV4dC5jbGFzcyk7DQotICAgICAgICAgICAgaW5qZWN0b3IuaW5qZWN0KHJlc291cmNlLCBzZXJ2aWNlSW5zdGFuY2UpOw0KLSAgICAgICAgICAgIFJlc291cmNlSW5qZWN0aW9uVGVzdEltcGw0IHNlcnZpY2VJbXBsID0oUmVzb3VyY2VJbmplY3Rpb25UZXN0SW1wbDQpc2VydmljZUluc3RhbmNlOw0KLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZUltcGwuZ2V0Q3R4KCkpOw0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJSZXNvdXJjZSBJbmplY3RlZCB1c2luZyBwcml2YXRlIE1ldGhvZCIpOw0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIH1jYXRjaChFeGNlcHRpb24gZSl7DQotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgICAgICBmYWlsKCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFR5cGVkUmVzb3VyY2VJbmplY3Rpb25PbkZpZWxkKCl7DQotICAgICAgICBPYmplY3Qgc2VydmljZUluc3RhbmNlID0gbmV3IFJlc291cmNlSW5qZWN0aW9uVGVzdEltcGw1KCk7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiVGVzdCA6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgdHJ5ew0KLSAgICAgICAgICAgIFJlc291cmNlSW5qZWN0b3IgaW5qZWN0b3IgPSBSZXNvdXJjZUluamVjdGlvbkZhY3RvcnkuY3JlYXRlUmVzb3VyY2VJbmplY3RvcihXZWJTZXJ2aWNlQ29udGV4dC5jbGFzcyk7DQotICAgICAgICAgICAgaW5qZWN0b3IuaW5qZWN0KHJlc291cmNlLCBzZXJ2aWNlSW5zdGFuY2UpOw0KLSAgICAgICAgICAgIFJlc291cmNlSW5qZWN0aW9uVGVzdEltcGw1IHNlcnZpY2VJbXBsID0oUmVzb3VyY2VJbmplY3Rpb25UZXN0SW1wbDUpc2VydmljZUluc3RhbmNlOw0KLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZUltcGwuY3R4KTsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiUmVzb3VyY2UgSW5qZWN0ZWQgb24gRmllbGQiKTsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICB9Y2F0Y2goRXhjZXB0aW9uIGUpew0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAgICAgZmFpbCgpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9qYXhiL21mcXVvdGUvU3RvY2tRdW90ZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2pheGIvbWZxdW90ZS9TdG9ja1F1b3RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyZDEwZDkuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2pheGIvbWZxdW90ZS9TdG9ja1F1b3RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5qYXhiLm1mcXVvdGU7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlOwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJFbmRwb2ludDsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUNsaWVudDsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi0vKioKLSAqIFRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBieSB0aGUgSkFYV1MgU0kuCi0gKiBKQVgtV1MgUkkgMi4wXzAxLWIxNS1mY3MKLSAqIEdlbmVyYXRlZCBzb3VyY2UgdmVyc2lvbjogMi4wCi0gKiAKLSAqLwotQFdlYlNlcnZpY2VDbGllbnQobmFtZSA9ICJTdG9ja1F1b3RlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Rlc3QiLCB3c2RsTG9jYXRpb24gPSAiU3RvY2tRdW90ZS53c2RsIikKLXB1YmxpYyBjbGFzcyBTdG9ja1F1b3RlCi0gICAgZXh0ZW5kcyBTZXJ2aWNlCi17Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBVUkwgU1RPQ0tRVU9URV9XU0RMX0xPQ0FUSU9OOwotCi0gICAgc3RhdGljIHsKLSAgICAgICAgVVJMIHVybCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB1cmwgPSBuZXcgVVJMKCJmaWxlOi9DOi90ZW1wL1N0b2NrUXVvdGUud3NkbCIpOwotICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgICAgICBTVE9DS1FVT1RFX1dTRExfTE9DQVRJT04gPSB1cmw7Ci0gICAgfQotCi0gICAgcHVibGljIFN0b2NrUXVvdGUoVVJMIHdzZGxMb2NhdGlvbiwgUU5hbWUgc2VydmljZU5hbWUpIHsKLSAgICAgICAgc3VwZXIod3NkbExvY2F0aW9uLCBzZXJ2aWNlTmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0b2NrUXVvdGUoKSB7Ci0gICAgICAgIHN1cGVyKFNUT0NLUVVPVEVfV1NETF9MT0NBVElPTiwgbmV3IFFOYW1lKCJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy90ZXN0IiwgIlN0b2NrUXVvdGUiKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHJldHVybgotICAgICAqICAgICByZXR1cm5zIFN0b2NrUXVvdGVJRgotICAgICAqLwotICAgIEBXZWJFbmRwb2ludChuYW1lID0gIlN0b2NrUXVvdGVQb3J0IikKLSAgICBwdWJsaWMgU3RvY2tRdW90ZUlGIGdldFN0b2NrUXVvdGVQb3J0KCkgewotICAgICAgICByZXR1cm4gKFN0b2NrUXVvdGVJRilzdXBlci5nZXRQb3J0KG5ldyBRTmFtZSgiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvdGVzdCIsICJTdG9ja1F1b3RlUG9ydCIpLCBTdG9ja1F1b3RlSUYuY2xhc3MpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2pheGIvbWZxdW90ZS9TdG9ja1F1b3RlSUYuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9qYXhiL21mcXVvdGUvU3RvY2tRdW90ZUlGLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxOGQyMzguLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2pheGIvbWZxdW90ZS9TdG9ja1F1b3RlSUYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmpheGIubWZxdW90ZTsKLQotaW1wb3J0IGphdmF4Lmp3cy5XZWJNZXRob2Q7Ci1pbXBvcnQgamF2YXguandzLldlYlBhcmFtOwotaW1wb3J0IGphdmF4Lmp3cy5XZWJSZXN1bHQ7Ci1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7Ci1pbXBvcnQgamF2YXgueG1sLndzLlJlcXVlc3RXcmFwcGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5SZXNwb25zZVdyYXBwZXI7Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIEpBWFdTIFNJLgotICogSkFYLVdTIFJJIDIuMF8wMS1iMTUtZmNzCi0gKiBHZW5lcmF0ZWQgc291cmNlIHZlcnNpb246IDIuMAotICogCi0gKi8KLUBXZWJTZXJ2aWNlKG5hbWUgPSAiU3RvY2tRdW90ZUlGIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Rlc3QiKQotcHVibGljIGludGVyZmFjZSBTdG9ja1F1b3RlSUYgewotCi0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gIDEwSG9sZGluZ3MKLSAgICAgKiBAcGFyYW0gZnVuZAotICAgICAqIEBwYXJhbSBuYXYKLSAgICAgKiBAcmV0dXJuCi0gICAgICogICAgIHJldHVybnMgamF2YS5sYW5nLlN0cmluZwotICAgICAqLwotICAgIEBXZWJNZXRob2QoYWN0aW9uID0gImh0dHA6Ly90ZW1wdXJpLm9yZy9TdG9ja1F1b3RlL2dldFByaWNlIikKLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAicHJpY2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikKLSAgICBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gImdldFByaWNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gInVybjovL3N0b2NrMS50ZXN0Lm9yZyIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5zdG9jazEuR2V0UHJpY2UiKQotICAgIEBSZXNwb25zZVdyYXBwZXIobG9jYWxOYW1lID0gImdldFByaWNlUmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAidXJuOi8vc3RvY2sxLnRlc3Qub3JnIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LnN0b2NrMS5TdG9ja1ByaWNlIikKLSAgICBwdWJsaWMgU3RyaW5nIGdldFByaWNlKAotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJmdW5kIiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpCi0gICAgICAgIFN0cmluZyBmdW5kLAotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJfMTBob2xkaW5ncyIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQotICAgICAgICBTdHJpbmcgXzEwSG9sZGluZ3MsCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gIm5hdiIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQotICAgICAgICBTdHJpbmcgbmF2KTsKLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2pheGIvc3RvY2txdW90ZS9TdG9ja1F1b3RlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvamF4Yi9zdG9ja3F1b3RlL1N0b2NrUXVvdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjkyMTg3Ni4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvamF4Yi9zdG9ja3F1b3RlL1N0b2NrUXVvdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmpheGIuc3RvY2txdW90ZTsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYkVuZHBvaW50OwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlQ2xpZW50OwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLS8qKgotICogVGhpcyBjbGFzcyB3YXMgZ2VuZXJhdGVkIGJ5IHRoZSBKQVhXUyBTSS4KLSAqIEpBWC1XUyBSSSAyLjBfMDEtYjE1LWZjcwotICogR2VuZXJhdGVkIHNvdXJjZSB2ZXJzaW9uOiAyLjAKLSAqIAotICovCi1AV2ViU2VydmljZUNsaWVudChuYW1lID0gIlN0b2NrUXVvdGUiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvdGVzdCIsIHdzZGxMb2NhdGlvbiA9ICJTdG9ja1F1b3RlLndzZGwiKQotcHVibGljIGNsYXNzIFN0b2NrUXVvdGUKLSAgICBleHRlbmRzIFNlcnZpY2UKLXsKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFVSTCBTVE9DS1FVT1RFX1dTRExfTE9DQVRJT047Ci0KLSAgICBzdGF0aWMgewotICAgICAgICBVUkwgdXJsID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHVybCA9IG5ldyBVUkwoImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Rlc3QvU3RvY2tRdW90ZS53c2RsIik7Ci0gICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgICAgIFNUT0NLUVVPVEVfV1NETF9MT0NBVElPTiA9IHVybDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RvY2tRdW90ZShVUkwgd3NkbExvY2F0aW9uLCBRTmFtZSBzZXJ2aWNlTmFtZSkgewotICAgICAgICBzdXBlcih3c2RsTG9jYXRpb24sIHNlcnZpY2VOYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RvY2tRdW90ZSgpIHsKLSAgICAgICAgc3VwZXIoU1RPQ0tRVU9URV9XU0RMX0xPQ0FUSU9OLCBuZXcgUU5hbWUoImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Rlc3QiLCAiU3RvY2tRdW90ZSIpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuCi0gICAgICogICAgIHJldHVybnMgU3RvY2tRdW90ZUlGCi0gICAgICovCi0gICAgQFdlYkVuZHBvaW50KG5hbWUgPSAiU3RvY2tRdW90ZVBvcnQiKQotICAgIHB1YmxpYyBTdG9ja1F1b3RlSUYgZ2V0U3RvY2tRdW90ZVBvcnQoKSB7Ci0gICAgICAgIHJldHVybiAoU3RvY2tRdW90ZUlGKXN1cGVyLmdldFBvcnQobmV3IFFOYW1lKCJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy90ZXN0IiwgIlN0b2NrUXVvdGVQb3J0IiksIFN0b2NrUXVvdGVJRi5jbGFzcyk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvamF4Yi9zdG9ja3F1b3RlL1N0b2NrUXVvdGVJRi5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2pheGIvc3RvY2txdW90ZS9TdG9ja1F1b3RlSUYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTkxNmVmYi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvamF4Yi9zdG9ja3F1b3RlL1N0b2NrUXVvdGVJRi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuamF4Yi5zdG9ja3F1b3RlOwotCi1pbXBvcnQgamF2YXguandzLldlYk1ldGhvZDsKLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW07Ci1pbXBvcnQgamF2YXguandzLldlYlJlc3VsdDsKLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKLWltcG9ydCBqYXZheC54bWwud3MuUmVxdWVzdFdyYXBwZXI7Ci1pbXBvcnQgamF2YXgueG1sLndzLlJlc3BvbnNlV3JhcHBlcjsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBieSB0aGUgSkFYV1MgU0kuCi0gKiBKQVgtV1MgUkkgMi4wXzAxLWIxNS1mY3MKLSAqIEdlbmVyYXRlZCBzb3VyY2UgdmVyc2lvbjogMi4wCi0gKiAKLSAqLwotQFdlYlNlcnZpY2UobmFtZSA9ICJTdG9ja1F1b3RlSUYiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvdGVzdCIpCi1wdWJsaWMgaW50ZXJmYWNlIFN0b2NrUXVvdGVJRiB7Ci0KLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEBwYXJhbSBzeW1ib2wKLSAgICAgKiBAcmV0dXJuCi0gICAgICogICAgIHJldHVybnMgamF2YS5sYW5nLlN0cmluZwotICAgICAqLwotICAgIEBXZWJNZXRob2QoYWN0aW9uID0gImh0dHA6Ly90ZW1wdXJpLm9yZy9TdG9ja1F1b3RlL2dldFByaWNlIikKLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAicHJpY2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikKLSAgICBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gImdldFByaWNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gInVybjovL3N0b2NrMi50ZXN0Lm9yZyIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5zdG9jazIuR2V0UHJpY2UiKQotICAgIEBSZXNwb25zZVdyYXBwZXIobG9jYWxOYW1lID0gImdldFByaWNlUmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAidXJuOi8vc3RvY2syLnRlc3Qub3JnIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LnN0b2NrMi5TdG9ja1ByaWNlIikKLSAgICBwdWJsaWMgU3RyaW5nIGdldFByaWNlKAotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJzeW1ib2wiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikKLSAgICAgICAgU3RyaW5nIHN5bWJvbCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9qYXhiL3dyYXBwZXIvV3JhcHBlclRvb2xUZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvamF4Yi93cmFwcGVyL1dyYXBwZXJUb29sVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTFlYzY5Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9qYXhiL3dyYXBwZXIvV3JhcHBlclRvb2xUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmpheGIud3JhcHBlcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLndyYXBwZXIuSkFYQldyYXBwZXJUb29sOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Mud3JhcHBlci5pbXBsLkpBWEJXcmFwcGVyRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Mud3JhcHBlci5pbXBsLkpBWEJXcmFwcGVyVG9vbEltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLldlYWtIYXNoTWFwOwotCi1wdWJsaWMgY2xhc3MgV3JhcHBlclRvb2xUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotICAgIHB1YmxpYyB2b2lkIHRlc3RXcmFwU3RvY2tRdW90ZSgpewotICAgICAgICB0cnl7Ci0gICAgICAgICAgICBKQVhCV3JhcHBlclRvb2wgd3JhcHBlciA9IG5ldyBKQVhCV3JhcHBlclRvb2xJbXBsKCk7Ci0KLSAgICAgICAgICAgIFN0cmluZyBqYXhiQ2xhc3NOYW1lID0gIm9yZy50ZXN0LnN0b2NrMi5HZXRQcmljZSI7Ci0gICAgICAgICAgICBDbGFzcyBqYXhiQ2xhc3M7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGpheGJDbGFzcyA9IENsYXNzLmZvck5hbWUoamF4YkNsYXNzTmFtZSwgZmFsc2UsIENsYXNzTG9hZGVyLmdldFN5c3RlbUNsYXNzTG9hZGVyKCkpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpewotICAgICAgICAgICAgICAgIGpheGJDbGFzcyA9IENsYXNzLmZvck5hbWUoamF4YkNsYXNzTmFtZSwgZmFsc2UsIHRoaXMuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IGNoaWxkTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgICAgIFN0cmluZyBjaGlsZE5hbWUgPSAic3ltYm9sIjsKLSAgICAgICAgICAgIGNoaWxkTmFtZXMuYWRkKGNoaWxkTmFtZSk7Ci0gICAgICAgICAgICBTdHJpbmcgc3ltYm9sT2JqID0gbmV3IFN0cmluZygiSUJNIik7Ci0gICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IGNoaWxkT2JqZWN0cz0gbmV3IFdlYWtIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotICAgICAgICAgICAgY2hpbGRPYmplY3RzLnB1dChjaGlsZE5hbWUsIHN5bWJvbE9iaik7Ci0gICAgICAgICAgICBPYmplY3QgamF4Yk9iamVjdCA9IHdyYXBwZXIud3JhcChqYXhiQ2xhc3MsIGNoaWxkTmFtZXMsIGNoaWxkT2JqZWN0cyk7Ci0gICAgICAgICAgICBvcmcudGVzdC5zdG9jazIuR2V0UHJpY2UgZ2V0UHJpY2UgPSAob3JnLnRlc3Quc3RvY2syLkdldFByaWNlKWpheGJPYmplY3Q7Ci0KLSAgICAgICAgfWNhdGNoKEpBWEJXcmFwcGVyRXhjZXB0aW9uIGUpewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfWNhdGNoKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFVud3JhcFN0b2NrUXVvdGUoKXsKLSAgICAgICAgdHJ5ewotICAgICAgICAgICAgSkFYQldyYXBwZXJUb29sIHdyYXBwZXIgPSBuZXcgSkFYQldyYXBwZXJUb29sSW1wbCgpOwotICAgICAgICAgICAgb3JnLnRlc3Quc3RvY2syLkdldFByaWNlIHByaWNlID0gbmV3IG9yZy50ZXN0LnN0b2NrMi5HZXRQcmljZSgpOwotICAgICAgICAgICAgcHJpY2Uuc2V0U3ltYm9sKCJJQk0iKTsKLQotICAgICAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gY2hpbGROYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICAgICAgU3RyaW5nIGNoaWxkTmFtZSA9ICJzeW1ib2wiOwotICAgICAgICAgICAgY2hpbGROYW1lcy5hZGQoY2hpbGROYW1lKTsKLQotICAgICAgICAgICAgT2JqZWN0W10gamF4Yk9iamVjdHMgPSB3cmFwcGVyLnVuV3JhcChwcmljZSwgY2hpbGROYW1lcyk7Ci0KLSAgICAgICAgfWNhdGNoKEpBWEJXcmFwcGVyRXhjZXB0aW9uIGUpewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RXcmFwTUZRdW90ZSgpewotICAgICAgICB0cnl7Ci0gICAgICAgICAgICBKQVhCV3JhcHBlclRvb2wgd3JhcHBlciA9IG5ldyBKQVhCV3JhcHBlclRvb2xJbXBsKCk7Ci0KLSAgICAgICAgICAgIFN0cmluZyBqYXhiQ2xhc3NOYW1lID0gIm9yZy50ZXN0LnN0b2NrMS5HZXRQcmljZSI7Ci0gICAgICAgICAgICBDbGFzcyBqYXhiQ2xhc3M7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGpheGJDbGFzcyA9IENsYXNzLmZvck5hbWUoamF4YkNsYXNzTmFtZSwgZmFsc2UsIENsYXNzTG9hZGVyLmdldFN5c3RlbUNsYXNzTG9hZGVyKCkpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpewotICAgICAgICAgICAgICAgIGpheGJDbGFzcyA9IENsYXNzLmZvck5hbWUoamF4YkNsYXNzTmFtZSwgZmFsc2UsIHRoaXMuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IGNoaWxkTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgICAgIFN0cmluZyBmdW5kID0iZnVuZCI7Ci0gICAgICAgICAgICBTdHJpbmcgZnVuZE5hbWUgPSBuZXcgU3RyaW5nKCJQUkdGWCIpOwotICAgICAgICAgICAgU3RyaW5nIGhvbGRpbmcgPSAiaG9sZGluZ3MuIjsKLSAgICAgICAgICAgIFN0cmluZyB0b3BIb2xkaW5nID0gbmV3IFN0cmluZygiR0UiKTsKLSAgICAgICAgICAgIFN0cmluZyBuYXYgPSJuYXYiOwotICAgICAgICAgICAgU3RyaW5nIG5hdkluTWlsbGlvbiA9IG5ldyBTdHJpbmcoIjcwMCIpOwotCi0gICAgICAgICAgICBjaGlsZE5hbWVzLmFkZChmdW5kKTsKLSAgICAgICAgICAgIGNoaWxkTmFtZXMuYWRkKGhvbGRpbmcpOwotICAgICAgICAgICAgY2hpbGROYW1lcy5hZGQobmF2KTsKLQotICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBjaGlsZE9iamVjdHM9IG5ldyBXZWFrSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLQotICAgICAgICAgICAgY2hpbGRPYmplY3RzLnB1dChmdW5kLCBmdW5kTmFtZSk7Ci0gICAgICAgICAgICBjaGlsZE9iamVjdHMucHV0KGhvbGRpbmcsIHRvcEhvbGRpbmcpOwotICAgICAgICAgICAgY2hpbGRPYmplY3RzLnB1dChuYXYsIG5hdkluTWlsbGlvbik7Ci0KLSAgICAgICAgICAgIE9iamVjdCBqYXhiT2JqZWN0ID0gd3JhcHBlci53cmFwKGpheGJDbGFzcywgY2hpbGROYW1lcywgY2hpbGRPYmplY3RzKTsKLSAgICAgICAgICAgIG9yZy50ZXN0LnN0b2NrMS5HZXRQcmljZSBnZXRQcmljZSA9IChvcmcudGVzdC5zdG9jazEuR2V0UHJpY2UpamF4Yk9iamVjdDsKLQotICAgICAgICB9Y2F0Y2goSkFYQldyYXBwZXJFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Y2F0Y2goQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKXsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VW53cmFwTUZRdW90ZSgpewotICAgICAgICB0cnl7Ci0gICAgICAgICAgICBKQVhCV3JhcHBlclRvb2wgd3JhcHBlciA9IG5ldyBKQVhCV3JhcHBlclRvb2xJbXBsKCk7Ci0gICAgICAgICAgICBvcmcudGVzdC5zdG9jazEuR2V0UHJpY2UgcHJpY2UgPSBuZXcgb3JnLnRlc3Quc3RvY2sxLkdldFByaWNlKCk7Ci0gICAgICAgICAgICBwcmljZS5zZXRGdW5kKCJQUkdGWCIpOwotICAgICAgICAgICAgcHJpY2Uuc2V0SG9sZGluZ3MoIkdFIik7Ci0gICAgICAgICAgICBwcmljZS5zZXROYXYoIjcwMCIpOwotCi0gICAgICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBjaGlsZE5hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICBTdHJpbmcgZnVuZCA9ImZ1bmQiOwotICAgICAgICAgICAgY2hpbGROYW1lcy5hZGQoZnVuZCk7Ci0gICAgICAgICAgICBTdHJpbmcgaG9sZGluZyA9ICJob2xkaW5ncy4iOwotICAgICAgICAgICAgY2hpbGROYW1lcy5hZGQoaG9sZGluZyk7Ci0gICAgICAgICAgICBTdHJpbmcgbmF2ID0ibmF2IjsKLSAgICAgICAgICAgIGNoaWxkTmFtZXMuYWRkKG5hdik7Ci0KLSAgICAgICAgICAgIE9iamVjdFtdIGpheGJPYmplY3RzID0gd3JhcHBlci51bldyYXAocHJpY2UsIGNoaWxkTmFtZXMpOwotICAgICAgICB9Y2F0Y2goSkFYQldyYXBwZXJFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2xpZmVjeWNsZS9FbmRwb2ludExpZmVjeWNsZVRlc3RzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvbGlmZWN5Y2xlL0VuZHBvaW50TGlmZWN5Y2xlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTMyZmQ2Ni4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvbGlmZWN5Y2xlL0VuZHBvaW50TGlmZWN5Y2xlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubGlmZWN5Y2xlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaW5qZWN0aW9uLlJlc291cmNlSW5qZWN0aW9uVGVzdEltcGwxOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MucmVnaXN0cnkuRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2VydmVyLmVuZHBvaW50LmxpZmVjeWNsZS5FbmRwb2ludExpZmVjeWNsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zZXJ2ZXIuZW5kcG9pbnQubGlmZWN5Y2xlLmZhY3RvcnkuRW5kcG9pbnRMaWZlY3ljbGVNYW5hZ2VyRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnVuaXRUZXN0LlRlc3RMb2dnZXI7Ci0KLS8qKgotICogVW5pdCBUZXN0cyBmb3IgbGlmZWN5Y2xlIGNyZWF0b2luCi0gKgotICovCi1wdWJsaWMgY2xhc3MgRW5kcG9pbnRMaWZlY3ljbGVUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICBPYmplY3QgZW5kcG9pbnRJbnN0YW5jZSA9IG5ldyBSZXNvdXJjZUluamVjdGlvblRlc3RJbXBsMSgpOwotICAgIE9iamVjdCBiYWRPYmplY3QgPSBuZXcgT2JqZWN0KCk7Ci0gICAgcHVibGljIEVuZHBvaW50TGlmZWN5Y2xlVGVzdHMoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBhcmcwCi0gICAgICovCi0gICAgcHVibGljIEVuZHBvaW50TGlmZWN5Y2xlVGVzdHMoU3RyaW5nIGFyZzApIHsKLSAgICAgICAgc3VwZXIoYXJnMCk7Ci0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0Q29uc3RydWN0KCl7Ci0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIlRlc3QgOiAiICsgZ2V0TmFtZSgpKTsKLSAgICAgICAgdHJ5ewotICAgICAgICAgICAgRW5kcG9pbnRMaWZlY3ljbGVNYW5hZ2VyRmFjdG9yeSBlbG1mID0gKEVuZHBvaW50TGlmZWN5Y2xlTWFuYWdlckZhY3RvcnkpRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoRW5kcG9pbnRMaWZlY3ljbGVNYW5hZ2VyRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGVsbWYpOwotICAgICAgICAgICAgRW5kcG9pbnRMaWZlY3ljbGVNYW5hZ2VyIGVsbSA9IGVsbWYuY3JlYXRlRW5kcG9pbnRMaWZlY3ljbGVNYW5hZ2VyKGVuZHBvaW50SW5zdGFuY2UpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChlbG1mKTsKLSAgICAgICAgICAgIGVsbS5pbnZva2VQb3N0Q29uc3RydWN0KCk7Ci0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7Ci0gICAgICAgIH1jYXRjaChFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQcmVEZXN0cm95KCl7Ci0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIlRlc3QgOiAiICsgZ2V0TmFtZSgpKTsKLSAgICAgICAgdHJ5ewotICAgICAgICAgICAgRW5kcG9pbnRMaWZlY3ljbGVNYW5hZ2VyRmFjdG9yeSBlbG1mID0gKEVuZHBvaW50TGlmZWN5Y2xlTWFuYWdlckZhY3RvcnkpRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoRW5kcG9pbnRMaWZlY3ljbGVNYW5hZ2VyRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGVsbWYpOwotICAgICAgICAgICAgRW5kcG9pbnRMaWZlY3ljbGVNYW5hZ2VyIGVsbSA9IGVsbWYuY3JlYXRlRW5kcG9pbnRMaWZlY3ljbGVNYW5hZ2VyKGVuZHBvaW50SW5zdGFuY2UpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChlbG0pOwotICAgICAgICAgICAgZWxtLmludm9rZVByZURlc3Ryb3koKTsKLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKLSAgICAgICAgfWNhdGNoKEV4Y2VwdGlvbiBlKXsKLSAgICAgICAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEJhZFBvc3RDb25zdHJ1Y3QoKXsKLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOwotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiVGVzdCA6ICIgKyBnZXROYW1lKCkpOwotICAgICAgICB0cnl7Ci0gICAgICAgICAgICBFbmRwb2ludExpZmVjeWNsZU1hbmFnZXJGYWN0b3J5IGVsbWYgPSAoRW5kcG9pbnRMaWZlY3ljbGVNYW5hZ2VyRmFjdG9yeSlGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShFbmRwb2ludExpZmVjeWNsZU1hbmFnZXJGYWN0b3J5LmNsYXNzKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoZWxtZik7Ci0gICAgICAgICAgICBFbmRwb2ludExpZmVjeWNsZU1hbmFnZXIgZWxtID0gZWxtZi5jcmVhdGVFbmRwb2ludExpZmVjeWNsZU1hbmFnZXIoYmFkT2JqZWN0KTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoZWxtZik7Ci0gICAgICAgICAgICBlbG0uaW52b2tlUG9zdENvbnN0cnVjdCgpOwotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOwotICAgICAgICB9Y2F0Y2goRXhjZXB0aW9uIGUpewotICAgICAgICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QmFkUHJlRGVzdHJveSgpewotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7Ci0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJUZXN0IDogIiArIGdldE5hbWUoKSk7Ci0gICAgICAgIHRyeXsKLSAgICAgICAgICAgIEVuZHBvaW50TGlmZWN5Y2xlTWFuYWdlckZhY3RvcnkgZWxtZiA9IChFbmRwb2ludExpZmVjeWNsZU1hbmFnZXJGYWN0b3J5KUZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KEVuZHBvaW50TGlmZWN5Y2xlTWFuYWdlckZhY3RvcnkuY2xhc3MpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChlbG1mKTsKLSAgICAgICAgICAgIEVuZHBvaW50TGlmZWN5Y2xlTWFuYWdlciBlbG0gPSBlbG1mLmNyZWF0ZUVuZHBvaW50TGlmZWN5Y2xlTWFuYWdlcihiYWRPYmplY3QpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChlbG0pOwotICAgICAgICAgICAgZWxtLmludm9rZVByZURlc3Ryb3koKTsKLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKLSAgICAgICAgfWNhdGNoKEV4Y2VwdGlvbiBlKXsKLSAgICAgICAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvQmxvY2tUZXN0cy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvQmxvY2tUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWRiYjQ0Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL0Jsb2NrVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMTggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2U7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01PdXRwdXRGb3JtYXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmJ1aWxkZXIuU3RBWE9NQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFzb3VyY2UuamF4Yi5KQVhCRFNDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YXNvdXJjZS5qYXhiLkpBWEJEYXRhU291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5kYXRhYmluZGluZy5KQVhCQmxvY2tDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5kYXRhYmluZGluZy5KQVhCVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmZhY3RvcnkuQmxvY2tGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5mYWN0b3J5LkpBWEJCbG9ja0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmZhY3RvcnkuTWVzc2FnZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmZhY3RvcnkuT01CbG9ja0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmZhY3RvcnkuU291cmNlQmxvY2tGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5mYWN0b3J5LlhNTFN0cmluZ0Jsb2NrRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UudXRpbC5SZWFkZXIyV3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MucmVnaXN0cnkuRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MudW5pdFRlc3QuVGVzdExvZ2dlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotaW1wb3J0IHRlc3QuRWNob1N0cmluZzsKLWltcG9ydCB0ZXN0Lk9iamVjdEZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCQ29udGV4dDsKLWltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCSW50cm9zcGVjdG9yOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLk1hcnNoYWxsZXI7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuVW5tYXJzaGFsbGVyOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLnV0aWwuSkFYQlNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MSW5wdXRGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MT3V0cHV0RmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLmRvbS5ET01Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zYXguU0FYU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVNvdXJjZTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotCi0vKioKLSAqIEJsb2NrVGVzdHMKLSAqIFRlc3RzIHRvIGNyZWF0ZSBhbmQgdmFsaWRhdGUgYmxvY2tzLgotICogVGhlc2UgYXJlIG5vdCBjbGllbnQvc2VydmVyIHRlc3RzLgotICovCi1wdWJsaWMgY2xhc3MgQmxvY2tUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIC8vIFN0cmluZyB0ZXN0IHZhcmlhYmxlcwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBzYW1wbGVUZXh0ID0KLSAgICAgICAgIjxwcmU6YSB4bWxuczpwcmU9XCJ1cm46Ly9zYW1wbGVcIj4iICsKLSAgICAgICAgIjxiPkhlbGxvPC9iPiIgKwotICAgICAgICAiPGM+V29ybGQ8L2M+IiArCi0gICAgICAgICI8L3ByZTphPiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUU5hbWUgc2FtcGxlUU5hbWUgPSBuZXcgUU5hbWUoInVybjovL3NhbXBsZSIsICJhIik7Ci0KLQotICAgIHByaXZhdGUgc3RhdGljIFhNTElucHV0RmFjdG9yeSBpbnB1dEZhY3RvcnkgPSBYTUxJbnB1dEZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICBwcml2YXRlIHN0YXRpYyBYTUxPdXRwdXRGYWN0b3J5IG91dHB1dEZhY3RvcnkgPSBYTUxPdXRwdXRGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0KLQotCi0gICAgcHVibGljIEJsb2NrVGVzdHMoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIEJsb2NrVGVzdHMoU3RyaW5nIGFyZzApIHsKLSAgICAgICAgc3VwZXIoYXJnMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgQmxvY2sgcmVwcmVzZW50aW5nIGFuIFhNTFN0cmluZyBhbmQgc2ltdWxhdGUgYSAKLSAgICAgKiBub3JtYWwgRGlzcGF0Y2g8U3RyaW5nPiBmbG93Ci0gICAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nT3V0ZmxvdygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBHZXQgdGhlIEJsb2NrRmFjdG9yeQotICAgICAgICBYTUxTdHJpbmdCbG9ja0ZhY3RvcnkgZiA9IChYTUxTdHJpbmdCbG9ja0ZhY3RvcnkpCi0gICAgICAgIEZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KFhNTFN0cmluZ0Jsb2NrRmFjdG9yeS5jbGFzcyk7Ci0KLSAgICAgICAgLy8gQ3JlYXRlIGEgQmxvY2sgdXNpbmcgdGhlIHNhbXBsZSBzdHJpbmcgYXMgdGhlIGNvbnRlbnQuICBUaGlzIHNpbXVsYXRlcwotICAgICAgICAvLyB3aGF0IG9jY3VycyBvbiB0aGUgb3V0Ym91bmQgSkFYLVdTIGRpc3BhdGNoPFN0cmluZz4gY2xpZW50Ci0gICAgICAgIEJsb2NrIGJsb2NrID0gZi5jcmVhdGVGcm9tKHNhbXBsZVRleHQsIG51bGwsIG51bGwpOwotCi0gICAgICAgIC8vIFdlIGRpZG4ndCBwYXNzIGluIGEgcW5hbWUsIHNvIHRoZSBmb2xsb3dpbmcgc2hvdWxkIHJldHVybiBmYWxzZQotICAgICAgICBhc3NlcnRUcnVlKCFibG9jay5pc1FOYW1lQXZhaWxhYmxlKCkpOwotCi0gICAgICAgIC8vIEFzc3VtaW5nIG5vIGhhbmRsZXJzIGFyZSBpbnN0YWxsZWQsIHRoZSBuZXh0IHRoaW5nIHRoYXQgd2lsbCBoYXBwZW4KLSAgICAgICAgLy8gaXMgYSBYTUxTdHJlYW1SZWFkZXIgd2lsbCBiZSByZXF1ZXN0ZWQuLi50byBnbyB0byBPTS4gICBBdCB0aGlzIHBvaW50IHRoZQotICAgICAgICAvLyBibG9jayBzaG91bGQgYmUgY29uc3VtZWQuCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlciByZWFkZXIgPSBibG9jay5nZXRYTUxTdHJlYW1SZWFkZXIodHJ1ZSk7Ci0KLSAgICAgICAgLy8gVGhlIGJsb2NrIHNob3VsZCBiZSBjb25zdW1lZAotICAgICAgICBhc3NlcnRUcnVlKGJsb2NrLmlzQ29uc3VtZWQoKSk7Ci0KLSAgICAgICAgLy8gVG8gY2hlY2sgdGhhdCB0aGUgb3V0cHV0IGlzIGNvcnJlY3QsIGdldCB0aGUgU3RyaW5nIGNvbnRlbnRzIG9mIHRoZSAKLSAgICAgICAgLy8gcmVhZGVyCi0gICAgICAgIFJlYWRlcjJXcml0ZXIgcjJ3ID0gbmV3IFJlYWRlcjJXcml0ZXIocmVhZGVyKTsKLSAgICAgICAgU3RyaW5nIG5ld1RleHQgPSByMncuZ2V0QXNTdHJpbmcoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShzYW1wbGVUZXh0LmVxdWFscyhuZXdUZXh0KSk7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBCbG9jayByZXByZXNlbnRpbmcgYW4gWE1MU3RyaW5nIGFuZAotICAgICAqIHNpbXVsYXRlIGEgZGlmZmVyZW50IERpc3BhdGNoPFN0cmluZz4gZmxvdwotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFN0cmluZ091dGZsb3cyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIEdldCB0aGUgQmxvY2tGYWN0b3J5Ci0gICAgICAgIFhNTFN0cmluZ0Jsb2NrRmFjdG9yeSBmID0gKFhNTFN0cmluZ0Jsb2NrRmFjdG9yeSkKLSAgICAgICAgRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoWE1MU3RyaW5nQmxvY2tGYWN0b3J5LmNsYXNzKTsKLQotICAgICAgICAvLyBDcmVhdGUgYSBCbG9jayB1c2luZyB0aGUgc2FtcGxlIHN0cmluZyBhcyB0aGUgY29udGVudC4gIFRoaXMgc2ltdWxhdGVzCi0gICAgICAgIC8vIHdoYXQgb2NjdXJzIG9uIHRoZSBvdXRib3VuZCBKQVgtV1MgZGlzcGF0Y2g8U3RyaW5nPiBjbGllbnQKLSAgICAgICAgQmxvY2sgYmxvY2sgPSBmLmNyZWF0ZUZyb20oc2FtcGxlVGV4dCwgbnVsbCwgbnVsbCk7Ci0KLSAgICAgICAgLy8gV2UgZGlkbid0IHBhc3MgaW4gYSBxbmFtZSwgc28gdGhlIGZvbGxvd2luZyBzaG91bGQgcmV0dXJuIGZhbHNlCi0gICAgICAgIGFzc2VydFRydWUoIWJsb2NrLmlzUU5hbWVBdmFpbGFibGUoKSk7Ci0KLSAgICAgICAgLy8gQXNzdW1lIHRoYXQgd2UgbmVlZCB0byBmaW5kIHRoZSBRTmFtZSAocGVyaGFwcyB0byBpZGVudGlmeSB0aGUgb3BlcmF0aW9uIGFuZCAKLSAgICAgICAgLy8gZGV0ZXJtaW5lIGlmIGhhbmRsZXJzIGFyZSBpbnN0YWxsZWQpLiAgIFRoaXMgaXMgbm90IHZlcnkgcGVyZm9tYW50IHNpbmNlIAotICAgICAgICAvLyBpdCBjYXVzZXMgYW4gdW5kZXJseWluZyBwYXJzZSBvZiB0aGUgU3RyaW5nLi4uYnV0IHdlIG5lZWQgdG8gc3VwcG9ydCB0aGlzLgotICAgICAgICBRTmFtZSBxTmFtZSA9IGJsb2NrLmdldFFOYW1lKCk7Ci0gICAgICAgIGFzc2VydFRydWUoIkV4cGVjdGVkOiAiICsgc2FtcGxlUU5hbWUgKyAiIGJ1dCBmb3VuZDogIiArIHFOYW1lLCBzYW1wbGVRTmFtZS5lcXVhbHMocU5hbWUpKTsKLQotICAgICAgICAvLyBBc3N1bWluZyBubyBoYW5kbGVycyBhcmUgaW5zdGFsbGVkLCB0aGUgbmV4dCB0aGluZyB0aGF0IHdpbGwgaGFwcGVuCi0gICAgICAgIC8vIGlzIGEgWE1MU3RyZWFtUmVhZGVyIHdpbGwgYmUgcmVxdWVzdGVkLi4udG8gZ28gdG8gT00uICAgQXQgdGhpcyBwb2ludCB0aGUKLSAgICAgICAgLy8gYmxvY2sgc2hvdWxkIGJlIGNvbnN1bWVkLgotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyID0gYmxvY2suZ2V0WE1MU3RyZWFtUmVhZGVyKHRydWUpOwotCi0gICAgICAgIC8vIFRoZSBibG9jayBzaG91bGQgYmUgY29uc3VtZWQKLSAgICAgICAgYXNzZXJ0VHJ1ZShibG9jay5pc0NvbnN1bWVkKCkpOwotCi0gICAgICAgIC8vIFRvIGNoZWNrIHRoYXQgdGhlIG91dHB1dCBpcyBjb3JyZWN0LCBnZXQgdGhlIFN0cmluZyBjb250ZW50cyBvZiB0aGUgCi0gICAgICAgIC8vIHJlYWRlcgotICAgICAgICBSZWFkZXIyV3JpdGVyIHIydyA9IG5ldyBSZWFkZXIyV3JpdGVyKHJlYWRlcik7Ci0gICAgICAgIFN0cmluZyBuZXdUZXh0ID0gcjJ3LmdldEFzU3RyaW5nKCk7Ci0gICAgICAgIGFzc2VydFRydWUoc2FtcGxlVGV4dC5lcXVhbHMobmV3VGV4dCkpOwotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgQmxvY2sgcmVwcmVzZW50aW5nIGFuIFhNTFN0cmluZyBhbmQKLSAgICAgKiBzaW11bGF0ZSBhIGRpZmZlcmVudCBTdHJpbmcgcGFyYW1ldGVyIGZsb3cKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpbmdPdXRmbG93MygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBHZXQgdGhlIEJsb2NrRmFjdG9yeQotICAgICAgICBYTUxTdHJpbmdCbG9ja0ZhY3RvcnkgZiA9IChYTUxTdHJpbmdCbG9ja0ZhY3RvcnkpCi0gICAgICAgIEZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KFhNTFN0cmluZ0Jsb2NrRmFjdG9yeS5jbGFzcyk7Ci0KLSAgICAgICAgLy8gQ3JlYXRlIGEgQmxvY2sgdXNpbmcgdGhlIHNhbXBsZSBzdHJpbmcgYXMgdGhlIGNvbnRlbnQuICBUaGlzIHNpbXVsYXRlcwotICAgICAgICAvLyB3aGF0IG9jY3VycyBvbiB0aGUgb3V0Ym91bmQgSkFYLVdTIFN0cmluZyBwYXJhbWV0ZXIgb24gdGhlIGNsaWVudC4KLSAgICAgICAgLy8gSW4gdGhpcyBjYXNlLCB3ZSBrbm93IHRoZSBRTmFtZSBwcmlvciB0byBjcmVhdGluZyB0aGUgQmxvY2suLi5zbyBsZXQncyBwYXNzIGl0IGluLgotICAgICAgICBCbG9jayBibG9jayA9IGYuY3JlYXRlRnJvbShzYW1wbGVUZXh0LCBudWxsLCBzYW1wbGVRTmFtZSk7Ci0KLSAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBRTmFtZSBpcyBjb3JyZWN0LgotICAgICAgICBRTmFtZSBxTmFtZSA9IGJsb2NrLmdldFFOYW1lKCk7Ci0gICAgICAgIGFzc2VydFRydWUoc2FtcGxlUU5hbWUuZXF1YWxzKHFOYW1lKSk7Ci0KLSAgICAgICAgLy8gQXNzdW1pbmcgbm8gaGFuZGxlcnMgYXJlIGluc3RhbGxlZCwgdGhlIG5leHQgdGhpbmcgdGhhdCB3aWxsIGhhcHBlbgotICAgICAgICAvLyBpcyBhIFhNTFN0cmVhbVJlYWRlciB3aWxsIGJlIHJlcXVlc3RlZC4uLnRvIGdvIHRvIE9NLiAgIEF0IHRoaXMgcG9pbnQgdGhlCi0gICAgICAgIC8vIGJsb2NrIHNob3VsZCBiZSBjb25zdW1lZC4KLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHJlYWRlciA9IGJsb2NrLmdldFhNTFN0cmVhbVJlYWRlcih0cnVlKTsKLQotICAgICAgICAvLyBUaGUgYmxvY2sgc2hvdWxkIGJlIGNvbnN1bWVkCi0gICAgICAgIGFzc2VydFRydWUoYmxvY2suaXNDb25zdW1lZCgpKTsKLQotICAgICAgICAvLyBUbyBjaGVjayB0aGF0IHRoZSBvdXRwdXQgaXMgY29ycmVjdCwgZ2V0IHRoZSBTdHJpbmcgY29udGVudHMgb2YgdGhlIAotICAgICAgICAvLyByZWFkZXIKLSAgICAgICAgUmVhZGVyMldyaXRlciByMncgPSBuZXcgUmVhZGVyMldyaXRlcihyZWFkZXIpOwotICAgICAgICBTdHJpbmcgbmV3VGV4dCA9IHIydy5nZXRBc1N0cmluZygpOwotICAgICAgICBhc3NlcnRUcnVlKHNhbXBsZVRleHQuZXF1YWxzKG5ld1RleHQpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBCbG9jayByZXByZXNlbnRpbmcgYW4gWE1MU3RyaW5nIGFuZCBzaW11bGF0ZSBhIAotICAgICAqIG5vcm1hbCBEaXNwYXRjaDxTdHJpbmc+IGlucHV0IGZsb3cKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpbmdJbmZsb3coKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gR2V0IHRoZSBCbG9ja0ZhY3RvcnkKLSAgICAgICAgWE1MU3RyaW5nQmxvY2tGYWN0b3J5IGYgPSAoWE1MU3RyaW5nQmxvY2tGYWN0b3J5KQotICAgICAgICBGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShYTUxTdHJpbmdCbG9ja0ZhY3RvcnkuY2xhc3MpOwotCi0gICAgICAgIC8vIE9uIGluYm91bmQsIHRoZXJlIHdpbGwgYWxyZWFkeSBiZSBhIFhNTFN0cmVhbVJlYWRlciAocHJvYmFibHkgZnJvbSBPTSkKLSAgICAgICAgLy8gd2hpY2ggcmVwcmVzZW50cyB0aGUgbWVzc2FnZS4gIFdlIHdpbGwgc2ltdWxhdGUgdGhpcyB3aXRoIGluZmxvdy4KLSAgICAgICAgU3RyaW5nUmVhZGVyIHNyID0gbmV3IFN0cmluZ1JlYWRlcihzYW1wbGVUZXh0KTsKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIGluZmxvdyA9IGlucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoc3IpOwotCi0gICAgICAgIC8vIENyZWF0ZSBhIEJsb2NrIGZyb20gdGhlIGluZmxvdy4gIAotICAgICAgICBCbG9jayBibG9jayA9IGYuY3JlYXRlRnJvbShpbmZsb3csIG51bGwsIG51bGwpOwotCi0gICAgICAgIC8vIEFzc3VtaW5nIG5vIGhhbmRsZXJzIGFyZSBpbnN0YWxsZWQsIHRoZSBuZXh0IHRoaW5nIHRoYXQgd2lsbCBoYXBwZW4KLSAgICAgICAgLy8gaXMgdGhlIHByb3h5IGNvZGUgd2lsbCBhc2sgZm9yIHRoZSBidXNpbmVzcyBvYmplY3QgKFN0cmluZykuCi0gICAgICAgIE9iamVjdCBibyA9IGJsb2NrLmdldEJ1c2luZXNzT2JqZWN0KHRydWUpOwotICAgICAgICBhc3NlcnRUcnVlKGJvIGluc3RhbmNlb2YgU3RyaW5nKTsKLQotICAgICAgICAvLyBUaGUgYmxvY2sgc2hvdWxkIGJlIGNvbnN1bWVkCi0gICAgICAgIGFzc2VydFRydWUoYmxvY2suaXNDb25zdW1lZCgpKTsKLQotICAgICAgICAvLyBDaGVjayB0aGUgU3RyaW5nIGZvciBhY2N1cmFjeQotICAgICAgICBhc3NlcnRUcnVlKHNhbXBsZVRleHQuZXF1YWxzKGJvLnRvU3RyaW5nKCkpKTsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIEJsb2NrIHJlcHJlc2VudGluZyBhbiBYTUxTdHJpbmcgYW5kIHNpbXVsYXRlIGEgCi0gICAgICogc2xpZ2h0bHkgbW9yZSBjb21wbGljYXRlZCBEaXNwYXRjaDxTdHJpbmc+IGluZmxvdwotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFN0cmluZ0luZmxvdzIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gR2V0IHRoZSBCbG9ja0ZhY3RvcnkKLSAgICAgICAgWE1MU3RyaW5nQmxvY2tGYWN0b3J5IGYgPSAoWE1MU3RyaW5nQmxvY2tGYWN0b3J5KQotICAgICAgICBGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShYTUxTdHJpbmdCbG9ja0ZhY3RvcnkuY2xhc3MpOwotCi0gICAgICAgIC8vIE9uIGluYm91bmQsIHRoZXJlIHdpbGwgYWxyZWFkeSBiZSBhIFhNTFN0cmVhbVJlYWRlciAocHJvYmFibHkgZnJvbSBPTSkKLSAgICAgICAgLy8gd2hpY2ggcmVwcmVzZW50cyB0aGUgbWVzc2FnZS4gIFdlIHdpbGwgc2ltdWxhdGUgdGhpcyB3aXRoIGluZmxvdy4KLSAgICAgICAgU3RyaW5nUmVhZGVyIHNyID0gbmV3IFN0cmluZ1JlYWRlcihzYW1wbGVUZXh0KTsKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIGluZmxvdyA9IGlucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoc3IpOwotCi0gICAgICAgIC8vIENyZWF0ZSBhIEJsb2NrIGZyb20gdGhlIGluZmxvdy4gIAotICAgICAgICBCbG9jayBibG9jayA9IGYuY3JlYXRlRnJvbShpbmZsb3csIG51bGwsIG51bGwpOwotCi0gICAgICAgIC8vIExldCdzIGFzc3VtZSB3ZSBuZWVkIHRvIGdldCB0aGUgUU5hbWUgdG8gZmluZCB0aGUgb3BlcmF0aW9uIG5hbWUuCi0gICAgICAgIC8vIFRoaXMgd2lsbCBjYXVzZSBhbiB1bmRlcmx5aW5nIHBhcnNlCi0gICAgICAgIFFOYW1lIHFOYW1lID0gYmxvY2suZ2V0UU5hbWUoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShzYW1wbGVRTmFtZS5lcXVhbHMocU5hbWUpKTsKLQotICAgICAgICAvLyBBc3N1bWluZyBubyBoYW5kbGVycyBhcmUgaW5zdGFsbGVkLCB0aGUgbmV4dCB0aGluZyB0aGF0IHdpbGwgaGFwcGVuCi0gICAgICAgIC8vIGlzIHRoZSBwcm94eSBjb2RlIHdpbGwgYXNrIGZvciB0aGUgYnVzaW5lc3Mgb2JqZWN0IChTdHJpbmcpLgotICAgICAgICBPYmplY3QgYm8gPSBibG9jay5nZXRCdXNpbmVzc09iamVjdCh0cnVlKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShibyBpbnN0YW5jZW9mIFN0cmluZyk7Ci0KLSAgICAgICAgLy8gVGhlIGJsb2NrIHNob3VsZCBiZSBjb25zdW1lZAotICAgICAgICBhc3NlcnRUcnVlKGJsb2NrLmlzQ29uc3VtZWQoKSk7Ci0KLSAgICAgICAgLy8gQ2hlY2sgdGhlIFN0cmluZyBmb3IgYWNjdXJhY3kKLSAgICAgICAgYXNzZXJ0VHJ1ZShzYW1wbGVUZXh0LmVxdWFscyhiby50b1N0cmluZygpKSk7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBCbG9jayByZXByZXNlbnRpbmcgYW4gWE1MU3RyaW5nIGFuZCBzaW11bGF0ZSBhIAotICAgICAqIHNsaWdodGx5IG1vcmUgY29tcGxpY2F0ZWQgU3RyaW5nICBpbmZsb3cKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpbmdJbmZsb3czKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIEdldCB0aGUgQmxvY2tGYWN0b3J5Ci0gICAgICAgIFhNTFN0cmluZ0Jsb2NrRmFjdG9yeSBmID0gKFhNTFN0cmluZ0Jsb2NrRmFjdG9yeSkKLSAgICAgICAgRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoWE1MU3RyaW5nQmxvY2tGYWN0b3J5LmNsYXNzKTsKLQotICAgICAgICAvLyBPbiBpbmJvdW5kLCB0aGVyZSB3aWxsIGFscmVhZHkgYmUgYSBYTUxTdHJlYW1SZWFkZXIgKHByb2JhYmx5IGZyb20gT00pCi0gICAgICAgIC8vIHdoaWNoIHJlcHJlc2VudHMgdGhlIG1lc3NhZ2UuICBXZSB3aWxsIHNpbXVsYXRlIHRoaXMgd2l0aCBpbmZsb3cuCi0gICAgICAgIFN0cmluZ1JlYWRlciBzciA9IG5ldyBTdHJpbmdSZWFkZXIoc2FtcGxlVGV4dCk7Ci0gICAgICAgIFhNTFN0cmVhbVJlYWRlciBpbmZsb3cgPSBpbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKHNyKTsKLQotICAgICAgICAvLyBDcmVhdGUgYSBCbG9jayBmcm9tIHRoZSBpbmZsb3cuICBBc3N1bWUgdGhhdCB3ZSBrbm93IHRoZSBRTmFtZSBhbHJlYWR5Ci0gICAgICAgIEJsb2NrIGJsb2NrID0gZi5jcmVhdGVGcm9tKGluZmxvdywgbnVsbCwgc2FtcGxlUU5hbWUpOwotCi0gICAgICAgIC8vIExldCdzIGFzc3VtZSB3ZSBuZWVkIHRvIGdldCB0aGUgUU5hbWUgdG8gZmluZCB0aGUgb3BlcmF0aW9uIG5hbWUuCi0gICAgICAgIFFOYW1lIHFOYW1lID0gYmxvY2suZ2V0UU5hbWUoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShzYW1wbGVRTmFtZS5lcXVhbHMocU5hbWUpKTsKLQotICAgICAgICAvLyBBc3N1bWluZyBubyBoYW5kbGVycyBhcmUgaW5zdGFsbGVkLCB0aGUgbmV4dCB0aGluZyB0aGF0IHdpbGwgaGFwcGVuCi0gICAgICAgIC8vIGlzIHRoZSBwcm94eSBjb2RlIHdpbGwgYXNrIGZvciB0aGUgYnVzaW5lc3Mgb2JqZWN0IChTdHJpbmcpLgotICAgICAgICBPYmplY3QgYm8gPSBibG9jay5nZXRCdXNpbmVzc09iamVjdCh0cnVlKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShibyBpbnN0YW5jZW9mIFN0cmluZyk7Ci0KLSAgICAgICAgLy8gVGhlIGJsb2NrIHNob3VsZCBiZSBjb25zdW1lZAotICAgICAgICBhc3NlcnRUcnVlKGJsb2NrLmlzQ29uc3VtZWQoKSk7Ci0KLSAgICAgICAgLy8gQ2hlY2sgdGhlIFN0cmluZyBmb3IgYWNjdXJhY3kKLSAgICAgICAgYXNzZXJ0VHJ1ZShzYW1wbGVUZXh0LmVxdWFscyhiby50b1N0cmluZygpKSk7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBCbG9jayByZXByZXNlbnRpbmcgYW4gSkFYQiBhbmQgc2ltdWxhdGUgYSAKLSAgICAgKiBub3JtYWwgRGlzcGF0Y2g8SkFYQj4gZmxvdwotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEpBWEJPdXRmbG93KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIEdldCB0aGUgQmxvY2tGYWN0b3J5Ci0gICAgICAgIEpBWEJCbG9ja0ZhY3RvcnkgZiA9IChKQVhCQmxvY2tGYWN0b3J5KQotICAgICAgICBGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShKQVhCQmxvY2tGYWN0b3J5LmNsYXNzKTsKLQotICAgICAgICAvLyBDcmVhdGUgYSBqYXhiIG9iamVjdAotICAgICAgICBPYmplY3RGYWN0b3J5IGZhY3RvcnkgPSBuZXcgT2JqZWN0RmFjdG9yeSgpOwotICAgICAgICBFY2hvU3RyaW5nIGpheGIgPSBmYWN0b3J5LmNyZWF0ZUVjaG9TdHJpbmcoKTsgCi0gICAgICAgIGpheGIuc2V0SW5wdXQoIkhlbGxvIFdvcmxkIik7Ci0gICAgICAgIEpBWEJCbG9ja0NvbnRleHQgY29udGV4dCA9IG5ldyBKQVhCQmxvY2tDb250ZXh0KEVjaG9TdHJpbmcuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgSkFYQkludHJvc3BlY3RvciBqYmkgPSBKQVhCVXRpbHMuZ2V0SkFYQkludHJvc3BlY3Rvcihjb250ZXh0LmdldEpBWEJDb250ZXh0KCkpOwotICAgICAgICBRTmFtZSBleHBlY3RlZFFOYW1lID0gamJpLmdldEVsZW1lbnROYW1lKGpheGIpOwotCi0gICAgICAgIC8vIENyZWF0ZSBhIEJsb2NrIHVzaW5nIHRoZSBzYW1wbGUgc3RyaW5nIGFzIHRoZSBjb250ZW50LiAgVGhpcyBzaW11bGF0ZXMKLSAgICAgICAgLy8gd2hhdCBvY2N1cnMgb24gdGhlIG91dGJvdW5kIEpBWC1XUyBkaXNwYXRjaDxKQVhCPiBjbGllbnQKLSAgICAgICAgQmxvY2sgYmxvY2sgPSBmLmNyZWF0ZUZyb20oamF4YiwgY29udGV4dCwgbnVsbCk7Ci0KLSAgICAgICAgLy8gSkFYQiBvYmplY3RzIHNldCB0aGUgcW5hbWUgZnJvbSB0aGVpciBpbnRlcm5hbCBkYXRhCi0gICAgICAgIGFzc2VydFRydWUoYmxvY2suaXNRTmFtZUF2YWlsYWJsZSgpKTsKLQotICAgICAgICAvLyBBc3N1bWUgdGhhdCB3ZSBuZWVkIHRvIGZpbmQgdGhlIFFOYW1lIChwZXJoYXBzIHRvIGlkZW50aWZ5IHRoZSBvcGVyYXRpb24gYW5kIAotICAgICAgICAvLyBkZXRlcm1pbmUgaWYgaGFuZGxlcnMgYXJlIGluc3RhbGxlZCkuICAgVGhpcyBpcyBub3QgdmVyeSBwZXJmb21hbnQgc2luY2UgCi0gICAgICAgIC8vIGl0IGNhdXNlcyBhbiB1bmRlcmx5aW5nIHBhcnNlIG9mIHRoZSBTdHJpbmcuLi5idXQgd2UgbmVlZCB0byBzdXBwb3J0IHRoaXMuCi0gICAgICAgIFFOYW1lIHFOYW1lID0gYmxvY2suZ2V0UU5hbWUoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQ6ICIgKyBleHBlY3RlZFFOYW1lICsgIiBidXQgZm91bmQ6ICIgKyBxTmFtZSwgZXhwZWN0ZWRRTmFtZS5lcXVhbHMocU5hbWUpKTsKLQotICAgICAgICAvLyBBc3N1bWluZyBubyBoYW5kbGVycyBhcmUgaW5zdGFsbGVkLCB0aGUgbmV4dCB0aGluZyB0aGF0IHdpbGwgaGFwcGVuCi0gICAgICAgIC8vIGlzIGEgWE1MU3RyZWFtUmVhZGVyIHdpbGwgYmUgcmVxdWVzdGVkLi4udG8gZ28gdG8gT00uICAgQXQgdGhpcyBwb2ludCB0aGUKLSAgICAgICAgLy8gYmxvY2sgc2hvdWxkIGJlIGNvbnN1bWVkLgotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyID0gYmxvY2suZ2V0WE1MU3RyZWFtUmVhZGVyKHRydWUpOwotCi0gICAgICAgIC8vIFRoZSBibG9jayBzaG91bGQgYmUgY29uc3VtZWQKLSAgICAgICAgYXNzZXJ0VHJ1ZShibG9jay5pc0NvbnN1bWVkKCkpOwotCi0gICAgICAgIC8vIFRvIGNoZWNrIHRoYXQgdGhlIG91dHB1dCBpcyBjb3JyZWN0LCBnZXQgdGhlIFN0cmluZyBjb250ZW50cyBvZiB0aGUgCi0gICAgICAgIC8vIHJlYWRlcgotICAgICAgICBSZWFkZXIyV3JpdGVyIHIydyA9IG5ldyBSZWFkZXIyV3JpdGVyKHJlYWRlcik7Ci0gICAgICAgIFN0cmluZyBuZXdUZXh0ID0gcjJ3LmdldEFzU3RyaW5nKCk7Ci0gICAgICAgIGFzc2VydFRydWUobmV3VGV4dC5jb250YWlucygiSGVsbG8gV29ybGQiKSk7Ci0gICAgICAgIGFzc2VydFRydWUobmV3VGV4dC5jb250YWlucygiZWNob1N0cmluZyIpKTsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIEJsb2NrIHJlcHJlc2VudGluZyBhbiBKQVhCIGFuZCBzaW11bGF0ZSBhIAotICAgICAqIHNsaWdodGx5IG1vcmUgY29tcGxpY2F0ZWQgRGlzcGF0Y2g8SkFYQj4gZmxvdwotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEpBWEJPdXRmbG93MigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBHZXQgdGhlIEJsb2NrRmFjdG9yeQotICAgICAgICBKQVhCQmxvY2tGYWN0b3J5IGYgPSAoSkFYQkJsb2NrRmFjdG9yeSkKLSAgICAgICAgRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoSkFYQkJsb2NrRmFjdG9yeS5jbGFzcyk7Ci0KLSAgICAgICAgLy8gQ3JlYXRlIGEgamF4YiBvYmplY3QKLSAgICAgICAgT2JqZWN0RmFjdG9yeSBmYWN0b3J5ID0gbmV3IE9iamVjdEZhY3RvcnkoKTsKLSAgICAgICAgRWNob1N0cmluZyBqYXhiID0gZmFjdG9yeS5jcmVhdGVFY2hvU3RyaW5nKCk7IAotICAgICAgICBqYXhiLnNldElucHV0KCJIZWxsbyBXb3JsZCIpOwotICAgICAgICBKQVhCQmxvY2tDb250ZXh0IGNvbnRleHQgPSBuZXcgSkFYQkJsb2NrQ29udGV4dChFY2hvU3RyaW5nLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOwotCi0gICAgICAgIEpBWEJJbnRyb3NwZWN0b3IgamJpID0gSkFYQlV0aWxzLmdldEpBWEJJbnRyb3NwZWN0b3IoY29udGV4dC5nZXRKQVhCQ29udGV4dCgpKTsKLSAgICAgICAgUU5hbWUgZXhwZWN0ZWRRTmFtZSA9IGpiaS5nZXRFbGVtZW50TmFtZShqYXhiKTsKLQotICAgICAgICAvLyBDcmVhdGUgYSBCbG9jayB1c2luZyB0aGUgc2FtcGxlIHN0cmluZyBhcyB0aGUgY29udGVudC4gIFRoaXMgc2ltdWxhdGVzCi0gICAgICAgIC8vIHdoYXQgb2NjdXJzIHdpdGggYW4gb3V0Ym91bmQgSkFYLVdTIEpBWEIgcGFyYW1ldGVyCi0gICAgICAgIEJsb2NrIGJsb2NrID0gZi5jcmVhdGVGcm9tKGpheGIsIGNvbnRleHQsIGV4cGVjdGVkUU5hbWUpOwotCi0gICAgICAgIC8vIFdlIGRpZCBwYXNzIGluIGEgcW5hbWUsIHNvIHRoZSBmb2xsb3dpbmcgc2hvdWxkIHJldHVybiBmYWxzZQotICAgICAgICBhc3NlcnRUcnVlKGJsb2NrLmlzUU5hbWVBdmFpbGFibGUoKSk7Ci0KLSAgICAgICAgLy8gQXNzdW1lIHRoYXQgd2UgbmVlZCB0byBmaW5kIHRoZSBRTmFtZSAocGVyaGFwcyB0byBpZGVudGlmeSB0aGUgb3BlcmF0aW9uIGFuZCAKLSAgICAgICAgLy8gZGV0ZXJtaW5lIGlmIGhhbmRsZXJzIGFyZSBpbnN0YWxsZWQpLiAgIFRoaXMgaXMgbm90IHZlcnkgcGVyZm9tYW50IHNpbmNlIAotICAgICAgICAvLyBpdCBjYXVzZXMgYW4gdW5kZXJseWluZyBwYXJzZSBvZiB0aGUgU3RyaW5nLi4uYnV0IHdlIG5lZWQgdG8gc3VwcG9ydCB0aGlzLgotICAgICAgICBRTmFtZSBxTmFtZSA9IGJsb2NrLmdldFFOYW1lKCk7Ci0gICAgICAgIGFzc2VydFRydWUoIkV4cGVjdGVkOiAiICsgZXhwZWN0ZWRRTmFtZSArICIgYnV0IGZvdW5kOiAiICsgcU5hbWUsIGV4cGVjdGVkUU5hbWUuZXF1YWxzKHFOYW1lKSk7Ci0KLSAgICAgICAgLy8gQXNzdW1pbmcgbm8gaGFuZGxlcnMgYXJlIGluc3RhbGxlZCwgdGhlIG5leHQgdGhpbmcgdGhhdCB3aWxsIGhhcHBlbgotICAgICAgICAvLyBpcyBhIFhNTFN0cmVhbVJlYWRlciB3aWxsIGJlIHJlcXVlc3RlZC4uLnRvIGdvIHRvIE9NLiAgIEF0IHRoaXMgcG9pbnQgdGhlCi0gICAgICAgIC8vIGJsb2NrIHNob3VsZCBiZSBjb25zdW1lZC4KLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHJlYWRlciA9IGJsb2NrLmdldFhNTFN0cmVhbVJlYWRlcih0cnVlKTsKLQotICAgICAgICAvLyBUaGUgYmxvY2sgc2hvdWxkIGJlIGNvbnN1bWVkCi0gICAgICAgIGFzc2VydFRydWUoYmxvY2suaXNDb25zdW1lZCgpKTsKLQotICAgICAgICAvLyBUbyBjaGVjayB0aGF0IHRoZSBvdXRwdXQgaXMgY29ycmVjdCwgZ2V0IHRoZSBTdHJpbmcgY29udGVudHMgb2YgdGhlIAotICAgICAgICAvLyByZWFkZXIKLSAgICAgICAgUmVhZGVyMldyaXRlciByMncgPSBuZXcgUmVhZGVyMldyaXRlcihyZWFkZXIpOwotICAgICAgICBTdHJpbmcgbmV3VGV4dCA9IHIydy5nZXRBc1N0cmluZygpOwotICAgICAgICBhc3NlcnRUcnVlKG5ld1RleHQuY29udGFpbnMoIkhlbGxvIFdvcmxkIikpOwotICAgICAgICBhc3NlcnRUcnVlKG5ld1RleHQuY29udGFpbnMoImVjaG9TdHJpbmciKSk7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBCbG9jayByZXByZXNlbnRpbmcgYW4gSkFYQiBhbmQgc2ltdWxhdGUgYSAKLSAgICAgKiBub3JtYWwgRGlzcGF0Y2g8SkFYQj4gaW5wdXQgZmxvdwotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEpBWEJJbmZsb3coKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gR2V0IHRoZSBCbG9ja0ZhY3RvcnkKLSAgICAgICAgSkFYQkJsb2NrRmFjdG9yeSBmID0gKEpBWEJCbG9ja0ZhY3RvcnkpCi0gICAgICAgIEZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KEpBWEJCbG9ja0ZhY3RvcnkuY2xhc3MpOwotCi0gICAgICAgIC8vIENyZWF0ZSBhIGpheGIgb2JqZWN0Ci0gICAgICAgIE9iamVjdEZhY3RvcnkgZmFjdG9yeSA9IG5ldyBPYmplY3RGYWN0b3J5KCk7Ci0gICAgICAgIEVjaG9TdHJpbmcgamF4YiA9IGZhY3RvcnkuY3JlYXRlRWNob1N0cmluZygpOyAKLSAgICAgICAgamF4Yi5zZXRJbnB1dCgiSGVsbG8gV29ybGQiKTsKLSAgICAgICAgSkFYQkJsb2NrQ29udGV4dCBjb250ZXh0ID0gbmV3IEpBWEJCbG9ja0NvbnRleHQoRWNob1N0cmluZy5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsKLQotICAgICAgICAvLyBPbiBpbmJvdW5kLCB0aGVyZSB3aWxsIGFscmVhZHkgYmUgYSBYTUxTdHJlYW1SZWFkZXIgKHByb2JhYmx5IGZyb20gT00pCi0gICAgICAgIC8vIHdoaWNoIHJlcHJlc2VudHMgdGhlIG1lc3NhZ2UuICBXZSB3aWxsIHNpbXVsYXRlIHRoaXMgd2l0aCBpbmZsb3cuCi0gICAgICAgIFN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICAgICAgWE1MU3RyZWFtV3JpdGVyIHdyaXRlciA9IG91dHB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtV3JpdGVyKHN3KTsKLSAgICAgICAgTWFyc2hhbGxlciBtYXJzaGFsbGVyID0gSkFYQlV0aWxzLmdldEpBWEJNYXJzaGFsbGVyKGNvbnRleHQuZ2V0SkFYQkNvbnRleHQoKSk7Ci0gICAgICAgIG1hcnNoYWxsZXIubWFyc2hhbChqYXhiLCB3cml0ZXIpOwotICAgICAgICBKQVhCVXRpbHMucmVsZWFzZUpBWEJNYXJzaGFsbGVyKGNvbnRleHQuZ2V0SkFYQkNvbnRleHQoKSwgbWFyc2hhbGxlcik7Ci0gICAgICAgIHdyaXRlci5mbHVzaCgpOwotICAgICAgICBzdy5mbHVzaCgpOwotICAgICAgICBTdHJpbmdSZWFkZXIgc3IgPSBuZXcgU3RyaW5nUmVhZGVyKHN3LnRvU3RyaW5nKCkpOwotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgaW5mbG93ID0gaW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihzcik7Ci0KLSAgICAgICAgLy8gQ3JlYXRlIGEgQmxvY2sgZnJvbSB0aGUgaW5mbG93LiAgCi0gICAgICAgIEJsb2NrIGJsb2NrID0gZi5jcmVhdGVGcm9tKGluZmxvdywgY29udGV4dCwgbnVsbCk7Ci0KLSAgICAgICAgLy8gQXNzdW1pbmcgbm8gaGFuZGxlcnMgYXJlIGluc3RhbGxlZCwgdGhlIG5leHQgdGhpbmcgdGhhdCB3aWxsIGhhcHBlbgotICAgICAgICAvLyBpcyB0aGUgcHJveHkgY29kZSB3aWxsIGFzayBmb3IgdGhlIGJ1c2luZXNzIG9iamVjdC4KLSAgICAgICAgT2JqZWN0IGJvID0gYmxvY2suZ2V0QnVzaW5lc3NPYmplY3QodHJ1ZSk7Ci0gICAgICAgIGFzc2VydFRydWUoYm8gaW5zdGFuY2VvZiBFY2hvU3RyaW5nKTsKLQotICAgICAgICAvLyBUaGUgYmxvY2sgc2hvdWxkIGJlIGNvbnN1bWVkCi0gICAgICAgIGFzc2VydFRydWUoYmxvY2suaXNDb25zdW1lZCgpKTsKLQotICAgICAgICAvLyBDaGVjayBmb3IgYWNjdXJhY3kKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiVW5leHBlY3RlZDoiICsgKChFY2hvU3RyaW5nKWJvKS5nZXRJbnB1dCgpLCAoKEVjaG9TdHJpbmcpYm8pLmdldElucHV0KCkuZXF1YWxzKGpheGIuZ2V0SW5wdXQoKSkpOwotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgQmxvY2sgcmVwcmVzZW50aW5nIGFuIEpBWEIgYW5kIHNpbXVsYXRlIGEgCi0gICAgICogbm9ybWFsIERpc3BhdGNoPEpBWEI+IGlucHV0IGZsb3cKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RKQVhCSW5mbG93MigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBHZXQgdGhlIEJsb2NrRmFjdG9yeQotICAgICAgICBKQVhCQmxvY2tGYWN0b3J5IGYgPSAoSkFYQkJsb2NrRmFjdG9yeSkKLSAgICAgICAgRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoSkFYQkJsb2NrRmFjdG9yeS5jbGFzcyk7Ci0KLSAgICAgICAgLy8gQ3JlYXRlIGEgamF4YiBvYmplY3QKLSAgICAgICAgT2JqZWN0RmFjdG9yeSBmYWN0b3J5ID0gbmV3IE9iamVjdEZhY3RvcnkoKTsKLSAgICAgICAgRWNob1N0cmluZyBqYXhiID0gZmFjdG9yeS5jcmVhdGVFY2hvU3RyaW5nKCk7IAotICAgICAgICBqYXhiLnNldElucHV0KCJIZWxsbyBXb3JsZCIpOwotICAgICAgICBKQVhCQmxvY2tDb250ZXh0IGNvbnRleHQgPSBuZXcgSkFYQkJsb2NrQ29udGV4dChFY2hvU3RyaW5nLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOwotCi0gICAgICAgIEpBWEJJbnRyb3NwZWN0b3IgamJpID0gSkFYQlV0aWxzLmdldEpBWEJJbnRyb3NwZWN0b3IoY29udGV4dC5nZXRKQVhCQ29udGV4dCgpKTsKLSAgICAgICAgUU5hbWUgZXhwZWN0ZWRRTmFtZSA9IGpiaS5nZXRFbGVtZW50TmFtZShqYXhiKTsKLQotICAgICAgICAvLyBPbiBpbmJvdW5kLCB0aGVyZSB3aWxsIGFscmVhZHkgYmUgYSBYTUxTdHJlYW1SZWFkZXIgKHByb2JhYmx5IGZyb20gT00pCi0gICAgICAgIC8vIHdoaWNoIHJlcHJlc2VudHMgdGhlIG1lc3NhZ2UuICBXZSB3aWxsIHNpbXVsYXRlIHRoaXMgd2l0aCBpbmZsb3cuCi0gICAgICAgIFN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICAgICAgWE1MU3RyZWFtV3JpdGVyIHdyaXRlciA9IG91dHB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtV3JpdGVyKHN3KTsKLSAgICAgICAgTWFyc2hhbGxlciBtYXJzaGFsbGVyID0gSkFYQlV0aWxzLmdldEpBWEJNYXJzaGFsbGVyKGNvbnRleHQuZ2V0SkFYQkNvbnRleHQoKSk7Ci0gICAgICAgIG1hcnNoYWxsZXIubWFyc2hhbChqYXhiLCB3cml0ZXIpOwotICAgICAgICBKQVhCVXRpbHMucmVsZWFzZUpBWEJNYXJzaGFsbGVyKGNvbnRleHQuZ2V0SkFYQkNvbnRleHQoKSwgbWFyc2hhbGxlcik7Ci0gICAgICAgIHdyaXRlci5mbHVzaCgpOwotICAgICAgICBzdy5mbHVzaCgpOwotICAgICAgICBTdHJpbmdSZWFkZXIgc3IgPSBuZXcgU3RyaW5nUmVhZGVyKHN3LnRvU3RyaW5nKCkpOwotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgaW5mbG93ID0gaW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihzcik7Ci0KLSAgICAgICAgLy8gQ3JlYXRlIGEgQmxvY2sgZnJvbSB0aGUgaW5mbG93LiAgCi0gICAgICAgIEJsb2NrIGJsb2NrID0gZi5jcmVhdGVGcm9tKGluZmxvdywgY29udGV4dCwgbnVsbCk7Ci0KLSAgICAgICAgLy8gQXNzdW1lIHRoYXQgd2UgbmVlZCB0byBmaW5kIHRoZSBRTmFtZSAocGVyaGFwcyB0byBpZGVudGlmeSB0aGUgb3BlcmF0aW9uIGFuZCAKLSAgICAgICAgLy8gZGV0ZXJtaW5lIGlmIGhhbmRsZXJzIGFyZSBpbnN0YWxsZWQpLiAgIFRoaXMgaXMgbm90IHZlcnkgcGVyZm9tYW50IHNpbmNlIAotICAgICAgICAvLyBpdCBjYXVzZXMgYW4gdW5kZXJseWluZyBwYXJzZSBvZiB0aGUgU3RyaW5nLi4uYnV0IHdlIG5lZWQgdG8gc3VwcG9ydCB0aGlzLgotICAgICAgICBRTmFtZSBxTmFtZSA9IGJsb2NrLmdldFFOYW1lKCk7Ci0gICAgICAgIGFzc2VydFRydWUoIkV4cGVjdGVkOiAiICsgZXhwZWN0ZWRRTmFtZSArICIgYnV0IGZvdW5kOiAiICsgcU5hbWUsIGV4cGVjdGVkUU5hbWUuZXF1YWxzKHFOYW1lKSk7Ci0KLSAgICAgICAgLy8gQXNzdW1pbmcgbm8gaGFuZGxlcnMgYXJlIGluc3RhbGxlZCwgdGhlIG5leHQgdGhpbmcgdGhhdCB3aWxsIGhhcHBlbgotICAgICAgICAvLyBpcyB0aGUgcHJveHkgY29kZSB3aWxsIGFzayBmb3IgdGhlIGJ1c2luZXNzIG9iamVjdC4KLSAgICAgICAgT2JqZWN0IGJvID0gYmxvY2suZ2V0QnVzaW5lc3NPYmplY3QodHJ1ZSk7Ci0gICAgICAgIGFzc2VydFRydWUoYm8gaW5zdGFuY2VvZiBFY2hvU3RyaW5nKTsKLQotICAgICAgICAvLyBUaGUgYmxvY2sgc2hvdWxkIGJlIGNvbnN1bWVkCi0gICAgICAgIGFzc2VydFRydWUoYmxvY2suaXNDb25zdW1lZCgpKTsKLQotICAgICAgICAvLyBDaGVjayBmb3IgYWNjdXJhY3kKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiVW5leHBlY3RlZDoiICsgKChFY2hvU3RyaW5nKWJvKS5nZXRJbnB1dCgpLCAoKEVjaG9TdHJpbmcpYm8pLmdldElucHV0KCkuZXF1YWxzKGpheGIuZ2V0SW5wdXQoKSkpOwotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgQmxvY2sgcmVwcmVzZW50aW5nIGFuIEpBWEIgYW5kIHNpbXVsYXRlIGEgCi0gICAgICogbm9ybWFsIERpc3BhdGNoPEpBWEI+IGlucHV0IGZsb3cKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RKQVhCSW5mbG93MygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBHZXQgdGhlIEJsb2NrRmFjdG9yeQotICAgICAgICBKQVhCQmxvY2tGYWN0b3J5IGYgPSAoSkFYQkJsb2NrRmFjdG9yeSkKLSAgICAgICAgRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoSkFYQkJsb2NrRmFjdG9yeS5jbGFzcyk7Ci0KLSAgICAgICAgLy8gQ3JlYXRlIGEgamF4YiBvYmplY3QKLSAgICAgICAgT2JqZWN0RmFjdG9yeSBmYWN0b3J5ID0gbmV3IE9iamVjdEZhY3RvcnkoKTsKLSAgICAgICAgRWNob1N0cmluZyBqYXhiID0gZmFjdG9yeS5jcmVhdGVFY2hvU3RyaW5nKCk7IAotICAgICAgICBqYXhiLnNldElucHV0KCJIZWxsbyBXb3JsZCIpOwotICAgICAgICBKQVhCQmxvY2tDb250ZXh0IGNvbnRleHQgPSBuZXcgSkFYQkJsb2NrQ29udGV4dChFY2hvU3RyaW5nLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOwotCi0gICAgICAgIEpBWEJJbnRyb3NwZWN0b3IgamJpID0gSkFYQlV0aWxzLmdldEpBWEJJbnRyb3NwZWN0b3IoY29udGV4dC5nZXRKQVhCQ29udGV4dCgpKTsKLSAgICAgICAgUU5hbWUgZXhwZWN0ZWRRTmFtZSA9IGpiaS5nZXRFbGVtZW50TmFtZShqYXhiKTsKLQotICAgICAgICAvLyBPbiBpbmJvdW5kLCB0aGVyZSB3aWxsIGFscmVhZHkgYmUgYSBYTUxTdHJlYW1SZWFkZXIgKHByb2JhYmx5IGZyb20gT00pCi0gICAgICAgIC8vIHdoaWNoIHJlcHJlc2VudHMgdGhlIG1lc3NhZ2UuICBXZSB3aWxsIHNpbXVsYXRlIHRoaXMgd2l0aCBpbmZsb3cuCi0gICAgICAgIFN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICAgICAgWE1MU3RyZWFtV3JpdGVyIHdyaXRlciA9IG91dHB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtV3JpdGVyKHN3KTsKLSAgICAgICAgTWFyc2hhbGxlciBtYXJzaGFsbGVyID0gSkFYQlV0aWxzLmdldEpBWEJNYXJzaGFsbGVyKGNvbnRleHQuZ2V0SkFYQkNvbnRleHQoKSk7Ci0gICAgICAgIG1hcnNoYWxsZXIubWFyc2hhbChqYXhiLCB3cml0ZXIpOwotICAgICAgICBKQVhCVXRpbHMucmVsZWFzZUpBWEJNYXJzaGFsbGVyKGNvbnRleHQuZ2V0SkFYQkNvbnRleHQoKSwgbWFyc2hhbGxlcik7Ci0gICAgICAgIHdyaXRlci5mbHVzaCgpOwotICAgICAgICBzdy5mbHVzaCgpOwotICAgICAgICBTdHJpbmdSZWFkZXIgc3IgPSBuZXcgU3RyaW5nUmVhZGVyKHN3LnRvU3RyaW5nKCkpOwotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgaW5mbG93ID0gaW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihzcik7Ci0KLSAgICAgICAgLy8gQ3JlYXRlIGEgQmxvY2sgZnJvbSB0aGUgaW5mbG93LiAgCi0gICAgICAgIEJsb2NrIGJsb2NrID0gZi5jcmVhdGVGcm9tKGluZmxvdywgY29udGV4dCwgZXhwZWN0ZWRRTmFtZSk7Ci0KLSAgICAgICAgLy8gV2UgcGFzc2VkIGluIGEgcW5hbWUsIHNvIHRoZSBmb2xsb3dpbmcgc2hvdWxkIHJldHVybiB0cnVlCi0gICAgICAgIGFzc2VydFRydWUoYmxvY2suaXNRTmFtZUF2YWlsYWJsZSgpKTsKLQotICAgICAgICAvLyBBc3N1bWUgdGhhdCB3ZSBuZWVkIHRvIGZpbmQgdGhlIFFOYW1lIChwZXJoYXBzIHRvIGlkZW50aWZ5IHRoZSBvcGVyYXRpb24gYW5kIAotICAgICAgICAvLyBkZXRlcm1pbmUgaWYgaGFuZGxlcnMgYXJlIGluc3RhbGxlZCkuICAgVGhpcyBpcyBub3QgdmVyeSBwZXJmb21hbnQgc2luY2UgCi0gICAgICAgIC8vIGl0IGNhdXNlcyBhbiB1bmRlcmx5aW5nIHBhcnNlIG9mIHRoZSBTdHJpbmcuLi5idXQgd2UgbmVlZCB0byBzdXBwb3J0IHRoaXMuCi0gICAgICAgIFFOYW1lIHFOYW1lID0gYmxvY2suZ2V0UU5hbWUoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQ6ICIgKyBleHBlY3RlZFFOYW1lICsgIiBidXQgZm91bmQ6ICIgKyBxTmFtZSwgZXhwZWN0ZWRRTmFtZS5lcXVhbHMocU5hbWUpKTsKLQotICAgICAgICAvLyBBc3N1bWluZyBubyBoYW5kbGVycyBhcmUgaW5zdGFsbGVkLCB0aGUgbmV4dCB0aGluZyB0aGF0IHdpbGwgaGFwcGVuCi0gICAgICAgIC8vIGlzIHRoZSBwcm94eSBjb2RlIHdpbGwgYXNrIGZvciB0aGUgYnVzaW5lc3Mgb2JqZWN0LgotICAgICAgICBPYmplY3QgYm8gPSBibG9jay5nZXRCdXNpbmVzc09iamVjdCh0cnVlKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShibyBpbnN0YW5jZW9mIEVjaG9TdHJpbmcpOwotICAgICAgICBhc3NlcnRUcnVlKGJvICE9IGpheGIpOwotCi0gICAgICAgIC8vIFRoZSBibG9jayBzaG91bGQgYmUgY29uc3VtZWQKLSAgICAgICAgYXNzZXJ0VHJ1ZShibG9jay5pc0NvbnN1bWVkKCkpOwotCi0gICAgICAgIC8vIENoZWNrIGZvciBhY2N1cmFjeQotICAgICAgICBhc3NlcnRUcnVlKCJVbmV4cGVjdGVkOiIgKyAoKEVjaG9TdHJpbmcpYm8pLmdldElucHV0KCksICgoRWNob1N0cmluZylibykuZ2V0SW5wdXQoKS5lcXVhbHMoamF4Yi5nZXRJbnB1dCgpKSk7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBCbG9jayByZXByZXNlbnRpbmcgYW4gSkFYQiBhbmQgc2ltdWxhdGUgYSAKLSAgICAgKiBub3JtYWwgRGlzcGF0Y2g8SkFYQj4gaW5wdXQgZmxvdwotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEpBWEJJbmZsb3c0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIEdldCB0aGUgQmxvY2tGYWN0b3J5Ci0gICAgICAgIEpBWEJCbG9ja0ZhY3RvcnkgZiA9IChKQVhCQmxvY2tGYWN0b3J5KQotICAgICAgICBGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShKQVhCQmxvY2tGYWN0b3J5LmNsYXNzKTsKLQotICAgICAgICAvLyBDcmVhdGUgYSBqYXhiIG9iamVjdAotICAgICAgICBPYmplY3RGYWN0b3J5IGZhY3RvcnkgPSBuZXcgT2JqZWN0RmFjdG9yeSgpOwotICAgICAgICBFY2hvU3RyaW5nIGpheGIgPSBmYWN0b3J5LmNyZWF0ZUVjaG9TdHJpbmcoKTsgCi0gICAgICAgIGpheGIuc2V0SW5wdXQoIkhlbGxvIFdvcmxkIik7Ci0gICAgICAgIEpBWEJCbG9ja0NvbnRleHQgY29udGV4dCA9IG5ldyBKQVhCQmxvY2tDb250ZXh0KEVjaG9TdHJpbmcuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7Ci0gICAgICAgIEpBWEJDb250ZXh0IGpheGJDb250ZXh0ID0gY29udGV4dC5nZXRKQVhCQ29udGV4dCgpOwotCi0gICAgICAgIEpBWEJJbnRyb3NwZWN0b3IgamJpID0gSkFYQlV0aWxzLmdldEpBWEJJbnRyb3NwZWN0b3IoamF4YkNvbnRleHQpOwotICAgICAgICBRTmFtZSBleHBlY3RlZFFOYW1lID0gamJpLmdldEVsZW1lbnROYW1lKGpheGIpOwotCi0gICAgICAgIC8vIE9uIGluYm91bmQsIHRoZXJlIHdpbGwgYWxyZWFkeSBiZSBhIHByb2JhYmx5IGJlIGFuIE9NCi0gICAgICAgIC8vIHdoaWNoIHJlcHJlc2VudHMgdGhlIG1lc3NhZ2UuICBJbiB0aGlzIHNjZW5hcmlvLCB0aGUgT00gY29udGFpbnMKLSAgICAgICAgLy8gYSBPTVNvdXJjZWRFbGVtZW50IHRoYXQgaXMgYmFja2VkIGJ5IEVjaG9TdHJpbmcuCi0gICAgICAgIE9NRmFjdG9yeSBvbUZhY3RvcnkgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKTsKLSAgICAgICAgSkFYQkRTQ29udGV4dCBkc0NvbnRleHQgPSBuZXcgSkFYQkRTQ29udGV4dChqYXhiQ29udGV4dCk7Ci0gICAgICAgIEpBWEJEYXRhU291cmNlIGRzID0gbmV3IEpBWEJEYXRhU291cmNlKGpheGIsIGRzQ29udGV4dCk7Ci0gICAgICAgIE9NTmFtZXNwYWNlIG5zID0gb21GYWN0b3J5LmNyZWF0ZU9NTmFtZXNwYWNlKGV4cGVjdGVkUU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCksICJwcmUiKTsKLSAgICAgICAgT01FbGVtZW50IG9tID0gb21GYWN0b3J5LmNyZWF0ZU9NRWxlbWVudChkcywgZXhwZWN0ZWRRTmFtZS5nZXRMb2NhbFBhcnQoKSwgbnMpOwotICAgICAgICAKLQotICAgICAgICAvLyBDcmVhdGUgYSBCbG9jayBmcm9tIHRoZSBpbmZsb3cuICAKLSAgICAgICAgQmxvY2sgYmxvY2sgPSBmLmNyZWF0ZUZyb20ob20sIGNvbnRleHQsIGV4cGVjdGVkUU5hbWUpOwotCi0gICAgICAgIC8vIFdlIHBhc3NlZCBpbiBhIHFuYW1lLCBzbyB0aGUgZm9sbG93aW5nIHNob3VsZCByZXR1cm4gdHJ1ZQotICAgICAgICBhc3NlcnRUcnVlKGJsb2NrLmlzUU5hbWVBdmFpbGFibGUoKSk7Ci0KLSAgICAgICAgLy8gQXNzdW1lIHRoYXQgd2UgbmVlZCB0byBmaW5kIHRoZSBRTmFtZSAocGVyaGFwcyB0byBpZGVudGlmeSB0aGUgb3BlcmF0aW9uIGFuZCAKLSAgICAgICAgLy8gZGV0ZXJtaW5lIGlmIGhhbmRsZXJzIGFyZSBpbnN0YWxsZWQpLiAgIAotICAgICAgICBRTmFtZSBxTmFtZSA9IGJsb2NrLmdldFFOYW1lKCk7Ci0gICAgICAgIGFzc2VydFRydWUoIkV4cGVjdGVkOiAiICsgZXhwZWN0ZWRRTmFtZSArICIgYnV0IGZvdW5kOiAiICsgcU5hbWUsIGV4cGVjdGVkUU5hbWUuZXF1YWxzKHFOYW1lKSk7Ci0KLSAgICAgICAgLy8gQXNzdW1pbmcgbm8gaGFuZGxlcnMgYXJlIGluc3RhbGxlZCwgdGhlIG5leHQgdGhpbmcgdGhhdCB3aWxsIGhhcHBlbgotICAgICAgICAvLyBpcyB0aGUgcHJveHkgY29kZSB3aWxsIGFzayBmb3IgdGhlIGJ1c2luZXNzIG9iamVjdC4KLSAgICAgICAgT2JqZWN0IGJvID0gYmxvY2suZ2V0QnVzaW5lc3NPYmplY3QodHJ1ZSk7Ci0gICAgICAgIGFzc2VydFRydWUoYm8gaW5zdGFuY2VvZiBFY2hvU3RyaW5nKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFNpbmNlIHRoZSBFY2hvU3RyaW5nIHdhcyBhbHJlYWR5IHByb3ZpZGVkIGluIGEgZGF0YSBzb3VyY2UsIHRoaXMKLSAgICAgICAgLy8gb2JqZWN0IHNob3VsZCBiZSBzYW1lIGFzIHRoZSBvcmlnaW5hbCBlY2hvU3RyaW5nCi0gICAgICAgIGFzc2VydFRydWUoYm8gPT0gamF4Yik7Ci0KLSAgICAgICAgLy8gVGhlIGJsb2NrIHNob3VsZCBiZSBjb25zdW1lZAotICAgICAgICBhc3NlcnRUcnVlKGJsb2NrLmlzQ29uc3VtZWQoKSk7Ci0KLSAgICAgICAgLy8gQ2hlY2sgZm9yIGFjY3VyYWN5Ci0gICAgICAgIGFzc2VydFRydWUoIlVuZXhwZWN0ZWQ6IiArICgoRWNob1N0cmluZylibykuZ2V0SW5wdXQoKSwgKChFY2hvU3RyaW5nKWJvKS5nZXRJbnB1dCgpLmVxdWFscyhqYXhiLmdldElucHV0KCkpKTsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIEJsb2NrIHJlcHJlc2VudGluZyBhbiBPTSBhbmQgc2ltdWxhdGUgYSAKLSAgICAgKiBub3JtYWwgRGlzcGF0Y2g8T01FbGVtZW50PiBmbG93Ci0gICAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0T01PdXRmbG93KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIEdldCB0aGUgQmxvY2tGYWN0b3J5Ci0gICAgICAgIE9NQmxvY2tGYWN0b3J5IGYgPSAoT01CbG9ja0ZhY3RvcnkpCi0gICAgICAgIEZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KE9NQmxvY2tGYWN0b3J5LmNsYXNzKTsKLQotICAgICAgICAvLyBDcmVhdGUgYSBCbG9jayB1c2luZyB0aGUgc2FtcGxlIHN0cmluZyBhcyB0aGUgY29udGVudC4gIFRoaXMgc2ltdWxhdGVzCi0gICAgICAgIC8vIHdoYXQgb2NjdXJzIG9uIHRoZSBvdXRib3VuZCBKQVgtV1MgZGlzcGF0Y2g8T01FbGVtZW50PiBjbGllbnQKLSAgICAgICAgU3RyaW5nUmVhZGVyIHNyID0gbmV3IFN0cmluZ1JlYWRlcihzYW1wbGVUZXh0KTsKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIGlucHV0UmVhZGVyID0gaW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihzcik7Ci0gICAgICAgIFN0QVhPTUJ1aWxkZXIgYnVpbGRlciA9IG5ldyBTdEFYT01CdWlsZGVyKGlucHV0UmVhZGVyKTsgIAotICAgICAgICBPTUVsZW1lbnQgb20gPSBidWlsZGVyLmdldERvY3VtZW50RWxlbWVudCgpOwotICAgICAgICBCbG9jayBibG9jayA9IGYuY3JlYXRlRnJvbShvbSwgbnVsbCwgbnVsbCk7Ci0KLSAgICAgICAgLy8gQXNzdW1pbmcgbm8gaGFuZGxlcnMgYXJlIGluc3RhbGxlZCwgdGhlIG5leHQgdGhpbmcgdGhhdCB3aWxsIGhhcHBlbgotICAgICAgICAvLyBpcyBhIFhNTFN0cmVhbVJlYWRlciB3aWxsIGJlIHJlcXVlc3RlZC4uLnRvIGdvIHRvIE9NLiAgIEF0IHRoaXMgcG9pbnQgdGhlCi0gICAgICAgIC8vIGJsb2NrIHNob3VsZCBiZSBjb25zdW1lZC4KLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHJlYWRlciA9IGJsb2NrLmdldFhNTFN0cmVhbVJlYWRlcih0cnVlKTsKLQotICAgICAgICAvLyBUaGUgYmxvY2sgc2hvdWxkIGJlIGNvbnN1bWVkCi0gICAgICAgIGFzc2VydFRydWUoYmxvY2suaXNDb25zdW1lZCgpKTsKLQotICAgICAgICAvLyBUbyBjaGVjayB0aGF0IHRoZSBvdXRwdXQgaXMgY29ycmVjdCwgZ2V0IHRoZSBTdHJpbmcgY29udGVudHMgb2YgdGhlIAotICAgICAgICAvLyByZWFkZXIKLSAgICAgICAgUmVhZGVyMldyaXRlciByMncgPSBuZXcgUmVhZGVyMldyaXRlcihyZWFkZXIpOwotICAgICAgICBTdHJpbmcgbmV3VGV4dCA9IHIydy5nZXRBc1N0cmluZygpOwotICAgICAgICBhc3NlcnRUcnVlKHNhbXBsZVRleHQuZXF1YWxzKG5ld1RleHQpKTsKLQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgQmxvY2sgcmVwcmVzZW50aW5nIGFuIE9NIGFuZCBzaW11bGF0ZSBhIAotICAgICAqIGRpZmZlcmVudCBEaXNwYXRjaDxPTUVsZW1lbnQ+IGZsb3cKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RPTU91dGZsb3cyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIEdldCB0aGUgQmxvY2tGYWN0b3J5Ci0gICAgICAgIE9NQmxvY2tGYWN0b3J5IGYgPSAoT01CbG9ja0ZhY3RvcnkpCi0gICAgICAgIEZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KE9NQmxvY2tGYWN0b3J5LmNsYXNzKTsKLQotICAgICAgICAvLyBDcmVhdGUgYSBCbG9jayB1c2luZyB0aGUgc2FtcGxlIHN0cmluZyBhcyB0aGUgY29udGVudC4gIFRoaXMgc2ltdWxhdGVzCi0gICAgICAgIC8vIHdoYXQgb2NjdXJzIG9uIHRoZSBvdXRib3VuZCBKQVgtV1MgZGlzcGF0Y2g8T01FbGVtZW50PiBjbGllbnQKLSAgICAgICAgU3RyaW5nUmVhZGVyIHNyID0gbmV3IFN0cmluZ1JlYWRlcihzYW1wbGVUZXh0KTsKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIGlucHV0UmVhZGVyID0gaW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihzcik7Ci0gICAgICAgIFN0QVhPTUJ1aWxkZXIgYnVpbGRlciA9IG5ldyBTdEFYT01CdWlsZGVyKGlucHV0UmVhZGVyKTsgIAotICAgICAgICBPTUVsZW1lbnQgb20gPSBidWlsZGVyLmdldERvY3VtZW50RWxlbWVudCgpOwotICAgICAgICBCbG9jayBibG9jayA9IGYuY3JlYXRlRnJvbShvbSwgbnVsbCwgbnVsbCk7Ci0KLSAgICAgICAgLy8gQXNzdW1lIHRoYXQgd2UgbmVlZCB0byBmaW5kIHRoZSBRTmFtZSAocGVyaGFwcyB0byBpZGVudGlmeSB0aGUgb3BlcmF0aW9uIGFuZCAKLSAgICAgICAgLy8gZGV0ZXJtaW5lIGlmIGhhbmRsZXJzIGFyZSBpbnN0YWxsZWQpLiAgIFRoaXMgaXMgbm90IHZlcnkgcGVyZm9tYW50IHNpbmNlIAotICAgICAgICAvLyBpdCBjYXVzZXMgYW4gdW5kZXJseWluZyBwYXJzZSBvZiB0aGUgU3RyaW5nLi4uYnV0IHdlIG5lZWQgdG8gc3VwcG9ydCB0aGlzLgotICAgICAgICBRTmFtZSBxTmFtZSA9IGJsb2NrLmdldFFOYW1lKCk7Ci0gICAgICAgIGFzc2VydFRydWUoIkV4cGVjdGVkOiAiICsgc2FtcGxlUU5hbWUgKyAiIGJ1dCBmb3VuZDogIiArIHFOYW1lLCBzYW1wbGVRTmFtZS5lcXVhbHMocU5hbWUpKTsKLQotCi0gICAgICAgIC8vIEFzc3VtaW5nIG5vIGhhbmRsZXJzIGFyZSBpbnN0YWxsZWQsIHRoZSBuZXh0IHRoaW5nIHRoYXQgd2lsbCBoYXBwZW4KLSAgICAgICAgLy8gaXMgYSBYTUxTdHJlYW1SZWFkZXIgd2lsbCBiZSByZXF1ZXN0ZWQuLi50byBnbyB0byBPTS4gICBBdCB0aGlzIHBvaW50IHRoZQotICAgICAgICAvLyBibG9jayBzaG91bGQgYmUgY29uc3VtZWQuCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlciByZWFkZXIgPSBibG9jay5nZXRYTUxTdHJlYW1SZWFkZXIodHJ1ZSk7Ci0KLSAgICAgICAgLy8gVGhlIGJsb2NrIHNob3VsZCBiZSBjb25zdW1lZAotICAgICAgICBhc3NlcnRUcnVlKGJsb2NrLmlzQ29uc3VtZWQoKSk7Ci0KLSAgICAgICAgLy8gVG8gY2hlY2sgdGhhdCB0aGUgb3V0cHV0IGlzIGNvcnJlY3QsIGdldCB0aGUgU3RyaW5nIGNvbnRlbnRzIG9mIHRoZSAKLSAgICAgICAgLy8gcmVhZGVyCi0gICAgICAgIFJlYWRlcjJXcml0ZXIgcjJ3ID0gbmV3IFJlYWRlcjJXcml0ZXIocmVhZGVyKTsKLSAgICAgICAgU3RyaW5nIG5ld1RleHQgPSByMncuZ2V0QXNTdHJpbmcoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShzYW1wbGVUZXh0LmVxdWFscyhuZXdUZXh0KSk7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBCbG9jayByZXByZXNlbnRpbmcgYW4gWE1MU3RyaW5nIGFuZCBzaW11bGF0ZSBhIAotICAgICAqICBEaXNwYXRjaDxPTUVsZW1lbnQ+IGluZmxvdwotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdE9NSW5mbG93KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIEdldCB0aGUgQmxvY2tGYWN0b3J5Ci0gICAgICAgIE9NQmxvY2tGYWN0b3J5IGYgPSAoT01CbG9ja0ZhY3RvcnkpCi0gICAgICAgIEZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KE9NQmxvY2tGYWN0b3J5LmNsYXNzKTsKLQotICAgICAgICAvLyBPbiBpbmJvdW5kLCB0aGVyZSB3aWxsIGFscmVhZHkgYmUgYSBYTUxTdHJlYW1SZWFkZXIgKHByb2JhYmx5IGZyb20gT00pCi0gICAgICAgIC8vIHdoaWNoIHJlcHJlc2VudHMgdGhlIG1lc3NhZ2UuICBXZSB3aWxsIHNpbXVsYXRlIHRoaXMgd2l0aCBpbmZsb3cuCi0gICAgICAgIFN0cmluZ1JlYWRlciBzciA9IG5ldyBTdHJpbmdSZWFkZXIoc2FtcGxlVGV4dCk7Ci0gICAgICAgIFhNTFN0cmVhbVJlYWRlciBpbmZsb3cgPSBpbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKHNyKTsKLQotICAgICAgICAvLyBDcmVhdGUgYSBCbG9jayBmcm9tIHRoZSBpbmZsb3cuICAKLSAgICAgICAgQmxvY2sgYmxvY2sgPSBmLmNyZWF0ZUZyb20oaW5mbG93LCBudWxsLCBudWxsKTsKLQotICAgICAgICAvLyBMZXQncyBhc3N1bWUgd2UgbmVlZCB0byBnZXQgdGhlIFFOYW1lIHRvIGZpbmQgdGhlIG9wZXJhdGlvbiBuYW1lLgotICAgICAgICAvLyBUaGlzIHdpbGwgY2F1c2UgYW4gdW5kZXJseWluZyBwYXJzZQotICAgICAgICBRTmFtZSBxTmFtZSA9IGJsb2NrLmdldFFOYW1lKCk7Ci0gICAgICAgIGFzc2VydFRydWUoc2FtcGxlUU5hbWUuZXF1YWxzKHFOYW1lKSk7Ci0KLSAgICAgICAgLy8gQXNzdW1pbmcgbm8gaGFuZGxlcnMgYXJlIGluc3RhbGxlZCwgdGhlIG5leHQgdGhpbmcgdGhhdCB3aWxsIGhhcHBlbgotICAgICAgICAvLyBpcyB0aGUgcHJveHkgY29kZSB3aWxsIGFzayBmb3IgdGhlIGJ1c2luZXNzIG9iamVjdCAoU3RyaW5nKS4KLSAgICAgICAgT2JqZWN0IGJvID0gYmxvY2suZ2V0QnVzaW5lc3NPYmplY3QodHJ1ZSk7Ci0gICAgICAgIGFzc2VydFRydWUoYm8gaW5zdGFuY2VvZiBPTUVsZW1lbnQpOwotCi0gICAgICAgIC8vIFRoZSBibG9jayBzaG91bGQgYmUgY29uc3VtZWQKLSAgICAgICAgYXNzZXJ0VHJ1ZShibG9jay5pc0NvbnN1bWVkKCkpOwotCi0gICAgICAgIC8vIENoZWNrIHRoZSBTdHJpbmcgZm9yIGFjY3VyYWN5Ci0gICAgICAgIGFzc2VydFRydWUoc2FtcGxlVGV4dC5lcXVhbHMoYm8udG9TdHJpbmcoKSkpOwotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgQmxvY2sgcmVwcmVzZW50aW5nIGEgU291cmNlIGFuZCBzaW11bGF0ZSBhIAotICAgICAqIG5vcm1hbCBEaXNwYXRjaDxTb3VyY2U+IGZsb3cKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJlYW1Tb3VyY2VPdXRmbG93KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIEdldCB0aGUgQmxvY2tGYWN0b3J5Ci0gICAgICAgIFNvdXJjZUJsb2NrRmFjdG9yeSBmID0gKFNvdXJjZUJsb2NrRmFjdG9yeSkKLSAgICAgICAgRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoU291cmNlQmxvY2tGYWN0b3J5LmNsYXNzKTsKLQotICAgICAgICBTdHJlYW1Tb3VyY2Ugc3MgPSBuZXcgU3RyZWFtU291cmNlKG5ldyBTdHJpbmdSZWFkZXIoc2FtcGxlVGV4dCkpOwotCi0gICAgICAgIC8vIENyZWF0ZSBhIEJsb2NrIHVzaW5nIHRoZSBzYW1wbGUgc3RyaW5nIGFzIHRoZSBjb250ZW50LiAgVGhpcyBzaW11bGF0ZXMKLSAgICAgICAgLy8gd2hhdCBvY2N1cnMgb24gdGhlIG91dGJvdW5kIEpBWC1XUyBkaXNwYXRjaDxTb3VyY2U+IGNsaWVudAotICAgICAgICBCbG9jayBibG9jayA9IGYuY3JlYXRlRnJvbShzcywgbnVsbCwgbnVsbCk7Ci0KLSAgICAgICAgLy8gV2UgZGlkbid0IHBhc3MgaW4gYSBxbmFtZSwgc28gdGhlIGZvbGxvd2luZyBzaG91bGQgcmV0dXJuIGZhbHNlCi0gICAgICAgIGFzc2VydFRydWUoIWJsb2NrLmlzUU5hbWVBdmFpbGFibGUoKSk7Ci0KLSAgICAgICAgLy8gQXNzdW1pbmcgbm8gaGFuZGxlcnMgYXJlIGluc3RhbGxlZCwgdGhlIG5leHQgdGhpbmcgdGhhdCB3aWxsIGhhcHBlbgotICAgICAgICAvLyBpcyBhIFhNTFN0cmVhbVJlYWRlciB3aWxsIGJlIHJlcXVlc3RlZC4uLnRvIGdvIHRvIE9NLiAgIEF0IHRoaXMgcG9pbnQgdGhlCi0gICAgICAgIC8vIGJsb2NrIHNob3VsZCBiZSBjb25zdW1lZC4KLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHJlYWRlciA9IGJsb2NrLmdldFhNTFN0cmVhbVJlYWRlcih0cnVlKTsKLQotICAgICAgICAvLyBUaGUgYmxvY2sgc2hvdWxkIGJlIGNvbnN1bWVkCi0gICAgICAgIGFzc2VydFRydWUoYmxvY2suaXNDb25zdW1lZCgpKTsKLQotICAgICAgICAvLyBUbyBjaGVjayB0aGF0IHRoZSBvdXRwdXQgaXMgY29ycmVjdCwgZ2V0IHRoZSBTdHJpbmcgY29udGVudHMgb2YgdGhlIAotICAgICAgICAvLyByZWFkZXIKLSAgICAgICAgUmVhZGVyMldyaXRlciByMncgPSBuZXcgUmVhZGVyMldyaXRlcihyZWFkZXIpOwotICAgICAgICBTdHJpbmcgbmV3VGV4dCA9IHIydy5nZXRBc1N0cmluZygpOwotICAgICAgICBhc3NlcnRUcnVlKHNhbXBsZVRleHQuZXF1YWxzKG5ld1RleHQpKTsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIEJsb2NrIHJlcHJlc2VudGluZyBhIFNvdXJjZSBhbmQKLSAgICAgKiBzaW11bGF0ZSBhIGRpZmZlcmVudCBEaXNwYXRjaDxTb3VyY2U+IGZsb3cKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJlYW1Tb3VyY2VPdXRmbG93MigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBHZXQgdGhlIEJsb2NrRmFjdG9yeQotICAgICAgICBTb3VyY2VCbG9ja0ZhY3RvcnkgZiA9IChTb3VyY2VCbG9ja0ZhY3RvcnkpCi0gICAgICAgIEZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KFNvdXJjZUJsb2NrRmFjdG9yeS5jbGFzcyk7Ci0KLSAgICAgICAgU3RyZWFtU291cmNlIHNzID0gbmV3IFN0cmVhbVNvdXJjZShuZXcgU3RyaW5nUmVhZGVyKHNhbXBsZVRleHQpKTsKLQotICAgICAgICAvLyBDcmVhdGUgYSBCbG9jayB1c2luZyB0aGUgc2FtcGxlIHN0cmluZyBhcyB0aGUgY29udGVudC4gIFRoaXMgc2ltdWxhdGVzCi0gICAgICAgIC8vIHdoYXQgb2NjdXJzIG9uIHRoZSBvdXRib3VuZCBKQVgtV1MgZGlzcGF0Y2g8U291cmNlPiBjbGllbnQKLSAgICAgICAgQmxvY2sgYmxvY2sgPSBmLmNyZWF0ZUZyb20oc3MsIG51bGwsIG51bGwpOwotCi0gICAgICAgIC8vIFdlIGRpZG4ndCBwYXNzIGluIGEgcW5hbWUsIHNvIHRoZSBmb2xsb3dpbmcgc2hvdWxkIHJldHVybiBmYWxzZQotICAgICAgICBhc3NlcnRUcnVlKCFibG9jay5pc1FOYW1lQXZhaWxhYmxlKCkpOwotCi0gICAgICAgIC8vIEFzc3VtZSB0aGF0IHdlIG5lZWQgdG8gZmluZCB0aGUgUU5hbWUgKHBlcmhhcHMgdG8gaWRlbnRpZnkgdGhlIG9wZXJhdGlvbiBhbmQgCi0gICAgICAgIC8vIGRldGVybWluZSBpZiBoYW5kbGVycyBhcmUgaW5zdGFsbGVkKS4gICBUaGlzIGlzIG5vdCB2ZXJ5IHBlcmZvbWFudCBzaW5jZSAKLSAgICAgICAgLy8gaXQgY2F1c2VzIGFuIHVuZGVybHlpbmcgcGFyc2Ugb2YgdGhlIFN0cmluZy4uLmJ1dCB3ZSBuZWVkIHRvIHN1cHBvcnQgdGhpcy4KLSAgICAgICAgUU5hbWUgcU5hbWUgPSBibG9jay5nZXRRTmFtZSgpOwotICAgICAgICBhc3NlcnRUcnVlKCJFeHBlY3RlZDogIiArIHNhbXBsZVFOYW1lICsgIiBidXQgZm91bmQ6ICIgKyBxTmFtZSwgc2FtcGxlUU5hbWUuZXF1YWxzKHFOYW1lKSk7Ci0KLSAgICAgICAgLy8gQXNzdW1pbmcgbm8gaGFuZGxlcnMgYXJlIGluc3RhbGxlZCwgdGhlIG5leHQgdGhpbmcgdGhhdCB3aWxsIGhhcHBlbgotICAgICAgICAvLyBpcyBhIFhNTFN0cmVhbVJlYWRlciB3aWxsIGJlIHJlcXVlc3RlZC4uLnRvIGdvIHRvIE9NLiAgIEF0IHRoaXMgcG9pbnQgdGhlCi0gICAgICAgIC8vIGJsb2NrIHNob3VsZCBiZSBjb25zdW1lZC4KLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHJlYWRlciA9IGJsb2NrLmdldFhNTFN0cmVhbVJlYWRlcih0cnVlKTsKLQotICAgICAgICAvLyBUaGUgYmxvY2sgc2hvdWxkIGJlIGNvbnN1bWVkCi0gICAgICAgIGFzc2VydFRydWUoYmxvY2suaXNDb25zdW1lZCgpKTsKLQotICAgICAgICAvLyBUbyBjaGVjayB0aGF0IHRoZSBvdXRwdXQgaXMgY29ycmVjdCwgZ2V0IHRoZSBTdHJpbmcgY29udGVudHMgb2YgdGhlIAotICAgICAgICAvLyByZWFkZXIKLSAgICAgICAgUmVhZGVyMldyaXRlciByMncgPSBuZXcgUmVhZGVyMldyaXRlcihyZWFkZXIpOwotICAgICAgICBTdHJpbmcgbmV3VGV4dCA9IHIydy5nZXRBc1N0cmluZygpOwotICAgICAgICBhc3NlcnRUcnVlKHNhbXBsZVRleHQuZXF1YWxzKG5ld1RleHQpKTsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIEJsb2NrIHJlcHJlc2VudGluZyBhIFNvdXJjZSBhbmQKLSAgICAgKiBzaW11bGF0ZSBhIGRpZmZlcmVudCBTb3VyY2UgcGFyYW1ldGVyIGZsb3cKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJlYW1Tb3VyY2VPdXRmbG93MygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBHZXQgdGhlIEJsb2NrRmFjdG9yeQotICAgICAgICBTb3VyY2VCbG9ja0ZhY3RvcnkgZiA9IChTb3VyY2VCbG9ja0ZhY3RvcnkpCi0gICAgICAgIEZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KFNvdXJjZUJsb2NrRmFjdG9yeS5jbGFzcyk7Ci0KLSAgICAgICAgU3RyZWFtU291cmNlIHNzID0gbmV3IFN0cmVhbVNvdXJjZShuZXcgU3RyaW5nUmVhZGVyKHNhbXBsZVRleHQpKTsKLQotICAgICAgICAvLyBDcmVhdGUgYSBCbG9jayB1c2luZyB0aGUgc2FtcGxlIHN0cmluZyBhcyB0aGUgY29udGVudC4gIFRoaXMgc2ltdWxhdGVzCi0gICAgICAgIC8vIHdoYXQgb2NjdXJzIG9uIHRoZSBvdXRib3VuZCBKQVgtV1MgU3RyaW5nIHBhcmFtZXRlciBvbiB0aGUgY2xpZW50LgotICAgICAgICAvLyBJbiB0aGlzIGNhc2UsIHdlIGtub3cgdGhlIFFOYW1lIHByaW9yIHRvIGNyZWF0aW5nIHRoZSBCbG9jay4uLnNvIGxldCdzIHBhc3MgaXQgaW4uCi0gICAgICAgIEJsb2NrIGJsb2NrID0gZi5jcmVhdGVGcm9tKHNzLCBudWxsLCBzYW1wbGVRTmFtZSk7Ci0KLSAgICAgICAgLy8gV2UgcGFzc2VkIGluIGEgcW5hbWUsIHNvIGl0IHNob3VsZCBiZSBpbW1lZGlhdGVseSBhdmFpbGFibGUKLSAgICAgICAgYXNzZXJ0VHJ1ZShibG9jay5pc1FOYW1lQXZhaWxhYmxlKCkpOwotCi0gICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgUU5hbWUgaXMgY29ycmVjdC4KLSAgICAgICAgUU5hbWUgcU5hbWUgPSBibG9jay5nZXRRTmFtZSgpOwotICAgICAgICBhc3NlcnRUcnVlKHNhbXBsZVFOYW1lLmVxdWFscyhxTmFtZSkpOwotCi0gICAgICAgIC8vIEFzc3VtaW5nIG5vIGhhbmRsZXJzIGFyZSBpbnN0YWxsZWQsIHRoZSBuZXh0IHRoaW5nIHRoYXQgd2lsbCBoYXBwZW4KLSAgICAgICAgLy8gaXMgYSBYTUxTdHJlYW1SZWFkZXIgd2lsbCBiZSByZXF1ZXN0ZWQuLi50byBnbyB0byBPTS4gICBBdCB0aGlzIHBvaW50IHRoZQotICAgICAgICAvLyBibG9jayBzaG91bGQgYmUgY29uc3VtZWQuCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlciByZWFkZXIgPSBibG9jay5nZXRYTUxTdHJlYW1SZWFkZXIodHJ1ZSk7Ci0KLSAgICAgICAgLy8gVGhlIGJsb2NrIHNob3VsZCBiZSBjb25zdW1lZAotICAgICAgICBhc3NlcnRUcnVlKGJsb2NrLmlzQ29uc3VtZWQoKSk7Ci0KLSAgICAgICAgLy8gVG8gY2hlY2sgdGhhdCB0aGUgb3V0cHV0IGlzIGNvcnJlY3QsIGdldCB0aGUgU3RyaW5nIGNvbnRlbnRzIG9mIHRoZSAKLSAgICAgICAgLy8gcmVhZGVyCi0gICAgICAgIFJlYWRlcjJXcml0ZXIgcjJ3ID0gbmV3IFJlYWRlcjJXcml0ZXIocmVhZGVyKTsKLSAgICAgICAgU3RyaW5nIG5ld1RleHQgPSByMncuZ2V0QXNTdHJpbmcoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShzYW1wbGVUZXh0LmVxdWFscyhuZXdUZXh0KSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgQmxvY2sgcmVwcmVzZW50aW5nIGFuIFhNTFN0cmluZyBhbmQgc2ltdWxhdGUgYSAKLSAgICAgKiBub3JtYWwgRGlzcGF0Y2g8U291cmNlPiBpbnB1dCBmbG93Ci0gICAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyZWFtU291cmNlSW5mbG93KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIEdldCB0aGUgQmxvY2tGYWN0b3J5Ci0gICAgICAgIFNvdXJjZUJsb2NrRmFjdG9yeSBmID0gKFNvdXJjZUJsb2NrRmFjdG9yeSkKLSAgICAgICAgRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoU291cmNlQmxvY2tGYWN0b3J5LmNsYXNzKTsKLQotICAgICAgICAvLyBPbiBpbmJvdW5kLCB0aGVyZSB3aWxsIGFscmVhZHkgYmUgYSBYTUxTdHJlYW1SZWFkZXIgKHByb2JhYmx5IGZyb20gT00pCi0gICAgICAgIC8vIHdoaWNoIHJlcHJlc2VudHMgdGhlIG1lc3NhZ2UuICBXZSB3aWxsIHNpbXVsYXRlIHRoaXMgd2l0aCBpbmZsb3cuCi0gICAgICAgIFN0cmluZ1JlYWRlciBzciA9IG5ldyBTdHJpbmdSZWFkZXIoc2FtcGxlVGV4dCk7Ci0gICAgICAgIFhNTFN0cmVhbVJlYWRlciBpbmZsb3cgPSBpbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKHNyKTsKLQotICAgICAgICAvLyBDcmVhdGUgYSBCbG9jayBmcm9tIHRoZSBpbmZsb3cuICAKLSAgICAgICAgQmxvY2sgYmxvY2sgPSBmLmNyZWF0ZUZyb20oaW5mbG93LCBudWxsLCBudWxsKTsKLQotICAgICAgICAvLyBBc3N1bWluZyBubyBoYW5kbGVycyBhcmUgaW5zdGFsbGVkLCB0aGUgbmV4dCB0aGluZyB0aGF0IHdpbGwgaGFwcGVuCi0gICAgICAgIC8vIGlzIHRoZSBwcm94eSBjb2RlIHdpbGwgYXNrIGZvciB0aGUgYnVzaW5lc3Mgb2JqZWN0IChTdHJpbmcpLgotICAgICAgICBPYmplY3QgYm8gPSBibG9jay5nZXRCdXNpbmVzc09iamVjdCh0cnVlKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShibyBpbnN0YW5jZW9mIFNvdXJjZSk7Ci0KLSAgICAgICAgLy8gVGhlIGJsb2NrIHNob3VsZCBiZSBjb25zdW1lZAotICAgICAgICBhc3NlcnRUcnVlKGJsb2NrLmlzQ29uc3VtZWQoKSk7Ci0KLSAgICAgICAgLy8gQ2hlY2sgdGhlIFN0cmluZyBmb3IgYWNjdXJhY3kKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHJlYWRlciA9IGlucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoKFNvdXJjZSkgYm8pOwotICAgICAgICBSZWFkZXIyV3JpdGVyIHIydyA9IG5ldyBSZWFkZXIyV3JpdGVyKHJlYWRlcik7Ci0gICAgICAgIFN0cmluZyBuZXdUZXh0ID0gcjJ3LmdldEFzU3RyaW5nKCk7Ci0gICAgICAgIGFzc2VydFRydWUoc2FtcGxlVGV4dC5lcXVhbHMobmV3VGV4dCkpOwotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgQmxvY2sgcmVwcmVzZW50aW5nIGFuIFhNTFN0cmluZyBhbmQgc2ltdWxhdGUgYSAKLSAgICAgKiBzbGlnaHRseSBtb3JlIGNvbXBsaWNhdGVkIERpc3BhdGNoPFNvdXJjZT4gaW5mbG93Ci0gICAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyZWFtU291cmNlSW5mbG93MigpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIC8vIEdldCB0aGUgQmxvY2tGYWN0b3J5Ci0gICAgICAgIFNvdXJjZUJsb2NrRmFjdG9yeSBmID0gKFNvdXJjZUJsb2NrRmFjdG9yeSkKLSAgICAgICAgRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoU291cmNlQmxvY2tGYWN0b3J5LmNsYXNzKTsKLQotICAgICAgICAvLyBPbiBpbmJvdW5kLCB0aGVyZSB3aWxsIGFscmVhZHkgYmUgYSBYTUxTdHJlYW1SZWFkZXIgKHByb2JhYmx5IGZyb20gT00pCi0gICAgICAgIC8vIHdoaWNoIHJlcHJlc2VudHMgdGhlIG1lc3NhZ2UuICBXZSB3aWxsIHNpbXVsYXRlIHRoaXMgd2l0aCBpbmZsb3cuCi0gICAgICAgIFN0cmluZ1JlYWRlciBzciA9IG5ldyBTdHJpbmdSZWFkZXIoc2FtcGxlVGV4dCk7Ci0gICAgICAgIFhNTFN0cmVhbVJlYWRlciBpbmZsb3cgPSBpbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKHNyKTsKLQotICAgICAgICAvLyBDcmVhdGUgYSBCbG9jayBmcm9tIHRoZSBpbmZsb3cuICAKLSAgICAgICAgQmxvY2sgYmxvY2sgPSBmLmNyZWF0ZUZyb20oaW5mbG93LCBudWxsLCBudWxsKTsKLQotICAgICAgICAvLyBMZXQncyBhc3N1bWUgd2UgbmVlZCB0byBnZXQgdGhlIFFOYW1lIHRvIGZpbmQgdGhlIG9wZXJhdGlvbiBuYW1lLgotICAgICAgICAvLyBUaGlzIHdpbGwgY2F1c2UgYW4gdW5kZXJseWluZyBwYXJzZQotICAgICAgICBRTmFtZSBxTmFtZSA9IGJsb2NrLmdldFFOYW1lKCk7Ci0gICAgICAgIGFzc2VydFRydWUoc2FtcGxlUU5hbWUuZXF1YWxzKHFOYW1lKSk7Ci0KLSAgICAgICAgLy8gQXNzdW1pbmcgbm8gaGFuZGxlcnMgYXJlIGluc3RhbGxlZCwgdGhlIG5leHQgdGhpbmcgdGhhdCB3aWxsIGhhcHBlbgotICAgICAgICAvLyBpcyB0aGUgcHJveHkgY29kZSB3aWxsIGFzayBmb3IgdGhlIGJ1c2luZXNzIG9iamVjdCAoU3RyaW5nKS4KLSAgICAgICAgT2JqZWN0IGJvID0gYmxvY2suZ2V0QnVzaW5lc3NPYmplY3QodHJ1ZSk7Ci0gICAgICAgIGFzc2VydFRydWUoYm8gaW5zdGFuY2VvZiBTb3VyY2UpOwotCi0gICAgICAgIC8vIFRoZSBibG9jayBzaG91bGQgYmUgY29uc3VtZWQKLSAgICAgICAgYXNzZXJ0VHJ1ZShibG9jay5pc0NvbnN1bWVkKCkpOwotCi0gICAgICAgIC8vIENoZWNrIHRoZSBTdHJpbmcgZm9yIGFjY3VyYWN5Ci0gICAgICAgIFhNTFN0cmVhbVJlYWRlciByZWFkZXIgPSBpbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKChTb3VyY2UpIGJvKTsKLSAgICAgICAgUmVhZGVyMldyaXRlciByMncgPSBuZXcgUmVhZGVyMldyaXRlcihyZWFkZXIpOwotICAgICAgICBTdHJpbmcgbmV3VGV4dCA9IHIydy5nZXRBc1N0cmluZygpOwotICAgICAgICBhc3NlcnRUcnVlKHNhbXBsZVRleHQuZXF1YWxzKG5ld1RleHQpKTsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIEJsb2NrIHJlcHJlc2VudGluZyBhbiBTb3VyY2UgYW5kIHNpbXVsYXRlIGEgCi0gICAgICogc2xpZ2h0bHkgbW9yZSBjb21wbGljYXRlZCBTb3VyY2UgaW5mbG93Ci0gICAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyZWFtU291cmNlSW5mbG93MygpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIC8vIEdldCB0aGUgQmxvY2tGYWN0b3J5Ci0gICAgICAgIFNvdXJjZUJsb2NrRmFjdG9yeSBmID0gKFNvdXJjZUJsb2NrRmFjdG9yeSkKLSAgICAgICAgRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoU291cmNlQmxvY2tGYWN0b3J5LmNsYXNzKTsKLQotICAgICAgICAvLyBPbiBpbmJvdW5kLCB0aGVyZSB3aWxsIGFscmVhZHkgYmUgYSBYTUxTdHJlYW1SZWFkZXIgKHByb2JhYmx5IGZyb20gT00pCi0gICAgICAgIC8vIHdoaWNoIHJlcHJlc2VudHMgdGhlIG1lc3NhZ2UuICBXZSB3aWxsIHNpbXVsYXRlIHRoaXMgd2l0aCBpbmZsb3cuCi0gICAgICAgIFN0cmluZ1JlYWRlciBzciA9IG5ldyBTdHJpbmdSZWFkZXIoc2FtcGxlVGV4dCk7Ci0gICAgICAgIFhNTFN0cmVhbVJlYWRlciBpbmZsb3cgPSBpbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKHNyKTsKLQotICAgICAgICAvLyBDcmVhdGUgYSBCbG9jayBmcm9tIHRoZSBpbmZsb3cuICBBc3N1bWUgdGhhdCB3ZSBrbm93IHRoZSBRTmFtZSBhbHJlYWR5Ci0gICAgICAgIEJsb2NrIGJsb2NrID0gZi5jcmVhdGVGcm9tKGluZmxvdywgbnVsbCwgc2FtcGxlUU5hbWUpOwotCi0gICAgICAgIC8vIFdlIHBhc3NlZCBpbiBhIHFuYW1lLCBzbyB0aGUgZm9sbG93aW5nIHNob3VsZCByZXR1cm4gZmFsc2UKLSAgICAgICAgYXNzZXJ0VHJ1ZShibG9jay5pc1FOYW1lQXZhaWxhYmxlKCkpOwotCi0gICAgICAgIC8vIExldCdzIGFzc3VtZSB3ZSBuZWVkIHRvIGdldCB0aGUgUU5hbWUgdG8gZmluZCB0aGUgb3BlcmF0aW9uIG5hbWUuCi0gICAgICAgIFFOYW1lIHFOYW1lID0gYmxvY2suZ2V0UU5hbWUoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShzYW1wbGVRTmFtZS5lcXVhbHMocU5hbWUpKTsKLQotICAgICAgICAvLyBBc3N1bWluZyBubyBoYW5kbGVycyBhcmUgaW5zdGFsbGVkLCB0aGUgbmV4dCB0aGluZyB0aGF0IHdpbGwgaGFwcGVuCi0gICAgICAgIC8vIGlzIHRoZSBwcm94eSBjb2RlIHdpbGwgYXNrIGZvciB0aGUgYnVzaW5lc3Mgb2JqZWN0IChTdHJpbmcpLgotICAgICAgICBPYmplY3QgYm8gPSBibG9jay5nZXRCdXNpbmVzc09iamVjdCh0cnVlKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShibyBpbnN0YW5jZW9mIFNvdXJjZSk7Ci0KLSAgICAgICAgLy8gVGhlIGJsb2NrIHNob3VsZCBiZSBjb25zdW1lZAotICAgICAgICBhc3NlcnRUcnVlKGJsb2NrLmlzQ29uc3VtZWQoKSk7Ci0KLSAgICAgICAgLy8gQ2hlY2sgdGhlIFN0cmluZyBmb3IgYWNjdXJhY3kKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHJlYWRlciA9IGlucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoKFNvdXJjZSkgYm8pOwotICAgICAgICBSZWFkZXIyV3JpdGVyIHIydyA9IG5ldyBSZWFkZXIyV3JpdGVyKHJlYWRlcik7Ci0gICAgICAgIFN0cmluZyBuZXdUZXh0ID0gcjJ3LmdldEFzU3RyaW5nKCk7Ci0gICAgICAgIGFzc2VydFRydWUoc2FtcGxlVGV4dC5lcXVhbHMobmV3VGV4dCkpOwotCi0gICAgfQotICAgIC8qCi0gICAgICogVGVzdGluZyBKQVhCU291cmNlLCBDcmVhdGluZyBTb3VyY2UgQmxvY2sgdXNpbmcgSkFYQlNvdXJjZSBhbmQgdGhlbgotICAgICAqIFNlcmlhbGl6aW5nIGl0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RKQVhCU291cmNlSW5GbG93MSgpdGhyb3dzIEV4Y2VwdGlvbnsKLSAgICAgICAgLy8gIENyZWF0ZSBhIGpheGIgb2JqZWN0Ci0gICAgICAgIHRyeXsKLSAgICAgICAgICAgIE9iamVjdEZhY3RvcnkgZmFjdG9yeSA9IG5ldyBPYmplY3RGYWN0b3J5KCk7Ci0gICAgICAgICAgICBFY2hvU3RyaW5nIGpheGIgPSBmYWN0b3J5LmNyZWF0ZUVjaG9TdHJpbmcoKTsgCi0gICAgICAgICAgICBqYXhiLnNldElucHV0KCJIZWxsbyBXb3JsZCIpOwotICAgICAgICAgICAgSkFYQkNvbnRleHQgY29udGV4dCA9IEpBWEJDb250ZXh0Lm5ld0luc3RhbmNlKCJ0ZXN0Iik7Ci0KLSAgICAgICAgICAgIEpBWEJTb3VyY2Ugc3JjID0gbmV3IEpBWEJTb3VyY2UoY29udGV4dC5jcmVhdGVNYXJzaGFsbGVyKCksIGpheGIpOwotICAgICAgICAgICAgQmxvY2tGYWN0b3J5IGYgPSAoU291cmNlQmxvY2tGYWN0b3J5KQotICAgICAgICAgICAgRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoU291cmNlQmxvY2tGYWN0b3J5LmNsYXNzKTsKLQotICAgICAgICAgICAgQmxvY2sgYmxvY2sgPWYuY3JlYXRlRnJvbShzcmMsIG51bGwsIG51bGwpOwotCi0gICAgICAgICAgICBNZXNzYWdlRmFjdG9yeSBtZiA9IChNZXNzYWdlRmFjdG9yeSkgRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoTWVzc2FnZUZhY3RvcnkuY2xhc3MpOwotICAgICAgICAgICAgTWVzc2FnZSBtc2cgPSBtZi5jcmVhdGUoUHJvdG9jb2wuc29hcDExKTsKLSAgICAgICAgICAgIG1zZy5zZXRCb2R5QmxvY2soYmxvY2spOwotICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZSBlbnYgPSAob3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZSltc2cuZ2V0QXNPTUVsZW1lbnQoKTsKLSAgICAgICAgICAgIC8vIFNlcmlhbGl6ZSB0aGUgRW52ZWxvcGUgdXNpbmcgdGhlIHNhbWUgbWVjaGFuaXNtIGFzIHRoZSAKLSAgICAgICAgICAgIC8vIEhUVFAgY2xpZW50LgotICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICBlbnYuc2VyaWFsaXplQW5kQ29uc3VtZShiYW9zLCBuZXcgT01PdXRwdXRGb3JtYXQoKSk7Ci0KLSAgICAgICAgICAgIC8vIFRvIGNoZWNrIHRoYXQgdGhlIG91dHB1dCBpcyBjb3JyZWN0LCBnZXQgdGhlIFN0cmluZyBjb250ZW50cyBvZiB0aGUgCi0gICAgICAgICAgICAvLyByZWFkZXIKLSAgICAgICAgICAgIFN0cmluZyBuZXdUZXh0ID0gYmFvcy50b1N0cmluZygpOwotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcobmV3VGV4dCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGJsb2NrLmlzQ29uc3VtZWQoKSk7Ci0gICAgICAgIH1jYXRjaChFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9ICAgICAKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SkFYQlNvdXJjZU91dGZsb3coKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICAvL1NhbXBsZSB0ZXh0IGZvciBKQVhCU291cmNlCi0gICAgICAgIFN0cmluZyBlY2hvU2FtcGxlID0gIjxlY2hvU3RyaW5nIHhtbG5zPVwiaHR0cDovL3Rlc3RcIj48aW5wdXQ+SGVsbG8gV29ybGQ8L2lucHV0PjwvZWNob1N0cmluZz4iOwotCi0gICAgICAgIC8vIEdldCB0aGUgQmxvY2tGYWN0b3J5Ci0gICAgICAgIFNvdXJjZUJsb2NrRmFjdG9yeSBmID0gKFNvdXJjZUJsb2NrRmFjdG9yeSkKLSAgICAgICAgRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoU291cmNlQmxvY2tGYWN0b3J5LmNsYXNzKTsKLSAgICAgICAgLy9DcmVhdGUgYSBKQVhCU291cmNlCi0KLSAgICAgICAgSkFYQkNvbnRleHQgY29udGV4dCA9IEpBWEJDb250ZXh0Lm5ld0luc3RhbmNlKCJ0ZXN0Iik7Ci0KLSAgICAgICAgVW5tYXJzaGFsbGVyIHUgPSBjb250ZXh0LmNyZWF0ZVVubWFyc2hhbGxlcigpOwotICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShlY2hvU2FtcGxlLmdldEJ5dGVzKCkpOwotICAgICAgICBFY2hvU3RyaW5nIGpheGIgPSAoRWNob1N0cmluZyl1LnVubWFyc2hhbChpbnB1dFN0cmVhbSk7Ci0gICAgICAgIEpBWEJTb3VyY2Ugc3JjID0gbmV3IEpBWEJTb3VyY2UoY29udGV4dC5jcmVhdGVNYXJzaGFsbGVyKCksIGpheGIpOwotCi0gICAgICAgIC8vIENyZWF0ZSBhIEJsb2NrIHVzaW5nIHRoZSBzYW1wbGUgc3RyaW5nIGFzIHRoZSBjb250ZW50LiAgVGhpcyBzaW11bGF0ZXMKLSAgICAgICAgLy8gd2hhdCBvY2N1cnMgb24gdGhlIG91dGJvdW5kIEpBWC1XUyBkaXNwYXRjaDxTb3VyY2U+IGNsaWVudAotICAgICAgICBCbG9jayBibG9jayA9IGYuY3JlYXRlRnJvbShzcmMsIG51bGwsIG51bGwpOwotCi0gICAgICAgIC8vIFdlIGRpZG4ndCBwYXNzIGluIGEgcW5hbWUsIHNvIHRoZSBmb2xsb3dpbmcgc2hvdWxkIHJldHVybiBmYWxzZQotICAgICAgICBhc3NlcnRUcnVlKCFibG9jay5pc1FOYW1lQXZhaWxhYmxlKCkpOwotCi0gICAgICAgIC8vIEFzc3VtaW5nIG5vIGhhbmRsZXJzIGFyZSBpbnN0YWxsZWQsIHRoZSBuZXh0IHRoaW5nIHRoYXQgd2lsbCBoYXBwZW4KLSAgICAgICAgLy8gaXMgYSBYTUxTdHJlYW1SZWFkZXIgd2lsbCBiZSByZXF1ZXN0ZWQuLi50byBnbyB0byBPTS4gICBBdCB0aGlzIHBvaW50IHRoZQotICAgICAgICAvLyBibG9jayBzaG91bGQgYmUgY29uc3VtZWQuCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlciByZWFkZXIgPSBibG9jay5nZXRYTUxTdHJlYW1SZWFkZXIodHJ1ZSk7Ci0KLSAgICAgICAgLy8gVGhlIGJsb2NrIHNob3VsZCBiZSBjb25zdW1lZAotICAgICAgICBhc3NlcnRUcnVlKGJsb2NrLmlzQ29uc3VtZWQoKSk7Ci0KLSAgICAgICAgLy8gVG8gY2hlY2sgdGhhdCB0aGUgb3V0cHV0IGlzIGNvcnJlY3QsIGdldCB0aGUgU3RyaW5nIGNvbnRlbnRzIG9mIHRoZSAKLSAgICAgICAgLy8gcmVhZGVyCi0gICAgICAgIFJlYWRlcjJXcml0ZXIgcjJ3ID0gbmV3IFJlYWRlcjJXcml0ZXIocmVhZGVyKTsKLSAgICAgICAgU3RyaW5nIG5ld1RleHQgPSByMncuZ2V0QXNTdHJpbmcoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShlY2hvU2FtcGxlLmVxdWFscyhuZXdUZXh0KSk7Ci0gICAgfQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIEJsb2NrIHJlcHJlc2VudGluZyBhIERPTVNvdXJjZSBpbnN0YW5jZSBhbmQgc2ltdWxhdGUgYW4gCi0gICAgICogb3V0Ym91bmQgZmxvdwotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdERPTVNvdXJjZU91dGZsb3coKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gR2V0IHRoZSBCbG9ja0ZhY3RvcnkKLSAgICAgICAgU291cmNlQmxvY2tGYWN0b3J5IGYgPSAoU291cmNlQmxvY2tGYWN0b3J5KQotICAgICAgICBGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShTb3VyY2VCbG9ja0ZhY3RvcnkuY2xhc3MpOwotCi0gICAgICAgIC8vIFR1cm4gdGhlIGNvbnRlbnQgaW50byBhIHN0cmVhbQotICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBiYWlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHNhbXBsZVRleHQuZ2V0Qnl0ZXMoKSk7Ci0KLSAgICAgICAgLy8gQ3JlYXRlIGEgRE9NIHRyZWUgZnJvbSB0aGUgc2FtcGxlIHRleHQKLSAgICAgICAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBkb21GYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICBkb21GYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOwotICAgICAgICBEb2N1bWVudEJ1aWxkZXIgZG9tQnVpbGRlciA9IGRvbUZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0gICAgICAgIERvY3VtZW50IGRvbVRyZWUgPSBkb21CdWlsZGVyLnBhcnNlKGJhaXMpOwotICAgICAgICBOb2RlIG5vZGUgPSBkb21UcmVlLmdldERvY3VtZW50RWxlbWVudCgpOwotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1Zyhub2RlLnRvU3RyaW5nKCkpOwotCi0gICAgICAgIC8vIENyZWF0ZSBhIERPTVNvdXJjZSBvYmplY3QgZnJvbSB0aGUgRE9NIHRyZWUKLSAgICAgICAgRE9NU291cmNlIGRzID0gbmV3IERPTVNvdXJjZShub2RlKTsKLSAgICAgICAgbm9kZSA9IGRzLmdldE5vZGUoKTsKLQotICAgICAgICAvLyBDcmVhdGUgYSBCbG9jayB1c2luZyB0aGUgc2FtcGxlIHN0cmluZyBhcyB0aGUgY29udGVudC4gIFRoaXMgc2ltdWxhdGVzCi0gICAgICAgIC8vIHdoYXQgb2NjdXJzIG9uIHRoZSBvdXRib3VuZCBKQVgtV1MgZGlzcGF0Y2g8U291cmNlPiBjbGllbnQKLSAgICAgICAgQmxvY2sgYmxvY2sgPSBmLmNyZWF0ZUZyb20oZHMsIG51bGwsIG51bGwpOwotCi0gICAgICAgIC8vIFdlIGRpZG4ndCBwYXNzIGluIGEgcW5hbWUsIHNvIHRoZSBmb2xsb3dpbmcgc2hvdWxkIHJldHVybiBmYWxzZQotICAgICAgICBhc3NlcnRUcnVlKCFibG9jay5pc1FOYW1lQXZhaWxhYmxlKCkpOwotCi0gICAgICAgIC8vIEFzc3VtaW5nIG5vIGhhbmRsZXJzIGFyZSBpbnN0YWxsZWQsIHRoZSBuZXh0IHRoaW5nIHRoYXQgd2lsbCBoYXBwZW4KLSAgICAgICAgLy8gaXMgYSBYTUxTdHJlYW1SZWFkZXIgd2lsbCBiZSByZXF1ZXN0ZWQuLi50byBnbyB0byBPTS4gICBBdCB0aGlzIHBvaW50IHRoZQotICAgICAgICAvLyBibG9jayBzaG91bGQgYmUgY29uc3VtZWQuCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlciByZWFkZXIgPSBibG9jay5nZXRYTUxTdHJlYW1SZWFkZXIodHJ1ZSk7Ci0KLSAgICAgICAgLy8gVGhlIGJsb2NrIHNob3VsZCBiZSBjb25zdW1lZAotICAgICAgICBhc3NlcnRUcnVlKGJsb2NrLmlzQ29uc3VtZWQoKSk7Ci0KLSAgICAgICAgLy8gVG8gY2hlY2sgdGhhdCB0aGUgb3V0cHV0IGlzIGNvcnJlY3QsIGdldCB0aGUgU3RyaW5nIGNvbnRlbnRzIG9mIHRoZSAKLSAgICAgICAgLy8gcmVhZGVyCi0gICAgICAgIFJlYWRlcjJXcml0ZXIgcjJ3ID0gbmV3IFJlYWRlcjJXcml0ZXIocmVhZGVyKTsKLSAgICAgICAgU3RyaW5nIG5ld1RleHQgPSByMncuZ2V0QXNTdHJpbmcoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShzYW1wbGVUZXh0LmVxdWFscyhuZXdUZXh0KSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgQmxvY2sgcmVwcmVzZW50aW5nIGEgU0FYU291cmNlIGluc3RhbmNlIGFuZCBzaW11bGF0ZSBhbiAKLSAgICAgKiBvdXRib3VuZCBmbG93Ci0gICAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U0FYU291cmNlT3V0ZmxvdygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBHZXQgdGhlIEJsb2NrRmFjdG9yeQotICAgICAgICBTb3VyY2VCbG9ja0ZhY3RvcnkgZiA9IChTb3VyY2VCbG9ja0ZhY3RvcnkpCi0gICAgICAgIEZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KFNvdXJjZUJsb2NrRmFjdG9yeS5jbGFzcyk7Ci0KLSAgICAgICAgLy8gQ3JlYXRlIGEgU0FYU291cmNlIGZyb20gdGhlIHNhbXBsZSB0ZXh0Ci0gICAgICAgIGJ5dGVbXSBieXRlcyA9IHNhbXBsZVRleHQuZ2V0Qnl0ZXMoKTsKLSAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gc3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVzKTsKLSAgICAgICAgSW5wdXRTb3VyY2UgaW5wdXQgPSBuZXcgSW5wdXRTb3VyY2Uoc3RyZWFtKTsKLSAgICAgICAgU0FYU291cmNlIHNzID0gbmV3IFNBWFNvdXJjZShpbnB1dCk7Ci0KLSAgICAgICAgLy8gQ3JlYXRlIGEgQmxvY2sgdXNpbmcgdGhlIHNhbXBsZSBzdHJpbmcgYXMgdGhlIGNvbnRlbnQuICBUaGlzIHNpbXVsYXRlcwotICAgICAgICAvLyB3aGF0IG9jY3VycyBvbiB0aGUgb3V0Ym91bmQgSkFYLVdTIGRpc3BhdGNoPFNvdXJjZT4gY2xpZW50Ci0gICAgICAgIEJsb2NrIGJsb2NrID0gZi5jcmVhdGVGcm9tKHNzLCBudWxsLCBudWxsKTsKLQotICAgICAgICAvLyBXZSBkaWRuJ3QgcGFzcyBpbiBhIHFuYW1lLCBzbyB0aGUgZm9sbG93aW5nIHNob3VsZCByZXR1cm4gZmFsc2UKLSAgICAgICAgYXNzZXJ0VHJ1ZSghYmxvY2suaXNRTmFtZUF2YWlsYWJsZSgpKTsKLQotICAgICAgICAvLyBBc3N1bWluZyBubyBoYW5kbGVycyBhcmUgaW5zdGFsbGVkLCB0aGUgbmV4dCB0aGluZyB0aGF0IHdpbGwgaGFwcGVuCi0gICAgICAgIC8vIGlzIGEgWE1MU3RyZWFtUmVhZGVyIHdpbGwgYmUgcmVxdWVzdGVkLi4udG8gZ28gdG8gT00uICAgQXQgdGhpcyBwb2ludCB0aGUKLSAgICAgICAgLy8gYmxvY2sgc2hvdWxkIGJlIGNvbnN1bWVkLgotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyID0gYmxvY2suZ2V0WE1MU3RyZWFtUmVhZGVyKHRydWUpOwotCi0gICAgICAgIC8vIFRoZSBibG9jayBzaG91bGQgYmUgY29uc3VtZWQKLSAgICAgICAgYXNzZXJ0VHJ1ZShibG9jay5pc0NvbnN1bWVkKCkpOwotCi0gICAgICAgIC8vIFRvIGNoZWNrIHRoYXQgdGhlIG91dHB1dCBpcyBjb3JyZWN0LCBnZXQgdGhlIFN0cmluZyBjb250ZW50cyBvZiB0aGUgCi0gICAgICAgIC8vIHJlYWRlcgotICAgICAgICBSZWFkZXIyV3JpdGVyIHIydyA9IG5ldyBSZWFkZXIyV3JpdGVyKHJlYWRlcik7Ci0gICAgICAgIFN0cmluZyBuZXdUZXh0ID0gcjJ3LmdldEFzU3RyaW5nKCk7Ci0gICAgICAgIGFzc2VydFRydWUoc2FtcGxlVGV4dC5lcXVhbHMobmV3VGV4dCkpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvRmF1bHRUZXN0cy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvRmF1bHRUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDY2ZWU2Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL0ZhdWx0VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuaW1wbC5idWlsZGVyLlN0QVhTT0FQTW9kZWxCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5mYWN0b3J5LkJsb2NrRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZmFjdG9yeS5NZXNzYWdlRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZmFjdG9yeS5Tb3VyY2VCbG9ja0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5yZWdpc3RyeS5GYWN0b3J5UmVnaXN0cnk7Ci0KLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTElucHV0RmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdDsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotCi0vKioKLSAqIE1lc3NhZ2VUZXN0cwotICogVGVzdHMgdG8gY3JlYXRlIGFuZCB2YWxpZGF0ZSBNZXNzYWdlIHByb2Nlc3NpbmcKLSAqIFRoZXNlIGFyZSBub3QgY2xpZW50L3NlcnZlciB0ZXN0cy4KLSAqLwotcHVibGljIGNsYXNzIEZhdWx0VGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgZmF1bHRTdHJpbmcgPSAiSW50ZXJuYWwgc2VydmVyIGVycm9yIGZyb20gV0FTIjsKLQkKLQkvLyBTdHJpbmcgdGVzdCB2YXJpYWJsZXMKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgc2FtcGxlU09BUDExRmF1bHRFbnZlbG9wZTEgPSAKLQkJIjxzb2FwZW52OkVudmVsb3BlIHhtbG5zOnNvYXBlbnY9XCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlL1wiPiIKLQkJKyAiPHNvYXBlbnY6Qm9keT4iCi0JCSsgIjxzb2FwZW52OkZhdWx0PiIKLQkJKyAiPGZhdWx0Y29kZT5zb2FwZW52OlNlcnZlcjwvZmF1bHRjb2RlPiIKLQkJKyAiPGZhdWx0c3RyaW5nPiIgKyBmYXVsdFN0cmluZyArICJzYW1wbGVTT0FQMTFGYXVsdEVudmVsb3BlMTwvZmF1bHRzdHJpbmc+IgotCQkrICI8L3NvYXBlbnY6RmF1bHQ+IgotCQkrICI8L3NvYXBlbnY6Qm9keT4iCi0JCSsgIjwvc29hcGVudjpFbnZlbG9wZT4iOwotCQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBzYW1wbGVTT0FQMTFGYXVsdEVudmVsb3BlMiA9Ci0gICAgICAgICI8c29hcGVudjpFbnZlbG9wZSB4bWxuczpzb2FwZW52PVwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS9cIiIgKwotICAgICAgICAiIHhtbG5zOnhzZD1cImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hXCIiICsKLQkJIiB4bWxuczp4c2k9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZVwiIiArCi0JCSIgeG1sbnM6Y3dtcD1cImh0dHA6Ly9jd21wLmNvbVwiPiIgKwotCQkiIDxzb2FwZW52OkhlYWRlcj4iICsKLQkJIiA8Y3dtcDpJRCBzb2FwZW52Om11c3RVbmRlcnN0YW5kPVwiMVwiPkhFQURFUklELTc4Njc2Nzg8L2N3bXA6SUQ+IiArCi0JCSIgPC9zb2FwZW52OkhlYWRlcj4iICsKLQkJIiA8c29hcGVudjpCb2R5PiIgKwotCQkiIDxzb2FwZW52OkZhdWx0PiIgKwotCQkiIDxmYXVsdGNvZGU+c29hcGVudjpDbGllbnQ8L2ZhdWx0Y29kZT4iICsKLQkJIiA8ZmF1bHRzdHJpbmc+IiArIGZhdWx0U3RyaW5nICsgInNhbXBsZVNPQVAxMUZhdWx0RW52ZWxvcGUyPC9mYXVsdHN0cmluZz4iICsKLQkJIiA8ZmF1bHRhY3Rvcj5odHRwOi8vZ2l6bW9zLmNvbS9vcmRlcjwvZmF1bHRhY3Rvcj4iICsKLQkJIiA8ZGV0YWlsPiIgKwotCQkiIDxjd21wOkZhdWx0PiIgKwotCQkiIDxjd21wOkZhdWx0Q29kZT5UaGlzIGlzIHRoZSBmYXVsdCBjb2RlPC9jd21wOkZhdWx0Q29kZT4iICsKLQkJIiA8Y3dtcDpGYXVsdFN0cmluZz5GYXVsdCBNZXNzYWdlPC9jd21wOkZhdWx0U3RyaW5nPiIgKwotCQkiIDxjd21wOk1lc3NhZ2U+VGhpcyBpcyBhIHRlc3QgZmF1bHQ8L2N3bXA6TWVzc2FnZT4iICsKLQkJIiA8L2N3bXA6RmF1bHQ+IiArCi0JCSIgPC9kZXRhaWw+IiArIC8qKi8KLQkJIiA8L3NvYXBlbnY6RmF1bHQ+IiArCi0JCSIgPC9zb2FwZW52OkJvZHk+IiArCi0JCSIgPC9zb2FwZW52OkVudmVsb3BlPiI7Ci0JCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIHNhbXBsZVNPQVAxMkZhdWx0RW52ZWxvcGUxID0KLSAgICAgICAgLy8iPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4iCi0gICAgICAgICI8ZW52OkVudmVsb3BlIHhtbG5zOmVudj1cImh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZVwiPiIKLSAgICAgICAgKyAiPGVudjpCb2R5PiIKLSAgICAgICAgKyAiPGVudjpGYXVsdD4iCi0gICAgICAgICsgIjxlbnY6Q29kZT48ZW52OlZhbHVlPmVudjpSZWNlaXZlcjwvZW52OlZhbHVlPjwvZW52OkNvZGU+IgotICAgICAgICArICI8ZW52OlJlYXNvbj48ZW52OlRleHQgbGFuZz1cIiIrIExvY2FsZS5nZXREZWZhdWx0KCkuZ2V0TGFuZ3VhZ2UoKSArIlwiPiIKLSAgICAgICAgKyBmYXVsdFN0cmluZyArICJzYW1wbGVTT0FQMTJGYXVsdEVudmVsb3BlMTwvZW52OlRleHQ+PC9lbnY6UmVhc29uPiIKLSAgICAgICAgKyAiPC9lbnY6RmF1bHQ+IgotICAgICAgICArICI8L2VudjpCb2R5PiIKLSAgICAgICAgKyAiPC9lbnY6RW52ZWxvcGU+IjsKLSAgICAKLSAgICAvLyBtaXNzaW5nIG5hbWVzcGFjZSBmb3IgZmF1bHRjb2RlIHZhbHVlCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIHNhbXBsZVNPQVAxMkZhdWx0RW52ZWxvcGUyID0KLSAgICAgICAgLy8iPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4iCi0gICAgICAgICI8ZW52OkVudmVsb3BlIHhtbG5zOmVudj1cImh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZVwiPiIKLSAgICAgICAgKyAiPGVudjpCb2R5PiIKLSAgICAgICAgKyAiPGVudjpGYXVsdD4iCi0gICAgICAgICsgIjxlbnY6Q29kZT48ZW52OlZhbHVlPlNlbmRlcjwvZW52OlZhbHVlPjwvZW52OkNvZGU+IgotICAgICAgICArICI8ZW52OlJlYXNvbj48ZW52OlRleHQgbGFuZz1cIiIrIExvY2FsZS5nZXREZWZhdWx0KCkuZ2V0TGFuZ3VhZ2UoKSArIlwiPiIKLSAgICAgICAgKyBmYXVsdFN0cmluZyArICJzYW1wbGVTT0FQMTJGYXVsdEVudmVsb3BlMjwvZW52OlRleHQ+PC9lbnY6UmVhc29uPiIKLSAgICAgICAgKyAiPC9lbnY6RmF1bHQ+IgotICAgICAgICArICI8L2VudjpCb2R5PiIKLSAgICAgICAgKyAiPC9lbnY6RW52ZWxvcGU+IjsKLSAgICAKLQlwcml2YXRlIHN0YXRpYyBYTUxJbnB1dEZhY3RvcnkgaW5wdXRGYWN0b3J5ID0gWE1MSW5wdXRGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0JCi0JcHVibGljIEZhdWx0VGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEZhdWx0VGVzdHMoU3RyaW5nIGFyZzApIHsKLQkJc3VwZXIoYXJnMCk7Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgdGVzdCBlZmZlY3RpdmVseSB0ZXN0cyBYTUxGYXVsdCBjb25zdHJ1Y3Rpb24gZnJvbQotCSAqIAotCSAqIG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmF1bHQgc29hcGZhdWx0LCBMaXN0PEJsb2NrPiBkZXRhaWxCbGtzCi0JICogCi0JICogd2hpY2ggaXMgYSBjbGllbnQtc2lkZSBvcGVyYXRpb24uICBBbHNvIHRlc3RzIHRoZSAic2VyaWFsaXphdGlvbiIgb2YgdGhlCi0JICogWE1MRmF1bHQgb2JqZWN0IGludG8gYSBNZXNzYWdlIG9iamVjdCB3aGljaCBpcyBhIHNlcnZlci1zaWRlIG9wZXJhdGlvbi4KLQkgKiAKLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgotCSAqLwotCi0JcHVibGljIHZvaWQgdGVzdFN0cmluZ0luZmxvdzEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCi0JCXRyeSB7Ci0JCS8vIE9uIGluYm91bmQsIHRoZXJlIHdpbGwgYWxyZWFkeSBiZSBhbiBPTQotCQkvLyB3aGljaCByZXByZXNlbnRzIHRoZSBtZXNzYWdlLiAgVGhlIGZvbGxvd2luZyBjb2RlIHNpbXVsYXRlcyB0aGUgaW5wdXQKLQkJLy8gT00KLQkJU3RyaW5nUmVhZGVyIHNyID0gbmV3IFN0cmluZ1JlYWRlcihzYW1wbGVTT0FQMTFGYXVsdEVudmVsb3BlMSk7Ci0JCVhNTFN0cmVhbVJlYWRlciBpbmZsb3cgPSBpbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKHNyKTsKLQkJU3RBWFNPQVBNb2RlbEJ1aWxkZXIgYnVpbGRlciA9IG5ldyBTdEFYU09BUE1vZGVsQnVpbGRlcihpbmZsb3csIG51bGwpOwotCQlPTUVsZW1lbnQgb21FbGVtZW50ID0gYnVpbGRlci5nZXRTT0FQRW52ZWxvcGUoKTsKLQkJCi0JCS8vIFRoZSBKQVgtV1MgbGF5ZXIgY3JlYXRlcyBhIE1lc3NhZ2UgZnJvbSB0aGUgT00KLQkJTWVzc2FnZUZhY3RvcnkgbWYgPSAoTWVzc2FnZUZhY3RvcnkpCi0JCQlGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShNZXNzYWdlRmFjdG9yeS5jbGFzcyk7Ci0JCU1lc3NhZ2UgbSA9IG1mLmNyZWF0ZUZyb20ob21FbGVtZW50LCBudWxsKTsKLQkJCi0JCWFzc2VydFRydWUobS5pc0ZhdWx0KCkpOwotCQkKLQkJaWYgKG0uaXNGYXVsdCgpKSB7Ci0JCQlYTUxGYXVsdCB4ID0gbS5nZXRYTUxGYXVsdCgpOwotCQkJYXNzZXJ0RXF1YWxzKGZhdWx0U3RyaW5nICsgInNhbXBsZVNPQVAxMUZhdWx0RW52ZWxvcGUxIiwgeC5nZXRSZWFzb24oKS5nZXRUZXh0KCkpOwotCQkJYXNzZXJ0RXF1YWxzKCJTZXJ2ZXIiLCB4LmdldENvZGUoKS4KLSAgICAgICAgICAgICAgICAgICAgdG9RTmFtZSgiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iKS5nZXRMb2NhbFBhcnQoKSk7Ci0JCX0gZWxzZSB7Ci0JCQlmYWlsKCJNZXNzYWdlIHNob3VsZCBiZSBtYXJrZWQgYXMgYSBmYXVsdC4iKTsKLQkJfQotCQkKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlmYWlsKGUudG9TdHJpbmcoKSk7Ci0JCX0KLQotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nSW5mbG93MigpIHRocm93cyBFeGNlcHRpb24gewotCi0JCXRyeSB7Ci0JCQkvLyBPbiBpbmJvdW5kLCB0aGVyZSB3aWxsIGFscmVhZHkgYmUgYW4gT00KLQkJCS8vIHdoaWNoIHJlcHJlc2VudHMgdGhlIG1lc3NhZ2UuIFRoZSBmb2xsb3dpbmcgY29kZSBzaW11bGF0ZXMgdGhlCi0JCQkvLyBpbnB1dAotCQkJLy8gT00KLQkJCVN0cmluZ1JlYWRlciBzciA9IG5ldyBTdHJpbmdSZWFkZXIoc2FtcGxlU09BUDExRmF1bHRFbnZlbG9wZTIpOwotCQkJWE1MU3RyZWFtUmVhZGVyIGluZmxvdyA9IGlucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoc3IpOwotCQkJU3RBWFNPQVBNb2RlbEJ1aWxkZXIgYnVpbGRlciA9IG5ldyBTdEFYU09BUE1vZGVsQnVpbGRlcihpbmZsb3csCi0JCQkJCW51bGwpOwotCQkJT01FbGVtZW50IG9tRWxlbWVudCA9IGJ1aWxkZXIuZ2V0U09BUEVudmVsb3BlKCk7Ci0KLQkJCS8vIFRoZSBKQVgtV1MgbGF5ZXIgY3JlYXRlcyBhIE1lc3NhZ2UgZnJvbSB0aGUgT00KLQkJCU1lc3NhZ2VGYWN0b3J5IG1mID0gKE1lc3NhZ2VGYWN0b3J5KSBGYWN0b3J5UmVnaXN0cnkKLQkJCQkJLmdldEZhY3RvcnkoTWVzc2FnZUZhY3RvcnkuY2xhc3MpOwotCQkJTWVzc2FnZSBtID0gbWYuY3JlYXRlRnJvbShvbUVsZW1lbnQsIG51bGwpOwotCi0JCQlhc3NlcnRUcnVlKG0uaXNGYXVsdCgpKTsKLQkJCQotCQkJaWYgKG0uaXNGYXVsdCgpKSB7Ci0JCQkJWE1MRmF1bHQgeCA9IG0uZ2V0WE1MRmF1bHQoKTsKLQkJCQlhc3NlcnRFcXVhbHMoZmF1bHRTdHJpbmcgKyAic2FtcGxlU09BUDExRmF1bHRFbnZlbG9wZTIiLCB4LmdldFJlYXNvbigpLmdldFRleHQoKSk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJDbGllbnQiLCB4LmdldENvZGUoKS4KLSAgICAgICAgICAgICAgICAgICAgICAgIHRvUU5hbWUoImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIikuZ2V0TG9jYWxQYXJ0KCkpOwotCQkJCQotCQkJCS8vIGRyaWxsIGRvd24gdG8gdGhlIGZhdWx0Y29kZSB0ZXh0IGluIHRoZSBkZXRhaWwgdG8gbWFrZSBzdXJlIGl0J3MgdGhlcmUgYW5kIGl0J3Mgc2V0Ci0JCQkJQmxvY2tbXSBibG9ja3MgPSB4LmdldERldGFpbEJsb2NrcygpOwotCQkJCUJsb2NrIGJsb2NrID0gYmxvY2tzWzBdOwotCQkJCU9NRWxlbWVudCBlbGVtZW50ID0gYmxvY2suZ2V0T01FbGVtZW50KCk7Ci0JCQkJT01FbGVtZW50IGNoaWxkID0gKE9NRWxlbWVudCllbGVtZW50LmdldENoaWxkRWxlbWVudHMoKS5uZXh0KCk7Ci0JCQkJU3RyaW5nIHRleHQgPSBjaGlsZC5nZXRUZXh0KCk7Ci0JCQkJCi0JCQkJCi0JCQkJYXNzZXJ0RXF1YWxzKCJUaGlzIGlzIHRoZSBmYXVsdCBjb2RlIiwgdGV4dCk7Ci0JCQl9IGVsc2UgewotCQkJCWZhaWwoIk1lc3NhZ2Ugc2hvdWxkIGJlIG1hcmtlZCBhcyBhIGZhdWx0LiIpOwotCQkJfQotCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJZmFpbChlLnRvU3RyaW5nKCkpOwotCQl9Ci0KLQl9Ci0JCi0JLyoqCi0JICogVGhpcyB0ZXN0IGVmZmVjdGl2ZWx5IHRlc3RzIFhNTEZhdWx0IGNvbnN0cnVjdGlvbiBmcm9tCi0JICogCi0JICogb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYXVsdCBzb2FwZmF1bHQsIExpc3Q8QmxvY2s+IGRldGFpbEJsa3MKLQkgKiAKLQkgKiB3aGljaCBpcyBhIGNsaWVudC1zaWRlIG9wZXJhdGlvbi4gIEFsc28gdGVzdHMgdGhlICJzZXJpYWxpemF0aW9uIiBvZiB0aGUKLQkgKiBYTUxGYXVsdCBvYmplY3QgaW50byBhIE1lc3NhZ2Ugb2JqZWN0IHdoaWNoIGlzIGEgc2VydmVyLXNpZGUgb3BlcmF0aW9uLgotCSAqIAotCSAqIEB0aHJvd3MgRXhjZXB0aW9uCi0JICovCi0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nSW5mbG93MygpIHRocm93cyBFeGNlcHRpb24gewotCQkKLQkJdHJ5IHsKLQkJLy8gT24gaW5ib3VuZCwgdGhlcmUgd2lsbCBhbHJlYWR5IGJlIGFuIE9NCi0JCS8vIHdoaWNoIHJlcHJlc2VudHMgdGhlIG1lc3NhZ2UuICBUaGUgZm9sbG93aW5nIGNvZGUgc2ltdWxhdGVzIHRoZSBpbnB1dAotCQkvLyBPTQotCQlTdHJpbmdSZWFkZXIgc3IgPSBuZXcgU3RyaW5nUmVhZGVyKHNhbXBsZVNPQVAxMkZhdWx0RW52ZWxvcGUxKTsKLQkJWE1MU3RyZWFtUmVhZGVyIGluZmxvdyA9IGlucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoc3IpOwotCQlTdEFYU09BUE1vZGVsQnVpbGRlciBidWlsZGVyID0gbmV3IFN0QVhTT0FQTW9kZWxCdWlsZGVyKGluZmxvdywgbnVsbCk7Ci0JCU9NRWxlbWVudCBvbUVsZW1lbnQgPSBidWlsZGVyLmdldFNPQVBFbnZlbG9wZSgpOwotCQkKLQkJLy8gVGhlIEpBWC1XUyBsYXllciBjcmVhdGVzIGEgTWVzc2FnZSBmcm9tIHRoZSBPTQotCQlNZXNzYWdlRmFjdG9yeSBtZiA9IChNZXNzYWdlRmFjdG9yeSkKLQkJCUZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KE1lc3NhZ2VGYWN0b3J5LmNsYXNzKTsKLQkJTWVzc2FnZSBtID0gbWYuY3JlYXRlRnJvbShvbUVsZW1lbnQsIG51bGwpOwotCQkKLQkJYXNzZXJ0VHJ1ZShtLmlzRmF1bHQoKSk7Ci0JCQotCQlpZiAobS5pc0ZhdWx0KCkpIHsKLQkJCVhNTEZhdWx0IHggPSBtLmdldFhNTEZhdWx0KCk7Ci0JCQlhc3NlcnRFcXVhbHMoZmF1bHRTdHJpbmcgKyAic2FtcGxlU09BUDEyRmF1bHRFbnZlbG9wZTEiLCB4LmdldFJlYXNvbigpLmdldFRleHQoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlJlY2VpdmVyIiwgeC5nZXRDb2RlKCkuCi0gICAgICAgICAgICAgICAgICAgIHRvUU5hbWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZSIpLmdldExvY2FsUGFydCgpKTsKLQkJfSBlbHNlIHsKLQkJCWZhaWwoIk1lc3NhZ2Ugc2hvdWxkIGJlIG1hcmtlZCBhcyBhIGZhdWx0LiIpOwotCQl9Ci0JCQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCWZhaWwoZS50b1N0cmluZygpKTsKLQkJfQotCX0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nSW5mbG93NCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgLy8gT24gaW5ib3VuZCwgdGhlcmUgd2lsbCBhbHJlYWR5IGJlIGFuIE9NCi0gICAgICAgIC8vIHdoaWNoIHJlcHJlc2VudHMgdGhlIG1lc3NhZ2UuICBUaGUgZm9sbG93aW5nIGNvZGUgc2ltdWxhdGVzIHRoZSBpbnB1dAotICAgICAgICAvLyBPTQotICAgICAgICBTdHJpbmdSZWFkZXIgc3IgPSBuZXcgU3RyaW5nUmVhZGVyKHNhbXBsZVNPQVAxMkZhdWx0RW52ZWxvcGUyKTsKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIGluZmxvdyA9IGlucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoc3IpOwotICAgICAgICBTdEFYU09BUE1vZGVsQnVpbGRlciBidWlsZGVyID0gbmV3IFN0QVhTT0FQTW9kZWxCdWlsZGVyKGluZmxvdywgbnVsbCk7Ci0gICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSBidWlsZGVyLmdldFNPQVBFbnZlbG9wZSgpOwotICAgICAgICAKLSAgICAgICAgLy8gVGhlIEpBWC1XUyBsYXllciBjcmVhdGVzIGEgTWVzc2FnZSBmcm9tIHRoZSBPTQotICAgICAgICBNZXNzYWdlRmFjdG9yeSBtZiA9IChNZXNzYWdlRmFjdG9yeSkKLSAgICAgICAgICAgIEZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KE1lc3NhZ2VGYWN0b3J5LmNsYXNzKTsKLSAgICAgICAgTWVzc2FnZSBtID0gbWYuY3JlYXRlRnJvbShvbUVsZW1lbnQsIG51bGwpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0VHJ1ZShtLmlzRmF1bHQoKSk7Ci0gICAgICAgIAotICAgICAgICBpZiAobS5pc0ZhdWx0KCkpIHsKLSAgICAgICAgICAgIFhNTEZhdWx0IHggPSBtLmdldFhNTEZhdWx0KCk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoZmF1bHRTdHJpbmcgKyAic2FtcGxlU09BUDEyRmF1bHRFbnZlbG9wZTIiLCB4LmdldFJlYXNvbigpLmdldFRleHQoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlNlbmRlciIsIHguZ2V0Q29kZSgpLgotICAgICAgICAgICAgICAgICAgICB0b1FOYW1lKCJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUiKS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmYWlsKCJNZXNzYWdlIHNob3VsZCBiZSBtYXJrZWQgYXMgYSBmYXVsdC4iKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICBmYWlsKGUudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdEdldFNPQVAxMVhNTEZhdWx0QXNPTSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBNZXNzYWdlRmFjdG9yeSBmYWN0b3J5ID0gKE1lc3NhZ2VGYWN0b3J5KSBGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShNZXNzYWdlRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgIE1lc3NhZ2UgbXNnID0gZmFjdG9yeS5jcmVhdGUoUHJvdG9jb2wuc29hcDExKTsKLQotICAgICAgICBYTUxGYXVsdFJlYXNvbiByZWFzb24gPSBuZXcgWE1MRmF1bHRSZWFzb24oInNhbXBsZSBmYXVsdCByZWFzb24iKTsKLSAgICAgICAgWE1MRmF1bHQgZmF1bHQgPSBuZXcgWE1MRmF1bHQoWE1MRmF1bHRDb2RlLlNFTkRFUiwgcmVhc29uKTsKLSAgICAgICAgbXNnLnNldFhNTEZhdWx0KGZhdWx0KTsKLSAgICAgICAgCi0gICAgICAgIE9NRWxlbWVudCBvbSA9IG1zZy5nZXRBc09NRWxlbWVudCgpOwotICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgb20uc2VyaWFsaXplQW5kQ29uc3VtZShiYW9zKTsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBlbnYgPSBuZXcgU3RyaW5nKGJhb3MudG9CeXRlQXJyYXkoKSk7Ci0gICAgICAgIGFzc2VydFRydWUoZW52LmluZGV4T2YoImZhdWx0Y29kZSIpID4gMCk7Ci0gICAgICAgIGFzc2VydFRydWUoZW52LmluZGV4T2YoImZhdWx0c3RyaW5nIikgPiAwKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdEdldFNPQVAxMVhNTEZhdWx0QXNCbG9jaygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBNZXNzYWdlRmFjdG9yeSBmYWN0b3J5ID0gKE1lc3NhZ2VGYWN0b3J5KSBGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShNZXNzYWdlRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgIE1lc3NhZ2UgbXNnID0gZmFjdG9yeS5jcmVhdGUoUHJvdG9jb2wuc29hcDExKTsKLQotICAgICAgICBYTUxGYXVsdFJlYXNvbiByZWFzb24gPSBuZXcgWE1MRmF1bHRSZWFzb24oInNhbXBsZSBmYXVsdCByZWFzb24iKTsKLSAgICAgICAgWE1MRmF1bHQgZmF1bHQgPSBuZXcgWE1MRmF1bHQoWE1MRmF1bHRDb2RlLlNFTkRFUiwgcmVhc29uKTsKLSAgICAgICAgbXNnLnNldFhNTEZhdWx0KGZhdWx0KTsKLSAgICAgICAgCi0gICAgICAgIEJsb2NrRmFjdG9yeSBiZiA9IChCbG9ja0ZhY3RvcnkpIEZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KFNvdXJjZUJsb2NrRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgIEJsb2NrIGIgPSBtc2cuZ2V0Qm9keUJsb2NrKG51bGwsIGJmKTsKLSAgICAgICAgCi0gICAgICAgIFNvdXJjZSBjb250ZW50ID0gKFNvdXJjZSkgYi5nZXRCdXNpbmVzc09iamVjdCh0cnVlKTsKLSAgICAgICAgYnl0ZVtdIGJ5dGVzID0gX2dldEJ5dGVzKGNvbnRlbnQpOwotICAgICAgICBTdHJpbmcgZmF1bHRDb250ZW50ID0gbmV3IFN0cmluZyhieXRlcyk7Ci0gICAgICAgIAotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIj4+IGZhdWx0IGNvbnRlbnQ6ICIgKyBmYXVsdENvbnRlbnQpOyAKLSAgICAgICAgYXNzZXJ0VHJ1ZShmYXVsdENvbnRlbnQuaW5kZXhPZigiZmF1bHRjb2RlIikgPiAwKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShmYXVsdENvbnRlbnQuaW5kZXhPZigiZmF1bHRzdHJpbmciKSA+IDApOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIGJ5dGVbXSBfZ2V0Qnl0ZXMoU291cmNlIGlucHV0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgVHJhbnNmb3JtZXJGYWN0b3J5IHRmID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIFRyYW5zZm9ybWVyIHQgPSB0Zi5uZXdUcmFuc2Zvcm1lcigpOwotICAgICAgICAKLSAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgIFN0cmVhbVJlc3VsdCBvdXRwdXQgPSBuZXcgU3RyZWFtUmVzdWx0KGJhb3MpOwotICAgICAgICAKLSAgICAgICAgdC50cmFuc2Zvcm0oaW5wdXQsIG91dHB1dCk7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gYmFvcy50b0J5dGVBcnJheSgpOyAKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL0pBWEJDdXN0b21CdWlsZGVyVGVzdHMuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL0pBWEJDdXN0b21CdWlsZGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThlNjU5Zi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9KQVhCQ3VzdG9tQnVpbGRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5hbWVzcGFjZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTVNvdXJjZWRFbGVtZW50Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuYnVpbGRlci5TdEFYT01CdWlsZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFzb3VyY2UuamF4Yi5KQVhCQ3VzdG9tQnVpbGRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhc291cmNlLmpheGIuSkFYQkRTQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhc291cmNlLmpheGIuSkFYQkRhdGFTb3VyY2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5kYXRhYmluZGluZy5KQVhCVXRpbHM7DQotaW1wb3J0IHRlc3QuRWNob1N0cmluZzsNCi1pbXBvcnQgdGVzdC5PYmplY3RGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCQ29udGV4dDsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuTWFyc2hhbGxlcjsNCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxJbnB1dEZhY3Rvcnk7DQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MT3V0cHV0RmFjdG9yeTsNCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7DQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyOw0KLWltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsNCi1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7DQotaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0Ow0KLQ0KLS8qKg0KLSAqIFVuaXQgVGVzdGluZyBvZiBKQVhCQ3VzdG9tQnVpbGRlci4NCi0gKiANCi0gKiBBIEpBWEJDdXN0b21CdWlsZGVyIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBBeGlvbSBDdXN0b21CdWlsZGVyLg0KLSAqIFdoZW4gcmVnaXN0ZXJlZCBvbiBhIFN0QVhPTUJ1aWxkZXIsIHRoZSBidWlsZGVyIHdpbGwgZGVsZWdhdGUgdG8gDQotICogdGhlIEpBWEJDdXN0b21CdWlsZGVyIHdoZW4gdGhlIHBheWxvYWQgZWxlbWVudCBpcyBlbmNvdW50ZXJlZC4NCi0gKiANCi0gKiBUaGUgSkFYQkN1c3RvbUJ1aWxkZXIgd2lsbCBidWlsZCBhbiBPTVNvdXJjZWRFbGVtZW50IGJhY2tlZCBieSBhIEpBWEINCi0gKiBvYmplY3QgYW5kIHBsYWNlIGl0IGluIHRoZSBPTSB0cmVlLiAgVGhpcyBpcyBtdWNoIGZhc3RlciBhbmQgbW9yZQ0KLSAqIGVmZmljaWVudCB0aGFuIGJ1aWxkaW5nIGFuIGVudGlyZSBPTSB0cmVlLg0KLSAqIA0KLSAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuV3JhcFRlc3RzIGZvciBhbiBhY3R1YWwgdXNlIGNhc2UNCi0gKg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBKQVhCQ3VzdG9tQnVpbGRlclRlc3RzIGV4dGVuZHMgVGVzdENhc2Ugew0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBYTUxPdXRwdXRGYWN0b3J5IG91dHB1dEZhY3RvcnkgPSBYTUxPdXRwdXRGYWN0b3J5Lm5ld0luc3RhbmNlKCk7DQotICAgIHByaXZhdGUgc3RhdGljIFhNTElucHV0RmFjdG9yeSBpbnB1dEZhY3RvcnkgPSBYTUxJbnB1dEZhY3RvcnkubmV3SW5zdGFuY2UoKTsNCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0NCi0gICAgICAgIFRyZWVTZXQ8U3RyaW5nPiBjb250ZXh0UGFja2FnZXMgPSBuZXcgVHJlZVNldDxTdHJpbmc+KCk7DQotICAgICAgICBjb250ZXh0UGFja2FnZXMuYWRkKEVjaG9TdHJpbmcuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7DQotICAgICAgICAvKioNCi0gICAgICAgIC8vIFNldHVwOiBDcmVhdGUgYSBqYXhiIG9iamVjdA0KLSAgICAgICAgT2JqZWN0RmFjdG9yeSBmYWN0b3J5ID0gbmV3IE9iamVjdEZhY3RvcnkoKTsNCi0gICAgICAgIEVjaG9TdHJpbmcgamF4YiA9IGZhY3RvcnkuY3JlYXRlRWNob1N0cmluZygpOyANCi0gICAgICAgIGpheGIuc2V0SW5wdXQoIkhlbGxvIFdvcmxkIik7DQotICAgICAgICANCi0gICAgICAgIA0KLSAgICAgICAgSkFYQkNvbnRleHQgY29udGV4dCA9IEpBWEJVdGlscy5nZXRKQVhCQ29udGV4dChjb250ZXh0UGFja2FnZXMpOw0KLSAgICAgICAgICAgDQotICAgICAgICAvLyBXcml0ZSBvdXQgdGhlIHhtbA0KLSAgICAgICAgU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOw0KLSAgICAgICAgWE1MU3RyZWFtV3JpdGVyIHdyaXRlciA9IG91dHB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtV3JpdGVyKHN3KTsNCi0gICAgICAgIE1hcnNoYWxsZXIgbWFyc2hhbGxlciA9IEpBWEJVdGlscy5nZXRKQVhCTWFyc2hhbGxlcihjb250ZXh0KTsNCi0gICAgICAgIG1hcnNoYWxsZXIubWFyc2hhbChqYXhiLCB3cml0ZXIpOw0KLSAgICAgICAgSkFYQlV0aWxzLnJlbGVhc2VKQVhCTWFyc2hhbGxlcihjb250ZXh0LCBtYXJzaGFsbGVyKTsNCi0gICAgICAgIHdyaXRlci5mbHVzaCgpOw0KLSAgICAgICAgc3cuZmx1c2goKTsNCi0gICAgICAgIFN0cmluZyBvdXR0ZXh0ID0gc3cudG9TdHJpbmcoKTsNCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT1VUPSIgKyBvdXR0ZXh0KTsNCi0gICAgICAgIFN0cmluZ1JlYWRlciBzciA9IG5ldyBTdHJpbmdSZWFkZXIob3V0dGV4dCk7DQotICAgICAgICAqKi8NCi0gICAgICAgIA0KLSAgICAgICAgU3RyaW5nIGluVGV4dCA9ICI8cHJlOmVjaG9TdHJpbmcgeG1sbnM6cHJlPVwiaHR0cDovL3Rlc3RcIj48cHJlOmlucHV0PkhlbGxvIFdvcmxkPC9wcmU6aW5wdXQ+PC9wcmU6ZWNob1N0cmluZz4iOw0KLSAgICAgICAgU3RyaW5nUmVhZGVyIHNyID0gbmV3IFN0cmluZ1JlYWRlcihpblRleHQpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBSZWFkIHRoZSBzYW1wbGUgdGV4dCB1c2luZyBPTSBiYWNrZWQgYnkgU3RBWC4NCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlciBpbnB1dFJlYWRlciA9IGlucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoc3IpOw0KLSAgICAgICAgU3RBWE9NQnVpbGRlciBidWlsZGVyID0gbmV3IFN0QVhPTUJ1aWxkZXIoaW5wdXRSZWFkZXIpOyANCi0gICAgICAgIA0KLSAgICAgICAgLy8gQ3JlYXRlIHRoZSBKQVhCQ3VzdG9tQnVpbGRlcg0KLSAgICAgICAgSkFYQkRTQ29udGV4dCBqZHNDb250ZXh0ID0gbmV3IEpBWEJEU0NvbnRleHQoY29udGV4dFBhY2thZ2VzKTsNCi0gICAgICAgIEpBWEJDdXN0b21CdWlsZGVyIGpjYiA9IG5ldyBKQVhCQ3VzdG9tQnVpbGRlcihqZHNDb250ZXh0KTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gUmVnaXN0ZXIgdGhlIEpBWEJDdXN0b21CdWlsZGVyLi4udGhpcyB3aWxsIGludGVyY2VwdCB0aGUgcGF5bG9hZA0KLSAgICAgICAgLy8gYW5kIGJ1aWxkIGEgamF4YiBlbGVtZW50DQotICAgICAgICBidWlsZGVyLnJlZ2lzdGVyQ3VzdG9tQnVpbGRlckZvclBheWxvYWQoamNiKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gR2V0IHRoZSBPTSBlbGVtZW50DQotICAgICAgICBPTUVsZW1lbnQgb20gPSBidWlsZGVyLmdldERvY3VtZW50RWxlbWVudCgpOyAgDQotICAgICAgICANCi0gICAgICAgIC8vIFZlcmlmeSB0aGF0IHRoZSBPTSBFbGVtZW50IGlzIGJhY2tlZCBieSBhbiB1bm1hcnNoYWxsZWQgamF4YiBvYmplY3QNCi0gICAgICAgIGFzc2VydFRydWUob20gaW5zdGFuY2VvZiBPTVNvdXJjZWRFbGVtZW50KTsNCi0gICAgICAgIE9NRGF0YVNvdXJjZSBkcyA9ICgoT01Tb3VyY2VkRWxlbWVudCkgb20pLmdldERhdGFTb3VyY2UoKTsNCi0gICAgICAgIGFzc2VydFRydWUoZHMgaW5zdGFuY2VvZiBKQVhCRGF0YVNvdXJjZSk7DQotICAgICAgICBKQVhCRGF0YVNvdXJjZSBqYXhiRFMgPSAoSkFYQkRhdGFTb3VyY2UpIGRzOw0KLSAgICAgICAgT2JqZWN0IGpheGJPYmplY3QgPSBqYXhiRFMuZ2V0T2JqZWN0KCk7DQotICAgICAgICBhc3NlcnRUcnVlKGpheGJPYmplY3QgaW5zdGFuY2VvZiBFY2hvU3RyaW5nKTsNCi0gICAgICAgIEVjaG9TdHJpbmcgcmVzdWx0ID0gKEVjaG9TdHJpbmcpIGpheGJPYmplY3Q7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdC5nZXRJbnB1dCgpLmVxdWFscygiSGVsbG8gV29ybGQiKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBsb2NhbCBuYW1lIGNhbiBiZSBvYnRhaW5lZCB3aXRob3V0IGV4cGFuc2lvbg0KLSAgICAgICAgU3RyaW5nIGxvY2FsTmFtZSA9IG9tLmdldExvY2FsTmFtZSgpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiZWNob1N0cmluZyIuZXF1YWxzKGxvY2FsTmFtZSkpOw0KLSAgICAgICAgZHMgPSAoKE9NU291cmNlZEVsZW1lbnQpIG9tKS5nZXREYXRhU291cmNlKCk7DQotICAgICAgICBhc3NlcnRUcnVlKGRzICE9IG51bGwpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCB0aGUgbmFtZXNwYWNlIHVyaSBjYW4gYmUgb2J0YWluZWQgd2l0aG91dCBleHBhbnNpb24NCi0gICAgICAgIE9NTmFtZXNwYWNlIG9tTlMgPSBvbS5nZXROYW1lc3BhY2UoKTsNCi0gICAgICAgIFN0cmluZyB1cmkgPSBvbU5TLmdldE5hbWVzcGFjZVVSSSgpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiaHR0cDovL3Rlc3QiLmVxdWFscyAodXJpKSk7DQotICAgICAgICBkcyA9ICgoT01Tb3VyY2VkRWxlbWVudCkgb20pLmdldERhdGFTb3VyY2UoKTsNCi0gICAgICAgIGFzc2VydFRydWUoZHMgIT0gbnVsbCk7DQotICAgICAgICANCi0gICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgcHJlZml4IGlzIGNvbnNpc3RlbnQgd2l0aCB0aGUgb3V0cHV0DQotICAgICAgICBTdHJpbmcgcHJlZml4ID0gb21OUy5nZXRQcmVmaXgoKTsNCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihwcmVmaXgpOw0KLSAgICAgICAgU3RyaW5nIHRleHQgPSBvbS50b1N0cmluZygpOw0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHRleHQpOw0KLSAgICAgICAgU3RyaW5nIHNlYXJjaFN0cmluZyA9IChwcmVmaXggPT0gbnVsbCB8fCBwcmVmaXgubGVuZ3RoKCkgPT0gMCkgPyANCi0gICAgICAgICAgICAgICAgICAgICI8L2VjaG9TdHJpbmc+IiA6DQotICAgICAgICAgICAgICAgICAgICAiPC8iICsgcHJlZml4ICsgIjplY2hvU3RyaW5nPiI7DQotICAgICAgICBhc3NlcnRUcnVlKHRleHQuaW5kZXhPZihzZWFyY2hTdHJpbmcpID4gMCk7DQotICAgICAgICAgICAgDQotICAgIH0NCi0gICAgDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL01lc3NhZ2VQZXJzaXN0YW5jZVRlc3RzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9NZXNzYWdlUGVyc2lzdGFuY2VUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWM5NDY0Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL01lc3NhZ2VQZXJzaXN0YW5jZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NjMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BdHRhY2htZW50QWNjZXNzb3I7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU91dHB1dEZvcm1hdDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTVNvdXJjZWRFbGVtZW50Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NWE1MU3RyZWFtUmVhZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLnV0aWwuQ29weVV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEJvZHk7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50cy5Db25maWd1cmF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFzb3VyY2UuamF4Yi5KQVhCRGF0YVNvdXJjZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLk1lc3NhZ2VDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZGF0YWJpbmRpbmcuSkFYQkJsb2NrQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmRhdGFiaW5kaW5nLmltcGwuSkFYQkJsb2NrSW1wbDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmZhY3RvcnkuSkFYQkJsb2NrRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmZhY3RvcnkuTWVzc2FnZUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS51dGlsLk1lc3NhZ2VVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm92aWRlcmFwaS5EYXRhU291cmNlSW1wbDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5yZWdpc3RyeS5GYWN0b3J5UmVnaXN0cnk7DQotaW1wb3J0IG9yZy50ZXN0Lm10b20uSW1hZ2VEZXBvdDsNCi1pbXBvcnQgb3JnLnRlc3QubXRvbS5TZW5kSW1hZ2U7DQotaW1wb3J0IHRlc3QuRWNob1N0cmluZ1Jlc3BvbnNlOw0KLWltcG9ydCB0ZXN0Lk9iamVjdEZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXI7DQotaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRGF0YVNvdXJjZTsNCi1pbXBvcnQgamF2YXguaW1hZ2Vpby5JbWFnZUlPOw0KLWltcG9ydCBqYXZheC5pbWFnZWlvLnN0cmVhbS5GaWxlSW1hZ2VJbnB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YXguaW1hZ2Vpby5zdHJlYW0uSW1hZ2VJbnB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi0NCi1pbXBvcnQgamF2YS5hd3QuKjsNCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07DQotaW1wb3J0IGphdmEuaW8uRmlsZTsNCi1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07DQotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW07DQotDQotLyoqDQotICogVGhlc2UgdGVzdHMgc2ltdWxhdGUgdGhlIG91dGJvdW5kIHByb2Nlc3NpbmcgDQotICogZnJvbSBKQVgtV1Mgd2l0aCBNZXNzYWdlIFBlcnNpc3RhbmNlLiAgVGhlIHRlc3RzIHZhbGlkYXRlIHRoYXQgdGhlDQotICogbWVzc2FnZSBpcyBwcm9wZXJseSBjbG9uZWQvd3JpdHRlbi9yZWFkIGFuZCB0aGF0IHRoZSBPTSBpcyBub3QNCi0gKiB1bm5lY2Vzc2FyaWx5IGV4cGFuZGVkICh3aGljaCBpcyBhIHBlcmZvcm1hbmNlIGNvbmNlcm4pLg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBNZXNzYWdlUGVyc2lzdGFuY2VUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsNCi0NCi0gICAgRGF0YVNvdXJjZSBzdHJpbmdEUywgaW1hZ2VEUzsNCi0gICAgcHVibGljIFN0cmluZyBpbWFnZVJlc291cmNlRGlyID0gInRlc3QtcmVzb3VyY2VzIiArIEZpbGUuc2VwYXJhdG9yICsgImltYWdlIjsNCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgc2FtcGxlVGV4dCA9ICJTYW1wbGUgVGV4dCI7DQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFFOYW1lIFhPUF9JTkNMVURFID0gDQotICAgICAgICBuZXcgUU5hbWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgveG9wL2luY2x1ZGUiLCAiSW5jbHVkZSIpOw0KLSAgICANCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIHN1cGVyLnNldFVwKCk7DQotICAgICAgICAvLyBDcmVhdGUgYSBEYXRhU291cmNlIGZyb20gYSBTdHJpbmcNCi0gICAgICAgIHN0cmluZ0RTID0gbmV3IG9yZy5hcGFjaGUuYXhpb20uYXR0YWNobWVudHMuQnl0ZUFycmF5RGF0YVNvdXJjZShzYW1wbGVUZXh0LmdldEJ5dGVzKCksICJ0ZXh0L3BsYWluIik7DQotDQotICAgICAgICAvLyBDcmVhdGUgYSBEYXRhU291cmNlIGZyb20gYW4gaW1hZ2UgDQotICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShpbWFnZVJlc291cmNlRGlyICsgRmlsZS5zZXBhcmF0b3IgKyAidGVzdC5qcGciKTsNCi0gICAgICAgIEltYWdlSW5wdXRTdHJlYW0gZmlpcyA9IG5ldyBGaWxlSW1hZ2VJbnB1dFN0cmVhbShmaWxlKTsNCi0gICAgICAgIEltYWdlIGltYWdlID0gSW1hZ2VJTy5yZWFkKGZpaXMpOw0KLSAgICAgICAgaW1hZ2VEUyA9IG5ldyBEYXRhU291cmNlSW1wbCgiaW1hZ2UvanBlZyIsICJ0ZXN0LmpwZyIsIGltYWdlKTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIENyZWF0ZSBhIEpBWEJCbG9jayBjb250YWluaW5nIGEgSkFYLUIgYnVzaW5lc3Mgb2JqZWN0IGFuZCBzaW11bGF0ZSBhIG5vcm1hbCBEaXNwYXRjaDxPYmplY3Q+DQotICAgICAqIG91dHB1dCBmbG93DQotICAgICAqIA0KLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdFBlcnNpc3RfRmlsZSgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgDQotICAgICAgICAvLyBDcmVhdGUgdGhlIEpBWC1CIG9iamVjdCB0aGF0IGlzIHR5cGljYWwgZnJvbSBhIEpBWC1XUyBhcHANCi0gICAgICAgIFN0cmluZyBzYW1wbGVKQVhCVGV4dCA9ICJzYW1wbGUgcmV0dXJuIHZhbHVlIjsNCi0gICAgICAgIE9iamVjdEZhY3Rvcnkgb2YgPSBuZXcgT2JqZWN0RmFjdG9yeSgpOw0KLSAgICAgICAgRWNob1N0cmluZ1Jlc3BvbnNlIG9iaiA9IG9mLmNyZWF0ZUVjaG9TdHJpbmdSZXNwb25zZSgpOw0KLSAgICAgICAgb2JqLnNldEVjaG9TdHJpbmdSZXR1cm4oInNhbXBsZSByZXR1cm4gdmFsdWUiKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gVGhlIEpBWEIgb2JqZWN0IGlzIHN0b3JlZCBpbiB0aGUgQXhpb20gdHJlZSBhcyBhbiBPTVNvdXJjZWRFbGVtZW50Lg0KLSAgICAgICAgLy8gVGhlIHR5cGljYWwgc3RydWN0dXJlIGlzDQotICAgICAgICAvLyAgIE9NIFNPQVBFbnZlbG9wZQ0KLSAgICAgICAgLy8gICBPTSBTT0FQQm9keQ0KLSAgICAgICAgLy8gICBPTVNvdXJjZWRFbGVtZW50IHRoYXQgaXMgc291cmNlZCBieSBhIEpBWEJCbG9ja0ltcGwgd2hpY2ggaXMgYmFja2VjZCBieSBhIEpBWEIgT2JqZWN0Lg0KLSAgICAgICAgTWVzc2FnZSBtID0gY3JlYXRlTWVzc2FnZShvYmopOw0KLSAgICAgICAgDQotICAgICAgICAvLyBUaGUgTWVzc2FnZSBpcyBzZXQgb24gdGhlIEpBWFdTIE1lc3NhZ2VDb250ZXh0DQotICAgICAgICBNZXNzYWdlQ29udGV4dCBqYXh3c01DID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7DQotICAgICAgICBqYXh3c01DLnNldE1lc3NhZ2UobSk7DQotICAgICAgICANCi0gICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgbWVzc2FnZSBpcyBhIGZhdWx0LiBUaGUgZW5naW5lIHdpbGwgYWx3YXlzIGNhbGwgdGhpcyBtZXRob2QuDQotICAgICAgICAvLyBUaGUgTWVzc2FnZSBtdXN0IHJlc3BvbmQgYXBwcm9wcmlhdGVseSB3aXRob3V0IGRvaW5nIGEgY29udmVyc2lvbi4NCi0gICAgICAgIGJvb2xlYW4gaXNGYXVsdCA9IG0uaXNGYXVsdCgpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSghaXNGYXVsdCk7DQotICAgICAgICBhc3NlcnRUcnVlKCJYTUxQYXJ0IFJlcHJlc2VudGF0aW9uIGlzICIgKyBtLmdldFhNTFBhcnRDb250ZW50VHlwZSgpLA0KLSAgICAgICAgICAgICAgICAgICAiU1BJTkUiLmVxdWFscyhtLmdldFhNTFBhcnRDb250ZW50VHlwZSgpKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIFRoZSBKQVgtV1MgTWVzc2FnZUNvbnRleHQgaXMgY29udmVydGVkIGludG8gYW4gQXhpczIgTWVzc2FnZUNvbnRleHQNCi0gICAgICAgIG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dCBheGlzTUMgPSBqYXh3c01DLmdldEF4aXNNZXNzYWdlQ29udGV4dCgpOw0KLSAgICAgICAgTWVzc2FnZVV0aWxzLnB1dE1lc3NhZ2VPbk1lc3NhZ2VDb250ZXh0KG0sIGpheHdzTUMuZ2V0QXhpc01lc3NhZ2VDb250ZXh0KCkpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBBZGQgb3RoZXIgcHJvcGVydGllcyB0byB0aGUgTWVzc2FnZUNvbnRleHQNCi0gICAgICAgIGF4aXNNQy5zZXRQcm9wZXJ0eShDb25zdGFudHMuSkFYV1NfV0VCTUVUSE9EX0VYQ0VQVElPTiwgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCkpOw0KLSAgICAgICAgYXhpc01DLnNldFByb3BlcnR5KCJrZXlTdHJpbmciLCAidmFsdWVTdHJpbmciKTsNCi0gICAgICAgIGF4aXNNQy5zZXRQcm9wZXJ0eSgia2V5SW50ZWdlciIsIG5ldyBJbnRlZ2VyKDUpKTsNCi0gICAgICAgIA0KLSAgICAgICAgDQotICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIEF4aW9tIHN0cnVjdHVyZSBpcyBpbnRhY3QNCi0gICAgICAgIFNPQVBFbnZlbG9wZSBlbnYgPSBheGlzTUMuZ2V0RW52ZWxvcGUoKTsNCi0gICAgICAgIFNPQVBCb2R5IGJvZHkgPSBlbnYuZ2V0Qm9keSgpOw0KLSAgICAgICAgT01FbGVtZW50IGNoaWxkID0gYm9keS5nZXRGaXJzdEVsZW1lbnQoKTsNCi0gICAgICAgIGFzc2VydFRydWUoY2hpbGQgaW5zdGFuY2VvZiBPTVNvdXJjZWRFbGVtZW50KTsNCi0gICAgICAgIE9NU291cmNlZEVsZW1lbnQgb21zZSA9IChPTVNvdXJjZWRFbGVtZW50KSBjaGlsZDsNCi0gICAgICAgIGFzc2VydFRydWUoIW9tc2UuaXNFeHBhbmRlZCgpKTsNCi0gICAgICAgIE9NRGF0YVNvdXJjZSBkcyA9IG9tc2UuZ2V0RGF0YVNvdXJjZSgpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShkcyBpbnN0YW5jZW9mIEpBWEJCbG9ja0ltcGwpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBOb3cgc2ltdWxhdGUgcGVyc2lzdGluZyB0aGUgbWVzc2FnZQ0KLSAgICAgICAgRmlsZSB0aGVGaWxlID0gbnVsbDsNCi0gICAgICAgIFN0cmluZyB0aGVGaWxlbmFtZSA9IG51bGw7DQotICAgICAgICB0aGVGaWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgiTWVzc2FnZVBlcnNpc3RUZXN0IiwgbnVsbCk7DQotICAgICAgICAvL3RoZUZpbGUuZGVsZXRlT25FeGl0KCk7DQotICAgICAgICB0aGVGaWxlbmFtZSA9IHRoZUZpbGUuZ2V0TmFtZSgpOw0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJ0ZW1wIGZpbGUgPSBbIiArIHRoZUZpbGVuYW1lICsgIl0iKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gU2V0dXAgYW4gb3V0cHV0IHN0cmVhbSB0byBhIHBoeXNpY2FsIGZpbGUNCi0gICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gb3V0U3RyZWFtID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0odGhlRmlsZSk7DQotDQotICAgICAgICAvLyBBdHRhY2ggYSBzdHJlYW0gY2FwYWJsZSBvZiB3cml0aW5nIG9iamVjdHMgdG8gdGhlIA0KLSAgICAgICAgLy8gc3RyZWFtIGNvbm5lY3RlZCB0byB0aGUgZmlsZQ0KLSAgICAgICAgT2JqZWN0T3V0cHV0U3RyZWFtIG91dE9ialN0cmVhbSA9IG5ldyBPYmplY3RPdXRwdXRTdHJlYW0ob3V0U3RyZWFtKTsNCi0NCi0gICAgICAgIC8vIFRyeSB0byBzYXZlIHRoZSBtZXNzYWdlIGNvbnRleHQNCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigic2F2aW5nIG1lc3NhZ2UgY29udGV4dC4uLi4uIik7DQotICAgICAgICBvdXRPYmpTdHJlYW0ud3JpdGVPYmplY3QoYXhpc01DKTsNCi0NCi0gICAgICAgIC8vIENsb3NlIG91dCB0aGUgc3RyZWFtcw0KLSAgICAgICAgb3V0T2JqU3RyZWFtLmZsdXNoKCk7DQotICAgICAgICBvdXRPYmpTdHJlYW0uY2xvc2UoKTsNCi0gICAgICAgIG91dFN0cmVhbS5mbHVzaCgpOw0KLSAgICAgICAgb3V0U3RyZWFtLmNsb3NlKCk7DQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIi4uLi5zYXZlZCBtZXNzYWdlIGNvbnRleHQuLi4uLiIpOw0KLSAgICAgICAgbG9uZyBmaWxlc2l6ZSA9IHRoZUZpbGUubGVuZ3RoKCk7DQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImZpbGUgc2l6ZSBhZnRlciBzYXZlIFsiICsgZmlsZXNpemUNCi0gICAgICAgICAgICAgICAgKyAiXSAgIHRlbXAgZmlsZSA9IFsiICsgdGhlRmlsZW5hbWUgKyAiXSIpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIEF4aW9tIHN0cnVjdHVyZSBpcyBpbnRhY3QuICANCi0gICAgICAgIGVudiA9IGF4aXNNQy5nZXRFbnZlbG9wZSgpOw0KLSAgICAgICAgYm9keSA9IGVudi5nZXRCb2R5KCk7DQotICAgICAgICBjaGlsZCA9IGJvZHkuZ2V0Rmlyc3RFbGVtZW50KCk7DQotICAgICAgICBhc3NlcnRUcnVlKGNoaWxkIGluc3RhbmNlb2YgT01Tb3VyY2VkRWxlbWVudCk7DQotICAgICAgICBvbXNlID0gKE9NU291cmNlZEVsZW1lbnQpIGNoaWxkOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSghb21zZS5pc0V4cGFuZGVkKCkpOw0KLSAgICAgICAgZHMgPSBvbXNlLmdldERhdGFTb3VyY2UoKTsNCi0gICAgICAgIGFzc2VydFRydWUoZHMgaW5zdGFuY2VvZiBKQVhCQmxvY2tJbXBsKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gU2ltdWxhdGUgdHJhbnNwb3J0DQotICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsNCi0gICAgICAgIGVudi5zZXJpYWxpemVBbmRDb25zdW1lKGJhb3MsIG5ldyBPTU91dHB1dEZvcm1hdCgpKTsNCi0NCi0gICAgICAgIC8vIFRvIGNoZWNrIHRoYXQgdGhlIG91dHB1dCBpcyBjb3JyZWN0LCBnZXQgdGhlIFN0cmluZyBjb250ZW50cyBvZiB0aGUNCi0gICAgICAgIC8vIHJlYWRlcg0KLSAgICAgICAgU3RyaW5nIG5ld1RleHQgPSBiYW9zLnRvU3RyaW5nKCk7DQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4obmV3VGV4dCk7DQotICAgICAgICBhc3NlcnRUcnVlKG5ld1RleHQuY29udGFpbnMoc2FtcGxlSkFYQlRleHQpKTsNCi0gICAgICAgIGFzc2VydFRydWUobmV3VGV4dC5jb250YWlucygic29hcCIpKTsNCi0gICAgICAgIGFzc2VydFRydWUobmV3VGV4dC5jb250YWlucygiRW52ZWxvcGUiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKG5ld1RleHQuY29udGFpbnMoIkJvZHkiKSk7DQotICAgICAgICANCi0gICAgICAgIA0KLSAgICAgICAgLy8gTm93IHJlYWQgaW4gdGhlIHBlcnNpc3RlZCBtZXNzYWdlDQotICAgICAgICAvLyBTZXR1cCBhbiBpbnB1dCBzdHJlYW0gdG8gdGhlIGZpbGUNCi0gICAgICAgIEZpbGVJbnB1dFN0cmVhbSBpblN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0odGhlRmlsZSk7DQotDQotICAgICAgICAvLyBhdHRhY2ggYSBzdHJlYW0gY2FwYWJsZSBvZiByZWFkaW5nIG9iamVjdHMgZnJvbSB0aGUgDQotICAgICAgICAvLyBzdHJlYW0gY29ubmVjdGVkIHRvIHRoZSBmaWxlDQotICAgICAgICBPYmplY3RJbnB1dFN0cmVhbSBpbk9ialN0cmVhbSA9IG5ldyBPYmplY3RJbnB1dFN0cmVhbShpblN0cmVhbSk7DQotDQotICAgICAgICAvLyB0cnkgdG8gcmVzdG9yZSB0aGUgbWVzc2FnZSBjb250ZXh0DQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInJlc3RvcmluZyBhIG1lc3NhZ2UgY29udGV4dC4uLi4uIik7DQotDQotICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQgcmVzdG9yZWRNQyA9IA0KLSAgICAgICAgICAgIChvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQpIGluT2JqU3RyZWFtLnJlYWRPYmplY3QoKTsNCi0gICAgICAgIGluT2JqU3RyZWFtLmNsb3NlKCk7DQotICAgICAgICBpblN0cmVhbS5jbG9zZSgpOw0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIuLi4ucmVzdG9yZWQgbWVzc2FnZSBjb250ZXh0Li4uLi4iKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQXQgdGhpcyBwb2ludCBpbiB0aW1lLCB0aGUgcmVzdG9yZWRNZXNzYWdlIHdpbGwgYmUgYSBmdWxsIHRyZWUuDQotICAgICAgICAvLyBUT0RPIElmIHRoaXMgY2hhbmdlcywgcGxlYXNlIGFkZCBtb3JlIGFzc2VydGlvbnMgaGVyZS4NCi0gICAgICAgIA0KLSAgICAgICAgLy8gQ2hlY2sgcGVyc2lzdGVkIHByb3BlcnRpZXMNCi0gICAgICAgIA0KLSAgICAgICAgLy8gVGhlIGV4Y2VwdGlvbiBtaWdodCBiZSBwZXJzaXN0ZWQuLi4uYnV0IGluIHRoZSB2ZXJ5IGxlYXN0IGl0IHNob3VsZA0KLSAgICAgICAgLy8gbm90IGNhdXNlIGFuIGV4Y2VwdGlvbi4NCi0gICAgICAgIFRocm93YWJsZSB0ID0gKFRocm93YWJsZSkgcmVzdG9yZWRNQy5nZXRQcm9wZXJ0eShDb25zdGFudHMuSkFYV1NfV0VCTUVUSE9EX0VYQ0VQVElPTik7DQotICAgICAgICBhc3NlcnRUcnVlKHQgPT0gbnVsbCB8fCB0IGluc3RhbmNlb2YgTnVsbFBvaW50ZXJFeGNlcHRpb24pOw0KLSAgICAgICAgDQotICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIGtleVN0cmluZyBwcm9wZXJ0eSB3YXMgcGVyc2lzdGVkDQotICAgICAgICBTdHJpbmcgdmFsdWVTdHJpbmcgPSAgKFN0cmluZykgcmVzdG9yZWRNQy5nZXRQcm9wZXJ0eSgia2V5U3RyaW5nIik7DQotICAgICAgICBhc3NlcnRUcnVlKCJ2YWx1ZVN0cmluZyIuZXF1YWxzKHZhbHVlU3RyaW5nKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUga2V5SW50ZWdlciBwcm9wZXJ0eSB3YXMgcGVyc2lzdGVkLg0KLSAgICAgICAgSW50ZWdlciB2YWx1ZUludGVnZXIgPSAgKEludGVnZXIpIHJlc3RvcmVkTUMuZ2V0UHJvcGVydHkoImtleUludGVnZXIiKTsNCi0gICAgICAgIGFzc2VydFRydWUodmFsdWVJbnRlZ2VyID09IDUpOw0KLSAgICAgICAgDQotICAgICAgICBheGlzTUMuc2V0UHJvcGVydHkoImtleUludGVnZXIiLCBuZXcgSW50ZWdlcig1KSk7DQotICAgICAgICANCi0gICAgICAgIC8vIFNpbXVsYXRlIHRyYW5zcG9ydA0KLSAgICAgICAgYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsNCi0gICAgICAgIGVudiA9IHJlc3RvcmVkTUMuZ2V0RW52ZWxvcGUoKTsNCi0gICAgICAgIGVudi5zZXJpYWxpemVBbmRDb25zdW1lKGJhb3MsIG5ldyBPTU91dHB1dEZvcm1hdCgpKTsNCi0gICAgICAgIFN0cmluZyByZXN0b3JlZFRleHQgPSBiYW9zLnRvU3RyaW5nKCk7DQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4ocmVzdG9yZWRUZXh0KTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzdG9yZWRUZXh0LmNvbnRhaW5zKHNhbXBsZUpBWEJUZXh0KSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3RvcmVkVGV4dC5jb250YWlucygic29hcCIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzdG9yZWRUZXh0LmNvbnRhaW5zKCJFbnZlbG9wZSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzdG9yZWRUZXh0LmNvbnRhaW5zKCJCb2R5IikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN0b3JlZFRleHQuZXF1YWxzKG5ld1RleHQpKTsNCi0gICAgICAgIA0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogQ3JlYXRlIGEgSkFYQkJsb2NrIGNvbnRhaW5pbmcgYSBKQVgtQiBidXNpbmVzcyBvYmplY3QgYW5kIHNpbXVsYXRlIGEgbm9ybWFsIERpc3BhdGNoPE9iamVjdD4NCi0gICAgICogb3V0cHV0IGZsb3cNCi0gICAgICogDQotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGVyc2lzdF9Jbk1lbW9yeSgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgDQotICAgICAgICAvLyBDcmVhdGUgdGhlIEpBWC1CIG9iamVjdCB0aGF0IGlzIHR5cGljYWwgZnJvbSBhIEpBWC1XUyBhcHANCi0gICAgICAgIFN0cmluZyBzYW1wbGVKQVhCVGV4dCA9ICJzYW1wbGUgcmV0dXJuIHZhbHVlIjsNCi0gICAgICAgIE9iamVjdEZhY3Rvcnkgb2YgPSBuZXcgT2JqZWN0RmFjdG9yeSgpOw0KLSAgICAgICAgRWNob1N0cmluZ1Jlc3BvbnNlIG9iaiA9IG9mLmNyZWF0ZUVjaG9TdHJpbmdSZXNwb25zZSgpOw0KLSAgICAgICAgb2JqLnNldEVjaG9TdHJpbmdSZXR1cm4oInNhbXBsZSByZXR1cm4gdmFsdWUiKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gVGhlIEpBWEIgb2JqZWN0IGlzIHN0b3JlZCBpbiB0aGUgQXhpb20gdHJlZSBhcyBhbiBPTVNvdXJjZWRFbGVtZW50Lg0KLSAgICAgICAgLy8gVGhlIHR5cGljYWwgc3RydWN0dXJlIGlzDQotICAgICAgICAvLyAgIE9NIFNPQVBFbnZlbG9wZQ0KLSAgICAgICAgLy8gICBPTSBTT0FQQm9keQ0KLSAgICAgICAgLy8gICBPTVNvdXJjZWRFbGVtZW50IHRoYXQgaXMgc291cmNlZCBieSBhIEpBWEJCbG9ja0ltcGwgd2hpY2ggaXMgYmFja2VjZCBieSBhIEpBWEIgT2JqZWN0Lg0KLSAgICAgICAgTWVzc2FnZSBtID0gY3JlYXRlTWVzc2FnZShvYmopOw0KLSAgICAgICAgDQotICAgICAgICAvLyBUaGUgTWVzc2FnZSBpcyBzZXQgb24gdGhlIEpBWFdTIE1lc3NhZ2VDb250ZXh0DQotICAgICAgICBNZXNzYWdlQ29udGV4dCBqYXh3c01DID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7DQotICAgICAgICBqYXh3c01DLnNldE1lc3NhZ2UobSk7DQotICAgICAgICANCi0gICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgbWVzc2FnZSBpcyBhIGZhdWx0LiBUaGUgZW5naW5lIHdpbGwgYWx3YXlzIGNhbGwgdGhpcyBtZXRob2QuDQotICAgICAgICAvLyBUaGUgTWVzc2FnZSBtdXN0IHJlc3BvbmQgYXBwcm9wcmlhdGVseSB3aXRob3V0IGRvaW5nIGEgY29udmVyc2lvbi4NCi0gICAgICAgIGJvb2xlYW4gaXNGYXVsdCA9IG0uaXNGYXVsdCgpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSghaXNGYXVsdCk7DQotICAgICAgICBhc3NlcnRUcnVlKCJYTUxQYXJ0IFJlcHJlc2VudGF0aW9uIGlzICIgKyBtLmdldFhNTFBhcnRDb250ZW50VHlwZSgpLA0KLSAgICAgICAgICAgICAgICAgICAiU1BJTkUiLmVxdWFscyhtLmdldFhNTFBhcnRDb250ZW50VHlwZSgpKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIFRoZSBKQVgtV1MgTWVzc2FnZUNvbnRleHQgaXMgY29udmVydGVkIGludG8gYW4gQXhpczIgTWVzc2FnZUNvbnRleHQNCi0gICAgICAgIG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dCBheGlzTUMgPSBqYXh3c01DLmdldEF4aXNNZXNzYWdlQ29udGV4dCgpOw0KLSAgICAgICAgTWVzc2FnZVV0aWxzLnB1dE1lc3NhZ2VPbk1lc3NhZ2VDb250ZXh0KG0sIGpheHdzTUMuZ2V0QXhpc01lc3NhZ2VDb250ZXh0KCkpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIEF4aW9tIHN0cnVjdHVyZSBpcyBpbnRhY3QNCi0gICAgICAgIFNPQVBFbnZlbG9wZSBlbnYgPSBheGlzTUMuZ2V0RW52ZWxvcGUoKTsNCi0gICAgICAgIFNPQVBCb2R5IGJvZHkgPSBlbnYuZ2V0Qm9keSgpOw0KLSAgICAgICAgT01FbGVtZW50IGNoaWxkID0gYm9keS5nZXRGaXJzdEVsZW1lbnQoKTsNCi0gICAgICAgIGFzc2VydFRydWUoY2hpbGQgaW5zdGFuY2VvZiBPTVNvdXJjZWRFbGVtZW50KTsNCi0gICAgICAgIE9NU291cmNlZEVsZW1lbnQgb21zZSA9IChPTVNvdXJjZWRFbGVtZW50KSBjaGlsZDsNCi0gICAgICAgIGFzc2VydFRydWUoIW9tc2UuaXNFeHBhbmRlZCgpKTsNCi0gICAgICAgIE9NRGF0YVNvdXJjZSBkcyA9IG9tc2UuZ2V0RGF0YVNvdXJjZSgpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShkcyBpbnN0YW5jZW9mIEpBWEJCbG9ja0ltcGwpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBOb3cgc2ltdWxhdGUgcGVyc2lzdGluZyB0aGUgbWVzc2FnZSBpbiBtZW1vcnkNCi0gICAgICAgIFNPQVBFbnZlbG9wZSBlbnYyID0gQ29weVV0aWxzLmNvcHkoZW52KTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBBeGlvbSBzdHJ1Y3R1cmUgaXMgaW50YWN0LiAgDQotICAgICAgICBlbnYgPSBheGlzTUMuZ2V0RW52ZWxvcGUoKTsNCi0gICAgICAgIGJvZHkgPSBlbnYuZ2V0Qm9keSgpOw0KLSAgICAgICAgY2hpbGQgPSBib2R5LmdldEZpcnN0RWxlbWVudCgpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShjaGlsZCBpbnN0YW5jZW9mIE9NU291cmNlZEVsZW1lbnQpOw0KLSAgICAgICAgb21zZSA9IChPTVNvdXJjZWRFbGVtZW50KSBjaGlsZDsNCi0gICAgICAgIGFzc2VydFRydWUoIW9tc2UuaXNFeHBhbmRlZCgpKTsNCi0gICAgICAgIGRzID0gb21zZS5nZXREYXRhU291cmNlKCk7DQotICAgICAgICBhc3NlcnRUcnVlKGRzIGluc3RhbmNlb2YgSkFYQkJsb2NrSW1wbCk7DQotICAgICAgICANCi0gICAgICAgIC8vIFNpbXVsYXRlIHRyYW5zcG9ydA0KLSAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7DQotICAgICAgICBlbnYuc2VyaWFsaXplQW5kQ29uc3VtZShiYW9zLCBuZXcgT01PdXRwdXRGb3JtYXQoKSk7DQotDQotICAgICAgICAvLyBUbyBjaGVjayB0aGF0IHRoZSBvdXRwdXQgaXMgY29ycmVjdCwgZ2V0IHRoZSBTdHJpbmcgY29udGVudHMgb2YgdGhlDQotICAgICAgICAvLyByZWFkZXINCi0gICAgICAgIFN0cmluZyBuZXdUZXh0ID0gYmFvcy50b1N0cmluZygpOw0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG5ld1RleHQpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShuZXdUZXh0LmNvbnRhaW5zKHNhbXBsZUpBWEJUZXh0KSk7DQotICAgICAgICBhc3NlcnRUcnVlKG5ld1RleHQuY29udGFpbnMoInNvYXAiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKG5ld1RleHQuY29udGFpbnMoIkVudmVsb3BlIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShuZXdUZXh0LmNvbnRhaW5zKCJCb2R5IikpOw0KLSAgICAgICAgDQotICAgICAgICANCi0gICAgICAgIC8vIE5vdyBjaGVjayB0aGUgY29waWVkIGVudmVsb3BlDQotICAgICAgICBib2R5ID0gZW52Mi5nZXRCb2R5KCk7DQotICAgICAgICBjaGlsZCA9IGJvZHkuZ2V0Rmlyc3RFbGVtZW50KCk7DQotICAgICAgICBhc3NlcnRUcnVlKGNoaWxkIGluc3RhbmNlb2YgT01Tb3VyY2VkRWxlbWVudCk7DQotICAgICAgICBvbXNlID0gKE9NU291cmNlZEVsZW1lbnQpIGNoaWxkOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSghb21zZS5pc0V4cGFuZGVkKCkpOw0KLSAgICAgICAgZHMgPSBvbXNlLmdldERhdGFTb3VyY2UoKTsNCi0gICAgICAgIGFzc2VydFRydWUoZHMgaW5zdGFuY2VvZiBKQVhCRGF0YVNvdXJjZSk7DQotICAgICAgICANCi0gICAgICAgIC8vIFNpbXVsYXRlIHRyYW5zcG9ydA0KLSAgICAgICAgYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsNCi0gICAgICAgIGVudjIuc2VyaWFsaXplQW5kQ29uc3VtZShiYW9zLCBuZXcgT01PdXRwdXRGb3JtYXQoKSk7DQotICAgICAgICBTdHJpbmcgcmVzdG9yZWRUZXh0ID0gYmFvcy50b1N0cmluZygpOw0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHJlc3RvcmVkVGV4dCk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3RvcmVkVGV4dC5jb250YWlucyhzYW1wbGVKQVhCVGV4dCkpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN0b3JlZFRleHQuY29udGFpbnMoInNvYXAiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3RvcmVkVGV4dC5jb250YWlucygiRW52ZWxvcGUiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3RvcmVkVGV4dC5jb250YWlucygiQm9keSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzdG9yZWRUZXh0LmVxdWFscyhuZXdUZXh0KSk7DQotICAgICAgICANCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIENyZWF0ZSBhIEpBWEJCbG9jayBjb250YWluaW5nIGEgSkFYLUIgYnVzaW5lc3Mgb2JqZWN0IGFuZCBzaW11bGF0ZSBhIG5vcm1hbCBEaXNwYXRjaDxPYmplY3Q+DQotICAgICAqIG91dHB1dCBmbG93DQotICAgICAqIA0KLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdFBlcnNpc3RfQXR0YWNobWVudHNfRmlsZSgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgDQotICAgICAgICAvLyBUT0RPIEFkZCBhIFNXQVJlZiBhbmQgYSByYXcgYXR0YWNobWVudA0KLSAgICAgICAgDQotICAgICAgICAvLyBDcmVhdGUgdGhlIEpBWC1CIG9iamVjdCB3aXRoIGFuIGF0dGFjaG1lbnQNCi0gICAgICAgIC8vIENyZWF0ZSBhIERhdGFIYW5kbGVyIHdpdGggdGhlIFN0cmluZyBEYXRhU291cmNlIG9iamVjdA0KLSAgICAgICAgRGF0YUhhbmRsZXIgZGF0YUhhbmRsZXIgPSBuZXcgRGF0YUhhbmRsZXIoc3RyaW5nRFMpOw0KLQ0KLSAgICAgICAgLy9TdG9yZSB0aGUgZGF0YSBoYW5kbGVyIGluIEltYWdlRGVwb3QgYmVhbg0KLSAgICAgICAgb3JnLnRlc3QubXRvbS5PYmplY3RGYWN0b3J5IG9mID0gbmV3IG9yZy50ZXN0Lm10b20uT2JqZWN0RmFjdG9yeSgpOw0KLSAgICAgICAgSW1hZ2VEZXBvdCBpbWFnZURlcG90ID0gbmV3IG9yZy50ZXN0Lm10b20uT2JqZWN0RmFjdG9yeSgpLmNyZWF0ZUltYWdlRGVwb3QoKTsNCi0gICAgICAgIGltYWdlRGVwb3Quc2V0SW1hZ2VEYXRhKGRhdGFIYW5kbGVyKTsNCi0gICAgICAgIFNlbmRJbWFnZSBvYmogPSBvZi5jcmVhdGVTZW5kSW1hZ2UoKTsNCi0gICAgICAgIG9iai5zZXRJbnB1dChpbWFnZURlcG90KTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gVGhlIEpBWEIgb2JqZWN0IGlzIHN0b3JlZCBpbiB0aGUgQXhpb20gdHJlZSBhcyBhbiBPTVNvdXJjZWRFbGVtZW50Lg0KLSAgICAgICAgLy8gVGhlIHR5cGljYWwgc3RydWN0dXJlIGlzDQotICAgICAgICAvLyAgIE9NIFNPQVBFbnZlbG9wZQ0KLSAgICAgICAgLy8gICBPTSBTT0FQQm9keQ0KLSAgICAgICAgLy8gICBPTVNvdXJjZWRFbGVtZW50IHRoYXQgaXMgc291cmNlZCBieSBhIEpBWEJCbG9ja0ltcGwgd2hpY2ggaXMgYmFja2VjZCBieSBhIEpBWEIgT2JqZWN0Lg0KLSAgICAgICAgTWVzc2FnZSBtID0gY3JlYXRlTWVzc2FnZShvYmopOw0KLSAgICAgICAgbS5zZXRNVE9NRW5hYmxlZCh0cnVlKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gVGhlIE1lc3NhZ2UgaXMgc2V0IG9uIHRoZSBKQVhXUyBNZXNzYWdlQ29udGV4dA0KLSAgICAgICAgTWVzc2FnZUNvbnRleHQgamF4d3NNQyA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOw0KLSAgICAgICAgamF4d3NNQy5zZXRNZXNzYWdlKG0pOw0KLSAgICAgICAgDQotICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhlIG1lc3NhZ2UgaXMgYSBmYXVsdC4gVGhlIGVuZ2luZSB3aWxsIGFsd2F5cyBjYWxsIHRoaXMgbWV0aG9kLg0KLSAgICAgICAgLy8gVGhlIE1lc3NhZ2UgbXVzdCByZXNwb25kIGFwcHJvcHJpYXRlbHkgd2l0aG91dCBkb2luZyBhIGNvbnZlcnNpb24uDQotICAgICAgICBib29sZWFuIGlzRmF1bHQgPSBtLmlzRmF1bHQoKTsNCi0gICAgICAgIGFzc2VydFRydWUoIWlzRmF1bHQpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiWE1MUGFydCBSZXByZXNlbnRhdGlvbiBpcyAiICsgbS5nZXRYTUxQYXJ0Q29udGVudFR5cGUoKSwNCi0gICAgICAgICAgICAgICAgICAgIlNQSU5FIi5lcXVhbHMobS5nZXRYTUxQYXJ0Q29udGVudFR5cGUoKSkpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBUaGUgSkFYLVdTIE1lc3NhZ2VDb250ZXh0IGlzIGNvbnZlcnRlZCBpbnRvIGFuIEF4aXMyIE1lc3NhZ2VDb250ZXh0DQotICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQgYXhpc01DID0gamF4d3NNQy5nZXRBeGlzTWVzc2FnZUNvbnRleHQoKTsNCi0gICAgICAgIE1lc3NhZ2VVdGlscy5wdXRNZXNzYWdlT25NZXNzYWdlQ29udGV4dChtLCBqYXh3c01DLmdldEF4aXNNZXNzYWdlQ29udGV4dCgpKTsNCi0gICAgICAgIGF4aXNNQy5zZXRQcm9wZXJ0eShDb25maWd1cmF0aW9uLkVOQUJMRV9NVE9NLCAidHJ1ZSIgKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBBeGlvbSBzdHJ1Y3R1cmUgaXMgaW50YWN0DQotICAgICAgICBTT0FQRW52ZWxvcGUgZW52ID0gYXhpc01DLmdldEVudmVsb3BlKCk7DQotICAgICAgICBTT0FQQm9keSBib2R5ID0gZW52LmdldEJvZHkoKTsNCi0gICAgICAgIE9NRWxlbWVudCBjaGlsZCA9IGJvZHkuZ2V0Rmlyc3RFbGVtZW50KCk7DQotICAgICAgICBhc3NlcnRUcnVlKGNoaWxkIGluc3RhbmNlb2YgT01Tb3VyY2VkRWxlbWVudCk7DQotICAgICAgICBPTVNvdXJjZWRFbGVtZW50IG9tc2UgPSAoT01Tb3VyY2VkRWxlbWVudCkgY2hpbGQ7DQotICAgICAgICBhc3NlcnRUcnVlKCFvbXNlLmlzRXhwYW5kZWQoKSk7DQotICAgICAgICBPTURhdGFTb3VyY2UgZHMgPSBvbXNlLmdldERhdGFTb3VyY2UoKTsNCi0gICAgICAgIGFzc2VydFRydWUoZHMgaW5zdGFuY2VvZiBKQVhCQmxvY2tJbXBsKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gTm93IHNpbXVsYXRlIHBlcnNpc3RpbmcgdGhlIG1lc3NhZ2UNCi0gICAgICAgIEZpbGUgdGhlRmlsZSA9IG51bGw7DQotICAgICAgICBTdHJpbmcgdGhlRmlsZW5hbWUgPSBudWxsOw0KLSAgICAgICAgdGhlRmlsZSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoIk1lc3NhZ2VQZXJzaXN0VGVzdCIsIG51bGwpOw0KLSAgICAgICAgLy90aGVGaWxlLmRlbGV0ZU9uRXhpdCgpOw0KLSAgICAgICAgdGhlRmlsZW5hbWUgPSB0aGVGaWxlLmdldE5hbWUoKTsNCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigidGVtcCBmaWxlID0gWyIgKyB0aGVGaWxlbmFtZSArICJdIik7DQotICAgICAgICANCi0gICAgICAgIC8vIFNldHVwIGFuIG91dHB1dCBzdHJlYW0gdG8gYSBwaHlzaWNhbCBmaWxlDQotICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIG91dFN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRoZUZpbGUpOw0KLQ0KLSAgICAgICAgLy8gQXR0YWNoIGEgc3RyZWFtIGNhcGFibGUgb2Ygd3JpdGluZyBvYmplY3RzIHRvIHRoZSANCi0gICAgICAgIC8vIHN0cmVhbSBjb25uZWN0ZWQgdG8gdGhlIGZpbGUNCi0gICAgICAgIE9iamVjdE91dHB1dFN0cmVhbSBvdXRPYmpTdHJlYW0gPSBuZXcgT2JqZWN0T3V0cHV0U3RyZWFtKG91dFN0cmVhbSk7DQotDQotICAgICAgICAvLyBUcnkgdG8gc2F2ZSB0aGUgbWVzc2FnZSBjb250ZXh0DQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInNhdmluZyBtZXNzYWdlIGNvbnRleHQuLi4uLiIpOw0KLSAgICAgICAgb3V0T2JqU3RyZWFtLndyaXRlT2JqZWN0KGF4aXNNQyk7DQotDQotICAgICAgICAvLyBDbG9zZSBvdXQgdGhlIHN0cmVhbXMNCi0gICAgICAgIG91dE9ialN0cmVhbS5mbHVzaCgpOw0KLSAgICAgICAgb3V0T2JqU3RyZWFtLmNsb3NlKCk7DQotICAgICAgICBvdXRTdHJlYW0uZmx1c2goKTsNCi0gICAgICAgIG91dFN0cmVhbS5jbG9zZSgpOw0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIuLi4uc2F2ZWQgbWVzc2FnZSBjb250ZXh0Li4uLi4iKTsNCi0gICAgICAgIGxvbmcgZmlsZXNpemUgPSB0aGVGaWxlLmxlbmd0aCgpOw0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJmaWxlIHNpemUgYWZ0ZXIgc2F2ZSBbIiArIGZpbGVzaXplDQotICAgICAgICAgICAgICAgICsgIl0gICB0ZW1wIGZpbGUgPSBbIiArIHRoZUZpbGVuYW1lICsgIl0iKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBBeGlvbSBzdHJ1Y3R1cmUgaXMgaW50YWN0LiAgDQotICAgICAgICBlbnYgPSBheGlzTUMuZ2V0RW52ZWxvcGUoKTsNCi0gICAgICAgIGJvZHkgPSBlbnYuZ2V0Qm9keSgpOw0KLSAgICAgICAgY2hpbGQgPSBib2R5LmdldEZpcnN0RWxlbWVudCgpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShjaGlsZCBpbnN0YW5jZW9mIE9NU291cmNlZEVsZW1lbnQpOw0KLSAgICAgICAgb21zZSA9IChPTVNvdXJjZWRFbGVtZW50KSBjaGlsZDsNCi0gICAgICAgIGFzc2VydFRydWUoIW9tc2UuaXNFeHBhbmRlZCgpKTsNCi0gICAgICAgIGRzID0gb21zZS5nZXREYXRhU291cmNlKCk7DQotICAgICAgICBhc3NlcnRUcnVlKGRzIGluc3RhbmNlb2YgSkFYQkJsb2NrSW1wbCk7DQotICAgICAgICANCi0gICAgICAgIC8vIFNpbXVsYXRlIHRyYW5zcG9ydA0KLSAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7DQotICAgICAgICBPTU91dHB1dEZvcm1hdCBvdXRwdXRGb3JtYXQgPSBuZXcgT01PdXRwdXRGb3JtYXQoKTsNCi0gICAgICAgIG91dHB1dEZvcm1hdC5zZXREb09wdGltaXplKHRydWUpOw0KLSAgICAgICAgb3V0cHV0Rm9ybWF0LnNldE1pbWVCb3VuZGFyeSgiTUlNRUJvdW5kYXJ5X0F4aXMyUm9ja3MiKTsNCi0gICAgICAgIGVudi5zZXJpYWxpemVBbmRDb25zdW1lKGJhb3MsIG91dHB1dEZvcm1hdCk7DQotDQotICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIG91dHB1dCBpcyBjb3JyZWN0DQotICAgICAgICBTdHJpbmcgbmV3VGV4dCA9IGJhb3MudG9TdHJpbmcoKTsNCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihuZXdUZXh0KTsNCi0gICAgICAgIGFzc2VydFRydWUobmV3VGV4dC5jb250YWlucygic29hcCIpKTsNCi0gICAgICAgIGFzc2VydFRydWUobmV3VGV4dC5jb250YWlucygiRW52ZWxvcGUiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKG5ld1RleHQuY29udGFpbnMoIkJvZHkiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKG5ld1RleHQuaW5kZXhPZigiTUlNRUJvdW5kYXJ5X0F4aXMyUm9ja3MiKSA+IDApOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShuZXdUZXh0LmluZGV4T2Yoc2FtcGxlVGV4dCkgPiAwKTsNCi0gICAgICAgIGFzc2VydFRydWUobmV3VGV4dC5pbmRleE9mKCI8c29hcGVudjpCb2R5PjxzZW5kSW1hZ2UgeG1sbnM9XCJ1cm46Ly9tdG9tLnRlc3Qub3JnXCI+PGlucHV0PjxpbWFnZURhdGE+PHhvcDpJbmNsdWRlIikgPiAwKTsNCi0NCi0gICAgICAgIA0KLSAgICAgICAgLy8gTm93IHJlYWQgaW4gdGhlIHBlcnNpc3RlZCBtZXNzYWdlDQotICAgICAgICAvLyBTZXR1cCBhbiBpbnB1dCBzdHJlYW0gdG8gdGhlIGZpbGUNCi0gICAgICAgIEZpbGVJbnB1dFN0cmVhbSBpblN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0odGhlRmlsZSk7DQotDQotICAgICAgICAvLyBhdHRhY2ggYSBzdHJlYW0gY2FwYWJsZSBvZiByZWFkaW5nIG9iamVjdHMgZnJvbSB0aGUgDQotICAgICAgICAvLyBzdHJlYW0gY29ubmVjdGVkIHRvIHRoZSBmaWxlDQotICAgICAgICBPYmplY3RJbnB1dFN0cmVhbSBpbk9ialN0cmVhbSA9IG5ldyBPYmplY3RJbnB1dFN0cmVhbShpblN0cmVhbSk7DQotDQotICAgICAgICAvLyB0cnkgdG8gcmVzdG9yZSB0aGUgbWVzc2FnZSBjb250ZXh0DQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInJlc3RvcmluZyBhIG1lc3NhZ2UgY29udGV4dC4uLi4uIik7DQotDQotICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQgcmVzdG9yZWRNQyA9IA0KLSAgICAgICAgICAgIChvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQpIGluT2JqU3RyZWFtLnJlYWRPYmplY3QoKTsNCi0gICAgICAgIGluT2JqU3RyZWFtLmNsb3NlKCk7DQotICAgICAgICBpblN0cmVhbS5jbG9zZSgpOw0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIuLi4ucmVzdG9yZWQgbWVzc2FnZSBjb250ZXh0Li4uLi4iKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQXQgdGhpcyBwb2ludCBpbiB0aW1lLCB0aGUgcmVzdG9yZWRNZXNzYWdlIHdpbGwgYmUgYSBmdWxsIHRyZWUuDQotICAgICAgICAvLyBUT0RPIElmIHRoaXMgY2hhbmdlcywgcGxlYXNlIGFkZCBtb3JlIGFzc2VydGlvbnMgaGVyZS4NCi0gICAgICAgIA0KLSAgICAgICAgLy8gU2ltdWxhdGUgdHJhbnNwb3J0IG9uIHRoZSByZXN0b3JlZCBtZXNzYWdlDQotICAgICAgICBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOw0KLSAgICAgICAgZW52ID0gcmVzdG9yZWRNQy5nZXRFbnZlbG9wZSgpOw0KLSAgICAgICAgb3V0cHV0Rm9ybWF0ID0gbmV3IE9NT3V0cHV0Rm9ybWF0KCk7DQotICAgICAgICBvdXRwdXRGb3JtYXQuc2V0RG9PcHRpbWl6ZSh0cnVlKTsNCi0gICAgICAgIG91dHB1dEZvcm1hdC5zZXRNaW1lQm91bmRhcnkoIk1JTUVCb3VuZGFyeV9BeGlzMlJvY2tzIik7DQotICAgICAgICBlbnYuc2VyaWFsaXplQW5kQ29uc3VtZShiYW9zLCBvdXRwdXRGb3JtYXQpOw0KLSAgICAgICAgU3RyaW5nIHJlc3RvcmVkVGV4dCA9IGJhb3MudG9TdHJpbmcoKTsNCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihyZXN0b3JlZFRleHQpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN0b3JlZFRleHQuY29udGFpbnMoInNvYXAiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3RvcmVkVGV4dC5jb250YWlucygiRW52ZWxvcGUiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3RvcmVkVGV4dC5jb250YWlucygiQm9keSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzdG9yZWRUZXh0LmluZGV4T2YoIk1JTUVCb3VuZGFyeV9BeGlzMlJvY2tzIikgPiAwKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzdG9yZWRUZXh0LmluZGV4T2Yoc2FtcGxlVGV4dCkgPiAwKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzdG9yZWRUZXh0LmluZGV4T2YoIjxzb2FwZW52OkJvZHk+PHNlbmRJbWFnZSB4bWxucz1cInVybjovL210b20udGVzdC5vcmdcIj48aW5wdXQ+PGltYWdlRGF0YT48eG9wOkluY2x1ZGUiKSA+IDApOw0KLSAgICAgICAgDQotICAgICAgICAvLyBOb3cgdHJ5IHdhbGtpbmcgdGhlIHNhdmVkIGVudmVsb3BlIGFzIGFuIFhNTElucHV0U3RyZWFtLg0KLSAgICAgICAgLy8gdHJ5IHRvIHJlc3RvcmUgdGhlIG1lc3NhZ2UgY29udGV4dCBhZ2Fpbg0KLSAgICAgICAgLy8gTm93IHJlYWQgaW4gdGhlIHBlcnNpc3RlZCBtZXNzYWdlDQotICAgICAgICAvLyBTZXR1cCBhbiBpbnB1dCBzdHJlYW0gdG8gdGhlIGZpbGUNCi0gICAgICAgIGluU3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbSh0aGVGaWxlKTsNCi0NCi0gICAgICAgIC8vIGF0dGFjaCBhIHN0cmVhbSBjYXBhYmxlIG9mIHJlYWRpbmcgb2JqZWN0cyBmcm9tIHRoZSANCi0gICAgICAgIC8vIHN0cmVhbSBjb25uZWN0ZWQgdG8gdGhlIGZpbGUNCi0gICAgICAgIGluT2JqU3RyZWFtID0gbmV3IE9iamVjdElucHV0U3RyZWFtKGluU3RyZWFtKTsNCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigicmVzdG9yaW5nIGEgbWVzc2FnZSBjb250ZXh0IGFnYWluLi4uLi4iKTsNCi0NCi0gICAgICAgIHJlc3RvcmVkTUMgPSANCi0gICAgICAgICAgICAob3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0KSBpbk9ialN0cmVhbS5yZWFkT2JqZWN0KCk7DQotICAgICAgICBpbk9ialN0cmVhbS5jbG9zZSgpOw0KLSAgICAgICAgaW5TdHJlYW0uY2xvc2UoKTsNCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiLi4uLnJlc3RvcmVkIG1lc3NhZ2UgY29udGV4dC4uLi4uIik7ICAgIA0KLSAgICAgICAgZW52ID0gcmVzdG9yZWRNQy5nZXRFbnZlbG9wZSgpOw0KLSAgICAgICAgZW52LmJ1aWxkKCk7DQotICAgICAgICANCi0gICAgICAgIC8vIFVzZSB0cmVlIGFzIGlucHV0IHRvIFhNTFN0cmVhbVJlYWRlcg0KLSAgICAgICAgT01YTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0gKE9NWE1MU3RyZWFtUmVhZGVyKSBlbnYuZ2V0WE1MU3RyZWFtUmVhZGVyKCk7DQotICAgICAgICANCi0gICAgICAgIC8vIElzc3VlIFhPUDpJbmNsdWRlIGV2ZW50cyBmb3Igb3B0aW1pemVkIE1UT00gdGV4dCBub2Rlcw0KLSAgICAgICAgeG1sU3RyZWFtUmVhZGVyLnNldElubGluZU1UT00oZmFsc2UpOw0KLSAgICAgICAgDQotICAgICAgICBEYXRhSGFuZGxlciBkaCA9IG51bGw7DQotICAgICAgICB3aGlsZSh4bWxTdHJlYW1SZWFkZXIuaGFzTmV4dCgpKSB7DQotICAgICAgICAgICAgeG1sU3RyZWFtUmVhZGVyLm5leHQoKTsNCi0gICAgICAgICAgICBpZiAoeG1sU3RyZWFtUmVhZGVyLmlzU3RhcnRFbGVtZW50KCkpIHsNCi0gICAgICAgICAgICAgICAgUU5hbWUgcU5hbWUgPXhtbFN0cmVhbVJlYWRlci5nZXROYW1lKCk7DQotICAgICAgICAgICAgICAgIGlmIChYT1BfSU5DTFVERS5lcXVhbHMocU5hbWUpKSB7DQotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaHJlZlZhbHVlID0geG1sU3RyZWFtUmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCIiLCAiaHJlZiIpOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGhyZWZWYWx1ZSAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgZGggPSgoT01BdHRhY2htZW50QWNjZXNzb3IpeG1sU3RyZWFtUmVhZGVyKS5nZXREYXRhSGFuZGxlcihocmVmVmFsdWUpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICBhc3NlcnRUcnVlKGRoICE9IG51bGwpOyAgICAgICANCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIENyZWF0ZSBhIEpBWEJCbG9jayBjb250YWluaW5nIGEgSkFYLUIgYnVzaW5lc3Mgb2JqZWN0IGFuZCBzaW11bGF0ZSBhIG5vcm1hbCBEaXNwYXRjaDxPYmplY3Q+DQotICAgICAqIG91dHB1dCBmbG93DQotICAgICAqIA0KLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdFBlcnNpc3RfQXR0YWNobWVudHNfSW5NZW1vcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gVE9ETyBBZGQgYSBTV0FSZWYgYW5kIGEgcmF3IGF0dGFjaG1lbnQNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQ3JlYXRlIHRoZSBKQVgtQiBvYmplY3Qgd2l0aCBhbiBhdHRhY2htZW50DQotICAgICAgICAvLyBDcmVhdGUgYSBEYXRhSGFuZGxlciB3aXRoIHRoZSBTdHJpbmcgRGF0YVNvdXJjZSBvYmplY3QNCi0gICAgICAgIERhdGFIYW5kbGVyIGRhdGFIYW5kbGVyID0gbmV3IERhdGFIYW5kbGVyKHN0cmluZ0RTKTsNCi0NCi0gICAgICAgIC8vU3RvcmUgdGhlIGRhdGEgaGFuZGxlciBpbiBJbWFnZURlcG90IGJlYW4NCi0gICAgICAgIG9yZy50ZXN0Lm10b20uT2JqZWN0RmFjdG9yeSBvZiA9IG5ldyBvcmcudGVzdC5tdG9tLk9iamVjdEZhY3RvcnkoKTsNCi0gICAgICAgIEltYWdlRGVwb3QgaW1hZ2VEZXBvdCA9IG5ldyBvcmcudGVzdC5tdG9tLk9iamVjdEZhY3RvcnkoKS5jcmVhdGVJbWFnZURlcG90KCk7DQotICAgICAgICBpbWFnZURlcG90LnNldEltYWdlRGF0YShkYXRhSGFuZGxlcik7DQotICAgICAgICBTZW5kSW1hZ2Ugb2JqID0gb2YuY3JlYXRlU2VuZEltYWdlKCk7DQotICAgICAgICBvYmouc2V0SW5wdXQoaW1hZ2VEZXBvdCk7DQotICAgICAgICANCi0gICAgICAgIC8vIFRoZSBKQVhCIG9iamVjdCBpcyBzdG9yZWQgaW4gdGhlIEF4aW9tIHRyZWUgYXMgYW4gT01Tb3VyY2VkRWxlbWVudC4NCi0gICAgICAgIC8vIFRoZSB0eXBpY2FsIHN0cnVjdHVyZSBpcw0KLSAgICAgICAgLy8gICBPTSBTT0FQRW52ZWxvcGUNCi0gICAgICAgIC8vICAgT00gU09BUEJvZHkNCi0gICAgICAgIC8vICAgT01Tb3VyY2VkRWxlbWVudCB0aGF0IGlzIHNvdXJjZWQgYnkgYSBKQVhCQmxvY2tJbXBsIHdoaWNoIGlzIGJhY2tlY2QgYnkgYSBKQVhCIE9iamVjdC4NCi0gICAgICAgIE1lc3NhZ2UgbSA9IGNyZWF0ZU1lc3NhZ2Uob2JqKTsNCi0gICAgICAgIG0uc2V0TVRPTUVuYWJsZWQodHJ1ZSk7DQotICAgICAgICANCi0gICAgICAgIC8vIFRoZSBNZXNzYWdlIGlzIHNldCBvbiB0aGUgSkFYV1MgTWVzc2FnZUNvbnRleHQNCi0gICAgICAgIE1lc3NhZ2VDb250ZXh0IGpheHdzTUMgPSBuZXcgTWVzc2FnZUNvbnRleHQoKTsNCi0gICAgICAgIGpheHdzTUMuc2V0TWVzc2FnZShtKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBtZXNzYWdlIGlzIGEgZmF1bHQuIFRoZSBlbmdpbmUgd2lsbCBhbHdheXMgY2FsbCB0aGlzIG1ldGhvZC4NCi0gICAgICAgIC8vIFRoZSBNZXNzYWdlIG11c3QgcmVzcG9uZCBhcHByb3ByaWF0ZWx5IHdpdGhvdXQgZG9pbmcgYSBjb252ZXJzaW9uLg0KLSAgICAgICAgYm9vbGVhbiBpc0ZhdWx0ID0gbS5pc0ZhdWx0KCk7DQotICAgICAgICBhc3NlcnRUcnVlKCFpc0ZhdWx0KTsNCi0gICAgICAgIGFzc2VydFRydWUoIlhNTFBhcnQgUmVwcmVzZW50YXRpb24gaXMgIiArIG0uZ2V0WE1MUGFydENvbnRlbnRUeXBlKCksDQotICAgICAgICAgICAgICAgICAgICJTUElORSIuZXF1YWxzKG0uZ2V0WE1MUGFydENvbnRlbnRUeXBlKCkpKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gVGhlIEpBWC1XUyBNZXNzYWdlQ29udGV4dCBpcyBjb252ZXJ0ZWQgaW50byBhbiBBeGlzMiBNZXNzYWdlQ29udGV4dA0KLSAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0IGF4aXNNQyA9IGpheHdzTUMuZ2V0QXhpc01lc3NhZ2VDb250ZXh0KCk7DQotICAgICAgICBNZXNzYWdlVXRpbHMucHV0TWVzc2FnZU9uTWVzc2FnZUNvbnRleHQobSwgamF4d3NNQy5nZXRBeGlzTWVzc2FnZUNvbnRleHQoKSk7DQotICAgICAgICBheGlzTUMuc2V0UHJvcGVydHkoQ29uZmlndXJhdGlvbi5FTkFCTEVfTVRPTSwgInRydWUiKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBBeGlvbSBzdHJ1Y3R1cmUgaXMgaW50YWN0DQotICAgICAgICBTT0FQRW52ZWxvcGUgZW52ID0gYXhpc01DLmdldEVudmVsb3BlKCk7DQotICAgICAgICBTT0FQQm9keSBib2R5ID0gZW52LmdldEJvZHkoKTsNCi0gICAgICAgIE9NRWxlbWVudCBjaGlsZCA9IGJvZHkuZ2V0Rmlyc3RFbGVtZW50KCk7DQotICAgICAgICBhc3NlcnRUcnVlKGNoaWxkIGluc3RhbmNlb2YgT01Tb3VyY2VkRWxlbWVudCk7DQotICAgICAgICBPTVNvdXJjZWRFbGVtZW50IG9tc2UgPSAoT01Tb3VyY2VkRWxlbWVudCkgY2hpbGQ7DQotICAgICAgICBhc3NlcnRUcnVlKCFvbXNlLmlzRXhwYW5kZWQoKSk7DQotICAgICAgICBPTURhdGFTb3VyY2UgZHMgPSBvbXNlLmdldERhdGFTb3VyY2UoKTsNCi0gICAgICAgIGFzc2VydFRydWUoZHMgaW5zdGFuY2VvZiBKQVhCQmxvY2tJbXBsKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gTm93IHNpbXVsYXRlIHBlcnNpc3RpbmcgdGhlIG1lc3NhZ2UgaW4gbWVtb3J5DQotICAgICAgICBTT0FQRW52ZWxvcGUgZW52MiA9IENvcHlVdGlscy5jb3B5KGVudik7DQotICAgICAgICANCi0gICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgQXhpb20gc3RydWN0dXJlIGlzIGludGFjdC4gIA0KLSAgICAgICAgZW52ID0gYXhpc01DLmdldEVudmVsb3BlKCk7DQotICAgICAgICBib2R5ID0gZW52LmdldEJvZHkoKTsNCi0gICAgICAgIGNoaWxkID0gYm9keS5nZXRGaXJzdEVsZW1lbnQoKTsNCi0gICAgICAgIGFzc2VydFRydWUoY2hpbGQgaW5zdGFuY2VvZiBPTVNvdXJjZWRFbGVtZW50KTsNCi0gICAgICAgIG9tc2UgPSAoT01Tb3VyY2VkRWxlbWVudCkgY2hpbGQ7DQotICAgICAgICBhc3NlcnRUcnVlKCFvbXNlLmlzRXhwYW5kZWQoKSk7DQotICAgICAgICBkcyA9IG9tc2UuZ2V0RGF0YVNvdXJjZSgpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShkcyBpbnN0YW5jZW9mIEpBWEJCbG9ja0ltcGwpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBTaW11bGF0ZSB0cmFuc3BvcnQNCi0gICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOw0KLSAgICAgICAgT01PdXRwdXRGb3JtYXQgb3V0cHV0Rm9ybWF0ID0gbmV3IE9NT3V0cHV0Rm9ybWF0KCk7DQotICAgICAgICBvdXRwdXRGb3JtYXQuc2V0RG9PcHRpbWl6ZSh0cnVlKTsNCi0gICAgICAgIG91dHB1dEZvcm1hdC5zZXRNaW1lQm91bmRhcnkoIk1JTUVCb3VuZGFyeV9BeGlzMlJvY2tzIik7DQotICAgICAgICBlbnYuc2VyaWFsaXplQW5kQ29uc3VtZShiYW9zLCBvdXRwdXRGb3JtYXQpOw0KLQ0KLSAgICAgICAgU3RyaW5nIG5ld1RleHQgPSBiYW9zLnRvU3RyaW5nKCk7DQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4obmV3VGV4dCk7DQotICAgICAgICBhc3NlcnRUcnVlKG5ld1RleHQuY29udGFpbnMoInNvYXAiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKG5ld1RleHQuY29udGFpbnMoIkVudmVsb3BlIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShuZXdUZXh0LmNvbnRhaW5zKCJCb2R5IikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShuZXdUZXh0LmluZGV4T2YoIk1JTUVCb3VuZGFyeV9BeGlzMlJvY2tzIikgPiAwKTsNCi0gICAgICAgIGFzc2VydFRydWUobmV3VGV4dC5pbmRleE9mKHNhbXBsZVRleHQpID4gMCk7DQotICAgICAgICBhc3NlcnRUcnVlKG5ld1RleHQuaW5kZXhPZigiPHNvYXBlbnY6Qm9keT48c2VuZEltYWdlIHhtbG5zPVwidXJuOi8vbXRvbS50ZXN0Lm9yZ1wiPjxpbnB1dD48aW1hZ2VEYXRhPjx4b3A6SW5jbHVkZSIpID4gMCk7ICAgICANCi0gICAgICAgIA0KLSAgICAgICAgLy8gTm93IGNoZWNrIHRoZSBjb3BpZWQgZW52ZWxvcGUNCi0gICAgICAgIGJvZHkgPSBlbnYyLmdldEJvZHkoKTsNCi0gICAgICAgIGNoaWxkID0gYm9keS5nZXRGaXJzdEVsZW1lbnQoKTsNCi0gICAgICAgIGFzc2VydFRydWUoY2hpbGQgaW5zdGFuY2VvZiBPTVNvdXJjZWRFbGVtZW50KTsNCi0gICAgICAgIG9tc2UgPSAoT01Tb3VyY2VkRWxlbWVudCkgY2hpbGQ7DQotICAgICAgICBhc3NlcnRUcnVlKCFvbXNlLmlzRXhwYW5kZWQoKSk7DQotICAgICAgICBkcyA9IG9tc2UuZ2V0RGF0YVNvdXJjZSgpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShkcyBpbnN0YW5jZW9mIEpBWEJEYXRhU291cmNlKTsNCi0gICAgICAgICAgDQotICAgICAgICAvLyBTaW11bGF0ZSB0cmFuc3BvcnQgb24gdGhlIGNvcGllZCBtZXNzYWdlDQotICAgICAgICBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOw0KLSAgICAgICAgb3V0cHV0Rm9ybWF0ID0gbmV3IE9NT3V0cHV0Rm9ybWF0KCk7DQotICAgICAgICBvdXRwdXRGb3JtYXQuc2V0RG9PcHRpbWl6ZSh0cnVlKTsNCi0gICAgICAgIG91dHB1dEZvcm1hdC5zZXRNaW1lQm91bmRhcnkoIk1JTUVCb3VuZGFyeV9BeGlzMlJvY2tzIik7DQotICAgICAgICBlbnYyLnNlcmlhbGl6ZUFuZENvbnN1bWUoYmFvcywgb3V0cHV0Rm9ybWF0KTsNCi0gICAgICAgIFN0cmluZyByZXN0b3JlZFRleHQgPSBiYW9zLnRvU3RyaW5nKCk7DQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4ocmVzdG9yZWRUZXh0KTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzdG9yZWRUZXh0LmNvbnRhaW5zKCJzb2FwIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN0b3JlZFRleHQuY29udGFpbnMoIkVudmVsb3BlIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN0b3JlZFRleHQuY29udGFpbnMoIkJvZHkiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3RvcmVkVGV4dC5pbmRleE9mKCJNSU1FQm91bmRhcnlfQXhpczJSb2NrcyIpID4gMCk7DQotICAgICAgICANCi0gICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IGF0dGFjaG1lbnQgaXMgbm90IGlubGluZWQNCi0gICAgICAgIGFzc2VydFRydWUocmVzdG9yZWRUZXh0LmluZGV4T2Yoc2FtcGxlVGV4dCkgPiAwKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzdG9yZWRUZXh0LmluZGV4T2YoIjxzb2FwZW52OkJvZHk+PHNlbmRJbWFnZSB4bWxucz1cInVybjovL210b20udGVzdC5vcmdcIj48aW5wdXQ+PGltYWdlRGF0YT48eG9wOkluY2x1ZGUiKSA+IDApOw0KLSAgICAgICAgDQotICAgIH0NCi0gICAgDQotICAgIHByaXZhdGUgTWVzc2FnZSBjcmVhdGVNZXNzYWdlKE9iamVjdCBqYXhiT2JqKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIC8vIENyZWF0ZSBhIFNPQVAgMS4xIE1lc3NhZ2UNCi0gICAgICAgIE1lc3NhZ2VGYWN0b3J5IG1mID0gKE1lc3NhZ2VGYWN0b3J5KSBGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShNZXNzYWdlRmFjdG9yeS5jbGFzcyk7DQotICAgICAgICBNZXNzYWdlIG0gPSBtZi5jcmVhdGUoUHJvdG9jb2wuc29hcDExKTsNCi0NCi0gICAgICAgIC8vIEdldCB0aGUgQmxvY2tGYWN0b3J5DQotICAgICAgICBKQVhCQmxvY2tGYWN0b3J5IGJmID0gKEpBWEJCbG9ja0ZhY3RvcnkpIEZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KEpBWEJCbG9ja0ZhY3RvcnkuY2xhc3MpOw0KLQ0KLSAgICAgICAgLy8gQ3JlYXRlIHRoZSBKQVhCQ29udGV4dA0KLSAgICAgICAgSkFYQkJsb2NrQ29udGV4dCBjb250ZXh0ID0NCi0gICAgICAgICAgICAgICAgbmV3IEpBWEJCbG9ja0NvbnRleHQoamF4Yk9iai5nZXRDbGFzcygpLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgLy8gQ3JlYXRlIGEgSkFYQkJsb2NrIHVzaW5nIHRoZSBFY2hvIG9iamVjdCBhcyB0aGUgY29udGVudC4gVGhpcyBzaW11bGF0ZXMNCi0gICAgICAgIC8vIHdoYXQgb2NjdXJzIG9uIHRoZSBvdXRib3VuZCBKQVgtV1MgRGlzcGF0Y2g8T2JqZWN0PiBjbGllbnQNCi0gICAgICAgIEJsb2NrIGJsb2NrID0gYmYuY3JlYXRlRnJvbShqYXhiT2JqLCBjb250ZXh0LCBudWxsKTsNCi0NCi0gICAgICAgIC8vIEFkZCB0aGUgYmxvY2sgdG8gdGhlIG1lc3NhZ2UgYXMgbm9ybWFsIGJvZHkgY29udGVudC4NCi0gICAgICAgIG0uc2V0Qm9keUJsb2NrKGJsb2NrKTsNCi0gICAgICAgIHJldHVybiBtOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL01lc3NhZ2VSUENUZXN0cy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvTWVzc2FnZVJQQ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhOWFiMGMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvTWVzc2FnZVJQQ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2U7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU91dHB1dEZvcm1hdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5PTVNvdXJjZWRFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuaW1wbC5idWlsZGVyLlN0QVhTT0FQTW9kZWxCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5kYXRhYmluZGluZy5KQVhCQmxvY2tDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5mYWN0b3J5LkpBWEJCbG9ja0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmZhY3RvcnkuTWVzc2FnZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmhlYWRlcnMuQ29uZmlnQm9keTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuaGVhZGVycy5Db25maWdIZWFkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5yZWdpc3RyeS5GYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51bml0VGVzdC5UZXN0TG9nZ2VyOwotaW1wb3J0IG9yZy50ZXN0LnN0b2NrMS5PYmplY3RGYWN0b3J5OwotaW1wb3J0IG9yZy50ZXN0LnN0b2NrMS5TdG9ja1ByaWNlOwotCi1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuU3R5bGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTElucHV0RmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKLQotLyoqCi0gKiBNZXNzYWdlVGVzdHMKLSAqIFRlc3RzIHRvIGNyZWF0ZSBhbmQgdmFsaWRhdGUgTWVzc2FnZSBwcm9jZXNzaW5nCi0gKiBUaGVzZSBhcmUgbm90IGNsaWVudC9zZXJ2ZXIgdGVzdHMuICBJbnN0ZWFkIHRoZSB0ZXN0cyBzaW11bGF0ZSB0aGUgcHJvY2Vzc2luZyBvZiBhIE1lc3NhZ2UgZHVyaW5nCi0gKiBjbGllbnQvc2VydmVyIHByb2Nlc3NpbmcuCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXNzYWdlUlBDVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQkvLyBTdHJpbmcgdGVzdCB2YXJpYWJsZXMKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgc29hcDExZW52ID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgc29hcDEyZW52ID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHNhbXBsZUVudmVsb3BlSGVhZDExID0KLSAgICAgICAgIjxzb2FwZW52OkVudmVsb3BlIHhtbG5zOnNvYXBlbnY9XCIiICsgc29hcDExZW52ICsgIlwiPiIgKwotICAgICAgICAiPHNvYXBlbnY6SGVhZGVyIC8+PHNvYXBlbnY6Qm9keT4iOwotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBzYW1wbGVFbnZlbG9wZUhlYWQxMiA9Ci0gICAgICAgICI8c29hcGVudjpFbnZlbG9wZSB4bWxuczpzb2FwZW52PVwiIiArIHNvYXAxMmVudiArICJcIj4iICsKLSAgICAgICAgIjxzb2FwZW52OkhlYWRlciAvPjxzb2FwZW52OkJvZHk+IjsKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgc2FtcGxlRW52ZWxvcGVUYWlsID0gCi0gICAgICAgICI8L3NvYXBlbnY6Qm9keT48L3NvYXBlbnY6RW52ZWxvcGU+IjsKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgc2FtcGxlVGV4dCA9Ci0gICAgICAgICI8bTpvcCB4bWxuczptPSd1cm46Ly9zYW1wbGUnPiIgKwotCQkiPG06cGFyYW0geG1sbnM6cHJlPSd1cm46Ly9zdG9jazEudGVzdC5vcmcnIHhtbG5zOnhzaT0naHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UnIHhzaTp0eXBlPSdwcmU6U3RvY2tQcmljZSc+IiArCi0JCSI8cHJpY2U+MTAwPC9wcmljZT4iICsKLQkJIjwvbTpwYXJhbT4iICsKLSAgICAgICAgIjwvbTpvcD4iOwotCQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBzYW1wbGVFbnZlbG9wZTExID0gCi0gICAgICAgIHNhbXBsZUVudmVsb3BlSGVhZDExICsKLSAgICAgICAgc2FtcGxlVGV4dCArCi0gICAgICAgIHNhbXBsZUVudmVsb3BlVGFpbDsKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgc2FtcGxlRW52ZWxvcGUxMiA9IAotICAgICAgICBzYW1wbGVFbnZlbG9wZUhlYWQxMiArCi0gICAgICAgIHNhbXBsZVRleHQgKwotICAgICAgICBzYW1wbGVFbnZlbG9wZVRhaWw7Ci0gICAgICAgIAotCQotCXByaXZhdGUgc3RhdGljIFhNTElucHV0RmFjdG9yeSBpbnB1dEZhY3RvcnkgPSBYTUxJbnB1dEZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLQkKLQlwdWJsaWMgTWVzc2FnZVJQQ1Rlc3RzKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBNZXNzYWdlUlBDVGVzdHMoU3RyaW5nIGFyZzApIHsKLQkJc3VwZXIoYXJnMCk7Ci0JfQotCQotCQotICAgIAotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIEpBWEJCbG9jayBjb250YWluaW5nIGEgSkFYLUIgYnVzaW5lc3Mgb2JqZWN0IAotICAgICAqIGFuZCBzaW11bGF0ZSBhIG5vcm1hbCBQcm94eSBvdXRwdXQgZmxvdwotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEpBWEJPdXRmbG93KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIENyZWF0ZSBhIFNPQVAgMS4xIE1lc3NhZ2UKLSAgICAgICAgTWVzc2FnZUZhY3RvcnkgbWYgPSAoTWVzc2FnZUZhY3RvcnkpCi0gICAgICAgICAgICBGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShNZXNzYWdlRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgIE1lc3NhZ2UgbSA9IG1mLmNyZWF0ZShQcm90b2NvbC5zb2FwMTEpOwotICAgICAgICAKLSAgICAgICAgLy8gSW5kaWNhdGUgdGhhdCB0aGUgc3R5bGUgaXMgUlBDLCBJbmRpY2F0ZSB0aGUgT3BlcmF0aW9uIFFOYW1lCi0gICAgICAgIG0uc2V0U3R5bGUoU3R5bGUuUlBDKTsKLSAgICAgICAgUU5hbWUgb3BRTmFtZSA9IG5ldyBRTmFtZSgidXJuOi8vc2FtcGxlIiwgIm9wIiwgIm0iKTsKLSAgICAgICAgbS5zZXRPcGVyYXRpb25FbGVtZW50KG9wUU5hbWUpOwotICAgICAgICAKLSAgICAgICAgLy8gR2V0IHRoZSBCbG9ja0ZhY3RvcnkKLSAgICAgICAgSkFYQkJsb2NrRmFjdG9yeSBiZiA9IChKQVhCQmxvY2tGYWN0b3J5KQotICAgICAgICAgICAgRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoSkFYQkJsb2NrRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgIAotICAgICAgICAvLyBDcmVhdGUgdGhlIEpBWEJDb250ZXh0Ci0gICAgICAgIEpBWEJCbG9ja0NvbnRleHQgY29udGV4dCA9IG5ldyBKQVhCQmxvY2tDb250ZXh0KFN0b2NrUHJpY2UuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7Ci0gICAgICAgIAotICAgICAgICAvLyBDcmVhdGUgdGhlIEpBWC1CIG9iamVjdAotICAgICAgICBPYmplY3RGYWN0b3J5IG9mID0gbmV3IE9iamVjdEZhY3RvcnkoKTsKLSAgICAgICAgU3RvY2tQcmljZSBvYmogPSBvZi5jcmVhdGVTdG9ja1ByaWNlKCk7Ci0gICAgICAgIG9iai5zZXRQcmljZSgiMTAwIik7Ci0gICAgICAgIAotICAgICAgICAvLyBDcmVhdGUgdGhlIEpBWC1CIEVsZW1lbnQKLSAgICAgICAgUU5hbWUgcGFyYW1RTmFtZSA9IG5ldyBRTmFtZSgidXJuOi8vc2FtcGxlIiwgInBhcmFtIiwgIm0iKTsKLSAgICAgICAgSkFYQkVsZW1lbnQgZSA9IG5ldyBKQVhCRWxlbWVudChwYXJhbVFOYW1lLCBTdG9ja1ByaWNlLmNsYXNzLCBvYmopOwotICAgICAgICAKLSAgICAgICAgLy8gQ3JlYXRlIGEgSkFYQkJsb2NrIHVzaW5nIHRoZSBwYXJhbSBvYmplY3QgYXMgdGhlIGNvbnRlbnQuICBUaGlzIHNpbXVsYXRlcwotICAgICAgICAvLyB3aGF0IG9jY3VycyBvbiB0aGUgb3V0Ym91bmQgSkFYLVdTIFByb3h5IGNsaWVudAotICAgICAgICBCbG9jayBibG9jayA9IGJmLmNyZWF0ZUZyb20oZSwgY29udGV4dCwgbnVsbCk7Ci0gICAgICAgIAotICAgICAgICAvLyBBZGQgdGhlIGJsb2NrIHRvIHRoZSBtZXNzYWdlIGFzIG5vcm1hbCBib2R5IGNvbnRlbnQuCi0gICAgICAgIG0uc2V0Qm9keUJsb2NrKGJsb2NrKTsKLSAgICAgICAgCi0gICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgbWVzc2FnZSBpcyBhIGZhdWx0LiAgVGhlIGNsaWVudC9zZXJ2ZXIgd2lsbCBhbHdheXMgY2FsbCB0aGlzIG1ldGhvZC4KLSAgICAgICAgLy8gVGhlIE1lc3NhZ2UgbXVzdCByZXNwb25kIGFwcHJvcHJpYXRlbHkgd2l0aG91dCBkb2luZyBhIGNvbnZlcnNpb24uCi0gICAgICAgIGJvb2xlYW4gaXNGYXVsdCA9IG0uaXNGYXVsdCgpOwotICAgICAgICBhc3NlcnRUcnVlKCFpc0ZhdWx0KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiWE1MUGFydCBSZXByZXNlbnRhdGlvbiBpcyAiICsgbS5nZXRYTUxQYXJ0Q29udGVudFR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgIlNQSU5FIi5lcXVhbHMobS5nZXRYTUxQYXJ0Q29udGVudFR5cGUoKSkpOwotICAgICAgICAKLSAgICAgICAgLy8gT24gYW4gb3V0Ym91bmQgZmxvdywgd2UgbmVlZCB0byBjb252ZXJ0IHRoZSBNZXNzYWdlIAotICAgICAgICAvLyB0byBhbiBPTUVsZW1lbnQsIHNwZWNpZmljYWxseSBhbiBPTSBTT0FQRW52ZWxvcGUsIAotICAgICAgICAvLyBzbyB3ZSBjYW4gc2V0IGl0IG9uIHRoZSBBeGlzMiBNZXNzYWdlQ29udGV4dAotICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlIGVudiA9IAotICAgICAgICAgICAgKG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGUpIG0uZ2V0QXNPTUVsZW1lbnQoKTsKLSAgICAgICAgCi0gICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgbWVzc2FnZSBpcyBhIGZhdWx0LiAgVGhlIGNsaWVudC9zZXJ2ZXIgd2lsbCBhbHdheXMgY2FsbCB0aGlzIG1ldGhvZC4KLSAgICAgICAgLy8gVGhlIE1lc3NhZ2UgbXVzdCByZXNwb25kIGFwcHJvcHJpYXRlbHkgd2l0aG91dCBkb2luZyBhIGNvbnZlcnNpb24uCi0gICAgICAgIGlzRmF1bHQgPSBtLmlzRmF1bHQoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSghaXNGYXVsdCk7Ci0gICAgICAgIGFzc2VydFRydWUoIlhNTFBhcnQgUmVwcmVzZW50YXRpb24gaXMgIiArIG0uZ2V0WE1MUGFydENvbnRlbnRUeXBlKCksCi0gICAgICAgICAgICAgICAgICAgICJPTSIuZXF1YWxzKG0uZ2V0WE1MUGFydENvbnRlbnRUeXBlKCkpKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFNlcmlhbGl6ZSB0aGUgRW52ZWxvcGUgdXNpbmcgdGhlIHNhbWUgbWVjaGFuaXNtIGFzIHRoZSAKLSAgICAgICAgLy8gSFRUUCBjbGllbnQuCi0gICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICBlbnYuc2VyaWFsaXplQW5kQ29uc3VtZShiYW9zLCBuZXcgT01PdXRwdXRGb3JtYXQoKSk7Ci0gICAgICAgIAotICAgICAgICAvLyBUbyBjaGVjayB0aGF0IHRoZSBvdXRwdXQgaXMgY29ycmVjdCwgZ2V0IHRoZSBTdHJpbmcgY29udGVudHMgb2YgdGhlIAotICAgICAgICAvLyByZWFkZXIKLSAgICAgICAgU3RyaW5nIG5ld1RleHQgPSBiYW9zLnRvU3RyaW5nKCk7Ci0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKG5ld1RleHQpOwotICAgICAgICBhc3NlcnRUcnVlKG5ld1RleHQuY29udGFpbnMoIm06b3AiKSk7Ci0gICAgICAgIGFzc2VydFRydWUobmV3VGV4dC5jb250YWlucygibTpwYXJhbSIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShuZXdUZXh0LmNvbnRhaW5zKCIxMDAiKSk7Ci0gICAgICAgIGFzc2VydFRydWUobmV3VGV4dC5jb250YWlucygiRW52ZWxvcGUiKSk7Ci0gICAgICAgIGFzc2VydFRydWUobmV3VGV4dC5jb250YWlucygiQm9keSIpKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgSkFYQkJsb2NrIGNvbnRhaW5pbmcgYSBKQVgtQiBidXNpbmVzcyBvYmplY3QgCi0gICAgICogYW5kIHNpbXVsYXRlIGEgbm9ybWFsIFByb3h5IG91dHB1dCBmbG93Ci0gICAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SkFYQk91dGZsb3dQZXJmKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIENyZWF0ZSBhIFNPQVAgMS4xIE1lc3NhZ2UKLSAgICAgICAgTWVzc2FnZUZhY3RvcnkgbWYgPSAoTWVzc2FnZUZhY3RvcnkpCi0gICAgICAgICAgICBGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShNZXNzYWdlRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgIE1lc3NhZ2UgbSA9IG1mLmNyZWF0ZShQcm90b2NvbC5zb2FwMTEpOwotICAgICAgICAKLSAgICAgICAgLy8gSW5kaWNhdGUgdGhhdCB0aGUgc3R5bGUgaXMgUlBDLCBJbmRpY2F0ZSB0aGUgT3BlcmF0aW9uIFFOYW1lCi0gICAgICAgIG0uc2V0U3R5bGUoU3R5bGUuUlBDKTsKLSAgICAgICAgUU5hbWUgb3BRTmFtZSA9IG5ldyBRTmFtZSgidXJuOi8vc2FtcGxlIiwgIm9wIiwgIm0iKTsKLSAgICAgICAgbS5zZXRPcGVyYXRpb25FbGVtZW50KG9wUU5hbWUpOwotICAgICAgICAKLSAgICAgICAgLy8gR2V0IHRoZSBCbG9ja0ZhY3RvcnkKLSAgICAgICAgSkFYQkJsb2NrRmFjdG9yeSBiZiA9IChKQVhCQmxvY2tGYWN0b3J5KQotICAgICAgICAgICAgRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoSkFYQkJsb2NrRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgIAotICAgICAgICAvLyBDcmVhdGUgdGhlIEpBWEJDb250ZXh0Ci0gICAgICAgIEpBWEJCbG9ja0NvbnRleHQgY29udGV4dCA9IG5ldyBKQVhCQmxvY2tDb250ZXh0KFN0b2NrUHJpY2UuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7Ci0gICAgICAgIAotICAgICAgICAvLyBDcmVhdGUgdGhlIEpBWC1CIG9iamVjdAotICAgICAgICBPYmplY3RGYWN0b3J5IG9mID0gbmV3IE9iamVjdEZhY3RvcnkoKTsKLSAgICAgICAgU3RvY2tQcmljZSBvYmogPSBvZi5jcmVhdGVTdG9ja1ByaWNlKCk7Ci0gICAgICAgIG9iai5zZXRQcmljZSgiMTAwIik7Ci0gICAgICAgIAotICAgICAgICAvLyBDcmVhdGUgdGhlIEpBWC1CIEVsZW1lbnQKLSAgICAgICAgUU5hbWUgcGFyYW1RTmFtZSA9IG5ldyBRTmFtZSgidXJuOi8vc2FtcGxlIiwgInBhcmFtIiwgIm0iKTsKLSAgICAgICAgSkFYQkVsZW1lbnQgZSA9IG5ldyBKQVhCRWxlbWVudChwYXJhbVFOYW1lLCBTdG9ja1ByaWNlLmNsYXNzLCBvYmopOwotICAgICAgICAKLSAgICAgICAgLy8gQ3JlYXRlIGEgSkFYQkJsb2NrIHVzaW5nIHRoZSBwYXJhbSBvYmplY3QgYXMgdGhlIGNvbnRlbnQuICBUaGlzIHNpbXVsYXRlcwotICAgICAgICAvLyB3aGF0IG9jY3VycyBvbiB0aGUgb3V0Ym91bmQgSkFYLVdTIFByb3h5IGNsaWVudAotICAgICAgICBCbG9jayBibG9jayA9IGJmLmNyZWF0ZUZyb20oZSwgY29udGV4dCwgbnVsbCk7Ci0gICAgICAgIAotICAgICAgICAvLyBBZGQgdGhlIGJsb2NrIHRvIHRoZSBtZXNzYWdlIGFzIG5vcm1hbCBib2R5IGNvbnRlbnQuCi0gICAgICAgIG0uc2V0Qm9keUJsb2NrKGJsb2NrKTsKLSAgICAgICAgCi0gICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgbWVzc2FnZSBpcyBhIGZhdWx0LiAgVGhlIGNsaWVudC9zZXJ2ZXIgd2lsbCBhbHdheXMgY2FsbCB0aGlzIG1ldGhvZC4KLSAgICAgICAgLy8gVGhlIE1lc3NhZ2UgbXVzdCByZXNwb25kIGFwcHJvcHJpYXRlbHkgd2l0aG91dCBkb2luZyBhIGNvbnZlcnNpb24uCi0gICAgICAgIGJvb2xlYW4gaXNGYXVsdCA9IG0uaXNGYXVsdCgpOwotICAgICAgICBhc3NlcnRUcnVlKCFpc0ZhdWx0KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiWE1MUGFydCBSZXByZXNlbnRhdGlvbiBpcyAiICsgbS5nZXRYTUxQYXJ0Q29udGVudFR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgIlNQSU5FIi5lcXVhbHMobS5nZXRYTUxQYXJ0Q29udGVudFR5cGUoKSkpOwotICAgICAgICAKLSAgICAgICAgLy8gT24gYW4gb3V0Ym91bmQgZmxvdywgd2UgbmVlZCB0byBjb252ZXJ0IHRoZSBNZXNzYWdlIAotICAgICAgICAvLyB0byBhbiBPTUVsZW1lbnQsIHNwZWNpZmljYWxseSBhbiBPTSBTT0FQRW52ZWxvcGUsIAotICAgICAgICAvLyBzbyB3ZSBjYW4gc2V0IGl0IG9uIHRoZSBBeGlzMiBNZXNzYWdlQ29udGV4dAotICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlIGVudiA9IAotICAgICAgICAgICAgKG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGUpIG0uZ2V0QXNPTUVsZW1lbnQoKTsKLSAgICAgICAgCi0gICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgbWVzc2FnZSBpcyBhIGZhdWx0LiAgVGhlIGNsaWVudC9zZXJ2ZXIgd2lsbCBhbHdheXMgY2FsbCB0aGlzIG1ldGhvZC4KLSAgICAgICAgLy8gVGhlIE1lc3NhZ2UgbXVzdCByZXNwb25kIGFwcHJvcHJpYXRlbHkgd2l0aG91dCBkb2luZyBhIGNvbnZlcnNpb24uCi0gICAgICAgIGlzRmF1bHQgPSBtLmlzRmF1bHQoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSghaXNGYXVsdCk7Ci0gICAgICAgIGFzc2VydFRydWUoIlhNTFBhcnQgUmVwcmVzZW50YXRpb24gaXMgIiArIG0uZ2V0WE1MUGFydENvbnRlbnRUeXBlKCksCi0gICAgICAgICAgICAgICAgICAgICJPTSIuZXF1YWxzKG0uZ2V0WE1MUGFydENvbnRlbnRUeXBlKCkpKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFBFUkZPUk1BTkNFIENIRUNLOgotICAgICAgICAvLyBUaGUgcGFyYW0gaW4gdGhlIGJvZHkgc2hvdWxkIGJlIGFuIE9NU291cmNlZEVsZW1lbnQKLSAgICAgICAgT01FbGVtZW50IG8gPSBlbnYuZ2V0Qm9keSgpLmdldEZpcnN0RWxlbWVudCgpLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgICBhc3NlcnRUcnVlKG8gaW5zdGFuY2VvZiBPTVNvdXJjZWRFbGVtZW50SW1wbCk7Ci0gICAgICAgIGFzc2VydFRydWUoKChPTVNvdXJjZWRFbGVtZW50SW1wbClvKS5pc0V4cGFuZGVkKCkgPT0gZmFsc2UpOwotICAgICAgICAKLSAgICAgICAgLy8gU2VyaWFsaXplIHRoZSBFbnZlbG9wZSB1c2luZyB0aGUgc2FtZSBtZWNoYW5pc20gYXMgdGhlIAotICAgICAgICAvLyBIVFRQIGNsaWVudC4KLSAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgIGVudi5zZXJpYWxpemVBbmRDb25zdW1lKGJhb3MsIG5ldyBPTU91dHB1dEZvcm1hdCgpKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFRvIGNoZWNrIHRoYXQgdGhlIG91dHB1dCBpcyBjb3JyZWN0LCBnZXQgdGhlIFN0cmluZyBjb250ZW50cyBvZiB0aGUgCi0gICAgICAgIC8vIHJlYWRlcgotICAgICAgICBTdHJpbmcgbmV3VGV4dCA9IGJhb3MudG9TdHJpbmcoKTsKLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcobmV3VGV4dCk7Ci0gICAgICAgIGFzc2VydFRydWUobmV3VGV4dC5jb250YWlucygibTpvcCIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShuZXdUZXh0LmNvbnRhaW5zKCJtOnBhcmFtIikpOwotICAgICAgICBhc3NlcnRUcnVlKG5ld1RleHQuY29udGFpbnMoIjEwMCIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShuZXdUZXh0LmNvbnRhaW5zKCJFbnZlbG9wZSIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShuZXdUZXh0LmNvbnRhaW5zKCJCb2R5IikpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0SkFYQkluZmxvd19zb2FwMTEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgX3Rlc3RKQVhCSW5mbG93KHNhbXBsZUVudmVsb3BlMTEpOwotICAgIH0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SkFYQkluZmxvd19zb2FwMTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgX3Rlc3RKQVhCSW5mbG93KHNhbXBsZUVudmVsb3BlMTIpOwotICAgIH0KLSAgICBwdWJsaWMgdm9pZCBfdGVzdEpBWEJJbmZsb3coU3RyaW5nIHNhbXBsZUpBWEJFbnZlbG9wZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIENyZWF0ZSBhIFNPQVAgT00gb3V0IG9mIHRoZSBzYW1wbGUgaW5jb21pbmcgWE1MLiAgVGhpcwotICAgICAgICAvLyBzaW11bGF0ZXMgd2hhdCBBeGlzMiB3aWxsIGJlIGRvaW5nIHdpdGggdGhlIGluYm91bmQgbWVzc2FnZS4gCi0gICAgICAgIFN0cmluZ1JlYWRlciBzciA9IG5ldyBTdHJpbmdSZWFkZXIoc2FtcGxlSkFYQkVudmVsb3BlKTsKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIGluZmxvdyA9IGlucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoc3IpOwotICAgICAgICBTdEFYU09BUE1vZGVsQnVpbGRlciBidWlsZGVyID0gbmV3IFN0QVhTT0FQTW9kZWxCdWlsZGVyKGluZmxvdywgbnVsbCk7Ci0gICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSBidWlsZGVyLmdldFNPQVBFbnZlbG9wZSgpOwotICAgICAgICAKLSAgICAgICAgLy8gQ3JlYXRlIGEgU09BUCAxLjEgTWVzc2FnZSBmcm9tIHRoZSBzYW1wbGUgaW5jb21pbmcgWE1MCi0gICAgICAgIE1lc3NhZ2VGYWN0b3J5IG1mID0gKE1lc3NhZ2VGYWN0b3J5KQotICAgICAgICAgICAgRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoTWVzc2FnZUZhY3RvcnkuY2xhc3MpOwotICAgICAgICBNZXNzYWdlIG0gPSBtZi5jcmVhdGVGcm9tKG9tRWxlbWVudCwgbnVsbCk7Ci0gICAgICAgIAotICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhlIG1lc3NhZ2UgaXMgYSBmYXVsdC4gIFRoZSBjbGllbnQvc2VydmVyIHdpbGwgYWx3YXlzIGNhbGwgdGhpcyBtZXRob2QuCi0gICAgICAgIC8vIFRoZSBNZXNzYWdlIG11c3QgcmVzcG9uZCBhcHByb3ByaWF0ZWx5IHdpdGhvdXQgZG9pbmcgYSBjb252ZXJzaW9uLgotICAgICAgICBib29sZWFuIGlzRmF1bHQgPSBtLmlzRmF1bHQoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSghaXNGYXVsdCk7Ci0gICAgICAgIGFzc2VydFRydWUoIlhNTFBhcnQgUmVwcmVzZW50YXRpb24gaXMgIiArIG0uZ2V0WE1MUGFydENvbnRlbnRUeXBlKCksCi0gICAgICAgICAgICAgICAgICAgICJPTSIuZXF1YWxzKG0uZ2V0WE1MUGFydENvbnRlbnRUeXBlKCkpKTsKLSAgICAgICAgCi0gICAgICAgIC8vIEluZGljYXRlIHRoYXQgdGhlIG1lc3NhZ2Ugc2hvdWxkIGJlIGFjY2Vzc2VkIGFzIFJQQwotICAgICAgICBtLnNldFN0eWxlKFN0eWxlLlJQQyk7Ci0gICAgICAgIAotICAgICAgICAvLyBHZXQgdGhlIEJsb2NrRmFjdG9yeQotICAgICAgICBKQVhCQmxvY2tGYWN0b3J5IGJmID0gKEpBWEJCbG9ja0ZhY3RvcnkpCi0gICAgICAgICAgICBGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShKQVhCQmxvY2tGYWN0b3J5LmNsYXNzKTsKLSAgICAgICAgCi0gICAgICAgIC8vIENyZWF0ZSB0aGUgSkFYQkNvbnRleHQgaW5zdGFuY2UgdGhhdCB3aWxsIGJlIHVzZWQKLSAgICAgICAgLy8gdG8gZGVzZXJpYWxpemUgdGhlIEpBWC1CIG9iamVjdCBjb250ZW50IGluIHRoZSBtZXNzYWdlLgotICAgICAgICBKQVhCQmxvY2tDb250ZXh0IGNvbnRleHQgPSBuZXcgSkFYQkJsb2NrQ29udGV4dChTdG9ja1ByaWNlLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOwotICAgICAgICAKLSAgICAgICAgLy8gR2V0IHRoZSBKQVhCQmxvY2sgdGhhdCB3cmFwcyB0aGUgY29udGVudAotICAgICAgICBCbG9jayBiID0gbS5nZXRCb2R5QmxvY2soY29udGV4dCwgYmYpOwotICAgICAKLSAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBtZXNzYWdlIGlzIGEgZmF1bHQuICBUaGUgY2xpZW50L3NlcnZlciB3aWxsIGFsd2F5cyBjYWxsIHRoaXMgbWV0aG9kLgotICAgICAgICAvLyBUaGUgTWVzc2FnZSBtdXN0IHJlc3BvbmQgYXBwcm9wcmlhdGVseSB3aXRob3V0IGRvaW5nIGEgY29udmVyc2lvbi4KLSAgICAgICAgaXNGYXVsdCA9IG0uaXNGYXVsdCgpOwotICAgICAgICBhc3NlcnRUcnVlKCFpc0ZhdWx0KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiWE1MUGFydCBSZXByZXNlbnRhdGlvbiBpcyAiICsgbS5nZXRYTUxQYXJ0Q29udGVudFR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgIlNQSU5FIi5lcXVhbHMobS5nZXRYTUxQYXJ0Q29udGVudFR5cGUoKSkpOwotICAgICAgICAKLSAgICAgICAgLy8gR2V0IHRoZSBidXNpbmVzcyBvYmplY3QgZnJvbSB0aGUgYmxvY2ssIHdoaWNoIHNob3VsZCBiZSBhIAotICAgICAgICAvLyBKQVgtQiBvYmplY3QKLSAgICAgICAgT2JqZWN0IGJvID0gYi5nZXRCdXNpbmVzc09iamVjdCh0cnVlKTsKLSAgICAgICAgCi0gICAgICAgIC8vIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgcmlnaHQgb2JqZWN0IHdhcyByZXR1cm5lZAotICAgICAgICBhc3NlcnROb3ROdWxsKGJvKTsKLSAgICAgICAgaWYgKGJvIGluc3RhbmNlb2YgSkFYQkVsZW1lbnQpIHsKLSAgICAgICAgICAgIGJvID0gKChKQVhCRWxlbWVudCkgYm8pLmdldFZhbHVlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZShibyBpbnN0YW5jZW9mIFN0b2NrUHJpY2UpOwotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIC8vIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgY29udGVudCBvZiB0aGF0IG9iamVjdCBpcyBjb3JyZWN0Ci0gICAgICAgIFN0b2NrUHJpY2Ugb2JqID0gKFN0b2NrUHJpY2UpIGJvOwotICAgICAgICBhc3NlcnROb3ROdWxsKG9iaik7Ci0gICAgICAgIGFzc2VydFRydWUob2JqLmdldFByaWNlKCkuZXF1YWxzKCIxMDAiKSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RKQVhCSGVhZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyB4bWwgPSAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XG4iICsKLSAgICAgICAgICAgICAgICAiPHNvYXBlbnY6RW52ZWxvcGUgeG1sbnM6c29hcGVudj1cImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvXCI+XG4iICsKLSAgICAgICAgICAgICAgICAiXHQ8c29hcGVudjpIZWFkZXI+XG4iICsKLSAgICAgICAgICAgICAgICAiXHRcdDxuczI6Q29uZmlnSGVhZGVyMiB4bWxuczpuczI9XCJodHRwOi8vaGVhZGVycy5tZXNzYWdlLmpheHdzLmF4aXMyLmFwYWNoZS5vcmcvdHlwZXM0XCI+XG4iICsKLSAgICAgICAgICAgICAgICAiXHRcdFx0PG1lc3NhZ2U+Y29uZmlnSGVhZGVyMjwvbWVzc2FnZT5cbiIgKwotICAgICAgICAgICAgICAgICJcdFx0PC9uczI6Q29uZmlnSGVhZGVyMj5cbiIgKwotICAgICAgICAgICAgICAgICJcdFx0PG5zMjpDb25maWdIZWFkZXIzIHhtbG5zOm5zMj1cImh0dHA6Ly9oZWFkZXJzLm1lc3NhZ2UuamF4d3MuYXhpczIuYXBhY2hlLm9yZy90eXBlczRcIj5cbiIgKwotICAgICAgICAgICAgICAgICJcdFx0XHQ8bWVzc2FnZT54eXo8L21lc3NhZ2U+XG4iICsKLSAgICAgICAgICAgICAgICAiXHRcdDwvbnMyOkNvbmZpZ0hlYWRlcjM+XG4iICsKLSAgICAgICAgICAgICAgICAiXHQ8L3NvYXBlbnY6SGVhZGVyPlxuIiArCi0gICAgICAgICAgICAgICAgIlx0PHNvYXBlbnY6Qm9keT5cbiIgKwotICAgICAgICAgICAgICAgICJcdFx0PHJwY09wOkNvbmZpZ1Jlc3BvbnNlIHhtbG5zOnJwY09wPVwiaHR0cDovL2hlYWRlcnMubWVzc2FnZS5qYXh3cy5heGlzMi5hcGFjaGUub3JnL3R5cGVzNFwiPlxuIiArCi0gICAgICAgICAgICAgICAgIlx0XHQ8cnBjUGFyYW06Q29uZmlnQm9keSB4bWxuczpycGNQYXJhbT1cImh0dHA6Ly9oZWFkZXJzLm1lc3NhZ2UuamF4d3MuYXhpczIuYXBhY2hlLm9yZy90eXBlczRcIj5cbiIgKwotICAgICAgICAgICAgICAgICJcdFx0XHQ8bWVzc2FnZT5Hb3QgaXQ8L21lc3NhZ2U+XG4iICsKLSAgICAgICAgICAgICAgICAiXHRcdDwvcnBjUGFyYW06Q29uZmlnQm9keT5cbiIgKwotICAgICAgICAgICAgICAgICJcdFx0PC9ycGNQYXJhbTpDb25maWdSZXNwb25zZT5cbiIgKwotICAgICAgICAgICAgICAgICJcdDwvc29hcGVudjpCb2R5PlxuIiArCi0gICAgICAgICAgICAgICAgIjwvc29hcGVudjpFbnZlbG9wZT4iOwotCi0gICAgICAgIC8vIENyZWF0ZSBhIFNPQVAgT00gb3V0IG9mIHRoZSBzYW1wbGUgaW5jb21pbmcgWE1MLiAgVGhpcwotICAgICAgICAvLyBzaW11bGF0ZXMgd2hhdCBBeGlzMiB3aWxsIGJlIGRvaW5nIHdpdGggdGhlIGluYm91bmQgbWVzc2FnZS4gCi0gICAgICAgIFN0cmluZ1JlYWRlciBzciA9IG5ldyBTdHJpbmdSZWFkZXIoeG1sKTsKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIGluZmxvdyA9IGlucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoc3IpOwotICAgICAgICBTdEFYU09BUE1vZGVsQnVpbGRlciBidWlsZGVyID0gbmV3IFN0QVhTT0FQTW9kZWxCdWlsZGVyKGluZmxvdywgbnVsbCk7Ci0gICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSBidWlsZGVyLmdldFNPQVBFbnZlbG9wZSgpOwotICAgICAgICAKLSAgICAgICAgLy8gQ3JlYXRlIGEgU09BUCAxLjEgTWVzc2FnZSBmcm9tIHRoZSBzYW1wbGUgaW5jb21pbmcgWE1MCi0gICAgICAgIE1lc3NhZ2VGYWN0b3J5IG1mID0gKE1lc3NhZ2VGYWN0b3J5KQotICAgICAgICAgICAgRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoTWVzc2FnZUZhY3RvcnkuY2xhc3MpOwotICAgICAgICBNZXNzYWdlIG0gPSBtZi5jcmVhdGVGcm9tKG9tRWxlbWVudCwgbnVsbCk7Ci0gICAgICAgIAotICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhlIG1lc3NhZ2UgaXMgYSBmYXVsdC4gIFRoZSBjbGllbnQvc2VydmVyIHdpbGwgYWx3YXlzIGNhbGwgdGhpcyBtZXRob2QuCi0gICAgICAgIC8vIFRoZSBNZXNzYWdlIG11c3QgcmVzcG9uZCBhcHByb3ByaWF0ZWx5IHdpdGhvdXQgZG9pbmcgYSBjb252ZXJzaW9uLgotICAgICAgICBib29sZWFuIGlzRmF1bHQgPSBtLmlzRmF1bHQoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSghaXNGYXVsdCk7Ci0gICAgICAgIGFzc2VydFRydWUoIlhNTFBhcnQgUmVwcmVzZW50YXRpb24gaXMgIiArIG0uZ2V0WE1MUGFydENvbnRlbnRUeXBlKCksCi0gICAgICAgICAgICAgICAgICAgICJPTSIuZXF1YWxzKG0uZ2V0WE1MUGFydENvbnRlbnRUeXBlKCkpKTsKLSAgICAgICAgCi0gICAgICAgIC8vIEluZGljYXRlIHRoYXQgdGhlIG1lc3NhZ2Ugc2hvdWxkIGJlIGFjY2Vzc2VkIGFzIFJQQwotICAgICAgICBtLnNldFN0eWxlKFN0eWxlLlJQQyk7Ci0gICAgICAgIAotICAgICAgICAvLyBHZXQgdGhlIEJsb2NrRmFjdG9yeQotICAgICAgICBKQVhCQmxvY2tGYWN0b3J5IGJmID0gKEpBWEJCbG9ja0ZhY3RvcnkpCi0gICAgICAgICAgICBGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShKQVhCQmxvY2tGYWN0b3J5LmNsYXNzKTsKLSAgICAgICAgCi0gICAgICAgIC8vIENyZWF0ZSB0aGUgSkFYQkNvbnRleHQgaW5zdGFuY2UgdGhhdCB3aWxsIGJlIHVzZWQKLSAgICAgICAgLy8gdG8gZGVzZXJpYWxpemUgdGhlIEpBWC1CIG9iamVjdCBjb250ZW50IGluIHRoZSBtZXNzYWdlLgotICAgICAgICBKQVhCQmxvY2tDb250ZXh0IGNvbnRleHQgPSBuZXcgSkFYQkJsb2NrQ29udGV4dChDb25maWdIZWFkZXIuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7Ci0gICAgICAgIAotICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhlIG1lc3NhZ2UgaXMgYSBmYXVsdC4gIFRoZSBjbGllbnQvc2VydmVyIHdpbGwgYWx3YXlzIGNhbGwgdGhpcyBtZXRob2QuCi0gICAgICAgIC8vIFRoZSBNZXNzYWdlIG11c3QgcmVzcG9uZCBhcHByb3ByaWF0ZWx5IHdpdGhvdXQgZG9pbmcgYSBjb252ZXJzaW9uLgotICAgICAgICBpc0ZhdWx0ID0gbS5pc0ZhdWx0KCk7Ci0gICAgICAgIGFzc2VydFRydWUoIWlzRmF1bHQpOwotCi0gICAgICAgIC8vIEdldCB0aGUgSkFYQkJsb2NrIHRoYXQgd3JhcHMgdGhlIGNvbnRlbnQKLSAgICAgICAgQmxvY2sgYmxvY2sgPSBtLmdldEhlYWRlckJsb2NrKCJodHRwOi8vaGVhZGVycy5tZXNzYWdlLmpheHdzLmF4aXMyLmFwYWNoZS5vcmcvdHlwZXM0IiwiQ29uZmlnSGVhZGVyMiIsIGNvbnRleHQsIGJmKTsKLQotICAgICAgICAvLyBHZXQgdGhlIGJ1c2luZXNzIG9iamVjdCBmcm9tIHRoZSBibG9jaywgd2hpY2ggc2hvdWxkIGJlIGEgCi0gICAgICAgIC8vIEpBWC1CIG9iamVjdAotICAgICAgICBPYmplY3QgYm8gPSBibG9jay5nZXRCdXNpbmVzc09iamVjdCh0cnVlKTsKLSAgICAgICAgCi0gICAgICAgIC8vIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgcmlnaHQgb2JqZWN0IHdhcyByZXR1cm5lZAotICAgICAgICBhc3NlcnROb3ROdWxsKGJvKTsKLSAgICAgICAgaWYgKGJvIGluc3RhbmNlb2YgSkFYQkVsZW1lbnQpIHsKLSAgICAgICAgICAgIGJvID0gKChKQVhCRWxlbWVudCkgYm8pLmdldFZhbHVlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZShibyBpbnN0YW5jZW9mIENvbmZpZ0hlYWRlcik7Ci0gICAgICAgIAotICAgICAgICBCbG9jayBibG9jazIgPSBtLmdldEJvZHlCbG9jayhjb250ZXh0LCBiZik7Ci0gICAgICAgIE9iamVjdCBiMiA9IGJsb2NrMi5nZXRCdXNpbmVzc09iamVjdCh0cnVlKTsKLSAgICAgICAgaWYgKGIyIGluc3RhbmNlb2YgSkFYQkVsZW1lbnQpIHsKLSAgICAgICAgICAgIGIyID0gKChKQVhCRWxlbWVudCkgYjIpLmdldFZhbHVlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZShiMiBpbnN0YW5jZW9mIENvbmZpZ0JvZHkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL01lc3NhZ2VUZXN0cy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvTWVzc2FnZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4YWM3MmMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvTWVzc2FnZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDc2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01PdXRwdXRGb3JtYXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTVNvdXJjZWRFbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5sbG9tLk9NU291cmNlZEVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5pbXBsLmJ1aWxkZXIuU3RBWFNPQVBNb2RlbEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhc291cmNlLmpheGIuSkFYQkN1c3RvbUJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhc291cmNlLmpheGIuSkFYQkRTQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFzb3VyY2UuamF4Yi5KQVhCRGF0YVNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmFkZHJlc3NpbmcuU3VibWlzc2lvbkVuZHBvaW50UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuYWRkcmVzc2luZy5TdWJtaXNzaW9uRW5kcG9pbnRSZWZlcmVuY2VCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5kYXRhYmluZGluZy5KQVhCQmxvY2tDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5kYXRhYmluZGluZy5KQVhCVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmZhY3RvcnkuSkFYQkJsb2NrRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZmFjdG9yeS5NZXNzYWdlRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZmFjdG9yeS5TQUFKQ29udmVydGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZmFjdG9yeS5YTUxTdHJpbmdCbG9ja0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLnV0aWwuU0FBSkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnJlZ2lzdHJ5LkZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnVuaXRUZXN0LlRlc3RMb2dnZXI7Ci0KLWltcG9ydCB0ZXN0LkVjaG9TdHJpbmdSZXNwb25zZTsKLWltcG9ydCB0ZXN0Lk9iamVjdEZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCQ29udGV4dDsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBFbnZlbG9wZTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQTWVzc2FnZTsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTElucHV0RmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZheC54bWwud3Mud3NhZGRyZXNzaW5nLlczQ0VuZHBvaW50UmVmZXJlbmNlOwotaW1wb3J0IGphdmF4LnhtbC53cy53c2FkZHJlc3NpbmcuVzNDRW5kcG9pbnRSZWZlcmVuY2VCdWlsZGVyOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7Ci0KLS8qKgotICogTWVzc2FnZVRlc3RzCi0gKiBUZXN0cyB0byBjcmVhdGUgYW5kIHZhbGlkYXRlIE1lc3NhZ2UgcHJvY2Vzc2luZwotICogVGhlc2UgYXJlIG5vdCBjbGllbnQvc2VydmVyIHRlc3RzLiAgCi0gKiBJbnN0ZWFkIHRoZSB0ZXN0cyBzaW11bGF0ZSB0aGUgcHJvY2Vzc2luZyBvZiBhIE1lc3NhZ2UgZHVyaW5nIGNsaWVudC9zZXJ2ZXIgcHJvY2Vzc2luZy4KLSAqLwotcHVibGljIGNsYXNzIE1lc3NhZ2VUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCS8vIFN0cmluZyB0ZXN0IHZhcmlhYmxlcwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBzb2FwMTFlbnYgPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBzb2FwMTJlbnYgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgc2FtcGxlRW52ZWxvcGVIZWFkMTEgPQotICAgICAgICAiPHNvYXBlbnY6RW52ZWxvcGUgeG1sbnM6c29hcGVudj1cIiIgKyBzb2FwMTFlbnYgKyAiXCI+IiArCi0gICAgICAgICI8c29hcGVudjpIZWFkZXIgLz48c29hcGVudjpCb2R5PiI7Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHNhbXBsZUVudmVsb3BlSGVhZDEyID0KLSAgICAgICAgIjxzb2FwZW52OkVudmVsb3BlIHhtbG5zOnNvYXBlbnY9XCIiICsgc29hcDEyZW52ICsgIlwiPiIgKwotICAgICAgICAiPHNvYXBlbnY6SGVhZGVyIC8+PHNvYXBlbnY6Qm9keT4iOwotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBzYW1wbGVFbnZlbG9wZVRhaWwgPSAKLSAgICAgICAgIjwvc29hcGVudjpCb2R5Pjwvc29hcGVudjpFbnZlbG9wZT4iOwotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBzYW1wbGVUZXh0ID0KLQkJIjxwcmU6YSB4bWxuczpwcmU9XCJ1cm46Ly9zYW1wbGVcIj4iICsKLQkJIjxiPkhlbGxvPC9iPiIgKwotCQkiPGM+V29ybGQ8L2M+IiArCi0JCSI8L3ByZTphPiI7Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHNhbXBsZURvdWJsZSA9Ci0gICAgICAgICI8cHJlOmEgeG1sbnM6cHJlPVwidXJuOi8vc2FtcGxlXCI+IiArCi0gICAgICAgICI8Yj5IZWxsbzwvYj4iICsKLSAgICAgICAgIjxjPldvcmxkPC9jPiIgKwotICAgICAgICAiPC9wcmU6YT4iICsKLSAgICAgICAgIjxwcmU6YWEgeG1sbnM6cHJlPVwidXJuOi8vc2FtcGxlXCI+IiArCi0gICAgICAgICI8Yj5IZWxsbzwvYj4iICsKLSAgICAgICAgIjxjPldvcmxkPC9jPiIgKwotICAgICAgICAiPC9wcmU6YWE+IjsKLQkKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgc2FtcGxlRW52ZWxvcGUxMSA9IAotICAgICAgICBzYW1wbGVFbnZlbG9wZUhlYWQxMSArCi0gICAgICAgIHNhbXBsZVRleHQgKwotICAgICAgICBzYW1wbGVFbnZlbG9wZVRhaWw7Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHNhbXBsZUVudmVsb3BlMTIgPSAKLSAgICAgICAgc2FtcGxlRW52ZWxvcGVIZWFkMTIgKwotICAgICAgICBzYW1wbGVUZXh0ICsKLSAgICAgICAgc2FtcGxlRW52ZWxvcGVUYWlsOwotICAgICAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgc2FtcGxlSkFYQlRleHQgPSAKLSAgICAgICAgIjxlY2hvU3RyaW5nUmVzcG9uc2UgeG1sbnM9XCJodHRwOi8vdGVzdFwiPiIgKwotICAgICAgICAiPGVjaG9TdHJpbmdSZXR1cm4+c2FtcGxlIHJldHVybiB2YWx1ZTwvZWNob1N0cmluZ1JldHVybj4iICsgCi0gICAgICAgICI8L2VjaG9TdHJpbmdSZXNwb25zZT4iOwotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBzYW1wbGVKQVhCRW52ZWxvcGUxMSA9IAotICAgICAgICBzYW1wbGVFbnZlbG9wZUhlYWQxMSArIAotICAgICAgICBzYW1wbGVKQVhCVGV4dCArIAotICAgICAgICBzYW1wbGVFbnZlbG9wZVRhaWw7Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHNhbXBsZUpBWEJFbnZlbG9wZTEyID0gCi0gICAgICAgIHNhbXBsZUVudmVsb3BlSGVhZDEyICsgCi0gICAgICAgIHNhbXBsZUpBWEJUZXh0ICsgCi0gICAgICAgIHNhbXBsZUVudmVsb3BlVGFpbDsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBzYW1wbGVFbnZlbG9wZU5vSGVhZGVyMTEgPQotICAgICAgICAiPHNvYXBlbnY6RW52ZWxvcGUgeG1sbnM6c29hcGVudj1cIiIrIHNvYXAxMWVudiArIlwiPiIgKwotICAgICAgICAiPHNvYXBlbnY6Qm9keT4iICsgCi0gICAgICAgIHNhbXBsZVRleHQgKyAKLSAgICAgICAgIjwvc29hcGVudjpCb2R5Pjwvc29hcGVudjpFbnZlbG9wZT4iOwotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBzYW1wbGVFbnZlbG9wZU5vSGVhZGVyMTIgPQotICAgICAgICAiPHNvYXBlbnY6RW52ZWxvcGUgeG1sbnM6c29hcGVudj1cIiIrIHNvYXAxMmVudiArIlwiPiIgKwotICAgICAgICAiPHNvYXBlbnY6Qm9keT4iICsgCi0gICAgICAgIHNhbXBsZVRleHQgKyAKLSAgICAgICAgIjwvc29hcGVudjpCb2R5Pjwvc29hcGVudjpFbnZlbG9wZT4iOwotICAgIAotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFFOYW1lIHNhbXBsZVFOYW1lID0gbmV3IFFOYW1lKCJ1cm46Ly9zYW1wbGUiLCAiYSIpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgWE1MSW5wdXRGYWN0b3J5IGlucHV0RmFjdG9yeSA9IFhNTElucHV0RmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgIAotICAgIHByaXZhdGUgVzNDRW5kcG9pbnRSZWZlcmVuY2UgdzNjRVBSOwotICAgIHByaXZhdGUgU3VibWlzc2lvbkVuZHBvaW50UmVmZXJlbmNlIHN1YkVQUjsKLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgICAgICAKLSAgICAgICAgVzNDRW5kcG9pbnRSZWZlcmVuY2VCdWlsZGVyIHczY0J1aWxkZXIgPSBuZXcgVzNDRW5kcG9pbnRSZWZlcmVuY2VCdWlsZGVyKCk7Ci0gICAgICAgIHczY0J1aWxkZXIgPSB3M2NCdWlsZGVyLmFkZHJlc3MoImh0dHA6Ly9zb21ld2hlcmUuY29tL3NvbWVob3ciKTsKLSAgICAgICAgdzNjQnVpbGRlciA9IHczY0J1aWxkZXIuc2VydmljZU5hbWUobmV3IFFOYW1lKCJodHRwOi8vdGVzdCIsICJUZXN0U2VydmljZSIpKTsKLSAgICAgICAgdzNjQnVpbGRlciA9IHczY0J1aWxkZXIuZW5kcG9pbnROYW1lKG5ldyBRTmFtZSgiaHR0cDovL3Rlc3QiLCAiVGVzdFBvcnQiKSk7Ci0gICAgICAgIHczY0VQUiA9IHczY0J1aWxkZXIuYnVpbGQoKTsKLSAgICAgICAgCi0gICAgICAgIFN1Ym1pc3Npb25FbmRwb2ludFJlZmVyZW5jZUJ1aWxkZXIgc3ViQnVpbGRlciA9IG5ldyBTdWJtaXNzaW9uRW5kcG9pbnRSZWZlcmVuY2VCdWlsZGVyKCk7Ci0gICAgICAgIHN1YkJ1aWxkZXIgPSBzdWJCdWlsZGVyLmFkZHJlc3MoImh0dHA6Ly9zb21ld2hlcmUuY29tL3NvbWVob3ciKTsKLSAgICAgICAgc3ViQnVpbGRlciA9IHN1YkJ1aWxkZXIuc2VydmljZU5hbWUobmV3IFFOYW1lKCJodHRwOi8vdGVzdCIsICJUZXN0U2VydmljZSIpKTsKLSAgICAgICAgc3ViQnVpbGRlciA9IHN1YkJ1aWxkZXIuZW5kcG9pbnROYW1lKG5ldyBRTmFtZSgiaHR0cDovL3Rlc3QiLCAiVGVzdFBvcnQiKSk7Ci0gICAgICAgIHN1YkVQUiA9IHN1YkJ1aWxkZXIuYnVpbGQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWVzc2FnZVRlc3RzKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIHB1YmxpYyBNZXNzYWdlVGVzdHMoU3RyaW5nIGFyZzApIHsKLSAgICAgICAgc3VwZXIoYXJnMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgQmxvY2sgcmVwcmVzZW50aW5nIGFuIFhNTFN0cmluZyBhbmQgc2ltdWxhdGUgYSBub3JtYWwgRGlzcGF0Y2g8U3RyaW5nPiBmbG93LiBJbgotICAgICAqIGFkZGl0aW9uIHRoZSB0ZXN0IG1ha2VzIHN1cmUgdGhhdCB0aGUgWE1MU3RyaW5nIGJsb2NrIGlzIG5vdCBleHBhbmRlZCBkdXJpbmcgdGhpcyBwcm9jZXNzLgotICAgICAqIChFeHBhbmRpbmcgdGhlIGJsb2NrIGRlZ3JhZGVzIHBlcmZvcm1hbmNlKS4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpbmdPdXRmbG93KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgLy8gQ3JlYXRlIGEgU09BUCAxLjEgTWVzc2FnZQotICAgICAgICBNZXNzYWdlRmFjdG9yeSBtZiA9IChNZXNzYWdlRmFjdG9yeSkgRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoTWVzc2FnZUZhY3RvcnkuY2xhc3MpOwotICAgICAgICBNZXNzYWdlIG0gPSBtZi5jcmVhdGUoUHJvdG9jb2wuc29hcDExKTsKLQotICAgICAgICAvLyBHZXQgdGhlIEJsb2NrRmFjdG9yeQotICAgICAgICBYTUxTdHJpbmdCbG9ja0ZhY3RvcnkgZiA9Ci0gICAgICAgICAgICAgICAgKFhNTFN0cmluZ0Jsb2NrRmFjdG9yeSkgRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoWE1MU3RyaW5nQmxvY2tGYWN0b3J5LmNsYXNzKTsKLQotICAgICAgICAvLyBDcmVhdGUgYSBCbG9jayB1c2luZyB0aGUgc2FtcGxlIHN0cmluZyBhcyB0aGUgY29udGVudC4gVGhpcyBzaW11bGF0ZXMKLSAgICAgICAgLy8gd2hhdCBvY2N1cnMgb24gdGhlIG91dGJvdW5kIEpBWC1XUyBkaXNwYXRjaDxTdHJpbmc+IGNsaWVudAotICAgICAgICBCbG9jayBibG9jayA9IGYuY3JlYXRlRnJvbShzYW1wbGVUZXh0LCBudWxsLCBudWxsKTsKLQotICAgICAgICAvLyBBZGQgdGhlIGJsb2NrIHRvIHRoZSBtZXNzYWdlIGFzIG5vcm1hbCBib2R5IGNvbnRlbnQuCi0gICAgICAgIG0uc2V0Qm9keUJsb2NrKGJsb2NrKTsKLQotICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhlIG1lc3NhZ2UgaXMgYSBmYXVsdC4gVGhlIGNsaWVudC9zZXJ2ZXIgd2lsbCBhbHdheXMgY2FsbCB0aGlzIG1ldGhvZC4KLSAgICAgICAgLy8gVGhlIE1lc3NhZ2UgbXVzdCByZXNwb25kIGFwcHJvcHJpYXRlbHkgd2l0aG91dCBkb2luZyBhIGNvbnZlcnNpb24uCi0gICAgICAgIGJvb2xlYW4gaXNGYXVsdCA9IG0uaXNGYXVsdCgpOwotICAgICAgICBhc3NlcnRUcnVlKCFpc0ZhdWx0KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiWE1MUGFydCBSZXByZXNlbnRhdGlvbiBpcyAiICsgbS5nZXRYTUxQYXJ0Q29udGVudFR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAiU1BJTkUiLmVxdWFscyhtLmdldFhNTFBhcnRDb250ZW50VHlwZSgpKSk7Ci0KLSAgICAgICAgLy8gT24gYW4gb3V0Ym91bmQgZmxvdywgd2UgbmVlZCB0byBjb252ZXJ0IHRoZSBNZXNzYWdlCi0gICAgICAgIC8vIHRvIGFuIE9NRWxlbWVudCwgc3BlY2lmaWNhbGx5IGFuIE9NIFNPQVBFbnZlbG9wZSwKLSAgICAgICAgLy8gc28gd2UgY2FuIHNldCBpdCBvbiB0aGUgQXhpczIgTWVzc2FnZUNvbnRleHQKLSAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZSBlbnYgPQotICAgICAgICAgICAgICAgIChvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlKSBtLmdldEFzT01FbGVtZW50KCk7Ci0KLSAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBtZXNzYWdlIGlzIGEgZmF1bHQuIFRoZSBjbGllbnQvc2VydmVyIHdpbGwgYWx3YXlzIGNhbGwgdGhpcyBtZXRob2QuCi0gICAgICAgIC8vIFRoZSBNZXNzYWdlIG11c3QgcmVzcG9uZCBhcHByb3ByaWF0ZWx5IHdpdGhvdXQgZG9pbmcgYSBjb252ZXJzaW9uLgotICAgICAgICBpc0ZhdWx0ID0gbS5pc0ZhdWx0KCk7Ci0gICAgICAgIGFzc2VydFRydWUoIWlzRmF1bHQpOwotICAgICAgICBhc3NlcnRUcnVlKCJYTUxQYXJ0IFJlcHJlc2VudGF0aW9uIGlzICIgKyBtLmdldFhNTFBhcnRDb250ZW50VHlwZSgpLAotICAgICAgICAgICAgICAgICAgICJPTSIuZXF1YWxzKG0uZ2V0WE1MUGFydENvbnRlbnRUeXBlKCkpKTsKLQotICAgICAgICAvLyBQRVJGT1JNQU5DRSBDSEVDSzoKLSAgICAgICAgLy8gVGhlIGVsZW1lbnQgaW4gdGhlIGJvZHkgc2hvdWxkIGJlIGFuIE9NU291cmNlZEVsZW1lbnQKLSAgICAgICAgT01FbGVtZW50IG8gPSBlbnYuZ2V0Qm9keSgpLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgICBhc3NlcnRUcnVlKG8gaW5zdGFuY2VvZiBPTVNvdXJjZWRFbGVtZW50SW1wbCk7Ci0gICAgICAgIGFzc2VydFRydWUoKChPTVNvdXJjZWRFbGVtZW50SW1wbCkgbykuaXNFeHBhbmRlZCgpID09IGZhbHNlKTsKLQotICAgICAgICAvLyBTZXJpYWxpemUgdGhlIEVudmVsb3BlIHVzaW5nIHRoZSBzYW1lIG1lY2hhbmlzbSBhcyB0aGUKLSAgICAgICAgLy8gSFRUUCBjbGllbnQuCi0gICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICBlbnYuc2VyaWFsaXplQW5kQ29uc3VtZShiYW9zLCBuZXcgT01PdXRwdXRGb3JtYXQoKSk7Ci0KLSAgICAgICAgU3RyaW5nIG5ld1RleHQgPSBiYW9zLnRvU3RyaW5nKCk7Ci0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKG5ld1RleHQpOwotICAgICAgICBhc3NlcnRUcnVlKG5ld1RleHQuY29udGFpbnMoc2FtcGxlVGV4dCkpOwotICAgICAgICBhc3NlcnRUcnVlKG5ld1RleHQuY29udGFpbnMoInNvYXAiKSk7Ci0gICAgICAgIGFzc2VydFRydWUobmV3VGV4dC5jb250YWlucygiRW52ZWxvcGUiKSk7Ci0gICAgICAgIGFzc2VydFRydWUobmV3VGV4dC5jb250YWlucygiQm9keSIpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBCbG9jayByZXByZXNlbnRpbmcgYW4gWE1MU3RyaW5nIGFuZCBzaW11bGF0ZSBhIG5vcm1hbCBEaXNwYXRjaDxTdHJpbmc+IGZsb3cgd2l0aCBhbgotICAgICAqIGFwcGxpY2F0aW9uIGhhbmRsZXIuCi0gICAgICogCi0gICAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nT3V0ZmxvdzIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICAvLyBDcmVhdGUgYSBTT0FQIDEuMSBNZXNzYWdlCi0gICAgICAgIE1lc3NhZ2VGYWN0b3J5IG1mID0gKE1lc3NhZ2VGYWN0b3J5KSBGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShNZXNzYWdlRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgIE1lc3NhZ2UgbSA9IG1mLmNyZWF0ZShQcm90b2NvbC5zb2FwMTEpOwotCi0gICAgICAgIC8vIEdldCB0aGUgQmxvY2tGYWN0b3J5Ci0gICAgICAgIFhNTFN0cmluZ0Jsb2NrRmFjdG9yeSBmID0KLSAgICAgICAgICAgICAgICAoWE1MU3RyaW5nQmxvY2tGYWN0b3J5KSBGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShYTUxTdHJpbmdCbG9ja0ZhY3RvcnkuY2xhc3MpOwotCi0gICAgICAgIC8vIENyZWF0ZSBhIEJsb2NrIHVzaW5nIHRoZSBzYW1wbGUgc3RyaW5nIGFzIHRoZSBjb250ZW50LiBUaGlzIHNpbXVsYXRlcwotICAgICAgICAvLyB3aGF0IG9jY3VycyBvbiB0aGUgb3V0Ym91bmQgSkFYLVdTIGRpc3BhdGNoPFN0cmluZz4gY2xpZW50Ci0gICAgICAgIEJsb2NrIGJsb2NrID0gZi5jcmVhdGVGcm9tKHNhbXBsZVRleHQsIG51bGwsIG51bGwpOwotCi0gICAgICAgIC8vIEFkZCB0aGUgYmxvY2sgdG8gdGhlIG1lc3NhZ2UgYXMgbm9ybWFsIGJvZHkgY29udGVudC4KLSAgICAgICAgbS5zZXRCb2R5QmxvY2soYmxvY2spOwotCi0gICAgICAgIC8vIElmIHRoZXJlIGlzIGEgSkFYLVdTIGhhbmRsZXIsIHRoZSBNZXNzYWdlIGlzIGNvbnZlcnRlZCBpbnRvIGEgU09BUEVudmVsb3BlCi0gICAgICAgIFNPQVBFbnZlbG9wZSBzb2FwRW52ZWxvcGUgPSBtLmdldEFzU09BUEVudmVsb3BlKCk7Ci0KLSAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBtZXNzYWdlIGlzIGEgZmF1bHQuIFRoZSBjbGllbnQvc2VydmVyIHdpbGwgYWx3YXlzIGNhbGwgdGhpcyBtZXRob2QuCi0gICAgICAgIC8vIFRoZSBNZXNzYWdlIG11c3QgcmVzcG9uZCBhcHByb3ByaWF0ZWx5IHdpdGhvdXQgZG9pbmcgYSBjb252ZXJzaW9uLgotICAgICAgICBib29sZWFuIGlzRmF1bHQgPSBtLmlzRmF1bHQoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSghaXNGYXVsdCk7Ci0gICAgICAgIGFzc2VydFRydWUoIlhNTFBhcnQgUmVwcmVzZW50YXRpb24gaXMgIiArIG0uZ2V0WE1MUGFydENvbnRlbnRUeXBlKCksCi0gICAgICAgICAgICAgICAgICAgIlNPQVBFTlZFTE9QRSIuZXF1YWxzKG0uZ2V0WE1MUGFydENvbnRlbnRUeXBlKCkpKTsKLQotICAgICAgICAvLyBOb3JtYWxseSB0aGUgaGFuZGxlciB3b3VsZCBub3QgdG91Y2ggdGhlIGJvZHkuLi5idXQgZm9yIG91ciBzY2VuYXJpbywgYXNzdW1lIHRoYXQgaXQKLSAgICAgICAgLy8gZG9lcy4KLSAgICAgICAgU3RyaW5nIG5hbWUgPSBzb2FwRW52ZWxvcGUuZ2V0Qm9keSgpLmdldEZpcnN0Q2hpbGQoKS5nZXRMb2NhbE5hbWUoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiYSIuZXF1YWxzKG5hbWUpKTsKLQotICAgICAgICAvLyBUaGUgYmxvY2sgc2hvdWxkIGJlIGNvbnN1bWVkIGF0IHRoaXMgcG9pbnQKLSAgICAgICAgYXNzZXJ0VHJ1ZShibG9jay5pc0NvbnN1bWVkKCkpOwotCi0gICAgICAgIC8vIEFmdGVyIHRoZSBoYW5kbGVyIHByb2Nlc3NpbmcgdGhlIG1lc3NhZ2UgaXMgb2J0YWluZWQgYXMgYW4gT00KLSAgICAgICAgT01FbGVtZW50IG9tID0gbS5nZXRBc09NRWxlbWVudCgpOwotCi0gICAgICAgIC8vIFNlcmlhbGl6ZSB0aGUgRW52ZWxvcGUgdXNpbmcgdGhlIHNhbWUgbWVjaGFuaXNtIGFzIHRoZQotICAgICAgICAvLyBIVFRQIGNsaWVudC4KLSAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgIG9tLnNlcmlhbGl6ZUFuZENvbnN1bWUoYmFvcywgbmV3IE9NT3V0cHV0Rm9ybWF0KCkpOwotCi0gICAgICAgIC8vIFRvIGNoZWNrIHRoYXQgdGhlIG91dHB1dCBpcyBjb3JyZWN0LCBnZXQgdGhlIFN0cmluZyBjb250ZW50cyBvZiB0aGUKLSAgICAgICAgLy8gcmVhZGVyCi0gICAgICAgIFN0cmluZyBuZXdUZXh0ID0gYmFvcy50b1N0cmluZygpOwotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZyhuZXdUZXh0KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShuZXdUZXh0LmNvbnRhaW5zKHNhbXBsZVRleHQpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShuZXdUZXh0LmNvbnRhaW5zKCJzb2FwIikpOwotICAgICAgICBhc3NlcnRUcnVlKG5ld1RleHQuY29udGFpbnMoIkVudmVsb3BlIikpOwotICAgICAgICBhc3NlcnRUcnVlKG5ld1RleHQuY29udGFpbnMoIkJvZHkiKSk7Ci0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgQmxvY2sgcmVwcmVzZW50aW5nIGFuIGVtcHR5IFhNTFN0cmluZyBhbmQgc2ltdWxhdGUgYSAKLSAgICAgKiBub3JtYWwgRGlzcGF0Y2g8U3RyaW5nPiBmbG93IHdpdGggYW4gYXBwbGljYXRpb24gaGFuZGxlci4KLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqIAotICAgICAqIERJU0FCTEVEIFRISVMgVEVTVC4gVEhFIFRFU1QgSVMgTk9UIFZBTElEIEJFQ0FVU0UgQU4gQVRURU1QVCBXQVMgCi0gICAgICogTUFERSBUTyBBREQgQSBCTE9DSyBUSEFUIElTIE5PVCBBTiBFTEVNRU5ULgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIF90ZXN0U3RyaW5nT3V0Zmxvd0VtcHR5U3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIAotICAgICAgICAvLyBDcmVhdGUgYSBTT0FQIDEuMSBNZXNzYWdlCi0gICAgICAgIE1lc3NhZ2VGYWN0b3J5IG1mID0gKE1lc3NhZ2VGYWN0b3J5KQotICAgICAgICAgICAgRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoTWVzc2FnZUZhY3RvcnkuY2xhc3MpOwotICAgICAgICBNZXNzYWdlIG0gPSBtZi5jcmVhdGUoUHJvdG9jb2wuc29hcDExKTsKLSAgICAgICAgCi0gICAgICAgIC8vIEdldCB0aGUgQmxvY2tGYWN0b3J5Ci0gICAgICAgIFhNTFN0cmluZ0Jsb2NrRmFjdG9yeSBmID0gKFhNTFN0cmluZ0Jsb2NrRmFjdG9yeSkKLSAgICAgICAgICAgIEZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KFhNTFN0cmluZ0Jsb2NrRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgIAotICAgICAgICAvLyBTYW1wbGUgdGV4dCBpcyB3aGl0ZXNwYWNlLiAgVGhlcmUgaXMgbm8gZWxlbWVudAotICAgICAgICAKLSAgICAgICAgU3RyaW5nIHdoaXRlU3BhY2VUZXh0ID0gIjwhLS0gQ29tbWVudCAtLT4iOwotICAgICAgICAvLyBDcmVhdGUgYSBCbG9jayB1c2luZyB0aGUgc2FtcGxlIHN0cmluZyBhcyB0aGUgY29udGVudC4gIFRoaXMgc2ltdWxhdGVzCi0gICAgICAgIC8vIHdoYXQgb2NjdXJzIG9uIHRoZSBvdXRib3VuZCBKQVgtV1MgZGlzcGF0Y2g8U3RyaW5nPiBjbGllbnQKLSAgICAgICAgQmxvY2sgYmxvY2sgPSBmLmNyZWF0ZUZyb20od2hpdGVTcGFjZVRleHQsIG51bGwsIG51bGwpOwotICAgICAgICAKLSAgICAgICAgLy8gQWRkIHRoZSBibG9jayB0byB0aGUgbWVzc2FnZSBhcyBub3JtYWwgYm9keSBjb250ZW50LgotICAgICAgICBtLnNldEJvZHlCbG9jayhibG9jayk7Ci0gICAgICAgIAotICAgICAgICAvLyBJZiB0aGVyZSBpcyBhIEpBWC1XUyBoYW5kbGVyLCB0aGUgTWVzc2FnZSBpcyBjb252ZXJ0ZWQgaW50byBhIFNPQVBFbnZlbG9wZQotICAgICAgICBTT0FQRW52ZWxvcGUgc29hcEVudmVsb3BlID0gbS5nZXRBc1NPQVBFbnZlbG9wZSgpOwotICAgICAgICAKLSAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBtZXNzYWdlIGlzIGEgZmF1bHQuICBUaGUgY2xpZW50L3NlcnZlciB3aWxsIGFsd2F5cyBjYWxsIHRoaXMgbWV0aG9kLgotICAgICAgICAvLyBUaGUgTWVzc2FnZSBtdXN0IHJlc3BvbmQgYXBwcm9wcmlhdGVseSB3aXRob3V0IGRvaW5nIGEgY29udmVyc2lvbi4KLSAgICAgICAgYm9vbGVhbiBpc0ZhdWx0ID0gbS5pc0ZhdWx0KCk7Ci0gICAgICAgIGFzc2VydFRydWUoIWlzRmF1bHQpOwotICAgICAgICBhc3NlcnRUcnVlKCJYTUxQYXJ0IFJlcHJlc2VudGF0aW9uIGlzICIgKyBtLmdldFhNTFBhcnRDb250ZW50VHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAiU09BUEVOVkVMT1BFIi5lcXVhbHMobS5nZXRYTUxQYXJ0Q29udGVudFR5cGUoKSkpOwotICAgICAgICAKLSAgICAgICAgLy8gTm9ybWFsbHkgdGhlIGhhbmRsZXIgd291bGQgbm90IHRvdWNoIHRoZSBib2R5Li4uYnV0IGZvciBvdXIgc2NlbmFyaW8sIAotICAgICAgICAvLyBhc3N1bWUgdGhhdCBpdCBkb2VzLgotICAgICAgICAvLyBUaGUgd2hpdGVzcGFjZSBpcyBub3QgcHJlc2VydmVkLCBzbyB0aGVyZSBzaG91bGQgYmUgbm8gZmlyc3QgY2hpbGQgaW4gdGhlIGJvZHkKLSAgICAgICAgYXNzZXJ0VHJ1ZShzb2FwRW52ZWxvcGUuZ2V0Qm9keSgpLmdldEZpcnN0Q2hpbGQoKSA9PSBudWxsKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFRoZSBibG9jayBzaG91bGQgYmUgY29uc3VtZWQgYXQgdGhpcyBwb2ludAotICAgICAgICBhc3NlcnRUcnVlKGJsb2NrLmlzQ29uc3VtZWQoKSk7Ci0gICAgICAgIAotICAgICAgICAvLyBBZnRlciB0aGUgaGFuZGxlciBwcm9jZXNzaW5nIHRoZSBtZXNzYWdlIGlzIG9idGFpbmVkIGFzIGFuIE9NCi0gICAgICAgIE9NRWxlbWVudCBvbSA9IG0uZ2V0QXNPTUVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgLy8gU2VyaWFsaXplIHRoZSBFbnZlbG9wZSB1c2luZyB0aGUgc2FtZSBtZWNoYW5pc20gYXMgdGhlIAotICAgICAgICAvLyBIVFRQIGNsaWVudC4KLSAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgIG9tLnNlcmlhbGl6ZUFuZENvbnN1bWUoYmFvcywgbmV3IE9NT3V0cHV0Rm9ybWF0KCkpOwotICAgICAgICAKLSAgICAgICAgLy8gVG8gY2hlY2sgdGhhdCB0aGUgb3V0cHV0IGlzIGNvcnJlY3QsIGdldCB0aGUgU3RyaW5nIGNvbnRlbnRzIG9mIHRoZSAKLSAgICAgICAgLy8gcmVhZGVyCi0gICAgICAgIFN0cmluZyBuZXdUZXh0ID0gYmFvcy50b1N0cmluZygpOwotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZyhuZXdUZXh0KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShuZXdUZXh0LmNvbnRhaW5zKCJzb2FwIikpOwotICAgICAgICBhc3NlcnRUcnVlKG5ld1RleHQuY29udGFpbnMoIkVudmVsb3BlIikpOwotICAgICAgICBhc3NlcnRUcnVlKG5ld1RleHQuY29udGFpbnMoIkJvZHkiKSk7Ci0gICAgICAgIAotICAgIH0KLQkKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBCbG9jayByZXByZXNlbnRpbmcgYW4gWE1MU3RyaW5nIHdpdGggMiBlbGVtZW50cyBhbmQgc2ltdWxhdGUgYSAKLSAgICAgKiBub3JtYWwgRGlzcGF0Y2g8U3RyaW5nPiBmbG93IHdpdGggYW4gYXBwbGljYXRpb24gaGFuZGxlci4KLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqIAotICAgICAqIEBSRVZJRVcgVGhpcyB0ZXN0IGlzIGRpc2FibGVkIGJlY2F1c2UgKGEpIGl0IGZhaWxzIGFuZCAoYikgd2UgZG9uJ3QgYmVsaWV2ZSB0aGlzCi0gICAgICogaXMgYWxsb3dlZCBkdWUgYnkgV1NJLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIF90ZXN0U3RyaW5nT3V0Zmxvd0RvdWJsZUVsZW1lbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgCi0gICAgICAgIC8vIENyZWF0ZSBhIFNPQVAgMS4xIE1lc3NhZ2UKLSAgICAgICAgTWVzc2FnZUZhY3RvcnkgbWYgPSAoTWVzc2FnZUZhY3RvcnkpCi0gICAgICAgICAgICBGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShNZXNzYWdlRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgIE1lc3NhZ2UgbSA9IG1mLmNyZWF0ZShQcm90b2NvbC5zb2FwMTEpOwotICAgICAgICAKLSAgICAgICAgLy8gR2V0IHRoZSBCbG9ja0ZhY3RvcnkKLSAgICAgICAgWE1MU3RyaW5nQmxvY2tGYWN0b3J5IGYgPSAoWE1MU3RyaW5nQmxvY2tGYWN0b3J5KQotICAgICAgICAgICAgRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoWE1MU3RyaW5nQmxvY2tGYWN0b3J5LmNsYXNzKTsKLSAgICAgICAgCi0gICAgICAgIC8vIENyZWF0ZSBhIEJsb2NrIHVzaW5nIHRoZSBzYW1wbGUgc3RyaW5nIGFzIHRoZSBjb250ZW50LiAgVGhpcyBzaW11bGF0ZXMKLSAgICAgICAgLy8gd2hhdCBvY2N1cnMgb24gdGhlIG91dGJvdW5kIEpBWC1XUyBkaXNwYXRjaDxTdHJpbmc+IGNsaWVudAotICAgICAgICAvLyBJbiB0aGlzIGNhc2UgdGhlIHNhbXBsZSBzdHJpbmcgY29udGFpbnMgMiBlbGVtZW50cyBhIGFuZCBhYQotICAgICAgICBCbG9jayBibG9jayA9IGYuY3JlYXRlRnJvbSh0aGlzLnNhbXBsZURvdWJsZSwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIAotICAgICAgICAvLyBBZGQgdGhlIGJsb2NrIHRvIHRoZSBtZXNzYWdlIGFzIG5vcm1hbCBib2R5IGNvbnRlbnQuCi0gICAgICAgIG0uc2V0Qm9keUJsb2NrKGJsb2NrKTsKLSAgICAgICAgCi0gICAgICAgIC8vIElmIHRoZXJlIGlzIGEgSkFYLVdTIGhhbmRsZXIsIHRoZSBNZXNzYWdlIGlzIGNvbnZlcnRlZCBpbnRvIGEgU09BUEVudmVsb3BlCi0gICAgICAgIFNPQVBFbnZlbG9wZSBzb2FwRW52ZWxvcGUgPSBtLmdldEFzU09BUEVudmVsb3BlKCk7Ci0gICAgICAgIAotICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhlIG1lc3NhZ2UgaXMgYSBmYXVsdC4gIFRoZSBjbGllbnQvc2VydmVyIHdpbGwgYWx3YXlzIGNhbGwgdGhpcyBtZXRob2QuCi0gICAgICAgIC8vIFRoZSBNZXNzYWdlIG11c3QgcmVzcG9uZCBhcHByb3ByaWF0ZWx5IHdpdGhvdXQgZG9pbmcgYSBjb252ZXJzaW9uLgotICAgICAgICBib29sZWFuIGlzRmF1bHQgPSBtLmlzRmF1bHQoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSghaXNGYXVsdCk7Ci0gICAgICAgIGFzc2VydFRydWUoIlhNTFBhcnQgUmVwcmVzZW50YXRpb24gaXMgIiArIG0uZ2V0WE1MUGFydENvbnRlbnRUeXBlKCksCi0gICAgICAgICAgICAgICAgICAgICJTT0FQRU5WRUxPUEUiLmVxdWFscyhtLmdldFhNTFBhcnRDb250ZW50VHlwZSgpKSk7Ci0gICAgICAgIAotICAgICAgICAvLyBOb3JtYWxseSB0aGUgaGFuZGxlciB3b3VsZCBub3QgdG91Y2ggdGhlIGJvZHkuLi5idXQgZm9yIG91ciBzY2VuYXJpbywgCi0gICAgICAgIC8vIGFzc3VtZSB0aGF0IGl0IGRvZXMuCi0gICAgICAgIFN0cmluZyBuYW1lID0gc29hcEVudmVsb3BlLmdldEJvZHkoKS5nZXRGaXJzdENoaWxkKCkuZ2V0TG9jYWxOYW1lKCk7Ci0gICAgICAgIGFzc2VydFRydWUoImEiLmVxdWFscyhuYW1lKSk7Ci0gICAgICAgIG5hbWUgPSBzb2FwRW52ZWxvcGUuZ2V0Qm9keSgpLmdldExhc3RDaGlsZCgpLmdldExvY2FsTmFtZSgpOwotICAgICAgICBhc3NlcnRUcnVlKCJhYSIuZXF1YWxzKG5hbWUpKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFRoZSBibG9jayBzaG91bGQgYmUgY29uc3VtZWQgYXQgdGhpcyBwb2ludAotICAgICAgICBhc3NlcnRUcnVlKGJsb2NrLmlzQ29uc3VtZWQoKSk7Ci0gICAgICAgIAotICAgICAgICAvLyBBZnRlciB0aGUgaGFuZGxlciBwcm9jZXNzaW5nIHRoZSBtZXNzYWdlIGlzIG9idGFpbmVkIGFzIGFuIE9NCi0gICAgICAgIE9NRWxlbWVudCBvbSA9IG0uZ2V0QXNPTUVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgLy8gU2VyaWFsaXplIHRoZSBFbnZlbG9wZSB1c2luZyB0aGUgc2FtZSBtZWNoYW5pc20gYXMgdGhlIAotICAgICAgICAvLyBIVFRQIGNsaWVudC4KLSAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgIG9tLnNlcmlhbGl6ZUFuZENvbnN1bWUoYmFvcywgbmV3IE9NT3V0cHV0Rm9ybWF0KCkpOwotICAgICAgICAKLSAgICAgICAgLy8gVG8gY2hlY2sgdGhhdCB0aGUgb3V0cHV0IGlzIGNvcnJlY3QsIGdldCB0aGUgU3RyaW5nIGNvbnRlbnRzIG9mIHRoZSAKLSAgICAgICAgLy8gcmVhZGVyCi0gICAgICAgIFN0cmluZyBuZXdUZXh0ID0gYmFvcy50b1N0cmluZygpOwotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZyhuZXdUZXh0KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShuZXdUZXh0LmNvbnRhaW5zKHNhbXBsZVRleHQpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShuZXdUZXh0LmNvbnRhaW5zKCJzb2FwIikpOwotICAgICAgICBhc3NlcnRUcnVlKG5ld1RleHQuY29udGFpbnMoIkVudmVsb3BlIikpOwotICAgICAgICBhc3NlcnRUcnVlKG5ld1RleHQuY29udGFpbnMoIkJvZHkiKSk7Ci0gICAgICAgIAotICAgIH0KLSAgICAKLQkvKioKLSAgICAgKiBDcmVhdGUgYSBCbG9jayByZXByZXNlbnRpbmcgYW4gWE1MU3RyaW5nIGFuZCBzaW11bGF0ZSBhIG5vcm1hbCBEaXNwYXRjaDxTdHJpbmc+IGlucHV0IGZsb3cKLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpbmdJbmZsb3dfc29hcDExKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIF90ZXN0U3RyaW5nSW5mbG93KHNhbXBsZUVudmVsb3BlMTEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpbmdJbmZsb3dfc29hcDEyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIF90ZXN0U3RyaW5nSW5mbG93KHNhbXBsZUVudmVsb3BlMTIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIF90ZXN0U3RyaW5nSW5mbG93KFN0cmluZyBzYW1wbGVFbnZlbG9wZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgLy8gT24gaW5ib3VuZCwgdGhlcmUgd2lsbCBhbHJlYWR5IGJlIGFuIE9NCi0gICAgICAgIC8vIHdoaWNoIHJlcHJlc2VudHMgdGhlIG1lc3NhZ2UuIFRoZSBmb2xsb3dpbmcgY29kZSBzaW11bGF0ZXMgdGhlIGlucHV0Ci0gICAgICAgIC8vIE9NCi0gICAgICAgIFN0cmluZ1JlYWRlciBzciA9IG5ldyBTdHJpbmdSZWFkZXIoc2FtcGxlRW52ZWxvcGUpOwotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgaW5mbG93ID0gaW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihzcik7Ci0gICAgICAgIFN0QVhTT0FQTW9kZWxCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RBWFNPQVBNb2RlbEJ1aWxkZXIoaW5mbG93LCBudWxsKTsKLSAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IGJ1aWxkZXIuZ2V0U09BUEVudmVsb3BlKCk7Ci0KLSAgICAgICAgLy8gVGhlIEpBWC1XUyBsYXllciBjcmVhdGVzIGEgTWVzc2FnZSBmcm9tIHRoZSBPTQotICAgICAgICBNZXNzYWdlRmFjdG9yeSBtZiA9IChNZXNzYWdlRmFjdG9yeSkgRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoTWVzc2FnZUZhY3RvcnkuY2xhc3MpOwotICAgICAgICBNZXNzYWdlIG0gPSBtZi5jcmVhdGVGcm9tKG9tRWxlbWVudCwgbnVsbCk7Ci0KLSAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBtZXNzYWdlIGlzIGEgZmF1bHQuIFRoZSBjbGllbnQvc2VydmVyIHdpbGwgYWx3YXlzIGNhbGwgdGhpcyBtZXRob2QuCi0gICAgICAgIC8vIFRoZSBNZXNzYWdlIG11c3QgcmVzcG9uZCBhcHByb3ByaWF0ZWx5IHdpdGhvdXQgZG9pbmcgYSBjb252ZXJzaW9uLgotICAgICAgICBib29sZWFuIGlzRmF1bHQgPSBtLmlzRmF1bHQoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSghaXNGYXVsdCk7Ci0gICAgICAgIGFzc2VydFRydWUoIlhNTFBhcnQgUmVwcmVzZW50YXRpb24gaXMgIiArIG0uZ2V0WE1MUGFydENvbnRlbnRUeXBlKCksCi0gICAgICAgICAgICAgICAgICAgIk9NIi5lcXVhbHMobS5nZXRYTUxQYXJ0Q29udGVudFR5cGUoKSkpOwotCi0gICAgICAgIC8vIEFzc3VtaW5nIG5vIGhhbmRsZXJzIGFyZSBpbnN0YWxsZWQsIHRoZSBuZXh0IHRoaW5nIHRoYXQgd2lsbCBoYXBwZW4KLSAgICAgICAgLy8gaXMgdGhlIHByb3h5IGNvZGUgd2lsbCBhc2sgZm9yIHRoZSBidXNpbmVzcyBvYmplY3QgKFN0cmluZykuCi0gICAgICAgIFhNTFN0cmluZ0Jsb2NrRmFjdG9yeSBibG9ja0ZhY3RvcnkgPQotICAgICAgICAgICAgICAgIChYTUxTdHJpbmdCbG9ja0ZhY3RvcnkpIEZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KFhNTFN0cmluZ0Jsb2NrRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgIEJsb2NrIGJsb2NrID0gbS5nZXRCb2R5QmxvY2sobnVsbCwgYmxvY2tGYWN0b3J5KTsKLSAgICAgICAgT2JqZWN0IGJvID0gYmxvY2suZ2V0QnVzaW5lc3NPYmplY3QodHJ1ZSk7Ci0gICAgICAgIGFzc2VydFRydWUoYm8gaW5zdGFuY2VvZiBTdHJpbmcpOwotCi0gICAgICAgIC8vIFRoZSBibG9jayBzaG91bGQgYmUgY29uc3VtZWQKLSAgICAgICAgYXNzZXJ0VHJ1ZShibG9jay5pc0NvbnN1bWVkKCkpOwotCi0gICAgICAgIC8vIENoZWNrIHRoZSBTdHJpbmcgZm9yIGFjY3VyYWN5Ci0gICAgICAgIGFzc2VydFRydWUoc2FtcGxlVGV4dC5lcXVhbHMoYm8udG9TdHJpbmcoKSkpOwotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgQmxvY2sgcmVwcmVzZW50aW5nIGFuIFhNTFN0cmluZyBhbmQgc2ltdWxhdGUgYSBub3JtYWwgRGlzcGF0Y2g8U3RyaW5nPiBpbnB1dCBmbG93Ci0gICAgICogd2l0aCBhIEpBWC1XUyBIYW5kbGVyCi0gICAgICogCi0gICAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nSW5mbG93Ml9zb2FwMTEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgX3Rlc3RTdHJpbmdJbmZsb3cyKHNhbXBsZUVudmVsb3BlMTEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpbmdJbmZsb3cyX3NvYXAxMigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBPbmx5IHJ1biB0ZXN0IGlmIGFuIFNBQUogMS4zIE1lc3NhZ2VGYWN0b3J5IGlzIGF2YWlsYWJsZQotICAgICAgICBqYXZheC54bWwuc29hcC5NZXNzYWdlRmFjdG9yeSBtZiA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtZiA9IGdldFNBQUpDb252ZXJ0ZXIoKS5jcmVhdGVNZXNzYWdlRmFjdG9yeShzb2FwMTJlbnYpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgICAgIGlmIChtZiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBfdGVzdFN0cmluZ0luZmxvdzIoc2FtcGxlRW52ZWxvcGUxMik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBfdGVzdFN0cmluZ0luZmxvdzIoU3RyaW5nIHNhbXBsZUVudmVsb3BlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICAvLyBPbiBpbmJvdW5kLCB0aGVyZSB3aWxsIGFscmVhZHkgYmUgYW4gT00KLSAgICAgICAgLy8gd2hpY2ggcmVwcmVzZW50cyB0aGUgbWVzc2FnZS4gVGhlIGZvbGxvd2luZyBjb2RlIHNpbXVsYXRlcyB0aGUgaW5wdXQKLSAgICAgICAgLy8gT00KLSAgICAgICAgU3RyaW5nUmVhZGVyIHNyID0gbmV3IFN0cmluZ1JlYWRlcihzYW1wbGVFbnZlbG9wZSk7Ci0gICAgICAgIFhNTFN0cmVhbVJlYWRlciBpbmZsb3cgPSBpbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKHNyKTsKLSAgICAgICAgU3RBWFNPQVBNb2RlbEJ1aWxkZXIgYnVpbGRlciA9IG5ldyBTdEFYU09BUE1vZGVsQnVpbGRlcihpbmZsb3csIG51bGwpOwotICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gYnVpbGRlci5nZXRTT0FQRW52ZWxvcGUoKTsKLQotICAgICAgICAvLyBUaGUgSkFYLVdTIGxheWVyIGNyZWF0ZXMgYSBNZXNzYWdlIGZyb20gdGhlIE9NCi0gICAgICAgIE1lc3NhZ2VGYWN0b3J5IG1mID0gKE1lc3NhZ2VGYWN0b3J5KSBGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShNZXNzYWdlRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgIE1lc3NhZ2UgbSA9IG1mLmNyZWF0ZUZyb20ob21FbGVtZW50LCBudWxsKTsKLQotICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhlIG1lc3NhZ2UgaXMgYSBmYXVsdC4gVGhlIGNsaWVudC9zZXJ2ZXIgd2lsbCBhbHdheXMgY2FsbCB0aGlzIG1ldGhvZC4KLSAgICAgICAgLy8gVGhlIE1lc3NhZ2UgbXVzdCByZXNwb25kIGFwcHJvcHJpYXRlbHkgd2l0aG91dCBkb2luZyBhIGNvbnZlcnNpb24uCi0gICAgICAgIGJvb2xlYW4gaXNGYXVsdCA9IG0uaXNGYXVsdCgpOwotICAgICAgICBhc3NlcnRUcnVlKCFpc0ZhdWx0KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiWE1MUGFydCBSZXByZXNlbnRhdGlvbiBpcyAiICsgbS5nZXRYTUxQYXJ0Q29udGVudFR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAiT00iLmVxdWFscyhtLmdldFhNTFBhcnRDb250ZW50VHlwZSgpKSk7Ci0KLSAgICAgICAgLy8gSWYgdGhlcmUgaXMgYSBKQVgtV1MgaGFuZGxlciwgdGhlIE1lc3NhZ2UgaXMgY29udmVydGVkIGludG8gYSBTT0FQRW52ZWxvcGUKLSAgICAgICAgU09BUEVudmVsb3BlIHNvYXBFbnZlbG9wZSA9IG0uZ2V0QXNTT0FQRW52ZWxvcGUoKTsKLQotICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhlIG1lc3NhZ2UgaXMgYSBmYXVsdC4gVGhlIGNsaWVudC9zZXJ2ZXIgd2lsbCBhbHdheXMgY2FsbCB0aGlzIG1ldGhvZC4KLSAgICAgICAgLy8gVGhlIE1lc3NhZ2UgbXVzdCByZXNwb25kIGFwcHJvcHJpYXRlbHkgd2l0aG91dCBkb2luZyBhIGNvbnZlcnNpb24uCi0gICAgICAgIGlzRmF1bHQgPSBtLmlzRmF1bHQoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSghaXNGYXVsdCk7Ci0gICAgICAgIGFzc2VydFRydWUoIlhNTFBhcnQgUmVwcmVzZW50YXRpb24gaXMgIiArIG0uZ2V0WE1MUGFydENvbnRlbnRUeXBlKCksCi0gICAgICAgICAgICAgICAgICAgIlNPQVBFTlZFTE9QRSIuZXF1YWxzKG0uZ2V0WE1MUGFydENvbnRlbnRUeXBlKCkpKTsKLQotICAgICAgICAvLyBOb3JtYWxseSB0aGUgaGFuZGxlciB3b3VsZCBub3QgdG91Y2ggdGhlIGJvZHkuLi5idXQgZm9yIG91ciBzY2VuYXJpbywgYXNzdW1lIHRoYXQgaXQKLSAgICAgICAgLy8gZG9lcy4KLSAgICAgICAgU3RyaW5nIG5hbWUgPSBzb2FwRW52ZWxvcGUuZ2V0Qm9keSgpLmdldEZpcnN0Q2hpbGQoKS5nZXRMb2NhbE5hbWUoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiYSIuZXF1YWxzKG5hbWUpKTsKLQotICAgICAgICAvLyBUaGUgbmV4dCB0aGluZyB0aGF0IHdpbGwgaGFwcGVuCi0gICAgICAgIC8vIGlzIHRoZSBwcm94eSBjb2RlIHdpbGwgYXNrIGZvciB0aGUgYnVzaW5lc3Mgb2JqZWN0IChTdHJpbmcpLgotICAgICAgICBYTUxTdHJpbmdCbG9ja0ZhY3RvcnkgYmxvY2tGYWN0b3J5ID0KLSAgICAgICAgICAgICAgICAoWE1MU3RyaW5nQmxvY2tGYWN0b3J5KSBGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShYTUxTdHJpbmdCbG9ja0ZhY3RvcnkuY2xhc3MpOwotICAgICAgICBCbG9jayBibG9jayA9IG0uZ2V0Qm9keUJsb2NrKG51bGwsIGJsb2NrRmFjdG9yeSk7Ci0gICAgICAgIE9iamVjdCBibyA9IGJsb2NrLmdldEJ1c2luZXNzT2JqZWN0KHRydWUpOwotICAgICAgICBhc3NlcnRUcnVlKGJvIGluc3RhbmNlb2YgU3RyaW5nKTsKLQotICAgICAgICAvLyBUaGUgYmxvY2sgc2hvdWxkIGJlIGNvbnN1bWVkCi0gICAgICAgIGFzc2VydFRydWUoYmxvY2suaXNDb25zdW1lZCgpKTsKLQotICAgICAgICAvLyBDaGVjayB0aGUgU3RyaW5nIGZvciBhY2N1cmFjeQotICAgICAgICBhc3NlcnRUcnVlKHNhbXBsZVRleHQuZXF1YWxzKGJvLnRvU3RyaW5nKCkpKTsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIEJsb2NrIHJlcHJlc2VudGluZyBhbiBYTUxTdHJpbmcgYW5kIHNpbXVsYXRlIGEgbm9ybWFsIERpc3BhdGNoPFN0cmluZz4gaW5wdXQgZmxvdwotICAgICAqIHdpdGggYSBKQVgtV1MgSGFuZGxlciB0aGF0IG5lZWRzIHRoZSB3aG9sZSBNZXNzYWdlCi0gICAgICogCi0gICAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nSW5mbG93M19zb2FwMTEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgX3Rlc3RTdHJpbmdJbmZsb3czKHNhbXBsZUVudmVsb3BlMTEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpbmdJbmZsb3czX3NvYXAxMigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBPbmx5IHJ1biB0ZXN0IGlmIGFuIFNBQUogMS4zIE1lc3NhZ2VGYWN0b3J5IGlzIGF2YWlsYWJsZQotICAgICAgICBqYXZheC54bWwuc29hcC5NZXNzYWdlRmFjdG9yeSBtZiA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtZiA9IGdldFNBQUpDb252ZXJ0ZXIoKS5jcmVhdGVNZXNzYWdlRmFjdG9yeShzb2FwMTJlbnYpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgICAgIGlmIChtZiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBfdGVzdFN0cmluZ0luZmxvdzMoc2FtcGxlRW52ZWxvcGUxMik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBfdGVzdFN0cmluZ0luZmxvdzMoU3RyaW5nIHNhbXBsZUVudmVsb3BlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICAvLyBPbiBpbmJvdW5kLCB0aGVyZSB3aWxsIGFscmVhZHkgYmUgYW4gT00KLSAgICAgICAgLy8gd2hpY2ggcmVwcmVzZW50cyB0aGUgbWVzc2FnZS4gVGhlIGZvbGxvd2luZyBjb2RlIHNpbXVsYXRlcyB0aGUgaW5wdXQKLSAgICAgICAgLy8gT00KLSAgICAgICAgU3RyaW5nUmVhZGVyIHNyID0gbmV3IFN0cmluZ1JlYWRlcihzYW1wbGVFbnZlbG9wZSk7Ci0gICAgICAgIFhNTFN0cmVhbVJlYWRlciBpbmZsb3cgPSBpbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKHNyKTsKLSAgICAgICAgU3RBWFNPQVBNb2RlbEJ1aWxkZXIgYnVpbGRlciA9IG5ldyBTdEFYU09BUE1vZGVsQnVpbGRlcihpbmZsb3csIG51bGwpOwotICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gYnVpbGRlci5nZXRTT0FQRW52ZWxvcGUoKTsKLQotICAgICAgICAvLyBUaGUgSkFYLVdTIGxheWVyIGNyZWF0ZXMgYSBNZXNzYWdlIGZyb20gdGhlIE9NCi0gICAgICAgIE1lc3NhZ2VGYWN0b3J5IG1mID0gKE1lc3NhZ2VGYWN0b3J5KSBGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShNZXNzYWdlRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgIE1lc3NhZ2UgbSA9IG1mLmNyZWF0ZUZyb20ob21FbGVtZW50LCBudWxsKTsKLQotICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhlIG1lc3NhZ2UgaXMgYSBmYXVsdC4gVGhlIGNsaWVudC9zZXJ2ZXIgd2lsbCBhbHdheXMgY2FsbCB0aGlzIG1ldGhvZC4KLSAgICAgICAgLy8gVGhlIE1lc3NhZ2UgbXVzdCByZXNwb25kIGFwcHJvcHJpYXRlbHkgd2l0aG91dCBkb2luZyBhIGNvbnZlcnNpb24uCi0gICAgICAgIGJvb2xlYW4gaXNGYXVsdCA9IG0uaXNGYXVsdCgpOwotICAgICAgICBhc3NlcnRUcnVlKCFpc0ZhdWx0KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiWE1MUGFydCBSZXByZXNlbnRhdGlvbiBpcyAiICsgbS5nZXRYTUxQYXJ0Q29udGVudFR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAiT00iLmVxdWFscyhtLmdldFhNTFBhcnRDb250ZW50VHlwZSgpKSk7Ci0KLSAgICAgICAgLy8gSWYgdGhlcmUgaXMgYSBKQVgtV1MgaGFuZGxlciwgdGhlIE1lc3NhZ2UgaXMgY29udmVydGVkIGludG8gYSBTT0FQRW52ZWxvcGUKLSAgICAgICAgU09BUE1lc3NhZ2Ugc20gPSBtLmdldEFzU09BUE1lc3NhZ2UoKTsKLQotICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhlIG1lc3NhZ2UgaXMgYSBmYXVsdC4gVGhlIGNsaWVudC9zZXJ2ZXIgd2lsbCBhbHdheXMgY2FsbCB0aGlzIG1ldGhvZC4KLSAgICAgICAgLy8gVGhlIE1lc3NhZ2UgbXVzdCByZXNwb25kIGFwcHJvcHJpYXRlbHkgd2l0aG91dCBkb2luZyBhIGNvbnZlcnNpb24uCi0gICAgICAgIGlzRmF1bHQgPSBtLmlzRmF1bHQoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSghaXNGYXVsdCk7Ci0gICAgICAgIGFzc2VydFRydWUoIlhNTFBhcnQgUmVwcmVzZW50YXRpb24gaXMgIiArIG0uZ2V0WE1MUGFydENvbnRlbnRUeXBlKCksCi0gICAgICAgICAgICAgICAgICAgIlNPQVBFTlZFTE9QRSIuZXF1YWxzKG0uZ2V0WE1MUGFydENvbnRlbnRUeXBlKCkpKTsKLQotICAgICAgICAvLyBOb3JtYWxseSB0aGUgaGFuZGxlciB3b3VsZCBub3QgdG91Y2ggdGhlIGJvZHkuLi5idXQgZm9yIG91ciBzY2VuYXJpbywgYXNzdW1lIHRoYXQgaXQKLSAgICAgICAgLy8gZG9lcy4KLSAgICAgICAgU3RyaW5nIG5hbWUgPSBzbS5nZXRTT0FQQm9keSgpLmdldEZpcnN0Q2hpbGQoKS5nZXRMb2NhbE5hbWUoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiYSIuZXF1YWxzKG5hbWUpKTsKLQotICAgICAgICAvLyBUaGUgbmV4dCB0aGluZyB0aGF0IHdpbGwgaGFwcGVuCi0gICAgICAgIC8vIGlzIHRoZSBwcm94eSBjb2RlIHdpbGwgYXNrIGZvciB0aGUgYnVzaW5lc3Mgb2JqZWN0IChTdHJpbmcpLgotICAgICAgICBYTUxTdHJpbmdCbG9ja0ZhY3RvcnkgYmxvY2tGYWN0b3J5ID0KLSAgICAgICAgICAgICAgICAoWE1MU3RyaW5nQmxvY2tGYWN0b3J5KSBGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShYTUxTdHJpbmdCbG9ja0ZhY3RvcnkuY2xhc3MpOwotICAgICAgICBCbG9jayBibG9jayA9IG0uZ2V0Qm9keUJsb2NrKG51bGwsIGJsb2NrRmFjdG9yeSk7Ci0gICAgICAgIE9iamVjdCBibyA9IGJsb2NrLmdldEJ1c2luZXNzT2JqZWN0KHRydWUpOwotICAgICAgICBhc3NlcnRUcnVlKGJvIGluc3RhbmNlb2YgU3RyaW5nKTsKLQotICAgICAgICAvLyBUaGUgYmxvY2sgc2hvdWxkIGJlIGNvbnN1bWVkCi0gICAgICAgIGFzc2VydFRydWUoYmxvY2suaXNDb25zdW1lZCgpKTsKLQotICAgICAgICAvLyBDaGVjayB0aGUgU3RyaW5nIGZvciBhY2N1cmFjeQotICAgICAgICBhc3NlcnRUcnVlKHNhbXBsZVRleHQuZXF1YWxzKGJvLnRvU3RyaW5nKCkpKTsKLQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBCbG9jayByZXByZXNlbnRpbmcgYW4gWE1MU3RyaW5nLCBidXQgdGhpcyB0aW1lIHVzZSBvbmUgdGhhdAotICAgICAqIGRvZXNuJ3QgaGF2ZSBhICZsdDtzb2FwOkhlYWRlciZndDsgZWxlbWVudCBpbiBpdC4KLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotCXB1YmxpYyB2b2lkIHRlc3RTdHJpbmdJbmZsb3c0X3NvYXAxMSgpIHRocm93cyBFeGNlcHRpb24gewotCQlfdGVzdFN0cmluZ0luZmxvdzQoc2FtcGxlRW52ZWxvcGVOb0hlYWRlcjExKTsKLQl9Ci0JcHVibGljIHZvaWQgdGVzdFN0cmluZ0luZmxvdzRfc29hcDEyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCV90ZXN0U3RyaW5nSW5mbG93NChzYW1wbGVFbnZlbG9wZU5vSGVhZGVyMTIpOwotCX0KLQlwdWJsaWMgdm9pZCBfdGVzdFN0cmluZ0luZmxvdzQoU3RyaW5nIHNhbXBsZUVudmVsb3BlTm9IZWFkZXIpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBPbiBpbmJvdW5kLCB0aGVyZSB3aWxsIGFscmVhZHkgYmUgYW4gT00KLSAgICAgICAgLy8gd2hpY2ggcmVwcmVzZW50cyB0aGUgbWVzc2FnZS4gIFRoZSBmb2xsb3dpbmcgY29kZSBzaW11bGF0ZXMgdGhlIGlucHV0Ci0gICAgICAgIC8vIE9NCi0gICAgICAgIFN0cmluZ1JlYWRlciBzciA9IG5ldyBTdHJpbmdSZWFkZXIoc2FtcGxlRW52ZWxvcGVOb0hlYWRlcik7Ci0gICAgICAgIFhNTFN0cmVhbVJlYWRlciBpbmZsb3cgPSBpbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKHNyKTsKLSAgICAgICAgU3RBWFNPQVBNb2RlbEJ1aWxkZXIgYnVpbGRlciA9IG5ldyBTdEFYU09BUE1vZGVsQnVpbGRlcihpbmZsb3csIG51bGwpOwotICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gYnVpbGRlci5nZXRTT0FQRW52ZWxvcGUoKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFRoZSBKQVgtV1MgbGF5ZXIgY3JlYXRlcyBhIE1lc3NhZ2UgZnJvbSB0aGUgT00KLSAgICAgICAgTWVzc2FnZUZhY3RvcnkgbWYgPSAoTWVzc2FnZUZhY3RvcnkpCi0gICAgICAgICAgICBGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShNZXNzYWdlRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgIE1lc3NhZ2UgbSA9IG1mLmNyZWF0ZUZyb20ob21FbGVtZW50LCBudWxsKTsKLSAgICAgICAgCi0gICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgbWVzc2FnZSBpcyBhIGZhdWx0LiAgVGhlIGNsaWVudC9zZXJ2ZXIgd2lsbCBhbHdheXMgY2FsbCB0aGlzIG1ldGhvZC4KLSAgICAgICAgLy8gVGhlIE1lc3NhZ2UgbXVzdCByZXNwb25kIGFwcHJvcHJpYXRlbHkgd2l0aG91dCBkb2luZyBhIGNvbnZlcnNpb24uCi0gICAgICAgIGJvb2xlYW4gaXNGYXVsdCA9IG0uaXNGYXVsdCgpOwotICAgICAgICBhc3NlcnRUcnVlKCFpc0ZhdWx0KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiWE1MUGFydCBSZXByZXNlbnRhdGlvbiBpcyAiICsgbS5nZXRYTUxQYXJ0Q29udGVudFR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgIk9NIi5lcXVhbHMobS5nZXRYTUxQYXJ0Q29udGVudFR5cGUoKSkpOwotICAgICAgICAKLSAgICAgICAgLy8gVGhlIG5leHQgdGhpbmcgdGhhdCB3aWxsIGhhcHBlbgotICAgICAgICAvLyBpcyB0aGUgcHJveHkgY29kZSB3aWxsIGFzayBmb3IgdGhlIGJ1c2luZXNzIG9iamVjdCAoU3RyaW5nKS4KLSAgICAgICAgWE1MU3RyaW5nQmxvY2tGYWN0b3J5IGJsb2NrRmFjdG9yeSA9IAotICAgICAgICAgICAgKFhNTFN0cmluZ0Jsb2NrRmFjdG9yeSkgRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoWE1MU3RyaW5nQmxvY2tGYWN0b3J5LmNsYXNzKTsKLSAgICAgICAgQmxvY2sgYmxvY2sgPSBtLmdldEJvZHlCbG9jayhudWxsLCBibG9ja0ZhY3RvcnkpOwotICAgICAgICBPYmplY3QgYm8gPSBibG9jay5nZXRCdXNpbmVzc09iamVjdCh0cnVlKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShibyBpbnN0YW5jZW9mIFN0cmluZyk7Ci0gICAgICAgIAotICAgICAgICAvLyBUaGUgYmxvY2sgc2hvdWxkIGJlIGNvbnN1bWVkCi0gICAgICAgIGFzc2VydFRydWUoYmxvY2suaXNDb25zdW1lZCgpKTsKLSAgICAgICAgCi0gICAgICAgIC8vIENoZWNrIHRoZSBTdHJpbmcgZm9yIGFjY3VyYWN5Ci0gICAgICAgIGFzc2VydFRydWUoc2FtcGxlVGV4dC5lcXVhbHMoYm8udG9TdHJpbmcoKSkpOwotICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgSkFYQkJsb2NrIGNvbnRhaW5pbmcgYSBKQVgtQiBidXNpbmVzcyBvYmplY3QgCi0gICAgICogYW5kIHNpbXVsYXRlIGEgbm9ybWFsIERpc3BhdGNoPE9iamVjdD4gb3V0cHV0IGZsb3cKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RKQVhCT3V0ZmxvdygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBDcmVhdGUgYSBTT0FQIDEuMSBNZXNzYWdlCi0gICAgICAgIE1lc3NhZ2VGYWN0b3J5IG1mID0gKE1lc3NhZ2VGYWN0b3J5KQotICAgICAgICAgICAgRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoTWVzc2FnZUZhY3RvcnkuY2xhc3MpOwotICAgICAgICBNZXNzYWdlIG0gPSBtZi5jcmVhdGUoUHJvdG9jb2wuc29hcDExKTsKLSAgICAgICAgCi0gICAgICAgIC8vIEdldCB0aGUgQmxvY2tGYWN0b3J5Ci0gICAgICAgIEpBWEJCbG9ja0ZhY3RvcnkgYmYgPSAoSkFYQkJsb2NrRmFjdG9yeSkKLSAgICAgICAgICAgIEZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KEpBWEJCbG9ja0ZhY3RvcnkuY2xhc3MpOwotICAgICAgICAKLSAgICAgICAgLy8gQ3JlYXRlIHRoZSBKQVgtQiBvYmplY3QKLSAgICAgICAgT2JqZWN0RmFjdG9yeSBvZiA9IG5ldyBPYmplY3RGYWN0b3J5KCk7Ci0gICAgICAgIEVjaG9TdHJpbmdSZXNwb25zZSBvYmogPSBvZi5jcmVhdGVFY2hvU3RyaW5nUmVzcG9uc2UoKTsKLSAgICAgICAgb2JqLnNldEVjaG9TdHJpbmdSZXR1cm4oInNhbXBsZSByZXR1cm4gdmFsdWUiKTsKLSAgICAgICAgCi0gICAgICAgIC8vIENyZWF0ZSB0aGUgSkFYQkNvbnRleHQKLSAgICAgICAgSkFYQkJsb2NrQ29udGV4dCBjb250ZXh0ID0gCi0gICAgICAgICAgICBuZXcgSkFYQkJsb2NrQ29udGV4dChFY2hvU3RyaW5nUmVzcG9uc2UuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7Ci0gICAgICAgIAotICAgICAgICAvLyBDcmVhdGUgYSBKQVhCQmxvY2sgdXNpbmcgdGhlIEVjaG8gb2JqZWN0IGFzIHRoZSBjb250ZW50LiAgVGhpcyBzaW11bGF0ZXMKLSAgICAgICAgLy8gd2hhdCBvY2N1cnMgb24gdGhlIG91dGJvdW5kIEpBWC1XUyBEaXNwYXRjaDxPYmplY3Q+IGNsaWVudAotICAgICAgICBCbG9jayBibG9jayA9IGJmLmNyZWF0ZUZyb20ob2JqLCBjb250ZXh0LCBudWxsKTsKLSAgICAgICAgCi0gICAgICAgIC8vIEFkZCB0aGUgYmxvY2sgdG8gdGhlIG1lc3NhZ2UgYXMgbm9ybWFsIGJvZHkgY29udGVudC4KLSAgICAgICAgbS5zZXRCb2R5QmxvY2soYmxvY2spOwotICAgICAgICAKLSAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBtZXNzYWdlIGlzIGEgZmF1bHQuICBUaGUgY2xpZW50L3NlcnZlciB3aWxsIGFsd2F5cyBjYWxsIHRoaXMgbWV0aG9kLgotICAgICAgICAvLyBUaGUgTWVzc2FnZSBtdXN0IHJlc3BvbmQgYXBwcm9wcmlhdGVseSB3aXRob3V0IGRvaW5nIGEgY29udmVyc2lvbi4KLSAgICAgICAgYm9vbGVhbiBpc0ZhdWx0ID0gbS5pc0ZhdWx0KCk7Ci0gICAgICAgIGFzc2VydFRydWUoIWlzRmF1bHQpOwotICAgICAgICBhc3NlcnRUcnVlKCJYTUxQYXJ0IFJlcHJlc2VudGF0aW9uIGlzICIgKyBtLmdldFhNTFBhcnRDb250ZW50VHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAiU1BJTkUiLmVxdWFscyhtLmdldFhNTFBhcnRDb250ZW50VHlwZSgpKSk7Ci0gICAgICAgIAotICAgICAgICAvLyBPbiBhbiBvdXRib3VuZCBmbG93LCB3ZSBuZWVkIHRvIGNvbnZlcnQgdGhlIE1lc3NhZ2UgCi0gICAgICAgIC8vIHRvIGFuIE9NRWxlbWVudCwgc3BlY2lmaWNhbGx5IGFuIE9NIFNPQVBFbnZlbG9wZSwgCi0gICAgICAgIC8vIHNvIHdlIGNhbiBzZXQgaXQgb24gdGhlIEF4aXMyIE1lc3NhZ2VDb250ZXh0Ci0gICAgICAgIG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGUgZW52ID0gCi0gICAgICAgICAgICAob3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZSkgbS5nZXRBc09NRWxlbWVudCgpOwotICAgICAgICAKLSAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBtZXNzYWdlIGlzIGEgZmF1bHQuICBUaGUgY2xpZW50L3NlcnZlciB3aWxsIGFsd2F5cyBjYWxsIHRoaXMgbWV0aG9kLgotICAgICAgICAvLyBUaGUgTWVzc2FnZSBtdXN0IHJlc3BvbmQgYXBwcm9wcmlhdGVseSB3aXRob3V0IGRvaW5nIGEgY29udmVyc2lvbi4KLSAgICAgICAgaXNGYXVsdCA9IG0uaXNGYXVsdCgpOwotICAgICAgICBhc3NlcnRUcnVlKCFpc0ZhdWx0KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiWE1MUGFydCBSZXByZXNlbnRhdGlvbiBpcyAiICsgbS5nZXRYTUxQYXJ0Q29udGVudFR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgIk9NIi5lcXVhbHMobS5nZXRYTUxQYXJ0Q29udGVudFR5cGUoKSkpOwotICAgICAgICAKLSAgICAgICAgLy8gU2VyaWFsaXplIHRoZSBFbnZlbG9wZSB1c2luZyB0aGUgc2FtZSBtZWNoYW5pc20gYXMgdGhlIAotICAgICAgICAvLyBIVFRQIGNsaWVudC4KLSAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgIGVudi5zZXJpYWxpemVBbmRDb25zdW1lKGJhb3MsIG5ldyBPTU91dHB1dEZvcm1hdCgpKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFRvIGNoZWNrIHRoYXQgdGhlIG91dHB1dCBpcyBjb3JyZWN0LCBnZXQgdGhlIFN0cmluZyBjb250ZW50cyBvZiB0aGUgCi0gICAgICAgIC8vIHJlYWRlcgotICAgICAgICBTdHJpbmcgbmV3VGV4dCA9IGJhb3MudG9TdHJpbmcoKTsKLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcobmV3VGV4dCk7Ci0gICAgICAgIGFzc2VydFRydWUobmV3VGV4dC5jb250YWlucyhzYW1wbGVKQVhCVGV4dCkpOwotICAgICAgICBhc3NlcnRUcnVlKG5ld1RleHQuY29udGFpbnMoInNvYXAiKSk7Ci0gICAgICAgIGFzc2VydFRydWUobmV3VGV4dC5jb250YWlucygiRW52ZWxvcGUiKSk7Ci0gICAgICAgIGFzc2VydFRydWUobmV3VGV4dC5jb250YWlucygiQm9keSIpKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgSkFYQkJsb2NrIGNvbnRhaW5pbmcgYSBKQVgtQiBidXNpbmVzcyBvYmplY3QgCi0gICAgICogYW5kIHNpbXVsYXRlIGEgbm9ybWFsIERpc3BhdGNoPE9iamVjdD4gb3V0cHV0IGZsb3cKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RKQVhCT3V0Zmxvd19XM0NFbmRwb2ludFJlZmVyZW5jZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBDcmVhdGUgYSBTT0FQIDEuMSBNZXNzYWdlCi0gICAgICAgIE1lc3NhZ2VGYWN0b3J5IG1mID0gKE1lc3NhZ2VGYWN0b3J5KQotICAgICAgICAgICAgRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoTWVzc2FnZUZhY3RvcnkuY2xhc3MpOwotICAgICAgICBNZXNzYWdlIG0gPSBtZi5jcmVhdGUoUHJvdG9jb2wuc29hcDExKTsKLSAgICAgICAgCi0gICAgICAgIC8vIEdldCB0aGUgQmxvY2tGYWN0b3J5Ci0gICAgICAgIEpBWEJCbG9ja0ZhY3RvcnkgYmYgPSAoSkFYQkJsb2NrRmFjdG9yeSkKLSAgICAgICAgICAgIEZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KEpBWEJCbG9ja0ZhY3RvcnkuY2xhc3MpOwotICAgICAgICAKLSAgICAgICAgLy8gQ3JlYXRlIHRoZSBKQVgtQiBvYmplY3QuLi4gYSBXM0NFbmRwb2ludFJlZmVyZW5jZQotICAgICAgICBXM0NFbmRwb2ludFJlZmVyZW5jZSBvYmogPSB3M2NFUFI7Ci0gICAgICAgCi0gICAgICAgIAotICAgICAgICAvLyBDcmVhdGUgdGhlIEpBWEJDb250ZXh0Ci0gICAgICAgIENsYXNzW10gY2xhc3NlcyA9IG5ldyBDbGFzc1tdIHtXM0NFbmRwb2ludFJlZmVyZW5jZS5jbGFzc307Ci0gICAgICAgIC8vSkFYQkNvbnRleHQgamF4YkNvbnRleHQgPSBKQVhCQ29udGV4dC5uZXdJbnN0YW5jZShjbGFzc2VzKTsKLSAgICAgICAgLy9KQVhCQmxvY2tDb250ZXh0IGNvbnRleHQgPSBuZXcgSkFYQkJsb2NrQ29udGV4dChqYXhiQ29udGV4dCk7Ci0gICAgICAgIEpBWEJCbG9ja0NvbnRleHQgY29udGV4dCA9IG5ldyBKQVhCQmxvY2tDb250ZXh0KCJqYXZheC54bWwud3Mud3NhZGRyZXNzaW5nIik7Ci0gICAgICAgIAotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkpBWEJDb250ZXh0PSAiICsgY29udGV4dCk7Ci0gICAgICAgIAotICAgICAgICAvLyBDcmVhdGUgYSBKQVhCQmxvY2sgdXNpbmcgdGhlIEVjaG8gb2JqZWN0IGFzIHRoZSBjb250ZW50LiAgVGhpcyBzaW11bGF0ZXMKLSAgICAgICAgLy8gd2hhdCBvY2N1cnMgb24gdGhlIG91dGJvdW5kIEpBWC1XUyBEaXNwYXRjaDxPYmplY3Q+IGNsaWVudAotICAgICAgICBCbG9jayBibG9jayA9IGJmLmNyZWF0ZUZyb20ob2JqLCBjb250ZXh0LCBudWxsKTsKLSAgICAgICAgCi0gICAgICAgIC8vIEFkZCB0aGUgYmxvY2sgdG8gdGhlIG1lc3NhZ2UgYXMgbm9ybWFsIGJvZHkgY29udGVudC4KLSAgICAgICAgbS5zZXRCb2R5QmxvY2soYmxvY2spOwotICAgICAgICAKLSAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBtZXNzYWdlIGlzIGEgZmF1bHQuICBUaGUgY2xpZW50L3NlcnZlciB3aWxsIGFsd2F5cyBjYWxsIHRoaXMgbWV0aG9kLgotICAgICAgICAvLyBUaGUgTWVzc2FnZSBtdXN0IHJlc3BvbmQgYXBwcm9wcmlhdGVseSB3aXRob3V0IGRvaW5nIGEgY29udmVyc2lvbi4KLSAgICAgICAgYm9vbGVhbiBpc0ZhdWx0ID0gbS5pc0ZhdWx0KCk7Ci0gICAgICAgIGFzc2VydFRydWUoIWlzRmF1bHQpOwotICAgICAgICBhc3NlcnRUcnVlKCJYTUxQYXJ0IFJlcHJlc2VudGF0aW9uIGlzICIgKyBtLmdldFhNTFBhcnRDb250ZW50VHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAiU1BJTkUiLmVxdWFscyhtLmdldFhNTFBhcnRDb250ZW50VHlwZSgpKSk7Ci0gICAgICAgIAotICAgICAgICAvLyBPbiBhbiBvdXRib3VuZCBmbG93LCB3ZSBuZWVkIHRvIGNvbnZlcnQgdGhlIE1lc3NhZ2UgCi0gICAgICAgIC8vIHRvIGFuIE9NRWxlbWVudCwgc3BlY2lmaWNhbGx5IGFuIE9NIFNPQVBFbnZlbG9wZSwgCi0gICAgICAgIC8vIHNvIHdlIGNhbiBzZXQgaXQgb24gdGhlIEF4aXMyIE1lc3NhZ2VDb250ZXh0Ci0gICAgICAgIG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGUgZW52ID0gCi0gICAgICAgICAgICAob3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZSkgbS5nZXRBc09NRWxlbWVudCgpOwotICAgICAgICAKLSAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBtZXNzYWdlIGlzIGEgZmF1bHQuICBUaGUgY2xpZW50L3NlcnZlciB3aWxsIGFsd2F5cyBjYWxsIHRoaXMgbWV0aG9kLgotICAgICAgICAvLyBUaGUgTWVzc2FnZSBtdXN0IHJlc3BvbmQgYXBwcm9wcmlhdGVseSB3aXRob3V0IGRvaW5nIGEgY29udmVyc2lvbi4KLSAgICAgICAgaXNGYXVsdCA9IG0uaXNGYXVsdCgpOwotICAgICAgICBhc3NlcnRUcnVlKCFpc0ZhdWx0KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiWE1MUGFydCBSZXByZXNlbnRhdGlvbiBpcyAiICsgbS5nZXRYTUxQYXJ0Q29udGVudFR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgIk9NIi5lcXVhbHMobS5nZXRYTUxQYXJ0Q29udGVudFR5cGUoKSkpOwotICAgICAgICAKLSAgICAgICAgLy8gU2VyaWFsaXplIHRoZSBFbnZlbG9wZSB1c2luZyB0aGUgc2FtZSBtZWNoYW5pc20gYXMgdGhlIAotICAgICAgICAvLyBIVFRQIGNsaWVudC4KLSAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgIGVudi5zZXJpYWxpemVBbmRDb25zdW1lKGJhb3MsIG5ldyBPTU91dHB1dEZvcm1hdCgpKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFRvIGNoZWNrIHRoYXQgdGhlIG91dHB1dCBpcyBjb3JyZWN0LCBnZXQgdGhlIFN0cmluZyBjb250ZW50cyBvZiB0aGUgCi0gICAgICAgIC8vIHJlYWRlcgotICAgICAgICBTdHJpbmcgbmV3VGV4dCA9IGJhb3MudG9TdHJpbmcoKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG5ld1RleHQpOwotICAgICAgICBhc3NlcnRUcnVlKG5ld1RleHQuY29udGFpbnMoImh0dHA6Ly9zb21ld2hlcmUuY29tL3NvbWVob3ciKSk7Ci0gICAgICAgIGFzc2VydFRydWUobmV3VGV4dC5jb250YWlucygic29hcCIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShuZXdUZXh0LmNvbnRhaW5zKCJFbnZlbG9wZSIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShuZXdUZXh0LmNvbnRhaW5zKCJCb2R5IikpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBTYW1lIGFzIEpBWEJPdXRwdXRmbG93LCBidXQgaGFzIGFuIGFkZGl0aW9uYWwgY2hlY2sKLSAgICAgKiB0byBtYWtlIHN1cmUgdGhhdCB0aGUgSkFYQiBzZXJpYWxpemF0aW9uIGlzIGRlZmVycnJlZAotICAgICAqIHVudGlsIHRoZSBhY3R1YWwgc2VyaWFsaXphdGlvbiBvZiB0aGUgbWVzc2FnZS4KLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RKQVhCT3V0Zmxvd1BlcmYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gQ3JlYXRlIGEgU09BUCAxLjEgTWVzc2FnZQotICAgICAgICBNZXNzYWdlRmFjdG9yeSBtZiA9IChNZXNzYWdlRmFjdG9yeSkKLSAgICAgICAgICAgIEZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KE1lc3NhZ2VGYWN0b3J5LmNsYXNzKTsKLSAgICAgICAgTWVzc2FnZSBtID0gbWYuY3JlYXRlKFByb3RvY29sLnNvYXAxMSk7Ci0gICAgICAgIAotICAgICAgICAvLyBHZXQgdGhlIEJsb2NrRmFjdG9yeQotICAgICAgICBKQVhCQmxvY2tGYWN0b3J5IGJmID0gKEpBWEJCbG9ja0ZhY3RvcnkpCi0gICAgICAgICAgICBGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShKQVhCQmxvY2tGYWN0b3J5LmNsYXNzKTsKLSAgICAgICAgCi0gICAgICAgIC8vIENyZWF0ZSB0aGUgSkFYLUIgb2JqZWN0Ci0gICAgICAgIE9iamVjdEZhY3Rvcnkgb2YgPSBuZXcgT2JqZWN0RmFjdG9yeSgpOwotICAgICAgICBFY2hvU3RyaW5nUmVzcG9uc2Ugb2JqID0gb2YuY3JlYXRlRWNob1N0cmluZ1Jlc3BvbnNlKCk7Ci0gICAgICAgIG9iai5zZXRFY2hvU3RyaW5nUmV0dXJuKCJzYW1wbGUgcmV0dXJuIHZhbHVlIik7Ci0gICAgICAgIAotICAgICAgICAvLyBDcmVhdGUgdGhlIEpBWEJDb250ZXh0Ci0gICAgICAgIEpBWEJCbG9ja0NvbnRleHQgY29udGV4dCA9IAotICAgICAgICAgICAgbmV3IEpBWEJCbG9ja0NvbnRleHQoRWNob1N0cmluZ1Jlc3BvbnNlLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOwotICAgICAgIAotICAgICAgICAvLyBDcmVhdGUgYSBKQVhCQmxvY2sgdXNpbmcgdGhlIEVjaG8gb2JqZWN0IGFzIHRoZSBjb250ZW50LiAgVGhpcyBzaW11bGF0ZXMKLSAgICAgICAgLy8gd2hhdCBvY2N1cnMgb24gdGhlIG91dGJvdW5kIEpBWC1XUyBEaXNwYXRjaDxPYmplY3Q+IGNsaWVudAotICAgICAgICBCbG9jayBibG9jayA9IGJmLmNyZWF0ZUZyb20ob2JqLCBjb250ZXh0LCBudWxsKTsKLSAgICAgICAgCi0gICAgICAgIC8vIEFkZCB0aGUgYmxvY2sgdG8gdGhlIG1lc3NhZ2UgYXMgbm9ybWFsIGJvZHkgY29udGVudC4KLSAgICAgICAgbS5zZXRCb2R5QmxvY2soYmxvY2spOwotICAgICAgICAKLSAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBtZXNzYWdlIGlzIGEgZmF1bHQuICBUaGUgY2xpZW50L3NlcnZlciB3aWxsIGFsd2F5cyBjYWxsIHRoaXMgbWV0aG9kLgotICAgICAgICAvLyBUaGUgTWVzc2FnZSBtdXN0IHJlc3BvbmQgYXBwcm9wcmlhdGVseSB3aXRob3V0IGRvaW5nIGEgY29udmVyc2lvbi4KLSAgICAgICAgYm9vbGVhbiBpc0ZhdWx0ID0gbS5pc0ZhdWx0KCk7Ci0gICAgICAgIGFzc2VydFRydWUoIWlzRmF1bHQpOwotICAgICAgICBhc3NlcnRUcnVlKCJYTUxQYXJ0IFJlcHJlc2VudGF0aW9uIGlzICIgKyBtLmdldFhNTFBhcnRDb250ZW50VHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAiU1BJTkUiLmVxdWFscyhtLmdldFhNTFBhcnRDb250ZW50VHlwZSgpKSk7Ci0gICAgICAgIAotICAgICAgICAvLyBPbiBhbiBvdXRib3VuZCBmbG93LCB3ZSBuZWVkIHRvIGNvbnZlcnQgdGhlIE1lc3NhZ2UgCi0gICAgICAgIC8vIHRvIGFuIE9NRWxlbWVudCwgc3BlY2lmaWNhbGx5IGFuIE9NIFNPQVBFbnZlbG9wZSwgCi0gICAgICAgIC8vIHNvIHdlIGNhbiBzZXQgaXQgb24gdGhlIEF4aXMyIE1lc3NhZ2VDb250ZXh0Ci0gICAgICAgIG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGUgZW52ID0gCi0gICAgICAgICAgICAob3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZSkgbS5nZXRBc09NRWxlbWVudCgpOwotICAgICAgICAKLSAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBtZXNzYWdlIGlzIGEgZmF1bHQuICBUaGUgY2xpZW50L3NlcnZlciB3aWxsIGFsd2F5cyBjYWxsIHRoaXMgbWV0aG9kLgotICAgICAgICAvLyBUaGUgTWVzc2FnZSBtdXN0IHJlc3BvbmQgYXBwcm9wcmlhdGVseSB3aXRob3V0IGRvaW5nIGEgY29udmVyc2lvbi4KLSAgICAgICAgaXNGYXVsdCA9IG0uaXNGYXVsdCgpOwotICAgICAgICBhc3NlcnRUcnVlKCFpc0ZhdWx0KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiWE1MUGFydCBSZXByZXNlbnRhdGlvbiBpcyAiICsgbS5nZXRYTUxQYXJ0Q29udGVudFR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgIk9NIi5lcXVhbHMobS5nZXRYTUxQYXJ0Q29udGVudFR5cGUoKSkpOwotICAgICAgICAKLSAgICAgICAgLy8gUEVSRk9STUFOQ0UgQ0hFQ0s6Ci0gICAgICAgIC8vIFRoZSBlbGVtZW50IGluIHRoZSBib2R5IHNob3VsZCBiZSBhbiBPTVNvdXJjZWRFbGVtZW50Ci0gICAgICAgIE9NRWxlbWVudCBvID0gZW52LmdldEJvZHkoKS5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShvIGluc3RhbmNlb2YgT01Tb3VyY2VkRWxlbWVudEltcGwpOwotICAgICAgICBhc3NlcnRUcnVlKCgoT01Tb3VyY2VkRWxlbWVudEltcGwpbykuaXNFeHBhbmRlZCgpID09IGZhbHNlKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFNlcmlhbGl6ZSB0aGUgRW52ZWxvcGUgdXNpbmcgdGhlIHNhbWUgbWVjaGFuaXNtIGFzIHRoZSAKLSAgICAgICAgLy8gSFRUUCBjbGllbnQuCi0gICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICBlbnYuc2VyaWFsaXplQW5kQ29uc3VtZShiYW9zLCBuZXcgT01PdXRwdXRGb3JtYXQoKSk7Ci0gICAgICAgIAotICAgICAgICAvLyBUbyBjaGVjayB0aGF0IHRoZSBvdXRwdXQgaXMgY29ycmVjdCwgZ2V0IHRoZSBTdHJpbmcgY29udGVudHMgb2YgdGhlIAotICAgICAgICAvLyByZWFkZXIKLSAgICAgICAgU3RyaW5nIG5ld1RleHQgPSBiYW9zLnRvU3RyaW5nKCk7Ci0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKG5ld1RleHQpOwotICAgICAgICBhc3NlcnRUcnVlKG5ld1RleHQuY29udGFpbnMoc2FtcGxlSkFYQlRleHQpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShuZXdUZXh0LmNvbnRhaW5zKCJzb2FwIikpOwotICAgICAgICBhc3NlcnRUcnVlKG5ld1RleHQuY29udGFpbnMoIkVudmVsb3BlIikpOwotICAgICAgICBhc3NlcnRUcnVlKG5ld1RleHQuY29udGFpbnMoIkJvZHkiKSk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgZmluYWwgaW50IE5PX1BFUlNJU1QgICAgICAgPSAwOwotICAgIHByaXZhdGUgZmluYWwgaW50IFBFUlNJU1QgICAgICAgICA9IDE7Ci0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgU0FWRV9BTkRfUEVSU0lTVCA9IDI7Ci0gICAgcHVibGljIHZvaWQgdGVzdEpBWEJJbmZsb3dfc29hcDExKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIF90ZXN0SkFYQkluZmxvdyhzYW1wbGVKQVhCRW52ZWxvcGUxMSwgTk9fUEVSU0lTVCwgZmFsc2UpOwotICAgIH0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SkFYQkluZmxvd19zb2FwMTFfd2l0aEN1c3RvbUJ1aWxkZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgX3Rlc3RKQVhCSW5mbG93KHNhbXBsZUpBWEJFbnZlbG9wZTExLCBOT19QRVJTSVNULCB0cnVlKTsKLSAgICB9Ci0gICAgcHVibGljIHZvaWQgdGVzdEpBWEJJbmZsb3dfc29hcDEyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIF90ZXN0SkFYQkluZmxvdyhzYW1wbGVKQVhCRW52ZWxvcGUxMiwgTk9fUEVSU0lTVCwgZmFsc2UpOwotICAgIH0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SkFYQkluZmxvd19zb2FwMTFfd2l0aFBlcnNpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgX3Rlc3RKQVhCSW5mbG93KHNhbXBsZUpBWEJFbnZlbG9wZTExLCBQRVJTSVNULCBmYWxzZSk7Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIHRlc3RKQVhCSW5mbG93X3NvYXAxMl93aXRoUGVyc2lzdCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBfdGVzdEpBWEJJbmZsb3coc2FtcGxlSkFYQkVudmVsb3BlMTIsIFBFUlNJU1QsIGZhbHNlKTsKLSAgICB9Ci0gICAgcHVibGljIHZvaWQgdGVzdEpBWEJJbmZsb3dfc29hcDExX3dpdGhTYXZlQW5kUGVyc2lzdCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBfdGVzdEpBWEJJbmZsb3coc2FtcGxlSkFYQkVudmVsb3BlMTEsIFNBVkVfQU5EX1BFUlNJU1QsIGZhbHNlKTsKLSAgICB9Ci0gICAgcHVibGljIHZvaWQgdGVzdEpBWEJJbmZsb3dfc29hcDEyX3dpdGhTYXZlQW5kUGVyc2lzdCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBfdGVzdEpBWEJJbmZsb3coc2FtcGxlSkFYQkVudmVsb3BlMTIsIFNBVkVfQU5EX1BFUlNJU1QsIGZhbHNlKTsKLSAgICB9Ci0gICAgcHVibGljIHZvaWQgX3Rlc3RKQVhCSW5mbG93KFN0cmluZyBzYW1wbGVKQVhCRW52ZWxvcGUsIGludCBwZXJzaXN0LCBib29sZWFuIGluc3RhbGxKQVhCQ3VzdG9tQnVpbGRlcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIENyZWF0ZSBhIFNPQVAgT00gb3V0IG9mIHRoZSBzYW1wbGUgaW5jb21pbmcgWE1MLiAgVGhpcwotICAgICAgICAvLyBzaW11bGF0ZXMgd2hhdCBBeGlzMiB3aWxsIGJlIGRvaW5nIHdpdGggdGhlIGluYm91bmQgbWVzc2FnZS4gCi0gICAgICAgIFN0cmluZ1JlYWRlciBzciA9IG5ldyBTdHJpbmdSZWFkZXIoc2FtcGxlSkFYQkVudmVsb3BlKTsKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIGluZmxvdyA9IGlucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoc3IpOwotICAgICAgICBTdEFYU09BUE1vZGVsQnVpbGRlciBidWlsZGVyID0gbmV3IFN0QVhTT0FQTW9kZWxCdWlsZGVyKGluZmxvdywgbnVsbCk7Ci0gICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSBidWlsZGVyLmdldFNPQVBFbnZlbG9wZSgpOwotICAgICAgICAKLSAgICAgICAgSkFYQkRTQ29udGV4dCBqZHMgPSBudWxsOwotICAgICAgICBpZiAoaW5zdGFsbEpBWEJDdXN0b21CdWlsZGVyKSB7Ci0gICAgICAgICAgICBqZHMgPSBuZXcgSkFYQkRTQ29udGV4dChFY2hvU3RyaW5nUmVzcG9uc2UuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICBKQVhCQ3VzdG9tQnVpbGRlciBqY2IgPSBuZXcgSkFYQkN1c3RvbUJ1aWxkZXIoamRzKTsKLSAgICAgICAgICAgIGJ1aWxkZXIucmVnaXN0ZXJDdXN0b21CdWlsZGVyRm9yUGF5bG9hZChqY2IpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBDcmVhdGUgYSBTT0FQIDEuMSBNZXNzYWdlIGZyb20gdGhlIHNhbXBsZSBpbmNvbWluZyBYTUwKLSAgICAgICAgTWVzc2FnZUZhY3RvcnkgbWYgPSAoTWVzc2FnZUZhY3RvcnkpCi0gICAgICAgICAgICBGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShNZXNzYWdlRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgIE1lc3NhZ2UgbSA9IG1mLmNyZWF0ZUZyb20ob21FbGVtZW50LCBudWxsKTsKLSAgICAgICAgCi0gICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgbWVzc2FnZSBpcyBhIGZhdWx0LiAgVGhlIGNsaWVudC9zZXJ2ZXIgd2lsbCBhbHdheXMgY2FsbCB0aGlzIG1ldGhvZC4KLSAgICAgICAgLy8gVGhlIE1lc3NhZ2UgbXVzdCByZXNwb25kIGFwcHJvcHJpYXRlbHkgd2l0aG91dCBkb2luZyBhIGNvbnZlcnNpb24uCi0gICAgICAgIGJvb2xlYW4gaXNGYXVsdCA9IG0uaXNGYXVsdCgpOwotICAgICAgICBhc3NlcnRUcnVlKCFpc0ZhdWx0KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiWE1MUGFydCBSZXByZXNlbnRhdGlvbiBpcyAiICsgbS5nZXRYTUxQYXJ0Q29udGVudFR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgIk9NIi5lcXVhbHMobS5nZXRYTUxQYXJ0Q29udGVudFR5cGUoKSkpOwotICAgICAgICAKLSAgICAgICAgaWYgKGluc3RhbGxKQVhCQ3VzdG9tQnVpbGRlcikgewotICAgICAgICAgICAgLy8gVGhlIEpBWEJEU0NvbnRleHQgYW5kIHRoZSBKQVhCVXRpbHMgYWNjZXNzIHRoZSBKQVhCQ29udGV4dAotICAgICAgICAgICAgLy8gZm9yIHRoZSAidGVzdCIgcGFja2FnZS4KLSAgICAgICAgICAgIC8vIFRoZSBKQVhCQ29udGV4dCBjcmVhdGlvbiBpcyB2ZXJ5IGV4cGVuc2l2ZS4KLSAgICAgICAgICAgIC8vIEhvd2V2ZXIgdGhlIEpBWEJDb250ZXh0IGNhbiBhbHNvIGJlIHZlcnkgbGFyZ2UuCi0gICAgICAgICAgICAvLyAKLSAgICAgICAgICAgIC8vIEZvciB0aGVzZSByZWFzb25zLCB0aGUgSkFYQlV0aWxzIGNvZGUgY2FjaGVzIHRoZSBKQVhCQ29udGV4dCB2YWx1ZXMuCi0gICAgICAgICAgICAvLyBBbmQsIHRoZSBKQVhCRFNDb250ZXh0IGFuZCBKQVhCVXRpbHMgY29kZSB1c2UgV2Vha1JlZmVyZW5jZXMgdG8gcmVmZXIgCi0gICAgICAgICAgICAvLyB0byB0aGUgSkFYQkNvbnRleHQgKHNvIHRoYXQgaXQgaXMgZWFzaWx5IGdjJ2QpLgotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBUaGUgZm9sbG93aW5nIGNvZGUgY2hlY2tzIG1ha2VzIHN1cmUgdGhhdCB0aGUgY2FjaGluZyBhbmQgZ2MgaXMgY29ycmVjdC4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gR2V0IHRoZSBKQVhCQ29udGV4dAotICAgICAgICAgICAgSkFYQkNvbnRleHQgY29udGV4dCA9IGpkcy5nZXRKQVhCQ29udGV4dCgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBHZXQgdGhlIGlkZW50aXR5IGhhc2ggY29kZS4gIFRoaXMgaXMgYW4gaW5kaWNhdG9yIG9mIHRoZSB1bmlxdWUgbWVtb3J5IHBvaW50ZXIKLSAgICAgICAgICAgIC8vIGZvciB0aGUgY29udGV4dC4KLSAgICAgICAgICAgIGludCBjb250ZXh0UG9pbnRlciA9IFN5c3RlbS5pZGVudGl0eUhhc2hDb2RlKGNvbnRleHQpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBSZWxlYXNlIG91ciBhY2Nlc3MgdG8gdGhlIGNvbnRleHQuCi0gICAgICAgICAgICAvLyBOb3cgdGhlIG9ubHkgYWNjZXNzZXMgaW4gdGhlIHN5c3RlbSBzaG91bGQgYmUgInNvZnQgcmVmcyIKLSAgICAgICAgICAgIGNvbnRleHQgPSBudWxsOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBGb3JjZSBnYXJiYWdlIGNvbGxlY3Rpb24KLSAgICAgICAgICAgIFN5c3RlbS5nYygpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBHZXQgYSBuZXcgY29udGV4dCBmcm9tIEpBWEJVdGlscwotICAgICAgICAgICAgVHJlZVNldDxTdHJpbmc+IHBhY2thZ2VzID0gbmV3IFRyZWVTZXQ8U3RyaW5nPigpOwotICAgICAgICAgICAgcGFja2FnZXMuYWRkKEVjaG9TdHJpbmdSZXNwb25zZS5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIGNvbnRleHQgPSBKQVhCVXRpbHMuZ2V0SkFYQkNvbnRleHQocGFja2FnZXMpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBUaGlzIG5ldyBjb250ZXh0IHNob3VsZCBoYXZlIGEgZGlmZmVyZW50IHBvaW50ZXIgdGhhbiB0aGUgb3JpZ2luYWwKLSAgICAgICAgICAgIGludCBjb250ZXh0UG9pbnRlcjIgPSBTeXN0ZW0uaWRlbnRpdHlIYXNoQ29kZShjb250ZXh0KTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBzdGF0ZW1lbnQgaXMgbm8gbG9uZ2VyIHZhbGlkLiAgVGhlIAotICAgICAgICAgICAgLy8gSkFYQkNvbnRleHQgaXMgc3RvcmVkIGluIGEgU29mdFJlZmVyZW5jZSAod2hpY2ggd2lsbCBvbmx5Ci0gICAgICAgICAgICAvLyBnZXQgZ2MnZCBpZiBtZW1vcnkgaXMgbG93KS4gIAotICAgICAgICAgICAgLy9hc3NlcnRUcnVlKGNvbnRleHRQb2ludGVyICE9IGNvbnRleHRQb2ludGVyMik7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIFJlbGVhc2UgdGhlIGhvbGQgb24gdGhlIGNvbnRleHQKLSAgICAgICAgICAgIGNvbnRleHQgPSBudWxsOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBOb3cgY2FsbCBKQVhCVXRpbHMgYWdhaW4gdG8gZ2V0IGEgSkFYQkNvbnRleHQuCi0gICAgICAgICAgICAvLyBTaW5jZSB0aGVyZSB3YXMgbm8gaW50ZXJ2ZW5pbmcgZ2MoKSwgaXQgc2hvdWxkIHJldHVybiB0aGUgY2FjaGVkIHZhbHVlCi0gICAgICAgICAgICBjb250ZXh0ID0gSkFYQlV0aWxzLmdldEpBWEJDb250ZXh0KHBhY2thZ2VzKTsKLSAgICAgICAgICAgIGludCBjb250ZXh0UG9pbnRlcjMgPSBTeXN0ZW0uaWRlbnRpdHlIYXNoQ29kZShjb250ZXh0KTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoY29udGV4dFBvaW50ZXIzID09IGNvbnRleHRQb2ludGVyMik7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBzYXZlTXNnVGV4dCA9ICIiOwotICAgICAgICBpZiAocGVyc2lzdCA9PSBTQVZFX0FORF9QRVJTSVNUKSB7Ci0gICAgICAgICAgICAvLyBTaW11bGF0ZSBzYXZpbmcgdGhlIG1lc3NhZ2Ugc28gdGhhdCBpdCBjYW4gYmUgZnVsbHkgcmVidWlsdC4KLSAgICAgICAgICAgIHNhdmVNc2dUZXh0ID0gbS5nZXRBc09NRWxlbWVudCgpLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIE9iamVjdCBjdXN0b21CdWlsdE9iamVjdCA9IG51bGw7Ci0gICAgICAgIGlmIChpbnN0YWxsSkFYQkN1c3RvbUJ1aWxkZXIpIHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBvbSA9IG0uZ2V0QXNPTUVsZW1lbnQoKTsKLSAgICAgICAgICAgIG9tID0gKChvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlKSBvbSkuZ2V0Qm9keSgpLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgICAgICAgaWYgKG9tIGluc3RhbmNlb2YgT01Tb3VyY2VkRWxlbWVudCAmJgotICAgICAgICAgICAgICAgICgoT01Tb3VyY2VkRWxlbWVudCkgb20pLmdldERhdGFTb3VyY2UoKSBpbnN0YW5jZW9mIEpBWEJEYXRhU291cmNlKSB7Ci0gICAgICAgICAgICAgICAgY3VzdG9tQnVpbHRPYmplY3QgPSAoKEpBWEJEYXRhU291cmNlKSAoKE9NU291cmNlZEVsZW1lbnQpIG9tKS5nZXREYXRhU291cmNlKCkpLmdldE9iamVjdCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgLy8gR2V0IHRoZSBCbG9ja0ZhY3RvcnkKLSAgICAgICAgSkFYQkJsb2NrRmFjdG9yeSBiZiA9IChKQVhCQmxvY2tGYWN0b3J5KQotICAgICAgICAgICAgRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoSkFYQkJsb2NrRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgIAotICAgICAgICAvLyBDcmVhdGUgdGhlIEpBWEJDb250ZXh0IGluc3RhbmNlIHRoYXQgd2lsbCBiZSB1c2VkCi0gICAgICAgIC8vIHRvIGRlc2VyaWFsaXplIHRoZSBKQVgtQiBvYmplY3QgY29udGVudCBpbiB0aGUgbWVzc2FnZS4KLSAgICAgICAgSkFYQkJsb2NrQ29udGV4dCBjb250ZXh0ID0gCi0gICAgICAgICAgICBuZXcgSkFYQkJsb2NrQ29udGV4dChFY2hvU3RyaW5nUmVzcG9uc2UuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7Ci0gICAgICAgIAotICAgICAgICAvLyBHZXQgdGhlIEpBWEJCbG9jayB0aGF0IHdyYXBzIHRoZSBjb250ZW50Ci0gICAgICAgIEJsb2NrIGIgPSBtLmdldEJvZHlCbG9jayhjb250ZXh0LCBiZik7Ci0gICAgIAotICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhlIG1lc3NhZ2UgaXMgYSBmYXVsdC4gIFRoZSBjbGllbnQvc2VydmVyIHdpbGwgYWx3YXlzIGNhbGwgdGhpcyBtZXRob2QuCi0gICAgICAgIC8vIFRoZSBNZXNzYWdlIG11c3QgcmVzcG9uZCBhcHByb3ByaWF0ZWx5IHdpdGhvdXQgZG9pbmcgYSBjb252ZXJzaW9uLgotICAgICAgICBpc0ZhdWx0ID0gbS5pc0ZhdWx0KCk7Ci0gICAgICAgIGFzc2VydFRydWUoIWlzRmF1bHQpOwotICAgICAgICBhc3NlcnRUcnVlKCJYTUxQYXJ0IFJlcHJlc2VudGF0aW9uIGlzICIgKyBtLmdldFhNTFBhcnRDb250ZW50VHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAiU1BJTkUiLmVxdWFscyhtLmdldFhNTFBhcnRDb250ZW50VHlwZSgpKSk7Ci0gICAgICAgIAotICAgICAgICAvLyBHZXQgdGhlIGJ1c2luZXNzIG9iamVjdCBmcm9tIHRoZSBibG9jaywgd2hpY2ggc2hvdWxkIGJlIGEgCi0gICAgICAgIC8vIEpBWC1CIG9iamVjdAotICAgICAgICBPYmplY3QgYm8gPSBiLmdldEJ1c2luZXNzT2JqZWN0KGZhbHNlKTsKLSAgICAgICAgbS5zZXRQb3N0UGl2b3QoKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFNpbXVsYXRlIHJlc3RvcmluZyB0aGUgbWVzc2FnZQotICAgICAgICBpZiAocGVyc2lzdCA9PSBTQVZFX0FORF9QRVJTSVNUKSB7Ci0gICAgICAgICAgICBzciA9IG5ldyBTdHJpbmdSZWFkZXIoc2F2ZU1zZ1RleHQpOwotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHNhdmVNc2dSZWFkZXIgPSBpbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKHNyKTsKLSAgICAgICAgICAgIGJ1aWxkZXIgPSBuZXcgU3RBWFNPQVBNb2RlbEJ1aWxkZXIoc2F2ZU1zZ1JlYWRlciwgbnVsbCk7Ci0gICAgICAgICAgICBvbUVsZW1lbnQgPSBidWlsZGVyLmdldFNPQVBFbnZlbG9wZSgpOwotICAgICAgICAgICAgbSA9IG1mLmNyZWF0ZUZyb20ob21FbGVtZW50LCBudWxsKTsKLSAgICAgICAgfSAKLSAgICAgICAgCi0gICAgICAgIGlmIChpbnN0YWxsSkFYQkN1c3RvbUJ1aWxkZXIpIHsKLSAgICAgICAgICAgIC8vIElmIGluc3RhbGxlZCBqYXhiIGN1c3RvbSBidWlsZGVyLCB0aGVuIGN1c3RvbSBidWlsdCBvYmplY3Qgc2hvdWxkIGJlIHNhbWUgb2JqZWN0IGFzIHRoZSBidXNpbmVzcyBvYmplY3QKLSAgICAgICAgICAgIGFzc2VydFRydWUgKGN1c3RvbUJ1aWx0T2JqZWN0ID09IGJvKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIC8vIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgcmlnaHQgb2JqZWN0IHdhcyByZXR1cm5lZAotICAgICAgICBhc3NlcnROb3ROdWxsKGJvKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShibyBpbnN0YW5jZW9mIEVjaG9TdHJpbmdSZXNwb25zZSk7Ci0gICAgICAgIAotICAgICAgICAvLyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIGNvbnRlbnQgb2YgdGhhdCBvYmplY3QgaXMgY29ycmVjdAotICAgICAgICBFY2hvU3RyaW5nUmVzcG9uc2UgZXNyID0gKEVjaG9TdHJpbmdSZXNwb25zZSkgYm87Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZXNyLmdldEVjaG9TdHJpbmdSZXR1cm4oKSk7Ci0gICAgICAgIGFzc2VydFRydWUoZXNyLmdldEVjaG9TdHJpbmdSZXR1cm4oKS5lcXVhbHMoInNhbXBsZSByZXR1cm4gdmFsdWUiKSk7Ci0gICAgICAgIAotICAgICAgICAvLyBTaW11bGF0ZSBvdXRib3VuZAotICAgICAgICBpZiAocGVyc2lzdCA9PSBQRVJTSVNUKSB7Ci0gICAgICAgICAgICBTdHJpbmcgcGVyc2lzdE1zZyA9IG0uZ2V0QXNPTUVsZW1lbnQoKS50b1N0cmluZygpOwotICAgICAgICAgICAgLy8gV2Ugc2hvdWxkIGJlIGFibGUgdG8gcGVyc2lzdCB0aGUgbWVzc2FnZSwgCi0gICAgICAgICAgICAvLyBhbmQgdGhlIHBlcnNpc3RlZCBtZXNzYWdlIFdJTEwgY29udGFpbiB0aGUgZWNob1N0cmluZ1Jlc3BvbnNlIGNvbnRlbnRzCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHBlcnNpc3RNc2cuY29udGFpbnMoIkJvZHkiKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHBlcnNpc3RNc2cuY29udGFpbnMoImVjaG9TdHJpbmdSZXNwb25zZSIpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUocGVyc2lzdE1zZy5jb250YWlucygic2FtcGxlIHJldHVybiB2YWx1ZSIpKTsKLSAgICAgICAgICAgIAotICAgICAgICB9IGVsc2UgaWYgKHBlcnNpc3QgPT0gU0FWRV9BTkRfUEVSU0lTVCkgewotICAgICAgICAgICAgU3RyaW5nIHBlcnNpc3RNc2cgPSBtLmdldEFzT01FbGVtZW50KCkudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIC8vIFdlIHNob3VsZCBiZSBhYmxlIHRvIHBlcnNpc3QgdGhlIG1lc3NhZ2UsIAotICAgICAgICAgICAgLy8gYW5kIHRoZSBwZXJzaXN0ZWQgbWVzc2FnZSBXSUxMIGNvbnRhaW4gdGhlIGVjaG9TdHJpbmdSZXNwb25zZSBjb250ZW50cwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShwZXJzaXN0TXNnLmNvbnRhaW5zKCJCb2R5IikpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShwZXJzaXN0TXNnLmNvbnRhaW5zKCJlY2hvU3RyaW5nUmVzcG9uc2UiKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHBlcnNpc3RNc2cuY29udGFpbnMoInNhbXBsZSByZXR1cm4gdmFsdWUiKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIEFmdGVyIHBlcnNpc3RhbmNlOiBTYW5kZXNoYSBtYXkgaW5zcGVjdCB0aGUgYm9keS4gIE1ha2Ugc3VyZSB0aGlzIGRvZXMgbm90IGNhdXNlIGFuIGVycm9yCi0gICAgICAgIG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGUgZW52ID0gKG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGUpIG0uZ2V0QXNPTUVsZW1lbnQoKTsKLSAgICAgICAgUU5hbWUgcU5hbWUgPSBuZXcgUU5hbWUoInVyaTovL2Zha2UiLCAiZmFrZSIpOwotICAgICAgICBlbnYuZ2V0Qm9keSgpLmdldEZpcnN0Q2hpbGRXaXRoTmFtZShxTmFtZSk7Ci0gICAgfQotCi0gICAgU0FBSkNvbnZlcnRlciBjb252ZXJ0ZXIgPSBudWxsOwotCi0gICAgcHJpdmF0ZSBTQUFKQ29udmVydGVyIGdldFNBQUpDb252ZXJ0ZXIoKSB7Ci0gICAgICAgIGlmIChjb252ZXJ0ZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgU0FBSkNvbnZlcnRlckZhY3RvcnkgZmFjdG9yeSA9Ci0gICAgICAgICAgICAgICAgICAgIChTQUFKQ29udmVydGVyRmFjdG9yeSkgRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoU0FBSkNvbnZlcnRlckZhY3RvcnkuY2xhc3MpOwotICAgICAgICAgICAgY29udmVydGVyID0gZmFjdG9yeS5nZXRTQUFKQ29udmVydGVyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNvbnZlcnRlcjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9TQUFKQ29udmVydGVyVGVzdHMuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL1NBQUpDb252ZXJ0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZGU1YWZiLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL1NBQUpDb252ZXJ0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuaW1wbC5idWlsZGVyLlN0QVhTT0FQTW9kZWxCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5mYWN0b3J5LlNBQUpDb252ZXJ0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS51dGlsLlNBQUpDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5yZWdpc3RyeS5GYWN0b3J5UmVnaXN0cnk7Ci0KLWltcG9ydCBqYXZheC54bWwuc29hcC5NZXNzYWdlRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQQm9keTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQQm9keUVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEVudmVsb3BlOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBNZXNzYWdlOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MSW5wdXRGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOwotCi0vKioKLSAqIFNBQUpDb252ZXJ0ZXJUZXN0cwotICogCi0gKiBUZXN0IHRoZSBiYXNpYyBmdW5jdGlvbmFsaXR5IG9mIHRoZSBTQUFKQ29udmVydGVyLgotICogWW91IGNhbiBhbHNvIHVzZSB0aGVzZSB0ZXN0cyB0byBhcyBzYW1wbGUgY29kZSBvbiBob3cgdG8gdXNlCi0gKiB0aGUgY29udmVydGVyLgotICoKLSAqLwotcHVibGljIGNsYXNzIFNBQUpDb252ZXJ0ZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBzYW1wbGVUZXh0ID0KLQkJIjxwcmU6YSB4bWxuczpwcmU9XCJ1cm46Ly9zYW1wbGVcIj4iICsKLQkJIjxiPkhlbGxvPC9iPiIgKwotCQkiPGM+V29ybGQ8L2M+IiArCi0JCSI8L3ByZTphPiI7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHNhbXBsZUVudmVsb3BlID0gCi0JCSI8c29hcGVudjpFbnZlbG9wZSB4bWxuczpzb2FwZW52PVwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS9cIj4iICsKLQkJIjxzb2FwZW52OkhlYWRlciAvPjxzb2FwZW52OkJvZHk+IiArCi0JCXNhbXBsZVRleHQgKwotCQkiPC9zb2FwZW52OkJvZHk+PC9zb2FwZW52OkVudmVsb3BlPiI7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgWE1MSW5wdXRGYWN0b3J5IGlucHV0RmFjdG9yeSA9IFhNTElucHV0RmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCQotCXB1YmxpYyBTQUFKQ29udmVydGVyVGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFNBQUpDb252ZXJ0ZXJUZXN0cyhTdHJpbmcgYXJnMCkgewotCQlzdXBlcihhcmcwKTsKLQl9Ci0KLQkvKioKLQkgKiBAdGVzdFN0cmF0ZWd5IFRlc3RzIGNvbnZlcnNpb25zIGJldHdlZW4gU0FBSiBhbmQgT00gU09BUEVudmVsb3BlcwotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQotCQkvLyBCb290c3RyYXA6IENyZWF0ZSBhbiBPTSBTT0FQRW52ZWxvcGUgZnJvbSB0aGUgc2FtcGxlIHRleHQKLQkJU3RyaW5nUmVhZGVyIHNyID0gbmV3IFN0cmluZ1JlYWRlcihzYW1wbGVFbnZlbG9wZSk7Ci0JCVhNTFN0cmVhbVJlYWRlciBpbmZsb3cgPSBpbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKHNyKTsKLQkJU3RBWFNPQVBNb2RlbEJ1aWxkZXIgYnVpbGRlciA9IG5ldyBTdEFYU09BUE1vZGVsQnVpbGRlcihpbmZsb3csIG51bGwpOwotCQlvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlIG9tRW52ZWxvcGUgPSBidWlsZGVyLmdldFNPQVBFbnZlbG9wZSgpOwotCQkKLQkJLy8gU3RlcCAxOiBHZXQgdGhlIFNBQUpDb252ZXJ0ZXIgb2JqZWN0IGZyb20gdGhlIEZhY3RvcnkKLQkJU0FBSkNvbnZlcnRlckZhY3RvcnkgZiA9IChTQUFKQ29udmVydGVyRmFjdG9yeSkgCi0JCQlGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShTQUFKQ29udmVydGVyRmFjdG9yeS5jbGFzcyk7Ci0JCVNBQUpDb252ZXJ0ZXIgY29udmVydGVyID0gZi5nZXRTQUFKQ29udmVydGVyKCk7Ci0JCQotCQkvLyBTdGVwIDI6IENvbnZlcnQgdGhlIE9NIFNPQVBFbnZlbG9wZSB0byBhbiBTQUFKIFNPQVBFbnZlbG9wZQotCQlTT0FQRW52ZWxvcGUgc2FhakVudmVsb3BlID0gY29udmVydGVyLnRvU0FBSihvbUVudmVsb3BlKTsKLQkJCi0JCS8vIFN0ZXAgMmE6IFNpbXBsZSBhc3NlcnRpb24gY2hlY2sgdG8gZW5zdXJlIGNvcnJlY3RuZXNzLgotCQlTdHJpbmcgbmFtZSA9IHNhYWpFbnZlbG9wZS5nZXRCb2R5KCkuZ2V0Rmlyc3RDaGlsZCgpLmdldExvY2FsTmFtZSgpOwotCQlhc3NlcnRUcnVlKCJhIi5lcXVhbHMobmFtZSkpOwotCQkKLQkJLy8gU3RlcCAzOiBDb252ZXJ0IHRoZSBTQUFKIFNPQVBFbnZlbG9wZSB0byBhbiBPTSBTT0FQRW52ZWxvcGUKLQkJb21FbnZlbG9wZSA9IGNvbnZlcnRlci50b09NKHNhYWpFbnZlbG9wZSk7Ci0JCQotCQkvLyBTdGVwIDNhOiBTaW1wbGUgYXNzZXJ0aW9uIGNoZWNrIHRvIGVuc3VyZSBjb3JyZWN0bmVzcwotCQluYW1lID0gb21FbnZlbG9wZS5nZXRCb2R5KCkuZ2V0Rmlyc3RFbGVtZW50KCkuZ2V0TG9jYWxOYW1lKCk7Ci0JCWFzc2VydFRydWUoImEiLmVxdWFscyhuYW1lKSk7Ci0JCQotCQkvLyBTdGVwIDQ6IFJpbnNlIGFuZCByZXBlYXQKLQkJc2FhakVudmVsb3BlID0gY29udmVydGVyLnRvU0FBSihvbUVudmVsb3BlKTsKLQkJbmFtZSA9IHNhYWpFbnZlbG9wZS5nZXRCb2R5KCkuZ2V0Rmlyc3RDaGlsZCgpLmdldExvY2FsTmFtZSgpOwotCQlhc3NlcnRUcnVlKCJhIi5lcXVhbHMobmFtZSkpOwotCQlvbUVudmVsb3BlID0gY29udmVydGVyLnRvT00oc2FhakVudmVsb3BlKTsKLQkJbmFtZSA9IG9tRW52ZWxvcGUuZ2V0Qm9keSgpLmdldEZpcnN0RWxlbWVudCgpLmdldExvY2FsTmFtZSgpOwotCQlhc3NlcnRUcnVlKCJhIi5lcXVhbHMobmFtZSkpOwotCX0KLQkKLQkvKioKLQkgKiBAdGVzdFN0cmF0ZWd5IFRlc3RzIGNvbnZlcnNpb25zIGJldHdlZW4gU0FBSiBhbmQgT00gZm9yIG5vcm1hbCBlbGVtZW50Ci0JICovCi0JcHVibGljIHZvaWQgdGVzdDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCi0JCS8vIEJvb3RzdHJhcDogQ3JlYXRlIGFuIE9NIFNPQVBFbnZlbG9wZSBmcm9tIHRoZSBzYW1wbGUgdGV4dC4KLQkJU3RyaW5nUmVhZGVyIHNyID0gbmV3IFN0cmluZ1JlYWRlcihzYW1wbGVFbnZlbG9wZSk7Ci0JCVhNTFN0cmVhbVJlYWRlciBpbmZsb3cgPSBpbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKHNyKTsKLQkJU3RBWFNPQVBNb2RlbEJ1aWxkZXIgYnVpbGRlciA9IG5ldyBTdEFYU09BUE1vZGVsQnVpbGRlcihpbmZsb3csIG51bGwpOwotCQlvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlIG9tRW52ZWxvcGUgPSBidWlsZGVyLmdldFNPQVBFbnZlbG9wZSgpOwotCQkKLQkJLy8gQm9vdHN0cmFwOiBHZXQgYW4gT01FbGVtZW50IGZyb20gdGhlIGJvZHkKLQkJT01FbGVtZW50IG9tID0gb21FbnZlbG9wZS5nZXRCb2R5KCkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQotCQkvLyBCb290c3RyYXA6IEdldCBhbiBTQUFKIEJvZHkgdG8gaG9sZCB0aGUgdGFyZ2V0IFNPQVBFbGVtZW50Ci0JCU1lc3NhZ2VGYWN0b3J5IG1zZ0ZhY3RvcnkgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCQlTT0FQTWVzc2FnZSBtZXNzYWdlID0gbXNnRmFjdG9yeS5jcmVhdGVNZXNzYWdlKCk7Ci0JCVNPQVBCb2R5IGJvZHkgPSBtZXNzYWdlLmdldFNPQVBCb2R5KCk7Ci0JCQotCQkvLyBTdGVwIDE6IEdldCB0aGUgU0FBSkNvbnZlcnRlciBvYmplY3QgZnJvbSB0aGUgRmFjdG9yeQotCQlTQUFKQ29udmVydGVyRmFjdG9yeSBmID0gKFNBQUpDb252ZXJ0ZXJGYWN0b3J5KSAKLQkJCUZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KFNBQUpDb252ZXJ0ZXJGYWN0b3J5LmNsYXNzKTsKLQkJU0FBSkNvbnZlcnRlciBjb252ZXJ0ZXIgPSBmLmdldFNBQUpDb252ZXJ0ZXIoKTsKLQkJCi0JCS8vIFN0ZXAgMjogQ29udmVydCBPTSB0byBTQUFKCi0JCVNPQVBFbGVtZW50IHNlID0gY29udmVydGVyLnRvU0FBSihvbSwgYm9keSk7Ci0JCQotCQkvLyBTdGVwIDJhOiBWZXJpZnkKLQkJYXNzZXJ0VHJ1ZShzZSBpbnN0YW5jZW9mIFNPQVBCb2R5RWxlbWVudCk7Ci0JCWFzc2VydFRydWUoc2UuZ2V0TG9jYWxOYW1lKCkuZXF1YWxzKCJhIikpOwotCQkKLQkJLy8gU3RlcCAzOiBDb252ZXJ0IFNBQUogdG8gT00KLQkJb20gPSBjb252ZXJ0ZXIudG9PTShzZSk7Ci0JCQotCQkvLyBTdGVwIDNhOiBWZXJpZnkKLQkJYXNzZXJ0VHJ1ZShvbS5nZXRMb2NhbE5hbWUoKS5lcXVhbHMoImEiKSk7Ci0JCQotCQkvLyBTdGVwIDQ6IFJpbnNlIGFuZCBSZXBlYXQKLQkJc2UgPSBjb252ZXJ0ZXIudG9TQUFKKG9tLCBib2R5KTsKLQkJYXNzZXJ0VHJ1ZShzZSBpbnN0YW5jZW9mIFNPQVBCb2R5RWxlbWVudCk7Ci0JCWFzc2VydFRydWUoc2UuZ2V0TG9jYWxOYW1lKCkuZXF1YWxzKCJhIikpOwotCQlvbSA9IGNvbnZlcnRlci50b09NKHNlKTsKLQkJYXNzZXJ0VHJ1ZShvbS5nZXRMb2NhbE5hbWUoKS5lcXVhbHMoImEiKSk7Ci0JfQotCQotCS8qKgotCSAqIEB0ZXN0U3RyYXRlZ3k6IENyZWF0ZSBhbiBPTUVsZW1lbnQsIHdpdGhvdXQgdXNpbmcgYSBidWlsZGVyLiAgVmVyaWZpY2F0aW9uIG9mIEFYSVMyLTk3MAotCSAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3QzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgCQotLy8gICAgCSBTdGVwIDE6IEdldCB0aGUgU0FBSkNvbnZlcnRlciBvYmplY3QgZnJvbSB0aGUgRmFjdG9yeQotCQlTQUFKQ29udmVydGVyRmFjdG9yeSBmID0gKFNBQUpDb252ZXJ0ZXJGYWN0b3J5KSAKLQkJCUZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KFNBQUpDb252ZXJ0ZXJGYWN0b3J5LmNsYXNzKTsKLQkJU0FBSkNvbnZlcnRlciBjb252ZXJ0ZXIgPSBmLmdldFNBQUpDb252ZXJ0ZXIoKTsKLQkJCi0JCS8vIFN0ZXB0IDI6IENyZWF0ZSBPTSBhbmQgcGFyZW50IFNPQVBFbGVtZW50Ci0gICAgICAgIE9NRmFjdG9yeSBmYWMgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKTsKLSAgICAgICAgT01OYW1lc3BhY2Ugd3JhcE5zID0gZmFjLmNyZWF0ZU9NTmFtZXNwYWNlKCJuYW1lc3BhY2UiLCAicHJlZml4Iik7Ci0gICAgICAgIE9NRWxlbWVudCBvbWUgPSBmYWMuY3JlYXRlT01FbGVtZW50KCJsb2NhbG5hbWUiLCB3cmFwTnMpOwotICAgICAgICBTT0FQRmFjdG9yeSBzZiA9IFNPQVBGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIFNPQVBFbGVtZW50IHNlID0gc2YuY3JlYXRlRWxlbWVudCgibmFtZSIpOwotICAgICAgICAKLSAgICAgICAgLy8gU3RlcCAzOiBEbyB0aGUgY29udmVyc2lvbgotICAgICAgICBjb252ZXJ0ZXIudG9TQUFKKG9tZSwgc2UsIHNmKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9TT0FQMTJUZXN0cy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvU09BUDEyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI4NjUyMC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9TT0FQMTJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZTsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5hbWVzcGFjZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLmltcGwuYnVpbGRlci5TdEFYU09BUE1vZGVsQnVpbGRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmZhY3RvcnkuTWVzc2FnZUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5mYWN0b3J5LlhNTFN0cmluZ0Jsb2NrRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLnV0aWwuUmVhZGVyMldyaXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5yZWdpc3RyeS5GYWN0b3J5UmVnaXN0cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MudW5pdFRlc3QuVGVzdExvZ2dlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5CYXNpY0NvbmZpZ3VyYXRvcjsNCi0NCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxJbnB1dEZhY3Rvcnk7DQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOw0KLWltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsNCi0NCi0vKioNCi0gKiBUaGlzIHN1aXRlIGlzIHVzZWQgdG8gdGVzdCB0aGUgY3JlYXRpb24gb2YgbWVzc2FnZXMgYmFzZWQgb24gU09BUCAxLjINCi0gKiB3aXRoIGJvdGggaW5ib3VuZCBhbmQgb3V0Ym91bmQgc2ltdWxhdGlvbnMuIA0KLSAqDQotICovDQotcHVibGljIGNsYXNzIFNPQVAxMlRlc3RzIGV4dGVuZHMgVGVzdENhc2Ugew0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgc2FtcGxlVGV4dCA9IA0KLSAgICAgICAgIjxlY2hvPnRlc3Qgc3RyaW5nPC9lY2hvPiI7DQotICAgIA0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgc2FtcGxlU29hcDEyRW52ZWxvcGVIZWFkID0NCi0gICAgICAgICI8c29hcGVudjpFbnZlbG9wZSB4bWxuczpzb2FwZW52PVwiaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlXCI+IiArDQotICAgICAgICAiPHNvYXBlbnY6SGVhZGVyIC8+PHNvYXBlbnY6Qm9keT4iOw0KLSAgICANCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHNhbXBsZUVudmVsb3BlVGFpbCA9DQotICAgICAgICAiPC9zb2FwZW52OkJvZHk+PC9zb2FwZW52OkVudmVsb3BlPiI7ICAgIA0KLSAgICANCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHNhbXBsZVNvYXAxMkVudmVsb3BlID0gDQotICAgICAgICBzYW1wbGVTb2FwMTJFbnZlbG9wZUhlYWQgKyANCi0gICAgICAgIHNhbXBsZVRleHQgKyANCi0gICAgICAgIHNhbXBsZUVudmVsb3BlVGFpbDsNCi0gICAgDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTT0FQMTJfTlNfVVJJID0gDQotICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIjsNCi0gICAgDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgWE1MSW5wdXRGYWN0b3J5IGlucHV0RmFjdG9yeSA9IFhNTElucHV0RmFjdG9yeS5uZXdJbnN0YW5jZSgpOw0KLSAgICANCi0gICAgcHVibGljIFNPQVAxMlRlc3RzKFN0cmluZyBuYW1lKSB7DQotICAgICAgICBzdXBlcihuYW1lKTsNCi0gICAgfQ0KLSAgICANCi0gICAgc3RhdGljIHsNCi0gICAgICAgIEJhc2ljQ29uZmlndXJhdG9yLmNvbmZpZ3VyZSgpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBTaW11bGF0ZSBjcmVhdGluZyBhIFNPQVAgMS4yIG1lc3NhZ2Ugd2hlbiB0aGUgYnVzaW5lc3Mgb2JqZWN0DQotICAgICAqIHByb3ZpZGVkIGlzIGp1c3QgdGhlIHBheWxvYWQuIA0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZVNvYXAxMkZyb21QYXlsb2FkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICAvLyBDcmVhdGUgYSBTT0FQIDEuMiBNZXNzYWdlDQotICAgICAgICBNZXNzYWdlRmFjdG9yeSBtZiA9IChNZXNzYWdlRmFjdG9yeSkNCi0gICAgICAgICAgICBGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShNZXNzYWdlRmFjdG9yeS5jbGFzcyk7DQotICAgICAgICBNZXNzYWdlIG0gPSBtZi5jcmVhdGUoUHJvdG9jb2wuc29hcDEyKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gR2V0IHRoZSBCbG9ja0ZhY3RvcnkNCi0gICAgICAgIFhNTFN0cmluZ0Jsb2NrRmFjdG9yeSBmID0gKFhNTFN0cmluZ0Jsb2NrRmFjdG9yeSkNCi0gICAgICAgICAgICBGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShYTUxTdHJpbmdCbG9ja0ZhY3RvcnkuY2xhc3MpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBDcmVhdGUgYSBCbG9jayB1c2luZyB0aGUgc2FtcGxlIHN0cmluZyBhcyB0aGUgY29udGVudC4gIFRoaXMgc2ltdWxhdGVzDQotICAgICAgICAvLyB3aGF0IG9jY3VycyBvbiB0aGUgb3V0Ym91bmQgSkFYLVdTIGRpc3BhdGNoPFN0cmluZz4gY2xpZW50DQotICAgICAgICBCbG9jayBibG9jayA9IGYuY3JlYXRlRnJvbShzYW1wbGVUZXh0LCBudWxsLCBudWxsKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQWRkIHRoZSBibG9jayB0byB0aGUgbWVzc2FnZSBhcyBub3JtYWwgYm9keSBjb250ZW50Lg0KLSAgICAgICAgbS5zZXRCb2R5QmxvY2soYmxvY2spOw0KLSAgICAgICAgDQotICAgICAgICAvLyBBc3N1bWluZyBubyBoYW5kbGVycyBhcmUgaW5zdGFsbGVkLCB0aGUgbmV4dCB0aGluZyB0aGF0IHdpbGwgaGFwcGVuDQotICAgICAgICAvLyBpcyBhIFhNTFN0cmVhbVJlYWRlciB3aWxsIGJlIHJlcXVlc3RlZC4uLnRvIGdvIHRvIE9NLiAgIEF0IHRoaXMgcG9pbnQgdGhlDQotICAgICAgICAvLyBibG9jayBzaG91bGQgYmUgY29uc3VtZWQuDQotICAgICAgICBPTUVsZW1lbnQgb20gPSBtLmdldEFzT01FbGVtZW50KCk7DQotICAgICAgICANCi0gICAgICAgIC8vIFRoZSBibG9jayBzaG91bGQgbm90IGJlIGNvbnN1bWVkIHlldC4uLmJlY2F1c2UgdGhlIG1lc3NhZ2UgaGFzIG5vdCBiZWVuIHJlYWQNCi0gICAgICAgIGFzc2VydFRydWUoIWJsb2NrLmlzQ29uc3VtZWQoKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIFRvIGNoZWNrIHRoYXQgdGhlIG91dHB1dCBpcyBjb3JyZWN0LCBnZXQgdGhlIFN0cmluZyBjb250ZW50cyBvZiB0aGUgDQotICAgICAgICAvLyByZWFkZXINCi0gICAgICAgIFJlYWRlcjJXcml0ZXIgcjJ3ID0gbmV3IFJlYWRlcjJXcml0ZXIob20uZ2V0WE1MU3RyZWFtUmVhZGVyKCkpOw0KLSAgICAgICAgU3RyaW5nIG5ld1RleHQgPSByMncuZ2V0QXNTdHJpbmcoKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKG5ld1RleHQpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShuZXdUZXh0LmNvbnRhaW5zKHNhbXBsZVRleHQpKTsNCi0gICAgICAgIGFzc2VydFRydWUobmV3VGV4dC5jb250YWlucygic29hcCIpKTsNCi0gICAgICAgIGFzc2VydFRydWUobmV3VGV4dC5jb250YWlucygiRW52ZWxvcGUiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKG5ld1RleHQuY29udGFpbnMoIkJvZHkiKSk7DQotICAgICAgICANCi0gICAgICAgIGFzc2VydFRydWUobS5nZXRQcm90b2NvbCgpLmVxdWFscyhQcm90b2NvbC5zb2FwMTIpKTsNCi0gICAgICAgIA0KLSAgICAgICAgU09BUEVudmVsb3BlIG9tU29hcEVudiA9IChTT0FQRW52ZWxvcGUpIG0uZ2V0QXNPTUVsZW1lbnQoKTsNCi0gICAgICAgIE9NTmFtZXNwYWNlIG5zID0gb21Tb2FwRW52LmdldE5hbWVzcGFjZSgpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShucy5nZXROYW1lc3BhY2VVUkkoKS5lcXVhbHMoU09BUDEyX05TX1VSSSkpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBUaGUgYmxvY2sgc2hvdWxkIGJlIGNvbnN1bWVkIGF0IHRoaXMgcG9pbnQNCi0gICAgICAgIGFzc2VydFRydWUoYmxvY2suaXNDb25zdW1lZCgpKTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFNpbXVsYXRlIGNyZWF0aW5nIGEgU09BUCAxLjIgbWVzc2FnZSB3aGVuIHRoZSBidXNpbmVzcyBvYmplY3QNCi0gICAgICogcHJvdmlkZWQgaXMgdGhlIGZ1bGwgbWVzc2FnZS4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVTb2FwMTJGcm9tTWVzc2FnZSgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgLy8gQ3JlYXRlIGEgU09BUCAxLjIgTWVzc2FnZQ0KLSAgICAgICAgTWVzc2FnZUZhY3RvcnkgbWYgPSAoTWVzc2FnZUZhY3RvcnkpDQotICAgICAgICAgICAgRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoTWVzc2FnZUZhY3RvcnkuY2xhc3MpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBHZXQgdGhlIEJsb2NrRmFjdG9yeQ0KLSAgICAgICAgWE1MU3RyaW5nQmxvY2tGYWN0b3J5IGYgPSAoWE1MU3RyaW5nQmxvY2tGYWN0b3J5KQ0KLSAgICAgICAgICAgIEZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KFhNTFN0cmluZ0Jsb2NrRmFjdG9yeS5jbGFzcyk7DQotICAgICAgICANCi0gICAgICAgIC8vIENyZWF0ZSBhIEJsb2NrIHVzaW5nIHRoZSBzYW1wbGUgc3RyaW5nIGFzIHRoZSBjb250ZW50LiAgVGhpcyBzaW11bGF0ZXMNCi0gICAgICAgIC8vIHdoYXQgb2NjdXJzIG9uIHRoZSBvdXRib3VuZCBKQVgtV1MgZGlzcGF0Y2g8U3RyaW5nPiBjbGllbnQNCi0gICAgICAgIEJsb2NrIGJsb2NrID0gZi5jcmVhdGVGcm9tKHNhbXBsZVNvYXAxMkVudmVsb3BlLCBudWxsLCBudWxsKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQ3JlYXRlIGEgTWVzc2FnZSB3aXRoIHRoZSBmdWxsIFhNTCBjb250ZW50cyB0aGF0IHdlIGhhdmUNCi0gICAgICAgIE1lc3NhZ2UgbSA9IG1mLmNyZWF0ZUZyb20oYmxvY2suZ2V0WE1MU3RyZWFtUmVhZGVyKHRydWUpLCBudWxsKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQXNzdW1pbmcgbm8gaGFuZGxlcnMgYXJlIGluc3RhbGxlZCwgdGhlIG5leHQgdGhpbmcgdGhhdCB3aWxsIGhhcHBlbg0KLSAgICAgICAgLy8gaXMgYSBYTUxTdHJlYW1SZWFkZXIgd2lsbCBiZSByZXF1ZXN0ZWQuLi50byBnbyB0byBPTS4gICBBdCB0aGlzIHBvaW50IHRoZQ0KLSAgICAgICAgLy8gYmxvY2sgc2hvdWxkIGJlIGNvbnN1bWVkLg0KLSAgICAgICAgT01FbGVtZW50IG9tID0gbS5nZXRBc09NRWxlbWVudCgpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBUbyBjaGVjayB0aGF0IHRoZSBvdXRwdXQgaXMgY29ycmVjdCwgZ2V0IHRoZSBTdHJpbmcgY29udGVudHMgb2YgdGhlIA0KLSAgICAgICAgLy8gcmVhZGVyDQotICAgICAgICBSZWFkZXIyV3JpdGVyIHIydyA9IG5ldyBSZWFkZXIyV3JpdGVyKG9tLmdldFhNTFN0cmVhbVJlYWRlcldpdGhvdXRDYWNoaW5nKCkpOw0KLSAgICAgICAgU3RyaW5nIG5ld1RleHQgPSByMncuZ2V0QXNTdHJpbmcoKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKG5ld1RleHQpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShuZXdUZXh0LmNvbnRhaW5zKHNhbXBsZVRleHQpKTsNCi0gICAgICAgIGFzc2VydFRydWUobmV3VGV4dC5jb250YWlucygic29hcCIpKTsNCi0gICAgICAgIGFzc2VydFRydWUobmV3VGV4dC5jb250YWlucygiRW52ZWxvcGUiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKG5ld1RleHQuY29udGFpbnMoIkJvZHkiKSk7DQotICAgICAgICANCi0gICAgICAgIGFzc2VydFRydWUobS5nZXRQcm90b2NvbCgpLmVxdWFscyhQcm90b2NvbC5zb2FwMTIpKTsNCi0gICAgICAgIA0KLSAgICAgICAgU09BUEVudmVsb3BlIG9tU29hcEVudiA9IChTT0FQRW52ZWxvcGUpIG0uZ2V0QXNPTUVsZW1lbnQoKTsNCi0gICAgICAgIE9NTmFtZXNwYWNlIG5zID0gb21Tb2FwRW52LmdldE5hbWVzcGFjZSgpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShucy5nZXROYW1lc3BhY2VVUkkoKS5lcXVhbHMoU09BUDEyX05TX1VSSSkpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBUaGUgYmxvY2sgc2hvdWxkIGJlIGNvbnN1bWVkIGF0IHRoaXMgcG9pbnQNCi0gICAgICAgIGFzc2VydFRydWUoYmxvY2suaXNDb25zdW1lZCgpKTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIHZvaWQgdGVzdEdldFBheWxvYWRGcm9tU29hcDEyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICAvLyBPbiBpbmJvdW5kLCB0aGVyZSB3aWxsIGFscmVhZHkgYmUgYW4gT00NCi0gICAgICAgIC8vIHdoaWNoIHJlcHJlc2VudHMgdGhlIG1lc3NhZ2UuICBUaGUgZm9sbG93aW5nIGNvZGUgc2ltdWxhdGVzIHRoZSBpbnB1dA0KLSAgICAgICAgLy8gT00NCi0gICAgICAgIFN0cmluZ1JlYWRlciBzciA9IG5ldyBTdHJpbmdSZWFkZXIoc2FtcGxlU29hcDEyRW52ZWxvcGUpOw0KLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIGluZmxvdyA9IGlucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoc3IpOw0KLSAgICAgICAgU3RBWFNPQVBNb2RlbEJ1aWxkZXIgYnVpbGRlciA9IG5ldyBTdEFYU09BUE1vZGVsQnVpbGRlcihpbmZsb3csIG51bGwpOw0KLSAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IGJ1aWxkZXIuZ2V0U09BUEVudmVsb3BlKCk7DQotICAgICAgICANCi0gICAgICAgIC8vIFRoZSBKQVgtV1MgbGF5ZXIgY3JlYXRlcyBhIE1lc3NhZ2UgZnJvbSB0aGUgT00NCi0gICAgICAgIE1lc3NhZ2VGYWN0b3J5IG1mID0gKE1lc3NhZ2VGYWN0b3J5KQ0KLSAgICAgICAgICAgIEZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KE1lc3NhZ2VGYWN0b3J5LmNsYXNzKTsNCi0gICAgICAgIE1lc3NhZ2UgbSA9IG1mLmNyZWF0ZUZyb20ob21FbGVtZW50LCBudWxsKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSByaWdodCBQcm90b2NvbCB3YXMgc2V0IG9uIHRoZSBNZXNzYWdlDQotICAgICAgICBhc3NlcnRUcnVlKG0uZ2V0UHJvdG9jb2woKS5lcXVhbHMoUHJvdG9jb2wuc29hcDEyKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIENoZWNrIHRoZSBTT0FQRW52ZWxvcGUgdG8gbWFrZSBzdXJlIHdlJ3ZlIGdvdCB0aGUgcmlnaHQNCi0gICAgICAgIC8vIHByb3RvY29sIG5hbWVzcGFjZSB0aGVyZSBhcyB3ZWxsLg0KLSAgICAgICAgU09BUEVudmVsb3BlIHNvYXBFbnYgPSAoU09BUEVudmVsb3BlKSBtLmdldEFzT01FbGVtZW50KCk7DQotICAgICAgICBPTU5hbWVzcGFjZSBucyA9IHNvYXBFbnYuZ2V0TmFtZXNwYWNlKCk7DQotICAgICAgICBhc3NlcnRUcnVlKG5zLmdldE5hbWVzcGFjZVVSSSgpLmVxdWFscyhTT0FQMTJfTlNfVVJJKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIEFzc3VtaW5nIG5vIGhhbmRsZXJzIGFyZSBpbnN0YWxsZWQsIHRoZSBuZXh0IHRoaW5nIHRoYXQgd2lsbCBoYXBwZW4NCi0gICAgICAgIC8vIGlzIHRoZSBwcm94eSBjb2RlIHdpbGwgYXNrIGZvciB0aGUgYnVzaW5lc3Mgb2JqZWN0IChTdHJpbmcpLg0KLSAgICAgICAgWE1MU3RyaW5nQmxvY2tGYWN0b3J5IGJsb2NrRmFjdG9yeSA9IA0KLSAgICAgICAgICAgIChYTUxTdHJpbmdCbG9ja0ZhY3RvcnkpIEZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KFhNTFN0cmluZ0Jsb2NrRmFjdG9yeS5jbGFzcyk7DQotICAgICAgICBCbG9jayBibG9jayA9IG0uZ2V0Qm9keUJsb2NrKG51bGwsIGJsb2NrRmFjdG9yeSk7DQotICAgICAgICBPYmplY3QgYm8gPSBibG9jay5nZXRCdXNpbmVzc09iamVjdCh0cnVlKTsNCi0gICAgICAgIGFzc2VydFRydWUoYm8gaW5zdGFuY2VvZiBTdHJpbmcpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBUaGUgYmxvY2sgc2hvdWxkIGJlIGNvbnN1bWVkDQotICAgICAgICBhc3NlcnRUcnVlKGJsb2NrLmlzQ29uc3VtZWQoKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIENoZWNrIHRoZSBTdHJpbmcgZm9yIGFjY3VyYWN5DQotICAgICAgICBhc3NlcnRUcnVlKHNhbXBsZVRleHQuZXF1YWxzKGJvKSk7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRNZXNzYWdlRnJvbVNvYXAxMigpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgLy8gT24gaW5ib3VuZCwgdGhlcmUgd2lsbCBhbHJlYWR5IGJlIGFuIE9NDQotICAgICAgICAvLyB3aGljaCByZXByZXNlbnRzIHRoZSBtZXNzYWdlLiAgVGhlIGZvbGxvd2luZyBjb2RlIHNpbXVsYXRlcyB0aGUgaW5wdXQNCi0gICAgICAgIC8vIE9NDQotICAgICAgICBTdHJpbmdSZWFkZXIgc3IgPSBuZXcgU3RyaW5nUmVhZGVyKHNhbXBsZVNvYXAxMkVudmVsb3BlKTsNCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlciBpbmZsb3cgPSBpbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKHNyKTsNCi0gICAgICAgIFN0QVhTT0FQTW9kZWxCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RBWFNPQVBNb2RlbEJ1aWxkZXIoaW5mbG93LCBudWxsKTsNCi0gICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSBidWlsZGVyLmdldFNPQVBFbnZlbG9wZSgpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBUaGUgSkFYLVdTIGxheWVyIGNyZWF0ZXMgYSBNZXNzYWdlIGZyb20gdGhlIE9NDQotICAgICAgICBNZXNzYWdlRmFjdG9yeSBtZiA9IChNZXNzYWdlRmFjdG9yeSkNCi0gICAgICAgICAgICBGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShNZXNzYWdlRmFjdG9yeS5jbGFzcyk7DQotICAgICAgICBNZXNzYWdlIG0gPSBtZi5jcmVhdGVGcm9tKG9tRWxlbWVudCwgbnVsbCk7DQotICAgICAgICANCi0gICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgcmlnaHQgUHJvdG9jb2wgd2FzIHNldCBvbiB0aGUgTWVzc2FnZQ0KLSAgICAgICAgYXNzZXJ0VHJ1ZShtLmdldFByb3RvY29sKCkuZXF1YWxzKFByb3RvY29sLnNvYXAxMikpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBDaGVjayB0aGUgU09BUEVudmVsb3BlIHRvIG1ha2Ugc3VyZSB3ZSd2ZSBnb3QgdGhlIHJpZ2h0DQotICAgICAgICAvLyBwcm90b2NvbCBuYW1lc3BhY2UgdGhlcmUgYXMgd2VsbC4NCi0gICAgICAgIFNPQVBFbnZlbG9wZSBzb2FwRW52ID0gKFNPQVBFbnZlbG9wZSkgbS5nZXRBc09NRWxlbWVudCgpOw0KLSAgICAgICAgT01OYW1lc3BhY2UgbnMgPSBzb2FwRW52LmdldE5hbWVzcGFjZSgpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShucy5nZXROYW1lc3BhY2VVUkkoKS5lcXVhbHMoU09BUDEyX05TX1VSSSkpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBBc3N1bWluZyBubyBoYW5kbGVycyBhcmUgaW5zdGFsbGVkLCB0aGUgbmV4dCB0aGluZyB0aGF0IHdpbGwgaGFwcGVuDQotICAgICAgICAvLyBpcyB0aGUgcHJveHkgY29kZSB3aWxsIGFzayBmb3IgdGhlIGJ1c2luZXNzIG9iamVjdCAoU3RyaW5nKS4NCi0gICAgICAgIFhNTFN0cmluZ0Jsb2NrRmFjdG9yeSBibG9ja0ZhY3RvcnkgPSANCi0gICAgICAgICAgICAoWE1MU3RyaW5nQmxvY2tGYWN0b3J5KSBGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShYTUxTdHJpbmdCbG9ja0ZhY3RvcnkuY2xhc3MpOw0KLSAgICAgICAgQmxvY2sgYmxvY2sgPSBibG9ja0ZhY3RvcnkuY3JlYXRlRnJvbShtLmdldEFzT01FbGVtZW50KCksIG51bGwsIG51bGwpOw0KLSAgICAgICAgT2JqZWN0IGJvID0gYmxvY2suZ2V0QnVzaW5lc3NPYmplY3QodHJ1ZSk7DQotICAgICAgICBhc3NlcnRUcnVlKGJvIGluc3RhbmNlb2YgU3RyaW5nKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gVGhlIGJsb2NrIHNob3VsZCBiZSBjb25zdW1lZA0KLSAgICAgICAgYXNzZXJ0VHJ1ZShibG9jay5pc0NvbnN1bWVkKCkpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBDaGVjayB0aGUgU3RyaW5nIGZvciBhY2N1cmFjeQ0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgoKFN0cmluZylibykuY29udGFpbnMoIjxzb2FwZW52OkJvZHk+PGVjaG8+dGVzdCBzdHJpbmc8L2VjaG8+PC9zb2FwZW52OkJvZHk+IikpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2RhdGFiaW5kaW5nL0pBWEJVdGlsc1Rlc3RzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9kYXRhYmluZGluZy9KQVhCVXRpbHNUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjNjOGZjLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2RhdGFiaW5kaW5nL0pBWEJVdGlsc1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZGF0YWJpbmRpbmc7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5kYXRhYmluZGluZy5KQVhCVXRpbHMuQ09OU1RSVUNUSU9OX1RZUEU7DQotaW1wb3J0IG9yZy5hcGFjaGUud3MuamF4Yi5hLkJhZERhdGExOw0KLWltcG9ydCBvcmcuYXBhY2hlLndzLmpheGIuYS5CYWREYXRhMjsNCi1pbXBvcnQgb3JnLmFwYWNoZS53cy5qYXhiLmEuRGF0YTE7DQotaW1wb3J0IG9yZy5hcGFjaGUud3MuamF4Yi5hLkRhdGEyOw0KLWltcG9ydCBvcmcuYXBhY2hlLndzLmpheGIuYS5EYXRhMzsNCi1pbXBvcnQgb3JnLmFwYWNoZS53cy5qYXhiLmIuQmFkRGF0YTM7DQotDQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJDb250ZXh0Ow0KLWltcG9ydCBqYXZheC54bWwud3MuSG9sZGVyOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOw0KLQ0KLS8qKg0KLSAqIFRlc3QgSkFYQlV0aWxzIGZ1bmN0aW9uYWxpdHkNCi0gKi8NCi1wdWJsaWMgY2xhc3MgSkFYQlV0aWxzVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7DQotICAgIA0KLSAgICAvKioNCi0gICAgICogV2UgaGF2ZSBlbmNvdW50ZXJlZCBzaXR1YXRpb25zIHdoZXJlIHVzZXJzIGhhdmUgaW50ZXJtaW5nbGVkDQotICAgICAqIEpBWEIgYW5kIG5vbi1KQVhCIGNsYXNzZXMgaW4gdGhlIHNhbWUgcGFja2FnZS4gIFRoaXMgcHJhY3RpY2UgaXMNCi0gICAgICogc3Ryb25nbHkgZGlzY291cmFnZWQ7IGhvd2V2ZXIgaXQgY2FuIGhhcHBlbi4gIA0KLSAgICAgKiBUaGUgSkFYQlV0aWxzIGNvZGUgKGFjdHVhbGx5IEpBWEJDb250ZXh0RnJvbUNsYXNzZXMpIGNvbnRhaW5zIA0KLSAgICAgKiBhbiBhbGdvcml0aG0gdG8gdHJ5IGFuZCBmaW5kIHRoZSBtaW5pbWFsIHNldCBvZiB2YWxpZCBjbGFzc2VzIA0KLSAgICAgKiBpbiB0aGVzZSBjYXNlcy4gIA0KLSAgICAgKiANCi0gICAgICogVGhpcyB0ZXN0IHZhbGlkYXRlcyB0aGUgY29kZS4gIFNldmVyYWwgZ29vZCBKQVhCIGNsYXNzZXMNCi0gICAgICogKGFsbCBuYW1lZCBEYXRhKikgYXJlIGludGVybWluZ2xlZCBpbiBwYWNrYWVzIHdpdGggbm9uLUpBWEIgY2xhc3Nlcw0KLSAgICAgKiAoYWxsIG5hbWVkIEJhZERhdGEqKS4gIFRoaXMgdGVzdCBwYXNzZXMgaWYgdGhlIEpBWEJDb250ZXh0IGNvbnRhaW5zDQotICAgICAqIHRoZSBEYXRhIGNsYXNzZXMgYW5kIGV4Y2x1ZGVzIHRoZSBCYWREYXRhIGNsYXNzZXMuDQotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWl4ZWRQYWNrYWdlcygpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgDQotICAgICAgICAvLyBDcmVhdGUgYSBKQVhCQ29udGV4dA0KLSAgICAgICAgVHJlZVNldDxTdHJpbmc+IGNvbnRleHRQYWNrYWdlcyA9IG5ldyBUcmVlU2V0PFN0cmluZz4oKTsNCi0gICAgICAgIGNvbnRleHRQYWNrYWdlcy5hZGQoIm9yZy5hcGFjaGUud3MuamF4Yi5hIik7DQotICAgICAgICBjb250ZXh0UGFja2FnZXMuYWRkKCJvcmcuYXBhY2hlLndzLmpheGIuYiIpOw0KLSAgICAgICAgSG9sZGVyPENPTlNUUlVDVElPTl9UWVBFPmNvbnN0cnVjdGlvblR5cGUgPSBuZXcgSG9sZGVyPENPTlNUUlVDVElPTl9UWVBFPigpOw0KLSAgICAgICAgDQotICAgICAgICBKQVhCQ29udGV4dCBqYmMgPSBKQVhCVXRpbHMuZ2V0SkFYQkNvbnRleHQoY29udGV4dFBhY2thZ2VzLCBjb25zdHJ1Y3Rpb25UeXBlLCANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0UGFja2FnZXMudG9TdHJpbmcoKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIFRoZSB0b1N0cmluZyBtZXRob2QgbGlzdHMgYWxsIG9mIHRoZSBjb250YWluZWQgY2xhc3Nlcy4NCi0gICAgICAgIFN0cmluZyBqYmNTdHJpbmcgPSBqYmMudG9TdHJpbmcoKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBnb29kIERhdGEgaXMgaW4gdGhlIEpBWEJDb250ZXh0DQotICAgICAgICBhc3NlcnRUcnVlKGpiY1N0cmluZy5pbmRleE9mKERhdGExLmNsYXNzLmdldE5hbWUoKSkgPiAwKTsNCi0gICAgICAgIGFzc2VydFRydWUoamJjU3RyaW5nLmluZGV4T2YoRGF0YTIuY2xhc3MuZ2V0TmFtZSgpKSA+IDApOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShqYmNTdHJpbmcuaW5kZXhPZihEYXRhMy5jbGFzcy5nZXROYW1lKCkpID4gMCk7DQotICAgICAgICANCi0gICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgYmFkIERhdGEgaXMgbm90IGluIHRoZSBKQVhCQ29udGV4dA0KLSAgICAgICAgYXNzZXJ0VHJ1ZShqYmNTdHJpbmcuaW5kZXhPZihCYWREYXRhMS5jbGFzcy5nZXROYW1lKCkpIDwgMCk7DQotICAgICAgICBhc3NlcnRUcnVlKGpiY1N0cmluZy5pbmRleE9mKEJhZERhdGEyLmNsYXNzLmdldE5hbWUoKSkgPCAwKTsNCi0gICAgICAgIGFzc2VydFRydWUoamJjU3RyaW5nLmluZGV4T2YoQmFkRGF0YTMuY2xhc3MuZ2V0TmFtZSgpKSA8IDApOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2hlYWRlcnMvQ29uZmlnQm9keS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvaGVhZGVycy9Db25maWdCb2R5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3NjlhMTQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvaGVhZGVycy9Db25maWdCb2R5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuaGVhZGVyczsNCi0NCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOw0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZTsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50Ow0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGU7DQotDQotDQotLyoqDQotICogPHA+SmF2YSBjbGFzcyBmb3IgQ29uZmlnQm9keSBjb21wbGV4IHR5cGUuDQotICogDQotICogPHA+VGhlIGZvbGxvd2luZyBzY2hlbWEgZnJhZ21lbnQgc3BlY2lmaWVzIHRoZSBleHBlY3RlZCBjb250ZW50IGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBjbGFzcy4NCi0gKiANCi0gKiA8cHJlPg0KLSAqICZsdDtjb21wbGV4VHlwZSBuYW1lPSJDb25maWdCb2R5Ij4NCi0gKiAgICZsdDtjb21wbGV4Q29udGVudD4NCi0gKiAgICAgJmx0O3Jlc3RyaWN0aW9uIGJhc2U9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1hbnlUeXBlIj4NCi0gKiAgICAgICAmbHQ7c2VxdWVuY2U+DQotICogICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJtZXNzYWdlIiB0eXBlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9c3RyaW5nIi8+DQotICogICAgICAgJmx0Oy9zZXF1ZW5jZT4NCi0gKiAgICAgJmx0Oy9yZXN0cmljdGlvbj4NCi0gKiAgICZsdDsvY29tcGxleENvbnRlbnQ+DQotICogJmx0Oy9jb21wbGV4VHlwZT4NCi0gKiA8L3ByZT4NCi0gKiANCi0gKiANCi0gKi8NCi1AWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpDQotQFhtbFR5cGUobmFtZSA9ICJDb25maWdCb2R5IiwgcHJvcE9yZGVyID0gew0KLSAgICAibWVzc2FnZSINCi19KQ0KLXB1YmxpYyBjbGFzcyBDb25maWdCb2R5IHsNCi0NCi0gICAgQFhtbEVsZW1lbnQocmVxdWlyZWQgPSB0cnVlKQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIG1lc3NhZ2U7DQotDQotICAgIC8qKg0KLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgbWVzc2FnZSBwcm9wZXJ0eS4NCi0gICAgICogDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHBvc3NpYmxlIG9iamVjdCBpcw0KLSAgICAgKiAgICAge0BsaW5rIFN0cmluZyB9DQotICAgICAqICAgICANCi0gICAgICovDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsNCi0gICAgICAgIHJldHVybiBtZXNzYWdlOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgbWVzc2FnZSBwcm9wZXJ0eS4NCi0gICAgICogDQotICAgICAqIEBwYXJhbSB2YWx1ZQ0KLSAgICAgKiAgICAgYWxsb3dlZCBvYmplY3QgaXMNCi0gICAgICogICAgIHtAbGluayBTdHJpbmcgfQ0KLSAgICAgKiAgICAgDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXNzYWdlKFN0cmluZyB2YWx1ZSkgew0KLSAgICAgICAgdGhpcy5tZXNzYWdlID0gdmFsdWU7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvaGVhZGVycy9Db25maWdIZWFkZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2hlYWRlcnMvQ29uZmlnSGVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0OTYwYzMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvaGVhZGVycy9Db25maWdIZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5oZWFkZXJzOw0KLQ0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7DQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOw0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnQ7DQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZTsNCi0NCi0NCi0vKioNCi0gKiA8cD5KYXZhIGNsYXNzIGZvciBDb25maWdIZWFkZXIgY29tcGxleCB0eXBlLg0KLSAqIA0KLSAqIDxwPlRoZSBmb2xsb3dpbmcgc2NoZW1hIGZyYWdtZW50IHNwZWNpZmllcyB0aGUgZXhwZWN0ZWQgY29udGVudCBjb250YWluZWQgd2l0aGluIHRoaXMgY2xhc3MuDQotICogDQotICogPHByZT4NCi0gKiAmbHQ7Y29tcGxleFR5cGUgbmFtZT0iQ29uZmlnSGVhZGVyIj4NCi0gKiAgICZsdDtjb21wbGV4Q29udGVudD4NCi0gKiAgICAgJmx0O3Jlc3RyaWN0aW9uIGJhc2U9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1hbnlUeXBlIj4NCi0gKiAgICAgICAmbHQ7c2VxdWVuY2U+DQotICogICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJtZXNzYWdlIiB0eXBlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9c3RyaW5nIi8+DQotICogICAgICAgJmx0Oy9zZXF1ZW5jZT4NCi0gKiAgICAgJmx0Oy9yZXN0cmljdGlvbj4NCi0gKiAgICZsdDsvY29tcGxleENvbnRlbnQ+DQotICogJmx0Oy9jb21wbGV4VHlwZT4NCi0gKiA8L3ByZT4NCi0gKiANCi0gKiANCi0gKi8NCi1AWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpDQotQFhtbFR5cGUobmFtZSA9ICJDb25maWdIZWFkZXIiLCBwcm9wT3JkZXIgPSB7DQotICAgICJtZXNzYWdlIg0KLX0pDQotcHVibGljIGNsYXNzIENvbmZpZ0hlYWRlciB7DQotDQotICAgIEBYbWxFbGVtZW50KHJlcXVpcmVkID0gdHJ1ZSkNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBtZXNzYWdlOw0KLQ0KLSAgICAvKioNCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIG1lc3NhZ2UgcHJvcGVydHkuDQotICAgICAqIA0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICBwb3NzaWJsZSBvYmplY3QgaXMNCi0gICAgICogICAgIHtAbGluayBTdHJpbmcgfQ0KLSAgICAgKiAgICAgDQotICAgICAqLw0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7DQotICAgICAgICByZXR1cm4gbWVzc2FnZTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIG1lc3NhZ2UgcHJvcGVydHkuDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gdmFsdWUNCi0gICAgICogICAgIGFsbG93ZWQgb2JqZWN0IGlzDQotICAgICAqICAgICB7QGxpbmsgU3RyaW5nIH0NCi0gICAgICogICAgIA0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgc2V0TWVzc2FnZShTdHJpbmcgdmFsdWUpIHsNCi0gICAgICAgIHRoaXMubWVzc2FnZSA9IHZhbHVlOw0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2hlYWRlcnMvT2JqZWN0RmFjdG9yeS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvaGVhZGVycy9PYmplY3RGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmMTJjMGIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvaGVhZGVycy9PYmplY3RGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuaGVhZGVyczsNCi0NCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkVsZW1lbnQ7DQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudERlY2w7DQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUmVnaXN0cnk7DQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotDQotDQotQFhtbFJlZ2lzdHJ5DQotcHVibGljIGNsYXNzIE9iamVjdEZhY3Rvcnkgew0KLQ0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBRTmFtZSBfQ29uZmlnSGVhZGVyMV9RTkFNRSA9IG5ldyBRTmFtZSgiaHR0cDovL2hlYWRlcnMubWVzc2FnZS5qYXh3cy5heGlzMi5hcGFjaGUub3JnL3R5cGVzNCIsICJDb25maWdIZWFkZXIxIik7DQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFFOYW1lIF9Db25maWdIZWFkZXIzX1FOQU1FID0gbmV3IFFOYW1lKCJodHRwOi8vaGVhZGVycy5tZXNzYWdlLmpheHdzLmF4aXMyLmFwYWNoZS5vcmcvdHlwZXM0IiwgIkNvbmZpZ0hlYWRlcjMiKTsNCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgUU5hbWUgX0NvbmZpZ0hlYWRlcjJfUU5BTUUgPSBuZXcgUU5hbWUoImh0dHA6Ly9oZWFkZXJzLm1lc3NhZ2UuamF4d3MuYXhpczIuYXBhY2hlLm9yZy90eXBlczQiLCAiQ29uZmlnSGVhZGVyMiIpOw0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBRTmFtZSBfQ29uZmlnQm9keV9RTkFNRSA9IG5ldyBRTmFtZSgiaHR0cDovL2hlYWRlcnMubWVzc2FnZS5qYXh3cy5heGlzMi5hcGFjaGUub3JnL3R5cGVzNCIsICJDb25maWdCb2R5Iik7DQotDQotICAgIHB1YmxpYyBPYmplY3RGYWN0b3J5KCkgew0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIENvbmZpZ0hlYWRlciB9DQotICAgICAqIA0KLSAgICAgKi8NCi0gICAgcHVibGljIENvbmZpZ0hlYWRlciBjcmVhdGVDb25maWdIZWFkZXIoKSB7DQotICAgICAgICByZXR1cm4gbmV3IENvbmZpZ0hlYWRlcigpOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBDb25maWdIZWFkZXIgfQ0KLSAgICAgKiANCi0gICAgICovDQotICAgIHB1YmxpYyBDb25maWdCb2R5IGNyZWF0ZUNvbmZpZ0JvZHkoKSB7DQotICAgICAgICByZXR1cm4gbmV3IENvbmZpZ0JvZHkoKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBKQVhCRWxlbWVudCB9e0Bjb2RlIDx9e0BsaW5rIENvbmZpZ0JvZHkgfXtAY29kZSA+fX0NCi0gICAgICogDQotICAgICAqLw0KLSAgICBAWG1sRWxlbWVudERlY2wobmFtZXNwYWNlID0gImh0dHA6Ly9oZWFkZXJzLm1lc3NhZ2UuamF4d3MuYXhpczIuYXBhY2hlLm9yZy90eXBlczQiLCBuYW1lID0gIkNvbmZpZ0JvZHkiKQ0KLSAgICBwdWJsaWMgSkFYQkVsZW1lbnQ8Q29uZmlnQm9keT4gY3JlYXRlQ29uZmlnQm9keShDb25maWdCb2R5IHZhbHVlKSB7DQotICAgICAgICByZXR1cm4gbmV3IEpBWEJFbGVtZW50PENvbmZpZ0JvZHk+KF9Db25maWdCb2R5X1FOQU1FLCBDb25maWdCb2R5LmNsYXNzLCBudWxsLCB2YWx1ZSk7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEpBWEJFbGVtZW50IH17QGNvZGUgPH17QGxpbmsgQ29uZmlnSGVhZGVyIH17QGNvZGUgPn19DQotICAgICAqIA0KLSAgICAgKi8NCi0gICAgQFhtbEVsZW1lbnREZWNsKG5hbWVzcGFjZSA9ICJodHRwOi8vaGVhZGVycy5tZXNzYWdlLmpheHdzLmF4aXMyLmFwYWNoZS5vcmcvdHlwZXM0IiwgbmFtZSA9ICJDb25maWdIZWFkZXIxIikNCi0gICAgcHVibGljIEpBWEJFbGVtZW50PENvbmZpZ0hlYWRlcj4gY3JlYXRlQ29uZmlnSGVhZGVyMShDb25maWdIZWFkZXIgdmFsdWUpIHsNCi0gICAgICAgIHJldHVybiBuZXcgSkFYQkVsZW1lbnQ8Q29uZmlnSGVhZGVyPihfQ29uZmlnSGVhZGVyMV9RTkFNRSwgQ29uZmlnSGVhZGVyLmNsYXNzLCBudWxsLCB2YWx1ZSk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgSkFYQkVsZW1lbnQgfXtAY29kZSA8fXtAbGluayBDb25maWdIZWFkZXIgfXtAY29kZSA+fX0NCi0gICAgICogDQotICAgICAqLw0KLSAgICBAWG1sRWxlbWVudERlY2wobmFtZXNwYWNlID0gImh0dHA6Ly9oZWFkZXJzLm1lc3NhZ2UuamF4d3MuYXhpczIuYXBhY2hlLm9yZy90eXBlczQiLCBuYW1lID0gIkNvbmZpZ0hlYWRlcjMiKQ0KLSAgICBwdWJsaWMgSkFYQkVsZW1lbnQ8Q29uZmlnSGVhZGVyPiBjcmVhdGVDb25maWdIZWFkZXIzKENvbmZpZ0hlYWRlciB2YWx1ZSkgew0KLSAgICAgICAgcmV0dXJuIG5ldyBKQVhCRWxlbWVudDxDb25maWdIZWFkZXI+KF9Db25maWdIZWFkZXIzX1FOQU1FLCBDb25maWdIZWFkZXIuY2xhc3MsIG51bGwsIHZhbHVlKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBKQVhCRWxlbWVudCB9e0Bjb2RlIDx9e0BsaW5rIENvbmZpZ0hlYWRlciB9e0Bjb2RlID59fQ0KLSAgICAgKiANCi0gICAgICovDQotICAgIEBYbWxFbGVtZW50RGVjbChuYW1lc3BhY2UgPSAiaHR0cDovL2hlYWRlcnMubWVzc2FnZS5qYXh3cy5heGlzMi5hcGFjaGUub3JnL3R5cGVzNCIsIG5hbWUgPSAiQ29uZmlnSGVhZGVyMiIpDQotICAgIHB1YmxpYyBKQVhCRWxlbWVudDxDb25maWdIZWFkZXI+IGNyZWF0ZUNvbmZpZ0hlYWRlcjIoQ29uZmlnSGVhZGVyIHZhbHVlKSB7DQotICAgICAgICByZXR1cm4gbmV3IEpBWEJFbGVtZW50PENvbmZpZ0hlYWRlcj4oX0NvbmZpZ0hlYWRlcjJfUU5BTUUsIENvbmZpZ0hlYWRlci5jbGFzcywgbnVsbCwgdmFsdWUpOw0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2hlYWRlcnMvcGFja2FnZS1pbmZvLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9oZWFkZXJzL3BhY2thZ2UtaW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YWVlMDZmLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2hlYWRlcnMvcGFja2FnZS1pbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotQGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sU2NoZW1hKG5hbWVzcGFjZSA9ICJodHRwOi8vaGVhZGVycy5tZXNzYWdlLmpheHdzLmF4aXMyLmFwYWNoZS5vcmcvdHlwZXM0IikNCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5oZWFkZXJzOw0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9taXNjL0NvbnZlcnRVdGlsc1Rlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9taXNjL0NvbnZlcnRVdGlsc1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjEzMDIxNC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWlzYy9Db252ZXJ0VXRpbHNUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5taXNjOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MudXRpbGl0eS5Db252ZXJ0VXRpbHM7DQotDQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLQ0KLS8qKg0KLSAqIFVuaXQgVGVzdCBmb3IgdGhlIENvbnZlcnRVdGlscyB1dGlsaXR5DQotICovDQotcHVibGljIGNsYXNzIENvbnZlcnRVdGlsc1Rlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RCeXRlQXJyYXl0b2J5dGVBcnJheSgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgQnl0ZVtdIGlucHV0ID0gbmV3IEJ5dGVbM107DQotICAgICAgICBpbnB1dFswXSA9IG5ldyBCeXRlKChieXRlKSAwKTsNCi0gICAgICAgIGlucHV0WzFdID0gbmV3IEJ5dGUoKGJ5dGUpIDEpOw0KLSAgICAgICAgaW5wdXRbMl0gPSBuZXcgQnl0ZSgoYnl0ZSkgMik7DQotICAgICAgICANCi0gICAgICAgIGJ5dGVbXSBvdXRwdXQgPSBuZXcgYnl0ZVszXTsNCi0gICAgICAgIA0KLSAgICAgICAgaWYgKENvbnZlcnRVdGlscy5pc0NvbnZlcnRhYmxlKGlucHV0LCBvdXRwdXQuZ2V0Q2xhc3MoKSkpIHsNCi0gICAgICAgICAgICBvdXRwdXQgPSAoYnl0ZVtdKSBDb252ZXJ0VXRpbHMuY29udmVydChpbnB1dCwgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQuZ2V0Q2xhc3MoKSk7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIGFzc2VydFRydWUob3V0cHV0Lmxlbmd0aCA9PSAzKTsNCi0gICAgICAgIGFzc2VydFRydWUob3V0cHV0WzBdID09IChieXRlKSAwKTsNCi0gICAgICAgIGFzc2VydFRydWUob3V0cHV0WzFdID09IChieXRlKSAxKTsNCi0gICAgICAgIGFzc2VydFRydWUob3V0cHV0WzJdID09IChieXRlKSAyKTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIHZvaWQgdGVzdEJMaXN0dG9CQXJyYXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIEFycmF5TGlzdDxCPiBpbnB1dCA9IG5ldyBBcnJheUxpc3Q8Qj4oKTsNCi0gICAgICAgIEIgYiA9IG5ldyBCKCk7DQotICAgICAgICBiLnNldERhdGEoMCk7DQotICAgICAgICBpbnB1dC5hZGQoYik7DQotICAgICAgICBiID0gbmV3IEIoKTsNCi0gICAgICAgIGIuc2V0RGF0YSgxKTsNCi0gICAgICAgIGlucHV0LmFkZChiKTsNCi0gICAgICAgIGIgPSBuZXcgQigpOw0KLSAgICAgICAgYi5zZXREYXRhKDIpOw0KLSAgICAgICAgaW5wdXQuYWRkKGIpOw0KLSAgICAgICAgDQotICAgICAgICBCW10gb3V0cHV0ID0gbmV3IEJbMF07DQotICAgICAgICANCi0gICAgICAgIGlmIChDb252ZXJ0VXRpbHMuaXNDb252ZXJ0YWJsZShpbnB1dCwgb3V0cHV0LmdldENsYXNzKCkpKSB7DQotICAgICAgICAgICAgb3V0cHV0ID0gKEJbXSkgQ29udmVydFV0aWxzLmNvbnZlcnQoaW5wdXQsIG91dHB1dC5nZXRDbGFzcygpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgYXNzZXJ0VHJ1ZShvdXRwdXQubGVuZ3RoID09IDMpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShvdXRwdXRbMF0uZ2V0RGF0YSgpID09IDApOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShvdXRwdXRbMV0uZ2V0RGF0YSgpID09IDEpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShvdXRwdXRbMl0uZ2V0RGF0YSgpID09IDIpOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QkFycmF5dG9CTGlzdCgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgDQotICAgICAgICBCW10gaW5wdXQgPSBuZXcgQlszXTsNCi0gICAgICAgIGlucHV0WzBdID0gbmV3IEIoKTsNCi0gICAgICAgIGlucHV0WzBdLnNldERhdGEoMCk7DQotICAgICAgICBpbnB1dFsxXSA9IG5ldyBCKCk7DQotICAgICAgICBpbnB1dFsxXS5zZXREYXRhKDEpOw0KLSAgICAgICAgaW5wdXRbMl0gPSBuZXcgQigpOw0KLSAgICAgICAgaW5wdXRbMl0uc2V0RGF0YSgyKTsNCi0gICAgICAgIA0KLSAgICAgICAgDQotICAgICAgICBBcnJheUxpc3Q8Qj4gb3V0cHV0ID0gbmV3IEFycmF5TGlzdDxCPigpOw0KLSAgICAgICAgDQotICAgICAgICBpZiAoQ29udmVydFV0aWxzLmlzQ29udmVydGFibGUoaW5wdXQsIG91dHB1dC5nZXRDbGFzcygpKSkgew0KLSAgICAgICAgICAgIG91dHB1dCA9IChBcnJheUxpc3Q8Qj4pIENvbnZlcnRVdGlscy5jb252ZXJ0KGlucHV0LCANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQuZ2V0Q2xhc3MoKSk7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIGFzc2VydFRydWUob3V0cHV0LnNpemUoKSA9PSAzKTsNCi0gICAgICAgIGFzc2VydFRydWUob3V0cHV0LmdldCgwKS5nZXREYXRhKCkgPT0gMCk7DQotICAgICAgICBhc3NlcnRUcnVlKG91dHB1dC5nZXQoMSkuZ2V0RGF0YSgpID09IDEpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShvdXRwdXQuZ2V0KDIpLmdldERhdGEoKSA9PSAyKTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqIA0KLSAgICAgKiBOZWdhdGl2ZSB0ZXN0Li4uY2FuJ3QgY29udmVydCBMaXN0IG9mIEIgaW50byBDW10NCi0gICAgICogQHRocm93cyBFeGNlcHRpb24NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RCTGlzdHRvQ0FycmF5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBBcnJheUxpc3Q8Qj4gaW5wdXQgPSBuZXcgQXJyYXlMaXN0PEI+KCk7DQotICAgICAgICBCIGIgPSBuZXcgQigpOw0KLSAgICAgICAgYi5zZXREYXRhKDApOw0KLSAgICAgICAgaW5wdXQuYWRkKGIpOw0KLSAgICAgICAgYiA9IG5ldyBCKCk7DQotICAgICAgICBiLnNldERhdGEoMSk7DQotICAgICAgICBpbnB1dC5hZGQoYik7DQotICAgICAgICBiID0gbmV3IEIoKTsNCi0gICAgICAgIGIuc2V0RGF0YSgyKTsNCi0gICAgICAgIGlucHV0LmFkZChiKTsNCi0gICAgICAgIA0KLSAgICAgICAgQ1tdIG91dHB1dCA9IG5ldyBDWzBdOw0KLSAgICAgICAgDQotICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSBmYWxzZTsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgb3V0cHV0ID0gKENbXSkgQ29udmVydFV0aWxzLmNvbnZlcnQoaW5wdXQsIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5nZXRDbGFzcygpKTsNCi0gICAgICAgIH0gY2F0Y2ggKFdlYlNlcnZpY2VFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZS5nZXRNZXNzYWdlKCkuY29udGFpbnMoIkNhbm5vdCBjb252ZXJ0IikpOw0KLSAgICAgICAgICAgIHN1Y2Nlc3MgPSB0cnVlOw0KLSAgICAgICAgfSANCi0gICAgICAgIA0KLSAgICAgICAgYXNzZXJ0VHJ1ZShzdWNjZXNzKTsNCi0gICAgfQ0KLSAgICBjbGFzcyBCIHsNCi0gICAgICAgIHByaXZhdGUgaW50IGRhdGEgPSAwOw0KLQ0KLSAgICAgICAgcHVibGljIGludCBnZXREYXRhKCkgew0KLSAgICAgICAgICAgIHJldHVybiBkYXRhOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0RGF0YShpbnQgZGF0YSkgew0KLSAgICAgICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIGNsYXNzIEMgew0KLSAgICAgICAgcHJpdmF0ZSBpbnQgZGF0YSA9IDA7DQotDQotICAgICAgICBwdWJsaWMgaW50IGdldERhdGEoKSB7DQotICAgICAgICAgICAgcmV0dXJuIGRhdGE7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgdm9pZCBzZXREYXRhKGludCBkYXRhKSB7DQotICAgICAgICAgICAgdGhpcy5kYXRhID0gZGF0YTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWlzYy9OUzJQa2dUZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWlzYy9OUzJQa2dUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmNzg4NTIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21pc2MvTlMyUGtnVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1pc2M7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51dGlsaXR5LkphdmFVdGlsczsKLQotLyoqCi0gKiBUZXN0cyBOYW1lc3BhY2UgdG8gUGFja2FnZSBBbGdvcml0aG0KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBOUzJQa2dUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHVibGljIHZvaWQgdGVzdDAxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBuczEgPSAiaHR0cDovL2V4YW1wbGUub3JnL05ld0J1c2luZXNzLyI7Ci0gICAgICAgIFN0cmluZyBleHBlY3RlZFBrZzEgPSAib3JnLmV4YW1wbGUubmV3YnVzaW5lc3MiOwotICAgICAgICAKLSAgICAgICAgU3RyaW5nIHBrZyA9IEphdmFVdGlscy5nZXRQYWNrYWdlRnJvbU5hbWVzcGFjZShuczEpOwotICAgICAgICBhc3NlcnRUcnVlKCJFeHBlY3RlZCAiICsgZXhwZWN0ZWRQa2cxICsgIlJlY2VpdmVkICIgK3BrZywgZXhwZWN0ZWRQa2cxLmVxdWFscyhwa2cpKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdDAyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBuczEgPSAidXJuOi8vZXhhbXBsZS1vcmcvTmV3QnVzaW5lc3MiOwotICAgICAgICBTdHJpbmcgZXhwZWN0ZWRQa2cxID0gIm9yZy5leGFtcGxlIjsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBwa2cgPSBKYXZhVXRpbHMuZ2V0UGFja2FnZUZyb21OYW1lc3BhY2UobnMxKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgIiArIGV4cGVjdGVkUGtnMSArICJSZWNlaXZlZCAiICtwa2csIGV4cGVjdGVkUGtnMS5lcXVhbHMocGtnKSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3QwMygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgbnMxID0gIiI7Ci0gICAgICAgIFN0cmluZyBleHBlY3RlZFBrZzEgPSAiIjsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBwa2cgPSBKYXZhVXRpbHMuZ2V0UGFja2FnZUZyb21OYW1lc3BhY2UobnMxKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgIiArIGV4cGVjdGVkUGtnMSArICJSZWNlaXZlZCAiICtwa2csIGV4cGVjdGVkUGtnMS5lcXVhbHMocGtnKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21pc2MvWE1MRmF1bHRUZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWlzYy9YTUxGYXVsdFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzkxNmE0OS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWlzYy9YTUxGYXVsdFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi0vKioNCi0gKiANCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWlzYzsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuWE1MRmF1bHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5YTUxGYXVsdENvZGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5YTUxGYXVsdFJlYXNvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLnV0aWwuWE1MRmF1bHRVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51dGlsaXR5LkphdmFVdGlsczsNCi0NCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi1pbXBvcnQgamF2YXgueG1sLnNvYXAuTWVzc2FnZUZhY3Rvcnk7DQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBCb2R5Ow0KLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQQ29uc3RhbnRzOw0KLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRmF1bHQ7DQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBNZXNzYWdlOw0KLQ0KLS8qKg0KLSAqIFRlc3RzIFhNTEZhdWx0IGxvZ2ljDQotICovDQotcHVibGljIGNsYXNzIFhNTEZhdWx0VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUU5hbWUgQ1VTVE9NID0gbmV3IFFOYW1lKCJodHRwOi8vbXlTYW1wbGUiLCAiQ3VzdG9tQ29kZSIsICJwcmUiKTsNCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBUZXN0IEN1c3RvbSBGYXVsdFFOYW1lIGZvciBTT0FQIDEuMQ0KLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdEN1c3RvbUZhdWx0MTEoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIE1lc3NhZ2VGYWN0b3J5IG1mID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoU09BUENvbnN0YW50cy5TT0FQXzFfMV9QUk9UT0NPTCk7DQotICAgICAgICBTT0FQTWVzc2FnZSBzbSA9IG1mLmNyZWF0ZU1lc3NhZ2UoKTsNCi0gICAgICAgIFNPQVBCb2R5IGJvZHkgPSBzbS5nZXRTT0FQQm9keSgpOw0KLSAgICAgICAgU09BUEZhdWx0IGZhdWx0ID0gYm9keS5hZGRGYXVsdChDVVNUT00sICJDdXN0b20gRmF1bHQiKTsNCi0gICAgICAgIA0KLSAgICAgICAgWE1MRmF1bHQgeG1sRmF1bHQgPSBYTUxGYXVsdFV0aWxzLmNyZWF0ZVhNTEZhdWx0KGZhdWx0KTsNCi0gICAgICAgIA0KLSAgICAgICAgYXNzZXJ0VHJ1ZSh4bWxGYXVsdCAhPSBudWxsKTsNCi0gICAgICAgIA0KLSAgICAgICAgWE1MRmF1bHRSZWFzb24gcmVhc29uID0geG1sRmF1bHQuZ2V0UmVhc29uKCk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlYXNvbiAhPSBudWxsKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVhc29uLmdldFRleHQoKS5lcXVhbHMoIkN1c3RvbSBGYXVsdCIpKTsNCi0gICAgICAgIA0KLSAgICAgICAgWE1MRmF1bHRDb2RlIGNvZGUgPSB4bWxGYXVsdC5nZXRDb2RlKCk7DQotICAgICAgICBhc3NlcnRUcnVlKGNvZGUgIT0gbnVsbCk7DQotICAgICAgICANCi0gICAgICAgIFFOYW1lIGNvZGVRTmFtZSA9IGNvZGUudG9RTmFtZShTT0FQQ29uc3RhbnRzLlVSSV9OU19TT0FQXzFfMV9FTlZFTE9QRSk7DQotICAgICAgICBhc3NlcnRUcnVlKCJFeHBlY3RlZCBRTmFtZSA9ICIgKyBDVVNUT00gKyAiIGJ1dCByZWNlaXZlZCA9ICIgKyBjb2RlUU5hbWUsIGNvZGVRTmFtZS5lcXVhbHMoQ1VTVE9NKSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgDQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBUZXN0IEN1c3RvbSBGYXVsdFFOYW1lIGZvciBTT0FQIDEuMg0KLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdEN1c3RvbUZhdWx0MTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIE1lc3NhZ2VGYWN0b3J5IG1mID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoU09BUENvbnN0YW50cy5TT0FQXzFfMl9QUk9UT0NPTCk7DQotICAgICAgICBTT0FQTWVzc2FnZSBzbSA9IG1mLmNyZWF0ZU1lc3NhZ2UoKTsNCi0gICAgICAgIFNPQVBCb2R5IGJvZHkgPSBzbS5nZXRTT0FQQm9keSgpOw0KLSAgICAgICAgDQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIFNPQVBGYXVsdCBmYXVsdCA9IGJvZHkuYWRkRmF1bHQoQ1VTVE9NLCAiQ3VzdG9tIEZhdWx0Iik7DQotICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgRmFpbHVyZSwgY3VzdG9tIGZhdWx0IGNvZGVzIGFyZSBub3Qgc3VwcG9ydGVkIHdpdGggU09BUCAxLjIiKTsNCi0gICAgICAgIH0gY2F0Y2ggKFNPQVBFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIC8vIEV4cGVjdGVkLi4uDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgew0KLSAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIGRpZmZlcmVudCBmYWlsdXJlLCByZWNlaXZlZDogIiArIHQpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICB9DQotICAgIA0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXJhcGkvQXR0YWNobWVudFV0aWwuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlcmFwaS9BdHRhY2htZW50VXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGZlOGEzLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlcmFwaS9BdHRhY2htZW50VXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm92aWRlcmFwaTsKLQotaW1wb3J0IGphdmF4LmltYWdlaW8uSUlPSW1hZ2U7Ci1pbXBvcnQgamF2YXguaW1hZ2Vpby5JbWFnZVdyaXRlcjsKLWltcG9ydCBqYXZheC5pbWFnZWlvLnN0cmVhbS5JbWFnZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5NZXNzYWdlRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQQ29uc3RhbnRzOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUE1lc3NhZ2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5SZXN1bHQ7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtU291cmNlOwotaW1wb3J0IGphdmEuYXd0Lio7Ci1pbXBvcnQgamF2YS5hd3QuaW1hZ2UuQnVmZmVyZWRJbWFnZTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLS8qKgotICogVGhpcyB3aWxsIHNlcnZlIGFzIGEgaGVscGVyIGNsYXNzIGZvciBhdHRhY2htZW50cyB1dGlsaXR5IG1ldGhvZHMuIEFsbCBtZXRob2RzCi0gKiBhcmUgaW50ZW5kZWQgdG8gYmUgcmVmZXJlbmNlZCBzdGF0aWNseS4KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBBdHRhY2htZW50VXRpbCB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09BUDExX05BTUVTUEFDRSA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTT0FQMTJfTkFNRVNQQUNFID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZSI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNVV9URVhUID0gInNvYXAgbWVzc2FnZSBtdXN0VW5kZXJzdGFuZCBoZWFkZXIgcmVxdWVzdCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU5ERVJTVE9PRF9NVV9URVhUID0gInVuZGVyc3Rvb2QgaGVhZGVycyBzb2FwIG1lc3NhZ2UgbXVzdFVuZGVyc3RhbmQgaGVhZGVyIHJlcXVlc3QiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFQgPSAic29hcCBtZXNzYWdlIHJlcXVlc3QiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFID0gInZhbHVlIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9OT0RFID0gIjwiK1ZBTFVFKyI+IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9OT0RFX1NMQVNIID0gIjwvIitWQUxVRSsiPiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0hFQURFUiA9ICI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz4iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1VSEVBREVSX0NMSUVOVCA9ICJuczE6bXVjbGllbnQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1VSEVBREVSX1NFUlZFUiA9ICJuczE6bXVzZXJ2ZXIiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1VSEVBREVSX0NMSUVOVF9VTkRFUlNUT09EID0gIm5zMTptdWNsaWVudHVuZGVyc3Rvb2QiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1VSEVBREVSX1NFUlZFUl9VTkRFUlNUT09EID0gIm5zMTptdXNlcnZlcnVuZGVyc3Rvb2QiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIG1zZ0Vudk1VID0gCi0gICAgICAgICI8c29hcGVudjpFbnZlbG9wZSB4bWxuczpzb2FwZW52PVwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS9cIj4iICsKLSAgICAgICAgICAgICI8c29hcGVudjpIZWFkZXI+IiArCi0gICAgICAgICAgICAgICAgIjwiK01VSEVBREVSX0NMSUVOVCsiIHhtbG5zOm5zMT1cImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyXCIgc29hcGVudjptdXN0VW5kZXJzdGFuZD1cIjFcIj5NVWluZm88LyIrTVVIRUFERVJfQ0xJRU5UKyI+IiArCi0gICAgICAgICAgICAiPC9zb2FwZW52OkhlYWRlcj4iICsKLSAgICAgICAgICAgICI8c29hcGVudjpCb2R5PiIgKwotICAgICAgICAgICAgICAgICI8bnMxOmludm9rZSB4bWxuczpuczE9XCJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMlwiPiIgKwotICAgICAgICAgICAgICAgICAgICBWQUxVRV9OT0RFICsKLSAgICAgICAgICAgICAgICAgICAgTVVfVEVYVCArCi0gICAgICAgICAgICAgICAgICAgIFZBTFVFX05PREVfU0xBU0ggKwotICAgICAgICAgICAgICAgICI8L25zMTppbnZva2U+IiArCi0gICAgICAgICAgICAiPC9zb2FwZW52OkJvZHk+IiArCi0gICAgICAgICI8L3NvYXBlbnY6RW52ZWxvcGU+IjsKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBtc2dFbnYgPSAKLSAgICAgICAgIjxzb2FwZW52OkVudmVsb3BlIHhtbG5zOnNvYXBlbnY9XCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlL1wiPiIgKwotICAgICAgICAgICAgIjxzb2FwZW52OkJvZHk+IiArCi0gICAgICAgICAgICAgICAgIjxuczE6aW52b2tlIHhtbG5zOm5zMT1cImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyXCI+IiArCi0gICAgICAgICAgICAgICAgICAgIFZBTFVFX05PREUgKwotICAgICAgICAgICAgICAgICAgICBNVV9URVhUICsKLSAgICAgICAgICAgICAgICAgICAgVkFMVUVfTk9ERV9TTEFTSCArCi0gICAgICAgICAgICAgICAgIjwvbnMxOmludm9rZT4iICsKLSAgICAgICAgICAgICI8L3NvYXBlbnY6Qm9keT4iICsKLSAgICAgICAgIjwvc29hcGVudjpFbnZlbG9wZT4iOwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIG1zZ0VudlBsYWluID0gCi0gICAgICAgICI8c29hcGVudjpFbnZlbG9wZSB4bWxuczpzb2FwZW52PVwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS9cIj4iICsKLSAgICAgICAgICAgICI8c29hcGVudjpCb2R5PiIgKwotICAgICAgICAgICAgICAgICI8bnMxOmludm9rZSB4bWxuczpuczE9XCJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMlwiPiIgKwotICAgICAgICAgICAgICAgICAgICBWQUxVRV9OT0RFICsKLSAgICAgICAgICAgICAgICAgICAgVEVYVCArCi0gICAgICAgICAgICAgICAgICAgIFZBTFVFX05PREVfU0xBU0ggKwotICAgICAgICAgICAgICAgICI8L25zMTppbnZva2U+IiArCi0gICAgICAgICAgICAiPC9zb2FwZW52OkJvZHk+IiArCi0gICAgICAgICI8L3NvYXBlbnY6RW52ZWxvcGU+IjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIG1zZ0Vudk1VX3VuZGVyc3Rvb2QgPSAKLSAgICAgICAgIjxzb2FwZW52OkVudmVsb3BlIHhtbG5zOnNvYXBlbnY9XCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlL1wiPiIgKwotICAgICAgICAgICAgIjxzb2FwZW52OkhlYWRlcj4iICsKLSAgICAgICAgICAgICAgICAiPCIrTVVIRUFERVJfQ0xJRU5UX1VOREVSU1RPT0QrIiB4bWxuczpuczE9XCJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMlwiIHNvYXBlbnY6bXVzdFVuZGVyc3RhbmQ9XCIxXCI+TVVpbmZvPC8iK01VSEVBREVSX0NMSUVOVF9VTkRFUlNUT09EKyI+IiArCi0gICAgICAgICAgICAiPC9zb2FwZW52OkhlYWRlcj4iICsKLSAgICAgICAgICAgICI8c29hcGVudjpCb2R5PiIgKwotICAgICAgICAgICAgICAgICI8bnMxOmludm9rZSB4bWxuczpuczE9XCJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMlwiPiIgKwotICAgICAgICAgICAgICAgICAgICBWQUxVRV9OT0RFICsKLSAgICAgICAgICAgICAgICAgICAgVU5ERVJTVE9PRF9NVV9URVhUICsKLSAgICAgICAgICAgICAgICAgICAgVkFMVUVfTk9ERV9TTEFTSCArCi0gICAgICAgICAgICAgICAgIjwvbnMxOmludm9rZT4iICsKLSAgICAgICAgICAgICI8L3NvYXBlbnY6Qm9keT4iICsKLSAgICAgICAgIjwvc29hcGVudjpFbnZlbG9wZT4iOwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIG1zZ0Vudl91bmRlcnN0b29kID0gCi0gICAgICAgICI8c29hcGVudjpFbnZlbG9wZSB4bWxuczpzb2FwZW52PVwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS9cIj4iICsKLSAgICAgICAgICAgICI8c29hcGVudjpCb2R5PiIgKwotICAgICAgICAgICAgICAgICI8bnMxOmludm9rZSB4bWxuczpuczE9XCJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMlwiPiIgKwotICAgICAgICAgICAgICAgICAgICBWQUxVRV9OT0RFICsKLSAgICAgICAgICAgICAgICAgICAgVU5ERVJTVE9PRF9NVV9URVhUICsKLSAgICAgICAgICAgICAgICAgICAgVkFMVUVfTk9ERV9TTEFTSCArCi0gICAgICAgICAgICAgICAgIjwvbnMxOmludm9rZT4iICsKLSAgICAgICAgICAgICI8L3NvYXBlbnY6Qm9keT4iICsKLSAgICAgICAgIjwvc29hcGVudjpFbnZlbG9wZT4iOwotICAgIAotICAgIC8qKgotICAgICAqIFN0b3JlIGEgZ2l2ZW4gaW1hZ2UgdG8gYW4gSW1hZ2Ugb3V0cHV0IHN0cmVhbQotICAgICAqIEBwYXJhbSBtaW1lVHlwZQotICAgICAqIEBwYXJhbSBpbWFnZQotICAgICAqIEBwYXJhbSBvcwotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHN0b3JlSW1hZ2UoU3RyaW5nIG1pbWVUeXBlLCBJbWFnZSBpbWFnZSwgT3V0cHV0U3RyZWFtIG9zKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgSW1hZ2VXcml0ZXIgaW1hZ2VXcml0ZXIgPSBudWxsOwotICAgICAgICBCdWZmZXJlZEltYWdlIGJ1ZmZlcmVkSW1hZ2UgPSAoQnVmZmVyZWRJbWFnZSkgaW1hZ2U7Ci0gICAgICAgIAotICAgICAgICBJdGVyYXRvciBpdGVyYXRvciA9IGphdmF4LmltYWdlaW8uSW1hZ2VJTy5nZXRJbWFnZVdyaXRlcnNCeU1JTUVUeXBlKG1pbWVUeXBlKTsKLSAgICAgICAgaWYgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAJaW1hZ2VXcml0ZXIgPSAoSW1hZ2VXcml0ZXIpIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgfQotICAgICAgICBJbWFnZU91dHB1dFN0cmVhbSBpb3MgPSBqYXZheC5pbWFnZWlvLkltYWdlSU8uY3JlYXRlSW1hZ2VPdXRwdXRTdHJlYW0ob3MpOwotICAgICAgICBpbWFnZVdyaXRlci5zZXRPdXRwdXQoaW9zKTsKLQotICAgICAgICBpbWFnZVdyaXRlci53cml0ZShuZXcgSUlPSW1hZ2UoYnVmZmVyZWRJbWFnZSwgbnVsbCwgbnVsbCkpOwotICAgICAgICBpb3MuZmx1c2goKTsKLSAgICAgICAgaW1hZ2VXcml0ZXIuZGlzcG9zZSgpOwotICAgIH0KLSAgICAKLQkvKioKLQkgKiBBZGFwdGVyIG1ldGhvZCB1c2VkIHRvIGNvbnZlcnQgYW55IHR5cGUgb2YgU291cmNlIHRvIGEgU3RyaW5nCi0JICogCi0JICogQHBhcmFtIGlucHV0Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvU3RyaW5nKFNvdXJjZSBpbnB1dCkgewotCi0JCWlmIChpbnB1dCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJU3RyaW5nV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJVHJhbnNmb3JtZXIgdHJhc2Zvcm1lcjsKLQkJdHJ5IHsKLQkJCXRyYXNmb3JtZXIgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdUcmFuc2Zvcm1lcigpOwotCQkJUmVzdWx0IHJlc3VsdCA9IG5ldyBTdHJlYW1SZXN1bHQod3JpdGVyKTsKLQkJCXRyYXNmb3JtZXIudHJhbnNmb3JtKGlucHV0LCByZXN1bHQpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlyZXR1cm4gd3JpdGVyLmdldEJ1ZmZlcigpLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogQWRhcHRlciBtZXRob2QgdXNlZCB0byBjb252ZXJ0IGFueSB0eXBlIG9mIFNPQVBNZXNzYWdlIHRvIGEgU3RyaW5nCi0JICogCi0JICogQHBhcmFtIGlucHV0Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvU3RyaW5nKFNPQVBNZXNzYWdlIGlucHV0KSB7Ci0KLQkJaWYgKGlucHV0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlTb3VyY2UgcmVzdWx0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXJlc3VsdCA9IGlucHV0LmdldFNPQVBQYXJ0KCkuZ2V0Q29udGVudCgpOwotCQl9IGNhdGNoIChTT0FQRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQotCQlyZXR1cm4gdG9TdHJpbmcocmVzdWx0KTsKLQl9Ci0JCi0JLyoqCi0JICogTWV0aG9kIHVzZWQgdG8gY29udmVydCBTdHJpbmdzIHRvIFNPQVBNZXNzYWdlcwotCSAqIAotCSAqIEBwYXJhbSBtc2dTdHJpbmcKLQkgKiBAcmV0dXJuCi0JICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgU09BUE1lc3NhZ2UgdG9TT0FQTWVzc2FnZShTdHJpbmcgbXNnU3RyaW5nKSB7Ci0KLSAgICAgICAgIGlmIChtc2dTdHJpbmcgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgIFNPQVBNZXNzYWdlIG1lc3NhZ2UgPSBudWxsOwotICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkgZmFjdG9yeSA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICAgLy8gRm9yY2UgdGhlIHVzYWdlIG9mIHNwZWNpZmljIE1lc2FzZ2VGYWN0b3JpZXMKLSAgICAgICAgICAgICAgICAgaWYgKG1zZ1N0cmluZy5pbmRleE9mKFNPQVAxMV9OQU1FU1BBQ0UpID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3J5ID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoU09BUENvbnN0YW50cy5TT0FQXzFfMV9QUk9UT0NPTCk7Ci0gICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yeSA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKFNPQVBDb25zdGFudHMuU09BUF8xXzJfUFJPVE9DT0wpOwotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBmYWN0b3J5LmNyZWF0ZU1lc3NhZ2UoKTsKLSAgICAgICAgICAgICAgICAgbWVzc2FnZS5nZXRTT0FQUGFydCgpLnNldENvbnRlbnQoKFNvdXJjZSkgbmV3IFN0cmVhbVNvdXJjZShuZXcgU3RyaW5nUmVhZGVyKG1zZ1N0cmluZykpKTsKLSAgICAgICAgICAgICAgICAgbWVzc2FnZS5zYXZlQ2hhbmdlcygpOwotICAgICAgICAgfSBjYXRjaCAoU09BUEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigidG9TT0FQTWVzc2FnZSBFeGNlcHRpb24gZW5jb3VudGVyZWQ6ICIgKyBlKTsKLSAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgIH0KLSAgICAgICAgIHJldHVybiBtZXNzYWdlOyAgICAgCi0gICAgfQotICAgIAotfQotCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXJhcGkvRGF0YVNvdXJjZUltcGwuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlcmFwaS9EYXRhU291cmNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODRlYWIzLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlcmFwaS9EYXRhU291cmNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm92aWRlcmFwaTsKLQotaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRGF0YVNvdXJjZTsKLWltcG9ydCBqYXZhLmF3dC4qOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotCi0vKioKLSAqIEFuIGltcGwgY2xhc3MgZm9yIGphdmF4LmFjdGl2YXRpb24uRGF0YVNvdXJjZSBpbnRlcmZhY2UuCi0gKgotICovCi1wdWJsaWMgY2xhc3MgRGF0YVNvdXJjZUltcGwgaW1wbGVtZW50cyBEYXRhU291cmNlIHsKLQotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGZpbGVOYW1lOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgY29udGVudFR5cGU7Ci0KLSAgICBwcml2YXRlIGJ5dGVbXSBieXRlQXJyYXk7Ci0KLSAgICBwcml2YXRlIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBieXRlQXJyYXlPUzsKLSAgICAKLQkvKioKLQkgKiBDb25zdHJ1Y3RvcgotCSAqIAotCSAqIEBwYXJhbSBfY29udGVudFR5cGUKLQkgKiBAcGFyYW0gX2ZpbGVOYW1lCi0JICogQHBhcmFtIGltYWdlCi0JICogQHRocm93cyBFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgRGF0YVNvdXJjZUltcGwoU3RyaW5nIF9jb250ZW50VHlwZSwgU3RyaW5nIF9maWxlTmFtZSwgSW1hZ2UgaW1hZ2UpIHRocm93cyBFeGNlcHRpb257Ci0JCXN1cGVyKCk7Ci0gICAgICAgIAotICAgICAgICB0cnkgewotICAgICAgICAJaWYoKF9jb250ZW50VHlwZSA9PSBudWxsKSB8fCAoX2NvbnRlbnRUeXBlID09ICIiKSl7Ci0gICAgICAgIAkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJUeXBlIGlzIE5VTEw6IE11c3QgcHJvdmlkZSBjb250ZW50IHR5cGUiKTsKLSAgICAgICAgCX0KLSAgICAgICAgCWlmKChfZmlsZU5hbWUgPT0gbnVsbCkgfHwgKF9jb250ZW50VHlwZSA9PSAiIikpewotICAgICAgICAJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiRmlsZSBuYW1lIGlzIE5VTEw6IE11c3QgcHJvdmlkZSBjb250ZW50IGZpbGUgbmFtZSIpOwotICAgICAgICAJfQotICAgICAgICAJCi0gICAgICAgIAl0aGlzLmZpbGVOYW1lID0gX2ZpbGVOYW1lOwotICAgIAkJdGhpcy5jb250ZW50VHlwZSA9IF9jb250ZW50VHlwZTsKLSAgICAgICAgCQotICAgICAgICAgICAgaWYgKGltYWdlICE9IG51bGwpIHsKLSAgICAgICAgICAgIAlieXRlQXJyYXlPUyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgICAgICAgICBBdHRhY2htZW50VXRpbC5zdG9yZUltYWdlKHRoaXMuY29udGVudFR5cGUsIGltYWdlLCBieXRlQXJyYXlPUyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICB9Ci0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZheC5hY3RpdmF0aW9uLkRhdGFTb3VyY2UjZ2V0Q29udGVudFR5cGUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLmNvbnRlbnRUeXBlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmF4LmFjdGl2YXRpb24uRGF0YVNvdXJjZSNnZXRJbnB1dFN0cmVhbSgpCi0JICovCi0JcHVibGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKHRoaXMuYnl0ZUFycmF5T1Muc2l6ZSgpICE9IDApIHsKLQkJCXRoaXMuYnl0ZUFycmF5ID0gdGhpcy5ieXRlQXJyYXlPUy50b0J5dGVBcnJheSgpOwotICAgICAgICAgICAgdGhpcy5ieXRlQXJyYXlPUy5yZXNldCgpOwotICAgICAgICB9Ci0JCQotCQlpZih0aGlzLmJ5dGVBcnJheSA9PSBudWxsKXsKLQkJCXJldHVybiBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0obmV3IGJ5dGVbMF0pOwotCQkJCi0JCX0KLSAgICAgICAgcmV0dXJuIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSh0aGlzLmJ5dGVBcnJheSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YXguYWN0aXZhdGlvbi5EYXRhU291cmNlI2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZmlsZU5hbWU7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YXguYWN0aXZhdGlvbi5EYXRhU291cmNlI2dldE91dHB1dFN0cmVhbSgpCi0JICovCi0JcHVibGljIE91dHB1dFN0cmVhbSBnZXRPdXRwdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAodGhpcy5ieXRlQXJyYXlPUy5zaXplKCkgIT0gMCkgewotCQkJdGhpcy5ieXRlQXJyYXkgPSB0aGlzLmJ5dGVBcnJheU9TLnRvQnl0ZUFycmF5KCk7Ci0gICAgICAgICAgICB0aGlzLmJ5dGVBcnJheU9TLnJlc2V0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMuYnl0ZUFycmF5T1M7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyYXBpL0dlbmVyaWNPcGVyYXRpb25Qcm92aWRlclRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlcmFwaS9HZW5lcmljT3BlcmF0aW9uUHJvdmlkZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwODBjNjIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyYXBpL0dlbmVyaWNPcGVyYXRpb25Qcm92aWRlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJvdmlkZXJhcGk7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRGVzY3JpcHRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRW5kcG9pbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5PcGVyYXRpb25EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLlNlcnZpY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRpc3BhdGNoZXJzLkdlbmVyaWNQcm92aWRlckRpc3BhdGNoZXI7Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKLWltcG9ydCBqYXZheC54bWwud3MuQmluZGluZ1R5cGU7Ci1pbXBvcnQgamF2YXgueG1sLndzLlByb3ZpZGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlTW9kZTsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZVByb3ZpZGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5odHRwLkhUVFBCaW5kaW5nOwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJpY09wZXJhdGlvblByb3ZpZGVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2VuZXJpY0hUVFBCaW5kaW5nT3BlcmF0aW9uKCkgewotICAgICAgICAvLyBUaGUgSFRUUCBiaW5kaW5nIHN1cHBvcnRzIGEgZ2VuZXJpYyBvcGVyYXRpb24gZm9yIFdTREwtbGVzcyBlbmRwb2ludHMuCi0gICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzZXJ2aWNlRGVzYyA9IERlc2NyaXB0aW9uRmFjdG9yeS5jcmVhdGVTZXJ2aWNlRGVzY3JpcHRpb24oSFRUUEJpbmRpbmdQcm92aWRlckltcGwuY2xhc3MpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2VEZXNjKTsKLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlbmRwb2ludERlc2MgPSBzZXJ2aWNlRGVzYy5nZXRFbmRwb2ludERlc2NyaXB0aW9uc19Bc0NvbGxlY3Rpb24oKS5pdGVyYXRvcigpLm5leHQoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChlbmRwb2ludERlc2MpOwotICAgICAgICBBeGlzU2VydmljZSBheGlzU3ZjID0gZW5kcG9pbnREZXNjLmdldEF4aXNTZXJ2aWNlKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoYXhpc1N2Yyk7Ci0gICAgICAgIAotICAgICAgICBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uIGludGVyZmFjZURlc2MgPSBlbmRwb2ludERlc2MuZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbigpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGludGVyZmFjZURlc2MpOwotCi0gICAgICAgIC8vIFRoZXJlIHNob3VsZCBiZSBhIHNpbmdsZSBPcERlc2Mgd2l0aCBhIHNpbmdsZSBBeGlzT3BlcmF0aW9uIHdpdGggYSBzcGVjaWZpYyBuYW1lCi0gICAgICAgIE9wZXJhdGlvbkRlc2NyaXB0aW9uIG9wRGVzY3NbXSA9IGludGVyZmFjZURlc2MuZ2V0T3BlcmF0aW9ucygpOwotICAgICAgICBhc3NlcnROb3ROdWxsKG9wRGVzY3MpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgb3BEZXNjcy5sZW5ndGgpOwotICAgICAgICBBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb24gPSBvcERlc2NzWzBdLmdldEF4aXNPcGVyYXRpb24oKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChheGlzT3BlcmF0aW9uKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24uSkFYV1NfTk9XU0RMX1BST1ZJREVSX09QRVJBVElPTl9OQU1FLCBheGlzT3BlcmF0aW9uLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgIAotICAgICAgICAvLyBOb3cgdmVyaWZ5IHRoYXQgdGhlIHNwZWNpYWwgZGlzcGF0aGVyIGNhbiBmaW5kIHRoaXMgb3BlcmF0aW9uCi0gICAgICAgIEdlbmVyaWNQcm92aWRlckRpc3BhdGNoZXIgZGlzcGF0Y2hlciA9IG5ldyBHZW5lcmljUHJvdmlkZXJEaXNwYXRjaGVyKCk7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0ID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIG1lc3NhZ2VDb250ZXh0LnNldEF4aXNTZXJ2aWNlKGF4aXNTdmMpOwotICAgICAgICAKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIFRoZSBkaXNwYXRjaGVyIHdpbGwgbm90IHRyeSB0byByZXNvbHZlIGFuIEF4aXNTZXJ2aWNlCi0gICAgICAgICAgICBhc3NlcnROdWxsKGRpc3BhdGNoZXIuZmluZFNlcnZpY2UobWVzc2FnZUNvbnRleHQpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gVGhlIGRpc3BhdGNoZXIgc2hvdWxkIGZpbmQgdGhlIHNwZWNpYWwgQXhpc09wZXJhdGlvbgotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGF4aXNPcGVyYXRpb24sIGRpc3BhdGNoZXIuZmluZE9wZXJhdGlvbihheGlzU3ZjLCBtZXNzYWdlQ29udGV4dCkpOwotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgZSkgewotICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBleGNlcHRpb24iICsgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgX3Rlc3RHZW5lcmljU09BUEJpbmRpbmdPcGVyYXRpb24oKSB7Ci0gICAgICAgIC8vIFJFVklFVzogQ3VycmVudGx5IGdlbmVyaWMgb3BlcmF0aW9ucyBhcmUgbm90IHN1cHBvcnRlZCBmb3IgU09BUCBCaW5kaW5ncwotICAgICAgICAKLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNlcnZpY2VEZXNjID0gRGVzY3JpcHRpb25GYWN0b3J5LmNyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbihTT0FQQmluZGluZ1Byb3ZpZGVySW1wbC5jbGFzcyk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZURlc2MpOwotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVuZHBvaW50RGVzYyA9IHNlcnZpY2VEZXNjLmdldEVuZHBvaW50RGVzY3JpcHRpb25zX0FzQ29sbGVjdGlvbigpLml0ZXJhdG9yKCkubmV4dCgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGVuZHBvaW50RGVzYyk7Ci0gICAgICAgIEF4aXNTZXJ2aWNlIGF4aXNTdmMgPSBlbmRwb2ludERlc2MuZ2V0QXhpc1NlcnZpY2UoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChheGlzU3ZjKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFNpbmNlIHRoZXJlJ3Mgbm8gV1NETCwgdGhlcmUgd2lsbCBiZSBubyBvcGVyYXRpb25zIGFuZCBubyBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uCi0gICAgICAgIC8vIGJlY2F1c2UgdGhpcyBpcyBhIFNPQVBCaW5kaW5nLgotICAgICAgICBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uIGludGVyZmFjZURlc2MgPSBlbmRwb2ludERlc2MuZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbigpOwotICAgICAgICBhc3NlcnROdWxsKGludGVyZmFjZURlc2MpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U0VJQmFzZWRFbmRwb2ludCgpIHsKLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNlcnZpY2VEZXNjID0gRGVzY3JpcHRpb25GYWN0b3J5LmNyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbihTRUlCYXNlZEVuZHBvaW50LmNsYXNzKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlRGVzYyk7Ci0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZW5kcG9pbnREZXNjID0gc2VydmljZURlc2MuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbnNfQXNDb2xsZWN0aW9uKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZW5kcG9pbnREZXNjKTsKLSAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1N2YyA9IGVuZHBvaW50RGVzYy5nZXRBeGlzU2VydmljZSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGF4aXNTdmMpOwotICAgICAgICAKLSAgICAgICAgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiBpbnRlcmZhY2VEZXNjID0gZW5kcG9pbnREZXNjLmdldEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24oKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChpbnRlcmZhY2VEZXNjKTsKLQotICAgICAgICAvLyBUaGVyZSBzaG91bGQgYmUgYSBzaW5nbGUgT3BEZXNjIHdpdGggYSBzaW5nbGUgQXhpc09wZXJhdGlvbiBiYXNlZCBvbiB0aGUgU0VJIGJlbG93Ci0gICAgICAgIC8vIEJ1dCBpdCBzaG91bGQgbm90IGJlIHRoZSBzcGVjaWFsIG5hbWVkIG9wZXJhdGlvbiBhbmQgdGhlIHNwZWNpYWwgZGlzcGF0Y2hlciBzaG91bGQgbm90Ci0gICAgICAgIC8vIHJldHVybiBudWxsIGZvciBvcGVyYXRpb24gZGlzcGF0Y2gKLSAgICAgICAgT3BlcmF0aW9uRGVzY3JpcHRpb24gb3BEZXNjc1tdID0gaW50ZXJmYWNlRGVzYy5nZXRPcGVyYXRpb25zKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwob3BEZXNjcyk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBvcERlc2NzLmxlbmd0aCk7Ci0gICAgICAgIEF4aXNPcGVyYXRpb24gYXhpc09wZXJhdGlvbiA9IG9wRGVzY3NbMF0uZ2V0QXhpc09wZXJhdGlvbigpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGF4aXNPcGVyYXRpb24pOwotICAgICAgICBpZiAoRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbi5KQVhXU19OT1dTRExfUFJPVklERVJfT1BFUkFUSU9OX05BTUUuZXF1YWxzKGF4aXNPcGVyYXRpb24uZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpKSkgewotICAgICAgICAgICAgZmFpbCgiT3BlcmF0aW9uIGhhcyB0aGUgZ2VuZXJpYyBwcm92aWRlciBuYW1lIik7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIE5vdyB2ZXJpZnkgdGhhdCB0aGUgc3BlY2lhbCBkaXNwYXRoZXIgZG9lc24ndCBmaW5kIHRoZSBzcGVjaWFsIG9wZXJhdGlvbgotICAgICAgICBHZW5lcmljUHJvdmlkZXJEaXNwYXRjaGVyIGRpc3BhdGNoZXIgPSBuZXcgR2VuZXJpY1Byb3ZpZGVyRGlzcGF0Y2hlcigpOwotICAgICAgICBNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBtZXNzYWdlQ29udGV4dC5zZXRBeGlzU2VydmljZShheGlzU3ZjKTsKLSAgICAgICAgCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBUaGUgZGlzcGF0Y2hlciB3aWxsIG5vdCB0cnkgdG8gcmVzb2x2ZSBhbiBBeGlzU2VydmljZQotICAgICAgICAgICAgYXNzZXJ0TnVsbChkaXNwYXRjaGVyLmZpbmRTZXJ2aWNlKG1lc3NhZ2VDb250ZXh0KSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIFRoZSBkaXNwYXRjaGVyIHNob3VsZCBmaW5kIHRoZSBzcGVjaWFsIEF4aXNPcGVyYXRpb24KLSAgICAgICAgICAgIGFzc2VydE51bGwoZGlzcGF0Y2hlci5maW5kT3BlcmF0aW9uKGF4aXNTdmMsIG1lc3NhZ2VDb250ZXh0KSk7Ci0gICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIGV4Y2VwdGlvbiIgKyBlKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICB9Ci19Ci0KLQotLy8gTm90aWNlIG5vIFdTREwgaXMgc3BlY2lmaWVkCi1AV2ViU2VydmljZVByb3ZpZGVyKCkKLUBCaW5kaW5nVHlwZSh2YWx1ZT1IVFRQQmluZGluZy5IVFRQX0JJTkRJTkcpCi1AU2VydmljZU1vZGUodmFsdWU9amF2YXgueG1sLndzLlNlcnZpY2UuTW9kZS5NRVNTQUdFKQotY2xhc3MgSFRUUEJpbmRpbmdQcm92aWRlckltcGwgaW1wbGVtZW50cyBQcm92aWRlcjxTdHJpbmc+IHsKLQotICAgIHB1YmxpYyBTdHJpbmcgaW52b2tlKFN0cmluZyBvYmopIHsKLSAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgCi19Ci0vL05vdGljZSBubyBXU0RMIGlzIHNwZWNpZmllZAotQFdlYlNlcnZpY2VQcm92aWRlcigpCi1jbGFzcyBTT0FQQmluZGluZ1Byb3ZpZGVySW1wbCBpbXBsZW1lbnRzIFByb3ZpZGVyPFN0cmluZz4gewotCi0gICAgcHVibGljIFN0cmluZyBpbnZva2UoU3RyaW5nIG9iaikgewotICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLX0KLQotLy8gU0VJIGJhc2VkIGVuZHBvaW50IHRvIG1ha2Ugc3VyZSBpdCBkb2Vzbid0IGdldCBnZXQgdGhlIHNwZWNpYWwgZ2VuZXJpYyBwcm92aWRlciBvcGVyYXRpb24gYWRkZWQKLUBXZWJTZXJ2aWNlKCkKLWNsYXNzIFNFSUJhc2VkRW5kcG9pbnQgewotICAgIHB1YmxpYyBTdHJpbmcgZWNobygpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyYXBpL1Byb3ZpZGVyVGVzdENhc2UuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlcmFwaS9Qcm92aWRlclRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwMTYwYWIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyYXBpL1Byb3ZpZGVyVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm92aWRlcmFwaTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUHJvdmlkZXJUZXN0Q2FzZSBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHB1YmxpYyBRTmFtZSBwb3J0TmFtZSA9IG5ldyBRTmFtZSgiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIiLCAiU2ltcGxlUHJvdmlkZXJTZXJ2aWNlU09BUDExcG9ydDAiKTsKLSAgICBwdWJsaWMgU3RyaW5nIHByb3ZpZGVyUmVzb3VyY2VEaXIgPSAidGVzdC1yZXNvdXJjZXMiK0ZpbGUuc2VwYXJhdG9yKyJwcm92aWRlciI7Ci0gICAgcHVibGljIFN0cmluZyBpbWFnZVJlc291cmNlRGlyID0gInRlc3QtcmVzb3VyY2VzIitGaWxlLnNlcGFyYXRvcisiaW1hZ2UiOwotICAgIHB1YmxpYyBTdHJpbmcgYmFzZWRpciA9IG51bGw7Ci0gICAgCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJLy9TdGFydFNlcnZlciBzdGFydFNlcnZlciA9IG5ldyBTdGFydFNlcnZlcigic2VydmVyMSIpOwotCQkvL3N0YXJ0U2VydmVyLnRlc3RTdGFydFNlcnZlcigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JCS8vU3RvcFNlcnZlciBzdG9wU2VydmVyID0gbmV3IFN0b3BTZXJ2ZXIoInNlcnZlcjEiKTsKLQkJLy9zdG9wU2VydmVyLnRlc3RTdG9wU2VydmVyKCk7Ci0JfQotCQotICAgIHB1YmxpYyBQcm92aWRlclRlc3RDYXNlKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgICAgICBpZihiYXNlZGlyID09IG51bGwpewotICAgICAgICAgICAgYmFzZWRpciA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiYmFzZWRpciIsIi4iKSkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcHJvdmlkZXJSZXNvdXJjZURpciA9IG5ldyBGaWxlKGJhc2VkaXIsIHByb3ZpZGVyUmVzb3VyY2VEaXIpLmdldEFic29sdXRlUGF0aCgpOwotICAgICAgICBpbWFnZVJlc291cmNlRGlyID0gbmV3IEZpbGUoYmFzZWRpciwgaW1hZ2VSZXNvdXJjZURpcikuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0gICAgfQotICAgIAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlcmFwaS9Tb2FwTWVzc2FnZU1VUHJvdmlkZXJDaGVja2VyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXJhcGkvU29hcE1lc3NhZ2VNVVByb3ZpZGVyQ2hlY2tlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmZlZjlkLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlcmFwaS9Tb2FwTWVzc2FnZU1VUHJvdmlkZXJDaGVja2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnByb3ZpZGVyYXBpOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEhlYWRlckJsb2NrOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0Ow0KLQ0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOw0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQotDQotLyoqDQotICogUGx1Z2luIHRvIHJlbW92ZSAidW5kZXJzdG9vZCIgaGVhZGVycyBmb3IgdGhlIFNvYXBNZXNzYWdlTVVQcm92aWRlclRlc3RzLiAgVGhpcyBjbGFzcyBtdXN0DQotICogYmUgY29uZmlndXJlZCBpbiB0aGUgYXhpczIueG1sIGZpbGUgb24gYm90aCB0aGUgY2xpZW50IGFuZCB0aGUgc2VydmVyLiANCi0gKi8NCi1wdWJsaWMgY2xhc3MgU29hcE1lc3NhZ2VNVVByb3ZpZGVyQ2hlY2tlciBleHRlbmRzIG9yZy5hcGFjaGUuYXhpczIuaGFuZGxlcnMuQWJzdHJhY3RIYW5kbGVyIHsNCi0NCi0gICAgcHVibGljIEludm9jYXRpb25SZXNwb25zZSBpbnZva2UoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdCB7DQotICAgICAgICAvLyBHZXQgdGhlIGxpc3Qgb2YgaGVhZGVycyBmb3IgdGhlIHJvbGVzIHdlJ3JlIGFjdGluZyBpbiwgdGhlbiBtYXJrIGFueSB3ZSB1bmRlcnN0YW5kDQotICAgICAgICAvLyBhcyBwcm9jZXNzZWQuDQotICAgICAgICBTT0FQRW52ZWxvcGUgZW52ZWxvcGUgPSBtc2dDb250ZXh0LmdldEVudmVsb3BlKCk7DQotICAgICAgICBpZiAoZW52ZWxvcGUuZ2V0SGVhZGVyKCkgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiBJbnZvY2F0aW9uUmVzcG9uc2UuQ09OVElOVUU7DQotICAgICAgICB9DQotICAgICAgICAvLyBUaGVzZSBhcmUgdGhlIGhlYWRlcnMgdGhlIHRlc3QgZXhwZWN0cyB0byBiZSB1bmRlcnN0b29kDQotICAgICAgICBTdHJpbmcgbnMxID0gImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyIjsNCi0gICAgICAgIFN0cmluZyBjbGllbnRMb2NhbE5hbWUgPSAibXVjbGllbnR1bmRlcnN0b29kIjsNCi0gICAgICAgIFN0cmluZyBzZXJ2ZXJMb2NhbE5hbWUgPSAibXVzZXJ2ZXJ1bmRlcnN0b29kIjsNCi0NCi0gICAgICAgIFFOYW1lIGNsaWVudFFOID0gbmV3IFFOYW1lKG5zMSwgY2xpZW50TG9jYWxOYW1lKTsNCi0gICAgICAgIFFOYW1lIHNlcnZlclFOID0gbmV3IFFOYW1lKG5zMSwgc2VydmVyTG9jYWxOYW1lKTsNCi0NCi0gICAgICAgIEl0ZXJhdG9yIGhlYWRlckJsb2NrcyA9IGVudmVsb3BlLmdldEhlYWRlcigpLmdldEhlYWRlcnNUb1Byb2Nlc3MobnVsbCk7DQotICAgICAgICB3aGlsZSAoaGVhZGVyQmxvY2tzLmhhc05leHQoKSkgew0KLSAgICAgICAgICAgIFNPQVBIZWFkZXJCbG9jayBoZWFkZXJCbG9jayA9IChTT0FQSGVhZGVyQmxvY2spIGhlYWRlckJsb2Nrcy5uZXh0KCk7DQotICAgICAgICAgICAgUU5hbWUgaGVhZGVyUU4gPSBoZWFkZXJCbG9jay5nZXRRTmFtZSgpOw0KLSAgICAgICAgICAgIGlmIChjbGllbnRRTi5lcXVhbHMoaGVhZGVyUU4pKSB7DQotLy8gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJNYXJraW5nIGFzIHByb2Nlc3NlZCBDTElFTlQgUU46ICIgKyBjbGllbnRRTik7DQotICAgICAgICAgICAgICAgIGhlYWRlckJsb2NrLnNldFByb2Nlc3NlZCgpOw0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VydmVyUU4uZXF1YWxzKGhlYWRlclFOKSkgew0KLS8vICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTWFya2luZyBhcyBwcm9jZXNzZWQgU0VSVkVSIFFOOiAiICsgc2VydmVyUU4pOw0KLSAgICAgICAgICAgICAgICBoZWFkZXJCbG9jay5zZXRQcm9jZXNzZWQoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gSW52b2NhdGlvblJlc3BvbnNlLkNPTlRJTlVFOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zZXJ2ZXIvSkFYV1NTZXJ2ZXJUZXN0cy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NlcnZlci9KQVhXU1NlcnZlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViOTYzNzUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NlcnZlci9KQVhXU1NlcnZlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zZXJ2ZXI7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLk1lc3NhZ2VDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnJlZ2lzdHJ5Lkludm9jYXRpb25MaXN0ZW5lclJlZ2lzdHJ5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotcHVibGljIGNsYXNzIEpBWFdTU2VydmVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7DQotICAgIA0KLSAgICBJbnZvY2F0aW9uTGlzdGVuZXJGYWN0b3J5IGZhYzEgPSBuZXcgVGVzdEludm9jYXRpb25Qcm9jZXNzb3JGYWN0b3J5MSgpOw0KLSAgICBJbnZvY2F0aW9uTGlzdGVuZXJGYWN0b3J5IGZhYzIgPSBuZXcgVGVzdEludm9jYXRpb25Qcm9jZXNzb3JGYWN0b3J5MigpOw0KLSAgICANCi0gICAgcHVibGljIHZvaWQgc2V0VXAoKSB7DQotICAgICAgICBJbnZvY2F0aW9uTGlzdGVuZXJSZWdpc3RyeS5hZGRGYWN0b3J5KGZhYzEpOw0KLSAgICAgICAgSW52b2NhdGlvbkxpc3RlbmVyUmVnaXN0cnkuYWRkRmFjdG9yeShmYWMyKTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFRoaXMgdmVyaWZpZXMgdGhhdCBtdWx0aXBsZSBJbnZvY2F0aW9uUHJvY2Vzc29yRmFjdG9yaWVzIGNhbiBiZQ0KLSAgICAgKiByZWdpc3RlcmVkIHdpdGggdGhlIEZhY3RvcnlSZWdpc3RyeS4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZWdpc3RlckZhY3RvcmllcygpIHsNCi0gICAgICAgIENvbGxlY3Rpb248SW52b2NhdGlvbkxpc3RlbmVyRmFjdG9yeT4gZmFjdG9yaWVzID0gSW52b2NhdGlvbkxpc3RlbmVyUmVnaXN0cnkuZ2V0RmFjdG9yaWVzKCk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKGZhY3Rvcmllcyk7DQotICAgICAgICBhc3NlcnRFcXVhbHMoZmFjdG9yaWVzLnNpemUoKSwgMik7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBUaGlzIHdpbGwgdmVyaWZ5IHRoYXQgdGhlIEpBWFdTTWVzc2FnZVJlY2VpdmVyIGlzIGFibGUgdG8gZmluZCBhbmQNCi0gICAgICogc3RvcmUgSW52b2NhdGlvblByb2Nlc3NvckZhY3RvcmllcyBvbiB0aGUgRW5kcG9pbnRJbnZvY2F0aW9uQ29udGV4dC4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRGYWN0b3JpZXNUb0VJQygpIHsNCi0gICAgICAgIEVuZHBvaW50SW52b2NhdGlvbkNvbnRleHQgZWljID0gbmV3IEVuZHBvaW50SW52b2NhdGlvbkNvbnRleHRJbXBsKCk7DQotICAgICAgICBKQVhXU01lc3NhZ2VSZWNlaXZlciByZWNlaXZlciA9IG5ldyBKQVhXU01lc3NhZ2VSZWNlaXZlcigpOw0KLSAgICAgICAgcmVjZWl2ZXIuYWRkSW52b2NhdGlvbkxpc3RlbmVyRmFjdG9yaWVzKGVpYyk7DQotICAgICAgICBDb2xsZWN0aW9uPEludm9jYXRpb25MaXN0ZW5lckZhY3Rvcnk+IGZhY3RvcmllcyA9IGVpYy5nZXRJbnZvY2F0aW9uTGlzdGVuZXJGYWN0b3JpZXMoKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwoZmFjdG9yaWVzKTsNCi0gICAgICAgIGFzc2VydEVxdWFscyhmYWN0b3JpZXMuc2l6ZSgpLCAyKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogVGhpcyB3aWxsIHRlc3RzIHRoYXQgcmVnaXN0ZXJlZCBJbnZvY2F0aW9uTGlzdGVuZXJzIGFyZSBwcm9wZXJseSBjYWxsZWQNCi0gICAgICogYnkgdGhlIEpBWC1XUyBzZXJ2ZXItc2lkZSBjb2RlLiBUaGlzIHRlc3QgYXBwcm94aW1hdGVzIGEgc3luY2hyb25vdXMNCi0gICAgICogbWVzc2FnZSByZXF1ZXN0DQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3luY0ludm9jYXRpb25MaXN0ZW5lcigpIHsNCi0gICAgICAgIEVuZHBvaW50Q29udHJvbGxlciBjb250cm9sbGVyID0gbmV3IEVuZHBvaW50Q29udHJvbGxlcigpOw0KLSAgICAgICAgRW5kcG9pbnRJbnZvY2F0aW9uQ29udGV4dCBlaWMgPSBuZXcgRW5kcG9pbnRJbnZvY2F0aW9uQ29udGV4dEltcGwoKTsNCi0gICAgICAgIE1lc3NhZ2VDb250ZXh0IHJlcXVlc3QgPSBuZXcgTWVzc2FnZUNvbnRleHQoKTsNCi0gICAgICAgIE1lc3NhZ2VDb250ZXh0IHJlc3BvbnNlID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7DQotICAgICAgICBlaWMuc2V0UmVxdWVzdE1lc3NhZ2VDb250ZXh0KHJlcXVlc3QpOw0KLSAgICAgICAgZWljLnNldFJlc3BvbnNlTWVzc2FnZUNvbnRleHQocmVzcG9uc2UpOw0KLSAgICAgICAgSkFYV1NNZXNzYWdlUmVjZWl2ZXIgcmVjZWl2ZXIgPSBuZXcgSkFYV1NNZXNzYWdlUmVjZWl2ZXIoKTsNCi0gICAgICAgIHJlY2VpdmVyLmFkZEludm9jYXRpb25MaXN0ZW5lckZhY3RvcmllcyhlaWMpOw0KLSAgICAgICAgY29udHJvbGxlci5yZXF1ZXN0UmVjZWl2ZWQoZWljKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwocmVxdWVzdC5nZXRQcm9wZXJ0eSgicmVxdWVzdFJlY2VpdmVkIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgoQm9vbGVhbikgcmVxdWVzdC5nZXRQcm9wZXJ0eSgicmVxdWVzdFJlY2VpdmVkIikpOw0KLSAgICAgICAgY29udHJvbGxlci5yZXNwb25zZVJlYWR5KGVpYyk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3BvbnNlLmdldFByb3BlcnR5KCJyZXNwb25zZVJlYWR5IikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgoQm9vbGVhbikgcmVzcG9uc2UuZ2V0UHJvcGVydHkoInJlc3BvbnNlUmVhZHkiKSk7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBUaGlzIHdpbGwgdGVzdHMgdGhhdCByZWdpc3RlcmVkIEludm9jYXRpb25MaXN0ZW5lcnMgYXJlIHByb3Blcmx5IGNhbGxlZA0KLSAgICAgKiBieSB0aGUgSkFYLVdTIHNlcnZlci1zaWRlIGNvZGUuIFRoaXMgdGVzdCBhcHByb3hpbWF0ZXMgYW4gYXN5bmNocm9ub3VzDQotICAgICAqIG1lc3NhZ2UgcmVxdWVzdA0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdEFzeW5jSW52b2NhdGlvbkxpc3RlbmVyKCkgew0KLSAgICAgICAgRW5kcG9pbnRDb250cm9sbGVyIGNvbnRyb2xsZXIgPSBuZXcgRW5kcG9pbnRDb250cm9sbGVyKCk7DQotICAgICAgICBFbmRwb2ludENhbGxiYWNrIGNhbGxiYWNrID0gbmV3IEVuZHBvaW50Q2FsbGJhY2soKTsNCi0gICAgICAgIEVuZHBvaW50SW52b2NhdGlvbkNvbnRleHQgZWljID0gbmV3IEVuZHBvaW50SW52b2NhdGlvbkNvbnRleHRJbXBsKCk7DQotICAgICAgICBNZXNzYWdlQ29udGV4dCByZXF1ZXN0ID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7DQotICAgICAgICBNZXNzYWdlQ29udGV4dCByZXNwb25zZSA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOw0KLSAgICAgICAgZWljLnNldFJlcXVlc3RNZXNzYWdlQ29udGV4dChyZXF1ZXN0KTsNCi0gICAgICAgIGVpYy5zZXRSZXNwb25zZU1lc3NhZ2VDb250ZXh0KHJlc3BvbnNlKTsNCi0gICAgICAgIEpBWFdTTWVzc2FnZVJlY2VpdmVyIHJlY2VpdmVyID0gbmV3IEpBWFdTTWVzc2FnZVJlY2VpdmVyKCk7DQotICAgICAgICByZWNlaXZlci5hZGRJbnZvY2F0aW9uTGlzdGVuZXJGYWN0b3JpZXMoZWljKTsNCi0gICAgICAgIGNvbnRyb2xsZXIucmVxdWVzdFJlY2VpdmVkKGVpYyk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHJlcXVlc3QuZ2V0UHJvcGVydHkoInJlcXVlc3RSZWNlaXZlZCIpKTsNCi0gICAgICAgIGFzc2VydFRydWUoKEJvb2xlYW4pIHJlcXVlc3QuZ2V0UHJvcGVydHkoInJlcXVlc3RSZWNlaXZlZCIpKTsNCi0gICAgICAgIGNhbGxiYWNrLnJlc3BvbnNlUmVhZHkoZWljKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwocmVzcG9uc2UuZ2V0UHJvcGVydHkoInJlc3BvbnNlUmVhZHkiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKChCb29sZWFuKSByZXNwb25zZS5nZXRQcm9wZXJ0eSgicmVzcG9uc2VSZWFkeSIpKTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFRoaXMgd2lsbCB0ZXN0IHRoYXQgZXhjZXB0aW9ucyBhcmUgcHJvcGVybHkgaGFuZGVkIGRvd24gdG8gdGhlIHJlZ2lzdGVyZWQNCi0gICAgICogaW5zdGFuY2VzIG9mIEludm9jYXRpb25MaXN0ZW5lciBvYmplY3RzLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdEhhbmRsZUV4Y2VwdGlvbigpIHsNCi0gICAgICAgIEVuZHBvaW50Q29udHJvbGxlciBjb250cm9sbGVyID0gbmV3IEVuZHBvaW50Q29udHJvbGxlcigpOw0KLSAgICAgICAgRW5kcG9pbnRDYWxsYmFjayBjYWxsYmFjayA9IG5ldyBFbmRwb2ludENhbGxiYWNrKCk7DQotICAgICAgICBFbmRwb2ludEludm9jYXRpb25Db250ZXh0IGVpYyA9IG5ldyBFbmRwb2ludEludm9jYXRpb25Db250ZXh0SW1wbCgpOw0KLSAgICAgICAgTWVzc2FnZUNvbnRleHQgcmVxdWVzdCA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOw0KLSAgICAgICAgZWljLnNldFJlcXVlc3RNZXNzYWdlQ29udGV4dChyZXF1ZXN0KTsNCi0gICAgICAgIGVpYy5hZGRJbnZvY2F0aW9uTGlzdGVuZXIobmV3IFRlc3RJbnZvY2F0aW9uTGlzdGVuZXIoKSk7DQotICAgICAgICBFeGNlcHRpb24gZSA9IG5ldyBFeGNlcHRpb24oKTsNCi0gICAgICAgIEludm9jYXRpb25IZWxwZXIuY2FsbExpc3RlbmVyc0ZvckV4Y2VwdGlvbihlLCBlaWMpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXF1ZXN0LmdldFByb3BlcnR5KG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc3BpLkNvbnN0YW50cy5NQVBQRURfRVhDRVBUSU9OKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIG5vdyB0ZXN0IHRoYXQgaW4gdGhlIGNhc2UgdGhpcyBoYXBwZW5zIG9uIGEgcmVzcG9uc2UsIHdlIHNldCB2YWx1ZXMgDQotICAgICAgICAvLyBvbiB0aGUgcmVzcG9uc2UgbWVzc2FnZSBjb250ZXh0DQotICAgICAgICBNZXNzYWdlQ29udGV4dCByZXNwb25zZSA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOw0KLSAgICAgICAgZWljLnNldFJlc3BvbnNlTWVzc2FnZUNvbnRleHQocmVzcG9uc2UpOw0KLSAgICAgICAgZWljLmFkZEludm9jYXRpb25MaXN0ZW5lcihuZXcgVGVzdEludm9jYXRpb25MaXN0ZW5lcigpKTsNCi0gICAgICAgIGUgPSBuZXcgRXhjZXB0aW9uKCk7DQotICAgICAgICBJbnZvY2F0aW9uSGVscGVyLmNhbGxMaXN0ZW5lcnNGb3JFeGNlcHRpb24oZSwgZWljKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwocmVzcG9uc2UuZ2V0UHJvcGVydHkob3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zcGkuQ29uc3RhbnRzLk1BUFBFRF9FWENFUFRJT04pKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gbm93IHRlc3QgdGhlIEludm9jYXRpb25IZWxwZXIgbWV0aG9kIHRoYXQgYWNjZXB0cyBhIHRocm93YWJsZSBhbmQNCi0gICAgICAgIC8vIE1lc3NhZ2VDb250ZXh0DQotICAgICAgICBjb250cm9sbGVyID0gbmV3IEVuZHBvaW50Q29udHJvbGxlcigpOw0KLSAgICAgICAgY2FsbGJhY2sgPSBuZXcgRW5kcG9pbnRDYWxsYmFjaygpOw0KLSAgICAgICAgZWljID0gbmV3IEVuZHBvaW50SW52b2NhdGlvbkNvbnRleHRJbXBsKCk7DQotICAgICAgICByZXF1ZXN0ID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7DQotICAgICAgICBlaWMuc2V0UmVxdWVzdE1lc3NhZ2VDb250ZXh0KHJlcXVlc3QpOw0KLSAgICAgICAgZWljLmFkZEludm9jYXRpb25MaXN0ZW5lcihuZXcgVGVzdEludm9jYXRpb25MaXN0ZW5lcigpKTsNCi0gICAgICAgIGUgPSBuZXcgRXhjZXB0aW9uKCk7DQotICAgICAgICByZXF1ZXN0LnNldFByb3BlcnR5KG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc3BpLkNvbnN0YW50cy5JTlZPQ0FUSU9OX0xJU1RFTkVSX0xJU1QsIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlaWMuZ2V0SW52b2NhdGlvbkxpc3RlbmVycygpKTsNCi0gICAgICAgIEludm9jYXRpb25IZWxwZXIuY2FsbExpc3RlbmVyc0ZvckV4Y2VwdGlvbihlLCByZXF1ZXN0KTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwocmVxdWVzdC5nZXRQcm9wZXJ0eShvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNwaS5Db25zdGFudHMuTUFQUEVEX0VYQ0VQVElPTikpOw0KLSAgICAgICAgDQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBUaGlzIHRlc3Qgd2lsbCB2ZXJpZnkgdGhhdCB0aGUgSW52b2NhdGlvbkhlbHBlci5kZXRlcm1pbmVNYXBwZWRFeGNlcHRpb24gbWV0aG9kIGlzIA0KLSAgICAgKiBjYXBhYmxlIG9mIGNvcnJlY3RseSBpZGVudGlmeWluZyB0aGUgbWV0aG9kIHRvIGJlIHRocm93biBvbiB0aGUgc2VydmVyLXNpZGUuDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGV0ZXJtaW5lRXhjZXB0aW9uKCkgew0KLSAgICAgICAgDQotICAgICAgICAvLyB0ZXN0IHRoZSBzaWduYXR1cmUgb2YgZGV0ZXJtaW5lTWFwcGVkRXhjZXB0aW9uIHRoYXQgdGFrZXMgYW4gRW5kcG9pbnRJbnZvY2F0aW9uQ29udGV4dA0KLSAgICAgICAgRW5kcG9pbnRDb250cm9sbGVyIGNvbnRyb2xsZXIgPSBuZXcgRW5kcG9pbnRDb250cm9sbGVyKCk7DQotICAgICAgICBFbmRwb2ludEludm9jYXRpb25Db250ZXh0IGVpYyA9IG5ldyBFbmRwb2ludEludm9jYXRpb25Db250ZXh0SW1wbCgpOw0KLSAgICAgICAgTWVzc2FnZUNvbnRleHQgcmVxdWVzdCA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOw0KLSAgICAgICAgZWljLnNldFJlcXVlc3RNZXNzYWdlQ29udGV4dChyZXF1ZXN0KTsNCi0gICAgICAgIGVpYy5hZGRJbnZvY2F0aW9uTGlzdGVuZXIobmV3IFRlc3RJbnZvY2F0aW9uTGlzdGVuZXIoKSk7DQotICAgICAgICBUaHJvd2FibGUgdCA9IEludm9jYXRpb25IZWxwZXIuZGV0ZXJtaW5lTWFwcGVkRXhjZXB0aW9uKG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKSwgZWljKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwodCk7DQotICAgICAgICBhc3NlcnRUcnVlKHQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkuZXF1YWxzKE51bGxQb2ludGVyRXhjZXB0aW9uLmNsYXNzLmdldE5hbWUoKSkpOw0KLSAgICAgICAgDQotICAgICAgICAvLyB0ZXN0IHRoZSBzaWduYXR1cmUgb2YgZGV0ZXJtaW5lTWFwcGVkRXhjZXB0aW9uIHRoYXQgdGFrZXMgYSBNZXNzYWdlQ29udGV4dA0KLSAgICAgICAgY29udHJvbGxlciA9IG5ldyBFbmRwb2ludENvbnRyb2xsZXIoKTsNCi0gICAgICAgIHJlcXVlc3QgPSBuZXcgTWVzc2FnZUNvbnRleHQoKTsNCi0gICAgICAgIGVpYy5zZXRSZXF1ZXN0TWVzc2FnZUNvbnRleHQocmVxdWVzdCk7DQotICAgICAgICBMaXN0PEludm9jYXRpb25MaXN0ZW5lcj4gaW52b2NhdGlvbkxpc3RlbmVycyA9IG5ldyBBcnJheUxpc3Q8SW52b2NhdGlvbkxpc3RlbmVyPigpOw0KLSAgICAgICAgaW52b2NhdGlvbkxpc3RlbmVycy5hZGQobmV3IFRlc3RJbnZvY2F0aW9uTGlzdGVuZXIoKSk7DQotICAgICAgICByZXF1ZXN0LnNldFByb3BlcnR5KG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc3BpLkNvbnN0YW50cy5JTlZPQ0FUSU9OX0xJU1RFTkVSX0xJU1QsIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZvY2F0aW9uTGlzdGVuZXJzKTsNCi0gICAgICAgIHQgPSBJbnZvY2F0aW9uSGVscGVyLmRldGVybWluZU1hcHBlZEV4Y2VwdGlvbihuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCksIHJlcXVlc3QpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh0KTsNCi0gICAgICAgIGFzc2VydFRydWUodC5nZXRDbGFzcygpLmdldE5hbWUoKS5lcXVhbHMoTnVsbFBvaW50ZXJFeGNlcHRpb24uY2xhc3MuZ2V0TmFtZSgpKSk7DQotICAgIH0NCi0gICAgDQotICAgIHN0YXRpYyBjbGFzcyBUZXN0SW52b2NhdGlvblByb2Nlc3NvckZhY3RvcnkxIGltcGxlbWVudHMgSW52b2NhdGlvbkxpc3RlbmVyRmFjdG9yeSB7DQotICAgICAgICBwdWJsaWMgSW52b2NhdGlvbkxpc3RlbmVyIGNyZWF0ZUludm9jYXRpb25MaXN0ZW5lcihNZXNzYWdlQ29udGV4dCBjb250ZXh0KSB7DQotICAgICAgICAgICAgcmV0dXJuIG5ldyBUZXN0SW52b2NhdGlvbkxpc3RlbmVyKCk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIHN0YXRpYyBjbGFzcyBUZXN0SW52b2NhdGlvblByb2Nlc3NvckZhY3RvcnkyIGltcGxlbWVudHMgSW52b2NhdGlvbkxpc3RlbmVyRmFjdG9yeSB7DQotICAgICAgICBwdWJsaWMgSW52b2NhdGlvbkxpc3RlbmVyIGNyZWF0ZUludm9jYXRpb25MaXN0ZW5lcihNZXNzYWdlQ29udGV4dCBjb250ZXh0KSB7DQotICAgICAgICAgICAgcmV0dXJuIG5ldyBUZXN0SW52b2NhdGlvbkxpc3RlbmVyKCk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIA0KLSAgICBzdGF0aWMgY2xhc3MgVGVzdEludm9jYXRpb25MaXN0ZW5lciBpbXBsZW1lbnRzIEludm9jYXRpb25MaXN0ZW5lciB7DQotICAgICAgICANCi0gICAgICAgIHB1YmxpYyB2b2lkIG5vdGlmeShJbnZvY2F0aW9uTGlzdGVuZXJCZWFuIGJlYW4pIHsNCi0gICAgICAgICAgICBpZihiZWFuLmdldFN0YXRlKCkuZXF1YWxzKEludm9jYXRpb25MaXN0ZW5lckJlYW4uU3RhdGUuUkVRVUVTVCkpIHsNCi0gICAgICAgICAgICAgICAgYmVhbi5nZXRFbmRwb2ludEludm9jYXRpb25Db250ZXh0KCkuZ2V0UmVxdWVzdE1lc3NhZ2VDb250ZXh0KCkuDQotICAgICAgICAgICAgICAgICAgICBzZXRQcm9wZXJ0eSgicmVxdWVzdFJlY2VpdmVkIiwgdHJ1ZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UgaWYgKGJlYW4uZ2V0U3RhdGUoKS5lcXVhbHMoSW52b2NhdGlvbkxpc3RlbmVyQmVhbi5TdGF0ZS5SRVNQT05TRSkpew0KLSAgICAgICAgICAgICAgICBiZWFuLmdldEVuZHBvaW50SW52b2NhdGlvbkNvbnRleHQoKS5nZXRSZXNwb25zZU1lc3NhZ2VDb250ZXh0KCkuDQotICAgICAgICAgICAgICAgICAgICBzZXRQcm9wZXJ0eSgicmVzcG9uc2VSZWFkeSIsIHRydWUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgcHVibGljIHZvaWQgbm90aWZ5T25FeGNlcHRpb24oSW52b2NhdGlvbkxpc3RlbmVyQmVhbiBiZWFuKSB7DQotICAgICAgICAgICAgaWYoYmVhbi5nZXRTdGF0ZSgpLmVxdWFscyhJbnZvY2F0aW9uTGlzdGVuZXJCZWFuLlN0YXRlLlJFUVVFU1QpKSB7DQotICAgICAgICAgICAgICAgIGJlYW4uZ2V0RW5kcG9pbnRJbnZvY2F0aW9uQ29udGV4dCgpLmdldFJlcXVlc3RNZXNzYWdlQ29udGV4dCgpLg0KLSAgICAgICAgICAgICAgICAgICAgc2V0UHJvcGVydHkob3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zcGkuQ29uc3RhbnRzLk1BUFBFRF9FWENFUFRJT04sIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlIGlmIChiZWFuLmdldFN0YXRlKCkuZXF1YWxzKEludm9jYXRpb25MaXN0ZW5lckJlYW4uU3RhdGUuUkVTUE9OU0UpKXsNCi0gICAgICAgICAgICAgICAgYmVhbi5nZXRFbmRwb2ludEludm9jYXRpb25Db250ZXh0KCkuZ2V0UmVzcG9uc2VNZXNzYWdlQ29udGV4dCgpLg0KLSAgICAgICAgICAgICAgICAgICAgc2V0UHJvcGVydHkob3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zcGkuQ29uc3RhbnRzLk1BUFBFRF9FWENFUFRJT04sIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc3BpL0JpbmRpbmdQcm92aWRlclRlc3RzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc3BpL0JpbmRpbmdQcm92aWRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyZTIyZjAuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NwaS9CaW5kaW5nUHJvdmlkZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNwaTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkVuZHBvaW50RGVzY3JpcHRpb247Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC53cy5EaXNwYXRjaDsKLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsKLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5TT0FQQmluZGluZzsKLQotLyoqCi0gKiBUaGUgY2xpZW50IEFQSXMgc2hvdWxkIGVhY2ggaW1wbGVtZW50IHRoZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNwaS5CaW5kaW5nUHJvdmlkZXIKLSAqIGludGVyZmFjZS4gIFRoaXMgc3VpdGUgc2hvdWxkIGJlIHVzZWQgZm9yIGFueSBjbGllbnQgQVBJcyB0byB2ZXJpZnkgdGhhdCB0aGV5IAotICogbWFpbnRhaW4gdGhhdCBiZWhhdmlvci4gCi0gKi8KLXB1YmxpYyBjbGFzcyBCaW5kaW5nUHJvdmlkZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICAKLSAgICBwdWJsaWMgUU5hbWUgc2VydmljZVFOYW1lOwotICAgIHB1YmxpYyBRTmFtZSBwb3J0UU5hbWU7Ci0gICAgCi0gICAgcHVibGljIEJpbmRpbmdQcm92aWRlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgICAgICAKLSAgICAgICAgc2VydmljZVFOYW1lID0gbmV3IFFOYW1lKCJodHRwOi8vdGVzdCIsICJUZXN0U2VydmljZSIpOwotICAgICAgICBwb3J0UU5hbWUgPSBuZXcgUU5hbWUoImh0dHA6Ly90ZXN0IiwgIlRlc3RQb3J0Iik7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEEgdGVzdCB0byB2ZXJpZnkgdGhhdCB0aGUgRGlzcGF0Y2ggb2JqZWN0cyBpbXBsZW1lbnQgdGhlIHByb3BlciBpbnRlcmZhY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGlzcHRhY2hCaW5kaW5nUHJvdmlkZXJTUEkoKSB7Ci0gICAgICAgIFNlcnZpY2Ugc3ZjID0gU2VydmljZS5jcmVhdGUoc2VydmljZVFOYW1lKTsKLSAgICAgICAgc3ZjLmFkZFBvcnQocG9ydFFOYW1lLCBTT0FQQmluZGluZy5TT0FQMTFIVFRQX0JJTkRJTkcsICIiKTsKLSAgICAgICAgCi0gICAgICAgIERpc3BhdGNoIGRzcCA9IHN2Yy5jcmVhdGVEaXNwYXRjaChwb3J0UU5hbWUsIFNvdXJjZS5jbGFzcywgU2VydmljZS5Nb2RlLk1FU1NBR0UpOwotICAgICAgICAKLSAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGNhbiBjYXN0IHRoZSBvYmplY3QgdG8gdGhlIHJpZ2h0IGludGVyZmFjZXMKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIERpc3BhdGNoIG9iamVjdCBzaG91bGQgYWxzbyBiZSBhIGphdmF4LnhtbC53cy5CaW5kaW5nUHJvdmlkZXIiLCAKLSAgICAgICAgICAgICAgICAoZHNwIGluc3RhbmNlb2YgamF2YXgueG1sLndzLkJpbmRpbmdQcm92aWRlcikpOwotICAgICAgICBhc3NlcnRUcnVlKCJUaGUgRGlzcGF0Y2ggb2JqZWN0IHNob3VsZCBhbHNvIGJlIGEgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zcGkuQmluZGluZ1Byb3ZpZGVyIiwgCi0gICAgICAgICAgICAgICAgZHNwIGluc3RhbmNlb2Ygb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zcGkuQmluZGluZ1Byb3ZpZGVyKTsKLSAgICAgICAgCi0gICAgICAgIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc3BpLkJpbmRpbmdQcm92aWRlciBicCA9IChvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNwaS5CaW5kaW5nUHJvdmlkZXIpIGRzcDsKLSAgICAgICAgCi0gICAgICAgIFNlcnZpY2VEZWxlZ2F0ZSBzZCA9IGJwLmdldFNlcnZpY2VEZWxlZ2F0ZSgpOwotICAgICAgICBhc3NlcnRUcnVlKCJUaGUgU2VydmljZURlc2NyaXB0aW9uIHdhcyBudWxsIiwgc2QgIT0gbnVsbCk7Ci0gICAgICAgIAotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVkID0gYnAuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbigpOwotICAgICAgICBhc3NlcnRUcnVlKCJUaGUgRW5kcG9pbnREZXNjcmlwdGlvbiB3YXMgbnVsbCIsIGVkICE9IG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEEgdGVzdCB0byB2ZXJpZnkgdGhhdCB0aGUgcHJveHkgb2JqZWN0cyBpbXBsZW1lbnQgdGhlIHByb3BlciBpbnRlcmZhY2UuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFByb3h5QmluZGluZ1Byb3ZpZGVyU1BJKCkgewotICAgICAgICBTZXJ2aWNlIHN2YyA9IFNlcnZpY2UuY3JlYXRlKHNlcnZpY2VRTmFtZSk7Ci0gICAgICAgIFNhbXBsZSBzID0gc3ZjLmdldFBvcnQoU2FtcGxlLmNsYXNzKTsKLSAgICAgICAgCi0gICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBjYW4gY2FzdCB0aGUgb2JqZWN0IHRvIHRoZSByaWdodCBpbnRlcmZhY2VzCi0gICAgICAgIGFzc2VydFRydWUoIlRoZSBQcm94eSBvYmplY3Qgc2hvdWxkIGFsc28gYmUgYSBqYXZheC54bWwud3MuQmluZGluZ1Byb3ZpZGVyIiwKLSAgICAgICAgICAgICAgICBzIGluc3RhbmNlb2YgamF2YXgueG1sLndzLkJpbmRpbmdQcm92aWRlcik7Ci0gICAgICAgIGFzc2VydFRydWUoIlRoZSBQcm94eSBvYmplY3Qgc2hvdWxkIGFsc28gYmUgYSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNwaS5CaW5kaW5nUHJvdmlkZXIiLAotICAgICAgICAgICAgICAgIHMgaW5zdGFuY2VvZiBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNwaS5CaW5kaW5nUHJvdmlkZXIpOwotICAgICAgICAKLSAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zcGkuQmluZGluZ1Byb3ZpZGVyIGJwID0gKG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc3BpLkJpbmRpbmdQcm92aWRlcikgczsKLSAgICAgICAgCi0gICAgICAgIFNlcnZpY2VEZWxlZ2F0ZSBzZCA9IGJwLmdldFNlcnZpY2VEZWxlZ2F0ZSgpOwotICAgICAgICBhc3NlcnRUcnVlKCJUaGUgU2VydmljZURlc2NyaXB0aW9uIHdhcyBudWxsIiwgc2QgIT0gbnVsbCk7Ci0gICAgICAgIAotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVkID0gYnAuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbigpOwotICAgICAgICBhc3NlcnRUcnVlKCJUaGUgRW5kcG9pbnREZXNjcmlwdGlvbiB3YXMgbnVsbCIsIGVkICE9IG51bGwpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zcGkvQ2xpZW50TWV0YWRhdGFIYW5kbGVyQ2hhaW5IYW5kbGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc3BpL0NsaWVudE1ldGFkYXRhSGFuZGxlckNoYWluSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmMxM2NmLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zcGkvQ2xpZW50TWV0YWRhdGFIYW5kbGVyQ2hhaW5IYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNwaTsNCi0NCi1pbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuTWVzc2FnZUNvbnRleHQ7DQotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLnNvYXAuU09BUE1lc3NhZ2VDb250ZXh0Ow0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLQ0KLS8qDQotICogWW91IGNhbid0IGFjdHVhbGx5IHNwZWNpZnkgd2hldGhlciBhIGhhbmRsZXIgaXMgZm9yIGNsaWVudCBvciBzZXJ2ZXIsDQotICogeW91IGp1c3QgaGF2ZSB0byBjaGVjayBpbiB0aGUgaGFuZGxlTWVzc2FnZSBhbmQvb3IgaGFuZGxlRmF1bHQgdG8gbWFrZQ0KLSAqIHN1cmUgd2hhdCBkaXJlY3Rpb24gd2UncmUgZ29pbmcuDQotICovDQotDQotcHVibGljIGNsYXNzIENsaWVudE1ldGFkYXRhSGFuZGxlckNoYWluSGFuZGxlciBpbXBsZW1lbnRzIGphdmF4LnhtbC53cy5oYW5kbGVyLnNvYXAuU09BUEhhbmRsZXI8U09BUE1lc3NhZ2VDb250ZXh0PiB7DQotDQotICAgIHB1YmxpYyB2b2lkIGNsb3NlKE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2Vjb250ZXh0KSB7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaGFuZGxlRmF1bHQoU09BUE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2Vjb250ZXh0KSB7DQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU2V0IGdldEhlYWRlcnMoKSB7DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYW5kbGVNZXNzYWdlKFNPQVBNZXNzYWdlQ29udGV4dCBtZXNzYWdlY29udGV4dCkgew0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NwaS9DbGllbnRNZXRhZGF0YUhhbmRsZXJDaGFpblRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zcGkvQ2xpZW50TWV0YWRhdGFIYW5kbGVyQ2hhaW5UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2NzcyNDIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NwaS9DbGllbnRNZXRhZGF0YUhhbmRsZXJDaGFpblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNwaTsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmltcGwuRGVzY3JpcHRpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi54bWwuaGFuZGxlci5IYW5kbGVyQ2hhaW5zVHlwZTsNCi0NCi1pbXBvcnQgamF2YXguandzLkhhbmRsZXJDaGFpbjsNCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUNsaWVudDsNCi1pbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuSGFuZGxlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuSGFuZGxlclJlc29sdmVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5Qb3J0SW5mbzsNCi1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuU09BUEJpbmRpbmc7DQotaW1wb3J0IGphdmEuaW8uRmlsZTsNCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLS8qKg0KLSAqIFZlcmlmeSB0aGF0IGhhbmRsZXIgY2hhaW5zIHNwZWNpZmllZCB1c2luZyB0aGUgSGFuZGxlckNoYWluc1R5cGUgaW4gYSBzcGFyc2UNCi0gKiBjb21wb3NpdGUgYXJlIGNvcnJlY3RseSBhcHBsaWVkIHRvIFNlcnZpY2VzIGFuZCBQb3J0cyBvbiB0aGUgY2xpZW50IHJlcXVlc3Rlci4gDQotICovDQotcHVibGljIGNsYXNzIENsaWVudE1ldGFkYXRhSGFuZGxlckNoYWluVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsNCi0gICAgDQotICAgIHN0YXRpYyBTdHJpbmcgbmFtZXNwYWNlVVJJID0gImh0dHA6Ly93d3cuYXBhY2hlLm9yZy90ZXN0L25hbWVzcGFjZSI7DQotICAgIHN0YXRpYyBTdHJpbmcgc3ZjTG9jYWxQYXJ0ID0gIkR1bW15U2VydmljZSI7DQotICAgIHN0YXRpYyBwcml2YXRlIFN0cmluZyBwb3J0TG9jYWxQYXJ0ID0gIkR1bW15UG9ydCI7DQotICAgIHByaXZhdGUgc3RhdGljIGludCB1bmlxdWVTZXJ2aWNlID0gMDsNCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiAgVGVzdCBjcmVhdGluZyBhIHNlcnZpY2Ugd2l0aG91dCBhIHNwYXJzZSBjb21wb3NpdGUuICBUaGlzIHZlcmlmaWVzIHByZS1leGlzdGluZyBkZWZhdWx0DQotICAgICAqICBiZWhhdmlvci4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJ2aWNlQW5kUG9ydE5vQ29tcG9zaXRlKCkgew0KLSAgICAgICAgUU5hbWUgc2VydmljZVFOYW1lID0gbmV3IFFOYW1lKG5hbWVzcGFjZVVSSSwgc3ZjTG9jYWxQYXJ0KTsNCi0gICAgICAgIFFOYW1lIHBvcnRRTmFtZSA9IG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIHBvcnRMb2NhbFBhcnQpOw0KLQ0KLSAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gU2VydmljZS5jcmVhdGUoc2VydmljZVFOYW1lKTsNCi0gICAgICAgIEhhbmRsZXJSZXNvbHZlciByZXNvbHZlciA9IHNlcnZpY2UuZ2V0SGFuZGxlclJlc29sdmVyKCk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHJlc29sdmVyKTsNCi0gICAgICAgIFBvcnRJbmZvIHBpID0gbmV3IER1bW15UG9ydEluZm8oKTsNCi0gICAgICAgIExpc3Q8SGFuZGxlcj4gbGlzdCA9IHJlc29sdmVyLmdldEhhbmRsZXJDaGFpbihwaSk7DQotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbGlzdC5zaXplKCkpOw0KLSAgICAgICAgDQotICAgICAgICBDbGllbnRNZXRhZGF0YUhhbmRsZXJDaGFpblRlc3RTRUkgcG9ydCA9IHNlcnZpY2UuZ2V0UG9ydChwb3J0UU5hbWUsIENsaWVudE1ldGFkYXRhSGFuZGxlckNoYWluVGVzdFNFSS5jbGFzcyk7DQotICAgICAgICAvLyBWZXJpZnkgdGhhdCBwb3J0cyBjcmVhdGVkIHVuZGVyIHRoZSBzZXJ2aWNlIGhhdmUgbm8gaGFuZGxlcnMgZnJvbSB0aGUgc3BhcnNlIGNvbXBvc2l0ZQ0KLSAgICAgICAgQmluZGluZ1Byb3ZpZGVyIGJpbmRpbmdQcm92aWRlciA9IChCaW5kaW5nUHJvdmlkZXIpIHBvcnQ7DQotICAgICAgICBCaW5kaW5nIGJpbmRpbmcgPSAoQmluZGluZykgYmluZGluZ1Byb3ZpZGVyLmdldEJpbmRpbmcoKTsNCi0gICAgICAgIExpc3Q8SGFuZGxlcj4gcG9ydEhhbmRsZXJzID0gYmluZGluZy5nZXRIYW5kbGVyQ2hhaW4oKTsNCi0gICAgICAgIGFzc2VydEVxdWFscygwLCBwb3J0SGFuZGxlcnMuc2l6ZSgpKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogVGVzdCBjcmVhdGluZyBhIHNlcnZpY2Ugd2l0aCBhIHNwYXJzZSBjb21wb3NpdGUgdGhhdCBjb250YWlucyBoYW5kbGVyIGNvbmZpZ3VyYXRpb24NCi0gICAgICogaW5mb3JtYXRpb24gZm9yIHRoaXMgc2VydmljZSBkZWxlZ2F0ZS4gIFZlcmlmeSB0aGF0IHRoZSBoYW5kbGVycyBhcmUgaW5jbHVkZWQgaW4gdGhlIA0KLSAgICAgKiBjaGFpbi4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJ2aWNlV2l0aENvbXBvc2l0ZSgpIHsNCi0gICAgICAgIFFOYW1lIHNlcnZpY2VRTmFtZSA9IG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIHN2Y0xvY2FsUGFydCk7DQotICAgICAgICBRTmFtZSBwb3J0UU5hbWUgPSBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBwb3J0TG9jYWxQYXJ0KTsNCi0gICAgICAgIC8vIENyZWF0ZSBhIGNvbXBvc2l0ZSB3aXRoIGEgSkFYQiBIYW5kbGVyIENvbmZpZyANCi0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBzcGFyc2VDb21wb3NpdGUgPSBuZXcgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCk7DQotICAgICAgICBIYW5kbGVyQ2hhaW5zVHlwZSBoYW5kbGVyQ2hhaW5zVHlwZSA9IGdldEhhbmRsZXJDaGFpbnNUeXBlKCk7DQotICAgICAgICBzcGFyc2VDb21wb3NpdGUuc2V0SGFuZGxlckNoYWluc1R5cGUoaGFuZGxlckNoYWluc1R5cGUpOw0KLQ0KLSAgICAgICAgU2VydmljZURlbGVnYXRlLnNldFNlcnZpY2VNZXRhZGF0YShzcGFyc2VDb21wb3NpdGUpOw0KLSAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gU2VydmljZS5jcmVhdGUoc2VydmljZVFOYW1lKTsNCi0gICAgICAgIENsaWVudE1ldGFkYXRhSGFuZGxlckNoYWluVGVzdFNFSSBwb3J0ID0gc2VydmljZS5nZXRQb3J0KHBvcnRRTmFtZSwgQ2xpZW50TWV0YWRhdGFIYW5kbGVyQ2hhaW5UZXN0U0VJLmNsYXNzKTsNCi0NCi0gICAgICAgIC8vIFZlcmlmeSB0aGUgSGFuZGxlclJlc29sdmVyIG9uIHRoZSBzZXJ2aWNlIGtub3dzIGFib3V0IHRoZSBoYW5kbGVycyBpbiB0aGUgc3BhcnNlIGNvbXBvc2l0ZQ0KLSAgICAgICAgSGFuZGxlclJlc29sdmVyIHJlc29sdmVyID0gc2VydmljZS5nZXRIYW5kbGVyUmVzb2x2ZXIoKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwocmVzb2x2ZXIpOw0KLSAgICAgICAgUG9ydEluZm8gcGkgPSBuZXcgRHVtbXlQb3J0SW5mbygpOw0KLSAgICAgICAgTGlzdDxIYW5kbGVyPiBsaXN0ID0gcmVzb2x2ZXIuZ2V0SGFuZGxlckNoYWluKHBpKTsNCi0gICAgICAgIGFzc2VydEVxdWFscygyLCBsaXN0LnNpemUoKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIFZlcmlmeSB0aGF0IHBvcnRzIGNyZWF0ZWQgdW5kZXIgdGhlIHNlcnZpY2UgaGF2ZSBoYW5kbGVycw0KLSAgICAgICAgQmluZGluZ1Byb3ZpZGVyIGJpbmRpbmdQcm92aWRlciA9IChCaW5kaW5nUHJvdmlkZXIpIHBvcnQ7DQotICAgICAgICBCaW5kaW5nIGJpbmRpbmcgPSAoQmluZGluZykgYmluZGluZ1Byb3ZpZGVyLmdldEJpbmRpbmcoKTsNCi0gICAgICAgIExpc3Q8SGFuZGxlcj4gcG9ydEhhbmRsZXJzID0gYmluZGluZy5nZXRIYW5kbGVyQ2hhaW4oKTsNCi0gICAgICAgIGFzc2VydEVxdWFscygyLCBwb3J0SGFuZGxlcnMuc2l6ZSgpKTsNCi0gICAgICAgIGFzc2VydFRydWUoY29udGFpblNhbWVIYW5kbGVycyhwb3J0SGFuZGxlcnMsIGxpc3QpKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gVmVyaWZ5IHRoYXQgYSBzdWJzZXF1ZW50IHBvcnQgYXJlIGRpZmZlcmVudCBhbmQgdGhhdCB0aGV5IGFsc28gZ2V0cyB0aGUgY29ycmVjdCBoYW5kbGVycw0KLSAgICAgICAgQ2xpZW50TWV0YWRhdGFIYW5kbGVyQ2hhaW5UZXN0U0VJIHBvcnQyID0gc2VydmljZS5nZXRQb3J0KHBvcnRRTmFtZSwgQ2xpZW50TWV0YWRhdGFIYW5kbGVyQ2hhaW5UZXN0U0VJLmNsYXNzKTsNCi0gICAgICAgIEJpbmRpbmdQcm92aWRlciBiaW5kaW5nUHJvdmlkZXIyID0gKEJpbmRpbmdQcm92aWRlcikgcG9ydDI7DQotICAgICAgICBCaW5kaW5nIGJpbmRpbmcyID0gKEJpbmRpbmcpIGJpbmRpbmdQcm92aWRlcjIuZ2V0QmluZGluZygpOw0KLSAgICAgICAgTGlzdDxIYW5kbGVyPiBwb3J0SGFuZGxlcnMyID0gYmluZGluZzIuZ2V0SGFuZGxlckNoYWluKCk7DQotICAgICAgICBhc3NlcnROb3RTYW1lKHBvcnQsIHBvcnQyKTsNCi0gICAgICAgIGFzc2VydEVxdWFscygyLCBwb3J0SGFuZGxlcnMyLnNpemUoKSk7DQotICAgICAgICBhc3NlcnRUcnVlKGNvbnRhaW5TYW1lSGFuZGxlcnMocG9ydEhhbmRsZXJzMiwgbGlzdCkpOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogU2V0IGEgc3BhcnNlIGNvbXBvc2l0ZSBvbiBhIHNwZWNpZmljIFBvcnQuICBWZXJpZnkgdGhhdCBpbnN0YW5jZXMgb2YgdGhhdCBQb3J0IGhhdmUgdGhlDQotICAgICAqIGNvcnJlY3QgaGFuZGxlcnMgYXNzb2NpYXRlZCBhbmQgb3RoZXIgUG9ydHMgZG8gbm90Lg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdFBvcnRXaXRoQ29tcG9zaXRlKCkgew0KLSAgICAgICAgUU5hbWUgc2VydmljZVFOYW1lID0gbmV3IFFOYW1lKG5hbWVzcGFjZVVSSSwgc3ZjTG9jYWxQYXJ0KTsNCi0gICAgICAgIFFOYW1lIHBvcnRRTmFtZSA9IG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIHBvcnRMb2NhbFBhcnQpOw0KLQ0KLSAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gU2VydmljZS5jcmVhdGUoc2VydmljZVFOYW1lKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQ3JlYXRlIGEgY29tcG9zaXRlIHdpdGggYSBKQVhCIEhhbmRsZXIgQ29uZmlnIA0KLSAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIHNwYXJzZUNvbXBvc2l0ZSA9IG5ldyBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUoKTsNCi0gICAgICAgIEhhbmRsZXJDaGFpbnNUeXBlIGhhbmRsZXJDaGFpbnNUeXBlID0gZ2V0SGFuZGxlckNoYWluc1R5cGUoKTsNCi0gICAgICAgIHNwYXJzZUNvbXBvc2l0ZS5zZXRIYW5kbGVyQ2hhaW5zVHlwZShoYW5kbGVyQ2hhaW5zVHlwZSk7DQotICAgICAgICBTZXJ2aWNlRGVsZWdhdGUuc2V0UG9ydE1ldGFkYXRhKHNwYXJzZUNvbXBvc2l0ZSk7DQotICAgICAgICBDbGllbnRNZXRhZGF0YUhhbmRsZXJDaGFpblRlc3RTRUkgcG9ydCA9IHNlcnZpY2UuZ2V0UG9ydChwb3J0UU5hbWUsIENsaWVudE1ldGFkYXRhSGFuZGxlckNoYWluVGVzdFNFSS5jbGFzcyk7DQotDQotICAgICAgICAvLyBWZXJpZnkgdGhlIEhhbmRsZXJSZXNvbHZlciBvbiB0aGUgc2VydmljZSBrbm93cyBhYm91dCB0aGUgaGFuZGxlcnMgaW4gdGhlIHNwYXJzZSBjb21wb3NpdGUNCi0gICAgICAgIEhhbmRsZXJSZXNvbHZlciByZXNvbHZlciA9IHNlcnZpY2UuZ2V0SGFuZGxlclJlc29sdmVyKCk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHJlc29sdmVyKTsNCi0gICAgICAgIFBvcnRJbmZvIHBpID0gbmV3IER1bW15UG9ydEluZm8oKTsNCi0gICAgICAgIExpc3Q8SGFuZGxlcj4gbGlzdCA9IHJlc29sdmVyLmdldEhhbmRsZXJDaGFpbihwaSk7DQotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgbGlzdC5zaXplKCkpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBWZXJpZnkgdGhhdCB0aGUgcG9ydCBjcmVhdGVkIHdpdGggdGhlIHNwYXJzZSBtZXRhZGF0YSBoYXMgdGhvc2UgaGFuZGxlcnMNCi0gICAgICAgIEJpbmRpbmdQcm92aWRlciBiaW5kaW5nUHJvdmlkZXIgPSAoQmluZGluZ1Byb3ZpZGVyKSBwb3J0Ow0KLSAgICAgICAgQmluZGluZyBiaW5kaW5nID0gKEJpbmRpbmcpIGJpbmRpbmdQcm92aWRlci5nZXRCaW5kaW5nKCk7DQotICAgICAgICBMaXN0PEhhbmRsZXI+IHBvcnRIYW5kbGVycyA9IGJpbmRpbmcuZ2V0SGFuZGxlckNoYWluKCk7DQotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgcG9ydEhhbmRsZXJzLnNpemUoKSk7DQotICAgICAgICBhc3NlcnRUcnVlKGNvbnRhaW5TYW1lSGFuZGxlcnMocG9ydEhhbmRsZXJzLCBsaXN0KSk7DQotICAgICAgICANCi0gICAgICAgIC8vIFZlcmlmeSB0aGF0IGEgY3JlYXRpbmcgYW5vdGhlciBpbnN0YW5jZSBvZiB0aGUgc2FtZSBwb3J0IGFsc28gZ2V0cyB0aG9zZSBoYW5kbGVycw0KLSAgICAgICAgQ2xpZW50TWV0YWRhdGFIYW5kbGVyQ2hhaW5UZXN0U0VJIHBvcnQyID0gc2VydmljZS5nZXRQb3J0KHBvcnRRTmFtZSwgQ2xpZW50TWV0YWRhdGFIYW5kbGVyQ2hhaW5UZXN0U0VJLmNsYXNzKTsNCi0gICAgICAgIEJpbmRpbmdQcm92aWRlciBiaW5kaW5nUHJvdmlkZXIyID0gKEJpbmRpbmdQcm92aWRlcikgcG9ydDI7DQotICAgICAgICBCaW5kaW5nIGJpbmRpbmcyID0gKEJpbmRpbmcpIGJpbmRpbmdQcm92aWRlcjIuZ2V0QmluZGluZygpOw0KLSAgICAgICAgTGlzdDxIYW5kbGVyPiBwb3J0SGFuZGxlcnMyID0gYmluZGluZzIuZ2V0SGFuZGxlckNoYWluKCk7DQotICAgICAgICBhc3NlcnROb3RTYW1lKHBvcnQsIHBvcnQyKTsNCi0gICAgICAgIGFzc2VydEVxdWFscygyLCBwb3J0SGFuZGxlcnMyLnNpemUoKSk7DQotICAgICAgICBhc3NlcnRUcnVlKGNvbnRhaW5TYW1lSGFuZGxlcnMocG9ydEhhbmRsZXJzMiwgbGlzdCkpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBWZXJpZnkgdGhhdCBjcmVhdGVpbmcgYSBkaWZmZXJlbnQgcG9ydCBkb2Vzbid0IGdldCB0aGUgaGFuZGxlcnMNCi0gICAgICAgIFFOYW1lIHBvcnRRTmFtZTMgPSBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBwb3J0TG9jYWxQYXJ0ICsgIjMiKTsNCi0gICAgICAgIENsaWVudE1ldGFkYXRhSGFuZGxlckNoYWluVGVzdFNFSSBwb3J0MyA9IHNlcnZpY2UuZ2V0UG9ydChwb3J0UU5hbWUzLCBDbGllbnRNZXRhZGF0YUhhbmRsZXJDaGFpblRlc3RTRUkuY2xhc3MpOw0KLSAgICAgICAgQmluZGluZ1Byb3ZpZGVyIGJpbmRpbmdQcm92aWRlcjMgPSAoQmluZGluZ1Byb3ZpZGVyKSBwb3J0MzsNCi0gICAgICAgIEJpbmRpbmcgYmluZGluZzMgPSAoQmluZGluZykgYmluZGluZ1Byb3ZpZGVyMy5nZXRCaW5kaW5nKCk7DQotICAgICAgICBMaXN0PEhhbmRsZXI+IHBvcnRIYW5kbGVyczMgPSBiaW5kaW5nMy5nZXRIYW5kbGVyQ2hhaW4oKTsNCi0gICAgICAgIGFzc2VydEVxdWFscygwLCBwb3J0SGFuZGxlcnMzLnNpemUoKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIFZlcmlmeSBzZXR0aW5nIHRoZSBtZXRhZGF0YSBvbiBhIGRpZmZlcmVudCBwb3J0IChhIGRpZmZlcmVudCBRTmFtZSkgd2lsbCBnZXQgaGFuZGxlcnMuDQotICAgICAgICBRTmFtZSBwb3J0UU5hbWU0ID0gbmV3IFFOYW1lKG5hbWVzcGFjZVVSSSwgcG9ydExvY2FsUGFydCArICI0Iik7DQotICAgICAgICBTZXJ2aWNlRGVsZWdhdGUuc2V0UG9ydE1ldGFkYXRhKHNwYXJzZUNvbXBvc2l0ZSk7DQotICAgICAgICBDbGllbnRNZXRhZGF0YUhhbmRsZXJDaGFpblRlc3RTRUkgcG9ydDQgPSBzZXJ2aWNlLmdldFBvcnQocG9ydFFOYW1lNCwgQ2xpZW50TWV0YWRhdGFIYW5kbGVyQ2hhaW5UZXN0U0VJLmNsYXNzKTsNCi0gICAgICAgIEJpbmRpbmdQcm92aWRlciBiaW5kaW5nUHJvdmlkZXI0ID0gKEJpbmRpbmdQcm92aWRlcikgcG9ydDQ7DQotICAgICAgICBCaW5kaW5nIGJpbmRpbmc0ID0gKEJpbmRpbmcpIGJpbmRpbmdQcm92aWRlcjQuZ2V0QmluZGluZygpOw0KLSAgICAgICAgTGlzdDxIYW5kbGVyPiBwb3J0SGFuZGxlcnM0ID0gYmluZGluZzQuZ2V0SGFuZGxlckNoYWluKCk7DQotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgcG9ydEhhbmRsZXJzNC5zaXplKCkpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBWZXJpZnkgdGhlIHNlcnZpY2UgaGFuZGxlciByZXNvbHZlciBrbm93cyBhYm91dCBib3RocyBzZXRzIG9mIGhhbmRsZXJzDQotICAgICAgICAvLyBhdHRhY2hlZCB0byB0aGUgdHdvIGRpZmZlcmVudCBwb3J0IFFOYW1lcyBhbmQgbm9uZSBhcmUgYXR0YWNoZWQgZm9yIHRoZSB0aGlyZCBwb3J0DQotICAgICAgICBMaXN0PEhhbmRsZXI+IGxpc3RGb3JQb3J0ID0gcmVzb2x2ZXIuZ2V0SGFuZGxlckNoYWluKHBpKTsNCi0gICAgICAgIGFzc2VydEVxdWFscygyLCBsaXN0Rm9yUG9ydC5zaXplKCkpOw0KLQ0KLSAgICAgICAgUG9ydEluZm8gcGk0ID0gbmV3IER1bW15UG9ydEluZm8ocG9ydFFOYW1lNCk7DQotICAgICAgICBMaXN0PEhhbmRsZXI+IGxpc3RGb3JQb3J0NCA9IHJlc29sdmVyLmdldEhhbmRsZXJDaGFpbihwaTQpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGxpc3RGb3JQb3J0NC5zaXplKCkpOw0KLSAgICAgICAgDQotICAgICAgICBQb3J0SW5mbyBwaTMgPSBuZXcgRHVtbXlQb3J0SW5mbyhwb3J0UU5hbWUzKTsNCi0gICAgICAgIExpc3Q8SGFuZGxlcj4gbGlzdEZvclBvcnQzID0gcmVzb2x2ZXIuZ2V0SGFuZGxlckNoYWluKHBpMyk7DQotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbGlzdEZvclBvcnQzLnNpemUoKSk7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBWZXJpZnkgdGhhdCBoYW5kbGVycyBzcGVjaWZpZWQgaW4gYSBzcGFyc2UgY29tcG9pc3RlIG9uIHRoZSBzZXJ2aWNlIGFyZSBvbmx5IGFzc29jaWF0ZWQgd2l0aCANCi0gICAgICogdGhhdCBzcGVjaWZpYyBzZXJ2aWNlIGRlbGVnYXRlIChpLmUuIFNlcnZpY2UgaW5zdGFuY2UpLCBldmVuIGlmIHRoZSBRTmFtZXMgYXJlIHRoZSBzYW1lIA0KLSAgICAgKiBhY3Jvc3MgdHdvIGluc3RhbmNlcyBvZiBhIFNlcnZpY2UuDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVTZXJ2aWNlRGVsZ2F0ZXNTZXJ2aWNlQ29tcG9zaXRlKCkgew0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICAvLyBOZWVkIHRvIGNhY2hlIHRoZSBTZXJ2aWNlRGVzY3JpcHRpb25zIHNvIHRoYXQgdGhleSBhcmUgc2hhcmVkDQotICAgICAgICAgICAgLy8gYWNyb3NzIHRoZSB0d28gaW5zdGFuY2VzIG9mIHRoZSBzYW1lIFNlcnZpY2UuDQotICAgICAgICAgICAgQ2xpZW50TWV0YWRhdGFUZXN0Lmluc3RhbGxDYWNoaW5nRmFjdG9yeSgpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIFFOYW1lIHNlcnZpY2VRTmFtZSA9IG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIHN2Y0xvY2FsUGFydCk7DQotICAgICAgICAgICAgUG9ydEluZm8gcGkgPSBuZXcgRHVtbXlQb3J0SW5mbygpOw0KLQ0KLSAgICAgICAgICAgIC8vIENyZWF0ZSBhIFNlcnZpY2Ugc3BlY2lmeWluZyBhIHNwYXJzZSBjb21wb3NpdGUgYW5kIHZlcmlmeSB0aGUNCi0gICAgICAgICAgICAvLyBwb3J0cyB1bmRlciB0aGF0IHNlcnZpY2UgZ2V0IHRoZSBjb3JyZWN0IGhhbmRsZXJzIGFzc29jaWF0ZWQuDQotICAgICAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIHNwYXJzZUNvbXBvc2l0ZSA9IG5ldyBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUoKTsNCi0gICAgICAgICAgICBIYW5kbGVyQ2hhaW5zVHlwZSBoYW5kbGVyQ2hhaW5zVHlwZSA9IGdldEhhbmRsZXJDaGFpbnNUeXBlKCk7DQotICAgICAgICAgICAgc3BhcnNlQ29tcG9zaXRlLnNldEhhbmRsZXJDaGFpbnNUeXBlKGhhbmRsZXJDaGFpbnNUeXBlKTsNCi0gICAgICAgICAgICBTZXJ2aWNlRGVsZWdhdGUuc2V0U2VydmljZU1ldGFkYXRhKHNwYXJzZUNvbXBvc2l0ZSk7DQotICAgICAgICAgICAgU2VydmljZSBzZXJ2aWNlMSA9IFNlcnZpY2UuY3JlYXRlKHNlcnZpY2VRTmFtZSk7DQotDQotICAgICAgICAgICAgLy8gQ3JlYXRlIGEgc2Vjb25kIGluc3RhbmNlIG9mIHRoZSBzYW1lIFNlcnZpY2UsIGJ1dCB3aXRob3V0DQotICAgICAgICAgICAgLy8gbWV0YWRhdGEuIFBvcnRzIGNyZWF0ZWQgdW5kZXIgdGhhdCBzZXJ2aWNlIHNob3VsZCBub3QgZ2V0IGhhbmRsZXIncyBhc3NvY2lhdGVkLg0KLSAgICAgICAgICAgIFNlcnZpY2Ugc2VydmljZTIgPSBTZXJ2aWNlLmNyZWF0ZShzZXJ2aWNlUU5hbWUpOw0KLQ0KLSAgICAgICAgICAgIC8vIE5vIHBvcnRzIGNyZWF0ZWQgeWV0LCBzbyB0aGVyZSBzaG91bGQgYmUgbm8gcmVsZXZhbnQgaGFuZGxlcg0KLSAgICAgICAgICAgIC8vIGNoYWlucy4NCi0gICAgICAgICAgICBIYW5kbGVyUmVzb2x2ZXIgcmVzb2x2ZXIxID0gc2VydmljZTEuZ2V0SGFuZGxlclJlc29sdmVyKCk7DQotICAgICAgICAgICAgTGlzdDxIYW5kbGVyPiBsaXN0MSA9IHJlc29sdmVyMS5nZXRIYW5kbGVyQ2hhaW4ocGkpOw0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCBsaXN0MS5zaXplKCkpOw0KLQ0KLSAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgcG9ydCwgaXQgc2hvdWxkIGdldCBoYW5kbGVycy4NCi0gICAgICAgICAgICBRTmFtZSBwb3J0UU5hbWUxID0gbmV3IFFOYW1lKG5hbWVzcGFjZVVSSSwgcG9ydExvY2FsUGFydCk7DQotICAgICAgICAgICAgQ2xpZW50TWV0YWRhdGFIYW5kbGVyQ2hhaW5UZXN0U0VJIHBvcnQxID0NCi0gICAgICAgICAgICAgICAgICAgIHNlcnZpY2UxLmdldFBvcnQocG9ydFFOYW1lMSwgQ2xpZW50TWV0YWRhdGFIYW5kbGVyQ2hhaW5UZXN0U0VJLmNsYXNzKTsNCi0gICAgICAgICAgICBCaW5kaW5nUHJvdmlkZXIgYmluZGluZ1Byb3ZpZGVyMSA9IChCaW5kaW5nUHJvdmlkZXIpIHBvcnQxOw0KLSAgICAgICAgICAgIEJpbmRpbmcgYmluZGluZzEgPSAoQmluZGluZykgYmluZGluZ1Byb3ZpZGVyMS5nZXRCaW5kaW5nKCk7DQotICAgICAgICAgICAgTGlzdDxIYW5kbGVyPiBwb3J0SGFuZGxlcnMxID0gYmluZGluZzEuZ2V0SGFuZGxlckNoYWluKCk7DQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHBvcnRIYW5kbGVyczEuc2l6ZSgpKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBSZWZyZXNoIHRoZSBoYW5kbGVyIGxpc3QgZnJvbSB0aGUgcmVzb2x2ZXIgYWZ0ZXIgdGhlIHBvcnQgaXMgY3JlYXRlZA0KLSAgICAgICAgICAgIGxpc3QxID0gcmVzb2x2ZXIxLmdldEhhbmRsZXJDaGFpbihwaSk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjb250YWluU2FtZUhhbmRsZXJzKHBvcnRIYW5kbGVyczEsIGxpc3QxKSk7DQotDQotICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSAybmQgU2VydmljZSBpbnN0YW5jZSBkb2Vzbid0IGhhdmUgaGFuZGxlcnMNCi0gICAgICAgICAgICAvLyBhc3NvY2lhdGVkIHdpdGggaXQNCi0gICAgICAgICAgICBIYW5kbGVyUmVzb2x2ZXIgcmVzb2x2ZXIyID0gc2VydmljZTIuZ2V0SGFuZGxlclJlc29sdmVyKCk7DQotICAgICAgICAgICAgTGlzdDxIYW5kbGVyPiBsaXN0MiA9IHJlc29sdmVyMi5nZXRIYW5kbGVyQ2hhaW4ocGkpOw0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCBsaXN0Mi5zaXplKCkpOw0KLQ0KLSAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgc2FtZSBwb3J0IGNyZWF0ZWQgdW5kZXIgdGhlIDJuZCBzZXJ2aWNlIGFsc28NCi0gICAgICAgICAgICAvLyBkb2Vzbid0IGhhdmUgaGFuZGxlcnMNCi0gICAgICAgICAgICBDbGllbnRNZXRhZGF0YUhhbmRsZXJDaGFpblRlc3RTRUkgcG9ydDIgPQ0KLSAgICAgICAgICAgICAgICAgICAgc2VydmljZTIuZ2V0UG9ydChwb3J0UU5hbWUxLCBDbGllbnRNZXRhZGF0YUhhbmRsZXJDaGFpblRlc3RTRUkuY2xhc3MpOw0KLSAgICAgICAgICAgIEJpbmRpbmdQcm92aWRlciBiaW5kaW5nUHJvdmlkZXIyID0gKEJpbmRpbmdQcm92aWRlcikgcG9ydDI7DQotICAgICAgICAgICAgQmluZGluZyBiaW5kaW5nMiA9IChCaW5kaW5nKSBiaW5kaW5nUHJvdmlkZXIyLmdldEJpbmRpbmcoKTsNCi0gICAgICAgICAgICBMaXN0PEhhbmRsZXI+IHBvcnRIYW5kbGVyczIgPSBiaW5kaW5nMi5nZXRIYW5kbGVyQ2hhaW4oKTsNCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgcG9ydEhhbmRsZXJzMi5zaXplKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZmluYWxseSB7DQotICAgICAgICAgICAgQ2xpZW50TWV0YWRhdGFUZXN0LnJlc3RvcmVPcmlnaW5hbEZhY3RvcnkoKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogVmVyaWZ5IHRoYXQgaGFuZGxlcnMgc3BlY2lmaWVkIGluIGEgc3BhcnNlIGNvbXBvaXN0ZSBvbiB0aGUgcG9ydCBhcmUgb25seSBhc3NvY2lhdGVkIHdpdGggDQotICAgICAqIHRoYXQgcG9ydCBvbiB0aGF0IHNwZWNpZmljIHNlcnZpY2UgZGVsZWdhdGUgKGkuZS4gU2VydmljZSBpbnN0YW5jZSksIGV2ZW4gaWYgdGhlIFFOYW1lcyBhcmUgdGhlIHNhbWUgDQotICAgICAqIGFjcm9zcyB0d28gaW5zdGFuY2VzIG9mIGEgU2VydmljZS4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aXBsZVNlcnZpY2VEZWxnYXRlc1BvcnRDb21wb3NpdGUoKSB7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIC8vIE5lZWQgdG8gY2FjaGUgdGhlIFNlcnZpY2VEZXNjcmlwdGlvbnMgc28gdGhhdCB0aGV5IGFyZSBzaGFyZWQNCi0gICAgICAgICAgICAvLyBhY3Jvc3MgdGhlIHR3byBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgU2VydmljZS4NCi0gICAgICAgICAgICBDbGllbnRNZXRhZGF0YVRlc3QuaW5zdGFsbENhY2hpbmdGYWN0b3J5KCk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgUU5hbWUgc2VydmljZVFOYW1lID0gbmV3IFFOYW1lKG5hbWVzcGFjZVVSSSwgc3ZjTG9jYWxQYXJ0KTsNCi0gICAgICAgICAgICBQb3J0SW5mbyBwaSA9IG5ldyBEdW1teVBvcnRJbmZvKCk7DQotDQotICAgICAgICAgICAgLy8gQ3JlYXRlIHR3byBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgU2VydmljZQ0KLSAgICAgICAgICAgIFNlcnZpY2Ugc2VydmljZTEgPSBTZXJ2aWNlLmNyZWF0ZShzZXJ2aWNlUU5hbWUpOw0KLSAgICAgICAgICAgIFNlcnZpY2Ugc2VydmljZTIgPSBTZXJ2aWNlLmNyZWF0ZShzZXJ2aWNlUU5hbWUpOw0KLQ0KLSAgICAgICAgICAgIC8vIE5vIHBvcnRzIGNyZWF0ZWQgeWV0LCBzbyB0aGVyZSBzaG91bGQgYmUgbm8gcmVsZXZhbnQgaGFuZGxlcg0KLSAgICAgICAgICAgIC8vIGNoYWlucy4NCi0gICAgICAgICAgICBIYW5kbGVyUmVzb2x2ZXIgcmVzb2x2ZXIxID0gc2VydmljZTEuZ2V0SGFuZGxlclJlc29sdmVyKCk7DQotICAgICAgICAgICAgTGlzdDxIYW5kbGVyPiBsaXN0MSA9IHJlc29sdmVyMS5nZXRIYW5kbGVyQ2hhaW4ocGkpOw0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCBsaXN0MS5zaXplKCkpOw0KLQ0KLSAgICAgICAgICAgIC8vIENyZWF0ZSBhIFBvcnQgc3BlY2lmeWluZyBhIHNwYXJzZSBjb21wb3NpdGUgYW5kIHZlcmlmeSB0aGUNCi0gICAgICAgICAgICAvLyBwb3J0IGdldHMgdGhlIGNvcnJlY3QgaGFuZGxlcnMgYXNzb2NpYXRlZC4NCi0gICAgICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgc3BhcnNlQ29tcG9zaXRlID0gbmV3IERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSgpOw0KLSAgICAgICAgICAgIEhhbmRsZXJDaGFpbnNUeXBlIGhhbmRsZXJDaGFpbnNUeXBlID0gZ2V0SGFuZGxlckNoYWluc1R5cGUoKTsNCi0gICAgICAgICAgICBzcGFyc2VDb21wb3NpdGUuc2V0SGFuZGxlckNoYWluc1R5cGUoaGFuZGxlckNoYWluc1R5cGUpOw0KLSAgICAgICAgICAgIFNlcnZpY2VEZWxlZ2F0ZS5zZXRQb3J0TWV0YWRhdGEoc3BhcnNlQ29tcG9zaXRlKTsNCi0gICAgICAgICAgICBRTmFtZSBwb3J0UU5hbWUxID0gbmV3IFFOYW1lKG5hbWVzcGFjZVVSSSwgcG9ydExvY2FsUGFydCk7DQotICAgICAgICAgICAgQ2xpZW50TWV0YWRhdGFIYW5kbGVyQ2hhaW5UZXN0U0VJIHBvcnQxID0NCi0gICAgICAgICAgICAgICAgICAgIHNlcnZpY2UxLmdldFBvcnQocG9ydFFOYW1lMSwgQ2xpZW50TWV0YWRhdGFIYW5kbGVyQ2hhaW5UZXN0U0VJLmNsYXNzKTsNCi0gICAgICAgICAgICBCaW5kaW5nUHJvdmlkZXIgYmluZGluZ1Byb3ZpZGVyMSA9IChCaW5kaW5nUHJvdmlkZXIpIHBvcnQxOw0KLSAgICAgICAgICAgIEJpbmRpbmcgYmluZGluZzEgPSAoQmluZGluZykgYmluZGluZ1Byb3ZpZGVyMS5nZXRCaW5kaW5nKCk7DQotICAgICAgICAgICAgTGlzdDxIYW5kbGVyPiBwb3J0SGFuZGxlcnMxID0gYmluZGluZzEuZ2V0SGFuZGxlckNoYWluKCk7DQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHBvcnRIYW5kbGVyczEuc2l6ZSgpKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBSZWZyZXNoIHRoZSBoYW5kbGVyIGxpc3QgZnJvbSB0aGUgcmVzb2x2ZXIgYWZ0ZXIgdGhlIHBvcnQgaXMgY3JlYXRlZA0KLSAgICAgICAgICAgIGxpc3QxID0gcmVzb2x2ZXIxLmdldEhhbmRsZXJDaGFpbihwaSk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjb250YWluU2FtZUhhbmRsZXJzKHBvcnRIYW5kbGVyczEsIGxpc3QxKSk7DQotDQotICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSAybmQgU2VydmljZSBpbnN0YW5jZSBkb2Vzbid0IGhhdmUgaGFuZGxlcnMNCi0gICAgICAgICAgICAvLyBhc3NvY2lhdGVkIHdpdGggaXQNCi0gICAgICAgICAgICBIYW5kbGVyUmVzb2x2ZXIgcmVzb2x2ZXIyID0gc2VydmljZTIuZ2V0SGFuZGxlclJlc29sdmVyKCk7DQotICAgICAgICAgICAgTGlzdDxIYW5kbGVyPiBsaXN0MiA9IHJlc29sdmVyMi5nZXRIYW5kbGVyQ2hhaW4ocGkpOw0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCBsaXN0Mi5zaXplKCkpOw0KLQ0KLSAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgc2FtZSBwb3J0IGNyZWF0ZWQgdW5kZXIgdGhlIDJuZCBzZXJ2aWNlIGFsc28NCi0gICAgICAgICAgICAvLyBkb2Vzbid0IGhhdmUgaGFuZGxlcnMNCi0gICAgICAgICAgICBDbGllbnRNZXRhZGF0YUhhbmRsZXJDaGFpblRlc3RTRUkgcG9ydDIgPQ0KLSAgICAgICAgICAgICAgICAgICAgc2VydmljZTIuZ2V0UG9ydChwb3J0UU5hbWUxLCBDbGllbnRNZXRhZGF0YUhhbmRsZXJDaGFpblRlc3RTRUkuY2xhc3MpOw0KLSAgICAgICAgICAgIEJpbmRpbmdQcm92aWRlciBiaW5kaW5nUHJvdmlkZXIyID0gKEJpbmRpbmdQcm92aWRlcikgcG9ydDI7DQotICAgICAgICAgICAgQmluZGluZyBiaW5kaW5nMiA9IChCaW5kaW5nKSBiaW5kaW5nUHJvdmlkZXIyLmdldEJpbmRpbmcoKTsNCi0gICAgICAgICAgICBMaXN0PEhhbmRsZXI+IHBvcnRIYW5kbGVyczIgPSBiaW5kaW5nMi5nZXRIYW5kbGVyQ2hhaW4oKTsNCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgcG9ydEhhbmRsZXJzMi5zaXplKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZmluYWxseSB7DQotICAgICAgICAgICAgQ2xpZW50TWV0YWRhdGFUZXN0LnJlc3RvcmVPcmlnaW5hbEZhY3RvcnkoKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFZlcmlmeSB0aGF0IHRoZSBvcmlnaW5hbCBmdW5jdGlvbmFsaXR5IG9mIHNwZWNpZnlpbmcgYSBIYW5kbGVyQ2hhaW4gYW5ub3RhdGlvbiB3aXRoIGENCi0gICAgICogZmlsZSBtZW1iZXIgd29ya3MgYXMgaXQgc2hvdWxkLiANCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RIYW5kbGVyQ2hhaW5PblNFSSgpIHsNCi0gICAgICAgIFFOYW1lIHNlcnZpY2VRTiA9IG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIHN2Y0xvY2FsUGFydCk7DQotDQotICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSBTZXJ2aWNlLmNyZWF0ZShzZXJ2aWNlUU4pOw0KLSAgICAgICAgDQotICAgICAgICBDbGllbnRNZXRhZGF0YUhhbmRsZXJDaGFpblRlc3RTRUlXaXRoSEMgcG9ydCA9IHNlcnZpY2UuZ2V0UG9ydChDbGllbnRNZXRhZGF0YUhhbmRsZXJDaGFpblRlc3RTRUlXaXRoSEMuY2xhc3MpOw0KLSAgICAgICAgQmluZGluZ1Byb3ZpZGVyIGJpbmRpbmdQcm92aWRlciA9IChCaW5kaW5nUHJvdmlkZXIpIHBvcnQ7DQotICAgICAgICBCaW5kaW5nIGJpbmRpbmcgPSAoQmluZGluZykgYmluZGluZ1Byb3ZpZGVyLmdldEJpbmRpbmcoKTsNCi0gICAgICAgIExpc3Q8SGFuZGxlcj4gcG9ydEhhbmRsZXJzID0gYmluZGluZy5nZXRIYW5kbGVyQ2hhaW4oKTsNCi0gICAgICAgIGFzc2VydEVxdWFscygxLCBwb3J0SGFuZGxlcnMuc2l6ZSgpKTsNCi0gICAgICAgIGFzc2VydFRydWUoY29udGFpbnNIYW5kbGVyQ2hhaW5Bbm5vdGF0aW9uSGFuZGxlcnMocG9ydEhhbmRsZXJzKSk7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBWZXJpZnkgdGhhdCBoYW5kbGVyIGluZm9ybWF0aW9uIGluIGEgc3BhcnNlIGNvbXBvc2l0ZSBvbiB0aGUgUG9ydCB3aWxsIG92ZXJyaWRlIGFueSBoYW5kbGVyIGNoYWluDQotICAgICAqIGFubm90YXRpb24gb24gdGhlIFNFSS4gDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U0VJSGFuZGxlckNoYWluT3ZlcnJpZGVPblBvcnQoKSB7DQotICAgICAgICBRTmFtZSBzZXJ2aWNlUU4gPSBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBzdmNMb2NhbFBhcnQgKyB1bmlxdWVTZXJ2aWNlKyspOw0KLSAgICAgICAgDQotICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSBTZXJ2aWNlLmNyZWF0ZShzZXJ2aWNlUU4pOw0KLQ0KLSAgICAgICAgLy8gVGhlIFNFSSBoYXMgYSBIYW5kbGVyQ2hhaW4gYW5ub3RhdGlvbiwgYnV0IHRoZSBzcGFyc2UgbWV0YWRhdGEgc2hvdWxkIG92ZXJyaWRlIGl0DQotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgc3BhcnNlQ29tcG9zaXRlID0gbmV3IERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSgpOw0KLSAgICAgICAgSGFuZGxlckNoYWluc1R5cGUgaGFuZGxlckNoYWluc1R5cGUgPSBnZXRIYW5kbGVyQ2hhaW5zVHlwZSgpOw0KLSAgICAgICAgc3BhcnNlQ29tcG9zaXRlLnNldEhhbmRsZXJDaGFpbnNUeXBlKGhhbmRsZXJDaGFpbnNUeXBlKTsNCi0gICAgICAgIFNlcnZpY2VEZWxlZ2F0ZS5zZXRQb3J0TWV0YWRhdGEoc3BhcnNlQ29tcG9zaXRlKTsNCi0gICAgICAgIENsaWVudE1ldGFkYXRhSGFuZGxlckNoYWluVGVzdFNFSVdpdGhIQyBwb3J0ID0gc2VydmljZS5nZXRQb3J0KENsaWVudE1ldGFkYXRhSGFuZGxlckNoYWluVGVzdFNFSVdpdGhIQy5jbGFzcyk7DQotICAgICAgICBCaW5kaW5nUHJvdmlkZXIgYmluZGluZ1Byb3ZpZGVyID0gKEJpbmRpbmdQcm92aWRlcikgcG9ydDsNCi0gICAgICAgIEJpbmRpbmcgYmluZGluZyA9IChCaW5kaW5nKSBiaW5kaW5nUHJvdmlkZXIuZ2V0QmluZGluZygpOw0KLSAgICAgICAgTGlzdDxIYW5kbGVyPiBwb3J0SGFuZGxlcnMgPSBiaW5kaW5nLmdldEhhbmRsZXJDaGFpbigpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHBvcnRIYW5kbGVycy5zaXplKCkpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShjb250YWluc1NwYXJzZUNvbXBvc2l0ZUhhbmRsZXJzKHBvcnRIYW5kbGVycykpOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogVmVyaWZ5IHRoYXQgaGFuZGxlciBpbmZvcm1hdGlvbiBpbiBhIHNwYXJzZSBjb21wb3NpdGUgb24gdGhlIFNlcnZpY2Ugd2lsbCBvdmVycmlkZSBhbnkgaGFuZGxlciBjaGFpbg0KLSAgICAgKiBhbm5vdGF0aW9uIG9uIHRoZSBTRUkuIA0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdFNFSUhhbmRsZXJDaGFpbk92ZXJyaWRlT25TZXJ2aWNlKCkgew0KLSAgICAgICAgUU5hbWUgc2VydmljZVFOID0gbmV3IFFOYW1lKG5hbWVzcGFjZVVSSSwgc3ZjTG9jYWxQYXJ0ICsgdW5pcXVlU2VydmljZSsrKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gVGhlIFNFSSBoYXMgYSBIYW5kbGVyQ2hhaW4gYW5ub3RhdGlvbiwgYnV0IHRoZSBzcGFyc2UgbWV0YWRhdGEgc2hvdWxkIG92ZXJyaWRlIGl0DQotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgc3BhcnNlQ29tcG9zaXRlID0gbmV3IERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSgpOw0KLSAgICAgICAgSGFuZGxlckNoYWluc1R5cGUgaGFuZGxlckNoYWluc1R5cGUgPSBnZXRIYW5kbGVyQ2hhaW5zVHlwZSgpOw0KLSAgICAgICAgc3BhcnNlQ29tcG9zaXRlLnNldEhhbmRsZXJDaGFpbnNUeXBlKGhhbmRsZXJDaGFpbnNUeXBlKTsNCi0gICAgICAgIFNlcnZpY2VEZWxlZ2F0ZS5zZXRTZXJ2aWNlTWV0YWRhdGEoc3BhcnNlQ29tcG9zaXRlKTsNCi0gICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IFNlcnZpY2UuY3JlYXRlKHNlcnZpY2VRTik7DQotDQotICAgICAgICBDbGllbnRNZXRhZGF0YUhhbmRsZXJDaGFpblRlc3RTRUlXaXRoSEMgcG9ydCA9IHNlcnZpY2UuZ2V0UG9ydChDbGllbnRNZXRhZGF0YUhhbmRsZXJDaGFpblRlc3RTRUlXaXRoSEMuY2xhc3MpOw0KLSAgICAgICAgQmluZGluZ1Byb3ZpZGVyIGJpbmRpbmdQcm92aWRlciA9IChCaW5kaW5nUHJvdmlkZXIpIHBvcnQ7DQotICAgICAgICBCaW5kaW5nIGJpbmRpbmcgPSAoQmluZGluZykgYmluZGluZ1Byb3ZpZGVyLmdldEJpbmRpbmcoKTsNCi0gICAgICAgIExpc3Q8SGFuZGxlcj4gcG9ydEhhbmRsZXJzID0gYmluZGluZy5nZXRIYW5kbGVyQ2hhaW4oKTsNCi0gICAgICAgIGFzc2VydEVxdWFscygyLCBwb3J0SGFuZGxlcnMuc2l6ZSgpKTsNCi0gICAgICAgIGFzc2VydFRydWUoY29udGFpbnNTcGFyc2VDb21wb3NpdGVIYW5kbGVycyhwb3J0SGFuZGxlcnMpKTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFNldCBkaWZmZXJlbnQgY29tcG9zaXRlcyBvbiB0aGUgU2VydmljZSBhbmQgdGhlIFBvcnQgdGhhdCBzcGVjaWZ5IGRpZmZlcmVudCANCi0gICAgICogSGFuZGxlckNoYWluc1R5cGUgdmFsdWVzLiAgDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcG9zaXRlT25TZXJ2aWNlQW5kUG9ydCgpIHsNCi0gICAgICAgIFFOYW1lIHNlcnZpY2VRTiA9IG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIHN2Y0xvY2FsUGFydCArIHVuaXF1ZVNlcnZpY2UrKyk7DQotICAgICAgICANCi0gICAgICAgIC8vIENyZWF0ZSBhIHNlcnZpY2Ugd2l0aCBhIGNvbXBvc2l0ZSBzcGVjaWZ5aW5nIGhhbmRsZXJzDQotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgc3BhcnNlQ29tcG9zaXRlID0gbmV3IERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSgpOw0KLSAgICAgICAgSGFuZGxlckNoYWluc1R5cGUgaGFuZGxlckNoYWluc1R5cGUgPSBnZXRIYW5kbGVyQ2hhaW5zVHlwZSgpOw0KLSAgICAgICAgc3BhcnNlQ29tcG9zaXRlLnNldEhhbmRsZXJDaGFpbnNUeXBlKGhhbmRsZXJDaGFpbnNUeXBlKTsNCi0gICAgICAgIFNlcnZpY2VEZWxlZ2F0ZS5zZXRTZXJ2aWNlTWV0YWRhdGEoc3BhcnNlQ29tcG9zaXRlKTsNCi0gICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IFNlcnZpY2UuY3JlYXRlKHNlcnZpY2VRTik7DQotDQotICAgICAgICAvLyBDcmVhdGUgYSBwb3J0IHdpdGggYSBjb21wb3NpdGUgc3BlY2lmeWluZyBkaWZmZXJlbnQgaGFuZGxlcnMNCi0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBwb3J0Q29tcG9zaXRlID0gbmV3IERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSgpOw0KLSAgICAgICAgSGFuZGxlckNoYWluc1R5cGUgcG9ydEhhbmRsZXJDaGFpbnNUeXBlID0gZ2V0SGFuZGxlckNoYWluc1R5cGUoIkNsaWVudE1ldGFkYXRhSGFuZGxlckNoYWluVGVzdC54bWwiKTsNCi0gICAgICAgIHBvcnRDb21wb3NpdGUuc2V0SGFuZGxlckNoYWluc1R5cGUocG9ydEhhbmRsZXJDaGFpbnNUeXBlKTsNCi0gICAgICAgIFNlcnZpY2VEZWxlZ2F0ZS5zZXRQb3J0TWV0YWRhdGEocG9ydENvbXBvc2l0ZSk7DQotICAgICAgICBDbGllbnRNZXRhZGF0YUhhbmRsZXJDaGFpblRlc3RTRUkgcG9ydCA9IHNlcnZpY2UuZ2V0UG9ydChDbGllbnRNZXRhZGF0YUhhbmRsZXJDaGFpblRlc3RTRUkuY2xhc3MpOw0KLSAgICAgICAgQmluZGluZ1Byb3ZpZGVyIGJpbmRpbmdQcm92aWRlciA9IChCaW5kaW5nUHJvdmlkZXIpIHBvcnQ7DQotICAgICAgICBCaW5kaW5nIGJpbmRpbmcgPSAoQmluZGluZykgYmluZGluZ1Byb3ZpZGVyLmdldEJpbmRpbmcoKTsNCi0gICAgICAgIExpc3Q8SGFuZGxlcj4gcG9ydEhhbmRsZXJzID0gYmluZGluZy5nZXRIYW5kbGVyQ2hhaW4oKTsNCi0NCi0gICAgICAgIC8vIElmIHRoZXJlIGlzIGEgSGFuZGxlckNoYWluc1R5cGUgY29tcG9zaXRlIHNwZWNpZmllZCBvbiBib3RoIHRoZSBTZXJ2aWNlIGFuZCB0aGUgUG9ydCwNCi0gICAgICAgIC8vIHRoZW4gdGhlIGNvbXBvc2l0ZSBzcGVjaWZpZWQgb24gdGhlIFBvcnQgc2hvdWxkIGJlIHRoZSBvbmUgdXNlZCB0byBhc3NvY2lhdGUgdGhlIA0KLSAgICAgICAgLy8gaGFuZGxlcnMgZm9yIHRoYXQgUG9ydC4NCi0gICAgICAgIGFzc2VydEVxdWFscygxLCBwb3J0SGFuZGxlcnMuc2l6ZSgpKTsNCi0gICAgICAgIGFzc2VydFRydWUoY29udGFpbnNIYW5kbGVyQ2hhaW5Bbm5vdGF0aW9uSGFuZGxlcnMocG9ydEhhbmRsZXJzKSk7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBWZXJmaXkgdGhhdCBhIEhhbmRsZXJDaGFpbiBhbm5vdGF0aW9uIG9uIHRoZSBTZXJ2aWNlIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgUG9ydCANCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RHZW5lcmF0ZWRTZXJ2aWNlV2l0aEhDKCkgew0KLSAgICAgICAgQ2xpZW50TWV0YWRhdGFIYW5kbGVyQ2hhaW5UZXN0U2VydmljZVdpdGhIQyBzZXJ2aWNlID0gbmV3IENsaWVudE1ldGFkYXRhSGFuZGxlckNoYWluVGVzdFNlcnZpY2VXaXRoSEMoKTsNCi0gICAgICAgIENsaWVudE1ldGFkYXRhSGFuZGxlckNoYWluVGVzdFNFSSBwb3J0ID0gc2VydmljZS5nZXRQb3J0KENsaWVudE1ldGFkYXRhSGFuZGxlckNoYWluVGVzdFNFSS5jbGFzcyk7DQotDQotICAgICAgICBCaW5kaW5nUHJvdmlkZXIgYmluZGluZ1Byb3ZpZGVyID0gKEJpbmRpbmdQcm92aWRlcikgcG9ydDsNCi0gICAgICAgIEJpbmRpbmcgYmluZGluZyA9IChCaW5kaW5nKSBiaW5kaW5nUHJvdmlkZXIuZ2V0QmluZGluZygpOw0KLSAgICAgICAgTGlzdDxIYW5kbGVyPiBwb3J0SGFuZGxlcnMgPSBiaW5kaW5nLmdldEhhbmRsZXJDaGFpbigpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHBvcnRIYW5kbGVycy5zaXplKCkpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShjb250YWluc0hhbmRsZXJDaGFpbkFubm90YXRpb25IYW5kbGVycyhwb3J0SGFuZGxlcnMpKTsNCi0NCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFZlcmZpeSB0aGF0IGdpdmVuIGEgSGFuZGxlckNoYWluIGFubm90YXRpb24gb24gdGhlIFNlcnZpY2UgYW5kIGEgUG9ydCBhbmQgYSBzcGFyc2UgY29tcG9zaXRlDQotICAgICAqIG9uIHRoZSBQb3J0IGFzc29jaWF0ZXMgdGhlIGhhbmRsZXJzIGZyb20gdGhlIHNwYXJzZSBjb21wb3NpdGUgb24gdGhlIFBvcnQuDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2VuZXJhdGVkU2VydmljZVdpdGhIQ1BvcnRPdmVycmlkZSgpIHsNCi0gICAgICAgIENsaWVudE1ldGFkYXRhSGFuZGxlckNoYWluVGVzdFNlcnZpY2VXaXRoSEMgc2VydmljZSA9IG5ldyBDbGllbnRNZXRhZGF0YUhhbmRsZXJDaGFpblRlc3RTZXJ2aWNlV2l0aEhDKCk7DQotDQotICAgICAgICAvLyBTZXQgYSBIYW5kbGVyQ2hhaW5zVHlwZSBvbiB0aGUgc3BhcnNlIGNvbXBvc2l0ZSBmb3IgdGhlIFBvcnQgY3JlYXRpb247IGl0IHNob3VsZCBvdmVycmlkZSB0aGUgDQotICAgICAgICAvLyBIYW5kbGVyQ2hhaW4gYW5ub3RhdGlvbiBvbiB0aGUgU2VydmljZS4NCi0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBzcGFyc2VDb21wb3NpdGUgPSBuZXcgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCk7DQotICAgICAgICBIYW5kbGVyQ2hhaW5zVHlwZSBoYW5kbGVyQ2hhaW5zVHlwZSA9IGdldEhhbmRsZXJDaGFpbnNUeXBlKCk7DQotICAgICAgICBzcGFyc2VDb21wb3NpdGUuc2V0SGFuZGxlckNoYWluc1R5cGUoaGFuZGxlckNoYWluc1R5cGUpOw0KLSAgICAgICAgU2VydmljZURlbGVnYXRlLnNldFBvcnRNZXRhZGF0YShzcGFyc2VDb21wb3NpdGUpOw0KLSAgICAgICAgQ2xpZW50TWV0YWRhdGFIYW5kbGVyQ2hhaW5UZXN0U0VJIHBvcnQgPSBzZXJ2aWNlLmdldFBvcnQoQ2xpZW50TWV0YWRhdGFIYW5kbGVyQ2hhaW5UZXN0U0VJLmNsYXNzKTsNCi0NCi0gICAgICAgIEJpbmRpbmdQcm92aWRlciBiaW5kaW5nUHJvdmlkZXIgPSAoQmluZGluZ1Byb3ZpZGVyKSBwb3J0Ow0KLSAgICAgICAgQmluZGluZyBiaW5kaW5nID0gKEJpbmRpbmcpIGJpbmRpbmdQcm92aWRlci5nZXRCaW5kaW5nKCk7DQotICAgICAgICBMaXN0PEhhbmRsZXI+IHBvcnRIYW5kbGVycyA9IGJpbmRpbmcuZ2V0SGFuZGxlckNoYWluKCk7DQotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgcG9ydEhhbmRsZXJzLnNpemUoKSk7DQotICAgICAgICBhc3NlcnRUcnVlKGNvbnRhaW5zU3BhcnNlQ29tcG9zaXRlSGFuZGxlcnMocG9ydEhhbmRsZXJzKSk7DQotICAgIH0NCi0NCi0gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotICAgIC8vIEhlbHBlciBtZXRob2RzIGFuZCBjbGFzc2VzDQotICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gY29udGFpbnNTcGFyc2VDb21wb3NpdGVIYW5kbGVycyhMaXN0PEhhbmRsZXI+IGhhbmRsZXJMaXN0KSB7DQotICAgICAgICBMaXN0PENsYXNzPiBpbnB1dEhhbmRsZXJDbGFzc2VzID0gaGFuZGxlckNsYXNzZXMoaGFuZGxlckxpc3QpOw0KLQ0KLSAgICAgICAgLy8gVGhlc2UgYXJlIHRoZSBoYW5kbGVycyBkZWZpbmVkIGluIHRoZSBIYW5kbGVyQ2hhaW5zVHlwZSBwbGFjZWQgb24gdGhlIHNwYXJzZSBjb21wb3NpdGUNCi0gICAgICAgIExpc3Q8Q2xhc3M+IGNvbXBvc2l0ZUhhbmRsZXJDbGFzc2VzID0gbmV3IEFycmF5TGlzdDxDbGFzcz4oKTsNCi0gICAgICAgIGNvbXBvc2l0ZUhhbmRsZXJDbGFzc2VzLmFkZChvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNwaS5oYW5kbGVyLkR1bW15U09BUEhhbmRsZXIuY2xhc3MpOw0KLSAgICAgICAgY29tcG9zaXRlSGFuZGxlckNsYXNzZXMuYWRkKG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc3BpLmhhbmRsZXIuRHVtbXlMb2dpY2FsSGFuZGxlci5jbGFzcyk7DQotDQotICAgICAgICBpZiAoaW5wdXRIYW5kbGVyQ2xhc3Nlcy5zaXplKCkgIT0gY29tcG9zaXRlSGFuZGxlckNsYXNzZXMuc2l6ZSgpKSB7DQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICBpZiAoaW5wdXRIYW5kbGVyQ2xhc3Nlcy5jb250YWluc0FsbChjb21wb3NpdGVIYW5kbGVyQ2xhc3NlcykpIHsNCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBBbnN3ZXIgaWYgdGhlIExpc3QgY29udGFpbnMgdGhlIHNhbWUgaGFuZGxlcnMgYXMgZGVmaW5lZCBpbiB0aGUgU0VJDQotICAgICAqIHZpYSB0aGUgSGFuZGxlckNoYWluLmZpbGUgYW5ub3RhdGlvbiBtZW1lYmVyLg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIHBvcnRIYW5kbGVycyBMaXN0IG9mIGhhbmRsZXJzDQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbGlzdCBtYXRjaGVzIHdoYXQgd2FzIGRlZmluZWQgb24gdGhlIFNFSSB2aWEgdGhlDQotICAgICAqICAgSGFuZGxlckNoYWluIGFubm90YXRpb247IGZhbHNlIG90aGVyd2lzZS4NCi0gICAgICovDQotICAgIHByaXZhdGUgYm9vbGVhbiBjb250YWluc0hhbmRsZXJDaGFpbkFubm90YXRpb25IYW5kbGVycyhMaXN0PEhhbmRsZXI+IHBvcnRIYW5kbGVycykgew0KLSAgICAgICAgTGlzdDxDbGFzcz4gcG9ydEhhbmRsZXJDbGFzc2VzID0gaGFuZGxlckNsYXNzZXMocG9ydEhhbmRsZXJzKTsNCi0gICAgICAgIExpc3Q8Q2xhc3M+IHNlaUhhbmRsZXJDbGFzc2VzID0gbmV3IEFycmF5TGlzdDxDbGFzcz4oKTsNCi0gICAgICAgIHNlaUhhbmRsZXJDbGFzc2VzLmFkZChDbGllbnRNZXRhZGF0YUhhbmRsZXJDaGFpbkhhbmRsZXIuY2xhc3MpOw0KLSAgICAgICAgDQotICAgICAgICBpZiAocG9ydEhhbmRsZXJDbGFzc2VzLnNpemUoKSAhPSBzZWlIYW5kbGVyQ2xhc3Nlcy5zaXplKCkpIHsNCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIGlmIChwb3J0SGFuZGxlckNsYXNzZXMuY29udGFpbnNBbGwoc2VpSGFuZGxlckNsYXNzZXMpKSB7DQotICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogQW5zd2VyIGlmIHR3byBMaXN0PEhhbmRsZXI+IGFyZ3VtZW50cyBjb250YWluIHRoZSBzYW1lIGhhbmRsZXIgQ2xhc3MgZmlsZXMuDQotICAgICAqIEBwYXJhbSBsaXN0MQ0KLSAgICAgKiBAcGFyYW0gbGlzdDINCi0gICAgICogQHJldHVybg0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBib29sZWFuIGNvbnRhaW5TYW1lSGFuZGxlcnMoTGlzdDxIYW5kbGVyPiBsaXN0MSwgTGlzdDxIYW5kbGVyPiBsaXN0Mikgew0KLSAgICAgICAgaWYgKGxpc3QxLnNpemUoKSAhPSBsaXN0Mi5zaXplKCkpIHsNCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9DQotDQotICAgICAgICBMaXN0PENsYXNzPiBsaXN0MUhhbmRsZXJDbGFzc2VzID0gaGFuZGxlckNsYXNzZXMobGlzdDEpOw0KLSAgICAgICAgTGlzdDxDbGFzcz4gbGlzdDJIYW5kbGVyQ2xhc3NlcyA9IGhhbmRsZXJDbGFzc2VzKGxpc3QyKTsNCi0NCi0gICAgICAgIGlmIChsaXN0MUhhbmRsZXJDbGFzc2VzLmNvbnRhaW5zQWxsKGxpc3QySGFuZGxlckNsYXNzZXMpKSB7DQotICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0gICAgICAgICAgICANCi0gICAgfQ0KLSAgICANCi0gICAgcHJpdmF0ZSBMaXN0PENsYXNzPiBoYW5kbGVyQ2xhc3NlcyhMaXN0PEhhbmRsZXI+IGxpc3RPZkhhbmRsZXJzKSB7DQotICAgICAgICBMaXN0PENsYXNzPiBoYW5kbGVyQ2xhc3NlcyA9IG5ldyBBcnJheUxpc3Q8Q2xhc3M+KCk7DQotICAgICAgICBJdGVyYXRvcjxIYW5kbGVyPiBoYW5kbGVySXRlcmF0b3IgPSBsaXN0T2ZIYW5kbGVycy5pdGVyYXRvcigpOw0KLSAgICAgICAgd2hpbGUgKGhhbmRsZXJJdGVyYXRvci5oYXNOZXh0KCkpIHsNCi0gICAgICAgICAgICBoYW5kbGVyQ2xhc3Nlcy5hZGQoaGFuZGxlckl0ZXJhdG9yLm5leHQoKS5nZXRDbGFzcygpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBoYW5kbGVyQ2xhc3NlczsNCi0gICAgfQ0KLSAgICANCi0gICAgcHJpdmF0ZSBIYW5kbGVyQ2hhaW5zVHlwZSBnZXRIYW5kbGVyQ2hhaW5zVHlwZSgpIHsNCi0gICAgICAgIHJldHVybiBnZXRIYW5kbGVyQ2hhaW5zVHlwZSgiaGFuZGxlci54bWwiKTsNCi0gICAgfQ0KLSAgICBwcml2YXRlIEhhbmRsZXJDaGFpbnNUeXBlIGdldEhhbmRsZXJDaGFpbnNUeXBlKFN0cmluZyBmaWxlTmFtZSkgew0KLSAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBnZXRYTUxGaWxlU3RyZWFtKGZpbGVOYW1lKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwoaXMpOw0KLSAgICAgICAgSGFuZGxlckNoYWluc1R5cGUgcmV0dXJuSENUID0gRGVzY3JpcHRpb25VdGlscy5sb2FkSGFuZGxlckNoYWlucyhpcywgdGhpcy5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXR1cm5IQ1QpOw0KLSAgICAgICAgcmV0dXJuIHJldHVybkhDVDsNCi0gICAgfQ0KLSAgICBwcml2YXRlIElucHV0U3RyZWFtIGdldFhNTEZpbGVTdHJlYW0oU3RyaW5nIGZpbGVOYW1lKSB7DQotICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IG51bGw7DQotICAgICAgICBTdHJpbmcgY29uZmlnTG9jID0gbnVsbDsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgU3RyaW5nIHNlcCA9ICIvIjsNCi0gICAgICAgICAgICBjb25maWdMb2MgPSBzZXAgKyAidGVzdC1yZXNvdXJjZXMiICsgc2VwICsgImNvbmZpZ3VyYXRpb24iICsgc2VwICsgImhhbmRsZXJzIiArIHNlcCArIGZpbGVOYW1lOw0KLSAgICAgICAgICAgIFN0cmluZyBiYXNlRGlyID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJiYXNlZGlyIiwiLiIpKS5nZXRDYW5vbmljYWxQYXRoKCk7DQotICAgICAgICAgICAgaXMgPSBuZXcgRmlsZShiYXNlRGlyICsgY29uZmlnTG9jKS50b1VSTCgpLm9wZW5TdHJlYW0oKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBpczsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgY2xhc3MgRHVtbXlQb3J0SW5mbyBpbXBsZW1lbnRzIFBvcnRJbmZvIHsNCi0gICAgICAgIHByaXZhdGUgUU5hbWUgcG9ydFFOOw0KLSAgICAgICAgcHJpdmF0ZSBRTmFtZSBzZXJ2aWNlUU47DQotICAgICAgICANCi0gICAgICAgIHB1YmxpYyBEdW1teVBvcnRJbmZvKCkgew0KLSAgICAgICAgICAgIHRoaXMucG9ydFFOID0gbmV3IFFOYW1lKCJodHRwOi8vd3d3LmFwYWNoZS5vcmcvdGVzdC9uYW1lc3BhY2UiLCAiRHVtbXlQb3J0Iik7DQotICAgICAgICAgICAgdGhpcy5zZXJ2aWNlUU4gPSBuZXcgUU5hbWUoImh0dHA6Ly93d3cuYXBhY2hlLm9yZy90ZXN0L25hbWVzcGFjZSIsICJEdW1teVNlcnZpY2UiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgcHVibGljIER1bW15UG9ydEluZm8oUU5hbWUgcG9ydFFOKSB7DQotICAgICAgICAgICAgdGhpcygpOw0KLSAgICAgICAgICAgIHRoaXMucG9ydFFOID0gcG9ydFFOOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRCaW5kaW5nSUQoKSB7DQotICAgICAgICAgICAgcmV0dXJuIFNPQVBCaW5kaW5nLlNPQVAxMUhUVFBfQklORElORzsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyBRTmFtZSBnZXRQb3J0TmFtZSgpIHsNCi0gICAgICAgICAgICByZXR1cm4gcG9ydFFOOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICBwdWJsaWMgUU5hbWUgZ2V0U2VydmljZU5hbWUoKSB7DQotICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2VRTjsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLX0NCi0NCi1AV2ViU2VydmljZQ0KLWludGVyZmFjZSBDbGllbnRNZXRhZGF0YUhhbmRsZXJDaGFpblRlc3RTRUkgew0KLSAgICBwdWJsaWMgU3RyaW5nIGVjaG8oU3RyaW5nIHRvRWNobyk7DQotfQ0KLQ0KLUBXZWJTZXJ2aWNlDQotQEhhbmRsZXJDaGFpbihmaWxlPSJDbGllbnRNZXRhZGF0YUhhbmRsZXJDaGFpblRlc3QueG1sIikNCi1pbnRlcmZhY2UgQ2xpZW50TWV0YWRhdGFIYW5kbGVyQ2hhaW5UZXN0U0VJV2l0aEhDIHsNCi0gICAgcHVibGljIFN0cmluZyBlY2hvKFN0cmluZyB0b0VjaG8pOw0KLX0NCi0NCi1AV2ViU2VydmljZUNsaWVudA0KLUBIYW5kbGVyQ2hhaW4oZmlsZT0iQ2xpZW50TWV0YWRhdGFIYW5kbGVyQ2hhaW5UZXN0LnhtbCIpDQotY2xhc3MgQ2xpZW50TWV0YWRhdGFIYW5kbGVyQ2hhaW5UZXN0U2VydmljZVdpdGhIQyBleHRlbmRzIGphdmF4LnhtbC53cy5TZXJ2aWNlIHsNCi0gICAgICAgIHB1YmxpYyBDbGllbnRNZXRhZGF0YUhhbmRsZXJDaGFpblRlc3RTZXJ2aWNlV2l0aEhDKCkgew0KLSAgICAgICAgICAgIHN1cGVyKG51bGwsDQotICAgICAgICAgICAgICAgICAgbmV3IFFOYW1lKENsaWVudE1ldGFkYXRhSGFuZGxlckNoYWluVGVzdC5uYW1lc3BhY2VVUkksIENsaWVudE1ldGFkYXRhSGFuZGxlckNoYWluVGVzdC5zdmNMb2NhbFBhcnQpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHB1YmxpYyBDbGllbnRNZXRhZGF0YUhhbmRsZXJDaGFpblRlc3RTZXJ2aWNlV2l0aEhDKFVSTCB3c2RsTG9jYXRpb24sIFFOYW1lIHNlcnZpY2VOYW1lKSB7DQotICAgICAgICAgICAgc3VwZXIod3NkbExvY2F0aW9uLCBzZXJ2aWNlTmFtZSk7DQotICAgICAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zcGkvQ2xpZW50TWV0YWRhdGFIYW5kbGVyQ2hhaW5UZXN0LnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zcGkvQ2xpZW50TWV0YWRhdGFIYW5kbGVyQ2hhaW5UZXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIxYzhlMi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc3BpL0NsaWVudE1ldGFkYXRhSGFuZGxlckNoYWluVGVzdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLQ0KLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTxqd3M6aGFuZGxlci1jaGFpbnMgeG1sbnM6andzPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiPg0KLQ0KLQk8andzOmhhbmRsZXItY2hhaW4gbmFtZT0iTG9nZ2luZ0hhbmRsZXJDaGFpbiI+DQotCQk8andzOmhhbmRsZXI+DQotCQkJPGp3czpoYW5kbGVyLWNsYXNzPm9yZy5hcGFjaGUuYXhpczIuamF4d3Muc3BpLkNsaWVudE1ldGFkYXRhSGFuZGxlckNoYWluSGFuZGxlcjwvandzOmhhbmRsZXItY2xhc3M+DQotCQk8L2p3czpoYW5kbGVyPg0KLQk8L2p3czpoYW5kbGVyLWNoYWluPg0KLQkNCi08L2p3czpoYW5kbGVyLWNoYWlucz4NCi0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc3BpL0NsaWVudE1ldGFkYXRhUG9ydFRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zcGkvQ2xpZW50TWV0YWRhdGFQb3J0VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzc2NDc5Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zcGkvQ2xpZW50TWV0YWRhdGFQb3J0VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTk3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc3BpOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRGVzY3JpcHRpb25UZXN0VXRpbHMyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkVuZHBvaW50RGVzY3JpcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uU2VydmljZURlc2NyaXB0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuTURRQ29uc3RhbnRzOw0KLQ0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsNCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLkJpbmRpbmdQcm92aWRlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlQ2xpZW50Ow0KLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5TT0FQQmluZGluZzsNCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiANCi0gKi8NCi1wdWJsaWMgY2xhc3MgQ2xpZW50TWV0YWRhdGFQb3J0VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBuYW1lc3BhY2VVUkkgPSAiaHR0cDovL2Rlc2NyaXB0aW9uLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciOw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIHN2Y0xvY2FsUGFydCA9ICJzdmNMb2NhbFBhcnQiOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIG9yaWdpbmFsV3NkbCA9ICJDbGllbnRNZXRhZGF0YS53c2RsIjsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBvdmVycmlkZW5Xc2RsID0gIkNsaWVudE1ldGFkYXRhT3ZlcnJpZGVuLndzZGwiOw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIG90aGVyV3NkbCA9ICJDbGllbnRNZXRhZGF0YU90aGVyLndzZGwiOw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIG11bHRpUG9ydFdzZGwgPSAiQ2xpZW50TWV0YWRhdGFNdWx0aVBvcnQud3NkbCI7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgb3JpZ2luYWxXc2RsX3BvcnRMb2NhbFBhcnQgPSAicG9ydExvY2FsUGFydCI7DQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgb3ZlcnJpZGVuV3NkbF9wb3J0TG9jYWxQYXJ0ID0gInBvcnRMb2NhbFBhcnRPdmVycmlkZW4iOw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIG90aGVyV3NkbF9wb3J0TG9jYWxQYXJ0ID0gInBvcnRMb2NhbFBhcnRPdGhlciI7DQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgbXVsdGlQb3J0V3NkbF9wb3J0TG9jYWxQYXJ0MSA9ICJwb3J0TG9jYWxQYXJ0TXVsdGkxIjsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBtdWx0aVBvcnRXc2RsX3BvcnRMb2NhbFBhcnQyID0gInBvcnRMb2NhbFBhcnRNdWx0aTIiOw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIG11bHRpUG9ydFdzZGxfcG9ydExvY2FsUGFydDMgPSAicG9ydExvY2FsUGFydE11bHRpMyI7DQotICAgIA0KLSAgICAvKioNCi0gICAgICogVGVzdCB0aGUgZ2V0UG9ydCBmdW5jdGlvbmFsaXR5IHdpdGhvdXQgYW55IGNvbXBvc2l0ZSBzcGVjaWZpZWQuDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0T3JpZ2luYWxHZXRQb3J0KCkgew0KLSAgICAgICAgUU5hbWUgc2VydmljZVFOYW1lID0gbmV3IFFOYW1lKG5hbWVzcGFjZVVSSSwgc3ZjTG9jYWxQYXJ0KTsNCi0gICAgICAgIFVSTCB3c2RsVXJsID0gQ2xpZW50TWV0YWRhdGFUZXN0LmdldFdzZGxVUkwob3RoZXJXc2RsKTsNCi0gICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IFNlcnZpY2UuY3JlYXRlKHdzZGxVcmwsIHNlcnZpY2VRTmFtZSk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2UpOw0KLSAgICAgICAgU2VydmljZURlbGVnYXRlIHNlcnZpY2VEZWxlZ2F0ZSA9IERlc2NyaXB0aW9uVGVzdFV0aWxzMi5nZXRTZXJ2aWNlRGVsZWdhdGUoc2VydmljZSk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2VEZWxlZ2F0ZSk7DQotICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc2VydmljZURlc2MgPSBzZXJ2aWNlRGVsZWdhdGUuZ2V0U2VydmljZURlc2NyaXB0aW9uKCk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2VEZXNjKTsNCi0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBkYmNJblNlcnZpY2VEZXNjID0gRGVzY3JpcHRpb25UZXN0VXRpbHMyLmdldFNlcnZpY2VEZXNjcmlwdGlvbkNvbXBvc2l0ZShzZXJ2aWNlRGVzYyk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKGRiY0luU2VydmljZURlc2MpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKFNlcnZpY2UuY2xhc3MsIGRiY0luU2VydmljZURlc2MuZ2V0Q29ycmVzcG9uZGluZ0NsYXNzKCkpOw0KLSAgICAgICAgLy8gU2luY2UgdGhpcyBpcyBhIGdlbmVyaWMgU2VydmljZSB3aXRoIG5vIG92ZXJyaWRlcywgdGhlcmUgd2lsbCBiZSBubyBXZWJTZXJ2aWNlQ2xpZW50IGFubm90YXRpb24NCi0gICAgICAgIFdlYlNlcnZpY2VDbGllbnQgd3NDbGllbnQgPSBkYmNJblNlcnZpY2VEZXNjLmdldFdlYlNlcnZpY2VDbGllbnRBbm5vdCgpOw0KLSAgICAgICAgYXNzZXJ0TnVsbCh3c0NsaWVudCk7DQotDQotICAgICAgICAvLyBXU0RMIHdhcyBzcGVjaWZpZWQgb24gdGhlIGNyZWF0ZSwgc28gbWFrZSBzdXJlIHRoZSByaWdodCBvbmUgd2FzIHVzZWQgYnkgY2hlY2tpbmcgdGhlIHBvcnRzDQotICAgICAgICBhc3NlcnRUcnVlKCJXcm9uZyBXU0RMIHVzZWQiLCBDbGllbnRNZXRhZGF0YVRlc3QudmFsaWRhdGVQb3J0KHNlcnZpY2UsIG90aGVyV3NkbF9wb3J0TG9jYWxQYXJ0KSk7DQotICAgICAgICANCi0gICAgICAgIFFOYW1lIHBvcnRRTiA9IG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIG90aGVyV3NkbF9wb3J0TG9jYWxQYXJ0KTsNCi0gICAgICAgIENsaWVudE1ldGFkYXRhUG9ydFNFSSBwb3J0ID0gc2VydmljZS5nZXRQb3J0KHBvcnRRTiwgQ2xpZW50TWV0YWRhdGFQb3J0U0VJLmNsYXNzKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwocG9ydCk7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBTcGVjaWZ5IGEgc3BhcnNlIGNvbXBvc2l0ZSBvbiBhIGdldFBvcnQgY2FsbA0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdEdldFBvcnRXaXRoQ29tcG9zaXRlKCkgew0KLSAgICAgICAgUU5hbWUgc2VydmljZVFOYW1lID0gbmV3IFFOYW1lKG5hbWVzcGFjZVVSSSwgc3ZjTG9jYWxQYXJ0KTsNCi0gICAgICAgIFVSTCB3c2RsVXJsID0gQ2xpZW50TWV0YWRhdGFUZXN0LmdldFdzZGxVUkwob3RoZXJXc2RsKTsNCi0gICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IFNlcnZpY2UuY3JlYXRlKHdzZGxVcmwsIHNlcnZpY2VRTmFtZSk7DQotICAgICAgICBTZXJ2aWNlRGVsZWdhdGUgc2VydmljZURlbGVnYXRlID0gRGVzY3JpcHRpb25UZXN0VXRpbHMyLmdldFNlcnZpY2VEZWxlZ2F0ZShzZXJ2aWNlKTsNCi0gICAgICAgIGFzc2VydE51bGwoU2VydmljZURlbGVnYXRlLmdldFNlcnZpY2VNZXRhZGF0YSgpKTsNCi0gICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzZXJ2aWNlRGVzYyA9IHNlcnZpY2VEZWxlZ2F0ZS5nZXRTZXJ2aWNlRGVzY3JpcHRpb24oKTsNCi0NCi0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBzcGFyc2VDb21wb3NpdGUgPSBuZXcgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCk7DQotICAgICAgICBhc3NlcnROdWxsKFNlcnZpY2VEZWxlZ2F0ZS5nZXRQb3J0TWV0YWRhdGEoKSk7DQotICAgICAgICBTZXJ2aWNlRGVsZWdhdGUuc2V0UG9ydE1ldGFkYXRhKHNwYXJzZUNvbXBvc2l0ZSk7DQotICAgICAgICBhc3NlcnROdWxsKFNlcnZpY2VEZWxlZ2F0ZS5nZXRTZXJ2aWNlTWV0YWRhdGEoKSk7DQotICAgICAgICBhc3NlcnRTYW1lKHNwYXJzZUNvbXBvc2l0ZSwgU2VydmljZURlbGVnYXRlLmdldFBvcnRNZXRhZGF0YSgpKTsNCi0gICAgICAgIFFOYW1lIHBvcnRRTiA9IG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIG90aGVyV3NkbF9wb3J0TG9jYWxQYXJ0KTsNCi0gICAgICAgIENsaWVudE1ldGFkYXRhUG9ydFNFSSBwb3J0ID0gc2VydmljZS5nZXRQb3J0KHBvcnRRTiwgQ2xpZW50TWV0YWRhdGFQb3J0U0VJLmNsYXNzKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwocG9ydCk7DQotICAgICAgICBhc3NlcnROdWxsKFNlcnZpY2VEZWxlZ2F0ZS5nZXRQb3J0TWV0YWRhdGEoKSk7DQotICAgICAgICANCi0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZXBEZXNjQXJyYXlbXSA9IHNlcnZpY2VEZXNjLmdldEVuZHBvaW50RGVzY3JpcHRpb25zKCk7DQotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgZXBEZXNjQXJyYXkubGVuZ3RoKTsNCi0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBlcERCQyA9IGVwRGVzY0FycmF5WzBdLmdldERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSgpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChlcERCQyk7DQotICAgICAgICBhc3NlcnROb3RTYW1lKHNwYXJzZUNvbXBvc2l0ZSwgZXBEQkMpOw0KLSAgICAgICAgYXNzZXJ0U2FtZShzcGFyc2VDb21wb3NpdGUsIGVwREJDLmdldFNwYXJzZUNvbXBvc2l0ZShzZXJ2aWNlRGVsZWdhdGUpKTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIERvIG11bHRpcGxlIGdldFBvcnRzIG9uIHRoZSBzYW1lIHNlcnZpY2Ugc3BlY2lmaXlpbmcgZGlmZmVyZW50IHNwYXJzZSBjb21wb3NpdGUuICBWZXJpZnkgdGhhdA0KLSAgICAgKiB0aGUgc3BhcnNlIGNvbXBvc2l0ZSBvdmVyd3JpdGVzIHRoZSBwcmV2aW91cyBvbmUuDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsaXRwbGVHZXRQb3J0U2FtZVNlcnZpY2UoKSB7DQotICAgICAgICBRTmFtZSBzZXJ2aWNlUU5hbWUgPSBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBzdmNMb2NhbFBhcnQpOw0KLSAgICAgICAgVVJMIHdzZGxVcmwgPSBDbGllbnRNZXRhZGF0YVRlc3QuZ2V0V3NkbFVSTChvdGhlcldzZGwpOw0KLSAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gU2VydmljZS5jcmVhdGUod3NkbFVybCwgc2VydmljZVFOYW1lKTsNCi0gICAgICAgIFNlcnZpY2VEZWxlZ2F0ZSBzZXJ2aWNlRGVsZWdhdGUgPSBEZXNjcmlwdGlvblRlc3RVdGlsczIuZ2V0U2VydmljZURlbGVnYXRlKHNlcnZpY2UpOw0KLSAgICAgICAgYXNzZXJ0TnVsbChTZXJ2aWNlRGVsZWdhdGUuZ2V0U2VydmljZU1ldGFkYXRhKCkpOw0KLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNlcnZpY2VEZXNjID0gc2VydmljZURlbGVnYXRlLmdldFNlcnZpY2VEZXNjcmlwdGlvbigpOw0KLQ0KLSAgICAgICAgLy8gRG8gdGhlIGZpcnN0IGdldFBvcnQgb24gdGhlIGZpcnN0IFNlcnZpY2UNCi0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBzcGFyc2VDb21wb3NpdGUxID0gbmV3IERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSgpOw0KLSAgICAgICAgYXNzZXJ0TnVsbChTZXJ2aWNlRGVsZWdhdGUuZ2V0UG9ydE1ldGFkYXRhKCkpOw0KLSAgICAgICAgU2VydmljZURlbGVnYXRlLnNldFBvcnRNZXRhZGF0YShzcGFyc2VDb21wb3NpdGUxKTsNCi0gICAgICAgIGFzc2VydE51bGwoU2VydmljZURlbGVnYXRlLmdldFNlcnZpY2VNZXRhZGF0YSgpKTsNCi0gICAgICAgIGFzc2VydFNhbWUoc3BhcnNlQ29tcG9zaXRlMSwgU2VydmljZURlbGVnYXRlLmdldFBvcnRNZXRhZGF0YSgpKTsNCi0gICAgICAgIFFOYW1lIHBvcnRRTiA9IG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIG90aGVyV3NkbF9wb3J0TG9jYWxQYXJ0KTsNCi0gICAgICAgIENsaWVudE1ldGFkYXRhUG9ydFNFSSBwb3J0MSA9IHNlcnZpY2UuZ2V0UG9ydChwb3J0UU4sIENsaWVudE1ldGFkYXRhUG9ydFNFSS5jbGFzcyk7DQotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVwRGVzY0FycmF5MVtdID0gc2VydmljZURlc2MuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbnMoKTsNCi0gICAgICAgIGFzc2VydEVxdWFscygxLCBlcERlc2NBcnJheTEubGVuZ3RoKTsNCi0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBlcERCQzEgPSBlcERlc2NBcnJheTFbMF0uZ2V0RGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKGVwREJDMSk7DQotICAgICAgICBhc3NlcnROb3RTYW1lKHNwYXJzZUNvbXBvc2l0ZTEsIGVwREJDMSk7DQotICAgICAgICBhc3NlcnRTYW1lKHNwYXJzZUNvbXBvc2l0ZTEsIGVwREJDMS5nZXRTcGFyc2VDb21wb3NpdGUoc2VydmljZURlbGVnYXRlKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIERvIGEgc2Vjb25kIGdldFBvcnQgZm9yIHRoZSBzYW1lIHBvcnQgb24gdGhlIHNhbWUgc2VydmljZSB1c2luZyBhIGRpZmZlcmVudCBjb21wb3NpdGUNCi0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBzcGFyc2VDb21wb3NpdGUyID0gbmV3IERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSgpOw0KLSAgICAgICAgYXNzZXJ0TnVsbChTZXJ2aWNlRGVsZWdhdGUuZ2V0UG9ydE1ldGFkYXRhKCkpOw0KLSAgICAgICAgU2VydmljZURlbGVnYXRlLnNldFBvcnRNZXRhZGF0YShzcGFyc2VDb21wb3NpdGUyKTsNCi0gICAgICAgIGFzc2VydE51bGwoU2VydmljZURlbGVnYXRlLmdldFNlcnZpY2VNZXRhZGF0YSgpKTsNCi0gICAgICAgIGFzc2VydFNhbWUoc3BhcnNlQ29tcG9zaXRlMiwgU2VydmljZURlbGVnYXRlLmdldFBvcnRNZXRhZGF0YSgpKTsNCi0NCi0gICAgICAgIENsaWVudE1ldGFkYXRhUG9ydFNFSSBwb3J0MiA9IHNlcnZpY2UuZ2V0UG9ydChwb3J0UU4sIENsaWVudE1ldGFkYXRhUG9ydFNFSS5jbGFzcyk7DQotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVwRGVzY0FycmF5MltdID0gc2VydmljZURlc2MuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbnMoKTsNCi0gICAgICAgIGFzc2VydEVxdWFscygxLCBlcERlc2NBcnJheTIubGVuZ3RoKTsNCi0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBlcERCQzIgPSBlcERlc2NBcnJheTJbMF0uZ2V0RGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKGVwREJDMik7DQotICAgICAgICBhc3NlcnROb3RTYW1lKHNwYXJzZUNvbXBvc2l0ZTIsIGVwREJDMik7DQotICAgICAgICBhc3NlcnRTYW1lKHNwYXJzZUNvbXBvc2l0ZTIsIGVwREJDMS5nZXRTcGFyc2VDb21wb3NpdGUoc2VydmljZURlbGVnYXRlKSk7DQotICAgICAgICAvLyBWZXJpZnkgdGhlIHByZXZpb3VzIHNwYXJzZSBjb21wb3NpdGUgd2FzIG92ZXJ3cml0dGVuIGZvciB0aGlzIGRlbGVnYXRlDQotICAgICAgICBhc3NlcnROb3RTYW1lKHNwYXJzZUNvbXBvc2l0ZTEsIGVwREJDMS5nZXRTcGFyc2VDb21wb3NpdGUoc2VydmljZURlbGVnYXRlKSk7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBUZXN0IG11bHRpcGxlIGdldFBvcnRzIHVzaW5nIGRpZmZlcmVudCBjb21wb3NpdGVzIG9uIGRpZmZlcmVudCBzZXJ2aWNlcy4gIFZhbGlkYXRlIHRoZSBjb21wb3NpdGUNCi0gICAgICogaXMgZm9yIGVhY2ggc2VydmljZSBkZWxlZ2F0ZSBpcyBkaWZmZXJlbnQuICBOb3RlIHRoYXQgd2UgaGF2ZSB0byBpbnN0YWxsIGEgY29uZmlndXJhdGlvbg0KLSAgICAgKiBmYWN0b3J5IHRoYXQgd2lsbCBjYXVzZSB0aGUgU2VydmljZURlc2NyaXB0aW9ucyB0byBiZSBjYWNoZWQ7IHRoZSBkZWZhdWx0IGZhY3Rvcnkgd2lsbA0KLSAgICAgKiBub3QuDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UG9ydERpZmZlcmVudFNlcnZpY2VzKCkgew0KLSAgICAgICAgDQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIENsaWVudE1ldGFkYXRhVGVzdC5pbnN0YWxsQ2FjaGluZ0ZhY3RvcnkoKTsNCi0gICAgICAgICAgICBRTmFtZSBzZXJ2aWNlUU5hbWUgPSBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBzdmNMb2NhbFBhcnQpOw0KLSAgICAgICAgICAgIFFOYW1lIHBvcnRRTiA9IG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIG90aGVyV3NkbF9wb3J0TG9jYWxQYXJ0KTsNCi0gICAgICAgICAgICBVUkwgd3NkbFVybCA9IENsaWVudE1ldGFkYXRhVGVzdC5nZXRXc2RsVVJMKG90aGVyV3NkbCk7DQotDQotICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBmaXJzdCBzZXJ2aWNlIA0KLSAgICAgICAgICAgIFNlcnZpY2Ugc2VydmljZTEgPSBTZXJ2aWNlLmNyZWF0ZSh3c2RsVXJsLCBzZXJ2aWNlUU5hbWUpOw0KLSAgICAgICAgICAgIFNlcnZpY2VEZWxlZ2F0ZSBzZXJ2aWNlRGVsZWdhdGUxID0gRGVzY3JpcHRpb25UZXN0VXRpbHMyLmdldFNlcnZpY2VEZWxlZ2F0ZShzZXJ2aWNlMSk7DQotICAgICAgICAgICAgYXNzZXJ0TnVsbChTZXJ2aWNlRGVsZWdhdGUuZ2V0U2VydmljZU1ldGFkYXRhKCkpOw0KLSAgICAgICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzZXJ2aWNlRGVzYzEgPSBzZXJ2aWNlRGVsZWdhdGUxLmdldFNlcnZpY2VEZXNjcmlwdGlvbigpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIERvIHRoZSBmaXJzdCBnZXRQb3J0IG9uIHRoZSBmaXJzdCBTZXJ2aWNlDQotICAgICAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIHNwYXJzZUNvbXBvc2l0ZTEgPSBuZXcgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCk7DQotICAgICAgICAgICAgYXNzZXJ0TnVsbChTZXJ2aWNlRGVsZWdhdGUuZ2V0UG9ydE1ldGFkYXRhKCkpOw0KLSAgICAgICAgICAgIFNlcnZpY2VEZWxlZ2F0ZS5zZXRQb3J0TWV0YWRhdGEoc3BhcnNlQ29tcG9zaXRlMSk7DQotICAgICAgICAgICAgYXNzZXJ0TnVsbChTZXJ2aWNlRGVsZWdhdGUuZ2V0U2VydmljZU1ldGFkYXRhKCkpOw0KLSAgICAgICAgICAgIGFzc2VydFNhbWUoc3BhcnNlQ29tcG9zaXRlMSwgU2VydmljZURlbGVnYXRlLmdldFBvcnRNZXRhZGF0YSgpKTsNCi0gICAgICAgICAgICBDbGllbnRNZXRhZGF0YVBvcnRTRUkgcG9ydDEgPSBzZXJ2aWNlMS5nZXRQb3J0KHBvcnRRTiwgQ2xpZW50TWV0YWRhdGFQb3J0U0VJLmNsYXNzKTsNCi0gICAgICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVwRGVzY0FycmF5MVtdID0gc2VydmljZURlc2MxLmdldEVuZHBvaW50RGVzY3JpcHRpb25zKCk7DQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGVwRGVzY0FycmF5MS5sZW5ndGgpOw0KLSAgICAgICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBlcERCQzEgPSBlcERlc2NBcnJheTFbMF0uZ2V0RGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCk7DQotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChlcERCQzEpOw0KLSAgICAgICAgICAgIGFzc2VydE5vdFNhbWUoc3BhcnNlQ29tcG9zaXRlMSwgZXBEQkMxKTsNCi0gICAgICAgICAgICBhc3NlcnRTYW1lKHNwYXJzZUNvbXBvc2l0ZTEsIGVwREJDMS5nZXRTcGFyc2VDb21wb3NpdGUoc2VydmljZURlbGVnYXRlMSkpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgc2Vjb25kIHNlcnZpY2UgDQotICAgICAgICAgICAgU2VydmljZSBzZXJ2aWNlMiA9IFNlcnZpY2UuY3JlYXRlKHdzZGxVcmwsIHNlcnZpY2VRTmFtZSk7DQotICAgICAgICAgICAgU2VydmljZURlbGVnYXRlIHNlcnZpY2VEZWxlZ2F0ZTIgPSBEZXNjcmlwdGlvblRlc3RVdGlsczIuZ2V0U2VydmljZURlbGVnYXRlKHNlcnZpY2UyKTsNCi0gICAgICAgICAgICBhc3NlcnROdWxsKFNlcnZpY2VEZWxlZ2F0ZS5nZXRTZXJ2aWNlTWV0YWRhdGEoKSk7DQotICAgICAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNlcnZpY2VEZXNjMiA9IHNlcnZpY2VEZWxlZ2F0ZTIuZ2V0U2VydmljZURlc2NyaXB0aW9uKCk7DQotDQotICAgICAgICAgICAgLy8gRG8gdGhlIGdldFBvcnQgb24gdGhlIHNlY29uZCBTZXJ2aWNlDQotICAgICAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIHNwYXJzZUNvbXBvc2l0ZTIgPSBuZXcgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCk7DQotICAgICAgICAgICAgYXNzZXJ0TnVsbChTZXJ2aWNlRGVsZWdhdGUuZ2V0UG9ydE1ldGFkYXRhKCkpOw0KLSAgICAgICAgICAgIFNlcnZpY2VEZWxlZ2F0ZS5zZXRQb3J0TWV0YWRhdGEoc3BhcnNlQ29tcG9zaXRlMik7DQotICAgICAgICAgICAgYXNzZXJ0TnVsbChTZXJ2aWNlRGVsZWdhdGUuZ2V0U2VydmljZU1ldGFkYXRhKCkpOw0KLSAgICAgICAgICAgIGFzc2VydFNhbWUoc3BhcnNlQ29tcG9zaXRlMiwgU2VydmljZURlbGVnYXRlLmdldFBvcnRNZXRhZGF0YSgpKTsNCi0gICAgICAgICAgICBDbGllbnRNZXRhZGF0YVBvcnRTRUkgcG9ydDIgPSBzZXJ2aWNlMi5nZXRQb3J0KHBvcnRRTiwgQ2xpZW50TWV0YWRhdGFQb3J0U0VJLmNsYXNzKTsNCi0gICAgICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVwRGVzY0FycmF5MltdID0gc2VydmljZURlc2MyLmdldEVuZHBvaW50RGVzY3JpcHRpb25zKCk7DQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGVwRGVzY0FycmF5Mi5sZW5ndGgpOw0KLSAgICAgICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBlcERCQzIgPSBlcERlc2NBcnJheTJbMF0uZ2V0RGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCk7DQotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChlcERCQzIpOw0KLSAgICAgICAgICAgIGFzc2VydE5vdFNhbWUoc3BhcnNlQ29tcG9zaXRlMiwgZXBEQkMyKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBTaW5jZSB3ZSBpbnN0YWxsZWQgYSBjYWNoaW5nIGNvbmZpZ3VyYXRpb24gZmFjdG9yeSBhYm92ZSwgdGhlIFNlcnZpY2VEZXNjcmlwdGlvbnMNCi0gICAgICAgICAgICAvLyBzaG91bGQgbWF0Y2ggZm9yIHRoZSB0d28gc2VydmljZSBkZWxlZ2F0ZXMuICBUaGUgRW5kcG9pbnREZXNjIGFuZCB0aGUgY29tcG9zaXRlDQotICAgICAgICAgICAgLy8gaW4gdGhlIEVuZHBvaW50RGVzYyBzaG91bGQgYmUgdGhlIHNhbWUuICBUaGUgc3BhcnNlIGNvbXBvc2l0ZSBzaG91bGQgYmUgdW5pcXVlIHRvDQotICAgICAgICAgICAgLy8gZWFjaCBzZXJ2aWNlIGRlbGVnYXRlLg0KLSAgICAgICAgICAgIGFzc2VydE5vdFNhbWUoc2VydmljZURlbGVnYXRlMSwgc2VydmljZURlbGVnYXRlMik7DQotICAgICAgICAgICAgYXNzZXJ0U2FtZShzZXJ2aWNlRGVzYzEsIHNlcnZpY2VEZXNjMik7DQotICAgICAgICAgICAgYXNzZXJ0U2FtZShlcERCQzEsIGVwREJDMik7DQotICAgICAgICAgICAgYXNzZXJ0U2FtZShlcERlc2NBcnJheTFbMF0sIGVwRGVzY0FycmF5MlswXSk7DQotICAgICAgICAgICAgYXNzZXJ0Tm90U2FtZShzcGFyc2VDb21wb3NpdGUxLCBzcGFyc2VDb21wb3NpdGUyKTsNCi0gICAgICAgICAgICBhc3NlcnRTYW1lKHNwYXJzZUNvbXBvc2l0ZTEsIGVwREJDMS5nZXRTcGFyc2VDb21wb3NpdGUoc2VydmljZURlbGVnYXRlMSkpOw0KLSAgICAgICAgICAgIGFzc2VydFNhbWUoc3BhcnNlQ29tcG9zaXRlMiwgZXBEQkMyLmdldFNwYXJzZUNvbXBvc2l0ZShzZXJ2aWNlRGVsZWdhdGUyKSk7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICAgIENsaWVudE1ldGFkYXRhVGVzdC5yZXN0b3JlT3JpZ2luYWxGYWN0b3J5KCk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBUZXN0IGRvaW5nIEdFVF9QT1JUIG9uIHNlcGVyYXRlIHBvcnRzIHVuZGVyIHRoZSBzYW1lIHNlcnZpY2UuICBUaGV5IHNob3VsZCBoYXZlIHVuaXF1ZQ0KLSAgICAgKiBFbmRwb2ludERlc3JpcHRpb25zIGFuZCB0aGUgc3BhcnNlIGNvbXBvc2l0ZXMgc2hvdWxkIGJlIHVuaXF1ZSB0byB0aGUgc2VydmljZSBkZWxlZ2F0ZSBhbmQNCi0gICAgICogZW5kcG9pbnQuDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVQb3J0c1NhbWVTZXJ2aWNlKCkgew0KLSAgICAgICAgUU5hbWUgc2VydmljZVFOYW1lID0gbmV3IFFOYW1lKG5hbWVzcGFjZVVSSSwgc3ZjTG9jYWxQYXJ0KTsNCi0gICAgICAgIFVSTCB3c2RsVXJsID0gQ2xpZW50TWV0YWRhdGFUZXN0LmdldFdzZGxVUkwobXVsdGlQb3J0V3NkbCk7DQotICAgICAgICBRTmFtZSBwb3J0UU4xID0gbmV3IFFOYW1lKG5hbWVzcGFjZVVSSSwgbXVsdGlQb3J0V3NkbF9wb3J0TG9jYWxQYXJ0MSk7DQotICAgICAgICBRTmFtZSBwb3J0UU4yID0gbmV3IFFOYW1lKG5hbWVzcGFjZVVSSSwgbXVsdGlQb3J0V3NkbF9wb3J0TG9jYWxQYXJ0Mik7DQotDQotICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSBTZXJ2aWNlLmNyZWF0ZSh3c2RsVXJsLCBzZXJ2aWNlUU5hbWUpOw0KLSAgICAgICAgU2VydmljZURlbGVnYXRlIHNlcnZpY2VEZWxlZ2F0ZSA9IERlc2NyaXB0aW9uVGVzdFV0aWxzMi5nZXRTZXJ2aWNlRGVsZWdhdGUoc2VydmljZSk7DQotICAgICAgICBhc3NlcnROdWxsKFNlcnZpY2VEZWxlZ2F0ZS5nZXRTZXJ2aWNlTWV0YWRhdGEoKSk7DQotICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc2VydmljZURlc2MgPSBzZXJ2aWNlRGVsZWdhdGUuZ2V0U2VydmljZURlc2NyaXB0aW9uKCk7DQotDQotICAgICAgICAvLyBEbyB0aGUgZmlyc3QgZ2V0UG9ydCBvbiB0aGUgZmlyc3QgU2VydmljZQ0KLSAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIHNwYXJzZUNvbXBvc2l0ZTEgPSBuZXcgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCk7DQotICAgICAgICBTZXJ2aWNlRGVsZWdhdGUuc2V0UG9ydE1ldGFkYXRhKHNwYXJzZUNvbXBvc2l0ZTEpOw0KLSAgICAgICAgYXNzZXJ0TnVsbChTZXJ2aWNlRGVsZWdhdGUuZ2V0U2VydmljZU1ldGFkYXRhKCkpOw0KLSAgICAgICAgYXNzZXJ0U2FtZShzcGFyc2VDb21wb3NpdGUxLCBTZXJ2aWNlRGVsZWdhdGUuZ2V0UG9ydE1ldGFkYXRhKCkpOw0KLSAgICAgICAgQ2xpZW50TWV0YWRhdGFQb3J0U0VJIHBvcnQxID0gc2VydmljZS5nZXRQb3J0KHBvcnRRTjEsIENsaWVudE1ldGFkYXRhUG9ydFNFSS5jbGFzcyk7DQotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVwRGVzY0FycmF5MVtdID0gc2VydmljZURlc2MuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbnMoKTsNCi0gICAgICAgIGFzc2VydEVxdWFscygxLCBlcERlc2NBcnJheTEubGVuZ3RoKTsNCi0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBlcERCQzEgPSBlcERlc2NBcnJheTFbMF0uZ2V0RGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKGVwREJDMSk7DQotICAgICAgICBhc3NlcnROb3RTYW1lKHNwYXJzZUNvbXBvc2l0ZTEsIGVwREJDMSk7DQotICAgICAgICBhc3NlcnRTYW1lKHNwYXJzZUNvbXBvc2l0ZTEsIGVwREJDMS5nZXRTcGFyc2VDb21wb3NpdGUoc2VydmljZURlbGVnYXRlKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIERvIGEgc2Vjb25kIGdldFBvcnQgZm9yIGEgZGlmZmVyZW50IHBvcnQgb24gdGhlIHNhbWUgc2VydmljZSB1c2luZyBhIGRpZmZlcmVudCBjb21wb3NpdGUNCi0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBzcGFyc2VDb21wb3NpdGUyID0gbmV3IERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSgpOw0KLSAgICAgICAgYXNzZXJ0TnVsbChTZXJ2aWNlRGVsZWdhdGUuZ2V0UG9ydE1ldGFkYXRhKCkpOw0KLSAgICAgICAgU2VydmljZURlbGVnYXRlLnNldFBvcnRNZXRhZGF0YShzcGFyc2VDb21wb3NpdGUyKTsNCi0gICAgICAgIGFzc2VydE51bGwoU2VydmljZURlbGVnYXRlLmdldFNlcnZpY2VNZXRhZGF0YSgpKTsNCi0gICAgICAgIGFzc2VydFNhbWUoc3BhcnNlQ29tcG9zaXRlMiwgU2VydmljZURlbGVnYXRlLmdldFBvcnRNZXRhZGF0YSgpKTsNCi0gICAgICAgIENsaWVudE1ldGFkYXRhUG9ydFNFSSBwb3J0MiA9IHNlcnZpY2UuZ2V0UG9ydChwb3J0UU4yLCBDbGllbnRNZXRhZGF0YVBvcnRTRUkuY2xhc3MpOw0KLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlcERlc2NBcnJheTJbXSA9IHNlcnZpY2VEZXNjLmdldEVuZHBvaW50RGVzY3JpcHRpb25zKCk7DQotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgZXBEZXNjQXJyYXkyLmxlbmd0aCk7DQotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVwZFBvcnQxID0gc2VydmljZURlc2MuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbihwb3J0UU4xKTsNCi0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZXBkUG9ydDIgPSBzZXJ2aWNlRGVzYy5nZXRFbmRwb2ludERlc2NyaXB0aW9uKHBvcnRRTjIpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChlcGRQb3J0MSk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKGVwZFBvcnQyKTsNCi0gICAgICAgIGFzc2VydE5vdFNhbWUoZXBkUG9ydDEsIGVwZFBvcnQyKTsNCi0gICAgICAgIA0KLSAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIGVwREJDMiA9IGVwZFBvcnQyLmdldERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSgpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChlcERCQzIpOw0KLSAgICAgICAgDQotICAgICAgICBhc3NlcnRTYW1lKGVwRGVzY0FycmF5MVswXSwgZXBkUG9ydDEpOw0KLSAgICAgICAgYXNzZXJ0Tm90U2FtZShlcERCQzEsIGVwREJDMik7DQotICAgICAgICANCi0gICAgICAgIGFzc2VydFNhbWUoc3BhcnNlQ29tcG9zaXRlMiwgZXBEQkMyLmdldFNwYXJzZUNvbXBvc2l0ZShzZXJ2aWNlRGVsZWdhdGUpKTsNCi0gICAgICAgIGFzc2VydE5vdFNhbWUoc3BhcnNlQ29tcG9zaXRlMiwgZXBEQkMxLmdldFNwYXJzZUNvbXBvc2l0ZShzZXJ2aWNlRGVsZWdhdGUpKTsNCi0gICAgICAgIA0KLSAgICAgICAgYXNzZXJ0U2FtZShzcGFyc2VDb21wb3NpdGUxLCBlcERCQzEuZ2V0U3BhcnNlQ29tcG9zaXRlKHNlcnZpY2VEZWxlZ2F0ZSkpOw0KLSAgICAgICAgYXNzZXJ0Tm90U2FtZShzcGFyc2VDb21wb3NpdGUxLCBlcERCQzIuZ2V0U3BhcnNlQ29tcG9zaXRlKHNlcnZpY2VEZWxlZ2F0ZSkpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBWYWxpZGF0ZSBzZXR0aW5nIGEgcHJlZmVyZWQgcG9ydCB3aGVuIGNyZWF0aW5nIHRoZSBzZXJ2aWNlIHJlc3VsdHMgaW4gYSBwYXJ0aWN1bGFyDQotICAgICAqIHBvcnQgYmVpbmcgcmV0dXJuZWQgb24gdGhlIGdldFBvcnQoQ2xhc3MpIGNhbGwuDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UHJlZmVycmVkUG9ydCgpIHsNCi0gICAgICAgIC8vIFdpdGhvdXQgc2V0dGluZyBhIHByZWZlcmVkIHBvcnQsIHRoZSBmaXJzdCBwb3J0IGluIHRoZSBXU0RMIHNob3VsZA0KLSAgICAgICAgLy8gYmUgcmV0dXJuZWQuDQotICAgICAgICBRTmFtZSBzZXJ2aWNlUU5hbWUgPSBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBzdmNMb2NhbFBhcnQpOw0KLSAgICAgICAgVVJMIHdzZGxVcmwgPSBDbGllbnRNZXRhZGF0YVRlc3QuZ2V0V3NkbFVSTChtdWx0aVBvcnRXc2RsKTsNCi0gICAgICAgIFFOYW1lIHBvcnRRTjEgPSBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBtdWx0aVBvcnRXc2RsX3BvcnRMb2NhbFBhcnQxKTsNCi0gICAgICAgIA0KLSAgICAgICAgU2VydmljZSBzZXJ2aWNlMSA9IFNlcnZpY2UuY3JlYXRlKHdzZGxVcmwsIHNlcnZpY2VRTmFtZSk7DQotICAgICAgICBDbGllbnRNZXRhZGF0YVBvcnRTRUkgcG9ydDEgPSBzZXJ2aWNlMS5nZXRQb3J0KENsaWVudE1ldGFkYXRhUG9ydFNFSS5jbGFzcyk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHBvcnQxKTsNCi0gICAgICAgIC8vIEdldCB0aGUgZW5kcG9pbnQgYWRkcmVzcyB0byB2ZXJpZnkgd2hpY2ggcG9ydCB3ZSBnb3QuICBOb3RlIHRoYXQgdGhlIFdTREwgaXMgc2V0dXANCi0gICAgICAgIC8vIHNvIHRoYXQgdGhlIGVuZHBvaW50IGFkZHJlc3MgZW5kcyB3aXRoIHRoZSBuYW1lIG9mIHRoZSBwb3J0IGZvciB0ZXN0aW5nLg0KLSAgICAgICAgQmluZGluZ1Byb3ZpZGVyIGJpbmRpbmdQcm92aWRlcjEgPSAoQmluZGluZ1Byb3ZpZGVyKSBwb3J0MTsNCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcmVxdWVzdENvbnRleHQxID0gYmluZGluZ1Byb3ZpZGVyMS5nZXRSZXF1ZXN0Q29udGV4dCgpOw0KLSAgICAgICAgU3RyaW5nIGVuZHBvaW50QWRkcmVzczEgPSAoU3RyaW5nKSByZXF1ZXN0Q29udGV4dDEuZ2V0KEJpbmRpbmdQcm92aWRlci5FTkRQT0lOVF9BRERSRVNTX1BST1BFUlRZKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwoZW5kcG9pbnRBZGRyZXNzMSk7DQotICAgICAgICAvLyBGSVhNRTogV2Ugc2hvdWxkIGdldCB0aGUgZmlyc3QgcG9ydCBpbiB0aGUgV1NETCwgYnV0IHRoYXQgaXNuJ3Qgd29ya2luZw0KLSAgICAgICAgLy8gRGVwZW5kaW5nIG9uIHRoZSBKREsgaW4gdXNlLCB0aGUgMm5kIG9yIDNyZCBwb3J0IGlzIHJldHVybmVkDQotLy8gICAgICAgIGFzc2VydFRydWUoZW5kcG9pbnRBZGRyZXNzLmVuZHNXaXRoKG11bHRpUG9ydFdzZGxfcG9ydExvY2FsUGFydDEpKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gU2V0IGEgcHJlZmVyZWQgcG9ydCBhbmQgY3JlYXRlIHRoZSBzZXJ2aWNlDQotICAgICAgICBRTmFtZSBwb3J0UU4yID0gbmV3IFFOYW1lKG5hbWVzcGFjZVVSSSwgbXVsdGlQb3J0V3NkbF9wb3J0TG9jYWxQYXJ0Mik7DQotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgc3BhcnNlQ29tcG9zaXRlMiA9IG5ldyBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUoKTsNCi0gICAgICAgIHNwYXJzZUNvbXBvc2l0ZTIuc2V0UHJlZmVycmVkUG9ydChwb3J0UU4yKTsNCi0gICAgICAgIFNlcnZpY2VEZWxlZ2F0ZS5zZXRTZXJ2aWNlTWV0YWRhdGEoc3BhcnNlQ29tcG9zaXRlMik7DQotICAgICAgICBTZXJ2aWNlIHNlcnZpY2UyID0gU2VydmljZS5jcmVhdGUod3NkbFVybCwgc2VydmljZVFOYW1lKTsNCi0gICAgICAgIENsaWVudE1ldGFkYXRhUG9ydFNFSSBwb3J0MiA9IHNlcnZpY2UyLmdldFBvcnQoQ2xpZW50TWV0YWRhdGFQb3J0U0VJLmNsYXNzKTsNCi0gICAgICAgIEJpbmRpbmdQcm92aWRlciBiaW5kaW5nUHJvdmlkZXIyID0gKEJpbmRpbmdQcm92aWRlcikgcG9ydDI7DQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHJlcXVlc3RDb250ZXh0MiA9IGJpbmRpbmdQcm92aWRlcjIuZ2V0UmVxdWVzdENvbnRleHQoKTsNCi0gICAgICAgIFN0cmluZyBlbmRwb2ludEFkZHJlc3MyID0gKFN0cmluZykgcmVxdWVzdENvbnRleHQyLmdldChCaW5kaW5nUHJvdmlkZXIuRU5EUE9JTlRfQUREUkVTU19QUk9QRVJUWSk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKGVuZHBvaW50QWRkcmVzczIpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShlbmRwb2ludEFkZHJlc3MyLmVuZHNXaXRoKG11bHRpUG9ydFdzZGxfcG9ydExvY2FsUGFydDIpKTsNCi0gICAgICAgIA0KLSAgICB9DQotICAgIC8qKg0KLSAgICAgKiBWYWxpZGF0ZSBzZXR0aW5nIGEgcHJlZmVyZWQgcG9ydCB3aGVuIGNyZWF0aW5nIHRoZSBzZXJ2aWNlIHJlc3VsdHMgaW4gYSBwYXJ0aWN1bGFyDQotICAgICAqIHBvcnQgYmVpbmcgcmV0dXJuZWQgb24gdGhlIGdldFBvcnQoQ2xhc3MpIGNhbGwuICBUaGUgU2VydmljZURlc2MgaW4gdGhpcyBjYXNlIA0KLSAgICAgKiBhcmUgY2FjaGVkLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdFByZWZlcnJlZFBvcnRDYWNoZWRTZXJ2aWNlKCkgew0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBDbGllbnRNZXRhZGF0YVRlc3QuaW5zdGFsbENhY2hpbmdGYWN0b3J5KCk7DQotDQotICAgICAgICAgICAgLy8gV2l0aG91dCBzZXR0aW5nIGEgcHJlZmVyZWQgcG9ydCwgdGhlIGZpcnN0IHBvcnQgaW4gdGhlIFdTREwgc2hvdWxkDQotICAgICAgICAgICAgLy8gYmUgcmV0dXJuZWQuDQotICAgICAgICAgICAgUU5hbWUgc2VydmljZVFOYW1lID0gbmV3IFFOYW1lKG5hbWVzcGFjZVVSSSwgc3ZjTG9jYWxQYXJ0KTsNCi0gICAgICAgICAgICBVUkwgd3NkbFVybCA9IENsaWVudE1ldGFkYXRhVGVzdC5nZXRXc2RsVVJMKG11bHRpUG9ydFdzZGwpOw0KLSAgICAgICAgICAgIFFOYW1lIHBvcnRRTjEgPSBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBtdWx0aVBvcnRXc2RsX3BvcnRMb2NhbFBhcnQxKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBTZXJ2aWNlIHNlcnZpY2UxID0gU2VydmljZS5jcmVhdGUod3NkbFVybCwgc2VydmljZVFOYW1lKTsNCi0gICAgICAgICAgICBTZXJ2aWNlRGVsZWdhdGUgc2VydmljZURlbGVnYXRlMSA9IERlc2NyaXB0aW9uVGVzdFV0aWxzMi5nZXRTZXJ2aWNlRGVsZWdhdGUoc2VydmljZTEpOw0KLSAgICAgICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzdmNEZXNjMSA9IHNlcnZpY2VEZWxlZ2F0ZTEuZ2V0U2VydmljZURlc2NyaXB0aW9uKCk7DQotICAgICAgICAgICAgQ2xpZW50TWV0YWRhdGFQb3J0U0VJIHBvcnQxID0gc2VydmljZTEuZ2V0UG9ydChDbGllbnRNZXRhZGF0YVBvcnRTRUkuY2xhc3MpOw0KLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwocG9ydDEpOw0KLSAgICAgICAgICAgIC8vIEdldCB0aGUgZW5kcG9pbnQgYWRkcmVzcyB0byB2ZXJpZnkgd2hpY2ggcG9ydCB3ZSBnb3QuICBOb3RlIHRoYXQgdGhlIFdTREwgaXMgc2V0dXANCi0gICAgICAgICAgICAvLyBzbyB0aGF0IHRoZSBlbmRwb2ludCBhZGRyZXNzIGVuZHMgd2l0aCB0aGUgbmFtZSBvZiB0aGUgcG9ydCBmb3IgdGVzdGluZy4NCi0gICAgICAgICAgICBCaW5kaW5nUHJvdmlkZXIgYmluZGluZ1Byb3ZpZGVyMSA9IChCaW5kaW5nUHJvdmlkZXIpIHBvcnQxOw0KLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcmVxdWVzdENvbnRleHQxID0gYmluZGluZ1Byb3ZpZGVyMS5nZXRSZXF1ZXN0Q29udGV4dCgpOw0KLSAgICAgICAgICAgIFN0cmluZyBlbmRwb2ludEFkZHJlc3MxID0gKFN0cmluZykgcmVxdWVzdENvbnRleHQxLmdldChCaW5kaW5nUHJvdmlkZXIuRU5EUE9JTlRfQUREUkVTU19QUk9QRVJUWSk7DQotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChlbmRwb2ludEFkZHJlc3MxKTsNCi0gICAgICAgICAgICAvLyBGSVhNRTogV2Ugc2hvdWxkIGdldCB0aGUgZmlyc3QgcG9ydCBpbiB0aGUgV1NETCwgYnV0IHRoYXQgaXNuJ3Qgd29ya2luZw0KLSAgICAgICAgICAgIC8vIERlcGVuZGluZyBvbiB0aGUgSkRLIGluIHVzZSwgdGhlIDJuZCBvciAzcmQgcG9ydCBpcyByZXR1cm5lZA0KLS8vICAgICAgICAgICAgYXNzZXJ0VHJ1ZShlbmRwb2ludEFkZHJlc3MuZW5kc1dpdGgobXVsdGlQb3J0V3NkbF9wb3J0TG9jYWxQYXJ0MSkpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIFNldCBhIHByZWZlcmVkIHBvcnQgYW5kIGNyZWF0ZSB0aGUgc2VydmljZQ0KLSAgICAgICAgICAgIFFOYW1lIHBvcnRRTjIgPSBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBtdWx0aVBvcnRXc2RsX3BvcnRMb2NhbFBhcnQyKTsNCi0gICAgICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgc3BhcnNlQ29tcG9zaXRlMiA9IG5ldyBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUoKTsNCi0gICAgICAgICAgICBzcGFyc2VDb21wb3NpdGUyLnNldFByZWZlcnJlZFBvcnQocG9ydFFOMik7DQotICAgICAgICAgICAgU2VydmljZURlbGVnYXRlLnNldFNlcnZpY2VNZXRhZGF0YShzcGFyc2VDb21wb3NpdGUyKTsNCi0gICAgICAgICAgICBTZXJ2aWNlIHNlcnZpY2UyID0gU2VydmljZS5jcmVhdGUod3NkbFVybCwgc2VydmljZVFOYW1lKTsNCi0gICAgICAgICAgICBTZXJ2aWNlRGVsZWdhdGUgc2VydmljZURlbGVnYXRlMiA9IERlc2NyaXB0aW9uVGVzdFV0aWxzMi5nZXRTZXJ2aWNlRGVsZWdhdGUoc2VydmljZTIpOw0KLSAgICAgICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzdmNEZXNjMiA9IHNlcnZpY2VEZWxlZ2F0ZTIuZ2V0U2VydmljZURlc2NyaXB0aW9uKCk7DQotICAgICAgICAgICAgYXNzZXJ0Tm90U2FtZShzZXJ2aWNlMSwgc2VydmljZTIpOw0KLSAgICAgICAgICAgIGFzc2VydE5vdFNhbWUoc2VydmljZURlbGVnYXRlMSwgc2VydmljZURlbGVnYXRlMik7DQotICAgICAgICAgICAgYXNzZXJ0U2FtZShzdmNEZXNjMSwgc3ZjRGVzYzIpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIENsaWVudE1ldGFkYXRhUG9ydFNFSSBwb3J0MiA9IHNlcnZpY2UyLmdldFBvcnQoQ2xpZW50TWV0YWRhdGFQb3J0U0VJLmNsYXNzKTsNCi0gICAgICAgICAgICBCaW5kaW5nUHJvdmlkZXIgYmluZGluZ1Byb3ZpZGVyMiA9IChCaW5kaW5nUHJvdmlkZXIpIHBvcnQyOw0KLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcmVxdWVzdENvbnRleHQyID0gYmluZGluZ1Byb3ZpZGVyMi5nZXRSZXF1ZXN0Q29udGV4dCgpOw0KLSAgICAgICAgICAgIFN0cmluZyBlbmRwb2ludEFkZHJlc3MyID0gKFN0cmluZykgcmVxdWVzdENvbnRleHQyLmdldChCaW5kaW5nUHJvdmlkZXIuRU5EUE9JTlRfQUREUkVTU19QUk9QRVJUWSk7DQotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChlbmRwb2ludEFkZHJlc3MyKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGVuZHBvaW50QWRkcmVzczIuZW5kc1dpdGgobXVsdGlQb3J0V3NkbF9wb3J0TG9jYWxQYXJ0MikpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIENyZWF0ZSBhIHRoaXJkIHNlcnZpY2Ugd2l0aG91dCBhIGNvbXBvc2l0ZSBhbmQgbWFrZSBzdXJlIHRoZSBwcmV2aW91cyBjb21wb3NpdGUNCi0gICAgICAgICAgICAvLyBzZXR0aW5nIG9mIHByZWZlcnJlZCBwb3J0IGRvZXNuJ3QgYWZmZWN0IHRoaXMgb25lLg0KLSAgICAgICAgICAgIFNlcnZpY2Ugc2VydmljZTMgPSBTZXJ2aWNlLmNyZWF0ZSh3c2RsVXJsLCBzZXJ2aWNlUU5hbWUpOw0KLSAgICAgICAgICAgIFNlcnZpY2VEZWxlZ2F0ZSBzZXJ2aWNlRGVsZWdhdGUzID0gRGVzY3JpcHRpb25UZXN0VXRpbHMyLmdldFNlcnZpY2VEZWxlZ2F0ZShzZXJ2aWNlMyk7DQotICAgICAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHN2Y0Rlc2MzID0gc2VydmljZURlbGVnYXRlMy5nZXRTZXJ2aWNlRGVzY3JpcHRpb24oKTsNCi0gICAgICAgICAgICBhc3NlcnROb3RTYW1lKHNlcnZpY2UyLCBzZXJ2aWNlMyk7DQotICAgICAgICAgICAgYXNzZXJ0Tm90U2FtZShzZXJ2aWNlRGVsZWdhdGUxLCBzZXJ2aWNlRGVsZWdhdGUzKTsNCi0gICAgICAgICAgICBhc3NlcnROb3RTYW1lKHNlcnZpY2VEZWxlZ2F0ZTIsIHNlcnZpY2VEZWxlZ2F0ZTMpOw0KLSAgICAgICAgICAgIGFzc2VydFNhbWUoc3ZjRGVzYzEsIHN2Y0Rlc2MzKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBDbGllbnRNZXRhZGF0YVBvcnRTRUkgcG9ydDMgPSBzZXJ2aWNlMy5nZXRQb3J0KENsaWVudE1ldGFkYXRhUG9ydFNFSS5jbGFzcyk7DQotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChwb3J0Myk7DQotICAgICAgICAgICAgQmluZGluZ1Byb3ZpZGVyIGJpbmRpbmdQcm92aWRlcjMgPSAoQmluZGluZ1Byb3ZpZGVyKSBwb3J0MzsNCi0gICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHJlcXVlc3RDb250ZXh0MyA9IGJpbmRpbmdQcm92aWRlcjMuZ2V0UmVxdWVzdENvbnRleHQoKTsNCi0gICAgICAgICAgICBTdHJpbmcgZW5kcG9pbnRBZGRyZXNzMyA9IChTdHJpbmcpIHJlcXVlc3RDb250ZXh0My5nZXQoQmluZGluZ1Byb3ZpZGVyLkVORFBPSU5UX0FERFJFU1NfUFJPUEVSVFkpOw0KLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoZW5kcG9pbnRBZGRyZXNzMSk7DQotICAgICAgICAgICAgLy8gRklYTUU6IFdlIHNob3VsZCBnZXQgdGhlIGZpcnN0IHBvcnQgaW4gdGhlIFdTREwsIGJ1dCB0aGF0IGlzbid0IHdvcmtpbmcNCi0gICAgICAgICAgICAvLyBEZXBlbmRpbmcgb24gdGhlIEpESyBpbiB1c2UsIHRoZSAybmQgb3IgM3JkIHBvcnQgaXMgcmV0dXJuZWQNCi0vLyAgICAgICAgICAgIGFzc2VydFRydWUoZW5kcG9pbnRBZGRyZXNzLmVuZHNXaXRoKG11bHRpUG9ydFdzZGxfcG9ydExvY2FsUGFydDEpKTsNCi0NCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgICAgQ2xpZW50TWV0YWRhdGFUZXN0LnJlc3RvcmVPcmlnaW5hbEZhY3RvcnkoKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFZhbGlkYXRlIGVuYWJsaW5nIE1UT00gd2hlbiBjcmVhdGluZyB0aGUgc2VydmljZSByZXN1bHRzIHBvcnRzIGNyZWF0ZWQgdW5kZXIgdGhhdCBzZXJ2aWNlDQotICAgICAqIGhhdmUgTVRPTSBlbmFibGVkLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdEVuYWJsZU1UT00oKSB7DQotICAgICAgICBRTmFtZSBzZXJ2aWNlUU5hbWUgPSBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBzdmNMb2NhbFBhcnQpOw0KLSAgICAgICAgVVJMIHdzZGxVcmwgPSBDbGllbnRNZXRhZGF0YVRlc3QuZ2V0V3NkbFVSTChtdWx0aVBvcnRXc2RsKTsNCi0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBzcGFyc2VDb21wb3NpdGUgPSBuZXcgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCk7DQotICAgICAgICBzcGFyc2VDb21wb3NpdGUuc2V0SXNNVE9NRW5hYmxlZCh0cnVlKTsNCi0gICAgICAgIFNlcnZpY2VEZWxlZ2F0ZS5zZXRTZXJ2aWNlTWV0YWRhdGEoc3BhcnNlQ29tcG9zaXRlKTsNCi0gICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IFNlcnZpY2UuY3JlYXRlKHdzZGxVcmwsIHNlcnZpY2VRTmFtZSk7DQotICAgICAgICBDbGllbnRNZXRhZGF0YVBvcnRTRUkgcG9ydCA9IHNlcnZpY2UuZ2V0UG9ydChDbGllbnRNZXRhZGF0YVBvcnRTRUkuY2xhc3MpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChwb3J0KTsNCi0gICAgICAgIC8vIFZlcmlmeSB0aGF0IE1UT00gaXMgZW5hYmxlZCBvbiB0aGlzIHBvcnQuDQotICAgICAgICBCaW5kaW5nUHJvdmlkZXIgYmluZGluZ1Byb3ZpZGVyID0gKEJpbmRpbmdQcm92aWRlcikgcG9ydDsNCi0gICAgICAgIFNPQVBCaW5kaW5nIGJpbmRpbmcgPSAoU09BUEJpbmRpbmcpIGJpbmRpbmdQcm92aWRlci5nZXRCaW5kaW5nKCk7DQotICAgICAgICBhc3NlcnRUcnVlKGJpbmRpbmcuaXNNVE9NRW5hYmxlZCgpKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gVmVyaWZ5IHRoYXQgc3BlY2lmaWMgcG9ydHMgdW5kZXIgdGhpcyBzZXJ2aWNlIGFsc28gaGF2ZSBNVE9NIGVuYWJsZWQNCi0gICAgICAgIFFOYW1lIHBvcnQxUU4gPSBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBtdWx0aVBvcnRXc2RsX3BvcnRMb2NhbFBhcnQxKTsNCi0gICAgICAgIENsaWVudE1ldGFkYXRhUG9ydFNFSSBwb3J0MSA9IHNlcnZpY2UuZ2V0UG9ydChwb3J0MVFOLCBDbGllbnRNZXRhZGF0YVBvcnRTRUkuY2xhc3MpOw0KLSAgICAgICAgU09BUEJpbmRpbmcgYmluZGluZzEgPSAoKFNPQVBCaW5kaW5nKSAoKEJpbmRpbmdQcm92aWRlcikgcG9ydDEpLmdldEJpbmRpbmcoKSk7DQotICAgICAgICBhc3NlcnRUcnVlKGJpbmRpbmcxLmlzTVRPTUVuYWJsZWQoKSk7DQotICAgICAgICANCi0gICAgICAgIFFOYW1lIHBvcnQyUU4gPSBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBtdWx0aVBvcnRXc2RsX3BvcnRMb2NhbFBhcnQyKTsNCi0gICAgICAgIENsaWVudE1ldGFkYXRhUG9ydFNFSSBwb3J0MiA9IHNlcnZpY2UuZ2V0UG9ydChwb3J0MlFOLCBDbGllbnRNZXRhZGF0YVBvcnRTRUkuY2xhc3MpOw0KLSAgICAgICAgU09BUEJpbmRpbmcgYmluZGluZzIgPSAoKFNPQVBCaW5kaW5nKSAoKEJpbmRpbmdQcm92aWRlcikgcG9ydDIpLmdldEJpbmRpbmcoKSk7DQotICAgICAgICBhc3NlcnRUcnVlKGJpbmRpbmcyLmlzTVRPTUVuYWJsZWQoKSk7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBWYWxpZGF0ZSBlbmFibGluZyBNVE9NIHdoZW4gY3JlYXRpbmcgdGhlIHNlcnZpY2UgcmVzdWx0cyBwb3J0cyBjcmVhdGVkIHVuZGVyIHRoYXQgc2VydmljZQ0KLSAgICAgKiBoYXZlIE1UT00gZW5hYmxlZC4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RFbmFibGVNVE9NRnJvbVNlcnZpY2VEQkMoKSB7DQotICAgICAgICBRTmFtZSBzZXJ2aWNlUU5hbWUgPSBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBzdmNMb2NhbFBhcnQpOw0KLSAgICAgICAgVVJMIHdzZGxVcmwgPSBDbGllbnRNZXRhZGF0YVRlc3QuZ2V0V3NkbFVSTChtdWx0aVBvcnRXc2RsKTsNCi0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBzcGFyc2VDb21wb3NpdGUgPSBuZXcgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCk7DQotICAgICAgICBNYXA8U3RyaW5nLCBCb29sZWFuPiBzZWlUb01UT00gPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEJvb2xlYW4+KCk7DQotICAgICAgICBzZWlUb01UT00ucHV0KENsaWVudE1ldGFkYXRhUG9ydFNFSS5jbGFzcy5nZXROYW1lKCksIHRydWUpOw0KLSAgICAgICAgc3BhcnNlQ29tcG9zaXRlLmdldFByb3BlcnRpZXMoKS5wdXQoTURRQ29uc3RhbnRzLlNFSV9NVE9NX0VOQUJMRU1FTlRfTUFQLCBzZWlUb01UT00pOw0KLSAgICAgICAgU2VydmljZURlbGVnYXRlLnNldFNlcnZpY2VNZXRhZGF0YShzcGFyc2VDb21wb3NpdGUpOw0KLSAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gU2VydmljZS5jcmVhdGUod3NkbFVybCwgc2VydmljZVFOYW1lKTsNCi0gICAgICAgIENsaWVudE1ldGFkYXRhUG9ydFNFSSBwb3J0ID0gc2VydmljZS5nZXRQb3J0KENsaWVudE1ldGFkYXRhUG9ydFNFSS5jbGFzcyk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHBvcnQpOw0KLSAgICAgICAgLy8gVmVyaWZ5IHRoYXQgTVRPTSBpcyBlbmFibGVkIG9uIHRoaXMgcG9ydC4NCi0gICAgICAgIEJpbmRpbmdQcm92aWRlciBiaW5kaW5nUHJvdmlkZXIgPSAoQmluZGluZ1Byb3ZpZGVyKSBwb3J0Ow0KLSAgICAgICAgU09BUEJpbmRpbmcgYmluZGluZyA9IChTT0FQQmluZGluZykgYmluZGluZ1Byb3ZpZGVyLmdldEJpbmRpbmcoKTsNCi0gICAgICAgIGFzc2VydFRydWUoYmluZGluZy5pc01UT01FbmFibGVkKCkpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBWZXJpZnkgdGhhdCBzcGVjaWZpYyBwb3J0cyB1bmRlciB0aGlzIHNlcnZpY2UgYWxzbyBoYXZlIE1UT00gZW5hYmxlZA0KLSAgICAgICAgUU5hbWUgcG9ydDFRTiA9IG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIG11bHRpUG9ydFdzZGxfcG9ydExvY2FsUGFydDEpOw0KLSAgICAgICAgQ2xpZW50TWV0YWRhdGFQb3J0U0VJIHBvcnQxID0gc2VydmljZS5nZXRQb3J0KHBvcnQxUU4sIENsaWVudE1ldGFkYXRhUG9ydFNFSS5jbGFzcyk7DQotICAgICAgICBTT0FQQmluZGluZyBiaW5kaW5nMSA9ICgoU09BUEJpbmRpbmcpICgoQmluZGluZ1Byb3ZpZGVyKSBwb3J0MSkuZ2V0QmluZGluZygpKTsNCi0gICAgICAgIGFzc2VydFRydWUoYmluZGluZzEuaXNNVE9NRW5hYmxlZCgpKTsNCi0gICAgICAgIA0KLSAgICAgICAgUU5hbWUgcG9ydDJRTiA9IG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIG11bHRpUG9ydFdzZGxfcG9ydExvY2FsUGFydDIpOw0KLSAgICAgICAgQ2xpZW50TWV0YWRhdGFQb3J0U0VJIHBvcnQyID0gc2VydmljZS5nZXRQb3J0KHBvcnQyUU4sIENsaWVudE1ldGFkYXRhUG9ydFNFSS5jbGFzcyk7DQotICAgICAgICBTT0FQQmluZGluZyBiaW5kaW5nMiA9ICgoU09BUEJpbmRpbmcpICgoQmluZGluZ1Byb3ZpZGVyKSBwb3J0MikuZ2V0QmluZGluZygpKTsNCi0gICAgICAgIGFzc2VydFRydWUoYmluZGluZzIuaXNNVE9NRW5hYmxlZCgpKTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFZhbGlkYXRlIGVuYWJsaW5nIE1UT00gd2hlbiBjcmVhdGluZyB0aGUgc2VydmljZSByZXN1bHRzIHBvcnRzIGNyZWF0ZWQgdW5kZXIgdGhhdCBzZXJ2aWNlDQotICAgICAqIGhhdmUgTVRPTSBlbmFibGVkLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdERpc2FibGVNVE9NRnJvbVNlcnZpY2VEQkMoKSB7DQotICAgICAgICBRTmFtZSBzZXJ2aWNlUU5hbWUgPSBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBzdmNMb2NhbFBhcnQpOw0KLSAgICAgICAgVVJMIHdzZGxVcmwgPSBDbGllbnRNZXRhZGF0YVRlc3QuZ2V0V3NkbFVSTChtdWx0aVBvcnRXc2RsKTsNCi0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBzcGFyc2VDb21wb3NpdGUgPSBuZXcgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCk7DQotICAgICAgICBNYXA8U3RyaW5nLCBCb29sZWFuPiBzZWlUb01UT00gPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEJvb2xlYW4+KCk7DQotICAgICAgICBzZWlUb01UT00ucHV0KENsaWVudE1ldGFkYXRhUG9ydFNFSS5jbGFzcy5nZXROYW1lKCksIGZhbHNlKTsNCi0gICAgICAgIHNwYXJzZUNvbXBvc2l0ZS5nZXRQcm9wZXJ0aWVzKCkucHV0KE1EUUNvbnN0YW50cy5TRUlfTVRPTV9FTkFCTEVNRU5UX01BUCwgc2VpVG9NVE9NKTsNCi0gICAgICAgIFNlcnZpY2VEZWxlZ2F0ZS5zZXRTZXJ2aWNlTWV0YWRhdGEoc3BhcnNlQ29tcG9zaXRlKTsNCi0gICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IFNlcnZpY2UuY3JlYXRlKHdzZGxVcmwsIHNlcnZpY2VRTmFtZSk7DQotICAgICAgICBDbGllbnRNZXRhZGF0YVBvcnRTRUkgcG9ydCA9IHNlcnZpY2UuZ2V0UG9ydChDbGllbnRNZXRhZGF0YVBvcnRTRUkuY2xhc3MpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChwb3J0KTsNCi0gICAgICAgIC8vIFZlcmlmeSB0aGF0IE1UT00gaXMgZW5hYmxlZCBvbiB0aGlzIHBvcnQuDQotICAgICAgICBCaW5kaW5nUHJvdmlkZXIgYmluZGluZ1Byb3ZpZGVyID0gKEJpbmRpbmdQcm92aWRlcikgcG9ydDsNCi0gICAgICAgIFNPQVBCaW5kaW5nIGJpbmRpbmcgPSAoU09BUEJpbmRpbmcpIGJpbmRpbmdQcm92aWRlci5nZXRCaW5kaW5nKCk7DQotICAgICAgICBhc3NlcnRUcnVlKCFiaW5kaW5nLmlzTVRPTUVuYWJsZWQoKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIFZlcmlmeSB0aGF0IHNwZWNpZmljIHBvcnRzIHVuZGVyIHRoaXMgc2VydmljZSBhbHNvIGhhdmUgTVRPTSBlbmFibGVkDQotICAgICAgICBRTmFtZSBwb3J0MVFOID0gbmV3IFFOYW1lKG5hbWVzcGFjZVVSSSwgbXVsdGlQb3J0V3NkbF9wb3J0TG9jYWxQYXJ0MSk7DQotICAgICAgICBDbGllbnRNZXRhZGF0YVBvcnRTRUkgcG9ydDEgPSBzZXJ2aWNlLmdldFBvcnQocG9ydDFRTiwgQ2xpZW50TWV0YWRhdGFQb3J0U0VJLmNsYXNzKTsNCi0gICAgICAgIFNPQVBCaW5kaW5nIGJpbmRpbmcxID0gKChTT0FQQmluZGluZykgKChCaW5kaW5nUHJvdmlkZXIpIHBvcnQxKS5nZXRCaW5kaW5nKCkpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSghYmluZGluZzEuaXNNVE9NRW5hYmxlZCgpKTsNCi0gICAgICAgIA0KLSAgICAgICAgUU5hbWUgcG9ydDJRTiA9IG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIG11bHRpUG9ydFdzZGxfcG9ydExvY2FsUGFydDIpOw0KLSAgICAgICAgQ2xpZW50TWV0YWRhdGFQb3J0U0VJIHBvcnQyID0gc2VydmljZS5nZXRQb3J0KHBvcnQyUU4sIENsaWVudE1ldGFkYXRhUG9ydFNFSS5jbGFzcyk7DQotICAgICAgICBTT0FQQmluZGluZyBiaW5kaW5nMiA9ICgoU09BUEJpbmRpbmcpICgoQmluZGluZ1Byb3ZpZGVyKSBwb3J0MikuZ2V0QmluZGluZygpKTsNCi0gICAgICAgIGFzc2VydFRydWUoIWJpbmRpbmcyLmlzTVRPTUVuYWJsZWQoKSk7DQotICAgIH0NCi0gICAgDQotICAgIA0KLSAgICAvKioNCi0gICAgICogVmFsaWRhdGUgZW5hYmxpbmcgTVRPTSB3aGVuIGNyZWF0aW5nIHRoZSBzZXJ2aWNlIHJlc3VsdHMgaW4gZW5hYmxlbWVudCBvbmx5DQotICAgICAqIGZvciB0aGF0IHNlcnZpY2UgZGVsZWdhdGUsIGFuZCBub3QgYSBkaWZmZXJlbnQgc2VydmljZSBkZWxlZ2F0ZSByZWZlcmVuY2luZw0KLSAgICAgKiB0aGUgc2FtZSBzZXJ2aWNlLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdEVuYWJsZU1UT01DYWNoZWRTZXJ2aWNlKCkgew0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBDbGllbnRNZXRhZGF0YVRlc3QuaW5zdGFsbENhY2hpbmdGYWN0b3J5KCk7DQotDQotICAgICAgICAgICAgUU5hbWUgc2VydmljZVFOYW1lID0gbmV3IFFOYW1lKG5hbWVzcGFjZVVSSSwgc3ZjTG9jYWxQYXJ0KTsNCi0gICAgICAgICAgICBVUkwgd3NkbFVybCA9IENsaWVudE1ldGFkYXRhVGVzdC5nZXRXc2RsVVJMKG11bHRpUG9ydFdzZGwpOw0KLQ0KLSAgICAgICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBzcGFyc2VDb21wb3NpdGUgPSBuZXcgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCk7DQotICAgICAgICAgICAgc3BhcnNlQ29tcG9zaXRlLnNldElzTVRPTUVuYWJsZWQodHJ1ZSk7DQotICAgICAgICAgICAgU2VydmljZURlbGVnYXRlLnNldFNlcnZpY2VNZXRhZGF0YShzcGFyc2VDb21wb3NpdGUpOw0KLSAgICAgICAgICAgIFNlcnZpY2Ugc2VydmljZTEgPSBTZXJ2aWNlLmNyZWF0ZSh3c2RsVXJsLCBzZXJ2aWNlUU5hbWUpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIFNlcnZpY2Ugc2VydmljZTIgPSBTZXJ2aWNlLmNyZWF0ZSh3c2RsVXJsLCBzZXJ2aWNlUU5hbWUpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIFFOYW1lIHBvcnRRTiA9IG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIG11bHRpUG9ydFdzZGxfcG9ydExvY2FsUGFydDEpOw0KLSAgICAgICAgICAgIENsaWVudE1ldGFkYXRhUG9ydFNFSSBwb3J0MSA9IHNlcnZpY2UxLmdldFBvcnQocG9ydFFOLCBDbGllbnRNZXRhZGF0YVBvcnRTRUkuY2xhc3MpOw0KLSAgICAgICAgICAgIENsaWVudE1ldGFkYXRhUG9ydFNFSSBwb3J0MiA9IHNlcnZpY2UyLmdldFBvcnQocG9ydFFOLCBDbGllbnRNZXRhZGF0YVBvcnRTRUkuY2xhc3MpOw0KLQ0KLSAgICAgICAgICAgIFNPQVBCaW5kaW5nIGJpbmRpbmcxID0gKChTT0FQQmluZGluZykgKChCaW5kaW5nUHJvdmlkZXIpIHBvcnQxKS5nZXRCaW5kaW5nKCkpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUoYmluZGluZzEuaXNNVE9NRW5hYmxlZCgpKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBTT0FQQmluZGluZyBiaW5kaW5nMiA9ICgoU09BUEJpbmRpbmcpICgoQmluZGluZ1Byb3ZpZGVyKSBwb3J0MikuZ2V0QmluZGluZygpKTsNCi0gICAgICAgICAgICBhc3NlcnRGYWxzZShiaW5kaW5nMi5pc01UT01FbmFibGVkKCkpOw0KLQ0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgICBDbGllbnRNZXRhZGF0YVRlc3QucmVzdG9yZU9yaWdpbmFsRmFjdG9yeSgpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgICAgICANCi0gICAgLyoqDQotICAgICAqIFZhbGlkYXRlIGVuYWJsaW5nIHRoZSBzZXR0aW5nIG9mIHByb3BlcnRpZXMgb24gdGhlIEJpbmRpbmdQcm92aWRlciBiYXNlZA0KLSAgICAgKiBvbiBhIG1hcCBvZiBwcm9wZXJ0aWVzIHN1cHBsaWVkIHRvIHRoZSBzcGFyc2UgY29tcG9zaXRlLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdFNldEJpbmRpbmdQcm9wZXJ0aWVzKCkgew0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBDbGllbnRNZXRhZGF0YVRlc3QuaW5zdGFsbENhY2hpbmdGYWN0b3J5KCk7DQotDQotICAgICAgICAgICAgUU5hbWUgc2VydmljZVFOYW1lID0gbmV3IFFOYW1lKG5hbWVzcGFjZVVSSSwgc3ZjTG9jYWxQYXJ0KTsNCi0gICAgICAgICAgICBVUkwgd3NkbFVybCA9IENsaWVudE1ldGFkYXRhVGVzdC5nZXRXc2RsVVJMKG11bHRpUG9ydFdzZGwpOw0KLSAgICAgICAgICAgIFFOYW1lIHBvcnRRTiA9IG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIG11bHRpUG9ydFdzZGxfcG9ydExvY2FsUGFydDEpOw0KLQ0KLSAgICAgICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBzcGFyc2VDb21wb3NpdGUgPSBuZXcgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCk7DQotICAgICAgICAgICAgc3BhcnNlQ29tcG9zaXRlLnNldElzTVRPTUVuYWJsZWQodHJ1ZSk7DQotICAgICAgICAgICAgTWFwPFN0cmluZywgTWFwPFN0cmluZywgT2JqZWN0Pj4gYWxsQmluZGluZ1Byb3BzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLE9iamVjdD4+KCk7DQotICAgICAgICAgICAgU3RyaW5nIGtleSA9IENsaWVudE1ldGFkYXRhUG9ydFNFSS5jbGFzcy5nZXROYW1lKCkgKyAiOiIgKyBwb3J0UU4udG9TdHJpbmcoKTsNCi0gICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IGJpbmRpbmdQcm9wcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLSAgICAgICAgICAgIGJpbmRpbmdQcm9wcy5wdXQoImN1c3RvbVByb3BlcnR5IiwgInNvbWVWYWx1ZSIpOw0KLSAgICAgICAgICAgIGFsbEJpbmRpbmdQcm9wcy5wdXQoa2V5LCBiaW5kaW5nUHJvcHMpOw0KLSAgICAgICAgICAgIHNwYXJzZUNvbXBvc2l0ZS5nZXRQcm9wZXJ0aWVzKCkucHV0KE1EUUNvbnN0YW50cy5CSU5ESU5HX1BST1BTX01BUCwgYWxsQmluZGluZ1Byb3BzKTsNCi0NCi0gICAgICAgICAgICBTZXJ2aWNlRGVsZWdhdGUuc2V0U2VydmljZU1ldGFkYXRhKHNwYXJzZUNvbXBvc2l0ZSk7DQotICAgICAgICAgICAgU2VydmljZSBzZXJ2aWNlMSA9IFNlcnZpY2UuY3JlYXRlKHdzZGxVcmwsIHNlcnZpY2VRTmFtZSk7DQotICAgICAgICAgICAgQ2xpZW50TWV0YWRhdGFQb3J0U0VJIHBvcnQxID0gc2VydmljZTEuZ2V0UG9ydChwb3J0UU4sIENsaWVudE1ldGFkYXRhUG9ydFNFSS5jbGFzcyk7DQotICAgICAgICAgICAgQmluZGluZ1Byb3ZpZGVyIGJwID0gKEJpbmRpbmdQcm92aWRlcikgcG9ydDE7DQotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChicC5nZXRSZXF1ZXN0Q29udGV4dCgpLmdldCgiY3VzdG9tUHJvcGVydHkiKSk7DQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGJwLmdldFJlcXVlc3RDb250ZXh0KCkuZ2V0KCJjdXN0b21Qcm9wZXJ0eSIpLCAic29tZVZhbHVlIik7DQotDQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICAgIENsaWVudE1ldGFkYXRhVGVzdC5yZXN0b3JlT3JpZ2luYWxGYWN0b3J5KCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFRoaXMgd2lsbCB2YWxpZGF0ZSB0aGF0IHRoZSBwcm9wZXJ0aWVzIHRvIGJlIHNldCBvbiB0aGUgQmluZGluZ1Byb3ZpZGVyLCB2aWENCi0gICAgICogdGhlIHNwYXJzZSBjb21wb3NpdGUsIGNhbiBiZSBjb3JyZWN0bHkgc2NvcGVkIGF0IHRoZSBwb3J0IGxldmVsLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdE5vU2V0QmluZGluZ1Byb3BlcnRpZXMoKSB7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIENsaWVudE1ldGFkYXRhVGVzdC5pbnN0YWxsQ2FjaGluZ0ZhY3RvcnkoKTsNCi0NCi0gICAgICAgICAgICBRTmFtZSBzZXJ2aWNlUU5hbWUgPSBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBzdmNMb2NhbFBhcnQpOw0KLSAgICAgICAgICAgIFVSTCB3c2RsVXJsID0gQ2xpZW50TWV0YWRhdGFUZXN0LmdldFdzZGxVUkwobXVsdGlQb3J0V3NkbCk7DQotICAgICAgICAgICAgUU5hbWUgcG9ydFFOID0gbmV3IFFOYW1lKG5hbWVzcGFjZVVSSSwgbXVsdGlQb3J0V3NkbF9wb3J0TG9jYWxQYXJ0Mik7DQotDQotICAgICAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIHNwYXJzZUNvbXBvc2l0ZSA9IG5ldyBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUoKTsNCi0gICAgICAgICAgICBzcGFyc2VDb21wb3NpdGUuc2V0SXNNVE9NRW5hYmxlZCh0cnVlKTsNCi0gICAgICAgICAgICBNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLCBPYmplY3Q+PiBhbGxCaW5kaW5nUHJvcHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsT2JqZWN0Pj4oKTsNCi0gICAgICAgICAgICBTdHJpbmcga2V5ID0gQ2xpZW50TWV0YWRhdGFQb3J0U0VJLmNsYXNzLmdldE5hbWUoKSArICI6IiArIHBvcnRRTi50b1N0cmluZygpOw0KLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gYmluZGluZ1Byb3BzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotICAgICAgICAgICAgYmluZGluZ1Byb3BzLnB1dCgiY3VzdG9tUHJvcGVydHkiLCAic29tZVZhbHVlIik7DQotICAgICAgICAgICAgYWxsQmluZGluZ1Byb3BzLnB1dChrZXksIGJpbmRpbmdQcm9wcyk7DQotICAgICAgICAgICAgc3BhcnNlQ29tcG9zaXRlLmdldFByb3BlcnRpZXMoKS5wdXQoTURRQ29uc3RhbnRzLkJJTkRJTkdfUFJPUFNfTUFQLCBhbGxCaW5kaW5nUHJvcHMpOw0KLQ0KLSAgICAgICAgICAgIFNlcnZpY2VEZWxlZ2F0ZS5zZXRTZXJ2aWNlTWV0YWRhdGEoc3BhcnNlQ29tcG9zaXRlKTsNCi0gICAgICAgICAgICBTZXJ2aWNlIHNlcnZpY2UxID0gU2VydmljZS5jcmVhdGUod3NkbFVybCwgc2VydmljZVFOYW1lKTsNCi0gICAgICAgICAgICBDbGllbnRNZXRhZGF0YVBvcnRTRUkgcG9ydDEgPSBzZXJ2aWNlMS5nZXRQb3J0KG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIG11bHRpUG9ydFdzZGxfcG9ydExvY2FsUGFydDEpLCANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsaWVudE1ldGFkYXRhUG9ydFNFSS5jbGFzcyk7DQotICAgICAgICAgICAgQmluZGluZ1Byb3ZpZGVyIGJwID0gKEJpbmRpbmdQcm92aWRlcikgcG9ydDE7DQotICAgICAgICAgICAgYXNzZXJ0TnVsbChicC5nZXRSZXF1ZXN0Q29udGV4dCgpLmdldCgiY3VzdG9tUHJvcGVydHkiKSk7DQotDQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICAgIENsaWVudE1ldGFkYXRhVGVzdC5yZXN0b3JlT3JpZ2luYWxGYWN0b3J5KCk7DQotICAgICAgICB9DQotICAgIH0NCi19DQotDQotQFdlYlNlcnZpY2UobmFtZT0iRWNob01lc3NhZ2VQb3J0VHlwZSIsIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2Rlc2NyaXB0aW9uLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciKQ0KLWludGVyZmFjZSBDbGllbnRNZXRhZGF0YVBvcnRTRUkgew0KLSAgICBwdWJsaWMgU3RyaW5nIGVjaG9NZXNzYWdlKFN0cmluZyBzdHJpbmcpOw0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc3BpL0NsaWVudE1ldGFkYXRhVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NwaS9DbGllbnRNZXRhZGF0YVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNhODAwNi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc3BpL0NsaWVudE1ldGFkYXRhVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc3BpOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLkNsaWVudENvbmZpZ3VyYXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY2F0YWxvZy5pbXBsLk9BU0lTQ2F0YWxvZ01hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5EZXNjcmlwdGlvblRlc3RVdGlsczI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5TZXJ2aWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLkRlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuV2ViU2VydmljZUNsaWVudEFubm90OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uaW1wbC5EZXNjcmlwdGlvbkZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIubWV0YWRhdGEucmVnaXN0cnkuTWV0YWRhdGFGYWN0b3J5UmVnaXN0cnk7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlOwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlQ2xpZW50OwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotLyoqCi0gKiBUZXN0IGNyZWF0aW9uIG9mIGEgZ2VuZXJpYyBTZXJ2aWNlIGFuZCBnZW5lcmF0ZWQgU2VydmljZSB3aXRoIGFuZCB3aXRob3V0IGFkZGl0aW9uYWwKLSAqIG1ldGFkYXRhIHNwZWNpZmllZCBkdXJpbmcgdGhlIGNyZWF0aW9uIG9mIHRoZSBzZXJ2aWNlLiAgQWRkaXRpb25hbCBtZXRhZGF0YSBjb3VsZCBiZSBzdXBwbGllZAotICogYnkgYSBydW50aW1lIGluIG9yZGVyIHRvIHN1cHBvcnQgSlNSLTEwOSBkZXBsb3ltZW50IGRlc2NyaXB0b3JzIG9yIGluamVjdGlvbiBvZiBXZWJTZXJ2aWNlUmVmCi0gKiBhbm5vdGF0aW9ucy4gCi0gKi8KLXB1YmxpYyBjbGFzcyBDbGllbnRNZXRhZGF0YVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBuYW1lc3BhY2VVUkkgPSAiaHR0cDovL2Rlc2NyaXB0aW9uLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgc3ZjTG9jYWxQYXJ0ID0gInN2Y0xvY2FsUGFydCI7Ci0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIG9yaWdpbmFsV3NkbCA9ICJDbGllbnRNZXRhZGF0YS53c2RsIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIG92ZXJyaWRlbldzZGwgPSAiQ2xpZW50TWV0YWRhdGFPdmVycmlkZW4ud3NkbCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBvdGhlcldzZGwgPSAiQ2xpZW50TWV0YWRhdGFPdGhlci53c2RsIjsKLQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgb3JpZ2luYWxXc2RsX3BvcnRMb2NhbFBhcnQgPSAicG9ydExvY2FsUGFydCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBvdmVycmlkZW5Xc2RsX3BvcnRMb2NhbFBhcnQgPSAicG9ydExvY2FsUGFydE92ZXJyaWRlbiI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBvdGhlcldzZGxfcG9ydExvY2FsUGFydCA9ICJwb3J0TG9jYWxQYXJ0T3RoZXIiOwotICAgIAotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgdW5pcXVlQ2F0YWxvZyA9ICJ0ZXN0LXJlc291cmNlcy91bmlxdWUtY2F0YWxvZy54bWwiOwotCi0gICAgLyoqCi0gICAgICogVGVzdCBTZXJ2aWNlLmNyZWF0ZShRTmFtZSkgd2l0aCBubyBjb21wb3NpdGUgc3BlY2lmaWVkIAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3QxQXJnU2VydmljZVdpdGhvdXRDb21wb3NpdGUoKSB7Ci0gICAgICAgIFFOYW1lIHNlcnZpY2VRTmFtZSA9IG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIHN2Y0xvY2FsUGFydCk7Ci0gICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IFNlcnZpY2UuY3JlYXRlKHNlcnZpY2VRTmFtZSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZSk7Ci0gICAgICAgIFNlcnZpY2VEZWxlZ2F0ZSBzZXJ2aWNlRGVsZWdhdGUgPSBEZXNjcmlwdGlvblRlc3RVdGlsczIuZ2V0U2VydmljZURlbGVnYXRlKHNlcnZpY2UpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2VEZWxlZ2F0ZSk7Ci0gICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzZXJ2aWNlRGVzYyA9IHNlcnZpY2VEZWxlZ2F0ZS5nZXRTZXJ2aWNlRGVzY3JpcHRpb24oKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlRGVzYyk7Ci0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBkYmNJblNlcnZpY2VEZXNjID0gRGVzY3JpcHRpb25UZXN0VXRpbHMyLmdldFNlcnZpY2VEZXNjcmlwdGlvbkNvbXBvc2l0ZShzZXJ2aWNlRGVzYyk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZGJjSW5TZXJ2aWNlRGVzYyk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhTZXJ2aWNlLmNsYXNzLCBkYmNJblNlcnZpY2VEZXNjLmdldENvcnJlc3BvbmRpbmdDbGFzcygpKTsKLSAgICAgICAgLy8gU2luY2UgdGhpcyBpcyBhIGdlbmVyaWMgU2VydmljZSB3aXRoIG5vIG92ZXJyaWRlcywgdGhlcmUgd2lsbCBiZSBubyBXZWJTZXJ2aWNlQ2xpZW50IGFubm90YXRpb24KLSAgICAgICAgV2ViU2VydmljZUNsaWVudCB3c0NsaWVudCA9IGRiY0luU2VydmljZURlc2MuZ2V0V2ViU2VydmljZUNsaWVudEFubm90KCk7Ci0gICAgICAgIGFzc2VydE51bGwod3NDbGllbnQpOwotICAgICAgICAKLSAgICAgICAgLy8gTm8gV1NETCBzaG91bGQgaGF2ZSBiZWVuIHVzZWQsIHNvIG5vIFBvcnRzIHNob3VsZCBiZSBmb3VuZAotICAgICAgICBhc3NlcnRUcnVlKCJXcm9uZyBXU0RMIHVzZWQiLCB2YWxpZGF0ZVBvcnQoc2VydmljZSwgbnVsbCkpOwotICAgIH0gICAgCi0KLSAgICAvKioKLSAgICAgKiBTZXJ2aWNlLmNyZWF0ZShVUkwsIFFOYW1lKSB3aXRoIG5vIGNvbXBvc2l0ZSBzcGVjaWZpZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0MkFyZ1NlcnZpY2VXaXRob3V0Q29tcG9zaXRlKCkgewotICAgICAgICBRTmFtZSBzZXJ2aWNlUU5hbWUgPSBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBzdmNMb2NhbFBhcnQpOwotICAgICAgICBVUkwgd3NkbFVybCA9IGdldFdzZGxVUkwob3RoZXJXc2RsKTsKLSAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gU2VydmljZS5jcmVhdGUod3NkbFVybCwgc2VydmljZVFOYW1lKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlKTsKLSAgICAgICAgU2VydmljZURlbGVnYXRlIHNlcnZpY2VEZWxlZ2F0ZSA9IERlc2NyaXB0aW9uVGVzdFV0aWxzMi5nZXRTZXJ2aWNlRGVsZWdhdGUoc2VydmljZSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZURlbGVnYXRlKTsKLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNlcnZpY2VEZXNjID0gc2VydmljZURlbGVnYXRlLmdldFNlcnZpY2VEZXNjcmlwdGlvbigpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2VEZXNjKTsKLSAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIGRiY0luU2VydmljZURlc2MgPSBEZXNjcmlwdGlvblRlc3RVdGlsczIuZ2V0U2VydmljZURlc2NyaXB0aW9uQ29tcG9zaXRlKHNlcnZpY2VEZXNjKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChkYmNJblNlcnZpY2VEZXNjKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFNlcnZpY2UuY2xhc3MsIGRiY0luU2VydmljZURlc2MuZ2V0Q29ycmVzcG9uZGluZ0NsYXNzKCkpOwotICAgICAgICAvLyBTaW5jZSB0aGlzIGlzIGEgZ2VuZXJpYyBTZXJ2aWNlIHdpdGggbm8gb3ZlcnJpZGVzLCB0aGVyZSB3aWxsIGJlIG5vIFdlYlNlcnZpY2VDbGllbnQgYW5ub3RhdGlvbgotICAgICAgICBXZWJTZXJ2aWNlQ2xpZW50IHdzQ2xpZW50ID0gZGJjSW5TZXJ2aWNlRGVzYy5nZXRXZWJTZXJ2aWNlQ2xpZW50QW5ub3QoKTsKLSAgICAgICAgYXNzZXJ0TnVsbCh3c0NsaWVudCk7Ci0KLSAgICAgICAgLy8gV1NETCB3YXMgc3BlY2lmaWVkIG9uIHRoZSBjcmVhdGUsIHNvIG1ha2Ugc3VyZSB0aGUgcmlnaHQgb25lIHdhcyB1c2VkIGJ5IGNoZWNraW5nIHRoZSBwb3J0cwotICAgICAgICBhc3NlcnRUcnVlKCJXcm9uZyBXU0RMIHVzZWQiLCB2YWxpZGF0ZVBvcnQoc2VydmljZSwgb3RoZXJXc2RsX3BvcnRMb2NhbFBhcnQpKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2VydmljZS5jcmVhdGUoUU5hbWUpIHdpdGggYSBjb21wb3NpdGUgc3BlY2lmaWVkIGJ1dCBubyBvdmVycmlkZSBpbiB0aGUgY29tcG9zaXRlIAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3QxQXJnU2VydmljZVdpdGhDb21wb3NpdGUoKSB7Ci0gICAgICAgIFFOYW1lIHNlcnZpY2VRTmFtZSA9IG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIHN2Y0xvY2FsUGFydCk7Ci0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCk7Ci0gICAgICAgIGFzc2VydE51bGwoU2VydmljZURlbGVnYXRlLmdldFNlcnZpY2VNZXRhZGF0YSgpKTsKLSAgICAgICAgLy8gVXNlIHRoZSBwcm9wcmlldGFyeSBTUEkgdG8gY3JlYXRlIGEgc2VydmljZSB3aXRoIGFkZGl0aW9uYWwgbWV0YWRhdGEgc3BlY2lmaWVkCi0gICAgICAgIFNlcnZpY2VEZWxlZ2F0ZS5zZXRTZXJ2aWNlTWV0YWRhdGEoY29tcG9zaXRlKTsKLSAgICAgICAgCi0gICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IFNlcnZpY2UuY3JlYXRlKHNlcnZpY2VRTmFtZSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZSk7Ci0gICAgICAgIAotICAgICAgICAvLyBWZXJpZnkgdGhhdCB0aGUgY29tcG9zaXRlIGhhcyBiZWVuIHJlc2V0IHNvIHRoYXQgaXQgd291bGQgbm90IGFmZmVjdCB0aGUgbmV4dCBTZXJ2aWNlCi0gICAgICAgIGFzc2VydE51bGwoU2VydmljZURlbGVnYXRlLmdldFNlcnZpY2VNZXRhZGF0YSgpKTsKLSAgICAgICAgU2VydmljZURlbGVnYXRlIHNlcnZpY2VEZWxlZ2F0ZSA9IERlc2NyaXB0aW9uVGVzdFV0aWxzMi5nZXRTZXJ2aWNlRGVsZWdhdGUoc2VydmljZSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZURlbGVnYXRlKTsKLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNlcnZpY2VEZXNjID0gc2VydmljZURlbGVnYXRlLmdldFNlcnZpY2VEZXNjcmlwdGlvbigpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2VEZXNjKTsKLSAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIGRiY0luU2VydmljZURlc2MgPSBEZXNjcmlwdGlvblRlc3RVdGlsczIuZ2V0U2VydmljZURlc2NyaXB0aW9uQ29tcG9zaXRlKHNlcnZpY2VEZXNjKTsKLSAgICAgICAgYXNzZXJ0U2FtZShjb21wb3NpdGUsIGRiY0luU2VydmljZURlc2MuZ2V0U3BhcnNlQ29tcG9zaXRlKHNlcnZpY2VEZWxlZ2F0ZSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoU2VydmljZS5jbGFzcywgZGJjSW5TZXJ2aWNlRGVzYy5nZXRDb3JyZXNwb25kaW5nQ2xhc3MoKSk7Ci0gICAgICAgIC8vIFNpbmNlIHRoaXMgaXMgYSBnZW5lcmljIFNlcnZpY2Ugd2l0aCBubyBvdmVycmlkZXMsIHRoZXJlIHdpbGwgYmUgbm8gV2ViU2VydmljZUNsaWVudCBhbm5vdGF0aW9uCi0gICAgICAgIFdlYlNlcnZpY2VDbGllbnQgd3NDbGllbnQgPSBkYmNJblNlcnZpY2VEZXNjLmdldFdlYlNlcnZpY2VDbGllbnRBbm5vdCgpOwotICAgICAgICBhc3NlcnROdWxsKHdzQ2xpZW50KTsKLSAgICAgICAgCi0gICAgICAgIC8vIE5vIFdTREwgc2hvdWxkIGhhdmUgYmVlbiB1c2VkLCBzbyBubyBQb3J0cyBzaG91bGQgYmUgZm91bmQKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiV3JvbmcgV1NETCB1c2VkIiwgdmFsaWRhdGVQb3J0KHNlcnZpY2UsIG51bGwpKTsKLQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXJ2aWNlLmNyZWF0ZShVUkwsIFFOYW1lKSB3aXRoIGEgY29tcG9zaXRlIHNwZWNpZmllZCBidXQgbm8gb3ZlcnJpZGUgaW4gdGhlIGNvbXBvc2l0ZSAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0MkFyZ1NlcnZpY2VXaXRoQ29tcG9zaXRlKCkgewotICAgICAgICBRTmFtZSBzZXJ2aWNlUU5hbWUgPSBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBzdmNMb2NhbFBhcnQpOwotCi0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCk7Ci0gICAgICAgIFVSTCB3c2RsVXJsID0gZ2V0V3NkbFVSTChvdGhlcldzZGwpOwotICAgICAgICAvLyBVc2UgdGhlIHByb3ByaWV0YXJ5IFNQSSB0byBjcmVhdGUgYSBzZXJ2aWNlIHdpdGggYWRkaXRpb25hbCBtZXRhZGF0YSBzcGVjaWZpZWQKLSAgICAgICAgU2VydmljZURlbGVnYXRlLnNldFNlcnZpY2VNZXRhZGF0YShjb21wb3NpdGUpOwotICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSBTZXJ2aWNlLmNyZWF0ZSh3c2RsVXJsLCBzZXJ2aWNlUU5hbWUpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2UpOwotICAgICAgICAvLyBWZXJpZnkgdGhhdCB0aGUgY29tcG9zaXRlIGhhcyBiZWVuIHJlc2V0IHNvIHRoYXQgaXQgd291bGQgbm90IGFmZmVjdCB0aGUgbmV4dCBTZXJ2aWNlCi0gICAgICAgIGFzc2VydE51bGwoU2VydmljZURlbGVnYXRlLmdldFNlcnZpY2VNZXRhZGF0YSgpKTsKLSAgICAgICAgU2VydmljZURlbGVnYXRlIHNlcnZpY2VEZWxlZ2F0ZSA9IERlc2NyaXB0aW9uVGVzdFV0aWxzMi5nZXRTZXJ2aWNlRGVsZWdhdGUoc2VydmljZSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZURlbGVnYXRlKTsKLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNlcnZpY2VEZXNjID0gc2VydmljZURlbGVnYXRlLmdldFNlcnZpY2VEZXNjcmlwdGlvbigpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2VEZXNjKTsKLSAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIGRiY0luU2VydmljZURlc2MgPSBEZXNjcmlwdGlvblRlc3RVdGlsczIuZ2V0U2VydmljZURlc2NyaXB0aW9uQ29tcG9zaXRlKHNlcnZpY2VEZXNjKTsKLSAgICAgICAgYXNzZXJ0U2FtZShjb21wb3NpdGUsIGRiY0luU2VydmljZURlc2MuZ2V0U3BhcnNlQ29tcG9zaXRlKHNlcnZpY2VEZWxlZ2F0ZSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoU2VydmljZS5jbGFzcywgZGJjSW5TZXJ2aWNlRGVzYy5nZXRDb3JyZXNwb25kaW5nQ2xhc3MoKSk7Ci0gICAgICAgIC8vIFNpbmNlIHRoaXMgaXMgYSBnZW5lcmljIFNlcnZpY2Ugd2l0aCBubyBvdmVycmlkZXMsIHRoZXJlIHdpbGwgYmUgbm8gV2ViU2VydmljZUNsaWVudCBhbm5vdGF0aW9uCi0gICAgICAgIFdlYlNlcnZpY2VDbGllbnQgd3NDbGllbnQgPSBkYmNJblNlcnZpY2VEZXNjLmdldFdlYlNlcnZpY2VDbGllbnRBbm5vdCgpOwotICAgICAgICBhc3NlcnROdWxsKHdzQ2xpZW50KTsKLSAgICAgICAgCi0gICAgICAgIC8vIFdTREwgd2FzIHNwZWNpZmllZCBvbiB0aGUgY3JlYXRlLCBzbyBtYWtlIHN1cmUgdGhlIHJpZ2h0IG9uZSB3YXMgdXNlZCBieSBjaGVja2luZyB0aGUgcG9ydHMKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiV3JvbmcgV1NETCB1c2VkIiwgdmFsaWRhdGVQb3J0KHNlcnZpY2UsIG90aGVyV3NkbF9wb3J0TG9jYWxQYXJ0KSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEdlbmVyYXRlZCBzZXJ2aWNlIGNvbnN0cnVjdG9yKCkgd2l0aCBubyBjb21wb3NpdGUgc3BlY2lmaWVkIAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3ROb0FyZ0dlbmVyYXRlZFNlcnZpY2UoKSB7Ci0gICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IG5ldyBDbGllbnRNZXRhZGF0YUdlbmVyYXRlZFNlcnZpY2UoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlKTsKLQotICAgICAgICBTZXJ2aWNlRGVsZWdhdGUgc2VydmljZURlbGVnYXRlID0gRGVzY3JpcHRpb25UZXN0VXRpbHMyLmdldFNlcnZpY2VEZWxlZ2F0ZShzZXJ2aWNlKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlRGVsZWdhdGUpOwotICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc2VydmljZURlc2MgPSBzZXJ2aWNlRGVsZWdhdGUuZ2V0U2VydmljZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZURlc2MpOwotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgZGJjSW5TZXJ2aWNlRGVzYyA9IERlc2NyaXB0aW9uVGVzdFV0aWxzMi5nZXRTZXJ2aWNlRGVzY3JpcHRpb25Db21wb3NpdGUoc2VydmljZURlc2MpOwotICAgICAgICBhc3NlcnRFcXVhbHMoQ2xpZW50TWV0YWRhdGFHZW5lcmF0ZWRTZXJ2aWNlLmNsYXNzLCBkYmNJblNlcnZpY2VEZXNjLmdldENvcnJlc3BvbmRpbmdDbGFzcygpKTsKLSAgICAgICAgLy8gVGhlcmUgaXMgV2ViU2VydmljZUNsaWVudCBvbiB0aGUgZ2VuZXJhdGVkIFNlcnZpY2UKLSAgICAgICAgV2ViU2VydmljZUNsaWVudCB3c0NsaWVudCA9IGRiY0luU2VydmljZURlc2MuZ2V0V2ViU2VydmljZUNsaWVudEFubm90KCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwod3NDbGllbnQpOwotICAgICAgICBhc3NlcnRFcXVhbHMob3JpZ2luYWxXc2RsLCB3c0NsaWVudC53c2RsTG9jYXRpb24oKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygib3JpZ2luYWxUTlMiLCB3c0NsaWVudC50YXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiIiwgd3NDbGllbnQubmFtZSgpKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFdTREwgbm90IHNwZWNpZmllZCwgc28gZ2VuZXJhdGVkIFNlcnZpY2Ugc2hvdWxkIHVzZSB0aGUgYW5ub3RhdGlvbiB2YWx1ZQotICAgICAgICBhc3NlcnRUcnVlKCJXcm9uZyBXU0RMIFVzZWQiLCB2YWxpZGF0ZVBvcnQoc2VydmljZSwgb3JpZ2luYWxXc2RsX3BvcnRMb2NhbFBhcnQpKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogR2VuZXJhdGVkIHNlcnZpY2UgY29uc3RydWN0b3IoVVJMLCBRTmFtZSkgd2l0aCBubyBjb21wb3NpdGUgc3BlY2lmaWVkIAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3QyQXJnR2VuZXJhdGVkU2VydmljZSgpIHsKLSAgICAgICAgCi0gICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IG5ldyBDbGllbnRNZXRhZGF0YUdlbmVyYXRlZFNlcnZpY2UoZ2V0V3NkbFVSTChvdGhlcldzZGwpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFFOYW1lKG5hbWVzcGFjZVVSSSwgc3ZjTG9jYWxQYXJ0KSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZSk7Ci0KLSAgICAgICAgU2VydmljZURlbGVnYXRlIHNlcnZpY2VEZWxlZ2F0ZSA9IERlc2NyaXB0aW9uVGVzdFV0aWxzMi5nZXRTZXJ2aWNlRGVsZWdhdGUoc2VydmljZSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZURlbGVnYXRlKTsKLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNlcnZpY2VEZXNjID0gc2VydmljZURlbGVnYXRlLmdldFNlcnZpY2VEZXNjcmlwdGlvbigpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2VEZXNjKTsKLSAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIGRiY0luU2VydmljZURlc2MgPSBEZXNjcmlwdGlvblRlc3RVdGlsczIuZ2V0U2VydmljZURlc2NyaXB0aW9uQ29tcG9zaXRlKHNlcnZpY2VEZXNjKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKENsaWVudE1ldGFkYXRhR2VuZXJhdGVkU2VydmljZS5jbGFzcywgZGJjSW5TZXJ2aWNlRGVzYy5nZXRDb3JyZXNwb25kaW5nQ2xhc3MoKSk7Ci0gICAgICAgIC8vIFRoZXJlIGlzIFdlYlNlcnZpY2VDbGllbnQgb24gdGhlIGdlbmVyYXRlZCBTZXJ2aWNlCi0gICAgICAgIFdlYlNlcnZpY2VDbGllbnQgd3NDbGllbnQgPSBkYmNJblNlcnZpY2VEZXNjLmdldFdlYlNlcnZpY2VDbGllbnRBbm5vdCgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHdzQ2xpZW50KTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMob3JpZ2luYWxXc2RsLCB3c0NsaWVudC53c2RsTG9jYXRpb24oKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygib3JpZ2luYWxUTlMiLCB3c0NsaWVudC50YXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiIiwgd3NDbGllbnQubmFtZSgpKTsKLQotICAgICAgICAvLyBXU0RMIHdhcyBzcGVjaWZpZWQgb24gdGhlIGdlbmVyYXRlZCBTZXJ2aWNlIGNvbnN0cnVjdG9yLCAKLSAgICAgICAgLy8gc28gbWFrZSBzdXJlIHRoZSByaWdodCBvbmUgd2FzIHVzZWQgYnkgY2hlY2tpbmcgdGhlIHBvcnRzCi0gICAgICAgIGFzc2VydFRydWUoIldyb25nIFdTREwgdXNlZCIsIHZhbGlkYXRlUG9ydChzZXJ2aWNlLCBvdGhlcldzZGxfcG9ydExvY2FsUGFydCkpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBHZW5lcmF0ZWQgc2VydmljZSBjb25zdHJ1Y3RvcigpIHdpdGggY29tcG9zaXRlIHNwZWNpZmllZCBidXQgbm8gb3ZlcnJpZGUgaW4gY29tcG9zaXRlIAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3ROb0FyZ0dlbmVyYXRlZFNlcnZpY2VXaXRoQ29tcG9zaXRlKCkgewotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSgpOwotICAgICAgICBTZXJ2aWNlRGVsZWdhdGUuc2V0U2VydmljZU1ldGFkYXRhKGNvbXBvc2l0ZSk7Ci0KLSAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gbmV3IENsaWVudE1ldGFkYXRhR2VuZXJhdGVkU2VydmljZSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2UpOwotICAgICAgICBhc3NlcnROdWxsKFNlcnZpY2VEZWxlZ2F0ZS5nZXRTZXJ2aWNlTWV0YWRhdGEoKSk7Ci0gICAgICAgIAotICAgICAgICBTZXJ2aWNlRGVsZWdhdGUgc2VydmljZURlbGVnYXRlID0gRGVzY3JpcHRpb25UZXN0VXRpbHMyLmdldFNlcnZpY2VEZWxlZ2F0ZShzZXJ2aWNlKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlRGVsZWdhdGUpOwotICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc2VydmljZURlc2MgPSBzZXJ2aWNlRGVsZWdhdGUuZ2V0U2VydmljZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZURlc2MpOwotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgZGJjSW5TZXJ2aWNlRGVzYyA9IERlc2NyaXB0aW9uVGVzdFV0aWxzMi5nZXRTZXJ2aWNlRGVzY3JpcHRpb25Db21wb3NpdGUoc2VydmljZURlc2MpOwotICAgICAgICBhc3NlcnRTYW1lKGNvbXBvc2l0ZSwgZGJjSW5TZXJ2aWNlRGVzYy5nZXRTcGFyc2VDb21wb3NpdGUoc2VydmljZURlbGVnYXRlKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhDbGllbnRNZXRhZGF0YUdlbmVyYXRlZFNlcnZpY2UuY2xhc3MsIGRiY0luU2VydmljZURlc2MuZ2V0Q29ycmVzcG9uZGluZ0NsYXNzKCkpOwotICAgICAgICAvLyBUaGVyZSBpcyBXZWJTZXJ2aWNlQ2xpZW50IG9uIHRoZSBnZW5lcmF0ZWQgU2VydmljZSBhbmQgaXQgd2Fzbid0IG92ZXJyaWRlbiBpbiB0aGUgY29tcG9zaXRlCi0gICAgICAgIFdlYlNlcnZpY2VDbGllbnQgd3NDbGllbnQgPSBkYmNJblNlcnZpY2VEZXNjLmdldFdlYlNlcnZpY2VDbGllbnRBbm5vdCgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHdzQ2xpZW50KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG9yaWdpbmFsV3NkbCwgd3NDbGllbnQud3NkbExvY2F0aW9uKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIm9yaWdpbmFsVE5TIiwgd3NDbGllbnQudGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIHdzQ2xpZW50Lm5hbWUoKSk7Ci0gICAgICAgIAotICAgICAgICAvLyBObyBXU0RMIG92ZXJyaWRlIHNwZWNpZmllZCBpbiB0aGUgY29tcG9zaXRlLCBzbyBnZW5lcmF0ZWQgU2VydmljZSBzaG91bGQgdXNlIHRoZSBhbm5vdGF0aW9uIHZhbHVlCi0gICAgICAgIGFzc2VydFRydWUoIldyb25nIFdTREwgVXNlZCIsIHZhbGlkYXRlUG9ydChzZXJ2aWNlLCBvcmlnaW5hbFdzZGxfcG9ydExvY2FsUGFydCkpOwotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2VuZXJhdGVkIHNlcnZpY2UgY29uc3RydWN0b3IoVVJMLCBRTmFtZSkgd2l0aCBjb21wb3NpdGUgc3BlY2lmaWVkIGJ1dCBubyBvdmVycmlkZSBpbiBjb21wb3NpdGUgCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdDJBcmdHZW5lcmF0ZWRTZXJ2aWNlV2l0aENvbXBvc2l0ZSgpIHsKLSAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUoKTsKLSAgICAgICAgU2VydmljZURlbGVnYXRlLnNldFNlcnZpY2VNZXRhZGF0YShjb21wb3NpdGUpOwotCi0gICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IG5ldyBDbGllbnRNZXRhZGF0YUdlbmVyYXRlZFNlcnZpY2UoZ2V0V3NkbFVSTChvdGhlcldzZGwpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIHN2Y0xvY2FsUGFydCkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2UpOwotICAgICAgICBhc3NlcnROdWxsKFNlcnZpY2VEZWxlZ2F0ZS5nZXRTZXJ2aWNlTWV0YWRhdGEoKSk7Ci0gICAgICAgIAotICAgICAgICBTZXJ2aWNlRGVsZWdhdGUgc2VydmljZURlbGVnYXRlID0gRGVzY3JpcHRpb25UZXN0VXRpbHMyLmdldFNlcnZpY2VEZWxlZ2F0ZShzZXJ2aWNlKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlRGVsZWdhdGUpOwotICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc2VydmljZURlc2MgPSBzZXJ2aWNlRGVsZWdhdGUuZ2V0U2VydmljZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZURlc2MpOwotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgZGJjSW5TZXJ2aWNlRGVzYyA9IERlc2NyaXB0aW9uVGVzdFV0aWxzMi5nZXRTZXJ2aWNlRGVzY3JpcHRpb25Db21wb3NpdGUoc2VydmljZURlc2MpOwotICAgICAgICBhc3NlcnRTYW1lKGNvbXBvc2l0ZSwgZGJjSW5TZXJ2aWNlRGVzYy5nZXRTcGFyc2VDb21wb3NpdGUoc2VydmljZURlbGVnYXRlKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhDbGllbnRNZXRhZGF0YUdlbmVyYXRlZFNlcnZpY2UuY2xhc3MsIGRiY0luU2VydmljZURlc2MuZ2V0Q29ycmVzcG9uZGluZ0NsYXNzKCkpOwotICAgICAgICAvLyBUaGVyZSBpcyBXZWJTZXJ2aWNlQ2xpZW50IG9uIHRoZSBnZW5lcmF0ZWQgU2VydmljZSBhbmQgaXQgd2Fzbid0IG92ZXJyaWRlbiBpbiB0aGUgY29tcG9zaXRlCi0gICAgICAgIFdlYlNlcnZpY2VDbGllbnQgd3NDbGllbnQgPSBkYmNJblNlcnZpY2VEZXNjLmdldFdlYlNlcnZpY2VDbGllbnRBbm5vdCgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHdzQ2xpZW50KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG9yaWdpbmFsV3NkbCwgd3NDbGllbnQud3NkbExvY2F0aW9uKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIm9yaWdpbmFsVE5TIiwgd3NDbGllbnQudGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIHdzQ2xpZW50Lm5hbWUoKSk7Ci0KLSAgICAgICAgLy8gV1NETCB3YXMgc3BlY2lmaWVkIG9uIHRoZSBnZW5lcmF0ZWQgU2VydmljZSBjb25zdHJ1Y3RvciwgYW5kIG5vbmUgaW4gdGhlIGNvbXBvc2l0ZQotICAgICAgICAvLyBzbyBzaG91bGQgZ2V0IHRoZSBXU0RMIHNwZWNpZmllZCBvbiB0aGUgY29uc3RydWN0b3IKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiV3JvbmcgV1NETCB1c2VkIiwgdmFsaWRhdGVQb3J0KHNlcnZpY2UsIG90aGVyV3NkbF9wb3J0TG9jYWxQYXJ0KSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFNlcnZpY2UuY3JlYXRlKFFOYW1lKSB3aXRoIGEgY29tcG9zaXRlIHRoYXQgc3BlY2lmaWVzIGEgd3NkbExvY2F0aW9uIG92ZXJyaWRlIAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3QxQXJnU2VydmljZU92ZXJyaWRlV3NkbExvY2F0aW9uKCkgewotICAgICAgICBRTmFtZSBzZXJ2aWNlUU5hbWUgPSBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBzdmNMb2NhbFBhcnQpOwotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSgpOwotICAgICAgICBXZWJTZXJ2aWNlQ2xpZW50QW5ub3Qgd3NDbGllbnRBbm5vID0gCi0gICAgICAgICAgICBXZWJTZXJ2aWNlQ2xpZW50QW5ub3QuY3JlYXRlV2ViU2VydmljZUNsaWVudEFubm90SW1wbChudWxsLCBudWxsLCBnZXRXc2RsTG9jYXRpb24ob3ZlcnJpZGVuV3NkbCkpOwotICAgICAgICBjb21wb3NpdGUuc2V0V2ViU2VydmljZUNsaWVudEFubm90KHdzQ2xpZW50QW5ubyk7Ci0gICAgICAgIC8vIFVzZSB0aGUgcHJvcHJpZXRhcnkgU1BJIHRvIGNyZWF0ZSBhIHNlcnZpY2Ugd2l0aCBhZGRpdGlvbmFsIG1ldGFkYXRhIHNwZWNpZmllZAotICAgICAgICBTZXJ2aWNlRGVsZWdhdGUuc2V0U2VydmljZU1ldGFkYXRhKGNvbXBvc2l0ZSk7Ci0gICAgICAgIAotICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSBTZXJ2aWNlLmNyZWF0ZShzZXJ2aWNlUU5hbWUpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlKTsKLSAgICAgICAgLy8gVmVyaWZ5IHRoYXQgdGhlIGNvbXBvc2l0ZSBoYXMgYmVlbiByZXNldCBzbyB0aGF0IGl0IHdvdWxkIG5vdCBhZmZlY3QgdGhlIG5leHQgU2VydmljZQotICAgICAgICBhc3NlcnROdWxsKFNlcnZpY2VEZWxlZ2F0ZS5nZXRTZXJ2aWNlTWV0YWRhdGEoKSk7Ci0gICAgICAgIFNlcnZpY2VEZWxlZ2F0ZSBzZXJ2aWNlRGVsZWdhdGUgPSBEZXNjcmlwdGlvblRlc3RVdGlsczIuZ2V0U2VydmljZURlbGVnYXRlKHNlcnZpY2UpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2VEZWxlZ2F0ZSk7Ci0gICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzZXJ2aWNlRGVzYyA9IHNlcnZpY2VEZWxlZ2F0ZS5nZXRTZXJ2aWNlRGVzY3JpcHRpb24oKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlRGVzYyk7Ci0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBkYmNJblNlcnZpY2VEZXNjID0gRGVzY3JpcHRpb25UZXN0VXRpbHMyLmdldFNlcnZpY2VEZXNjcmlwdGlvbkNvbXBvc2l0ZShzZXJ2aWNlRGVzYyk7Ci0gICAgICAgIGFzc2VydFNhbWUoY29tcG9zaXRlLCBkYmNJblNlcnZpY2VEZXNjLmdldFNwYXJzZUNvbXBvc2l0ZShzZXJ2aWNlRGVsZWdhdGUpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFNlcnZpY2UuY2xhc3MsIGRiY0luU2VydmljZURlc2MuZ2V0Q29ycmVzcG9uZGluZ0NsYXNzKCkpOwotICAgICAgICAvLyBUaGlzIGlzIGEgZ2VuZXJpYyBTZXJ2aWNlIHdpdGggb3ZlcnJpZGVzLCB0aGVyZSB3aWxsIGJlIFdlYlNlcnZpY2VDbGllbnQgYW5ub3RhdGlvbgotICAgICAgICBXZWJTZXJ2aWNlQ2xpZW50IHdzQ2xpZW50ID0gZGJjSW5TZXJ2aWNlRGVzYy5nZXRXZWJTZXJ2aWNlQ2xpZW50QW5ub3QoKTsKLSAgICAgICAgYXNzZXJ0TnVsbCh3c0NsaWVudCk7Ci0gICAgICAgIHdzQ2xpZW50ID0gZGJjSW5TZXJ2aWNlRGVzYy5nZXRXZWJTZXJ2aWNlQ2xpZW50QW5ub3Qoc2VydmljZURlbGVnYXRlKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh3c0NsaWVudCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhnZXRXc2RsTG9jYXRpb24ob3ZlcnJpZGVuV3NkbCksIHdzQ2xpZW50LndzZGxMb2NhdGlvbigpKTsKLSAgICAgICAgYXNzZXJ0TnVsbCh3c0NsaWVudC50YXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgIGFzc2VydE51bGwod3NDbGllbnQubmFtZSgpKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFdTREwgb3ZlcnJpZGUgc3BlY2lmaWVkIGluIHRoZSBjb21wb3NpdGUKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiV3JvbmcgV1NETCB1c2VkIiwgdmFsaWRhdGVQb3J0KHNlcnZpY2UsIG92ZXJyaWRlbldzZGxfcG9ydExvY2FsUGFydCkpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXJ2aWNlLmNyZWF0ZShRTmFtZSkgd2l0aCBhIGNvbXBvc2l0ZSB0aGF0IG92ZXJyaWRlcyB0aGUgVGFyZ2V0TmFtZXNwYWNlLiAgTW9zdCBvZiB0aGUKLSAgICAgKiBvdGhlciB0ZXN0cyBvdmVycmlkZSB0aGUgV1NETCBMb2NhdGlvbiBzaW5jZSB0aGF0IGlzIHdoYXQgYSBKU1ItMTA5IEREIGNhbiBzcGVjaWZ5LiAgVGhpcwotICAgICAqIHRlc3QgbWFrZXMgc3VyZSBvdGhlciB2YWx1ZXMgY2FuIGJlIG92ZXJyaWRkZW4gYXMgd2VsbAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3QxQXJnU2VydmljZU92ZXJyaWRlVE5TKCkgewotICAgICAgICBRTmFtZSBzZXJ2aWNlUU5hbWUgPSBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBzdmNMb2NhbFBhcnQpOwotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSgpOwotICAgICAgICBXZWJTZXJ2aWNlQ2xpZW50QW5ub3Qgd3NDbGllbnRBbm5vID0gCi0gICAgICAgICAgICBXZWJTZXJ2aWNlQ2xpZW50QW5ub3QuY3JlYXRlV2ViU2VydmljZUNsaWVudEFubm90SW1wbChudWxsLCAib3ZlcnJpZGVUTlMiLCBudWxsKTsKLSAgICAgICAgY29tcG9zaXRlLnNldFdlYlNlcnZpY2VDbGllbnRBbm5vdCh3c0NsaWVudEFubm8pOwotICAgICAgICAvLyBVc2UgdGhlIHByb3ByaWV0YXJ5IFNQSSB0byBjcmVhdGUgYSBzZXJ2aWNlIHdpdGggYWRkaXRpb25hbCBtZXRhZGF0YSBzcGVjaWZpZWQKLSAgICAgICAgU2VydmljZURlbGVnYXRlLnNldFNlcnZpY2VNZXRhZGF0YShjb21wb3NpdGUpOwotICAgICAgICAKLSAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gU2VydmljZS5jcmVhdGUoc2VydmljZVFOYW1lKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZSk7Ci0gICAgICAgIC8vIFZlcmlmeSB0aGF0IHRoZSBjb21wb3NpdGUgaGFzIGJlZW4gcmVzZXQgc28gdGhhdCBpdCB3b3VsZCBub3QgYWZmZWN0IHRoZSBuZXh0IFNlcnZpY2UKLSAgICAgICAgYXNzZXJ0TnVsbChTZXJ2aWNlRGVsZWdhdGUuZ2V0U2VydmljZU1ldGFkYXRhKCkpOwotICAgICAgICBTZXJ2aWNlRGVsZWdhdGUgc2VydmljZURlbGVnYXRlID0gRGVzY3JpcHRpb25UZXN0VXRpbHMyLmdldFNlcnZpY2VEZWxlZ2F0ZShzZXJ2aWNlKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlRGVsZWdhdGUpOwotICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc2VydmljZURlc2MgPSBzZXJ2aWNlRGVsZWdhdGUuZ2V0U2VydmljZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZURlc2MpOwotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgZGJjSW5TZXJ2aWNlRGVzYyA9IERlc2NyaXB0aW9uVGVzdFV0aWxzMi5nZXRTZXJ2aWNlRGVzY3JpcHRpb25Db21wb3NpdGUoc2VydmljZURlc2MpOwotICAgICAgICBhc3NlcnRTYW1lKGNvbXBvc2l0ZSwgZGJjSW5TZXJ2aWNlRGVzYy5nZXRTcGFyc2VDb21wb3NpdGUoc2VydmljZURlbGVnYXRlKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhTZXJ2aWNlLmNsYXNzLCBkYmNJblNlcnZpY2VEZXNjLmdldENvcnJlc3BvbmRpbmdDbGFzcygpKTsKLSAgICAgICAgLy8gVGhlIHRhcmdldCBuYW1lc3BhY2UgZm9yIHRoZSBrZXkgc2hvdWxkIGJlIG92ZXJyaWRlbjsgaXQgc2hvdWxkIG5vdCBiZSBvdmVycmlkZW4gZm9yCi0gICAgICAgIC8vIG5vIGtleS4KLSAgICAgICAgV2ViU2VydmljZUNsaWVudCB3c0NsaWVudCA9IGRiY0luU2VydmljZURlc2MuZ2V0V2ViU2VydmljZUNsaWVudEFubm90KCk7Ci0gICAgICAgIGFzc2VydE51bGwod3NDbGllbnQpOwotICAgICAgICAKLSAgICAgICAgV2ViU2VydmljZUNsaWVudCB3c0NsaWVudEtleWVkID0gZGJjSW5TZXJ2aWNlRGVzYy5nZXRXZWJTZXJ2aWNlQ2xpZW50QW5ub3Qoc2VydmljZURlbGVnYXRlKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh3c0NsaWVudEtleWVkKTsKLSAgICAgICAgYXNzZXJ0TnVsbCh3c0NsaWVudEtleWVkLndzZGxMb2NhdGlvbigpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJvdmVycmlkZVROUyIsIHdzQ2xpZW50S2V5ZWQudGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICBhc3NlcnROdWxsKHdzQ2xpZW50S2V5ZWQubmFtZSgpKTsKLQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXJ2aWNlLmNyZWF0ZShRTmFtZSkgd2l0aCBhIGNvbXBvc2l0ZSB0aGF0IHNwZWNpZmllcyBhIENhdGFsb2dNYW5hZ2VyIG92ZXJyaWRlIAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3QxQXJnU2VydmljZU92ZXJyaWRlQ2F0YWxvZ01hbmFnZXIoKSB7Ci0gICAgICAgIFFOYW1lIHNlcnZpY2VRTmFtZSA9IG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIHN2Y0xvY2FsUGFydCk7Ci0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCk7Ci0gICAgICAgIE9BU0lTQ2F0YWxvZ01hbmFnZXIgY2F0YWxvZ01hbmFnZXIgPSBuZXcgT0FTSVNDYXRhbG9nTWFuYWdlcigpOwotICAgICAgICBjYXRhbG9nTWFuYWdlci5zZXRDYXRhbG9nRmlsZXMoZ2V0Q2F0YWxvZ0xvY2F0aW9uKHVuaXF1ZUNhdGFsb2cpKTsKLSAgICAgICAgY29tcG9zaXRlLnNldENhdGFsb2dNYW5hZ2VyKGNhdGFsb2dNYW5hZ2VyKTsKLSAgICAgICAgLy8gVXNlIHRoZSBwcm9wcmlldGFyeSBTUEkgdG8gY3JlYXRlIGEgc2VydmljZSB3aXRoIGFkZGl0aW9uYWwgbWV0YWRhdGEgc3BlY2lmaWVkCi0gICAgICAgIFNlcnZpY2VEZWxlZ2F0ZS5zZXRTZXJ2aWNlTWV0YWRhdGEoY29tcG9zaXRlKTsKLSAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gU2VydmljZS5jcmVhdGUoc2VydmljZVFOYW1lKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZSk7Ci0gICAgICAgIC8vIFZlcmlmeSB0aGF0IHRoZSBjb21wb3NpdGUgaGFzIGJlZW4gcmVzZXQgc28gdGhhdCBpdCB3b3VsZCBub3QgYWZmZWN0IHRoZSBuZXh0IFNlcnZpY2UKLSAgICAgICAgYXNzZXJ0TnVsbChTZXJ2aWNlRGVsZWdhdGUuZ2V0U2VydmljZU1ldGFkYXRhKCkpOwotICAgICAgICBTZXJ2aWNlRGVsZWdhdGUgc2VydmljZURlbGVnYXRlID0gRGVzY3JpcHRpb25UZXN0VXRpbHMyLmdldFNlcnZpY2VEZWxlZ2F0ZShzZXJ2aWNlKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlRGVsZWdhdGUpOwotICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc2VydmljZURlc2MgPSBzZXJ2aWNlRGVsZWdhdGUuZ2V0U2VydmljZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZURlc2MpOwotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgZGJjSW5TZXJ2aWNlRGVzYyA9IERlc2NyaXB0aW9uVGVzdFV0aWxzMi5nZXRTZXJ2aWNlRGVzY3JpcHRpb25Db21wb3NpdGUoc2VydmljZURlc2MpOwotICAgICAgICBhc3NlcnRTYW1lKGNvbXBvc2l0ZSwgZGJjSW5TZXJ2aWNlRGVzYy5nZXRTcGFyc2VDb21wb3NpdGUoc2VydmljZURlbGVnYXRlKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhTZXJ2aWNlLmNsYXNzLCBkYmNJblNlcnZpY2VEZXNjLmdldENvcnJlc3BvbmRpbmdDbGFzcygpKTsKLSAgICAgICAgLy8gVmVyaWZ5IHRoYXQgdGhlIENhdGFsb2dNYW5hZ2VyIGZvciB0aGUgU2VydmljZSB1c2VzIHRoZSB1bmlxdWUgY2F0YWxvZyBmaWxlLgotICAgICAgICBTdHJpbmcgc2VydmljZUNhdGFsb2dGaWxlID0gKFN0cmluZykgZGJjSW5TZXJ2aWNlRGVzYy5nZXRTcGFyc2VDb21wb3NpdGUoc2VydmljZURlbGVnYXRlKS5nZXRDYXRhbG9nTWFuYWdlcigpLmdldENhdGFsb2dGaWxlcygpLmdldCgwKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHNlcnZpY2VDYXRhbG9nRmlsZSwgZ2V0Q2F0YWxvZ0xvY2F0aW9uKHVuaXF1ZUNhdGFsb2cpKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2VydmljZS5jcmVhdGUoVVJMLCBRTmFtZSkgd2l0aCBhIGNvbXBvc2l0ZSB0aGF0IHNwZWNpZmllcyBhIHdzZGxMb2NhdGlvbiBvdmVycmlkZSAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0MkFyZ1NlcnZpY2VPdmVycmlkZVdzZGxMb2NhdGlvbigpIHsKLSAgICAgICAgUU5hbWUgc2VydmljZVFOYW1lID0gbmV3IFFOYW1lKG5hbWVzcGFjZVVSSSwgc3ZjTG9jYWxQYXJ0KTsKLSAgICAgICAgVVJMIHdzZGxVcmwgPSBnZXRXc2RsVVJMKG90aGVyV3NkbCk7Ci0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCk7Ci0gICAgICAgIFdlYlNlcnZpY2VDbGllbnRBbm5vdCB3c0NsaWVudEFubm8gPSBXZWJTZXJ2aWNlQ2xpZW50QW5ub3QuY3JlYXRlV2ViU2VydmljZUNsaWVudEFubm90SW1wbChudWxsLCBudWxsLCBnZXRXc2RsTG9jYXRpb24ob3ZlcnJpZGVuV3NkbCkpOwotICAgICAgICBjb21wb3NpdGUuc2V0V2ViU2VydmljZUNsaWVudEFubm90KHdzQ2xpZW50QW5ubyk7Ci0gICAgICAgIC8vIFVzZSB0aGUgcHJvcHJpZXRhcnkgU1BJIHRvIGNyZWF0ZSBhIHNlcnZpY2Ugd2l0aCBhZGRpdGlvbmFsIG1ldGFkYXRhIHNwZWNpZmllZAotICAgICAgICBTZXJ2aWNlRGVsZWdhdGUuc2V0U2VydmljZU1ldGFkYXRhKGNvbXBvc2l0ZSk7Ci0gICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IFNlcnZpY2UuY3JlYXRlKHdzZGxVcmwsIHNlcnZpY2VRTmFtZSk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2UpOwotICAgICAgICAvLyBWZXJpZnkgdGhhdCB0aGUgY29tcG9zaXRlIGhhcyBiZWVuIHJlc2V0IHNvIHRoYXQgaXQgd291bGQgbm90IGFmZmVjdCB0aGUgbmV4dCBTZXJ2aWNlCi0gICAgICAgIGFzc2VydE51bGwoU2VydmljZURlbGVnYXRlLmdldFNlcnZpY2VNZXRhZGF0YSgpKTsKLSAgICAgICAgU2VydmljZURlbGVnYXRlIHNlcnZpY2VEZWxlZ2F0ZSA9IERlc2NyaXB0aW9uVGVzdFV0aWxzMi5nZXRTZXJ2aWNlRGVsZWdhdGUoc2VydmljZSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZURlbGVnYXRlKTsKLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNlcnZpY2VEZXNjID0gc2VydmljZURlbGVnYXRlLmdldFNlcnZpY2VEZXNjcmlwdGlvbigpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2VEZXNjKTsKLSAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIGRiY0luU2VydmljZURlc2MgPSBEZXNjcmlwdGlvblRlc3RVdGlsczIuZ2V0U2VydmljZURlc2NyaXB0aW9uQ29tcG9zaXRlKHNlcnZpY2VEZXNjKTsKLSAgICAgICAgYXNzZXJ0U2FtZShjb21wb3NpdGUsIGRiY0luU2VydmljZURlc2MuZ2V0U3BhcnNlQ29tcG9zaXRlKHNlcnZpY2VEZWxlZ2F0ZSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoU2VydmljZS5jbGFzcywgZGJjSW5TZXJ2aWNlRGVzYy5nZXRDb3JyZXNwb25kaW5nQ2xhc3MoKSk7Ci0gICAgICAgIC8vIFNpbmNlIHRoaXMgaXMgYSBnZW5lcmljIFNlcnZpY2Ugd2l0aCAgb3ZlcnJpZGVzLCB0aGVyZSB3aWxsIGJlIGEgV2ViU2VydmljZUNsaWVudCBhbm5vdGF0aW9uCi0gICAgICAgIFdlYlNlcnZpY2VDbGllbnQgd3NDbGllbnQgPSBkYmNJblNlcnZpY2VEZXNjLmdldFdlYlNlcnZpY2VDbGllbnRBbm5vdCgpOwotICAgICAgICBhc3NlcnROdWxsKHdzQ2xpZW50KTsKLSAgICAgICAgd3NDbGllbnQgPSBkYmNJblNlcnZpY2VEZXNjLmdldFdlYlNlcnZpY2VDbGllbnRBbm5vdChzZXJ2aWNlRGVsZWdhdGUpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHdzQ2xpZW50KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGdldFdzZGxMb2NhdGlvbihvdmVycmlkZW5Xc2RsKSwgd3NDbGllbnQud3NkbExvY2F0aW9uKCkpOwotICAgICAgICBhc3NlcnROdWxsKHdzQ2xpZW50LnRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgYXNzZXJ0TnVsbCh3c0NsaWVudC5uYW1lKCkpOwotCi0gICAgICAgIC8vIFdTREwgb3ZlcnJpZGUgc3BlY2lmaWVkIGluIHRoZSBjb21wb3NpdGUKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiV3JvbmcgV1NETCB1c2VkIiwgdmFsaWRhdGVQb3J0KHNlcnZpY2UsIG92ZXJyaWRlbldzZGxfcG9ydExvY2FsUGFydCkpOwotCi0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFNlcnZpY2UuY3JlYXRlKFVSTCwgUU5hbWUpIHdpdGggYSBjb21wb3NpdGUgdGhhdCBzcGVjaWZpZXMgYSBDYXRhbG9nTWFuYWdlciBvdmVycmlkZSAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0MkFyZ1NlcnZpY2VPdmVycmlkZUNhdGFsb2dNYW5hZ2VyKCkgewotICAgICAgICBRTmFtZSBzZXJ2aWNlUU5hbWUgPSBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBzdmNMb2NhbFBhcnQpOwotICAgICAgICBVUkwgd3NkbFVybCA9IGdldFdzZGxVUkwob3RoZXJXc2RsKTsKLSAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUoKTsKLSAgICAgICAgT0FTSVNDYXRhbG9nTWFuYWdlciBjYXRhbG9nTWFuYWdlciA9IG5ldyBPQVNJU0NhdGFsb2dNYW5hZ2VyKCk7Ci0gICAgICAgIGNhdGFsb2dNYW5hZ2VyLnNldENhdGFsb2dGaWxlcyhnZXRDYXRhbG9nTG9jYXRpb24odW5pcXVlQ2F0YWxvZykpOwotICAgICAgICBjb21wb3NpdGUuc2V0Q2F0YWxvZ01hbmFnZXIoY2F0YWxvZ01hbmFnZXIpOwotICAgICAgICAvLyBVc2UgdGhlIHByb3ByaWV0YXJ5IFNQSSB0byBjcmVhdGUgYSBzZXJ2aWNlIHdpdGggYWRkaXRpb25hbCBtZXRhZGF0YSBzcGVjaWZpZWQKLSAgICAgICAgU2VydmljZURlbGVnYXRlLnNldFNlcnZpY2VNZXRhZGF0YShjb21wb3NpdGUpOwotICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSBTZXJ2aWNlLmNyZWF0ZSh3c2RsVXJsLCBzZXJ2aWNlUU5hbWUpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlKTsKLSAgICAgICAgLy8gVmVyaWZ5IHRoYXQgdGhlIGNvbXBvc2l0ZSBoYXMgYmVlbiByZXNldCBzbyB0aGF0IGl0IHdvdWxkIG5vdCBhZmZlY3QgdGhlIG5leHQgU2VydmljZQotICAgICAgICBhc3NlcnROdWxsKFNlcnZpY2VEZWxlZ2F0ZS5nZXRTZXJ2aWNlTWV0YWRhdGEoKSk7Ci0gICAgICAgIFNlcnZpY2VEZWxlZ2F0ZSBzZXJ2aWNlRGVsZWdhdGUgPSBEZXNjcmlwdGlvblRlc3RVdGlsczIuZ2V0U2VydmljZURlbGVnYXRlKHNlcnZpY2UpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2VEZWxlZ2F0ZSk7Ci0gICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzZXJ2aWNlRGVzYyA9IHNlcnZpY2VEZWxlZ2F0ZS5nZXRTZXJ2aWNlRGVzY3JpcHRpb24oKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlRGVzYyk7Ci0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBkYmNJblNlcnZpY2VEZXNjID0gRGVzY3JpcHRpb25UZXN0VXRpbHMyLmdldFNlcnZpY2VEZXNjcmlwdGlvbkNvbXBvc2l0ZShzZXJ2aWNlRGVzYyk7Ci0gICAgICAgIGFzc2VydFNhbWUoY29tcG9zaXRlLCBkYmNJblNlcnZpY2VEZXNjLmdldFNwYXJzZUNvbXBvc2l0ZShzZXJ2aWNlRGVsZWdhdGUpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFNlcnZpY2UuY2xhc3MsIGRiY0luU2VydmljZURlc2MuZ2V0Q29ycmVzcG9uZGluZ0NsYXNzKCkpOwotCi0gICAgICAgIC8vIFZlcmlmeSB0aGF0IHRoZSBDYXRhbG9nTWFuYWdlciBmb3IgdGhlIFNlcnZpY2UgdXNlcyB0aGUgdW5pcXVlIGNhdGFsb2cgZmlsZS4KLSAgICAgICAgU3RyaW5nIHNlcnZpY2VDYXRhbG9nRmlsZSA9IChTdHJpbmcpIGRiY0luU2VydmljZURlc2MuZ2V0U3BhcnNlQ29tcG9zaXRlKHNlcnZpY2VEZWxlZ2F0ZSkuZ2V0Q2F0YWxvZ01hbmFnZXIoKS5nZXRDYXRhbG9nRmlsZXMoKS5nZXQoMCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhzZXJ2aWNlQ2F0YWxvZ0ZpbGUsIGdldENhdGFsb2dMb2NhdGlvbih1bmlxdWVDYXRhbG9nKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2VuZXJhdGVkIHNlcnZpY2UgY29uc3RydWN0b3IoKSB3aXRoIGEgY29tcG9zaXRlIHRoYXQgc3BlY2lmaWVzIGEgd3NkbExvY2F0aW9uIG92ZXJyaWRlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdE5vQXJnR2VuZXJhdGVkU2VydmljZU92ZXJyaWRlV3NkbExvY2F0aW9uKCkgewotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSgpOwotICAgICAgICBXZWJTZXJ2aWNlQ2xpZW50QW5ub3Qgd3NDbGllbnRBbm5vID0gV2ViU2VydmljZUNsaWVudEFubm90LmNyZWF0ZVdlYlNlcnZpY2VDbGllbnRBbm5vdEltcGwobnVsbCwgbnVsbCwgZ2V0V3NkbExvY2F0aW9uKG92ZXJyaWRlbldzZGwpKTsKLSAgICAgICAgY29tcG9zaXRlLnNldFdlYlNlcnZpY2VDbGllbnRBbm5vdCh3c0NsaWVudEFubm8pOwotICAgICAgICBTZXJ2aWNlRGVsZWdhdGUuc2V0U2VydmljZU1ldGFkYXRhKGNvbXBvc2l0ZSk7Ci0KLSAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gbmV3IENsaWVudE1ldGFkYXRhR2VuZXJhdGVkU2VydmljZSgpOwotCi0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZSk7Ci0gICAgICAgIGFzc2VydE51bGwoU2VydmljZURlbGVnYXRlLmdldFNlcnZpY2VNZXRhZGF0YSgpKTsKLSAgICAgICAgCi0gICAgICAgIFNlcnZpY2VEZWxlZ2F0ZSBzZXJ2aWNlRGVsZWdhdGUgPSBEZXNjcmlwdGlvblRlc3RVdGlsczIuZ2V0U2VydmljZURlbGVnYXRlKHNlcnZpY2UpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2VEZWxlZ2F0ZSk7Ci0gICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzZXJ2aWNlRGVzYyA9IHNlcnZpY2VEZWxlZ2F0ZS5nZXRTZXJ2aWNlRGVzY3JpcHRpb24oKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlRGVzYyk7Ci0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBkYmNJblNlcnZpY2VEZXNjID0gRGVzY3JpcHRpb25UZXN0VXRpbHMyLmdldFNlcnZpY2VEZXNjcmlwdGlvbkNvbXBvc2l0ZShzZXJ2aWNlRGVzYyk7Ci0gICAgICAgIGFzc2VydFNhbWUoY29tcG9zaXRlLCBkYmNJblNlcnZpY2VEZXNjLmdldFNwYXJzZUNvbXBvc2l0ZShzZXJ2aWNlRGVsZWdhdGUpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKENsaWVudE1ldGFkYXRhR2VuZXJhdGVkU2VydmljZS5jbGFzcywgZGJjSW5TZXJ2aWNlRGVzYy5nZXRDb3JyZXNwb25kaW5nQ2xhc3MoKSk7Ci0gICAgICAgIC8vIFRoZXJlIGlzIFdlYlNlcnZpY2VDbGllbnQgb24gdGhlIGdlbmVyYXRlZCBTZXJ2aWNlIGFuZCBpdCB3YXMgb3ZlcnJpZGVuIGluIHRoZSBjb21wb3NpdGUKLSAgICAgICAgLy8gZm9yIHRoaXMga2V5LCBob3dldmVyIHRoZSBrZXlsZXNzIGNvbXBvc2l0ZSBzaG91bGQgbm90IGhhdmUgYW55IG92ZXJyaWRlcy4KLSAgICAgICAgV2ViU2VydmljZUNsaWVudCB3c0NsaWVudCA9IGRiY0luU2VydmljZURlc2MuZ2V0V2ViU2VydmljZUNsaWVudEFubm90KCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwod3NDbGllbnQpOwotICAgICAgICBhc3NlcnRFcXVhbHMob3JpZ2luYWxXc2RsLCB3c0NsaWVudC53c2RsTG9jYXRpb24oKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygib3JpZ2luYWxUTlMiLCB3c0NsaWVudC50YXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiIiwgd3NDbGllbnQubmFtZSgpKTsKLSAgICAgICAgCi0gICAgICAgIFdlYlNlcnZpY2VDbGllbnQgd3NDbGllbnRLZXllZCA9IGRiY0luU2VydmljZURlc2MuZ2V0V2ViU2VydmljZUNsaWVudEFubm90KHNlcnZpY2VEZWxlZ2F0ZSk7Ci0gICAgICAgIGFzc2VydE5vdFNhbWUod3NDbGllbnQsIHdzQ2xpZW50S2V5ZWQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZ2V0V3NkbExvY2F0aW9uKG92ZXJyaWRlbldzZGwpLCB3c0NsaWVudEtleWVkLndzZGxMb2NhdGlvbigpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJvcmlnaW5hbFROUyIsIHdzQ2xpZW50S2V5ZWQudGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIHdzQ2xpZW50S2V5ZWQubmFtZSgpKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFdTREwgb3ZlcnJpZGUgc3BlY2lmaWVkIGluIHRoZSBjb21wb3NpdGUKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiV3JvbmcgV1NETCB1c2VkIiwgdmFsaWRhdGVQb3J0KHNlcnZpY2UsIG92ZXJyaWRlbldzZGxfcG9ydExvY2FsUGFydCkpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBHZW5lcmF0ZWQgc2VydmljZSBjb25zdHJ1Y3RvcigpIHdpdGggYSBjb21wb3NpdGUgdGhhdCBzcGVjaWZpZXMgYSBDYXRhbG9nTWFuYWdlciBvdmVycmlkZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3ROb0FyZ0dlbmVyYXRlZFNlcnZpY2VPdmVycmlkZUNhdGFsb2dNYW5hZ2VyKCkgewotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSgpOwotICAgICAgICBPQVNJU0NhdGFsb2dNYW5hZ2VyIGNhdGFsb2dNYW5hZ2VyID0gbmV3IE9BU0lTQ2F0YWxvZ01hbmFnZXIoKTsKLSAgICAgICAgY2F0YWxvZ01hbmFnZXIuc2V0Q2F0YWxvZ0ZpbGVzKGdldENhdGFsb2dMb2NhdGlvbih1bmlxdWVDYXRhbG9nKSk7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRDYXRhbG9nTWFuYWdlcihjYXRhbG9nTWFuYWdlcik7Ci0gICAgICAgIFNlcnZpY2VEZWxlZ2F0ZS5zZXRTZXJ2aWNlTWV0YWRhdGEoY29tcG9zaXRlKTsKLQotICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgQ2xpZW50TWV0YWRhdGFHZW5lcmF0ZWRTZXJ2aWNlKCk7Ci0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlKTsKLSAgICAgICAgYXNzZXJ0TnVsbChTZXJ2aWNlRGVsZWdhdGUuZ2V0U2VydmljZU1ldGFkYXRhKCkpOwotICAgICAgICAKLSAgICAgICAgU2VydmljZURlbGVnYXRlIHNlcnZpY2VEZWxlZ2F0ZSA9IERlc2NyaXB0aW9uVGVzdFV0aWxzMi5nZXRTZXJ2aWNlRGVsZWdhdGUoc2VydmljZSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZURlbGVnYXRlKTsKLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNlcnZpY2VEZXNjID0gc2VydmljZURlbGVnYXRlLmdldFNlcnZpY2VEZXNjcmlwdGlvbigpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2VEZXNjKTsKLSAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIGRiY0luU2VydmljZURlc2MgPSBEZXNjcmlwdGlvblRlc3RVdGlsczIuZ2V0U2VydmljZURlc2NyaXB0aW9uQ29tcG9zaXRlKHNlcnZpY2VEZXNjKTsKLSAgICAgICAgYXNzZXJ0U2FtZShjb21wb3NpdGUsIGRiY0luU2VydmljZURlc2MuZ2V0U3BhcnNlQ29tcG9zaXRlKHNlcnZpY2VEZWxlZ2F0ZSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoQ2xpZW50TWV0YWRhdGFHZW5lcmF0ZWRTZXJ2aWNlLmNsYXNzLCBkYmNJblNlcnZpY2VEZXNjLmdldENvcnJlc3BvbmRpbmdDbGFzcygpKTsKLQotICAgICAgICAvLyBWZXJpZnkgdGhhdCB0aGUgQ2F0YWxvZ01hbmFnZXIgZm9yIHRoZSBTZXJ2aWNlIHVzZXMgdGhlIHVuaXF1ZSBjYXRhbG9nIGZpbGUuCi0gICAgICAgIFN0cmluZyBzZXJ2aWNlQ2F0YWxvZ0ZpbGUgPSAoU3RyaW5nKSBkYmNJblNlcnZpY2VEZXNjLmdldFNwYXJzZUNvbXBvc2l0ZShzZXJ2aWNlRGVsZWdhdGUpLmdldENhdGFsb2dNYW5hZ2VyKCkuZ2V0Q2F0YWxvZ0ZpbGVzKCkuZ2V0KDApOwotICAgICAgICBhc3NlcnRFcXVhbHMoc2VydmljZUNhdGFsb2dGaWxlLCBnZXRDYXRhbG9nTG9jYXRpb24odW5pcXVlQ2F0YWxvZykpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBHZW5lcmF0ZWQgc2VydmljZSBjb25zdHJ1Y3RvcihVUkwsIFFOYW1lKSB3aXRoIGEgY29tcG9zaXRlIHRoYXQgc3BlY2lmaWVzIGEgd3NkbExvY2F0aW9uIG92ZXJyaWRlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdDJBcmdHZW5lcmF0ZWRTZXJ2aWNlT3ZlcnJpZGVXc2RsTG9jYXRpb24oKSB7Ci0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCk7Ci0gICAgICAgIFdlYlNlcnZpY2VDbGllbnRBbm5vdCB3c0NsaWVudEFubm8gPSBXZWJTZXJ2aWNlQ2xpZW50QW5ub3QuY3JlYXRlV2ViU2VydmljZUNsaWVudEFubm90SW1wbChudWxsLCBudWxsLCBnZXRXc2RsTG9jYXRpb24ob3ZlcnJpZGVuV3NkbCkpOwotICAgICAgICBjb21wb3NpdGUuc2V0V2ViU2VydmljZUNsaWVudEFubm90KHdzQ2xpZW50QW5ubyk7Ci0gICAgICAgIFNlcnZpY2VEZWxlZ2F0ZS5zZXRTZXJ2aWNlTWV0YWRhdGEoY29tcG9zaXRlKTsKLQotICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgQ2xpZW50TWV0YWRhdGFHZW5lcmF0ZWRTZXJ2aWNlKGdldFdzZGxVUkwob3RoZXJXc2RsKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBzdmNMb2NhbFBhcnQpKTsKLQotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2UpOwotICAgICAgICBhc3NlcnROdWxsKFNlcnZpY2VEZWxlZ2F0ZS5nZXRTZXJ2aWNlTWV0YWRhdGEoKSk7Ci0gICAgICAgIAotICAgICAgICBTZXJ2aWNlRGVsZWdhdGUgc2VydmljZURlbGVnYXRlID0gRGVzY3JpcHRpb25UZXN0VXRpbHMyLmdldFNlcnZpY2VEZWxlZ2F0ZShzZXJ2aWNlKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlRGVsZWdhdGUpOwotICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc2VydmljZURlc2MgPSBzZXJ2aWNlRGVsZWdhdGUuZ2V0U2VydmljZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZURlc2MpOwotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgZGJjSW5TZXJ2aWNlRGVzYyA9IERlc2NyaXB0aW9uVGVzdFV0aWxzMi5nZXRTZXJ2aWNlRGVzY3JpcHRpb25Db21wb3NpdGUoc2VydmljZURlc2MpOwotICAgICAgICBhc3NlcnRTYW1lKGNvbXBvc2l0ZSwgZGJjSW5TZXJ2aWNlRGVzYy5nZXRTcGFyc2VDb21wb3NpdGUoc2VydmljZURlbGVnYXRlKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhDbGllbnRNZXRhZGF0YUdlbmVyYXRlZFNlcnZpY2UuY2xhc3MsIGRiY0luU2VydmljZURlc2MuZ2V0Q29ycmVzcG9uZGluZ0NsYXNzKCkpOwotICAgICAgICAvLyBUaGVyZSBpcyBXZWJTZXJ2aWNlQ2xpZW50IG9uIHRoZSBnZW5lcmF0ZWQgU2VydmljZSBhbmQgaXQgd2FzIG92ZXJyaWRlbiBpbiB0aGUgY29tcG9zaXRlCi0gICAgICAgIC8vIGZvciB0aGlzIGtleSwgaG93ZXZlciB0aGUga2V5bGVzcyBjb21wb3NpdGUgc2hvdWxkIG5vdCBoYXZlIGFueSBvdmVycmlkZXMuCi0gICAgICAgIFdlYlNlcnZpY2VDbGllbnQgd3NDbGllbnQgPSBkYmNJblNlcnZpY2VEZXNjLmdldFdlYlNlcnZpY2VDbGllbnRBbm5vdCgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHdzQ2xpZW50KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG9yaWdpbmFsV3NkbCwgd3NDbGllbnQud3NkbExvY2F0aW9uKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIm9yaWdpbmFsVE5TIiwgd3NDbGllbnQudGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIHdzQ2xpZW50Lm5hbWUoKSk7Ci0KLSAgICAgICAgV2ViU2VydmljZUNsaWVudCB3c0NsaWVudEtleWVkID0gZGJjSW5TZXJ2aWNlRGVzYy5nZXRXZWJTZXJ2aWNlQ2xpZW50QW5ub3Qoc2VydmljZURlbGVnYXRlKTsKLSAgICAgICAgYXNzZXJ0Tm90U2FtZSh3c0NsaWVudCwgd3NDbGllbnRLZXllZCk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRFcXVhbHMoZ2V0V3NkbExvY2F0aW9uKG92ZXJyaWRlbldzZGwpLCB3c0NsaWVudEtleWVkLndzZGxMb2NhdGlvbigpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJvcmlnaW5hbFROUyIsIHdzQ2xpZW50S2V5ZWQudGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIHdzQ2xpZW50S2V5ZWQubmFtZSgpKTsKLQotICAgICAgICAvLyBXU0RMIG92ZXJyaWRlIHNwZWNpZmllZCBpbiB0aGUgY29tcG9zaXRlCi0gICAgICAgIGFzc2VydFRydWUoIldyb25nIFdTREwgdXNlZCIsIHZhbGlkYXRlUG9ydChzZXJ2aWNlLCBvdmVycmlkZW5Xc2RsX3BvcnRMb2NhbFBhcnQpKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogR2VuZXJhdGVkIHNlcnZpY2UgY29uc3RydWN0b3IoVVJMLCBRTmFtZSkgd2l0aCBhIGNvbXBvc2l0ZSB0aGF0IHNwZWNpZmllcyBhIAotICAgICAqIHRhcmdldCBOYW1lc3BhY2Ugb3ZlcnJpZGUuICBNb3N0IG9mIHRoZSBvdGhlciB0ZXN0cyBhcmUgYmFzZWQgb24gd3NkbExvY2F0aW9uIHNpbmNlCi0gICAgICogdGhhdCBpcyB3aGF0IEpTUi0xMDkgRERzIG92ZXJyaWRlLiAgVGhpcyB0ZXN0IHZlcmlmaWVzIHRoYXQgb3RoZXIgbWVtYmVycyBjYW4gYWxzbwotICAgICAqIGJlIG92ZXJyaWRlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3QyQXJnR2VuZXJhdGVkU2VydmljZU92ZXJyaWRlVE5TKCkgewotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSgpOwotICAgICAgICBXZWJTZXJ2aWNlQ2xpZW50QW5ub3Qgd3NDbGllbnRBbm5vID0gV2ViU2VydmljZUNsaWVudEFubm90LmNyZWF0ZVdlYlNlcnZpY2VDbGllbnRBbm5vdEltcGwobnVsbCwgIm92ZXJyaWRlVE5TIiwgZ2V0V3NkbExvY2F0aW9uKG92ZXJyaWRlbldzZGwpKTsKLSAgICAgICAgY29tcG9zaXRlLnNldFdlYlNlcnZpY2VDbGllbnRBbm5vdCh3c0NsaWVudEFubm8pOwotICAgICAgICBTZXJ2aWNlRGVsZWdhdGUuc2V0U2VydmljZU1ldGFkYXRhKGNvbXBvc2l0ZSk7Ci0KLSAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gbmV3IENsaWVudE1ldGFkYXRhR2VuZXJhdGVkU2VydmljZShnZXRXc2RsVVJMKG90aGVyV3NkbCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFFOYW1lKG5hbWVzcGFjZVVSSSwgc3ZjTG9jYWxQYXJ0KSk7Ci0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlKTsKLSAgICAgICAgYXNzZXJ0TnVsbChTZXJ2aWNlRGVsZWdhdGUuZ2V0U2VydmljZU1ldGFkYXRhKCkpOwotICAgICAgICAKLSAgICAgICAgU2VydmljZURlbGVnYXRlIHNlcnZpY2VEZWxlZ2F0ZSA9IERlc2NyaXB0aW9uVGVzdFV0aWxzMi5nZXRTZXJ2aWNlRGVsZWdhdGUoc2VydmljZSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZURlbGVnYXRlKTsKLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNlcnZpY2VEZXNjID0gc2VydmljZURlbGVnYXRlLmdldFNlcnZpY2VEZXNjcmlwdGlvbigpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2VEZXNjKTsKLSAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIGRiY0luU2VydmljZURlc2MgPSBEZXNjcmlwdGlvblRlc3RVdGlsczIuZ2V0U2VydmljZURlc2NyaXB0aW9uQ29tcG9zaXRlKHNlcnZpY2VEZXNjKTsKLSAgICAgICAgYXNzZXJ0U2FtZShjb21wb3NpdGUsIGRiY0luU2VydmljZURlc2MuZ2V0U3BhcnNlQ29tcG9zaXRlKHNlcnZpY2VEZWxlZ2F0ZSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoQ2xpZW50TWV0YWRhdGFHZW5lcmF0ZWRTZXJ2aWNlLmNsYXNzLCBkYmNJblNlcnZpY2VEZXNjLmdldENvcnJlc3BvbmRpbmdDbGFzcygpKTsKLSAgICAgICAgLy8gVGhlcmUgaXMgV2ViU2VydmljZUNsaWVudCBvbiB0aGUgZ2VuZXJhdGVkIFNlcnZpY2UgYW5kIGl0IHdhcyBvdmVycmlkZW4gaW4gdGhlIGNvbXBvc2l0ZQotICAgICAgICAvLyBmb3IgdGhpcyBrZXksIGhvd2V2ZXIgdGhlIGtleWxlc3MgY29tcG9zaXRlIHNob3VsZCBub3QgaGF2ZSBhbnkgb3ZlcnJpZGVzLgotICAgICAgICBXZWJTZXJ2aWNlQ2xpZW50IHdzQ2xpZW50ID0gZGJjSW5TZXJ2aWNlRGVzYy5nZXRXZWJTZXJ2aWNlQ2xpZW50QW5ub3QoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh3c0NsaWVudCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhvcmlnaW5hbFdzZGwsIHdzQ2xpZW50LndzZGxMb2NhdGlvbigpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJvcmlnaW5hbFROUyIsIHdzQ2xpZW50LnRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCB3c0NsaWVudC5uYW1lKCkpOwotCi0gICAgICAgIFdlYlNlcnZpY2VDbGllbnQgd3NDbGllbnRLZXllZCA9IGRiY0luU2VydmljZURlc2MuZ2V0V2ViU2VydmljZUNsaWVudEFubm90KHNlcnZpY2VEZWxlZ2F0ZSk7Ci0gICAgICAgIGFzc2VydE5vdFNhbWUod3NDbGllbnQsIHdzQ2xpZW50S2V5ZWQpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGdldFdzZGxMb2NhdGlvbihvdmVycmlkZW5Xc2RsKSwgd3NDbGllbnRLZXllZC53c2RsTG9jYXRpb24oKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygib3ZlcnJpZGVUTlMiLCB3c0NsaWVudEtleWVkLnRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCB3c0NsaWVudEtleWVkLm5hbWUoKSk7Ci0KLSAgICAgICAgLy8gV1NETCBvdmVycmlkZSBzcGVjaWZpZWQgaW4gdGhlIGNvbXBvc2l0ZQotICAgICAgICBhc3NlcnRUcnVlKCJXcm9uZyBXU0RMIHVzZWQiLCB2YWxpZGF0ZVBvcnQoc2VydmljZSwgb3ZlcnJpZGVuV3NkbF9wb3J0TG9jYWxQYXJ0KSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEdlbmVyYXRlZCBzZXJ2aWNlIGNvbnN0cnVjdG9yKFVSTCwgUU5hbWUpIHdpdGggYSBjb21wb3NpdGUgdGhhdCBzcGVjaWZpZXMgYSAKLSAgICAgKiBDYXRhbG9nIE1hbmFnZXIgb3ZlcnJpZGUuICAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0MkFyZ0dlbmVyYXRlZFNlcnZpY2VPdmVycmlkZUNhdGFsb2dNYW5hZ2VyKCkgewotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSgpOwotICAgICAgICBPQVNJU0NhdGFsb2dNYW5hZ2VyIGNhdGFsb2dNYW5hZ2VyID0gbmV3IE9BU0lTQ2F0YWxvZ01hbmFnZXIoKTsKLSAgICAgICAgY2F0YWxvZ01hbmFnZXIuc2V0Q2F0YWxvZ0ZpbGVzKGdldENhdGFsb2dMb2NhdGlvbih1bmlxdWVDYXRhbG9nKSk7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRDYXRhbG9nTWFuYWdlcihjYXRhbG9nTWFuYWdlcik7Ci0gICAgICAgIFNlcnZpY2VEZWxlZ2F0ZS5zZXRTZXJ2aWNlTWV0YWRhdGEoY29tcG9zaXRlKTsKLQotICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgQ2xpZW50TWV0YWRhdGFHZW5lcmF0ZWRTZXJ2aWNlKGdldFdzZGxVUkwob3RoZXJXc2RsKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBzdmNMb2NhbFBhcnQpKTsKLQotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2UpOwotICAgICAgICBhc3NlcnROdWxsKFNlcnZpY2VEZWxlZ2F0ZS5nZXRTZXJ2aWNlTWV0YWRhdGEoKSk7Ci0gICAgICAgIAotICAgICAgICBTZXJ2aWNlRGVsZWdhdGUgc2VydmljZURlbGVnYXRlID0gRGVzY3JpcHRpb25UZXN0VXRpbHMyLmdldFNlcnZpY2VEZWxlZ2F0ZShzZXJ2aWNlKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlRGVsZWdhdGUpOwotICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc2VydmljZURlc2MgPSBzZXJ2aWNlRGVsZWdhdGUuZ2V0U2VydmljZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZURlc2MpOwotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgZGJjSW5TZXJ2aWNlRGVzYyA9IERlc2NyaXB0aW9uVGVzdFV0aWxzMi5nZXRTZXJ2aWNlRGVzY3JpcHRpb25Db21wb3NpdGUoc2VydmljZURlc2MpOwotICAgICAgICBhc3NlcnRTYW1lKGNvbXBvc2l0ZSwgZGJjSW5TZXJ2aWNlRGVzYy5nZXRTcGFyc2VDb21wb3NpdGUoc2VydmljZURlbGVnYXRlKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhDbGllbnRNZXRhZGF0YUdlbmVyYXRlZFNlcnZpY2UuY2xhc3MsIGRiY0luU2VydmljZURlc2MuZ2V0Q29ycmVzcG9uZGluZ0NsYXNzKCkpOwotCi0gICAgICAgIC8vIFZlcmlmeSB0aGF0IHRoZSBDYXRhbG9nTWFuYWdlciBmb3IgdGhlIFNlcnZpY2UgdXNlcyB0aGUgdW5pcXVlIGNhdGFsb2cgZmlsZS4KLSAgICAgICAgU3RyaW5nIHNlcnZpY2VDYXRhbG9nRmlsZSA9IChTdHJpbmcpIGRiY0luU2VydmljZURlc2MuZ2V0U3BhcnNlQ29tcG9zaXRlKHNlcnZpY2VEZWxlZ2F0ZSkuZ2V0Q2F0YWxvZ01hbmFnZXIoKS5nZXRDYXRhbG9nRmlsZXMoKS5nZXQoMCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhzZXJ2aWNlQ2F0YWxvZ0ZpbGUsIGdldENhdGFsb2dMb2NhdGlvbih1bmlxdWVDYXRhbG9nKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2VuZXJhdGVkIHNlcnZpY2UgY29uc3RydWN0b3IoVVJMLCBRTmFtZSkgd2l0aCBhIGNvbXBvc2l0ZSB0aGF0IHNwZWNpZmllcyBhIHdzZGxMb2NhdGlvbiBvdmVycmlkZQotICAgICAqIHdoZXJlIHRoZSBvdmVycmlkZSBpcyBhIGZ1bGx5IHNwZWNpZmVkIFVSTCB0byBhIGZpbGUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdDJBcmdHZW5lcmF0ZWRTZXJ2aWNlT3ZlcnJpZGVXc2RsTG9jYXRpb25XaXRoUHJvdG9jb2woKSB7Ci0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCk7Ci0gICAgICAgIC8vIElmIHRoZSB3c2RsTG9jYXRpb24gaW4gdGhlIGNvbXBvc2l0ZSBzcGVjaWZpZXMgYSBwcm90b2NvbCAobGlrZSBmaWxlOiBvciBodHRwOikgdGhlbgotICAgICAgICAvLyBpdCBzaG91bGQgYmUgdXNlZCBhcy1pcy4gIE90aGVyd2lzZSAoYXMgc2hvd24gYnkgdGhlIG90aGVyIHRlc3RzKSwgaXQgaXMgdHJlYXRlZCBhcwotICAgICAgICAvLyBhIHBhdGggb24gdGhlIGxvY2FsIGZpbGVzeXN0ZW0uCi0gICAgICAgIFN0cmluZyB3c2RsTG9jYXRpb24gPSBnZXRXc2RsTG9jYXRpb24ob3ZlcnJpZGVuV3NkbCk7Ci0gICAgICAgIC8vIFRoaXMgY2hlY2sgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgVW5peC9MaW51eCBmaWxlIHBhdGhzIGJlZ2luCi0gICAgICAgIC8vIHdpdGggYSAnLycuIFdoZW4gYWRkaW5nIHRoZSBwcmVmaXggJ2phcjpmaWxlOi8nIHdlIG1heSBlbmQKLSAgICAgICAgLy8gdXAgd2l0aCAnLy8nIGFmdGVyIHRoZSAnZmlsZTonIHBhcnQuIFRoaXMgY2F1c2VzIHRoZSBVUkwgCi0gICAgICAgIC8vIG9iamVjdCB0byB0cmVhdCB0aGlzIGxpa2UgYSByZW1vdGUgcmVzb3VyY2UKLSAgICAgICAgaWYod3NkbExvY2F0aW9uLmluZGV4T2YoIi8iKSA9PSAwKSB7Ci0gICAgICAgICAgICB3c2RsTG9jYXRpb24gPSB3c2RsTG9jYXRpb24uc3Vic3RyaW5nKDEsIHdzZGxMb2NhdGlvbi5sZW5ndGgoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgZnVsbFdzZGxMb2NhdGlvbiA9ICJmaWxlOi8iICsgd3NkbExvY2F0aW9uOwotICAgICAgICBXZWJTZXJ2aWNlQ2xpZW50QW5ub3Qgd3NDbGllbnRBbm5vID0gV2ViU2VydmljZUNsaWVudEFubm90LmNyZWF0ZVdlYlNlcnZpY2VDbGllbnRBbm5vdEltcGwobnVsbCwgbnVsbCwgZnVsbFdzZGxMb2NhdGlvbik7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRXZWJTZXJ2aWNlQ2xpZW50QW5ub3Qod3NDbGllbnRBbm5vKTsKLSAgICAgICAgU2VydmljZURlbGVnYXRlLnNldFNlcnZpY2VNZXRhZGF0YShjb21wb3NpdGUpOwotCi0gICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IG5ldyBDbGllbnRNZXRhZGF0YUdlbmVyYXRlZFNlcnZpY2UoZ2V0V3NkbFVSTChvdGhlcldzZGwpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIHN2Y0xvY2FsUGFydCkpOwotCi0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZSk7Ci0gICAgICAgIGFzc2VydE51bGwoU2VydmljZURlbGVnYXRlLmdldFNlcnZpY2VNZXRhZGF0YSgpKTsKLSAgICAgICAgCi0gICAgICAgIFNlcnZpY2VEZWxlZ2F0ZSBzZXJ2aWNlRGVsZWdhdGUgPSBEZXNjcmlwdGlvblRlc3RVdGlsczIuZ2V0U2VydmljZURlbGVnYXRlKHNlcnZpY2UpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2VEZWxlZ2F0ZSk7Ci0gICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzZXJ2aWNlRGVzYyA9IHNlcnZpY2VEZWxlZ2F0ZS5nZXRTZXJ2aWNlRGVzY3JpcHRpb24oKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlRGVzYyk7Ci0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBkYmNJblNlcnZpY2VEZXNjID0gRGVzY3JpcHRpb25UZXN0VXRpbHMyLmdldFNlcnZpY2VEZXNjcmlwdGlvbkNvbXBvc2l0ZShzZXJ2aWNlRGVzYyk7Ci0gICAgICAgIGFzc2VydFNhbWUoY29tcG9zaXRlLCBkYmNJblNlcnZpY2VEZXNjLmdldFNwYXJzZUNvbXBvc2l0ZShzZXJ2aWNlRGVsZWdhdGUpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKENsaWVudE1ldGFkYXRhR2VuZXJhdGVkU2VydmljZS5jbGFzcywgZGJjSW5TZXJ2aWNlRGVzYy5nZXRDb3JyZXNwb25kaW5nQ2xhc3MoKSk7Ci0gICAgICAgIC8vIFRoZXJlIGlzIFdlYlNlcnZpY2VDbGllbnQgb24gdGhlIGdlbmVyYXRlZCBTZXJ2aWNlIGFuZCBpdCB3YXMgb3ZlcnJpZGVuIGluIHRoZSBjb21wb3NpdGUKLSAgICAgICAgLy8gZm9yIHRoZSBrZXkuICBUaGUgYW5ub3RhdGlvbiB3aXRoIG5vIGtleSBzaG91bGQgYmUgdW5jaGFuZ2VkLgotICAgICAgICBXZWJTZXJ2aWNlQ2xpZW50IHdzQ2xpZW50ID0gZGJjSW5TZXJ2aWNlRGVzYy5nZXRXZWJTZXJ2aWNlQ2xpZW50QW5ub3QoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh3c0NsaWVudCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhvcmlnaW5hbFdzZGwsIHdzQ2xpZW50LndzZGxMb2NhdGlvbigpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJvcmlnaW5hbFROUyIsIHdzQ2xpZW50LnRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCB3c0NsaWVudC5uYW1lKCkpOwotCi0gICAgICAgIFdlYlNlcnZpY2VDbGllbnQgd3NDbGllbnRLZXllZCA9IGRiY0luU2VydmljZURlc2MuZ2V0V2ViU2VydmljZUNsaWVudEFubm90KHNlcnZpY2VEZWxlZ2F0ZSk7Ci0gICAgICAgIGFzc2VydE5vdFNhbWUod3NDbGllbnQsIHdzQ2xpZW50S2V5ZWQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZnVsbFdzZGxMb2NhdGlvbiwgd3NDbGllbnRLZXllZC53c2RsTG9jYXRpb24oKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygib3JpZ2luYWxUTlMiLCB3c0NsaWVudEtleWVkLnRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCB3c0NsaWVudEtleWVkLm5hbWUoKSk7Ci0KLSAgICAgICAgLy8gV1NETCBvdmVycmlkZSBzcGVjaWZpZWQgaW4gdGhlIGNvbXBvc2l0ZQotICAgICAgICBhc3NlcnRUcnVlKCJXcm9uZyBXU0RMIHVzZWQiLCB2YWxpZGF0ZVBvcnQoc2VydmljZSwgb3ZlcnJpZGVuV3NkbF9wb3J0TG9jYWxQYXJ0KSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFRlc3Qgb3ZlcnJpZGUgV1NETCBmaWxlIHRoYXQgaXMgZnVsbCBzcGVjaWZpZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZFdzZGxMb2NhdGlvbk92ZXJyaWRlV2l0aFByb3RvY29sKCkgewotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSgpOwotICAgICAgICBTdHJpbmcgd3NkbExvY2F0aW9uID0gZ2V0V3NkbExvY2F0aW9uKCJJbnZhbGlkRmlsZU5hbWUud3NkbCIpOwotICAgICAgICAvLyBUaGlzIGNoZWNrIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIFVuaXgvTGludXggZmlsZSBwYXRocyBiZWdpbgotICAgICAgICAvLyB3aXRoIGEgJy8nLiBXaGVuIGFkZGluZyB0aGUgcHJlZml4ICdqYXI6ZmlsZTovJyB3ZSBtYXkgZW5kCi0gICAgICAgIC8vIHVwIHdpdGggJy8vJyBhZnRlciB0aGUgJ2ZpbGU6JyBwYXJ0LiBUaGlzIGNhdXNlcyB0aGUgVVJMIAotICAgICAgICAvLyBvYmplY3QgdG8gdHJlYXQgdGhpcyBsaWtlIGEgcmVtb3RlIHJlc291cmNlCi0gICAgICAgIGlmKHdzZGxMb2NhdGlvbi5pbmRleE9mKCIvIikgPT0gMCkgewotICAgICAgICAgICAgd3NkbExvY2F0aW9uID0gd3NkbExvY2F0aW9uLnN1YnN0cmluZygxLCB3c2RsTG9jYXRpb24ubGVuZ3RoKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGZ1bGxXc2RsTG9jYXRpb24gPSAiaHR0cDovIiArIHdzZGxMb2NhdGlvbjsKLSAgICAgICAgCi0gICAgICAgIFdlYlNlcnZpY2VDbGllbnRBbm5vdCB3c0NsaWVudEFubm8gPSBXZWJTZXJ2aWNlQ2xpZW50QW5ub3QuY3JlYXRlV2ViU2VydmljZUNsaWVudEFubm90SW1wbChudWxsLCBudWxsLCBmdWxsV3NkbExvY2F0aW9uKTsKLSAgICAgICAgY29tcG9zaXRlLnNldFdlYlNlcnZpY2VDbGllbnRBbm5vdCh3c0NsaWVudEFubm8pOwotICAgICAgICBTZXJ2aWNlRGVsZWdhdGUuc2V0U2VydmljZU1ldGFkYXRhKGNvbXBvc2l0ZSk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IG5ldyBDbGllbnRNZXRhZGF0YUdlbmVyYXRlZFNlcnZpY2UoKTsKLSAgICAgICAgICAgIGZhaWwoIlNob3VsZCBoYXZlIGNhdWdodCBleGNlcHRpb24gZm9yIGludmFsaWQgV1NETCBmaWxlIG5hbWUgaW4gb3ZlcnJpZGUiKTsKLSAgICAgICAgfSBjYXRjaCAoV2ViU2VydmljZUV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgLy8gRXhwZWN0ZWQgcGF0aAotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIG92ZXJpZGUgV1NETCBmaWxlIGRvZXNuJ3QgZXhpc3Q7IHNob3VsZCBjYXRjaCBhbiBlcnJvciAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZFdzZGxMb2NhdGlvbk92ZXJyaWRlKCkgewotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSgpOwotICAgICAgICBXZWJTZXJ2aWNlQ2xpZW50QW5ub3Qgd3NDbGllbnRBbm5vID0gV2ViU2VydmljZUNsaWVudEFubm90LmNyZWF0ZVdlYlNlcnZpY2VDbGllbnRBbm5vdEltcGwobnVsbCwgbnVsbCwgZ2V0V3NkbExvY2F0aW9uKCJJbnZhbGlkRmlsZU5hbWUud3NkbCIpKTsKLSAgICAgICAgY29tcG9zaXRlLnNldFdlYlNlcnZpY2VDbGllbnRBbm5vdCh3c0NsaWVudEFubm8pOwotICAgICAgICBTZXJ2aWNlRGVsZWdhdGUuc2V0U2VydmljZU1ldGFkYXRhKGNvbXBvc2l0ZSk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IG5ldyBDbGllbnRNZXRhZGF0YUdlbmVyYXRlZFNlcnZpY2UoKTsKLSAgICAgICAgICAgIGZhaWwoIlNob3VsZCBoYXZlIGNhdWdodCBleGNlcHRpb24gZm9yIGludmFsaWQgV1NETCBmaWxlIG5hbWUgaW4gb3ZlcnJpZGUiKTsKLSAgICAgICAgfSBjYXRjaCAoV2ViU2VydmljZUV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgLy8gRXhwZWN0ZWQgcGF0aAotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIG11bHRpcGxlIGluc3RhbmNlcyBvZiB0aGUgc2FtZSBzZXJ2aWNlLiAgVmFsaWRhdGUgdGhhdCB0aGUgc2VydmljZSBkZWxlZ2F0ZXMgYXJlCi0gICAgICogdW5pcXVlIGFuZCB0aGUgU2VydmljZURlc2NyaXB0aW9uIGlzIHNoYXJlZC4gIE5vdGUgd2UgaGF2ZSB0byBpbnN0YWxsIGEgc3BlY2lhbCBmYWN0b3J5Ci0gICAgICogc28gdGhhdCB0aGUgU2VydmljZURlc2NyaXB0aW9ucyBhcmUgY2FjaGVkOyB0aGUgZGVmYXVsdCBmYWN0b3J5IHdpbGwgbm90IGNhdXNlIHRoZW0gdG8gYmUKLSAgICAgKiBjYWNoZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdE11bHRpcGxlU2VydmljZXMoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpbnN0YWxsQ2FjaGluZ0ZhY3RvcnkoKTsKLSAgICAgICAgICAgIFFOYW1lIHNlcnZpY2VRTmFtZSA9IG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIHN2Y0xvY2FsUGFydCk7Ci0gICAgICAgICAgICBRTmFtZSBwb3J0UU4gPSBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBvdGhlcldzZGxfcG9ydExvY2FsUGFydCk7Ci0gICAgICAgICAgICBVUkwgd3NkbFVybCA9IENsaWVudE1ldGFkYXRhVGVzdC5nZXRXc2RsVVJMKG90aGVyV3NkbCk7Ci0KLSAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgZmlyc3Qgc2VydmljZSAKLSAgICAgICAgICAgIFNlcnZpY2Ugc2VydmljZTEgPSBTZXJ2aWNlLmNyZWF0ZSh3c2RsVXJsLCBzZXJ2aWNlUU5hbWUpOwotICAgICAgICAgICAgU2VydmljZURlbGVnYXRlIHNlcnZpY2VEZWxlZ2F0ZTEgPSBEZXNjcmlwdGlvblRlc3RVdGlsczIuZ2V0U2VydmljZURlbGVnYXRlKHNlcnZpY2UxKTsKLSAgICAgICAgICAgIGFzc2VydE51bGwoU2VydmljZURlbGVnYXRlLmdldFNlcnZpY2VNZXRhZGF0YSgpKTsKLSAgICAgICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzZXJ2aWNlRGVzYzEgPSBzZXJ2aWNlRGVsZWdhdGUxLmdldFNlcnZpY2VEZXNjcmlwdGlvbigpOwotICAgICAgICAgICAgdmFsaWRhdGVQb3J0KHNlcnZpY2UxLCBvdGhlcldzZGxfcG9ydExvY2FsUGFydCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgc2Vjb25kIHNlcnZpY2UgCi0gICAgICAgICAgICBTZXJ2aWNlIHNlcnZpY2UyID0gU2VydmljZS5jcmVhdGUod3NkbFVybCwgc2VydmljZVFOYW1lKTsKLSAgICAgICAgICAgIFNlcnZpY2VEZWxlZ2F0ZSBzZXJ2aWNlRGVsZWdhdGUyID0gRGVzY3JpcHRpb25UZXN0VXRpbHMyLmdldFNlcnZpY2VEZWxlZ2F0ZShzZXJ2aWNlMik7Ci0gICAgICAgICAgICBhc3NlcnROdWxsKFNlcnZpY2VEZWxlZ2F0ZS5nZXRTZXJ2aWNlTWV0YWRhdGEoKSk7Ci0gICAgICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc2VydmljZURlc2MyID0gc2VydmljZURlbGVnYXRlMi5nZXRTZXJ2aWNlRGVzY3JpcHRpb24oKTsKLSAgICAgICAgICAgIHZhbGlkYXRlUG9ydChzZXJ2aWNlMiwgb3RoZXJXc2RsX3BvcnRMb2NhbFBhcnQpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBhc3NlcnROb3RTYW1lKHNlcnZpY2VEZWxlZ2F0ZTEsIHNlcnZpY2VEZWxlZ2F0ZTIpOwotICAgICAgICAgICAgLy8gU2luY2Ugd2UgaW5zdGFsbGVkIGEgY2FjaGluZyBmYWN0b3J5LCB0aGUgc2VydmljZSBkZXNjcmlwdGlvbnMgV0lMTCBiZSBjYWNoZWQuCi0gICAgICAgICAgICAvLyBXaXRob3V0IHRoYXQgZmFjdG9yeSwgdGhleSB3b3VsZCBub3QgaGF2ZSBiZWVuIGNhY2hlZC4gIFRoZSByZWFzb24gaXMgdGhhdCB0aGUKLSAgICAgICAgICAgIC8vIEF4aXNDb25maWd1cmF0aW9uIGluc3RhbmNlIGlzIHBhcnQgb2YgdGhlIGtleS4gIFRoZSBkZWZhdWx0IGZhY3RvcnkgaW4gdGhpcyAKLSAgICAgICAgICAgIC8vIGVudmlyb25tZW50IGFsd2F5cyByZXR1cm5zIGEgbmV3IGluc3RhbmNlLiAgVGhlIHRlc3QgZmFjdG9yeSBkb2VzIG5vdC4KLSAgICAgICAgICAgIGFzc2VydFNhbWUoc2VydmljZURlc2MxLCBzZXJ2aWNlRGVzYzIpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgcmVzdG9yZU9yaWdpbmFsRmFjdG9yeSgpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBTYW5pdHkgY2hlY2sgdGhhdCB0aGUgZmFjdG9yeSBXQVMgcmVzdG9yZWQuICBEbyB0aGUgc2FtZSB0aGluZyBhcyBhYm92ZSwgYnV0IHRoaXMgdGltZQotICAgICAgICAvLyB0aGUgc2VydmljZSBkZXNjcyBzaG91bGQgTk9UIGJlIHRoZSBzYW1lIHNpbmNlIHRoZXkgd2VyZW4ndCBjYWNoZWQuCi0gICAgICAgIFFOYW1lIHNlcnZpY2VRTmFtZSA9IG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIHN2Y0xvY2FsUGFydCk7Ci0gICAgICAgIFFOYW1lIHBvcnRRTiA9IG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIG90aGVyV3NkbF9wb3J0TG9jYWxQYXJ0KTsKLSAgICAgICAgVVJMIHdzZGxVcmwgPSBDbGllbnRNZXRhZGF0YVRlc3QuZ2V0V3NkbFVSTChvdGhlcldzZGwpOwotCi0gICAgICAgIC8vIENyZWF0ZSB0aGUgZmlyc3Qgc2VydmljZSAKLSAgICAgICAgU2VydmljZSBzZXJ2aWNlMSA9IFNlcnZpY2UuY3JlYXRlKHdzZGxVcmwsIHNlcnZpY2VRTmFtZSk7Ci0gICAgICAgIFNlcnZpY2VEZWxlZ2F0ZSBzZXJ2aWNlRGVsZWdhdGUxID0gRGVzY3JpcHRpb25UZXN0VXRpbHMyLmdldFNlcnZpY2VEZWxlZ2F0ZShzZXJ2aWNlMSk7Ci0gICAgICAgIGFzc2VydE51bGwoU2VydmljZURlbGVnYXRlLmdldFNlcnZpY2VNZXRhZGF0YSgpKTsKLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNlcnZpY2VEZXNjMSA9IHNlcnZpY2VEZWxlZ2F0ZTEuZ2V0U2VydmljZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgIHZhbGlkYXRlUG9ydChzZXJ2aWNlMSwgb3RoZXJXc2RsX3BvcnRMb2NhbFBhcnQpOwotICAgICAgICAKLSAgICAgICAgLy8gQ3JlYXRlIHRoZSBzZWNvbmQgc2VydmljZSAKLSAgICAgICAgU2VydmljZSBzZXJ2aWNlMiA9IFNlcnZpY2UuY3JlYXRlKHdzZGxVcmwsIHNlcnZpY2VRTmFtZSk7Ci0gICAgICAgIFNlcnZpY2VEZWxlZ2F0ZSBzZXJ2aWNlRGVsZWdhdGUyID0gRGVzY3JpcHRpb25UZXN0VXRpbHMyLmdldFNlcnZpY2VEZWxlZ2F0ZShzZXJ2aWNlMik7Ci0gICAgICAgIGFzc2VydE51bGwoU2VydmljZURlbGVnYXRlLmdldFNlcnZpY2VNZXRhZGF0YSgpKTsKLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNlcnZpY2VEZXNjMiA9IHNlcnZpY2VEZWxlZ2F0ZTIuZ2V0U2VydmljZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgIHZhbGlkYXRlUG9ydChzZXJ2aWNlMiwgb3RoZXJXc2RsX3BvcnRMb2NhbFBhcnQpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0Tm90U2FtZShzZXJ2aWNlRGVsZWdhdGUxLCBzZXJ2aWNlRGVsZWdhdGUyKTsKLSAgICAgICAgYXNzZXJ0Tm90U2FtZSgiQ2xpZW50IENvbmZpZ3VyYXRpb24gZmFjdG9yeSBOT1QgcmVzdG9yZWQ7IHN1YnNlcXVlbnQgdGVzdHMgbWF5IGJlIGFmZmVjdGVkISIsIHNlcnZpY2VEZXNjMSwgc2VydmljZURlc2MyKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIHR3byBzZXJ2aWNlcyBzdWNoIHRoYXQgdGhlIFNlcnZpY2VEZXNjcmlwdGlvbnMgc2hvdWxkIGJlIGNhY2hlZCBhbmQgc2hhcmVkLgotICAgICAqIENyZWF0ZSB0aGUgZmlyc3Qgd2l0aG91dCBhIGNvbXBvc2l0ZSwgdGhlIHNlY29uZCB3aXRoIGEgY29tcG9zaXRlLCB0aGVuIHZhbGlkYXRlIHRoZSBzZWNvbmQgCi0gICAgICogc2VydmljZSdzIGNvbXBvc2l0ZS4gIE5vdGUgdGhhdCB3ZSBoYXZlIHRvIHVzZSBhIHNwZWNpYWwgZmFjdG9yeSBzbyB0aGF0IHRoZSBzZXJ2aWNlCi0gICAgICogZGVzY3JpcHRpb25zIGFyZSBjYWNoZWQuICAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVTZXJ2aWNlc01peGVkQ29tcG9zaXRlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgaW5zdGFsbENhY2hpbmdGYWN0b3J5KCk7Ci0gICAgICAgICAgICBRTmFtZSBzZXJ2aWNlUU5hbWUgPSBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBzdmNMb2NhbFBhcnQpOwotICAgICAgICAgICAgVVJMIHdzZGxVcmwgPSBDbGllbnRNZXRhZGF0YVRlc3QuZ2V0V3NkbFVSTChvdGhlcldzZGwpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBDcmVhdGUgdGhlIGZpcnN0IHNlcnZpY2UgCi0gICAgICAgICAgICBTZXJ2aWNlIHNlcnZpY2UxID0gU2VydmljZS5jcmVhdGUod3NkbFVybCwgc2VydmljZVFOYW1lKTsKLSAgICAgICAgICAgIFNlcnZpY2VEZWxlZ2F0ZSBzZXJ2aWNlRGVsZWdhdGUxID0gRGVzY3JpcHRpb25UZXN0VXRpbHMyLmdldFNlcnZpY2VEZWxlZ2F0ZShzZXJ2aWNlMSk7Ci0gICAgICAgICAgICBhc3NlcnROdWxsKFNlcnZpY2VEZWxlZ2F0ZS5nZXRTZXJ2aWNlTWV0YWRhdGEoKSk7Ci0gICAgICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc2VydmljZURlc2MxID0gc2VydmljZURlbGVnYXRlMS5nZXRTZXJ2aWNlRGVzY3JpcHRpb24oKTsKLSAgICAgICAgICAgIHZhbGlkYXRlUG9ydChzZXJ2aWNlMSwgb3RoZXJXc2RsX3BvcnRMb2NhbFBhcnQpOwotCi0gICAgICAgICAgICAvLyBDcmVhdGUgdGhlIHNlY29uZCBzZXJ2aWNlIHNwZWNpZml5aW5nIGEgc3BhcnNlIGNvbXBvc2l0ZQotICAgICAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIHNwYXJzZUNvbXBvc2l0ZSA9IG5ldyBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUoKTsKLSAgICAgICAgICAgIFNlcnZpY2VEZWxlZ2F0ZS5zZXRTZXJ2aWNlTWV0YWRhdGEoc3BhcnNlQ29tcG9zaXRlKTsKLSAgICAgICAgICAgIFNlcnZpY2Ugc2VydmljZTIgPSBTZXJ2aWNlLmNyZWF0ZSh3c2RsVXJsLCBzZXJ2aWNlUU5hbWUpOwotICAgICAgICAgICAgU2VydmljZURlbGVnYXRlIHNlcnZpY2VEZWxlZ2F0ZTIgPSBEZXNjcmlwdGlvblRlc3RVdGlsczIuZ2V0U2VydmljZURlbGVnYXRlKHNlcnZpY2UyKTsKLSAgICAgICAgICAgIGFzc2VydE51bGwoU2VydmljZURlbGVnYXRlLmdldFNlcnZpY2VNZXRhZGF0YSgpKTsKLSAgICAgICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzZXJ2aWNlRGVzYzIgPSBzZXJ2aWNlRGVsZWdhdGUyLmdldFNlcnZpY2VEZXNjcmlwdGlvbigpOwotICAgICAgICAgICAgdmFsaWRhdGVQb3J0KHNlcnZpY2UyLCBvdGhlcldzZGxfcG9ydExvY2FsUGFydCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGFzc2VydE5vdFNhbWUoc2VydmljZURlbGVnYXRlMSwgc2VydmljZURlbGVnYXRlMik7Ci0gICAgICAgICAgICAvLyBTaW5jZSB3ZSBpbnN0YWxsZWQgYSBjYWNoaW5nIGZhY3RvcnksIHRoZSBzZXJ2aWNlIGRlc2NyaXB0aW9ucyBXSUxMIGJlIGNhY2hlZC4KLSAgICAgICAgICAgIC8vIFdpdGhvdXQgdGhhdCBmYWN0b3J5LCB0aGV5IHdvdWxkIG5vdCBoYXZlIGJlZW4gY2FjaGVkLiAgVGhlIHJlYXNvbiBpcyB0aGF0IHRoZQotICAgICAgICAgICAgLy8gQXhpc0NvbmZpZ3VyYXRpb24gaW5zdGFuY2UgaXMgcGFydCBvZiB0aGUga2V5LiAgVGhlIGRlZmF1bHQgZmFjdG9yeSBpbiB0aGlzIAotICAgICAgICAgICAgLy8gZW52aXJvbm1lbnQgYWx3YXlzIHJldHVybnMgYSBuZXcgaW5zdGFuY2UuICBUaGUgdGVzdCBmYWN0b3J5IGRvZXMgbm90LgotICAgICAgICAgICAgYXNzZXJ0U2FtZShzZXJ2aWNlRGVzYzEsIHNlcnZpY2VEZXNjMik7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIFRoZXJlIHNob3VsZCBub3QgYmUgYSBzcGFyc2UgY29tcG9zaXRlIGZvciB0aGUgZmlyc3Qgc2VydmljZSBkZWxlZ2F0ZSBhbmQgdGhlcmUKLSAgICAgICAgICAgIC8vIHNob3VsZCBiZSBvbmUgZm9yIHRoZSBzZWNvbmQgc2VydmljZSBkZWxlZ2F0ZQotICAgICAgICAgICAgYXNzZXJ0TnVsbChEZXNjcmlwdGlvblRlc3RVdGlsczIuZ2V0U2VydmljZURlc2NyaXB0aW9uQ29tcG9zaXRlKHNlcnZpY2VEZXNjMikuZ2V0U3BhcnNlQ29tcG9zaXRlKHNlcnZpY2VEZWxlZ2F0ZTEpKTsKLSAgICAgICAgICAgIGFzc2VydFNhbWUoc3BhcnNlQ29tcG9zaXRlLCBEZXNjcmlwdGlvblRlc3RVdGlsczIuZ2V0U2VydmljZURlc2NyaXB0aW9uQ29tcG9zaXRlKHNlcnZpY2VEZXNjMikuZ2V0U3BhcnNlQ29tcG9zaXRlKHNlcnZpY2VEZWxlZ2F0ZTIpKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHJlc3RvcmVPcmlnaW5hbEZhY3RvcnkoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIHR3byBzZXJ2aWNlcyBzdWNoIHRoYXQgdGhlIFNlcnZpY2VEZXNjcmlwdGlvbnMgc2hvdWxkIGJlIGNhY2hlZCBhbmQgc2hhcmVkLgotICAgICAqIENyZWF0ZSB0aGUgZmlyc3Qgd2l0aCBhIGNvbXBvc2l0ZSwgdGhlIHNlY29uZCB3aXRoIGEgY29tcG9zaXRlLCB0aGVuIHZhbGlkYXRlIGJvdGggCi0gICAgICogY29tcG9zaXRlcy4gIE5vdGUgdGhhdCB3ZSBoYXZlIHRvIHVzZSBhIHNwZWNpYWwgZmFjdG9yeSBzbyB0aGF0IHRoZSBzZXJ2aWNlCi0gICAgICogZGVzY3JpcHRpb25zIGFyZSBjYWNoZWQuICAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVTZXJ2aWNlc011bHRpcGxlQ29tcG9zaXRlcygpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGluc3RhbGxDYWNoaW5nRmFjdG9yeSgpOwotICAgICAgICAgICAgUU5hbWUgc2VydmljZVFOYW1lID0gbmV3IFFOYW1lKG5hbWVzcGFjZVVSSSwgc3ZjTG9jYWxQYXJ0KTsKLSAgICAgICAgICAgIFVSTCB3c2RsVXJsID0gQ2xpZW50TWV0YWRhdGFUZXN0LmdldFdzZGxVUkwob3RoZXJXc2RsKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBmaXJzdCBzZXJ2aWNlIAotICAgICAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIHNwYXJzZUNvbXBvc2l0ZTEgPSBuZXcgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCk7Ci0gICAgICAgICAgICBTZXJ2aWNlRGVsZWdhdGUuc2V0U2VydmljZU1ldGFkYXRhKHNwYXJzZUNvbXBvc2l0ZTEpOwotICAgICAgICAgICAgU2VydmljZSBzZXJ2aWNlMSA9IFNlcnZpY2UuY3JlYXRlKHdzZGxVcmwsIHNlcnZpY2VRTmFtZSk7Ci0gICAgICAgICAgICBTZXJ2aWNlRGVsZWdhdGUgc2VydmljZURlbGVnYXRlMSA9IERlc2NyaXB0aW9uVGVzdFV0aWxzMi5nZXRTZXJ2aWNlRGVsZWdhdGUoc2VydmljZTEpOwotICAgICAgICAgICAgYXNzZXJ0TnVsbChTZXJ2aWNlRGVsZWdhdGUuZ2V0U2VydmljZU1ldGFkYXRhKCkpOwotICAgICAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNlcnZpY2VEZXNjMSA9IHNlcnZpY2VEZWxlZ2F0ZTEuZ2V0U2VydmljZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgICAgICB2YWxpZGF0ZVBvcnQoc2VydmljZTEsIG90aGVyV3NkbF9wb3J0TG9jYWxQYXJ0KTsKLQotICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBzZWNvbmQgc2VydmljZSBzcGVjaWZpeWluZyBhIHNwYXJzZSBjb21wb3NpdGUKLSAgICAgICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBzcGFyc2VDb21wb3NpdGUyID0gbmV3IERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSgpOwotICAgICAgICAgICAgU2VydmljZURlbGVnYXRlLnNldFNlcnZpY2VNZXRhZGF0YShzcGFyc2VDb21wb3NpdGUyKTsKLSAgICAgICAgICAgIFNlcnZpY2Ugc2VydmljZTIgPSBTZXJ2aWNlLmNyZWF0ZSh3c2RsVXJsLCBzZXJ2aWNlUU5hbWUpOwotICAgICAgICAgICAgU2VydmljZURlbGVnYXRlIHNlcnZpY2VEZWxlZ2F0ZTIgPSBEZXNjcmlwdGlvblRlc3RVdGlsczIuZ2V0U2VydmljZURlbGVnYXRlKHNlcnZpY2UyKTsKLSAgICAgICAgICAgIGFzc2VydE51bGwoU2VydmljZURlbGVnYXRlLmdldFNlcnZpY2VNZXRhZGF0YSgpKTsKLSAgICAgICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzZXJ2aWNlRGVzYzIgPSBzZXJ2aWNlRGVsZWdhdGUyLmdldFNlcnZpY2VEZXNjcmlwdGlvbigpOwotICAgICAgICAgICAgdmFsaWRhdGVQb3J0KHNlcnZpY2UyLCBvdGhlcldzZGxfcG9ydExvY2FsUGFydCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGFzc2VydE5vdFNhbWUoc2VydmljZURlbGVnYXRlMSwgc2VydmljZURlbGVnYXRlMik7Ci0gICAgICAgICAgICAvLyBTaW5jZSB3ZSBpbnN0YWxsZWQgYSBjYWNoaW5nIGZhY3RvcnksIHRoZSBzZXJ2aWNlIGRlc2NyaXB0aW9ucyBXSUxMIGJlIGNhY2hlZC4KLSAgICAgICAgICAgIC8vIFdpdGhvdXQgdGhhdCBmYWN0b3J5LCB0aGV5IHdvdWxkIG5vdCBoYXZlIGJlZW4gY2FjaGVkLiAgVGhlIHJlYXNvbiBpcyB0aGF0IHRoZQotICAgICAgICAgICAgLy8gQXhpc0NvbmZpZ3VyYXRpb24gaW5zdGFuY2UgaXMgcGFydCBvZiB0aGUga2V5LiAgVGhlIGRlZmF1bHQgZmFjdG9yeSBpbiB0aGlzIAotICAgICAgICAgICAgLy8gZW52aXJvbm1lbnQgYWx3YXlzIHJldHVybnMgYSBuZXcgaW5zdGFuY2UuICBUaGUgdGVzdCBmYWN0b3J5IGRvZXMgbm90LgotICAgICAgICAgICAgYXNzZXJ0U2FtZShzZXJ2aWNlRGVzYzEsIHNlcnZpY2VEZXNjMik7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIFRoZXJlIHNob3VsZCBub3QgYmUgYSBzcGFyc2UgY29tcG9zaXRlIGZvciB0aGUgZmlyc3Qgc2VydmljZSBkZWxlZ2F0ZSBhbmQgdGhlcmUKLSAgICAgICAgICAgIC8vIHNob3VsZCBiZSBvbmUgZm9yIHRoZSBzZWNvbmQgc2VydmljZSBkZWxlZ2F0ZQotICAgICAgICAgICAgYXNzZXJ0U2FtZShzcGFyc2VDb21wb3NpdGUxLCBEZXNjcmlwdGlvblRlc3RVdGlsczIuZ2V0U2VydmljZURlc2NyaXB0aW9uQ29tcG9zaXRlKHNlcnZpY2VEZXNjMikuZ2V0U3BhcnNlQ29tcG9zaXRlKHNlcnZpY2VEZWxlZ2F0ZTEpKTsKLSAgICAgICAgICAgIGFzc2VydFNhbWUoc3BhcnNlQ29tcG9zaXRlMiwgRGVzY3JpcHRpb25UZXN0VXRpbHMyLmdldFNlcnZpY2VEZXNjcmlwdGlvbkNvbXBvc2l0ZShzZXJ2aWNlRGVzYzIpLmdldFNwYXJzZUNvbXBvc2l0ZShzZXJ2aWNlRGVsZWdhdGUyKSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICByZXN0b3JlT3JpZ2luYWxGYWN0b3J5KCk7Ci0gICAgICAgIH0gICAgICAgIAotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgdHdvIGdlbmVyYXRlZCBzZXJ2aWNlcyBzdWNoIHRoYXQgdGhlIFNlcnZpY2VEZXNjcmlwdGlvbnMgc2hvdWxkIGJlIGNhY2hlZCBhbmQgc2hhcmVkLgotICAgICAqIENyZWF0ZSB0aGUgZmlyc3Qgd2l0aCBhIGNvbXBvc2l0ZSwgdGhlIHNlY29uZCB3aXRoIGEgY29tcG9zaXRlLCB0aGVuIHZhbGlkYXRlIGJvdGggCi0gICAgICogY29tcG9zaXRlcy4gIE5vdGUgdGhhdCB3ZSBoYXZlIHRvIHVzZSBhIHNwZWNpYWwgZmFjdG9yeSBzbyB0aGF0IHRoZSBzZXJ2aWNlCi0gICAgICogZGVzY3JpcHRpb25zIGFyZSBjYWNoZWQuICAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVHZW5lcmF0ZWRTZXJ2aWNlV2l0aE11bHRpcGxlQ29tcG9zaXRlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgaW5zdGFsbENhY2hpbmdGYWN0b3J5KCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgZmlyc3Qgc2VydmljZSB3aXRoIGEgc3BhcnNlIGNvbXBvc2l0ZQotICAgICAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIHNwYXJzZUNvbXBvc2l0ZTEgPSBuZXcgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCk7Ci0gICAgICAgICAgICBTZXJ2aWNlRGVsZWdhdGUuc2V0U2VydmljZU1ldGFkYXRhKHNwYXJzZUNvbXBvc2l0ZTEpOwotICAgICAgICAgICAgU2VydmljZSBzZXJ2aWNlMSA9IG5ldyBDbGllbnRNZXRhZGF0YUdlbmVyYXRlZFNlcnZpY2UoZ2V0V3NkbFVSTChvdGhlcldzZGwpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBzdmNMb2NhbFBhcnQpKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZTEpOwotICAgICAgICAgICAgYXNzZXJ0TnVsbChTZXJ2aWNlRGVsZWdhdGUuZ2V0U2VydmljZU1ldGFkYXRhKCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBDcmVhdGUgdGhlIHNlY29uZCBzZXJ2aWNlIHdpdGggYSBzcGFyc2UgY29tcG9zaXRlCi0gICAgICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgc3BhcnNlQ29tcG9zaXRlMiA9IG5ldyBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUoKTsKLSAgICAgICAgICAgIFNlcnZpY2VEZWxlZ2F0ZS5zZXRTZXJ2aWNlTWV0YWRhdGEoc3BhcnNlQ29tcG9zaXRlMik7Ci0gICAgICAgICAgICBTZXJ2aWNlIHNlcnZpY2UyID0gbmV3IENsaWVudE1ldGFkYXRhR2VuZXJhdGVkU2VydmljZShnZXRXc2RsVVJMKG90aGVyV3NkbCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIHN2Y0xvY2FsUGFydCkpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlMik7Ci0gICAgICAgICAgICBhc3NlcnROdWxsKFNlcnZpY2VEZWxlZ2F0ZS5nZXRTZXJ2aWNlTWV0YWRhdGEoKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIFZlcmlmaXkgdGhlIHNlcnZpY2UgZGVsZWdhdGVzIGFyZSBkaWZmZXJlbnQgYW5kIHRoZSBzZXJ2aWNlIGRlc2NyaXB0aW9ucyBhcmUgdGhlIHNhbWUKLSAgICAgICAgICAgIC8vIHNpbmNlIHdlIGluc3RhbGxlZCBhIGNhY2hpbmcgZmFjdG9yeSBhYm92ZS4KLSAgICAgICAgICAgIFNlcnZpY2VEZWxlZ2F0ZSBzZXJ2aWNlRGVsZWdhdGUxID0gRGVzY3JpcHRpb25UZXN0VXRpbHMyLmdldFNlcnZpY2VEZWxlZ2F0ZShzZXJ2aWNlMSk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2VEZWxlZ2F0ZTEpOwotICAgICAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNlcnZpY2VEZXNjMSA9IHNlcnZpY2VEZWxlZ2F0ZTEuZ2V0U2VydmljZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2VEZXNjMSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFNlcnZpY2VEZWxlZ2F0ZSBzZXJ2aWNlRGVsZWdhdGUyID0gRGVzY3JpcHRpb25UZXN0VXRpbHMyLmdldFNlcnZpY2VEZWxlZ2F0ZShzZXJ2aWNlMik7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2VEZWxlZ2F0ZTIpOwotICAgICAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNlcnZpY2VEZXNjMiA9IHNlcnZpY2VEZWxlZ2F0ZTIuZ2V0U2VydmljZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2VEZXNjMik7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGFzc2VydE5vdFNhbWUoc2VydmljZURlbGVnYXRlMSwgc2VydmljZURlbGVnYXRlMik7Ci0gICAgICAgICAgICBhc3NlcnRTYW1lKHNlcnZpY2VEZXNjMSwgc2VydmljZURlc2MyKTsKLQotICAgICAgICAgICAgLy8gVGhlcmUgc2hvdWxkIGJlIGEgc3BhcnNlIGNvbXBvc2l0ZSBmb3IgdGhlIGZpcnN0IHNlcnZpY2UgZGVsZWdhdGUgYW5kCi0gICAgICAgICAgICAvLyBvbmUgZm9yIHRoZSBzZWNvbmQgc2VydmljZSBkZWxlZ2F0ZQotICAgICAgICAgICAgYXNzZXJ0U2FtZShzcGFyc2VDb21wb3NpdGUxLCAKLSAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb25UZXN0VXRpbHMyLmdldFNlcnZpY2VEZXNjcmlwdGlvbkNvbXBvc2l0ZShzZXJ2aWNlRGVzYzIpLmdldFNwYXJzZUNvbXBvc2l0ZShzZXJ2aWNlRGVsZWdhdGUxKSk7Ci0gICAgICAgICAgICBhc3NlcnRTYW1lKHNwYXJzZUNvbXBvc2l0ZTIsIERlc2NyaXB0aW9uVGVzdFV0aWxzMi5nZXRTZXJ2aWNlRGVzY3JpcHRpb25Db21wb3NpdGUoc2VydmljZURlc2MyKS5nZXRTcGFyc2VDb21wb3NpdGUoc2VydmljZURlbGVnYXRlMikpOwotCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBkYmNJblNlcnZpY2VEZXNjID0gRGVzY3JpcHRpb25UZXN0VXRpbHMyLmdldFNlcnZpY2VEZXNjcmlwdGlvbkNvbXBvc2l0ZShzZXJ2aWNlRGVzYzEpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKENsaWVudE1ldGFkYXRhR2VuZXJhdGVkU2VydmljZS5jbGFzcywgZGJjSW5TZXJ2aWNlRGVzYy5nZXRDb3JyZXNwb25kaW5nQ2xhc3MoKSk7Ci0KLSAgICAgICAgICAgIC8vIFdTREwgd2FzIHNwZWNpZmllZCBvbiB0aGUgZ2VuZXJhdGVkIFNlcnZpY2UgY29uc3RydWN0b3IsIGFuZCBub25lIGluIHRoZSBjb21wb3NpdGUKLSAgICAgICAgICAgIC8vIHNvIHNob3VsZCBnZXQgdGhlIFdTREwgc3BlY2lmaWVkIG9uIHRoZSBjb25zdHJ1Y3RvcgotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiV3JvbmcgV1NETCB1c2VkIiwgdmFsaWRhdGVQb3J0KHNlcnZpY2UxLCBvdGhlcldzZGxfcG9ydExvY2FsUGFydCkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiV3JvbmcgV1NETCB1c2VkIiwgdmFsaWRhdGVQb3J0KHNlcnZpY2UyLCBvdGhlcldzZGxfcG9ydExvY2FsUGFydCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIAotICAgICAgICAgICAgCi0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICByZXN0b3JlT3JpZ2luYWxGYWN0b3J5KCk7Ci0gICAgICAgIH0gICAgICAgIAotCi0gICAgfQotICAgIAotICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIC8vIFV0aWxpdHkgbWV0aG9kcwotICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gICAgLyoqCi0gICAgICogUHJlcGVuZHMgdGhlIGJhc2UgZGlyZWN0b3J5IGFuZCB0aGUgcGF0aCB3aGVyZSB0aGUgdGVzdCBXU0RMIGxpdmVzIHRvIGEgZmlsZW5hbWUuCi0gICAgICogQHBhcmFtIHdzZGxGaWxlTmFtZQotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBzdGF0aWMgU3RyaW5nIGdldFdzZGxMb2NhdGlvbihTdHJpbmcgd3NkbEZpbGVOYW1lKSB7Ci0gICAgICAgIFN0cmluZyB3c2RsTG9jYXRpb24gPSBudWxsOwotICAgICAgICBTdHJpbmcgYmFzZURpciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiYmFzZWRpciIsIi4iKTsKLSAgICAgICAgd3NkbExvY2F0aW9uID0gYmFzZURpciArICIvdGVzdC1yZXNvdXJjZXMvd3NkbC8iICsgd3NkbEZpbGVOYW1lOwotICAgICAgICByZXR1cm4gd3NkbExvY2F0aW9uOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBQcmVwZW5kcyB0aGUgYmFzZSBkaXJlY3RvcnkgYW5kIHRoZSBwYXRoIHdoZXJlIHRoZSB0ZXN0IENhdGFsb2cgbGl2ZXMgdG8gYSBmaWxlbmFtZS4KLSAgICAgKiBAcGFyYW0gY2F0YWxvZ0ZpbGVOYW1lCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHN0YXRpYyBTdHJpbmcgZ2V0Q2F0YWxvZ0xvY2F0aW9uKFN0cmluZyBjYXRhbG9nRmlsZU5hbWUpIHsKLSAgICAgICAgU3RyaW5nIHdzZGxMb2NhdGlvbiA9IG51bGw7Ci0gICAgICAgIFN0cmluZyBiYXNlRGlyID0gU3lzdGVtLmdldFByb3BlcnR5KCJiYXNlZGlyIiwiLiIpOwotICAgICAgICB3c2RsTG9jYXRpb24gPSBiYXNlRGlyICsgIi90ZXN0LXJlc291cmNlcy9jYXRhbG9nLyIgKyBjYXRhbG9nRmlsZU5hbWU7Ci0gICAgICAgIHJldHVybiBjYXRhbG9nRmlsZU5hbWU7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEdpdmVuIGEgc2ltcGxlIGZpbGUgbmFtZSAod2l0aCBubyBiYXNlIGRpY3Rvcnkgb3IgcGF0aCksIHJldHVybnMgYSBVUkwgdG8gdGhlIFdTREwgZmlsZQotICAgICAqIHdpdGggdGhlIGJhc2UgZGlyZWN0b3J5IGFuZCBwYXRoIHByZXBlbmRlZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gd3NkbEZpbGVOYW1lCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHN0YXRpYyBVUkwgZ2V0V3NkbFVSTChTdHJpbmcgd3NkbEZpbGVOYW1lKSB7Ci0gICAgICAgIFVSTCB1cmwgPSBudWxsOwotICAgICAgICBTdHJpbmcgd3NkbExvY2F0aW9uID0gZ2V0V3NkbExvY2F0aW9uKHdzZGxGaWxlTmFtZSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZSh3c2RsTG9jYXRpb24pOwotICAgICAgICAgICAgdXJsID0gZmlsZS50b1VSTCgpOwotICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiBjb252ZXJ0aW5nIFdTREwgZmlsZSB0byBVUkw6ICIgKyBlLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB1cmw7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFZhbGlkYXRlIHRoYXQgdGhlIFNlcnZpY2UgY29udGFpbnMgdGhlIGV4cGVjdGVkIHBvcnQuICBJZiB0aGUgcG9ydExvY2FsUGFydCBpcyBudWxsIHRoZW4KLSAgICAgKiBubyBwb3J0cyBhcmUgZXhwZWN0ZWQgdG8gZXhpc3QgdW5kZXIgdGhlIHNlcnZpY2UuICAKLSAgICAgKiBAcGFyYW0gc2VydmljZSBUaGUgc2VydmljZSB0byBjaGVjayBmb3IgdGhlIHNwZWNpZmllZCBwb3J0Ci0gICAgICogQHBhcmFtIHBvcnRMb2NhbFBhcnQgSWYgbnVsbCBtZWFucyBubyBwb3J0cyBhcmUgZXhwZWN0ZWQ7IG90aGVyd2lzZSB0aGUgbG9jYWxuYW1lIG9mIHRoZQotICAgICAqICAgIHNpbmdsZSBwb3J0IGV4cGVjdGVkIHVuZGVyIHRoZSBzZXJ2aWNlCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHN0YXRpYyBib29sZWFuIHZhbGlkYXRlUG9ydChTZXJ2aWNlIHNlcnZpY2UsIFN0cmluZyBwb3J0TG9jYWxQYXJ0KSB7Ci0gICAgICAgIGJvb2xlYW4gaXNWYWxpZCA9IGZhbHNlOwotCi0gICAgICAgIGlmIChzZXJ2aWNlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gRWFjaCBzZXJ2aWNlIGluIHRoZSBXU0RMcyBmb3IgdGhpcyB0ZXN0IGhhdmUgYSBzaW5nbGUgcG9ydAotICAgICAgICBib29sZWFuIHBvcnROYW1lVmFsaWQgPSBmYWxzZTsKLSAgICAgICAgaW50IGV4cGVjdGVkTnVtYmVyT2ZQb3J0cyA9IDE7ICAKLSAgICAgICAgaW50IG51bWJlck9mUG9ydHMgPSAwOwotICAgICAgICAKLSAgICAgICAgSXRlcmF0b3I8UU5hbWU+IHBvcnRJdGVyYXRvciA9IHNlcnZpY2UuZ2V0UG9ydHMoKTsKLSAgICAgICAgd2hpbGUgKHBvcnRJdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIG51bWJlck9mUG9ydHMrKzsKLSAgICAgICAgICAgIFFOYW1lIGNoZWNrUG9ydCA9IHBvcnRJdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICAvLyBJZiB3ZSBoYXZlbid0IGZvdW5kIGEgbWF0Y2ggZm9yIHRoZSBwb3J0IHlldCwgc2VlIGlmIHRoaXMgb25lIG1hdGNoZXMKLSAgICAgICAgICAgIGlmICghcG9ydE5hbWVWYWxpZCkgewotICAgICAgICAgICAgICAgIHBvcnROYW1lVmFsaWQgPSBwb3J0TG9jYWxQYXJ0LmVxdWFscyhjaGVja1BvcnQuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChwb3J0TG9jYWxQYXJ0ID09IG51bGwgJiYgbnVtYmVyT2ZQb3J0cyA9PSAwKSB7Ci0gICAgICAgICAgICAvLyBObyBwb3J0cyBleHBlY3RlZCAoaS5lLiBubyBXU0RMIHNob3VsZCBoYXZlIGJlZW4gdXNlZCkKLSAgICAgICAgICAgIGlzVmFsaWQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKChleHBlY3RlZE51bWJlck9mUG9ydHMgPT0gbnVtYmVyT2ZQb3J0cykgJiYgcG9ydE5hbWVWYWxpZCkgewotICAgICAgICAgICAgaXNWYWxpZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBpc1ZhbGlkID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlzVmFsaWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWV0aG9kcyB0byBpbnN0YWxsIGEgY2xpZW50IGNvbmZpZ3VyYXRpb24gZmFjdG9yeSB0aGF0IHdpbGwgcmV0dXJuIHRoZSBzYW1lIEF4aXNDb25maWd1cmF0aW9uCi0gICAgICogZWFjaCB0aW1lLiAgVGhpcyBpcyB1c2VkIHNvIHRoYXQgdGhlIFNlcnZpY2VEZXNjcmlwdGlvbnMgd2lsbCBiZSBjYWNoZWQgaW4gdGhlIERlc2NyaXB0aW9uRmFjdG9yeS4KLSAgICAgKiAKLSAgICAgKiBJTVBPUlRBTlQhISEKLSAgICAgKiBJZiB5b3UgaW5zdGFsbCBhIGNhY2hpbmcgZmFjdG9yeSwgeW91IE1VU1QgcmVzdG9yZSB0aGUgb3JpZ2luYWwgZmFjdG9yeSBiZWZvcmUgeW91ciB0ZXN0Ci0gICAgICogZXhpdHMsIG90aGVyd2lzZSBpdCB3aWxsIHJlbWFpbiBpbnN0YWxsZWQgd2hlbiBzdWJzZXF1ZW50IHRlc3RzIHJ1biBhbmQgY2F1c2UgUkVBTExZIFNUUkFOR0UKLSAgICAgKiBmYWlsdXJlcy4gIFVzZSByZXN0b3JlT3JpZ2luYWxGYWN0b3J5KCkgSU5TSURFIEEgZmluYWxseSgpIGJsb2NrIHRvIHJlc3RvcmUgdGhlIGZhY3RvcnkuCi0gICAgICovCi0gICAgc3RhdGljIHByaXZhdGUgQ2xpZW50Q29uZmlndXJhdGlvbkZhY3Rvcnkgb3JpZ2luYWxGYWN0b3J5ID0gbnVsbDsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgaW5zdGFsbENhY2hpbmdGYWN0b3J5KCkgewotICAgICAgICAvLyBpbnN0YWxsIGNhY2hpbmcgZmFjdG9yeQotICAgICAgICBpZiAob3JpZ2luYWxGYWN0b3J5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiQXR0ZW1wdCB0byBpbnN0YWxsIHRoZSBjYWNoaW5nIGZhY3Rvcnkgd2hlbiB0aGUgb3JpZ2luYWwgZmFjdG9yeSBoYXMgYWxyZWFkeSBiZWVuIG92ZXJ3cml0dGVuIik7Ci0gICAgICAgIH0KLSAgICAgICAgb3JpZ2luYWxGYWN0b3J5ID0gCi0gICAgICAgICAgICAoQ2xpZW50Q29uZmlndXJhdGlvbkZhY3RvcnkpTWV0YWRhdGFGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShDbGllbnRDb25maWd1cmF0aW9uRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgIE1ldGFkYXRhVGVzdENhY2hpbmdDbGllbnRDb250ZXh0RmFjdG9yeSBuZXdGYWN0b3J5ID0gbmV3IE1ldGFkYXRhVGVzdENhY2hpbmdDbGllbnRDb250ZXh0RmFjdG9yeSgpOwotICAgICAgICBNZXRhZGF0YUZhY3RvcnlSZWdpc3RyeS5zZXRGYWN0b3J5KENsaWVudENvbmZpZ3VyYXRpb25GYWN0b3J5LmNsYXNzLCBuZXdGYWN0b3J5KTsKLSAgICAgICAgcmVzZXRDbGllbnRDb25maWdGYWN0b3J5KCk7Ci0gICAgfQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZXN0b3JlT3JpZ2luYWxGYWN0b3J5KCkgewotICAgICAgICBpZiAob3JpZ2luYWxGYWN0b3J5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiQXR0ZW1wdCB0byByZXN0b3JlIG9yaWdpbmFsIGZhY3RvcnkgdG8gYSBudWxsIHZhbHVlIik7Ci0gICAgICAgIH0KLSAgICAgICAgTWV0YWRhdGFGYWN0b3J5UmVnaXN0cnkuc2V0RmFjdG9yeShDbGllbnRDb25maWd1cmF0aW9uRmFjdG9yeS5jbGFzcywgb3JpZ2luYWxGYWN0b3J5KTsKLSAgICAgICAgcmVzZXRDbGllbnRDb25maWdGYWN0b3J5KCk7Ci0gICAgICAgIG9yaWdpbmFsRmFjdG9yeSA9IG51bGw7Ci0gICAgfQotICAgIHN0YXRpYyB2b2lkIHJlc2V0Q2xpZW50Q29uZmlnRmFjdG9yeSgpIHsKLS8vICAgICAgICBGaWVsZCBmaWVsZDsKLS8vICAgICAgICB0cnkgewotLy8gICAgICAgICAgICBmaWVsZCA9IERlc2NyaXB0aW9uRmFjdG9yeUltcGwuY2xhc3MuZ2V0RGVjbGFyZWRGaWVsZCgiY2xpZW50Q29uZmlnRmFjdG9yeSIpOwotLy8gICAgICAgICAgICBmaWVsZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwotLy8gICAgICAgICAgICBmaWVsZC5zZXQobnVsbCwgbnVsbCk7Ci0vLyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLS8vICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJVbmFibGUgdG8gcmVzZXQgY2xpZW50IGNvbmZpZyBmYWN0b3J5OyBjYXVnaHQgIiArIGUpOwotLy8gICAgICAgIH0KLSAgICB9Ci0gICAgCi19Ci0KLUBXZWJTZXJ2aWNlQ2xpZW50KHRhcmdldE5hbWVzcGFjZT0ib3JpZ2luYWxUTlMiLCB3c2RsTG9jYXRpb249Q2xpZW50TWV0YWRhdGFUZXN0Lm9yaWdpbmFsV3NkbCkKLWNsYXNzIENsaWVudE1ldGFkYXRhR2VuZXJhdGVkU2VydmljZSBleHRlbmRzIGphdmF4LnhtbC53cy5TZXJ2aWNlIHsKLSAgICBwdWJsaWMgQ2xpZW50TWV0YWRhdGFHZW5lcmF0ZWRTZXJ2aWNlKCkgewotICAgICAgICBzdXBlcihDbGllbnRNZXRhZGF0YVRlc3QuZ2V0V3NkbFVSTChDbGllbnRNZXRhZGF0YVRlc3Qub3JpZ2luYWxXc2RsKSwKLSAgICAgICAgICAgICAgbmV3IFFOYW1lKENsaWVudE1ldGFkYXRhVGVzdC5uYW1lc3BhY2VVUkksIENsaWVudE1ldGFkYXRhVGVzdC5zdmNMb2NhbFBhcnQpKTsKLSAgICB9Ci0gICAgcHVibGljIENsaWVudE1ldGFkYXRhR2VuZXJhdGVkU2VydmljZShVUkwgd3NkbExvY2F0aW9uLCBRTmFtZSBzZXJ2aWNlTmFtZSkgewotICAgICAgICBzdXBlcih3c2RsTG9jYXRpb24sIHNlcnZpY2VOYW1lKTsKLSAgICB9Ci19Ci0KLQotY2xhc3MgTWV0YWRhdGFUZXN0Q2FjaGluZ0NsaWVudENvbnRleHRGYWN0b3J5IGV4dGVuZHMgQ2xpZW50Q29uZmlndXJhdGlvbkZhY3RvcnkgewotICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbnRleHQ7Ci0gICAgCi0gICAgcHVibGljIENvbmZpZ3VyYXRpb25Db250ZXh0IGdldENsaWVudENvbmZpZ3VyYXRpb25Db250ZXh0KCkgewotICAgICAgICBpZiAoY29udGV4dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBjb250ZXh0ID0gc3VwZXIuZ2V0Q2xpZW50Q29uZmlndXJhdGlvbkNvbnRleHQoKTsKLSAgICAgICAgfQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRlc3QgdmVyc2lvbiBvZiBNZXRhZGF0YVRlc3RDYWNoaW5nQ2xpZW50Q29udGV4dEZhY3Rvcnk6ICIgKyBjb250ZXh0KTsKLSAgICAgICAgcmV0dXJuIGNvbnRleHQ7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgewotICAgICAgICBjb250ZXh0ID0gbnVsbDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc3BpL1NhbXBsZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NwaS9TYW1wbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjMwYjg4YS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc3BpL1NhbXBsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNwaTsKLQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOwotCi1AV2ViU2VydmljZSh0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZXN0IiwKLSAgICAgICAgICAgIHNlcnZpY2VOYW1lPSJUZXN0U2VydmljZSIsCi0gICAgICAgICAgICBwb3J0TmFtZT0iVGVzdFBvcnQiKQotcHVibGljIGludGVyZmFjZSBTYW1wbGUgewotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZWNob1N0cmluZyhTdHJpbmcgaW5wdXQpOwotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc3BpL2hhbmRsZXIvRHVtbXlMb2dpY2FsSGFuZGxlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NwaS9oYW5kbGVyL0R1bW15TG9naWNhbEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGEzY2Q5Ni4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc3BpL2hhbmRsZXIvRHVtbXlMb2dpY2FsSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zcGkuaGFuZGxlcjsNCi0NCi1pbXBvcnQgamF2YXguYW5ub3RhdGlvbi5Qb3N0Q29uc3RydWN0Ow0KLWltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5Mb2dpY2FsSGFuZGxlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuTG9naWNhbE1lc3NhZ2VDb250ZXh0Ow0KLWltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5NZXNzYWdlQ29udGV4dDsNCi0NCi1wdWJsaWMgY2xhc3MgRHVtbXlMb2dpY2FsSGFuZGxlciBpbXBsZW1lbnRzIExvZ2ljYWxIYW5kbGVyPExvZ2ljYWxNZXNzYWdlQ29udGV4dD4gew0KLSAgICANCi0gICAgQFBvc3RDb25zdHJ1Y3QNCi0gICAgcHVibGljIHZvaWQgc2V0dXAoKSB7DQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkBQb3N0Q29uc3RydWN0IG1ldGhvZCBpbnZva2VkLiIpOw0KLSAgICB9DQotDQotCXB1YmxpYyBib29sZWFuIGhhbmRsZU1lc3NhZ2UoTG9naWNhbE1lc3NhZ2VDb250ZXh0IGNvbnRleHQpIHsNCi0JCXJldHVybiB0cnVlOw0KLQl9DQotDQotCXB1YmxpYyBib29sZWFuIGhhbmRsZUZhdWx0KExvZ2ljYWxNZXNzYWdlQ29udGV4dCBtZXNzYWdlY29udGV4dCkgew0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIGNsb3NlKE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2Vjb250ZXh0KXsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc3BpL2hhbmRsZXIvRHVtbXlTT0FQSGFuZGxlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NwaS9oYW5kbGVyL0R1bW15U09BUEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGZhMDVhYi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc3BpL2hhbmRsZXIvRHVtbXlTT0FQSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zcGkuaGFuZGxlcjsNCi0NCi1pbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuTWVzc2FnZUNvbnRleHQ7DQotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLnNvYXAuU09BUEhhbmRsZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLnNvYXAuU09BUE1lc3NhZ2VDb250ZXh0Ow0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLQ0KLXB1YmxpYyBjbGFzcyBEdW1teVNPQVBIYW5kbGVyIGltcGxlbWVudHMgU09BUEhhbmRsZXI8U09BUE1lc3NhZ2VDb250ZXh0PiB7DQotDQotCXB1YmxpYyBTZXQgZ2V0SGVhZGVycygpIHsNCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCXB1YmxpYyBib29sZWFuIGhhbmRsZU1lc3NhZ2UoU09BUE1lc3NhZ2VDb250ZXh0IGNvbnRleHQpIHsNCi0JCXJldHVybiB0cnVlOw0KLQl9DQotDQotCXB1YmxpYyBib29sZWFuIGhhbmRsZUZhdWx0KFNPQVBNZXNzYWdlQ29udGV4dCBtZXNzYWdlY29udGV4dCkgew0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIGNsb3NlKE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2Vjb250ZXh0KXsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc3BpL2hhbmRsZXIvSGFuZGxlclJlc29sdmVyVGVzdHMuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zcGkvaGFuZGxlci9IYW5kbGVyUmVzb2x2ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmViNGFmLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zcGkvaGFuZGxlci9IYW5kbGVyUmVzb2x2ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zcGkuaGFuZGxlcjsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOw0KLQ0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOw0KLWltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5IYW5kbGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5IYW5kbGVyUmVzb2x2ZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLlBvcnRJbmZvOw0KLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5TT0FQQmluZGluZzsNCi1pbXBvcnQgamF2YS5pby5GaWxlOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi1wdWJsaWMgY2xhc3MgSGFuZGxlclJlc29sdmVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7DQotICAgIHByaXZhdGUgU3RyaW5nIHRlc3RSZXNvdXJjZURpciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiYmFzZWRpciIsICIuIikgKyAiLyIgKyAidGVzdC1yZXNvdXJjZXMiOw0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SGFuZGxlclJlc29sdmVyKCkgew0KLSAgICAgICAgU3RyaW5nIHBhdGggPSAiL2NvbmZpZ3VyYXRpb24vaGFuZGxlcnMvaGFuZGxlci54bWwiOw0KLSAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUodGVzdFJlc291cmNlRGlyLCBwYXRoKTsNCi0gICAgICAgIEhhbmRsZXJSZXNvbHZlciByZXNvbHZlciA9IG5ldyBIYW5kbGVyUmVzb2x2ZXJJbXBsKGZpbGUpOw0KLSAgICAgICAgUG9ydEluZm8gcGkgPSBuZXcgRHVtbXlQb3J0SW5mbygpOw0KLSAgICAgICAgTGlzdDxIYW5kbGVyPiBsaXN0ID0gcmVzb2x2ZXIuZ2V0SGFuZGxlckNoYWluKHBpKTsNCi0gICAgICAgIGFzc2VydEVxdWFscygyLCBsaXN0LnNpemUoKSk7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyBjbGFzcyBEdW1teVBvcnRJbmZvIGltcGxlbWVudHMgUG9ydEluZm8gew0KLQ0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRCaW5kaW5nSUQoKSB7DQotICAgICAgICAgICAgcmV0dXJuIFNPQVBCaW5kaW5nLlNPQVAxMUhUVFBfQklORElORzsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyBRTmFtZSBnZXRQb3J0TmFtZSgpIHsNCi0gICAgICAgICAgICByZXR1cm4gbmV3IFFOYW1lKCJodHRwOi8vd3d3LmFwYWNoZS5vcmcvdGVzdC9uYW1lc3BhY2UiLCAiRHVtbXlQb3J0Iik7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgUU5hbWUgZ2V0U2VydmljZU5hbWUoKSB7DQotICAgICAgICAgICAgcmV0dXJuIG5ldyBRTmFtZSgiaHR0cDovL3d3dy5hcGFjaGUub3JnL3Rlc3QvbmFtZXNwYWNlIiwgIkR1bW15U2VydmljZSIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy91bml0VGVzdC9UZXN0TG9nZ2VyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvdW5pdFRlc3QvVGVzdExvZ2dlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjY0ZDJkLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy91bml0VGVzdC9UZXN0TG9nZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MudW5pdFRlc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotcHVibGljIGNsYXNzIFRlc3RMb2dnZXIgewotICAgIC8vIEp1c3QgYSBwbGFjZWhvbGRlciBmb3IgdGhpcyBzaGFyZWQgbG9nZ2VyIG9iamVjdAotICAgIHB1YmxpYyBzdGF0aWMgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKCJKQVhXUy1UZXN0cyIpOwotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3VuaXRUZXN0L2VjaG8vRWNoby5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3VuaXRUZXN0L2VjaG8vRWNoby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWJmNDE4Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy91bml0VGVzdC9lY2hvL0VjaG8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLQ0KLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MudW5pdFRlc3QuZWNobzsNCi0NCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOw0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZTsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50Ow0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGU7DQotDQotDQotLyoqDQotICogPHA+SmF2YSBjbGFzcyBmb3IgZWNobyBjb21wbGV4IHR5cGUuDQotICogDQotICogPHA+VGhlIGZvbGxvd2luZyBzY2hlbWEgZnJhZ21lbnQgc3BlY2lmaWVzIHRoZSBleHBlY3RlZCBjb250ZW50IGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBjbGFzcy4NCi0gKiANCi0gKiA8cHJlPg0KLSAqICZsdDtjb21wbGV4VHlwZSBuYW1lPSJlY2hvIj4NCi0gKiAgICZsdDtjb21wbGV4Q29udGVudD4NCi0gKiAgICAgJmx0O3Jlc3RyaWN0aW9uIGJhc2U9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1hbnlUeXBlIj4NCi0gKiAgICAgICAmbHQ7c2VxdWVuY2U+DQotICogICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJ0ZXh0IiB0eXBlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9c3RyaW5nIi8+DQotICogICAgICAgJmx0Oy9zZXF1ZW5jZT4NCi0gKiAgICAgJmx0Oy9yZXN0cmljdGlvbj4NCi0gKiAgICZsdDsvY29tcGxleENvbnRlbnQ+DQotICogJmx0Oy9jb21wbGV4VHlwZT4NCi0gKiA8L3ByZT4NCi0gKiANCi0gKiANCi0gKi8NCi1AWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpDQotQFhtbFR5cGUobmFtZSA9ICJlY2hvIiwgcHJvcE9yZGVyID0gew0KLSAgICAidGV4dCINCi19KQ0KLXB1YmxpYyBjbGFzcyBFY2hvIHsNCi0NCi0gICAgQFhtbEVsZW1lbnQocmVxdWlyZWQgPSB0cnVlLCBuaWxsYWJsZSA9IHRydWUpDQotICAgIHByb3RlY3RlZCBTdHJpbmcgdGV4dDsNCi0NCi0gICAgLyoqDQotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSB0ZXh0IHByb3BlcnR5Lg0KLSAgICAgKiANCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcG9zc2libGUgb2JqZWN0IGlzDQotICAgICAqICAgICB7QGxpbmsgU3RyaW5nIH0NCi0gICAgICogICAgIA0KLSAgICAgKi8NCi0gICAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkgew0KLSAgICAgICAgcmV0dXJuIHRleHQ7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSB0ZXh0IHByb3BlcnR5Lg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIHZhbHVlDQotICAgICAqICAgICBhbGxvd2VkIG9iamVjdCBpcw0KLSAgICAgKiAgICAge0BsaW5rIFN0cmluZyB9DQotICAgICAqICAgICANCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIHZhbHVlKSB7DQotICAgICAgICB0aGlzLnRleHQgPSB2YWx1ZTsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvdW5pdFRlc3QvZWNoby9FY2hvUG9ydC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3VuaXRUZXN0L2VjaG8vRWNob1BvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRkN2EyMS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvdW5pdFRlc3QvZWNoby9FY2hvUG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotDQotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51bml0VGVzdC5lY2hvOw0KLQ0KLWltcG9ydCBqYXZheC5qd3MuV2ViTWV0aG9kOw0KLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW07DQotaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbS5Nb2RlOw0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLkhvbGRlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLlJlcXVlc3RXcmFwcGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuUmVzcG9uc2VXcmFwcGVyOw0KLQ0KLQ0KLS8qKg0KLSAqIFRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBieSB0aGUgSkFYV1MgU0kuDQotICogSkFYLVdTIFJJIDIuMC1iMjYtZWEzDQotICogR2VuZXJhdGVkIHNvdXJjZSB2ZXJzaW9uOiAyLjANCi0gKiANCi0gKi8NCi1AV2ViU2VydmljZShuYW1lID0gIkVjaG9Qb3J0IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL3Rlc3RzIiwgd3NkbExvY2F0aW9uID0gIlxcd29ya1xcYXBwc1xcZWNsaXBzZVxcd29ya3NwYWNlXFxheGlzMi1saXZlXFxtb2R1bGVzXFxqYXh3c1xcdGVzdC1yZXNvdXJjZXNcXHdzZGxcXFdTRExUZXN0cy53c2RsIikNCi1wdWJsaWMgaW50ZXJmYWNlIEVjaG9Qb3J0IHsNCi0NCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gdGV4dA0KLSAgICAgKi8NCi0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lID0gIkVjaG8iLCBhY3Rpb24gPSAiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvdGVzdHMvZWNobyIpDQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAiRWNobyIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi90ZXN0cyIsIGNsYXNzTmFtZSA9ICJvcmcuYXBhY2hlLndzLmF4aXMyLnRlc3RzLkVjaG8iKQ0KLSAgICBAUmVzcG9uc2VXcmFwcGVyKGxvY2FsTmFtZSA9ICJFY2hvUmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvdGVzdHMiLCBjbGFzc05hbWUgPSAib3JnLmFwYWNoZS53cy5heGlzMi50ZXN0cy5FY2hvUmVzcG9uc2UiKQ0KLSAgICBwdWJsaWMgdm9pZCBlY2hvKA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAidGV4dCIsIHRhcmdldE5hbWVzcGFjZSA9ICIiLCBtb2RlID0gTW9kZS5JTk9VVCkNCi0gICAgICAgIEhvbGRlcjxTdHJpbmc+IHRleHQpOw0KLQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvdW5pdFRlc3QvZWNoby9FY2hvUmVzcG9uc2UuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy91bml0VGVzdC9lY2hvL0VjaG9SZXNwb25zZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTgyZmRkLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy91bml0VGVzdC9lY2hvL0VjaG9SZXNwb25zZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotDQotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51bml0VGVzdC5lY2hvOw0KLQ0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7DQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOw0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnQ7DQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZTsNCi0NCi0NCi0vKioNCi0gKiA8cD5KYXZhIGNsYXNzIGZvciBlY2hvUmVzcG9uc2UgY29tcGxleCB0eXBlLg0KLSAqIA0KLSAqIDxwPlRoZSBmb2xsb3dpbmcgc2NoZW1hIGZyYWdtZW50IHNwZWNpZmllcyB0aGUgZXhwZWN0ZWQgY29udGVudCBjb250YWluZWQgd2l0aGluIHRoaXMgY2xhc3MuDQotICogDQotICogPHByZT4NCi0gKiAmbHQ7Y29tcGxleFR5cGUgbmFtZT0iZWNob1Jlc3BvbnNlIj4NCi0gKiAgICZsdDtjb21wbGV4Q29udGVudD4NCi0gKiAgICAgJmx0O3Jlc3RyaWN0aW9uIGJhc2U9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1hbnlUeXBlIj4NCi0gKiAgICAgICAmbHQ7c2VxdWVuY2U+DQotICogICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJ0ZXh0IiB0eXBlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9c3RyaW5nIi8+DQotICogICAgICAgJmx0Oy9zZXF1ZW5jZT4NCi0gKiAgICAgJmx0Oy9yZXN0cmljdGlvbj4NCi0gKiAgICZsdDsvY29tcGxleENvbnRlbnQ+DQotICogJmx0Oy9jb21wbGV4VHlwZT4NCi0gKiA8L3ByZT4NCi0gKiANCi0gKiANCi0gKi8NCi1AWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpDQotQFhtbFR5cGUobmFtZSA9ICJlY2hvUmVzcG9uc2UiLCBwcm9wT3JkZXIgPSB7DQotICAgICJ0ZXh0Ig0KLX0pDQotcHVibGljIGNsYXNzIEVjaG9SZXNwb25zZSB7DQotDQotICAgIEBYbWxFbGVtZW50KHJlcXVpcmVkID0gdHJ1ZSwgbmlsbGFibGUgPSB0cnVlKQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHRleHQ7DQotDQotICAgIC8qKg0KLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgdGV4dCBwcm9wZXJ0eS4NCi0gICAgICogDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHBvc3NpYmxlIG9iamVjdCBpcw0KLSAgICAgKiAgICAge0BsaW5rIFN0cmluZyB9DQotICAgICAqICAgICANCi0gICAgICovDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsNCi0gICAgICAgIHJldHVybiB0ZXh0Ow0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgdGV4dCBwcm9wZXJ0eS4NCi0gICAgICogDQotICAgICAqIEBwYXJhbSB2YWx1ZQ0KLSAgICAgKiAgICAgYWxsb3dlZCBvYmplY3QgaXMNCi0gICAgICogICAgIHtAbGluayBTdHJpbmcgfQ0KLSAgICAgKiAgICAgDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBzZXRUZXh0KFN0cmluZyB2YWx1ZSkgew0KLSAgICAgICAgdGhpcy50ZXh0ID0gdmFsdWU7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3VuaXRUZXN0L2VjaG8vRWNob1NlcnZpY2UuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy91bml0VGVzdC9lY2hvL0VjaG9TZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkMjlmODIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3VuaXRUZXN0L2VjaG8vRWNob1NlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLQ0KLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MudW5pdFRlc3QuZWNobzsNCi0NCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJFbmRwb2ludDsNCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VDbGllbnQ7DQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLQ0KLS8qKg0KLSAqIFRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBieSB0aGUgSkFYV1MgU0kuDQotICogSkFYLVdTIFJJIDIuMC1iMjYtZWEzDQotICogR2VuZXJhdGVkIHNvdXJjZSB2ZXJzaW9uOiAyLjANCi0gKiANCi0gKi8NCi1AV2ViU2VydmljZUNsaWVudChuYW1lID0gIkVjaG9TZXJ2aWNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL3Rlc3RzIiwgd3NkbExvY2F0aW9uID0gIlxcd29ya1xcYXBwc1xcZWNsaXBzZVxcd29ya3NwYWNlXFxheGlzMi1saXZlXFxtb2R1bGVzXFxqYXh3c1xcdGVzdC1yZXNvdXJjZXNcXHdzZGxcXFdTRExUZXN0cy53c2RsIikNCi1wdWJsaWMgY2xhc3MgRWNob1NlcnZpY2UNCi0gICAgZXh0ZW5kcyBTZXJ2aWNlDQotew0KLQ0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBVUkwgV1NETF9MT0NBVElPTjsNCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgUU5hbWUgRUNIT1NFUlZJQ0UgPSBuZXcgUU5hbWUoImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL3Rlc3RzIiwgIkVjaG9TZXJ2aWNlIik7DQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFFOYW1lIEVDSE9QT1JUID0gbmV3IFFOYW1lKCJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi90ZXN0cyIsICJFY2hvUG9ydCIpOw0KLQ0KLSAgICBzdGF0aWMgew0KLSAgICAgICAgVVJMIHVybCA9IG51bGw7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIHVybCA9IG5ldyBVUkwoImZpbGU6L0M6L3dvcmsvYXBwcy9lY2xpcHNlL3dvcmtzcGFjZS9heGlzMi1saXZlL21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMvd3NkbC9XU0RMVGVzdHMud3NkbCIpOw0KLSAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgV1NETF9MT0NBVElPTiA9IHVybDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgRWNob1NlcnZpY2UoVVJMIHdzZGxMb2NhdGlvbiwgUU5hbWUgc2VydmljZU5hbWUpIHsNCi0gICAgICAgIHN1cGVyKHdzZGxMb2NhdGlvbiwgc2VydmljZU5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBFY2hvU2VydmljZSgpIHsNCi0gICAgICAgIHN1cGVyKFdTRExfTE9DQVRJT04sIEVDSE9TRVJWSUNFKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgRWNob1BvcnQNCi0gICAgICovDQotICAgIEBXZWJFbmRwb2ludChuYW1lID0gIkVjaG9Qb3J0IikNCi0gICAgcHVibGljIEVjaG9Qb3J0IGdldEVjaG9Qb3J0KCkgew0KLSAgICAgICAgcmV0dXJuIChFY2hvUG9ydClzdXBlci5nZXRQb3J0KEVDSE9QT1JULCBFY2hvUG9ydC5jbGFzcyk7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3VuaXRUZXN0L2VjaG8vRWNob1NlcnZpY2VJbXBsV2l0aFNFSS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3VuaXRUZXN0L2VjaG8vRWNob1NlcnZpY2VJbXBsV2l0aFNFSS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzZlMGZmLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy91bml0VGVzdC9lY2hvL0VjaG9TZXJ2aWNlSW1wbFdpdGhTRUkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MudW5pdFRlc3QuZWNobzsNCi0NCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5Ib2xkZXI7DQotDQotLyoqDQotICogDQotICovDQotQFdlYlNlcnZpY2Uoc2VydmljZU5hbWUgPSAiRWNob1NlcnZpY2UiLCBlbmRwb2ludEludGVyZmFjZT0icmcuYXBhY2hlLmF4aXMyLmpheHdzLnVuaXRUZXN0LmVjaG8uRWNob1BvcnQiKQ0KLXB1YmxpYyBjbGFzcyBFY2hvU2VydmljZUltcGxXaXRoU0VJIHsNCi0gICAgLy8gVE9ETzogVGVzdCBhbGwgY29uZGl0aW9ucyBpbiBKU1ItMTgxIHNwZWMgU2VjIDMuMSBwMTMNCi0gICAgcHVibGljIHZvaWQgZWNobyhIb2xkZXI8U3RyaW5nPiB0ZXh0KSB7DQotICAgICAgICB0ZXh0LnZhbHVlID0gIkVjaG8gIiArIHRleHQudmFsdWU7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3VuaXRUZXN0L2VjaG8vT2JqZWN0RmFjdG9yeS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3VuaXRUZXN0L2VjaG8vT2JqZWN0RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjc1MWRkLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy91bml0VGVzdC9lY2hvL09iamVjdEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLQ0KLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MudW5pdFRlc3QuZWNobzsNCi0NCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkVsZW1lbnQ7DQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudERlY2w7DQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUmVnaXN0cnk7DQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotDQotDQotLyoqDQotICogVGhpcyBvYmplY3QgY29udGFpbnMgZmFjdG9yeSBtZXRob2RzIGZvciBlYWNoIA0KLSAqIEphdmEgY29udGVudCBpbnRlcmZhY2UgYW5kIEphdmEgZWxlbWVudCBpbnRlcmZhY2UgDQotICogZ2VuZXJhdGVkIGluIHRoZSBvcmcuYXBhY2hlLndzLmF4aXMyLnRlc3RzIHBhY2thZ2UuIA0KLSAqIDxwPkFuIE9iamVjdEZhY3RvcnkgYWxsb3dzIHlvdSB0byBwcm9ncmFtYXRpY2FsbHkgDQotICogY29uc3RydWN0IG5ldyBpbnN0YW5jZXMgb2YgdGhlIEphdmEgcmVwcmVzZW50YXRpb24gDQotICogZm9yIFhNTCBjb250ZW50LiBUaGUgSmF2YSByZXByZXNlbnRhdGlvbiBvZiBYTUwgDQotICogY29udGVudCBjYW4gY29uc2lzdCBvZiBzY2hlbWEgZGVyaXZlZCBpbnRlcmZhY2VzIA0KLSAqIGFuZCBjbGFzc2VzIHJlcHJlc2VudGluZyB0aGUgYmluZGluZyBvZiBzY2hlbWEgDQotICogdHlwZSBkZWZpbml0aW9ucywgZWxlbWVudCBkZWNsYXJhdGlvbnMgYW5kIG1vZGVsIA0KLSAqIGdyb3Vwcy4gIEZhY3RvcnkgbWV0aG9kcyBmb3IgZWFjaCBvZiB0aGVzZSBhcmUgDQotICogcHJvdmlkZWQgaW4gdGhpcyBjbGFzcy4NCi0gKiANCi0gKi8NCi1AWG1sUmVnaXN0cnkNCi1wdWJsaWMgY2xhc3MgT2JqZWN0RmFjdG9yeSB7DQotDQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFFOYW1lIF9FY2hvUmVzcG9uc2VfUU5BTUUgPSBuZXcgUU5hbWUoImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL3Rlc3RzIiwgIkVjaG9SZXNwb25zZSIpOw0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBRTmFtZSBfRWNob19RTkFNRSA9IG5ldyBRTmFtZSgiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvdGVzdHMiLCAiRWNobyIpOw0KLQ0KLSAgICAvKioNCi0gICAgICogQ3JlYXRlIGEgbmV3IE9iamVjdEZhY3RvcnkgdGhhdCBjYW4gYmUgdXNlZCB0byBjcmVhdGUgbmV3IGluc3RhbmNlcyBvZiBzY2hlbWEgZGVyaXZlZCBjbGFzc2VzIGZvciBwYWNrYWdlOiBvcmcuYXBhY2hlLndzLmF4aXMyLnRlc3RzDQotICAgICAqIA0KLSAgICAgKi8NCi0gICAgcHVibGljIE9iamVjdEZhY3RvcnkoKSB7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgRWNob1Jlc3BvbnNlIH0NCi0gICAgICogDQotICAgICAqLw0KLSAgICBwdWJsaWMgRWNob1Jlc3BvbnNlIGNyZWF0ZUVjaG9SZXNwb25zZSgpIHsNCi0gICAgICAgIHJldHVybiBuZXcgRWNob1Jlc3BvbnNlKCk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgRWNobyB9DQotICAgICAqIA0KLSAgICAgKi8NCi0gICAgcHVibGljIEVjaG8gY3JlYXRlRWNobygpIHsNCi0gICAgICAgIHJldHVybiBuZXcgRWNobygpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEpBWEJFbGVtZW50IH17QGNvZGUgPH17QGxpbmsgRWNob1Jlc3BvbnNlIH17QGNvZGUgPn19DQotICAgICAqIA0KLSAgICAgKi8NCi0gICAgQFhtbEVsZW1lbnREZWNsKG5hbWVzcGFjZSA9ICJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi90ZXN0cyIsIG5hbWUgPSAiRWNob1Jlc3BvbnNlIikNCi0gICAgcHVibGljIEpBWEJFbGVtZW50PEVjaG9SZXNwb25zZT4gY3JlYXRlRWNob1Jlc3BvbnNlKEVjaG9SZXNwb25zZSB2YWx1ZSkgew0KLSAgICAgICAgcmV0dXJuIG5ldyBKQVhCRWxlbWVudDxFY2hvUmVzcG9uc2U+KF9FY2hvUmVzcG9uc2VfUU5BTUUsIEVjaG9SZXNwb25zZS5jbGFzcywgbnVsbCwgdmFsdWUpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEpBWEJFbGVtZW50IH17QGNvZGUgPH17QGxpbmsgRWNobyB9e0Bjb2RlID59fQ0KLSAgICAgKiANCi0gICAgICovDQotICAgIEBYbWxFbGVtZW50RGVjbChuYW1lc3BhY2UgPSAiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvdGVzdHMiLCBuYW1lID0gIkVjaG8iKQ0KLSAgICBwdWJsaWMgSkFYQkVsZW1lbnQ8RWNobz4gY3JlYXRlRWNobyhFY2hvIHZhbHVlKSB7DQotICAgICAgICByZXR1cm4gbmV3IEpBWEJFbGVtZW50PEVjaG8+KF9FY2hvX1FOQU1FLCBFY2hvLmNsYXNzLCBudWxsLCB2YWx1ZSk7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3VuaXRUZXN0L2VjaG8vcGFja2FnZS1pbmZvLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvdW5pdFRlc3QvZWNoby9wYWNrYWdlLWluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGEzYzJhYy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvdW5pdFRlc3QvZWNoby9wYWNrYWdlLWluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1AamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxTY2hlbWEobmFtZXNwYWNlID0gImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL3Rlc3RzIikNCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MudW5pdFRlc3QuZWNobzsNCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvdXRpbGl0eS9BdHRhY2htZW50VXRpbGl0eVRlc3RzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvdXRpbGl0eS9BdHRhY2htZW50VXRpbGl0eVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2NTJmNjMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3V0aWxpdHkvQXR0YWNobWVudFV0aWxpdHlUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51dGlsaXR5Ow0KLQ0KLWltcG9ydCBqYXZhLmF3dC5JbWFnZTsNCi1pbXBvcnQgamF2YS5pby5GaWxlOw0KLQ0KLWltcG9ydCBqYXZheC5pbWFnZWlvLkltYWdlSU87DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCi0NCi1wdWJsaWMgY2xhc3MgQXR0YWNobWVudFV0aWxpdHlUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsNCi0JcHVibGljIHZvaWQgdGVzdENvbXBhcmVEaWZmZXJlbnRJbWFnZXMoKXsNCi0JCXRyeXsNCi0JCQlTdHJpbmcgaW1nMVBhdGggPSAiL3Rlc3QtcmVzb3VyY2VzL2ltYWdlL2ltYWdlMS5qcGVnIjsNCi0JCQlTdHJpbmcgaW1nMlBhdGggPSAiL3Rlc3QtcmVzb3VyY2VzL2ltYWdlL2ltYWdlMi5qcGVnIjsNCi0JCQkNCi0JCQlTdHJpbmcgaW1nMUZpbGVQYXRoID0gZ2V0QWJzb2x1dGVMb2NhdGlvbigpK2ltZzFQYXRoOw0KLQkJCVN0cmluZyBpbWcyRmlsZVBhdGggPSBnZXRBYnNvbHV0ZUxvY2F0aW9uKCkraW1nMlBhdGg7DQotCQkJDQotCQkJRmlsZSBpbWcxRmlsZSA9IG5ldyBGaWxlKGltZzFGaWxlUGF0aCk7DQotCQkJRmlsZSBpbWcyRmlsZSA9IG5ldyBGaWxlKGltZzJGaWxlUGF0aCk7DQotCQkJSW1hZ2UgaW1nMT1JbWFnZUlPLnJlYWQoaW1nMUZpbGUpIDsNCi0JCQlJbWFnZSBpbWcyPSBJbWFnZUlPLnJlYWQoaW1nMkZpbGUpOw0KLQkJCWFzc2VydEZhbHNlKEF0dGFjaG1lbnRVdGlscy5jb21wYXJlSW1hZ2VzKGltZzEsIGltZzIpKTsNCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkltYWdlIENvbXBhcmVkIHN1Y2Nlc3NmdWxseSIpOw0KLQkJfWNhdGNoKEV4Y2VwdGlvbiBlKXsNCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkltYWdlIENvbXBhcmUgRmFpbGVkIik7DQotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsNCi0JCQlmYWlsKCk7DQotCQl9DQotCX0NCi0JcHVibGljIHZvaWQgdGVzdENvbXBhcmVTYW1lSW1hZ2VzKCl7DQotCQl0cnl7DQotCQkJU3RyaW5nIGltZzFQYXRoID0gIi90ZXN0LXJlc291cmNlcy9pbWFnZS9pbWFnZTEuanBlZyI7DQotCQkJU3RyaW5nIGltZzFGaWxlUGF0aCA9IGdldEFic29sdXRlTG9jYXRpb24oKStpbWcxUGF0aDsNCi0JCQkNCi0JCQlGaWxlIGltZzFGaWxlID0gbmV3IEZpbGUoaW1nMUZpbGVQYXRoKTsNCi0JCQlGaWxlIGltZzJGaWxlID0gbmV3IEZpbGUoaW1nMUZpbGVQYXRoKTsNCi0JCQkNCi0JCQlJbWFnZSBpbWcxPUltYWdlSU8ucmVhZChpbWcxRmlsZSkgOw0KLQkJCUltYWdlIGltZzI9IEltYWdlSU8ucmVhZChpbWcyRmlsZSk7DQotCQkJDQotCQkJYXNzZXJ0VHJ1ZShBdHRhY2htZW50VXRpbHMuY29tcGFyZUltYWdlcyhpbWcxLCBpbWcxKSk7DQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJJbWFnZSBDb21wYXJlZCBzdWNjZXNzZnVsbHkiKTsNCi0JCX1jYXRjaChFeGNlcHRpb24gZSl7DQotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsNCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkltYWdlIENvbXBhcmUgRmFpbGVkIik7DQotCQkJZmFpbCgpOw0KLQkJfQ0KLQl9DQotCXByaXZhdGUgU3RyaW5nIGdldEFic29sdXRlTG9jYXRpb24oKXsNCi0JCQ0KLQkJcmV0dXJuIG5ldyBGaWxlKCIiKS5nZXRBYnNvbHV0ZVBhdGgoKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvdXRpbGl0eS9JbnZva2VBY3Rpb24uamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy91dGlsaXR5L0ludm9rZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTdlODRkLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy91dGlsaXR5L0ludm9rZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51dGlsaXR5Ow0KLQ0KLWltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCRWxlbWVudDsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOw0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZTsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50UmVmOw0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGU7DQotDQotDQotLyoqDQotICogPHA+SmF2YSBjbGFzcyBmb3IgaW52b2tlQWN0aW9uIGNvbXBsZXggdHlwZS4NCi0gKiA8cC8+DQotICogPHA+VGhlIGZvbGxvd2luZyBzY2hlbWEgZnJhZ21lbnQgc3BlY2lmaWVzIHRoZSBleHBlY3RlZCBjb250ZW50IGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBjbGFzcy4NCi0gKiA8cC8+DQotICogPHByZT4NCi0gKiAmbHQ7Y29tcGxleFR5cGUgbmFtZT0iaW52b2tlQWN0aW9uIj4NCi0gKiAgICZsdDtjb21wbGV4Q29udGVudD4NCi0gKiAgICAgJmx0O3Jlc3RyaWN0aW9uIGJhc2U9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1hbnlUeXBlIj4NCi0gKiAgICAgICAmbHQ7c2VxdWVuY2U+DQotICogICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJhcmcwIiB0eXBlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9YmFzZTY0QmluYXJ5IiBtaW5PY2N1cnM9IjAiLz4NCi0gKiAgICAgICAmbHQ7L3NlcXVlbmNlPg0KLSAqICAgICAmbHQ7L3Jlc3RyaWN0aW9uPg0KLSAqICAgJmx0Oy9jb21wbGV4Q29udGVudD4NCi0gKiAmbHQ7L2NvbXBsZXhUeXBlPg0KLSAqIDwvcHJlPg0KLSAqLw0KLUBYbWxBY2Nlc3NvclR5cGUoWG1sQWNjZXNzVHlwZS5GSUVMRCkNCi1AWG1sVHlwZShuYW1lID0gImludm9rZUFjdGlvbiIsIG5hbWVzcGFjZSA9ICJodHRwOi8vdXRpbGl0eS5qYXh3cy5heGlzMi5hcGFjaGUub3JnLyIsIHByb3BPcmRlciA9IHsNCi0gICAgICAgICJhcmcwIg0KLSAgICAgICAgfSkNCi1wdWJsaWMgY2xhc3MgSW52b2tlQWN0aW9uIHsNCi0NCi0gICAgQFhtbEVsZW1lbnRSZWYobmFtZSA9ICJhcmcwIiwgdHlwZSA9IEpBWEJFbGVtZW50LmNsYXNzKQ0KLSAgICBwcm90ZWN0ZWQgSkFYQkVsZW1lbnQ8Ynl0ZVtdPiBhcmcwOw0KLQ0KLSAgICAvKioNCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGFyZzAgcHJvcGVydHkuDQotICAgICAqDQotICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzDQotICAgICAqICAgICAgICAge0BsaW5rIEpBWEJFbGVtZW50IH17QGNvZGUgPH17QGxpbmsgYnl0ZVtdfXtAY29kZSA+fQ0KLSAgICAgKi8NCi0gICAgcHVibGljIEpBWEJFbGVtZW50PGJ5dGVbXT4gZ2V0QXJnMCgpIHsNCi0gICAgICAgIHJldHVybiBhcmcwOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgYXJnMCBwcm9wZXJ0eS4NCi0gICAgICoNCi0gICAgICogQHBhcmFtIHZhbHVlIGFsbG93ZWQgb2JqZWN0IGlzDQotICAgICAqICAgICAgICAgICAgICB7QGxpbmsgSkFYQkVsZW1lbnQgfXtAY29kZSA8fXtAbGluayBieXRlW119e0Bjb2RlID59DQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBzZXRBcmcwKEpBWEJFbGVtZW50PGJ5dGVbXT4gdmFsdWUpIHsNCi0gICAgICAgIHRoaXMuYXJnMCA9ICgoSkFYQkVsZW1lbnQ8Ynl0ZVtdPikgdmFsdWUpOw0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy91dGlsaXR5L0phdmFVdGlsc1Rlc3RzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvdXRpbGl0eS9KYXZhVXRpbHNUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmQzNjBkLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy91dGlsaXR5L0phdmFVdGlsc1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogICAgICAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51dGlsaXR5OwotCi1pbXBvcnQgamF2YS5uZXQuVVJJOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi0vKioKLSAqIFRlc3QgdGhlIHV0aWxpdHkgbWV0aG9kcyBpbiB0aGUgSmF2YVV0aWxzIGNsYXNzCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhVXRpbHNUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUZXN0IHRoYXQgc3BhY2VzIGluIHRoZSBzdHJpbmcgY2FuIGJlIGhhbmRsZWQgY29ycmVjdGx5IHdoZW4gY29udmVydGluZyB0byBhIFVSSS4gCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZVVSSV9zcGFjZXMoKSB7Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgcGF0aFdpdGhTcGFjZXMgPSAiZmlsZTovRjovUHJvZ3JhbSBGaWxlcy9NeUFwcFNlcnZlci9pbnN0YWxsZWRBcHBzL015RWFyLmVhci9NeVdhci53YXIvV0VCLUlORi93c2RsL015V1NETC53c2RsIjsKLSAgICAgICAgCi0gICAgICAgIFVSSSB1cmkgPSBKYXZhVXRpbHMuY3JlYXRlVVJJKHBhdGhXaXRoU3BhY2VzKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh1cmkpOwotICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGVzdCB0aGF0IG51bGwgYW5kIGVtcHR5IGFyZ3VtZW50cyBhcmUgaGFuZGxlZCBjb3JyZWN0bHkgd2hlbiB0cnlpbmcgdG8gY29udmVydCB0byBhIFVSSS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlVVJJX2ludmFsaWQoKSB7Ci0gICAgICAgIAotICAgICAgICBVUkkgdXJpID0gSmF2YVV0aWxzLmNyZWF0ZVVSSShudWxsKTsKLSAgICAgICAgYXNzZXJ0TnVsbCh1cmkpOwotICAgICAgICAKLSAgICAgICAgVVJJIHVyaTIgPSBKYXZhVXRpbHMuY3JlYXRlVVJJKCIiKTsKLSAgICAgICAgYXNzZXJ0TnVsbCh1cmkyKTsKLSAgICAgICAgCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvdXRpbGl0eS9Qcm9wZXJ0eURlc2NyaXB0b3JQbHVzVGVzdHMuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy91dGlsaXR5L1Byb3BlcnR5RGVzY3JpcHRvclBsdXNUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWJjMzZmLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy91dGlsaXR5L1Byb3BlcnR5RGVzY3JpcHRvclBsdXNUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51dGlsaXR5Ow0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQotDQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJFbGVtZW50Ow0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOw0KLWltcG9ydCBqYXZhLmJlYW5zLkJlYW5JbmZvOw0KLWltcG9ydCBqYXZhLmJlYW5zLkludHJvc3BlY3RvcjsNCi1pbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eURlc2NyaXB0b3I7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7DQotDQotcHVibGljIGNsYXNzIFByb3BlcnR5RGVzY3JpcHRvclBsdXNUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsNCi0gICAgcHVibGljIHZvaWQgdGVzdEpBWEJFbGVtZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBJbnZva2VBY3Rpb24gb2JqZWN0ID0gbmV3IEludm9rZUFjdGlvbigpOw0KLQ0KLSAgICAgICAgQmVhbkluZm8gc3RydWN0QmVhbkluZm8gPSBJbnRyb3NwZWN0b3IuZ2V0QmVhbkluZm8oSW52b2tlQWN0aW9uLmNsYXNzKTsNCi0gICAgICAgIFByb3BlcnR5RGVzY3JpcHRvcltdIGRlc2NyaXB0b3JzID0gc3RydWN0QmVhbkluZm8uZ2V0UHJvcGVydHlEZXNjcmlwdG9ycygpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChkZXNjcmlwdG9ycyk7DQotICAgICAgICBhc3NlcnRFcXVhbHMoZGVzY3JpcHRvcnMubGVuZ3RoLCAyKTsNCi0NCi0gICAgICAgIFFOYW1lIHFOYW1lID0gbmV3IFFOYW1lKCIiLCAiYXJnczAiKTsNCi0gICAgICAgIFByb3BlcnR5RGVzY3JpcHRvciBwcm9wZXJ0eURlc2NyaXB0b3IgPSBudWxsOw0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykgew0KLSAgICAgICAgICAgIGlmKGRlc2NyaXB0b3JzW2ldLmdldE5hbWUoKS5lcXVhbHMoImFyZzAiKSl7DQotICAgICAgICAgICAgICAgIHByb3BlcnR5RGVzY3JpcHRvciA9IGRlc2NyaXB0b3JzW2ldOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBhc3NlcnROb3ROdWxsKHByb3BlcnR5RGVzY3JpcHRvcik7DQotICAgICAgICBQcm9wZXJ0eURlc2NyaXB0b3JQbHVzIHBsdXMgPSBuZXcgUHJvcGVydHlEZXNjcmlwdG9yUGx1cyhwcm9wZXJ0eURlc2NyaXB0b3IsIHFOYW1lKTsNCi0gICAgICAgIGJ5dGVbXSB0ZXN0VmFsdWUgPSB7MHhkLCAweGUsIDB4YSwgMHhkLCAweGIsIDB4ZSwgMHhlLCAweGZ9Ow0KLSAgICAgICAgcGx1cy5zZXQob2JqZWN0LCB0ZXN0VmFsdWUsIG51bGwpOw0KLQ0KLSAgICAgICAgSkFYQkVsZW1lbnQ8Ynl0ZVtdPiBhcmcwID0gb2JqZWN0LmdldEFyZzAoKTsNCi0gICAgICAgIGFzc2VydEVxdWFscyhhcmcwLmdldERlY2xhcmVkVHlwZSgpLCBieXRlW10uY2xhc3MpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKGFyZzAuZ2V0TmFtZSgpLCBxTmFtZSk7DQotICAgICAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHModGVzdFZhbHVlLCBhcmcwLmdldFZhbHVlKCkpKTsNCi0NCi0gICAgICAgIE9iamVjdCB2YWx1ZSA9IHBsdXMuZ2V0KG9iamVjdCk7DQotICAgICAgICBhc3NlcnRFcXVhbHModmFsdWUuZ2V0Q2xhc3MoKSwgYnl0ZVtdLmNsYXNzKTsNCi0gICAgICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyh0ZXN0VmFsdWUsIChieXRlW10pIHZhbHVlKSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3V0aWxpdHkvV2ViU2VydmljZUV4Y2VwdGlvbkxvZ2dlclRlc3RzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvdXRpbGl0eS9XZWJTZXJ2aWNlRXhjZXB0aW9uTG9nZ2VyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JlNTE1Zi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvdXRpbGl0eS9XZWJTZXJ2aWNlRXhjZXB0aW9uTG9nZ2VyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MudXRpbGl0eTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5XZWJTZXJ2aWNlRXhjZXB0aW9uTG9nZ2VyOw0KLQ0KLWltcG9ydCBqYXZhLmF3dC5JbWFnZTsNCi1pbXBvcnQgamF2YS5pby5GaWxlOw0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7DQotDQotaW1wb3J0IGphdmF4LmltYWdlaW8uSW1hZ2VJTzsNCi1pbXBvcnQgamF2YXgueG1sLndzLndzYWRkcmVzc2luZy5XM0NFbmRwb2ludFJlZmVyZW5jZTsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOw0KLQ0KLS8qKg0KLSAqIFZhbGlkYXRlIHRoZSBGYWlsdXJlTG9nZ2VyIHV0aWxpdHkNCi0gKi8NCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZUV4Y2VwdGlvbkxvZ2dlclRlc3RzIGV4dGVuZHMgVGVzdENhc2Ugew0KLSAgICAvKioNCi0gICAgICogVmFsaWRhdGUgRmFpbHVyZUxvZ2dlci5nZXRDaGVja2VkRXhjZXB0aW9uIG1ldGhvZA0KLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdENoZWNrZWRFeGNlcHRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIA0KLSAgICAgICAgTWV0aG9kIG0gPSBTYW1wbGUuY2xhc3MuZ2V0TWV0aG9kKCJtIiwgbmV3IENsYXNzW10ge30pOw0KLSAgICAgICAgDQotICAgICAgICBUaHJvd2FibGUgdCA9IG5ldyBFeGNlcHRpb25BKCk7DQotICAgICAgICBDbGFzcyBjaGVja2VkRXhjZXB0aW9uID0gSmF2YVV0aWxzLmdldENoZWNrZWRFeGNlcHRpb24odCwgbSk7ICAgICAgDQotICAgICAgICBhc3NlcnRUcnVlKEV4Y2VwdGlvbkEuY2xhc3MuZXF1YWxzKGNoZWNrZWRFeGNlcHRpb24pKTsNCi0gICAgICAgIA0KLSAgICAgICAgdCA9IG5ldyBFeGNlcHRpb25CKCk7DQotICAgICAgICBjaGVja2VkRXhjZXB0aW9uID0gSmF2YVV0aWxzLmdldENoZWNrZWRFeGNlcHRpb24odCwgbSk7IA0KLSAgICAgICAgYXNzZXJ0VHJ1ZShFeGNlcHRpb25CLmNsYXNzLmVxdWFscyhjaGVja2VkRXhjZXB0aW9uKSk7DQotICAgICAgICANCi0gICAgICAgIHQgPSBuZXcgRXhjZXB0aW9uQygpOw0KLSAgICAgICAgY2hlY2tlZEV4Y2VwdGlvbiA9IEphdmFVdGlscy5nZXRDaGVja2VkRXhjZXB0aW9uKHQsIG0pOyANCi0gICAgICAgIGFzc2VydFRydWUoRXhjZXB0aW9uQi5jbGFzcy5lcXVhbHMoY2hlY2tlZEV4Y2VwdGlvbikpOw0KLSAgICAgICAgDQotICAgICAgICB0ID0gbmV3IEV4Y2VwdGlvbkQoKTsNCi0gICAgICAgIGNoZWNrZWRFeGNlcHRpb24gPSBKYXZhVXRpbHMuZ2V0Q2hlY2tlZEV4Y2VwdGlvbih0LCBtKTsgDQotICAgICAgICBhc3NlcnRUcnVlKGNoZWNrZWRFeGNlcHRpb24gPT0gbnVsbCk7DQotICAgICAgICANCi0gICAgICAgIHQgPSBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsNCi0gICAgICAgIGNoZWNrZWRFeGNlcHRpb24gPSBKYXZhVXRpbHMuZ2V0Q2hlY2tlZEV4Y2VwdGlvbih0LCBtKTsgDQotICAgICAgICBhc3NlcnRUcnVlKGNoZWNrZWRFeGNlcHRpb24gPT0gbnVsbCk7DQotICAgICAgICANCi0gICAgfQ0KLSAgICANCi0gICAgY2xhc3MgU2FtcGxlIHsNCi0gICAgICAgIHB1YmxpYyB2b2lkIG0oKSB0aHJvd3MgRXhjZXB0aW9uQSwgRXhjZXB0aW9uQiB7fQ0KLSAgICB9DQotICAgIA0KLSAgICBjbGFzcyBFeGNlcHRpb25BIGV4dGVuZHMgRXhjZXB0aW9uIHsNCi0gICAgICAgIA0KLSAgICB9DQotICAgIA0KLSAgICBjbGFzcyBFeGNlcHRpb25CIGV4dGVuZHMgRXhjZXB0aW9uIHsNCi0gICAgICAgIA0KLSAgICB9DQotICAgIA0KLSAgICBjbGFzcyBFeGNlcHRpb25DIGV4dGVuZHMgRXhjZXB0aW9uQiB7DQotICAgICAgICANCi0gICAgfQ0KLSAgICANCi0gICAgY2xhc3MgRXhjZXB0aW9uRCBleHRlbmRzIEV4Y2VwdGlvbiB7DQotICAgICAgICANCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvd3NkbC9zY2hlbWFyZWFkZXIvU2NoZW1hUmVhZGVyVGVzdHMuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy93c2RsL3NjaGVtYXJlYWRlci9TY2hlbWFSZWFkZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWE0Y2IxLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy93c2RsL3NjaGVtYXJlYWRlci9TY2hlbWFSZWFkZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLndzZGwuc2NoZW1hcmVhZGVyOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51bml0VGVzdC5UZXN0TG9nZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MudXRpbC5XU0RMNEpXcmFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Mud3NkbC5pbXBsLlNjaGVtYVJlYWRlckltcGw7Ci0KLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotcHVibGljIGNsYXNzIFNjaGVtYVJlYWRlclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXB1YmxpYyB2b2lkIHRlc3RTY2hlbWFSZWFkZXIoKXsKLQkJU2NoZW1hUmVhZGVySW1wbCBzcmkgPSBuZXcgU2NoZW1hUmVhZGVySW1wbCgpOwotCQkKLQkgICAgU3RyaW5nIHdzZGxMb2NhdGlvbj0iL3Rlc3QtcmVzb3VyY2VzL3dzZGwvc2hhcGVzLndzZGwiOwotCSAgICBVUkwgdXJsID0gbnVsbDsKLQkgICAgdHJ5IHsKLQkgICAgCXRyeXsKLQkgICAgICAgIAlTdHJpbmcgYmFzZURpciA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiYmFzZWRpciIsIi4iKSkuZ2V0Q2Fub25pY2FsUGF0aCgpOwotCSAgICAgICAgCXdzZGxMb2NhdGlvbiA9IG5ldyBGaWxlKGJhc2VEaXIgKyB3c2RsTG9jYXRpb24pLmdldEFic29sdXRlUGF0aCgpOwotICAgICAgICAJfWNhdGNoKEV4Y2VwdGlvbiBlKXsKLSAgICAgICAgCQllLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAJCWZhaWwoKTsKLSAgICAgICAgCX0KLQkgICAgICAgCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHdzZGxMb2NhdGlvbik7Ci0JICAgICAgIAl1cmwgPSBmaWxlLnRvVVJMKCk7Ci0JICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotCSAgICAgICAgZmFpbCgpOwotCSAgICB9Ci0JICAgIHRyeXsKLQkgICAgCVdTREw0SldyYXBwZXIgdzRqID0gbmV3IFdTREw0SldyYXBwZXIodXJsKTsKLQkgICAgCURlZmluaXRpb24gd3NkbERlZiA9IHc0ai5nZXREZWZpbml0aW9uKCk7Ci0JICAgIAlhc3NlcnROb3ROdWxsKHdzZGxEZWYpOwotCSAgICAJU2V0PFN0cmluZz4gcGtnID0gc3JpLnJlYWRQYWNrYWdlc0Zyb21TY2hlbWEod3NkbERlZik7Ci0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiUGFja2FnZXM6Iik7Ci0JICAgIAlmb3IoU3RyaW5nIHBrZ05hbWU6cGtnKXsKLSAgICAgICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1Zyhwa2dOYW1lKTsKLQkgICAgCX0KLQkgICAgfWNhdGNoKEV4Y2VwdGlvbiBlKXsKLQkgICAgCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JICAgIAlmYWlsKCk7Ci0JICAgIH0KLQl9Ci0JCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvd3MvamF4Yi9hL0JhZERhdGExLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvd3MvamF4Yi9hL0JhZERhdGExLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3M2ZmNjAuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL3dzL2pheGIvYS9CYWREYXRhMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS53cy5qYXhiLmE7DQotDQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07DQotDQotcHVibGljIGNsYXNzIEJhZERhdGExIHsNCi0gICAgcHVibGljIElucHV0U3RyZWFtIGlzOw0KLSAgICANCi0gICANCi0gICAgcHVibGljIEJhZERhdGExKCkgew0KLSAgICAgICAgc3VwZXIoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SXMoKSB7DQotICAgICAgICByZXR1cm4gaXM7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0SXMoSW5wdXRTdHJlYW0gaXMpIHsNCi0gICAgICAgIHRoaXMuaXMgPSBpczsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvd3MvamF4Yi9hL0JhZERhdGEyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvd3MvamF4Yi9hL0JhZERhdGEyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3YmQxNzAuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL3dzL2pheGIvYS9CYWREYXRhMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS53cy5qYXhiLmE7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUud3MuamF4Yi5iLkJhZERhdGEzOw0KLQ0KLQ0KLXB1YmxpYyBjbGFzcyBCYWREYXRhMiB7DQotICAgcHVibGljIEJhZERhdGEzIGRhdGEzOw0KLSAgIA0KLSAgIHB1YmxpYyBCYWREYXRhMigpIHsNCi0gICAgICAgc3VwZXIoKTsNCi0gICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS93cy9qYXhiL2EvRGF0YTEuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS93cy9qYXhiL2EvRGF0YTEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFjMmY1ZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvd3MvamF4Yi9hL0RhdGExLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLndzLmpheGIuYTsNCi0NCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOw0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZTsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50Ow0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGU7DQotDQotLyoqDQotICogR29vZCBKQVhCIGVsZW1lbnQNCi0gKiBEYXRhMSBjb250YWlucyBKQVhCIGFubm90YXRpb25zLg0KLSAqIFJlZmVyZW5jZXMgRGF0YTINCi0gKi8NCi1AWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpDQotQFhtbFR5cGUobmFtZSA9ICJkYXRhMSIsIG5hbWVzcGFjZT0idXJuOi8vamF4Yi5hIiwgcHJvcE9yZGVyID0gew0KLSAgICAidGV4dCIsICJkYXRhMiINCi19KQ0KLQ0KLXB1YmxpYyBjbGFzcyBEYXRhMSB7DQotDQotICAgIEBYbWxFbGVtZW50KHJlcXVpcmVkID0gdHJ1ZSwgbmlsbGFibGUgPSB0cnVlKQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHRleHQ7DQotICAgIA0KLSAgICBAWG1sRWxlbWVudChyZXF1aXJlZCA9IHRydWUsIG5pbGxhYmxlID0gdHJ1ZSkNCi0gICAgcHJvdGVjdGVkIERhdGEyIGRhdGEyOw0KLQ0KLSAgICBwdWJsaWMgRGF0YTIgZ2V0RGF0YTIoKSB7DQotICAgICAgICByZXR1cm4gZGF0YTI7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RGF0YTIoRGF0YTIgZGF0YTIpIHsNCi0gICAgICAgIHRoaXMuZGF0YTIgPSBkYXRhMjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7DQotICAgICAgICByZXR1cm4gdGV4dDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRUZXh0KFN0cmluZyB0ZXh0KSB7DQotICAgICAgICB0aGlzLnRleHQgPSB0ZXh0Ow0KLSAgICB9DQotICAgIA0KLSAgICANCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL3dzL2pheGIvYS9EYXRhMi5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL3dzL2pheGIvYS9EYXRhMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmZiMmU0Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS93cy9qYXhiL2EvRGF0YTIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUud3MuamF4Yi5hOw0KLQ0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7DQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOw0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnQ7DQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZTsNCi0NCi0vKioNCi0gKiBHb29kIEpBWEIgZWxlbWVudA0KLSAqIERhdGEyIGNvbnRhaW5zIEpBWEIgYW5ub3RhdGlvbnMuDQotICovDQotQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKQ0KLUBYbWxUeXBlKG5hbWUgPSAiZGF0YTIiLCBuYW1lc3BhY2U9InVybjovL2pheGIuYSIsIHByb3BPcmRlciA9IHsNCi0gICAgInRleHQiDQotfSkNCi1wdWJsaWMgY2xhc3MgRGF0YTIgew0KLSAgICBAWG1sRWxlbWVudChyZXF1aXJlZCA9IHRydWUsIG5pbGxhYmxlID0gdHJ1ZSkNCi0gICAgcHJvdGVjdGVkIFN0cmluZyB0ZXh0Ow0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7DQotICAgICAgICByZXR1cm4gdGV4dDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRUZXh0KFN0cmluZyB0ZXh0KSB7DQotICAgICAgICB0aGlzLnRleHQgPSB0ZXh0Ow0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS93cy9qYXhiL2EvRGF0YTMuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS93cy9qYXhiL2EvRGF0YTMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2VkNjZiOS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvd3MvamF4Yi9hL0RhdGEzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLndzLmpheGIuYTsNCi0NCi1wdWJsaWMgY2xhc3MgRGF0YTMgew0KLSAgICBwcml2YXRlIFN0cmluZyB0ZXh0Ow0KLSAgICANCi0gICAgcHVibGljIERhdGEzKCkgew0KLSAgICAgICAgc3VwZXIoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7DQotICAgICAgICByZXR1cm4gdGV4dDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRUZXh0KFN0cmluZyB0ZXh0KSB7DQotICAgICAgICB0aGlzLnRleHQgPSB0ZXh0Ow0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS93cy9qYXhiL2IvQmFkRGF0YTMuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS93cy9qYXhiL2IvQmFkRGF0YTMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBiOWUzZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvd3MvamF4Yi9iL0JhZERhdGEzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLndzLmpheGIuYjsNCi0NCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsNCi0NCi1wdWJsaWMgY2xhc3MgQmFkRGF0YTMgew0KLSAgICBwdWJsaWMgSW5wdXRTdHJlYW0gaXM7DQotICAgIA0KLSAgICBwdWJsaWMgQmFkRGF0YTMoKSB7DQotICAgICAgICBzdXBlcigpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJcygpIHsNCi0gICAgICAgIHJldHVybiBpczsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRJcyhJbnB1dFN0cmVhbSBpcykgew0KLSAgICAgICAgdGhpcy5pcyA9IGlzOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ppYngvcG9tLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2ppYngvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTEwY2U0OC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qaWJ4L3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+MS41LjE8L3ZlcnNpb24+Ci0gICAgICAgIDxyZWxhdGl2ZVBhdGg+Li4vcGFyZW50L3BvbS54bWw8L3JlbGF0aXZlUGF0aD4KLSAgICA8L3BhcmVudD4KLSAgICA8YXJ0aWZhY3RJZD5heGlzMi1qaWJ4PC9hcnRpZmFjdElkPgotICAgIDxuYW1lPkFwYWNoZSBBeGlzMiAtIEppQlggRGF0YSBCaW5kaW5nPC9uYW1lPgotICAgIDxkZXNjcmlwdGlvbj5KaUJYIGRhdGEgYmluZGluZyBzdXBwb3J0IGZvciBBeGlzIDIuMDwvZGVzY3JpcHRpb24+Ci0gICAgPGRlcGVuZGVuY2llcz4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczIta2VybmVsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHt2ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItdHJhbnNwb3J0LWh0dHA8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3ZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi10cmFuc3BvcnQtbG9jYWw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3ZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLWNvZGVnZW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3ZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmppYng8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5qaWJ4LWJpbmQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuamlieDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmppYngtcnVuPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5iY2VsPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YmNlbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYW50PC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YW50PC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5hbnQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5hbnQtbGF1bmNoZXI8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8L2RlcGVuZGVuY2llcz4KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxyZXNvdXJjZXM+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmM8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqLyouamF2YTwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1ZGVzPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5Pi4uLy4uPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5OT1RJQ0UudHh0PC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5MSUNFTlNFLnR4dDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgICAgIDxmaWx0ZXJpbmc+ZmFsc2U8L2ZpbHRlcmluZz4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgIDwvcmVzb3VyY2VzPgotICAgICAgICA8c291cmNlRGlyZWN0b3J5PnNyYzwvc291cmNlRGlyZWN0b3J5PgotICAgICAgICA8dGVzdFNvdXJjZURpcmVjdG9yeT50ZXN0PC90ZXN0U291cmNlRGlyZWN0b3J5PgotICAgICAgICA8dGVzdFJlc291cmNlcz4KLSAgICAgICAgICAgIDx0ZXN0UmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPHRhcmdldFBhdGg+Li4vdGVzdC1yZXNvdXJjZXM8L3RhcmdldFBhdGg+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT50ZXN0LXJlc291cmNlczwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKio8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgIDwvdGVzdFJlc291cmNlPgotICAgICAgICA8L3Rlc3RSZXNvdXJjZXM+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxza2lwPmZhbHNlPC9za2lwPgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYW50cnVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5jb21waWxlPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT50ZXN0LWNvbXBpbGU8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhc2tzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8amF2YSBjbGFzc25hbWU9Im9yZy5qaWJ4LmJpbmRpbmcuQ29tcGlsZSIgZm9yaz0idHJ1ZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJtYXZlbi5ydW50aW1lLmNsYXNzcGF0aCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzcGF0aCBsb2NhdGlvbj0idGFyZ2V0L3Rlc3QtY2xhc3NlcyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFyZyB2YWx1ZT0idGVzdC1yZXNvdXJjZXMvYmluZGluZy9jdXN0b21lci1iaW5kaW5nLnhtbCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFyZyB2YWx1ZT0idGVzdC1yZXNvdXJjZXMvYmluZGluZy9saWJyYXJ5LWJpbmRpbmcueG1sIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvamF2YT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rhc2tzPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnJ1bjwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmdlbi1jcDwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+Z2VuZXJhdGUtdGVzdC1zb3VyY2VzPC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YXNrcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImNwIiByZWZpZD0ibWF2ZW4ucnVudGltZS5jbGFzc3BhdGgiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVjaG8gbWVzc2FnZT0iJHtjcH0iIGZpbGU9InRhcmdldC9jcC50eHQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rhc2tzPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnJ1bjwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgPC9idWlsZD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ppYngvc3JjL29yZy9hcGFjaGUvYXhpczIvamlieC9Db2RlR2VuZXJhdGlvblV0aWxpdHkuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2ppYngvc3JjL29yZy9hcGFjaGUvYXhpczIvamlieC9Db2RlR2VuZXJhdGlvblV0aWxpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhmYTI1MC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qaWJ4L3NyYy9vcmcvYXBhY2hlL2F4aXMyL2ppYngvQ29kZUdlbmVyYXRpb25VdGlsaXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qaWJ4OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzTWVzc2FnZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5QYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLlNPQVBIZWFkZXJNZXNzYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5Db2RlR2VuQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5leHRlbnNpb24uSmlCWEV4dGVuc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuZGF0YWJpbmRpbmcuSmF2YVR5cGVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLnV0aWwuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC51dGlsLk1lc3NhZ2VQYXJ0SW5mb3JtYXRpb25Ib2xkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFDb21wbGV4VHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFPYmplY3RDb2xsZWN0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hUGFydGljbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFTZXF1ZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYVNpbXBsZVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFTaW1wbGVUeXBlQ29udGVudDsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYVNpbXBsZVR5cGVSZXN0cmljdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmppYnguYmluZGluZy5tb2RlbC5CaW5kaW5nRWxlbWVudDsKLWltcG9ydCBvcmcuamlieC5iaW5kaW5nLm1vZGVsLkVsZW1lbnRCYXNlOwotaW1wb3J0IG9yZy5qaWJ4LmJpbmRpbmcubW9kZWwuRm9ybWF0RWxlbWVudDsKLWltcG9ydCBvcmcuamlieC5iaW5kaW5nLm1vZGVsLkluY2x1ZGVFbGVtZW50OwotaW1wb3J0IG9yZy5qaWJ4LmJpbmRpbmcubW9kZWwuTWFwcGluZ0VsZW1lbnRCYXNlOwotaW1wb3J0IG9yZy5qaWJ4LmJpbmRpbmcubW9kZWwuTW9kZWxWaXNpdG9yOwotaW1wb3J0IG9yZy5qaWJ4LmJpbmRpbmcubW9kZWwuTmFtZXNwYWNlRWxlbWVudDsKLWltcG9ydCBvcmcuamlieC5iaW5kaW5nLm1vZGVsLlZhbGlkYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5qaWJ4LmJpbmRpbmcubW9kZWwuVmFsaWRhdGlvblByb2JsZW07Ci1pbXBvcnQgb3JnLmppYngucnVudGltZS5KaUJYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKioKLSAqIEZyYW1ld29yay1saW5rZWQgY29kZSB1c2VkIGJ5IEppQlggZGF0YSBiaW5kaW5nIHN1cHBvcnQuIFRoaXMgaXMgYWNjZXNzZWQgdmlhIHJlZmxlY3Rpb24gZnJvbSB0aGUKLSAqIEppQlggY29kZSBnZW5lcmF0aW9uIGV4dGVuc2lvbiB3aGVuIEppQlggZGF0YSBiaW5kaW5nIGlzIHNlbGVjdGVkLiBKaUJYIHVzZXMgYSBkaWZmZXJlbnQgYXBwcm9hY2gKLSAqIHRvIHVud3JhcHBpbmcgbWV0aG9kIHBhcmFtZXRlcnMgZnJvbSB0aGF0IGltcGxlbWVudGVkIGJ5IEFEQiwgYW5kIHNpbmNlIHRoZSBBREIgdGVjaG5pcXVlIGlzCi0gKiBhc3N1bWVkIGJ5IGFsbCBjb2RlIGdlbmVyYXRpb24gdGVtcGxhdGVzIHRoaXMgaGFzIHRvIGNyZWF0ZSB0aGUgc2FtZSBkYXRhIHN0cnVjdHVyZXMuIFRoZXNlIGRhdGEKLSAqIHN0cnVjdHVyZXMgYXJlIHVuZG9jdW1lbnRlZCwgYW5kIGNhbiBvbmx5IGJlIGRldGVybWluZWQgYnkgZ29pbmcgdGhyb3VnaCB0aGUge0BsaW5rCi0gKiBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5leHRlbnNpb24uU2NoZW1hVW53cmFwcGVyRXh0ZW5zaW9ufSBhbmQge0BsaW5rCi0gKiBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5lbWl0dGVyLkF4aXNTZXJ2aWNlQmFzZWRNdWx0aUxhbmd1YWdlRW1pdHRlcn0gY29kZS4KLSAqLwotcHVibGljIGNsYXNzIENvZGVHZW5lcmF0aW9uVXRpbGl0eSB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNDSEVNQV9OQU1FU1BBQ0UgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBDb2RlR2VuQ29uZmlndXJhdGlvbiBjb2RlR2VuQ29uZmlnOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgSGFzaFNldCBzX3ByaW1pdGl2ZVNldCA9IG5ldyBIYXNoU2V0KCk7Ci0KLSAgICBzdGF0aWMgewotICAgICAgICBzX3ByaW1pdGl2ZVNldC5hZGQoImJvb2xlYW4iKTsKLSAgICAgICAgc19wcmltaXRpdmVTZXQuYWRkKCJieXRlIik7Ci0gICAgICAgIHNfcHJpbWl0aXZlU2V0LmFkZCgiY2hhciIpOwotICAgICAgICBzX3ByaW1pdGl2ZVNldC5hZGQoImRvdWJsZSIpOwotICAgICAgICBzX3ByaW1pdGl2ZVNldC5hZGQoImZsb2F0Iik7Ci0gICAgICAgIHNfcHJpbWl0aXZlU2V0LmFkZCgiaW50Iik7Ci0gICAgICAgIHNfcHJpbWl0aXZlU2V0LmFkZCgibG9uZyIpOwotICAgICAgICBzX3ByaW1pdGl2ZVNldC5hZGQoInNob3J0Iik7Ci0gICAgICAgIHNfcHJpbWl0aXZlU2V0LmFkZCgidm9pZCIpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIEhhc2hNYXAgc193cmFwcGVyTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotICAgIHN0YXRpYyB7Ci0gICAgICAgIHNfd3JhcHBlck1hcC5wdXQoImJvb2xlYW4iLCAiQm9vbGVhbiIpOwotICAgICAgICBzX3dyYXBwZXJNYXAucHV0KCJieXRlIiwgIkJ5dGUiKTsKLSAgICAgICAgc193cmFwcGVyTWFwLnB1dCgiY2hhciIsICJDaGFyYWN0ZXIiKTsKLSAgICAgICAgc193cmFwcGVyTWFwLnB1dCgiZG91YmxlIiwgIkRvdWJsZSIpOwotICAgICAgICBzX3dyYXBwZXJNYXAucHV0KCJmbG9hdCIsICJGbG9hdCIpOwotICAgICAgICBzX3dyYXBwZXJNYXAucHV0KCJpbnQiLCAiSW50ZWdlciIpOwotICAgICAgICBzX3dyYXBwZXJNYXAucHV0KCJsb25nIiwgIkxvbmciKTsKLSAgICAgICAgc193cmFwcGVyTWFwLnB1dCgic2hvcnQiLCAiU2hvcnQiKTsKLSAgICB9Ci0KLSAgICAvKiogUmVzZXJ2ZWQgd29yZHMgZm9yIEphdmEgKGtleXdvcmRzIGFuZCBsaXRlcmFscykuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSGFzaFNldCBzX3Jlc2VydmVkV29yZHMgPSBuZXcgSGFzaFNldCgpOwotCi0gICAgc3RhdGljIHsKLQotICAgICAgICAvLyBrZXl3b3JkcwotICAgICAgICBzX3Jlc2VydmVkV29yZHMuYWRkKCJhYnN0cmFjdCIpOwotICAgICAgICBzX3Jlc2VydmVkV29yZHMuYWRkKCJhc3NlcnQiKTsKLSAgICAgICAgc19yZXNlcnZlZFdvcmRzLmFkZCgiYm9vbGVhbiIpOwotICAgICAgICBzX3Jlc2VydmVkV29yZHMuYWRkKCJicmVhayIpOwotICAgICAgICBzX3Jlc2VydmVkV29yZHMuYWRkKCJieXRlIik7Ci0gICAgICAgIHNfcmVzZXJ2ZWRXb3Jkcy5hZGQoImNhc2UiKTsKLSAgICAgICAgc19yZXNlcnZlZFdvcmRzLmFkZCgiY2F0Y2giKTsKLSAgICAgICAgc19yZXNlcnZlZFdvcmRzLmFkZCgiY2hhciIpOwotICAgICAgICBzX3Jlc2VydmVkV29yZHMuYWRkKCJjbGFzcyIpOwotICAgICAgICBzX3Jlc2VydmVkV29yZHMuYWRkKCJjb25zdCIpOwotICAgICAgICBzX3Jlc2VydmVkV29yZHMuYWRkKCJjb250aW51ZSIpOwotCi0gICAgICAgIHNfcmVzZXJ2ZWRXb3Jkcy5hZGQoImRlZmF1bHQiKTsKLSAgICAgICAgc19yZXNlcnZlZFdvcmRzLmFkZCgiZG8iKTsKLSAgICAgICAgc19yZXNlcnZlZFdvcmRzLmFkZCgiZG91YmxlIik7Ci0gICAgICAgIHNfcmVzZXJ2ZWRXb3Jkcy5hZGQoImVsc2UiKTsKLSAgICAgICAgc19yZXNlcnZlZFdvcmRzLmFkZCgiZW51bSIpOwotICAgICAgICBzX3Jlc2VydmVkV29yZHMuYWRkKCJleHRlbmRzIik7Ci0gICAgICAgIHNfcmVzZXJ2ZWRXb3Jkcy5hZGQoImZpbmFsIik7Ci0gICAgICAgIHNfcmVzZXJ2ZWRXb3Jkcy5hZGQoImZpbmFsbHkiKTsKLSAgICAgICAgc19yZXNlcnZlZFdvcmRzLmFkZCgiZmxvYXQiKTsKLSAgICAgICAgc19yZXNlcnZlZFdvcmRzLmFkZCgiZm9yIik7Ci0gICAgICAgIHNfcmVzZXJ2ZWRXb3Jkcy5hZGQoImdvdG8iKTsKLQotICAgICAgICBzX3Jlc2VydmVkV29yZHMuYWRkKCJpZiIpOwotICAgICAgICBzX3Jlc2VydmVkV29yZHMuYWRkKCJpbXBsZW1lbnRzIik7Ci0gICAgICAgIHNfcmVzZXJ2ZWRXb3Jkcy5hZGQoImltcG9ydCIpOwotICAgICAgICBzX3Jlc2VydmVkV29yZHMuYWRkKCJpbnN0YW5jZW9mIik7Ci0gICAgICAgIHNfcmVzZXJ2ZWRXb3Jkcy5hZGQoImludCIpOwotICAgICAgICBzX3Jlc2VydmVkV29yZHMuYWRkKCJpbnRlcmZhY2UiKTsKLSAgICAgICAgc19yZXNlcnZlZFdvcmRzLmFkZCgibG9uZyIpOwotICAgICAgICBzX3Jlc2VydmVkV29yZHMuYWRkKCJuYXRpdmUiKTsKLSAgICAgICAgc19yZXNlcnZlZFdvcmRzLmFkZCgibmV3Iik7Ci0gICAgICAgIHNfcmVzZXJ2ZWRXb3Jkcy5hZGQoInBhY2thZ2UiKTsKLQotICAgICAgICBzX3Jlc2VydmVkV29yZHMuYWRkKCJwcml2YXRlIik7Ci0gICAgICAgIHNfcmVzZXJ2ZWRXb3Jkcy5hZGQoInByb3RlY3RlZCIpOwotICAgICAgICBzX3Jlc2VydmVkV29yZHMuYWRkKCJwdWJsaWMiKTsKLSAgICAgICAgc19yZXNlcnZlZFdvcmRzLmFkZCgicmV0dXJuIik7Ci0gICAgICAgIHNfcmVzZXJ2ZWRXb3Jkcy5hZGQoInNob3J0Iik7Ci0gICAgICAgIHNfcmVzZXJ2ZWRXb3Jkcy5hZGQoInN0YXRpYyIpOwotICAgICAgICBzX3Jlc2VydmVkV29yZHMuYWRkKCJzdHJpY3RmcCIpOwotICAgICAgICBzX3Jlc2VydmVkV29yZHMuYWRkKCJzdXBlciIpOwotICAgICAgICBzX3Jlc2VydmVkV29yZHMuYWRkKCJzd2l0Y2giKTsKLSAgICAgICAgc19yZXNlcnZlZFdvcmRzLmFkZCgic3luY2hyb25pemVkIik7Ci0KLSAgICAgICAgc19yZXNlcnZlZFdvcmRzLmFkZCgidGhpcyIpOwotICAgICAgICBzX3Jlc2VydmVkV29yZHMuYWRkKCJ0aHJvdyIpOwotICAgICAgICBzX3Jlc2VydmVkV29yZHMuYWRkKCJ0aHJvd3MiKTsKLSAgICAgICAgc19yZXNlcnZlZFdvcmRzLmFkZCgidHJhbnNpZW50Iik7Ci0gICAgICAgIHNfcmVzZXJ2ZWRXb3Jkcy5hZGQoInRyeSIpOwotICAgICAgICBzX3Jlc2VydmVkV29yZHMuYWRkKCJ2b2lkIik7Ci0gICAgICAgIHNfcmVzZXJ2ZWRXb3Jkcy5hZGQoInZvbGF0aWxlIik7Ci0gICAgICAgIHNfcmVzZXJ2ZWRXb3Jkcy5hZGQoIndoaWxlIik7Ci0KLSAgICAgICAgLy8gbGl0ZXJhbHMKLSAgICAgICAgc19yZXNlcnZlZFdvcmRzLmFkZCgidHJ1ZSIpOwotICAgICAgICBzX3Jlc2VydmVkV29yZHMuYWRkKCJmYWxzZSIpOwotICAgICAgICBzX3Jlc2VydmVkV29yZHMuYWRkKCJudWxsIik7Ci0KLSAgICAgICAgLy8gdmFyaWFibGUgbmFtZXMgdXNlZCBieSB0ZW1wbGF0ZSB1bndyYXBwZWQgY29kZSBnZW5lcmF0aW9uCi0gICAgICAgIC8vIFRPRE8gY2hhbmdlIHRlbXBsYXRlcyB0byB1c2UgJHh4eCBuYW1lcywgYmxvY2sgZ2VuZXJhdGlvbiBmcm9tIFdTREwKLSAgICAgICAgc19yZXNlcnZlZFdvcmRzLmFkZCgidHJ1ZSIpOwotICAgICAgICBzX3Jlc2VydmVkV29yZHMuYWRkKCJ1Y3R4Iik7Ci0gICAgICAgIHNfcmVzZXJ2ZWRXb3Jkcy5hZGQoImNoaWxkIik7Ci0gICAgICAgIHNfcmVzZXJ2ZWRXb3Jkcy5hZGQoIndyYXBwZXIiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb25maWcgY29kZSBnZW5lcmF0aW9uIGNvbmZpZ3VyYXRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgQ29kZUdlbmVyYXRpb25VdGlsaXR5KENvZGVHZW5Db25maWd1cmF0aW9uIGNvbmZpZykgewotICAgICAgICBjb2RlR2VuQ29uZmlnID0gY29uZmlnOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbmZpZ3VyZSB0aGUgY29kZSBnZW5lcmF0aW9uIGJhc2VkIG9uIHRoZSBzdXBwbGllZCBwYXJhbWV0ZXJzIGFuZCBXU0RMLiBUaGlzIGZpcnN0IGdldHMgdHlwZQotICAgICAqIG1hcHBpbmdzIGZyb20gYmluZGluZyBkZWZpbml0aW9uLCB0aGVuIGdvZXMgdGhyb3VnaCB0aGUgb3BlcmF0aW9ucyBjaGVja2luZyB0aGUgaW5wdXQgYW5kCi0gICAgICogb3V0cHV0IG1lc3NhZ2VzLiBJZiB1bndyYXBwaW5nIGlzIGRpc2FibGVkIHRoZSBtZXNzYWdlIGVsZW1lbnQgbXVzdCBiZSBoYW5kbGVkIGRpcmVjdGx5IGJ5IGEKLSAgICAgKiBtYXBwaW5nLiBJZiB1bndyYXBwaW5nIGlzIGVuYWJsZWQsIHRoaXMgY2hlY2tzIHRoYXQgdGhlIG1lc3NhZ2UgZWxlbWVudCBpcyBvZiB0aGUgcHJvcGVyIGZvcm0KLSAgICAgKiAoYSBzZXF1ZW5jZSBvZiBvdGhlciBlbGVtZW50cywgd2hpY2ggYWxsIGhhdmUgbWF4T2NjdXJzPSIxIikuIEl0IHRoZW4gZ2VuZXJhdGVzIGFuIHVud3JhcHBpbmcKLSAgICAgKiBkZXNjcmlwdGlvbiBhbmQgYWRkcyBpdCB0byB0aGUgY29kZSBnZW5lcmF0aW9uIGNvbmZpZ3VyYXRpb24sIHdoZXJlIGl0J2xsIGJlIHBpY2tlZCB1cCBhbmQKLSAgICAgKiBpbmNsdWRlZCBpbiB0aGUgWE1MIHBhc3NlZCB0byBjb2RlIGdlbmVyYXRpb24uIFRoaXMgYWxzbyBjb25zdHJ1Y3RzIGEgdHlwZSBtYXBwaW5nLCBzaW5jZQotICAgICAqIHRoYXQncyByZXF1aXJlZCBieSB0aGUgYmFzZSBBeGlzMiBjb2RlIGdlbmVyYXRpb24uIEluIHRoZSBjYXNlIG9mIHVud3JhcHBlZCBlbGVtZW50cywgdGhlCi0gICAgICogdHlwZSBtYXBwaW5nIGluY2x1ZGVzIGEgc3ludGhlc2l6ZWQgcW5hbWUgZm9yIGVhY2ggdW53cmFwcGVkIHBhcmFtZXRlciwgYW5kIHRoZSBkZXRhaWxlZAotICAgICAqIGluZm9ybWF0aW9uIGlzIHNldCBvbiB0aGUgbWVzc2FnZSBpbmZvcm1hdGlvbi4gU291bmQgY29uZnVzaW5nPyBXZWxjb21lIHRvIEF4aXMyIGNvZGUKLSAgICAgKiBnZW5lcmF0aW9uLgotICAgICAqCi0gICAgICogQHBhcmFtIHBhdGggYmluZGluZyBwYXRoICg8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGVuZ2FnZShTdHJpbmcgcGF0aCkgewotCi0gICAgICAgIC8vIG1ha2Ugc3VyZSB0aGUgYmluZGluZyBkZWZpbml0aW9uIGZpbGUgaXMgcHJlc2VudCwgaWYgcGFzc2VkCi0gICAgICAgIEZpbGUgZmlsZSA9IG51bGw7Ci0gICAgICAgIGlmIChwYXRoICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZpbGUgPSBuZXcgRmlsZShwYXRoKTsKLSAgICAgICAgICAgIGlmICghZmlsZS5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJqaWJ4IGJpbmRpbmcgZGVmaW5pdGlvbiBmaWxlICIgKyBwYXRoICsgIiBub3QgZm91bmQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB0cnkgewotCi0gICAgICAgICAgICAvLyBzZXQgZmxhZyBmb3IgdW53cmFwcGluZwotICAgICAgICAgICAgYm9vbGVhbiB1bndyYXAgPSAhY29kZUdlbkNvbmZpZy5pc1BhcmFtZXRlcnNXcmFwcGVkKCk7Ci0KLSAgICAgICAgICAgIC8vIGluaXRpYWxpemUgdGhlIGJpbmRpbmcgaW5mb3JtYXRpb24KLSAgICAgICAgICAgIEJpbmRpbmdFbGVtZW50IGJpbmRpbmcgPSBudWxsOwotICAgICAgICAgICAgaWYgKGZpbGUgPT0gbnVsbCkgewotCi0gICAgICAgICAgICAgICAgLy8gdW53cmFwcGVkIGNhbiBiZSB1c2VkIHdpdGhvdXQgYSBiaW5kaW5nLCBidXQgd3JhcHBlZCByZXF1aXJlcyBvbmUKLSAgICAgICAgICAgICAgICBpZiAoIXVud3JhcCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSmlCWCB3cmFwcGVkIHN1cHBvcnQgcmVxdWlyZXMgYSBiaW5kaW5nIGRlZmluaXRpb24gdG8gYmUgcHJvdmlkZWQgdXNpbmcgdGhlIC1FIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKaUJYRXh0ZW5zaW9uLkJJTkRJTkdfUEFUSF9PUFRJT04gKyAiIHtmaWxlLXBhdGh9IHBhcmFtZXRlciIpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBlbHNlIHsKLQotICAgICAgICAgICAgICAgIC8vIFJlYWQgdGhlIEppQlggYmluZGluZyBkZWZpbml0aW9uIGludG8gbWVtb3J5LiBUaGUgYmluZGluZyBkZWZpbml0aW9uCi0gICAgICAgICAgICAgICAgLy8gaXMgb25seSBwcmV2YWxpZGF0ZWQgc28gYXMgbm90IHRvIHJlcXVpcmUgdGhlIHVzZXIgdG8gaGF2ZSBhbGwKLSAgICAgICAgICAgICAgICAvLyB0aGUgcmVmZXJlbmNlZCBjbGFzc2VzIGluIHRoZSBjbGFzc3BhdGgsIHRob3VnaCB0aGlzIGRvZXMgbWFrZSBmb3IKLSAgICAgICAgICAgICAgICAvLyBhZGRlZCB3b3JrIGluIGZpbmRpbmcgdGhlIG5hbWVzcGFjZXMuCi0gICAgICAgICAgICAgICAgVmFsaWRhdGlvbkNvbnRleHQgdmN0eCA9IEJpbmRpbmdFbGVtZW50Lm5ld1ZhbGlkYXRpb25Db250ZXh0KCk7Ci0gICAgICAgICAgICAgICAgYmluZGluZyA9IEJpbmRpbmdFbGVtZW50LnJlYWRCaW5kaW5nKG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSksIHBhdGgsIHZjdHgpOwotICAgICAgICAgICAgICAgIGJpbmRpbmcuc2V0QmFzZVVybChmaWxlLnRvVVJMKCkpOwotICAgICAgICAgICAgICAgIHZjdHguc2V0QmluZGluZ1Jvb3QoYmluZGluZyk7Ci0gICAgICAgICAgICAgICAgSW5jbHVkZVByZXZhbGlkYXRpb25WaXNpdG9yIGlwdiA9IG5ldyBJbmNsdWRlUHJldmFsaWRhdGlvblZpc2l0b3IodmN0eCk7Ci0gICAgICAgICAgICAgICAgdmN0eC50b3VyVHJlZShiaW5kaW5nLCBpcHYpOwotICAgICAgICAgICAgICAgIGlmICh2Y3R4LmdldEVycm9yQ291bnQoKSAhPSAwIHx8IHZjdHguZ2V0RmF0YWxDb3VudCgpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgQXJyYXlMaXN0IHByb2JzID0gdmN0eC5nZXRQcm9ibGVtcygpOwotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkVycm9ycyBpbiBnZW5lcmF0ZWQgYmluZGluZzoiKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBwcm9icy5zaXplKCk7IGorKykgewotICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdGlvblByb2JsZW0gcHJvYiA9IChWYWxpZGF0aW9uUHJvYmxlbSlwcm9icy5nZXQoaik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50KHByb2IuZ2V0U2V2ZXJpdHkoKSA+PQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0aW9uUHJvYmxlbS5FUlJPUl9MRVZFTCA/ICJFcnJvcjogIiA6ICJXYXJuaW5nOiAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihwcm9iLmdldERlc2NyaXB0aW9uKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJpbnZhbGlkIGppYnggYmluZGluZyBkZWZpbml0aW9uIGZpbGUgIiArIHBhdGgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gY3JlYXRlIHRhYmxlIHdpdGggYWxsIGJ1aWx0LWluIGZvcm1hdCBkZWZpbml0aW9ucwotICAgICAgICAgICAgTWFwIHNpbXBsZVR5cGVNYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICAgICAgYnVpbGRGb3JtYXQoImJ5dGUiLCAiYnl0ZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAib3JnLmppYngucnVudGltZS5VdGlsaXR5LnNlcmlhbGl6ZUJ5dGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5qaWJ4LnJ1bnRpbWUuVXRpbGl0eS5wYXJzZUJ5dGUiLCAiMCIsIHNpbXBsZVR5cGVNYXApOwotICAgICAgICAgICAgYnVpbGRGb3JtYXQoInVuc2lnbmVkU2hvcnQiLCAiY2hhciIsCi0gICAgICAgICAgICAgICAgICAgICAgICAib3JnLmppYngucnVudGltZS5VdGlsaXR5LnNlcmlhbGl6ZUNoYXIiLAotICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5qaWJ4LnJ1bnRpbWUuVXRpbGl0eS5wYXJzZUNoYXIiLCAiMCIsIHNpbXBsZVR5cGVNYXApOwotICAgICAgICAgICAgYnVpbGRGb3JtYXQoImRvdWJsZSIsICJkb3VibGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5qaWJ4LnJ1bnRpbWUuVXRpbGl0eS5zZXJpYWxpemVEb3VibGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5qaWJ4LnJ1bnRpbWUuVXRpbGl0eS5wYXJzZURvdWJsZSIsICIwLjAiLCBzaW1wbGVUeXBlTWFwKTsKLSAgICAgICAgICAgIGJ1aWxkRm9ybWF0KCJmbG9hdCIsICJmbG9hdCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAib3JnLmppYngucnVudGltZS5VdGlsaXR5LnNlcmlhbGl6ZUZsb2F0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuamlieC5ydW50aW1lLlV0aWxpdHkucGFyc2VGbG9hdCIsICIwLjAiLCBzaW1wbGVUeXBlTWFwKTsKLSAgICAgICAgICAgIGJ1aWxkRm9ybWF0KCJpbnQiLCAiaW50IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuamlieC5ydW50aW1lLlV0aWxpdHkuc2VyaWFsaXplSW50IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuamlieC5ydW50aW1lLlV0aWxpdHkucGFyc2VJbnQiLCAiMCIsIHNpbXBsZVR5cGVNYXApOwotICAgICAgICAgICAgYnVpbGRGb3JtYXQoImxvbmciLCAibG9uZyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAib3JnLmppYngucnVudGltZS5VdGlsaXR5LnNlcmlhbGl6ZUxvbmciLAotICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5qaWJ4LnJ1bnRpbWUuVXRpbGl0eS5wYXJzZUxvbmciLCAiMCIsIHNpbXBsZVR5cGVNYXApOwotICAgICAgICAgICAgYnVpbGRGb3JtYXQoInNob3J0IiwgInNob3J0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuamlieC5ydW50aW1lLlV0aWxpdHkuc2VyaWFsaXplU2hvcnQiLAotICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5qaWJ4LnJ1bnRpbWUuVXRpbGl0eS5wYXJzZVNob3J0IiwgIjAiLCBzaW1wbGVUeXBlTWFwKTsKLSAgICAgICAgICAgIGJ1aWxkRm9ybWF0KCJib29sZWFuIiwgImJvb2xlYW4iLAotICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5qaWJ4LnJ1bnRpbWUuVXRpbGl0eS5zZXJpYWxpemVCb29sZWFuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuamlieC5ydW50aW1lLlV0aWxpdHkucGFyc2VCb29sZWFuIiwgImZhbHNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNpbXBsZVR5cGVNYXApOwotICAgICAgICAgICAgYnVpbGRGb3JtYXQoImRhdGVUaW1lIiwgImphdmEudXRpbC5EYXRlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuamlieC5ydW50aW1lLlV0aWxpdHkuc2VyaWFsaXplRGF0ZVRpbWUiLAotICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5qaWJ4LnJ1bnRpbWUuVXRpbGl0eS5kZXNlcmlhbGl6ZURhdGVUaW1lIiwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNpbXBsZVR5cGVNYXApOwotICAgICAgICAgICAgYnVpbGRGb3JtYXQoImRhdGUiLCAiamF2YS5zcWwuRGF0ZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAib3JnLmppYngucnVudGltZS5VdGlsaXR5LnNlcmlhbGl6ZVNxbERhdGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5qaWJ4LnJ1bnRpbWUuVXRpbGl0eS5kZXNlcmlhbGl6ZVNxbERhdGUiLCBudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgc2ltcGxlVHlwZU1hcCk7Ci0gICAgICAgICAgICBidWlsZEZvcm1hdCgidGltZSIsICJqYXZhLnNxbC5UaW1lIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuamlieC5ydW50aW1lLlV0aWxpdHkuc2VyaWFsaXplU3FsVGltZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAib3JnLmppYngucnVudGltZS5VdGlsaXR5LmRlc2VyaWFsaXplU3FsVGltZSIsIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICBzaW1wbGVUeXBlTWFwKTsKLSAgICAgICAgICAgIGJ1aWxkRm9ybWF0KCJiYXNlNjRCaW5hcnkiLCAiYnl0ZVtdIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuamlieC5ydW50aW1lLlV0aWxpdHkuc2VyaWFsaXplQmFzZTY0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuamlieC5ydW50aW1lLlV0aWxpdHkuZGVzZXJpYWxpemVCYXNlNjQiLCBudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgc2ltcGxlVHlwZU1hcCk7Ci0gICAgICAgICAgICBidWlsZEZvcm1hdCgic3RyaW5nIiwgImphdmEubGFuZy5TdHJpbmciLCBudWxsLCBudWxsLCBudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgc2ltcGxlVHlwZU1hcCk7Ci0KLSAgICAgICAgICAgIC8vIGNvbGxlY3QgYWxsIHRoZSB0b3AtbGV2ZWwgbWFwcGluZyBhbmQgZm9ybWF0IGRlZmluaXRpb25zCi0gICAgICAgICAgICBNYXAgZWxlbWVudE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgICAgICBNYXAgY29tcGxleFR5cGVNYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICAgICAgTWFwIGJpbmRpbmdNYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICAgICAgaWYgKGJpbmRpbmcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNvbGxlY3RUb3BMZXZlbENvbXBvbmVudHMoYmluZGluZywgIiIsIGVsZW1lbnRNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV4VHlwZU1hcCwgc2ltcGxlVHlwZU1hcCwgYmluZGluZ01hcCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSBjbGFzc2VzIHdpbGwgYmUgZ2VuZXJhdGVkIGZvciBhYnN0cmFjdCBtYXBwaW5ncwotICAgICAgICAgICAgaWYgKHVud3JhcCAmJiBjb21wbGV4VHlwZU1hcC5zaXplKCkgPiAwICYmIChiaW5kaW5nID09IG51bGwgfHwgIWJpbmRpbmcuaXNGb3JjZUNsYXNzZXMoKSkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICJ1bndyYXBwZWQgYmluZGluZyBtdXN0IHVzZSBmb3JjZS1jbGFzc2VzPSd0cnVlJyBvcHRpb24gaW4gIiArIHBhdGgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBmb3JjZSBvZmYgaW5hcHByb3ByaWF0ZSBvcHRpb24gKHNldCBieSBlcnJvciBpbiBvcHRpb25zIGhhbmRsaW5nKQotICAgICAgICAgICAgY29kZUdlbkNvbmZpZy5zZXRQYWNrQ2xhc3NlcyhmYWxzZSk7Ci0KLSAgICAgICAgICAgIC8vIGNvbmZpZ3VyZSBoYW5kbGluZyBmb3IgYWxsIG9wZXJhdGlvbnMgb2Ygc2VydmljZQotICAgICAgICAgICAgY29kZUdlbkNvbmZpZy5zZXRUeXBlTWFwcGVyKG5ldyBOYW1lZFBhcmFtZXRlclR5cGVNYXBwZXIoKSk7Ci0gICAgICAgICAgICBJdGVyYXRvciBvcGVyYXRpb25zID0gY29kZUdlbkNvbmZpZy5nZXRBeGlzU2VydmljZSgpLmdldE9wZXJhdGlvbnMoKTsKLSAgICAgICAgICAgIERvY3VtZW50IGRvYyA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdEb2N1bWVudEJ1aWxkZXIoKS5uZXdEb2N1bWVudCgpOwotICAgICAgICAgICAgaW50IG9waW5kZXggPSAwOwotICAgICAgICAgICAgTWFwIHR5cGVNYXBwZWRDbGFzc01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgICAgICBTdHJpbmcgbWFwcGVkY2xhc3MgPSBudWxsOwotICAgICAgICAgICAgU2V0IG9iamlucyA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgICAgICAgICBTZXQgb2Jqb3V0cyA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgICAgICAgICBTZXQgb2JqZmF1bHRzID0gbmV3IEhhc2hTZXQoKTsKLSAgICAgICAgICAgIE1hcCBuc01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgICAgICBBcnJheUxpc3Qgd3JhcHBlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICB3aGlsZSAob3BlcmF0aW9ucy5oYXNOZXh0KCkpIHsKLQotICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgYmFzaWMgb3BlcmF0aW9uIGluZm9ybWF0aW9uCi0gICAgICAgICAgICAgICAgQXhpc09wZXJhdGlvbiBvcCA9IChBeGlzT3BlcmF0aW9uKW9wZXJhdGlvbnMubmV4dCgpOwotICAgICAgICAgICAgICAgIFN0cmluZyBtZXAgPSBvcC5nZXRNZXNzYWdlRXhjaGFuZ2VQYXR0ZXJuKCk7Ci0gICAgICAgICAgICAgICAgQXhpc01lc3NhZ2UgaW5tc2cgPSBudWxsOwotICAgICAgICAgICAgICAgIEF4aXNNZXNzYWdlIG91dG1zZyA9IG51bGw7Ci0gICAgICAgICAgICAgICAgaWYgKFdTRExVdGlsLmlzSW5wdXRQcmVzZW50Rm9yTUVQKG1lcCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaW5tc2cgPSBvcC5nZXRNZXNzYWdlKFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9JTl9WQUxVRSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpbm1zZyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIGlucHV0IG1lc3NhZ2Ugbm90IGZvdW5kIGZvciBvcGVyYXRpb24gIiArIG9wLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgQXJyYXlMaXN0IGhlYWRlcnMgPSBpbm1zZy5nZXRTb2FwSGVhZGVycygpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGhlYWRlcnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNPQVBIZWFkZXJNZXNzYWdlIGhlYWRlciA9IChTT0FQSGVhZGVyTWVzc2FnZSloZWFkZXJzLmdldChpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjbmFtZSA9IG1hcE1lc3NhZ2UoaGVhZGVyLCBlbGVtZW50TWFwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9iamlucy5hZGQoY25hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hcHBlZGNsYXNzID09IG51bGwgJiYgaXNMb29rdXBDbGFzcyhjbmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBwZWRjbGFzcyA9IGNuYW1lOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChXU0RMVXRpbC5pc091dHB1dFByZXNlbnRGb3JNRVAobWVwKSkgewotICAgICAgICAgICAgICAgICAgICBvdXRtc2cgPSBvcC5nZXRNZXNzYWdlKFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9PVVRfVkFMVUUpOwotICAgICAgICAgICAgICAgICAgICBpZiAob3V0bXNnID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgb3V0cHV0IG1lc3NhZ2Ugbm90IGZvdW5kIGZvciBvcGVyYXRpb24gIiArIG9wLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgQXJyYXlMaXN0IGhlYWRlcnMgPSBvdXRtc2cuZ2V0U29hcEhlYWRlcnMoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBoZWFkZXJzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTT0FQSGVhZGVyTWVzc2FnZSBoZWFkZXIgPSAoU09BUEhlYWRlck1lc3NhZ2UpaGVhZGVycy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY25hbWUgPSBtYXBNZXNzYWdlKGhlYWRlciwgZWxlbWVudE1hcCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvYmpvdXRzLmFkZChjbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWFwcGVkY2xhc3MgPT0gbnVsbCAmJiBpc0xvb2t1cENsYXNzKGNuYW1lKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBlZGNsYXNzID0gY25hbWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHVud3JhcCkgewotCi0gICAgICAgICAgICAgICAgICAgIC8vIHVzZSB1bndyYXBwaW5nIGZvciBib3RoIGlucHV0IGFuZCBvdXRwdXQKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlY2VpdmVybmFtZSA9ICJqaWJ4UmVjZWl2ZXIiICsgb3BpbmRleCsrOwotICAgICAgICAgICAgICAgICAgICBFbGVtZW50IGRibWV0aG9kID0gZG9jLmNyZWF0ZUVsZW1lbnQoImRibWV0aG9kIik7Ci0gICAgICAgICAgICAgICAgICAgIGRibWV0aG9kLnNldEF0dHJpYnV0ZSgicmVjZWl2ZXItbmFtZSIsIHJlY2VpdmVybmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGRibWV0aG9kLnNldEF0dHJpYnV0ZSgibWV0aG9kLW5hbWUiLCBvcC5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICBTZXQgbmFtZXNldCA9IG5ldyBIYXNoU2V0KHNfcmVzZXJ2ZWRXb3Jkcyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpbm1zZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50IHdyYXBwZXIgPSB1bndyYXBNZXNzYWdlKGlubXNnLCBmYWxzZSwgc2ltcGxlVHlwZU1hcCwgZWxlbWVudE1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxleFR5cGVNYXAsIHR5cGVNYXBwZWRDbGFzc01hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZGluZ01hcCwgbmFtZXNldCwgbnNNYXAsIGRvYyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkYm1ldGhvZC5hcHBlbmRDaGlsZCh3cmFwcGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBwZXJzLmFkZCh3cmFwcGVyKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAob3V0bXNnICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgd3JhcHBlciA9IHVud3JhcE1lc3NhZ2Uob3V0bXNnLCB0cnVlLCBzaW1wbGVUeXBlTWFwLCBlbGVtZW50TWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV4VHlwZU1hcCwgdHlwZU1hcHBlZENsYXNzTWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kaW5nTWFwLCBuYW1lc2V0LCBuc01hcCwgZG9jKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRibWV0aG9kLmFwcGVuZENoaWxkKHdyYXBwZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlcnMuYWRkKHdyYXBwZXIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gc2F2ZSB1bndyYXBwaW5nIGluZm9ybWF0aW9uIGZvciB1c2UgaW4gY29kZSBnZW5lcmF0aW9uCi0gICAgICAgICAgICAgICAgICAgIG9wLmFkZFBhcmFtZXRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUGFyYW1ldGVyKENvbnN0YW50cy5EQVRBQklORElOR19HRU5FUkFURURfUkVDRUlWRVIsIHJlY2VpdmVybmFtZSkpOwotICAgICAgICAgICAgICAgICAgICBvcC5hZGRQYXJhbWV0ZXIobmV3IFBhcmFtZXRlcihDb25zdGFudHMuREFUQUJJTkRJTkdfR0VORVJBVEVEX0lNUExFTUVOVEFUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCb29sZWFuLlRSVUUpKTsKLSAgICAgICAgICAgICAgICAgICAgb3AuYWRkUGFyYW1ldGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBQYXJhbWV0ZXIoQ29uc3RhbnRzLkRBVEFCSU5ESU5HX09QRVJBVElPTl9ERVRBSUxTLCBkYm1ldGhvZCkpOwotCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLQotICAgICAgICAgICAgICAgICAgICAvLyBjb25jcmV0ZSBtYXBwaW5ncywganVzdCBzYXZlIHRoZSBtYXBwZWQgY2xhc3MgbmFtZShzKQotICAgICAgICAgICAgICAgICAgICBpZiAoaW5tc2cgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNuYW1lID0gbWFwTWVzc2FnZShpbm1zZywgZWxlbWVudE1hcCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvYmppbnMuYWRkKGNuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXBwZWRjbGFzcyA9PSBudWxsICYmIGlzTG9va3VwQ2xhc3MoY25hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGVkY2xhc3MgPSBjbmFtZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAob3V0bXNnICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjbmFtZSA9IG1hcE1lc3NhZ2Uob3V0bXNnLCBlbGVtZW50TWFwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9iam91dHMuYWRkKGNuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXBwZWRjbGFzcyA9PSBudWxsICYmIGlzTG9va3VwQ2xhc3MoY25hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGVkY2xhc3MgPSBjbmFtZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gYWx3YXlzIGhhbmRsZSBmYXVsdHMgYXMgd3JhcHBlZAotICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IG9wLmdldEZhdWx0TWVzc2FnZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNuYW1lID0gbWFwTWVzc2FnZSgoQXhpc01lc3NhZ2UpaXRlci5uZXh0KCksIGVsZW1lbnRNYXApOwotICAgICAgICAgICAgICAgICAgICBvYmpmYXVsdHMuYWRkKGNuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1hcHBlZGNsYXNzID09IG51bGwgJiYgaXNMb29rdXBDbGFzcyhjbmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBlZGNsYXNzID0gY25hbWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGNoZWNrIGZvciBkZWZhdWx0IG5hbWVzcGFjZSB1c2FnZSB3aXRoaW4gYmluZGluZ3Mgb3Igd3JhcHBlcnMKLSAgICAgICAgICAgIC8vICAobWVhbmluZyB3ZSBjYW4ndCBkZWNsYXJlIGEgY29uZmxpY3RpbmcgZGVmYXVsdCBuYW1lc3BhY2UpCi0gICAgICAgICAgICBDb2xsZWN0aW9uIHByZWZpeGVzID0gbnNNYXAudmFsdWVzKCk7Ci0gICAgICAgICAgICBib29sZWFuIGRmbHRucyA9IHByZWZpeGVzLmNvbnRhaW5zKCIiKTsKLSAgICAgICAgICAgIGJvb2xlYW4gd3JhcGRmbHQgPSBmYWxzZTsKLSAgICAgICAgICAgIGlmICghZGZsdG5zKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB3cmFwcGVycy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBFbGVtZW50IHdyYXBwZXIgPSAoRWxlbWVudCl3cmFwcGVycy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgidHJ1ZSIuZXF1YWxzKHdyYXBwZXIuZ2V0QXR0cmlidXRlKCJ1c2VzLWRlZmF1bHQiKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBkZmx0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBmaW5kIGEgcHJlZml4IHRoYXQgd2UgY2FuIHVzZSB3aGVyZSBuZWVkZWQgZm9yIGV4dHJhIG5hbWVzcGFjZQotICAgICAgICAgICAgU3RyaW5nIHh0cmFwcmVmID0gIiI7Ci0gICAgICAgICAgICBpZiAoZGZsdG5zIHx8IHdyYXBkZmx0KSB7Ci0gICAgICAgICAgICAgICAgeHRyYXByZWYgPSAiXyI7Ci0gICAgICAgICAgICAgICAgaW50IGluZGV4ID0gMDsKLSAgICAgICAgICAgICAgICB3aGlsZSAocHJlZml4ZXMuY29udGFpbnMoeHRyYXByZWYpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHh0cmFwcmVmID0gIl8iICsgaW5kZXgrKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGZvciBlYWNoIHdyYXBwZXIgKGlucHV0IGFuZCBvdXRwdXQpLCBkZXRlcm1pbmUgd2hhdCBhZGRpdGlvbmFsCi0gICAgICAgICAgICAvLyAgbmFtZXNwYWNlcyBuZWVkIHRvIGJlIGRlY2xhcmVkLCB3aGF0IHByZWZpeCBpcyB0byBiZSB1c2VkIGZvcgotICAgICAgICAgICAgLy8gIHRoZSB3cmFwcGVyIGVsZW1lbnQsIGFuZCB3aGF0IHByZWZpeCB0byBiZSB1c2VkIGZvciBlYWNoIGNoaWxkCi0gICAgICAgICAgICAvLyAgZWxlbWVudAotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB3cmFwcGVycy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIEVsZW1lbnQgd3JhcHBlciA9IChFbGVtZW50KXdyYXBwZXJzLmdldChpKTsKLSAgICAgICAgICAgICAgICBib29sZWFuIGFkZG5zID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG5zID0gd3JhcHBlci5nZXRBdHRyaWJ1dGUoIm5zIik7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHByZWZpeCA9ICIiOwotICAgICAgICAgICAgICAgIGlmICgidHJ1ZSIuZXF1YWxzKHdyYXBwZXIuZ2V0QXR0cmlidXRlKCJuZWVkLW5hbWVzcGFjZXMiKSkpIHsKLQotICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBleHRyYSBkZWZpbml0aW9uIG5lZWRlZCBmb3Igd3JhcHBlciBuYW1lc3BhY2UKLSAgICAgICAgICAgICAgICAgICAgaWYgKCEiIi5lcXVhbHMobnMpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGZsdG5zIHx8IHdyYXBkZmx0KSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZWVkIGEgbmFtZXNwYWNlLCBjYW4ndCBiZSBkZWZhdWx0LCBnZXQgb3Igc2V0IGl0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gKFN0cmluZyluc01hcC5nZXQobnMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSB4dHJhcHJlZjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkbnMgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGp1c3QgbWFrZSB0aGUgd3JhcHBlciBuYW1lc3BhY2UgdGhlIGRlZmF1bHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSAiIjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRucyA9IHRydWU7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB3cmFwcGVyLnNldEF0dHJpYnV0ZSgicHJlZml4IiwgcHJlZml4KTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBzZXQgcHJlZml4ZXMgZm9yIGNoaWxkIGVsZW1lbnRzIG9mIHdyYXBwZXIKLSAgICAgICAgICAgICAgICAgICAgTm9kZSBub2RlID0gd3JhcHBlci5nZXRGaXJzdENoaWxkKCk7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlIChub2RlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50IGVsZW1lbnQgPSAoRWxlbWVudClub2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsbmFtZSA9IGVsZW1lbnQuZ2V0Tm9kZU5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoInBhcmFtZXRlci1lbGVtZW50Ii5lcXVhbHMobG5hbWUpIHx8ICJyZXR1cm4tZWxlbWVudCIuZXF1YWxzKGxuYW1lKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjaGlsZG5zID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoIm5zIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgiIi5lcXVhbHMoY2hpbGRucykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCJwcmVmaXgiLCAiIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobnMuZXF1YWxzKGNoaWxkbnMpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgicHJlZml4IiwgcHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjaGlsZHByZWZpeCA9IChTdHJpbmcpbnNNYXAuZ2V0KGNoaWxkbnMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkcHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVW5hYmxlIHRvIHNldCBuYW1lc3BhY2UgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZG5zICsgIiBmb3IgY2hpbGQgZWxlbWVudCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoInByZWZpeCIsIGNoaWxkcHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUgPSBub2RlLmdldE5leHRTaWJsaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgZXh0cmEgZGVmaW5pdGlvbiBuZWVkZWQgZm9yIHdyYXBwZXIgbmFtZXNwYWNlCi0gICAgICAgICAgICAgICAgICAgIGlmICghIiIuZXF1YWxzKG5zKSkgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBqdXN0IG1ha2UgdGhlIHdyYXBwZXIgbmFtZXNwYWNlIHRoZSBkZWZhdWx0Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSAiIjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZG5zID0gdHJ1ZTsKLQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHdyYXBwZXIuc2V0QXR0cmlidXRlKCJwcmVmaXgiLCBwcmVmaXgpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIHNldCBwcmVmaXhlcyBmb3IgY2hpbGQgZWxlbWVudHMgb2Ygd3JhcHBlcgotICAgICAgICAgICAgICAgICAgICBOb2RlIG5vZGUgPSB3cmFwcGVyLmdldEZpcnN0Q2hpbGQoKTsKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG5vZGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgZWxlbWVudCA9IChFbGVtZW50KW5vZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxuYW1lID0gZWxlbWVudC5nZXROb2RlTmFtZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgicGFyYW1ldGVyLWVsZW1lbnQiLmVxdWFscyhsbmFtZSkgfHwgInJldHVybi1lbGVtZW50Ii5lcXVhbHMobG5hbWUpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNoaWxkbnMgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgibnMiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCIiLmVxdWFscyhjaGlsZG5zKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoInByZWZpeCIsICIiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChucy5lcXVhbHMoY2hpbGRucykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCJwcmVmaXgiLCBwcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlVuYWJsZSB0byBzZXQgbmFtZXNwYWNlICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZG5zICsgIiBmb3IgY2hpbGQgZWxlbWVudCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbm9kZSA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChhZGRucykgewotICAgICAgICAgICAgICAgICAgICBFbGVtZW50IGFkZGVkbnMgPSBkb2MuY3JlYXRlRWxlbWVudCgiZXh0cmEtbmFtZXNwYWNlIik7Ci0gICAgICAgICAgICAgICAgICAgIGFkZGVkbnMuc2V0QXR0cmlidXRlKCJucyIsIG5zKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkZWRucy5zZXRBdHRyaWJ1dGUoInByZWZpeCIsIHByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgIHdyYXBwZXIuYXBwZW5kQ2hpbGQoYWRkZWRucyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBhZGQgdHlwZSB1c2FnZSBpbmZvcm1hdGlvbiBmb3IgYmluZGluZyBpbml0aWFsaXphdGlvbgotICAgICAgICAgICAgTGlzdCBkZXRhaWxzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgRWxlbWVudCBiaW5kaW5pdCA9IGRvYy5jcmVhdGVFbGVtZW50KCJpbml0aWFsaXplLWJpbmRpbmciKTsKLSAgICAgICAgICAgIGlmICghdHlwZU1hcHBlZENsYXNzTWFwLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHR5cGVNYXBwZWRDbGFzc01hcC5rZXlTZXQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICAgICAgUU5hbWUgdG5hbWUgPSAoUU5hbWUpaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBjbHNpbmRleCA9ICgoSW50ZWdlcil0eXBlTWFwcGVkQ2xhc3NNYXAuZ2V0KHRuYW1lKSkudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgRWxlbWVudCBkZXRhaWwgPSBkb2MuY3JlYXRlRWxlbWVudCgiYWJzdHJhY3QtdHlwZSIpOwotICAgICAgICAgICAgICAgICAgICBkZXRhaWwuc2V0QXR0cmlidXRlKCJucyIsIHRuYW1lLmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICAgICAgICAgICAgICAgICAgZGV0YWlsLnNldEF0dHJpYnV0ZSgibmFtZSIsIHRuYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgZGV0YWlsLnNldEF0dHJpYnV0ZSgidHlwZS1pbmRleCIsIGNsc2luZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgYmluZGluaXQuYXBwZW5kQ2hpbGQoZGV0YWlsKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1hcHBlZGNsYXNzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmdFbGVtZW50QmFzZSBtYXBwaW5nID0gKE1hcHBpbmdFbGVtZW50QmFzZSljb21wbGV4VHlwZU1hcC5nZXQodG5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGVkY2xhc3MgPSBtYXBwaW5nLmdldENsYXNzTmFtZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBzZXQgYmluZGluZyBsb29rdXAgcGFyYW1ldGVycwotICAgICAgICAgICAgaWYgKGJpbmRpbmcgIT0gbnVsbCAmJiBiaW5kaW5nLmdldE5hbWUoKSAhPSBudWxsICYmIGJpbmRpbmcuZ2V0VGFyZ2V0UGFja2FnZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBiaW5kaW5pdC5zZXRBdHRyaWJ1dGUoImJpbmRpbmctbmFtZSIsIGJpbmRpbmcuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICBiaW5kaW5pdC5zZXRBdHRyaWJ1dGUoImJpbmRpbmctcGFja2FnZSIsIGJpbmRpbmcuZ2V0VGFyZ2V0UGFja2FnZSgpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1hcHBlZGNsYXNzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbWFwcGVkY2xhc3MgPSAiIjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYmluZGluaXQuc2V0QXR0cmlidXRlKCJib3VuZC1jbGFzcyIsIG1hcHBlZGNsYXNzKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gaW5jbHVkZSBiaW5kaW5nIG5hbWVzcGFjZXMgaW4gaW5pdGlhbGl6YXRpb24gZGF0YQotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gbnNNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG5zID0gKFN0cmluZylpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gKFN0cmluZyluc01hcC5nZXQobnMpOwotICAgICAgICAgICAgICAgIEVsZW1lbnQgZGV0YWlsID0gZG9jLmNyZWF0ZUVsZW1lbnQoImJpbmRpbmctbmFtZXNwYWNlIik7Ci0gICAgICAgICAgICAgICAgZGV0YWlsLnNldEF0dHJpYnV0ZSgibnMiLCBucyk7Ci0gICAgICAgICAgICAgICAgZGV0YWlsLnNldEF0dHJpYnV0ZSgicHJlZml4IiwgcHJlZml4KTsKLSAgICAgICAgICAgICAgICBiaW5kaW5pdC5hcHBlbmRDaGlsZChkZXRhaWwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGV0YWlscy5hZGQoYmluZGluaXQpOwotCi0gICAgICAgICAgICAvLyBhZGQgZGV0YWlscyBmb3IgYWxsIG9iamVjdHMgdXNlZCBhcyBpbnB1dHMvb3V0cHV0cy9mYXVsdHMKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IG9iamlucy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgY2xhc3NuYW1lID0gKFN0cmluZylpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBFbGVtZW50IGRldGFpbCA9IGRvYy5jcmVhdGVFbGVtZW50KCJvYmplY3QtaW5wdXQiKTsKLSAgICAgICAgICAgICAgICBkZXRhaWwuc2V0QXR0cmlidXRlKCJ0eXBlIiwgY2xhc3NuYW1lKTsKLSAgICAgICAgICAgICAgICBkZXRhaWxzLmFkZChkZXRhaWwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gb2Jqb3V0cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgY2xhc3NuYW1lID0gKFN0cmluZylpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBFbGVtZW50IGRldGFpbCA9IGRvYy5jcmVhdGVFbGVtZW50KCJvYmplY3Qtb3V0cHV0Iik7Ci0gICAgICAgICAgICAgICAgZGV0YWlsLnNldEF0dHJpYnV0ZSgidHlwZSIsIGNsYXNzbmFtZSk7Ci0gICAgICAgICAgICAgICAgZGV0YWlscy5hZGQoZGV0YWlsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IG9iamZhdWx0cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgY2xhc3NuYW1lID0gKFN0cmluZylpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBFbGVtZW50IGRldGFpbCA9IGRvYy5jcmVhdGVFbGVtZW50KCJvYmplY3QtZmF1bHQiKTsKLSAgICAgICAgICAgICAgICBkZXRhaWwuc2V0QXR0cmlidXRlKCJ0eXBlIiwgY2xhc3NuYW1lKTsKLSAgICAgICAgICAgICAgICBkZXRhaWxzLmFkZChkZXRhaWwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY29kZUdlbkNvbmZpZy5nZXRBeGlzU2VydmljZSgpCi0gICAgICAgICAgICAgICAgICAgIC5hZGRQYXJhbWV0ZXIobmV3IFBhcmFtZXRlcihDb25zdGFudHMuREFUQUJJTkRJTkdfU0VSVklDRV9ERVRBSUxTLCBkZXRhaWxzKSk7Ci0KLSAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9IGNhdGNoIChKaUJYRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrIGlmIGEgY2xhc3MgaXMgcG90ZW50aWFsbHkgdXNhYmxlIGZvciBsb29raW5nIHVwIGJpbmRpbmcgaW5mb3JtYXRpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdHlwZSBmdWxseS1xdWFsaWZpZWQgdHlwZSBuYW1lCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBwb3RlbnRpYWxseSB1c2FibGUsIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBub3QKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTG9va3VwQ2xhc3MoU3RyaW5nIHR5cGUpIHsKLSAgICAgICAgcmV0dXJuICF0eXBlLnN0YXJ0c1dpdGgoImphdmEuIikgJiYgIXR5cGUuc3RhcnRzV2l0aCgiamF2YXguIikgJiYKLSAgICAgICAgICAgICAgICAhdHlwZS5zdGFydHNXaXRoKCJvcmcudzNjLiIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZCBmb3JtYXQgZGVmaW5pdGlvbiBmb3IgdHlwZSB3aXRoIGJ1aWx0LWluIEppQlggaGFuZGxpbmcgdG8gbWFwLgotICAgICAqCi0gICAgICogQHBhcmFtIHN0eXBlIHNjaGVtYSB0eXBlIG5hbWUKLSAgICAgKiBAcGFyYW0ganR5cGUgamF2YSB0eXBlIG5hbWUKLSAgICAgKiBAcGFyYW0gc25hbWUgc2VyaWFsaXplciBtZXRob2QgbmFtZQotICAgICAqIEBwYXJhbSBkbmFtZSBkZXNlcmlhbGl6ZXIgbWV0aG9kIG5hbWUKLSAgICAgKiBAcGFyYW0gZGZsdCAgZGVmYXVsdCB2YWx1ZQotICAgICAqIEBwYXJhbSBtYXAgICBzY2hlbWEgdHlwZSBxbmFtZSB0byBmb3JtYXQgZGVmaW5pdGlvbiBtYXAKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGJ1aWxkRm9ybWF0KFN0cmluZyBzdHlwZSwgU3RyaW5nIGp0eXBlLCBTdHJpbmcgc25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZG5hbWUsIFN0cmluZyBkZmx0LCBNYXAgbWFwKSB7Ci0gICAgICAgIEZvcm1hdEVsZW1lbnQgZm9ybWF0ID0gbmV3IEZvcm1hdEVsZW1lbnQoKTsKLSAgICAgICAgZm9ybWF0LnNldFR5cGVOYW1lKGp0eXBlKTsKLSAgICAgICAgZm9ybWF0LnNldFNlcmlhbGl6ZXJOYW1lKHNuYW1lKTsKLSAgICAgICAgZm9ybWF0LnNldERlc2VyaWFsaXplck5hbWUoZG5hbWUpOwotICAgICAgICBmb3JtYXQuc2V0RGVmYXVsdFRleHQoZGZsdCk7Ci0gICAgICAgIG1hcC5wdXQobmV3IFFOYW1lKFNDSEVNQV9OQU1FU1BBQ0UsIHN0eXBlKSwgZm9ybWF0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBIYW5kbGVzIHVud3JhcHBpbmcgYSBtZXNzYWdlLiBUaGlzIGdlbmVyYXRlcyBhbmQgcmV0dXJucyB0aGUgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgaG93IHRoZQotICAgICAqIG1lc3NhZ2UgaXMgdG8gYmUgdW53cmFwcGVkLiBJdCBhbHNvIGNyZWF0ZXMgdGhlIGRhdGEgc3RydWN0dXJlcyBleHBlY3RlZCBieSB0aGUgY29kZQotICAgICAqIGdlbmVyYXRpb24gaW4gb3JkZXIgdG8gYmUgc29tZXdoYXQgY29tcGF0aWJsZSB3aXRoIEFEQiB1bndyYXBwaW5nLgotICAgICAqCi0gICAgICogQHBhcmFtIG1zZyAgICAgICAgICAgICAgICBtZXNzYWdlIHRvIGJlIHVud3JhcHBlZAotICAgICAqIEBwYXJhbSBpc291dCAgICAgICAgICAgICAgb3V0cHV0IG1lc3NhZ2UgZmxhZyAod3JhcHBlciBpbmhlcml0cyBpbm5lciB0eXBlLCBmb3IgWFNMVHMpCi0gICAgICogQHBhcmFtIHNpbXBsZVR5cGVNYXAgICAgICBiaW5kaW5nIGZvcm1hdHMKLSAgICAgKiBAcGFyYW0gZWxlbWVudE1hcCAgICAgICAgIG1hcCBmcm9tIGVsZW1lbnQgbmFtZXMgdG8gY29uY3JldGUgbWFwcGluZyBjb21wb25lbnRzIG9mIGJpbmRpbmcKLSAgICAgKiBAcGFyYW0gY29tcGxleFR5cGVNYXAgICAgIGJpbmRpbmcgbWFwcGluZ3MKLSAgICAgKiBAcGFyYW0gdHlwZU1hcHBlZENsYXNzTWFwIG1hcCBmcm9tIHR5cGUgcW5hbWUgdG8gaW5kZXgKLSAgICAgKiBAcGFyYW0gYmluZGluZ01hcCAgICAgICAgIG1hcCBmcm9tIG1hcHBpbmcgY29tcG9uZW50cyB0byBjb250YWluaW5nIGJpbmRpbmcgZGVmaW5pdGlvbgotICAgICAqIEBwYXJhbSBuYW1lc2V0ICAgICAgICAgICAgcGFyYW1ldGVyIHZhcmlhYmxlIG5hbWVzIHVzZWQgaW4gbWV0aG9kCi0gICAgICogQHBhcmFtIG5zbWFwICAgICAgICAgICAgICBtYXByIGZyb20gVVJJIHRvIHByZWZpeCBmb3IgbmFtZXNwYWNlcyB0byBiZSBkZWZpbmVkIG9uIHdyYXBwZXIKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQKLSAgICAgKiBAcGFyYW0gZG9jICAgICAgICAgICAgICAgIGRvY3VtZW50IHVzZWQgZm9yIERPTSBjb21wb25lbnRzCi0gICAgICogQHJldHVybiBkZXRhaWxlZCBkZXNjcmlwdGlvbiBlbGVtZW50IGZvciBjb2RlIGdlbmVyYXRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIEVsZW1lbnQgdW53cmFwTWVzc2FnZShBeGlzTWVzc2FnZSBtc2csIGJvb2xlYW4gaXNvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwIHNpbXBsZVR5cGVNYXAsIE1hcCBlbGVtZW50TWFwLCBNYXAgY29tcGxleFR5cGVNYXAsIE1hcCB0eXBlTWFwcGVkQ2xhc3NNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwIGJpbmRpbmdNYXAsIFNldCBuYW1lc2V0LCBNYXAgbnNtYXAsIERvY3VtZW50IGRvYykgewotCi0gICAgICAgIC8vIGZpbmQgdGhlIHNjaGVtYSBkZWZpbml0aW9uIGZvciB0aGlzIG1lc3NhZ2UgZWxlbWVudAotICAgICAgICBRTmFtZSBxbmFtZSA9IG1zZy5nZXRFbGVtZW50UU5hbWUoKTsKLSAgICAgICAgaWYgKHFuYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJObyBlbGVtZW50IHJlZmVyZW5jZSBpbiBtZXNzYWdlICIgKyBtc2cuZ2V0TmFtZSgpKTsKLSAgICAgICAgfQotICAgICAgICBYbWxTY2hlbWFFbGVtZW50IHdyYXBkZWYgPSBjb2RlR2VuQ29uZmlnLmdldEF4aXNTZXJ2aWNlKCkuZ2V0U2NoZW1hRWxlbWVudChxbmFtZSk7Ci0gICAgICAgIGlmICh3cmFwZGVmID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJDYW5ub3QgdW53cmFwIC0gbm8gZGVmaW5pdGlvbiBmb3VuZCBmb3IgZWxlbWVudCAiICsgcW5hbWUpOwotICAgICAgICB9Ci0gICAgICAgIFhtbFNjaGVtYVR5cGUgdHlwZSA9IHdyYXBkZWYuZ2V0U2NoZW1hVHlwZSgpOwotCi0gICAgICAgIC8vIGNyZWF0ZSBkb2N1bWVudCB0byBob2xkIGRhdGEgYmluZGluZyBkZXRhaWxzIGZvciBlbGVtZW50Ci0gICAgICAgIEVsZW1lbnQgd3JhcGRldGFpbCA9IGRvYy5jcmVhdGVFbGVtZW50KGlzb3V0ID8gIm91dC13cmFwcGVyIiA6ICJpbi13cmFwcGVyIik7Ci0gICAgICAgIHdyYXBkZXRhaWwuc2V0QXR0cmlidXRlKCJucyIsIHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICAgICAgd3JhcGRldGFpbC5zZXRBdHRyaWJ1dGUoIm5hbWUiLCBxbmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0KLSAgICAgICAgLy8gZGlnIGRvd24gdG8gdGhlIGNvbXBsZXhUeXBlIHBhcnRpY2xlCi0gICAgICAgIExpc3QgcGFydE5hbWVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBTdHJpbmcgd3JhcHBlcnR5cGUgPSAiIjsKLSAgICAgICAgYm9vbGVhbiBub25zID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkubGVuZ3RoKCkgPT0gMDsKLSAgICAgICAgYm9vbGVhbiBkZmx0bnMgPSBmYWxzZTsKLSAgICAgICAgYm9vbGVhbiBjb21wbGV4ID0gZmFsc2U7Ci0gICAgICAgIGlmICh0eXBlIGluc3RhbmNlb2YgWG1sU2NoZW1hQ29tcGxleFR5cGUpIHsKLSAgICAgICAgICAgIFhtbFNjaGVtYUNvbXBsZXhUeXBlIGN0eXBlID0gKFhtbFNjaGVtYUNvbXBsZXhUeXBlKXR5cGU7Ci0gICAgICAgICAgICBpZiAoY3R5cGUuZ2V0QXR0cmlidXRlcygpLmdldENvdW50KCkgIT0gMCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJDYW5ub3QgdW53cmFwIGVsZW1lbnQgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICBxbmFtZSArICI6IGF0dHJpYnV0ZXMgbm90IGFsbG93ZWQgb24gdHlwZSB0byBiZSB1bndyYXBwZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFhtbFNjaGVtYVBhcnRpY2xlIHBhcnRpY2xlID0gY3R5cGUuZ2V0UGFydGljbGUoKTsKLSAgICAgICAgICAgIGlmIChwYXJ0aWNsZSAhPSBudWxsKSB7Ci0KLSAgICAgICAgICAgICAgICAvLyBpZiB0aGVyZSdzIGEgcGFydGljbGUgcHJlc2VudCwgaXQgbXVzdCBiZSBhIHNlcXVlbmNlCi0gICAgICAgICAgICAgICAgaWYgKCEocGFydGljbGUgaW5zdGFuY2VvZiBYbWxTY2hlbWFTZXF1ZW5jZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkNhbm5vdCB1bndyYXAgZWxlbWVudCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBxbmFtZSArICI6IHR5cGUgdG8gYmUgdW53cmFwcGVkIG11c3QgYmUgYSBzZXF1ZW5jZSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAocGFydGljbGUuZ2V0TWluT2NjdXJzKCkgIT0gMSB8fCBwYXJ0aWNsZS5nZXRNYXhPY2N1cnMoKSAhPSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJDYW5ub3QgdW53cmFwIGVsZW1lbnQgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcW5hbWUgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICI6IGNvbnRhaW5lZCBzZXF1ZW5jZSBtdXN0IGhhdmUgbWluT2NjdXJzPScxJyBhbmQgbWF4T2NjdXJzPScxJyIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBYbWxTY2hlbWFTZXF1ZW5jZSBzZXF1ZW5jZSA9IChYbWxTY2hlbWFTZXF1ZW5jZSlwYXJ0aWNsZTsKLQotICAgICAgICAgICAgICAgIC8vIGFkZCBjaGlsZCBwYXJhbSBlbGVtZW50IG1hdGNoaW5nIGVhY2ggY2hpbGQgb2Ygd3JhcHBlciBlbGVtZW50Ci0gICAgICAgICAgICAgICAgUU5hbWUgb3BOYW1lID0gbXNnLmdldEF4aXNPcGVyYXRpb24oKS5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgWG1sU2NoZW1hT2JqZWN0Q29sbGVjdGlvbiBpdGVtcyA9IHNlcXVlbmNlLmdldEl0ZW1zKCk7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBmaXJzdCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gaXRlbXMuZ2V0SXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgdGhhdCBjaGlsZCBpdGVtIG9iZXlzIHRoZSB1bndyYXBwaW5nIHJ1bGVzCi0gICAgICAgICAgICAgICAgICAgIFhtbFNjaGVtYVBhcnRpY2xlIGl0ZW0gPSAoWG1sU2NoZW1hUGFydGljbGUpaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghKGl0ZW0gaW5zdGFuY2VvZiBYbWxTY2hlbWFFbGVtZW50KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkNhbm5vdCB1bndyYXAgZWxlbWVudCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcW5hbWUgKyAiOiBvbmx5IGVsZW1lbnQgaXRlbXMgYWxsb3dlZCBpbiBzZXF1ZW5jZSIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIFhtbFNjaGVtYUVsZW1lbnQgZWxlbWVudCA9IChYbWxTY2hlbWFFbGVtZW50KWl0ZW07Ci0gICAgICAgICAgICAgICAgICAgIFFOYW1lIHJlZm5hbWUgPSBlbGVtZW50LmdldFJlZk5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgUU5hbWUgdHlwZW5hbWUgPSBlbGVtZW50LmdldFNjaGVtYVR5cGVOYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZWZuYW1lID09IG51bGwgJiYgdHlwZW5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkNhbm5vdCB1bndyYXAgZWxlbWVudCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcW5hbWUgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiOiBhbGwgZWxlbWVudHMgaW4gY29udGFpbmVkIHNlcXVlbmNlIG11c3QgYmUgZWxlbWVudCByZWZlcmVuY2VzIG9yIHJlZmVyZW5jZSBhIG5hbWVkIHR5cGUiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNvdXQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJDYW5ub3QgdW53cmFwIGVsZW1lbnQgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFuYW1lICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjogb25seSBvbmUgY2hpbGQgZWxlbWVudCBhbGxvd2VkIGluIHNlcXVlbmNlIGZvciB3cmFwcGVkIG91dHB1dCIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gYWRkIGVsZW1lbnQgdG8gb3V0cHV0IHdpdGggZGV0YWlscyBvZiB0aGlzIGVsZW1lbnQgaGFuZGxpbmcKLSAgICAgICAgICAgICAgICAgICAgRWxlbWVudCBwYXJhbSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jLmNyZWF0ZUVsZW1lbnQoaXNvdXQgPyAicmV0dXJuLWVsZW1lbnQiIDogInBhcmFtZXRlci1lbGVtZW50Iik7Ci0gICAgICAgICAgICAgICAgICAgIFFOYW1lIGl0ZW1uYW1lID0gKHJlZm5hbWUgPT0gbnVsbCkgPyBlbGVtZW50LmdldFFOYW1lKCkgOiByZWZuYW1lOwotICAgICAgICAgICAgICAgICAgICBub25zID0gbm9ucyB8fCBpdGVtbmFtZS5nZXROYW1lc3BhY2VVUkkoKS5sZW5ndGgoKSA9PSAwOwotICAgICAgICAgICAgICAgICAgICBwYXJhbS5zZXRBdHRyaWJ1dGUoIm5zIiwgaXRlbW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgICAgICAgICAgICAgICAgICBwYXJhbS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCBpdGVtbmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBqYXZhbmFtZSA9IHRvSmF2YU5hbWUoaXRlbW5hbWUuZ2V0TG9jYWxQYXJ0KCksIG5hbWVzZXQpOwotICAgICAgICAgICAgICAgICAgICBwYXJhbS5zZXRBdHRyaWJ1dGUoImphdmEtbmFtZSIsIGphdmFuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgcGFyYW0uc2V0QXR0cmlidXRlKCJuaWxsYWJsZSIsIEJvb2xlYW4udG9TdHJpbmcoZWxlbWVudC5pc05pbGxhYmxlKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBvcHRpb25hbCA9IGVsZW1lbnQuZ2V0TWluT2NjdXJzKCkgPT0gMDsKLSAgICAgICAgICAgICAgICAgICAgcGFyYW0uc2V0QXR0cmlidXRlKCJvcHRpb25hbCIsIEJvb2xlYW4udG9TdHJpbmcob3B0aW9uYWwpKTsKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc2FycmF5ID0gZWxlbWVudC5nZXRNYXhPY2N1cnMoKSA+IDE7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmFtLnNldEF0dHJpYnV0ZSgiYXJyYXkiLCBCb29sZWFuLnRvU3RyaW5nKGlzYXJyYXkpKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGphdmF0eXBlOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY3JlYXRldHlwZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmdldFNjaGVtYVR5cGUoKSBpbnN0YW5jZW9mIFhtbFNjaGVtYVNpbXBsZVR5cGUpIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2ltcGxlIHR5cGUgdHJhbnNsYXRlcyB0byBmb3JtYXQgZWxlbWVudCBpbiBiaW5kaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICBGb3JtYXRFbGVtZW50IGZvcm1hdCA9IChGb3JtYXRFbGVtZW50KXNpbXBsZVR5cGVNYXAuZ2V0KHR5cGVuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb3JtYXQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGZvciByZXN0cmljdGlvbiB3aXRoIHNpbXBsZSBiYXNlLCBhbmQgdHJlYXQgYXMgYmFzZSBpZiBzbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhtbFNjaGVtYVNpbXBsZVR5cGUgc3R5cGUgPSAoWG1sU2NoZW1hU2ltcGxlVHlwZSllbGVtZW50LmdldFNjaGVtYVR5cGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBYbWxTY2hlbWFTaW1wbGVUeXBlQ29udGVudCBjb250ZW50ID0gc3R5cGUuZ2V0Q29udGVudCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50IGluc3RhbmNlb2YgWG1sU2NoZW1hU2ltcGxlVHlwZVJlc3RyaWN0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFOYW1lIHRuYW1lID0gKChYbWxTY2hlbWFTaW1wbGVUeXBlUmVzdHJpY3Rpb24pY29udGVudCkuZ2V0QmFzZVR5cGVOYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChTQ0hFTUFfTkFNRVNQQUNFLmVxdWFscyh0bmFtZS5nZXROYW1lc3BhY2VVUkkoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9IChGb3JtYXRFbGVtZW50KXNpbXBsZVR5cGVNYXAuZ2V0KHRuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb3JtYXQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lID0gdG5hbWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm9ybWF0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQ2Fubm90IHVud3JhcCBlbGVtZW50ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxbmFtZSArICI6IG5vIGZvcm1hdCBkZWZpbml0aW9uIGZvdW5kIGZvciB0eXBlICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSArICIgKHVzZWQgYnkgZWxlbWVudCAiICsgaXRlbW5hbWUgKyAnKScpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgamF2YXR5cGUgPSBmb3JtYXQuZ2V0VHlwZU5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLnNldEF0dHJpYnV0ZSgiZm9ybSIsICJzaW1wbGUiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLnNldEF0dHJpYnV0ZSgic2VyaWFsaXplciIsIGZvcm1hdC5nZXRTZXJpYWxpemVyTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLnNldEF0dHJpYnV0ZSgiZGVzZXJpYWxpemVyIiwgZm9ybWF0LmdldERlc2VyaWFsaXplck5hbWUoKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnZlcnQgcHJpbWl0aXZlIHR5cGVzIHRvIHdyYXBwZXIgdHlwZXMgZm9yIG5pbGxhYmxlCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKG9wdGlvbmFsIHx8IGVsZW1lbnQuaXNOaWxsYWJsZSgpKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzX3dyYXBwZXJNYXAuY29udGFpbnNLZXkoamF2YXR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0uc2V0QXR0cmlidXRlKCJ3cmFwcGVkLXByaW1pdGl2ZSIsICJ0cnVlIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0uc2V0QXR0cmlidXRlKCJ2YWx1ZS1tZXRob2QiLCBqYXZhdHlwZSArICJWYWx1ZSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF0eXBlID0gKFN0cmluZylzX3dyYXBwZXJNYXAuZ2V0KGphdmF0eXBlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0uc2V0QXR0cmlidXRlKCJ3cmFwcGVkLXByaW1pdGl2ZSIsICJmYWxzZSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBkZmx0ID0gZWxlbWVudC5nZXREZWZhdWx0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGZsdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRmbHQgPSBmb3JtYXQuZ2V0RGVmYXVsdFRleHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGphdmF0eXBlLmVxdWFscygiZmxvYXQiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGZsdCA9IGRmbHQgKyAnRic7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRmbHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbS5zZXRBdHRyaWJ1dGUoImRlZmF1bHQiLCBkZmx0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udmVyc2lvbiBtdXN0IGJlIGRlZmluZWQgYnkgbWFwcGluZwotICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZ0VsZW1lbnRCYXNlIG1hcHBpbmc7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVmbmFtZSA9PSBudWxsKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb21wbGV4IHR5cGUgcmVmZXJlbmNlIHRyYW5zbGF0ZXMgdG8gYWJzdHJhY3QgbWFwcGluZyBpbiBiaW5kaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGluZyA9IChNYXBwaW5nRWxlbWVudEJhc2UpY29tcGxleFR5cGVNYXAuZ2V0KHR5cGVuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWFwcGluZyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJDYW5ub3QgdW53cmFwIGVsZW1lbnQgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcW5hbWUgKyAiOiBubyBhYnN0cmFjdCBtYXBwaW5nIGRlZmluaXRpb24gZm91bmQgZm9yIHR5cGUgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgKyAiICh1c2VkIGJ5IGVsZW1lbnQgIiArIGl0ZW1uYW1lICsgJyknKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlciB0aW5kZXggPSAoSW50ZWdlcil0eXBlTWFwcGVkQ2xhc3NNYXAuZ2V0KHR5cGVuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGluZGV4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGluZGV4ID0gbmV3IEludGVnZXIodHlwZU1hcHBlZENsYXNzTWFwLnNpemUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVNYXBwZWRDbGFzc01hcC5wdXQodHlwZW5hbWUsIHRpbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLnNldEF0dHJpYnV0ZSgidHlwZS1pbmRleCIsIHRpbmRleC50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZWxlbWVudCByZWZlcmVuY2UgdHJhbnNsYXRlcyB0byBjb25jcmV0ZSBtYXBwaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGluZyA9IChNYXBwaW5nRWxlbWVudEJhc2UpZWxlbWVudE1hcC5nZXQocmVmbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hcHBpbmcgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQ2Fubm90IHVud3JhcCBlbGVtZW50ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFuYW1lICsgIjogbm8gY29uY3JldGUgbWFwcGluZyBkZWZpbml0aW9uIGZvdW5kIGZvciBlbGVtZW50ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZm5hbWUgKyAiICh1c2VkIGJ5IGVsZW1lbnQgIiArIGl0ZW1uYW1lICsgJyknKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0uc2V0QXR0cmlidXRlKCJ0eXBlLWluZGV4IiwgIiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25maWd1cmUgYmFzZWQgb24gdGhlIG1hcHBpbmcgaW5mb3JtYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLnNldEF0dHJpYnV0ZSgiZm9ybSIsICJjb21wbGV4Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV4ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmF0eXBlID0gbWFwcGluZy5nZXRDbGFzc05hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZXR5cGUgPSBtYXBwaW5nLmdldENyZWF0ZVR5cGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjcmVhdGV0eXBlID09IG51bGwgJiYgbWFwcGluZy5pc0Fic3RyYWN0KCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBwaW5nLmdldEV4dGVuc2lvblR5cGVzKCkuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWJzdHJhY3QgbWFwcGluZyB3aXRoIG5vIGV4dGVuc2lvbnMgcmVxdWlyZXMgaW5zdGFuY2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdGhpcyBhc3N1bWVzIHRoZSBtYXBwZWQgdHlwZSBjYW4gYmUgY3JlYXRlZCwgYnV0IG5vIGVhc3kgd2F5IHRvIGNoZWNrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRldHlwZSA9IGphdmF0eXBlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBtZXJnZSBjb250YWluZWQgbmFtZXNwYWNlIGRlZmluaXRpb25zIGludG8gc2V0IGZvciBvcGVyYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGNpdGVyID0gbWFwcGluZy50b3BDaGlsZEl0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoY2l0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRWxlbWVudEJhc2UgY2hpbGQgPSAoRWxlbWVudEJhc2UpY2l0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZC50eXBlKCkgPT0gRWxlbWVudEJhc2UuTkFNRVNQQUNFX0VMRU1FTlQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGZsdG5zID0gbWFwTmFtZXNwYWNlKChOYW1lc3BhY2VFbGVtZW50KWNoaWxkLCBkZmx0bnMsIG5zbWFwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsc28gbWVyZ2UgbmFtZXNwYWNlIGRlZmluaXRpb25zIGZyb20gYmluZGluZwotICAgICAgICAgICAgICAgICAgICAgICAgQmluZGluZ0VsZW1lbnQgYmluZGluZyA9IChCaW5kaW5nRWxlbWVudCliaW5kaW5nTWFwLmdldChtYXBwaW5nKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNpdGVyID0gYmluZGluZy50b3BDaGlsZEl0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoY2l0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRWxlbWVudEJhc2UgY2hpbGQgPSAoRWxlbWVudEJhc2UpY2l0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZC50eXBlKCkgPT0gRWxlbWVudEJhc2UuTkFNRVNQQUNFX0VMRU1FTlQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGZsdG5zID0gbWFwTmFtZXNwYWNlKChOYW1lc3BhY2VFbGVtZW50KWNoaWxkLCBkZmx0bnMsIG5zbWFwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoaWxkLnR5cGUoKSAhPSBFbGVtZW50QmFzZS5JTkNMVURFX0VMRU1FTlQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBhcmFtLnNldEF0dHJpYnV0ZSgiamF2YS10eXBlIiwgamF2YXR5cGUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoY3JlYXRldHlwZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbS5zZXRBdHRyaWJ1dGUoImNyZWF0ZS10eXBlIiwgY3JlYXRldHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzb2JqID0gIXNfcHJpbWl0aXZlU2V0LmNvbnRhaW5zKGphdmF0eXBlKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZ1bGx0eXBlID0gamF2YXR5cGU7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpc2FycmF5KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmdWxsdHlwZSArPSAiW10iOwotICAgICAgICAgICAgICAgICAgICAgICAgaXNvYmogPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwYXJhbS5zZXRBdHRyaWJ1dGUoIm9iamVjdCIsIEJvb2xlYW4udG9TdHJpbmcoaXNvYmopKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzb3V0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVydHlwZSA9IGZ1bGx0eXBlOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlcnR5cGUgPSAiamF2YS5sYW5nLk9iamVjdCI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgd3JhcGRldGFpbC5hcHBlbmRDaGlsZChwYXJhbSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBtYWdpYyBjb2RlIGNvbWVzIGZyb20gb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4uZXh0ZW5zaW9uLlNjaGVtYVVud3JhcHBlckV4dGVuc2lvbgotICAgICAgICAgICAgICAgICAgICAvLyAgaXQncyB1c2VkIGhlcmUgdG8gZml0IGludG8gdGhlIEFEQi1iYXNlZCBjb2RlIGdlbmVyYXRpb24gbW9kZWwKLSAgICAgICAgICAgICAgICAgICAgUU5hbWUgcGFydHFuYW1lID0gV1NETFV0aWwuZ2V0UGFydFFOYW1lKG9wTmFtZS5nZXRMb2NhbFBhcnQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdTRExDb25zdGFudHMuSU5QVVRfUEFSVF9RTkFNRV9TVUZGSVgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIHBhcnROYW1lTGlzdC5hZGQocGFydHFuYW1lKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBhZGQgdHlwZSBtYXBwaW5nIHNvIHdlIGxvb2sgbGlrZSBBREIKLSAgICAgICAgICAgICAgICAgICAgY29kZUdlbkNvbmZpZy5nZXRUeXBlTWFwcGVyKCkuYWRkVHlwZU1hcHBpbmdOYW1lKHBhcnRxbmFtZSwgZnVsbHR5cGUpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIGNoZWNrIG5hbWVzcGFjZSBwcmVmaXggdXNhZ2UKLSAgICAgICAgICAgICAgICBpZiAobm9ucyAmJiBkZmx0bnMpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkNhbm5vdCB1bndyYXAgZWxlbWVudCAiICsgcW5hbWUgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICI6IG5vLW5hbWVzcGFjZSBlbGVtZW50KHMpIGNvbmZsaWN0IHdpdGggZGVmYXVsdCBuYW1lc3BhY2UgdXNlIGluIGJpbmRpbmciKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgd3JhcGRldGFpbC5zZXRBdHRyaWJ1dGUoInVzZXMtZGVmYXVsdCIsIEJvb2xlYW4udG9TdHJpbmcobm9ucykpOwotCi0gICAgICAgICAgICAgICAgLy8gc2V0IGZsYWcgZm9yIG5hbWVzcGFjZSBkZWNsYXJhdGlvbnMgbmVlZGVkIG9uIHdyYXBwZXIKLSAgICAgICAgICAgICAgICB3cmFwZGV0YWlsLnNldEF0dHJpYnV0ZSgibmVlZC1uYW1lc3BhY2VzIiwgQm9vbGVhbi50b1N0cmluZyhjb21wbGV4KSk7Ci0KLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IGVsc2UgaWYgKHR5cGUgIT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkNhbm5vdCB1bndyYXAgZWxlbWVudCAiICsgcW5hbWUgKwotICAgICAgICAgICAgICAgICAgICAiOiBub3QgYSBjb21wbGV4VHlwZSBkZWZpbml0aW9uIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHdyYXBkZXRhaWwuZ2V0Rmlyc3RDaGlsZCgpID09IG51bGwpIHsKLSAgICAgICAgICAgIHdyYXBkZXRhaWwuc2V0QXR0cmlidXRlKCJlbXB0eSIsICJ0cnVlIik7Ci0gICAgICAgICAgICB3cmFwZGV0YWlsLnNldEF0dHJpYnV0ZSgibmVlZC1uYW1lc3BhY2VzIiwgImZhbHNlIik7Ci0gICAgICAgICAgICB3cmFwcGVydHlwZSA9ICIiOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgd3JhcGRldGFpbC5zZXRBdHRyaWJ1dGUoImVtcHR5IiwgImZhbHNlIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyB0aGlzIG1hZ2ljIGNvZGUgY29tZXMgZnJvbSBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5leHRlbnNpb24uU2NoZW1hVW53cmFwcGVyRXh0ZW5zaW9uCi0gICAgICAgIC8vICBpdCdzIHVzZWQgaGVyZSB0byBmaXQgaW50byB0aGUgQURCLWJhc2VkIGNvZGUgZ2VuZXJhdGlvbiBtb2RlbAotICAgICAgICBNZXNzYWdlUGFydEluZm9ybWF0aW9uSG9sZGVyIGluZm9Ib2xkZXIgPSBuZXcgTWVzc2FnZVBhcnRJbmZvcm1hdGlvbkhvbGRlcigpOwotICAgICAgICBpbmZvSG9sZGVyLnNldE9wZXJhdGlvbk5hbWUobXNnLmdldEF4aXNPcGVyYXRpb24oKS5nZXROYW1lKCkpOwotICAgICAgICBpbmZvSG9sZGVyLnNldFBhcnRzTGlzdChwYXJ0TmFtZUxpc3QpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbXNnLmFkZFBhcmFtZXRlcihuZXcgUGFyYW1ldGVyKENvbnN0YW50cy5VTldSQVBQRURfREVUQUlMUywgaW5mb0hvbGRlcikpOwotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBzZXQgaW5kaWNhdGlvbiBmb3IgdW53cmFwcGVkIG1lc3NhZ2UKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1zZy5hZGRQYXJhbWV0ZXIobmV3IFBhcmFtZXRlcihDb25zdGFudHMuVU5XUkFQUEVEX0tFWSwgQm9vbGVhbi5UUlVFKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGFkZCBmYWtlIG1hcHBpbmcgZm9yIHdyYXBwZXIgbmFtZSAobmVjZXNzYXJ5IGZvciBjdXJyZW50IFhTTFRzKQotICAgICAgICBjb2RlR2VuQ29uZmlnLmdldFR5cGVNYXBwZXIoKS5hZGRUeXBlTWFwcGluZ05hbWUocW5hbWUsIHdyYXBwZXJ0eXBlKTsKLQotICAgICAgICAvLyByZXR1cm4gdGhlIHVud3JhcHBpbmcgZGV0YWlscwotICAgICAgICByZXR1cm4gd3JhcGRldGFpbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgbWFwcGluZyBmcm9tIG5hbWVzcGFjZSBVUkkgdG8gcHJlZml4LiBJbiB0aGUgY2FzZSB3aGVyZSBtdWx0aXBsZSBwcmVmaXhlcyBhcmUgdXNlZCB3aXRoIGEKLSAgICAgKiBzaW5nbGUgVVJJLCB0aGlzIHdpbGwgcHJlc2VydmUgdGhlIGxhc3Qgbm9uLWVtcHR5IHByZWZpeCBmb3IgdGhhdCBVUkkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbnMgICAgIG5hbWVzcGFjZSBkZWZpbml0aW9uCi0gICAgICogQHBhcmFtIGRmbHRucyBmbGFnIGZvciBkZWZhdWx0IG5hbWVzcGFjZSB1c2VkIGluIGJpbmRpbmcKLSAgICAgKiBAcGFyYW0gbnNtYXAgIG1hcCBmcm9tIG5hbWVzcGFjZSBVUklzIHRvIHByZWZpeGVzCi0gICAgICogQHJldHVybiBmbGFnIGZvciBkZWZhdWx0IG5hbWVzcGFjZSB1c2VkIGluIGJpbmRpbmcKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gbWFwTmFtZXNwYWNlKE5hbWVzcGFjZUVsZW1lbnQgbnMsIGJvb2xlYW4gZGZsdG5zLCBNYXAgbnNtYXApIHsKLSAgICAgICAgU3RyaW5nIHByZWZpeCA9IG5zLmdldFByZWZpeCgpOwotICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgIHByZWZpeCA9ICIiOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZyBwcmlvciA9IChTdHJpbmcpbnNtYXAuZ2V0KG5zLmdldFVyaSgpKTsKLSAgICAgICAgaWYgKHByaW9yICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChwcmVmaXgubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBkZmx0bnM7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHByaW9yLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICBkZmx0bnMgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBuc21hcC5wdXQobnMuZ2V0VXJpKCksIHByZWZpeCk7Ci0gICAgICAgIHJldHVybiBkZmx0bnMgfHwgcHJlZml4Lmxlbmd0aCgpID09IDA7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHRvSmF2YU5hbWUoU3RyaW5nIG5hbWUsIFNldCBuYW1lc2V0KSB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBidWZmID0gbmV3IFN0cmluZ0J1ZmZlcihuYW1lLmxlbmd0aCgpKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lLmxlbmd0aCgpOyBpKyspIHsKLSAgICAgICAgICAgIGNoYXIgY2hyID0gbmFtZS5jaGFyQXQoaSk7Ci0gICAgICAgICAgICBpZiAoKGkgPT0gMCAmJiBDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclN0YXJ0KGNocikpIHx8Ci0gICAgICAgICAgICAgICAgICAgIChpID4gMCAmJiBDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclBhcnQoY2hyKSkpIHsKLSAgICAgICAgICAgICAgICBidWZmLmFwcGVuZChjaHIpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChjaHIgPT0gJzonIHx8IGNociA9PSAnLicpIHsKLSAgICAgICAgICAgICAgICBidWZmLmFwcGVuZCgnJCcpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBidWZmLmFwcGVuZCgnXycpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGludCBjb3VudCA9IDA7Ci0gICAgICAgIFN0cmluZyBqbmFtZSA9IGJ1ZmYudG9TdHJpbmcoKTsKLSAgICAgICAgd2hpbGUgKCFuYW1lc2V0LmFkZChqbmFtZSkpIHsKLSAgICAgICAgICAgIGpuYW1lID0gYnVmZi50b1N0cmluZygpICsgY291bnQrKzsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gam5hbWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgbWFwTWVzc2FnZShBeGlzTWVzc2FnZSBtc2csIE1hcCBjb21wbGV4VHlwZU1hcCkgewotICAgICAgICBRTmFtZSBxbmFtZSA9IG1zZy5nZXRFbGVtZW50UU5hbWUoKTsKLSAgICAgICAgaWYgKHFuYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJObyBlbGVtZW50IHJlZmVyZW5jZSBpbiBtZXNzYWdlICIgKyBtc2cuZ2V0TmFtZSgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbWFwUU5hbWUocW5hbWUsIGNvbXBsZXhUeXBlTWFwKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBtYXBNZXNzYWdlKFNPQVBIZWFkZXJNZXNzYWdlIG1zZywgTWFwIGNvbXBsZXhUeXBlTWFwKSB7Ci0gICAgICAgIFFOYW1lIHFuYW1lID0gbXNnLmdldEVsZW1lbnQoKTsKLSAgICAgICAgaWYgKHFuYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJObyBlbGVtZW50IHJlZmVyZW5jZSBpbiBoZWFkZXIiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbWFwUU5hbWUocW5hbWUsIGNvbXBsZXhUeXBlTWFwKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBtYXBRTmFtZShRTmFtZSBxbmFtZSwgTWFwIGNvbXBsZXhUeXBlTWFwKSB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbiB7Ci0gICAgICAgIE9iamVjdCBvYmogPSBjb21wbGV4VHlwZU1hcC5nZXQocW5hbWUpOwotICAgICAgICBpZiAob2JqID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJObyBtYXBwaW5nIGRlZmluZWQgZm9yIGVsZW1lbnQgIiArIHFuYW1lKTsKLSAgICAgICAgfQotICAgICAgICBNYXBwaW5nRWxlbWVudEJhc2UgbWFwcGluZyA9IChNYXBwaW5nRWxlbWVudEJhc2Upb2JqOwotICAgICAgICBTdHJpbmcgY25hbWUgPSBtYXBwaW5nLmdldENsYXNzTmFtZSgpOwotICAgICAgICBjb2RlR2VuQ29uZmlnLmdldFR5cGVNYXBwZXIoKS5hZGRUeXBlTWFwcGluZ05hbWUocW5hbWUsIGNuYW1lKTsKLSAgICAgICAgcmV0dXJuIGNuYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbGxlY3QgbWFwcGluZyBmcm9tIHFuYW1lcyB0byBjbGFzc2VzIGZvciB0b3AgbGV2ZWwgbWFwcGluZ3MgaW4gSmlCWCBiaW5kaW5nLgotICAgICAqCi0gICAgICogQHBhcmFtIGJpbmRpbmcKLSAgICAgKiBAcGFyYW0gZG5zICAgICAgICAgICAgZGVmYXVsdCBuYW1lc3BhY2UgdG8gYmUgdXNlZCB1bmxlc3Mgb3ZlcnJpZGRlbiAoZW1wdHkgc3RyaW5nIGlmIG5vbmUpCi0gICAgICogQHBhcmFtIGVsZW1lbnRNYXAgICAgIG1hcCBmcm9tIGVsZW1lbnQgbmFtZXMgdG8gY29uY3JldGUgbWFwcGluZyBjb21wb25lbnRzIG9mIGJpbmRpbmcKLSAgICAgKiBAcGFyYW0gY29tcGxleFR5cGVNYXAgbWFwIGZyb20gdHlwZSBuYW1lcyB0byBhYnN0cmFjdCBtYXBwaW5nIGNvbXBvbmVudHMgb2YgYmluZGluZwotICAgICAqIEBwYXJhbSBzaW1wbGVUeXBlTWFwICBtYXAgZnJvbSB0eXBlIG5hbWVzIHRvIGZvcm1hdCBkZWZpbml0aW9uIGNvbXBvbmVudHMgb2YgYmluZGluZwotICAgICAqIEBwYXJhbSBiaW5kaW5nTWFwICAgICBtYXAgZnJvbSBtYXBwaW5nIGNvbXBvbmVudHMgdG8gY29udGFpbmluZyBiaW5kaW5nIGRlZmluaXRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGNvbGxlY3RUb3BMZXZlbENvbXBvbmVudHMoQmluZGluZ0VsZW1lbnQgYmluZGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGRucywgTWFwIGVsZW1lbnRNYXAsIE1hcCBjb21wbGV4VHlwZU1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwIHNpbXBsZVR5cGVNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcCBiaW5kaW5nTWFwKSB7Ci0KLSAgICAgICAgLy8gY2hlY2sgZGVmYXVsdCBuYW1lc3BhY2Ugc2V0IGF0IHRvcCBsZXZlbCBvZiBiaW5kaW5nCi0gICAgICAgIFN0cmluZyBkZWZhdWx0bnMgPSBmaW5kRGVmYXVsdE5TKGJpbmRpbmcudG9wQ2hpbGRJdGVyYXRvcigpLCBkbnMpOwotCi0gICAgICAgIC8vIGFkZCBhbGwgdG9wIGxldmVsIG1hcHBpbmcgYW5kIGZvcm1hdCBkZWZpbml0aW9ucyB0byBtYXBzCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGJpbmRpbmcudG9wQ2hpbGRJdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIEVsZW1lbnRCYXNlIGNoaWxkID0gKEVsZW1lbnRCYXNlKWl0ZXIubmV4dCgpOwotICAgICAgICAgICAgaWYgKGNoaWxkLnR5cGUoKSA9PSBFbGVtZW50QmFzZS5JTkNMVURFX0VMRU1FTlQpIHsKLQotICAgICAgICAgICAgICAgIC8vIHJlY3Vyc2UgdG8gcHJvY2VzcyBpbmNsdWRlZCBiaW5kaW5nIGRlZmluaXRpb25zCi0gICAgICAgICAgICAgICAgSW5jbHVkZUVsZW1lbnQgaW5jbHVkZSA9IChJbmNsdWRlRWxlbWVudCljaGlsZDsKLSAgICAgICAgICAgICAgICBjb2xsZWN0VG9wTGV2ZWxDb21wb25lbnRzKGluY2x1ZGUuZ2V0QmluZGluZygpLCBkZWZhdWx0bnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TWFwLCBjb21wbGV4VHlwZU1hcCwgc2ltcGxlVHlwZU1hcCwgYmluZGluZ01hcCk7Ci0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hpbGQudHlwZSgpID09IEVsZW1lbnRCYXNlLkZPUk1BVF9FTEVNRU5UKSB7Ci0KLSAgICAgICAgICAgICAgICAvLyByZWdpc3RlciBuYW1lZCBmb3JtYXRzIGFzIHNpbXBsZSB0eXBlIGNvbnZlcnNpb25zCi0gICAgICAgICAgICAgICAgRm9ybWF0RWxlbWVudCBmb3JtYXQgPSAoRm9ybWF0RWxlbWVudCljaGlsZDsKLSAgICAgICAgICAgICAgICByZWdpc3RlckVsZW1lbnQoZm9ybWF0LmdldFFOYW1lKCksIGZvcm1hdCwgc2ltcGxlVHlwZU1hcCk7Ci0gICAgICAgICAgICAgICAgYmluZGluZ01hcC5wdXQoZm9ybWF0LCBiaW5kaW5nKTsKLQotICAgICAgICAgICAgfSBlbHNlIGlmIChjaGlsZC50eXBlKCkgPT0gRWxlbWVudEJhc2UuTUFQUElOR19FTEVNRU5UKSB7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gcmVjb3JkIG9ubHkgYWJzdHJhY3QgbWFwcGluZ3Mgd2l0aCB0eXBlIG5hbWVzLCBhbmQgbWFwcGluZ3Mgd2l0aCBuYW1lcwotICAgICAgICAgICAgICAgIE1hcHBpbmdFbGVtZW50QmFzZSBtYXBwaW5nID0gKE1hcHBpbmdFbGVtZW50QmFzZSljaGlsZDsKLSAgICAgICAgICAgICAgICBiaW5kaW5nTWFwLnB1dChtYXBwaW5nLCBiaW5kaW5nKTsKLSAgICAgICAgICAgICAgICBpZiAobWFwcGluZy5pc0Fic3RyYWN0KCkgJiYgbWFwcGluZy5nZXRUeXBlUU5hbWUoKSAhPSBudWxsKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gcmVnaXN0ZXIgbmFtZWQgYWJzdHJhY3QgbWFwcGluZ3MgYXMgY29tcGxleCB0eXBlIGNvbnZlcnNpb25zCi0gICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyRWxlbWVudChtYXBwaW5nLmdldFR5cGVRTmFtZSgpLCBtYXBwaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxleFR5cGVNYXApOwotCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtYXBwaW5nLmdldE5hbWUoKSAhPSBudWxsKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gcmVnaXN0ZXIgY29uY3JldGUgbWFwcGluZ3MgYXMgZWxlbWVudCBjb252ZXJzaW9ucwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdXJpID0gbWFwcGluZy5nZXRVcmkoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHVyaSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1cmkgPSBmaW5kRGVmYXVsdE5TKG1hcHBpbmcudG9wQ2hpbGRJdGVyYXRvcigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0bnMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRNYXAucHV0KG5ldyBRTmFtZSh1cmksIG1hcHBpbmcuZ2V0TmFtZSgpKSwgbWFwcGluZyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVnaXN0ZXIgYmluZGluZyBlbGVtZW50IGJ5IHF1YWxpZmllZCBuYW1lLiBUaGlzIGNvbnZlcnRzIHRoZSBxdWFsaWZpZWQgbmFtZSBmb3JtYXQgdXNlZCBieQotICAgICAqIHRoZSBKaUJYIGJpbmRpbmcgbW9kZWwgdG8gdGhhdCB1c2VkIGJ5IEF4aXMyLgotICAgICAqCi0gICAgICogQHBhcmFtIHFuYW1lICAgcXVhbGlmaWVkIG5hbWUgaW4gSmlCWCBmb3JtYXQgKDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUpCi0gICAgICogQHBhcmFtIGVsZW1lbnQgY29ycmVzcG9uZGluZyBlbGVtZW50IG9mIGJpbmRpbmcgZGVmaW5pdGlvbgotICAgICAqIEBwYXJhbSBtYXAgICAgIHF1YWxpZmllZCBuYW1lIHRvIGVsZW1lbnQgbWFwCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCByZWdpc3RlckVsZW1lbnQob3JnLmppYngucnVudGltZS5RTmFtZSBxbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50QmFzZSBlbGVtZW50LCBNYXAgbWFwKSB7Ci0gICAgICAgIGlmIChxbmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtYXAucHV0KG5ldyBRTmFtZShxbmFtZS5nZXRVcmkoKSwgcW5hbWUuZ2V0TmFtZSgpKSwgZWxlbWVudCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGaW5kIHRoZSBkZWZhdWx0IG5hbWVzcGFjZSB3aXRoaW4gYSBsaXN0IG9mIEppQlggYmluZGluZyBtb2RlbCBlbGVtZW50cyBwb3NzaWJseSBpbmNsdWRpbmcKLSAgICAgKiBuYW1lc3BhY2UgZGVmaW5pdGlvbnMuIE9uY2UgYSBub24tbmFtZXNwYWNlIGRlZmluaXRpb24gZWxlbWVudCBpcyBzZWVuIGluIHRoZSBsaXN0LCB0aGlzIGp1c3QKLSAgICAgKiByZXR1cm5zIChzaW5jZSB0aGUgbmFtZXNwYWNlIGRlZmluaXRpb25zIGFsd2F5cyBjb21lIGZpcnN0IGluIEppQlgncyBiaW5kaW5nIGZvcm1hdCkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaXRlciBpdGVyYXRvciBmb3IgZWxlbWVudHMgaW4gbGlzdAotICAgICAqIEBwYXJhbSBkbnMgIGRlZmF1bHQgbmFtZXNwYWNlIGlmIG5vdCBvdmVycmlkZGVuCi0gICAgICogQHJldHVybiBkZWZhdWx0IG5hbWVzcGFjZQotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBmaW5kRGVmYXVsdE5TKEl0ZXJhdG9yIGl0ZXIsIFN0cmluZyBkbnMpIHsKLSAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBFbGVtZW50QmFzZSBjaGlsZCA9IChFbGVtZW50QmFzZSlpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIGlmIChjaGlsZC50eXBlKCkgPT0gRWxlbWVudEJhc2UuTkFNRVNQQUNFX0VMRU1FTlQpIHsKLSAgICAgICAgICAgICAgICBOYW1lc3BhY2VFbGVtZW50IG5hbWVzcGFjZSA9IChOYW1lc3BhY2VFbGVtZW50KWNoaWxkOwotICAgICAgICAgICAgICAgIFN0cmluZyBkZWZhdWx0TmFtZSA9IG5hbWVzcGFjZS5nZXREZWZhdWx0TmFtZSgpOwotICAgICAgICAgICAgICAgIGlmICgiZWxlbWVudHMiLmVxdWFscyhkZWZhdWx0TmFtZSkgfHwgImFsbCIuZXF1YWxzKGRlZmF1bHROYW1lKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmFtZXNwYWNlLmdldFVyaSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGRuczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbm5lciBjbGFzcyBmb3IgaGFuZGxpbmcgcHJldmFsaWRhdGlvbiBvZiBpbmNsdWRlIGVsZW1lbnRzIG9ubHkuIFVubGlrZSB0aGUgbm9ybWFsIEppQlgKLSAgICAgKiBiaW5kaW5nIGRlZmluaXRpb24gcHJldmFsaWRhdGlvbiBzdGVwLCB0aGlzIHZpc2l0b3IgaWdub3JlcyBldmVyeXRoaW5nIGV4Y2VwdCBpbmNsdWRlCi0gICAgICogZWxlbWVudHMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBjbGFzcyBJbmNsdWRlUHJldmFsaWRhdGlvblZpc2l0b3IgZXh0ZW5kcyBNb2RlbFZpc2l0b3IgewotICAgICAgICBwcml2YXRlIGZpbmFsIFZhbGlkYXRpb25Db250ZXh0IG1fY29udGV4dDsKLQotICAgICAgICBwcml2YXRlIEluY2x1ZGVQcmV2YWxpZGF0aW9uVmlzaXRvcihWYWxpZGF0aW9uQ29udGV4dCB2Y3R4KSB7Ci0gICAgICAgICAgICBtX2NvbnRleHQgPSB2Y3R4OwotICAgICAgICB9Ci0KLSAgICAgICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgICAqIEBzZWUgb3JnLmppYnguYmluZGluZy5tb2RlbC5Nb2RlbFZpc2l0b3IjdmlzaXQob3JnLmppYnguYmluZGluZy5tb2RlbC5FbGVtZW50QmFzZSkKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGJvb2xlYW4gdmlzaXQoSW5jbHVkZUVsZW1lbnQgbm9kZSkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAvLyBmb3JjZSBjcmVhdGlvbiBvZiBkZWZpbnRpb25zIGNvbnRleHQgZm9yIGNvbnRhaW5pbmcgYmluZGluZwotICAgICAgICAgICAgICAgIG1fY29udGV4dC5nZXRGb3JtYXREZWZpbml0aW9ucygpOwotICAgICAgICAgICAgICAgIG5vZGUucHJldmFsaWRhdGUobV9jb250ZXh0KTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0gICAgICAgICAgICAgICAgbV9jb250ZXh0LmFkZEZhdGFsKCJFcnJvciBkdXJpbmcgdmFsaWRhdGlvbjogIiArCi0gICAgICAgICAgICAgICAgICAgICAgICB0LmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgdC5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE5hbWVkUGFyYW1ldGVyVHlwZU1hcHBlciBleHRlbmRzIEphdmFUeXBlTWFwcGVyIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybiB0aGUgcmVhbCBwYXJhbWV0ZXIgbmFtZSwgbm90IGEgZHVtbXkuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBxbmFtZQotICAgICAgICAgKiBAcmV0dXJuIGxvY2FsIHBhcnQgb2YgbmFtZQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRQYXJhbWV0ZXJOYW1lKFFOYW1lIHFuYW1lKSB7Ci0gICAgICAgICAgICByZXR1cm4gcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamlieC9zcmMvb3JnL2FwYWNoZS9heGlzMi9qaWJ4L0ppQlhEYXRhU291cmNlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qaWJ4L3NyYy9vcmcvYXBhY2hlL2F4aXMyL2ppYngvSmlCWERhdGFTb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGMyNjA0NS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qaWJ4L3NyYy9vcmcvYXBhY2hlL2F4aXMyL2ppYngvSmlCWERhdGFTb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamlieDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01PdXRwdXRGb3JtYXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS51dGlsLlN0QVhVdGlsczsKLWltcG9ydCBvcmcuamlieC5ydW50aW1lLklCaW5kaW5nRmFjdG9yeTsKLWltcG9ydCBvcmcuamlieC5ydW50aW1lLklNYXJzaGFsbGFibGU7Ci1pbXBvcnQgb3JnLmppYngucnVudGltZS5JTWFyc2hhbGxlcjsKLWltcG9ydCBvcmcuamlieC5ydW50aW1lLklNYXJzaGFsbGluZ0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmppYngucnVudGltZS5JWE1MV3JpdGVyOwotaW1wb3J0IG9yZy5qaWJ4LnJ1bnRpbWUuSmlCWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuamlieC5ydW50aW1lLmltcGwuU3RBWFdyaXRlcjsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLQotLyoqIERhdGEgc291cmNlIGZvciBPTSBlbGVtZW50IGJhY2tlZCBieSBKaUJYIGRhdGEgYm91bmQgb2JqZWN0LiAqLwotcHVibGljIGNsYXNzIEppQlhEYXRhU291cmNlIGltcGxlbWVudHMgT01EYXRhU291cmNlIHsKLSAgICAKLSAgICAvKiogTWFwcGluZyBuYW1lLCBmb3Igd2hlbiBhYnN0cmFjdCBtYXBwaW5nIGlzIHVzZWQgZGlyZWN0bHk7IDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCB1c2VkKS4gKi8KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtYXJzaGFsbGVyTmFtZTsKLQotICAgIC8qKiBFbGVtZW50IG5hbWUgKG9ubHkgdXNlZCB3aXRoIHtAbGluayAjbWFyc2hhbGxlck5hbWV9KS4gKi8KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBlbGVtZW50TmFtZTsKLSAgICAKLSAgICAvKiogRWxlbWVudCBuYW1lc3BhY2UgVVJJIChvbmx5IHVzZWQgd2l0aCB7QGxpbmsgI21hcnNoYWxsZXJOYW1lfSkuICovCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZWxlbWVudE5hbWVzcGFjZTsKLQotICAgIC8qKiBFbGVtZW50IG5hbWVzcGFjZSBwcmVmaXggKG9ubHkgdXNlZCB3aXRoIHtAbGluayAjbWFyc2hhbGxlck5hbWV9KS4gKi8KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBlbGVtZW50TmFtZXNwYWNlUHJlZml4OwotICAgIAotICAgIC8qKiBFbGVtZW50IG5hbWVzcGFjZSBpbmRleCAob25seSB1c2VkIHdpdGgge0BsaW5rICNtYXJzaGFsbGVyTmFtZX0pLiAqLwotICAgIHByaXZhdGUgZmluYWwgaW50IGVsZW1lbnROYW1lc3BhY2VJbmRleDsKLQotICAgIC8qKiBJbmRleGVzIG9mIG5hbWVzcGFjZXMgdG8gYmUgb3BlbmVkIChvbmx5IHVzZWQgd2l0aCB7QGxpbmsgI21hcnNoYWxsZXJOYW1lfSkuICovCi0gICAgcHJpdmF0ZSBmaW5hbCBpbnRbXSBvcGVuTmFtZXNwYWNlSW5kZXhlczsKLQotICAgIC8qKiBQcmVmaXhlcyBvZiBuYW1lc3BhY2VzIHRvIGJlIG9wZW5lZCAob25seSB1c2VkIHdpdGgge0BsaW5rICNtYXJzaGFsbGVyTmFtZX0pLiAqLwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nW10gb3Blbk5hbWVzcGFjZVByZWZpeGVzOwotCi0gICAgLyoqIERhdGEgb2JqZWN0IGZvciBvdXRwdXQuICovCi0gICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgZGF0YU9iamVjdDsKLQotICAgIC8qKiBCaW5kaW5nIGZhY3RvcnkgZm9yIGNyZWF0aW5nIG1hcnNoYWxsZXIuICovCi0gICAgcHJpdmF0ZSBmaW5hbCBJQmluZGluZ0ZhY3RvcnkgYmluZGluZ0ZhY3Rvcnk7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBmcm9tIG1hcnNoYWxsYWJsZSBvYmplY3QgYW5kIGJpbmRpbmcgZmFjdG9yeS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvYmoKLSAgICAgKiBAcGFyYW0gZmFjdG9yeQotICAgICAqLwotICAgIHB1YmxpYyBKaUJYRGF0YVNvdXJjZShJTWFyc2hhbGxhYmxlIG9iaiwgSUJpbmRpbmdGYWN0b3J5IGZhY3RvcnkpIHsKLSAgICAgICAgbWFyc2hhbGxlck5hbWUgPSBudWxsOwotICAgICAgICBkYXRhT2JqZWN0ID0gb2JqOwotICAgICAgICBiaW5kaW5nRmFjdG9yeSA9IGZhY3Rvcnk7Ci0gICAgICAgIGVsZW1lbnROYW1lID0gZWxlbWVudE5hbWVzcGFjZSA9IGVsZW1lbnROYW1lc3BhY2VQcmVmaXggPSBudWxsOwotICAgICAgICBlbGVtZW50TmFtZXNwYWNlSW5kZXggPSAtMTsKLSAgICAgICAgb3Blbk5hbWVzcGFjZUluZGV4ZXMgPSBudWxsOwotICAgICAgICBvcGVuTmFtZXNwYWNlUHJlZml4ZXMgPSBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIGZyb20gb2JqZWN0IHdpdGggbWFwcGluZyBpbmRleCBhbmQgYmluZGluZyBmYWN0b3J5LgotICAgICAqCi0gICAgICogQHBhcmFtIG9iagotICAgICAqIEBwYXJhbSBtYXBwaW5nCi0gICAgICogQHBhcmFtIG5hbWUKLSAgICAgKiBAcGFyYW0gdXJpCi0gICAgICogQHBhcmFtIHByZWZpeAotICAgICAqIEBwYXJhbSBuc2luZGV4ZXMKLSAgICAgKiBAcGFyYW0gbnNwcmVmaXhlcwotICAgICAqIEBwYXJhbSBmYWN0b3J5Ci0gICAgICovCi0gICAgcHVibGljIEppQlhEYXRhU291cmNlKE9iamVjdCBvYmosIFN0cmluZyBtYXBwaW5nLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHVyaSwgU3RyaW5nIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50W10gbnNpbmRleGVzLCBTdHJpbmdbXSBuc3ByZWZpeGVzLCBJQmluZGluZ0ZhY3RvcnkgZmFjdG9yeSkgewotICAgICAgICBpZiAobWFwcGluZyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcKLSAgICAgICAgICAgICAgICAgICAgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJtYXBwaW5nIG5hbWUgbXVzdCBiZSBzdXBwbGllZCIpOwotICAgICAgICB9Ci0gICAgICAgIG1hcnNoYWxsZXJOYW1lID0gbWFwcGluZzsKLSAgICAgICAgZGF0YU9iamVjdCA9IG9iajsKLSAgICAgICAgYmluZGluZ0ZhY3RvcnkgPSBmYWN0b3J5OwotICAgICAgICBib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0gICAgICAgIFN0cmluZ1tdIG5zcyA9IGZhY3RvcnkuZ2V0TmFtZXNwYWNlcygpOwotICAgICAgICBpbnQgbnNpZHggPSAtMTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuc2luZGV4ZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmICh1cmkuZXF1YWxzKG5zc1tuc2luZGV4ZXNbaV1dKSkgewotICAgICAgICAgICAgICAgIG5zaWR4ID0gbnNpbmRleGVzW2ldOwotICAgICAgICAgICAgICAgIHByZWZpeCA9IG5zcHJlZml4ZXNbaV07Ci0gICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsZW1lbnROYW1lID0gbmFtZTsKLSAgICAgICAgZWxlbWVudE5hbWVzcGFjZSA9IHVyaTsKLSAgICAgICAgZWxlbWVudE5hbWVzcGFjZVByZWZpeCA9IHByZWZpeDsKLSAgICAgICAgaWYgKCFmb3VuZCkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuc3MubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAodXJpLmVxdWFscyhuc3NbaV0pKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5zaWR4ID0gaTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG5zaWR4ID49IDApIHsKLSAgICAgICAgICAgICAgICBpbnRbXSBpY3B5ID0gbmV3IGludFtuc2luZGV4ZXMubGVuZ3RoKzFdOwotICAgICAgICAgICAgICAgIGljcHlbMF0gPSBuc2lkeDsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KG5zaW5kZXhlcywgMCwgaWNweSwgMSwgbnNpbmRleGVzLmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgbnNpbmRleGVzID0gaWNweTsKLSAgICAgICAgICAgICAgICBTdHJpbmdbXSBzY3B5ID0gbmV3IFN0cmluZ1tuc3ByZWZpeGVzLmxlbmd0aCsxXTsKLSAgICAgICAgICAgICAgICBzY3B5WzBdID0gcHJlZml4OwotICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkobnNwcmVmaXhlcywgMCwgc2NweSwgMSwgbnNwcmVmaXhlcy5sZW5ndGgpOwotICAgICAgICAgICAgICAgIG5zcHJlZml4ZXMgPSBzY3B5OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJOYW1lc3BhY2Ugbm90IGZvdW5kIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxlbWVudE5hbWVzcGFjZUluZGV4ID0gbnNpZHg7Ci0gICAgICAgIG9wZW5OYW1lc3BhY2VJbmRleGVzID0gbnNpbmRleGVzOwotICAgICAgICBvcGVuTmFtZXNwYWNlUHJlZml4ZXMgPSBuc3ByZWZpeGVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEludGVybmFsIG1ldGhvZCB0byBoYW5kbGUgdGhlIGFjdHVhbCBtYXJzaGFsbGluZy4gSWYgdGhlIHNvdXJjZSBvYmplY3QgaXMgbWFyc2hhbGxhYmxlIGl0J3MKLSAgICAgKiBpdCdzIGp1c3QgbWFyc2hhbGxlZCBkaXJlY3RseSwgd2l0aG91dCB3b3JyeWluZyBhYm91dCByZWR1bmRhbnQgbmFtZXNwYWNlIGRlY2xhcmF0aW9ucyBhbmQKLSAgICAgKiBzdWNoLiBJZiBpdCBuZWVkcyB0byBiZSBoYW5kbGVkIHdpdGggYW4gYWJzdHJhY3QgbWFwcGluZywgdGhlIGhhbmRsaW5nIGlzIGRldGVybWluZWQgYnkgdGhlCi0gICAgICogJ2Z1bGwnIGZsYWcuIFdoZW4gdGhpcyBpcyA8Y29kZT50cnVlPC9jb2RlPiBhbGwgbmFtZXNwYWNlcyBhcmUgZGVjbGFyZWQgZGlyZWN0bHksIHdoaWxlIGlmCi0gICAgICogPGNvZGU+ZmFsc2U8L2NvZGU+IHRoZSBuYW1lc3BhY2VzIG11c3QgaGF2ZSBwcmV2aW91c2x5IGJlZW4gZGVjbGFyZWQgb24gc29tZSBlbmNsb3NpbmcKLSAgICAgKiBlbGVtZW50IG9mIHRoZSBvdXRwdXQuIFRoaXMgYWxsb3dzIHRoZSBub3JtYWwgY2FzZSBvZiBtYXJzaGFsbGluZyB3aXRoaW4gdGhlIGNvbnRleHQgb2YgYQotICAgICAqIFNPQVAgbWVzc2FnZSB0byBiZSBoYW5kbGVkIGVmZmljaWVudGx5LCB3aGlsZSBzdGlsbCBnZW5lcmF0aW5nIGNvcnJlY3QgWE1MIGlmIHRoZSBlbGVtZW50IGlzCi0gICAgICogbWFyc2hhbGxlZCBkaXJlY3RseSAoYXMgd2hlbiBidWlsZGluZyB0aGUgQVhJT00gcmVwcmVzZW50YXRpb24gZm9yIHVzZSBieSBXUy1TZWN1cml0eSkuCi0gICAgICogCi0gICAgICogQHBhcmFtIGZ1bGwKLSAgICAgKiBAcGFyYW0gY3R4Ci0gICAgICogQHRocm93cyBKaUJYRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIG1hcnNoYWwoYm9vbGVhbiBmdWxsLCBJTWFyc2hhbGxpbmdDb250ZXh0IGN0eCkgdGhyb3dzIEppQlhFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAobWFyc2hhbGxlck5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChkYXRhT2JqZWN0IGluc3RhbmNlb2YgSU1hcnNoYWxsYWJsZSkgewotICAgICAgICAgICAgICAgICAgICAoKElNYXJzaGFsbGFibGUpZGF0YU9iamVjdCkubWFyc2hhbChjdHgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk9iamVjdCBvZiBjbGFzcyAiICsgZGF0YU9iamVjdC5nZXRDbGFzcygpLmdldE5hbWUoKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAiIG5lZWRzIGEgSmlCWCA8bWFwcGluZz4gdG8gYmUgbWFyc2hhbGxlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgSVhNTFdyaXRlciB3cnRyID0gY3R4LmdldFhtbFdyaXRlcigpOwotICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gZWxlbWVudE5hbWU7Ci0gICAgICAgICAgICAgICAgaW50IG5zaWR4ID0gMDsKLSAgICAgICAgICAgICAgICBpZiAoZnVsbCkgewotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgLy8gZGVjbGFyZSBhbGwgbmFtZXNwYWNlcyBvbiBzdGFydCB0YWcKLSAgICAgICAgICAgICAgICAgICAgbnNpZHggPSBlbGVtZW50TmFtZXNwYWNlSW5kZXg7Ci0gICAgICAgICAgICAgICAgICAgIHdydHIuc3RhcnRUYWdOYW1lc3BhY2VzKG5zaWR4LCBuYW1lLCBvcGVuTmFtZXNwYWNlSW5kZXhlcywgb3Blbk5hbWVzcGFjZVByZWZpeGVzKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIC8vIGNvbmZpZ3VyZSB3cml0ZXIgd2l0aCBuYW1lc3BhY2UgZGVjbGFyZWQgaW4gZW5jbG9zaW5nIHNjb3BlCi0gICAgICAgICAgICAgICAgICAgIHdydHIub3Blbk5hbWVzcGFjZXMob3Blbk5hbWVzcGFjZUluZGV4ZXMsIG9wZW5OYW1lc3BhY2VQcmVmaXhlcyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghIiIuZXF1YWxzKGVsZW1lbnROYW1lc3BhY2VQcmVmaXgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gZWxlbWVudE5hbWVzcGFjZVByZWZpeCArICc6JyArIG5hbWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgd3J0ci5zdGFydFRhZ09wZW4oMCwgbmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIG1hcnNoYWwgb2JqZWN0IHJlcHJlc2VudGF0aW9uIChtYXkgaW5jbHVkZSBhdHRyaWJ1dGVzKSBpbnRvIGVsZW1lbnQKLSAgICAgICAgICAgICAgICBJTWFyc2hhbGxlciBtcnNoID0gY3R4LmdldE1hcnNoYWxsZXIobWFyc2hhbGxlck5hbWUpOwotICAgICAgICAgICAgICAgIG1yc2gubWFyc2hhbChkYXRhT2JqZWN0LCBjdHgpOwotICAgICAgICAgICAgICAgIHdydHIuZW5kVGFnKG5zaWR4LCBuYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGN0eC5nZXRYbWxXcml0ZXIoKS5mbHVzaCgpOwotCi0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKaUJYRXhjZXB0aW9uKCJFcnJvciBtYXJzaGFsbGluZyBYTUwgcmVwcmVzZW50YXRpb246ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZSNzZXJpYWxpemUoamF2YS5pby5PdXRwdXRTdHJlYW0sIG9yZy5hcGFjaGUuYXhpb20ub20uT01PdXRwdXRGb3JtYXQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2VyaWFsaXplKE91dHB1dFN0cmVhbSBvdXRwdXQsIE9NT3V0cHV0Rm9ybWF0IGZvcm1hdCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIG1hcnNoYWwgd2l0aCBhbGwgbmFtZXNwYWNlIGRlY2xhcmF0aW9ucywgc2luY2UgZXh0ZXJuYWwgc3RhdGUgdW5rbm93bgotICAgICAgICAgICAgSU1hcnNoYWxsaW5nQ29udGV4dCBjdHggPSBiaW5kaW5nRmFjdG9yeS5jcmVhdGVNYXJzaGFsbGluZ0NvbnRleHQoKTsKLSAgICAgICAgICAgIGN0eC5zZXRPdXRwdXQob3V0cHV0LCBmb3JtYXQgPT0gbnVsbCA/IG51bGwgOiBmb3JtYXQuZ2V0Q2hhclNldEVuY29kaW5nKCkpOwotICAgICAgICAgICAgbWFyc2hhbCh0cnVlLCBjdHgpOwotICAgICAgICAgICAgCi0gICAgICAgIH0gY2F0Y2ggKEppQlhFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFhNTFN0cmVhbUV4Y2VwdGlvbigiRXJyb3IgaW4gSmlCWCBtYXJzaGFsbGluZzogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlI3NlcmlhbGl6ZShqYXZhLmlvLldyaXRlciwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU91dHB1dEZvcm1hdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoV3JpdGVyIHdyaXRlciwgT01PdXRwdXRGb3JtYXQgZm9ybWF0KSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gbWFyc2hhbCB3aXRoIGFsbCBuYW1lc3BhY2UgZGVjbGFyYXRpb25zLCBzaW5jZSBleHRlcm5hbCBzdGF0ZSB1bmtub3duCi0gICAgICAgICAgICBJTWFyc2hhbGxpbmdDb250ZXh0IGN0eCA9IGJpbmRpbmdGYWN0b3J5LmNyZWF0ZU1hcnNoYWxsaW5nQ29udGV4dCgpOwotICAgICAgICAgICAgY3R4LnNldE91dHB1dCh3cml0ZXIpOwotICAgICAgICAgICAgbWFyc2hhbCh0cnVlLCBjdHgpOwotICAgICAgICAgICAgCi0gICAgICAgIH0gY2F0Y2ggKEppQlhFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFhNTFN0cmVhbUV4Y2VwdGlvbigiRXJyb3IgaW4gSmlCWCBtYXJzaGFsbGluZzogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlI3NlcmlhbGl6ZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlcikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIGNoZWNrIGlmIG5hbWVzcGFjZXMgYWxyZWFkeSBkZWNsYXJlZCBmb3IgYWJzdHJhY3QgbWFwcGluZwotICAgICAgICAgICAgYm9vbGVhbiBmdWxsID0gdHJ1ZTsKLSAgICAgICAgICAgIFN0cmluZ1tdIG5zcyA9IGJpbmRpbmdGYWN0b3J5LmdldE5hbWVzcGFjZXMoKTsKLSAgICAgICAgICAgIGlmIChtYXJzaGFsbGVyTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgoZWxlbWVudE5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnROYW1lc3BhY2VQcmVmaXguZXF1YWxzKHByZWZpeCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZnVsbCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG9wZW5OYW1lc3BhY2VJbmRleGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdXJpID0gbnNzW2ldOwotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeCh1cmkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFvcGVuTmFtZXNwYWNlUHJlZml4ZXNbaV0uZXF1YWxzKHByZWZpeCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdWxsID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gbWFyc2hhbCB3aXRoIGFsbCBuYW1lc3BhY2UgZGVjbGFyYXRpb25zLCBzaW5jZSBleHRlcm5hbCBzdGF0ZSB1bmtub3duCi0gICAgICAgICAgICBJWE1MV3JpdGVyIHdyaXRlciA9IG5ldyBTdEFYV3JpdGVyKG5zcywgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgIElNYXJzaGFsbGluZ0NvbnRleHQgY3R4ID0gYmluZGluZ0ZhY3RvcnkuY3JlYXRlTWFyc2hhbGxpbmdDb250ZXh0KCk7Ci0gICAgICAgICAgICBjdHguc2V0WG1sV3JpdGVyKHdyaXRlcik7Ci0gICAgICAgICAgICBtYXJzaGFsKGZ1bGwsIGN0eCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgfSBjYXRjaCAoSmlCWEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgWE1MU3RyZWFtRXhjZXB0aW9uKCJFcnJvciBpbiBKaUJYIG1hcnNoYWxsaW5nOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlvbS5vbS5PTURhdGFTb3VyY2UjZ2V0UmVhZGVyKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgWE1MU3RyZWFtUmVhZGVyIGdldFJlYWRlcigpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYm9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICBzZXJpYWxpemUoYm9zLCBudWxsKTsKLSAgICAgICAgcmV0dXJuIFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJvcy50b0J5dGVBcnJheSgpKSk7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ppYngvc3JjL29yZy9hcGFjaGUvYXhpczIvamlieC9OdWxsQmluZGluZ0ZhY3RvcnkuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2ppYngvc3JjL29yZy9hcGFjaGUvYXhpczIvamlieC9OdWxsQmluZGluZ0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ2NDM1Yy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qaWJ4L3NyYy9vcmcvYXBhY2hlL2F4aXMyL2ppYngvTnVsbEJpbmRpbmdGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamlieDsKLQotaW1wb3J0IG9yZy5qaWJ4LnJ1bnRpbWUuSUJpbmRpbmdGYWN0b3J5OwotaW1wb3J0IG9yZy5qaWJ4LnJ1bnRpbWUuaW1wbC5CaW5kaW5nRmFjdG9yeUJhc2U7Ci0KLS8qKgotICogRHVtbXkgYmluZGluZyBmYWN0b3J5IGZvciB3aGVuIHRoZSBnZW5lcmF0ZWQgQXhpczIgbGlua2FnZSBjb2RlIHVzZXMgb25seSBzaW1wbGUgdmFsdWUKLSAqIGNvbnZlcnNpb25zIChhbmQgaGVuY2UgZG9lc24ndCBuZWVkIGEgcmVhbCBKaUJYIGJpbmRpbmcpLgotICovCi1wdWJsaWMgY2xhc3MgTnVsbEJpbmRpbmdGYWN0b3J5IGV4dGVuZHMgQmluZGluZ0ZhY3RvcnlCYXNlIGltcGxlbWVudHMgSUJpbmRpbmdGYWN0b3J5IHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEVNUFRZX0FSUkFZID0gbmV3IFN0cmluZ1swXTsKLSAgICAKLSAgICBwdWJsaWMgTnVsbEJpbmRpbmdGYWN0b3J5KCkgewotICAgICAgICBzdXBlcigibnVsbCIsIDAsIDAsICIiLCAiIiwgIiIsICIiLCBFTVBUWV9BUlJBWSwgRU1QVFlfQVJSQVksICIiLCAiIiwKLSAgICAgICAgICAgIEVNUFRZX0FSUkFZLCAiIiwgIiIsICIiLCAiIiwgIiIsIEVNUFRZX0FSUkFZKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENvbXBpbGVyRGlzdHJpYnV0aW9uKCkgewotICAgICAgICAvLyBub3JtYWxseSBvbmx5IHVzZWQgYnkgQmluZGluZ0RpcmVjdG9yeSBjb2RlLCBzbyBva2F5IHRvIHB1bnQKLSAgICAgICAgcmV0dXJuICIiOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0Q29tcGlsZXJWZXJzaW9uKCkgewotICAgICAgICAvLyBub3JtYWxseSBvbmx5IHVzZWQgYnkgQmluZGluZ0RpcmVjdG9yeSBjb2RlLCBzbyBva2F5IHRvIHB1bnQKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRUeXBlSW5kZXgoU3RyaW5nIHR5cGUpIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qaWJ4L3NyYy9vcmcvYXBhY2hlL2F4aXMyL2ppYngvdGVtcGxhdGUvSmliWERhdGFiaW5kaW5nVGVtcGxhdGUueHNsIGIvdjEuNS4xUkMzL21vZHVsZXMvamlieC9zcmMvb3JnL2FwYWNoZS9heGlzMi9qaWJ4L3RlbXBsYXRlL0ppYlhEYXRhYmluZGluZ1RlbXBsYXRlLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDE5MmMxOS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qaWJ4L3NyYy9vcmcvYXBhY2hlL2F4aXMyL2ppYngvdGVtcGxhdGUvSmliWERhdGFiaW5kaW5nVGVtcGxhdGUueHNsCisrKyAvZGV2L251bGwKQEAgLTEsOTY1ICswLDAgQEAKLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIiB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSI+Ci0gIDx4c2w6b3V0cHV0IG1ldGhvZD0idGV4dCIvPgotPCEtLSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgIC0tPgotICAgIDwhLS0gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAgIEppQlggdGVtcGxhdGUgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgIC0tPgotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJkYXRhYmluZGVyc1tAZGJ0eXBlPSdqaWJ4J10iPgotICAgIDx4c2w6cGFyYW0gbmFtZT0iY29udGV4dCI+dW5rbm93bjwveHNsOnBhcmFtPgotICAgIAotICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iaW5pdGlhbGl6ZS1iaW5kaW5nIi8+Ci0KLSAgICA8IS0tIHdyYXBwZWQ9J3RydWUnIHVzZXMgb3JpZ2luYWwgY29kZSwgd3JhcHBlZD0nZmFsc2UnIHVud3JhcHMgbWV0aG9kIGNhbGxzIC0tPgotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0id3JhcHBlZCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB3cmFwcGVkIi8+PC94c2w6dmFyaWFibGU+Ci0gICAgPHhzbDppZiB0ZXN0PSIkd3JhcHBlZD0ndHJ1ZSciPgotICAgICAgCi0gICAgICA8IS0tIE1UT00gbm90IHlldCBzdXBwb3J0ZWQgYnkgSmlCWCwgYnV0IGFycmF5IG1heSBiZSBuZWVkZWQgLS0+Ci0gICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImJhc2U2NCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImJhc2U2NEVsZW1lbnRzL25hbWUiLz48L3hzbDp2YXJpYWJsZT4KLSAgICAgIDx4c2w6aWYgdGVzdD0iJGJhc2U2NCI+Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWVbXSBxTmFtZUFycmF5ID0gewotICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iYmFzZTY0RWxlbWVudHMvbmFtZSI+Ci0gICAgICAgICAgPHhzbDppZiB0ZXN0PSJwb3NpdGlvbigpIj4xIj4sPC94c2w6aWY+bmV3IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUoIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbnMtdXJsIi8+IiwiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsb2NhbE5hbWUiLz4iKQotICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICAgICAgfTsKLSAgICAgIDwveHNsOmlmPgotCi0gICAgICAgIC8qKgotICAgICAgICAqICBnZXQgdGhlIGRlZmF1bHQgZW52ZWxvcGUKLSAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlIHRvRW52ZWxvcGUob3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYWN0b3J5IGZhY3RvcnkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWN0b3J5LmdldERlZmF1bHRFbnZlbG9wZSgpOwotICAgICAgICB9Ci0gICAgICAKLSAgICA8L3hzbDppZj4KLSAgICAKLSAgICA8eHNsOmlmIHRlc3Q9IiR3cmFwcGVkPSdmYWxzZSciPgotICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkY29udGV4dD0nbWVzc2FnZS1yZWNlaXZlciciPgotICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIG1vZGU9Im1lc3NhZ2UtcmVjZWl2ZXIiIHNlbGVjdD0iZGJtZXRob2QiLz4KLSAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRjb250ZXh0PSdpbnRlcmZhY2UtaW1wbGVtZW50YXRpb24nIj4KLSAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImlzU3luYyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9jbGFzcy9AaXNTeW5jIi8+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgPHhzbDppZiB0ZXN0PSIkaXNTeW5jPScxJyI+Ci0gICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBtb2RlPSJpbnRlcmZhY2UtaW1wbGVtZW50YXRpb24iIHNlbGVjdD0iZGJtZXRob2QiPjx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzeW5jIj50cnVlPC94c2w6d2l0aC1wYXJhbT48L3hzbDphcHBseS10ZW1wbGF0ZXM+Ci0gICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJpc0FzeW5jIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL2NsYXNzL0Bpc0FzeW5jIi8+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgPHhzbDppZiB0ZXN0PSIkaXNBc3luYz0nMSciPgotICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgbW9kZT0iaW50ZXJmYWNlLWltcGxlbWVudGF0aW9uIiBzZWxlY3Q9ImRibWV0aG9kIj48eHNsOndpdGgtcGFyYW0gbmFtZT0ic3luYyI+ZmFsc2U8L3hzbDp3aXRoLXBhcmFtPjwveHNsOmFwcGx5LXRlbXBsYXRlcz4KLSAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgIDwveHNsOmNob29zZT4KLSAgICA8L3hzbDppZj4KLSAgICAKLSAgICA8eHNsOmNob29zZT4KLSAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkY29udGV4dD0nbWVzc2FnZS1yZWNlaXZlciciPgotICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Im9iamVjdC1vdXRwdXQiLz4KLSAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJvYmplY3QtZmF1bHQiLz4KLSAgICAgIDwveHNsOndoZW4+Ci0gICAgICA8eHNsOndoZW4gdGVzdD0iJGNvbnRleHQ9J2ludGVyZmFjZS1pbXBsZW1lbnRhdGlvbiciPgotICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Im9iamVjdC1pbnB1dCIvPgotICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ic3R1Yi11dGlsaXR5LW1ldGhvZHMiLz4KLSAgICAgIDwveHNsOndoZW4+Ci0gICAgPC94c2w6Y2hvb3NlPgotICAgIAotICA8L3hzbDp0ZW1wbGF0ZT4KLSAgCi0gIAotICA8IS0tCi0gIHRvT00gQU5EIHRvRW52ZWxvcGUgTUVUSE9EIEdFTkVSQVRJT04KLSAgLS0+Ci0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Im9iamVjdC1pbnB1dHxvYmplY3Qtb3V0cHV0Ij4KLQotICAgICAgICBwcml2YXRlIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IHRvT00oPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+IHBhcmFtLCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhY3RvcnkgZmFjdG9yeSwgYm9vbGVhbiBvcHRpbWl6ZUNvbnRlbnQpIHsKLSAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ0b09NLW1ldGhvZC1ib2R5Ii8+Ci0gICAgICAgIH0KLSAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InRvRW52ZWxvcGUtbWV0aG9kIi8+Ci0gIDwveHNsOnRlbXBsYXRlPgotICAKLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ib2JqZWN0LWZhdWx0Ij4KLQotICAgICAgICBwcml2YXRlIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IHRvT00oPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+IHBhcmFtLCBib29sZWFuIG9wdGltaXplQ29udGVudCkgewotICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSA9IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCk7Ci0gICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idG9PTS1tZXRob2QtYm9keSIvPgotICAgICAgICB9Ci0gIDwveHNsOnRlbXBsYXRlPgotICAKLSAgPHhzbDp0ZW1wbGF0ZSBuYW1lPSJ0b09NLW1ldGhvZC1ib2R5Ij4KLSAgICAgICAgICAgIGlmIChwYXJhbSBpbnN0YW5jZW9mIG9yZy5qaWJ4LnJ1bnRpbWUuSU1hcnNoYWxsYWJsZSl7Ci0gICAgICAgICAgICAgICAgaWYgKGJpbmRpbmdGYWN0b3J5ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oYmluZGluZ0Vycm9yTWVzc2FnZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiAobWFwcGVkQ2hpbGQocGFyYW0sIGZhY3RvcnkpKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyYW0gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJDYW5ub3QgYmluZCBudWxsIHZhbHVlIG9mIHR5cGUgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+Iik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJObyBKaUJYICZsdDttYXBwaW5nPiBkZWZpbmVkIGZvciBjbGFzcyA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz4iKTsKLSAgICAgICAgICAgIH0KLSAgPC94c2w6dGVtcGxhdGU+Ci0gIAotICA8eHNsOnRlbXBsYXRlIG5hbWU9InRvRW52ZWxvcGUtbWV0aG9kIj4KLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZSB0b0VudmVsb3BlKG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmFjdG9yeSBmYWN0b3J5LCA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz4gcGFyYW0sIGJvb2xlYW4gb3B0aW1pemVDb250ZW50KSB7Ci0gICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlIGVudmVsb3BlID0gZmFjdG9yeS5nZXREZWZhdWx0RW52ZWxvcGUoKTsKLSAgICAgICAgICAgIGlmIChwYXJhbSAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICBlbnZlbG9wZS5nZXRCb2R5KCkuYWRkQ2hpbGQodG9PTShwYXJhbSwgZmFjdG9yeSwgb3B0aW1pemVDb250ZW50KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZW52ZWxvcGU7Ci0gICAgICAgIH0KLQotICA8L3hzbDp0ZW1wbGF0ZT4KLSAgCi0gIAotICA8IS0tCi0gIE1FU1NBR0UgUkVDRUlWRVIgTUVUSE9EIEdFTkVSQVRJT04KLSAgLS0+Ci0gIAotICA8IS0tIEludm9rZWQgYnkgbWFpbiB0ZW1wbGF0ZSB0byBoYW5kbGUgdW53cmFwcGVkIG1ldGhvZCBnZW5lcmF0aW9uIGZvciBtZXNzYWdlIHJlY2VpdmVyIC0tPgotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJkYm1ldGhvZCIgbW9kZT0ibWVzc2FnZS1yZWNlaXZlciI+Ci0gICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJtZXRob2QtbmFtZSIgc2VsZWN0PSJAbWV0aG9kLW5hbWUiLz4KLSAgICAgIHB1YmxpYyBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAcmVjZWl2ZXItbmFtZSIvPihvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCBlbGVtZW50LCA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iLyovQHNrZWxldG9uSW50ZXJmYWNlTmFtZSIvPiBza2VsLCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhY3RvcnkgZmFjdG9yeSkgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0Ci0gICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iL2ludGVyZmFjZS9tZXRob2RbQG5hbWU9JG1ldGhvZC1uYW1lXS9mYXVsdC9wYXJhbSI+LCA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48L3hzbDpmb3ItZWFjaD4KLSAgICAgIHsKLSAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlIGVudmVsb3BlID0gbnVsbDsKLSAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICBvcmcuamlieC5ydW50aW1lLmltcGwuVW5tYXJzaGFsbGluZ0NvbnRleHQgdWN0eCA9IGdldE5ld1VubWFyc2hhbENvbnRleHQoZWxlbWVudCk7Ci0gICAgICAgICAgICAgIHVjdHgubmV4dCgpOwotICAgICAgICAgICAgICBpbnQgaW5kZXg7Ci0gICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJpbi13cmFwcGVyL3BhcmFtZXRlci1lbGVtZW50IiBtb2RlPSJtZXNzYWdlLXJlY2VpdmVyIi8+Ci0gICAgCi0gICAgPCEtLSBhY3R1YWwgY2FsbCBoYW5kbGluZyBkZXBlbmRzIG9uIHR5cGUgb2YgcmV0dXJuZWQgcmVzdWx0IC0tPgotICAgIDx4c2w6Y2hvb3NlPgotICAgIAotICAgICAgPCEtLSByZXR1cm5pbmcgYW4gYXJyYXkgb2YgdmFsdWVzIC0tPgotICAgICAgPHhzbDp3aGVuIHRlc3Q9Im91dC13cmFwcGVyL0BlbXB0eT0nZmFsc2UnIGFuZCBvdXQtd3JhcHBlci9yZXR1cm4tZWxlbWVudC9AYXJyYXk9J3RydWUnIj4KLSAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJ3cmFwcGVyLXVyaSIgc2VsZWN0PSJvdXQtd3JhcHBlci9AbnMiLz4KLSAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJ3cmFwcGVyLXByZWZpeCIgc2VsZWN0PSJvdXQtd3JhcHBlci9AcHJlZml4Ii8+Ci0gICAgICAgICAgICAgIGVudmVsb3BlID0gZmFjdG9yeS5nZXREZWZhdWx0RW52ZWxvcGUoKTsKLSAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgd3JhcHBlciA9IGZhY3RvcnkuY3JlYXRlT01FbGVtZW50KCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0nb3V0LXdyYXBwZXIvQG5hbWUnLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9JyR3cmFwcGVyLXVyaScvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0nJHdyYXBwZXItcHJlZml4Jy8+Iik7Ci0gICAgICAgIDx4c2w6aWYgdGVzdD0ic3RyaW5nLWxlbmd0aChub3JtYWxpemUtc3BhY2UoJHdyYXBwZXItcHJlZml4KSkgPSAwIj4KLSAgICAgICAgICAgIHdyYXBwZXIuZGVjbGFyZURlZmF1bHROYW1lc3BhY2UoIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSckd3JhcHBlci11cmknLz4iKTsKLSAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgIDx4c2w6aWYgdGVzdD0ib3V0LXdyYXBwZXIvQG5lZWQtbmFtZXNwYWNlcz0ndHJ1ZSciPgotICAgICAgICAgICAgICBhZGRNYXBwaW5nTmFtZXNwYWNlcyhmYWN0b3J5LCB3cmFwcGVyLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9JyR3cmFwcGVyLXVyaScvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0nJHdyYXBwZXItcHJlZml4Jy8+Iik7Ci0gICAgICAgIDwveHNsOmlmPgotICAgICAgICA8eHNsOmlmIHRlc3Q9ImNvdW50KG91dC13cmFwcGVyL2V4dHJhLW5hbWVzcGFjZSkgJmd0OyAwIj4KLSAgICAgICAgICAgICAgd3JhcHBlci5kZWNsYXJlTmFtZXNwYWNlKGZhY3RvcnkuY3JlYXRlT01OYW1lc3BhY2UoIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSdvdXQtd3JhcHBlci9leHRyYS1uYW1lc3BhY2UvQG5zJy8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSdvdXQtd3JhcHBlci9leHRyYS1uYW1lc3BhY2UvQHByZWZpeCcvPiIpKTsKLSAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAgIGVudmVsb3BlLmdldEJvZHkoKS5hZGRDaGlsZCh3cmFwcGVyKTsKLSAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im91dC13cmFwcGVyL3JldHVybi1lbGVtZW50L0BqYXZhLXR5cGUiLz5bXSByZXN1bHRzID0gc2tlbC48eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY2FsbC1hcmctbGlzdCIvPjsKLSAgICAgICAgICAgICAgaWYgKHJlc3VsdHMgPT0gbnVsbCB8fCByZXN1bHRzLmxlbmd0aCA9PSAwKSB7Ci0gICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJvdXQtd3JhcHBlci9yZXR1cm4tZWxlbWVudC9Ab3B0aW9uYWw9J3RydWUnIi8+Ci0gICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQoIk1pc3NpbmcgcmVxdWlyZWQgcmVzdWx0Iik7Ci0gICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJvdXQtd3JhcHBlci9yZXR1cm4tZWxlbWVudC9AZm9ybT0nY29tcGxleCciPgotICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgJmx0OyByZXN1bHRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im91dC13cmFwcGVyL3JldHVybi1lbGVtZW50L0BqYXZhLXR5cGUiLz4gcmVzdWx0ID0gcmVzdWx0c1tpXTsKLSAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKLSAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0ib3V0LXdyYXBwZXIvcmV0dXJuLWVsZW1lbnQvQG9wdGlvbmFsPSd0cnVlJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGp1c3Qgc2tpcCBvcHRpb25hbCBlbGVtZW50Ci0gICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJvdXQtd3JhcHBlci9yZXR1cm4tZWxlbWVudC9AbmlsbGFibGU9J3RydWUnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgY2hpbGQgPSBmYWN0b3J5LmNyZWF0ZU9NRWxlbWVudCgiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9J291dC13cmFwcGVyL3JldHVybi1lbGVtZW50L0BuYW1lJy8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSdvdXQtd3JhcHBlci9yZXR1cm4tZWxlbWVudC9AbnMnLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9J291dC13cmFwcGVyL3JldHVybi1lbGVtZW50L0BwcmVmaXgnLz4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5hbWVzcGFjZSB4c2lucyA9IGZhY3RvcnkuY3JlYXRlT01OYW1lc3BhY2UoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwgInhzaSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5kZWNsYXJlTmFtZXNwYWNlKHhzaW5zKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuYWRkQXR0cmlidXRlKCJuaWwiLCAidHJ1ZSIsIHhzaW5zKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlci5hZGRDaGlsZChjaGlsZCk7Ci0gICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQoIk51bGwgdmFsdWUgaW4gcmVzdWx0IGFycmF5IG5vdCBhbGxvd2VkIHVubGVzcyBlbGVtZW50IGhhcyBuaWxsYWJsZT0ndHJ1ZSciKTsKLSAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiaW5kaW5nRmFjdG9yeSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihiaW5kaW5nRXJyb3JNZXNzYWdlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJvdXQtd3JhcHBlci9yZXR1cm4tZWxlbWVudC9AZm9ybT0nY29tcGxleCcgYW5kIG91dC13cmFwcGVyL3JldHVybi1lbGVtZW50L0B0eXBlLWluZGV4PScnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlci5hZGRDaGlsZChtYXBwZWRDaGlsZChyZXN1bHQsIGZhY3RvcnkpKTsKLSAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlIHNyYyA9IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmppYnguSmlCWERhdGFTb3VyY2UocmVzdWx0LCBfdHlwZV9uYW1lPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im91dC13cmFwcGVyL3JldHVybi1lbGVtZW50L0B0eXBlLWluZGV4Ii8+LCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9J291dC13cmFwcGVyL3JldHVybi1lbGVtZW50L0BuYW1lJy8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSdvdXQtd3JhcHBlci9yZXR1cm4tZWxlbWVudC9AbnMnLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9J291dC13cmFwcGVyL3JldHVybi1lbGVtZW50L0BwcmVmaXgnLz4iLCBiaW5kaW5nTmFtZXNwYWNlSW5kZXhlcywgYmluZGluZ05hbWVzcGFjZVByZWZpeGVzLCBiaW5kaW5nRmFjdG9yeSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01OYW1lc3BhY2UgYXBwbnMgPSBmYWN0b3J5LmNyZWF0ZU9NTmFtZXNwYWNlKCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0nb3V0LXdyYXBwZXIvcmV0dXJuLWVsZW1lbnQvQG5zJy8+IiwgIiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCBjaGlsZCA9IGZhY3RvcnkuY3JlYXRlT01FbGVtZW50KHNyYywgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSdvdXQtd3JhcHBlci9yZXR1cm4tZWxlbWVudC9AbmFtZScvPiIsIGFwcG5zKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlci5hZGRDaGlsZChjaGlsZCk7Ci0gICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpICZsdDsgcmVzdWx0cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJvdXQtd3JhcHBlci9yZXR1cm4tZWxlbWVudC9AamF2YS10eXBlIi8+IHJlc3VsdCA9IHJlc3VsdHNbaV07Ci0gICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgY2hpbGQgPSBmYWN0b3J5LmNyZWF0ZU9NRWxlbWVudCgiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9J291dC13cmFwcGVyL3JldHVybi1lbGVtZW50L0BuYW1lJy8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSdvdXQtd3JhcHBlci9yZXR1cm4tZWxlbWVudC9AbnMnLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9J291dC13cmFwcGVyL3JldHVybi1lbGVtZW50L0BwcmVmaXgnLz4iKTsKLSAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0ib3V0LXdyYXBwZXIvcmV0dXJuLWVsZW1lbnQvQHNlcmlhbGl6ZXI9JyciPgotICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnNldFRleHQocmVzdWx0LnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zZXRUZXh0KDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJvdXQtd3JhcHBlci9yZXR1cm4tZWxlbWVudC9Ac2VyaWFsaXplciIvPihyZXN1bHQpKTsKLSAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgIHdyYXBwZXIuYWRkQ2hpbGQoY2hpbGQpOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICB9Ci0gICAgICA8L3hzbDp3aGVuPgotICAgIAotICAgICAgPCEtLSByZXR1cm5pbmcgYSBzaW5nbGUgdmFsdWUgLS0+Ci0gICAgICA8eHNsOndoZW4gdGVzdD0ib3V0LXdyYXBwZXIvQGVtcHR5PSdmYWxzZSciPgotICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9IndyYXBwZXItdXJpIiBzZWxlY3Q9Im91dC13cmFwcGVyL0BucyIvPgotICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9IndyYXBwZXItcHJlZml4IiBzZWxlY3Q9Im91dC13cmFwcGVyL0BwcmVmaXgiLz4KLSAgICAgICAgICAgICAgZW52ZWxvcGUgPSBmYWN0b3J5LmdldERlZmF1bHRFbnZlbG9wZSgpOwotICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCB3cmFwcGVyID0gZmFjdG9yeS5jcmVhdGVPTUVsZW1lbnQoIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSdvdXQtd3JhcHBlci9AbmFtZScvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0nJHdyYXBwZXItdXJpJy8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSckd3JhcHBlci1wcmVmaXgnLz4iKTsKLSAgICAgICAgPHhzbDppZiB0ZXN0PSJzdHJpbmctbGVuZ3RoKG5vcm1hbGl6ZS1zcGFjZSgkd3JhcHBlci1wcmVmaXgpKSA9IDAiPgotICAgICAgICAgICAgd3JhcHBlci5kZWNsYXJlRGVmYXVsdE5hbWVzcGFjZSgiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9JyR3cmFwcGVyLXVyaScvPiIpOwotICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgPHhzbDppZiB0ZXN0PSJvdXQtd3JhcHBlci9AbmVlZC1uYW1lc3BhY2VzPSd0cnVlJyI+Ci0gICAgICAgICAgICAgIGFkZE1hcHBpbmdOYW1lc3BhY2VzKGZhY3RvcnksIHdyYXBwZXIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0nJHdyYXBwZXItdXJpJy8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSckd3JhcHBlci1wcmVmaXgnLz4iKTsKLSAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgIDx4c2w6aWYgdGVzdD0iY291bnQob3V0LXdyYXBwZXIvZXh0cmEtbmFtZXNwYWNlKSAmZ3Q7IDAiPgotICAgICAgICAgICAgICB3cmFwcGVyLmRlY2xhcmVOYW1lc3BhY2UoZmFjdG9yeS5jcmVhdGVPTU5hbWVzcGFjZSgiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9J291dC13cmFwcGVyL2V4dHJhLW5hbWVzcGFjZS9AbnMnLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9J291dC13cmFwcGVyL2V4dHJhLW5hbWVzcGFjZS9AcHJlZml4Jy8+IikpOwotICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgZW52ZWxvcGUuZ2V0Qm9keSgpLmFkZENoaWxkKHdyYXBwZXIpOwotICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ib3V0LXdyYXBwZXIvcmV0dXJuLWVsZW1lbnQvQGphdmEtdHlwZSIvPiByZXN1bHQgPSBza2VsLjx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJjYWxsLWFyZy1saXN0Ii8+OwotICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICA8eHNsOndoZW4gdGVzdD0ib3V0LXdyYXBwZXIvcmV0dXJuLWVsZW1lbnQvQGZvcm09J2NvbXBsZXgnIj4KLSAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9Im91dC13cmFwcGVyL3JldHVybi1lbGVtZW50L0BvcHRpb25hbD0ndHJ1ZSciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBqdXN0IHNraXAgb3B0aW9uYWwgZWxlbWVudAotICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0ib3V0LXdyYXBwZXIvcmV0dXJuLWVsZW1lbnQvQG5pbGxhYmxlPSd0cnVlJyI+Ci0gICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCBjaGlsZCA9IGZhY3RvcnkuY3JlYXRlT01FbGVtZW50KCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0nb3V0LXdyYXBwZXIvcmV0dXJuLWVsZW1lbnQvQG5hbWUnLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9J291dC13cmFwcGVyL3JldHVybi1lbGVtZW50L0BucycvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0nb3V0LXdyYXBwZXIvcmV0dXJuLWVsZW1lbnQvQHByZWZpeCcvPiIpOwotICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5hbWVzcGFjZSB4c2lucyA9IGZhY3RvcnkuY3JlYXRlT01OYW1lc3BhY2UoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwgInhzaSIpOwotICAgICAgICAgICAgICAgICAgY2hpbGQuZGVjbGFyZU5hbWVzcGFjZSh4c2lucyk7Ci0gICAgICAgICAgICAgICAgICBjaGlsZC5hZGRBdHRyaWJ1dGUoIm5pbCIsICJ0cnVlIiwgeHNpbnMpOwotICAgICAgICAgICAgICAgICAgd3JhcHBlci5hZGRDaGlsZChjaGlsZCk7Ci0gICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0KCJNaXNzaW5nIHJlcXVpcmVkIHJlc3VsdCIpOwotICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICBpZiAoYmluZGluZ0ZhY3RvcnkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGJpbmRpbmdFcnJvck1lc3NhZ2UpOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJvdXQtd3JhcHBlci9yZXR1cm4tZWxlbWVudC9AZm9ybT0nY29tcGxleCcgYW5kIG91dC13cmFwcGVyL3JldHVybi1lbGVtZW50L0B0eXBlLWluZGV4PScnIj4KLSAgICAgICAgICAgICAgICAgIHdyYXBwZXIuYWRkQ2hpbGQobWFwcGVkQ2hpbGQocmVzdWx0LCBmYWN0b3J5KSk7Ci0gICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTURhdGFTb3VyY2Ugc3JjID0gbmV3IG9yZy5hcGFjaGUuYXhpczIuamlieC5KaUJYRGF0YVNvdXJjZShyZXN1bHQsIF90eXBlX25hbWU8eHNsOnZhbHVlLW9mIHNlbGVjdD0ib3V0LXdyYXBwZXIvcmV0dXJuLWVsZW1lbnQvQHR5cGUtaW5kZXgiLz4sICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0nb3V0LXdyYXBwZXIvcmV0dXJuLWVsZW1lbnQvQG5hbWUnLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9J291dC13cmFwcGVyL3JldHVybi1lbGVtZW50L0BucycvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0nb3V0LXdyYXBwZXIvcmV0dXJuLWVsZW1lbnQvQHByZWZpeCcvPiIsIGJpbmRpbmdOYW1lc3BhY2VJbmRleGVzLCBiaW5kaW5nTmFtZXNwYWNlUHJlZml4ZXMsIGJpbmRpbmdGYWN0b3J5KTsKLSAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01OYW1lc3BhY2UgYXBwbnMgPSBmYWN0b3J5LmNyZWF0ZU9NTmFtZXNwYWNlKCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0nb3V0LXdyYXBwZXIvcmV0dXJuLWVsZW1lbnQvQG5zJy8+IiwgIiIpOwotICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgY2hpbGQgPSBmYWN0b3J5LmNyZWF0ZU9NRWxlbWVudChzcmMsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0nb3V0LXdyYXBwZXIvcmV0dXJuLWVsZW1lbnQvQG5hbWUnLz4iLCBhcHBucyk7Ci0gICAgICAgICAgICAgICAgICB3cmFwcGVyLmFkZENoaWxkKGNoaWxkKTsKLSAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgY2hpbGQgPSBmYWN0b3J5LmNyZWF0ZU9NRWxlbWVudCgiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9J291dC13cmFwcGVyL3JldHVybi1lbGVtZW50L0BuYW1lJy8+IiwgICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0nb3V0LXdyYXBwZXIvcmV0dXJuLWVsZW1lbnQvQG5zJy8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSdvdXQtd3JhcHBlci9yZXR1cm4tZWxlbWVudC9AcHJlZml4Jy8+Iik7Ci0gICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9Im91dC13cmFwcGVyL3JldHVybi1lbGVtZW50L0BvYmplY3Q9J3RydWUnIj4KLSAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTmFtZXNwYWNlIHhzaW5zID0gZmFjdG9yeS5jcmVhdGVPTU5hbWVzcGFjZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCAieHNpIik7Ci0gICAgICAgICAgICAgICAgICBjaGlsZC5kZWNsYXJlTmFtZXNwYWNlKHhzaW5zKTsKLSAgICAgICAgICAgICAgICAgIGNoaWxkLmFkZEF0dHJpYnV0ZSgibmlsIiwgInRydWUiLCB4c2lucyk7Ci0gICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InNldC1yZXN1bHQtdGV4dCIvPgotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJzZXQtcmVzdWx0LXRleHQiLz4KLSAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICB3cmFwcGVyLmFkZENoaWxkKGNoaWxkKTsKLSAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgIDwveHNsOndoZW4+Ci0gICAgCi0gICAgICA8IS0tIG5vdCByZXR1cm5pbmcgYW55dGhpbmcgLS0+Ci0gICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgc2tlbC48eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY2FsbC1hcmctbGlzdCIvPjsKLSAgICAgICAgPHhzbDppZiB0ZXN0PSJjb3VudChvdXQtd3JhcHBlcikmZ3Q7MCI+Ci0gICAgICAgICAgICAgIGVudmVsb3BlID0gZmFjdG9yeS5nZXREZWZhdWx0RW52ZWxvcGUoKTsKLSAgICAgICAgICAgICAgZW52ZWxvcGUuZ2V0Qm9keSgpLmFkZENoaWxkKGZhY3RvcnkuY3JlYXRlT01FbGVtZW50KCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0nb3V0LXdyYXBwZXIvQG5hbWUnLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9J291dC13cmFwcGVyL0BucycvPiIsICIiKSk7Ci0gICAgICAgIDwveHNsOmlmPgotICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgCi0gICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgIH0gY2F0Y2ggKG9yZy5qaWJ4LnJ1bnRpbWUuSmlCWEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgIHRocm93IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgcmV0dXJuIGVudmVsb3BlOwotICAgICAgfQotICA8L3hzbDp0ZW1wbGF0ZT4KLSAgCi0gIDx4c2w6dGVtcGxhdGUgbmFtZT0ic2V0LXJlc3VsdC10ZXh0Ij4KLSAgICA8eHNsOmNob29zZT4KLSAgICAgIDx4c2w6d2hlbiB0ZXN0PSJvdXQtd3JhcHBlci9yZXR1cm4tZWxlbWVudC9Ac2VyaWFsaXplcj0nJyI+Ci0gICAgICAgICAgICAgIGNoaWxkLnNldFRleHQocmVzdWx0LnRvU3RyaW5nKCkpOwotICAgICAgPC94c2w6d2hlbj4KLSAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICBjaGlsZC5zZXRUZXh0KDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJvdXQtd3JhcHBlci9yZXR1cm4tZWxlbWVudC9Ac2VyaWFsaXplciIvPihyZXN1bHQ8eHNsOmlmIHRlc3Q9Im91dC13cmFwcGVyL3JldHVybi1lbGVtZW50L0B3cmFwcGVkLXByaW1pdGl2ZT0ndHJ1ZSciPi48eHNsOnZhbHVlLW9mIHNlbGVjdD0ib3V0LXdyYXBwZXIvcmV0dXJuLWVsZW1lbnQvQHZhbHVlLW1ldGhvZCIvPigpPC94c2w6aWY+KSk7Ci0gICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgPC94c2w6Y2hvb3NlPgotICA8L3hzbDp0ZW1wbGF0ZT4KLSAgCi0gIDwhLS0gR2VuZXJhdGUgYXJndW1lbnQgbGlzdCBmb3IgbWVzc2FnZSByZWNlaXZlciBjYWxsIHRvIGFjdHVhbCBpbXBsZW1lbnRhdGlvbiBtZXRob2QuIC0tPgotICA8eHNsOnRlbXBsYXRlIG5hbWU9ImNhbGwtYXJnLWxpc3QiPgotICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbWV0aG9kLW5hbWUiLz4oCi0gICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImluLXdyYXBwZXIvcGFyYW1ldGVyLWVsZW1lbnQiPgotICAgICAgPHhzbDppZiB0ZXN0PSJwb3NpdGlvbigpJmd0OzEiPiwgPC94c2w6aWY+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBqYXZhLW5hbWUiLz4KLSAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICApCi0gIDwveHNsOnRlbXBsYXRlPgotICAKLSAgPCEtLSBHZW5lcmF0ZSBjb2RlIGZvciBhIHBhcnRpY3VsYXIgcGFyYW1ldGVyIGVsZW1lbnQgaW4gYSBtZXNzYWdlIHJlY2VpdmVyIG1ldGhvZCAtLT4KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0icGFyYW1ldGVyLWVsZW1lbnQiIG1vZGU9Im1lc3NhZ2UtcmVjZWl2ZXIiPgotICAgIDx4c2w6Y2hvb3NlPgotICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBhcnJheT0ndHJ1ZSciPgotICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idW5tYXJzaGFsLWFycmF5Ii8+Ci0gICAgICA8L3hzbDp3aGVuPgotICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ1bm1hcnNoYWwtdmFsdWUiLz4KLSAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICA8L3hzbDpjaG9vc2U+Ci0gIDwveHNsOnRlbXBsYXRlPgotICAKLSAgCi0gIDwhLS0gCi0gIENMSUVOVCBTVFVCIFVOV1JBUFBFRCBNRVRIT0QgR0VORVJBVElPTgotICAtLT4KLSAgCi0gIDwhLS0gSW52b2tlZCBieSBtYWluIHRlbXBsYXRlIHRvIGhhbmRsZSB1bndyYXBwZWQgbWV0aG9kIGdlbmVyYXRpb24gZm9yIHN5bmNocm9ub3VzIGNsaWVudCBzdHViIC0tPgotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJkYm1ldGhvZCIgbW9kZT0iaW50ZXJmYWNlLWltcGxlbWVudGF0aW9uIj4KLSAgICA8eHNsOnBhcmFtIG5hbWU9InN5bmMiPmVycm9yPC94c2w6cGFyYW0+Ci0gICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJpbnRlcmZhY2VOYW1lIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL2NsYXNzL0BpbnRlcmZhY2VOYW1lIi8+PC94c2w6dmFyaWFibGU+Ci0gICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJwYWNrYWdlIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL2NsYXNzL0BwYWNrYWdlIi8+PC94c2w6dmFyaWFibGU+Ci0gICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJyZXR1cm4tYmFzZS10eXBlIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0ib3V0LXdyYXBwZXIvcmV0dXJuLWVsZW1lbnQvQGphdmEtdHlwZSIvPjwveHNsOnZhcmlhYmxlPgotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icmV0dXJuLWZ1bGwtdHlwZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZXR1cm4tYmFzZS10eXBlIi8+PHhzbDppZiB0ZXN0PSJvdXQtd3JhcHBlci9yZXR1cm4tZWxlbWVudC9AYXJyYXk9J3RydWUnIj5bXTwveHNsOmlmPjwveHNsOnZhcmlhYmxlPgotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ibWV0aG9kLW5hbWUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbWV0aG9kLW5hbWUiLz48L3hzbDp2YXJpYWJsZT4KLSAgICAKLSAgICAgICAgLyoqCi0gICAgPHhzbDppZiB0ZXN0PSIkc3luYz0ndHJ1ZSciPgotICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBzeW5jaHJvbm91cyBjYWxsIG1ldGhvZAotICAgICAgICAgKiAKLSAgICAgICAgICogQHNlZSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBhY2thZ2UiLz4uPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbnRlcmZhY2VOYW1lIi8+Izx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbWV0aG9kLW5hbWUiLz4KLSAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImluLXdyYXBwZXIvcGFyYW1ldGVyLWVsZW1lbnQiPgotICAgICAgICAgKiBAcGFyYW0gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBqYXZhLW5hbWUiLz48L3hzbDpmb3ItZWFjaD4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyA8eHNsOmNob29zZT48eHNsOndoZW4gdGVzdD0ic3RyaW5nLWxlbmd0aChub3JtYWxpemUtc3BhY2UoJHJldHVybi1mdWxsLXR5cGUpKSAmZ3Q7IDAiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmV0dXJuLWZ1bGwtdHlwZSIvPjwveHNsOndoZW4+PHhzbDpvdGhlcndpc2U+dm9pZDwveHNsOm90aGVyd2lzZT48L3hzbDpjaG9vc2U+PHhzbDp0ZXh0PiA8L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbWV0aG9kLW5hbWUiLz4oCi0gICAgPC94c2w6aWY+Ci0gICAgPHhzbDppZiB0ZXN0PSIkc3luYz0nZmFsc2UnIj4KLSAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgYXN5bmNocm9ub3VzIGNhbGwgbWV0aG9kCi0gICAgICAgICAqIAotICAgICAgICAgKiBAc2VlIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcGFja2FnZSIvPi48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGludGVyZmFjZU5hbWUiLz4jc3RhcnQ8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG1ldGhvZC1uYW1lIi8+Ci0gICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJpbi13cmFwcGVyL3BhcmFtZXRlci1lbGVtZW50Ij4KLSAgICAgICAgICogQHBhcmFtIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAamF2YS1uYW1lIi8+PC94c2w6Zm9yLWVhY2g+Ci0gICAgPHhzbDppZiB0ZXN0PSIkc3luYz0ndHJ1ZSciPgotICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Ii9jbGFzcy9tZXRob2RbQG5hbWU9JG1ldGhvZC1uYW1lXS9mYXVsdC9wYXJhbSI+Ci0gICAgICAgICAqIEB0aHJvd3MgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+Ci0gICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICA8L3hzbDppZj4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBtZXRob2QtbmFtZSIvPigKLSAgICA8L3hzbDppZj4KLSAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImluLXdyYXBwZXIvcGFyYW1ldGVyLWVsZW1lbnQiPgotICAgICAgICAgIDx4c2w6aWYgdGVzdD0icG9zaXRpb24oKSZndDsxIj4sIDwveHNsOmlmPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAamF2YS10eXBlIi8+PHhzbDppZiB0ZXN0PSJAYXJyYXk9J3RydWUnIj5bXTwveHNsOmlmPjx4c2w6dGV4dD4gPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGphdmEtbmFtZSIvPgotICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICA8eHNsOmlmIHRlc3Q9IiRzeW5jPSdmYWxzZSciPgotICAgICAgICA8eHNsOmlmIHRlc3Q9ImluLXdyYXBwZXIvQGVtcHR5PSdmYWxzZSciPiwgPC94c2w6aWY+ZmluYWwgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9jbGFzcy9AY2FsbGJhY2tuYW1lIi8+IF9jYWxsYmFjawotICAgIDwveHNsOmlmPgotICAgICAgICAgICAgKSB0aHJvd3MgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uCi0gICAgPHhzbDppZiB0ZXN0PSIkc3luYz0ndHJ1ZSciPgotICAgICAgPCEtLWFkZCB0aGUgZmF1bHRzLS0+Ci0gICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iL2NsYXNzL21ldGhvZFtAbmFtZT0kbWV0aG9kLW5hbWVdL2ZhdWx0L3BhcmFtIj4sIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwveHNsOmZvci1lYWNoPgotICAgIDwveHNsOmlmPgotICAgICAgICAgICAgewotICAgIDwhLS0gU2ltcGxlIHBhcmFtZXRlciB2YWx1ZXMgKHRob3NlIHdpdGggc2VyaWFsaXplcnMpIGNhbiBiZSBoYW5kbGVkIGJ5Ci0gICAgICBkaXJlY3QgY29udmVyc2lvbiB0byBlbGVtZW50cy4gQ29tcGxleCBwYXJhbWV0ZXIgdmFsdWVzIG5lZWQgdG8gdXNlIGRhdGEKLSAgICAgIHNvdXJjZXMuIFRoaXMgY29kZSBoYW5kbGVzIGJvdGggdHlwZXMuIC0tPgotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpbnQgX29wSW5kZXggPSA8eHNsOmFwcGx5LXRlbXBsYXRlcyBtb2RlPSJnZXQtaW5kZXgiIHNlbGVjdD0iL2NsYXNzL21ldGhvZFtAbmFtZT0kbWV0aG9kLW5hbWVdIj48L3hzbDphcHBseS10ZW1wbGF0ZXM+OwotICAgICAgICAgICAgICAgIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgb3BuYW1lID0gX29wZXJhdGlvbnNbX29wSW5kZXhdLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5PcGVyYXRpb25DbGllbnQgX29wZXJhdGlvbkNsaWVudCA9IF9zZXJ2aWNlQ2xpZW50LmNyZWF0ZUNsaWVudChvcG5hbWUpOwotICAgICAgICAgICAgICAgIF9vcGVyYXRpb25DbGllbnQuZ2V0T3B0aW9ucygpLnNldEFjdGlvbigiPHhzbDphcHBseS10ZW1wbGF0ZXMgbW9kZT0iZ2V0LWFjdGlvbiIgc2VsZWN0PSIvY2xhc3MvbWV0aG9kW0BuYW1lPSRtZXRob2QtbmFtZV0iPjwveHNsOmFwcGx5LXRlbXBsYXRlcz4iKTsKLSAgICAgICAgICAgICAgICBfb3BlcmF0aW9uQ2xpZW50LmdldE9wdGlvbnMoKS5zZXRFeGNlcHRpb25Ub0JlVGhyb3duT25TT0FQRmF1bHQodHJ1ZSk7Ci0gICAgCi0gICAgICAgICAgICAgICAgLy8gY3JlYXRlIFNPQVAgZW52ZWxvcGUgd2l0aCB0aGUgcGF5bG9hZAotICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGUgZW52ID0gY3JlYXRlRW52ZWxvcGUoX29wZXJhdGlvbkNsaWVudC5nZXRPcHRpb25zKCkpOwotICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmFjdG9yeSBmYWN0b3J5ID0gZ2V0RmFjdG9yeShfb3BlcmF0aW9uQ2xpZW50LmdldE9wdGlvbnMoKS5nZXRTb2FwVmVyc2lvblVSSSgpKTsKLSAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCB3cmFwcGVyID0gZmFjdG9yeS5jcmVhdGVPTUVsZW1lbnQoIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSdpbi13cmFwcGVyL0BuYW1lJy8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSdpbi13cmFwcGVyL0BucycvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0naW4td3JhcHBlci9AcHJlZml4Jy8+Iik7Ci0gICAgPHhzbDppZiB0ZXN0PSJzdHJpbmctbGVuZ3RoKG5vcm1hbGl6ZS1zcGFjZShpbi13cmFwcGVyL0BwcmVmaXgpKSA9IDAiPgotICAgICAgICAgICAgICAgIHdyYXBwZXIuZGVjbGFyZURlZmF1bHROYW1lc3BhY2UoIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSdpbi13cmFwcGVyL0BucycvPiIpOwotICAgIDwveHNsOmlmPgotICAgIDx4c2w6aWYgdGVzdD0iaW4td3JhcHBlci9AbmVlZC1uYW1lc3BhY2VzPSd0cnVlJyI+Ci0gICAgICAgICAgICAgICAgYWRkTWFwcGluZ05hbWVzcGFjZXMoZmFjdG9yeSwgd3JhcHBlciwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSdpbi13cmFwcGVyL0BucycvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0naW4td3JhcHBlci9AcHJlZml4Jy8+Iik7Ci0gICAgPC94c2w6aWY+Ci0gICAgPHhzbDppZiB0ZXN0PSJjb3VudChpbi13cmFwcGVyL2V4dHJhLW5hbWVzcGFjZSkgJmd0OyAwIj4KLSAgICAgICAgICAgICAgICB3cmFwcGVyLmRlY2xhcmVOYW1lc3BhY2UoZmFjdG9yeS5jcmVhdGVPTU5hbWVzcGFjZSgiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9J2luLXdyYXBwZXIvZXh0cmEtbmFtZXNwYWNlL0BucycvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0naW4td3JhcHBlci9leHRyYS1uYW1lc3BhY2UvQHByZWZpeCcvPiIpKTsKLSAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgICBlbnYuZ2V0Qm9keSgpLmFkZENoaWxkKHdyYXBwZXIpOwotICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IGNoaWxkOwotICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iaW4td3JhcHBlci9wYXJhbWV0ZXItZWxlbWVudCIgbW9kZT0iaW50ZXJmYWNlLWltcGxlbWVudGF0aW9uIi8+Ci0gICAgCi0gICAgICAgICAgICAgICAgLy8gYWRkIFNPQVAgaGVhZGVycwotICAgICAgICAgICAgICAgIF9zZXJ2aWNlQ2xpZW50LmFkZEhlYWRlcnNUb0VudmVsb3BlKGVudik7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gY3JlYXRlIG1lc3NhZ2UgY29udGV4dCB3aXRoIHRoYXQgZW52ZWxvcGUKLSAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQgX21lc3NhZ2VDb250ZXh0ID0gbmV3IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dCgpOwotICAgICAgICAgICAgICAgIF9tZXNzYWdlQ29udGV4dC5zZXRFbnZlbG9wZShlbnYpOwotICAgIAotICAgICAgICAgICAgICAgIC8vIGFkZCB0aGUgbWVzc2FnZSBjb250ZXh0IHRvIHRoZSBvcGVyYXRpb24gY2xpZW50Ci0gICAgICAgICAgICAgICAgX29wZXJhdGlvbkNsaWVudC5hZGRNZXNzYWdlQ29udGV4dChfbWVzc2FnZUNvbnRleHQpOwotICAgIAotICAgIDx4c2w6aWYgdGVzdD0iJHN5bmM9J3RydWUnIj4KLSAgICAgICAgICAgICAgIC8vIGV4ZWN1dGUgdGhlIG9wZXJhdGlvbiBjbGllbnQKLSAgICAgICAgICAgICAgICBfb3BlcmF0aW9uQ2xpZW50LmV4ZWN1dGUodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICA8eHNsOmlmIHRlc3Q9Im91dC13cmFwcGVyL0BlbXB0eT0nZmFsc2UnIj4KLSAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQgX3JldHVybk1lc3NhZ2VDb250ZXh0ID0gX29wZXJhdGlvbkNsaWVudAotICAgICAgICAgICAgICAgICAgICAuZ2V0TWVzc2FnZUNvbnRleHQob3JnLmFwYWNoZS5heGlzMi53c2RsLldTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9JTl9WQUxVRSk7Ci0gICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgX3Jlc3BvbnNlID0gX3JldHVybk1lc3NhZ2VDb250ZXh0LmdldEVudmVsb3BlKCkuZ2V0Qm9keSgpLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgICAgICAgICAgIGlmIChfcmVzcG9uc2UgIT0gbnVsbCAmYW1wOyZhbXA7ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0nb3V0LXdyYXBwZXIvQG5hbWUnLz4iLmVxdWFscyhfcmVzcG9uc2UuZ2V0TG9jYWxOYW1lKCkpICZhbXA7JmFtcDsKLSAgICAgICAgICAgICAgICAgICAgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSdvdXQtd3JhcHBlci9AbnMnLz4iLmVxdWFscyhfcmVzcG9uc2UuZ2V0TmFtZXNwYWNlKCkuZ2V0TmFtZXNwYWNlVVJJKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9yZy5qaWJ4LnJ1bnRpbWUuaW1wbC5Vbm1hcnNoYWxsaW5nQ29udGV4dCB1Y3R4ID0gZ2V0TmV3VW5tYXJzaGFsQ29udGV4dChfcmVzcG9uc2UpOwotICAgICAgICAgICAgICAgICAgICB1Y3R4LnBhcnNlUGFzdFN0YXJ0VGFnKCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0nb3V0LXdyYXBwZXIvQG5zJy8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSdvdXQtd3JhcHBlci9AbmFtZScvPiIpOwotICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXg7Ci0gICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0ib3V0LXdyYXBwZXIvcmV0dXJuLWVsZW1lbnQiIG1vZGU9ImludGVyZmFjZS1pbXBsZW1lbnRhdGlvbiIvPgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im91dC13cmFwcGVyL3JldHVybi1lbGVtZW50L0BqYXZhLW5hbWUiLz47Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0KCJNaXNzaW5nIGV4cGVjdGVkIHJldHVybiB3cmFwcGVyIGVsZW1lbnQgezx4c2w6dmFsdWUtb2Ygc2VsZWN0PSdvdXQtd3JhcHBlci9AbnMnLz59PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9J291dC13cmFwcGVyL0BuYW1lJy8+Iik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIEV4Y2VwdGlvbiBvdXRleCA9IGNvbnZlcnRFeGNlcHRpb24oZSk7Ci0gICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iL2NsYXNzL21ldGhvZFtAbmFtZT0kbWV0aG9kLW5hbWVdL2ZhdWx0L3BhcmFtIj4KLSAgICAgICAgICAgICAgICBpZiAob3V0ZXggaW5zdGFuY2VvZiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4pIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPilvdXRleDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICAgICAgICAgICAgICAvLyBzaG91bGQgbmV2ZXIgaGFwcGVuLCBidXQganVzdCBpbiBjYXNlCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlVuZXhwZWN0ZWQgZXhjZXB0aW9uIHR5cGU6ICIgKwotICAgICAgICAgICAgICAgICAgICBvdXRleC5nZXRDbGFzcygpLmdldE5hbWUoKSwgb3V0ZXgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgPC94c2w6aWY+Ci0gICAgPHhzbDppZiB0ZXN0PSIkc3luYz0nZmFsc2UnIj4KLSAgICAgICAgICAgICAgICBfb3BlcmF0aW9uQ2xpZW50LnNldENhbGxiYWNrKG5ldyBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5hc3luYy5DYWxsYmFjaygpIHsKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25Db21wbGV0ZShvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5hc3luYy5Bc3luY1Jlc3VsdCBhc3luYykgewotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCByZXN1bHQgPSBhc3luYy5nZXRSZXNwb25zZUVudmVsb3BlKCkuZ2V0Qm9keSgpLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCAmYW1wOyZhbXA7ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0nb3V0LXdyYXBwZXIvQG5hbWUnLz4iLmVxdWFscyhyZXN1bHQuZ2V0TG9jYWxOYW1lKCkpICZhbXA7JmFtcDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSdvdXQtd3JhcHBlci9AbnMnLz4iLmVxdWFscyhyZXN1bHQuZ2V0TmFtZXNwYWNlKCkuZ2V0TmFtZXNwYWNlVVJJKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5qaWJ4LnJ1bnRpbWUuaW1wbC5Vbm1hcnNoYWxsaW5nQ29udGV4dCB1Y3R4ID0gZ2V0TmV3VW5tYXJzaGFsQ29udGV4dChyZXN1bHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Y3R4LnBhcnNlUGFzdFN0YXJ0VGFnKCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0nb3V0LXdyYXBwZXIvQG5zJy8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSdvdXQtd3JhcHBlci9AbmFtZScvPiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXg7Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Im91dC13cmFwcGVyL3JldHVybi1lbGVtZW50IiBtb2RlPSJpbnRlcmZhY2UtaW1wbGVtZW50YXRpb24iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NhbGxiYWNrLnJlY2VpdmVSZXN1bHQ8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG1ldGhvZC1uYW1lIi8+KDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJvdXQtd3JhcHBlci9yZXR1cm4tZWxlbWVudC9AamF2YS1uYW1lIi8+KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQoIk1pc3NpbmcgZXhwZWN0ZWQgcmVzdWx0IHdyYXBwZXIgZWxlbWVudCB7PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9J291dC13cmFwcGVyL0BucycvPn08eHNsOnZhbHVlLW9mIHNlbGVjdD0nb3V0LXdyYXBwZXIvQG5hbWUnLz4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uRXJyb3IoZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkVycm9yKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBfY2FsbGJhY2sucmVjZWl2ZUVycm9yPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBtZXRob2QtbmFtZSIvPihlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi51dGlsLkNhbGxiYWNrUmVjZWl2ZXIgX2NhbGxiYWNrUmVjZWl2ZXIgPSBudWxsOwotICAgICAgICAgICAgICAgIGlmICggX29wZXJhdGlvbnNbX29wSW5kZXhdLmdldE1lc3NhZ2VSZWNlaXZlcigpID09IG51bGwgJmFtcDsmYW1wOyBfb3BlcmF0aW9uQ2xpZW50LmdldE9wdGlvbnMoKS5pc1VzZVNlcGFyYXRlTGlzdGVuZXIoKSkgewotICAgICAgICAgICAgICAgICAgICBfY2FsbGJhY2tSZWNlaXZlciA9IG5ldyBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuQ2FsbGJhY2tSZWNlaXZlcigpOwotICAgICAgICAgICAgICAgICAgICBfb3BlcmF0aW9uc1tfb3BJbmRleF0uc2V0TWVzc2FnZVJlY2VpdmVyKF9jYWxsYmFja1JlY2VpdmVyKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBleGVjdXRlIHRoZSBvcGVyYXRpb24gY2xpZW50Ci0gICAgICAgICAgICAgICAgX29wZXJhdGlvbkNsaWVudC5leGVjdXRlKGZhbHNlKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgRXhjZXB0aW9uIG91dGV4ID0gY29udmVydEV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVW5leHBlY3RlZCBleGNlcHRpb24gdHlwZTogIiArCi0gICAgICAgICAgICAgICAgICAgIG91dGV4LmdldENsYXNzKCkuZ2V0TmFtZSgpLCBvdXRleCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICA8L3hzbDppZj4KLSAgPC94c2w6dGVtcGxhdGU+Ci0gIAotICA8IS0tIEludm9rZWQgdG8gZ2V0IHRoZSBvcGVyYXRpb24gaW5kZXggbnVtYmVyIGZvciBhIG1ldGhvZC4gLS0+Ci0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Im1ldGhvZCIgbW9kZT0iZ2V0LWluZGV4Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iY291bnQocHJlY2VkaW5nLXNpYmxpbmc6Om1ldGhvZCkiLz48L3hzbDp0ZW1wbGF0ZT4KLSAgCi0gIDwhLS0gSW52b2tlZCB0byBnZXQgdGhlIG9wZXJhdGlvbiBhY3Rpb24gZm9yIGEgbWV0aG9kLiAtLT4KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ibWV0aG9kIiBtb2RlPSJnZXQtYWN0aW9uIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHNvYXBhY3Rpb24iLz48L3hzbDp0ZW1wbGF0ZT4KLSAgCi0gIDwhLS0gR2VuZXJhdGUgY29kZSBmb3IgYSBwYXJ0aWN1bGFyIHBhcmFtZXRlciBlbGVtZW50IGluIGEgY2xpZW50IHN0dWIgbWV0aG9kIC0tPgotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJwYXJhbWV0ZXItZWxlbWVudCIgbW9kZT0iaW50ZXJmYWNlLWltcGxlbWVudGF0aW9uIj4KLSAgICA8eHNsOmNob29zZT4KLSAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAYXJyYXk9J3RydWUnIj4KLSAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Im1hcnNoYWwtYXJyYXkiLz4KLSAgICAgIDwveHNsOndoZW4+Ci0gICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Im1hcnNoYWwtdmFsdWUiLz4KLSAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICA8L3hzbDpjaG9vc2U+Ci0gIDwveHNsOnRlbXBsYXRlPgotICAKLSAgPCEtLSBNYXJzaGFsIGFuIGFycmF5IHRvIGEgcmVwZWF0ZWQgZWxlbWVudCAtLT4KLSAgPHhzbDp0ZW1wbGF0ZSBuYW1lPSJtYXJzaGFsLWFycmF5Ij4KLSAgICBpZiAoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBqYXZhLW5hbWUiLz4gPT0gbnVsbCB8fCA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGphdmEtbmFtZSIvPi5sZW5ndGggPT0gMCkgewotICAgIDx4c2w6Y2hvb3NlPgotICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBvcHRpb25hbD0ndHJ1ZSciPgotICAgICAgICAgIC8vIGp1c3Qgc2tpcCBvcHRpb25hbCBlbGVtZW50Ci0gICAgICA8L3hzbDp3aGVuPgotICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBuaWxsYWJsZT0ndHJ1ZSciPgotICAgICAgICBjaGlsZCA9IGZhY3RvcnkuY3JlYXRlT01FbGVtZW50KCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0nQG5hbWUnLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9J0BucycvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0nQHByZWZpeCcvPiIpOwotICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTmFtZXNwYWNlIHhzaW5zID0gZmFjdG9yeS5jcmVhdGVPTU5hbWVzcGFjZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCAieHNpIik7Ci0gICAgICAgIGNoaWxkLmRlY2xhcmVOYW1lc3BhY2UoeHNpbnMpOwotICAgICAgICBjaGlsZC5hZGRBdHRyaWJ1dGUoIm5pbCIsICJ0cnVlIiwgeHNpbnMpOwotICAgICAgICB3cmFwcGVyLmFkZENoaWxkKGNoaWxkKTsKLSAgICAgIDwveHNsOndoZW4+Ci0gICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0KCJNaXNzaW5nIHJlcXVpcmVkIHZhbHVlIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSdAamF2YS1uYW1lJy8+Iik7Ci0gICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgPC94c2w6Y2hvb3NlPgotICAgIH0gZWxzZSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpICZsdDsgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBqYXZhLW5hbWUiLz4ubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAamF2YS10eXBlIi8+IF9pdGVtID0gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBqYXZhLW5hbWUiLz5baV07Ci0gICAgPHhzbDpjaG9vc2U+Ci0gICAgICA8eHNsOndoZW4gdGVzdD0iQG9iamVjdD0ndHJ1ZScgYW5kIEBuaWxsYWJsZT0ndHJ1ZSciPgotICAgICAgICAgICAgaWYgKF9pdGVtID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjaGlsZCA9IGZhY3RvcnkuY3JlYXRlT01FbGVtZW50KCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0nQG5hbWUnLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9J0BucycvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0nQHByZWZpeCcvPiIpOwotICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01OYW1lc3BhY2UgeHNpbnMgPSBmYWN0b3J5LmNyZWF0ZU9NTmFtZXNwYWNlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsICJ4c2kiKTsKLSAgICAgICAgICAgICAgICBjaGlsZC5kZWNsYXJlTmFtZXNwYWNlKHhzaW5zKTsKLSAgICAgICAgICAgICAgICBjaGlsZC5hZGRBdHRyaWJ1dGUoIm5pbCIsICJ0cnVlIiwgeHNpbnMpOwotICAgICAgICAgICAgICAgIHdyYXBwZXIuYWRkQ2hpbGQoY2hpbGQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InNlcmlhbGl6ZS12YWx1ZS10by1jaGlsZCIvPgotICAgICAgICAgICAgfQotICAgICAgPC94c2w6d2hlbj4KLSAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAb2JqZWN0PSd0cnVlJyI+Ci0gICAgICAgICAgICBpZiAoX2l0ZW0gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdCgiTnVsbCB2YWx1ZSBpbiBhcnJheSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0nQGphdmEtbmFtZScvPiIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InNlcmlhbGl6ZS12YWx1ZS10by1jaGlsZCIvPgotICAgICAgICAgICAgfQotICAgICAgPC94c2w6d2hlbj4KLSAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ic2VyaWFsaXplLXZhbHVlLXRvLWNoaWxkIi8+Ci0gICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgPC94c2w6Y2hvb3NlPgotICAgICAgICB9Ci0gICAgfQotICA8L3hzbDp0ZW1wbGF0ZT4KLSAgCi0gIDwhLS0gTWFyc2hhbCBhIHNpbXBsZSB2YWx1ZSB0byBhIG5vbi1yZXBlYXRlZCBlbGVtZW50IC0tPgotICA8eHNsOnRlbXBsYXRlIG5hbWU9Im1hcnNoYWwtdmFsdWUiPgotICAgIDx4c2w6Y2hvb3NlPgotICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBvYmplY3Q9J3RydWUnIj4KLSAgICAgICAgaWYgKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAamF2YS1uYW1lIi8+ID09IG51bGwpIHsKLSAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBvcHRpb25hbD0ndHJ1ZSciPgotICAgICAgICAgICAgLy8ganVzdCBza2lwIG9wdGlvbmFsIGVsZW1lbnQKLSAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAbmlsbGFibGU9J3RydWUnIj4KLSAgICAgICAgICAgIGNoaWxkID0gZmFjdG9yeS5jcmVhdGVPTUVsZW1lbnQoIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSdAbmFtZScvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0nQG5zJy8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSdAcHJlZml4Jy8+Iik7Ci0gICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTmFtZXNwYWNlIHhzaW5zID0gZmFjdG9yeS5jcmVhdGVPTU5hbWVzcGFjZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCAieHNpIik7Ci0gICAgICAgICAgICBjaGlsZC5kZWNsYXJlTmFtZXNwYWNlKHhzaW5zKTsKLSAgICAgICAgICAgIGNoaWxkLmFkZEF0dHJpYnV0ZSgibmlsIiwgInRydWUiLCB4c2lucyk7Ci0gICAgICAgICAgICB3cmFwcGVyLmFkZENoaWxkKGNoaWxkKTsKLSAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0KCJOdWxsIHZhbHVlIGZvciA8eHNsOnZhbHVlLW9mIHNlbGVjdD0nQGphdmEtbmFtZScvPiIpOwotICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICB9IGVsc2UgewotICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ic2VyaWFsaXplLXZhbHVlLXRvLWNoaWxkIi8+Ci0gICAgICAgIH0KLSAgICAgIDwveHNsOndoZW4+Ci0gICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InNlcmlhbGl6ZS12YWx1ZS10by1jaGlsZCIvPgotICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgIDwveHNsOmNob29zZT4KLSAgPC94c2w6dGVtcGxhdGU+Ci0gIAotICA8IS0tIENvbnZlcnQgdGhlIGN1cnJlbnQgdmFsdWUgdG8gYW4gZWxlbWVudC4gLS0+Ci0gIDx4c2w6dGVtcGxhdGUgbmFtZT0ic2VyaWFsaXplLXZhbHVlLXRvLWNoaWxkIj4KLSAgICA8eHNsOmNob29zZT4KLSAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAamF2YS10eXBlPSdqYXZhLmxhbmcuU3RyaW5nJyBhbmQgQHNlcmlhbGl6ZXI9JyciPgotICAgICAgICBjaGlsZCA9IGZhY3RvcnkuY3JlYXRlT01FbGVtZW50KCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0nQG5hbWUnLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9J0BucycvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0nQHByZWZpeCcvPiIpOwotICAgICAgICBjaGlsZC5zZXRUZXh0KDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwYXJhbWV0ZXItb3ItYXJyYXktaXRlbSIvPik7Ci0gICAgICA8L3hzbDp3aGVuPgotICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBmb3JtPSdzaW1wbGUnIGFuZCBAc2VyaWFsaXplcj0nJyI+Ci0gICAgICAgIGNoaWxkID0gZmFjdG9yeS5jcmVhdGVPTUVsZW1lbnQoIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSdAbmFtZScvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0nQG5zJy8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSdAcHJlZml4Jy8+Iik7Ci0gICAgICAgIGNoaWxkLnNldFRleHQoPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InBhcmFtZXRlci1vci1hcnJheS1pdGVtIi8+LnRvU3RyaW5nKCkpOwotICAgICAgPC94c2w6d2hlbj4KLSAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAZm9ybT0nc2ltcGxlJyI+Ci0gICAgICAgIGNoaWxkID0gZmFjdG9yeS5jcmVhdGVPTUVsZW1lbnQoIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSdAbmFtZScvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0nQG5zJy8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSdAcHJlZml4Jy8+Iik7Ci0gICAgICAgIGNoaWxkLnNldFRleHQoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBzZXJpYWxpemVyIi8+KDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwYXJhbWV0ZXItb3ItYXJyYXktaXRlbSIvPikpOwotICAgICAgPC94c2w6d2hlbj4KLSAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAZm9ybT0nY29tcGxleCcgYW5kIEB0eXBlLWluZGV4PScnIj4KLSAgICAgICAgaWYgKGJpbmRpbmdGYWN0b3J5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGJpbmRpbmdFcnJvck1lc3NhZ2UpOwotICAgICAgICB9Ci0gICAgICAgIGNoaWxkID0gbWFwcGVkQ2hpbGQoPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InBhcmFtZXRlci1vci1hcnJheS1pdGVtIi8+LCBmYWN0b3J5KTsKLSAgICAgIDwveHNsOndoZW4+Ci0gICAgICA8eHNsOndoZW4gdGVzdD0iQGZvcm09J2NvbXBsZXgnIj4KLSAgICAgICAgaWYgKGJpbmRpbmdGYWN0b3J5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGJpbmRpbmdFcnJvck1lc3NhZ2UpOwotICAgICAgICB9Ci0gICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlIHNyYyA9IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmppYnguSmlCWERhdGFTb3VyY2UoPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InBhcmFtZXRlci1vci1hcnJheS1pdGVtIi8+LCBfdHlwZV9uYW1lPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlLWluZGV4Ii8+LCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9J0BuYW1lJy8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSdAbnMnLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9J0BwcmVmaXgnLz4iLCBiaW5kaW5nTmFtZXNwYWNlSW5kZXhlcywgYmluZGluZ05hbWVzcGFjZVByZWZpeGVzLCBiaW5kaW5nRmFjdG9yeSk7Ci0gICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01OYW1lc3BhY2UgYXBwbnMgPSBmYWN0b3J5LmNyZWF0ZU9NTmFtZXNwYWNlKCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0nQG5zJy8+IiwgIiIpOwotICAgICAgICBjaGlsZCA9IGZhY3RvcnkuY3JlYXRlT01FbGVtZW50KHNyYywgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSdAbmFtZScvPiIsIGFwcG5zKTsKLSAgICAgIDwveHNsOndoZW4+Ci0gICAgPC94c2w6Y2hvb3NlPgotICAgICAgICB3cmFwcGVyLmFkZENoaWxkKGNoaWxkKTsKLSAgPC94c2w6dGVtcGxhdGU+Ci0gIAotICA8IS0tIFJlZmVyZW5jZSB0byBwYXJhbWV0ZXIgb3IgYXJyYXkgaXRlbSB2YWx1ZSwgYXMgYXBwcm9wcmlhdGUgLS0+Ci0gIDx4c2w6dGVtcGxhdGUgbmFtZT0icGFyYW1ldGVyLW9yLWFycmF5LWl0ZW0iPjx4c2w6Y2hvb3NlPjx4c2w6d2hlbiB0ZXN0PSJAYXJyYXk9J3RydWUnIj5faXRlbTwveHNsOndoZW4+PHhzbDpvdGhlcndpc2U+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9J0BqYXZhLW5hbWUnLz48L3hzbDpvdGhlcndpc2U+PC94c2w6Y2hvb3NlPjx4c2w6aWYgdGVzdD0iQHdyYXBwZWQtcHJpbWl0aXZlPSd0cnVlJyI+Ljx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdmFsdWUtbWV0aG9kIi8+KCk8L3hzbDppZj48L3hzbDp0ZW1wbGF0ZT4KLSAgCi0gIDwhLS0gR2VuZXJhdGUgY29kZSBmb3IgdGhlIHJlc3VsdCBpbiBhIGNsaWVudCBzdHViIG1ldGhvZCAtLT4KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0icmV0dXJuLWVsZW1lbnQiIG1vZGU9ImludGVyZmFjZS1pbXBsZW1lbnRhdGlvbiI+Ci0gICAgPHhzbDpjaG9vc2U+Ci0gICAgICA8eHNsOndoZW4gdGVzdD0iQGFycmF5PSd0cnVlJyI+Ci0gICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ1bm1hcnNoYWwtYXJyYXkiLz4KLSAgICAgIDwveHNsOndoZW4+Ci0gICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InVubWFyc2hhbC12YWx1ZSIvPgotICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgIDwveHNsOmNob29zZT4KLSAgPC94c2w6dGVtcGxhdGU+Ci0gIAotICAKLSAgPCEtLQotICBDTElFTlQgU1RVQiBTSEFSRUQgTUVUSE9EIEdFTkVSQVRJT04KLSAgLS0+Ci0gIDwhLS0gQ2FsbGVkIGJ5IG1haW4gdGVtcGxhdGUgdG8gY3JlYXRlIHV0aWxpdHkgbWV0aG9kcyAtLT4KLSAgPHhzbDp0ZW1wbGF0ZSBuYW1lPSJzdHViLXV0aWxpdHktbWV0aG9kcyI+Ci0gICAgCi0gICAgcHJpdmF0ZSBFeGNlcHRpb24gY29udmVydEV4Y2VwdGlvbihFeGNlcHRpb24gZXgpIHRocm93cyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gewotICAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdCkgewotICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQgZiA9IChvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdClleDsKLSAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IGZhdWx0RWx0ID0gZi5nZXREZXRhaWwoKTsKLSAgICAgICAgICAgIGlmIChmYXVsdEVsdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGZhdWx0RXhjZXB0aW9uTmFtZU1hcC5jb250YWluc0tleShmYXVsdEVsdC5nZXRRTmFtZSgpKSkgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBmaXJzdCBjcmVhdGUgdGhlIGFjdHVhbCBleGNlcHRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBleGNlcHRpb25DbGFzc05hbWUgPSAoU3RyaW5nKWZhdWx0RXhjZXB0aW9uQ2xhc3NOYW1lTWFwLmdldChmYXVsdEVsdC5nZXRRTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzIGV4Y2VwdGlvbkNsYXNzID0gQ2xhc3MuZm9yTmFtZShleGNlcHRpb25DbGFzc05hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgRXhjZXB0aW9uIGUgPSAoRXhjZXB0aW9uKWV4Y2VwdGlvbkNsYXNzLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ1aWxkIHRoZSBtZXNzYWdlIG9iamVjdCBmcm9tIHRoZSBkZXRhaWxzCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZUNsYXNzTmFtZSA9IChTdHJpbmcpZmF1bHRNZXNzYWdlTWFwLmdldChmYXVsdEVsdC5nZXRRTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzIG1lc3NhZ2VDbGFzcyA9IENsYXNzLmZvck5hbWUobWVzc2FnZUNsYXNzTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgbWVzc2FnZU9iamVjdCA9IGZyb21PTShmYXVsdEVsdCwgbWVzc2FnZUNsYXNzLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCBtID0gZXhjZXB0aW9uQ2xhc3MuZ2V0TWV0aG9kKCJzZXRGYXVsdE1lc3NhZ2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdIHsgbWVzc2FnZUNsYXNzIH0pOwotICAgICAgICAgICAgICAgICAgICAgICAgbS5pbnZva2UoZSwgbmV3IE9iamVjdFtdIHsgbWVzc2FnZU9iamVjdCB9KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBjYW5ub3QgaW50YW50aWF0ZSB0aGUgY2xhc3MgLSB0aHJvdyB0aGUgb3JpZ2luYWwKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEF4aXMgZmF1bHQKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGY7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgY2Fubm90IGludGFudGlhdGUgdGhlIGNsYXNzIC0gdGhyb3cgdGhlIG9yaWdpbmFsCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBBeGlzIGZhdWx0Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBmOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgY2Fubm90IGludGFudGlhdGUgdGhlIGNsYXNzIC0gdGhyb3cgdGhlIG9yaWdpbmFsCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBBeGlzIGZhdWx0Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBmOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGNhbm5vdCBpbnRhbnRpYXRlIHRoZSBjbGFzcyAtIHRocm93IHRoZSBvcmlnaW5hbAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXhpcyBmYXVsdAotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZjsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBjYW5ub3QgaW50YW50aWF0ZSB0aGUgY2xhc3MgLSB0aHJvdyB0aGUgb3JpZ2luYWwKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEF4aXMgZmF1bHQKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGY7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgY2Fubm90IGludGFudGlhdGUgdGhlIGNsYXNzIC0gdGhyb3cgdGhlIG9yaWdpbmFsCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBBeGlzIGZhdWx0Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBmOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgZjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93IGY7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgfSBlbHNlIGlmIChleCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWV4OwotICAgICAgICB9IGVsc2UgaWYgKGV4IGluc3RhbmNlb2YgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB0aHJvdyAoamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uKWV4OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQubWFrZUZhdWx0KGV4KTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgPC94c2w6dGVtcGxhdGU+Ci0gIAotICAKLSAgPCEtLQotICBTVEFUSUMgQ09ERSBHRU5FUkFUSU9OCi0gIC0tPgotICAKLSAgPCEtLSBDYWxsZWQgYnkgbWFpbiB0ZW1wbGF0ZSB0byBoYW5kbGUgc3RhdGljIGJpbmRpbmcgZGF0YSBhbmQgbWV0aG9kcy4gLS0+Ci0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImluaXRpYWxpemUtYmluZGluZyI+Ci0gICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJuc2NvdW50IiBzZWxlY3Q9ImNvdW50KGJpbmRpbmctbmFtZXNwYWNlKSIvPgotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5qaWJ4LnJ1bnRpbWUuSUJpbmRpbmdGYWN0b3J5IGJpbmRpbmdGYWN0b3J5OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBiaW5kaW5nRXJyb3JNZXNzYWdlOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdIGJpbmRpbmdOYW1lc3BhY2VJbmRleGVzOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIGJpbmRpbmdOYW1lc3BhY2VQcmVmaXhlczsKLSAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBtb2RlPSJnZW5lcmF0ZS1pbmRleC1maWVsZHMiIHNlbGVjdD0iYWJzdHJhY3QtdHlwZSIvPgotICAgIHN0YXRpYyB7Ci0gICAgICAgIG9yZy5qaWJ4LnJ1bnRpbWUuSUJpbmRpbmdGYWN0b3J5IGZhY3RvcnkgPSBudWxsOwotICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgPHhzbDpjaG9vc2U+Ci0gICAgICA8eHNsOndoZW4gdGVzdD0ic3RyaW5nLWxlbmd0aChub3JtYWxpemUtc3BhY2UoQGJpbmRpbmctbmFtZSkpID4gMCI+Ci0gICAgICAgICAgICBmYWN0b3J5ID0gb3JnLmppYngucnVudGltZS5CaW5kaW5nRGlyZWN0b3J5LmdldEZhY3RvcnkoIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAYmluZGluZy1uYW1lIi8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAYmluZGluZy1wYWNrYWdlIi8+IiwgPHhzbDpjaG9vc2U+PHhzbDp3aGVuIHRlc3Q9InN0cmluZy1sZW5ndGgobm9ybWFsaXplLXNwYWNlKC9jbGFzcy9AbmFtZSkpPjAiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvY2xhc3MvQG5hbWUiLz48L3hzbDp3aGVuPjx4c2w6b3RoZXJ3aXNlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvaW50ZXJmYWNlL0BuYW1lIi8+PC94c2w6b3RoZXJ3aXNlPjwveHNsOmNob29zZT4uY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSk7Ci0gICAgICA8L3hzbDp3aGVuPgotICAgICAgPHhzbDp3aGVuIHRlc3Q9InN0cmluZy1sZW5ndGgobm9ybWFsaXplLXNwYWNlKEBib3VuZC1jbGFzcykpID4gMCI+Ci0gICAgICAgICAgICBmYWN0b3J5ID0gb3JnLmppYngucnVudGltZS5CaW5kaW5nRGlyZWN0b3J5LmdldEZhY3RvcnkoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBib3VuZC1jbGFzcyIvPi5jbGFzcyk7Ci0gICAgICA8L3hzbDp3aGVuPgotICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICBmYWN0b3J5ID0gbmV3IG9yZy5hcGFjaGUuYXhpczIuamlieC5OdWxsQmluZGluZ0ZhY3RvcnkoKTsKLSAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICBtZXNzYWdlID0gbnVsbDsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsgbWVzc2FnZSA9IGUuZ2V0TWVzc2FnZSgpOyB9Ci0gICAgICAgIGJpbmRpbmdGYWN0b3J5ID0gZmFjdG9yeTsKLSAgICAgICAgYmluZGluZ0Vycm9yTWVzc2FnZSA9IG1lc3NhZ2U7Ci0gICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgbW9kZT0ic2V0LWluZGV4LWZpZWxkcyIgc2VsZWN0PSJhYnN0cmFjdC10eXBlIi8+Ci0gICAgICAgIGludFtdIGluZGV4ZXMgPSBudWxsOwotICAgICAgICBTdHJpbmdbXSBwcmVmaXhlcyA9IG51bGw7Ci0gICAgICAgIGlmIChmYWN0b3J5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gY2hlY2sgZm9yIHhzaSBuYW1lc3BhY2UgaW5jbHVkZWQKLSAgICAgICAgICAgIFN0cmluZ1tdIG5zdXJpcyA9IGZhY3RvcnkuZ2V0TmFtZXNwYWNlcygpOwotICAgICAgICAgICAgaW50IHhzaWluZGV4ID0gbnN1cmlzLmxlbmd0aDsKLSAgICAgICAgICAgIHdoaWxlICgtLXhzaWluZGV4ID49IDAgJmFtcDsmYW1wOwotICAgICAgICAgICAgICAgICEiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLmVxdWFscyhuc3VyaXNbeHNpaW5kZXhdKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIGdldCBhY3R1YWwgc2l6ZSBvZiBpbmRleCBhbmQgcHJlZml4IGFycmF5cyB0byBiZSBhbGxvY2F0ZWQKLSAgICAgICAgICAgIGludCBuc2NvdW50ID0gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuc2NvdW50Ii8+OwotICAgICAgICAgICAgaW50IHVzZWNvdW50ID0gbnNjb3VudDsKLSAgICAgICAgICAgIGlmICh4c2lpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgdXNlY291bnQrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gYWxsb2NhdGUgYW5kIGluaXRpYWxpemUgdGhlIGFycmF5cwotICAgICAgICAgICAgaW5kZXhlcyA9IG5ldyBpbnRbdXNlY291bnRdOwotICAgICAgICAgICAgcHJlZml4ZXMgPSBuZXcgU3RyaW5nW3VzZWNvdW50XTsKLSAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJiaW5kaW5nLW5hbWVzcGFjZSI+Ci0gICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ibnNpbmRleCIgc2VsZWN0PSJjb3VudChwcmVjZWRpbmctc2libGluZzo6YmluZGluZy1uYW1lc3BhY2UpIi8+Ci0gICAgICAgICAgICBpbmRleGVzWzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbnNpbmRleCIvPl0gPSBuc0luZGV4KCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0nQG5zJy8+IiwgbnN1cmlzKTsKLSAgICAgICAgICAgIHByZWZpeGVzWzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbnNpbmRleCIvPl0gPSAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9J0BwcmVmaXgnLz4iOwotICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgICAgICAgICBpZiAoeHNpaW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgIGluZGV4ZXNbbnNjb3VudF0gPSB4c2lpbmRleDsKLSAgICAgICAgICAgICAgICBwcmVmaXhlc1tuc2NvdW50XSA9ICJ4c2kiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgYmluZGluZ05hbWVzcGFjZUluZGV4ZXMgPSBpbmRleGVzOwotICAgICAgICBiaW5kaW5nTmFtZXNwYWNlUHJlZml4ZXMgPSBwcmVmaXhlczsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IG5zSW5kZXgoU3RyaW5nIHVyaSwgU3RyaW5nW10gdXJpcykgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSAmbHQ7IHVyaXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmICh1cmkuZXF1YWxzKHVyaXNbaV0pKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTmFtZXNwYWNlICIgKyB1cmkgKyAiIG5vdCBmb3VuZCBpbiBiaW5kaW5nIGRpcmVjdG9yeSBpbmZvcm1hdGlvbiIpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFkZE1hcHBpbmdOYW1lc3BhY2VzKG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmFjdG9yeSBmYWN0b3J5LCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCB3cmFwcGVyLCBTdHJpbmcgbnN1cmksIFN0cmluZyBuc3ByZWYpIHsKLSAgICAgICAgU3RyaW5nW10gbnNzID0gYmluZGluZ0ZhY3RvcnkuZ2V0TmFtZXNwYWNlcygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSAmbHQ7IGJpbmRpbmdOYW1lc3BhY2VJbmRleGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpbnQgaW5kZXggPSBiaW5kaW5nTmFtZXNwYWNlSW5kZXhlc1tpXTsKLSAgICAgICAgICAgIFN0cmluZyB1cmkgPSBuc3NbaW5kZXhdOwotICAgICAgICAgICAgU3RyaW5nIHByZWZpeCA9IGJpbmRpbmdOYW1lc3BhY2VQcmVmaXhlc1tpXTsKLSAgICAgICAgICAgIGlmICghbnN1cmkuZXF1YWxzKHVyaSkgfHwgIW5zcHJlZi5lcXVhbHMocHJlZml4KSkgewotICAgICAgICAgICAgICAgIHdyYXBwZXIuZGVjbGFyZU5hbWVzcGFjZShmYWN0b3J5LmNyZWF0ZU9NTmFtZXNwYWNlKHVyaSwgcHJlZml4KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgb3JnLmppYngucnVudGltZS5pbXBsLlVubWFyc2hhbGxpbmdDb250ZXh0IGdldE5ld1VubWFyc2hhbENvbnRleHQob3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgcGFyYW0pCi0gICAgICAgIHRocm93cyBvcmcuamlieC5ydW50aW1lLkppQlhFeGNlcHRpb24gewotICAgICAgICBpZiAoYmluZGluZ0ZhY3RvcnkgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oYmluZGluZ0Vycm9yTWVzc2FnZSk7Ci0gICAgICAgIH0KLSAgICAgICAgb3JnLmppYngucnVudGltZS5pbXBsLlVubWFyc2hhbGxpbmdDb250ZXh0IGN0eCA9Ci0gICAgICAgICAgICAob3JnLmppYngucnVudGltZS5pbXBsLlVubWFyc2hhbGxpbmdDb250ZXh0KWJpbmRpbmdGYWN0b3J5LmNyZWF0ZVVubWFyc2hhbGxpbmdDb250ZXh0KCk7Ci0gICAgICAgIG9yZy5qaWJ4LnJ1bnRpbWUuSVhNTFJlYWRlciByZWFkZXIgPSBuZXcgb3JnLmppYngucnVudGltZS5pbXBsLlN0QVhSZWFkZXJXcmFwcGVyKHBhcmFtLmdldFhNTFN0cmVhbVJlYWRlcldpdGhvdXRDYWNoaW5nKCksICJTT0FQLW1lc3NhZ2UiLCB0cnVlKTsKLSAgICAgICAgY3R4LnNldERvY3VtZW50KHJlYWRlcik7Ci0gICAgICAgIGN0eC50b1RhZygpOwotICAgICAgICByZXR1cm4gY3R4OwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IG1hcHBlZENoaWxkKE9iamVjdCB2YWx1ZSwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSkgewotICAgICAgICBvcmcuamlieC5ydW50aW1lLklNYXJzaGFsbGFibGUgbXJzaGFibGUgPSAob3JnLmppYngucnVudGltZS5JTWFyc2hhbGxhYmxlKXZhbHVlOwotICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZSBzcmMgPSBuZXcgb3JnLmFwYWNoZS5heGlzMi5qaWJ4LkppQlhEYXRhU291cmNlKG1yc2hhYmxlLCBiaW5kaW5nRmFjdG9yeSk7Ci0gICAgICAgIGludCBpbmRleCA9IGJpbmRpbmdGYWN0b3J5LmdldENsYXNzSW5kZXhNYXAoKS5nZXQobXJzaGFibGUuSmlCWF9nZXROYW1lKCkpOwotICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTmFtZXNwYWNlIGFwcG5zID0gZmFjdG9yeS5jcmVhdGVPTU5hbWVzcGFjZShiaW5kaW5nRmFjdG9yeS5nZXRFbGVtZW50TmFtZXNwYWNlcygpW2luZGV4XSwgIiIpOwotICAgICAgICByZXR1cm4gZmFjdG9yeS5jcmVhdGVPTUVsZW1lbnQoc3JjLCBiaW5kaW5nRmFjdG9yeS5nZXRFbGVtZW50TmFtZXMoKVtpbmRleF0sIGFwcG5zKTsKLSAgICB9Ci0gICAgCi0gICAgPCEtLSBzaG91bGRuJ3QgYmUgbmVlZGVkIHdoZW4gbm8gYWN0dWFsIGJpbmRpbmcsIGJ1dCBjYWxsZWQgYnkgZmF1bHQgY29udmVyc2lvbiBjb2RlIHNvIG11c3QgYmUgbGVmdCBpbiBmb3Igbm93IC0tPgotICAgIHByaXZhdGUgc3RhdGljIE9iamVjdCBmcm9tT00ob3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgcGFyYW0sIENsYXNzIHR5cGUsCi0gICAgICAgIGphdmEudXRpbC5NYXAgZXh0cmFOYW1lc3BhY2VzKSB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHR7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBvcmcuamlieC5ydW50aW1lLmltcGwuVW5tYXJzaGFsbGluZ0NvbnRleHQgY3R4ID0gZ2V0TmV3VW5tYXJzaGFsQ29udGV4dChwYXJhbSk7Ci0gICAgICAgICAgICByZXR1cm4gY3R4LnVubWFyc2hhbEVsZW1lbnQodHlwZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0KGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLSAgPC94c2w6dGVtcGxhdGU+Ci0gIAotICA8IS0tIENhbGxlZCBieSAiaW5pdGlhbGl6ZS1iaW5kaW5nIiB0ZW1wbGF0ZSB0byBnZW5lcmF0ZSBtYXBwZWQgY2xhc3MgaW5kZXggZmllbGRzLiAtLT4KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iYWJzdHJhY3QtdHlwZSIgbW9kZT0iZ2VuZXJhdGUtaW5kZXgtZmllbGRzIj4KLSAgICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgX3R5cGVfbmFtZTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZS1pbmRleCIvPjsKLSAgPC94c2w6dGVtcGxhdGU+Ci0gICAgCi0gIDwhLS0gQ2FsbGVkIGJ5ICJpbml0aWFsaXplLWJpbmRpbmciIHRlbXBsYXRlIHRvIGluaXRpYWxpemUgbWFwcGVkIGNsYXNzIGluZGV4IGZpZWxkcy4gLS0+Ci0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImFic3RyYWN0LXR5cGUiIG1vZGU9InNldC1pbmRleC1maWVsZHMiPgotICAgICAgICAgX3R5cGVfbmFtZTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZS1pbmRleCIvPiA9Ci0gICAgICAgICAgICAgIns8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5zIi8+fTo8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4iOwotICA8L3hzbDp0ZW1wbGF0ZT4KLSAgCi0gIAotICA8IS0tCi0gIFNIQVJFRCBURU1QTEFURVMKLSAgLS0+Ci0gIAotICA8IS0tIFVubWFyc2hhbCBhIHJlcGVhdGVkIGVsZW1lbnQgaW50byBhbiBhcnJheSAtLT4KLSAgPHhzbDp0ZW1wbGF0ZSBuYW1lPSJ1bm1hcnNoYWwtYXJyYXkiPgotICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAamF2YS10eXBlIi8+W10gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBqYXZhLW5hbWUiLz4gPSBuZXcgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBqYXZhLXR5cGUiLz5bNF07Ci0gICAgICBpbmRleCA9IDA7Ci0gICAgPHhzbDpjaG9vc2U+Ci0gICAgICA8eHNsOndoZW4gdGVzdD0iQGZvcm09J2NvbXBsZXgnIGFuZCBAdHlwZS1pbmRleD0nJyI+Ci0gICAgICB3aGlsZSAodWN0eC5nZXRVbm1hcnNoYWxsZXIoIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbnMiLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+IikuaXNQcmVzZW50KHVjdHgpKSB7Ci0gICAgICA8L3hzbDp3aGVuPgotICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICB3aGlsZSAodWN0eC5pc0F0KCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5zIi8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPiIpKSB7Ci0gICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgIGlmIChpbmRleCA+PSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGphdmEtbmFtZSIvPi5sZW5ndGgpIHsKLSAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBqYXZhLW5hbWUiLz4gPSAoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBqYXZhLXR5cGUiLz5bXSlvcmcuamlieC5ydW50aW1lLlV0aWxpdHkuZ3Jvd0FycmF5KDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAamF2YS1uYW1lIi8+KTsKLSAgICAgICAgICB9Ci0gICAgPHhzbDppZiB0ZXN0PSJAbmlsbGFibGU9J3RydWUnIj4KLSAgICAgICAgICBpZiAodWN0eC5hdHRyaWJ1dGVCb29sZWFuKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsICJuaWwiLCBmYWxzZSkpIHsKLSAgICAgICAgICAgICAgdWN0eC5za2lwRWxlbWVudCgpOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgPC94c2w6aWY+Ci0gICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBqYXZhLW5hbWUiLz5baW5kZXgrK10gPSAoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBqYXZhLXR5cGUiLz4pPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImRlc2VyaWFsaXplLWVsZW1lbnQtdmFsdWUiLz47Ci0gICAgPHhzbDppZiB0ZXN0PSJAZm9ybT0nY29tcGxleCcgYW5kIEB0eXBlLWluZGV4IT0nJyI+Ci0gICAgICAgICAgICAgIHVjdHgucGFyc2VQYXN0Q3VycmVudEVuZFRhZygiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9J0BucycvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0nQG5hbWUnLz4iKTsKLSAgICA8L3hzbDppZj4KLSAgICA8eHNsOmlmIHRlc3Q9IkBuaWxsYWJsZT0ndHJ1ZSciPgotICAgICAgICAgIH0KLSAgICA8L3hzbDppZj4KLSAgICAgIH0KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAamF2YS1uYW1lIi8+ID0gKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAamF2YS10eXBlIi8+W10pb3JnLmppYngucnVudGltZS5VdGlsaXR5LnJlc2l6ZUFycmF5KGluZGV4LCA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGphdmEtbmFtZSIvPik7Ci0gICAgPHhzbDppZiB0ZXN0PSJAb3B0aW9uYWwhPSd0cnVlJyI+Ci0gICAgICBpZiAoaW5kZXggPT0gMCkgewotICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdCgiTWlzc2luZyByZXF1aXJlZCBlbGVtZW50IHs8eHNsOnZhbHVlLW9mIHNlbGVjdD0nQG5zJy8+fTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSdAbmFtZScvPiIpOwotICAgICAgfQotICAgIDwveHNsOmlmPgotICA8L3hzbDp0ZW1wbGF0ZT4KLSAgCi0gIDwhLS0gVW5tYXJzaGFsIGEgbm9uLXJlcGVhdGVkIGVsZW1lbnQgaW50byBhbiBzaW1wbGUgdmFsdWUgLS0+Ci0gIDx4c2w6dGVtcGxhdGUgbmFtZT0idW5tYXJzaGFsLXZhbHVlIj4KLSAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGphdmEtdHlwZSIvPjx4c2w6dGV4dD4gPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGphdmEtbmFtZSIvPiA9IDx4c2w6Y2hvb3NlPjx4c2w6d2hlbiB0ZXN0PSJib29sZWFuKEBkZWZhdWx0KSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBkZWZhdWx0Ii8+PC94c2w6d2hlbj48eHNsOm90aGVyd2lzZT5udWxsPC94c2w6b3RoZXJ3aXNlPjwveHNsOmNob29zZT47Ci0gICAgPHhzbDpjaG9vc2U+Ci0gICAgICA8eHNsOndoZW4gdGVzdD0iQGZvcm09J2NvbXBsZXgnIGFuZCBAdHlwZS1pbmRleD0nJyI+Ci0gICAgICAgICAgICBpZiAodWN0eC5nZXRVbm1hcnNoYWxsZXIoIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbnMiLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+IikuaXNQcmVzZW50KHVjdHgpKSB7Ci0gICAgICA8L3hzbDp3aGVuPgotICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICBpZiAodWN0eC5pc0F0KCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5zIi8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPiIpKSB7Ci0gICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgPC94c2w6Y2hvb3NlPgotICAgIDx4c2w6aWYgdGVzdD0iQG5pbGxhYmxlPSd0cnVlJyI+Ci0gICAgICAgICAgICAgICAgaWYgKHVjdHguYXR0cmlidXRlQm9vbGVhbigiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCAibmlsIiwgZmFsc2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHVjdHguc2tpcEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgIDwveHNsOmlmPgotICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAamF2YS1uYW1lIi8+ID0gKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAamF2YS10eXBlIi8+KTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJkZXNlcmlhbGl6ZS1lbGVtZW50LXZhbHVlIi8+OwotICAgIDx4c2w6aWYgdGVzdD0iQGZvcm09J2NvbXBsZXgnIGFuZCBAdHlwZS1pbmRleCE9JyciPgotICAgICAgICAgICAgICAgIHVjdHgucGFyc2VQYXN0Q3VycmVudEVuZFRhZygiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9J0BucycvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0nQG5hbWUnLz4iKTsKLSAgICA8L3hzbDppZj4KLSAgICA8eHNsOmlmIHRlc3Q9IkBuaWxsYWJsZT0ndHJ1ZSciPgotICAgICAgICAgICAgICAgIH0KLSAgICA8L3hzbDppZj4KLSAgICA8eHNsOmNob29zZT4KLSAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAb3B0aW9uYWw9J3RydWUnIj4KLSAgICAgICAgICAgIH0KLSAgICAgIDwveHNsOndoZW4+Ci0gICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0KCJNaXNzaW5nIHJlcXVpcmVkIGVsZW1lbnQgezx4c2w6dmFsdWUtb2Ygc2VsZWN0PSdAbnMnLz59PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9J0BuYW1lJy8+Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgPC94c2w6Y2hvb3NlPgotICA8L3hzbDp0ZW1wbGF0ZT4KLSAgCi0gIDwhLS0gQ29udmVydCB0aGUgY3VycmVudCBlbGVtZW50IGludG8gYSB2YWx1ZS4gLS0+Ci0gIDx4c2w6dGVtcGxhdGUgbmFtZT0iZGVzZXJpYWxpemUtZWxlbWVudC12YWx1ZSI+Ci0gICAgPHhzbDpjaG9vc2U+Ci0gICAgICA8eHNsOndoZW4gdGVzdD0iQGphdmEtdHlwZT0namF2YS5sYW5nLlN0cmluZycgYW5kIEBkZXNlcmlhbGl6ZXI9JyciPgotICAgICAgICB1Y3R4LnBhcnNlRWxlbWVudFRleHQoIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbnMiLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+IikKLSAgICAgIDwveHNsOndoZW4+Ci0gICAgICA8eHNsOndoZW4gdGVzdD0iQGZvcm09J3NpbXBsZScgYW5kIEBkZXNlcmlhbGl6ZXI9JyciPgotICAgICAgICBuZXcgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBqYXZhLXR5cGUiLz4odWN0eC5wYXJzZUVsZW1lbnRUZXh0KCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5zIi8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPiIpKQotICAgICAgPC94c2w6d2hlbj4KLSAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAZm9ybT0nc2ltcGxlJyBhbmQgQHdyYXBwZWQtcHJpbWl0aXZlPSd0cnVlJyI+Ci0gICAgICAgIG5ldyA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGphdmEtdHlwZSIvPig8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGRlc2VyaWFsaXplciIvPih1Y3R4LnBhcnNlRWxlbWVudFRleHQoIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbnMiLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+IikpKQotICAgICAgPC94c2w6d2hlbj4KLSAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAZm9ybT0nc2ltcGxlJyI+Ci0gICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAZGVzZXJpYWxpemVyIi8+KHVjdHgucGFyc2VFbGVtZW50VGV4dCgiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBucyIvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4iKSkKLSAgICAgIDwveHNsOndoZW4+Ci0gICAgICA8eHNsOndoZW4gdGVzdD0iQGZvcm09J2NvbXBsZXgnIGFuZCBAdHlwZS1pbmRleD0nJyI+Ci0gICAgICAgIHVjdHgudW5tYXJzaGFsRWxlbWVudCgpCi0gICAgICA8L3hzbDp3aGVuPgotICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBmb3JtPSdjb21wbGV4JyI+Ci0gICAgICAgIHVjdHguZ2V0VW5tYXJzaGFsbGVyKF90eXBlX25hbWU8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUtaW5kZXgiLz4pLnVubWFyc2hhbCg8eHNsOmNob29zZT48eHNsOndoZW4gdGVzdD0ic3RyaW5nLWxlbmd0aChub3JtYWxpemUtc3BhY2UoQGNyZWF0ZS10eXBlKSkgPSAwIj5udWxsPC94c2w6d2hlbj48eHNsOm90aGVyd2lzZT5uZXcgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBjcmVhdGUtdHlwZSIvPigpPC94c2w6b3RoZXJ3aXNlPjwveHNsOmNob29zZT4sIHVjdHgpCi0gICAgICA8L3hzbDp3aGVuPgotICAgIDwveHNsOmNob29zZT4KLSAgPC94c2w6dGVtcGxhdGU+Ci0gIAotPC94c2w6c3R5bGVzaGVldD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qaWJ4L3Rlc3QtcmVzb3VyY2VzL2JpbmRpbmcvY3VzdG9tZXItYmluZGluZy54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9qaWJ4L3Rlc3QtcmVzb3VyY2VzL2JpbmRpbmcvY3VzdG9tZXItYmluZGluZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwYWNiYWQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamlieC90ZXN0LXJlc291cmNlcy9iaW5kaW5nL2N1c3RvbWVyLWJpbmRpbmcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08YmluZGluZz4KLSAgPG5hbWVzcGFjZSB1cmk9Imh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL2ppYngvY3VzdG9tZXIvZGF0YSIgZGVmYXVsdD0iZWxlbWVudHMiLz4KLSAgPG1hcHBpbmcgbmFtZT0iY3VzdG9tZXIiIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmppYnguQ3VzdG9tZXIiPgotICAgIDxzdHJ1Y3R1cmUgbmFtZT0icGVyc29uIiBmaWVsZD0icGVyc29uIj4KLSAgICAgIDx2YWx1ZSBuYW1lPSJjdXN0LW51bSIgZmllbGQ9ImN1c3RvbWVyTnVtYmVyIi8+Ci0gICAgICA8dmFsdWUgbmFtZT0iZmlyc3QtbmFtZSIgZmllbGQ9ImZpcnN0TmFtZSIvPgotICAgICAgPHZhbHVlIG5hbWU9Imxhc3QtbmFtZSIgZmllbGQ9Imxhc3ROYW1lIi8+Ci0gICAgPC9zdHJ1Y3R1cmU+Ci0gICAgPHZhbHVlIG5hbWU9InN0cmVldCIgZmllbGQ9InN0cmVldCIvPgotICAgIDx2YWx1ZSBuYW1lPSJjaXR5IiBmaWVsZD0iY2l0eSIvPgotICAgIDx2YWx1ZSBuYW1lPSJzdGF0ZSIgZmllbGQ9InN0YXRlIi8+Ci0gICAgPHZhbHVlIG5hbWU9InppcCIgZmllbGQ9InppcCIvPgotICAgIDx2YWx1ZSBuYW1lPSJwaG9uZSIgZmllbGQ9InBob25lIi8+Ci0gIDwvbWFwcGluZz4KLTwvYmluZGluZz4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ppYngvdGVzdC1yZXNvdXJjZXMvYmluZGluZy9saWJyYXJ5LWJpbmRpbmcueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvamlieC90ZXN0LXJlc291cmNlcy9iaW5kaW5nL2xpYnJhcnktYmluZGluZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzOGE5MjMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamlieC90ZXN0LXJlc291cmNlcy9iaW5kaW5nL2xpYnJhcnktYmluZGluZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08YmluZGluZyBhZGQtY29uc3RydWN0b3JzPSJ0cnVlIiBmb3JjZS1jbGFzc2VzPSJ0cnVlIgotICAgIHhtbG5zOnRucz0iaHR0cDovL3dzLnNvc25vc2tpLmNvbS9saWJyYXJ5L3R5cGVzIj4KLQotICA8bmFtZXNwYWNlIHVyaT0iaHR0cDovL3dzLnNvc25vc2tpLmNvbS9saWJyYXJ5L3R5cGVzIiBkZWZhdWx0PSJlbGVtZW50cyIvPgotICAKLSAgPG1hcHBpbmcgbmFtZT0iZ2V0Qm9vayIKLSAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmppYngud3JhcHBlcnMuR2V0Qm9va1JlcXVlc3QiPgotICAgIDx2YWx1ZSBuYW1lPSJpc2JuIiBmaWVsZD0ibV9pc2JuIi8+Ci0gIDwvbWFwcGluZz4KLSAgCi0gIDxtYXBwaW5nIG5hbWU9ImdldEJvb2tSZXNwb25zZSIKLSAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmppYngud3JhcHBlcnMuR2V0Qm9va1Jlc3BvbnNlIj4KLSAgICA8c3RydWN0dXJlIG5hbWU9ImdldEJvb2tSZXR1cm4iIGZpZWxkPSJtX2Jvb2siIHVzYWdlPSJvcHRpb25hbCIKLSAgICAgICAgbWFwLWFzPSJ0bnM6Qm9va0luZm9ybWF0aW9uIi8+Ci0gIDwvbWFwcGluZz4KLSAgCi0gIDxtYXBwaW5nIG5hbWU9ImdldEJvb2tzQnlUeXBlIgotICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuamlieC53cmFwcGVycy5HZXRCb29rc0J5VHlwZVJlcXVlc3QiPgotICAgIDx2YWx1ZSBuYW1lPSJ0eXBlIiBmaWVsZD0ibV90eXBlIi8+Ci0gIDwvbWFwcGluZz4KLSAgCi0gIDxtYXBwaW5nIG5hbWU9ImdldEJvb2tzQnlUeXBlUmVzcG9uc2UiCi0gICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5qaWJ4LndyYXBwZXJzLkdldEJvb2tzQnlUeXBlUmVzcG9uc2UiPgotICAgIDxjb2xsZWN0aW9uIGZpZWxkPSJtX2Jvb2tzIiB1c2FnZT0ib3B0aW9uYWwiPgotICAgICAgPHN0cnVjdHVyZSBuYW1lPSJnZXRCb29rc0J5VHlwZVJldHVybiIgbWFwLWFzPSJ0bnM6Qm9va0luZm9ybWF0aW9uIi8+Ci0gICAgPC9jb2xsZWN0aW9uPgotICA8L21hcHBpbmc+Ci0gIAotICA8bWFwcGluZyBuYW1lPSJnZXRUeXBlcyIKLSAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmppYngud3JhcHBlcnMuR2V0VHlwZXNSZXF1ZXN0Ii8+Ci0gIAotICA8bWFwcGluZyBuYW1lPSJnZXRUeXBlc1Jlc3BvbnNlIgotICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuamlieC53cmFwcGVycy5HZXRUeXBlc1Jlc3BvbnNlIj4KLSAgICA8Y29sbGVjdGlvbiBmaWVsZD0ibV90eXBlcyIgdXNhZ2U9Im9wdGlvbmFsIj4KLSAgICAgIDxzdHJ1Y3R1cmUgbmFtZT0iZ2V0VHlwZXNSZXR1cm4iIG1hcC1hcz0idG5zOlR5cGVJbmZvcm1hdGlvbiIvPgotICAgIDwvY29sbGVjdGlvbj4KLSAgPC9tYXBwaW5nPgotICAKLSAgPG1hcHBpbmcgbmFtZT0iYWRkQm9vayIKLSAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmppYngud3JhcHBlcnMuQWRkQm9va1JlcXVlc3QiPgotICAgIDxzdHJ1Y3R1cmUgZmllbGQ9Im1fYm9vayI+Ci0gICAgICA8dmFsdWUgbmFtZT0idHlwZSIgZmllbGQ9Im1fdHlwZSIvPgotICAgICAgPHZhbHVlIG5hbWU9ImlzYm4iIGZpZWxkPSJtX2lzYm4iLz4KLSAgICAgIDxjb2xsZWN0aW9uIGZpZWxkPSJtX2F1dGhvcnMiPgotICAgICAgICA8dmFsdWUgbmFtZT0iYXV0aG9yIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+Ci0gICAgICA8L2NvbGxlY3Rpb24+Ci0gICAgICA8dmFsdWUgbmFtZT0idGl0bGUiIGZpZWxkPSJtX3RpdGxlIi8+Ci0gICAgPC9zdHJ1Y3R1cmU+Ci0gIDwvbWFwcGluZz4KLSAgCi0gIDxtYXBwaW5nIG5hbWU9ImFkZEJvb2tSZXNwb25zZSIKLSAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmppYngud3JhcHBlcnMuQWRkQm9va1Jlc3BvbnNlIj4KLSAgICA8dmFsdWUgbmFtZT0iYWRkQm9va1JldHVybiIgZmllbGQ9Im1fc3VjY2VzcyIvPgotICA8L21hcHBpbmc+Ci0gIAotICA8bWFwcGluZyBuYW1lPSJhZGRCb29rSW5zdGFuY2UiCi0gICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5qaWJ4LndyYXBwZXJzLkFkZEJvb2tJbnN0YW5jZVJlcXVlc3QiPgotICAgIDxzdHJ1Y3R1cmUgbmFtZT0iYm9vayIgZmllbGQ9Im1fYm9vayIgbWFwLWFzPSJ0bnM6Qm9va0luZm9ybWF0aW9uIi8+Ci0gIDwvbWFwcGluZz4KLSAgCi0gIDxtYXBwaW5nIG5hbWU9ImFkZEJvb2tJbnN0YW5jZVJlc3BvbnNlIgotICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuamlieC53cmFwcGVycy5BZGRCb29rSW5zdGFuY2VSZXNwb25zZSIvPgotICAKLSAgPG1hcHBpbmcgYWJzdHJhY3Q9InRydWUiIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmppYnguYmVhbnMuQm9vayIKLSAgICAgIHR5cGUtbmFtZT0idG5zOkJvb2tJbmZvcm1hdGlvbiI+Ci0gICAgPG5hbWVzcGFjZSBwcmVmaXg9InR5cGVzIiB1cmk9Imh0dHA6Ly93cy5zb3Nub3NraS5jb20vbGlicmFyeS90eXBlcyIvPgotICAgIDx2YWx1ZSBuYW1lPSJ0eXBlIiBzdHlsZT0iYXR0cmlidXRlIiBmaWVsZD0ibV90eXBlIi8+Ci0gICAgPHZhbHVlIG5hbWU9ImlzYm4iIHN0eWxlPSJhdHRyaWJ1dGUiIGZpZWxkPSJtX2lzYm4iLz4KLSAgICA8Y29sbGVjdGlvbiBmaWVsZD0ibV9hdXRob3JzIj4KLSAgICAgIDx2YWx1ZSBuYW1lPSJhdXRob3IiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KLSAgICA8L2NvbGxlY3Rpb24+Ci0gICAgPHZhbHVlIG5hbWU9InRpdGxlIiBmaWVsZD0ibV90aXRsZSIvPgotICA8L21hcHBpbmc+Ci0gIAotICA8bWFwcGluZyBhYnN0cmFjdD0idHJ1ZSIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuamlieC5iZWFucy5UeXBlIgotICAgICAgdHlwZS1uYW1lPSJ0bnM6VHlwZUluZm9ybWF0aW9uIj4KLSAgICA8dmFsdWUgbmFtZT0ibmFtZSIgc3R5bGU9ImF0dHJpYnV0ZSIgZmllbGQ9Im1fbmFtZSIvPgotICAgIDx2YWx1ZSBuYW1lPSJjb3VudCIgc3R5bGU9ImF0dHJpYnV0ZSIgZmllbGQ9Im1fY291bnQiLz4KLSAgICA8dmFsdWUgc3R5bGU9InRleHQiIGZpZWxkPSJtX2Rlc2NyaXB0aW9uIi8+Ci0gIDwvbWFwcGluZz4KLQotPC9iaW5kaW5nPgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamlieC90ZXN0LXJlc291cmNlcy9yZXBvL2NvbmYvYXhpczIueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvamlieC90ZXN0LXJlc291cmNlcy9yZXBvL2NvbmYvYXhpczIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmRlYTdlLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ppYngvdGVzdC1yZXNvdXJjZXMvcmVwby9jb25mL2F4aXMyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxheGlzY29uZmlnIG5hbWU9IkF4aXNKYXZhMi4wIj4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBQYXJhbWV0ZXJzIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImhvdGRlcGxveW1lbnQiPnRydWU8L3BhcmFtZXRlcj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImhvdHVwZGF0ZSI+ZmFsc2U8L3BhcmFtZXRlcj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImVuYWJsZU1UT00iPmZhbHNlPC9wYXJhbWV0ZXI+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJzZW5kU3RhY2t0cmFjZURldGFpbHNXaXRoRmF1bHRzIj50cnVlPC9wYXJhbWV0ZXI+Ci0KLSAgICA8cGFyYW1ldGVyIG5hbWU9InVzZXJOYW1lIj5hZG1pbjwvcGFyYW1ldGVyPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFzc3dvcmQiPmF4aXMyPC9wYXJhbWV0ZXI+Ci0KLSAgICA8IS0tIElmIHlvdSBoYXZlIGEgZnJvbnRlbmQgaG9zdCB3aGljaCBleHBvc2VzIHRoaXMgd2Vic2VydmljZSB1c2luZyBhIGRpZmZlcmVudCBwdWJsaWMgVVJMICAtLT4KLSAgICA8IS0tIHVzZSB0aGlzIHBhcmFtZXRlciB0byBvdmVycmlkZSBhdXRvZGV0ZWN0ZWQgdXJsIC0tPgotICAgIDwhLS08cGFyYW1ldGVyIG5hbWU9Imh0dHBGcm9udGVuZEhvc3RVcmwiPmh0dHBzOi8vc29tZW90aGVyaG9zdC9jb250ZXh0PC9wYXJhbWV0ZXI+LS0+Ci0KLQotICAgIDwhLS0gICAgVGhlIHdheSBvZiBhZGRpbmcgbGlzdGVuZXIgdG8gdGhlIHN5c3RlbS0tPgotICAgIDwhLS0gICAgPGxpc3RlbmVyIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLk9ic2VydmVySU1QTCI+LS0+Ci0gICAgPCEtLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJSU1NfVVJMIj5odHRwOi8vMTI3LjAuMC4xL3JzczwvcGFyYW1ldGVyPi0tPgotICAgIDwhLS0gICAgPC9saXN0ZW5lcj4tLT4KLQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIE1lc3NhZ2UgUmVjZWl2ZXJzIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tVGhpcyBpcyB0aGUgRGVhZnVsdCBNZXNzYWdlIFJlY2VpdmVyIGZvciB0aGUgc3lzdGVtICwgaWYgeW91IHdhbnQgdG8gaGF2ZSBNZXNzYWdlUmVjZWl2ZXJzIGZvciAtLT4KLSAgICA8IS0tYWxsIHRoZSBvdGhlciBNRVAgaW1wbGVtZW50IGl0IGFuZCBhZGQgdGhlIGNvcnJlY3QgZW50cnkgdG8gaGVyZSAsIHNvIHRoYXQgeW91IGNhbiByZWZlciBmcm9tLS0+Ci0gICAgPCEtLWFueSBvcGVyYXRpb24gLS0+Ci0gICAgPCEtLU5vdGUgOiBZb3UgY2FuIG92cmlkZSB0aGlzIGZvciBwYXJ0aWN1bGFyIHNlcnZpY2UgYnkgYWRkaW5nIHRoZSBzYW1lIGVsZW1lbnQgd2l0aCB5b3VyIHJlcXVpcmVtZW50LS0+Ci0gICAgPG1lc3NhZ2VSZWNlaXZlcnM+Ci0gICAgICAgIDxtZXNzYWdlUmVjZWl2ZXIgbWVwPSJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaW4tb25seSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuUmF3WE1MSU5Pbmx5TWVzc2FnZVJlY2VpdmVyIi8+Ci0gICAgICAgIDxtZXNzYWdlUmVjZWl2ZXIgbWVwPSJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaW4tb3V0IgotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5SYXdYTUxJTk91dE1lc3NhZ2VSZWNlaXZlciIvPgotICAgIDwvbWVzc2FnZVJlY2VpdmVycz4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBUcmFuc3BvcnQgSW5zIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8dHJhbnNwb3J0UmVjZWl2ZXIgbmFtZT0iaHR0cCIKLSAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuU2ltcGxlSFRUUFNlcnZlciI+Ci0gICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icG9ydCI+NjA2MDwvcGFyYW1ldGVyPgotICAgICAgICA8IS0tSWYgeW91IHdhbnQgdG8gZ2l2ZSB5b3VyIG93biBob3N0IGFkZHJlc3MgZm9yIEVQUiBnZW5lcmF0aW9uLS0+Ci0gICAgICAgIDwhLS11bmNvbW1ldCBmb2xsb3dpbmcgcGFyYW10ZXIgLCBhbmQgc2V0IGFzIHlvdSByZXF1aXJlZC4tLT4KLSAgICAgICAgPCEtLTxwYXJhbWV0ZXIgbmFtZT0iaG9zdG5hbWUiPmh0dHA6Ly9teUFwcC5jb20vd3M8L3BhcmFtZXRlcj4tLT4KLSAgICA8L3RyYW5zcG9ydFJlY2VpdmVyPgotCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gVHJhbnNwb3J0IE91dHMgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi0gICAgPHRyYW5zcG9ydFNlbmRlciBuYW1lPSJsb2NhbCIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5sb2NhbC5Mb2NhbFRyYW5zcG9ydFNlbmRlciIvPgotICAgIDx0cmFuc3BvcnRTZW5kZXIgbmFtZT0iaHR0cCIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkNvbW1vbnNIVFRQVHJhbnNwb3J0U2VuZGVyIj4KLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJQUk9UT0NPTCI+SFRUUC8xLjE8L3BhcmFtZXRlcj4KLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJUcmFuc2Zlci1FbmNvZGluZyI+Y2h1bmtlZDwvcGFyYW1ldGVyPgotICAgIDwvdHJhbnNwb3J0U2VuZGVyPgotICAgIDx0cmFuc3BvcnRTZW5kZXIgbmFtZT0iaHR0cHMiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5Db21tb25zSFRUUFRyYW5zcG9ydFNlbmRlciI+Ci0gICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iUFJPVE9DT0wiPkhUVFAvMS4xPC9wYXJhbWV0ZXI+Ci0gICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iVHJhbnNmZXItRW5jb2RpbmciPmNodW5rZWQ8L3BhcmFtZXRlcj4KLSAgICA8L3RyYW5zcG9ydFNlbmRlcj4KLQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIEdsb2JhbCBNb2R1bGVzICAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBDb21tZW50IHRoaXMgdG8gZGlzYWJsZSBBZGRyZXNzaW5nIC0tPgotPCEtLSAgICA8bW9kdWxlIHJlZj0iYWRkcmVzc2luZyIvPiAgLS0+Ci0KLSAgICA8IS0tQ29uZmlndXJpbmcgbW9kdWxlICwgcHJvdmlkaW5nIHBhcmFtZXRlcnMgZm9yIG1vZHVsZXMgd2hldGhlciB0aGV5IHJlZmVyIG9yIG5vdC0tPgotICAgIDwhLS08bW9kdWxlQ29uZmlnIG5hbWU9ImFkZHJlc3NpbmciPi0tPgotICAgIDwhLS08cGFyYW1ldGVyIG5hbWU9ImFkZHJlc3NpbmdQYXJhIj5OL0E8L3BhcmFtZXRlcj4tLT4KLSAgICA8IS0tPC9tb2R1bGVDb25maWc+LS0+Ci0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBQaGFzZXMgIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8cGhhc2VPcmRlciB0eXBlPSJJbkZsb3ciPgotICAgICAgICA8IS0tICBTeXN0ZW0gcHJlIGRlZmluZWQgcGhhc2VzICAgICAgIC0tPgotICAgICAgICAgPHBoYXNlIG5hbWU9IlRyYW5zcG9ydCI+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJSZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciIvPgotCSAgICA8aGFuZGxlciBuYW1lPSJSZXF1ZXN0VVJJQmFzZWRPcGVyYXRpb25EaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSUJhc2VkT3BlcmF0aW9uRGlzcGF0Y2hlciIvPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiLz4KLSAgICAgICAgPC9waGFzZT4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlNlY3VyaXR5Ii8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJQcmVEaXNwYXRjaCIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iRGlzcGF0Y2giIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5EaXNwYXRjaFBoYXNlIj4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5BZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIi8+Ci0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciIvPgotICAgICAgICA8L3BoYXNlPgotICAgICAgICA8IS0tICBTeXN0ZW0gcHJlIGRlZmluZWQgcGhhc2VzICAgICAgIC0tPgotICAgICAgICA8IS0tICAgQWZ0ZXIgUG9zdGRpc3BhdGNoIHBoYXNlIG1vZHVsZSBhdXRob3Igb3Igb3Igc2VydmljZSBhdXRob3IgY2FuIGFkZCBhbnkgcGhhc2UgaGUgd2FudCAgICAgIC0tPgotICAgICAgICA8cGhhc2UgbmFtZT0iT3BlcmF0aW9uSW5QaGFzZSIvPgotICAgIDwvcGhhc2VPcmRlcj4KLSAgICA8cGhhc2VPcmRlciB0eXBlPSJPdXRGbG93Ij4KLSAgICAgICAgPCEtLSAgICAgIHVzZXIgY2FuIGFkZCBoaXMgb3duIHBoYXNlcyB0byB0aGlzIGFyZWEgIC0tPgotICAgICAgICA8cGhhc2UgbmFtZT0iT3BlcmF0aW9uT3V0UGhhc2UiLz4KLSAgICAgICAgPCEtLXN5c3RlbSBwcmVkZWZpbmVkIHBoYXNlLS0+Ci0gICAgICAgIDwhLS10aGVzZSBwaGFzZSB3aWxsIHJ1biBpcnJlc3BlY3RpdmUgb2YgdGhlIHNlcnZpY2UtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlBvbGljeURldGVybWluYXRpb24iLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik1lc3NhZ2VPdXQiLz4KLSAgICA8L3BoYXNlT3JkZXI+Ci0gICAgPHBoYXNlT3JkZXIgdHlwZT0iSW5GYXVsdEZsb3ciPgotICAgICAgICA8cGhhc2UgbmFtZT0iUHJlRGlzcGF0Y2giLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9IkRpc3BhdGNoIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuRGlzcGF0Y2hQaGFzZSI+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJSZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciIvPgotCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciIvPgotCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJBZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciIvPgotCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiLz4KLSAgICAgICAgPC9waGFzZT4KLSAgICAgICAgPCEtLSAgICAgIHVzZXIgY2FuIGFkZCBoaXMgb3duIHBoYXNlcyB0byB0aGlzIGFyZWEgIC0tPgotICAgICAgICA8cGhhc2UgbmFtZT0iT3BlcmF0aW9uSW5GYXVsdFBoYXNlIi8+Ci0gICAgPC9waGFzZU9yZGVyPgotICAgIDxwaGFzZU9yZGVyIHR5cGU9Ik91dEZhdWx0RmxvdyI+Ci0gICAgICAgIDwhLS0gICAgICB1c2VyIGNhbiBhZGQgaGlzIG93biBwaGFzZXMgdG8gdGhpcyBhcmVhICAtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik9wZXJhdGlvbk91dEZhdWx0UGhhc2UiLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlBvbGljeURldGVybWluYXRpb24iLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik1lc3NhZ2VPdXQiLz4KLSAgICA8L3BoYXNlT3JkZXI+Ci08L2F4aXNjb25maWc+Ci0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ppYngvdGVzdC1yZXNvdXJjZXMvd3NkbC9jdXN0b21lci1lY2hvLndzZGwgYi92MS41LjFSQzMvbW9kdWxlcy9qaWJ4L3Rlc3QtcmVzb3VyY2VzL3dzZGwvY3VzdG9tZXItZWNoby53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODM1YzEyLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ppYngvdGVzdC1yZXNvdXJjZXMvd3NkbC9jdXN0b21lci1lY2hvLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxkZWZpbml0aW9ucyB4bWxuczpkbnM9Imh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL2ppYngvY3VzdG9tZXIvZGF0YSIKLSAgIHhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIKLSAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIgotICAgeG1sbnM6dG5zPSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi9qaWJ4L2N1c3RvbWVyL3dzZGwiCi0gICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL2ppYngvY3VzdG9tZXIvd3NkbCI+Ci0gIAotICA8dHlwZXM+Ci0gICAgPHhzZDpzY2hlbWE+Ci0gICAgICA8eHNkOmltcG9ydCBzY2hlbWFMb2NhdGlvbj0iY3VzdG9tZXIueHNkIgotICAgICAgICAgIG5hbWVzcGFjZT0iaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvamlieC9jdXN0b21lci9kYXRhIi8+Ci0gICAgPC94c2Q6c2NoZW1hPgotICA8L3R5cGVzPgotCi0gIDxtZXNzYWdlIG5hbWU9IkVjaG9SZXF1ZXN0Ij4KLSAgICA8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJkbnM6Y3VzdG9tZXIiLz4KLSAgPC9tZXNzYWdlPgotICA8bWVzc2FnZSBuYW1lPSJFY2hvUmVzcG9uc2UiPgotICAgIDxwYXJ0IG5hbWU9InJlc3VsdCIgZWxlbWVudD0iZG5zOmN1c3RvbWVyIi8+Ci0gIDwvbWVzc2FnZT4KLSAgCi0gIDxwb3J0VHlwZSBuYW1lPSJFY2hvQ3VzdG9tZXIiPgotICAgIDxvcGVyYXRpb24gbmFtZT0iZWNobyI+Ci0gICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOkVjaG9SZXF1ZXN0Ii8+Ci0gICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczpFY2hvUmVzcG9uc2UiLz4KLSAgICA8L29wZXJhdGlvbj4KLSAgPC9wb3J0VHlwZT4KLQotICA8YmluZGluZyBuYW1lPSJFY2hvQ3VzdG9tZXJCaW5kaW5nIiB0eXBlPSJ0bnM6RWNob0N1c3RvbWVyIj4KLSAgICA8c29hcDpiaW5kaW5nIHN0eWxlPSJkb2N1bWVudCIgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiLz4KLSAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG8iPgotICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249ImVjaG8iLz4KLSAgICAgIDxpbnB1dD4KLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgIDwvaW5wdXQ+Ci0gICAgICA8b3V0cHV0PgotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgPC9vdXRwdXQ+Ci0gICAgPC9vcGVyYXRpb24+Ci0gIDwvYmluZGluZz4KLQotICA8c2VydmljZSBuYW1lPSJFY2hvQ3VzdG9tZXJTZXJ2aWNlIj4KLSAgICA8cG9ydCBuYW1lPSJFY2hvQ3VzdG9tZXJQb3J0IiBiaW5kaW5nPSJ0bnM6RWNob0N1c3RvbWVyQmluZGluZyI+Ci0gICAgICA8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vMTI3LjAuMC4xOjU1NTUvYXhpczIvc2VydmljZXMvRWNob0N1c3RvbWVyU2VydmljZSIvPgotICAgIDwvcG9ydD4KLSAgPC9zZXJ2aWNlPgotICAKLTwvZGVmaW5pdGlvbnM+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qaWJ4L3Rlc3QtcmVzb3VyY2VzL3dzZGwvY3VzdG9tZXIueHNkIGIvdjEuNS4xUkMzL21vZHVsZXMvamlieC90ZXN0LXJlc291cmNlcy93c2RsL2N1c3RvbWVyLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY2NDY0Zi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qaWJ4L3Rlc3QtcmVzb3VyY2VzL3dzZGwvY3VzdG9tZXIueHNkCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzY2hlbWEgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvamlieC9jdXN0b21lci9kYXRhIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOnRucz0iaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvamlieC9jdXN0b21lci9kYXRhIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4KLQotICA8IS0tIENyZWF0ZWQgZnJvbSBtYXBwaW5nIGZvciBjbGFzcyBvcmcuYXBhY2hlLmF4aXMyLmppYnguQ3VzdG9tZXIgLS0+Ci0gIDxlbGVtZW50IG5hbWU9ImN1c3RvbWVyIj4KLSAgICA8Y29tcGxleFR5cGU+Ci0gICAgICA8c2VxdWVuY2U+Ci0gICAgICAgIDxlbGVtZW50IG5hbWU9InBlcnNvbiI+Ci0gICAgICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJjdXN0LW51bSIgdHlwZT0ieHNkOmludCIvPgotICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJmaXJzdC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Imxhc3QtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgICA8L2NvbXBsZXhUeXBlPgotICAgICAgICA8L2VsZW1lbnQ+Ci0gICAgICAgIDxlbGVtZW50IG5hbWU9InN0cmVldCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8ZWxlbWVudCBuYW1lPSJjaXR5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDxlbGVtZW50IG5hbWU9InN0YXRlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDxlbGVtZW50IG5hbWU9InppcCIgdHlwZT0ieHNkOmludCIvPgotICAgICAgICA8ZWxlbWVudCBuYW1lPSJwaG9uZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgPC9zZXF1ZW5jZT4KLSAgICA8L2NvbXBsZXhUeXBlPgotICA8L2VsZW1lbnQ+Ci08L3NjaGVtYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qaWJ4L3Rlc3QtcmVzb3VyY2VzL3dzZGwvbGlicmFyeS53c2RsIGIvdjEuNS4xUkMzL21vZHVsZXMvamlieC90ZXN0LXJlc291cmNlcy93c2RsL2xpYnJhcnkud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E2MjM3ZC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qaWJ4L3Rlc3QtcmVzb3VyY2VzL3dzZGwvbGlicmFyeS53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsMjg4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHdzZGw6ZGVmaW5pdGlvbnMgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3Muc29zbm9za2kuY29tL2xpYnJhcnkvd3NkbCIKLSAgICB4bWxuczp3bnM9Imh0dHA6Ly93cy5zb3Nub3NraS5jb20vbGlicmFyeS93c2RsIgotICAgIHhtbG5zOnRucz0iaHR0cDovL3dzLnNvc25vc2tpLmNvbS9saWJyYXJ5L3R5cGVzIgotICAgIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIgotICAgIHhtbG5zOndzZGxzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIj4KLSAgPHdzZGw6dHlwZXM+Ci0gIAotICAgIDxzY2hlbWEgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0gICAgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3dzLnNvc25vc2tpLmNvbS9saWJyYXJ5L3R5cGVzIgotICAgICAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPgotICAgICAgICAKLSAgICAgIDxlbGVtZW50IG5hbWU9ImdldEJvb2siPgotICAgICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iaXNibiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgICA8L2VsZW1lbnQ+Ci0gICAgICAKLSAgICAgIDxlbGVtZW50IG5hbWU9ImdldEJvb2tSZXNwb25zZSI+Ci0gICAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJnZXRCb29rUmV0dXJuIiBtaW5PY2N1cnM9IjAiIHR5cGU9InRuczpCb29rSW5mb3JtYXRpb24iLz4KLSAgICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICA8L2NvbXBsZXhUeXBlPgotICAgICAgPC9lbGVtZW50PgotICAgICAgCi0gICAgICA8ZWxlbWVudCBuYW1lPSJnZXRCb29rc0J5VHlwZSI+Ci0gICAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ0eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICAgIDwvZWxlbWVudD4KLSAgICAgIAotICAgICAgPGVsZW1lbnQgbmFtZT0iZ2V0Qm9va3NCeVR5cGVSZXNwb25zZSI+Ci0gICAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJnZXRCb29rc0J5VHlwZVJldHVybiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgdHlwZT0idG5zOkJvb2tJbmZvcm1hdGlvbiIvPgotICAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgICA8L2VsZW1lbnQ+Ci0gICAgICAKLSAgICAgIDxlbGVtZW50IG5hbWU9ImdldFR5cGVzIj4KLSAgICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgIDxzZXF1ZW5jZS8+Ci0gICAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgICA8L2VsZW1lbnQ+Ci0gICAgICAKLSAgICAgIDxlbGVtZW50IG5hbWU9ImdldFR5cGVzUmVzcG9uc2UiPgotICAgICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iZ2V0VHlwZXNSZXR1cm4iIG1heE9jY3Vycz0idW5ib3VuZGVkIiB0eXBlPSJ0bnM6VHlwZUluZm9ybWF0aW9uIi8+Ci0gICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICAgIDwvZWxlbWVudD4KLSAgICAgIAotICAgICAgPGVsZW1lbnQgbmFtZT0iYWRkQm9vayI+Ci0gICAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ0eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJpc2JuIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJhdXRob3IiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InRpdGxlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICAgIDwvZWxlbWVudD4KLSAgICAgIAotICAgICAgPGVsZW1lbnQgbmFtZT0iYWRkQm9va1Jlc3BvbnNlIj4KLSAgICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImFkZEJvb2tSZXR1cm4iIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICAgIDwvZWxlbWVudD4KLSAgICAgIAotICAgICAgPGVsZW1lbnQgbmFtZT0iYWRkQm9va0luc3RhbmNlIj4KLSAgICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImJvb2siIHR5cGU9InRuczpCb29rSW5mb3JtYXRpb24iLz4KLSAgICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICA8L2NvbXBsZXhUeXBlPgotICAgICAgPC9lbGVtZW50PgotICAgICAgCi0gICAgICA8ZWxlbWVudCBuYW1lPSJhZGRCb29rSW5zdGFuY2VSZXNwb25zZSI+Ci0gICAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgICA8c2VxdWVuY2UvPgotICAgICAgICA8L2NvbXBsZXhUeXBlPgotICAgICAgPC9lbGVtZW50PgotICAgICAgCi0gICAgICA8Y29tcGxleFR5cGUgbmFtZT0iQm9va0luZm9ybWF0aW9uIj4KLSAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImF1dGhvciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgdHlwZT0ic3RyaW5nIi8+Ci0gICAgICAgICAgPGVsZW1lbnQgbmFtZT0idGl0bGUiIHR5cGU9InN0cmluZyIvPgotICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICA8YXR0cmlidXRlIG5hbWU9InR5cGUiIHVzZT0icmVxdWlyZWQiIHR5cGU9InN0cmluZyIvPgotICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlzYm4iIHVzZT0icmVxdWlyZWQiIHR5cGU9InN0cmluZyIvPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICAgIAotICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9IlR5cGVJbmZvcm1hdGlvbiI+Ci0gICAgICAgIDxzaW1wbGVDb250ZW50PgotICAgICAgICAgIDxleHRlbnNpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNvdW50IiB1c2U9InJlcXVpcmVkIiB0eXBlPSJpbnQiLz4KLSAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ic3RyaW5nIi8+Ci0gICAgICAgICAgPC9leHRlbnNpb24+Ci0gICAgICAgIDwvc2ltcGxlQ29udGVudD4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgICAKLSAgICA8L3NjaGVtYT4KLQotICA8L3dzZGw6dHlwZXM+Ci0KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJnZXRCb29rUmVxdWVzdCI+Ci0gICAgPHdzZGw6cGFydCBlbGVtZW50PSJ0bnM6Z2V0Qm9vayIgbmFtZT0icGFyYW1ldGVycyIvPgotICA8L3dzZGw6bWVzc2FnZT4KLQotICA8d3NkbDptZXNzYWdlIG5hbWU9ImdldEJvb2tSZXNwb25zZSI+Ci0gICAgPHdzZGw6cGFydCBlbGVtZW50PSJ0bnM6Z2V0Qm9va1Jlc3BvbnNlIiBuYW1lPSJwYXJhbWV0ZXJzIi8+Ci0gIDwvd3NkbDptZXNzYWdlPgotCi0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0iZ2V0Qm9va3NCeVR5cGVSZXF1ZXN0Ij4KLSAgICA8d3NkbDpwYXJ0IGVsZW1lbnQ9InRuczpnZXRCb29rc0J5VHlwZSIgbmFtZT0icGFyYW1ldGVycyIvPgotICA8L3dzZGw6bWVzc2FnZT4KLQotICA8d3NkbDptZXNzYWdlIG5hbWU9ImdldEJvb2tzQnlUeXBlUmVzcG9uc2UiPgotICAgIDx3c2RsOnBhcnQgZWxlbWVudD0idG5zOmdldEJvb2tzQnlUeXBlUmVzcG9uc2UiIG5hbWU9InBhcmFtZXRlcnMiLz4KLSAgPC93c2RsOm1lc3NhZ2U+Ci0gIAotICA8d3NkbDptZXNzYWdlIG5hbWU9ImdldFR5cGVzUmVxdWVzdCI+Ci0gICAgPHdzZGw6cGFydCBlbGVtZW50PSJ0bnM6Z2V0VHlwZXMiIG5hbWU9InBhcmFtZXRlcnMiLz4KLSAgPC93c2RsOm1lc3NhZ2U+Ci0KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJnZXRUeXBlc1Jlc3BvbnNlIj4KLSAgICA8d3NkbDpwYXJ0IGVsZW1lbnQ9InRuczpnZXRUeXBlc1Jlc3BvbnNlIiBuYW1lPSJwYXJhbWV0ZXJzIi8+Ci0gIDwvd3NkbDptZXNzYWdlPgotCi0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0iYWRkQm9va1JlcXVlc3QiPgotICAgIDx3c2RsOnBhcnQgZWxlbWVudD0idG5zOmFkZEJvb2siIG5hbWU9InBhcmFtZXRlcnMiLz4KLSAgPC93c2RsOm1lc3NhZ2U+Ci0gIAotICA8d3NkbDptZXNzYWdlIG5hbWU9ImFkZEJvb2tSZXNwb25zZSI+Ci0gICAgPHdzZGw6cGFydCBlbGVtZW50PSJ0bnM6YWRkQm9va1Jlc3BvbnNlIiBuYW1lPSJwYXJhbWV0ZXJzIi8+Ci0gIDwvd3NkbDptZXNzYWdlPgotCi0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0iYWRkQm9va0luc3RhbmNlUmVxdWVzdCI+Ci0gICAgPHdzZGw6cGFydCBlbGVtZW50PSJ0bnM6YWRkQm9va0luc3RhbmNlIiBuYW1lPSJwYXJhbWV0ZXJzIi8+Ci0gIDwvd3NkbDptZXNzYWdlPgotICAKLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJhZGRCb29rSW5zdGFuY2VSZXNwb25zZSI+Ci0gICAgPHdzZGw6cGFydCBlbGVtZW50PSJ0bnM6YWRkQm9va0luc3RhbmNlUmVzcG9uc2UiIG5hbWU9InBhcmFtZXRlcnMiLz4KLSAgPC93c2RsOm1lc3NhZ2U+Ci0KLSAgPHdzZGw6cG9ydFR5cGUgbmFtZT0iTGlicmFyeSI+Ci0KLSAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iZ2V0Qm9vayI+Ci0gICAgICA8d3NkbDppbnB1dCBtZXNzYWdlPSJ3bnM6Z2V0Qm9va1JlcXVlc3QiIG5hbWU9ImdldEJvb2tSZXF1ZXN0Ii8+Ci0gICAgICA8d3NkbDpvdXRwdXQgbWVzc2FnZT0id25zOmdldEJvb2tSZXNwb25zZSIgbmFtZT0iZ2V0Qm9va1Jlc3BvbnNlIi8+Ci0gICAgPC93c2RsOm9wZXJhdGlvbj4KLQotICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJnZXRCb29rc0J5VHlwZSI+Ci0gICAgICA8d3NkbDppbnB1dCBtZXNzYWdlPSJ3bnM6Z2V0Qm9va3NCeVR5cGVSZXF1ZXN0IiBuYW1lPSJnZXRCb29rc0J5VHlwZVJlcXVlc3QiLz4KLSAgICAgIDx3c2RsOm91dHB1dCBtZXNzYWdlPSJ3bnM6Z2V0Qm9va3NCeVR5cGVSZXNwb25zZSIgbmFtZT0iZ2V0Qm9va3NCeVR5cGVSZXNwb25zZSIvPgotICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0KLSAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iZ2V0VHlwZXMiPgotICAgICAgPHdzZGw6aW5wdXQgbWVzc2FnZT0id25zOmdldFR5cGVzUmVxdWVzdCIgbmFtZT0iZ2V0VHlwZXNSZXF1ZXN0Ii8+Ci0gICAgICA8d3NkbDpvdXRwdXQgbWVzc2FnZT0id25zOmdldFR5cGVzUmVzcG9uc2UiIG5hbWU9ImdldFR5cGVzUmVzcG9uc2UiLz4KLSAgICA8L3dzZGw6b3BlcmF0aW9uPgotCi0gICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImFkZEJvb2siPgotICAgICAgPHdzZGw6aW5wdXQgbWVzc2FnZT0id25zOmFkZEJvb2tSZXF1ZXN0IiBuYW1lPSJhZGRCb29rUmVxdWVzdCIvPgotICAgICAgPHdzZGw6b3V0cHV0IG1lc3NhZ2U9InduczphZGRCb29rUmVzcG9uc2UiIG5hbWU9ImFkZEJvb2tSZXNwb25zZSIvPgotICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0KLSAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iYWRkQm9va0luc3RhbmNlIj4KLSAgICAgIDx3c2RsOmlucHV0IG1lc3NhZ2U9InduczphZGRCb29rSW5zdGFuY2VSZXF1ZXN0IiBuYW1lPSJhZGRCb29rSW5zdGFuY2VSZXF1ZXN0Ii8+Ci0gICAgICA8d3NkbDpvdXRwdXQgbWVzc2FnZT0id25zOmFkZEJvb2tJbnN0YW5jZVJlc3BvbnNlIiBuYW1lPSJhZGRCb29rSW5zdGFuY2VSZXNwb25zZSIvPgotICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0KLSAgPC93c2RsOnBvcnRUeXBlPgotCi0gIDx3c2RsOmJpbmRpbmcgbmFtZT0iTGlicmFyeVNvYXBCaW5kaW5nIiB0eXBlPSJ3bnM6TGlicmFyeSI+Ci0KLSAgICA8d3NkbHNvYXA6YmluZGluZyBzdHlsZT0iZG9jdW1lbnQiIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIi8+Ci0KLSAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iZ2V0Qm9vayI+Ci0gICAgCi0gICAgICA8d3NkbHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPgotICAgICAgCi0gICAgICA8d3NkbDppbnB1dCBuYW1lPSJnZXRCb29rUmVxdWVzdCI+Ci0gICAgICAgIDx3c2Rsc29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgPC93c2RsOmlucHV0PgotICAgICAgCi0gICAgICA8d3NkbDpvdXRwdXQgbmFtZT0iZ2V0Qm9va1Jlc3BvbnNlIj4KLSAgICAgICAgPHdzZGxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgCi0gICAgPC93c2RsOm9wZXJhdGlvbj4KLQotICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJnZXRCb29rc0J5VHlwZSI+Ci0gICAgCi0gICAgICA8d3NkbHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPgotICAgICAgCi0gICAgICA8d3NkbDppbnB1dCBuYW1lPSJnZXRCb29rc0J5VHlwZVJlcXVlc3QiPgotICAgICAgICA8d3NkbHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgIAotICAgICAgPHdzZGw6b3V0cHV0IG5hbWU9ImdldEJvb2tzQnlUeXBlUmVzcG9uc2UiPgotICAgICAgICA8d3NkbHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAKLSAgICA8L3dzZGw6b3BlcmF0aW9uPgotCi0gICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImdldFR5cGVzIj4KLSAgICAKLSAgICAgIDx3c2Rsc29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+Ci0gICAgICAKLSAgICAgIDx3c2RsOmlucHV0IG5hbWU9ImdldFR5cGVzUmVxdWVzdCI+Ci0gICAgICAgIDx3c2Rsc29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgPC93c2RsOmlucHV0PgotCi0gICAgICA8d3NkbDpvdXRwdXQgbmFtZT0iZ2V0VHlwZXNSZXNwb25zZSI+Ci0gICAgICAgIDx3c2Rsc29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgPC93c2RsOm91dHB1dD4KLQotICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0KLSAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iYWRkQm9vayI+Ci0KLSAgICAgIDx3c2Rsc29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+Ci0KLSAgICAgIDx3c2RsOmlucHV0IG5hbWU9ImFkZEJvb2tSZXF1ZXN0Ij4KLSAgICAgICAgPHdzZGxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICA8L3dzZGw6aW5wdXQ+Ci0KLSAgICAgIDx3c2RsOm91dHB1dCBuYW1lPSJhZGRCb29rUmVzcG9uc2UiPgotICAgICAgICA8d3NkbHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0KLSAgICA8L3dzZGw6b3BlcmF0aW9uPgotCi0gICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImFkZEJvb2tJbnN0YW5jZSI+Ci0KLSAgICAgIDx3c2Rsc29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+Ci0KLSAgICAgIDx3c2RsOmlucHV0IG5hbWU9ImFkZEJvb2tJbnN0YW5jZVJlcXVlc3QiPgotICAgICAgICA8d3NkbHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgIDwvd3NkbDppbnB1dD4KLQotICAgICAgPHdzZGw6b3V0cHV0IG5hbWU9ImFkZEJvb2tJbnN0YW5jZVJlc3BvbnNlIj4KLSAgICAgICAgPHdzZGxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICA8L3dzZGw6b3V0cHV0PgotCi0gICAgPC93c2RsOm9wZXJhdGlvbj4KLQotICA8L3dzZGw6YmluZGluZz4KLQotICA8d3NkbDpzZXJ2aWNlIG5hbWU9ImxpYnJhcnkiPgotCi0gICAgPHdzZGw6cG9ydCBiaW5kaW5nPSJ3bnM6TGlicmFyeVNvYXBCaW5kaW5nIiBuYW1lPSJsaWJyYXJ5Ij4KLSAgICAgIDx3c2Rsc29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vMTI3LjAuMC4xOjU1NTUvYXhpczIvc2VydmljZXMvbGlicmFyeSIvPgotICAgIDwvd3NkbDpwb3J0PgotCi0gIDwvd3NkbDpzZXJ2aWNlPgotCi08L3dzZGw6ZGVmaW5pdGlvbnM+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qaWJ4L3Rlc3QtcmVzb3VyY2VzL3htbC9jdXN0b21lci1kYXRhLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2ppYngvdGVzdC1yZXNvdXJjZXMveG1sL2N1c3RvbWVyLWRhdGEueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYmM5NzM3Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ppYngvdGVzdC1yZXNvdXJjZXMveG1sL2N1c3RvbWVyLWRhdGEueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08Y3VzdG9tZXI+Ci0gIDxwZXJzb24+Ci0gICAgPGN1c3QtbnVtPjEyMzQ1Njc4OTwvY3VzdC1udW0+Ci0gICAgPGZpcnN0LW5hbWU+Sm9objwvZmlyc3QtbmFtZT4KLSAgICA8bGFzdC1uYW1lPlNtaXRoPC9sYXN0LW5hbWU+Ci0gIDwvcGVyc29uPgotICA8c3RyZWV0PjEyMzQ1IEhhcHB5IExhbmU8L3N0cmVldD4KLSAgPGNpdHk+UGx1bms8L2NpdHk+Ci0gIDxzdGF0ZT5XQTwvc3RhdGU+Ci0gIDx6aXA+OTgwNTk8L3ppcD4KLSAgPHBob25lPjg4OC41NTUuMTIzNDwvcGhvbmU+Ci08L2N1c3RvbWVyPgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamlieC90ZXN0L29yZy9hcGFjaGUvYXhpczIvamlieC9DdXN0b21lci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamlieC90ZXN0L29yZy9hcGFjaGUvYXhpczIvamlieC9DdXN0b21lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YmRiZTgyLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ppYngvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2ppYngvQ3VzdG9tZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qaWJ4OwotCi1wdWJsaWMgY2xhc3MgQ3VzdG9tZXIgewotICAgIHB1YmxpYyBQZXJzb24gcGVyc29uOwotICAgIHB1YmxpYyBTdHJpbmcgc3RyZWV0OwotICAgIHB1YmxpYyBTdHJpbmcgY2l0eTsKLSAgICBwdWJsaWMgU3RyaW5nIHN0YXRlOwotICAgIHB1YmxpYyBJbnRlZ2VyIHppcDsKLSAgICBwdWJsaWMgU3RyaW5nIHBob25lOwotCi0gICAgcHVibGljIEN1c3RvbWVyKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBDdXN0b21lcihTdHJpbmcgY2l0eSwgUGVyc29uIHBlcnNvbiwgU3RyaW5nIHBob25lLCBTdHJpbmcgc3RhdGUsIFN0cmluZyBzdHJlZXQsCi0gICAgICAgICAgICAgICAgICAgIEludGVnZXIgemlwKSB7Ci0gICAgICAgIHRoaXMuY2l0eSA9IGNpdHk7Ci0gICAgICAgIHRoaXMucGVyc29uID0gcGVyc29uOwotICAgICAgICB0aGlzLnBob25lID0gcGhvbmU7Ci0gICAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTsKLSAgICAgICAgdGhpcy5zdHJlZXQgPSBzdHJlZXQ7Ci0gICAgICAgIHRoaXMuemlwID0gemlwOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0gICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBDdXN0b21lcikgewotICAgICAgICAgICAgQ3VzdG9tZXIgY3VzdCA9IChDdXN0b21lcilvYmo7Ci0gICAgICAgICAgICByZXR1cm4gcGVyc29uLmVxdWFscyhjdXN0LnBlcnNvbikgJiYgc3RyZWV0LmVxdWFscyhjdXN0LnN0cmVldCkgJiYKLSAgICAgICAgICAgICAgICAgICAgY2l0eS5lcXVhbHMoY3VzdC5jaXR5KSAmJiBzdGF0ZS5lcXVhbHMoY3VzdC5zdGF0ZSkgJiYKLSAgICAgICAgICAgICAgICAgICAgemlwLmVxdWFscyhjdXN0LnppcCkgJiYgcGhvbmUuZXF1YWxzKGN1c3QucGhvbmUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamlieC90ZXN0L29yZy9hcGFjaGUvYXhpczIvamlieC9FY2hvLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qaWJ4L3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qaWJ4L0VjaG8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGExZmZkNS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qaWJ4L3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qaWJ4L0VjaG8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qaWJ4OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBFY2hvIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhFY2hvLmNsYXNzKTsKLQotICAgIHB1YmxpYyBFY2hvKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBPTUVsZW1lbnQgZWNobyhPTUVsZW1lbnQgb21FbGUpIHsKLSAgICAgICAgcmV0dXJuIG9tRWxlOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qaWJ4L3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qaWJ4L1BlcnNvbi5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamlieC90ZXN0L29yZy9hcGFjaGUvYXhpczIvamlieC9QZXJzb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE2YjU5OS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qaWJ4L3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qaWJ4L1BlcnNvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmppYng7Ci0KLXB1YmxpYyBjbGFzcyBQZXJzb24gewotICAgIHB1YmxpYyBpbnQgY3VzdG9tZXJOdW1iZXI7Ci0gICAgcHVibGljIFN0cmluZyBmaXJzdE5hbWU7Ci0gICAgcHVibGljIFN0cmluZyBsYXN0TmFtZTsKLQotICAgIHB1YmxpYyBQZXJzb24oKSB7Ci0gICAgfQotCi0gICAgcHVibGljIFBlcnNvbihpbnQgbnVtYmVyLCBTdHJpbmcgbmFtZSwgU3RyaW5nIG5hbWUyKSB7Ci0gICAgICAgIGN1c3RvbWVyTnVtYmVyID0gbnVtYmVyOwotICAgICAgICBmaXJzdE5hbWUgPSBuYW1lOwotICAgICAgICBsYXN0TmFtZSA9IG5hbWUyOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0gICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBQZXJzb24pIHsKLSAgICAgICAgICAgIFBlcnNvbiBwZXJzb24gPSAoUGVyc29uKW9iajsKLSAgICAgICAgICAgIHJldHVybiBjdXN0b21lck51bWJlciA9PSBwZXJzb24uY3VzdG9tZXJOdW1iZXIgJiYKLSAgICAgICAgICAgICAgICAgICAgZmlyc3ROYW1lLmVxdWFscyhwZXJzb24uZmlyc3ROYW1lKSAmJgotICAgICAgICAgICAgICAgICAgICBsYXN0TmFtZS5lcXVhbHMocGVyc29uLmxhc3ROYW1lKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ppYngvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2ppYngvVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamlieC90ZXN0L29yZy9hcGFjaGUvYXhpczIvamlieC9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwODJhMzkuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamlieC90ZXN0L29yZy9hcGFjaGUvYXhpczIvamlieC9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmppYng7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuQ29tbWFuZExpbmVPcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLkNvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5Db21tYW5kTGluZU9wdGlvblBhcnNlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4uQ29kZUdlbmVyYXRpb25FbmdpbmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4uQ29kZUdlbmVyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4uZXh0ZW5zaW9uLkppQlhFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXJnZXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuSmF2YWM7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlUmVhZGVyOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uZXQuVVJMQ2xhc3NMb2FkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBGdWxsIGNvZGUgZ2VuZXJhdGlvbiBhbmQgcnVudGltZSB0ZXN0IGZvciBKaUJYIGRhdGEgYmluZGluZyBleHRlbnNpb24uIFRoaXMgaXMgYmFzZWQgb24gdGhlCi0gKiBYTUxCZWFucyB0ZXN0IGNvZGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0NMQVNTRVNfRElSID0KLSAgICAgICAgICAgIFN5c3RlbS5nZXRQcm9wZXJ0eSgiYmFzZWRpciIsICIuIikgKyAiL3RhcmdldC90ZXN0LWNsYXNzZXMiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPVVRQVVRfTE9DQVRJT05fQkFTRSA9Ci0gICAgICAgICAgICBTeXN0ZW0uZ2V0UHJvcGVydHkoImJhc2VkaXIiLCAiLiIpICsgIi90YXJnZXQvZ2VuIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1VUUFVUX0xPQ0FUSU9OX1BSRUZJWCA9ICIvdGVzdCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdTRExfQkFTRV9ESVIgPQotICAgICAgICAgICAgU3lzdGVtLmdldFByb3BlcnR5KCJiYXNlZGlyIiwgIi4iKSArICIvdGVzdC1yZXNvdXJjZXMvd3NkbC8iOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCSU5ESU5HX0JBU0VfRElSID0KLSAgICAgICAgICAgIFN5c3RlbS5nZXRQcm9wZXJ0eSgiYmFzZWRpciIsICIuIikgKyAiL3Rlc3QtcmVzb3VyY2VzL2JpbmRpbmcvIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVQT1NJVE9SWV9ESVIgPQotICAgICAgICAgICAgU3lzdGVtLmdldFByb3BlcnR5KCJiYXNlZGlyIiwgIi4iKSArICIvdGVzdC1yZXNvdXJjZXMvcmVwby8iOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU0VTX0RJUiA9Ci0gICAgICAgICAgICBTeXN0ZW0uZ2V0UHJvcGVydHkoImJhc2VkaXIiLCAiLiIpICsgIi90YXJnZXQvY2xhc3Nlcy8iOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIG1vZHVsZU5hbWVzID0geyAia2VybmVsIiwgImNvcmUiIH07Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1PRFVMRV9QQVRIX1BSRUZJWCA9ICIuLi9tb2R1bGVzLyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBJTEVfVEFSR0VUX05BTUUgPSAiY29tcGlsZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUVUJfQ0xBU1MgPQotICAgICAgICAgICAgIm9yZy5hcGFjaGUud3MuYXhpczIuamlieC5jdXN0b21lci53c2RsLkVjaG9DdXN0b21lclNlcnZpY2VTdHViIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgc2VydmljZU5hbWUgPSBuZXcgUU5hbWUoIkVjaG9DdXN0b21lclNlcnZpY2UiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIG9wZXJhdGlvbk5hbWUgPSBuZXcgUU5hbWUoImVjaG8iKTsKLQotICAgIHByaXZhdGUgQXhpc1NlcnZpY2Ugc2VydmljZTsKLQotICAgIC8qKgotICAgICAqIE1ha2UgdGhlIHJvb3Qgb3V0cHV0IGRpcmVjdG9yeQotICAgICAqCi0gICAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBGaWxlIG91dHB1dEZpbGUgPSBuZXcgRmlsZShPVVRQVVRfTE9DQVRJT05fQkFTRSk7Ci0gICAgICAgIGlmIChvdXRwdXRGaWxlLmV4aXN0cygpICYmIG91dHB1dEZpbGUuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgZGVsZXRlRGlyKG91dHB1dEZpbGUpOwotICAgICAgICAgICAgb3V0cHV0RmlsZS5ta2RpcigpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgb3V0cHV0RmlsZS5ta2RpcigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHN0YXJ0U2VydmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHNlcnZpY2UgPSBVdGlscy5jcmVhdGVTaW1wbGVTZXJ2aWNlKHNlcnZpY2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFY2hvLmNsYXNzLmdldE5hbWUoKSwgb3BlcmF0aW9uTmFtZSk7Ci0gICAgICAgIFV0aWxTZXJ2ZXIuc3RhcnQoUkVQT1NJVE9SWV9ESVIpOwotICAgICAgICBVdGlsU2VydmVyLmRlcGxveVNlcnZpY2Uoc2VydmljZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGVsZXRlcyBhbGwgZmlsZXMgYW5kIHN1YmRpcmVjdG9yaWVzIHVuZGVyIGRpci4gUmV0dXJucyB0cnVlIGlmIGFsbCBkZWxldGlvbnMgd2VyZQotICAgICAqIHN1Y2Nlc3NmdWwuIElmIGEgZGVsZXRpb24gZmFpbHMsIHRoZSBtZXRob2Qgc3RvcHMgYXR0ZW1wdGluZyB0byBkZWxldGUgYW5kIHJldHVybnMgZmFsc2UuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGRlbGV0ZURpcihGaWxlIGRpcikgewotICAgICAgICBpZiAoZGlyLmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgIFN0cmluZ1tdIGNoaWxkcmVuID0gZGlyLmxpc3QoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSBkZWxldGVEaXIobmV3IEZpbGUoZGlyLCBjaGlsZHJlbltpXSkpOwotICAgICAgICAgICAgICAgIGlmICghc3VjY2VzcykgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVGhlIGRpcmVjdG9yeSBpcyBub3cgZW1wdHkgc28gZGVsZXRlIGl0Ci0gICAgICAgIHJldHVybiBkaXIuZGVsZXRlKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHN0b3BTZXJ2ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgVXRpbFNlcnZlci51bkRlcGxveVNlcnZpY2Uoc2VydmljZU5hbWUpOwotICAgICAgICBVdGlsU2VydmVyLnN0b3AoKTsKLS8qICAgICAgICBGaWxlIG91dHB1dEZpbGUgPSBuZXcgRmlsZShPVVRQVVRfTE9DQVRJT05fQkFTRSk7Ci0gICAgICAgIGlmIChvdXRwdXRGaWxlLmV4aXN0cygpICYmIG91dHB1dEZpbGUuaXNEaXJlY3RvcnkoKSl7Ci0gICAgICAgICAgICBkZWxldGVEaXIob3V0cHV0RmlsZSk7Ci0gICAgICAgIH0gICAqLwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhhbmRsZSBsaW5rYWdlIGNvZGUgZ2VuZXJhdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSB3c2RsCi0gICAgICogQHBhcmFtIGJpbmRpbmcKLSAgICAgKiBAcGFyYW0gb3V0ZGlyCi0gICAgICogQHBhcmFtIHVud3JhcAotICAgICAqIEB0aHJvd3MgQ29kZUdlbmVyYXRpb25FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY29kZUdlbmVyYXRlKFN0cmluZyB3c2RsLCBTdHJpbmcgYmluZGluZywgU3RyaW5nIG91dGRpciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gdW53cmFwKSB0aHJvd3MgQ29kZUdlbmVyYXRpb25FeGNlcHRpb24gewotCi0gICAgICAgIC8vIGNyZWF0ZSB0aGUgb3B0aW9uIG1hcAotICAgICAgICBNYXAgb3B0aW9uTWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgb3B0aW9uTWFwLnB1dChDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuV1NETF9MT0NBVElPTl9VUklfT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICAgIG5ldyBDb21tYW5kTGluZU9wdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5XU0RMX0xPQ0FUSU9OX1VSSV9PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyB3c2RsIH0pKTsKLQotICAgICAgICAvL3VzZSBkZWZhdWx0IHN5bmMgb3B0aW9uIC0gTm8gb3B0aW9uIGlzIGdpdmVuCi0gICAgICAgIC8vdXNlIGRlZmF1bHQgYXN5bmMgb3B0aW9uIC0gTm8gb3B0aW9uIGlzIGdpdmVuCi0gICAgICAgIC8vdXNlIGRlZmF1bHQgbGFuZ3VhZ2Ugb3B0aW9uIC0gTm8gb3B0aW9uIGlzIGdpdmVuCi0KLSAgICAgICAgLy8gb3V0cHV0IGxvY2F0aW9uCi0gICAgICAgIG9wdGlvbk1hcC5wdXQoQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLk9VVFBVVF9MT0NBVElPTl9PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgbmV3IENvbW1hbmRMaW5lT3B0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLk9VVFBVVF9MT0NBVElPTl9PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyBvdXRkaXIgfSkpOwotCi0gICAgICAgIC8vIGRiIGlzIEppQlgKLSAgICAgICAgb3B0aW9uTWFwLnB1dChDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuREFUQV9CSU5ESU5HX1RZUEVfT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICAgIG5ldyBDb21tYW5kTGluZU9wdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5EQVRBX0JJTkRJTkdfVFlQRV9PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyAiamlieCIgfSkpOwotCi0gICAgICAgIC8vIHVud3JhcCBpZiByZXF1ZXN0ZWQKLSAgICAgICAgaWYgKHVud3JhcCkgewotICAgICAgICAgICAgb3B0aW9uTWFwLnB1dChDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuVU5XUkFQX1BBUkFNRVRFUlMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDb21tYW5kTGluZU9wdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuVU5XUkFQX1BBUkFNRVRFUlMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1swXSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gYmluZGluZyBkZWZpbml0aW9uIGlzIHN1cHBsaWVkCi0gICAgICAgIFN0cmluZyBvcHRpb24gPSBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuRVhUUkFfT1BUSU9OVFlQRV9QUkVGSVggKwotICAgICAgICAgICAgICAgIEppQlhFeHRlbnNpb24uQklORElOR19QQVRIX09QVElPTjsKLSAgICAgICAgb3B0aW9uTWFwLnB1dChvcHRpb24sIG5ldyBDb21tYW5kTGluZU9wdGlvbihvcHRpb24sIG5ldyBTdHJpbmdbXSB7IGJpbmRpbmcgfSkpOwotCi0gICAgICAgIC8vVE9ETzogTWFrZSB0aGlzIHdvcmsKLSAgICAgICAgLy90ZXN0IGNhc2Ugb3B0aW9uIGlzIG9uCi0vLyAgICAgICAgb3B0aW9uTWFwLnB1dCgKLS8vICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLkdFTkVSQVRFX1RFU1RfQ0FTRV9PUFRJT04sCi0vLyAgICAgICAgICAgICAgICBuZXcgQ29tbWFuZExpbmVPcHRpb24oCi0vLyAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLkdFTkVSQVRFX1RFU1RfQ0FTRV9PUFRJT04sCi0vLyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbMF0pKTsKLSAgICAgICAgQ29tbWFuZExpbmVPcHRpb25QYXJzZXIgcGFyc2VyID0gbmV3IENvbW1hbmRMaW5lT3B0aW9uUGFyc2VyKG9wdGlvbk1hcCk7Ci0gICAgICAgIG5ldyBDb2RlR2VuZXJhdGlvbkVuZ2luZShwYXJzZXIpLmdlbmVyYXRlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29tcGlsZSBnZW5lcmF0ZWQgY29kZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvdXRkaXIKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY29tcGlsZShTdHJpbmcgb3V0ZGlyKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIGNwID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKAotICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZVJlYWRlcihTeXN0ZW0uZ2V0UHJvcGVydHkoImJhc2VkaXIiLCAiLiIpICsgIi90YXJnZXQvY3AudHh0IikpOwotICAgICAgICAgICAgY3AgPSBici5yZWFkTGluZSgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gRG9uJ3QgY2FyZQotICAgICAgICB9Ci0gICAgICAgIGlmIChjcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBjcCA9ICIiOwotICAgICAgICB9Ci0KLSAgICAgICAgLy91c2luZyB0aGUgYW50IGphdmFjIHRhc2sgZm9yIGNvbXBpbGF0aW9uCi0gICAgICAgIEphdmFjIGphdmFDb21waWxlciA9IG5ldyBKYXZhYygpOwotICAgICAgICBQcm9qZWN0IGNvZGVHZW5Qcm9qZWN0ID0gbmV3IFByb2plY3QoKTsKLSAgICAgICAgVGFyZ2V0IGNvbXBpbGVUYXJnZXQgPSBuZXcgVGFyZ2V0KCk7Ci0KLSAgICAgICAgY29tcGlsZVRhcmdldC5zZXROYW1lKENPTVBJTEVfVEFSR0VUX05BTUUpOwotICAgICAgICBjb21waWxlVGFyZ2V0LmFkZFRhc2soamF2YUNvbXBpbGVyKTsKLSAgICAgICAgY29kZUdlblByb2plY3QuYWRkVGFyZ2V0KGNvbXBpbGVUYXJnZXQpOwotICAgICAgICBjb2RlR2VuUHJvamVjdC5zZXRTeXN0ZW1Qcm9wZXJ0aWVzKCk7Ci0gICAgICAgIGphdmFDb21waWxlci5zZXRQcm9qZWN0KGNvZGVHZW5Qcm9qZWN0KTsKLSAgICAgICAgamF2YUNvbXBpbGVyLnNldEluY2x1ZGVqYXZhcnVudGltZSh0cnVlKTsKLSAgICAgICAgamF2YUNvbXBpbGVyLnNldEluY2x1ZGVhbnRydW50aW1lKHRydWUpOwotCi0gICAgICAgIC8qCi0gICAgICAgICAgVGhpcyBoYXJtbGVzcyBsb29raW5nIHNldEZvcmsgaXMgYWN0dWFsbHkgdmVyeSBpbXBvcnRhbnQuIHVubGVzcyB0aGUgY29tcGlsZXIgaXMKLSAgICAgICAgICBmb3JrZWQgaXQgd29udCB3b3JrIQotICAgICAgICAqLwotICAgICAgICBqYXZhQ29tcGlsZXIuc2V0Rm9yayh0cnVlKTsKLQotICAgICAgICAvL0NyZWF0ZSBjbGFzc3BhdGggLSBUaGUgZ2VuZXJhdGVkIG91dHB1dCBkaXJlY3RvcmllcyBhbHNvIGJlY29tZSBwYXJ0IG9mIHRoZSBjbGFzc3BhdGgKLSAgICAgICAgLy9yZWFzb24gZm9yIHRoaXMgaXMgdGhhdCBzb21lIGNvZGVnZW5lcmF0b3JzKFhNTEJlYW5zKSBwcm9kdWNlIGNvbXBpbGVkIGNsYXNzZXMgYXMgcGFydCBvZgotICAgICAgICAvL2dlbmVyYXRlZCBhcnRpZmFjdHMKLSAgICAgICAgU3RyaW5nIGNsYXNzZGlyID0gb3V0ZGlyICsgIi9jbGFzc2VzIjsKLSAgICAgICAgRmlsZSBvdXRwdXRMb2NhdGlvbkZpbGUgPSBuZXcgRmlsZShjbGFzc2Rpcik7Ci0gICAgICAgIG91dHB1dExvY2F0aW9uRmlsZS5ta2RpcigpOwotICAgICAgICBQYXRoIGNsYXNzUGF0aCA9IG5ldyBQYXRoKGNvZGVHZW5Qcm9qZWN0LCBjbGFzc2Rpcik7Ci0gICAgICAgIGNsYXNzUGF0aC5hZGQobmV3IFBhdGgoY29kZUdlblByb2plY3QsIFRFU1RfQ0xBU1NFU19ESVIpKTsKLSAgICAgICAgY2xhc3NQYXRoLmFkZEV4aXN0aW5nKGNsYXNzUGF0aC5jb25jYXRTeXN0ZW1DbGFzc3BhdGgoKSwgZmFsc2UpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1vZHVsZU5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBjbGFzc1BhdGguYWRkKG5ldyBQYXRoKGNvZGVHZW5Qcm9qZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNT0RVTEVfUEFUSF9QUkVGSVggKyBtb2R1bGVOYW1lc1tpXSArIENMQVNTRVNfRElSKSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2xhc3NQYXRoLmFkZChuZXcgUGF0aChjb2RlR2VuUHJvamVjdCwgY3ApKTsKLQotICAgICAgICBqYXZhQ29tcGlsZXIuc2V0Q2xhc3NwYXRoKGNsYXNzUGF0aCk7Ci0KLSAgICAgICAgLy9zZXQgc291cmNlUGF0aCAtIFRoZSBnZW5lcmF0ZWQgb3V0cHV0IGRpcmVjdG9yaWVzIGFsc28gYmVjb21lIHBhcnQgb2YgdGhlIHNvdXJjZXBhdGgKLSAgICAgICAgUGF0aCBzb3VyY2VQYXRoID0gbmV3IFBhdGgoY29kZUdlblByb2plY3QsIG91dGRpcik7Ci0gICAgICAgIHNvdXJjZVBhdGguc2V0TG9jYXRpb24ob3V0cHV0TG9jYXRpb25GaWxlKTsKLSAgICAgICAgamF2YUNvbXBpbGVyLnNldFNyY2Rpcihzb3VyY2VQYXRoKTsKLQotICAgICAgICAvL291dHB1dCB0aGUgY2xhc3NlcyBpbnRvIHRoZSBvdXRwdXQgZGlyIGFzIHdlbGwKLSAgICAgICAgamF2YUNvbXBpbGVyLnNldERlc3RkaXIob3V0cHV0TG9jYXRpb25GaWxlKTsKLSAgICAgICAgamF2YUNvbXBpbGVyLnNldERlYnVnKHRydWUpOwotICAgICAgICBqYXZhQ29tcGlsZXIuc2V0VmVyYm9zZSh0cnVlKTsKLSAgICAgICAgamF2YUNvbXBpbGVyLmV4ZWN1dGUoKTsKLS8vICAgICAgICBjb2RlR2VuUHJvamVjdC5leGVjdXRlVGFyZ2V0KENPTVBJTEVfVEFSR0VUX05BTUUpOwotICAgIH0KLQotLyogICAgcHVibGljIHZvaWQgdGVzdEJ1aWxkQW5kUnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN0YXJ0U2VydmVyKCk7Ci0KLSAgICAgICAgLy8gc3RhcnQgYnkgZ2VuZXJhdGluZyBhbmQgY29tcGlsaW5nIHRoZSBBeGlzMiBpbnRlcmZhY2UgY29kZQotICAgICAgICBTdHJpbmcgb3V0ZGlyID0KLSAgICAgICAgICAgICAgICBPVVRQVVRfTE9DQVRJT05fQkFTRSArIE9VVFBVVF9MT0NBVElPTl9QUkVGSVg7Ci0gICAgICAgIGNvZGVHZW5lcmF0ZShXU0RMX0JBU0VfRElSICsgImN1c3RvbWVyLWVjaG8ud3NkbCIsCi0gICAgICAgICAgICAgICAgICAgICBCSU5ESU5HX0JBU0VfRElSICsgImN1c3RvbWVyLWJpbmRpbmcueG1sIiwgb3V0ZGlyLCBmYWxzZSk7Ci0gICAgICAgIGNvbXBpbGUob3V0ZGlyKTsKLQotLy8gICAgICAgICBmaW5pc2ggYnkgdGVzdGluZyBhIHJvdW5kdHJpcCBjYWxsIHRvIHRoZSBlY2hvIHNlcnZlcgotICAgICAgICBGaWxlIGNsYXNzZXNkaXIgPSBuZXcgRmlsZShvdXRkaXIgKyAiL2NsYXNzZXMvIik7Ci0gICAgICAgIFVSTENsYXNzTG9hZGVyIGxvYWRlciA9IG5ldyBVUkxDbGFzc0xvYWRlcihuZXcgVVJMW10geyBjbGFzc2VzZGlyLnRvVVJMKCkgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpKTsKLSAgICAgICAgQ2xhc3Mgc3R1YiA9IGxvYWRlci5sb2FkQ2xhc3MoU1RVQl9DTEFTUyk7Ci0gICAgICAgIFBlcnNvbiBwZXJzb24gPSBuZXcgUGVyc29uKDQyLCAiSm9obiIsICJTbWl0aCIpOwotICAgICAgICBDdXN0b21lciBjdXN0b21lciA9IG5ldyBDdXN0b21lcigiUmVkbW9uZCIsIHBlcnNvbiwgIisxNDI1ODg1ODA4MCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXQSIsICIxNDYxOSBORSA4MHRoIFBsLiIsIG5ldyBJbnRlZ2VyKDk4MDUyKSk7Ci0gICAgICAgIENvbnN0cnVjdG9yIGNvbnN0cnVjdG9yID0gc3R1Yi5nZXRDb25zdHJ1Y3RvcihuZXcgQ2xhc3NbXSB7Ci0gICAgICAgICAgICAgICAgImh0dHA6Ly8xMjcuMC4wLjE6NTU1NS9heGlzMi9zZXJ2aWNlcy9FY2hvQ3VzdG9tZXJTZXJ2aWNlL2VjaG8iLmdldENsYXNzKCkgfSk7Ci0gICAgICAgIE9iamVjdCBpbnN0ID0gY29uc3RydWN0b3IubmV3SW5zdGFuY2UoCi0gICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsgImh0dHA6Ly8xMjcuMC4wLjE6NTU1NS9heGlzMi9zZXJ2aWNlcy9FY2hvQ3VzdG9tZXJTZXJ2aWNlL2VjaG8iIH0pOwotICAgICAgICBNZXRob2QgbWV0aG9kID0gc3R1Yi5nZXRNZXRob2QoImVjaG8iLCBuZXcgQ2xhc3NbXSB7IEN1c3RvbWVyLmNsYXNzIH0pOwotICAgICAgICBPYmplY3QgcmVzdWx0ID0gbWV0aG9kLmludm9rZShpbnN0LCBuZXcgT2JqZWN0W10geyBjdXN0b21lciB9KTsKLSAgICAgICAgc3RvcFNlcnZlcigpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlJlc3VsdCBvYmplY3QgZG9lcyBub3QgbWF0Y2ggcmVxdWVzdCBvYmplY3QiLAotICAgICAgICAgICAgICAgICAgICAgY3VzdG9tZXIsIHJlc3VsdCk7Ci0gICAgfSAgICovCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcGlsZVdyYXBwZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICAvLyBnZW5lcmF0ZSBhbmQgY29tcGlsZSB0aGUgQXhpczIgaW50ZXJmYWNlIGNvZGUKLSAgICAgICAgU3RyaW5nIG91dGRpciA9IE9VVFBVVF9MT0NBVElPTl9CQVNFICsgT1VUUFVUX0xPQ0FUSU9OX1BSRUZJWDsKLSAgICAgICAgY29kZUdlbmVyYXRlKFdTRExfQkFTRV9ESVIgKyAibGlicmFyeS53c2RsIiwKLSAgICAgICAgICAgICAgICAgICAgIEJJTkRJTkdfQkFTRV9ESVIgKyAibGlicmFyeS1iaW5kaW5nLnhtbCIsIG91dGRpciwgZmFsc2UpOwotICAgICAgICBjb21waWxlKG91dGRpcik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENvbXBpbGVVbndyYXBwZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICAvLyBnZW5lcmF0ZSBhbmQgY29tcGlsZSB0aGUgQXhpczIgaW50ZXJmYWNlIGNvZGUKLSAgICAgICAgU3RyaW5nIG91dGRpciA9IE9VVFBVVF9MT0NBVElPTl9CQVNFICsgT1VUUFVUX0xPQ0FUSU9OX1BSRUZJWDsKLSAgICAgICAgY29kZUdlbmVyYXRlKFdTRExfQkFTRV9ESVIgKyAibGlicmFyeS53c2RsIiwKLSAgICAgICAgICAgICAgICAgICAgIEJJTkRJTkdfQkFTRV9ESVIgKyAibGlicmFyeS1iaW5kaW5nLnhtbCIsIG91dGRpciwgdHJ1ZSk7Ci0gICAgICAgIGNvbXBpbGUob3V0ZGlyKTsKLSAgICB9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamlieC90ZXN0L29yZy9hcGFjaGUvYXhpczIvamlieC9VdGlsU2VydmVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qaWJ4L3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qaWJ4L1V0aWxTZXJ2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg1Nzk3My4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qaWJ4L3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qaWJ4L1V0aWxTZXJ2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamlieDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuTGlzdGVuZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuU2ltcGxlSFRUUFNlcnZlcjsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1wdWJsaWMgY2xhc3MgVXRpbFNlcnZlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IGNvdW50ID0gMDsKLQotICAgIHByaXZhdGUgc3RhdGljIFNpbXBsZUhUVFBTZXJ2ZXIgcmVjZWl2ZXI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBURVNUSU5HX1BPUlQgPSA1NTU1OwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFJTFVSRV9NRVNTQUdFID0gIkludGVudGlvbmFsIEZhaWx1cmUiOwotCi0KLSAgICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIGRlcGxveVNlcnZpY2UoQXhpc1NlcnZpY2Ugc2VydmljZSkKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICByZWNlaXZlci5nZXRDb25maWd1cmF0aW9uQ29udGV4dCgpLmdldEF4aXNDb25maWd1cmF0aW9uKCkuYWRkU2VydmljZSgKLSAgICAgICAgICAgICAgICBzZXJ2aWNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIHVuRGVwbG95U2VydmljZShRTmFtZSBzZXJ2aWNlKQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIHJlY2VpdmVyLmdldENvbmZpZ3VyYXRpb25Db250ZXh0KCkuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKQotICAgICAgICAgICAgICAgIC5yZW1vdmVTZXJ2aWNlKHNlcnZpY2UuZ2V0TG9jYWxQYXJ0KCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgc3RhcnQoU3RyaW5nIHJlcG9zaXRvcnkpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoY291bnQgPT0gMCkgewotICAgICAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHQgZXIgPSBnZXROZXdDb25maWd1cmF0aW9uQ29udGV4dChyZXBvc2l0b3J5KTsKLQotICAgICAgICAgICAgcmVjZWl2ZXIgPSBuZXcgU2ltcGxlSFRUUFNlcnZlcihlciwgVEVTVElOR19QT1JUKTsKLQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByZWNlaXZlci5zdGFydCgpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIlNlcnZlciBzdGFydGVkIG9uIHBvcnQgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBURVNUSU5HX1BPUlQgKyAiLi4uLi4iKTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMjAwMCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlMSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoIlRocmVhZCBpbnRlcnVwdHRlZCIsIGUxKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICAgIGNvdW50Kys7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdGFydChTdHJpbmcgcmVwb3NpdG9yeSwgU3RyaW5nIGF4aXMyeG1sKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGNvdW50ID09IDApIHsKLSAgICAgICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGVyID0gZ2V0TmV3Q29uZmlndXJhdGlvbkNvbnRleHQocmVwb3NpdG9yeSwgYXhpczJ4bWwpOwotCi0gICAgICAgICAgICByZWNlaXZlciA9IG5ldyBTaW1wbGVIVFRQU2VydmVyKGVyLCBURVNUSU5HX1BPUlQpOwotCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHJlY2VpdmVyLnN0YXJ0KCk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiU2VydmVyIHN0YXJ0ZWQgb24gcG9ydCAiCi0gICAgICAgICAgICAgICAgICAgICAgICArIFRFU1RJTkdfUE9SVCArICIuLi4uLiIpOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgyMDAwKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUxKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiVGhyZWFkIGludGVydXB0dGVkIiwgZTEpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgICAgY291bnQrKzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIENvbmZpZ3VyYXRpb25Db250ZXh0IGdldE5ld0NvbmZpZ3VyYXRpb25Db250ZXh0KAotICAgICAgICAgICAgU3RyaW5nIHJlcG9zaXRvcnkpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShyZXBvc2l0b3J5KTsKLSAgICAgICAgaWYgKCFmaWxlLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJyZXBvc2l0b3J5IGRpcmVjdG9yeSAiCi0gICAgICAgICAgICAgICAgICAgICsgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSArICIgZG9lcyBub3QgZXhpc3RzIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIENvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeQotICAgICAgICAgICAgICAgIC5jcmVhdGVDb25maWd1cmF0aW9uQ29udGV4dEZyb21GaWxlU3lzdGVtKGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiL2NvbmYvYXhpczIueG1sIik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBDb25maWd1cmF0aW9uQ29udGV4dCBnZXROZXdDb25maWd1cmF0aW9uQ29udGV4dCgKLSAgICAgICAgICAgIFN0cmluZyByZXBvc2l0b3J5LCBTdHJpbmcgYXhpczJ4bWwpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShyZXBvc2l0b3J5KTsKLSAgICAgICAgaWYgKCFmaWxlLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJyZXBvc2l0b3J5IGRpcmVjdG9yeSAiCi0gICAgICAgICAgICAgICAgICAgICsgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSArICIgZG9lcyBub3QgZXhpc3RzIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIENvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeQotICAgICAgICAgICAgICAgIC5jcmVhdGVDb25maWd1cmF0aW9uQ29udGV4dEZyb21GaWxlU3lzdGVtKGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpczJ4bWwpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgc3RvcCgpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBpZiAoY291bnQgPT0gMSkgewotICAgICAgICAgICAgcmVjZWl2ZXIuc3RvcCgpOwotICAgICAgICAgICAgd2hpbGUgKHJlY2VpdmVyLmlzUnVubmluZygpKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDApOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUxKSB7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgY291bnQgPSAwOwotICAgICAgICAgICAgLy8gdHAuZG9TdG9wKCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJTZXJ2ZXIgc3RvcHBlZCAuLi4uLiIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY291bnQtLTsKLSAgICAgICAgfQotICAgICAgICBMaXN0ZW5lck1hbmFnZXIgbGlzdGVuZXJNYW5hZ2VyID0KLSAgICAgICAgICAgICAgICByZWNlaXZlci5nZXRDb25maWd1cmF0aW9uQ29udGV4dCgpLmdldExpc3RlbmVyTWFuYWdlcigpOwotICAgICAgICBpZiAobGlzdGVuZXJNYW5hZ2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGxpc3RlbmVyTWFuYWdlci5zdG9wKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIENvbmZpZ3VyYXRpb25Db250ZXh0IGdldENvbmZpZ3VyYXRpb25Db250ZXh0KCkgewotICAgICAgICByZXR1cm4gcmVjZWl2ZXIuZ2V0Q29uZmlndXJhdGlvbkNvbnRleHQoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ppYngvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2ppYngvYmVhbnMvQm9vay5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamlieC90ZXN0L29yZy9hcGFjaGUvYXhpczIvamlieC9iZWFucy9Cb29rLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzODIwZGEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamlieC90ZXN0L29yZy9hcGFjaGUvYXhpczIvamlieC9iZWFucy9Cb29rLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamlieC5iZWFuczsKLQotcHVibGljIGNsYXNzIEJvb2sgewotICAgIHByaXZhdGUgU3RyaW5nIG1fdHlwZTsKLSAgICBwcml2YXRlIFN0cmluZyBtX2lzYm47Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbV90aXRsZTsKLSAgICBwcml2YXRlIFN0cmluZ1tdIG1fYXV0aG9yczsKLQotICAgIHB1YmxpYyBCb29rKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBCb29rKFN0cmluZyB0eXBlLCBTdHJpbmcgaXNibiwgU3RyaW5nIHRpdGxlLCBTdHJpbmdbXSBhdXRob3JzKSB7Ci0gICAgICAgIG1faXNibiA9IGlzYm47Ci0gICAgICAgIG1fdGl0bGUgPSB0aXRsZTsKLSAgICAgICAgbV90eXBlID0gdHlwZTsKLSAgICAgICAgbV9hdXRob3JzID0gYXV0aG9yczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBtX3R5cGU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRJc2JuKCkgewotICAgICAgICByZXR1cm4gbV9pc2JuOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGl0bGUoKSB7Ci0gICAgICAgIHJldHVybiBtX3RpdGxlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRBdXRob3JzKCkgewotICAgICAgICByZXR1cm4gbV9hdXRob3JzOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qaWJ4L3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qaWJ4L2JlYW5zL1R5cGUuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2ppYngvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2ppYngvYmVhbnMvVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDNlZWM4Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ppYngvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2ppYngvYmVhbnMvVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmppYnguYmVhbnM7Ci0KLXB1YmxpYyBjbGFzcyBUeXBlIHsKLSAgICBwcml2YXRlIFN0cmluZyBtX25hbWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbV9kZXNjcmlwdGlvbjsKLSAgICBwcml2YXRlIGludCBtX2NvdW50OwotCi0gICAgcHVibGljIFR5cGUoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIFR5cGUoU3RyaW5nIG5hbWUsIFN0cmluZyBkZXNjcmlwdGlvbikgewotICAgICAgICBtX25hbWUgPSBuYW1lOwotICAgICAgICBtX2Rlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gbV9uYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0gICAgICAgIHJldHVybiBtX2Rlc2NyaXB0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0Q291bnQoKSB7Ci0gICAgICAgIHJldHVybiBtX2NvdW50OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENvdW50KGludCBjb3VudCkgewotICAgICAgICBtX2NvdW50ID0gY291bnQ7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ppYngvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2ppYngvd3JhcHBlcnMvQWRkQm9va0luc3RhbmNlUmVxdWVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamlieC90ZXN0L29yZy9hcGFjaGUvYXhpczIvamlieC93cmFwcGVycy9BZGRCb29rSW5zdGFuY2VSZXF1ZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmNmM3OTIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamlieC90ZXN0L29yZy9hcGFjaGUvYXhpczIvamlieC93cmFwcGVycy9BZGRCb29rSW5zdGFuY2VSZXF1ZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamlieC53cmFwcGVyczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamlieC5iZWFucy5Cb29rOwotCi1wdWJsaWMgY2xhc3MgQWRkQm9va0luc3RhbmNlUmVxdWVzdCB7Ci0gICAgcHJpdmF0ZSBCb29rIG1fYm9vazsKLQotICAgIHB1YmxpYyBBZGRCb29rSW5zdGFuY2VSZXF1ZXN0KEJvb2sgYm9vaykgewotICAgICAgICBtX2Jvb2sgPSBib29rOwotICAgIH0KLQotICAgIHB1YmxpYyBCb29rIGdldEJvb2soKSB7Ci0gICAgICAgIHJldHVybiBtX2Jvb2s7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ppYngvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2ppYngvd3JhcHBlcnMvQWRkQm9va0luc3RhbmNlUmVzcG9uc2UuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2ppYngvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2ppYngvd3JhcHBlcnMvQWRkQm9va0luc3RhbmNlUmVzcG9uc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDUyM2ZhNC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qaWJ4L3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qaWJ4L3dyYXBwZXJzL0FkZEJvb2tJbnN0YW5jZVJlc3BvbnNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamlieC53cmFwcGVyczsKLQotcHVibGljIGNsYXNzIEFkZEJvb2tJbnN0YW5jZVJlc3BvbnNlIHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qaWJ4L3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qaWJ4L3dyYXBwZXJzL0FkZEJvb2tSZXF1ZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qaWJ4L3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qaWJ4L3dyYXBwZXJzL0FkZEJvb2tSZXF1ZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyN2E3MTIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamlieC90ZXN0L29yZy9hcGFjaGUvYXhpczIvamlieC93cmFwcGVycy9BZGRCb29rUmVxdWVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmppYngud3JhcHBlcnM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmppYnguYmVhbnMuQm9vazsKLQotcHVibGljIGNsYXNzIEFkZEJvb2tSZXF1ZXN0IHsKLSAgICBwcml2YXRlIEJvb2sgbV9ib29rOwotCi0gICAgcHVibGljIEFkZEJvb2tSZXF1ZXN0KEJvb2sgYm9vaykgewotICAgICAgICBtX2Jvb2sgPSBib29rOwotICAgIH0KLQotICAgIHB1YmxpYyBCb29rIGdldEJvb2soKSB7Ci0gICAgICAgIHJldHVybiBtX2Jvb2s7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ppYngvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2ppYngvd3JhcHBlcnMvQWRkQm9va1Jlc3BvbnNlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qaWJ4L3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qaWJ4L3dyYXBwZXJzL0FkZEJvb2tSZXNwb25zZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2Q5MDkxLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ppYngvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2ppYngvd3JhcHBlcnMvQWRkQm9va1Jlc3BvbnNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamlieC53cmFwcGVyczsKLQotcHVibGljIGNsYXNzIEFkZEJvb2tSZXNwb25zZSB7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1fc3VjY2VzczsKLQotICAgIHB1YmxpYyB2b2lkIHNldFN1Y2Nlc3MoYm9vbGVhbiBzdWNjZXNzKSB7Ci0gICAgICAgIG1fc3VjY2VzcyA9IHN1Y2Nlc3M7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNTdWNjZXNzKCkgewotICAgICAgICByZXR1cm4gbV9zdWNjZXNzOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qaWJ4L3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qaWJ4L3dyYXBwZXJzL0dldEJvb2tSZXF1ZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qaWJ4L3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qaWJ4L3dyYXBwZXJzL0dldEJvb2tSZXF1ZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyYmZmZWEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamlieC90ZXN0L29yZy9hcGFjaGUvYXhpczIvamlieC93cmFwcGVycy9HZXRCb29rUmVxdWVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmppYngud3JhcHBlcnM7Ci0KLXB1YmxpYyBjbGFzcyBHZXRCb29rUmVxdWVzdCB7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbV9pc2JuOwotCi0gICAgcHVibGljIEdldEJvb2tSZXF1ZXN0KFN0cmluZyBpc2JuKSB7Ci0gICAgICAgIG1faXNibiA9IGlzYm47Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRJc2JuKCkgewotICAgICAgICByZXR1cm4gbV9pc2JuOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qaWJ4L3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qaWJ4L3dyYXBwZXJzL0dldEJvb2tSZXNwb25zZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamlieC90ZXN0L29yZy9hcGFjaGUvYXhpczIvamlieC93cmFwcGVycy9HZXRCb29rUmVzcG9uc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk3Y2JjZC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qaWJ4L3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qaWJ4L3dyYXBwZXJzL0dldEJvb2tSZXNwb25zZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmppYngud3JhcHBlcnM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmppYnguYmVhbnMuQm9vazsKLQotcHVibGljIGNsYXNzIEdldEJvb2tSZXNwb25zZSB7Ci0gICAgcHJpdmF0ZSBCb29rIG1fYm9vazsKLQotICAgIHB1YmxpYyBHZXRCb29rUmVzcG9uc2UoQm9vayBib29rKSB7Ci0gICAgICAgIG1fYm9vayA9IGJvb2s7Ci0gICAgfQotCi0gICAgcHVibGljIEJvb2sgZ2V0Qm9vaygpIHsKLSAgICAgICAgcmV0dXJuIG1fYm9vazsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvamlieC90ZXN0L29yZy9hcGFjaGUvYXhpczIvamlieC93cmFwcGVycy9HZXRCb29rc0J5VHlwZVJlcXVlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2ppYngvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2ppYngvd3JhcHBlcnMvR2V0Qm9va3NCeVR5cGVSZXF1ZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyMDI5MGQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamlieC90ZXN0L29yZy9hcGFjaGUvYXhpczIvamlieC93cmFwcGVycy9HZXRCb29rc0J5VHlwZVJlcXVlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qaWJ4LndyYXBwZXJzOwotCi1wdWJsaWMgY2xhc3MgR2V0Qm9va3NCeVR5cGVSZXF1ZXN0IHsKLSAgICBwcml2YXRlIFN0cmluZyBtX3R5cGU7Ci0KLSAgICBwdWJsaWMgR2V0Qm9va3NCeVR5cGVSZXF1ZXN0KFN0cmluZyB0eXBlKSB7Ci0gICAgICAgIG1fdHlwZSA9IHR5cGU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotICAgICAgICByZXR1cm4gbV90eXBlOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qaWJ4L3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qaWJ4L3dyYXBwZXJzL0dldEJvb2tzQnlUeXBlUmVzcG9uc2UuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2ppYngvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2ppYngvd3JhcHBlcnMvR2V0Qm9va3NCeVR5cGVSZXNwb25zZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDE5YTIzLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2ppYngvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2ppYngvd3JhcHBlcnMvR2V0Qm9va3NCeVR5cGVSZXNwb25zZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmppYngud3JhcHBlcnM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmppYnguYmVhbnMuQm9vazsKLQotcHVibGljIGNsYXNzIEdldEJvb2tzQnlUeXBlUmVzcG9uc2UgewotICAgIHByaXZhdGUgQm9va1tdIG1fYm9va3M7Ci0KLSAgICBwdWJsaWMgR2V0Qm9va3NCeVR5cGVSZXNwb25zZShCb29rW10gYm9va3MpIHsKLSAgICAgICAgbV9ib29rcyA9IGJvb2tzOwotICAgIH0KLQotICAgIHB1YmxpYyBCb29rW10gZ2V0Qm9va3MoKSB7Ci0gICAgICAgIHJldHVybiBtX2Jvb2tzOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qaWJ4L3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qaWJ4L3dyYXBwZXJzL0dldFR5cGVzUmVxdWVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamlieC90ZXN0L29yZy9hcGFjaGUvYXhpczIvamlieC93cmFwcGVycy9HZXRUeXBlc1JlcXVlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ1NWFmOC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qaWJ4L3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qaWJ4L3dyYXBwZXJzL0dldFR5cGVzUmVxdWVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmppYngud3JhcHBlcnM7Ci0KLXB1YmxpYyBjbGFzcyBHZXRUeXBlc1JlcXVlc3QgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2ppYngvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2ppYngvd3JhcHBlcnMvR2V0VHlwZXNSZXNwb25zZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvamlieC90ZXN0L29yZy9hcGFjaGUvYXhpczIvamlieC93cmFwcGVycy9HZXRUeXBlc1Jlc3BvbnNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwZjgxMjIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvamlieC90ZXN0L29yZy9hcGFjaGUvYXhpczIvamlieC93cmFwcGVycy9HZXRUeXBlc1Jlc3BvbnNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamlieC53cmFwcGVyczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamlieC5iZWFucy5UeXBlOwotCi1wdWJsaWMgY2xhc3MgR2V0VHlwZXNSZXNwb25zZSB7Ci0gICAgcHJpdmF0ZSBUeXBlW10gbV90eXBlczsKLQotICAgIHB1YmxpYyBHZXRUeXBlc1Jlc3BvbnNlKFR5cGVbXSB0eXBlcykgewotICAgICAgICBtX3R5cGVzID0gdHlwZXM7Ci0gICAgfQotCi0gICAgcHVibGljIFR5cGVbXSBnZXRUeXBlcygpIHsKLSAgICAgICAgcmV0dXJuIG1fdHlwZXM7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pzb24vcG9tLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2pzb24vcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDgwZTEwNS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qc29uL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItcGFyZW50PC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4xLjUuMTwvdmVyc2lvbj4KLSAgICAgICAgPHJlbGF0aXZlUGF0aD4uLi9wYXJlbnQvcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgotICAgIDwvcGFyZW50PgotICAgIDxhcnRpZmFjdElkPmF4aXMyLWpzb248L2FydGlmYWN0SWQ+Ci0gICAgPG5hbWU+QXBhY2hlIEF4aXMyIC0gSlNPTjwvbmFtZT4KLSAgICA8ZGVzY3JpcHRpb24+QXhpczIgSlNPTiBtb2R1bGU8L2Rlc2NyaXB0aW9uPgotICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLWtlcm5lbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7dmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMuamV0dGlzb248L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXR0aXNvbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItdHJhbnNwb3J0LWh0dHA8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3ZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi10cmFuc3BvcnQtbG9jYWw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3ZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPC9kZXBlbmRlbmNpZXM+Ci0KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxzb3VyY2VEaXJlY3Rvcnk+c3JjPC9zb3VyY2VEaXJlY3Rvcnk+Ci0gICAgICAgIDx0ZXN0U291cmNlRGlyZWN0b3J5PnRlc3Q8L3Rlc3RTb3VyY2VEaXJlY3Rvcnk+Ci0gICAgICAgIDxyZXNvdXJjZXM+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT4uLi8uLjwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+Tk9USUNFLnR4dDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+TElDRU5TRS50eHQ8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgICAgICA8ZmlsdGVyaW5nPmZhbHNlPC9maWx0ZXJpbmc+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICA8L3Jlc291cmNlcz4KLSAgICAgICAgPHRlc3RSZXNvdXJjZXM+Ci0gICAgICAgICAgICA8dGVzdFJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+dGVzdC1yZXNvdXJjZXM8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgIDwvdGVzdFJlc291cmNlPgotICAgICAgICA8L3Rlc3RSZXNvdXJjZXM+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxza2lwPmZhbHNlPC9za2lwPgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgPC9idWlsZD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pzb24vc3JjL29yZy9hcGFjaGUvYXhpczIvanNvbi9KU09OQmFkZ2VyZmlzaERhdGFTb3VyY2UuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pzb24vc3JjL29yZy9hcGFjaGUvYXhpczIvanNvbi9KU09OQmFkZ2VyZmlzaERhdGFTb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWYzZTM1My4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qc29uL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pzb24vSlNPTkJhZGdlcmZpc2hEYXRhU291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuanNvbjsKLQotCi1pbXBvcnQgb3JnLmNvZGVoYXVzLmpldHRpc29uLmJhZGdlcmZpc2guQmFkZ2VyRmlzaFhNTElucHV0RmFjdG9yeTsKLWltcG9ydCBvcmcuY29kZWhhdXMuamV0dGlzb24uanNvbi5KU09OVG9rZW5lcjsKLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLS8qKgotICogSlNPTkRhdGFTb3VyY2Uga2VlcHMgdGhlIEpTT04gU3RyaW5nIGluc2lkZSBhbmQgY29uc3VtZXMgaXQgd2hlbiBuZWVkZWQuIFRoaXMgaXMgdG8gYmUga2VwdCBpbgotICogdGhlIE9NU291cmNlZEVsZW1lbnRJbXBsIGFuZCBjYW4gYmUgdXNlZCBlaXRoZXIgdG8gZXhwYW5kIHRoZSB0cmVlIG9yIGdldCB0aGUgSlNPTiBTdHJpbmcKLSAqIGRpcmVjdGx5IHdpdGhvdXQgZXhwYW5kaW5nLiBUaGlzIHVzZXMgdGhlICJCYWRnZXJmaXNoIiBKU09OIGNvbnZlbnRpb24uCi0gKi8KLQotcHVibGljIGNsYXNzIEpTT05CYWRnZXJmaXNoRGF0YVNvdXJjZSBleHRlbmRzIEpTT05EYXRhU291cmNlIHsKLQotICAgIHB1YmxpYyBKU09OQmFkZ2VyZmlzaERhdGFTb3VyY2UoSW5wdXRTdHJlYW0ganNvbklucHV0U3RyZWFtLCBTdHJpbmcgbG9jYWxOYW1lKSB7Ci0gICAgICAgIHN1cGVyKGpzb25JbnB1dFN0cmVhbSwgbG9jYWxOYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHaXZlcyB0aGUgU3RBWCByZWFkZXIgdXNpbmcgdGhlICJCYWRnZXJmaXNoIiBmb3JtYXR0ZWQgaW5wdXQgSlNPTiBTdHJpbmcuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBYTUxTdHJlYW1SZWFkZXIgYWNjb3JkaW5nIHRvIHRoZSBKU09OIFN0cmluZy4KLSAgICAgKiBAdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgaWYgdGhlcmUgaXMgYW4gZXJyb3Igd2hpbGUgbWFraW5nIHRoZSBTdEFYIHJlYWRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgZ2V0UmVhZGVyKCkgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAvL2lucHV0IGZhY3RvcnkgZm9yICJCYWRnZXJmaXNoIgotICAgICAgICBCYWRnZXJGaXNoWE1MSW5wdXRGYWN0b3J5IGlucHV0RmFjdG9yeSA9IG5ldyBCYWRnZXJGaXNoWE1MSW5wdXRGYWN0b3J5KCk7Ci0gICAgICAgIHJldHVybiBpbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKAotICAgICAgICAgICAgICAgIG5ldyBKU09OVG9rZW5lcigieyIgKyBsb2NhbE5hbWUgKyAiOiIgKyB0aGlzLmdldEpTT05TdHJpbmcoKSkpOwotCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvanNvbi9zcmMvb3JnL2FwYWNoZS9heGlzMi9qc29uL0pTT05CYWRnZXJmaXNoTWVzc2FnZUZvcm1hdHRlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvanNvbi9zcmMvb3JnL2FwYWNoZS9heGlzMi9qc29uL0pTT05CYWRnZXJmaXNoTWVzc2FnZUZvcm1hdHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDJhMWNiLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pzb24vc3JjL29yZy9hcGFjaGUvYXhpczIvanNvbi9KU09OQmFkZ2VyZmlzaE1lc3NhZ2VGb3JtYXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qc29uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTURhdGFTb3VyY2U7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmpldHRpc29uLmJhZGdlcmZpc2guQmFkZ2VyRmlzaFhNTFN0cmVhbVdyaXRlcjsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotCi0vKioKLSAqIFRoaXMgSlNPTkJhZGdlcmZpc2hNZXNzYWdlRm9ybWF0dGVyIGlzIHRoZSBmb3JtYXR0ZXIgZm9yICJCYWRnZXJmaXNoIiBmb3JtYXR0ZWQgSlNPTiBpbiBBeGlzMi4KLSAqIEVnOiAgJmx0O291dCZndDsmbHQ7aW4mZ3Q7bWFwcGVkIEpTT04mbHQ7L2luJmd0OyZsdDsvb3V0Jmd0OyBpcyBjb252ZXJ0ZWQgdG8uLi4KLSAqIHsib3V0Ijp7ImluIjp7IiQiOiJtYXBwZWQgSlNPTiJ9fX0gVGhpcyBjYW4gYmUgdXNlZCB3aGVuIHlvdSB3YW50IHRvIHNlbmQgbWVzc2FnZXMgd2l0aAotICogbmFtZXNwYWNlcyB3aXRoIEpTT04KLSAqLwotCi1wdWJsaWMgY2xhc3MgSlNPTkJhZGdlcmZpc2hNZXNzYWdlRm9ybWF0dGVyIGV4dGVuZHMgSlNPTk1lc3NhZ2VGb3JtYXR0ZXIgewotCi0gICAgLy9yZXR1cm5zIHRoZSB3cml0ZXIgZm9yIHRoZSBiYWRnZXJmaXNoIGZvcm1hdAotICAgIHByb3RlY3RlZCBYTUxTdHJlYW1Xcml0ZXIgZ2V0SlNPTldyaXRlcihPdXRwdXRTdHJlYW0gb3V0U3RyZWFtKSB7Ci0gICAgICAgIHJldHVybiBuZXcgQmFkZ2VyRmlzaFhNTFN0cmVhbVdyaXRlcihuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG91dFN0cmVhbSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIElmIHRoZSBkYXRhIHNvdXJjZSBpcyBhICJCYWRnZXJmaXNoIiBmb3JtYXR0ZWQgZGF0YSBzb3VyY2UsIGdpdmVzIHRoZSBKU09OIHN0cmluZyBieSBkaXJlY3RseQotICAgICAqIHRha2luZyBmcm9tIHRoZSBkYXRhIHNvdXJjZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBkYXRhU291cmNlIGRhdGEgc291cmNlIHRvIGJlIGNoZWNrZWQKLSAgICAgKiBAcmV0dXJuIHRoZSBKU09OIHN0cmluZyB0byB3cml0ZQotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0U3RyaW5nVG9Xcml0ZShPTURhdGFTb3VyY2UgZGF0YVNvdXJjZSkgewotICAgICAgICBpZiAoZGF0YVNvdXJjZSBpbnN0YW5jZW9mIEpTT05CYWRnZXJmaXNoRGF0YVNvdXJjZSkgewotICAgICAgICAgICAgcmV0dXJuICgoSlNPTkRhdGFTb3VyY2UpZGF0YVNvdXJjZSkuZ2V0Q29tcGxldGVKT1NOU3RyaW5nKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pzb24vc3JjL29yZy9hcGFjaGUvYXhpczIvanNvbi9KU09OQmFkZ2VyZmlzaE9NQnVpbGRlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvanNvbi9zcmMvb3JnL2FwYWNoZS9heGlzMi9qc29uL0pTT05CYWRnZXJmaXNoT01CdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0ZjJhZWIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvanNvbi9zcmMvb3JnL2FwYWNoZS9heGlzMi9qc29uL0pTT05CYWRnZXJmaXNoT01CdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuanNvbjsKLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLS8qKgotICogTWVzc2FnZSBidWlsZGVyIGZvciAiQmFkZ2VyZmlzaCIgY29udmVudGlvbi4gRGF0YVNvdXJjZSB1c2VkIGhlcmUgaXMKLSAqIEpTT05CYWRnZXJmaXNoRGF0YVNvdXJjZSB3aGljaCBpcyBzcGVjaWZpYyBmb3IgIkJhZGdlcmZpc2giCi0gKi8KLQotcHVibGljIGNsYXNzIEpTT05CYWRnZXJmaXNoT01CdWlsZGVyIGV4dGVuZHMgSlNPTk9NQnVpbGRlciB7Ci0KLSAgICBwcm90ZWN0ZWQgSlNPTkRhdGFTb3VyY2UgZ2V0RGF0YVNvdXJjZShJbnB1dFN0cmVhbSBqc29uSW5wdXRTdHJlYW0sIFN0cmluZyBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxvY2FsTmFtZSkgewotICAgICAgICByZXR1cm4gbmV3IEpTT05CYWRnZXJmaXNoRGF0YVNvdXJjZShqc29uSW5wdXRTdHJlYW0sICJcIiIgKyBwcmVmaXggKyBsb2NhbE5hbWUgKyAiXCIiKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qc29uL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pzb24vSlNPTkRhdGFTb3VyY2UuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2pzb24vc3JjL29yZy9hcGFjaGUvYXhpczIvanNvbi9KU09ORGF0YVNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkMWM4NjlmLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pzb24vc3JjL29yZy9hcGFjaGUvYXhpczIvanNvbi9KU09ORGF0YVNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qc29uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTURhdGFTb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NT3V0cHV0Rm9ybWF0OwotaW1wb3J0IG9yZy5jb2RlaGF1cy5qZXR0aXNvbi5qc29uLkpTT05Ub2tlbmVyOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5qZXR0aXNvbi5tYXBwZWQuTWFwcGVkWE1MSW5wdXRGYWN0b3J5OwotCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Db25zdGFudHM7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uV3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi0vKioKLSAqIEpTT05EYXRhU291cmNlIGtlZXBzIHRoZSBKU09OIFN0cmluZyBpbnNpZGUgYW5kIGNvbnN1bWVzIGl0IHdoZW4gbmVlZGVkLiBUaGlzIGlzIHRvIGJlIGtlcHQgaW4KLSAqIHRoZSBPTVNvdXJjZWRFbGVtZW50SW1wbCBhbmQgY2FuIGJlIHVzZWQgZWl0aGVyIHRvIGV4cGFuZCB0aGUgdHJlZSBvciBnZXQgdGhlIEpTT04gU3RyaW5nCi0gKiBkaXJlY3RseSB3aXRob3V0IGV4cGFuZGluZy4gVGhpcyB1c2VzIHRoZSAiTWFwcGVkIiBKU09OIGNvbnZlbnRpb24uCi0gKi8KLQotcHVibGljIGNsYXNzIEpTT05EYXRhU291cmNlIGltcGxlbWVudHMgT01EYXRhU291cmNlIHsKLQotICAgIHByaXZhdGUgSW5wdXRTdHJlYW0ganNvbklucHV0U3RyZWFtOwotICAgIHByaXZhdGUgU3RyaW5nIGpzb25TdHJpbmc7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGlzUmVhZCA9IGZhbHNlOwotICAgIHByb3RlY3RlZCBTdHJpbmcgbG9jYWxOYW1lOwotCi0gICAgcHVibGljIEpTT05EYXRhU291cmNlKElucHV0U3RyZWFtIGpzb25JbnB1dFN0cmVhbSwgU3RyaW5nIGxvY2FsTmFtZSkgewotICAgICAgICB0aGlzLmpzb25JbnB1dFN0cmVhbSA9IGpzb25JbnB1dFN0cmVhbTsKLSAgICAgICAgdGhpcy5sb2NhbE5hbWUgPSBsb2NhbE5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV3JpdGVzIEpTT04gaW50byB0aGUgb3V0cHV0IHN0cmVhbS4gQXMgdGhpcyBzaG91bGQgd3JpdGUgSlNPTiwgaXQgZGlyZWN0bHkgZ2V0cyB0aGUgSlNPTgotICAgICAqIHN0cmluZyBhbmQgd3JpdGVzIGl0IHdpdGhvdXQgZXhwYW5kaW5nIHRoZSB0cmVlLgotICAgICAqCi0gICAgICogQHBhcmFtIG91dHB1dFN0cmVhbSAgIHRoZSBzdHJlYW0gdG8gYmUgd3JpdHRlbiBpbnRvCi0gICAgICogQHBhcmFtIG9tT3V0cHV0Rm9ybWF0IGZvcm1hdCBvZiB0aGUgbWVzc2FnZSwgdGhpcyBpcyBpZ25vcmVkLgotICAgICAqIEB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICBpZiB0aGVyZSBpcyBhbiBlcnJvciB3aGlsZSB3cml0aW5nIHRoZSBtZXNzYWdlIGluIHRvIHRoZSBvdXRwdXQgc3RyZWFtLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtLCBPTU91dHB1dEZvcm1hdCBvbU91dHB1dEZvcm1hdCkKLSAgICAgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgb3V0cHV0U3RyZWFtLndyaXRlKGdldENvbXBsZXRlSk9TTlN0cmluZygpLmdldEJ5dGVzKCkpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgT01FeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdyaXRlcyBKU09OIHRocm91Z2ggdGhlIHdyaXRlci4gQXMgdGhpcyBzaG91bGQgd3JpdGUgSlNPTiwgaXQgZGlyZWN0bHkgZ2V0cyB0aGUgSlNPTiBzdHJpbmcKLSAgICAgKiBhbmQgd3JpdGVzIGl0IHdpdGhvdXQgZXhwYW5kaW5nIHRoZSB0cmVlLgotICAgICAqCi0gICAgICogQHBhcmFtIHdyaXRlciAgICAgICAgIFdyaXRlciB0byBiZSB3cml0dGVuIGludG8KLSAgICAgKiBAcGFyYW0gb21PdXRwdXRGb3JtYXQgZm9ybWF0IG9mIHRoZSBtZXNzYWdlLCB0aGlzIGlzIGlnbm9yZWQuCi0gICAgICogQHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgIGlmIHRoZXJlIGlzIGFuIGVycm9yIHdoaWxlIHdyaXRpbmcgdGhlIG1lc3NhZ2UgdGhyb3VnaCB0aGUgd3JpdGVyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShXcml0ZXIgd3JpdGVyLCBPTU91dHB1dEZvcm1hdCBvbU91dHB1dEZvcm1hdCkKLSAgICAgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgd3JpdGVyLndyaXRlKGdldENvbXBsZXRlSk9TTlN0cmluZygpKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE9NRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZXMgWE1MIHRocm91Z2ggdGhlIFhNTFN0cmVhbVdyaXRlci4gQXMgdGhlIGlucHV0IGRhdGEgc291cmNlIGlzIEpTT04sIHRoaXMgbWV0aG9kIG5lZWRzCi0gICAgICogdG8gZ2V0IGEgU3RBWCByZWFkZXIgZnJvbSB0aGF0IEpTT04gU3RyaW5nLiBUaGVyZWZvcmUgdGhpcyB1c2VzIHRoZSBnZXRSZWFkZXIoKSBtZXRob2QgdG8gZ2V0Ci0gICAgICogdGhlIFN0QVggcmVhZGVyIHdyaXRlcyB0aGUgZXZlbnRzIGludG8gdGhlIFhNTFN0cmVhbVdyaXRlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSB4bWxTdHJlYW1Xcml0ZXIgU3RBWCB3cml0ZXIgdG8gYmUgd3JpdHRlbiBpbnRvCi0gICAgICogQHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgIGlmIHRoZXJlIGlzIGFuIGVycm9yIHdoaWxlIHdyaXRpbmcgdGhlIG1lc3NhZ2UgdGhyb3VnaCB0aGUgU3RBWCB3cml0ZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2VyaWFsaXplKFhNTFN0cmVhbVdyaXRlciB4bWxTdHJlYW1Xcml0ZXIpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyID0gZ2V0UmVhZGVyKCk7Ci0gICAgICAgIHhtbFN0cmVhbVdyaXRlci53cml0ZVN0YXJ0RG9jdW1lbnQoKTsKLSAgICAgICAgd2hpbGUgKHJlYWRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIGludCB4ID0gcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgIHN3aXRjaCAoeCkgewotICAgICAgICAgICAgICAgIGNhc2UgWE1MU3RyZWFtQ29uc3RhbnRzLlNUQVJUX0VMRU1FTlQ6Ci0gICAgICAgICAgICAgICAgICAgIHhtbFN0cmVhbVdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChyZWFkZXIuZ2V0UHJlZml4KCksIHJlYWRlci5nZXRMb2NhbE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGludCBuYW1lc3BhY2VDb3VudCA9IHJlYWRlci5nZXROYW1lc3BhY2VDb3VudCgpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gbmFtZXNwYWNlQ291bnQgLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICAgICAgICAgICAgICAgICAgeG1sU3RyZWFtV3JpdGVyLndyaXRlTmFtZXNwYWNlKHJlYWRlci5nZXROYW1lc3BhY2VQcmVmaXgoaSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLmdldE5hbWVzcGFjZVVSSShpKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaW50IGF0dHJpYnV0ZUNvdW50ID0gcmVhZGVyLmdldEF0dHJpYnV0ZUNvdW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlQ291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgeG1sU3RyZWFtV3JpdGVyLndyaXRlQXR0cmlidXRlKHJlYWRlci5nZXRBdHRyaWJ1dGVQcmVmaXgoaSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLmdldEF0dHJpYnV0ZU5hbWVzcGFjZShpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIuZ2V0QXR0cmlidXRlTG9jYWxOYW1lKGkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZShpKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBYTUxTdHJlYW1Db25zdGFudHMuU1RBUlRfRE9DVU1FTlQ6Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgWE1MU3RyZWFtQ29uc3RhbnRzLkNIQVJBQ1RFUlM6Ci0gICAgICAgICAgICAgICAgICAgIHhtbFN0cmVhbVdyaXRlci53cml0ZUNoYXJhY3RlcnMocmVhZGVyLmdldFRleHQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgWE1MU3RyZWFtQ29uc3RhbnRzLkNEQVRBOgotICAgICAgICAgICAgICAgICAgICB4bWxTdHJlYW1Xcml0ZXIud3JpdGVDRGF0YShyZWFkZXIuZ2V0VGV4dCgpKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBYTUxTdHJlYW1Db25zdGFudHMuRU5EX0VMRU1FTlQ6Ci0gICAgICAgICAgICAgICAgICAgIHhtbFN0cmVhbVdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBYTUxTdHJlYW1Db25zdGFudHMuRU5EX0RPQ1VNRU5UOgotICAgICAgICAgICAgICAgICAgICB4bWxTdHJlYW1Xcml0ZXIud3JpdGVFbmREb2N1bWVudCgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFhNTFN0cmVhbUNvbnN0YW50cy5TUEFDRToKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBYTUxTdHJlYW1Db25zdGFudHMuQ09NTUVOVDoKLSAgICAgICAgICAgICAgICAgICAgeG1sU3RyZWFtV3JpdGVyLndyaXRlQ29tbWVudChyZWFkZXIuZ2V0VGV4dCgpKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBYTUxTdHJlYW1Db25zdGFudHMuRFREOgotICAgICAgICAgICAgICAgICAgICB4bWxTdHJlYW1Xcml0ZXIud3JpdGVEVEQocmVhZGVyLmdldFRleHQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgWE1MU3RyZWFtQ29uc3RhbnRzLlBST0NFU1NJTkdfSU5TVFJVQ1RJT046Ci0gICAgICAgICAgICAgICAgICAgIHhtbFN0cmVhbVdyaXRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53cml0ZVByb2Nlc3NpbmdJbnN0cnVjdGlvbihyZWFkZXIuZ2V0UElUYXJnZXQoKSwgcmVhZGVyLmdldFBJRGF0YSgpKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBYTUxTdHJlYW1Db25zdGFudHMuRU5USVRZX1JFRkVSRU5DRToKLSAgICAgICAgICAgICAgICAgICAgeG1sU3RyZWFtV3JpdGVyLndyaXRlRW50aXR5UmVmKHJlYWRlci5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGRlZmF1bHQgOgotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT01FeGNlcHRpb24oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB4bWxTdHJlYW1Xcml0ZXIud3JpdGVFbmREb2N1bWVudCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdpdmVzIHRoZSBTdEFYIHJlYWRlciB1c2luZyB0aGUgIk1hcHBlZCIgZm9ybWF0dGVkIGlucHV0IEpTT04gU3RyaW5nLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgWE1MU3RyZWFtUmVhZGVyIGFjY29yZGluZyB0byB0aGUgSlNPTiBTdHJpbmcuCi0gICAgICogQHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgIGlmIHRoZXJlIGlzIGFuIGVycm9yIHdoaWxlIG1ha2luZyB0aGUgU3RBWCByZWFkZXIuCi0gICAgICovCi0KLSAgICBwdWJsaWMgWE1MU3RyZWFtUmVhZGVyIGdldFJlYWRlcigpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgIEhhc2hNYXAgWE1MVG9KU05OYW1lc3BhY2VNYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICBYTUxUb0pTTk5hbWVzcGFjZU1hcC5wdXQoIiIsICIiKTsKLQotICAgICAgICAvL2lucHV0IGZhY3RvcnkgZm9yICJNYXBwZWQiIGNvbnZlbnRpb24KLSAgICAgICAgTWFwcGVkWE1MSW5wdXRGYWN0b3J5IGlucHV0RmFjdG9yeSA9IG5ldyBNYXBwZWRYTUxJbnB1dEZhY3RvcnkoWE1MVG9KU05OYW1lc3BhY2VNYXApOwotICAgICAgICBTdHJpbmcganNvblN0cmluZyA9ICJ7IiArIGxvY2FsTmFtZSArICI6IiArIHRoaXMuZ2V0SlNPTlN0cmluZygpOwotICAgICAgICByZXR1cm4gaW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgSlNPTlRva2VuZXIoanNvblN0cmluZykpOwotICAgIH0KLQotICAgIC8vcmV0dXJucyB0aGUganNvbiBzdHJpbmcgYnkgY29uc3VtaW5nIHRoZSBKU09OIGlucHV0IHN0cmVhbS4KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEpTT05TdHJpbmcoKSB7Ci0gICAgICAgIGlmIChpc1JlYWQpIHsKLSAgICAgICAgICAgIHJldHVybiBqc29uU3RyaW5nOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBjaGFyIHRlbXAgPSAoY2hhcilqc29uSW5wdXRTdHJlYW0ucmVhZCgpOwotICAgICAgICAgICAgICAgIGpzb25TdHJpbmcgPSAiIjsKLSAgICAgICAgICAgICAgICB3aGlsZSAoKGludCl0ZW1wICE9IDY1NTM1KSB7Ci0gICAgICAgICAgICAgICAgICAgIGpzb25TdHJpbmcgKz0gdGVtcDsKLSAgICAgICAgICAgICAgICAgICAgdGVtcCA9IChjaGFyKWpzb25JbnB1dFN0cmVhbS5yZWFkKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBPTUV4Y2VwdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaXNSZWFkID0gdHJ1ZTsKLSAgICAgICAgICAgIHJldHVybiBqc29uU3RyaW5nOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRDb21wbGV0ZUpPU05TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiAieyIgKyBsb2NhbE5hbWUgKyAiOiIgKyBnZXRKU09OU3RyaW5nKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvanNvbi9zcmMvb3JnL2FwYWNoZS9heGlzMi9qc29uL0pTT05NZXNzYWdlRm9ybWF0dGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qc29uL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pzb24vSlNPTk1lc3NhZ2VGb3JtYXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGE5OGI3Yy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qc29uL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pzb24vSlNPTk1lc3NhZ2VGb3JtYXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuanNvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01PdXRwdXRGb3JtYXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmxsb20uT01FbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5PTVNvdXJjZWRFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLldTREwyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lk1lc3NhZ2VGb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC51dGlsLlVSSUVuY29kZXJEZWNvZGVyOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5qZXR0aXNvbi5tYXBwZWQuTWFwcGVkTmFtZXNwYWNlQ29udmVudGlvbjsKLWltcG9ydCBvcmcuY29kZWhhdXMuamV0dGlzb24ubWFwcGVkLk1hcHBlZFhNTFN0cmVhbVdyaXRlcjsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvcjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi0vKioKLSAqIFRoaXMgSlNPTk1lc3NhZ2VGb3JtYXR0ZXIgaXMgdGhlIGZvcm1hdHRlciBmb3IgIk1hcHBlZCIgZm9ybWF0dGVkIEpTT04gaW4gQXhpczIuIFRoaXMgdHlwZSBvZgotICogSlNPTiBzdHJpbmdzIGFyZSByZWFsbHkgZWFzeSB0byB1c2UgaW4gSmF2YXNjcmlwdC4gRWc6ICAmbHQ7b3V0Jmd0OyZsdDtpbiZndDttYXBwZWQKLSAqIEpTT04mbHQ7L2luJmd0OyZsdDsvb3V0Jmd0OyBpcyBjb252ZXJ0ZWQgdG8uLi4geyJvdXQiOnsiaW4iOiJtYXBwZWQgSlNPTiJ9fSBXQVJOSU5HOiBXZSBkbyBub3QKLSAqIHN1cHBvcnQgIk1hcHBlZCIgSlNPTiBTdHJpbmdzIHdpdGggKm5hbWVzcGFjZXMqIGluIEF4aXMyLiBUaGlzIGNvbnZlbnRpb24gaXMgc3VwcG9ydGVkIGluIEF4aXMyLAotICogd2l0aCB0aGUgYWltIG9mIG1ha2luZyBKYXZhc2NyaXB0IHVzZXJzJyBsaWZlIGVhc3kgKHNlcnZpY2VzIHdyaXR0ZW4gaW4gSmF2YXNjcmlwdCkuIFRoZXJlIGFyZQotICogbm8gbmFtZXNwYWNlcyB1c2VkIGluIEphdmFzY3JpcHQuIElmIHlvdSB3YW50IHRvIHVzZSBKU09OIHdpdGggbmFtZXNwYWNlcywgdXNlIHRoZQotICogSlNPTkJhZGdlcmZpc2hNZXNzYWdlRm9yYXR0ZXIgKGZvciAiQmFkZ2VyZmlzaCIgZm9ybWF0dGVkIEpTT04pIHdoaWNoIHN1cHBvcnRzIEpTT04gd2l0aAotICogbmFtZXNwYWNlcy4KLSAqLwotCi0KLXB1YmxpYyBjbGFzcyBKU09OTWVzc2FnZUZvcm1hdHRlciBpbXBsZW1lbnRzIE1lc3NhZ2VGb3JtYXR0ZXIgewotCi0gICAgcHVibGljIFN0cmluZyBnZXRDb250ZW50VHlwZShNZXNzYWdlQ29udGV4dCBtc2dDdHh0LCBPTU91dHB1dEZvcm1hdCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc29hcEFjdGlvblN0cmluZykgewotICAgICAgICBTdHJpbmcgY29udGVudFR5cGUgPSAoU3RyaW5nKW1zZ0N0eHQuZ2V0UHJvcGVydHkoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uQ09OVEVOVF9UWVBFKTsKLSAgICAgICAgU3RyaW5nIGVuY29kaW5nID0gZm9ybWF0LmdldENoYXJTZXRFbmNvZGluZygpOwotICAgICAgICBpZiAoY29udGVudFR5cGUgPT0gbnVsbCkgewotICAgICAgICAgICAgY29udGVudFR5cGUgPSAoU3RyaW5nKW1zZ0N0eHQuZ2V0UHJvcGVydHkoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uTUVTU0FHRV9UWVBFKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZW5jb2RpbmcgIT0gbnVsbCkgewotICAgICAgICAgICAgY29udGVudFR5cGUgKz0gIjsgY2hhcnNldD0iICsgZW5jb2Rpbmc7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNvbnRlbnRUeXBlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdpdmVzIHRoZSBKU09OIG1lc3NhZ2UgYXMgYW4gYXJyYXkgb2YgYnl0ZXMuIElmIHRoZSBwYXlsb2FkIGlzIGFuIE9NU291cmNlZEVsZW1lbnRJbXBsIGFuZAotICAgICAqIGl0IGNvbnRhaW5zIGEgSlNPTkRhdGFTb3VyY2Ugd2l0aCBhIGNvcnJlY3RseSBmb3JtYXR0ZWQgSlNPTiBTdHJpbmcsIGdldHMgaXQgZGlyZWN0bHkgZnJvbQotICAgICAqIHRoZSBEYXRhU291cmNlIGFuZCByZXR1cm5zIGFzIGEgYnl0ZSBhcnJheS4gSWYgbm90LCB0aGUgT00gdHJlZSBpcyBleHBhbmRlZCBhbmQgaXQgaXMKLSAgICAgKiBzZXJpYWxpemVkIGludG8gdGhlIG91dHB1dCBzdHJlYW0gYW5kIGJ5dGUgYXJyYXkgaXMgcmV0dXJuZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbXNnQ3R4dCBNZXNzYWdlIGNvbnRleHQgd2hpY2ggY29udGFpbnMgdGhlIHNvYXAgZW52ZWxvcGUgdG8gYmUgd3JpdHRlbgotICAgICAqIEBwYXJhbSBmb3JtYXQgIGZvcm1hdCBvZiB0aGUgbWVzc2FnZSwgdGhpcyBpcyBpZ25vcmVkCi0gICAgICogQHJldHVybiB0aGUgcGF5bG9hZCBhcyBhIGJ5dGUgYXJyYXkKLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdCBpZiB0aGVyZSBpcyBhbiBlcnJvciBpbiB3cml0aW5nIHRoZSBtZXNzYWdlIHVzaW5nIFN0QVggd3JpdGVyIG9yIElGIFRIRQotICAgICAqICAgICAgICAgICAgICAgICAgIFVTRVIgVFJJRVMgVE8gU0VORCBBIEpTT04gTUVTU0FHRSBXSVRIIE5BTUVTUEFDRVMgVVNJTkcgVEhFICJNQVBQRUQiCi0gICAgICogICAgICAgICAgICAgICAgICAgQ09OVkVOVElPTi4KLSAgICAgKi8KLQotICAgIHB1YmxpYyBieXRlW10gZ2V0Qnl0ZXMoTWVzc2FnZUNvbnRleHQgbXNnQ3R4dCwgT01PdXRwdXRGb3JtYXQgZm9ybWF0KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgT01FbGVtZW50IGVsZW1lbnQgPSBtc2dDdHh0LmdldEVudmVsb3BlKCkuZ2V0Qm9keSgpLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgICAvL2lmIHRoZSBlbGVtZW50IGlzIGFuIE9NU291cmNlZEVsZW1lbnRJbXBsIGFuZCBpdCBjb250YWlucyBhIEpTT05EYXRhU291cmNlIHdpdGgKLSAgICAgICAgLy9jb3JyZWN0IGNvbnZlbnRpb24sIGRpcmVjdGx5IGdldCB0aGUgSlNPTiBzdHJpbmcuCi0KLSAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBPTVNvdXJjZWRFbGVtZW50SW1wbCAmJgotICAgICAgICAgICAgICAgIGdldFN0cmluZ1RvV3JpdGUoKChPTVNvdXJjZWRFbGVtZW50SW1wbCllbGVtZW50KS5nZXREYXRhU291cmNlKCkpICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyBqc29uVG9Xcml0ZSA9IGdldFN0cmluZ1RvV3JpdGUoKChPTVNvdXJjZWRFbGVtZW50SW1wbCllbGVtZW50KS5nZXREYXRhU291cmNlKCkpOwotICAgICAgICAgICAgcmV0dXJuIGpzb25Ub1dyaXRlLmdldEJ5dGVzKCk7Ci0gICAgICAgICAgICAvL290aGVyd2lzZSBzZXJpYWxpemUgdGhlIE9NIGJ5IGV4cGFuZGluZyB0aGUgdHJlZQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYnl0ZXNPdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICAgICAgWE1MU3RyZWFtV3JpdGVyIGpzb25Xcml0ZXIgPSBnZXRKU09OV3JpdGVyKGJ5dGVzT3V0KTsKLSAgICAgICAgICAgICAgICBlbGVtZW50LnNlcmlhbGl6ZUFuZENvbnN1bWUoanNvbldyaXRlcik7Ci0gICAgICAgICAgICAgICAganNvbldyaXRlci53cml0ZUVuZERvY3VtZW50KCk7Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gYnl0ZXNPdXQudG9CeXRlQXJyYXkoKTsKLQotICAgICAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBBeGlzRmF1bHQubWFrZUZhdWx0KGUpOwotICAgICAgICAgICAgfSBjYXRjaCAoRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvciBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNYXBwZWQgZm9ybWF0dGVkIEpTT04gd2l0aCBuYW1lc3BhY2VzIGFyZSBub3Qgc3VwcG9ydGVkIGluIEF4aXMyLiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1ha2Ugc3VyZSB0aGF0IHlvdXIgcmVxdWVzdCBkb2Vzbid0IGluY2x1ZGUgbmFtZXNwYWNlcyBvciAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzZSB0aGUgQmFkZ2VyZmlzaCBjb252ZW50aW9uIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGZvcm1hdFNPQVBBY3Rpb24oTWVzc2FnZUNvbnRleHQgbXNnQ3R4dCwgT01PdXRwdXRGb3JtYXQgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc29hcEFjdGlvblN0cmluZykgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvL3JldHVybnMgdGhlICJNYXBwZWQiIEpTT04gd3JpdGVyCi0gICAgcHJvdGVjdGVkIFhNTFN0cmVhbVdyaXRlciBnZXRKU09OV3JpdGVyKE91dHB1dFN0cmVhbSBvdXRTdHJlYW0pIHsKLSAgICAgICAgTWFwcGVkTmFtZXNwYWNlQ29udmVudGlvbiBtbmMgPSBuZXcgTWFwcGVkTmFtZXNwYWNlQ29udmVudGlvbigpOwotICAgICAgICByZXR1cm4gbmV3IE1hcHBlZFhNTFN0cmVhbVdyaXRlcihtbmMsIG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob3V0U3RyZWFtKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSWYgdGhlIGRhdGEgc291cmNlIGlzIGEgIk1hcHBlZCIgZm9ybWF0dGVkIGRhdGEgc291cmNlLCBnaXZlcyB0aGUgSlNPTiBzdHJpbmcgYnkgZGlyZWN0bHkKLSAgICAgKiB0YWtpbmcgZnJvbSB0aGUgZGF0YSBzb3VyY2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZGF0YVNvdXJjZSBkYXRhIHNvdXJjZSB0byBiZSBjaGVja2VkCi0gICAgICogQHJldHVybiB0aGUgSlNPTiBzdHJpbmcgdG8gd3JpdGUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFN0cmluZ1RvV3JpdGUoT01EYXRhU291cmNlIGRhdGFTb3VyY2UpIHsKLSAgICAgICAgaWYgKGRhdGFTb3VyY2UgaW5zdGFuY2VvZiBKU09ORGF0YVNvdXJjZSkgewotICAgICAgICAgICAgcmV0dXJuICgoSlNPTkRhdGFTb3VyY2UpZGF0YVNvdXJjZSkuZ2V0Q29tcGxldGVKT1NOU3RyaW5nKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdyaXRlcyB0aGUgSlNPTiBtZXNzYWdlIHRvIHRoZSBvdXRwdXQgc3RyZWFtIHdpdGggdGhlIGNvcnJlY3QgY29udmVudGlvbi4gSWYgdGhlIHBheWxvYWQgaXMKLSAgICAgKiBhbiBPTVNvdXJjZWRFbGVtZW50SW1wbCBhbmQgaXQgY29udGFpbnMgYSBKU09ORGF0YVNvdXJjZSB3aXRoIGEgY29ycmVjdGx5IGZvcm1hdHRlZCBKU09OCi0gICAgICogU3RyaW5nLCBnZXRzIGl0IGRpcmVjdGx5IGZyb20gdGhlIERhdGFTb3VyY2UgYW5kIHdyaXRlcyB0byB0aGUgb3V0cHV0IHN0cmVhbS4gSWYgbm90LCB0aGUgT00KLSAgICAgKiB0cmVlIGlzIGV4cGFuZGVkIGFuZCBpdCBpcyBzZXJpYWxpemVkIGludG8gdGhlIG91dHB1dCBzdHJlYW0uICAgICAgICAgICAgICAqCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbXNnQ3R4dCAgTWVzc2FnZSBjb250ZXh0IHdoaWNoIGNvbnRhaW5zIHRoZSBzb2FwIGVudmVsb3BlIHRvIGJlIHdyaXR0ZW4KLSAgICAgKiBAcGFyYW0gZm9ybWF0ICAgZm9ybWF0IG9mIHRoZSBtZXNzYWdlLCB0aGlzIGlzIGlnbm9yZWQKLSAgICAgKiBAcGFyYW0gb3V0ICAgICAgb3V0cHV0IHN0cmVhbSB0byBiZSB3cml0dGVuIGluIHRvCi0gICAgICogQHBhcmFtIHByZXNlcnZlIGlnbm9yZWQKLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdCBpZiB0aGVyZSBpcyBhbiBlcnJvciBpbiB3cml0aW5nIHRoZSBtZXNzYWdlIHVzaW5nIFN0QVggd3JpdGVyIG9yIElGIFRIRQotICAgICAqICAgICAgICAgICAgICAgICAgIFVTRVIgVFJJRVMgVE8gU0VORCBBIEpTT04gTUVTU0FHRSBXSVRIIE5BTUVTUEFDRVMgVVNJTkcgVEhFICJNQVBQRUQiCi0gICAgICogICAgICAgICAgICAgICAgICAgQ09OVkVOVElPTi4KLSAgICAgKi8KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oTWVzc2FnZUNvbnRleHQgbXNnQ3R4dCwgT01PdXRwdXRGb3JtYXQgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtIG91dCwgYm9vbGVhbiBwcmVzZXJ2ZSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIE9NRWxlbWVudCBlbGVtZW50ID0gbXNnQ3R4dC5nZXRFbnZlbG9wZSgpLmdldEJvZHkoKS5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vTWFwcGVkIGZvcm1hdCBjYW5ub3QgaGFuZGxlIGVsZW1lbnQgd2l0aCBuYW1lc3BhY2VzLi4gU28gY2Fubm90IGhhbmRsZSBGYXVsdHMKLSAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgU09BUEZhdWx0ICYmIHRoaXMgaW5zdGFuY2VvZiBKU09OTWVzc2FnZUZvcm1hdHRlcikgewotICAgICAgICAgICAgICAgIFNPQVBGYXVsdCBmYXVsdCA9IChTT0FQRmF1bHQpZWxlbWVudDsKLSAgICAgICAgICAgICAgICBPTUVsZW1lbnQgZWxlbWVudDIgPSBuZXcgT01FbGVtZW50SW1wbCgiRmF1bHQiLCBudWxsLCBlbGVtZW50LmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgICAgICAgICBlbGVtZW50Mi5zZXRUZXh0KGZhdWx0LnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIGVsZW1lbnQgPSBlbGVtZW50MjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgT01Tb3VyY2VkRWxlbWVudEltcGwgJiYKLSAgICAgICAgICAgICAgICAgICAgZ2V0U3RyaW5nVG9Xcml0ZSgoKE9NU291cmNlZEVsZW1lbnRJbXBsKWVsZW1lbnQpLmdldERhdGFTb3VyY2UoKSkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFN0cmluZyBqc29uVG9Xcml0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBnZXRTdHJpbmdUb1dyaXRlKCgoT01Tb3VyY2VkRWxlbWVudEltcGwpZWxlbWVudCkuZ2V0RGF0YVNvdXJjZSgpKTsKLQotICAgICAgICAgICAgICAgIG91dC53cml0ZShqc29uVG9Xcml0ZS5nZXRCeXRlcygpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgWE1MU3RyZWFtV3JpdGVyIGpzb25Xcml0ZXIgPSBnZXRKU09OV3JpdGVyKG91dCk7Ci0gICAgICAgICAgICAgICAgZWxlbWVudC5zZXJpYWxpemVBbmRDb25zdW1lKGpzb25Xcml0ZXIpOwotICAgICAgICAgICAgICAgIGpzb25Xcml0ZXIud3JpdGVFbmREb2N1bWVudCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBBeGlzRmF1bHQubWFrZUZhdWx0KGUpOwotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoCi0gICAgICAgICAgICAgICAgICAgICJNYXBwZWQgZm9ybWF0dGVkIEpTT04gd2l0aCBuYW1lc3BhY2VzIGFyZSBub3Qgc3VwcG9ydGVkIGluIEF4aXMyLiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWFrZSBzdXJlIHRoYXQgeW91ciByZXF1ZXN0IGRvZXNuJ3QgaW5jbHVkZSBuYW1lc3BhY2VzIG9yICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2UgdGhlIEJhZGdlcmZpc2ggY29udmVudGlvbiIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFVSTCBnZXRUYXJnZXRBZGRyZXNzKE1lc3NhZ2VDb250ZXh0IG1zZ0N0eHQsIE9NT3V0cHV0Rm9ybWF0IGZvcm1hdCwgVVJMIHRhcmdldFVSTCkKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotCi0gICAgICAgIFN0cmluZyBodHRwTWV0aG9kID0KLSAgICAgICAgICAgICAgICAoU3RyaW5nKW1zZ0N0eHQuZ2V0UHJvcGVydHkoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uSFRUUF9NRVRIT0QpOwotICAgICAgICBPTUVsZW1lbnQgZGF0YU91dCA9IG1zZ0N0eHQuZ2V0RW52ZWxvcGUoKS5nZXRCb2R5KCkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0KLSAgICAgICAgLy9pZiB0aGUgaHR0cCBtZXRob2QgaXMgR0VULCBzZW5kIHRoZSBqc29uIHN0cmluZyBhcyBhIHBhcmFtZXRlcgotICAgICAgICBpZiAoZGF0YU91dCAhPSBudWxsICYmIChodHRwTWV0aG9kICE9IG51bGwpCi0gICAgICAgICAgICAgICAgJiYgQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uSFRUUF9NRVRIT0RfR0VULmVxdWFsc0lnbm9yZUNhc2UoaHR0cE1ldGhvZCkpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGpzb25TdHJpbmc7Ci0gICAgICAgICAgICAgICAgaWYgKGRhdGFPdXQgaW5zdGFuY2VvZiBPTVNvdXJjZWRFbGVtZW50SW1wbCAmJiBnZXRTdHJpbmdUb1dyaXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgKChPTVNvdXJjZWRFbGVtZW50SW1wbCkgZGF0YU91dCkuZ2V0RGF0YVNvdXJjZSgpKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGpzb25TdHJpbmcgPSBnZXRTdHJpbmdUb1dyaXRlKCgoT01Tb3VyY2VkRWxlbWVudEltcGwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YU91dCkuZ2V0RGF0YVNvdXJjZSgpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICAgICAgICAgICAgICBYTUxTdHJlYW1Xcml0ZXIganNvbldyaXRlciA9IGdldEpTT05Xcml0ZXIob3V0KTsKLSAgICAgICAgICAgICAgICAgICAgZGF0YU91dC5zZXJpYWxpemVBbmRDb25zdW1lKGpzb25Xcml0ZXIpOwotICAgICAgICAgICAgICAgICAgICBqc29uV3JpdGVyLndyaXRlRW5kRG9jdW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAganNvblN0cmluZyA9IG5ldyBTdHJpbmcob3V0LnRvQnl0ZUFycmF5KCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBqc29uU3RyaW5nID0gVVJJRW5jb2RlckRlY29kZXIucXVvdGVJbGxlZ2FsKGpzb25TdHJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICBXU0RMMkNvbnN0YW50cy5MRUdBTF9DSEFSQUNURVJTX0lOX1VSTCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHBhcmFtID0gInF1ZXJ5PSIgKyBqc29uU3RyaW5nOwotICAgICAgICAgICAgICAgIFN0cmluZyByZXR1cm5VUkxGaWxlID0gdGFyZ2V0VVJMLmdldEZpbGUoKSArICI/IiArIHBhcmFtOwotCi0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFVSTCh0YXJnZXRVUkwuZ2V0UHJvdG9jb2woKSwgdGFyZ2V0VVJMLmdldEhvc3QoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFVSTC5nZXRQb3J0KCksIHJldHVyblVSTEZpbGUpOwotICAgICAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBBeGlzRmF1bHQubWFrZUZhdWx0KGUpOwotICAgICAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBBeGlzRmF1bHQubWFrZUZhdWx0KGUpOwotICAgICAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiB0YXJnZXRVUkw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pzb24vc3JjL29yZy9hcGFjaGUvYXhpczIvanNvbi9KU09OT01CdWlsZGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qc29uL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pzb24vSlNPTk9NQnVpbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTJlMGM4Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pzb24vc3JjL29yZy9hcGFjaGUvYXhpczIvanNvbi9KU09OT01CdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpzb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01OYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLk9NTmFtZXNwYWNlSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5PTVNvdXJjZWRFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5idWlsZGVyLkJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAudXRpbC5VUklFbmNvZGVyRGVjb2RlcjsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLQotLyoqIE1ha2VzIHRoZSBPTVNvdXJjZWRFbGVtZW50SW1wbCBvYmplY3Qgd2l0aCB0aGUgSlNPTkRhdGFTb3VyY2UgaW5zaWRlLiAqLwotCi1wdWJsaWMgY2xhc3MgSlNPTk9NQnVpbGRlciBpbXBsZW1lbnRzIEJ1aWxkZXIgewotCi0KLSAgICBwdWJsaWMgSlNPTk9NQnVpbGRlcigpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBnaXZlcyB0aGUgT01Tb3VyY2VkRWxlbWVudEltcGwgdXNpbmcgdGhlIGluY29taW5nIEpTT04gc3RyZWFtCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaW5wdXRTdHJlYW0gLSBpbmNvbWluZyBtZXNzYWdlIGFzIGFuIGlucHV0IHN0cmVhbQotICAgICAqIEBwYXJhbSBjb250ZW50VHlwZSAtIGNvbnRlbnQgdHlwZSBvZiB0aGUgbWVzc2FnZSAoZWc6IGFwcGxpY2F0aW9uL2pzb24pCi0gICAgICogQHBhcmFtIG1lc3NhZ2VDb250ZXh0IC0gaW5mbG93IG1lc3NhZ2UgY29udGV4dAotICAgICAqIEByZXR1cm4gT01Tb3VyY2VkRWxlbWVudEltcGwgd2l0aCBKU09ORGF0YVNvdXJjZSBpbnNpZGUKLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdAotICAgICAqLwotCi0gICAgcHVibGljIE9NRWxlbWVudCBwcm9jZXNzRG9jdW1lbnQoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIFN0cmluZyBjb250ZW50VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIE9NRmFjdG9yeSBmYWN0b3J5ID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCk7Ci0gICAgICAgIFN0cmluZyBsb2NhbE5hbWUgPSAiIjsKLSAgICAgICAgU3RyaW5nIHByZWZpeCA9ICIiOwotICAgICAgICBPTU5hbWVzcGFjZSBucyA9IGZhY3RvcnkuY3JlYXRlT01OYW1lc3BhY2UoIiIsICIiKTsKLQotICAgICAgICAvL2lmIHRoZSBpbnB1dCBzdHJlYW0gaXMgbnVsbCwgdGhlbiBjaGVjayB3aGV0aGVyIHRoZSBIVFRQIG1ldGhvZCBpcyBHRVQsIGlmIHNvIGdldCB0aGUKLSAgICAgICAgLy8gSlNPTiBTdHJpbmcgd2hpY2ggaXMgcmVjZWl2ZWQgYXMgYSBwYXJhbWV0ZXIsIGFuZCBtYWtlIGl0IGFuIGlucHV0IHN0cmVhbQotCi0gICAgICAgIGlmIChpbnB1dFN0cmVhbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBFbmRwb2ludFJlZmVyZW5jZSBlbmRwb2ludFJlZmVyZW5jZSA9IG1lc3NhZ2VDb250ZXh0LmdldFRvKCk7Ci0gICAgICAgICAgICBpZiAoZW5kcG9pbnRSZWZlcmVuY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoIkNhbm5vdCBjcmVhdGUgRG9jdW1lbnRFbGVtZW50IHdpdGhvdXQgZGVzdGluYXRpb24gRVBSIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0cmluZyByZXF1ZXN0VVJMOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByZXF1ZXN0VVJMID0gVVJJRW5jb2RlckRlY29kZXIuZGVjb2RlKGVuZHBvaW50UmVmZXJlbmNlLmdldEFkZHJlc3MoKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBBeGlzRmF1bHQubWFrZUZhdWx0KGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTdHJpbmcganNvblN0cmluZzsKLSAgICAgICAgICAgIGludCBpbmRleDsKLSAgICAgICAgICAgIC8vQXMgdGhlIG1lc3NhZ2UgaXMgcmVjZWl2ZWQgdGhyb3VnaCBHRVQsIGNoZWNrIGZvciAiPSIgc2lnbiBhbmQgY29uc2lkZXIgdGhlIHNlY29uZAotICAgICAgICAgICAgLy9oYWxmIGFzIHRoZSBpbmNvbWluZyBKU09OIG1lc3NhZ2UKLSAgICAgICAgICAgIGlmICgoaW5kZXggPSByZXF1ZXN0VVJMLmluZGV4T2YoIj0iKSkgPiAwKSB7Ci0gICAgICAgICAgICAgICAganNvblN0cmluZyA9IHJlcXVlc3RVUkwuc3Vic3RyaW5nKGluZGV4ICsgMSk7Ci0gICAgICAgICAgICAgICAgaW5wdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oanNvblN0cmluZy5nZXRCeXRlcygpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiTm8gSlNPTiBtZXNzYWdlIHJlY2VpdmVkIHRocm91Z2ggSFRUUCBHRVQgb3IgUE9TVCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgTm93IHdlIGhhdmUgdG8gcmVhZCB0aGUgbG9jYWxuYW1lIGFuZCBwcmVmaXggZnJvbSB0aGUgaW5wdXQgc3RyZWFtCi0gICAgICAgIGlmIHRoZXJlIGlzIG5vdCBwcmVmaXgsIG1lc3NhZ2Ugc3RhcnRzIGxpa2UgeyJmb28iOgotICAgICAgICBpZiB0aGVyZSBpcyBhIHByZWZpeCwgbWVzc2FnZSBzdGFydHMgbGlrZSB7InByZWZpeDpmb28iOgotICAgICAgICAgKi8KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vcmVhZCB0aGUgc3RyZWFtIHVudGlsIHdlIGZpbmQgYSA6IHN5bWJvbAotICAgICAgICAgICAgY2hhciB0ZW1wID0gKGNoYXIpaW5wdXRTdHJlYW0ucmVhZCgpOwotICAgICAgICAgICAgd2hpbGUgKHRlbXAgIT0gJzonKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHRlbXAgIT0gJyAnICYmIHRlbXAgIT0gJ3snKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvY2FsTmFtZSArPSB0ZW1wOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0ZW1wID0gKGNoYXIpaW5wdXRTdHJlYW0ucmVhZCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvL2lmIHRoZSBwYXJ0IHdlIHJlYWQgZW5kcyB3aXRoICIsIHRoZXJlIGlzIG5vIHByZWZpeCwgb3RoZXJ3aXNlIGl0IGhhcyBhIHByZWZpeAotICAgICAgICAgICAgaWYgKGxvY2FsTmFtZS5jaGFyQXQoMCkgPT0gJyInKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxvY2FsTmFtZS5jaGFyQXQobG9jYWxOYW1lLmxlbmd0aCgpIC0gMSkgPT0gJyInKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvY2FsTmFtZSA9IGxvY2FsTmFtZS5zdWJzdHJpbmcoMSwgbG9jYWxOYW1lLmxlbmd0aCgpIC0gMSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gbG9jYWxOYW1lLnN1YnN0cmluZygxLCBsb2NhbE5hbWUubGVuZ3RoKCkpICsgIjoiOwotICAgICAgICAgICAgICAgICAgICBsb2NhbE5hbWUgPSAiIjsKLSAgICAgICAgICAgICAgICAgICAgLy9zbyBmYXIgd2UgaGF2ZSByZWFkIG9ubHkgdGhlIHByZWZpeCwgbm93IGxldHMgcmVhZCB0aGUgbG9jYWxuYW1lCi0gICAgICAgICAgICAgICAgICAgIHRlbXAgPSAoY2hhcilpbnB1dFN0cmVhbS5yZWFkKCk7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlICh0ZW1wICE9ICc6JykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXAgIT0gJyAnKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxOYW1lICs9IHRlbXA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wID0gKGNoYXIpaW5wdXRTdHJlYW0ucmVhZCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGxvY2FsTmFtZSA9IGxvY2FsTmFtZS5zdWJzdHJpbmcoMCwgbG9jYWxOYW1lLmxlbmd0aCgpIC0gMSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBBeGlzRmF1bHQubWFrZUZhdWx0KGUpOwotICAgICAgICB9Ci0gICAgICAgIEpTT05EYXRhU291cmNlIGpzb25EYXRhU291cmNlID0gZ2V0RGF0YVNvdXJjZShpbnB1dFN0cmVhbSwgcHJlZml4LCBsb2NhbE5hbWUpOwotICAgICAgICByZXR1cm4gbmV3IE9NU291cmNlZEVsZW1lbnRJbXBsKGxvY2FsTmFtZSwgbnMsIGZhY3RvcnksIGpzb25EYXRhU291cmNlKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgSlNPTkRhdGFTb3VyY2UgZ2V0RGF0YVNvdXJjZShJbnB1dFN0cmVhbQotICAgICAgICAgICAganNvbklucHV0U3RyZWFtLCBTdHJpbmcgcHJlZml4LCBTdHJpbmcgbG9jYWxOYW1lKSB7Ci0gICAgICAgIHJldHVybiBuZXcgSlNPTkRhdGFTb3VyY2UoanNvbklucHV0U3RyZWFtLCAiXCIiICsgcHJlZml4ICsgbG9jYWxOYW1lICsgIlwiIik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvanNvbi90ZXN0LXJlc291cmNlcy9heGlzMi54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9qc29uL3Rlc3QtcmVzb3VyY2VzL2F4aXMyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzcxN2E4Yi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qc29uL3Rlc3QtcmVzb3VyY2VzL2F4aXMyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI2NiArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+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+Ci0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2pzb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pzb24vRWNoby5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvanNvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvanNvbi9FY2hvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4ZTRmZWQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvanNvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvanNvbi9FY2hvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuanNvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01Tb3VyY2VkRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5IVFRQQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMQ29uc3RhbnRzOwotCi1wdWJsaWMgY2xhc3MgRWNobyB7Ci0KLSAgICBwdWJsaWMgRWNobygpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT01FbGVtZW50IGVjaG9PTShPTUVsZW1lbnQgb21FbGUpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBNZXNzYWdlQ29udGV4dCBvdXRNc2dDdHggPSBNZXNzYWdlQ29udGV4dC5nZXRDdXJyZW50TWVzc2FnZUNvbnRleHQoKS5nZXRPcGVyYXRpb25Db250ZXh0KCkuZ2V0TWVzc2FnZUNvbnRleHQoV1NETENvbnN0YW50cy5NRVNTQUdFX0xBQkVMX09VVF9WQUxVRSk7Ci0gICAgICAgIE9iamVjdCBvYmplY3QgPSBvdXRNc2dDdHguZ2V0UHJvcGVydHkoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uTUVTU0FHRV9UWVBFKTsKLSAgICAgICAgU3RyaW5nIG1lc3NhZ2VUeXBlID0gKFN0cmluZykgb2JqZWN0OwotCi0gICAgICAgIC8vaWYgdGhlIHJlcXVlc3QgaXMgdGhyb3VnaCBHRVQsIHRoZSBtZXNzYWdlIHR5cGUgaXMgYXBwbGljYXRpb24veG1sLiBvdGhlcndpc2UgZG9uJ3QgYWxsb3cKLSAgICAgICAgLy9hbnkgbm9uIGpzb24gc3BlY2lmaWMgbWVzc2FnZSB0eXBlcwotICAgICAgICBpZiAobWVzc2FnZVR5cGUuZXF1YWxzSWdub3JlQ2FzZShIVFRQQ29uc3RhbnRzLk1FRElBX1RZUEVfQVBQTElDQVRJT05fWE1MKSkgewotICAgICAgICAgICAgb3V0TXNnQ3R4LnNldFByb3BlcnR5KENvbnN0YW50cy5Db25maWd1cmF0aW9uLk1FU1NBR0VfVFlQRSwgImFwcGxpY2F0aW9uL2pzb24iKTsKLSAgICAgICAgfSBlbHNlIGlmIChtZXNzYWdlVHlwZS5pbmRleE9mKCJqc29uIikgPCAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJUeXBlIG9mIHRoZSBSZWNlaXZlZCBNZXNzYWdlIGlzIG5vdCBKU09OIik7Ci0gICAgICAgIH0KLSAgICAgICAgT01EYXRhU291cmNlIG9tZGF0YU9TdWNlID0gKChPTVNvdXJjZWRFbGVtZW50KSBvbUVsZSkuZ2V0RGF0YVNvdXJjZSgpOwotICAgICAgICBPTUVsZW1lbnQgbmV3T21FbGUgPSAoT01FbGVtZW50KSBvbUVsZS5kZXRhY2goKTsKLSAgICAgICAgKChPTVNvdXJjZWRFbGVtZW50KSBuZXdPbUVsZSkuc2V0RGF0YVNvdXJjZShvbWRhdGFPU3VjZSk7Ci0gICAgICAgIHJldHVybiBvbUVsZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9qc29uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qc29uL0pTT05EYXRhU291cmNlVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvanNvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvanNvbi9KU09ORGF0YVNvdXJjZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdlZTlhOC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qc29uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qc29uL0pTT05EYXRhU291cmNlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qc29uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS51dGlsLlN0QVhVdGlsczsKLWltcG9ydCBvcmcuY29kZWhhdXMuamV0dGlzb24uanNvbi5KU09ORXhjZXB0aW9uOwotaW1wb3J0IG9yZy5jdXN0b21tb25rZXkueG1sdW5pdC5YTUxUZXN0Q2FzZTsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotCi1wdWJsaWMgY2xhc3MgSlNPTkRhdGFTb3VyY2VUZXN0IGV4dGVuZHMgWE1MVGVzdENhc2UgewotCi0gICAgcHVibGljIHZvaWQgdGVzdE1hcHBlZFNlcmlhbGl6ZTEoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIGpzb25TdHJpbmcgPSBnZXRNYXBwZWRKU09OU3RyaW5nKCk7Ci0gICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgIEpTT05EYXRhU291cmNlIHNvdXJjZSA9IGdldE1hcHBlZERhdGFTb3VyY2UoanNvblN0cmluZyk7Ci0gICAgICAgIHNvdXJjZS5zZXJpYWxpemUob3V0U3RyZWFtLCBudWxsKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGpzb25TdHJpbmcsIG5ldyBTdHJpbmcob3V0U3RyZWFtLnRvQnl0ZUFycmF5KCkpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWFwcGVkU2VyaWFsaXplMigpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIGpzb25TdHJpbmcgPSBnZXRNYXBwZWRKU09OU3RyaW5nKCk7Ci0gICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgIE91dHB1dFN0cmVhbVdyaXRlciB3cml0ZXIgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG91dFN0cmVhbSk7Ci0gICAgICAgIEpTT05EYXRhU291cmNlIHNvdXJjZSA9IGdldE1hcHBlZERhdGFTb3VyY2UoanNvblN0cmluZyk7Ci0gICAgICAgIHNvdXJjZS5zZXJpYWxpemUod3JpdGVyLCBudWxsKTsKLSAgICAgICAgd3JpdGVyLmZsdXNoKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhqc29uU3RyaW5nLCBuZXcgU3RyaW5nKG91dFN0cmVhbS50b0J5dGVBcnJheSgpKSk7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWFwcGVkU2VyaWFsaXplMygpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBTdHJpbmcganNvblN0cmluZyA9IGdldE1hcHBlZEpTT05TdHJpbmcoKTsKLSAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgWE1MU3RyZWFtV3JpdGVyIHdyaXRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1Xcml0ZXIob3V0U3RyZWFtKTsKLSAgICAgICAgSlNPTkRhdGFTb3VyY2Ugc291cmNlID0gZ2V0TWFwcGVkRGF0YVNvdXJjZShqc29uU3RyaW5nKTsKLSAgICAgICAgc291cmNlLnNlcmlhbGl6ZSh3cml0ZXIpOwotICAgICAgICB3cml0ZXIuZmx1c2goKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAgICAgICAgICI8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PjxtYXBwaW5nPjxpbm5lcj48Zmlyc3Q+dGVzdCBzdHJpbmcgb25lPC9maXJzdD48L2lubmVyPjxpbm5lcj50ZXN0IHN0cmluZyB0d288L2lubmVyPjxuYW1lPmZvbzwvbmFtZT48L21hcHBpbmc+IiwKLSAgICAgICAgICAgICAgICBuZXcgU3RyaW5nKG91dFN0cmVhbS50b0J5dGVBcnJheSgpKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEJhZGdlcmZpc2hTZXJpYWxpemUxKCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBqc29uU3RyaW5nID0gZ2V0QmFkZ2VyZmlzaEpTT05TdHJpbmcoKTsKLSAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgSlNPTkJhZGdlcmZpc2hEYXRhU291cmNlIHNvdXJjZSA9IGdldEJhZGdlcmZpc2hEYXRhU291cmNlKGpzb25TdHJpbmcpOwotICAgICAgICBzb3VyY2Uuc2VyaWFsaXplKG91dFN0cmVhbSwgbnVsbCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhqc29uU3RyaW5nLCBuZXcgU3RyaW5nKG91dFN0cmVhbS50b0J5dGVBcnJheSgpKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEJhZGdlcmZpc2hTZXJpYWxpemUyKCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotICAgICAgICBTdHJpbmcganNvblN0cmluZyA9IGdldEJhZGdlcmZpc2hKU09OU3RyaW5nKCk7Ci0gICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgIE91dHB1dFN0cmVhbVdyaXRlciB3cml0ZXIgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG91dFN0cmVhbSk7Ci0gICAgICAgIEpTT05CYWRnZXJmaXNoRGF0YVNvdXJjZSBzb3VyY2UgPSBnZXRCYWRnZXJmaXNoRGF0YVNvdXJjZShqc29uU3RyaW5nKTsKLSAgICAgICAgc291cmNlLnNlcmlhbGl6ZSh3cml0ZXIsIG51bGwpOwotICAgICAgICB3cml0ZXIuZmx1c2goKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGpzb25TdHJpbmcsIG5ldyBTdHJpbmcob3V0U3RyZWFtLnRvQnl0ZUFycmF5KCkpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QmFkZ2VyZmlzaFNlcmlhbGl6ZTMoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uLCBKU09ORXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwKLSAgICAgICAgICAgIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBqc29uU3RyaW5nID0gZ2V0QmFkZ2VyZmlzaEpTT05TdHJpbmcoKTsKLSAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgWE1MU3RyZWFtV3JpdGVyIHdyaXRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1Xcml0ZXIob3V0U3RyZWFtKTsKLSAgICAgICAgSlNPTkJhZGdlcmZpc2hEYXRhU291cmNlIHNvdXJjZSA9IGdldEJhZGdlcmZpc2hEYXRhU291cmNlKGpzb25TdHJpbmcpOwotICAgICAgICBzb3VyY2Uuc2VyaWFsaXplKHdyaXRlcik7Ci0gICAgICAgIHdyaXRlci5mbHVzaCgpOwotICAgICAgICBhc3NlcnRYTUxFcXVhbCgKLSAgICAgICAgICAgICAgICAiPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz48cCB4bWxucz1cImh0dHA6Ly9kZWYubnNcIiB4bWxuczpiYj1cImh0dHA6Ly9vdGhlci5uc2JcIiB4bWxuczphYT1cImh0dHA6Ly9vdGhlci5uc1wiPjxzYW0gYXR0PVwibGV0c1wiPjU1NTwvc2FtPjwvcD4iLAotICAgICAgICAgICAgICAgIG5ldyBTdHJpbmcob3V0U3RyZWFtLnRvQnl0ZUFycmF5KCkpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEpTT05CYWRnZXJmaXNoRGF0YVNvdXJjZSBnZXRCYWRnZXJmaXNoRGF0YVNvdXJjZShTdHJpbmcganNvblN0cmluZykgewotICAgICAgICBJbnB1dFN0cmVhbSBqc29uSW5wdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oanNvblN0cmluZy5nZXRCeXRlcygpKTsKLSAgICAgICAgcmV0dXJuIG5ldyBKU09OQmFkZ2VyZmlzaERhdGFTb3VyY2UocmVhZExvY2FsTmFtZShqc29uSW5wdXRTdHJlYW0pLCAiXCJwXCIiKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRCYWRnZXJmaXNoSlNPTlN0cmluZygpIHsKLSAgICAgICAgcmV0dXJuICJ7XCJwXCI6e1wiQHhtbG5zXCI6e1wiYmJcIjpcImh0dHA6Ly9vdGhlci5uc2JcIixcImFhXCI6XCJodHRwOi8vb3RoZXIubnNcIixcIiRcIjpcImh0dHA6Ly9kZWYubnNcIn0sXCJzYW1cIjp7XCIkXCI6XCI1NTVcIiwgXCJAYXR0XCI6XCJsZXRzXCJ9fX0iOwotICAgIH0KLQotICAgIHByaXZhdGUgSlNPTkRhdGFTb3VyY2UgZ2V0TWFwcGVkRGF0YVNvdXJjZShTdHJpbmcganNvblN0cmluZykgewotICAgICAgICBJbnB1dFN0cmVhbSBqc29uSW5wdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oanNvblN0cmluZy5nZXRCeXRlcygpKTsKLSAgICAgICAgcmV0dXJuIG5ldyBKU09ORGF0YVNvdXJjZShyZWFkTG9jYWxOYW1lKGpzb25JbnB1dFN0cmVhbSksICJcIm1hcHBpbmdcIiIpOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldE1hcHBlZEpTT05TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiAie1wibWFwcGluZ1wiOntcImlubmVyXCI6W3tcImZpcnN0XCI6XCJ0ZXN0IHN0cmluZyBvbmVcIn0sXCJ0ZXN0IHN0cmluZyB0d29cIl0sXCJuYW1lXCI6XCJmb29cIn19IjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIElucHV0U3RyZWFtIHJlYWRMb2NhbE5hbWUoSW5wdXRTdHJlYW0gaW4pIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHdoaWxlICgoY2hhcilpbi5yZWFkKCkgIT0gJzonKSB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGluOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvanNvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvanNvbi9KU09OSW50ZWdyYXRpb25UZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9qc29uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qc29uL0pTT05JbnRlZ3JhdGlvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NlYTQwZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9qc29uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qc29uL0pTT05JbnRlZ3JhdGlvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuanNvbjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01OYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50Lk9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuU2VydmljZUNsaWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuU2ltcGxlSFRUUFNlcnZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuVXRpbHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uZXQuU2VydmVyU29ja2V0OwotCi1wdWJsaWMgY2xhc3MgSlNPTkludGVncmF0aW9uVGVzdCBleHRlbmRzIFRlc3RDYXNlIGltcGxlbWVudHMgSlNPTlRlc3RDb25zdGFudHMgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgQXhpc1NlcnZpY2Ugc2VydmljZTsKLQotICAgIHByaXZhdGUgU3RyaW5nIGV4cGVjdGVkU3RyaW5nOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU2ltcGxlSFRUUFNlcnZlciBzZXJ2ZXI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWd1cmF0aW9uQ29udGV4dDsKLQotICAgIHByaXZhdGUgc3RhdGljIEVuZHBvaW50UmVmZXJlbmNlIHRhcmdldEVQUjsKLQotICAgIHB1YmxpYyBKU09OSW50ZWdyYXRpb25UZXN0KCkgewotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGludCBjb3VudCA9IDA7Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoY291bnQgPT0gMCkgewotICAgICAgICAgICAgaW50IHRlc3RpbmdQb3J0ID0gZmluZEF2YWlsYWJsZVBvcnQoKTsKLSAgICAgICAgICAgIHRhcmdldEVQUiA9IG5ldyBFbmRwb2ludFJlZmVyZW5jZSgKLSAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly8xMjcuMC4wLjE6IiArICh0ZXN0aW5nUG9ydCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIvYXhpczIvc2VydmljZXMvRWNob1hNTFNlcnZpY2UvZWNob09NIik7Ci0KLSAgICAgICAgICAgIEZpbGUgY29uZmlnRmlsZSA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiYmFzZWRpciIsICIuIikgKyAiL3Rlc3QtcmVzb3VyY2VzL2F4aXMyLnhtbCIpOwotICAgICAgICAgICAgY29uZmlndXJhdGlvbkNvbnRleHQgPSBDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkKLSAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZUNvbmZpZ3VyYXRpb25Db250ZXh0RnJvbUZpbGVTeXN0ZW0obnVsbCwgY29uZmlnRmlsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgICAgICAgICBzZXJ2ZXIgPSBuZXcgU2ltcGxlSFRUUFNlcnZlcihjb25maWd1cmF0aW9uQ29udGV4dCwgdGVzdGluZ1BvcnQpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBzZXJ2ZXIuc3RhcnQoKTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNlcnZpY2UgPSBVdGlscy5jcmVhdGVTaW1wbGVTZXJ2aWNlKHNlcnZpY2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5qc29uLkVjaG8uY2xhc3MuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uTmFtZSk7Ci0gICAgICAgICAgICBzZXJ2ZXIuZ2V0Q29uZmlndXJhdGlvbkNvbnRleHQoKS5nZXRBeGlzQ29uZmlndXJhdGlvbigpLmFkZFNlcnZpY2UoCi0gICAgICAgICAgICAgICAgICAgIHNlcnZpY2UpOwotICAgICAgICB9Ci0gICAgICAgIGNvdW50Kys7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAJaWYoY291bnQgPT0gMyl7Ci0gICAgCQlzZXJ2ZXIuc3RvcCgpOwotICAgIAl9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIE9NRWxlbWVudCBjcmVhdGVFbnZlbG9wZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBPTUZhY3RvcnkgZmFjID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCk7Ci0gICAgICAgIE9NTmFtZXNwYWNlIG9tTnMgPSBmYWMuY3JlYXRlT01OYW1lc3BhY2UoIiIsICIiKTsKLSAgICAgICAgT01FbGVtZW50IHJwY1dyYXBFbGUgPSBmYWMuY3JlYXRlT01FbGVtZW50KCJlY2hvT00iLCBvbU5zKTsKLSAgICAgICAgT01FbGVtZW50IGRhdGEgPSBmYWMuY3JlYXRlT01FbGVtZW50KCJkYXRhIiwgb21Ocyk7Ci0gICAgICAgIE9NRWxlbWVudCBkYXRhMSA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoImRhdGEiLCBvbU5zKTsKLSAgICAgICAgZXhwZWN0ZWRTdHJpbmcgPSAibXkganNvbiBzdHJpbmciOwotICAgICAgICBTdHJpbmcgZXhwZWN0ZWRTdHJpbmcxID0gIm15IHNlY29uZCBqc29uIHN0cmluZyI7Ci0gICAgICAgIGRhdGEuc2V0VGV4dChleHBlY3RlZFN0cmluZyk7Ci0gICAgICAgIGRhdGExLnNldFRleHQoZXhwZWN0ZWRTdHJpbmcxKTsKLSAgICAgICAgcnBjV3JhcEVsZS5hZGRDaGlsZChkYXRhKTsKLSAgICAgICAgcnBjV3JhcEVsZS5hZGRDaGlsZChkYXRhMSk7Ci0gICAgICAgIHJldHVybiBycGNXcmFwRWxlOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBkb0VjaG9PTShTdHJpbmcgbWVzc2FnZVR5cGUsIFN0cmluZyBodHRwTWV0aG9kKSB0aHJvd3MgRXhjZXB0aW9uewotICAgIAlPTUVsZW1lbnQgcGF5bG9hZCA9IGNyZWF0ZUVudmVsb3BlKCk7Ci0gICAgICAgIE9wdGlvbnMgb3B0aW9ucyA9IG5ldyBPcHRpb25zKCk7Ci0gICAgICAgIG9wdGlvbnMuc2V0VG8odGFyZ2V0RVBSKTsKLSAgICAgICAgb3B0aW9ucy5zZXRQcm9wZXJ0eShDb25zdGFudHMuQ29uZmlndXJhdGlvbi5NRVNTQUdFX1RZUEUsIG1lc3NhZ2VUeXBlKTsKLSAgICAgICAgb3B0aW9ucy5zZXRUcmFuc3BvcnRJblByb3RvY29sKENvbnN0YW50cy5UUkFOU1BPUlRfSFRUUCk7Ci0gICAgICAgIG9wdGlvbnMuc2V0UHJvcGVydHkoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uSFRUUF9NRVRIT0QsIGh0dHBNZXRob2QpOwotLy8gICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNsaWVudENvbmZpZ3VyYXRpb25Db250ZXh0ID0gQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5LmNyZWF0ZURlZmF1bHRDb25maWd1cmF0aW9uQ29udGV4dCgpOwotICAgICAgICBTZXJ2aWNlQ2xpZW50IHNlbmRlciA9IG5ldyBTZXJ2aWNlQ2xpZW50KGNvbmZpZ3VyYXRpb25Db250ZXh0LCBudWxsKTsKLSAgICAgICAgb3B0aW9ucy5zZXRBY3Rpb24obnVsbCk7Ci0gICAgICAgIHNlbmRlci5zZXRPcHRpb25zKG9wdGlvbnMpOwotICAgICAgICBvcHRpb25zLnNldFRvKHRhcmdldEVQUik7Ci0gICAgICAgIE9NRWxlbWVudCByZXN1bHQgPSBzZW5kZXIuc2VuZFJlY2VpdmUocGF5bG9hZCk7Ci0gICAgICAgIE9NRWxlbWVudCBlbGUgPSAoT01FbGVtZW50KXJlc3VsdC5nZXRGaXJzdE9NQ2hpbGQoKTsKLSAgICAgICAgY29tcGFyZVdpdGhDcmVhdGVkT01UZXh0KGVsZS5nZXRUZXh0KCkpOwotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgdGVzdEVjaG9PTVdpdGhKU09OQmFkZ2VyZmlzaCgpIHRocm93cyBFeGNlcHRpb257Ci0gICAgCWRvRWNob09NKCJhcHBsaWNhdGlvbi9qc29uL2JhZGdlcmZpc2giLCBDb25zdGFudHMuQ29uZmlndXJhdGlvbi5IVFRQX01FVEhPRF9QT1NUKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RWNob09NV2l0aEpTT04oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAJZG9FY2hvT00oImFwcGxpY2F0aW9uL2pzb24iLCBDb25zdGFudHMuQ29uZmlndXJhdGlvbi5IVFRQX01FVEhPRF9QT1NUKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RWNob09NV2l0aEpTT05JbkdFVCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBkb0VjaG9PTSgiYXBwbGljYXRpb24vanNvbiIsIENvbnN0YW50cy5Db25maWd1cmF0aW9uLkhUVFBfTUVUSE9EX0dFVCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgY29tcGFyZVdpdGhDcmVhdGVkT01UZXh0KFN0cmluZyByZXNwb25zZSkgewotICAgICAgICBUZXN0Q2FzZS5hc3NlcnRFcXVhbHMocmVzcG9uc2UsIGV4cGVjdGVkU3RyaW5nKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGludCBmaW5kQXZhaWxhYmxlUG9ydCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNlcnZlclNvY2tldCBzcyA9IG5ldyBTZXJ2ZXJTb2NrZXQoMCk7Ci0gICAgICAgICAgICBpbnQgcmVzdWx0ID0gc3MuZ2V0TG9jYWxQb3J0KCk7Ci0gICAgICAgICAgICBzcy5jbG9zZSgpOwotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybiA1NTU1OwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvanNvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvanNvbi9KU09OT01CdWlsZGVyVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvanNvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvanNvbi9KU09OT01CdWlsZGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjk3MzdmLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pzb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pzb24vSlNPTk9NQnVpbGRlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotLypwYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuanNvbjsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NT3V0cHV0Rm9ybWF0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0LlRyYW5zcG9ydFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuU09BUE1lc3NhZ2VGb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmpldHRpc29uLmpzb24uSlNPTkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBKU09OT01CdWlsZGVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RCYWRnZXJmaXNoT01TZXJpYWxpemF0aW9uMSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0KLSAgICAgICAgU3RyaW5nIGpzb25TdHJpbmcgPSBnZXRCYWRnZXJmaXNoSlNPTlN0cmluZygpOwotICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBpblN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShqc29uU3RyaW5nLmdldEJ5dGVzKCkpOwotCi0gICAgICAgIEpTT05PTUJ1aWxkZXIgb21CdWlsZGVyID0gbmV3IEpTT05CYWRnZXJmaXNoT01CdWlsZGVyKCk7Ci0gICAgICAgIE9NRWxlbWVudCBlbGVtID0gb21CdWlsZGVyLnByb2Nlc3NEb2N1bWVudChpblN0cmVhbSwKLSAgICAgICAgICAgICAgICBKU09OVGVzdENvbnN0YW50cy5DT05URU5UX1RZUEVfQkFER0VSRklTSCwgbnVsbCk7Ci0KLSAgICAgICAgZWxlbS50b1N0cmluZygpOwotCi0gICAgICAgIFNPQVBFbnZlbG9wZSBlbnZlbG9wZSA9IFRyYW5zcG9ydFV0aWxzLmNyZWF0ZVNPQVBFbnZlbG9wZShlbGVtKTsKLQotICAgICAgICBNZXNzYWdlQ29udGV4dCBtc2dDdHggPSBuZXcgTWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgbXNnQ3R4LnNldEVudmVsb3BlKGVudmVsb3BlKTsKLQotICAgICAgICBPTU91dHB1dEZvcm1hdCBvdXRwdXRGb3JtYXQgPSBuZXcgT01PdXRwdXRGb3JtYXQoKTsKLSAgICAgICAgb3V0cHV0Rm9ybWF0LnNldENoYXJTZXRFbmNvZGluZyhNZXNzYWdlQ29udGV4dC5ERUZBVUxUX0NIQVJfU0VUX0VOQ09ESU5HKTsKLQotICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0U3RyZWFtID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCi0gICAgICAgIFNPQVBNZXNzYWdlRm9ybWF0dGVyIGZvcm1hdHRlciA9IG5ldyBTT0FQTWVzc2FnZUZvcm1hdHRlcigpOwotICAgICAgICBmb3JtYXR0ZXIud3JpdGVUbyhtc2dDdHgsIG91dHB1dEZvcm1hdCwgb3V0U3RyZWFtLCB0cnVlKTsKLQotICAgICAgICBvdXRTdHJlYW0uZmx1c2goKTsKLSAgICAgICAgb3V0U3RyZWFtLmNsb3NlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEJhZGdlcmZpc2hPTVNlcmlhbGl6YXRpb24yKCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgSlNPTkV4Y2VwdGlvbiwKLSAgICAgICAgICAgIElPRXhjZXB0aW9uLCBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcganNvblN0cmluZyA9IGdldEJhZGdlcmZpc2hKU09OU3RyaW5nKCk7Ci0gICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGluU3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGpzb25TdHJpbmcuZ2V0Qnl0ZXMoKSk7Ci0KLSAgICAgICAgSlNPTk9NQnVpbGRlciBvbUJ1aWxkZXIgPSBuZXcgSlNPTkJhZGdlcmZpc2hPTUJ1aWxkZXIoKTsKLSAgICAgICAgT01FbGVtZW50IGVsZW0gPSBvbUJ1aWxkZXIucHJvY2Vzc0RvY3VtZW50KGluU3RyZWFtLAotICAgICAgICAgICAgICAgIEpTT05UZXN0Q29uc3RhbnRzLkNPTlRFTlRfVFlQRV9CQURHRVJGSVNILCBudWxsKTsKLQotICAgICAgICBlbGVtLnRvU3RyaW5nKCk7Ci0KLSAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgZWxlbS5zZXJpYWxpemUob3V0U3RyZWFtKTsKLSAgICAgICAgb3V0U3RyZWFtLmZsdXNoKCk7Ci0gICAgICAgIG91dFN0cmVhbS5jbG9zZSgpOwotCi0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0QmFkZ2VyZmlzaEpTT05TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiAie1wicFwiOntcIkB4bWxuc1wiOntcImJiXCI6XCJodHRwOi8vb3RoZXIubnNiXCIsXCJhYVwiOlwiaHR0cDovL290aGVyLm5zXCIsXCIkXCI6XCJodHRwOi8vZGVmLm5zXCJ9LFwic2FtXCI6e1wiJFwiOlwiNTU1XCIsIFwiQGF0dFwiOlwibGV0c1wifX19IjsKLSAgICB9Ci0KLX0KLSovClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvanNvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvanNvbi9KU09OVGVzdENvbnN0YW50cy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvanNvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvanNvbi9KU09OVGVzdENvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDIzYWE3Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2pzb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pzb24vSlNPTlRlc3RDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qc29uOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotcHVibGljIGludGVyZmFjZSBKU09OVGVzdENvbnN0YW50cyB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIHNlcnZpY2VOYW1lID0gbmV3IFFOYW1lKCJFY2hvWE1MU2VydmljZSIpOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBvcGVyYXRpb25OYW1lID0gbmV3IFFOYW1lKCJlY2hvT00iKTsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgc3dhU2VydmljZU5hbWUgPSBuZXcgUU5hbWUoIkVjaG9Td0FTZXJ2aWNlIik7Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9UWVBFX0JBREdFUkZJU0ggPSAiYXBwbGljYXRpb24vanNvbi9iYWRnZXJmaXNoIjsKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX1RZUEVfTUFQUEVEID0gImFwcGxpY2F0aW9uL2pzb24iOwotICAgIAotICAgIAotICAgIAotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL2NvbmYvYXhpczIueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL2NvbmYvYXhpczIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjRjYjU1Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9jb25mL2F4aXMyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU0OCArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+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+Ci0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9jb25mL2NvbW1vbnMtbG9nZ2luZy5wcm9wZXJ0aWVzIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL2NvbmYvY29tbW9ucy1sb2dnaW5nLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFlNTcwZDYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL2NvbmYvY29tbW9ucy1sb2dnaW5nLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0jCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLSMgVGhpcyBpcyB0aGUgbG9nZ2luZyBwcm9wZXJ0aWVzIHRoYXQgZ29lcyB0byB0aGUgd2FyLCB0aGVyZSBhcmUgdHdvIGxvZ2dpbmcgY29uZiBrZXB0IGF0IHRoZSAKLSMgc3ZuLCBvbmUgZm9yIGRldmVsb3BlbWVudCAob25lIGF0IHNyYy90ZXN0LXJlc291cmNlcykgYW5kIG90aGVyIGZvciBwcm9kdWNhdGlvbgotIAotIyBVbmNvbW1lbnQgdGhlIG5leHQgbGluZSB0byBkaXNhYmxlIGFsbCBsb2dnaW5nLgotI29yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZz1vcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5pbXBsLk5vT3BMb2cKLQotIyBVbmNvbW1lbnQgdGhlIG5leHQgbGluZSB0byBlbmFibGUgdGhlIHNpbXBsZSBsb2cgYmFzZWQgbG9nZ2luZwotI29yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZz1vcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5pbXBsLlNpbXBsZUxvZwotCi0jIFVuY29tbWVudCB0aGUgbmV4dCBsaW5lIHRvIGVuYWJsZSBsb2c0aiBiYXNlZCBsb2dnaW5nCi1vcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c9b3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuaW1wbC5Mb2c0SkxvZ2dlcgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL2NvbmYvbG9nNGoucHJvcGVydGllcyBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9jb25mL2xvZzRqLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJmYTQ0MjkuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL2NvbmYvbG9nNGoucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLSMKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotIyBTZXQgcm9vdCBjYXRlZ29yeSBwcmlvcml0eSB0byBJTkZPIGFuZCBpdHMgb25seSBhcHBlbmRlciB0byBDT05TT0xFLgotbG9nNGoucm9vdENhdGVnb3J5PUlORk8sIENPTlNPTEUKLSNsb2c0ai5yb290Q2F0ZWdvcnk9SU5GTywgQ09OU09MRSwgTE9HRklMRQotCi0jIFNldCB0aGUgZW50ZXJwcmlzZSBsb2dnZXIgcHJpb3JpdHkgdG8gRkFUQUwKLWxvZzRqLmxvZ2dlci5vcmcuYXBhY2hlLmF4aXMyLmVudGVycHJpc2U9RkFUQUwKLWxvZzRqLmxvZ2dlci5kZS5odW5zaWNrZXIuamFsb3B5LmlvPUZBVEFMCi1sb2c0ai5sb2dnZXIuaHR0cGNsaWVudC53aXJlLmhlYWRlcj1GQVRBTAotbG9nNGoubG9nZ2VyLm9yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50PUZBVEFMCi0KLSMgQ09OU09MRSBpcyBzZXQgdG8gYmUgYSBDb25zb2xlQXBwZW5kZXIgdXNpbmcgYSBQYXR0ZXJuTGF5b3V0LgotbG9nNGouYXBwZW5kZXIuQ09OU09MRT1vcmcuYXBhY2hlLmxvZzRqLkNvbnNvbGVBcHBlbmRlcgotbG9nNGouYXBwZW5kZXIuQ09OU09MRS5sYXlvdXQ9b3JnLmFwYWNoZS5sb2c0ai5QYXR0ZXJuTGF5b3V0Ci1sb2c0ai5hcHBlbmRlci5DT05TT0xFLmxheW91dC5Db252ZXJzaW9uUGF0dGVybj1bJXBdICVtJW4KLQotIyBMT0dGSUxFIGlzIHNldCB0byBiZSBhIEZpbGUgYXBwZW5kZXIgdXNpbmcgYSBQYXR0ZXJuTGF5b3V0LgotbG9nNGouYXBwZW5kZXIuTE9HRklMRT1vcmcuYXBhY2hlLmxvZzRqLkZpbGVBcHBlbmRlcgotbG9nNGouYXBwZW5kZXIuTE9HRklMRS5GaWxlPWF4aXMyLmxvZwotbG9nNGouYXBwZW5kZXIuTE9HRklMRS5BcHBlbmQ9dHJ1ZQotbG9nNGouYXBwZW5kZXIuTE9HRklMRS5sYXlvdXQ9b3JnLmFwYWNoZS5sb2c0ai5QYXR0ZXJuTGF5b3V0Ci1sb2c0ai5hcHBlbmRlci5MT0dGSUxFLmxheW91dC5Db252ZXJzaW9uUGF0dGVybj0lZCBbJXRdICUtNXAgJWMgJXggLSAlbSVuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3BvbS54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTlkZWUzOS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI0NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItcGFyZW50PC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4xLjUuMTwvdmVyc2lvbj4KLSAgICAgICAgPHJlbGF0aXZlUGF0aD4uLi9wYXJlbnQvcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgotICAgIDwvcGFyZW50PgotICAgIDxhcnRpZmFjdElkPmF4aXMyLWtlcm5lbDwvYXJ0aWZhY3RJZD4KLSAgICA8bmFtZT5BcGFjaGUgQXhpczIgLSBLZXJuZWw8L25hbWU+Ci0gICAgPGRlc2NyaXB0aW9uPkNvcmUgUGFydHMgb2YgQXhpcyAyLjAuIFRoaXMgaW5jbHVkZXMgQXhpcyAyLjAgZW5naW5lLCBDbGllbnQgQVBJLCBBZGRyZXNzaW5nIHN1cHBvcnQsIGV0Yy4sCi0gICAgPC9kZXNjcmlwdGlvbj4KLSAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUud3MuY29tbW9ucy5heGlvbTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aW9tLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUud3MuY29tbW9ucy5heGlvbTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aW9tLWltcGw8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLndzLmNvbW1vbnMuYXhpb208L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlvbS1kb208L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmdlcm9uaW1vLnNwZWNzPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+Z2Vyb25pbW8td3MtbWV0YWRhdGFfMi4wX3NwZWM8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLQkgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5nZXJvbmltby5zcGVjczwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmdlcm9uaW1vLWp0YV8xLjFfc3BlYzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmphdmF4LnNlcnZsZXQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5zZXJ2bGV0LWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmNvbW1vbnMtaHR0cGNsaWVudDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtaHR0cGNsaWVudDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmNvbW1vbnMtZmlsZXVwbG9hZDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtZmlsZXVwbG9hZDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPndzZGw0ajwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPndzZGw0ajwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWE8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5YbWxTY2hlbWE8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm5lZXRoaTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm5lZXRoaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUud29kZW48L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD53b2Rlbi1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3dvZGVuLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPGV4Y2x1c2lvbnM+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+eGVyY2VzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD54ZXJjZXNJbXBsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPnhtbC1hcGlzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD54bWwtYXBpczwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgIDwvZXhjbHVzaW9ucz4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUud29kZW48L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD53b2Rlbi1pbXBsLWRvbTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7d29kZW4udmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8ZXhjbHVzaW9ucz4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD54ZXJjZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnhlcmNlc0ltcGw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+eG1sLWFwaXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnhtbC1hcGlzPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgPC9leGNsdXNpb25zPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1sb2dnaW5nPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1sb2dnaW5nPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPC9kZXBlbmRlbmNpZXM+Ci0gICAgPGJ1aWxkPgotICAgICAgICA8c291cmNlRGlyZWN0b3J5PnNyYzwvc291cmNlRGlyZWN0b3J5PgotICAgICAgICA8dGVzdFNvdXJjZURpcmVjdG9yeT50ZXN0PC90ZXN0U291cmNlRGlyZWN0b3J5PgotICAgICAgICA8cmVzb3VyY2VzPgotICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+Y29uZjwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxleGNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovKi5wcm9wZXJ0aWVzPC9leGNsdWRlPgotICAgICAgICAgICAgICAgIDwvZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgPGZpbHRlcmluZz5mYWxzZTwvZmlsdGVyaW5nPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYzwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxleGNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovKi5qYXZhPC9leGNsdWRlPgotICAgICAgICAgICAgICAgIDwvZXhjbHVkZXM+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+Li4vLi48L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPk5PVElDRS50eHQ8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPkxJQ0VOU0UudHh0PC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgPGZpbHRlcmluZz5mYWxzZTwvZmlsdGVyaW5nPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgPC9yZXNvdXJjZXM+Ci0gICAgICAgIDx0ZXN0UmVzb3VyY2VzPgotICAgICAgICAgICAgPHRlc3RSZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0UGF0aD4uLi90ZXN0LXJlc291cmNlczwvdGFyZ2V0UGF0aD4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnRlc3QtcmVzb3VyY2VzPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qKjwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgPC90ZXN0UmVzb3VyY2U+Ci0gICAgICAgICAgICA8dGVzdFJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+dGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9DbGFzc3BhdGhNb2R1bGU8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLyoqPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICA8L3Rlc3RSZXNvdXJjZT4KLSAgICAgICAgPC90ZXN0UmVzb3VyY2VzPgotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphci1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgIDxhcmNoaXZlPiAgCi0gICAgICAgICAgICAgICAgICA8bWFuaWZlc3RGaWxlPnJlc291cmNlcy9NRVRBLUlORi9NQU5JRkVTVC5NRjwvbWFuaWZlc3RGaWxlPgotICAgICAgICAgICAgICAgIDwvYXJjaGl2ZT4gCi0gICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPiAgCi0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHNraXA+ZmFsc2U8L3NraXA+Ci0gICAgICAgICAgICAgICAgICAgIDxleGNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqLypBYnN0cmFjdCouamF2YTwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqLypVdGlsKi5qYXZhPC9leGNsdWRlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovKk1lc3NhZ2VDb250ZXh0Q2hhbmdlVGVzdC5qYXZhPC9leGNsdWRlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovTWVzc2FnZUNvbnRleHRDaGFuZ2VUZXN0LmphdmE8L2V4Y2x1ZGU+IDwhLS0gUmVtb3ZlZCBiZWNhdXNlIG9mIHByb2JsZW0gb24gSmF2YTUuIE5lZWRzIHJlaW5zdGF0ZWQgLS0+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLypUZXN0LmphdmE8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hbnRydW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPnByb2Nlc3MtcmVzb3VyY2VzPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wcm9jZXNzLXJlc291cmNlczwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFza3M+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0c3RhbXA+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Zm9ybWF0IHByb3BlcnR5PSJidWlsZC50aW1lIiBwYXR0ZXJuPSJNTU0gZGQsIHl5eXkgKGhoOm1tOnNzIHopIiBsb2NhbGU9ImVuIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHN0YW1wPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsdGVyIHRva2VuPSJheGlzVmVyc2lvbiIgdmFsdWU9IiR7dmVyc2lvbn0iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbHRlciB0b2tlbj0iVE9EQVkiIHZhbHVlPSIke2J1aWxkLnRpbWV9Ii8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3B5IHRvRGlyPSIke2Jhc2VkaXJ9L3RhcmdldC9jbGFzc2VzL29yZy9hcGFjaGUvYXhpczIvaTE4biIgb3ZlcndyaXRlPSJ0cnVlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJpbmc9Im9uIiBmaWxlPSIke2Jhc2VkaXJ9L3NyYy9vcmcvYXBhY2hlL2F4aXMyL2kxOG4vcmVzb3VyY2UucHJvcGVydGllcyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFza3M+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+cnVuPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+cHJvY2Vzcy10ZXN0LXJlc291cmNlczwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cHJvY2Vzcy10ZXN0LXJlc291cmNlczwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFza3M+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhbnQgYW50ZmlsZT0iYnVpbGQueG1sIiBpbmhlcml0YWxsPSJ0cnVlIiBpbmhlcml0cmVmcz0idHJ1ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXI9InRlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvc2VydmljZTIiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFudCBhbnRmaWxlPSJidWlsZC54bWwiIGluaGVyaXRhbGw9InRydWUiIGluaGVyaXRyZWZzPSJ0cnVlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcj0idGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9lY2hvIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhbnQgYW50ZmlsZT0iYnVpbGQueG1sIiBpbmhlcml0YWxsPSJ0cnVlIiBpbmhlcml0cmVmcz0idHJ1ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXI9InRlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvaW52YWxpZHNlcnZpY2UiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFudCBhbnRmaWxlPSJidWlsZC54bWwiIGluaGVyaXRhbGw9InRydWUiIGluaGVyaXRyZWZzPSJ0cnVlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcj0idGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9tb2R1bGUxIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhbnQgYW50ZmlsZT0iYnVpbGQueG1sIiBpbmhlcml0YWxsPSJ0cnVlIiBpbmhlcml0cmVmcz0idHJ1ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXI9InRlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvc2VydmljZU1vZHVsZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29weSBmaWxlPSIke2Jhc2VkaXJ9L3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvYXhpczIueG1sIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2ZpbGU9IiR7YmFzZWRpcn0vdGFyZ2V0L3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvYXhpczIueG1sIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YXNrcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5ydW48L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD50ZXN0LWNvbXBpbGU8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnRlc3QtY29tcGlsZTwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFza3M+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJtYXZlbi5idWlsZC5kaXIiIGxvY2F0aW9uPSIke2Jhc2VkaXJ9L3RhcmdldCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YW50IGFudGZpbGU9Imoyc2VjYnVpbGQueG1sIiBpbmhlcml0YWxsPSJ0cnVlIiBpbmhlcml0cmVmcz0idHJ1ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXI9InRlc3QtcmVzb3VyY2VzLyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFza3M+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+cnVuPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgIDwvcGx1Z2lucz4KLSAgICA8L2J1aWxkPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Jlc291cmNlcy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9yZXNvdXJjZXMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlYzIzNzMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Jlc291cmNlcy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjANCi1CdW5kbGUtTGljZW5zZTogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wLnR4dA0KLUltcG9ydC1QYWNrYWdlOiANCi0gY29tLmlibS53c2RsLnV0aWwueG1sLA0KLSBqYXZheC5hY3RpdmF0aW9uLA0KLSBqYXZheC5qbXM7cmVzb2x1dGlvbjo9b3B0aW9uYWwsDQotIGphdmF4Lm1haWwsDQotIGphdmF4Lm1haWwuaW50ZXJuZXQsDQotIGphdmF4Lm5hbWluZywNCi0gamF2YXgubmV0LnNzbCwNCi0gamF2YXguc2VjdXJpdHkuYXV0aC54NTAwLA0KLSBqYXZheC5zZXJ2bGV0LA0KLSBqYXZheC5zZXJ2bGV0Lmh0dHAsDQotIGphdmF4LndzZGwsDQotIGphdmF4LndzZGwuZXh0ZW5zaW9ucywNCi0gamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAsDQotIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLA0KLSBqYXZheC53c2RsLmV4dGVuc2lvbnMuc2NoZW1hLA0KLSBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcCwNCi0gamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAxMiwNCi0gamF2YXgud3NkbC5mYWN0b3J5LA0KLSBqYXZheC53c2RsLnhtbCwNCi0gamF2YXgueG1sLm5hbWVzcGFjZSwNCi0gamF2YXgueG1sLnBhcnNlcnMsDQotIGphdmF4LnhtbC5zdHJlYW0sDQotIGphdmF4LnhtbC50cmFuc2Zvcm0sDQotIGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLA0KLSBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbSwNCi0gb3JnLmFwYWNoZS5heGlvbS5hdHRhY2htZW50cywNCi0gb3JnLmFwYWNoZS5heGlvbS5hdHRhY2htZW50cy5saWZlY3ljbGUsDQotIG9yZy5hcGFjaGUuYXhpb20uYXR0YWNobWVudHMubGlmZWN5Y2xlLmltcGwsDQotIG9yZy5hcGFjaGUuYXhpb20uYXR0YWNobWVudHMudXRpbHMsDQotIG9yZy5hcGFjaGUuYXhpb20ub20sDQotIG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbCwNCi0gb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmJ1aWxkZXIsDQotIG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5sbG9tLA0KLSBvcmcuYXBhY2hlLmF4aW9tLm9tLnV0aWwsDQotIG9yZy5hcGFjaGUuYXhpb20uc29hcCwNCi0gb3JnLmFwYWNoZS5heGlvbS5zb2FwLmltcGwuYnVpbGRlciwNCi0gb3JnLmFwYWNoZS5heGlvbS5zb2FwLmltcGwubGxvbS5zb2FwMTEsDQotIG9yZy5hcGFjaGUuYXhpb20uc29hcC5pbXBsLmxsb20uc29hcDEyLA0KLSBvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudCwNCi0gb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQuYXV0aCwNCi0gb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQubWV0aG9kcywNCi0gb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQubWV0aG9kcy5tdWx0aXBhcnQsDQotIG9yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50LnBhcmFtcywNCi0gb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQucHJvdG9jb2wsDQotIG9yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50LnV0aWwsDQotIG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nO3Jlc29sdXRpb246PW9wdGlvbmFsLA0KLSBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZywNCi0gb3JnLmFwYWNoZS5odHRwO3Jlc29sdXRpb246PW9wdGlvbmFsLA0KLSBvcmcuYXBhY2hlLmh0dHAuZW50aXR5O3Jlc29sdXRpb246PW9wdGlvbmFsLA0KLSBvcmcuYXBhY2hlLmh0dHAuaW1wbDtyZXNvbHV0aW9uOj1vcHRpb25hbCwNCi0gb3JnLmFwYWNoZS5odHRwLmltcGwuZW50aXR5O3Jlc29sdXRpb246PW9wdGlvbmFsLA0KLSBvcmcuYXBhY2hlLmh0dHAuaW1wbC5pbztyZXNvbHV0aW9uOj1vcHRpb25hbCwNCi0gb3JnLmFwYWNoZS5odHRwLmltcGwubmlvO3Jlc29sdXRpb246PW9wdGlvbmFsLA0KLSBvcmcuYXBhY2hlLmh0dHAuaW1wbC5uaW8ucmVhY3RvcjtyZXNvbHV0aW9uOj1vcHRpb25hbCwNCi0gb3JnLmFwYWNoZS5odHRwLmlvLA0KLSBvcmcuYXBhY2hlLmh0dHAubWVzc2FnZSwNCi0gb3JnLmFwYWNoZS5odHRwLm5pbztyZXNvbHV0aW9uOj1vcHRpb25hbCwNCi0gb3JnLmFwYWNoZS5odHRwLm5pby5yZWFjdG9yO3Jlc29sdXRpb246PW9wdGlvbmFsLA0KLSBvcmcuYXBhY2hlLmh0dHAubmlvLnV0aWw7cmVzb2x1dGlvbjo9b3B0aW9uYWwsDQotIG9yZy5hcGFjaGUuaHR0cC5wYXJhbXMsDQotIG9yZy5hcGFjaGUuaHR0cC5wcm90b2NvbCwNCi0gb3JnLmFwYWNoZS5odHRwLnV0aWwsDQotIG9yZy5hcGFjaGUubmVldGhpLA0KLSBvcmcuYXBhY2hlLndvZGVuLA0KLSBvcmcuYXBhY2hlLndvZGVuLnJlc29sdmVyLA0KLSBvcmcuYXBhY2hlLndvZGVuLnNjaGVtYSwNCi0gb3JnLmFwYWNoZS53b2Rlbi50eXBlcywNCi0gb3JnLmFwYWNoZS53b2Rlbi54bWwsDQotIG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEsDQotIG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuY29uc3RhbnRzLA0KLSBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLnJlc29sdmVyLA0KLSBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLnV0aWxzLA0KLSBvcmcudzNjLmRvbSwNCi0gb3JnLnhtbC5zYXgNCi1FeHBvcnQtUGFja2FnZTogDQotIG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5tZXRhZGF0YSwNCi0gb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLndzZGwsDQotIG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZywNCi0gb3JnLmFwYWNoZS5heGlzMi5idWlsZGVyLA0KLSBvcmcuYXBhY2hlLmF4aXMyLmNsYXNzbG9hZGVyLA0KLSBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5hc3luYywNCi0gb3JnLmFwYWNoZS5heGlzMi5jbGllbnQsDQotIG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5jb25maWd1cmF0aW9uLA0KLSBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuY29udGV4dCwNCi0gb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLA0KLSBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuZXh0ZXJuYWxpemUsDQotIG9yZy5hcGFjaGUuYXhpczIuY29udGV4dCwNCi0gb3JnLmFwYWNoZS5heGlzMi5kYXRhcmV0cmlldmFsLmNsaWVudCwNCi0gb3JnLmFwYWNoZS5heGlzMi5kYXRhcmV0cmlldmFsLA0KLSBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQucmVwb3NpdG9yeS51dGlsLA0KLSBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQucmVzb2x2ZXIsDQotIG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC5zY2hlZHVsZXIsDQotIG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC51dGlsLA0KLSBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQsDQotIG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uamF2YTJ3c2RsLmJ5dGVjb2RlLA0KLSBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLmphdmEyd3NkbCwNCi0gb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbiwNCi0gb3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycywNCi0gb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUsDQotIG9yZy5hcGFjaGUuYXhpczIuaGFuZGxlcnMsDQotIG9yZy5hcGFjaGUuYXhpczIuaTE4biwNCi0gb3JnLmFwYWNoZS5heGlzMi5qYXZhLnNlY3VyaXR5LA0KLSBvcmcuYXBhY2hlLmF4aXMyLm1vZHVsZXMsDQotIG9yZy5hcGFjaGUuYXhpczIubmFtZXNwYWNlLA0KLSBvcmcuYXBhY2hlLmF4aXMyLnBoYXNlcmVzb2x2ZXIsDQotIG9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLA0KLSBvcmcuYXBhY2hlLmF4aXMyLnNlcnZpY2UsDQotIG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuc2VydmVyLA0KLSBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLnV0aWwsDQotIG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAsDQotIG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0LmptcywNCi0gb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQubG9jYWwsDQotIG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lm1haWwuc2VydmVyLA0KLSBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5tYWlsLA0KLSBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC50Y3AsDQotIG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0LnhtcHAudXRpbCwNCi0gb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQueG1wcCwNCi0gb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQsDQotIG9yZy5hcGFjaGUuYXhpczIudXRpbC50aHJlYWRwb29sLA0KLSBvcmcuYXBhY2hlLmF4aXMyLnV0aWwsDQotIG9yZy5hcGFjaGUuYXhpczIud3NkbC51dGlsLA0KLSBvcmcuYXBhY2hlLmF4aXMyLndzZGwsDQotIG9yZy5hcGFjaGUuYXhpczINCi1CdW5kbGUtVmVyc2lvbjogMS40DQotQnVuZGxlLU5hbWU6IEF4aXMyIEtlcm5lbA0KLUJ1bmRsZS1Eb2NVUkw6IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8NCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyDQotQnVuZGxlLVZlbmRvcjogQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24NCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuYXBhY2hlLmF4aXMyLmtlcm5lbA0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9yZXNvdXJjZXMvYXhpczIueHNkIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Jlc291cmNlcy9heGlzMi54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2MGE4ZjMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Jlc291cmNlcy9heGlzMi54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi0NCi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08eHM6c2NoZW1hIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPg0KLSAgPHhzOmVsZW1lbnQgbmFtZT0iYXhpc2NvbmZpZyI+DQotICAgIDx4czpjb21wbGV4VHlwZSBtaXhlZD0idHJ1ZSI+DQotICAgICAgPHhzOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4NCi0gICAgICAgIDx4czplbGVtZW50IHJlZj0ibWVzc2FnZVJlY2VpdmVyIi8+DQotICAgICAgICA8eHM6ZWxlbWVudCByZWY9Im1vZHVsZSIvPg0KLSAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJwYXJhbWV0ZXIiLz4NCi0gICAgICAgIDx4czplbGVtZW50IHJlZj0iZGVmYXVsdE1vZHVsZVZlcnNpb25zIi8+DQotICAgICAgICA8eHM6ZWxlbWVudCByZWY9ImRlcGxveWVyIi8+DQotICAgICAgICA8eHM6ZWxlbWVudCByZWY9Imhvc3RDb25maWd1cmF0aW9uIi8+DQotICAgICAgICA8eHM6ZWxlbWVudCByZWY9Imxpc3RlbmVyIi8+DQotICAgICAgICA8eHM6ZWxlbWVudCByZWY9Im1lc3NhZ2VCdWlsZGVycyIvPg0KLSAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJtZXNzYWdlRm9ybWF0dGVycyIvPg0KLSAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJtZXNzYWdlUmVjZWl2ZXJzIi8+DQotICAgICAgICA8eHM6ZWxlbWVudCByZWY9Im1vZHVsZUNvbmZpZyIvPg0KLSAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJwaGFzZU9yZGVyIi8+DQotICAgICAgICA8eHM6ZWxlbWVudCByZWY9InRhcmdldFJlc29sdmVycyIvPg0KLSAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ0cmFuc3BvcnRSZWNlaXZlciIvPg0KLSAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ0cmFuc3BvcnRTZW5kZXIiLz4NCi0gICAgICA8L3hzOmNob2ljZT4NCi0gICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzOk5DTmFtZSIvPg0KLSAgICA8L3hzOmNvbXBsZXhUeXBlPg0KLSAgPC94czplbGVtZW50Pg0KLSAgPHhzOmVsZW1lbnQgbmFtZT0iZGVmYXVsdE1vZHVsZVZlcnNpb25zIj4NCi0gICAgPHhzOmNvbXBsZXhUeXBlPg0KLSAgICAgIDx4czpzZXF1ZW5jZT4NCi0gICAgICAgIDx4czplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9Im1vZHVsZSIvPg0KLSAgICAgIDwveHM6c2VxdWVuY2U+DQotICAgIDwveHM6Y29tcGxleFR5cGU+DQotICA8L3hzOmVsZW1lbnQ+DQotICA8eHM6ZWxlbWVudCBuYW1lPSJkZXBsb3llciI+DQotICAgIDx4czpjb21wbGV4VHlwZT4NCi0gICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB1c2U9InJlcXVpcmVkIi8+DQotICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJkaXJlY3RvcnkiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzOk5DTmFtZSIvPg0KLSAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZXh0ZW5zaW9uIiB1c2U9InJlcXVpcmVkIiB0eXBlPSJ4czpOTVRPS0VOIi8+DQotICAgIDwveHM6Y29tcGxleFR5cGU+DQotICA8L3hzOmVsZW1lbnQ+DQotICA8eHM6ZWxlbWVudCBuYW1lPSJob3N0Q29uZmlndXJhdGlvbiI+DQotICAgIDx4czpjb21wbGV4VHlwZT4NCi0gICAgICA8eHM6c2VxdWVuY2U+DQotICAgICAgICA8eHM6ZWxlbWVudCByZWY9ImlwIi8+DQotICAgICAgICA8eHM6ZWxlbWVudCByZWY9InBvcnQiLz4NCi0gICAgICA8L3hzOnNlcXVlbmNlPg0KLSAgICA8L3hzOmNvbXBsZXhUeXBlPg0KLSAgPC94czplbGVtZW50Pg0KLSAgPHhzOmVsZW1lbnQgbmFtZT0iaXAiIHR5cGU9InhzOk5NVE9LRU4iLz4NCi0gIDx4czplbGVtZW50IG5hbWU9InBvcnQiIHR5cGU9InhzOmludGVnZXIiLz4NCi0gIDx4czplbGVtZW50IG5hbWU9Imxpc3RlbmVyIj4NCi0gICAgPHhzOmNvbXBsZXhUeXBlPg0KLSAgICAgIDx4czpzZXF1ZW5jZT4NCi0gICAgICAgIDx4czplbGVtZW50IHJlZj0icGFyYW1ldGVyIi8+DQotICAgICAgPC94czpzZXF1ZW5jZT4NCi0gICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB1c2U9InJlcXVpcmVkIi8+DQotICAgIDwveHM6Y29tcGxleFR5cGU+DQotICA8L3hzOmVsZW1lbnQ+DQotICA8eHM6ZWxlbWVudCBuYW1lPSJtZXNzYWdlQnVpbGRlcnMiPg0KLSAgICA8eHM6Y29tcGxleFR5cGU+DQotICAgICAgPHhzOnNlcXVlbmNlPg0KLSAgICAgICAgPHhzOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0ibWVzc2FnZUJ1aWxkZXIiLz4NCi0gICAgICA8L3hzOnNlcXVlbmNlPg0KLSAgICA8L3hzOmNvbXBsZXhUeXBlPg0KLSAgPC94czplbGVtZW50Pg0KLSAgPHhzOmVsZW1lbnQgbmFtZT0ibWVzc2FnZUJ1aWxkZXIiPg0KLSAgICA8eHM6Y29tcGxleFR5cGU+DQotICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdXNlPSJyZXF1aXJlZCIvPg0KLSAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iY29udGVudFR5cGUiIHVzZT0icmVxdWlyZWQiLz4NCi0gICAgPC94czpjb21wbGV4VHlwZT4NCi0gIDwveHM6ZWxlbWVudD4NCi0gIDx4czplbGVtZW50IG5hbWU9Im1lc3NhZ2VGb3JtYXR0ZXJzIj4NCi0gICAgPHhzOmNvbXBsZXhUeXBlPg0KLSAgICAgIDx4czpzZXF1ZW5jZT4NCi0gICAgICAgIDx4czplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9Im1lc3NhZ2VGb3JtYXR0ZXIiLz4NCi0gICAgICA8L3hzOnNlcXVlbmNlPg0KLSAgICA8L3hzOmNvbXBsZXhUeXBlPg0KLSAgPC94czplbGVtZW50Pg0KLSAgPHhzOmVsZW1lbnQgbmFtZT0ibWVzc2FnZUZvcm1hdHRlciI+DQotICAgIDx4czpjb21wbGV4VHlwZT4NCi0gICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB1c2U9InJlcXVpcmVkIi8+DQotICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJjb250ZW50VHlwZSIgdXNlPSJyZXF1aXJlZCIvPg0KLSAgICA8L3hzOmNvbXBsZXhUeXBlPg0KLSAgPC94czplbGVtZW50Pg0KLSAgPHhzOmVsZW1lbnQgbmFtZT0ibWVzc2FnZVJlY2VpdmVycyI+DQotICAgIDx4czpjb21wbGV4VHlwZT4NCi0gICAgICA8eHM6c2VxdWVuY2U+DQotICAgICAgICA8eHM6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJtZXNzYWdlUmVjZWl2ZXIiLz4NCi0gICAgICA8L3hzOnNlcXVlbmNlPg0KLSAgICA8L3hzOmNvbXBsZXhUeXBlPg0KLSAgPC94czplbGVtZW50Pg0KLSAgPHhzOmVsZW1lbnQgbmFtZT0ibW9kdWxlQ29uZmlnIj4NCi0gICAgPHhzOmNvbXBsZXhUeXBlPg0KLSAgICAgIDx4czpzZXF1ZW5jZT4NCi0gICAgICAgIDx4czplbGVtZW50IHJlZj0icGFyYW1ldGVyIi8+DQotICAgICAgPC94czpzZXF1ZW5jZT4NCi0gICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzOk5DTmFtZSIvPg0KLSAgICA8L3hzOmNvbXBsZXhUeXBlPg0KLSAgPC94czplbGVtZW50Pg0KLSAgPHhzOmVsZW1lbnQgbmFtZT0icGhhc2VPcmRlciI+DQotICAgIDx4czpjb21wbGV4VHlwZT4NCi0gICAgICA8eHM6c2VxdWVuY2U+DQotICAgICAgICA8eHM6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJwaGFzZSIvPg0KLSAgICAgIDwveHM6c2VxdWVuY2U+DQotICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB1c2U9InJlcXVpcmVkIiB0eXBlPSJ4czpOQ05hbWUiLz4NCi0gICAgPC94czpjb21wbGV4VHlwZT4NCi0gIDwveHM6ZWxlbWVudD4NCi0gIDx4czplbGVtZW50IG5hbWU9InBoYXNlIj4NCi0gICAgPHhzOmNvbXBsZXhUeXBlPg0KLSAgICAgIDx4czpzZXF1ZW5jZT4NCi0gICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iaGFuZGxlciIvPg0KLSAgICAgIDwveHM6c2VxdWVuY2U+DQotICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIvPg0KLSAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHM6TkNOYW1lIi8+DQotICAgIDwveHM6Y29tcGxleFR5cGU+DQotICA8L3hzOmVsZW1lbnQ+DQotICA8eHM6ZWxlbWVudCBuYW1lPSJoYW5kbGVyIj4NCi0gICAgPHhzOmNvbXBsZXhUeXBlPg0KLSAgICAgIDx4czpzZXF1ZW5jZT4NCi0gICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJvcmRlciIvPg0KLSAgICAgIDwveHM6c2VxdWVuY2U+DQotICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdXNlPSJyZXF1aXJlZCIvPg0KLSAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHM6TkNOYW1lIi8+DQotICAgIDwveHM6Y29tcGxleFR5cGU+DQotICA8L3hzOmVsZW1lbnQ+DQotICA8eHM6ZWxlbWVudCBuYW1lPSJvcmRlciI+DQotICAgIDx4czpjb21wbGV4VHlwZT4NCi0gICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InBoYXNlIiB1c2U9InJlcXVpcmVkIiB0eXBlPSJ4czpOQ05hbWUiLz4NCi0gICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InBoYXNlTGFzdCIgdHlwZT0ieHM6Ym9vbGVhbiIvPg0KLSAgICA8L3hzOmNvbXBsZXhUeXBlPg0KLSAgPC94czplbGVtZW50Pg0KLSAgPHhzOmVsZW1lbnQgbmFtZT0idGFyZ2V0UmVzb2x2ZXJzIj4NCi0gICAgPHhzOmNvbXBsZXhUeXBlPg0KLSAgICAgIDx4czpzZXF1ZW5jZT4NCi0gICAgICAgIDx4czplbGVtZW50IHJlZj0idGFyZ2V0UmVzb2x2ZXIiLz4NCi0gICAgICA8L3hzOnNlcXVlbmNlPg0KLSAgICA8L3hzOmNvbXBsZXhUeXBlPg0KLSAgPC94czplbGVtZW50Pg0KLSAgPHhzOmVsZW1lbnQgbmFtZT0idGFyZ2V0UmVzb2x2ZXIiPg0KLSAgICA8eHM6Y29tcGxleFR5cGU+DQotICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdXNlPSJyZXF1aXJlZCIvPg0KLSAgICA8L3hzOmNvbXBsZXhUeXBlPg0KLSAgPC94czplbGVtZW50Pg0KLSAgPHhzOmVsZW1lbnQgbmFtZT0idHJhbnNwb3J0UmVjZWl2ZXIiPg0KLSAgICA8eHM6Y29tcGxleFR5cGU+DQotICAgICAgPHhzOnNlcXVlbmNlPg0KLSAgICAgICAgPHhzOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0icGFyYW1ldGVyIi8+DQotICAgICAgPC94czpzZXF1ZW5jZT4NCi0gICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB1c2U9InJlcXVpcmVkIi8+DQotICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB1c2U9InJlcXVpcmVkIiB0eXBlPSJ4czpOQ05hbWUiLz4NCi0gICAgPC94czpjb21wbGV4VHlwZT4NCi0gIDwveHM6ZWxlbWVudD4NCi0gIDx4czplbGVtZW50IG5hbWU9InRyYW5zcG9ydFNlbmRlciI+DQotICAgIDx4czpjb21wbGV4VHlwZT4NCi0gICAgICA8eHM6c2VxdWVuY2U+DQotICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9InBhcmFtZXRlciIvPg0KLSAgICAgIDwveHM6c2VxdWVuY2U+DQotICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdXNlPSJyZXF1aXJlZCIvPg0KLSAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHM6TkNOYW1lIi8+DQotICAgIDwveHM6Y29tcGxleFR5cGU+DQotICA8L3hzOmVsZW1lbnQ+DQotICA8eHM6ZWxlbWVudCBuYW1lPSJtb2R1bGUiPg0KLSAgICA8eHM6Y29tcGxleFR5cGU+DQotICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpOQ05hbWUiLz4NCi0gICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InJlZiIgdHlwZT0ieHM6TkNOYW1lIi8+DQotICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJ4czpkZWNpbWFsIi8+DQotICAgIDwveHM6Y29tcGxleFR5cGU+DQotICA8L3hzOmVsZW1lbnQ+DQotICA8eHM6ZWxlbWVudCBuYW1lPSJwYXJhbWV0ZXIiPg0KLSAgICA8eHM6Y29tcGxleFR5cGUgbWl4ZWQ9InRydWUiPg0KLSAgICAgIDx4czpzZXF1ZW5jZT4NCi0gICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0icGFyYW1ldGVyIi8+DQotICAgICAgPC94czpzZXF1ZW5jZT4NCi0gICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImxvY2tlZCIgdHlwZT0ieHM6Ym9vbGVhbiIvPg0KLSAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHM6TkNOYW1lIi8+DQotICAgIDwveHM6Y29tcGxleFR5cGU+DQotICA8L3hzOmVsZW1lbnQ+DQotICA8eHM6ZWxlbWVudCBuYW1lPSJtZXNzYWdlUmVjZWl2ZXIiPg0KLSAgICA8eHM6Y29tcGxleFR5cGU+DQotICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdXNlPSJyZXF1aXJlZCIvPg0KLSAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibWVwIiB1c2U9InJlcXVpcmVkIiB0eXBlPSJ4czphbnlVUkkiLz4NCi0gICAgPC94czpjb21wbGV4VHlwZT4NCi0gIDwveHM6ZWxlbWVudD4NCi08L3hzOnNjaGVtYT4NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvcmVzb3VyY2VzL3NlcnZpY2VzLnhzZCBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9yZXNvdXJjZXMvc2VydmljZXMueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGI4Zjk3Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9yZXNvdXJjZXMvc2VydmljZXMueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotDQotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPHhzOnNjaGVtYSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIj4NCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0ic2VydmljZUdyb3VwIj4NCi0gICAgICAgIDx4czpjb21wbGV4VHlwZT4NCi0gICAgICAgICAgICA8eHM6c2VxdWVuY2U+DQotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9InNlcnZpY2UiLz4NCi0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9InBhcmFtZXRlciIvPg0KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0ibW9kdWxlIi8+DQotICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4NCi0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+DQotICAgIDwveHM6ZWxlbWVudD4NCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0ic2VydmljZSI+DQotICAgICAgICA8eHM6Y29tcGxleFR5cGU+DQotICAgICAgICAgICAgPHhzOnNlcXVlbmNlPg0KLSAgICAgICAgICAgICAgICA8eHM6Y2hvaWNlIG1heE9jY3Vycz0idW5ib3VuZGVkIj4NCi0gICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ibW9kdWxlIi8+DQotICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9Im9wZXJhdGlvbiIvPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJwYXJhbWV0ZXIiLz4NCi0gICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0iZGVzY3JpcHRpb24iLz4NCi0gICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0iZXhjbHVkZU9wZXJhdGlvbnMiLz4NCi0gICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ibWVzc2FnZVJlY2VpdmVycyIvPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJzY2hlbWEiLz4NCi0gICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0idHJhbnNwb3J0cyIvPg0KLSAgICAgICAgICAgICAgICA8L3hzOmNob2ljZT4NCi0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9ImRhdGFMb2NhdG9yIi8+DQotICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImNsYXNzIi8+DQotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIi8+DQotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJzY29wZSIgdHlwZT0ieHM6TkNOYW1lIi8+DQotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXROYW1lc3BhY2UiIHR5cGU9InhzOmFueVVSSSIvPg0KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iYWN0aXZhdGUiIHR5cGU9InhzOmJvb2xlYW4iIHVzZT0ib3B0aW9uYWwiLz4NCi0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+DQotICAgIDwveHM6ZWxlbWVudD4NCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzOnN0cmluZyIvPg0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJleGNsdWRlT3BlcmF0aW9ucyI+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+DQotICAgIDwveHM6ZWxlbWVudD4NCi08L3hzOnNjaGVtYT4NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvQXhpc0ZhdWx0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvQXhpc0ZhdWx0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmOWNjZGQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL0F4aXNGYXVsdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjM3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhdWx0Q29kZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhdWx0RGV0YWlsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmF1bHROb2RlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmF1bHRSZWFzb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYXVsdFJvbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYXVsdFN1YkNvZGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBIZWFkZXJCbG9jazsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVW5kZWNsYXJlZFRocm93YWJsZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi0vKioKLSAqIEFuIGV4Y2VwdGlvbiB3aGljaCBtYXBzIGNsZWFubHkgdG8gYSBTT0FQIGZhdWx0LgotICogVGhpcyBpcyBhIGJhc2UgY2xhc3MgZm9yIGV4Y2VwdGlvbnMgd2hpY2ggYXJlIG1hcHBlZCB0byBmYXVsdHMuCi0gKgotICogQHNlZSA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAzL1JFQy1zb2FwMTItcGFydDEtMjAwMzA2MjQvI3NvYXBmYXVsdCI+Ci0gKiAgICAgIFNPQVAxLjIgc3BlY2lmaWNhdGlvbjwvYT4KLSAqIEBzZWUgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIvMjAwMC9OT1RFLVNPQVAtMjAwMDA1MDgvI19Ub2M0NzgzODM1MDciPlNPQVAxLjEgRmF1bHRzPC9hPgotICogICAgICA8cC8+Ci0gKiAgICAgIFNPQVAgZmF1bHRzIGNvbnRhaW4KLSAqICAgICAgPG9sPgotICogICAgICA8bGk+QSBmYXVsdCBzdHJpbmcKLSAqICAgICAgPGxpPkEgZmF1bHQgY29kZQotICogICAgICA8bGk+QSBmYXVsdCBhY3RvcgotICogICAgICA8bGk+RmF1bHQgZGV0YWlsczsgYW4geG1sIHRyZWUgb2YgZmF1bHQgc3BlY2lmaWMgZWxlbWVudHMKLSAqICAgICAgPC9vbD4KLSAqICAgICAgPHAvPgotICogICAgICBBcyBTT0FQMS4yIGZhdWx0cyBhcmUgYSBzdXBlcnNldCBvZiBTT0FQMS4xIGZhdWx0cywgdGhpcyB0eXBlIGhvbGRzIHNvYXAxLjIgZmF1bHQgaW5mb3JtYXRpb24uIFdoZW4KLSAqICAgICAgYSBTT0FQMS4xIGZhdWx0IGlzIGNyZWF0ZWQsIHNwdXJpb3VzIGluZm9ybWF0aW9uIGNhbiBiZSBkaXNjYXJkZWQuCi0gKiAgICAgIE1hcHBpbmcKLSAqICAgICAgPHByZT4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPQVAxLjIgICAgICAgICAgICAgIFNPQVAxLjEKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUgICAgICAgICAgICAgICAgIGZhdWx0YWN0b3IKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbigwKS50ZXh0ICAgICAgIGZhdWx0c3RyaW5nCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYXVsdGNvZGUudmFsdWUgICAgICBmYXVsdGNvZGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhdWx0Y29kZS5zdWJjb2RlICAgIChkaXNjYXJkZWQpCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWwgICAgICAgICAgICAgICBkZXRhaWwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvbGUgICAgICAgICAgICAgICAgIChkaXNjYXJkZWQpCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3ByZT4KLSAqLwotCi0KLXB1YmxpYyBjbGFzcyBBeGlzRmF1bHQgZXh0ZW5kcyBSZW1vdGVFeGNlcHRpb24gewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0zNzQ5MzMwODIwNjIxMjQ5MDdMOwotCi0gICAgLyoqCi0gICAgICogYXNzdW1lIGhlYWRlcnMgYXJlIG5vdCB1c2VkIHZlcnkgb2Z0ZW4KLSAgICAgKi8KLSAgICBwcml2YXRlIExpc3QgaGVhZGVycyA9IG5ldyBBcnJheUxpc3QoMCk7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBtZXNzYWdlOwotCi0gICAgcHJpdmF0ZSBMaXN0IGZhdWx0UmVhc29uTGlzdCA9IG5ldyBBcnJheUxpc3QoMSk7Ci0gICAgcHJpdmF0ZSBRTmFtZSBmYXVsdENvZGU7Ci0gICAgcHJpdmF0ZSBMaXN0IGZhdWx0U3ViQ29kZXM7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgZmF1bHROb2RlOwotICAgIHByaXZhdGUgU3RyaW5nIGZhdWx0Um9sZTsKLSAgICBwcml2YXRlIE9NRWxlbWVudCBkZXRhaWw7Ci0KLSAgICBwcml2YXRlIFNPQVBGYXVsdENvZGUgc29hcEZhdWx0Q29kZTsKLSAgICBwcml2YXRlIFNPQVBGYXVsdFJlYXNvbiBzb2FwRmF1bHRSZWFzb247Ci0gICAgcHJpdmF0ZSBTT0FQRmF1bHROb2RlIHNvYXBGYXVsdE5vZGU7Ci0gICAgcHJpdmF0ZSBTT0FQRmF1bHRSb2xlIHNvYXBGYXVsdFJvbGU7Ci0gICAgcHJpdmF0ZSBTT0FQRmF1bHREZXRhaWwgc29hcEZhdWx0RGV0YWlsOwotCi0gICAgLyoqCi0gICAgICogSWYgbm90IG51bGwsIHRoaXMgTWVzc2FnZUNvbnRleHQgcmVwcmVzZW50cyB0aGUgZmF1bHQgYXMgaXQKLSAgICAgKiBzaG91bGQgYmUgcmV0dXJuZWQuICBUaGlzIGlzIHVzZWQgYnkgaGlnaGVyLWxldmVsIGxheWVycwotICAgICAqIHRoYXQgd2FudCB0byBnZW5lcmF0ZSB0aGUgbWVzc2FnZSB0aGVtc2VsdmVzIHNvIHRoYXQKLSAgICAgKiBwcm9jZXNzaW5nIG1heSB0YWtlIHBsYWNlIGJlZm9yZSB0aGV5IHJldHVybiBjb250cm9sIChlLmcuIEpBWC1XUy4pCi0gICAgICovCi0gICAgcHJpdmF0ZSBNZXNzYWdlQ29udGV4dCBmYXVsdE1lc3NhZ2VDb250ZXh0OwotCi0gICAgLyoqCi0gICAgICogU09BUDEuMjogVVJJIG9mIGZhdWx0aW5nIG5vZGUuIE51bGwgZm9yIHVua25vd24uCi0gICAgICogPHAvPgotICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgTm9kZSBlbGVtZW50IGluZm9ybWF0aW9uIGl0ZW0gaXMgdGhlIFVSSSB0aGF0Ci0gICAgICogaWRlbnRpZmllcyB0aGUgU09BUCBub2RlIHRoYXQgZ2VuZXJhdGVkIHRoZSBmYXVsdC4KLSAgICAgKiBTT0FQIG5vZGVzIHRoYXQgZG8gbm90IGFjdCBhcyB0aGUgdWx0aW1hdGUgU09BUCByZWNlaXZlciBNVVNUIGluY2x1ZGUgdGhpcyBlbGVtZW50Ci0gICAgICogaW5mb3JtYXRpb24gaXRlbS4KLSAgICAgKiBBbiB1bHRpbWF0ZSBTT0FQIHJlY2VpdmVyIE1BWSBpbmNsdWRlIHRoaXMgZWxlbWVudCBpbmZvcm1hdGlvbiBpdGVtIHRvCi0gICAgICogaW5kaWNhdGUgZXhwbGljaXRseSB0aGF0IGl0IGdlbmVyYXRlZCB0aGUgZmF1bHQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgbm9kZVVSSTsKLQotCXByaXZhdGUgU3RyaW5nIGZhdWx0QWN0aW9uOwotCi0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBodW1hbi1yZWFkYWJsZSB0ZXh0IGRlc2NyaWJpbmcgdGhlIGZhdWx0Ci0gICAgICovCi0gICAgcHVibGljIEF4aXNGYXVsdChTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOwotICAgICAgICBhZGRSZWFzb24obWVzc2FnZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IKLSAgICAgKgotICAgICAqIEBwYXJhbSBmYXVsdENvZGUgICAtIGZhdWx0IGNvZGUgb2YgdGhlIG1lc3NhZ2UgYXMgYSBRTmFtZQotICAgICAqIEBwYXJhbSBmYXVsdFJlYXNvbiAtIHRoZSByZWFzb24gZm9yIHRoZSBmYXVsdC4gVGhlIGxhbmd1YWdlIHdpbGwgYmUgZGVmYXVsdGVkIHRvICdlbicKLSAgICAgKiBAcGFyYW0gY2F1c2UgZW1iZWRkZWQgZmF1bHQgd2hpY2ggY2F1c2VkIHRoaXMgb25lCi0gICAgICovCi0gICAgcHVibGljIEF4aXNGYXVsdChRTmFtZSBmYXVsdENvZGUsIFN0cmluZyBmYXVsdFJlYXNvbiwgVGhyb3dhYmxlIGNhdXNlKSB7Ci0gICAgICAgIHRoaXMoZmF1bHRSZWFzb24sIGNhdXNlKTsKLSAgICAgICAgc2V0RmF1bHRDb2RlKGZhdWx0Q29kZSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZmF1bHRDb2RlICAgICAgIC0gZmF1bHQgY29kZSBvZiB0aGUgbWVzc2FnZSBhcyBhIFFOYW1lCi0gICAgICogQHBhcmFtIGZhdWx0U3ViQ29kZXMgICAtIGxpc3Qgc3ViIGZhdWx0IGNvZGVzIGFzIGEgbGlzdCBpZiBRTmFtZXMKLSAgICAgKiBAcGFyYW0gZmF1bHRSZWFzb24gLSB0aGUgcmVhc29uIGZvciB0aGUgZmF1bHQuIFRoZSBsYW5ndWFnZSB3aWxsIGJlIGRlZmF1bHRlZCB0byAnZW4nCi0gICAgICogQHBhcmFtIGNhdXNlIGVtYmVkZGVkIGZhdWx0IHdoaWNoIGNhdXNlZCB0aGlzIG9uZQotICAgICAqLwotICAgIHB1YmxpYyBBeGlzRmF1bHQoUU5hbWUgZmF1bHRDb2RlLExpc3QgZmF1bHRTdWJDb2RlcywgU3RyaW5nIGZhdWx0UmVhc29uLCBUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgdGhpcyhmYXVsdFJlYXNvbiwgY2F1c2UpOwotICAgICAgICBzZXRGYXVsdENvZGUoZmF1bHRDb2RlKTsKLSAgICAgICAgc2V0RmF1bHRTdWJDb2RlcyhmYXVsdFN1YkNvZGVzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvcgotICAgICAqCi0gICAgICogQHBhcmFtIGZhdWx0Q29kZSBhIFFOYW1lIGZvciB0aGUgZmF1bHQgY29kZQotICAgICAqIEBwYXJhbSBmYXVsdFJlYXNvbiB0aGUgcmVhc29uIGZvciB0aGUgZmF1bHQuIFRoZSBsYW5ndWFnZSB3aWxsIGJlIGRlZmF1bHRlZCB0byAnZW4nCi0gICAgICogQHBhcmFtIGZhdWx0Tm9kZSBhIFVSTCBpZGVudGlmeWluZyB0aGUgU09BUCBub2RlIGdlbmVyYXRpbmcgdGhpcyBmYXVsdCwgb3IgbnVsbAotICAgICAqIEBwYXJhbSBmYXVsdFJvbGUgYSBVUkwgaWRlbnRpZnlpbmcgdGhlIFNPQVAgcm9sZSBhY3RpdmUgd2hlbiBnZW5lcmF0aW5nIHRoaXMgZmF1bHQsIG9yIG51bGwKLSAgICAgKiBAcGFyYW0gZmF1bHREZXRhaWwgYXJiaXRyYXJ5IFhNTCBjb250YWluaW5nIGFwcGxpY2F0aW9uLXNwZWNpZmljIGZhdWx0IGRhdGEKLSAgICAgKi8KLSAgICBwdWJsaWMgQXhpc0ZhdWx0KFFOYW1lIGZhdWx0Q29kZSwgU3RyaW5nIGZhdWx0UmVhc29uLCBTdHJpbmcgZmF1bHROb2RlLCBTdHJpbmcgZmF1bHRSb2xlLAotICAgICAgICAgICAgICAgICAgICAgT01FbGVtZW50IGZhdWx0RGV0YWlsKSB7Ci0gICAgICAgIHRoaXMoZmF1bHRSZWFzb24sIGZhdWx0Q29kZSk7Ci0gICAgICAgIHRoaXMuZmF1bHROb2RlID0gZmF1bHROb2RlOwotICAgICAgICB0aGlzLmZhdWx0Um9sZSA9IGZhdWx0Um9sZTsKLSAgICAgICAgc2V0RGV0YWlsKGZhdWx0RGV0YWlsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIGlzIGp1c3QgYSBjb252ZW5pZW5jZSBtZXRob2QgZm9yIHRoZSB1c2VyLiBJZiB5b3Ugc2V0IHRoZXNlLCBkbyBub3QgdXNlIG90aGVyIG1ldGhvZHMKLSAgICAgKiBpbiB0aGlzIGNsYXNzIHRvIGdldCBhbmQgc2V0IHRoaW5ncy4KLSAgICAgKiBBbnkgb2YgdGhlIHBhcmFtZXRlcnMgY2FuIGJlIG51bGwKLSAgICAgKgotICAgICAqIEBwYXJhbSBzb2FwRmF1bHRDb2RlIHRoZSBmYXVsdCBjb2RlCi0gICAgICogQHBhcmFtIHNvYXBGYXVsdFJlYXNvbiB0aGUgZmF1bHQgcmVhc29uCi0gICAgICogQHBhcmFtIHNvYXBGYXVsdE5vZGUgdGhlIFNPQVBGYXVsdE5vZGUgcmVwcmVzZW50aW5nIHRoZSBzb3VyY2Ugbm9kZSBmb3IgdGhpcyBmYXVsdAotICAgICAqIEBwYXJhbSBzb2FwRmF1bHRSb2xlIHRoZSBTT0FQRmF1bHRSb2xlIHJlcHJlc2VudGluZyB0aGUgc291cmNlIHJvbGUgZm9yIHRoaXMgZmF1bHQKLSAgICAgKiBAcGFyYW0gc29hcEZhdWx0RGV0YWlsIHRoZSBTT0FQRmF1bHREZXRhaWwgY29udGFpbmluZyBhbnkgYXBwbGljYXRpb24tc3BlY2lmaWMgaW5mbwotICAgICAqLwotICAgIHB1YmxpYyBBeGlzRmF1bHQoU09BUEZhdWx0Q29kZSBzb2FwRmF1bHRDb2RlLCBTT0FQRmF1bHRSZWFzb24gc29hcEZhdWx0UmVhc29uLAotICAgICAgICAgICAgICAgICAgICAgU09BUEZhdWx0Tm9kZSBzb2FwRmF1bHROb2RlLCBTT0FQRmF1bHRSb2xlIHNvYXBGYXVsdFJvbGUsCi0gICAgICAgICAgICAgICAgICAgICBTT0FQRmF1bHREZXRhaWwgc29hcEZhdWx0RGV0YWlsKSB7Ci0gICAgICAgIGluaXRpYWxpemVWYWx1ZXMoc29hcEZhdWx0Q29kZSwgc29hcEZhdWx0UmVhc29uLCBzb2FwRmF1bHROb2RlLCBzb2FwRmF1bHRSb2xlLAotICAgICAgICAgICAgICAgICAgICAgICAgIHNvYXBGYXVsdERldGFpbCk7Ci0gICAgfQotCi0gICAgcHVibGljIEF4aXNGYXVsdChTT0FQRmF1bHQgZmF1bHQpIHsKLSAgICAgICAgaW5pdGlhbGl6ZVZhbHVlcyhmYXVsdCk7Ci0gICAgfQotCi0gICAgcHVibGljIEF4aXNGYXVsdChTT0FQRmF1bHQgZmF1bHQsIE1lc3NhZ2VDb250ZXh0IGZhdWx0Q3R4KSB7Ci0gICAgICAgIGluaXRpYWxpemVWYWx1ZXMoZmF1bHQpOwotICAgICAgICBmYXVsdE1lc3NhZ2VDb250ZXh0ID0gZmF1bHRDdHg7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVWYWx1ZXMoU09BUEZhdWx0IGZhdWx0KSB7Ci0gICAgICAgIGlmIChmYXVsdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbml0aWFsaXplVmFsdWVzKGZhdWx0LmdldENvZGUoKSwgZmF1bHQuZ2V0UmVhc29uKCksIGZhdWx0LmdldE5vZGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmF1bHQuZ2V0Um9sZSgpLCBmYXVsdC5nZXREZXRhaWwoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVZhbHVlcyhTT0FQRmF1bHRDb2RlIHNvYXBGYXVsdENvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09BUEZhdWx0UmVhc29uIHNvYXBGYXVsdFJlYXNvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT0FQRmF1bHROb2RlIHNvYXBGYXVsdE5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09BUEZhdWx0Um9sZSBzb2FwRmF1bHRSb2xlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPQVBGYXVsdERldGFpbCBzb2FwRmF1bHREZXRhaWwpIHsKLSAgICAgICAgdGhpcy5zb2FwRmF1bHRDb2RlID0gc29hcEZhdWx0Q29kZTsKLSAgICAgICAgdGhpcy5zb2FwRmF1bHRSZWFzb24gPSBzb2FwRmF1bHRSZWFzb247Ci0gICAgICAgIHRoaXMuc29hcEZhdWx0Tm9kZSA9IHNvYXBGYXVsdE5vZGU7Ci0gICAgICAgIHRoaXMuc29hcEZhdWx0Um9sZSA9IHNvYXBGYXVsdFJvbGU7Ci0gICAgICAgIHRoaXMuc29hcEZhdWx0RGV0YWlsID0gc29hcEZhdWx0RGV0YWlsOwotCi0gICAgICAgIGlmIChzb2FwRmF1bHREZXRhaWwgIT0gbnVsbCkgewotLy8gICAgICAgICAgICBPTUVsZW1lbnQgZXhjZXB0aW9uRWxlbWVudCA9IHNvYXBGYXVsdERldGFpbC5nZXRGaXJzdENoaWxkV2l0aE5hbWUoCi0vLyAgICAgICAgICAgICAgICAgICAgbmV3IFFOYW1lKFNPQVBDb25zdGFudHMuU09BUF9GQVVMVF9ERVRBSUxfRVhDRVBUSU9OX0VOVFJZKSk7Ci0vLyAgICAgICAgICAgIGlmIChleGNlcHRpb25FbGVtZW50ICE9IG51bGwgJiYgZXhjZXB0aW9uRWxlbWVudC5nZXRUZXh0KCkgIT0gbnVsbCkgewotLy8gICAgICAgICAgICAgICAgY2F1c2UgPSBuZXcgRXhjZXB0aW9uKGV4Y2VwdGlvbkVsZW1lbnQuZ2V0VGV4dCgpKTsKLS8vICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBUT0RPIC0gV2hhPyBEZXRhaWxzIGNhbiBoYXZlIG11bHRpcGxlIGVsZW1lbnRzLCB3aHkgdGFrZSB0aGUgZmlyc3QgY2hpbGQgaGVyZT8KLSAgICAgICAgICAgIC8vIFRPRE8gLSBSZXZpZXcgdGhlIEFQSSBmb3IgZGV0YWlscwotICAgICAgICAgICAgLy8gc2V0dGluZyB0aGUgZmlyc3QgY2hpbGQgZWxlbWVudCBvZiB0aGUgZmF1bHQgZGV0YWlsIGFzIHRoaXMuZGV0YWlsCi0gICAgICAgICAgICB0aGlzLmRldGFpbCA9IHNvYXBGYXVsdERldGFpbC5nZXRGaXJzdEVsZW1lbnQoKTsKLQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNvYXBGYXVsdFJlYXNvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtZXNzYWdlID0gc29hcEZhdWx0UmVhc29uLmdldFRleHQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzb2FwRmF1bHRDb2RlICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIFRoaXMgd29ya3MgdGhlIHNhbWUgcmVnYXJkbGVzcyBvZiBTT0FQIHZlcnNpb24KLSAgICAgICAgICAgIGZhdWx0Q29kZSA9IHNvYXBGYXVsdENvZGUuZ2V0VGV4dEFzUU5hbWUoKTsKLQotICAgICAgICAgICAgU09BUEZhdWx0U3ViQ29kZSBzdWJDb2RlID0gc29hcEZhdWx0Q29kZS5nZXRTdWJDb2RlKCk7Ci0gICAgICAgICAgICBpZiAoc3ViQ29kZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZmF1bHRTdWJDb2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAoc3ViQ29kZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZhdWx0U3ViQ29kZXMuYWRkKHN1YkNvZGUuZ2V0VmFsdWUoKS5nZXRUZXh0QXNRTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgc3ViQ29kZSA9IHN1YkNvZGUuZ2V0U3ViQ29kZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdCBhIGZhdWx0IGZyb20gYSBUaHJvd2FibGUuICBUaGlzIGlzIGEgcHJvdGVjdGVkIGNvbnN0cnVjdG9yIC0gaW4gZ2VuZXJhbAotICAgICAqIHRvIG1ha2UgYW4gQXhpc0ZhdWx0IGZyb20gYW4gRXhjZXB0aW9uLCB5b3Ugc2hvdWxkIGJlIGNhbGxpbmcgQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKSwKLSAgICAgKiB3aGljaCBwcmV2ZW50cyBBeGlzRmF1bHRzIHdpdGhpbiBBeGlzRmF1bHRzLgotICAgICAqCi0gICAgICogQHBhcmFtIGNhdXNlIHRoZSBUaHJvd2FibGUgdGhhdCBjYXVzZWQgdGhlIHByb2JsZW0KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQXhpc0ZhdWx0KFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICB0aGlzKChjYXVzZSAhPSBudWxsKQotICAgICAgICAgICAgICAgID8gY2F1c2UuZ2V0TWVzc2FnZSgpCi0gICAgICAgICAgICAgICAgOiBudWxsLCBjYXVzZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVzc2FnZVRleHQgLSB0aGlzIHdpbGwgYXBwZWFyIGFzIHRoZSBUZXh0IGluIHRoZSBSZWFzb24gaW5mb3JtYXRpb24gaXRlbSBvZiBTT0FQIEZhdWx0Ci0gICAgICogQHBhcmFtIGZhdWx0Q29kZSAgIC0gdGhpcyB3aWxsIGFwcGVhciBhcyB0aGUgVmFsdWUgaW4gdGhlIENvZGUgaW5mb3JtYXRpb24gaXRlbSBvZiBTT0FQIEZhdWx0Ci0gICAgICovCi0gICAgcHVibGljIEF4aXNGYXVsdChTdHJpbmcgbWVzc2FnZVRleHQsIFN0cmluZyBmYXVsdENvZGUpIHsKLSAgICAgICAgdGhpcyhtZXNzYWdlVGV4dCk7Ci0gICAgICAgIHNldEZhdWx0Q29kZShmYXVsdENvZGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVzc2FnZVRleHQgdGhpcyB3aWxsIGFwcGVhciBhcyB0aGUgVGV4dCBpbiB0aGUgUmVhc29uIGluZm9ybWF0aW9uIGl0ZW0gb2YgU09BUCBGYXVsdAotICAgICAqIEBwYXJhbSBmYXVsdENvZGUgdGhpcyB3aWxsIGFwcGVhciBhcyB0aGUgVmFsdWUgaW4gdGhlIENvZGUgaW5mb3JtYXRpb24gaXRlbSBvZiBTT0FQIEZhdWx0Ci0gICAgICovCi0gICAgcHVibGljIEF4aXNGYXVsdChTdHJpbmcgbWVzc2FnZVRleHQsIFFOYW1lIGZhdWx0Q29kZSkgewotICAgICAgICB0aGlzKG1lc3NhZ2VUZXh0KTsKLSAgICAgICAgc2V0RmF1bHRDb2RlKGZhdWx0Q29kZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IKLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXNzYWdlIHRoaXMgd2lsbCBhcHBlYXIgYXMgdGhlIFRleHQgaW4gdGhlIFJlYXNvbiBpbmZvcm1hdGlvbiBpdGVtIG9mIFNPQVAgRmF1bHQKLSAgICAgKiBAcGFyYW0gY2F1c2UgdGhlIGVtYmVkZGVkIFRocm93YWJsZSB0aGF0IGNhdXNlZCB0aGlzIGZhdWx0Ci0gICAgICovCi0gICAgcHVibGljIEF4aXNGYXVsdChTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGNhdXNlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UsIGNhdXNlKTsKLQotICAgICAgICBpZiAobWVzc2FnZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBhZGRSZWFzb24obWVzc2FnZSk7Ci0gICAgICAgICAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIG1lc3NhZ2VUZXh0IC0gdGhpcyB3aWxsIGFwcGVhciBhcyB0aGUgVGV4dCBpbiB0aGUgUmVhc29uIGluZm9ybWF0aW9uIGl0ZW0gb2YgU09BUCBGYXVsdAotICAgICAqIEBwYXJhbSBmYXVsdENvZGUgICAtIHRoaXMgd2lsbCBhcHBlYXIgYXMgdGhlIFZhbHVlIGluIHRoZSBDb2RlIGluZm9ybWF0aW9uIGl0ZW0gb2YgU09BUCBGYXVsdAotICAgICAqIEBwYXJhbSBjYXVzZSAgICAgICAtIHRoaXMgd2lsbCBhcHBlYXIgdW5kZXIgdGhlIERldGFpbCBpbmZvcm1hdGlvbiBpdGVtIG9mIFNPQVAgRmF1bHQKLSAgICAgKi8KLSAgICBwdWJsaWMgQXhpc0ZhdWx0KFN0cmluZyBtZXNzYWdlVGV4dCwgUU5hbWUgZmF1bHRDb2RlLCBUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgdGhpcyhtZXNzYWdlVGV4dCwgY2F1c2UpOwotICAgICAgICBzZXRGYXVsdENvZGUoZmF1bHRDb2RlKTsKLSAgICB9Ci0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAcGFyYW0gbWVzc2FnZQotICAgICAqIEBwYXJhbSBmYXVsdE1lc3NhZ2VDb250ZXh0Ci0gICAgICogQHBhcmFtIGNhdXNlCi0gICAgICovCi0gICAgcHVibGljIEF4aXNGYXVsdChTdHJpbmcgbWVzc2FnZSwgTWVzc2FnZUNvbnRleHQgZmF1bHRNZXNzYWdlQ29udGV4dCwgVGhyb3dhYmxlIGNhdXNlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UsIGNhdXNlKTsKLQotICAgICAgICB0aGlzLmZhdWx0TWVzc2FnZUNvbnRleHQgPSBmYXVsdE1lc3NhZ2VDb250ZXh0OwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIG1lc3NhZ2VUZXh0IC0gdGhpcyB3aWxsIGFwcGVhciBhcyB0aGUgVGV4dCBpbiB0aGUgUmVhc29uIGluZm9ybWF0aW9uIGl0ZW0gb2YgU09BUCBGYXVsdAotICAgICAqIEBwYXJhbSBmYXVsdENvZGUgICAtIHRoaXMgd2lsbCBhcHBlYXIgYXMgdGhlIFZhbHVlIGluIHRoZSBDb2RlIGluZm9ybWF0aW9uIGl0ZW0gb2YgU09BUCBGYXVsdAotICAgICAqIEBwYXJhbSBjYXVzZSAgICAgICAtIHRoaXMgd2lsbCBhcHBlYXIgdW5kZXIgdGhlIERldGFpbCBpbmZvcm1hdGlvbiBpdGVtIG9mIFNPQVAgRmF1bHQKLSAgICAgKi8KLSAgICBwdWJsaWMgQXhpc0ZhdWx0KFN0cmluZyBtZXNzYWdlVGV4dCwgU3RyaW5nIGZhdWx0Q29kZSwgVGhyb3dhYmxlIGNhdXNlKSB7Ci0gICAgICAgIHRoaXMobWVzc2FnZVRleHQsIGNhdXNlKTsKLSAgICAgICAgc2V0RmF1bHRDb2RlKGZhdWx0Q29kZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIEF4aXNGYXVsdCBieSBwcm92aWRpbmcgYSB0ZXh0dWFsIG1lc3NhZ2UgYW5kIGEgTWVzc2FnZUNvbnRleHQKLSAgICAgKiB0aGF0IGNvbnRhaW5zIHRoZSBhY3R1YWwgZmF1bHQgcmVwcmVzZW50YXRpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVzc2FnZSAgICAgICAgICAgICBBIHN0cmluZyB0aGF0J3MgcmVhbGx5IG9ubHkgdXNlZnVsIGZvciBsb2dnaW5nLgotICAgICAqIEBwYXJhbSBmYXVsdE1lc3NhZ2VDb250ZXh0IEEgTWVzc2FnZUNvbnRleHQgd2hpY2ggbXVzdCBjb250YWluIFNPQVAgZmF1bHQgaW5mbwotICAgICAqLwotICAgIHB1YmxpYyBBeGlzRmF1bHQoU3RyaW5nIG1lc3NhZ2UsIE1lc3NhZ2VDb250ZXh0IGZhdWx0TWVzc2FnZUNvbnRleHQpIHsKLSAgICAgICAgdGhpcyhtZXNzYWdlKTsKLSAgICAgICAgdGhpcy5mYXVsdE1lc3NhZ2VDb250ZXh0ID0gZmF1bHRNZXNzYWdlQ29udGV4dDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgYSBoZWFkZXIgdG8gdGhlIGxpc3Qgb2YgZmF1bHQgaGVhZGVycwotICAgICAqCi0gICAgICogQHBhcmFtIGhlYWRlciB0byBhZGQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkSGVhZGVyKFNPQVBIZWFkZXJCbG9jayBoZWFkZXIpIHsKLSAgICAgICAgaGVhZGVycy5hZGQoaGVhZGVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgYSByZWFzb24gZm9yIHRoZSBmYXVsdCBpbiB0aGUgZW1wdHkgIiIgbGFuZ3VhZ2UKLSAgICAgKgotICAgICAqIEBwYXJhbSB0ZXh0IHRleHQgbWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZFJlYXNvbihTdHJpbmcgdGV4dCkgewotICAgICAgICBmYXVsdFJlYXNvbkxpc3QuYWRkKG5ldyBGYXVsdFJlYXNvbih0ZXh0LCAiIikpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZCBhIHJlYXNvbiBmb3IgdGhlIGZhdWx0Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gdGV4dCAgICAgdGV4dCBtZXNzYWdlCi0gICAgICogQHBhcmFtIGxhbmd1YWdlIGxhbmd1YWdlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkUmVhc29uKFN0cmluZyB0ZXh0LCBTdHJpbmcgbGFuZ3VhZ2UpIHsKLSAgICAgICAgZmF1bHRSZWFzb25MaXN0LmFkZChuZXcgRmF1bHRSZWFzb24odGV4dCwgbGFuZ3VhZ2UpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBmaXJzdCBmYXVsdCByZWFzb24sIGlmIGF2YWlsYWJsZS4gSWYgbm90IGZvdW5kLCByZXR1cm5zIG51bGwuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGZhdWx0UmVhc29uCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRSZWFzb24oKSB7Ci0gICAgICAgIGlmIChmYXVsdFJlYXNvbkxpc3Quc2l6ZSgpID49IDEpIHsKLSAgICAgICAgICAgIHJldHVybiAoKEZhdWx0UmVhc29uKSBmYXVsdFJlYXNvbkxpc3QuZ2V0KDApKS5nZXRUZXh0KCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc29hcEZhdWx0UmVhc29uICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBzb2FwRmF1bHRSZWFzb24uZ2V0VGV4dCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSXRlcmF0ZSBvdmVyIGFsbCBvZiB0aGUgaGVhZGVycwotICAgICAqCi0gICAgICogQHJldHVybiBpdGVyYXRvcgotICAgICAqLwotICAgIHB1YmxpYyBMaXN0SXRlcmF0b3IgaGVhZGVySXRlcmF0b3IoKSB7Ci0gICAgICAgIHJldHVybiBoZWFkZXJzLmxpc3RJdGVyYXRvcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBhdCB0aGUgaGVhZGVycy4gVXNlZnVsIGZvciBqYXZhMS41IGl0ZXJhdGlvbi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIGhlYWRlcnMgZm9yIHRoaXMgZmF1bHQKLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdCBoZWFkZXJzKCkgewotICAgICAgICByZXR1cm4gaGVhZGVyczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNYWtlIGFuIEF4aXNGYXVsdCBiYXNlZCBvbiBhIHBhc3NlZCBFeGNlcHRpb24uICBJZiB0aGUgRXhjZXB0aW9uIGlzCi0gICAgICogYWxyZWFkeSBhbiBBeGlzRmF1bHQsIHNpbXBseSB1c2UgdGhhdC4gIE90aGVyd2lzZSwgd3JhcCBpdCBpbiBhbgotICAgICAqIEF4aXNGYXVsdC4gIElmIHRoZSBFeGNlcHRpb24gaXMgYW4gSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiAod2hpY2gKLSAgICAgKiBhbHJlYWR5IHdyYXBzIGFub3RoZXIgRXhjZXB0aW9uKSwgZ2V0IHRoZSB3cmFwcGVkIEV4Y2VwdGlvbiBvdXQgZnJvbQotICAgICAqIHRoZXJlIGFuZCB1c2UgdGhhdCBpbnN0ZWFkIG9mIHRoZSBwYXNzZWQgb25lLgotICAgICAqCi0gICAgICogQHBhcmFtIGUgdGhlIDxjb2RlPkV4Y2VwdGlvbjwvY29kZT4gdG8gYnVpbGQgYSBmYXVsdCBmb3IKLSAgICAgKiBAcmV0dXJuIGFuIDxjb2RlPkF4aXNGYXVsdDwvY29kZT4gcmVwcmVzZW50aW5nIDxjb2RlPmU8L2NvZGU+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBBeGlzRmF1bHQgbWFrZUZhdWx0KFRocm93YWJsZSBlKSB7Ci0gICAgICAgIGlmIChlIGluc3RhbmNlb2YgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbikgewotICAgICAgICAgICAgcmV0dXJuIG1ha2VGYXVsdCgoKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24pIGUpLmdldFRhcmdldEV4Y2VwdGlvbigpKTsKLSAgICAgICAgfSBlbHNlIGlmIChlIGluc3RhbmNlb2YgVW5kZWNsYXJlZFRocm93YWJsZUV4Y2VwdGlvbikgewotICAgICAgICAgICAgVGhyb3dhYmxlIHQgPSAoKFVuZGVjbGFyZWRUaHJvd2FibGVFeGNlcHRpb24pIGUpLmdldENhdXNlKCk7Ci0gICAgICAgICAgICBpZiAodCBpbnN0YW5jZW9mIEV4Y2VwdGlvbikgewotICAgICAgICAgICAgICAgIGUgPSAoRXhjZXB0aW9uKSB0OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChlIGluc3RhbmNlb2YgQXhpc0ZhdWx0KSB7Ci0gICAgICAgICAgICByZXR1cm4gKEF4aXNGYXVsdCkgZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBuZXcgQXhpc0ZhdWx0KGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgY3VycmVudCBmYXVsdCBkZXRhaWwKLSAgICAgKgotICAgICAqIEByZXR1cm4gb20gZWxlbWVudAotICAgICAqLwotICAgIHB1YmxpYyBPTUVsZW1lbnQgZ2V0RGV0YWlsKCkgewotICAgICAgICByZXR1cm4gZGV0YWlsOwotICAgIH0KLQotICAgIHB1YmxpYyBRTmFtZSBnZXRGYXVsdENvZGUoKSB7Ci0gICAgICAgIHJldHVybiBmYXVsdENvZGU7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3QgZ2V0RmF1bHRTdWJDb2RlcygpIHsKLSAgICAgICAgcmV0dXJuIGZhdWx0U3ViQ29kZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBTT0FQRmF1bHRDb2RlIGlmLCB1c2VyIGhhcyBzZXQgYSB7QGxpbmsgU09BUEZhdWx0Q29kZX0gZWxlbWVudCB3aGVuIGNvbnN0cnVjdGluZyB0aGUKLSAgICAgKiAgICAgICAgIHtAbGluayAjQXhpc0ZhdWx0KG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmF1bHRDb2RlLCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhdWx0UmVhc29uLCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhdWx0Tm9kZSwgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYXVsdFJvbGUsIG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmF1bHREZXRhaWwpIEF4aXNGYXVsdH0KLSAgICAgKi8KLSAgICBwdWJsaWMgU09BUEZhdWx0Q29kZSBnZXRGYXVsdENvZGVFbGVtZW50KCkgewotICAgICAgICByZXR1cm4gc29hcEZhdWx0Q29kZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFNPQVBGYXVsdENvZGUgaWYsIHVzZXIgaGFzIHNldCBhIHtAbGluayBTT0FQRmF1bHRSZWFzb259IGVsZW1lbnQgd2hlbiBjb25zdHJ1Y3RpbmcgdGhlCi0gICAgICogICAgICAgICB7QGxpbmsgI0F4aXNGYXVsdChvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhdWx0Q29kZSwgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYXVsdFJlYXNvbiwgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYXVsdE5vZGUsIG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmF1bHRSb2xlLCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhdWx0RGV0YWlsKSBBeGlzRmF1bHR9Ci0gICAgICovCi0gICAgcHVibGljIFNPQVBGYXVsdFJlYXNvbiBnZXRGYXVsdFJlYXNvbkVsZW1lbnQoKSB7Ci0gICAgICAgIHJldHVybiBzb2FwRmF1bHRSZWFzb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBTT0FQRmF1bHRDb2RlIGlmLCB1c2VyIGhhcyBzZXQgYSB7QGxpbmsgU09BUEZhdWx0Tm9kZX0gZWxlbWVudCB3aGVuIGNvbnN0cnVjdGluZyB0aGUKLSAgICAgKiAgICAgICAgIHtAbGluayAjQXhpc0ZhdWx0KG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmF1bHRDb2RlLCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhdWx0UmVhc29uLCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhdWx0Tm9kZSwgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYXVsdFJvbGUsIG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmF1bHREZXRhaWwpIEF4aXNGYXVsdH0KLSAgICAgKi8KLSAgICBwdWJsaWMgU09BUEZhdWx0Tm9kZSBnZXRGYXVsdE5vZGVFbGVtZW50KCkgewotICAgICAgICByZXR1cm4gc29hcEZhdWx0Tm9kZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFNPQVBGYXVsdENvZGUgaWYsIHVzZXIgaGFzIHNldCBhIHtAbGluayBTT0FQRmF1bHRSb2xlfSBlbGVtZW50IHdoZW4gY29uc3RydWN0aW5nIHRoZQotICAgICAqICAgICAgICAge0BsaW5rICNBeGlzRmF1bHQob3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYXVsdENvZGUsIG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmF1bHRSZWFzb24sIG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmF1bHROb2RlLCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhdWx0Um9sZSwgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYXVsdERldGFpbCkgQXhpc0ZhdWx0fQotICAgICAqLwotICAgIHB1YmxpYyBTT0FQRmF1bHRSb2xlIGdldEZhdWx0Um9sZUVsZW1lbnQoKSB7Ci0gICAgICAgIHJldHVybiBzb2FwRmF1bHRSb2xlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gU09BUEZhdWx0Q29kZSBpZiwgdXNlciBoYXMgc2V0IGEge0BsaW5rIFNPQVBGYXVsdERldGFpbH0gZWxlbWVudCB3aGVuIGNvbnN0cnVjdGluZyB0aGUKLSAgICAgKiAgICAgICAgIHtAbGluayAjQXhpc0ZhdWx0KG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmF1bHRDb2RlLCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhdWx0UmVhc29uLCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhdWx0Tm9kZSwgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYXVsdFJvbGUsIG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmF1bHREZXRhaWwpIEF4aXNGYXVsdH0KLSAgICAgKi8KLSAgICBwdWJsaWMgU09BUEZhdWx0RGV0YWlsIGdldEZhdWx0RGV0YWlsRWxlbWVudCgpIHsKLSAgICAgICAgcmV0dXJuIHNvYXBGYXVsdERldGFpbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGZhdWx0aW5nIG5vZGUgdXJpLgotICAgICAqIFNPQVAxLjIKLSAgICAgKgotICAgICAqIEByZXR1cm4gVVJJIGFzIGEgc3RyaW5nIG9yIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5vZGVVUkkoKSB7Ci0gICAgICAgIHJldHVybiBub2RlVVJJOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgZW50aXJlIGRldGFpbCBlbGVtZW50IG9mIHRoZSBmYXVsdAotICAgICAqCi0gICAgICogQHBhcmFtIGRldGFpbCBhbiBPTUVsZW1lbnQgd2hpY2ggTVVTVCBiZSAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREZXRhaWwoT01FbGVtZW50IGRldGFpbCkgewotICAgICAgICB0aGlzLmRldGFpbCA9IGRldGFpbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRGYXVsdENvZGUoUU5hbWUgc29hcEZhdWx0Q29kZSkgewotICAgICAgICB0aGlzLmZhdWx0Q29kZSA9IHNvYXBGYXVsdENvZGU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldEZhdWx0U3ViQ29kZXMoTGlzdCBmYXVsdFN1YkNvZGVzKSB7Ci0gICAgICAgIHRoaXMuZmF1bHRTdWJDb2RlcyA9IGZhdWx0U3ViQ29kZXM7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldEZhdWx0Q29kZShTdHJpbmcgc29hcEZhdWx0Q29kZSkgewotICAgICAgICAvLyBUT0RPOiBpcyBpdCByZWFsbHkgc2FmZSB0byBhc3N1bWUgdGhhdCB0aGUgcGFzc2VkIHN0cmluZyBpcyBhbHdheXMgdGhlIGxvY2FscGFydD8KLSAgICAgICAgLy8gV2hhdCBpZiBzb21lb25lIHBhc3NlcyBzb2FwZW52OlNlbmRlcj8KLSAgICAgICAgZmF1bHRDb2RlID0gbmV3IFFOYW1lKHNvYXBGYXVsdENvZGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgZmF1bHRpbmcgbm9kZSB1cmkuIChTT0FQMS4yKQotICAgICAqCi0gICAgICogQHBhcmFtIG5vZGVVUkkgYSBTdHJpbmcgY29udGFpbmluZyBhIFVSSSBpbmRpY2F0aW5nIHdoaWNoIFNPQVAgTm9kZSBmYXVsdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Tm9kZVVSSShTdHJpbmcgbm9kZVVSSSkgewotICAgICAgICB0aGlzLm5vZGVVUkkgPSBub2RlVVJJOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmF1bHROb2RlKCkgewotICAgICAgICByZXR1cm4gZmF1bHROb2RlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmF1bHRSb2xlKCkgewotICAgICAgICByZXR1cm4gZmF1bHRSb2xlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIE1lc3NhZ2VDb250ZXh0IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBmYXVsdCBpZiB0aGUgZmF1bHQKLSAgICAgKiB3YXMgY3JlYXRlZCBieSBwcm92aWRpbmcgdGhhdC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIE1lc3NhZ2VDb250ZXh0IHJlcHJlc2VudGluZyB0aGUgZmF1bHQgbWVzc2FnZSBvciBudWxsIGlmIHRoZQotICAgICAqICAgICAgICAgZmF1bHQgd2FzIG5vdCBjcmVhdGVkIHdpdGggTWVzc2FnZUNvbnRleHQgcmVwcmVzZW50YXRpb24uCi0gICAgICovCi0gICAgcHVibGljIE1lc3NhZ2VDb250ZXh0IGdldEZhdWx0TWVzc2FnZUNvbnRleHQoKSB7Ci0gICAgICAgIHJldHVybiBmYXVsdE1lc3NhZ2VDb250ZXh0OwotICAgIH0KLQotICAgIGNsYXNzIEZhdWx0UmVhc29uIGltcGxlbWVudHMgU2VyaWFsaXphYmxlewotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTgxMjU5OTE0MjI2MTQ2MDcxNjlMOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBMYW5ndWFnZSBvZiB0aGUgcmVhc29uLgotICAgICAgICAgKiB4bWw6bGFuZz0iZW4iICJlbi1HQiIgb3IganVzdCAiIgotICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbGFuZ3VhZ2UgPSAiIjsKLQotICAgICAgICAvKioKLSAgICAgICAgICogZW52OnJlYXNvbnRleHQKLSAgICAgICAgICovCi0gICAgICAgIHByaXZhdGUgU3RyaW5nIHRleHQ7Ci0KLSAgICAgICAgcHVibGljIEZhdWx0UmVhc29uKCkgewotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEZhdWx0UmVhc29uKFN0cmluZyB0ZXh0LCBTdHJpbmcgbGFuZ3VhZ2UpIHsKLSAgICAgICAgICAgIHRoaXMudGV4dCA9IHRleHQ7Ci0gICAgICAgICAgICB0aGlzLmxhbmd1YWdlID0gbGFuZ3VhZ2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgb2JqZWN0LgotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIHRoZSB0ZXh0IHZhbHVlCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAgICAgcmV0dXJuIHRleHQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldExhbmd1YWdlKCkgewotICAgICAgICAgICAgcmV0dXJuIGxhbmd1YWdlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotICAgICAgICAgICAgcmV0dXJuIHRleHQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRMYW5ndWFnZShTdHJpbmcgbGFuZ3VhZ2UpIHsKLSAgICAgICAgICAgIHRoaXMubGFuZ3VhZ2UgPSBsYW5ndWFnZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIHRleHQpIHsKLSAgICAgICAgICAgIHRoaXMudGV4dCA9IHRleHQ7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgYWN0aW9uIHZhbHVlIHNldCBmb3IgdGhlIGZhdWx0IG1lc3NhZ2UgIAotICAgICAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RmF1bHRBY3Rpb24oKSB7Ci0JCXJldHVybiBmYXVsdEFjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIChPUFRJT05BTCkgYWN0aW9uIHZhbHVlIGZvciB0aGUgZmF1bHQgbWVzc2FnZQotICAgICAqCi0JICogQHBhcmFtIGZhdWx0QWN0aW9uIGEgU3RyaW5nIGNvbnRhaW5pbmcgYW4gYWN0aW9uIFVSSSBmb3IgdGhlIGZhdWx0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0RmF1bHRBY3Rpb24oU3RyaW5nIGZhdWx0QWN0aW9uKSB7Ci0JCXRoaXMuZmF1bHRBY3Rpb24gPSBmYXVsdEFjdGlvbjsKLQl9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBkZXRhaWwgbWVzc2FnZSwgaW5jbHVkaW5nIHRoZSBtZXNzYWdlIGZyb20gdGhlIGNhdXNlLCBpZiBhbnksIG9mIHRoaXMgZXhjZXB0aW9uLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgZGV0YWlsIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7Ci0gICAgICAgIHJldHVybiBtZXNzYWdlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHRoaXMgZmllbGQgaXMgdXNlZCB0byBpZGVudGlmeSB0aGUgYXhpczIgZmF1bHQgdHlwZQotICAgICAqLwotICAgIHByaXZhdGUgaW50IGZhdWx0VHlwZTsKLQotICAgIHB1YmxpYyBpbnQgZ2V0RmF1bHRUeXBlKCkgewotICAgICAgICByZXR1cm4gZmF1bHRUeXBlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEZhdWx0VHlwZShpbnQgZmF1bHRUeXBlKSB7Ci0gICAgICAgIHRoaXMuZmF1bHRUeXBlID0gZmF1bHRUeXBlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9Db25zdGFudHMuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9Db25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjAwMTBkYS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczI7Ci0KLS8qKgotICogQ2xhc3MgQ29uc3RhbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25zdGFudHMgZXh0ZW5kcyBvcmcuYXBhY2hlLmF4aXMyLm5hbWVzcGFjZS5Db25zdGFudHMgewotCi0gICAgLyoqCi0gICAgICogRmllbGQgU09BUF9TVFlMRV9SUENfRU5DT0RFRAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNPQVBfU1RZTEVfUlBDX0VOQ09ERUQgPSAxMDAwOwotCi0gICAgLyoqCi0gICAgICogRmllbGQgU09BUF9TVFlMRV9SUENfTElURVJBTAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNPQVBfU1RZTEVfUlBDX0xJVEVSQUwgPSAxMDAxOwotCi0gICAgLyoqCi0gICAgICogRmllbGQgU09BUF9TVFlMRV9ET0NfTElURVJBTF9XUkFQUEVECi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU09BUF9TVFlMRV9ET0NfTElURVJBTF9XUkFQUEVEID0gMTAwMjsKLQotICAgIC8qKgotICAgICAqIEZpZWxkIFNFU1NJT05fU0NPUEUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVNTSU9OX1NDT1BFID0gInNlc3Npb24iOwotCi0gICAgLyoqCi0gICAgICogRmllbGQgU0VTU0lPTl9DT05URVhUX1BST1BFUlRZCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VTU0lPTl9DT05URVhUX1BST1BFUlRZID0gIlNlc3Npb25Db250ZXh0IjsKLQotICAgIC8qKgotICAgICAqIEZpZWxkIFBIQVNFX1RSQU5TUE9SVAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBIQVNFX1RSQU5TUE9SVCA9ICJ0cmFuc3BvcnQiOwotCi0gICAgLyoqCi0gICAgICogRmllbGQgUEhBU0VfU0VSVklDRQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBIQVNFX1NFUlZJQ0UgPSAic2VydmljZSI7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBQSEFTRV9HTE9CQUwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQSEFTRV9HTE9CQUwgPSAiZ2xvYmFsIjsKLQotICAgIC8qKgotICAgICAqIEZpZWxkIE1FU1NBR0VfU0NPUEUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVNTQUdFX1NDT1BFID0gIm1lc3NhZ2UiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVhJU19CSU5ESU5HX09QRVJBVElPTiA9ICJBeGlzQmluZGluZ09wZXJhdGlvbiI7Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVhJU19CSU5ESU5HX01FU1NBR0UgPSAiQXhpc0JpbmRpbmdNZXNzYWdlIjsKLQotCi0gICAgLyoqCi0gICAgICogVG8gY2hlbmdlIHRoZSBjb25ldGV4dCBwYXRoIGZyb20gYXhpczIvc2VydmljZSB0byBzb21ldGhpbmcgZWxzZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX0NPTlRFWFRfUk9PVCA9ICJjb250ZXh0Um9vdCI7Ci0gICAgLyoqCi0gICAgICogVG8gY2hlbmFnZSB0aGUgc2VydmljZSBwYXRoIHRvIHNvbXRoaW5nIGVsc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9TRVJWSUNFX1BBVEggPSAic2VydmljZVBhdGgiOwotICAgIC8vUGFyYW1ldGVyIG5hbWUgZm9yIHRyYW5zcG9ydCBzZXNzaW9uIG1hbmFnZW1udHQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQU5BR0VfVFJBTlNQT1JUX1NFU1NJT04gPSAibWFuYWdlVHJhbnNwb3J0U2Vzc2lvbiI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQX1JFU1BPTlNFX1NUQVRFID0gImF4aXMyLmh0dHAucmVzcG9uc2Uuc3RhdGUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhUVFBfQkFTSUNfQVVUSF9SRUFMTSA9ICJheGlzMi5hdXRoZW50aWNhdGlvbi5yZWFsbSI7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBBUFBMSUNBVElPTl9TQ09QRQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNDT1BFX0FQUExJQ0FUSU9OID0gImFwcGxpY2F0aW9uIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQ09QRV9TT0FQX1NFU1NJT04gPSAic29hcHNlc3Npb24iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNDT1BFX1RSQU5TUE9SVF9TRVNTSU9OID0gInRyYW5zcG9ydHNlc3Npb24iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNDT1BFX1JFUVVFU1QgPSAicmVxdWVzdCI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBWElTMl9SRVBPID0gImF4aXMyLnJlcG8iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFYSVMyX0NPTkYgPSAiYXhpczIueG1sIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VSX0hPTUUgPSAidXNlci5ob21lIjsKLQotICAgIC8qKgotICAgICAqIEZpZWxkIFRSQU5TUE9SVF9UQ1AKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUUkFOU1BPUlRfVENQID0gInRjcCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJBTlNQT1JUX01BSUwgPSAibWFpbHRvIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUUkFOU1BPUlRfTE9DQUwgPSAibG9jYWwiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQU5TUE9SVF9KTVMgPSAiam1zIjsKLQotICAgIC8qKgotICAgICAqIEZpZWxkIFRSQU5TUE9SVF9IVFRQCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJBTlNQT1JUX0hUVFAgPSAiaHR0cCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJBTlNQT1JUX0hUVFBTID0gImh0dHBzIjsKLQotICAgIC8vUGFyYW1ldGVyIG5hbWUgb2YgU2VydmljZSBpbXBsIGNsYXNzCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVklDRV9DTEFTUyA9ICJTZXJ2aWNlQ2xhc3MiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZJQ0VfT0JKRUNUX1NVUFBMSUVSID0gIlNlcnZpY2VPYmplY3RTdXBwbGllciI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVklDRV9UQ0NMID0gIlNlcnZpY2VUQ0NMIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRDQ0xfREVGQVVMVCA9ICJkZWZhdWx0IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQ0NMX0NPTVBPU0lURSA9ICJjb21wb3NpdGUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRDQ0xfU0VSVklDRSA9ICJzZXJ2aWNlIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGQVVMVF9OQU1FID0gImZhdWx0TmFtZSI7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBSRVFVRVNUX1VSTF9QUkVGSVgKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSVNUX1BIQVNFUyA9ICJsaXN0UGhhc2VzIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSVNUX01PRFVMRVMgPSAibGlzdE1vZHVsZXMiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExJU1RfR0xPQUJMTFlfRU5HQUdFRF9NT0RVTEVTID0gImdsb2JhbE1vZHVsZXMiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExJU1RfQ09OVEVYVFMgPSAibGlzdENvbnRleHRzIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTkdBR0VfTU9EVUxFX1RPX1NFUlZJQ0VfR1JPVVAgPSAiZW5nYWdlVG9TZXJ2aWNlR3JvdXAiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOR0FHRV9NT0RVTEVfVE9fU0VSVklDRSA9ICJlbmdhZ2VUb1NlcnZpY2UiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOR0FHRV9HTE9CQUxfTU9EVUxFID0gImVuZ2FnaW5nZ2xvYmFsbHkiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFETUlOX0xPR0lOID0gImFkbWlubG9naW4iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFYSVNfV0VCX0NPTlRFTlRfUk9PVCA9ICIvYXhpczItd2ViLyI7Ci0KLSAgICAvKioKLSAgICAgKiBMaXN0IHNlcnZpY2UgZm9yIGFkbWluIHBhZ2VzCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQURNSU5fTElTVFNFUlZJQ0VTID0gImxpc3RTZXJ2aWNlIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSUVXX0dMT0JBTF9IQU5ETEVSUyA9ICJ2aWV3R2xvYmFsSGFuZGxlcnMiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFTEVDVF9TRVJWSUNFX0ZPUl9QQVJBX0VESVQgPSAic2VsZWN0U2VydmljZVBhcmFFZGl0IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRUxFQ1RfU0VSVklDRSA9ICJzZWxlY3RTZXJ2aWNlIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFRElUX1NFUlZJQ0VfUEFSQSA9ICJlZGl0U2VydmljZXBhcmEiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZJRVdfU0VSVklDRV9IQU5ETEVSUyA9ICJ2aWV3U2VydmljZUhhbmRsZXJzIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VSX05BTUUgPSAidXNlck5hbWUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFETUlOX1NFQ1VSSVRZX0RJU0FCTEVEID0gImRpc2FibGVBZG1pblNlY3VyaXR5IjsKLQotICAgIC8qKgotICAgICAqIEZpZWxkIFNJTkdMRV9TRVJWSUNFCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0lOR0xFX1NFUlZJQ0UgPSAic2luZ2xlc2VydmljZSI7Ci0KLSAgICAvKioKLSAgICAgKiBAZGVwcmVjYXRlZCBQbGVhc2UgdXNlIG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuSFRUUENvbnN0YW50cy5NQ19IVFRQX1NFUlZMRVRDT05URVhUCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVkxFVF9DT05URVhUID0gInRyYW5zcG9ydC5odHRwLnNlcnZsZXRDb250ZXh0IjsKLSAgICAvKioKLSAgICAgKiBAZGVwcmVjYXRlZCBQbGVhc2UgdXNlIG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuSFRUUENvbnN0YW50cy5NQ19IVFRQX1NFUlZMRVRSRVFVRVNUCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRUUF9TRVJWTEVUX1JFUVVFU1QgPSAidHJhbnNwb3J0Lmh0dHAuc2VydmxldFJlcXVlc3QiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVklDRV9NQVAgPSAic2VydmljZW1hcCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVklDRV9ST09UID0gInNlcnZpY2VSb290IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWSUNFX1BBVEggPSAic2VydmljZVBhdGgiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZJQ0VfSEFORExFUlMgPSAic2VydmljZUhhbmRsZXJzIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWSUNFX0dST1VQX01BUCA9ICJzZXJ2aWNlR3JvdXBtYXAiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZJQ0UgPSAic2VydmljZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VMRUNUX1NFUlZJQ0VfVFlQRSA9ICJTRUxFQ1RfU0VSVklDRV9UWVBFIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTl9BQ1RJVkFURV9TRVJWSUNFID0gImluQWN0aXZhdGVTZXJ2aWNlIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJVkFURV9TRVJWSUNFID0gImFjdGl2YXRlU2VydmljZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEhBU0VfTElTVCA9ICJwaGFzZUxpc3QiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBU1NXT1JEID0gInBhc3N3b3JkIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUEVSQVRJT05fTUFQID0gIm9wZXJhdGlvbm1hcCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9EVUxFX01BUCA9ICJtb2R1bGVtYXAiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1PRFVMRV9BRERSRVNTSU5HID0gImFkZHJlc3NpbmciOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExJU1RfU0VSVklDRV9HUk9VUFMgPSAibGlzdFNlcnZpY2VHcm91cHMiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExJU1RfT1BFUkFUSU9OU19GT1JfVEhFX1NFUlZJQ0UgPSAibGlzdE9wZXJhdGlvbnMiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElTX0ZBVUxUWSA9ICJGYXVsdCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0xPQkFMX0hBTkRMRVJTID0gImF4aXNjb25maWciOwotCi0gICAgLyoqCi0gICAgICogS2V5cyBmb3Igc2VydmljZS9tb2R1bGUgZXJyb3IgbWFwcwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX1NFUlZJQ0VfTUFQID0gImVycnByc2VydmljZW1hcCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfTU9EVUxFX01BUCA9ICJlcnJvcm1vZHVsZXNtYXAiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOR0FHRV9TVEFUVVMgPSAiZW5nYWdlc3RhdHVzIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdfQ09OVEVYVCA9ICJjb25maWdfY29udGV4dCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NETF9DT05URU5UID0gIndzZGwiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9NQVBQSU5HID0gImFjdGlvbk1hcHBpbmciOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9VVFBVVF9BQ1RJT05fTUFQUElORyA9ICJvdXRwdXRBY3Rpb25NYXBwaW5nIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGQVVMVF9BQ1RJT05fTUFQUElORyA9ICJmYXVsdEFjdGlvbk1hcHBpbmciOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBVUxUX0FDVElPTl9OQU1FID0gImZhdWx0TmFtZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfVFJVRSA9ICJ0cnVlIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9GQUxTRSA9ICJmYWxzZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfT1BUSU9OQUwgPSAib3B0aW9uYWwiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RJTkdfUEFUSCA9ICJ0YXJnZXQvdGVzdC1yZXNvdXJjZXMvIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUSU5HX1JFUE9TSVRPUlkgPSBURVNUSU5HX1BBVEggKyAic2FtcGxlcyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIFNFUlZJQ0VfTkFNRV9TUExJVF9DSEFSID0gJzonOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZJQ0VfR1JPVVBfSUQgPSAiU2VydmljZUdyb3VwSWQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU1BPTlNFX1dSSVRURU4gPSAiUkVTUE9OU0VfV1JJVFRFTiI7Ci0gICAgLy9UbyBoYXZlIGEgZmxvYWcgaWYgdGhlIHJlcGx5VG8gaXMgbm90IGFubm9uIG9uZQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJRkZFUkVOVF9FUFIgPSAiRElGRkVSRU5UX0VQUiI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIGNhbiBiZSBzZXQgaW4gdGhlIE1lc3NhZ2VDb250ZXh0IHRvIGdpdmUgYW4gcmVzcG9uc2UgY29kZSB0aGUgdHJhbnNwb3J0IHNob3VsZCB1c2Ugd2hlbiBzZW5kaW5nIGl0IG91dC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNQT05TRV9DT0RFID0gIlJFU1BPTlNFX0NPREUiOwotCi0gICAgLyoqCi0gICAgICogVHJhbnNwb3J0IEluZm8KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPVVRfVFJBTlNQT1JUX0lORk8gPSAiT3V0VHJhbnNwb3J0SW5mbyI7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBNRVRIT0RfTkFNRV9FU0NBUEVfQ0hBUkFDVEVSCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIE1FVEhPRF9OQU1FX0VTQ0FQRV9DSEFSQUNURVIgPSAnPyc7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HR0VEID0gIkxvZ2dlZCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEFJTkVSX01BTkFHRUQgPSAiQ29udGFpbmVyTWFuYWdlZCI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGQVVMVF9JTkZPUk1BVElPTl9GT1JfSEVBREVSUyA9ICJGYXVsdEhlYWRlcnMiOwotCi0gICAgLyoqCi0gICAgICogQGRlcHJlY2F0ZWQgUGxlYXNlIHVzZSBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkhUVFBDb25zdGFudHMuQ09PS0lFX1NUUklORwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPT0tJRV9TVFJJTkcgPSAiQ29va2llIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVNTSU9OX0NPT0tJRSA9ICJheGlzX3Nlc3Npb24iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFU1NJT05fQ09PS0lFX0pTRVNTSU9OSUQgPSAiSlNFU1NJT05JRCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX0NPT0tJRV9JRCA9ICJjdXN0b21Db29raWVJRCI7Ci0KLSAgICAvKioKLSAgICAgKiBBZGRyZXNzaW5nIENvbnN0YW50cwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFERFJFU1NJTkdfQUNUSU9OID0gIldTLUFkZHJlc3Npbmc6QWN0aW9uIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQX0ZST05URU5EX0hPU1RfVVJMID0gImh0dHBGcm9udGVuZEhvc3RVcmwiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfUkVTVF9QQVRIID0gInJlc3QiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfU0VSVklDRVNfUEFUSCA9ICJzZXJ2aWNlcyI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBUFBMSUNBVElPTl9GQVVMVCA9IDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFJBTlNQT1JUX0ZBVUxUID0gMjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTT0FQX1BST0NFU1NJTkdfRkFVTFQgPSAzOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQTElDQVRJT05fRkFVTFRfU1RSSU5HID0gImFwcGxpY2F0aW9uRmF1bHQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQU5TUE9SVF9GQVVMVF9TVFJJTkcgPSAidHJhbnNwb3J0RmF1bHQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNPQVBfUFJPQ0VTU0lOR19GQVVMVF9TVFJJTkcgPSAic29hcFByb2Nlc3NpbmdGYXVsdCI7Ci0KLSAgICAvLyB1c2VkIHRvIGhhbmRsZSBwaWdneSBiYWNrIG1lc3NhZ2VzIHdpdGggbWFpbCB0cmFuc3BvcnQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQSUdHWUJBQ0tfTUVTU0FHRSA9ICJwaWdneWJhY2tNZXNzYWdlIjsKLQotICAgIC8qKgotICAgICAqIEZpZWxkIEJ1aWxkZXIgU2VsZWN0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCVUlMREVSX1NFTEVDVE9SID0gImJ1aWxkZXJzZWxlY3RvciI7Ci0KLSAgICAvKioKLSAgICAgKiBQcm9wZXJ0eSBuYW1lIGZvciBpbmJvdW5kIGZhdWx0IHByb2Nlc3NvciB0byBzZXQgYSBmYXVsdCBvbiB0aGUgbWVzc2FnZQotICAgICAqIGNvbnRleHQgdG8gYmUgdGhyb3duIGJ5IHRoZSBjbGllbnQgY29kZSBpbiBmYXZvdXIgb2YgYSBzaW1wbGUgdHJhbnNsYXRpb24KLSAgICAgKiBmcm9tIFNPQVBGYXVsdCB0byBBeGlzRmF1bHQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTkJPVU5EX0ZBVUxUX09WRVJSSURFID0gImluYm91bmRGYXVsdE92ZXJyaWRlIjsKLSAgICAKLSAgICAKLSAgICAvKioKLSAgICAgKiBPbiBpbmJvdW5kIHJlcXVlc3RzLCB0aGUgZGV0YWNoYWJsZSBpbnB1dCBzdHJlYW0gY2FuIGJlIHF1ZXJpZWQgdG8gZ2V0Ci0gICAgICogdGhlIGluYm91bmQgbGVuZ3RoLiAgSXQgY2FuIGFsc28gYmUgImRldGFjaGVkIiBmcm9tIHRoZSBpbmJvdW5kIGh0dHAgc3RyZWFtCi0gICAgICogdG8gYWxsb3cgcmVzb3VyY2VzIHRvIGJlIGZyZWVkLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFVEFDSEFCTEVfSU5QVVRfU1RSRUFNID0gCi0gICAgICAgICJvcmcuYXBhY2hlLmF4aW9tLm9tLnV0aWwuRGV0YWNoYWJsZUlucHV0U3RyZWFtIjsKLQotICAgIC8qKiBTT0FQIFJvbGUgQ29uZmlndXJhdGlvbiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNPQVBfUk9MRV9DT05GSUdVUkFUSU9OX0VMRU1FTlQgPSAiU09BUFJvbGVDb25maWd1cmF0aW9uIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTT0FQX1JPTEVfSVNfVUxUSU1BVEVfUkVDRUlWRVJfQVRUUklCVVRFID0gImlzVWx0aW1hdGVSZWNlaXZlciI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09BUF9ST0xFX0VMRU1FTlQgPSAicm9sZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09BUF9ST0xFX1BMQVlFUl9QQVJBTUVURVIgPSAicm9sZVBsYXllciI7Ci0gICAgLyoqCi0gICAgICogVGhpcyBpcyB1c2VkIHRvIHN0b3JlIEhlYWRlciBRTmFtZXMgdGhhdCBmYWlsZWQgbXVzdFVuZGVyc3RhbmQgY2hlY2sgaW4gQXhpc0VuZ2luZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVTlBST0NFU1NFRF9IRUFERVJfUU5BTUVTID0gInVucHJvY2Vzc2VkSGVhZGVyUU5hbWVzIjsKLQotICAgIC8vIEtleXMgdG8gYWNjZXNzIEpBWFdTIFJlcXVlc3QgYW5kIFJlc3BvbnNlIFNPQVAgSGVhZGVycwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBWFdTX09VVEJPVU5EX1NPQVBfSEVBREVSUyAgPSAiamF4d3MuYmluZGluZy5zb2FwLmhlYWRlcnMub3V0Ym91bmQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBWFdTX0lOQk9VTkRfU09BUF9IRUFERVJTID0gImpheHdzLmJpbmRpbmcuc29hcC5oZWFkZXJzLmluYm91bmQiOwotICAgIAotICAgIC8vIElmIHRoZSBKQVhXUyBXZWJNZXRob2QgdGhyb3dzIGFuIGV4Y2VwdGlvbiBvbiB0aGUgc2VydmVyLCB0aGUgZXhjZXB0aW9uIGlzCi0gICAgLy8gc3RvcmVkIG9uIHRoZSBzZXJ2ZXIgb3V0Ym91bmQgTWVzc2FnZUNvbnRleHQuICBUaGlzIGlzIHRoZSBrZXkgdG8gYWNjZXNzIHRoYXQgVGhyb3dhYmxlIG9iamVjdC4KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVhXU19XRUJNRVRIT0RfRVhDRVBUSU9OID0gCi0gICAgICAgICJqYXh3cy5vdXRib3VuZC5yZXNwb25zZS53ZWJtZXRob2QuZXhjZXB0aW9uIjsKLQotICAgIC8qKgotICAgICAqIEEgTWVzc2FnZUNvbnRleHQgcHJvcGVydHkgb3IgY2xpZW50IE9wdGlvbiBzdGF0aW5nIHRoZSBKTVMgY29ycmVsYXRpb24gaWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKTVNfQ09PUkVMQVRJT05fSUQgPSAiSk1TX0NPT1JFTEFUSU9OX0lEIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1PRFVMRV9WRVJTSU9OID0idmVyc2lvbiI7Ci0KLSAgICAvKioKLSAgICAgKiBGb2xsb3dpbmcgY29uc3RhbnQgYXJlIHVzZWQgZm9yIEpUQSB0cmFuc2FjdGlvbiBzdXBwb3J5dCBpbiBBeGlzMgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRVJfVFJBTlNBQ1RJT04gPSAiVXNlclRyYW5zYWN0aW9uIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUUkFOU0FDVElPTl9NQU5BR0VSID0gIlRyYW5zYWN0aW9uTWFuYWdlciI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VTUEVOREVEX1RSQU5TQUNUSU9OID0gIlN1c3BlbmRlZFRyYW5zYWN0aW9uIjsKLQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIENvbmZpZ3VyYXRpb24gewotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTkFCTEVfUkVTVCA9ICJlbmFibGVSRVNUIjsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5BQkxFX0hUVFBfQ09OVEVOVF9ORUdPVElBVElPTiA9ICJodHRwQ29udGVudE5lZ290aWF0aW9uIjsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5BQkxFX1JFU1RfVEhST1VHSF9HRVQgPSAicmVzdFRocm91Z2hHZXQiOwotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFSVElGQUNUU19URU1QX0RJUiA9ICJhcnRpZmFjdHNESVIiOwotCi0gICAgICAgIC8vQXR0YWNobWVudCBjb25maWd1cmF0aW9ucwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTkFCTEVfTVRPTSA9ICJlbmFibGVNVE9NIjsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVRPTV9USFJFU0hPTEQgPSAibXRvbVRocmVzaG9sZCI7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBQ0hFX0FUVEFDSE1FTlRTID0gImNhY2hlQXR0YWNobWVudHMiOwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRBQ0hNRU5UX1RFTVBfRElSID0gImF0dGFjaG1lbnRESVIiOwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFX1NJWkVfVEhSRVNIT0xEID0gInNpemVUaHJlc2hvbGQiOwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTkFCTEVfU1dBID0gImVuYWJsZVN3QSI7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1JTUVfQk9VTkRBUlkgPSAibWltZUJvdW5kYXJ5IjsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU03X0NPTVBBVElCTEUgPSAiTU03Q29tcGF0aWJsZSI7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1NN19JTk5FUl9CT1VOREFSWSA9ICJNTTdJbm5lckJvdW5kYXJ5IjsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU03X1BBUlRfQ0lEID0gIk1NN1BhcnRDSUQiOwotCi0KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVEVUNFX1dTRExfTUVNT1JZX0NBQ0hFID0gInJlZHVjZVdTRExNZW1vcnlDYWNoZSI7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRFVDRV9XU0RMX01FTU9SWV9UWVBFICA9ICJyZWR1Y2VXU0RMTWVtb3J5VHlwZSI7Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRUUF9NRVRIT0RfR0VUID0gIkdFVCI7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhUVFBfTUVUSE9EX0RFTEVURSA9ICJERUxFVEUiOwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQX01FVEhPRF9QVVQgPSAiUFVUIjsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRUUF9NRVRIT0QgPSAiSFRUUF9NRVRIT0QiOwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQX01FVEhPRF9QT1NUID0gIlBPU1QiOwotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfVFlQRSA9ICJDb250ZW50VHlwZSI7Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHX0NPTlRFWFRfVElNRU9VVF9JTlRFUlZBTCA9ICJDb25maWdDb250ZXh0VGltZW91dEludGVydmFsIjsKLQotICAgICAgICAvKiogQGRlcHJlY2F0ZWQgTUlTU1BFTExJTkcgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHX0NPTlRFWFRfVElNT1VUX0lOVEVSVkFMID0gIkNvbmZpZ0NvbnRleHRUaW1lb3V0SW50ZXJ2YWwiOwotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQU5TUE9SVF9JTl9VUkwgPSAiVHJhbnNwb3J0SW5VUkwiOwotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTF9QQVJBTUVURVJfTElTVCA9ICJVUkxQYXJhbWV0ZXJMaXN0IjsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMX0hUVFBfTE9DQVRJT05fUEFSQU1TX0xJU1QgPSAiSFRUUExvY2F0aW9uUGFyYW1zTGlzdCI7Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VORF9TVEFDS1RSQUNFX0RFVEFJTFNfV0lUSF9GQVVMVFMgPQotICAgICAgICAgICAgICAgICJzZW5kU3RhY2t0cmFjZURldGFpbHNXaXRoRmF1bHRzIjsKLQotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEUklMTF9ET1dOX1RPX1JPT1RfQ0FVU0VfRk9SX0ZBVUxUX1JFQVNPTiA9Ci0gICAgICAgICAgICAgICAgImRyaWxsRG93blRvUm9vdENhdXNlRm9yRmF1bHRSZWFzb24iOwotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0FCTEVfUkVTVCAgID0gImRpc2FibGVSRVNUIjsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRV9TT0FQMTEgICA9ICJkaXNhYmxlU09BUDExIjsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRV9TT0FQMTIgPSAiZGlzYWJsZVNPQVAxMiI7Ci0KLSAgICAgICAgLy8gdGhpcyB3aWxsIGNvbnRhaW4gdGhlIGtleXMgb2YgYWxsIHRoZSBwcm9wZXJ0aWVzIHRoYXQgd2lsbCBiZSBpbiB0aGUgbWVzc2FnZSBjb250ZXh0Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQU5TUE9SVF9VUkwgPSAiVHJhbnNwb3J0VVJMIjsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQGRlcHJlY2F0ZWQgcGxlYXNlIHVzZSBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuQWRkcmVzc2luZ0NvbnN0YW50cy5ESVNBQkxFX0FERFJFU1NJTkdfRk9SX09VVF9NRVNTQUdFUwotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRV9BRERSRVNTSU5HX0ZPUl9PVVRfTUVTU0FHRVMgPQotICAgICAgICAgICAgICAgICJkaXNhYmxlQWRkcmVzc2luZ0Zvck91dE1lc3NhZ2VzIjsKLQotICAgICAgICAvLyBpZiB0aGlzIHByb3BlcnR5IGlzIHNldCB0byBCb29sZWFuLlRSVUUgdGhlbiB0aGUgU09BUEFjdGlvbiBoZWFkZXIsIGlmIHByZXNlbnQsCi0gICAgICAgIC8vIHdpbGwgTk9UIGJlIHNldCB0byB0aGUgdmFsdWUgb2YgT3B0aW9ucy5nZXRBY3Rpb24oKS4gVGhlIGVtcHR5IHZhbHVlLCAiIiwgd2lsbAotICAgICAgICAvLyBiZSB1c2VkIGluc3RlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRV9TT0FQX0FDVElPTiA9ICJkaXNhYmxlU29hcEFjdGlvbiI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEZpZWxkIENIQVJBQ1RFUl9TRVRfRU5DT0RJTkcKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENIQVJBQ1RFUl9TRVRfRU5DT0RJTkcgPSAiQ0hBUkFDVEVSX1NFVF9FTkNPRElORyI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIElmIHRoaXMgaXMgc2V0IHRvIGEgQm9vbGVhbiAndHJ1ZScgdmFsdWUsIHRoZSByZXBseVRvIHZhbHVlIHdpbGwgbm90IGJlIHJlcGxhY2VkIGluCi0gICAgICAgICAqIGFuIE91dEluIGludm9jYXRpb24uIFRoaXMgaXMgdXNlZnVsIGZvciBtb2R1bGVzIHRoYXQgaG9wZSB0byBnZXQgdGhlIHJlcGx5IG1lc3NhZ2UgaW4KLSAgICAgICAgICogaXRzIG93biBtYW5uZXIuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VfQ1VTVE9NX0xJU1RFTkVSID0gIlVzZUN1c3RvbUxpc3RlbmVyIjsKLQotICAgICAgICAvKioKLSAgICAgICAgICogSWYgdGhpcyBpcyBzZXQgdG8gYSBCb29sZWFuICd0cnVlJyB2YWx1ZSwgdGhlbiBPdXRJbiBvcGVyYXRpb25zIHdpbGwgYWx3YXlzIGJlIHRyZWF0ZWQKLSAgICAgICAgICogYXMgYXN5bmMuIFRoaXMgaXMgdXNlZnVsIGZvciBtb2R1bGVzIHRoYXQgbGF5ZXIgYXN5bmMgYmVoYXZpb3VyIG9uIHRvcCBvZiBzeW5jIGNoYW5uZWxzLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFX0FTWU5DX09QRVJBVElPTlMgPSAiVXNlQXN5bmNPcGVyYXRpb25zIjsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhpcyBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIG1lc3NhZ2UgZm9ybWF0IHdoaWNoIHRoZSBtZXNzYWdlIG5lZWRzIHRvIGJlIHNlcmlhbGl6ZXMuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuTWVzc2FnZUZvcm1hdHRlcgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9UWVBFID0gIm1lc3NhZ2VUeXBlIjsKLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FU1NBR0VfRk9STUFUVEVSID0gIm1lc3NhZ2VGb3JtYXR0ZXIiOwotICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoaXMgaXMgdXNlZCB0byBlbmFibGUvZGlzYWJsZSBBeGlzMiBkZWZhdWx0IGZhbGwgYmFjayBidWlsZGVyLiBXaGVuIGVuYWJsZWQgQXhpczIgCi0gICAgICAgICAqIHdpbGwgYnVpbGQgYW55IG1lc3NhZ2UgdGhhdCBoYXMgYSBjb250ZW50IHR5cGUgd2hpY2ggaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgY29uZmlndXJlZAotICAgICAgICAgKiBBeGlzMiBidWlsZGVyIHdpbGwgYmUgYnVpbHQgdXNpbmcgdGhpcyBidWlsZGVyLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFX0RFRkFVTFRfRkFMTEJBQ0tfQlVJTERFUiA9ICJ1c2VEZWZhdWx0RmFsbGJhY2tCdWlsZGVyIjsKLQotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTT0FQX1JFU1BPTlNFX01FUCA9ICJzb2FwUmVzcG9uc2VNRVAiOwotICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoaXMgd2lsbCBiZSB1c2VkIGFzIGEga2V5IGZvciBzdG9yaW5nIHRyYW5zcG9ydCBpbmZvcm1hdGlvbi4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQU5TUE9SVF9JTkZPX01BUCA9ICJUcmFuc3BvcnRJbmZvTWFwIjsKLSAgICAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAgKiBJZiB0aGlzIGlzIHNldCB0byBhIEJvb2xlYW4gJ3RydWUnIHZhbHVlLCB0aGVuIFJlcXVlc3RSZXNwb25zZVRyYW5zcG9ydCBpbnN0YW5jZXMgd2lsbAotICAgICAgICAgKiBub3QgYmUgc2lnbmFsbGVkIGJ5IHRoZSBEaXNwYXRjaCBwaGFzZS4gVGhpcyBpcyB1c2VmdWwgZm9yIG1vZHVsZXMgdGhhdCBhZGQgd2lzaCB0bwotICAgICAgICAgKiBzZW5kIGV4dHJhIG1lc3NhZ2VzIGluIHRoZSBiYWNrY2hhbm5lbC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0FCTEVfUkVTUE9OU0VfQUNLID0gIkRpc2FibGVSZXNwb25zZUFjayI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoaXMgY29uc3RhbnQgaXMgdXNlZCB0byBhZGQgYW4gZGVwbG95bWVudCBsaWZlIGN5Y2xlIGxpc3RuZXIgdG8gQXhpczIKLSAgICAgICAgICovCi0KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVQTE9ZTUVOVF9MSUZFX0NZQ0xFX0xJU1RFTkVSID0gImRlcGxveW1lbnRMaWZlQ3ljbGVMaXN0ZW5lciI7Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJBVEVfQUJTT0xVVEVfTE9DQVRJT05fVVJJUyA9ICJnZW5lcmF0ZUFic29sdXRlTG9jYXRpb25VUklzIjsKLQotCi0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvU2VydmljZU9iamVjdFN1cHBsaWVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvU2VydmljZU9iamVjdFN1cHBsaWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4ZTg0OWEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL1NlcnZpY2VPYmplY3RTdXBwbGllci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLS8qCi0gKiAKLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIFNlcnZpY2VPYmplY3RTdXBwbGllciB7Ci0gICAgLyogRGVwbG95bWVudCBFbmdpbmUgdXNlcyB0aGlzIG1ldGhvZCAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0U2VydmljZU9iamVjdChBeGlzU2VydmljZSBheGlzU2VydmljZSkgdGhyb3dzIEF4aXNGYXVsdDsKLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9WZXJzaW9uLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvVmVyc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzU1Y2JiLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9WZXJzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmkxOG4uTWVzc2FnZXM7Ci0KLS8qKgotICogTGl0dGxlIHV0aWxpdHkgdG8gZ2V0IHRoZSB2ZXJzaW9uIGFuZCBidWlsZCBkYXRlIG9mIHRoZSBheGlzMi5qYXIuCi0gKiA8cC8+Ci0gKiBUaGUgbWVzc2FnZXMgcmVmZXJlbmNlZCBoZXJlIGFyZSBhdXRvbWF0aWNhbGx5IGtlcHQgdXAtdG8tZGF0ZSBieSB0aGUKLSAqIGJ1aWxkLnhtbC4KLSAqLwotcHVibGljIGNsYXNzIFZlcnNpb24gewotICAgIC8qKgotICAgICAqIEdldCB0aGUgdmVyc2lvbiBvZiB0aGlzIEFYSVMuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSB2ZXJzaW9uIG9mIHRoaXMgYXhpczIKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRWZXJzaW9uKCkgewotICAgICAgICByZXR1cm4gTWVzc2FnZXMuZ2V0TWVzc2FnZSgiYXhpc1ZlcnNpb24iKSArICJcbiIgKwotICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoImJ1aWx0T24iKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBBeGlzIFZlcnNpb24gbnVtYmVyIGFuZCBidWlsZCBkYXRlLgotICAgICAqIDxwLz4KLSAgICAgKiBFeGFtcGxlIG91dHB1dDogMS4xIEp1bCAwOCwgMjAwMyAoMDk6MDA6MTIgRURUKQotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgZnVsbCB2ZXJzaW9uIG9mIHRoaXMgYXhpczIKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRWZXJzaW9uVGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIE1lc3NhZ2VzLmdldE1lc3NhZ2UoImF4aXNWZXJzaW9uUmF3Iik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRW50cnkgcG9pbnQuCi0gICAgICogPHAvPgotICAgICAqIENhbGxpbmcgdGhpcyB3aXRoIG5vIGFyZ3VtZW50cyByZXR1cm5zIHRoZSB2ZXJzaW9uIG9mIHRoZSBjbGllbnQtc2lkZQotICAgICAqIGF4aXMyLmphci4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihnZXRWZXJzaW9uKCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9hZGRyZXNzaW5nL0FkZHJlc3NpbmdDb25zdGFudHMuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9hZGRyZXNzaW5nL0FkZHJlc3NpbmdDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzFlNWEwYS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvYWRkcmVzc2luZy9BZGRyZXNzaW5nQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3Npbmc7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi0vKioKLSAqIEludGVyZmFjZSBBZGRyZXNzaW5nQ29uc3RhbnRzCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQWRkcmVzc2luZ0NvbnN0YW50cyB7Ci0KLSAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09IENvbW1vbiBNZXNzYWdlIEFkZHJlc3NpbmcgUHJvcGVydGllcyA9PT09PT09PT09PT09PT09PT09Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBXU0FfTUVTU0FHRV9JRCA9ICJNZXNzYWdlSUQiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NBX1JFTEFURVNfVE8gPSAiUmVsYXRlc1RvIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFdTQV9SRUxBVEVTX1RPX1JFTEFUSU9OU0hJUF9UWVBFID0gIlJlbGF0aW9uc2hpcFR5cGUiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NBX1RPID0gIlRvIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFdTQV9SRVBMWV9UTyA9ICJSZXBseVRvIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFdTQV9GUk9NID0gIkZyb20iOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NBX0ZBVUxUX1RPID0gIkZhdWx0VG8iOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NBX0FDVElPTiA9ICJBY3Rpb24iOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVBSX1NFUlZJQ0VfTkFNRSA9ICJTZXJ2aWNlTmFtZSI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBFUFJfUkVGRVJFTkNFX1BBUkFNRVRFUlMgPSAiUmVmZXJlbmNlUGFyYW1ldGVycyI7Ci0KLSAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09IENvbW1vbiBFUFIgRWxlbWVudHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVBSX0FERFJFU1MgPSAiQWRkcmVzcyI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBXU19BRERSRVNTSU5HX1ZFUlNJT04gPSAiV1NBZGRyZXNzaW5nVmVyc2lvbiI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBXU0FfREVGQVVMVF9QUkVGSVggPSAid3NhIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1NFUlZJQ0VfR1JPVVBfQ09OVEVYVF9JRCA9Ci0gICAgICAgICAgICAiU2VydmljZUdyb3VwQ29udGV4dElkRnJvbUFkZHJlc3NpbmciOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgSVNfQUREUl9JTkZPX0FMUkVBRFlfUFJPQ0VTU0VEID0gIklzQWRkcmVzc2luZ1Byb2Nlc3NlZCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBESVNBQkxFX0FERFJFU1NJTkdfRk9SX0lOX01FU1NBR0VTID0gImRpc2FibGVBZGRyZXNzaW5nRm9ySW5NZXNzYWdlcyI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBBRERSX1ZBTElEQVRFX0FDVElPTiA9ICJhZGRyZXNzaW5nLnZhbGlkYXRlQWN0aW9uIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEFERFJfVkFMSURBVEVfSU5WT0NBVElPTl9QQVRURVJOID0gImFkZHJlc3NpbmcudmFsaWRhdGVJbnZvY2F0aW9uUGF0dGVybiI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBFTkRQT0lOVF9SRUZFUkVOQ0UgPSAiRW5kcG9pbnRSZWZlcmVuY2UiOwotCi0gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PSBXU0RMIEJpbmRpbmcgQ29uc3RhbnRzID09PT09PT09PT09PT09PT09PT09PT09PQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNJTkdfQUREUkVTU0lORyA9ICJVc2luZ0FkZHJlc3NpbmciOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQU5PTllNT1VTID0gIkFub255bW91cyI7Ci0KLSAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09IEFkZHJlc3NpbmcgUmVxdWlyZW1lbnQgTGV2ZWxzID09PT09PT09PT09PT09PT09PQotICAgIC8vIFRoZXNlIGFyZSB1c2VkIHRvIHJlcHJlc2VudCB0aGUgcmVxdWlyZW1lbnQgbGV2ZWwgb24gV1MtQWRkcmVzc2luZyBpbmRpY2F0ZWQKLSAgICAvLyBpbiBhIHNlcnZpY2VzLnhtbCBvciBhIFdTREwgZmlsZS4KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEFERFJFU1NJTkdfUkVRVUlSRU1FTlRfUEFSQU1FVEVSID0gImFkZHJlc3NpbmdSZXF1aXJlbWVudFBhcmFtZXRlciI7Ci0gICAgLy8gQUREUkVTU0lOR19VTlNQRUNJRklFRCBpcyB0aGUgZXF1aXZhbGVudCBvZiBubyBVc2luZ0FkZHJlc3NpbmcgZmxhZyBpbiBhCi0gICAgLy8gV1NETCBmaWxlIGFuZCB0aGUgZGVmYXVsdCBvZiB0aGUgV1NBZGRyZXNzaW5nUmVxdXJlZCBhdHRyaWJ1dGUgaW4gc2VydmljZS54bWwKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEFERFJFU1NJTkdfVU5TUEVDSUZJRUQgPSAidW5zcGVjaWZpZWQiOwotICAgIC8vIEFERFJFU1NJTkdfT1BUSU9OQUwgaXMgdGhlIGVxdWl2YWxlbnQgb2YgPHdzYXc6VXNpbmdBZGRyZXNzaW5nIHJlcXVpcmVkPSJmYWxzZSIgLz4KLSAgICAvLyBpbiBhIFdTREwgZmlsZQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUREUkVTU0lOR19PUFRJT05BTCA9ICJvcHRpb25hbCI7Ci0gICAgLy8gQUREUkVTU0lOR19SRVFVSVJFRCBpcyB0aGUgZXF1aXZhbGVudCBvZiA8d3NhdzpVc2luZ0FkZHJlc3NpbmcgcmVxdWlyZWQ9InRydWUiIC8+Ci0gICAgLy8gaW4gYSBXU0RMIGZpbGUKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEFERFJFU1NJTkdfUkVRVUlSRUQgPSAicmVxdWlyZWQiOwotCi0gICAgLy8gSWYgdGhpcyBwcm9wZXJ0eSBpcyBzZXQsIGFkZHJlc3NpbmcgaGVhZGVycyB3aWxsIGJlIHJlcGxhY2VkIGZyb20gdGhlIGluZm9ybWF0aW9uIGluIHRoZQotICAgIC8vIG1lc3NhZ2UgY29udGV4dC4gIAotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVQTEFDRV9BRERSRVNTSU5HX0hFQURFUlMgPSAiUmVwbGFjZUFkZHJlc3NpbmdIZWFkZXJzIjsKLQotICAgIC8vIHRoaXMgcHJvcGVydHkgb25jZSBzZXQgdG8gQm9vbGVhbi5UUlVFIHdpbGwgbWFrZSB0aGUgbWVzc2FnZXMgdG8gc2tpcCBBZGRyZXNzaW5nIEhhbmRsZXIuCi0gICAgLy8gU28geW91IHdpbGwgbm90IHNlZSBBZGRyZXNzaW5nIEhlYWRlcnMgaW4gdGhlIE9VVCBwYXRoLgotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRV9BRERSRVNTSU5HX0ZPUl9PVVRfTUVTU0FHRVMgPQotICAgICAgICAgICAgImRpc2FibGVBZGRyZXNzaW5nRm9yT3V0TWVzc2FnZXMiOwotCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBBRERfTVVTVF9VTkRFUlNUQU5EX1RPX0FERFJFU1NJTkdfSEVBREVSUyA9Ci0gICAgICAgICAgICAiYWRkTXVzdFVuZGVyc3RhbmRUb0FkZHJlc3NpbmdIZWFkZXJzIjsKLQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09BUF9ST0xFX0ZPUl9BRERSRVNTSU5HX0hFQURFUlMgPSAid3NhZGRyZXNzaW5nUm9sZSI7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQSBwcm9wZXJ0eSBwb2ludGluZyB0byBhbiBBcnJheUxpc3Qgb2YgT01BdHRyaWJ1dGUgb2JqZWN0cyByZXByZXNlbnRpbmcgYW55IGF0dHJpYnV0ZXMKLSAgICAgKiBvZiB0aGUgd3NhOkFjdGlvbiBoZWFkZXIuCi0gICAgICovCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fQVRUUklCVVRFUyA9ICJhY3Rpb25BdHRyaWJ1dGVzIjsKLSAgICAvKioKLSAgICAgKiBBIHByb3BlcnR5IHBvaW50aW5nIHRvIGFuIEFycmF5TGlzdCBvZiBPTUF0dHJpYnV0ZSBvYmplY3RzIHJlcHJlc2VudGluZyBhbnkgYXR0cmlidXRlcwotICAgICAqIG9mIHRoZSB3c2E6TWVzc2FnZUlEIGhlYWRlci4KLSAgICAgKi8KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIE1FU1NBR0VJRF9BVFRSSUJVVEVTID0gIm1lc3NhZ2VpZEF0dHJpYnV0ZXMiOwotCi0gICAgLyoqCi0gICAgICogV2hlbiBzZXQgdG8gQm9vbGVhbi5UUlVFIHRoaXMgd2lsbCBjYXVzZSB0aGUgYWRkcmVzc2luZyBvdXQgaGFuZGxlciB0byBvdXRwdXQgYWxsCi0gICAgICogcG9wdWxhdGVkIGFkZHJlc3NpbmcgaGVhZGVycyBpbiBhIG1lc3NhZ2UsIGluY2x1ZGluZyBhbnkgb3B0aW9uYWwgb25lcy4KLSAgICAgKi8KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIElOQ0xVREVfT1BUSU9OQUxfSEVBREVSUyA9ICJpbmNsdWRlT3B0aW9uYWxIZWFkZXJzIjsKLQotICAgIC8qKgotICAgICAqIFRoaXMgcHJvcGVydHksIGlmIHNldCB0byBCb29sZWFuLlRSVUUsIHdpbGwgbWVhbiB0aGF0IHRoZSBhZGRyZXNzaW5nIGhhbmRsZXIgYWxsb3dzIHBhcnRpYWxseQotICAgICAqIHdzLWFkZHJlc3NlZCBtZXNzYWdlcyB0byBiZSBzZW50IGV2ZW4gaWYgdGhleSBhcmUgdGhlbiBpbnZhbGlkIHJhdGhlciB0aGFuIHRocm93aW5nIGEgZmF1bHQuCi0gICAgICogPHAvPgotICAgICAqIEl0IGlzIG5vdCBjbGVhciBob3cgbmVjZXNzYXJ5IHRoaXMgcHJvcGVydHkgaXMgYW5kIGl0IG1heSBiZSByZW1vdmVkIGJlZm9yZSB0aGUgbmV4dCByZWxlYXNlIGlmCi0gICAgICogaXQgaXMgbm90IHNlZW4gdG8gYmUgbmVjZXNzYXJ5IC0gZGF2aWRpbGxzbGV5QGFwYWNoZS5vcmcKLSAgICAgKi8KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0FCTEVfT1VUQk9VTkRfQUREUkVTU0lOR19WQUxJREFUSU9OID0KLSAgICAgICAgICAgICJkaXNhYmxlQWRkcmVzc2luZ091dGJvdW5kVmFsaWRhdGlvbiI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHBhcmFtZXRlciBpcyB1c2VkIHRvIGF0dGFjaCBPTUVsZW1lbnQgUmVmZXJlbmNlUGFyYW1ldGVycyBmb3VuZCBpbiBhbiBFUFIgZW1iZWRkZWQgaW4gYQotICAgICAqIFdTREwgdG8gYW4gQXhpc0VuZHBvaW50IG9iamVjdC4KLSAgICAgKi8KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRkVSRU5DRV9QQVJBTUVURVJfUEFSQU1FVEVSID0gInJlZmVyZW5jZVBhcmFtZXRlcnMiOwotCi0gICAgLyoqCi0gICAgICogVGhpcyBwYXJhbWV0ZXIgaXMgdXNlZCB0byBkZWNpZGUgd2hldGhlciB0aGUgcmVmZXJlbmNlIHBhcmFtZXRlcnMgaW4gYW4gaW5ib3VuZCByZXF1ZXN0Ci0gICAgICogbWVzc2FnZSBhcmUgdG8gYmUgcHJvY2Vzc2VkIG9yIG5vdC4KLSAgICAgKi8KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0FCTEVfUkVGX1BBUkFNRVRFUl9FWFRSQUNUID0gImRpc2FibGVSZWZQYXJhbUV4dHJhY3QiOwotICAgIAotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NBTV9JTlZPQ0FUSU9OX1BBVFRFUk5fUEFSQU1FVEVSX05BTUUgPSAid3NhbUludm9jYXRpb25QYXR0ZXJuIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFdTQU1fSU5WT0NBVElPTl9QQVRURVJOX1NZTkNIUk9OT1VTID0gInN5bmNocm9ub3VzIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFdTQU1fSU5WT0NBVElPTl9QQVRURVJOX0FTWU5DSFJPTk9VUyA9ICJhc3luY2hyb25vdXMiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NBTV9JTlZPQ0FUSU9OX1BBVFRFUk5fQk9USCA9ICJib3RoIjsKLQotICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PSBDb21tb24gRmF1bHRzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFVTFRfQUNUSU9OX05PVF9TVVBQT1JURUQgPSAiQWN0aW9uTm90U3VwcG9ydGVkIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEZBVUxUX0FDVElPTl9OT1RfU1VQUE9SVEVEX1JFQVNPTiA9Ci0gICAgICAgICAgICAiVGhlIFthY3Rpb25dIGNhbm5vdCBiZSBwcm9jZXNzZWQgYXQgdGhlIHJlY2VpdmVyLiI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBGQVVMVF9BRERSRVNTSU5HX0RFU1RJTkFUSU9OX1VOUkVBQ0hBQkxFID0KLSAgICAgICAgICAgICJEZXN0aW5hdGlvblVucmVhY2hhYmxlIjsKLSAgICAKLSAgICAvLyA9PT09PT09PT09PT09PT09PT09PSBXUy1BZGRyZXNzaW5nQW5kSWRlbnRpdHkgPT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBBRERSRVNTSU5HX0lERU5USVRZX1BSRUZJWCA9ICJ3c2lkIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEFERFJFU1NJTkdfSURFTlRJVFlfTlMgPSAKLSAgICAgICAgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDYvMDIvYWRkcmVzc2luZ2lkZW50aXR5IjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9TSUdfUFJFRklYID0gImRzIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9TSUdfTlMgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI7Ci0gICAgCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBJREVOVElUWSA9ICJJZGVudGl0eSI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBJREVOVElUWV9LRVlfSU5GTyA9ICJLZXlJbmZvIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIElERU5USVRZX1g1MDlfREFUQSA9ICJYNTA5RGF0YSI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBJREVOVElUWV9YNTA5X0NFUlQgPSAiWDUwOUNlcnRpZmljYXRlIjsKLSAgICAKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIElERU5USVRZX1BBUkFNRVRFUiA9ICJXU0FkZHJlc3NpbmdBbmRJZGVudGl0eSI7Ci0gICAgCi0gICAgc3RhdGljIGZpbmFsIFFOYW1lIFFOQU1FX0lERU5USVRZID0gbmV3IFFOYW1lKEFERFJFU1NJTkdfSURFTlRJVFlfTlMsSURFTlRJVFksQUREUkVTU0lOR19JREVOVElUWV9QUkVGSVgpOwotICAgIHN0YXRpYyBmaW5hbCBRTmFtZSBRTkFNRV9JREVOVElUWV9LRVlfSU5GTyA9IG5ldyBRTmFtZShYTUxfU0lHX05TLElERU5USVRZX0tFWV9JTkZPLFhNTF9TSUdfUFJFRklYKTsKLSAgICBzdGF0aWMgZmluYWwgUU5hbWUgUU5BTUVfSURFTlRJVFlfWDUwOV9EQVRBID0gbmV3IFFOYW1lKFhNTF9TSUdfTlMsSURFTlRJVFlfWDUwOV9EQVRBLFhNTF9TSUdfUFJFRklYKTsKLSAgICBzdGF0aWMgZmluYWwgUU5hbWUgUU5BTUVfSURFTlRJVFlfWDUwOV9DRVJUID0gbmV3IFFOYW1lKFhNTF9TSUdfTlMsSURFTlRJVFlfWDUwOV9DRVJULFhNTF9TSUdfUFJFRklYKTsKLSAgICAKLSAgICBpbnRlcmZhY2UgRmluYWwgewotCi0gICAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT0gQWRkcmVzc2luZyAxLjAgRmluYWwgVmVyc2lvbiBDb25zdGFudHMgPT09PT09PT09PT09PT09PT09PT0KLSAgICAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBXU0FfTkFNRVNQQUNFID0KLSAgICAgICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvMjAwNS8wOC9hZGRyZXNzaW5nIjsKLSAgICAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBXU0FXX05BTUVTUEFDRSA9Ci0gICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvMjAwNi8wNS9hZGRyZXNzaW5nL3dzZGwiOwotICAgICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFdTQU1fTkFNRVNQQUNFID0gCi0gICAgICAgIAkiaHR0cDovL3d3dy53My5vcmcvMjAwNy8wNS9hZGRyZXNzaW5nL21ldGFkYXRhIjsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgI1dTQV9ERUZBVUxUX1JFTEFUSU9OU0hJUF9UWVBFfSBpbnN0ZWFkLgotICAgICAgICAgKi8KLSAgICAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBXU0FfUkVMQVRFU19UT19SRUxBVElPTlNISVBfVFlQRV9ERUZBVUxUX1ZBTFVFID0KLSAgICAgICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvMjAwNS8wOC9hZGRyZXNzaW5nL3JlcGx5IjsKLSAgICAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBXU0FfSVNfUkVGRVJFTkNFX1BBUkFNRVRFUl9BVFRSSUJVVEUgPSAiSXNSZWZlcmVuY2VQYXJhbWV0ZXIiOwotICAgICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFdTQV9BTk9OWU1PVVNfVVJMID0KLSAgICAgICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvMjAwNS8wOC9hZGRyZXNzaW5nL2Fub255bW91cyI7Ci0gICAgICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NBX05PTkVfVVJJID0KLSAgICAgICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvMjAwNS8wOC9hZGRyZXNzaW5nL25vbmUiOwotICAgICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFdTQV9GQVVMVF9BQ1RJT04gPQotICAgICAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy8yMDA1LzA4L2FkZHJlc3NpbmcvZmF1bHQiOwotICAgICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFdTQV9TT0FQX0ZBVUxUX0FDVElPTiA9Ci0gICAgICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDgvYWRkcmVzc2luZy9zb2FwL2ZhdWx0IjsKLSAgICAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBXU0FfVFlQRV9BVFRSSUJVVEVfVkFMVUUgPSAidHJ1ZSI7Ci0gICAgICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NBX1NFUlZJQ0VfTkFNRV9FTkRQT0lOVF9OQU1FID0gIkVuZHBvaW50TmFtZSI7Ci0gICAgICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NBX1BPTElDSUVTID0gIlBvbGljaWVzIjsKLSAgICAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBXU0FfTUVUQURBVEEgPSAiTWV0YWRhdGEiOwotICAgICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFdTQV9ERUZBVUxUX01FVEFEQVRBX1BSRUZJWCA9ICJ3c2FtIjsKLSAgICAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBXU0FfT1JJR0lOQUxfTUVUQURBVEFfUFJFRklYID0gIndzYXciOwotCi0gICAgICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NBX0lOVEVSRkFDRV9OQU1FID0gIkludGVyZmFjZU5hbWUiOwotCi0gICAgICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NBX0RFRkFVTFRfUkVMQVRJT05TSElQX1RZUEUgPQotICAgICAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy8yMDA1LzA4L2FkZHJlc3NpbmcvcmVwbHkiOwotCi0gICAgICAgIC8vIGZhdWx0IGluZm9ybWF0aW9uCi0gICAgICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFVTFRfSEVBREVSX1BST0JfSEVBREVSX1FOQU1FID0gIlByb2JsZW1IZWFkZXJRTmFtZSI7Ci0gICAgICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFVTFRfSEVBREVSX1BST0JfSEVBREVSID0gIlByb2JsZW1IZWFkZXIiOwotICAgICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEZBVUxUX0hFQURFUl9QUk9CX0lSSSA9ICJQcm9ibGVtSVJJIjsKLSAgICAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBGQVVMVF9IRUFERVJfREVUQUlMID0gIkZhdWx0RGV0YWlsIjsKLSAgICAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBGQVVMVF9JTlZBTElEX0hFQURFUiA9ICJJbnZhbGlkQWRkcmVzc2luZ0hlYWRlciI7Ci0gICAgICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFVTFRfSU5WQUxJRF9IRUFERVJfUkVBU09OID0KLSAgICAgICAgICAgICAgICAiQSBoZWFkZXIgcmVwcmVzZW50aW5nIGEgTWVzc2FnZSBBZGRyZXNzaW5nIFByb3BlcnR5IGlzIG5vdCB2YWxpZCBhbmQgdGhlIG1lc3NhZ2UgY2Fubm90IGJlIHByb2Nlc3NlZCI7Ci0gICAgICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFVTFRfQUREUkVTU0lOR19IRUFERVJfUkVRVUlSRUQgPQotICAgICAgICAgICAgICAgICJNZXNzYWdlQWRkcmVzc2luZ0hlYWRlclJlcXVpcmVkIjsKLSAgICAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBGQVVMVF9BRERSRVNTSU5HX0hFQURFUl9SRVFVSVJFRF9SRUFTT04gPQotICAgICAgICAgICAgICAgICJBIHJlcXVpcmVkIGhlYWRlciByZXByZXNlbnRpbmcgYSBNZXNzYWdlIEFkZHJlc3NpbmcgUHJvcGVydHkgaXMgbm90IHByZXNlbnQiOwotICAgICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEZBVUxUX0FERFJFU1NJTkdfREVTVElOQVRJT05fVU5SRUFDSEFCTEVfUkVBU09OID0KLSAgICAgICAgICAgICAgICAiTm8gcm91dGUgY2FuIGJlIGRldGVybWluZWQgdG8gcmVhY2ggW2Rlc3RpbmF0aW9uXSI7Ci0gICAgICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFVTFRfSU5WQUxJRF9DQVJESU5BTElUWSA9ICJJbnZhbGlkQ2FyZGluYWxpdHkiOwotICAgICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEZBVUxUX09OTFlfQU5PTllNT1VTX0FERFJFU1NfU1VQUE9SVEVEID0KLSAgICAgICAgICAgICAgICAiT25seUFub255bW91c0FkZHJlc3NTdXBwb3J0ZWQiOwotICAgICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEZBVUxUX09OTFlfTk9OX0FOT05ZTU9VU19BRERSRVNTX1NVUFBPUlRFRCA9Ci0gICAgICAgICAgICAgICAgIk9ubHlOb25Bbm9ueW1vdXNBZGRyZXNzU3VwcG9ydGVkIjsKLSAgICAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBGQVVMVF9QUk9CTEVNX0FDVElPTl9OQU1FID0gIlByb2JsZW1BY3Rpb24iOwotCi0gICAgICAgIHN0YXRpYyBmaW5hbCBRTmFtZSBXU0FXX1VTSU5HX0FERFJFU1NJTkcgPQotICAgICAgICAgICAgICAgIG5ldyBRTmFtZShXU0FXX05BTUVTUEFDRSwgVVNJTkdfQUREUkVTU0lORyk7Ci0gICAgICAgIHN0YXRpYyBmaW5hbCBRTmFtZSBXU0FXX0FOT05ZTU9VUyA9IG5ldyBRTmFtZShXU0FXX05BTUVTUEFDRSwgVVNJTkdfQUREUkVTU0lORyk7Ci0gICAgICAgIHN0YXRpYyBmaW5hbCBRTmFtZSBXU0FfRU5EUE9JTlRfUkVGRVJFTkNFID0gbmV3IFFOYW1lKFdTQV9OQU1FU1BBQ0UsIEVORFBPSU5UX1JFRkVSRU5DRSwgV1NBX0RFRkFVTFRfUFJFRklYKTsKLSAgICAgICAgc3RhdGljIGZpbmFsIFFOYW1lIFdTQV9BRERSRVNTID0gbmV3IFFOYW1lKFdTQV9OQU1FU1BBQ0UsIEVQUl9BRERSRVNTLFdTQV9ERUZBVUxUX1BSRUZJWCk7Ci0KLSAgICAgICAgZmluYWwgUU5hbWUgUU5BTUVfV1NBX1RPID0gbmV3IFFOYW1lKFdTQV9OQU1FU1BBQ0UsIFdTQV9UTyk7Ci0gICAgICAgIGZpbmFsIFFOYW1lIFFOQU1FX1dTQV9GUk9NID0gbmV3IFFOYW1lKFdTQV9OQU1FU1BBQ0UsIFdTQV9GUk9NKTsKLSAgICAgICAgZmluYWwgUU5hbWUgUU5BTUVfV1NBX1JFUExZX1RPID0gbmV3IFFOYW1lKFdTQV9OQU1FU1BBQ0UsIFdTQV9SRVBMWV9UTyk7Ci0gICAgICAgIGZpbmFsIFFOYW1lIFFOQU1FX1dTQV9SRUxBVEVTX1RPID0gbmV3IFFOYW1lKFdTQV9OQU1FU1BBQ0UsIFdTQV9SRUxBVEVTX1RPKTsKLSAgICAgICAgZmluYWwgUU5hbWUgUU5BTUVfV1NBX01FU1NBR0VfSUQgPSBuZXcgUU5hbWUoV1NBX05BTUVTUEFDRSwgV1NBX01FU1NBR0VfSUQpOwotICAgICAgICBmaW5hbCBRTmFtZSBRTkFNRV9XU0FfSEVBREVSX0RFVEFJTCA9IG5ldyBRTmFtZShXU0FfTkFNRVNQQUNFLCBGQVVMVF9IRUFERVJfREVUQUlMKTsKLSAgICAgICAgZmluYWwgUU5hbWUgUU5BTUVfUFJPQkxFTV9IRUFERVIgPSBuZXcgUU5hbWUoV1NBX05BTUVTUEFDRSwgRkFVTFRfSEVBREVSX1BST0JfSEVBREVSX1FOQU1FKTsKLSAgICAgICAgZmluYWwgUU5hbWUgUU5BTUVfSU5WQUxJRF9IRUFERVIgPSBuZXcgUU5hbWUoV1NBX05BTUVTUEFDRSwgRkFVTFRfSU5WQUxJRF9IRUFERVIpOwotICAgIH0KLQotCi0gICAgaW50ZXJmYWNlIFN1Ym1pc3Npb24gewotCi0gICAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT0gQWRkcmVzc2luZyBTdWJtaXNzaW9uIFZlcnNpb24gQ29uc3RhbnRzID09PT09PT09PT09PT09PT09PT0KLSAgICAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBXU0FfTkFNRVNQQUNFID0KLSAgICAgICAgICAgICAgICAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOC9hZGRyZXNzaW5nIjsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgI1dTQV9ERUZBVUxUX1JFTEFUSU9OU0hJUF9UWVBFfSBpbnN0ZWFkLgotICAgICAgICAgKi8KLSAgICAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBXU0FfUkVMQVRFU19UT19SRUxBVElPTlNISVBfVFlQRV9ERUZBVUxUX1ZBTFVFID0gIndzYTpSZXBseSI7Ci0gICAgICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NBX0RFRkFVTFRfUkVMQVRJT05TSElQX1RZUEUgPSAid3NhOlJlcGx5IjsKLSAgICAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBXU0FfQU5PTllNT1VTX1VSTCA9Ci0gICAgICAgICAgICAgICAgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDgvYWRkcmVzc2luZy9yb2xlL2Fub255bW91cyI7Ci0KLSAgICAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBFUFJfUkVGRVJFTkNFX1BST1BFUlRJRVMgPSAiUmVmZXJlbmNlUHJvcGVydGllcyI7Ci0gICAgICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NBX0ZBVUxUX0FDVElPTiA9Ci0gICAgICAgICAgICAgICAgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDgvYWRkcmVzc2luZy9mYXVsdCI7Ci0gICAgICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NBX1NFUlZJQ0VfTkFNRV9FTkRQT0lOVF9OQU1FID0gIlBvcnROYW1lIjsKLSAgICAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBXU0FfSU5URVJGQUNFX05BTUUgPSAiUG9ydFR5cGUiOwotCi0gICAgICAgIC8vIGZhdWx0IGluZm9ybWF0aW9uCi0gICAgICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFVTFRfSU5WQUxJRF9IRUFERVIgPSAiSW52YWxpZE1lc3NhZ2VJbmZvcm1hdGlvbkhlYWRlciI7Ci0gICAgICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFVTFRfSU5WQUxJRF9IRUFERVJfUkVBU09OID0KLSAgICAgICAgICAgICAgICAiQSBtZXNzYWdlIGluZm9ybWF0aW9uIGhlYWRlciBpcyBub3QgdmFsaWQgYW5kIHRoZSBtZXNzYWdlIGNhbm5vdCBiZSBwcm9jZXNzZWQuIFRoZSB2YWxpZGl0eSBmYWlsdXJlIGNhbiBiZSBlaXRoZXIgc3RydWN0dXJhbCBvciBzZW1hbnRpYywgZS5nLiBhIFtkZXN0aW5hdGlvbl0gdGhhdCBpcyBub3QgYSBVUkkgb3IgYSBbcmVsYXRpb25zaGlwXSB0byBhIFttZXNzYWdlIGlkXSB0aGF0IHdhcyBuZXZlciBpc3N1ZWQuIjsKLSAgICAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBGQVVMVF9BRERSRVNTSU5HX0hFQURFUl9SRVFVSVJFRCA9Ci0gICAgICAgICAgICAgICAgIk1lc3NhZ2VJbmZvcm1hdGlvbkhlYWRlclJlcXVpcmVkIjsKLSAgICAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBGQVVMVF9BRERSRVNTSU5HX0hFQURFUl9SRVFVSVJFRF9SRUFTT04gPQotICAgICAgICAgICAgICAgICJBIHJlcXVpcmVkIG1lc3NhZ2UgaW5mb3JtYXRpb24gaGVhZGVyLCBUbywgTWVzc2FnZUlELCBvciBBY3Rpb24sIGlzIG5vdCBwcmVzZW50LiI7Ci0gICAgICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFVTFRfQUREUkVTU0lOR19ERVNUSU5BVElPTl9VTlJFQUNIQUJMRV9SRUFTT04gPQotICAgICAgICAgICAgICAgICJObyByb3V0ZSBjYW4gYmUgZGV0ZXJtaW5lZCB0byByZWFjaCB0aGUgZGVzdGluYXRpb24gcm9sZSBkZWZpbmVkIGJ5IHRoZSBXUy1BZGRyZXNzaW5nIFRvLiI7Ci0KLSAgICAgICAgc3RhdGljIGZpbmFsIFFOYW1lIFdTQVdfVVNJTkdfQUREUkVTU0lORyA9Ci0gICAgICAgICAgICAgICAgbmV3IFFOYW1lKFdTQV9OQU1FU1BBQ0UsIFVTSU5HX0FERFJFU1NJTkcpOwotCi0gICAgICAgIGZpbmFsIFFOYW1lIFFOQU1FX1dTQV9UTyA9IG5ldyBRTmFtZShXU0FfTkFNRVNQQUNFLCBXU0FfVE8pOwotICAgICAgICBmaW5hbCBRTmFtZSBRTkFNRV9XU0FfRlJPTSA9IG5ldyBRTmFtZShXU0FfTkFNRVNQQUNFLCBXU0FfRlJPTSk7Ci0gICAgICAgIGZpbmFsIFFOYW1lIFFOQU1FX1dTQV9SRVBMWV9UTyA9IG5ldyBRTmFtZShXU0FfTkFNRVNQQUNFLCBXU0FfUkVQTFlfVE8pOwotICAgICAgICBmaW5hbCBRTmFtZSBRTkFNRV9XU0FfUkVMQVRFU19UTyA9IG5ldyBRTmFtZShXU0FfTkFNRVNQQUNFLCBXU0FfUkVMQVRFU19UTyk7Ci0gICAgICAgIGZpbmFsIFFOYW1lIFFOQU1FX1dTQV9NRVNTQUdFX0lEID0gbmV3IFFOYW1lKFdTQV9OQU1FU1BBQ0UsIFdTQV9NRVNTQUdFX0lEKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvYWRkcmVzc2luZy9BZGRyZXNzaW5nRmF1bHRzSGVscGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvYWRkcmVzc2luZy9BZGRyZXNzaW5nRmF1bHRzSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5NWJiMjkuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2FkZHJlc3NpbmcvQWRkcmVzc2luZ0ZhdWx0c0hlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQMTJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmF1bHRDb2RlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmF1bHRTdWJDb2RlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmF1bHRWYWx1ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuQWRkcmVzc2luZ0NvbnN0YW50cy5GaW5hbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuQWRkcmVzc2luZ0NvbnN0YW50cy5TdWJtaXNzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5pMThuLkFkZHJlc3NpbmdNZXNzYWdlczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk9wZXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLXB1YmxpYyBjbGFzcyBBZGRyZXNzaW5nRmF1bHRzSGVscGVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhBZGRyZXNzaW5nRmF1bHRzSGVscGVyLmNsYXNzKTsKLQotICAgIC8qKgotICAgICAqIEJ1aWxkIGFuIHVuZGVyc3Rhbm5kYWJsZSBmYXVsdCBzdHJpbmcgZm9yIHRoZSBnaXZlbiBmYXVsdENvZGUgYW5kIHdzYTpGYXVsdERldGFpbCBpbmZvLgotICAgICAqIFNob3VsZCByZWFsbHkgdXNlIGEgbWVzc2FnZSBidW5kbGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZmF1bHRDb2RlTG9jYWxOYW1lCi0gICAgICogQHBhcmFtIGZhdWx0RGV0YWlsCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2VGb3JBeGlzRmF1bHQoU3RyaW5nIGZhdWx0Q29kZUxvY2FsTmFtZSwgU3RyaW5nIGZhdWx0RGV0YWlsKSB7Ci0gICAgICAgIFN0cmluZyByZXN1bHQgPSBudWxsOwotCi0gICAgICAgIGlmIChTdWJtaXNzaW9uLkZBVUxUX0lOVkFMSURfSEVBREVSLmVxdWFscyhmYXVsdENvZGVMb2NhbE5hbWUpKSB7Ci0gICAgICAgICAgICBpZiAoZmF1bHREZXRhaWwgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJlc3VsdCA9IEFkZHJlc3NpbmdNZXNzYWdlcwotICAgICAgICAgICAgICAgICAgICAgICAgLmdldE1lc3NhZ2UoInNwZWNpZmljSW52YWxpZEFkZHJlc3NpbmdIZWFkZXIiLCBmYXVsdERldGFpbCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJlc3VsdCA9IEFkZHJlc3NpbmdNZXNzYWdlcy5nZXRNZXNzYWdlKCJpbnZhbGlkQWRkcmVzc2luZ0hlYWRlciIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKEZpbmFsLkZBVUxUX0lOVkFMSURfSEVBREVSLmVxdWFscyhmYXVsdENvZGVMb2NhbE5hbWUpKSB7Ci0gICAgICAgICAgICBpZiAoZmF1bHREZXRhaWwgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJlc3VsdCA9IEFkZHJlc3NpbmdNZXNzYWdlcwotICAgICAgICAgICAgICAgICAgICAgICAgLmdldE1lc3NhZ2UoInNwZWNpZmljSW52YWxpZEFkZHJlc3NpbmdIZWFkZXIiLCBmYXVsdERldGFpbCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJlc3VsdCA9IEFkZHJlc3NpbmdNZXNzYWdlcy5nZXRNZXNzYWdlKCJpbnZhbGlkQWRkcmVzc2luZ0hlYWRlciIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKCJJbnZhbGlkQ2FyZGluYWxpdHkiLmVxdWFscyhmYXVsdENvZGVMb2NhbE5hbWUpKSB7Ci0gICAgICAgICAgICBpZiAoZmF1bHREZXRhaWwgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJlc3VsdCA9IEFkZHJlc3NpbmdNZXNzYWdlcy5nZXRNZXNzYWdlKCJzcGVjaWZpY0ludmFsaWRDYXJkaW5hbGl0eSIsIGZhdWx0RGV0YWlsKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gQWRkcmVzc2luZ01lc3NhZ2VzLmdldE1lc3NhZ2UoImludmFsaWRDYXJkaW5hbGl0eSIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKCJNaXNzaW5nQWRkcmVzc0luRVBSIi5lcXVhbHMoZmF1bHRDb2RlTG9jYWxOYW1lKSkgewotICAgICAgICAgICAgaWYgKGZhdWx0RGV0YWlsICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBBZGRyZXNzaW5nTWVzc2FnZXMuZ2V0TWVzc2FnZSgic3BlY2lmaWNNaXNzaW5nQWRkcmVzc0luRVBSIiwgZmF1bHREZXRhaWwpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBBZGRyZXNzaW5nTWVzc2FnZXMuZ2V0TWVzc2FnZSgibWlzc2luZ0FkZHJlc3NJbkVQUiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKCJEdXBsaWNhdGVNZXNzYWdlSUQiLmVxdWFscyhmYXVsdENvZGVMb2NhbE5hbWUpKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBBZGRyZXNzaW5nTWVzc2FnZXMuZ2V0TWVzc2FnZSgiZHVwbGljYXRlTWVzc2FnZUlEIik7Ci0gICAgICAgIH0gZWxzZSBpZiAoIkFjdGlvbk1pc21hdGNoIi5lcXVhbHMoZmF1bHRDb2RlTG9jYWxOYW1lKSkgewotICAgICAgICAgICAgcmVzdWx0ID0gQWRkcmVzc2luZ01lc3NhZ2VzLmdldE1lc3NhZ2UoImFjdGlvbk1pc21hdGNoIik7Ci0gICAgICAgIH0gZWxzZSBpZiAoRmluYWwuRkFVTFRfT05MWV9BTk9OWU1PVVNfQUREUkVTU19TVVBQT1JURUQuZXF1YWxzKGZhdWx0Q29kZUxvY2FsTmFtZSkpIHsKLSAgICAgICAgICAgIGlmIChmYXVsdERldGFpbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gQWRkcmVzc2luZ01lc3NhZ2VzCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0TWVzc2FnZSgic3BlY2lmaWNPbmx5QW5vbnltb3VzU3VwcG9ydGVkIiwgZmF1bHREZXRhaWwpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBBZGRyZXNzaW5nTWVzc2FnZXMuZ2V0TWVzc2FnZSgib25seUFub255bW91c1N1cHBvcnRlZCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKEZpbmFsLkZBVUxUX09OTFlfTk9OX0FOT05ZTU9VU19BRERSRVNTX1NVUFBPUlRFRC5lcXVhbHMoZmF1bHRDb2RlTG9jYWxOYW1lKSkgewotICAgICAgICAgICAgaWYgKGZhdWx0RGV0YWlsICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBBZGRyZXNzaW5nTWVzc2FnZXMuZ2V0TWVzc2FnZSgic3BlY2lmaWNPbmx5Tm9uQW5vblN1cHBvcnRlZCIsIGZhdWx0RGV0YWlsKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gQWRkcmVzc2luZ01lc3NhZ2VzLmdldE1lc3NhZ2UoIm9ubHlOb25Bbm9uU3VwcG9ydGVkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoU3VibWlzc2lvbi5GQVVMVF9BRERSRVNTSU5HX0hFQURFUl9SRVFVSVJFRC5lcXVhbHMoZmF1bHRDb2RlTG9jYWxOYW1lKSkgewotICAgICAgICAgICAgaWYgKGZhdWx0RGV0YWlsICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBBZGRyZXNzaW5nTWVzc2FnZXMKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRNZXNzYWdlKCJzcGVjaWZpY0FkZHJlc3NpbmdIZWFkZXJSZXF1aXJlZCIsIGZhdWx0RGV0YWlsKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gQWRkcmVzc2luZ01lc3NhZ2VzLmdldE1lc3NhZ2UoImFkZHJlc3NpbmdIZWFkZXJSZXF1aXJlZCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKEZpbmFsLkZBVUxUX0FERFJFU1NJTkdfSEVBREVSX1JFUVVJUkVELmVxdWFscyhmYXVsdENvZGVMb2NhbE5hbWUpKSB7Ci0gICAgICAgICAgICBpZiAoZmF1bHREZXRhaWwgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJlc3VsdCA9IEFkZHJlc3NpbmdNZXNzYWdlcwotICAgICAgICAgICAgICAgICAgICAgICAgLmdldE1lc3NhZ2UoInNwZWNpZmljQWRkcmVzc2luZ0hlYWRlclJlcXVpcmVkIiwgZmF1bHREZXRhaWwpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBBZGRyZXNzaW5nTWVzc2FnZXMuZ2V0TWVzc2FnZSgiYWRkcmVzc2luZ0hlYWRlclJlcXVpcmVkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZQotICAgICAgICBpZiAoQWRkcmVzc2luZ0NvbnN0YW50cy5GQVVMVF9BRERSRVNTSU5HX0RFU1RJTkFUSU9OX1VOUkVBQ0hBQkxFLmVxdWFscyhmYXVsdENvZGVMb2NhbE5hbWUpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZmF1bHREZXRhaWwgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJlc3VsdCA9IEFkZHJlc3NpbmdNZXNzYWdlcwotICAgICAgICAgICAgICAgICAgICAgICAgLmdldE1lc3NhZ2UoInNwZWNpZmljRGVzdGluYXRpb25VbnJlYWNoYWJsZSIsIGZhdWx0RGV0YWlsKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gQWRkcmVzc2luZ01lc3NhZ2VzLmdldE1lc3NhZ2UoImRlc3RpbmF0aW9uVW5yZWFjaGFibGUiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChBZGRyZXNzaW5nQ29uc3RhbnRzLkZBVUxUX0FDVElPTl9OT1RfU1VQUE9SVEVELmVxdWFscyhmYXVsdENvZGVMb2NhbE5hbWUpKSB7Ci0gICAgICAgICAgICBpZiAoZmF1bHREZXRhaWwgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJlc3VsdCA9IEFkZHJlc3NpbmdNZXNzYWdlcy5nZXRNZXNzYWdlKCJzcGVjaWZpY0FjdGlvbk5vdFJlY29nbmlzZWQiLCBmYXVsdERldGFpbCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJlc3VsdCA9IEFkZHJlc3NpbmdNZXNzYWdlcy5nZXRNZXNzYWdlKCJhY3Rpb25Ob3RSZWNvZ25pc2VkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8vICAgIHdzYTpJbnZhbGlkQWRkcmVzc2luZ0hlYWRlciBbUmVhc29uXSB0aGUgc3RyaW5nOiAiQSBoZWFkZXIgcmVwcmVzZW50aW5nIGEgTWVzc2FnZSBBZGRyZXNzaW5nIFByb3BlcnR5IGlzIG5vdCB2YWxpZCBhbmQgdGhlIG1lc3NhZ2UgY2Fubm90IGJlIHByb2Nlc3NlZCIKLSAgICAvLyAgICAgIHdzYTpJbnZhbGlkQWRkcmVzcwotICAgIC8vICAgICAgd3NhOkludmFsaWRFUFIKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdHJpZ2dlckludmFsaWRFUFJGYXVsdChNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCwKLSAgICAgICAgICAgIFN0cmluZyBpbmNvcnJlY3RIZWFkZXJOYW1lKQotICAgIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBsb2cud2FybigidHJpZ2dlckludmFsaWRFUFJGYXVsdDogbWVzc2FnZUNvbnRleHQ6ICIgKyBtZXNzYWdlQ29udGV4dCArCi0gICAgICAgICAgICAgICAgIiBpbmNvcnJlY3RIZWFkZXJOYW1lOiAiICsgaW5jb3JyZWN0SGVhZGVyTmFtZSk7Ci0gICAgICAgIFN0cmluZyBuYW1lc3BhY2UgPQotICAgICAgICAgICAgKFN0cmluZyltZXNzYWdlQ29udGV4dC5nZXRQcm9wZXJ0eShBZGRyZXNzaW5nQ29uc3RhbnRzLldTX0FERFJFU1NJTkdfVkVSU0lPTik7Ci0gICAgICAgIGlmIChTdWJtaXNzaW9uLldTQV9OQU1FU1BBQ0UuZXF1YWxzKG5hbWVzcGFjZSkpIHsKLSAgICAgICAgICAgIHRyaWdnZXJBZGRyZXNzaW5nRmF1bHQobWVzc2FnZUNvbnRleHQsIEZpbmFsLkZBVUxUX0hFQURFUl9QUk9CX0hFQURFUl9RTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgQWRkcmVzc2luZ0NvbnN0YW50cy5XU0FfREVGQVVMVF9QUkVGSVggKyAiOiIgKwotICAgICAgICAgICAgICAgICAgICBpbmNvcnJlY3RIZWFkZXJOYW1lLCBTdWJtaXNzaW9uLkZBVUxUX0lOVkFMSURfSEVBREVSLAotICAgICAgICAgICAgICAgICAgICBudWxsLCBBZGRyZXNzaW5nTWVzc2FnZXMuZ2V0TWVzc2FnZSgKLSAgICAgICAgICAgICAgICAgICAgInNwZWMuc3VibWlzc2lvbi5GQVVMVF9JTlZBTElEX0hFQURFUl9SRUFTT04iKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0cmlnZ2VyQWRkcmVzc2luZ0ZhdWx0KG1lc3NhZ2VDb250ZXh0LCBGaW5hbC5GQVVMVF9IRUFERVJfUFJPQl9IRUFERVJfUU5BTUUsCi0gICAgICAgICAgICAgICAgICAgIEFkZHJlc3NpbmdDb25zdGFudHMuV1NBX0RFRkFVTFRfUFJFRklYICsgIjoiICsKLSAgICAgICAgICAgICAgICAgICAgaW5jb3JyZWN0SGVhZGVyTmFtZSwgRmluYWwuRkFVTFRfSU5WQUxJRF9IRUFERVIsCi0gICAgICAgICAgICAgICAgICAgICJJbnZhbGlkRVBSIiwKLSAgICAgICAgICAgICAgICAgICAgQWRkcmVzc2luZ01lc3NhZ2VzLmdldE1lc3NhZ2UoCi0gICAgICAgICAgICAgICAgICAgICJzcGVjLmZpbmFsLkZBVUxUX0lOVkFMSURfSEVBREVSX1JFQVNPTiIpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vICAgICAgd3NhOkludmFsaWRDYXJkaW5hbGl0eQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0cmlnZ2VySW52YWxpZENhcmRpbmFsaXR5RmF1bHQoTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaW5jb3JyZWN0SGVhZGVyTmFtZSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIGxvZy53YXJuKCJ0cmlnZ2VySW52YWxpZENhcmRpbmFsaXR5RmF1bHQ6IG1lc3NhZ2VDb250ZXh0OiAiICsgbWVzc2FnZUNvbnRleHQgKwotICAgICAgICAgICAgICAgICAiIGluY29ycmVjdEhlYWRlck5hbWU6ICIgKyBpbmNvcnJlY3RIZWFkZXJOYW1lKTsKLSAgICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9Ci0gICAgICAgICAgICAgICAgKFN0cmluZyltZXNzYWdlQ29udGV4dC5nZXRQcm9wZXJ0eShBZGRyZXNzaW5nQ29uc3RhbnRzLldTX0FERFJFU1NJTkdfVkVSU0lPTik7Ci0gICAgICAgIGlmIChTdWJtaXNzaW9uLldTQV9OQU1FU1BBQ0UuZXF1YWxzKG5hbWVzcGFjZSkpIHsKLSAgICAgICAgICAgIHRyaWdnZXJBZGRyZXNzaW5nRmF1bHQobWVzc2FnZUNvbnRleHQsIEZpbmFsLkZBVUxUX0hFQURFUl9QUk9CX0hFQURFUl9RTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzc2luZ0NvbnN0YW50cy5XU0FfREVGQVVMVF9QUkVGSVggKyAiOiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY29ycmVjdEhlYWRlck5hbWUsIFN1Ym1pc3Npb24uRkFVTFRfSU5WQUxJRF9IRUFERVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgQWRkcmVzc2luZ01lc3NhZ2VzLmdldE1lc3NhZ2UoCi0gICAgICAgICAgICAgICAgICAgICJzcGVjLnN1Ym1pc3Npb24uRkFVTFRfSU5WQUxJRF9IRUFERVJfUkVBU09OIikpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdHJpZ2dlckFkZHJlc3NpbmdGYXVsdChtZXNzYWdlQ29udGV4dCwgRmluYWwuRkFVTFRfSEVBREVSX1BST0JfSEVBREVSX1FOQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzaW5nQ29uc3RhbnRzLldTQV9ERUZBVUxUX1BSRUZJWCArICI6IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jb3JyZWN0SGVhZGVyTmFtZSwgRmluYWwuRkFVTFRfSU5WQUxJRF9IRUFERVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWRDYXJkaW5hbGl0eSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzc2luZ01lc3NhZ2VzLmdldE1lc3NhZ2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3BlYy5maW5hbC5GQVVMVF9JTlZBTElEX0hFQURFUl9SRUFTT04iKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyAgICAgIHdzYTpNaXNzaW5nQWRkcmVzc0luRVBSCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHRyaWdnZXJNaXNzaW5nQWRkcmVzc0luRVBSRmF1bHQoTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGluY29ycmVjdEhlYWRlck5hbWUpCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgbG9nLndhcm4oInRyaWdnZXJNaXNzaW5nQWRkcmVzc0luRVBSRmF1bHQ6IG1lc3NhZ2VDb250ZXh0OiAiICsgbWVzc2FnZUNvbnRleHQgKwotICAgICAgICAgICAgICAgICAgICAiIGluY29ycmVjdEhlYWRlck5hbWU6ICIgKyBpbmNvcnJlY3RIZWFkZXJOYW1lKTsKLSAgICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9Ci0gICAgICAgICAgICAgICAgKFN0cmluZyltZXNzYWdlQ29udGV4dC5nZXRQcm9wZXJ0eShBZGRyZXNzaW5nQ29uc3RhbnRzLldTX0FERFJFU1NJTkdfVkVSU0lPTik7Ci0gICAgICAgIGlmIChTdWJtaXNzaW9uLldTQV9OQU1FU1BBQ0UuZXF1YWxzKG5hbWVzcGFjZSkpIHsKLSAgICAgICAgICAgIHRyaWdnZXJBZGRyZXNzaW5nRmF1bHQobWVzc2FnZUNvbnRleHQsIEZpbmFsLkZBVUxUX0hFQURFUl9QUk9CX0hFQURFUl9RTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzc2luZ0NvbnN0YW50cy5XU0FfREVGQVVMVF9QUkVGSVggKyAiOiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY29ycmVjdEhlYWRlck5hbWUsIFN1Ym1pc3Npb24uRkFVTFRfSU5WQUxJRF9IRUFERVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgQWRkcmVzc2luZ01lc3NhZ2VzLmdldE1lc3NhZ2UoCi0gICAgICAgICAgICAgICAgICAgICJzcGVjLnN1Ym1pc3Npb24uRkFVTFRfSU5WQUxJRF9IRUFERVJfUkVBU09OIikpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdHJpZ2dlckFkZHJlc3NpbmdGYXVsdChtZXNzYWdlQ29udGV4dCwgRmluYWwuRkFVTFRfSEVBREVSX1BST0JfSEVBREVSX1FOQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzaW5nQ29uc3RhbnRzLldTQV9ERUZBVUxUX1BSRUZJWCArICI6IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jb3JyZWN0SGVhZGVyTmFtZSwgRmluYWwuRkFVTFRfSU5WQUxJRF9IRUFERVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1pc3NpbmdBZGRyZXNzSW5FUFIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3NpbmdNZXNzYWdlcy5nZXRNZXNzYWdlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNwZWMuZmluYWwuRkFVTFRfSU5WQUxJRF9IRUFERVJfUkVBU09OIikpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gICAgICB3c2E6RHVwbGljYXRlTWVzc2FnZUlECi0gICAgLy8gICAgICB3c2E6QWN0aW9uTWlzbWF0Y2gKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdHJpZ2dlckFjdGlvbk1pc21hdGNoRmF1bHQoTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQsIFN0cmluZyBzb2FwQWN0aW9uLCBTdHJpbmcgd3NhQWN0aW9uKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgbG9nLndhcm4oInRyaWdnZXJBY3Rpb25NaXNtYXRjaEZhdWx0OiBtZXNzYWdlQ29udGV4dDogIiArIG1lc3NhZ2VDb250ZXh0KyIgc29hcEFjdGlvbj0iK3NvYXBBY3Rpb24rIiB3c2FBY3Rpb249Iit3c2FBY3Rpb24pOwotICAgICAgICBTdHJpbmcgbmFtZXNwYWNlID0KLSAgICAgICAgICAgICAgICAoU3RyaW5nKW1lc3NhZ2VDb250ZXh0LmdldFByb3BlcnR5KEFkZHJlc3NpbmdDb25zdGFudHMuV1NfQUREUkVTU0lOR19WRVJTSU9OKTsKLSAgICAgICAgaWYgKFN1Ym1pc3Npb24uV1NBX05BTUVTUEFDRS5lcXVhbHMobmFtZXNwYWNlKSkgewotICAgICAgICAgICAgdHJpZ2dlckFkZHJlc3NpbmdGYXVsdChtZXNzYWdlQ29udGV4dCwgRmluYWwuRkFVTFRfSEVBREVSX1BST0JfSEVBREVSX1FOQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzaW5nQ29uc3RhbnRzLldTQV9ERUZBVUxUX1BSRUZJWCArICI6QWN0aW9uIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3VibWlzc2lvbi5GQVVMVF9JTlZBTElEX0hFQURFUiwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzc2luZ01lc3NhZ2VzLmdldE1lc3NhZ2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNwZWMuc3VibWlzc2lvbi5GQVVMVF9JTlZBTElEX0hFQURFUl9SRUFTT04iKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0cmlnZ2VyQWRkcmVzc2luZ0ZhdWx0KG1lc3NhZ2VDb250ZXh0LCBGaW5hbC5GQVVMVF9IRUFERVJfUFJPQl9IRUFERVJfUU5BTUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3NpbmdDb25zdGFudHMuV1NBX0RFRkFVTFRfUFJFRklYICsgIjpBY3Rpb24iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaW5hbC5GQVVMVF9JTlZBTElEX0hFQURFUiwgIkFjdGlvbk1pc21hdGNoIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzc2luZ01lc3NhZ2VzLmdldE1lc3NhZ2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNwZWMuZmluYWwuRkFVTFRfSU5WQUxJRF9IRUFERVJfUkVBU09OIikpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gICAgICB3c2E6T25seUFub255bW91c0FkZHJlc3NTdXBwb3J0ZWQKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdHJpZ2dlck9ubHlBbm9ueW1vdXNBZGRyZXNzU3VwcG9ydGVkRmF1bHQoTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBpbmNvcnJlY3RIZWFkZXJOYW1lKQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJ0cmlnZ2VyT25seUFub255bW91c0FkZHJlc3NTdXBwb3J0ZWRGYXVsdDogbWVzc2FnZUNvbnRleHQ6ICIgKwotICAgICAgICAgICAgICAgICAgICBtZXNzYWdlQ29udGV4dCArICIgaW5jb3JyZWN0SGVhZGVyTmFtZTogIiArIGluY29ycmVjdEhlYWRlck5hbWUpOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZyBuYW1lc3BhY2UgPQotICAgICAgICAgICAgICAgIChTdHJpbmcpbWVzc2FnZUNvbnRleHQuZ2V0UHJvcGVydHkoQWRkcmVzc2luZ0NvbnN0YW50cy5XU19BRERSRVNTSU5HX1ZFUlNJT04pOwotICAgICAgICBpZiAoU3VibWlzc2lvbi5XU0FfTkFNRVNQQUNFLmVxdWFscyhuYW1lc3BhY2UpKSB7Ci0gICAgICAgICAgICB0cmlnZ2VyQWRkcmVzc2luZ0ZhdWx0KG1lc3NhZ2VDb250ZXh0LCBGaW5hbC5GQVVMVF9IRUFERVJfUFJPQl9IRUFERVJfUU5BTUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3NpbmdDb25zdGFudHMuV1NBX0RFRkFVTFRfUFJFRklYICsgIjoiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNvcnJlY3RIZWFkZXJOYW1lLCBTdWJtaXNzaW9uLkZBVUxUX0lOVkFMSURfSEVBREVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIEFkZHJlc3NpbmdNZXNzYWdlcy5nZXRNZXNzYWdlKAotICAgICAgICAgICAgICAgICAgICAic3BlYy5zdWJtaXNzaW9uLkZBVUxUX0lOVkFMSURfSEVBREVSX1JFQVNPTiIpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRyaWdnZXJBZGRyZXNzaW5nRmF1bHQobWVzc2FnZUNvbnRleHQsIEZpbmFsLkZBVUxUX0hFQURFUl9QUk9CX0hFQURFUl9RTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzc2luZ0NvbnN0YW50cy5XU0FfREVGQVVMVF9QUkVGSVggKyAiOiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY29ycmVjdEhlYWRlck5hbWUsIEZpbmFsLkZBVUxUX0lOVkFMSURfSEVBREVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbmFsLkZBVUxUX09OTFlfQU5PTllNT1VTX0FERFJFU1NfU1VQUE9SVEVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3NpbmdNZXNzYWdlcy5nZXRNZXNzYWdlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNwZWMuZmluYWwuRkFVTFRfSU5WQUxJRF9IRUFERVJfUkVBU09OIikpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gICAgICB3c2E6T25seU5vbkFub255bW91c0FkZHJlc3NTdXBwb3J0ZWQKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdHJpZ2dlck9ubHlOb25Bbm9ueW1vdXNBZGRyZXNzU3VwcG9ydGVkRmF1bHQoTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBpbmNvcnJlY3RIZWFkZXJOYW1lKQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJ0cmlnZ2VyT25seU5vbkFub255bW91c0FkZHJlc3NTdXBwb3J0ZWRGYXVsdDogbWVzc2FnZUNvbnRleHQ6ICIgKwotICAgICAgICAgICAgICAgICAgICBtZXNzYWdlQ29udGV4dCArICIgaW5jb3JyZWN0SGVhZGVyTmFtZTogIiArIGluY29ycmVjdEhlYWRlck5hbWUpOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZyBuYW1lc3BhY2UgPQotICAgICAgICAgICAgICAgIChTdHJpbmcpbWVzc2FnZUNvbnRleHQuZ2V0UHJvcGVydHkoQWRkcmVzc2luZ0NvbnN0YW50cy5XU19BRERSRVNTSU5HX1ZFUlNJT04pOwotICAgICAgICBpZiAoU3VibWlzc2lvbi5XU0FfTkFNRVNQQUNFLmVxdWFscyhuYW1lc3BhY2UpKSB7Ci0gICAgICAgICAgICB0cmlnZ2VyQWRkcmVzc2luZ0ZhdWx0KG1lc3NhZ2VDb250ZXh0LCBGaW5hbC5GQVVMVF9IRUFERVJfUFJPQl9IRUFERVJfUU5BTUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3NpbmdDb25zdGFudHMuV1NBX0RFRkFVTFRfUFJFRklYICsgIjoiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNvcnJlY3RIZWFkZXJOYW1lLCBTdWJtaXNzaW9uLkZBVUxUX0lOVkFMSURfSEVBREVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIEFkZHJlc3NpbmdNZXNzYWdlcy5nZXRNZXNzYWdlKAotICAgICAgICAgICAgICAgICAgICAic3BlYy5zdWJtaXNzaW9uLkZBVUxUX0lOVkFMSURfSEVBREVSX1JFQVNPTiIpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRyaWdnZXJBZGRyZXNzaW5nRmF1bHQobWVzc2FnZUNvbnRleHQsIEZpbmFsLkZBVUxUX0hFQURFUl9QUk9CX0hFQURFUl9RTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzc2luZ0NvbnN0YW50cy5XU0FfREVGQVVMVF9QUkVGSVggKyAiOiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY29ycmVjdEhlYWRlck5hbWUsIEZpbmFsLkZBVUxUX0lOVkFMSURfSEVBREVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbmFsLkZBVUxUX09OTFlfTk9OX0FOT05ZTU9VU19BRERSRVNTX1NVUFBPUlRFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzaW5nTWVzc2FnZXMuZ2V0TWVzc2FnZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzcGVjLmZpbmFsLkZBVUxUX0lOVkFMSURfSEVBREVSX1JFQVNPTiIpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vICAgIHdzYTpNZXNzYWdlQWRkcmVzc2luZ0hlYWRlclJlcXVpcmVkIFtSZWFzb25dIHRoZSBzdHJpbmc6ICJBIHJlcXVpcmVkIGhlYWRlciByZXByZXNlbnRpbmcgYSBNZXNzYWdlIEFkZHJlc3NpbmcgUHJvcGVydHkgaXMgbm90IHByZXNlbnQiCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHRyaWdnZXJNZXNzYWdlQWRkcmVzc2luZ1JlcXVpcmVkRmF1bHQoTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1pc3NpbmdIZWFkZXJOYW1lKQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJ0cmlnZ2VyTWVzc2FnZUFkZHJlc3NpbmdSZXF1aXJlZEZhdWx0OiBtZXNzYWdlQ29udGV4dDogIiArIG1lc3NhZ2VDb250ZXh0ICsKLSAgICAgICAgICAgICAgICAgICAgIiBtaXNzaW5nSGVhZGVyTmFtZTogIiArIG1pc3NpbmdIZWFkZXJOYW1lKTsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgbmFtZXNwYWNlID0KLSAgICAgICAgICAgICAgICAoU3RyaW5nKW1lc3NhZ2VDb250ZXh0LmdldFByb3BlcnR5KEFkZHJlc3NpbmdDb25zdGFudHMuV1NfQUREUkVTU0lOR19WRVJTSU9OKTsKLSAgICAgICAgaWYgKFN1Ym1pc3Npb24uV1NBX05BTUVTUEFDRS5lcXVhbHMobmFtZXNwYWNlKSkgewotICAgICAgICAgICAgdHJpZ2dlckFkZHJlc3NpbmdGYXVsdChtZXNzYWdlQ29udGV4dCwgRmluYWwuRkFVTFRfSEVBREVSX1BST0JfSEVBREVSX1FOQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzaW5nQ29uc3RhbnRzLldTQV9ERUZBVUxUX1BSRUZJWCArICI6IiArIG1pc3NpbmdIZWFkZXJOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdWJtaXNzaW9uLkZBVUxUX0FERFJFU1NJTkdfSEVBREVSX1JFUVVJUkVELCBudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzaW5nTWVzc2FnZXMuZ2V0TWVzc2FnZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3BlYy5zdWJtaXNzaW9uLkZBVUxUX0FERFJFU1NJTkdfSEVBREVSX1JFUVVJUkVEX1JFQVNPTiIpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRyaWdnZXJBZGRyZXNzaW5nRmF1bHQobWVzc2FnZUNvbnRleHQsIEZpbmFsLkZBVUxUX0hFQURFUl9QUk9CX0hFQURFUl9RTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzc2luZ0NvbnN0YW50cy5XU0FfREVGQVVMVF9QUkVGSVggKyAiOiIgKyBtaXNzaW5nSGVhZGVyTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmluYWwuRkFVTFRfQUREUkVTU0lOR19IRUFERVJfUkVRVUlSRUQsIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3NpbmdNZXNzYWdlcy5nZXRNZXNzYWdlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzcGVjLmZpbmFsLkZBVUxUX0FERFJFU1NJTkdfSEVBREVSX1JFUVVJUkVEX1JFQVNPTiIpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vICAgIHdzYTpEZXN0aW5hdGlvblVucmVhY2hhYmxlIFtSZWFzb25dIHRoZSBzdHJpbmc6ICJObyByb3V0ZSBjYW4gYmUgZGV0ZXJtaW5lZCB0byByZWFjaCBbZGVzdGluYXRpb25dIgotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0cmlnZ2VyRGVzdGluYXRpb25VbnJlYWNoYWJsZUZhdWx0KE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhZGRyZXNzKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoInRyaWdnZXJEZXN0aW5hdGlvblVucmVhY2hhYmxlRmF1bHQ6IG1lc3NhZ2VDb250ZXh0OiAiICsgbWVzc2FnZUNvbnRleHQgKwotICAgICAgICAgICAgICAgICAgICAiIGFkZHJlc3M6ICIgKyBhZGRyZXNzKTsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgbmFtZXNwYWNlID0KLSAgICAgICAgICAgICAgICAoU3RyaW5nKW1lc3NhZ2VDb250ZXh0LmdldFByb3BlcnR5KEFkZHJlc3NpbmdDb25zdGFudHMuV1NfQUREUkVTU0lOR19WRVJTSU9OKTsKLSAgICAgICAgaWYgKFN1Ym1pc3Npb24uV1NBX05BTUVTUEFDRS5lcXVhbHMobmFtZXNwYWNlKSkgewotICAgICAgICAgICAgdHJpZ2dlckFkZHJlc3NpbmdGYXVsdChtZXNzYWdlQ29udGV4dCwgRmluYWwuRkFVTFRfSEVBREVSX1BST0JfSVJJLCBudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzaW5nQ29uc3RhbnRzLkZBVUxUX0FERFJFU1NJTkdfREVTVElOQVRJT05fVU5SRUFDSEFCTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3NpbmdNZXNzYWdlcy5nZXRNZXNzYWdlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzcGVjLnN1Ym1pc3Npb24uRkFVTFRfQUREUkVTU0lOR19ERVNUSU5BVElPTl9VTlJFQUNIQUJMRV9SRUFTT04iKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0cmlnZ2VyQWRkcmVzc2luZ0ZhdWx0KG1lc3NhZ2VDb250ZXh0LCBGaW5hbC5GQVVMVF9IRUFERVJfUFJPQl9JUkksIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3NpbmdDb25zdGFudHMuRkFVTFRfQUREUkVTU0lOR19ERVNUSU5BVElPTl9VTlJFQUNIQUJMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzc2luZ01lc3NhZ2VzLmdldE1lc3NhZ2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNwZWMuZmluYWwuRkFVTFRfQUREUkVTU0lOR19ERVNUSU5BVElPTl9VTlJFQUNIQUJMRV9SRUFTT04iKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyAgICB3c2E6QWN0aW9uTm90U3VwcG9ydGVkIFtSZWFzb25dIHRoZSBzdHJpbmc6ICJUaGUgW2FjdGlvbl0gY2Fubm90IGJlIHByb2Nlc3NlZCBhdCB0aGUgcmVjZWl2ZXIiCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHRyaWdnZXJBY3Rpb25Ob3RTdXBwb3J0ZWRGYXVsdChNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwcm9ibGVtQWN0aW9uKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgbG9nLndhcm4oInRyaWdnZXJBY3Rpb25Ob3RTdXBwb3J0ZWRGYXVsdDogbWVzc2FnZUNvbnRleHQ6ICIgKyBtZXNzYWdlQ29udGV4dCArCi0gICAgICAgICAgICAgICAgICIgcHJvYmxlbUFjdGlvbjogIiArIHByb2JsZW1BY3Rpb24pOwotICAgICAgICB0cmlnZ2VyQWRkcmVzc2luZ0ZhdWx0KG1lc3NhZ2VDb250ZXh0LCBGaW5hbC5GQVVMVF9QUk9CTEVNX0FDVElPTl9OQU1FLCBwcm9ibGVtQWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3NpbmdDb25zdGFudHMuRkFVTFRfQUNUSU9OX05PVF9TVVBQT1JURUQsIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzc2luZ01lc3NhZ2VzLmdldE1lc3NhZ2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3BlYy5GQVVMVF9BQ1RJT05fTk9UX1NVUFBPUlRFRF9SRUFTT04iKSk7Ci0gICAgfQotCi0gICAgLy8gICAgd3NhOkVuZHBvaW50VW5hdmFpbGFibGUgW1JlYXNvbl0gdGhlIHN0cmluZyAiVGhlIGVuZHBvaW50IGlzIHVuYWJsZSB0byBwcm9jZXNzIHRoZSBtZXNzYWdlIGF0IHRoaXMgdGltZSIKLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdHJpZ2dlckFkZHJlc3NpbmdGYXVsdChNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZhdWx0SW5mb3JtYXRpb25LZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBmYXVsdEluZm9ybWF0aW9uVmFsdWUsIFN0cmluZyBmYXVsdGNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBmYXVsdFN1YmNvZGUsIFN0cmluZyBmYXVsdFJlYXNvbikKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBNYXAgZmF1bHRJbmZvcm1hdGlvbiA9Ci0gICAgICAgICAgICAgICAgKE1hcCltZXNzYWdlQ29udGV4dC5nZXRMb2NhbFByb3BlcnR5KENvbnN0YW50cy5GQVVMVF9JTkZPUk1BVElPTl9GT1JfSEVBREVSUyk7Ci0gICAgICAgIGlmIChmYXVsdEluZm9ybWF0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgIGZhdWx0SW5mb3JtYXRpb24gPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICAgICAgbWVzc2FnZUNvbnRleHQuc2V0UHJvcGVydHkoQ29uc3RhbnRzLkZBVUxUX0lORk9STUFUSU9OX0ZPUl9IRUFERVJTLCBmYXVsdEluZm9ybWF0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZhdWx0SW5mb3JtYXRpb24ucHV0KGZhdWx0SW5mb3JtYXRpb25LZXksIGZhdWx0SW5mb3JtYXRpb25WYWx1ZSk7Ci0KLSAgICAgICAgaWYgKG1lc3NhZ2VDb250ZXh0LmlzU09BUDExKCkpIHsKLSAgICAgICAgICAgIGZhdWx0Y29kZSA9IChmYXVsdFN1YmNvZGUgIT0gbnVsbCkgPyBmYXVsdFN1YmNvZGUgOiBmYXVsdGNvZGU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzZXRGYXVsdENvZGUobWVzc2FnZUNvbnRleHQsIGZhdWx0Y29kZSwgZmF1bHRTdWJjb2RlKTsKLSAgICAgICAgfQotCi0gICAgICAgIE9wZXJhdGlvbkNvbnRleHQgb2MgPSBtZXNzYWdlQ29udGV4dC5nZXRPcGVyYXRpb25Db250ZXh0KCk7Ci0gICAgICAgIGlmIChvYyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBvYy5zZXRQcm9wZXJ0eShDb25zdGFudHMuQ29uZmlndXJhdGlvbi5TRU5EX1NUQUNLVFJBQ0VfREVUQUlMU19XSVRIX0ZBVUxUUywgImZhbHNlIik7Ci0gICAgICAgIH0KLQotICAgICAgICBtZXNzYWdlQ29udGV4dC5zZXRQcm9wZXJ0eShBZGRyZXNzaW5nQ29uc3RhbnRzLkRJU0FCTEVfQUREUkVTU0lOR19GT1JfT1VUX01FU1NBR0VTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCb29sZWFuLkZBTFNFKTsKLSAgICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9Ci0gICAgICAgICAgICAgICAgKFN0cmluZyltZXNzYWdlQ29udGV4dC5nZXRQcm9wZXJ0eShBZGRyZXNzaW5nQ29uc3RhbnRzLldTX0FERFJFU1NJTkdfVkVSU0lPTik7Ci0gICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoZmF1bHRSZWFzb24sIG5ldyBRTmFtZShuYW1lc3BhY2UsIGZhdWx0Y29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3NpbmdDb25zdGFudHMuV1NBX0RFRkFVTFRfUFJFRklYKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXRGYXVsdENvZGUoTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQsIFN0cmluZyBmYXVsdENvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZhdWx0U3ViQ29kZSkgewotICAgICAgICBTT0FQRmFjdG9yeSBzb2FwRmFjID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDEyRmFjdG9yeSgpOwotICAgICAgICBTT0FQRmF1bHRDb2RlIHNvYXBGYXVsdENvZGUgPSBzb2FwRmFjLmNyZWF0ZVNPQVBGYXVsdENvZGUoKTsKLSAgICAgICAgaWYgKG1lc3NhZ2VDb250ZXh0LmlzU09BUDExKCkpIHsKLSAgICAgICAgICAgIHNvYXBGYXVsdENvZGUuc2V0VGV4dChmYXVsdENvZGUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgU09BUEZhdWx0VmFsdWUgc29hcEZhdWx0VmFsdWUgPSBzb2FwRmFjLmNyZWF0ZVNPQVBGYXVsdFZhbHVlKHNvYXBGYXVsdENvZGUpOwotICAgICAgICAgICAgc29hcEZhdWx0VmFsdWUuc2V0VGV4dChTT0FQMTJDb25zdGFudHMuU09BUF9ERUZBVUxUX05BTUVTUEFDRV9QUkVGSVggKyAiOiIgKwotICAgICAgICAgICAgICAgICAgICBTT0FQMTJDb25zdGFudHMuRkFVTFRfQ09ERV9TRU5ERVIpOwotICAgICAgICAgICAgU09BUEZhdWx0U3ViQ29kZSBzb2FwRmF1bHRTdWJDb2RlID0gc29hcEZhYy5jcmVhdGVTT0FQRmF1bHRTdWJDb2RlKHNvYXBGYXVsdENvZGUpOwotICAgICAgICAgICAgU09BUEZhdWx0VmFsdWUgc29hcEZhdWx0U3ViY29kZVZhbHVlID0gc29hcEZhYy5jcmVhdGVTT0FQRmF1bHRWYWx1ZShzb2FwRmF1bHRTdWJDb2RlKTsKLQotICAgICAgICAgICAgaWYgKGZhdWx0Q29kZSAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZXNwYWNlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChTdHJpbmcpIG1lc3NhZ2VDb250ZXh0LmdldFByb3BlcnR5KEFkZHJlc3NpbmdDb25zdGFudHMuV1NfQUREUkVTU0lOR19WRVJTSU9OKTsKLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlID0gRmluYWwuV1NBX05BTUVTUEFDRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgT01OYW1lc3BhY2Ugd3NhTlMgPSBzb2FwRmFjLmNyZWF0ZU9NTmFtZXNwYWNlKG5hbWVzcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3NpbmdDb25zdGFudHMuV1NBX0RFRkFVTFRfUFJFRklYKTsKLSAgICAgICAgICAgICAgICBzb2FwRmF1bHRTdWJjb2RlVmFsdWUuZGVjbGFyZU5hbWVzcGFjZSh3c2FOUyk7Ci0gICAgICAgICAgICAgICAgc29hcEZhdWx0U3ViY29kZVZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAuc2V0VGV4dChBZGRyZXNzaW5nQ29uc3RhbnRzLldTQV9ERUZBVUxUX1BSRUZJWCArICI6IiArIGZhdWx0Q29kZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChmYXVsdFN1YkNvZGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFNPQVBGYXVsdFN1YkNvZGUgc29hcEZhdWx0U3ViQ29kZTIgPQotICAgICAgICAgICAgICAgICAgICAgICAgc29hcEZhYy5jcmVhdGVTT0FQRmF1bHRTdWJDb2RlKHNvYXBGYXVsdFN1YkNvZGUpOwotICAgICAgICAgICAgICAgIFNPQVBGYXVsdFZhbHVlIHNvYXBGYXVsdFN1YmNvZGVWYWx1ZTIgPQotICAgICAgICAgICAgICAgICAgICAgICAgc29hcEZhYy5jcmVhdGVTT0FQRmF1bHRWYWx1ZShzb2FwRmF1bHRTdWJDb2RlMik7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoU3RyaW5nKSBtZXNzYWdlQ29udGV4dC5nZXRQcm9wZXJ0eShBZGRyZXNzaW5nQ29uc3RhbnRzLldTX0FERFJFU1NJTkdfVkVSU0lPTik7Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZSA9IEZpbmFsLldTQV9OQU1FU1BBQ0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIE9NTmFtZXNwYWNlIHdzYU5TID0gc29hcEZhYy5jcmVhdGVPTU5hbWVzcGFjZShuYW1lc3BhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzaW5nQ29uc3RhbnRzLldTQV9ERUZBVUxUX1BSRUZJWCk7Ci0gICAgICAgICAgICAgICAgc29hcEZhdWx0U3ViY29kZVZhbHVlMi5kZWNsYXJlTmFtZXNwYWNlKHdzYU5TKTsKLSAgICAgICAgICAgICAgICBzb2FwRmF1bHRTdWJjb2RlVmFsdWUyCi0gICAgICAgICAgICAgICAgICAgICAgICAuc2V0VGV4dChBZGRyZXNzaW5nQ29uc3RhbnRzLldTQV9ERUZBVUxUX1BSRUZJWCArICI6IiArIGZhdWx0U3ViQ29kZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbWVzc2FnZUNvbnRleHQuc2V0UHJvcGVydHkoU09BUDEyQ29uc3RhbnRzLlNPQVBfRkFVTFRfQ09ERV9MT0NBTF9OQU1FLCBzb2FwRmF1bHRDb2RlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9NRWxlbWVudCBnZXREZXRhaWxFbGVtZW50Rm9yQWRkcmVzc2luZ0ZhdWx0KE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01OYW1lc3BhY2UgYWRkcmVzc2luZ05hbWVzcGFjZU9iamVjdCkgewotICAgICAgICBNYXAgZmF1bHRJbmZvID0gKE1hcCltZXNzYWdlQ29udGV4dC5nZXRMb2NhbFByb3BlcnR5KENvbnN0YW50cy5GQVVMVF9JTkZPUk1BVElPTl9GT1JfSEVBREVSUyk7Ci0gICAgICAgIE9NRWxlbWVudCBwcm9ibGVtRGV0YWlsID0gbnVsbDsKLSAgICAgICAgaWYgKGZhdWx0SW5mbyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgZmF1bHR5SGVhZGVyUU5hbWUgPSAoU3RyaW5nKWZhdWx0SW5mby5nZXQoRmluYWwuRkFVTFRfSEVBREVSX1BST0JfSEVBREVSX1FOQU1FKTsKLSAgICAgICAgICAgIFN0cmluZyBmYXVsdHlBY3Rpb24gPSAoU3RyaW5nKWZhdWx0SW5mby5nZXQoRmluYWwuRkFVTFRfUFJPQkxFTV9BQ1RJT05fTkFNRSk7Ci0gICAgICAgICAgICBTdHJpbmcgZmF1bHR5QWRkcmVzcyA9IChTdHJpbmcpZmF1bHRJbmZvLmdldChGaW5hbC5GQVVMVF9IRUFERVJfUFJPQl9JUkkpOwotICAgICAgICAgICAgaWYgKGZhdWx0eUFkZHJlc3MgIT0gbnVsbCAmJiAhIiIuZXF1YWxzKGZhdWx0eUFkZHJlc3MpKSB7Ci0gICAgICAgICAgICAgICAgcHJvYmxlbURldGFpbCA9IG1lc3NhZ2VDb250ZXh0LmdldEVudmVsb3BlKCkuZ2V0T01GYWN0b3J5KCkuY3JlYXRlT01FbGVtZW50KAotICAgICAgICAgICAgICAgICAgICAgICAgRmluYWwuRkFVTFRfSEVBREVSX1BST0JfSVJJLCBhZGRyZXNzaW5nTmFtZXNwYWNlT2JqZWN0KTsKLSAgICAgICAgICAgICAgICBwcm9ibGVtRGV0YWlsLnNldFRleHQoZmF1bHR5QWRkcmVzcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZmF1bHR5QWN0aW9uICE9IG51bGwgJiYgISIiLmVxdWFscyhmYXVsdHlBY3Rpb24pKSB7Ci0gICAgICAgICAgICAgICAgcHJvYmxlbURldGFpbCA9IG1lc3NhZ2VDb250ZXh0LmdldEVudmVsb3BlKCkuZ2V0T01GYWN0b3J5KCkuY3JlYXRlT01FbGVtZW50KAotICAgICAgICAgICAgICAgICAgICAgICAgRmluYWwuRkFVTFRfUFJPQkxFTV9BQ1RJT05fTkFNRSwgYWRkcmVzc2luZ05hbWVzcGFjZU9iamVjdCk7Ci0gICAgICAgICAgICAgICAgT01FbGVtZW50IHByb2JIMiA9IG1lc3NhZ2VDb250ZXh0LmdldEVudmVsb3BlKCkuZ2V0T01GYWN0b3J5KCkuY3JlYXRlT01FbGVtZW50KAotICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzc2luZ0NvbnN0YW50cy5XU0FfQUNUSU9OLCBhZGRyZXNzaW5nTmFtZXNwYWNlT2JqZWN0LCBwcm9ibGVtRGV0YWlsKTsKLSAgICAgICAgICAgICAgICBwcm9iSDIuc2V0VGV4dChmYXVsdHlBY3Rpb24pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGZhdWx0eUhlYWRlclFOYW1lICE9IG51bGwgJiYgISIiLmVxdWFscyhmYXVsdHlIZWFkZXJRTmFtZSkpIHsKLSAgICAgICAgICAgICAgICBwcm9ibGVtRGV0YWlsID0gbWVzc2FnZUNvbnRleHQuZ2V0RW52ZWxvcGUoKS5nZXRPTUZhY3RvcnkoKS5jcmVhdGVPTUVsZW1lbnQoCi0gICAgICAgICAgICAgICAgICAgICAgICBGaW5hbC5GQVVMVF9IRUFERVJfUFJPQl9IRUFERVJfUU5BTUUsIGFkZHJlc3NpbmdOYW1lc3BhY2VPYmplY3QpOwotICAgICAgICAgICAgICAgIHByb2JsZW1EZXRhaWwuc2V0VGV4dChmYXVsdHlIZWFkZXJRTmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHByb2JsZW1EZXRhaWw7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9hZGRyZXNzaW5nL0FkZHJlc3NpbmdIZWxwZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9hZGRyZXNzaW5nL0FkZHJlc3NpbmdIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjlhMmRjZi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvYWRkcmVzc2luZy9BZGRyZXNzaW5nSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3Npbmc7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5Mb2dnaW5nQ29udHJvbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1wdWJsaWMgY2xhc3MgQWRkcmVzc2luZ0hlbHBlciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coQWRkcmVzc2luZ0hlbHBlci5jbGFzcyk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIFJlcGx5VG8gYWRkcmVzcyBtYXRjaGVzIG9uZSBvZiB0aGUgc3VwcG9ydGVkCi0gICAgICogYW5vbnltb3VzIHVybHMuIElmIHRoZSBSZXBseVRvIGlzIG5vdCBzZXQsIGFub255bW91cyBpcyBhc3N1bWVkLCBwZXIgdGhlIEZpbmFsCi0gICAgICogc3BlYy4gVGhlIEFkZHJlc3NpbmdJbkhhbmRsZXIgc2hvdWxkIGhhdmUgc2V0IHRoZSBSZXBseVRvIHRvIG5vbi1udWxsIGluIHRoZQotICAgICAqIDIwMDQvMDggY2FzZSB0byBlbnN1cmUgdGhlIGRpZmZlcmVudCBzZW1hbnRpY3MuIChwZXIgQVhJUzItODg1KQotICAgICAqIAotICAgICAqIEFjY29yZGluZyB0byB0aGUgV1MtQWRkcmVzc2luZyBNZXRhZGF0YSBzcGVjIHRoZSBub25lIFVSSSBtdXN0IG5vdCBiZSByZWplY3RlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXNzYWdlQ29udGV4dAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1N5bmNSZXBseUFsbG93ZWQoTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQpIHsKLSAgICAgICAgRW5kcG9pbnRSZWZlcmVuY2UgcmVwbHlUbyA9IG1lc3NhZ2VDb250ZXh0LmdldFJlcGx5VG8oKTsKLSAgICAgICAgaWYgKHJlcGx5VG8gPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQgJiYgbG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcobWVzc2FnZUNvbnRleHQuZ2V0TG9nSURTdHJpbmcoKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAiIGlzU3luY1JlcGx5QWxsb3dlZDogUmVwbHlUbyBpcyBudWxsLiBSZXR1cm5pbmcgdHJ1ZSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVwbHlUby5oYXNBbm9ueW1vdXNBZGRyZXNzKCkgfHwgcmVwbHlUby5oYXNOb25lQWRkcmVzcygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBGYXVsdFRvIGFkZHJlc3MgbWF0Y2hlcyBvbmUgb2YgdGhlIHN1cHBvcnRlZAotICAgICAqIGFub255bW91cyB1cmxzLiBJZiB0aGUgRmF1bHRUbyBpcyBub3Qgc2V0LCB0aGUgUmVwbHlUbyBpcyBjaGVja2VkIHBlciB0aGUKLSAgICAgKiBzcGVjLgotICAgICAqIAotICAgICAqIEFjY29yZGluZyB0byB0aGUgV1MtQWRkcmVzc2luZyBNZXRhZGF0YSBzcGVjIHRoZSBub25lIFVSSSBtdXN0IG5vdCBiZSByZWplY3RlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXNzYWdlQ29udGV4dAotICAgICAqIEBzZWUgI2lzU3luY1JlcGx5QWxsb3dlZChvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQpCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzU3luY0ZhdWx0QWxsb3dlZChNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCkgewotICAgICAgICBFbmRwb2ludFJlZmVyZW5jZSBmYXVsdFRvID0gbWVzc2FnZUNvbnRleHQuZ2V0RmF1bHRUbygpOwotICAgICAgICBpZiAoZmF1bHRUbyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoTG9nZ2luZ0NvbnRyb2wuZGVidWdMb2dnaW5nQWxsb3dlZCAmJiBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhtZXNzYWdlQ29udGV4dC5nZXRMb2dJRFN0cmluZygpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIgaXNTeW5jRmF1bHRBbGxvd2VkOiBGYXVsdFRvIGlzIG51bGwuIFJldHVybmluZyBpc1N5bmNSZXBseUFsbG93ZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBpc1N5bmNSZXBseUFsbG93ZWQobWVzc2FnZUNvbnRleHQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGZhdWx0VG8uaGFzQW5vbnltb3VzQWRkcmVzcygpIHx8IGZhdWx0VG8uaGFzTm9uZUFkZHJlc3MoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgUmVwbHlUbyBhZGRyZXNzIGRvZXMgbm90IG1hdGNoIG9uZSBvZiB0aGUgc3VwcG9ydGVkCi0gICAgICogYW5vbnltb3VzIHVybHMuIElmIHRoZSBSZXBseVRvIGlzIG5vdCBzZXQsIGFub255bW91cyBpcyBhc3N1bWVkLCBwZXIgdGhlIEZpbmFsCi0gICAgICogc3BlYy4gVGhlIEFkZHJlc3NpbmdJbkhhbmRsZXIgc2hvdWxkIGhhdmUgc2V0IHRoZSBSZXBseVRvIHRvIG5vbi1udWxsIGluIHRoZQotICAgICAqIDIwMDQvMDggY2FzZSB0byBlbnN1cmUgdGhlIGRpZmZlcmVudCBzZW1hbnRpY3MuIChwZXIgQVhJUzItODg1KQotICAgICAqCi0gICAgICogQHBhcmFtIG1lc3NhZ2VDb250ZXh0Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVwbHlSZWRpcmVjdGVkKE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0KSB7Ci0gICAgICAgIEVuZHBvaW50UmVmZXJlbmNlIHJlcGx5VG8gPSBtZXNzYWdlQ29udGV4dC5nZXRSZXBseVRvKCk7Ci0gICAgICAgIGlmIChyZXBseVRvID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkICYmIGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKG1lc3NhZ2VDb250ZXh0LmdldExvZ0lEU3RyaW5nKCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgIiBpc1JlcGx5UmVkaXJlY3RlZDogUmVwbHlUbyBpcyBudWxsLiBSZXR1cm5pbmcgZmFsc2UiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiAhcmVwbHlUby5oYXNBbm9ueW1vdXNBZGRyZXNzKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIEZhdWx0VG8gYWRkcmVzcyBkb2VzIG5vdCBtYXRjaCBvbmUgb2YgdGhlIHN1cHBvcnRlZAotICAgICAqIGFub255bW91cyB1cmxzLiBJZiB0aGUgRmF1bHRUbyBpcyBub3Qgc2V0LCB0aGUgUmVwbHlUbyBpcyBjaGVja2VkIHBlciB0aGUKLSAgICAgKiBzcGVjLgotICAgICAqCi0gICAgICogQHBhcmFtIG1lc3NhZ2VDb250ZXh0Ci0gICAgICogQHNlZSAjaXNSZXBseVJlZGlyZWN0ZWQob3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0KQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0ZhdWx0UmVkaXJlY3RlZChNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCkgewotICAgICAgICBFbmRwb2ludFJlZmVyZW5jZSBmYXVsdFRvID0gbWVzc2FnZUNvbnRleHQuZ2V0RmF1bHRUbygpOwotICAgICAgICBpZiAoZmF1bHRUbyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoTG9nZ2luZ0NvbnRyb2wuZGVidWdMb2dnaW5nQWxsb3dlZCAmJiBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhtZXNzYWdlQ29udGV4dC5nZXRMb2dJRFN0cmluZygpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIgaXNGYXVsdFJlZGlyZWN0ZWQ6IEZhdWx0VG8gaXMgbnVsbC4gUmV0dXJuaW5nIGlzUmVwbHlSZWRpcmVjdGVkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gaXNSZXBseVJlZGlyZWN0ZWQobWVzc2FnZUNvbnRleHQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuICFmYXVsdFRvLmhhc0Fub255bW91c0FkZHJlc3MoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIElmIHRoZSBpbmJvdW5kIEZhdWx0VG8gaGVhZGVyIHdhcyBpbnZhbGlkIGFuZCBjYXVzZWQgYSBmYXVsdCwgdGhlIGZhdWx0IHNob3VsZCBub3QgYmUKLSAgICAgKiBzZW50IHRvIGl0LgotICAgICAqCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBmYXVsdCBzaG91bGQgYmUgc2VudCB0byB0aGUgRmF1bHRUbwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzaG91bGRTZW5kRmF1bHRUb0ZhdWx0VG8oTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQpIHsKLSAgICAgICAgLy8gdGhlcmUgYXJlIHNvbWUgaW5mb3JtYXRpb24gIHRoYXQgdGhlIGZhdWx0IHRocm93ZXIgd2FudHMgdG8gcGFzcyB0byB0aGUgZmF1bHQgcGF0aC4KLSAgICAgICAgLy8gTWVhbnMgdGhhdCB0aGUgZmF1bHQgaXMgYSB3cy1hZGRyZXNzaW5nIG9uZSBoZW5jZSB1c2UgdGhlIHdzLWFkZHJlc3NpbmcgZmF1bHQgYWN0aW9uLgotICAgICAgICBPYmplY3QgZmF1bHRJbmZvRm9ySGVhZGVycyA9Ci0gICAgICAgICAgICAgICAgbWVzc2FnZUNvbnRleHQuZ2V0TG9jYWxQcm9wZXJ0eShDb25zdGFudHMuRkFVTFRfSU5GT1JNQVRJT05fRk9SX0hFQURFUlMpOwotICAgICAgICAvLyBpZiB0aGUgZXhjZXB0aW9uIGlzIGR1ZSB0byBhIHByb2JsZW0gaW4gdGhlIGZhdWx0VG8gaGVhZGVyIGl0c2VsZiwgd2UgY2FuIG5vdCB1c2UgdGhvc2UKLSAgICAgICAgLy8gZmF1bHQgaW5mb3JtYXRpbyB0byBzZW5kIHRoZSBlcnJvci4gVHJ5IHRvIHNlbmQgdXNpbmcgcmVwbHlUbywgbGVhdmUgaXQgdG8gdHJhbnNwb3J0Ci0gICAgICAgIGJvb2xlYW4gZG9Ob3RTZW5kRmF1bHRVc2luZ0ZhdWx0VG8gPSBmYWxzZTsKLSAgICAgICAgaWYgKGZhdWx0SW5mb0ZvckhlYWRlcnMgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gVE9ETzogVGhpcyBzaG91bGQgcHJvYmFibHkgc3RvcmUgYSBRTmFtZSBpbnN0ZWFkIG9mIGEgU3RyaW5nLi4gY3VycmVudGx5IHdlIHJlbHkgb24gcHJlZml4IHN0cmluZyBtYXRjaGluZyEhCi0gICAgICAgICAgICBTdHJpbmcgcHJvYmxlbUhlYWRlck5hbWUgPSAoU3RyaW5nKSAoKE1hcCkgZmF1bHRJbmZvRm9ySGVhZGVycykKLSAgICAgICAgICAgICAgICAgICAgLmdldChBZGRyZXNzaW5nQ29uc3RhbnRzLkZpbmFsLkZBVUxUX0hFQURFUl9QUk9CX0hFQURFUl9RTkFNRSk7Ci0gICAgICAgICAgICBkb05vdFNlbmRGYXVsdFVzaW5nRmF1bHRUbyA9IChwcm9ibGVtSGVhZGVyTmFtZSAhPSBudWxsICYmIChBZGRyZXNzaW5nQ29uc3RhbnRzCi0gICAgICAgICAgICAgICAgICAgIC5XU0FfREVGQVVMVF9QUkVGSVggKyAiOiIgKyBBZGRyZXNzaW5nQ29uc3RhbnRzLldTQV9GQVVMVF9UTykKLSAgICAgICAgICAgICAgICAgICAgLmVxdWFscyhwcm9ibGVtSGVhZGVyTmFtZSkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAhZG9Ob3RTZW5kRmF1bHRVc2luZ0ZhdWx0VG87Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QWRkcmVzc2luZ1JlcXVpcmVtZW50UGFyZW1ldGVyVmFsdWUoQXhpc0Rlc2NyaXB0aW9uIGF4aXNEZXNjcmlwdGlvbil7Ci0gICAgCVN0cmluZyB2YWx1ZSA9ICIiOwotICAgICAgICBpZiAoYXhpc0Rlc2NyaXB0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIHZhbHVlID0gVXRpbHMuZ2V0UGFyYW1ldGVyVmFsdWUoCi0gICAgICAgICAgICAJCWF4aXNEZXNjcmlwdGlvbi5nZXRQYXJhbWV0ZXIoQWRkcmVzc2luZ0NvbnN0YW50cy5BRERSRVNTSU5HX1JFUVVJUkVNRU5UX1BBUkFNRVRFUikpOwotICAgICAgICAgICAgaWYodmFsdWUgIT1udWxsKXsKLSAgICAgICAgICAgIAl2YWx1ZSA9IHZhbHVlLnRyaW0oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkICYmIGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJnZXRBZGRyZXNzaW5nUmVxdWlyZW1lbnRQYXJlbWV0ZXJWYWx1ZTogdmFsdWU6ICciICsgdmFsdWUgKyAiJyIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHZhbHVlID09IG51bGwgfHwgIiIuZXF1YWxzKHZhbHVlKSkgewotICAgICAgICAgICAgdmFsdWUgPSBBZGRyZXNzaW5nQ29uc3RhbnRzLkFERFJFU1NJTkdfVU5TUEVDSUZJRUQ7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBFeHRyYWN0IHRoZSBwYXJhbWV0ZXIgcmVwcmVzZW50aW5nIHRoZSBBbm9ueW1vdXMgZmxhZyBmcm9tIHRoZSBBeGlzT3BlcmF0aW9uCi0gICAgICogYW5kIHJldHVybiB0aGUgU3RyaW5nIHZhbHVlLiBSZXR1cm4gdGhlIGRlZmF1bHQgb2YgIm9wdGlvbmFsIiBpZiBub3Qgc3BlY2lmaWVkLgotICAgICAqCi0gICAgICogQHBhcmFtIGF4aXNPcGVyYXRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRJbnZvY2F0aW9uUGF0dGVyblBhcmFtZXRlclZhbHVlKEF4aXNPcGVyYXRpb24gYXhpc09wZXJhdGlvbikgewotICAgICAgICBTdHJpbmcgdmFsdWUgPSAiIjsKLSAgICAgICAgaWYgKGF4aXNPcGVyYXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgdmFsdWUgPSBVdGlscy5nZXRQYXJhbWV0ZXJWYWx1ZSgKLSAgICAgICAgICAgICAgICAgICAgYXhpc09wZXJhdGlvbi5nZXRQYXJhbWV0ZXIoQWRkcmVzc2luZ0NvbnN0YW50cy5XU0FNX0lOVk9DQVRJT05fUEFUVEVSTl9QQVJBTUVURVJfTkFNRSkpOwotICAgICAgICAgICAgaWYodmFsdWUgIT1udWxsKXsKLSAgICAgICAgICAgIAl2YWx1ZSA9IHZhbHVlLnRyaW0oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkICYmIGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJnZXRJbnZvY2F0aW9uUGF0dGVyblBhcmFtZXRlclZhbHVlOiB2YWx1ZTogJyIgKyB2YWx1ZSArICInIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCB8fCAiIi5lcXVhbHModmFsdWUpKSB7Ci0gICAgICAgICAgICB2YWx1ZSA9IEFkZHJlc3NpbmdDb25zdGFudHMuV1NBTV9JTlZPQ0FUSU9OX1BBVFRFUk5fQk9USDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSB2YWx1ZSBvZiBhbiBleGlzdGluZyB1bmxvY2tlZCBQYXJhbWV0ZXIgcmVwcmVzZW50aW5nIEFub255bW91cyBvciBhZGQgYSBuZXcgb25lIGlmIG9uZQotICAgICAqIGRvZXMgbm90IGV4aXN0LiBJZiBhIGxvY2tlZCBQYXJhbWV0ZXIgb2YgdGhlIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cyB0aGUgbWV0aG9kIHdpbGwgdHJhY2UgYW5kCi0gICAgICogcmV0dXJuLgotICAgICAqCi0gICAgICogQHBhcmFtIGF4aXNPcGVyYXRpb24KLSAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0SW52b2NhdGlvblBhdHRlcm5QYXJhbWV0ZXJWYWx1ZShBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb24sIFN0cmluZyB2YWx1ZSkgewotICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQgJiYgbG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoInNldEludm9jYXRpb25QYXR0ZXJuUGFyYW1ldGVyVmFsdWU6IHZhbHVlIHBhc3NlZCBpbiBpcyBudWxsLiByZXR1cm4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIFBhcmFtZXRlciBwYXJhbSA9Ci0gICAgICAgICAgICAgICAgYXhpc09wZXJhdGlvbi5nZXRQYXJhbWV0ZXIoQWRkcmVzc2luZ0NvbnN0YW50cy5XU0FNX0lOVk9DQVRJT05fUEFUVEVSTl9QQVJBTUVURVJfTkFNRSk7Ci0gICAgICAgIC8vIElmIGFuIGV4aXN0aW5nIHBhcmFtZXRlciBleGlzdHMKLSAgICAgICAgaWYgKHBhcmFtICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkICYmIGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJzZXRJbnZvY2F0aW9uUGF0dGVyblBhcmFtZXRlclZhbHVlOiBQYXJhbWV0ZXIgYWxyZWFkeSBleGlzdHMiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIGFuZCBpcyBub3QgbG9ja2VkCi0gICAgICAgICAgICBpZiAoIXBhcmFtLmlzTG9ja2VkKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoTG9nZ2luZ0NvbnRyb2wuZGVidWdMb2dnaW5nQWxsb3dlZCAmJiBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoInNldEludm9jYXRpb25QYXR0ZXJuUGFyYW1ldGVyVmFsdWU6IFBhcmFtZXRlciBub3QgbG9ja2VkLiBTZXR0aW5nIHZhbHVlOiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIHNldCB0aGUgdmFsdWUKLSAgICAgICAgICAgICAgICBwYXJhbS5zZXRWYWx1ZSh2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBvdGhlcndpc2UsIGlmIG5vIFBhcmFtZXRlciBleGlzdHMKLSAgICAgICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkICYmIGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJzZXRJbnZvY2F0aW9uUGF0dGVyblBhcmFtZXRlclZhbHVlOiBQYXJhbWV0ZXIgZG9lcyBub3QgZXhpc3QiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIENyZWF0ZSBuZXcgUGFyYW1ldGVyIHdpdGggY29ycmVjdCBuYW1lL3ZhbHVlCi0gICAgICAgICAgICBwYXJhbSA9IG5ldyBQYXJhbWV0ZXIoKTsKLSAgICAgICAgICAgIHBhcmFtLnNldE5hbWUoQWRkcmVzc2luZ0NvbnN0YW50cy5XU0FNX0lOVk9DQVRJT05fUEFUVEVSTl9QQVJBTUVURVJfTkFNRSk7Ci0gICAgICAgICAgICBwYXJhbS5zZXRWYWx1ZSh2YWx1ZSk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkICYmIGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1Zygic2V0SW52b2NhdGlvblBhdHRlcm5QYXJhbWV0ZXJWYWx1ZTogQWRkaW5nIHBhcmFtZXRlciB3aXRoIHZhbHVlOiAiICsgdmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBhbmQgYWRkIGl0IHRvIHRoZSBBeGlzT3BlcmF0aW9uIG9iamVjdAotICAgICAgICAgICAgICAgIGF4aXNPcGVyYXRpb24uYWRkUGFyYW1ldGVyKHBhcmFtKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBhZikgewotICAgICAgICAgICAgICAgIC8vIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4uIEF4aXNGYXVsdCBpcyBvbmx5IGV2ZXIgdGhyb3duIHdoZW4gYSBsb2NrZWQgUGFyYW1ldGVyCi0gICAgICAgICAgICAgICAgLy8gb2YgdGhlIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cyBhbmQgdGhpcyBzaG91bGQgYmUgZGVhbHQgd2l0aCBieSB0aGUgb3V0ZXIKLSAgICAgICAgICAgICAgICAvLyBpZiBzdGF0ZW1lbnQuCi0gICAgICAgICAgICAgICAgaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQgJiYgbG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXRJbnZvY2F0aW9uUGF0dGVyblBhcmFtZXRlclZhbHVlOiBhZGRQYXJhbWV0ZXIgZmFpbGVkOiAiICsgYWYuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0QWRkcmVzc2luZ1JlcXVpcmVtZW50UGFyZW1ldGVyVmFsdWUoQXhpc0Rlc2NyaXB0aW9uIGF4aXNEZXNjcmlwdGlvbiwgU3RyaW5nIHZhbHVlKSB7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoTG9nZ2luZ0NvbnRyb2wuZGVidWdMb2dnaW5nQWxsb3dlZCAmJiBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1Zygic2V0QWRkcmVzc2luZ1JlcXVpcmVtZW50UGFyZW1ldGVyVmFsdWU6IHZhbHVlIHBhc3NlZCBpbiBpcyBudWxsLiByZXR1cm4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIFBhcmFtZXRlciBwYXJhbSA9Ci0gICAgICAgIAlheGlzRGVzY3JpcHRpb24uZ2V0UGFyYW1ldGVyKEFkZHJlc3NpbmdDb25zdGFudHMuQUREUkVTU0lOR19SRVFVSVJFTUVOVF9QQVJBTUVURVIpOwotICAgICAgICAvLyBJZiBhbiBleGlzdGluZyBwYXJhbWV0ZXIgZXhpc3RzCi0gICAgICAgIGlmIChwYXJhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoTG9nZ2luZ0NvbnRyb2wuZGVidWdMb2dnaW5nQWxsb3dlZCAmJiBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1Zygic2V0QWRkcmVzc2luZ1JlcXVpcmVtZW50UGFyZW1ldGVyVmFsdWU6IFBhcmFtZXRlciBhbHJlYWR5IGV4aXN0cyIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gYW5kIGlzIG5vdCBsb2NrZWQKLSAgICAgICAgICAgIGlmICghcGFyYW0uaXNMb2NrZWQoKSkgewotICAgICAgICAgICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkICYmIGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1Zygic2V0QWRkcmVzc2luZ1JlcXVpcmVtZW50UGFyZW1ldGVyVmFsdWU6IFBhcmFtZXRlciBub3QgbG9ja2VkLiBTZXR0aW5nIHZhbHVlOiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIHNldCB0aGUgdmFsdWUKLSAgICAgICAgICAgICAgICBwYXJhbS5zZXRWYWx1ZSh2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBvdGhlcndpc2UsIGlmIG5vIFBhcmFtZXRlciBleGlzdHMKLSAgICAgICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkICYmIGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJzZXRBZGRyZXNzaW5nUmVxdWlyZW1lbnRQYXJlbWV0ZXJWYWx1ZTogUGFyYW1ldGVyIGRvZXMgbm90IGV4aXN0Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBDcmVhdGUgbmV3IFBhcmFtZXRlciB3aXRoIGNvcnJlY3QgbmFtZS92YWx1ZQotICAgICAgICAgICAgcGFyYW0gPSBuZXcgUGFyYW1ldGVyKCk7Ci0gICAgICAgICAgICBwYXJhbS5zZXROYW1lKEFkZHJlc3NpbmdDb25zdGFudHMuQUREUkVTU0lOR19SRVFVSVJFTUVOVF9QQVJBTUVURVIpOwotICAgICAgICAgICAgcGFyYW0uc2V0VmFsdWUodmFsdWUpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpZiAoTG9nZ2luZ0NvbnRyb2wuZGVidWdMb2dnaW5nQWxsb3dlZCAmJiBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoInNldEFkZHJlc3NpbmdSZXF1aXJlbWVudFBhcmVtZXRlclZhbHVlOiBBZGRpbmcgcGFyYW1ldGVyIHdpdGggdmFsdWU6ICIgKyB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIGFuZCBhZGQgaXQgdG8gdGhlIEF4aXNPcGVyYXRpb24gb2JqZWN0Ci0gICAgICAgICAgICAgICAgYXhpc0Rlc2NyaXB0aW9uLmFkZFBhcmFtZXRlcihwYXJhbSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgYWYpIHsKLSAgICAgICAgICAgICAgICAvLyBUaGlzIHNob3VsZCBub3QgaGFwcGVuLiBBeGlzRmF1bHQgaXMgb25seSBldmVyIHRocm93biB3aGVuIGEgbG9ja2VkIFBhcmFtZXRlcgotICAgICAgICAgICAgICAgIC8vIG9mIHRoZSBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHMgYW5kIHRoaXMgc2hvdWxkIGJlIGRlYWx0IHdpdGggYnkgdGhlIG91dGVyCi0gICAgICAgICAgICAgICAgLy8gaWYgc3RhdGVtZW50LgotICAgICAgICAgICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkICYmIGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2V0QWRkcmVzc2luZ1JlcXVpcmVtZW50UGFyZW1ldGVyVmFsdWU6IGFkZFBhcmFtZXRlciBmYWlsZWQ6ICIgKyBhZi5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCX0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9hZGRyZXNzaW5nL0VuZHBvaW50UmVmZXJlbmNlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvYWRkcmVzc2luZy9FbmRwb2ludFJlZmVyZW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjAzMGUyLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9hZGRyZXNzaW5nL0VuZHBvaW50UmVmZXJlbmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MzEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZzsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01Ob2RlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5idWlsZGVyLlN0QVhPTUJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS51dGlsLlN0QVhVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLnV0aWwuVVVJREdlbmVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuZXh0ZXJuYWxpemUuRXh0ZXJuYWxpemVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LmV4dGVybmFsaXplLlNhZmVPYmplY3RJbnB1dFN0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuZXh0ZXJuYWxpemUuU2FmZU9iamVjdE91dHB1dFN0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuZXh0ZXJuYWxpemUuU2FmZVNlcmlhbGl6YWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkV4dGVybmFsaXphYmxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBDbGFzcyBFbmRwb2ludFJlZmVyZW5jZQotICogVGhpcyBjbGFzcyBtb2RlbHMgdGhlIFdTLUEgRW5kcG9pbnRSZWZlcmVuY2VUeXBlLiBCdXQgdGhpcyBjYW4gYmUgdXNlZCB3aXRob3V0IGFueSBXUy1BIGhhbmRsZXJzIGFzIHdlbGwKLSAqIFNpbmNlIHRoZSBtb2RlbHMgZm9yIHRoaXMgaW4gU3VibWlzc2lvbiBhbmQgRmluYWwgdmVyc2lvbnMgYXJlIGRpZmZlcmVudCwgbGV0cyBtYWtlIHRoaXMgdG8gY29tcGx5IHdpdGgKLSAqIFdTLUEgRmluYWwgdmVyc2lvbi4gU28gYW55IGluZm9ybWF0aW9uIGZvdW5kIHdpdGggV1MtQSBzdWJtaXNzaW9uIHdpbGwgYmUgInB1bXBlZCIgaW4gdG8gdGhpcyBtb2RlbC4KLSAqLwotcHVibGljIGNsYXNzIEVuZHBvaW50UmVmZXJlbmNlIGltcGxlbWVudHMgRXh0ZXJuYWxpemFibGUsIFNhZmVTZXJpYWxpemFibGUgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNTI3ODg5MjE3MTE2MjM3MjQzOUw7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coRW5kcG9pbnRSZWZlcmVuY2UuY2xhc3MpOwotICAgIAotICAgIC8vICBzdXBwb3J0ZWQgcmV2aXNpb24gbGV2ZWxzLCBhZGQgYSBuZXcgbGV2ZWwgdG8gbWFuYWdlIGNvbXBhdGlibGUgY2hhbmdlcwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRVZJU0lPTl8yID0gMjsKLSAgICAvLyBjdXJyZW50IHJldmlzaW9uIGxldmVsIG9mIHRoaXMgb2JqZWN0Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IHJldmlzaW9uSUQgPSBSRVZJU0lPTl8yOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIG15Q2xhc3NOYW1lID0gIkVuZHBvaW50UmVmZXJlbmNlIjsKLQotICAgIC8qKgotICAgICAqIEFuIElEIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGNvcnJlbGF0ZSBvcGVyYXRpb25zIG9uIGFuIGluc3RhbmNlIG9mCi0gICAgICogdGhpcyBvYmplY3QgaW4gdGhlIGxvZyBmaWxlcwotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGxvZ0NvcnJlbGF0aW9uSURTdHJpbmc7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhlIGxpc3Qgb2YgVVJJcyB0aGF0IHNob3VsZCBiZSBjb25zaWRlcmVkIGVxdWl2YWxlbnQgdG8gCi0gICAgICogdGhlIFdTLUFkZHJlc3NpbmcgYW5vbnltb3VzIFVSSQotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIHZvbGF0aWxlIExpc3Q8U3RyaW5nPiBhbm9ueW1vdXNFcXVpdmFsZW50VVJJcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCi0KLSAgICAvKioKLSAgICAgKiA8RW5kcG9pbnRSZWZlcmVuY2U+Ci0gICAgICogPEFkZHJlc3M+eHM6YW55VVJJPC9BZGRyZXNzPgotICAgICAqIDxSZWZlcmVuY2VQYXJhbWV0ZXJzPnhzOmFueSo8L1JlZmVyZW5jZVBhcmFtZXRlcnM+Ci0gICAgICogPE1ldGFEYXRhPnhzOmFueSo8L01ldGFEYXRhPgotICAgICAqIDwhLS0gSW4gYWRkaXRpb24gdG8gdGhpcywgRVBSIGNhbiBjb250YWluIGFueSBudW1iZXIgb2YgT01FbGVtZW50cyAtLT4KLSAgICAgKiA8L0VuZHBvaW50UmVmZXJlbmNlPgotICAgICAqLwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLSAgICBwcml2YXRlIFN0cmluZyBhZGRyZXNzOwotICAgIHByaXZhdGUgQXJyYXlMaXN0PE9NQXR0cmlidXRlPiBhZGRyZXNzQXR0cmlidXRlczsKLSAgICBwcml2YXRlIEFycmF5TGlzdDxPTU5vZGU+IG1ldGFEYXRhOwotICAgIHByaXZhdGUgQXJyYXlMaXN0PE9NQXR0cmlidXRlPiBtZXRhRGF0YUF0dHJpYnV0ZXM7Ci0gICAgcHJpdmF0ZSBNYXA8UU5hbWUsIE9NRWxlbWVudD4gcmVmZXJlbmNlUGFyYW1ldGVyczsKLSAgICBwcml2YXRlIEFycmF5TGlzdDxPTUVsZW1lbnQ+IGV4dGVuc2libGVFbGVtZW50czsKLSAgICBwcml2YXRlIEFycmF5TGlzdDxPTUF0dHJpYnV0ZT4gYXR0cmlidXRlczsKLQotICAgIC8qKgotICAgICAqIE5vLUFyZyBDb25zdHJ1Y3RvcgotICAgICAqIFJlcXVpcmVkIGZvciBFeHRlcm5hbGl6YWJsZSBvYmplY3RzCi0gICAgICovCi0gICAgcHVibGljIEVuZHBvaW50UmVmZXJlbmNlKCkge30KLSAgICAKLSAgICAvKioKLSAgICAgKiBBZGRzIGEgcGFyYW1ldGVyIHRvIHRoZSBsaXN0IG9mIGFub255bW91cyBlcXVpdmFsZW50IFVSSXMuIAotICAgICAqIEBwYXJhbSBhbm9ueW1vdXNFcXVpdmFsZW50VVJJIGFueSBVUkkgdGhhdCBoYXMgYW4gYWRkcmVzcyB0aGF0Ci0gICAgICogYmVnaW5zIHdpdGggdGhpcyB2YWx1ZSB3aWxsIGJlIGNvbnNpZGVyZWQgdG8gYmUgYW5vbnltb3VzCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZEFub255bW91c0VxdWl2YWxlbnRVUkkoU3RyaW5nIGFub255bW91c0VxdWl2YWxlbnRVUkkpewotICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgIAlsb2cudHJhY2UoImFkZEFub255bW91c0VxdWl2YWxlbnRVUkk6ICIgKyBhbm9ueW1vdXNFcXVpdmFsZW50VVJJKTsKLSAgICAgICAgCi0gICAgICAgIC8vIEF2b2lkIHN5bmNocm9uaXphdGlvbiBpbiBoYXNBbm9ueW1vdXNBZGRyZXNzIGJ5IHVzaW5nIHRoZQotICAgICAgICAvLyB0ZWNobmlxdWUgb3V0bGluZWQgYXQgaHR0cDovL2lzLmdkL2d2MwotICAgICAgICBzeW5jaHJvbml6ZWQgKGFub255bW91c0VxdWl2YWxlbnRVUklzKSB7Ci0gICAgICAgIAlBcnJheUxpc3Q8U3RyaW5nPiBuZXdMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KGFub255bW91c0VxdWl2YWxlbnRVUklzKTsKLSAgICAgICAgCW5ld0xpc3QuYWRkKGFub255bW91c0VxdWl2YWxlbnRVUkkpOwotICAgICAgICAgICAgYW5vbnltb3VzRXF1aXZhbGVudFVSSXMgPSBuZXdMaXN0OwotICAgICAgICB9Ci0gICAgfQotIAotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGFkZHJlc3MKLSAgICAgKi8KLSAgICBwdWJsaWMgRW5kcG9pbnRSZWZlcmVuY2UoU3RyaW5nIGFkZHJlc3MpIHsKLSAgICAgICAgdGhpcy5hZGRyZXNzID0gYWRkcmVzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gb21FbGVtZW50Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkUmVmZXJlbmNlUGFyYW1ldGVyKE9NRWxlbWVudCBvbUVsZW1lbnQpIHsKLSAgICAgICAgaWYgKG9tRWxlbWVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJlZmVyZW5jZVBhcmFtZXRlcnMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmVmZXJlbmNlUGFyYW1ldGVycyA9IG5ldyBIYXNoTWFwPFFOYW1lLCBPTUVsZW1lbnQ+KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmVmZXJlbmNlUGFyYW1ldGVycy5wdXQob21FbGVtZW50LmdldFFOYW1lKCksIG9tRWxlbWVudCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHFuYW1lCi0gICAgICogQHBhcmFtIHZhbHVlIC0gdGhlIHRleHQgb2YgdGhlIE9NRWxlbWVudC4gUmVtZW1iZXIgdGhhdCB0aGlzIGlzIGEgY29udmVuaWVudCBtZXRob2QgZm9yIHRoZSB1c2VyLAotICAgICAqICAgICAgICAgICAgICB3aGljaCBoYXMgbGltaXRlZCBjYXBhYmlsaXR5LiBJZiB5b3Ugd2FudCBtb3JlIHBvd2VyIHVzZSBAU2VlIEVuZHBvaW50UmVmZXJlbmNlI2FkZFJlZmVyZW5jZVBhcmFtZXRlcihPTUVsZW1lbnQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkUmVmZXJlbmNlUGFyYW1ldGVyKFFOYW1lIHFuYW1lLCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgaWYgKHFuYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCkuY3JlYXRlT01FbGVtZW50KHFuYW1lLCBudWxsKTsKLSAgICAgICAgb21FbGVtZW50LnNldFRleHQodmFsdWUpOwotICAgICAgICBhZGRSZWZlcmVuY2VQYXJhbWV0ZXIob21FbGVtZW50KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHdpbGwgcmV0dXJuIGEgTWFwIG9mIHJlZmVyZW5jZSBwYXJhbWV0ZXJzIHdpdGggUU5hbWUgYXMgdGhlIGtleSBhbmQgYW4gT01FbGVtZW50Ci0gICAgICogYXMgdGhlIHZhbHVlCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIC0gbWFwIG9mIHRoZSByZWZlcmVuY2UgcGFyYW1ldGVycywgd2hlcmUgdGhlIGtleSBpcyB0aGUgUU5hbWUgb2YgdGhlIHJlZmVyZW5jZSBwYXJhbWV0ZXIKLSAgICAgKiAgICAgICAgIGFuZCB0aGUgdmFsdWUgaXMgYW4gT01FbGVtZW50Ci0gICAgICovCi0gICAgcHVibGljIE1hcDxRTmFtZSwgT01FbGVtZW50PiBnZXRBbGxSZWZlcmVuY2VQYXJhbWV0ZXJzKCkgewotICAgICAgICByZXR1cm4gcmVmZXJlbmNlUGFyYW1ldGVyczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEFkZHJlc3MoKSB7Ci0gICAgICAgIHJldHVybiBhZGRyZXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBhZGRyZXNzIC0geHM6YW55VVJJCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0QWRkcmVzcyhTdHJpbmcgYWRkcmVzcykgewotICAgICAgICB0aGlzLmFkZHJlc3MgPSBhZGRyZXNzOwotICAgIH0KLQotICAgIHB1YmxpYyBBcnJheUxpc3Q8T01BdHRyaWJ1dGU+IGdldEFkZHJlc3NBdHRyaWJ1dGVzKCkgewotICAgICAgICByZXR1cm4gYWRkcmVzc0F0dHJpYnV0ZXM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QWRkcmVzc0F0dHJpYnV0ZXMoQXJyYXlMaXN0PE9NQXR0cmlidXRlPiBhbCkgewotICAgICAgICBhZGRyZXNzQXR0cmlidXRlcyA9IGFsOwotICAgIH0KLQotICAgIHB1YmxpYyBBcnJheUxpc3Q8T01BdHRyaWJ1dGU+IGdldE1ldGFkYXRhQXR0cmlidXRlcygpIHsKLSAgICAgICAgcmV0dXJuIG1ldGFEYXRhQXR0cmlidXRlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXRhZGF0YUF0dHJpYnV0ZXMoQXJyYXlMaXN0PE9NQXR0cmlidXRlPiBhbCkgewotICAgICAgICBtZXRhRGF0YUF0dHJpYnV0ZXMgPSBhbDsKLSAgICB9Ci0gICAgCi0gICAgLyoqIAotICAgICAqIFRoaXMgbWV0aG9kIGlkZW50aWZpZXMgd2hldGhlciB0aGUgYWRkcmVzcyBpcyBhIFdTLUFkZHJlc3Npbmcgc3BlYyBkZWZpbmVkCi0gICAgICogYW5vbnltb3VzIFVSSS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGFkZHJlc3MgaXMgYSBXUy1BZGRyZXNzaW5nIHNwZWMgZGVmaW5lZCBhbm9ueW1vdXMgVVJJLgotICAgICAqIAotICAgICAqIEBzZWUgI2hhc0Fub255bW91c0FkZHJlc3MoKQotICAgICAqLyAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc1dTQWRkcmVzc2luZ0Fub255bW91cygpIHsKLSAgICAgICAgcmV0dXJuIChBZGRyZXNzaW5nQ29uc3RhbnRzLkZpbmFsLldTQV9BTk9OWU1PVVNfVVJMLmVxdWFscyhhZGRyZXNzKSB8fAotICAgICAgICAgICAgICAgIEFkZHJlc3NpbmdDb25zdGFudHMuU3VibWlzc2lvbi5XU0FfQU5PTllNT1VTX1VSTC5lcXVhbHMoYWRkcmVzcykpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGlkZW50aWZ5IHdoZW4gcmVzcG9uc2UgbWVzc2FnZXMgc2hvdWxkIGJlIHNlbnQgdXNpbmcKLSAgICAgKiB0aGUgYmFjayBjaGFubmVsIG9mIGEgdHdvLXdheSB0cmFuc3BvcnQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGFkZHJlc3MgaXMgYSBXUy1BZGRyZXNzaW5nIHNwZWMgZGVmaW5lZCBhbm9ueW1vdXMgVVJJLAotICAgICAqIG9yIHN0YXJ0cyB3aXRoIGEgc3RyaW5nIHRoYXQgaXMgc3BlY2lmaWVkIHRvIGJlIGVxdWl2YWxlbnQgdG8gYW4gYW5vbnltb3VzCi0gICAgICogVVJJLgotICAgICAqIAotICAgICAqIEBzZWUgI2FkZEFub255bW91c0VxdWl2YWxlbnRVUkkoU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGhhc0Fub255bW91c0FkZHJlc3MoKSB7Ci0gICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gaXNXU0FkZHJlc3NpbmdBbm9ueW1vdXMoKTsKLSAgICAgICAgCi0gICAgICAgIGlmKCFyZXN1bHQgJiYgYWRkcmVzcyAhPSBudWxsKSB7Ci0gICAgICAgIAkvLyBJZiB0aGUgYWRkcmVzcyBpcyBub3QgV1MtQSBhbm9ueW1vdXMgaXQgbWlnaHQgc3RpbGwgYmUgY29uc2lkZXJlZCBhbm9ueW1vdXMKLSAgICAgICAgCS8vIEF2b2lkIHN5bmNocm9uaXphdGlvbiBieSB1c2luZyB0aGUKLSAgICAgICAgICAgIC8vIHRlY2huaXF1ZSBvdXRsaW5lZCBhdCBodHRwOi8vaXMuZ2QvZ3YzCi0gICAgICAgIAlMaXN0PFN0cmluZz4gbG9jYWxMaXN0ID0gYW5vbnltb3VzRXF1aXZhbGVudFVSSXM7Ci0gICAgICAgIAlpZighbG9jYWxMaXN0LmlzRW1wdHkoKSl7Ci0gICAgICAgIAkJSXRlcmF0b3I8U3RyaW5nPiBpdCA9IGxvY2FsTGlzdC5pdGVyYXRvcigpOwotICAgICAgICAJCXdoaWxlKGl0Lmhhc05leHQoKSl7Ci0gICAgICAgIAkJCXJlc3VsdCA9IGFkZHJlc3Muc3RhcnRzV2l0aCgoU3RyaW5nKWl0Lm5leHQoKSk7Ci0gICAgICAgIAkJCWlmKHJlc3VsdCl7Ci0gICAgICAgIAkJCQlicmVhazsKLSAgICAgICAgCQkJfQotICAgICAgICAJCX0JCi0gICAgICAgIAl9ICAgIAkKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChsb2cuaXNUcmFjZUVuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLnRyYWNlKCJoYXNBbm9ueW1vdXNBZGRyZXNzOiAiICsgYWRkcmVzcyArICIgaXMgQW5vbnltb3VzOiAiICsgcmVzdWx0KTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBoYXNOb25lQWRkcmVzcwotICAgICAqCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBhZGRyZXNzIGlzIHRoZSAnTm9uZSBVUkknIGZyb20gdGhlIGZpbmFsIGFkZHJlc3Npbmcgc3BlYy4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNOb25lQWRkcmVzcygpIHsKLSAgICAgICAgYm9vbGVhbiByZXN1bHQgPSBBZGRyZXNzaW5nQ29uc3RhbnRzLkZpbmFsLldTQV9OT05FX1VSSS5lcXVhbHMoYWRkcmVzcyk7Ci0gICAgICAgIGlmIChsb2cuaXNUcmFjZUVuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLnRyYWNlKCJoYXNOb25lQWRkcmVzczogIiArIGFkZHJlc3MgKyAiIGlzIE5vbmU6ICIgKyByZXN1bHQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGxvY2FsTmFtZQotICAgICAqIEBwYXJhbSBucwotICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZEF0dHJpYnV0ZShTdHJpbmcgbG9jYWxOYW1lLCBPTU5hbWVzcGFjZSBucywgU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIGlmIChhdHRyaWJ1dGVzID09IG51bGwpIHsKLSAgICAgICAgICAgIGF0dHJpYnV0ZXMgPSBuZXcgQXJyYXlMaXN0PE9NQXR0cmlidXRlPigpOwotICAgICAgICB9Ci0gICAgICAgIGF0dHJpYnV0ZXMuYWRkKE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpLmNyZWF0ZU9NQXR0cmlidXRlKGxvY2FsTmFtZSwgbnMsIHZhbHVlKSk7Ci0gICAgfQotCi0gICAgcHVibGljIEFycmF5TGlzdDxPTUF0dHJpYnV0ZT4gZ2V0QXR0cmlidXRlcygpIHsKLSAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZXM7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gb21BdHRyaWJ1dGUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRBdHRyaWJ1dGUoT01BdHRyaWJ1dGUgb21BdHRyaWJ1dGUpIHsKLSAgICAgICAgaWYgKGF0dHJpYnV0ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgYXR0cmlidXRlcyA9IG5ldyBBcnJheUxpc3Q8T01BdHRyaWJ1dGU+KCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXR0cmlidXRlcy5hZGQob21BdHRyaWJ1dGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBBcnJheUxpc3Q8T01FbGVtZW50PiBnZXRFeHRlbnNpYmxlRWxlbWVudHMoKSB7Ci0gICAgICAgIHJldHVybiBleHRlbnNpYmxlRWxlbWVudHM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge2FueX0KLSAgICAgKgotICAgICAqIEBwYXJhbSBleHRlbnNpYmxlRWxlbWVudHMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRFeHRlbnNpYmxlRWxlbWVudHMoQXJyYXlMaXN0PE9NRWxlbWVudD4gZXh0ZW5zaWJsZUVsZW1lbnRzKSB7Ci0gICAgICAgIHRoaXMuZXh0ZW5zaWJsZUVsZW1lbnRzID0gZXh0ZW5zaWJsZUVsZW1lbnRzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZEV4dGVuc2libGVFbGVtZW50KE9NRWxlbWVudCBleHRlbnNpYmxlRWxlbWVudCkgewotICAgICAgICBpZiAoZXh0ZW5zaWJsZUVsZW1lbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKHRoaXMuZXh0ZW5zaWJsZUVsZW1lbnRzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aGlzLmV4dGVuc2libGVFbGVtZW50cyA9IG5ldyBBcnJheUxpc3Q8T01FbGVtZW50PigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhpcy5leHRlbnNpYmxlRWxlbWVudHMuYWRkKGV4dGVuc2libGVFbGVtZW50KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBBcnJheUxpc3Q8T01Ob2RlPiBnZXRNZXRhRGF0YSgpIHsKLSAgICAgICAgcmV0dXJuIG1ldGFEYXRhOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZE1ldGFEYXRhKE9NTm9kZSBtZXRhRGF0YSkgewotICAgICAgICBpZiAobWV0YURhdGEgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKHRoaXMubWV0YURhdGEgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRoaXMubWV0YURhdGEgPSBuZXcgQXJyYXlMaXN0PE9NTm9kZT4oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRoaXMubWV0YURhdGEuYWRkKG1ldGFEYXRhKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBuYW1lCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IGEgTWFwIHdpdGggUU5hbWUgYXMgdGhlIGtleSBhbmQgYW4gT01FbGVtZW50Ci0gICAgICogYXMgdGhlIHZhbHVlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVmZXJlbmNlUGFyYW1ldGVycwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFJlZmVyZW5jZVBhcmFtZXRlcnMoTWFwPFFOYW1lLCBPTUVsZW1lbnQ+IHJlZmVyZW5jZVBhcmFtZXRlcnMpIHsKLSAgICAgICAgdGhpcy5yZWZlcmVuY2VQYXJhbWV0ZXJzID0gcmVmZXJlbmNlUGFyYW1ldGVyczsKLSAgICB9Ci0KLSAgICAvKgotICAgICogIChub24tSmF2YWRvYykKLSAgICAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCi0gICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigiQWRkcmVzczogIiArIGFkZHJlc3MpOwotCi0gICAgICAgIGlmIChhZGRyZXNzQXR0cmlidXRlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBidWZmZXIuYXBwZW5kKCIsIEFkZHJlc3MgQXR0cmlidXRlczogIikuYXBwZW5kKGFkZHJlc3NBdHRyaWJ1dGVzKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtZXRhRGF0YSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBidWZmZXIuYXBwZW5kKCIsIE1ldGFkYXRhOiAiKS5hcHBlbmQobWV0YURhdGEpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAobWV0YURhdGFBdHRyaWJ1dGVzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIiwgTWV0YWRhdGEgQXR0cmlidXRlczogIikuYXBwZW5kKG1ldGFEYXRhQXR0cmlidXRlcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocmVmZXJlbmNlUGFyYW1ldGVycyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBidWZmZXIuYXBwZW5kKCIsIFJlZmVyZW5jZSBQYXJhbWV0ZXJzOiAiKS5hcHBlbmQocmVmZXJlbmNlUGFyYW1ldGVycyk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZXh0ZW5zaWJsZUVsZW1lbnRzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIiwgRXh0ZW5zaWJpbGl0eSBlbGVtZW50czogIikuYXBwZW5kKGV4dGVuc2libGVFbGVtZW50cyk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYXR0cmlidXRlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBidWZmZXIuYXBwZW5kKCIsIEF0dHJpYnV0ZXM6ICIpLmFwcGVuZChhdHRyaWJ1dGVzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gZXByT01FbGVtZW50Ci0gICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayBFbmRwb2ludFJlZmVyZW5jZUhlbHBlciNmcm9tT00oT01FbGVtZW50KX0gaW5zdGVhZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBmcm9tT00oT01FbGVtZW50IGVwck9NRWxlbWVudCkgewotICAgICAgICBPTUVsZW1lbnQgYWRkcmVzc0VsZW1lbnQgPSBlcHJPTUVsZW1lbnQuZ2V0Rmlyc3RDaGlsZFdpdGhOYW1lKG5ldyBRTmFtZSgiQWRkcmVzcyIpKTsKLSAgICAgICAgc2V0QWRkcmVzcyhhZGRyZXNzRWxlbWVudC5nZXRUZXh0KCkpOwotICAgICAgICBJdGVyYXRvciBhbGxBZGRyQXR0cmlidXRlcyA9IGFkZHJlc3NFbGVtZW50LmdldEFsbEF0dHJpYnV0ZXMoKTsKLSAgICAgICAgaWYgKGFkZHJlc3NBdHRyaWJ1dGVzID09IG51bGwpIHsKLSAgICAgICAgICAgIGFkZHJlc3NBdHRyaWJ1dGVzID0gbmV3IEFycmF5TGlzdDxPTUF0dHJpYnV0ZT4oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHdoaWxlIChhbGxBZGRyQXR0cmlidXRlcy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIE9NQXR0cmlidXRlIGF0dHJpYnV0ZSA9IChPTUF0dHJpYnV0ZSkgYWxsQWRkckF0dHJpYnV0ZXMubmV4dCgpOwotICAgICAgICAgICAgYWRkcmVzc0F0dHJpYnV0ZXMuYWRkKGF0dHJpYnV0ZSk7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIE9NRWxlbWVudCByZWZQYXJhbUVsZW1lbnQgPSBlcHJPTUVsZW1lbnQKLSAgICAgICAgICAgICAgICAuZ2V0Rmlyc3RDaGlsZFdpdGhOYW1lKG5ldyBRTmFtZShBZGRyZXNzaW5nQ29uc3RhbnRzLkVQUl9SRUZFUkVOQ0VfUEFSQU1FVEVSUykpOwotCi0gICAgICAgIGlmIChyZWZQYXJhbUVsZW1lbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgSXRlcmF0b3IgcmVmUGFyYW1zID0gcmVmUGFyYW1FbGVtZW50LmdldENoaWxkRWxlbWVudHMoKTsKLSAgICAgICAgICAgIHdoaWxlIChyZWZQYXJhbXMuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IChPTUVsZW1lbnQpIHJlZlBhcmFtcy5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgYWRkUmVmZXJlbmNlUGFyYW1ldGVyKG9tRWxlbWVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotCi0gICAgICAgIE9NRWxlbWVudCBtZXRhRGF0YUVsZW1lbnQgPSBlcHJPTUVsZW1lbnQKLSAgICAgICAgICAgICAgICAuZ2V0Rmlyc3RDaGlsZFdpdGhOYW1lKG5ldyBRTmFtZShBZGRyZXNzaW5nQ29uc3RhbnRzLkZpbmFsLldTQV9NRVRBREFUQSkpOwotICAgICAgICBpZiAobWV0YURhdGFFbGVtZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIEl0ZXJhdG9yIGNoaWxkcmVuID0gbWV0YURhdGFFbGVtZW50LmdldENoaWxkcmVuKCk7Ci0gICAgICAgICAgICB3aGlsZSAoY2hpbGRyZW4uaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgT01Ob2RlIG9tTm9kZSA9IChPTU5vZGUpIGNoaWxkcmVuLm5leHQoKTsKLSAgICAgICAgICAgICAgICBhZGRNZXRhRGF0YShvbU5vZGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgc2V0TmFtZShlcHJPTUVsZW1lbnQuZ2V0TG9jYWxOYW1lKCkpOwotCi0gICAgICAgIEl0ZXJhdG9yIGFsbEF0dHJpYnV0ZXMgPSBlcHJPTUVsZW1lbnQuZ2V0QWxsQXR0cmlidXRlcygpOwotICAgICAgICBpZiAoYXR0cmlidXRlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBhdHRyaWJ1dGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgd2hpbGUgKGFsbEF0dHJpYnV0ZXMuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBPTUF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSAoT01BdHRyaWJ1dGUpIGFsbEF0dHJpYnV0ZXMubmV4dCgpOwotICAgICAgICAgICAgYXR0cmlidXRlcy5hZGQoYXR0cmlidXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIEl0ZXJhdG9yIGNoaWxkRWxlbWVudHMgPSBlcHJPTUVsZW1lbnQuZ2V0Q2hpbGRFbGVtZW50cygpOwotICAgICAgICB3aGlsZSAoY2hpbGRFbGVtZW50cy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBlcHJDaGlsZEVsZW1lbnQgPSAoT01FbGVtZW50KSBjaGlsZEVsZW1lbnRzLm5leHQoKTsKLSAgICAgICAgICAgIFN0cmluZyBsb2NhbE5hbWUgPSBlcHJDaGlsZEVsZW1lbnQuZ2V0TG9jYWxOYW1lKCk7Ci0gICAgICAgICAgICBpZiAoIWxvY2FsTmFtZS5lcXVhbHMoIkFkZHJlc3MiKSAmJgotICAgICAgICAgICAgICAgICAgICAhbG9jYWxOYW1lLmVxdWFscyhBZGRyZXNzaW5nQ29uc3RhbnRzLkVQUl9SRUZFUkVOQ0VfUEFSQU1FVEVSUykgJiYKLSAgICAgICAgICAgICAgICAgICAgIWxvY2FsTmFtZS5lcXVhbHMoQWRkcmVzc2luZ0NvbnN0YW50cy5GaW5hbC5XU0FfTUVUQURBVEEpKSB7Ci0gICAgICAgICAgICAgICAgYWRkRXh0ZW5zaWJsZUVsZW1lbnQoZXByQ2hpbGRFbGVtZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBuc3VybAotICAgICAqIEBwYXJhbSBsb2NhbE5hbWUKLSAgICAgKiBAcGFyYW0gcHJlZml4Ci0gICAgICogQHRocm93cyBBeGlzRmF1bHQKLSAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIEVuZHBvaW50UmVmZXJlbmNlSGVscGVyI3RvT00oRW5kcG9pbnRSZWZlcmVuY2UsIFFOYW1lLCBTdHJpbmcpfSBpbnN0ZWFkLgotICAgICAqLwotICAgIHB1YmxpYyBPTUVsZW1lbnQgdG9PTShTdHJpbmcgbnN1cmwsIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBwcmVmaXgpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBPTUZhY3RvcnkgZmFjID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCk7Ci0gICAgICAgIGlmIChwcmVmaXggIT0gbnVsbCkgewotICAgICAgICAgICAgT01OYW1lc3BhY2Ugd3JhcE5zID0gZmFjLmNyZWF0ZU9NTmFtZXNwYWNlKG5zdXJsLCBwcmVmaXgpOwotICAgICAgICAgICAgT01FbGVtZW50IGVwciA9IGZhYy5jcmVhdGVPTUVsZW1lbnQobG9jYWxOYW1lLCB3cmFwTnMpOwotICAgICAgICAgICAgT01OYW1lc3BhY2Ugd3NhTlMgPSBmYWMuY3JlYXRlT01OYW1lc3BhY2UoQWRkcmVzc2luZ0NvbnN0YW50cy5GaW5hbC5XU0FfTkFNRVNQQUNFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzc2luZ0NvbnN0YW50cy5XU0FfREVGQVVMVF9QUkVGSVgpOwotICAgICAgICAgICAgT01FbGVtZW50IGFkZHJlc3NFID0gZmFjLmNyZWF0ZU9NRWxlbWVudChBZGRyZXNzaW5nQ29uc3RhbnRzLkVQUl9BRERSRVNTLCB3c2FOUywgZXByKTsKLSAgICAgICAgICAgIGFkZHJlc3NFLnNldFRleHQoYWRkcmVzcyk7Ci0KLSAgICAgICAgICAgIGlmIChhZGRyZXNzQXR0cmlidXRlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgSXRlcmF0b3IgYXR0ckl0ZXIgPSBhZGRyZXNzQXR0cmlidXRlcy5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgIHdoaWxlIChhdHRySXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgT01BdHRyaWJ1dGUgb21BdHRyaWJ1dGVzID0gKE9NQXR0cmlidXRlKSBhdHRySXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGFkZHJlc3NFLmFkZEF0dHJpYnV0ZShvbUF0dHJpYnV0ZXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHRoaXMubWV0YURhdGEgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIE9NRWxlbWVudCBtZXRhZGF0YUUgPQotICAgICAgICAgICAgICAgICAgICAgICAgZmFjLmNyZWF0ZU9NRWxlbWVudChBZGRyZXNzaW5nQ29uc3RhbnRzLkZpbmFsLldTQV9NRVRBREFUQSwgd3NhTlMsIGVwcik7Ci0gICAgICAgICAgICAgICAgSXRlcmF0b3IgbWV0YWRhdGEgPSB0aGlzLm1ldGFEYXRhLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKG1ldGFkYXRhLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YUUuYWRkQ2hpbGQoKE9NTm9kZSkgbWV0YWRhdGEubmV4dCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICh0aGlzLnJlZmVyZW5jZVBhcmFtZXRlcnMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIE9NRWxlbWVudCByZWZQYXJhbWV0ZXJFbGVtZW50ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZhYy5jcmVhdGVPTUVsZW1lbnQoQWRkcmVzc2luZ0NvbnN0YW50cy5FUFJfUkVGRVJFTkNFX1BBUkFNRVRFUlMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzYU5TLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcHIpOwotICAgICAgICAgICAgICAgIEl0ZXJhdG9yIHJlZlBhcm1zID0gcmVmZXJlbmNlUGFyYW1ldGVycy52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgIHdoaWxlIChyZWZQYXJtcy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVmUGFyYW1ldGVyRWxlbWVudC5hZGRDaGlsZCgoT01Ob2RlKSByZWZQYXJtcy5uZXh0KCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGF0dHJJdGVyID0gYXR0cmlidXRlcy5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgIHdoaWxlIChhdHRySXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgT01BdHRyaWJ1dGUgb21BdHRyaWJ1dGVzID0gKE9NQXR0cmlidXRlKSBhdHRySXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGVwci5hZGRBdHRyaWJ1dGUob21BdHRyaWJ1dGVzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGFkZCB4czphbnkKLSAgICAgICAgICAgIEFycmF5TGlzdCBvbUVsZW1lbnRzID0gZXh0ZW5zaWJsZUVsZW1lbnRzOwotICAgICAgICAgICAgaWYgKG9tRWxlbWVudHMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgb21FbGVtZW50cy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBlcHIuYWRkQ2hpbGQoKE9NRWxlbWVudCkgb21FbGVtZW50cy5nZXQoaSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIGVwcjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoInByZWZpeCBtdXN0IGJlIHNwZWNpZmllZCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29tcGFyZXMga2V5IHBhcnRzIG9mIHRoZSBzdGF0ZSBmcm9tIHRoZSBjdXJyZW50IGluc3RhbmNlIG9mCi0gICAgICogdGhpcyBjbGFzcyB3aXRoIHRoZSBzcGVjaWZpZWQgaW5zdGFuY2UgdG8gc2VlIGlmIHRoZXkgYXJlCi0gICAgICogZXF1aXZhbGVudC4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhpcyBkaWZmZXJzIGZyb20gdGhlIGphdmEubGFuZy5PYmplY3QuZXF1YWxzKCkgbWV0aG9kIGluCi0gICAgICogdGhhdCB0aGUgZXF1YWxzKCkgbWV0aG9kIGdlbmVyYWxseSBsb29rcyBhdCBib3RoIHRoZQotICAgICAqIG9iamVjdCBpZGVudGl0eSAobG9jYXRpb24gaW4gbWVtb3J5KSBhbmQgdGhlIG9iamVjdCBzdGF0ZQotICAgICAqIChkYXRhKS4KLSAgICAgKiA8cC8+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gZXByIFRoZSBvYmplY3QgdG8gY29tcGFyZSB3aXRoCi0gICAgICogQHJldHVybiBUUlVFIGlmIHRoaXMgb2JqZWN0IGlzIGVxdWl2YWxlbnQgd2l0aCB0aGUgc3BlY2lmaWVkIG9iamVjdAotICAgICAqICAgICAgICAgdGhhdCBpcywga2V5IGZpZWxkcyBtYXRjaAotICAgICAqICAgICAgICAgRkFMU0UsIG90aGVyd2lzZQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRXF1aXZhbGVudChFbmRwb2ludFJlZmVyZW5jZSBlcHIpIHsKLSAgICAgICAgLy8gTk9URTogdGhlIGlucHV0IG9iamVjdCBpcyBleHBlY3RlZCB0byBleGlzdCAoaWUsIGJlIG5vbi1udWxsKQotCi0gICAgICAgIGlmICgodGhpcy5uYW1lICE9IG51bGwpICYmIChlcHIuZ2V0TmFtZSgpICE9IG51bGwpKSB7Ci0gICAgICAgICAgICBpZiAoIXRoaXMubmFtZS5lcXVhbHMoZXByLmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoKHRoaXMubmFtZSA9PSBudWxsKSAmJiAoZXByLmdldE5hbWUoKSA9PSBudWxsKSkgewotICAgICAgICAgICAgLy8gY29udGludWUKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIG1pc21hdGNoCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIGlmICgodGhpcy5hZGRyZXNzICE9IG51bGwpICYmIChlcHIuZ2V0QWRkcmVzcygpICE9IG51bGwpKSB7Ci0gICAgICAgICAgICBpZiAoIXRoaXMuYWRkcmVzcy5lcXVhbHMoZXByLmdldEFkZHJlc3MoKSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoKHRoaXMuYWRkcmVzcyA9PSBudWxsKSAmJiAoZXByLmdldEFkZHJlc3MoKSA9PSBudWxsKSkgewotICAgICAgICAgICAgLy8gY29udGludWUKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIG1pc21hdGNoCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBUT0RPOiBpcyBhIHN0cmljdCB0ZXN0IG9rIHRvIHVzZT8KLQotICAgICAgICBBcnJheUxpc3Q8T01Ob2RlPiBlcHJNZXRhRGF0YSA9IGVwci5nZXRNZXRhRGF0YSgpOwotCi0gICAgICAgIGlmICgodGhpcy5tZXRhRGF0YSAhPSBudWxsKSAmJiAoZXByTWV0YURhdGEgIT0gbnVsbCkpIHsKLSAgICAgICAgICAgIGlmICghdGhpcy5tZXRhRGF0YS5lcXVhbHMoZXByTWV0YURhdGEpKSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhIHN0cmljdCB0ZXN0Ci0gICAgICAgICAgICAgICAgLy8gUmV0dXJucyB0cnVlIGlmIGFuZCBvbmx5IGlmIHRoZSBzcGVjaWZpZWQgb2JqZWN0Ci0gICAgICAgICAgICAgICAgLy8gaXMgYWxzbyBhIGxpc3QsIGJvdGggbGlzdHMgaGF2ZSB0aGUgc2FtZSBzaXplLCBhbmQKLSAgICAgICAgICAgICAgICAvLyBhbGwgY29ycmVzcG9uZGluZyBwYWlycyBvZiBlbGVtZW50cyBpbiB0aGUgdHdvIGxpc3RzCi0gICAgICAgICAgICAgICAgLy8gYXJlIGVxdWFsLCBpZSwgdHdvIGxpc3RzIGFyZSBkZWZpbmVkIHRvIGJlIGVxdWFsIGlmCi0gICAgICAgICAgICAgICAgLy8gdGhleSBjb250YWluIHRoZSBzYW1lIGVsZW1lbnRzIGluIHRoZSBzYW1lIG9yZGVyLgotCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKCh0aGlzLm1ldGFEYXRhID09IG51bGwpICYmIChlcHJNZXRhRGF0YSA9PSBudWxsKSkgewotICAgICAgICAgICAgLy8ga2VlcCBnb2luZwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gb25lIG9mIHRoZSBsaXN0cyBpcyBudWxsCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIEFycmF5TGlzdDxPTUVsZW1lbnQ+IGVwckV4dGVuc2libGVFbGVtZW50cyA9IGVwci5nZXRFeHRlbnNpYmxlRWxlbWVudHMoKTsKLQotICAgICAgICBpZiAoKHRoaXMuZXh0ZW5zaWJsZUVsZW1lbnRzICE9IG51bGwpICYmIChlcHJFeHRlbnNpYmxlRWxlbWVudHMgIT0gbnVsbCkpIHsKLSAgICAgICAgICAgIGlmICghdGhpcy5leHRlbnNpYmxlRWxlbWVudHMuZXF1YWxzKGVwckV4dGVuc2libGVFbGVtZW50cykpIHsKLSAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGEgc3RyaWN0IHRlc3QKLSAgICAgICAgICAgICAgICAvLyBSZXR1cm5zIHRydWUgaWYgYW5kIG9ubHkgaWYgdGhlIHNwZWNpZmllZCBvYmplY3QKLSAgICAgICAgICAgICAgICAvLyBpcyBhbHNvIGEgbGlzdCwgYm90aCBsaXN0cyBoYXZlIHRoZSBzYW1lIHNpemUsIGFuZAotICAgICAgICAgICAgICAgIC8vIGFsbCBjb3JyZXNwb25kaW5nIHBhaXJzIG9mIGVsZW1lbnRzIGluIHRoZSB0d28gbGlzdHMKLSAgICAgICAgICAgICAgICAvLyBhcmUgZXF1YWwsIGllLCB0d28gbGlzdHMgYXJlIGRlZmluZWQgdG8gYmUgZXF1YWwgaWYKLSAgICAgICAgICAgICAgICAvLyB0aGV5IGNvbnRhaW4gdGhlIHNhbWUgZWxlbWVudHMgaW4gdGhlIHNhbWUgb3JkZXIuCi0KLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoKHRoaXMuZXh0ZW5zaWJsZUVsZW1lbnRzID09IG51bGwpICYmIChlcHJFeHRlbnNpYmxlRWxlbWVudHMgPT0gbnVsbCkpIHsKLSAgICAgICAgICAgIC8vIGtlZXAgZ29pbmcKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIG9uZSBvZiB0aGUgbGlzdHMgaXMgbnVsbAotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLQotICAgICAgICBBcnJheUxpc3Q8T01BdHRyaWJ1dGU+IGVwckF0dHJpYnV0ZXMgPSBlcHIuZ2V0QXR0cmlidXRlcygpOwotCi0gICAgICAgIGlmICgodGhpcy5hdHRyaWJ1dGVzICE9IG51bGwpICYmIChlcHJBdHRyaWJ1dGVzICE9IG51bGwpKSB7Ci0gICAgICAgICAgICBpZiAoIXRoaXMuYXR0cmlidXRlcy5lcXVhbHMoZXByQXR0cmlidXRlcykpIHsKLSAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGEgc3RyaWN0IHRlc3QKLSAgICAgICAgICAgICAgICAvLyBSZXR1cm5zIHRydWUgaWYgYW5kIG9ubHkgaWYgdGhlIHNwZWNpZmllZCBvYmplY3QKLSAgICAgICAgICAgICAgICAvLyBpcyBhbHNvIGEgbGlzdCwgYm90aCBsaXN0cyBoYXZlIHRoZSBzYW1lIHNpemUsIGFuZAotICAgICAgICAgICAgICAgIC8vIGFsbCBjb3JyZXNwb25kaW5nIHBhaXJzIG9mIGVsZW1lbnRzIGluIHRoZSB0d28gbGlzdHMKLSAgICAgICAgICAgICAgICAvLyBhcmUgZXF1YWwsIGllLCB0d28gbGlzdHMgYXJlIGRlZmluZWQgdG8gYmUgZXF1YWwgaWYKLSAgICAgICAgICAgICAgICAvLyB0aGV5IGNvbnRhaW4gdGhlIHNhbWUgZWxlbWVudHMgaW4gdGhlIHNhbWUgb3JkZXIuCi0KLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoKHRoaXMuYXR0cmlidXRlcyA9PSBudWxsKSAmJiAoZXByQXR0cmlidXRlcyA9PSBudWxsKSkgewotICAgICAgICAgICAgLy8ga2VlcCBnb2luZwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gb25lIG9mIHRoZSBsaXN0cyBpcyBudWxsCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBUT0RPOiBjaGVjayB0aGUgTWFwIHJlZmVyZW5jZVBhcmFtZXRlcnMgZm9yIGVxdWl2YWxlbmN5Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLy9SRVZJRVc6IFRoZSBmb2xsb3dpbmcgY29kZSBpcyByYXRoZXIgaGVhdnl3ZWlnaHQsIGJlY2F1c2Ugd2UgaGF2ZSB0byBidWlsZCAKLSAgICAvLyAgIHRoZSBPTSB0cmVlIC0tIGl0IHdvdWxkIHByb2JhYmx5IGJlIGJldHRlciB0byBoYXZlIHR3byBzZXJpYWxpemF0aW9uL2Rlc2VyaWFsaXphdGlvbiAKLSAgICAvLyAgIHBhdGhzIGFuZCB0aGVyZWZvcmUsIGZvciB0cml2aWFsIEVQUnMsIHN0b3JlIGEgc21hbGxlciBhbW91bnQgb2YgaW5mbyAgCi0KLSAgICAvKioKLSAgICAgKiBXcml0ZSB0aGUgRVBSIHRvIHRoZSBzcGVjaWZpZWQgT3V0cHV0U3RyZWFtLiAgQmVjYXVzZSBvZiBwb3RlbnRpYWwKLSAgICAgKiBPTUVsZW1lbnRzL0F0dHJpYnV0ZXMsIHdlIG5lZWQgdG8gYWN0dWFsbHkgc2VyaWFsaXplIHRoZSBPTSBzdHJ1Y3R1cmVzCi0gICAgICogKGF0IGxlYXN0IGluIHNvbWUgY2FzZXMuKQotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCB3cml0ZUV4dGVybmFsKGphdmEuaW8uT2JqZWN0T3V0cHV0IG8pCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBTYWZlT2JqZWN0T3V0cHV0U3RyZWFtIG91dCA9IFNhZmVPYmplY3RPdXRwdXRTdHJlYW0uaW5zdGFsbChvKTsKLSAgICAgICAgCi0gICAgICAgIC8vIHJldmlzaW9uIElECi0gICAgICAgIG91dC53cml0ZUludChyZXZpc2lvbklEKTsKLSAgICAgICAgCi0gICAgICAgIC8vIENvcnJlbGF0aW9uIElECi0gICAgICAgIFN0cmluZyBsb2dDb3JyZWxhdGlvbklEU3RyaW5nID0gZ2V0TG9nQ29ycmVsYXRpb25JRFN0cmluZygpOwotCi0gICAgICAgIC8vIFN0cmluZyBvYmplY3QgaWQKLSAgICAgICAgb3V0LndyaXRlT2JqZWN0KGxvZ0NvcnJlbGF0aW9uSURTdHJpbmcpOwotCi0gICAgICAgIC8vIFdyaXRlIG91dCB0aGUgY29udGVudCBhcyB4bWwKLSAgICAgICAgb3V0LndyaXRlVVRGKCJzdGFydCB4bWwiKTsgLy8gd3JpdGUgbWFya2VyCi0gICAgICAgIE9NRWxlbWVudCBvbSA9Ci0gICAgICAgICAgICAgICAgRW5kcG9pbnRSZWZlcmVuY2VIZWxwZXIudG9PTShPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUU5hbWUoInVybjpheGlzMiIsICJvbWVwciIsICJzZXIiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3NpbmdDb25zdGFudHMuRmluYWwuV1NBX05BTUVTUEFDRSk7Ci0KLSAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG9tLnNlcmlhbGl6ZShiYW9zKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIElPRXhjZXB0aW9uIGlvZSA9IG5ldyBJT0V4Y2VwdGlvbigiVW5hYmxlIHRvIHNlcmlhbGl6ZSB0aGUgRW5kcG9pbnRSZWZlcmVuY2Ugd2l0aCBsb2dDb3JyZWxhdGlvbklEIFsiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgK2xvZ0NvcnJlbGF0aW9uSURTdHJpbmcrIl0iKTsgCi0gICAgICAgICAgICBpb2UuaW5pdENhdXNlKGUpOwotCi0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIndyaXRlT2JqZWN0KCk6IFVuYWJsZSB0byBzZXJpYWxpemUgdGhlIEVQUiB3aXRoIGxvZ0NvcnJlbGF0aW9uSUQgWyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgK2xvZ0NvcnJlbGF0aW9uSURTdHJpbmcrIl0gICBvcmlnaW5hbCBlcnJvciBbIitlLmdldENsYXNzKCkuZ2V0TmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICsiXSAgbWVzc2FnZSBbIitlLmdldE1lc3NhZ2UoKSsiXSIsZSk7ICAKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdGhyb3cgaW9lOwotICAgICAgICB9Ci0KLSAgICAgICAgb3V0LndyaXRlSW50KGJhb3Muc2l6ZSgpKTsKLSAgICAgICAgb3V0LndyaXRlKGJhb3MudG9CeXRlQXJyYXkoKSk7ICAKLSAgICAgICAgb3V0LndyaXRlVVRGKCJlbmQgeG1sIik7IC8vIHdyaXRlIG1hcmtlcgotCi0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgYnl0ZVtdIGJ1ZmZlciA9IGJhb3MudG9CeXRlQXJyYXkoKTsKLSAgICAgICAgICAgIFN0cmluZyBjb250ZW50ID0gbmV3IFN0cmluZyhidWZmZXIpOwotCi0gICAgICAgICAgICBsb2cuZGVidWcoIndyaXRlT2JqZWN0KCk6IEVQUiBsb2dDb3JyZWxhdGlvbklEIFsiK2xvZ0NvcnJlbGF0aW9uSURTdHJpbmcrIl0gIiAgICAKLSAgICAgICAgICAgICAgICAgICAgICArIiAgICBFUFIgY29udGVudCBzaXplIFsiK2Jhb3Muc2l6ZSgpKyJdIgotICAgICAgICAgICAgICAgICAgICAgICsiICAgIEVQUiBjb250ZW50IFsiK2NvbnRlbnQrIl0iKTsgCi0gICAgICAgIH0KLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlYWQgdGhlIEVQUiB0byB0aGUgc3BlY2lmaWVkIElucHV0U3RyZWFtLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlYWRFeHRlcm5hbChqYXZhLmlvLk9iamVjdElucHV0IGluT2JqZWN0KQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgU2FmZU9iamVjdElucHV0U3RyZWFtIGluID0gU2FmZU9iamVjdElucHV0U3RyZWFtLmluc3RhbGwoaW5PYmplY3QpOwotICAgICAgICAKLSAgICAgICAgLy8gcmV2aXNpb24gSUQKLSAgICAgICAgaW50IHJldklEID0gaW4ucmVhZEludCgpOwotICAgICAgICAKLSAgICAgICAgLy8gbWFrZSBzdXJlIHRoZSBvYmplY3QgZGF0YSBpcyBpbiBhIHJldmlzaW9uIGxldmVsIHdlIGNhbiBoYW5kbGUKLSAgICAgICAgaWYgKHJldklEICE9IFJFVklTSU9OXzIpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uKEV4dGVybmFsaXplQ29uc3RhbnRzLlVOU1VQUE9SVEVEX1JFVklEKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gU3RyaW5nIG9iamVjdCBpZAotICAgICAgICBsb2dDb3JyZWxhdGlvbklEU3RyaW5nID0gKFN0cmluZykgaW4ucmVhZE9iamVjdCgpOwotCi0gICAgICAgIC8vIFJlYWQgeG1sIGNvbnRlbnQKLSAgICAgICAgaW4ucmVhZFVURigpOyAvLyByZWFkIG1hcmtlcgotICAgICAgICBpbnQgbnVtQnl0ZXMgPSBpbi5yZWFkSW50KCk7Ci0KLSAgICAgICAgYnl0ZVtdIHNlckJ5dGVzID0gbmV3IGJ5dGVbbnVtQnl0ZXNdOwotCi0gICAgICAgIC8vIHJlYWQgdGhlIGRhdGEgZnJvbSB0aGUgaW5wdXQgc3RyZWFtCi0KLSAgICAgICAgaW50IGJ5dGVzUmVhZCA9IDA7Ci0gICAgICAgIGludCBudW1iZXJPZkJ5dGVzTGFzdFJlYWQ7Ci0KLSAgICAgICAgd2hpbGUgKGJ5dGVzUmVhZCA8IG51bUJ5dGVzKSB7Ci0gICAgICAgICAgICBudW1iZXJPZkJ5dGVzTGFzdFJlYWQgPSBpbi5yZWFkKHNlckJ5dGVzLCBieXRlc1JlYWQsIG51bUJ5dGVzIC0gYnl0ZXNSZWFkKTsKLQotICAgICAgICAgICAgaWYgKG51bWJlck9mQnl0ZXNMYXN0UmVhZCA9PSAtMSkgewotICAgICAgICAgICAgICAgIC8vIFRPRE86IFdoYXQgc2hvdWxkIHdlIGRvIGlmIHRoZSByZWNvbnN0aXR1dGlvbiBmYWlscz8KLSAgICAgICAgICAgICAgICAvLyBGb3Igbm93LCBsb2cgdGhlIGV2ZW50IGFuZCB0aHJvdyBhbiBleGNlcHRpb24KLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJyZWFkT2JqZWN0KCk6IEVQUiBsb2dDb3JyZWxhdGlvbklEIFsiK2xvZ0NvcnJlbGF0aW9uSURTdHJpbmcrIl0gIiAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgKioqV0FSTklORyoqKiB1bmV4cGVjdGVkIGVuZCB0byBkYXRhOiAgICBkYXRhIHJlYWQgZnJvbSBpbnB1dCBzdHJlYW0gWyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGJ5dGVzUmVhZCArICJdICAgIGV4cGVjdGVkIGRhdGEgc2l6ZSBbIiArIG51bUJ5dGVzICsgIl0iKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBJT0V4Y2VwdGlvbiBpb2UgPSBuZXcgSU9FeGNlcHRpb24oIlVuYWJsZSB0byBkZXNlcmlhbGl6ZSB0aGUgRW5kcG9pbnRSZWZlcmVuY2Ugd2l0aCBsb2dDb3JyZWxhdGlvbklEIFsiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICtsb2dDb3JyZWxhdGlvbklEU3RyaW5nKyJdIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIiAgQ2F1c2U6IFVuZXhwZWN0ZWQgZW5kIHRvIGRhdGEgZnJvbSBpbnB1dCBzdHJlYW0iKTsgCi0KLSAgICAgICAgICAgICAgICB0aHJvdyBpb2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJ5dGVzUmVhZCArPSBudW1iZXJPZkJ5dGVzTGFzdFJlYWQ7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIGlmIChieXRlc1JlYWQgPT0gMCkgewotICAgICAgICAgICAgSU9FeGNlcHRpb24gaW9lID0gbmV3IElPRXhjZXB0aW9uKCJVbmFibGUgdG8gZGVzZXJpYWxpemUgdGhlIEVuZHBvaW50UmVmZXJlbmNlIHdpdGggbG9nQ29ycmVsYXRpb25JRCBbIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICtsb2dDb3JyZWxhdGlvbklEU3RyaW5nKyJdIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsiICBDYXVzZTogTm8gZGF0YSBmcm9tIGlucHV0IHN0cmVhbSIpOyAKLQotICAgICAgICAgICAgdGhyb3cgaW9lOwotICAgICAgICB9Ci0gICAgICAgIGluLnJlYWRVVEYoKTsgLy8gcmVhZCBtYXJrZXIKLQotICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBiYWlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHNlckJ5dGVzKTsKLQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIFN0cmluZyBjb250ZW50ID0gbmV3IFN0cmluZyhzZXJCeXRlcyk7Ci0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZygicmVhZE9iamVjdCgpOiBFUFIgbG9nQ29ycmVsYXRpb25JRCBbIitsb2dDb3JyZWxhdGlvbklEU3RyaW5nKyJdICIgICAgCi0gICAgICAgICAgICAgICAgICAgICAgKyIgICAgZXhwZWN0ZWQgY29udGVudCBzaXplIFsiK251bUJ5dGVzKyJdIgotICAgICAgICAgICAgICAgICAgICAgICsiICAgIGNvbnRlbnQgc2l6ZSBbIitjb250ZW50Lmxlbmd0aCgpKyJdIgotICAgICAgICAgICAgICAgICAgICAgICsiICAgIEVQUiBidWZmZXJlZCBjb250ZW50IFsiK2NvbnRlbnQrIl0iKTsgCi0gICAgICAgIH0KLQotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gbnVsbDsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihiYWlzKTsKLSAgICAgICAgICAgIFN0QVhPTUJ1aWxkZXIgYnVpbGRlciA9IG5ldyBTdEFYT01CdWlsZGVyKHhtbFJlYWRlcik7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgb20gPSBidWlsZGVyLmdldERvY3VtZW50RWxlbWVudCgpOwotCi0gICAgICAgICAgICAvLyBleHBhbmQgdGhlIE9NIHNvIHdlIGNhbiBjbG9zZSB0aGUgc3RyZWFtIHJlYWRlcgotICAgICAgICAgICAgb20uYnVpbGQoKTsKLQotICAgICAgICAgICAgLy8gdHJhY2UgcG9pbnQKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICI6cmVhZE9iamVjdCgpOiAgIiAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBFUFIgWyIrbG9nQ29ycmVsYXRpb25JRFN0cmluZyArICJdIgotICAgICAgICAgICAgICAgICAgICAgICAgICArICIgRVBSIE9NIGNvbnRlbnQgWyIrb20udG9TdHJpbmcoKSsgIl0iKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgRW5kcG9pbnRSZWZlcmVuY2VIZWxwZXIuZnJvbU9NKHRoaXMsIG9tLCBBZGRyZXNzaW5nQ29uc3RhbnRzLkZpbmFsLldTQV9OQU1FU1BBQ0UpOwotCi0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIElPRXhjZXB0aW9uIGlvZSA9IG5ldyBJT0V4Y2VwdGlvbigiVW5hYmxlIHRvIGRlc2VyaWFsaXplIHRoZSBFbmRwb2ludFJlZmVyZW5jZSB3aXRoIGxvZ0NvcnJlbGF0aW9uSUQgWyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArbG9nQ29ycmVsYXRpb25JRFN0cmluZysiXSIpOyAKLSAgICAgICAgICAgIGlvZS5pbml0Q2F1c2UoZSk7Ci0KLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygicmVhZE9iamVjdCgpOiBVbmFibGUgdG8gZGVzZXJpYWxpemUgdGhlIEVQUiB3aXRoIGxvZ0NvcnJlbGF0aW9uSUQgWyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgK2xvZ0NvcnJlbGF0aW9uSURTdHJpbmcrIl0gICBvcmlnaW5hbCBlcnJvciBbIitlLmdldENsYXNzKCkuZ2V0TmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICsiXSAgbWVzc2FnZSBbIitlLmdldE1lc3NhZ2UoKSsiXSIsZSk7ICAKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdGhyb3cgaW9lOwotCi0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgIAkvLyBNYWtlIHN1cmUgdGhhdCB0aGUgcmVhZGVyIGlzIHByb3Blcmx5IGNsb3NlZAotICAgICAgICAgICAgLy8gTm90ZSB0aGF0IGNsb3NpbmcgYSBCeXRlQXJyYXlJbnB1dFN0cmVhbSBoYXMgbm8gZWZmZWN0Ci0KLSAgICAgICAgICAgIGlmICh4bWxSZWFkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFJlYWRlci5jbG9zZSgpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlMikgewotICAgICAgICAgICAgICAgICAgICBJT0V4Y2VwdGlvbiBpb2UyID0gbmV3IElPRXhjZXB0aW9uKCJVbmFibGUgdG8gY2xvc2UgdGhlIFhNTFN0cmVhbVJlYWRlciBmb3IgdGhlIEVuZHBvaW50UmVmZXJlbmNlIHdpdGggbG9nQ29ycmVsYXRpb25JRCBbIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgK2xvZ0NvcnJlbGF0aW9uSURTdHJpbmcrIl0iKTsgCi0gICAgICAgICAgICAgICAgICAgIGlvZTIuaW5pdENhdXNlKGUyKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygicmVhZE9iamVjdCgpOiBVbmFibGUgdG8gY2xvc2UgdGhlIFhNTFN0cmVhbVJlYWRlciBmb3IgdGhlIEVQUiB3aXRoIGxvZ0NvcnJlbGF0aW9uSUQgWyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArbG9nQ29ycmVsYXRpb25JRFN0cmluZysiXSAgIG9yaWdpbmFsIGVycm9yIFsiK2UyLmdldENsYXNzKCkuZ2V0TmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyJdICBtZXNzYWdlIFsiK2UyLmdldE1lc3NhZ2UoKSsiXSIsZTIpOyAgCi0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBpb2UyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgSUQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgb2JqZWN0IGluc3RhbmNlLgotICAgICAqCi0gICAgICogQHJldHVybiBBIHN0cmluZyB0aGF0IGNhbiBiZSBvdXRwdXQgdG8gYSBsb2cgZmlsZSBhcyBhbiBpZGVudGlmaWVyCi0gICAgICogICAgICAgICBmb3IgdGhpcyBvYmplY3QgaW5zdGFuY2UuICBJdCBpcyBzdWl0YWJsZSBmb3IgbWF0Y2hpbmcgcmVsYXRlZCBsb2cKLSAgICAgKiAgICAgICAgIGVudHJpZXMuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRMb2dDb3JyZWxhdGlvbklEU3RyaW5nKCkgewotICAgICAgICBpZiAobG9nQ29ycmVsYXRpb25JRFN0cmluZyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBsb2dDb3JyZWxhdGlvbklEU3RyaW5nID0gbXlDbGFzc05hbWUgKyAiQCIgKyBVVUlER2VuZXJhdG9yLmdldFVVSUQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbG9nQ29ycmVsYXRpb25JRFN0cmluZzsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9hZGRyZXNzaW5nL0VuZHBvaW50UmVmZXJlbmNlSGVscGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvYWRkcmVzc2luZy9FbmRwb2ludFJlZmVyZW5jZUhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjQyOWVlLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9hZGRyZXNzaW5nL0VuZHBvaW50UmVmZXJlbmNlSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NDggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3Npbmc7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQXR0cmlidXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01OYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5vZGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmJ1aWxkZXIuU3RBWE9NQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLnV0aWwuQXR0cmlidXRlSGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5FbGVtZW50SGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcubWV0YWRhdGEuSW50ZXJmYWNlTmFtZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcubWV0YWRhdGEuU2VydmljZU5hbWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLm1ldGFkYXRhLldTRExMb2NhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JZGVudGl0eUhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogVGhlIG1ldGhvZHMgaW4gdGhpcyBjbGFzcyBhcmUgdXNlZCB0byBwcm9jZXNzIHtAbGluayBFbmRwb2ludFJlZmVyZW5jZX0gb2JqZWN0cwotICogYWNjb3JkaW5nIHRvIHRoZSBydWxlcyBvZiB0aGUgMjAwNS8wOCAoRmluYWwpIGFuZCAyMDA0LzA4IChzdWJtaXNzaW9uKSBXUy1BZGRyZXNzaW5nCi0gKiBzcGVjaWZpY2F0aW9ucy4KLSAqLwotcHVibGljIGNsYXNzIEVuZHBvaW50UmVmZXJlbmNlSGVscGVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhFbmRwb2ludFJlZmVyZW5jZUhlbHBlci5jbGFzcyk7Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBNYXAgZmluYWxRTmFtZXMgPSBuZXcgSWRlbnRpdHlIYXNoTWFwKCk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgTWFwIHN1Ym1pc3Npb25RTmFtZXMgPSBuZXcgSWRlbnRpdHlIYXNoTWFwKCk7Ci0KLSAgICAvKioKLSAgICAgKiBQb3B1bGF0ZXMgYW4gZW5kcG9pbnQgcmVmZXJlbmNlIGJhc2VkIG9uIHRoZSA8Y29kZT5PTUVsZW1lbnQ8L2NvZGU+IGFuZAotICAgICAqIFdTLUFkZHJlc3NpbmcgbmFtZXNwYWNlIHRoYXQgaXMgcGFzc2VkIGluLgotICAgICAqCi0gICAgICogQHBhcmFtIGVwciAgICAgICAgICAgICAgICAgYW4gZW5kcG9pbnQgcmVmZXJlbmNlIGluc3RhbmNlIHRvIGhvbGQgdGhlIGluZm8uCi0gICAgICogQHBhcmFtIGVwck9NRWxlbWVudCAgICAgICAgYW4gZWxlbWVudCBvZiBlbmRwb2ludCByZWZlcmVuY2UgdHlwZQotICAgICAqIEBwYXJhbSBhZGRyZXNzaW5nTmFtZXNwYWNlIHRoZSBuYW1lc3BhY2Ugb2YgdGhlIFdTLUFkZHJlc3Npbmcgc3BlYyB0byBjb21wbHkgd2l0aC4KLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdCBpZiB1bmFibGUgdG8gbG9jYXRlIGFuIGFkZHJlc3MgZWxlbWVudCwgb3IgaWYgdGhlIHNwZWNpZmllZCBuYW1lc3BhY2UKLSAgICAgKiBpcyBkaWZmZXJlbnQgdG8gdGhlIGFjdHVhbCBuYW1lc3BhY2UuCi0gICAgICogQHNlZSAjZnJvbU9NKE9NRWxlbWVudCkKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZnJvbU9NKEVuZHBvaW50UmVmZXJlbmNlIGVwciwgT01FbGVtZW50IGVwck9NRWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhZGRyZXNzaW5nTmFtZXNwYWNlKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9IGZyb21PTShlcHIsIGVwck9NRWxlbWVudCk7Ci0gICAgICAgIAotICAgICAgICBpZiAoIW5hbWVzcGFjZS5lcXVhbHMoYWRkcmVzc2luZ05hbWVzcGFjZSkpCi0gICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJUaGUgZW5kcG9pbnQgcmVmZXJlbmNlIGRvZXMgbm90IG1hdGNoIHRoZSBzcGVjaWZpZWQgbmFtZXNwYWNlLiIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBvcHVsYXRlcyBhbiBlbmRwb2ludCByZWZlcmVuY2UgYmFzZWQgb24gdGhlIDxjb2RlPk9NRWxlbWVudDwvY29kZT4uIFJldHVybnMgdGhlCi0gICAgICogV1MtQWRkcmVzc2luZyBuYW1lc3BhY2Ugb2YgdGhlIGVuZHBvaW50IHJlZmVyZW5jZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZXByICAgICAgICAgIGFuIGVuZHBvaW50IHJlZmVyZW5jZSBpbnN0YW5jZSB0byBob2xkIHRoZSBpbmZvLiBJZiB0aGUgZW5kcG9pbnQKLSAgICAgKiByZWZlcmVuY2UgaXMgbnVsbCB0aGVuIGp1c3QgdGhlIFdTLUFkZHJlc3NpbmcgbmFtZXNwYWNlIGlzIHJldHVybmVkLgotICAgICAqIEBwYXJhbSBlcHJPTUVsZW1lbnQgYW4gZWxlbWVudCBvZiBlbmRwb2ludCByZWZlcmVuY2UgdHlwZQotICAgICAqIEByZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBXUy1BZGRyZXNzaW5nIG5hbWVzcGFjZSBvZiB0aGUgZW5kcG9pbnQgcmVmZXJlbmNlLgotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0IGlmIHVuYWJsZSB0byBsb2NhdGUgYW4gYWRkcmVzcyBlbGVtZW50LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGZyb21PTShFbmRwb2ludFJlZmVyZW5jZSBlcHIsIE9NRWxlbWVudCBlcHJPTUVsZW1lbnQpCi0gICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIGJvb2xlYW4gaXNGaW5hbEFkZHJlc3NpbmdOYW1lc3BhY2UgPSBmYWxzZTsKLSAgICAgICAgTWFwIG1hcCA9IG51bGw7Ci0KLSAgICAgICAgLy9GaXJzdCBwYXNzLCBpZGVudGlmeSB0aGUgYWRkcmVzc2luZyBuYW1lc3BhY2UuCi0gICAgICAgIE9NRWxlbWVudCBhZGRyZXNzID0gZXByT01FbGVtZW50Ci0gICAgICAgICAgICAgICAgLmdldEZpcnN0Q2hpbGRXaXRoTmFtZSgoUU5hbWUpIGZpbmFsUU5hbWVzLmdldChBZGRyZXNzaW5nQ29uc3RhbnRzLkVQUl9BRERSRVNTKSk7Ci0KLSAgICAgICAgaWYgKGFkZHJlc3MgIT0gbnVsbCkgewotICAgICAgICAgICAgbWFwID0gZmluYWxRTmFtZXM7Ci0gICAgICAgICAgICBpc0ZpbmFsQWRkcmVzc2luZ05hbWVzcGFjZSA9IHRydWU7Ci0KLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiZnJvbU9NOiBGb3VuZCBhZGRyZXNzIGVsZW1lbnQgZm9yIG5hbWVzcGFjZSwgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzaW5nQ29uc3RhbnRzLkZpbmFsLldTQV9OQU1FU1BBQ0UpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYWRkcmVzcyA9IGVwck9NRWxlbWVudC5nZXRGaXJzdENoaWxkV2l0aE5hbWUoCi0gICAgICAgICAgICAgICAgICAgIChRTmFtZSkgc3VibWlzc2lvblFOYW1lcy5nZXQoQWRkcmVzc2luZ0NvbnN0YW50cy5FUFJfQUREUkVTUykpOwotCi0gICAgICAgICAgICBpZiAoYWRkcmVzcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbWFwID0gc3VibWlzc2lvblFOYW1lczsKLSAgICAgICAgICAgICAgICBpc0ZpbmFsQWRkcmVzc2luZ05hbWVzcGFjZSA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiZnJvbU9NOiBGb3VuZCBhZGRyZXNzIGVsZW1lbnQgZm9yIG5hbWVzcGFjZSwgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzc2luZ0NvbnN0YW50cy5TdWJtaXNzaW9uLldTQV9OQU1FU1BBQ0UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gbG9jYXRlIGFuIGFkZHJlc3MgZWxlbWVudCBmb3IgdGhlIGVuZHBvaW50IHJlZmVyZW5jZSB0eXBlLiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy9TZWNvbmQgcGFzcywgaWRlbnRpZnkgdGhlIHByb3BlcnRpZXMuCi0gICAgICAgIGlmIChlcHIgIT0gbnVsbCkKLSAgICAgICAgICAgIGZyb21PTShlcHIsIGVwck9NRWxlbWVudCwgbWFwLCBpc0ZpbmFsQWRkcmVzc2luZ05hbWVzcGFjZSk7Ci0KLSAgICAgICAgcmV0dXJuICgoUU5hbWUpIG1hcC5nZXQoQWRkcmVzc2luZ0NvbnN0YW50cy5FUFJfQUREUkVTUykpLmdldE5hbWVzcGFjZVVSSSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBvcHVsYXRlcyBhbiBlbmRwb2ludCByZWZlcmVuY2UgYmFzZWQgb24gdGhlIDxjb2RlPlN0cmluZzwvY29kZT4gdGhhdCBpcwotICAgICAqIHBhc3NlZCBpbi4gSWYgdGhlIGh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDgvYWRkcmVzc2luZyBuYW1lc3BhY2UKLSAgICAgKiBpcyBpbiBlZmZlY3QgdGhlbiBhbnkgcmVmZXJlbmNlIHByb3BlcnRpZXMgd2lsbCBiZSBzYXZlZCBhcyByZWZlcmVuY2UgcGFyYW1ldGVycy4KLSAgICAgKiBSZWdhcmRsZXNzIG9mIHRoZSBhZGRyZXNzaW5nIG5hbWVzcGFjZSBpbiBlZmZlY3QsIGFueSBlbGVtZW50cyBwcmVzZW50IGluIHRoZQotICAgICAqIDxjb2RlPlN0cmluZzwvY29kZT4gdGhhdCBhcmUgbm90IHJlY29nbmlzZWQgYXJlIHNhdmVkIGFzIGV4dGVuc2liaWxpdHkgZWxlbWVudHMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZXByU3RyaW5nIHN0cmluZyBmcm9tIHRoZSBlbGVtZW50IG9mIGVuZHBvaW50IHJlZmVyZW5jZSB0eXBlCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQgaWYgdW5hYmxlIHRvIGxvY2F0ZSBhbiBhZGRyZXNzIGVsZW1lbnQKLSAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rICNmcm9tU3RyaW5nKFN0cmluZyl9IGluc3RlYWQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBFbmRwb2ludFJlZmVyZW5jZSBmcm9tT00oU3RyaW5nIGVwclN0cmluZykgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIHJldHVybiBmcm9tU3RyaW5nKGVwclN0cmluZyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUG9wdWxhdGVzIGFuIGVuZHBvaW50IHJlZmVyZW5jZSBiYXNlZCBvbiB0aGUgPGNvZGU+U3RyaW5nPC9jb2RlPiB0aGF0IGlzCi0gICAgICogcGFzc2VkIGluLiBJZiB0aGUgaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOC9hZGRyZXNzaW5nIG5hbWVzcGFjZQotICAgICAqIGlzIGluIGVmZmVjdCB0aGVuIGFueSByZWZlcmVuY2UgcHJvcGVydGllcyB3aWxsIGJlIHNhdmVkIGFzIHJlZmVyZW5jZSBwYXJhbWV0ZXJzLgotICAgICAqIFJlZ2FyZGxlc3Mgb2YgdGhlIGFkZHJlc3NpbmcgbmFtZXNwYWNlIGluIGVmZmVjdCwgYW55IGVsZW1lbnRzIHByZXNlbnQgaW4gdGhlCi0gICAgICogPGNvZGU+U3RyaW5nPC9jb2RlPiB0aGF0IGFyZSBub3QgcmVjb2duaXNlZCBhcmUgc2F2ZWQgYXMgZXh0ZW5zaWJpbGl0eSBlbGVtZW50cy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBlcHJTdHJpbmcgc3RyaW5nIGZyb20gdGhlIGVsZW1lbnQgb2YgZW5kcG9pbnQgcmVmZXJlbmNlIHR5cGUKLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdCBpZiB1bmFibGUgdG8gbG9jYXRlIGFuIGFkZHJlc3MgZWxlbWVudAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgRW5kcG9pbnRSZWZlcmVuY2UgZnJvbVN0cmluZyhTdHJpbmcgZXByU3RyaW5nKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBmcm9tT00obmV3IFN0QVhPTUJ1aWxkZXIoCi0gICAgICAgICAgICAgICAgICAgIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShlcHJTdHJpbmcuZ2V0Qnl0ZXMoKSkpLmdldERvY3VtZW50RWxlbWVudCgpKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEF4aXNGYXVsdC5tYWtlRmF1bHQoZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQb3B1bGF0ZXMgYW4gZW5kcG9pbnQgcmVmZXJlbmNlIGJhc2VkIG9uIHRoZSA8Y29kZT5PTUVsZW1lbnQ8L2NvZGU+IHRoYXQgaXMKLSAgICAgKiBwYXNzZWQgaW4uIElmIHRoZSBodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA4L2FkZHJlc3NpbmcgbmFtZXNwYWNlCi0gICAgICogaXMgaW4gZWZmZWN0IHRoZW4gYW55IHJlZmVyZW5jZSBwcm9wZXJ0aWVzIHdpbGwgYmUgc2F2ZWQgYXMgcmVmZXJlbmNlIHBhcmFtZXRlcnMuCi0gICAgICogUmVnYXJkbGVzcyBvZiB0aGUgYWRkcmVzc2luZyBuYW1lc3BhY2UgaW4gZWZmZWN0LCBhbnkgZWxlbWVudHMgcHJlc2VudCBpbiB0aGUKLSAgICAgKiA8Y29kZT5PTUVsZW1lbnQ8L2NvZGU+IHRoYXQgYXJlIG5vdCByZWNvZ25pc2VkIGFyZSBzYXZlZCBhcyBleHRlbnNpYmlsaXR5IGVsZW1lbnRzLgotICAgICAqCi0gICAgICogQHBhcmFtIGVwck9NRWxlbWVudCBhbiBlbGVtZW50IG9mIGVuZHBvaW50IHJlZmVyZW5jZSB0eXBlCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQgaWYgdW5hYmxlIHRvIGxvY2F0ZSBhbiBhZGRyZXNzIGVsZW1lbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEVuZHBvaW50UmVmZXJlbmNlIGZyb21PTShPTUVsZW1lbnQgZXByT01FbGVtZW50KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgRW5kcG9pbnRSZWZlcmVuY2UgZXByID0gbmV3IEVuZHBvaW50UmVmZXJlbmNlKCIiKTsKLSAgICAgICAgZnJvbU9NKGVwciwgZXByT01FbGVtZW50KTsKLQotICAgICAgICByZXR1cm4gZXByOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gPGNvZGU+T01FbGVtZW50PC9jb2RlPiBiYXNlZCBvbiB0aGUgcHJvcGVydGllcyBvZiB0aGUgZW5kcG9pbnQKLSAgICAgKiByZWZlcmVuY2UuIFRoZSBvdXRwdXQgbWF5IGRpZmZlciBiYXNlZCBvbiB0aGUgYWRkcmVzc2luZyBuYW1lc3BhY2UgdGhhdCBpcwotICAgICAqIGluIGVmZmVjdCB3aGVuIHRoaXMgbWV0aG9kIGlzIGNhbGxlZC4gSWYgdGhlIGh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDgvYWRkcmVzc2luZwotICAgICAqIG5hbWVzcGFjZSBpcyBpbiBlZmZlY3QsIGFuZCBhIG1ldGFkYXRhIHByb3BlcnR5IGhhcyBiZWVuIGRlZmluZWQgZm9yIHRoZQotICAgICAqIGVuZHBvaW50IHJlZmVyZW5jZSwgdGhlbiB0aGVyZSB3aWxsIGJlIGEgbWV0YWRhdGEgZWxlbWVudCB0byBjb250YWluIHRoZQotICAgICAqIHByb3BlcnR5IGluIHRoZSBvdXRwdXQuIElmIHRoZSBodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA4L2FkZHJlc3NpbmcKLSAgICAgKiBuYW1lc3BhY2UgaXMgaW4gZWZmZWN0LCBob3dldmVyLCB0aGVuIG5vIG1ldGFkYXRhIGVsZW1lbnQgd2lsbCBiZSBpbmNsdWRlZAotICAgICAqIGluIHRoZSBvdXRwdXQsIGV2ZW4gaWYgYSBtZXRhZGF0YSBwcm9wZXJ0eSBlbGVtZW50IGhhcyBiZWVuIGRlZmluZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZmFjdG9yeQotICAgICAqIEBwYXJhbSBlcHIKLSAgICAgKiBAcGFyYW0gcW5hbWUKLSAgICAgKiBAcGFyYW0gYWRkcmVzc2luZ05hbWVzcGFjZQotICAgICAqIEByZXR1cm4KLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgT01FbGVtZW50IHRvT00oT01GYWN0b3J5IGZhY3RvcnksIEVuZHBvaW50UmVmZXJlbmNlIGVwciwgUU5hbWUgcW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYWRkcmVzc2luZ05hbWVzcGFjZSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIE9NRWxlbWVudCBlcHJFbGVtZW50ID0gbnVsbDsKLQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygidG9PTTogRmFjdG9yeSwgIiArIGZhY3RvcnkpOwotICAgICAgICAgICAgbG9nLmRlYnVnKCJ0b09NOiBFbmRwb2ludCByZWZlcmVuY2UsICIgKyBlcHIpOwotICAgICAgICAgICAgbG9nLmRlYnVnKCJ0b09NOiBFbGVtZW50IHFuYW1lLCAiICsgcW5hbWUpOwotICAgICAgICAgICAgbG9nLmRlYnVnKCJ0b09NOiBBZGRyZXNzaW5nIG5hbWVzcGFjZSwgIiArIGFkZHJlc3NpbmdOYW1lc3BhY2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGFkZHJlc3NpbmdOYW1lc3BhY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiQWRkcmVzc2luZyBuYW1lc3BhY2UgY2Fubm90IGJlIG51bGwuIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocW5hbWUuZ2V0UHJlZml4KCkgIT0gbnVsbCkgewotICAgICAgICAgICAgT01OYW1lc3BhY2Ugd3JhcE5zID0KLSAgICAgICAgICAgICAgICAgICAgZmFjdG9yeS5jcmVhdGVPTU5hbWVzcGFjZShxbmFtZS5nZXROYW1lc3BhY2VVUkkoKSwgcW5hbWUuZ2V0UHJlZml4KCkpOwotICAgICAgICAgICAgaWYgKGZhY3RvcnkgaW5zdGFuY2VvZiBTT0FQRmFjdG9yeSkgewotICAgICAgICAgICAgICAgIGVwckVsZW1lbnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgKChTT0FQRmFjdG9yeSkgZmFjdG9yeSkuY3JlYXRlU09BUEhlYWRlckJsb2NrKHFuYW1lLmdldExvY2FsUGFydCgpLCB3cmFwTnMpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBlcHJFbGVtZW50ID0gZmFjdG9yeS5jcmVhdGVPTUVsZW1lbnQocW5hbWUuZ2V0TG9jYWxQYXJ0KCksIHdyYXBOcyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIE9NTmFtZXNwYWNlIHdzYU5TID0gZmFjdG9yeS5jcmVhdGVPTU5hbWVzcGFjZShhZGRyZXNzaW5nTmFtZXNwYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3NpbmdDb25zdGFudHMuV1NBX0RFRkFVTFRfUFJFRklYKTsKLSAgICAgICAgICAgIE9NRWxlbWVudCBhZGRyZXNzRSA9Ci0gICAgICAgICAgICAgICAgICAgIGZhY3RvcnkuY3JlYXRlT01FbGVtZW50KEFkZHJlc3NpbmdDb25zdGFudHMuRVBSX0FERFJFU1MsIHdzYU5TLCBlcHJFbGVtZW50KTsKLSAgICAgICAgICAgIFN0cmluZyBhZGRyZXNzID0gZXByLmdldEFkZHJlc3MoKTsKLSAgICAgICAgICAgIGFkZHJlc3NFLnNldFRleHQoYWRkcmVzcyk7Ci0KLSAgICAgICAgICAgIEFycmF5TGlzdCBhZGRyZXNzQXR0cmlidXRlcyA9IGVwci5nZXRBZGRyZXNzQXR0cmlidXRlcygpOwotICAgICAgICAgICAgaWYgKGFkZHJlc3NBdHRyaWJ1dGVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBJdGVyYXRvciBhdHRySXRlciA9IGFkZHJlc3NBdHRyaWJ1dGVzLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGF0dHJJdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICBPTUF0dHJpYnV0ZSBvbUF0dHJpYnV0ZSA9IChPTUF0dHJpYnV0ZSkgYXR0ckl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVIZWxwZXIuaW1wb3J0T01BdHRyaWJ1dGUob21BdHRyaWJ1dGUsIGFkZHJlc3NFKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIExpc3QgbWV0YURhdGEgPSBlcHIuZ2V0TWV0YURhdGEoKTsKLSAgICAgICAgICAgIGlmIChtZXRhRGF0YSAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgICAgIEFkZHJlc3NpbmdDb25zdGFudHMuRmluYWwuV1NBX05BTUVTUEFDRS5lcXVhbHMoYWRkcmVzc2luZ05hbWVzcGFjZSkpIHsKLSAgICAgICAgICAgICAgICBPTUVsZW1lbnQgbWV0YWRhdGFFID0gZmFjdG9yeS5jcmVhdGVPTUVsZW1lbnQoCi0gICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzaW5nQ29uc3RhbnRzLkZpbmFsLldTQV9NRVRBREFUQSwgd3NhTlMsIGVwckVsZW1lbnQpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwLCBzaXplID0gbWV0YURhdGEuc2l6ZSgpOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSAoT01FbGVtZW50KSBtZXRhRGF0YS5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhRS5hZGRDaGlsZChFbGVtZW50SGVscGVyLmltcG9ydE9NRWxlbWVudChvbUVsZW1lbnQsIGZhY3RvcnkpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBBcnJheUxpc3QgbWV0YWRhdGFBdHRyaWJ1dGVzID0gZXByLmdldE1ldGFkYXRhQXR0cmlidXRlcygpOwotICAgICAgICAgICAgICAgIGlmIChtZXRhZGF0YUF0dHJpYnV0ZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBJdGVyYXRvciBhdHRySXRlciA9IG1ldGFkYXRhQXR0cmlidXRlcy5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoYXR0ckl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBPTUF0dHJpYnV0ZSBvbUF0dHJpYnV0ZSA9IChPTUF0dHJpYnV0ZSkgYXR0ckl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlSGVscGVyLmltcG9ydE9NQXR0cmlidXRlKG9tQXR0cmlidXRlLCBtZXRhZGF0YUUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0KLSAgICAgICAgICAgIE1hcCByZWZlcmVuY2VQYXJhbWV0ZXJzID0gZXByLmdldEFsbFJlZmVyZW5jZVBhcmFtZXRlcnMoKTsKLSAgICAgICAgICAgIGlmIChyZWZlcmVuY2VQYXJhbWV0ZXJzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBPTUVsZW1lbnQgcmVmUGFyYW1ldGVyRWxlbWVudCA9IGZhY3RvcnkuY3JlYXRlT01FbGVtZW50KAotICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzc2luZ0NvbnN0YW50cy5FUFJfUkVGRVJFTkNFX1BBUkFNRVRFUlMsIHdzYU5TLCBlcHJFbGVtZW50KTsKLSAgICAgICAgICAgICAgICBJdGVyYXRvciBpdGVyYXRvciA9IHJlZmVyZW5jZVBhcmFtZXRlcnMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSAoT01FbGVtZW50KSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIHJlZlBhcmFtZXRlckVsZW1lbnQuYWRkQ2hpbGQoRWxlbWVudEhlbHBlci5pbXBvcnRPTUVsZW1lbnQob21FbGVtZW50LCBmYWN0b3J5KSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBMaXN0IGF0dHJpYnV0ZXMgPSBlcHIuZ2V0QXR0cmlidXRlcygpOwotICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwLCBzaXplID0gYXR0cmlidXRlcy5zaXplKCk7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgT01BdHRyaWJ1dGUgb21BdHRyaWJ1dGUgPSAoT01BdHRyaWJ1dGUpIGF0dHJpYnV0ZXMuZ2V0KGkpOwotICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVIZWxwZXIuaW1wb3J0T01BdHRyaWJ1dGUob21BdHRyaWJ1dGUsIGVwckVsZW1lbnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gYWRkIHhzOmFueQotICAgICAgICAgICAgTGlzdCBleHRlbnNpYmxlRWxlbWVudHMgPSBlcHIuZ2V0RXh0ZW5zaWJsZUVsZW1lbnRzKCk7Ci0gICAgICAgICAgICBpZiAoZXh0ZW5zaWJsZUVsZW1lbnRzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMCwgc2l6ZSA9IGV4dGVuc2libGVFbGVtZW50cy5zaXplKCk7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IChPTUVsZW1lbnQpIGV4dGVuc2libGVFbGVtZW50cy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgIGVwckVsZW1lbnQuYWRkQ2hpbGQoRWxlbWVudEhlbHBlci5pbXBvcnRPTUVsZW1lbnQob21FbGVtZW50LCBmYWN0b3J5KSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgicHJlZml4IG11c3QgYmUgc3BlY2lmaWVkIik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZXByRWxlbWVudDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGZyb21PTShFbmRwb2ludFJlZmVyZW5jZSBlcHIsIE9NRWxlbWVudCBlcHJPTUVsZW1lbnQsIE1hcCBtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0ZpbmFsQWRkcmVzc2luZ05hbWVzcGFjZSkgewotICAgICAgICBJdGVyYXRvciBjaGlsZEVsZW1lbnRzID0gZXByT01FbGVtZW50LmdldENoaWxkRWxlbWVudHMoKTsKLQotICAgICAgICB3aGlsZSAoY2hpbGRFbGVtZW50cy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBlcHJDaGlsZEVsZW1lbnQgPSAoT01FbGVtZW50KSBjaGlsZEVsZW1lbnRzLm5leHQoKTsKLSAgICAgICAgICAgIFFOYW1lIHFuYW1lID0gZXByQ2hpbGRFbGVtZW50LmdldFFOYW1lKCk7Ci0KLSAgICAgICAgICAgIGlmIChtYXAuZ2V0KEFkZHJlc3NpbmdDb25zdGFudHMuRVBSX0FERFJFU1MpLmVxdWFscyhxbmFtZSkpIHsKLSAgICAgICAgICAgICAgICAvL1dlIG5lZWQgdG8gaWRlbnRpZnkgdGhlIGFkZHJlc3MgZWxlbWVudCBhZ2FpbiBpbiBvcmRlciB0byBlbnN1cmUKLSAgICAgICAgICAgICAgICAvL3RoYXQgaXQgaXMgbm90IGluY2x1ZGVkIHdpdGggdGhlIGV4dGVuc2liaWxpdHkgZWxlbWVudHMuCi0gICAgICAgICAgICAgICAgZXByLnNldEFkZHJlc3MoZXByQ2hpbGRFbGVtZW50LmdldFRleHQoKSk7Ci0gICAgICAgICAgICAgICAgSXRlcmF0b3IgYWxsQWRkckF0dHJpYnV0ZXMgPSBlcHJDaGlsZEVsZW1lbnQuZ2V0QWxsQXR0cmlidXRlcygpOwotICAgICAgICAgICAgICAgIEFycmF5TGlzdCBhZGRyZXNzQXR0cmlidXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAoYWxsQWRkckF0dHJpYnV0ZXMuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIE9NQXR0cmlidXRlIGF0dHJpYnV0ZSA9IChPTUF0dHJpYnV0ZSkgYWxsQWRkckF0dHJpYnV0ZXMubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBhZGRyZXNzQXR0cmlidXRlcy5hZGQoYXR0cmlidXRlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZXByLnNldEFkZHJlc3NBdHRyaWJ1dGVzKGFkZHJlc3NBdHRyaWJ1dGVzKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobWFwLmdldChBZGRyZXNzaW5nQ29uc3RhbnRzLkVQUl9SRUZFUkVOQ0VfUEFSQU1FVEVSUykuZXF1YWxzKHFuYW1lKSkgewotICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gZXByQ2hpbGRFbGVtZW50LmdldENoaWxkRWxlbWVudHMoKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIE9NRWxlbWVudCBlbGVtZW50ID0gKE9NRWxlbWVudCkgaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBlcHIuYWRkUmVmZXJlbmNlUGFyYW1ldGVyKGVsZW1lbnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNGaW5hbEFkZHJlc3NpbmdOYW1lc3BhY2UgJiYKLSAgICAgICAgICAgICAgICAgICAgbWFwLmdldChBZGRyZXNzaW5nQ29uc3RhbnRzLkZpbmFsLldTQV9NRVRBREFUQSkuZXF1YWxzKHFuYW1lKSkgewotICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gZXByQ2hpbGRFbGVtZW50LmdldENoaWxkRWxlbWVudHMoKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIE9NTm9kZSBub2RlID0gKE9NTm9kZSkgaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBlcHIuYWRkTWV0YURhdGEobm9kZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGFsbE1EQXR0cmlidXRlcyA9IGVwckNoaWxkRWxlbWVudC5nZXRBbGxBdHRyaWJ1dGVzKCk7Ci0gICAgICAgICAgICAgICAgQXJyYXlMaXN0IG1ldGFkYXRhQXR0cmlidXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAoYWxsTURBdHRyaWJ1dGVzLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICBPTUF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSAoT01BdHRyaWJ1dGUpIGFsbE1EQXR0cmlidXRlcy5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhQXR0cmlidXRlcy5hZGQoYXR0cmlidXRlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZXByLnNldE1ldGFkYXRhQXR0cmlidXRlcyhtZXRhZGF0YUF0dHJpYnV0ZXMpOwotICAgICAgICAgICAgfSBlbHNlIGlmICghaXNGaW5hbEFkZHJlc3NpbmdOYW1lc3BhY2UgJiYKLSAgICAgICAgICAgICAgICAgICAgbWFwLmdldChBZGRyZXNzaW5nQ29uc3RhbnRzLlN1Ym1pc3Npb24uRVBSX1JFRkVSRU5DRV9QUk9QRVJUSUVTKS5lcXVhbHMocW5hbWUpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIHNpbmNlIHdlIGhhdmUgdGhlIG1vZGVsIGZvciBXUy1GaW5hbCwgd2UgZG9uJ3QgaGF2ZSBhIHBsYWNlIHRvIGtlZXAgdGhpcyByZWZlcmVuY2UgcHJvcGVydGllcy4KLSAgICAgICAgICAgICAgICAvLyBUaGUgb25seSBjb21wYXRpYmxlIHBsYWNlIGlzIHJlZmVyZW5jZSBwcm9wZXJ0aWVzCi0gICAgICAgICAgICAgICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBlcHJDaGlsZEVsZW1lbnQuZ2V0Q2hpbGRFbGVtZW50cygpOwotICAgICAgICAgICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgT01FbGVtZW50IGVsZW1lbnQgPSAoT01FbGVtZW50KSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGVwci5hZGRSZWZlcmVuY2VQYXJhbWV0ZXIoZWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBlcHIuYWRkRXh0ZW5zaWJsZUVsZW1lbnQoZXByQ2hpbGRFbGVtZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEl0ZXJhdG9yIGF0dHJpYnV0ZXMgPSBlcHJPTUVsZW1lbnQuZ2V0QWxsQXR0cmlidXRlcygpOwotICAgICAgICB3aGlsZSAoYXR0cmlidXRlcy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIE9NQXR0cmlidXRlIGF0dHJpYnV0ZSA9IChPTUF0dHJpYnV0ZSkgYXR0cmlidXRlcy5uZXh0KCk7Ci0gICAgICAgICAgICBlcHIuYWRkQXR0cmlidXRlKGF0dHJpYnV0ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiZnJvbU9NOiBFbmRwb2ludCByZWZlcmVuY2UsICIgKyBlcHIpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHJpZXZlcyB0aGUgV1MtQWRkcmVzc2luZyBFUFIgU2VydmljZU5hbWUgZWxlbWVudCBmcm9tIGFuIEVQUi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZXByIHRoZSBFUFIgdG8gcmV0cmlldmUgdGhlIGVsZW1lbnQgZnJvbQotICAgICAqIEBwYXJhbSBhZGRyZXNzaW5nTmFtZXNwYWNlIHRoZSBXUy1BZGRyZXNzaW5nIG5hbWVzcGFjZSBhc3NvY2lhdGVkIHdpdGgKLSAgICAgKiB0aGUgRVBSLgotICAgICAqIEByZXR1cm4gYW4gaW5zdGFuY2Ugb2YgPGNvZGU+U2VydmljZU5hbWU8L2NvZGU+LiBUaGUgcmV0dXJuIHZhbHVlIGlzCi0gICAgICogbmV2ZXIgPGNvZGU+bnVsbDwvY29kZT4uCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFNlcnZpY2VOYW1lIGdldFNlcnZpY2VOYW1lTWV0YWRhdGEoRW5kcG9pbnRSZWZlcmVuY2UgZXByLCBTdHJpbmcgYWRkcmVzc2luZ05hbWVzcGFjZSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIFNlcnZpY2VOYW1lIHNlcnZpY2VOYW1lID0gbmV3IFNlcnZpY2VOYW1lKCk7Ci0gICAgICAgIExpc3QgZWxlbWVudHMgPSBudWxsOwotICAgICAgICAKLSAgICAgICAgaWYgKEFkZHJlc3NpbmdDb25zdGFudHMuU3VibWlzc2lvbi5XU0FfTkFNRVNQQUNFLmVxdWFscyhhZGRyZXNzaW5nTmFtZXNwYWNlKSkKLSAgICAgICAgICAgIGVsZW1lbnRzID0gZXByLmdldEV4dGVuc2libGVFbGVtZW50cygpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBlbGVtZW50cyA9IGVwci5nZXRNZXRhRGF0YSgpOwotICAgICAgICAKLSAgICAgICAgaWYgKGVsZW1lbnRzICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vUmV0cmlldmUgdGhlIHNlcnZpY2UgbmFtZSBhbmQgZW5kcG9pbnQgbmFtZS4KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwLCBzaXplID0gZWxlbWVudHMuc2l6ZSgpOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IChPTUVsZW1lbnQpIGVsZW1lbnRzLmdldChpKTsKLSAgICAgICAgICAgICAgICBpZiAoU2VydmljZU5hbWUuaXNTZXJ2aWNlTmFtZUVsZW1lbnQob21FbGVtZW50KSkgewotICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlTmFtZS5mcm9tT00ob21FbGVtZW50KTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gc2VydmljZU5hbWU7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHJpZXZlcyB0aGUgV1MtQWRkcmVzc2luZyBFUFIgUG9ydFR5cGUsIG9yIEludGVyZmFjZU5hbWUsIGVsZW1lbnQgZnJvbSBhbiBFUFIsCi0gICAgICogYXMgYXBwcm9wcmlhdGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIGVwciB0aGUgRVBSIHRvIHJldHJpZXZlIHRoZSBlbGVtZW50IGZyb20KLSAgICAgKiBAcGFyYW0gYWRkcmVzc2luZ05hbWVzcGFjZSB0aGUgV1MtQWRkcmVzc2luZyBuYW1lc3BhY2UgYXNzb2NpYXRlZCB3aXRoCi0gICAgICogdGhlIEVQUi4KLSAgICAgKiBAcmV0dXJuIGFuIGluc3RhbmNlIG9mIDxjb2RlPkludGVyZmFjZU5hbWU8L2NvZGU+LiBUaGUgcmV0dXJuIHZhbHVlIGlzCi0gICAgICogbmV2ZXIgPGNvZGU+bnVsbDwvY29kZT4uCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEludGVyZmFjZU5hbWUgZ2V0SW50ZXJmYWNlTmFtZU1ldGFkYXRhKEVuZHBvaW50UmVmZXJlbmNlIGVwciwgU3RyaW5nIGFkZHJlc3NpbmdOYW1lc3BhY2UpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBJbnRlcmZhY2VOYW1lIGludGVyZmFjZU5hbWUgPSBuZXcgSW50ZXJmYWNlTmFtZSgpOwotICAgICAgICBMaXN0IGVsZW1lbnRzID0gbnVsbDsKLSAgICAgICAgCi0gICAgICAgIGlmIChBZGRyZXNzaW5nQ29uc3RhbnRzLlN1Ym1pc3Npb24uV1NBX05BTUVTUEFDRS5lcXVhbHMoYWRkcmVzc2luZ05hbWVzcGFjZSkpCi0gICAgICAgICAgICBlbGVtZW50cyA9IGVwci5nZXRFeHRlbnNpYmxlRWxlbWVudHMoKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgZWxlbWVudHMgPSBlcHIuZ2V0TWV0YURhdGEoKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChlbGVtZW50cyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvL1JldHJpZXZlIHRoZSBzZXJ2aWNlIG5hbWUgYW5kIGVuZHBvaW50IG5hbWUuCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMCwgc2l6ZSA9IGVsZW1lbnRzLnNpemUoKTsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSAoT01FbGVtZW50KSBlbGVtZW50cy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgaWYgKEludGVyZmFjZU5hbWUuaXNJbnRlcmZhY2VOYW1lRWxlbWVudChvbUVsZW1lbnQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludGVyZmFjZU5hbWUuZnJvbU9NKG9tRWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGludGVyZmFjZU5hbWU7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHJpZXZlcyB0aGUgd3NkbGk6d3NkbExvY2F0aW9uIGF0dHJpYnV0ZSBmcm9tIGFuIEVQUi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZXByIHRoZSBFUFIgdG8gcmV0cmlldmUgdGhlIGF0dHJpYnV0ZSBmcm9tCi0gICAgICogQHBhcmFtIGFkZHJlc3NpbmdOYW1lc3BhY2UgdGhlIFdTLUFkZHJlc3NpbmcgbmFtZXNwYWNlIGFzc29jaWF0ZWQgd2l0aAotICAgICAqIHRoZSBFUFIuCi0gICAgICogQHJldHVybiBhbiBpbnN0YW5jZSBvZiA8Y29kZT5XU0RMTG9jYXRpb248L2NvZGU+LiBUaGUgcmV0dXJuIHZhbHVlIGlzCi0gICAgICogbmV2ZXIgPGNvZGU+bnVsbDwvY29kZT4uCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFdTRExMb2NhdGlvbiBnZXRXU0RMTG9jYXRpb25NZXRhZGF0YShFbmRwb2ludFJlZmVyZW5jZSBlcHIsIFN0cmluZyBhZGRyZXNzaW5nTmFtZXNwYWNlKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgV1NETExvY2F0aW9uIHdzZGxMb2NhdGlvbiA9IG5ldyBXU0RMTG9jYXRpb24oKTsKLSAgICAgICAgTGlzdCBhdHRyaWJ1dGVzID0gbnVsbDsKLQotICAgICAgICBpZiAoQWRkcmVzc2luZ0NvbnN0YW50cy5TdWJtaXNzaW9uLldTQV9OQU1FU1BBQ0UuZXF1YWxzKGFkZHJlc3NpbmdOYW1lc3BhY2UpKQotICAgICAgICAgICAgYXR0cmlidXRlcyA9IGVwci5nZXRBdHRyaWJ1dGVzKCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGF0dHJpYnV0ZXMgPSBlcHIuZ2V0TWV0YWRhdGFBdHRyaWJ1dGVzKCk7Ci0gICAgICAgIAotICAgICAgICBpZiAoYXR0cmlidXRlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvL1JldHJpZXZlIHRoZSB3c2RsIGxvY2F0aW9uLgotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAsIHNpemUgPSBhdHRyaWJ1dGVzLnNpemUoKTsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgICAgICAgIE9NQXR0cmlidXRlIG9tQXR0cmlidXRlID0gKE9NQXR0cmlidXRlKSBhdHRyaWJ1dGVzLmdldChpKTsKLSAgICAgICAgICAgICAgICBpZiAoV1NETExvY2F0aW9uLmlzV1NETExvY2F0aW9uQXR0cmlidXRlKG9tQXR0cmlidXRlKSkgewotICAgICAgICAgICAgICAgICAgICB3c2RsTG9jYXRpb24uZnJvbU9NKG9tQXR0cmlidXRlKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gd3NkbExvY2F0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYW4gaW5zdGFuY2Ugb2YgPGNvZGU+U2VydmljZU5hbWU8L2NvZGU+IGFzIG1ldGFkYXRhIHRvIHRoZSBzcGVjaWZpZWQgRVBSLgotICAgICAqIFRoZSBtZXRhZGF0YSBpcyBtYXBwZWQgdG8gYSBXUy1BZGRyZXNzaW5nIEVQUiBTZXJ2aWNlTmFtZSBlbGVtZW50LgotICAgICAqIAotICAgICAqIEBwYXJhbSBmYWN0b3J5IGFuIDxjb2RlPk9NRmFjdG9yeTwvY29kZT4KLSAgICAgKiBAcGFyYW0gZXByIHRoZSBFUFIgdG8gcmV0cmlldmUgdGhlIGF0dHJpYnV0ZSBmcm9tCi0gICAgICogQHBhcmFtIGFkZHJlc3NpbmdOYW1lc3BhY2UgdGhlIFdTLUFkZHJlc3NpbmcgbmFtZXNwYWNlIGFzc29jaWF0ZWQgd2l0aAotICAgICAqIHRoZSBFUFIuCi0gICAgICogQHBhcmFtIHNlcnZpY2VOYW1lIGFuIGluc3RhbmNlIG9mIDxjb2RlPlNlcnZpY2VOYW1lPC9jb2RlPiB0aGF0IGNvbnRhaW5zIHRoZQotICAgICAqIG1ldGFkYXRhCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0U2VydmljZU5hbWVNZXRhZGF0YShPTUZhY3RvcnkgZmFjdG9yeSwgRW5kcG9pbnRSZWZlcmVuY2UgZXByLCBTdHJpbmcgYWRkcmVzc2luZ05hbWVzcGFjZSwgU2VydmljZU5hbWUgc2VydmljZU5hbWUpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBpZiAoQWRkcmVzc2luZ0NvbnN0YW50cy5TdWJtaXNzaW9uLldTQV9OQU1FU1BBQ0UuZXF1YWxzKGFkZHJlc3NpbmdOYW1lc3BhY2UpKSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gc2VydmljZU5hbWUudG9PTShmYWN0b3J5LCBTZXJ2aWNlTmFtZS5zdWJRTmFtZSk7Ci0gICAgICAgICAgICBlcHIuYWRkRXh0ZW5zaWJsZUVsZW1lbnQob21FbGVtZW50KTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSBzZXJ2aWNlTmFtZS50b09NKGZhY3RvcnksIFNlcnZpY2VOYW1lLndzYW1RTmFtZSk7Ci0gICAgICAgICAgICBlcHIuYWRkTWV0YURhdGEob21FbGVtZW50KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYW4gaW5zdGFuY2Ugb2YgPGNvZGU+SW50ZXJmYWNlTmFtZTwvY29kZT4gYXMgbWV0YWRhdGEgdG8gdGhlIHNwZWNpZmllZCBFUFIuCi0gICAgICogVGhlIG1ldGFkYXRhIGlzIG1hcHBlZCB0byBhIFdTLUFkZHJlc3NpbmcgRVBSIFBvcnRUeXBlIG9yIEludGVyZmFjZU5hbWUgZWxlbWVudC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZmFjdG9yeSBhbiA8Y29kZT5PTUZhY3Rvcnk8L2NvZGU+Ci0gICAgICogQHBhcmFtIGVwciB0aGUgRVBSIHRvIHJldHJpZXZlIHRoZSBhdHRyaWJ1dGUgZnJvbQotICAgICAqIEBwYXJhbSBhZGRyZXNzaW5nTmFtZXNwYWNlIHRoZSBXUy1BZGRyZXNzaW5nIG5hbWVzcGFjZSBhc3NvY2lhdGVkIHdpdGgKLSAgICAgKiB0aGUgRVBSLgotICAgICAqIEBwYXJhbSBpbnRlcmZhY2VOYW1lIGFuIGluc3RhbmNlIG9mIDxjb2RlPkludGVyZmFjZU5hbWU8L2NvZGU+IHRoYXQgY29udGFpbnMgdGhlCi0gICAgICogbWV0YWRhdGEKLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdAotICAgICAqLwotICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0SW50ZXJmYWNlTmFtZU1ldGFkYXRhKE9NRmFjdG9yeSBmYWN0b3J5LCBFbmRwb2ludFJlZmVyZW5jZSBlcHIsIFN0cmluZyBhZGRyZXNzaW5nTmFtZXNwYWNlLCBJbnRlcmZhY2VOYW1lIGludGVyZmFjZU5hbWUpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBpZiAoQWRkcmVzc2luZ0NvbnN0YW50cy5TdWJtaXNzaW9uLldTQV9OQU1FU1BBQ0UuZXF1YWxzKGFkZHJlc3NpbmdOYW1lc3BhY2UpKSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gaW50ZXJmYWNlTmFtZS50b09NKGZhY3RvcnksIEludGVyZmFjZU5hbWUuc3ViUU5hbWUpOwotICAgICAgICAgICAgZXByLmFkZEV4dGVuc2libGVFbGVtZW50KG9tRWxlbWVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gaW50ZXJmYWNlTmFtZS50b09NKGZhY3RvcnksIEludGVyZmFjZU5hbWUud3NhbVFOYW1lKTsKLSAgICAgICAgICAgIGVwci5hZGRNZXRhRGF0YShvbUVsZW1lbnQpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgICAvKioKLSAgICAgICogQWRkcyBhbiBpbnN0YW5jZSBvZiA8Y29kZT5XU0RMTG9jYXRpb248L2NvZGU+IGFzIG1ldGFkYXRhIHRvIHRoZSBzcGVjaWZpZWQgRVBSLgotICAgICAgKiBUaGUgbWV0YWRhdGEgaXMgbWFwcGVkIHRvIGEgd3NkbGk6d3NkbExvY2F0aW9uIGF0dHJpYnV0ZS4KLSAgICAgICogCi0gICAgICAqIEBwYXJhbSBmYWN0b3J5IGFuIDxjb2RlPk9NRmFjdG9yeTwvY29kZT4KLSAgICAgICogQHBhcmFtIGVwciB0aGUgRVBSIHRvIHJldHJpZXZlIHRoZSBhdHRyaWJ1dGUgZnJvbQotICAgICAgKiBAcGFyYW0gYWRkcmVzc2luZ05hbWVzcGFjZSB0aGUgV1MtQWRkcmVzc2luZyBuYW1lc3BhY2UgYXNzb2NpYXRlZCB3aXRoCi0gICAgICAqIHRoZSBFUFIuCi0gICAgICAqIEBwYXJhbSB3c2RsTG9jYXRpb24gYW4gaW5zdGFuY2Ugb2YgPGNvZGU+V1NETExvY2F0aW9uPC9jb2RlPiB0aGF0IGNvbnRhaW5zIHRoZQotICAgICAgKiBtZXRhZGF0YQotICAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdAotICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0V1NETExvY2F0aW9uTWV0YWRhdGEoT01GYWN0b3J5IGZhY3RvcnksIEVuZHBvaW50UmVmZXJlbmNlIGVwciwgU3RyaW5nIGFkZHJlc3NpbmdOYW1lc3BhY2UsIFdTRExMb2NhdGlvbiB3c2RsTG9jYXRpb24pIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBPTUF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSB3c2RsTG9jYXRpb24udG9PTShmYWN0b3J5KTsKLQotICAgICAgICBpZiAoQWRkcmVzc2luZ0NvbnN0YW50cy5TdWJtaXNzaW9uLldTQV9OQU1FU1BBQ0UuZXF1YWxzKGFkZHJlc3NpbmdOYW1lc3BhY2UpKSB7Ci0gICAgICAgICAgICBlcHIuYWRkQXR0cmlidXRlKGF0dHJpYnV0ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgIGxpc3QuYWRkKGF0dHJpYnV0ZSk7Ci0gICAgICAgICAgICBlcHIuc2V0TWV0YWRhdGFBdHRyaWJ1dGVzKGxpc3QpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHN0YXRpYyB7Ci0gICAgICAgIGZpbmFsUU5hbWVzLnB1dChBZGRyZXNzaW5nQ29uc3RhbnRzLkVQUl9BRERSRVNTLCBuZXcgUU5hbWUoCi0gICAgICAgICAgICAgICAgQWRkcmVzc2luZ0NvbnN0YW50cy5GaW5hbC5XU0FfTkFNRVNQQUNFLCBBZGRyZXNzaW5nQ29uc3RhbnRzLkVQUl9BRERSRVNTKSk7Ci0gICAgICAgIGZpbmFsUU5hbWVzLnB1dChBZGRyZXNzaW5nQ29uc3RhbnRzLkVQUl9SRUZFUkVOQ0VfUEFSQU1FVEVSUywgbmV3IFFOYW1lKAotICAgICAgICAgICAgICAgIEFkZHJlc3NpbmdDb25zdGFudHMuRmluYWwuV1NBX05BTUVTUEFDRSwKLSAgICAgICAgICAgICAgICBBZGRyZXNzaW5nQ29uc3RhbnRzLkVQUl9SRUZFUkVOQ0VfUEFSQU1FVEVSUykpOwotICAgICAgICBmaW5hbFFOYW1lcy5wdXQoQWRkcmVzc2luZ0NvbnN0YW50cy5GaW5hbC5XU0FfTUVUQURBVEEsIG5ldyBRTmFtZSgKLSAgICAgICAgICAgICAgICBBZGRyZXNzaW5nQ29uc3RhbnRzLkZpbmFsLldTQV9OQU1FU1BBQ0UsIEFkZHJlc3NpbmdDb25zdGFudHMuRmluYWwuV1NBX01FVEFEQVRBKSk7Ci0KLSAgICAgICAgc3VibWlzc2lvblFOYW1lcy5wdXQoQWRkcmVzc2luZ0NvbnN0YW50cy5FUFJfQUREUkVTUywgbmV3IFFOYW1lKAotICAgICAgICAgICAgICAgIEFkZHJlc3NpbmdDb25zdGFudHMuU3VibWlzc2lvbi5XU0FfTkFNRVNQQUNFLCBBZGRyZXNzaW5nQ29uc3RhbnRzLkVQUl9BRERSRVNTKSk7Ci0gICAgICAgIHN1Ym1pc3Npb25RTmFtZXMucHV0KEFkZHJlc3NpbmdDb25zdGFudHMuRVBSX1JFRkVSRU5DRV9QQVJBTUVURVJTLCBuZXcgUU5hbWUoCi0gICAgICAgICAgICAgICAgQWRkcmVzc2luZ0NvbnN0YW50cy5TdWJtaXNzaW9uLldTQV9OQU1FU1BBQ0UsCi0gICAgICAgICAgICAgICAgQWRkcmVzc2luZ0NvbnN0YW50cy5FUFJfUkVGRVJFTkNFX1BBUkFNRVRFUlMpKTsKLSAgICAgICAgc3VibWlzc2lvblFOYW1lcy5wdXQoQWRkcmVzc2luZ0NvbnN0YW50cy5TdWJtaXNzaW9uLkVQUl9SRUZFUkVOQ0VfUFJPUEVSVElFUywgbmV3IFFOYW1lKAotICAgICAgICAgICAgICAgIEFkZHJlc3NpbmdDb25zdGFudHMuU3VibWlzc2lvbi5XU0FfTkFNRVNQQUNFLAotICAgICAgICAgICAgICAgIEFkZHJlc3NpbmdDb25zdGFudHMuU3VibWlzc2lvbi5FUFJfUkVGRVJFTkNFX1BST1BFUlRJRVMpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvYWRkcmVzc2luZy9SZWxhdGVzVG8uamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9hZGRyZXNzaW5nL1JlbGF0ZXNUby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzRkYzc2Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9hZGRyZXNzaW5nL1JlbGF0ZXNUby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3Npbmc7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuZXh0ZXJuYWxpemUuRXh0ZXJuYWxpemVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LmV4dGVybmFsaXplLlNhZmVPYmplY3RJbnB1dFN0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuZXh0ZXJuYWxpemUuU2FmZU9iamVjdE91dHB1dFN0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuZXh0ZXJuYWxpemUuU2FmZVNlcmlhbGl6YWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmEuaW8uRXh0ZXJuYWxpemFibGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0OwotaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLS8qKgotICogQ2xhc3MgUmVsYXRlc1RvCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWxhdGVzVG8gaW1wbGVtZW50cyBFeHRlcm5hbGl6YWJsZSwgU2FmZVNlcmlhbGl6YWJsZSB7Ci0KLSAgICAvKgotICAgICAqIHNldHVwIGZvciBsb2dnaW5nCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFJlbGF0ZXNUby5jbGFzcyk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgbXlDbGFzc05hbWUgPSAiUmVsYXRlc1RvIjsKLQotICAgIC8qKgotICAgICAqIEBzZXJpYWwgVGhlIHNlcmlhbGl6YXRpb24gdmVyc2lvbiBJRCB0cmFja3MgdGhlIHZlcnNpb24gb2YgdGhlIGNsYXNzLgotICAgICAqIElmIGEgY2xhc3MgZGVmaW5pdGlvbiBjaGFuZ2VzLCB0aGVuIHRoZSBzZXJpYWxpemF0aW9uL2V4dGVybmFsaXphdGlvbgotICAgICAqIG9mIHRoZSBjbGFzcyBpcyBhZmZlY3RlZC4gSWYgYSBjaGFuZ2UgdG8gdGhlIGNsYXNzIGlzIG1hZGUgd2hpY2ggaXMKLSAgICAgKiBub3QgY29tcGF0aWJsZSB3aXRoIHRoZSBzZXJpYWxpemF0aW9uL2V4dGVybmFsaXphdGlvbiBvZiB0aGUgY2xhc3MsCi0gICAgICogdGhlbiB0aGUgc2VyaWFsaXphdGlvbiB2ZXJzaW9uIElEIHNob3VsZCBiZSB1cGRhdGVkLgotICAgICAqIFJlZmVyIHRvIHRoZSAic2VyaWFsVmVyIiB1dGlsaXR5IHRvIGNvbXB1dGUgYSBzZXJpYWxpemF0aW9uCi0gICAgICogdmVyc2lvbiBJRC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMTEyMDM4NDMxNTMzMzQxNDk2MEw7Ci0KLSAgICAvKioKLSAgICAgKiBAc2VyaWFsIFRyYWNrcyB0aGUgcmV2aXNpb24gbGV2ZWwgb2YgYSBjbGFzcyB0byBpZGVudGlmeSBjaGFuZ2VzIHRvIHRoZQotICAgICAqIGNsYXNzIGRlZmluaXRpb24gdGhhdCBhcmUgY29tcGF0aWJsZSB0byBzZXJpYWxpemF0aW9uL2V4dGVybmFsaXphdGlvbi4KLSAgICAgKiBJZiBhIGNsYXNzIGRlZmluaXRpb24gY2hhbmdlcywgdGhlbiB0aGUgc2VyaWFsaXphdGlvbi9leHRlcm5hbGl6YXRpb24KLSAgICAgKiBvZiB0aGUgY2xhc3MgaXMgYWZmZWN0ZWQuCi0gICAgICogUmVmZXIgdG8gdGhlIHdyaXRlRXh0ZXJuYWwoKSBhbmQgcmVhZEV4dGVybmFsKCkgbWV0aG9kcy4KLSAgICAgKi8KLSAgICAvLyBzdXBwb3J0ZWQgcmV2aXNpb24gbGV2ZWxzLCBhZGQgYSBuZXcgbGV2ZWwgdG8gbWFuYWdlIGNvbXBhdGlibGUgY2hhbmdlcwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRVZJU0lPTl8yID0gMjsKLSAgICAvLyBjdXJyZW50IHJldmlzaW9uIGxldmVsIG9mIHRoaXMgb2JqZWN0Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IHJldmlzaW9uSUQgPSBSRVZJU0lPTl8yOwotCi0KLSAgICAvKioKLSAgICAgKiBGaWVsZCByZWxhdGlvbnNoaXBUeXBlCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgcmVsYXRpb25zaGlwVHlwZTsKLQotICAgIC8qKgotICAgICAqIEZpZWxkIHZhbHVlCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgdmFsdWU7Ci0KLSAgICBwcml2YXRlIEFycmF5TGlzdCBleHRlbnNpYmlsaXR5QXR0cmlidXRlcyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBSZWxhdGVzVG8KLSAgICAgKi8KLSAgICBwdWJsaWMgUmVsYXRlc1RvKCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIFJlbGF0ZXNUbwotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlCi0gICAgICovCi0gICAgcHVibGljIFJlbGF0ZXNUbyhTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIFJlbGF0ZXNUbwotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlCi0gICAgICogQHBhcmFtIHJlbGF0aW9uc2hpcFR5cGUKLSAgICAgKi8KLSAgICBwdWJsaWMgUmVsYXRlc1RvKFN0cmluZyB2YWx1ZSwgU3RyaW5nIHJlbGF0aW9uc2hpcFR5cGUpIHsKLSAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwotICAgICAgICB0aGlzLnJlbGF0aW9uc2hpcFR5cGUgPSByZWxhdGlvbnNoaXBUeXBlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ldGhvZCBnZXRSZWxhdGlvbnNoaXBUeXBlLiBJZiB0aGUgcmVsYXRpb25zaGlwIHR5cGUgaGFzIG5vdCBiZWVuIHNldCBpdCByZXR1cm5zCi0gICAgICogdGhlIGRlZmF1bHQgdmFsdWUge0BsaW5rIEFkZHJlc3NpbmdDb25zdGFudHMuRmluYWwuV1NBX0RFRkFVTFRfUkVMQVRJT05TSElQX1RZUEV9Ci0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRSZWxhdGlvbnNoaXBUeXBlKCkgewotICAgICAgICByZXR1cm4gKHJlbGF0aW9uc2hpcFR5cGUgIT0gbnVsbCAmJiAhIiIuZXF1YWxzKHJlbGF0aW9uc2hpcFR5cGUpID8KLSAgICAgICAgICAgICAgICByZWxhdGlvbnNoaXBUeXBlIDoKLSAgICAgICAgICAgICAgICBBZGRyZXNzaW5nQ29uc3RhbnRzLkZpbmFsLldTQV9ERUZBVUxUX1JFTEFUSU9OU0hJUF9UWVBFKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgZ2V0VmFsdWUKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWV0aG9kIHNldFJlbGF0aW9uc2hpcFR5cGUKLSAgICAgKgotICAgICAqIEBwYXJhbSByZWxhdGlvbnNoaXBUeXBlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UmVsYXRpb25zaGlwVHlwZShTdHJpbmcgcmVsYXRpb25zaGlwVHlwZSkgewotICAgICAgICB0aGlzLnJlbGF0aW9uc2hpcFR5cGUgPSByZWxhdGlvbnNoaXBUeXBlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ldGhvZCBzZXRWYWx1ZQotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXJyYXlMaXN0IGdldEV4dGVuc2liaWxpdHlBdHRyaWJ1dGVzKCkgewotICAgICAgICByZXR1cm4gZXh0ZW5zaWJpbGl0eUF0dHJpYnV0ZXM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RXh0ZW5zaWJpbGl0eUF0dHJpYnV0ZXMoQXJyYXlMaXN0IGV4dGVuc2liaWxpdHlBdHRyaWJ1dGVzKSB7Ci0gICAgICAgIHRoaXMuZXh0ZW5zaWJpbGl0eUF0dHJpYnV0ZXMgPSBleHRlbnNpYmlsaXR5QXR0cmlidXRlczsKLSAgICB9Ci0KLSAgICAvKgotICAgICogIChub24tSmF2YWRvYykKLSAgICAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCi0gICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gIklkZW50aWZpZXI6ICIgKyB2YWx1ZQotICAgICAgICAgICAgICAgICsgIiwgUmVsYXRpb25zaGlwIHR5cGU6ICIgKyByZWxhdGlvbnNoaXBUeXBlOwotICAgIH0KLQotICAgIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICogRXh0ZXJuYWxpemFibGUgc3VwcG9ydAotICAgICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgKi8KLQotICAgIC8qKgotICAgICAqIFNhdmUgdGhlIGNvbnRlbnRzIG9mIHRoaXMgb2JqZWN0LgotICAgICAqIDxwLz4KLSAgICAgKiBOT1RFOiBUcmFuc2llbnQgZmllbGRzIGFuZCBzdGF0aWMgZmllbGRzIGFyZSBub3Qgc2F2ZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb3V0IFRoZSBzdHJlYW0gdG8gd3JpdGUgdGhlIG9iamVjdCBjb250ZW50cyB0bwotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUV4dGVybmFsKE9iamVjdE91dHB1dCBvKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBTYWZlT2JqZWN0T3V0cHV0U3RyZWFtIG91dCA9IFNhZmVPYmplY3RPdXRwdXRTdHJlYW0uaW5zdGFsbChvKTsKLSAgICAgICAgLy8gd3JpdGUgb3V0IGNvbnRlbnRzIG9mIHRoaXMgb2JqZWN0Ci0KLSAgICAgICAgLy8gTk9URVM6IEZvciBlYWNoIGl0ZW0sIHdoZXJlIGFwcHJvcHJpYXRlLAotICAgICAgICAvLyAgICAgICAgd3JpdGUgb3V0IHRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb24sIElOIE9SREVSOgotICAgICAgICAvLyAgICAgICAgICAgdGhlIGNsYXNzIG5hbWUKLSAgICAgICAgLy8gICAgICAgICAgIHRoZSBhY3RpdmUgb3IgZW1wdHkgZmxhZwotICAgICAgICAvLyAgICAgICAgICAgdGhlIGRhdGEgbGVuZ3RoLCBpZiBhcHByb3ByaWF0ZQotICAgICAgICAvLyAgICAgICAgICAgdGhlIGRhdGEgICAKLQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBpbiBvcmRlciB0byBoYW5kbGUgZnV0dXJlIGNoYW5nZXMgdG8gdGhlIG9iamVjdCAKLSAgICAgICAgLy8gZGVmaW5pdGlvbiwgYmUgc3VyZSB0byBtYWludGFpbiB0aGUgCi0gICAgICAgIC8vIG9iamVjdCBsZXZlbCBpZGVudGlmaWVycwotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBzZXJpYWxpemF0aW9uIHZlcnNpb24gSUQKLSAgICAgICAgb3V0LndyaXRlTG9uZyhzZXJpYWxWZXJzaW9uVUlEKTsKLQotICAgICAgICAvLyByZXZpc2lvbiBJRAotICAgICAgICBvdXQud3JpdGVJbnQocmV2aXNpb25JRCk7Ci0KLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gdmFyaW91cyBzdHJpbmdzCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgLy8gU3RyaW5nIHJlbGF0aW9uc2hpcFR5cGUKLSAgICAgICAgb3V0LndyaXRlT2JqZWN0KHJlbGF0aW9uc2hpcFR5cGUpOwotCi0gICAgICAgIC8vIFN0cmluZyB2YWx1ZQotICAgICAgICBvdXQud3JpdGVPYmplY3QodmFsdWUpOwotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIGNvbGxlY3Rpb25zIGFuZCBsaXN0cwotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICBvdXQud3JpdGVMaXN0KGV4dGVuc2liaWxpdHlBdHRyaWJ1dGVzKTsKLQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogUmVzdG9yZSB0aGUgY29udGVudHMgb2YgdGhlIG9iamVjdCB0aGF0IHdhcwotICAgICAqIHByZXZpb3VzbHkgc2F2ZWQuCi0gICAgICogPHAvPgotICAgICAqIE5PVEU6IFRoZSBmaWVsZCBkYXRhIG11c3QgcmVhZCBiYWNrIGluIHRoZSBzYW1lIG9yZGVyIGFuZCB0eXBlCi0gICAgICogYXMgaXQgd2FzIHdyaXR0ZW4uICBTb21lIGRhdGEgd2lsbCBuZWVkIHRvIGJlIHZhbGlkYXRlZCB3aGVuCi0gICAgICogcmVzdXJyZWN0ZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaW4gVGhlIHN0cmVhbSB0byByZWFkIHRoZSBvYmplY3QgY29udGVudHMgZnJvbQotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZWFkRXh0ZXJuYWwoT2JqZWN0SW5wdXQgaW5PYmplY3QpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIFNhZmVPYmplY3RJbnB1dFN0cmVhbSBpbiA9IFNhZmVPYmplY3RJbnB1dFN0cmVhbS5pbnN0YWxsKGluT2JqZWN0KTsKLSAgICAgICAgLy8gc2VyaWFsaXphdGlvbiB2ZXJzaW9uIElECi0gICAgICAgIGxvbmcgc3VpZCA9IGluLnJlYWRMb25nKCk7Ci0KLSAgICAgICAgLy8gcmV2aXNpb24gSUQKLSAgICAgICAgaW50IHJldklEID0gaW4ucmVhZEludCgpOwotCi0gICAgICAgIC8vIG1ha2Ugc3VyZSB0aGUgb2JqZWN0IGRhdGEgaXMgaW4gYSB2ZXJzaW9uIHdlIGNhbiBoYW5kbGUKLSAgICAgICAgaWYgKHN1aWQgIT0gc2VyaWFsVmVyc2lvblVJRCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENsYXNzTm90Rm91bmRFeGNlcHRpb24oRXh0ZXJuYWxpemVDb25zdGFudHMuVU5TVVBQT1JURURfU1VJRCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBtYWtlIHN1cmUgdGhlIG9iamVjdCBkYXRhIGlzIGluIGEgcmV2aXNpb24gbGV2ZWwgd2UgY2FuIGhhbmRsZQotICAgICAgICBpZiAocmV2SUQgIT0gUkVWSVNJT05fMikgewotICAgICAgICAgICAgdGhyb3cgbmV3IENsYXNzTm90Rm91bmRFeGNlcHRpb24oRXh0ZXJuYWxpemVDb25zdGFudHMuVU5TVVBQT1JURURfUkVWSUQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gdmFyaW91cyBzdHJpbmdzCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgLy8gU3RyaW5nIHJlbGF0aW9uc2hpcFR5cGUKLSAgICAgICAgcmVsYXRpb25zaGlwVHlwZSA9IChTdHJpbmcpaW4ucmVhZE9iamVjdCgpOwotCi0gICAgICAgIC8vIFN0cmluZyB2YWx1ZQotICAgICAgICB2YWx1ZSA9IChTdHJpbmcpIGluLnJlYWRPYmplY3QoKTsKLQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBjb2xsZWN0aW9ucyBhbmQgbGlzdHMKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICAvLyBBcnJheUxpc3QgZXh0ZW5zaWJpbGl0eUF0dHJpYnV0ZXMKLSAgICAgICAgZXh0ZW5zaWJpbGl0eUF0dHJpYnV0ZXMgPSBpbi5yZWFkQXJyYXlMaXN0KCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvYWRkcmVzc2luZy9pMThuL0FkZHJlc3NpbmdNZXNzYWdlcy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2FkZHJlc3NpbmcvaTE4bi9BZGRyZXNzaW5nTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzI4OGNjZC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvYWRkcmVzc2luZy9pMThuL0FkZHJlc3NpbmdNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLmkxOG47Ci0KLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaTE4bi5NZXNzYWdlQnVuZGxlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaTE4bi5NZXNzYWdlc0NvbnN0YW50czsKLQotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLS8qKgotICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmkxOG4uTWVzc2FnZXMgVGhlIGltcGxlbWVudGF0aW9uIGlzIHRoZSBzYW1lIGJ1dCBqdXN0IHRoaXNDbGFzcyBzdGF0aWMKLSAqICAgICAgcmVmZXJlbmNlIGhhcyBBZGRyZXNzaW5nTWVzc2FnZXMuY2xhc3MKLSAqLwotcHVibGljIGNsYXNzIEFkZHJlc3NpbmdNZXNzYWdlcyB7Ci0KLSAgICAvL09ubHkgdGhpcyBjaGFuZ2VzIGZyb20gdGhlIG9yaWdpbmFsIGNsYXNzCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3M8QWRkcmVzc2luZ01lc3NhZ2VzPiB0aGlzQ2xhc3MgPSBBZGRyZXNzaW5nTWVzc2FnZXMuY2xhc3M7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgcHJvamVjdE5hbWUgPSBNZXNzYWdlc0NvbnN0YW50cy5wcm9qZWN0TmFtZTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyByZXNvdXJjZU5hbWUgPSBNZXNzYWdlc0NvbnN0YW50cy5yZXNvdXJjZU5hbWU7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9jYWxlIGxvY2FsZSA9IE1lc3NhZ2VzQ29uc3RhbnRzLmxvY2FsZTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBwYWNrYWdlTmFtZSA9IGdldFBhY2thZ2UodGhpc0NsYXNzLmdldE5hbWUoKSk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIgPSB0aGlzQ2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFJlc291cmNlQnVuZGxlIHBhcmVudCA9Ci0gICAgICAgICAgICAoTWVzc2FnZXNDb25zdGFudHMucm9vdFBhY2thZ2VOYW1lLmVxdWFscyhwYWNrYWdlTmFtZSkpCi0gICAgICAgICAgICAgICAgICAgID8gbnVsbAotICAgICAgICAgICAgICAgICAgICA6IE1lc3NhZ2VzQ29uc3RhbnRzLnJvb3RCdW5kbGU7Ci0KLQotICAgIC8qKiAqIE5PIE5FRUQgVE8gQ0hBTkdFIEFOWVRISU5HIEJFTE9XICoqKiogKi8KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1lc3NhZ2VCdW5kbGUgbWVzc2FnZUJ1bmRsZSA9Ci0gICAgICAgICAgICBuZXcgTWVzc2FnZUJ1bmRsZShwcm9qZWN0TmFtZSwgcGFja2FnZU5hbWUsIHJlc291cmNlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsZSwgY2xhc3NMb2FkZXIsIHBhcmVudCk7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGEgbWVzc2FnZSBmcm9tIHJlc291cmNlLnByb3BlcnRpZXMgZnJvbSB0aGUgcGFja2FnZSBvZiB0aGUgZ2l2ZW4gb2JqZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIGtleSBUaGUgcmVzb3VyY2Uga2V5Ci0gICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBmb3JtYXR0ZWQgbWVzc2FnZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBrZXkpCi0gICAgICAgICAgICB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG1lc3NhZ2VCdW5kbGUuZ2V0TWVzc2FnZShrZXkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgYSBtZXNzYWdlIGZyb20gcmVzb3VyY2UucHJvcGVydGllcyBmcm9tIHRoZSBwYWNrYWdlIG9mIHRoZSBnaXZlbiBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5ICBUaGUgcmVzb3VyY2Uga2V5Ci0gICAgICogQHBhcmFtIGFyZzAgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHswfQotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgZm9ybWF0dGVkIG1lc3NhZ2UuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZShTdHJpbmcga2V5LCBTdHJpbmcgYXJnMCkKLSAgICAgICAgICAgIHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbWVzc2FnZUJ1bmRsZS5nZXRNZXNzYWdlKGtleSwgYXJnMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhIG1lc3NhZ2UgZnJvbSByZXNvdXJjZS5wcm9wZXJ0aWVzIGZyb20gdGhlIHBhY2thZ2Ugb2YgdGhlIGdpdmVuIG9iamVjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXkgIFRoZSByZXNvdXJjZSBrZXkKLSAgICAgKiBAcGFyYW0gYXJnMCBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezB9Ci0gICAgICogQHBhcmFtIGFyZzEgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHsxfQotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgZm9ybWF0dGVkIG1lc3NhZ2UuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZShTdHJpbmcga2V5LCBTdHJpbmcgYXJnMCwgU3RyaW5nIGFyZzEpCi0gICAgICAgICAgICB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG1lc3NhZ2VCdW5kbGUuZ2V0TWVzc2FnZShrZXksIGFyZzAsIGFyZzEpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgYSBtZXNzYWdlIGZyb20gcmVzb3VyY2UucHJvcGVydGllcyBmcm9tIHRoZSBwYWNrYWdlIG9mIHRoZSBnaXZlbiBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5ICBUaGUgcmVzb3VyY2Uga2V5Ci0gICAgICogQHBhcmFtIGFyZzAgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHswfQotICAgICAqIEBwYXJhbSBhcmcxIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7MX0KLSAgICAgKiBAcGFyYW0gYXJnMiBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezJ9Ci0gICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBmb3JtYXR0ZWQgbWVzc2FnZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBrZXksIFN0cmluZyBhcmcwLCBTdHJpbmcgYXJnMSwgU3RyaW5nIGFyZzIpCi0gICAgICAgICAgICB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG1lc3NhZ2VCdW5kbGUuZ2V0TWVzc2FnZShrZXksIGFyZzAsIGFyZzEsIGFyZzIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgYSBtZXNzYWdlIGZyb20gcmVzb3VyY2UucHJvcGVydGllcyBmcm9tIHRoZSBwYWNrYWdlIG9mIHRoZSBnaXZlbiBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5ICBUaGUgcmVzb3VyY2Uga2V5Ci0gICAgICogQHBhcmFtIGFyZzAgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHswfQotICAgICAqIEBwYXJhbSBhcmcxIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7MX0KLSAgICAgKiBAcGFyYW0gYXJnMiBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezJ9Ci0gICAgICogQHBhcmFtIGFyZzMgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHszfQotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgZm9ybWF0dGVkIG1lc3NhZ2UuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZShTdHJpbmcga2V5LCBTdHJpbmcgYXJnMCwgU3RyaW5nIGFyZzEsIFN0cmluZyBhcmcyLCBTdHJpbmcgYXJnMykKLSAgICAgICAgICAgIHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbWVzc2FnZUJ1bmRsZS5nZXRNZXNzYWdlKGtleSwgYXJnMCwgYXJnMSwgYXJnMiwgYXJnMyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhIG1lc3NhZ2UgZnJvbSByZXNvdXJjZS5wcm9wZXJ0aWVzIGZyb20gdGhlIHBhY2thZ2Ugb2YgdGhlIGdpdmVuIG9iamVjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXkgIFRoZSByZXNvdXJjZSBrZXkKLSAgICAgKiBAcGFyYW0gYXJnMCBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezB9Ci0gICAgICogQHBhcmFtIGFyZzEgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHsxfQotICAgICAqIEBwYXJhbSBhcmcyIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7Mn0KLSAgICAgKiBAcGFyYW0gYXJnMyBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezN9Ci0gICAgICogQHBhcmFtIGFyZzQgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHs0fQotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgZm9ybWF0dGVkIG1lc3NhZ2UuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZShTdHJpbmcga2V5LCBTdHJpbmcgYXJnMCwgU3RyaW5nIGFyZzEsIFN0cmluZyBhcmcyLCBTdHJpbmcgYXJnMywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhcmc0KQotICAgICAgICAgICAgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBtZXNzYWdlQnVuZGxlLmdldE1lc3NhZ2Uoa2V5LCBhcmcwLCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGEgbWVzc2FnZSBmcm9tIHJlc291cmNlLnByb3BlcnRpZXMgZnJvbSB0aGUgcGFja2FnZSBvZiB0aGUgZ2l2ZW4gb2JqZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIGtleSAgVGhlIHJlc291cmNlIGtleQotICAgICAqIEBwYXJhbSBhcmdzIEFuIGFycmF5IG9mIG9iamVjdHMgdG8gcGxhY2UgaW4gY29ycmVzcG9uZGluZyB2YXJpYWJsZXMKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGZvcm1hdHRlZCBtZXNzYWdlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIGtleSwgU3RyaW5nW10gYXJncykKLSAgICAgICAgICAgIHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbWVzc2FnZUJ1bmRsZS5nZXRNZXNzYWdlKGtleSwgYXJncyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpIHsKLSAgICAgICAgcmV0dXJuIG1lc3NhZ2VCdW5kbGUuZ2V0UmVzb3VyY2VCdW5kbGUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE1lc3NhZ2VCdW5kbGUgZ2V0TWVzc2FnZUJ1bmRsZSgpIHsKLSAgICAgICAgcmV0dXJuIG1lc3NhZ2VCdW5kbGU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFBhY2thZ2UoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgcmV0dXJuIG5hbWUuc3Vic3RyaW5nKDAsIG5hbWUubGFzdEluZGV4T2YoJy4nKSkuaW50ZXJuKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvYWRkcmVzc2luZy9pMThuL3Jlc291cmNlLnByb3BlcnRpZXMgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvYWRkcmVzc2luZy9pMThuL3Jlc291cmNlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2MDM2N2UuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2FkZHJlc3NpbmcvaTE4bi9yZXNvdXJjZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotIwotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi0jIFRyYW5zbGF0aW9uIGluc3RydWN0aW9ucy4KLSMgMS4gIEVhY2ggbWVzc2FnZSBsaW5lIGlzIG9mIHRoZSBmb3JtIGtleT12YWx1ZS4KLSMgICAgIFRyYW5zbGF0ZSB0aGUgdmFsdWUsIERPIE5PVCB0cmFuc2xhdGUgdGhlIGtleS4KLSMgMi4gIFRoZSBtZXNzYWdlcyBtYXkgY29udGFpbiBhcmd1bWVudHMgdGhhdCB3aWxsIGJlIGZpbGxlZCBpbgotIyAgICAgYnkgdGhlIHJ1bnRpbWUuICBUaGVzZSBhcmUgb2YgdGhlIGZvcm06IHswfSwgezF9LCBldGMuCi0jICAgICBUaGVzZSBtdXN0IGFwcGVhciBhcyBpcyBpbiB0aGUgbWVzc2FnZSwgdGhvdWdoIHRoZSBvcmRlcgotIyAgICAgbWF5IGJlIGNoYW5nZWQgdG8gc3VwcG9ydCBwcm9wZXIgbGFuZ3VhZ2Ugc3ludGF4LgotIyAzLiAgSWYgYSBzaW5nbGUgcXVvdGUgY2hhcmFjdGVyIGlzIHRvIGFwcGVhciBpbiB0aGUgcmVzdWx0aW5nCi0jICAgICBtZXNzYWdlLCBpdCBtdXN0IGFwcGVhciBpbiB0aGlzIGZpbGUgYXMgdHdvIGNvbnNlY3V0aXZlCi0jICAgICBzaW5nbGUgcXVvdGUgY2hhcmFjdGVycy4KLSMgNC4gIExpbmVzIGJlZ2lubmluZyB3aXRoICIjIiAobGlrZSB0aGlzIG9uZSkgYXJlIGNvbW1lbnQgbGluZXMKLSMgICAgIGFuZCBtYXkgY29udGFpbiB0cmFuc2xhdGlvbiBpbnN0cnVjdGlvbnMuICBUaGV5IG5lZWQgbm90IGJlCi0jICAgICB0cmFuc2xhdGVkIHVubGVzcyB5b3VyIHRyYW5zbGF0ZWQgZmlsZSwgcmF0aGVyIHRoYW4gdGhpcyBmaWxlLAotIyAgICAgd2lsbCBzZXJ2ZSBhcyBhIGJhc2UgZm9yIG90aGVyIHRyYW5zbGF0b3JzLgotCi1vdXRib3VuZE5vQWN0aW9uPVVuYWJsZSB0byBkZXRlcm1pbmUgd3NhOkFjdGlvbiBmb3Igb3V0Ym91bmQgbWVzc2FnZQotcmVmZXJlbmNlUGFyYW1ldGVyRXJyb3I9QW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgYXR0ZW1wdGluZyB0byBhZGQgYSByZWZlcmVuY2UgcGFyYW1ldGVyIGFzIGEgU09BUCBoZWFkZXIuCi0KLXNwZWNpZmljSW52YWxpZEFkZHJlc3NpbmdIZWFkZXI9VGhlIHNlcnZlciBmYWlsZWQgdG8gcHJvY2VzcyB0aGUgV1MtQWRkcmVzc2luZyBoZWFkZXI6IHswfSBbUmVhc29uXTogQSBoZWFkZXIgcmVwcmVzZW50aW5nIGEgTWVzc2FnZSBBZGRyZXNzaW5nIFByb3BlcnR5IGlzIG5vdCB2YWxpZCBhbmQgdGhlIG1lc3NhZ2UgY2Fubm90IGJlIHByb2Nlc3NlZAotaW52YWxpZEFkZHJlc3NpbmdIZWFkZXI9VGhlIHNlcnZlciBmYWlsZWQgdG8gcHJvY2VzcyBvbmUgb2YgdGhlIFdTLUFkZHJlc3NpbmcgaGVhZGVycy4gW1JlYXNvbl06IEEgaGVhZGVyIHJlcHJlc2VudGluZyBhIE1lc3NhZ2UgQWRkcmVzc2luZyBQcm9wZXJ0eSBpcyBub3QgdmFsaWQgYW5kIHRoZSBtZXNzYWdlIGNhbm5vdCBiZSBwcm9jZXNzZWQKLXNwZWNpZmljSW52YWxpZENhcmRpbmFsaXR5PVRoZSBzZXJ2ZXIgcmVjZWl2ZWQgbW9yZSB0aGFuIG9uZSB7MH0gV1MtQWRkcmVzc2luZyBoZWFkZXIKLWludmFsaWRDYXJkaW5hbGl0eT09VGhlIHNlcnZlciByZWNlaXZlZCBtb3JlIGNvcGllcyBvZiBhIFdTLUFkZHJlc3NpbmcgaGVhZGVyIHRoYW4gZXhwZWN0ZWQKLXNwZWNpZmljTWlzc2luZ0FkZHJlc3NJbkVQUj1BIHswfSBoZWFkZXIgd2FzIGV4cGVjdGVkIHRvIGJlIGFuIEVQUiBidXQgZGlkIG5vdCBjb250YWluIGFuIFthZGRyZXNzXS4KLW1pc3NpbmdBZGRyZXNzSW5FUFI9QSBXUy1BZGRyZXNzaW5nIGhlYWRlciB3YXMgZXhwZWN0ZWQgdG8gYmUgYW4gRVBSIGJ1dCBkaWQgbm90IGNvbnRhaW4gYW4gW2FkZHJlc3NdLgotZHVwbGljYXRlTWVzc2FnZUlEPVRoZSBzZXJ2ZXIgcmVqZWN0ZWQgdGhlIG1lc3NhZ2UgYmVjYXVzZSBpdCBoYWQgYSBXUy1BZGRyZXNzaW5nIE1lc3NhZ2VJRCB3aGljaCBpdCBoYWQgcHJvY2Vzc2VkIHByZXZpb3VzbHkuCi1hY3Rpb25NaXNtYXRjaD1XUy1BZGRyZXNzaW5nIEZhdWx0OiBUaGUgU09BUEFjdGlvbiBhbmQgd3NhOkFjdGlvbiByZWNlaXZlZCBieSB0aGUgc2VydmVyIGRpZCBub3QgbWF0Y2guCi1zcGVjaWZpY09ubHlBbm9ueW1vdXNTdXBwb3J0ZWQ9VGhlIHswfSBoZWFkZXIgY29udGFpbmVkIGEgbm9uLWFub255bW91cyBbYWRkcmVzc10gd2hpY2ggaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgc2VydmVyLgotb25seUFub255bW91c1N1cHBvcnRlZD1BIFdTLUFkZHJlc3NpbmcgaGVhZGVyIGNvbnRhaW5lZCBhIG5vbi1hbm9ueW1vdXMgW2FkZHJlc3NdIHdoaWNoIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHNlcnZlci4KLXNwZWNpZmljT25seU5vbkFub25TdXBwb3J0ZWQ9VGhlIHswfSBoZWFkZXIgY29udGFpbmVkIGFuIGFub255bW91cyBbYWRkcmVzc10gd2hpY2ggaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgc2VydmVyLgotb25seU5vbkFub25TdXBwb3J0ZWQ9QSBXUy1BZGRyZXNzaW5nIGhlYWRlciBjb250YWluZWQgYW4gYW5vbnltb3VzIFthZGRyZXNzXSB3aGljaCBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBzZXJ2ZXIuCi1zcGVjaWZpY0FkZHJlc3NpbmdIZWFkZXJSZXF1aXJlZD1UaGUgezB9IGhlYWRlciBpcyByZXF1aXJlZCB3aGVuIFdTLUFkZHJlc3NpbmcgaXMgaW4gdXNlIGJ1dCB3YXMgbm90IHNlbnQuCi1hZGRyZXNzaW5nSGVhZGVyUmVxdWlyZWQ9QSBXUy1BZGRyZXNzaW5nIGhlYWRlciB3aGljaCBpcyByZXF1aXJlZCB3aGVuIFdTLUFkZHJlc3NpbmcgaXMgaW4gdXNlIHdhcyBub3Qgc2VudC4KLXNwZWNpZmljRGVzdGluYXRpb25VbnJlYWNoYWJsZT1UaGUgZGVzdGluYXRpb24gcmVwcmVzZW50ZWQgYnkgdGhlIFdTLUFkZHJlc3NpbmcgVG8gRVBSIHdpdGggYWRkcmVzcyB7MH0gY2Fubm90IGJlIHJlYWNoZWQuCi1kZXN0aW5hdGlvblVucmVhY2hhYmxlPVRoZSBkZXN0aW5hdGlvbiByZXByZXNlbnRlZCBieSB0aGUgV1MtQWRkcmVzc2luZyBUbyBFUFIgY2Fubm90IGJlIHJlYWNoZWQuCi1zcGVjaWZpY0FjdGlvbk5vdFJlY29nbmlzZWQ9VGhlIHNlcnZlciBkaWQgbm90IHJlY29nbmlzZSB0aGUgYWN0aW9uIHdoaWNoIGl0IHJlY2VpdmVkOiB7MH0KLWFjdGlvbk5vdFJlY29nbmlzZWQ9VGhlIHNlcnZlciBkaWQgbm90IHJlY29nbmlzZSB0aGUgYWN0aW9uIHdoaWNoIGl0IHJlY2VpdmVkLgotCi0jIFNwZWMgRmF1bHQgU3RyaW5ncyAtIERPIE5PVCBOTFMgd2l0aG91dCBjb250YWN0aW5nIGRldmVsb3BlcnMgZm9yIGFkdmljZQotc3BlYy5GQVVMVF9BQ1RJT05fTk9UX1NVUFBPUlRFRF9SRUFTT049VGhlIFthY3Rpb25dIGNhbm5vdCBiZSBwcm9jZXNzZWQgYXQgdGhlIHJlY2VpdmVyLgotc3BlYy5maW5hbC5GQVVMVF9JTlZBTElEX0hFQURFUl9SRUFTT049QSBoZWFkZXIgcmVwcmVzZW50aW5nIGEgTWVzc2FnZSBBZGRyZXNzaW5nIFByb3BlcnR5IGlzIG5vdCB2YWxpZCBhbmQgdGhlIG1lc3NhZ2UgY2Fubm90IGJlIHByb2Nlc3NlZAotc3BlYy5maW5hbC5GQVVMVF9BRERSRVNTSU5HX0hFQURFUl9SRVFVSVJFRF9SRUFTT049QSByZXF1aXJlZCBoZWFkZXIgcmVwcmVzZW50aW5nIGEgTWVzc2FnZSBBZGRyZXNzaW5nIFByb3BlcnR5IGlzIG5vdCBwcmVzZW50Ci1zcGVjLmZpbmFsLkZBVUxUX0FERFJFU1NJTkdfREVTVElOQVRJT05fVU5SRUFDSEFCTEVfUkVBU09OPU5vIHJvdXRlIGNhbiBiZSBkZXRlcm1pbmVkIHRvIHJlYWNoIFtkZXN0aW5hdGlvbl0KLXNwZWMuc3VibWlzc2lvbi5GQVVMVF9BRERSRVNTSU5HX0RFU1RJTkFUSU9OX1VOUkVBQ0hBQkxFX1JFQVNPTj1ObyByb3V0ZSBjYW4gYmUgZGV0ZXJtaW5lZCB0byByZWFjaCB0aGUgZGVzdGluYXRpb24gcm9sZSBkZWZpbmVkIGJ5IHRoZSBXUy1BZGRyZXNzaW5nIFRvLgotc3BlYy5zdWJtaXNzaW9uLkZBVUxUX0lOVkFMSURfSEVBREVSX1JFQVNPTj1BIG1lc3NhZ2UgaW5mb3JtYXRpb24gaGVhZGVyIGlzIG5vdCB2YWxpZCBhbmQgdGhlIG1lc3NhZ2UgY2Fubm90IGJlIHByb2Nlc3NlZC4gVGhlIHZhbGlkaXR5IGZhaWx1cmUgY2FuIGJlIGVpdGhlciBzdHJ1Y3R1cmFsIG9yIHNlbWFudGljLCBlLmcuIGEgW2Rlc3RpbmF0aW9uXSB0aGF0IGlzIG5vdCBhIFVSSSBvciBhIFtyZWxhdGlvbnNoaXBdIHRvIGEgW21lc3NhZ2UgaWRdIHRoYXQgd2FzIG5ldmVyIGlzc3VlZC4KLXNwZWMuc3VibWlzc2lvbi5GQVVMVF9BRERSRVNTSU5HX0hFQURFUl9SRVFVSVJFRF9SRUFTT049QSByZXF1aXJlZCBtZXNzYWdlIGluZm9ybWF0aW9uIGhlYWRlciwgVG8sIE1lc3NhZ2VJRCwgb3IgQWN0aW9uLCBpcyBub3QgcHJlc2VudC4KLSAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2FkZHJlc3NpbmcvbWV0YWRhdGEvSW50ZXJmYWNlTmFtZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2FkZHJlc3NpbmcvbWV0YWRhdGEvSW50ZXJmYWNlTmFtZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjI2YjA3Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9hZGRyZXNzaW5nL21ldGFkYXRhL0ludGVyZmFjZU5hbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcubWV0YWRhdGE7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5hbWVzcGFjZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5BZGRyZXNzaW5nQ29uc3RhbnRzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuQWRkcmVzc2luZ0NvbnN0YW50cy5GaW5hbDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkFkZHJlc3NpbmdDb25zdGFudHMuU3VibWlzc2lvbjsNCi0NCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi0NCi1wdWJsaWMgY2xhc3MgSW50ZXJmYWNlTmFtZSB7DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgc3ViUU5hbWUgPSBuZXcgUU5hbWUoU3VibWlzc2lvbi5XU0FfTkFNRVNQQUNFLCBTdWJtaXNzaW9uLldTQV9JTlRFUkZBQ0VfTkFNRSwgQWRkcmVzc2luZ0NvbnN0YW50cy5XU0FfREVGQVVMVF9QUkVGSVgpOw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIHdzYW1RTmFtZSA9IG5ldyBRTmFtZShGaW5hbC5XU0FNX05BTUVTUEFDRSwgRmluYWwuV1NBX0lOVEVSRkFDRV9OQU1FLCBGaW5hbC5XU0FfREVGQVVMVF9NRVRBREFUQV9QUkVGSVgpOw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIHdzYXdRTmFtZSA9IG5ldyBRTmFtZShGaW5hbC5XU0FXX05BTUVTUEFDRSwgRmluYWwuV1NBX0lOVEVSRkFDRV9OQU1FLCBGaW5hbC5XU0FfT1JJR0lOQUxfTUVUQURBVEFfUFJFRklYKTsNCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBGaWVsZCBuYW1lDQotICAgICAqLw0KLSAgICBwcml2YXRlIFFOYW1lIG5hbWU7DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICovDQotICAgIHB1YmxpYyBJbnRlcmZhY2VOYW1lKCkgew0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBAcGFyYW0gbmFtZQ0KLSAgICAgKi8NCi0gICAgcHVibGljIEludGVyZmFjZU5hbWUoUU5hbWUgbmFtZSkgew0KLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogTWV0aG9kIGdldE5hbWUNCi0gICAgICovDQotICAgIHB1YmxpYyBRTmFtZSBnZXROYW1lKCkgew0KLSAgICAgICAgcmV0dXJuIG5hbWU7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIE1ldGhvZCBzZXROYW1lDQotICAgICAqDQotICAgICAqIEBwYXJhbSBuYW1lDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFFOYW1lIG5hbWUpIHsNCi0gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gY29udmVydCBvYmplY3RzIG9mIHRoaXMgdHlwZSB0byBhbiB7QGxpbmsgT01FbGVtZW50fSBzbyB0aGF0IGl0DQotICAgICAqIGNhbiBiZSBhZGRlZCB0byBhbiB7QGxpbmsgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlfQ0KLSAgICAgKiANCi0gICAgICogPHA+VXNlOjwvcD4NCi0gICAgICogPHA+DQotICAgICAqIE9NRWxlbWVudCBvbUVsZW1lbnQgPQ0KLSAgICAgKiBzZXJ2aWNlTmFtZS50b09NKG5ldyBRTmFtZSgiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOC9hZGRyZXNzaW5nIiwgIlBvcnRUeXBlIiwgIndzYSIpKTsNCi0gICAgICogPC9wPg0KLSAgICAgKiA8cD5vcjwvcD4NCi0gICAgICogPHA+DQotICAgICAqIE9NRWxlbWVudCBvbUVsZW1lbnQgPQ0KLSAgICAgKiBzZXJ2aWNlTmFtZS50b09NKG5ldyBRTmFtZSgiaHR0cDovL3d3dy53My5vcmcvMjAwNy8wNS9hZGRyZXNzaW5nL21ldGFkYXRhIiwgIkludGVyZmFjZU5hbWUiLCAid3NhbSIpKTsNCi0gICAgICogPC9wPg0KLSAgICAgKiA8cD4NCi0gICAgICogdGhlIGRpZmZlcmVuY2UgYmVpbmcgd2hldGhlciB0aGUgRW5kcG9pbnRSZWZlcmVuY2UgaXMgbWVhbnQgdG8gcmVwcmVzZW50IGEgMjAwNC8wOA0KLSAgICAgKiAoU3VibWlzc2lvbikgb3IgMjAwNS8wOCAoRmluYWwpIEVuZHBvaW50UmVmZXJlbmNlLCByZXNwZWN0aXZlbHkuDQotICAgICAqIDwvcD4NCi0gICAgICogDQotICAgICAqIEBwYXJhbSBxbmFtZSB0aGUgPGNvZGU+UU5hbWU8L2NvZGU+IHRoYXQgY2FycmllcyB0aGUgbmFtZXNwYWNlIG9mIHRoZSBtZXRhZGF0YSBlbGVtZW50Lg0KLSAgICAgKiBAcGFyYW0gZmFjIFRPRE8NCi0gICAgICogQHJldHVybiBhbiBPTUVsZW1lbnQgdGhhdCBjYW4gYmUgYWRkZWQgdG8gdGhlIG1ldGFkYXRhIG9mIGFuIEVuZHBvaW50UmVmZXJlbmNlLg0KLSAgICAgKi8NCi0gICAgcHVibGljIE9NRWxlbWVudCB0b09NKE9NRmFjdG9yeSBmYWMsIFFOYW1lIHFuYW1lKSB0aHJvd3MgQXhpc0ZhdWx0IHsNCi0gICAgICAgIFN0cmluZyBwcmVmaXggPSBxbmFtZS5nZXRQcmVmaXgoKTsNCi0gICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoIlRoZSBwcmVmaXggY2Fubm90IGJlIG51bGwuIik7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIFN0cmluZyBsb2NhbE5hbWUgPSBxbmFtZS5nZXRMb2NhbFBhcnQoKTsNCi0gICAgICAgIGlmICghRmluYWwuV1NBX0lOVEVSRkFDRV9OQU1FLmVxdWFscyhsb2NhbE5hbWUpICYmICFTdWJtaXNzaW9uLldTQV9JTlRFUkZBQ0VfTkFNRS5lcXVhbHMobG9jYWxOYW1lKSkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoIlRoZSBsb2NhbCBuYW1lIG11c3QgYmUgJ0ludGVyZmFjZU5hbWUnIG9yICdQb3J0VHlwZScuIik7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsNCi0gICAgICAgIGlmIChuYW1lc3BhY2UgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoIlRoZSBuYW1lc3BhY2UgY2Fub3QgYmUgbnVsbC4iKTsNCi0gICAgICAgIH0NCi0gICAgICAgICAgICANCi0gICAgICAgIE9NTmFtZXNwYWNlIG1ldGFkYXRhTnMgPSBmYWMuY3JlYXRlT01OYW1lc3BhY2UobmFtZXNwYWNlLCBwcmVmaXgpOw0KLSAgICAgICAgT01FbGVtZW50IGVsZW1lbnQgPSBmYWMuY3JlYXRlT01FbGVtZW50KGxvY2FsTmFtZSwgbWV0YWRhdGFOcyk7DQotICAgICAgICBlbGVtZW50LnNldFRleHQobmFtZSk7DQotDQotICAgICAgICByZXR1cm4gZWxlbWVudDsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBleHRyYWN0IG1ldGFkYXRhIGZyb20gYW4gZWxlbWVudC4NCi0gICAgICogDQotICAgICAqIDxwPg0KLSAgICAgKiAmbHQ7d3NhbTpJbnRlcmZhY2VOYW1lIHhtbG5zOndzYW09Imh0dHA6Ly93d3cudzMub3JnLzIwMDcvMDUvYWRkcmVzc2luZy9tZXRhZGF0YSImZ3Q7Li4uJmx0Oy93c2FtOlNlcnZpY2VOYW1lJmd0Ow0KLSAgICAgKiA8L3A+DQotICAgICAqIDxwPm9yPC9wPg0KLSAgICAgKiA8cD4NCi0gICAgICogJmx0O3dzYTpQb3J0VHlwZSB4bWxuczp3c2E9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDgvYWRkcmVzc2luZyImZ3Q7Li4uJmx0Oy93c2E6U2VydmljZU5hbWUmZ3Q7DQotICAgICAqIDwvcD4NCi0gICAgICogDQotICAgICAqIEBwYXJhbSBvbUVsZW1lbnQgdGhlIDxjb2RlPk9NRWxlbWVudDwvY29kZT4gdGhhdCBob2xkcyB0aGUgbWV0YWRhdGEuDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBmcm9tT00oT01FbGVtZW50IG9tRWxlbWVudCkgdGhyb3dzIEF4aXNGYXVsdCB7DQotICAgICAgICBRTmFtZSBxbmFtZSA9IG9tRWxlbWVudC5nZXRRTmFtZSgpOw0KLSAgICAgICAgDQotICAgICAgICBpZiAoIXdzYW1RTmFtZS5lcXVhbHMocW5hbWUpICYmICF3c2F3UU5hbWUuZXF1YWxzKHFuYW1lKSAmJiAhc3ViUU5hbWUuZXF1YWxzKHFuYW1lKSkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoIlVucmVjb2duaXplZCBlbGVtZW50LiIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgbmFtZSA9IG9tRWxlbWVudC5nZXRUZXh0QXNRTmFtZSgpOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogU3RhdGljIG1ldGhvZCB0byB0ZXN0IHdoZXRoZXIgYW4gPGNvZGU+T01FbGVtZW50PC9jb2RlPiBpcyByZWNvZ25pemVkDQotICAgICAqIGFzIGEgU2VydmljZU5hbWUgZWxlbWVudC4gSWYgdGhpcyBtZXRob2QgcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiB0aGVuDQotICAgICAqIHtAbGluayAjZnJvbU9NKE9NRWxlbWVudCl9IGlzIGd1YXJhbnRlZWQgbm90IHRvIGZhaWwuDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gb21FbGVtZW50IHRoZSA8Y29kZT5PTUVsZW1lbnQ8L2NvZGU+IHRvIHRlc3QuDQotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGVsZW1lbnQgaXMgYSBTZXJ2aWNlTmFtZSBlbGVtZW50LA0KLSAgICAgKiA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzSW50ZXJmYWNlTmFtZUVsZW1lbnQoT01FbGVtZW50IG9tRWxlbWVudCkgew0KLSAgICAgICAgYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsNCi0gICAgICAgIFFOYW1lIHFuYW1lID0gb21FbGVtZW50LmdldFFOYW1lKCk7DQotICAgICAgICANCi0gICAgICAgIGlmICh3c2FtUU5hbWUuZXF1YWxzKHFuYW1lKSB8fCB3c2F3UU5hbWUuZXF1YWxzKHFuYW1lKSB8fCBzdWJRTmFtZS5lcXVhbHMocW5hbWUpKQ0KLSAgICAgICAgICAgIHJlc3VsdCA9IHRydWU7DQotICAgICAgICANCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2FkZHJlc3NpbmcvbWV0YWRhdGEvU2VydmljZU5hbWUuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9hZGRyZXNzaW5nL21ldGFkYXRhL1NlcnZpY2VOYW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3NTNjMGMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2FkZHJlc3NpbmcvbWV0YWRhdGEvU2VydmljZU5hbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcubWV0YWRhdGE7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5hbWVzcGFjZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5BZGRyZXNzaW5nQ29uc3RhbnRzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuQWRkcmVzc2luZ0NvbnN0YW50cy5GaW5hbDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkFkZHJlc3NpbmdDb25zdGFudHMuU3VibWlzc2lvbjsNCi0NCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi0NCi1wdWJsaWMgY2xhc3MgU2VydmljZU5hbWUgew0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIHN1YlFOYW1lID0gbmV3IFFOYW1lKFN1Ym1pc3Npb24uV1NBX05BTUVTUEFDRSwgQWRkcmVzc2luZ0NvbnN0YW50cy5FUFJfU0VSVklDRV9OQU1FLCBBZGRyZXNzaW5nQ29uc3RhbnRzLldTQV9ERUZBVUxUX1BSRUZJWCk7DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgd3NhbVFOYW1lID0gbmV3IFFOYW1lKEZpbmFsLldTQU1fTkFNRVNQQUNFLCBBZGRyZXNzaW5nQ29uc3RhbnRzLkVQUl9TRVJWSUNFX05BTUUsIEZpbmFsLldTQV9ERUZBVUxUX01FVEFEQVRBX1BSRUZJWCk7DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgd3Nhd1FOYW1lID0gbmV3IFFOYW1lKEZpbmFsLldTQVdfTkFNRVNQQUNFLCBBZGRyZXNzaW5nQ29uc3RhbnRzLkVQUl9TRVJWSUNFX05BTUUsIEZpbmFsLldTQV9PUklHSU5BTF9NRVRBREFUQV9QUkVGSVgpOw0KLSAgICANCi0gICAgLyoqDQotICAgICAqIEZpZWxkIG5hbWUNCi0gICAgICovDQotICAgIHByaXZhdGUgUU5hbWUgbmFtZTsNCi0NCi0gICAgLyoqDQotICAgICAqIEZpZWxkIHBvcnROYW1lDQotICAgICAqLw0KLSAgICBwcml2YXRlIFN0cmluZyBlbmRwb2ludE5hbWU7DQotICAgIA0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqDQotICAgICAqLw0KLSAgICBwdWJsaWMgU2VydmljZU5hbWUoKSB7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIEBwYXJhbSBuYW1lDQotICAgICAqLw0KLSAgICBwdWJsaWMgU2VydmljZU5hbWUoUU5hbWUgbmFtZSkgew0KLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogQHBhcmFtIG5hbWUNCi0gICAgICogQHBhcmFtIGVuZHBvaW50TmFtZQ0KLSAgICAgKi8NCi0gICAgcHVibGljIFNlcnZpY2VOYW1lKFFOYW1lIG5hbWUsIFN0cmluZyBlbmRwb2ludE5hbWUpIHsNCi0gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7DQotICAgICAgICB0aGlzLmVuZHBvaW50TmFtZSA9IGVuZHBvaW50TmFtZTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogTWV0aG9kIGdldE5hbWUNCi0gICAgICovDQotICAgIHB1YmxpYyBRTmFtZSBnZXROYW1lKCkgew0KLSAgICAgICAgcmV0dXJuIG5hbWU7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIE1ldGhvZCBnZXRQb3J0TmFtZQ0KLSAgICAgKi8NCi0gICAgcHVibGljIFN0cmluZyBnZXRFbmRwb2ludE5hbWUoKSB7DQotICAgICAgICByZXR1cm4gZW5kcG9pbnROYW1lOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBNZXRob2Qgc2V0TmFtZQ0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gbmFtZQ0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZShRTmFtZSBuYW1lKSB7DQotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBNZXRob2Qgc2V0UG9ydE5hbWUNCi0gICAgICoNCi0gICAgICogQHBhcmFtIGVuZHBvaW50TmFtZQ0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgc2V0RW5kcG9pbnROYW1lKFN0cmluZyBlbmRwb2ludE5hbWUpIHsNCi0gICAgICAgIHRoaXMuZW5kcG9pbnROYW1lID0gZW5kcG9pbnROYW1lOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIGNvbnZlcnQgb2JqZWN0cyBvZiB0aGlzIHR5cGUgdG8gYW4ge0BsaW5rIE9NRWxlbWVudH0gc28gdGhhdCBpdA0KLSAgICAgKiBjYW4gYmUgYWRkZWQgdG8gYW4ge0BsaW5rIG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZX0NCi0gICAgICogDQotICAgICAqIDxwPlVzZTo8L3A+DQotICAgICAqIDxwPg0KLSAgICAgKiBPTUVsZW1lbnQgb21FbGVtZW50ID0NCi0gICAgICogc2VydmljZU5hbWUudG9PTShuZXcgUU5hbWUoImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDgvYWRkcmVzc2luZyIsICJTZXJ2aWNlTmFtZSIsICJ3c2EiKSk7DQotICAgICAqIDwvcD4NCi0gICAgICogPHA+b3I8L3A+DQotICAgICAqIDxwPg0KLSAgICAgKiBPTUVsZW1lbnQgb21FbGVtZW50ID0NCi0gICAgICogc2VydmljZU5hbWUudG9PTShuZXcgUU5hbWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDcvMDUvYWRkcmVzc2luZy9tZXRhZGF0YSIsICJTZXJ2aWNlTmFtZSIsICJ3c2FtIikpOw0KLSAgICAgKiA8L3A+DQotICAgICAqIDxwPg0KLSAgICAgKiB0aGUgZGlmZmVyZW5jZSBiZWluZyB3aGV0aGVyIHRoZSBFbmRwb2ludFJlZmVyZW5jZSBpcyBtZWFudCB0byByZXByZXNlbnQgYSAyMDA0LzA4DQotICAgICAqIChTdWJtaXNzaW9uKSBvciAyMDA1LzA4IChGaW5hbCkgRW5kcG9pbnRSZWZlcmVuY2UsIHJlc3BlY3RpdmVseS4NCi0gICAgICogPC9wPg0KLSAgICAgKiBAcGFyYW0gZmFjdG9yeSA8Y29kZT5PTUZhY3Rvcnk8L2NvZGU+IHRvIHVzZSB3aGVuIGdlbmVyYXRpbmcgPGNvZGU+T01FbGVtZW50PC9jb2RlPnMNCi0gICAgICogQHBhcmFtIHFuYW1lIHRoZSA8Y29kZT5RTmFtZTwvY29kZT4gdGhhdCBjYXJyaWVzIHRoZSBuYW1lc3BhY2Ugb2YgdGhlIG1ldGFkYXRhIGVsZW1lbnQuDQotICAgICAqIA0KLSAgICAgKiBAcmV0dXJuIGFuIE9NRWxlbWVudCB0aGF0IGNhbiBiZSBhZGRlZCB0byB0aGUgbWV0YWRhdGEgb2YgYW4gRW5kcG9pbnRSZWZlcmVuY2UuDQotICAgICAqLw0KLSAgICBwdWJsaWMgT01FbGVtZW50IHRvT00oT01GYWN0b3J5IGZhY3RvcnksIFFOYW1lIHFuYW1lKSB0aHJvd3MgQXhpc0ZhdWx0IHsNCi0gICAgICAgIFN0cmluZyBsb2NhbE5hbWUgPSBxbmFtZS5nZXRMb2NhbFBhcnQoKTsNCi0gICAgICAgIGlmICghQWRkcmVzc2luZ0NvbnN0YW50cy5FUFJfU0VSVklDRV9OQU1FLmVxdWFscyhsb2NhbE5hbWUpKSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiVGhlIGxvY2FsIG5hbWUgbXVzdCBiZSAnU2VydmljZU5hbWUnLiIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICBTdHJpbmcgcHJlZml4ID0gcW5hbWUuZ2V0UHJlZml4KCk7DQotICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJUaGUgcHJlZml4IGNhbm5vdCBiZSBudWxsLiIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICBTdHJpbmcgbmFtZXNwYWNlID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7DQotICAgICAgICBpZiAobmFtZXNwYWNlID09IG51bGwpIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJUaGUgbmFtZXNwYWNlIGNhbm90IGJlIG51bGwuIik7DQotICAgICAgICB9DQotICAgICAgICAgICAgDQotICAgICAgICBPTU5hbWVzcGFjZSBtZXRhZGF0YU5zID0gZmFjdG9yeS5jcmVhdGVPTU5hbWVzcGFjZShuYW1lc3BhY2UsIHByZWZpeCk7DQotICAgICAgICBPTUVsZW1lbnQgZWxlbWVudCA9IGZhY3RvcnkuY3JlYXRlT01FbGVtZW50KGxvY2FsTmFtZSwgbWV0YWRhdGFOcyk7DQotICAgICAgICBlbGVtZW50LnNldFRleHQobmFtZSk7DQotICAgICAgICANCi0gICAgICAgIGlmIChlbmRwb2ludE5hbWUgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIFN0cmluZyBhdHRyaWJ1dGVOYW1lID0NCi0gICAgICAgICAgICAgICAgU3VibWlzc2lvbi5XU0FfTkFNRVNQQUNFLmVxdWFscyhuYW1lc3BhY2UpID8NCi0gICAgICAgICAgICAgICAgICAgICAgICBTdWJtaXNzaW9uLldTQV9TRVJWSUNFX05BTUVfRU5EUE9JTlRfTkFNRSA6IEZpbmFsLldTQV9TRVJWSUNFX05BTUVfRU5EUE9JTlRfTkFNRTsNCi0gICAgICAgICAgICBlbGVtZW50LmFkZEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lLCBlbmRwb2ludE5hbWUsIG51bGwpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGVsZW1lbnQ7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gZXh0cmFjdCBtZXRhZGF0YSBmcm9tIHRoZSBTZXJ2aWNlTmFtZSBlbGVtZW50Lg0KLSAgICAgKiANCi0gICAgICogPHA+DQotICAgICAqICZsdDt3c2FtOlNlcnZpY2VOYW1lIHhtbG5zOndzYW09Imh0dHA6Ly93d3cudzMub3JnLzIwMDcvMDUvYWRkcmVzc2luZy9tZXRhZGF0YSIgRW5kcG9pbnROYW1lPSIuLi4iJmd0Oy4uLiZsdDsvd3NhbTpTZXJ2aWNlTmFtZSZndDsNCi0gICAgICogPC9wPg0KLSAgICAgKiA8cD5vcjwvcD4NCi0gICAgICogPHA+DQotICAgICAqICZsdDt3c2E6U2VydmljZU5hbWUgeG1sbnM6d3NhPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA4L2FkZHJlc3NpbmciIFBvcnROYW1lPSIuLi4iJmd0Oy4uLiZsdDsvd3NhOlNlcnZpY2VOYW1lJmd0Ow0KLSAgICAgKiA8L3A+DQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gb21FbGVtZW50IHRoZSA8Y29kZT5PTUVsZW1lbnQ8L2NvZGU+IHRoYXQgaG9sZHMgdGhlIG1ldGFkYXRhLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgZnJvbU9NKE9NRWxlbWVudCBvbUVsZW1lbnQpIHRocm93cyBBeGlzRmF1bHQgew0KLSAgICAgICAgUU5hbWUgcW5hbWUgPSBvbUVsZW1lbnQuZ2V0UU5hbWUoKTsNCi0gICAgICAgIFN0cmluZyBhdHRyaWJ1dGVOYW1lID0gbnVsbDsNCi0gICAgICAgIGlmICh3c2FtUU5hbWUuZXF1YWxzKHFuYW1lKSB8fCB3c2F3UU5hbWUuZXF1YWxzKHFuYW1lKSkgew0KLSAgICAgICAgICAgIGF0dHJpYnV0ZU5hbWUgPSBGaW5hbC5XU0FfU0VSVklDRV9OQU1FX0VORFBPSU5UX05BTUU7DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmIChzdWJRTmFtZS5lcXVhbHMocW5hbWUpKSB7DQotICAgICAgICAgICAgYXR0cmlidXRlTmFtZSA9IFN1Ym1pc3Npb24uV1NBX1NFUlZJQ0VfTkFNRV9FTkRQT0lOVF9OQU1FOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiVW5yZWNvZ25pemVkIGVsZW1lbnQuIik7DQotICAgICAgICB9DQotDQotICAgICAgICBuYW1lID0gb21FbGVtZW50LmdldFRleHRBc1FOYW1lKCk7DQotICAgICAgICBlbmRwb2ludE5hbWUgPSBvbUVsZW1lbnQuZ2V0QXR0cmlidXRlVmFsdWUobmV3IFFOYW1lKGF0dHJpYnV0ZU5hbWUpKTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFN0YXRpYyBtZXRob2QgdG8gdGVzdCB3aGV0aGVyIGFuIDxjb2RlPk9NRWxlbWVudDwvY29kZT4gaXMgcmVjb2duaXplZA0KLSAgICAgKiBhcyBhIFNlcnZpY2VOYW1lIGVsZW1lbnQuIElmIHRoaXMgbWV0aG9kIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gdGhlbg0KLSAgICAgKiB7QGxpbmsgI2Zyb21PTShPTUVsZW1lbnQpfSBpcyBndWFyYW50ZWVkIG5vdCB0byBmYWlsLg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIG9tRWxlbWVudCB0aGUgPGNvZGU+T01FbGVtZW50PC9jb2RlPiB0byB0ZXN0Lg0KLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBlbGVtZW50IGlzIGEgU2VydmljZU5hbWUgZWxlbWVudCwNCi0gICAgICogPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4NCi0gICAgICovDQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1NlcnZpY2VOYW1lRWxlbWVudChPTUVsZW1lbnQgb21FbGVtZW50KSB7DQotICAgICAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOw0KLSAgICAgICAgUU5hbWUgcW5hbWUgPSBvbUVsZW1lbnQuZ2V0UU5hbWUoKTsNCi0gICAgICAgIA0KLSAgICAgICAgaWYgKHdzYW1RTmFtZS5lcXVhbHMocW5hbWUpIHx8IHdzYXdRTmFtZS5lcXVhbHMocW5hbWUpIHx8IHN1YlFOYW1lLmVxdWFscyhxbmFtZSkpDQotICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTsNCi0gICAgICAgIA0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvYWRkcmVzc2luZy9tZXRhZGF0YS9XU0RMTG9jYXRpb24uamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9hZGRyZXNzaW5nL21ldGFkYXRhL1dTRExMb2NhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWNkMmQxLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9hZGRyZXNzaW5nL21ldGFkYXRhL1dTRExMb2NhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5tZXRhZGF0YTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUF0dHJpYnV0ZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01OYW1lc3BhY2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0Ow0KLQ0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOw0KLQ0KLXB1YmxpYyBjbGFzcyBXU0RMTG9jYXRpb24gew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBRTmFtZSBXU0RMSSA9IG5ldyBRTmFtZSgiaHR0cDovL3d3dy53My5vcmcvMjAwNi8wMS93c2RsLWluc3RhbmNlIiwgIndzZGxMb2NhdGlvbiIsICJ3c2RsaSIpOw0KLSAgICANCi0gICAgcHJpdmF0ZSBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlOw0KLSAgICBwcml2YXRlIFN0cmluZyB3c2RsVVJMOw0KLSAgICANCi0gICAgcHVibGljIFdTRExMb2NhdGlvbigpIHsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIFdTRExMb2NhdGlvbihTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlLCBTdHJpbmcgd3NkbFVSTCkgew0KLSAgICAgICAgdGhpcy50YXJnZXROYW1lc3BhY2UgPSB0YXJnZXROYW1lc3BhY2U7DQotICAgICAgICB0aGlzLndzZGxVUkwgPSB3c2RsVVJMOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRhcmdldE5hbWVzcGFjZSgpIHsNCi0gICAgICAgIHJldHVybiB0YXJnZXROYW1lc3BhY2U7DQotICAgIH0NCi0gICAgcHVibGljIHZvaWQgc2V0VGFyZ2V0TmFtZXNwYWNlKFN0cmluZyB0YXJnZXROYW1lc3BhY2UpIHsNCi0gICAgICAgIHRoaXMudGFyZ2V0TmFtZXNwYWNlID0gdGFyZ2V0TmFtZXNwYWNlOw0KLSAgICB9DQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb24oKSB7DQotICAgICAgICByZXR1cm4gd3NkbFVSTDsNCi0gICAgfQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRMb2NhdGlvbihTdHJpbmcgd3NkbFVSTCkgew0KLSAgICAgICAgdGhpcy53c2RsVVJMID0gd3NkbFVSTDsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBjb252ZXJ0IGFuIG9iamVjdCBvZiB0aGlzIHR5cGUgdG8gYW4gPGNvZGU+T01BdHRyaWJ1dGU8L2NvZGU+DQotICAgICAqIEBwYXJhbSBmYWN0b3J5IDxjb2RlPk9NRmFjdG9yeTwvY29kZT4gdG8gdXNlIHdoZW4gZ2VuZXJhdGluZyA8Y29kZT5PTUVsZW1lbnQ8L2NvZGU+cw0KLSAgICAgKiANCi0gICAgICogQHJldHVybiBhbiA8Y29kZT5PTUF0dHJpYnV0ZTwvY29kZT4gdGhhdCBjYW4gYmUgYWRkZWQgdG8gYW4gPGNvZGU+RW5kcG9pbnRSZWZlcmVuY2U8L2NvZGU+DQotICAgICAqLw0KLSAgICBwdWJsaWMgT01BdHRyaWJ1dGUgdG9PTShPTUZhY3RvcnkgZmFjdG9yeSkgew0KLSAgICAgICAgU3RyaW5nIHZhbHVlID0gbmV3IFN0cmluZ0J1ZmZlcih0YXJnZXROYW1lc3BhY2UpLmFwcGVuZCgiICIpLmFwcGVuZCh3c2RsVVJMKS50b1N0cmluZygpOw0KLSAgICAgICAgT01OYW1lc3BhY2Ugd3NkbGlOcyA9IGZhY3RvcnkuY3JlYXRlT01OYW1lc3BhY2UoV1NETEkuZ2V0TmFtZXNwYWNlVVJJKCksIFdTRExJLmdldFByZWZpeCgpKTsNCi0gICAgICAgIE9NQXR0cmlidXRlIG9tQXR0cmlidXRlID0gZmFjdG9yeS5jcmVhdGVPTUF0dHJpYnV0ZShXU0RMSS5nZXRMb2NhbFBhcnQoKSwgd3NkbGlOcywgdmFsdWUpOw0KLSAgICAgICAgDQotICAgICAgICByZXR1cm4gb21BdHRyaWJ1dGU7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIGNvbnZlcnRpbmcgYW4gT01BdHRyaWJ1dGUgdG8gYW4gaW5zdGFuY2Ugb2YgdGhpcyB0eXBlLg0KLSAgICAgKiA8cD4NCi0gICAgICogJmx0Oy4uLiB4bWxuczp3c2RsaT0iaHR0cDovL3d3dy53My5vcmcvMjAwNi8wMS93c2RsLWluc3RhbmNlIiB3c2RsaTp3c2RsTG9jYXRpb249InRhcmdldE5hbWVzcGFjZSB3c2RsVVJMIiAuLi4mZ3QNCi0gICAgICogPC9wPg0KLSAgICAgKiBAcGFyYW0gb21BdHRyaWJ1dGUgdGhlIDxjb2RlPk9NQXR0cmlidXRlPC9jb2RlPiB0aGF0IGhvbGRzIHRoZSB3c2RsIGxvY2F0aW9uLg0KLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdA0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgZnJvbU9NKE9NQXR0cmlidXRlIG9tQXR0cmlidXRlKSB0aHJvd3MgQXhpc0ZhdWx0IHsNCi0gICAgICAgIFFOYW1lIHFuYW1lID0gb21BdHRyaWJ1dGUuZ2V0UU5hbWUoKTsNCi0gICAgICAgIGlmIChXU0RMSS5lcXVhbHMocW5hbWUpKSB7DQotICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBvbUF0dHJpYnV0ZS5nZXRBdHRyaWJ1dGVWYWx1ZSgpLnRyaW0oKTsNCi0gICAgICAgICAgIFN0cmluZ1tdIHZhbHVlcyA9IHZhbHVlLnNwbGl0KCJcXHMiLCAyKTsNCi0gICAgICAgICAgIA0KLSAgICAgICAgICAgLy9Eb24ndCBzZXQgYW55IHZhbHVlcyBpZiBzcGxpdCBkb2Vzbid0DQotICAgICAgICAgICAvL2dpdmUgdXMgdGhlIGNvcnJlY3QgbnVtYmVyIG9mIGVsZW1lbnRzLg0KLSAgICAgICAgICAgaWYgKHZhbHVlcy5sZW5ndGggIT0gMikNCi0gICAgICAgICAgICAgICByZXR1cm47DQotICAgICAgICAgICANCi0gICAgICAgICAgIHRhcmdldE5hbWVzcGFjZSA9IHZhbHVlc1swXTsNCi0gICAgICAgICAgIHdzZGxVUkwgPSB2YWx1ZXNbMV07DQotICAgICAgICB9DQotICAgICAgICBlbHNlIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJVbnJlY29nbml6ZWQgZWxlbWVudC4iKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICANCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBTdGF0aWMgbWV0aG9kIHRvIHRlc3Qgd2hldGhlciBhbiA8Y29kZT5PTUVsZW1lbnQ8L2NvZGU+IGlzIHJlY29nbml6ZWQNCi0gICAgICogYXMgYSBTZXJ2aWNlTmFtZSBlbGVtZW50LiBJZiB0aGlzIG1ldGhvZCByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IHRoZW4NCi0gICAgICoge0BsaW5rICNmcm9tT00oT01BdHRyaWJ1dGUpfSBpcyBndWFyYW50ZWVkIG5vdCB0byB0aHJvdyBhbiBleGNlcHRpb24uDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gb21BdHRyaWJ1dGUgdGhlIDxjb2RlPk9NRWxlbWVudDwvY29kZT4gdG8gdGVzdC4NCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZWxlbWVudCBpcyBhIFNlcnZpY2VOYW1lIGVsZW1lbnQsDQotICAgICAqIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNXU0RMTG9jYXRpb25BdHRyaWJ1dGUoT01BdHRyaWJ1dGUgb21BdHRyaWJ1dGUpIHsNCi0gICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7DQotICAgICAgICBRTmFtZSBxbmFtZSA9IG9tQXR0cmlidXRlLmdldFFOYW1lKCk7DQotICAgICAgICANCi0gICAgICAgIGlmIChXU0RMSS5lcXVhbHMocW5hbWUpKQ0KLSAgICAgICAgICAgIHJlc3VsdCA9IHRydWU7DQotICAgICAgICANCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2FkZHJlc3Npbmcvd3NkbC9XU0RMMTFBY3Rpb25IZWxwZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9hZGRyZXNzaW5nL3dzZGwvV1NETDExQWN0aW9uSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5NjkwOGEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2FkZHJlc3Npbmcvd3NkbC9XU0RMMTFBY3Rpb25IZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy53c2RsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkFkZHJlc3NpbmdDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5GYXVsdDsKLWltcG9ydCBqYXZheC53c2RsLklucHV0OwotaW1wb3J0IGphdmF4LndzZGwuT3BlcmF0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuT3V0cHV0OwotaW1wb3J0IGphdmF4LndzZGwuUG9ydFR5cGU7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLkF0dHJpYnV0ZUV4dGVuc2libGU7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBUaGUgV1NETDExQWN0aW9uSGVscGVyIHByb3ZpZGVzIDMgc3RhdGljIG1ldGhvZHMgdG8gZGV0ZXJtaW5lIHRoZSBjb3JyZWN0IHdzYTpBY3Rpb24gdmFsdWUgZnJvbQotICogYSB3c2RsNGogSW5wdXQvT3V0cHV0L0ZhdWx0IG9iamVjdC4gSXQgZmlyc3QgYXR0ZW1wdHMgdG8gYWNjZXNzIHRoZSB3c2F3OkFjdGlvbiBhdHRyaWJ1dGUgYW5kIGlmCi0gKiB0aGF0IGlzIG5vdCBmb3VuZCB1c2VzIHRoZSBXU0RMMTFEZWZhdWx0QWN0aW9uUGF0dGVybkhlbHBlciB0byBnZW5lcmF0ZSBhbmQgQWN0aW9uIGJhc2VkIG9uIHRoZQotICogRGVmYXVsdCBBY3Rpb24gUGF0dGVybiBmb3IgV1NETDEuMSBhdCBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDA2L1dELXdzLWFkZHItd3NkbC0yMDA2MDIxNi8jZGVmYWN0aW9ud3NkbDExCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0RMMTFBY3Rpb25IZWxwZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFdTREwxMUFjdGlvbkhlbHBlci5jbGFzcyk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUU5hbWUgc3VibWlzc2lvbldTQVdOUyA9Ci0gICAgICAgICAgICBuZXcgUU5hbWUoQWRkcmVzc2luZ0NvbnN0YW50cy5TdWJtaXNzaW9uLldTQV9OQU1FU1BBQ0UsIEFkZHJlc3NpbmdDb25zdGFudHMuV1NBX0FDVElPTik7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUU5hbWUgZmluYWxXU0FOUyA9Ci0gICAgICAgICAgICBuZXcgUU5hbWUoQWRkcmVzc2luZ0NvbnN0YW50cy5GaW5hbC5XU0FfTkFNRVNQQUNFLCBBZGRyZXNzaW5nQ29uc3RhbnRzLldTQV9BQ1RJT04pOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFFOYW1lIGZpbmFsV1NBV05TID0KLSAgICAgICAgICAgIG5ldyBRTmFtZShBZGRyZXNzaW5nQ29uc3RhbnRzLkZpbmFsLldTQVdfTkFNRVNQQUNFLCBBZGRyZXNzaW5nQ29uc3RhbnRzLldTQV9BQ1RJT04pOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFFOYW1lIGZpbmFsV1NBTU5TID0KLSAgICAgICAgbmV3IFFOYW1lKEFkZHJlc3NpbmdDb25zdGFudHMuRmluYWwuV1NBTV9OQU1FU1BBQ0UsIEFkZHJlc3NpbmdDb25zdGFudHMuV1NBX0FDVElPTik7Ci0KLSAgICAvKioKLSAgICAgKiBnZXRBY3Rpb25Gcm9tSW5wdXRFbGVtZW50Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gZGVmICAgICAgICAgICAgdGhlIHdzZGw6ZGVmaW5pdGlvbnMgd2hpY2ggY29udGFpbnMgdGhlIHdzZGw6cG9ydFR5cGUKLSAgICAgKiBAcGFyYW0gd3NkbDRqUG9ydFR5cGUgdGhlIHdzZGw6cG9ydFR5cGUgd2hpY2ggY29udGFpbnMgdGhlIHdzZGw6b3BlcmF0aW9uCi0gICAgICogQHBhcmFtIG9wICAgICAgICAgICAgIHRoZSB3c2RsOm9wZXJhdGlvbiB3aGljaCBjb250YWlucyB0aGUgaW5wdXQgZWxlbWVudAotICAgICAqIEBwYXJhbSBpbnB1dCAgICAgICAgICB0aGUgaW5wdXQgZWxlbWVudCB0byBiZSBleGFtaW5lZCB0byBnZW5lcmF0ZSB0aGUgd3NhOkFjdGlvbgotICAgICAqIEByZXR1cm4gZWl0aGVyIHRoZSB3c2F3OkFjdGlvbiBmcm9tIHRoZSBpbnB1dCBlbGVtZW50IG9yIGFuIGFjdGlvbiBnZW5lcmF0ZWQgdXNpbmcgdGhlIERlZmF1bHRBY3Rpb25QYXR0ZXJuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QWN0aW9uRnJvbUlucHV0RWxlbWVudChEZWZpbml0aW9uIGRlZiwgUG9ydFR5cGUgd3NkbDRqUG9ydFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYXRpb24gb3AsIElucHV0IGlucHV0KSB7Ci0gICAgICAgIFN0cmluZyByZXN1bHQgPSBnZXRXU0FXQWN0aW9uRXh0ZW5zaW9uQXR0cmlidXRlKGlucHV0KTsKLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBXU0RMMTFEZWZhdWx0QWN0aW9uUGF0dGVybkhlbHBlcgotICAgICAgICAgICAgICAgICAgICAuZ2VuZXJhdGVBY3Rpb25Gcm9tSW5wdXRFbGVtZW50KGRlZiwgd3NkbDRqUG9ydFR5cGUsIG9wLCBpbnB1dCk7Ci0gICAgICAgIH0KLSAgICAgICAgbG9nLnRyYWNlKHJlc3VsdCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogZ2V0QWN0aW9uRnJvbU91dHB1dEVsZW1lbnQKLSAgICAgKgotICAgICAqIEBwYXJhbSBkZWYgICAgICAgICAgICB0aGUgd3NkbDpkZWZpbml0aW9ucyB3aGljaCBjb250YWlucyB0aGUgd3NkbDpwb3J0VHlwZQotICAgICAqIEBwYXJhbSB3c2RsNGpQb3J0VHlwZSB0aGUgd3NkbDpwb3J0VHlwZSB3aGljaCBjb250YWlucyB0aGUgd3NkbDpvcGVyYXRpb24KLSAgICAgKiBAcGFyYW0gb3AgICAgICAgICAgICAgdGhlIHdzZGw6b3BlcmF0aW9uIHdoaWNoIGNvbnRhaW5zIHRoZSBvdXRwdXQgZWxlbWVudAotICAgICAqIEBwYXJhbSBvdXRwdXQgICAgICAgICB0aGUgaW5wdXQgZWxlbWVudCB0byBiZSBleGFtaW5lZCB0byBnZW5lcmF0ZSB0aGUgd3NhOkFjdGlvbgotICAgICAqIEByZXR1cm4gZWl0aGVyIHRoZSB3c2F3OkFjdGlvbiBmcm9tIHRoZSBvdXRwdXQgZWxlbWVudCBvciBhbiBhY3Rpb24gZ2VuZXJhdGVkIHVzaW5nIHRoZSBEZWZhdWx0QWN0aW9uUGF0dGVybgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEFjdGlvbkZyb21PdXRwdXRFbGVtZW50KERlZmluaXRpb24gZGVmLCBQb3J0VHlwZSB3c2RsNGpQb3J0VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYXRpb24gb3AsIE91dHB1dCBvdXRwdXQpIHsKLSAgICAgICAgU3RyaW5nIHJlc3VsdCA9IGdldFdTQVdBY3Rpb25FeHRlbnNpb25BdHRyaWJ1dGUob3V0cHV0KTsKLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBXU0RMMTFEZWZhdWx0QWN0aW9uUGF0dGVybkhlbHBlcgotICAgICAgICAgICAgICAgICAgICAuZ2VuZXJhdGVBY3Rpb25Gcm9tT3V0cHV0RWxlbWVudChkZWYsIHdzZGw0alBvcnRUeXBlLCBvcCwgb3V0cHV0KTsKLSAgICAgICAgfQotICAgICAgICBsb2cudHJhY2UocmVzdWx0KTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBnZXRBY3Rpb25Gcm9tRmF1bHRFbGVtZW50Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gZGVmICAgICAgICAgICAgdGhlIHdzZGw6ZGVmaW5pdGlvbnMgd2hpY2ggY29udGFpbnMgdGhlIHdzZGw6cG9ydFR5cGUKLSAgICAgKiBAcGFyYW0gd3NkbDRqUG9ydFR5cGUgdGhlIHdzZGw6cG9ydFR5cGUgd2hpY2ggY29udGFpbnMgdGhlIHdzZGw6b3BlcmF0aW9uCi0gICAgICogQHBhcmFtIG9wICAgICAgICAgICAgIHRoZSB3c2RsOm9wZXJhdGlvbiB3aGljaCBjb250YWlucyB0aGUgZmF1bHQgZWxlbWVudAotICAgICAqIEBwYXJhbSBmYXVsdCAgICAgICAgICB0aGUgZmF1bHQgZWxlbWVudCB0byBiZSBleGFtaW5lZCB0byBnZW5lcmF0ZSB0aGUgd3NhOkFjdGlvbgotICAgICAqIEByZXR1cm4gZWl0aGVyIHRoZSB3c2F3OkFjdGlvbiBmcm9tIHRoZSBmYXVsdCBlbGVtZW50IG9yIGFuIGFjdGlvbiBnZW5lcmF0ZWQgdXNpbmcgdGhlIERlZmF1bHRBY3Rpb25QYXR0ZXJuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QWN0aW9uRnJvbUZhdWx0RWxlbWVudChEZWZpbml0aW9uIGRlZiwgUG9ydFR5cGUgd3NkbDRqUG9ydFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYXRpb24gb3AsIEZhdWx0IGZhdWx0KSB7Ci0gICAgICAgIFN0cmluZyByZXN1bHQgPSBnZXRXU0FXQWN0aW9uRXh0ZW5zaW9uQXR0cmlidXRlKGZhdWx0KTsKLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBXU0RMMTFEZWZhdWx0QWN0aW9uUGF0dGVybkhlbHBlcgotICAgICAgICAgICAgICAgICAgICAuZ2VuZXJhdGVBY3Rpb25Gcm9tRmF1bHRFbGVtZW50KGRlZiwgd3NkbDRqUG9ydFR5cGUsIG9wLCBmYXVsdCk7Ci0gICAgICAgIH0KLSAgICAgICAgbG9nLnRyYWNlKHJlc3VsdCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFdTQVdBY3Rpb25FeHRlbnNpb25BdHRyaWJ1dGUoQXR0cmlidXRlRXh0ZW5zaWJsZSBhZSkgewotICAgICAgICAvLyBTZWFyY2ggZmlyc3QgZm9yIGEgd3NhdzpBY3Rpb24gdXNpbmcgdGhlIHN1Ym1pc3Npb24gbmFtZXNwYWNlCi0gICAgICAgIE9iamVjdCBhdHRyaWJ1dGUgPSBhZS5nZXRFeHRlbnNpb25BdHRyaWJ1dGUoc3VibWlzc2lvbldTQVdOUyk7Ci0gICAgICAgIC8vIFRoZW4gaWYgdGhhdCBkaWQgbm90IGV4aXN0IG9uZSB1c2luZyB0aGUgdzNjIFdTQU0gbmFtZXNwYWNlCi0gICAgICAgIGlmIChhdHRyaWJ1dGUgPT0gbnVsbCkgewotICAgICAgICAgICAgYXR0cmlidXRlID0gYWUuZ2V0RXh0ZW5zaW9uQXR0cmlidXRlKGZpbmFsV1NBTU5TKTsKLSAgICAgICAgfQotICAgICAgICAvLyBUaGVuIGlmIHRoYXQgZGlkIG5vdCBleGlzdCBvbmUgdXNpbmcgdGhlIHczYyBXU0FXIG5hbWVzcGFjZQotICAgICAgICAvLyAoZm9yIGJhY2t3YXJkcyBjb21wYXQgcmVhc29ucykKLSAgICAgICAgaWYgKGF0dHJpYnV0ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBhdHRyaWJ1dGUgPSBhZS5nZXRFeHRlbnNpb25BdHRyaWJ1dGUoZmluYWxXU0FXTlMpOwotICAgICAgICB9Ci0gICAgICAgIC8vIFRoZW4gZmluYWxseSBpZiB0aGF0IGRpZCBub3QgZXhpc3QsIHRyeSB0aGUgMjAwNS8wOCBOUwotICAgICAgICAvLyAoSW5jbHVkZWQgaGVyZSBiZWNhdXNlIGl0J3MgbmVlZGVkIGZvciBBcGFjaGUgTXVzZSkKLSAgICAgICAgaWYgKGF0dHJpYnV0ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBhdHRyaWJ1dGUgPSBhZS5nZXRFeHRlbnNpb25BdHRyaWJ1dGUoZmluYWxXU0FOUyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyB3c2RsNGogbWF5IHJldHVybiBhIFN0cmluZywgUU5hbWUgb3IgYSBMaXN0IG9mIGVpdGhlcgotICAgICAgICAvLyBJZiBpdCBpcyBhIGxpc3QsIGV4dHJhY3QgdGhlIGZpcnN0IGVsZW1lbnQKLSAgICAgICAgaWYgKGF0dHJpYnV0ZSBpbnN0YW5jZW9mIExpc3QpIHsKLSAgICAgICAgICAgIExpc3QgbCA9IChMaXN0KSBhdHRyaWJ1dGU7Ci0gICAgICAgICAgICBpZiAobC5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgYXR0cmlidXRlID0gbC5nZXQoMCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBhdHRyaWJ1dGUgbXVzdCBub3cgYmUgYSBRTmFtZSBvciBTdHJpbmcgb3IgbnVsbAotICAgICAgICAvLyBJZiBpdCBpcyBhIFFOYW1lLCB0YWtlIHRoZSBMb2NhbFBhcnQgYXMgYSBTdHJpbmcKLSAgICAgICAgaWYgKGF0dHJpYnV0ZSBpbnN0YW5jZW9mIFFOYW1lKSB7Ci0gICAgICAgICAgICBRTmFtZSBxbiA9IChRTmFtZSkgYXR0cmlidXRlOwotICAgICAgICAgICAgYXR0cmlidXRlID0gcW4uZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoKGF0dHJpYnV0ZSBpbnN0YW5jZW9mIFN0cmluZykpIHsKLSAgICAgICAgICAgIFN0cmluZyByZXN1bHQgPSAoU3RyaW5nKSBhdHRyaWJ1dGU7Ci0gICAgICAgICAgICBsb2cudHJhY2UocmVzdWx0KTsKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cudHJhY2UoIk5vIHdzYXc6QWN0aW9uIGF0dHJpYnV0ZSBmb3VuZCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRJbnB1dEFjdGlvbkZyb21TdHJpbmdJbmZvcm1hdGlvbihTdHJpbmcgbWVzc2FnZUV4Y2hhbmdlUGF0dGVybiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwb3J0VHlwZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG9wZXJhdGlvbk5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGlucHV0TmFtZSkgewotICAgICAgICByZXR1cm4gV1NETDExRGVmYXVsdEFjdGlvblBhdHRlcm5IZWxwZXIuZ2V0SW5wdXRBY3Rpb25Gcm9tU3RyaW5nSW5mb3JtYXRpb24oCi0gICAgICAgICAgICAgICAgbWVzc2FnZUV4Y2hhbmdlUGF0dGVybiwgdGFyZ2V0TmFtZXNwYWNlLCBwb3J0VHlwZU5hbWUsIG9wZXJhdGlvbk5hbWUsIGlucHV0TmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0T3V0cHV0QWN0aW9uRnJvbVN0cmluZ0luZm9ybWF0aW9uKFN0cmluZyBtZXNzYWdlRXhjaGFuZ2VQYXR0ZXJuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcG9ydFR5cGVOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgb3BlcmF0aW9uTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG91dHB1dE5hbWUpIHsKLSAgICAgICAgcmV0dXJuIFdTREwxMURlZmF1bHRBY3Rpb25QYXR0ZXJuSGVscGVyLmdldE91dHB1dEFjdGlvbkZyb21TdHJpbmdJbmZvcm1hdGlvbigKLSAgICAgICAgICAgICAgICBtZXNzYWdlRXhjaGFuZ2VQYXR0ZXJuLCB0YXJnZXROYW1lc3BhY2UsIHBvcnRUeXBlTmFtZSwgb3BlcmF0aW9uTmFtZSwgb3V0cHV0TmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RmF1bHRBY3Rpb25Gcm9tU3RyaW5nSW5mb3JtYXRpb24oU3RyaW5nIHRhcmdldE5hbWVzcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcG9ydFR5cGVOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBvcGVyYXRpb25OYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBmYXVsdE5hbWUpIHsKLSAgICAgICAgcmV0dXJuIFdTREwxMURlZmF1bHRBY3Rpb25QYXR0ZXJuSGVscGVyLmdldEZhdWx0QWN0aW9uRnJvbVN0cmluZ0luZm9ybWF0aW9uKHRhcmdldE5hbWVzcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnRUeXBlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbk5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYXVsdE5hbWUpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2FkZHJlc3Npbmcvd3NkbC9XU0RMMTFEZWZhdWx0QWN0aW9uUGF0dGVybkhlbHBlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2FkZHJlc3Npbmcvd3NkbC9XU0RMMTFEZWZhdWx0QWN0aW9uUGF0dGVybkhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDcyZDI5Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9hZGRyZXNzaW5nL3dzZGwvV1NETDExRGVmYXVsdEFjdGlvblBhdHRlcm5IZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy53c2RsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5GYXVsdDsKLWltcG9ydCBqYXZheC53c2RsLklucHV0OwotaW1wb3J0IGphdmF4LndzZGwuT3BlcmF0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuT3BlcmF0aW9uVHlwZTsKLWltcG9ydCBqYXZheC53c2RsLk91dHB1dDsKLWltcG9ydCBqYXZheC53c2RsLlBvcnRUeXBlOwotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHdzYTpBY3Rpb24gdmFsdWUgdXNpbmcgdGhlIERlZmF1bHQgQWN0aW9uIFBhdHRlcm4gZGVmaW5lZCBhdAotICogaHR0cDovL3d3dy53My5vcmcvVFIvMjAwNi9XRC13cy1hZGRyLXdzZGwtMjAwNjAyMTYvI2RlZmFjdGlvbndzZGwxMQotICovCi1wdWJsaWMgY2xhc3MgV1NETDExRGVmYXVsdEFjdGlvblBhdHRlcm5IZWxwZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFdTREwxMURlZmF1bHRBY3Rpb25QYXR0ZXJuSGVscGVyLmNsYXNzKTsKLQotICAgIC8vIFN0cmluZyBjb25zdGFudHMgdXNlZCBleHRlbnNpdmVseSBpbiB0aGlzIGNsYXNzCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTiA9ICJ1cm4iOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTTEFTSCA9ICIvIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MT04gPSAiOiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUVVFU1QgPSAiUmVxdWVzdCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU1BPTlNFID0gIlJlc3BvbnNlIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09MSUNJVCA9ICJTb2xpY2l0IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFVTFQgPSAiRmF1bHQiOwotCi0gICAgLyoqCi0gICAgICogR2VuZXJhdGUgdGhlIEFjdGlvbiBmb3IgYW4gSW5wdXQgdXNpbmcgdGhlIERlZmF1bHQgQWN0aW9uIFBhdHRlcm4KLSAgICAgKiA8cC8+Ci0gICAgICogUGF0dGVybiBpcyBkZWZpbmVkIGFzIFt0YXJnZXQgbmFtZXNwYWNlXVtkZWxpbWl0ZXJdW3BvcnQgdHlwZSBuYW1lXVtkZWxpbWl0ZXJdW2lucHV0IG5hbWVdCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZGVmICAgICAgICAgICAgaXMgcmVxdWlyZWQgdG8gb2J0YWluIHRoZSB0YXJnZXROYW1lc3BhY2UKLSAgICAgKiBAcGFyYW0gd3NkbDRqUG9ydFR5cGUgaXMgcmVxdWlyZWQgdG8gb2J0YWluIHRoZSBwb3J0VHlwZSBuYW1lCi0gICAgICogQHBhcmFtIG9wICAgICAgICAgICAgIGlzIHJlcXVpcmVkIHRvIGdlbmVyYXRlIHRoZSBpbnB1dCBuYW1lIGlmIG5vdCBleHBsaWNpdGx5IHNwZWNpZmllZAotICAgICAqIEBwYXJhbSBpbnB1dCAgICAgICAgICBpcyByZXF1aXJlZCBmb3IgaXRzIG5hbWUgaWYgc3BlY2lmaWVkCi0gICAgICogQHJldHVybiBhIHdzYTpBY3Rpb24gdmFsdWUgYmFzZWQgb24gdGhlIERlZmF1bHQgQWN0aW9uIFBhdHRlcm4gYW5kIHRoZSBwcm92aWRlZCBvYmplY3RzCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2VuZXJhdGVBY3Rpb25Gcm9tSW5wdXRFbGVtZW50KERlZmluaXRpb24gZGVmLCBQb3J0VHlwZSB3c2RsNGpQb3J0VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmF0aW9uIG9wLCBJbnB1dCBpbnB1dCkgewotICAgICAgICAvLyBHZXQgdGhlIHRhcmdldE5hbWVzcGFjZSBvZiB0aGUgd3NkbDpkZWZpbml0aW9ucwotICAgICAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0gZGVmLmdldFRhcmdldE5hbWVzcGFjZSgpOwotCi0gICAgICAgIC8vIERldGVybWluZSB0aGUgZGVsaW1pdGVyLiBQZXIgdGhlIHNwZWM6ICdpcyAiOiIgd2hlbiB0aGUgW3RhcmdldCBuYW1lc3BhY2VdIGlzIGEgVVJOLCBvdGhlcndpc2UgIi8iLiAKLSAgICAgICAgLy8gTm90ZSB0aGF0IGZvciBJUkkgc2NoZW1lcyBvdGhlciB0aGFuIFVSTnMgd2hpY2ggYXJlbid0IHBhdGgtYmFzZWQgKGkuZS4gdGhvc2UgdGhhdCBvdXRsYXcgdGhlICIvIiAKLSAgICAgICAgLy8gY2hhcmFjdGVyKSwgdGhlIGRlZmF1bHQgYWN0aW9uIHZhbHVlIG1heSBub3QgY29uZm9ybSB0byB0aGUgcnVsZXMgb2YgdGhlIElSSSBzY2hlbWUuIEF1dGhvcnMKLSAgICAgICAgLy8gYXJlIGFkdmlzZWQgdG8gc3BlY2lmeSBleHBsaWNpdCB2YWx1ZXMgaW4gdGhlIFdTREwgaW4gdGhpcyBjYXNlLicKLSAgICAgICAgU3RyaW5nIGRlbGltaXRlciA9IFNMQVNIOwotICAgICAgICBpZiAodGFyZ2V0TmFtZXNwYWNlLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChVUk4pKSB7Ci0gICAgICAgICAgICBkZWxpbWl0ZXIgPSBDT0xPTjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEdldCB0aGUgcG9ydFR5cGUgbmFtZSAoYXMgYSBzdHJpbmcgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIGFjdGlvbikKLSAgICAgICAgU3RyaW5nIHBvcnRUeXBlTmFtZSA9IHdzZGw0alBvcnRUeXBlLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgIC8vIEdldCB0aGUgbmFtZSBvZiB0aGUgaW5wdXQgZWxlbWVudCAoYW5kIGdlbmVyYXRlIG9uZSBpZiBub25lIGV4cGxpY2l0bHkgc3BlY2lmaWVkKQotICAgICAgICBTdHJpbmcgaW5wdXROYW1lID0gZ2V0TmFtZUZyb21JbnB1dEVsZW1lbnQob3AsIGlucHV0KTsKLQotICAgICAgICAvLyBBcHBlbmQgdGhlIGJpdHMgdG9nZXRoZXIKLSAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBzYi5hcHBlbmQodGFyZ2V0TmFtZXNwYWNlKTsKLSAgICAgICAgLy8gRGVhbCB3aXRoIHRoZSBwcm9ibGVtIHRoYXQgdGhlIHRhcmdldE5hbWVzcGFjZSBtYXkgb3IgbWF5IG5vdCBoYXZlIGEgdHJhaWxpbmcgZGVsaW1pdGVyCi0gICAgICAgIGlmICghdGFyZ2V0TmFtZXNwYWNlLmVuZHNXaXRoKGRlbGltaXRlcikpIHsKLSAgICAgICAgICAgIHNiLmFwcGVuZChkZWxpbWl0ZXIpOwotICAgICAgICB9Ci0gICAgICAgIHNiLmFwcGVuZChwb3J0VHlwZU5hbWUpOwotICAgICAgICBzYi5hcHBlbmQoZGVsaW1pdGVyKTsKLSAgICAgICAgc2IuYXBwZW5kKGlucHV0TmFtZSk7Ci0KLSAgICAgICAgLy8gUmVzb2x2ZSB0aGUgYWN0aW9uIGZyb20gdGhlIFN0cmluZ0J1ZmZlcgotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gc2IudG9TdHJpbmcoKTsKLQotICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy50cmFjZSgiZ2VuZXJhdGVBY3Rpb25Gcm9tSW5wdXRFbGVtZW50IHJlc3VsdDogIiArIHJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgbmFtZSBvZiB0aGUgc3BlY2lmaWVkIElucHV0IGVsZW1lbnQgdXNpbmcgdGhlIHJ1bGVzIGRlZmluZWQgaW4gV1NETCAxLjEKLSAgICAgKiBTZWN0aW9uIDIuNC41IGh0dHA6Ly93d3cudzMub3JnL1RSL3dzZGwjX25hbWVzCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldE5hbWVGcm9tSW5wdXRFbGVtZW50KE9wZXJhdGlvbiBvcCwgSW5wdXQgaW5wdXQpIHsKLSAgICAgICAgLy8gR2V0IHRoZSBuYW1lIGZyb20gdGhlIGlucHV0IGVsZW1lbnQgaWYgc3BlY2lmaWVkLgotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gaW5wdXQuZ2V0TmFtZSgpOwotCi0gICAgICAgIC8vIElmIG5vdCB3ZSdsbCBoYXZlIHRvIGdlbmVyYXRlIGl0LgotICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIElmIFJlcXVlc3QtUmVzcG9uc2Ugb3IgU29saWNpdC1SZXNwb25zZSBkbyBzb21ldGhpbmcgc3BlY2lhbCBwZXIKLSAgICAgICAgICAgIC8vIFdTREwgMS4xIFNlY3Rpb24gMi40LjUKLSAgICAgICAgICAgIE9wZXJhdGlvblR5cGUgb3BlcmF0aW9uVHlwZSA9IG9wLmdldFN0eWxlKCk7Ci0gICAgICAgICAgICBpZiAobnVsbCAhPSBvcGVyYXRpb25UeXBlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG9wZXJhdGlvblR5cGUuZXF1YWxzKE9wZXJhdGlvblR5cGUuUkVRVUVTVF9SRVNQT05TRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gb3AuZ2V0TmFtZSgpICsgUkVRVUVTVDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG9wZXJhdGlvblR5cGUuZXF1YWxzKE9wZXJhdGlvblR5cGUuU09MSUNJVF9SRVNQT05TRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gb3AuZ2V0TmFtZSgpICsgUkVTUE9OU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSWYgdGhlIE9wZXJhdGlvblR5cGUgd2FzIG5vdCBhdmFpbGFibGUgZm9yIHNvbWUgcmVhc29uLCBhc3N1bWUgb24td2F5IG9yIG5vdGlmaWNhdGlvbgotICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gb3AuZ2V0TmFtZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgZ2V0SW5wdXRBY3Rpb25Gcm9tU3RyaW5nSW5mb3JtYXRpb24oU3RyaW5nIG1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcG9ydFR5cGVOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBvcGVyYXRpb25OYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBpbnB1dE5hbWUpIHsKLSAgICAJaWYgKG1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4gPT0gbnVsbCAmJiBpbnB1dE5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIk9uZSBvZiBtZXNzYWdlRXhjaGFuZ2VQYXR0ZXJuIG9yIGlucHV0TmFtZSBtdXN0IHRoZSBub24tbnVsbCB0byBnZW5lcmF0ZSBhbiBhY3Rpb24uIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBEZXRlcm1pbmUgdGhlIGRlbGltaXRlci4gUGVyIHRoZSBzcGVjOiAnaXMgIjoiIHdoZW4gdGhlIFt0YXJnZXQgbmFtZXNwYWNlXSBpcyBhIFVSTiwgb3RoZXJ3aXNlICIvIi4gCi0gICAgICAgIC8vIE5vdGUgdGhhdCBmb3IgSVJJIHNjaGVtZXMgb3RoZXIgdGhhbiBVUk5zIHdoaWNoIGFyZW4ndCBwYXRoLWJhc2VkIChpLmUuIHRob3NlIHRoYXQgb3V0bGF3IHRoZSAiLyIgCi0gICAgICAgIC8vIGNoYXJhY3RlciksIHRoZSBkZWZhdWx0IGFjdGlvbiB2YWx1ZSBtYXkgbm90IGNvbmZvcm0gdG8gdGhlIHJ1bGVzIG9mIHRoZSBJUkkgc2NoZW1lLiBBdXRob3JzCi0gICAgICAgIC8vIGFyZSBhZHZpc2VkIHRvIHNwZWNpZnkgZXhwbGljaXQgdmFsdWVzIGluIHRoZSBXU0RMIGluIHRoaXMgY2FzZS4nCi0gICAgICAgIFN0cmluZyBkZWxpbWl0ZXIgPSBTTEFTSDsKLSAgICAgICAgaWYgKHRhcmdldE5hbWVzcGFjZS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoVVJOKSkgewotICAgICAgICAgICAgZGVsaW1pdGVyID0gQ09MT047Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBOLkIuIFVubGlrZSBjb3JlIEF4aXMyIHByb2Nlc3NpbmcgV1NETCwgSkFYLVdTIGFjY290YXRpb24gcHJvY2Vzc2luZyBwYXNzZXMgaW4gdGhlCi0gICAgICAgIC8vIG91dC1pbiBNRVAgd2hlbiBjb25zdHJ1Y3RpbmcgdGhlIGNsaWVudCwgaGVuY2Ugd2UgbmVlZCB0byB0YWtlIGFjY291bnQgb2YgaXQgaGVyZQotICAgICAgICAvLyBpbiBhZGRpdGlvbiB0byB0aGUgZXhwZWN0ZWQgaW4tb3V0Ci0gICAgICAgIGlmIChpbnB1dE5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgaW5wdXROYW1lID0gb3BlcmF0aW9uTmFtZTsKLSAgICAgICAgICAgIGlmIChtZXNzYWdlRXhjaGFuZ2VQYXR0ZXJuLmluZGV4T2YoImluLW91dCIpID49IDApIHsKLSAgICAgICAgICAgICAgICBpbnB1dE5hbWUgKz0gUkVRVUVTVDsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobWVzc2FnZUV4Y2hhbmdlUGF0dGVybi5pbmRleE9mKCJvdXQtaW4iKSA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgaW5wdXROYW1lICs9IFJFU1BPTlNFOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQXBwZW5kIHRoZSBiaXRzIHRvZ2V0aGVyCi0gICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgc2IuYXBwZW5kKHRhcmdldE5hbWVzcGFjZSk7Ci0gICAgICAgIC8vIERlYWwgd2l0aCB0aGUgcHJvYmxlbSB0aGF0IHRoZSB0YXJnZXROYW1lc3BhY2UgbWF5IG9yIG1heSBub3QgaGF2ZSBhIHRyYWlsaW5nIGRlbGltaXRlcgotICAgICAgICBpZiAoIXRhcmdldE5hbWVzcGFjZS5lbmRzV2l0aChkZWxpbWl0ZXIpKSB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoZGVsaW1pdGVyKTsKLSAgICAgICAgfQotICAgICAgICBzYi5hcHBlbmQocG9ydFR5cGVOYW1lKTsKLSAgICAgICAgc2IuYXBwZW5kKGRlbGltaXRlcik7Ci0gICAgICAgIHNiLmFwcGVuZChpbnB1dE5hbWUpOwotCi0gICAgICAgIC8vIFJlc29sdmUgdGhlIGFjdGlvbiBmcm9tIHRoZSBTdHJpbmdCdWZmZXIKLSAgICAgICAgU3RyaW5nIHJlc3VsdCA9IHNiLnRvU3RyaW5nKCk7Ci0KLSAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cudHJhY2UoImdldElucHV0QWN0aW9uRnJvbVN0cmluZ0luZm9ybWF0aW9uIHJlc3VsdDogIiArIHJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdlbmVyYXRlIHRoZSBBY3Rpb24gZm9yIGFuIE91dHB1dCB1c2luZyB0aGUgRGVmYXVsdCBBY3Rpb24gUGF0dGVybgotICAgICAqIDxwLz4KLSAgICAgKiBQYXR0ZXJuIGlzIGRlZmluZWQgYXMgW3RhcmdldCBuYW1lc3BhY2VdW2RlbGltaXRlcl1bcG9ydCB0eXBlIG5hbWVdW2RlbGltaXRlcl1bb3V0cHV0IG5hbWVdCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZGVmICAgICAgICAgICAgaXMgcmVxdWlyZWQgdG8gb2J0YWluIHRoZSB0YXJnZXROYW1lc3BhY2UKLSAgICAgKiBAcGFyYW0gd3NkbDRqUG9ydFR5cGUgaXMgcmVxdWlyZWQgdG8gb2J0YWluIHRoZSBwb3J0VHlwZSBuYW1lCi0gICAgICogQHBhcmFtIG9wICAgICAgICAgICAgIGlzIHJlcXVpcmVkIHRvIGdlbmVyYXRlIHRoZSBvdXRwdXQgbmFtZSBpZiBub3QgZXhwbGljaXRseSBzcGVjaWZpZWQKLSAgICAgKiBAcGFyYW0gb3V0cHV0ICAgICAgICAgaXMgcmVxdWlyZWQgZm9yIGl0cyBuYW1lIGlmIHNwZWNpZmllZAotICAgICAqIEByZXR1cm4gYSB3c2E6QWN0aW9uIHZhbHVlIGJhc2VkIG9uIHRoZSBEZWZhdWx0IEFjdGlvbiBQYXR0ZXJuIGFuZCB0aGUgcHJvdmlkZWQgb2JqZWN0cwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdlbmVyYXRlQWN0aW9uRnJvbU91dHB1dEVsZW1lbnQoRGVmaW5pdGlvbiBkZWYsIFBvcnRUeXBlIHdzZGw0alBvcnRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmF0aW9uIG9wLCBPdXRwdXQgb3V0cHV0KSB7Ci0gICAgICAgIC8vIEdldCB0aGUgdGFyZ2V0TmFtZXNwYWNlIG9mIHRoZSB3c2RsOmRlZmluaXRpb24KLSAgICAgICAgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9IGRlZi5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLQotICAgICAgICAvLyBEZXRlcm1pbmUgdGhlIGRlbGltaXRlci4gUGVyIHRoZSBzcGVjOiAnaXMgIjoiIHdoZW4gdGhlIFt0YXJnZXQgbmFtZXNwYWNlXSBpcyBhIFVSTiwgb3RoZXJ3aXNlICIvIi4gCi0gICAgICAgIC8vIE5vdGUgdGhhdCBmb3IgSVJJIHNjaGVtZXMgb3RoZXIgdGhhbiBVUk5zIHdoaWNoIGFyZW4ndCBwYXRoLWJhc2VkIChpLmUuIHRob3NlIHRoYXQgb3V0bGF3IHRoZSAiLyIgCi0gICAgICAgIC8vIGNoYXJhY3RlciksIHRoZSBkZWZhdWx0IGFjdGlvbiB2YWx1ZSBtYXkgbm90IGNvbmZvcm0gdG8gdGhlIHJ1bGVzIG9mIHRoZSBJUkkgc2NoZW1lLiBBdXRob3JzCi0gICAgICAgIC8vIGFyZSBhZHZpc2VkIHRvIHNwZWNpZnkgZXhwbGljaXQgdmFsdWVzIGluIHRoZSBXU0RMIGluIHRoaXMgY2FzZS4nCi0gICAgICAgIFN0cmluZyBkZWxpbWl0ZXIgPSBTTEFTSDsKLSAgICAgICAgaWYgKHRhcmdldE5hbWVzcGFjZS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoVVJOKSkgewotICAgICAgICAgICAgZGVsaW1pdGVyID0gQ09MT047Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBHZXQgdGhlIHBvcnRUeXBlIG5hbWUgKGFzIGEgc3RyaW5nIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBhY3Rpb24pCi0gICAgICAgIFN0cmluZyBwb3J0VHlwZU5hbWUgPSB3c2RsNGpQb3J0VHlwZS5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpOwotICAgICAgICAvLyBHZXQgdGhlIG5hbWUgb2YgdGhlIG91dHB1dCBlbGVtZW50IChhbmQgZ2VuZXJhdGUgb25lIGlmIG5vbmUgZXhwbGljaXRseSBzcGVjaWZpZWQpCi0gICAgICAgIFN0cmluZyBvdXRwdXROYW1lID0gZ2V0TmFtZUZyb21PdXRwdXRFbGVtZW50KG9wLCBvdXRwdXQpOwotCi0gICAgICAgIC8vIEFwcGVuZCB0aGUgYml0cyB0b2dldGhlcgotICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIHNiLmFwcGVuZCh0YXJnZXROYW1lc3BhY2UpOwotICAgICAgICAvLyBEZWFsIHdpdGggdGhlIHByb2JsZW0gdGhhdCB0aGUgdGFyZ2V0TmFtZXNwYWNlIG1heSBvciBtYXkgbm90IGhhdmUgYSB0cmFpbGluZyBkZWxpbWl0ZXIKLSAgICAgICAgaWYgKCF0YXJnZXROYW1lc3BhY2UuZW5kc1dpdGgoZGVsaW1pdGVyKSkgewotICAgICAgICAgICAgc2IuYXBwZW5kKGRlbGltaXRlcik7Ci0gICAgICAgIH0KLSAgICAgICAgc2IuYXBwZW5kKHBvcnRUeXBlTmFtZSk7Ci0gICAgICAgIHNiLmFwcGVuZChkZWxpbWl0ZXIpOwotICAgICAgICBzYi5hcHBlbmQob3V0cHV0TmFtZSk7Ci0KLSAgICAgICAgLy8gUmVzb2x2ZSB0aGUgYWN0aW9uIGZyb20gdGhlIFN0cmluZ0J1ZmZlcgotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gc2IudG9TdHJpbmcoKTsKLQotICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy50cmFjZSgiZ2VuZXJhdGVBY3Rpb25Gcm9tT3V0cHV0RWxlbWVudCByZXN1bHQ6ICIgKyByZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIG5hbWUgb2YgdGhlIHNwZWNpZmllZCBPdXRwdXQgZWxlbWVudCB1c2luZyB0aGUgcnVsZXMgZGVmaW5lZCBpbiBXU0RMIDEuMQotICAgICAqIFNlY3Rpb24gMi40LjUgaHR0cDovL3d3dy53My5vcmcvVFIvd3NkbCNfbmFtZXMKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0TmFtZUZyb21PdXRwdXRFbGVtZW50KE9wZXJhdGlvbiBvcCwgT3V0cHV0IG91dHB1dCkgewotICAgICAgICAvLyBHZXQgdGhlIG5hbWUgZnJvbSB0aGUgb3V0cHV0IGVsZW1lbnQgaWYgc3BlY2lmaWVkLgotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gb3V0cHV0LmdldE5hbWUoKTsKLQotICAgICAgICAvLyBJZiBub3Qgd2UnbGwgaGF2ZSB0byBnZW5lcmF0ZSBpdC4KLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBJZiBSZXF1ZXN0LVJlc3BvbnNlIG9yIFNvbGljaXQtUmVzcG9uc2UgZG8gc29tZXRoaW5nIHNwZWNpYWwgcGVyCi0gICAgICAgICAgICAvLyBXU0RMIDEuMSBTZWN0aW9uIDIuNC41Ci0gICAgICAgICAgICBPcGVyYXRpb25UeXBlIG9wZXJhdGlvblR5cGUgPSBvcC5nZXRTdHlsZSgpOwotICAgICAgICAgICAgaWYgKG51bGwgIT0gb3BlcmF0aW9uVHlwZSkgewotICAgICAgICAgICAgICAgIGlmIChvcGVyYXRpb25UeXBlLmVxdWFscyhPcGVyYXRpb25UeXBlLlJFUVVFU1RfUkVTUE9OU0UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBvcC5nZXROYW1lKCkgKyBSRVNQT05TRTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG9wZXJhdGlvblR5cGUuZXF1YWxzKE9wZXJhdGlvblR5cGUuU09MSUNJVF9SRVNQT05TRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9wLmdldE5hbWUoKSArIFNPTElDSVQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSWYgdGhlIE9wZXJhdGlvblR5cGUgd2FzIG5vdCBhdmFpbGFibGUgZm9yIHNvbWUgcmVhc29uLCBhc3N1bWUgb24td2F5IG9yIG5vdGlmaWNhdGlvbgotICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gb3AuZ2V0TmFtZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgZ2V0T3V0cHV0QWN0aW9uRnJvbVN0cmluZ0luZm9ybWF0aW9uKFN0cmluZyBtZXNzYWdlRXhjaGFuZ2VQYXR0ZXJuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcG9ydFR5cGVOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgb3BlcmF0aW9uTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG91dHB1dE5hbWUpIHsKLSAgICAgICAgaWYgKG1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4gPT0gbnVsbCAmJiBvdXRwdXROYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICJPbmUgb2YgbWVzc2FnZUV4Y2hhbmdlUGF0dGVybiBvciBvdXRwdXROYW1lIG11c3QgdGhlIG5vbi1udWxsIHRvIGdlbmVyYXRlIGFuIGFjdGlvbi4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIERldGVybWluZSB0aGUgZGVsaW1pdGVyLiBQZXIgdGhlIHNwZWM6ICdpcyAiOiIgd2hlbiB0aGUgW3RhcmdldCBuYW1lc3BhY2VdIGlzIGEgVVJOLCBvdGhlcndpc2UgIi8iLiAKLSAgICAgICAgLy8gTm90ZSB0aGF0IGZvciBJUkkgc2NoZW1lcyBvdGhlciB0aGFuIFVSTnMgd2hpY2ggYXJlbid0IHBhdGgtYmFzZWQgKGkuZS4gdGhvc2UgdGhhdCBvdXRsYXcgdGhlICIvIiAKLSAgICAgICAgLy8gY2hhcmFjdGVyKSwgdGhlIGRlZmF1bHQgYWN0aW9uIHZhbHVlIG1heSBub3QgY29uZm9ybSB0byB0aGUgcnVsZXMgb2YgdGhlIElSSSBzY2hlbWUuIEF1dGhvcnMKLSAgICAgICAgLy8gYXJlIGFkdmlzZWQgdG8gc3BlY2lmeSBleHBsaWNpdCB2YWx1ZXMgaW4gdGhlIFdTREwgaW4gdGhpcyBjYXNlLicKLSAgICAgICAgU3RyaW5nIGRlbGltaXRlciA9IFNMQVNIOwotICAgICAgICBpZiAodGFyZ2V0TmFtZXNwYWNlLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChVUk4pKSB7Ci0gICAgICAgICAgICBkZWxpbWl0ZXIgPSBDT0xPTjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIE4uQi4gVW5saWtlIGNvcmUgQXhpczIgcHJvY2Vzc2luZyBXU0RMLCBKQVgtV1MgYW5ub3RhdGlvbiBwcm9jZXNzaW5nIHBhc3NlcyBpbiB0aGUKLSAgICAgICAgLy8gb3V0LWluIE1FUCB3aGVuIGNvbnN0cnVjdGluZyB0aGUgY2xpZW50LCBoZW5jZSB3ZSBuZWVkIHRvIHRha2UgYWNjb3VudCBvZiBpdCBoZXJlCi0gICAgICAgIC8vIGluIGFkZGl0aW9uIHRvIHRoZSBleHBlY3RlZCBpbi1vdXQKLSAgICAgICAgaWYgKG91dHB1dE5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgb3V0cHV0TmFtZSA9IG9wZXJhdGlvbk5hbWU7Ci0gICAgICAgICAgICBpZiAobWVzc2FnZUV4Y2hhbmdlUGF0dGVybi5pbmRleE9mKCJpbi1vdXQiKSA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgb3V0cHV0TmFtZSArPSBSRVNQT05TRTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobWVzc2FnZUV4Y2hhbmdlUGF0dGVybi5pbmRleE9mKCJvdXQtaW4iKSA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgb3V0cHV0TmFtZSArPSBSRVFVRVNUOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQXBwZW5kIHRoZSBiaXRzIHRvZ2V0aGVyCi0gICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgc2IuYXBwZW5kKHRhcmdldE5hbWVzcGFjZSk7Ci0gICAgICAgIC8vIERlYWwgd2l0aCB0aGUgcHJvYmxlbSB0aGF0IHRoZSB0YXJnZXROYW1lc3BhY2UgbWF5IG9yIG1heSBub3QgaGF2ZSBhIHRyYWlsaW5nIGRlbGltaXRlcgotICAgICAgICBpZiAoIXRhcmdldE5hbWVzcGFjZS5lbmRzV2l0aChkZWxpbWl0ZXIpKSB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoZGVsaW1pdGVyKTsKLSAgICAgICAgfQotICAgICAgICBzYi5hcHBlbmQocG9ydFR5cGVOYW1lKTsKLSAgICAgICAgc2IuYXBwZW5kKGRlbGltaXRlcik7Ci0gICAgICAgIHNiLmFwcGVuZChvdXRwdXROYW1lKTsKLQotICAgICAgICAvLyBSZXNvbHZlIHRoZSBhY3Rpb24gZnJvbSB0aGUgU3RyaW5nQnVmZmVyCi0gICAgICAgIFN0cmluZyByZXN1bHQgPSBzYi50b1N0cmluZygpOwotCi0gICAgICAgIGlmIChsb2cuaXNUcmFjZUVuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLnRyYWNlKCJnZXRPdXRwdXRBY3Rpb25Gcm9tU3RyaW5nSW5mb3JtYXRpb24gcmVzdWx0OiAiICsgcmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2VuZXJhdGUgdGhlIEFjdGlvbiBmb3IgYSBGYXVsdCB1c2luZyB0aGUgRGVmYXVsdCBBY3Rpb24gUGF0dGVybgotICAgICAqIDxwLz4KLSAgICAgKiBQYXR0ZXJuIGlzIGRlZmluZWQgYXMgW3RhcmdldCBuYW1lc3BhY2VdW2RlbGltaXRlcl1bcG9ydCB0eXBlIG5hbWVdW2RlbGltaXRlcl1bb3BlcmF0aW9uIG5hbWVdW2RlbGltaXRlcl1GYXVsdFtkZWxpbWl0ZXJdW2ZhdWx0IG5hbWVdCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZGVmICAgICAgICAgICAgaXMgcmVxdWlyZWQgdG8gb2J0YWluIHRoZSB0YXJnZXROYW1lc3BhY2UKLSAgICAgKiBAcGFyYW0gd3NkbDRqUG9ydFR5cGUgaXMgcmVxdWlyZWQgdG8gb2J0YWluIHRoZSBwb3J0VHlwZSBuYW1lCi0gICAgICogQHBhcmFtIG9wICAgICAgICAgICAgIGlzIHJlcXVpcmVkIHRvIG9idGFpbiB0aGUgb3BlcmF0aW9uIG5hbWUKLSAgICAgKiBAcGFyYW0gZmF1bHQgICAgICAgICAgaXMgcmVxdWlyZWQgdG8gb2J0YWluIHRoZSBmYXVsdCBuYW1lCi0gICAgICogQHJldHVybiBhIHdzYTpBY3Rpb24gdmFsdWUgYmFzZWQgb24gdGhlIERlZmF1bHQgQWN0aW9uIFBhdHRlcm4gYW5kIHRoZSBwcm92aWRlZCBvYmplY3RzCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2VuZXJhdGVBY3Rpb25Gcm9tRmF1bHRFbGVtZW50KERlZmluaXRpb24gZGVmLCBQb3J0VHlwZSB3c2RsNGpQb3J0VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmF0aW9uIG9wLCBGYXVsdCBmYXVsdCkgewotICAgICAgICAvLyBHZXQgdGhlIHRhcmdldE5hbWVzcGFjZSBvZiB0aGUgd3NkbDpkZWZpbml0aW9uCi0gICAgICAgIFN0cmluZyB0YXJnZXROYW1lc3BhY2UgPSBkZWYuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0KLSAgICAgICAgLy8gRGV0ZXJtaW5lIHRoZSBkZWxpbWl0ZXIuIFBlciB0aGUgc3BlYzogJ2lzICI6IiB3aGVuIHRoZSBbdGFyZ2V0IG5hbWVzcGFjZV0gaXMgYSBVUk4sIG90aGVyd2lzZSAiLyIuIAotICAgICAgICAvLyBOb3RlIHRoYXQgZm9yIElSSSBzY2hlbWVzIG90aGVyIHRoYW4gVVJOcyB3aGljaCBhcmVuJ3QgcGF0aC1iYXNlZCAoaS5lLiB0aG9zZSB0aGF0IG91dGxhdyB0aGUgIi8iIAotICAgICAgICAvLyBjaGFyYWN0ZXIpLCB0aGUgZGVmYXVsdCBhY3Rpb24gdmFsdWUgbWF5IG5vdCBjb25mb3JtIHRvIHRoZSBydWxlcyBvZiB0aGUgSVJJIHNjaGVtZS4gQXV0aG9ycwotICAgICAgICAvLyBhcmUgYWR2aXNlZCB0byBzcGVjaWZ5IGV4cGxpY2l0IHZhbHVlcyBpbiB0aGUgV1NETCBpbiB0aGlzIGNhc2UuJwotICAgICAgICBTdHJpbmcgZGVsaW1pdGVyID0gU0xBU0g7Ci0gICAgICAgIGlmICh0YXJnZXROYW1lc3BhY2UudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKFVSTikpIHsKLSAgICAgICAgICAgIGRlbGltaXRlciA9IENPTE9OOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gR2V0IHRoZSBwb3J0VHlwZSBuYW1lIChhcyBhIHN0cmluZyB0byBiZSBpbmNsdWRlZCBpbiB0aGUgYWN0aW9uKQotICAgICAgICBTdHJpbmcgcG9ydFR5cGVOYW1lID0gd3NkbDRqUG9ydFR5cGUuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgLy8gR2V0IHRoZSBvcGVyYXRpb24gbmFtZSAoYXMgYSBzdHJpbmcgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIGFjdGlvbikKLSAgICAgICAgU3RyaW5nIG9wZXJhdGlvbk5hbWUgPSBvcC5nZXROYW1lKCk7Ci0KLSAgICAgICAgLy8gR2V0IHRoZSBuYW1lIG9mIHRoZSBmYXVsdCBlbGVtZW50IChuYW1lIGlzIG1hbmRhdG9yeSBvbiBmYXVsdCBlbGVtZW50cykKLSAgICAgICAgU3RyaW5nIGZhdWx0TmFtZSA9IGZhdWx0LmdldE5hbWUoKTsKLQotICAgICAgICAvLyBBcHBlbmQgdGhlIGJpdHMgdG9nZXRoZXIKLSAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBzYi5hcHBlbmQodGFyZ2V0TmFtZXNwYWNlKTsKLSAgICAgICAgLy8gRGVhbCB3aXRoIHRoZSBwcm9ibGVtIHRoYXQgdGhlIHRhcmdldE5hbWVzcGFjZSBtYXkgb3IgbWF5IG5vdCBoYXZlIGEgdHJhaWxpbmcgZGVsaW1pdGVyCi0gICAgICAgIGlmICghdGFyZ2V0TmFtZXNwYWNlLmVuZHNXaXRoKGRlbGltaXRlcikpIHsKLSAgICAgICAgICAgIHNiLmFwcGVuZChkZWxpbWl0ZXIpOwotICAgICAgICB9Ci0gICAgICAgIHNiLmFwcGVuZChwb3J0VHlwZU5hbWUpOwotICAgICAgICBzYi5hcHBlbmQoZGVsaW1pdGVyKTsKLSAgICAgICAgc2IuYXBwZW5kKG9wZXJhdGlvbk5hbWUpOwotICAgICAgICBzYi5hcHBlbmQoZGVsaW1pdGVyKTsKLSAgICAgICAgc2IuYXBwZW5kKEZBVUxUKTsKLSAgICAgICAgc2IuYXBwZW5kKGRlbGltaXRlcik7Ci0gICAgICAgIHNiLmFwcGVuZChmYXVsdE5hbWUpOwotCi0gICAgICAgIC8vIFJlc29sdmUgdGhlIGFjdGlvbiBmcm9tIHRoZSBTdHJpbmdCdWZmZXIKLSAgICAgICAgU3RyaW5nIHJlc3VsdCA9IHNiLnRvU3RyaW5nKCk7Ci0KLSAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cudHJhY2UoImdlbmVyYXRlQWN0aW9uRnJvbUZhdWx0RWxlbWVudCByZXN1bHQ6ICIgKyByZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBnZXRGYXVsdEFjdGlvbkZyb21TdHJpbmdJbmZvcm1hdGlvbihTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwb3J0VHlwZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG9wZXJhdGlvbk5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZhdWx0TmFtZSkgewotICAgICAgICAvLyBEZXRlcm1pbmUgdGhlIGRlbGltaXRlci4gUGVyIHRoZSBzcGVjOiAnaXMgIjoiIHdoZW4gdGhlIFt0YXJnZXQgbmFtZXNwYWNlXSBpcyBhIFVSTiwgb3RoZXJ3aXNlICIvIi4gCi0gICAgICAgIC8vIE5vdGUgdGhhdCBmb3IgSVJJIHNjaGVtZXMgb3RoZXIgdGhhbiBVUk5zIHdoaWNoIGFyZW4ndCBwYXRoLWJhc2VkIChpLmUuIHRob3NlIHRoYXQgb3V0bGF3IHRoZSAiLyIgCi0gICAgICAgIC8vIGNoYXJhY3RlciksIHRoZSBkZWZhdWx0IGFjdGlvbiB2YWx1ZSBtYXkgbm90IGNvbmZvcm0gdG8gdGhlIHJ1bGVzIG9mIHRoZSBJUkkgc2NoZW1lLiBBdXRob3JzCi0gICAgICAgIC8vIGFyZSBhZHZpc2VkIHRvIHNwZWNpZnkgZXhwbGljaXQgdmFsdWVzIGluIHRoZSBXU0RMIGluIHRoaXMgY2FzZS4nCi0gICAgICAgIFN0cmluZyBkZWxpbWl0ZXIgPSBTTEFTSDsKLSAgICAgICAgaWYgKHRhcmdldE5hbWVzcGFjZS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoVVJOKSkgewotICAgICAgICAgICAgZGVsaW1pdGVyID0gQ09MT047Ci0gICAgICAgIH0KLQotLy8gICAgICBBcHBlbmQgdGhlIGJpdHMgdG9nZXRoZXIKLSAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBzYi5hcHBlbmQodGFyZ2V0TmFtZXNwYWNlKTsKLSAgICAgICAgLy8gRGVhbCB3aXRoIHRoZSBwcm9ibGVtIHRoYXQgdGhlIHRhcmdldE5hbWVzcGFjZSBtYXkgb3IgbWF5IG5vdCBoYXZlIGEgdHJhaWxpbmcgZGVsaW1pdGVyCi0gICAgICAgIGlmICghdGFyZ2V0TmFtZXNwYWNlLmVuZHNXaXRoKGRlbGltaXRlcikpIHsKLSAgICAgICAgICAgIHNiLmFwcGVuZChkZWxpbWl0ZXIpOwotICAgICAgICB9Ci0gICAgICAgIHNiLmFwcGVuZChwb3J0VHlwZU5hbWUpOwotICAgICAgICBzYi5hcHBlbmQoZGVsaW1pdGVyKTsKLSAgICAgICAgc2IuYXBwZW5kKG9wZXJhdGlvbk5hbWUpOwotICAgICAgICBzYi5hcHBlbmQoZGVsaW1pdGVyKTsKLSAgICAgICAgc2IuYXBwZW5kKEZBVUxUKTsKLSAgICAgICAgc2IuYXBwZW5kKGRlbGltaXRlcik7Ci0gICAgICAgIHNiLmFwcGVuZChmYXVsdE5hbWUpOwotCi0gICAgICAgIC8vIFJlc29sdmUgdGhlIGFjdGlvbiBmcm9tIHRoZSBTdHJpbmdCdWZmZXIKLSAgICAgICAgU3RyaW5nIHJlc3VsdCA9IHNiLnRvU3RyaW5nKCk7Ci0KLSAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cudHJhY2UoImdldEZhdWx0QWN0aW9uRnJvbVN0cmluZ0luZm9ybWF0aW9uIHJlc3VsdDogIiArIHJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9idWlsZGVyL0FwcGxpY2F0aW9uWE1MQnVpbGRlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2J1aWxkZXIvQXBwbGljYXRpb25YTUxCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4Mjg3Y2YuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2J1aWxkZXIvQXBwbGljYXRpb25YTUxCdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuYnVpbGRlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLk9NTm9kZUV4OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5idWlsZGVyLlN0QVhCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5EZXRhY2hhYmxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBCb2R5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlB1c2hiYWNrSW5wdXRTdHJlYW07Ci0KLS8qKgotICogVGhpcyBidWlsZGVyIGlzIHVzZWQgd2hlbiB0aGUgc2VyaWFsaXphdGlvbiBvZiB0aGUgbWVzc2FnZSBpcyBhcHBsaWNhdGlvbi94bWwuCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHBsaWNhdGlvblhNTEJ1aWxkZXIgaW1wbGVtZW50cyBCdWlsZGVyIHsKLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgZG9jdW1lbnQgZWxlbWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgT01FbGVtZW50IHByb2Nlc3NEb2N1bWVudChJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgU3RyaW5nIGNvbnRlbnRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0KQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIFNPQVBGYWN0b3J5IHNvYXBGYWN0b3J5ID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDExRmFjdG9yeSgpOwotICAgICAgICBTT0FQRW52ZWxvcGUgc29hcEVudmVsb3BlID0gc29hcEZhY3RvcnkuZ2V0RGVmYXVsdEVudmVsb3BlKCk7Ci0gICAgICAgIGlmIChpbnB1dFN0cmVhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIC8vIEFwcGx5IGEgZGV0YWNoYWJsZSBpbnB1dHN0cmVhbS4gIFRoaXMgY2FuIGJlIHVzZWQgbGF0ZXIKLSAgICAgICAgICAgICAgICAvLyB0byAoYSkgZ2V0IHRoZSBsZW5ndGggb2YgdGhlIGluY29taW5nIG1lc3NhZ2Ugb3IgKGIpCi0gICAgICAgICAgICAgICAgLy8gZnJlZSB0cmFuc3BvcnQgcmVzb3VyY2VzLgotICAgICAgICAgICAgICAgIERldGFjaGFibGVJbnB1dFN0cmVhbSBpcyA9IG5ldyBEZXRhY2hhYmxlSW5wdXRTdHJlYW0oaW5wdXRTdHJlYW0pOwotICAgICAgICAgICAgICAgIG1lc3NhZ2VDb250ZXh0LnNldFByb3BlcnR5KENvbnN0YW50cy5ERVRBQ0hBQkxFX0lOUFVUX1NUUkVBTSwgaXMpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFB1c2hiYWNrSW5wdXRTdHJlYW0gcHVzaGJhY2tJbnB1dFN0cmVhbSA9IG5ldyBQdXNoYmFja0lucHV0U3RyZWFtKGlzKTsKLSAgICAgICAgICAgICAgICBpbnQgYjsKLSAgICAgICAgICAgICAgICBpZiAoKGIgPSBwdXNoYmFja0lucHV0U3RyZWFtLnJlYWQoKSkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHB1c2hiYWNrSW5wdXRTdHJlYW0udW5yZWFkKGIpOwotICAgICAgICAgICAgICAgICAgICBTdEFYQnVpbGRlciBidWlsZGVyID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWlsZGVyVXRpbC5nZXRQT1hCdWlsZGVyKHB1c2hiYWNrSW5wdXRTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU3RyaW5nKSBtZXNzYWdlQ29udGV4dC5nZXRQcm9wZXJ0eSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uQ0hBUkFDVEVSX1NFVF9FTkNPRElORykpOwotICAgICAgICAgICAgICAgICAgICBPTU5vZGVFeCBkb2N1bWVudEVsZW1lbnQgPSAoT01Ob2RlRXgpIGJ1aWxkZXIuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50RWxlbWVudC5zZXRQYXJlbnQobnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgIFNPQVBCb2R5IGJvZHkgPSBzb2FwRW52ZWxvcGUuZ2V0Qm9keSgpOwotICAgICAgICAgICAgICAgICAgICBib2R5LmFkZENoaWxkKGRvY3VtZW50RWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IEF4aXNGYXVsdC5tYWtlRmF1bHQoZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc29hcEVudmVsb3BlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2J1aWxkZXIvQnVpbGRlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2J1aWxkZXIvQnVpbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjQzOTUyLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9idWlsZGVyL0J1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5idWlsZGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotcHVibGljIGludGVyZmFjZSBCdWlsZGVyIHsKLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgZG9jdW1lbnQgZWxlbWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgT01FbGVtZW50IHByb2Nlc3NEb2N1bWVudChJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgU3RyaW5nIGNvbnRlbnRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0KSB0aHJvd3MgQXhpc0ZhdWx0OwotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2J1aWxkZXIvQnVpbGRlclV0aWwuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9idWlsZGVyL0J1aWxkZXJVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2ZWVkY2QuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2J1aWxkZXIvQnVpbGRlclV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuYnVpbGRlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uYXR0YWNobWVudHMuQXR0YWNobWVudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5hdHRhY2htZW50cy5saWZlY3ljbGUuTGlmZWN5Y2xlTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLmF0dGFjaG1lbnRzLmxpZmVjeWNsZS5pbXBsLkxpZmVjeWNsZU1hbmFnZXJJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uYXR0YWNobWVudHMudXRpbHMuSU9VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQXR0cmlidXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NVGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuTVRPTUNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuYnVpbGRlci5TdEFYQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuYnVpbGRlci5TdEFYT01CdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5idWlsZGVyLlhPUEF3YXJlU3RBWE9NQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLnV0aWwuU3RBWFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQMTFDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVAxMkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEJvZHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBQcm9jZXNzaW5nRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5pbXBsLmJ1aWxkZXIuTVRPTVN0QVhTT0FQTW9kZWxCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5pbXBsLmJ1aWxkZXIuU3RBWFNPQVBNb2RlbEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC5EZXBsb3ltZW50Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc01lc3NhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuSFRUUENvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuSmF2YVV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5NdWx0aXBsZUVudHJ5SGFzaE1hcDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuV1NETENvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYUFsbDsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYUNvbXBsZXhUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYUdyb3VwQmFzZTsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYVBhcnRpY2xlOwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hU2VxdWVuY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFUeXBlOwotCi1pbXBvcnQgamF2YXguYWN0aXZhdGlvbi5EYXRhSGFuZGxlcjsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3I7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlB1c2hiYWNrSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLXB1YmxpYyBjbGFzcyBCdWlsZGVyVXRpbCB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEJ1aWxkZXJVdGlsLmNsYXNzKTsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJPTV9TSVpFID0gNDsKLQotICAgIHB1YmxpYyBzdGF0aWMgU09BUEVudmVsb3BlIGJ1aWxkc29hcE1lc3NhZ2UoTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdWx0aXBsZUVudHJ5SGFzaE1hcCByZXF1ZXN0UGFyYW1ldGVyTWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09BUEZhY3Rvcnkgc29hcEZhY3RvcnkpIHRocm93cyBBeGlzRmF1bHQgewotCi0gICAgICAgIFNPQVBFbnZlbG9wZSBzb2FwRW52ZWxvcGUgPSBzb2FwRmFjdG9yeS5nZXREZWZhdWx0RW52ZWxvcGUoKTsKLSAgICAgICAgU09BUEJvZHkgYm9keSA9IHNvYXBFbnZlbG9wZS5nZXRCb2R5KCk7Ci0gICAgICAgIFhtbFNjaGVtYUVsZW1lbnQgeG1sU2NoZW1hRWxlbWVudDsKLSAgICAgICAgQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uID0gbWVzc2FnZUNvbnRleHQuZ2V0QXhpc09wZXJhdGlvbigpOwotICAgICAgICBpZiAoYXhpc09wZXJhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBBeGlzTWVzc2FnZSBheGlzTWVzc2FnZSA9Ci0gICAgICAgICAgICAgICAgICAgIGF4aXNPcGVyYXRpb24uZ2V0TWVzc2FnZShXU0RMQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfSU5fVkFMVUUpOwotICAgICAgICAgICAgeG1sU2NoZW1hRWxlbWVudCA9IGF4aXNNZXNzYWdlLmdldFNjaGVtYUVsZW1lbnQoKTsKLQotICAgICAgICAgICAgaWYgKHhtbFNjaGVtYUVsZW1lbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIE9NRWxlbWVudCBib2R5Rmlyc3RDaGlsZCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBzb2FwRmFjdG9yeQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlT01FbGVtZW50KG1lc3NhZ2VDb250ZXh0LmdldEF4aXNPcGVyYXRpb24oKS5nZXROYW1lKCksIGJvZHkpOwotCi0gICAgICAgICAgICAgICAgLy8gaWYgdGhlcmUgaXMgbm8gc2NoZW1hIGl0cyBwaWVjZSBvZiBjYWtlICEhIGFkZCB0aGVzZSB0byB0aGUgc29hcCBib2R5IGluIGFueSBvcmRlciB5b3UgbGlrZS4KLSAgICAgICAgICAgICAgICAvLyBOb3RlIDogaWYgdGhlcmUgYXJlIHBhcmFtZXRlcnMgaW4gdGhlIHBhdGggb2YgdGhlIFVSTCwgdGhlcmUgaXMgbm8gd2F5IHRoaXMgY2FuIGFkZCB0aGVtCi0gICAgICAgICAgICAgICAgLy8gdG8gdGhlIG1lc3NhZ2UuCi0gICAgICAgICAgICAgICAgY3JlYXRlU09BUE1lc3NhZ2VXaXRob3V0U2NoZW1hKHNvYXBGYWN0b3J5LCBib2R5Rmlyc3RDaGlsZCwgcmVxdWVzdFBhcmFtZXRlck1hcCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotCi0gICAgICAgICAgICAgICAgLy8gZmlyc3QgZ2V0IHRoZSB0YXJnZXQgbmFtZXNwYWNlIGZyb20gdGhlIHNjaGVtYSBhbmQgdGhlIHdyYXBwaW5nIGVsZW1lbnQuCi0gICAgICAgICAgICAgICAgLy8gY3JlYXRlIGFuIE9NRWxlbWVudCBvdXQgb2YgdGhvc2UgaW5mb3JtYXRpb24uIFdlIGFyZSBnb2luZyB0byBleHRyYWN0IHBhcmFtZXRlcnMgZnJvbQotICAgICAgICAgICAgICAgIC8vIHVybCwgY3JlYXRlIE9NRWxlbWVudHMgYW5kIGFkZCB0aGVtIGFzIGNoaWxkcmVuIHRvIHRoaXMgd3JhcHBpbmcgZWxlbWVudC4KLSAgICAgICAgICAgICAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0geG1sU2NoZW1hRWxlbWVudC5nZXRRTmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgIFFOYW1lIGJvZHlGaXJzdENoaWxkUU5hbWU7Ci0gICAgICAgICAgICAgICAgaWYgKHRhcmdldE5hbWVzcGFjZSAhPSBudWxsICYmICEiIi5lcXVhbHModGFyZ2V0TmFtZXNwYWNlKSkgewotICAgICAgICAgICAgICAgICAgICBib2R5Rmlyc3RDaGlsZFFOYW1lID0gbmV3IFFOYW1lKHRhcmdldE5hbWVzcGFjZSwgeG1sU2NoZW1hRWxlbWVudC5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGJvZHlGaXJzdENoaWxkUU5hbWUgPSBuZXcgUU5hbWUoeG1sU2NoZW1hRWxlbWVudC5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBPTUVsZW1lbnQgYm9keUZpcnN0Q2hpbGQgPSBzb2FwRmFjdG9yeS5jcmVhdGVPTUVsZW1lbnQoYm9keUZpcnN0Q2hpbGRRTmFtZSwgYm9keSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBTY2hlbWEgc2hvdWxkIGFkaGVyZSB0byB0aGUgSVJJIHN0eWxlIGluIHRoaXMuIFNvIGFzc3VtZSBJUkkgc3R5bGUgYW5kIGRpdmUgaW4gdG8KLSAgICAgICAgICAgICAgICAvLyBzY2hlbWEKLSAgICAgICAgICAgICAgICBYbWxTY2hlbWFUeXBlIHNjaGVtYVR5cGUgPSB4bWxTY2hlbWFFbGVtZW50LmdldFNjaGVtYVR5cGUoKTsKLSAgICAgICAgICAgICAgICBpZiAoc2NoZW1hVHlwZSBpbnN0YW5jZW9mIFhtbFNjaGVtYUNvbXBsZXhUeXBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIFhtbFNjaGVtYUNvbXBsZXhUeXBlIGNvbXBsZXhUeXBlID0gKChYbWxTY2hlbWFDb21wbGV4VHlwZSlzY2hlbWFUeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgWG1sU2NoZW1hUGFydGljbGUgcGFydGljbGUgPSBjb21wbGV4VHlwZS5nZXRQYXJ0aWNsZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAocGFydGljbGUgaW5zdGFuY2VvZiBYbWxTY2hlbWFTZXF1ZW5jZSB8fCBwYXJ0aWNsZSBpbnN0YW5jZW9mIFhtbFNjaGVtYUFsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgWG1sU2NoZW1hR3JvdXBCYXNlIHhtbFNjaGVtYUdyb3VwQmFzZSA9IChYbWxTY2hlbWFHcm91cEJhc2UpcGFydGljbGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBJdGVyYXRvciBpdGVyYXRvciA9IHhtbFNjaGVtYUdyb3VwQmFzZS5nZXRJdGVtcygpLmdldEl0ZXJhdG9yKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdyB3ZSBuZWVkIHRvIGtub3cgc29tZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBiaW5kaW5nIG9wZXJhdGlvbi4KLQotICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhtbFNjaGVtYUVsZW1lbnQgaW5uZXJFbGVtZW50ID0gKFhtbFNjaGVtYUVsZW1lbnQpaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFOYW1lIHFOYW1lID0gaW5uZXJFbGVtZW50LmdldFFOYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHFOYW1lID09IG51bGwgJiYgaW5uZXJFbGVtZW50LmdldFNjaGVtYVR5cGVOYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5lcXVhbHMob3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5jb25zdGFudHMuQ29uc3RhbnRzLlhTRF9BTllUWVBFKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVTT0FQTWVzc2FnZVdpdGhvdXRTY2hlbWEoc29hcEZhY3RvcnksIGJvZHlGaXJzdENoaWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFBhcmFtZXRlck1hcCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIG1pbk9jY3VycyA9IGlubmVyRWxlbWVudC5nZXRNaW5PY2N1cnMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIG5pbGxhYmxlID0gaW5uZXJFbGVtZW50LmlzTmlsbGFibGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxTmFtZSAhPSBudWxsID8gcU5hbWUuZ2V0TG9jYWxQYXJ0KCkgOiBpbm5lckVsZW1lbnQuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCB2YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTU5hbWVzcGFjZSBucyA9IChxTmFtZSA9PSBudWxsIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkgPT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHFOYW1lLmdldE5hbWVzcGFjZVVSSSgpLmxlbmd0aCgpID09IDApID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgOiBzb2FwRmFjdG9yeS5jcmVhdGVPTU5hbWVzcGFjZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFOYW1lLmdldE5hbWVzcGFjZVVSSSgpLCBudWxsKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FIGNoYW5nZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKHZhbHVlID0gcmVxdWVzdFBhcmFtZXRlck1hcC5nZXQobmFtZSkpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkUmVxdWVzdFBhcmFtZXRlcihzb2FwRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib2R5Rmlyc3RDaGlsZCwgbnMsIG5hbWUsIHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzLS07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtaW5PY2N1cnMgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuaWxsYWJsZSkgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTU5hbWVzcGFjZSB4c2kgPSBzb2FwRmFjdG9yeS5jcmVhdGVPTU5hbWVzcGFjZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLlVSSV9ERUZBVUxUX1NDSEVNQV9YU0ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5OU19QUkVGSVhfU0NIRU1BX1hTSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTUF0dHJpYnV0ZSBvbUF0dHJpYnV0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvYXBGYWN0b3J5LmNyZWF0ZU9NQXR0cmlidXRlKCJuaWwiLCB4c2ksICJ0cnVlIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2FwRmFjdG9yeS5jcmVhdGVPTUVsZW1lbnQobmFtZSwgbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9keUZpcnN0Q2hpbGQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRBdHRyaWJ1dGUob21BdHRyaWJ1dGUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJSZXF1aXJlZCBlbGVtZW50ICIgKyBxTmFtZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZGVmaW5lZCBpbiB0aGUgc2NoZW1hIGNhbiBub3QgYmUiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBmb3VuZCBpbiB0aGUgcmVxdWVzdCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzb2FwRW52ZWxvcGU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjcmVhdGVTT0FQTWVzc2FnZVdpdGhvdXRTY2hlbWEoU09BUEZhY3Rvcnkgc29hcEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01FbGVtZW50IGJvZHlGaXJzdENoaWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE11bHRpcGxlRW50cnlIYXNoTWFwIHJlcXVlc3RQYXJhbWV0ZXJNYXApIHsKLQotICAgICAgICAvLyBmaXJzdCBhZGQgdGhlIHBhcmFtZXRlcnMgaW4gdGhlIFVSTAotICAgICAgICBpZiAocmVxdWVzdFBhcmFtZXRlck1hcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBJdGVyYXRvciByZXF1ZXN0UGFyYW1NYXBJdGVyID0gcmVxdWVzdFBhcmFtZXRlck1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgd2hpbGUgKHJlcXVlc3RQYXJhbU1hcEl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9IChTdHJpbmcpcmVxdWVzdFBhcmFtTWFwSXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gcmVxdWVzdFBhcmFtZXRlck1hcC5nZXQoa2V5KTsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhZGRSZXF1ZXN0UGFyYW1ldGVyKHNvYXBGYWN0b3J5LCBib2R5Rmlyc3RDaGlsZCwgbnVsbCwga2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYWRkUmVxdWVzdFBhcmFtZXRlcihTT0FQRmFjdG9yeSBzb2FwRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01FbGVtZW50IGJvZHlGaXJzdENoaWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTU5hbWVzcGFjZSBucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHBhcmFtZXRlcikgewotICAgICAgICBpZiAocGFyYW1ldGVyIGluc3RhbmNlb2YgRGF0YUhhbmRsZXIpIHsKLSAgICAgICAgICAgIERhdGFIYW5kbGVyIGRhdGFIYW5kbGVyID0gKERhdGFIYW5kbGVyKXBhcmFtZXRlcjsKLSAgICAgICAgICAgIE9NVGV4dCBkYXRhVGV4dCA9IGJvZHlGaXJzdENoaWxkLmdldE9NRmFjdG9yeSgpLmNyZWF0ZU9NVGV4dCgKLSAgICAgICAgICAgICAgICAgICAgZGF0YUhhbmRsZXIsIHRydWUpOwotICAgICAgICAgICAgc29hcEZhY3RvcnkuY3JlYXRlT01FbGVtZW50KGtleSwgbnMsIGJvZHlGaXJzdENoaWxkKS5hZGRDaGlsZCgKLSAgICAgICAgICAgICAgICAgICAgZGF0YVRleHQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgU3RyaW5nIHRleHRWYWx1ZSA9IHBhcmFtZXRlci50b1N0cmluZygpOwotICAgICAgICAgICAgc29hcEZhY3RvcnkuY3JlYXRlT01FbGVtZW50KGtleSwgbnMsIGJvZHlGaXJzdENoaWxkKS5zZXRUZXh0KAotICAgICAgICAgICAgICAgICAgICB0ZXh0VmFsdWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdEFYQnVpbGRlciBnZXRQT1hCdWlsZGVyKElucHV0U3RyZWFtIGluU3RyZWFtLCBTdHJpbmcgY2hhclNldEVuYykKLSAgICAgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBTdEFYQnVpbGRlciBidWlsZGVyOwotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1scmVhZGVyID0KLSAgICAgICAgICAgICAgICBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKGluU3RyZWFtLCBjaGFyU2V0RW5jKTsKLSAgICAgICAgYnVpbGRlciA9IG5ldyBTdEFYT01CdWlsZGVyKHhtbHJlYWRlcik7Ci0gICAgICAgIHJldHVybiBidWlsZGVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVzZSB0aGUgQk9NIE1hcmsgdG8gaWRlbnRpZnkgdGhlIGVuY29kaW5nIHRvIGJlIHVzZWQuIEZhbGwgYmFjayB0byBkZWZhdWx0IGVuY29kaW5nCi0gICAgICogc3BlY2lmaWVkCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaXMgICAgICAgICAgICAgIHRoZSBJbnB1dFN0cmVhbSBvZiBhIG1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gY2hhclNldEVuY29kaW5nIGRlZmF1bHQgY2hhcmFjdGVyIHNldCBlbmNvZGluZwotICAgICAqIEByZXR1cm4gYSBSZWFkZXIgd2l0aCB0aGUgY29ycmVjdCBlbmNvZGluZyBhbHJlYWR5IHNldAotICAgICAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgUmVhZGVyIGdldFJlYWRlcihmaW5hbCBJbnB1dFN0cmVhbSBpcywgZmluYWwgU3RyaW5nIGNoYXJTZXRFbmNvZGluZykKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIFB1c2hiYWNrSW5wdXRTdHJlYW0gaXMyID0gZ2V0UHVzaGJhY2tJbnB1dFN0cmVhbShpcyk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBlbmNvZGluZyA9IGdldENoYXJTZXRFbmNvZGluZyhpczIsIGNoYXJTZXRFbmNvZGluZyk7Ci0gICAgICAgIElucHV0U3RyZWFtUmVhZGVyIGlucHV0U3RyZWFtUmVhZGVyOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaW5wdXRTdHJlYW1SZWFkZXIgPSAoSW5wdXRTdHJlYW1SZWFkZXIpQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoCi0gICAgICAgICAgICAgICAgICAgIG5ldyBQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpczIsIGVuY29kaW5nKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgKTsKLSAgICAgICAgfSBjYXRjaCAoUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbillLmdldEV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgQnVmZmVyZWRSZWFkZXIoaW5wdXRTdHJlYW1SZWFkZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBnZXQgYSBQdXNoYmFja0lucHV0U3RyZWFtIHNvIHRoYXQgd2UgY2FuIHJlYWQgdGhlIEJPTQotICAgICAqCi0gICAgICogQHBhcmFtIGlzIGEgcmVndWxhciBJbnB1dFN0cmVhbQotICAgICAqIEByZXR1cm4gYSBQdXNoYmFja0lucHV0U3RyZWFtIHdyYXBwaW5nIHRoZSBwYXNzZWQgb25lCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBQdXNoYmFja0lucHV0U3RyZWFtIGdldFB1c2hiYWNrSW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gaXMpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBQdXNoYmFja0lucHV0U3RyZWFtKGlzLCBCT01fU0laRSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXNlIHRoZSBCT00gTWFyayB0byBpZGVudGlmeSB0aGUgZW5jb2RpbmcgdG8gYmUgdXNlZC4gRmFsbCBiYWNrIHRvIGRlZmF1bHQgZW5jb2RpbmcKLSAgICAgKiBzcGVjaWZpZWQKLSAgICAgKgotICAgICAqIEBwYXJhbSBpczIgICAgICAgICAgICAgUHVzaEJhY2tJbnB1dFN0cmVhbSAoaXQgbXVzdCBiZSBhIHB1c2hiYWNrIGlucHV0IHN0cmVhbSBzbyB0aGF0IHdlIGNhbgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgdW5yZWFkIHRoZSBCT00pCi0gICAgICogQHBhcmFtIGRlZmF1bHRFbmNvZGluZyBkZWZhdWx0IGVuY29kaW5nIHN0eWxlIGlmIG5vIEJPTQotICAgICAqIEByZXR1cm4gdGhlIHNlbGVjdGVkIGNoYXJhY3RlciBzZXQgZW5jb2RpbmcKLSAgICAgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDaGFyU2V0RW5jb2RpbmcoUHVzaGJhY2tJbnB1dFN0cmVhbSBpczIsIFN0cmluZyBkZWZhdWx0RW5jb2RpbmcpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgZW5jb2Rpbmc7Ci0gICAgICAgIGJ5dGUgYm9tW10gPSBuZXcgYnl0ZVtCT01fU0laRV07Ci0gICAgICAgIGludCBuLCB1bnJlYWQ7Ci0KLSAgICAgICAgbiA9IGlzMi5yZWFkKGJvbSwgMCwgYm9tLmxlbmd0aCk7Ci0KLSAgICAgICAgaWYgKChib21bMF0gPT0gKGJ5dGUpMHhFRikgJiYgKGJvbVsxXSA9PSAoYnl0ZSkweEJCKSAmJiAoYm9tWzJdID09IChieXRlKTB4QkYpKSB7Ci0gICAgICAgICAgICBlbmNvZGluZyA9ICJVVEYtOCI7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoImNoYXIgc2V0IGVuY29kaW5nIHNldCBmcm9tIEJPTSA9IiArIGVuY29kaW5nKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVucmVhZCA9IG4gLSAzOwotICAgICAgICB9IGVsc2UgaWYgKChib21bMF0gPT0gKGJ5dGUpMHhGRSkgJiYgKGJvbVsxXSA9PSAoYnl0ZSkweEZGKSkgewotICAgICAgICAgICAgZW5jb2RpbmcgPSAiVVRGLTE2QkUiOwotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJjaGFyIHNldCBlbmNvZGluZyBzZXQgZnJvbSBCT00gPSIgKyBlbmNvZGluZyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB1bnJlYWQgPSBuIC0gMjsKLSAgICAgICAgfSBlbHNlIGlmICgoYm9tWzBdID09IChieXRlKTB4RkYpICYmIChib21bMV0gPT0gKGJ5dGUpMHhGRSkpIHsKLSAgICAgICAgICAgIGVuY29kaW5nID0gIlVURi0xNkxFIjsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiY2hhciBzZXQgZW5jb2Rpbmcgc2V0IGZyb20gQk9NID0iICsgZW5jb2RpbmcpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdW5yZWFkID0gbiAtIDI7Ci0gICAgICAgIH0gZWxzZSBpZiAoKGJvbVswXSA9PSAoYnl0ZSkweDAwKSAmJiAoYm9tWzFdID09IChieXRlKTB4MDApICYmIChib21bMl0gPT0gKGJ5dGUpMHhGRSkKLSAgICAgICAgICAgICAgICAgICAmJiAoYm9tWzNdID09IChieXRlKTB4RkYpKSB7Ci0gICAgICAgICAgICBlbmNvZGluZyA9ICJVVEYtMzJCRSI7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoImNoYXIgc2V0IGVuY29kaW5nIHNldCBmcm9tIEJPTSA9IiArIGVuY29kaW5nKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVucmVhZCA9IG4gLSA0OwotICAgICAgICB9IGVsc2UgaWYgKChib21bMF0gPT0gKGJ5dGUpMHhGRikgJiYgKGJvbVsxXSA9PSAoYnl0ZSkweEZFKSAmJiAoYm9tWzJdID09IChieXRlKTB4MDApCi0gICAgICAgICAgICAgICAgICAgJiYgKGJvbVszXSA9PSAoYnl0ZSkweDAwKSkgewotICAgICAgICAgICAgZW5jb2RpbmcgPSAiVVRGLTMyTEUiOwotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJjaGFyIHNldCBlbmNvZGluZyBzZXQgZnJvbSBCT00gPSIgKyBlbmNvZGluZyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB1bnJlYWQgPSBuIC0gNDsKLSAgICAgICAgfSBlbHNlIHsKLQotICAgICAgICAgICAgLy8gVW5pY29kZSBCT00gbWFyayBub3QgZm91bmQsIHVucmVhZCBhbGwgYnl0ZXMKLSAgICAgICAgICAgIGVuY29kaW5nID0gZGVmYXVsdEVuY29kaW5nOwotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJjaGFyIHNldCBlbmNvZGluZyBzZXQgZnJvbSBkZWZhdWx0ID0iICsgZW5jb2RpbmcpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdW5yZWFkID0gbjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh1bnJlYWQgPiAwKSB7Ci0gICAgICAgICAgICBpczIudW5yZWFkKGJvbSwgKG4gLSB1bnJlYWQpLCB1bnJlYWQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBlbmNvZGluZzsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEVudmVsb3BlTmFtZXNwYWNlKFN0cmluZyBjb250ZW50VHlwZSkgewotICAgICAgICBTdHJpbmcgc29hcE5TID0gU09BUDExQ29uc3RhbnRzLlNPQVBfRU5WRUxPUEVfTkFNRVNQQUNFX1VSSTsKLSAgICAgICAgaWYgKGNvbnRlbnRUeXBlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChjb250ZW50VHlwZS5pbmRleE9mKFNPQVAxMkNvbnN0YW50cy5TT0FQXzEyX0NPTlRFTlRfVFlQRSkgPiAtMSkgewotICAgICAgICAgICAgICAgIC8vIGl0IGlzIFNPQVAgMS4yCi0gICAgICAgICAgICAgICAgc29hcE5TID0gU09BUDEyQ29uc3RhbnRzLlNPQVBfRU5WRUxPUEVfTkFNRVNQQUNFX1VSSTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoY29udGVudFR5cGUuaW5kZXhPZihTT0FQMTFDb25zdGFudHMuU09BUF8xMV9DT05URU5UX1RZUEUpID4gLTEpIHsKLSAgICAgICAgICAgICAgICAvLyBTT0FQIDEuMQotICAgICAgICAgICAgICAgIHNvYXBOUyA9IFNPQVAxMUNvbnN0YW50cy5TT0FQX0VOVkVMT1BFX05BTUVTUEFDRV9VUkk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNvYXBOUzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFeHRyYWN0cyBhbmQgcmV0dXJucyB0aGUgY2hhcmFjdGVyIHNldCBlbmNvZGluZyBmcm9tIHRoZSBDb250ZW50LXR5cGUgaGVhZGVyCi0gICAgICogPHAvPgotICAgICAqIEV4YW1wbGU6ICJDb250ZW50LVR5cGU6IHRleHQveG1sOyBjaGFyc2V0PXV0Zi04IiB3b3VsZCByZXR1cm4gInV0Zi04IgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbnRlbnRUeXBlIGEgY29udGVudC10eXBlIChmcm9tIEhUVFAgb3IgTUlNRSwgZm9yIGluc3RhbmNlKQotICAgICAqIEByZXR1cm4gdGhlIGNoYXJhY3RlciBzZXQgZW5jb2RpbmcgaWYgZm91bmQsIG9yIE1lc3NhZ2VDb250ZXh0LkRFRkFVTFRfQ0hBUl9TRVRfRU5DT0RJTkcKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDaGFyU2V0RW5jb2RpbmcoU3RyaW5nIGNvbnRlbnRUeXBlKSB7Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJJbnB1dCBjb250ZW50VHlwZSAoIiArIGNvbnRlbnRUeXBlICsgIikiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY29udGVudFR5cGUgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gVXNpbmcgdGhlIGRlZmF1bHQgVVRGLTgKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ2hhclNldEVuY29kaW5nIGRlZmF1bHRlZCAoIiArIE1lc3NhZ2VDb250ZXh0LkRFRkFVTFRfQ0hBUl9TRVRfRU5DT0RJTkcgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAiKSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIE1lc3NhZ2VDb250ZXh0LkRFRkFVTFRfQ0hBUl9TRVRfRU5DT0RJTkc7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgaW5kZXggPSBjb250ZW50VHlwZS5pbmRleE9mKEhUVFBDb25zdGFudHMuQ0hBUl9TRVRfRU5DT0RJTkcpOwotCi0gICAgICAgIGlmIChpbmRleCA9PSAtMSkgeyAgICAvLyBDaGFyc2V0IGVuY29kaW5nIG5vdCBmb3VuZCBpbiB0aGUgY29udGVudC10eXBlIGhlYWRlcgotICAgICAgICAgICAgLy8gVXNpbmcgdGhlIGRlZmF1bHQgVVRGLTgKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ2hhclNldEVuY29kaW5nIGRlZmF1bHRlZCAoIiArIE1lc3NhZ2VDb250ZXh0LkRFRkFVTFRfQ0hBUl9TRVRfRU5DT0RJTkcgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAiKSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIE1lc3NhZ2VDb250ZXh0LkRFRkFVTFRfQ0hBUl9TRVRfRU5DT0RJTkc7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBJZiB0aGVyZSBhcmUgc3BhY2VzIGFyb3VuZCB0aGUgJz0nIHNpZ24KLSAgICAgICAgaW50IGluZGV4T2ZFcSA9IGNvbnRlbnRUeXBlLmluZGV4T2YoIj0iLCBpbmRleCk7Ci0KLSAgICAgICAgLy8gVGhlcmUgY2FuIGJlIHNpdHVhdGlvbnMgd2hlcmUgImNoYXJzZXQiIGlzIG5vdCB0aGUgbGFzdCBwYXJhbWV0ZXIgb2YgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXIKLSAgICAgICAgaW50IGluZGV4T2ZTZW1pQ29sb24gPSBjb250ZW50VHlwZS5pbmRleE9mKCI7IiwgaW5kZXhPZkVxKTsKLSAgICAgICAgU3RyaW5nIHZhbHVlOwotCi0gICAgICAgIGlmIChpbmRleE9mU2VtaUNvbG9uID4gMCkgewotICAgICAgICAgICAgdmFsdWUgPSAoY29udGVudFR5cGUuc3Vic3RyaW5nKGluZGV4T2ZFcSArIDEsIGluZGV4T2ZTZW1pQ29sb24pKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHZhbHVlID0gKGNvbnRlbnRUeXBlLnN1YnN0cmluZyhpbmRleE9mRXEgKyAxLCBjb250ZW50VHlwZS5sZW5ndGgoKSkpLnRyaW0oKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFRoZXJlIG1pZ2h0IGJlICIiIGFyb3VuZCB0aGUgdmFsdWUgLSBpZiBzbyByZW1vdmUgdGhlbQotICAgICAgICBpZiAodmFsdWUuaW5kZXhPZignXCInKSAhPSAtMSkgewotICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlQWxsKCJcIiIsICIiKTsKLSAgICAgICAgfQotICAgICAgICB2YWx1ZSA9IHZhbHVlLnRyaW0oKTsKLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIkNoYXJTZXRFbmNvZGluZyBmcm9tIGNvbnRlbnQtdHlwZSAoIiArIHZhbHVlICsgIikiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdEFYQnVpbGRlciBnZXRBdHRhY2htZW50c0J1aWxkZXIoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBpblN0cmVhbSwgU3RyaW5nIGNvbnRlbnRUeXBlU3RyaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNTT0FQKQotICAgICAgICAgICAgdGhyb3dzIE9NRXhjZXB0aW9uLCBYTUxTdHJlYW1FeGNlcHRpb24sIEZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3IgewotICAgICAgICBTdEFYQnVpbGRlciBidWlsZGVyID0gbnVsbDsKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHN0cmVhbVJlYWRlcjsKLQotICAgICAgICBBdHRhY2htZW50cyBhdHRhY2htZW50cyA9IGNyZWF0ZUF0dGFjaG1lbnRzTWFwKG1zZ0NvbnRleHQsIGluU3RyZWFtLCBjb250ZW50VHlwZVN0cmluZyk7Ci0gICAgICAgIFN0cmluZyBjaGFyU2V0RW5jb2RpbmcgPSBnZXRDaGFyU2V0RW5jb2RpbmcoYXR0YWNobWVudHMuZ2V0U09BUFBhcnRDb250ZW50VHlwZSgpKTsKLQotICAgICAgICBpZiAoKGNoYXJTZXRFbmNvZGluZyA9PSBudWxsKQotICAgICAgICAgICAgfHwgIm51bGwiLmVxdWFsc0lnbm9yZUNhc2UoY2hhclNldEVuY29kaW5nKSkgewotICAgICAgICAgICAgY2hhclNldEVuY29kaW5nID0gTWVzc2FnZUNvbnRleHQuVVRGXzg7Ci0gICAgICAgIH0KLSAgICAgICAgbXNnQ29udGV4dC5zZXRQcm9wZXJ0eShDb25zdGFudHMuQ29uZmlndXJhdGlvbi5DSEFSQUNURVJfU0VUX0VOQ09ESU5HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJTZXRFbmNvZGluZyk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFB1c2hiYWNrSW5wdXRTdHJlYW0gcGlzID0gZ2V0UHVzaGJhY2tJbnB1dFN0cmVhbShhdHRhY2htZW50cy5nZXRTT0FQUGFydElucHV0U3RyZWFtKCkpOwotICAgICAgICAgICAgU3RyaW5nIGFjdHVhbENoYXJTZXRFbmNvZGluZyA9IGdldENoYXJTZXRFbmNvZGluZyhwaXMsIGNoYXJTZXRFbmNvZGluZyk7Ci0KLSAgICAgICAgICAgIHN0cmVhbVJlYWRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIocGlzLCBhY3R1YWxDaGFyU2V0RW5jb2RpbmcpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgWE1MU3RyZWFtRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gIFB1dCBhIHJlZmVyZW5jZSB0byBBdHRhY2htZW50cyBNYXAgaW4gdG8gdGhlIG1lc3NhZ2UgY29udGV4dCBGb3IKLSAgICAgICAgLy8gYmFja3dvcmQgY29tcGF0aWJpbGl0eSB3aXRoIEF4aXMyIDEuMCAKLSAgICAgICAgbXNnQ29udGV4dC5zZXRQcm9wZXJ0eShNVE9NQ29uc3RhbnRzLkFUVEFDSE1FTlRTLCBhdHRhY2htZW50cyk7Ci0KLSAgICAgICAgLy8gU2V0dGluZyB0aGUgQXR0YWNobWVudHMgbWFwIHRvIG5ldyBTd0EgQVBJCi0gICAgICAgIG1zZ0NvbnRleHQuc2V0QXR0YWNobWVudE1hcChhdHRhY2htZW50cyk7Ci0KLSAgICAgICAgU3RyaW5nIHNvYXBFbnZlbG9wZU5hbWVzcGFjZVVSSSA9IGdldEVudmVsb3BlTmFtZXNwYWNlKGNvbnRlbnRUeXBlU3RyaW5nKTsKLQotICAgICAgICBpZiAoaXNTT0FQKSB7Ci0gICAgICAgICAgICBpZiAoYXR0YWNobWVudHMuZ2V0QXR0YWNobWVudFNwZWNUeXBlKCkuZXF1YWxzKAotICAgICAgICAgICAgICAgICAgICBNVE9NQ29uc3RhbnRzLk1UT01fVFlQRSkpIHsKLSAgICAgICAgICAgICAgICAvL0NyZWF0ZXMgdGhlIE1UT00gc3BlY2lmaWMgTVRPTVN0QVhTT0FQTW9kZWxCdWlsZGVyCi0gICAgICAgICAgICAgICAgYnVpbGRlciA9IG5ldyBNVE9NU3RBWFNPQVBNb2RlbEJ1aWxkZXIoc3RyZWFtUmVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRzLCBzb2FwRW52ZWxvcGVOYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIG1zZ0NvbnRleHQuc2V0RG9pbmdNVE9NKHRydWUpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChhdHRhY2htZW50cy5nZXRBdHRhY2htZW50U3BlY1R5cGUoKS5lcXVhbHMoCi0gICAgICAgICAgICAgICAgICAgIE1UT01Db25zdGFudHMuU1dBX1RZUEUpKSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlciA9IG5ldyBTdEFYU09BUE1vZGVsQnVpbGRlcihzdHJlYW1SZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2FwRW52ZWxvcGVOYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChhdHRhY2htZW50cy5nZXRBdHRhY2htZW50U3BlY1R5cGUoKS5lcXVhbHMoCi0gICAgICAgICAgICAgICAgICAgIE1UT01Db25zdGFudHMuU1dBX1RZUEVfMTIpKSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlciA9IG5ldyBTdEFYU09BUE1vZGVsQnVpbGRlcihzdHJlYW1SZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2FwRW52ZWxvcGVOYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgICAgLy8gVG8gaGFuZGxlIFJFU1QgWE9QIGNhc2UKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBpZiAoYXR0YWNobWVudHMuZ2V0QXR0YWNobWVudFNwZWNUeXBlKCkuZXF1YWxzKE1UT01Db25zdGFudHMuTVRPTV9UWVBFKSkgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSBuZXcgWE9QQXdhcmVTdEFYT01CdWlsZGVyKHN0cmVhbVJlYWRlciwgYXR0YWNobWVudHMpOwotCi0gICAgICAgICAgICB9IGVsc2UgaWYgKGF0dGFjaG1lbnRzLmdldEF0dGFjaG1lbnRTcGVjVHlwZSgpLmVxdWFscyhNVE9NQ29uc3RhbnRzLlNXQV9UWVBFKSkgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSBuZXcgU3RBWE9NQnVpbGRlcihzdHJlYW1SZWFkZXIpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChhdHRhY2htZW50cy5nZXRBdHRhY2htZW50U3BlY1R5cGUoKS5lcXVhbHMoTVRPTUNvbnN0YW50cy5TV0FfVFlQRV8xMikpIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyID0gbmV3IFN0QVhPTUJ1aWxkZXIoc3RyZWFtUmVhZGVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBidWlsZGVyOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBzdGF0aWMgQXR0YWNobWVudHMgY3JlYXRlQXR0YWNobWVudHNNYXAoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGluU3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNvbnRlbnRUeXBlU3RyaW5nKSB7Ci0gICAgICAgIGJvb2xlYW4gZmlsZUNhY2hlRm9yQXR0YWNobWVudHMgPSBpc0F0dGFjaG1lbnRzQ2FjaGVFbmFibGVkKG1zZ0NvbnRleHQpOwotCi0gICAgICAgIFN0cmluZyBhdHRhY2htZW50UmVwb0RpciA9IG51bGw7Ci0gICAgICAgIFN0cmluZyBhdHRhY2htZW50U2l6ZVRocmVzaG9sZCA9IG51bGw7Ci0KLSAgICAgICAgaWYgKGZpbGVDYWNoZUZvckF0dGFjaG1lbnRzKSB7Ci0gICAgICAgICAgICBPYmplY3QgYXR0YWNobWVudFJlcG9EaXJQcm9wZXJ0eSA9IG1zZ0NvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KENvbnN0YW50cy5Db25maWd1cmF0aW9uLkFUVEFDSE1FTlRfVEVNUF9ESVIpOwotCi0gICAgICAgICAgICBpZiAoYXR0YWNobWVudFJlcG9EaXJQcm9wZXJ0eSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYXR0YWNobWVudFJlcG9EaXIgPSAoU3RyaW5nKWF0dGFjaG1lbnRSZXBvRGlyUHJvcGVydHk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFBhcmFtZXRlciBhdHRhY2htZW50UmVwb0RpclBhcmFtZXRlciA9IG1zZ0NvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRQYXJhbWV0ZXIoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uQVRUQUNITUVOVF9URU1QX0RJUik7Ci0gICAgICAgICAgICAgICAgYXR0YWNobWVudFJlcG9EaXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgKGF0dGFjaG1lbnRSZXBvRGlyUGFyYW1ldGVyICE9IG51bGwpID8gKFN0cmluZylhdHRhY2htZW50UmVwb0RpclBhcmFtZXRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0VmFsdWUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIE9iamVjdCBhdHRhY2htZW50U2l6ZVRocmVzaG9sZFByb3BlcnR5ID0gbXNnQ29udGV4dAotICAgICAgICAgICAgICAgICAgICAuZ2V0UHJvcGVydHkoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uRklMRV9TSVpFX1RIUkVTSE9MRCk7Ci0gICAgICAgICAgICBpZiAoYXR0YWNobWVudFNpemVUaHJlc2hvbGRQcm9wZXJ0eSAhPSBudWxsCi0gICAgICAgICAgICAgICAgJiYgYXR0YWNobWVudFNpemVUaHJlc2hvbGRQcm9wZXJ0eSBpbnN0YW5jZW9mIFN0cmluZykgewotICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRTaXplVGhyZXNob2xkID0gKFN0cmluZylhdHRhY2htZW50U2l6ZVRocmVzaG9sZFByb3BlcnR5OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBQYXJhbWV0ZXIgYXR0YWNobWVudFNpemVUaHJlc2hvbGRQYXJhbWV0ZXIgPSBtc2dDb250ZXh0Ci0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UGFyYW1ldGVyKENvbnN0YW50cy5Db25maWd1cmF0aW9uLkZJTEVfU0laRV9USFJFU0hPTEQpOwotICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRTaXplVGhyZXNob2xkID0gYXR0YWNobWVudFNpemVUaHJlc2hvbGRQYXJhbWV0ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRWYWx1ZSgpLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBHZXQgdGhlIGNvbnRlbnQtbGVuZ3RoIGlmIGl0IGlzIGF2YWlsYWJsZQotICAgICAgICBpbnQgY29udGVudExlbmd0aCA9IDA7Ci0gICAgICAgIE1hcCBoZWFkZXJzID0gKE1hcCltc2dDb250ZXh0LmdldFByb3BlcnR5KE1lc3NhZ2VDb250ZXh0LlRSQU5TUE9SVF9IRUFERVJTKTsKLSAgICAgICAgaWYgKGhlYWRlcnMgIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIGNvbnRlbnRMZW5ndGhWYWx1ZSA9IChTdHJpbmcpaGVhZGVycy5nZXQoSFRUUENvbnN0YW50cy5IRUFERVJfQ09OVEVOVF9MRU5HVEgpOwotICAgICAgICAgICAgaWYgKGNvbnRlbnRMZW5ndGhWYWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgY29udGVudExlbmd0aCA9IG5ldyBJbnRlZ2VyKGNvbnRlbnRMZW5ndGhWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb250ZW50LUxlbmd0aCBpcyBub3QgYSB2YWxpZCBudW1iZXIuICBXaWxsIGFzc3VtZSBpdCBpcyBub3Qgc2V0OiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGlmIChjb250ZW50TGVuZ3RoID4gMCkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ3JlYXRpbmcgYW4gQXR0YWNobWVudHMgbWFwLiAgVGhlIGNvbnRlbnQtbGVuZ3RoIGlzIiArIGNvbnRlbnRMZW5ndGgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkNyZWF0aW5nIGFuIEF0dGFjaG1lbnRzIG1hcC4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY3JlYXRlQXR0YWNobWVudHMobXNnQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluU3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFR5cGVTdHJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlQ2FjaGVGb3JBdHRhY2htZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRSZXBvRGlyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0YWNobWVudFNpemVUaHJlc2hvbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50TGVuZ3RoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBdHRhY2htZW50c0NhY2hlRW5hYmxlZChNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB7Ci0gICAgICAgIE9iamVjdCBjYWNoZUF0dGFjaG1lbnRQcm9wZXJ0eSA9IG1zZ0NvbnRleHQKLSAgICAgICAgICAgICAgICAuZ2V0UHJvcGVydHkoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uQ0FDSEVfQVRUQUNITUVOVFMpOwotICAgICAgICBTdHJpbmcgY2FjaGVBdHRhY2htZW50U3RyaW5nOwotICAgICAgICBib29sZWFuIGZpbGVDYWNoZUZvckF0dGFjaG1lbnRzOwotCi0gICAgICAgIGlmIChjYWNoZUF0dGFjaG1lbnRQcm9wZXJ0eSAhPSBudWxsICYmIGNhY2hlQXR0YWNobWVudFByb3BlcnR5IGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0gICAgICAgICAgICBjYWNoZUF0dGFjaG1lbnRTdHJpbmcgPSAoU3RyaW5nKWNhY2hlQXR0YWNobWVudFByb3BlcnR5OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgUGFyYW1ldGVyIHBhcmFtZXRlcl9jYWNoZV9hdHRhY2htZW50ID0KLSAgICAgICAgICAgICAgICAgICAgbXNnQ29udGV4dC5nZXRQYXJhbWV0ZXIoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uQ0FDSEVfQVRUQUNITUVOVFMpOwotICAgICAgICAgICAgY2FjaGVBdHRhY2htZW50U3RyaW5nID0gKHBhcmFtZXRlcl9jYWNoZV9hdHRhY2htZW50ICE9IG51bGwpID8KLSAgICAgICAgICAgICAgICAgICAgKFN0cmluZylwYXJhbWV0ZXJfY2FjaGVfYXR0YWNobWVudC5nZXRWYWx1ZSgpIDogbnVsbDsKLSAgICAgICAgfQotICAgICAgICBmaWxlQ2FjaGVGb3JBdHRhY2htZW50cyA9IChDb25zdGFudHMuVkFMVUVfVFJVRS5lcXVhbHMoY2FjaGVBdHRhY2htZW50U3RyaW5nKSk7Ci0gICAgICAgIHJldHVybiBmaWxlQ2FjaGVGb3JBdHRhY2htZW50czsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEF0dGFjaG1lbnRzIGNyZWF0ZUF0dGFjaG1lbnRzKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBpblN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjb250ZW50VHlwZVN0cmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZmlsZUNhY2hlRm9yQXR0YWNobWVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYXR0YWNobWVudFJlcG9EaXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYXR0YWNobWVudFNpemVUaHJlc2hvbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29udGVudExlbmd0aCkgewotICAgICAgICBMaWZlY3ljbGVNYW5hZ2VyIG1hbmFnZXIgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgQXhpc0NvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IG1zZ0NvbnRleHQuZ2V0Um9vdENvbnRleHQoKS5nZXRBeGlzQ29uZmlndXJhdGlvbigpOwotICAgICAgICAgICAgbWFuYWdlciA9IChMaWZlY3ljbGVNYW5hZ2VyKWNvbmZpZ3VyYXRpb24KLSAgICAgICAgICAgICAgICAgICAgLmdldFBhcmFtZXRlclZhbHVlKERlcGxveW1lbnRDb25zdGFudHMuQVRUQUNITUVOVFNfTElGRUNZQ0xFX01BTkFHRVIpOwotICAgICAgICAgICAgaWYgKG1hbmFnZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1hbmFnZXIgPSBuZXcgTGlmZWN5Y2xlTWFuYWdlckltcGwoKTsKLSAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uLmFkZFBhcmFtZXRlcihEZXBsb3ltZW50Q29uc3RhbnRzLkFUVEFDSE1FTlRTX0xJRkVDWUNMRV9NQU5BR0VSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJFeGNlcHRpb24gZ2V0dGluZyBBdHRhY2htZW50cyBMaWZlY3ljbGVNYW5hZ2VyIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBBdHRhY2htZW50cyhtYW5hZ2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluU3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlU3RyaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVDYWNoZUZvckF0dGFjaG1lbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRSZXBvRGlyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRTaXplVGhyZXNob2xkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRMZW5ndGgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFV0aWxpdHkgbWV0aG9kIHRvIGdldCBhIFN0QVhCdWlsZGVyCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaW4gYW4gSW5wdXRTdHJlYW0KLSAgICAgKiBAcmV0dXJuIGEgU3RBWFNPQVBNb2RlbEJ1aWxkZXIgZm9yIHRoZSBnaXZlbiBJbnB1dFN0cmVhbQotICAgICAqIEB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uCi0gICAgICogQGRlcHJlY2F0ZWQgSWYgc29tZSBvbmUgcmVhbGx5IG5lZWQgdGhpcyBtZXRob2QsIHBsZWFzZSBzaG91dC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0QVhCdWlsZGVyIGdldEJ1aWxkZXIoUmVhZGVyIGluKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbHJlYWRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoaW4pOwotICAgICAgICByZXR1cm4gbmV3IFN0QVhTT0FQTW9kZWxCdWlsZGVyKHhtbHJlYWRlciwgbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBPTUJ1aWxkZXIgZm9yIGEgcGxhaW4gWE1MIG1lc3NhZ2UuIERlZmF1bHQgY2hhcmFjdGVyIHNldCBlbmNvcmRpbmcgaXMgdXNlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpblN0cmVhbSBJbnB1dFN0cmVhbSBmb3IgYSBYTUwgbWVzc2FnZQotICAgICAqIEByZXR1cm4gSGFuZGxlciB0byBhIE9NQnVpbGRlciBpbXBsZW1lbnRhdGlvbiBpbnN0YW5jZQotICAgICAqIEB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdEFYQnVpbGRlciBnZXRCdWlsZGVyKElucHV0U3RyZWFtIGluU3RyZWFtKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoaW5TdHJlYW0pOwotICAgICAgICByZXR1cm4gbmV3IFN0QVhPTUJ1aWxkZXIoeG1sUmVhZGVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIE9NQnVpbGRlciBmb3IgYSBwbGFpbiBYTUwgbWVzc2FnZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpblN0cmVhbSAgIElucHV0U3RyZWFtIGZvciBhIFhNTCBtZXNzYWdlCi0gICAgICogQHBhcmFtIGNoYXJTZXRFbmMgQ2hhcmFjdGVyIHNldCBlbmNvZGluZyB0byBiZSB1c2VkCi0gICAgICogQHJldHVybiBIYW5kbGVyIHRvIGEgT01CdWlsZGVyIGltcGxlbWVudGF0aW9uIGluc3RhbmNlCi0gICAgICogQHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0QVhCdWlsZGVyIGdldEJ1aWxkZXIoSW5wdXRTdHJlYW0gaW5TdHJlYW0sIFN0cmluZyBjaGFyU2V0RW5jKQotICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKGluU3RyZWFtLCBjaGFyU2V0RW5jKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgU3RBWFNPQVBNb2RlbEJ1aWxkZXIoeG1sUmVhZGVyKTsKLSAgICAgICAgfSBjYXRjaCAoT01FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbG9nLmluZm8oIk9NRXhjZXB0aW9uIGluIGdldFNPQVBCdWlsZGVyIiwgZSk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJSZW1haW5pbmcgaW5wdXQgc3RyZWFtIDpbIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZyhJT1V0aWxzLmdldFN0cmVhbUFzQnl0ZUFycmF5KGluU3RyZWFtKSwgY2hhclNldEVuYykgKyAiXSIpOwotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZTEpIHsKLSAgICAgICAgICAgICAgICAvLyBOb3RoaW5nIGhlcmU/Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBPTUJ1aWxkZXIgZm9yIGEgU09BUCBtZXNzYWdlLiBEZWZhdWx0IGNoYXJhY3RlciBzZXQgZW5jb3JkaW5nIGlzIHVzZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaW5TdHJlYW0gSW5wdXRTdHJlYW0gZm9yIGEgU09BUCBtZXNzYWdlCi0gICAgICogQHJldHVybiBIYW5kbGVyIHRvIGEgT01CdWlsZGVyIGltcGxlbWVudGF0aW9uIGluc3RhbmNlCi0gICAgICogQHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0QVhCdWlsZGVyIGdldFNPQVBCdWlsZGVyKElucHV0U3RyZWFtIGluU3RyZWFtKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoaW5TdHJlYW0pOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBTdEFYU09BUE1vZGVsQnVpbGRlcih4bWxSZWFkZXIpOwotICAgICAgICB9IGNhdGNoIChPTUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBsb2cuaW5mbygiT01FeGNlcHRpb24gaW4gZ2V0U09BUEJ1aWxkZXIiLCBlKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbG9nLmluZm8oIlJlbWFpbmluZyBpbnB1dCBzdHJlYW0gOlsiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nKElPVXRpbHMuZ2V0U3RyZWFtQXNCeXRlQXJyYXkoaW5TdHJlYW0pKSArICJdIik7Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlMSkgewotICAgICAgICAgICAgICAgIC8vIE5vdGhpbmcgaGVyZT8KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIE9NQnVpbGRlciBmb3IgYSBTT0FQIG1lc3NhZ2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaW5TdHJlYW0gICBJbnB1dFN0cmVhbSBmb3IgYSBTT0FQIG1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gY2hhclNldEVuYyBDaGFyYWN0ZXIgc2V0IGVuY29kaW5nIHRvIGJlIHVzZWQKLSAgICAgKiBAcmV0dXJuIEhhbmRsZXIgdG8gYSBPTUJ1aWxkZXIgaW1wbGVtZW50YXRpb24gaW5zdGFuY2UKLSAgICAgKiBAdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RBWEJ1aWxkZXIgZ2V0U09BUEJ1aWxkZXIoSW5wdXRTdHJlYW0gaW5TdHJlYW0sIFN0cmluZyBjaGFyU2V0RW5jKQotICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKGluU3RyZWFtLCBjaGFyU2V0RW5jKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgU3RBWFNPQVBNb2RlbEJ1aWxkZXIoeG1sUmVhZGVyKTsKLSAgICAgICAgfSBjYXRjaCAoT01FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbG9nLmluZm8oIk9NRXhjZXB0aW9uIGluIGdldFNPQVBCdWlsZGVyIiwgZSk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJSZW1haW5pbmcgaW5wdXQgc3RyZWFtIDpbIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZyhJT1V0aWxzLmdldFN0cmVhbUFzQnl0ZUFycmF5KGluU3RyZWFtKSwgY2hhclNldEVuYykgKyAiXSIpOwotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZTEpIHsKLSAgICAgICAgICAgICAgICAvLyBOb3RoaW5nIGhlcmU/Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdEFYQnVpbGRlciBnZXRCdWlsZGVyKFNPQVBGYWN0b3J5IHNvYXBGYWN0b3J5LCBJbnB1dFN0cmVhbSBpbiwgU3RyaW5nIGNoYXJTZXRFbmMpCi0gICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgU3RBWEJ1aWxkZXIgYnVpbGRlcjsKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbHJlYWRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoaW4sIGNoYXJTZXRFbmMpOwotICAgICAgICBidWlsZGVyID0gbmV3IFN0QVhPTUJ1aWxkZXIoc29hcEZhY3RvcnksIHhtbHJlYWRlcik7Ci0gICAgICAgIHJldHVybiBidWlsZGVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluaXRpYWwgd29yayBmb3IgYSBidWlsZGVyIHNlbGVjdG9yIHdoaWNoIHNlbGVjdHMgdGhlIGJ1aWxkZXIgZm9yIGEgZ2l2ZW4gbWVzc2FnZSBmb3JtYXQKLSAgICAgKiBiYXNlZCBvbiB0aGUgdGhlIGNvbnRlbnQgdHlwZSBvZiB0aGUgcmVjaWV2ZWQgbWVzc2FnZS4gY29udGVudC10eXBlIHRvIGJ1aWxkZXIgbWFwcGluZyBjYW4gYmUKLSAgICAgKiBzcGVjaWZpZWQgdGhyb3VnaCB0aGUgQXhpczIueG1sLgotICAgICAqCi0gICAgICogQHBhcmFtIHR5cGUgICAgICAgY29udGVudC10eXBlCi0gICAgICogQHBhcmFtIG1zZ0NvbnRleHQgdGhlIGFjdGl2ZSBNZXNzYWdlQ29udGV4dAotICAgICAqIEByZXR1cm4gdGhlIGJ1aWxkZXIgcmVnaXN0ZXJlZCBhZ2FpbnN0IHRoZSBnaXZlbiBjb250ZW50LXR5cGUKLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBnZXRCdWlsZGVyRnJvbVNlbGVjdG9yKFN0cmluZyB0eXBlLCBNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgCWJvb2xlYW4gdXNlRmFsbGJhY2tCdWlsZGVyID0gZmFsc2U7Ci0gICAgICAgIEF4aXNDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gPQotICAgICAgICAgICAgICAgIG1zZ0NvbnRleHQuZ2V0Q29uZmlndXJhdGlvbkNvbnRleHQoKS5nZXRBeGlzQ29uZmlndXJhdGlvbigpOwotICAgICAgICBQYXJhbWV0ZXIgdXNlRmFsbGJhY2tQYXJhbWV0ZXIgPSBjb25maWd1cmF0aW9uLmdldFBhcmFtZXRlcihDb25zdGFudHMuQ29uZmlndXJhdGlvbi5VU0VfREVGQVVMVF9GQUxMQkFDS19CVUlMREVSKTsKLSAgICAgICAgaWYgKHVzZUZhbGxiYWNrUGFyYW1ldGVyICE9bnVsbCl7Ci0gICAgICAgIAl1c2VGYWxsYmFja0J1aWxkZXIgPSBKYXZhVXRpbHMuaXNUcnVlRXhwbGljaXRseSh1c2VGYWxsYmFja1BhcmFtZXRlci5nZXRWYWx1ZSgpLHVzZUZhbGxiYWNrQnVpbGRlcik7Ci0gICAgICAgIH0KLSAgICAgICAgQnVpbGRlciBidWlsZGVyID0gY29uZmlndXJhdGlvbi5nZXRNZXNzYWdlQnVpbGRlcih0eXBlLHVzZUZhbGxiYWNrQnVpbGRlcik7Ci0gICAgICAgIGlmIChidWlsZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIENoZWNrIHdoZXRoZXIgdGhlIHJlcXVlc3QgaGFzIGEgQWNjZXB0IGhlYWRlciBpZiBzbyB1c2UgdGhhdCBhcyB0aGUgcmVzcG9uc2UKLSAgICAgICAgICAgIC8vIG1lc3NhZ2UgdHlwZS4KLSAgICAgICAgICAgIC8vIElmIHRoYXRzIG5vdCBwcmVzZW50LAotICAgICAgICAgICAgLy8gU2V0dGluZyB0aGUgcmVjZWl2ZWQgY29udGVudC10eXBlIGFzIHRoZSBtZXNzYWdlVHlwZSB0byBtYWtlCi0gICAgICAgICAgICAvLyBzdXJlIHRoYXQgd2UgcmVzcG9uZCB1c2luZyB0aGUgcmVjZWl2ZWQgbWVzc2FnZSBzZXJpYWxpemF0aW9uIGZvcm1hdC4KLQotICAgICAgICAgICAgT2JqZWN0IGNvbnRlbnROZWdvdGlhdGlvbiA9IGNvbmZpZ3VyYXRpb24KLSAgICAgICAgICAgICAgICAgICAgLmdldFBhcmFtZXRlclZhbHVlKENvbnN0YW50cy5Db25maWd1cmF0aW9uLkVOQUJMRV9IVFRQX0NPTlRFTlRfTkVHT1RJQVRJT04pOwotICAgICAgICAgICAgaWYgKEphdmFVdGlscy5pc1RydWVFeHBsaWNpdGx5KGNvbnRlbnROZWdvdGlhdGlvbikpIHsKLSAgICAgICAgICAgICAgICBNYXAgdHJhbnNwb3J0SGVhZGVycyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoTWFwKW1zZ0NvbnRleHQuZ2V0UHJvcGVydHkoTWVzc2FnZUNvbnRleHQuVFJBTlNQT1JUX0hFQURFUlMpOwotICAgICAgICAgICAgICAgIGlmICh0cmFuc3BvcnRIZWFkZXJzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGFjY2VwdEhlYWRlciA9IChTdHJpbmcpdHJhbnNwb3J0SGVhZGVycy5nZXQoSFRUUENvbnN0YW50cy5IRUFERVJfQUNDRVBUKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGFjY2VwdEhlYWRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBhY2NlcHRIZWFkZXIuaW5kZXhPZigiOyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY2VwdEhlYWRlciA9IGFjY2VwdEhlYWRlci5zdWJzdHJpbmcoMCwgaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gc3RyaW5ncyA9IGFjY2VwdEhlYWRlci5zcGxpdCgiLCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgc3RyaW5nIDogc3RyaW5ncykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhY2NlcHQgPSBzdHJpbmcudHJpbSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGRvbnQgd2FudCBkeW5hbWljIGNvbnRlbnQgbmVnb3RvYXRpbiB0byB3b3JrIG9uIHRleHQueG1sIGFzIGl0cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFtYmlndW9zIGFzIHRvIHdoZXRoZXIgdGhlIHVzZXIgcmVxdWVzdHMgU09BUCAxLjEgb3IgUE9YIHJlc3BvbnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFIVFRQQ29uc3RhbnRzLk1FRElBX1RZUEVfVEVYVF9YTUwuZXF1YWxzKGFjY2VwdCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbi5nZXRNZXNzYWdlRm9ybWF0dGVyKGFjY2VwdCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gc3RyaW5nOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1zZ0NvbnRleHQuc2V0UHJvcGVydHkoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uTUVTU0FHRV9UWVBFLCB0eXBlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYnVpbGRlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdmFsaWRhdGVTT0FQVmVyc2lvbihTdHJpbmcgc29hcE5hbWVzcGFjZVVSSUZyb21UcmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09BUEVudmVsb3BlIGVudmVsb3BlKSB7Ci0gICAgICAgIGlmIChzb2FwTmFtZXNwYWNlVVJJRnJvbVRyYW5zcG9ydCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBPTU5hbWVzcGFjZSBlbnZlbG9wZU5hbWVzcGFjZSA9IGVudmVsb3BlLmdldE5hbWVzcGFjZSgpOwotICAgICAgICAgICAgU3RyaW5nIG5hbWVzcGFjZU5hbWUgPSBlbnZlbG9wZU5hbWVzcGFjZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgIGlmICghKHNvYXBOYW1lc3BhY2VVUklGcm9tVHJhbnNwb3J0LmVxdWFscyhuYW1lc3BhY2VOYW1lKSkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU09BUFByb2Nlc3NpbmdFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAiVHJhbnNwb3J0IGxldmVsIGluZm9ybWF0aW9uIGRvZXMgbm90IG1hdGNoIHdpdGggU09BUCIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIiBNZXNzYWdlIG5hbWVzcGFjZSBVUkkiLCBlbnZlbG9wZU5hbWVzcGFjZS5nZXRQcmVmaXgoKSArICI6IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPQVBDb25zdGFudHMuRkFVTFRfQ09ERV9WRVJTSU9OX01JU01BVENIKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB2YWxpZGF0ZUNoYXJTZXRFbmNvZGluZyhTdHJpbmcgY2hhcnNldEVuY29kaW5nRnJvbVRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNoYXJzZXRFbmNvZGluZ0Zyb21YTUwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzb2FwTmFtZXNwYWNlVVJJKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgaWYgKChjaGFyc2V0RW5jb2RpbmdGcm9tWE1MICE9IG51bGwpCi0gICAgICAgICAgICAmJiAhIiIuZXF1YWxzKGNoYXJzZXRFbmNvZGluZ0Zyb21YTUwpCi0gICAgICAgICAgICAmJiAoY2hhcnNldEVuY29kaW5nRnJvbVRyYW5zcG9ydCAhPSBudWxsKQotICAgICAgICAgICAgJiYgIWNoYXJzZXRFbmNvZGluZ0Zyb21YTUwuZXF1YWxzSWdub3JlQ2FzZShjaGFyc2V0RW5jb2RpbmdGcm9tVHJhbnNwb3J0KQotICAgICAgICAgICAgJiYgIWNvbXBhdGlibGVFbmNvZGluZ3MoY2hhcnNldEVuY29kaW5nRnJvbVhNTCwgY2hhcnNldEVuY29kaW5nRnJvbVRyYW5zcG9ydCkpIHsKLSAgICAgICAgICAgIFN0cmluZyBmYXVsdENvZGU7Ci0KLSAgICAgICAgICAgIGlmIChTT0FQMTJDb25zdGFudHMuU09BUF9FTlZFTE9QRV9OQU1FU1BBQ0VfVVJJLmVxdWFscyhzb2FwTmFtZXNwYWNlVVJJKSkgewotICAgICAgICAgICAgICAgIGZhdWx0Q29kZSA9IFNPQVAxMkNvbnN0YW50cy5GQVVMVF9DT0RFX1NFTkRFUjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZmF1bHRDb2RlID0gU09BUDExQ29uc3RhbnRzLkZBVUxUX0NPREVfU0VOREVSOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJDaGFyYWN0ZXIgU2V0IEVuY29kaW5nIGZyb20gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJ0cmFuc3BvcnQgaW5mb3JtYXRpb24gWyIgKyBjaGFyc2V0RW5jb2RpbmdGcm9tVHJhbnNwb3J0ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl0gZG9lcyBub3QgbWF0Y2ggd2l0aCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImNoYXJhY3RlciBzZXQgZW5jb2RpbmcgaW4gdGhlIHJlY2VpdmVkIFNPQVAgbWVzc2FnZSBbIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJzZXRFbmNvZGluZ0Zyb21YTUwgKyAiXSIsIGZhdWx0Q29kZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBjaGVjayBpZiB0aGUgcGFpciBpcyBbVVRGLTE2LFVURi0xNkxFXSBbVVRGLTMyLCBVVEYtMzJMRV0sW1VURi0xNixVVEYtMTZCRV0gW1VURi0zMiwKLSAgICAgKiBVVEYtMzJCRV0gZXRjLgotICAgICAqCi0gICAgICogQHBhcmFtIGVuYzEgZW5jb2Rpbmcgc3R5bGUKLSAgICAgKiBAcGFyYW0gZW5jMiBlbmNvZGluZyBzdHlsZQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZW5jb2Rpbmcgc3R5bGVzIGFyZSBjb21wYXRpYmxlLCBvciBmYWxzZSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGNvbXBhdGlibGVFbmNvZGluZ3MoU3RyaW5nIGVuYzEsIFN0cmluZyBlbmMyKSB7Ci0gICAgICAgIGVuYzEgPSBlbmMxLnRvTG93ZXJDYXNlKCk7Ci0gICAgICAgIGVuYzIgPSBlbmMyLnRvTG93ZXJDYXNlKCk7Ci0gICAgICAgIGlmIChlbmMxLmVuZHNXaXRoKCJiZSIpIHx8IGVuYzEuZW5kc1dpdGgoImxlIikpIHsKLSAgICAgICAgICAgIGVuYzEgPSBlbmMxLnN1YnN0cmluZygwLCBlbmMxLmxlbmd0aCgpIC0gMik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGVuYzIuZW5kc1dpdGgoImJlIikgfHwgZW5jMi5lbmRzV2l0aCgibGUiKSkgewotICAgICAgICAgICAgZW5jMiA9IGVuYzIuc3Vic3RyaW5nKDAsIGVuYzIubGVuZ3RoKCkgLSAyKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZW5jMS5lcXVhbHMoZW5jMik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2J1aWxkZXIvRGF0YVNvdXJjZUJ1aWxkZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9idWlsZGVyL0RhdGFTb3VyY2VCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2ODJlZmQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2J1aWxkZXIvRGF0YVNvdXJjZUJ1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuYnVpbGRlcjsNCi0NCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07DQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07DQotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLmlvLldyaXRlcjsNCi0NCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247DQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOw0KLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5hdHRhY2htZW50cy5pbXBsLkJ1ZmZlclV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTmFtZXNwYWNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NT3V0cHV0Rm9ybWF0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuT01OYW1lc3BhY2VJbXBsOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5PTVNvdXJjZWRFbGVtZW50SW1wbDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsNCi0NCi1wdWJsaWMgY2xhc3MgRGF0YVNvdXJjZUJ1aWxkZXIgaW1wbGVtZW50cyBCdWlsZGVyIHsNCi0NCi0gICAgcHVibGljIE9NRWxlbWVudCBwcm9jZXNzRG9jdW1lbnQoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIFN0cmluZyBjb250ZW50VHlwZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkNCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsNCi0gICAgICAgIG1zZ0NvbnRleHQuc2V0RG9pbmdSRVNUKHRydWUpOw0KLSAgICAgICAgDQotICAgICAgICBPTU5hbWVzcGFjZSBucyA9IG5ldyBPTU5hbWVzcGFjZUltcGwoIiIsICIiKTsNCi0gICAgICAgIE9NRmFjdG9yeSBmYWN0b3J5ID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCk7DQotICAgICAgICBieXRlW10gYnl0ZXM7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOyANCi0gICAgICAgICAgICBCdWZmZXJVdGlscy5pbnB1dFN0cmVhbTJPdXRwdXRTdHJlYW0oaW5wdXRTdHJlYW0sIGJhb3MpOw0KLSAgICAgICAgICAgIGJhb3MuZmx1c2goKTsNCi0gICAgICAgICAgICBieXRlcyA9IGJhb3MudG9CeXRlQXJyYXkoKTsNCi0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICB0aHJvdyBBeGlzRmF1bHQubWFrZUZhdWx0KGUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgQnl0ZUFycmF5RGF0YVNvdXJjZUV4IGRzID0gbmV3IEJ5dGVBcnJheURhdGFTb3VyY2VFeChieXRlcywgY29udGVudFR5cGUpOw0KLSAgICAgICAgcmV0dXJuIG5ldyBPTVNvdXJjZWRFbGVtZW50SW1wbCgiZHVtbXkiLCBucywgZmFjdG9yeSwgZHMpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBjbGFzcyBCeXRlQXJyYXlEYXRhU291cmNlRXggZXh0ZW5kcyBqYXZheC5tYWlsLnV0aWwuQnl0ZUFycmF5RGF0YVNvdXJjZSBpbXBsZW1lbnRzIE9NRGF0YVNvdXJjZSB7DQotICAgICAgICBwcml2YXRlIGJ5dGVbXSBieXRlczsNCi0gICAgDQotICAgICAgICBwdWJsaWMgQnl0ZUFycmF5RGF0YVNvdXJjZUV4KGJ5dGVbXSBieXRlcywgU3RyaW5nIHMpIHsNCi0gICAgICAgICAgICBzdXBlcihieXRlcywgcyk7DQotICAgICAgICAgICAgdGhpcy5ieXRlcyA9IGJ5dGVzOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKE91dHB1dFN0cmVhbSBvdXRwdXQsIE9NT3V0cHV0Rm9ybWF0IGZvcm1hdCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7DQotICAgICAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICAgICAgb3V0cHV0LndyaXRlKGJ5dGVzKTsNCi0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBYTUxTdHJlYW1FeGNlcHRpb24oZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICANCi0gICAgICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldENvbnRlbnRUeXBlKCkgew0KLSAgICAgICAgICAgIHJldHVybiBzdXBlci5nZXRDb250ZW50VHlwZSgpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKFdyaXRlciB3cml0ZXIsIE9NT3V0cHV0Rm9ybWF0IGZvcm1hdCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJGSVhNRSIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKFhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gew0KLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiRklYTUUiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyBYTUxTdHJlYW1SZWFkZXIgZ2V0UmVhZGVyKCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJGSVhNRSIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9idWlsZGVyL0Rpc2tGaWxlRGF0YVNvdXJjZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2J1aWxkZXIvRGlza0ZpbGVEYXRhU291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmYzUyNzguLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2J1aWxkZXIvRGlza0ZpbGVEYXRhU291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmJ1aWxkZXI7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci0KLWltcG9ydCBqYXZheC5hY3RpdmF0aW9uLkRhdGFTb3VyY2U7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuZmlsZXVwbG9hZC5kaXNrLkRpc2tGaWxlSXRlbTsKLQotcHVibGljIGNsYXNzIERpc2tGaWxlRGF0YVNvdXJjZSBpbXBsZW1lbnRzIERhdGFTb3VyY2UgewotCi0gICAgcHJpdmF0ZSBEaXNrRmlsZUl0ZW0gZGlza0ZpbGVJdGVtOwotCi0gICAgcHVibGljIERpc2tGaWxlRGF0YVNvdXJjZShEaXNrRmlsZUl0ZW0gZGlza0ZpbGVJdGVtKSB7Ci0gICAgICAgIHRoaXMuZGlza0ZpbGVJdGVtID0gZGlza0ZpbGVJdGVtOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudFR5cGUoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmRpc2tGaWxlSXRlbS5nZXRDb250ZW50VHlwZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiB0aGlzLmRpc2tGaWxlSXRlbS5nZXRJbnB1dFN0cmVhbSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuZGlza0ZpbGVJdGVtLmdldE5hbWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiB0aGlzLmRpc2tGaWxlSXRlbS5nZXRPdXRwdXRTdHJlYW0oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkZWxldGUoKSB7Ci0gICAgICAgIHRoaXMuZGlza0ZpbGVJdGVtLmRlbGV0ZSgpOwotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9idWlsZGVyL01JTUVCdWlsZGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvYnVpbGRlci9NSU1FQnVpbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmU1NjZjLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9idWlsZGVyL01JTUVCdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuYnVpbGRlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uYXR0YWNobWVudHMuQXR0YWNobWVudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuTVRPTUNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci0KLWltcG9ydCBqYXZheC5tYWlsLmludGVybmV0LkNvbnRlbnRUeXBlOwotaW1wb3J0IGphdmF4Lm1haWwuaW50ZXJuZXQuUGFyc2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotcHVibGljIGNsYXNzIE1JTUVCdWlsZGVyIGltcGxlbWVudHMgQnVpbGRlciB7Ci0KLSAgICBwdWJsaWMgT01FbGVtZW50IHByb2Nlc3NEb2N1bWVudChJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgU3RyaW5nIGNvbnRlbnRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgQXR0YWNobWVudHMgYXR0YWNobWVudHMgPQotICAgICAgICAgICAgICAgIEJ1aWxkZXJVdGlsLmNyZWF0ZUF0dGFjaG1lbnRzTWFwKG1zZ0NvbnRleHQsIGlucHV0U3RyZWFtLCBjb250ZW50VHlwZSk7Ci0gICAgICAgIFN0cmluZyBjaGFyU2V0RW5jb2RpbmcgPQotICAgICAgICAgICAgICAgIEJ1aWxkZXJVdGlsLmdldENoYXJTZXRFbmNvZGluZyhhdHRhY2htZW50cy5nZXRTT0FQUGFydENvbnRlbnRUeXBlKCkpOwotCi0gICAgICAgIGlmICgoY2hhclNldEVuY29kaW5nID09IG51bGwpCi0gICAgICAgICAgICAgICAgfHwgIm51bGwiLmVxdWFsc0lnbm9yZUNhc2UoY2hhclNldEVuY29kaW5nKSkgewotICAgICAgICAgICAgY2hhclNldEVuY29kaW5nID0gTWVzc2FnZUNvbnRleHQuVVRGXzg7Ci0gICAgICAgIH0KLSAgICAgICAgbXNnQ29udGV4dC5zZXRQcm9wZXJ0eShDb25zdGFudHMuQ29uZmlndXJhdGlvbi5DSEFSQUNURVJfU0VUX0VOQ09ESU5HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJTZXRFbmNvZGluZyk7Ci0KLSAgICAgICAgLy8gIFB1dCBhIHJlZmVyZW5jZSB0byBBdHRhY2htZW50cyBNYXAgaW4gdG8gdGhlIG1lc3NhZ2UgY29udGV4dCBGb3IKLSAgICAgICAgLy8gYmFja3dvcmQgY29tcGF0aWJpbGl0eSB3aXRoIEF4aXMyIDEuMCAKLSAgICAgICAgbXNnQ29udGV4dC5zZXRQcm9wZXJ0eShNVE9NQ29uc3RhbnRzLkFUVEFDSE1FTlRTLCBhdHRhY2htZW50cyk7Ci0KLSAgICAgICAgLy8gU2V0dGluZyB0aGUgQXR0YWNobWVudHMgbWFwIHRvIG5ldyBTd0EgQVBJCi0gICAgICAgIG1zZ0NvbnRleHQuc2V0QXR0YWNobWVudE1hcChhdHRhY2htZW50cyk7Ci0gICAgICAgIC8vIFdlIHNldCB0aGUgZm9sbG93aW5nIGZvciBhbGwgdGhlIE1JTUUgbWVzc2FnZXMuLiBXaWxsIGJlIG92ZXJyaWRkZW4KLSAgICAgICAgLy8gYnkgc3Vic2VxdWVudCBidWlsZGVycyhlZzpNVE9NQnVpbGRlcikgaWYgbmVlZGVkLi4KLSAgICAgICAgbXNnQ29udGV4dC5zZXREb2luZ1N3QSh0cnVlKTsKLSAgICAgICAgCi0gICAgICAgIENvbnRlbnRUeXBlIGN0OwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY3QgPSBuZXcgQ29udGVudFR5cGUoY29udGVudFR5cGUpOwotICAgICAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgT01FeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIENvbnRlbnQgVHlwZSBGaWVsZCBpbiB0aGUgTWltZSBNZXNzYWdlIiwgZSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIFN0cmluZyB0eXBlID0gY3QuZ2V0UGFyYW1ldGVyKCJ0eXBlIik7Ci0gICAgICAgIEJ1aWxkZXIgYnVpbGRlciA9Ci0gICAgICAgICAgICAgICAgQnVpbGRlclV0aWwuZ2V0QnVpbGRlckZyb21TZWxlY3Rvcih0eXBlLCBtc2dDb250ZXh0KTsKLSAgICAgICAgaWYoTVRPTUNvbnN0YW50cy5NVE9NX1RZUEUuZXF1YWxzKHR5cGUpKXsKLSAgICAgICAgICAgIFN0cmluZyBzdGFydEluZm8gPSBjdC5nZXRQYXJhbWV0ZXIoInN0YXJ0LWluZm8iKTsKLSAgICAgICAgICAgIGlmKHN0YXJ0SW5mbyAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICB0eXBlID0gc3RhcnRJbmZvOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBidWlsZGVyLnByb2Nlc3NEb2N1bWVudChhdHRhY2htZW50cy5nZXRTT0FQUGFydElucHV0U3RyZWFtKCksCi0gICAgICAgICAgICAgICAgdHlwZSwgbXNnQ29udGV4dCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2J1aWxkZXIvTVRPTUJ1aWxkZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9idWlsZGVyL01UT01CdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxZDc5NzIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2J1aWxkZXIvTVRPTUJ1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5idWlsZGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5hdHRhY2htZW50cy5BdHRhY2htZW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuYnVpbGRlci5TdEFYQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLnV0aWwuU3RBWFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLmltcGwuYnVpbGRlci5NVE9NU3RBWFNPQVBNb2RlbEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUHVzaGJhY2tJbnB1dFN0cmVhbTsKLQotcHVibGljIGNsYXNzIE1UT01CdWlsZGVyIGltcGxlbWVudHMgQnVpbGRlciB7Ci0KLSAgICBwdWJsaWMgT01FbGVtZW50IHByb2Nlc3NEb2N1bWVudChJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgU3RyaW5nIGNvbnRlbnRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0KQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIFhNTFN0cmVhbVJlYWRlciBzdHJlYW1SZWFkZXI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBBdHRhY2htZW50cyBhdHRhY2htZW50cyA9IG1lc3NhZ2VDb250ZXh0LmdldEF0dGFjaG1lbnRNYXAoKTsKLSAgICAgICAgICAgIFN0cmluZyBjaGFyU2V0RW5jb2RpbmcgPSAoU3RyaW5nKSBtZXNzYWdlQ29udGV4dAotICAgICAgICAgICAgLmdldFByb3BlcnR5KENvbnN0YW50cy5Db25maWd1cmF0aW9uLkNIQVJBQ1RFUl9TRVRfRU5DT0RJTkcpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBHZXQgdGhlIGFjdHVhbCBlbmNvZGluZyBieSBsb29raW5nIGF0IHRoZSBCT00gb2YgdGhlIElucHV0U3RyZWFtCi0gICAgICAgICAgICBQdXNoYmFja0lucHV0U3RyZWFtIHBpcyA9IEJ1aWxkZXJVdGlsLmdldFB1c2hiYWNrSW5wdXRTdHJlYW0oaW5wdXRTdHJlYW0pOwotICAgICAgICAgICAgU3RyaW5nIGFjdHVhbENoYXJTZXRFbmNvZGluZyA9IEJ1aWxkZXJVdGlsLmdldENoYXJTZXRFbmNvZGluZyhwaXMsIGNoYXJTZXRFbmNvZGluZyk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIEdldCB0aGUgWE1MU3RyZWFtUmVhZGVyIGZvciB0aGlzIGlucHV0IHN0cmVhbQotICAgICAgICAgICAgc3RyZWFtUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihwaXMsIGFjdHVhbENoYXJTZXRFbmNvZGluZyk7ICAgICAgICAKLSAgICAgICAgICAgIFN0QVhCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgTVRPTVN0QVhTT0FQTW9kZWxCdWlsZGVyKHN0cmVhbVJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgYXR0YWNobWVudHMpOwotICAgICAgICAgICAgU09BUEVudmVsb3BlIGVudmVsb3BlID0gKFNPQVBFbnZlbG9wZSkgYnVpbGRlci5nZXREb2N1bWVudEVsZW1lbnQoKTsKLSAgICAgICAgICAgIEJ1aWxkZXJVdGlsCi0gICAgICAgICAgICAgICAgICAgIC52YWxpZGF0ZVNPQVBWZXJzaW9uKEJ1aWxkZXJVdGlsLmdldEVudmVsb3BlTmFtZXNwYWNlKGNvbnRlbnRUeXBlKSwgZW52ZWxvcGUpOwotICAgICAgICAgICAgQnVpbGRlclV0aWwudmFsaWRhdGVDaGFyU2V0RW5jb2RpbmcoY2hhclNldEVuY29kaW5nLCBidWlsZGVyLmdldERvY3VtZW50KCkKLSAgICAgICAgICAgICAgICAgICAgLmdldENoYXJzZXRFbmNvZGluZygpLCBlbnZlbG9wZS5nZXROYW1lc3BhY2UoKS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgICAgICAvL092ZXJyaWRpbmcgdGhlIGVhcmxpZXIgc2V0dGluZyBieSBNSU1FQnVpbGRlcgotICAgICAgICAgICAgbWVzc2FnZUNvbnRleHQuc2V0RG9pbmdTd0EoZmFsc2UpOwotICAgICAgICAgICAgbWVzc2FnZUNvbnRleHQuc2V0RG9pbmdNVE9NKHRydWUpOwotICAgICAgICAgICAgcmV0dXJuIGVudmVsb3BlOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBBeGlzRmF1bHQubWFrZUZhdWx0KGUpOwotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9idWlsZGVyL011bHRpcGFydEZvcm1EYXRhQnVpbGRlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2J1aWxkZXIvTXVsdGlwYXJ0Rm9ybURhdGFCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3YjI5ZjcuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2J1aWxkZXIvTXVsdGlwYXJ0Rm9ybURhdGFCdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmJ1aWxkZXI7Ci0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXI7Ci1pbXBvcnQgamF2YXguYWN0aXZhdGlvbi5EYXRhU291cmNlOwotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkhUVFBDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLk11bHRpcGxlRW50cnlIYXNoTWFwOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5maWxldXBsb2FkLkZpbGVJdGVtRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuZmlsZXVwbG9hZC5GaWxlVXBsb2FkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5maWxldXBsb2FkLmRpc2suRGlza0ZpbGVJdGVtOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5maWxldXBsb2FkLmRpc2suRGlza0ZpbGVJdGVtRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuZmlsZXVwbG9hZC5zZXJ2bGV0LlNlcnZsZXRGaWxlVXBsb2FkOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5maWxldXBsb2FkLnNlcnZsZXQuU2VydmxldFJlcXVlc3RDb250ZXh0OwotCi1wdWJsaWMgY2xhc3MgTXVsdGlwYXJ0Rm9ybURhdGFCdWlsZGVyIGltcGxlbWVudHMgQnVpbGRlciB7Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGRvY3VtZW50IGVsZW1lbnQuCi0gICAgICovCi0gICAgcHVibGljIE9NRWxlbWVudCBwcm9jZXNzRG9jdW1lbnQoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIFN0cmluZyBjb250ZW50VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCkKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBNdWx0aXBsZUVudHJ5SGFzaE1hcCBwYXJhbWV0ZXJNYXA7Ci0gICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0ID0gKEh0dHBTZXJ2bGV0UmVxdWVzdCkgbWVzc2FnZUNvbnRleHQKLSAgICAgICAgICAgICAgICAuZ2V0UHJvcGVydHkoSFRUUENvbnN0YW50cy5NQ19IVFRQX1NFUlZMRVRSRVFVRVNUKTsKLSAgICAgICAgaWYgKHJlcXVlc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiQ2Fubm90IGNyZWF0ZSBEb2N1bWVudEVsZW1lbnQgd2l0aG91dCBIdHRwU2VydmxldFJlcXVlc3QiKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFRPRE86IERvIGNoZWNrIENvbnRlbnRMZW5ndGggZm9yIHRoZSBtYXggc2l6ZSwKLSAgICAgICAgLy8gICAgICAgYnV0IGl0IGNhbid0IGJlIGNvbmZpZ3VyZWQgYW55d2hlcmUuCi0gICAgICAgIC8vICAgICAgIEkgdGhpbmsgdGhhdCBpdCBjYW50IGJlIGNvbmZpZ3VyZWQgYXQgd2ViLnhtbCBvciBheGlzMi54bWwuCi0KLSAgICAgICAgU3RyaW5nIGNoYXJTZXRFbmNvZGluZyA9IChTdHJpbmcpbWVzc2FnZUNvbnRleHQuZ2V0UHJvcGVydHkoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uQ0hBUkFDVEVSX1NFVF9FTkNPRElORyk7Ci0gICAgICAgIGlmIChjaGFyU2V0RW5jb2RpbmcgPT0gbnVsbCkgewotICAgICAgICAgICAgY2hhclNldEVuY29kaW5nID0gcmVxdWVzdC5nZXRDaGFyYWN0ZXJFbmNvZGluZygpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHBhcmFtZXRlck1hcCA9IGdldFBhcmFtZXRlck1hcChyZXF1ZXN0LCBjaGFyU2V0RW5jb2RpbmcpOwotICAgICAgICAgICAgcmV0dXJuIEJ1aWxkZXJVdGlsLmJ1aWxkc29hcE1lc3NhZ2UobWVzc2FnZUNvbnRleHQsIHBhcmFtZXRlck1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMkZhY3RvcnkoKSk7Ci0KLSAgICAgICAgfSBjYXRjaCAoRmlsZVVwbG9hZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBBeGlzRmF1bHQubWFrZUZhdWx0KGUpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwcml2YXRlIE11bHRpcGxlRW50cnlIYXNoTWFwIGdldFBhcmFtZXRlck1hcChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY2hhclNldEVuY29kaW5nKQotICAgICAgICAgICAgdGhyb3dzIEZpbGVVcGxvYWRFeGNlcHRpb24gewotCi0gICAgICAgIE11bHRpcGxlRW50cnlIYXNoTWFwIHBhcmFtZXRlck1hcCA9IG5ldyBNdWx0aXBsZUVudHJ5SGFzaE1hcCgpOwotCi0gICAgICAgIExpc3QgaXRlbXMgPSBwYXJzZVJlcXVlc3QobmV3IFNlcnZsZXRSZXF1ZXN0Q29udGV4dChyZXF1ZXN0KSk7Ci0gICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSBpdGVtcy5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIERpc2tGaWxlSXRlbSBkaXNrRmlsZUl0ZW0gPSAoRGlza0ZpbGVJdGVtKWl0ZXIubmV4dCgpOwotCi0gICAgICAgICAgICBib29sZWFuIGlzRm9ybUZpZWxkID0gZGlza0ZpbGVJdGVtLmlzRm9ybUZpZWxkKCk7Ci0KLSAgICAgICAgICAgIE9iamVjdCB2YWx1ZTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaWYgKGlzRm9ybUZpZWxkKSB7Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gZ2V0VGV4dFBhcmFtZXRlcihkaXNrRmlsZUl0ZW0sIGNoYXJTZXRFbmNvZGluZyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBnZXRGaWxlUGFyYW1ldGVyKGRpc2tGaWxlSXRlbSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZpbGVVcGxvYWRFeGNlcHRpb24oZXguZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBhcmFtZXRlck1hcC5wdXQoZGlza0ZpbGVJdGVtLmdldEZpZWxkTmFtZSgpLCB2YWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcGFyYW1ldGVyTWFwOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIExpc3QgcGFyc2VSZXF1ZXN0KFNlcnZsZXRSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCkKLSAgICAgICAgICAgIHRocm93cyBGaWxlVXBsb2FkRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gQ3JlYXRlIGEgZmFjdG9yeSBmb3IgZGlzay1iYXNlZCBmaWxlIGl0ZW1zCi0gICAgICAgIEZpbGVJdGVtRmFjdG9yeSBmYWN0b3J5ID0gbmV3IERpc2tGaWxlSXRlbUZhY3RvcnkoKTsKLSAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IGZpbGUgdXBsb2FkIGhhbmRsZXIKLSAgICAgICAgU2VydmxldEZpbGVVcGxvYWQgdXBsb2FkID0gbmV3IFNlcnZsZXRGaWxlVXBsb2FkKGZhY3RvcnkpOwotICAgICAgICAvLyBQYXJzZSB0aGUgcmVxdWVzdAotICAgICAgICByZXR1cm4gdXBsb2FkLnBhcnNlUmVxdWVzdChyZXF1ZXN0Q29udGV4dCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0VGV4dFBhcmFtZXRlcihEaXNrRmlsZUl0ZW0gZGlza0ZpbGVJdGVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNoYXJhY3RlckVuY29kaW5nKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICBTdHJpbmcgZW5jb2RpbmcgPSBkaXNrRmlsZUl0ZW0uZ2V0Q2hhclNldCgpOwotCi0gICAgICAgIGlmIChlbmNvZGluZyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBlbmNvZGluZyA9IGNoYXJhY3RlckVuY29kaW5nOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIHRleHRWYWx1ZTsKLSAgICAgICAgaWYgKGVuY29kaW5nID09IG51bGwpIHsKLSAgICAgICAgICAgIHRleHRWYWx1ZSA9IG5ldyBTdHJpbmcoZGlza0ZpbGVJdGVtLmdldCgpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRleHRWYWx1ZSA9IG5ldyBTdHJpbmcoZGlza0ZpbGVJdGVtLmdldCgpLCBlbmNvZGluZyk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdGV4dFZhbHVlOwotICAgIH0KLQotICAgIHByaXZhdGUgRGF0YUhhbmRsZXIgZ2V0RmlsZVBhcmFtZXRlcihEaXNrRmlsZUl0ZW0gZGlza0ZpbGVJdGVtKQotICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgRGF0YVNvdXJjZSBkYXRhU291cmNlID0gbmV3IERpc2tGaWxlRGF0YVNvdXJjZShkaXNrRmlsZUl0ZW0pOwotICAgICAgICBEYXRhSGFuZGxlciBkYXRhSGFuZGxlciA9IG5ldyBEYXRhSGFuZGxlcihkYXRhU291cmNlKTsKLQotICAgICAgICByZXR1cm4gZGF0YUhhbmRsZXI7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvYnVpbGRlci9TT0FQQnVpbGRlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2J1aWxkZXIvU09BUEJ1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFhZDZkMS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvYnVpbGRlci9TT0FQQnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmJ1aWxkZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuYnVpbGRlci5TdEFYQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLnV0aWwuU3RBWFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5EZXRhY2hhYmxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuaW1wbC5idWlsZGVyLlN0QVhTT0FQTW9kZWxCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlB1c2hiYWNrSW5wdXRTdHJlYW07Ci0KLXB1YmxpYyBjbGFzcyBTT0FQQnVpbGRlciBpbXBsZW1lbnRzIEJ1aWxkZXIgewotCi0gICAgcHVibGljIE9NRWxlbWVudCBwcm9jZXNzRG9jdW1lbnQoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIFN0cmluZyBjb250ZW50VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIFhNTFN0cmVhbVJlYWRlciBzdHJlYW1SZWFkZXI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTdHJpbmcgY2hhclNldEVuY29kaW5nID0gKFN0cmluZykgbWVzc2FnZUNvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KENvbnN0YW50cy5Db25maWd1cmF0aW9uLkNIQVJBQ1RFUl9TRVRfRU5DT0RJTkcpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBBcHBseSBhIGRldGFjaGFibGUgaW5wdXRzdHJlYW0uICBUaGlzIGNhbiBiZSB1c2VkIGxhdGVyCi0gICAgICAgICAgICAvLyB0byAoYSkgZ2V0IHRoZSBsZW5ndGggb2YgdGhlIGluY29taW5nIG1lc3NhZ2Ugb3IgKGIpCi0gICAgICAgICAgICAvLyBmcmVlIHRyYW5zcG9ydCByZXNvdXJjZXMuCi0gICAgICAgICAgICBEZXRhY2hhYmxlSW5wdXRTdHJlYW0gaXMgPSBuZXcgRGV0YWNoYWJsZUlucHV0U3RyZWFtKGlucHV0U3RyZWFtKTsKLSAgICAgICAgICAgIG1lc3NhZ2VDb250ZXh0LnNldFByb3BlcnR5KENvbnN0YW50cy5ERVRBQ0hBQkxFX0lOUFVUX1NUUkVBTSwgaXMpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBHZXQgdGhlIGFjdHVhbCBlbmNvZGluZyBieSBsb29raW5nIGF0IHRoZSBCT00gb2YgdGhlIElucHV0U3RyZWFtCi0gICAgICAgICAgICBQdXNoYmFja0lucHV0U3RyZWFtIHBpcyA9IEJ1aWxkZXJVdGlsLmdldFB1c2hiYWNrSW5wdXRTdHJlYW0oaXMpOwotICAgICAgICAgICAgU3RyaW5nIGFjdHVhbENoYXJTZXRFbmNvZGluZyA9IEJ1aWxkZXJVdGlsLmdldENoYXJTZXRFbmNvZGluZyhwaXMsIGNoYXJTZXRFbmNvZGluZyk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIEdldCB0aGUgWE1MU3RyZWFtUmVhZGVyIGZvciB0aGlzIGlucHV0IHN0cmVhbQotICAgICAgICAgICAgc3RyZWFtUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihwaXMsIGFjdHVhbENoYXJTZXRFbmNvZGluZyk7Ci0KLSAgICAgICAgICAgIFN0QVhCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RBWFNPQVBNb2RlbEJ1aWxkZXIoc3RyZWFtUmVhZGVyKTsKLSAgICAgICAgICAgIFNPQVBFbnZlbG9wZSBlbnZlbG9wZSA9IChTT0FQRW52ZWxvcGUpIGJ1aWxkZXIuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0gICAgICAgICAgICBCdWlsZGVyVXRpbAotICAgICAgICAgICAgICAgICAgICAudmFsaWRhdGVTT0FQVmVyc2lvbihCdWlsZGVyVXRpbC5nZXRFbnZlbG9wZU5hbWVzcGFjZShjb250ZW50VHlwZSksIGVudmVsb3BlKTsKLSAgICAgICAgICAgIEJ1aWxkZXJVdGlsLnZhbGlkYXRlQ2hhclNldEVuY29kaW5nKGNoYXJTZXRFbmNvZGluZywgYnVpbGRlci5nZXREb2N1bWVudCgpCi0gICAgICAgICAgICAgICAgICAgIC5nZXRDaGFyc2V0RW5jb2RpbmcoKSwgZW52ZWxvcGUuZ2V0TmFtZXNwYWNlKCkuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgICAgICAgICAgcmV0dXJuIGVudmVsb3BlOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBBeGlzRmF1bHQubWFrZUZhdWx0KGUpOwotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9idWlsZGVyL1hGb3JtVVJMRW5jb2RlZEJ1aWxkZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9idWlsZGVyL1hGb3JtVVJMRW5jb2RlZEJ1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVjOGE5ZC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvYnVpbGRlci9YRm9ybVVSTEVuY29kZWRCdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmJ1aWxkZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQMTFDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVAxMkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNCaW5kaW5nOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc0JpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzRW5kcG9pbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5XU0RMMjBEZWZhdWx0VmFsdWVIb2xkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5XU0RMMkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmkxOG4uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC51dGlsLlVSSUVuY29kZXJEZWNvZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5NdWx0aXBsZUVudHJ5SGFzaE1hcDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb247Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBYRm9ybVVSTEVuY29kZWRCdWlsZGVyIGltcGxlbWVudHMgQnVpbGRlciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coWEZvcm1VUkxFbmNvZGVkQnVpbGRlci5jbGFzcyk7Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGRvY3VtZW50IGVsZW1lbnQuCi0gICAgICovCi0gICAgcHVibGljIE9NRWxlbWVudCBwcm9jZXNzRG9jdW1lbnQoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIFN0cmluZyBjb250ZW50VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCkKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotCi0gICAgICAgIE11bHRpcGxlRW50cnlIYXNoTWFwIHBhcmFtZXRlck1hcCA9IG5ldyBNdWx0aXBsZUVudHJ5SGFzaE1hcCgpOwotICAgICAgICBTT0FQRmFjdG9yeSBzb2FwRmFjdG9yeTsKLSAgICAgICAgQXhpc0JpbmRpbmdPcGVyYXRpb24gYXhpc0JpbmRpbmdPcGVyYXRpb24gPQotICAgICAgICAgICAgICAgIChBeGlzQmluZGluZ09wZXJhdGlvbikgbWVzc2FnZUNvbnRleHQuZ2V0UHJvcGVydHkoCi0gICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuQVhJU19CSU5ESU5HX09QRVJBVElPTik7Ci0gICAgICAgIFN0cmluZyBxdWVyeVBhcmFtZXRlclNlcGFyYXRvciA9IG51bGw7Ci0gICAgICAgIFN0cmluZyB0ZW1wbGF0ZWRQYXRoID0gbnVsbDsKLSAgICAgICAgaWYgKGF4aXNCaW5kaW5nT3BlcmF0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIHF1ZXJ5UGFyYW1ldGVyU2VwYXJhdG9yID0gKFN0cmluZykgYXhpc0JpbmRpbmdPcGVyYXRpb24KLSAgICAgICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KFdTREwyQ29uc3RhbnRzLkFUVFJfV0hUVFBfUVVFUllfUEFSQU1FVEVSX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICB0ZW1wbGF0ZWRQYXRoID0KLSAgICAgICAgICAgICAgICAgICAgKFN0cmluZykgYXhpc0JpbmRpbmdPcGVyYXRpb24uZ2V0UHJvcGVydHkoV1NETDJDb25zdGFudHMuQVRUUl9XSFRUUF9MT0NBVElPTik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHF1ZXJ5UGFyYW1ldGVyU2VwYXJhdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgIHF1ZXJ5UGFyYW1ldGVyU2VwYXJhdG9yID0KLSAgICAgICAgICAgICAgICAgICAgV1NETDIwRGVmYXVsdFZhbHVlSG9sZGVyLkFUVFJfV0hUVFBfUVVFUllfUEFSQU1FVEVSX1NFUEFSQVRPUl9ERUZBVUxUOwotICAgICAgICB9Ci0KLSAgICAgICAgQXhpc0VuZHBvaW50IGF4aXNFbmRwb2ludCA9Ci0gICAgICAgICAgICAgICAgKEF4aXNFbmRwb2ludCkgbWVzc2FnZUNvbnRleHQuZ2V0UHJvcGVydHkoV1NETDJDb25zdGFudHMuRU5EUE9JTlRfTE9DQUxfTkFNRSk7Ci0gICAgICAgIGlmIChheGlzRW5kcG9pbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgQXhpc0JpbmRpbmcgYXhpc0JpbmRpbmcgPSBheGlzRW5kcG9pbnQuZ2V0QmluZGluZygpOwotICAgICAgICAgICAgU3RyaW5nIHNvYXBWZXJzaW9uID0KLSAgICAgICAgICAgICAgICAgICAgKFN0cmluZykgYXhpc0JpbmRpbmcuZ2V0UHJvcGVydHkoV1NETDJDb25zdGFudHMuQVRUUl9XU09BUF9WRVJTSU9OKTsKLSAgICAgICAgICAgIHNvYXBGYWN0b3J5ID0gZ2V0U09BUEZhY3Rvcnkoc29hcFZlcnNpb24pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc29hcEZhY3RvcnkgPSBnZXRTT0FQRmFjdG9yeShTT0FQMTJDb25zdGFudHMuU09BUF9FTlZFTE9QRV9OQU1FU1BBQ0VfVVJJKTsKLSAgICAgICAgfQotICAgICAgICBFbmRwb2ludFJlZmVyZW5jZSBlbmRwb2ludFJlZmVyZW5jZSA9IG1lc3NhZ2VDb250ZXh0LmdldFRvKCk7Ci0gICAgICAgIGlmIChlbmRwb2ludFJlZmVyZW5jZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJDYW5ub3QgY3JlYXRlIERvY3VtZW50RWxlbWVudCB3aXRob3V0IGRlc3RpbmF0aW9uIEVQUiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIHJlcXVlc3RVUkwgPSBlbmRwb2ludFJlZmVyZW5jZS5nZXRBZGRyZXNzKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXF1ZXN0VVJMID0gZXh0cmFjdFBhcmFtZXRlcnNVc2luZ0h0dHBMb2NhdGlvbih0ZW1wbGF0ZWRQYXRoLCBwYXJhbWV0ZXJNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0VVJMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlQYXJhbWV0ZXJTZXBhcmF0b3IpOwotICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEF4aXNGYXVsdC5tYWtlRmF1bHQoZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgcXVlcnkgPSByZXF1ZXN0VVJMOwotICAgICAgICBpbnQgaW5kZXg7Ci0gICAgICAgIGlmICgoaW5kZXggPSByZXF1ZXN0VVJMLmluZGV4T2YoIj8iKSkgPiAtMSkgewotICAgICAgICAgICAgcXVlcnkgPSByZXF1ZXN0VVJMLnN1YnN0cmluZyhpbmRleCArIDEpOwotICAgICAgICB9Ci0KLSAgICAgICAgZXh0cmFjdFBhcmFtZXRlcnNGcm9tUmVxdWVzdChwYXJhbWV0ZXJNYXAsIHF1ZXJ5LCBxdWVyeVBhcmFtZXRlclNlcGFyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU3RyaW5nKSBtZXNzYWdlQ29udGV4dC5nZXRQcm9wZXJ0eSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5Db25maWd1cmF0aW9uLkNIQVJBQ1RFUl9TRVRfRU5DT0RJTkcpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0U3RyZWFtKTsKLQotCi0gICAgICAgIHJldHVybiBCdWlsZGVyVXRpbC5idWlsZHNvYXBNZXNzYWdlKG1lc3NhZ2VDb250ZXh0LCBwYXJhbWV0ZXJNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvYXBGYWN0b3J5KTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBleHRyYWN0UGFyYW1ldGVyc0Zyb21SZXF1ZXN0KE11bHRpcGxlRW50cnlIYXNoTWFwIHBhcmFtZXRlck1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBxdWVyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBxdWVyeVBhcmFtU2VwYXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGNoYXJzZXRFbmNvZGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElucHV0U3RyZWFtIGlucHV0U3RyZWFtKQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0KLSAgICAgICAgaWYgKHF1ZXJ5ICE9IG51bGwgJiYgISIiLmVxdWFscyhxdWVyeSkpIHsKLQotICAgICAgICAgICAgU3RyaW5nIHBhcnRzW10gPSBxdWVyeS5zcGxpdChxdWVyeVBhcmFtU2VwYXJhdG9yKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpbnQgc2VwYXJhdG9yID0gcGFydHNbaV0uaW5kZXhPZigiPSIpOwotICAgICAgICAgICAgICAgIGlmIChzZXBhcmF0b3IgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IHBhcnRzW2ldLnN1YnN0cmluZyhzZXBhcmF0b3IgKyAxKTsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gVVJJRW5jb2RlckRlY29kZXIuZGVjb2RlKHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBBeGlzRmF1bHQubWFrZUZhdWx0KGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyTWFwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnB1dChwYXJ0c1tpXS5zdWJzdHJpbmcoMCwgc2VwYXJhdG9yKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpbnB1dFN0cmVhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIElucHV0U3RyZWFtUmVhZGVyIGlucHV0U3RyZWFtUmVhZGVyID0KLSAgICAgICAgICAgICAgICAgICAgICAgIG51bGw7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgaW5wdXRTdHJlYW1SZWFkZXIgPSAoSW5wdXRTdHJlYW1SZWFkZXIpIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaW5wdXRTdHJlYW0sIGNoYXJzZXRFbmNvZGluZyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uKSBlLmdldEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBCdWZmZXJlZFJlYWRlciBidWZmZXJlZFJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihpbnB1dFN0cmVhbVJlYWRlcik7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxpbmUgPSBidWZmZXJlZFJlYWRlci5yZWFkTGluZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobGluZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGFydHNbXSA9IGxpbmUuc3BsaXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdTREwyMERlZmF1bHRWYWx1ZUhvbGRlci5BVFRSX1dIVFRQX1FVRVJZX1BBUkFNRVRFUl9TRVBBUkFUT1JfREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcnRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlcGFyYXRvciA9IHBhcnRzW2ldLmluZGV4T2YoIj0iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBwYXJ0c1tpXS5zdWJzdHJpbmcoc2VwYXJhdG9yICsgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyTWFwLnB1dChwYXJ0c1tpXS5zdWJzdHJpbmcoMCwgc2VwYXJhdG9yKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSSUVuY29kZXJEZWNvZGVyLmRlY29kZSh2YWx1ZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhlcmUgaXMgd2hhdCBJIHdpbGwgdHJ5IHRvIGRvIGhlcmUuIEkgd2lsbCBmaXJzdCB0cnkgdG8gaWRlbnRpZnkgdGhlIGxvY2F0aW9uIG9mIHRoZSBmaXJzdAotICAgICAqIHRlbXBsYXRlIGVsZW1lbnQgaW4gdGhlIHJlcXVlc3QgVVJJLiBJIGFtIHRyeWluZyB0byBkZWR1Y2UgdGhlIGxvY2F0aW9uIG9mIHRoYXQgbG9jYXRpb24KLSAgICAgKiB1c2luZyB0aGUgaHR0cExvY2F0aW9uIGVsZW1lbnQgb2YgdGhlIGJpbmRpbmcgKGl0IGlzIHBhc3NlZCBpbiB0byB0aGlzCi0gICAgICogbWV0aG9kKS4KLSAgICAgKiBJZiB0aGVyZSBpcyBhIGNvbnRhbnQgcGFydCBpbiB0aGUgaHR0cExvY2F0aW9uLCB0aGVuIEkgd2lsbCBpZGVudGlmeSBpdC4gRm9yIHRoaXMsIEkgZ2V0Ci0gICAgICogdGhlIGluZGV4IG9mIHssIGZyb20gaHR0cExvY2F0aW9uIHBhcmFtLCBhbmQgd2hhdGV2ZXIgdG8gdGhlIGxlZnQgb2YgaXQgaXMgdGhlIGNvbnRhbnQgcGFydC4KLSAgICAgKiBUaGVuIEkgc2VhcmNoIGZvciB0aGlzIGNvbnN0YW50IHBhcnQgaW5zaWRlIHRoZSB1cmwuIFRoaXMgd2lsbCBnaXZlIHVzIHRoZSBhY2Nlc3MgdG8gdGhlIGZpcnN0Ci0gICAgICogdGVtcGxhdGUgcGFyYW1ldGVyLgotICAgICAqIFRvIGZpbmQgdGhlIGVuZCBvZiB0aGlzIHBhcmFtZXRlciwgd2UgbmVlZCB0byBnZXQgdGhlIGluZGV4IG9mIHRoZSBuZXh0IGNvbnN0YW50LCBmcm9tCi0gICAgICogaHR0cExvY2F0aW9uIGF0dHJpYnV0ZS4gTGlrZXdpc2Ugd2Uga2VlcCBvbiBkaXNjb3ZlcmluZyBwYXJhbWV0ZXJzLgotICAgICAqIDxwLz4KLSAgICAgKiBBc3N1bXB0aW9ucyA6Ci0gICAgICogMS4gVXNlciB3aWxsIGFsd2F5cyBhcHBlbmQgdGhlIHZhbHVlIG9mIGh0dHBMb2NhdGlvbiB0byB0aGUgYWRkcmVzcyBnaXZlbiBpbiB0aGUKLSAgICAgKiBlbmRwb2ludC4KLSAgICAgKiAyLiBJIHdhcyB0YWxraW5nIGFib3V0IHRoZSBjb25zdGFudHMgaW4gdGhlIGh0dHBMb2NhdGlvbi4gVGhvc2UgY29uc3RhbnRzIHdpbGwgbm90IG9jY3VyLAotICAgICAqIHRvIGEgcmVhc29uYWJsZSBleHRlbmQsIGJlZm9yZSB0aGUgY29uc3RhbnQgd2UgYXJlIGxvb2tpbmcgZm9yLgotICAgICAqCi0gICAgICogQHBhcmFtIHRlbXBsYXRlZFBhdGgKLSAgICAgKiBAcGFyYW0gcGFyYW1ldGVyTWFwCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBleHRyYWN0UGFyYW1ldGVyc1VzaW5nSHR0cExvY2F0aW9uKFN0cmluZyB0ZW1wbGF0ZWRQYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdWx0aXBsZUVudHJ5SGFzaE1hcCBwYXJhbWV0ZXJNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyByZXF1ZXN0VVJMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcXVlcnlQYXJhbWV0ZXJTZXBhcmF0b3IpCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0LCBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKLQotCi0gICAgICAgIGlmICh0ZW1wbGF0ZWRQYXRoICE9IG51bGwgJiYgISIiLmVxdWFscyh0ZW1wbGF0ZWRQYXRoKSAmJiB0ZW1wbGF0ZWRQYXRoLmluZGV4T2YoInsiKSA+IC0xKSB7Ci0gICAgICAgICAgICBTdHJpbmdCdWZmZXIgcGF0aFRlbXBsYXRlID0gbmV3IFN0cmluZ0J1ZmZlcih0ZW1wbGF0ZWRQYXRoKTsKLQotICAgICAgICAgICAgLy8gdGhpcyB3aWxsIGhvbGQgdGhlIGluZGV4LCBmcm9tIHdoaWNoIHdlIG5lZWQgdG8gcHJvY2VzcyB0aGUgcmVxdWVzdCBVUkkKLSAgICAgICAgICAgIGludCBzdGFydEluZGV4ID0gMDsKLSAgICAgICAgICAgIGludCB0ZW1wbGF0ZVN0YXJ0SW5kZXggPSAwOwotICAgICAgICAgICAgaW50IHRlbXBsYXRlRW5kSW5kZXggPSAwOwotICAgICAgICAgICAgaW50IGluZGV4T2ZOZXh0Q29uc3RhbnQgPSAwOwotCi0gICAgICAgICAgICBTdHJpbmdCdWZmZXIgcmVxdWVzdFVSSUJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIocmVxdWVzdFVSTCk7Ci0KLSAgICAgICAgICAgIHdoaWxlIChzdGFydEluZGV4IDwgcmVxdWVzdFVSSUJ1ZmZlci5sZW5ndGgoKSkgewotICAgICAgICAgICAgICAgIC8vIHRoaXMgd2lsbCBhbHdheXMgaG9sZCB0aGUgc3RhcnRpbmcgaW5kZXggb2YgYSB0ZW1wbGF0ZSBwYXJhbWV0ZXIKLSAgICAgICAgICAgICAgICB0ZW1wbGF0ZVN0YXJ0SW5kZXggPSBwYXRoVGVtcGxhdGUuaW5kZXhPZigieyIsIHRlbXBsYXRlU3RhcnRJbmRleCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAodGVtcGxhdGVTdGFydEluZGV4ID4gMCkgewotICAgICAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIHByZWNlZGluZyBjb25zdGFudCBwYXJ0IGZyb20gdGhlIHRlbXBsYXRlCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBjb25zdGFudFBhcnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhUZW1wbGF0ZS5zdWJzdHJpbmcodGVtcGxhdGVFbmRJbmRleCArIDEsIHRlbXBsYXRlU3RhcnRJbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN0YW50UGFydCA9IGNvbnN0YW50UGFydC5yZXBsYWNlQWxsKCJcXHtcXHsiLCJ7Iik7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN0YW50UGFydCA9IGNvbnN0YW50UGFydC5yZXBsYWNlQWxsKCJ9fSIsIn0iKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIGluZGV4IG9mIHRoZSBlbmQgb2YgdGhpcyB0ZW1wbGF0ZSBwYXJhbQotICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZUVuZEluZGV4ID0gcGF0aFRlbXBsYXRlLmluZGV4T2YoIn0iLCB0ZW1wbGF0ZVN0YXJ0SW5kZXgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoKHBhdGhUZW1wbGF0ZS5sZW5ndGgoKSAtMSkgPiB0ZW1wbGF0ZUVuZEluZGV4ICYmIHBhdGhUZW1wbGF0ZS5jaGFyQXQodGVtcGxhdGVFbmRJbmRleCArMSkgPT0gJ30nKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZUVuZEluZGV4ID0gcGF0aFRlbXBsYXRlLmluZGV4T2YoIn0iLCB0ZW1wbGF0ZUVuZEluZGV4ICsyKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXJhbWV0ZXJOYW1lID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoVGVtcGxhdGUuc3Vic3RyaW5nKHRlbXBsYXRlU3RhcnRJbmRleCArIDEsIHRlbXBsYXRlRW5kSW5kZXgpOwotICAgICAgICAgICAgICAgICAgICAvLyBuZXh0IHRyeSB0byBmaW5kIHRoZSBuZXh0IGNvbnN0YW50Ci0gICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlU3RhcnRJbmRleCA9IHBhdGhUZW1wbGF0ZS5pbmRleE9mKCJ7IiwgdGVtcGxhdGVFbmRJbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwYXRoVGVtcGxhdGUuY2hhckF0KHRlbXBsYXRlU3RhcnRJbmRleCArMSkgPT0gJ3snKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZVN0YXJ0SW5kZXggPSBwYXRoVGVtcGxhdGUuaW5kZXhPZigieyIsIHRlbXBsYXRlU3RhcnRJbmRleCArMik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpbnQgZW5kSW5kZXhPZkNvbnN0YW50ID0gcmVxdWVzdFVSSUJ1ZmZlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pbmRleE9mKGNvbnN0YW50UGFydCwgaW5kZXhPZk5leHRDb25zdGFudCkgKyBjb25zdGFudFBhcnQubGVuZ3RoKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXBsYXRlU3RhcnRJbmRleCA9PSAtMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXBsYXRlRW5kSW5kZXggPT0gcGF0aFRlbXBsYXRlLmxlbmd0aCgpIC0gMSkgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgbWF5IGhhdmUgb2NjYXRpb25zIHdoZXJlIHdlIGhhdmUgdGVtcGxhdGVzIG9mIHRoZSBmb3JtIGZvby97bmFtZX0uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW4gdGhpcyBjYXNlIHRoZSBuZXh0IGNvbm5zdGFudCB3aWxsIGJlID8gYW5kIG5vdCB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBxdWVyeVBhcmFtZXRlclNlcGFyYXRvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4T2ZOZXh0Q29uc3RhbnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFVSSUJ1ZmZlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaW5kZXhPZigiPyIsIGVuZEluZGV4T2ZDb25zdGFudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4T2ZOZXh0Q29uc3RhbnQgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhPZk5leHRDb25zdGFudCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFVSSUJ1ZmZlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmluZGV4T2YocXVlcnlQYXJhbWV0ZXJTZXBhcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRJbmRleE9mQ29uc3RhbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXhPZk5leHRDb25zdGFudCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkUGFyYW1ldGVyVG9NYXAocGFyYW1ldGVyTWFwLCBwYXJhbWV0ZXJOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0VVJJQnVmZmVyLnN1YnN0cmluZyhlbmRJbmRleE9mQ29uc3RhbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4T2ZOZXh0Q29uc3RhbnQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlcXVlc3RVUkwuc3Vic3RyaW5nKGluZGV4T2ZOZXh0Q29uc3RhbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkUGFyYW1ldGVyVG9NYXAocGFyYW1ldGVyTWFwLCBwYXJhbWV0ZXJOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0VVJJQnVmZmVyLnN1YnN0cmluZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRJbmRleE9mQ29uc3RhbnQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICIiOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0YW50UGFydCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoVGVtcGxhdGUuc3Vic3RyaW5nKHRlbXBsYXRlRW5kSW5kZXggKyAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoVGVtcGxhdGUubGVuZ3RoKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0YW50UGFydCA9IGNvbnN0YW50UGFydC5yZXBsYWNlQWxsKCJcXHtcXHsiLCJ7Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RhbnRQYXJ0ID0gY29uc3RhbnRQYXJ0LnJlcGxhY2VBbGwoIn19IiwifSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4T2ZOZXh0Q29uc3RhbnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFVSSUJ1ZmZlci5pbmRleE9mKGNvbnN0YW50UGFydCwgZW5kSW5kZXhPZkNvbnN0YW50KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZFBhcmFtZXRlclRvTWFwKHBhcmFtZXRlck1hcCwgcGFyYW1ldGVyTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0VVJJQnVmZmVyLnN1YnN0cmluZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZEluZGV4T2ZDb25zdGFudCwgaW5kZXhPZk5leHRDb25zdGFudCkpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcXVlc3RVUklCdWZmZXIubGVuZ3RoKCkgPiBpbmRleE9mTmV4dENvbnN0YW50ICsgMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVxdWVzdFVSSUJ1ZmZlci5zdWJzdHJpbmcoaW5kZXhPZk5leHRDb25zdGFudCArIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgdGhlIG5leHQgY29uc3RhbnQgZnJvbSB0aGUgdGVtcGxhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0YW50UGFydCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhUZW1wbGF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zdWJzdHJpbmcodGVtcGxhdGVFbmRJbmRleCArIDEsIHRlbXBsYXRlU3RhcnRJbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdGFudFBhcnQgPSBjb25zdGFudFBhcnQucmVwbGFjZUFsbCgiXFx7XFx7IiwieyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RhbnRQYXJ0ID0gY29uc3RhbnRQYXJ0LnJlcGxhY2VBbGwoIn19IiwifSIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpbmRleE9mTmV4dENvbnN0YW50ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFVSSUJ1ZmZlci5pbmRleE9mKGNvbnN0YW50UGFydCwgZW5kSW5kZXhPZkNvbnN0YW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZFBhcmFtZXRlclRvTWFwKHBhcmFtZXRlck1hcCwgcGFyYW1ldGVyTmFtZSwgcmVxdWVzdFVSSUJ1ZmZlci5zdWJzdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZEluZGV4T2ZDb25zdGFudCwgaW5kZXhPZk5leHRDb25zdGFudCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRJbmRleCA9IGluZGV4T2ZOZXh0Q29uc3RhbnQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVxdWVzdFVSTDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkUGFyYW1ldGVyVG9NYXAoTXVsdGlwbGVFbnRyeUhhc2hNYXAgcGFyYW1ldGVyTWFwLCBTdHJpbmcgcGFyYW1OYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGFyYW1WYWx1ZSkKLSAgICAgICAgICAgIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBBeGlzRmF1bHQgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcGFyYW1WYWx1ZSA9IFVSSUVuY29kZXJEZWNvZGVyLmRlY29kZShwYXJhbVZhbHVlKTsKLSAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBBeGlzRmF1bHQubWFrZUZhdWx0KGUpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwYXJhbU5hbWUuc3RhcnRzV2l0aChXU0RMMkNvbnN0YW50cy5URU1QTEFURV9FTkNPREVfRVNDQVBJTkdfQ0hBUkFDVEVSKSkgewotICAgICAgICAgICAgcGFyYW1ldGVyTWFwLnB1dChwYXJhbU5hbWUuc3Vic3RyaW5nKDEpLCBwYXJhbVZhbHVlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHBhcmFtZXRlck1hcC5wdXQocGFyYW1OYW1lLCBwYXJhbVZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHJpdmF0ZSBTT0FQRmFjdG9yeSBnZXRTT0FQRmFjdG9yeShTdHJpbmcgbnNVUkkpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBpZiAobnNVUkkgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMkZhY3RvcnkoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChTT0FQMTJDb25zdGFudHMuU09BUF9FTlZFTE9QRV9OQU1FU1BBQ0VfVVJJLmVxdWFscyhuc1VSSSkpIHsKLSAgICAgICAgICAgIHJldHVybiBPTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTJGYWN0b3J5KCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoU09BUDExQ29uc3RhbnRzLlNPQVBfRU5WRUxPUEVfTkFNRVNQQUNFX1VSSS5lcXVhbHMobnNVUkkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDExRmFjdG9yeSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdChNZXNzYWdlcy5nZXRNZXNzYWdlKCJpbnZhbGlkU09BUHZlcnNpb24iKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2J1aWxkZXIvdW5rbm93bmNvbnRlbnQvSW5wdXRTdHJlYW1EYXRhU291cmNlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvYnVpbGRlci91bmtub3duY29udGVudC9JbnB1dFN0cmVhbURhdGFTb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTVhYjFmOC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvYnVpbGRlci91bmtub3duY29udGVudC9JbnB1dFN0cmVhbURhdGFTb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuYnVpbGRlci51bmtub3duY29udGVudDsNCi0NCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07DQotDQotaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRGF0YVNvdXJjZTsNCi0NCi1wdWJsaWMgY2xhc3MgSW5wdXRTdHJlYW1EYXRhU291cmNlIGltcGxlbWVudHMgRGF0YVNvdXJjZSB7DQotDQotICAgIHByaXZhdGUgSW5wdXRTdHJlYW0gaW5TdHJlYW07DQotICAgIA0KLSAgICBwcml2YXRlIFN0cmluZyB0eXBlOw0KLQ0KLSAgICBwdWJsaWMgSW5wdXRTdHJlYW1EYXRhU291cmNlKElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB7DQotICAgICAgICBzdXBlcigpOw0KLSAgICAgICAgdGhpcy5pblN0cmVhbSA9IGlucHV0U3RyZWFtOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFR5cGUoU3RyaW5nIHR5cGUpIHsNCi0gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRDb250ZW50VHlwZSgpIHsNCi0gICAgICAgIGlmICh0eXBlID09IG51bGwpDQotICAgICAgICAgICAgcmV0dXJuICJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iOw0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHJldHVybiB0eXBlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICByZXR1cm4gaW5TdHJlYW07DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgew0KLSAgICAgICAgcmV0dXJuICJJbnB1dFN0cmVhbURhdGFTb3VyY2UiOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBPdXRwdXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiTm90IFN1cHBvcnRlZCIpOw0KLSAgICB9DQotfQ0KLQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9idWlsZGVyL3Vua25vd25jb250ZW50L1Vua25vd25Db250ZW50QnVpbGRlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2J1aWxkZXIvdW5rbm93bmNvbnRlbnQvVW5rbm93bkNvbnRlbnRCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwOTEyMjEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2J1aWxkZXIvdW5rbm93bmNvbnRlbnQvVW5rbm93bkNvbnRlbnRCdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuYnVpbGRlci51bmtub3duY29udGVudDsKLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLWltcG9ydCBqYXZheC5hY3RpdmF0aW9uLkRhdGFIYW5kbGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5PTVNvdXJjZWRFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmJ1aWxkZXIuQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBVbmtub3duQ29udGVudEJ1aWxkZXIgaW1wbGVtZW50cyBCdWlsZGVyIHsKLQotCXB1YmxpYyBPTUVsZW1lbnQgcHJvY2Vzc0RvY3VtZW50KElucHV0U3RyZWFtIGlucHV0U3RyZWFtLAotCQkJU3RyaW5nIGNvbnRlbnRUeXBlLCBNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0KLQkJLy8gdXNpbmcgdGhpcyB0byBmaWd1cmUgb3V0IHdoZXRoZXIgdGhlIHJlY2VpdmVkIGlzIGEgTUlNRSBtZXNzYWdlCi0JCWlmIChtZXNzYWdlQ29udGV4dC5pc0RvaW5nU3dBKCkpIHsKLQkJCVN0cmluZyByb290UGFydENvbnRlbnRJRCA9IG1lc3NhZ2VDb250ZXh0LmF0dGFjaG1lbnRzCi0JCQkJCS5nZXRTT0FQUGFydENvbnRlbnRJRCgpOwotCQkJRGF0YUhhbmRsZXIgcm9vdFBhcnREYXRhSGFuZGxlciA9IG1lc3NhZ2VDb250ZXh0LmF0dGFjaG1lbnRzCi0JCQkJCS5nZXREYXRhSGFuZGxlcihyb290UGFydENvbnRlbnRJRCk7Ci0JCQlVbmtub3duQ29udGVudE9NRGF0YVNvdXJjZSB1bmtub3duQ29udGVudERhdGFTb3VyY2UgPSBuZXcgVW5rbm93bkNvbnRlbnRPTURhdGFTb3VyY2UoCi0JCQkJCXJvb3RQYXJ0RGF0YUhhbmRsZXIpOwotCQkJT01GYWN0b3J5IGZhY3RvcnkgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKTsKLQkJCW1lc3NhZ2VDb250ZXh0LnNldERvaW5nU3dBKGZhbHNlKTsKLQkJCW1lc3NhZ2VDb250ZXh0LnNldERvaW5nTVRPTShmYWxzZSk7Ci0JCQlyZXR1cm4gbmV3IE9NU291cmNlZEVsZW1lbnRJbXBsKAotCQkJCQlVbmtub3duQ29udGVudE9NRGF0YVNvdXJjZS51bmtub3duQ29udGVudFFOYW1lLCBmYWN0b3J5LAotCQkJCQl1bmtub3duQ29udGVudERhdGFTb3VyY2UpOwotCQl9Ci0JCUlucHV0U3RyZWFtRGF0YVNvdXJjZSBpblN0cmVhbURhdGFTb3VyY2UgPSBuZXcgSW5wdXRTdHJlYW1EYXRhU291cmNlKAotCQkJCWlucHV0U3RyZWFtKTsKLQkJaW5TdHJlYW1EYXRhU291cmNlLnNldFR5cGUoY29udGVudFR5cGUpOwotCQlEYXRhSGFuZGxlciBkYXRhSGFuZGxlciA9IG5ldyBEYXRhSGFuZGxlcihpblN0cmVhbURhdGFTb3VyY2UpOwotCQlVbmtub3duQ29udGVudE9NRGF0YVNvdXJjZSB1bmtub3duQ29udGVudERhdGFTb3VyY2UgPSBuZXcgVW5rbm93bkNvbnRlbnRPTURhdGFTb3VyY2UoCi0JCQkJZGF0YUhhbmRsZXIpOwotCQlPTUZhY3RvcnkgZmFjdG9yeSA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpOwotCQlyZXR1cm4gbmV3IE9NU291cmNlZEVsZW1lbnRJbXBsKAotCQkJCVVua25vd25Db250ZW50T01EYXRhU291cmNlLnVua25vd25Db250ZW50UU5hbWUsIGZhY3RvcnksCi0JCQkJdW5rbm93bkNvbnRlbnREYXRhU291cmNlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvYnVpbGRlci91bmtub3duY29udGVudC9Vbmtub3duQ29udGVudE9NRGF0YVNvdXJjZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2J1aWxkZXIvdW5rbm93bmNvbnRlbnQvVW5rbm93bkNvbnRlbnRPTURhdGFTb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGIzMDdmNy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvYnVpbGRlci91bmtub3duY29udGVudC9Vbmtub3duQ29udGVudE9NRGF0YVNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmJ1aWxkZXIudW5rbm93bmNvbnRlbnQ7Ci0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci0KLWltcG9ydCBqYXZheC5hY3RpdmF0aW9uLkRhdGFIYW5kbGVyOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01PdXRwdXRGb3JtYXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTVRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLk1UT01YTUxTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuTWVzc2FnZUZvcm1hdHRlcjsKLQotcHVibGljIGNsYXNzIFVua25vd25Db250ZW50T01EYXRhU291cmNlIGltcGxlbWVudHMgT01EYXRhU291cmNlIHsKLQotCXB1YmxpYyBzdGF0aWMgUU5hbWUgdW5rbm93bkNvbnRlbnRRTmFtZSA9IG5ldyBRTmFtZSgKLQkJCSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMiIsICJVbmtub3duQ29udGVudCIpOwotCi0JRGF0YUhhbmRsZXIgZ2VuZXJpY0NvbnRlbnQ7Ci0JT01FbGVtZW50IHdyYXBwZXJFbGVtZW50OwotCQotCXB1YmxpYyBVbmtub3duQ29udGVudE9NRGF0YVNvdXJjZShEYXRhSGFuZGxlciByb290RGF0YUhhbmRsZXIpIHsKLQkJZ2VuZXJpY0NvbnRlbnQgPSByb290RGF0YUhhbmRsZXI7Ci0JCXdyYXBwZXJFbGVtZW50ID0gY3JlYXRlRWxlbWVudCgpOwotCX0KLQotCXB1YmxpYyBYTUxTdHJlYW1SZWFkZXIgZ2V0UmVhZGVyKCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0JCXJldHVybiB3cmFwcGVyRWxlbWVudC5nZXRYTUxTdHJlYW1SZWFkZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXJpYWxpemUoT3V0cHV0U3RyZWFtIG91dHB1dCwgT01PdXRwdXRGb3JtYXQgZm9ybWF0KQotCQkJdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0JCXdyYXBwZXJFbGVtZW50LnNlcmlhbGl6ZShvdXRwdXQsZm9ybWF0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXJpYWxpemUoV3JpdGVyIHdyaXRlciwgT01PdXRwdXRGb3JtYXQgZm9ybWF0KQotCQkJdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0JCXdyYXBwZXJFbGVtZW50LnNlcmlhbGl6ZSh3cml0ZXIsZm9ybWF0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXJpYWxpemUoWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0JCXdyYXBwZXJFbGVtZW50LnNlcmlhbGl6ZSh4bWxXcml0ZXIpOwotCX0KLQotCXB1YmxpYyBEYXRhSGFuZGxlciBnZXRDb250ZW50KCkgewotCQlyZXR1cm4gZ2VuZXJpY0NvbnRlbnQ7Ci0JfQotCQotCXByaXZhdGUgT01FbGVtZW50IGNyZWF0ZUVsZW1lbnQoKQotCXsKLQkJT01GYWN0b3J5IGZhY3RvcnkgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKTsKLQkJT01UZXh0IHRleHROb2RlID0gZmFjdG9yeS5jcmVhdGVPTVRleHQoZ2VuZXJpY0NvbnRlbnQsIHRydWUpOwotCQlPTUVsZW1lbnQgd3JhcHBlckVsZW1lbnQgPSBmYWN0b3J5LmNyZWF0ZU9NRWxlbWVudCh1bmtub3duQ29udGVudFFOYW1lKTsKLQkJd3JhcHBlckVsZW1lbnQuYWRkQ2hpbGQodGV4dE5vZGUpOwotCQlyZXR1cm4gd3JhcHBlckVsZW1lbnQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsYXNzbG9hZGVyL0Fic3RyYWN0UmVzb3VyY2VIYW5kbGUuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbGFzc2xvYWRlci9BYnN0cmFjdFJlc291cmNlSGFuZGxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiYWRiNjIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsYXNzbG9hZGVyL0Fic3RyYWN0UmVzb3VyY2VIYW5kbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNsYXNzbG9hZGVyOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZTsKLWltcG9ydCBqYXZhLnV0aWwuamFyLkF0dHJpYnV0ZXM7Ci1pbXBvcnQgamF2YS51dGlsLmphci5NYW5pZmVzdDsKLQotLyoqCi0gKiBAdmVyc2lvbiAkUmV2JCAkRGF0ZSQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UmVzb3VyY2VIYW5kbGUgaW1wbGVtZW50cyBSZXNvdXJjZUhhbmRsZSB7Ci0gICAgcHVibGljIGJ5dGVbXSBnZXRCeXRlcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIElucHV0U3RyZWFtIGluID0gZ2V0SW5wdXRTdHJlYW0oKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ5dGVbXSBieXRlcyA9IElvVXRpbC5nZXRCeXRlcyhpbik7Ci0gICAgICAgICAgICByZXR1cm4gYnl0ZXM7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBJb1V0aWwuY2xvc2UoaW4pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIE1hbmlmZXN0IGdldE1hbmlmZXN0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIENlcnRpZmljYXRlW10gZ2V0Q2VydGlmaWNhdGVzKCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXR0cmlidXRlcyBnZXRBdHRyaWJ1dGVzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgTWFuaWZlc3QgbSA9IGdldE1hbmlmZXN0KCk7Ci0gICAgICAgIGlmIChtID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGVudHJ5ID0gZ2V0VXJsKCkuZ2V0RmlsZSgpOwotICAgICAgICByZXR1cm4gbS5nZXRBdHRyaWJ1dGVzKGVudHJ5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gIlsiICsgZ2V0TmFtZSgpICsgIjogIiArIGdldFVybCgpICsgIjsgY29kZSBzb3VyY2U6ICIgKyBnZXRDb2RlU291cmNlVXJsKCkgKyAiXSI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsYXNzbG9hZGVyL0Fic3RyYWN0VXJsUmVzb3VyY2VMb2NhdGlvbi5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsYXNzbG9hZGVyL0Fic3RyYWN0VXJsUmVzb3VyY2VMb2NhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGI1NjQwLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbGFzc2xvYWRlci9BYnN0cmFjdFVybFJlc291cmNlTG9jYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNsYXNzbG9hZGVyOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi0vKioKLSAqIEB2ZXJzaW9uICRSZXYkICREYXRlJAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RVcmxSZXNvdXJjZUxvY2F0aW9uIGltcGxlbWVudHMgUmVzb3VyY2VMb2NhdGlvbiB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBVUkwgY29kZVNvdXJjZTsKLQotICAgIHB1YmxpYyBBYnN0cmFjdFVybFJlc291cmNlTG9jYXRpb24oVVJMIGNvZGVTb3VyY2UpIHsKLSAgICAgICAgdGhpcy5jb2RlU291cmNlID0gY29kZVNvdXJjZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgVVJMIGdldENvZGVTb3VyY2UoKSB7Ci0gICAgICAgIHJldHVybiBjb2RlU291cmNlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotICAgICAgICBpZiAodGhpcyA9PSBvKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKG8gPT0gbnVsbCB8fCBnZXRDbGFzcygpICE9IG8uZ2V0Q2xhc3MoKSkgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIEFic3RyYWN0VXJsUmVzb3VyY2VMb2NhdGlvbiB0aGF0ID0gKEFic3RyYWN0VXJsUmVzb3VyY2VMb2NhdGlvbikgbzsKLSAgICAgICAgcmV0dXJuIGNvZGVTb3VyY2UuZXF1YWxzKHRoYXQuY29kZVNvdXJjZSk7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIGludCBoYXNoQ29kZSgpIHsKLSAgICAgICAgcmV0dXJuIGNvZGVTb3VyY2UuaGFzaENvZGUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gIlsiICsgZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiOiAiICsgY29kZVNvdXJjZSArICJdIjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY2xhc3Nsb2FkZXIvRGlyZWN0b3J5UmVzb3VyY2VIYW5kbGUuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbGFzc2xvYWRlci9EaXJlY3RvcnlSZXNvdXJjZUhhbmRsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWY1ZDRjLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbGFzc2xvYWRlci9EaXJlY3RvcnlSZXNvdXJjZUhhbmRsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoqCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY2xhc3Nsb2FkZXI7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlOwotaW1wb3J0IGphdmEudXRpbC5qYXIuQXR0cmlidXRlczsKLWltcG9ydCBqYXZhLnV0aWwuamFyLk1hbmlmZXN0OwotCi0vKioKLSAqIEB2ZXJzaW9uICRSZXYkICREYXRlJAotICovCi1wdWJsaWMgY2xhc3MgRGlyZWN0b3J5UmVzb3VyY2VIYW5kbGUgZXh0ZW5kcyBBYnN0cmFjdFJlc291cmNlSGFuZGxlIHsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOwotICAgIHByaXZhdGUgZmluYWwgRmlsZSBmaWxlOwotICAgIHByaXZhdGUgZmluYWwgTWFuaWZlc3QgbWFuaWZlc3Q7Ci0gICAgcHJpdmF0ZSBmaW5hbCBVUkwgdXJsOwotICAgIHByaXZhdGUgZmluYWwgVVJMIGNvZGVTb3VyY2U7Ci0KLSAgICBwdWJsaWMgRGlyZWN0b3J5UmVzb3VyY2VIYW5kbGUoU3RyaW5nIG5hbWUsIEZpbGUgZmlsZSwgRmlsZSBjb2RlU291cmNlLCBNYW5pZmVzdCBtYW5pZmVzdCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgICAgIHRoaXMuZmlsZSA9IGZpbGU7Ci0gICAgICAgIHRoaXMuY29kZVNvdXJjZSA9IGNvZGVTb3VyY2UudG9VUkwoKTsKLSAgICAgICAgdGhpcy5tYW5pZmVzdCA9IG1hbmlmZXN0OwotICAgICAgICB1cmwgPSBmaWxlLnRvVVJMKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVVJMIGdldFVybCgpIHsKLSAgICAgICAgcmV0dXJuIHVybDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVVJMIGdldENvZGVTb3VyY2VVcmwoKSB7Ci0gICAgICAgIHJldHVybiBjb2RlU291cmNlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRGlyZWN0b3J5KCkgewotICAgICAgICByZXR1cm4gZmlsZS5pc0RpcmVjdG9yeSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChmaWxlLmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgSW9VdGlsLkVtcHR5SW5wdXRTdHJlYW0oKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldENvbnRlbnRMZW5ndGgoKSB7Ci0gICAgICAgIGlmIChmaWxlLmlzRGlyZWN0b3J5KCkgfHwgZmlsZS5sZW5ndGgoKSA+IEludGVnZXIuTUFYX1ZBTFVFKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gKGludCkgZmlsZS5sZW5ndGgoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBNYW5pZmVzdCBnZXRNYW5pZmVzdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBtYW5pZmVzdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXR0cmlidXRlcyBnZXRBdHRyaWJ1dGVzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKG1hbmlmZXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtYW5pZmVzdC5nZXRBdHRyaWJ1dGVzKGdldE5hbWUoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWx3YXlzIHJldHVybiBudWxsLiAgVGhpcyBjb3VsZCBiZSBpbXBsZW1lbnRkIGJ5IHZlcmlmaW5nIHRoZSBzaWduYXR1cmVzCi0gICAgICogaW4gdGhlIG1hbmlmZXN0IGZpbGUgYWdhaW5zdCB0aGUgYWN0dWFsIGZpbGUsIGJ1dCB3ZSBkb24ndCBuZWVkIHRoaXMgcmlnaHQgbm93LgotICAgICAqIEByZXR1cm4gbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBDZXJ0aWZpY2F0ZVtdIGdldENlcnRpZmljYXRlcygpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsYXNzbG9hZGVyL0RpcmVjdG9yeVJlc291cmNlTG9jYXRpb24uamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbGFzc2xvYWRlci9EaXJlY3RvcnlSZXNvdXJjZUxvY2F0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmYTJiNmIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsYXNzbG9hZGVyL0RpcmVjdG9yeVJlc291cmNlTG9jYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNsYXNzbG9hZGVyOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5qYXIuTWFuaWZlc3Q7Ci0KLS8qKgotICogQHZlcnNpb24gJFJldiQgJERhdGUkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaXJlY3RvcnlSZXNvdXJjZUxvY2F0aW9uIGV4dGVuZHMgQWJzdHJhY3RVcmxSZXNvdXJjZUxvY2F0aW9uIHsKLSAgICBwcml2YXRlIGZpbmFsIEZpbGUgYmFzZURpcjsKLSAgICBwcml2YXRlIGJvb2xlYW4gbWFuaWZlc3RMb2FkZWQgPSBmYWxzZTsKLSAgICBwcml2YXRlIE1hbmlmZXN0IG1hbmlmZXN0OwotCi0gICAgcHVibGljIERpcmVjdG9yeVJlc291cmNlTG9jYXRpb24oRmlsZSBiYXNlRGlyKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIoYmFzZURpci50b1VSTCgpKTsKLSAgICAgICAgdGhpcy5iYXNlRGlyID0gYmFzZURpcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUmVzb3VyY2VIYW5kbGUgZ2V0UmVzb3VyY2VIYW5kbGUoU3RyaW5nIHJlc291cmNlTmFtZSkgewotICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShiYXNlRGlyLCByZXNvdXJjZU5hbWUpOwotICAgICAgICBpZiAoIWZpbGUuZXhpc3RzKCkgfHwgIWlzTG9jYWwoZmlsZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFJlc291cmNlSGFuZGxlIHJlc291cmNlSGFuZGxlID0gbmV3IERpcmVjdG9yeVJlc291cmNlSGFuZGxlKHJlc291cmNlTmFtZSwgZmlsZSwgYmFzZURpciwgZ2V0TWFuaWZlc3RTYWZlKCkpOwotICAgICAgICAgICAgcmV0dXJuIHJlc291cmNlSGFuZGxlOwotICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNMb2NhbChGaWxlIGZpbGUpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFN0cmluZyBiYXNlID0gYmFzZURpci5nZXRDYW5vbmljYWxQYXRoKCk7Ci0gICAgICAgICAgICBTdHJpbmcgcmVsYXRpdmUgPSBmaWxlLmdldENhbm9uaWNhbFBhdGgoKTsKLSAgICAgICAgICAgIHJldHVybiAocmVsYXRpdmUuc3RhcnRzV2l0aChiYXNlKSk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgTWFuaWZlc3QgZ2V0TWFuaWZlc3QoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBpZiAoIW1hbmlmZXN0TG9hZGVkKSB7Ci0gICAgICAgICAgICBGaWxlIG1hbmlmZXN0RmlsZSA9IG5ldyBGaWxlKGJhc2VEaXIsICJNRVRBLUlORi9NQU5JRkVTVC5NRiIpOwotCi0gICAgICAgICAgICBpZiAobWFuaWZlc3RGaWxlLmlzRmlsZSgpICYmIG1hbmlmZXN0RmlsZS5jYW5SZWFkKCkpIHsKLSAgICAgICAgICAgICAgICBGaWxlSW5wdXRTdHJlYW0gaW4gPSBudWxsOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShtYW5pZmVzdEZpbGUpOwotICAgICAgICAgICAgICAgICAgICBtYW5pZmVzdCA9IG5ldyBNYW5pZmVzdChpbik7Ci0gICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgSW9VdGlsLmNsb3NlKGluKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYW5pZmVzdExvYWRlZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1hbmlmZXN0OwotICAgIH0KLQotICAgIHByaXZhdGUgTWFuaWZlc3QgZ2V0TWFuaWZlc3RTYWZlKCkgewotICAgICAgICBNYW5pZmVzdCBtYW5pZmVzdCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtYW5pZmVzdCA9IGdldE1hbmlmZXN0KCk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIGlnbm9yZQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtYW5pZmVzdDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY2xhc3Nsb2FkZXIvSW9VdGlsLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY2xhc3Nsb2FkZXIvSW9VdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3NzNhNTUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsYXNzbG9hZGVyL0lvVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLS8qKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNsYXNzbG9hZGVyOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uV3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5qYXIuSmFyRmlsZTsKLQotLyoqCi0gKiBAdmVyc2lvbiAkUmV2JCAkRGF0ZSQKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIElvVXRpbCB7Ci0gICAgcHJpdmF0ZSBJb1V0aWwoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBieXRlW10gZ2V0Qnl0ZXMoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbNDA5Nl07Ci0gICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICAgICAgZm9yIChpbnQgY291bnQgPSBpbnB1dFN0cmVhbS5yZWFkKGJ1ZmZlcik7IGNvdW50ID49IDA7IGNvdW50ID0gaW5wdXRTdHJlYW0ucmVhZChidWZmZXIpKSB7Ci0gICAgICAgICAgICAgICAgb3V0LndyaXRlKGJ1ZmZlciwgMCwgY291bnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnl0ZVtdIGJ5dGVzID0gb3V0LnRvQnl0ZUFycmF5KCk7Ci0gICAgICAgICAgICByZXR1cm4gYnl0ZXM7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBjbG9zZShpbnB1dFN0cmVhbSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZmx1c2goT3V0cHV0U3RyZWFtIHRoaW5nKSB7Ci0gICAgICAgIGlmICh0aGluZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHRoaW5nLmZsdXNoKCk7Ci0gICAgICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBpZ25vcmVkKSB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZmx1c2goV3JpdGVyIHRoaW5nKSB7Ci0gICAgICAgIGlmICh0aGluZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHRoaW5nLmZsdXNoKCk7Ci0gICAgICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBpZ25vcmVkKSB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY2xvc2UoSmFyRmlsZSB0aGluZykgewotICAgICAgICBpZiAodGhpbmcgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICB0aGluZy5jbG9zZSgpOwotICAgICAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gaWdub3JlZCkgewotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGNsb3NlKElucHV0U3RyZWFtIHRoaW5nKSB7Ci0gICAgICAgIGlmICh0aGluZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHRoaW5nLmNsb3NlKCk7Ci0gICAgICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBpZ25vcmVkKSB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY2xvc2UoT3V0cHV0U3RyZWFtIHRoaW5nKSB7Ci0gICAgICAgIGlmICh0aGluZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHRoaW5nLmNsb3NlKCk7Ci0gICAgICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBpZ25vcmVkKSB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY2xvc2UoUmVhZGVyIHRoaW5nKSB7Ci0gICAgICAgIGlmICh0aGluZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHRoaW5nLmNsb3NlKCk7Ci0gICAgICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBpZ25vcmVkKSB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY2xvc2UoV3JpdGVyIHRoaW5nKSB7Ci0gICAgICAgIGlmICh0aGluZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHRoaW5nLmNsb3NlKCk7Ci0gICAgICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBpZ25vcmVkKSB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEVtcHR5SW5wdXRTdHJlYW0gZXh0ZW5kcyBJbnB1dFN0cmVhbSB7Ci0gICAgICAgIHB1YmxpYyBpbnQgcmVhZCgpIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgcmVhZChieXRlIGJbXSkgIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgcmVhZChieXRlIGJbXSwgaW50IG9mZiwgaW50IGxlbikgewotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGxvbmcgc2tpcChsb25nIG4pIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBhdmFpbGFibGUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgewotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIG1hcmsoaW50IHJlYWRsaW1pdCkgewotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlc2V0KCkgewotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gbWFya1N1cHBvcnRlZCgpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbGFzc2xvYWRlci9KYXJGaWxlQ2xhc3NMb2FkZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbGFzc2xvYWRlci9KYXJGaWxlQ2xhc3NMb2FkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU0YjE2ZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY2xhc3Nsb2FkZXIvSmFyRmlsZUNsYXNzTG9hZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDUgKzAsMCBAQAotLyoqCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY2xhc3Nsb2FkZXI7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEubmV0LlVSTENsYXNzTG9hZGVyOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbENvbnRleHQ7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuQ29kZVNvdXJjZTsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb247Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGU7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5qYXIuQXR0cmlidXRlczsKLWltcG9ydCBqYXZhLnV0aWwuamFyLk1hbmlmZXN0OwotCi0vKioKLSAqIFRoZSBKYXJGaWxlQ2xhc3NMb2FkZXIgdGhhdCBsb2FkcyBjbGFzc2VzIGFuZCByZXNvdXJjZXMgZnJvbSBhIGxpc3Qgb2YgSmFyRmlsZXMuICBUaGlzIG1ldGhvZCBpcyBzaW1taWxhciB0byBVUkxDbGFzc0xvYWRlcgotICogZXhjZXB0IGl0IHByb3Blcmx5IGNsb3NlcyBKYXJGaWxlcyB3aGVuIHRoZSBjbGFzc2xvYWRlciBpcyBkZXN0cm95ZWQgc28gdGhhdCB0aGUgZmlsZSByZWFkIGxvY2sgd2lsbCBiZSByZWxlYXNlZCwgYW5kCi0gKiB0aGUgamFyIGZpbGUgY2FuIGJlIG1vZGlmaWVkIGFuZCBkZWxldGVkLgotICogPHA+Ci0gKgotICogQHZlcnNpb24gJFJldiQgJERhdGUkCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXJGaWxlQ2xhc3NMb2FkZXIgZXh0ZW5kcyBNdWx0aVBhcmVudENsYXNzTG9hZGVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBVUkxbXSBFTVBUWV9VUkxTID0gbmV3IFVSTFswXTsKLQotICAgIHByaXZhdGUgZmluYWwgVXJsUmVzb3VyY2VGaW5kZXIgcmVzb3VyY2VGaW5kZXIgPSBuZXcgVXJsUmVzb3VyY2VGaW5kZXIoKTsKLSAgICBwcml2YXRlIGZpbmFsIEFjY2Vzc0NvbnRyb2xDb250ZXh0IGFjYzsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBKYXJGaWxlQ2xhc3NMb2FkZXIgdGhhdCBpcyBhIGNoaWxkIG9mIHRoZSBzeXN0ZW0gY2xhc3MgbG9hZGVyLgotICAgICAqIEBwYXJhbSB1cmxzIGEgbGlzdCBvZiBVUkxzIGZyb20gd2hpY2ggY2xhc3NlcyBhbmQgcmVzb3VyY2VzIHNob3VsZCBiZSBsb2FkZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgSmFyRmlsZUNsYXNzTG9hZGVyKFVSTFtdIHVybHMpIHsKLSAgICAgICAgc3VwZXIoRU1QVFlfVVJMUyk7Ci0gICAgICAgIHRoaXMuYWNjID0gQWNjZXNzQ29udHJvbGxlci5nZXRDb250ZXh0KCk7Ci0gICAgICAgIGFkZFVSTHModXJscyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIEphckZpbGVDbGFzc0xvYWRlciB0aGF0IGlzIGEgY2hpbGQgb2YgdGhlIHNwZWNpZmllZCBjbGFzcyBsb2FkZXIuCi0gICAgICogQHBhcmFtIHVybHMgYSBsaXN0IG9mIFVSTHMgZnJvbSB3aGljaCBjbGFzc2VzIGFuZCByZXNvdXJjZXMgc2hvdWxkIGJlIGxvYWRlZAotICAgICAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBvZiB0aGlzIGNsYXNzIGxvYWRlcgotICAgICAqLwotICAgIHB1YmxpYyBKYXJGaWxlQ2xhc3NMb2FkZXIoVVJMW10gdXJscywgQ2xhc3NMb2FkZXIgcGFyZW50KSB7Ci0gICAgICAgIHN1cGVyKEVNUFRZX1VSTFMsIHBhcmVudCk7Ci0gICAgICAgIHRoaXMuYWNjID0gQWNjZXNzQ29udHJvbGxlci5nZXRDb250ZXh0KCk7Ci0gICAgICAgIGFkZFVSTHModXJscyk7Ci0gICAgfQotCi0gICAgcHVibGljIEphckZpbGVDbGFzc0xvYWRlcihVUkxbXSB1cmxzLCBDbGFzc0xvYWRlciBwYXJlbnQsIGJvb2xlYW4gaW52ZXJzZUNsYXNzTG9hZGluZywgU3RyaW5nW10gaGlkZGVuQ2xhc3NlcywgU3RyaW5nW10gbm9uT3ZlcnJpZGFibGVDbGFzc2VzKSB7Ci0gICAgICAgIHN1cGVyKEVNUFRZX1VSTFMsIHBhcmVudCwgaW52ZXJzZUNsYXNzTG9hZGluZywgaGlkZGVuQ2xhc3Nlcywgbm9uT3ZlcnJpZGFibGVDbGFzc2VzKTsKLSAgICAgICAgdGhpcy5hY2MgPSBBY2Nlc3NDb250cm9sbGVyLmdldENvbnRleHQoKTsKLSAgICAgICAgYWRkVVJMcyh1cmxzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmFtZWQgY2xhc3MgbG9hZGVyIGFzIGEgY2hpbGQgb2YgdGhlIHNwZWNpZmllZCBwYXJlbnRzLgotICAgICAqIEBwYXJhbSB1cmxzIHRoZSB1cmxzIGZyb20gd2hpY2ggdGhpcyBjbGFzcyBsb2FkZXIgd2lsbCBjbGFzc2VzIGFuZCByZXNvdXJjZXMKLSAgICAgKiBAcGFyYW0gcGFyZW50cyB0aGUgcGFyZW50cyBvZiB0aGlzIGNsYXNzIGxvYWRlcgotICAgICAqLwotICAgIHB1YmxpYyBKYXJGaWxlQ2xhc3NMb2FkZXIoVVJMW10gdXJscywgQ2xhc3NMb2FkZXJbXSBwYXJlbnRzKSB7Ci0gICAgICAgIHN1cGVyKEVNUFRZX1VSTFMsIHBhcmVudHMpOwotICAgICAgICB0aGlzLmFjYyA9IEFjY2Vzc0NvbnRyb2xsZXIuZ2V0Q29udGV4dCgpOwotICAgICAgICBhZGRVUkxzKHVybHMpOwotICAgIH0KLQotICAgIHB1YmxpYyBKYXJGaWxlQ2xhc3NMb2FkZXIoVVJMW10gdXJscywgQ2xhc3NMb2FkZXJbXSBwYXJlbnRzLCBib29sZWFuIGludmVyc2VDbGFzc0xvYWRpbmcsIENvbGxlY3Rpb24gaGlkZGVuQ2xhc3NlcywgQ29sbGVjdGlvbiBub25PdmVycmlkYWJsZUNsYXNzZXMpIHsKLSAgICAgICAgc3VwZXIoRU1QVFlfVVJMUywgcGFyZW50cywgaW52ZXJzZUNsYXNzTG9hZGluZywgaGlkZGVuQ2xhc3Nlcywgbm9uT3ZlcnJpZGFibGVDbGFzc2VzKTsKLSAgICAgICAgdGhpcy5hY2MgPSBBY2Nlc3NDb250cm9sbGVyLmdldENvbnRleHQoKTsKLSAgICAgICAgYWRkVVJMcyh1cmxzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSmFyRmlsZUNsYXNzTG9hZGVyKFVSTFtdIHVybHMsIENsYXNzTG9hZGVyW10gcGFyZW50cywgYm9vbGVhbiBpbnZlcnNlQ2xhc3NMb2FkaW5nLCBTdHJpbmdbXSBoaWRkZW5DbGFzc2VzLCBTdHJpbmdbXSBub25PdmVycmlkYWJsZUNsYXNzZXMpIHsKLSAgICAgICAgc3VwZXIoRU1QVFlfVVJMUywgcGFyZW50cywgaW52ZXJzZUNsYXNzTG9hZGluZywgaGlkZGVuQ2xhc3Nlcywgbm9uT3ZlcnJpZGFibGVDbGFzc2VzKTsKLSAgICAgICAgdGhpcy5hY2MgPSBBY2Nlc3NDb250cm9sbGVyLmdldENvbnRleHQoKTsKLSAgICAgICAgYWRkVVJMcyh1cmxzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSmFyRmlsZUNsYXNzTG9hZGVyKEphckZpbGVDbGFzc0xvYWRlciBzb3VyY2UpIHsKLSAgICAgICAgc3VwZXIoc291cmNlKTsKLSAgICAgICAgdGhpcy5hY2MgPSBBY2Nlc3NDb250cm9sbGVyLmdldENvbnRleHQoKTsKLSAgICAgICAgYWRkVVJMcyhzb3VyY2UuZ2V0VVJMcygpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIENsYXNzTG9hZGVyIGNvcHkoQ2xhc3NMb2FkZXIgc291cmNlKSB7Ci0gICAgICAgIGlmIChzb3VyY2UgaW5zdGFuY2VvZiBKYXJGaWxlQ2xhc3NMb2FkZXIpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgSmFyRmlsZUNsYXNzTG9hZGVyKChKYXJGaWxlQ2xhc3NMb2FkZXIpIHNvdXJjZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc291cmNlIGluc3RhbmNlb2YgTXVsdGlQYXJlbnRDbGFzc0xvYWRlcikgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBNdWx0aVBhcmVudENsYXNzTG9hZGVyKChNdWx0aVBhcmVudENsYXNzTG9hZGVyKSBzb3VyY2UpOwotICAgICAgICB9IGVsc2UgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIFVSTENsYXNzTG9hZGVyKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFVSTENsYXNzTG9hZGVyKCgoVVJMQ2xhc3NMb2FkZXIpc291cmNlKS5nZXRVUkxzKCksIHNvdXJjZS5nZXRQYXJlbnQoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFVSTENsYXNzTG9hZGVyKG5ldyBVUkxbMF0sIHNvdXJjZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBDbGFzc0xvYWRlciBjb3B5KCkgewotICAgICAgICByZXR1cm4gSmFyRmlsZUNsYXNzTG9hZGVyLmNvcHkodGhpcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIHB1YmxpYyBVUkxbXSBnZXRVUkxzKCkgewotICAgICAgICByZXR1cm4gcmVzb3VyY2VGaW5kZXIuZ2V0VXJscygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRVUkwoZmluYWwgVVJMIHVybCkgewotICAgICAgICBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEFjdGlvbigpIHsKLSAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgewotICAgICAgICAgICAgICAgIHJlc291cmNlRmluZGVyLmFkZFVybCh1cmwpOwotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9LCBhY2MpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYW4gYXJyYXkgb2YgdXJscyB0byB0aGUgZW5kIG9mIHRoaXMgY2xhc3MgbG9hZGVyLgotICAgICAqIEBwYXJhbSB1cmxzIHRoZSBVUkxzIHRvIGFkZAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGFkZFVSTHMoZmluYWwgVVJMW10gdXJscykgewotICAgICAgICBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEFjdGlvbigpIHsKLSAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgewotICAgICAgICAgICAgICAgIHJlc291cmNlRmluZGVyLmFkZFVybHModXJscyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0sIGFjYyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRlc3Ryb3koKSB7Ci0gICAgICAgIHJlc291cmNlRmluZGVyLmRlc3Ryb3koKTsKLSAgICAgICAgc3VwZXIuZGVzdHJveSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBwdWJsaWMgVVJMIGZpbmRSZXNvdXJjZShmaW5hbCBTdHJpbmcgcmVzb3VyY2VOYW1lKSB7Ci0gICAgICAgIHJldHVybiAoVVJMKSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEFjdGlvbigpIHsKLSAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgewotICAgICAgICAgICAgICAgIHJldHVybiByZXNvdXJjZUZpbmRlci5maW5kUmVzb3VyY2UocmVzb3VyY2VOYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSwgYWNjKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIEVudW1lcmF0aW9uPFVSTD4gaW50ZXJuYWxmaW5kUmVzb3VyY2VzKGZpbmFsIFN0cmluZyBuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkQWN0aW9uPEVudW1lcmF0aW9uPFVSTD4+KCkgewotICAgICAgICAgICAgcHVibGljIEVudW1lcmF0aW9uPFVSTD4gcnVuKCkgewotICAgICAgICAgICAgICAgIHJldHVybiByZXNvdXJjZUZpbmRlci5maW5kUmVzb3VyY2VzKG5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9LCBhY2MpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGZpbmRMaWJyYXJ5KFN0cmluZyBsaWJyYXJ5TmFtZSkgewotICAgICAgICAvLyBpZiB0aGUgbGlicmFyeU5hbWUgaXMgYWN0dWFsbHkgYSBkaXJlY3RvcnkgaXQgaXMgaW52YWxpZAotICAgICAgICBpbnQgcGF0aEVuZCA9IGxpYnJhcnlOYW1lLmxhc3RJbmRleE9mKCcvJyk7Ci0gICAgICAgIGlmIChwYXRoRW5kID09IGxpYnJhcnlOYW1lLmxlbmd0aCgpIC0gMSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibGlicmFyeU5hbWUgZW5kcyB3aXRoIGEgJy8nIGNoYXJhY3RlcjogIiArIGxpYnJhcnlOYW1lKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGdldCB0aGUgbmFtZSBpZiB0aGUgbGlicmFyeSBmaWxlCi0gICAgICAgIGZpbmFsIFN0cmluZyByZXNvdXJjZU5hbWU7Ci0gICAgICAgIGlmIChwYXRoRW5kIDwgMCkgewotICAgICAgICAgICAgcmVzb3VyY2VOYW1lID0gU3lzdGVtLm1hcExpYnJhcnlOYW1lKGxpYnJhcnlOYW1lKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFN0cmluZyBwYXRoID0gbGlicmFyeU5hbWUuc3Vic3RyaW5nKDAsIHBhdGhFbmQgKyAxKTsKLSAgICAgICAgICAgIFN0cmluZyBmaWxlID0gbGlicmFyeU5hbWUuc3Vic3RyaW5nKHBhdGhFbmQgKyAxKTsKLSAgICAgICAgICAgIHJlc291cmNlTmFtZSA9IHBhdGggKyBTeXN0ZW0ubWFwTGlicmFyeU5hbWUoZmlsZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBnZXQgYSByZXNvdXJjZSBoYW5kbGUgdG8gdGhlIGxpYnJhcnkKLSAgICAgICAgUmVzb3VyY2VIYW5kbGUgcmVzb3VyY2VIYW5kbGUgPSAoUmVzb3VyY2VIYW5kbGUpIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkQWN0aW9uKCkgewotICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc291cmNlRmluZGVyLmdldFJlc291cmNlKHJlc291cmNlTmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0sIGFjYyk7Ci0KLSAgICAgICAgaWYgKHJlc291cmNlSGFuZGxlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gdGhlIGxpYnJhcnkgbXVzdCBiZSBhY2Nlc3NhYmxlIG9uIHRoZSBmaWxlIHN5c3RlbQotICAgICAgICBVUkwgdXJsID0gcmVzb3VyY2VIYW5kbGUuZ2V0VXJsKCk7Ci0gICAgICAgIGlmICghImZpbGUiLmVxdWFscyh1cmwuZ2V0UHJvdG9jb2woKSkpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBGaWxlKFVSSS5jcmVhdGUodXJsLnRvU3RyaW5nKCkpKS5nZXRQYXRoKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIHByb3RlY3RlZCBDbGFzcyBmaW5kQ2xhc3MoZmluYWwgU3RyaW5nIGNsYXNzTmFtZSkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIChDbGFzcykgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGZpcnN0IHRoaW5rIGNoZWNrIGlmIHdlIGFyZSBhbGxvd2VkIHRvIGRlZmluZSB0aGUgcGFja2FnZQotICAgICAgICAgICAgICAgICAgICBTZWN1cml0eU1hbmFnZXIgc2VjdXJpdHlNYW5hZ2VyID0gU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpOwotICAgICAgICAgICAgICAgICAgICBpZiAoc2VjdXJpdHlNYW5hZ2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBwYWNrYWdlRW5kID0gY2xhc3NOYW1lLmxhc3RJbmRleE9mKCcuJyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFja2FnZUVuZCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZU5hbWUgPSBjbGFzc05hbWUuc3Vic3RyaW5nKDAsIHBhY2thZ2VFbmQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3VyaXR5TWFuYWdlci5jaGVja1BhY2thZ2VEZWZpbml0aW9uKHBhY2thZ2VOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0KLSAgICAgICAgICAgICAgICAgICAgLy8gY29udmVydCB0aGUgY2xhc3MgbmFtZSB0byBhIGZpbGUgbmFtZQotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmVzb3VyY2VOYW1lID0gY2xhc3NOYW1lLnJlcGxhY2UoJy4nLCAnLycpICsgIi5jbGFzcyI7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gZmluZCB0aGUgY2xhc3MgZmlsZSByZXNvdXJjZQotICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZUhhbmRsZSByZXNvdXJjZUhhbmRsZSA9IHJlc291cmNlRmluZGVyLmdldFJlc291cmNlKHJlc291cmNlTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZUhhbmRsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbihjbGFzc05hbWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGJ5dGVzOwotICAgICAgICAgICAgICAgICAgICBNYW5pZmVzdCBtYW5pZmVzdDsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgYnl0ZXMgZnJvbSB0aGUgY2xhc3MgZmlsZQotICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXMgPSByZXNvdXJjZUhhbmRsZS5nZXRCeXRlcygpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIG1hbmlmZXN0IGZvciBkZWZpbmluZyB0aGUgcGFja2FnZXMKLSAgICAgICAgICAgICAgICAgICAgICAgIG1hbmlmZXN0ID0gcmVzb3VyY2VIYW5kbGUuZ2V0TWFuaWZlc3QoKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENsYXNzTm90Rm91bmRFeGNlcHRpb24oY2xhc3NOYW1lLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgY2VydGlmaWNhdGVzIGZvciB0aGUgY29kZSBzb3VyY2UKLSAgICAgICAgICAgICAgICAgICAgQ2VydGlmaWNhdGVbXSBjZXJ0aWZpY2F0ZXMgPSByZXNvdXJjZUhhbmRsZS5nZXRDZXJ0aWZpY2F0ZXMoKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyB0aGUgY29kZSBzb3VyY2UgdXJsIGlzIHVzZWQgdG8gZGVmaW5lIHRoZSBwYWNrYWdlIGFuZCBhcyB0aGUgc2VjdXJpdHkgY29udGV4dCBmb3IgdGhlIGNsYXNzCi0gICAgICAgICAgICAgICAgICAgIFVSTCBjb2RlU291cmNlVXJsID0gcmVzb3VyY2VIYW5kbGUuZ2V0Q29kZVNvdXJjZVVybCgpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIGRlZmluZSB0aGUgcGFja2FnZSAocmVxdWlyZWQgZm9yIHNlY3VyaXR5KQotICAgICAgICAgICAgICAgICAgICBkZWZpbmVQYWNrYWdlKGNsYXNzTmFtZSwgY29kZVNvdXJjZVVybCwgbWFuaWZlc3QpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgdGhlIHNlY3VyaXR5IGNvbnRleHQgb2YgdGhlIGNsYXNzCi0gICAgICAgICAgICAgICAgICAgIENvZGVTb3VyY2UgY29kZVNvdXJjZSA9IG5ldyBDb2RlU291cmNlKGNvZGVTb3VyY2VVcmwsIGNlcnRpZmljYXRlcyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gbG9hZCB0aGUgY2xhc3MgaW50byB0aGUgdm0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZmluZUNsYXNzKGNsYXNzTmFtZSwgYnl0ZXMsIDAsIGJ5dGVzLmxlbmd0aCwgY29kZVNvdXJjZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSwgYWNjKTsKLSAgICAgICAgfSBjYXRjaCAoUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbikgZS5nZXRFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBkZWZpbmVQYWNrYWdlKFN0cmluZyBjbGFzc05hbWUsIFVSTCBqYXJVcmwsIE1hbmlmZXN0IG1hbmlmZXN0KSB7Ci0gICAgICAgIGludCBwYWNrYWdlRW5kID0gY2xhc3NOYW1lLmxhc3RJbmRleE9mKCcuJyk7Ci0gICAgICAgIGlmIChwYWNrYWdlRW5kIDwgMCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gY2xhc3NOYW1lLnN1YnN0cmluZygwLCBwYWNrYWdlRW5kKTsKLSAgICAgICAgU3RyaW5nIHBhY2thZ2VQYXRoID0gcGFja2FnZU5hbWUucmVwbGFjZSgnLicsICcvJykgKyAiLyI7Ci0KLSAgICAgICAgQXR0cmlidXRlcyBwYWNrYWdlQXR0cmlidXRlcyA9IG51bGw7Ci0gICAgICAgIEF0dHJpYnV0ZXMgbWFpbkF0dHJpYnV0ZXMgPSBudWxsOwotICAgICAgICBpZiAobWFuaWZlc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgcGFja2FnZUF0dHJpYnV0ZXMgPSBtYW5pZmVzdC5nZXRBdHRyaWJ1dGVzKHBhY2thZ2VQYXRoKTsKLSAgICAgICAgICAgIG1haW5BdHRyaWJ1dGVzID0gbWFuaWZlc3QuZ2V0TWFpbkF0dHJpYnV0ZXMoKTsKLSAgICAgICAgfQotICAgICAgICBQYWNrYWdlIHBrZyA9IGdldFBhY2thZ2UocGFja2FnZU5hbWUpOwotICAgICAgICBpZiAocGtnICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChwa2cuaXNTZWFsZWQoKSkgewotICAgICAgICAgICAgICAgIGlmICghcGtnLmlzU2VhbGVkKGphclVybCkpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNlY3VyaXR5RXhjZXB0aW9uKCJQYWNrYWdlIHdhcyBhbHJlYWR5IHNlYWxlZCB3aXRoIGFub3RoZXIgVVJMOiBwYWNrYWdlPSIgKyBwYWNrYWdlTmFtZSArICIsIHVybD0iICsgamFyVXJsKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChpc1NlYWxlZChwYWNrYWdlQXR0cmlidXRlcywgbWFpbkF0dHJpYnV0ZXMpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTZWN1cml0eUV4Y2VwdGlvbigiUGFja2FnZSB3YXMgYWxyZWFkeSBiZWVuIGxvYWRlZCBhbmQgbm90IHNlYWxlZDogcGFja2FnZT0iICsgcGFja2FnZU5hbWUgKyAiLCB1cmw9IiArIGphclVybCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgU3RyaW5nIHNwZWNUaXRsZSA9IGdldEF0dHJpYnV0ZShBdHRyaWJ1dGVzLk5hbWUuU1BFQ0lGSUNBVElPTl9USVRMRSwgcGFja2FnZUF0dHJpYnV0ZXMsIG1haW5BdHRyaWJ1dGVzKTsKLSAgICAgICAgICAgIFN0cmluZyBzcGVjVmVuZG9yID0gZ2V0QXR0cmlidXRlKEF0dHJpYnV0ZXMuTmFtZS5TUEVDSUZJQ0FUSU9OX1ZFTkRPUiwgcGFja2FnZUF0dHJpYnV0ZXMsIG1haW5BdHRyaWJ1dGVzKTsKLSAgICAgICAgICAgIFN0cmluZyBzcGVjVmVyc2lvbiA9IGdldEF0dHJpYnV0ZShBdHRyaWJ1dGVzLk5hbWUuU1BFQ0lGSUNBVElPTl9WRVJTSU9OLCBwYWNrYWdlQXR0cmlidXRlcywgbWFpbkF0dHJpYnV0ZXMpOwotICAgICAgICAgICAgU3RyaW5nIGltcGxUaXRsZSA9IGdldEF0dHJpYnV0ZShBdHRyaWJ1dGVzLk5hbWUuSU1QTEVNRU5UQVRJT05fVElUTEUsIHBhY2thZ2VBdHRyaWJ1dGVzLCBtYWluQXR0cmlidXRlcyk7Ci0gICAgICAgICAgICBTdHJpbmcgaW1wbFZlbmRvciA9IGdldEF0dHJpYnV0ZShBdHRyaWJ1dGVzLk5hbWUuSU1QTEVNRU5UQVRJT05fVkVORE9SLCBwYWNrYWdlQXR0cmlidXRlcywgbWFpbkF0dHJpYnV0ZXMpOwotICAgICAgICAgICAgU3RyaW5nIGltcGxWZXJzaW9uID0gZ2V0QXR0cmlidXRlKEF0dHJpYnV0ZXMuTmFtZS5JTVBMRU1FTlRBVElPTl9WRVJTSU9OLCBwYWNrYWdlQXR0cmlidXRlcywgbWFpbkF0dHJpYnV0ZXMpOwotCi0gICAgICAgICAgICBVUkwgc2VhbEJhc2UgPSBudWxsOwotICAgICAgICAgICAgaWYgKGlzU2VhbGVkKHBhY2thZ2VBdHRyaWJ1dGVzLCBtYWluQXR0cmlidXRlcykpIHsKLSAgICAgICAgICAgICAgICBzZWFsQmFzZSA9IGphclVybDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZGVmaW5lUGFja2FnZShwYWNrYWdlTmFtZSwgc3BlY1RpdGxlLCBzcGVjVmVyc2lvbiwgc3BlY1ZlbmRvciwgaW1wbFRpdGxlLCBpbXBsVmVyc2lvbiwgaW1wbFZlbmRvciwgc2VhbEJhc2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0QXR0cmlidXRlKEF0dHJpYnV0ZXMuTmFtZSBuYW1lLCBBdHRyaWJ1dGVzIHBhY2thZ2VBdHRyaWJ1dGVzLCBBdHRyaWJ1dGVzIG1haW5BdHRyaWJ1dGVzKSB7Ci0gICAgICAgIGlmIChwYWNrYWdlQXR0cmlidXRlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBwYWNrYWdlQXR0cmlidXRlcy5nZXRWYWx1ZShuYW1lKTsKLSAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChtYWluQXR0cmlidXRlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbWFpbkF0dHJpYnV0ZXMuZ2V0VmFsdWUobmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzU2VhbGVkKEF0dHJpYnV0ZXMgcGFja2FnZUF0dHJpYnV0ZXMsIEF0dHJpYnV0ZXMgbWFpbkF0dHJpYnV0ZXMpIHsKLSAgICAgICAgU3RyaW5nIHNlYWxlZCA9IGdldEF0dHJpYnV0ZShBdHRyaWJ1dGVzLk5hbWUuU0VBTEVELCBwYWNrYWdlQXR0cmlidXRlcywgbWFpbkF0dHJpYnV0ZXMpOwotICAgICAgICByZXR1cm4gc2VhbGVkICE9IG51bGwgJiYgInRydWUiLmVxdWFsc0lnbm9yZUNhc2Uoc2VhbGVkKTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsYXNzbG9hZGVyL0phckZpbGVVcmxDb25uZWN0aW9uLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY2xhc3Nsb2FkZXIvSmFyRmlsZVVybENvbm5lY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY4NjRhYy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY2xhc3Nsb2FkZXIvSmFyRmlsZVVybENvbm5lY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY2xhc3Nsb2FkZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0LkphclVSTENvbm5lY3Rpb247Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5VUkxDb25uZWN0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTFN0cmVhbUhhbmRsZXI7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZTsKLWltcG9ydCBqYXZhLnV0aWwuamFyLkF0dHJpYnV0ZXM7Ci1pbXBvcnQgamF2YS51dGlsLmphci5KYXJFbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuamFyLkphckZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLmphci5NYW5pZmVzdDsKLQotLyoqCi0gKiBAdmVyc2lvbiAkUmV2OiA0NzYwNDkgJCAkRGF0ZTogMjAwNi0xMS0xNiAyMzozNToxNyAtMDUwMCAoVGh1LCAxNiBOb3YgMjAwNikgJAotICovCi1wdWJsaWMgY2xhc3MgSmFyRmlsZVVybENvbm5lY3Rpb24gZXh0ZW5kcyBKYXJVUkxDb25uZWN0aW9uIHsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVSTCBEVU1NWV9KQVJfVVJMOwotICAgIHN0YXRpYyB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBEVU1NWV9KQVJfVVJMID0gbmV3IFVSTCgiamFyIiwgIiIsIC0xLCAiZmlsZTpkdW1teSEvIiwgbmV3IFVSTFN0cmVhbUhhbmRsZXIoKSB7Ci0gICAgICAgICAgICAgICAgcHJvdGVjdGVkIFVSTENvbm5lY3Rpb24gb3BlbkNvbm5lY3Rpb24oVVJMIHUpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uSW5Jbml0aWFsaXplckVycm9yKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBVUkwgdXJsOwotICAgIHByaXZhdGUgZmluYWwgSmFyRmlsZSBqYXJGaWxlOwotICAgIHByaXZhdGUgZmluYWwgSmFyRW50cnkgamFyRW50cnk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBVUkwgamFyRmlsZVVybDsKLQotICAgIHB1YmxpYyBKYXJGaWxlVXJsQ29ubmVjdGlvbihVUkwgdXJsLCBKYXJGaWxlIGphckZpbGUsIEphckVudHJ5IGphckVudHJ5KSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIoRFVNTVlfSkFSX1VSTCk7Ci0KLSAgICAgICAgaWYgKHVybCA9PSBudWxsKSB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oInVybCBpcyBudWxsIik7Ci0gICAgICAgIGlmIChqYXJGaWxlID09IG51bGwpIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiamFyRmlsZSBpcyBudWxsIik7Ci0gICAgICAgIGlmIChqYXJFbnRyeSA9PSBudWxsKSB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oImphckVudHJ5IGlzIG51bGwiKTsKLQotICAgICAgICB0aGlzLnVybCA9IHVybDsKLSAgICAgICAgdGhpcy5qYXJGaWxlID0gamFyRmlsZTsKLSAgICAgICAgdGhpcy5qYXJFbnRyeSA9IGphckVudHJ5OwotICAgICAgICBqYXJGaWxlVXJsID0gbmV3IEZpbGUoamFyRmlsZS5nZXROYW1lKCkpLnRvVVJMKCk7Ci0gICAgfQotCi0gICAgcHVibGljIEphckZpbGUgZ2V0SmFyRmlsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBqYXJGaWxlOwotICAgIH0KLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBjb25uZWN0KCkgewotICAgIH0KLQotICAgIHB1YmxpYyBVUkwgZ2V0SmFyRmlsZVVSTCgpIHsKLSAgICAgICAgcmV0dXJuIGphckZpbGVVcmw7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRFbnRyeU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBnZXRKYXJFbnRyeSgpLmdldE5hbWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWFuaWZlc3QgZ2V0TWFuaWZlc3QoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gamFyRmlsZS5nZXRNYW5pZmVzdCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBKYXJFbnRyeSBnZXRKYXJFbnRyeSgpIHsKLSAgICAgICAgcmV0dXJuIGphckVudHJ5OwotICAgIH0KLQotICAgIHB1YmxpYyBBdHRyaWJ1dGVzIGdldEF0dHJpYnV0ZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZ2V0SmFyRW50cnkoKS5nZXRBdHRyaWJ1dGVzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIEF0dHJpYnV0ZXMgZ2V0TWFpbkF0dHJpYnV0ZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZ2V0TWFuaWZlc3QoKS5nZXRNYWluQXR0cmlidXRlcygpOwotICAgIH0KLQotICAgIHB1YmxpYyBDZXJ0aWZpY2F0ZVtdIGdldENlcnRpZmljYXRlcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBnZXRKYXJFbnRyeSgpLmdldENlcnRpZmljYXRlcygpOwotICAgIH0KLQotICAgIHB1YmxpYyBVUkwgZ2V0VVJMKCkgewotICAgICAgICByZXR1cm4gdXJsOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0Q29udGVudExlbmd0aCgpIHsKLSAgICAgICAgbG9uZyBzaXplID0gZ2V0SmFyRW50cnkoKS5nZXRTaXplKCk7Ci0gICAgICAgIGlmIChzaXplID4gSW50ZWdlci5NQVhfVkFMVUUpIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKGludCkgc2l6ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgbG9uZyBnZXRMYXN0TW9kaWZpZWQoKSB7Ci0gICAgICAgIHJldHVybiBnZXRKYXJFbnRyeSgpLmdldFRpbWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGphckZpbGUuZ2V0SW5wdXRTdHJlYW0oamFyRW50cnkpOwotICAgIH0KLQotICAgIHB1YmxpYyBQZXJtaXNzaW9uIGdldFBlcm1pc3Npb24oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBVUkwgamFyRmlsZVVybCA9IG5ldyBGaWxlKGphckZpbGUuZ2V0TmFtZSgpKS50b1VSTCgpOwotICAgICAgICByZXR1cm4gamFyRmlsZVVybC5vcGVuQ29ubmVjdGlvbigpLmdldFBlcm1pc3Npb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gSmFyRmlsZVVybENvbm5lY3Rpb24uY2xhc3MuZ2V0TmFtZSgpICsgIjoiICsgdXJsOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbGFzc2xvYWRlci9KYXJGaWxlVXJsU3RyZWFtSGFuZGxlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsYXNzbG9hZGVyL0phckZpbGVVcmxTdHJlYW1IYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwMWVkZWYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsYXNzbG9hZGVyL0phckZpbGVVcmxTdHJlYW1IYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNsYXNzbG9hZGVyOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5VUkxDb25uZWN0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTFN0cmVhbUhhbmRsZXI7Ci1pbXBvcnQgamF2YS51dGlsLmphci5KYXJFbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuamFyLkphckZpbGU7Ci0KLS8qKgotICogQHZlcnNpb24gJFJldjogNDc2MDQ5ICQgJERhdGU6IDIwMDYtMTEtMTYgMjM6MzU6MTcgLTA1MDAgKFRodSwgMTYgTm92IDIwMDYpICQKLSAqLwotcHVibGljIGNsYXNzIEphckZpbGVVcmxTdHJlYW1IYW5kbGVyIGV4dGVuZHMgVVJMU3RyZWFtSGFuZGxlciB7Ci0gICAgcHVibGljIHN0YXRpYyBVUkwgY3JlYXRlVXJsKEphckZpbGUgamFyRmlsZSwgSmFyRW50cnkgamFyRW50cnkpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gY3JlYXRlVXJsKGphckZpbGUsIGphckVudHJ5LCBuZXcgRmlsZShqYXJGaWxlLmdldE5hbWUoKSkudG9VUkwoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBVUkwgY3JlYXRlVXJsKEphckZpbGUgamFyRmlsZSwgSmFyRW50cnkgamFyRW50cnksIFVSTCBjb2RlU291cmNlKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKLSAgICAgICAgSmFyRmlsZVVybFN0cmVhbUhhbmRsZXIgaGFuZGxlciA9IG5ldyBKYXJGaWxlVXJsU3RyZWFtSGFuZGxlcihqYXJGaWxlLCBqYXJFbnRyeSk7Ci0gICAgICAgIFVSTCB1cmwgPSBuZXcgVVJMKCJqYXIiLCAiIiwgLTEsIGNvZGVTb3VyY2UgKyAiIS8iICsgamFyRW50cnkuZ2V0TmFtZSgpLCBoYW5kbGVyKTsKLSAgICAgICAgaGFuZGxlci5zZXRFeHBlY3RlZFVybCh1cmwpOwotICAgICAgICByZXR1cm4gdXJsOwotICAgIH0KLQotICAgIHByaXZhdGUgVVJMIGV4cGVjdGVkVXJsOwotICAgIHByaXZhdGUgSmFyRmlsZSBqYXJGaWxlID0gbnVsbDsKLSAgICBwcml2YXRlIEphckVudHJ5IGphckVudHJ5ID0gbnVsbDsKLQotICAgIHB1YmxpYyBKYXJGaWxlVXJsU3RyZWFtSGFuZGxlcigpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSmFyRmlsZVVybFN0cmVhbUhhbmRsZXIoSmFyRmlsZSBqYXJGaWxlLCBKYXJFbnRyeSBqYXJFbnRyeSkgewotICAgICAgICBpZiAoamFyRmlsZSA9PSBudWxsKSB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oImphckZpbGUgaXMgbnVsbCIpOwotICAgICAgICBpZiAoamFyRW50cnkgPT0gbnVsbCkgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJqYXJFbnRyeSBpcyBudWxsIik7Ci0KLSAgICAgICAgdGhpcy5qYXJGaWxlID0gamFyRmlsZTsKLSAgICAgICAgdGhpcy5qYXJFbnRyeSA9IGphckVudHJ5OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEV4cGVjdGVkVXJsKFVSTCBleHBlY3RlZFVybCkgewotICAgICAgICBpZiAoZXhwZWN0ZWRVcmwgPT0gbnVsbCkgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJleHBlY3RlZFVybCBpcyBudWxsIik7Ci0gICAgICAgIHRoaXMuZXhwZWN0ZWRVcmwgPSBleHBlY3RlZFVybDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVVJMQ29ubmVjdGlvbiBvcGVuQ29ubmVjdGlvbihVUkwgdXJsKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCi0gICAgICAgIGlmIChleHBlY3RlZFVybCA9PSBudWxsIHx8ICFleHBlY3RlZFVybC5lcXVhbHModXJsKSkgewotICAgICAgICAgICAgLy8gdGhlIG5ldyB1cmwgaXMgc3VwcG9zZWQgdG8gYmUgd2l0aGluIG91ciBjb250ZXh0LCBzbyBpdCBtdXN0IGhhdmUgYSBqYXIgcHJvdG9jb2wKLSAgICAgICAgICAgIGlmICghdXJsLmdldFByb3RvY29sKCkuZXF1YWxzKCJqYXIiKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVuc3VwcG9ydGVkIHByb3RvY29sICIgKyB1cmwuZ2V0UHJvdG9jb2woKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHNwbGl0IHRoZSBwYXRoIGF0ICIhLyIgaW50byB0aGUgZmlsZSBwYXJ0IGFuZCBlbnRyeSBwYXJ0Ci0gICAgICAgICAgICBTdHJpbmcgcGF0aCA9IHVybC5nZXRQYXRoKCk7Ci0gICAgICAgICAgICBTdHJpbmdbXSBjaHVua3MgPSBwYXRoLnNwbGl0KCIhLyIsIDIpOwotCi0gICAgICAgICAgICAvLyBpZiB3ZSBvbmx5IGdvdCBvbmx5IG9uZSBjaHVuaywgaXQgZGlkbid0IGNvbnRhaW4gdGhlIHJlcXVpcmVkICIhLyIgZGVsaW1pdGVyCi0gICAgICAgICAgICBpZiAoY2h1bmtzLmxlbmd0aCA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1hbGZvcm1lZFVSTEV4Y2VwdGlvbigiVXJsIGRvZXMgbm90IGNvbnRhaW4gYSAnIScgY2hhcmFjdGVyOiAiICsgdXJsKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3RyaW5nIGZpbGUgPSBjaHVua3NbMF07Ci0gICAgICAgICAgICBTdHJpbmcgZW50cnlQYXRoID0gY2h1bmtzWzFdOwotCi0gICAgICAgICAgICAvLyB0aGlzIGhhbmRsZXIgb25seSBzdXBwb3J0cyBqYXJzIG9uIHRoZSBsb2NhbCBmaWxlIHN5c3RlbQotICAgICAgICAgICAgaWYgKCFmaWxlLnN0YXJ0c1dpdGgoImZpbGU6IikpIHsKLSAgICAgICAgICAgICAgICAvLyBsZXQgdGhlIHN5c3RlbSBoYW5kbGVyIGRlYWwgd2l0aCB0aGlzCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBVUkwodXJsLnRvRXh0ZXJuYWxGb3JtKCkpLm9wZW5Db25uZWN0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaWxlID0gZmlsZS5zdWJzdHJpbmcoImZpbGU6Ii5sZW5ndGgoKSk7Ci0KLSAgICAgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKGZpbGUpOwotICAgICAgICAgICAgaWYgKGYuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICBqYXJGaWxlID0gbmV3IEphckZpbGUoZik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChqYXJGaWxlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKCJDYW5ub3QgZmluZCBKYXJGaWxlOiAiICsgZmlsZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGdldCB0aGUgZW50cnkKLSAgICAgICAgICAgIGphckVudHJ5ID0gamFyRmlsZS5nZXRKYXJFbnRyeShlbnRyeVBhdGgpOwotICAgICAgICAgICAgaWYgKGphckVudHJ5ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKCJFbnRyeSBub3QgZm91bmQ6ICIgKyB1cmwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZXhwZWN0ZWRVcmwgPSB1cmw7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbmV3IEphckZpbGVVcmxDb25uZWN0aW9uKHVybCwgamFyRmlsZSwgamFyRW50cnkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbGFzc2xvYWRlci9KYXJSZXNvdXJjZUhhbmRsZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsYXNzbG9hZGVyL0phclJlc291cmNlSGFuZGxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0ZjQxNGQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsYXNzbG9hZGVyL0phclJlc291cmNlSGFuZGxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jbGFzc2xvYWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5qYXIuSmFyRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuamFyLkphckVudHJ5OwotaW1wb3J0IGphdmEudXRpbC5qYXIuTWFuaWZlc3Q7Ci1pbXBvcnQgamF2YS51dGlsLmphci5BdHRyaWJ1dGVzOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZTsKLQotLyoqCi0gKiBAdmVyc2lvbiAkUmV2JCAkRGF0ZSQKLSAqLwotcHVibGljIGNsYXNzIEphclJlc291cmNlSGFuZGxlIGV4dGVuZHMgQWJzdHJhY3RSZXNvdXJjZUhhbmRsZSB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBKYXJGaWxlIGphckZpbGU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBKYXJFbnRyeSBqYXJFbnRyeTsKLSAgICBwcml2YXRlIGZpbmFsIFVSTCB1cmw7Ci0gICAgcHJpdmF0ZSBmaW5hbCBVUkwgY29kZVNvdXJjZTsKLQotICAgIHB1YmxpYyBKYXJSZXNvdXJjZUhhbmRsZShKYXJGaWxlIGphckZpbGUsIEphckVudHJ5IGphckVudHJ5LCBVUkwgY29kZVNvdXJjZSkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMuamFyRmlsZSA9IGphckZpbGU7Ci0gICAgICAgIHRoaXMuamFyRW50cnkgPSBqYXJFbnRyeTsKLSAgICAgICAgdGhpcy51cmwgPSBKYXJGaWxlVXJsU3RyZWFtSGFuZGxlci5jcmVhdGVVcmwoamFyRmlsZSwgamFyRW50cnksIGNvZGVTb3VyY2UpOwotICAgICAgICB0aGlzLmNvZGVTb3VyY2UgPSBjb2RlU291cmNlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGphckVudHJ5LmdldE5hbWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVVJMIGdldFVybCgpIHsKLSAgICAgICAgcmV0dXJuIHVybDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVVJMIGdldENvZGVTb3VyY2VVcmwoKSB7Ci0gICAgICAgIHJldHVybiBjb2RlU291cmNlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRGlyZWN0b3J5KCkgewotICAgICAgICByZXR1cm4gamFyRW50cnkuaXNEaXJlY3RvcnkoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gamFyRmlsZS5nZXRJbnB1dFN0cmVhbShqYXJFbnRyeSk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRDb250ZW50TGVuZ3RoKCkgewotICAgICAgICByZXR1cm4gKGludCkgamFyRW50cnkuZ2V0U2l6ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBNYW5pZmVzdCBnZXRNYW5pZmVzdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBqYXJGaWxlLmdldE1hbmlmZXN0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIEF0dHJpYnV0ZXMgZ2V0QXR0cmlidXRlcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBqYXJFbnRyeS5nZXRBdHRyaWJ1dGVzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIENlcnRpZmljYXRlW10gZ2V0Q2VydGlmaWNhdGVzKCkgewotICAgICAgICByZXR1cm4gamFyRW50cnkuZ2V0Q2VydGlmaWNhdGVzKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsYXNzbG9hZGVyL0phclJlc291cmNlTG9jYXRpb24uamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbGFzc2xvYWRlci9KYXJSZXNvdXJjZUxvY2F0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlNTZmYzkuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsYXNzbG9hZGVyL0phclJlc291cmNlTG9jYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0vKioKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jbGFzc2xvYWRlcjsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5qYXIuSmFyRW50cnk7Ci1pbXBvcnQgamF2YS51dGlsLmphci5KYXJGaWxlOwotaW1wb3J0IGphdmEudXRpbC5qYXIuSmFySW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLmphci5NYW5pZmVzdDsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBAdmVyc2lvbiAkUmV2JCAkRGF0ZSQKLSAqLwotcHVibGljIGNsYXNzIEphclJlc291cmNlTG9jYXRpb24gZXh0ZW5kcyBBYnN0cmFjdFVybFJlc291cmNlTG9jYXRpb24gewotICAgIHByaXZhdGUgSmFyRmlsZSBqYXJGaWxlOwotICAgIHByaXZhdGUgYnl0ZSBjb250ZW50W107Ci0KLSAgICBwdWJsaWMgSmFyUmVzb3VyY2VMb2NhdGlvbihVUkwgY29kZVNvdXJjZSwgRmlsZSBjYWNoZUZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyKGNvZGVTb3VyY2UpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgamFyRmlsZSA9IG5ldyBKYXJGaWxlKGNhY2hlRmlsZSk7Ci0gICAgICAgIH0gY2F0Y2ggKFppcEV4Y2VwdGlvbiB6ZSkgewotICAgICAgICAgICAgLy8gV2UgZ2V0IHRoaXMgZXhjZXB0aW9uIG9uIHdpbmRvd3Mgd2hlbiB0aGUKLSAgICAgICAgICAgIC8vIHBhdGggdG8gdGhlIGphciBmaWxlIGdldHMgdG9vIGxvbmcgKEJ1ZyBJRDogNjM3NDM3OSkKLSAgICAgICAgICAgIElucHV0U3RyZWFtIGlzID0gbnVsbDsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGNhY2hlRmlsZSk7Ci0gICAgICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICAgICAgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlWzIwNDhdOwotICAgICAgICAgICAgICAgIGludCBieXRlc1JlYWQgPSAtMTsKLSAgICAgICAgICAgICAgICB3aGlsZSAoKGJ5dGVzUmVhZCA9IGlzLnJlYWQoYnVmZmVyKSkgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgYmFvcy53cml0ZShidWZmZXIsIDAsIGJ5dGVzUmVhZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRoaXMuY29udGVudCA9IGJhb3MudG9CeXRlQXJyYXkoKTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgaWYgKGlzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaXMuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgUmVzb3VyY2VIYW5kbGUgZ2V0UmVzb3VyY2VIYW5kbGUoU3RyaW5nIHJlc291cmNlTmFtZSkgewotICAgICAgICBpZiAoamFyRmlsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBKYXJFbnRyeSBqYXJFbnRyeSA9IGphckZpbGUuZ2V0SmFyRW50cnkocmVzb3VyY2VOYW1lKTsKLSAgICAgICAgICAgIGlmIChqYXJFbnRyeSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgVVJMIHVybCA9IG5ldyBVUkwoZ2V0Q29kZVNvdXJjZSgpLCByZXNvdXJjZU5hbWUpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEphclJlc291cmNlSGFuZGxlKGphckZpbGUsIGphckVudHJ5LCBnZXRDb2RlU291cmNlKCkpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBmaW5hbCBKYXJJbnB1dFN0cmVhbSBpcyA9IG5ldyBKYXJJbnB1dFN0cmVhbShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0odGhpcy5jb250ZW50KSk7Ci0gICAgICAgICAgICAgICAgSmFyRW50cnkgamFyRW50cnkgPSBudWxsOwotICAgICAgICAgICAgICAgIHdoaWxlICgoamFyRW50cnkgPSBpcy5nZXROZXh0SmFyRW50cnkoKSkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoamFyRW50cnkuZ2V0TmFtZSgpLmVxdWFscyhyZXNvdXJjZU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTCB1cmwgPSBuZXcgVVJMKGdldENvZGVTb3VyY2UoKSwgcmVzb3VyY2VOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBKYXJFbnRyeSBqYXJFbnRyeTIgPSBqYXJFbnRyeTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEphckVudHJ5UmVzb3VyY2VIYW5kbGUoamFyRW50cnkyLCBpcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBNYW5pZmVzdCBnZXRNYW5pZmVzdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChqYXJGaWxlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBqYXJGaWxlLmdldE1hbmlmZXN0KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIEphcklucHV0U3RyZWFtIGlzID0gbmV3IEphcklucHV0U3RyZWFtKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSh0aGlzLmNvbnRlbnQpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gaXMuZ2V0TWFuaWZlc3QoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKLSAgICAgICAgaWYgKGphckZpbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgSW9VdGlsLmNsb3NlKGphckZpbGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBjbGFzcyBKYXJFbnRyeVJlc291cmNlSGFuZGxlIGV4dGVuZHMgQWJzdHJhY3RSZXNvdXJjZUhhbmRsZSB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgSmFyRW50cnkgamFyRW50cnkyOwotICAgICAgICBwcml2YXRlIGZpbmFsIEphcklucHV0U3RyZWFtIGlzOwotCi0gICAgICAgIHB1YmxpYyBKYXJFbnRyeVJlc291cmNlSGFuZGxlKEphckVudHJ5IGphckVudHJ5MiwgSmFySW5wdXRTdHJlYW0gaXMpIHsKLSAgICAgICAgICAgIHRoaXMuamFyRW50cnkyID0gamFyRW50cnkyOwotICAgICAgICAgICAgdGhpcy5pcyA9IGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICAgICAgcmV0dXJuIGphckVudHJ5Mi5nZXROYW1lKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgVVJMIGdldFVybCgpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBVUkwoImphciIsICIiLCAtMSwgZ2V0Q29kZVNvdXJjZSgpICsgIiEvIiArIGphckVudHJ5Mi5nZXROYW1lKCkpOwotICAgICAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzRGlyZWN0b3J5KCkgewotICAgICAgICAgICAgcmV0dXJuIGphckVudHJ5Mi5pc0RpcmVjdG9yeSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFVSTCBnZXRDb2RlU291cmNlVXJsKCkgewotICAgICAgICAgICAgcmV0dXJuIGdldENvZGVTb3VyY2UoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICByZXR1cm4gaXM7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IGdldENvbnRlbnRMZW5ndGgoKSB7Ci0gICAgICAgICAgICByZXR1cm4gKGludCkgamFyRW50cnkyLmdldFNpemUoKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbGFzc2xvYWRlci9KYXJTdHJlYW1IYW5kbGVyRmFjdG9yeS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsYXNzbG9hZGVyL0phclN0cmVhbUhhbmRsZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzMjgxM2UuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsYXNzbG9hZGVyL0phclN0cmVhbUhhbmRsZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY2xhc3Nsb2FkZXI7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkxTdHJlYW1IYW5kbGVyOwotaW1wb3J0IGphdmEubmV0LlVSTFN0cmVhbUhhbmRsZXJGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgSmFyU3RyZWFtSGFuZGxlckZhY3RvcnkgaW1wbGVtZW50cyBVUkxTdHJlYW1IYW5kbGVyRmFjdG9yeSB7Ci0gICAgcHVibGljIFVSTFN0cmVhbUhhbmRsZXIgY3JlYXRlVVJMU3RyZWFtSGFuZGxlcihTdHJpbmcgcHJvdG9jb2wpIHsKLSAgICAgICAgaWYoImphciIuZXF1YWxzSWdub3JlQ2FzZShwcm90b2NvbCkpewotICAgICAgICAgICAgcmV0dXJuIG5ldyBKYXJGaWxlVXJsU3RyZWFtSGFuZGxlcigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbGFzc2xvYWRlci9NdWx0aVBhcmVudENsYXNzTG9hZGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY2xhc3Nsb2FkZXIvTXVsdGlQYXJlbnRDbGFzc0xvYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWVmNmE4Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbGFzc2xvYWRlci9NdWx0aVBhcmVudENsYXNzTG9hZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNsYXNzbG9hZGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmEuYmVhbnMuSW50cm9zcGVjdG9yOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmV0LlVSTENsYXNzTG9hZGVyOwotaW1wb3J0IGphdmEubmV0LlVSTFN0cmVhbUhhbmRsZXJGYWN0b3J5OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBBIE11bHRpUGFyZW50Q2xhc3NMb2FkZXIgaXMgYSBzaW1wbGUgZXh0ZW5zaW9uIG9mIHRoZSBVUkxDbGFzc0xvYWRlciB0aGF0IHNpbXBseSBjaGFuZ2VzIHRoZSBzaW5nbGUgcGFyZW50IGNsYXNzCi0gKiBsb2FkZXIgbW9kZWwgdG8gc3VwcG9ydCBhIGxpc3Qgb2YgcGFyZW50IGNsYXNzIGxvYWRlcnMuICBFYWNoIG9wZXJhdGlvbiB0aGF0IGFjY2Vzc2VzIGEgcGFyZW50LCBoYXMgYmVlbiByZXBsYWNlZAotICogd2l0aCBhIG9wZXJhdGlvbiB0aGF0IGNoZWNrcyBlYWNoIHBhcmVudCBpbiBvcmRlci4gIFRoaXMgZ2V0UGFyZW50IG1ldGhvZCBvZiB0aGlzIGNsYXNzIHdpbGwgYWx3YXlzIHJldHVybiBudWxsLAotICogd2hpY2ggbWF5IGJlIGludGVycHJldGVkIGJ5IHRoZSBjYWxsaW5nIGNvZGUgdG8gbWVhbiB0aGF0IHRoaXMgY2xhc3MgbG9hZGVyIGlzIGEgZGlyZWN0IGNoaWxkIG9mIHRoZSBzeXN0ZW0gY2xhc3MKLSAqIGxvYWRlci4KLSAqCi0gKiBAdmVyc2lvbiAkUmV2JCAkRGF0ZSQKLSAqLwotcHVibGljIGNsYXNzIE11bHRpUGFyZW50Q2xhc3NMb2FkZXIgZXh0ZW5kcyBVUkxDbGFzc0xvYWRlciB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBDbGFzc0xvYWRlcltdIHBhcmVudHM7Ci0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGludmVyc2VDbGFzc0xvYWRpbmc7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmdbXSBoaWRkZW5DbGFzc2VzOwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nW10gbm9uT3ZlcnJpZGFibGVDbGFzc2VzOwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nW10gaGlkZGVuUmVzb3VyY2VzOwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nW10gbm9uT3ZlcnJpZGFibGVSZXNvdXJjZXM7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGRlc3Ryb3llZCA9IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5hbWVkIGNsYXNzIGxvYWRlciB3aXRoIG5vIHBhcmVudHMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdXJscyB0aGUgdXJscyBmcm9tIHdoaWNoIHRoaXMgY2xhc3MgbG9hZGVyIHdpbGwgY2xhc3NlcyBhbmQgcmVzb3VyY2VzCi0gICAgICovCi0gICAgcHVibGljIE11bHRpUGFyZW50Q2xhc3NMb2FkZXIoVVJMW10gdXJscykgewotICAgICAgICBzdXBlcih1cmxzKTsKLSAgICAgICAgcGFyZW50cyA9IG5ldyBDbGFzc0xvYWRlcltde0NsYXNzTG9hZGVyLmdldFN5c3RlbUNsYXNzTG9hZGVyKCl9OwotICAgICAgICBpbnZlcnNlQ2xhc3NMb2FkaW5nID0gZmFsc2U7Ci0gICAgICAgIGhpZGRlbkNsYXNzZXMgPSBuZXcgU3RyaW5nWzBdOwotICAgICAgICBub25PdmVycmlkYWJsZUNsYXNzZXMgPSBuZXcgU3RyaW5nWzBdOwotICAgICAgICBoaWRkZW5SZXNvdXJjZXMgPSBuZXcgU3RyaW5nWzBdOwotICAgICAgICBub25PdmVycmlkYWJsZVJlc291cmNlcyA9IG5ldyBTdHJpbmdbMF07Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmFtZWQgY2xhc3MgbG9hZGVyIGFzIGEgY2hpbGQgb2YgdGhlIHNwZWNpZmllZCBwYXJlbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdXJscyAgIHRoZSB1cmxzIGZyb20gd2hpY2ggdGhpcyBjbGFzcyBsb2FkZXIgd2lsbCBjbGFzc2VzIGFuZCByZXNvdXJjZXMKLSAgICAgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgb2YgdGhpcyBjbGFzcyBsb2FkZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgTXVsdGlQYXJlbnRDbGFzc0xvYWRlcihVUkxbXSB1cmxzLCBDbGFzc0xvYWRlciBwYXJlbnQpIHsKLSAgICAgICAgdGhpcyh1cmxzLCBuZXcgQ2xhc3NMb2FkZXJbXXtwYXJlbnR9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTXVsdGlQYXJlbnRDbGFzc0xvYWRlcihVUkxbXSB1cmxzLCBDbGFzc0xvYWRlciBwYXJlbnQsIGJvb2xlYW4gaW52ZXJzZUNsYXNzTG9hZGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSBoaWRkZW5DbGFzc2VzLCBTdHJpbmdbXSBub25PdmVycmlkYWJsZUNsYXNzZXMpIHsKLSAgICAgICAgdGhpcyh1cmxzLCBuZXcgQ2xhc3NMb2FkZXJbXXtwYXJlbnR9LCBpbnZlcnNlQ2xhc3NMb2FkaW5nLCBoaWRkZW5DbGFzc2VzLAotICAgICAgICAgICAgIG5vbk92ZXJyaWRhYmxlQ2xhc3Nlcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5hbWVkIGNsYXNzIGxvYWRlciBhcyBhIGNoaWxkIG9mIHRoZSBzcGVjaWZpZWQgcGFyZW50IGFuZCB1c2luZyB0aGUgc3BlY2lmaWVkIFVSTFN0cmVhbUhhbmRsZXJGYWN0b3J5Ci0gICAgICogZm9yIGFjY2Vzc2luZyB0aGUgdXJscy4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdXJscyAgICB0aGUgdXJscyBmcm9tIHdoaWNoIHRoaXMgY2xhc3MgbG9hZGVyIHdpbGwgY2xhc3NlcyBhbmQgcmVzb3VyY2VzCi0gICAgICogQHBhcmFtIHBhcmVudCAgdGhlIHBhcmVudCBvZiB0aGlzIGNsYXNzIGxvYWRlcgotICAgICAqIEBwYXJhbSBmYWN0b3J5IHRoZSBVUkxTdHJlYW1IYW5kbGVyRmFjdG9yeSB1c2VkIHRvIGFjY2VzcyB0aGUgdXJscwotICAgICAqLwotICAgIHB1YmxpYyBNdWx0aVBhcmVudENsYXNzTG9hZGVyKFVSTFtdIHVybHMsIENsYXNzTG9hZGVyIHBhcmVudCwgVVJMU3RyZWFtSGFuZGxlckZhY3RvcnkgZmFjdG9yeSkgewotICAgICAgICB0aGlzKHVybHMsIG5ldyBDbGFzc0xvYWRlcltde3BhcmVudH0sIGZhY3RvcnkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuYW1lZCBjbGFzcyBsb2FkZXIgYXMgYSBjaGlsZCBvZiB0aGUgc3BlY2lmaWVkIHBhcmVudHMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdXJscyAgICB0aGUgdXJscyBmcm9tIHdoaWNoIHRoaXMgY2xhc3MgbG9hZGVyIHdpbGwgY2xhc3NlcyBhbmQgcmVzb3VyY2VzCi0gICAgICogQHBhcmFtIHBhcmVudHMgdGhlIHBhcmVudHMgb2YgdGhpcyBjbGFzcyBsb2FkZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgTXVsdGlQYXJlbnRDbGFzc0xvYWRlcihVUkxbXSB1cmxzLCBDbGFzc0xvYWRlcltdIHBhcmVudHMpIHsKLSAgICAgICAgc3VwZXIodXJscyk7Ci0gICAgICAgIHRoaXMucGFyZW50cyA9IGNvcHlQYXJlbnRzKHBhcmVudHMpOwotICAgICAgICBpbnZlcnNlQ2xhc3NMb2FkaW5nID0gZmFsc2U7Ci0gICAgICAgIGhpZGRlbkNsYXNzZXMgPSBuZXcgU3RyaW5nWzBdOwotICAgICAgICBub25PdmVycmlkYWJsZUNsYXNzZXMgPSBuZXcgU3RyaW5nWzBdOwotICAgICAgICBoaWRkZW5SZXNvdXJjZXMgPSBuZXcgU3RyaW5nWzBdOwotICAgICAgICBub25PdmVycmlkYWJsZVJlc291cmNlcyA9IG5ldyBTdHJpbmdbMF07Ci0gICAgfQotCi0gICAgcHVibGljIE11bHRpUGFyZW50Q2xhc3NMb2FkZXIoVVJMW10gdXJscywgQ2xhc3NMb2FkZXJbXSBwYXJlbnRzLCBib29sZWFuIGludmVyc2VDbGFzc0xvYWRpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbiBoaWRkZW5DbGFzc2VzLCBDb2xsZWN0aW9uIG5vbk92ZXJyaWRhYmxlQ2xhc3NlcykgewotICAgICAgICB0aGlzKHVybHMsIHBhcmVudHMsIGludmVyc2VDbGFzc0xvYWRpbmcsCi0gICAgICAgICAgICAgKFN0cmluZ1tdKSBoaWRkZW5DbGFzc2VzLnRvQXJyYXkobmV3IFN0cmluZ1toaWRkZW5DbGFzc2VzLnNpemUoKV0pLAotICAgICAgICAgICAgIChTdHJpbmdbXSkgbm9uT3ZlcnJpZGFibGVDbGFzc2VzLnRvQXJyYXkobmV3IFN0cmluZ1tub25PdmVycmlkYWJsZUNsYXNzZXMuc2l6ZSgpXSkpOwotICAgIH0KLQotICAgIHB1YmxpYyBNdWx0aVBhcmVudENsYXNzTG9hZGVyKFVSTFtdIHVybHMsIENsYXNzTG9hZGVyW10gcGFyZW50cywgYm9vbGVhbiBpbnZlcnNlQ2xhc3NMb2FkaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIGhpZGRlbkNsYXNzZXMsIFN0cmluZ1tdIG5vbk92ZXJyaWRhYmxlQ2xhc3NlcykgewotICAgICAgICBzdXBlcih1cmxzKTsKLSAgICAgICAgdGhpcy5wYXJlbnRzID0gY29weVBhcmVudHMocGFyZW50cyk7Ci0gICAgICAgIHRoaXMuaW52ZXJzZUNsYXNzTG9hZGluZyA9IGludmVyc2VDbGFzc0xvYWRpbmc7Ci0gICAgICAgIHRoaXMuaGlkZGVuQ2xhc3NlcyA9IGhpZGRlbkNsYXNzZXM7Ci0gICAgICAgIHRoaXMubm9uT3ZlcnJpZGFibGVDbGFzc2VzID0gbm9uT3ZlcnJpZGFibGVDbGFzc2VzOwotICAgICAgICBoaWRkZW5SZXNvdXJjZXMgPSB0b1Jlc291cmNlcyhoaWRkZW5DbGFzc2VzKTsKLSAgICAgICAgbm9uT3ZlcnJpZGFibGVSZXNvdXJjZXMgPSB0b1Jlc291cmNlcyhub25PdmVycmlkYWJsZUNsYXNzZXMpOwotICAgIH0KLQotICAgIHB1YmxpYyBNdWx0aVBhcmVudENsYXNzTG9hZGVyKE11bHRpUGFyZW50Q2xhc3NMb2FkZXIgc291cmNlKSB7Ci0gICAgICAgIHRoaXMoc291cmNlLmdldFVSTHMoKSwgZGVlcENvcHlQYXJlbnRzKHNvdXJjZS5wYXJlbnRzKSwgc291cmNlLmludmVyc2VDbGFzc0xvYWRpbmcsIHNvdXJjZS5oaWRkZW5DbGFzc2VzLCBzb3VyY2Uubm9uT3ZlcnJpZGFibGVDbGFzc2VzKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgQ2xhc3NMb2FkZXIgY29weShDbGFzc0xvYWRlciBzb3VyY2UpIHsKLSAgICAgICAgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIE11bHRpUGFyZW50Q2xhc3NMb2FkZXIpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgTXVsdGlQYXJlbnRDbGFzc0xvYWRlcigoTXVsdGlQYXJlbnRDbGFzc0xvYWRlcikgc291cmNlKTsKLSAgICAgICAgfSBlbHNlIGlmIChzb3VyY2UgaW5zdGFuY2VvZiBVUkxDbGFzc0xvYWRlcikgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBVUkxDbGFzc0xvYWRlcigoKFVSTENsYXNzTG9hZGVyKSBzb3VyY2UpLmdldFVSTHMoKSwgc291cmNlLmdldFBhcmVudCgpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgVVJMQ2xhc3NMb2FkZXIobmV3IFVSTFswXSwgc291cmNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIENsYXNzTG9hZGVyIGNvcHkoKSB7Ci0gICAgICAgIHJldHVybiBNdWx0aVBhcmVudENsYXNzTG9hZGVyLmNvcHkodGhpcyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmdbXSB0b1Jlc291cmNlcyhTdHJpbmdbXSBjbGFzc2VzKSB7Ci0gICAgICAgIFN0cmluZ1tdIHJlc291cmNlcyA9IG5ldyBTdHJpbmdbY2xhc3Nlcy5sZW5ndGhdOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNsYXNzZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBjbGFzc2VzW2ldOwotICAgICAgICAgICAgcmVzb3VyY2VzW2ldID0gY2xhc3NOYW1lLnJlcGxhY2UoJy4nLCAnLycpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXNvdXJjZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5hbWVkIGNsYXNzIGxvYWRlciBhcyBhIGNoaWxkIG9mIHRoZSBzcGVjaWZpZWQgcGFyZW50cyBhbmQgdXNpbmcgdGhlIHNwZWNpZmllZCBVUkxTdHJlYW1IYW5kbGVyRmFjdG9yeQotICAgICAqIGZvciBhY2Nlc3NpbmcgdGhlIHVybHMuLgotICAgICAqCi0gICAgICogQHBhcmFtIHVybHMgICAgdGhlIHVybHMgZnJvbSB3aGljaCB0aGlzIGNsYXNzIGxvYWRlciB3aWxsIGNsYXNzZXMgYW5kIHJlc291cmNlcwotICAgICAqIEBwYXJhbSBwYXJlbnRzIHRoZSBwYXJlbnRzIG9mIHRoaXMgY2xhc3MgbG9hZGVyCi0gICAgICogQHBhcmFtIGZhY3RvcnkgdGhlIFVSTFN0cmVhbUhhbmRsZXJGYWN0b3J5IHVzZWQgdG8gYWNjZXNzIHRoZSB1cmxzCi0gICAgICovCi0gICAgcHVibGljIE11bHRpUGFyZW50Q2xhc3NMb2FkZXIoVVJMW10gdXJscywgQ2xhc3NMb2FkZXJbXSBwYXJlbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTFN0cmVhbUhhbmRsZXJGYWN0b3J5IGZhY3RvcnkpIHsKLSAgICAgICAgc3VwZXIodXJscywgbnVsbCwgZmFjdG9yeSk7Ci0gICAgICAgIHRoaXMucGFyZW50cyA9IGNvcHlQYXJlbnRzKHBhcmVudHMpOwotICAgICAgICBpbnZlcnNlQ2xhc3NMb2FkaW5nID0gZmFsc2U7Ci0gICAgICAgIGhpZGRlbkNsYXNzZXMgPSBuZXcgU3RyaW5nWzBdOwotICAgICAgICBub25PdmVycmlkYWJsZUNsYXNzZXMgPSBuZXcgU3RyaW5nWzBdOwotICAgICAgICBoaWRkZW5SZXNvdXJjZXMgPSBuZXcgU3RyaW5nWzBdOwotICAgICAgICBub25PdmVycmlkYWJsZVJlc291cmNlcyA9IG5ldyBTdHJpbmdbMF07Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3NMb2FkZXJbXSBjb3B5UGFyZW50cyhDbGFzc0xvYWRlcltdIHBhcmVudHMpIHsKLSAgICAgICAgQ2xhc3NMb2FkZXJbXSBuZXdQYXJlbnRzQXJyYXkgPSBuZXcgQ2xhc3NMb2FkZXJbcGFyZW50cy5sZW5ndGhdOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcmVudHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIENsYXNzTG9hZGVyIHBhcmVudCA9IHBhcmVudHNbaV07Ci0gICAgICAgICAgICBpZiAocGFyZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigicGFyZW50WyIgKyBpICsgIl0gaXMgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbmV3UGFyZW50c0FycmF5W2ldID0gcGFyZW50OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXdQYXJlbnRzQXJyYXk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3NMb2FkZXJbXSBkZWVwQ29weVBhcmVudHMoQ2xhc3NMb2FkZXJbXSBwYXJlbnRzKSB7Ci0gICAgICAgIENsYXNzTG9hZGVyW10gbmV3UGFyZW50c0FycmF5ID0gbmV3IENsYXNzTG9hZGVyW3BhcmVudHMubGVuZ3RoXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJlbnRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBDbGFzc0xvYWRlciBwYXJlbnQgPSBwYXJlbnRzW2ldOwotICAgICAgICAgICAgaWYgKHBhcmVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oInBhcmVudFsiICsgaSArICJdIGlzIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBNdWx0aVBhcmVudENsYXNzTG9hZGVyKSB7Ci0gICAgICAgICAgICAgICAgcGFyZW50ID0gKChNdWx0aVBhcmVudENsYXNzTG9hZGVyKSBwYXJlbnQpLmNvcHkoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG5ld1BhcmVudHNBcnJheVtpXSA9IHBhcmVudDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3UGFyZW50c0FycmF5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHBhcmVudHMgb2YgdGhpcyBjbGFzcyBsb2FkZXIuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBwYXJlbnRzIG9mIHRoaXMgY2xhc3MgbG9hZGVyCi0gICAgICovCi0gICAgcHVibGljIENsYXNzTG9hZGVyW10gZ2V0UGFyZW50cygpIHsKLSAgICAgICAgcmV0dXJuIHBhcmVudHM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkVVJMKFVSTCB1cmwpIHsKLSAgICAgICAgLy8gdG9kbyB0aGlzIG5lZWRzIGEgc2VjdXJpdHkgY2hlY2sKLSAgICAgICAgc3VwZXIuYWRkVVJMKHVybCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCBDbGFzcyBsb2FkQ2xhc3MoU3RyaW5nIG5hbWUsIGJvb2xlYW4gcmVzb2x2ZSkKLSAgICAgICAgICAgIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgLy8KLSAgICAgICAgLy8gQ2hlY2sgaWYgY2xhc3MgaXMgaW4gdGhlIGxvYWRlZCBjbGFzc2VzIGNhY2hlCi0gICAgICAgIC8vCi0gICAgICAgIENsYXNzIGNhY2hlZENsYXNzID0gZmluZExvYWRlZENsYXNzKG5hbWUpOwotICAgICAgICBpZiAoY2FjaGVkQ2xhc3MgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVDbGFzcyhjYWNoZWRDbGFzcywgcmVzb2x2ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLwotICAgICAgICAvLyBpZiB3ZSBhcmUgdXNpbmcgaW52ZXJzZSBjbGFzcyBsb2FkaW5nLCBjaGVjayBsb2NhbCB1cmxzIGZpcnN0Ci0gICAgICAgIC8vCi0gICAgICAgIGlmIChpbnZlcnNlQ2xhc3NMb2FkaW5nICYmICFpc0Rlc3Ryb3llZCgpICYmICFpc05vbk92ZXJyaWRhYmxlQ2xhc3MobmFtZSkpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgQ2xhc3MgY2xhenogPSBmaW5kQ2xhc3MobmFtZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVDbGFzcyhjbGF6eiwgcmVzb2x2ZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGlnbm9yZWQpIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vCi0gICAgICAgIC8vIENoZWNrIHBhcmVudCBjbGFzcyBsb2FkZXJzCi0gICAgICAgIC8vCi0gICAgICAgIGlmICghaXNIaWRkZW5DbGFzcyhuYW1lKSkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJlbnRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgQ2xhc3NMb2FkZXIgcGFyZW50ID0gcGFyZW50c1tpXTsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBDbGFzcyBjbGF6eiA9IHBhcmVudC5sb2FkQ2xhc3MobmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlQ2xhc3MoY2xhenosIHJlc29sdmUpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gaWdub3JlZCkgewotICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIHBhcmVudCBkaWRuJ3QgaGF2ZSB0aGUgY2xhc3M7IHRyeSB0aGUgbmV4dCBvbmUKLSAgICAgICAgICAgICAgICAgICAgLy8gIFRPRE8gUkVWSUVXIEZPUiBKQVZBIDYKLSAgICAgICAgICAgICAgICAgICAgLy8gSW4gSmF2YSA1LCBpZiB5b3UgcGFzc2VkIGFuIGFycmF5IHN0cmluZyBzdWNoIGFzICJbTGNvbS5teXBhY2thZ2UuTXlDbGFzczsiIHRvCi0gICAgICAgICAgICAgICAgICAgIC8vIGxvYWRDbGFzcywgdGhlIGNsYXNzIHdvdWxkIGluZGVlZCBiZSBsb2FkZWQuICAKLSAgICAgICAgICAgICAgICAgICAgLy8gSW4gSkRLNiwgYSBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGlzIHRocm93bi4gCi0gICAgICAgICAgICAgICAgICAgIC8vIFRoZSB3b3JrLWFyb3VuZCBpcyB0byB1c2UgY29kZSBDbGFzcy5mb3JOYW1lIGluc3RlYWQuCi0gICAgICAgICAgICAgICAgICAgIC8vIEV4YW1wbGU6Ci0gICAgICAgICAgICAgICAgICAgIC8vIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vICAgICAgIGNsYXNzTG9hZGVyLmxvYWRDbGFzcyhuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAvLyAgICAgICBDbGFzcy5mb3JOYW1lKG5hbWUsIGZhbHNlLCBsb2FkZXIpOwotICAgICAgICAgICAgICAgICAgICAvLyAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vCi0gICAgICAgIC8vIGlmIHdlIGFyZSBub3QgdXNpbmcgaW52ZXJzZSBjbGFzcyBsb2FkaW5nLCBjaGVjayBsb2NhbCB1cmxzIG5vdwotICAgICAgICAvLwotICAgICAgICAvLyBkb24ndCB3b3JyeSBhYm91dCBleGNsdWRpbmcgbm9uLW92ZXJyaWRhYmxlIGNsYXNzZXMgaGVyZS4uLiB3ZQotICAgICAgICAvLyBoYXZlIGFscmVkeSBjaGVja2VkIGhlIHBhcmVudCBhbmQgdGhlIHBhcmVudCBkaWRuJ3QgaGF2ZSB0aGUKLSAgICAgICAgLy8gY2xhc3MsIHNvIHdlIGNhbiBvdmVycmlkZSBub3cKLSAgICAgICAgaWYgKCFpc0Rlc3Ryb3llZCgpKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIENsYXNzIGNsYXp6ID0gZmluZENsYXNzKG5hbWUpOwotICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlQ2xhc3MoY2xhenosIHJlc29sdmUpOwotICAgICAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBpZ25vcmVkKSB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB0aHJvdyBuZXcgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbihuYW1lKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNOb25PdmVycmlkYWJsZUNsYXNzKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbm9uT3ZlcnJpZGFibGVDbGFzc2VzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAobmFtZS5zdGFydHNXaXRoKG5vbk92ZXJyaWRhYmxlQ2xhc3Nlc1tpXSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzSGlkZGVuQ2xhc3MoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBoaWRkZW5DbGFzc2VzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAobmFtZS5zdGFydHNXaXRoKGhpZGRlbkNsYXNzZXNbaV0pKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgQ2xhc3MgcmVzb2x2ZUNsYXNzKENsYXNzIGNsYXp6LCBib29sZWFuIHJlc29sdmUpIHsKLSAgICAgICAgaWYgKHJlc29sdmUpIHsKLSAgICAgICAgICAgIHJlc29sdmVDbGFzcyhjbGF6eik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNsYXp6OwotICAgIH0KLQotICAgIHB1YmxpYyBVUkwgZ2V0UmVzb3VyY2UoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgaWYgKGlzRGVzdHJveWVkKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8KLSAgICAgICAgLy8gaWYgd2UgYXJlIHVzaW5nIGludmVyc2UgY2xhc3MgbG9hZGluZywgY2hlY2sgbG9jYWwgdXJscyBmaXJzdAotICAgICAgICAvLwotICAgICAgICBpZiAoaW52ZXJzZUNsYXNzTG9hZGluZyAmJiAhaXNEZXN0cm95ZWQoKSAmJiAhaXNOb25PdmVycmlkYWJsZVJlc291cmNlKG5hbWUpKSB7Ci0gICAgICAgICAgICBVUkwgdXJsID0gZmluZFJlc291cmNlKG5hbWUpOwotICAgICAgICAgICAgaWYgKHVybCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHVybDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vCi0gICAgICAgIC8vIENoZWNrIHBhcmVudCBjbGFzcyBsb2FkZXJzCi0gICAgICAgIC8vCi0gICAgICAgIGlmICghaXNIaWRkZW5SZXNvdXJjZShuYW1lKSkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJlbnRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgQ2xhc3NMb2FkZXIgcGFyZW50ID0gcGFyZW50c1tpXTsKLSAgICAgICAgICAgICAgICBVUkwgdXJsID0gcGFyZW50LmdldFJlc291cmNlKG5hbWUpOwotICAgICAgICAgICAgICAgIGlmICh1cmwgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdXJsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vCi0gICAgICAgIC8vIGlmIHdlIGFyZSBub3QgdXNpbmcgaW52ZXJzZSBjbGFzcyBsb2FkaW5nLCBjaGVjayBsb2NhbCB1cmxzIG5vdwotICAgICAgICAvLwotICAgICAgICAvLyBkb24ndCB3b3JyeSBhYm91dCBleGNsdWRpbmcgbm9uLW92ZXJyaWRhYmxlIHJlc291cmNlcyBoZXJlLi4uIHdlCi0gICAgICAgIC8vIGhhdmUgYWxyZWR5IGNoZWNrZWQgaGUgcGFyZW50IGFuZCB0aGUgcGFyZW50IGRpZG4ndCBoYXZlIHRoZQotICAgICAgICAvLyByZXNvdXJjZSwgc28gd2UgY2FuIG92ZXJyaWRlIG5vdwotICAgICAgICBpZiAoIWlzRGVzdHJveWVkKCkpIHsKLSAgICAgICAgICAgIC8vIHBhcmVudHMgZGlkbid0IGhhdmUgdGhlIHJlc291cmNlOyBhdHRlbXB0IHRvIGxvYWQgaXQgZnJvbSBteSB1cmxzCi0gICAgICAgICAgICByZXR1cm4gZmluZFJlc291cmNlKG5hbWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIEVudW1lcmF0aW9uIGZpbmRSZXNvdXJjZXMoU3RyaW5nIG5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChpc0Rlc3Ryb3llZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW51bWVyYXRpb24oQ29sbGVjdGlvbnMuRU1QVFlfU0VUKTsKLSAgICAgICAgfQotCi0gICAgICAgIExpc3QgcmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgICAgIC8vCi0gICAgICAgIC8vIGlmIHdlIGFyZSB1c2luZyBpbnZlcnNlIGNsYXNzIGxvYWRpbmcsIGFkZCB0aGUgcmVzb3VyY2VzIGZyb20gbG9jYWwgdXJscyBmaXJzdAotICAgICAgICAvLwotICAgICAgICBpZiAoaW52ZXJzZUNsYXNzTG9hZGluZyAmJiAhaXNEZXN0cm95ZWQoKSkgewotICAgICAgICAgICAgTGlzdCBteVJlc291cmNlcyA9IENvbGxlY3Rpb25zLmxpc3Qoc3VwZXIuZmluZFJlc291cmNlcyhuYW1lKSk7Ci0gICAgICAgICAgICByZXNvdXJjZXMuYWRkQWxsKG15UmVzb3VyY2VzKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vCi0gICAgICAgIC8vIEFkZCBwYXJlbnQgcmVzb3VyY2VzCi0gICAgICAgIC8vCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyZW50cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgQ2xhc3NMb2FkZXIgcGFyZW50ID0gcGFyZW50c1tpXTsKLSAgICAgICAgICAgIExpc3QgcGFyZW50UmVzb3VyY2VzID0gQ29sbGVjdGlvbnMubGlzdChwYXJlbnQuZ2V0UmVzb3VyY2VzKG5hbWUpKTsKLSAgICAgICAgICAgIHJlc291cmNlcy5hZGRBbGwocGFyZW50UmVzb3VyY2VzKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vCi0gICAgICAgIC8vIGlmIHdlIGFyZSBub3QgdXNpbmcgaW52ZXJzZSBjbGFzcyBsb2FkaW5nLCBhZGQgdGhlIHJlc291cmNlcyBmcm9tIGxvY2FsIHVybHMgbm93Ci0gICAgICAgIC8vCi0gICAgICAgIGlmICghaW52ZXJzZUNsYXNzTG9hZGluZyAmJiAhaXNEZXN0cm95ZWQoKSkgewotICAgICAgICAgICAgTGlzdCBteVJlc291cmNlcyA9IENvbGxlY3Rpb25zLmxpc3Qoc3VwZXIuZmluZFJlc291cmNlcyhuYW1lKSk7Ci0gICAgICAgICAgICByZXNvdXJjZXMuYWRkQWxsKG15UmVzb3VyY2VzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbnVtZXJhdGlvbihyZXNvdXJjZXMpOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc05vbk92ZXJyaWRhYmxlUmVzb3VyY2UoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBub25PdmVycmlkYWJsZVJlc291cmNlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKG5hbWUuc3RhcnRzV2l0aChub25PdmVycmlkYWJsZVJlc291cmNlc1tpXSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzSGlkZGVuUmVzb3VyY2UoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBoaWRkZW5SZXNvdXJjZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgoaGlkZGVuUmVzb3VyY2VzW2ldKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gIlsiICsgZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiXSI7Ci0gICAgfQotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGlzRGVzdHJveWVkKCkgewotICAgICAgICByZXR1cm4gZGVzdHJveWVkOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRlc3Ryb3koKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewotICAgICAgICAgICAgaWYgKGRlc3Ryb3llZCkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRlc3Ryb3llZCA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBMb2dGYWN0b3J5LnJlbGVhc2UodGhpcyk7Ci0vLyAgICAgICAgY2xlYXJTb2Z0Q2FjaGUoT2JqZWN0SW5wdXRTdHJlYW0uY2xhc3MsICJzdWJjbGFzc0F1ZGl0cyIpOwotLy8gICAgICAgIGNsZWFyU29mdENhY2hlKE9iamVjdE91dHB1dFN0cmVhbS5jbGFzcywgInN1YmNsYXNzQXVkaXRzIik7Ci0vLyAgICAgICAgY2xlYXJTb2Z0Q2FjaGUoT2JqZWN0U3RyZWFtQ2xhc3MuY2xhc3MsICJsb2NhbERlc2NzIik7Ci0vLyAgICAgICAgY2xlYXJTb2Z0Q2FjaGUoT2JqZWN0U3RyZWFtQ2xhc3MuY2xhc3MsICJyZWZsZWN0b3JzIik7Ci0KLSAgICAgICAgLy8gVGhlIGJlYW5JbmZvQ2FjaGUgaW4gamF2YS5iZWFucy5JbnRyb3NwZWN0b3Igd2lsbCBob2xkIG9uIHRvIENsYXNzZXMgd2hpY2gKLSAgICAgICAgLy8gaXQgaGFzIGludHJvc3BlY3RlZC4gSWYgd2UgZG9uJ3QgZmx1c2ggdGhlIGNhY2hlLCB3ZSBtYXkgcnVuIG91dCBvZgotICAgICAgICAvLyBQZXJtYW5lbnQgR2VuZXJhdGlvbiBzcGFjZS4KLSAgICAgICAgSW50cm9zcGVjdG9yLmZsdXNoQ2FjaGVzKCk7Ci0gICAgfQotCi0vLyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgbG9jayA9IG5ldyBPYmplY3QoKTsKLS8vICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gY2xlYXJTb2Z0Q2FjaGVGYWlsZWQgPSBmYWxzZTsKLS8vCi0vLyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGNsZWFyU29mdENhY2hlKENsYXNzIGNsYXp6LCBTdHJpbmcgZmllbGROYW1lKSB7Ci0vLyAgICAgICAgTWFwIGNhY2hlID0gbnVsbDsKLS8vICAgICAgICB0cnkgewotLy8gICAgICAgICAgICBGaWVsZCBmID0gY2xhenouZ2V0RGVjbGFyZWRGaWVsZChmaWVsZE5hbWUpOwotLy8gICAgICAgICAgICBmLnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0vLyAgICAgICAgICAgIGNhY2hlID0gKE1hcCkgZi5nZXQobnVsbCk7Ci0vLyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLS8vICAgICAgICAgICAgc3luY2hyb25pemVkIChsb2NrKSB7Ci0vLyAgICAgICAgICAgICAgICBpZiAoIWNsZWFyU29mdENhY2hlRmFpbGVkKSB7Ci0vLyAgICAgICAgICAgICAgICAgICAgY2xlYXJTb2Z0Q2FjaGVGYWlsZWQgPSB0cnVlOwotLy8gICAgICAgICAgICAgICAgICAgIExvZ0ZhY3RvcnkuZ2V0TG9nKENvbmZpZ3VyYXRpb25DbGFzc0xvYWRlci5jbGFzcykuZXJyb3IoIlVuYWJsZSB0byBjbGVhciBTb2Z0Q2FjaGUgZmllbGQgIiArIGZpZWxkTmFtZSArICIgaW4gY2xhc3MgIiArIGNsYXp6KTsKLS8vICAgICAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgfQotLy8gICAgICAgIH0KLS8vCi0vLyAgICAgICAgaWYgKGNhY2hlICE9IG51bGwpIHsKLS8vICAgICAgICAgICAgc3luY2hyb25pemVkIChjYWNoZSkgewotLy8gICAgICAgICAgICAgICAgY2FjaGUuY2xlYXIoKTsKLS8vICAgICAgICAgICAgfQotLy8gICAgICAgIH0KLS8vICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsYXNzbG9hZGVyL1Jlc291cmNlRW51bWVyYXRpb24uamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbGFzc2xvYWRlci9SZXNvdXJjZUVudW1lcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3YjYzNTIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsYXNzbG9hZGVyL1Jlc291cmNlRW51bWVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNsYXNzbG9hZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBAdmVyc2lvbiAkUmV2JCAkRGF0ZSQKLSAqLwotcHVibGljIGNsYXNzIFJlc291cmNlRW51bWVyYXRpb24gaW1wbGVtZW50cyBFbnVtZXJhdGlvbiB7Ci0gICAgcHJpdmF0ZSBJdGVyYXRvciBpdGVyYXRvcjsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyByZXNvdXJjZU5hbWU7Ci0gICAgcHJpdmF0ZSBPYmplY3QgbmV4dDsKLQotICAgIHB1YmxpYyBSZXNvdXJjZUVudW1lcmF0aW9uKENvbGxlY3Rpb24gcmVzb3VyY2VMb2NhdGlvbnMsIFN0cmluZyByZXNvdXJjZU5hbWUpIHsKLSAgICAgICAgdGhpcy5pdGVyYXRvciA9IHJlc291cmNlTG9jYXRpb25zLml0ZXJhdG9yKCk7Ci0gICAgICAgIHRoaXMucmVzb3VyY2VOYW1lID0gcmVzb3VyY2VOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGhhc01vcmVFbGVtZW50cygpIHsKLSAgICAgICAgZmV0Y2hOZXh0KCk7Ci0gICAgICAgIHJldHVybiAobmV4dCAhPSBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IG5leHRFbGVtZW50KCkgewotICAgICAgICBmZXRjaE5leHQoKTsKLQotICAgICAgICAvLyBzYXZlIG5leHQgaW50byBhIGxvY2FsIHZhcmlhYmxlIGFuZCBjbGVhciB0aGUgbmV4dCBmaWVsZAotICAgICAgICBPYmplY3QgbmV4dCA9IHRoaXMubmV4dDsKLSAgICAgICAgdGhpcy5uZXh0ID0gbnVsbDsKLQotICAgICAgICAvLyBpZiB3ZSBkaWRuJ3QgaGF2ZSBhIG5leHQgdGhyb3cgYW4gZXhjZXB0aW9uCi0gICAgICAgIGlmIChuZXh0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5leHQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGZldGNoTmV4dCgpIHsKLSAgICAgICAgaWYgKGl0ZXJhdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAobmV4dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIFJlc291cmNlTG9jYXRpb24gcmVzb3VyY2VMb2NhdGlvbiA9IChSZXNvdXJjZUxvY2F0aW9uKSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgUmVzb3VyY2VIYW5kbGUgcmVzb3VyY2VIYW5kbGUgPSByZXNvdXJjZUxvY2F0aW9uLmdldFJlc291cmNlSGFuZGxlKHJlc291cmNlTmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc291cmNlSGFuZGxlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbmV4dCA9IHJlc291cmNlSGFuZGxlLmdldFVybCgpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gbm8gbW9yZSBlbGVtZW50cwotICAgICAgICAgICAgLy8gY2xlYXIgdGhlIGl0ZXJhdG9yIHNvIGl0IGNhbiBiZSBHQ2VkCi0gICAgICAgICAgICBpdGVyYXRvciA9IG51bGw7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBKYXIgZmlsZSB3YXMgY2xvc2VkLi4uIHRoaXMgbWVhbnMgdGhlIHJlc291cmNlIGZpbmRlciB3YXMgZGVzdHJveWVkCi0gICAgICAgICAgICAvLyBjbGVhciB0aGUgaXRlcmF0b3Igc28gaXQgY2FuIGJlIEdDZWQKLSAgICAgICAgICAgIGl0ZXJhdG9yID0gbnVsbDsKLSAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY2xhc3Nsb2FkZXIvUmVzb3VyY2VGaW5kZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbGFzc2xvYWRlci9SZXNvdXJjZUZpbmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2M2NWM2Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbGFzc2xvYWRlci9SZXNvdXJjZUZpbmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY2xhc3Nsb2FkZXI7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotCi0vKioKLSAqIEFic3RyYWN0aW9uIG9mIHJlc291cmNlIHNlYXJjaGluZyBwb2xpY3kuIEdpdmVuIHJlc291cmNlIG5hbWUsIHRoZSByZXNvdXJjZQotICogZmluZGVyIHBlcmZvcm1zIGltcGxlbWVudGF0aW9uLXNwZWNpZmljIGxvb2t1cCwgYW5kLCBpZiBpdCBpcyBhYmxlIHRvIGxvY2F0ZQotICogdGhlIHJlc291cmNlLCByZXR1cm5zIHRoZSB7QGxpbmsgQWJzdHJhY3RSZXNvdXJjZUhhbmRsZSBoYW5kbGUocyl9IG9yIFVSTChzKSBvZiBpdC4KLSAqCi0gKiBAdmVyc2lvbiAkUmV2JCAkRGF0ZSQKLSAqLwotcHVibGljIGludGVyZmFjZSBSZXNvdXJjZUZpbmRlciB7Ci0gICAgLyoqCi0gICAgICogRmluZCB0aGUgcmVzb3VyY2UgYnkgbmFtZSBhbmQgcmV0dXJuIFVSTCBvZiBpdCBpZiBmb3VuZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSByZXNvdXJjZSBuYW1lCi0gICAgICogQHJldHVybiByZXNvdXJjZSBVUkwgb3IgbnVsbCBpZiByZXNvdXJjZSB3YXMgbm90IGZvdW5kCi0gICAgICovCi0gICAgcHVibGljIFVSTCBmaW5kUmVzb3VyY2UoU3RyaW5nIG5hbWUpOwotCi0gICAgLyoqCi0gICAgICogRmluZCBhbGwgcmVzb3VyY2VzIHdpdGggZ2l2ZW4gbmFtZSBhbmQgcmV0dXJuIGVudW1lcmF0aW9uIG9mIHRoZWlyIFVSTHMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgcmVzb3VyY2UgbmFtZQotICAgICAqIEByZXR1cm4gZW51bWVyYXRpb24gb2YgcmVzb3VyY2UgVVJMcyAocG9zc2libHkgZW1wdHkpLgotICAgICAqLwotICAgIHB1YmxpYyBFbnVtZXJhdGlvbiBmaW5kUmVzb3VyY2VzKFN0cmluZyBuYW1lKTsKLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgcmVzb3VyY2UgYnkgbmFtZSBhbmQsIGlmIGZvdW5kLCBvcGVuIGNvbm5lY3Rpb24gdG8gaXQgYW5kIHJldHVybgotICAgICAqIHRoZSB7QGxpbmsgQWJzdHJhY3RSZXNvdXJjZUhhbmRsZSBoYW5kbGV9IG9mIGl0LgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIHJlc291cmNlIG5hbWUKLSAgICAgKiBAcmV0dXJuIHJlc291cmNlIGhhbmRsZSBvciBudWxsIGlmIHJlc291cmNlIHdhcyBub3QgZm91bmQKLSAgICAgKi8KLSAgICBwdWJsaWMgUmVzb3VyY2VIYW5kbGUgZ2V0UmVzb3VyY2UoU3RyaW5nIG5hbWUpOwotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY2xhc3Nsb2FkZXIvUmVzb3VyY2VIYW5kbGUuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbGFzc2xvYWRlci9SZXNvdXJjZUhhbmRsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWVjYWYwLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbGFzc2xvYWRlci9SZXNvdXJjZUhhbmRsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoqCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY2xhc3Nsb2FkZXI7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5qYXIuTWFuaWZlc3Q7Ci1pbXBvcnQgamF2YS51dGlsLmphci5BdHRyaWJ1dGVzOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZTsKLQotLyoqCi0gKiBUaGlzIGlzIGEgaGFuZGxlIChhIGNvbm5lY3Rpb24pIHRvIHNvbWUgcmVzb3VyY2UsIHdoaWNoIG1heQotICogYmUgYSBjbGFzcywgbmF0aXZlIGxpYnJhcnksIHRleHQgZmlsZSwgaW1hZ2UsIGV0Yy4gSGFuZGxlcyBhcmUgcmV0dXJuZWQKLSAqIGJ5IGEgUmVzb3VyY2VGaW5kZXIuIEEgcmVzb3VyY2UgaGFuZGxlIGFsbG93cyBlYXN5IGFjY2VzcyB0byB0aGUgcmVzb3VyY2UgZGF0YQotICogKHVzaW5nIG1ldGhvZHMge0BsaW5rICNnZXRJbnB1dFN0cmVhbX0gb3Ige0BsaW5rICNnZXRCeXRlc30pIGFzIHdlbGwgYXMKLSAqIGFjY2VzcyByZXNvdXJjZSBtZXRhZGF0YSwgc3VjaCBhcyBhdHRyaWJ1dGVzLCBjZXJ0aWZpY2F0ZXMsIGV0Yy4KLSAqIDxwLz4KLSAqIEFzIHNvb24gYXMgdGhlIGhhbmRsZSBpcyBubyBsb25nZXIgaW4gdXNlLCBpdCBzaG91bGQgYmUgZXhwbGljaXRseQotICoge0BsaW5rICNjbG9zZX1kLCBzaW1pbGFybHkgdG8gSS9PIHN0cmVhbXMuCi0gKgotICogQHZlcnNpb24gJFJldiQgJERhdGUkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUmVzb3VyY2VIYW5kbGUgewotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgcmVzb3VyY2UuIFRoZSBuYW1lIGlzIGEgIi8iLXNlcGFyYXRlZCBwYXRoCi0gICAgICogbmFtZSB0aGF0IGlkZW50aWZpZXMgdGhlIHJlc291cmNlLgotICAgICAqLwotICAgIFN0cmluZyBnZXROYW1lKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBVUkwgb2YgdGhlIHJlc291cmNlLgotICAgICAqLwotICAgIFVSTCBnZXRVcmwoKTsKLQotICAgIC8qKgotICAgICAqIERvZXMgdGhpcyByZXNvdXJjZSByZWZlciB0byBhIGRpcmVjdG9yeS4gIERpcmVjdG9yeSByZXNvdXJjZXMgYXJlIGNvbW1seSB1c2VkCi0gICAgICogYXMgdGhlIGJhc2lzIGZvciBhIFVSTCBpbiBjbGllbnQgYXBwbGljYXRpb24uICBBIGRpcmVjdG9yeSByZXNvdXJjZSBoYXMgMCBieXRlcyBmb3IgaXQncyBjb250ZW50LiAKLSAgICAgKi8KLSAgICBib29sZWFuIGlzRGlyZWN0b3J5KCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBDb2RlU291cmNlIFVSTCBmb3IgdGhlIGNsYXNzIG9yIHJlc291cmNlLgotICAgICAqLwotICAgIFVSTCBnZXRDb2RlU291cmNlVXJsKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuZCBJbnB1dFN0cmVhbSBmb3IgcmVhZGluZyB0aGlzIHJlc291cmNlIGRhdGEuCi0gICAgICovCi0gICAgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhpcyByZXNvdXJjZSBkYXRhLCBvciAtMSBpZiB1bmtub3duLgotICAgICAqLwotICAgIGludCBnZXRDb250ZW50TGVuZ3RoKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoaXMgcmVzb3VyY2UgZGF0YSBhcyBhbiBhcnJheSBvZiBieXRlcy4KLSAgICAgKi8KLSAgICBieXRlW10gZ2V0Qnl0ZXMoKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBNYW5pZmVzdCBvZiB0aGUgSkFSIGZpbGUgZnJvbSB3aGljaCB0aGlzIHJlc291cmNlCi0gICAgICogd2FzIGxvYWRlZCwgb3IgbnVsbCBpZiBub25lLgotICAgICAqLwotICAgIE1hbmlmZXN0IGdldE1hbmlmZXN0KCkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBDZXJ0aWZpY2F0ZXMgb2YgdGhlIHJlc291cmNlLCBvciBudWxsIGlmIG5vbmUuCi0gICAgICovCi0gICAgQ2VydGlmaWNhdGVbXSBnZXRDZXJ0aWZpY2F0ZXMoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgQXR0cmlidXRlcyBvZiB0aGUgcmVzb3VyY2UsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKi8KLSAgICBBdHRyaWJ1dGVzIGdldEF0dHJpYnV0ZXMoKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBDbG9zZXMgYSBjb25uZWN0aW9uIHRvIHRoZSByZXNvdXJjZSBpbmRlbnRpZmllZCBieSB0aGlzIGhhbmRsZS4gUmVsZWFzZXMKLSAgICAgKiBhbnkgSS9PIG9iamVjdHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBoYW5kbGUuCi0gICAgICovCi0gICAgdm9pZCBjbG9zZSgpOwotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsYXNzbG9hZGVyL1Jlc291cmNlTG9jYXRpb24uamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbGFzc2xvYWRlci9SZXNvdXJjZUxvY2F0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3M2YyYmUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsYXNzbG9hZGVyL1Jlc291cmNlTG9jYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNsYXNzbG9hZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLmphci5NYW5pZmVzdDsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotLyoqCi0gKiBUaGlzIGlzIGEgbG9jYXRpb24gd2hpY2ggaXMgc2VhcmNoZWQgYnkKLSAqIAotICogQHZlcnNpb24gJFJldiQgJERhdGUkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUmVzb3VyY2VMb2NhdGlvbiB7Ci0gICAgVVJMIGdldENvZGVTb3VyY2UoKTsgICAgCi0gICAgUmVzb3VyY2VIYW5kbGUgZ2V0UmVzb3VyY2VIYW5kbGUoU3RyaW5nIHJlc291cmNlTmFtZSk7Ci0gICAgTWFuaWZlc3QgZ2V0TWFuaWZlc3QoKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0gICAgdm9pZCBjbG9zZSgpOwotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsYXNzbG9hZGVyL1VybFJlc291cmNlRmluZGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY2xhc3Nsb2FkZXIvVXJsUmVzb3VyY2VGaW5kZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRmODBhOC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY2xhc3Nsb2FkZXIvVXJsUmVzb3VyY2VGaW5kZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5MyArMCwwIEBACi0vKioKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jbGFzc2xvYWRlcjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotaW1wb3J0IGphdmEudXRpbC5qYXIuQXR0cmlidXRlczsKLWltcG9ydCBqYXZhLnV0aWwuamFyLk1hbmlmZXN0OwotCi0vKioKLSAqIEB2ZXJzaW9uICRSZXYkICREYXRlJAotICovCi1wdWJsaWMgY2xhc3MgVXJsUmVzb3VyY2VGaW5kZXIgaW1wbGVtZW50cyBSZXNvdXJjZUZpbmRlciB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgbG9jayA9IG5ldyBPYmplY3QoKTsKLSAgICBwcml2YXRlIGZpbmFsIExpbmtlZEhhc2hTZXQ8VVJMPiB1cmxzID0gbmV3IExpbmtlZEhhc2hTZXQ8VVJMPigpOwotICAgIHByaXZhdGUgZmluYWwgTGlua2VkSGFzaE1hcDxVUkwsUmVzb3VyY2VMb2NhdGlvbj4gY2xhc3NQYXRoID0gbmV3IExpbmtlZEhhc2hNYXA8VVJMLFJlc291cmNlTG9jYXRpb24+KCk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBMaW5rZWRIYXNoU2V0PEZpbGU+IHdhdGNoZWRGaWxlcyA9IG5ldyBMaW5rZWRIYXNoU2V0PEZpbGU+KCk7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gZGVzdHJveWVkID0gZmFsc2U7Ci0KLSAgICBwdWJsaWMgVXJsUmVzb3VyY2VGaW5kZXIoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIFVybFJlc291cmNlRmluZGVyKFVSTFtdIHVybHMpIHsKLSAgICAgICAgYWRkVXJscyh1cmxzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkZXN0cm95KCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKGxvY2spIHsKLSAgICAgICAgICAgIGlmIChkZXN0cm95ZWQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZXN0cm95ZWQgPSB0cnVlOwotICAgICAgICAgICAgdXJscy5jbGVhcigpOwotICAgICAgICAgICAgZm9yIChSZXNvdXJjZUxvY2F0aW9uIHJlc291cmNlTG9jYXRpb24gOiBjbGFzc1BhdGgudmFsdWVzKCkpIHsKLSAgICAgICAgICAgICAgICByZXNvdXJjZUxvY2F0aW9uLmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjbGFzc1BhdGguY2xlYXIoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBSZXNvdXJjZUhhbmRsZSBnZXRSZXNvdXJjZShTdHJpbmcgcmVzb3VyY2VOYW1lKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobG9jaykgewotICAgICAgICAgICAgaWYgKGRlc3Ryb3llZCkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8VVJMLCBSZXNvdXJjZUxvY2F0aW9uPiBlbnRyeSA6IGdldENsYXNzUGF0aCgpLmVudHJ5U2V0KCkpIHsKLSAgICAgICAgICAgICAgICBSZXNvdXJjZUxvY2F0aW9uIHJlc291cmNlTG9jYXRpb24gPSBlbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIFJlc291cmNlSGFuZGxlIHJlc291cmNlSGFuZGxlID0gcmVzb3VyY2VMb2NhdGlvbi5nZXRSZXNvdXJjZUhhbmRsZShyZXNvdXJjZU5hbWUpOwotICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZUhhbmRsZSAhPSBudWxsICYmICFyZXNvdXJjZUhhbmRsZS5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNvdXJjZUhhbmRsZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIFVSTCBmaW5kUmVzb3VyY2UoU3RyaW5nIHJlc291cmNlTmFtZSkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKGxvY2spIHsKLSAgICAgICAgICAgIGlmIChkZXN0cm95ZWQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PFVSTCwgUmVzb3VyY2VMb2NhdGlvbj4gZW50cnkgOiBnZXRDbGFzc1BhdGgoKS5lbnRyeVNldCgpKSB7Ci0gICAgICAgICAgICAgICAgUmVzb3VyY2VMb2NhdGlvbiByZXNvdXJjZUxvY2F0aW9uID0gZW50cnkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBSZXNvdXJjZUhhbmRsZSByZXNvdXJjZUhhbmRsZSA9IHJlc291cmNlTG9jYXRpb24uZ2V0UmVzb3VyY2VIYW5kbGUocmVzb3VyY2VOYW1lKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzb3VyY2VIYW5kbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzb3VyY2VIYW5kbGUuZ2V0VXJsKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBFbnVtZXJhdGlvbiBmaW5kUmVzb3VyY2VzKFN0cmluZyByZXNvdXJjZU5hbWUpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChsb2NrKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlRW51bWVyYXRpb24obmV3IEFycmF5TGlzdDxSZXNvdXJjZUxvY2F0aW9uPihnZXRDbGFzc1BhdGgoKS52YWx1ZXMoKSksIHJlc291cmNlTmFtZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRVcmwoVVJMIHVybCkgewotICAgICAgICBhZGRVcmxzKENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QodXJsKSk7Ci0gICAgfQotCi0gICAgcHVibGljIFVSTFtdIGdldFVybHMoKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobG9jaykgewotICAgICAgICAgICAgcmV0dXJuIHVybHMudG9BcnJheShuZXcgVVJMW3VybHMuc2l6ZSgpXSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGFuIGFycmF5IG9mIHVybHMgdG8gdGhlIGVuZCBvZiB0aGlzIGNsYXNzIGxvYWRlci4KLSAgICAgKiBAcGFyYW0gdXJscyB0aGUgVVJMcyB0byBhZGQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRVcmxzKFVSTFtdIHVybHMpIHsKLSAgICAgICAgYWRkVXJscyhBcnJheXMuYXNMaXN0KHVybHMpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgbGlzdCBvZiB1cmxzIHRvIHRoZSBlbmQgb2YgdGhpcyBjbGFzcyBsb2FkZXIuCi0gICAgICogQHBhcmFtIHVybHMgdGhlIFVSTHMgdG8gYWRkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkVXJscyhMaXN0PFVSTD4gdXJscykgewotICAgICAgICBzeW5jaHJvbml6ZWQgKGxvY2spIHsKLSAgICAgICAgICAgIGlmIChkZXN0cm95ZWQpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJVcmxSZXNvdXJjZUZpbmRlciBoYXMgYmVlbiBkZXN0cm95ZWQiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYm9vbGVhbiBzaG91bGRSZWJ1aWxkID0gdGhpcy51cmxzLmFkZEFsbCh1cmxzKTsKLSAgICAgICAgICAgIGlmIChzaG91bGRSZWJ1aWxkKSB7Ci0gICAgICAgICAgICAgICAgcmVidWlsZENsYXNzUGF0aCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBMaW5rZWRIYXNoTWFwPFVSTCwgUmVzb3VyY2VMb2NhdGlvbj4gZ2V0Q2xhc3NQYXRoKCkgewotICAgICAgICBhc3NlcnQgVGhyZWFkLmhvbGRzTG9jayhsb2NrKTogIlRoaXMgbWV0aG9kIGNhbiBvbmx5IGJlIGNhbGxlZCB3aGlsZSBob2xkaW5nIHRoZSBsb2NrIjsKLQotICAgICAgICBmb3IgKEZpbGUgZmlsZSA6IHdhdGNoZWRGaWxlcykgewotICAgICAgICAgICAgaWYgKGZpbGUuY2FuUmVhZCgpKSB7Ci0gICAgICAgICAgICAgICAgcmVidWlsZENsYXNzUGF0aCgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGNsYXNzUGF0aDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWJ1aWxkcyB0aGUgZW50aXJlIGNsYXNzIHBhdGguICBUaGlzIGNsYXNzIGlzIGNhbGxlZCB3aGVuIG5ldyBVUkxzIGFyZSBhZGRlZCBvciBvbmUgb2YgdGhlIHdhdGNoZWQgZmlsZXMKLSAgICAgKiBiZWNvbWVzIHJlYWRhYmxlLiAgVGhpcyBtZXRob2Qgd2lsbCBub3Qgb3BlbiBqYXIgZmlsZXMgYWdhaW4sIGJ1dCB3aWxsIGFkZCBhbnkgbmV3IGVudHJpZXMgbm90IGFscmVkeSBvcGVuCi0gICAgICogdG8gdGhlIGNsYXNzIHBhdGguICBJZiBhbnkgZmlsZSBiYXNlZCB1cmwgaXMgZG9lcyBub3QgZXhpc3QsIHdlIHdpbGwgd2F0Y2ggZm9yIHRoYXQgZmlsZSB0byBhcHBlYXIuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHJlYnVpbGRDbGFzc1BhdGgoKSB7Ci0gICAgICAgIGFzc2VydCBUaHJlYWQuaG9sZHNMb2NrKGxvY2spOiAiVGhpcyBtZXRob2QgY2FuIG9ubHkgYmUgY2FsbGVkIHdoaWxlIGhvbGRpbmcgdGhlIGxvY2siOwotCi0gICAgICAgIC8vIGNvcHkgYWxsIG9mIHRoZSBleGlzdGluZyBsb2NhdGlvbnMgaW50byBhIHRlbXAgbWFwIGFuZCBjbGVhciB0aGUgY2xhc3MgcGF0aAotICAgICAgICBNYXA8VVJMLFJlc291cmNlTG9jYXRpb24+IGV4aXN0aW5nSmFyRmlsZXMgPSBuZXcgTGlua2VkSGFzaE1hcDxVUkwsUmVzb3VyY2VMb2NhdGlvbj4oY2xhc3NQYXRoKTsKLSAgICAgICAgY2xhc3NQYXRoLmNsZWFyKCk7Ci0KLSAgICAgICAgTGlua2VkTGlzdDxVUkw+IGxvY2F0aW9uU3RhY2sgPSBuZXcgTGlua2VkTGlzdDxVUkw+KHVybHMpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgd2hpbGUgKCFsb2NhdGlvblN0YWNrLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIFVSTCB1cmwgPSBsb2NhdGlvblN0YWNrLnJlbW92ZUZpcnN0KCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBTa2lwIGFueSBkdXBsaWNhdGUgdXJscyBpbiB0aGUgY2xhc3NwYXRoCi0gICAgICAgICAgICAgICAgaWYgKGNsYXNzUGF0aC5jb250YWluc0tleSh1cmwpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIENoZWNrIGlzIHRoaXMgVVJMIGhhcyBhbHJlYWR5IGJlZW4gb3BlbmVkCi0gICAgICAgICAgICAgICAgUmVzb3VyY2VMb2NhdGlvbiByZXNvdXJjZUxvY2F0aW9uID0gZXhpc3RpbmdKYXJGaWxlcy5yZW1vdmUodXJsKTsKLQotICAgICAgICAgICAgICAgIC8vIElmIG5vdCBvcGVuZWQsIGNhY2hlIHRoZSB1cmwgYW5kIHdyYXAgaXQgd2l0aCBhIHJlc291cmNlIGxvY2F0aW9uCi0gICAgICAgICAgICAgICAgaWYgKHJlc291cmNlTG9jYXRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgRmlsZSBmaWxlID0gY2FjaGVVcmwodXJsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlTG9jYXRpb24gPSBjcmVhdGVSZXNvdXJjZUxvY2F0aW9uKHVybCwgZmlsZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGlzIGlzIGEgZmlsZSBVUkwsIHRoZSBmaWxlIGRvZXNuJ3QgZXhpc3QgeWV0Li4uIHdhdGNoIHRvIHNlZSBpZiBpdCBhcHBlYXJzIGxhdGVyCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoImZpbGUiLmVxdWFscyh1cmwuZ2V0UHJvdG9jb2woKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZSh1cmwuZ2V0UGF0aCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXRjaGVkRmlsZXMuYWRkKGZpbGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlnbm9yZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbid0IHNlZW0gdG8gb3BlbiB0aGUgZmlsZS4uLiB0aGlzIGlzIG1vc3QgbGlrZWx5IGEgYmFkIGphciBmaWxlCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBzbyBkb24ndCBrZWVwIGEgd2F0Y2ggb3V0IGZvciBpdCBiZWNhdXNlIHRoYXQgd291bGQgcmVxdWlyZSBsb3RzIG9mIGNoZWNraW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBEYWluOiBXZSBtYXkgd2FudCB0byByZXZpZXcgdGhpcyBkZWNpc2lvbiBsYXRlcgotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcHJvdG9jb2wgZm9yIHRoZSBKQVIgZmlsZSdzIFVSTCBpcyBub3Qgc3VwcG9ydGVkLiAgVGhpcyBjYW4gb2NjdXIgd2hlbgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGphciBmaWxlIGlzIGVtYmVkZGVkIGluIGFuIEVBUiBvciBDQVIgZmlsZS4gIFByb2NlZWQgYnV0IGxvZyB0aGUgbWVzc2FnZS4KLSAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGhlIHByb3RvY29sIGZvciB0aGUgSkFSIGZpbGUncyBVUkwgaXMgbm90IHN1cHBvcnRlZCIgKyBleCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIGFkZCB0aGUgamFyIHRvIG91ciBjbGFzcyBwYXRoCi0gICAgICAgICAgICAgICAgY2xhc3NQYXRoLnB1dChyZXNvdXJjZUxvY2F0aW9uLmdldENvZGVTb3VyY2UoKSwgcmVzb3VyY2VMb2NhdGlvbik7Ci0KLSAgICAgICAgICAgICAgICAvLyBwdXNoIHRoZSBtYW5pZmVzdCBjbGFzc3BhdGggb24gdGhlIHN0YWNrIChtYWtlIHN1cmUgdG8gbWFpbnRhaW4gdGhlIG9yZGVyKQotICAgICAgICAgICAgICAgIExpc3Q8VVJMPiBtYW5pZmVzdENsYXNzUGF0aCA9IGdldE1hbmlmZXN0Q2xhc3NQYXRoKHJlc291cmNlTG9jYXRpb24pOwotICAgICAgICAgICAgICAgIGxvY2F0aW9uU3RhY2suYWRkQWxsKDAsIG1hbmlmZXN0Q2xhc3NQYXRoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRXJyb3IgZSkgewotICAgICAgICAgICAgZGVzdHJveSgpOwotICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoUmVzb3VyY2VMb2NhdGlvbiByZXNvdXJjZUxvY2F0aW9uIDogZXhpc3RpbmdKYXJGaWxlcy52YWx1ZXMoKSkgewotICAgICAgICAgICAgcmVzb3VyY2VMb2NhdGlvbi5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIEZpbGUgY2FjaGVVcmwoVVJMIHVybCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCEiZmlsZSIuZXF1YWxzKHVybC5nZXRQcm90b2NvbCgpKSkgewotICAgICAgICAgICAgLy8gZG93bmxvYWQgdGhlIGphcgotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJPbmx5IGxvY2FsIGZpbGUgamFycyBhcmUgc3VwcG9ydGVkICIgKyB1cmwpOwotICAgICAgICB9Ci0KLSAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUodXJsLmdldFBhdGgoKSk7Ci0gICAgICAgIGlmICghZmlsZS5leGlzdHMoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbihmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIWZpbGUuY2FuUmVhZCgpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkZpbGUgaXMgbm90IHJlYWRhYmxlOiAiICsgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZpbGU7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFJlc291cmNlTG9jYXRpb24gY3JlYXRlUmVzb3VyY2VMb2NhdGlvbihVUkwgY29kZVNvdXJjZSwgRmlsZSBjYWNoZUZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghY2FjaGVGaWxlLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKGNhY2hlRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFjYWNoZUZpbGUuY2FuUmVhZCgpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkZpbGUgaXMgbm90IHJlYWRhYmxlOiAiICsgY2FjaGVGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFJlc291cmNlTG9jYXRpb24gcmVzb3VyY2VMb2NhdGlvbjsKLSAgICAgICAgaWYgKGNhY2hlRmlsZS5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICAvLyBEaXJlY3RvcnlSZXNvdXJjZUxvY2F0aW9uIHdpbGwgb25seSByZXR1cm4gImZpbGUiIFVSTHMgd2l0aGluIHRoaXMgZGlyZWN0b3J5Ci0gICAgICAgICAgICAvLyBkbyBub3QgdXNlciB0aGUgRGlyZWN0b3J5UmVzb3VyY2VMb2NhdGlvbiBmb3Igbm9uIGZpbGUgYmFzZWQgdXJscwotICAgICAgICAgICAgcmVzb3VyY2VMb2NhdGlvbiA9IG5ldyBEaXJlY3RvcnlSZXNvdXJjZUxvY2F0aW9uKGNhY2hlRmlsZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXNvdXJjZUxvY2F0aW9uID0gbmV3IEphclJlc291cmNlTG9jYXRpb24oY29kZVNvdXJjZSwgY2FjaGVGaWxlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzb3VyY2VMb2NhdGlvbjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIExpc3Q8VVJMPiBnZXRNYW5pZmVzdENsYXNzUGF0aChSZXNvdXJjZUxvY2F0aW9uIHJlc291cmNlTG9jYXRpb24pIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIGdldCB0aGUgbWFuaWZlc3QsIGlmIHBvc3NpYmxlCi0gICAgICAgICAgICBNYW5pZmVzdCBtYW5pZmVzdCA9IHJlc291cmNlTG9jYXRpb24uZ2V0TWFuaWZlc3QoKTsKLSAgICAgICAgICAgIGlmIChtYW5pZmVzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gc29tZSBsb2NhdGlvbnMgZG9uJ3QgaGF2ZSBhIG1hbmlmZXN0Ci0gICAgICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGdldCB0aGUgY2xhc3MtcGF0aCBhdHRyaWJ1dGUsIGlmIHBvc3NpYmxlCi0gICAgICAgICAgICBTdHJpbmcgbWFuaWZlc3RDbGFzc1BhdGggPSBtYW5pZmVzdC5nZXRNYWluQXR0cmlidXRlcygpLmdldFZhbHVlKEF0dHJpYnV0ZXMuTmFtZS5DTEFTU19QQVRIKTsKLSAgICAgICAgICAgIGlmIChtYW5pZmVzdENsYXNzUGF0aCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGJ1aWxkIHRoZSB1cmxzLi4uCi0gICAgICAgICAgICAvLyB0aGUgY2xhc3MtcGF0aCBhdHRyaWJ1dGUgaXMgc3BhY2UgZGVsaW1pdGVkCi0gICAgICAgICAgICBVUkwgY29kZVNvdXJjZSA9IHJlc291cmNlTG9jYXRpb24uZ2V0Q29kZVNvdXJjZSgpOwotICAgICAgICAgICAgTGlua2VkTGlzdDxVUkw+IGNsYXNzUGF0aFVybHMgPSBuZXcgTGlua2VkTGlzdDxVUkw+KCk7Ci0gICAgICAgICAgICBmb3IgKFN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKG1hbmlmZXN0Q2xhc3NQYXRoLCAiICIpOyB0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpOykgewotICAgICAgICAgICAgICAgIFN0cmluZyBlbnRyeSA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAvLyB0aGUgY2xhc3MgcGF0aCBlbnRyeSBpcyByZWxhdGl2ZSB0byB0aGUgcmVzb3VyY2UgbG9jYXRpb24gY29kZSBzb3VyY2UKLSAgICAgICAgICAgICAgICAgICAgVVJMIGVudHJ5VXJsID0gbmV3IFVSTChjb2RlU291cmNlLCBlbnRyeSk7Ci0gICAgICAgICAgICAgICAgICAgIGNsYXNzUGF0aFVybHMuYWRkTGFzdChlbnRyeVVybCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGlnbm9yZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gbW9zdCBsaWtlbHkgYSBwb29ybHkgbmFtZWQgZW50cnkKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gY2xhc3NQYXRoVXJsczsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaWdub3JlZCkgewotICAgICAgICAgICAgLy8gZXJyb3Igb3BlbmluZyB0aGUgbWFuaWZlc3QKLSAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsaWVudC9PcGVyYXRpb25DbGllbnQuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbGllbnQvT3BlcmF0aW9uQ2xpZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzZDVkMmEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsaWVudC9PcGVyYXRpb25DbGllbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY2xpZW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS51dGlsLlVVSURHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50LmFzeW5jLkF4aXNDYWxsYmFjazsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5hc3luYy5DYWxsYmFjazsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5PcGVyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5TZXJ2aWNlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5DbGllbnRVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlRyYW5zcG9ydE91dERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaTE4bi5NZXNzYWdlczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuVGFyZ2V0UmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLldTRExDb25zdGFudHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLS8qKgotICogQW4gb3BlcmF0aW9uIGNsaWVudCBpcyB0aGUgd2F5IGFuIGFkdmFuY2VkIHVzZXIgaW50ZXJhY3RzIHdpdGggQXhpczIuIEFjdHVhbAotICogb3BlcmF0aW9uIGNsaWVudHMgdW5kZXJzdGFuZCBhIHNwZWNpZmljIE1FUCBhbmQgaGVuY2UgdGhlaXIgYmVoYXZpb3IgaXMKLSAqIGRlZmluZWQgYnkgdGhlaXIgTUVQLiBUbyBpbnRlcmFjdCB3aXRoIGFuIG9wZXJhdGlvbiBjbGllbnQsIHlvdSBmaXJzdCBnZXQgb25lCi0gKiBmcm9tIGEgc3BlY2lmaWMgQXhpc09wZXJhdGlvbi4gVGhlbiB5b3Ugc2V0IHRoZSBtZXNzYWdlcyBpbnRvIGl0IG9uZSBieSBvbmUKLSAqICh3aGF0ZXZlciBpcyBhdmFpbGFibGUpLiBUaGVuLCB3aGVuIHlvdSBjYWxsIGV4ZWN1dGUoKSB0aGUgY2xpZW50IHdpbGwKLSAqIGV4ZWN1dGUgd2hhdCBpdCBjYW4gYXQgdGhhdCBwb2ludC4gSWYgZXhlY3V0aW5nIHRoZSBvcGVyYXRpb24gY2xpZW50IHJlc3VsdHMKLSAqIGluIGEgbmV3IG1lc3NhZ2UgYmVpbmcgY3JlYXRlZCwgdGhlbiBpZiBhIG1lc3NhZ2UgcmVjZWl2ZXIgaXMgcmVnaXN0ZXJlZCB3aXRoCi0gKiB0aGUgY2xpZW50IHRoZW4gdGhlIG1lc3NhZ2Ugd2lsbCBiZSBkZWxpdmVyZWQgdG8gdGhhdCBjbGllbnQuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBPcGVyYXRpb25DbGllbnQgewotCi0gICAgcHJvdGVjdGVkIEF4aXNPcGVyYXRpb24gYXhpc09wOwotCi0gICAgcHJvdGVjdGVkIFNlcnZpY2VDb250ZXh0IHNjOwotCi0gICAgcHJvdGVjdGVkIE9wdGlvbnMgb3B0aW9uczsKLQotICAgIHByb3RlY3RlZCBPcGVyYXRpb25Db250ZXh0IG9jOwotCi0gICAgcHJvdGVjdGVkIENhbGxiYWNrIGNhbGxiYWNrOwotCi0gICAgcHJvdGVjdGVkIEF4aXNDYWxsYmFjayBheGlzQ2FsbGJhY2s7Ci0KLSAgICAvKgotICAgICogaW5kaWNhdGVzIHdoZXRoZXIgdGhlIE1FUCBleGVjdXRpb24gaGFzIGNvbXBsZXRlZCAoYW5kIGhlbmNlIHJlYWR5IGZvcgotICAgICogcmVzZXR0aW5nKQotICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gY29tcGxldGVkOwotCi0gICAgcHJvdGVjdGVkIE9wZXJhdGlvbkNsaWVudChBeGlzT3BlcmF0aW9uIGF4aXNPcCwgU2VydmljZUNvbnRleHQgc2MsIE9wdGlvbnMgb3B0aW9ucykgewotICAgICAgICB0aGlzLmF4aXNPcCA9IGF4aXNPcDsKLSAgICAgICAgdGhpcy5zYyA9IHNjOwotICAgICAgICB0aGlzLm9wdGlvbnMgPSBuZXcgT3B0aW9ucyhvcHRpb25zKTsKLSAgICAgICAgY29tcGxldGVkID0gZmFsc2U7Ci0gICAgICAgIG9jID0gc2MuY3JlYXRlT3BlcmF0aW9uQ29udGV4dChheGlzT3ApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG9wdGlvbnMgdGhhdCBzaG91bGQgYmUgdXNlZCBmb3IgdGhpcyBwYXJ0aWN1bGFyIGNsaWVudC4gVGhpcwotICAgICAqIHJlc2V0cyB0aGUgZW50aXJlIHNldCBvZiBvcHRpb25zIHRvIHVzZSB0aGUgbmV3IG9wdGlvbnMgLSBzbyB5b3UnZCBsb3NlCi0gICAgICogYW55IG9wdGlvbiBjYXNjYWRpbmcgdGhhdCBtYXkgaGF2ZSBiZWVuIHNldCB1cC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvcHRpb25zIHRoZSBvcHRpb25zCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0T3B0aW9ucyhPcHRpb25zIG9wdGlvbnMpIHsKLSAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9uczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIG9wdGlvbnMgdXNlZCBieSB0aGlzIGNsaWVudC4gSWYgeW91IHdhbnQgdG8gc2V0IGEgc2luZ2xlCi0gICAgICogb3B0aW9uLCB0aGVuIHRoZSByaWdodCB3YXkgaXMgdG8gZG8gZ2V0T3B0aW9ucygpIGFuZCBzZXQgc3BlY2lmaWMKLSAgICAgKiBvcHRpb25zLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgb3B0aW9ucywgd2hpY2ggd2lsbCBuZXZlciBiZSBudWxsLgotICAgICAqLwotICAgIHB1YmxpYyBPcHRpb25zIGdldE9wdGlvbnMoKSB7Ci0gICAgICAgIHJldHVybiBvcHRpb25zOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZCBhIG1lc3NhZ2UgY29udGV4dCB0byB0aGUgY2xpZW50IGZvciBwcm9jZXNzaW5nLiBUaGlzIG1ldGhvZCBtdXN0IG5vdAotICAgICAqIHByb2Nlc3MgdGhlIG1lc3NhZ2UgLSBpdCBvbmx5IHJlY29yZHMgaXQgaW4gdGhlIG9wZXJhdGlvbiBjbGllbnQuCi0gICAgICogUHJvY2Vzc2luZyBvbmx5IG9jY3VycyB3aGVuIGV4ZWN1dGUoKSBpcyBjYWxsZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVzc2FnZUNvbnRleHQgdGhlIG1lc3NhZ2UgY29udGV4dAotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0IGlmIHRoaXMgaXMgY2FsbGVkIGluYXBwcm9wcmlhdGVseS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBhZGRNZXNzYWdlQ29udGV4dChNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdDsKLQotICAgIC8qKgotICAgICAqIFJldHVybiBhIG1lc3NhZ2UgZnJvbSB0aGUgY2xpZW50IC0gd2lsbCByZXR1cm4gbnVsbCBpZiB0aGUgcmVxdWVzdGVkCi0gICAgICogbWVzc2FnZSBpcyBub3QgYXZhaWxhYmxlLgotICAgICAqCi0gICAgICogQHBhcmFtIG1lc3NhZ2VMYWJlbCB0aGUgbWVzc2FnZSBsYWJlbCBvZiB0aGUgZGVzaXJlZCBtZXNzYWdlIGNvbnRleHQKLSAgICAgKiBAcmV0dXJuIHRoZSBkZXNpcmVkIG1lc3NhZ2UgY29udGV4dCBvciBudWxsIGlmIGl0cyBub3QgYXZhaWxhYmxlLgotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0IGlmIHRoZSBtZXNzYWdlIGxhYmVsIGlzIGludmFsaWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgTWVzc2FnZUNvbnRleHQgZ2V0TWVzc2FnZUNvbnRleHQoU3RyaW5nIG1lc3NhZ2VMYWJlbCkKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQ7Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGNhbGxiYWNrIHRvIGJlIGV4ZWN1dGVkIHdoZW4gYSBtZXNzYWdlIGNvbWVzIGludG8gdGhlIE1FUCBhbmQgdGhlCi0gICAgICogb3BlcmF0aW9uIGNsaWVudCBpcyBleGVjdXRlZC4gVGhpcyBpcyB0aGUgd2F5IHRoZSBvcGVyYXRpb24gY2xpZW50Ci0gICAgICogcHJvdmlkZXMgbm90aWZpY2F0aW9uIHRoYXQgYSBtZXNzYWdlIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IGl0LiBFeGFjdGx5Ci0gICAgICogd2hlbiBpdHMgZXhlY3V0ZWQgYW5kIHVuZGVyIHdoYXQgY29uZGl0aW9ucyBpcyBhIGZ1bmN0aW9uIG9mIHRoZSBzcGVjaWZpYwotICAgICAqIG9wZXJhdGlvbiBjbGllbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2FsbGJhY2sgdGhlIGNhbGxiYWNrIHRvIGJlIHVzZWQgd2hlbiB0aGUgY2xpZW50IGRlY2lkZXMgaXRzIHRpbWUgdG8KLSAgICAgKiAgICAgICAgICAgICAgICAgdXNlIGl0Ci0gICAgICogQGRlcHJlY2F0ZWQgUGxlYXNlIHVzZSB0aGUgQXhpc0NhbGxiYWNrIGludGVyZmFjZSByYXRoZXIgdGhhbiBDYWxsYmFjaywgd2hpY2ggaGFzIGJlZW4gZGVwcmVjYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldENhbGxiYWNrKENhbGxiYWNrIGNhbGxiYWNrKTsKLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgY2FsbGJhY2sgdG8gYmUgZXhlY3V0ZWQgd2hlbiBhIG1lc3NhZ2UgY29tZXMgaW50byB0aGUgTUVQIGFuZCB0aGUKLSAgICAgKiBvcGVyYXRpb24gY2xpZW50IGlzIGV4ZWN1dGVkLiBUaGlzIGlzIHRoZSB3YXkgdGhlIG9wZXJhdGlvbiBjbGllbnQKLSAgICAgKiBwcm92aWRlcyBub3RpZmljYXRpb24gdGhhdCBhIG1lc3NhZ2UgaGFzIGJlZW4gcmVjZWl2ZWQgYnkgaXQuIEV4YWN0bHkKLSAgICAgKiB3aGVuIGl0cyBleGVjdXRlZCBhbmQgdW5kZXIgd2hhdCBjb25kaXRpb25zIGlzIGEgZnVuY3Rpb24gb2YgdGhlIHNwZWNpZmljCi0gICAgICogb3BlcmF0aW9uIGNsaWVudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjYWxsYmFjayB0aGUgY2FsbGJhY2sgdG8gYmUgdXNlZCB3aGVuIHRoZSBjbGllbnQgZGVjaWRlcyBpdHMgdGltZSB0bwotICAgICAqICAgICAgICAgICAgICAgICB1c2UgaXQKLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXRDYWxsYmFjayhBeGlzQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgYXhpc0NhbGxiYWNrID0gY2FsbGJhY2s7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRXhlY3V0ZSB0aGUgTUVQLiAgVGhpcyBtZXRob2QgaXMgZmluYWwgYW5kIG9ubHkgc2VydmVzIHRvIHNldCAoaWYgYXBwcm9wcmlhdGUpCi0gICAgICogdGhlIGxhc3RPcGVyYXRpb25Db250ZXh0IG9uIHRoZSBTZXJ2aWNlQ29udGV4dCwgYW5kIHRoZW4gaXQgY2FsbHMKLSAgICAgKiBleGVjdXRlSW1wbCgpLCB3aGljaCBkb2VzIHRoZSBhY3R1YWwgd29yay4KLSAgICAgKgotICAgICAqIEBwYXJhbSBibG9jayBJbmRpY2F0ZXMgd2hldGhlciBleGVjdXRpb24gc2hvdWxkIGJsb2NrIG9yIHJldHVybiBBU0FQLiBXaGF0Ci0gICAgICogICAgICAgICAgICAgIGJsb2NrIG1lYW5zIGlzIG9mIGNvdXJzZSBhIGZ1bmN0aW9uIG9mIHRoZSBzcGVjaWZpYyBvcGVyYXRpb24KLSAgICAgKiAgICAgICAgICAgICAgY2xpZW50LgotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0IGlmIHNvbWV0aGluZyBnb2VzIHdyb25nIGR1cmluZyB0aGUgZXhlY3V0aW9uIG9mIHRoZSBvcGVyYXRpb24KLSAgICAgKiAgICAgICAgICAgICAgICAgICBjbGllbnQuCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHZvaWQgZXhlY3V0ZShib29sZWFuIGJsb2NrKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgc2Muc2V0TGFzdE9wZXJhdGlvbkNvbnRleHQob2MpOwotICAgICAgICBleGVjdXRlSW1wbChibG9jayk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRXhlY3V0ZSB0aGUgTUVQLiBXaGF0IHRoaXMgZG9lcyBkZXBlbmRzIG9uIHRoZSBzcGVjaWZpYyBvcGVyYXRpb24gY2xpZW50LgotICAgICAqIFRoZSBiYXNpYyBpZGVhIGlzIHRvIGhhdmUgdGhlIG9wZXJhdGlvbiBjbGllbnQgZXhlY3V0ZSBhbmQgZG8gc29tZXRoaW5nCi0gICAgICogd2l0aCB0aGUgbWVzc2FnZXMgdGhhdCBoYXZlIGJlZW4gYWRkZWQgdG8gaXQgc28gZmFyLiBGb3IgZXhhbXBsZSwgaWYgaXRzCi0gICAgICogYW4gT3V0LUluIE1FUCwgdGhlbiBpZiB0aGUgT3V0IG1lc3NhZ2UgaGFzIGJlZW4gc2V0LCB0aGVuIGV4ZWN1dGluZyB0aGUKLSAgICAgKiBjbGllbnQgYXNrcyBpdCB0byBzZW5kIHRoZSBtZXNzYWdlIGFuZCBnZXQgdGhlIEluIG1lc3NhZ2UsIHBvc3NpYmx5IHVzaW5nCi0gICAgICogYSBkaWZmZXJlbnQgdGhyZWFkLgotICAgICAqCi0gICAgICogQHBhcmFtIGJsb2NrIEluZGljYXRlcyB3aGV0aGVyIGV4ZWN1dGlvbiBzaG91bGQgYmxvY2sgb3IgcmV0dXJuIEFTQVAuIFdoYXQKLSAgICAgKiAgICAgICAgICAgICAgYmxvY2sgbWVhbnMgaXMgb2YgY291cnNlIGEgZnVuY3Rpb24gb2YgdGhlIHNwZWNpZmljIG9wZXJhdGlvbgotICAgICAqICAgICAgICAgICAgICBjbGllbnQuCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQgaWYgc29tZXRoaW5nIGdvZXMgd3JvbmcgZHVyaW5nIHRoZSBleGVjdXRpb24gb2YgdGhlIG9wZXJhdGlvbgotICAgICAqICAgICAgICAgICAgICAgICAgIGNsaWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBleGVjdXRlSW1wbChib29sZWFuIGJsb2NrKSB0aHJvd3MgQXhpc0ZhdWx0OwotCi0gICAgLyoqCi0gICAgICogUmVzZXQgdGhlIG9wZXJhdGlvbiBjbGllbnQgdG8gYSBjbGVhbiBzdGF0dXMgYWZ0ZXIgdGhlIE1FUCBoYXMgY29tcGxldGVkLgotICAgICAqIFRoaXMgaXMgaG93IHlvdSBjYW4gcmV1c2UgYW4gb3BlcmF0aW9uIGNsaWVudC4gTk9URTogdGhpcyBkb2VzIG5vdCByZXNldAotICAgICAqIHRoZSBvcHRpb25zOyBvbmx5IHRoZSBpbnRlcm5hbCBzdGF0ZSBzbyB0aGUgY2xpZW50IGNhbiBiZSB1c2VkIGFnYWluLgotICAgICAqCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQgaWYgcmVzZXQgaXMgY2FsbGVkIGJlZm9yZSB0aGUgTUVQIGNsaWVudCBoYXMgY29tcGxldGVkIGFuCi0gICAgICogICAgICAgICAgICAgICAgICAgaW50ZXJhY3Rpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVzZXQoKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgaWYgKCFjb21wbGV0ZWQpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoTWVzc2FnZXMuZ2V0TWVzc2FnZSgiY2Fubm90cmVzZXQiKSk7Ci0gICAgICAgIH0KLSAgICAgICAgb2MgPSBudWxsOwotICAgICAgICBjb21wbGV0ZWQgPSBmYWxzZTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFRvIGNsb3NlIHRoZSB0cmFuc3BvcnQgaWYgbmVjZXNzYXJ5ICwgY2FuIGNhbGwgdGhpcyBtZXRob2QuIFRoZSBtYWluCi0gICAgICogdXNhZ2Ugb2YgdGhpcyBtZXRob2QgaXMgd2hlbiBjbGllbnQgdXNlcyB0d28gdGFybnNwb3J0cyBmb3Igc2VuZGluZyBhbmQKLSAgICAgKiByZWNlaXZpbmcgLCBhbmQgd2UgbmVlZCB0byByZW1vdmUgZW50cmllcyBmb3Igd2FpdGluZyBjYWxscyBpbiB0aGUKLSAgICAgKiB0cmFuc3BvcnQgbGlzdGVuZXIgcXVldWUuCi0gICAgICogTm90ZSA6IERPIE5PVCBjYWxsIHRoaXMgbWV0aG9kIGlmIHlvdSBhcmUgbm90IHVzaW5nIHR3byB0cmFuc3BvcnRzIHRvCi0gICAgICogc2VuZCBhbmQgcmVjZWl2ZQotICAgICAqCi0gICAgICogQHBhcmFtIG1zZ0N0eHQgOiBNZXNzYWdlQ29udGV4dCMgd2hpY2ggaGFzIGFsbCB0aGUgdHJhbnNwb3J0IGluZm9ybWF0aW9uCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQgOiB0aHJvd3MgQXhpc0ZhdWx0IGlmIHNvbWV0aGluZyBnb2VzIHdyb25nCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY29tcGxldGUoTWVzc2FnZUNvbnRleHQgbXNnQ3R4dCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIFRyYW5zcG9ydE91dERlc2NyaXB0aW9uIHRyc291dCA9IG1zZ0N0eHQuZ2V0VHJhbnNwb3J0T3V0KCk7Ci0gICAgICAgIGlmICh0cnNvdXQgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJzb3V0LmdldFNlbmRlcigpLmNsZWFudXAobXNnQ3R4dCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFRvIGdldCB0aGUgb3BlcmF0aW9uIGNvbnRleHQgb2YgdGhlIG9wZXJhdGlvbiBjbGllbnQKLSAgICAgKgotICAgICAqIEByZXR1cm4gT3BlcmF0aW9uQ29udGV4dAotICAgICAqLwotICAgIHB1YmxpYyBPcGVyYXRpb25Db250ZXh0IGdldE9wZXJhdGlvbkNvbnRleHQoKSB7Ci0gICAgICAgIHJldHVybiBvYzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBtZXNzYWdlIElEIGZvciB0aGUgZ2l2ZW4gbWVzc2FnZSBjb250ZXh0IGlmIG5lZWRlZC4gSWYgdXNlciBnaXZlcyBhbiBvcHRpb24gd2l0aAotICAgICAqIE1lc3NhZ2VJRCB0aGVuIGp1c3QgY29weSB0aGF0IGludG8gTWVzc2FnZUNvbnRleHQgLCBhbmQgd2l0aCB0aGF0IHRoZXJlIGNhbiBiZSBtdWx0aXBsZQotICAgICAqIG1lc3NhZ2Ugd2l0aCBzYW1lIE1lc3NhZ2VJRCB1bmxlc3MgdXNlciBjYWxsIHNldE9wdGlvbiBmb3IgZWFjaCBpbnZvY2F0aW9uLgotICAgICAqIDxwLz4KLSAgICAgKiBJZiB1c2VyIHdhbnQgdG8gZ2l2ZSBtZXNzYWdlIElEIHRoZW4gdGhlIGJldHRlciB3YXkgaXMgdG8gc2V0IHRoZSBtZXNzYWdlIElEIGluIHRoZSBvcHRpb24gYW5kCi0gICAgICogY2FsbCBzZXRPcHRpb24gZm9yIGVhY2ggaW52b2NhdGlvbiB0aGVuIHRoZSByaWdodCB0aGluZyB3aWxsIGhhcHBlbi4KLSAgICAgKiA8cC8+Ci0gICAgICogSWYgdXNlciBkb2VzIG5vdCBnaXZlIGEgbWVzc2FnZSBJRCB0aGVuIHRoZSBuZXcgb25lIHdpbGwgYmUgY3JlYXRlZCBhbmQgc2V0IHRoYXQgaW50byBNZXNzYWdlCi0gICAgICogQ29udGV4dC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtYyB0aGUgbWVzc2FnZSBjb250ZXh0IHdob3NlIGlkIGlzIHRvIGJlIHNldAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldE1lc3NhZ2VJRChNZXNzYWdlQ29udGV4dCBtYykgewotICAgICAgICAvLyBub3cgaXRzIHRoZSB0aW1lIHRvIHB1dCB0aGUgcGFyYW1ldGVycyBzZXQgYnkgdGhlIHVzZXIgaW4gdG8gdGhlCi0gICAgICAgIC8vIGNvcnJlY3QgcGxhY2VzIGFuZCB0byB0aGUKLSAgICAgICAgLy8gaWYgdGhlcmUgaXMgbm8gbWVzc2FnZSBpZCBzdGlsbCwgc2V0IGEgbmV3IG9uZS4KLSAgICAgICAgU3RyaW5nIG1lc3NhZ2VJZCA9IG9wdGlvbnMuZ2V0TWVzc2FnZUlkKCk7Ci0gICAgICAgIGlmIChtZXNzYWdlSWQgPT0gbnVsbCB8fCAiIi5lcXVhbHMobWVzc2FnZUlkKSkgewotICAgICAgICAgICAgbWVzc2FnZUlkID0gVVVJREdlbmVyYXRvci5nZXRVVUlEKCk7Ci0gICAgICAgIH0KLSAgICAgICAgbWMuc2V0TWVzc2FnZUlEKG1lc3NhZ2VJZCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkUmVmZXJlbmNlUGFyYW1ldGVycyhNZXNzYWdlQ29udGV4dCBtc2djdHgpIHsKLSAgICAgICAgRW5kcG9pbnRSZWZlcmVuY2UgdG8gPSBtc2djdHguZ2V0VG8oKTsKLSAgICAgICAgaWYgKG9wdGlvbnMuaXNNYW5hZ2VTZXNzaW9uKCkgfHwgKG9wdGlvbnMuZ2V0UGFyZW50KCkgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgIG9wdGlvbnMuZ2V0UGFyZW50KCkuaXNNYW5hZ2VTZXNzaW9uKCkpKSB7Ci0gICAgICAgICAgICBFbmRwb2ludFJlZmVyZW5jZSB0ZXByID0gc2MuZ2V0VGFyZ2V0RVBSKCk7Ci0gICAgICAgICAgICBpZiAodGVwciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTWFwPFFOYW1lLCBPTUVsZW1lbnQ+IG1hcCA9IHRlcHIuZ2V0QWxsUmVmZXJlbmNlUGFyYW1ldGVycygpOwotICAgICAgICAgICAgICAgIGlmIChtYXAgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBJdGVyYXRvcjxPTUVsZW1lbnQ+IHZhbHVzZSA9IG1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgICAgICB3aGlsZSAodmFsdXNlLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHJlZnBhcmFlbGVtZW50ID0gdmFsdXNlLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWZwYXJhZWxlbWVudCBpbnN0YW5jZW9mIE9NRWxlbWVudCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvLmFkZFJlZmVyZW5jZVBhcmFtZXRlcigoT01FbGVtZW50KSByZWZwYXJhZWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBwcmVwYXJlTWVzc2FnZUNvbnRleHQgZ2V0cyBhIGZyZXNoIG5ldyBNZXNzYWdlQ29udGV4dCByZWFkeSB0byBiZSBzZW50LgotICAgICAqIEl0IHNldHMgdXAgdGhlIG5lY2Vzc2FyeSBwcm9wZXJ0aWVzLCB0cmFuc3BvcnQgaW5mb3JtYXRpb24sIGV0Yy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb25maWd1cmF0aW9uQ29udGV4dCB0aGUgYWN0aXZlIENvbmZpZ3VyYXRpb25Db250ZXh0Ci0gICAgICogQHBhcmFtIG1jIHRoZSBNZXNzYWdlQ29udGV4dCB0byBiZSBjb25maWd1cmVkCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQgaWYgdGhlcmUgaXMgYSBwcm9ibGVtCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJlcGFyZU1lc3NhZ2VDb250ZXh0KENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ3VyYXRpb25Db250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlQ29udGV4dCBtYykKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICAvLyBzZXQgb3B0aW9ucyBvbiB0aGUgbWVzc2FnZSBjb250ZXh0Ci0gICAgICAgIGlmIChtYy5nZXRTb2FwQWN0aW9uKCkgPT0gbnVsbCB8fCAiIi5lcXVhbHMobWMuZ2V0U29hcEFjdGlvbigpKSkgewotICAgICAgICAgICAgbWMuc2V0U29hcEFjdGlvbihvcHRpb25zLmdldEFjdGlvbigpKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1jLnNldE9wdGlvbnMobmV3IE9wdGlvbnMob3B0aW9ucykpOwotICAgICAgICBtYy5zZXRBeGlzTWVzc2FnZShheGlzT3AuZ2V0TWVzc2FnZShXU0RMQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfT1VUX1ZBTFVFKSk7Ci0KLSAgICAgICAgLy8gZG8gVGFyZ2V0IFJlc29sdXRpb24KLSAgICAgICAgVGFyZ2V0UmVzb2x2ZXIgdGFyZ2V0UmVzb2x2ZXIgPQotICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb25Db250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCkuZ2V0VGFyZ2V0UmVzb2x2ZXJDaGFpbigpOwotICAgICAgICBpZiAodGFyZ2V0UmVzb2x2ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdGFyZ2V0UmVzb2x2ZXIucmVzb2x2ZVRhcmdldChtYyk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gaWYgdGhlIHRyYW5zcG9ydCB0byB1c2UgZm9yIHNlbmRpbmcgaXMgbm90IHNwZWNpZmllZCwgdHJ5IHRvIGZpbmQgaXQKLSAgICAgICAgLy8gZnJvbSB0aGUgVVJMCi0gICAgICAgIFRyYW5zcG9ydE91dERlc2NyaXB0aW9uIHNlbmRlclRyYW5zcG9ydCA9IG9wdGlvbnMuZ2V0VHJhbnNwb3J0T3V0KCk7Ci0gICAgICAgIGlmIChzZW5kZXJUcmFuc3BvcnQgPT0gbnVsbCkgewotICAgICAgICAgICAgRW5kcG9pbnRSZWZlcmVuY2UgdG9FUFIgPSAob3B0aW9ucy5nZXRUbygpICE9IG51bGwpID8gb3B0aW9ucwotICAgICAgICAgICAgICAgICAgICAuZ2V0VG8oKSA6IG1jLmdldFRvKCk7Ci0gICAgICAgICAgICBzZW5kZXJUcmFuc3BvcnQgPSBDbGllbnRVdGlscy5pbmZlck91dFRyYW5zcG9ydChjb25maWd1cmF0aW9uQ29udGV4dAotICAgICAgICAgICAgICAgICAgICAuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKSwgdG9FUFIsIG1jKTsKLSAgICAgICAgfQotICAgICAgICBtYy5zZXRUcmFuc3BvcnRPdXQoc2VuZGVyVHJhbnNwb3J0KTsKLSAgICAgICAgaWYgKG9wdGlvbnMuZ2V0UGFyZW50KCkgIT1udWxsICYmIG9wdGlvbnMuZ2V0UGFyZW50KCkuaXNNYW5hZ2VTZXNzaW9uKCkpIHsKLSAgICAgICAgICAgIG1jLmdldE9wdGlvbnMoKS5zZXRNYW5hZ2VTZXNzaW9uKHRydWUpOwotICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbnMuaXNNYW5hZ2VTZXNzaW9uKCkpIHsKLSAgICAgICAgICAgIG1jLmdldE9wdGlvbnMoKS5zZXRNYW5hZ2VTZXNzaW9uKHRydWUpOwotICAgICAgICB9Ci0gICAgICAgIGFkZFJlZmVyZW5jZVBhcmFtZXRlcnMobWMpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbGllbnQvT3B0aW9ucy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsaWVudC9PcHRpb25zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0N2ZiNDMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsaWVudC9PcHRpb25zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jbGllbnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLnV0aWwuVVVJREdlbmVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUDExQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5BZGRyZXNzaW5nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuUmVsYXRlc1RvOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuZXh0ZXJuYWxpemUuRXh0ZXJuYWxpemVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LmV4dGVybmFsaXplLlNhZmVPYmplY3RJbnB1dFN0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuZXh0ZXJuYWxpemUuU2FmZU9iamVjdE91dHB1dFN0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuZXh0ZXJuYWxpemUuU2FmZVNlcmlhbGl6YWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlRyYW5zcG9ydEluRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5UcmFuc3BvcnRPdXREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmkxOG4uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuVHJhbnNwb3J0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLkphdmFVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuTWV0YURhdGFFbnRyeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEuaW8uRXh0ZXJuYWxpemFibGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0OwotaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKLQotCi0vKioKLSAqIEhvbGRlciBmb3Igb3BlcmF0aW9uIGNsaWVudCBvcHRpb25zLiBUaGlzIGlzIHVzZWQgYnkgdGhlIG90aGVyIGNsYXNzZXMgaW4KLSAqIHRoaXMgcGFja2FnZSB0byBjb25maWd1cmUgdmFyaW91cyBhc3BlY3RzIG9mIGhvdyBhIGNsaWVudCBjb21tdW5pY2F0ZXMgd2l0aCBhCi0gKiBzZXJ2aWNlLiBJdCBleHBvc2VzIGEgbnVtYmVyIG9mIHByZWRlZmluZWQgcHJvcGVydGllcyBhcyBwYXJ0IG9mIHRoZSBBUEkKLSAqICh3aXRoIHNwZWNpZmljIGdldFhYWCBhbmQgc2V0WFhYIG1ldGhvZHMpLCBhbmQgYWxzbyBhbGxvd3MgZm9yIGFyYml0cmFyeQotICogbmFtZWQgcHJvcGVydGllcyB0byBiZSBwYXNzZWQgdXNpbmcgYSBwcm9wZXJ0aWVzIG1hcCB3aXRoIHRoZSBwcm9wZXJ0eSBuYW1lCi0gKiBhcyB0aGUga2V5IHZhbHVlLiBJbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyBjYW4gYmUgY2hhaW5lZCB0b2dldGhlciBmb3IKLSAqIHByb3BlcnR5IGluaGVyaXRhbmNlLCBzbyB0aGF0IGlmIGEgcHJvcGVydHkgaXMgbm90IHNldCBpbiBvbmUgaW5zdGFuY2UgaXQKLSAqIHdpbGwgY2hlY2sgaXRzIHBhcmVudCBmb3IgYSBzZXR0aW5nLgotICovCi1wdWJsaWMgY2xhc3MgT3B0aW9ucyBpbXBsZW1lbnRzIEV4dGVybmFsaXphYmxlLCBTYWZlU2VyaWFsaXphYmxlIHsKLQotICAgIC8qCi0gICAgICogc2V0dXAgZm9yIGxvZ2dpbmcKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coT3B0aW9ucy5jbGFzcyk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBERUJVR19FTkFCTEVEID0gbG9nLmlzVHJhY2VFbmFibGVkKCk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBERUJVR19QUk9QRVJUWV9TRVQgPSBmYWxzZTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBteUNsYXNzTmFtZSA9ICJPcHRpb25zIjsKLQotICAgIC8qKgotICAgICAqIEFuIElEIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGNvcnJlbGF0ZSBvcGVyYXRpb25zIG9uIGFuIGluc3RhbmNlIG9mCi0gICAgICogdGhpcyBvYmplY3QgaW4gdGhlIGxvZyBmaWxlcwotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGxvZ0NvcnJlbGF0aW9uSURTdHJpbmcgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogQHNlcmlhbCBUaGUgc2VyaWFsaXphdGlvbiB2ZXJzaW9uIElEIHRyYWNrcyB0aGUgdmVyc2lvbiBvZiB0aGUgY2xhc3MuCi0gICAgICogSWYgYSBjbGFzcyBkZWZpbml0aW9uIGNoYW5nZXMsIHRoZW4gdGhlIHNlcmlhbGl6YXRpb24vZXh0ZXJuYWxpemF0aW9uCi0gICAgICogb2YgdGhlIGNsYXNzIGlzIGFmZmVjdGVkLiBJZiBhIGNoYW5nZSB0byB0aGUgY2xhc3MgaXMgbWFkZSB3aGljaCBpcwotICAgICAqIG5vdCBjb21wYXRpYmxlIHdpdGggdGhlIHNlcmlhbGl6YXRpb24vZXh0ZXJuYWxpemF0aW9uIG9mIHRoZSBjbGFzcywKLSAgICAgKiB0aGVuIHRoZSBzZXJpYWxpemF0aW9uIHZlcnNpb24gSUQgc2hvdWxkIGJlIHVwZGF0ZWQuCi0gICAgICogUmVmZXIgdG8gdGhlICJzZXJpYWxWZXIiIHV0aWxpdHkgdG8gY29tcHV0ZSBhIHNlcmlhbGl6YXRpb24KLSAgICAgKiB2ZXJzaW9uIElELgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC04MzE4NzUxODkwODQ1MTgxNTA3TDsKLQotICAgIC8qKgotICAgICAqIEBzZXJpYWwgVHJhY2tzIHRoZSByZXZpc2lvbiBsZXZlbCBvZiBhIGNsYXNzIHRvIGlkZW50aWZ5IGNoYW5nZXMgdG8gdGhlCi0gICAgICogY2xhc3MgZGVmaW5pdGlvbiB0aGF0IGFyZSBjb21wYXRpYmxlIHRvIHNlcmlhbGl6YXRpb24vZXh0ZXJuYWxpemF0aW9uLgotICAgICAqIElmIGEgY2xhc3MgZGVmaW5pdGlvbiBjaGFuZ2VzLCB0aGVuIHRoZSBzZXJpYWxpemF0aW9uL2V4dGVybmFsaXphdGlvbgotICAgICAqIG9mIHRoZSBjbGFzcyBpcyBhZmZlY3RlZC4KLSAgICAgKiBSZWZlciB0byB0aGUgd3JpdGVFeHRlcm5hbCgpIGFuZCByZWFkRXh0ZXJuYWwoKSBtZXRob2RzLgotICAgICAqLwotICAgIC8vIHN1cHBvcnRlZCByZXZpc2lvbiBsZXZlbHMsIGFkZCBhIG5ldyBsZXZlbCB0byBtYW5hZ2UgY29tcGF0aWJsZSBjaGFuZ2VzCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFVklTSU9OXzIgPSAyOwotICAgIC8vIGN1cnJlbnQgcmV2aXNpb24gbGV2ZWwgb2YgdGhpcyBvYmplY3QKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgcmV2aXNpb25JRCA9IFJFVklTSU9OXzI7Ci0KLSAgICAvL0kgYW0gZ29pbmcgdG8gc2V0IGEgcmVwbHkgdG8gYXMgY3VzdG9tZXIgcmVwbHkgVG8gYWRkcmVzcyAsCi0gICAgLy8gc28gdGhhdCBBeGlzMiBkb2VzIG5vdCBuZWVkIHRvIHdhaXQgZm9yIHRoZSByZXBseQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nICBDVVNUT01fUkVQTFlUT19BRERSRVNTID0gIkNVU1RPTV9SRVBMWVRPX0FERFJFU1MiOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nICBDVVNUT01fUkVQTFlUT19BRERSRVNTX1RSVUUgPSAidHJ1ZSI7Ci0KLQotICAgIC8qKgotICAgICAqIERlZmF1bHQgYmxvY2tpbmcgdGltZW91dCB2YWx1ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1RJTUVPVVRfTUlMTElTRUNPTkRTID0gMzAgKiAxMDAwOwotCi0KLSAgICAvKioKLSAgICAgKiBAc2VyaWFsIHBhcmVudAotICAgICAqLwotICAgIHByaXZhdGUgT3B0aW9ucyBwYXJlbnQ7Ci0KLQotICAgIC8qKgotICAgICAqIEBzZXJpYWwgcHJvcGVydGllcwotICAgICAqLwotICAgIHByaXZhdGUgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzOwotCi0gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAvLyAgICAgICAgICAgICAgICAgIFBhcmFtZXRlcnMgdGhhdCBjYW4gYmUgc2V0IHZpYSBPcHRpb25zCi0gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAgIHByaXZhdGUgU3RyaW5nIHNvYXBWZXJzaW9uVVJJOyAvLyBkZWZhdWx0cyB0bwotICAgIC8vIFNPQVAxMUNvbnN0YW50cy5TT0FQX0VOVkVMT1BFX05BTUVTUEFDRV9VUkk7Ci0KLSAgICBwcml2YXRlIEJvb2xlYW4gaXNFeGNlcHRpb25Ub0JlVGhyb3duT25TT0FQRmF1bHQ7IC8vIGRlZmF1bHRzIHRvIHRydWU7Ci0KLSAgICBwcml2YXRlIGxvbmcgdGltZU91dEluTWlsbGlTZWNvbmRzID0gLTE7IC8vID0KLSAgICAvLyBERUZBVUxUX1RJTUVPVVRfTUlMTElTRUNPTkRTOwotCi0gICAgcHJpdmF0ZSBCb29sZWFuIHVzZVNlcGFyYXRlTGlzdGVuZXI7IC8vIGRlZmF1bHRzIHRvIGZhbHNlCi0KLSAgICAvLyBBZGRyZXNzaW5nIHNwZWNpZmljIHByb3BlcnRpZXMKLSAgICBwcml2YXRlIFN0cmluZyBhY3Rpb247Ci0KLSAgICBwcml2YXRlIEVuZHBvaW50UmVmZXJlbmNlIGZhdWx0VG87Ci0KLSAgICBwcml2YXRlIEVuZHBvaW50UmVmZXJlbmNlIGZyb207Ci0KLSAgICBwcml2YXRlIFRyYW5zcG9ydExpc3RlbmVyIGxpc3RlbmVyOwotCi0gICAgcHJpdmF0ZSBUcmFuc3BvcnRJbkRlc2NyaXB0aW9uIHRyYW5zcG9ydEluOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgdHJhbnNwb3J0SW5Qcm90b2NvbDsKLQotICAgIHByaXZhdGUgU3RyaW5nIG1lc3NhZ2VJZDsKLQotICAgIC8vIEFycmF5IG9mIFJlbGF0ZXNUbyBvYmplY3RzCi0gICAgcHJpdmF0ZSBMaXN0PFJlbGF0ZXNUbz4gcmVsYXRpb25zaGlwczsKLQotICAgIHByaXZhdGUgRW5kcG9pbnRSZWZlcmVuY2UgcmVwbHlUbzsKLQotICAgIHByaXZhdGUgQXJyYXlMaXN0PE9NRWxlbWVudD4gcmVmZXJlbmNlUGFyYW1ldGVyczsKLQotICAgIC8qKgotICAgICAqIFRoaXMgaXMgdXNlZCBmb3Igc2VuZGluZyBhbmQgcmVjZWl2aW5nIG1lc3NhZ2VzLgotICAgICAqLwotICAgIHByb3RlY3RlZCBUcmFuc3BvcnRPdXREZXNjcmlwdGlvbiB0cmFuc3BvcnRPdXQ7Ci0KLSAgICBwcml2YXRlIEVuZHBvaW50UmVmZXJlbmNlIHRvOwotCi0gICAgLy9UbyBjb250cm9sICwgc2Vzc2lvbiBtYW5hZ2VtZW50ICwgZGVmYXVsdCBpcyBzZXQgdG8gdHJ1ZSAsIGlmIHVzZXIgd2FudHMgaGUgY2FuIHNldCB0aGF0IHRvIHRydWUKLSAgICAvLyBUaGUgb3BlcmF0aW9uIGNsaWVudCB3aWxsIG1hbmFnZSBzZXNzaW9uIHVzaW5nIFNlcnZpY2VHcm91cElEIGlmIGl0IGlzIHRoZXJlIGluIHRoZSByZXNwb25zZQotICAgIHByaXZhdGUgYm9vbGVhbiBtYW5hZ2VTZXNzaW9uID0gZmFsc2U7Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBNZXRhRGF0YSBmb3IgZGF0YSB0byBiZSByZXN0b3JlZCBpbiBhY3RpdmF0ZSBhZnRlciByZWFkRXh0ZXJuYWwKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKgotICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgb2JqZWN0IGhhcyBiZWVuIHJlY29uc3RpdHV0ZWQKLSAgICAgKiBhbmQgbmVlZHMgdG8gaGF2ZSBpdHMgb2JqZWN0IHJlZmVyZW5jZXMgcmVjb25jaWxlZAotICAgICAqLwotICAgIHByaXZhdGUgdHJhbnNpZW50IGJvb2xlYW4gbmVlZHNUb0JlUmVjb25jaWxlZCA9IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICogVGhlIFRyYW5zcG9ydE91dERlc2NyaXB0aW9uIG1ldGFkYXRhIHdpbGwgYmUgdXNlZCBkdXJpbmcKLSAgICAgKiBhY3RpdmF0ZSB0byBtYXRjaCB1cCB3aXRoIGFuIGV4aXN0aW5nIG9iamVjdAotICAgICAqLwotICAgIHByaXZhdGUgdHJhbnNpZW50IE1ldGFEYXRhRW50cnkgbWV0YVRyYW5zcG9ydE91dCA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgVHJhbnNwb3J0SW5EZXNjcmlwdGlvbiBtZXRhZGF0YSB3aWxsIGJlIHVzZWQgZHVyaW5nCi0gICAgICogYWN0aXZhdGUgdG8gbWF0Y2ggdXAgd2l0aCBhbiBleGlzdGluZyBvYmplY3QKLSAgICAgKi8KLSAgICBwcml2YXRlIHRyYW5zaWVudCBNZXRhRGF0YUVudHJ5IG1ldGFUcmFuc3BvcnRJbiA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgVHJhbnNwb3J0TGlzdGVuZXIgbWV0YWRhdGEgd2lsbCBiZSB1c2VkIGR1cmluZwotICAgICAqIGFjdGl2YXRlIHRvIG1hdGNoIHVwIHdpdGggYW4gZXhpc3Rpbmcgb2JqZWN0LCBpZiBwb3NzaWJsZQotICAgICAqLwotICAgIHByaXZhdGUgdHJhbnNpZW50IE1ldGFEYXRhRW50cnkgbWV0YUxpc3RlbmVyID0gbnVsbDsKLQotICAgIC8vVGhpcyBwcm9wZXJ0eSBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRvIGNhbGwgdGhlIGF1dG8gdHJhbnNwb3J0IGNsZWFuIHVwCi0gICAgcHJpdmF0ZSB0cmFuc2llbnQgYm9vbGVhbiBjYWxsVHJhbnNwb3J0Q2xlYW51cCA7Ci0KLQotICAgIHByaXZhdGUgdHJhbnNpZW50IFN0cmluZyB1c2VyTmFtZTsKLSAgICBwcml2YXRlIHRyYW5zaWVudCBTdHJpbmcgcGFzc3dvcmQ7Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBlbmQgTWV0YURhdGEgc2VjdGlvbgotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0KLSAgICAvKioKLSAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yCi0gICAgICovCi0gICAgcHVibGljIE9wdGlvbnMoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW4gbm9ybWFsIG1vZGUgb3BlcmF0aW9uLCB0aGlzIG9wdGlvbnMgd2lsbCB0cnkgdG8gZnVsZmlsIHRoZSByZXF1ZXN0Ci0gICAgICogZnJvbSBpdHMgdmFsdWVzLiBJZiB0aGF0IGlzIG5vdCBwb3NzaWJsZSwgdGhpcyBvcHRpb25zIHdpbGwgcmVxdWVzdCB0aG9zZQotICAgICAqIGluZm9ybWF0aW9uIGZyb20gaXRzIHBhcmVudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJlbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgT3B0aW9ucyhPcHRpb25zIHBhcmVudCkgewotICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgV1MtQWRkcmVzc2luZyBBY3Rpb24gLyBTT0FQIEFjdGlvbiBzdHJpbmcuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGFjdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWN0aW9uKCkgewotICAgICAgICBpZiAoYWN0aW9uID09IG51bGwgJiYgcGFyZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBwYXJlbnQuZ2V0QWN0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGFjdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgV1MtQWRkcmVzc2luZyBGYXVsdFRvIGVuZHBvaW50IHJlZmVyZW5jZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gZW5kcG9pbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgRW5kcG9pbnRSZWZlcmVuY2UgZ2V0RmF1bHRUbygpIHsKLSAgICAgICAgaWYgKGZhdWx0VG8gPT0gbnVsbCAmJiBwYXJlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHBhcmVudC5nZXRGYXVsdFRvKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhdWx0VG87Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IFdTLUFkZHJlc3NpbmcgRnJvbSBlbmRwb2ludCByZWZlcmVuY2UuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGVuZHBvaW50Ci0gICAgICovCi0gICAgcHVibGljIEVuZHBvaW50UmVmZXJlbmNlIGdldEZyb20oKSB7Ci0gICAgICAgIGlmIChmcm9tID09IG51bGwgJiYgcGFyZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBwYXJlbnQuZ2V0RnJvbSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmcm9tOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBsaXN0ZW5lciB1c2VkIGZvciBpbmNvbWluZyBtZXNzYWdlLgotICAgICAqCi0gICAgICogQHJldHVybiBsaXN0ZW5lcgotICAgICAqLwotICAgIHB1YmxpYyBUcmFuc3BvcnRMaXN0ZW5lciBnZXRMaXN0ZW5lcigpIHsKLSAgICAgICAgY2hlY2tBY3RpdmF0ZVdhcm5pbmcoImdldExpc3RlbmVyIik7Ci0gICAgICAgIGlmIChsaXN0ZW5lciA9PSBudWxsICYmIHBhcmVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gcGFyZW50LmdldExpc3RlbmVyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGxpc3RlbmVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0cmFuc3BvcnQgdXNlZCBmb3IgaW5jb21pbmcgbWVzc2FnZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdHJhbnNwb3J0IGluZm9ybWF0aW9uCi0gICAgICovCi0gICAgcHVibGljIFRyYW5zcG9ydEluRGVzY3JpcHRpb24gZ2V0VHJhbnNwb3J0SW4oKSB7Ci0gICAgICAgIGNoZWNrQWN0aXZhdGVXYXJuaW5nKCJnZXRUcmFuc3BvcnRJbiIpOwotICAgICAgICBpZiAodHJhbnNwb3J0SW4gPT0gbnVsbCAmJiBwYXJlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHBhcmVudC5nZXRUcmFuc3BvcnRJbigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cmFuc3BvcnRJbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdHJhbnNwb3J0IHByb3RvY29sIHVzZWQgZm9yIGluY29taW5nIG1lc3NhZ2UuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIG5hbWUgcHJvdG9jb2wgbmFtZSAoImh0dHAiLCAidGNwIiwgZXRjLikKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRyYW5zcG9ydEluUHJvdG9jb2woKSB7Ci0gICAgICAgIGlmICh0cmFuc3BvcnRJblByb3RvY29sID09IG51bGwgJiYgcGFyZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBwYXJlbnQuZ2V0VHJhbnNwb3J0SW5Qcm90b2NvbCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cmFuc3BvcnRJblByb3RvY29sOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBXUy1BZGRyZXNzaW5nIE1lc3NhZ2VJZC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdXJpIHN0cmluZwotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkKCkgewotICAgICAgICBpZiAobWVzc2FnZUlkID09IG51bGwgJiYgcGFyZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBwYXJlbnQuZ2V0TWVzc2FnZUlkKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbWVzc2FnZUlkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBhIGNvcHkgb2YgdGhlIGdlbmVyYWwgb3B0aW9uIHByb3BlcnRpZXMuIEJlY2F1c2Ugb2YgdGhlIHdheSBvcHRpb25zCi0gICAgICogYXJlIHN0b3JlZCB0aGlzIGRvZXMgbm90IGluY2x1ZGUgcHJvcGVydGllcyB3aXRoIHNwZWNpZmljIGdldC9zZXQKLSAgICAgKiBtZXRob2RzLCBvbmx5IHRoZSBnZW5lcmFsIHByb3BlcnRpZXMgaWRlbnRpZmllZCBieSBhIHRleHQgc3RyaW5nLiBUaGUKLSAgICAgKiByZXR1cm5lZCBtYXAgbWVyZ2VzIHByb3BlcnRpZXMgaW5oZXJpdGVkIGZyb20gcGFyZW50IG9wdGlvbnMsIGlmIGFueSwgdG8KLSAgICAgKiBnaXZlIGEgY29tcGxldGUgc2V0IG9mIHByb3BlcnR5IGRlZmluaXRpb25zIGFzIHNlZW4gYnkgdXNlcnMgb2YgdGhpcwotICAgICAqIG9wdGlvbnMgaW5zdGFuY2UuIFRoZSByZXR1cm5lZCBjb3B5IGlzIG5vdCAibGl2ZSIsIHNvIGNoYW5nZXMgeW91IG1ha2UgdG8KLSAgICAgKiB0aGUgY29weSBhcmUgbm90IHJlZmxlY3RlZCBpbiB0aGUgYWN0dWFsIG9wdGlvbiBzZXR0aW5ncy4gSG93ZXZlciwgeW91Ci0gICAgICogY2FuIG1ha2UgdGhlIG1vZGlmaWVkIHZhbHVlcyB0YWtlIGVmZmVjdCB3aXRoIGEgY2FsbCB0byB7QGxpbmsKLSAgICAgKiAjc2V0UHJvcGVydGllcyhNYXApfSwKLSAgICAgKgotICAgICAqIEByZXR1cm4gY29weSBvZiBnZW5lcmFsIHByb3BlcnRpZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiBnZXRQcm9wZXJ0aWVzKCkgewotICAgICAgICAvLyBtYWtlIHN1cmUgdGhhdCB0aGUgT3B0aW9ucyBwcm9wZXJ0aWVzIGV4aXN0cwotICAgICAgICBpZiAodGhpcy5wcm9wZXJ0aWVzID09IG51bGwpIHsKLSAgICAgICAgICAgIHRoaXMucHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHBhcmVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+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+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gb2JqIFRoZSBvYmplY3QgdG8gY29tcGFyZSB3aXRoCi0gICAgICogQHJldHVybiBUUlVFIGlmIHRoaXMgb2JqZWN0IGlzIGVxdWl2YWxlbnQgd2l0aCB0aGUgc3BlY2lmaWVkIG9iamVjdAotICAgICAqICAgICAgICAgdGhhdCBpcywga2V5IGZpZWxkcyBtYXRjaAotICAgICAqICAgICAgICAgRkFMU0UsIG90aGVyd2lzZQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRXF1aXZhbGVudChPcHRpb25zIG9iaikgewotICAgICAgICAvLyBOT1RFOiB0aGUgaW5wdXQgb2JqZWN0IGlzIGV4cGVjdGVkIHRvIGV4aXN0IChpZSwgYmUgbm9uLW51bGwpCi0KLSAgICAgICAgaWYgKHRoaXMudGltZU91dEluTWlsbGlTZWNvbmRzICE9IG9iai5nZXRUaW1lT3V0SW5NaWxsaVNlY29uZHMoKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHRoaXMuaXNFeGNlcHRpb25Ub0JlVGhyb3duT25TT0FQRmF1bHQuYm9vbGVhblZhbHVlKCkgIT0KLSAgICAgICAgICAgICAgICBvYmouaXNFeGNlcHRpb25Ub0JlVGhyb3duT25TT0FQRmF1bHQoKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHRoaXMudXNlU2VwYXJhdGVMaXN0ZW5lci5ib29sZWFuVmFsdWUoKSAhPSBvYmouaXNVc2VTZXBhcmF0ZUxpc3RlbmVyKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh0aGlzLm1hbmFnZVNlc3Npb24gIT0gb2JqLmlzTWFuYWdlU2Vzc2lvbigpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgIGlmICgodGhpcy5zb2FwVmVyc2lvblVSSSAhPSBudWxsKSAmJiAob2JqLmdldFNvYXBWZXJzaW9uVVJJKCkgIT0gbnVsbCkpIHsKLSAgICAgICAgICAgIGlmICghdGhpcy5zb2FwVmVyc2lvblVSSS5lcXVhbHMob2JqLmdldFNvYXBWZXJzaW9uVVJJKCkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKCh0aGlzLnNvYXBWZXJzaW9uVVJJID09IG51bGwpICYmIChvYmouZ2V0U29hcFZlcnNpb25VUkkoKSA9PSBudWxsKSkgewotICAgICAgICAgICAgLy8gY29udGludWUKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIG1pc21hdGNoCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgIGlmICgodGhpcy5hY3Rpb24gIT0gbnVsbCkgJiYgKG9iai5nZXRBY3Rpb24oKSAhPSBudWxsKSkgewotICAgICAgICAgICAgaWYgKCF0aGlzLmFjdGlvbi5lcXVhbHMob2JqLmdldEFjdGlvbigpKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmICgodGhpcy5hY3Rpb24gPT0gbnVsbCkgJiYgKG9iai5nZXRBY3Rpb24oKSA9PSBudWxsKSkgewotICAgICAgICAgICAgLy8gY29udGludWUKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIG1pc21hdGNoCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgIGlmICgodGhpcy50cmFuc3BvcnRJblByb3RvY29sICE9IG51bGwpICYmIChvYmouZ2V0VHJhbnNwb3J0SW5Qcm90b2NvbCgpICE9IG51bGwpKSB7Ci0gICAgICAgICAgICBpZiAoIXRoaXMudHJhbnNwb3J0SW5Qcm90b2NvbC5lcXVhbHMob2JqLmdldFRyYW5zcG9ydEluUHJvdG9jb2woKSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoKHRoaXMudHJhbnNwb3J0SW5Qcm90b2NvbCA9PSBudWxsKSAmJiAob2JqLmdldFRyYW5zcG9ydEluUHJvdG9jb2woKSA9PSBudWxsKSkgewotICAgICAgICAgICAgLy8gY29udGludWUKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIG1pc21hdGNoCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgIGlmICgodGhpcy5tZXNzYWdlSWQgIT0gbnVsbCkgJiYgKG9iai5nZXRNZXNzYWdlSWQoKSAhPSBudWxsKSkgewotICAgICAgICAgICAgaWYgKCF0aGlzLm1lc3NhZ2VJZC5lcXVhbHMob2JqLmdldE1lc3NhZ2VJZCgpKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmICgodGhpcy5tZXNzYWdlSWQgPT0gbnVsbCkgJiYgKG9iai5nZXRNZXNzYWdlSWQoKSA9PSBudWxsKSkgewotICAgICAgICAgICAgLy8gY29udGludWUKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIG1pc21hdGNoCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgIGlmICgodGhpcy5mYXVsdFRvICE9IG51bGwpICYmIChvYmouZ2V0RmF1bHRUbygpICE9IG51bGwpKSB7Ci0gICAgICAgICAgICBpZiAoIXRoaXMuZmF1bHRUby5pc0VxdWl2YWxlbnQob2JqLmdldEZhdWx0VG8oKSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoKHRoaXMuZmF1bHRUbyA9PSBudWxsKSAmJiAob2JqLmdldEZhdWx0VG8oKSA9PSBudWxsKSkgewotICAgICAgICAgICAgLy8gY29udGludWUKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIG1pc21hdGNoCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgIGlmICgodGhpcy5mcm9tICE9IG51bGwpICYmIChvYmouZ2V0RnJvbSgpICE9IG51bGwpKSB7Ci0gICAgICAgICAgICBpZiAoIXRoaXMuZnJvbS5pc0VxdWl2YWxlbnQob2JqLmdldEZyb20oKSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoKHRoaXMuZnJvbSA9PSBudWxsKSAmJiAob2JqLmdldEZyb20oKSA9PSBudWxsKSkgewotICAgICAgICAgICAgLy8gY29udGludWUKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIG1pc21hdGNoCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgIGlmICgodGhpcy5yZXBseVRvICE9IG51bGwpICYmIChvYmouZ2V0UmVwbHlUbygpICE9IG51bGwpKSB7Ci0gICAgICAgICAgICBpZiAoIXRoaXMucmVwbHlUby5pc0VxdWl2YWxlbnQob2JqLmdldFJlcGx5VG8oKSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoKHRoaXMucmVwbHlUbyA9PSBudWxsKSAmJiAob2JqLmdldFJlcGx5VG8oKSA9PSBudWxsKSkgewotICAgICAgICAgICAgLy8gY29udGludWUKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIG1pc21hdGNoCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgIGlmICgodGhpcy50byAhPSBudWxsKSAmJiAob2JqLmdldFRvKCkgIT0gbnVsbCkpIHsKLSAgICAgICAgICAgIGlmICghdGhpcy50by5pc0VxdWl2YWxlbnQob2JqLmdldFRvKCkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKCh0aGlzLnRvID09IG51bGwpICYmIChvYmouZ2V0VG8oKSA9PSBudWxsKSkgewotICAgICAgICAgICAgLy8gY29udGludWUKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIG1pc21hdGNoCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgIGlmICgodGhpcy5wcm9wZXJ0aWVzICE9IG51bGwpICYmIChvYmouZ2V0UHJvcGVydGllcygpICE9IG51bGwpKSB7Ci0gICAgICAgICAgICBpZiAoIXRoaXMucHJvcGVydGllcy5lcXVhbHMob2JqLmdldFByb3BlcnRpZXMoKSkpIHsKLSAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGEgc3RyaWN0IHRlc3QuCi0gICAgICAgICAgICAgICAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBvYmplY3QgaXMgYWxzbyBhIG1hcAotICAgICAgICAgICAgICAgIC8vIGFuZCB0aGUgdHdvIG1hcHMgcmVwcmVzZW50IHRoZSBzYW1lIG1hcHBpbmdzLgotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmICgodGhpcy5wcm9wZXJ0aWVzID09IG51bGwpICYmIChvYmouZ2V0UHJvcGVydGllcygpID09IG51bGwpKSB7Ci0gICAgICAgICAgICAvLyBjb250aW51ZQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gbWlzbWF0Y2gKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgLy8gVE9ETzogY29uc2lkZXIgY2hlY2tpbmcgdGhlIGZvbGxvd2luZyBvYmplY3RzIGZvciBlcXVpdmFsZW5jeQotICAgICAgICAvLyAgICAgICAgTGlzdCByZWxhdGlvbnNoaXBzOwotICAgICAgICAvLyAgICAgICAgQXJyYXlMaXN0IHJlZmVyZW5jZVBhcmFtZXRlcnM7Ci0gICAgICAgIC8vICAgICAgICBUcmFuc3BvcnRMaXN0ZW5lciBsaXN0ZW5lcjsKLSAgICAgICAgLy8gICAgICAgIFRyYW5zcG9ydEluRGVzY3JpcHRpb24gdHJhbnNwb3J0SW47Ci0gICAgICAgIC8vICAgICAgICBUcmFuc3BvcnRPdXREZXNjcmlwdGlvbiB0cmFuc3BvcnRPdXQ7Ci0KLSAgICAgICAgLy8gVE9ETzogY29uc2lkZXIgY2hlY2tpbmcgdGhlIHBhcmVudCBvYmplY3RzIGZvciBlcXVpdmFsZW5jeQotCi0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIElEIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG9iamVjdCBpbnN0YW5jZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gQSBzdHJpbmcgdGhhdCBjYW4gYmUgb3V0cHV0IHRvIGEgbG9nIGZpbGUgYXMgYW4gaWRlbnRpZmllcgotICAgICAqICAgICAgICAgZm9yIHRoaXMgb2JqZWN0IGluc3RhbmNlLiAgSXQgaXMgc3VpdGFibGUgZm9yIG1hdGNoaW5nIHJlbGF0ZWQgbG9nCi0gICAgICogICAgICAgICBlbnRyaWVzLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9nQ29ycmVsYXRpb25JRFN0cmluZygpIHsKLSAgICAgICAgaWYgKGxvZ0NvcnJlbGF0aW9uSURTdHJpbmcgPT0gbnVsbCkgewotICAgICAgICAgICAgbG9nQ29ycmVsYXRpb25JRFN0cmluZyA9IG15Q2xhc3NOYW1lICsgIkAiICsgVVVJREdlbmVyYXRvci5nZXRVVUlEKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGxvZ0NvcnJlbGF0aW9uSURTdHJpbmc7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBUcmFjZSBhIHdhcm5pbmcgbWVzc2FnZSwgaWYgbmVlZGVkLCBpbmRpY2F0aW5nIHRoYXQgdGhpcwotICAgICAqIG9iamVjdCBuZWVkcyB0byBiZSBhY3RpdmF0ZWQgYmVmb3JlIGFjY2Vzc2luZyBjZXJ0YWluIGZpZWxkcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXRob2RuYW1lIFRoZSBtZXRob2Qgd2hlcmUgdGhlIHdhcm5pbmcgb2NjdXJzCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrQWN0aXZhdGVXYXJuaW5nKFN0cmluZyBtZXRob2RuYW1lKSB7Ci0gICAgICAgIGlmIChuZWVkc1RvQmVSZWNvbmNpbGVkKSB7Ci0gICAgICAgICAgICBsb2cud2FybihnZXRMb2dDb3JyZWxhdGlvbklEU3RyaW5nKCkgKyAiOiIgKyBtZXRob2RuYW1lICsgIigpOiAqKioqV0FSTklORyoqKiogIiArCi0gICAgICAgICAgICAgICAgICAgIG15Q2xhc3NOYW1lICsgIi5hY3RpdmF0ZShjb25maWd1cmF0aW9uQ29udGV4dCkgbmVlZHMgdG8gYmUgaW52b2tlZC4iKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNDYWxsVHJhbnNwb3J0Q2xlYW51cCgpIHsKLSAgICAgICAgcmV0dXJuIGNhbGxUcmFuc3BvcnRDbGVhbnVwOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENhbGxUcmFuc3BvcnRDbGVhbnVwKGJvb2xlYW4gY2FsbFRyYW5zcG9ydENsZWFudXApIHsKLSAgICAgICAgdGhpcy5jYWxsVHJhbnNwb3J0Q2xlYW51cCA9IGNhbGxUcmFuc3BvcnRDbGVhbnVwOwotICAgIH0KLQotCi0gICAgcHVibGljIFN0cmluZyBnZXRVc2VyTmFtZSgpIHsKLSAgICAgICAgaWYgKHVzZXJOYW1lID09IG51bGwgJiYgcGFyZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBwYXJlbnQuZ2V0VXNlck5hbWUoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdXNlck5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VXNlck5hbWUoU3RyaW5nIHVzZXJOYW1lKSB7Ci0gICAgICAgIHRoaXMudXNlck5hbWUgPSB1c2VyTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhc3N3b3JkKCkgewotICAgICAgICBpZiAocGFzc3dvcmQgPT0gbnVsbCAmJiBwYXJlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHBhcmVudC5nZXRQYXNzd29yZCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwYXNzd29yZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZChTdHJpbmcgcGFzc3dvcmQpIHsKLSAgICAgICAgdGhpcy5wYXNzd29yZCA9IHBhc3N3b3JkOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBEZWJ1ZyBmb3IgZm9yIHByb3BlcnR5IGtleSBhbmQgdmFsdWUuCi0gICAgICogQHBhcmFtIGtleQotICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBkZWJ1Z1Byb3BlcnR5U2V0KFN0cmluZyBrZXksIE9iamVjdCB2YWx1ZSkgewotICAgICAgICBpZiAoREVCVUdfUFJPUEVSVFlfU0VUKSB7Ci0gICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gKHZhbHVlID09IG51bGwpID8gIm51bGwiIDogdmFsdWUuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0gICAgICAgICAgICBTdHJpbmcgY2xhc3Nsb2FkZXIgPSAibnVsbCI7Ci0gICAgICAgICAgICBpZih2YWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgQ2xhc3NMb2FkZXIgY2wgPSBVdGlscy5nZXRPYmplY3RDbGFzc0xvYWRlcih2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgaWYoY2wgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjbGFzc2xvYWRlciA9IGNsLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgU3RyaW5nIHZhbHVlVGV4dCA9ICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgPyB2YWx1ZS50b1N0cmluZygpIDogbnVsbDsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgU3RyaW5nIGlkZW50aXR5ID0gZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAnQCcgKyAKLSAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvSGV4U3RyaW5nKFN5c3RlbS5pZGVudGl0eUhhc2hDb2RlKHRoaXMpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgbG9nLmRlYnVnKCI9PT09PT09PT09PT09PT09PT0iKTsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiIFByb3BlcnR5IHNldCBvbiBvYmplY3QgIiArIGlkZW50aXR5KTsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiICBLZXkgPSIgKyBrZXkpOwotICAgICAgICAgICAgaWYgKHZhbHVlVGV4dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgIFZhbHVlID0iICsgdmFsdWVUZXh0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiICBWYWx1ZSBDbGFzcyA9ICIgKyBjbGFzc05hbWUpOwotICAgICAgICAgICAgbG9nLmRlYnVnKCIgIFZhbHVlIENsYXNzbG9hZGVyID0gIiArIGNsYXNzbG9hZGVyKTsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZyggICJDYWxsIFN0YWNrID0gIiArIEphdmFVdGlscy5jYWxsU3RhY2tUb1N0cmluZygpKTsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiPT09PT09PT09PT09PT09PT09Iik7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY2xpZW50L1NlcnZpY2VDbGllbnQuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbGllbnQvU2VydmljZUNsaWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWE4ZDlkLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbGllbnQvU2VydmljZUNsaWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODczICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jbGllbnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQMTJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBIZWFkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBIZWFkZXJCbG9jazsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuYXN5bmMuQXhpc0NhbGxiYWNrOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50LmFzeW5jLkNhbGxiYWNrOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuT3BlcmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuU2VydmljZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LlNlcnZpY2VHcm91cENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzTW9kdWxlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2VHcm91cDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLk91dEluQXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLk91dE9ubHlBeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUm9idXN0T3V0T25seUF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5UcmFuc3BvcnRPdXREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5MaXN0ZW5lck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pMThuLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIubmFtZXNwYWNlLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuQ291bnRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuSmF2YVV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLS8qKgotICogQ2xpZW50IGFjY2VzcyB0byBhIHNlcnZpY2UuIEVhY2ggaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBpcyBhc3NvY2lhdGVkIHdpdGggYSBwYXJ0aWN1bGFyIHtAbGluawotICogb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZX0sIGFuZCB0aGUgbWV0aG9kcyBzdXBwb3J0IG9wZXJhdGlvbnMgdXNpbmcgdGhhdCBzZXJ2aWNlLgotICoge0BsaW5rIE9wdGlvbnN9IGluc3RhbmNlcyBhcmUgdXNlZCB0byBjb25maWd1cmUgdmFyaW91cyBhc3BlY3RzIG9mIHRoZSBzZXJ2aWNlIGFjY2Vzcy4KLSAqLwotcHVibGljIGNsYXNzIFNlcnZpY2VDbGllbnQgewotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFNlcnZpY2VDbGllbnQuY2xhc3MpOwotCi0gICAgLyoqIEJhc2UgbmFtZSB1c2VkIGZvciBhIHNlcnZpY2UgY3JlYXRlZCB3aXRob3V0IGFuIGV4aXN0aW5nIGNvbmZpZ3VyYXRpb24uICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQU5PTl9TRVJWSUNFID0gImFub25TZXJ2aWNlIjsKLQotICAgIC8qKiBPcHRpb24gcHJvcGVydHkgbmFtZSBmb3IgYXV0b21hdGljYWxseSBjbGVhbmluZyB1cCBvbGQgT3BlcmF0aW9uQ29udGV4dHMgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVVRPX09QRVJBVElPTl9DTEVBTlVQID0gIlNlcnZpY2VDbGllbnQuYXV0b09wZXJhdGlvbkNsZWFudXAiOwotCi0gICAgLyoqIENvdW50ZXIgdXNlZCB0byBnZW5lcmF0ZSB0aGUgYW5vbnltb3VzIHNlcnZpY2UgbmFtZS4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBDb3VudGVyIGFub25TZXJ2aWNlQ291bnRlciA9IG5ldyBDb3VudGVyKCk7Ci0KLSAgICAvKioKLSAgICAgKiBPcGVyYXRpb24gbmFtZSB1c2VkIGZvciBhbiBhbm9ueW1vdXMgb3V0LW9ubHkgb3BlcmF0aW9uIChtZWFuaW5nIHdlIHNlbmQgYSBtZXNzYWdlIHdpdGggbm8KLSAgICAgKiByZXNwb25zZSBhbGxvd2VkIGZyb20gdGhlIHNlcnZpY2UsIGVxdWl2YWxlbnQgdG8gYSBXU0RMIEluLU9ubHkgb3BlcmF0aW9uKS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIEFOT05fT1VUX09OTFlfT1AgPSBuZXcgUU5hbWUoCi0gICAgICAgICAgICBDb25zdGFudHMuQVhJUzJfTkFNRVNQQUNFX1VSSSwgImFub25PdXRvbmx5T3AiLCBDb25zdGFudHMuQVhJUzJfTkFNRVNQQUNFX1BSRUZJWCk7Ci0KLSAgICAvKioKLSAgICAgKiBPcGVyYXRpb24gbmFtZSB1c2VkIGZvciBhbiBhbm9ueW1vdXMgcm9idXN0LW91dC1vbmx5IG9wZXJhdGlvbiAobWVhbmluZyB3ZSBzZW5kIGEgbWVzc2FnZSwKLSAgICAgKiB3aXRoIHRoZSBvbmx5IHBvc3NpYmxlIHJlc3BvbnNlIGEgZmF1bHQsIGVxdWl2YWxlbnQgdG8gYSBXU0RMIFJvYnVzdC1Jbi1Pbmx5IG9wZXJhdGlvbikuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBBTk9OX1JPQlVTVF9PVVRfT05MWV9PUCA9IG5ldyBRTmFtZSgKLSAgICAgICAgICAgIENvbnN0YW50cy5BWElTMl9OQU1FU1BBQ0VfVVJJLCAiYW5vblJvYnVzdE9wIiwgQ29uc3RhbnRzLkFYSVMyX05BTUVTUEFDRV9QUkVGSVgpOwotCi0gICAgLyoqCi0gICAgICogT3BlcmF0aW9uIG5hbWUgdXNlZCBmb3IgYW4gYW5vbnltb3VzIGluLW91dCBvcGVyYXRpb24gKG1lYW5pbmcgd2Ugc2VudCBhIG1lc3NhZ2UgYW5kIHJlY2VpdmUKLSAgICAgKiBhIHJlc3BvbnNlLCBlcXVpdmFsZW50IHRvIGEgV1NETCBJbi1PdXQgb3BlcmF0aW9uKS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIEFOT05fT1VUX0lOX09QID0gbmV3IFFOYW1lKENvbnN0YW50cy5BWElTMl9OQU1FU1BBQ0VfVVJJLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFub25PdXRJbk9wIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5BWElTMl9OQU1FU1BBQ0VfUFJFRklYKTsKLQotICAgIC8vIHRoZSBtZXRhLWRhdGEgb2YgdGhlIHNlcnZpY2UgdGhhdCB0aGlzIGNsaWVudCBhY2Nlc3MKLSAgICBwcml2YXRlIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlOwotCi0gICAgLy8gdGhlIGNvbmZpZ3VyYXRpb24gaW4gd2hpY2ggbXkgbWV0YS1kYXRhIGxpdmVzCi0gICAgcHJpdmF0ZSBBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlnOwotCi0gICAgLy8gdGhlIGNvbmZpZ3VyYXRpb24gY29udGV4dCBpbiB3aGljaCBJIGxpdmUKLSAgICBwcml2YXRlIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQ7Ci0KLSAgICAvLyBzZXJ2aWNlIGNvbnRleHQgZm9yIHRoaXMgc3BlY2lmaWMgc2VydmljZSBpbnN0YW5jZQotICAgIHByaXZhdGUgU2VydmljZUNvbnRleHQgc2VydmljZUNvbnRleHQ7Ci0KLSAgICAvLyBjbGllbnQgb3B0aW9ucyBmb3IgdGhpcyBzZXJ2aWNlIGludGVyYWN0aW9uCi0gICAgcHJpdmF0ZSBPcHRpb25zIG9wdGlvbnMgPSBuZXcgT3B0aW9ucygpOwotCi0gICAgLy8gb3B0aW9ucyB0aGF0IG11c3Qgb3ZlcnJpZGUgdGhvc2Ugb2YgdGhlIGNoaWxkIG9wZXJhdGlvbiBjbGllbnQgYWxzbwotICAgIHByaXZhdGUgT3B0aW9ucyBvdmVycmlkZU9wdGlvbnM7Ci0KLSAgICAvLyBsaXN0IG9mIGhlYWRlcnMgdG8gYmUgc2VudCB3aXRoIHRoZSBzaW1wbGUgQVBJcwotICAgIHByaXZhdGUgQXJyYXlMaXN0PE9NRWxlbWVudD4gaGVhZGVyczsKLQotICAgIC8vd2hldGhlciB3ZSBjcmVhdGUgY29uZmlnY3R4IG9yIG5vdAotICAgIHByaXZhdGUgYm9vbGVhbiBjcmVhdGVDb25maWdDdHg7Ci0KLSAgICBwcml2YXRlIGludCBoYXNoQ29kZTsKLQotICAgIHByaXZhdGUgYm9vbGVhbiByZW1vdmVBeGlzU2VydmljZTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIHNlcnZpY2UgY2xpZW50IGNvbmZpZ3VyZWQgdG8gd29yayB3aXRoIGEgc3BlY2lmaWMgQXhpc1NlcnZpY2UuIElmIHRoaXMgc2VydmljZSBpcwotICAgICAqIGFscmVhZHkgaW4gdGhlIHdvcmxkIHRoYXQncyBoYW5kZWQgaW4gKGluIHRoZSBmb3JtIG9mIGEgQ29uZmlndXJhdGlvbkNvbnRleHQpIHRoZW4gSSB3aWxsCi0gICAgICogaGFwcGlseSB3b3JrIGluIGl0LiBJZiBub3QgSSB3aWxsIGNyZWF0ZSBhIHNtYWxsIGxpdHRsZSB2aXJ0dWFsIHdvcmxkIGFuZCBsaXZlIHRoZXJlLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbmZpZ0NvbnRleHQgVGhlIGNvbmZpZ3VyYXRpb24gY29udGV4dCB1bmRlciB3aGljaCB0aGlzIHNlcnZpY2UgbGl2ZXMgKG1heSBiZSBudWxsLAotICAgICAqICAgICAgICAgICAgICAgICAgICAgIGluIHdoaWNoIGNhc2UgYSBuZXcgbG9jYWwgb25lIHdpbGwgYmUgY3JlYXRlZCkKLSAgICAgKiBAcGFyYW0gYXhpc1NlcnZpY2UgICBUaGUgc2VydmljZSBmb3Igd2hpY2ggdGhpcyBpcyB0aGUgY2xpZW50IChtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4sIGluCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgd2hpY2ggY2FzZSBhbiBhbm9ueW1vdXMgc2VydmljZSB3aWxsIGJlIGNyZWF0ZWQpCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQgaWYgc29tZXRoaW5nIGdvZXMgd3Jvbmcgd2hpbGUgY3JlYXRpbmcgYSBjb25maWcgY29udGV4dCAoaWYgbmVlZGVkKQotICAgICAqLwotICAgIHB1YmxpYyBTZXJ2aWNlQ2xpZW50KENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBjb25maWd1cmVTZXJ2aWNlQ2xpZW50KGNvbmZpZ0NvbnRleHQsIGF4aXNTZXJ2aWNlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY29uZmlndXJlU2VydmljZUNsaWVudChDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0LCBBeGlzU2VydmljZSBheGlzU2VydmljZSkKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBpZiAoY29uZmlnQ29udGV4dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoTGlzdGVuZXJNYW5hZ2VyLmRlZmF1bHRDb25maWd1cmF0aW9uQ29udGV4dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY29uZmlnQ29udGV4dCA9IENvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeS4KLSAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUNvbmZpZ3VyYXRpb25Db250ZXh0RnJvbUZpbGVTeXN0ZW0obnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgTGlzdGVuZXJNYW5hZ2VyLmRlZmF1bHRDb25maWd1cmF0aW9uQ29udGV4dCA9IGNvbmZpZ0NvbnRleHQ7Ci0gICAgICAgICAgICAgICAgY3JlYXRlQ29uZmlnQ3R4ID0gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgY29uZmlnQ29udGV4dCA9IExpc3RlbmVyTWFuYWdlci5kZWZhdWx0Q29uZmlndXJhdGlvbkNvbnRleHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy5jb25maWdDb250ZXh0ID0gY29uZmlnQ29udGV4dDsKLSAgICAgICAgaGFzaENvZGUgPSAoaW50KWFub25TZXJ2aWNlQ291bnRlci5pbmNyZW1lbnRBbmRHZXQoKTsKLQotICAgICAgICAvLyBJbml0aWFsaXplIHRyYW5zcG9ydHMKLSAgICAgICAgLy8gVE9ETyA6IGRvIHdlIG5lZWQgdGhpcz8KLSAgICAgICAgY29uZmlnQ29udGV4dC5nZXRMaXN0ZW5lck1hbmFnZXIoKTsKLQotICAgICAgICAvLyBzYXZlIHRoZSBheGlzQ29uZmlnIGFuZCBzZXJ2aWNlCi0gICAgICAgIGF4aXNDb25maWcgPSBjb25maWdDb250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCk7Ci0KLSAgICAgICAgaWYgKGF4aXNTZXJ2aWNlID09IG51bGwpIHsKLSAgICAgICAgICAgIGF4aXNTZXJ2aWNlID0gY3JlYXRlQW5vbnltb3VzU2VydmljZSgpOwotICAgICAgICB9Ci0gICAgICAgIHRoaXMuYXhpc1NlcnZpY2UgPSBheGlzU2VydmljZTsKLSAgICAgICAgLy8gYXhpcyBzZXJ2aWNlIGlzIHJlbW92ZWQgZnJvbSB0aGUgY29uZmlndXJhdGlvbiBjb250ZXh0Ci0gICAgICAgIC8vIG9ubHkgaWYgdXNlciBoYXMgbm90IGFkZGVkIGl0IHRvIGNvbmZpZ3VyYXRpb24gY29udGV4dC4KLSAgICAgICAgaWYgKGF4aXNDb25maWcuZ2V0U2VydmljZShheGlzU2VydmljZS5nZXROYW1lKCkpID09IG51bGwpIHsKLSAgICAgICAgICAgIGF4aXNTZXJ2aWNlLnNldENsaWVudFNpZGUodHJ1ZSk7Ci0gICAgICAgICAgICBheGlzQ29uZmlnLmFkZFNlcnZpY2UoYXhpc1NlcnZpY2UpOwotICAgICAgICAgICAgcmVtb3ZlQXhpc1NlcnZpY2UgPSB0cnVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYXhpc1NlcnZpY2Uuc2V0Q2xpZW50U2lkZSh0cnVlKTsKLSAgICAgICAgICAgIHJlbW92ZUF4aXNTZXJ2aWNlID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgQXhpc1NlcnZpY2VHcm91cCBheGlzU2VydmljZUdyb3VwID0gYXhpc1NlcnZpY2UuZ2V0QXhpc1NlcnZpY2VHcm91cCgpOwotICAgICAgICBTZXJ2aWNlR3JvdXBDb250ZXh0IHNnYyA9IGNvbmZpZ0NvbnRleHQuY3JlYXRlU2VydmljZUdyb3VwQ29udGV4dChheGlzU2VydmljZUdyb3VwKTsKLSAgICAgICAgc2VydmljZUNvbnRleHQgPSBzZ2MuZ2V0U2VydmljZUNvbnRleHQoYXhpc1NlcnZpY2UpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogVGhpcyBpcyBXU0RMNEogYmFzZWQgY29uc3RydWN0b3IgdG8gY29uZmlndXJlIHRoZSBTZXJ2aWNlIENsaWVudC8gVE9ETzogbWFrZSB0aGlzIHBvbGljeQotICAgICAqIGF3YXJlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29uZmlnQ29udGV4dCAgICBhY3RpdmUgQ29uZmlndXJhdGlvbkNvbnRleHQKLSAgICAgKiBAcGFyYW0gd3NkbDRqRGVmaW5pdGlvbiB0aGUgV1NETCB3ZSdyZSBnb2luZyB0byBiZSB1c2luZyB0byBjb25maWd1cmUgb3Vyc2VsdmVzCi0gICAgICogQHBhcmFtIHdzZGxTZXJ2aWNlTmFtZSAgUU5hbWUgb2YgdGhlIFdTREwgc2VydmljZSB3ZSdkIGxpa2UgdG8gYWNjZXNzCi0gICAgICogQHBhcmFtIHBvcnROYW1lICAgICAgICAgbmFtZSBvZiB0aGUgV1NETCBwb3J0IHdlJ2QgbGlrZSB0byBhY2Nlc3MKLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdCBpbiBjYXNlIG9mIGVycm9yCi0gICAgICovCi0KLSAgICBwdWJsaWMgU2VydmljZUNsaWVudChDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0LCBEZWZpbml0aW9uIHdzZGw0akRlZmluaXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgUU5hbWUgd3NkbFNlcnZpY2VOYW1lLCBTdHJpbmcgcG9ydE5hbWUpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBjb25maWd1cmVTZXJ2aWNlQ2xpZW50KGNvbmZpZ0NvbnRleHQsIEF4aXNTZXJ2aWNlLmNyZWF0ZUNsaWVudFNpZGVBeGlzU2VydmljZSgKLSAgICAgICAgICAgICAgICB3c2RsNGpEZWZpbml0aW9uLCB3c2RsU2VydmljZU5hbWUsIHBvcnROYW1lLCBvcHRpb25zKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgc2VydmljZSBjbGllbnQgZm9yIFdTREwgc2VydmljZSBpZGVudGlmaWVkIGJ5IHRoZSBRTmFtZSBvZiB0aGUgd3NkbDpzZXJ2aWNlIGVsZW1lbnQKLSAgICAgKiBpbiBhIFdTREwgZG9jdW1lbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29uZmlnQ29udGV4dCAgIFRoZSBjb25maWd1cmF0aW9uIGNvbnRleHQgdW5kZXIgd2hpY2ggdGhpcyBzZXJ2aWNlIGxpdmVzIChtYXkgYmUKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LCBpbiB3aGljaCBjYXNlIGEgbmV3IGxvY2FsIG9uZSB3aWxsIGJlIGNyZWF0ZWQpICoKLSAgICAgKiBAcGFyYW0gd3NkbFVSTCAgICAgICAgIFRoZSBVUkwgb2YgdGhlIFdTREwgZG9jdW1lbnQgdG8gcmVhZAotICAgICAqIEBwYXJhbSB3c2RsU2VydmljZU5hbWUgVGhlIFFOYW1lIG9mIHRoZSBXU0RMIHNlcnZpY2UgaW4gdGhlIFdTREwgZG9jdW1lbnQgdG8gY3JlYXRlIGEgY2xpZW50Ci0gICAgICogICAgICAgICAgICAgICAgICAgICAgICBmb3IKLSAgICAgKiBAcGFyYW0gcG9ydE5hbWUgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBXU0RMIDEuMSBwb3J0IHRvIGNyZWF0ZSBhIGNsaWVudCBmb3IuIE1heSBiZSBudWxsIChpZgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgV1NETCAyLjAgaXMgdXNlZCBvciBpZiBvbmx5IG9uZSBwb3J0IGlzIHRoZXJlKS4gLgotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0IGlmIHNvbWV0aGluZyBnb2VzIHdyb25nIHdoaWxlIGNyZWF0aW5nIGEgY29uZmlnIGNvbnRleHQgKGlmIG5lZWRlZCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU2VydmljZUNsaWVudChDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0LCBVUkwgd3NkbFVSTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBRTmFtZSB3c2RsU2VydmljZU5hbWUsIFN0cmluZyBwb3J0TmFtZSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIGNvbmZpZ3VyZVNlcnZpY2VDbGllbnQoY29uZmlnQ29udGV4dCwgQXhpc1NlcnZpY2UuY3JlYXRlQ2xpZW50U2lkZUF4aXNTZXJ2aWNlKHdzZGxVUkwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzZGxTZXJ2aWNlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMpKTsKLSAgICAgICAgUGFyYW1ldGVyIHRyYW5zcG9ydE5hbWUgPSBheGlzU2VydmljZS5nZXRQYXJhbWV0ZXIoIlRSQU5TUE9SVF9OQU1FIik7Ci0gICAgICAgIGlmICh0cmFuc3BvcnROYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIFRyYW5zcG9ydE91dERlc2NyaXB0aW9uIHRyYW5zcG9ydE91dCA9Ci0gICAgICAgICAgICAgICAgICAgIGNvbmZpZ0NvbnRleHQuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5nZXRUcmFuc3BvcnRPdXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0TmFtZS5nZXRWYWx1ZSgpLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgaWYgKHRyYW5zcG9ydE91dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgbG9hZCB0cmFuc3BvcnQgZnJvbSBiaW5kaW5nLCBlaXRoZXIgZGVmaW4gaW4gQXhpczIuY29uZmlnICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIm9yIHNldCBpdCBleHBsaWNpdGVseSBpbiBTZXJ2aWNlQ2xpbmV0Lk9wdGlvbnMiKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgb3B0aW9ucy5zZXRUcmFuc3BvcnRPdXQodHJhbnNwb3J0T3V0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIHNlcnZpY2UgY2xpZW50IGJ5IGFzc3VtaW5nIGFuIGFub255bW91cyBzZXJ2aWNlIGFuZCBhbnkgb3RoZXIgbmVjZXNzYXJ5Ci0gICAgICogaW5mb3JtYXRpb24uCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdCBpbiBjYXNlIG9mIGVycm9yCi0gICAgICovCi0gICAgcHVibGljIFNlcnZpY2VDbGllbnQoKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgdGhpcyhudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gYW5vbnltb3VzIGF4aXNTZXJ2aWNlIHdpdGggb25lIChhbm9ueW1vdXMpIG9wZXJhdGlvbiBmb3IgZWFjaCBNRVAgdGhhdCB3ZSBzdXBwb3J0Ci0gICAgICogZGVhbGluZyB3aXRoIGFub255bW91c2x5IHVzaW5nIHRoZSBjb252ZW5pZW5jZSBBUElzLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgbWludGVkIGFub255bW91cyBzZXJ2aWNlCi0gICAgICovCi0gICAgcHJpdmF0ZSBBeGlzU2VydmljZSBjcmVhdGVBbm9ueW1vdXNTZXJ2aWNlKCkgewotICAgICAgICAvLyBub3cgYWRkIGFub255bW91cyBvcGVyYXRpb25zIHRvIHRoZSBheGlzMiBzZXJ2aWNlIGZvciB1c2Ugd2l0aCB0aGUKLSAgICAgICAgLy8gc2hvcnRjdXQgY2xpZW50IEFQSS4gTk9URTogV2Ugb25seSBhZGQgdGhlIG9uZXMgd2Uga25vdyB3ZSdsbCB1c2UKLSAgICAgICAgLy8gbGF0ZXIgaW4gdGhlIGNvbnZlbmllbmNlIEFQSTsgaWYgeW91IHVzZQotICAgICAgICAvLyB0aGlzIGNvbnN0cnVjdG9yIHRoZW4geW91IGNhbid0IGV4cGVjdCBhbnkgbWFnaWMhCi0gICAgICAgIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlID0KLSAgICAgICAgICAgICAgICBuZXcgQXhpc1NlcnZpY2UoQU5PTl9TRVJWSUNFICsgYW5vblNlcnZpY2VDb3VudGVyLmluY3JlbWVudEFuZEdldCgpKTsKLSAgICAgICAgUm9idXN0T3V0T25seUF4aXNPcGVyYXRpb24gcm9idXN0b3V0b29ubHlPcGVyYXRpb24gPSBuZXcgUm9idXN0T3V0T25seUF4aXNPcGVyYXRpb24oCi0gICAgICAgICAgICAgICAgQU5PTl9ST0JVU1RfT1VUX09OTFlfT1ApOwotICAgICAgICBheGlzU2VydmljZS5hZGRPcGVyYXRpb24ocm9idXN0b3V0b29ubHlPcGVyYXRpb24pOwotCi0gICAgICAgIE91dE9ubHlBeGlzT3BlcmF0aW9uIG91dE9ubHlPcGVyYXRpb24gPSBuZXcgT3V0T25seUF4aXNPcGVyYXRpb24oCi0gICAgICAgICAgICAgICAgQU5PTl9PVVRfT05MWV9PUCk7Ci0gICAgICAgIGF4aXNTZXJ2aWNlLmFkZE9wZXJhdGlvbihvdXRPbmx5T3BlcmF0aW9uKTsKLQotICAgICAgICBPdXRJbkF4aXNPcGVyYXRpb24gb3V0SW5PcGVyYXRpb24gPSBuZXcgT3V0SW5BeGlzT3BlcmF0aW9uKAotICAgICAgICAgICAgICAgIEFOT05fT1VUX0lOX09QKTsKLSAgICAgICAgYXhpc1NlcnZpY2UuYWRkT3BlcmF0aW9uKG91dEluT3BlcmF0aW9uKTsKLSAgICAgICAgcmV0dXJuIGF4aXNTZXJ2aWNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgQXhpc0NvbmZpZ3VyYXRpb24KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIEF4aXNDb25maWd1cmF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgY2xpZW50LgotICAgICAqLwotICAgIHB1YmxpYyBBeGlzQ29uZmlndXJhdGlvbiBnZXRBeGlzQ29uZmlndXJhdGlvbigpIHsKLSAgICAgICAgc3luY2hyb25pemVkICh0aGlzLmF4aXNDb25maWcpIHsKLSAgICAgICAgICAgIHJldHVybiBheGlzQ29uZmlnOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBBeGlzU2VydmljZSB0aGlzIGlzIGEgY2xpZW50IGZvci4gVGhpcyBpcyBwcmltYXJpbHkgdXNlZnVsIHdoZW4gdGhlIEF4aXNTZXJ2aWNlIGlzCi0gICAgICogY3JlYXRlZCBhbm9ueW1vdXNseSBvciBmcm9tIFdTREwgYXMgb3RoZXJ3aXNlIHRoZSB1c2VyIGhhZCB0aGUgQXhpc1NlcnZpY2UgdG8gc3RhcnQgd2l0aC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIGF4aXNTZXJ2aWNlCi0gICAgICovCi0gICAgcHVibGljIEF4aXNTZXJ2aWNlIGdldEF4aXNTZXJ2aWNlKCkgewotICAgICAgICByZXR1cm4gYXhpc1NlcnZpY2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBiYXNpYyBjbGllbnQgY29uZmlndXJhdGlvbiByZWxhdGVkIHRvIHRoaXMgc2VydmljZSBpbnRlcmFjdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvcHRpb25zIChub24tPGNvZGU+bnVsbDwvY29kZT4pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0T3B0aW9ucyhPcHRpb25zIG9wdGlvbnMpIHsKLSAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9uczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGJhc2ljIGNsaWVudCBjb25maWd1cmF0aW9uIGZyb20gdGhpcyBzZXJ2aWNlIGludGVyYWN0aW9uLgotICAgICAqCi0gICAgICogQHJldHVybiBvcHRpb25zCi0gICAgICovCi0gICAgcHVibGljIE9wdGlvbnMgZ2V0T3B0aW9ucygpIHsKLSAgICAgICAgcmV0dXJuIG9wdGlvbnM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IGEgY2xpZW50IGNvbmZpZ3VyYXRpb24gdG8gb3ZlcnJpZGUgdGhlIG5vcm1hbCBvcHRpb25zIHVzZWQgYnkgYW4gb3BlcmF0aW9uIGNsaWVudC4gQW55Ci0gICAgICogdmFsdWVzIHNldCBpbiB0aGlzIGNvbmZpZ3VyYXRpb24gd2lsbCBiZSB1c2VkIGZvciBlYWNoIGNsaWVudCwgd2l0aCB0aGUgc3RhbmRhcmQgdmFsdWVzIGZvcgotICAgICAqIHRoZSBjbGllbnQgc3RpbGwgdXNlZCBmb3IgYW55IHZhbHVlcyBub3Qgc2V0IGluIHRoZSBvdmVycmlkZSBjb25maWd1cmF0aW9uLgotICAgICAqCi0gICAgICogQHBhcmFtIG92ZXJyaWRlT3B0aW9ucyB0aGUgT3B0aW9ucyB0byB1c2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRPdmVycmlkZU9wdGlvbnMoT3B0aW9ucyBvdmVycmlkZU9wdGlvbnMpIHsKLSAgICAgICAgdGhpcy5vdmVycmlkZU9wdGlvbnMgPSBvdmVycmlkZU9wdGlvbnM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBjbGllbnQgY29uZmlndXJhdGlvbiB1c2VkIHRvIG92ZXJyaWRlIHRoZSBub3JtYWwgb3B0aW9ucyBzZXQgYnkgYW4gb3BlcmF0aW9uIGNsaWVudC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gb3ZlcnJpZGUgb3B0aW9ucwotICAgICAqLwotICAgIHB1YmxpYyBPcHRpb25zIGdldE92ZXJyaWRlT3B0aW9ucygpIHsKLSAgICAgICAgcmV0dXJuIG92ZXJyaWRlT3B0aW9uczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFbmdhZ2UgYSBtb2R1bGUgZm9yIHRoaXMgc2VydmljZSBjbGllbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbW9kdWxlTmFtZSBuYW1lIG9mIHRoZSBtb2R1bGUgdG8gZW5nYWdlCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQgaWYgc29tZXRoaW5nIGdvZXMgd3JvbmcKLSAgICAgKiBAZGVwcmVjYXRlZCBQbGVhc2UgdXNlIFN0cmluZyB2ZXJzaW9uIGluc3RlYWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBlbmdhZ2VNb2R1bGUoUU5hbWUgbW9kdWxlTmFtZSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIGVuZ2FnZU1vZHVsZShtb2R1bGVOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFbmdhZ2UgYSBtb2R1bGUgZm9yIHRoaXMgc2VydmljZSBjbGllbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbW9kdWxlTmFtZSBuYW1lIG9mIHRoZSBtb2R1bGUgdG8gZW5nYWdlCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQgaWYgc29tZXRoaW5nIGdvZXMgd3JvbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBlbmdhZ2VNb2R1bGUoU3RyaW5nIG1vZHVsZU5hbWUpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMuYXhpc0NvbmZpZykgewotICAgICAgICAgICAgQXhpc01vZHVsZSBtb2R1bGUgPSBheGlzQ29uZmlnLmdldE1vZHVsZShtb2R1bGVOYW1lKTsKLSAgICAgICAgICAgIGlmIChtb2R1bGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlLmVuZ2FnZU1vZHVsZShtb2R1bGUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJVbmFibGUgdG8gZW5nYWdlIG1vZHVsZSA6ICIgKyBtb2R1bGVOYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIERpc2VuZ2FnZSBhIG1vZHVsZSBmb3IgdGhpcyBzZXJ2aWNlIGNsaWVudAotICAgICAqCi0gICAgICogQHBhcmFtIG1vZHVsZU5hbWUgbmFtZSBvZiBNb2R1bGUgdG8gZGlzZW5nYWdlCi0gICAgICogQGRlcHJlY2F0ZWQgUGxlYXNlIHVzZSBTdHJpbmcgdmVyc2lvbiBpbnN0ZWFkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGlzZW5nYWdlTW9kdWxlKFFOYW1lIG1vZHVsZU5hbWUpIHsKLSAgICAgICAgZGlzZW5nYWdlTW9kdWxlKG1vZHVsZU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERpc2VuZ2FnZSBhIG1vZHVsZSBmb3IgdGhpcyBzZXJ2aWNlIGNsaWVudAotICAgICAqCi0gICAgICogQHBhcmFtIG1vZHVsZU5hbWUgbmFtZSBvZiBNb2R1bGUgdG8gZGlzZW5nYWdlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGlzZW5nYWdlTW9kdWxlKFN0cmluZyBtb2R1bGVOYW1lKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAodGhpcy5heGlzQ29uZmlnKSB7Ci0gICAgICAgICAgICBBeGlzTW9kdWxlIG1vZHVsZSA9IGF4aXNDb25maWcuZ2V0TW9kdWxlKG1vZHVsZU5hbWUpOwotICAgICAgICAgICAgaWYgKG1vZHVsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgYXhpc1NlcnZpY2UuZGlzZW5nYWdlTW9kdWxlKG1vZHVsZSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGF4aXNGYXVsdCkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3IoYXhpc0ZhdWx0LmdldE1lc3NhZ2UoKSwgYXhpc0ZhdWx0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgYW4gYXJiaXRyYXJ5IFhNTCBlbGVtZW50IGFzIGEgaGVhZGVyIHRvIGJlIHNlbnQgd2l0aCBvdXRnb2luZyBtZXNzYWdlcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBoZWFkZXIgaGVhZGVyIHRvIGJlIHNlbnQgKG5vbi08Y29kZT5udWxsPC9jb2RlPikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRIZWFkZXIoT01FbGVtZW50IGhlYWRlcikgewotICAgICAgICBpZiAoaGVhZGVycyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBoZWFkZXJzID0gbmV3IEFycmF5TGlzdDxPTUVsZW1lbnQ+KCk7Ci0gICAgICAgIH0KLSAgICAgICAgaGVhZGVycy5hZGQoaGVhZGVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgU09BUCBIZWFkZXIgdG8gYmUgc2VudCB3aXRoIG91dGdvaW5nIG1lc3NhZ2VzLgotICAgICAqCi0gICAgICogQHBhcmFtIGhlYWRlciBoZWFkZXIgdG8gYmUgc2VudCAobm9uLTxjb2RlPm51bGw8L2NvZGU+KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZEhlYWRlcihTT0FQSGVhZGVyQmxvY2sgaGVhZGVyKSB7Ci0gICAgICAgIGlmIChoZWFkZXJzID09IG51bGwpIHsKLSAgICAgICAgICAgIGhlYWRlcnMgPSBuZXcgQXJyYXlMaXN0PE9NRWxlbWVudD4oKTsKLSAgICAgICAgfQotICAgICAgICBoZWFkZXJzLmFkZChoZWFkZXIpOwotICAgIH0KLQotICAgIC8qKiBSZW1vdmUgYWxsIGhlYWRlcnMgZm9yIG91dGdvaW5nIG1lc3NhZ2UuICovCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlSGVhZGVycygpIHsKLSAgICAgICAgaWYgKGhlYWRlcnMgIT0gbnVsbCkgewotICAgICAgICAgICAgaGVhZGVycy5jbGVhcigpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBBZGQgYSBzaW1wbGUgaGVhZGVyIGNvbnRhaW5pbmcgc29tZSB0ZXh0IHRvIGJlIHNlbnQgd2l0aCBpbnRlcmFjdGlvbnMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaGVhZGVyTmFtZSBuYW1lIG9mIGhlYWRlciB0byBhZGQKLSAgICAgKiBAcGFyYW0gaGVhZGVyVGV4dCB0ZXh0IGNvbnRlbnQgZm9yIGhlYWRlcgotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0IGluIGNhc2Ugb2YgZXJyb3IKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRTdHJpbmdIZWFkZXIoUU5hbWUgaGVhZGVyTmFtZSwgU3RyaW5nIGhlYWRlclRleHQpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBpZiAoaGVhZGVyTmFtZS5nZXROYW1lc3BhY2VVUkkoKSA9PSBudWxsIHx8ICIiLmVxdWFscyhoZWFkZXJOYW1lLmdldE5hbWVzcGFjZVVSSSgpKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgKLSAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBhZGQgc3RyaW5nIGhlYWRlciwgeW91IGhhdmUgdG8gaGF2ZSBuYW1lc3BhY2VVUkkgZm9yIHRoZSBRTmFtZSIpOwotICAgICAgICB9Ci0gICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKS5jcmVhdGVPTUVsZW1lbnQoaGVhZGVyTmFtZSwgbnVsbCk7Ci0gICAgICAgIG9tRWxlbWVudC5zZXRUZXh0KGhlYWRlclRleHQpOwotICAgICAgICBhZGRIZWFkZXIob21FbGVtZW50KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEaXJlY3RseSBpbnZva2UgYW4gYW5vbnltb3VzIG9wZXJhdGlvbiB3aXRoIGEgUm9idXN0IEluLU9ubHkgTUVQLiBUaGlzIG1ldGhvZCBqdXN0IHNlbmRzIHlvdXIKLSAgICAgKiBzdXBwbGllZCBYTUwgYW5kIHBvc3NpYmx5IHJlY2VpdmVzIGEgZmF1bHQuIEZvciBtb3JlIGNvbnRyb2wsIHlvdSBjYW4gaW5zdGVhZCBjcmVhdGUgYSBjbGllbnQKLSAgICAgKiBmb3IgdGhlIG9wZXJhdGlvbiBhbmQgdXNlIHRoYXQgY2xpZW50IHRvIGV4ZWN1dGUgdGhlIHNlbmQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZWxlbSBYTUwgdG8gc2VuZAotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0IGlmIHNvbWV0aGluZyBnb2VzIHdyb25nIHdoaWxlIHNlbmRpbmcsIG9yIGlmIGEgZmF1bHQgaXMgcmVjZWl2ZWQgaW4KLSAgICAgKiAgICAgICAgICAgICAgICAgICByZXNwb25zZSAocGVyIHRoZSBSb2J1c3QgSW4tT25seSBNRVApLgotICAgICAqIEBzZWUgI2NyZWF0ZUNsaWVudChRTmFtZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZW5kUm9idXN0KE9NRWxlbWVudCBlbGVtKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgc2VuZFJvYnVzdChBTk9OX1JPQlVTVF9PVVRfT05MWV9PUCwgZWxlbSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGlyZWN0bHkgaW52b2tlIGEgbmFtZWQgb3BlcmF0aW9uIHdpdGggYSBSb2J1c3QgSW4tT25seSBNRVAuIFRoaXMgbWV0aG9kIGp1c3Qgc2VuZHMgeW91cgotICAgICAqIHN1cHBsaWVkIFhNTCBhbmQgcG9zc2libHkgcmVjZWl2ZXMgYSBmYXVsdC4gRm9yIG1vcmUgY29udHJvbCwgeW91IGNhbiBpbnN0ZWFkIGNyZWF0ZSBhIGNsaWVudAotICAgICAqIGZvciB0aGUgb3BlcmF0aW9uIGFuZCB1c2UgdGhhdCBjbGllbnQgdG8gZXhlY3V0ZSB0aGUgc2VuZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvcGVyYXRpb24gbmFtZSBvZiBvcGVyYXRpb24gdG8gYmUgaW52b2tlZCAobm9uLTxjb2RlPm51bGw8L2NvZGU+KQotICAgICAqIEBwYXJhbSBlbGVtICAgICAgWE1MIHRvIHNlbmQKLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdCBpZiBzb21ldGhpbmcgZ29lcyB3cm9uZyB3aGlsZSBzZW5kaW5nIGl0IG9yIGlmIGEgZmF1bHQgaXMgcmVjZWl2ZWQgaW4KLSAgICAgKiAgICAgICAgICAgICAgICAgICByZXNwb25zZSAocGVyIHRoZSBSb2J1c3QgSW4tT25seSBNRVApLgotICAgICAqIEBzZWUgI2NyZWF0ZUNsaWVudChRTmFtZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZW5kUm9idXN0KFFOYW1lIG9wZXJhdGlvbiwgT01FbGVtZW50IGVsZW0pIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBNZXNzYWdlQ29udGV4dCBtYyA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBmaWxsU09BUEVudmVsb3BlKG1jLCBlbGVtKTsKLSAgICAgICAgT3BlcmF0aW9uQ2xpZW50IG1lcENsaWVudCA9IGNyZWF0ZUNsaWVudChvcGVyYXRpb24pOwotICAgICAgICBtZXBDbGllbnQuYWRkTWVzc2FnZUNvbnRleHQobWMpOwotICAgICAgICBtZXBDbGllbnQuZXhlY3V0ZSh0cnVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEaXJlY3RseSBpbnZva2UgYW4gYW5vbnltb3VzIG9wZXJhdGlvbiB3aXRoIGFuIEluLU9ubHkgTUVQLiBUaGlzIG1ldGhvZCBqdXN0IHNlbmRzIHlvdXIKLSAgICAgKiBzdXBwbGllZCBYTUwgd2l0aG91dCB0aGUgcG9zc2liaWxpdHkgb2YgYW55IHJlc3BvbnNlIGZyb20gdGhlIHNlcnZpY2UgKGV2ZW4gYW4gZXJyb3IgLSB0aG91Z2gKLSAgICAgKiB5b3UgY2FuIHN0aWxsIGdldCBjbGllbnQtc2lkZSBlcnJvcnMgc3VjaCBhcyAiSG9zdCBub3QgZm91bmQiKS4gRm9yIG1vcmUgY29udHJvbCwgeW91IGNhbgotICAgICAqIGluc3RlYWQgY3JlYXRlIGEgY2xpZW50IGZvciB0aGUgb3BlcmF0aW9uIGFuZCB1c2UgdGhhdCBjbGllbnQgdG8gZXhlY3V0ZSB0aGUgc2VuZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBlbGVtIFhNTCB0byBzZW5kCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQgZmYgc29tZXRoaW5nIGdvZXMgd3JvbmcgdHJ5aW5nIHRvIHNlbmQgdGhlIFhNTAotICAgICAqIEBzZWUgI2NyZWF0ZUNsaWVudChRTmFtZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBmaXJlQW5kRm9yZ2V0KE9NRWxlbWVudCBlbGVtKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgZmlyZUFuZEZvcmdldChBTk9OX09VVF9PTkxZX09QLCBlbGVtKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEaXJlY3RseSBpbnZva2UgYSBuYW1lZCBvcGVyYXRpb24gd2l0aCBhbiBJbi1Pbmx5IE1FUC4gVGhpcyBtZXRob2QganVzdCBzZW5kcyB5b3VyIHN1cHBsaWVkCi0gICAgICogWE1MIHdpdGhvdXQgdGhlIHBvc3NpYmlsaXR5IG9mIGFueSByZXNwb25zZSBmcm9tIHRoZSBzZXJ2aWNlIChldmVuIGFuIGVycm9yIC0gdGhvdWdoIHlvdSBjYW4KLSAgICAgKiBzdGlsbCBnZXQgY2xpZW50LXNpZGUgZXJyb3JzIHN1Y2ggYXMgIkhvc3Qgbm90IGZvdW5kIikuIEZvciBtb3JlIGNvbnRyb2wsIHlvdSBjYW4gaW5zdGVhZAotICAgICAqIGNyZWF0ZSBhIGNsaWVudCBmb3IgdGhlIG9wZXJhdGlvbiBhbmQgdXNlIHRoYXQgY2xpZW50IHRvIGV4ZWN1dGUgdGhlIHNlbmQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb3BlcmF0aW9uIG5hbWUgb2Ygb3BlcmF0aW9uIHRvIGJlIGludm9rZWQgKG5vbi08Y29kZT5udWxsPC9jb2RlPikKLSAgICAgKiBAcGFyYW0gZWxlbSAgICAgIFhNTCB0byBzZW5kCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQgaWYgc29tZXRoaW5nIGdvZXMgd3JvbmcgdHJ5aW5nIHRvIHNlbmQgdGhlIFhNTAotICAgICAqIEBzZWUgI2NyZWF0ZUNsaWVudChRTmFtZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBmaXJlQW5kRm9yZ2V0KFFOYW1lIG9wZXJhdGlvbiwgT01FbGVtZW50IGVsZW0pIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICAvLyBsb29rIHVwIHRoZSBhcHByb3ByaWF0ZSBheGlzb3AgYW5kIGNyZWF0ZSB0aGUgY2xpZW50Ci0gICAgICAgIE9wZXJhdGlvbkNsaWVudCBtZXBDbGllbnQgPSBjcmVhdGVDbGllbnQob3BlcmF0aW9uKTsKLSAgICAgICAgLy8gY3JlYXRlIGEgbWVzc2FnZSBjb250ZXh0IGFuZCBwdXQgdGhlIHBheWxvYWQgaW4gdGhlcmUgYWxvbmcgd2l0aCBhbnkKLSAgICAgICAgLy8gaGVhZGVycwotICAgICAgICBNZXNzYWdlQ29udGV4dCBtYyA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBmaWxsU09BUEVudmVsb3BlKG1jLCBlbGVtKTsKLSAgICAgICAgLy8gYWRkIHRoZSBtZXNzYWdlIGNvbnRleHQgdGhlcmUgYW5kIGhhdmUgaXQgZ28KLSAgICAgICAgbWVwQ2xpZW50LmFkZE1lc3NhZ2VDb250ZXh0KG1jKTsKLSAgICAgICAgbWVwQ2xpZW50LmV4ZWN1dGUoZmFsc2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERpcmVjdGx5IGludm9rZSBhbiBhbm9ueW1vdXMgb3BlcmF0aW9uIHdpdGggYW4gSW4tT3V0IE1FUC4gVGhpcyBtZXRob2Qgc2VuZHMgeW91ciBzdXBwbGllZAotICAgICAqIFhNTCBhbmQgcmVjZWl2ZXMgYSByZXNwb25zZS4gRm9yIG1vcmUgY29udHJvbCwgeW91IGNhbiBpbnN0ZWFkIGNyZWF0ZSBhIGNsaWVudCBmb3IgdGhlCi0gICAgICogb3BlcmF0aW9uIGFuZCB1c2UgdGhhdCBjbGllbnQgdG8gZXhlY3V0ZSB0aGUgZXhjaGFuZ2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZWxlbSB0aGUgZGF0YSB0byBzZW5kIChiZWNvbWVzIHRoZSBjb250ZW50IG9mIFNPQVAgYm9keSkKLSAgICAgKiBAcmV0dXJuIHJlc3BvbnNlCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQgaW4gY2FzZSBvZiBlcnJvcgotICAgICAqIEBzZWUgI2NyZWF0ZUNsaWVudChRTmFtZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgT01FbGVtZW50IHNlbmRSZWNlaXZlKE9NRWxlbWVudCBlbGVtKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgcmV0dXJuIHNlbmRSZWNlaXZlKEFOT05fT1VUX0lOX09QLCBlbGVtKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEaXJlY3RseSBpbnZva2UgYSBuYW1lZCBvcGVyYXRpb25RTmFtZSB3aXRoIGFuIEluLU91dCBNRVAuIFRoaXMgbWV0aG9kIHNlbmRzIHlvdXIgc3VwcGxpZWQKLSAgICAgKiBYTUwgYW5kIHJlY2VpdmVzIGEgcmVzcG9uc2UuIEZvciBtb3JlIGNvbnRyb2wsIHlvdSBjYW4gaW5zdGVhZCBjcmVhdGUgYSBjbGllbnQgZm9yIHRoZQotICAgICAqIG9wZXJhdGlvblFOYW1lIGFuZCB1c2UgdGhhdCBjbGllbnQgdG8gZXhlY3V0ZSB0aGUgZXhjaGFuZ2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb3BlcmF0aW9uUU5hbWUgbmFtZSBvZiBvcGVyYXRpb25RTmFtZSB0byBiZSBpbnZva2VkIChub24tPGNvZGU+bnVsbDwvY29kZT4pCi0gICAgICogQHBhcmFtIHhtbFBheWxvYWQgICAgIHRoZSBkYXRhIHRvIHNlbmQgKGJlY29tZXMgdGhlIGNvbnRlbnQgb2YgU09BUCBib2R5KQotICAgICAqIEByZXR1cm4gcmVzcG9uc2UgT01FbGVtZW50Ci0gICAgICogQHRocm93cyBBeGlzRmF1bHQgaW4gY2FzZSBvZiBlcnJvcgotICAgICAqLwotICAgIHB1YmxpYyBPTUVsZW1lbnQgc2VuZFJlY2VpdmUoUU5hbWUgb3BlcmF0aW9uUU5hbWUsIE9NRWxlbWVudCB4bWxQYXlsb2FkKQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0ID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIGZpbGxTT0FQRW52ZWxvcGUobWVzc2FnZUNvbnRleHQsIHhtbFBheWxvYWQpOwotICAgICAgICBPcGVyYXRpb25DbGllbnQgb3BlcmF0aW9uQ2xpZW50ID0gY3JlYXRlQ2xpZW50KG9wZXJhdGlvblFOYW1lKTsKLSAgICAgICAgb3BlcmF0aW9uQ2xpZW50LmFkZE1lc3NhZ2VDb250ZXh0KG1lc3NhZ2VDb250ZXh0KTsKLSAgICAgICAgb3BlcmF0aW9uQ2xpZW50LmV4ZWN1dGUodHJ1ZSk7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IHJlc3BvbnNlID0gb3BlcmF0aW9uQ2xpZW50Ci0gICAgICAgICAgICAgICAgLmdldE1lc3NhZ2VDb250ZXh0KFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9JTl9WQUxVRSk7Ci0gICAgICAgIGlmIChvcHRpb25zLmlzQ2FsbFRyYW5zcG9ydENsZWFudXAoKSkgewotICAgICAgICAgICAgcmVzcG9uc2UuZ2V0RW52ZWxvcGUoKS5idWlsZCgpOwotICAgICAgICAgICAgY2xlYW51cFRyYW5zcG9ydCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXNwb25zZS5nZXRFbnZlbG9wZSgpLmdldEJvZHkoKS5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEaXJlY3RseSBpbnZva2UgYW4gYW5vbnltb3VzIG9wZXJhdGlvbiB3aXRoIGFuIEluLU91dCBNRVAgd2l0aG91dCB3YWl0aW5nIGZvciBhIHJlc3BvbnNlLgotICAgICAqIFRoaXMgbWV0aG9kIHNlbmRzIHlvdXIgc3VwcGxpZWQgWE1MIHdpdGggcmVzcG9uc2Ugbm90aWZpY2F0aW9uIHRvIHlvdXIgY2FsbGJhY2sgaGFuZGxlci4gRm9yCi0gICAgICogbW9yZSBjb250cm9sLCB5b3UgY2FuIGluc3RlYWQgY3JlYXRlIGEgY2xpZW50IGZvciB0aGUgb3BlcmF0aW9uIGFuZCB1c2UgdGhhdCBjbGllbnQgdG8KLSAgICAgKiBleGVjdXRlIHRoZSBleGNoYW5nZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBlbGVtICAgICB0aGUgZGF0YSB0byBzZW5kIChiZWNvbWVzIHRoZSBjb250ZW50IG9mIFNPQVAgYm9keSkKLSAgICAgKiBAcGFyYW0gY2FsbGJhY2sgYSBDYWxsYmFjayB3aGljaCB3aWxsIGJlIG5vdGlmaWVkIHVwb24gY29tcGxldGlvbgotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0IGluIGNhc2Ugb2YgZXJyb3IKLSAgICAgKiBAc2VlICNjcmVhdGVDbGllbnQoUU5hbWUpCi0gICAgICogQGRlcHJlY2F0ZWQgUGxlYXNlIHVzZSB0aGUgQXhpc0NhbGxiYWNrIGludGVyZmFjZSByYXRoZXIgdGhhbiBDYWxsYmFjaywgd2hpY2ggaGFzIGJlZW4KLSAgICAgKiAgICAgICAgICAgICBkZXByZWNhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2VuZFJlY2VpdmVOb25CbG9ja2luZyhPTUVsZW1lbnQgZWxlbSwgQ2FsbGJhY2sgY2FsbGJhY2spCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgc2VuZFJlY2VpdmVOb25CbG9ja2luZyhBTk9OX09VVF9JTl9PUCwgZWxlbSwgY2FsbGJhY2spOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERpcmVjdGx5IGludm9rZSBhbiBhbm9ueW1vdXMgb3BlcmF0aW9uIHdpdGggYW4gSW4tT3V0IE1FUCB3aXRob3V0IHdhaXRpbmcgZm9yIGEgcmVzcG9uc2UuCi0gICAgICogVGhpcyBtZXRob2Qgc2VuZHMgeW91ciBzdXBwbGllZCBYTUwgd2l0aCByZXNwb25zZSBub3RpZmljYXRpb24gdG8geW91ciBjYWxsYmFjayBoYW5kbGVyLiBGb3IKLSAgICAgKiBtb3JlIGNvbnRyb2wsIHlvdSBjYW4gaW5zdGVhZCBjcmVhdGUgYSBjbGllbnQgZm9yIHRoZSBvcGVyYXRpb24gYW5kIHVzZSB0aGF0IGNsaWVudCB0bwotICAgICAqIGV4ZWN1dGUgdGhlIGV4Y2hhbmdlLgotICAgICAqCi0gICAgICogQHBhcmFtIGVsZW0gICAgIHRoZSBkYXRhIHRvIHNlbmQgKGJlY29tZXMgdGhlIGNvbnRlbnQgb2YgU09BUCBib2R5KQotICAgICAqIEBwYXJhbSBjYWxsYmFjayBhIENhbGxiYWNrIHdoaWNoIHdpbGwgYmUgbm90aWZpZWQgdXBvbiBjb21wbGV0aW9uCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQgaW4gY2FzZSBvZiBlcnJvcgotICAgICAqIEBzZWUgI2NyZWF0ZUNsaWVudChRTmFtZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZW5kUmVjZWl2ZU5vbkJsb2NraW5nKE9NRWxlbWVudCBlbGVtLCBBeGlzQ2FsbGJhY2sgY2FsbGJhY2spCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgc2VuZFJlY2VpdmVOb25CbG9ja2luZyhBTk9OX09VVF9JTl9PUCwgZWxlbSwgY2FsbGJhY2spOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERpcmVjdGx5IGludm9rZSBhIG5hbWVkIG9wZXJhdGlvbiB3aXRoIGFuIEluLU91dCBNRVAgd2l0aG91dCB3YWl0aW5nIGZvciBhIHJlc3BvbnNlLiBUaGlzCi0gICAgICogbWV0aG9kIHNlbmRzIHlvdXIgc3VwcGxpZWQgWE1MIHdpdGggcmVzcG9uc2Ugbm90aWZpY2F0aW9uIHRvIHlvdXIgY2FsbGJhY2sgaGFuZGxlci4gRm9yIG1vcmUKLSAgICAgKiBjb250cm9sLCB5b3UgY2FuIGluc3RlYWQgY3JlYXRlIGEgY2xpZW50IGZvciB0aGUgb3BlcmF0aW9uIGFuZCB1c2UgdGhhdCBjbGllbnQgdG8gZXhlY3V0ZSB0aGUKLSAgICAgKiBleGNoYW5nZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvcGVyYXRpb24gbmFtZSBvZiBvcGVyYXRpb24gdG8gYmUgaW52b2tlZCAobm9uLTxjb2RlPm51bGw8L2NvZGU+KQotICAgICAqIEBwYXJhbSBlbGVtICAgICAgdGhlIGRhdGEgdG8gc2VuZCAoYmVjb21lcyB0aGUgY29udGVudCBvZiBTT0FQIGJvZHkpCi0gICAgICogQHBhcmFtIGNhbGxiYWNrICBhIENhbGxiYWNrIHdoaWNoIHdpbGwgYmUgbm90aWZpZWQgdXBvbiBjb21wbGV0aW9uCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQgaW4gY2FzZSBvZiBlcnJvcgotICAgICAqIEBzZWUgI2NyZWF0ZUNsaWVudChRTmFtZSkKLSAgICAgKiBAZGVwcmVjYXRlZCBQbGVhc2UgdXNlIHRoZSBBeGlzQ2FsbGJhY2sgaW50ZXJmYWNlIHJhdGhlciB0aGFuIENhbGxiYWNrLCB3aGljaCBoYXMgYmVlbgotICAgICAqICAgICAgICAgICAgIGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZW5kUmVjZWl2ZU5vbkJsb2NraW5nKFFOYW1lIG9wZXJhdGlvbiwgT01FbGVtZW50IGVsZW0sIENhbGxiYWNrIGNhbGxiYWNrKQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1jID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIGZpbGxTT0FQRW52ZWxvcGUobWMsIGVsZW0pOwotICAgICAgICBPcGVyYXRpb25DbGllbnQgbWVwQ2xpZW50ID0gY3JlYXRlQ2xpZW50KG9wZXJhdGlvbik7Ci0gICAgICAgIC8vIGhlcmUgYSBibG9ja2luZyBpbnZvY2F0aW9uIGhhcHBlbnMgaW4gYSBuZXcgdGhyZWFkLCBzbyB0aGUKLSAgICAgICAgLy8gcHJvZ2FtbWluZyBtb2RlbCBpcyBub24gYmxvY2tpbmcKLSAgICAgICAgbWVwQ2xpZW50LnNldENhbGxiYWNrKGNhbGxiYWNrKTsKLSAgICAgICAgbWVwQ2xpZW50LmFkZE1lc3NhZ2VDb250ZXh0KG1jKTsKLSAgICAgICAgbWVwQ2xpZW50LmV4ZWN1dGUoZmFsc2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERpcmVjdGx5IGludm9rZSBhIG5hbWVkIG9wZXJhdGlvbiB3aXRoIGFuIEluLU91dCBNRVAgd2l0aG91dCB3YWl0aW5nIGZvciBhIHJlc3BvbnNlLiBUaGlzCi0gICAgICogbWV0aG9kIHNlbmRzIHlvdXIgc3VwcGxpZWQgWE1MIHdpdGggcmVzcG9uc2Ugbm90aWZpY2F0aW9uIHRvIHlvdXIgY2FsbGJhY2sgaGFuZGxlci4gRm9yIG1vcmUKLSAgICAgKiBjb250cm9sLCB5b3UgY2FuIGluc3RlYWQgY3JlYXRlIGEgY2xpZW50IGZvciB0aGUgb3BlcmF0aW9uIGFuZCB1c2UgdGhhdCBjbGllbnQgdG8gZXhlY3V0ZSB0aGUKLSAgICAgKiBleGNoYW5nZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvcGVyYXRpb24gbmFtZSBvZiBvcGVyYXRpb24gdG8gYmUgaW52b2tlZCAobm9uLTxjb2RlPm51bGw8L2NvZGU+KQotICAgICAqIEBwYXJhbSBlbGVtICAgICAgdGhlIGRhdGEgdG8gc2VuZCAoYmVjb21lcyB0aGUgY29udGVudCBvZiBTT0FQIGJvZHkpCi0gICAgICogQHBhcmFtIGNhbGxiYWNrICBhIENhbGxiYWNrIHdoaWNoIHdpbGwgYmUgbm90aWZpZWQgdXBvbiBjb21wbGV0aW9uCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQgaW4gY2FzZSBvZiBlcnJvcgotICAgICAqIEBzZWUgI2NyZWF0ZUNsaWVudChRTmFtZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZW5kUmVjZWl2ZU5vbkJsb2NraW5nKFFOYW1lIG9wZXJhdGlvbiwgT01FbGVtZW50IGVsZW0sIEF4aXNDYWxsYmFjayBjYWxsYmFjaykKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBNZXNzYWdlQ29udGV4dCBtYyA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBmaWxsU09BUEVudmVsb3BlKG1jLCBlbGVtKTsKLSAgICAgICAgT3BlcmF0aW9uQ2xpZW50IG1lcENsaWVudCA9IGNyZWF0ZUNsaWVudChvcGVyYXRpb24pOwotICAgICAgICAvLyBoZXJlIGEgYmxvY2tpbmcgaW52b2NhdGlvbiBoYXBwZW5zIGluIGEgbmV3IHRocmVhZCwgc28gdGhlCi0gICAgICAgIC8vIHByb2dhbW1pbmcgbW9kZWwgaXMgbm9uIGJsb2NraW5nCi0gICAgICAgIG1lcENsaWVudC5zZXRDYWxsYmFjayhjYWxsYmFjayk7Ci0gICAgICAgIG1lcENsaWVudC5hZGRNZXNzYWdlQ29udGV4dChtYyk7Ci0gICAgICAgIG1lcENsaWVudC5leGVjdXRlKGZhbHNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gb3BlcmF0aW9uIGNsaWVudCB3aXRoIHRoZSBhcHByb3ByaWF0ZSBtZXNzYWdlIGV4Y2hhbmdlIHBhdHRlcm4gKE1FUCkuIFRoaXMgbWV0aG9kCi0gICAgICogY3JlYXRlcyBhIGZ1bGwtZnVuY3Rpb24gTUVQIGNsaWVudCB3aGljaCBjYW4gYmUgdXNlZCB0byBleGNoYW5nZSBtZXNzYWdlcyBmb3IgYSBzcGVjaWZpYwotICAgICAqIG9wZXJhdGlvbi4gSXQgY29uZmlndXJlcyB0aGUgY29uc3RydWN0ZWQgb3BlcmF0aW9uIGNsaWVudCB0byB1c2UgdGhlIGN1cnJlbnQgbm9ybWFsIGFuZAotICAgICAqIG92ZXJyaWRlIG9wdGlvbnMuIFRoaXMgbWV0aG9kIGlzIHVzZWQgaW50ZXJuYWxseSwgYW5kIGFsc28gYnkgZ2VuZXJhdGVkIGNsaWVudCBzdHViIGNvZGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb3BlcmF0aW9uUU5hbWUgcXVhbGlmaWVkIG5hbWUgb2Ygb3BlcmF0aW9uIChsb2NhbCBuYW1lIGlzIG9wZXJhdGlvbiBuYW1lLCBuYW1lc3BhY2UKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgVVJJIGlzIGp1c3QgdGhlIGVtcHR5IHN0cmluZykKLSAgICAgKiBAcmV0dXJuIGNsaWVudCBjb25maWd1cmVkIHRvIHRhbGsgdG8gdGhlIGdpdmVuIG9wZXJhdGlvbgotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0IGlmIHRoZSBvcGVyYXRpb24gaXMgbm90IGZvdW5kCi0gICAgICovCi0gICAgcHVibGljIE9wZXJhdGlvbkNsaWVudCBjcmVhdGVDbGllbnQoUU5hbWUgb3BlcmF0aW9uUU5hbWUpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICAvLyBJZiB3ZSdyZSBjb25maWd1cmVkIHRvIGRvIHNvLCBjbGVhbiB1cCB0aGUgbGFzdCBPcGVyYXRpb25Db250ZXh0ICh0aHVzCi0gICAgICAgIC8vIHJlbGVhc2luZyBpdHMgcmVzb3VyY2VzKSBlYWNoIHRpbWUgd2UgY3JlYXRlIGEgbmV3IG9uZS4KLSAgICAgICAgaWYgKEphdmFVdGlscy5pc1RydWUoZ2V0T3B0aW9ucygpLmdldFByb3BlcnR5KEFVVE9fT1BFUkFUSU9OX0NMRUFOVVApLCB0cnVlKSAmJgotICAgICAgICAgICAgICAgICFnZXRPcHRpb25zKCkuaXNVc2VTZXBhcmF0ZUxpc3RlbmVyKCkpIHsKLSAgICAgICAgICAgIGNsZWFudXBUcmFuc3BvcnQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEF4aXNPcGVyYXRpb24gYXhpc09wZXJhdGlvbiA9IGF4aXNTZXJ2aWNlLmdldE9wZXJhdGlvbihvcGVyYXRpb25RTmFtZSk7Ci0gICAgICAgIGlmIChheGlzT3BlcmF0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoTWVzc2FnZXMKLSAgICAgICAgICAgICAgICAgICAgLmdldE1lc3NhZ2UoIm9wZXJhdGlvbm5vdGZvdW5kIiwgb3BlcmF0aW9uUU5hbWUuZ2V0TG9jYWxQYXJ0KCkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGFkZCB0aGUgb3B0aW9uIHByb3BlcnRpZXMgdG8gdGhlIHNlcnZpY2UgY29udGV4dAotICAgICAgICBTdHJpbmcga2V5OwotICAgICAgICBmb3IgKE9iamVjdCBvIDogb3B0aW9ucy5nZXRQcm9wZXJ0aWVzKCkua2V5U2V0KCkpIHsKLSAgICAgICAgICAgIGtleSA9IChTdHJpbmcpbzsKLSAgICAgICAgICAgIHNlcnZpY2VDb250ZXh0LnNldFByb3BlcnR5KGtleSwgb3B0aW9ucy5nZXRQcm9wZXJ0aWVzKCkuZ2V0KGtleSkpOwotICAgICAgICB9Ci0gICAgICAgIE9wZXJhdGlvbkNsaWVudCBvcGVyYXRpb25DbGllbnQgPSBheGlzT3BlcmF0aW9uLmNyZWF0ZUNsaWVudChzZXJ2aWNlQ29udGV4dCwgb3B0aW9ucyk7Ci0KLSAgICAgICAgLy8gaWYgb3ZlcmlkZSBvcHRpb25zIGhhdmUgYmVlbiBzZXQsIHRoYXQgbWVhbnMgd2UgbmVlZCB0byBtYWtlIHN1cmUKLSAgICAgICAgLy8gdGhvc2Ugb3B0aW9ucyBvdmVycmlkZSB0aGUgb3B0aW9ucyBvZiBldmVuIHRoZSBvcGVyYXRpb24gY2xpZW50LiBTbywKLSAgICAgICAgLy8gd2hhdCB3ZSBkbyBpcyBzd2l0Y2ggdGhlIHBhcmVudHMgYXJvdW5kIHRvIG1ha2UgdGhhdCB3b3JrLgotICAgICAgICBpZiAob3ZlcnJpZGVPcHRpb25zICE9IG51bGwpIHsKLSAgICAgICAgICAgIG92ZXJyaWRlT3B0aW9ucy5zZXRQYXJlbnQob3BlcmF0aW9uQ2xpZW50LmdldE9wdGlvbnMoKSk7Ci0gICAgICAgICAgICBvcGVyYXRpb25DbGllbnQuc2V0T3B0aW9ucyhvdmVycmlkZU9wdGlvbnMpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBvcGVyYXRpb25DbGllbnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBTT0FQIGZhY3RvcnkgdG8gdXNlIGRlcGVuZGluZyBvbiB3aGF0IG9wdGlvbnMgaGF2ZSBiZWVuIHNldC4gSWYgdGhlIFNPQVAgdmVyc2lvbgotICAgICAqIGNhbiBub3QgYmUgc2VlbiBpbiB0aGUgb3B0aW9ucywgdmVyc2lvbiAxLjEgaXMgdGhlIGRlZmF1bHQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBTT0FQIGZhY3RvcnkKLSAgICAgKiBAc2VlIE9wdGlvbnMjc2V0U29hcFZlcnNpb25VUkkoU3RyaW5nKQotICAgICAqLwotICAgIHByaXZhdGUgU09BUEZhY3RvcnkgZ2V0U09BUEZhY3RvcnkoKSB7Ci0gICAgICAgIFN0cmluZyBzb2FwVmVyc2lvblVSSSA9IG9wdGlvbnMuZ2V0U29hcFZlcnNpb25VUkkoKTsKLSAgICAgICAgaWYgKFNPQVAxMkNvbnN0YW50cy5TT0FQX0VOVkVMT1BFX05BTUVTUEFDRV9VUkkuZXF1YWxzKHNvYXBWZXJzaW9uVVJJKSkgewotICAgICAgICAgICAgcmV0dXJuIE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMkZhY3RvcnkoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIG1ha2UgdGhlIFNPQVAgMS4xIHRoZSBkZWZhdWx0IFNPQVAgdmVyc2lvbgotICAgICAgICAgICAgcmV0dXJuIE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMUZhY3RvcnkoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByZXBhcmUgYSBTT0FQIGVudmVsb3BlIHdpdGggdGhlIHN0dWZmIHRvIGJlIHNlbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVzc2FnZUNvbnRleHQgdGhlIG1lc3NhZ2UgY29udGV4dCB0byBiZSBmaWxsZWQKLSAgICAgKiBAcGFyYW0geG1sUGF5bG9hZCAgICAgdGhlIHBheWxvYWQgY29udGVudAotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0IGlmIHNvbWV0aGluZyBnb2VzIHdyb25nCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGZpbGxTT0FQRW52ZWxvcGUoTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQsIE9NRWxlbWVudCB4bWxQYXlsb2FkKQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIG1lc3NhZ2VDb250ZXh0LnNldFNlcnZpY2VDb250ZXh0KHNlcnZpY2VDb250ZXh0KTsKLSAgICAgICAgU09BUEZhY3Rvcnkgc29hcEZhY3RvcnkgPSBnZXRTT0FQRmFjdG9yeSgpOwotICAgICAgICBTT0FQRW52ZWxvcGUgZW52ZWxvcGUgPSBzb2FwRmFjdG9yeS5nZXREZWZhdWx0RW52ZWxvcGUoKTsKLSAgICAgICAgaWYgKHhtbFBheWxvYWQgIT0gbnVsbCkgewotICAgICAgICAgICAgZW52ZWxvcGUuZ2V0Qm9keSgpLmFkZENoaWxkKHhtbFBheWxvYWQpOwotICAgICAgICB9Ci0gICAgICAgIGFkZEhlYWRlcnNUb0VudmVsb3BlKGVudmVsb3BlKTsKLSAgICAgICAgbWVzc2FnZUNvbnRleHQuc2V0RW52ZWxvcGUoZW52ZWxvcGUpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQWRkIGFsbCBjb25maWd1cmVkIGhlYWRlcnMgdG8gYSBTT0FQIGVudmVsb3BlLgotICAgICAqCi0gICAgICogQHBhcmFtIGVudmVsb3BlIHRoZSBTT0FQRW52ZWxvcGUgaW4gd2hpY2ggdG8gd3JpdGUgdGhlIGhlYWRlcnMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRIZWFkZXJzVG9FbnZlbG9wZShTT0FQRW52ZWxvcGUgZW52ZWxvcGUpIHsKLSAgICAgICAgaWYgKGhlYWRlcnMgIT0gbnVsbCkgewotICAgICAgICAgICAgU09BUEhlYWRlciBzb2FwSGVhZGVyID0gZW52ZWxvcGUuZ2V0SGVhZGVyKCk7Ci0gICAgICAgICAgICBmb3IgKE9iamVjdCBoZWFkZXIgOiBoZWFkZXJzKSB7Ci0gICAgICAgICAgICAgICAgc29hcEhlYWRlci5hZGRDaGlsZCgoT01FbGVtZW50KWhlYWRlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgZW5kcG9pbnQgcmVmZXJlbmNlIGZvciB0aGlzIGNsaWVudCB1c2luZyBhIHBhcnRpY3VsYXIgdHJhbnNwb3J0LgotICAgICAqCi0gICAgICogQHBhcmFtIHRyYW5zcG9ydCB0cmFuc3BvcnQgbmFtZSAobm9uLTxjb2RlPm51bGw8L2NvZGU+KQotICAgICAqIEByZXR1cm4gbG9jYWwgZW5kcG9pbnQKLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdCBpbiBjYXNlIG9mIGVycm9yCi0gICAgICovCi0gICAgcHVibGljIEVuZHBvaW50UmVmZXJlbmNlIGdldE15RVBSKFN0cmluZyB0cmFuc3BvcnQpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICByZXR1cm4gc2VydmljZUNvbnRleHQuZ2V0TXlFUFIodHJhbnNwb3J0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGVuZHBvaW50IHJlZmVyZW5jZSBmb3IgdGhlIHNlcnZpY2UuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHNlcnZpY2UgZW5kcG9pbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgRW5kcG9pbnRSZWZlcmVuY2UgZ2V0VGFyZ2V0RVBSKCkgewotICAgICAgICByZXR1cm4gc2VydmljZUNvbnRleHQuZ2V0VGFyZ2V0RVBSKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBlbmRwb2ludCByZWZlcmVuY2UgZm9yIHRoZSBzZXJ2aWNlLgotICAgICAqCi0gICAgICogQHBhcmFtIHRhcmdldEVwciB0aGUgRVBSIHRoaXMgU2VydmljZUNsaWVudCBzaG91bGQgdGFyZ2V0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VGFyZ2V0RVBSKEVuZHBvaW50UmVmZXJlbmNlIHRhcmdldEVwcikgewotICAgICAgICBzZXJ2aWNlQ29udGV4dC5zZXRUYXJnZXRFUFIodGFyZ2V0RXByKTsKLSAgICAgICAgb3B0aW9ucy5zZXRUbyh0YXJnZXRFcHIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGxhc3QgT3BlcmF0aW9uQ29udGV4dAotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgbGFzdCBPcGVyYXRpb25Db250ZXh0IHRoYXQgd2FzIGludm9rZWQgYnkgdGhpcyBTZXJ2aWNlQ2xpZW50Ci0gICAgICovCi0gICAgcHVibGljIE9wZXJhdGlvbkNvbnRleHQgZ2V0TGFzdE9wZXJhdGlvbkNvbnRleHQoKSB7Ci0gICAgICAgIHJldHVybiBzZXJ2aWNlQ29udGV4dC5nZXRMYXN0T3BlcmF0aW9uQ29udGV4dCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgd2hldGhlciBvciBub3QgdG8gY2FjaGUgdGhlIGxhc3QgT3BlcmF0aW9uQ29udGV4dAotICAgICAqCi0gICAgICogQHBhcmFtIGNhY2hpbmdPcENvbnRleHQgdHJ1ZSBpZiB3ZSBzaG91bGQgaG9sZCBvbnRvIHRoZSBsYXN0IGFjdGl2ZSBPcGVyYXRpb25Db250ZXh0Ci0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDYWNoaW5nT3BlcmF0aW9uQ29udGV4dChib29sZWFuIGNhY2hpbmdPcENvbnRleHQpIHsKLSAgICAgICAgc2VydmljZUNvbnRleHQuc2V0Q2FjaGluZ09wZXJhdGlvbkNvbnRleHQoY2FjaGluZ09wQ29udGV4dCk7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHNlcnZpY2UgY29udGV4dC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gY29udGV4dAotICAgICAqLwotICAgIHB1YmxpYyBTZXJ2aWNlQ29udGV4dCBnZXRTZXJ2aWNlQ29udGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIHNlcnZpY2VDb250ZXh0OwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjbGVhbnVwKCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBzdXBlci5maW5hbGl6ZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2xlYW4gdXAgY29uZmlndXJhdGlvbiBjcmVhdGVkIHdpdGggdGhpcyBjbGllbnQuIENhbGwgdGhpcyBtZXRob2Qgd2hlbiB5b3UncmUgZG9uZSB1c2luZyB0aGUKLSAgICAgKiBjbGllbnQsIGluIG9yZGVyIHRvIGRpc2NhcmQgYW55IGFzc29jaWF0ZWQgcmVzb3VyY2VzLgotICAgICAqCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQgaW4gY2FzZSBvZiBlcnJvcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNsZWFudXAoKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgLy8gaWYgYSBjb25maWd1cmF0aW9uIGNvbnRleHQgd2FzIGNyZWF0ZWQgZm9yIHRoaXMgY2xpZW50IHRoZXJlJ2xsIGFsc28KLSAgICAgICAgLy8gIGJlIGEgc2VydmljZSBncm91cCwgc28gZGlzY2FyZCB0aGF0Ci0gICAgICAgIGlmICghY3JlYXRlQ29uZmlnQ3R4KSB7Ci0gICAgICAgICAgICBTdHJpbmcgc2VydmljZUdyb3VwTmFtZSA9IGF4aXNTZXJ2aWNlLmdldEF4aXNTZXJ2aWNlR3JvdXAoKS5nZXRTZXJ2aWNlR3JvdXBOYW1lKCk7Ci0gICAgICAgICAgICBBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlndXJhdGlvbiA9IGNvbmZpZ0NvbnRleHQuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKTsKLSAgICAgICAgICAgIEF4aXNTZXJ2aWNlR3JvdXAgYXNnID0gYXhpc0NvbmZpZ3VyYXRpb24uZ2V0U2VydmljZUdyb3VwKHNlcnZpY2VHcm91cE5hbWUpOwotICAgICAgICAgICAgaWYgKChhc2cgIT0gbnVsbCkgJiYgcmVtb3ZlQXhpc1NlcnZpY2UpIHsKLSAgICAgICAgICAgICAgICBheGlzQ29uZmlndXJhdGlvbi5yZW1vdmVTZXJ2aWNlR3JvdXAoc2VydmljZUdyb3VwTmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjb25maWdDb250ZXh0LnRlcm1pbmF0ZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2xlYW51cFRyYW5zcG9ydCgpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBmaW5hbCBPcGVyYXRpb25Db250ZXh0IGxhc3RPcGVyYXRpb25Db250ZXh0ID0gZ2V0TGFzdE9wZXJhdGlvbkNvbnRleHQoKTsKLSAgICAgICAgaWYgKGxhc3RPcGVyYXRpb25Db250ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIE1lc3NhZ2VDb250ZXh0IG91dE1lc3NhZ2VDb250ZXh0ID0KLSAgICAgICAgICAgICAgICAgICAgbGFzdE9wZXJhdGlvbkNvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0TWVzc2FnZUNvbnRleHQoV1NETENvbnN0YW50cy5NRVNTQUdFX0xBQkVMX09VVF9WQUxVRSk7Ci0gICAgICAgICAgICBpZiAob3V0TWVzc2FnZUNvbnRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG91dE1lc3NhZ2VDb250ZXh0LmdldFRyYW5zcG9ydE91dCgpLmdldFNlbmRlcigpLmNsZWFudXAob3V0TWVzc2FnZUNvbnRleHQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uZmlndXJlIHRoZSBTZXJ2aWNlQ2xpZW50IHRvIGludGVyYWN0IHdpdGggdGhlIFdlYiBzZXJ2aWNlIGRlc2NyaWJlZCBieSB0aGUgc3BlY2lmaWVkCi0gICAgICogQXhpc1NlcnZpY2Ugb2JqZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIGF4aXNTZXJ2aWNlIHRoZSBBeGlzU2VydmljZSB0aGF0IHJlcHJlc2VudHMgdGhlIG5ldyBXZWIgc2VydmljZS4KLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdCBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgY29uZmlndXJpbmcgdGhlIFNlcnZpY2VDbGllbnQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0QXhpc1NlcnZpY2UoQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UpIHRocm93cyBBeGlzRmF1bHQgewotCi0gICAgICAgIGlmIChheGlzU2VydmljZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBBeGlzRmF1bHQ/Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJBeGlzU2VydmljZSBpcyBudWxsIik7Ci0gICAgICAgIH0KLQotICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMuYXhpc0NvbmZpZykgewotICAgICAgICAgICAgYXhpc0NvbmZpZy5yZW1vdmVTZXJ2aWNlKHRoaXMuYXhpc1NlcnZpY2UuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIHRoaXMuYXhpc1NlcnZpY2UgPSBheGlzU2VydmljZTsKLQotICAgICAgICAgICAgYXhpc1NlcnZpY2Uuc2V0Q2xpZW50U2lkZSh0cnVlKTsKLSAgICAgICAgICAgIGF4aXNDb25maWcuYWRkU2VydmljZShheGlzU2VydmljZSk7Ci0gICAgICAgIH0KLSAgICAgICAgQXhpc1NlcnZpY2VHcm91cCBheGlzU2VydmljZUdyb3VwID0gYXhpc1NlcnZpY2UuZ2V0QXhpc1NlcnZpY2VHcm91cCgpOwotICAgICAgICBTZXJ2aWNlR3JvdXBDb250ZXh0IHNlcnZpY2VHcm91cENvbnRleHQgPQotICAgICAgICAgICAgICAgIGNvbmZpZ0NvbnRleHQuY3JlYXRlU2VydmljZUdyb3VwQ29udGV4dChheGlzU2VydmljZUdyb3VwKTsKLSAgICAgICAgdGhpcy5zZXJ2aWNlQ29udGV4dCA9IHNlcnZpY2VHcm91cENvbnRleHQuZ2V0U2VydmljZUNvbnRleHQoYXhpc1NlcnZpY2UpOwotICAgIH0KLQotICAgIC8qKiBAc2VlIGphdmEubGFuZy5PYmplY3QjaGFzaENvZGUoKSAqLwotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmhhc2hDb2RlOwotICAgIH0KLQotICAgIC8qKiBAc2VlIGphdmEubGFuZy5PYmplY3QjZXF1YWxzKGphdmEubGFuZy5PYmplY3QpICovCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLSAgICAgICAgaWYgKHRoaXMgPT0gb2JqKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChvYmogPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgU2VydmljZUNsaWVudCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGZpbmFsIFNlcnZpY2VDbGllbnQgb3RoZXIgPSAoU2VydmljZUNsaWVudClvYmo7Ci0gICAgICAgIHJldHVybiBoYXNoQ29kZSA9PSBvdGhlci5oYXNoQ29kZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbGllbnQvU3R1Yi5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsaWVudC9TdHViLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmNTJiYzEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsaWVudC9TdHViLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY2xpZW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQXR0cmlidXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01OYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5vZGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVAxMUNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUDEyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQSGVhZGVyQmxvY2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBQcm9jZXNzaW5nRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLk91dEluQXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLk91dE9ubHlBeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUm9idXN0T3V0T25seUF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pMThuLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuSFRUUENvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5IZWFkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotLyoqCi0gKiBCYXNlIGNsYXNzIGZvciBnZW5lcmF0ZWQgY2xpZW50IHN0dWJzLiBUaGlzIGRlZmluZXMgc2V2ZXJhbCBjbGllbnQgQVBJCi0gKiAoPGNvZGU+cHVibGljPC9jb2RlPikgbWV0aG9kcyBzaGFyZWQgYmV0d2VlbiBhbGwgdHlwZXMgb2Ygc3R1YnMsIGFsb25nIHdpdGgKLSAqIHNvbWUgPGNvZGU+cHJvdGVjdGVkPC9jb2RlPiBtZXRob2RzIGludGVuZGVkIGZvciB1c2UgYnkgdGhlIGFjdHVhbCBzdHViCi0gKiBpbXBsZW1lbnRhdGlvbiBjb2RlLiBUaGUgY2xpZW50IEFQSSBtZXRob2QgbmFtZXMgc3RhcnQgd2l0aCBhIGxlYWRpbmcKLSAqIHVuZGVyc2NvcmUgY2hhcmFjdGVyIHRvIGF2b2lkIGNvbmZsaWN0cyB3aXRoIGFjdHVhbCBpbXBsZW1lbnRhdGlvbiBtZXRob2RzLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU3R1YiB7Ci0KLSAgICBwcm90ZWN0ZWQgQXhpc1NlcnZpY2UgX3NlcnZpY2U7Ci0gICAgcHJvdGVjdGVkIEFycmF5TGlzdCBtb2R1bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0KLSAgICBwcm90ZWN0ZWQgU2VydmljZUNsaWVudCBfc2VydmljZUNsaWVudDsKLQotICAgIC8qKgotICAgICAqIEdldCBzZXJ2aWNlIGNsaWVudCBpbXBsZW1lbnRhdGlvbiB1c2VkIGJ5IHRoaXMgc3R1Yi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gc2VydmljZSBjbGllbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgU2VydmljZUNsaWVudCBfZ2V0U2VydmljZUNsaWVudCgpIHsKLSAgICAgICAgcmV0dXJuIF9zZXJ2aWNlQ2xpZW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCBzZXJ2aWNlIGNsaWVudCBpbXBsZW1lbnRhdGlvbiB1c2VkIGJ5IHRoaXMgc3R1Yi4gT25jZSBzZXQsIHRoZQotICAgICAqIHNlcnZpY2UgY2xpZW50IGlzIG93bmVkIGJ5IHRoaXMgc3R1YiBhbmQgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIHJlbW92ZWQKLSAgICAgKiBmcm9tIHRoZSBjb25maWd1cmF0aW9uIHdoZW4gdXNlIG9mIHRoZSBzdHViIGlzIGRvbmUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gX3NlcnZpY2VDbGllbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBfc2V0U2VydmljZUNsaWVudChTZXJ2aWNlQ2xpZW50IF9zZXJ2aWNlQ2xpZW50KSB7Ci0gICAgICAgIHRoaXMuX3NlcnZpY2VDbGllbnQgPSBfc2VydmljZUNsaWVudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBTT0FQIG1lc3NhZ2UgZW52ZWxvcGUgdXNpbmcgdGhlIHN1cHBsaWVkIG9wdGlvbnMuCi0gICAgICogVE9ETyBnZW5lcmF0ZWQgc3R1YiBjb2RlIHNob3VsZCB1c2UgdGhpcyBtZXRob2QsIG9yIHNpbWlsYXIgbWV0aG9kIHRha2luZwotICAgICAqIGFuIG9wZXJhdGlvbiBjbGllbnQKLSAgICAgKgotICAgICAqIEBwYXJhbSBvcHRpb25zCi0gICAgICogQHJldHVybiBnZW5lcmF0ZWQKLSAgICAgKiBAdGhyb3dzIFNPQVBQcm9jZXNzaW5nRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBTT0FQRW52ZWxvcGUgY3JlYXRlRW52ZWxvcGUoT3B0aW9ucyBvcHRpb25zKSB0aHJvd3MgU09BUFByb2Nlc3NpbmdFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZ2V0RmFjdG9yeShvcHRpb25zLmdldFNvYXBWZXJzaW9uVVJJKCkpLmdldERlZmF1bHRFbnZlbG9wZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBBeGlvbSBmYWN0b3J5IGFwcHJvcHJpYXRlIHRvIHNlbGVjdGVkIFNPQVAgdmVyc2lvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzb2FwVmVyc2lvblVSSQotICAgICAqIEByZXR1cm4gZmFjdG9yeQotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgU09BUEZhY3RvcnkgZ2V0RmFjdG9yeShTdHJpbmcgc29hcFZlcnNpb25VUkkpIHsKLQotICAgICAgICBpZiAoU09BUDExQ29uc3RhbnRzLlNPQVBfRU5WRUxPUEVfTkFNRVNQQUNFX1VSSS5lcXVhbHMoc29hcFZlcnNpb25VUkkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDExRmFjdG9yeSgpOwotICAgICAgICB9IGVsc2UgaWYgKFNPQVAxMkNvbnN0YW50cy5TT0FQX0VOVkVMT1BFX05BTUVTUEFDRV9VUkkuZXF1YWxzKHNvYXBWZXJzaW9uVVJJKSkgewotICAgICAgICAgICAgcmV0dXJuIE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMkZhY3RvcnkoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKE1lc3NhZ2VzCi0gICAgICAgICAgICAgICAgICAgIC5nZXRNZXNzYWdlKCJ1bmtub3duc29hcHZlcnNpb24iKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGaW5hbGl6ZSBtZXRob2QgY2FsbGVkIGJ5IGdhcmJhZ2UgY29sbGVjdGlvbi4gVGhpcyBpcyBvdmVycmlkZGVuIHRvCi0gICAgICogc3VwcG9ydCBjbGVhbnVwIG9mIGFueSBhc3NvY2lhdGVkIHJlc291cmNlcy4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgVGhyb3dhYmxlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgc3VwZXIuZmluYWxpemUoKTsKLSAgICAgICAgY2xlYW51cCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENsZWFudXAgYXNzb2NpYXRlZCByZXNvdXJjZXMuIFRoaXMgcmVtb3ZlcyB0aGUgYXhpcyBzZXJ2aWNlIGZyb20gdGhlCi0gICAgICogY29uZmlndXJhdGlvbi4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgY2xlYW51cCgpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICAvLyBzZXJ2aWNlIGlzIHJlbW92ZWQgZnJvbSB0aGUgc2VydmljZSBjbGllbnQgaXQgc2VsZi4KLSAgICAgICAgX3NlcnZpY2VDbGllbnQuY2xlYW51cCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHNldHMgdGhlIGVwciBvZiB0aGUgc2VydmljZSBjbGllbnQgdG8gZ2l2ZW4gdmFsdWUKLSAgICAgKgotICAgICAqIEBwYXJhbSBhZGRyZXNzCi0gICAgICovCi0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRTZXJ2aWNlQ2xpZW50RVBSKFN0cmluZyBhZGRyZXNzKSB7Ci0gICAgICAgIEVuZHBvaW50UmVmZXJlbmNlIHRvRVBSRnJvbVNlcnZpY2VDbGllbnQgPSBfc2VydmljZUNsaWVudC5nZXRPcHRpb25zKCkuZ2V0VG8oKTsKLSAgICAgICAgdG9FUFJGcm9tU2VydmljZUNsaWVudC5zZXRBZGRyZXNzKGFkZHJlc3MpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGFkZCBhbiBodHRwIGhlYWRlciB3aXRoIG5hbWUgYW5kIHZhbHVlIHRvIG1lc3NhZ2UgY29udGV4dAotICAgICAqCi0gICAgICogQHBhcmFtIG1lc3NhZ2VDb250ZXh0Ci0gICAgICogQHBhcmFtIG5hbWUKLSAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRIdHRwSGVhZGVyKE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgamF2YS5sYW5nLk9iamVjdCBoZWFkZXJzT2JqID0gbWVzc2FnZUNvbnRleHQuZ2V0UHJvcGVydHkoSFRUUENvbnN0YW50cy5IVFRQX0hFQURFUlMpOwotICAgICAgICBpZiAoaGVhZGVyc09iaiA9PSBudWxsKSB7Ci0gICAgICAgICAgICBoZWFkZXJzT2JqID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLSAgICAgICAgfQotICAgICAgICBqYXZhLnV0aWwuTGlzdCBoZWFkZXJzID0gKGphdmEudXRpbC5MaXN0KSBoZWFkZXJzT2JqOwotICAgICAgICBIZWFkZXIgaGVhZGVyID0gbmV3IEhlYWRlcigpOwotICAgICAgICBoZWFkZXIuc2V0TmFtZShuYW1lKTsKLSAgICAgICAgaGVhZGVyLnNldFZhbHVlKHZhbHVlKTsKLSAgICAgICAgaGVhZGVycy5hZGQoaGVhZGVyKTsKLSAgICAgICAgbWVzc2FnZUNvbnRleHQuc2V0UHJvcGVydHkoSFRUUENvbnN0YW50cy5IVFRQX0hFQURFUlMsIGhlYWRlcnMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHNldHMgdGhlIHByb3BlcnR5a2V5IGFuZCBwcm9wZXJ0eVZhbHVlIGFzIGEgcGFpciB0byBvcGVyYXRpb24gY2xpZW50Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gb3BlcmF0aW9uQ2xpZW50Ci0gICAgICogQHBhcmFtIHByb3BlcnR5S2V5Ci0gICAgICogQHBhcmFtIHByb3BlcnR5VmFsdWUKLSAgICAgKi8KLQotICAgIHByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5VG9PcGVyYXRpb25DbGllbnQoT3BlcmF0aW9uQ2xpZW50IG9wZXJhdGlvbkNsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwcm9wZXJ0eUtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBwcm9wZXJ0eVZhbHVlKSB7Ci0gICAgICAgIG9wZXJhdGlvbkNsaWVudC5nZXRPcHRpb25zKCkuc2V0UHJvcGVydHkocHJvcGVydHlLZXksIHByb3BlcnR5VmFsdWUpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5VG9PcGVyYXRpb25DbGllbnQoT3BlcmF0aW9uQ2xpZW50IG9wZXJhdGlvbkNsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwcm9wZXJ0eUtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gdmFsdWUpIHsKLSAgICAgICAgYWRkUHJvcGVydHlUb09wZXJhdGlvbkNsaWVudChvcGVyYXRpb25DbGllbnQsIHByb3BlcnR5S2V5LCBuZXcgQm9vbGVhbih2YWx1ZSkpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5VG9PcGVyYXRpb25DbGllbnQoT3BlcmF0aW9uQ2xpZW50IG9wZXJhdGlvbkNsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwcm9wZXJ0eUtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB2YWx1ZSkgewotICAgICAgICBhZGRQcm9wZXJ0eVRvT3BlcmF0aW9uQ2xpZW50KG9wZXJhdGlvbkNsaWVudCwgcHJvcGVydHlLZXksIG5ldyBJbnRlZ2VyKHZhbHVlKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0TXVzdFVuZGVyc3RhbmQoT01FbGVtZW50IGhlYWRlckVsZW1lbnQsIE9NTmFtZXNwYWNlIG9tTmFtZXNwYWNlKSB7Ci0gICAgICAgIE9NRmFjdG9yeSBvbUZhY3RvcnkgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKTsKLSAgICAgICAgT01BdHRyaWJ1dGUgbXVzdFVuZGVyc3RhbmRBdHRyaWJ1dGUgPQotICAgICAgICAgICAgICAgIG9tRmFjdG9yeS5jcmVhdGVPTUF0dHJpYnV0ZShTT0FQMTJDb25zdGFudHMuQVRUUl9NVVNUVU5ERVJTVEFORCwgb21OYW1lc3BhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0cnVlIik7Ci0gICAgICAgIGhlYWRlckVsZW1lbnQuYWRkQXR0cmlidXRlKG11c3RVbmRlcnN0YW5kQXR0cmlidXRlKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRIZWFkZXIoT01FbGVtZW50IG9tRWxlbWVudFRvYWRkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT0FQRW52ZWxvcGUgZW52ZWxvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBtdXN0VW5kZXJzdGFuZCl7Ci0gICAgICAgIFNPQVBIZWFkZXJCbG9jayBzb2FwSGVhZGVyQmxvY2sgPQotICAgICAgICAgICAgICAgIGVudmVsb3AuZ2V0SGVhZGVyKCkuYWRkSGVhZGVyQmxvY2sob21FbGVtZW50VG9hZGQuZ2V0TG9jYWxOYW1lKCksb21FbGVtZW50VG9hZGQuZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICBzb2FwSGVhZGVyQmxvY2suc2V0TXVzdFVuZGVyc3RhbmQobXVzdFVuZGVyc3RhbmQpOwotICAgICAgICBPTU5vZGUgb21Ob2RlID0gbnVsbDsKLQotICAgICAgICAvLyBhZGQgY2hpbGQgZWxlbWVudHMKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gb21FbGVtZW50VG9hZGQuZ2V0Q2hpbGRyZW4oKTsgaXRlci5oYXNOZXh0KCk7KXsKLSAgICAgICAgICAgICBvbU5vZGUgPSAoT01Ob2RlKSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICBzb2FwSGVhZGVyQmxvY2suYWRkQ2hpbGQob21Ob2RlKTsKLSAgICAgICAgfQotCi0gICAgICAgIE9NQXR0cmlidXRlIG9tYXRyaWJ1dGUgPSBudWxsOwotICAgICAgICAvLyBhZGQgYXR0cmlidXRlcwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBvbUVsZW1lbnRUb2FkZC5nZXRBbGxBdHRyaWJ1dGVzKCk7IGl0ZXIuaGFzTmV4dCgpOyl7Ci0gICAgICAgICAgICAgb21hdHJpYnV0ZSA9IChPTUF0dHJpYnV0ZSkgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgc29hcEhlYWRlckJsb2NrLmFkZEF0dHJpYnV0ZShvbWF0cmlidXRlKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkSGVhZGVyKE9NRWxlbWVudCBvbUVsZW1lbnRUb2FkZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09BUEVudmVsb3BlIGVudmVsb3ApewotICAgICAgICBhZGRIZWFkZXIob21FbGVtZW50VG9hZGQsZW52ZWxvcCxmYWxzZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkQW5vbnltb3VzT3BlcmF0aW9ucygpewotICAgICAgICBSb2J1c3RPdXRPbmx5QXhpc09wZXJhdGlvbiByb2J1c3RvdXRvb25seU9wZXJhdGlvbiA9Ci0gICAgICAgICAgICAgICAgbmV3IFJvYnVzdE91dE9ubHlBeGlzT3BlcmF0aW9uKFNlcnZpY2VDbGllbnQuQU5PTl9ST0JVU1RfT1VUX09OTFlfT1ApOwotICAgICAgICBfc2VydmljZS5hZGRPcGVyYXRpb24ocm9idXN0b3V0b29ubHlPcGVyYXRpb24pOwotCi0gICAgICAgIE91dE9ubHlBeGlzT3BlcmF0aW9uIG91dE9ubHlPcGVyYXRpb24gPSBuZXcgT3V0T25seUF4aXNPcGVyYXRpb24oU2VydmljZUNsaWVudC5BTk9OX09VVF9PTkxZX09QKTsKLSAgICAgICAgX3NlcnZpY2UuYWRkT3BlcmF0aW9uKG91dE9ubHlPcGVyYXRpb24pOwotCi0gICAgICAgIE91dEluQXhpc09wZXJhdGlvbiBvdXRJbk9wZXJhdGlvbiA9IG5ldyBPdXRJbkF4aXNPcGVyYXRpb24oU2VydmljZUNsaWVudC5BTk9OX09VVF9JTl9PUCk7Ci0gICAgICAgIF9zZXJ2aWNlLmFkZE9wZXJhdGlvbihvdXRJbk9wZXJhdGlvbik7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY2xpZW50L1dTRExCYXNlZFBvbGljeVByb2Nlc3Nvci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsaWVudC9XU0RMQmFzZWRQb2xpY3lQcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U1YzlkMS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY2xpZW50L1dTRExCYXNlZFBvbGljeVByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jbGllbnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzTW9kdWxlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUG9saWN5SW5jbHVkZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm5lZXRoaS5Bc3NlcnRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5uZWV0aGkuUG9saWN5OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGNsYXNzIFdTRExCYXNlZFBvbGljeVByb2Nlc3NvciB7Ci0gICAgcHJpdmF0ZSBIYXNoTWFwIG5zMm1vZHVsZXMgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgcHVibGljIFdTRExCYXNlZFBvbGljeVByb2Nlc3NvcihDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdjdHgpIHsKLSAgICAgICAgQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZ3VyYXRpb24gPSBjb25maWdjdHguZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGF4aXNDb25maWd1cmF0aW9uLmdldE1vZHVsZXMoKS52YWx1ZXMoKQotICAgICAgICAgICAgICAgIC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBBeGlzTW9kdWxlIGF4aXNNb2R1bGUgPSAoQXhpc01vZHVsZSkgaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgU3RyaW5nW10gbmFtZXNwYWNlcyA9IGF4aXNNb2R1bGUuZ2V0U3VwcG9ydGVkUG9saWN5TmFtZXNwYWNlcygpOwotCi0gICAgICAgICAgICBpZiAobmFtZXNwYWNlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmFtZXNwYWNlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIEFycmF5TGlzdCBtb2R1bGVMaXN0ID0gbnVsbDsKLSAgICAgICAgICAgICAgICBPYmplY3Qgb2JqID0gbnMybW9kdWxlcy5nZXQobmFtZXNwYWNlc1tpXSk7Ci0gICAgICAgICAgICAgICAgaWYgKG9iaiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1vZHVsZUxpc3QgPSBuZXcgQXJyYXlMaXN0KDUpOwotICAgICAgICAgICAgICAgICAgICBuczJtb2R1bGVzLnB1dChuYW1lc3BhY2VzW2ldLCBtb2R1bGVMaXN0KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtb2R1bGVMaXN0ID0gKEFycmF5TGlzdCkgb2JqOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtb2R1bGVMaXN0LmFkZChheGlzTW9kdWxlKTsKLQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjb25maWd1cmVTZXJ2aWNlUG9saWNlcyhBeGlzU2VydmljZSBheGlzU2VydmljZSkKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBJdGVyYXRvciBvcGVyYXRpb25zID0gYXhpc1NlcnZpY2UuZ2V0T3BlcmF0aW9ucygpOwotICAgICAgICB3aGlsZSAob3BlcmF0aW9ucy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIEF4aXNPcGVyYXRpb24gYXhpc09wID0gKEF4aXNPcGVyYXRpb24pIG9wZXJhdGlvbnMubmV4dCgpOwotICAgICAgICAgICAgLy8gVE9ETyB3ZSBzdXBwb3J0IG9ubHkgb3BlcmF0aW9uIGxldmVsIFBvbGljeSBub3cKLSAgICAgICAgICAgIGNvbmZpZ3VyZU9wZXJhdGlvblBvbGljZXMoYXhpc09wKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZU9wZXJhdGlvblBvbGljZXMoQXhpc09wZXJhdGlvbiBvcCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIFBvbGljeUluY2x1ZGUgcG9saWN5SW5jbHVkZSA9IG9wLmdldFBvbGljeUluY2x1ZGUoKTsKLSAgICAgICAgUG9saWN5IHBvbGljeSA9IHBvbGljeUluY2x1ZGUuZ2V0RWZmZWN0aXZlUG9saWN5KCk7Ci0gICAgICAgIGlmIChwb2xpY3kgIT0gbnVsbCkgewotCi0gICAgICAgICAgICBwb2xpY3kgPSAoUG9saWN5KSBwb2xpY3kubm9ybWFsaXplKHBvbGljeUluY2x1ZGUKLSAgICAgICAgICAgICAgICAgICAgLmdldFBvbGljeVJlZ2lzdHJ5KCksIGZhbHNlKTsKLQotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHBvbGljeS5nZXRBbHRlcm5hdGl2ZXMoKTsgaXRlcmF0b3IKLSAgICAgICAgICAgICAgICAgICAgLmhhc05leHQoKTspIHsKLQotICAgICAgICAgICAgICAgIExpc3QgbmFtZXNwYWNlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICBBc3NlcnRpb24gYXNzZXJ0aW9uOwotCi0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgKiBGaXN0IHdlIGNvbXB1dGUgdGhlIHNldCBvZiBkaXN0aW5jdCBuYW1lc3BhY2VzIG9mIGFzc2VydGlvbnMKLSAgICAgICAgICAgICAgICAgKiBvZiB0aGlzIHBhcnRpY3VsYXIgcG9saWN5IGFsdGVybmF0aXZlLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgYXNzZXJ0aW9ucyA9ICgoTGlzdCkgaXRlcmF0b3IubmV4dCgpKS5pdGVyYXRvcigpOyBhc3NlcnRpb25zCi0gICAgICAgICAgICAgICAgICAgICAgICAuaGFzTmV4dCgpOykgewotCi0gICAgICAgICAgICAgICAgICAgIGFzc2VydGlvbiA9IChBc3NlcnRpb24pIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgUU5hbWUgbmFtZSA9IGFzc2VydGlvbi5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lc3BhY2VVUkkgPSBuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICghbmFtZXNwYWNlTGlzdC5jb250YWlucyhuYW1lc3BhY2VVUkkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VMaXN0LmFkZChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgKiBOb3cgd2UgY29tcHV0ZSBhbGwgdGhlIG1vZHVsZXMgdGhhdCBhcmUgYXJlIGludm9sdmVkIGluCi0gICAgICAgICAgICAgICAgICogcHJvY2VzcyBhc3NlcnRpb25zIHRoYXQgYmVsb25ncyB0byBhbnkgb2YgdGhlIG5hbWVzcGFjZXMgb2YKLSAgICAgICAgICAgICAgICAgKiBsaXN0LgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIExpc3QgbW9kdWxlc1RvRW5nYWdlOwotCi0gICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBuYW1lc3BhY2VzID0gbmFtZXNwYWNlTGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvcgotICAgICAgICAgICAgICAgICAgICAgICAgLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9IChTdHJpbmcpIG5hbWVzcGFjZXMubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBtb2R1bGVzVG9FbmdhZ2UgPSAoTGlzdCkgbnMybW9kdWxlcy5nZXQobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAobW9kdWxlc1RvRW5nYWdlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiBJZiB0aGVyZSBpc24ndCBhIHNpbmdsZSBtb2R1bGUgdGhhdCBpcyBub3QgaW50ZXJlc3RlZAotICAgICAgICAgICAgICAgICAgICAgICAgICogb2YgYXNzZXJ0aW9ucyB0aGF0IGJlbG9uZ3MgdG8gYSBwYXJ0aWN1bGFyIG5hbWVzcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIHdlIHNpbXBseSBpZ25vcmUgaXQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnByaW50bG4oImNhbm5vdCBmaW5kIGFueSBtb2R1bGVzIHRvIHByb2Nlc3MgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbmFtZXNwYWNlICsgInR5cGUgYXNzZXJ0aW9ucyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogTG9nIHRoaXMgLi4KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbmdhZ2VNb2R1bGVzVG9BeGlzRGVzY3JpcHRpb24obW9kdWxlc1RvRW5nYWdlLCBvcCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICogV2Ugb25seSBwaWNrIHRoZSBmaXJzdCBwb2xpY3kgYWx0ZXJuYXRpdmUuIE90aGVyIHBvbGljeQotICAgICAgICAgICAgICAgICogYWx0ZXJuYXRpdmVzIGFyZSBpZ25vcmVkLgotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFbmdhZ2VzIHRoZSBsaXN0IG9mIE1vZHVsZXMgdG8gdGhlIHNwZWNpZmllZCBBeGlzRGVzY3JpcHRpb24uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGVuZ2FnZU1vZHVsZXNUb0F4aXNEZXNjcmlwdGlvbihMaXN0IG1vZHVsZXNUb0VuZ2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF4aXNEZXNjcmlwdGlvbiBheGlzRGVzY3JpcHRpb24pIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBBeGlzTW9kdWxlIGF4aXNNb2R1bGU7Ci0gICAgICAgIFN0cmluZyBtb2R1bGVOYW1lOwotCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBtb2R1bGVzVG9FbmdhZ2UuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgYXhpc01vZHVsZSA9IChBeGlzTW9kdWxlKSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICBtb2R1bGVOYW1lID0gYXhpc01vZHVsZS5nZXROYW1lKCk7Ci0KLSAgICAgICAgICAgIGlmICghYXhpc0Rlc2NyaXB0aW9uLmlzRW5nYWdlZChtb2R1bGVOYW1lKSkgewotICAgICAgICAgICAgICAgIGF4aXNEZXNjcmlwdGlvbi5lbmdhZ2VNb2R1bGUoYXhpc01vZHVsZSk7Ci0gICAgICAgICAgICAgICAgKGF4aXNNb2R1bGUuZ2V0TW9kdWxlKCkpLmVuZ2FnZU5vdGlmeShheGlzRGVzY3JpcHRpb24pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsaWVudC9hc3luYy9Bc3luY1Jlc3VsdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsaWVudC9hc3luYy9Bc3luY1Jlc3VsdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTlhNzJjLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbGllbnQvYXN5bmMvQXN5bmNSZXN1bHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5hc3luYzsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaG9sZHMgdGhlIHJlc3VsdHMgb2YgYW4gYXN5bmNocm9ub3VzIGludm9jYXRpb24uIFRoZSBBeGlzMgotICogZW5naW5lIHJldHVybnMgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB2aWEgdGhlIHtAbGluawotICogQ2FsbGJhY2sjb25Db21wbGV0ZShBc3luY1Jlc3VsdCl9IG1ldGhvZCB3aGVuIHRoZSBvcGVyYXRpb24gY29tcGxldGVzCi0gKiBzdWNjZXNzZnVsbHkuCi0gKgotICogQGRlcHJlY2F0ZWQgcGxlYXNlIHNlZSBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5hc3luYy5BeGlzQ2FsbGJhY2suCi0gKi8KLXB1YmxpYyBjbGFzcyBBc3luY1Jlc3VsdCB7Ci0KLSAgICAvKioKLSAgICAgKiBNZXNzYWdlIGNvbnRleHQgdGhhdCBzdXBwbGllcyB0aGUgcmVzdWx0IGluZm9ybWF0aW9uLgotICAgICAqLwotICAgIHByaXZhdGUgTWVzc2FnZUNvbnRleHQgcmVzdWx0OwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVzdWx0IG1lc3NhZ2UgY29udGV4dCBwcm92aWRpbmcgcmVzdWx0IGluZm9ybWF0aW9uCi0gICAgICogICAgICAgICAgICAgICAoPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gcmVzcG9uc2UpCi0gICAgICovCi0gICAgcHVibGljIEFzeW5jUmVzdWx0KE1lc3NhZ2VDb250ZXh0IHJlc3VsdCkgewotICAgICAgICB0aGlzLnJlc3VsdCA9IHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIFNPQVAgRW52ZWxvcGUgZm9yIHRoZSByZXNwb25zZSBtZXNzYWdlLgotICAgICAqCi0gICAgICogQHJldHVybiBFbnZlbG9wZSAoPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgU09BUEVudmVsb3BlIGdldFJlc3BvbnNlRW52ZWxvcGUoKSB7Ci0gICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5nZXRFbnZlbG9wZSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGNvbXBsZXRlIG1lc3NhZ2UgY29udGV4dCBmb3IgdGhlIHJlc3BvbnNlLgotICAgICAqCi0gICAgICogQHJldHVybiBjb250ZXh0ICg8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lKQotICAgICAqLwotICAgIHB1YmxpYyBNZXNzYWdlQ29udGV4dCBnZXRSZXNwb25zZU1lc3NhZ2VDb250ZXh0KCkgewotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbGllbnQvYXN5bmMvQXhpc0NhbGxiYWNrLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY2xpZW50L2FzeW5jL0F4aXNDYWxsYmFjay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTY0NWQ0Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbGllbnQvYXN5bmMvQXhpc0NhbGxiYWNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY2xpZW50LmFzeW5jOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotCi1wdWJsaWMgaW50ZXJmYWNlIEF4aXNDYWxsYmFjayB7Ci0gICAgLyoqCi0gICAgICogVGhpcyBpcyBjYWxsZWQgd2hlbiB3ZSByZWNlaXZlIGEgbWVzc2FnZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtc2dDb250ZXh0IHRoZSAocmVzcG9uc2UpIE1lc3NhZ2VDb250ZXh0Ci0gICAgICovCi0gICAgdm9pZCBvbk1lc3NhZ2UoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCk7Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIGdldHMgY2FsbGVkIHdoZW4gYSBmYXVsdCBtZXNzYWdlIGlzIHJlY2VpdmVkLgotICAgICAqCi0gICAgICogQHBhcmFtIG1zZ0NvbnRleHQgdGhlIE1lc3NhZ2VDb250ZXh0IGNvbnRhaW5pbmcgdGhlIGZhdWx0LgotICAgICAqLwotICAgIHZvaWQgb25GYXVsdChNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KTsKLQotICAgIC8qKgotICAgICAqIFRoaXMgZ2V0cyBjYWxsZWQgT05MWSB3aGVuIGFuIGludGVybmFsIHByb2Nlc3NpbmcgZXhjZXB0aW9uIG9jY3Vycy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBlIHRoZSBFeGNlcHRpb24gd2hpY2ggY2F1c2VkIHRoZSBwcm9ibGVtCi0gICAgICovCi0gICAgdm9pZCBvbkVycm9yKEV4Y2VwdGlvbiBlKTsKLQotICAgIC8qKgotICAgICAqIFRoaXMgaXMgY2FsbGVkIGF0IHRoZSBlbmQgb2YgdGhlIE1FUCBubyBtYXR0ZXIgd2hhdCBoYXBwZW5zLCBxdWl0ZSBsaWtlIGEgZmluYWxseSBibG9jay4KLSAgICAgKi8KLSAgICB2b2lkIG9uQ29tcGxldGUoKTsKLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbGllbnQvYXN5bmMvQ2FsbGJhY2suamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbGllbnQvYXN5bmMvQ2FsbGJhY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE3ZGRmYS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY2xpZW50L2FzeW5jL0NhbGxiYWNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY2xpZW50LmFzeW5jOwotCi0vKioKLSAqIEJhc2UgY2xhc3MgZm9yIGFzeW5jaHJvbm91cyBjbGllbnQgY2FsbGJhY2sgaGFuZGxlci4gVGhlIGFwcGxpY2F0aW9uIGNvZGUKLSAqIG5lZWRzIHRvIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIChhY3R1YWxseSBhbiBpbnN0YW5jZSBvZiBhCi0gKiBzdWJjbGFzcywgc2luY2UgdGhpcyBiYXNlIGNsYXNzIGNhbm5vdCBiZSB1c2VkIGRpcmVjdGx5KSBhbmQgcGFzcyBpdCB0byB0aGUKLSAqIGdlbmVyYXRlZCBzdGFydFhYWCBjbGllbnQgc3R1YiBtZXRob2Qgd2hlbiBpbml0aWF0aW5nIGFuIGFzeW5jaHJvbm91cwotICogb3BlcmF0aW9uLiBUaGUgQXhpczIgY29kZSB0aGVuIGNhbGxzIHRoZSBhcHByb3ByaWF0ZSBtZXRob2RzIG9mIHRoaXMgY2xhc3MKLSAqIHtAbGluayAjc2V0Q29tcGxldGUoYm9vbGVhbil9LCBhbmQgZWl0aGVyIHtAbGluayAjb25Db21wbGV0ZShBc3luY1Jlc3VsdCl9Ci0gKiBvciB7QGxpbmsgI29uRXJyb3IoRXhjZXB0aW9uKX0gd2hlbiB0aGUgb3BlcmF0aW9uIGlzIGNvbXBsZXRlZC4KLSAqCi0gKiBAZGVwcmVjYXRlZCBQbGVhc2UgdXNlIEF4aXNDYWxsYmFjayBpbnN0ZWFkLCB0aGlzIGNsYXNzIGlzIGRlcHJlY2F0ZWQgYXMgb2YgMS4zCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDYWxsYmFjayB7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBjb21wbGV0ZQotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBjb21wbGV0ZTsKLQotICAgIC8qKgotICAgICAqIE1ldGhvZCBpcyBpbnZva2VkIGJ5IEF4aXMyIG9uY2UgdGhlIGFzeW5jaHJvbm91cyBvcGVyYXRpb24gaGFzIGNvbXBsZXRlZAotICAgICAqIHN1Y2Nlc3NmdWxseS4KLSAgICAgKgotICAgICAqIEBwYXJhbSByZXN1bHQKLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBvbkNvbXBsZXRlKEFzeW5jUmVzdWx0IHJlc3VsdCk7Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgaW52b2tlZCBieSBBeGlzMiBpZiB0aGUgYXN5bmNocm9ub3VzIG9wZXJhdGlvbiBmYWlscy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBlCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IHZvaWQgb25FcnJvcihFeGNlcHRpb24gZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGFzeW5jaHJvbm91cyBvcGVyYXRpb24gaGFzIGNvbXBsZXRlZCwgZmFsc2Ugb3RoZXJ3aXNlLiBUeXBpY2FsbHkgdGhpcyBpcwotICAgICAqIHVzZWQgZm9yIHBvbGxpbmcuIGUuZy4KLSAgICAgKiA8Y29kZT4KLSAgICAgKiA8cHJlPgotICAgICAqICAgICAgICAgIHdoaWxlKCFjYWxsYmFjay5pc0NvbXBsZXRlKCkpewotICAgICAqICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsKLSAgICAgKiAgICAgICAgICB9Ci0gICAgICogICAgICAgICAgZG8gd2hhdGV2ZXIgdSBuZWVkIHRvIGRvCi0gICAgICogICAgICA8L3ByZT4KLSAgICAgKiA8L2NvZGU+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIGJvb2xlYW4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaXNDb21wbGV0ZSgpIHsKLSAgICAgICAgcmV0dXJuIGNvbXBsZXRlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ldGhvZCBpbnZva2VkIGJ5IEF4aXMyIHRvIHNldCB0aGUgY29tcGxldGlvbiBzdGF0ZSBvZiB0aGUgb3BlcmF0aW9uLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbXBsZXRlCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHN5bmNocm9uaXplZCB2b2lkIHNldENvbXBsZXRlKGJvb2xlYW4gY29tcGxldGUpIHsKLSAgICAgICAgdGhpcy5jb21wbGV0ZSA9IGNvbXBsZXRlOwotICAgICAgICBub3RpZnkoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9DbHVzdGVyTWFuYWdlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvQ2x1c3Rlck1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg2Njc5ZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9DbHVzdGVyTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLmNvbnRleHQuQ29udGV4dE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVySW5jbHVkZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogPHA+Ci0gKiBUaGlzIGlzIHRoZSBtYWluIGludGVyZmFjZSBpbiB0aGUgQXhpczIgY2x1c3RlcmluZyBpbXBsZW1lbnRhdGlvbi4KLSAqIEluIG9yZGVyIHRvIHBsdWctaW4gYSBuZXcgY2x1c3RlcmluZyBpbXBsZW1lbnRhdGlvbiwgdGhpcyBpbnRlcmZhY2UgaGFzIHRvIGJlCi0gKiBpbXBsZW1lbnRlZC4KLSAqIDwvcD4KLSAqIDxwPgotICogVGhlIGluaXRpbGl6YXRpb24gb2YgYSBub2RlIGluIHRoZSBjbHVzdGVyIGlzIGhhbmRsZWQgaGVyZS4gSXQgaXMgYWxzbyByZXNwb25zaWJsZSBmb3IgZ2V0dGluZwotICogdGhpcyBub2RlIHRvIGpvaW4gdGhlIGNsdXN0ZXIuIFRoaXMgbm9kZSBzaG91bGQgbm90IHByb2Nlc3MgYW55IFdlYiBzZXJ2aWNlcyByZXF1ZXN0cyB1bnRpbCBpdAotICogc3VjY2Vzc2Z1bGx5IGpvaW5zIHRoZSBjbHVzdGVyLiBHZW5lcmFsbHksIHRoaXMgbm9kZSB3aWxsIGFsc28gbmVlZCB0byBvYnRhaW4gdGhlIHN0YXRlCi0gKiBpbmZvcm1hdGlvbiBhbmQvb3IgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmcm9tIGEgbmVpZ2hib3Jpbmcgbm9kZS4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIGFsc28gcmVzcG9uc2libGUgZm9yCi0gKiBwcm9wZXJseSBpbnN0YW50aWF0aW5nIGEge0BsaW5rIENvbnRleHRNYW5hZ2VyfSAmIHtAbGluayBDb25maWd1cmF0aW9uTWFuYWdlcn0uIEluIHRoZSBjYXNlIG9mCi0gKiBhIHN0YXRpYyA8YSBocmVmPSJodHRwOi8vYWZraGFtLm9yZy8yMDA4LzA1L2dyb3VwLW1lbWJlcnNoaXAtbWFuYWdlbWVudC1zY2hlbWVzLmh0bWwiPgotICogbWVtYmVyc2hpcCBzY2hlbWU8L2E+LAotICogdGhpcyBtZW1iZXJzIGFyZSByZWFkIGZyb20gdGhlIGF4aXMyLnhtbCBmaWxlIGFuZCBhZGRlZCB0byB0aGUgQ2x1c3Rlck1hbmFnZXIuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIEluIHRoZSBheGlzMi54bWwsIHRoZSBpbnN0YW5jZSBvZiB0aGlzIGludGVyZmFjZSBpcyBzcGVjaWZpZWQgdXNpbmcgdGhlICJjbHVzdGVyIiBjbGFzcyBhdHRyaWJ1dGUuCi0gKiBlLmcuCi0gKiA8Y29kZT48Yj4KLSAqIDxub2JyPiZsdDtjbHVzdGVyIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXIudHJpYmVzLlRyaWJlc0NsdXN0ZXJNYW5hZ2VyIiZndDs8L25vYnI+Ci0gKiA8L2I+Ci0gKiA8L2NvZGU+Ci0gKiBzcGVjaWZpZXMgdGhhdCB0aGUgVHJpYmVzQ2x1c3Rlck1hbmFnZXIgY2xhc3MgaXMgdGhlIGluc3RhbmNlIG9mIHRoaXMgaW50ZXJmYWNlIHRoYXQKLSAqIG5lZWRzIHRvIGJlIHVzZWQuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFRoZXJlIGNhbiBhbHNvIGJlIHNldmVyYWwgInBhcmFtZXRlciIgZWxlbWVudHMsIHdoaWNoIGFyZSBjaGlsZHJlbiBvZiB0aGUgImNsdXN0ZXIiIGVsZW1lbnQKLSAqIGluIHRoZSBheGlzMi54bWwgZmlsZS4gR2VuZXJhbGx5LCB0aGVzZSBwYXJhbWV0ZXJzIHdpbGwgYmUgc3BlY2lmaWMgdG8gdGhlIENsdXN0ZXJNYW5hZ2VyCi0gKiBpbXBsZW1lbnRhdGlvbi4KLSAqIDwvcD4KLSAqLwotcHVibGljIGludGVyZmFjZSBDbHVzdGVyTWFuYWdlciBleHRlbmRzIFBhcmFtZXRlckluY2x1ZGUgewotCi0gICAgLyoqCi0gICAgICogSW5pdGlhbGl6ZSB0aGlzIG5vZGUsIGFuZCBqb2luIHRoZSBjbHVzdGVyCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIENsdXN0ZXJpbmdGYXVsdCBJZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgaW5pdGlhbGl6aW5nIHRoaXMgbm9kZSBvciBqb2luaW5nIHRoZSBjbHVzdGVyCi0gICAgICovCi0gICAgdm9pZCBpbml0KCkgdGhyb3dzIENsdXN0ZXJpbmdGYXVsdDsKLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gVGhlIENvbnRleHRNYW5hZ2VyCi0gICAgICovCi0gICAgQ29udGV4dE1hbmFnZXIgZ2V0Q29udGV4dE1hbmFnZXIoKTsKLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gVGhlIENvbmZpZ3VyYXRpb25NYW5hZ2VyCi0gICAgICovCi0gICAgQ29uZmlndXJhdGlvbk1hbmFnZXIgZ2V0Q29uZmlndXJhdGlvbk1hbmFnZXIoKTsKLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgQ29udGV4dE1hbmFnZXIgY29ycmVzcG9uZGluZyB0byB0aGlzIENsdXN0ZXJNYW5hZ2VyLiBUaGlzIGlzIGFuIG9wdGlvbmFsIGF0dHJpYnV0ZS4KLSAgICAgKiBXZSBjYW4gaGF2ZSBhIGNsdXN0ZXIgd2l0aCBubyBjb250ZXh0IHJlcGxpY2F0aW9uLCBpbiB3aGljaCBjYXNlIHRoZSBjb250ZXh0TWFuYWdlciB3aWxsIGJlCi0gICAgICogbnVsbC4gVGhpcyB2YWx1ZSBpcyBzZXQgYnkgdGhlIHtAbGluayBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQuQ2x1c3RlckJ1aWxkZXJ9LCBieQotICAgICAqIHJlYWRpbmcgdGhlICAiY29udGV4dE1hbmFnZXIiIGVsZW1lbnQgaW4gdGhlIGF4aXMyLnhtbAotICAgICAqIDxwLz4KLSAgICAgKiBlLmcuCi0gICAgICogPGNvZGU+Ci0gICAgICogPGI+Ci0gICAgICogPGNvbnRleHRNYW5hZ2VyIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXIuY29uZmlndXJhdGlvbi5UcmliZXNDb250ZXh0TWFuYWdlciI+Ci0gICAgICogPC9iPgotICAgICAqIDwvY29kZT4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb250ZXh0TWFuYWdlciBUaGUgQ29udGV4dE1hbmFnZXIgaW5zdGFuY2UKLSAgICAgKi8KLSAgICB2b2lkIHNldENvbnRleHRNYW5hZ2VyKENvbnRleHRNYW5hZ2VyIGNvbnRleHRNYW5hZ2VyKTsKLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgQ29uZmlndXJhdGlvbk1hbmFnZXIgY29ycmVzcG9uZGluZyB0byB0aGlzIENsdXN0ZXJNYW5hZ2VyLiBUaGlzIGlzIGFuIG9wdGlvbmFsIGF0dHJpYnV0ZS4KLSAgICAgKiBXZSBjYW4gaGF2ZSBhIGNsdXN0ZXIgd2l0aCBubyBjb25maWd1cmF0aW9uIG1hbmFnZW1lbnQsIGluIHdoaWNoIGNhc2UgdGhlIGNvbmZpZ3VyYXRpb25NYW5hZ2VyCi0gICAgICogd2lsbCBiZSBudWxsLiBUaGlzIHZhbHVlIGlzIHNldCBieSB0aGUge0BsaW5rIG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC5DbHVzdGVyQnVpbGRlcn0sIGJ5Ci0gICAgICogcmVhZGluZyB0aGUgICJjb25maWd1cmF0aW9uTWFuYWdlciIgZWxlbWVudCBpbiB0aGUgYXhpczIueG1sCi0gICAgICogPHAvPgotICAgICAqIGUuZy4KLSAgICAgKiA8Y29kZT4KLSAgICAgKiA8Yj4KLSAgICAgKiA8Y29uZmlndXJhdGlvbk1hbmFnZXIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuY2x1c3Rlci5jb25maWd1cmF0aW9uLlRyaWJlc0NvbmZpZ3VyYXRpb25NYW5hZ2VyIj4KLSAgICAgKiA8L2I+Ci0gICAgICogPC9jb2RlPgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbmZpZ3VyYXRpb25NYW5hZ2VyIFRoZSBDb25maWd1cmF0aW9uTWFuYWdlciBpbnN0YW5jZQotICAgICAqLwotICAgIHZvaWQgc2V0Q29uZmlndXJhdGlvbk1hbmFnZXIoQ29uZmlndXJhdGlvbk1hbmFnZXIgY29uZmlndXJhdGlvbk1hbmFnZXIpOwotCi0gICAgLyoqCi0gICAgICogRGlzY29ubmVjdCB0aGlzIG5vZGUgZnJvbSB0aGUgY2x1c3Rlci4gVGhpcyBub2RlIHdpbGwgbm8gbG9uZ2VyIHJlY2VpdmUgbWVtYmVyc2hpcCBjaGFuZ2UKLSAgICAgKiBub3RpZmljYXRpb25zLCBzdGF0ZSBjaGFuZ2UgbWVzc2FnZXMgb3IgY29uZmlndXJhdGlvbiBjaGFuZ2UgbWVzc2FnZXMuIFRoZSBub2RlIHdpbGwgYmUgIgotICAgICAqICJzdGFuZGluZyBhbG9uZSIgb25jZSBpdCBpcyBzaHV0ZG93bi4gSG93ZXZlciwgaXQgaGFzIHRvIGNvbnRpbnVlIHRvIHByb2Nlc3MgV2ViIHNlcnZpY2UKLSAgICAgKiByZXF1ZXN0cy4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgQ2x1c3RlcmluZ0ZhdWx0IElmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBsZWF2aW5nIHRoZSBjbHVzdGVyCi0gICAgICovCi0gICAgdm9pZCBzaHV0ZG93bigpIHRocm93cyBDbHVzdGVyaW5nRmF1bHQ7Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIHN5c3RlbSdzIGNvbmZpZ3VyYXRpb24gY29udGV4dC4gVGhpcyB3aWxsIGJlIHVzZWQgYnkgdGhlIGNsdXN0ZXJpbmcgaW1wbGVtZW50YXRpb25zCi0gICAgICogdG8gZ2V0IGluZm9ybWF0aW9uIGFib3V0IHRoZSBBeGlzMiBlbnZpcm9ubWVudCBhbmQgdG8gY29ycmVzcG9uZCB3aXRoIHRoZSBBeGlzMiBlbnZpcm9ubWVudAotICAgICAqCi0gICAgICogQHBhcmFtIGNvbmZpZ3VyYXRpb25Db250ZXh0IFRoZSBjb25maWd1cmF0aW9uIGNvbnRleHQKLSAgICAgKi8KLSAgICB2b2lkIHNldENvbmZpZ3VyYXRpb25Db250ZXh0KENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ3VyYXRpb25Db250ZXh0KTsKLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgc3RhdGljIG1lbWJlcnMgb2YgdGhlIGNsdXN0ZXIuIFRoaXMgaXMgdXNlZCBvbmx5IHdpdGgKLSAgICAgKiA8YSBocmVmPSJodHRwOi8vYWZraGFtLm9yZy8yMDA4LzA1L2dyb3VwLW1lbWJlcnNoaXAtbWFuYWdlbWVudC1zY2hlbWVzLmh0bWwiPgotICAgICAqIHN0YXRpYyBncm91cCBtZW1iZXJzaGlwIDwvYT4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtZW1iZXJzIE1lbWJlcnMgdG8gYmUgYWRkZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldE1lbWJlcnMoTGlzdDxNZW1iZXI+IG1lbWJlcnMpOwotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBsaXN0IG9mIG1lbWJlcnMgaW4gYQotICAgICAqIDxhIGhyZWY9Imh0dHA6Ly9hZmtoYW0ub3JnLzIwMDgvMDUvZ3JvdXAtbWVtYmVyc2hpcC1tYW5hZ2VtZW50LXNjaGVtZXMuaHRtbCI+Ci0gICAgICogc3RhdGljIGdyb3VwCi0gICAgICogPC9hPgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgbWVtYmVycyBpZiBzdGF0aWMgZ3JvdXAgbWVtYmVyc2hpcCBpcyB1c2VkLiBJZiBhbnkgb3RoZXIgbWVtYmVyc2hpcCBzY2hlbWUgaXMgdXNlZCwKLSAgICAgKiAgICAgICAgIHRoZSB2YWx1ZXMgcmV0dXJuZWQgbWF5IG5vdCBiZSB2YWxpZAotICAgICAqLwotICAgIExpc3Q8TWVtYmVyPiBnZXRNZW1iZXJzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGxvYWQgYmFsYW5jZSBldmVudCBoYW5kbGVyIHdoaWNoIHdpbGwgYmUgbm90aWZpZWQgd2hlbiBsb2FkIGJhbGFuY2UgZXZlbnRzIG9jY3VyLgotICAgICAqIFRoaXMgd2lsbCBiZSB2YWxpZCBvbmx5IHdoZW4gdGhpcyBub2RlIGlzIHJ1bm5pbmcgaW4gbG9hZEJhbGFuY2UgbW9kZQotICAgICAqCi0gICAgICogQHBhcmFtIGV2ZW50SGFuZGxlciAgICAgIFRoZSBsb2FkIGJhbGFuY2UgZXZlbnQgaGFuZGxlcgotICAgICAqIEBwYXJhbSBhcHBsaWNhdGlvbkRvbWFpbiBUaGUgYXBwbGljYXRpb24gZG9tYWluIHdoaWNoIGlzIGhhbmRsZWQgYnkgdGhlIGV2ZW50SGFuZGxlcgotICAgICAqLwotICAgIHZvaWQgYWRkTG9hZEJhbGFuY2VFdmVudEhhbmRsZXIoTG9hZEJhbGFuY2VFdmVudEhhbmRsZXIgZXZlbnRIYW5kbGVyLCBTdHJpbmcgYXBwbGljYXRpb25Eb21haW4pOwotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBMb2FkQmFsYW5jZUV2ZW50SGFuZGxlciB3aGljaCBjb3JyZXNwb25kcyB0byB0aGUgPGNvZGU+YXBwbGljYXRpb25Eb21haW48L2NvZGU+Ci0gICAgICogVGhpcyB3aWxsIGJlIHZhbGlkIG9ubHkgd2hlbiB0aGlzIG5vZGUgaXMgcnVubmluZyBpbiBsb2FkQmFsYW5jZSBtb2RlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYXBwbGljYXRpb25Eb21haW4gVGhlIGFwcGxpY2F0aW9uIGRvbWFpbiB0byB3aGljaCB0aGUgYXBwbGljYXRpb24gbm9kZXMgYmVpbmcKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZCBiYWxhbmNlZCBiZWxvbmcgdG8KLSAgICAgKiBAcmV0dXJuIExvYWRCYWxhbmNlRXZlbnRIYW5kbGVyIHdoaWNoIGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT5hcHBsaWNhdGlvbkRvbWFpbjwvY29kZT4KLSAgICAgKi8KLSAgICBMb2FkQmFsYW5jZUV2ZW50SGFuZGxlciBnZXRMb2FkQmFsYW5jZUV2ZW50SGFuZGxlcihTdHJpbmcgYXBwbGljYXRpb25Eb21haW4pOwotCi0KLSAgICAvKioKLSAgICAgKiBHZXQgYWxsIHRoZSBkb21haW5zIHRoYXQgdGhpcyBDbHVzdGVyTWFuYWdlciBiZWxvbmdzIHRvCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBkb21haW5zIG9mIHRoaXMgQ2x1c3Rlck1hbmFnZXIKLSAgICAgKi8KLSAgICBTZXQ8U3RyaW5nPiBnZXREb21haW5zKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvQ2x1c3RlcmluZ0NvbW1hbmQuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL0NsdXN0ZXJpbmdDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjOGE1ZTAuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvQ2x1c3RlcmluZ0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDbHVzdGVyaW5nQ29tbWFuZCBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL0NsdXN0ZXJpbmdDb25zdGFudHMuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL0NsdXN0ZXJpbmdDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJlMWI2NS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9DbHVzdGVyaW5nQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZzsKLQotLyoqCi0gKiBBbGwgY29uc3RhbnRzIHVzZWQgYnkgdGhlIEF4aXMyIGNsdXN0ZXJpbmcgaW1wbGVtZW50YXRpb24KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIENsdXN0ZXJpbmdDb25zdGFudHMgewotCi0gICAgcHJpdmF0ZSBDbHVzdGVyaW5nQ29uc3RhbnRzKCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IGRvbWFpbiB0byB3aGljaCB0aGlzIG1lbWJlciBiZWxvbmdzIHRvLiBUaGlzIG5vZGUgbWF5IGJlIHJ1bm5pbmcgaW4gYXBwbGljYXRpb24KLSAgICAgKiBvciBsb2FkQmFsYW5jZSBtb2RlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9ET01BSU4gPSAiYXBhY2hlLmF4aXMyLmRvbWFpbiI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT0RFX01BTkFHRVJfU0VSVklDRSA9ICJBeGlzMk5vZGVNYW5hZ2VyIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVFVRVNUX0JMT0NLSU5HX0hBTkRMRVIgPSAiUmVxdWVzdEJsb2NraW5nSGFuZGxlciI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xVU1RFUl9JTklUSUFMSVpFRCA9ICJsb2NhbF9jbHVzdGVyLmluaXRpYWxpemVkIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUNEX0NPTkZJR19JTklUX01TRyA9ICJsb2NhbF9yZWNkLmNvbmZpZy5pbml0Lm1ldGhvZCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVDRF9TVEFURV9JTklUX01TRyA9ICJsb2NhbF9yZWNkLnN0YXRlLmluaXQubWV0aG9kIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCTE9DS19BTExfUkVRVUVTVFMgPSAibG9jYWxfd3NvMndzYXMuYmxvY2sucmVxdWVzdHMiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPQ0FMX0lQX0FERFJFU1MgPSAiYXhpczIubG9jYWwuaXAuYWRkcmVzcyI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbWFpbiBjbHVzdGVyIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgUGFyYW1ldGVycyB7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZW1iZXJzaGlwIHNjaGVtZSB1c2VkIGluIHRoaXMgc2V0dXAuIFRoZSBvbmx5IHZhbHVlcyBzdXBwb3J0ZWQgYXQgdGhlIG1vbWVudCBhcmUKLSAgICAgICAgICogIm11bHRpY2FzdCIgYW5kICJ3a2EiCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRU1CRVJTSElQX1NDSEVNRSA9ICJtZW1iZXJzaGlwU2NoZW1lIjsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIGNsdXN0ZXJpbmcgZG9tYWluL2dyb3VwLiBOb2RlcyBpbiB0aGUgc2FtZSBncm91cCB3aWxsIGJlbG9uZyB0byB0aGUgc2FtZSBtdWx0aWNhc3QKLSAgICAgICAgICogZG9tYWluLiBUaGVyZSB3aWxsIG5vdCBiZSBpbnRlcmZlcmVuY2UgYmV0d2VlbiBub2RlcyBpbiBkaWZmZXJlbnQgZ3JvdXBzLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9NQUlOID0gImRvbWFpbiI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEluZGljYXRlcyB0aGUgbW9kZSBpbiB3aGljaCB0aGlzIG1lbWJlciBpcyBydW5uaW5nLiBWYWxpZCB2YWx1ZXMgYXJlICJhcHBsaWNhdGlvbiIgYW5kCi0gICAgICAgICAqICJsb2FkQmFsYW5jZSIKLSAgICAgICAgICogPHAvPgotICAgICAgICAgKiBhcHBsaWNhdGlvbiAtIFRoaXMgbWVtYmVyIGhvc3RzIGVuZCB1c2VyIGFwcGxpY2F0aW9ucwotICAgICAgICAgKiBsb2FkQmFsYW5jZSAtIFRoaXMgbWVtYmVyIGlzIGEgcGFydCBvZiB0aGUgbG9hZCBiYWxhbmNlciBjbHVzdGVyCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RFID0gIm1vZGUiOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGlzIGlzIHRoZSBldmVuIGhhbmRsZXIgd2hpY2ggd2lsbCBiZSBub3RpZmllZCBpbiB0aGUgY2FzZSBvZiBsb2FkIGJhbGFuY2luZyBldmVudHMgb2NjdXJyaW5nLgotICAgICAgICAgKiBUaGlzIGNsYXNzIGhhcyB0byBiZSBhbiBpbXBsZW1lbnRhdGlvbiBvZiBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuTG9hZEJhbGFuY2VFdmVudEhhbmRsZXIKLSAgICAgICAgICogPHAvPgotICAgICAgICAgKiBUaGlzIGVudHJ5IGlzIG9ubHkgdmFsaWQgaWYgdGhlICJtb2RlIiBwYXJhbWV0ZXIgaXMgc2V0IHRvIGxvYWRCYWxhbmNlCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0FEX0JBTEFOQ0VfRVZFTlRfSEFORExFUiA9ICJsb2FkQmFsYW5jZUV2ZW50SGFuZGxlciI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoaXMgcGFyYW1ldGVyIGlzIG9ubHkgdmFsaWQgd2hlbiB0aGUgIm1vZGUiIHBhcmFtZXRlciBpcyBzZXQgdG8gImFwcGxpY2F0aW9uIgotICAgICAgICAgKiA8cC8+Ci0gICAgICAgICAqIFRoaXMgaW5kaWNhdGVzIHRoZSBkb21haW4gaW4gd2hpY2ggdGhlIHRoZSBhcHBsaWNhdGlvbnMgYmVpbmcgbG9hZCBiYWxhbmNlZCBhcmUgZGVwbG95ZWQuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUFBMSUNBVElPTl9ET01BSU4gPSAiYXBwbGljYXRpb25Eb21haW4iOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBXaGVuIGEgV2ViIHNlcnZpY2UgcmVxdWVzdCBpcyByZWNlaXZlZCwgYW5kIHByb2Nlc3NlZCwgYmVmb3JlIHRoZSByZXNwb25zZSBpcyBzZW50IHRvIHRoZQotICAgICAgICAgKiBjbGllbnQsIHNob3VsZCB3ZSB1cGRhdGUgdGhlIHN0YXRlcyBvZiBhbGwgbWVtYmVycyBpbiB0aGUgY2x1c3Rlcj8gSWYgdGhlIHZhbHVlIG9mCi0gICAgICAgICAqIHRoaXMgcGFyYW1ldGVyIGlzIHNldCB0byAidHJ1ZSIsIHRoZSByZXNwb25zZSB0byB0aGUgY2xpZW50IHdpbGwgYmUgc2VudCBvbmx5IGFmdGVyCi0gICAgICAgICAqIGFsbCB0aGUgbWVtYmVycyBoYXZlIGJlZW4gdXBkYXRlZC4gT2J2aW91c2x5LCB0aGlzIGNhbiBiZSB0aW1lIGNvbnN1bWluZy4gSW4gc29tZSBjYXNlcywKLSAgICAgICAgICogc3VjaCB0aGlzIG92ZXJoZWFkIG1heSBub3QgYmUgYWNjZXB0YWJsZSwgaW4gd2hpY2ggY2FzZSB0aGUgdmFsdWUgb2YgdGhpcyBwYXJhbWV0ZXIKLSAgICAgICAgICogc2hvdWxkIGJlIHNldCB0byAiZmFsc2UiCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTWU5DSFJPTklaRV9BTExfTUVNQkVSUyA9ICJzeW5jaHJvbml6ZUFsbCI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIERvIG5vdCBhdXRvbWF0aWNhbGx5IGluaXRpYWxpemUgdGhlIGNsdXN0ZXIuIFRoZSBwcm9ncmFtbWVyIGhhcyB0byBleHBsaWNpdGx5IGluaXRpYWxpemUKLSAgICAgICAgICogdGhlIGNsdXN0ZXIuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVk9JRF9JTklUSUFUSU9OID0gIkF2b2lkSW5pdGlhdGlvbiI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFByZXNlcnZlIG1lc3NhZ2Ugb3JkZXJpbmcuIFRoaXMgd2lsbCBiZSBkb25lIGFjY29yZGluZyB0byBzZW5kZXIgb3JkZXIKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRVNFUlZFX01TR19PUkRFUiA9ICJwcmVzZXJ2ZU1lc3NhZ2VPcmRlciI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIE1haW50YWluIGF0bW9zdC1vbmNlIG1lc3NhZ2UgcHJvY2Vzc2luZyBzZW1hbnRpY3MKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUTU9TVF9PTkNFX01TR19TRU1BTlRJQ1MgPSAiYXRtb3N0T25jZU1lc3NhZ2VTZW1hbnRpY3MiOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIG1lbWJlciBpcyBBQ1RJVkUgb3IgUEFTU0lWRQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSVNfQUNUSVZFID0gImlzQWN0aXZlIjsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIGltcGxlbWVudGFpb24gb2YKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FTUJFUlNISVBfTElTVEVORVIgPSAibWVtYmVyc2hpcExpc3RlbmVyIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIE1lbWJlcnNoaXBTY2hlbWUgewotICAgICAgICAvKioKLSAgICAgICAgICogTXVsdGljYXN0IGJhc2VkIG1lbWJlcnNoaXAgZGlzY292ZXJ5IHNjaGVtZQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVVMVElDQVNUX0JBU0VEID0gIm11bHRpY2FzdCI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFdlbGwtS25vd24gQWRkcmVzcyBiYXNlZCBtZW1iZXJzaGlwIG1hbmFnZW1lbnQgc2NoZW1lCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXS0FfQkFTRUQgPSAid2thIjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9DbHVzdGVyaW5nRmF1bHQuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL0NsdXN0ZXJpbmdGYXVsdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDRjOTBkLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL0NsdXN0ZXJpbmdGYXVsdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmc7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLQotcHVibGljIGNsYXNzIENsdXN0ZXJpbmdGYXVsdCBleHRlbmRzIEF4aXNGYXVsdCB7Ci0KLQlwdWJsaWMgQ2x1c3RlcmluZ0ZhdWx0IChTdHJpbmcgbWVzc2FnZSkgewotCQlzdXBlciAobWVzc2FnZSk7Ci0JfQotCQotCXB1YmxpYyBDbHVzdGVyaW5nRmF1bHQgKFN0cmluZyBtZXNzYWdlLCBFeGNlcHRpb24gZSkgewotCQlzdXBlciAobWVzc2FnZSwgZSk7Ci0JfQotCQotCXB1YmxpYyBDbHVzdGVyaW5nRmF1bHQgKEV4Y2VwdGlvbiBlKSB7Ci0JCXN1cGVyIChlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9Mb2FkQmFsYW5jZUV2ZW50SGFuZGxlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvTG9hZEJhbGFuY2VFdmVudEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODIyZGVhMS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9Mb2FkQmFsYW5jZUV2ZW50SGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICogQ29weXJpZ2h0IDIwMDQsMjAwNSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7ICAgICAgICAgICAgIAotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgICAgICAgICAgIAotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAgICAgICAgIAotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgICAgICAgICAgIAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICAgIAotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAgICAgICAgIAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZzsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGludGVyZmFjZSB0aHJvdWdoIHdoaWNoIHRoZSBsb2FkIGJhbGFuY2luZyBldmVudCBhcmUgbm90aWZpZWQuCi0gKiBUaGlzIHdpbGwgb25seSBiZSB1c2VkIHdoZW4gdGhpcyBtZW1iZXIgaXMgcnVubmluZyBpbiBsb2FkQmFsYW5jZSBtb2RlLiBJbiBvcmRlciB0byBkbyB0aGlzLAotICogaW4gdGhlIGF4aXMyLnhtbCBmaWxlLCBzZXQgdGhlIHZhbHVlIG9mIHRoZSAibW9kZSIgcGFyYW1ldGVyIHRvICJsb2FkQmFsYW5jZSIgYW5kIHRoZW4gcHJvdmlkZQotICogdGhlIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGlzIGludGVyZmFjZSB1c2luZyB0aGUgImxvYWRCYWxhbmNlRXZlbnRIYW5kbGVyIiBlbnRyeS4KLSAqLwotcHVibGljIGludGVyZmFjZSBMb2FkQmFsYW5jZUV2ZW50SGFuZGxlciB7Ci0KLSAgICAvKioKLSAgICAgKiBBbiBhcHBsaWNhdGlvbiBtZW1iZXIgam9pbmVkIHRoZSBhcHBsaWNhdGlvbiBncm91cAotICAgICAqCi0gICAgICogQHBhcmFtIG1lbWJlciBSZXByZXNlbnRzIHRoZSBtZW1iZXIgd2hvIGpvaW5lZAotICAgICAqLwotICAgIHZvaWQgYXBwbGljYXRpb25NZW1iZXJBZGRlZChNZW1iZXIgbWVtYmVyKTsKLQotICAgIC8qKgotICAgICAqIEFuIGFwcGxpY2F0aW9uIG1lbWJlciBsZWZ0IHRoZSBhcHBsaWNhdGlvbiBncm91cAotICAgICAqCi0gICAgICogQHBhcmFtIG1lbWJlciBSZXByZXNlbnRzIHRoZSBtZW1iZXIgd2hvIGxlZnQKLSAgICAgKi8KLSAgICB2b2lkIGFwcGxpY2F0aW9uTWVtYmVyUmVtb3ZlZChNZW1iZXIgbWVtYmVyKTsKLQotICAgIC8qKiBHZXQgdGhlIGxpc3Qgb2YgY3VycmVudCBtZW1iZXJzCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIExpc3Qgb2YgY3VycmVudCBtZW1iZXJzCi0gICAgICovCi0gICAgTGlzdDxNZW1iZXI+IGdldE1lbWJlcnMoKTsKLSAgICAKLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL01lbWJlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvTWVtYmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmYTNjZDAuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvTWVtYmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA0LDIwMDUgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLQotLyoqCi0gKiBSZXByZXNlbnRzIGEgbWVtYmVyIGluIHRoZSBjbHVzdGVyLiBUaGlzIGlzIHVzZWQgd2l0aCBzdGF0aWMgbWVtYmVyc2hpcAotICovCi1wdWJsaWMgY2xhc3MgTWVtYmVyIHsKLQotICAgIC8qKgotICAgICAqIFRoZSBob3N0IG5hbWUgb2YgdGhpcyBtZW1iZXIuIENhbiBiZSB0aGUgbmFtZSBvciB0aGUgSVAgYWRkcmVzcwotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGhvc3ROYW1lOwotCi0gICAgLyoqCi0gICAgICogVGhlIFRDUCBwb3J0IHVzZWQgYnkgdGhpcyBtZW1iZXIgZm9yIGNvbW11bmljYXRpbmcgY2x1c3RlcmluZyBtZXNzYWdlcwotICAgICAqLwotICAgIHByaXZhdGUgaW50IHBvcnQgPSAtMTsKLQotICAgIC8qKgotICAgICAqIFRoZSBIVFRQIHBvcnQgdXNlZCBieSB0aGlzIG1lbWJlciBmb3Igc2VydmljaW5nIFdlYiBzZXJ2aWNlIHJlcXVlc3RzLiBVc2VkIGZvciBsb2FkIGJhbGFuY2luZwotICAgICAqLwotICAgIHByaXZhdGUgaW50IGh0dHBQb3J0ID0gLTE7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgSFRUUFMgcG9ydCB1c2VkIGJ5IHRoaXMgbWVtYmVyIGZvciBzZXJ2aWNpbmcgV2ViIHNlcnZpY2UgcmVxdWVzdHMuIFVzZWQgZm9yIGxvYWQgYmFsYW5jaW5nCi0gICAgICovCi0gICAgcHJpdmF0ZSBpbnQgaHR0cHNQb3J0ID0gLTE7Ci0KLSAgICAvKioKLSAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIG1lbWJlciBpcyBBQ1RJVkUgb3IgUEFTU0lWRQotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBpc0FjdGl2ZSA9IHRydWU7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZG9tYWluIG9mIHRoaXMgbWVtYmVyCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZG9tYWluOwotCi0gICAgLyoqCi0gICAgICogT3RoZXIgbWVtYmVyIHNwZWNpZmljIHByb3BlcnRpZXMKLSAgICAgKi8KLSAgICBwcml2YXRlIFByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0KLSAgICBwdWJsaWMgTWVtYmVyKFN0cmluZyBob3N0TmFtZSwgaW50IHBvcnQpIHsKLSAgICAgICAgdGhpcy5ob3N0TmFtZSA9IGhvc3ROYW1lOwotICAgICAgICB0aGlzLnBvcnQgPSBwb3J0OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SG9zdE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBob3N0TmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldFBvcnQoKSB7Ci0gICAgICAgIHJldHVybiBwb3J0OwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0SHR0cHNQb3J0KCkgewotICAgICAgICByZXR1cm4gaHR0cHNQb3J0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEh0dHBzUG9ydChpbnQgaHR0cHNQb3J0KSB7Ci0gICAgICAgIHRoaXMuaHR0cHNQb3J0ID0gaHR0cHNQb3J0OwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0SHR0cFBvcnQoKSB7Ci0gICAgICAgIHJldHVybiBodHRwUG9ydDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRIdHRwUG9ydChpbnQgaHR0cFBvcnQpIHsKLSAgICAgICAgdGhpcy5odHRwUG9ydCA9IGh0dHBQb3J0OwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQWN0aXZlKCkgewotICAgICAgICByZXR1cm4gaXNBY3RpdmU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QWN0aXZlKGJvb2xlYW4gYWN0aXZlKSB7Ci0gICAgICAgIGlzQWN0aXZlID0gYWN0aXZlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RG9tYWluKCkgewotICAgICAgICByZXR1cm4gZG9tYWluOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERvbWFpbihTdHJpbmcgZG9tYWluKSB7Ci0gICAgICAgIHRoaXMuZG9tYWluID0gZG9tYWluOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnRpZXMoUHJvcGVydGllcyBwcm9wZXJ0aWVzKSB7Ci0gICAgICAgIHRoaXMucHJvcGVydGllcyA9IHByb3BlcnRpZXM7Ci0gICAgfQotCi0gICAgcHVibGljIFByb3BlcnRpZXMgZ2V0UHJvcGVydGllcygpIHsKLSAgICAgICAgcmV0dXJuIHByb3BlcnRpZXM7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0gICAgICAgIGlmICh0aGlzID09IG8pIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChvID09IG51bGwgfHwgZ2V0Q2xhc3MoKSAhPSBvLmdldENsYXNzKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIE1lbWJlciBtZW1iZXIgPSAoTWVtYmVyKSBvOwotICAgICAgICByZXR1cm4gcG9ydCA9PSBtZW1iZXIuZ2V0UG9ydCgpICYmCi0gICAgICAgICAgICAgICBodHRwUG9ydCA9PSBtZW1iZXIuZ2V0SHR0cFBvcnQoKSAmJgotICAgICAgICAgICAgICAgaHR0cHNQb3J0ID09IG1lbWJlci5nZXRIdHRwc1BvcnQoKSAmJgotICAgICAgICAgICAgICAgIShob3N0TmFtZSAhPSBudWxsID8gIWhvc3ROYW1lLmVxdWFscyhtZW1iZXIuZ2V0SG9zdE5hbWUoKSkgOgotICAgICAgICAgICAgICAgICBtZW1iZXIuZ2V0SG9zdE5hbWUoKSAhPSBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICBpbnQgcmVzdWx0OwotICAgICAgICByZXN1bHQgPSAoaG9zdE5hbWUgIT0gbnVsbCA/IGhvc3ROYW1lLmhhc2hDb2RlKCkgOiAwKTsKLSAgICAgICAgcmVzdWx0ID0gMzEgKiByZXN1bHQgKyBwb3J0OwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiAiSG9zdDoiICsgaG9zdE5hbWUgKyAiLCBQb3J0OiAiICsgcG9ydCArCi0gICAgICAgICAgICAgICAiLCBIVFRQOiIgKyBodHRwUG9ydCArICIsIEhUVFBTOiIgKyBodHRwc1BvcnQgKyIsIEFDVElWRToiICsgaXNBY3RpdmU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvTWVtYmVyc2hpcExpc3RlbmVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9NZW1iZXJzaGlwTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjM0ZDZmNi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9NZW1iZXJzaGlwTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqIENvcHlyaWdodCAyMDA0LDIwMDUgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAgICAgICAgICAgICAKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gICAgICAgICAgICAKLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgICAgICAgICAKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsICAgICAgICAgICAKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgICAKLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgICAgICAgICAKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmc7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaW50ZXJmYWNlIHdoaWNoIHdpbGwgYmUgbm90aWZpZWQgd2hlbiBtZW1lcnNoaXAgY2hhbmdlcy4KLSAqIElmIHNvbWUgc3BlY2lmaWMgYWN0aXZpdGllcyBuZWVkIHRvIGJlIHBlcmZvcm1lZCB3aGVuIG1lbWJlcnNoaXAgY2hhbmdlcyBvY2N1ciwKLSAqIHlvdSBjYW4gcHJvdmlkZSBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGludGVyZmFjZSBpbiB0aGUgYXhpczIueG1sCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWVtYmVyc2hpcExpc3RlbmVyIHsKLQotICAgIC8qKgotICAgICAqIE1ldGhvZCB3aGljaCB3aWxsIGJlIGNhbGxlZCB3aGVuIGEgbWVtYmVyIGlzIGFkZGVkCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVtYmVyIFRoZSBtZW1iZXIgd2hpY2ggd2FzIGFkZGVkCi0gICAgICogQHBhcmFtIGlzTG9jYWxNZW1iZXJDb29yZGluYXRvciB0cnVlIC0gaWYgdGhlIGxvY2FsIG1lbWJlciBpcyB0aGUgY29vcmRpbmF0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBtZW1iZXJBZGRlZChNZW1iZXIgbWVtYmVyLCBib29sZWFuIGlzTG9jYWxNZW1iZXJDb29yZGluYXRvcik7Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2Qgd2hpY2ggd2lsbCBiZSBjYWxsZWQgd2hlbiBhIG1lbWJlciBkaXNzYXBlYXJzCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVtYmVyIFRoZSBtZW1iZXIgd2hpY2ggZGlzYXBwZWFyZWQKLSAgICAgKiBAcGFyYW0gaXNMb2NhbE1lbWJlckNvb3JkaW5hdG9yIHRydWUgLSBpZiB0aGUgbG9jYWwgbWVtYmVyIGlzIHRoZSBjb29yZGluYXRvcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG1lbWJlckRpc2FwcGVhcmVkKE1lbWJlciBtZW1iZXIsICBib29sZWFuIGlzTG9jYWxNZW1iZXJDb29yZGluYXRvcik7Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9NZXNzYWdlU2VuZGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9NZXNzYWdlU2VuZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzY2UxMTcuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvTWVzc2FnZVNlbmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmc7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWVzc2FnZVNlbmRlciB7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZW5kVG9Hcm91cChDbHVzdGVyaW5nQ29tbWFuZCBtc2cpIHRocm93cyBDbHVzdGVyaW5nRmF1bHQ7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZW5kVG9TZWxmKENsdXN0ZXJpbmdDb21tYW5kIG1zZykgdGhyb3dzIENsdXN0ZXJpbmdGYXVsdDsKLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvUmVxdWVzdEJsb2NraW5nSGFuZGxlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvUmVxdWVzdEJsb2NraW5nSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmYwOGU3Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL1JlcXVlc3RCbG9ja2luZ0hhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZzsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlR3JvdXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5IYW5kbGVyRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5QYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5oYW5kbGVycy5BYnN0cmFjdEhhbmRsZXI7Ci0KLS8qKgotICoKLSAqLwotcHVibGljIGNsYXNzIFJlcXVlc3RCbG9ja2luZ0hhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIgewotICAgIHB1YmxpYyBJbnZvY2F0aW9uUmVzcG9uc2UgaW52b2tlKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHRocm93cyBBeGlzRmF1bHQgewotCi0gICAgICAgIC8vIEhhbmRsZSBibG9ja2luZyBhdCBnb2JhbCBsZXZlbAotICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBjZmdDdHggPSBtc2dDb250ZXh0LmdldENvbmZpZ3VyYXRpb25Db250ZXh0KCk7Ci0gICAgICAgIEJvb2xlYW4gaXNCbG9ja2luZ0FsbFJlcXVlc3RzID0KLSAgICAgICAgICAgICAgICAoQm9vbGVhbikgY2ZnQ3R4LmdldFByb3BlcnR5KENsdXN0ZXJpbmdDb25zdGFudHMuQkxPQ0tfQUxMX1JFUVVFU1RTKTsKLSAgICAgICAgQXhpc1NlcnZpY2VHcm91cCBzZXJ2aWNlR3JvdXAgPSBtc2dDb250ZXh0LmdldEF4aXNTZXJ2aWNlR3JvdXAoKTsKLQotICAgICAgICAvLyBIYW5kbGUgYmxvY2tpbmcgYXQgc2VydmljZSBncm91cCBsZXZlbAotICAgICAgICBCb29sZWFuIGlzQmxvY2tpbmdTZXJ2aWNlR3JvdXBSZXF1ZXN0cyA9IEJvb2xlYW4uRkFMU0U7Ci0gICAgICAgIGlmIChzZXJ2aWNlR3JvdXAgIT0gbnVsbCkgewotICAgICAgICAgICAgUGFyYW1ldGVyIGJsb2NraW5nUGFyYW0gPQotICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlR3JvdXAuZ2V0UGFyYW1ldGVyKENsdXN0ZXJpbmdDb25zdGFudHMuQkxPQ0tfQUxMX1JFUVVFU1RTKTsKLSAgICAgICAgICAgIGlmIChibG9ja2luZ1BhcmFtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpc0Jsb2NraW5nU2VydmljZUdyb3VwUmVxdWVzdHMgPSAoQm9vbGVhbikgYmxvY2tpbmdQYXJhbS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSGFuZGxlIGJsb2NraW5nIGF0IHNlcnZpY2UgbGV2ZWwKLSAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSA9IG1zZ0NvbnRleHQuZ2V0QXhpc1NlcnZpY2UoKTsKLSAgICAgICAgQm9vbGVhbiBpc0Jsb2NraW5nU2VydmljZVJlcXVlc3RzID0gQm9vbGVhbi5GQUxTRTsKLSAgICAgICAgaWYgKHNlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgUGFyYW1ldGVyIGJsb2NraW5nUGFyYW0gPQotICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLmdldFBhcmFtZXRlcihDbHVzdGVyaW5nQ29uc3RhbnRzLkJMT0NLX0FMTF9SRVFVRVNUUyk7Ci0gICAgICAgICAgICBpZiAoYmxvY2tpbmdQYXJhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaXNCbG9ja2luZ1NlcnZpY2VSZXF1ZXN0cyA9IChCb29sZWFuKSBibG9ja2luZ1BhcmFtLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaXNCbG9ja2luZ0FsbFJlcXVlc3RzICE9IG51bGwgJiYgaXNCbG9ja2luZ0FsbFJlcXVlc3RzLmJvb2xlYW5WYWx1ZSgpKSB7Ci0KLSAgICAgICAgICAgIC8vIEFsbG93IG9ubHkgTm9kZU1hbmFnZXIgc2VydmljZSBjb21taXQgcmVxdWVzdHMgdG8gcGFzcyB0aHJvdWdoLiBCbG9jayBhbGwgb3RoZXJzCi0gICAgICAgICAgICBBeGlzU2VydmljZSBheGlzU2VydmljZSA9IG1zZ0NvbnRleHQuZ2V0QXhpc1NlcnZpY2UoKTsKLSAgICAgICAgICAgIGlmICghYXhpc1NlcnZpY2UuZ2V0TmFtZSgpLmVxdWFscyhDbHVzdGVyaW5nQ29uc3RhbnRzLk5PREVfTUFOQUdFUl9TRVJWSUNFKSkgewotICAgICAgICAgICAgICAgIGlmICghbXNnQ29udGV4dC5nZXRBeGlzT3BlcmF0aW9uKCkuZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpLmVxdWFscygiY29tbWl0IikpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiU3lzdGVtIGlzIGJlaW5nIHJlaW5pdGlhbGl6ZWQuICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQbGVhc2UgdHJ5IGFnYWluIGluIGEgZmV3IHNlY29uZHMuIik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiTm9kZU1hbmFnZXIgc2VydmljZSBjYW5ub3QgY2FsbCBhbnkgb3RoZXIgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9wZXJhdGlvbiBhZnRlciBjYWxsaW5nIHByZXBhcmUiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoaXNCbG9ja2luZ1NlcnZpY2VHcm91cFJlcXVlc3RzLmJvb2xlYW5WYWx1ZSgpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJUaGlzIHNlcnZpY2UgZ3JvdXAgaXMgYmVpbmcgaW5pdGlhbGl6ZWQgb3IgdW5sb2FkZWQuICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUGxlYXNlIHRyeSBhZ2FpbiBpbiBhIGZldyBzZWNvbmRzLiIpOwotICAgICAgICB9IGVsc2UgaWYgKGlzQmxvY2tpbmdTZXJ2aWNlUmVxdWVzdHMuYm9vbGVhblZhbHVlKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoIlRoaXMgc2VydmljZSBpcyBiZWluZyBpbml0aWFsaXplZC4gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQbGVhc2UgdHJ5IGFnYWluIGluIGEgZmV3IHNlY29uZHMuIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEludm9jYXRpb25SZXNwb25zZS5DT05USU5VRTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0gICAgICAgIGlmKG9iaiBpbnN0YW5jZW9mIFJlcXVlc3RCbG9ja2luZ0hhbmRsZXIpewotICAgICAgICAgICAgUmVxdWVzdEJsb2NraW5nSGFuZGxlciB0aGF0ID0gKFJlcXVlc3RCbG9ja2luZ0hhbmRsZXIpIG9iajsKLSAgICAgICAgICAgIEhhbmRsZXJEZXNjcmlwdGlvbiB0aGlzRGVzYyA9IHRoaXMuZ2V0SGFuZGxlckRlc2MoKTsKLSAgICAgICAgICAgIEhhbmRsZXJEZXNjcmlwdGlvbiB0aGF0RGVzYyA9IHRoYXQuZ2V0SGFuZGxlckRlc2MoKTsKLSAgICAgICAgICAgIGlmKHRoaXNEZXNjICE9IG51bGwgJiYgdGhhdERlc2MgIT0gbnVsbCAmJiB0aGlzRGVzYy5nZXROYW1lKCkuZXF1YWxzKHRoYXREZXNjLmdldE5hbWUoKSkpewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgIGlmKHRoaXMuaGFuZGxlckRlc2MgIT0gbnVsbCl7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVyRGVzYy5oYXNoQ29kZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdXBlci5oYXNoQ29kZSgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL2NvbmZpZ3VyYXRpb24vQ29uZmlndXJhdGlvbkNsdXN0ZXJpbmdDb21tYW5kLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9jb25maWd1cmF0aW9uL0NvbmZpZ3VyYXRpb25DbHVzdGVyaW5nQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmY2M2MzhjLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL2NvbmZpZ3VyYXRpb24vQ29uZmlndXJhdGlvbkNsdXN0ZXJpbmdDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLkNsdXN0ZXJpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIDItcGhhc2UgY29tbWl0IHByb3RvY29sLCB3aGVyZSBhbiBldmVudCBpcyBwcm9jZXNzZWQsCi0gKiB0aGUgc3lzdGVtIGlzIHByZXBhcmVkIHRvIHN3aXRjaCB0byBhIG5ldyBjb25maWd1cmF0aW9uIGJhc2VkIG9uIHRoZSBwcm9jZXNzZWQgZXZlbnQsCi0gKiBhbmQgZmluYWxseSBjb21taXRzIHRoZSBuZXcgY29uZmlndXJhdGlvbiAoaS5lLiB0aGUgc3lzdGVtIHN3aXRjaGVzIHRvIHRoZSBuZXcgY29uZmlndXJhdGlvbikuCi0gKiBBcyBjYW4gYmUgc2VlbiwgdGhpcyBpcyBhIDMtc3RlcCBwcm9jZXNzLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29uZmlndXJhdGlvbkNsdXN0ZXJpbmdDb21tYW5kIGV4dGVuZHMgQ2x1c3RlcmluZ0NvbW1hbmQgewotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVMT0FEX0NPTkZJR1VSQVRJT04gPSAwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExPQURfU0VSVklDRV9HUk9VUFMgPSAxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOTE9BRF9TRVJWSUNFX0dST1VQUyA9IDI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVBQTFlfU0VSVklDRV9QT0xJQ1kgPSAzOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSRVBBUkUgPSA0OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTU1JVCA9IDU7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVhDRVBUSU9OID0gNjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBST0xMQkFDSyA9IDc7Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGNvbW1hbmQgdHlwZQotICAgICAqIAotICAgICAqIEByZXR1cm4gVGhlIGNvbW1hbmQgdHlwZQotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0Q29tbWFuZFR5cGUoKTsKLQotICAgIC8qKgotICAgICAqIFByb2Nlc3MgdGhlIDxjb2RlPmV2ZW50PC9ldmVudD4uIFRoZSBpbXBsZW1lbnRlciBvZiB0aGlzIGludGVyZmFjZSB3aWxsCi0gICAgICogbmVlZCB0byBjYWNoZSB0aGUgb3V0Y29tZSBvZiB0aGlzIHByb2Nlc3NpbmcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29uZmlnQ29udGV4dAotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IHZvaWQgcHJvY2VzcyhDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogUHJlcGFyZSB0byBzd2l0Y2ggdG8gdGhlIG5ldyBjb25maWd1cmF0aW9uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29uZmlnQ29udGV4dAotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHByZXBhcmUoQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ29udGV4dCk7Ci0KLSAgICAvKioKLSAgICAgKiBDb21taXQgdGhlIG5ldyBjb25maWd1cmF0aW9uLiBpLmUuIHN3aXRjaCB0aGUgc3lzdGVtIHRvIHRoZSBuZXcgY29uZmlndXJhdGlvbgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbmZpZ0NvbnRleHQKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGNvbW1pdChDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogUm9sbGJhY2sgYW55IGNoYW5nZXMgY2FycmllZCBvdXQKLSAgICAgKgotICAgICAqIEBwYXJhbSBjb25maWdDb250ZXh0Ci0gICAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCByb2xsYmFjayhDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvY29uZmlndXJhdGlvbi9Db25maWd1cmF0aW9uTWFuYWdlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvY29uZmlndXJhdGlvbi9Db25maWd1cmF0aW9uTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjc0NTJlLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL2NvbmZpZ3VyYXRpb24vQ29uZmlndXJhdGlvbk1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLkNsdXN0ZXJpbmdGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5QYXJhbWV0ZXJJbmNsdWRlOwotCi0vKioKLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgaXMgcmVzcG9uc2libGUgZm9yIGhhbmRsaW5nIGNvbmZpZ3VyYXRpb24gbWFuYWdlbWVudC4gQ29uZmlndXJhaW9uIGNoYW5nZXMgaW5jbHVkZQotICogPHAvPgotICogPHVsPgotICogPGxpPlJlYm9vdGluZyBhbiBlbnRpcmUgY2x1c3RlciwgaW4gd2hpY2ggY2FzZSwgYWxsIG5vZGVzIGhhdmUgdG8gbG9hZCB0aGUgbmV3IEF4aXMyIGNvbmZpZ3VyYXRpb24KLSAqIGluIGEgY29uc2lzdGVudCBtYW5uZXIKLSAqIDwvbGk+Ci0gKiA8bGk+Ci0gKiBEZXBsb3lpbmcgYSBuZXcgc2VydmljZSB0byBhIGNsdXN0ZXIgb3IgdW5kZXBsb3lpbmcgYSBzZXJ2aWNlIGZyb20gYSBjbHVzdGVyCi0gKiA8L2xpPgotICogPGxpPgotICogQ2hhbmdpbmcgdGhlIHBvbGljaWVzIG9mIGEgc2VydmljZSBkZXBsb3llZCBvbiB0aGUgY2x1c3RlcgotICogPC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKiA8cD4KLSAqIEl0IGlzIG5vdCBtYW5kYXRvcnkgdG8gaGF2ZSBhIENvbmZpZ3VyYXRpb25NYW5hZ2VyIGluIGEgbm9kZS4gSW4gd2hpY2ggY2FzZSB0aGUgY2x1c3RlciBtYXkgYmUKLSAqIHVzZWQgb25seSBmb3IgPGEgaHJlZj0iaHR0cDovL2Fma2hhbS5vcmcvMjAwOC8wNS9kZWZpbml0aW9uLW9mLWhpZ2gtYXZhaWxhYmlsaXR5Lmh0bWwiPgotICogSGlnaCBBdmFpbGFiaWxpdHk8L2E+IHRocm91Z2ggY29udGV4dCByZXBsaWNhdGlvbi4gSG93ZXZlciwgaXQgaXMgZGlmZmljdWx0IHRvIGltYWdpbmUgdGhhdAotICogYSBjbHVzdGVyIHdpbGwgYmUgZGVwbG95ZWQgaW4gcHJvZHVjdGlvbiB3aXRoIG9ubHkgY29udGV4dCByZXBsaWNhdGlvbiBidXQgd2l0aG91dCBjbHVzdGVyCi0gKiBjb25maWd1cmF0aW9uIG1hbmFnZW1lbnQuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGludGVyZmFjZSBpcyBzZXQgYnkgdGhlCi0gKiB7QGxpbmsgb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LkNsdXN0ZXJCdWlsZGVyfSwgYnkKLSAqIHJlYWRpbmcgdGhlICAiY29uZmlndXJhdGlvbk1hbmFnZXIiIGVsZW1lbnQgaW4gdGhlIGF4aXMyLnhtbAotICogPHAvPgotICogZS5nLgotICogPGNvZGU+Ci0gKiA8Yj4KLSAqIDxjb25maWd1cmF0aW9uTWFuYWdlciBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyLmNvbmZpZ3VyYXRpb24uVHJpYmVzQ29uZmlndXJhdGlvbk1hbmFnZXIiPgotICogPC9iPgotICogPC9jb2RlPgotICogPC9wPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbmZpZ3VyYXRpb25NYW5hZ2VyIGV4dGVuZHMgUGFyYW1ldGVySW5jbHVkZSB7Ci0KLSAgICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIENvbmZpZ3VyYXRpb24gbWFuYWdlbWVudCBtZXRob2RzICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0gICAgLyoqCi0gICAgICogTG9hZCBhIHNldCBvZiBzZXJ2aWNlIGdyb3VwcwotICAgICAqCi0gICAgICogQHBhcmFtIHNlcnZpY2VHcm91cE5hbWVzIFRoZSBzZXQgb2Ygc2VydmljZSBncm91cHMgdG8gYmUgbG9hZGVkCi0gICAgICogQHRocm93cyBDbHVzdGVyaW5nRmF1bHQgSWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGxvYWRpbmcgc2VydmljZSBncm91cHMKLSAgICAgKi8KLSAgICB2b2lkIGxvYWRTZXJ2aWNlR3JvdXBzKFN0cmluZ1tdIHNlcnZpY2VHcm91cE5hbWVzKSB0aHJvd3MgQ2x1c3RlcmluZ0ZhdWx0OwotCi0gICAgLyoqCi0gICAgICogVW5sb2FkIGEgc2V0IG9mIHNlcnZpY2UgZ3JvdXBzCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2VydmljZUdyb3VwTmFtZXMgVGhlIHNldCBvZiBzZXJ2aWNlIGdyb3VwcyB0byBiZSB1bmxvYWRlZAotICAgICAqIEB0aHJvd3MgQ2x1c3RlcmluZ0ZhdWx0IElmIGFuIGVycm9yIG9jY3VycyB3aGlsZSB1bmxvYWRpbmcgc2VydmljZSBncm91cHMKLSAgICAgKi8KLSAgICB2b2lkIHVubG9hZFNlcnZpY2VHcm91cHMoU3RyaW5nW10gc2VydmljZUdyb3VwTmFtZXMpIHRocm93cyBDbHVzdGVyaW5nRmF1bHQ7Ci0KLSAgICAvKioKLSAgICAgKiBBcHBseSBhIHBvbGljeSB0byBhIHNlcnZpY2UKLSAgICAgKgotICAgICAqIEBwYXJhbSBzZXJ2aWNlTmFtZSBUaGUgbmFtZSBvZiB0aGUgc2VydmljZSB0byB3aGljaCB0aGlzIHBvbGljeSBuZWVkcyB0byBiZSBhcHBsaWVkCi0gICAgICogQHBhcmFtIHBvbGljeSAgICAgIFRoZSBzZXJpYWxpemVkIHBvbGljeSB0byBiZSBhcHBsaWVkIHRvIHRoZSBzZXJ2aWNlCi0gICAgICogQHRocm93cyBDbHVzdGVyaW5nRmF1bHQgSWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGFwcGx5aW5nIHNlcnZpY2UgcG9saWNpZXMKLSAgICAgKi8KLSAgICB2b2lkIGFwcGx5UG9saWN5KFN0cmluZyBzZXJ2aWNlTmFtZSwgU3RyaW5nIHBvbGljeSkgdGhyb3dzIENsdXN0ZXJpbmdGYXVsdDsKLQotICAgIC8qKgotICAgICAqIFJlbG9hZCB0aGUgZW50aXJlIGNvbmZpZ3VyYXRpb24gb2YgYW4gQXhpczIgTm9kZQotICAgICAqCi0gICAgICogQHRocm93cyBDbHVzdGVyaW5nRmF1bHQgSWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIHJlaW5pdGlhbGl6aW5nIEF4aXMyCi0gICAgICovCi0gICAgdm9pZCByZWxvYWRDb25maWd1cmF0aW9uKCkgdGhyb3dzIENsdXN0ZXJpbmdGYXVsdDsKLQotICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgVHJhbnNhY3Rpb24gbWFuYWdlbWVudCBtZXRob2RzICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSAgICAvKioKLSAgICAgKiBGaXJzdCBwaGFzZSBvZiB0aGUgMi1waGFzZSBjb21taXQgcHJvdG9jb2wuCi0gICAgICogTm90aWZpZXMgYSBub2RlIHRoYXQgaXQgbmVlZHMgdG8gcHJlcGFyZSB0byBzd2l0Y2ggdG8gYSBuZXcgY29uZmlndXJhdGlvbi4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgQ2x1c3RlcmluZ0ZhdWx0IElmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBwcmVwYXJpbmcgdG8gY29tbWl0Ci0gICAgICovCi0gICAgdm9pZCBwcmVwYXJlKCkgdGhyb3dzIENsdXN0ZXJpbmdGYXVsdDsKLQotICAgIC8qKgotICAgICAqIFJvbGxiYWNrIHdoYXRldmVyIHdhcyBkb25lCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIENsdXN0ZXJpbmdGYXVsdCBJZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgcm9sbGluZyBiYWNrIGEgY2x1c3RlciBjb25maWd1cmF0aW9uCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb24KLSAgICAgKi8KLSAgICB2b2lkIHJvbGxiYWNrKCkgdGhyb3dzIENsdXN0ZXJpbmdGYXVsdDsKLQotICAgIC8qKgotICAgICAqIFNlY29uZCBwaGFzZSBvZiB0aGUgMi1waGFzZSBjb21taXQgcHJvdG9jb2wuCi0gICAgICogTm90aWZpZXMgYSBub2RlIHRoYXQgaXQgbmVlZHMgdG8gc3dpdGNoIHRvIGEgbmV3IGNvbmZpZ3VyYXRpb24uCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIENsdXN0ZXJpbmdGYXVsdCBJZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgY29tbWl0dGluZyBhIGNsdXN0ZXIgY29uZmlndXJhdGlvbgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uCi0gICAgICovCi0gICAgdm9pZCBjb21taXQoKSB0aHJvd3MgQ2x1c3RlcmluZ0ZhdWx0OwotCi0gICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEdlbmVyYWwgbWFuYWdlbWVudCBtZXRob2RzICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSAgICAvKioKLSAgICAgKiBUbyBub3RpZnkgb3RoZXIgbm9kZXMgdGhhdCBhbiBFeGNlcHRpb24gb2NjdXJyZWQsIGR1cmluZyB0aGUgcHJvY2Vzc2luZwotICAgICAqIG9mIGEge0BsaW5rIENvbmZpZ3VyYXRpb25DbHVzdGVyaW5nQ29tbWFuZH0KLSAgICAgKgotICAgICAqIEBwYXJhbSB0aHJvd2FibGUgVGhlIHRocm93YWJsZSB3aGljaCBoYXMgdG8gYmUgcHJvcG9nYXRlZCB0byBvdGhlciBub2RlcwotICAgICAqIEB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLkNsdXN0ZXJpbmdGYXVsdAotICAgICAqICAgICAgICAgIElmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBwcm9jZXNzaW5nIHRoZQotICAgICAqICAgICAgICAgIGV4Y2VwdGlvbiBtZXNzYWdlCi0gICAgICovCi0gICAgdm9pZCBleGNlcHRpb25PY2N1cnJlZChUaHJvd2FibGUgdGhyb3dhYmxlKSB0aHJvd3MgQ2x1c3RlcmluZ0ZhdWx0OwotCi0gICAgLyoqCi0gICAgICogRm9yIHJlZ2lzdGVyaW5nIGEgY29uZmlndXJhdGlvbiBldmVudCBsaXN0ZW5lci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgQ29uZmlndXJhdGlvbk1hbmFnZXJMaXN0ZW5lciBpbnN0YW5jZQotICAgICAqLwotICAgIHZvaWQgc2V0Q29uZmlndXJhdGlvbk1hbmFnZXJMaXN0ZW5lcihDb25maWd1cmF0aW9uTWFuYWdlckxpc3RlbmVyIGxpc3RlbmVyKTsKLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgc3lzdGVtJ3MgY29uZmlndXJhdGlvbiBjb250ZXh0LiBUaGlzIHdpbGwgYmUgdXNlZCBieSB0aGUgY2x1c3RlcmluZyBpbXBsZW1lbnRhdGlvbnMKLSAgICAgKiB0byBnZXQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIEF4aXMyIGVudmlyb25tZW50IGFuZCB0byBjb3JyZXNwb25kIHdpdGggdGhlIEF4aXMyIGVudmlyb25tZW50Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gY29uZmlndXJhdGlvbkNvbnRleHQgVGhlIGNvbmZpZ3VyYXRpb24gY29udGV4dAotICAgICAqLwotICAgIHZvaWQgc2V0Q29uZmlndXJhdGlvbkNvbnRleHQoQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlndXJhdGlvbkNvbnRleHQpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL2NvbmZpZ3VyYXRpb24vQ29uZmlndXJhdGlvbk1hbmFnZXJMaXN0ZW5lci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvY29uZmlndXJhdGlvbi9Db25maWd1cmF0aW9uTWFuYWdlckxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1MzY5NjQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvY29uZmlndXJhdGlvbi9Db25maWd1cmF0aW9uTWFuYWdlckxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGNvdW50ZXJwYXJ0IG9mIHtAbGluayBDb25maWd1cmF0aW9uTWFuYWdlcn0uIE9uIHRoZSBtZXNzYWdlIHNlbmRpbmcgc2lkZSwKLSAqIHRoZSBDb25maWd1cmF0aW9uTWFuYWdlciB3aWxsIHNlbmQgYSBjb250ZXh0IHJlcGxpY2F0aW9uIG1lc3NhZ2UsIHdoaWNoIG9uIHRoZSByZWNlaXZpbmcKLSAqIHNpZGUgd2lsbCBiZSBoYW5kZWQgb3ZlciB0byB0aGUgaW1wbGVtZW50ZXIgb2YgdGhpcyBpbnRlcmZhY2UuIFNvIHdoZW4gYSBub2RlIHNlbmRzIGEgbWVzc2FnZQotICogdGhyb3VnaCB1c2luZyBpdHMgQ29uZmlndXJhdGlvbk1hbmFnZXIsIGFsbCByZWNlaXZlcnMgd2lsbCBiZSBub3RpZmllZCB0aHJvdWdoIHRoZWlyIHJlc3BlY3RpdmUKLSAqIENvbmZpZ3VyYXRpb25NYW5hZ2VyTGlzdGVuZXJzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbmZpZ3VyYXRpb25NYW5hZ2VyTGlzdGVuZXIgewotCi0gICAgLyoqCi0gICAgICogTm90aWZpY2F0aW9uIHRoYXQgYSBsb2FkIHNlcnZpY2UgZ3JvdXBzIG1lc3NhZ2UgaGFzIGJlZW4gcmVjZWl2ZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29tbWFuZCBUaGUgbWVzc2FnZQotICAgICAqLwotICAgIHZvaWQgc2VydmljZUdyb3Vwc0xvYWRlZChDb25maWd1cmF0aW9uQ2x1c3RlcmluZ0NvbW1hbmQgY29tbWFuZCk7Ci0KLSAgICAvKioKLSAgICAgKiBOb3RpZmljYXRpb24gdGhhdCBhbiB1bmxvYWQgc2VlcnZpY2UgZ3JvdXBzIG1lc3NhZ2UgaGFzIGJlZW4gcmVjZWl2ZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29tbWFuZCAgVGhlIG1lc3NhZ2UKLSAgICAgKi8KLSAgICB2b2lkIHNlcnZpY2VHcm91cHNVbmxvYWRlZChDb25maWd1cmF0aW9uQ2x1c3RlcmluZ0NvbW1hbmQgY29tbWFuZCk7Ci0KLSAgICAvKioKLSAgICAgKiBOb3RpZmljYXRpb24gdGhhdCBhbiBhcHBseSBwb2xpY3kgdG8gc2VydmljZSBtZXNzYWdlIGhhcyBiZWVuIHJlY2VpdmVkLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbW1hbmQgVGhlIG1lc3NhZ2UKLSAgICAgKi8KLSAgICB2b2lkIHBvbGljeUFwcGxpZWQoQ29uZmlndXJhdGlvbkNsdXN0ZXJpbmdDb21tYW5kIGNvbW1hbmQpOwotCi0gICAgLyoqCi0gICAgICogTm90aWZpY2F0aW9uIHRoYXQgYSByZWxvYWQgY29uZmlndXJhdGlvbiBtZXNzYWdlIGhhcyBiZWVuIHJlY2VpdmVkLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbW1hbmQgVGhlIG1lc3NhZ2UKLSAgICAgKi8KLSAgICB2b2lkIGNvbmZpZ3VyYXRpb25SZWxvYWRlZChDb25maWd1cmF0aW9uQ2x1c3RlcmluZ0NvbW1hbmQgY29tbWFuZCk7Ci0KLSAgICAvKioKLSAgICAgKiBQcmVwYXJlIHRvIGNvbW1pdCBjcG1maWd1cmF0aW9uIGNoYW5nZXMKLSAgICAgKi8KLSAgICB2b2lkIHByZXBhcmVDYWxsZWQoKTsKLQotICAgIC8qKgotICAgICAqIFJvbGxiYWNrIGNvbmZpZ3VyYXRpb24gY2hhbmdlcwotICAgICAqLwotICAgIHZvaWQgcm9sbGJhY2tDYWxsZWQoKTsKLQotICAgIC8qKgotICAgICAqIENvbW1pdCBjb25maWd1cmF0aW9uIGNoYW5nZXMKLSAgICAgKi8KLSAgICB2b2lkIGNvbW1pdENhbGxlZCgpOwotCi0gICAgLyoqCi0gICAgICogQW4gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZCBvbiBhIHJlbW90ZSBub2RlIHdoaWxlIHByb2Nlc3NpbmcgYSBjb25maWd1cmF0aW9uIGNoYW5nZSBjb21tYW5kCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdGhyb3dhYmxlIFRoZSBleGNlcHRpb24gdGhhdCBvY2N1cnJlZCBvbiB0aGUgcmVtb3RlIG5vZGUKLSAgICAgKi8KLSAgICB2b2lkIGhhbmRsZUV4Y2VwdGlvbihUaHJvd2FibGUgdGhyb3dhYmxlKTsKLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgc3lzdGVtJ3MgY29uZmlndXJhdGlvbiBjb250ZXh0LiBUaGlzIHdpbGwgYmUgdXNlZCBieSB0aGUgY2x1c3RlcmluZyBpbXBsZW1lbnRhdGlvbnMKLSAgICAgKiB0byBnZXQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIEF4aXMyIGVudmlyb25tZW50IGFuZCB0byBjb3JyZXNwb25kIHdpdGggdGhlIEF4aXMyIGVudmlyb25tZW50Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gY29uZmlndXJhdGlvbkNvbnRleHQgVGhlIGNvbmZpZ3VyYXRpb24gY29udGV4dAotICAgICAqLwotICAgIHZvaWQgc2V0Q29uZmlndXJhdGlvbkNvbnRleHQoQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlndXJhdGlvbkNvbnRleHQpOwotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvY29udGV4dC9Db250ZXh0Q2x1c3RlcmluZ0NvbW1hbmQuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL2NvbnRleHQvQ29udGV4dENsdXN0ZXJpbmdDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4YTkyNGQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvY29udGV4dC9Db250ZXh0Q2x1c3RlcmluZ0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuQ2x1c3RlcmluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLkNsdXN0ZXJpbmdGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb250ZXh0Q2x1c3RlcmluZ0NvbW1hbmQgZXh0ZW5kcyBDbHVzdGVyaW5nQ29tbWFuZCB7Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBleGVjdXRlKENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQpIHRocm93cyBDbHVzdGVyaW5nRmF1bHQ7Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL2NvbnRleHQvQ29udGV4dE1hbmFnZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL2NvbnRleHQvQ29udGV4dE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzY0ODVjMy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9jb250ZXh0L0NvbnRleHRNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuY29udGV4dDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5DbHVzdGVyaW5nRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkFic3RyYWN0Q29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5QYXJhbWV0ZXJJbmNsdWRlOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIHJlc3BvbnNpYmxlIGZvciBoYW5kbGluZyBjb250ZXh0IHJlcGxpY2F0aW9uLiBUaGUgcHJvcGVydHkgY2hhbmdlcyBpbiB0aGUKLSAqIDxhIGhyZWY9Imh0dHA6Ly93d3cuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy93ZWJzZXJ2aWNlcy9saWJyYXJ5L3dzLWFwYWNoZWF4aXMyLyI+Ci0gKiBBeGlzMiBjb250ZXh0IGhpZXJhcmNoeQotICogPC9hPiBpbiB0aGlzIG5vZGUsIGFyZSBwcm9wYWdhdGVkIHRvIGFsbCBvdGhlciBub2RlcyBpbiB0aGUgY2x1c3Rlci4KLSAqIDwvcD4KLSAqIDxwPgotICogSXQgaXMgbm90IG1hbmRhdG9yeSB0byBoYXZlIGEgQ29udGV4dE1hbmFnZXIgaW4gYSBub2RlLiBJZiB3ZSBhcmUgbm90IGludGVyZXN0ZWQgaW4KLSAqIDxhIGhyZWY9Imh0dHA6Ly9hZmtoYW0ub3JnLzIwMDgvMDUvZGVmaW5pdGlvbi1vZi1oaWdoLWF2YWlsYWJpbGl0eS5odG1sIj4KLSAqIEhpZ2ggQXZhaWxhYmlsaXR5PC9hPiwgd2UgbWF5IGRpc2FibGUgY29udGV4dCByZXBsaWNhdGlvbiBieSBjb21tZW50aW5nIG91dCB0aGUgImNvbnRleHRNYW5hZ2VyIgotICogc2VjdGlvbiBpbiB0aGUgYXhpczIueG1sIGNsdXN0ZXIgY29uZmlndXJhdGlvbiBzZWN0aW9uLiBJbiBzdWNoIGEgc2NlbmF0aW8sIHRoZSBjbHVzdGVyIHdpbGwgYmUKLSAqIHVzZWQgb25seSBmb3IgdGhlIHB1cnBvc2Ugb2YKLSAqIDxhIGhyZWY9Imh0dHA6Ly9hZmtoYW0ub3JnLzIwMDgvMDUvZGVmaW5pdGlvbi1vZi1zY2FsYWJpbGl0eS5odG1sIj5TY2FsYWJpbGl0eTwvYT4KLSAqIDwvcD4KLSAqIDxwPgotICogVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgaW50ZXJmYWNlIGlzIHNldCBieSB0aGUKLSAqIHtAbGluayBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQuQ2x1c3RlckJ1aWxkZXJ9LCBieQotICogcmVhZGluZyB0aGUgICJjb250ZXh0TWFuYWdlciIgZWxlbWVudCBpbiB0aGUgYXhpczIueG1sCi0gKiA8cC8+Ci0gKiBlLmcuCi0gKiA8Y29kZT4KLSAqIDxiPgotICogPGNvbnRleHRNYW5hZ2VyIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXIuY29uZmlndXJhdGlvbi5UcmliZXNDb250ZXh0TWFuYWdlciI+Ci0gKiA8L2I+Ci0gKiA8L2NvZGU+Ci0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29udGV4dE1hbmFnZXIgZXh0ZW5kcyBQYXJhbWV0ZXJJbmNsdWRlIHsKLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHByb3BlcnRpZXMgaW4gYW4ge0BsaW5rIEFic3RyYWN0Q29udGV4dH0gYXJlIHVwZGF0ZWQuCi0gICAgICogVGhpcyBjb3VsZCBiZSBhZGRpdGlvbiBvZiBuZXcgcHJvcGVydGllcywgbW9kaWZpY2F0aW9ucyBvZiBleGlzdGluZyBwcm9wZXJ0aWVzIG9yCi0gICAgICogcmVtb3ZhbCBvZiBwcm9wZXJ0aWVzLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgdG8gYmUgcmVwbGljYXRlZAotICAgICAqIEB0aHJvd3MgQ2x1c3RlcmluZ0ZhdWx0IElmIHJlcGxpY2F0aW9uIGZhaWxzCi0gICAgICovCi0gICAgdm9pZCB1cGRhdGVDb250ZXh0KEFic3RyYWN0Q29udGV4dCBjb250ZXh0KSB0aHJvd3MgQ2x1c3RlcmluZ0ZhdWx0OwotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gb25lIG5lZWQgdG8gdXBkYXRlL3JlcGxpY2F0ZSBvbmx5IGNlcnRhaW5zIHByb3BlcnRpZXMgaW4gdGhlCi0gICAgICogc3BlY2lmaWVkIDxjb2RlPmNvbnRleHQ8L2NvZGU+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gY29udGV4dCAgICAgICBUaGUgQWJzdHJhY3RDb250ZXh0IGNvbnRhaW5pbmcgdGhlIHByb3BlcnRpZXMgdG8gYmUgcmVwbGljYXRlZAotICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWVzIFRoZSBuYW1lcyBvZiB0aGUgc3BlY2lmaWMgcHJvcGVydGllcyB0aGF0IHNob3VsZCBiZSByZXBsaWNhdGVkCi0gICAgICogQHRocm93cyBDbHVzdGVyaW5nRmF1bHQgSWYgcmVwbGljYXRpb24gZmFpbHMKLSAgICAgKi8KLSAgICB2b2lkIHVwZGF0ZUNvbnRleHQoQWJzdHJhY3RDb250ZXh0IGNvbnRleHQsIFN0cmluZ1tdIHByb3BlcnR5TmFtZXMpIHRocm93cyBDbHVzdGVyaW5nRmF1bHQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiBwcm9wZXJ0aWVzIGluIGEgY29sbGVjdGlvbiBvZiB7QGxpbmsgQWJzdHJhY3RDb250ZXh0fXMgYXJlIHVwZGF0ZWQuCi0gICAgICogVGhpcyBjb3VsZCBiZSBhZGRpdGlvbiBvZiBuZXcgcHJvcGVydGllcywgbW9kaWZpY2F0aW9ucyBvZiBleGlzdGluZyBwcm9wZXJ0aWVzIG9yCi0gICAgICogcmVtb3ZhbCBvZiBwcm9wZXJ0aWVzLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbnRleHRzIFRoZSBBYnN0cmFjdENvbnRleHRzIGNvbnRhaW5pbmcgdGhlIHByb3BlcnRpZXMgdG8gYmUgcmVwbGljYXRlZAotICAgICAqIEB0aHJvd3MgQ2x1c3RlcmluZ0ZhdWx0IElmIHJlcGxpY2F0aW9uIGZhaWxzCi0gICAgICovCi0gICAgdm9pZCB1cGRhdGVDb250ZXh0cyhBYnN0cmFjdENvbnRleHRbXSBjb250ZXh0cykgdGhyb3dzIENsdXN0ZXJpbmdGYXVsdDsKLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHtAbGluayBBYnN0cmFjdENvbnRleHR9IGlzIHJlbW92ZWQgZnJvbSB0aGUgc3lzdGVtCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgQWJzdHJhY3RDb250ZXh0IHRvIGJlIHJlbW92ZWQKLSAgICAgKiBAdGhyb3dzIENsdXN0ZXJpbmdGYXVsdCBJZiBjb250ZXh0IHJlbW92YWwgZmFpbHMKLSAgICAgKi8KLSAgICB2b2lkIHJlbW92ZUNvbnRleHQoQWJzdHJhY3RDb250ZXh0IGNvbnRleHQpIHRocm93cyBDbHVzdGVyaW5nRmF1bHQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIGlzIGEgY2hlY2sgdG8gc2VlIHdoZXRoZXIgdGhlIHByb3BlcnRpZXMgaW4gYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEFic3RyYWN0Q29udGV4dH0KLSAgICAgKiBzaG91bGQgYmUgcmVwbGljYXRlZC4gVGhpcyBhbGxvd3MgYW4gaW1wbGVtZW50ZXIgdG8gZGlzc2FsbG93IHRoZSByZXBsaWNhdGlvbiBvZiBwcm9wZXJ0aWVzCi0gICAgICogc3RvcmVkIGluIGEgY2VydGFpbiB0eXBlIG9mIGNvbnRleHQKLSAgICAgKgotICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBpbnN0YW5jZSBvZiBBYnN0cmFjdENvbnRleHQgdW5kZXIgY29uc2lkZXJhdGlvbgotICAgICAqIEByZXR1cm4gVHJ1ZSAtIGlmIHRoZSBwcm92aWRlZCB7QGxpbmsgQWJzdHJhY3RDb250ZXh0fSAgaXMgY2x1c3RlcmFibGUKLSAgICAgKi8KLSAgICBib29sZWFuIGlzQ29udGV4dENsdXN0ZXJhYmxlKEFic3RyYWN0Q29udGV4dCBjb250ZXh0KTsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBsaXN0ZW5lciBDb250ZXh0TWFuYWdlckxpc3RlbmVyCi0gICAgICovCi0gICAgdm9pZCBzZXRDb250ZXh0TWFuYWdlckxpc3RlbmVyKENvbnRleHRNYW5hZ2VyTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBzeXN0ZW0ncyBjb25maWd1cmF0aW9uIGNvbnRleHQuIFRoaXMgd2lsbCBiZSB1c2VkIGJ5IHRoZSBjbHVzdGVyaW5nIGltcGxlbWVudGF0aW9ucwotICAgICAqIHRvIGdldCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgQXhpczIgZW52aXJvbm1lbnQgYW5kIHRvIGNvcnJlc3BvbmQgd2l0aCB0aGUgQXhpczIgZW52aXJvbm1lbnQKLSAgICAgKgotICAgICAqIEBwYXJhbSBjb25maWd1cmF0aW9uQ29udGV4dCBUaGUgY29uZmlndXJhdGlvbiBjb250ZXh0Ci0gICAgICovCi0gICAgdm9pZCBzZXRDb25maWd1cmF0aW9uQ29udGV4dChDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWd1cmF0aW9uQ29udGV4dCk7Ci0KLSAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBBbGwgcHJvcGVydGllcyBpbiB0aGUgY29udGV4dCB3aXRoIHR5cGUgPGNvZGU+Y29udGV4dFR5cGU8L2NvZGU+IHdoaWNoIGhhdmUKLSAgICAgKiBuYW1lcyB0aGF0IG1hdGNoIHRoZSBzcGVjaWZpZWQgcGF0dGVybiB3aWxsIGJlIGV4Y2x1ZGVkIGZyb20gcmVwbGljYXRpb24uCi0gICAgICogPC9wPgotICAgICAqIDxwLz4KLSAgICAgKiA8cD4KLSAgICAgKiBPbmx5IHByZWZpeGVzIGFuZCBzdWZmaXhlcyBhcmUgYWxsb3dlZC4gZS5nLiB0aGUgbG9jYWxfKiBwYXR0ZXJuIGluZGljYXRlcyB0aGF0Ci0gICAgICogYWxsIHByb3BlcnR5IG5hbWVzIHN0YXJ0aW5nIHdpdGggbG9jYWxfIHNob3VsZCBiZSBvbWl0dGVkIGZyb20gcmVwbGljYXRpb24uICpfbG9jYWwgcGF0dGVybgotICAgICAqIGluZGljYXRlZCB0aGF0IGFsbCBwcm9wZXJ0eSBuYW1lcyBlbmRpbmcgd2l0aCBfbG9jYWwgc2hvdWxkIGJlIG9taXR0ZWQgZnJvbSByZXBsaWNhdGlvbi4KLSAgICAgKiAqIHBhdHRlcm4gaW5kaWNhdGVzIHRoYXQgYWxsIHByb3BlcnRpZXMgc2hvdWxkIGJlIGV4Y2x1ZGVkLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBHZW5lcmFsbHksIHdlIGNhbiB1c2UgdGhlIGNvbnRleHQgY2xhc3MgbmFtZSBhcyB0aGUgY29udGV4dCB0eXBlLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb250ZXh0VHlwZSBUaGUgdHlwZSBvZiB0aGUgY29udGV4dCBzdWNoIGFzCi0gICAgICogICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dCwKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LlNlcnZpY2VHcm91cENvbnRleHQgJgotICAgICAqICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuU2VydmljZUNvbnRleHQuCi0gICAgICogICAgICAgICAgICAgICAgICAgIEFsc28gImRlZmF1bHRzIiBpcyBhIHNwZWNpYWwgdHlwZSwgd2hpY2ggd2lsbCBhcHBseSB0byBhbGwgY29udGV4dHMKLSAgICAgKiBAcGFyYW0gcGF0dGVybnMgICAgVGhlIHBhdHRlcm5zCi0gICAgICovCi0gICAgdm9pZCBzZXRSZXBsaWNhdGlvbkV4Y2x1ZGVQYXR0ZXJucyhTdHJpbmcgY29udGV4dFR5cGUsIExpc3QgcGF0dGVybnMpOwotCi0gICAgLyoqCi0gICAgICogR2V0IGFsbCB0aGUgZXhjbHVkZWQgY29udGV4dCBwcm9wZXJ0eSBuYW1lIHBhdHRlcm5zCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIEFsbCB0aGUgZXhjbHVkZWQgcGF0dGVybiBvZiBhbGwgdGhlIGNvbnRleHRzLiBUaGUga2V5IG9mIHRoZSBNYXAgaXMgdGhlCi0gICAgICogICAgICAgICB0aGUgPGNvZGU+Y29udGV4dFR5cGU8L2NvZGU+LiBTZWUge0BsaW5rICNzZXRSZXBsaWNhdGlvbkV4Y2x1ZGVQYXR0ZXJucyhTdHJpbmcsTGlzdCl9LgotICAgICAqICAgICAgICAgVGhlIHZhbHVlcyBhcmUgb2YgdHlwZSB7QGxpbmsgTGlzdH0gb2Yge0BsaW5rIFN0cmluZ30gT2JqZWN0cywKLSAgICAgKiAgICAgICAgIHdoaWNoIGFyZSBhIGNvbGxlY3Rpb24gb2YgcGF0dGVybnMgdG8gYmUgZXhjbHVkZWQuCi0gICAgICogQHNlZSAjc2V0UmVwbGljYXRpb25FeGNsdWRlUGF0dGVybnMoU3RyaW5nLCBqYXZhLnV0aWwuTGlzdCkKLSAgICAgKi8KLSAgICBNYXAgZ2V0UmVwbGljYXRpb25FeGNsdWRlUGF0dGVybnMoKTsKLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL2NvbnRleHQvQ29udGV4dE1hbmFnZXJMaXN0ZW5lci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvY29udGV4dC9Db250ZXh0TWFuYWdlckxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllMzYyOGIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvY29udGV4dC9Db250ZXh0TWFuYWdlckxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLkNsdXN0ZXJpbmdGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgY291bnRlcGFydCBvZiB0aGUge0BsaW5rIENvbnRleHRNYW5hZ2VyfSBpbXBsZW1lbnRhdGlvbi4gT24gdGhlIG1lc3NhZ2Ugc2VuZGluZyBzaWRlLAotICogdGhlIENvbnRleHRNYW5hZ2VyIHdpbGwgc2VuZCBhIGNvbnRleHQgcmVwbGljYXRpb24gbWVzc2FnZSwgd2hpY2ggb24gdGhlIHJlY2VpdmluZwotICogc2lkZSB3aWxsIGJlIGhhbmRlZCBvdmVyIHRvIHRoZSBpbXBsZW1lbnRlciBvZiB0aGlzIGludGVyZmFjZS4gU28gd2hlbiBhIG5vZGUgc2VuZHMgYSBtZXNzYWdlCi0gKiB0aHJvdWdoIHVzaW5nIGl0cyBDb250ZXh0TWFuYWdlciwgYWxsIHJlY2VpdmVycyB3aWxsIGJlIG5vdGlmaWVkIHRocm91Z2ggdGhlaXIgcmVzcGVjdGl2ZQotICogQ29udGV4dE1hbmFnZXJMaXN0ZW5lcnMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29udGV4dE1hbmFnZXJMaXN0ZW5lciB7Ci0KLSAgICAvKioKLSAgICAgKiBOb3RpZmljYXRpb24gdGhhdCBhIGNvbnRleHQgcmVwbGljYXRpb24gbWVzc2FnZSBoYXMgYmVlbiByZWNlaXZlZC4gVGhlIHJlY2VpdmVyIHdpbGwgaGF2ZSB0bwotICAgICAqIHRha2UgYXBwcm9wcmlhdGUgYWN0aW9uIHRvIHByb2Nlc3MgdGhpcyBtZXNzYWdlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgY29udGV4dCByZXBsaWNhdGlvbiBtZXNzYWdlCi0gICAgICogQHRocm93cyBDbHVzdGVyaW5nRmF1bHQgSWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIHByb2Nlc3NpbmcgdGhlIHJlY2VpdmVkIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjb250ZXh0VXBkYXRlZChDb250ZXh0Q2x1c3RlcmluZ0NvbW1hbmQgbWVzc2FnZSkgdGhyb3dzIENsdXN0ZXJpbmdGYXVsdDsKLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgc3lzdGVtJ3MgY29uZmlndXJhdGlvbiBjb250ZXh0LiBUaGlzIHdpbGwgYmUgdXNlZCBieSB0aGUgY2x1c3RlcmluZyBpbXBsZW1lbnRhdGlvbnMKLSAgICAgKiB0byBnZXQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIEF4aXMyIGVudmlyb25tZW50IGFuZCB0byBjb3JyZXNwb25kIHdpdGggdGhlIEF4aXMyIGVudmlyb25tZW50Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gY29uZmlndXJhdGlvbkNvbnRleHQgVGhlIGNvbmZpZ3VyYXRpb24gY29udGV4dAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENvbmZpZ3VyYXRpb25Db250ZXh0KENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ3VyYXRpb25Db250ZXh0KTsKLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL2NvbnRleHQvUmVwbGljYXRvci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvY29udGV4dC9SZXBsaWNhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2NDg1YTcuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvY29udGV4dC9SZXBsaWNhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuY29udGV4dDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5DbHVzdGVyTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuQ2x1c3RlcmluZ0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5BYnN0cmFjdENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuU2VydmljZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LlNlcnZpY2VHcm91cENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIFJlcGxpY2F0ZXMgc2VyaWFsaXphYmxlIHByb3BlcnRpZXMKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFJlcGxpY2F0b3IgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFJlcGxpY2F0b3IuY2xhc3MpOwotCi0gICAgLyoqCi0gICAgICogUmVwbGljYXRlcyBhbGwgc2VyaWFsaXphYmxlIHByb3BlcnRpZXMgaW4gdGhlIENvbmZpZ3VyYXRpb25Db250ZXh0LCBTZXJ2aWNlR3JvdXBDb250ZXh0ICYKLSAgICAgKiBTZXJ2aWNlQ29udGV4dAotICAgICAqCi0gICAgICogQHBhcmFtIG1zZ0NvbnRleHQgVGhlIE1lc3NhZ2VDb250ZXh0IGFzc29jaWF0ZWQgd2l0aCB0aGUgU2VydmljZUNvbnRleHQsCi0gICAgICogICAgICAgICAgICAgICAgICAgU2VydmljZUdyb3VwQ29udGV4dCBhbmQgQ29uZmlndXJhdGlvbkNvbnRleHQgdG8gYmUgcmVwbGljYXRlZAotICAgICAqIEB0aHJvd3MgQ2x1c3RlcmluZ0ZhdWx0IElmIHJlcGxpY2F0aW9uIGZhaWxzCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlcGxpY2F0ZShNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB0aHJvd3MgQ2x1c3RlcmluZ0ZhdWx0IHsKLSAgICAgICAgaWYgKCFjYW5SZXBsaWNhdGUobXNnQ29udGV4dCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBsb2cuZGVidWcoIkdvaW5nIHRvIHJlcGxpY2F0ZSBzdGF0ZSBzdG9yZWQgaW4gQ29uZmlndXJhdGlvbkNvbnRleHQsIiArCi0gICAgICAgICAgICAgICAgICAiIFNlcnZpY2VHcm91cENvbnRleHQsIFNlcnZpY2VDb250ZXh0IGFzc29jaWF0ZWQgd2l0aCAiICsgbXNnQ29udGV4dCArICIuLi4iKTsKLSAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlndXJhdGlvbkNvbnRleHQgPSBtc2dDb250ZXh0LmdldENvbmZpZ3VyYXRpb25Db250ZXh0KCk7Ci0gICAgICAgIENvbnRleHRNYW5hZ2VyIGNvbnRleHRNYW5hZ2VyID0gZ2V0Q29udGV4dE1hbmFnZXIobXNnQ29udGV4dCk7Ci0gICAgICAgIExpc3QgY29udGV4dHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgLy8gRG8gd2UgbmVlZCB0byByZXBsaWNhdGUgc3RhdGUgc3RvcmVkIGluIENvbmZpZ3VyYXRpb25Db250ZXh0PwotICAgICAgICBpZiAoIWNvbmZpZ3VyYXRpb25Db250ZXh0LmdldFByb3BlcnR5RGlmZmVyZW5jZXMoKS5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGNvbnRleHRzLmFkZChjb25maWd1cmF0aW9uQ29udGV4dCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBEbyB3ZSBuZWVkIHRvIHJlcGxpY2F0ZSBzdGF0ZSBzdG9yZWQgaW4gU2VydmljZUdyb3VwQ29udGV4dD8KLSAgICAgICAgU2VydmljZUdyb3VwQ29udGV4dCBzZ0NvbnRleHQgPSBtc2dDb250ZXh0LmdldFNlcnZpY2VHcm91cENvbnRleHQoKTsKLSAgICAgICAgaWYgKHNnQ29udGV4dCAhPSBudWxsICYmICFzZ0NvbnRleHQuZ2V0UHJvcGVydHlEaWZmZXJlbmNlcygpLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgY29udGV4dHMuYWRkKHNnQ29udGV4dCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBEbyB3ZSBuZWVkIHRvIHJlcGxpY2F0ZSBzdGF0ZSBzdG9yZWQgaW4gU2VydmljZUNvbnRleHQ/Ci0gICAgICAgIFNlcnZpY2VDb250ZXh0IHNlcnZpY2VDb250ZXh0ID0gbXNnQ29udGV4dC5nZXRTZXJ2aWNlQ29udGV4dCgpOwotICAgICAgICBpZiAoc2VydmljZUNvbnRleHQgIT0gbnVsbCAmJiAhc2VydmljZUNvbnRleHQuZ2V0UHJvcGVydHlEaWZmZXJlbmNlcygpLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgY29udGV4dHMuYWRkKHNlcnZpY2VDb250ZXh0KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIERvIHRoZSBhY3R1YWwgcmVwbGljYXRpb24gaGVyZQotICAgICAgICBpZiAoIWNvbnRleHRzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgQWJzdHJhY3RDb250ZXh0W10gY29udGV4dEFycmF5ID0KLSAgICAgICAgICAgICAgICAgICAgKEFic3RyYWN0Q29udGV4dFtdKSBjb250ZXh0cy50b0FycmF5KG5ldyBBYnN0cmFjdENvbnRleHRbY29udGV4dHMuc2l6ZSgpXSk7Ci0gICAgICAgICAgICBjb250ZXh0TWFuYWdlci51cGRhdGVDb250ZXh0cyhjb250ZXh0QXJyYXkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVwbGljYXRlIGFsbCBzZXJpYWxpemFibGUgcHJvcGVydGllcyBzdG9yZWQgaW4gdGhlIGdpdmVuIDxjb2RlPmFic3RyYWN0Q29udGV4dDwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYWJzdHJhY3RDb250ZXh0IFRoZSBBYnN0cmFjdENvbnRleHQgd2hpY2ggaG9sZHMgdGhlIHByb3BlcnRpZXMgdG8gYmUgcmVwbGljYXRlZAotICAgICAqIEB0aHJvd3MgQ2x1c3RlcmluZ0ZhdWx0IElmIHJlcGxpY2F0aW9uIGZhaWxzCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlcGxpY2F0ZShBYnN0cmFjdENvbnRleHQgYWJzdHJhY3RDb250ZXh0KSB0aHJvd3MgQ2x1c3RlcmluZ0ZhdWx0IHsKLSAgICAgICAgaWYgKCFjYW5SZXBsaWNhdGUoYWJzdHJhY3RDb250ZXh0KSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGxvZy5kZWJ1ZygiR29pbmcgdG8gcmVwbGljYXRlIHN0YXRlIGluICIgKyBhYnN0cmFjdENvbnRleHQgKyAiLi4uIik7Ci0gICAgICAgIENvbnRleHRNYW5hZ2VyIGNvbnRleHRNYW5hZ2VyID0gZ2V0Q29udGV4dE1hbmFnZXIoYWJzdHJhY3RDb250ZXh0KTsKLSAgICAgICAgaWYgKCFhYnN0cmFjdENvbnRleHQuZ2V0UHJvcGVydHlEaWZmZXJlbmNlcygpLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgY29udGV4dE1hbmFnZXIudXBkYXRlQ29udGV4dChhYnN0cmFjdENvbnRleHQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVwbGljYXRlIGFsbCB0aGUgcHJvcGVydGllcyBnaXZlbiBpbiA8Y29kZT5wcm9wZXJ0eU5hbWVzPC9jb2RlPgotICAgICAqIGluIHRoZSBzcGVjaWZpZWQgPGNvZGU+YWJzdHJhY3RDb250ZXh0PC9jb2RlPgotICAgICAqCi0gICAgICogQHBhcmFtIGFic3RyYWN0Q29udGV4dCBUaGUgY29udGV4dCB0byBiZSByZXBsaWNhdGVkCi0gICAgICogQHBhcmFtIHByb3BlcnR5TmFtZXMgICBUaGUgbmFtZXMgb2YgdGhlIHByb3BlcnRpZXMgdG8gYmUgcmVwbGljYXRlZAotICAgICAqIEB0aHJvd3MgQ2x1c3RlcmluZ0ZhdWx0IElGIHJlcGxpY2F0aW9uIGZhaWxzCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlcGxpY2F0ZShBYnN0cmFjdENvbnRleHQgYWJzdHJhY3RDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gcHJvcGVydHlOYW1lcykgdGhyb3dzIENsdXN0ZXJpbmdGYXVsdCB7Ci0gICAgICAgIGlmICghY2FuUmVwbGljYXRlKGFic3RyYWN0Q29udGV4dCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBsb2cuZGVidWcoIkdvaW5nIHRvIHJlcGxpY2F0ZSBzZWxlY3RlZCBwcm9wZXJ0aWVzIGluICIgKyBhYnN0cmFjdENvbnRleHQgKyAiLi4uIik7Ci0gICAgICAgIENvbnRleHRNYW5hZ2VyIGNvbnRleHRNYW5hZ2VyID0gZ2V0Q29udGV4dE1hbmFnZXIoYWJzdHJhY3RDb250ZXh0KTsKLSAgICAgICAgY29udGV4dE1hbmFnZXIudXBkYXRlQ29udGV4dChhYnN0cmFjdENvbnRleHQsIHByb3BlcnR5TmFtZXMpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIENsdXN0ZXJNYW5hZ2VyIGdldENsdXN0ZXJNYW5hZ2VyKEFic3RyYWN0Q29udGV4dCBhYnN0cmFjdENvbnRleHQpIHsKLSAgICAgICAgcmV0dXJuIGFic3RyYWN0Q29udGV4dC5nZXRSb290Q29udGV4dCgpLmdldEF4aXNDb25maWd1cmF0aW9uKCkuZ2V0Q2x1c3Rlck1hbmFnZXIoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBDb250ZXh0TWFuYWdlciBnZXRDb250ZXh0TWFuYWdlcihBYnN0cmFjdENvbnRleHQgYWJzdHJhY3RDb250ZXh0KSB7Ci0gICAgICAgIHJldHVybiBnZXRDbHVzdGVyTWFuYWdlcihhYnN0cmFjdENvbnRleHQpLmdldENvbnRleHRNYW5hZ2VyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2sgd2hldGhlciB0aGUgc3RhdGUgc3RvcmUgaW4gdGhlIHNwZWNpZmllZCA8Y29kZT5hYnN0cmFjdENvbnRleHQ8L2NvZGU+IGNhbiBiZSByZXBsaWNhdGVkLgotICAgICAqIEFsc28gbm90ZSB0aGF0IGlmIHRoZXJlIGFyZSBubyBtZW1iZXJzLCB3ZSBuZWVkIG5vdCBkbyBhbnkgcmVwbGljYXRpb24KLSAgICAgKgotICAgICAqIEBwYXJhbSBhYnN0cmFjdENvbnRleHQgVGhlIGNvbnRleHQgdG8gYmUgc3ViamVjdGVkIHRvIHRoaXMgdGVzdAotICAgICAqIEByZXR1cm4gdHJ1ZSAtIFN0YXRlIG5lZWRzIHRvIGJlIHJlcGxpY2F0ZWQKLSAgICAgKiAgICAgICAgIGZhbHNlIC0gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjYW5SZXBsaWNhdGUoQWJzdHJhY3RDb250ZXh0IGFic3RyYWN0Q29udGV4dCkgewotICAgICAgICBDbHVzdGVyTWFuYWdlciBjbHVzdGVyTWFuYWdlciA9Ci0gICAgICAgICAgICAgICAgYWJzdHJhY3RDb250ZXh0LmdldFJvb3RDb250ZXh0KCkuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5nZXRDbHVzdGVyTWFuYWdlcigpOwotICAgICAgICBib29sZWFuIGNhblJlcGxpY2F0ZSA9IGZhbHNlOwotICAgICAgICBpZiAoY2x1c3Rlck1hbmFnZXIgIT0gbnVsbCAmJiBjbHVzdGVyTWFuYWdlci5nZXRDb250ZXh0TWFuYWdlcigpICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNhblJlcGxpY2F0ZSA9Ci0gICAgICAgICAgICAgICAgICAgIGNsdXN0ZXJNYW5hZ2VyLmdldENvbnRleHRNYW5hZ2VyKCkuaXNDb250ZXh0Q2x1c3RlcmFibGUoYWJzdHJhY3RDb250ZXh0KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY2FuUmVwbGljYXRlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrIHdoZXRoZXIgdGhlIHN0YXRlIHN0b3JlIGluIHRoZSBzcGVjaWZpZWQgPGNvZGU+bWVzc2FnZUNvbnRleHQ8L2NvZGU+IGNhbiBiZSByZXBsaWNhdGVkLgotICAgICAqIEFsc28gbm90ZSB0aGF0IGlmIHRoZXJlIGFyZSBubyBtZW1iZXJzLCB3ZSBuZWVkIG5vdCBkbyBhbnkgcmVwbGljYXRpb24KLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXNzYWdlQ29udGV4dCBUaGUgTWVzc2FnZUNvbnRleHQgdG8gYmUgc3ViamVjdGVkIHRvIHRoaXMgdGVzdAotICAgICAqIEByZXR1cm4gdHJ1ZSAtIFN0YXRlIG5lZWRzIHRvIGJlIHJlcGxpY2F0ZWQKLSAgICAgKiAgICAgICAgIGZhbHNlIC0gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjYW5SZXBsaWNhdGUoTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQpIHsKLSAgICAgICAgQ2x1c3Rlck1hbmFnZXIgY2x1c3Rlck1hbmFnZXIgPQotICAgICAgICAgICAgICAgIG1lc3NhZ2VDb250ZXh0LmdldFJvb3RDb250ZXh0KCkuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5nZXRDbHVzdGVyTWFuYWdlcigpOwotICAgICAgICByZXR1cm4gY2x1c3Rlck1hbmFnZXIgIT0gbnVsbCAmJiBjbHVzdGVyTWFuYWdlci5nZXRDb250ZXh0TWFuYWdlcigpICE9IG51bGw7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvbnRleHQvQWJzdHJhY3RDb250ZXh0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY29udGV4dC9BYnN0cmFjdENvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmE0Mzc4Ni4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY29udGV4dC9BYnN0cmFjdENvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0OwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5DbHVzdGVyTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuY29udGV4dC5SZXBsaWNhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5KYXZhVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLlV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIHRvcCBtb3N0IGxldmVsIG9mIHRoZSBDb250ZXh0IGhpZXJhcmNoeSBhbmQgaXMgYSBiYWcgb2YgcHJvcGVydGllcy4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Q29udGV4dCB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coQWJzdHJhY3RDb250ZXh0LmNsYXNzKTsKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9NQVBfU0laRSA9IDY0OwotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gREVCVUdfRU5BQkxFRCA9IGxvZy5pc1RyYWNlRW5hYmxlZCgpOwotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gREVCVUdfUFJPUEVSVFlfU0VUID0gZmFsc2U7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUHJvcGVydHkgdXNlZCB0byBpbmRpY2F0ZSBjb3B5aW5nIG9mIHByb3BlcnRpZXMgaXMgbmVlZGVkIGJ5IGNvbnRleHQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09QWV9QUk9QRVJUSUVTID0gIkNvcHlQcm9wZXJ0aWVzIjsKLQotICAgIHByb3RlY3RlZCBsb25nIGxhc3RUb3VjaGVkVGltZTsKLQotICAgIHByb3RlY3RlZCB0cmFuc2llbnQgQWJzdHJhY3RDb250ZXh0IHBhcmVudDsKLSAgICBwcm90ZWN0ZWQgdHJhbnNpZW50IE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllczsKLSAgICBwcml2YXRlIHRyYW5zaWVudCBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnR5RGlmZmVyZW5jZXM7Ci0KLSAgICBwcm90ZWN0ZWQgQWJzdHJhY3RDb250ZXh0KEFic3RyYWN0Q29udGV4dCBwYXJlbnQpIHsKLSAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0Q29udGV4dCgpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHBhcmVudCBvZiB0aGlzIGNvbnRleHQuCi0gICAgICovCi0gICAgcHVibGljIEFic3RyYWN0Q29udGV4dCBnZXRQYXJlbnQoKSB7Ci0gICAgICAgIHJldHVybiBwYXJlbnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGNvbnRleHQKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNvbnRleHQgaXMgYW4gYW5jZXN0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0FuY2VzdG9yKEFic3RyYWN0Q29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIGlmIChjb250ZXh0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKEFic3RyYWN0Q29udGV4dCBhbmNlc3RvciA9IGdldFBhcmVudCgpOwotICAgICAgICAgICAgYW5jZXN0b3IgIT0gbnVsbDsKLSAgICAgICAgICAgIGFuY2VzdG9yID0gYW5jZXN0b3IuZ2V0UGFyZW50KCkpIHsKLSAgICAgICAgICAgIGlmIChhbmNlc3RvciA9PSBjb250ZXh0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBwcm9wZXJ0aWVzCi0gICAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAjZ2V0UHJvcGVydHlOYW1lcygpfSwge0BsaW5rICNnZXRQcm9wZXJ0eShTdHJpbmcpfSwKLSAgICAgKiAgICAgICAgICAgICB7QGxpbmsgI3NldFByb3BlcnR5KFN0cmluZywgT2JqZWN0KX0gJiB7QGxpbmsgI3JlbW92ZVByb3BlcnR5KFN0cmluZyl9aW5zdGVhZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiBnZXRQcm9wZXJ0aWVzKCkgewotICAgICAgICBpbml0UHJvcGVydGllc01hcCgpOwotICAgICAgICByZXR1cm4gcHJvcGVydGllczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBbiBpdGVyYXRvciBvdmVyIGEgY29sbGVjdGlvbiBvZiA8Y29kZT5TdHJpbmc8L2NvZGU+IG9iamVjdHMsIHdoaWNoIGFyZSB0aGUKLSAgICAgKiBrZXlzIGluIHRoZSBwcm9wZXJ0aWVzIG9iamVjdC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gSXRlcmF0b3Igb3ZlciBhIGNvbGxlY3Rpb24gb2Yga2V5cwotICAgICAqLwotICAgIHB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGdldFByb3BlcnR5TmFtZXMoKSB7Ci0gICAgICAgIGluaXRQcm9wZXJ0aWVzTWFwKCk7Ci0gICAgICAgIEhhc2hTZXQ8U3RyaW5nPiBjb3B5S2V5U2V0ID0gbnVsbDsKLSAgICAgICAgLy8gTG9jayB0aGUgdGFibGUgaW4gYSB0cnkvY2F0Y2ggc28gaXQgd2lsbCBhbHdheXMgYmUgdW5sb2NrZWQgaW4gdGhlIGZpbmFsbHkgYmxvY2sKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICgoSGFzaE1hcFVwZGF0ZUxvY2thYmxlPFN0cmluZywgT2JqZWN0PikgcHJvcGVydGllcykubG9ja0ZvclVwZGF0ZSgpOwotICAgICAgICAgICAgY29weUtleVNldCA9IG5ldyBIYXNoU2V0PFN0cmluZz4ocHJvcGVydGllcy5rZXlTZXQoKSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAoKEhhc2hNYXBVcGRhdGVMb2NrYWJsZTxTdHJpbmcsIE9iamVjdD4pIHByb3BlcnRpZXMpLnVubG9ja0ZvclVwZGF0ZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAoY29weUtleVNldCAhPSBudWxsKSA/IGNvcHlLZXlTZXQuaXRlcmF0b3IoKSA6IG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0cmlldmVzIGFuIG9iamVjdCBnaXZlbiBhIGtleS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXkgLSBpZiBub3QgZm91bmQsIHdpbGwgcmV0dXJuIG51bGwKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHByb3BlcnR5LgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIGtleSkgewotICAgICAgICBPYmplY3Qgb2JqID0gcHJvcGVydGllcyA9PSBudWxsID8gbnVsbCA6IHByb3BlcnRpZXMuZ2V0KGtleSk7Ci0gICAgICAgIGlmIChvYmohPW51bGwpIHsKLSAgICAgICAgICAgIC8vIEFzc3VtZSB0aGF0IGEgcHJvcGVydHkgd2hpY2ggaXMgcmVhZCBtYXkgYmUgdXBkYXRlZC4KLSAgICAgICAgICAgIC8vIGkuZS4gVGhlIG9iamVjdCBwb2ludGVkIHRvIGJ5ICd2YWx1ZScgbWF5IGJlIG1vZGlmaWVkIGFmdGVyIGl0IGlzIHJlYWQKLSAgICAgICAgICAgIGFkZFByb3BlcnR5RGlmZmVyZW5jZShrZXksIG9iaiwgZmFsc2UpOwotICAgICAgICB9IGVsc2UgaWYgKHBhcmVudCE9bnVsbCkgewotICAgICAgICAgICAgb2JqID0gcGFyZW50LmdldFByb3BlcnR5KGtleSk7Ci0gICAgICAgIH0gCi0gICAgICAgIHJldHVybiBvYmo7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0cmlldmVzIGFuIG9iamVjdCBnaXZlbiBhIGtleS4gT25seSBzZWFyY2hlcyBhdCB0aGlzIGxldmVsCi0gICAgICogaS5lLiBnZXRMb2NhbFByb3BlcnR5IG9uIE1lc3NhZ2VDb250ZXh0IGRvZXMgbm90IGxvb2sgaW4KLSAgICAgKiB0aGUgT3BlcmF0aW9uQ29udGV4dCBwcm9wZXJ0aWVzIG1hcCBpZiBhIGxvY2FsIHJlc3VsdCBpcyBub3QKLSAgICAgKiBmb3VuZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXkgLSBpZiBub3QgZm91bmQsIHdpbGwgcmV0dXJuIG51bGwKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHByb3BlcnR5LgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0TG9jYWxQcm9wZXJ0eShTdHJpbmcga2V5KSB7Ci0gICAgICAgIE9iamVjdCBvYmogPSBwcm9wZXJ0aWVzID09IG51bGwgPyBudWxsIDogcHJvcGVydGllcy5nZXQoa2V5KTsKLSAgICAgICAgaWYgKChvYmogPT0gbnVsbCkgJiYgKHBhcmVudCAhPSBudWxsKSkgewotICAgICAgICAgICAgLy8gVGhpcyBpcyBnZXRMb2NhbFByb3BlcnR5KCkgZG9uJ3Qgc2VhcmNoIHRoZSBoaWVyYXJjaHkuCi0gICAgICAgIH0gZWxzZSB7Ci0KLSAgICAgICAgICAgIC8vIEFzc3VtZSB0aGF0IGEgcHJvcGVydHkgaXMgd2hpY2ggaXMgcmVhZCBtYXkgYmUgdXBkYXRlZC4KLSAgICAgICAgICAgIC8vIGkuZS4gVGhlIG9iamVjdCBwb2ludGVkIHRvIGJ5ICd2YWx1ZScgbWF5IGJlIG1vZGlmaWVkIGFmdGVyIGl0IGlzIHJlYWQKLSAgICAgICAgICAgIGFkZFByb3BlcnR5RGlmZmVyZW5jZShrZXksIG9iaiwgZmFsc2UpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBvYmo7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHJpZXZlcyBhbiBvYmplY3QgZ2l2ZW4gYSBrZXkuIFRoZSByZXRyaWV2ZWQgcHJvcGVydHkgd2lsbCBub3QgYmUgcmVwbGljYXRlZCB0bwotICAgICAqIG90aGVyIG5vZGVzIGluIHRoZSBjbHVzdGVyZWQgc2NlbmFyaW8uCi0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5IC0gaWYgbm90IGZvdW5kLCB3aWxsIHJldHVybiBudWxsCi0gICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBwcm9wZXJ0eS4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5Tm9uUmVwbGljYWJsZShTdHJpbmcga2V5KSB7Ci0gICAgICAgIE9iamVjdCBvYmogPSBwcm9wZXJ0aWVzID09IG51bGwgPyBudWxsIDogcHJvcGVydGllcy5nZXQoa2V5KTsKLSAgICAgICAgaWYgKChvYmogPT0gbnVsbCkgJiYgKHBhcmVudCAhPSBudWxsKSkgewotICAgICAgICAgICAgb2JqID0gcGFyZW50LmdldFByb3BlcnR5Tm9uUmVwbGljYWJsZShrZXkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBvYmo7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RvcmUgYSBwcm9wZXJ0eSBpbiB0aGlzIGNvbnRleHQKLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXkKLSAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcga2V5LCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgaW5pdFByb3BlcnRpZXNNYXAoKTsKLSAgICAgICAgcHJvcGVydGllcy5wdXQoa2V5LCB2YWx1ZSk7Ci0gICAgICAgIGFkZFByb3BlcnR5RGlmZmVyZW5jZShrZXksIHZhbHVlLCBmYWxzZSk7Ci0gICAgICAgIGlmIChERUJVR19FTkFCTEVEKSB7Ci0gICAgICAgICAgICBkZWJ1Z1Byb3BlcnR5U2V0KGtleSwgdmFsdWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZFByb3BlcnR5RGlmZmVyZW5jZShTdHJpbmcga2V5LCBPYmplY3QgdmFsdWUsICBib29sZWFuIGlzUmVtb3ZlZCkgewotICAgICAgICAKLSAgICAgICAgaWYgKCFuZWVkUHJvcGVydHlEaWZmZXJlbmNlcygpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgLy8gTmFycm93ZWQgdGhlIHN5bmNocm9uaXphdGlvbiBzbyB0aGF0IHdlIG9ubHkgd2FpdAotICAgICAgICAvLyBpZiBhIHByb3BlcnR5IGRpZmZlcmVuY2UgaXMgYWRkZWQuCi0gICAgICAgIHN5bmNocm9uaXplZCh0aGlzKSB7Ci0gICAgICAgICAgICAvLyBMYXppemx5IGNyZWF0ZSBwcm9wZXJ0eURpZmZlcmVuY2VzIG1hcAotICAgICAgICAgICAgaWYgKHByb3BlcnR5RGlmZmVyZW5jZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHByb3BlcnR5RGlmZmVyZW5jZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oREVGQVVMVF9NQVBfU0laRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwcm9wZXJ0eURpZmZlcmVuY2VzLnB1dChrZXksIG5ldyBQcm9wZXJ0eURpZmZlcmVuY2Uoa2V5LCB2YWx1ZSwgaXNSZW1vdmVkKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0cnVlIGlmIHdlIG5lZWQgdG8gc3RvcmUgcHJvcGVydHkgZGlmZmVyZW5jZXMgZm9yIHRoaXMgCi0gICAgICogY29udGV4dCBpbiB0aGlzIHNjZW5hcmlvLgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBuZWVkUHJvcGVydHlEaWZmZXJlbmNlcygpIHsKLSAgICAgICAgCi0gICAgICAgIC8vIERvbid0IHN0b3JlIHByb3BlcnR5IGRpZmZlcmVuY2VzIGlmIHRoZXJlIGFyZSBubyAKLSAgICAgICAgLy8gY2x1c3RlciBtZW1iZXJzLgotICAgICAgICAKLSAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHQgY2MgPSBnZXRSb290Q29udGV4dCgpOwotICAgICAgICBpZiAoY2MgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIC8vIEFkZCB0aGUgcHJvcGVydHkgZGlmZmVyZW5jZXMgb25seSBpZiBDb250ZXh0IHJlcGxpY2F0aW9uIGlzIGVuYWJsZWQsCi0gICAgICAgIC8vIGFuZCB0aGVyZSBhcmUgbWVtYmVycyBpbiB0aGUgY2x1c3RlcgotICAgICAgICBDbHVzdGVyTWFuYWdlciBjbHVzdGVyTWFuYWdlciA9IGNjLmdldEF4aXNDb25maWd1cmF0aW9uKCkuZ2V0Q2x1c3Rlck1hbmFnZXIoKTsKLSAgICAgICAgaWYgKGNsdXN0ZXJNYW5hZ2VyID09IG51bGwgfHwKLSAgICAgICAgICAgIGNsdXN0ZXJNYW5hZ2VyLmdldENvbnRleHRNYW5hZ2VyKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN0b3JlIGEgcHJvcGVydHkgaW4gdGhpcyBjb250ZXh0LgotICAgICAqIEJ1dCB0aGVzZSBwcm9wZXJ0aWVzIHNob3VsZCBub3QgYmUgcmVwbGljYXRlZCB3aGVuIEF4aXMyIGlzIGNsdXN0ZXJlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXkKLSAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXROb25SZXBsaWNhYmxlUHJvcGVydHkoU3RyaW5nIGtleSwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIGluaXRQcm9wZXJ0aWVzTWFwKCk7Ci0gICAgICAgIHByb3BlcnRpZXMucHV0KGtleSwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZSBhIHByb3BlcnR5LiBPbmx5IHByb3BlcnRpZXMgYXQgdGhpcyBsZXZlbCB3aWxsIGJlIHJlbW92ZWQuCi0gICAgICogUHJvcGVydGllcyBvZiB0aGUgcGFyZW50cyBjYW5ub3QgYmUgcmVtb3ZlZCB1c2luZyB0aGlzIG1ldGhvZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXkKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlUHJvcGVydHkoU3RyaW5nIGtleSkgewotICAgICAgICBpZihwcm9wZXJ0aWVzID09IG51bGwpewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIE9iamVjdCB2YWx1ZSA9IHByb3BlcnRpZXMuZ2V0KGtleSk7Ci0gICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAocHJvcGVydGllcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcHJvcGVydGllcy5yZW1vdmUoa2V5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFkZFByb3BlcnR5RGlmZmVyZW5jZShrZXksIHZhbHVlLCB0cnVlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZSBhIHByb3BlcnR5LiBPbmx5IHByb3BlcnRpZXMgYXQgdGhpcyBsZXZlbCB3aWxsIGJlIHJlbW92ZWQuCi0gICAgICogUHJvcGVydGllcyBvZiB0aGUgcGFyZW50cyBjYW5ub3QgYmUgcmVtb3ZlZCB1c2luZyB0aGlzIG1ldGhvZC4KLSAgICAgKiBUaGUgcmVtb3ZhbCBvZiB0aGUgcHJvcGVydHkgd2lsbCBub3QgYmUgcmVwbGljYXRlZCB3aGVuIEF4aXMyIGlzIGNsdXN0ZXJlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXkKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlUHJvcGVydHlOb25SZXBsaWNhYmxlKFN0cmluZyBrZXkpIHsKLSAgICAgICAgaWYgKHByb3BlcnRpZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgcHJvcGVydGllcy5yZW1vdmUoa2V5KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgcHJvcGVydHkgZGlmZmVyZW5jZXMgc2luY2UgdGhlIGxhc3QgdHJhbnNtaXNzaW9uIGJ5IHRoZSBjbHVzdGVyaW5nCi0gICAgICogbWVjaGFuaXNtCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBwcm9wZXJ0eSBkaWZmZXJlbmNlcwotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgTWFwPFN0cmluZywgT2JqZWN0PiBnZXRQcm9wZXJ0eURpZmZlcmVuY2VzKCkgewotICAgICAgICBpZiAocHJvcGVydHlEaWZmZXJlbmNlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBwcm9wZXJ0eURpZmZlcmVuY2VzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KERFRkFVTFRfTUFQX1NJWkUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwcm9wZXJ0eURpZmZlcmVuY2VzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE9uY2UgdGhlIGNsdXN0ZXJpbmcgbWVjaGFuaXNtIHRyYW5zbWl0cyB0aGUgcHJvcGVydHkgZGlmZmVyZW5jZXMsCi0gICAgICogaXQgc2hvdWxkIGNhbGwgdGhpcyBtZXRob2QgdG8gYXZvaWQgcmV0cmFuc21pdHRpbmcgc3R1ZmYgdGhhdCBoYXMgYWxyZWFkeQotICAgICAqIGJlZW4gc2VudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgY2xlYXJQcm9wZXJ0eURpZmZlcmVuY2VzKCkgewotICAgICAgICBpZiAocHJvcGVydHlEaWZmZXJlbmNlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwcm9wZXJ0eURpZmZlcmVuY2VzLmNsZWFyKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gY29udGV4dAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFBhcmVudChBYnN0cmFjdENvbnRleHQgY29udGV4dCkgewotICAgICAgICBwYXJlbnQgPSBjb250ZXh0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgd2lsbCBzZXQgdGhlIHByb3BlcnRpZXMgdG8gdGhlIGNvbnRleHQuIEJ1dCBpbiBzZXR0aW5nIHRoYXQgb25lIG1heSBuZWVkIHRvICJjb3B5IiBhbGwKLSAgICAgKiB0aGUgcHJvcGVydGllcyBmcm9tIHRoZSBzb3VyY2UgcHJvcGVydGllcyB0byB0aGUgdGFyZ2V0IHByb3BlcnRpZXMuIFRvIGVuYWJsZSB0aGlzIHdlIGludHJvZHVjZWQKLSAgICAgKiBhIHByb3BlcnR5ICh7QGxpbmsgI0NPUFlfUFJPUEVSVElFU30pIHNvIHRoYXQgaWYgc2V0IHRvIHRydWUsIHRoaXMgY29kZQotICAgICAqIHdpbGwgY29weSB0aGUgd2hvbGUgdGhpbmcsIHdpdGhvdXQganVzdCByZWZlcmVuY2luZyB0byB0aGUgc291cmNlLgotICAgICAqCi0gICAgICogQHBhcmFtIHByb3BlcnRpZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0aWVzKE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykgewotICAgICAgICBpZiAocHJvcGVydGllcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aGlzLnByb3BlcnRpZXMgPSBudWxsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQm9vbGVhbiBjb3B5UHJvcGVydGllcyA9ICgoQm9vbGVhbikgcHJvcGVydGllcy5nZXQoQ09QWV9QUk9QRVJUSUVTKSk7Ci0KLSAgICAgICAgICAgIGlmICgoY29weVByb3BlcnRpZXMgIT0gbnVsbCkgJiYgY29weVByb3BlcnRpZXMuYm9vbGVhblZhbHVlKCkpIHsKLSAgICAgICAgICAgICAgICBtZXJnZVByb3BlcnRpZXMocHJvcGVydGllcyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmICh0aGlzLnByb3BlcnRpZXMgIT0gcHJvcGVydGllcykgewotICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUdfRU5BQkxFRCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvcjxFbnRyeTxTdHJpbmcsIE9iamVjdD4+IGl0ZXJhdG9yID0gcHJvcGVydGllcy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRW50cnk8U3RyaW5nLCBPYmplY3Q+IGVudHJ5ID0gaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnUHJvcGVydHlTZXQoKFN0cmluZykgZW50cnkuZ2V0S2V5KCksIGVudHJ5LmdldFZhbHVlKCkpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gVGhlIE1hcCB3ZSBnb3QgYXJndW1lbnQgaXMgcHJvYmFibHkgTk9UIGFuIGluc3RhbmNlIG9mIHRoZSBDb25jdXJyZW50IAotICAgICAgICAgICAgICAgIC8vIG1hcCB3ZSB1c2UgdG8gc3RvcmUgcHJvcGVydGllcywgc28gY3JlYXRlIGEgbmV3IG9uZSB1c2luZyB0aGUgdmFsdWVzIGZyb20gdGhlCi0gICAgICAgICAgICAgICAgLy8gYXJndW1lbnQgbWFwLgotICAgICAgICAgICAgICAgIHRoaXMucHJvcGVydGllcyA9IG5ldyBIYXNoTWFwVXBkYXRlTG9ja2FibGU8U3RyaW5nLCBPYmplY3Q+KHByb3BlcnRpZXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyB3aWxsIGRvIGEgY29weSBvZiB0aGUgZ2l2ZW4gcHJvcGVydGllcyB0byB0aGUgY3VycmVudCBwcm9wZXJ0aWVzCi0gICAgICogdGFibGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcHJvcHMgVGhlIHRhYmxlIG9mIHByb3BlcnRpZXMgdG8gY29weQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG1lcmdlUHJvcGVydGllcyhNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BzKSB7Ci0gICAgICAgIGlmIChwcm9wcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbml0UHJvcGVydGllc01hcCgpOwotICAgICAgICAgICAgZm9yIChJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gcHJvcHMua2V5U2V0KCkuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICAgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gcHJvcHMuZ2V0KGtleSk7Ci0gICAgICAgICAgICAgICAgdGhpcy5wcm9wZXJ0aWVzLnB1dChrZXksIHZhbHVlKTsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUdfRU5BQkxFRCkgewotICAgICAgICAgICAgICAgICAgICBkZWJ1Z1Byb3BlcnR5U2V0KChTdHJpbmcpIGtleSwgdmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlcnZpY2VDb250ZXh0IGFuZCBTZXJ2aWNlR3JvdXBDb250ZXh0IGFyZSBub3QgZ2V0dGluZyBhdXRvbWF0aWNhbGx5IGdhcmJhZ2UgY29sbGVjdGVkLiBBbmQgdGhlcmUKLSAgICAgKiBpcyBubyBzcGVjaWZpYyB3YXkgZm9yIHNvbWUgb25lIHRvIGdvIGFuZCBtYWtlIGl0IGdhcmJhZ2UgY29sbGVjdGlibGUuCi0gICAgICogU28gdGhlIGN1cnJlbnQgc29sdXRpb24gaXMgdG8gbWFrZSB0aGVtIHRpbWUgb3V0LiBTbyB0aGUgbG9naWMgaXMgdGhhdCwgdGhlcmUgaXMgYSB0aW1lciB0YXNrCi0gICAgICogaW4gZWFjaCBhbmQgZXZlcnkgc2VydmljZSBncm91cCB3aGljaCB3aWxsIGNoZWNrIGZvciB0aGUgbGFzdCB0b3VjaGVkIHRpbWUuIEFuZCBpZiBpdCBoYXMgbm90Ci0gICAgICogYmVlbiB0b3VjaGVkIGZvciBzb21lIHRpbWUsIHRoZSB0aW1lciB0YXNrIHdpbGwgcmVtb3ZlIGl0IGZyb20gdGhlIG1lbW9yeS4KLSAgICAgKiBUaGUgdG91Y2hpbmcgbG9naWMgaGFwcGVucyBsaWtlIHRoaXMuIFdoZW5ldmVyIHRoZXJlIGlzIGEgY2FsbCB0byBhZGRNZXNzYWdlQ29udGV4dCBpbiB0aGUgb3BlcmF0aW9uQ29udGV4dAotICAgICAqIGl0IHdpbGwgZ28gYW5kIHVwZGF0ZSBvcGVyYXRpb25DT250ZXh0IC0+IHNlcnZpY2VDb250ZXh0IC0+IHNlcnZpY2VHcm91cENvbnRleHQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgdG91Y2goKSB7Ci0gICAgICAgIGxhc3RUb3VjaGVkVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICBpZiAocGFyZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHBhcmVudC50b3VjaCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGxvbmcgZ2V0TGFzdFRvdWNoZWRUaW1lKCkgewotICAgICAgICByZXR1cm4gbGFzdFRvdWNoZWRUaW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldExhc3RUb3VjaGVkVGltZShsb25nIHQpIHsKLSAgICAgICAgbGFzdFRvdWNoZWRUaW1lID0gdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBmbHVzaCgpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBSZXBsaWNhdG9yLnJlcGxpY2F0ZSh0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgQ29uZmlndXJhdGlvbkNvbnRleHQgZ2V0Um9vdENvbnRleHQoKTsKLQotICAgIC8qKgotICAgICAqIERlYnVnIGZvciBmb3IgcHJvcGVydHkga2V5IGFuZCB2YWx1ZS4KLSAgICAgKiBAcGFyYW0ga2V5Ci0gICAgICogQHBhcmFtIHZhbHVlCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGRlYnVnUHJvcGVydHlTZXQoU3RyaW5nIGtleSwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIGlmIChERUJVR19QUk9QRVJUWV9TRVQpIHsKLSAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSAodmFsdWUgPT0gbnVsbCkgPyAibnVsbCIgOiB2YWx1ZS5nZXRDbGFzcygpLmdldE5hbWUoKTsKLSAgICAgICAgICAgIFN0cmluZyBjbGFzc2xvYWRlciA9ICJudWxsIjsKLSAgICAgICAgICAgIGlmKHZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBDbGFzc0xvYWRlciBjbCA9IFV0aWxzLmdldE9iamVjdENsYXNzTG9hZGVyKHZhbHVlKTsKLSAgICAgICAgICAgICAgICBpZihjbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNsYXNzbG9hZGVyID0gY2wudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTdHJpbmcgdmFsdWVUZXh0ID0gKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSA/IHZhbHVlLnRvU3RyaW5nKCkgOiBudWxsOwotICAgICAgICAgICAgU3RyaW5nIGlkZW50aXR5ID0gZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAnQCcgKyAKLSAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvSGV4U3RyaW5nKFN5c3RlbS5pZGVudGl0eUhhc2hDb2RlKHRoaXMpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgbG9nLmRlYnVnKCI9PT09PT09PT09PT09PT09PT0iKTsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiIFByb3BlcnR5IHNldCBvbiBvYmplY3QgIiArIGlkZW50aXR5KTsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiICBLZXkgPSIgKyBrZXkpOwotICAgICAgICAgICAgaWYgKHZhbHVlVGV4dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgIFZhbHVlID0iICsgdmFsdWVUZXh0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiICBWYWx1ZSBDbGFzcyA9ICIgKyBjbGFzc05hbWUpOwotICAgICAgICAgICAgbG9nLmRlYnVnKCIgIFZhbHVlIENsYXNzbG9hZGVyID0gIiArIGNsYXNzbG9hZGVyKTsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZyggICJDYWxsIFN0YWNrID0gIiArIEphdmFVdGlscy5jYWxsU3RhY2tUb1N0cmluZygpKTsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiPT09PT09PT09PT09PT09PT09Iik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogSWYgdGhlICdwcm9wZXJ0aWVzJyBtYXAgaGFzIG5vdCBiZWVuIGFsbG9jYXRlZCB5ZXQsIHRoZW4gYWxsb2NhdGUgaXQuIAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBpbml0UHJvcGVydGllc01hcCgpIHsKLSAgICAgICAgaWYgKHByb3BlcnRpZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gVGhpcyBuZWVkcyB0byBiZSBhIGNvbmN1cnJlbnQgY29sbGVjdGlvbiB0byBwcmV2ZW50IENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNwZXRpb25zCi0gICAgICAgICAgICAvLyBmb3IgYXN5bmMtb24tdGhlLXdpcmUuICBJdCB3YXMgb3JpZ2luYWxseTogCi0vLyAgICAgICAgICAgIHByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcChERUZBVUxUX01BUF9TSVpFKTsKLSAgICAgICAgICAgIHByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcFVwZGF0ZUxvY2thYmxlPFN0cmluZywgT2JqZWN0PihERUZBVUxUX01BUF9TSVpFKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotLyoqCi0gKiBIYXNoTWFwIHRoYXQgc3VwcG9ydHMgYW4gdXBkYXRlIGxvY2suICBIYXNoTWFwIG1ldGhvZHMgdGhhdCB3b3VsZCBkaXJlY3RseSB1cGRhdGUgdGhlIGNvbGxlY3Rpb24KLSAqIHdpbGwgYmxvY2sgaWYgdGhlIGNvbGxlY3Rpb24gaXMgbG9ja2VkLiAgVGhleSB3aWxsIGJlIHJlbGVhc2VkIHdoZW4gdGhlIGNvbGxlY3Rpb24gaXMgdW5sb2NrZWQuCi0gKiBNZXRob2RzIHRoYXQgZG8gbm90IHVwZGF0ZSB0aGUgY29sbGVjdGlvbiB3aWxsIG5vdCBiZSBibG9ja2VkLgotICovCi1jbGFzcyBIYXNoTWFwVXBkYXRlTG9ja2FibGU8SywgVj4gZXh0ZW5kcyBIYXNoTWFwPEssIFY+IHsKLQotICAgIC8vIFVzZWQgZm9yIHN5bmNocm9uaXphdGlvbiBkdXJpbmcgdXBkYXRlIGxvY2tpbmcuICBBbHNvIGluZGljYXRlcyBpZiB0aGUgdGFibGUgaXMgbG9ja2VkLgotICAgIC8vIEluaXRpYWxseSwgaXQgaXMgbm90IGxvY2tlZC4KLSAgICBwcml2YXRlIFVwZGF0ZUxvY2sgdXBkYXRlTG9jayA9IG5ldyBVcGRhdGVMb2NrKGZhbHNlKTsKLQotICAgIEhhc2hNYXBVcGRhdGVMb2NrYWJsZSgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0gICAgSGFzaE1hcFVwZGF0ZUxvY2thYmxlKGludCBzaXplKSB7Ci0gICAgICAgIHN1cGVyKHNpemUpOwotICAgIH0KLQotICAgIEhhc2hNYXBVcGRhdGVMb2NrYWJsZShNYXA8SywgVj4gbWFwKSB7Ci0gICAgICAgIHN1cGVyKG1hcCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2ltaWxhciB0byBzdXBlciBtZXRob2QgYnV0IHdpbGwgYmxvY2sgaWYgY29sbGVjdGlvbiBpcyBsb2NrZWQuCi0gICAgICogQHNlZSBqYXZhLnV0aWwuSGFzaE1hcCNwdXQoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgViBwdXQoSyBrZXksIFYgdmFsdWUpIHsKLSAgICAgICAgY2hlY2tVcGRhdGVMb2NrKHRydWUpOwotICAgICAgICByZXR1cm4gc3VwZXIucHV0KGtleSwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNpbWlsYXIgdG8gc3VwZXIgbWV0aG9kIGJ1dCB3aWxsIGJsb2NrIGlmIGNvbGxlY3Rpb24gaXMgbG9ja2VkLgotICAgICAqIEBzZWUgamF2YS51dGlsLkhhc2hNYXAjcHV0QWxsKGphdmEudXRpbC5NYXApCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcHV0QWxsKE1hcDw/IGV4dGVuZHMgSywgPyBleHRlbmRzIFY+IG1hcCkgewotICAgICAgICBjaGVja1VwZGF0ZUxvY2sodHJ1ZSk7Ci0gICAgICAgIHN1cGVyLnB1dEFsbChtYXApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNpbWlsYXIgdG8gc3VwZXIgbWV0aG9kIGJ1dCB3aWxsIGJsb2NrIGlmIGNvbGxlY3Rpb24gaXMgbG9ja2VkLgotICAgICAqIEBzZWUgamF2YS51dGlsLkhhc2hNYXAjcmVtb3ZlKGphdmEubGFuZy5PYmplY3QpCi0gICAgICovCi0gICAgcHVibGljIFYgcmVtb3ZlKE9iamVjdCBrZXkpIHsKLSAgICAgICAgY2hlY2tVcGRhdGVMb2NrKHRydWUpOwotICAgICAgICByZXR1cm4gc3VwZXIucmVtb3ZlKGtleSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTG9jayB0aGUgY29sbGVjdGlvbiBmb3IgdXBkYXRlLiAgTk9URTogVGhpcyBzaG91bGQgYmUgY2FsbGVkIGluc2lkZSBhIHRyeSBibG9jayBhbmQgdGhlIAotICAgICAqIHVubG9jayBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBpbnNpZGUgYSBmaW5hbGx5IGJsb2NrIHRvIGVuc3VyZSB0aGUgbG9jayBpcyBhbHdheXMKLSAgICAgKiByZWxlYXNlZCEgIElmIHRoZSBjb2xsZWN0aW9uIGlzIGxvY2tlZCwgbWV0aG9kcyB0aGF0IGRpcmVjdGx5IHVwZGF0ZSB0aGUgdGFibGUgd2lsbCAKLSAgICAgKiBibG9jayB1bnRpbCByZWxlYXNlZCBieSB0aGUgdW5sb2NrLgotICAgICAqIEBzZWUgI3VubG9ja0ZvclVwZGF0ZSgpCi0gICAgICovCi0gICAgdm9pZCBsb2NrRm9yVXBkYXRlKCkgewotICAgICAgICBzeW5jaHJvbml6ZWQodXBkYXRlTG9jaykgewotICAgICAgICAgICAgdXBkYXRlTG9jay5zZXRMb2NrKHRydWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVW5vY2sgdGhlIGNvbGxlY3Rpb24gZm9yIHVwZGF0ZS4gIE5PVEU6IFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBpbnNpZGUgYSBmaW5hbGx5IGJsb2NrIGFuZCB0aGUgCi0gICAgICogbG9jayBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBpbnNpZGUgYSB0cnkgYmxvY2sgdG8gZW5zdXJlIHRoZSBsb2NrIGlzIGFsd2F5cwotICAgICAqIHJlbGVhc2VkISAgSWYgdGhlIGNvbGxlY3Rpb24gaXMgbG9ja2VkLCBtZXRob2RzIHRoYXQgZGlyZWN0bHkgdXBkYXRlIHRoZSB0YWJsZSB3aWxsIAotICAgICAqIGJsb2NrIHVudGlsIHJlbGVhc2VkIGJ5IHRoaXMgdW5sb2NrLgotICAgICAqIEBzZWUgI2xvY2tGb3JVcGRhdGUoKQotICAgICAqLwotICAgIHZvaWQgdW5sb2NrRm9yVXBkYXRlKCkgewotICAgICAgICBzeW5jaHJvbml6ZWQodXBkYXRlTG9jaykgewotICAgICAgICAgICAgdXBkYXRlTG9jay5zZXRMb2NrKGZhbHNlKTsKLSAgICAgICAgICAgIHVwZGF0ZUxvY2subm90aWZ5QWxsKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVjayBpZiB0aGUgdXBkYXRlIGxvY2sgaXMgY3VycmVudGx5IGhlbGQuICBPcHRpb25hbGx5IGJsb2NrIHVudGlsIHRoZSBsb2NrIGlzIHJlbGVhc2VkLgotICAgICAqIEBwYXJhbSB3YWl0IElmIHRydWUsIHdpbGwgYmxvY2sgdW50aWwgdGhlIGxvY2sgaXMgcmVsZWFzZWQKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNvbGxlY3Rpb24gaXMgY3VycmVudGx5IGxvY2tlZCBmb3IgdXBkYXRlLCBmYWxzZSBpZiBpdCBpcyBub3QuCi0gICAgICovCi0gICAgYm9vbGVhbiBjaGVja1VwZGF0ZUxvY2soYm9vbGVhbiB3YWl0KSB7Ci0gICAgICAgIGJvb2xlYW4gaXNMb2NrZWQgPSBmYWxzZTsKLSAgICAgICAgc3luY2hyb25pemVkKHVwZGF0ZUxvY2spIHsKLSAgICAgICAgICAgIGlmICh3YWl0KSB7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKHVwZGF0ZUxvY2suaXNMb2NrZWQoKSkgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlTG9jay53YWl0KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZSB0aGUgaW50ZXJydXB0OyByZWNoZWNrIHRoZSBsb2NrIGFuZCB3YWl0IGlmIGFwcHJvcHJpYXRlLgotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaXNMb2NrZWQgPSB1cGRhdGVMb2NrLmlzTG9ja2VkKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gaXNMb2NrZWQ7Ci0gICAgfQotCi0gICAgY2xhc3MgVXBkYXRlTG9jayB7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBpc0xvY2tlZCA9IGZhbHNlOwotCi0gICAgICAgIFVwZGF0ZUxvY2soYm9vbGVhbiBpc0xvY2tlZCkgewotICAgICAgICAgICAgdGhpcy5pc0xvY2tlZCA9IGlzTG9ja2VkOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBzZXRMb2NrKGJvb2xlYW4gbG9ja1ZhbHVlKSB7Ci0gICAgICAgICAgICB0aGlzLmlzTG9ja2VkID0gbG9ja1ZhbHVlOwotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbGVhbiBpc0xvY2tlZCgpIHsKLSAgICAgICAgICAgIHJldHVybiBpc0xvY2tlZDsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb250ZXh0L0NvbmZpZ3VyYXRpb25Db250ZXh0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY29udGV4dC9Db25maWd1cmF0aW9uQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzZhNzI1Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb250ZXh0L0NvbmZpZ3VyYXRpb25Db250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY29udGV4dDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5VVUlER2VuZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5DbHVzdGVyTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuQ2x1c3RlcmluZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuY29udGV4dC5Db250ZXh0TWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2VHcm91cDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5EZXBlbmRlbmN5TWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5MaXN0ZW5lck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pMThuLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5KYXZhVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLnRocmVhZHBvb2wuVGhyZWFkRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwudGhyZWFkcG9vbC5UaHJlYWRQb29sOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50SGFzaE1hcDsKLQotLyoqCi0gKiA8cD5BeGlzMiBzdGF0ZXMgYXJlIGhlbGQgaW4gdHdvIGluZm9ybWF0aW9uIG1vZGVscywgY2FsbGVkIGRlc2NyaXB0aW9uIGhpZXJhcmNoeSBhbmQgY29udGV4dAotICogaGllcmFyY2h5LiBEZXNjcmlwdGlvbiBoaWVyYXJjaHkgaG9sZCBkZXBsb3ltZW50IGNvbmZpZ3VyYXRpb24gYW5kIGl0J3MgdmFsdWVzIGRvZXMgbm90IGNoYW5nZQotICogdW5sZXNzIGRlcGxveW1lbnQgY29uZmlndXJhdGlvbiBjaGFuZ2Ugb2NjdXJzIHdoZXJlIENvbnRleHQgaGllcmFyY2h5IGhvbGQgcnVuIHRpbWUgaW5mb3JtYXRpb24uCi0gKiBCb3RoIGhpZXJhcmNoaWVzIGNvbnNpc3RzIGZvdXIgbGV2ZWxzLCBHbG9iYWwsIFNlcnZpY2UgR3JvdXAsIE9wZXJhdGlvbiBhbmQgTWVzc2FnZS4gUGxlYXNlIGxvb2sKLSAqIGF0ICJJbmZvcm1hdGlvbiBNb2RlbCIgc2VjdGlvbiAgb2YgIkF4aXMyIEFyY2hpdGVjdHVyZSBHdWlkZSIgZm9yIG1vcmUgaW5mb3JtYXRpb24uPC9wPgotICogPHAvPgotICogPHA+Q29uZmlndXJhdGlvbiBDb250ZXh0IGhvbGQgR2xvYmFsIGxldmVsIHJ1bi10aW1lIGluZm9ybWF0aW9uLiBUaGlzIGFsbG93cyBzYW1lIGNvbmZpZ3VyYXRpb25zCi0gKiB0byBiZSB1c2VkIGJ5IHR3byBBeGlzMiBpbnN0YW5jZXMgYW5kIG1vc3QgQXhpczIgd2lkZSBjb25maWd1cmF0aW9ucyBjYW4gY2hhbmdlZCBieSBzZXR0aW5nIG5hbWUKLSAqIHZhbHVlIHBhaXJzIG9mIHRoZSBjb25maWd1cmF0aW9uQ29udGV4dC4gVGhpcyBob2xkIGFsbCBPcGVyYXRpb25Db250ZXh0cywgU2VydmljZUdyb3VwcywKLSAqIFNlc3Npb25zLCBhbmQgTGlzdGVuZXJNYW5hZ2VyLgotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvbkNvbnRleHQgZXh0ZW5kcyBBYnN0cmFjdENvbnRleHQgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKENvbmZpZ3VyYXRpb25Db250ZXh0LmNsYXNzKTsKLSAgICAvKiogTWFwIGNvbnRhaW5pbmcgPGNvZGU+TWVzc2FnZUlEPC9jb2RlPiB0byA8Y29kZT5PcGVyYXRpb25Db250ZXh0PC9jb2RlPiBtYXBwaW5nLiAqLwotICAgIHByaXZhdGUgZmluYWwgQ29uY3VycmVudEhhc2hNYXA8U3RyaW5nLCBPcGVyYXRpb25Db250ZXh0PiBvcGVyYXRpb25Db250ZXh0TWFwID0gbmV3IENvbmN1cnJlbnRIYXNoTWFwPFN0cmluZywgT3BlcmF0aW9uQ29udGV4dD4oKTsKLSAgICBwcml2YXRlIGZpbmFsIEhhc2h0YWJsZTxTdHJpbmcsIFNlcnZpY2VHcm91cENvbnRleHQ+IHNlcnZpY2VHcm91cENvbnRleHRNYXAgPSBuZXcgSGFzaHRhYmxlPFN0cmluZywgU2VydmljZUdyb3VwQ29udGV4dD4oKTsKLSAgICBwcml2YXRlIEhhc2h0YWJsZTxTdHJpbmcsIFNlcnZpY2VHcm91cENvbnRleHQ+IGFwcGxpY2F0aW9uU2Vzc2lvblNlcnZpY2VHcm91cENvbnRleHRzID0gbmV3IEhhc2h0YWJsZTxTdHJpbmcsIFNlcnZpY2VHcm91cENvbnRleHQ+KCk7Ci0gICAgcHJpdmF0ZSBBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlndXJhdGlvbjsKLSAgICBwcml2YXRlIFRocmVhZEZhY3RvcnkgdGhyZWFkUG9vbDsKLSAgICAvL1RvIGtlZXAgVHJhbnNwb3J0TWFuYWdlciBpbnN0YW5jZQotICAgIHByaXZhdGUgTGlzdGVuZXJNYW5hZ2VyIGxpc3RlbmVyTWFuYWdlcjsKLQotICAgIC8vIGN1cnJlbnQgdGltZSBvdXQgaW50ZXJ2YWwgaXMgMzAgc2Vjcy4gTmVlZCB0byBtYWtlIHRoaXMgY29uZmlndXJhYmxlCi0gICAgcHJpdmF0ZSBsb25nIHNlcnZpY2VHcm91cENvbnRleHRUaW1lb3V0SW50ZXJ2YWwgPSAzMCAqIDEwMDA7Ci0KLSAgICAvL1RvIHNwZWNpZnkgdXJsIG1hcHBpbmcgZm9yIHNlcnZpY2VzCi0gICAgcHJpdmF0ZSBTdHJpbmcgY29udGV4dFJvb3Q7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgc2VydmljZVBhdGg7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBjYWNoZWRTZXJ2aWNlUGF0aCA9IG51bGw7Ci0gICAgcHJvdGVjdGVkIExpc3Q8Q29udGV4dExpc3RlbmVyPiBjb250ZXh0TGlzdGVuZXJzOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IKLSAgICAgKgotICAgICAqIEBwYXJhbSBheGlzQ29uZmlndXJhdGlvbiAtIEF4aXNDb25maWd1cmF0aW9uIGZvciB3aGljaCB0byBjcmVhdGUgYSBjb250ZXh0Ci0gICAgICovCi0gICAgcHVibGljIENvbmZpZ3VyYXRpb25Db250ZXh0KEF4aXNDb25maWd1cmF0aW9uIGF4aXNDb25maWd1cmF0aW9uKSB7Ci0gICAgICAgIHN1cGVyKG51bGwpOwotICAgICAgICB0aGlzLmF4aXNDb25maWd1cmF0aW9uID0gYXhpc0NvbmZpZ3VyYXRpb247Ci0gICAgICAgIGluaXRDb25maWdDb250ZXh0VGltZW91dChheGlzQ29uZmlndXJhdGlvbik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRDb25maWdDb250ZXh0VGltZW91dChBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlndXJhdGlvbikgewotICAgICAgICBQYXJhbWV0ZXIgcGFyYW1ldGVyID0gYXhpc0NvbmZpZ3VyYXRpb24KLSAgICAgICAgICAgICAgICAuZ2V0UGFyYW1ldGVyKENvbnN0YW50cy5Db25maWd1cmF0aW9uLkNPTkZJR19DT05URVhUX1RJTUVPVVRfSU5URVJWQUwpOwotICAgICAgICBpZiAocGFyYW1ldGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IHBhcmFtZXRlci5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLSAgICAgICAgICAgICAgICBzZXJ2aWNlR3JvdXBDb250ZXh0VGltZW91dEludGVydmFsID0gSW50ZWdlci5wYXJzZUludCgoU3RyaW5nKXZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluaXRpYWxpemVzIHRoZSBDbHVzdGVyTWFuYWdlciBmb3IgdGhpcyBDb25maWd1cmF0aW9uQ29udGV4dAotICAgICAqCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbml0Q2x1c3RlcigpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBDbHVzdGVyTWFuYWdlciBjbHVzdGVyTWFuYWdlciA9IGF4aXNDb25maWd1cmF0aW9uLmdldENsdXN0ZXJNYW5hZ2VyKCk7Ci0gICAgICAgIGlmIChjbHVzdGVyTWFuYWdlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBDb250ZXh0TWFuYWdlciBjb250ZXh0TWFuYWdlciA9IGNsdXN0ZXJNYW5hZ2VyLmdldENvbnRleHRNYW5hZ2VyKCk7Ci0gICAgICAgICAgICBpZiAoY29udGV4dE1hbmFnZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNvbnRleHRNYW5hZ2VyLnNldENvbmZpZ3VyYXRpb25Db250ZXh0KHRoaXMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQ29uZmlndXJhdGlvbk1hbmFnZXIgY29uZmlnTWFuYWdlciA9IGNsdXN0ZXJNYW5hZ2VyLmdldENvbmZpZ3VyYXRpb25NYW5hZ2VyKCk7Ci0gICAgICAgICAgICBpZiAoY29uZmlnTWFuYWdlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY29uZmlnTWFuYWdlci5zZXRDb25maWd1cmF0aW9uQ29udGV4dCh0aGlzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzaG91bGRDbHVzdGVyQmVJbml0aWF0ZWQoY2x1c3Rlck1hbmFnZXIpKSB7Ci0gICAgICAgICAgICAgICAgY2x1c3Rlck1hbmFnZXIuc2V0Q29uZmlndXJhdGlvbkNvbnRleHQodGhpcyk7Ci0gICAgICAgICAgICAgICAgY2x1c3Rlck1hbmFnZXIuaW5pdCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGNsdXN0ZXJNYW5hZ2VyIFRoZSBDbHVzdGVyTWFuYWdlciBpbXBsZW1lbnRhdGlvbgotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIGNsdXN0ZXIgbmVlZHMgdG8gYmUgYXV0b21hdGljYWxseSBpbml0aWFsaXplZCBieSB0aGUgZnJhbWV3b3JrOyBmYWxzZSwKLSAgICAgKiAgICAgICAgIG90aGVyd2lzZQotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gc2hvdWxkQ2x1c3RlckJlSW5pdGlhdGVkKENsdXN0ZXJNYW5hZ2VyIGNsdXN0ZXJNYW5hZ2VyKSB7Ci0gICAgICAgIFBhcmFtZXRlciBwYXJhbSA9Ci0gICAgICAgICAgICAgICAgY2x1c3Rlck1hbmFnZXIuZ2V0UGFyYW1ldGVyKENsdXN0ZXJpbmdDb25zdGFudHMuUGFyYW1ldGVycy5BVk9JRF9JTklUSUFUSU9OKTsKLSAgICAgICAgcmV0dXJuICEocGFyYW0gIT0gbnVsbCAmJiBKYXZhVXRpbHMuaXNUcnVlRXhwbGljaXRseShwYXJhbS5nZXRWYWx1ZSgpKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5mb3JtIGFueSBsaXN0ZW5lcnMgb2YgYSBuZXcgY29udGV4dCBiZWluZyBjcmVhdGVkCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29udGV4dCB0aGUganVzdC1jcmVhdGVkIHN1YmNvbnRleHQKLSAgICAgKi8KLSAgICB2b2lkIGNvbnRleHRDcmVhdGVkKEFic3RyYWN0Q29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIGlmIChjb250ZXh0TGlzdGVuZXJzID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBmb3IgKE9iamVjdCBjb250ZXh0TGlzdGVuZXIgOiBjb250ZXh0TGlzdGVuZXJzKSB7Ci0gICAgICAgICAgICBDb250ZXh0TGlzdGVuZXIgbGlzdGVuZXIgPSAoQ29udGV4dExpc3RlbmVyKWNvbnRleHRMaXN0ZW5lcjsKLSAgICAgICAgICAgIGxpc3RlbmVyLmNvbnRleHRDcmVhdGVkKGNvbnRleHQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5mb3JtIGFueSBsaXN0ZW5lcnMgb2YgYSBjb250ZXh0IGJlaW5nIHJlbW92ZWQKLSAgICAgKgotICAgICAqIEBwYXJhbSBjb250ZXh0IHRoZSBqdXN0LWNyZWF0ZWQgc3ViY29udGV4dAotICAgICAqLwotICAgIHZvaWQgY29udGV4dFJlbW92ZWQoQWJzdHJhY3RDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgaWYgKGNvbnRleHRMaXN0ZW5lcnMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoT2JqZWN0IGNvbnRleHRMaXN0ZW5lciA6IGNvbnRleHRMaXN0ZW5lcnMpIHsKLSAgICAgICAgICAgIENvbnRleHRMaXN0ZW5lciBsaXN0ZW5lciA9IChDb250ZXh0TGlzdGVuZXIpY29udGV4dExpc3RlbmVyOwotICAgICAgICAgICAgbGlzdGVuZXIuY29udGV4dFJlbW92ZWQoY29udGV4dCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWdpc3RlciBhIHtAbGluayBDb250ZXh0TGlzdGVuZXJ9IHRvIGJlIG5vdGlmaWVkIG9mIGFsbCBzdWItY29udGV4dCBldmVudHMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29udGV4dExpc3RlbmVyIEEgQ29udGV4dExpc3RlbmVyCi0gICAgICogQHNlZSAjcmVtb3ZlQ29udGV4dExpc3RlbmVyCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkQ29udGV4dExpc3RlbmVyKENvbnRleHRMaXN0ZW5lciBjb250ZXh0TGlzdGVuZXIpIHsKLSAgICAgICAgaWYgKGNvbnRleHRMaXN0ZW5lcnMgPT0gbnVsbCkgewotICAgICAgICAgICAgY29udGV4dExpc3RlbmVycyA9IG5ldyBBcnJheUxpc3Q8Q29udGV4dExpc3RlbmVyPigpOwotICAgICAgICB9Ci0gICAgICAgIGNvbnRleHRMaXN0ZW5lcnMuYWRkKGNvbnRleHRMaXN0ZW5lcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlIGFuIGFscmVhZHkgcmVnaXN0ZXJlZCB7QGxpbmsgQ29udGV4dExpc3RlbmVyfQotICAgICAqCi0gICAgICogQHBhcmFtIGNvbnRleHRMaXN0ZW5lciBBIENvbnRleHRMaXN0ZW5lcgotICAgICAqIEBzZWUgI2FkZENvbnRleHRMaXN0ZW5lcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZUNvbnRleHRMaXN0ZW5lcihDb250ZXh0TGlzdGVuZXIgY29udGV4dExpc3RlbmVyKSB7Ci0gICAgICAgIGlmIChjb250ZXh0TGlzdGVuZXJzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNvbnRleHRMaXN0ZW5lcnMucmVtb3ZlKGNvbnRleHRMaXN0ZW5lcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZWFyY2hlcyBmb3IgYSBTZXJ2aWNlR3JvdXBDb250ZXh0IGluIHRoZSBtYXAgd2l0aCBnaXZlbiBpZCBhcyB0aGUga2V5LgotICAgICAqIDxwcmU+Ci0gICAgICogSWYoa2V5ICE9IG51bGwgJiYgZm91bmQpCi0gICAgICogY2hlY2sgZm9yIGEgc2VydmljZSBjb250ZXh0IGZvciB0aGUgaW50ZW5kZWQgc2VydmljZS4KLSAgICAgKiBpZiAoIWZvdW5kKQotICAgICAqIGNyZWF0ZSBvbmUgYW5kIGhvb2sgdXAgdG8gU2VydmljZUdyb3VwQ29udGV4dAotICAgICAqIGVsc2UKLSAgICAgKiBjcmVhdGUgbmV3IFNlcnZpY2VHcm91cENvbnRleHQgd2l0aCB0aGUgZ2l2ZW4ga2V5IG9yIGlmIGtleSBpcyBudWxsIHdpdGggYSBuZXcga2V5Ci0gICAgICogY3JlYXRlIGEgbmV3IHNlcnZpY2UgY29udGV4dCBmb3IgdGhlIHNlcnZpY2UKLSAgICAgKiA8L3ByZT4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXNzYWdlQ29udGV4dCA6IE1lc3NhZ2VDb250ZXh0Ci0gICAgICogQHRocm93cyBBeGlzRmF1bHQgOiBJZiBzb21ldGhpbmcgZ29lcyB3cm9uZwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGZpbGxTZXJ2aWNlQ29udGV4dEFuZFNlcnZpY2VHcm91cENvbnRleHQoTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQpCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgLy8gYnkgdGhpcyB0aW1lIHNlcnZpY2UgZ3JvdXAgY29udGV4dCBpZCBtdXN0IGhhdmUgYSB2YWx1ZS4gRWl0aGVyIGZyb20gdHJhbnNwb3J0IG9yIGZyb20gYWRkcmVzc2luZwotICAgICAgICBTZXJ2aWNlR3JvdXBDb250ZXh0IHNlcnZpY2VHcm91cENvbnRleHQ7Ci0gICAgICAgIFNlcnZpY2VDb250ZXh0IHNlcnZpY2VDb250ZXh0ID0gbWVzc2FnZUNvbnRleHQuZ2V0U2VydmljZUNvbnRleHQoKTsKLQotICAgICAgICBBeGlzU2VydmljZSBheGlzU2VydmljZSA9IG1lc3NhZ2VDb250ZXh0LmdldEF4aXNTZXJ2aWNlKCk7Ci0KLSAgICAgICAgaWYgKHNlcnZpY2VDb250ZXh0ID09IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyBzY29wZSA9IGF4aXNTZXJ2aWNlLmdldFNjb3BlKCk7Ci0gICAgICAgICAgICBpZiAoQ29uc3RhbnRzLlNDT1BFX0FQUExJQ0FUSU9OLmVxdWFscyhzY29wZSkpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgc2VydmljZUdyb3VwTmFtZSA9IGF4aXNTZXJ2aWNlLmdldEF4aXNTZXJ2aWNlR3JvdXAoKS5nZXRTZXJ2aWNlR3JvdXBOYW1lKCk7Ci0gICAgICAgICAgICAgICAgc2VydmljZUdyb3VwQ29udGV4dCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoU2VydmljZUdyb3VwQ29udGV4dClhcHBsaWNhdGlvblNlc3Npb25TZXJ2aWNlR3JvdXBDb250ZXh0cy5nZXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VHcm91cE5hbWUpOwotICAgICAgICAgICAgICAgIGlmIChzZXJ2aWNlR3JvdXBDb250ZXh0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgQXhpc1NlcnZpY2VHcm91cCBheGlzU2VydmljZUdyb3VwID0gbWVzc2FnZUNvbnRleHQuZ2V0QXhpc1NlcnZpY2VHcm91cCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoYXhpc1NlcnZpY2VHcm91cCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBheGlzU2VydmljZUdyb3VwID0gYXhpc1NlcnZpY2UuZ2V0QXhpc1NlcnZpY2VHcm91cCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUNvbnRleHQuc2V0QXhpc1NlcnZpY2VHcm91cChheGlzU2VydmljZUdyb3VwKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBjZmdDdHggPSBtZXNzYWdlQ29udGV4dC5nZXRDb25maWd1cmF0aW9uQ29udGV4dCgpOwotICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlR3JvdXBDb250ZXh0ID0gY2ZnQ3R4LmNyZWF0ZVNlcnZpY2VHcm91cENvbnRleHQoYXhpc1NlcnZpY2VHcm91cCk7Ci0gICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uU2Vzc2lvblNlcnZpY2VHcm91cENvbnRleHRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnB1dChzZXJ2aWNlR3JvdXBOYW1lLCBzZXJ2aWNlR3JvdXBDb250ZXh0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbWVzc2FnZUNvbnRleHQuc2V0U2VydmljZUdyb3VwQ29udGV4dChzZXJ2aWNlR3JvdXBDb250ZXh0KTsKLSAgICAgICAgICAgICAgICBtZXNzYWdlQ29udGV4dAotICAgICAgICAgICAgICAgICAgICAgICAgLnNldFNlcnZpY2VDb250ZXh0KHNlcnZpY2VHcm91cENvbnRleHQuZ2V0U2VydmljZUNvbnRleHQoYXhpc1NlcnZpY2UpKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoQ29uc3RhbnRzLlNDT1BFX1NPQVBfU0VTU0lPTi5lcXVhbHMoc2NvcGUpKSB7Ci0gICAgICAgICAgICAgICAgLy9jbGVhbmluZyB0aGUgc2Vzc2lvbgotICAgICAgICAgICAgICAgIGNsZWFudXBTZXJ2aWNlR3JvdXBDb250ZXh0cygpOwotICAgICAgICAgICAgICAgIFN0cmluZyBzZXJ2aWNlR3JvdXBDb250ZXh0SWQgPSBtZXNzYWdlQ29udGV4dC5nZXRTZXJ2aWNlR3JvdXBDb250ZXh0SWQoKTsKLSAgICAgICAgICAgICAgICBpZiAoc2VydmljZUdyb3VwQ29udGV4dElkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgc2VydmljZUdyb3VwQ29udGV4dCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U2VydmljZUdyb3VwQ29udGV4dEZyb21Tb2FwU2Vzc2lvblRhYmxlKHNlcnZpY2VHcm91cENvbnRleHRJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUNvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICBpZiAoc2VydmljZUdyb3VwQ29udGV4dCA9PSBudWxsKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IEFkZGluZyB0aGlzIGNvZGUgc28gdGhhdCByZXF1ZXN0cyB0byBzZXJ2aWNlcyBkZXBsb3llZCBpbiBzb2Fwc2Vzc2lvbiBzY29wZSB3aWxsIHdvcmsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IEhvd2V2ZXIsIHNvYXBzZXNzaW9uIGZ1bmN0aW9uYWxpdHkgaXMgc3RpbGwgYnJva2VuCi0gICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlR3JvdXBDb250ZXh0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFNlcnZpY2VHcm91cENvbnRleHQodGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpc1NlcnZpY2UuZ2V0QXhpc1NlcnZpY2VHcm91cCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VHcm91cENvbnRleHQuc2V0SWQoc2VydmljZUdyb3VwQ29udGV4dElkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZFNlcnZpY2VHcm91cENvbnRleHRJbnRvU29hcFNlc3Npb25UYWJsZShzZXJ2aWNlR3JvdXBDb250ZXh0KTsKLS8vICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiVW5hYmxlIHRvIGZpbmQgY29ycmVzcG9uZGluZyBjb250ZXh0IiArCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBmb3IgdGhlIHNlcnZpY2VHcm91cElkOiAiICsgc2VydmljZUdyb3VwQ29udGV4dElkKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIEF4aXNTZXJ2aWNlR3JvdXAgYXhpc1NlcnZpY2VHcm91cCA9IGF4aXNTZXJ2aWNlLmdldEF4aXNTZXJ2aWNlR3JvdXAoKTsKLSAgICAgICAgICAgICAgICAgICAgc2VydmljZUdyb3VwQ29udGV4dCA9IGNyZWF0ZVNlcnZpY2VHcm91cENvbnRleHQoYXhpc1NlcnZpY2VHcm91cCk7Ci0gICAgICAgICAgICAgICAgICAgIHNlcnZpY2VDb250ZXh0ID0gc2VydmljZUdyb3VwQ29udGV4dC5nZXRTZXJ2aWNlQ29udGV4dChheGlzU2VydmljZSk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHNldCB0aGUgc2VydmljZUdyb3VwQ29udGV4dElECi0gICAgICAgICAgICAgICAgICAgIHNlcnZpY2VHcm91cENvbnRleHRJZCA9IFVVSURHZW5lcmF0b3IuZ2V0VVVJRCgpOwotICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlR3JvdXBDb250ZXh0LnNldElkKHNlcnZpY2VHcm91cENvbnRleHRJZCk7Ci0gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VDb250ZXh0LnNldFNlcnZpY2VHcm91cENvbnRleHRJZChzZXJ2aWNlR3JvdXBDb250ZXh0SWQpOwotICAgICAgICAgICAgICAgICAgICBhZGRTZXJ2aWNlR3JvdXBDb250ZXh0SW50b1NvYXBTZXNzaW9uVGFibGUoc2VydmljZUdyb3VwQ29udGV4dCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1lc3NhZ2VDb250ZXh0LnNldFNlcnZpY2VHcm91cENvbnRleHQoc2VydmljZUdyb3VwQ29udGV4dCk7Ci0gICAgICAgICAgICAgICAgbWVzc2FnZUNvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRTZXJ2aWNlQ29udGV4dChzZXJ2aWNlR3JvdXBDb250ZXh0LmdldFNlcnZpY2VDb250ZXh0KGF4aXNTZXJ2aWNlKSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKENvbnN0YW50cy5TQ09QRV9SRVFVRVNULmVxdWFscyhzY29wZSkpIHsKLSAgICAgICAgICAgICAgICBBeGlzU2VydmljZUdyb3VwIGF4aXNTZXJ2aWNlR3JvdXAgPSBheGlzU2VydmljZS5nZXRBeGlzU2VydmljZUdyb3VwKCk7Ci0gICAgICAgICAgICAgICAgc2VydmljZUdyb3VwQ29udGV4dCA9IGNyZWF0ZVNlcnZpY2VHcm91cENvbnRleHQoYXhpc1NlcnZpY2VHcm91cCk7Ci0gICAgICAgICAgICAgICAgbWVzc2FnZUNvbnRleHQuc2V0U2VydmljZUdyb3VwQ29udGV4dChzZXJ2aWNlR3JvdXBDb250ZXh0KTsKLSAgICAgICAgICAgICAgICBzZXJ2aWNlQ29udGV4dCA9IHNlcnZpY2VHcm91cENvbnRleHQuZ2V0U2VydmljZUNvbnRleHQoYXhpc1NlcnZpY2UpOwotICAgICAgICAgICAgICAgIG1lc3NhZ2VDb250ZXh0LnNldFNlcnZpY2VDb250ZXh0KHNlcnZpY2VDb250ZXh0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAobWVzc2FnZUNvbnRleHQuZ2V0T3BlcmF0aW9uQ29udGV4dCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1lc3NhZ2VDb250ZXh0LmdldE9wZXJhdGlvbkNvbnRleHQoKS5zZXRQYXJlbnQoc2VydmljZUNvbnRleHQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVnaXN0ZXJzIGEgT3BlcmF0aW9uQ29udGV4dCB3aXRoIGEgZ2l2ZW4gbWVzc2FnZSBJRC4gSWYgdGhlIGdpdmVuIG1lc3NhZ2UgaWQgYWxyZWFkeSBoYXMgYQotICAgICAqIHJlZ2lzdGVyZWQgb3BlcmF0aW9uIGNvbnRleHQsIG5vIGNoYW5nZSBpcyBtYWRlIGFuZCB0aGUgbWV0aG9kIHJldHVybnMgZmFsc2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVzc2FnZUlEICAgICAgICB0aGUgbWVzc2FnZSBJRCBvZiB0aGUgcmVxdWVzdCBtZXNzYWdlIGluIHRoZSBNRVAKLSAgICAgKiBAcGFyYW0gb3BlcmF0aW9uQ29udGV4dCB0aGUgT3BlcmF0aW9uQ29udGV4dAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB3ZSByZWdpc3RlcmVkIHRoaXMgY29udGV4dCwgZmFsc2UgaWYgdGhlcmUgd2FzIGFscmVhZHkgb25lIGZvciB0aGF0IElECi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gcmVnaXN0ZXJPcGVyYXRpb25Db250ZXh0KFN0cmluZyBtZXNzYWdlSUQsIE9wZXJhdGlvbkNvbnRleHQgb3BlcmF0aW9uQ29udGV4dCkgewotICAgICAgICByZXR1cm4gcmVnaXN0ZXJPcGVyYXRpb25Db250ZXh0KG1lc3NhZ2VJRCwgb3BlcmF0aW9uQ29udGV4dCwgZmFsc2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlZ2lzdGVycyBhIE9wZXJhdGlvbkNvbnRleHQgd2l0aCBhIGdpdmVuIG1lc3NhZ2UgSUQuIElmIHRoZSBnaXZlbiBtZXNzYWdlIGlkIGFscmVhZHkgaGFzIGEKLSAgICAgKiByZWdpc3RlcmVkIG9wZXJhdGlvbiBjb250ZXh0LCBubyBjaGFuZ2UgaXMgbWFkZSB1bmxlc3MgdGhlIG92ZXJyaWRlIGZsYWcgaXMgc2V0LgotICAgICAqCi0gICAgICogQHBhcmFtIG1lc3NhZ2VJRCAgdGhlIG1lc3NhZ2UgSUQgb2YgdGhlIHJlcXVlc3QgbWVzc2FnZSBpbiB0aGUgTUVQCi0gICAgICogQHBhcmFtIG1lcENvbnRleHQgdGhlIE9wZXJhdGlvbkNvbnRleHQKLSAgICAgKiBAcGFyYW0gb3ZlcnJpZGUgICB0cnVlIGlmIHdlIHNob3VsZCBvdmVyd3JpdGUgYW55IGV4aXN0aW5nIE9wZXJhdGlvbkNvbnRleHQKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgd2UgcmVnaXN0ZXJlZCB0aGUgcGFzc2VkIE9wZXJhdGlvbkNvbnRleHQsIGZhbHNlIGlmIG5vdAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHJlZ2lzdGVyT3BlcmF0aW9uQ29udGV4dChTdHJpbmcgbWVzc2FnZUlELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYXRpb25Db250ZXh0IG1lcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gb3ZlcnJpZGUpIHsKLQotICAgICAgICBpZiAobWVzc2FnZUlEID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygibWVzc2FnZUlEIGlzIG51bGwuIFJldHVybmluZyBmYWxzZSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbGVhbiBhbHJlYWR5SW5NYXAgPSBmYWxzZTsKLSAgICAgICAgbWVwQ29udGV4dC5zZXRLZXkobWVzc2FnZUlEKTsKLQotICAgICAgICBpZiAob3ZlcnJpZGUpIHsKLSAgICAgICAgICAgIG9wZXJhdGlvbkNvbnRleHRNYXAucHV0KG1lc3NhZ2VJRCwgbWVwQ29udGV4dCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBPYmplY3QgcHJldmlvdXMgPSBvcGVyYXRpb25Db250ZXh0TWFwLnB1dElmQWJzZW50KG1lc3NhZ2VJRCwgbWVwQ29udGV4dCk7Ci0gICAgICAgICAgICBhbHJlYWR5SW5NYXAgPSAocHJldmlvdXMgIT0gbnVsbCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoInJlZ2lzdGVyT3BlcmF0aW9uQ29udGV4dCAoIiArIG92ZXJyaWRlICsgIik6ICIgKwotICAgICAgICAgICAgICAgICAgICAgIG1lcENvbnRleHQgKyAiIHdpdGgga2V5OiAiICsgbWVzc2FnZUlEKTsKLSAgICAgICAgICAgIEhhc2hNYXA8U3RyaW5nLCBNZXNzYWdlQ29udGV4dD4gbXNnQ29udGV4dE1hcCA9IG1lcENvbnRleHQuZ2V0TWVzc2FnZUNvbnRleHRzKCk7Ci0gICAgICAgICAgICBJdGVyYXRvcjxNZXNzYWdlQ29udGV4dD4gbXNnQ29udGV4dEl0ZXJhdG9yID0gbXNnQ29udGV4dE1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgd2hpbGUgKG1zZ0NvbnRleHRJdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0ID0gKE1lc3NhZ2VDb250ZXh0KW1zZ0NvbnRleHRJdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJtc2dDb250ZXh0OiAiICsgbXNnQ29udGV4dCArICIgYWN0aW9uOiAiICsgbXNnQ29udGV4dC5nZXRXU0FBY3Rpb24oKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuICghYWxyZWFkeUluTWFwIHx8IG92ZXJyaWRlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVbnJlZ2lzdGVycyB0aGUgb3BlcmF0aW9uIGNvbnRleHQgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBtZXNzYWdlSUQKLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXNzYWdlSUQgdGhlIG1lc3NhZ2VJRCB0byByZW1vdmUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB1bnJlZ2lzdGVyT3BlcmF0aW9uQ29udGV4dChTdHJpbmcgbWVzc2FnZUlEKSB7Ci0gICAgICAgIGlmIChtZXNzYWdlSUQgPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJtZXNzYWdlSUQgaXMgbnVsbC4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIE9wZXJhdGlvbkNvbnRleHQgb3BDdHggPSAoT3BlcmF0aW9uQ29udGV4dClvcGVyYXRpb25Db250ZXh0TWFwLnJlbW92ZShtZXNzYWdlSUQpOwotICAgICAgICAgICAgY29udGV4dFJlbW92ZWQob3BDdHgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNBbnlPcGVyYXRpb25Db250ZXh0UmVnaXN0ZXJlZCgpIHsKLSAgICAgICAgcmV0dXJuICFvcGVyYXRpb25Db250ZXh0TWFwLmlzRW1wdHkoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIHRoZSBnaXZlbiBTZXJ2aWNlR3JvdXBDb250ZXh0IGludG8gdGhlIFNPQVAgc2Vzc2lvbiB0YWJsZQotICAgICAqCi0gICAgICogQHBhcmFtIHNlcnZpY2VHcm91cENvbnRleHQgU2VydmljZUdyb3VwIENvbnRleHQgdG8gYWRkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkU2VydmljZUdyb3VwQ29udGV4dEludG9Tb2FwU2Vzc2lvblRhYmxlKAotICAgICAgICAgICAgU2VydmljZUdyb3VwQ29udGV4dCBzZXJ2aWNlR3JvdXBDb250ZXh0KSB7Ci0gICAgICAgIFN0cmluZyBpZCA9IHNlcnZpY2VHcm91cENvbnRleHQuZ2V0SWQoKTsKLSAgICAgICAgc2VydmljZUdyb3VwQ29udGV4dE1hcC5wdXQoaWQsIHNlcnZpY2VHcm91cENvbnRleHQpOwotICAgICAgICBzZXJ2aWNlR3JvdXBDb250ZXh0LnRvdWNoKCk7Ci0gICAgICAgIHNlcnZpY2VHcm91cENvbnRleHQuc2V0UGFyZW50KHRoaXMpOwotICAgICAgICAvLyB0aGlzIGlzIHRoZSBiZXN0IHRpbWUgdG8gY2xlYW4gdXAgdGhlIFNHQ3R4dHMgc2luY2UgYXJlIG5vdCBiZWluZyB1c2VkIGFueW1vcmUKLSAgICAgICAgY2xlYW51cFNlcnZpY2VHcm91cENvbnRleHRzKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyB0aGUgZ2l2ZW4gU2VydmljZUdyb3VwQ29udGV4dCBpbnRvIHRoZSBBcHBsaWNhdGlvbiBTY29wZSB0YWJsZQotICAgICAqCi0gICAgICogQHBhcmFtIHNlcnZpY2VHcm91cENvbnRleHQgVGhlIFNlcnZpY2UgR3JvdXAgQ29udGV4dCB0byBhZGQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRTZXJ2aWNlR3JvdXBDb250ZXh0SW50b0FwcGxpY2F0aW9uU2NvcGVUYWJsZQotICAgICAgICAgICAgKFNlcnZpY2VHcm91cENvbnRleHQgc2VydmljZUdyb3VwQ29udGV4dCkgewotICAgICAgICBpZiAoYXBwbGljYXRpb25TZXNzaW9uU2VydmljZUdyb3VwQ29udGV4dHMgPT0gbnVsbCkgewotICAgICAgICAgICAgYXBwbGljYXRpb25TZXNzaW9uU2VydmljZUdyb3VwQ29udGV4dHMgPSBuZXcgSGFzaHRhYmxlPFN0cmluZywgU2VydmljZUdyb3VwQ29udGV4dD4oKTsKLSAgICAgICAgfQotICAgICAgICBhcHBsaWNhdGlvblNlc3Npb25TZXJ2aWNlR3JvdXBDb250ZXh0cy5wdXQoCi0gICAgICAgICAgICAgICAgc2VydmljZUdyb3VwQ29udGV4dC5nZXREZXNjcmlwdGlvbigpLmdldFNlcnZpY2VHcm91cE5hbWUoKSwgc2VydmljZUdyb3VwQ29udGV4dCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGVwbG95IGEgc2VydmljZSB0byB0aGUgZW1iZWRkZWQgQXhpc0NvbmZpZ3VyYXRpb24sIGFuZCBpbml0aWFsaXplIGl0LgotICAgICAqCi0gICAgICogQHBhcmFtIHNlcnZpY2Ugc2VydmljZSB0byBkZXBsb3kKLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdCBpZiB0aGVyZSdzIGEgcHJvYmxlbQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRlcGxveVNlcnZpY2UoQXhpc1NlcnZpY2Ugc2VydmljZSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIGF4aXNDb25maWd1cmF0aW9uLmFkZFNlcnZpY2Uoc2VydmljZSk7Ci0gICAgICAgIGlmIChDb25zdGFudHMuU0NPUEVfQVBQTElDQVRJT04uZXF1YWxzKHNlcnZpY2UuZ2V0U2NvcGUoKSkpIHsKLSAgICAgICAgICAgIFNlcnZpY2VHcm91cENvbnRleHQgc2djID0gY3JlYXRlU2VydmljZUdyb3VwQ29udGV4dChzZXJ2aWNlLmdldEF4aXNTZXJ2aWNlR3JvdXAoKSk7Ci0gICAgICAgICAgICBEZXBlbmRlbmN5TWFuYWdlci5pbml0U2VydmljZShzZ2MpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgQXhpc0NvbmZpZ3VyYXRpb24KLSAgICAgKgotICAgICAqIEByZXR1cm4gUmV0dXJucyBBeGlzQ29uZmlndXJhdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBBeGlzQ29uZmlndXJhdGlvbiBnZXRBeGlzQ29uZmlndXJhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIGF4aXNDb25maWd1cmF0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgYSBPcGVyYXRpb25Db250ZXh0IGdpdmVuIGEgTWVzc2FnZSBJRC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXNzYWdlSUQgdGhlIG1lc3NhZ2UgSUQgb2YgYW4gYWN0aXZlIE9wZXJhdGlvbkNvbnRleHQKLSAgICAgKiBAcmV0dXJuIGFuIGFjdGl2ZSBPcGVyYXRpb25Db250ZXh0LCBvciBudWxsCi0gICAgICovCi0gICAgcHVibGljIE9wZXJhdGlvbkNvbnRleHQgZ2V0T3BlcmF0aW9uQ29udGV4dChTdHJpbmcgbWVzc2FnZUlEKSB7Ci0gICAgICAgIHJldHVybiAoT3BlcmF0aW9uQ29udGV4dCl0aGlzLm9wZXJhdGlvbkNvbnRleHRNYXAuZ2V0KG1lc3NhZ2VJRCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmluZHMgdGhlIE9wZXJhdGlvbkNvbnRleHQgZ2l2ZW4gdGhlIE9wZXJhdGlvbiBuYW1lLCBTZXJ2aWNlIE5hbWUsIGFuZCBTZXJ2aWNlR3JvdXBOYW1lCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb3BlcmF0aW9uTmFtZSAgICAtIE9wZXJhdGlvbk5hbWUgdG8gZmluZAotICAgICAqIEBwYXJhbSBzZXJ2aWNlTmFtZSAgICAgIC0gU2VydmljZU5hbWUgdG8gZmluZAotICAgICAqIEBwYXJhbSBzZXJ2aWNlR3JvdXBOYW1lIC0gU2VydmljZUdyb3VwTmFtZSB0byBmaW5kCi0gICAgICogQHJldHVybiBSZXR1cm5zIE9wZXJhdGlvbkNvbnRleHQgPGNvZGU+T3BlcmF0aW9uQ29udGV4dDxjb2RlPgotICAgICAqLwotICAgIHB1YmxpYyBPcGVyYXRpb25Db250ZXh0IGZpbmRPcGVyYXRpb25Db250ZXh0KFN0cmluZyBvcGVyYXRpb25OYW1lLCBTdHJpbmcgc2VydmljZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNlcnZpY2VHcm91cE5hbWUpIHsKLSAgICAgICAgaWYgKG9wZXJhdGlvbk5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc2VydmljZU5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBncm91cCBuYW1lIGlzIG5vdCBuZWNlc3NhcmlseSBhIHByZXJlcQotICAgICAgICAvLyBidXQgaWYgdGhlIGdyb3VwIG5hbWUgaXMgbm9uLW51bGwsIHRoZW4gaXQgaGFzIHRvIG1hdGNoCi0KLSAgICAgICAgSXRlcmF0b3I8T3BlcmF0aW9uQ29udGV4dD4gaXQgPSBvcGVyYXRpb25Db250ZXh0TWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0KLSAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgT3BlcmF0aW9uQ29udGV4dCB2YWx1ZSA9IChPcGVyYXRpb25Db250ZXh0KWl0Lm5leHQoKTsKLQotICAgICAgICAgICAgU3RyaW5nIHZhbHVlT3BlcmF0aW9uTmFtZTsKLSAgICAgICAgICAgIFN0cmluZyB2YWx1ZVNlcnZpY2VOYW1lOwotICAgICAgICAgICAgU3RyaW5nIHZhbHVlU2VydmljZUdyb3VwTmFtZTsKLQotICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB2YWx1ZU9wZXJhdGlvbk5hbWUgPSB2YWx1ZS5nZXRPcGVyYXRpb25OYW1lKCk7Ci0gICAgICAgICAgICAgICAgdmFsdWVTZXJ2aWNlTmFtZSA9IHZhbHVlLmdldFNlcnZpY2VOYW1lKCk7Ci0gICAgICAgICAgICAgICAgdmFsdWVTZXJ2aWNlR3JvdXBOYW1lID0gdmFsdWUuZ2V0U2VydmljZUdyb3VwTmFtZSgpOwotCi0gICAgICAgICAgICAgICAgaWYgKCh2YWx1ZU9wZXJhdGlvbk5hbWUgIT0gbnVsbCkgJiYgKHZhbHVlT3BlcmF0aW9uTmFtZS5lcXVhbHMob3BlcmF0aW9uTmFtZSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgodmFsdWVTZXJ2aWNlTmFtZSAhPSBudWxsKSAmJiAodmFsdWVTZXJ2aWNlTmFtZS5lcXVhbHMoc2VydmljZU5hbWUpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh2YWx1ZVNlcnZpY2VHcm91cE5hbWUgIT0gbnVsbCkgJiYgKHNlcnZpY2VHcm91cE5hbWUgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAodmFsdWVTZXJ2aWNlR3JvdXBOYW1lLmVxdWFscyhzZXJ2aWNlR3JvdXBOYW1lKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXRjaAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3IsIGJvdGggbmVlZCB0byBiZSBudWxsCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHZhbHVlU2VydmljZUdyb3VwTmFtZSA9PSBudWxsKSAmJiAoc2VydmljZUdyb3VwTmFtZSA9PSBudWxsKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1hdGNoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gaWYgd2UgZ290IGhlcmUsIHdlIGRpZCBub3QgZmluZCBhbiBvcGVyYXRpb24gY29udGV4dAotICAgICAgICAvLyB0aGF0IGZpdHMgdGhlIGNyaXRlcmlhCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIE1lc3NhZ2VDb250ZXh0LCBhbmQgbm90aWZ5IGFueSByZWdpc3RlcmVkIENvbnRleHRMaXN0ZW5lci4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYSBuZXcgTWVzc2FnZUNvbnRleHQKLSAgICAgKi8KLSAgICBwdWJsaWMgTWVzc2FnZUNvbnRleHQgY3JlYXRlTWVzc2FnZUNvbnRleHQoKSB7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1zZ0N0eCA9IG5ldyBNZXNzYWdlQ29udGV4dCh0aGlzKTsKLSAgICAgICAgY29udGV4dENyZWF0ZWQobXNnQ3R4KTsKLSAgICAgICAgcmV0dXJuIG1zZ0N0eDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBTZXJ2aWNlR3JvdXBDb250ZXh0IGZvciB0aGUgc3BlY2lmaWVkIHNlcnZpY2UgZ3JvdXAsIGFuZCBub3RpZnkgYW55IHJlZ2lzdGVyZWQKLSAgICAgKiBDb250ZXh0TGlzdGVuZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2VydmljZUdyb3VwIGFuIEF4aXNTZXJ2aWNlR3JvdXAKLSAgICAgKiBAcmV0dXJuIGEgbmV3IFNlcnZpY2VHcm91cENvbnRleHQKLSAgICAgKi8KLSAgICBwdWJsaWMgU2VydmljZUdyb3VwQ29udGV4dCBjcmVhdGVTZXJ2aWNlR3JvdXBDb250ZXh0KEF4aXNTZXJ2aWNlR3JvdXAgc2VydmljZUdyb3VwKSB7Ci0gICAgICAgIFNlcnZpY2VHcm91cENvbnRleHQgc2dDdHggPSBuZXcgU2VydmljZUdyb3VwQ29udGV4dCh0aGlzLCBzZXJ2aWNlR3JvdXApOwotICAgICAgICBjb250ZXh0Q3JlYXRlZChzZ0N0eCk7Ci0gICAgICAgIHJldHVybiBzZ0N0eDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBbGxvd3MgdXNlcnMgdG8gcmVzb2x2ZSB0aGUgcGF0aCByZWxhdGl2ZSB0byB0aGUgcm9vdCBkaXJlY3RvcnkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGF0aCBhIHJlbGF0aXZlIHBhdGgKLSAgICAgKiBAcmV0dXJuIGEgRmlsZSBmb3IgdGhlIGdpdmVuIHBhdGggcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgcmVwb3NpdG9yeSwgb3IgbnVsbCBpZiBubyByZXBvCi0gICAgICovCi0gICAgcHVibGljIEZpbGUgZ2V0UmVhbFBhdGgoU3RyaW5nIHBhdGgpIHsKLSAgICAgICAgVVJMIHJlcG9zaXRvcnkgPSBheGlzQ29uZmlndXJhdGlvbi5nZXRSZXBvc2l0b3J5KCk7Ci0gICAgICAgIGlmIChyZXBvc2l0b3J5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIEZpbGUgcmVwbyA9IG5ldyBGaWxlKHJlcG9zaXRvcnkuZ2V0RmlsZSgpKTsKLSAgICAgICAgICAgIHJldHVybiBuZXcgRmlsZShyZXBvLCBwYXRoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXRyaWV2ZSB0aGUgU2VydmljZUdyb3VwQ29udGV4dCBmcm9tIHRoZSBTT0FQIHNlc3Npb24gdGFibGUKLSAgICAgKgotICAgICAqIEBwYXJhbSBzZXJ2aWNlR3JvdXBDb250ZXh0SWQgU2VydmljZSBHcm91cCBDb250ZXh0IElEIHRvIHNlYXJjaCBvbgotICAgICAqIEBwYXJhbSBtc2dDb250ZXh0ICAgICAgICAgICAgTWVzc2FnZSBDb250ZXh0IHRvIHNlYXJjaCBvbgotICAgICAqIEByZXR1cm4gUmV0dXJucyBhIFNlcnZpY2VHcm91cENvbnRleHQKLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdCBpZiBTZXJ2aWNlR3JvdXBDb250ZXh0IGNhbm5vdCBiZSBmb3VuZAotICAgICAqLwotICAgIHB1YmxpYyBTZXJ2aWNlR3JvdXBDb250ZXh0IGdldFNlcnZpY2VHcm91cENvbnRleHRGcm9tU29hcFNlc3Npb25UYWJsZSgKLSAgICAgICAgICAgIFN0cmluZyBzZXJ2aWNlR3JvdXBDb250ZXh0SWQsCi0gICAgICAgICAgICBNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgU2VydmljZUdyb3VwQ29udGV4dCBzZXJ2aWNlR3JvdXBDb250ZXh0ID0KLSAgICAgICAgICAgICAgICAoU2VydmljZUdyb3VwQ29udGV4dClzZXJ2aWNlR3JvdXBDb250ZXh0TWFwLmdldChzZXJ2aWNlR3JvdXBDb250ZXh0SWQpOwotCi0gICAgICAgIGlmIChzZXJ2aWNlR3JvdXBDb250ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNlcnZpY2VHcm91cENvbnRleHQudG91Y2goKTsKLSAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlR3JvdXBDb250ZXh0OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiVW5hYmxlIHRvIGZpbmQgY29ycmVzcG9uZGluZyBjb250ZXh0IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZm9yIHRoZSBzZXJ2aWNlR3JvdXBJZDogIiArIHNlcnZpY2VHcm91cENvbnRleHRJZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBTZXJ2aWNlR3JvdXBDb250ZXh0IG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBJRCBmcm9tIHRoZSBpbnRlcm5hbAotICAgICAqIHRhYmxlLgotICAgICAqCi0gICAgICogQHBhcmFtIHNlcnZpY2VHcm91cEN0eElkIFRoZSBJRCBzdHJpbmcgYXNzb2NpYXRlZCB3aXRoIHRoZSBTZXJ2aWNlR3JvdXBDb250ZXh0IG9iamVjdAotICAgICAqIEByZXR1cm4gVGhlIFNlcnZpY2VHcm91cENvbnRleHQgb2JqZWN0LCBvciBudWxsIGlmIG5vdCBmb3VuZAotICAgICAqLwotICAgIHB1YmxpYyBTZXJ2aWNlR3JvdXBDb250ZXh0IGdldFNlcnZpY2VHcm91cENvbnRleHQoU3RyaW5nIHNlcnZpY2VHcm91cEN0eElkKSB7Ci0KLSAgICAgICAgaWYgKHNlcnZpY2VHcm91cEN0eElkID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIEhhc2h0YWJsZXMgcmVxdWlyZSBub24tbnVsbCBrZXktdmFsdWUgcGFpcnMKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgU2VydmljZUdyb3VwQ29udGV4dCBzZXJ2aWNlR3JvdXBDb250ZXh0ID0gbnVsbDsKLQotICAgICAgICBpZiAoc2VydmljZUdyb3VwQ29udGV4dE1hcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzZXJ2aWNlR3JvdXBDb250ZXh0ID0KLSAgICAgICAgICAgICAgICAgICAgKFNlcnZpY2VHcm91cENvbnRleHQpc2VydmljZUdyb3VwQ29udGV4dE1hcC5nZXQoc2VydmljZUdyb3VwQ3R4SWQpOwotICAgICAgICAgICAgaWYgKHNlcnZpY2VHcm91cENvbnRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHNlcnZpY2VHcm91cENvbnRleHQudG91Y2goKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2VydmljZUdyb3VwQ29udGV4dCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoU2VydmljZUdyb3VwQ29udGV4dClhcHBsaWNhdGlvblNlc3Npb25TZXJ2aWNlR3JvdXBDb250ZXh0cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0KHNlcnZpY2VHcm91cEN0eElkKTsKLSAgICAgICAgICAgICAgICBpZiAoc2VydmljZUdyb3VwQ29udGV4dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNlcnZpY2VHcm91cENvbnRleHQudG91Y2goKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotCi0gICAgICAgIHJldHVybiBzZXJ2aWNlR3JvdXBDb250ZXh0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgYWxsIHNlcnZpY2UgZ3JvdXBzIGluIHRoZSBzeXN0ZW0uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgaGFzaG1hcCBvZiBTZXJ2aWNlR3JvdXBDb250ZXh0cy4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0U2VydmljZUdyb3VwQ29udGV4dElEcygpIHsKLSAgICAgICAgU3RyaW5nW10gaWRzID0gbmV3IFN0cmluZ1tzZXJ2aWNlR3JvdXBDb250ZXh0TWFwLnNpemUoKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb25TZXNzaW9uU2VydmljZUdyb3VwQ29udGV4dHMuc2l6ZSgpXTsKLSAgICAgICAgaW50IGluZGV4ID0gMDsKLSAgICAgICAgZm9yIChPYmplY3QgbyA6IHNlcnZpY2VHcm91cENvbnRleHRNYXAua2V5U2V0KCkpIHsKLSAgICAgICAgICAgIGlkc1tpbmRleF0gPSAoU3RyaW5nKW87Ci0gICAgICAgICAgICBpbmRleCsrOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoT2JqZWN0IG8gOiBhcHBsaWNhdGlvblNlc3Npb25TZXJ2aWNlR3JvdXBDb250ZXh0cy5rZXlTZXQoKSkgewotICAgICAgICAgICAgaWRzW2luZGV4XSA9IChTdHJpbmcpbzsKLSAgICAgICAgICAgIGluZGV4Kys7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlkczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBTZXJ2aWNlR3JvdXBDb250ZXh0cwotICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgI2dldFNlcnZpY2VHcm91cENvbnRleHRJRHN9ICYge0BsaW5rICNnZXRTZXJ2aWNlR3JvdXBDb250ZXh0KFN0cmluZyl9Ci0gICAgICovCi0gICAgcHVibGljIEhhc2h0YWJsZTxTdHJpbmcsIFNlcnZpY2VHcm91cENvbnRleHQ+IGdldFNlcnZpY2VHcm91cENvbnRleHRzKCkgewotICAgICAgICByZXR1cm4gc2VydmljZUdyb3VwQ29udGV4dE1hcDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0aHJlYWQgZmFjdG9yeS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gUmV0dXJucyBjb25maWd1cmF0aW9uIHNwZWNpZmljIHRocmVhZCBwb29sCi0gICAgICovCi0gICAgcHVibGljIFRocmVhZEZhY3RvcnkgZ2V0VGhyZWFkUG9vbCgpIHsKLSAgICAgICAgaWYgKHRocmVhZFBvb2wgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyZWFkUG9vbCA9IG5ldyBUaHJlYWRQb29sKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdGhyZWFkUG9vbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIEF4aXNDb25maWd1cmF0aW9uIHRvIHRoZSBzcGVjaWZpZWQgY29uZmlndXJhdGlvbgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbmZpZ3VyYXRpb24gYW4gQXhpc0NvbmZpZ3VyYXRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRBeGlzQ29uZmlndXJhdGlvbihBeGlzQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB7Ci0gICAgICAgIGF4aXNDb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB0aHJlYWQgZmFjdG9yeS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwb29sIFRoZSB0aHJlYWQgcG9vbAotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0IElmIGEgdGhyZWFkIHBvb2wgaGFzIGFscmVhZHkgYmVlbiBzZXQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUaHJlYWRQb29sKFRocmVhZEZhY3RvcnkgcG9vbCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIGlmICh0aHJlYWRQb29sID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocmVhZFBvb2wgPSBwb29sOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdChNZXNzYWdlcy5nZXRNZXNzYWdlKCJ0aHJlYWRwb29sc2V0IikpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlIGEgU2VydmljZUdyb3VwQ29udGV4dAotICAgICAqCi0gICAgICogQHBhcmFtIHNlcnZpY2VHcm91cENvbnRleHRJZCBUaGUgSUQgb2YgdGhlIFNlcnZpY2VHcm91cENvbnRleHQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVTZXJ2aWNlR3JvdXBDb250ZXh0KFN0cmluZyBzZXJ2aWNlR3JvdXBDb250ZXh0SWQpIHsKLSAgICAgICAgaWYgKHNlcnZpY2VHcm91cENvbnRleHRNYXAgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIFNlcnZpY2VHcm91cENvbnRleHQgc2VydmljZUdyb3VwQ29udGV4dCA9Ci0gICAgICAgICAgICAgICAgKFNlcnZpY2VHcm91cENvbnRleHQpc2VydmljZUdyb3VwQ29udGV4dE1hcC5nZXQoc2VydmljZUdyb3VwQ29udGV4dElkKTsKLSAgICAgICAgc2VydmljZUdyb3VwQ29udGV4dE1hcC5yZW1vdmUoc2VydmljZUdyb3VwQ29udGV4dElkKTsKLSAgICAgICAgY2xlYW51cFNlcnZpY2VDb250ZXh0cyhzZXJ2aWNlR3JvdXBDb250ZXh0KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2xlYW51cFNlcnZpY2VHcm91cENvbnRleHRzKCkgewotICAgICAgICBpZiAoc2VydmljZUdyb3VwQ29udGV4dE1hcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgbG9uZyBjdXJyZW50VGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpOwotCi0gICAgICAgIHN5bmNocm9uaXplZCAoc2VydmljZUdyb3VwQ29udGV4dE1hcCkgewotICAgICAgICAgICAgZm9yIChJdGVyYXRvcjxTdHJpbmc+IHNnQ3R4dE1hcEtleUl0ZXIgPSBzZXJ2aWNlR3JvdXBDb250ZXh0TWFwLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgIHNnQ3R4dE1hcEtleUl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIFN0cmluZyBzZ0N0eHRJZCA9IChTdHJpbmcpc2dDdHh0TWFwS2V5SXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgU2VydmljZUdyb3VwQ29udGV4dCBzZXJ2aWNlR3JvdXBDb250ZXh0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChTZXJ2aWNlR3JvdXBDb250ZXh0KXNlcnZpY2VHcm91cENvbnRleHRNYXAuZ2V0KHNnQ3R4dElkKTsKLSAgICAgICAgICAgICAgICBpZiAoKGN1cnJlbnRUaW1lIC0gc2VydmljZUdyb3VwQ29udGV4dC5nZXRMYXN0VG91Y2hlZFRpbWUoKSkgPgotICAgICAgICAgICAgICAgICAgICBnZXRTZXJ2aWNlR3JvdXBDb250ZXh0VGltZW91dEludGVydmFsKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgc2dDdHh0TWFwS2V5SXRlci5yZW1vdmUoKTsKLSAgICAgICAgICAgICAgICAgICAgY2xlYW51cFNlcnZpY2VDb250ZXh0cyhzZXJ2aWNlR3JvdXBDb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgY29udGV4dFJlbW92ZWQoc2VydmljZUdyb3VwQ29udGV4dCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0cmlldmUgdGhlIExpc3RlbmVyTWFuYWdlcgotICAgICAqCi0gICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBMaXN0ZW5lck1hbmFnZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdGVuZXJNYW5hZ2VyIGdldExpc3RlbmVyTWFuYWdlcigpIHsKLSAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7Ci0gICAgICAgICAgICBpZiAobGlzdGVuZXJNYW5hZ2VyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBsaXN0ZW5lck1hbmFnZXIgPSBuZXcgTGlzdGVuZXJNYW5hZ2VyKCk7Ci0gICAgICAgICAgICAgICAgbGlzdGVuZXJNYW5hZ2VyLmluaXQodGhpcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGxpc3RlbmVyTWFuYWdlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIFRyYW5zcG9ydE1hbmFnZXIgdG8gdGhlIGdpdmVuIExpc3RlbmVyTWFuYWdlcgotICAgICAqCi0gICAgICogQHBhcmFtIGxpc3RlbmVyTWFuYWdlciBUaGUgTGlzdGVuZXJNYW5hZ2VyIGZvciB3aGljaCB0byBzZXQgdGhlIFRyYW5zcG9ydE1hbmFnZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUcmFuc3BvcnRNYW5hZ2VyKExpc3RlbmVyTWFuYWdlciBsaXN0ZW5lck1hbmFnZXIpIHsKLSAgICAgICAgdGhpcy5saXN0ZW5lck1hbmFnZXIgPSBsaXN0ZW5lck1hbmFnZXI7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNsZWFudXBTZXJ2aWNlQ29udGV4dHMoU2VydmljZUdyb3VwQ29udGV4dCBzZXJ2aWNlR3JvdXBDb250ZXh0KSB7Ci0gICAgICAgIGlmIChzZXJ2aWNlR3JvdXBDb250ZXh0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBJdGVyYXRvcjxTZXJ2aWNlQ29udGV4dD4gc2VydmljZUNvbnRleHRJdGVyID0gc2VydmljZUdyb3VwQ29udGV4dC5nZXRTZXJ2aWNlQ29udGV4dHMoKTsKLSAgICAgICAgaWYgKHNlcnZpY2VDb250ZXh0SXRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgd2hpbGUgKHNlcnZpY2VDb250ZXh0SXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIFNlcnZpY2VDb250ZXh0IHNlcnZpY2VDb250ZXh0ID0gKFNlcnZpY2VDb250ZXh0KXNlcnZpY2VDb250ZXh0SXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBEZXBlbmRlbmN5TWFuYWdlci5kZXN0cm95U2VydmljZU9iamVjdChzZXJ2aWNlQ29udGV4dCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiogQ2FsbGVkIGR1cmluZyBzaHV0ZG93biB0byBjbGVhbiB1cCBhbGwgQ29udGV4dHMgKi8KLSAgICBwdWJsaWMgdm9pZCBjbGVhbnVwQ29udGV4dHMoKSB7Ci0gICAgICAgIGlmICgoYXBwbGljYXRpb25TZXNzaW9uU2VydmljZUdyb3VwQ29udGV4dHMgIT0gbnVsbCkgJiYKLSAgICAgICAgICAgIChhcHBsaWNhdGlvblNlc3Npb25TZXJ2aWNlR3JvdXBDb250ZXh0cy5zaXplKCkgPiAwKSkgewotICAgICAgICAgICAgZm9yIChPYmplY3QgbyA6IGFwcGxpY2F0aW9uU2Vzc2lvblNlcnZpY2VHcm91cENvbnRleHRzLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICAgICAgU2VydmljZUdyb3VwQ29udGV4dCBzZXJ2aWNlR3JvdXBDb250ZXh0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChTZXJ2aWNlR3JvdXBDb250ZXh0KW87Ci0gICAgICAgICAgICAgICAgY2xlYW51cFNlcnZpY2VDb250ZXh0cyhzZXJ2aWNlR3JvdXBDb250ZXh0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFwcGxpY2F0aW9uU2Vzc2lvblNlcnZpY2VHcm91cENvbnRleHRzLmNsZWFyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKChzZXJ2aWNlR3JvdXBDb250ZXh0TWFwICE9IG51bGwpICYmIChzZXJ2aWNlR3JvdXBDb250ZXh0TWFwLnNpemUoKSA+IDApKSB7Ci0gICAgICAgICAgICBmb3IgKE9iamVjdCBvIDogc2VydmljZUdyb3VwQ29udGV4dE1hcC52YWx1ZXMoKSkgewotICAgICAgICAgICAgICAgIFNlcnZpY2VHcm91cENvbnRleHQgc2VydmljZUdyb3VwQ29udGV4dCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoU2VydmljZUdyb3VwQ29udGV4dClvOwotICAgICAgICAgICAgICAgIGNsZWFudXBTZXJ2aWNlQ29udGV4dHMoc2VydmljZUdyb3VwQ29udGV4dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXJ2aWNlR3JvdXBDb250ZXh0TWFwLmNsZWFyKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbnZva2VkIGR1cmluZyBzaHV0ZG93biB0byBzdG9wIHRoZSBMaXN0ZW5lck1hbmFnZXIgYW5kIHBlcmZvcm0gY29uZmlndXJhdGlvbiBjbGVhbnVwCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlcm1pbmF0ZSgpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBpZiAobGlzdGVuZXJNYW5hZ2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGxpc3RlbmVyTWFuYWdlci5zdG9wKCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXhpc0NvbmZpZ3VyYXRpb24uY2xlYW51cCgpOwotICAgICAgICBjbGVhbnVwVGVtcCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgaW5jbHVkZSBhbGwgdGhlIG1ham9yIGNoYW5nZXMgd2UgaGF2ZSBkb25lIGZyb20gMS4yIHJlbGVhc2UgdG8gMS4zIHJlbGVhc2UuIFRoaXMgd2lsbAotICAgICAqIGluY2x1ZGUgQVBJIGNoYW5nZXMgLCBjbGFzcyBkZXByZWNhdGluZyBldGMgZXRjLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjbGVhbnVwVGVtcCgpIHsKLSAgICAgICAgRmlsZSB0ZW1wRmlsZSA9IChGaWxlKWF4aXNDb25maWd1cmF0aW9uLmdldFBhcmFtZXRlclZhbHVlKAotICAgICAgICAgICAgICAgIENvbnN0YW50cy5Db25maWd1cmF0aW9uLkFSVElGQUNUU19URU1QX0RJUik7Ci0gICAgICAgIGlmICh0ZW1wRmlsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgcHJvcGVydHkgPSAoU3RyaW5nKUFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAotICAgICAgICAgICAgICAgICAgICBuZXcgUHJpdmlsZWdlZEFjdGlvbjxTdHJpbmc+KCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIFN0cmluZyBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5pby50bXBkaXIiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgKTsKLSAgICAgICAgICAgIHRlbXBGaWxlID0gbmV3IEZpbGUocHJvcGVydHksICJfYXhpczIiKTsKLSAgICAgICAgfQotICAgICAgICBkZWxldGVUZW1wRmlsZXModGVtcEZpbGUpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBkZWxldGVUZW1wRmlsZXMoZmluYWwgRmlsZSBkaXIpIHsKLSAgICAgICAgQm9vbGVhbiBpc0RpciA9IChCb29sZWFuKUFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAotICAgICAgICAgICAgICAgIG5ldyBQcml2aWxlZ2VkQWN0aW9uPEJvb2xlYW4+KCkgewotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgQm9vbGVhbiBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGlyLmlzRGlyZWN0b3J5KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICk7Ci0gICAgICAgIGlmIChpc0RpcikgewotICAgICAgICAgICAgU3RyaW5nW10gY2hpbGRyZW4gPSAoU3RyaW5nW10pQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoCi0gICAgICAgICAgICAgICAgICAgIG5ldyBQcml2aWxlZ2VkQWN0aW9uPFN0cmluZ1tdPigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBTdHJpbmdbXSBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRpci5saXN0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgY2hpbGRyZW4gIT0gbnVsbCAmJiBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBkZWxldGVUZW1wRmlsZXMobmV3IEZpbGUoZGlyLCBjaGlsZHJlbltpXSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAotICAgICAgICAgICAgICAgIG5ldyBQcml2aWxlZ2VkQWN0aW9uPE9iamVjdD4oKSB7Ci0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZGlyLmRlbGV0ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0cmlldmVzIHRoZSBTZXJ2aWNlQ29udGV4dCBwYXRoCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHBhdGggdG8gdGhlIFNlcnZpY2VDb250ZXh0Ci0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRTZXJ2aWNlQ29udGV4dFBhdGgoKSB7Ci0gICAgICAgIGlmIChjYWNoZWRTZXJ2aWNlUGF0aCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBjYWNoZWRTZXJ2aWNlUGF0aCA9IGludGVybmFsR2V0U2VydmljZUNvbnRleHRQYXRoKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNhY2hlZFNlcnZpY2VQYXRoOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGludGVybmFsR2V0U2VydmljZUNvbnRleHRQYXRoKCkgewotICAgICAgICBTdHJpbmcgY3R4Um9vdCA9IGdldENvbnRleHRSb290KCk7Ci0gICAgICAgIFN0cmluZyBwYXRoID0gIi8iOwotICAgICAgICBpZiAoY3R4Um9vdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoIWN0eFJvb3QuZXF1YWxzKCIvIikpIHsKLSAgICAgICAgICAgICAgICBwYXRoID0gY3R4Um9vdCArICIvIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzZXJ2aWNlUGF0aCA9PSBudWxsIHx8IHNlcnZpY2VQYXRoLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic2VydmljZSBwYXRoIGNhbm5vdCBiZSBudWxsIG9yIGVtcHR5Iik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHBhdGggKz0gc2VydmljZVBhdGgudHJpbSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwYXRoOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHJpZXZlcyB0aGUgU2VydmljZVBhdGgKLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIHBhdGggdG8gdGhlIFNlcnZpY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNlcnZpY2VQYXRoKCkgewotICAgICAgICBpZiAoc2VydmljZVBhdGggPT0gbnVsbCB8fCBzZXJ2aWNlUGF0aC50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic2VydmljZSBwYXRoIGNhbm5vdCBiZSBudWxsIG9yIGVtcHR5Iik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNlcnZpY2VQYXRoLnRyaW0oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBTZXJ2aWNlUGF0aCB0byB0aGUgZ2l2ZW4gc3RyaW5nCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2VydmljZVBhdGggVGhlIHNlcnZpY2UgcGF0aCBmb3Igd2hpY2ggdG8gc2V0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U2VydmljZVBhdGgoU3RyaW5nIHNlcnZpY2VQYXRoKSB7Ci0gICAgICAgIHRoaXMuc2VydmljZVBhdGggPSBzZXJ2aWNlUGF0aDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXRyaWV2ZXMgdGhlIENvbnRleHRSb290Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBDb250ZXh0Um9vdAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGV4dFJvb3QoKSB7Ci0gICAgICAgIHJldHVybiBjb250ZXh0Um9vdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBjb250ZXh0IHJvb3QgdG8gdGhlIGdpdmVuIHN0cmluZwotICAgICAqCi0gICAgICogQHBhcmFtIGNvbnRleHRSb290IFRoZSBjb250ZXh0IHJvb3QgZm9yIHdoaWNoIHRvIHNldAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENvbnRleHRSb290KFN0cmluZyBjb250ZXh0Um9vdCkgewotICAgICAgICBpZiAoY29udGV4dFJvb3QgIT0gbnVsbCkgewotICAgICAgICAgICAgdGhpcy5jb250ZXh0Um9vdCA9IGNvbnRleHRSb290LnRyaW0oKTsgIC8vIFRyaW0gYmVmb3JlIHN0b3JpbmcgYXdheSBmb3IgZ29vZCBoeWdpZW5lCi0gICAgICAgICAgICBjYWNoZWRTZXJ2aWNlUGF0aCA9IGludGVybmFsR2V0U2VydmljZUNvbnRleHRQYXRoKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAZGVwcmVjYXRlZCBNSVNTUEVMTElORyAtIFBsZWFzZSB1c2UgZ2V0U2VydmljZUdyb3VwQ29udGV4dFRpbWVvdXRJbnRlcnZhbCgpCi0gICAgICogQHJldHVybiB0aGUgc2VydmljZSBncm91cCBjb250ZXh0IHRpbWVvdXQgaW50ZXJ2YWwKLSAgICAgKi8KLSAgICBwdWJsaWMgbG9uZyBnZXRTZXJ2aWNlR3JvdXBDb250ZXh0VGltb3V0SW50ZXJ2YWwoKSB7Ci0gICAgICAgIHJldHVybiBnZXRTZXJ2aWNlR3JvdXBDb250ZXh0VGltZW91dEludGVydmFsKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyB3aWxsIGJlIHVzZWQgdG8gZmV0Y2ggdGhlIHNlcnZpY2VHcm91cENvbnRleHRUaW1vdXRJbnRlcnZhbCBmcm9tIGFueSBwbGFjZSBhdmFpbGFibGUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBzZXJ2aWNlIGdyb3VwIGNvbnRleHQgdGltZW91dCBpbnRlcnZhbCAoaW4gbWlsbGlzZWNvbmRzKQotICAgICAqLwotICAgIHB1YmxpYyBsb25nIGdldFNlcnZpY2VHcm91cENvbnRleHRUaW1lb3V0SW50ZXJ2YWwoKSB7Ci0gICAgICAgIEludGVnZXIgc2VydmljZUdyb3VwQ29udGV4dFRpbW91dEludGVydmFsUGFyYW0gPQotICAgICAgICAgICAgICAgIChJbnRlZ2VyKWdldFByb3BlcnR5KENvbnN0YW50cy5Db25maWd1cmF0aW9uLkNPTkZJR19DT05URVhUX1RJTUVPVVRfSU5URVJWQUwpOwotICAgICAgICBpZiAoc2VydmljZUdyb3VwQ29udGV4dFRpbW91dEludGVydmFsUGFyYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gVE9ETzogVGhpcyBzZWVtcyB3cm9uZyAtIHNldHRpbmcgYSBmaWVsZCBpbnNpZGUgYSBnZXR0ZXI/PwotICAgICAgICAgICAgc2VydmljZUdyb3VwQ29udGV4dFRpbWVvdXRJbnRlcnZhbCA9IHNlcnZpY2VHcm91cENvbnRleHRUaW1vdXRJbnRlcnZhbFBhcmFtOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzZXJ2aWNlR3JvdXBDb250ZXh0VGltZW91dEludGVydmFsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgdGhlIGdpdmVuIFNlcnZpY2VHcm91cCBmcm9tIHRoZSBTZXJ2aWNlR3JvdXAgY29udGV4dAotICAgICAqCi0gICAgICogQHBhcmFtIHNlcnZpY2VHcm91cCB0aGUgQXhpc1NlcnZpY2VHcm91cCB0byByZW1vdmUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVTZXJ2aWNlR3JvdXBDb250ZXh0KEF4aXNTZXJ2aWNlR3JvdXAgc2VydmljZUdyb3VwKSB7Ci0gICAgICAgIGlmIChzZXJ2aWNlR3JvdXAgPT0gbnVsbCkgcmV0dXJuOwotCi0gICAgICAgIFN0cmluZyBncm91cE5hbWUgPSBzZXJ2aWNlR3JvdXAuZ2V0U2VydmljZUdyb3VwTmFtZSgpOwotICAgICAgICBPYmplY3Qgb2JqID0gYXBwbGljYXRpb25TZXNzaW9uU2VydmljZUdyb3VwQ29udGV4dHMuZ2V0KGdyb3VwTmFtZSk7Ci0gICAgICAgIGlmIChvYmogIT0gbnVsbCkgewotICAgICAgICAgICAgYXBwbGljYXRpb25TZXNzaW9uU2VydmljZUdyb3VwQ29udGV4dHMucmVtb3ZlKHNlcnZpY2VHcm91cC5nZXRTZXJ2aWNlR3JvdXBOYW1lKCkpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gdG9CZVJlbW92ZWRMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIEl0ZXJhdG9yPFNlcnZpY2VHcm91cENvbnRleHQ+IHNlcnZpY2VHcm91cENvbnRleHRzID0gc2VydmljZUdyb3VwQ29udGV4dE1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoc2VydmljZUdyb3VwQ29udGV4dHMuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBTZXJ2aWNlR3JvdXBDb250ZXh0IHNlcnZpY2VHcm91cENvbnRleHQgPQotICAgICAgICAgICAgICAgICAgICAoU2VydmljZUdyb3VwQ29udGV4dClzZXJ2aWNlR3JvdXBDb250ZXh0cy5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAoc2VydmljZUdyb3VwQ29udGV4dC5nZXREZXNjcmlwdGlvbigpLmVxdWFscyhzZXJ2aWNlR3JvdXApKSB7Ci0gICAgICAgICAgICAgICAgdG9CZVJlbW92ZWRMaXN0LmFkZChzZXJ2aWNlR3JvdXBDb250ZXh0LmdldElkKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZvciAoT2JqZWN0IGFUb0JlUmVtb3ZlZExpc3QgOiB0b0JlUmVtb3ZlZExpc3QpIHsKLSAgICAgICAgICAgIFN0cmluZyBzID0gKFN0cmluZylhVG9CZVJlbW92ZWRMaXN0OwotICAgICAgICAgICAgc2VydmljZUdyb3VwQ29udGV4dE1hcC5yZW1vdmUocyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQWJzdHJhY3RDb250ZXh0I2dldFJvb3RDb250ZXh0KCkKLSAgICAgKi8KLSAgICBwdWJsaWMgQ29uZmlndXJhdGlvbkNvbnRleHQgZ2V0Um9vdENvbnRleHQoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY29udGV4dC9Db25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb250ZXh0L0NvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGJhZDBlLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb250ZXh0L0NvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50Lio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LnV0aWwuVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzTW9kdWxlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2VHcm91cDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlRyYW5zcG9ydE91dERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuRGVwZW5kZW5jeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pMThuLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIubW9kdWxlcy5Nb2R1bGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuVHJhbnNwb3J0U2VuZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5Mb2FkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLlNlc3Npb25VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5IHsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKENvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeS5jbGFzcyk7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgQXhpc0NvbmZpZ3VyYXRpb24gZGVwZW5kaW5nIG9uIHRoZSB1c2VyIHJlcXVpcmVtZW50LgotICAgICAqIEZpcnN0IGNyZWF0ZXMgYW4gQXhpc0NvbmZpZ3VyYXRvciBvYmplY3Qgd2l0aCBhcHByb3ByaWF0ZSBwYXJhbWV0ZXJzLgotICAgICAqIERlcGVuZGluZyBvbiB0aGUgaW1wbGVtZW50YXRpb24gZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKSwgZ2V0cwotICAgICAqIHRoZSBBeGlzQ29uZmlndXJhdGlvbiBhbmQgdXNlcyBpdCB0byBjcmVhdGUgdGhlIENvbmZpZ3VyYXRpb25Db250ZXh0LgotICAgICAqCi0gICAgICogQHBhcmFtIGF4aXNDb25maWd1cmF0b3IgOiBBeGlzQ29uZmlndXJhdG9yCi0gICAgICogQHJldHVybiBSZXR1cm5zIENvbmZpZ3VyYXRpb25Db250ZXh0LgotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0IDogSWYgc29tdGhpbmcgZ29lcyB3cm9uZwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQ29uZmlndXJhdGlvbkNvbnRleHQgY3JlYXRlQ29uZmlndXJhdGlvbkNvbnRleHQoCi0gICAgICAgICAgICBBeGlzQ29uZmlndXJhdG9yIGF4aXNDb25maWd1cmF0b3IpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlnID0gYXhpc0NvbmZpZ3VyYXRvci5nZXRBeGlzQ29uZmlndXJhdGlvbigpOwotICAgICAgICAvLyBjYWxsIHRvIHRoZSBkZXBsb3ltZW50IGxpc3RuZXJzCi0gICAgICAgIFBhcmFtZXRlciBwYXJhbSA9IGF4aXNDb25maWcuZ2V0UGFyYW1ldGVyKENvbnN0YW50cy5Db25maWd1cmF0aW9uLkRFUExPWU1FTlRfTElGRV9DWUNMRV9MSVNURU5FUik7Ci0gICAgICAgIERlcGxveW1lbnRMaWZlQ3ljbGVMaXN0ZW5lciBkZXBsb3ltZW50TGlmZUN5Y2xlTGlzdGVuZXIgPSBudWxsOwotICAgICAgICBpZiAocGFyYW0gIT0gbnVsbCl7Ci0gICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gKFN0cmluZykgcGFyYW0uZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgZGVwbG95bWVudExpZmVDeWNsZUxpc3RlbmVyID0gKERlcGxveW1lbnRMaWZlQ3ljbGVMaXN0ZW5lcikgQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUpLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIkNhbiBub3QgaW5zdGFudGlhdGUgZGVwbG95bWVudCBMaXN0ZW5lciAiICsgY2xhc3NOYW1lLCBlKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJDYW4gbm90IGluc3RhbnRpYXRlIGRlcGxveW1lbnQgTGlzdGVuZXIgIiArIGNsYXNzTmFtZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIklsbGVnYWwgQWNjZXNzIGRlcGxveW1lbnQgTGlzdGVuZXIgIiArIGNsYXNzTmFtZSwgZSk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiSWxsZWdhbCBBY2Nlc3MgZGVwbG95bWVudCBMaXN0ZW5lciAiICsgY2xhc3NOYW1lKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiQ2xhc3Mgbm90IGZvdW5kIGRlcGxveW1lbnQgTGlzdGVuZXIgIiArIGNsYXNzTmFtZSwgZSk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiQ2xhc3Mgbm90IGZvdW5kIGRlcGxveW1lbnQgTGlzdGVuZXIgIiArIGNsYXNzTmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGRlcGxveW1lbnRMaWZlQ3ljbGVMaXN0ZW5lciAhPSBudWxsKXsKLSAgICAgICAgICAgIGRlcGxveW1lbnRMaWZlQ3ljbGVMaXN0ZW5lci5wcmVEZXBsb3koYXhpc0NvbmZpZyk7Ci0gICAgICAgIH0KLSAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ29udGV4dCA9IG5ldyBDb25maWd1cmF0aW9uQ29udGV4dChheGlzQ29uZmlnKTsKLQotICAgICAgICBpZiAoYXhpc0NvbmZpZ3VyYXRvciBpbnN0YW5jZW9mIERlcGxveW1lbnRFbmdpbmUpIHsKLSAgICAgICAgICAgICgoRGVwbG95bWVudEVuZ2luZSkgYXhpc0NvbmZpZ3VyYXRvcikuc2V0Q29uZmlnQ29udGV4dChjb25maWdDb250ZXh0KTsKLSAgICAgICAgfQotICAgICAgICAvL1RvIG92ZXJyaWRlIGNvbnRleHQgcGF0aAotICAgICAgICBzZXRDb250ZXh0UGF0aHMoYXhpc0NvbmZpZywgY29uZmlnQ29udGV4dCk7Ci0gICAgICAgIGluaXQoY29uZmlnQ29udGV4dCk7Ci0gICAgICAgIGF4aXNDb25maWd1cmF0b3IuZW5nYWdlR2xvYmFsTW9kdWxlcygpOwotICAgICAgICBheGlzQ29uZmlndXJhdG9yLmxvYWRTZXJ2aWNlcygpOwotICAgICAgICBhZGRNb2R1bGVTZXJ2aWNlKGNvbmZpZ0NvbnRleHQpOwotCi0gICAgICAgIC8vIFRPRE86IFRISVMgTkVFRFMgQSBURVNUIENBU0UhCi0gICAgICAgIGluaXRBcHBsaWNhdGlvblNjb3BlU2VydmljZXMoY29uZmlnQ29udGV4dCk7Ci0KLSAgICAgICAgYXhpc0NvbmZpZy5zZXRTdGFydCh0cnVlKTsKLSAgICAgICAgaWYgKGRlcGxveW1lbnRMaWZlQ3ljbGVMaXN0ZW5lciAhPSBudWxsKXsKLSAgICAgICAgICAgIGRlcGxveW1lbnRMaWZlQ3ljbGVMaXN0ZW5lci5wb3N0RGVwbG95KGNvbmZpZ0NvbnRleHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gRmluYWxseSBpbml0aWFsaXplIHRoZSBjbHVzdGVyCi0gICAgICAgIGlmIChheGlzQ29uZmlnLmdldENsdXN0ZXJNYW5hZ2VyKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgY29uZmlnQ29udGV4dC5pbml0Q2x1c3RlcigpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gY29uZmlnQ29udGV4dDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGluaXRBcHBsaWNhdGlvblNjb3BlU2VydmljZXMoQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ3R4KQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIEl0ZXJhdG9yIHNlcnZpY2VHcm91cHMgPSBjb25maWdDdHguZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5nZXRTZXJ2aWNlR3JvdXBzKCk7Ci0gICAgICAgIHdoaWxlIChzZXJ2aWNlR3JvdXBzLmhhc05leHQoKSkgewotICAgICAgICAgICAgQXhpc1NlcnZpY2VHcm91cCBheGlzU2VydmljZUdyb3VwID0gKEF4aXNTZXJ2aWNlR3JvdXApIHNlcnZpY2VHcm91cHMubmV4dCgpOwotICAgICAgICAgICAgU3RyaW5nIG1heFNjb3BlID0gU2Vzc2lvblV0aWxzLmNhbGN1bGF0ZU1heFNjb3BlRm9yU2VydmljZUdyb3VwKGF4aXNTZXJ2aWNlR3JvdXApOwotICAgICAgICAgICAgaWYgKENvbnN0YW50cy5TQ09QRV9BUFBMSUNBVElPTi5lcXVhbHMobWF4U2NvcGUpKSB7Ci0gICAgICAgICAgICAgICAgU2VydmljZUdyb3VwQ29udGV4dCBzZXJ2aWNlR3JvdXBDb250ZXh0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ0N0eC5jcmVhdGVTZXJ2aWNlR3JvdXBDb250ZXh0KGF4aXNTZXJ2aWNlR3JvdXApOwotICAgICAgICAgICAgICAgIGNvbmZpZ0N0eC5hZGRTZXJ2aWNlR3JvdXBDb250ZXh0SW50b0FwcGxpY2F0aW9uU2NvcGVUYWJsZShzZXJ2aWNlR3JvdXBDb250ZXh0KTsKLSAgICAgICAgICAgICAgICBEZXBlbmRlbmN5TWFuYWdlci5pbml0U2VydmljZShzZXJ2aWNlR3JvdXBDb250ZXh0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYWRkTW9kdWxlU2VydmljZShDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDdHgpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlnID0gY29uZmlnQ3R4LmdldEF4aXNDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgIEhhc2hNYXAgbW9kdWxlcyA9IGF4aXNDb25maWcuZ2V0TW9kdWxlcygpOwotICAgICAgICBpZiAobW9kdWxlcyAhPSBudWxsICYmIG1vZHVsZXMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgSXRlcmF0b3IgbXBkdWxlSXRyID0gbW9kdWxlcy52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgd2hpbGUgKG1wZHVsZUl0ci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBBeGlzTW9kdWxlIGF4aXNNb2R1bGUgPSAoQXhpc01vZHVsZSkgbXBkdWxlSXRyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBVdGlscy5kZXBsb3lNb2R1bGVTZXJ2aWNlcyhheGlzTW9kdWxlLCBjb25maWdDdHgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXRDb250ZXh0UGF0aHMoQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0KSB7Ci0gICAgICAgIC8vIENoZWNraW5nIGZvciBjb250ZXh0IHBhdGgKLSAgICAgICAgUGFyYW1ldGVyIHNlcnZpY2VQYXRoID0gYXhpc0NvbmZpZy5nZXRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX1NFUlZJQ0VfUEFUSCk7Ci0gICAgICAgIGlmIChzZXJ2aWNlUGF0aCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgc3BhdGggPSAoKFN0cmluZykgc2VydmljZVBhdGguZ2V0VmFsdWUoKSkudHJpbSgpOwotICAgICAgICAgICAgaWYgKHNwYXRoLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgIGNvbmZpZ0NvbnRleHQuc2V0U2VydmljZVBhdGgoc3BhdGgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY29uZmlnQ29udGV4dC5zZXRTZXJ2aWNlUGF0aChDb25zdGFudHMuREVGQVVMVF9TRVJWSUNFU19QQVRIKTsKLSAgICAgICAgfQotCi0gICAgICAgIFBhcmFtZXRlciBjb250ZXh0UGF0aCA9IGF4aXNDb25maWcuZ2V0UGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9DT05URVhUX1JPT1QpOwotICAgICAgICBpZiAoY29udGV4dFBhdGggIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIGNwYXRoID0gKChTdHJpbmcpIGNvbnRleHRQYXRoLmdldFZhbHVlKCkpLnRyaW0oKTsKLSAgICAgICAgICAgIGlmIChjcGF0aC5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBjb25maWdDb250ZXh0LnNldENvbnRleHRSb290KGNwYXRoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNvbmZpZ0NvbnRleHQuc2V0Q29udGV4dFJvb3QoImF4aXMyIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUbyBnZXQgYSBDb25maWd1cmF0aW9uQ29udGV4dCBmb3IgIGdpdmVuIGRhdGEgLCBhbmQgdW5kZXJsaW5lIGltcGxlbWVudGF0aW9uCi0gICAgICogaXMgQXhpczIgZGVmYXVsdCBpbXBsIHdoaWNoIGlzIGZpbGUgc3lzdGVtIGJhc2VkIGRlcGxveW1lbnQgbW9kZWwgdG8gY3JlYXRlCi0gICAgICogYW4gQXhpc0NvbmZpZ3VyYXRpb24uCi0gICAgICogPHAvPgotICAgICAqIEhlcmUgZWl0aGVyIG9yIGJvdGggcGFyYW1ldGVyIGNhbiBiZSBudWxsLiBTbyB0aGF0IGJvaWwgZG93biB0byBmb2xsb3dpbmcKLSAgICAgKiBzY2VuYXJpb3MgYW5kIGl0IHNob3VsZCBub3RlIHRoYXQgcGFyYW1ldGVyIHZhbHVlIHNob3VsZCBiZSBmdWxsIHBhdGggLAotICAgICAqIHlvdSBhcmUgbm90IGFsbG93ZWQgdG8gZ2l2ZSBvbmUgcmVsYXRpdmUgdG8gb3RoZXIuIEFuZCB0aGVzZSB0d28gY2FuIGJlIGxvY2F0ZWQKLSAgICAgKiBpbiBjb21wbGV0ZWx5IGRpZmZlcmVudCBsb2NhdGlvbnMuCi0gICAgICogPHVsPgotICAgICAqIDxsaT5JZiBub25lIG9mIHRoZW0gYXJlIG51bGwgLCB0aGVuIEF4aXNDb25maWd1cmF0aW9uIHdpbGwgYmUgYmFzZWQgb24gdGhlCi0gICAgICogdmFsdWUgb2YgYXhpczJ4bWwgLCBhbmQgdGhlIHJlcG9zaXRvcnkgd2lsbCBiZSB0aGUgdmFsdWUgc3BlY2lmaWVkIGJ5IHRoZQotICAgICAqIHBhdGggcGFyYW1ldGVyIGFuZCB0aGVyZSB3aWxsIG5vdCBiZSBhbnkgYXNzdW1wdGlvbnMuPC9saT4KLSAgICAgKiA8bGk+SWYgYXhpczJ4bWwgaXMgbnVsbCAsIHRoZW4gdGhlIHJlcG9zaXRvcnkgd2lsbCBiZSB0aGUgdmFsdWUgc3BlY2ZpZWQgYnkKLSAgICAgKiBwYXRoIHBhcmFtZXRlciBhbmQgQXhpc0NvbmZpZ3VyYXRpb24gd2lsbCBiZSBjcmVhdGVkIHVzaW5nIGRlZmF1bHRfYXhpczIueG1sPC9saT4KLSAgICAgKiA8bGk+SWYgcGF0aCBwYXJhbWV0ZXIgaXMgbnVsbCAsIHRoZW4gQXhpc0NvbmZpZ3VyYXRpb24gd2lsbCBiZSBjcmVhdGVkIHVzaW5nCi0gICAgICogdGhhdCBheGlzMi54bWwuIEFuZCBhZnRlciBjcmVhdGluZyBBeGlzQ29uZmlndXJhdGlvbiBzeXN0ZW0gd2lsbCB0cnkgdG8KLSAgICAgKiBmaW5kIHVzZXIgaGFzIHNwZWNpZmllZCByZXBvc2l0b3J5IHBhcmFtZXRlciBpbiBheGlzMi54bWwKLSAgICAgKiAoJmx0O3BhcmFtZXRlciBuYW1lPSJyZXBvc2l0b3J5IiZndDtsb2NhdGlvbiBvZiB0aGUgcmVwbyZsdDsvcGFyYW1ldGVyJmd0OykgLCBpZiBpdAotICAgICAqIGZpbmQgdGhhdCB0aGVuIHJlcG9zaXRvcnkgd2lsbCBiZSB0aGUgdmFsdWUgc3BlY2lmaWVkIGJ5IHRoYXQgcGFyYW1ldGVyLjwvbGk+Ci0gICAgICogPGxpPklmIGJvdGggYXJlIG51bGwgLCB0aGVuIGl0IGlzIHNpbXBsZSAsIEFpeHNDb25maWd1cmF0aW9uIHdpbGwgYmUgY3JlYXRlZAotICAgICAqIHVzaW5nIGRlZmF1bHRfYXhpczIueG1sIGFuZCB0aGF0cyBpdC48L2xpPgotICAgICAqIDwvdWw+Ci0gICAgICogPHAvPgotICAgICAqIE5vdGUgOiByYXRoZXIgdGhhbiBwYXNzaW5nIGFueSBwYXJhbWV0ZXJzIHlvdSBjYW4gZ2l2ZSB0aGVtIGFzIFN5c3RlbQotICAgICAqIHByb3BlcnRpZXMuIFNpbXBsZSB5b3UgY2FuIGFkZCBmb2xsb3dpbmcgc3lzdGVtIHByb3BlcnRpZXMgYmVmb3JlCi0gICAgICogeW91IGNhbGwgdGhpcy4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPmF4aXMyLnJlcG8gOiBzYW1lIGFzIHBhdGggcGFyYW1ldGVyPC9saT4KLSAgICAgKiA8bGk+YXhpczIueG1sICA6IHNhbWUgYXMgYXhpczJ4bWw8L2xpPgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gcGF0aCAgICAgOiBsb2NhdGlvbiBvZiB0aGUgcmVwb3NpdG9yeQotICAgICAqIEBwYXJhbSBheGlzMnhtbCA6IGxvY2F0aW9uIG9mIHRoZSBheGlzMi54bWwgKGNvbmZpZ3VyYXRpb24pICwgeW91IGNhbiBub3QgZ2l2ZQotICAgICAqICAgICAgICAgICAgICAgICBheGlzMnhtbCByZWxhdGl2ZSB0byByZXBvc2l0b3J5LgotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgYnVpbHQgQ29uZmlndXJhdGlvbkNvbnRleHQuCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQgaW4gY2FzZSBvZiBwcm9ibGVtcwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQ29uZmlndXJhdGlvbkNvbnRleHQgY3JlYXRlQ29uZmlndXJhdGlvbkNvbnRleHRGcm9tRmlsZVN5c3RlbSgKLSAgICAgICAgICAgIFN0cmluZyBwYXRoLAotICAgICAgICAgICAgU3RyaW5nIGF4aXMyeG1sKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZUNvbmZpZ3VyYXRpb25Db250ZXh0KG5ldyBGaWxlU3lzdGVtQ29uZmlndXJhdG9yKHBhdGgsIGF4aXMyeG1sKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBDb25maWd1cmF0aW9uQ29udGV4dCBjcmVhdGVDb25maWd1cmF0aW9uQ29udGV4dEZyb21GaWxlU3lzdGVtKFN0cmluZyBwYXRoKQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVDb25maWd1cmF0aW9uQ29udGV4dEZyb21GaWxlU3lzdGVtKHBhdGgsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQ29uZmlndXJhdGlvbkNvbnRleHQgY3JlYXRlQ29uZmlndXJhdGlvbkNvbnRleHRGcm9tVVJJcygKLSAgICAgICAgICAgIFVSTCBheGlzMnhtbCwgVVJMIHJlcG9zaXRveSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVDb25maWd1cmF0aW9uQ29udGV4dChuZXcgVVJMQmFzZWRBeGlzQ29uZmlndXJhdG9yKGF4aXMyeG1sLCByZXBvc2l0b3kpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbml0aWFsaXplcyBtb2R1bGVzIGFuZCBjcmVhdGVzIFRyYW5zcG9ydHMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29uZmlnQ29udGV4dCBDb25maWd1cmF0aW9uQ29udGV4dAotICAgICAqLwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBpbml0KENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQpIHsKLSAgICAgICAgaW5pdE1vZHVsZXMoY29uZmlnQ29udGV4dCk7Ci0gICAgICAgIGluaXRUcmFuc3BvcnRTZW5kZXJzKGNvbmZpZ0NvbnRleHQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluaXRpYWxpemVzIHRoZSBtb2R1bGVzLiBJZiB0aGUgbW9kdWxlIG5lZWRzIHRvIHBlcmZvcm0gc29tZSByZWNvdmVyeSBwcm9jZXNzCi0gICAgICogaXQgY2FuIGRvIHNvIGluIGluaXQgYW5kIHRoaXMgaXMgZGlmZmVyZW50IGZyb20gbW9kdWxlLmVuZ2FnZSgpLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbnRleHQgOiBDb25maWd1cmF0aW9uQ29udGV4dAotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgaW5pdE1vZHVsZXMoQ29uZmlndXJhdGlvbkNvbnRleHQgY29udGV4dCkgewotICAgICAgICBBeGlzQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uID0gY29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpOwotICAgICAgICBIYXNoTWFwIG1vZHVsZXMgPSBjb25maWd1cmF0aW9uLmdldE1vZHVsZXMoKTsKLSAgICAgICAgQ29sbGVjdGlvbiBjb2wgPSBtb2R1bGVzLnZhbHVlcygpOwotICAgICAgICBNYXAgZmF1bHR5TW9kdWxlID0gbmV3IEhhc2hNYXAoKTsKLQotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gY29sLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIEF4aXNNb2R1bGUgYXhpc21vZHVsZSA9IChBeGlzTW9kdWxlKSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICBNb2R1bGUgbW9kdWxlID0gYXhpc21vZHVsZS5nZXRNb2R1bGUoKTsKLQotICAgICAgICAgICAgaWYgKG1vZHVsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgbW9kdWxlLmluaXQoY29udGV4dCwgYXhpc21vZHVsZSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGF4aXNGYXVsdCkgewotICAgICAgICAgICAgICAgICAgICBsb2cuaW5mbyhheGlzRmF1bHQuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgZmF1bHR5TW9kdWxlLnB1dChheGlzbW9kdWxlLCBheGlzRmF1bHQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vQ2hlY2tpbmcgd2hldGhlciB3ZSBoYXZlIGZvdW5kIGFueSBmYXVsdHkgc2VydmljZXMgZHVyaW5nIHRoZSBtb2R1bGUgaW5pdGlsaXphdGlvbiAsCi0gICAgICAgIC8vIGlmIHNvIHdlIG5lZWQgdG8gbWFyayB0aGVtIGFzIGZhdXR5TW9kdWxlIGFuZCBuZWVkIHRvIHJlbW92ZSBmcm9tIHRoZSBtb2R1bGVzIGxpc3QKLSAgICAgICAgaWYgKGZhdWx0eU1vZHVsZS5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBJdGVyYXRvciBheGlzTW9kdWxlcyA9IGZhdWx0eU1vZHVsZS5rZXlTZXQoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgd2hpbGUgKGF4aXNNb2R1bGVzLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIEF4aXNNb2R1bGUgYXhpc01vZHVsZSA9IChBeGlzTW9kdWxlKSBheGlzTW9kdWxlcy5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGZpbGVOYW1lOwotICAgICAgICAgICAgICAgIGlmIChheGlzTW9kdWxlLmdldEZpbGVOYW1lKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZSA9IGF4aXNNb2R1bGUuZ2V0RmlsZU5hbWUoKS50b1N0cmluZygpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lID0gYXhpc01vZHVsZS5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24uZ2V0RmF1bHR5TW9kdWxlcygpLnB1dChmaWxlTmFtZSwgZmF1bHR5TW9kdWxlLmdldChheGlzTW9kdWxlKS50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAvL3JlbW92aW5nIGZyb20gb3JpZ2luYWwgbGlzdAotICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24ucmVtb3ZlTW9kdWxlKGF4aXNNb2R1bGUuZ2V0TmFtZSgpLCBheGlzTW9kdWxlLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5pdGlhbGl6ZXMgVHJhbnNwb3J0U2VuZGVycyBhbmQgVHJhbnNwb3J0TGlzdGVuZXJzIHdpdGggYXBwcm9wcmlhdGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbmZpZ0NvbnRleHQgOiBDb25maWd1cmF0aW9uQ29udGV4dAotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgaW5pdFRyYW5zcG9ydFNlbmRlcnMoQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ29udGV4dCkgewotICAgICAgICBBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZiA9IGNvbmZpZ0NvbnRleHQuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKTsKLQotICAgICAgICAvLyBJbml0aWFsaXplIFRyYW5zcG9ydCBPdXRzCi0gICAgICAgIEhhc2hNYXAgdHJhbnNwb3J0T3V0cyA9IGF4aXNDb25mLmdldFRyYW5zcG9ydHNPdXQoKTsKLQotICAgICAgICBJdGVyYXRvciB2YWx1ZXMgPSB0cmFuc3BvcnRPdXRzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0KLSAgICAgICAgd2hpbGUgKHZhbHVlcy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIFRyYW5zcG9ydE91dERlc2NyaXB0aW9uIHRyYW5zcG9ydE91dCA9IChUcmFuc3BvcnRPdXREZXNjcmlwdGlvbikgdmFsdWVzLm5leHQoKTsKLSAgICAgICAgICAgIFRyYW5zcG9ydFNlbmRlciBzZW5kZXIgPSB0cmFuc3BvcnRPdXQuZ2V0U2VuZGVyKCk7Ci0KLSAgICAgICAgICAgIGlmIChzZW5kZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHNlbmRlci5pbml0KGNvbmZpZ0NvbnRleHQsIHRyYW5zcG9ydE91dCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGF4aXNGYXVsdCkgewotICAgICAgICAgICAgICAgICAgICBsb2cuaW5mbyhNZXNzYWdlcy5nZXRNZXNzYWdlKCJ0cmFuc3BvcnRpbml0ZXJyb3IiLCB0cmFuc3BvcnRPdXQuZ2V0TmFtZSgpKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogY3JlYXRlcyBhbiBlbXB0eSBjb25maWd1cmF0aW9uIGNvbnRleHQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgQ29uZmlndXJhdGlvbkNvbnRleHQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBDb25maWd1cmF0aW9uQ29udGV4dCBjcmVhdGVFbXB0eUNvbmZpZ3VyYXRpb25Db250ZXh0KCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIEF4aXNDb25maWd1cmF0aW9uIGF4aXNDb25maWd1cmF0aW9uID0gbmV3IEF4aXNDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQgPSBuZXcgQ29uZmlndXJhdGlvbkNvbnRleHQoYXhpc0NvbmZpZ3VyYXRpb24pOwotICAgICAgICBpZiAoYXhpc0NvbmZpZ3VyYXRpb24uZ2V0Q2x1c3Rlck1hbmFnZXIoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjb25maWdDb250ZXh0LmluaXRDbHVzdGVyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBzZXRDb250ZXh0UGF0aHMoYXhpc0NvbmZpZ3VyYXRpb24sIGNvbmZpZ0NvbnRleHQpOwotICAgICAgICByZXR1cm4gY29uZmlnQ29udGV4dDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gY29udGV4dCBieSB1c2luZyBBeGlzMi54bWwgaW4gdGhlIGNsYXNzcGF0aAotICAgICAqCi0gICAgICogQHJldHVybiBSZXR1cm5zIENvbmZpZ3VyYXRpb25Db250ZXh0LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQ29uZmlndXJhdGlvbkNvbnRleHQgY3JlYXRlRGVmYXVsdENvbmZpZ3VyYXRpb25Db250ZXh0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVCYXNpY0NvbmZpZ3VyYXRpb25Db250ZXh0KERlcGxveW1lbnRDb25zdGFudHMuQVhJUzJfQ09ORklHVVJBVElPTl9SRVNPVVJDRSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENyZWF0ZXMgY29uZmlndXJhdGlvbiBjb250ZXh0IHVzaW5nIHJlc291cmNlIGZpbGUgZm91bmQgaW4gdGhlIGNsYXNzcGF0aC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gUmV0dXJucyBDb25maWd1cmF0aW9uQ29udGV4dC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIENvbmZpZ3VyYXRpb25Db250ZXh0IGNyZWF0ZUJhc2ljQ29uZmlndXJhdGlvbkNvbnRleHQoU3RyaW5nIHJlc291cmNlTmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIElucHV0U3RyZWFtIGluID0gTG9hZGVyLmdldFJlc291cmNlQXNTdHJlYW0ocmVzb3VyY2VOYW1lKTsKLQotICAgICAgICBBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlnID0gbmV3IEF4aXNDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgIEF4aXNDb25maWdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgQXhpc0NvbmZpZ0J1aWxkZXIoaW4sIGF4aXNDb25maWcsIG51bGwpOwotICAgICAgICBidWlsZGVyLnBvcHVsYXRlQ29uZmlnKCk7Ci0gICAgICAgIGF4aXNDb25maWcudmFsaWRhdGVTeXN0ZW1QcmVkZWZpbmVkUGhhc2VzKCk7Ci0gICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQgPSBuZXcgQ29uZmlndXJhdGlvbkNvbnRleHQoYXhpc0NvbmZpZyk7Ci0KLSAgICAgICAgaWYgKGF4aXNDb25maWcuZ2V0Q2x1c3Rlck1hbmFnZXIoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjb25maWdDb250ZXh0LmluaXRDbHVzdGVyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBzZXRDb250ZXh0UGF0aHMoYXhpc0NvbmZpZywgY29uZmlnQ29udGV4dCk7Ci0gICAgICAgIHJldHVybiBjb25maWdDb250ZXh0OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb250ZXh0L0NvbnRleHRMaXN0ZW5lci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvbnRleHQvQ29udGV4dExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkYTZlNTYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvbnRleHQvQ29udGV4dExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY29udGV4dDsKLQotLyoqCi0gKiBBIENvbnRleHRMaXN0ZW5lciBnZXRzIGluZm9ybWVkIGFib3V0IG5ldyBjb250ZXh0IGNyZWF0aW9ucyAmIHJlbW92YWwgb2YgZXhpc3RpbmcgY29udGV4dHMuCi0gKiBSZWdpc3RlciBvbmUgd2l0aCBhIENvbmZpZ3VyYXRpb25Db250ZXh0IGFuZCB5b3UnbGwgZ2V0IG5vdGlmaWNhdGlvbnMgZm9yIGV2ZXJ5Ci0gKiBzdWItY29udGV4dCBjcmVhdGlvbiAmIHJlbW92YWwgZXZlbnQuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29udGV4dExpc3RlbmVyIHsKLQotICAgIC8qKgotICAgICAqIEEgY29udGV4dCBoYXMgYmVlbiBhZGRlZAotICAgICAqCi0gICAgICogQHBhcmFtIGNvbnRleHQKLSAgICAgKi8KLSAgICB2b2lkIGNvbnRleHRDcmVhdGVkKEFic3RyYWN0Q29udGV4dCBjb250ZXh0KTsKLQotICAgIC8qKgotICAgICAqIEEgY29udGV4dCBoYXMgYmVlbiByZW1vdmVkCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29udGV4dAotICAgICAqLwotICAgIHZvaWQgY29udGV4dFJlbW92ZWQoQWJzdHJhY3RDb250ZXh0IGNvbnRleHQpOwotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvbnRleHQvTWVzc2FnZUNvbnRleHQuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb250ZXh0L01lc3NhZ2VDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjYjc0NjAuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvbnRleHQvTWVzc2FnZUNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyNjUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLmF0dGFjaG1lbnRzLkF0dGFjaG1lbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01PdXRwdXRGb3JtYXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS51dGlsLkRldGFjaGFibGVJbnB1dFN0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLnV0aWwuVVVJREdlbmVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUDExQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQMTJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50cy5Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuUmVsYXRlc1RvOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50Lk9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LmV4dGVybmFsaXplLkFjdGl2YXRlVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LmV4dGVybmFsaXplLkV4dGVybmFsaXplQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5leHRlcm5hbGl6ZS5NZXNzYWdlRXh0ZXJuYWxpemVVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuZXh0ZXJuYWxpemUuU2FmZU9iamVjdElucHV0U3RyZWFtOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5leHRlcm5hbGl6ZS5TYWZlT2JqZWN0T3V0cHV0U3RyZWFtOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5leHRlcm5hbGl6ZS5TYWZlU2VyaWFsaXphYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc0JpbmRpbmc7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzQmluZGluZ01lc3NhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzQmluZGluZ09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNFbmRwb2ludDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNNZXNzYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc01vZHVsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlR3JvdXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5IYW5kbGVyRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5Nb2R1bGVDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uVHJhbnNwb3J0SW5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlRyYW5zcG9ydE91dERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNFcnJvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5IYW5kbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLlBoYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5KYXZhVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLkxvZ2dpbmdDb250cm9sOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5NZXRhRGF0YUVudHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5TZWxmTWFuYWdlZERhdGFIb2xkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLldTRExVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubmVldGhpLlBvbGljeTsKLQotaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXI7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRXh0ZXJuYWxpemFibGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0OwotaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIDxwPkF4aXMyIHN0YXRlcyBhcmUgaGVsZCBpbiB0d28gaW5mb3JtYXRpb24gbW9kZWxzLCBjYWxsZWQgZGVzY3JpcHRpb24gaGllcmFyY2h5Ci0gKiAgYW5kIGNvbnRleHQgaGllcmFyY2h5LiBEZXNjcmlwdGlvbiBoaWVyYXJjaHkgaG9sZCBkZXBsb3ltZW50IGNvbmZpZ3VyYXRpb24gCi0gKiAgYW5kIGl0J3MgdmFsdWVzIGRvZXMgbm90IGNoYW5nZSB1bmxlc3MgZGVwbG95bWVudCBjb25maWd1cmF0aW9uIGNoYW5nZSAKLSAqICBvY2N1cnMgd2hlcmUgQ29udGV4dCBoaWVyYXJjaHkgaG9sZCBydW4gdGltZSBpbmZvcm1hdGlvbi4gQm90aCBoaWVyYXJjaGllcyAKLSAqICBjb25zaXN0cyBmb3VyIGxldmVscywgR2xvYmFsLCBTZXJ2aWNlIEdyb3VwLCBPcGVyYXRpb24gYW5kIE1lc3NhZ2UuIFBsZWFzZSAKLSAqICBsb29rIGF0ICJJbmZvcm1hdGlvbiBNb2RlbCIgc2VjdGlvbiAgb2YgIkF4aXMyIEFyY2hpdGVjdHVyZSBHdWlkZSIgZm9yIG1vcmUgCi0gKiAgaW5mb3JtYXRpb24uPC9wPgotICogIDxwPk1lc3NhZ2VDb250ZXh0IGhvbGQgcnVuIHRpbWUgaW5mb3JtYXRpb24gYWJvdXQgb25lIE1lc3NhZ2UgaW52b2NhdGlvbi4gSXQgCi0gKiAgaG9sZCByZWZlcmVuY2UgdG8gT3BlcmF0aW9uQ29udGV4dCwgU2VydmljZUdyb3VwQ29udGV4dCwgYW5kIENvbmZpZ3VyYXRpb24gCi0gKiAgQ29udGV4dCB0aWVkIHdpdGggY3VycmVudCBtZXNzYWdlLiBGb3IgYW4gZXhhbXBsZSBpZiB5b3UgbmVlZCBhY2Nlc3NlcyB0byBvdGhlciAKLSAqICBtZXNzYWdlcyBvZiB0aGUgY3VycmVudCBpbnZvY2F0aW9uLCB5b3UgY2FuIGdldCB0byB0aGVtIHZpYSBPcGVyYXRpb25Db250ZXh0LiAKLSAqICBBZGRpdGlvbiB0byBjbGFzcyBhdHRyaWJ1dGVzIGRlZmluZSBpbiBNZXNzYWdlIGNvbnRleHQsIG1lc3NhZ2UgY29udGV4dCBzdG9yZXMgCi0gKiAgdGhlIGluZm9ybWF0aW9uIGFzIG5hbWUgdmFsdWUgcGFpcnMuIFRob3NlIG5hbWUgdmFsdWUgcGFpcnMsYW5kIGNsYXNzIGF0dHJpYnV0ZXMgCi0gKiAgdHdlYWsgdGhlIGV4ZWN1dGlvbiBiZWhhdmlvciBvZiBtZXNzYWdlIGNvbnRleHQgYW5kIHNvbWUgb2YgdGhlbSBjYW4gYmUgZmluZCBpbiAKLSAqICBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50cyBjbGFzcy4gKFRPRE8gd2Ugc2hvdWxkIHByb3ZpZGUgbGlzdCBvZiBzdXBwb3J0ZWQgCi0gKiAgb3B0aW9ucykuIFlvdSBtYXkgc2V0IHRoZW0gYXQgYW55IGxldmVsIG9mIGNvbnRleHQgaGllcmFyY2h5IGFuZCB0aGV5IHdpbGwgCi0gKiAgYWZmZWN0IGludm9jYXRpb25zIHJlbGF0ZWQgdG8gdGhlaXIgY2hpbGQgZWxlbWVudHMuIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIE1lc3NhZ2VDb250ZXh0IGV4dGVuZHMgQWJzdHJhY3RDb250ZXh0IAotICAgIGltcGxlbWVudHMgRXh0ZXJuYWxpemFibGUsIFNhZmVTZXJpYWxpemFibGUgewotCi0gICAgLyoKLSAgICAgKiBzZXR1cCBmb3IgbG9nZ2luZwotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhNZXNzYWdlQ29udGV4dC5jbGFzcyk7Ci0KLSAgICAvKioKLSAgICAgKiBAc2VyaWFsIEFuIElEIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGNvcnJlbGF0ZSBvcGVyYXRpb25zIG9uIGEgc2luZ2xlCi0gICAgICogbWVzc2FnZSBpbiB0aGUgbG9nIGZpbGVzLCBpcnJlc3BlY3RpdmUgb2YgdGhyZWFkIHN3aXRjaGVzLCBwZXJzaXN0ZW5jZSwKLSAgICAgKiBldGMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgbG9nQ29ycmVsYXRpb25JRCA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHN0cmluZyB3aWxsIGJlIHVzZWQgdG8gaG9sZCBhIGZvcm0gb2YgdGhlIGxvZ0NvcnJlbGF0aW9uSUQgdGhhdAotICAgICAqIGlzIG1vcmUgc3VpdGFibGUgZm9yIG91dHB1dCB0aGFuIGl0cyBnZW5lcmljIGZvcm0uCi0gICAgICovCi0gICAgcHJpdmF0ZSB0cmFuc2llbnQgU3RyaW5nIGxvZ0NvcnJlbGF0aW9uSURTdHJpbmcgPSBudWxsOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIG15Q2xhc3NOYW1lID0gIk1lc3NhZ2VDb250ZXh0IjsKLQotICAgIC8qKgotICAgICAqIEBzZXJpYWwgVGhlIHNlcmlhbGl6YXRpb24gdmVyc2lvbiBJRCB0cmFja3MgdGhlIHZlcnNpb24gb2YgdGhlIGNsYXNzLgotICAgICAqIElmIGEgY2xhc3MgZGVmaW5pdGlvbiBjaGFuZ2VzLCB0aGVuIHRoZSBzZXJpYWxpemF0aW9uL2V4dGVybmFsaXphdGlvbgotICAgICAqIG9mIHRoZSBjbGFzcyBpcyBhZmZlY3RlZC4gSWYgYSBjaGFuZ2UgdG8gdGhlIGNsYXNzIGlzIG1hZGUgd2hpY2ggaXMKLSAgICAgKiBub3QgY29tcGF0aWJsZSB3aXRoIHRoZSBzZXJpYWxpemF0aW9uL2V4dGVybmFsaXphdGlvbiBvZiB0aGUgY2xhc3MsCi0gICAgICogdGhlbiB0aGUgc2VyaWFsaXphdGlvbiB2ZXJzaW9uIElEIHNob3VsZCBiZSB1cGRhdGVkLgotICAgICAqIFJlZmVyIHRvIHRoZSAic2VyaWFsVmVyIiB1dGlsaXR5IHRvIGNvbXB1dGUgYSBzZXJpYWxpemF0aW9uCi0gICAgICogdmVyc2lvbiBJRC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNzc1MzYzNzA4ODI1NzM5MTg1OEw7Ci0KLSAgICAvKioKLSAgICAgKiBAc2VyaWFsIFRyYWNrcyB0aGUgcmV2aXNpb24gbGV2ZWwgb2YgYSBjbGFzcyB0byBpZGVudGlmeSBjaGFuZ2VzIHRvIHRoZQotICAgICAqIGNsYXNzIGRlZmluaXRpb24gdGhhdCBhcmUgY29tcGF0aWJsZSB0byBzZXJpYWxpemF0aW9uL2V4dGVybmFsaXphdGlvbi4KLSAgICAgKiBJZiBhIGNsYXNzIGRlZmluaXRpb24gY2hhbmdlcywgdGhlbiB0aGUgc2VyaWFsaXphdGlvbi9leHRlcm5hbGl6YXRpb24KLSAgICAgKiBvZiB0aGUgY2xhc3MgaXMgYWZmZWN0ZWQuCi0gICAgICogUmVmZXIgdG8gdGhlIHdyaXRlRXh0ZXJuYWwoKSBhbmQgcmVhZEV4dGVybmFsKCkgbWV0aG9kcy4KLSAgICAgKi8KLSAgICAvLyBzdXBwb3J0ZWQgcmV2aXNpb24gbGV2ZWxzLCBhZGQgYSBuZXcgbGV2ZWwgdG8gbWFuYWdlIGNvbXBhdGlibGUgY2hhbmdlcwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRVZJU0lPTl8yID0gMjsKLSAgICAvLyBjdXJyZW50IHJldmlzaW9uIGxldmVsIG9mIHRoaXMgb2JqZWN0Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IHJldmlzaW9uSUQgPSBSRVZJU0lPTl8yOwotCi0KLSAgICAvKioKLSAgICAgKiBBIHBsYWNlIHRvIHN0b3JlIHRoZSBjdXJyZW50IE1lc3NhZ2VDb250ZXh0Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBUaHJlYWRMb2NhbDxNZXNzYWdlQ29udGV4dD4gY3VycmVudE1lc3NhZ2VDb250ZXh0ID0gbmV3IFRocmVhZExvY2FsPE1lc3NhZ2VDb250ZXh0PigpOwotCi0gICAgcHVibGljIHN0YXRpYyBNZXNzYWdlQ29udGV4dCBnZXRDdXJyZW50TWVzc2FnZUNvbnRleHQoKSB7Ci0gICAgICAgIHJldHVybiAoTWVzc2FnZUNvbnRleHQpIGN1cnJlbnRNZXNzYWdlQ29udGV4dC5nZXQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0Q3VycmVudE1lc3NhZ2VDb250ZXh0KE1lc3NhZ2VDb250ZXh0IGN0eCkgewotICAgICAgICBjdXJyZW50TWVzc2FnZUNvbnRleHQuc2V0KGN0eCk7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBAc2VyaWFsIE9wdGlvbnMgb24gdGhlIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgT3B0aW9ucyBvcHRpb25zOwotCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgSU5fRkxPVyA9IDE7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgSU5fRkFVTFRfRkxPVyA9IDM7Ci0KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBPVVRfRkxPVyA9IDI7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgT1VUX0ZBVUxUX0ZMT1cgPSA0OwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVNT1RFX0FERFIgPSAiUkVNT1RFX0FERFIiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQU5TUE9SVF9BRERSID0gIlRSQU5TUE9SVF9BRERSIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUUkFOU1BPUlRfSEVBREVSUyA9ICJUUkFOU1BPUlRfSEVBREVSUyI7Ci0KLQotICAgIC8qKgotICAgICAqIG1lc3NhZ2UgYXR0YWNobWVudHMKLSAgICAgKiBOT1RFOiBTZXJpYWxpemF0aW9uIG9mIG1lc3NhZ2UgYXR0YWNobWVudHMgaXMgaGFuZGxlZCBhcyBwYXJ0IG9mIHRoZQotICAgICAqIG92ZXJhbGwgbWVzc2FnZSBzZXJpYWxpemF0aW9uLiAgSWYgdGhpcyBuZWVkcyB0byBjaGFuZ2UsIHRoZW4KLSAgICAgKiBpbnZlc3RpZ2F0ZSBoYXZpbmcgdGhlIEF0dGFjaG1lbnQgY2xhc3MgaW1wbGVtZW50IHRoZQotICAgICAqIGphdmEuaW8uRXh0ZXJuYWxpemFibGUgaW50ZXJmYWNlLgotICAgICAqLwotICAgIHB1YmxpYyB0cmFuc2llbnQgQXR0YWNobWVudHMgYXR0YWNobWVudHM7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBUUkFOU1BPUlRfT1VUCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJBTlNQT1JUX09VVCA9ICJUUkFOU1BPUlRfT1VUIjsKLQotICAgIC8qKgotICAgICAqIEZpZWxkIFRSQU5TUE9SVF9JTgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQU5TUE9SVF9JTiA9ICJUUkFOU1BPUlRfSU4iOwotCi0gICAgLyoqCi0gICAgICogRmllbGQgQ0hBUkFDVEVSX1NFVF9FTkNPRElORwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENIQVJBQ1RFUl9TRVRfRU5DT0RJTkcgPSAiQ0hBUkFDVEVSX1NFVF9FTkNPRElORyI7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBVVEZfOC4gVGhpcyBpcyB0aGUgJ3V0Zi04JyB2YWx1ZSBmb3IgQ0hBUkFDVEVSX1NFVF9FTkNPRElORwotICAgICAqIHByb3BlcnR5LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVURl84ID0gIlVURi04IjsKLQotICAgIC8qKgotICAgICAqIEZpZWxkIFVURl8xNi4gVGhpcyBpcyB0aGUgJ3V0Zi0xNicgdmFsdWUgZm9yIENIQVJBQ1RFUl9TRVRfRU5DT0RJTkcKLSAgICAgKiBwcm9wZXJ0eS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVVEZfMTYgPSAidXRmLTE2IjsKLQotICAgIC8qKgotICAgICAqIEZpZWxkIFRSQU5TUE9SVF9TVUNDRUVECi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJBTlNQT1JUX1NVQ0NFRUQgPSAiVFJBTlNQT1JUX1NVQ0NFRUQiOwotCi0gICAgLyoqCi0gICAgICogRmllbGQgREVGQVVMVF9DSEFSX1NFVF9FTkNPRElORy4gVGhpcyBpcyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IKLSAgICAgKiBDSEFSQUNURVJfU0VUX0VOQ09ESU5HIHByb3BlcnR5LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfQ0hBUl9TRVRfRU5DT0RJTkcgPSBVVEZfODsKLQotICAgIC8qKgotICAgICAqIEBzZXJpYWwgVGhlIGRpcmVjdGlvbiBmbG93IGluIHVzZSB0byBmaWd1cmUgb3V0IHdoaWNoIHBhdGggdGhlIG1lc3NhZ2UgaXMgaW4KLSAgICAgKiAoc2VuZCBvciByZWNlaXZlKQotICAgICAqLwotICAgIHB1YmxpYyBpbnQgRkxPVyA9IElOX0ZMT1c7Ci0KLSAgICAvKioKLSAgICAgKiBUbyBpbnZva2UgZmlyZUFuZGZvcmdldCBtZXRob2Qgd2UgaGF2ZSB0byBoYW5kIG92ZXIgdHJhbnNwb3J0IHNlbmRpbmcgbG9naWMgdG8gYSB0aHJlYWQKLSAgICAgKiBvdGhlciB3aXNlIHVzZXIgaGFzIHRvIHdhaXQgdGlsbCBpdCBnZXQgdHJhbnNwb3J0IHJlc3BvbnNlIChpbiB0aGUgY2FzZSBvZiBIVFRQIGl0cyBIVFRQCi0gICAgICogMjAyKQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQU5TUE9SVF9OT05fQkxPQ0tJTkcgPSAidHJhbnNwb3J0Tm9uQmxvY2tpbmciOwotCi0gICAgLyoqCi0gICAgICogVGhpcyBwcm9wZXJ0eSBhbGxvd3Mgc29tZW9uZSAoZS5nLiBSTSkgdG8gZGlzYWJsZSBhbiBhc3luYyBjYWxsYmFjayBmcm9tCi0gICAgICogYmVpbmcgaW52b2tlZCBpZiBhIGZhdWx0IG9jY3VycyBkdXJpbmcgbWVzc2FnZSB0cmFuc21pc3Npb24uICBJZiB0aGlzIGlzCi0gICAgICogbm90IHNldCwgaXQgY2FuIGJlIGFzc3VtZWQgdGhhdCB0aGUgZmF1bHQgd2lsbCBiZSBkZWxpdmVyZWQgdmlhCi0gICAgICogQ2FsbGJhY2sub25FcnJvciguLi4pLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0FCTEVfQVNZTkNfQ0FMTEJBQ0tfT05fVFJBTlNQT1JUX0VSUk9SID0KLSAgICAgICAgICAgICJkaXNhYmxlVHJhbnNtaXNzaW9uRXJyb3JDYWxsYmFjayI7Ci0KLSAgICAvKioKLSAgICAgKiBAc2VyaWFsIHByb2Nlc3NpbmdGYXVsdAotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBwcm9jZXNzaW5nRmF1bHQ7Ci0KLSAgICAvKioKLSAgICAgKiBAc2VyaWFsIHBhdXNlZAotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBwYXVzZWQ7Ci0KLSAgICAvKioKLSAgICAgKiBAc2VyaWFsIG91dHB1dFdyaXR0ZW4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBvdXRwdXRXcml0dGVuOwotCi0gICAgLyoqCi0gICAgICogQHNlcmlhbCBuZXdUaHJlYWRSZXF1aXJlZAotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBuZXdUaHJlYWRSZXF1aXJlZDsKLQotICAgIC8qKgotICAgICAqIEBzZXJpYWwgaXNTT0FQMTEKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNTT0FQMTEgPSB0cnVlOwotCi0gICAgLyoqCi0gICAgICogQHNlcmlhbCBUaGUgY2hhaW4gb2YgSGFuZGxlcnMvUGhhc2VzIGZvciBwcm9jZXNzaW5nIHRoaXMgbWVzc2FnZQotICAgICAqLwotICAgIHByaXZhdGUgQXJyYXlMaXN0PEhhbmRsZXI+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+IG1hcCkgewotICAgICAgICBzZWxmTWFuYWdlZERhdGFNYXAgPSBtYXA7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0T3B0aW9uc0V4cGxpY2l0KE9wdGlvbnMgb3ApIHsKLSAgICAgICAgdGhpcy5vcHRpb25zID0gb3A7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBUcmFjZSBhIHdhcm5pbmcgbWVzc2FnZSwgaWYgbmVlZGVkLCBpbmRpY2F0aW5nIHRoYXQgdGhpcwotICAgICAqIG9iamVjdCBuZWVkcyB0byBiZSBhY3RpdmF0ZWQgYmVmb3JlIGFjY2Vzc2luZyBjZXJ0YWluIGZpZWxkcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXRob2RuYW1lIFRoZSBtZXRob2Qgd2hlcmUgdGhlIHdhcm5pbmcgb2NjdXJzCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrQWN0aXZhdGVXYXJuaW5nKFN0cmluZyBtZXRob2RuYW1lKSB7Ci0gICAgICAgIGlmIChuZWVkc1RvQmVSZWNvbmNpbGVkKSB7Ci0gICAgICAgICAgICBpZiAoTG9nZ2luZ0NvbnRyb2wuZGVidWdMb2dnaW5nQWxsb3dlZCAmJiBsb2cuaXNXYXJuRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLndhcm4oZ2V0TG9nSURTdHJpbmcoKSArICI6IiArIG1ldGhvZG5hbWUgKyAiKCk6ICoqKipXQVJOSU5HKioqKiAiICsgbXlDbGFzc05hbWUgKwotICAgICAgICAgICAgICAgICAgICAiLmFjdGl2YXRlKGNvbmZpZ3VyYXRpb25Db250ZXh0KSBuZWVkcyB0byBiZSBpbnZva2VkLiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIENvbmZpZ3VyYXRpb25Db250ZXh0IGdldFJvb3RDb250ZXh0KCkgewotICAgICAgICByZXR1cm4gY29uZmlndXJhdGlvbkNvbnRleHQ7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNGYXVsdCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBnZXRFbnZlbG9wZSgpLmhhc0ZhdWx0KCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBUT0RPOiBXaGF0IHNob3VsZCB3ZSBiZSBkb2luZyBoZXJlPyAgTm8gZW52ZWxvcGUgY2VydGFpbmx5IHNlZW1zIGJhZC4uLi4KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogT2J0YWluIHRoZSBFeGNlcHRpb24gd2hpY2ggY2F1c2VkIHRoZSBwcm9jZXNzaW5nIGNoYWluIHRvIGhhbHQuCi0gICAgICogQHJldHVybiBudWxsLCBvciBhbiBFeGNlcHRpb24uCi0gICAgICovCi0gICAgcHVibGljIEV4Y2VwdGlvbiBnZXRGYWlsdXJlUmVhc29uKCkgewotICAgICAgICByZXR1cm4gZmFpbHVyZVJlYXNvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGZhaWx1cmUgcmVhc29uLiAgT25seSBBeGlzRW5naW5lIHNob3VsZCBldmVyIGRvIHRoaXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZmFpbHVyZVJlYXNvbiBhbiBFeGNlcHRpb24gd2hpY2ggY2F1c2VkIHByb2Nlc3NpbmcgdG8gaGFsdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRGYWlsdXJlUmVhc29uKEV4Y2VwdGlvbiBmYWlsdXJlUmVhc29uKSB7Ci0gICAgICAgIHRoaXMuZmFpbHVyZVJlYXNvbiA9IGZhaWx1cmVSZWFzb247Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvbnRleHQvTWVzc2FnZUNvbnRleHRDb25zdGFudHMuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb250ZXh0L01lc3NhZ2VDb250ZXh0Q29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhNmI2MTAuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvbnRleHQvTWVzc2FnZUNvbnRleHRDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0OwotCi1wdWJsaWMgaW50ZXJmYWNlIE1lc3NhZ2VDb250ZXh0Q29uc3RhbnRzIHsKLQotICAgIC8qKgotICAgICAqIEBkZXByZWNhdGVkIHBsZWFzZSB1c2Ugb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHMuQ29uZmlndXJhdGlvbi5UUkFOU1BPUlRfVVJMICoKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUUkFOU1BPUlRfVVJMID0gIlRyYW5zcG9ydFVSTCI7Ci0KLQotICAgIC8qKgotICAgICAqIEBkZXByZWNhdGVkIHBsZWFzZSB1c2Ugb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5IVFRQQ29uc3RhbnRzLkNIVU5LRUQgKgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENIVU5LRUQgPSAiX19DSFVOS0VEX18iOwotCi0gICAgLyoqCi0gICAgICogQGRlcHJlY2F0ZWQgcGxlYXNlIHVzZSBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkhUVFBDb25zdGFudHMuSFRUUF9QUk9UT0NPTF9WRVJTSU9OICoKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQX1BST1RPQ09MX1ZFUlNJT04gPSAiX19IVFRQX1BST1RPQ09MX1ZFUlNJT05fXyI7Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY29udGV4dC9PcGVyYXRpb25Db250ZXh0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY29udGV4dC9PcGVyYXRpb25Db250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1ZTE2OWUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvbnRleHQvT3BlcmF0aW9uQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS51dGlsLlVVSURHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LmV4dGVybmFsaXplLkFjdGl2YXRlVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LmV4dGVybmFsaXplLkV4dGVybmFsaXplQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5leHRlcm5hbGl6ZS5TYWZlT2JqZWN0SW5wdXRTdHJlYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LmV4dGVybmFsaXplLlNhZmVPYmplY3RPdXRwdXRTdHJlYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LmV4dGVybmFsaXplLlNhZmVTZXJpYWxpemFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0NvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLk1ldGFEYXRhRW50cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLldTRExDb25zdGFudHMuV1NETDIwXzIwMDRfQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMQ29uc3RhbnRzLldTREwyMF8yMDA2Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZhLmlvLkV4dGVybmFsaXphYmxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dDsKLWltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiBBbiBPcGVyYXRpb25Db250ZXh0IHJlcHJlc2VudHMgYSBydW5uaW5nICJpbnN0YW5jZSIgb2YgYW4gb3BlcmF0aW9uLCB3aGljaCBpcwotICogcmVwcmVzZW50ZWQgYnkgYW4gQXhpc09wZXJhdGlvbiBvYmplY3QuIFRoaXMgY29uY2VwdCBpcyBuZWVkZWQgdG8gYWxsb3cKLSAqIG1lc3NhZ2VzIHRvIGJlIGdyb3VwZWQgaW50byBvcGVyYXRpb25zIGFzIGluIFdTREwgMi4wLXNwZWFrIG9wZXJhdGlvbnMgYXJlCi0gKiBlc3NlbnRpYWxseSBhcmJpdHJhcnkgbWVzc2FnZSBleGNoYW5nZSBwYXR0ZXJucy4gU28gYXMgbWVzc2FnZXMgYXJlIGJlaW5nCi0gKiBleGNoYW5nZWQgdGhlIE9wZXJhdGlvbkNvbnRleHQgcmVtZW1iZXJzIHRoZSBzdGF0ZSBvZiB3aGVyZSBpbiB0aGUgbWVzc2FnZQotICogZXhjaGFuZ2UgcGF0dGVybiBpdCBpcyBpbi4KLSAqIDxwLz4KLSAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIE9wZXJhdGlvbkNvbnRleHQKLSAqIHN1cHBvcnRzIE1FUHMgd2hpY2ggaGF2ZSBvbmUgaW5wdXQgbWVzc2FnZSBhbmQvb3Igb25lIG91dHB1dCBtZXNzYWdlLiBUaGF0Ci0gKiBpcywgaXQgc3VwcG9ydHMgdGhlIGFsbCB0aGUgTUVQcyB0aGF0IGFyZSBpbiB0aGUgV1NETCAyLjAgc3BlY2lmaWNhdGlvbi4gSW4KLSAqIG9yZGVyIHRvIHN1cHBvcnQgYW5vdGhlciBNRVAgb25lIG11c3QgZXh0ZW5kIHRoaXMgY2xhc3MgYW5kIHJlZ2lzdGVyIGl0cwotICogY3JlYXRpb24gaW4gdGhlIE9wZXJhdGlvbkNvbnRleEZhY3RvcnkuCi0gKi8KLXB1YmxpYyBjbGFzcyBPcGVyYXRpb25Db250ZXh0IGV4dGVuZHMgQWJzdHJhY3RDb250ZXh0IAotICAgIGltcGxlbWVudHMgRXh0ZXJuYWxpemFibGUsIFNhZmVTZXJpYWxpemFibGUgewotCi0gICAgLyoKLSAgICAgKiBzZXR1cCBmb3IgbG9nZ2luZwotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhPcGVyYXRpb25Db250ZXh0LmNsYXNzKTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBteUNsYXNzTmFtZSA9ICJPcGVyYXRpb25Db250ZXh0IjsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBkZWJ1Z0VuYWJsZWQgPSBsb2cuaXNEZWJ1Z0VuYWJsZWQoKTsKLQotICAgIC8qKgotICAgICAqIEFuIElEIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGNvcnJlbGF0ZSBvcGVyYXRpb25zIG9uIGFuIGluc3RhbmNlIG9mCi0gICAgICogdGhpcyBvYmplY3QgaW4gdGhlIGxvZyBmaWxlcwotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGxvZ0NvcnJlbGF0aW9uSURTdHJpbmcgPSBudWxsOwotCi0KLSAgICAvKioKLSAgICAgKiBAc2VyaWFsIFRoZSBzZXJpYWxpemF0aW9uIHZlcnNpb24gSUQgdHJhY2tzIHRoZSB2ZXJzaW9uIG9mIHRoZSBjbGFzcy4KLSAgICAgKiBJZiBhIGNsYXNzIGRlZmluaXRpb24gY2hhbmdlcywgdGhlbiB0aGUgc2VyaWFsaXphdGlvbi9leHRlcm5hbGl6YXRpb24KLSAgICAgKiBvZiB0aGUgY2xhc3MgaXMgYWZmZWN0ZWQuIElmIGEgY2hhbmdlIHRvIHRoZSBjbGFzcyBpcyBtYWRlIHdoaWNoIGlzCi0gICAgICogbm90IGNvbXBhdGlibGUgd2l0aCB0aGUgc2VyaWFsaXphdGlvbi9leHRlcm5hbGl6YXRpb24gb2YgdGhlIGNsYXNzLAotICAgICAqIHRoZW4gdGhlIHNlcmlhbGl6YXRpb24gdmVyc2lvbiBJRCBzaG91bGQgYmUgdXBkYXRlZC4KLSAgICAgKiBSZWZlciB0byB0aGUgInNlcmlhbFZlciIgdXRpbGl0eSB0byBjb21wdXRlIGEgc2VyaWFsaXphdGlvbgotICAgICAqIHZlcnNpb24gSUQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTcyNjQ3ODI3NzgzMzM1NTQzNTBMOwotCi0gICAgLyoqCi0gICAgICogQHNlcmlhbCBUcmFja3MgdGhlIHJldmlzaW9uIGxldmVsIG9mIGEgY2xhc3MgdG8gaWRlbnRpZnkgY2hhbmdlcyB0byB0aGUKLSAgICAgKiBjbGFzcyBkZWZpbml0aW9uIHRoYXQgYXJlIGNvbXBhdGlibGUgdG8gc2VyaWFsaXphdGlvbi9leHRlcm5hbGl6YXRpb24uCi0gICAgICogSWYgYSBjbGFzcyBkZWZpbml0aW9uIGNoYW5nZXMsIHRoZW4gdGhlIHNlcmlhbGl6YXRpb24vZXh0ZXJuYWxpemF0aW9uCi0gICAgICogb2YgdGhlIGNsYXNzIGlzIGFmZmVjdGVkLgotICAgICAqIFJlZmVyIHRvIHRoZSB3cml0ZUV4dGVybmFsKCkgYW5kIHJlYWRFeHRlcm5hbCgpIG1ldGhvZHMuCi0gICAgICovCi0gICAgLy8gc3VwcG9ydGVkIHJldmlzaW9uIGxldmVscywgYWRkIGEgbmV3IGxldmVsIHRvIG1hbmFnZSBjb21wYXRpYmxlIGNoYW5nZXMKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkVWSVNJT05fMiA9IDI7Ci0gICAgLy8gY3VycmVudCByZXZpc2lvbiBsZXZlbCBvZiB0aGlzIG9iamVjdAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCByZXZpc2lvbklEID0gUkVWSVNJT05fMjsKLQotCi0gICAgLyoqCi0gICAgICogQHNlcmlhbCBpc0NvbXBsZXRlIGZsYWcKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNDb21wbGV0ZTsKLQotICAgIC8qKgotICAgICAqIEBzZXJpYWwga2V5IHN0cmluZwotICAgICAqLwotICAgIC8vVGhlIGtleSB2YWx1ZSBvZiB0aGUgb3BlcmF0aW9uQ29udGV4dE1hcDsKLSAgICBwcml2YXRlIFN0cmluZyBrZXk7Ci0KLSAgICAvLyB0aGUgQXhpc09wZXJhdGlvbiBvZiB3aGljaCB0aGlzIGlzIGEgcnVubmluZyBpbnN0YW5jZS4gVGhlIE1FUCBvZiB0aGlzCi0gICAgLy8gQXhpc09wZXJhdGlvbiBtdXN0IGJlIG9uZSBvZiB0aGUgOCBwcmVkZWZpbmVkIG9uZXMgaW4gV1NETCAyLjAuCi0gICAgcHJpdmF0ZSB0cmFuc2llbnQgQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uOwotCi0gICAgLyoqCi0gICAgICogdGhlIHNldCBvZiBtZXNzYWdlIGNvbnRleHRzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG9wZXJhdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgdHJhbnNpZW50IEhhc2hNYXA8U3RyaW5nLCBNZXNzYWdlQ29udGV4dD4gbWVzc2FnZUNvbnRleHRzOwotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gTWV0YURhdGEgZm9yIGRhdGEgdG8gYmUgcmVzdG9yZWQgaW4gYWN0aXZhdGUgYWZ0ZXIgcmVhZEV4dGVybmFsCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvKioKLSAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgbWVzc2FnZSBjb250ZXh0IGhhcyBiZWVuIHJlY29uc3RpdHV0ZWQKLSAgICAgKiBhbmQgbmVlZHMgdG8gaGF2ZSBpdHMgb2JqZWN0IHJlZmVyZW5jZXMgcmVjb25jaWxlZAotICAgICAqLwotICAgIHByaXZhdGUgdHJhbnNpZW50IGJvb2xlYW4gbmVlZHNUb0JlUmVjb25jaWxlZCA9IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICogU3VwcHJlc3NlcyB3YXJuaW5nIG1lc3NhZ2VzIGZvciBhY3RpdmF0aW9uCi0gICAgICogd2hlbiBkb2luZyBpbnRlcm5hbCByZWNvbmNpbGlhdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgdHJhbnNpZW50IGJvb2xlYW4gc3VwcHJlc3NXYXJuaW5ncyA9IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICogVGhlIEF4aXNPcGVyYXRpb24gbWV0YWRhdGEgd2lsbCBiZSB1c2VkIGR1cmluZwotICAgICAqIGFjdGl2YXRlIHRvIG1hdGNoIHVwIHdpdGggYW4gZXhpc3Rpbmcgb2JqZWN0Ci0gICAgICovCi0gICAgcHJpdmF0ZSB0cmFuc2llbnQgTWV0YURhdGFFbnRyeSBtZXRhQXhpc09wZXJhdGlvbiA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgQXhpc1NlcnZpY2UgbWV0YWRhdGEgd2lsbCBiZSB1c2VkIGR1cmluZwotICAgICAqIGFjdGl2YXRlIHRvIG1hdGNoIHVwIHdpdGggYW4gZXhpc3Rpbmcgb2JqZWN0Ci0gICAgICovCi0gICAgcHJpdmF0ZSB0cmFuc2llbnQgTWV0YURhdGFFbnRyeSBtZXRhQXhpc1NlcnZpY2UgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogVGhlIFNlcnZpY2VDb250ZXh0IG1ldGFkYXRhIHdpbGwgYmUgdXNlZCBkdXJpbmcKLSAgICAgKiBhY3RpdmF0ZSB0byBtYXRjaCB1cCB3aXRoIGFuIGV4aXN0aW5nIG9iamVjdAotICAgICAqLwotICAgIHByaXZhdGUgdHJhbnNpZW50IFNlcnZpY2VDb250ZXh0IG1ldGFQYXJlbnQgPSBudWxsOwotCi0KLSAgICAvKioKLSAgICAgKiBUaGlzIGlzIHVzZWQgdG8gaG9sZCBpbmZvcm1hdGlvbiBhYm91dCBtZXNzYWdlIGNvbnRleHQgb2JqZWN0cwotICAgICAqIHRoYXQgYXJlIGluIHRoZSBtZXNzYWdlQ29udGV4dHMgbWFwLiAgVGhpcyBhbGxvd3MgbWVzc2FnZSBjb250ZXh0Ci0gICAgICogb2JqZWN0cyB0byBiZSBpc29sYXRlZCBmcm9tIHRoZSBvYmplY3QgZ3JhcGggc28gdGhhdCBkdXBsaWNhdGUKLSAgICAgKiBjb3BpZXMgb2Ygb2JqZWN0cyBhcmUgbm90IHNhdmVkL3Jlc3RvcmVkLgotICAgICAqLwotICAgIHByaXZhdGUgSGFzaE1hcCBtZXRhTWVzc2FnZUNvbnRleHRNYXAgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogVGhpcyBpcyB1c2VkIHRvIGhvbGQgdGVtcG9yYXJpbHkgYW55IG1lc3NhZ2UgY29udGV4dCBvYmplY3RzCi0gICAgICogdGhhdCB3ZXJlIGlzb2xhdGVkIGZyb20gdGhlIG1lc3NhZ2VDb250ZXh0cyBtYXAuCi0gICAgICovCi0gICAgcHJpdmF0ZSB0cmFuc2llbnQgSGFzaE1hcCBpc29sYXRlZE1lc3NhZ2VDb250ZXh0cyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIGlzIHVzZWQgdG8gaG9sZCB0ZW1wb3JhcmlseSBhbnkgbWVzc2FnZSBjb250ZXh0IG9iamVjdHMKLSAgICAgKiBmcm9tIHRoZSBtZXNzYWdlQ29udGV4dHMgbWFwIGZvciBzYXZlL3Jlc3RvcmUgYWN0aXZpdGllcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHRyYW5zaWVudCBIYXNoTWFwIHdvcmtpbmdTZXQgPSBudWxsOwotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gZW5kIE1ldGFEYXRhIHNlY3Rpb24KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKgotICAgICAqIFNpbXBsZSBjb25zdHJ1Y3RvciAobmVlZGVkIGZvciBkZXNlcmlhbGl6YXRpb24sIHNob3VsZG4ndCBiZSB1c2VkIG90aGVyd2lzZSEpCi0gICAgICovCi0gICAgcHVibGljIE9wZXJhdGlvbkNvbnRleHQoKSB7Ci0gICAgICAgIHN1cGVyKG51bGwpOwotICAgICAgICB0aGlzLm1lc3NhZ2VDb250ZXh0cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgTWVzc2FnZUNvbnRleHQ+KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBPcGVyYXRpb25Db250ZXh0LgotICAgICAqCi0gICAgICogQHBhcmFtIGF4aXNPcGVyYXRpb24gIHRoZSBBeGlzT3BlcmF0aW9uIHdob3NlIHJ1bm5pbmcgaW5zdGFuY2VzJyBzdGF0ZSB0aGlzCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgIE9wZXJhdGlvbkNvbnRleHQgcmVwcmVzZW50cy4KLSAgICAgKiBAcGFyYW0gc2VydmljZUNvbnRleHQgdGhlIHBhcmVudCBTZXJ2aWNlQ29udGV4dCByZXByZXNlbnRpbmcgYW55IHN0YXRlIHJlbGF0ZWQgdG8KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgdGhlIHNldCBvZiBhbGwgb3BlcmF0aW9ucyBvZiB0aGUgc2VydmljZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgT3BlcmF0aW9uQ29udGV4dChBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VydmljZUNvbnRleHQgc2VydmljZUNvbnRleHQpIHsKLSAgICAgICAgc3VwZXIoc2VydmljZUNvbnRleHQpOwotICAgICAgICB0aGlzLm1lc3NhZ2VDb250ZXh0cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgTWVzc2FnZUNvbnRleHQ+KCk7Ci0gICAgICAgIHRoaXMuYXhpc09wZXJhdGlvbiA9IGF4aXNPcGVyYXRpb247Ci0gICAgICAgIHRoaXMuc2V0UGFyZW50KHNlcnZpY2VDb250ZXh0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXaGVuIGEgbmV3IG1lc3NhZ2UgaXMgYWRkZWQgdG8gdGhlIDxjb2RlPk1FUENvbnRleHQ8L2NvZGU+IHRoZSBsb2dpYwotICAgICAqIHNob3VsZCBiZSBpbmNsdWRlZCByZW1vdmUgdGhlIE1FUENvbnRleHQgZnJvbSB0aGUgdGFibGUgaW4gdGhlCi0gICAgICogPGNvZGU+RW5naW5lQ29udGV4dDwvY29kZT4uIEV4YW1wbGU6IElOX0lOX09VVCBBdCB0aGUgc2Vjb25kIElOCi0gICAgICogbWVzc2FnZSB0aGUgTUVQQ29udGV4dCBzaG91bGQgYmUgcmVtb3ZlZCBmcm9tIHRoZSBBeGlzT3BlcmF0aW9uLgotICAgICAqCi0gICAgICogQHBhcmFtIG1zZ0NvbnRleHQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRNZXNzYWdlQ29udGV4dChNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgaWYgKGF4aXNPcGVyYXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgYXhpc09wZXJhdGlvbi5hZGRNZXNzYWdlQ29udGV4dChtc2dDb250ZXh0LCB0aGlzKTsKLSAgICAgICAgICAgIHRvdWNoKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgdGhlIHBvaW50ZXJzIHRvIHRoaXMgPGNvZGU+T3BlcmF0aW9uQ29udGV4dDwvY29kZT4gaW4gdGhlCi0gICAgICogPGNvZGU+Q29uZmlndXJhdGlvbkNvbnRleHQ8L2NvZGU+J3MgT3BlcmF0aW9uQ29udGV4dE1hcCBzbyB0aGF0IHRoaXMKLSAgICAgKiA8Y29kZT5PcGVyYXRpb25Db250ZXh0PC9jb2RlPiB3aWxsIGV2ZW50dWFsbHkgZ2V0IGdhcmJhZ2UgY29sbGVjdGVkCi0gICAgICogYWxvbmcgd2l0aCB0aGUgPGNvZGU+TWVzc2FnZUNvbnRleHQ8L2NvZGU+J3MgaXQgY29udGFpbnMuIE5vdGUgdGhhdCBpZgotICAgICAqIHRoZSBjYWxsZXIgd2FudHMgdG8gbWFrZSBzdXJlIGl0cyBzYWZlIHRvIGNsZWFuIHVwIHRoaXMgT3BlcmF0aW9uQ29udGV4dAotICAgICAqIGhlIHNob3VsZCBjYWxsIGlzQ29tcGxldGUoKSBmaXJzdC4gSG93ZXZlciwgaW4gY2FzZXMgbGlrZSBJTl9PUFRJT05BTF9PVVQKLSAgICAgKiBhbmQgT1VUX09QVElPTkFMX0lOLCBpdCBpcyBwb3NzaWJlIHRoaXMgd2lsbCBnZXQgY2FsbGVkIHdpdGhvdXQgdGhlIE1FUAotICAgICAqIGJlaW5nIGNvbXBsZXRlIGR1ZSB0byB0aGUgb3B0aW9uYWwgbmF0dXJlIG9mIHRoZSBNRVAuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY2xlYW51cCgpIHsKLSAgICAgICAgU2VydmljZUNvbnRleHQgc2VydiA9IGdldFNlcnZpY2VDb250ZXh0KCk7Ci0KLSAgICAgICAgaWYgKHNlcnYgIT0gbnVsbCkgewotICAgICAgICAgICAgc2Vydi5nZXRDb25maWd1cmF0aW9uQ29udGV4dCgpLnVucmVnaXN0ZXJPcGVyYXRpb25Db250ZXh0KGtleSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGF4aXNPcGVyYXRpb24uCi0gICAgICovCi0gICAgcHVibGljIEF4aXNPcGVyYXRpb24gZ2V0QXhpc09wZXJhdGlvbigpIHsKLSAgICAgICAgaWYgKG5lZWRzVG9CZVJlY29uY2lsZWQgJiYgIXN1cHByZXNzV2FybmluZ3MgJiYgZGVidWdFbmFibGVkKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoZ2V0TG9nQ29ycmVsYXRpb25JRFN0cmluZygpICsKLSAgICAgICAgICAgICAgICAgICAgIjpnZXRBeGlzT3BlcmF0aW9uKCk6ICoqKipXQVJOSU5HKioqKiBPcGVyYXRpb25Db250ZXh0LmFjdGl2YXRlKGNvbmZpZ3VyYXRpb25Db250ZXh0KSBuZWVkcyB0byBiZSBpbnZva2VkLiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGF4aXNPcGVyYXRpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgRW5naW5lQ29udGV4dCBpbiB3aGljaCB0aGUgcGFyZW50IFNlcnZpY2VDb250ZXh0IGxpdmVzLgotICAgICAqCi0gICAgICogQHJldHVybiBSZXR1cm5zIHBhcmVudCBTZXJ2aWNlQ29udGV4dCdzIHBhcmVudCBFbmdpbmVDb250ZXh0LgotICAgICAqLwotICAgIHB1YmxpYyBDb25maWd1cmF0aW9uQ29udGV4dCBnZXRDb25maWd1cmF0aW9uQ29udGV4dCgpIHsKLSAgICAgICAgaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChTZXJ2aWNlQ29udGV4dCkgcGFyZW50KS5nZXRDb25maWd1cmF0aW9uQ29udGV4dCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBtZXNzYWdlTGFiZWwKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgTWVzc2FnZUNvbnRleHQuCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQKLSAgICAgKi8KLSAgICBwdWJsaWMgTWVzc2FnZUNvbnRleHQgZ2V0TWVzc2FnZUNvbnRleHQoU3RyaW5nIG1lc3NhZ2VMYWJlbCkKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBpZiAobWVzc2FnZUNvbnRleHRzID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIChNZXNzYWdlQ29udGV4dCkgbWVzc2FnZUNvbnRleHRzLmdldChtZXNzYWdlTGFiZWwpOwotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlIHRoZSBpbmRpY2F0ZWQgbWVzc2FnZSBjb250ZXh0LgotICAgICAqIEV4YW1wbGUgVXNhZ2U6IFRoZSBleGNoYW5nZSBpcyBhYm9ydGVkIGFuZCB3ZSBuZWVkIHRvIAotICAgICAqIHVuZG8gdGhlIHdvcmsgYW5kIGZyZWUgcmVzb3VyY2VzLgotICAgICAqIEBwYXJhbSBsYWJlbAotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlTWVzc2FnZUNvbnRleHQoU3RyaW5nIGxhYmVsKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLQotICAgICAgICBNZXNzYWdlQ29udGV4dCBtYyA9IGdldE1lc3NhZ2VDb250ZXh0KGxhYmVsKTsKLSAgICAgICAgaWYgKG1jICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1lc3NhZ2VDb250ZXh0cy5yZW1vdmUobWMpOwotICAgICAgICAgICAgc2V0Q29tcGxldGUoZmFsc2UpOyAKLSAgICAgICAgICAgIHRvdWNoKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgICAgIAotCi0gICAgcHVibGljIEhhc2hNYXA8U3RyaW5nLCBNZXNzYWdlQ29udGV4dD4gZ2V0TWVzc2FnZUNvbnRleHRzKCkgewotICAgICAgICByZXR1cm4gbWVzc2FnZUNvbnRleHRzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIFNlcnZpY2VDb250ZXh0IGluIHdoaWNoIHRoaXMgT3BlcmF0aW9uQ29udGV4dCBsaXZlcy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gUmV0dXJucyBwYXJlbnQgU2VydmljZUNvbnRleHQuCi0gICAgICovCi0gICAgcHVibGljIFNlcnZpY2VDb250ZXh0IGdldFNlcnZpY2VDb250ZXh0KCkgewotICAgICAgICByZXR1cm4gKFNlcnZpY2VDb250ZXh0KSBwYXJlbnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIHRvIHNlZSBpZiB0aGUgTUVQIGlzIGNvbXBsZXRlLiBpLmUuIHdoZXRoZXIgYWxsIHRoZSBtZXNzYWdlcyB0aGF0Ci0gICAgICogYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgTUVQIGhhcyBhcnJpdmVkIGFuZCBNRVAgaXMgY29tcGxldGUuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNDb21wbGV0ZSgpIHsKLSAgICAgICAgcmV0dXJuIGlzQ29tcGxldGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q29tcGxldGUoYm9vbGVhbiBjb21wbGV0ZSkgewotICAgICAgICBpc0NvbXBsZXRlID0gY29tcGxldGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0S2V5KFN0cmluZyBrZXkpIHsKLSAgICAgICAgdGhpcy5rZXkgPSBrZXk7Ci0gICAgfQotCi0gICAgLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgKiBFeHRlcm5hbGl6YWJsZSBzdXBwb3J0Ci0gICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAqLwotCi0KLSAgICAvKioKLSAgICAgKiBTYXZlIHRoZSBjb250ZW50cyBvZiB0aGlzIG9iamVjdC4KLSAgICAgKiA8cC8+Ci0gICAgICogTk9URTogVHJhbnNpZW50IGZpZWxkcyBhbmQgc3RhdGljIGZpZWxkcyBhcmUgbm90IHNhdmVkLgotICAgICAqIEFsc28sIG9iamVjdHMgdGhhdCByZXByZXNlbnQgInN0YXRpYyIgZGF0YSBhcmUKLSAgICAgKiBub3Qgc2F2ZWQsIGV4Y2VwdCBmb3IgZW5vdWdoIGluZm9ybWF0aW9uIHRvIGJlCi0gICAgICogYWJsZSB0byBmaW5kIG1hdGNoaW5nIG9iamVjdHMgd2hlbiB0aGUgbWVzc2FnZQotICAgICAqIGNvbnRleHQgaXMgcmUtY29uc3RpdHV0ZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb3V0IFRoZSBzdHJlYW0gdG8gd3JpdGUgdGhlIG9iamVjdCBjb250ZW50cyB0bwotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUV4dGVybmFsKE9iamVjdE91dHB1dCBvKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBTYWZlT2JqZWN0T3V0cHV0U3RyZWFtIG91dCA9IFNhZmVPYmplY3RPdXRwdXRTdHJlYW0uaW5zdGFsbChvKTsKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gaW4gb3JkZXIgdG8gaGFuZGxlIGZ1dHVyZSBjaGFuZ2VzIHRvIHRoZSBtZXNzYWdlCi0gICAgICAgIC8vIGNvbnRleHQgZGVmaW5pdGlvbiwgYmUgc3VyZSB0byBtYWludGFpbiB0aGUKLSAgICAgICAgLy8gb2JqZWN0IGxldmVsIGlkZW50aWZpZXJzCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIHNlcmlhbGl6YXRpb24gdmVyc2lvbiBJRAotICAgICAgICBvdXQud3JpdGVMb25nKHNlcmlhbFZlcnNpb25VSUQpOwotCi0gICAgICAgIC8vIHJldmlzaW9uIElECi0gICAgICAgIG91dC53cml0ZUludChyZXZpc2lvbklEKTsKLQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyB2YXJpb3VzIHNpbXBsZSBmaWVsZHMKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICBvdXQud3JpdGVMb25nKGdldExhc3RUb3VjaGVkVGltZSgpKTsKLQotICAgICAgICBvdXQud3JpdGVCb29sZWFuKGlzQ29tcGxldGUpOwotICAgICAgICBvdXQud3JpdGVPYmplY3Qoa2V5KTsKLSAgICAgICAgb3V0LndyaXRlT2JqZWN0KGxvZ0NvcnJlbGF0aW9uSURTdHJpbmcpOwotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIHByb3BlcnRpZXMKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgb3V0LndyaXRlVVRGKCJwcm9wZXJ0aWVzIik7ICAvLyB3cml0ZSBtYXJrZXIKLSAgICAgICAgb3V0LndyaXRlTWFwKGdldFByb3BlcnRpZXMoKSk7Ci0KLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIG91dC53cml0ZVVURigibWV0YUF4aXNPcGVyYXRpb24iKTsgLy8gd3JpdGUgbWFya2VyCi0gICAgICAgIG1ldGFBeGlzT3BlcmF0aW9uID0gbnVsbDsKLSAgICAgICAgaWYgKGF4aXNPcGVyYXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgbWV0YUF4aXNPcGVyYXRpb24gPSBuZXcgTWV0YURhdGFFbnRyeShheGlzT3BlcmF0aW9uLmdldENsYXNzKCkuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzT3BlcmF0aW9uLmdldE5hbWUoKS50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgICAgICBvdXQud3JpdGVPYmplY3QobWV0YUF4aXNPcGVyYXRpb24pOwotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIEF4aXNPcGVyYXRpb24gYXhpc1NlcnZpY2UKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gc2F2ZSB0aGUgbWV0YSBkYXRhIGZvciB0aGUgY29ycmVzcG9uZGluZyBheGlzIHNlcnZpY2UgdG8gYmV0dGVyCi0gICAgICAgIC8vIG1hdGNoIHVwIHRoZSBheGlzIG9wZXJhdGlvbgotICAgICAgICBvdXQud3JpdGVVVEYoIm1ldGFBeGlzU2VydmljZSIpOyAvLyB3cml0ZSBtYXJrZXIKLSAgICAgICAgbWV0YUF4aXNTZXJ2aWNlID0gbnVsbDsKLSAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UgPSBheGlzT3BlcmF0aW9uLmdldEF4aXNTZXJ2aWNlKCk7Ci0KLSAgICAgICAgaWYgKGF4aXNTZXJ2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1ldGFBeGlzU2VydmljZSA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBNZXRhRGF0YUVudHJ5KGF4aXNTZXJ2aWNlLmdldENsYXNzKCkuZ2V0TmFtZSgpLCBheGlzU2VydmljZS5nZXROYW1lKCkpOwotICAgICAgICB9Ci0gICAgICAgIG91dC53cml0ZU9iamVjdChtZXRhQXhpc1NlcnZpY2UpOwotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIHBhcmVudAotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICBvdXQud3JpdGVVVEYoInBhcmVudCIpOyAvLyB3cml0ZSBtYXJrZXIKLSAgICAgICAgb3V0LndyaXRlT2JqZWN0KHRoaXMuZ2V0U2VydmljZUNvbnRleHQoKSk7Ci0KLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gSGFzaE1hcCBtZXNzYWdlQ29udGV4dHMgdGFibGUKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICAvLyBOT1RFUzogVGhlIGFzc3VtcHRpb24gaXMgdGhhdCB0aGUgdGFibGUgY29udGFpbnMgbWVzc2FnZSBjb250ZXh0cwotICAgICAgICAvLyB0aGF0IGFyZSBpbiB0aGUgT3BlcmF0aW9uQ29udGV4dCBoaWVyYXJjaHkuICBUbyByZWR1Y2Ugb3ZlcmxhcAotICAgICAgICAvLyBvZiBvYmplY3QgaW5mb3JtYXRpb24gdGhhdCBpcyBiZWluZyBzYXZlZCwgZXh0cmFjdCB0aGUKLSAgICAgICAgLy8gbWVzc2FnZSBjb250ZXh0IG9iamVjdHMgZnJvbSB0aGUgaGllcmFjaHkgYmVmb3JlIHNhdmluZy4KLSAgICAgICAgLy8gV2hlbiB0aGUgT3BlcmF0aW9uQ29udGV4dCBpcyByZXN0b3JlZCwgdGhlICJzbGltbWVkIGRvd24iCi0gICAgICAgIC8vIG1lc3NhZ2UgY29udGV4dCBvYmplY3RzIGFyZSBwbHVnZ2VkIGJhY2sgaW50byB0aGUgaGllcmFjaHkKLSAgICAgICAgLy8gdXNpbmcgdGhlIHJlc3RvcmVkIE9wZXJhdGlvbkNvbnRleHQgYXMgYSBiYXNpcy4KLQotICAgICAgICAvLyBmaXJzdCBkZWFsIHdpdGggdGhlIG9yaWdpbmFsIG1lc3NhZ2VDb250ZXh0cyB0YWJsZQotICAgICAgICBIYXNoTWFwIHRtcE1zZ0N0eE1hcCA9IG51bGw7Ci0KLSAgICAgICAgaWYgKChtZXNzYWdlQ29udGV4dHMgIT0gbnVsbCkgJiYgKCFtZXNzYWdlQ29udGV4dHMuaXNFbXB0eSgpKSkgewotICAgICAgICAgICAgLy8gY3JlYXRlIGEgdGFibGUgb2YgdGhlIG5vbi1pc29sYXRlZCBtZXNzYWdlIGNvbnRleHRzCi0gICAgICAgICAgICB3b3JraW5nU2V0ID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgICAgIHRtcE1zZ0N0eE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICAgICAgICAgIFNldCBrZXlTZXQgPSBtZXNzYWdlQ29udGV4dHMua2V5U2V0KCk7Ci0gICAgICAgICAgICBJdGVyYXRvciBpdEtleXMgPSBrZXlTZXQuaXRlcmF0b3IoKTsKLQotICAgICAgICAgICAgd2hpbGUgKGl0S2V5cy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAvLyBleHBlY3QgdGhlIGtleSB0byBiZSBhIHN0cmluZwotICAgICAgICAgICAgICAgIFN0cmluZyBrZXlPYmogPSAoU3RyaW5nKSBpdEtleXMubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBtZXNzYWdlIGNvbnRleHQgYXNzb2NpYXRlZCB3aXRoIHRoYXQgbGFiZWwKLSAgICAgICAgICAgICAgICBNZXNzYWdlQ29udGV4dCB2YWx1ZSA9IChNZXNzYWdlQ29udGV4dCkgbWVzc2FnZUNvbnRleHRzLmdldChrZXlPYmopOwotCi0gICAgICAgICAgICAgICAgYm9vbGVhbiBhZGRUb1dvcmtpbmdTZXQgPSB0cnVlOwotCi0gICAgICAgICAgICAgICAgLy8gY2hlY2sgdG8gc2VlIGlmIHRoaXMgbWVzc2FnZSBjb250ZXh0IHdhcyBpc29sYXRlZAotICAgICAgICAgICAgICAgIGlmIChpc29sYXRlZE1lc3NhZ2VDb250ZXh0cyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghaXNvbGF0ZWRNZXNzYWdlQ29udGV4dHMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBzZWUgaWYgdGhlIG1lc3NhZ2UgY29udGV4dCB3YXMgcHJldmlvdXNseSBpc29sYXRlZAotICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUNvbnRleHQgdmFsdWVJc29sYXRlZCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNZXNzYWdlQ29udGV4dCkgaXNvbGF0ZWRNZXNzYWdlQ29udGV4dHMuZ2V0KGtleU9iaik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZUlzb2xhdGVkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaWRJc29sID0gdmFsdWVJc29sYXRlZC5nZXRNZXNzYWdlSUQoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpZElzb2wgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWRJc29sLmVxdWFscyh2YWx1ZS5nZXRNZXNzYWdlSUQoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvbid0IGFkZCB0byB3b3JraW5nIHNldAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkVG9Xb3JraW5nU2V0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoYWRkVG9Xb3JraW5nU2V0KSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHB1dCB0aGUgbWV0YSBkYXRhIGVudHJ5IGluIHRoZSBsaXN0Ci0gICAgICAgICAgICAgICAgICAgIHdvcmtpbmdTZXQucHV0KGtleU9iaiwgdmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBub3cgd2UgaGF2ZSBhIHdvcmtpbmcgc2V0Ci0KLSAgICAgICAgICAgIFNldCBrZXlTZXQyID0gd29ya2luZ1NldC5rZXlTZXQoKTsKLSAgICAgICAgICAgIEl0ZXJhdG9yIGl0S2V5czIgPSBrZXlTZXQyLml0ZXJhdG9yKCk7Ci0KLSAgICAgICAgICAgIHdoaWxlIChpdEtleXMyLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIC8vIGV4cGVjdCB0aGUga2V5IHRvIGJlIGEgc3RyaW5nCi0gICAgICAgICAgICAgICAgU3RyaW5nIGtleU9iajIgPSAoU3RyaW5nKSBpdEtleXMyLm5leHQoKTsKLQotICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgbWVzc2FnZSBjb250ZXh0IGFzc29jaWF0ZWQgd2l0aCB0aGF0IGxhYmVsCi0gICAgICAgICAgICAgICAgTWVzc2FnZUNvbnRleHQgbWMgPSAoTWVzc2FnZUNvbnRleHQpIHdvcmtpbmdTZXQuZ2V0KGtleU9iajIpOwotCi0gICAgICAgICAgICAgICAgLy8gY29uc3RydWN0IGEgY29weSBvZiB0aGUgbWVzc2FnZSBjb250ZXh0Ci0gICAgICAgICAgICAgICAgLy8gdGhhdCBoYXMgYmVlbiBleHRyYWN0ZWQgZnJvbSB0aGUgb2JqZWN0IGhpZXJhcmNoeQotICAgICAgICAgICAgICAgIE1lc3NhZ2VDb250ZXh0IGNvcHlNQyA9IG1jLmV4dHJhY3RDb3B5TWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBEb24ndCBwZXJzaXN0IHRoZSBtZXNzYWdlIG9mIHRoZSBvdGhlciBtZXNzYWdlIGNvbnRleHRzCi0gICAgICAgICAgICAgICAgY29weU1DLnNldEVudmVsb3BlKG51bGwpOwotCi0gICAgICAgICAgICAgICAgLy8gcHV0IHRoZSBtb2RpZmllZCBlbnRyeSBpbiB0aGUgbGlzdAotICAgICAgICAgICAgICAgIHRtcE1zZ0N0eE1hcC5wdXQoa2V5T2JqMiwgY29weU1DKTsKLQotICAgICAgICAgICAgICAgIC8vIHRyYWNlIHBvaW50Ci0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy50cmFjZShnZXRMb2dDb3JyZWxhdGlvbklEU3RyaW5nKCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjp3cml0ZUV4dGVybmFsKCk6ICBnZXR0aW5nIHdvcmtpbmcgc2V0IGVudHJ5ICBrZXkgWyIgKyBrZXlPYmoyICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJdICAgbWVzc2FnZSBjb250ZXh0IElEWyIgKyBjb3B5TUMuZ2V0TWVzc2FnZUlEKCkgKyAiXSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLSAgICAgICAgb3V0LndyaXRlVVRGKCJtZXNzYWdlY29udGV4dHMiKTsgLy8gd3JpdGUgbWFya2VyCi0gICAgICAgIG91dC53cml0ZU1hcCh0bXBNc2dDdHhNYXApOwotICAgICAgICBvdXQud3JpdGVVVEYoIm1ldGFNZXNzYWdlQ29udGV4dE1hcCIpOwotICAgICAgICBvdXQud3JpdGVNYXAobWV0YU1lc3NhZ2VDb250ZXh0TWFwKTsKLQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBkb25lCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFJlc3RvcmUgdGhlIGNvbnRlbnRzIG9mIHRoZSBvYmplY3QgdGhhdCB3YXMgcHJldmlvdXNseSBzYXZlZC4KLSAgICAgKiA8cC8+Ci0gICAgICogTk9URTogVGhlIGZpZWxkIGRhdGEgbXVzdCByZWFkIGJhY2sgaW4gdGhlIHNhbWUgb3JkZXIgYW5kIHR5cGUKLSAgICAgKiBhcyBpdCB3YXMgd3JpdHRlbi4gIFNvbWUgZGF0YSB3aWxsIG5lZWQgdG8gYmUgdmFsaWRhdGVkIHdoZW4KLSAgICAgKiByZXN1cnJlY3RlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpbiBUaGUgc3RyZWFtIHRvIHJlYWQgdGhlIG9iamVjdCBjb250ZW50cyBmcm9tCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlYWRFeHRlcm5hbChPYmplY3RJbnB1dCBpbk9iamVjdCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgU2FmZU9iamVjdElucHV0U3RyZWFtIGluID0gU2FmZU9iamVjdElucHV0U3RyZWFtLmluc3RhbGwoaW5PYmplY3QpOwotICAgICAgICAvLyBzZXQgdGhlIGZsYWcgdG8gaW5kaWNhdGUgdGhhdCB0aGUgbWVzc2FnZSBjb250ZXh0IGlzIGJlaW5nCi0gICAgICAgIC8vIHJlY29uc3RpdHV0ZWQgYW5kIHdpbGwgbmVlZCB0byBoYXZlIGNlcnRhaW4gb2JqZWN0IHJlZmVyZW5jZXMKLSAgICAgICAgLy8gdG8gYmUgcmVjb25jaWxlZCB3aXRoIHRoZSBjdXJyZW50IGVuZ2luZSBzZXR1cAotICAgICAgICBuZWVkc1RvQmVSZWNvbmNpbGVkID0gdHJ1ZTsKLQotICAgICAgICAvLyB0cmFjZSBwb2ludAotICAgICAgICBsb2cudHJhY2UobXlDbGFzc05hbWUgKyAiOnJlYWRFeHRlcm5hbCgpOiAgQkVHSU4gIGJ5dGVzIGF2YWlsYWJsZSBpbiBzdHJlYW0gWyIgKwotICAgICAgICAgICAgICAgIGluLmF2YWlsYWJsZSgpICsgIl0gICIpOwotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIG9iamVjdCBsZXZlbCBpZGVudGlmaWVycwotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgIC8vIHNlcmlhbGl6YXRpb24gdmVyc2lvbiBJRAotICAgICAgICBsb25nIHN1aWQgPSBpbi5yZWFkTG9uZygpOwotCi0gICAgICAgIC8vIHJldmlzaW9uIElECi0gICAgICAgIGludCByZXZJRCA9IGluLnJlYWRJbnQoKTsKLQotICAgICAgICAvLyBtYWtlIHN1cmUgdGhlIG9iamVjdCBkYXRhIGlzIGluIGEgdmVyc2lvbiB3ZSBjYW4gaGFuZGxlCi0gICAgICAgIGlmIChzdWlkICE9IHNlcmlhbFZlcnNpb25VSUQpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uKEV4dGVybmFsaXplQ29uc3RhbnRzLlVOU1VQUE9SVEVEX1NVSUQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gbWFrZSBzdXJlIHRoZSBvYmplY3QgZGF0YSBpcyBpbiBhIHJldmlzaW9uIGxldmVsIHdlIGNhbiBoYW5kbGUKLSAgICAgICAgaWYgKHJldklEICE9IFJFVklTSU9OXzIpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uKEV4dGVybmFsaXplQ29uc3RhbnRzLlVOU1VQUE9SVEVEX1JFVklEKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIHZhcmlvdXMgc2ltcGxlIGZpZWxkcwotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgIGxvbmcgdGltZSA9IGluLnJlYWRMb25nKCk7Ci0gICAgICAgIHNldExhc3RUb3VjaGVkVGltZSh0aW1lKTsKLQotICAgICAgICBpc0NvbXBsZXRlID0gaW4ucmVhZEJvb2xlYW4oKTsKLSAgICAgICAga2V5ID0gKFN0cmluZykgaW4ucmVhZE9iamVjdCgpOwotICAgICAgICBsb2dDb3JyZWxhdGlvbklEU3RyaW5nID0gKFN0cmluZykgaW4ucmVhZE9iamVjdCgpOwotICAgICAgIAotICAgICAgICAvLyB0cmFjZSBwb2ludAotICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy50cmFjZShteUNsYXNzTmFtZSArICI6cmVhZEV4dGVybmFsKCk6ICByZWFkaW5nIGlucHV0IHN0cmVhbSBmb3IgWyIgKwotICAgICAgICAgICAgICAgICAgICAgIGdldExvZ0NvcnJlbGF0aW9uSURTdHJpbmcoKSArICJdICAiKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIHByb3BlcnRpZXMKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgaW4ucmVhZFVURigpOyAvLyByZWFkIG1hcmtlcgotICAgICAgICBwcm9wZXJ0aWVzID0gaW4ucmVhZE1hcChuZXcgSGFzaE1hcFVwZGF0ZUxvY2thYmxlKCkpOwotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIGF4aXMgb3BlcmF0aW9uIG1ldGEgZGF0YQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgIC8vIGF4aXNPcGVyYXRpb24gaXMgbm90IHVzYWJsZSB1bnRpbCB0aGUgbWV0YSBkYXRhIGhhcyBiZWVuIHJlY29uY2lsZWQKLSAgICAgICAgYXhpc09wZXJhdGlvbiA9IG51bGw7Ci0gICAgICAgIGluLnJlYWRVVEYoKTsgLy8gcmVhZCBtYXJrZXIKLSAgICAgICAgbWV0YUF4aXNPcGVyYXRpb24gPSAoTWV0YURhdGFFbnRyeSkgaW4ucmVhZE9iamVjdCgpOwotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIGF4aXMgc2VydmljZSBtZXRhIGRhdGEKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gYXhpc1NlcnZpY2UgaXMgbm90IHVzYWJsZSB1bnRpbCB0aGUgbWV0YSBkYXRhIGhhcyBiZWVuIHJlY29uY2lsZWQKLSAgICAgICAgaW4ucmVhZFVURigpOyAvLyByZWFkIG1hcmtlcgotICAgICAgICBtZXRhQXhpc1NlcnZpY2UgPSAoTWV0YURhdGFFbnRyeSkgaW4ucmVhZE9iamVjdCgpOwotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIHBhcmVudAotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBTZXJ2aWNlQ29udGV4dCBpcyBub3QgdXNhYmxlIHVudGlsIGl0IGhhcyBiZWVuIGFjdGl2YXRlZAotICAgICAgICBpbi5yZWFkVVRGKCk7IC8vIHJlYWQgbWFya2VyCi0gICAgICAgIG1ldGFQYXJlbnQgPSAoU2VydmljZUNvbnRleHQpIGluLnJlYWRPYmplY3QoKTsKLQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBIYXNoTWFwIG1lc3NhZ2VDb250ZXh0cyB0YWJsZQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgIC8vIHNldCB0byBlbXB0eSB1bnRpbCB0aGlzIGNhbiBiZSBhY3RpdmlhdGVkCi0gICAgICAgIG1lc3NhZ2VDb250ZXh0cyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIGluLnJlYWRVVEYoKTsgLy8gcmVhZCBtYXJrZXIKLSAgICAgICAgd29ya2luZ1NldCA9IGluLnJlYWRIYXNoTWFwKCk7Ci0gICAgICAgIGluLnJlYWRVVEYoKTsgLy8gcmVhZCBtYXJrZXIKLSAgICAgICAgbWV0YU1lc3NhZ2VDb250ZXh0TWFwID0gaW4ucmVhZEhhc2hNYXAoKTsKLSAgICAgICAgCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIGRvbmUKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIGNoZWNrcyB0byBzZWUgaWYgYWRkaXRpb25hbCB3b3JrIG5lZWRzIHRvIGJlCi0gICAgICogZG9uZSBpbiBvcmRlciB0byBjb21wbGV0ZSB0aGUgb2JqZWN0IHJlY29uc3RpdHV0aW9uLgotICAgICAqIFNvbWUgcGFydHMgb2YgdGhlIG9iamVjdCByZXN0b3JlZCBmcm9tIHRoZSByZWFkRXh0ZXJuYWwoKQotICAgICAqIGNhbm5vdCBiZSBjb21wbGV0ZWQgdW50aWwgd2UgaGF2ZSBhIGNvbmZpZ3VyYXRpb25Db250ZXh0Ci0gICAgICogZnJvbSB0aGUgYWN0aXZlIGVuZ2luZS4gVGhlIGNvbmZpZ3VyYXRpb25Db250ZXh0IGlzIHVzZWQKLSAgICAgKiB0byBoZWxwIHRoaXMgb2JqZWN0IHRvIHBsdWcgYmFjayBpbnRvIHRoZSBlbmdpbmUncwotICAgICAqIGNvbmZpZ3VyYXRpb24gYW5kIGRlcGxveW1lbnQgb2JqZWN0cy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjYyBUaGUgY29uZmlndXJhdGlvbiBjb250ZXh0IG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGFjdGl2ZSBjb25maWd1cmF0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWN0aXZhdGUoQ29uZmlndXJhdGlvbkNvbnRleHQgY2MpIHsKLSAgICAgICAgLy8gc2VlIGlmIHRoZXJlJ3MgYW55IHdvcmsgdG8gZG8KLSAgICAgICAgaWYgKCFuZWVkc1RvQmVSZWNvbmNpbGVkKSB7Ci0gICAgICAgICAgICAvLyByZXR1cm4gcXVpY2sKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGdldCB0aGUgYXhpcyBjb25maWd1cmF0aW9uCi0gICAgICAgIEF4aXNDb25maWd1cmF0aW9uIGF4aXNDb25maWcgPSBjYy5nZXRBeGlzQ29uZmlndXJhdGlvbigpOwotCi0gICAgICAgIC8vIFdlIHByZXZpb3VzbHkgc2F2ZWQgbWV0YUF4aXNTZXJ2aWNlOyByZXN0b3JlIGl0Ci0gICAgICAgIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlID0gbnVsbDsKLQotICAgICAgICBpZiAobWV0YUF4aXNTZXJ2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGF4aXNTZXJ2aWNlID0gQWN0aXZhdGVVdGlscy5maW5kU2VydmljZShheGlzQ29uZmlnLCBtZXRhQXhpc1NlcnZpY2UuZ2V0Q2xhc3NOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YUF4aXNTZXJ2aWNlLmdldFFOYW1lQXNTdHJpbmcoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBXZSBwcmV2aW91c2x5IHNhdmVkIG1ldGFBeGlzT3BlcmF0aW9uOyByZXN0b3JlIGl0Ci0gICAgICAgIGlmIChtZXRhQXhpc09wZXJhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoYXhpc1NlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRoaXMuYXhpc09wZXJhdGlvbiA9IEFjdGl2YXRlVXRpbHMuZmluZE9wZXJhdGlvbihheGlzU2VydmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YUF4aXNPcGVyYXRpb24uZ2V0Q2xhc3NOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFBeGlzT3BlcmF0aW9uLmdldFFOYW1lKCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aGlzLmF4aXNPcGVyYXRpb24gPSBBY3RpdmF0ZVV0aWxzLmZpbmRPcGVyYXRpb24oYXhpc0NvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YUF4aXNPcGVyYXRpb24uZ2V0Q2xhc3NOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFBeGlzT3BlcmF0aW9uLmdldFFOYW1lKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gdGhlIHBhcmVudCBTZXJ2aWNlQ29udGV4dCBvYmplY3Qgd2FzIHNhdmVkCi0gICAgICAgIC8vIGVpdGhlciB1c2UgdGhlIHJlc3RvcmVkIG9iamVjdCBvciBzeW5jIHVwIHdpdGgKLSAgICAgICAgLy8gYW4gZXhpc3RpbmcgU2VydmljZUNvbnRleHQgb2JqZWN0Ci0gICAgICAgIGlmIChtZXRhUGFyZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIGZpbmQgb3V0IGlmIGEgY29weSBvZiB0aGUgU2VydmljZUNvbnRleHQgb2JqZWN0IGV4aXN0cyBvbiB0aGlzCi0gICAgICAgICAgICAvLyBlbmdpbmUgd2hlcmUgdGhpcyBPcGVyYXRpb25Db250ZXh0IGlzIGJlaW5nIHJlc3RvcmVkL2FjdGl2YXRlZAotICAgICAgICAgICAgLy8gaWYgc28sIHVzZSB0aGF0IG9iamVjdCBpbnN0ZWFkIG9mIHRoZSByZXN0b3JlZCBvYmplY3QKLSAgICAgICAgICAgIC8vIGluIG9yZGVyIHRvIG1ha2Ugc3VyZSB0aGF0IGZ1dHVyZSBjaGFuZ2VzIHRvIHNlcnZpY2UtbGV2ZWwKLSAgICAgICAgICAgIC8vIHByb3BlcnRpZXMgYXJlIHByZXNlcnZlZCBmb3IgZnV0dXJlIG9wZXJhdGlvbnMKLSAgICAgICAgICAgIFN0cmluZyBncm91cE5hbWUgPSBtZXRhUGFyZW50LmdldEdyb3VwTmFtZSgpOwotICAgICAgICAgICAgU3RyaW5nIHNlcnZpY2VOYW1lID0gbWV0YVBhcmVudC5nZXROYW1lKCk7Ci0KLSAgICAgICAgICAgIFNlcnZpY2VDb250ZXh0IGV4aXN0aW5nU0MgPSBudWxsOwotCi0gICAgICAgICAgICAvLyBmaXJzdCBsb29rIGZvciB0aGUgU2VydmljZUNvbnRleHQgdmlhIHRoZSBTZXJ2aWNlQ29udGV4dEdyb3VwCi0gICAgICAgICAgICBTZXJ2aWNlR3JvdXBDb250ZXh0IHNnYyA9IGNjLmdldFNlcnZpY2VHcm91cENvbnRleHQoZ3JvdXBOYW1lKTsKLQotICAgICAgICAgICAgaWYgKHNnYyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZXhpc3RpbmdTQyA9IHNnYy5maW5kU2VydmljZUNvbnRleHQoc2VydmljZU5hbWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoZXhpc3RpbmdTQyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gd2UgY291bGRuJ3QgZmluZCB0aGUgU2VydmljZUNvbnRleHQgdmlhIHRoZSBTZXJ2aWNlQ29udGV4dEdyb3VwCi0gICAgICAgICAgICAgICAgLy8gdHJ5IHZpYSB0aGUgc2V0IG9mIGV4aXN0aW5nIG9wZXJhdGlvbiBjb250ZXh0cwotICAgICAgICAgICAgICAgIE9wZXJhdGlvbkNvbnRleHQgZXhpc3RpbmdPQyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYy5maW5kT3BlcmF0aW9uQ29udGV4dChnZXRPcGVyYXRpb25OYW1lKCksIHNlcnZpY2VOYW1lLCBncm91cE5hbWUpOwotCi0gICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nT0MgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBleGlzdGluZ1NDID0gKFNlcnZpY2VDb250ZXh0KSBleGlzdGluZ09DLmdldFBhcmVudCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGV4aXN0aW5nU0MgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIGNvdWxkIG5vdCBmaW5kIGFuIGV4aXN0aW5nIFNlcnZpY2VDb250ZXh0Ci0gICAgICAgICAgICAgICAgLy8gdXNlIHRoZSByZXN0b3JlZCBvYmplY3QKLSAgICAgICAgICAgICAgICBtZXRhUGFyZW50LmFjdGl2YXRlKGNjKTsKLQotICAgICAgICAgICAgICAgIC8vIHNldCBwYXJlbnQKLSAgICAgICAgICAgICAgICB0aGlzLnNldFBhcmVudChtZXRhUGFyZW50KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gc3dpdGNoIG92ZXIgdG8gdGhlIGV4aXN0aW5nIG9iamVjdAotICAgICAgICAgICAgICAgIHRoaXMuc2V0UGFyZW50KGV4aXN0aW5nU0MpOwotCi0gICAgICAgICAgICAgICAgLy8gZG8gYSBjb3B5IG9mIHRoZSBwcm9wZXJ0aWVzIGZyb20gdGhlIHJlc3RvcmVkIG9iamVjdAotICAgICAgICAgICAgICAgIC8vIHRvIHRoZSBleGlzdGluZyBTZXJ2aWNlQ29udGV4dAotICAgICAgICAgICAgICAgIC8vIFNob3VsZCB0aGUgY29weSBiZSBhIG5vbi1kZXN0cnVjdGl2ZSBvbmU/ICBUaGF0IGlzLAotICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBrZXkgYWxyZWFkeSBleGlzdHMgaW4gdGhlIHByb3BlcnRpZXMgdGFibGUgb2YgdGhlCi0gICAgICAgICAgICAgICAgLy8gZXhpc3Rpbmcgb2JqZWN0LCBzaG91bGQgdGhlIHZhbHVlIGJlIG92ZXJ3cml0dGVuIGZyb20gdGhlCi0gICAgICAgICAgICAgICAgLy8gcmVzdG9yZWQgb2piZWN0PyBGb3Igbm93LCB0aGUgZGVjaXNpb24gaXMgdGhhdCB0aGUgc3RhdGUKLSAgICAgICAgICAgICAgICAvLyB0aGF0IGhhcyBiZWVuIHByZXNlcnZlZCBmb3IgYSBzYXZlZCBjb250ZXh0IG9iamVjdCBpcwotICAgICAgICAgICAgICAgIC8vIGlzIGltcG9ydGFudCB0byBiZSByZXN0b3JlZC4KLSAgICAgICAgICAgICAgICBtZXRhUGFyZW50LnB1dENvbnRleHRQcm9wZXJ0aWVzKGV4aXN0aW5nU0MsIHRydWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gc2V0IHBhcmVudCAgdG8gbnVsbAotICAgICAgICAgICAgdGhpcy5zZXRQYXJlbnQobWV0YVBhcmVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyByZXNlZWQgdGhlIG9wZXJhdGlvbiBjb250ZXh0IG1hcAotCi0gICAgICAgIFNlcnZpY2VDb250ZXh0IHNlcnYgPSBnZXRTZXJ2aWNlQ29udGV4dCgpOwotICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBhY3RpdmVDQzsKLSAgICAgICAgaWYgKHNlcnYgIT0gbnVsbCkgewotICAgICAgICAgICAgYWN0aXZlQ0MgPSBzZXJ2LmdldENvbmZpZ3VyYXRpb25Db250ZXh0KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBhY3RpdmVDQyA9IGNjOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGtleSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBXZSBvbmx5IHdhbnQgdG8gKHJlKXJlZ2lzdGVyIHRoaXMgaWYgaXQncyBhbiBvdXRib3VuZCBtZXNzYWdlCi0gICAgICAgICAgICBTdHJpbmcgbWVwU3RyaW5nID0gZ2V0QXhpc09wZXJhdGlvbigpLmdldE1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4oKTsKLSAgICAgICAgICAgIGlmIChtZXBTdHJpbmcuZXF1YWxzKFdTREwyMF8yMDA2Q29uc3RhbnRzLk1FUF9VUklfT1VUX09OTFkpCi0gICAgICAgICAgICAgICAgfHwgbWVwU3RyaW5nLmVxdWFscyhXU0RMMjBfMjAwNF9Db25zdGFudHMuTUVQX1VSSV9PVVRfT05MWSkKLSAgICAgICAgICAgICAgICB8fCAoKG1lcFN0cmluZy5lcXVhbHMoV1NETDIwXzIwMDZDb25zdGFudHMuTUVQX1VSSV9PVVRfSU4pCi0gICAgICAgICAgICAgICAgICAgIHx8IG1lcFN0cmluZy5lcXVhbHMoV1NETDIwXzIwMDRfQ29uc3RhbnRzLk1FUF9VUklfT1VUX0lOKSkKLSAgICAgICAgICAgICAgICAgICAgJiYgIWlzQ29tcGxldGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGlzIE9wZXJhdGlvbkNvbnRleHQgb2JqZWN0IGlzIHJlZ2lzdGVyZWQgaW4gdGhlIAotICAgICAgICAgICAgICAgIC8vIGxpc3QgbWFpbnRhaW5lZCBieSB0aGUgQ29uZmlndXJhdGlvbkNvbnRleHQgb2JqZWN0Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiByZWdpc3RyYXRpb25TdWNlZWRlZCA9IGFjdGl2ZUNDLnJlZ2lzdGVyT3BlcmF0aW9uQ29udGV4dChrZXksIHRoaXMsIHRydWUpOwotICAgICAgICAgICAgICAgIGlmICghcmVnaXN0cmF0aW9uU3VjZWVkZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gdHJhY2UgcG9pbnQKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cudHJhY2UoZ2V0TG9nQ29ycmVsYXRpb25JRFN0cmluZygpKyAiOmFjdGl2YXRlKCk6ICAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT3BlcmF0aW9uQ29udGV4dCBrZXkgWyIgKyBrZXkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIl0gYWxyZWFkeSBleGlzdHMgaW4gQ29uZmlndXJhdGlvbkNvbnRleHQgbWFwLiAgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoaXMgT3BlcmF0aW9uQ29udGV4dCBbIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB0aGlzLnRvU3RyaW5nKCkgKyAiXSB3YXMgbm90IGFkZGVkIHRvIHRoZSB0YWJsZS4iKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyB1cGRhdGUgdGhlIG1vZGlmaWVkIGVudHJpZXMgaW4gdGhlIG1lc3NhZ2VDb250ZXh0cyB0YWJsZQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gTk9URTogYW4gZW50cnkgaW4gdGhlIG1ldGFNZXNzYWdlQ29udGV4dE1hcCBtdXN0IHdhaXQKLSAgICAgICAgLy8gZm9yIGl0cyBjb3JyZXNwb25kaW5nIGFjdGl2ZSBtZXNzYWdlIGNvbnRleHQgb2JqZWN0Ci0gICAgICAgIC8vIHRvIGNhbGwgdGhpcyBvcGVyYXRpb24gY29udGV4dCBvYmplY3Qgc28gd2UgZG9uJ3QKLSAgICAgICAgLy8gbmVlZCB0byBoYW5kbGUgdGhlIG1ldGFNZXNzYWdlY29udGV4dE1hcCB0YWJsZSBoZXJlCi0KLSAgICAgICAgaWYgKCh3b3JraW5nU2V0ICE9IG51bGwpICYmICghd29ya2luZ1NldC5pc0VtcHR5KCkpKSB7Ci0gICAgICAgICAgICBTZXQga2V5U2V0ID0gd29ya2luZ1NldC5rZXlTZXQoKTsKLSAgICAgICAgICAgIEl0ZXJhdG9yIGl0S2V5cyA9IGtleVNldC5pdGVyYXRvcigpOwotCi0gICAgICAgICAgICB3aGlsZSAoaXRLZXlzLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIC8vIGV4cGVjdCB0aGUga2V5IHRvIGJlIGEgc3RyaW5nCi0gICAgICAgICAgICAgICAgU3RyaW5nIGtleU9iaiA9IChTdHJpbmcpIGl0S2V5cy5uZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIG1lc3NhZ2UgY29udGV4dCBhc3NvY2lhdGVkIHdpdGggdGhhdCBsYWJlbAotICAgICAgICAgICAgICAgIE1lc3NhZ2VDb250ZXh0IHZhbHVlID0gKE1lc3NhZ2VDb250ZXh0KSB3b3JraW5nU2V0LmdldCgoT2JqZWN0KSBrZXlPYmopOwotCi0gICAgICAgICAgICAgICAgLy8gYWN0aXZhdGUgdGhhdCBvYmplY3QKLSAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAvLyB0cmFjZSBwb2ludAotICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy50cmFjZShnZXRMb2dDb3JyZWxhdGlvbklEU3RyaW5nKCkgKyAiOmFjdGl2YXRlKCk6ICBrZXkgWyIgKyBrZXlPYmogKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJdICBtZXNzYWdlIGlkIFsiICsgdmFsdWUuZ2V0TWVzc2FnZUlEKCkgKyAiXSIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgc3VwcHJlc3NXYXJuaW5ncyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlLmFjdGl2YXRlV2l0aE9wZXJhdGlvbkNvbnRleHQodGhpcyk7Ci0gICAgICAgICAgICAgICAgICAgIHN1cHByZXNzV2FybmluZ3MgPSBmYWxzZTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZUNvbnRleHRzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VDb250ZXh0cyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBwdXQgdGhlIGVudHJ5IGluIHRoZSAicmVhbCIgdGFibGUKLSAgICAgICAgICAgICAgICAvLyBub3RlIHRoYXQgdGhlIGtleSBvciB0aGUgdmFsdWUgY291bGQgYmUgbnVsbAotICAgICAgICAgICAgICAgIG1lc3NhZ2VDb250ZXh0cy5wdXQoa2V5T2JqLCB2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gZG9uZSwgcmVzZXQgdGhlIGZsYWcKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIG5lZWRzVG9CZVJlY29uY2lsZWQgPSBmYWxzZTsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIElzb2xhdGUgdGhlIHNwZWNpZmllZCBtZXNzYWdlIGNvbnRleHQgb2JqZWN0Ci0gICAgICogdG8gcHJlcGFyZSBmb3Igc2VyaWFsaXphdGlvbi4gIEluc3RlYWQgb2YKLSAgICAgKiBzYXZpbmcgdGhlIGVudGlyZSBtZXNzYWdlIGNvbnRleHQgb2JqZWN0LAotICAgICAqIGp1c3Qgc2V0dXAgc29tZSBtZXRhZGF0YSBhYm91dCB0aGUgbWVzc2FnZQotICAgICAqIGNvbnRleHQuCi0gICAgICogPHAvPgotICAgICAqIE5vdGU6IHRoaXMgd2lsbCByZW1vdmUgdGhlIHNwZWNpZmllZAotICAgICAqIG1lc3NhZ2UgY29udGV4dCBvYmplY3QgZnJvbSB0aGUgbWVzc2FnZSBjb250ZXh0Ci0gICAgICogdGFibGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWMgVGhlIG1lc3NhZ2UgY29udGV4dCBvYmplY3QKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpc29sYXRlTWVzc2FnZUNvbnRleHQoTWVzc2FnZUNvbnRleHQgbWMpIHsKLSAgICAgICAgaWYgKG1jID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICgobWVzc2FnZUNvbnRleHRzID09IG51bGwpIHx8IChtZXNzYWdlQ29udGV4dHMuaXNFbXB0eSgpKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZ2V0IHRoZSBtZXNzYWdlIElEIGZyb20gdGhlIG1lc3NhZ2UgY29udGV4dAotICAgICAgICBTdHJpbmcgbWVzc2FnZUlEID0gbWMuZ2V0TWVzc2FnZUlEKCk7Ci0KLSAgICAgICAgaWYgKG1lc3NhZ2VJRCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBjYW4ndCBsb2NhdGUgaXQgd2l0aG91dCBpZGVudGlmaWNhdGlvbgotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLQotICAgICAgICBJdGVyYXRvciBpdCA9IG1lc3NhZ2VDb250ZXh0cy5rZXlTZXQoKS5pdGVyYXRvcigpOwotCi0gICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIC8vIGdldCB0aGUga2V5Ci0gICAgICAgICAgICBPYmplY3Qga2V5T2JqID0gaXQubmV4dCgpOwotCi0gICAgICAgICAgICAvLyBnZXQgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGF0IGtleQotICAgICAgICAgICAgTWVzc2FnZUNvbnRleHQgdmFsdWUgPSAoTWVzc2FnZUNvbnRleHQpIG1lc3NhZ2VDb250ZXh0cy5nZXQoa2V5T2JqKTsKLQotICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWVJRCA9IHZhbHVlLmdldE1lc3NhZ2VJRCgpOwotCi0gICAgICAgICAgICAgICAgaWYgKCh2YWx1ZUlEICE9IG51bGwpICYmIHZhbHVlSUQuZXF1YWxzKG1lc3NhZ2VJRCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gZm91bmQgdGhlIGlucHV0IG1lc3NhZ2UgY29udGV4dCBpbiBvdXIgdGFibGUKLQotICAgICAgICAgICAgICAgICAgICBpZiAobWV0YU1lc3NhZ2VDb250ZXh0TWFwID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFNZXNzYWdlQ29udGV4dE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvLyBidWlsZCBhIG1ldGEgZGF0YSBlbnRyeQotICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgTWVzc2FnZUNvbnRleHQgY2xhc3MgbmFtZQotICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgTWVzc2FnZUNvbnRleHQgbWVzc2FnZUlECi0gICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICBrZXkgdXNlZCBpbiB0aGUgb3JpZ2luYWwgaGFzaG1hcCB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIE1lc3NhZ2VDb250ZXh0Ci0gICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICBub3RlOiB0aGlzIGlzIHR5cGljYWxseSBzb21ldGhpbmcgbGlrZSAiSW4iLCAiT3V0IiwgIkZhdWx0IgotICAgICAgICAgICAgICAgICAgICAvLwotICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhID0gbmV3IE1ldGFEYXRhRW50cnkodmFsdWUuZ2V0Q2xhc3MoKS5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS5nZXRNZXNzYWdlSUQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleU9iai50b1N0cmluZygpKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBwdXQgdGhlIG1ldGEgZGF0YSBlbnRyeSBpbiB0aGUgbGlzdAotICAgICAgICAgICAgICAgICAgICAvLyBub3RlIHRoYXQgaWYgdGhlIGVudHJ5IHdhcyBhbHJlYWR5IGluIHRoZSBsaXN0LAotICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIHdpbGwgcmVwbGFjZSB0aGF0IGVudHJ5Ci0gICAgICAgICAgICAgICAgICAgIG1ldGFNZXNzYWdlQ29udGV4dE1hcC5wdXQoa2V5T2JqLCBtZXRhRGF0YSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gZG9uJ3QgY2hhbmdlIHRoZSBvcmlnaW5hbCB0YWJsZSAtIHRoZXJlJ3MgcG90ZW50aWFsbHkgbG90cyBvZiBhcmVhcyB0aGF0Ci0gICAgICAgICAgICAgICAgICAgIC8vIGdyYWIgdGhlIHRhYmxlCi0gICAgICAgICAgICAgICAgICAgIC8vICAvLyBub3cgcmVtb3ZlIHRoZSBvcmlnaW5hbCBlbnRyeSBmcm9tIHRoZSBtZXNzYWdlQ29udGV4dHMgdGFibGUKLSAgICAgICAgICAgICAgICAgICAgLy8gIG1lc3NhZ2VDb250ZXh0cy5yZW1vdmUoa2V5T2JqKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBwdXQgdGhlIG9yaWdpbmFsIGVudHJ5IGluIHRoZSB0ZW1wb3JhcnkgbGlzdAotICAgICAgICAgICAgICAgICAgICBpZiAoaXNvbGF0ZWRNZXNzYWdlQ29udGV4dHMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaXNvbGF0ZWRNZXNzYWdlQ29udGV4dHMgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gbm90ZSB0aGF0IGlmIHRoZSBlbnRyeSB3YXMgYWxyZWFkeSBpbiB0aGUgbGlzdCwKLSAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyB3aWxsIHJlcGxhY2UgdGhhdCBlbnRyeQotICAgICAgICAgICAgICAgICAgICBpc29sYXRlZE1lc3NhZ2VDb250ZXh0cy5wdXQoa2V5T2JqLCB2YWx1ZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gdHJhY2UgcG9pbnQKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cudHJhY2UoZ2V0TG9nQ29ycmVsYXRpb25JRFN0cmluZygpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiOmlzb2xhdGVNZXNzYWdlQ29udGV4dCgpOiAgc2V0IHVwIG1lc3NhZ2UgY29udGV4dCBpZFsiICsgdmFsdWVJRCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIl0gIHdpdGgga2V5IFsiICsga2V5T2JqLnRvU3RyaW5nKCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJdIGZyb20gbWVzc2FnZUNvbnRleHRzIHRhYmxlIHRvIHByZXBhcmUgZm9yIHNlcmlhbGl6YXRpb24uIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFJlc3RvcmUgdGhlIHNwZWNpZmllZCBNZXNzYWdlQ29udGV4dCBvYmplY3QgaW4gdGhlCi0gICAgICogdGFibGUgdXNlZCB0byBob2xkIHRoZSBtZXNzYWdlIGNvbnRleHRzIGFzc29jaWF0ZWQKLSAgICAgKiB3aXRoIHRoaXMgb3BlcmF0aW9uLgotICAgICAqCi0gICAgICogQHBhcmFtIG1zZyBUaGUgbWVzc2FnZSBjb250ZXh0IG9iamVjdAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlc3RvcmVNZXNzYWdlQ29udGV4dChNZXNzYWdlQ29udGV4dCBtc2cpIHsKLSAgICAgICAgLy8gc2VlIGlmIHRoZSBhY3RpdmF0aW9uIGhhcyBiZWVuIGRvbmUKLSAgICAgICAgaWYgKG5lZWRzVG9CZVJlY29uY2lsZWQpIHsKLSAgICAgICAgICAgIC8vIG5vcGUsIG5lZWQgdG8gZG8gdGhlIGFjdGl2YXRpb24gZmlyc3QKLSAgICAgICAgICAgIGlmIChkZWJ1Z0VuYWJsZWQpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoZ2V0TG9nQ29ycmVsYXRpb25JRFN0cmluZygpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIjpyZXN0b3JlTWVzc2FnZUNvbnRleHQoKTogKioqIFdBUk5JTkcgOiBuZWVkIHRvIGludm9rZSBhY3RpdmF0ZSgpIHByaW9yIHRvIHJlc3RvcmluZyB0aGUgTWVzc2FnZUNvbnRleHQgdG8gdGhlIGxpc3QuIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtc2cgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIG1zZ0lEID0gbXNnLmdldE1lc3NhZ2VJRCgpOwotCi0gICAgICAgIGlmIChtc2dJRCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoZGVidWdFbmFibGVkKSB7Ci0gICAgICAgICAgICAgICAgLy8gY2FuJ3QgaWRlbnRpZnkgbWVzc2FnZSBjb250ZXh0Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKGdldExvZ0NvcnJlbGF0aW9uSURTdHJpbmcoKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAiOnJlc3RvcmVNZXNzYWdlQ29udGV4dCgpOiAqKiogV0FSTklORyA6IE1lc3NhZ2VDb250ZXh0IGRvZXMgbm90IGhhdmUgYSBtZXNzYWdlIElELiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZmlyc3QgY2hlY2sgdGhlIG1ldGFNZXNzYWdlQ29udGV4dE1hcCB0byBzZWUgaWYKLSAgICAgICAgLy8gdGhlIHNwZWNpZmllZCBtZXNzYWdlIGNvbnRleHQgb2JqZWN0IG1hdGNoZXMgYW55Ci0gICAgICAgIC8vIG9mIHRoZSBtZXRhZGF0YSBlbnRyaWVzLgotCi0gICAgICAgIGlmICgobWV0YU1lc3NhZ2VDb250ZXh0TWFwICE9IG51bGwpICYmICghbWV0YU1lc3NhZ2VDb250ZXh0TWFwLmlzRW1wdHkoKSkpIHsKLSAgICAgICAgICAgIEl0ZXJhdG9yIGl0TWV0YSA9IG1ldGFNZXNzYWdlQ29udGV4dE1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOwotCi0gICAgICAgICAgICB3aGlsZSAoaXRNZXRhLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBrZXlNID0gKFN0cmluZykgaXRNZXRhLm5leHQoKTsKLQotICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgdmFsdWVNID0gKE1ldGFEYXRhRW50cnkpIG1ldGFNZXNzYWdlQ29udGV4dE1hcC5nZXQoa2V5TSk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlTV9JRDsKLQotICAgICAgICAgICAgICAgIGlmICh2YWx1ZU0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB2YWx1ZU1fSUQgPSB2YWx1ZU0uZ2V0UU5hbWVBc1N0cmluZygpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChtc2dJRC5lcXVhbHModmFsdWVNX0lEKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxhYmVsID0gdmFsdWVNLmdldEV4dHJhTmFtZSgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZUNvbnRleHRzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlQ29udGV4dHMgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBwdXQgdGhlIG1lc3NhZ2UgY29udGV4dCBpbnRvIHRoZSBtZXNzYWdlQ29udGV4dHMgdGFibGUKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VDb250ZXh0cy5wdXQobGFiZWwsIG1zZyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSB0aGUgbWV0YWRhdGEgZnJvbSB0aGUgbWV0YWRhdGEgdGFibGUKLSAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFNZXNzYWdlQ29udGV4dE1hcC5yZW1vdmUoa2V5TSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNUcmFjZUVuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy50cmFjZShnZXRMb2dDb3JyZWxhdGlvbklEU3RyaW5nKCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiOnJlc3RvcmVNZXNzYWdlQ29udGV4dCgpOiAgcmVzdG9yZWQgICBsYWJlbCBbIiArIGxhYmVsICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl0gICAgbWVzc2FnZSBJRCBbIiArIG1zZy5nZXRNZXNzYWdlSUQoKSArICJdIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIC8vIHNlZSBpZiB3ZSBjYW4gcHV0IHRoZSBtc2cgZGlyZWN0bHkgaW4gdGhlIG1lc3NhZ2VDb250ZXh0cyB0YWJsZQotICAgICAgICAgICAgaWYgKChtZXNzYWdlQ29udGV4dHMgIT0gbnVsbCkgJiYgKCFtZXNzYWdlQ29udGV4dHMuaXNFbXB0eSgpKSkgewotICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGl0TGlzdCA9IG1lc3NhZ2VDb250ZXh0cy5rZXlTZXQoKS5pdGVyYXRvcigpOwotCi0gICAgICAgICAgICAgICAgd2hpbGUgKGl0TGlzdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9IChTdHJpbmcpIGl0TGlzdC5uZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUNvbnRleHQgdmFsdWUgPSAoTWVzc2FnZUNvbnRleHQpIG1lc3NhZ2VDb250ZXh0cy5nZXQoa2V5KTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlSUQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlSUQgPSB2YWx1ZS5nZXRNZXNzYWdlSUQoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1zZ0lELmVxdWFscyh2YWx1ZUlEKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgZW50cnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlQ29udGV4dHMucHV0KGtleSwgbXNnKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhlIG9wZXJhdGlvbi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIG5hbWUgU3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRPcGVyYXRpb25OYW1lKCkgewotICAgICAgICBTdHJpbmcgb3BOYW1lID0gbnVsbDsKLQotICAgICAgICBpZiAoYXhpc09wZXJhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBRTmFtZSBxbmFtZSA9IGF4aXNPcGVyYXRpb24uZ2V0TmFtZSgpOwotICAgICAgICAgICAgaWYgKHFuYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBvcE5hbWUgPSBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBvcE5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2VydmljZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIG5hbWUgU3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRTZXJ2aWNlTmFtZSgpIHsKLSAgICAgICAgU3RyaW5nIHNydk5hbWUgPSBudWxsOwotCi0gICAgICAgIFNlcnZpY2VDb250ZXh0IHNjID0gKFNlcnZpY2VDb250ZXh0KSBnZXRQYXJlbnQoKTsKLQotICAgICAgICBpZiAoc2MgPT0gbnVsbCkgewotICAgICAgICAgICAgc2MgPSBtZXRhUGFyZW50OwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNjICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNydk5hbWUgPSBzYy5nZXROYW1lKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc3J2TmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzZXJ2aWNlIGdyb3VwLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgbmFtZSBTdHJpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNlcnZpY2VHcm91cE5hbWUoKSB7Ci0gICAgICAgIFN0cmluZyBzcnZHcm91cE5hbWUgPSBudWxsOwotCi0gICAgICAgIFNlcnZpY2VDb250ZXh0IHNjID0gKFNlcnZpY2VDb250ZXh0KSBnZXRQYXJlbnQoKTsKLQotICAgICAgICBpZiAoc2MgPT0gbnVsbCkgewotICAgICAgICAgICAgc2MgPSBtZXRhUGFyZW50OwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNjICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNydkdyb3VwTmFtZSA9IHNjLmdldEdyb3VwTmFtZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHNydkdyb3VwTmFtZTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIENvbXBhcmVzIGtleSBwYXJ0cyBvZiB0aGUgc3RhdGUgZnJvbSB0aGUgY3VycmVudCBpbnN0YW5jZSBvZgotICAgICAqIHRoaXMgY2xhc3Mgd2l0aCB0aGUgc3BlY2lmaWVkIGluc3RhbmNlIHRvIHNlZSBpZiB0aGV5IGFyZQotICAgICAqIGVxdWl2YWxlbnQuCi0gICAgICogPHAvPgotICAgICAqIFRoaXMgZGlmZmVycyBmcm9tIHRoZSBqYXZhLmxhbmcuT2JqZWN0LmVxdWFscygpIG1ldGhvZCBpbgotICAgICAqIHRoYXQgdGhlIGVxdWFscygpIG1ldGhvZCBnZW5lcmFsbHkgbG9va3MgYXQgYm90aCB0aGUKLSAgICAgKiBvYmplY3QgaWRlbnRpdHkgKGxvY2F0aW9uIGluIG1lbW9yeSkgYW5kIHRoZSBvYmplY3Qgc3RhdGUKLSAgICAgKiAoZGF0YSkuCi0gICAgICogPHAvPgotICAgICAqCi0gICAgICogQHBhcmFtIGN0eCBUaGUgb2JqZWN0IHRvIGNvbXBhcmUgd2l0aAotICAgICAqIEByZXR1cm4gVFJVRSBpZiB0aGlzIG9iamVjdCBpcyBlcXVpdmFsZW50IHdpdGggdGhlIHNwZWNpZmllZCBvYmplY3QKLSAgICAgKiAgICAgICAgIHRoYXQgaXMsIGtleSBmaWVsZHMgbWF0Y2gKLSAgICAgKiAgICAgICAgIEZBTFNFLCBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VxdWl2YWxlbnQoT3BlcmF0aW9uQ29udGV4dCBjdHgpIHsKLSAgICAgICAgLy8gTk9URTogdGhlIGlucHV0IG9iamVjdCBpcyBleHBlY3RlZCB0byBleGlzdCAoaWUsIGJlIG5vbi1udWxsKQotCi0gICAgICAgIGlmICh0aGlzLmlzQ29tcGxldGUgIT0gY3R4LmlzQ29tcGxldGUoKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCF0aGlzLmF4aXNPcGVyYXRpb24uZXF1YWxzKGN0eC5nZXRBeGlzT3BlcmF0aW9uKCkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBUT0RPOiBjb25zaWRlciBjaGVja2luZyB0aGUgcGFyZW50IG9iamVjdHMgZm9yIGVxdWl2YWxlbmN5Ci0KLSAgICAgICAgLy8gVE9ETzogY29uc2lkZXIgY2hlY2tpbmcgZmllbGRzIGZyb20gdGhlIHN1cGVyIGNsYXNzIGZvciBlcXVpdmFsZW5jeQotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBJRCBhc3NvY2lhdGVkIHdpdGggdGhpcyBvYmplY3QgaW5zdGFuY2UuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIEEgc3RyaW5nIHRoYXQgY2FuIGJlIG91dHB1dCB0byBhIGxvZyBmaWxlIGFzIGFuIGlkZW50aWZpZXIKLSAgICAgKiAgICAgICAgIGZvciB0aGlzIG9iamVjdCBpbnN0YW5jZS4gIEl0IGlzIHN1aXRhYmxlIGZvciBtYXRjaGluZyByZWxhdGVkIGxvZwotICAgICAqICAgICAgICAgZW50cmllcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldExvZ0NvcnJlbGF0aW9uSURTdHJpbmcoKSB7Ci0gICAgICAgIGlmIChsb2dDb3JyZWxhdGlvbklEU3RyaW5nID09IG51bGwpIHsKLSAgICAgICAgICAgIGxvZ0NvcnJlbGF0aW9uSURTdHJpbmcgPSBteUNsYXNzTmFtZSArICJAIiArIFVVSURHZW5lcmF0b3IuZ2V0VVVJRCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBsb2dDb3JyZWxhdGlvbklEU3RyaW5nOwotICAgIH0KLQotICAgIHB1YmxpYyBDb25maWd1cmF0aW9uQ29udGV4dCBnZXRSb290Q29udGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q29uZmlndXJhdGlvbkNvbnRleHQoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb250ZXh0L09wZXJhdGlvbkNvbnRleHRGYWN0b3J5LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY29udGV4dC9PcGVyYXRpb25Db250ZXh0RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjE1Njc3Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb250ZXh0L09wZXJhdGlvbkNvbnRleHRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaTE4bi5NZXNzYWdlczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuV1NETENvbnN0YW50czsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBmYWN0b3J5IGZvciBPcGVyYXRpb25Db250ZXh0LgotICovCi1wdWJsaWMgY2xhc3MgT3BlcmF0aW9uQ29udGV4dEZhY3RvcnkgaW1wbGVtZW50cyBXU0RMQ29uc3RhbnRzIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgT3BlcmF0aW9uQ29udGV4dCBjcmVhdGVPcGVyYXRpb25Db250ZXh0KGludCBtZXBVUkksIEF4aXNPcGVyYXRpb24gYXhpc09wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZpY2VDb250ZXh0IHNlcnZpY2VDb250ZXh0KQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIGlmICgoV1NETENvbnN0YW50cy5NRVBfQ09OU1RBTlRfSU5fT1VUID09IG1lcFVSSSkgfHwKLSAgICAgICAgICAgICAgICAoV1NETENvbnN0YW50cy5NRVBfQ09OU1RBTlRfSU5fT05MWSA9PSBtZXBVUkkpCi0gICAgICAgICAgICAgICAgfHwgKFdTRExDb25zdGFudHMuTUVQX0NPTlNUQU5UX0lOX09QVElPTkFMX09VVCA9PSBtZXBVUkkpCi0gICAgICAgICAgICAgICAgfHwgKFdTRExDb25zdGFudHMuTUVQX0NPTlNUQU5UX1JPQlVTVF9JTl9PTkxZID09IG1lcFVSSSkgfHwKLSAgICAgICAgICAgICAgICAoV1NETENvbnN0YW50cy5NRVBfQ09OU1RBTlRfT1VUX09OTFkgPT0gbWVwVVJJKQotICAgICAgICAgICAgICAgIHx8IChXU0RMQ29uc3RhbnRzLk1FUF9DT05TVEFOVF9PVVRfSU4gPT0gbWVwVVJJKSB8fAotICAgICAgICAgICAgICAgIChXU0RMQ29uc3RhbnRzLk1FUF9DT05TVEFOVF9PVVRfT1BUSU9OQUxfSU4gPT0gbWVwVVJJKQotICAgICAgICAgICAgICAgIHx8IChXU0RMQ29uc3RhbnRzLk1FUF9DT05TVEFOVF9ST0JVU1RfT1VUX09OTFkgPT0gbWVwVVJJKSkgewotICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2VDb250ZXh0LmNyZWF0ZU9wZXJhdGlvbkNvbnRleHQoYXhpc09wKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoTWVzc2FnZXMuZ2V0TWVzc2FnZSgidW5TdXBwb3J0ZWRNRVAiLCAiSUQgaXMgIiArIG1lcFVSSSkpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvbnRleHQvUHJvcGVydHlEaWZmZXJlbmNlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY29udGV4dC9Qcm9wZXJ0eURpZmZlcmVuY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWE3ZWJjYy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY29udGV4dC9Qcm9wZXJ0eURpZmZlcmVuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0OwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBob2xkcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHR3byBwcm9wZXJ0aWVzIHdoaWNoIGFyZSBzdG9yZWQgaW4gdGhlCi0gKiBBYnN0cmFjdENvbnRleHQKLSAqLwotcHVibGljIGNsYXNzIFByb3BlcnR5RGlmZmVyZW5jZSBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBrZXk7Ci0gICAgcHJpdmF0ZSBPYmplY3QgdmFsdWU7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGlzUmVtb3ZlZDsKLQotICAgIHB1YmxpYyBQcm9wZXJ0eURpZmZlcmVuY2UoU3RyaW5nIGtleSwgT2JqZWN0IHZhbHVlLCBib29sZWFuIGlzUmVtb3ZlZCkgewotICAgICAgICB0aGlzLmtleSA9IGtleTsKLSAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwotICAgICAgICB0aGlzLmlzUmVtb3ZlZCA9IGlzUmVtb3ZlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLSAgICAgICAgcmV0dXJuIGtleTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldFZhbHVlKCkgewotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWUoT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1JlbW92ZWQoKSB7Ci0gICAgICAgIHJldHVybiBpc1JlbW92ZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UmVtb3ZlZChib29sZWFuIHJlbW92ZWQpIHsKLSAgICAgICAgaXNSZW1vdmVkID0gcmVtb3ZlZDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY29udGV4dC9TZWxmTWFuYWdlZERhdGFNYW5hZ2VyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY29udGV4dC9TZWxmTWFuYWdlZERhdGFNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5Mjc5MDIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvbnRleHQvU2VsZk1hbmFnZWREYXRhTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQ7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLS8qKgotICogQW4gaW50ZXJmYWNlIGZvciB1c2UgYnkgYSBtZXNzYWdlIGhhbmRsZXIgdG8gYWxsb3cKLSAqIGl0IHRvIHNhdmUgYW5kIHJlc3RvcmUgYW55IG1lc3NhZ2Utc3BlY2lmaWMgZGF0YS4KLSAqIDxwLz4KLSAqIEEgaGFuZGxlciBjYW4gaGF2ZSBtZXNzYWdlLXNwZWNpZmljIGRhdGEgdGhhdAotICogbmVlZHMgdG8gYmUgYXNzb2NpYXRlZCB0aGUgbWVzc2FnZSBiZWluZyBwcm9jZXNzZWQuCi0gKiBUaGUgaGFuZGxlciBjYW4ga2VlcCB0aGlzIG1lc3NhZ2Utc3BlY2lmaWMgZGF0YQotICogaW4gdGhlIE1lc3NhZ2Vjb250ZXh0IG9iamVjdCBieSBhZGRpbmcgdGhlCi0gKiBkYXRhIHRvIHRoZSB1c2VyIGRhdGEgdGFibGUgdmlhIHRoZQotICogTWVzc2FnZUNvbnRleHQgbWV0aG9kLiAgV2hlbiB0aGUgTWVzc2FnZUNvbnRleHQKLSAqIG9iamVjdCBpcyBzYXZlZCAoZm9yIGV4YW1wbGUsIHRvIHBlcnNpc3RlbnQgc3RvcmFnZSksCi0gKiBhbmQgcmVzdG9yZWQsIHRoaXMgaW50ZXJmYWNlIDxCPlNlbGZNYW5hZ2VkRGF0YU1hbmFnZXI8L0I+Ci0gKiBwcm92aWRlcyBhIHdheSBmb3IgdGhlIGhhbmRsZXIgdG8gc2F2ZSBhbmQgcmVzdG9yZQotICogdGhlIGhhbmRsZXIncyBtZXNzYWdlLXNwZWNpZmljIGRhdGEuCi0gKgotICogQHNlZSBNZXNzYWdlQ29udGV4dAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFNlbGZNYW5hZ2VkRGF0YU1hbmFnZXIgewotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgaXMgaW52b2tlZCB3aGVuIHRoZSBNZXNzYWdlQ29udGV4dCBvYmplY3QgaXMgYmVpbmcgc2F2ZWQuCi0gICAgICogPHAvPgotICAgICAqIEltcGxlbWVudG9ycyBhcmUgZXhwZWN0ZWQgdG8gaXRlcmF0ZSB0aHJvdWdoIHRoZSBkYXRhIG9iamVjdHMgdGhleSB3aXNoCi0gICAgICogdG8gc2F2ZSBhbmQgcmV0dXJuIGl0IGluIGEgQnl0ZUFycmF5T3V0cHV0U3RyZWFtLiAgVGhpcyBkYXRhIHdpbGwKLSAgICAgKiBsYXRlciBiZSBwYXNzZWQgdG8gdGhlIGltcGxlbWVudG9yJ3MgZGVzZXJpYWxpemVTZWxmTWFuYWdlZERhdGEgbWV0aG9kIHdoZW4KLSAgICAgKiB0aGUgZGF0YSBvYmplY3QgaXMgdG8gYmUgcmVzdG9yZWQuCi0gICAgICogPHAvPgotICAgICAqIFRoZSBkYXRhIGJlaW5nIHNhdmVkIG1heSBiZSB0aGUgZGF0YSBzdG9yZWQgYnkgdGhlIGltcGxlbWVudG9yCi0gICAgICogaW4gdGhlIE1lc3NhZ2VDb250ZXh0IG9iamVjdCdzIFNlbGZNYW5hZ2VkRGF0YSBsaXN0IGFuZCBtYXkgaW5jbHVkZQotICAgICAqIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gc3VjaCBhcyB0aGUgaW1wbGVtZW50b3IncyBmaWVsZHMuCi0gICAgICogTm90ZSB0aGF0IGRhdGEgc3RvcmVkIGJ5IHRoZSBpbXBsZW1lbnRvciBpbiB0aGUgTWVzc2FnZUNvbnRleHQgb2JqZWN0J3MgU2VsZk1hbmFnZWREYXRhCi0gICAgICogbGlzdCBpcyByZXRyaWV2YWJsZSBieSBjYWxsaW5nIHRoZSBNZXNzYWdlQ29udGV4dC5nZXRTZWxmTWFuYWdlZERhdGEoKSBtZXRob2QKLSAgICAgKiBmb3IgRUFDSCBrZXkvdmFsdWUgcGFpci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtYyB0aGUgTWVzc2FnZUNvbnRleHQgdGhhdCBpcyBiZWluZyBzYXZlZAotICAgICAqIEByZXR1cm4gVGhlIHNhdmVkIGRhdGEgaW4gdGhlIG91dHB1dCBzdHJlYW0uIE5vdGUgdGhhdCB0aGUKLSAgICAgKiAgICAgICAgIGZvcm1hdCBvZiB0aGUgZGF0YSBpbiB0aGUgb3V0cHV0IHN0cmVhbSBpcyBkZWZpbmVkCi0gICAgICogICAgICAgICBieSB0aGUgaW1wbGVtZW50b3IuCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gc2VyaWFsaXplU2VsZk1hbmFnZWREYXRhKE1lc3NhZ2VDb250ZXh0IG1jKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCBpcyBpbnZva2VkIHdoZW4gdGhlIE1lc3NhZ2VDb250ZXh0IG9iamVjdCBpcyBiZWluZyByZXN0b3JlZC4KLSAgICAgKiA8cC8+Ci0gICAgICogSW1wbGVtZW50b3JzIHdpbGwgcmVjZWl2ZSB0aGUgZGF0YSB0aGV5IGhhZCBwcmV2aW91c2x5IHNhdmVkIGluIHRoZQotICAgICAqIHNlcmlhbGl6ZVNlbGZNYW5hZ2VkRGF0YSgpIG1ldGhvZC4gSW1wbGVtZW50b3JzIGFyZSByZXNwb25zaWJsZSBmb3IKLSAgICAgKiByZWNvbnN0aXR1dGluZyB0aGVpciBtZXNzYWdlLXNwZWNpZmljIGRhdGEuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZGF0YSBCeXRlQXJyYXlJbnB1dFN0cmVhbSBjb25zaXN0aW5nIG9mIHRoZSBkYXRhIHRoYXQgdGhpcyBoYW5kbGVyIGhhZCBwcmV2aW91c2x5IHNhdmVkCi0gICAgICogQHBhcmFtIG1jICAgdGhlIE1lc3NhZ2VDb250ZXh0IG9iamVjdCBiZWluZyByZXN0b3JlZAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkZXNlcmlhbGl6ZVNlbGZNYW5hZ2VkRGF0YShCeXRlQXJyYXlJbnB1dFN0cmVhbSBkYXRhLCBNZXNzYWdlQ29udGV4dCBtYykKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgaXMgaW52b2tlZCB3aGVuIHRoZSBNZXNzYWdlQ29udGV4dCBvYmplY3QgaXMgYmVpbmcgcmVzdG9yZWQgYW5kCi0gICAgICogYWZ0ZXIgdGhlIGRlc2VyaWFsaXplU2VsZk1hbmFnZWREYXRhKCkgbWV0aG9kLgotICAgICAqIDxwLz4KLSAgICAgKiBJbXBsZW1lbnRvcnMgdXNlIHRoaXMgbWV0aG9kIHRvIHJlLWVzdGFibGlzaCB0cmFuc2llbnQgbWVzc2FnZS1zcGVjaWZpYyBkYXRhLAotICAgICAqIHBhcnRpY3VsYXJseSBpZiB0aGUgaW1wbGVtZW50b3IgZGlkIG5vdCBzYXZlIGFueSB1c2VyIGRhdGEgaW4gdGhlCi0gICAgICogc2VyaWFsaXplU2VsZk1hbmFnZWREYXRhKCkgbWV0aG9kLgotICAgICAqCi0gICAgICogQHBhcmFtIG1jIHRoZSBNZXNzYWdlQ29udGV4dCBvYmplY3QgYmVpbmcgcmVzdG9yZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZXN0b3JlVHJhbnNpZW50RGF0YShNZXNzYWdlQ29udGV4dCBtYyk7Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb250ZXh0L1NlcnZpY2VDb250ZXh0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY29udGV4dC9TZXJ2aWNlQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2N2E2ZWE3Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb250ZXh0L1NlcnZpY2VDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2ODYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY29udGV4dDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5VVUlER2VuZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuZXh0ZXJuYWxpemUuQWN0aXZhdGVVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuZXh0ZXJuYWxpemUuRXh0ZXJuYWxpemVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LmV4dGVybmFsaXplLlNhZmVPYmplY3RJbnB1dFN0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuZXh0ZXJuYWxpemUuU2FmZU9iamVjdE91dHB1dFN0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuZXh0ZXJuYWxpemUuU2FmZVNlcmlhbGl6YWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlRyYW5zcG9ydEluRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0NvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuTGlzdGVuZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaTE4bi5NZXNzYWdlczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuTG9nZ2luZ0NvbnRyb2w7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLk1ldGFEYXRhRW50cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEuaW8uRXh0ZXJuYWxpemFibGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0OwotaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogV2VsbCB0aGlzIGlzIG5ldmVyIGNsZWFybHkgZGVmaW5lZCwgd2hhdCBpdCBkb2VzIG9yIHRoZSBsaWZlLWN5Y2xlLgotICogU28gZG8gTk9UIHVzZSB0aGlzIGFzIGl0IG1pZ2h0IG5vdCBsaXZlIHVwIHRvIHlvdXIgZXhwZWN0YXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlQ29udGV4dCBleHRlbmRzIEFic3RyYWN0Q29udGV4dCAKLSAgICBpbXBsZW1lbnRzIEV4dGVybmFsaXphYmxlLCBTYWZlU2VyaWFsaXphYmxlIHsKLQotICAgIC8qCi0gICAgICogc2V0dXAgZm9yIGxvZ2dpbmcKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coU2VydmljZUNvbnRleHQuY2xhc3MpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIG15Q2xhc3NOYW1lID0gIlNlcnZpY2VDb250ZXh0IjsKLQotICAgIC8qKgotICAgICAqIEFuIElEIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGNvcnJlbGF0ZSBvcGVyYXRpb25zIG9uIGFuIGluc3RhbmNlIG9mCi0gICAgICogdGhpcyBvYmplY3QgaW4gdGhlIGxvZyBmaWxlcwotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGxvZ0NvcnJlbGF0aW9uSURTdHJpbmcgPSBudWxsOwotCi0KLSAgICAvKioKLSAgICAgKiBAc2VyaWFsIFRoZSBzZXJpYWxpemF0aW9uIHZlcnNpb24gSUQgdHJhY2tzIHRoZSB2ZXJzaW9uIG9mIHRoZSBjbGFzcy4KLSAgICAgKiBJZiBhIGNsYXNzIGRlZmluaXRpb24gY2hhbmdlcywgdGhlbiB0aGUgc2VyaWFsaXphdGlvbi9leHRlcm5hbGl6YXRpb24KLSAgICAgKiBvZiB0aGUgY2xhc3MgaXMgYWZmZWN0ZWQuIElmIGEgY2hhbmdlIHRvIHRoZSBjbGFzcyBpcyBtYWRlIHdoaWNoIGlzCi0gICAgICogbm90IGNvbXBhdGlibGUgd2l0aCB0aGUgc2VyaWFsaXphdGlvbi9leHRlcm5hbGl6YXRpb24gb2YgdGhlIGNsYXNzLAotICAgICAqIHRoZW4gdGhlIHNlcmlhbGl6YXRpb24gdmVyc2lvbiBJRCBzaG91bGQgYmUgdXBkYXRlZC4KLSAgICAgKiBSZWZlciB0byB0aGUgInNlcmlhbFZlciIgdXRpbGl0eSB0byBjb21wdXRlIGEgc2VyaWFsaXphdGlvbgotICAgICAqIHZlcnNpb24gSUQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gODI2NTYyNTI3NTAxNTczODk1N0w7Ci0KLSAgICAvKioKLSAgICAgKiBAc2VyaWFsIFRyYWNrcyB0aGUgcmV2aXNpb24gbGV2ZWwgb2YgYSBjbGFzcyB0byBpZGVudGlmeSBjaGFuZ2VzIHRvIHRoZQotICAgICAqIGNsYXNzIGRlZmluaXRpb24gdGhhdCBhcmUgY29tcGF0aWJsZSB0byBzZXJpYWxpemF0aW9uL2V4dGVybmFsaXphdGlvbi4KLSAgICAgKiBJZiBhIGNsYXNzIGRlZmluaXRpb24gY2hhbmdlcywgdGhlbiB0aGUgc2VyaWFsaXphdGlvbi9leHRlcm5hbGl6YXRpb24KLSAgICAgKiBvZiB0aGUgY2xhc3MgaXMgYWZmZWN0ZWQuCi0gICAgICogUmVmZXIgdG8gdGhlIHdyaXRlRXh0ZXJuYWwoKSBhbmQgcmVhZEV4dGVybmFsKCkgbWV0aG9kcy4KLSAgICAgKi8KLSAgICAvLyBzdXBwb3J0ZWQgcmV2aXNpb24gbGV2ZWxzLCBhZGQgYSBuZXcgbGV2ZWwgdG8gbWFuYWdlIGNvbXBhdGlibGUgY2hhbmdlcwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRVZJU0lPTl8yID0gMjsKLSAgICAvLyBjdXJyZW50IHJldmlzaW9uIGxldmVsIG9mIHRoaXMgb2JqZWN0Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IHJldmlzaW9uSUQgPSBSRVZJU0lPTl8yOwotCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWSUNFX09CSkVDVCA9ICJzZXJ2aWNlT2JqZWN0IjsKLQotICAgIHByaXZhdGUgRW5kcG9pbnRSZWZlcmVuY2UgdGFyZ2V0RVBSOwotICAgIHByaXZhdGUgRW5kcG9pbnRSZWZlcmVuY2UgbXlFUFI7Ci0KLSAgICBwcml2YXRlIHRyYW5zaWVudCBBeGlzU2VydmljZSBheGlzU2VydmljZTsKLQotICAgIC8vIHRoZSBzZXJ2aWNlIGdyb3VwIGNvbnRleHQgaXMgdGhlIHNhbWUgYXMgdGhlIHBhcmVudAotICAgIHByaXZhdGUgdHJhbnNpZW50IFNlcnZpY2VHcm91cENvbnRleHQgc2VydmljZUdyb3VwQ29udGV4dDsKLQotICAgIHByaXZhdGUgdHJhbnNpZW50IENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQ7Ci0KLSAgICAvKioKLSAgICAgKiBTaG91bGQgd2UgY2FjaGUgdGhlIGxhc3QgT3BlcmF0aW9uQ29udGV4dD8KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gY2FjaGluZ09wZXJhdGlvbkNvbnRleHQ7Ci0gICAgLyoqCi0gICAgICogQSBjYWNoZSBmb3IgdGhlIGxhc3QgT3BlcmF0aW9uQ29udGV4dAotICAgICAqLwotICAgIHByaXZhdGUgdHJhbnNpZW50IE9wZXJhdGlvbkNvbnRleHQgbGFzdE9wZXJhdGlvbkNvbnRleHQ7Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBNZXRhRGF0YSBmb3IgZGF0YSB0byBiZSByZXN0b3JlZCBpbiBhY3RpdmF0ZSBhZnRlciByZWFkRXh0ZXJuYWwKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKgotICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBtZXNzYWdlIGNvbnRleHQgaGFzIGJlZW4gcmVjb25zdGl0dXRlZAotICAgICAqIGFuZCBuZWVkcyB0byBoYXZlIGl0cyBvYmplY3QgcmVmZXJlbmNlcyByZWNvbmNpbGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSB0cmFuc2llbnQgYm9vbGVhbiBuZWVkc1RvQmVSZWNvbmNpbGVkID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgQXhpc1NlcnZpY2UgbWV0YWRhdGEgd2lsbCBiZSB1c2VkIGR1cmluZwotICAgICAqIGFjdGl2YXRlIHRvIG1hdGNoIHVwIHdpdGggYW4gZXhpc3Rpbmcgb2JqZWN0Ci0gICAgICovCi0gICAgcHJpdmF0ZSB0cmFuc2llbnQgTWV0YURhdGFFbnRyeSBtZXRhQXhpc1NlcnZpY2UgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogVGhlIFNlcnZpY2VHcm91cENvbnRleHQgb2JqZWN0IHdpbGwgYmUgdXNlZCBkdXJpbmcKLSAgICAgKiBhY3RpdmF0ZSB0byBmaW5pc2ggaXRzIHJlc3RvcmF0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSB0cmFuc2llbnQgU2VydmljZUdyb3VwQ29udGV4dCBtZXRhUGFyZW50ID0gbnVsbDsKLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIGVuZCBNZXRhRGF0YSBzZWN0aW9uCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvKioKLSAgICAgKiBQdWJsaWMgY29uc3RydWN0b3IgKG9ubHkgaGVyZSBiZWNhdXNlIHRoaXMgY2xhc3MgaXMgRXh0ZXJuYWxpemFibGUpCi0gICAgICovCi0gICAgcHVibGljIFNlcnZpY2VDb250ZXh0KCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIChwYWNrYWdlIGFjY2Vzcywgc2hvdWxkIG9ubHkgYmUgdXNlZCBieSBTZXJ2aWNlR3JvdXBDb250ZXh0KQotICAgICAqCi0gICAgICogQHBhcmFtIGF4aXNTZXJ2aWNlIHRoZSBBeGlzU2VydmljZSBmb3Igd2hpY2ggdG8gY3JlYXRlIGEgY29udGV4dAotICAgICAqIEBwYXJhbSBzZXJ2aWNlR3JvdXBDb250ZXh0IHRoZSBwYXJlbnQgU2VydmljZUdyb3VwQ29udGV4dAotICAgICAqLwotICAgIFNlcnZpY2VDb250ZXh0KEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlLCBTZXJ2aWNlR3JvdXBDb250ZXh0IHNlcnZpY2VHcm91cENvbnRleHQpIHsKLSAgICAgICAgc3VwZXIoc2VydmljZUdyb3VwQ29udGV4dCk7Ci0gICAgICAgIHRoaXMuc2VydmljZUdyb3VwQ29udGV4dCA9IHNlcnZpY2VHcm91cENvbnRleHQ7Ci0gICAgICAgIHRoaXMuYXhpc1NlcnZpY2UgPSBheGlzU2VydmljZTsKLSAgICAgICAgdGhpcy5jb25maWdDb250ZXh0ID0gKENvbmZpZ3VyYXRpb25Db250ZXh0KSBwYXJlbnQuZ2V0UGFyZW50KCk7Ci0gICAgfQotCi0gICAgcHVibGljIE9wZXJhdGlvbkNvbnRleHQgY3JlYXRlT3BlcmF0aW9uQ29udGV4dChRTmFtZSBuYW1lKSB7Ci0gICAgICAgIEF4aXNPcGVyYXRpb24gYXhpc09wID0gYXhpc1NlcnZpY2UuZ2V0T3BlcmF0aW9uKG5hbWUpOwotICAgICAgICByZXR1cm4gY3JlYXRlT3BlcmF0aW9uQ29udGV4dChheGlzT3ApOwotICAgIH0KLQotICAgIHB1YmxpYyBPcGVyYXRpb25Db250ZXh0IGNyZWF0ZU9wZXJhdGlvbkNvbnRleHQoQXhpc09wZXJhdGlvbiBheGlzT3ApIHsKLSAgICAgICAgT3BlcmF0aW9uQ29udGV4dCBjdHggPSBuZXcgT3BlcmF0aW9uQ29udGV4dChheGlzT3AsIHRoaXMpOwotICAgICAgICBjb25maWdDb250ZXh0LmNvbnRleHRDcmVhdGVkKGN0eCk7Ci0gICAgICAgIHJldHVybiBjdHg7Ci0gICAgfQotCi0gICAgcHVibGljIEF4aXNTZXJ2aWNlIGdldEF4aXNTZXJ2aWNlKCkgewotICAgICAgICBjaGVja0FjdGl2YXRlV2FybmluZygiZ2V0QXhpc1NlcnZpY2UiKTsKLSAgICAgICAgcmV0dXJuIGF4aXNTZXJ2aWNlOwotICAgIH0KLQotICAgIHB1YmxpYyBDb25maWd1cmF0aW9uQ29udGV4dCBnZXRDb25maWd1cmF0aW9uQ29udGV4dCgpIHsKLSAgICAgICAgY2hlY2tBY3RpdmF0ZVdhcm5pbmcoImdldENvbmZpZ3VyYXRpb25Db250ZXh0Iik7Ci0gICAgICAgIHJldHVybiBjb25maWdDb250ZXh0OwotICAgIH0KLQotICAgIHB1YmxpYyBTZXJ2aWNlR3JvdXBDb250ZXh0IGdldFNlcnZpY2VHcm91cENvbnRleHQoKSB7Ci0gICAgICAgIGNoZWNrQWN0aXZhdGVXYXJuaW5nKCJnZXRTZXJ2aWNlR3JvdXBDb250ZXh0Iik7Ci0gICAgICAgIHJldHVybiBzZXJ2aWNlR3JvdXBDb250ZXh0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRvIGdldCB0aGUgRVJQIGZvciBhIGdpdmVuIHNlcnZpY2UgLCBpZiB0aGUgdHJhbnNwb3J0IGlzIHByZXNlbnQgYW5kIG5vdAotICAgICAqIHJ1bm5pbmcgdGhlbiBpdCB3aWxsIGFkZCBhcyBhIGxpc3RlbmVyIHRvIExpc3RlbmVyTWFuYWdlciAsIHRoZXJlIGl0IHdpbGwKLSAgICAgKiBpbml0IHRoYXQgYW5kIHN0YXJ0IHRoZSBsaXN0ZW5lciAsIGFuZCBmaW5hbGx5IGFzayB0aGUgRVBSIGZyb20gdHJhbnNwb3J0Ci0gICAgICogZm9yIGEgZ2l2ZW4gc2VydmljZQotICAgICAqCi0gICAgICogQHBhcmFtIHRyYW5zcG9ydCA6IE5hbWUgb2YgdGhlIHRyYW5zcG9ydAotICAgICAqIEByZXR1cm4KLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdAotICAgICAqLwotICAgIHB1YmxpYyBFbmRwb2ludFJlZmVyZW5jZSBnZXRNeUVQUihTdHJpbmcgdHJhbnNwb3J0KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgYXhpc1NlcnZpY2UuaXNFbmFibGVBbGxUcmFuc3BvcnRzKCk7Ci0gICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ2N0eCA9IHRoaXMuY29uZmlnQ29udGV4dDsKLSAgICAgICAgaWYgKGNvbmZpZ2N0eCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBMaXN0ZW5lck1hbmFnZXIgbG0gPSBjb25maWdjdHguZ2V0TGlzdGVuZXJNYW5hZ2VyKCk7Ci0gICAgICAgICAgICBpZiAoIWxtLmlzTGlzdGVuZXJSdW5uaW5nKHRyYW5zcG9ydCkpIHsKLSAgICAgICAgICAgICAgICBUcmFuc3BvcnRJbkRlc2NyaXB0aW9uIHRyc2luID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ2N0eC5nZXRBeGlzQ29uZmlndXJhdGlvbigpLmdldFRyYW5zcG9ydEluKHRyYW5zcG9ydCk7Ci0gICAgICAgICAgICAgICAgaWYgKHRyc2luICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbG0uYWRkTGlzdGVuZXIodHJzaW4sIGZhbHNlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KE1lc3NhZ2VzLmdldE1lc3NhZ2UoInRyYW5zcG9ydG5vdGZvdW5kIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghbG0uaXNTdG9wcGVkKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbG0uZ2V0RVBSZm9yU2VydmljZShheGlzU2VydmljZS5nZXROYW1lKCksIG51bGwsIHRyYW5zcG9ydCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIEVuZHBvaW50UmVmZXJlbmNlIGdldFRhcmdldEVQUigpIHsKLSAgICAgICAgcmV0dXJuIHRhcmdldEVQUjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRUYXJnZXRFUFIoRW5kcG9pbnRSZWZlcmVuY2UgdGFyZ2V0RVBSKSB7Ci0gICAgICAgIHRoaXMudGFyZ2V0RVBSID0gdGFyZ2V0RVBSOwotICAgIH0KLQotICAgIHB1YmxpYyBFbmRwb2ludFJlZmVyZW5jZSBnZXRNeUVQUigpIHsKLSAgICAgICAgaWYgKG15RVBSID09IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaWYgKExpc3RlbmVyTWFuYWdlci5kZWZhdWx0Q29uZmlndXJhdGlvbkNvbnRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBMaXN0ZW5lck1hbmFnZXIgbGlzdGVuZXJNYW5hZ2VyID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0ZW5lck1hbmFnZXIuZGVmYXVsdENvbmZpZ3VyYXRpb25Db250ZXh0LmdldExpc3RlbmVyTWFuYWdlcigpOwotICAgICAgICAgICAgICAgICAgICBteUVQUiA9IGxpc3RlbmVyTWFuYWdlci5nZXRFUFJmb3JTZXJ2aWNlKGF4aXNTZXJ2aWNlLmdldE5hbWUoKSwgbnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGF4aXNGYXVsdCkgewotICAgICAgICAgICAgICAgIC8vIHdoYXQgZWxzZSBJIGNhbiBkbyAKLSAgICAgICAgICAgICAgICBteUVQUiA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG15RVBSOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE15RVBSKEVuZHBvaW50UmVmZXJlbmNlIG15RVBSKSB7Ci0gICAgICAgIHRoaXMubXlFUFIgPSBteUVQUjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT3BlcmF0aW9uQ29udGV4dCBnZXRMYXN0T3BlcmF0aW9uQ29udGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIGxhc3RPcGVyYXRpb25Db250ZXh0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldExhc3RPcGVyYXRpb25Db250ZXh0KE9wZXJhdGlvbkNvbnRleHQgbGFzdE9wZXJhdGlvbkNvbnRleHQpIHsKLSAgICAgICAgdGhpcy5sYXN0T3BlcmF0aW9uQ29udGV4dCA9IGxhc3RPcGVyYXRpb25Db250ZXh0OwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQ2FjaGluZ09wZXJhdGlvbkNvbnRleHQoKSB7Ci0gICAgICAgIHJldHVybiBjYWNoaW5nT3BlcmF0aW9uQ29udGV4dDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDYWNoaW5nT3BlcmF0aW9uQ29udGV4dChib29sZWFuIGNhY2hlTGFzdE9wZXJhdGlvbkNvbnRleHQpIHsKLSAgICAgICAgdGhpcy5jYWNoaW5nT3BlcmF0aW9uQ29udGV4dCA9IGNhY2hlTGFzdE9wZXJhdGlvbkNvbnRleHQ7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBTZXJ2aWNlQ29udGV4dC4KLSAgICAgKiA8cC8+Ci0gICAgICogTm90ZTogdGhpcyBuYW1lIGlzIGZyb20gdGhlIGNvcnJlc3BvbmRpbmcKLSAgICAgKiBBeGlzU2VydmljZSBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBuYW1lIHN0cmluZywgb3IgbnVsbCBpZiBubyBuYW1lIGNhbiBiZSBmb3VuZAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgaWYgKGF4aXNTZXJ2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBheGlzU2VydmljZS5nZXROYW1lKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobWV0YUF4aXNTZXJ2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBtZXRhQXhpc1NlcnZpY2UuZ2V0TmFtZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhlIFNlcnZpY2VHcm91cENvbnRleHQKLSAgICAgKiBhc3NvY2lhdGVkIHdpdGggdGhpcyBTZXJ2aWNlQ29udGV4dC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIG5hbWUgc3RyaW5nLCBvciBudWxsIGlmIG5vIG5hbWUgY2FuIGJlIGZvdW5kCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRHcm91cE5hbWUoKSB7Ci0gICAgICAgIGlmIChzZXJ2aWNlR3JvdXBDb250ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlR3JvdXBDb250ZXh0LmdldElkKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobWV0YVBhcmVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbWV0YVBhcmVudC5nZXRJZCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgICogRXh0ZXJuYWxpemFibGUgc3VwcG9ydCAKLSAgICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgKi8KLQotCi0gICAgLyoqCi0gICAgICogU2F2ZSB0aGUgY29udGVudHMgb2YgdGhpcyBvYmplY3QuCi0gICAgICogPHAvPgotICAgICAqIE5PVEU6IFRyYW5zaWVudCBmaWVsZHMgYW5kIHN0YXRpYyBmaWVsZHMgYXJlIG5vdCBzYXZlZC4KLSAgICAgKiBBbHNvLCBvYmplY3RzIHRoYXQgcmVwcmVzZW50ICJzdGF0aWMiIGRhdGEgYXJlCi0gICAgICogbm90IHNhdmVkLCBleGNlcHQgZm9yIGVub3VnaCBpbmZvcm1hdGlvbiB0byBiZQotICAgICAqIGFibGUgdG8gZmluZCBtYXRjaGluZyBvYmplY3RzIHdoZW4gdGhlIG1lc3NhZ2UKLSAgICAgKiBjb250ZXh0IGlzIHJlLWNvbnN0aXR1dGVkLgotICAgICAqCi0gICAgICogQHBhcmFtIG91dCBUaGUgc3RyZWFtIHRvIHdyaXRlIHRoZSBvYmplY3QgY29udGVudHMgdG8KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgd3JpdGVFeHRlcm5hbChPYmplY3RPdXRwdXQgbykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgU2FmZU9iamVjdE91dHB1dFN0cmVhbSBvdXQgPSBTYWZlT2JqZWN0T3V0cHV0U3RyZWFtLmluc3RhbGwobyk7Ci0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIGluIG9yZGVyIHRvIGhhbmRsZSBmdXR1cmUgY2hhbmdlcyB0byB0aGUgbWVzc2FnZSAKLSAgICAgICAgLy8gY29udGV4dCBkZWZpbml0aW9uLCBiZSBzdXJlIHRvIG1haW50YWluIHRoZSAKLSAgICAgICAgLy8gb2JqZWN0IGxldmVsIGlkZW50aWZpZXJzCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIHNlcmlhbGl6YXRpb24gdmVyc2lvbiBJRAotICAgICAgICBvdXQud3JpdGVMb25nKHNlcmlhbFZlcnNpb25VSUQpOwotCi0gICAgICAgIC8vIHJldmlzaW9uIElECi0gICAgICAgIG91dC53cml0ZUludChyZXZpc2lvbklEKTsKLQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyB2YXJpb3VzIHNpbXBsZSBmaWVsZHMKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICBvdXQud3JpdGVMb25nKGdldExhc3RUb3VjaGVkVGltZSgpKTsKLSAgICAgICAgb3V0LndyaXRlQm9vbGVhbihjYWNoaW5nT3BlcmF0aW9uQ29udGV4dCk7Ci0gICAgICAgIG91dC53cml0ZU9iamVjdChnZXRMb2dDb3JyZWxhdGlvbklEU3RyaW5nKCkpOwotCi0gICAgICAgIC8vIEVuZHBvaW50UmVmZXJlbmNlIHRhcmdldEVQUgotICAgICAgICBvdXQud3JpdGVPYmplY3QodGFyZ2V0RVBSKTsKLSAgICAgICAKLSAgICAgICAgLy8gRW5kcG9pbnRSZWZlcmVuY2UgbXlFUFIKLSAgICAgICAgb3V0LndyaXRlT2JqZWN0KG15RVBSKTsKLSAgICAgICAgCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIHByb3BlcnRpZXMKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgb3V0LndyaXRlTWFwKGdldFByb3BlcnRpZXMoKSk7Ci0gICAgICAgIAotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBBeGlzU2VydmljZQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICBtZXRhQXhpc1NlcnZpY2UgPSBudWxsOwotICAgICAgICBpZiAoYXhpc1NlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgbWV0YUF4aXNTZXJ2aWNlID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IE1ldGFEYXRhRW50cnkoYXhpc1NlcnZpY2UuZ2V0Q2xhc3MoKS5nZXROYW1lKCksIGF4aXNTZXJ2aWNlLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgb3V0LndyaXRlT2JqZWN0KG1ldGFBeGlzU2VydmljZSk7Ci0KLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gcGFyZW50IAotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICBvdXQud3JpdGVPYmplY3QoZ2V0UGFyZW50KCkpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogUmVzdG9yZSB0aGUgY29udGVudHMgb2YgdGhlIG9iamVjdCB0aGF0IHdhcyBwcmV2aW91c2x5IHNhdmVkLgotICAgICAqIDxwLz4KLSAgICAgKiBOT1RFOiBUaGUgZmllbGQgZGF0YSBtdXN0IHJlYWQgYmFjayBpbiB0aGUgc2FtZSBvcmRlciBhbmQgdHlwZQotICAgICAqIGFzIGl0IHdhcyB3cml0dGVuLiAgU29tZSBkYXRhIHdpbGwgbmVlZCB0byBiZSB2YWxpZGF0ZWQgd2hlbgotICAgICAqIHJlc3VycmVjdGVkLgotICAgICAqCi0gICAgICogQHBhcmFtIGluIFRoZSBzdHJlYW0gdG8gcmVhZCB0aGUgb2JqZWN0IGNvbnRlbnRzIGZyb20KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVhZEV4dGVybmFsKE9iamVjdElucHV0IGluT2JqZWN0KSB0aHJvd3MgSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICBTYWZlT2JqZWN0SW5wdXRTdHJlYW0gaW4gPSBTYWZlT2JqZWN0SW5wdXRTdHJlYW0uaW5zdGFsbChpbk9iamVjdCk7Ci0gICAgICAgIC8vIHNldCB0aGUgZmxhZyB0byBpbmRpY2F0ZSB0aGF0IHRoZSBtZXNzYWdlIGNvbnRleHQgaXMgYmVpbmcKLSAgICAgICAgLy8gcmVjb25zdGl0dXRlZCBhbmQgd2lsbCBuZWVkIHRvIGhhdmUgY2VydGFpbiBvYmplY3QgcmVmZXJlbmNlcyAKLSAgICAgICAgLy8gdG8gYmUgcmVjb25jaWxlZCB3aXRoIHRoZSBjdXJyZW50IGVuZ2luZSBzZXR1cAotICAgICAgICBuZWVkc1RvQmVSZWNvbmNpbGVkID0gdHJ1ZTsKLQotICAgICAgICAvLyB0cmFjZSBwb2ludAotICAgICAgICBpZiAoTG9nZ2luZ0NvbnRyb2wuZGVidWdMb2dnaW5nQWxsb3dlZCAmJiBsb2cuaXNUcmFjZUVuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLnRyYWNlKG15Q2xhc3NOYW1lICsgIjpyZWFkRXh0ZXJuYWwoKTogIEJFR0lOICBieXRlcyBhdmFpbGFibGUgaW4gc3RyZWFtIFsiICsKLSAgICAgICAgICAgICAgICBpbi5hdmFpbGFibGUoKSArICJdICAiKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIG9iamVjdCBsZXZlbCBpZGVudGlmaWVycwotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgIC8vIHNlcmlhbGl6YXRpb24gdmVyc2lvbiBJRAotICAgICAgICBsb25nIHN1aWQgPSBpbi5yZWFkTG9uZygpOwotCi0gICAgICAgIC8vIHJldmlzaW9uIElECi0gICAgICAgIGludCByZXZJRCA9IGluLnJlYWRJbnQoKTsKLQotICAgICAgICAvLyBtYWtlIHN1cmUgdGhlIG9iamVjdCBkYXRhIGlzIGluIGEgdmVyc2lvbiB3ZSBjYW4gaGFuZGxlCi0gICAgICAgIGlmIChzdWlkICE9IHNlcmlhbFZlcnNpb25VSUQpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uKEV4dGVybmFsaXplQ29uc3RhbnRzLlVOU1VQUE9SVEVEX1NVSUQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gbWFrZSBzdXJlIHRoZSBvYmplY3QgZGF0YSBpcyBpbiBhIHJldmlzaW9uIGxldmVsIHdlIGNhbiBoYW5kbGUKLSAgICAgICAgaWYgKHJldklEICE9IFJFVklTSU9OXzIpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uKEV4dGVybmFsaXplQ29uc3RhbnRzLlVOU1VQUE9SVEVEX1JFVklEKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIHZhcmlvdXMgc2ltcGxlIGZpZWxkcwotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgIGxvbmcgdGltZSA9IGluLnJlYWRMb25nKCk7Ci0gICAgICAgIHNldExhc3RUb3VjaGVkVGltZSh0aW1lKTsKLSAgICAgICAgY2FjaGluZ09wZXJhdGlvbkNvbnRleHQgPSBpbi5yZWFkQm9vbGVhbigpOwotICAgICAgICBsb2dDb3JyZWxhdGlvbklEU3RyaW5nID0gKFN0cmluZykgaW4ucmVhZE9iamVjdCgpOwotCi0gICAgICAgIC8vIHRyYWNlIHBvaW50Ci0gICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkICYmIGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cudHJhY2UobXlDbGFzc05hbWUgKyAiOnJlYWRFeHRlcm5hbCgpOiAgcmVhZGluZyBpbnB1dCBzdHJlYW0gZm9yIFsiICsKLSAgICAgICAgICAgICAgICAgICAgICBnZXRMb2dDb3JyZWxhdGlvbklEU3RyaW5nKCkrICJdICAiKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEVuZHBvaW50UmVmZXJlbmNlIHRhcmdldEVQUgotICAgICAgICB0YXJnZXRFUFIgPSAoRW5kcG9pbnRSZWZlcmVuY2UpIGluLnJlYWRPYmplY3QoKTsKLQotICAgICAgICAvLyBFbmRwb2ludFJlZmVyZW5jZSBteUVQUgotICAgICAgICBteUVQUiA9IChFbmRwb2ludFJlZmVyZW5jZSkgaW4ucmVhZE9iamVjdCgpOwotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIHByb3BlcnRpZXMKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgcHJvcGVydGllcyA9IGluLnJlYWRNYXAobmV3IEhhc2hNYXBVcGRhdGVMb2NrYWJsZSgpKTsKLQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBBeGlzU2VydmljZQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgIC8vIGF4aXNTZXJ2aWNlIGlzIG5vdCB1c2FibGUgdW50aWwgdGhlIG1ldGEgZGF0YSBoYXMgYmVlbiByZWNvbmNpbGVkCi0gICAgICAgIG1ldGFBeGlzU2VydmljZSA9IChNZXRhRGF0YUVudHJ5KSBpbi5yZWFkT2JqZWN0KCk7Ci0KLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gcGFyZW50IAotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgIC8vIFNlcnZpY2VHcm91cENvbnRleHQgaXMgbm90IHVzYWJsZSB1bnRpbCBpdCBoYXMgYmVlbiBhY3RpdmF0ZWQgCi0gICAgICAgIG1ldGFQYXJlbnQgPSAoU2VydmljZUdyb3VwQ29udGV4dCkgaW4ucmVhZE9iamVjdCgpOwotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIG90aGVyCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgLy8gY3VycmVudGx5IG5vdCBzYXZpbmcgdGhpcyBvYmplY3QKLSAgICAgICAgbGFzdE9wZXJhdGlvbkNvbnRleHQgPSBudWxsOwotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIGRvbmUKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIGNoZWNrcyB0byBzZWUgaWYgYWRkaXRpb25hbCB3b3JrIG5lZWRzIHRvIGJlCi0gICAgICogZG9uZSBpbiBvcmRlciB0byBjb21wbGV0ZSB0aGUgb2JqZWN0IHJlY29uc3RpdHV0aW9uLgotICAgICAqIFNvbWUgcGFydHMgb2YgdGhlIG9iamVjdCByZXN0b3JlZCBmcm9tIHRoZSByZWFkRXh0ZXJuYWwoKQotICAgICAqIGNhbm5vdCBiZSBjb21wbGV0ZWQgdW50aWwgd2UgaGF2ZSBhIGNvbmZpZ3VyYXRpb25Db250ZXh0Ci0gICAgICogZnJvbSB0aGUgYWN0aXZlIGVuZ2luZS4gVGhlIGNvbmZpZ3VyYXRpb25Db250ZXh0IGlzIHVzZWQKLSAgICAgKiB0byBoZWxwIHRoaXMgb2JqZWN0IHRvIHBsdWcgYmFjayBpbnRvIHRoZSBlbmdpbmUncwotICAgICAqIGNvbmZpZ3VyYXRpb24gYW5kIGRlcGxveW1lbnQgb2JqZWN0cy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjYyBUaGUgY29uZmlndXJhdGlvbiBjb250ZXh0IG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGFjdGl2ZSBjb25maWd1cmF0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWN0aXZhdGUoQ29uZmlndXJhdGlvbkNvbnRleHQgY2MpIHsKLSAgICAgICAgLy8gc2VlIGlmIHRoZXJlJ3MgYW55IHdvcmsgdG8gZG8KLSAgICAgICAgaWYgKCFuZWVkc1RvQmVSZWNvbmNpbGVkKSB7Ci0gICAgICAgICAgICAvLyByZXR1cm4gcXVpY2sKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHVzZSB0aGUgc3VwcGxpZWQgY29uZmlndXJhdGlvbiBjb250ZXh0Ci0gICAgICAgIGNvbmZpZ0NvbnRleHQgPSBjYzsKLQotICAgICAgICAvLyBnZXQgdGhlIGF4aXMgY29uZmlndXJhdGlvbiAKLSAgICAgICAgQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZyA9IGNjLmdldEF4aXNDb25maWd1cmF0aW9uKCk7Ci0KLSAgICAgICAgLy8gV2UgcHJldmlvdXNseSBzYXZlZCBtZXRhQXhpc1NlcnZpY2U7IHJlc3RvcmUgaXQKLSAgICAgICAgYXhpc1NlcnZpY2UgPSBudWxsOwotCi0gICAgICAgIGlmIChtZXRhQXhpc1NlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgYXhpc1NlcnZpY2UgPSBBY3RpdmF0ZVV0aWxzLmZpbmRTZXJ2aWNlKGF4aXNDb25maWcsIG1ldGFBeGlzU2VydmljZS5nZXRDbGFzc05hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhQXhpc1NlcnZpY2UuZ2V0UU5hbWVBc1N0cmluZygpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHRoZSBwYXJlbnQgU2VydmljZUdyb3VwQ29udGV4dCBvYmplY3Qgd2FzIHNhdmVkCi0gICAgICAgIC8vIGVpdGhlciB1c2UgdGhlIHJlc3RvcmVkIG9iamVjdCBvciBzeW5jIHVwIHdpdGggCi0gICAgICAgIC8vIGFuIGV4aXN0aW5nIFNlcnZpY2VHcm91cENvbnRleHQgb2JqZWN0Ci0gICAgICAgIGlmIChtZXRhUGFyZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIGZpbmQgb3V0IGlmIGEgY29weSBvZiB0aGUgU2VydmljZUdyb3VwQ29udGV4dCBvYmplY3QgZXhpc3RzIG9uIHRoaXMKLSAgICAgICAgICAgIC8vIGVuZ2luZSB3aGVyZSB0aGlzIFNlcnZpY2VDb250ZXh0IGlzIGJlaW5nIHJlc3RvcmVkL2FjdGl2YXRlZAotICAgICAgICAgICAgLy8gaWYgc28sIHVzZSB0aGF0IG9iamVjdCBpbnN0ZWFkIG9mIHRoZSByZXN0b3JlZCBvYmplY3QKLSAgICAgICAgICAgIC8vIGluIG9yZGVyIHRvIG1ha2Ugc3VyZSB0aGF0IGZ1dHVyZSBjaGFuZ2VzIHRvIGdyb3VwLWxldmVsIAotICAgICAgICAgICAgLy8gcHJvcGVydGllcyBhcmUgcHJlc2VydmVkIGZvciBmdXR1cmUgb3BlcmF0aW9ucwotICAgICAgICAgICAgU3RyaW5nIGdyb3VwTmFtZSA9IG1ldGFQYXJlbnQuZ2V0SWQoKTsKLQotICAgICAgICAgICAgU2VydmljZUdyb3VwQ29udGV4dCBleGlzdGluZ1NHQyA9IGNjLmdldFNlcnZpY2VHcm91cENvbnRleHQoZ3JvdXBOYW1lKTsKLQotICAgICAgICAgICAgaWYgKGV4aXN0aW5nU0dDID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBjb3VsZCBub3QgZmluZCBhbiBleGlzdGluZyBTZXJ2aWNlR3JvdXBDb250ZXh0Ci0gICAgICAgICAgICAgICAgLy8gdXNlIHRoZSByZXN0b3JlZCBvYmplY3QKLSAgICAgICAgICAgICAgICBtZXRhUGFyZW50LmFjdGl2YXRlKGNjKTsKLQotICAgICAgICAgICAgICAgIC8vIHNldCBwYXJlbnQgCi0gICAgICAgICAgICAgICAgdGhpcy5zZXRQYXJlbnQobWV0YVBhcmVudCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIHN3aXRjaCBvdmVyIHRvIHRoZSBleGlzdGluZyBvYmplY3QKLSAgICAgICAgICAgICAgICB0aGlzLnNldFBhcmVudChleGlzdGluZ1NHQyk7Ci0KLSAgICAgICAgICAgICAgICAvLyBkbyBhIGNvcHkgb2YgdGhlIHByb3BlcnRpZXMgZnJvbSB0aGUgcmVzdG9yZWQgb2JqZWN0Ci0gICAgICAgICAgICAgICAgLy8gdG8gdGhlIGV4aXN0aW5nIFNlcnZpY2VDb250ZXh0Ci0gICAgICAgICAgICAgICAgLy8gU2hvdWxkIHRoZSBjb3B5IGJlIGEgbm9uLWRlc3RydWN0aXZlIG9uZT8gIFRoYXQgaXMsCi0gICAgICAgICAgICAgICAgLy8gaWYgdGhlIGtleSBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgcHJvcGVydGllcyB0YWJsZSBvZiB0aGUKLSAgICAgICAgICAgICAgICAvLyBleGlzdGluZyBvYmplY3QsIHNob3VsZCB0aGUgdmFsdWUgYmUgb3ZlcndyaXR0ZW4gZnJvbSB0aGUgCi0gICAgICAgICAgICAgICAgLy8gcmVzdG9yZWQgb2piZWN0PyBGb3Igbm93LCB0aGUgZGVjaXNpb24gaXMgdGhhdCB0aGUgc3RhdGUKLSAgICAgICAgICAgICAgICAvLyB0aGF0IGhhcyBiZWVuIHByZXNlcnZlZCBmb3IgYSBzYXZlZCBjb250ZXh0IG9iamVjdCBpcwotICAgICAgICAgICAgICAgIC8vIGlzIGltcG9ydGFudCB0byBiZSByZXN0b3JlZC4KLSAgICAgICAgICAgICAgICBtZXRhUGFyZW50LnB1dENvbnRleHRQcm9wZXJ0aWVzKGV4aXN0aW5nU0dDKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gc2V0IHBhcmVudCB0byBudWxsCi0gICAgICAgICAgICB0aGlzLnNldFBhcmVudChtZXRhUGFyZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHRoaXMgaXMgYW5vdGhlciBwb2ludGVyIHRvIG91ciBwYXJlbnQgb2JqZWN0Ci0gICAgICAgIHNlcnZpY2VHcm91cENvbnRleHQgPSAoU2VydmljZUdyb3VwQ29udGV4dCkgdGhpcy5nZXRQYXJlbnQoKTsKLQotICAgICAgICBpZiAoc2VydmljZUdyb3VwQ29udGV4dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBhZGQgdGhlIHNlcnZpY2UgY29udGV4dCB0byB0aGUgdGFibGUKLSAgICAgICAgICAgIHNlcnZpY2VHcm91cENvbnRleHQuYWRkU2VydmljZUNvbnRleHQodGhpcyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gZG9uZSwgcmVzZXQgdGhlIGZsYWcKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIG5lZWRzVG9CZVJlY29uY2lsZWQgPSBmYWxzZTsKLQotICAgICAgICAvLyBtYWtlIHN1cmUgdGhpcyByZXN0b3JlZCBvYmplY3QgaXMgaW4gdGhlIHBhcmVudCdzIGxpc3QKLSAgICAgICAgaWYgKG1ldGFQYXJlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHRoaXMgcmVzdG9yZWQgb2JqZWN0IGlzIGluIHRoZSBwYXJlbnQncyBsaXN0Ci0gICAgICAgICAgICBtZXRhUGFyZW50LmFkZFNlcnZpY2VDb250ZXh0KHRoaXMpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHdpbGwgZG8gYSBjb3B5IG9mIHRoZSBwcm9wZXJ0aWVzIGZyb20gdGhpcyBjb250ZXh0IG9iamVjdAotICAgICAqIHRvIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBzcGVjaWZpZWQgY29udGV4dCBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29udGV4dCAgICAgICAgICAgIFRoZSBTZXJ2aWNlQ29udGV4dCBvYmplY3QgdG8gaG9sZCB0aGUgbWVyZ2VkIHByb3BlcnRpZXMKLSAgICAgKiBAcGFyYW0gZG9QYXJlbnRQcm9wZXJ0aWVzIEluZGljYXRlcyB3aGV0aGVyIHRvIGdvIHVwIHRoZSBjb250ZXh0IGhpZXJhY2h5Ci0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBjb3B5IHRoZSBwcm9wZXJ0aWVzIGF0IGVhY2ggbGV2ZWwKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwdXRDb250ZXh0UHJvcGVydGllcyhTZXJ2aWNlQ29udGV4dCBjb250ZXh0LCBib29sZWFuIGRvUGFyZW50UHJvcGVydGllcykgewotICAgICAgICBpZiAoY29udGV4dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBnZXQgdGhlIGN1cnJlbnQgcHJvcGVydGllcyBvbiB0aGlzIGNvbnRleHQgb2JqZWN0Ci0gICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BzID0gZ2V0UHJvcGVydGllcygpOwotCi0gICAgICAgICAgICAvLyBjb3B5IHRoZW0gdG8gdGhlIHNwZWNpZmllZCBjb250ZXh0IG9iamVjdAotICAgICAgICAgICAgY29udGV4dC5tZXJnZVByb3BlcnRpZXMocHJvcHMpOwotCi0gICAgICAgICAgICBpZiAoZG9QYXJlbnRQcm9wZXJ0aWVzKSB7Ci0gICAgICAgICAgICAgICAgU2VydmljZUdyb3VwQ29udGV4dCBteVNHQyA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICBpZiAoc2VydmljZUdyb3VwQ29udGV4dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG15U0dDID0gc2VydmljZUdyb3VwQ29udGV4dDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1ldGFQYXJlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBteVNHQyA9IG1ldGFQYXJlbnQ7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG15U0dDICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgU2VydmljZUdyb3VwQ29udGV4dCBzZ2MgPSBjb250ZXh0LmdldFNlcnZpY2VHcm91cENvbnRleHQoKTsKLSAgICAgICAgICAgICAgICAgICAgbXlTR0MucHV0Q29udGV4dFByb3BlcnRpZXMoc2djKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIENvbXBhcmVzIGtleSBwYXJ0cyBvZiB0aGUgc3RhdGUgZnJvbSB0aGUgY3VycmVudCBpbnN0YW5jZSBvZgotICAgICAqIHRoaXMgY2xhc3Mgd2l0aCB0aGUgc3BlY2lmaWVkIGluc3RhbmNlIHRvIHNlZSBpZiB0aGV5IGFyZQotICAgICAqIGVxdWl2YWxlbnQuCi0gICAgICogPHAvPgotICAgICAqIFRoaXMgZGlmZmVycyBmcm9tIHRoZSBqYXZhLmxhbmcuT2JqZWN0LmVxdWFscygpIG1ldGhvZCBpbgotICAgICAqIHRoYXQgdGhlIGVxdWFscygpIG1ldGhvZCBnZW5lcmFsbHkgbG9va3MgYXQgYm90aCB0aGUKLSAgICAgKiBvYmplY3QgaWRlbnRpdHkgKGxvY2F0aW9uIGluIG1lbW9yeSkgYW5kIHRoZSBvYmplY3Qgc3RhdGUKLSAgICAgKiAoZGF0YSkuCi0gICAgICogPHAvPgotICAgICAqCi0gICAgICogQHBhcmFtIGN0eAotICAgICAqIEByZXR1cm4gVFJVRSBpZiB0aGlzIG9iamVjdCBpcyBlcXVpdmFsZW50IHdpdGggdGhlIHNwZWNpZmllZCBvYmplY3QKLSAgICAgKiAgICAgICAgIHRoYXQgaXMsIGtleSBmaWVsZHMgbWF0Y2gKLSAgICAgKiAgICAgICAgIEZBTFNFLCBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VxdWl2YWxlbnQoU2VydmljZUNvbnRleHQgY3R4KSB7Ci0gICAgICAgIC8vIE5PVEU6IHRoZSBpbnB1dCBvYmplY3QgaXMgZXhwZWN0ZWQgdG8gZXhpc3QgKGllLCBiZSBub24tbnVsbCkKLQotICAgICAgICBpZiAoIXRoaXMuYXhpc1NlcnZpY2UuZXF1YWxzKGN0eC5nZXRBeGlzU2VydmljZSgpKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLQotICAgICAgICBFbmRwb2ludFJlZmVyZW5jZSB0YXJnZXRFUFIyID0gY3R4LmdldFRhcmdldEVQUigpOwotCi0gICAgICAgIGlmICgodGhpcy50YXJnZXRFUFIgIT0gbnVsbCkgJiYgKHRhcmdldEVQUjIgIT0gbnVsbCkpIHsKLSAgICAgICAgICAgIGlmICghdGhpcy50YXJnZXRFUFIuaXNFcXVpdmFsZW50KHRhcmdldEVQUjIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKCh0aGlzLnRhcmdldEVQUiA9PSBudWxsKSAmJiAodGFyZ2V0RVBSMiA9PSBudWxsKSkgewotICAgICAgICAgICAgLy8ga2VlcCBnb2luZwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gb25lIG9mIHRoZSBvYmplY3RzIGlzIG51bGwKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIEVuZHBvaW50UmVmZXJlbmNlIG15RVBSMiA9IGN0eC5nZXRNeUVQUigpOwotCi0gICAgICAgIGlmICgodGhpcy5teUVQUiAhPSBudWxsKSAmJiAobXlFUFIyICE9IG51bGwpKSB7Ci0gICAgICAgICAgICBpZiAoIXRoaXMubXlFUFIuaXNFcXVpdmFsZW50KG15RVBSMikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoKHRoaXMubXlFUFIgPT0gbnVsbCkgJiYgKG15RVBSMiA9PSBudWxsKSkgewotICAgICAgICAgICAgLy8ga2VlcCBnb2luZwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gb25lIG9mIHRoZSBvYmplY3RzIGlzIG51bGwKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFRPRE86IGNvbnNpZGVyIGNoZWNraW5nIHRoZSBwYXJlbnQgb2JqZWN0cyBmb3IgZXF1aXZhbGVuY3kKLQotICAgICAgICAvLyBUT0RPOiBjb25zaWRlciBjaGVja2luZyBmaWVsZHMgZnJvbSB0aGUgc3VwZXIgY2xhc3MgZm9yIGVxdWl2YWxlbmN5Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIElEIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG9iamVjdCBpbnN0YW5jZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gQSBzdHJpbmcgdGhhdCBjYW4gYmUgb3V0cHV0IHRvIGEgbG9nIGZpbGUgYXMgYW4gaWRlbnRpZmllcgotICAgICAqICAgICAgICAgZm9yIHRoaXMgb2JqZWN0IGluc3RhbmNlLiAgSXQgaXMgc3VpdGFibGUgZm9yIG1hdGNoaW5nIHJlbGF0ZWQgbG9nCi0gICAgICogICAgICAgICBlbnRyaWVzLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9nQ29ycmVsYXRpb25JRFN0cmluZygpIHsKLSAgICAgICAgaWYgKGxvZ0NvcnJlbGF0aW9uSURTdHJpbmcgPT0gbnVsbCkgewotICAgICAgICAgICAgbG9nQ29ycmVsYXRpb25JRFN0cmluZyA9IG15Q2xhc3NOYW1lICsgIkAiICsgVVVJREdlbmVyYXRvci5nZXRVVUlEKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGxvZ0NvcnJlbGF0aW9uSURTdHJpbmc7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBUcmFjZSBhIHdhcm5pbmcgbWVzc2FnZSwgaWYgbmVlZGVkLCBpbmRpY2F0aW5nIHRoYXQgdGhpcwotICAgICAqIG9iamVjdCBuZWVkcyB0byBiZSBhY3RpdmF0ZWQgYmVmb3JlIGFjY2Vzc2luZyBjZXJ0YWluIGZpZWxkcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXRob2RuYW1lIFRoZSBtZXRob2Qgd2hlcmUgdGhlIHdhcm5pbmcgb2NjdXJzCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrQWN0aXZhdGVXYXJuaW5nKFN0cmluZyBtZXRob2RuYW1lKSB7Ci0gICAgICAgIGlmIChuZWVkc1RvQmVSZWNvbmNpbGVkKSB7Ci0gICAgICAgICAgICBpZiAoTG9nZ2luZ0NvbnRyb2wuZGVidWdMb2dnaW5nQWxsb3dlZCAmJiBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhnZXRMb2dDb3JyZWxhdGlvbklEU3RyaW5nKCkrICI6IiArIG1ldGhvZG5hbWUgKyAiKCk6ICoqKipXQVJOSU5HKioqKiAiCi0gICAgICAgICAgICAgICAgICAgICAgICArIG15Q2xhc3NOYW1lICsgIi5hY3RpdmF0ZShjb25maWd1cmF0aW9uQ29udGV4dCkgbmVlZHMgdG8gYmUgaW52b2tlZC4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBDb25maWd1cmF0aW9uQ29udGV4dCBnZXRSb290Q29udGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIGNvbmZpZ0NvbnRleHQ7Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb250ZXh0L1NlcnZpY2VHcm91cENvbnRleHQuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb250ZXh0L1NlcnZpY2VHcm91cENvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGI4MjMyMy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY29udGV4dC9TZXJ2aWNlR3JvdXBDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MTYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY29udGV4dDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5VVUlER2VuZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5leHRlcm5hbGl6ZS5BY3RpdmF0ZVV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5leHRlcm5hbGl6ZS5FeHRlcm5hbGl6ZUNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuZXh0ZXJuYWxpemUuU2FmZU9iamVjdElucHV0U3RyZWFtOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5leHRlcm5hbGl6ZS5TYWZlT2JqZWN0T3V0cHV0U3RyZWFtOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5leHRlcm5hbGl6ZS5TYWZlU2VyaWFsaXphYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZUdyb3VwOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaTE4bi5NZXNzYWdlczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuTWV0YURhdGFFbnRyeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmEuaW8uRXh0ZXJuYWxpemFibGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0OwotaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1wdWJsaWMgY2xhc3MgU2VydmljZUdyb3VwQ29udGV4dCBleHRlbmRzIEFic3RyYWN0Q29udGV4dCAKLSAgICBpbXBsZW1lbnRzIEV4dGVybmFsaXphYmxlLCBTYWZlU2VyaWFsaXphYmxlIHsKLQotICAgIC8qCi0gICAgICogc2V0dXAgZm9yIGxvZ2dpbmcKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coU2VydmljZUdyb3VwQ29udGV4dC5jbGFzcyk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgbXlDbGFzc05hbWUgPSAiU2VydmljZUdyb3VwQ29udGV4dCI7Ci0KLSAgICAvKioKLSAgICAgKiBAc2VyaWFsIFRoZSBzZXJpYWxpemF0aW9uIHZlcnNpb24gSUQgdHJhY2tzIHRoZSB2ZXJzaW9uIG9mIHRoZSBjbGFzcy4KLSAgICAgKiBJZiBhIGNsYXNzIGRlZmluaXRpb24gY2hhbmdlcywgdGhlbiB0aGUgc2VyaWFsaXphdGlvbi9leHRlcm5hbGl6YXRpb24KLSAgICAgKiBvZiB0aGUgY2xhc3MgaXMgYWZmZWN0ZWQuIElmIGEgY2hhbmdlIHRvIHRoZSBjbGFzcyBpcyBtYWRlIHdoaWNoIGlzCi0gICAgICogbm90IGNvbXBhdGlibGUgd2l0aCB0aGUgc2VyaWFsaXphdGlvbi9leHRlcm5hbGl6YXRpb24gb2YgdGhlIGNsYXNzLAotICAgICAqIHRoZW4gdGhlIHNlcmlhbGl6YXRpb24gdmVyc2lvbiBJRCBzaG91bGQgYmUgdXBkYXRlZC4KLSAgICAgKiBSZWZlciB0byB0aGUgInNlcmlhbFZlciIgdXRpbGl0eSB0byBjb21wdXRlIGEgc2VyaWFsaXphdGlvbgotICAgICAqIHZlcnNpb24gSUQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gOTAxNDQ3MTE0NDQ3OTkyODg4NUw7Ci0KLSAgICAvKioKLSAgICAgKiBAc2VyaWFsIFRyYWNrcyB0aGUgcmV2aXNpb24gbGV2ZWwgb2YgYSBjbGFzcyB0byBpZGVudGlmeSBjaGFuZ2VzIHRvIHRoZQotICAgICAqIGNsYXNzIGRlZmluaXRpb24gdGhhdCBhcmUgY29tcGF0aWJsZSB0byBzZXJpYWxpemF0aW9uL2V4dGVybmFsaXphdGlvbi4KLSAgICAgKiBJZiBhIGNsYXNzIGRlZmluaXRpb24gY2hhbmdlcywgdGhlbiB0aGUgc2VyaWFsaXphdGlvbi9leHRlcm5hbGl6YXRpb24KLSAgICAgKiBvZiB0aGUgY2xhc3MgaXMgYWZmZWN0ZWQuCi0gICAgICogUmVmZXIgdG8gdGhlIHdyaXRlRXh0ZXJuYWwoKSBhbmQgcmVhZEV4dGVybmFsKCkgbWV0aG9kcy4KLSAgICAgKi8KLSAgICAvLyBzdXBwb3J0ZWQgcmV2aXNpb24gbGV2ZWxzLCBhZGQgYSBuZXcgbGV2ZWwgdG8gbWFuYWdlIGNvbXBhdGlibGUgY2hhbmdlcwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRVZJU0lPTl8yID0gMjsKLSAgICAvLyBjdXJyZW50IHJldmlzaW9uIGxldmVsIG9mIHRoaXMgb2JqZWN0Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IHJldmlzaW9uSUQgPSBSRVZJU0lPTl8yOwotCi0KLSAgICBwcml2YXRlIHRyYW5zaWVudCBBeGlzU2VydmljZUdyb3VwIGF4aXNTZXJ2aWNlR3JvdXA7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgaWQ7Ci0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBTZXJ2aWNlQ29udGV4dD4gc2VydmljZUNvbnRleHRNYXA7Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBNZXRhRGF0YSBmb3IgZGF0YSB0byBiZSByZXN0b3JlZCBpbiBhY3RpdmF0ZSBhZnRlciByZWFkRXh0ZXJuYWwKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKgotICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBtZXNzYWdlIGNvbnRleHQgaGFzIGJlZW4gcmVjb25zdGl0dXRlZAotICAgICAqIGFuZCBuZWVkcyB0byBoYXZlIGl0cyBvYmplY3QgcmVmZXJlbmNlcyByZWNvbmNpbGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSB0cmFuc2llbnQgYm9vbGVhbiBuZWVkc1RvQmVSZWNvbmNpbGVkID0gZmFsc2U7Ci0KLQotICAgIC8qKgotICAgICAqIFRoZSBBeGlzU2VydmljZUNvbnRleHQgbWV0YWRhdGEgd2lsbCBiZSB1c2VkIGR1cmluZwotICAgICAqIGFjdGl2YXRlIHRvIG1hdGNoIHVwIHdpdGggYW4gZXhpc3Rpbmcgb2JqZWN0Ci0gICAgICovCi0gICAgcHJpdmF0ZSB0cmFuc2llbnQgTWV0YURhdGFFbnRyeSBtZXRhQXhpc1NlcnZpY2VHcm91cCA9IG51bGw7Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBlbmQgTWV0YURhdGEgc2VjdGlvbgotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLy8gc2ltcGxlIGNvbnN0cnVjdG9yCi0gICAgcHVibGljIFNlcnZpY2VHcm91cENvbnRleHQoKSB7Ci0gICAgICAgIHN1cGVyKG51bGwpOwotICAgICAgICBzZXJ2aWNlQ29udGV4dE1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU2VydmljZUNvbnRleHQ+KCk7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgU2VydmljZUdyb3VwQ29udGV4dChDb25maWd1cmF0aW9uQ29udGV4dCBwYXJlbnQsIEF4aXNTZXJ2aWNlR3JvdXAgYXhpc1NlcnZpY2VHcm91cCkgewotICAgICAgICBzdXBlcihwYXJlbnQpOwotICAgICAgICB0aGlzLmF4aXNTZXJ2aWNlR3JvdXAgPSBheGlzU2VydmljZUdyb3VwOwotICAgICAgICBzZXJ2aWNlQ29udGV4dE1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU2VydmljZUNvbnRleHQ+KCk7Ci0gICAgICAgIC8vIGluaXRpYWxseSBzZXQgdGhlIGlkIHRvIHRoZSBheGlzU2VydmljZUdyb3VwCi0gICAgICAgIGlmIChheGlzU2VydmljZUdyb3VwICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNldElkKGF4aXNTZXJ2aWNlR3JvdXAuZ2V0U2VydmljZUdyb3VwTmFtZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBBeGlzU2VydmljZUdyb3VwIGdldERlc2NyaXB0aW9uKCkgewotICAgICAgICBjaGVja0FjdGl2YXRlV2FybmluZygiZ2V0RGVzY3JpcHRpb24iKTsKLSAgICAgICAgcmV0dXJuIGF4aXNTZXJ2aWNlR3JvdXA7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLSAgICAgICAgcmV0dXJuIGlkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgYSBzZXJ2aWNlIGNvbnRleHQuIENyZWF0ZXMgYSBuZXcgb25lIGZyb20gQXhpc1NlcnZpY2UuCi0gICAgICogVGhlcmUgaXMgbm8gbmVlZCB0byBzdG9yZSBzZXJ2aWNlIGNvbnRleHQgaW5zaWRlIHNlcnZpY2VHcm91cAotICAgICAqIGNvbnRleHQgYXMgd2VsbC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzZXJ2aWNlIHRoZSBBeGlzU2VydmljZSBmb3Igd2hpY2ggdG8gZ2V0IGEgY29udGV4dAotICAgICAqIEByZXR1cm4gUmV0dXJucyBTZXJ2aWNlQ29udGV4dC4KLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdCBpZiBzb21ldGhpbmcgZ29lcyB3cm9uZwotICAgICAqLwotICAgIHB1YmxpYyBTZXJ2aWNlQ29udGV4dCBnZXRTZXJ2aWNlQ29udGV4dChBeGlzU2VydmljZSBzZXJ2aWNlKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UgPSBheGlzU2VydmljZUdyb3VwLmdldFNlcnZpY2Uoc2VydmljZS5nZXROYW1lKCkpOwotICAgICAgICBpZiAoYXhpc1NlcnZpY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdChNZXNzYWdlcy5nZXRNZXNzYWdlKCJpbnZhbGlkc2VydmljZWluYWdyb3VwIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzU2VydmljZUdyb3VwLmdldFNlcnZpY2VHcm91cE5hbWUoKSkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzZXJ2aWNlQ29udGV4dE1hcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBzZXJ2aWNlQ29udGV4dE1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU2VydmljZUNvbnRleHQ+KCk7Ci0gICAgICAgIH0KLSAgICAgICAgU2VydmljZUNvbnRleHQgc2VydmljZUNvbnRleHQgPSAoU2VydmljZUNvbnRleHQpIHNlcnZpY2VDb250ZXh0TWFwLmdldChzZXJ2aWNlLmdldE5hbWUoKSk7Ci0gICAgICAgIGlmIChzZXJ2aWNlQ29udGV4dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBzZXJ2aWNlQ29udGV4dCA9IG5ldyBTZXJ2aWNlQ29udGV4dChzZXJ2aWNlLCB0aGlzKTsKLSAgICAgICAgICAgIGdldFJvb3RDb250ZXh0KCkuY29udGV4dENyZWF0ZWQoc2VydmljZUNvbnRleHQpOwotICAgICAgICAgICAgc2VydmljZUNvbnRleHRNYXAucHV0KHNlcnZpY2UuZ2V0TmFtZSgpLCBzZXJ2aWNlQ29udGV4dCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNlcnZpY2VDb250ZXh0OwotICAgIH0KLQotICAgIHB1YmxpYyBJdGVyYXRvcjxTZXJ2aWNlQ29udGV4dD4gZ2V0U2VydmljZUNvbnRleHRzKCkgewotICAgICAgICBpZiAoc2VydmljZUNvbnRleHRNYXAgPT0gbnVsbCkgewotICAgICAgICAgICAgc2VydmljZUNvbnRleHRNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFNlcnZpY2VDb250ZXh0PigpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzZXJ2aWNlQ29udGV4dE1hcC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzZXJ2aWNlQ29udGV4dE1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBpZCkgewotICAgICAgICB0aGlzLmlkID0gaWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyB0aGUgc3BlY2lmaWVkIHNlcnZpY2UgY29udGV4dCBvYmplY3QgdG8gdGhlCi0gICAgICogbGlzdHMgb2Ygc2VydmljZSBjb250ZXh0cyBmb3IgdGhpcyBzZXJ2aWNlIGdyb3VwCi0gICAgICogY29udGV4dC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzcnZjdHggVGhlIFNlcnZpY2VDb250ZXh0IG9iamVjdCB0byBhZGQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRTZXJ2aWNlQ29udGV4dChTZXJ2aWNlQ29udGV4dCBzcnZjdHgpIHsKLSAgICAgICAgaWYgKHNydmN0eCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBBeGlzU2VydmljZSBheGlzU2VydmljZSA9IHNydmN0eC5nZXRBeGlzU2VydmljZSgpOwotCi0gICAgICAgIGlmIChheGlzU2VydmljZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc2VydmljZUNvbnRleHRNYXAgPT0gbnVsbCkgewotICAgICAgICAgICAgc2VydmljZUNvbnRleHRNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFNlcnZpY2VDb250ZXh0PigpOwotICAgICAgICB9Ci0KLSAgICAgICAgc2VydmljZUNvbnRleHRNYXAucHV0KGF4aXNTZXJ2aWNlLmdldE5hbWUoKSwgc3J2Y3R4KTsKLQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogRmluZHMgdGhlIHNlcnZpY2UgY29udGV4dCBvYmplY3QgdGhhdCBjb3JyZXNwb25kcwotICAgICAqIHRvIHRoZSBzcGVjaWZpZWQgbmFtZSBmcm9tIHRoZSBsaXN0Ci0gICAgICogb2Ygc2VydmljZSBjb250ZXh0cyBmb3IgdGhpcyBzZXJ2aWNlIGdyb3VwCi0gICAgICogY29udGV4dC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGUgU2VydmljZUNvbnRleHQKLSAgICAgKiBAcmV0dXJuIFRoZSBTZXJ2aWNlQ29udGV4dCBhc3NvY2lhdGVkIHdpdGggdGhlIG5hbWUsCi0gICAgICogICAgICAgICBvciBudWxsLCBpZiBub25lIGNhbiBiZSBmb3VuZAotICAgICAqLwotICAgIHB1YmxpYyBTZXJ2aWNlQ29udGV4dCBmaW5kU2VydmljZUNvbnRleHQoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgaWYgKHNlcnZpY2VDb250ZXh0TWFwID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIChTZXJ2aWNlQ29udGV4dCkgc2VydmljZUNvbnRleHRNYXAuZ2V0KG5hbWUpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogRmluZHMgdGhlIHNlcnZpY2UgY29udGV4dCBvYmplY3QgdGhhdCBjb3JyZXNwb25kcwotICAgICAqIHRvIHRoZSBzcGVjaWZpZWQgQXhpc1NlcnZpY2UgZnJvbSB0aGUgbGlzdAotICAgICAqIG9mIHNlcnZpY2UgY29udGV4dHMgZm9yIHRoaXMgc2VydmljZSBncm91cAotICAgICAqIGNvbnRleHQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYXhpc1NydiB0aGUgQXhpc1NlcnZpY2Ugd2hvc2UgY29udGV4dCB3ZSdyZSBsb29raW5nIGZvcgotICAgICAqIEByZXR1cm4gVGhlIFNlcnZpY2VDb250ZXh0IGFzc29jaWF0ZWQgd2l0aCB0aGUgQXhpc1NlcnZpY2UKLSAgICAgKiAgICAgICAgIG9yIG51bGwsIGlmIG5vbmUgY2FuIGJlIGZvdW5kCi0gICAgICovCi0gICAgcHVibGljIFNlcnZpY2VDb250ZXh0IGZpbmRTZXJ2aWNlQ29udGV4dChBeGlzU2VydmljZSBheGlzU3J2KSB7Ci0gICAgICAgIGlmIChheGlzU3J2ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNlcnZpY2VDb250ZXh0TWFwID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIChTZXJ2aWNlQ29udGV4dCkgc2VydmljZUNvbnRleHRNYXAuZ2V0KGF4aXNTcnYuZ2V0TmFtZSgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHdpbGwgZG8gYSBjb3B5IG9mIHRoZSBwcm9wZXJ0aWVzIGZyb20gdGhpcyBjb250ZXh0IG9iamVjdAotICAgICAqIHRvIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBzcGVjaWZpZWQgY29udGV4dCBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgU2VydmljZUdyb3VwQ29udGV4dCBvYmplY3QgdG8gaG9sZCB0aGUgbWVyZ2VkIHByb3BlcnRpZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwdXRDb250ZXh0UHJvcGVydGllcyhTZXJ2aWNlR3JvdXBDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgaWYgKGNvbnRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gZ2V0IHRoZSBjdXJyZW50IHByb3BlcnRpZXMgb24gdGhpcyBjb250ZXh0IG9iamVjdAotICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wcyA9IGdldFByb3BlcnRpZXMoKTsKLQotICAgICAgICAgICAgLy8gY29weSB0aGVtIHRvIHRoZSBzcGVjaWZpZWQgY29udGV4dCBvYmplY3QKLSAgICAgICAgICAgIGNvbnRleHQubWVyZ2VQcm9wZXJ0aWVzKHByb3BzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICogRXh0ZXJuYWxpemFibGUgc3VwcG9ydAotICAgICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgKi8KLQotCi0gICAgLyoqCi0gICAgICogU2F2ZSB0aGUgY29udGVudHMgb2YgdGhpcyBvYmplY3QuCi0gICAgICogPHAvPgotICAgICAqIE5PVEU6IFRyYW5zaWVudCBmaWVsZHMgYW5kIHN0YXRpYyBmaWVsZHMgYXJlIG5vdCBzYXZlZC4KLSAgICAgKiBBbHNvLCBvYmplY3RzIHRoYXQgcmVwcmVzZW50ICJzdGF0aWMiIGRhdGEgYXJlCi0gICAgICogbm90IHNhdmVkLCBleGNlcHQgZm9yIGVub3VnaCBpbmZvcm1hdGlvbiB0byBiZQotICAgICAqIGFibGUgdG8gZmluZCBtYXRjaGluZyBvYmplY3RzIHdoZW4gdGhlIG1lc3NhZ2UKLSAgICAgKiBjb250ZXh0IGlzIHJlLWNvbnN0aXR1dGVkLgotICAgICAqCi0gICAgICogQHBhcmFtIG91dCBUaGUgc3RyZWFtIHRvIHdyaXRlIHRoZSBvYmplY3QgY29udGVudHMgdG8KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgd3JpdGVFeHRlcm5hbChPYmplY3RPdXRwdXQgbykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgU2FmZU9iamVjdE91dHB1dFN0cmVhbSBvdXQgPSBTYWZlT2JqZWN0T3V0cHV0U3RyZWFtLmluc3RhbGwobyk7Ci0gICAgICAgIC8vIHdyaXRlIG91dCBjb250ZW50cyBvZiB0aGlzIG9iamVjdAotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIGluIG9yZGVyIHRvIGhhbmRsZSBmdXR1cmUgY2hhbmdlcyB0byB0aGUgbWVzc2FnZSAKLSAgICAgICAgLy8gY29udGV4dCBkZWZpbml0aW9uLCBiZSBzdXJlIHRvIG1haW50YWluIHRoZSAKLSAgICAgICAgLy8gb2JqZWN0IGxldmVsIGlkZW50aWZpZXJzCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIHNlcmlhbGl6YXRpb24gdmVyc2lvbiBJRAotICAgICAgICBvdXQud3JpdGVMb25nKHNlcmlhbFZlcnNpb25VSUQpOwotCi0gICAgICAgIC8vIHJldmlzaW9uIElECi0gICAgICAgIG91dC53cml0ZUludChyZXZpc2lvbklEKTsKLQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyB2YXJpb3VzIHNpbXBsZSBmaWVsZHMKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICBvdXQud3JpdGVMb25nKGdldExhc3RUb3VjaGVkVGltZSgpKTsKLQotICAgICAgICBpZiAoaWQgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gZ2VuZXJhdGUgYW4gSUQgdG8gdXNlIHdoZW4gdGhpcyBvYmplY3QgaXMgcmVzdG9yZWQKLSAgICAgICAgICAgIGlkID0gVVVJREdlbmVyYXRvci5nZXRVVUlEKCk7Ci0gICAgICAgIH0KLSAgICAgICAgb3V0LndyaXRlT2JqZWN0KGlkKTsKLQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBwcm9wZXJ0aWVzCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIG91dC53cml0ZU1hcChnZXRQcm9wZXJ0aWVzKCkpOwotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIEF4aXNTZXJ2aWNlR3JvdXAKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgbWV0YUF4aXNTZXJ2aWNlR3JvdXAgPSBudWxsOwotICAgICAgICBpZiAoYXhpc1NlcnZpY2VHcm91cCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtZXRhQXhpc1NlcnZpY2VHcm91cCA9IG5ldyBNZXRhRGF0YUVudHJ5KGF4aXNTZXJ2aWNlR3JvdXAuZ2V0Q2xhc3MoKS5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlR3JvdXAuZ2V0U2VydmljZUdyb3VwTmFtZSgpKTsKLSAgICAgICAgfQotICAgICAgICBvdXQud3JpdGVPYmplY3QobWV0YUF4aXNTZXJ2aWNlR3JvdXApOwotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIHBhcmVudCAKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICAvLyB0aGUgcGFyZW50IGlzIHRoZSBDb25maWd1cmF0aW9uQ29udGV4dCBvYmplY3QsIHdoaWNoCi0gICAgICAgIC8vIGF0IHRoaXMgdGltZSwgaXMgbm90IGJlaW5nIHNhdmVkLgotICAgICAgICAvLyBpbnN0ZWFkLCB3ZSB3aWxsIG5lZWQgdG8gcmVnaXN0ZXIgdGhpcyBTZXJ2aWNlR3JvdXBPYmplY3QKLSAgICAgICAgLy8gd2l0aCB0aGUgZXhpc3RpbmcgQ29uZmlndXJhdGlvbkNvbnRleHQgb2JqZWN0IHdoZW4KLSAgICAgICAgLy8gdGhpcyBvYmplY3QgaXMgcmVjb25zdGl0dXRlZAotCi0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBSZXN0b3JlIHRoZSBjb250ZW50cyBvZiB0aGUgb2JqZWN0IHRoYXQgd2FzIHByZXZpb3VzbHkgc2F2ZWQuCi0gICAgICogPHAvPgotICAgICAqIE5PVEU6IFRoZSBmaWVsZCBkYXRhIG11c3QgcmVhZCBiYWNrIGluIHRoZSBzYW1lIG9yZGVyIGFuZCB0eXBlCi0gICAgICogYXMgaXQgd2FzIHdyaXR0ZW4uICBTb21lIGRhdGEgd2lsbCBuZWVkIHRvIGJlIHZhbGlkYXRlZCB3aGVuCi0gICAgICogcmVzdXJyZWN0ZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaW4gVGhlIHN0cmVhbSB0byByZWFkIHRoZSBvYmplY3QgY29udGVudHMgZnJvbQotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZWFkRXh0ZXJuYWwoT2JqZWN0SW5wdXQgaW5PYmplY3QpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIFNhZmVPYmplY3RJbnB1dFN0cmVhbSBpbiA9IFNhZmVPYmplY3RJbnB1dFN0cmVhbS5pbnN0YWxsKGluT2JqZWN0KTsKLSAgICAgICAgLy8gc2V0IHRoZSBmbGFnIHRvIGluZGljYXRlIHRoYXQgdGhlIG1lc3NhZ2UgY29udGV4dCBpcyBiZWluZwotICAgICAgICAvLyByZWNvbnN0aXR1dGVkIGFuZCB3aWxsIG5lZWQgdG8gaGF2ZSBjZXJ0YWluIG9iamVjdCByZWZlcmVuY2VzIAotICAgICAgICAvLyB0byBiZSByZWNvbmNpbGVkIHdpdGggdGhlIGN1cnJlbnQgZW5naW5lIHNldHVwCi0gICAgICAgIG5lZWRzVG9CZVJlY29uY2lsZWQgPSB0cnVlOwotCi0gICAgICAgIC8vIHRyYWNlIHBvaW50Ci0gICAgICAgIGlmIChsb2cuaXNUcmFjZUVuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLnRyYWNlKG15Q2xhc3NOYW1lICsgIjpyZWFkRXh0ZXJuYWwoKTogIEJFR0lOICBieXRlcyBhdmFpbGFibGUgaW4gc3RyZWFtIFsiICsKLSAgICAgICAgICAgICAgICAgICAgICBpbi5hdmFpbGFibGUoKSArICJdICAiKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHNlcmlhbGl6YXRpb24gdmVyc2lvbiBJRAotICAgICAgICBsb25nIHN1aWQgPSBpbi5yZWFkTG9uZygpOwotCi0gICAgICAgIC8vIHJldmlzaW9uIElECi0gICAgICAgIGludCByZXZJRCA9IGluLnJlYWRJbnQoKTsKLQotICAgICAgICAvLyBtYWtlIHN1cmUgdGhlIG9iamVjdCBkYXRhIGlzIGluIGEgdmVyc2lvbiB3ZSBjYW4gaGFuZGxlCi0gICAgICAgIGlmIChzdWlkICE9IHNlcmlhbFZlcnNpb25VSUQpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uKEV4dGVybmFsaXplQ29uc3RhbnRzLlVOU1VQUE9SVEVEX1NVSUQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gbWFrZSBzdXJlIHRoZSBvYmplY3QgZGF0YSBpcyBpbiBhIHJldmlzaW9uIGxldmVsIHdlIGNhbiBoYW5kbGUKLSAgICAgICAgaWYgKHJldklEICE9IFJFVklTSU9OXzIpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uKEV4dGVybmFsaXplQ29uc3RhbnRzLlVOU1VQUE9SVEVEX1JFVklEKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIHZhcmlvdXMgc2ltcGxlIGZpZWxkcwotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgIGxvbmcgdGltZSA9IGluLnJlYWRMb25nKCk7Ci0gICAgICAgIHNldExhc3RUb3VjaGVkVGltZSh0aW1lKTsKLSAgICAgICAgaWQgPSAoU3RyaW5nKSBpbi5yZWFkT2JqZWN0KCk7Ci0KLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gcHJvcGVydGllcwotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICBwcm9wZXJ0aWVzID0gaW4ucmVhZE1hcChuZXcgSGFzaE1hcFVwZGF0ZUxvY2thYmxlKCkpOwotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIEF4aXNTZXJ2aWNlR3JvdXAKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICAvLyBheGlzU2VydmljZUdyb3VwIGlzIG5vdCB1c2FibGUgdW50aWwgdGhlIG1ldGEgZGF0YSBoYXMgYmVlbiByZWNvbmNpbGVkCi0gICAgICAgIGF4aXNTZXJ2aWNlR3JvdXAgPSBudWxsOwotICAgICAgICBtZXRhQXhpc1NlcnZpY2VHcm91cCA9IChNZXRhRGF0YUVudHJ5KSBpbi5yZWFkT2JqZWN0KCk7Ci0KLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gcGFyZW50IAotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgIC8vIHRoZSBwYXJlbnQgaXMgdGhlIENvbmZpZ3VyYXRpb25Db250ZXh0IG9iamVjdCwgd2hpYwotICAgICAgICAvLyBhdCB0aGlzIHRpbWUsIGlzIG5vdCBiZWluZyBzYXZlZC4KLSAgICAgICAgLy8gaW5zdGVhZCwgd2Ugd2lsbCBuZWVkIHRvIHJlZ2lzdGVyIHRoaXMgU2VydmljZUdyb3VwT2JqZWN0Ci0gICAgICAgIC8vIHdpdGggdGhlIGV4aXN0aW5nIENvbmZpZ3VyYXRpb25Db250ZXh0IG9iamVjdCB3aGVuCi0gICAgICAgIC8vIHRoaXMgb2JqZWN0IGlzIHJlY29uc3RpdHV0ZWQKLQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBvdGhlcgotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICBzZXJ2aWNlQ29udGV4dE1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU2VydmljZUNvbnRleHQ+KCk7Ci0KLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gZG9uZQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBTb21lIHBhcnRzIG9mIHRoZSBvYmplY3QgcmVzdG9yZWQgZnJvbSB0aGUKLSAgICAgKiByZWFkRXh0ZXJuYWwgZGVzZXJpYWxpemF0aW9uIHdvcmsgY2Fubm90IGJlIGNvbXBsZXRlZCB1bnRpbAotICAgICAqIHdlIGhhdmUgYSBjb25maWd1cmF0aW9uQ29udGV4dC4gIFRoaXMgbWV0aG9kIGNoZWNrcyB0byBzZWUKLSAgICAgKiBpZiBhZGRpdGlvbmFsIHdvcmsgbmVlZHMgdG8gYmUgZG9uZSBpbiBvcmRlciB0byBjb21wbGV0ZQotICAgICAqIHRoZSBvYmplY3QgcmVjb25zdGl0dXRpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2MgdGhlIGFjdGl2ZSBDb25maWd1cmF0aW9uQ29udGV4dAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFjdGl2YXRlKENvbmZpZ3VyYXRpb25Db250ZXh0IGNjKSB7Ci0gICAgICAgIC8vIHNlZSBpZiB0aGVyZSdzIGFueSB3b3JrIHRvIGRvCi0gICAgICAgIGlmICghbmVlZHNUb0JlUmVjb25jaWxlZCkgewotICAgICAgICAgICAgLy8gcmV0dXJuIHF1aWNrCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBnZXQgdGhlIGF4aXMgY29uZmlndXJhdGlvbiAKLSAgICAgICAgQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZyA9IGNjLmdldEF4aXNDb25maWd1cmF0aW9uKCk7Ci0KLSAgICAgICAgLy8gV2UgcHJldmlvdXNseSBzYXZlZCBtZXRhQXhpc1NlcnZpY2VHcm91cDsgcmVzdG9yZSBpdAotICAgICAgICBpZiAobWV0YUF4aXNTZXJ2aWNlR3JvdXAgIT0gbnVsbCkgewotICAgICAgICAgICAgYXhpc1NlcnZpY2VHcm91cCA9IAotICAgICAgICAgICAgICAgIEFjdGl2YXRlVXRpbHMuZmluZFNlcnZpY2VHcm91cChheGlzQ29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhQXhpc1NlcnZpY2VHcm91cC5nZXRDbGFzc05hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YUF4aXNTZXJ2aWNlR3JvdXAuZ2V0UU5hbWVBc1N0cmluZygpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGF4aXNTZXJ2aWNlR3JvdXAgPSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gc2V0IHBhcmVudCAKLSAgICAgICAgdGhpcy5zZXRQYXJlbnQoY2MpOwotCi0gICAgICAgIC8vIHJlZ2lzdGVyIHdpdGggdGhlIHBhcmVudAotICAgICAgICBjYy5hZGRTZXJ2aWNlR3JvdXBDb250ZXh0SW50b1NvYXBTZXNzaW9uVGFibGUodGhpcyk7Ci0KLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIGRvbmUsIHJlc2V0IHRoZSBmbGFnCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICBuZWVkc1RvQmVSZWNvbmNpbGVkID0gZmFsc2U7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb21wYXJlcyBrZXkgcGFydHMgb2YgdGhlIHN0YXRlIGZyb20gdGhlIGN1cnJlbnQgaW5zdGFuY2Ugb2YKLSAgICAgKiB0aGlzIGNsYXNzIHdpdGggdGhlIHNwZWNpZmllZCBpbnN0YW5jZSB0byBzZWUgaWYgdGhleSBhcmUKLSAgICAgKiBlcXVpdmFsZW50LgotICAgICAqIDxwLz4KLSAgICAgKiBUaGlzIGRpZmZlcnMgZnJvbSB0aGUgamF2YS5sYW5nLk9iamVjdC5lcXVhbHMoKSBtZXRob2QgaW4KLSAgICAgKiB0aGF0IHRoZSBlcXVhbHMoKSBtZXRob2QgZ2VuZXJhbGx5IGxvb2tzIGF0IGJvdGggdGhlCi0gICAgICogb2JqZWN0IGlkZW50aXR5IChsb2NhdGlvbiBpbiBtZW1vcnkpIGFuZCB0aGUgb2JqZWN0IHN0YXRlCi0gICAgICogKGRhdGEpLgotICAgICAqIDxwLz4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjdHggVGhlIG9iamVjdCB0byBjb21wYXJlIHdpdGgKLSAgICAgKiBAcmV0dXJuIFRSVUUgaWYgdGhpcyBvYmplY3QgaXMgZXF1aXZhbGVudCB3aXRoIHRoZSBzcGVjaWZpZWQgb2JqZWN0Ci0gICAgICogICAgICAgICB0aGF0IGlzLCBrZXkgZmllbGRzIG1hdGNoCi0gICAgICogICAgICAgICBGQUxTRSwgb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNFcXVpdmFsZW50KFNlcnZpY2VHcm91cENvbnRleHQgY3R4KSB7Ci0gICAgICAgIC8vIE5PVEU6IHRoZSBpbnB1dCBvYmplY3QgaXMgZXhwZWN0ZWQgdG8gZXhpc3QgKGllLCBiZSBub24tbnVsbCkKLQotICAgICAgICBpZiAoIXRoaXMuYXhpc1NlcnZpY2VHcm91cC5lcXVhbHMoY3R4LmdldERlc2NyaXB0aW9uKCkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgY3R4aWQgPSBjdHguZ2V0SWQoKTsKLQotICAgICAgICBpZiAoKHRoaXMuaWQgIT0gbnVsbCkgJiYgKGN0eGlkICE9IG51bGwpKSB7Ci0gICAgICAgICAgICBpZiAoIXRoaXMuaWQuZXF1YWxzKGN0eGlkKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IGVsc2UgaWYgKCh0aGlzLmlkID09IG51bGwpICYmIChjdHhpZCA9PSBudWxsKSkgewotICAgICAgICAgICAgLy8ga2VlcCBnb2luZwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gbWlzbWF0Y2gKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFRPRE86IGNvbnNpZGVyIGNoZWNraW5nIHRoZSBwYXJlbnQgb2JqZWN0cyBmb3IgZXF1aXZhbGVuY3kKLQotICAgICAgICAvLyBUT0RPOiBjb25zaWRlciBjaGVja2luZyBmaWVsZHMgZnJvbSB0aGUgc3VwZXIgY2xhc3MgZm9yIGVxdWl2YWxlbmN5Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVHJhY2UgYSB3YXJuaW5nIG1lc3NhZ2UsIGlmIG5lZWRlZCwgaW5kaWNhdGluZyB0aGF0IHRoaXMKLSAgICAgKiBvYmplY3QgbmVlZHMgdG8gYmUgYWN0aXZhdGVkIGJlZm9yZSBhY2Nlc3NpbmcgY2VydGFpbiBmaWVsZHMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWV0aG9kbmFtZSBUaGUgbWV0aG9kIHdoZXJlIHRoZSB3YXJuaW5nIG9jY3VycwotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjaGVja0FjdGl2YXRlV2FybmluZyhTdHJpbmcgbWV0aG9kbmFtZSkgewotICAgICAgICBpZiAobmVlZHNUb0JlUmVjb25jaWxlZCkgewotICAgICAgICAgICAgbG9nLndhcm4obXlDbGFzc05hbWUgKyAiOiIgKyBtZXRob2RuYW1lICsgIigpOiAqKioqV0FSTklORyoqKiogIiArIG15Q2xhc3NOYW1lICsKLSAgICAgICAgICAgICAgICAgICAgICIuYWN0aXZhdGUoY29uZmlndXJhdGlvbkNvbnRleHQpIG5lZWRzIHRvIGJlIGludm9rZWQuIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29uZmlndXJhdGlvbkNvbnRleHQgZ2V0Um9vdENvbnRleHQoKSB7Ci0gICAgICAgIC8vcGFyZW50IG9mIHRoZSBTZXJ2aWNlR3JvdXBDb250ZXh0IGlzIHRoZSBDb25maWd1cmF0aW9uQ29udGV4dAotICAgICAgICByZXR1cm4gKENvbmZpZ3VyYXRpb25Db250ZXh0KSB0aGlzLmdldFBhcmVudCgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb250ZXh0L1Nlc3Npb25Db250ZXh0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY29udGV4dC9TZXNzaW9uQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGY5OGY3Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb250ZXh0L1Nlc3Npb25Db250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY29udGV4dDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5leHRlcm5hbGl6ZS5FeHRlcm5hbGl6ZUNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuZXh0ZXJuYWxpemUuU2FmZU9iamVjdElucHV0U3RyZWFtOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5leHRlcm5hbGl6ZS5TYWZlT2JqZWN0T3V0cHV0U3RyZWFtOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5leHRlcm5hbGl6ZS5TYWZlU2VyaWFsaXphYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0NvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuRGVwZW5kZW5jeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLmlvLkV4dGVybmFsaXphYmxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dDsKLWltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dDsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBBbGwgdGhlIGVuZ2luZSBjb21wb25lbnRzIGFyZSBzdGF0ZWxlc3MgYWNyb3NzIHRoZSBleGVjdXRpb25zIGFuZCBhbGwgdGhlIHN0YXRlcyBzaG91bGQgYmUga2VwdCBpbiB0aGUKLSAqIENvbnRleHRzLCB0aGVyZSBhcmUgdGhyZWUgY29udGV4dCBHbG9iYWwsIFNlc3Npb24gYW5kIE1lc3NhZ2UuCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXNzaW9uQ29udGV4dCBleHRlbmRzIEFic3RyYWN0Q29udGV4dCAKLSAgICBpbXBsZW1lbnRzIEV4dGVybmFsaXphYmxlLCBTYWZlU2VyaWFsaXphYmxlIHsKLQotICAgIC8qKgotICAgICAqIEBzZXJpYWwgVGhlIHNlcmlhbGl6YXRpb24gdmVyc2lvbiBJRCB0cmFja3MgdGhlIHZlcnNpb24gb2YgdGhlIGNsYXNzLgotICAgICAqIElmIGEgY2xhc3MgZGVmaW5pdGlvbiBjaGFuZ2VzLCB0aGVuIHRoZSBzZXJpYWxpemF0aW9uL2V4dGVybmFsaXphdGlvbgotICAgICAqIG9mIHRoZSBjbGFzcyBpcyBhZmZlY3RlZC4gSWYgYSBjaGFuZ2UgdG8gdGhlIGNsYXNzIGlzIG1hZGUgd2hpY2ggaXMKLSAgICAgKiBub3QgY29tcGF0aWJsZSB3aXRoIHRoZSBzZXJpYWxpemF0aW9uL2V4dGVybmFsaXphdGlvbiBvZiB0aGUgY2xhc3MsCi0gICAgICogdGhlbiB0aGUgc2VyaWFsaXphdGlvbiB2ZXJzaW9uIElEIHNob3VsZCBiZSB1cGRhdGVkLgotICAgICAqIFJlZmVyIHRvIHRoZSAic2VyaWFsVmVyIiB1dGlsaXR5IHRvIGNvbXB1dGUgYSBzZXJpYWxpemF0aW9uCi0gICAgICogdmVyc2lvbiBJRC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMTEwMDYxMDY3MzA2NzU2ODU1Nkw7Ci0KLSAgICAvKioKLSAgICAgKiBAc2VyaWFsIFRyYWNrcyB0aGUgcmV2aXNpb24gbGV2ZWwgb2YgYSBjbGFzcyB0byBpZGVudGlmeSBjaGFuZ2VzIHRvIHRoZQotICAgICAqIGNsYXNzIGRlZmluaXRpb24gdGhhdCBhcmUgY29tcGF0aWJsZSB0byBzZXJpYWxpemF0aW9uL2V4dGVybmFsaXphdGlvbi4KLSAgICAgKiBJZiBhIGNsYXNzIGRlZmluaXRpb24gY2hhbmdlcywgdGhlbiB0aGUgc2VyaWFsaXphdGlvbi9leHRlcm5hbGl6YXRpb24KLSAgICAgKiBvZiB0aGUgY2xhc3MgaXMgYWZmZWN0ZWQuCi0gICAgICogUmVmZXIgdG8gdGhlIHdyaXRlRXh0ZXJuYWwoKSBhbmQgcmVhZEV4dGVybmFsKCkgbWV0aG9kcy4KLSAgICAgKi8KLSAgICAvLyBzdXBwb3J0ZWQgcmV2aXNpb24gbGV2ZWxzLCBhZGQgYSBuZXcgbGV2ZWwgdG8gbWFuYWdlIGNvbXBhdGlibGUgY2hhbmdlcwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRVZJU0lPTl8yID0gMjsKLSAgICAvLyBjdXJyZW50IHJldmlzaW9uIGxldmVsIG9mIHRoaXMgb2JqZWN0Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IHJldmlzaW9uSUQgPSBSRVZJU0lPTl8yOwotCi0KLSAgICAvLyBUT0RPOiBpbnZlc3RpZ2F0ZSB3aGV0aGVyIHRoZXNlIGNvbGxlY3Rpb25zIG5lZWQgdG8gYmUgc2F2ZWQKLSAgICBwcml2YXRlIHRyYW5zaWVudCBNYXA8U3RyaW5nLCBTZXJ2aWNlQ29udGV4dD4gc2VydmljZUNvbnRleHRNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFNlcnZpY2VDb250ZXh0PigpOwotICAgIHByaXZhdGUgdHJhbnNpZW50IE1hcDxTdHJpbmcsIFNlcnZpY2VHcm91cENvbnRleHQ+IHNlcnZpY2VHcm91cENvbnRleHRNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFNlcnZpY2VHcm91cENvbnRleHQ+KCk7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBjb29raWVJRDsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhTZXNzaW9uQ29udGV4dC5jbGFzcyk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIG15Q2xhc3NOYW1lID0gIlNlc3Npb25Db250ZXh0IjsKLQotICAgIC8vIGN1cnJlbnQgdGltZSBvdXQgaW50ZXJ2YWwgaXMgMzAgc2Vjcy4gTmVlZCB0byBtYWtlIHRoaXMgY29uZmlndXJhYmxlCi0gICAgcHVibGljIGxvbmcgc2Vzc2lvbkNvbnRleHRUaW1lb3V0SW50ZXJ2YWwgPSAzMCAqIDEwMDA7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gcGFyZW50Ci0gICAgICovCi0gICAgcHVibGljIFNlc3Npb25Db250ZXh0KEFic3RyYWN0Q29udGV4dCBwYXJlbnQpIHsKLSAgICAgICAgc3VwZXIocGFyZW50KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2Vzc2lvbkNvbnRleHQoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaW5pdChBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlndXJhdGlvbikgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgfQotCi0gICAgcHVibGljIFNlcnZpY2VDb250ZXh0IGdldFNlcnZpY2VDb250ZXh0KEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlKSB7Ci0gICAgICAgIHJldHVybiAoU2VydmljZUNvbnRleHQpIHNlcnZpY2VDb250ZXh0TWFwLmdldChheGlzU2VydmljZS5nZXROYW1lKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFNlcnZpY2VDb250ZXh0KFNlcnZpY2VDb250ZXh0IHNlcnZpY2VDb250ZXh0KSB7Ci0gICAgICAgIHNlcnZpY2VDb250ZXh0TWFwLnB1dChzZXJ2aWNlQ29udGV4dC5nZXRBeGlzU2VydmljZSgpLmdldE5hbWUoKSwgc2VydmljZUNvbnRleHQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFNlcnZpY2VHcm91cENvbnRleHQoU2VydmljZUdyb3VwQ29udGV4dCBzZXJ2aWNlR3JvdXBDb250ZXh0KSB7Ci0gICAgICAgIFN0cmluZyBzZXJ2aWNlR3JvdXBJRCA9IHNlcnZpY2VHcm91cENvbnRleHQuZ2V0RGVzY3JpcHRpb24oKS5nZXRTZXJ2aWNlR3JvdXBOYW1lKCk7Ci0gICAgICAgIHNlcnZpY2VHcm91cENvbnRleHRNYXAucHV0KHNlcnZpY2VHcm91cElELCBzZXJ2aWNlR3JvdXBDb250ZXh0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2VydmljZUdyb3VwQ29udGV4dCBnZXRTZXJ2aWNlR3JvdXBDb250ZXh0KFN0cmluZyBzZXJ2aWNlR3JvdXBJRCkgewotICAgICAgICByZXR1cm4gKFNlcnZpY2VHcm91cENvbnRleHQpIHNlcnZpY2VHcm91cENvbnRleHRNYXAuZ2V0KHNlcnZpY2VHcm91cElEKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENvb2tpZUlEKCkgewotICAgICAgICByZXR1cm4gY29va2llSUQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q29va2llSUQoU3RyaW5nIGNvb2tpZUlEKSB7Ci0gICAgICAgIHRoaXMuY29va2llSUQgPSBjb29raWVJRDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXJ2aWNlQ29udGV4dCBhbmQgU2VydmljZUdyb3VwQ29udGV4dCBhcmUgbm90IGdldHRpbmcgYXV0b21hdGljYWxseSBnYXJiYWdlIGNvbGxlY3RpYmxlLiBBbmQgdGhlcmUKLSAgICAgKiBpcyBubyBzcGVjaWZpYyB3YXkgZm9yIHNvbWUgb25lIHRvIGdvIGFuZCBtYWtlIGl0IGdhcmJhZ2UgY29sbGVjdGFibGUuCi0gICAgICogU28gdGhlIGN1cnJlbnQgc29sdXRpb24gaXMgdG8gbWFrZSB0aGVtIHRpbWUgb3V0LiBTbyB0aGUgbG9naWMgaXMgdGhhdCwgdGhlcmUgaXMgYSB0aW1lciB0YXNrCi0gICAgICogaW4gZWFjaCBhbmQgZXZlcnkgc2VydmljZSBncm91cCB3aGljaCB3aWxsIGNoZWNrIGZvciB0aGUgbGFzdCB0b3VjaGVkIHRpbWUuIEFuZCBpZiBpdCBoYXMgbm90Ci0gICAgICogYmVlbiB0b3VjaGVkIGZvciBzb21lIHRpbWUsIHRoZSB0aW1lciB0YXNrIHdpbGwgcmVtb3ZlIGl0IGZyb20gdGhlIG1lbW9yeS4KLSAgICAgKiBUaGUgdG91Y2hpbmcgbG9naWMgaGFwcGVucyBsaWtlIHRoaXMuIFdoZW5ldmVyIHRoZXJlIGlzIGEgY2FsbCB0byBhZGRNZXNzYWdlQ29udGV4dCBpbiB0aGUgb3BlcmF0aW9uQ29udGV4dAotICAgICAqIGl0IHdpbGwgZ28gYW5kIHVwZGF0ZSBvcGVyYXRpb25DT250ZXh0IC0+IHNlcnZpY2VDb250ZXh0IC0+IHNlcnZpY2VHcm91cENvbnRleHQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdG91Y2goKSB7Ci0gICAgICAgIGxhc3RUb3VjaGVkVGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpOwotICAgICAgICBpZiAocGFyZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHBhcmVudC50b3VjaCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGxvbmcgZ2V0TGFzdFRvdWNoZWRUaW1lKCkgewotICAgICAgICByZXR1cm4gbGFzdFRvdWNoZWRUaW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBJdGVyYXRvcjxTZXJ2aWNlR3JvdXBDb250ZXh0PiBnZXRTZXJ2aWNlR3JvdXBDb250ZXh0KCkgewotICAgICAgICBpZiAoc2VydmljZUdyb3VwQ29udGV4dE1hcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoc2VydmljZUdyb3VwQ29udGV4dE1hcC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlR3JvdXBDb250ZXh0TWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIHN1cGVyLmZpbmFsaXplKCk7Ci0gICAgICAgIGlmIChzZXJ2aWNlR3JvdXBDb250ZXh0TWFwICE9IG51bGwgJiYgIXNlcnZpY2VHcm91cENvbnRleHRNYXAuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBJdGVyYXRvcjxTZXJ2aWNlR3JvdXBDb250ZXh0PiB2YWx1c2UgPSBzZXJ2aWNlR3JvdXBDb250ZXh0TWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB3aGlsZSAodmFsdXNlLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIFNlcnZpY2VHcm91cENvbnRleHQgc2VydmljZUdyb3VwQ29udGV4dCA9IChTZXJ2aWNlR3JvdXBDb250ZXh0KSB2YWx1c2UubmV4dCgpOwotICAgICAgICAgICAgICAgIGNsZWFudXBTZXJ2aWNlQ29udGV4dGVzKHNlcnZpY2VHcm91cENvbnRleHQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNsZWFudXBTZXJ2aWNlQ29udGV4dGVzKFNlcnZpY2VHcm91cENvbnRleHQgc2VydmljZUdyb3VwQ29udGV4dCkgewotICAgICAgICBJdGVyYXRvcjxTZXJ2aWNlQ29udGV4dD4gc2VydmljZUNvbnRlY3h0ZXMgPSBzZXJ2aWNlR3JvdXBDb250ZXh0LmdldFNlcnZpY2VDb250ZXh0cygpOwotICAgICAgICB3aGlsZSAoc2VydmljZUNvbnRlY3h0ZXMuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBTZXJ2aWNlQ29udGV4dCBzZXJ2aWNlQ29udGV4dCA9IChTZXJ2aWNlQ29udGV4dCkgc2VydmljZUNvbnRlY3h0ZXMubmV4dCgpOwotICAgICAgICAgICAgRGVwZW5kZW5jeU1hbmFnZXIuZGVzdHJveVNlcnZpY2VPYmplY3Qoc2VydmljZUNvbnRleHQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgKiBFeHRlcm5hbGl6YWJsZSBzdXBwb3J0Ci0gICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAqLwotCi0gICAgLyoqCi0gICAgICogU2F2ZSB0aGUgY29udGVudHMgb2YgdGhpcyBvYmplY3QuCi0gICAgICogPHAvPgotICAgICAqIE5PVEU6IFRyYW5zaWVudCBmaWVsZHMgYW5kIHN0YXRpYyBmaWVsZHMgYXJlIG5vdCBzYXZlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvIFRoZSBzdHJlYW0gdG8gd3JpdGUgdGhlIG9iamVjdCBjb250ZW50cyB0bwotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUV4dGVybmFsKE9iamVjdE91dHB1dCBvKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBTYWZlT2JqZWN0T3V0cHV0U3RyZWFtIG91dCA9IFNhZmVPYmplY3RPdXRwdXRTdHJlYW0uaW5zdGFsbChvKTsKLSAgICAgICAgLy8gd3JpdGUgb3V0IGNvbnRlbnRzIG9mIHRoaXMgb2JqZWN0Ci0KLSAgICAgICAgLy8gTk9URVM6IEZvciBlYWNoIGl0ZW0sIHdoZXJlIGFwcHJvcHJpYXRlLAotICAgICAgICAvLyAgICAgICAgd3JpdGUgb3V0IHRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb24sIElOIE9SREVSOgotICAgICAgICAvLyAgICAgICAgICAgdGhlIGNsYXNzIG5hbWUKLSAgICAgICAgLy8gICAgICAgICAgIHRoZSBhY3RpdmUgb3IgZW1wdHkgZmxhZwotICAgICAgICAvLyAgICAgICAgICAgdGhlIGRhdGEgbGVuZ3RoLCBpZiBhcHByb3ByaWF0ZQotICAgICAgICAvLyAgICAgICAgICAgdGhlIGRhdGEgICAKLQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBpbiBvcmRlciB0byBoYW5kbGUgZnV0dXJlIGNoYW5nZXMgdG8gdGhlIG1lc3NhZ2UgCi0gICAgICAgIC8vIGNvbnRleHQgZGVmaW5pdGlvbiwgYmUgc3VyZSB0byBtYWludGFpbiB0aGUgCi0gICAgICAgIC8vIG9iamVjdCBsZXZlbCBpZGVudGlmaWVycwotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBzZXJpYWxpemF0aW9uIHZlcnNpb24gSUQKLSAgICAgICAgb3V0LndyaXRlTG9uZyhzZXJpYWxWZXJzaW9uVUlEKTsKLQotICAgICAgICAvLyByZXZpc2lvbiBJRAotICAgICAgICBvdXQud3JpdGVJbnQocmV2aXNpb25JRCk7Ci0KLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gdmFyaW91cyBzaW1wbGUgZmllbGRzCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIG91dC53cml0ZUxvbmcoZ2V0TGFzdFRvdWNoZWRUaW1lKCkpOwotCi0gICAgICAgIG91dC53cml0ZUxvbmcoc2Vzc2lvbkNvbnRleHRUaW1lb3V0SW50ZXJ2YWwpOwotICAgICAgICBvdXQud3JpdGVPYmplY3QoY29va2llSUQpOwotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIHByb3BlcnRpZXMKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgb3V0LndyaXRlTWFwKGdldFByb3BlcnRpZXMoKSk7Ci0KLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gIm5lc3RlZCIKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgb3V0LndyaXRlT2JqZWN0KHBhcmVudCk7Ci0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFJlc3RvcmUgdGhlIGNvbnRlbnRzIG9mIHRoZSBNZXNzYWdlQ29udGV4dCB0aGF0IHdhcwotICAgICAqIHByZXZpb3VzbHkgc2F2ZWQuCi0gICAgICogPHAvPgotICAgICAqIE5PVEU6IFRoZSBmaWVsZCBkYXRhIG11c3QgcmVhZCBiYWNrIGluIHRoZSBzYW1lIG9yZGVyIGFuZCB0eXBlCi0gICAgICogYXMgaXQgd2FzIHdyaXR0ZW4uICBTb21lIGRhdGEgd2lsbCBuZWVkIHRvIGJlIHZhbGlkYXRlZCB3aGVuCi0gICAgICogcmVzdXJyZWN0ZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaW4gVGhlIHN0cmVhbSB0byByZWFkIHRoZSBvYmplY3QgY29udGVudHMgZnJvbQotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZWFkRXh0ZXJuYWwoT2JqZWN0SW5wdXQgaW5PYmplY3QpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIFNhZmVPYmplY3RJbnB1dFN0cmVhbSBpbiA9IFNhZmVPYmplY3RJbnB1dFN0cmVhbS5pbnN0YWxsKGluT2JqZWN0KTsKLSAgICAgICAgLy8gdHJhY2UgcG9pbnQKLSAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cudHJhY2UobXlDbGFzc05hbWUgKyAiOnJlYWRFeHRlcm5hbCgpOiAgQkVHSU4gIGJ5dGVzIGF2YWlsYWJsZSBpbiBzdHJlYW0gWyIgKwotICAgICAgICAgICAgICAgICAgICBpbi5hdmFpbGFibGUoKSArICJdICAiKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHNlcmlhbGl6YXRpb24gdmVyc2lvbiBJRAotICAgICAgICBsb25nIHN1aWQgPSBpbi5yZWFkTG9uZygpOwotCi0gICAgICAgIC8vIHJldmlzaW9uIElECi0gICAgICAgIGludCByZXZJRCA9IGluLnJlYWRJbnQoKTsKLQotICAgICAgICAvLyBtYWtlIHN1cmUgdGhlIG9iamVjdCBkYXRhIGlzIGluIGEgdmVyc2lvbiB3ZSBjYW4gaGFuZGxlCi0gICAgICAgIGlmIChzdWlkICE9IHNlcmlhbFZlcnNpb25VSUQpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uKEV4dGVybmFsaXplQ29uc3RhbnRzLlVOU1VQUE9SVEVEX1NVSUQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gbWFrZSBzdXJlIHRoZSBvYmplY3QgZGF0YSBpcyBpbiBhIHJldmlzaW9uIGxldmVsIHdlIGNhbiBoYW5kbGUKLSAgICAgICAgaWYgKHJldklEICE9IFJFVklTSU9OXzIpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uKEV4dGVybmFsaXplQ29uc3RhbnRzLlVOU1VQUE9SVEVEX1JFVklEKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIHZhcmlvdXMgc2ltcGxlIGZpZWxkcwotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICBsb25nIHRpbWUgPSBpbi5yZWFkTG9uZygpOwotICAgICAgICBzZXRMYXN0VG91Y2hlZFRpbWUodGltZSk7Ci0KLSAgICAgICAgc2Vzc2lvbkNvbnRleHRUaW1lb3V0SW50ZXJ2YWwgPSBpbi5yZWFkTG9uZygpOwotICAgICAgICBjb29raWVJRCA9IChTdHJpbmcpIGluLnJlYWRPYmplY3QoKTsKLQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBwcm9wZXJ0aWVzCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIHByb3BlcnRpZXMgPSBpbi5yZWFkTWFwKG5ldyBIYXNoTWFwVXBkYXRlTG9ja2FibGUoKSk7Ci0KLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gIm5lc3RlZCIKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICAvLyBwYXJlbnQKLSAgICAgICAgcGFyZW50ID0gKEFic3RyYWN0Q29udGV4dCkgaW4ucmVhZE9iamVjdCgpOwotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIGRvbmUKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICBzZXJ2aWNlQ29udGV4dE1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU2VydmljZUNvbnRleHQ+KCk7Ci0gICAgICAgIHNlcnZpY2VHcm91cENvbnRleHRNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFNlcnZpY2VHcm91cENvbnRleHQ+KCk7Ci0gICAgfQotCi0gICAgcHVibGljIENvbmZpZ3VyYXRpb25Db250ZXh0IGdldFJvb3RDb250ZXh0KCkgewotICAgICAgICAvLyBTZXNzaW9uIENvbnRleHQgZG9lcyBub3QgbGl2ZSB3aXRoaW4gdGhlIGhpZXJhcmNoeQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvbnRleHQvZXh0ZXJuYWxpemUvQWN0aXZhdGVVdGlscy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvbnRleHQvZXh0ZXJuYWxpemUvQWN0aXZhdGVVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2VkY2ZlLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb250ZXh0L2V4dGVybmFsaXplL0FjdGl2YXRlVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuZXh0ZXJuYWxpemU7DQotDQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc01lc3NhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZUdyb3VwOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlRyYW5zcG9ydEluRGVzY3JpcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5IYW5kbGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5UcmFuc3BvcnRMaXN0ZW5lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMQ29uc3RhbnRzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotDQotLyoqDQotICogU29tZSBFeHRlcm5hbGl6ZSBvYmplY3RzIG11c3QgYmUgImFjdGl2YXRlZCIgYWZ0ZXIgdGhleSBhcmUgcmVhZC4NCi0gKiBBY3RpdmF0aW9uIG5vcm1hbGx5IGludm9sdmVzIGFzc29jaWF0aW5nIHRoZSBvYmplY3Qgd2l0aCBvYmplY3RzIGluIHRoZSBjdXJyZW50DQotICogcnVudGltZS4NCi0gKiANCi0gKiBBY3RpdmF0ZVV0aWxzIHByb3ZpZGVzIGFjdGl2YXRpb24gcmVsYXRlZCB1dGlsaXRpZXMNCi0gKi8NCi1wdWJsaWMgY2xhc3MgQWN0aXZhdGVVdGlscyB7DQotICAgIA0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coQWN0aXZhdGVVdGlscy5jbGFzcyk7DQotICAgIA0KLSAgICAvKioNCi0gICAgICogUHJpdmF0ZSBDb25zdHJ1Y3Rvcg0KLSAgICAgKiBBbGwgbWV0aG9kcyBpbiBBY3RpdmF0ZVV0aWxzIGFyZSBzdGF0aWMuDQotICAgICAqLw0KLSAgICBwcml2YXRlIEFjdGl2YXRlVXRpbHMoKSB7fQ0KLQ0KLSAgICAvKioNCi0gICAgICogRmluZCB0aGUgQXhpc1NlcnZpY2VHcm91cCBvYmplY3QgdGhhdCBtYXRjaGVzIHRoZSBjcml0ZXJpYQ0KLSAgICAgKiA8cC8+DQotICAgICAqIDxCPk5vdGU8Qj4gdGhlIHNhdmVkIHNlcnZpY2UgZ3JvdXAgbWV0YSBpbmZvcm1hdGlvbiBtYXkgbm90DQotICAgICAqIG1hdGNoIHVwIHdpdGggYW55IG9mIHRoZSBzZXJ2aWNlR3JvdXBzIHRoYXQNCi0gICAgICogYXJlIGluIHRoZSBjdXJyZW50IEF4aXNDb25maWd1cmF0aW9uIG9iamVjdC4NCi0gICAgICogDQotICAgICAqIEBwYXJhbSBheGlzQ29uZmlnIFRoZSBBeGlzQ29uZmlndXJhdGlvbiBvYmplY3QNCi0gICAgICogQHBhcmFtIHNlcnZpY2VHcnBDbGFzc05hbWUgdGhlIGNsYXNzIG5hbWUgc3RyaW5nIGZvciB0aGUgdGFyZ2V0IG9iamVjdA0KLSAgICAgKiAgICAgICAgICAgICAgICAgICAoY291bGQgYmUgYSBkZXJpdmVkIGNsYXNzKQ0KLSAgICAgKiBAcGFyYW0gc2VydmljZUdycE5hbWUgICAgICB0aGUgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNlcnZpY2UgZ3JvdXANCi0gICAgICogQHJldHVybiB0aGUgQXhpc1NlcnZpY2VHcm91cCBvYmplY3QgdGhhdCBtYXRjaGVzIHRoZSBjcml0ZXJpYQ0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyBBeGlzU2VydmljZUdyb3VwIGZpbmRTZXJ2aWNlR3JvdXAoQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNlcnZpY2VHcnBDbGFzc05hbWUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZXJ2aWNlR3JwTmFtZSkgew0KLSAgICAgICAgSXRlcmF0b3IgaXRzID0gYXhpc0NvbmZpZy5nZXRTZXJ2aWNlR3JvdXBzKCk7DQotDQotICAgICAgICB3aGlsZSAoaXRzLmhhc05leHQoKSkgew0KLSAgICAgICAgICAgIEF4aXNTZXJ2aWNlR3JvdXAgc2VydmljZUdyb3VwID0gKEF4aXNTZXJ2aWNlR3JvdXApIGl0cy5uZXh0KCk7DQotDQotICAgICAgICAgICAgU3RyaW5nIHRtcFNHQ2xhc3NOYW1lID0gc2VydmljZUdyb3VwLmdldENsYXNzKCkuZ2V0TmFtZSgpOw0KLSAgICAgICAgICAgIFN0cmluZyB0bXBTR05hbWUgPSBzZXJ2aWNlR3JvdXAuZ2V0U2VydmljZUdyb3VwTmFtZSgpOw0KLQ0KLSAgICAgICAgICAgIGlmICh0bXBTR0NsYXNzTmFtZS5lcXVhbHMoc2VydmljZUdycENsYXNzTmFtZSkpIHsNCi0gICAgICAgICAgICAgICAgYm9vbGVhbiBmb3VuZCA9IGZhbHNlOw0KLQ0KLSAgICAgICAgICAgICAgICAvLyB0aGUgc2VydmljZUdyb3VwTmFtZSBjYW4gYmUgbnVsbCwgc28gZWl0aGVyIGJvdGggdGhlIA0KLSAgICAgICAgICAgICAgICAvLyBzZXJ2aWNlIGdyb3VwIG5hbWVzIGFyZSBudWxsIG9yIHRoZXkgbWF0Y2gNCi0gICAgICAgICAgICAgICAgaWYgKCh0bXBTR05hbWUgPT0gbnVsbCkgJiYgKHNlcnZpY2VHcnBOYW1lID09IG51bGwpKSB7DQotICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7DQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKHRtcFNHTmFtZSAhPSBudWxsKSAmJiAodG1wU0dOYW1lLmVxdWFscyhzZXJ2aWNlR3JwTmFtZSkpKSB7DQotICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgaWYgKGZvdW5kKSB7DQotICAgICAgICAgICAgICAgICAgICAvLyB0cmFjZSBwb2ludA0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLnRyYWNlKCJPYmplY3RTdGF0ZVV0aWxzOmZpbmRTZXJ2aWNlR3JvdXAoKTogcmV0dXJuaW5nICBbIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzZXJ2aWNlR3JwQ2xhc3NOYW1lICsgIl0gICBbIiArIHNlcnZpY2VHcnBOYW1lICsgIl0iKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlR3JvdXA7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICAvLyB0cmFjZSBwb2ludA0KLSAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgbG9nLnRyYWNlKCJPYmplY3RTdGF0ZVV0aWxzOmZpbmRTZXJ2aWNlR3JvdXAoKTogWyIgKyBzZXJ2aWNlR3JwQ2xhc3NOYW1lICsgIl0gICBbIg0KLSAgICAgICAgICAgICAgICAgICAgKyBzZXJ2aWNlR3JwTmFtZSArICJdICByZXR1cm5pbmcgIFtudWxsXSIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBGaW5kIHRoZSBBeGlzU2VydmljZSBvYmplY3QgdGhhdCBtYXRjaGVzIHRoZSBjcml0ZXJpYQ0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGF4aXNDb25maWcgVGhlIEF4aXNDb25maWd1cmF0aW9uIG9iamVjdA0KLSAgICAgKiBAcGFyYW0gc2VydmljZUNsYXNzTmFtZSB0aGUgY2xhc3MgbmFtZSBzdHJpbmcgZm9yIHRoZSB0YXJnZXQgb2JqZWN0DQotICAgICAqICAgICAgICAgICAgICAgICAgIChjb3VsZCBiZSBhIGRlcml2ZWQgY2xhc3MpDQotICAgICAqIEBwYXJhbSBzZXJ2aWNlTmFtZSAgICAgIHRoZSBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2VydmljZQ0KLSAgICAgKiBAcmV0dXJuIHRoZSBBeGlzU2VydmljZSBvYmplY3QgdGhhdCBtYXRjaGVzIHRoZSBjcml0ZXJpYQ0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyBBeGlzU2VydmljZSBmaW5kU2VydmljZShBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlnLCBTdHJpbmcgc2VydmljZUNsYXNzTmFtZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2VydmljZU5hbWUpIHsNCi0gICAgICAgIEhhc2hNYXAgc2VydmljZXMgPSBheGlzQ29uZmlnLmdldFNlcnZpY2VzKCk7DQotDQotICAgICAgICBJdGVyYXRvciBpdHMgPSBzZXJ2aWNlcy52YWx1ZXMoKS5pdGVyYXRvcigpOw0KLQ0KLSAgICAgICAgd2hpbGUgKGl0cy5oYXNOZXh0KCkpIHsNCi0gICAgICAgICAgICBBeGlzU2VydmljZSBzZXJ2aWNlID0gKEF4aXNTZXJ2aWNlKSBpdHMubmV4dCgpOw0KLQ0KLSAgICAgICAgICAgIFN0cmluZyB0bXBTZXJ2Q2xhc3NOYW1lID0gc2VydmljZS5nZXRDbGFzcygpLmdldE5hbWUoKTsNCi0gICAgICAgICAgICBTdHJpbmcgdG1wU2Vydk5hbWUgPSBzZXJ2aWNlLmdldE5hbWUoKTsNCi0NCi0gICAgICAgICAgICBpZiAoKHRtcFNlcnZDbGFzc05hbWUuZXF1YWxzKHNlcnZpY2VDbGFzc05hbWUpKSAmJiAodG1wU2Vydk5hbWUuZXF1YWxzKHNlcnZpY2VOYW1lKSkpIHsNCi0gICAgICAgICAgICAgICAgLy8gdHJhY2UgcG9pbnQNCi0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgICAgICAgICBsb2cudHJhY2UoIk9iamVjdFN0YXRlVXRpbHM6ZmluZFNlcnZpY2UoKTogcmV0dXJuaW5nICBbIiArIHNlcnZpY2VDbGFzc05hbWUNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiXSAgIFsiICsgc2VydmljZU5hbWUgKyAiXSIpOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vIHRyYWNlIHBvaW50DQotICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICBsb2cudHJhY2UoIk9iamVjdFN0YXRlVXRpbHM6ZmluZFNlcnZpY2UoKTogWyIgKyBzZXJ2aWNlQ2xhc3NOYW1lICsgIl0gICBbIg0KLSAgICAgICAgICAgICAgICAgICAgKyBzZXJ2aWNlTmFtZSArICJdICByZXR1cm5pbmcgIFtudWxsXSIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBGaW5kIHRoZSBBeGlzT3BlcmF0aW9uIG9iamVjdCB0aGF0IG1hdGNoZXMgdGhlIGNyaXRlcmlhDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gYXhpc0NvbmZpZyBUaGUgQXhpc0NvbmZpZ3VyYXRpb24gb2JqZWN0DQotICAgICAqIEBwYXJhbSBvcENsYXNzTmFtZSB0aGUgY2xhc3MgbmFtZSBzdHJpbmcgZm9yIHRoZSB0YXJnZXQgb2JqZWN0DQotICAgICAqICAgICAgICAgICAgICAgICAgIChjb3VsZCBiZSBhIGRlcml2ZWQgY2xhc3MpDQotICAgICAqIEBwYXJhbSBvcFFOYW1lICAgIHRoZSBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGUgb3BlcmF0aW9uDQotICAgICAqIEByZXR1cm4gdGhlIEF4aXNPcGVyYXRpb24gb2JqZWN0IHRoYXQgbWF0Y2hlcyB0aGUgZ2l2ZW4gY3JpdGVyaWENCi0gICAgICovDQotICAgIHB1YmxpYyBzdGF0aWMgQXhpc09wZXJhdGlvbiBmaW5kT3BlcmF0aW9uKEF4aXNDb25maWd1cmF0aW9uIGF4aXNDb25maWcsIFN0cmluZyBvcENsYXNzTmFtZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUU5hbWUgb3BRTmFtZSkgew0KLSAgICAgICAgSGFzaE1hcCBzZXJ2aWNlcyA9IGF4aXNDb25maWcuZ2V0U2VydmljZXMoKTsNCi0NCi0gICAgICAgIEl0ZXJhdG9yIGl0cyA9IHNlcnZpY2VzLnZhbHVlcygpLml0ZXJhdG9yKCk7DQotDQotICAgICAgICB3aGlsZSAoaXRzLmhhc05leHQoKSkgew0KLSAgICAgICAgICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2UgPSAoQXhpc1NlcnZpY2UpIGl0cy5uZXh0KCk7DQotDQotICAgICAgICAgICAgSXRlcmF0b3IgaXRvID0gc2VydmljZS5nZXRPcGVyYXRpb25zKCk7DQotDQotICAgICAgICAgICAgd2hpbGUgKGl0by5oYXNOZXh0KCkpIHsNCi0gICAgICAgICAgICAgICAgQXhpc09wZXJhdGlvbiBvcGVyYXRpb24gPSAoQXhpc09wZXJhdGlvbikgaXRvLm5leHQoKTsNCi0NCi0gICAgICAgICAgICAgICAgU3RyaW5nIHRtcE9wTmFtZSA9IG9wZXJhdGlvbi5nZXRDbGFzcygpLmdldE5hbWUoKTsNCi0gICAgICAgICAgICAgICAgUU5hbWUgdG1wT3BRTmFtZSA9IG9wZXJhdGlvbi5nZXROYW1lKCk7DQotDQotICAgICAgICAgICAgICAgIGlmICgodG1wT3BOYW1lLmVxdWFscyhvcENsYXNzTmFtZSkpICYmICh0bXBPcFFOYW1lLmVxdWFscyhvcFFOYW1lKSkpIHsNCi0gICAgICAgICAgICAgICAgICAgIC8vIHRyYWNlIHBvaW50DQotICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBsb2cudHJhY2UoIk9iamVjdFN0YXRlVXRpbHM6ZmluZE9wZXJhdGlvbihheGlzQ2ZnKTogcmV0dXJuaW5nICBbIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBvcENsYXNzTmFtZSArICJdICAgWyIgKyBvcFFOYW1lLnRvU3RyaW5nKCkgKyAiXSIpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9wZXJhdGlvbjsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vIHRyYWNlIHBvaW50DQotICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICBsb2cudHJhY2UoIk9iamVjdFN0YXRlVXRpbHM6ZmluZE9wZXJhdGlvbihheGlzQ2ZnKTogWyIgKyBvcENsYXNzTmFtZSArICJdICAgWyINCi0gICAgICAgICAgICAgICAgICAgICsgb3BRTmFtZS50b1N0cmluZygpICsgIl0gIHJldHVybmluZyAgW251bGxdIik7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLQ0KLSAgICAvKioNCi0gICAgICogRmluZCB0aGUgQXhpc09wZXJhdGlvbiBvYmplY3QgdGhhdCBtYXRjaGVzIHRoZSBjcml0ZXJpYQ0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIHNlcnZpY2UgICAgVGhlIEF4aXNTZXJ2aWNlIG9iamVjdA0KLSAgICAgKiBAcGFyYW0gb3BDbGFzc05hbWUgVGhlIGNsYXNzIG5hbWUgc3RyaW5nIGZvciB0aGUgdGFyZ2V0IG9iamVjdA0KLSAgICAgKiAgICAgICAgICAgICAgICAgICAoY291bGQgYmUgYSBkZXJpdmVkIGNsYXNzKQ0KLSAgICAgKiBAcGFyYW0gb3BRTmFtZSAgICB0aGUgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhlIG9wZXJhdGlvbg0KLSAgICAgKiBAcmV0dXJuIHRoZSBBeGlzT3BlcmF0aW9uIG9iamVjdCB0aGF0IG1hdGNoZXMgdGhlIGdpdmVuIGNyaXRlcmlhDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIEF4aXNPcGVyYXRpb24gZmluZE9wZXJhdGlvbihBeGlzU2VydmljZSBzZXJ2aWNlLCBTdHJpbmcgb3BDbGFzc05hbWUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFOYW1lIG9wUU5hbWUpIHsNCi0gICAgICAgIGlmIChzZXJ2aWNlID09IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIEl0ZXJhdG9yIGl0byA9IHNlcnZpY2UuZ2V0T3BlcmF0aW9ucygpOw0KLQ0KLSAgICAgICAgLy8gUHJldmlvdXMgdmVyc2lvbnMgb2YgQXhpczIgZGlkbid0IHVzZSBhIG5hbWVzcGFjZSBvbiB0aGUgb3BlcmF0aW9uIG5hbWUsIHNvIHRoZXkgd291bGRuJ3QNCi0gICAgICAgIC8vIGhhdmUgZXh0ZXJuYWxpemVkIGEgbmFtZXNwYWNlLiAgSWYgdGhhdCdzIHRoZSBjYXNlLCBvbmx5IGNvbXBhcmUgdGhlIGxvY2FsUGFydCBvZiB0aGUNCi0gICAgICAgIC8vIG9wZXJhdGlvbiBuYW1lDQotICAgICAgICBTdHJpbmcgbmFtZXNwYWNlID0gb3BRTmFtZS5nZXROYW1lc3BhY2VVUkkoKTsNCi0gICAgICAgIGJvb2xlYW4gaWdub3JlTmFtZXNwYWNlID0gZmFsc2U7DQotICAgICAgICBpZiAobmFtZXNwYWNlID09IG51bGwgfHwgIiIuZXF1YWxzKG5hbWVzcGFjZSkpIHsNCi0gICAgICAgICAgICBpZ25vcmVOYW1lc3BhY2UgPSB0cnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICB3aGlsZSAoaXRvLmhhc05leHQoKSkgew0KLSAgICAgICAgICAgIEF4aXNPcGVyYXRpb24gb3BlcmF0aW9uID0gKEF4aXNPcGVyYXRpb24pIGl0by5uZXh0KCk7DQotDQotICAgICAgICAgICAgU3RyaW5nIHRtcE9wTmFtZSA9IG9wZXJhdGlvbi5nZXRDbGFzcygpLmdldE5hbWUoKTsNCi0gICAgICAgICAgICBRTmFtZSB0bXBPcFFOYW1lID0gb3BlcmF0aW9uLmdldE5hbWUoKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBpZiAoKHRtcE9wTmFtZS5lcXVhbHMob3BDbGFzc05hbWUpKSAmJiANCi0gICAgICAgICAgICAgICAgKChpZ25vcmVOYW1lc3BhY2UgJiYgKHRtcE9wUU5hbWUuZ2V0TG9jYWxQYXJ0KCkuZXF1YWxzKG9wUU5hbWUuZ2V0TG9jYWxQYXJ0KCkpKSB8fCAodG1wT3BRTmFtZS5lcXVhbHMob3BRTmFtZSkpKSkpIHsNCi0NCi0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgICAgICAgICBsb2cudHJhY2UoIk9iamVjdFN0YXRlVXRpbHM6ZmluZE9wZXJhdGlvbihzZXJ2aWNlKTogaWdub3JlTmFtZXNwYWNlIFsiICsgaWdub3JlTmFtZXNwYWNlDQotICAgICAgICAgICAgICAgICAgICAJCSsgIl0gcmV0dXJuaW5nICBbIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG9wQ2xhc3NOYW1lICsgIl0gICBbIiArIG9wUU5hbWUudG9TdHJpbmcoKSArICJdIik7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgcmV0dXJuIG9wZXJhdGlvbjsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICAvLyB0cmFjZSBwb2ludA0KLSAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgbG9nLnRyYWNlKCJPYmplY3RTdGF0ZVV0aWxzOmZpbmRPcGVyYXRpb24oc2VydmljZSk6IGlnbm9yZU5hbWVzcGFjZSBbIiArIGlnbm9yZU5hbWVzcGFjZQ0KLSAgICAgICAgICAgICAgICAgICAgKyAiIGNsYXNzbmFtZSBbIiArIG9wQ2xhc3NOYW1lICsgIl0gIFFOYW1lIFsiDQotICAgICAgICAgICAgICAgICAgICArIG9wUU5hbWUudG9TdHJpbmcoKSArICJdICByZXR1cm5pbmcgIFtudWxsXSIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIEZpbmQgdGhlIEF4aXNNZXNzYWdlIG9iamVjdCB0aGF0IG1hdGNoZXMgdGhlIGNyaXRlcmlhDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gb3AgICAgICAgICAgICAgVGhlIEF4aXNPcGVyYXRpb24gb2JqZWN0DQotICAgICAqIEBwYXJhbSBtc2dOYW1lICAgICAgICBUaGUgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhlIG1lc3NhZ2UNCi0gICAgICogQHBhcmFtIG1zZ0VsZW1lbnROYW1lIFRoZSBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWVzc2FnZSBlbGVtZW50DQotICAgICAqIEByZXR1cm4gdGhlIEF4aXNNZXNzYWdlIG9iamVjdCB0aGF0IG1hdGNoZXMgdGhlIGdpdmVuIGNyaXRlcmlhDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIEF4aXNNZXNzYWdlIGZpbmRNZXNzYWdlKEF4aXNPcGVyYXRpb24gb3AsIFN0cmluZyBtc2dOYW1lLCBTdHJpbmcgbXNnRWxlbWVudE5hbWUpIHsNCi0gICAgICAgIC8vIFNldmVyYWwga2luZHMgb2YgQXhpc01lc3NhZ2VzIGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggYSBwYXJ0aWN1bGFyIA0KLSAgICAgICAgLy8gQXhpc09wZXJhdGlvbi4gIFRoZSBraW5kcyBvZiBBeGlzTWVzc2FnZXMgdGhhdCBhcmUgdHlwaWNhbGx5DQotICAgICAgICAvLyBhY2Nlc3NpYmxlIGFyZSBhc3NvY2lhdGVkIHdpdGggImluIiBhbmQgIm91dCIuICANCi0gICAgICAgIC8vIFRoZXJlIGFyZSBhbHNvIGRpZmZlcmVudCBraW5kcyBvZiBBeGlzT3BlcmF0aW9ucywgYW5kIGVhY2gNCi0gICAgICAgIC8vIHR5cGUgb2YgQXhpc09wZXJhdGlvbiBjYW4gaGF2ZSBpdHMgb3duIG1peCBvZiBBeGlzTWVzc2FnZXMNCi0gICAgICAgIC8vIGRlcGVuZGluZyBvbiB0aGUgc3R5bGUgb2YgbWVzc2FnZSBleGNoYW5nZSBwYXR0ZXJuIChtZXApDQotDQotICAgICAgICBpZiAob3AgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIC8vIHRyYWNlIHBvaW50DQotICAgICAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgICAgIGxvZy50cmFjZSgiT2JqZWN0U3RhdGVVdGlsczpmaW5kTWVzc2FnZSgpOiBbIiArIG1zZ05hbWUgKyAiXSAgWyIgKyBtc2dFbGVtZW50TmFtZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICsgIl0gcmV0dXJuaW5nICBbbnVsbF0gLSBubyBBeGlzT3BlcmF0aW9uIik7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKG1zZ05hbWUgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gbWF0Y2ggd2l0aCwgZXhwZWN0IHRvIG1hdGNoIGFnYWluc3QgYSBuYW1lDQotICAgICAgICAgICAgLy8gdHJhY2UgcG9pbnQNCi0gICAgICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICAgICAgbG9nLnRyYWNlKCJPYmplY3RTdGF0ZVV0aWxzOmZpbmRNZXNzYWdlKCk6IFsiICsgbXNnTmFtZSArICJdICBbIiArIG1zZ0VsZW1lbnROYW1lDQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiXSByZXR1cm5pbmcgIFtudWxsXSAtIG1lc3NhZ2UgbmFtZSBpcyBub3Qgc2V0Iik7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLQ0KLSAgICAgICAgU3RyaW5nIHRtcE5hbWUgPSBudWxsOw0KLSAgICAgICAgU3RyaW5nIHRtcEVsZW1lbnROYW1lID0gbnVsbDsNCi0NCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSAgICAgICAgLy8gZmlyc3QgdHJ5IHRoZSAib3V0IiBtZXNzYWdlDQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0gICAgICAgIEF4aXNNZXNzYWdlIG91dCA9IG51bGw7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIG91dCA9IG9wLmdldE1lc3NhZ2UoV1NETENvbnN0YW50cy5NRVNTQUdFX0xBQkVMX09VVF9WQUxVRSk7DQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsNCi0gICAgICAgICAgICAvLyBqdXN0IGFic29yYiB0aGUgZXhjZXB0aW9uDQotICAgICAgICB9DQotDQotICAgICAgICBpZiAob3V0ICE9IG51bGwpIHsNCi0gICAgICAgICAgICB0bXBOYW1lID0gb3V0LmdldE5hbWUoKTsNCi0NCi0gICAgICAgICAgICBRTmFtZSB0bXBRb3V0ID0gb3V0LmdldEVsZW1lbnRRTmFtZSgpOw0KLSAgICAgICAgICAgIGlmICh0bXBRb3V0ICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgdG1wRWxlbWVudE5hbWUgPSB0bXBRb3V0LnRvU3RyaW5nKCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy8gY2hlY2sgdGhlIGNyaXRlcmlhIGZvciBhIG1hdGNoDQotDQotICAgICAgICBib29sZWFuIG1hdGNoaW5nID0gbWF0Y2hNZXNzYWdlTmFtZXModG1wTmFtZSwgdG1wRWxlbWVudE5hbWUsIG1zZ05hbWUsIG1zZ0VsZW1lbnROYW1lKTsNCi0NCi0gICAgICAgIGlmIChtYXRjaGluZykgew0KLSAgICAgICAgICAgIC8vIHRyYWNlIHBvaW50DQotICAgICAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgICAgIGxvZy50cmFjZSgiT2JqZWN0U3RhdGVVdGlsczpmaW5kTWVzc2FnZSgpOiByZXR1cm5pbmcgT1VUIG1lc3NhZ2UgIFsiICsgbXNnTmFtZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICsgIl0gIFsiICsgbXNnRWxlbWVudE5hbWUgKyAiXSAiKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgcmV0dXJuIG91dDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSAgICAgICAgLy8gbmV4dCwgdHJ5IHRoZSAiaW4iIG1lc3NhZ2UgDQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0gICAgICAgIEF4aXNNZXNzYWdlIGluID0gbnVsbDsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgaW4gPSBvcC5nZXRNZXNzYWdlKFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9JTl9WQUxVRSk7DQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsNCi0gICAgICAgICAgICAvLyBqdXN0IGFic29yYiB0aGUgZXhjZXB0aW9uDQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoaW4gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHRtcE5hbWUgPSBpbi5nZXROYW1lKCk7DQotDQotICAgICAgICAgICAgUU5hbWUgdG1wUWluID0gaW4uZ2V0RWxlbWVudFFOYW1lKCk7DQotICAgICAgICAgICAgaWYgKHRtcFFpbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgIHRtcEVsZW1lbnROYW1lID0gdG1wUWluLnRvU3RyaW5nKCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICB0bXBOYW1lID0gbnVsbDsNCi0gICAgICAgICAgICB0bXBFbGVtZW50TmFtZSA9IG51bGw7DQotICAgICAgICB9DQotDQotICAgICAgICAvLyBjaGVjayB0aGUgY3JpdGVyaWEgZm9yIGEgbWF0Y2gNCi0NCi0gICAgICAgIG1hdGNoaW5nID0gbWF0Y2hNZXNzYWdlTmFtZXModG1wTmFtZSwgdG1wRWxlbWVudE5hbWUsIG1zZ05hbWUsIG1zZ0VsZW1lbnROYW1lKTsNCi0NCi0gICAgICAgIGlmIChtYXRjaGluZykgew0KLSAgICAgICAgICAgIC8vIHRyYWNlIHBvaW50DQotICAgICAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgICAgIGxvZy50cmFjZSgiT2JqZWN0U3RhdGVVdGlsczpmaW5kTWVzc2FnZSgpOiByZXR1cm5pbmcgSU4gbWVzc2FnZSBbIiArIG1zZ05hbWUNCi0gICAgICAgICAgICAgICAgICAgICAgICArICJdICBbIiArIG1zZ0VsZW1lbnROYW1lICsgIl0gIik7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHJldHVybiBpbjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vIGlmIHdlIGdvdCBoZXJlLCB0aGVuIG5vIG1hdGNoIHdhcyBmb3VuZA0KLQ0KLSAgICAgICAgLy8gdHJhY2UgcG9pbnQNCi0gICAgICAgIGlmIChsb2cuaXNUcmFjZUVuYWJsZWQoKSkgew0KLSAgICAgICAgICAgIGxvZy50cmFjZSgiT2JqZWN0U3RhdGVVdGlsczpmaW5kTWVzc2FnZSgpOiBbIiArIG1zZ05hbWUgKyAiXSAgWyIgKyBtc2dFbGVtZW50TmFtZQ0KLSAgICAgICAgICAgICAgICAgICAgKyAiXSByZXR1cm5pbmcgIFtudWxsXSIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBGaW5kIHRoZSBIYW5kbGVyIG9iamVjdCB0aGF0IG1hdGNoZXMgdGhlIGNyaXRlcmlhDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gZXhpc3RpbmdIYW5kbGVycyBUaGUgbGlzdCBvZiBleGlzdGluZyBoYW5kbGVycyBhbmQgcGhhc2VzDQotICAgICAqIEBwYXJhbSBoYW5kbGVyQ2xhc3NOYW1lIHRoZSBjbGFzcyBuYW1lIHN0cmluZyBmb3IgdGhlIHRhcmdldCBvYmplY3QNCi0gICAgICogICAgICAgICAgICAgICAgICAgKGNvdWxkIGJlIGEgZGVyaXZlZCBjbGFzcykNCi0gICAgICogQHJldHVybiB0aGUgSGFuZGxlciBvYmplY3QgdGhhdCBtYXRjaGVzIHRoZSBjcml0ZXJpYQ0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgZmluZEhhbmRsZXIoTGlzdDxIYW5kbGVyPiBleGlzdGluZ0hhbmRsZXJzLCBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpIC8vU3RyaW5nIGhhbmRsZXJDbGFzc05hbWUpDQotICAgIHsNCi0NCi0gICAgICAgIFN0cmluZyB0aXRsZSA9ICJPYmplY3RTdGF0ZVV0aWxzOmZpbmRIYW5kbGVyKCk6ICI7DQotDQotICAgICAgICBTdHJpbmcgaGFuZGxlckNsYXNzTmFtZSA9IG1ldGFEYXRhRW50cnkuZ2V0Q2xhc3NOYW1lKCk7DQotICAgICAgICBTdHJpbmcgcU5hbWVBc1N0cmluZyA9IG1ldGFEYXRhRW50cnkuZ2V0UU5hbWVBc1N0cmluZygpOw0KLQ0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleGlzdGluZ0hhbmRsZXJzLnNpemUoKTsgaSsrKSB7DQotICAgICAgICAgICAgaWYgKGV4aXN0aW5nSGFuZGxlcnMuZ2V0KGkpICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgU3RyaW5nIHRtcENsYXNzTmFtZSA9IGV4aXN0aW5nSGFuZGxlcnMuZ2V0KGkpLmdldENsYXNzKCkuZ2V0TmFtZSgpOw0KLSAgICAgICAgICAgICAgICBTdHJpbmcgdG1wTmFtZSA9ICgoSGFuZGxlcikgZXhpc3RpbmdIYW5kbGVycy5nZXQoaSkpLmdldE5hbWUoKS50b1N0cmluZygpOw0KLQ0KLSAgICAgICAgICAgICAgICBpZiAoKHRtcENsYXNzTmFtZS5lcXVhbHMoaGFuZGxlckNsYXNzTmFtZSkpICYmICh0bXBOYW1lLmVxdWFscyhxTmFtZUFzU3RyaW5nKSkpIHsNCi0gICAgICAgICAgICAgICAgICAgIC8vIHRyYWNlIHBvaW50DQotICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBsb2cudHJhY2UodGl0bGUgKyAiIFsiICsgaGFuZGxlckNsYXNzTmFtZSArICJdICBuYW1lIFsiICsgcU5hbWVBc1N0cmluZw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiXSAgcmV0dXJuZWQiKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAoSGFuZGxlcikgKGV4aXN0aW5nSGFuZGxlcnMuZ2V0KGkpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vIHRyYWNlIHBvaW50DQotICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICBsb2cudHJhY2UodGl0bGUgKyAiIFsiICsgaGFuZGxlckNsYXNzTmFtZSArICJdICBuYW1lIFsiICsgcU5hbWVBc1N0cmluZw0KLSAgICAgICAgICAgICAgICAgICAgKyAiXSB3YXMgbm90IGZvdW5kIGluIHRoZSBleGlzdGluZ0hhbmRsZXJzIGxpc3QiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogRmluZCB0aGUgVHJhbnNwb3J0TGlzdGVuZXIgb2JqZWN0IHRoYXQgbWF0Y2hlcyB0aGUgY3JpdGVyaWENCi0gICAgICogPHAvPg0KLSAgICAgKiA8Qj5Ob3RlPEI+IHRoZSBzYXZlZCBtZXRhIGluZm9ybWF0aW9uIG1heSBub3QNCi0gICAgICogbWF0Y2ggdXAgd2l0aCBhbnkgb2YgdGhlIG9iamVjdHMgdGhhdA0KLSAgICAgKiBhcmUgaW4gdGhlIGN1cnJlbnQgQXhpc0NvbmZpZ3VyYXRpb24gb2JqZWN0Lg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGF4aXNDb25maWcgVGhlIEF4aXNDb25maWd1cmF0aW9uIG9iamVjdA0KLSAgICAgKiBAcGFyYW0gbGlzdGVuZXJDbGFzc05hbWUgdGhlIGNsYXNzIG5hbWUgc3RyaW5nIGZvciB0aGUgdGFyZ2V0IG9iamVjdA0KLSAgICAgKiAgICAgICAgICAgICAgICAgICAoY291bGQgYmUgYSBkZXJpdmVkIGNsYXNzKQ0KLSAgICAgKiBAcmV0dXJuIHRoZSBUcmFuc3BvcnRMaXN0ZW5lciBvYmplY3QgdGhhdCBtYXRjaGVzIHRoZSBjcml0ZXJpYQ0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyBUcmFuc3BvcnRMaXN0ZW5lciBmaW5kVHJhbnNwb3J0TGlzdGVuZXIoQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxpc3RlbmVyQ2xhc3NOYW1lKSB7DQotICAgICAgICAvLyBUT0RPOiBpbnZlc3RpZ2F0ZSBhIGJldHRlciB0ZWNobmlxdWUgdG8gbWF0Y2ggdXAgd2l0aCBhIFRyYW5zcG9ydExpc3RlbmVyDQotDQotICAgICAgICBIYXNoTWFwIHRyYW5zcG9ydHNJbiA9IGF4aXNDb25maWcuZ2V0VHJhbnNwb3J0c0luKCk7DQotDQotICAgICAgICAvLyBnZXQgYSBjb2xsZWN0aW9uIG9mIHRoZSB2YWx1ZXMgaW4gdGhlIG1hcA0KLSAgICAgICAgQ29sbGVjdGlvbiB2YWx1ZXMgPSB0cmFuc3BvcnRzSW4udmFsdWVzKCk7DQotDQotICAgICAgICBJdGVyYXRvciBpID0gdmFsdWVzLml0ZXJhdG9yKCk7DQotDQotICAgICAgICB3aGlsZSAoaS5oYXNOZXh0KCkpIHsNCi0gICAgICAgICAgICBUcmFuc3BvcnRJbkRlc2NyaXB0aW9uIHRpID0gKFRyYW5zcG9ydEluRGVzY3JpcHRpb24pIGkubmV4dCgpOw0KLQ0KLSAgICAgICAgICAgIFRyYW5zcG9ydExpc3RlbmVyIHRsID0gdGkuZ2V0UmVjZWl2ZXIoKTsNCi0gICAgICAgICAgICBTdHJpbmcgdGxDbGFzc05hbWUgPSB0bC5nZXRDbGFzcygpLmdldE5hbWUoKTsNCi0NCi0gICAgICAgICAgICBpZiAodGxDbGFzc05hbWUuZXF1YWxzKGxpc3RlbmVyQ2xhc3NOYW1lKSkgew0KLSAgICAgICAgICAgICAgICAvLyB0cmFjZSBwb2ludA0KLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIGxvZy50cmFjZSgiT2JqZWN0U3RhdGVVdGlsczpmaW5kVHJhbnNwb3J0TGlzdGVuZXIoKTogIFsiICsgbGlzdGVuZXJDbGFzc05hbWUNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiXSAgcmV0dXJuZWQiKTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICByZXR1cm4gdGw7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy8gdHJhY2UgcG9pbnQNCi0gICAgICAgIGlmIChsb2cuaXNUcmFjZUVuYWJsZWQoKSkgew0KLSAgICAgICAgICAgIGxvZy50cmFjZSgiT2JqZWN0U3RhdGVVdGlsczpmaW5kVHJhbnNwb3J0TGlzdGVuZXIoKTogcmV0dXJuaW5nICBbbnVsbF0iKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBDb21wYXJlcyB0aGUgdHdvIGNvbGxlY3Rpb25zIHRvIHNlZSBpZiB0aGV5IGFyZSBlcXVpdmFsZW50Lg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGExICBUaGUgZmlyc3QgY29sbGVjdGlvbg0KLSAgICAgKiBAcGFyYW0gYTIgIFRoZSBzZWNvbmQgY29sbGVjdGlvbg0KLSAgICAgKiBAcGFyYW0gc3RyaWN0ICBJbmRpY2F0ZXMgd2hldGhlciBzdHJpY3QgY2hlY2tpbmcgaXMgcmVxdWlyZWQuICBTdHJpY3QNCi0gICAgICogICAgICAgICAgICAgICAgY2hlY2tpbmcgbWVhbnMgdGhhdCB0aGUgdHdvIGNvbGxlY3Rpb25zIG11c3QgaGF2ZSB0aGUNCi0gICAgICogICAgICAgICAgICAgICAgc2FtZSBlbGVtZW50cyBpbiB0aGUgc2FtZSBvcmRlci4gIE5vbi1zdHJpY3QgY2hlY2tpbmcNCi0gICAgICogICAgICAgICAgICAgICAgbWVhbnMgdGhhdCB0aGUgdHdvIGNvbGxlY3Rpb25zIG11c3QgaGF2ZSB0aGUgc2FtZSANCi0gICAgICogICAgICAgICAgICAgICAgZWxlbWVudHMsIGJ1dCB0aGUgb3JkZXIgaXMgbm90IHNpZ25pZmljYW50Lg0KLSAgICAgKiBAcmV0dXJuIFRSVUUgaWYgdGhlIHR3byBjb2xsZWN0aW9ucyBhcmUgZXF1aXZhbGVudA0KLSAgICAgKiAgICAgICAgIEZBTFNFLCBvdGhlcndpc2UNCi0gICAgICovDQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0VxdWl2YWxlbnQoQXJyYXlMaXN0IGExLCBBcnJheUxpc3QgYTIsIGJvb2xlYW4gc3RyaWN0KSB7DQotICAgICAgICBpZiAoKGExICE9IG51bGwpICYmIChhMiAhPSBudWxsKSkgew0KLSAgICAgICAgICAgIC8vIGNoZWNrIG51bWJlciBvZiBlbGVtZW50cyBpbiBsaXN0cw0KLSAgICAgICAgICAgIGludCBzaXplMSA9IGExLnNpemUoKTsNCi0gICAgICAgICAgICBpbnQgc2l6ZTIgPSBhMi5zaXplKCk7DQotDQotICAgICAgICAgICAgaWYgKHNpemUxICE9IHNpemUyKSB7DQotICAgICAgICAgICAgICAgIC8vIHRyYWNlIHBvaW50DQotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNUcmFjZUVuYWJsZWQoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgbG9nLnRyYWNlKCJPYmplY3RTdGF0ZVV0aWxzOmlzRXF1aXZhbGVudChBcnJheUxpc3QsQXJyYXlMaXN0KTogRkFMU0UgLSBzaXplIG1pc21hdGNoIFsiDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc2l6ZTEgKyAiXSAhPSBbIiArIHNpemUyICsgIl0iKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGlmIChzdHJpY3QpIHsNCi0gICAgICAgICAgICAgICAgLy8gU3RyaWN0IGNoZWNraW5nDQotICAgICAgICAgICAgICAgIC8vIFRoZSBsaXN0cyBtdXN0IGNvbnRhaW4gdGhlIHNhbWUgZWxlbWVudHMgaW4gdGhlIHNhbWUgb3JkZXIuDQotICAgICAgICAgICAgICAgIHJldHVybiAoYTEuZXF1YWxzKGEyKSk7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgLy8gTm9uLXN0cmljdCBjaGVja2luZw0KLSAgICAgICAgICAgICAgICAvLyBUaGUgbGlzdHMgbXVzdCBjb250YWluIHRoZSBzYW1lIGVsZW1lbnRzIGJ1dCB0aGUgb3JkZXIgaXMgbm90IHJlcXVpcmVkLg0KLSAgICAgICAgICAgICAgICBJdGVyYXRvciBpMSA9IGExLml0ZXJhdG9yKCk7DQotDQotICAgICAgICAgICAgICAgIHdoaWxlIChpMS5oYXNOZXh0KCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIE9iamVjdCBvYmoxID0gaTEubmV4dCgpOw0KLQ0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFhMi5jb250YWlucyhvYmoxKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRyYWNlIHBvaW50DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy50cmFjZSgiT2JqZWN0U3RhdGVVdGlsczppc0VxdWl2YWxlbnQoQXJyYXlMaXN0LEFycmF5TGlzdCk6IEZBTFNFIC0gbWlzbWF0Y2ggd2l0aCBlbGVtZW50IFsiDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBvYmoxLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIl0gIik7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICB9IGVsc2UgaWYgKChhMSA9PSBudWxsKSAmJiAoYTIgPT0gbnVsbCkpIHsNCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgIH0gZWxzZSBpZiAoKGExICE9IG51bGwpICYmIChhMiA9PSBudWxsKSkgew0KLSAgICAgICAgICAgIGlmIChhMS5zaXplKCkgPT0gMCkgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfSBlbHNlIGlmICgoYTEgPT0gbnVsbCkgJiYgKGEyICE9IG51bGwpKSB7DQotICAgICAgICAgICAgaWYgKGEyLnNpemUoKSA9PSAwKSB7DQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIC8vIG1pc21hdGNoDQotDQotICAgICAgICAgICAgLy8gdHJhY2UgcG9pbnQNCi0gICAgICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICAgICAgbG9nLnRyYWNlKCJPYmplY3RTdGF0ZVV0aWxzOmlzRXF1aXZhbGVudChBcnJheUxpc3QsQXJyYXlMaXN0KTogRkFMU0UgLSBtaXNtYXRjaCBpbiBsaXN0cyIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIENvbXBhcmVzIHRoZSB0d28gY29sbGVjdGlvbnMgdG8gc2VlIGlmIHRoZXkgYXJlIGVxdWl2YWxlbnQuDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gbTEgIFRoZSBmaXJzdCBjb2xsZWN0aW9uDQotICAgICAqIEBwYXJhbSBtMiAgVGhlIHNlY29uZCBjb2xsZWN0aW9uDQotICAgICAqIEBwYXJhbSBzdHJpY3QgIEluZGljYXRlcyB3aGV0aGVyIHN0cmljdCBjaGVja2luZyBpcyByZXF1aXJlZC4gIFN0cmljdA0KLSAgICAgKiAgICAgICAgICAgICAgICBjaGVja2luZyBtZWFucyB0aGF0IHRoZSB0d28gY29sbGVjdGlvbnMgbXVzdCBoYXZlIHRoZQ0KLSAgICAgKiAgICAgICAgICAgICAgICBzYW1lIG1hcHBpbmdzLiAgTm9uLXN0cmljdCBjaGVja2luZyBtZWFucyB0aGF0IHRoZSANCi0gICAgICogICAgICAgICAgICAgICAgdHdvIGNvbGxlY3Rpb25zIG11c3QgaGF2ZSB0aGUgc2FtZSBrZXlzLiAgSW4gYm90aA0KLSAgICAgKiAgICAgICAgICAgICAgICBjYXNlcywgdGhlIG9yZGVyIGlzIG5vdCBzaWduaWZpY2FudC4NCi0gICAgICogQHJldHVybiBUUlVFIGlmIHRoZSB0d28gY29sbGVjdGlvbnMgYXJlIGVxdWl2YWxlbnQNCi0gICAgICogICAgICAgICBGQUxTRSwgb3RoZXJ3aXNlDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNFcXVpdmFsZW50KE1hcCBtMSwgTWFwIG0yLCBib29sZWFuIHN0cmljdCkgew0KLSAgICAgICAgaWYgKChtMSAhPSBudWxsKSAmJiAobTIgIT0gbnVsbCkpIHsNCi0gICAgICAgICAgICBpZiAoc3RyaWN0KSB7DQotICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBzdHJpY3QgdGVzdC4NCi0gICAgICAgICAgICAgICAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBvYmplY3QgaXMgYWxzbyBhIG1hcCBhbmQgdGhlIHR3byBNYXBzIA0KLSAgICAgICAgICAgICAgICAvLyByZXByZXNlbnQgdGhlIHNhbWUgbWFwcGluZ3MuIA0KLSAgICAgICAgICAgICAgICByZXR1cm4gKG0xLmVxdWFscyhtMikpOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIGludCBzaXplMSA9IG0xLnNpemUoKTsNCi0gICAgICAgICAgICAgICAgaW50IHNpemUyID0gbTIuc2l6ZSgpOw0KLQ0KLSAgICAgICAgICAgICAgICBpZiAoc2l6ZTEgIT0gc2l6ZTIpIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAvLyBjaGVjayB0aGUga2V5cywgb3JkZXJpbmcgaXMgbm90IGltcG9ydGFudCBiZXR3ZWVuIHRoZSB0d28gbWFwcw0KLSAgICAgICAgICAgICAgICBJdGVyYXRvciBpdDEgPSBtMS5rZXlTZXQoKS5pdGVyYXRvcigpOw0KLQ0KLSAgICAgICAgICAgICAgICB3aGlsZSAoaXQxLmhhc05leHQoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGtleTEgPSBpdDEubmV4dCgpOw0KLQ0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG0yLmNvbnRhaW5zS2V5KGtleTEpID09IGZhbHNlKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0gZWxzZSBpZiAoKG0xID09IG51bGwpICYmIChtMiA9PSBudWxsKSkgew0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAvLyBtaXNtYXRjaA0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLQ0KLSAgICAvKioNCi0gICAgICogQ29tcGFyZXMgdGhlIHR3byBjb2xsZWN0aW9ucyB0byBzZWUgaWYgdGhleSBhcmUgZXF1aXZhbGVudC4NCi0gICAgICogDQotICAgICAqIEBwYXJhbSBsMSAgVGhlIGZpcnN0IGNvbGxlY3Rpb24NCi0gICAgICogQHBhcmFtIGwyICBUaGUgc2Vjb25kIGNvbGxlY3Rpb24NCi0gICAgICogQHJldHVybiBUUlVFIGlmIHRoZSB0d28gY29sbGVjdGlvbnMgYXJlIGVxdWl2YWxlbnQNCi0gICAgICogICAgICAgICBGQUxTRSwgb3RoZXJ3aXNlDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNFcXVpdmFsZW50KExpbmtlZExpc3QgbDEsIExpbmtlZExpc3QgbDIpIHsNCi0gICAgICAgIGlmICgobDEgIT0gbnVsbCkgJiYgKGwyICE9IG51bGwpKSB7DQotICAgICAgICAgICAgLy8gVGhpcyBpcyBhIHN0cmljdCB0ZXN0Lg0KLSAgICAgICAgICAgIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIG9iamVjdCBpcyBhbHNvIGEgbGlzdCwgDQotICAgICAgICAgICAgLy8gYm90aCBsaXN0cyBoYXZlIHRoZSBzYW1lIHNpemUsIGFuZCBhbGwgY29ycmVzcG9uZGluZyBwYWlycyANCi0gICAgICAgICAgICAvLyBvZiBlbGVtZW50cyBpbiB0aGUgdHdvIGxpc3RzIGFyZSBlcXVhbCB3aGVyZQ0KLSAgICAgICAgICAgIC8vIHRoZXkgY29udGFpbiB0aGUgc2FtZSBlbGVtZW50cyBpbiB0aGUgc2FtZSBvcmRlci4NCi0gICAgICAgICAgICByZXR1cm4gKGwxLmVxdWFscyhsMikpOw0KLSAgICAgICAgfSBlbHNlIGlmICgobDEgPT0gbnVsbCkgJiYgKGwyID09IG51bGwpKSB7DQotICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIC8vIG1pc21hdGNoDQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogQ2hlY2sgdGhlIGZpcnN0IHNldCBvZiBuYW1lcyBmb3IgYSBtYXRjaCBhZ2FpbnN0DQotICAgICAqIHRoZSBzZWNvbmQgc2V0IG9mIG5hbWVzLiAgVGhlc2UgbmFtZXMgYXJlIA0KLSAgICAgKiBhc3NvY2lhdGVkIHdpdGggQXhpc01lc3NhZ2Ugb2JqZWN0cy4gTWVzc2FnZSBuYW1lcw0KLSAgICAgKiBhcmUgZXhwZWN0ZWQgdG8gYmUgbm9uLW51bGwuICBFbGVtZW50IG5hbWVzIGNvdWxkDQotICAgICAqIGJlIGVpdGhlciBudWxsIG9yIG5vbi1udWxsLg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIG5hbWUxICBUaGUgbmFtZSBmb3IgdGhlIGZpcnN0IG1lc3NhZ2UNCi0gICAgICogQHBhcmFtIGVsZW1lbnROYW1lMSBUaGUgZWxlbWVudCBuYW1lIGZvciB0aGUgZmlyc3QgbWVzc2FnZQ0KLSAgICAgKiBAcGFyYW0gbmFtZTIgIFRoZSBuYW1lIGZvciB0aGUgc2Vjb25kIG1lc3NhZ2UNCi0gICAgICogQHBhcmFtIGVsZW1lbnROYW1lMiBUaGUgZWxlbWVudCBuYW1lIGZvciB0aGUgc2Vjb25kIG1lc3NhZ2UNCi0gICAgICogQHJldHVybiBUUlVFIGlmIHRoZXJlJ3MgYSBtYXRjaCwNCi0gICAgICogICAgICAgICBGQUxTRSBvdGhlcndpc2UNCi0gICAgICovDQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gbWF0Y2hNZXNzYWdlTmFtZXMoU3RyaW5nIG5hbWUxLCBTdHJpbmcgZWxlbWVudE5hbWUxLCBTdHJpbmcgbmFtZTIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGVsZW1lbnROYW1lMikgew0KLSAgICAgICAgLy8gdGhlIG5hbWUgZm9yIHRoZSBtZXNzYWdlIG11c3QgZXhpc3QNCi0gICAgICAgIGlmICgobmFtZTEgIT0gbnVsbCkgJiYgKG5hbWUyICE9IG51bGwpICYmIChuYW1lMS5lcXVhbHMobmFtZTIpKSkgew0KLSAgICAgICAgICAgIC8vIHRoZXJlJ3MgYSBtYXRjaCBvbiB0aGUgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhlIG1lc3NhZ2Ugb2JqZWN0DQotDQotICAgICAgICAgICAgLy8gZWxlbWVudCBuYW1lcyBuZWVkIHRvIG1hdGNoLCBpbmNsdWRpbmcgYmVpbmcgbnVsbA0KLSAgICAgICAgICAgIGlmICgoZWxlbWVudE5hbWUxID09IG51bGwpICYmIChlbGVtZW50TmFtZTIgPT0gbnVsbCkpIHsNCi0gICAgICAgICAgICAgICAgLy8gdGhlcmUncyBhIG1hdGNoIGZvciB0aGUgbnVsbHMNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgfSBlbHNlIGlmICgoZWxlbWVudE5hbWUxICE9IG51bGwpICYmIChlbGVtZW50TmFtZTIgIT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgICAgICYmIChlbGVtZW50TmFtZTEuZXF1YWxzKGVsZW1lbnROYW1lMikpKSB7DQotICAgICAgICAgICAgICAgIC8vIHRoZXJlJ3MgYSBtYXRjaCBmb3IgdGhlIGVsZW1lbnQgbmFtZXMNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgLy8gdGhlcmUncyBzb21lIG1pc21hdGNoDQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIC8vIGVpdGhlciBhIG1lc3NhZ2UgbmFtZSBpcyBudWxsIG9yIHRoZSBuYW1lcyBkb24ndCBtYXRjaA0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY29udGV4dC9leHRlcm5hbGl6ZS9EZWJ1Z09iamVjdElucHV0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY29udGV4dC9leHRlcm5hbGl6ZS9EZWJ1Z09iamVjdElucHV0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyM2QyMGEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvbnRleHQvZXh0ZXJuYWxpemUvRGVidWdPYmplY3RJbnB1dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjExICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5leHRlcm5hbGl6ZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0Ow0KLWltcG9ydCBqYXZhLmlvLk9iamVjdFN0cmVhbUNvbnN0YW50czsNCi0NCi0vKioNCi0gKiBEZWJ1Z09iamVjdElucHV0IGRlbGVnYXRlcyB0byBhbiBPYmplY3RJbnB1dCBvYmplY3QuDQotICogRWFjaCBtZXRob2QgbG9ncyBpbi9vdXQgdHJhY2UgaW5mb3JtYXRpb24uDQotICovDQotcHVibGljIGNsYXNzIERlYnVnT2JqZWN0SW5wdXQgaW1wbGVtZW50cyBPYmplY3RJbnB1dCwgT2JqZWN0U3RyZWFtQ29uc3RhbnRzIHsNCi0gICAgDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhEZWJ1Z09iamVjdElucHV0LmNsYXNzKTsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc0RlYnVnID0gbG9nLmlzRGVidWdFbmFibGVkKCk7DQotICAgIE9iamVjdElucHV0IG9pOyAvLyBkZWxlZ2F0ZQ0KLQ0KLSAgICBwdWJsaWMgRGVidWdPYmplY3RJbnB1dChPYmplY3RJbnB1dCBvaSkgew0KLSAgICAgICAgc3VwZXIoKTsNCi0gICAgICAgIHRoaXMub2kgPSBvaTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgaW50IGF2YWlsYWJsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICB0cmFjZSgic3RhcnQgYXZhaWxhYmxlKCkiKTsNCi0gICAgICAgIGludCB2YWx1ZSA9IG9pLmF2YWlsYWJsZSgpOw0KLSAgICAgICAgdHJhY2UoImVuZCBhdmFpbGFibGUoKSA9IiArIHZhbHVlKTsNCi0gICAgICAgIHJldHVybiB2YWx1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICB0cmFjZSgic3RhcnQgY2xvc2UoKSIpOw0KLSAgICAgICAgb2kuY2xvc2UoKTsNCi0gICAgICAgIHRyYWNlKCJlbmQgY2xvc2UoKSIpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICB0cmFjZSgic3RhcnQgcmVhZCgpIik7DQotICAgICAgICBpbnQgdmFsdWUgPSBvaS5yZWFkKCk7DQotICAgICAgICB0cmFjZSgiZW5kIHJlYWQoKT0iICsgdmFsdWUpOw0KLSAgICAgICAgcmV0dXJuIHZhbHVlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBpbnQgcmVhZChieXRlW10gYiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIHRyYWNlKCJzdGFydCByZWFkKGIsIG9mZiwgbGVuKSBvZmY9IiArIG9mZiArICIgbGVuPSIrbGVuKTsNCi0gICAgICAgIGludCB2YWx1ZSA9IG9pLnJlYWQoYiwgb2ZmLCBsZW4pOw0KLSAgICAgICAgdHJhY2UoImVuZCByZWFkKGIsb2ZmLGxlbik9IiArIHZhbHVlKTsNCi0gICAgICAgIHJldHVybiB2YWx1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgaW50IHJlYWQoYnl0ZVtdIGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICB0cmFjZSgic3RhcnQgcmVhZChiKSBiLmxlbmd0aD0iICsgYi5sZW5ndGgpOw0KLSAgICAgICAgaW50IHZhbHVlID0gb2kucmVhZChiKTsNCi0gICAgICAgIHRyYWNlKCJlbmQgcmVhZChiKT0iICsgdmFsdWUpOw0KLSAgICAgICAgcmV0dXJuIHZhbHVlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIHJlYWRCb29sZWFuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIHRyYWNlKCJzdGFydCByZWFkQm9vbGVhbigpIik7DQotICAgICAgICBib29sZWFuIHZhbHVlID0gb2kucmVhZEJvb2xlYW4oKTsNCi0gICAgICAgIHRyYWNlKCJlbmQgcmVhZEJvb2xlYW4oKT0iICsgdmFsdWUpOw0KLSAgICAgICAgcmV0dXJuIHZhbHVlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBieXRlIHJlYWRCeXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIHRyYWNlKCJzdGFydCByZWFkQnl0ZSIpOw0KLSAgICAgICAgYnl0ZSB2YWx1ZSA9IG9pLnJlYWRCeXRlKCk7DQotICAgICAgICB0cmFjZSgiZW5kIHJlYWRCeXRlKCk9IiArIHZhbHVlKTsNCi0gICAgICAgIHJldHVybiB2YWx1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgY2hhciByZWFkQ2hhcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICB0cmFjZSgic3RhcnQgcmVhZENoYXIiKTsNCi0gICAgICAgIGNoYXIgdmFsdWUgPSBvaS5yZWFkQ2hhcigpOw0KLSAgICAgICAgdHJhY2UoImVuZCByZWFkQ2hhcigpPSIgKyB2YWx1ZSk7DQotICAgICAgICByZXR1cm4gdmFsdWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGRvdWJsZSByZWFkRG91YmxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIHRyYWNlKCJzdGFydCByZWFkRG91YmxlIik7DQotICAgICAgICBkb3VibGUgdmFsdWUgPSBvaS5yZWFkRG91YmxlKCk7DQotICAgICAgICB0cmFjZSgiZW5kIHJlYWREb3VibGUoKT0iICsgdmFsdWUpOw0KLSAgICAgICAgcmV0dXJuIHZhbHVlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBmbG9hdCByZWFkRmxvYXQoKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLSAgICAgICAgdHJhY2UoInN0YXJ0IHJlYWRGbG9hdCIpOw0KLSAgICAgICAgZmxvYXQgdmFsdWUgPSBvaS5yZWFkRmxvYXQoKTsNCi0gICAgICAgIHRyYWNlKCJlbmQgcmVhZEZsb2F0KCk9IiArIHZhbHVlKTsNCi0gICAgICAgIHJldHVybiB2YWx1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCByZWFkRnVsbHkoYnl0ZVtdIGIsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICB0cmFjZSgic3RhcnQgcmVhZEZ1bGx5KGIsb2ZmLGxlbikgb2ZmPSIgKyBvZmYgKyAiIGxlbj0iK2xlbik7DQotICAgICAgICBvaS5yZWFkRnVsbHkoYiwgb2ZmLCBsZW4pOw0KLSAgICAgICAgdHJhY2UoImVuZCByZWFkRnVsbHkoYixvZmYsbGVuKSIpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHJlYWRGdWxseShieXRlW10gYikgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIHRyYWNlKCJzdGFydCByZWFkRnVsbHkoYikgYi5sZW5ndGg9IisgYi5sZW5ndGgpOw0KLSAgICAgICAgb2kucmVhZEZ1bGx5KGIpOw0KLSAgICAgICAgdHJhY2UoImVuZCByZWFkRnVsbHkoYikiKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgaW50IHJlYWRJbnQoKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLSAgICAgICAgdHJhY2UoInN0YXJ0IHJlYWRJbnQoKSIpOw0KLSAgICAgICAgaW50IHZhbHVlID0gb2kucmVhZEludCgpOw0KLSAgICAgICAgdHJhY2UoImVuZCByZWFkSW50KCk9IisgdmFsdWUpOw0KLSAgICAgICAgcmV0dXJuIHZhbHVlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgcmVhZExpbmUoKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLSAgICAgICAgdHJhY2UoInN0YXJ0IHJlYWRMaW5lKCkiKTsNCi0gICAgICAgIFN0cmluZyB2YWx1ZSA9IG9pLnJlYWRMaW5lKCk7DQotICAgICAgICB0cmFjZSgiZW5kIHJlYWRMaW5lKCk9IisgdmFsdWUpOw0KLSAgICAgICAgcmV0dXJuIHZhbHVlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBsb25nIHJlYWRMb25nKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIHRyYWNlKCJzdGFydCByZWFkTG9uZygpIik7DQotICAgICAgICBsb25nIHZhbHVlID0gb2kucmVhZExvbmcoKTsNCi0gICAgICAgIHRyYWNlKCJlbmQgcmVhZExvbmcoKT0iKyB2YWx1ZSk7DQotICAgICAgICByZXR1cm4gdmFsdWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE9iamVjdCByZWFkT2JqZWN0KCkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIHRyYWNlKCJzdGFydCByZWFkT2JqZWN0KCkiKTsNCi0gICAgICAgIE9iamVjdCB2YWx1ZSA9IG9pLnJlYWRPYmplY3QoKTsNCi0gICAgICAgIA0KLSAgICAgICAgdHJhY2UoImVuZCByZWFkT2JqZWN0KCk9IisgdmFsdWVOYW1lKHZhbHVlKSk7DQotICAgICAgICByZXR1cm4gdmFsdWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHNob3J0IHJlYWRTaG9ydCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICB0cmFjZSgic3RhcnQgcmVhZFNob3J0KCkiKTsNCi0gICAgICAgIHNob3J0IHZhbHVlID0gb2kucmVhZFNob3J0KCk7DQotICAgICAgICB0cmFjZSgiZW5kIHJlYWRTaG9ydCgpPSIrIHZhbHVlKTsNCi0gICAgICAgIHJldHVybiB2YWx1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgaW50IHJlYWRVbnNpZ25lZEJ5dGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLSAgICAgICAgdHJhY2UoInN0YXJ0IHJlYWRMb25nKCkiKTsNCi0gICAgICAgIGludCB2YWx1ZSA9IG9pLnJlYWRVbnNpZ25lZEJ5dGUoKTsNCi0gICAgICAgIHRyYWNlKCJlbmQgcmVhZFVuc2lnbmVkQnl0ZSgpPSIrIHZhbHVlKTsNCi0gICAgICAgIHJldHVybiB2YWx1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgaW50IHJlYWRVbnNpZ25lZFNob3J0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIHRyYWNlKCJzdGFydCByZWFkU2hvcnQoKSIpOw0KLSAgICAgICAgaW50IHZhbHVlID0gb2kucmVhZFVuc2lnbmVkU2hvcnQoKTsNCi0gICAgICAgIHRyYWNlKCJlbmQgcmVhZFNob3J0KCk9IisgdmFsdWUpOw0KLSAgICAgICAgcmV0dXJuIHZhbHVlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgcmVhZFVURigpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICB0cmFjZSgic3RhcnQgcmVhZFVURigpIik7DQotICAgICAgICBTdHJpbmcgdmFsdWUgPSBvaS5yZWFkVVRGKCk7DQotICAgICAgICB0cmFjZSgiZW5kIHJlYWRVVEYoKT0iKyB2YWx1ZSk7DQotICAgICAgICByZXR1cm4gdmFsdWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGxvbmcgc2tpcChsb25nIG4pIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICB0cmFjZSgic3RhcnQgc2tpcChuKSBuPSIrbik7DQotICAgICAgICBsb25nIHZhbHVlID0gb2kuc2tpcChuKTsNCi0gICAgICAgIHRyYWNlKCJlbmQgc2tpcChuKT0iKyB2YWx1ZSk7DQotICAgICAgICByZXR1cm4gdmFsdWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGludCBza2lwQnl0ZXMoaW50IG4pIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICB0cmFjZSgic3RhcnQgc2tpcEJ5dGVzKG4pIG49IituKTsNCi0gICAgICAgIGludCB2YWx1ZSA9IG9pLnNraXBCeXRlcyhuKTsNCi0gICAgICAgIHRyYWNlKCJlbmQgc2tpcEJ5dGVzKG4pPSIrIHZhbHVlKTsNCi0gICAgICAgIHJldHVybiB2YWx1ZTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIHZvaWQgdHJhY2UoU3RyaW5nIHN0cikgew0KLSAgICAgICAgaWYgKGlzRGVidWcpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcoc3RyKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICANCi0gICAgcHJpdmF0ZSBTdHJpbmcgdmFsdWVOYW1lKE9iamVjdCBvYmopIHsNCi0gICAgICAgIGlmIChvYmogPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiAibnVsbCI7DQotICAgICAgICB9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFN0cmluZykgew0KLSAgICAgICAgICAgIHJldHVybiAoU3RyaW5nKSBvYmo7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIHJldHVybiAiT2JqZWN0IG9mIGNsYXNzID0gIiArIG9iai5nZXRDbGFzcygpLmdldE5hbWUoKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY29udGV4dC9leHRlcm5hbGl6ZS9EZWJ1Z09iamVjdE91dHB1dFN0cmVhbS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvbnRleHQvZXh0ZXJuYWxpemUvRGVidWdPYmplY3RPdXRwdXRTdHJlYW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2I3Y2ZiMC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY29udGV4dC9leHRlcm5hbGl6ZS9EZWJ1Z09iamVjdE91dHB1dFN0cmVhbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5leHRlcm5hbGl6ZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dDsNCi1pbXBvcnQgamF2YS5pby5PYmplY3RTdHJlYW1Db25zdGFudHM7DQotDQotLyoqDQotICogRGVidWdPYmplY3RPdXRwdXRTdHJlYW0gZGVsZWdhdGVzIHRvIGFuIE9iamVjdE91dHB1dCBvYmplY3QuDQotICogRWFjaCBtZXRob2QgbG9ncyBpbi9vdXQgdHJhY2UgaW5mb3JtYXRpb24NCi0gKi8NCi1wdWJsaWMgY2xhc3MgRGVidWdPYmplY3RPdXRwdXRTdHJlYW0gaW1wbGVtZW50cyBPYmplY3RTdHJlYW1Db25zdGFudHMsIE9iamVjdE91dHB1dA0KLSAgICAgICAgew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coRGVidWdPYmplY3RPdXRwdXRTdHJlYW0uY2xhc3MpOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzRGVidWcgPSBsb2cuaXNEZWJ1Z0VuYWJsZWQoKTsNCi0gICAgT2JqZWN0T3V0cHV0IG91dDsNCi0gICAgDQotICAgIERlYnVnT2JqZWN0T3V0cHV0U3RyZWFtKE9iamVjdE91dHB1dCBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICBzdXBlcigpOw0KLSAgICAgICAgdHJhY2UoIi0tU1RBUlQgRGVidWdPdXRwdXRTdHJlYW0tLSIpOw0KLSAgICAgICAgdGhpcy5vdXQgPSBvdXQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLSAgICAgICAgdHJhY2UoIi0tQ0xPU0UgRGVidWdPdXRwdXRTdHJlYW0tLSIpOw0KLSAgICAgICAgb3V0LmNsb3NlKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgZmx1c2goKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLSAgICAgICAgdHJhY2UgKCJzdGFydCBmbHVzaCgpIik7DQotICAgICAgICBvdXQuZmx1c2goKTsNCi0gICAgICAgIHRyYWNlICgiZW5kIGZsdXNoKCkiKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gYiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIHRyYWNlICgic3RhcnQgd3JpdGUoYiwgb2ZmLCBsZW4pIG9mZj0iICsgb2ZmICsgIiBsZW49IiArIGxlbik7DQotICAgICAgICBpZiAobGVuID4gNCkgew0KLSAgICAgICAgICAgIHRyYWNlICgiIGZpcnN0IGZvdXIgYnl0ZXMgPSAnIiArIA0KLSAgICAgICAgICAgICAgICAgICBiW29mZl0gKyAiJyAnIiArIA0KLSAgICAgICAgICAgICAgICAgICBiW29mZisxXSArICInICciICsNCi0gICAgICAgICAgICAgICAgICAgYltvZmYrMl0gKyAiJyAnIiArDQotICAgICAgICAgICAgICAgICAgIGJbb2ZmKzNdICsgIiciKTsNCi0gICAgICAgIH0NCi0gICAgICAgIG91dC53cml0ZShiLCBvZmYsIGxlbik7DQotICAgICAgICB0cmFjZSAoImVuZCB3cml0ZShiLCBvZmYsIGxlbikiKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gYikgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIHRyYWNlICgic3RhcnQgd3JpdGUoYnl0ZSkgYnl0ZT0iICsgYik7DQotICAgICAgICBvdXQud3JpdGUoYik7DQotICAgICAgICB0cmFjZSAoImVuZCB3cml0ZShiKSIpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHdyaXRlKGludCBiKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLSAgICAgICAgdHJhY2UgKCJzdGFydCB3cml0ZShpbnQpIGludD0iICsgYik7DQotICAgICAgICBvdXQud3JpdGUoYik7DQotICAgICAgICB0cmFjZSAoImVuZCB3cml0ZShpbnQpIik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgd3JpdGVCb29sZWFuKGJvb2xlYW4gdikgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIHRyYWNlICgic3RhcnQgd3JpdGVCb29sZWFuKHYpIHY9IiArIHYpOw0KLSAgICAgICAgb3V0LndyaXRlQm9vbGVhbih2KTsNCi0gICAgICAgIHRyYWNlICgiZW5kIHdyaXRlQm9vbGVhbih2KSIpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHdyaXRlQnl0ZShpbnQgdikgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIHRyYWNlICgic3RhcnQgd3JpdGVCeXRlKHYpIHY9IiArIHYpOw0KLSAgICAgICAgb3V0LndyaXRlQnl0ZSh2KTsNCi0gICAgICAgIHRyYWNlICgiZW5kIHdyaXRlQnl0ZSh2KSIpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHdyaXRlQnl0ZXMoU3RyaW5nIHMpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICB0cmFjZSAoInN0YXJ0IHdyaXRlQnl0ZXMocykgcz0iICsgcyk7DQotICAgICAgICBvdXQud3JpdGVCeXRlcyhzKTsNCi0gICAgICAgIHRyYWNlICgiZW5kIHdyaXRlQnl0ZXMocykiKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUNoYXIoaW50IHYpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICB0cmFjZSAoInN0YXJ0IHdyaXRlQ2hhcih2KSB2PSIgKyB2KTsNCi0gICAgICAgIG91dC53cml0ZUNoYXIodik7DQotICAgICAgICB0cmFjZSAoImVuZCB3cml0ZUNoYXIodikiKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUNoYXJzKFN0cmluZyBzKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLSAgICAgICAgdHJhY2UgKCJzdGFydCB3cml0ZUNoYXJzKHMpIHM9IiArIHMpOw0KLSAgICAgICAgb3V0LndyaXRlQ2hhcnMocyk7DQotICAgICAgICB0cmFjZSAoImVuZCB3cml0ZUNoYXJzKHMpIik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgd3JpdGVEb3VibGUoZG91YmxlIHYpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICB0cmFjZSAoInN0YXJ0IHdyaXRlRG91YmxlKHYpIHY9IiArIHYpOw0KLSAgICAgICAgb3V0LndyaXRlRG91YmxlKHYpOw0KLSAgICAgICAgdHJhY2UgKCJlbmQgd3JpdGVEb3VibGUodikiKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUZsb2F0KGZsb2F0IHYpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICB0cmFjZSAoInN0YXJ0IHdyaXRlRmxvYXQodikgdj0iICsgdik7DQotICAgICAgICBvdXQud3JpdGVGbG9hdCh2KTsgDQotICAgICAgICB0cmFjZSAoImVuZCB3cml0ZUZsb2F0KHYpIik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgd3JpdGVJbnQoaW50IHYpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICB0cmFjZSAoInN0YXJ0IHdyaXRlSW50KHYpIHY9IiArIHYpOw0KLSAgICAgICAgb3V0LndyaXRlSW50KHYpOw0KLSAgICAgICAgdHJhY2UgKCJlbmQgd3JpdGVJbnQodikiKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUxvbmcobG9uZyB2KSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLSAgICAgICAgdHJhY2UgKCJzdGFydCB3cml0ZUxvbmcodikgdj0iICsgdik7DQotICAgICAgICBvdXQud3JpdGVMb25nKHYpOw0KLSAgICAgICAgdHJhY2UgKCJlbmQgd3JpdGVMb25nKHYpIik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgd3JpdGVPYmplY3QoT2JqZWN0IG9iaikgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIHRyYWNlICgic3RhcnQgd3JpdGVPYmplY3Qodikgdj0iICsgdmFsdWVOYW1lKG9iaikpOw0KLSAgICAgICAgb3V0LndyaXRlT2JqZWN0KG9iaik7DQotICAgICAgICB0cmFjZSAoImVuZCB3cml0ZU9iamVjdCh2KSIpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHdyaXRlU2hvcnQoaW50IHYpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICB0cmFjZSAoInN0YXJ0IHdyaXRlU2hvcnQodikgdj0iICsgdik7DQotICAgICAgICBvdXQud3JpdGVTaG9ydCh2KTsNCi0gICAgICAgIHRyYWNlICgiZW5kIHdyaXRlU2hvcnQodikiKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZVVURihTdHJpbmcgc3RyKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLSAgICAgICAgdHJhY2UgKCJzdGFydCB3cml0ZVVURih2KSB2PSIgKyBzdHIpOw0KLSAgICAgICAgb3V0LndyaXRlVVRGKHN0cik7DQotICAgICAgICB0cmFjZSAoImVuZCB3cml0ZVVURih2KSIpOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCB0cmFjZShTdHJpbmcgc3RyKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Zykgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhzdHIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICBwcml2YXRlIFN0cmluZyB2YWx1ZU5hbWUoT2JqZWN0IG9iaikgew0KLSAgICAgICAgaWYgKG9iaiA9PSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuICJudWxsIjsNCi0gICAgICAgIH0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgU3RyaW5nKSB7DQotICAgICAgICAgICAgcmV0dXJuIChTdHJpbmcpIG9iajsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgcmV0dXJuICJPYmplY3Qgb2YgY2xhc3MgPSAiICsgb2JqLmdldENsYXNzKCkuZ2V0TmFtZSgpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb250ZXh0L2V4dGVybmFsaXplL0V4dGVybmFsaXplQ29uc3RhbnRzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY29udGV4dC9leHRlcm5hbGl6ZS9FeHRlcm5hbGl6ZUNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzc0M2Q0Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb250ZXh0L2V4dGVybmFsaXplL0V4dGVybmFsaXplQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuZXh0ZXJuYWxpemU7DQotDQotLyoqDQotICogQ29tbW9uIEV4dGVybmFsaXplIENvbnN0YW50cw0KLSAqLw0KLXB1YmxpYyBpbnRlcmZhY2UgRXh0ZXJuYWxpemVDb25zdGFudHMgew0KLSAgICANCi0gICAgLy8gT2JqZWN0cyBhcmUgcHJlY2VlZGVkIGJ5IGEgYml0IGluZGljYXRpbmcgaWYgdGhlIG9iamVjdCBpcyBlbXB0eSBvciBhY3RpdmUNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIEVNUFRZX09CSkVDVCA9IGZhbHNlOyAgLy8gbnVsbCBvYmplY3Qgb3IgZW1wdHkgb2JqZWN0DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBBQ1RJVkVfT0JKRUNUID0gdHJ1ZTsgIC8vIG90aGVyd2lzZSBpdCBpcyBhbiBhY3RpdmUgb2JqZWN0DQotICAgIA0KLSAgICAvLyB1c2VkIHRvIGluZGljYXRlIHRoZSBlbmQgb2YgYSBsaXN0DQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIExBU1RfRU5UUlkgPSAiTEFTVF9PQkoiOw0KLQ0KLSAgICAvLyB1c2VkIHRvIGluZGljYXRlIGFuICJlbXB0eSIgb2JqZWN0DQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEVNUFRZX01BUktFUiA9ICJFTVBUWV9PQkoiOw0KLSAgICANCi0gICAgLy8gIG1lc3NhZ2UvdHJhY2UvbG9nZ2luZyBzdHJpbmdzDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVOU1VQUE9SVEVEX1NVSUQgPSAiU2VyaWFsaXphdGlvbiB2ZXJzaW9uIElEIGlzIG5vdCBzdXBwb3J0ZWQuIjsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU5TVVBQT1JURURfUkVWSUQgPSAiUmV2aXNpb24gSUQgaXMgbm90IHN1cHBvcnRlZC4iOw0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPQkpfU0FWRV9QUk9CTEVNID0NCi0gICAgICAgICAgICAiVGhlIG9iamVjdCBjb3VsZCBub3QgYmUgc2F2ZWQgdG8gdGhlIG91dHB1dCBzdHJlYW0uICBUaGUgb2JqZWN0IG1heSBvciBtYXkgbm90IGJlIGltcG9ydGFudCBmb3IgcHJvY2Vzc2luZyB0aGUgbWVzc2FnZSB3aGVuIGl0IGlzIHJlc3RvcmVkLiBMb29rIGF0IGhvdyB0aGUgb2JqZWN0IGlzIHRvIGJlIHVzZWQgZHVyaW5nIG1lc3NhZ2UgcHJvY2Vzc2luZy4iOw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPQkpfUkVTVE9SRV9QUk9CTEVNID0NCi0gICAgICAgICAgICAiVGhlIG9iamVjdCBjb3VsZCBub3QgYmUgcmVzdG9yZWQgZnJvbSB0aGUgaW5wdXQgc3RyZWFtLiAgVGhlIG9iamVjdCBtYXkgb3IgbWF5IG5vdCBiZSBpbXBvcnRhbnQgZm9yIHByb2Nlc3NpbmcgdGhlIG1lc3NhZ2Ugd2hlbiBpdCBpcyByZXN0b3JlZC4gTG9vayBhdCBob3cgdGhlIG9iamVjdCBpcyB0byBiZSB1c2VkIGR1cmluZyBtZXNzYWdlIHByb2Nlc3NpbmcuIjsNCi0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvbnRleHQvZXh0ZXJuYWxpemUvTWVzc2FnZUV4dGVybmFsaXplVXRpbHMuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb250ZXh0L2V4dGVybmFsaXplL01lc3NhZ2VFeHRlcm5hbGl6ZVV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0YjRlNjcuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvbnRleHQvZXh0ZXJuYWxpemUvTWVzc2FnZUV4dGVybmFsaXplVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuZXh0ZXJuYWxpemU7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01PdXRwdXRGb3JtYXQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5idWlsZGVyLlN0QVhCdWlsZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLnV0aWwuU3RBWFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuaW1wbC5idWlsZGVyLlN0QVhTT0FQTW9kZWxCdWlsZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5idWlsZGVyLkJ1aWxkZXJVdGlsOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lk1lc3NhZ2VGb3JtYXR0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0LlRyYW5zcG9ydFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOw0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkT3V0cHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0Ow0KLWltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dDsNCi1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07DQotDQotLyoqDQotICogVXRpbGl0eSB0byByZWFkL3dyaXRlIHRoZSBNZXNzYWdlIG9mIGEgTWVzc2FnZUNvbnRleHQNCi0gKiBNZXNzYWdlIE9iamVjdCBGb3JtYXQuDQotICogDQotICogPHR0Pg0KLSAqIEZvcm1hdCA6PSBQcm9sb2cge0RhdGFCbG9ja3N9IEVuZEJsb2Nrcw0KLSAqIA0KLSAqIFByb2xvZyA6PQ0KLSAqICAgTkFNRSAgICAgIChVVEYpIA0KLSAqICAgUkVWSVNJT04gIChJTlQpDQotICogICBBQ1RJVkUgICAgKEJPT0wpDQotICogICAgIFtPUFRJTUlaRUQgKEJPT0wpXSAgDQotICogICAgICAgIFtPUFRJTUlaRURfQ09OVEVOVF9UWVBFIChVVEYpXSAgICA8LS0tIElmIE9QVElNSVpFRD1UUlVFDQotICogICAgIFtDSEFSU0VUICAgKFVURildIA0KLSAqICAgICBbTkFNRVNQQUNFIChVVEYpXQ0KLSAqICAgDQotICogRGF0YUJsb2NrIDo9DQotICogICBTSVpFIChJTlQgPjApDQotICogICBEQVRBIChCWVRFUykNCi0gKiAgIA0KLSAqIEVuZEJsb2Nrcw0KLSAqICAgU0laRSAoSU5UKSAgIHswIGluZGljYXRlcyBlbmQgLTEgaW5kaWNhdGVzIGZhaWx1cmV9DQotICogICAgIA0KLSAqICAgDQotICogPC90dD4NCi0gKi8NCi1wdWJsaWMgY2xhc3MgTWVzc2FnZUV4dGVybmFsaXplVXRpbHMgIGltcGxlbWVudHMgRXh0ZXJuYWxpemVDb25zdGFudHMgew0KLSAgICBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKE1lc3NhZ2VFeHRlcm5hbGl6ZVV0aWxzLmNsYXNzKTsNCi0NCi0gICAgLyoNCi0gICAgICogQHNlcmlhbCBUcmFja3MgdGhlIHJldmlzaW9uIGxldmVsIG9mIGEgY2xhc3MgdG8gaWRlbnRpZnkgY2hhbmdlcyB0byB0aGUNCi0gICAgICogY2xhc3MgZGVmaW5pdGlvbiB0aGF0IGFyZSBjb21wYXRpYmxlIHRvIHNlcmlhbGl6YXRpb24vZXh0ZXJuYWxpemF0aW9uLg0KLSAgICAgKiBJZiBhIGNsYXNzIGRlZmluaXRpb24gY2hhbmdlcywgdGhlbiB0aGUgc2VyaWFsaXphdGlvbi9leHRlcm5hbGl6YXRpb24NCi0gICAgICogb2YgdGhlIGNsYXNzIGlzIGFmZmVjdGVkLg0KLSAgICAgKiBSZWZlciB0byB0aGUgd3JpdGVFeHRlcm5hbCgpIGFuZCByZWFkRXh0ZXJuYWwoKSBtZXRob2RzLg0KLSAgICAgKi8NCi0gICAgLy8gc3VwcG9ydGVkIHJldmlzaW9uIGxldmVscywgYWRkIGEgbmV3IGxldmVsIHRvIG1hbmFnZSBjb21wYXRpYmxlIGNoYW5nZXMNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFVklTSU9OXzIgPSAyOw0KLSAgICAvLyBjdXJyZW50IHJldmlzaW9uIGxldmVsIG9mIHRoaXMgb2JqZWN0DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCByZXZpc2lvbklEID0gUkVWSVNJT05fMjsNCi0gICAgDQotICAgIA0KLSAgICAvKioNCi0gICAgICogUHJpdmF0ZSBDb25zdHJ1Y3Rvci4NCi0gICAgICogVGhpcyBjbGFzcyBvbmx5IHN1cHBvcnRzIHN0YXRpYyBtZXRob2RzDQotICAgICAqLw0KLSAgICBwcml2YXRlIE1lc3NhZ2VFeHRlcm5hbGl6ZVV0aWxzKCkge30NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBXcml0ZSBvdXQgdGhlIE1lc3NhZ2UNCi0gICAgICogQHBhcmFtIG91dA0KLSAgICAgKiBAcGFyYW0gbWMNCi0gICAgICogQHBhcmFtIGNvcnJlbGF0aW9uSURTdHJpbmcNCi0gICAgICogQHBhcmFtIG91dHB1dEZvcm1hdA0KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVFeHRlcm5hbChPYmplY3RPdXRwdXQgb3V0LCANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUNvbnRleHQgbWMsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjb3JyZWxhdGlvbklEU3RyaW5nLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTU91dHB1dEZvcm1hdCBvdXRwdXRGb3JtYXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcoY29ycmVsYXRpb25JRFN0cmluZyArICI6d3JpdGVFeHRlcm5hbCgpOiBzdGFydCIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgU09BUEVudmVsb3BlIGVudmVsb3BlID0gbWMuZ2V0RW52ZWxvcGUoKTsNCi0gICAgICAgIGlmIChlbnZlbG9wZSA9PSBudWxsKSB7DQotICAgICAgICAgICAgLy8gQ2FzZTogTm8gZW52ZWxvcGUNCi0gICAgICAgICAgICBvdXQud3JpdGVVVEYoIk5VTExfRU5WRUxPUEUiKTsNCi0gICAgICAgICAgICBvdXQud3JpdGVJbnQocmV2aXNpb25JRCk7DQotICAgICAgICAgICAgb3V0LndyaXRlQm9vbGVhbihFTVBUWV9PQkpFQ1QpOyAvLyBOb3QgQWN0aXZlDQotICAgICAgICAgICAgb3V0LndyaXRlSW50KDApOyAgLy8gRW5kQmxvY2tzDQotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgICAgIGxvZy5kZWJ1Zyhjb3JyZWxhdGlvbklEU3RyaW5nICsgIjp3cml0ZUV4dGVybmFsKCk6IGVuZDogbXNnIGlzIEVtcHR5Iik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgLy8gV3JpdGUgUHJvbG9nDQotICAgICAgICBTdHJpbmcgbXNnQ2xhc3MgPSBlbnZlbG9wZS5nZXRDbGFzcygpLmdldE5hbWUoKTsNCi0gICAgICAgIG91dC53cml0ZVVURihtc2dDbGFzcyk7DQotICAgICAgICBvdXQud3JpdGVJbnQocmV2aXNpb25JRCk7DQotICAgICAgICBvdXQud3JpdGVCb29sZWFuKEFDVElWRV9PQkpFQ1QpOw0KLSAgICAgICAgaWYgKG91dHB1dEZvcm1hdC5pc09wdGltaXplZCgpKSB7DQotICAgICAgICAgICAgb3V0LndyaXRlQm9vbGVhbih0cnVlKTsNCi0gICAgICAgICAgICAvLyBXcml0ZSBvdXQgdGhlIGNvbnRlbnRUeXBlLg0KLSAgICAgICAgICAgIG91dC53cml0ZVVURihvdXRwdXRGb3JtYXQuZ2V0Q29udGVudFR5cGUoKSk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIG91dC53cml0ZUJvb2xlYW4oZmFsc2UpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgb3V0LndyaXRlVVRGKG91dHB1dEZvcm1hdC5nZXRDaGFyU2V0RW5jb2RpbmcoKSk7DQotICAgICAgICBvdXQud3JpdGVVVEYoZW52ZWxvcGUuZ2V0TmFtZXNwYWNlKCkuZ2V0TmFtZXNwYWNlVVJJKCkpOw0KLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKGNvcnJlbGF0aW9uSURTdHJpbmcgKyAiOndyaXRlRXh0ZXJuYWwoKTogIiArIA0KLSAgICAgICAgICAgICAgICAgICAgICAib3B0aW1pemVkPVsiICsgb3V0cHV0Rm9ybWF0LmlzT3B0aW1pemVkKCkgKyAiXSAgIiArDQotICAgICAgICAgICAgICAgICAgICAgICJvcHRpbWl6ZWRDb250ZW50VHlwZSAiICsgb3V0cHV0Rm9ybWF0LmdldENvbnRlbnRUeXBlKCkgKyAiXSAgIiArDQotICAgICAgICAgICAgICAgICAgICAgICJjaGFyU2V0RW5jPVsiICsgb3V0cHV0Rm9ybWF0LmdldENoYXJTZXRFbmNvZGluZygpICsgIl0gICIgKw0KLSAgICAgICAgICAgICAgICAgICAgICAibmFtZXNwYWNlVVJJPVsiICsgZW52ZWxvcGUuZ2V0TmFtZXNwYWNlKCkuZ2V0TmFtZXNwYWNlVVJJKCkgKyAiXSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICAvLyBXcml0ZSBEYXRhQmxvY2tzDQotICAgICAgICAvLyBNZXNzYWdlT3V0cHV0U3RyZWFtIHdyaXRlcyBvdXQgdGhlIERhdGFCbG9ja3MgaW4gY2h1bmtzDQotICAgICAgICAvLyBCdWZmZXJlZE91dHB1dFN0cmVhbSBidWZmZXJzIHRoZSBkYXRhIHRvIHByZXZlbnQgbnVtZXJvdXMsIHNtYWxsIGJsb2Nrcw0KLSAgICAgICAgTWVzc2FnZU91dHB1dFN0cmVhbSBtb3MgPSBuZXcgTWVzc2FnZU91dHB1dFN0cmVhbShvdXQpOyAgDQotICAgICAgICBCdWZmZXJlZE91dHB1dFN0cmVhbSBib3MgPSBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0obW9zKTsgICANCi0gICAgICAgIGJvb2xlYW4gZXJyb3JPY2N1cnJlZCA9IGZhbHNlOw0KLSAgICAgICAgdHJ5IHsgDQotICAgICAgICAgICAgLy8gV3JpdGUgb3V0IHRoZSBtZXNzYWdlIHVzaW5nIHRoZSBzYW1lIGxvZ2ljIGFzIHRoZSANCi0gICAgICAgICAgICAvLyB0cmFuc3BvcnQgbGF5ZXIuDQotICAgICAgICAgICAgTWVzc2FnZUZvcm1hdHRlciBtc2dGb3JtYXR0ZXIgPSBUcmFuc3BvcnRVdGlscy5nZXRNZXNzYWdlRm9ybWF0dGVyKG1jKTsNCi0gICAgICAgICAgICBtc2dGb3JtYXR0ZXIud3JpdGVUbyhtYywgb3V0cHV0Rm9ybWF0LCBib3MsIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOyAvLyBQcmVzZXJ2ZSB0aGUgb3JpZ2luYWwgbWVzc2FnZQ0KLSAgICAgICAgICAgIA0KLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIHRocm93IGU7DQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgew0KLSAgICAgICAgICAgIHRocm93IEF4aXNGYXVsdC5tYWtlRmF1bHQodCk7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICAgIGJvcy5mbHVzaCgpOw0KLSAgICAgICAgICAgIGJvcy5jbG9zZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICAvLyBXcml0ZSBFbmQgb2YgRGF0YSBCbG9ja3MNCi0gICAgICAgIGlmIChlcnJvck9jY3VycmVkKSB7DQotICAgICAgICAgICAgb3V0LndyaXRlSW50KC0xKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgb3V0LndyaXRlSW50KDApOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKGNvcnJlbGF0aW9uSURTdHJpbmcgKyAiOndyaXRlRXh0ZXJuYWwoKTogZW5kIik7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBSZWFkIHRoZSBNZXNzYWdlDQotICAgICAqIEBwYXJhbSBpbg0KLSAgICAgKiBAcGFyYW0gbWMNCi0gICAgICogQHBhcmFtIGNvcnJlbGF0aW9uSURTdHJpbmcNCi0gICAgICogQHJldHVybg0KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIFNPQVBFbnZlbG9wZSByZWFkRXh0ZXJuYWwoT2JqZWN0SW5wdXQgaW4sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlQ29udGV4dCBtYywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjb3JyZWxhdGlvbklEU3RyaW5nKSB0aHJvd3MgSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24gew0KLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKGNvcnJlbGF0aW9uSURTdHJpbmcgKyAiOnJlYWRFeHRlcm5hbCgpOiBzdGFydCIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgU09BUEVudmVsb3BlIGVudmVsb3BlID0gbnVsbDsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gUmVhZCBQcm9sb2cNCi0gICAgICAgIC8vIFJlYWQgdGhlIGNsYXNzIG5hbWUgYW5kIG9iamVjdCBzdGF0ZQ0KLSAgICAgICAgU3RyaW5nIG5hbWUgPSBpbi5yZWFkVVRGKCk7DQotICAgICAgICBpbnQgcmV2aXNpb24gPSBpbi5yZWFkSW50KCk7DQotICAgICAgICANCi0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1Zyhjb3JyZWxhdGlvbklEU3RyaW5nICsgIjpyZWFkRXh0ZXJuYWwoKTogbmFtZT0gIiArIG5hbWUgICsNCi0gICAgICAgICAgICAgICAgICAgICAgIiByZXZpc2lvbj0gIiArIHJldmlzaW9uKTsNCi0gICAgICAgIH0NCi0gICAgICAgIC8vIG1ha2Ugc3VyZSB0aGUgb2JqZWN0IGRhdGEgaXMgaW4gYSByZXZpc2lvbiBsZXZlbCB3ZSBjYW4gaGFuZGxlDQotICAgICAgICBpZiAocmV2aXNpb24gIT0gUkVWSVNJT05fMikgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uKEV4dGVybmFsaXplQ29uc3RhbnRzLlVOU1VQUE9SVEVEX1JFVklEKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgDQotICAgICAgICBib29sZWFuIGdvdE1zZyA9IGluLnJlYWRCb29sZWFuKCk7DQotICAgICAgICBpZiAoZ290TXNnICE9IEFDVElWRV9PQkpFQ1QpIHsNCi0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKGNvcnJlbGF0aW9uSURTdHJpbmcgKyAiOnJlYWRFeHRlcm5hbCgpOiBlbmQ6IiArDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm8gbWVzc2FnZSBwcmVzZW50Iik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGluLnJlYWRJbnQoKTsgLy8gUmVhZCBlbmQgb2YgZGF0YSBibG9ja3MNCi0gICAgICAgICAgICByZXR1cm4gZW52ZWxvcGU7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIC8vIFJlYWQgb3B0aW1pemVkLCBvcHRpbWl6ZWQgY29udGVudC10eXBlLCBjaGFyc2V0IGVuY29kaW5nIGFuZCBuYW1lc3BhY2UgdXJpDQotICAgICAgICBib29sZWFuIG9wdGltaXplZD0gaW4ucmVhZEJvb2xlYW4oKTsNCi0gICAgICAgIFN0cmluZyBvcHRpbWl6ZWRDb250ZW50VHlwZSA9IG51bGw7DQotICAgICAgICBpZiAob3B0aW1pemVkKSB7DQotICAgICAgICAgICAgb3B0aW1pemVkQ29udGVudFR5cGUgPSBpbi5yZWFkVVRGKCk7DQotICAgICAgICB9DQotICAgICAgICBTdHJpbmcgY2hhclNldEVuYyA9IGluLnJlYWRVVEYoKTsNCi0gICAgICAgIFN0cmluZyBuYW1lc3BhY2VVUkkgPSBpbi5yZWFkVVRGKCk7DQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcoY29ycmVsYXRpb25JRFN0cmluZyArICI6cmVhZEV4dGVybmFsKCk6ICIgKw0KLSAgICAgICAgICAgICAgICAgICAgICAib3B0aW1pemVkPVsiICsgb3B0aW1pemVkICsgIl0gICIgKw0KLSAgICAgICAgICAgICAgICAgICAgICAib3B0aW1pemVkQ29udGVudFR5cGU9WyIgKyBvcHRpbWl6ZWRDb250ZW50VHlwZSArICJdICAiICsNCi0gICAgICAgICAgICAgICAgICAgICAgImNoYXJTZXRFbmM9WyIgKyBjaGFyU2V0RW5jICsgIl0gICIgKw0KLSAgICAgICAgICAgICAgICAgICAgICAibmFtZXNwYWNlVVJJPVsiICsgbmFtZXNwYWNlVVJJICsgIl0iKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgTWVzc2FnZUlucHV0U3RyZWFtIG1pcyA9IG5ldyBNZXNzYWdlSW5wdXRTdHJlYW0oaW4pOw0KLSAgICAgICAgU3RBWEJ1aWxkZXIgIGJ1aWxkZXIgPSBudWxsOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBpZiAob3B0aW1pemVkKSB7DQotICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNTT0FQID0gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgYnVpbGRlciA9DQotICAgICAgICAgICAgICAgICAgICBCdWlsZGVyVXRpbC5nZXRBdHRhY2htZW50c0J1aWxkZXIobWMsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGltaXplZENvbnRlbnRUeXBlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU09BUCk7DQotICAgICAgICAgICAgICAgIGVudmVsb3BlID0gKFNPQVBFbnZlbG9wZSkgYnVpbGRlci5nZXREb2N1bWVudEVsZW1lbnQoKTsNCi0gICAgICAgICAgICAgICAgZW52ZWxvcGUuYnVpbGRXaXRoQXR0YWNobWVudHMoKTsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1scmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihtaXMsIGNoYXJTZXRFbmMpOw0KLSAgICAgICAgICAgICAgICBidWlsZGVyID0gbmV3IFN0QVhTT0FQTW9kZWxCdWlsZGVyKHhtbHJlYWRlciwgbmFtZXNwYWNlVVJJKTsNCi0gICAgICAgICAgICAgICAgZW52ZWxvcGUgPSAoU09BUEVudmVsb3BlKSBidWlsZGVyLmdldERvY3VtZW50RWxlbWVudCgpOw0KLSAgICAgICAgICAgICAgICBlbnZlbG9wZS5idWlsZCgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgew0KLSAgICAgICAgICAgIC8vIFRPRE86IHdoYXQgdG8gZG8gaWYgY2FuJ3QgZ2V0IHRoZSBYTUwgc3RyZWFtIHJlYWRlcg0KLSAgICAgICAgICAgIC8vIEZvciBub3csIGxvZyB0aGUgZXZlbnQNCi0gICAgICAgICAgICBsb2cuZXJyb3IoY29ycmVsYXRpb25JRFN0cmluZw0KLSAgICAgICAgICAgICAgICAgICAgICArICI6cmVhZEV4dGVybmFsKCk6IEVycm9yIHdoZW4gZGVzZXJpYWxpemluZyBwZXJzaXN0ZWQgZW52ZWxvcGU6IFsiDQotICAgICAgICAgICAgICAgICAgICAgICsgZXguZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIDogIiArIGV4LmdldExvY2FsaXplZE1lc3NhZ2UoKSArICJdIiwgZXgpOw0KLSAgICAgICAgICAgIGVudmVsb3BlID0gbnVsbDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgICAgaWYgKGJ1aWxkZXIgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICBidWlsZGVyLmNsb3NlKCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIC8vIENsb3NlIHRoZSBtZXNzYWdlIGlucHV0IHN0cmVhbS4gIFRoaXMgd2lsbCBlbnN1cmUgdGhhdCB0aGUNCi0gICAgICAgICAgICAvLyB1bmRlcmx5aW5nIHN0cmVhbSBpcyBhZHZhbmNlZCBwYXN0IHRoZSBtZXNzYWdlLg0KLSAgICAgICAgICAgIG1pcy5jbG9zZSgpOw0KLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoY29ycmVsYXRpb25JRFN0cmluZyArICI6cmVhZEV4dGVybmFsKCk6IGVuZCIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBlbnZlbG9wZTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIE1lc3NhZ2VPdXRwdXRTdHJlYW0gd3JpdGVzIERhdGFCbG9jayBjaHVua3MgdG8gdGhlIE9iamVjdE91dHB1dC4NCi0gICAgICovDQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE1lc3NhZ2VPdXRwdXRTdHJlYW0gZXh0ZW5kcyBPdXRwdXRTdHJlYW0gew0KLSAgICAgICAgT2JqZWN0T3V0cHV0IG91dDsNCi0gICAgICAgIGJvb2xlYW4gaXNEZWJ1ZzsNCi0gICAgICAgIE1lc3NhZ2VPdXRwdXRTdHJlYW0oT2JqZWN0T3V0cHV0IG91dCkgew0KLSAgICAgICAgICAgIHRoaXMub3V0ID0gb3V0Ow0KLSAgICAgICAgICAgIGlzRGVidWcgPSBsb2cuaXNEZWJ1Z0VuYWJsZWQoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgIA0KLSAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLSAgICAgICAgICAgIC8vIE5PT1A6IE9iamVjdE91dHB1dCB3aWxsIGJlIGNsb3NlZCBleHRlcm5hbGx5DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIHB1YmxpYyB2b2lkIGZsdXNoKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgICAgICBvdXQuZmx1c2goKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8qKiANCi0gICAgICAgICAqIFdyaXRlcyBhIGNodW5rIG9mIGRhdGEgdG8gdGhlIE9iamVjdE91dHB1dA0KLSAgICAgICAgICovDQotICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gYiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgICAgICBpZiAobGVuID4gMCkgew0KLSAgICAgICAgICAgICAgICBpZiAoaXNEZWJ1Zykgew0KLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJXcml0ZSBkYXRhIGNodW5rIHdpdGggbGVuPSIgKyBsZW4pOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIC8vIFdyaXRlIG91dCB0aGUgbGVuZ3RoIGFuZCB0aGUgZGF0YSBjaHVuaw0KLSAgICAgICAgICAgICAgICBvdXQud3JpdGVJbnQobGVuKTsNCi0gICAgICAgICAgICAgICAgb3V0LndyaXRlKGIsIG9mZiwgbGVuKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICAgDQotICAgICAgICAvKiogDQotICAgICAgICAgKiBXcml0ZXMgYSBjaHVuayBvZiBkYXRhIHRvIHRoZSBPYmplY3RPdXRwdXQNCi0gICAgICAgICAqLw0KLSAgICAgICAgcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICAgICAgaWYgKGIgIT0gbnVsbCAmJiAgYi5sZW5ndGggPiAwKSB7DQotICAgICAgICAgICAgICAgIGlmIChpc0RlYnVnKSB7DQotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIldyaXRlIGRhdGEgY2h1bmsgd2l0aCBzaXplPSIgKyBiLmxlbmd0aCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgLy8gV3JpdGUgb3V0IHRoZSBsZW5ndGggYW5kIHRoZSBkYXRhIGNodW5rDQotICAgICAgICAgICAgICAgIG91dC53cml0ZUludChiLmxlbmd0aCk7DQotICAgICAgICAgICAgICAgIG91dC53cml0ZShiKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICAgDQotICAgICAgICAvKiogDQotICAgICAgICAgKiBXcml0ZXMgYSBzaW5nbGUgYnl0ZSBjaHVuayBvZiBkYXRhIHRvIHRoZSBPYmplY3RPdXRwdXQNCi0gICAgICAgICAqLw0KLSAgICAgICAgcHVibGljIHZvaWQgd3JpdGUoaW50IGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICAgICAgaWYgKGlzRGVidWcpIHsNCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJXcml0ZSBvbmUgYnl0ZSBkYXRhIGNodW5rIik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIC8vIFdyaXRlIG91dCB0aGUgbGVuZ3RoIGFuZCB0aGUgZGF0YSBjaHVuaw0KLSAgICAgICAgICAgIG91dC53cml0ZUludCgxKTsNCi0gICAgICAgICAgICBvdXQud3JpdGUoYik7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgICAgDQotICAgIC8qKg0KLSAgICAgKiBQcm92aWRlcyBhIElucHV0U3RyZWFtIGludGVyZmFjZSBvdmVyIE9iamVjdElucHV0Lg0KLSAgICAgKiBNZXNzYWdlSW5wdXRTdHJlYW0gY29udHJvbHMgdGhlIHJlYWRpbmcgb2YgdGhlIERhdGFCbG9jayBjaHVua3MNCi0gICAgICoNCi0gICAgICovDQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE1lc3NhZ2VJbnB1dFN0cmVhbSBleHRlbmRzIElucHV0U3RyZWFtIHsNCi0gICAgICAgIA0KLSAgICAgICAgT2JqZWN0SW5wdXQgaW47DQotICAgICAgICBib29sZWFuIGlzRGVidWc7DQotICAgICAgICBpbnQgY2h1bmtBdmFpbCA9IDA7DQotICAgICAgICBib29sZWFuIGlzRU9EID0gZmFsc2U7DQotICAgICAgICANCi0gICAgICAgIC8qKg0KLSAgICAgICAgICogQ29uc3RydWN0b3INCi0gICAgICAgICAqIEBwYXJhbSBpbg0KLSAgICAgICAgICovDQotICAgICAgICBNZXNzYWdlSW5wdXRTdHJlYW0oT2JqZWN0SW5wdXQgaW4pIHsNCi0gICAgICAgICAgICB0aGlzLmluID0gaW47DQotICAgICAgICAgICAgaXNEZWJ1ZyA9IGxvZy5pc0RlYnVnRW5hYmxlZCgpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgIA0KLSAgICAgICAgLyoqDQotICAgICAgICAgKiBSZWFkIGEgc2luZ2xlIGxvZ2ljYWwgYnl0ZQ0KLSAgICAgICAgICovDQotICAgICAgICBwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLSAgICAgICAgICAgIGlmIChpc0RlYnVnKSB7DQotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiaW52b2tpbmcgcmVhZCgpIik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIC8vIERldGVybWluZSBob3cgbWFueSBieXRlcyBhcmUgbGVmdCBpbiB0aGUgY3VycmVudCBkYXRhIGNodW5rDQotICAgICAgICAgICAgdXBkYXRlQ2h1bmtBdmFpbCgpOw0KLSAgICAgICAgICAgIGludCByZXQgPSAwOw0KLSAgICAgICAgICAgIGlmIChpc0VPRCkgew0KLSAgICAgICAgICAgICAgICByZXQgPSAtMTsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBjaHVua0F2YWlsLS07DQotICAgICAgICAgICAgICAgIHJldCA9IGluLnJlYWRCeXRlKCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZygicmV0dXJuaW5nICIgKyByZXQpOw0KLSAgICAgICAgICAgIHJldHVybiByZXQ7DQotICAgICAgICB9DQotDQotICAgICAgICAgDQotICAgICAgICAvKioNCi0gICAgICAgICAqIFJlYWQgYW4gYXJyYXkgb2YgbG9naWNhbCBieXRlcw0KLSAgICAgICAgICovDQotICAgICAgICBwdWJsaWMgaW50IHJlYWQoYnl0ZVtdIGIsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICAgICAgaWYgKGlzRGVidWcpIHsNCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJpbnZva2luZyByZWFkIHdpdGggb2ZmPSIgKyBvZmYgKyAiIGFuZCBsZW49IiArIGxlbik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmIChpc0VPRCkgew0KLSAgICAgICAgICAgICAgICBpZiAoaXNEZWJ1Zykgew0KLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJFT0QgcmV0dXJuaW5nIC0xIik7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpbnQgYnl0ZXNSZWFkID0gMDsNCi0gICAgICAgICAgICB3aGlsZSAoKGxlbiA+MCAmJiAhaXNFT0QpKSB7DQotICAgICAgICAgICAgICAgIC8vIERldGVybWluZSBob3cgbWFueSBieXRlcyBhcmUgbGVmdCBpbiB0aGUgY3VycmVudCBkYXRhIGNodW5rDQotICAgICAgICAgICAgICAgIHVwZGF0ZUNodW5rQXZhaWwoKTsNCi0gICAgICAgICAgICAgICAgaWYgKCFpc0VPRCkgew0KLSAgICAgICAgICAgICAgICAgICAgLy8gUmVhZCB0aGUgYW1vdW50IG9mIGJ5dGVzIHJlcXVlc3RlZCBvciB0aGUgbnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZSBpbiB0aGUgY3VycmVudCBjaHVuaw0KLSAgICAgICAgICAgICAgICAgICAgaW50IHJlYWRMZW5ndGggPSBsZW4gPCBjaHVua0F2YWlsID8gbGVuIDogY2h1bmtBdmFpbDsNCi0gICAgICAgICAgICAgICAgICAgIGludCBiciA9IGluLnJlYWQoYiwgb2ZmLCByZWFkTGVuZ3RoKTsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChiciA8IDApIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkVuZCBvZiBGaWxlIGVuY291bnRlcmVkIik7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgc3RhdGUgd2l0aCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQNCi0gICAgICAgICAgICAgICAgICAgIG9mZiArPSBicjsNCi0gICAgICAgICAgICAgICAgICAgIGxlbiAtPSBicjsNCi0gICAgICAgICAgICAgICAgICAgIGNodW5rQXZhaWwgLT0gYnI7DQotICAgICAgICAgICAgICAgICAgICBieXRlc1JlYWQgKz0gYnI7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYgKGlzRGVidWcpIHsNCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJieXRlcyByZWFkID0gIiArIGJ5dGVzUmVhZCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiBieXRlc1JlYWQ7DQotICAgICAgICB9DQotDQotICAgICAgICAgDQotICAgICAgICBwdWJsaWMgaW50IHJlYWQoYnl0ZVtdIGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICAgICAgcmV0dXJuIHJlYWQoYiwgMCwgYi5sZW5ndGgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICAgICAgaWYgKGlzRGVidWcpIHsNCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJzdGFydCBjbG9zZSIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAvLyBLZWVwIHJlYWRpbmcgY2h1bmtzIHVudGlsIEVPRA0KLSAgICAgICAgICAgIGlmICghaXNFT0QpIHsNCi0gICAgICAgICAgICAgICAgYnl0ZVtdIHRlbXBCdWZmZXIgPSBuZXcgYnl0ZVs0ICogMTAyNF07DQotICAgICAgICAgICAgICAgIHdoaWxlICghaXNFT0QpIHsNCi0gICAgICAgICAgICAgICAgICAgIHJlYWQodGVtcEJ1ZmZlcik7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYgKGlzRGVidWcpIHsNCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJlbmQgY2xvc2UiKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIC8qKg0KLSAgICAgICAgICogdXBkYXRlQ2h1bmtBdmFpbCB1cGRhdGVzIHRoZSBjaHVua0F2YWlsIGZpZWxkIHdpdGggdGhlDQotICAgICAgICAgKiBhbW91bnQgb2YgZGF0YSBpbiB0aGUgY2h1bmsuDQotICAgICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uDQotICAgICAgICAgKi8NCi0gICAgICAgIHByaXZhdGUgdm9pZCB1cGRhdGVDaHVua0F2YWlsKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBJZiB0aGVyZSBhcmUgbm8gbW9yZSBieXRlcyBpbiB0aGUgY3VycmVudCBjaHVuaywNCi0gICAgICAgICAgICAvLyByZWFkIHRoZSBzaXplIG9mIHRoZSBuZXh0IGRhdGFibG9jaw0KLSAgICAgICAgICAgIGlmIChjaHVua0F2YWlsID09IDAgJiYgIWlzRU9EKSB7DQotICAgICAgICAgICAgICAgIGNodW5rQXZhaWwgPSBpbi5yZWFkSW50KCk7DQotICAgICAgICAgICAgICAgIGlmIChpc0RlYnVnKSB7DQotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIk5ldyBEYXRhQmxvY2sgd2l0aCBzaXplPSIgKyBjaHVua0F2YWlsKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBpZiAoY2h1bmtBdmFpbCA8PSAwKSB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoaXNEZWJ1Zykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiRW5kIG9mIGRhdGEiKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGlzRU9EID0gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgICAgIGNodW5rQXZhaWwgPSAwOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb250ZXh0L2V4dGVybmFsaXplL09iamVjdElucHV0U3RyZWFtV2l0aENMLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY29udGV4dC9leHRlcm5hbGl6ZS9PYmplY3RJbnB1dFN0cmVhbVdpdGhDTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODUwMTM0Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb250ZXh0L2V4dGVybmFsaXplL09iamVjdElucHV0U3RyZWFtV2l0aENMLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LmV4dGVybmFsaXplOw0KLQ0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLmlvLk9iamVjdFN0cmVhbUNsYXNzOw0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuUHJveHk7DQotaW1wb3J0IGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsNCi1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uOw0KLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb247DQotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotDQotLyoqDQotICogQW4gT2JqZWN0SW5wdXRTdHJlYW0gdGhhdCBpcyBjb25zdHJ1Y3RlZCB3aXRoIGEgQ2xhc3NMb2FkZXIgb3IgQ2xhc3NSZXNvbHZlci4NCi0gKiBUaGUgZGVmYXVsdCBiZWhhdmlvciBpcyB0byB1c2UgdGhlIENvbnRleHRDbGFzc0xvYWRlcg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBPYmplY3RJbnB1dFN0cmVhbVdpdGhDTCBleHRlbmRzIGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW0NCi17DQotDQotICAgIC8qKg0KLSAgICAgKiA8cD4NCi0gICAgICogVGhpcyBpbnRlcmZhY2UgaXMgdXNlZCB0byByZXNvbHZlIE9TR2kgZGVjbGFyZWQgc2VyaWFsaXphYmxlIGNsYXNzZXMuDQotICAgICAqIDwvcD4NCi0gICAgICovDQotICAgIHB1YmxpYyBpbnRlcmZhY2UgQ2xhc3NSZXNvbHZlcg0KLSAgICB7DQotICAgICAgICAvKioNCi0gICAgICAgICAqIEF0dGVtcHQgdG8gbG9hZCB0aGUgc3BlY2lmaWVkIGNsYXNzLg0KLSAgICAgICAgICogDQotICAgICAgICAgKiBAcGFyYW0gY2xhc3NOYW1lDQotICAgICAgICAgKiAgICAgICAgICAgIFRoZSBjbGFzc25hbWUuDQotICAgICAgICAgKiBAcmV0dXJuIFRoZSBjbGFzcywgb3IgbnVsbCBpZiBub3QgZm91bmQuDQotICAgICAgICAgKi8NCi0gICAgICAgIHB1YmxpYyBDbGFzcyByZXNvbHZlQ2xhc3MoU3RyaW5nIGNsYXNzTmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSGFzaE1hcCBwcmltQ2xhc3NlcyA9IG5ldyBIYXNoTWFwKDgsIDEuMEYpOw0KLQ0KLSAgICAvKiogVGhlIGNsYXNzIHJlc29sdmVyICovDQotDQotICAgIHByb3RlY3RlZCBDbGFzc1Jlc29sdmVyIHJlc29sdmVyOw0KLSAgICBzdGF0aWMNCi0gICAgew0KLSAgICAgICAgcHJpbUNsYXNzZXMucHV0KCJib29sZWFuIiwgYm9vbGVhbi5jbGFzcyk7DQotICAgICAgICBwcmltQ2xhc3Nlcy5wdXQoImJ5dGUiLCBieXRlLmNsYXNzKTsNCi0gICAgICAgIHByaW1DbGFzc2VzLnB1dCgiY2hhciIsIGNoYXIuY2xhc3MpOw0KLSAgICAgICAgcHJpbUNsYXNzZXMucHV0KCJzaG9ydCIsIHNob3J0LmNsYXNzKTsNCi0gICAgICAgIHByaW1DbGFzc2VzLnB1dCgiaW50IiwgaW50LmNsYXNzKTsNCi0gICAgICAgIHByaW1DbGFzc2VzLnB1dCgibG9uZyIsIGxvbmcuY2xhc3MpOw0KLSAgICAgICAgcHJpbUNsYXNzZXMucHV0KCJmbG9hdCIsIGZsb2F0LmNsYXNzKTsNCi0gICAgICAgIHByaW1DbGFzc2VzLnB1dCgiZG91YmxlIiwgZG91YmxlLmNsYXNzKTsNCi0gICAgICAgIHByaW1DbGFzc2VzLnB1dCgidm9pZCIsIHZvaWQuY2xhc3MpOw0KLQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBDbGFzc0xvYWRlciBjbGFzc2xvYWRlcjsNCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBuYW1lOw0KLQ0KLSAgICAvKioNCi0gICAgICogQ29uc3RydWN0IHVzaW5nIENvbnRleHRDbGFzc0xvYWRlcg0KLSAgICAgKiBAcGFyYW0gaXMNCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbg0KLSAgICAgKi8NCi0gICAgcHVibGljIE9iamVjdElucHV0U3RyZWFtV2l0aENMKElucHV0U3RyZWFtIGlzKSB0aHJvd3MgSU9FeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgc3VwZXIoaXMpOw0KLSAgICAgICAgDQotICAgICAgICBjbGFzc2xvYWRlciA9IChDbGFzc0xvYWRlcikgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRBY3Rpb24oKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOyAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICB9ICAgICAgICAgIA0KLSAgICAgICAgfSk7ICAgICAgICAgICAgICAgIA0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBDb25zdHJ1Y3RvciB0aGF0IGFjY2VwdHMgYSBDbGFzc0xvYWRlcg0KLSAgICAgKiBAcGFyYW0gaXMNCi0gICAgICogQHBhcmFtIGNsDQotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24NCi0gICAgICovDQotICAgIHB1YmxpYyBPYmplY3RJbnB1dFN0cmVhbVdpdGhDTChJbnB1dFN0cmVhbSBpcywgQ2xhc3NMb2FkZXIgY2wpIHRocm93cyBJT0V4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBzdXBlcihpcyk7DQotICAgICAgICBjbGFzc2xvYWRlciA9IGNsOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogQ29uc3RydWN0b3IgdGhhdCBhY2NlcHRzIGEgQ2xhc3NSZXNvbHZlcg0KLSAgICAgKiBAcGFyYW0gaXMNCi0gICAgICogQHBhcmFtIHIgQ2xhc3NSZXNvbHZlcg0KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uDQotICAgICAqLw0KLSAgICBwdWJsaWMgT2JqZWN0SW5wdXRTdHJlYW1XaXRoQ0woSW5wdXRTdHJlYW0gaXMsIENsYXNzUmVzb2x2ZXIgcikgdGhyb3dzIElPRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHN1cGVyKGlzKTsNCi0gICAgICAgIHJlc29sdmVyID0gcjsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogT3ZlcnJpZGUgcmVzb2x2ZUNsYXNzIHNvIHRoYXQgd2UgY2FuIHVzZSBvdXIgb3duIENsYXNzTG9hZGVyDQotICAgICAqLw0KLSAgICBwcm90ZWN0ZWQgQ2xhc3MgcmVzb2x2ZUNsYXNzKE9iamVjdFN0cmVhbUNsYXNzIG9ialN0cm1DbGFzcykgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHJlc29sdmVDbGFzcyhvYmpTdHJtQ2xhc3MuZ2V0TmFtZSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIENsYXNzIHJlc29sdmVDbGFzcyhTdHJpbmcgbmFtZSkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsNCi0gICAgICAgICAgICByZXR1cm4gKENsYXNzKSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChsb2FkQWN0aW9uKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb24gcGFlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEV4Y2VwdGlvbiB3cmFwcGVkID0gcGFlLmdldEV4Y2VwdGlvbigpOw0KLSAgICAgICAgICAgIGlmICh3cmFwcGVkIGluc3RhbmNlb2YgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbikgdGhyb3cgKENsYXNzTm90Rm91bmRFeGNlcHRpb24pIHdyYXBwZWQ7DQotICAgICAgICAgICAgdGhyb3cgbmV3IENsYXNzTm90Rm91bmRFeGNlcHRpb24obmFtZSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uIGxvYWRBY3Rpb24gPSANCi0gICAgICAgIG5ldyBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24oKQ0KLSAgICB7DQotICAgICAgICBwdWJsaWMgamF2YS5sYW5nLk9iamVjdCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgICAgICB7DQotICAgICAgICAgICAgdHJ5DQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBDbGFzcyBjbGF6eiA9IG51bGw7DQotICAgICAgICAgICAgICAgIC8vIElmIHRoZSByZXNvbHZlciBpcyBzZXQNCi0gICAgICAgICAgICAgICAgaWYgKHJlc29sdmVyICE9IG51bGwpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIC8vIHVzZSB0aGUgcmVzb2x2ZXIgdG8gbG9hZCB0aGUgY2xhc3MuDQotICAgICAgICAgICAgICAgICAgICBjbGF6eiA9IHJlc29sdmVyLnJlc29sdmVDbGFzcyhuYW1lKTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAvLyBpZiB0aGUgY2xhc3MgaXMgbm90IGxvYWRhYmxlDQotICAgICAgICAgICAgICAgIGlmIChjbGF6eiA9PSBudWxsKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBjbGF6eiA9IGxvYWRDbGFzcyhuYW1lLCBjbGFzc2xvYWRlcik7IC8vIGQyOTY0MTYNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICByZXR1cm4gY2xheno7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGNuZikNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIENsYXNzIGMgPSAoQ2xhc3MpIHByaW1DbGFzc2VzLmdldChuYW1lKTsNCi0gICAgICAgICAgICAgICAgaWYgKGMgIT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGM7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgdGhyb3cgY25mOw0KLSAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICB9IA0KLSAgICAgICAgfQ0KLSAgICB9Ow0KLQ0KLSAgICAvLyBkMjk2NDE2OiBVc2UgcnVudGltZSBidW5kbGUgY2xhc3Nsb2FkZXIgKGN1cnJlbnQpIHRvIHJlc29sdmUgYSBjbGFzcyB3aGVuDQotICAgIC8vIHRoZSBjbGFzcyBjb3VsZCBub3QgYmUgcmVzb2x2ZWQgdXNpbmcgdGhlIHNwZWNpZmllZCBjbGFzc2xvYWRlci4NCi0gICAgLy8gQSBzZXJpYWxpemFibGUgY2xhc3MgaW4gYSBidW5kbGUgc2hvdWxkIHNwZWNpZnkgdmlhDQotICAgIC8vIDxjb20uaWJtLndzLnJ1bnRpbWUuc2VyaWFsaXphYmxlPiBidW5kbGUgZXh0ZW5zaW9uIHBvaW50DQotICAgIC8vIHRoYXQgaXQgaXMgZGVzZXJpYWxpemFibGUgb3V0c2lkZSB0aGUgY3VycmVudCBidW5kbGUuDQotICAgIC8vIE5PVEU6IExvb2tpbmcgdXAgY3VycmVudCBjbGFzc2xvYWRlciBpcyBvbmx5IGEgdGFjdGljYWwgc29sdXRpb24sDQotICAgIC8vIGFuZCBjb3VsZCBiZSBkZXByZWNhdGVkIGluIGZ1dHVyZS4NCi0gICAgLy8gDQotICAgIHByaXZhdGUgamF2YS5sYW5nLkNsYXNzIGxvYWRDbGFzcyhmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgQ2xhc3NMb2FkZXIgbG9hZGVyKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0cnkgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gKENsYXNzKSBvcmcuYXBhY2hlLmF4aXMyLmphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoDQotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24oKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENsYXNzLmZvck5hbWUobmFtZSwgdHJ1ZSwgbG9hZGVyKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgKTsNCi0gICAgICAgICAgICB9IGNhdGNoIChQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICAgICAgdGhyb3cgKENsYXNzTm90Rm91bmRFeGNlcHRpb24pIGUuZ2V0RXhjZXB0aW9uKCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gY25mKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgIHJldHVybiAoQ2xhc3MpIG9yZy5hcGFjaGUuYXhpczIuamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgNCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbigpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ2xhc3MuZm9yTmFtZShuYW1lKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgKTsNCi0gICAgICAgICAgICB9IGNhdGNoIChQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICAgICAgdGhyb3cgKENsYXNzTm90Rm91bmRFeGNlcHRpb24pIGUuZ2V0RXhjZXB0aW9uKCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIA0KLSAgICAvKioNCi0gICAgICogT3ZlcnJpZGUgdG8gcHJvdmlkZSBvdXIgb3duIHJlc29sdXRpb24NCi0gICAgICovDQotICAgIHByb3RlY3RlZCBDbGFzcyByZXNvbHZlUHJveHlDbGFzcyhTdHJpbmdbXSBpbnRlcmZhY2VzKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBpZiAoaW50ZXJmYWNlcy5sZW5ndGggPT0gMCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbigiemVyby1sZW5ndGggaW50ZXJmYWNlcyBhcnJheSIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgQ2xhc3Mgbm9uUHVibGljQ2xhc3MgPSBudWxsOw0KLQ0KLSAgICAgICAgZmluYWwgQ2xhc3NbXSBjbGFzc2VzID0gbmV3IENsYXNzW2ludGVyZmFjZXMubGVuZ3RoXTsNCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW50ZXJmYWNlcy5sZW5ndGg7IGkrKykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjbGFzc2VzW2ldID0gcmVzb2x2ZUNsYXNzKGludGVyZmFjZXNbaV0pOw0KLQ0KLSAgICAgICAgICAgIGlmICgoY2xhc3Nlc1tpXS5nZXRNb2RpZmllcnMoKSAmIE1vZGlmaWVyLlBVQkxJQykgPT0gMCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIC8vICJpZiBtb3JlIHRoYW4gb25lIG5vbi1wdWJsaWMgaW50ZXJmYWNlIGNsYXNzIGxvYWRlciBpcw0KLSAgICAgICAgICAgICAgICAvLyBlbmNvdW50ZXJlZCwgYW4gSWxsZWdhbEFjY2Vzc0Vycm9yIGlzIHRocm93biINCi0gICAgICAgICAgICAgICAgaWYgKG5vblB1YmxpY0NsYXNzICE9IG51bGwpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQWNjZXNzRXJyb3Iobm9uUHVibGljQ2xhc3MgKyAiIGFuZCAiICsgY2xhc3Nlc1tpXSArICIgYm90aCBkZWNsYXJlZCBub24tcHVibGljIik7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgbm9uUHVibGljQ2xhc3MgPSBjbGFzc2VzW2ldOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vIFRoZSBqYXZhZG9jcyBmb3IgdGhpcyBtZXRob2Qgc2F5Og0KLSAgICAgICAgLy8NCi0gICAgICAgIC8vICJVbmxlc3MgYW55IG9mIHRoZSByZXNvbHZlZCBpbnRlcmZhY2VzIGFyZSBub24tcHVibGljLCB0aGlzIHNhbWUNCi0gICAgICAgIC8vIHZhbHVlIG9mIGxvYWRlciBpcyBhbHNvIHRoZSBjbGFzcyBsb2FkZXIgcGFzc2VkIHRvDQotICAgICAgICAvLyBQcm94eS5nZXRQcm94eUNsYXNzOyBpZiBub24tcHVibGljIGludGVyZmFjZXMgYXJlIHByZXNlbnQsIHRoZWlyDQotICAgICAgICAvLyBjbGFzcyBsb2FkZXIgaXMgcGFzc2VkIGluc3RlYWQiDQotICAgICAgICAvLw0KLSAgICAgICAgLy8gVW5mb3J0dW5hdGVseSwgd2UgZG9uJ3QgaGF2ZSBhIHNpbmdsZSBjbGFzc2xvYWRlciB0aGF0IHdlIGNhbiB1c2UuDQotICAgICAgICAvLyBDYWxsIGdldENsYXNzTG9hZGVyKCkgb24gZWl0aGVyIHRoZSBub24tcHVibGljIGNsYXNzIChpZiBhbnkpIG9yIHRoZQ0KLSAgICAgICAgLy8gZmlyc3QgY2xhc3MuDQotICAgICAgICBwcm94eUNsYXNzID0gbm9uUHVibGljQ2xhc3MgIT0gbnVsbCA/IG5vblB1YmxpY0NsYXNzIDogY2xhc3Nlc1swXTsNCi0gICAgICAgIGZpbmFsIENsYXNzTG9hZGVyIGxvYWRlciA9IChDbGFzc0xvYWRlcikgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQocHJveHlDbGFzc0xvYWRlckFjdGlvbik7DQotDQotICAgICAgICAvLyAiSWYgUHJveHkuZ2V0UHJveHlDbGFzcyB0aHJvd3MgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLA0KLSAgICAgICAgLy8gcmVzb2x2ZVByb3h5Q2xhc3Mgd2lsbCB0aHJvdyBhIENsYXNzTm90Rm91bmRFeGNlcHRpb24gY29udGFpbmluZyB0aGUNCi0gICAgICAgIC8vIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi4iDQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gKENsYXNzKSBvcmcuYXBhY2hlLmF4aXMyLmphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoDQotICAgICAgICAgICAgICAgICAgICBuZXcgUHJpdmlsZWdlZEFjdGlvbigpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb3h5LmdldFByb3h5Q2xhc3MobG9hZGVyLCBjbGFzc2VzKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IENsYXNzTm90Rm91bmRFeGNlcHRpb24oZXguZ2V0TWVzc2FnZSgpLCBleCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBDbGFzcyBwcm94eUNsYXNzOw0KLSAgICBQcml2aWxlZ2VkQWN0aW9uIHByb3h5Q2xhc3NMb2FkZXJBY3Rpb24gPSBuZXcgUHJpdmlsZWdlZEFjdGlvbigpDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gcHJveHlDbGFzcy5nZXRDbGFzc0xvYWRlcigpOw0KLSAgICAgICAgfQ0KLSAgICB9Ow0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY29udGV4dC9leHRlcm5hbGl6ZS9TYWZlT2JqZWN0SW5wdXRTdHJlYW0uamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb250ZXh0L2V4dGVybmFsaXplL1NhZmVPYmplY3RJbnB1dFN0cmVhbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmFkMzg3Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb250ZXh0L2V4dGVybmFsaXplL1NhZmVPYmplY3RJbnB1dFN0cmVhbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzk3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5leHRlcm5hbGl6ZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dDsNCi1pbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5PYmplY3RTdHJlYW1Db25zdGFudHM7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogQSBTYWZlT2JqZWN0SW5wdXRTdHJlYW0gcmVhZHMgZGF0YSB0aGF0IHdhcyB3cml0dGVuIGJ5IFNhZmVPYmplY3RPdXRwdXRTdHJlYW0NCi0gKiANCi0gKiBAc2VlIFNhZmVPYmplY3RJbnB1dA0KLSAqLw0KLXB1YmxpYyBjbGFzcyBTYWZlT2JqZWN0SW5wdXRTdHJlYW0gaW1wbGVtZW50cyBPYmplY3RJbnB1dCwgT2JqZWN0U3RyZWFtQ29uc3RhbnRzIHsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFNhZmVPYmplY3RJbnB1dFN0cmVhbS5jbGFzcyk7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNEZWJ1ZyA9IGxvZy5pc0RlYnVnRW5hYmxlZCgpOw0KLSAgICANCi0gICAgLy8gQWxsIGRhdGEgaXMgcmVhZCBmcm9tIHRoZSBkZWxlZ2F0ZWQgT2JqZWN0SW5wdXQNCi0gICAgT2JqZWN0SW5wdXQgaW4gPSBudWxsOw0KLSAgICBmaW5hbCBPYmplY3RJbnB1dCBvcmlnaW5hbDsNCi0gICAgDQotICAgIC8vIEEgYnVmZmVyIGlzIHVzZWQgd2hlbiBPYmplY3QgaXMgcGVyc2lzdGVkIGFzIGJ5dGVzDQotICAgIHByaXZhdGUgYnl0ZVtdIGJ1ZmZlciA9IG51bGw7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCVUZGRVJfTUlOX1NJWkUgPSA0MDk2Ow0KLSAgICANCi0gICAgLyoqDQotICAgICAqIEFkZCB0aGUgU2FmZU9iamVjdElucHV0U3RyZWFtIGlmIG5lY2Vzc2FyeQ0KLSAgICAgKiBAcGFyYW0gaW4NCi0gICAgICogQHJldHVybg0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyBTYWZlT2JqZWN0SW5wdXRTdHJlYW0gaW5zdGFsbChPYmplY3RJbnB1dCBpbikgew0KLSAgICAgICAgaWYgKGluIGluc3RhbmNlb2YgU2FmZU9iamVjdElucHV0U3RyZWFtKSB7DQotICAgICAgICAgICAgcmV0dXJuIChTYWZlT2JqZWN0SW5wdXRTdHJlYW0pIGluOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG5ldyBTYWZlT2JqZWN0SW5wdXRTdHJlYW0oaW4pOw0KLSAgICB9DQotICAgIA0KLSAgICANCi0gICAgLyoqDQotICAgICAqIEludGVudGlvbmFsbHkgcHJpdmF0ZS4gIENhbGxlcnMgc2hvdWxkIHVzZSB0aGUgaW5zdGFsbCBtZXRob2QgdG8gYWRkIHRoZSBTYWZlT2JqZWN0SW5wdXRTdHJlYW0NCi0gICAgICogaW50byB0aGUgc3RyZWFtLg0KLSAgICAgKiBAcGFyYW0gaW4NCi0gICAgICovDQotICAgIHByaXZhdGUgU2FmZU9iamVjdElucHV0U3RyZWFtKE9iamVjdElucHV0IGluKSB7DQotICAgICAgICBvcmlnaW5hbCA9IGluOw0KLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgdGhpcy5pbiA9IG5ldyBEZWJ1Z09iamVjdElucHV0KG9yaWdpbmFsKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgdGhpcy5pbiA9IG9yaWdpbmFsOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICAvLyAgRGVsZWdhdGVkIE1ldGhvZHMNCi0gICAgcHVibGljIGludCBhdmFpbGFibGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLSAgICAgICAgcmV0dXJuIGluLmF2YWlsYWJsZSgpOw0KLSAgICB9DQotICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIGluLmNsb3NlKCk7DQotICAgIH0NCi0gICAgcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIHJldHVybiBpbi5yZWFkKCk7DQotICAgIH0NCi0gICAgcHVibGljIGludCByZWFkKGJ5dGVbXSBiLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLSAgICAgICAgcmV0dXJuIGluLnJlYWQoYiwgb2ZmLCBsZW4pOw0KLSAgICB9DQotICAgIHB1YmxpYyBpbnQgcmVhZChieXRlW10gYikgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIHJldHVybiBpbi5yZWFkKGIpOw0KLSAgICB9DQotICAgIHB1YmxpYyBib29sZWFuIHJlYWRCb29sZWFuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIHJldHVybiBpbi5yZWFkQm9vbGVhbigpOw0KLSAgICB9DQotICAgIHB1YmxpYyBieXRlIHJlYWRCeXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIHJldHVybiBpbi5yZWFkQnl0ZSgpOw0KLSAgICB9DQotICAgIHB1YmxpYyBjaGFyIHJlYWRDaGFyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIHJldHVybiBpbi5yZWFkQ2hhcigpOw0KLSAgICB9DQotICAgIHB1YmxpYyBkb3VibGUgcmVhZERvdWJsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICByZXR1cm4gaW4ucmVhZERvdWJsZSgpOw0KLSAgICB9DQotICAgIHB1YmxpYyBmbG9hdCByZWFkRmxvYXQoKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLSAgICAgICAgcmV0dXJuIGluLnJlYWRGbG9hdCgpOw0KLSAgICB9DQotICAgIHB1YmxpYyB2b2lkIHJlYWRGdWxseShieXRlW10gYiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIGluLnJlYWRGdWxseShiLCBvZmYsIGxlbik7DQotICAgIH0NCi0gICAgcHVibGljIHZvaWQgcmVhZEZ1bGx5KGJ5dGVbXSBiKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLSAgICAgICAgaW4ucmVhZEZ1bGx5KGIpOw0KLSAgICB9DQotICAgIHB1YmxpYyBpbnQgcmVhZEludCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICByZXR1cm4gaW4ucmVhZEludCgpOw0KLSAgICB9DQotICAgIHB1YmxpYyBTdHJpbmcgcmVhZExpbmUoKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLSAgICAgICAgcmV0dXJuIGluLnJlYWRMaW5lKCk7DQotICAgIH0NCi0gICAgcHVibGljIGxvbmcgcmVhZExvbmcoKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLSAgICAgICAgcmV0dXJuIGluLnJlYWRMb25nKCk7DQotICAgIH0NCi0gICAgcHVibGljIE9iamVjdCByZWFkT2JqZWN0KCkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIHJldHVybiByZWFkT2JqZWN0T3ZlcnJpZGUoKTsNCi0gICAgfQ0KLSAgICBwdWJsaWMgc2hvcnQgcmVhZFNob3J0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIHJldHVybiBpbi5yZWFkU2hvcnQoKTsNCi0gICAgfQ0KLSAgICBwdWJsaWMgaW50IHJlYWRVbnNpZ25lZEJ5dGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLSAgICAgICAgcmV0dXJuIGluLnJlYWRVbnNpZ25lZEJ5dGUoKTsNCi0gICAgfQ0KLSAgICBwdWJsaWMgaW50IHJlYWRVbnNpZ25lZFNob3J0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIHJldHVybiBpbi5yZWFkVW5zaWduZWRTaG9ydCgpOw0KLSAgICB9DQotICAgIHB1YmxpYyBTdHJpbmcgcmVhZFVURigpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICByZXR1cm4gaW4ucmVhZFVURigpOw0KLSAgICB9DQotICAgIHB1YmxpYyBsb25nIHNraXAobG9uZyBuKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLSAgICAgICAgcmV0dXJuIGluLnNraXAobik7DQotICAgIH0NCi0gICAgcHVibGljIGludCBza2lwQnl0ZXMoaW50IG4pIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICByZXR1cm4gaW4uc2tpcEJ5dGVzKG4pOw0KLSAgICB9DQotICAgIA0KLSAgICAvLyBWYWx1ZSBBZGQgTWV0aG9kcw0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFJlYWQgdGhlIGlucHV0IHN0cmVhbSBhbmQgcGxhY2UgdGhlIGtleS92YWx1ZSBwYWlycyBpbiBhIGhhc2htYXANCi0gICAgICogQHJldHVybiBIYXNoTWFwIG9yIG51bGwNCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbg0KLSAgICAgKiBAc2VlIFNhZmVPYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVNYXAoKQ0KLSAgICAgKi8NCi0gICAgcHVibGljIEhhc2hNYXAgcmVhZEhhc2hNYXAoKSB0aHJvd3MgSU9FeGNlcHRpb24gIHsNCi0gICAgICAgIEhhc2hNYXAgaGFzaE1hcCA9IG5ldyBIYXNoTWFwKCk7DQotICAgICAgICByZXR1cm4gKEhhc2hNYXApIHJlYWRNYXAoaGFzaE1hcCk7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBSZWFkIHRoZSBpbnB1dCBzdHJlYW0gYW5kIHBsYWNlIHRoZSBrZXkvdmFsdWUgcGFpcnMgaW4gdGhlDQotICAgICAqIGluZGljYXRlZCBNYXANCi0gICAgICogQHBhcmFtIG1hcCBpbnB1dCBtYXANCi0gICAgICogQHJldHVybiBtYXAgb3IgbnVsbA0KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uDQotICAgICAqIEBzZWUgU2FmZU9iamVjdE91dHB1dFN0cmVhbS53cml0ZU1hcCgpDQotICAgICAqLw0KLSAgICBwdWJsaWMgTWFwIHJlYWRNYXAoTWFwIG1hcCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIGJvb2xlYW4gaXNBY3RpdmUgPSBpbi5yZWFkQm9vbGVhbigpOw0KLSAgICAgICAgaWYgKCFpc0FjdGl2ZSkgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICB3aGlsZSAoaW4ucmVhZEJvb2xlYW4oKSkgew0KLSAgICAgICAgICAgIE9iamVjdCBrZXkgPSBudWxsOw0KLSAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IG51bGw7DQotDQotICAgICAgICAgICAgYm9vbGVhbiBpc09iamVjdEZvcm0gPSBpbi5yZWFkQm9vbGVhbigpOw0KLSAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgIGlmIChpc09iamVjdEZvcm0pIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChpc0RlYnVnKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgcmVhZGluZyB1c2luZyBvYmplY3QgZm9ybSIpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgLy8gUmVhZCB0aGUga2V5IGFuZCB2YWx1ZSBkaXJlY3RseQ0KLSAgICAgICAgICAgICAgICAgICAga2V5ID0gaW4ucmVhZE9iamVjdCgpOw0KLSAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBpbi5yZWFkT2JqZWN0KCk7DQotICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoaXNEZWJ1Zykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiIHJlYWRpbmcgdXNpbmcgYnl0ZSBmb3JtIik7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIGJ5dGUgc3RyZWFtDQotICAgICAgICAgICAgICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBiYWlzID0gZ2V0Qnl0ZVN0cmVhbShpbik7DQotDQotICAgICAgICAgICAgICAgICAgICAvLyBOb3cgZ2V0IHRoZSByZWFsIGtleSBhbmQgdmFsdWUNCi0gICAgICAgICAgICAgICAgICAgIE9iamVjdElucHV0U3RyZWFtIHRlbXBPSVMgPSBjcmVhdGVPYmplY3RJbnB1dFN0cmVhbShiYWlzKTsNCi0gICAgICAgICAgICAgICAgICAgIGtleSA9IHRlbXBPSVMucmVhZE9iamVjdCgpOw0KLSAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB0ZW1wT0lTLnJlYWRPYmplY3QoKTsNCi0gICAgICAgICAgICAgICAgICAgIHRlbXBPSVMuY2xvc2UoKTsNCi0gICAgICAgICAgICAgICAgICAgIGJhaXMuY2xvc2UoKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAvLyBQdXQgdGhlIGtleSBhbmQgdmFsdWUgaW4gdGhlIG1hcA0KLSAgICAgICAgICAgICAgICBpZiAoaXNEZWJ1Zykgew0KLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJSZWFkIGtleT0iICsgdmFsdWVOYW1lKGtleSkgKyAiIHZhbHVlPSIrdmFsdWVOYW1lKHZhbHVlKSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgbWFwLnB1dChrZXksIHZhbHVlKTsNCi0gICAgICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICAgICAgLy8gU3dhbGxvdyB0aGUgZXJyb3IgYW5kIHRyeSB0byBjb250aW51ZQ0KLSAgICAgICAgICAgICAgICBsb2cuZXJyb3IoZSk7DQotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgICAgICB0aHJvdyBlOw0KLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgICAgIHRocm93IEF4aXNGYXVsdC5tYWtlRmF1bHQoZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG1hcDsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFJlYWQgdGhlIGlucHV0IHN0cmVhbSBhbmQgcGxhY2Ugb2JqZWN0cyBpbiBhbiBBcnJheUxpc3QNCi0gICAgICogQHJldHVybiBBcnJheUxpc3Qgb3IgbnVsbA0KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uDQotICAgICAqIEBzZWUgU2FmZU9iamVjdElucHV0U3RyZWFtLndyaXRlTGlzdCgpDQotICAgICAqLw0KLSAgICBwdWJsaWMgQXJyYXlMaXN0IHJlYWRBcnJheUxpc3QoKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLSAgICAgICAgTGlzdCBsbCA9IG5ldyBBcnJheUxpc3QoKTsNCi0gICAgICAgIHJldHVybiAoQXJyYXlMaXN0KSByZWFkTGlzdChsbCk7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBSZWFkIHRoZSBpbnB1dCBzdHJlYW0gYW5kIHBsYWNlIG9iamVjdHMgaW4gYSBMaW5rZWRMaXN0DQotICAgICAqIEByZXR1cm4gTGlua2VkTGlzdCBvciBudWxsDQotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24NCi0gICAgICogQHNlZSBTYWZlT2JqZWN0SW5wdXRTdHJlYW0ud3JpdGVMaXN0KCkNCi0gICAgICovDQotICAgIHB1YmxpYyBMaW5rZWRMaXN0IHJlYWRMaW5rZWRMaXN0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgTGlzdCBsbCA9IG5ldyBMaW5rZWRMaXN0KCk7DQotICAgICAgIHJldHVybiAoTGlua2VkTGlzdCkgcmVhZExpc3QobGwpOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogUmVhZCBodGUgaW5wdXQgc3RyZWFtIGFuZCBwbGFjZSBvYmplY3RzIGluIHRoZSBzcGVjaWZpZWQgTGlzdA0KLSAgICAgKiBAcGFyYW0gbGlzdCBMaXN0DQotICAgICAqIEByZXR1cm4gTGlzdCBvciBudWxsDQotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24NCi0gICAgICogQHNlZSBTYWZlT2JqZWN0SW5wdXRTdHJlYW0ud3JpdGVMaXN0KCkNCi0gICAgICovDQotICAgIHB1YmxpYyBMaXN0IHJlYWRMaXN0KExpc3QgbGlzdCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIGJvb2xlYW4gaXNBY3RpdmUgPSBpbi5yZWFkQm9vbGVhbigpOw0KLSAgICAgICAgaWYgKCFpc0FjdGl2ZSkgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICB3aGlsZSAoaW4ucmVhZEJvb2xlYW4oKSkgew0KLSAgICAgICAgICAgIE9iamVjdCB2YWx1ZTsNCi0gICAgICAgICAgICBib29sZWFuIGlzT2JqZWN0Rm9ybSA9IGluLnJlYWRCb29sZWFuKCk7DQotICAgICAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICAgICAgaWYgKGlzT2JqZWN0Rm9ybSkgew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzRGVidWcpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIiByZWFkaW5nIHVzaW5nIG9iamVjdCBmb3JtIik7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAvLyBSZWFkIHRoZSB2YWx1ZSBkaXJlY3RseQ0KLSAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBpbi5yZWFkT2JqZWN0KCk7DQotICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoaXNEZWJ1Zykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiIHJlYWRpbmcgdXNpbmcgYnl0ZSBmb3JtIik7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIGJ5dGUgc3RyZWFtDQotICAgICAgICAgICAgICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBiYWlzID0gZ2V0Qnl0ZVN0cmVhbShpbik7DQotDQotICAgICAgICAgICAgICAgICAgICAvLyBOb3cgZ2V0IHRoZSByZWFsIGtleSBhbmQgdmFsdWUNCi0gICAgICAgICAgICAgICAgICAgIE9iamVjdElucHV0U3RyZWFtIHRlbXBPSVMgPSBjcmVhdGVPYmplY3RJbnB1dFN0cmVhbShiYWlzKTsNCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdGVtcE9JUy5yZWFkT2JqZWN0KCk7DQotICAgICAgICAgICAgICAgICAgICB0ZW1wT0lTLmNsb3NlKCk7DQotICAgICAgICAgICAgICAgICAgICBiYWlzLmNsb3NlKCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgLy8gUHV0IHRoZSBrZXkgYW5kIHZhbHVlIGluIHRoZSBsaXN0DQotICAgICAgICAgICAgICAgIGlmIChpc0RlYnVnKSB7DQotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlJlYWQgdmFsdWU9Iit2YWx1ZU5hbWUodmFsdWUpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBsaXN0LmFkZCh2YWx1ZSk7DQotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgICAgICB0aHJvdyBlOw0KLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgICAgIHRocm93IEF4aXNGYXVsdC5tYWtlRmF1bHQoZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGxpc3Q7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBSZWFkcyB0aGUgb2JqZWN0IHVzaW5nIHRoZSBzYW1lIGZvcm1hdCB0aGF0IHdhcyB3cml0dGVuLg0KLSAgICAgKiANCi0gICAgICogRVhQRUNURUQgRk9STUFUUw0KLSAgICAgKiAgIGJvb2xlYW49ZmFsc2UNCi0gICAgICogICByZXR1cm4gbnVsbCBPYmplY3QNCi0gICAgICogICANCi0gICAgICogICANCi0gICAgICogICBib29sZWFuPXRydWUNCi0gICAgICogICBib29sZWFuPXRydWUNCi0gICAgICogICByZXR1cm4gT2JqZWN0IHJlYWQgZnJvbSBpbnB1dFN0cmVhbQ0KLSAgICAgKiAgIA0KLSAgICAgKiAgIA0KLSAgICAgKiAgIGJvb2xlYW49dHJ1ZQ0KLSAgICAgKiAgIGJvb2xlYW49ZmFsc2UNCi0gICAgICogICBpbnQ9bnViZXIgb2YgYnl0ZXMNCi0gICAgICogICBieXRlcw0KLSAgICAgKiAgIHJldHVybiBPYmplY3QgcmVhZCBmcm9tIGJ5dGVzDQotICAgICAqICAgDQotICAgICAqIEByZXR1cm4gT2JqZWN0IG9yIG51bGwNCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbg0KLSAgICAgKiBAdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24NCi0gICAgICovDQotICAgIHByaXZhdGUgT2JqZWN0IHJlYWRPYmplY3RPdmVycmlkZSgpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7DQotICAgICAgICBib29sZWFuIGlzQWN0aXZlID0gaW4ucmVhZEJvb2xlYW4oKTsNCi0gICAgICAgIGlmICghaXNBY3RpdmUpIHsNCi0gICAgICAgICAgICBpZiAoaXNEZWJ1Zykgew0KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlJlYWQgb2JqZWN0PW51bGwiKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgICAgICBPYmplY3Qgb2JqID0gbnVsbDsNCi0gICAgICAgIGJvb2xlYW4gaXNPYmplY3RGb3JtID0gaW4ucmVhZEJvb2xlYW4oKTsNCi0gICAgICAgIGlmIChpc09iamVjdEZvcm0pIHsNCi0gICAgICAgICAgICAvLyBSZWFkIHRoZSBvYmplY3QgZGlyZWN0bHkNCi0gICAgICAgICAgICBpZiAoaXNEZWJ1Zykgew0KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIiByZWFkaW5nIHVzaW5nIG9iamVjdCBmb3JtIik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIG9iaiA9IGluLnJlYWRPYmplY3QoKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgaWYgKGlzRGVidWcpIHsNCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgcmVhZGluZyB1c2luZyBieXRlIGZvcm0iKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgLy8gR2V0IHRoZSBieXRlIHN0cmVhbQ0KLSAgICAgICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGJhaXMgPSBnZXRCeXRlU3RyZWFtKGluKTsNCi0NCi0gICAgICAgICAgICAvLyBOb3cgZ2V0IHRoZSByZWFsIG9iamVjdA0KLSAgICAgICAgICAgIE9iamVjdElucHV0U3RyZWFtIHRlbXBPSVMgPSBjcmVhdGVPYmplY3RJbnB1dFN0cmVhbShiYWlzKTsNCi0gICAgICAgICAgICBvYmogPSB0ZW1wT0lTLnJlYWRPYmplY3QoKTsNCi0gICAgICAgICAgICB0ZW1wT0lTLmNsb3NlKCk7DQotICAgICAgICAgICAgYmFpcy5jbG9zZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICBpZiAoaXNEZWJ1Zykgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiUmVhZCBvYmplY3Q9IiArIHZhbHVlTmFtZShvYmopKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBvYmo7ICAgDQotICAgICAgICANCi0gICAgfQ0KLSAgICANCi0gICAgcHJpdmF0ZSBTdHJpbmcgdmFsdWVOYW1lKE9iamVjdCBvYmopIHsNCi0gICAgICAgIGlmIChvYmogPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiAibnVsbCI7DQotICAgICAgICB9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFN0cmluZykgew0KLSAgICAgICAgICAgIHJldHVybiAoU3RyaW5nKSBvYmo7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIHJldHVybiAiT2JqZWN0IG9mIGNsYXNzID0gIiArIG9iai5nZXRDbGFzcygpLmdldE5hbWUoKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIEdldCB0aGUgYnl0ZSBzdHJlYW0gZm9yIGFuIG9iamVjdCB0aGF0IGlzIHdyaXR0ZW4gdXNpbmcgdGhlIA0KLSAgICAgKiBieXRlIGZvcm1hdC4gIA0KLSAgICAgKiBFWFBFQ1RFRCBmb3JtYXQNCi0gICAgICogICAgIGludCAobnVtYmVyIG9mIGJ5dGVzKQ0KLSAgICAgKiAgICAgYnl0ZXMgDQotICAgICAqICAgICANCi0gICAgICogQHBhcmFtIGluDQotICAgICAqIEByZXR1cm4NCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbg0KLSAgICAgKiBAdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24NCi0gICAgICovDQotICAgIHByaXZhdGUgQnl0ZUFycmF5SW5wdXRTdHJlYW0gZ2V0Qnl0ZVN0cmVhbShPYmplY3RJbnB1dCBpbikgdGhyb3dzIElPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gUmVhZCB0aGUgbGVuZ3RoDQotICAgICAgICBpbnQgc2l6ZSA9IGluLnJlYWRJbnQoKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gRmlsbCBvdXIgdGVtcG9yYXJ5IGJ1ZmZlcg0KLSAgICAgICAgaWYgKGJ1ZmZlciA9PSBudWxsIHx8IGJ1ZmZlci5sZW5ndGggPCBzaXplKSB7DQotICAgICAgICAgICAgaW50IGFsbG9jU2l6ZSA9IChzaXplID4gQlVGRkVSX01JTl9TSVpFKSA/IHNpemUgOiBCVUZGRVJfTUlOX1NJWkU7DQotICAgICAgICAgICAgYnVmZmVyID0gbmV3IGJ5dGVbYWxsb2NTaXplXTsNCi0gICAgICAgIH0NCi0gICAgICAgIGluLnJlYWRGdWxseShidWZmZXIsIDAsIHNpemUpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBSZXR1cm4gYSBzdHJlYW0gYmFja2VkIGJ5IHRoZSBidWZmZXINCi0gICAgICAgIHJldHVybiBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnVmZmVyLCAwLCBzaXplKTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHJpdmF0ZSBPYmplY3RJbnB1dFN0cmVhbSBjcmVhdGVPYmplY3RJbnB1dFN0cmVhbShJbnB1dFN0cmVhbSBpcykgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIC8vIFRoZSBjcmVhdGVkIE9iamVjdElucHV0U3RyZWFtIG11c3QgdXNlIHRoZSBzYW1lIGNsYXNzL29iamVjdCByZXNvbHV0aW9uIA0KLSAgICAgICAgLy8gY29kZSB0aGF0IGlzIHVzZWQgYnkgdGhlIG9yaWdpbmFsIE9iamVjdElucHV0DQotICAgICAgICByZXR1cm4gbmV3IE9iamVjdElucHV0U3RyZWFtV2l0aENMKGlzKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY29udGV4dC9leHRlcm5hbGl6ZS9TYWZlT2JqZWN0T3V0cHV0U3RyZWFtLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY29udGV4dC9leHRlcm5hbGl6ZS9TYWZlT2JqZWN0T3V0cHV0U3RyZWFtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjNWQ5NWEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvbnRleHQvZXh0ZXJuYWxpemUvU2FmZU9iamVjdE91dHB1dFN0cmVhbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzY2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5leHRlcm5hbGl6ZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5pby5Ob3RTZXJpYWxpemFibGVFeGNlcHRpb247DQotaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0Ow0KLWltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0uUHV0RmllbGQ7DQotaW1wb3J0IGphdmEuaW8uT2JqZWN0U3RyZWFtQ29uc3RhbnRzOw0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsNCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsNCi0NCi0vKioNCi0gKiBBIFNhZmVPYmplY3RPdXRwdXRTdHJlYW0gcHJvdmlkZXMgZXh0cmEgbWVjaGFuaXNtcyB0byBlbnN1cmUgdGhhdCANCi0gKiBvYmplY3RzIGNhbiBiZSBzYWZlbHkgc2VyaWFsaXplZCB0byB0aGUgT2JqZWN0T3V0cHV0Lg0KLSAqIA0KLSAqIElmIGFuIE9iamVjdCBpcyB3cml0dGVuIHRvIGEgbm9ybWFsIE9iamVjdE91dHB1dCwgdGhlIE9iamVjdE91dHB1dCBpcyBsZWZ0IGluIA0KLSAqIGFuIHVua25vd24gc3RhdGUgaWYgYSBOb3RTZXJpYWxpemFibGVFeGNlcHRpb24gb2NjdXJzLg0KLSAqIA0KLSAqIFRoZSBTYWZlT2JqZWN0T3V0cHV0U3RyZWFtIGRvZXMgc29tZSBhZGRpdG9uYWwgY2hlY2tpbmcgdG8gZW5zdXJlIHRoYXQgdGhlIE9iamVjdCBjYW4NCi0gKiBiZSBzYWZlbHkgd3JpdHRlbi4gIElmIHRoZSBPYmplY3QgaXMgc3VzcGljaW91cywgaXQgaXMgZmlyc3Qgd3JpdHRlbiB0byBhIGJ1ZmZlciB0byBlbnN1cmUNCi0gKiB0aGF0IHRoZSB1bmRlcmx5aW5nIE9iamVjdE91dHB1dCBpcyBub3QgY29ycnVwdGVkLg0KLSAqIA0KLSAqIEluIGFkZGl0aW9uLCBTYWZlT2JqZWN0T3V0cHV0U3RyZWFtIHByb3ZpZGVzIGV4dHJhIG1ldGhvZHMgdG8gd3JpdGUgY29udGFpbmVycyBvZiBPYmplY3RzLg0KLSAqIEZvciBleGFtcGxlIHRoZSB3cml0ZU1hcCBvYmplY3Qgd2lsbCB3cml0ZSB0aGUga2V5IGFuZCB2YWx1ZSBwYWlycyB0aGF0IGFyZSBjYW4gYmUgc2VyaWFsaXplZC4NCi0gKiANCi0gKiBAc2VlIFNhZmVPYmplY3RJbnB1dFN0cmVhbQ0KLSAqDQotICovDQotcHVibGljIGNsYXNzIFNhZmVPYmplY3RPdXRwdXRTdHJlYW0gaW1wbGVtZW50cyBPYmplY3RPdXRwdXQsDQotICAgICAgICBPYmplY3RTdHJlYW1Db25zdGFudHMsIEV4dGVybmFsaXplQ29uc3RhbnRzIHsNCi0gICAgDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhTYWZlT2JqZWN0T3V0cHV0U3RyZWFtLmNsYXNzKTsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc0RlYnVnID0gbG9nLmlzRGVidWdFbmFibGVkKCk7DQotICAgIA0KLSAgICAvLyBBY3R1YWwgU3RyZWFtIA0KLSAgICBwcml2YXRlIE9iamVjdE91dHB1dCBvdXQgPSBudWxsOw0KLSAgICANCi0gICAgLy8gVGhlcmUgYXJlIHR3byB3YXlzIHRvIHdyaXRlIG91dCBhbiBvYmplY3QsIGEgc2VyaWVzIG9mIGJ5dGVzIG9yIGFuIE9iamVjdC4gIA0KLSAgICAvLyBUaGVzZSBmbGFncyBhcmUgZW1iZWRkZWQgaW4gdGhlIHN0cmVhbSBzbyB0aGF0IHRoZSByZWFkZXIga25vd3Mgd2hpY2ggZm9ybSB3YXMgdXNlZC4NCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBGT1JNX0JZVEUgPSBmYWxzZTsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBGT1JNX09CSkVDVCA9IHRydWU7DQotICAgIA0KLSAgICAvLyBUZW1wb3JhcnkgT2JqZWN0T3V0cHV0U3RyZWFtIGZvcg0KLSAgICBNeU9PUyB0ZW1wT09TID0gbnVsbDsNCi0gICAgDQotICAgIC8vIEFzIGEgd2F5IHRvIGltcHJvdmUgcGVyZm9ybWFuY2UgYW5kIHJlZHVjZSB0cmFjZSBsb2dnaW5nIHdpdGgNCi0gICAgLy8gZXh0cmEgZXhjZXB0aW9ucywga2VlcCBhIHRhYmxlIG9mIGNsYXNzZXMgdGhhdCBhcmUgbm90IHNlcmlhbGl6YWJsZQ0KLSAgICAvLyBhbmQgb25seSBsb2cgdGhlIGZpcnN0IHRpbWUgaXQgdGhhdCB0aGUgY2xhc3MgaXMgZW5jb3VudGVyZWQgaW4NCi0gICAgLy8gYW4gTm90U2VyaWFsaXphYmxlRXhjZXB0aW9uDQotICAgIC8vIG5vdGUgdGhhdCB0aGUgSGFzaHRhYmxlIGlzIHN5bmNocm9uaXplZCBieSBKYXZhIHNvIHdlIHNob3VsZG4ndCBuZWVkIHRvIA0KLSAgICAvLyBkbyBleHRyYSBjb250cm9sIG92ZXIgYWNjZXNzIHRvIHRoZSB0YWJsZQ0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEhhc2h0YWJsZSBub3RTZXJpYWxpemFibGVMaXN0ID0gbmV3IEhhc2h0YWJsZSgpOw0KLSAgICANCi0gICAgLyoqDQotICAgICAqIEFkZCB0aGUgU2FmZU91dHB1dFN0cmVhbSBpZiBuZWNlc3NhcnkuDQotICAgICAqIEBwYXJhbSBvdXQgQ3VycmVudCBPYmplY3RPdXRwdXQNCi0gICAgICogQHJldHVybg0KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIFNhZmVPYmplY3RPdXRwdXRTdHJlYW0gaW5zdGFsbChPYmplY3RPdXRwdXQgb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLSAgICAgICAgaWYgKG91dCBpbnN0YW5jZW9mIFNhZmVPYmplY3RPdXRwdXRTdHJlYW0pIHsNCi0gICAgICAgICAgICByZXR1cm4gKFNhZmVPYmplY3RPdXRwdXRTdHJlYW0pIG91dDsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBuZXcgU2FmZU9iamVjdE91dHB1dFN0cmVhbShvdXQpOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogSW50ZW50aW9uYWxseSBwcml2YXRlLiAgDQotICAgICAqIENhbGxlcnMgc2hvdWxkIHVzZSB0aGUgaW5zdGFsbCBtZXRob2QgdG8gYWRkIHRoZSBTYWZlT2JqZWN0T3V0cHV0U3RyZWFtDQotICAgICAqIGludG8gdGhlIHN0cmVhbS4NCi0gICAgICogQHBhcmFtIG9vDQotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24NCi0gICAgICovDQotICAgIHByaXZhdGUgU2FmZU9iamVjdE91dHB1dFN0cmVhbShPYmplY3RPdXRwdXQgb28pIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICB0aGlzLm91dCA9IG5ldyBEZWJ1Z09iamVjdE91dHB1dFN0cmVhbShvbyk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIHRoaXMub3V0ID0gb287DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgLy8gU1RBUlQgREVMRUdBVEUgTUVUSE9EUw0KLSAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICBpZiAodGVtcE9PUyAhPSBudWxsKSB7DQotICAgICAgICAgICAgdGVtcE9PUy5jbG9zZSgpOw0KLSAgICAgICAgICAgIHRlbXBPT1MgPSBudWxsOw0KLSAgICAgICAgfQ0KLSAgICAgICAgb3V0LmNsb3NlKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgZGVmYXVsdFdyaXRlT2JqZWN0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIGlmIChvdXQgaW5zdGFuY2VvZiBPYmplY3RPdXRwdXRTdHJlYW0pIHsNCi0gICAgICAgICAgICAoKE9iamVjdE91dHB1dFN0cmVhbSlvdXQpLmRlZmF1bHRXcml0ZU9iamVjdCgpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgbykgew0KLSAgICAgICAgcmV0dXJuIG91dC5lcXVhbHMobyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgZmx1c2goKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLSAgICAgICAgb3V0LmZsdXNoKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsNCi0gICAgICAgIHJldHVybiBvdXQuaGFzaENvZGUoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUHV0RmllbGQgcHV0RmllbGRzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIGlmIChvdXQgaW5zdGFuY2VvZiBPYmplY3RPdXRwdXRTdHJlYW0pIHsNCi0gICAgICAgICAgICByZXR1cm4gKChPYmplY3RPdXRwdXRTdHJlYW0pb3V0KS5wdXRGaWVsZHMoKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJUaGlzIG1ldGhvZCBpcyBub3Qgc3VwcG9ydGVkLiIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgICAgIA0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIGlmIChvdXQgaW5zdGFuY2VvZiBPYmplY3RPdXRwdXRTdHJlYW0pIHsNCi0gICAgICAgICAgICAoKE9iamVjdE91dHB1dFN0cmVhbSlvdXQpLnJlc2V0KCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCi0gICAgICAgIHJldHVybiBvdXQudG9TdHJpbmcoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB1c2VQcm90b2NvbFZlcnNpb24oaW50IHZlcnNpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICBpZiAob3V0IGluc3RhbmNlb2YgT2JqZWN0T3V0cHV0U3RyZWFtKSB7DQotICAgICAgICAgICAgKChPYmplY3RPdXRwdXRTdHJlYW0pb3V0KS51c2VQcm90b2NvbFZlcnNpb24odmVyc2lvbik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIG91dC53cml0ZShidWYsIG9mZiwgbGVuKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gYnVmKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLSAgICAgICAgb3V0LndyaXRlKGJ1Zik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgd3JpdGUoaW50IHZhbCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIG91dC53cml0ZSh2YWwpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHdyaXRlQm9vbGVhbihib29sZWFuIHZhbCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIG91dC53cml0ZUJvb2xlYW4odmFsKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUJ5dGUoaW50IHZhbCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIG91dC53cml0ZUJ5dGUodmFsKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUJ5dGVzKFN0cmluZyBzdHIpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICBvdXQud3JpdGVCeXRlcyhzdHIpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHdyaXRlQ2hhcihpbnQgdmFsKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLSAgICAgICAgb3V0LndyaXRlQ2hhcih2YWwpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHdyaXRlQ2hhcnMoU3RyaW5nIHN0cikgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIG91dC53cml0ZUNoYXJzKHN0cik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgd3JpdGVEb3VibGUoZG91YmxlIHZhbCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIG91dC53cml0ZURvdWJsZSh2YWwpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHdyaXRlRmllbGRzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIGlmIChvdXQgaW5zdGFuY2VvZiBPYmplY3RPdXRwdXRTdHJlYW0pIHsNCi0gICAgICAgICAgICAoKE9iamVjdE91dHB1dFN0cmVhbSlvdXQpLndyaXRlRmllbGRzKCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgd3JpdGVGbG9hdChmbG9hdCB2YWwpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICBvdXQud3JpdGVGbG9hdCh2YWwpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHdyaXRlSW50KGludCB2YWwpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICBvdXQud3JpdGVJbnQodmFsKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUxvbmcobG9uZyB2YWwpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICBvdXQud3JpdGVMb25nKHZhbCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgd3JpdGVPYmplY3QoT2JqZWN0IG9iaikgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIHdyaXRlT2JqZWN0KG9iaiwgZmFsc2UpOyAgLy8gQXNzdW1lIG9iamVjdCBpcyBub3Qgc2FmZQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHdyaXRlU2hvcnQoaW50IHZhbCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIG91dC53cml0ZVNob3J0KHZhbCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgd3JpdGVVVEYoU3RyaW5nIHN0cikgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIG91dC53cml0ZVVURihzdHIpOw0KLSAgICB9DQotDQotICAgIC8vIEVORCBERUxFR0FURSBNRVRIT0RTDQotICAgIA0KLSAgICAvKioNCi0gICAgICogV3JpdGUgYSBtYXANCi0gICAgICogDQotICAgICAqIEZPUk1BVCBmb3IgbnVsbCBtYXANCi0gICAgICogICAgIEVNUFRZX09CSkVDVA0KLSAgICAgKiAgICAgDQotICAgICAqIEZPUk1BVCBmb3Igbm9uLWVtcHR5IG1hcA0KLSAgICAgKiAgICAgQUNUSVZFX09CSkVDVA0KLSAgICAgKiAgICAgZm9yIGVhY2ggY29udGFpbmVkIGtleSB2YWx1ZSBwYWlyDQotICAgICAqICAgICAgICB3cml0ZVBhaXINCi0gICAgICogICAgIEVNUFRZX09CSkVDVCAoaW5kaWNhdGVzIGVuZCBvZiB0aGUgbGlzdA0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGxsDQotICAgICAqIEByZXR1cm4NCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbg0KLSAgICAgKi8NCi0gICAgcHVibGljIGJvb2xlYW4gd3JpdGVNYXAoTWFwIG1hcCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIA0KLSAgICAgICAgaWYgKG1hcCA9PSBudWxsKSB7DQotICAgICAgICAgICAgb3V0LndyaXRlQm9vbGVhbihFTVBUWV9PQkpFQ1QpOw0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgb3V0LndyaXRlQm9vbGVhbihBQ1RJVkVfT0JKRUNUKTsNCi0gICAgICAgICAgICBJdGVyYXRvciBpdCA9IG1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7DQotICAgICAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgew0KLSAgICAgICAgICAgIAlmaW5hbCBNYXAuRW50cnkgZW50cnkgPSAoRW50cnkpIGl0Lm5leHQoKTsNCi0gICAgICAgICAgICAJd3JpdGVQYWlyKGVudHJ5LmdldEtleSgpLCBmYWxzZSwgZW50cnkuZ2V0VmFsdWUoKSwgZmFsc2UpOw0KLSAgICAgICAgICAgIH0gICAgICAgICAgICAvLyBFbXB0eSBvYmplY3QgaW5kaWNhdGVzIGVuZCBvZiBsaXN0DQotICAgICAgICAgICAgb3V0LndyaXRlQm9vbGVhbihFTVBUWV9PQkpFQ1QpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBXcml0ZSBhIGxpc3QuDQotICAgICAqIA0KLSAgICAgKiBGT1JNQVQgZm9yIG51bGwgbGlzdA0KLSAgICAgKiAgICAgRU1QVFlfT0JKRUNUDQotICAgICAqICAgICANCi0gICAgICogRk9STUFUIGZvciBub24tZW1wdHkgbGlzdA0KLSAgICAgKiAgICAgQUNUSVZFX09CSkVDVA0KLSAgICAgKiAgICAgZm9yIGVhY2ggY29udGFpbmVkIG9iamVjdA0KLSAgICAgKiAgICAgICAgQUNUT1ZFX09CSkVDVA0KLSAgICAgKiAgICAgICAgd3JpdGVPYmplY3QNCi0gICAgICogICAgIEVNUFRZX09CSkVDVCAoaW5kaWNhdGVzIGVuZCBvZiB0aGUgbGlzdA0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGxsDQotICAgICAqIEByZXR1cm4NCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbg0KLSAgICAgKi8NCi0gICAgcHVibGljIGJvb2xlYW4gd3JpdGVMaXN0KExpc3QgYWwpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICBpZiAoYWwgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIG91dC53cml0ZUJvb2xlYW4oRU1QVFlfT0JKRUNUKTsNCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIG91dC53cml0ZUJvb2xlYW4oQUNUSVZFX09CSkVDVCk7DQotICAgICAgICAgICAgSXRlcmF0b3IgaXQgPSBhbC5pdGVyYXRvcigpOw0KLQ0KLSAgICAgICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsNCi0gICAgICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gaXQubmV4dCgpOw0KLSAgICAgICAgICAgICAgICB3cml0ZUl0ZW0odmFsdWUsIGZhbHNlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgLy8gRW1wdHkgb2JqZWN0IGluZGljYXRlcyBlbmQgb2YgbGlzdA0KLSAgICAgICAgICAgIG91dC53cml0ZUJvb2xlYW4oRU1QVFlfT0JKRUNUKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogV3JpdGVzIGFuIG9iamVjdCB0byB0aGUgc3RyZWFtLg0KLSAgICAgKiBJZiB0aGUgb2JqZWN0IGlzIGtub3duIChhcHJpb3JpKSB0byBiZSBjb21wbGV0ZWx5IHNlcmlhbGl6YWJsZSBpdA0KLSAgICAgKiBpcyAic2FmZSIuICBTYWZlIG9iamVjdHMgYXJlIHdyaXR0ZW4gZGlyZWN0bHkgdG8gdGhlIHN0cmVhbS4NCi0gICAgICogT2JqZWN0cyB0aGF0IGFyZSBub3Qga25vd24gYXJlIHRvIGJlIHNhZmUgYXJlIHRlc3RlZCBmb3Igc2FmZXR5IGFuZCANCi0gICAgICogb25seSB3cml0dGVuIGlmIHRoZXkgYXJlIGRlZW1lZCBzYWZlLiAgVW5zYWZlIG9iamVjdHMgYXJlIG5vdCB3cml0dGVuLg0KLSAgICAgKiBOb3RlOiBUaGUgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0gaXMgbGVmdCBpbiBhbiB1bnJlY292ZXJhYmxlIHN0YXRlDQotICAgICAqIGlmIGFueSBvYmplY3Qgd3JpdHRlbiB0byBpdCBjYXVzZXMgYSBzZXJpYWxpemF0aW9uIGVycm9yLiAgU28gcGxlYXNlDQotICAgICAqIHVzZSB0aGUgaXNTYWZlIHBhcmFtZXRlciB3aXNlbHkNCi0gICAgICogDQotICAgICAqIEZPUk1BVCBmb3IgTlVMTCBPYmplY3QNCi0gICAgICogICAgRU1QVFlfT0JKRUNUDQotICAgICAqICAgDQotICAgICAqIEZPUk1BVCBmb3Igbm9uLXNlcmlhbGl6YWJsZSBPYmplY3QNCi0gICAgICogICAgRU1QVFlfT0JKRUNUDQotICAgICAqICAgIA0KLSAgICAgKiBGT1JNQVQgZm9yIHNhZmUgc2VyaWFsaXphYmxlIE9iamVjdA0KLSAgICAgKiAgICBBQ1RJVkVfT0JKRUNUDQotICAgICAqICAgIEZPUk1fT0JKRUNUDQotICAgICAqICAgIE9iamVjdA0KLSAgICAgKiAgICANCi0gICAgICogRk9STUFUIGZvciBvdGhlciBzZXJpYWxpemFibGUgT2JqZWN0DQotICAgICAqICAgIEFDVElWRV9PQkpFQ1QNCi0gICAgICogICAgRk9STV9CWVRFDQotICAgICAqICAgIGxlbmd0aCBvZiBieXRlcw0KLSAgICAgKiAgICBieXRlcyByZXByZXNlbnRpbmcgdGhlIG9iamVjdA0KLSAgICAgKiAgIA0KLSAgICAgKiBAcGFyYW0gb2JqDQotICAgICAqIEBwYXJhbSBpc1NhZmUgdHJ1ZSBpZiB5b3Uga25vdyB0aGF0IG9iamVjdCBjYW4gYmUgc2FmZWx5IHNlcmlhbGl6ZWQuIGZhbHNlIGlmIHRoZSANCi0gICAgICogb2JqZWN0IG5lZWRzIHRvIGJlIHRlc3RlZCBmb3Igc2VyaWFsaXphdGlvbi4NCi0gICAgICogQHJldHVybnMgdHJ1ZSBpZiB3cml0dGVuDQotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24NCi0gICAgICovDQotICAgIHByaXZhdGUgYm9vbGVhbiB3cml0ZU9iamVjdChPYmplY3Qgb2JqLCANCi0gICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNTYWZlKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLSAgICAgICAgDQotICAgICAgICBpZiAoaXNEZWJ1Zykgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiV3JpdGluZyBvYmplY3Q6IiArIHZhbHVlTmFtZShvYmopKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgLy8gU2hvcnRjdXQgZm9yIG51bGwgb2JqZWN0cw0KLSAgICAgICAgaWYgKG9iaiA9PSBudWxsKSB7DQotICAgICAgICAgICAgb3V0LndyaXRlQm9vbGVhbihFTVBUWV9PQkpFQ1QpOw0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0gICAgICAgIC8vIFNob3J0Y3V0IGZvciBub24tc2VyaWFsaXphYmxlIG9iamVjdHMNCi0gICAgICAgIGlmICghaXNTYWZlKSB7DQotICAgICAgICAgICAgaWYgKCFpc1NlcmlhbGl6YWJsZShvYmopKSB7DQotICAgICAgICAgICAgICAgIG91dC53cml0ZUJvb2xlYW4oRU1QVFlfT0JKRUNUKTsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgLy8gSWYgbm90IHNhZmUsIHNlZSBpZiB0aGVyZSBhcmUgY2hhcmFjdGVyaXN0aWNzIG9mIHRoZSBPYmplY3QNCi0gICAgICAgIC8vIHRoYXQgZ3VhcmFudGVlIHRoYXQgaXQgY2FuIGJlIHNhZmVseSBzZXJpYWxpemVkIA0KLSAgICAgICAgLy8gKGZvciBleGFtcGxlIFN0cmluZ3MgYXJlIGFsd2F5cyBzZXJpYWxpemFibGUpDQotICAgICAgICBpZiAoIWlzU2FmZSkgew0KLSAgICAgICAgICAgIGlzU2FmZSA9IGlzU2FmZVNlcmlhbGl6YWJsZShvYmopOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKGlzU2FmZSkgew0KLSAgICAgICAgICAgIC8vIFVzZSBvYmplY3QgZm9ybQ0KLSAgICAgICAgICAgIGlmIChpc0RlYnVnKSB7DQotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiICB3cml0ZSB1c2luZyBvYmplY3QgZm9ybSIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBvdXQud3JpdGVCb29sZWFuKEFDVElWRV9PQkpFQ1QpOyAgDQotICAgICAgICAgICAgb3V0LndyaXRlQm9vbGVhbihGT1JNX09CSkVDVCk7DQotICAgICAgICAgICAgb3V0LndyaXRlT2JqZWN0KG9iaik7DQotICAgICAgICB9IGVsc2Ugew0KLQ0KLSAgICAgICAgICAgIC8vIEZhbGwtYmFjayB0byBieXRlIGZvcm0NCi0gICAgICAgICAgICBpZiAoaXNEZWJ1Zykgew0KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIiAgd3JpdGUgdXNpbmcgYnl0ZSBmb3JtIik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIE15T09TIHRlbXBPT1M7DQotICAgICAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICAgICAgdGVtcE9PUyA9IHdyaXRlVGVtcE9PUyhvYmopOw0KLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICAgICAgLy8gUHV0IGEgRU1QVFkgb2JqZWN0IGluIHRoZSBmaWxlDQotICAgICAgICAgICAgICAgIG91dC53cml0ZUJvb2xlYW4oRU1QVFlfT0JKRUNUKTsNCi0gICAgICAgICAgICAgICAgdGhyb3cgZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYgKHRlbXBPT1MgPT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICBvdXQud3JpdGVCb29sZWFuKEVNUFRZX09CSkVDVCk7DQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgICAgICB9IA0KLQ0KLSAgICAgICAgICAgIG91dC53cml0ZUJvb2xlYW4oQUNUSVZFX09CSkVDVCk7ICAgDQotICAgICAgICAgICAgb3V0LndyaXRlQm9vbGVhbihGT1JNX0JZVEUpOw0KLSAgICAgICAgICAgIHRlbXBPT1Mud3JpdGUob3V0KTsNCi0gICAgICAgICAgICByZXNldE9uU3VjY2VzcygpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0gICAgDQotICAgIA0KLSAgICAvKioNCi0gICAgICogV3JpdGVzIHBhaXIgb2Ygb2JqZWN0cyB0byB0aGUgc3RyZWFtLg0KLSAgICAgKiANCi0gICAgICogSWYgdGhlIG9iamVjdHMgYXJlIGtub3duIChhcHJpb3JpKSB0byBiZSBjb21wbGV0ZWx5IHNlcmlhbGl6YWJsZSB0aGV5IA0KLSAgICAgKiBhcmUgInNhZmUiLiAgU2FmZSBvYmplY3RzIGFyZSB3cml0dGVuIGRpcmVjdGx5IHRvIHRoZSBzdHJlYW0uDQotICAgICAqIE9iamVjdHMgdGhhdCBhcmUgbm90IGtub3duIGFyZSB0byBiZSBzYWZlIGFyZSB0ZXN0ZWQgZm9yIHNhZmV0eSBhbmQgDQotICAgICAqIG9ubHkgd3JpdHRlbiBpZiB0aGV5IGFyZSBkZWVtZWQgc2FmZS4gIFVuc2FmZSBvYmplY3RzIGFyZSBub3Qgd3JpdHRlbi4NCi0gICAgICogTm90ZTogVGhlIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtIGlzIGxlZnQgaW4gYW4gdW5yZWNvdmVyYWJsZSBzdGF0ZQ0KLSAgICAgKiBpZiBhbnkgb2JqZWN0IHdyaXR0ZW4gdG8gaXQgY2F1c2VzIGEgc2VyaWFsaXphdGlvbiBlcnJvci4gIFNvIHBsZWFzZQ0KLSAgICAgKiB1c2UgdGhlIGlzU2FmZSBwYXJhbWV0ZXIgd2lzZWx5DQotICAgICAqIA0KLSAgICAgKiAgIA0KLSAgICAgKiBGT1JNQVQgZm9yIG5vbi1zZXJpYWxpemFibGUga2V5L3ZhbHVlIHBhaXINCi0gICAgICogICAgbm90aGluZyBpcyB3cml0dGVuDQotICAgICAqICAgIA0KLSAgICAgKiBGT1JNQVQgZm9yIHNhZmUgc2VyaWFsaXphYmxlIGtleS92YWx1ZSBwYWlyDQotICAgICAqICAgIEFDVElWRV9PQkpFQ1QNCi0gICAgICogICAgRk9STV9PQkpFQ1QNCi0gICAgICogICAgT2JqZWN0DQotICAgICAqICAgIA0KLSAgICAgKiBGT1JNQVQgZm9yIG90aGVyIHNlcmlhbGl6YWJsZSBrZXkvdmFsdWUgcGFpcg0KLSAgICAgKiAgICBBQ1RJVkVfT0JKRUNUDQotICAgICAqICAgIEZPUk1fQllURQ0KLSAgICAgKiAgICBsZW5ndGggb2YgYnl0ZXMNCi0gICAgICogICAgYnl0ZXMgcmVwcmVzZW50aW5nIHRoZSBvYmplY3QNCi0gICAgICogICAgDQotICAgICAqIEBwYXJhbSBvYmoxDQotICAgICAqIEBwYXJhbSBpc1NhZmUxIHRydWUgaWYgeW91IGtub3cgdGhhdCBvYmplY3QgY2FuIGJlIHNhZmVseSBzZXJpYWxpemVkLiBmYWxzZSBpZiB0aGUgDQotICAgICAqIG9iamVjdCBuZWVkcyB0byBiZSB0ZXN0ZWQgZm9yIHNlcmlhbGl6YXRpb24uDQotICAgICAqIEBwYXJhbSBvYmoyDQotICAgICAqIEBwYXJhbSBpc1NhZmUyIHRydWUgaWYgeW91IGtub3cgdGhhdCBvYmplY3QgY2FuIGJlIHNhZmVseSBzZXJpYWxpemVkLiBmYWxzZSBpZiB0aGUgDQotICAgICAqIG9iamVjdCBuZWVkcyB0byBiZSB0ZXN0ZWQgZm9yIHNlcmlhbGl6YXRpb24uDQotICAgICAqIEByZXR1cm5zIHRydWUgaWYgYm90aCBhcmUgd3JpdHRlbiB0byB0aGUgc3RyZWFtDQotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24NCi0gICAgICovDQotICAgIHB1YmxpYyBib29sZWFuIHdyaXRlUGFpcihPYmplY3Qgb2JqMSwgDQotICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzU2FmZTEsIA0KLSAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IG9iajIsDQotICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzU2FmZTIpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICANCi0gICAgICAgIGlmIChpc0RlYnVnKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKCJXcml0aW5nIGtleT0iICsgdmFsdWVOYW1lKG9iajEpICsgDQotICAgICAgICAgICAgICAgICAgICAgICIgdmFsdWU9Iit2YWx1ZU5hbWUob2JqMikpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgLy8gU2hvcnRjdXQgZm9yIG5vbi1zZXJpYWxpemFibGUgb2JqZWN0cw0KLSAgICAgICAgaWYgKCghaXNTYWZlMSAmJiAhaXNTZXJpYWxpemFibGUob2JqMSkpIHx8DQotICAgICAgICAgICAgICghaXNTYWZlMiAmJiAhaXNTZXJpYWxpemFibGUob2JqMikpKSB7DQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgYm9vbGVhbiBpc1NhZmUgPSAoaXNTYWZlMSB8fCBpc1NhZmVTZXJpYWxpemFibGUob2JqMSkpICYmIA0KLSAgICAgICAgICAgIChpc1NhZmUyIHx8IGlzU2FmZVNlcmlhbGl6YWJsZShvYmoyKSk7DQotDQotICAgICAgICBpZiAoaXNTYWZlKSB7DQotICAgICAgICAgICAgaWYgKGlzRGVidWcpIHsNCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgIHdyaXRlIHVzaW5nIG9iamVjdCBmb3JtIik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIG91dC53cml0ZUJvb2xlYW4oQUNUSVZFX09CSkVDVCk7DQotICAgICAgICAgICAgb3V0LndyaXRlQm9vbGVhbihGT1JNX09CSkVDVCk7DQotICAgICAgICAgICAgb3V0LndyaXRlT2JqZWN0KG9iajEpOw0KLSAgICAgICAgICAgIG91dC53cml0ZU9iamVjdChvYmoyKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgaWYgKGlzRGVidWcpIHsNCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgIHdyaXRlIHVzaW5nIGJ5dGUgZm9ybSIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBNeU9PUyB0ZW1wT09TID0gd3JpdGVUZW1wT09TKG9iajEsIG9iajIpOw0KLSAgICAgICAgICAgIGlmICh0ZW1wT09TID09IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgICAgIH0gDQotICAgICAgICAgICAgb3V0LndyaXRlQm9vbGVhbihBQ1RJVkVfT0JKRUNUKTsNCi0gICAgICAgICAgICBvdXQud3JpdGVCb29sZWFuKEZPUk1fQllURSk7DQotICAgICAgICAgICAgdGVtcE9PUy53cml0ZShvdXQpOw0KLSAgICAgICAgICAgIHJlc2V0T25TdWNjZXNzKCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFdyaXRlcyBwYWlyIG9mIG9iamVjdHMgdG8gdGhlIHN0cmVhbS4NCi0gICAgICogDQotICAgICAqIElmIHRoZSBvYmplY3RzIGFyZSBrbm93biAoYXByaW9yaSkgdG8gYmUgY29tcGxldGVseSBzZXJpYWxpemFibGUgdGhleSANCi0gICAgICogYXJlICJzYWZlIi4gIFNhZmUgb2JqZWN0cyBhcmUgd3JpdHRlbiBkaXJlY3RseSB0byB0aGUgc3RyZWFtLg0KLSAgICAgKiBPYmplY3RzIHRoYXQgYXJlIG5vdCBrbm93biBhcmUgdG8gYmUgc2FmZSBhcmUgdGVzdGVkIGZvciBzYWZldHkgYW5kIA0KLSAgICAgKiBvbmx5IHdyaXR0ZW4gaWYgdGhleSBhcmUgZGVlbWVkIHNhZmUuICBVbnNhZmUgb2JqZWN0cyBhcmUgbm90IHdyaXR0ZW4uDQotICAgICAqIE5vdGU6IFRoZSBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSBpcyBsZWZ0IGluIGFuIHVucmVjb3ZlcmFibGUgc3RhdGUNCi0gICAgICogaWYgYW55IG9iamVjdCB3cml0dGVuIHRvIGl0IGNhdXNlcyBhIHNlcmlhbGl6YXRpb24gZXJyb3IuICBTbyBwbGVhc2UNCi0gICAgICogdXNlIHRoZSBpc1NhZmUgcGFyYW1ldGVyIHdpc2VseQ0KLSAgICAgKiANCi0gICAgICogICANCi0gICAgICogRk9STUFUIGZvciBub24tc2VyaWFsaXphYmxlIGtleS92YWx1ZSBwYWlyDQotICAgICAqICAgIG5vdGhpbmcgaXMgd3JpdHRlbg0KLSAgICAgKiAgICANCi0gICAgICogRk9STUFUIGZvciBzYWZlIHNlcmlhbGl6YWJsZSBrZXkvdmFsdWUgcGFpcg0KLSAgICAgKiAgICBBQ1RJVkVfT0JKRUNUDQotICAgICAqICAgIEZPUk1fT0JKRUNUDQotICAgICAqICAgIE9iamVjdA0KLSAgICAgKiAgICANCi0gICAgICogRk9STUFUIGZvciBvdGhlciBzZXJpYWxpemFibGUga2V5L3ZhbHVlIHBhaXINCi0gICAgICogICAgQUNUSVZFX09CSkVDVA0KLSAgICAgKiAgICBGT1JNX0JZVEUNCi0gICAgICogICAgbGVuZ3RoIG9mIGJ5dGVzDQotICAgICAqICAgIGJ5dGVzIHJlcHJlc2VudGluZyB0aGUgb2JqZWN0DQotICAgICAqICAgIA0KLSAgICAgKiBAcGFyYW0gb2JqMQ0KLSAgICAgKiBAcGFyYW0gaXNTYWZlMSB0cnVlIGlmIHlvdSBrbm93IHRoYXQgb2JqZWN0IGNhbiBiZSBzYWZlbHkgc2VyaWFsaXplZC4gZmFsc2UgaWYgdGhlIA0KLSAgICAgKiBvYmplY3QgbmVlZHMgdG8gYmUgdGVzdGVkIGZvciBzZXJpYWxpemF0aW9uLg0KLSAgICAgKiBAcGFyYW0gb2JqMg0KLSAgICAgKiBAcGFyYW0gaXNTYWZlMiB0cnVlIGlmIHlvdSBrbm93IHRoYXQgb2JqZWN0IGNhbiBiZSBzYWZlbHkgc2VyaWFsaXplZC4gZmFsc2UgaWYgdGhlIA0KLSAgICAgKiBvYmplY3QgbmVlZHMgdG8gYmUgdGVzdGVkIGZvciBzZXJpYWxpemF0aW9uLg0KLSAgICAgKiBAcmV0dXJucyB0cnVlIGlmIGJvdGggYXJlIHdyaXR0ZW4gdG8gdGhlIHN0cmVhbQ0KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uDQotICAgICAqLw0KLSAgICBwdWJsaWMgYm9vbGVhbiB3cml0ZUl0ZW0oT2JqZWN0IG9iaiwgDQotICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzU2FmZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIA0KLSAgICAgICAgaWYgKGlzRGVidWcpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcoIldyaXRpbmcgb2JqPSIgKyB2YWx1ZU5hbWUob2JqKSk7DQotICAgICAgICB9DQotICAgICAgICAvLyBTaG9ydGN1dCBmb3Igbm9uLXNlcmlhbGl6YWJsZSBvYmplY3RzDQotICAgICAgICBpZiAoIWlzU2FmZSAmJiAhaXNTZXJpYWxpemFibGUob2JqKSkgew0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlzU2FmZSA9IChpc1NhZmUgfHwgaXNTYWZlU2VyaWFsaXphYmxlKG9iaikpOw0KLQ0KLSAgICAgICAgaWYgKGlzU2FmZSkgew0KLSAgICAgICAgICAgIGlmIChpc0RlYnVnKSB7DQotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiICB3cml0ZSB1c2luZyBvYmplY3QgZm9ybSIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBvdXQud3JpdGVCb29sZWFuKEFDVElWRV9PQkpFQ1QpOw0KLSAgICAgICAgICAgIG91dC53cml0ZUJvb2xlYW4oRk9STV9PQkpFQ1QpOw0KLSAgICAgICAgICAgIG91dC53cml0ZU9iamVjdChvYmopOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBpZiAoaXNEZWJ1Zykgew0KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIiAgd3JpdGUgdXNpbmcgYnl0ZSBmb3JtIik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIE15T09TIHRlbXBPT1M7DQotICAgICAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICAgICAgdGVtcE9PUyA9IHdyaXRlVGVtcE9PUyhvYmopOw0KLSAgICAgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmICh0ZW1wT09TID09IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgICAgIH0gDQotICAgICAgICAgICAgb3V0LndyaXRlQm9vbGVhbihBQ1RJVkVfT0JKRUNUKTsNCi0gICAgICAgICAgICBvdXQud3JpdGVCb29sZWFuKEZPUk1fQllURSk7DQotICAgICAgICAgICAgdGVtcE9PUy53cml0ZShvdXQpOw0KLSAgICAgICAgICAgIHJlc2V0T25TdWNjZXNzKCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIERvZXMgYSBxdWljayBjaGVjayBvZiB0aGUgaW1wbGVtZW50ZWQgaW50ZXJmYWNlcyB0byBlbnN1cmUgdGhhdCB0aGlzIA0KLSAgICAgKiBvYmplY3QgaXMgc2VyaWFsaXphYmxlDQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIG1hcmtlZCBhcyBTZXJpYWxpemFibGUgDQotICAgICAqLw0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzU2VyaWFsaXphYmxlKE9iamVjdCBvYmopIHsNCi0gICAgICAgIGJvb2xlYW4gaXNTZXJpYWxpemFibGUgPSAob2JqID09IG51bGwpIHx8IG9iaiBpbnN0YW5jZW9mIFNlcmlhbGl6YWJsZTsNCi0gICAgICAgIGlmICghaXNTZXJpYWxpemFibGUpIHsNCi0gICAgICAgICAgICBtYXJrTm90U2VyaWFsaXphYmxlKG9iaik7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gaXNTZXJpYWxpemFibGU7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBEb2VzIGEgcXVpY2sgY2hlY2sgb2YgdGhlIGltcGxlbWVudGVkIGNsYXNzIGlzIHNhZmUgdG8gc2VyaWFsaXplIHdpdGhvdXQgDQotICAgICAqIGJ1ZmZlcmluZy4NCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBvYmplY3QgaXMgbWFya2VkIGFzIHNhZmUuDQotICAgICAqLw0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzU2FmZVNlcmlhbGl6YWJsZShPYmplY3Qgb2JqKSB7DQotICAgICAgICANCi0gICAgICAgIGJvb2xlYW4gaXNTYWZlU2VyaWFsaXphYmxlID0gKG9iaiA9PSBudWxsKSB8fCANCi0gICAgICAgICAgICBvYmogaW5zdGFuY2VvZiBTYWZlU2VyaWFsaXphYmxlIHx8DQotICAgICAgICAgICAgb2JqIGluc3RhbmNlb2YgU3RyaW5nIHx8DQotICAgICAgICAgICAgb2JqIGluc3RhbmNlb2YgSW50ZWdlciB8fA0KLSAgICAgICAgICAgIG9iaiBpbnN0YW5jZW9mIEJvb2xlYW4gfHwNCi0gICAgICAgICAgICBvYmogaW5zdGFuY2VvZiBMb25nOw0KLSAgICAgICAgcmV0dXJuIGlzU2FmZVNlcmlhbGl6YWJsZTsNCi0gICAgfQ0KLSAgICANCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBXcml0ZSB0aGUgb2JqZWN0IHRvIGEgdGVtcG9yYXJ5IE9iamVjdE91dHB1dA0KLSAgICAgKiBAcGFyYW0gb2JqDQotICAgICAqIEByZXR1cm4gT2JqZWN0T3V0cHV0IGlmIHN1Y2Nlc3NmdWwNCi0gICAgICovDQotICAgIHByaXZhdGUgTXlPT1Mgd3JpdGVUZW1wT09TKE9iamVjdCBvYmopIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICBNeU9PUyBvb3MgPSBudWxsOw0KLSAgICAgICAgDQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIG9vcyA9IGdldFRlbXBPT1MoKTsNCi0gICAgICAgICAgICBvb3Mud3JpdGVPYmplY3Qob2JqKTsNCi0gICAgICAgICAgICBvb3MuZmx1c2goKTsNCi0gICAgICAgIH0gY2F0Y2ggKE5vdFNlcmlhbGl6YWJsZUV4Y2VwdGlvbiBuc2UyKSB7DQotICAgICAgICAgICAgbWFya05vdFNlcmlhbGl6YWJsZShvYmopOw0KLSAgICAgICAgICAgIGlmIChvb3MgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICByZXNldE9uRmFpbHVyZSgpOw0KLSAgICAgICAgICAgICAgICBvb3MgPSBudWxsOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB0aHJvdyBuc2UyOw0KLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGlmIChvb3MgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICByZXNldE9uRmFpbHVyZSgpOw0KLSAgICAgICAgICAgICAgICBvb3MgPSBudWxsOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB0aHJvdyBlOw0KLSAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgaWYgKG9vcyAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgIHJlc2V0T25GYWlsdXJlKCk7DQotICAgICAgICAgICAgICAgIG9vcyA9IG51bGw7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHRocm93IGU7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gb29zOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogV3JpdGUgdGhlIG9iamVjdHMgdG8gYSB0ZW1wb3JhcnkgT2JqZWN0T3V0cHV0DQotICAgICAqIEBwYXJhbSBvYmoxDQotICAgICAqIEBwYXJhbSBvYmoyDQotICAgICAqIEByZXR1cm4gT2JqZWN0T3V0cHV0IGlmIHN1Y2Nlc3NmdWwNCi0gICAgICovDQotICAgIHByaXZhdGUgTXlPT1Mgd3JpdGVUZW1wT09TKE9iamVjdCBvYmoxLCBPYmplY3Qgb2JqMikgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIE15T09TIG9vcyA9IG51bGw7DQotICAgICAgICBib29sZWFuIGZpcnN0ID0gdHJ1ZTsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgb29zID0gZ2V0VGVtcE9PUygpOw0KLSAgICAgICAgICAgIG9vcy53cml0ZU9iamVjdChvYmoxKTsNCi0gICAgICAgICAgICBmaXJzdCA9IGZhbHNlOw0KLSAgICAgICAgICAgIG9vcy53cml0ZU9iamVjdChvYmoyKTsNCi0gICAgICAgICAgICBvb3MuZmx1c2goKTsNCi0gICAgICAgIH0gY2F0Y2ggKE5vdFNlcmlhbGl6YWJsZUV4Y2VwdGlvbiBuc2UyKSB7DQotICAgICAgICAgICAgLy8gVGhpcyBpcyBva2F5IGFuZCBleHBlY3RlZCBpbiBzb21lIGNhc2VzLg0KLSAgICAgICAgICAgIC8vIExvZyB0aGUgZXJyb3IgYW5kIGNvbnRpbnVlDQotICAgICAgICAgICAgbWFya05vdFNlcmlhbGl6YWJsZSgoZmlyc3QpID8gb2JqMSA6b2JqMik7DQotICAgICAgICAgICAgaWYgKG9vcyAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgIHJlc2V0T25GYWlsdXJlKCk7DQotICAgICAgICAgICAgICAgIG9vcyA9IG51bGw7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGlmIChvb3MgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICByZXNldE9uRmFpbHVyZSgpOw0KLSAgICAgICAgICAgICAgICBvb3MgPSBudWxsOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB0aHJvdyBlOw0KLSAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgaWYgKG9vcyAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgIHJlc2V0T25GYWlsdXJlKCk7DQotICAgICAgICAgICAgICAgIG9vcyA9IG51bGw7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHRocm93IGU7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gb29zOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogR2V0IG9yIGNyZWF0ZSBhIHRlbXBvcmFyeSBPYmplY3RPdXRwdXRTdHJlYW0NCi0gICAgICogQHJldHVybiBNeU9PUw0KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uDQotICAgICAqLw0KLSAgICBwcml2YXRlIE15T09TIGdldFRlbXBPT1MoKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLSAgICAgICAgaWYgKHRlbXBPT1MgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHRlbXBPT1MgPSBuZXcgTXlPT1MobmV3IE15QkFPUygpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB0ZW1wT09TOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogSWYgYSBmYWlsdXJlIG9jY3VycywgcmVzZXQgdGhlIHRlbXBvcmFyeSBPYmplY3RPdXRwdXRTdHJlYW0NCi0gICAgICovDQotICAgIHByaXZhdGUgdm9pZCByZXNldE9uRmFpbHVyZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICBpZiAodGVtcE9PUyAhPSBudWxsKSB7DQotICAgICAgICAgICAgdGVtcE9PUy5jbG9zZSgpOw0KLSAgICAgICAgICAgIHRlbXBPT1MgPSBudWxsOyAgLy8gVGhlIE9iamVjdE91dHB1dCBpcyBpbiBhbiB1bmtub3duIHN0YXRlIGFuZCB0aHVzIGRpc2NhcmRlZA0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogUmVzZXQgdGhlIHRlbXBvcmFyeSBPYmplY3RPdXRwdXRTdHJlYW0NCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbg0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSB2b2lkIHJlc2V0T25TdWNjZXNzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIHRlbXBPT1MucmVzZXQoKTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBtYXJrTm90U2VyaWFsaXphYmxlKE9iamVjdCBvYmopIHsNCi0gICAgICAgIGlmICghaXNEZWJ1Zykgew0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChvYmogIT0gbnVsbCkgew0KLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gb2JqLmdldENsYXNzKCkuZ2V0TmFtZSgpOw0KLSAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IG5vdFNlcmlhbGl6YWJsZUxpc3QuZ2V0KG5hbWUpOw0KLSAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7DQotICAgICAgICAgICAgICAgIG5vdFNlcmlhbGl6YWJsZUxpc3QucHV0KG5hbWUsIG5hbWUpOw0KLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIGxvZy50cmFjZSgiKioqTm90U2VyaWFsaXphYmxlRXhjZXB0aW9uKioqIFsiICsgbmFtZSArICJdIik7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIHByaXZhdGUgU3RyaW5nIHZhbHVlTmFtZShPYmplY3Qgb2JqKSB7DQotICAgICAgICBpZiAob2JqID09IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gIm51bGwiOw0KLSAgICAgICAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBTdHJpbmcpIHsNCi0gICAgICAgICAgICByZXR1cm4gKFN0cmluZykgb2JqOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICByZXR1cm4gIk9iamVjdCBvZiBjbGFzcyA9ICIgKyBvYmouZ2V0Q2xhc3MoKS5nZXROYW1lKCk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgLyoqDQotICAgICAqIE15QkFPUyBpcyBhIEJ5dGVBcnJheU91dHB1dFN0cmVhbSB3aXRoIGEgZmV3IGFkZGl0aW9ucy4NCi0gICAgICoNCi0gICAgICovDQotICAgIHN0YXRpYyBjbGFzcyBNeUJBT1MgZXh0ZW5kcyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gew0KLSAgICAgICAgLyoqDQotICAgICAgICAgKiBSZXR1cm4gZGlyZWN0IGFjY2VzcyB0byB0aGUgYnVmZmVyIHdpdGhvdXQgY3JlYXRpbmcgYSBjb3B5IG9mIHRoZSBieXRlW10NCi0gICAgICAgICAqIEByZXR1cm4gYnVmDQotICAgICAgICAgKi8NCi0gICAgICAgIHB1YmxpYyBieXRlW10gZ2V0Qnl0ZXMoKSB7DQotICAgICAgICAgICAgcmV0dXJuIGJ1ZjsNCi0gICAgICAgIH0NCi0gICAgICAgIC8qKg0KLSAgICAgICAgICogUmVzZXQgdG8gYSBzcGVjaWZpYyBpbmRleCBpbiB0aGUgYnVmZmVyDQotICAgICAgICAgKiBAcGFyYW0gY291bnQNCi0gICAgICAgICAqLw0KLSAgICAgICAgcHVibGljIHZvaWQgcmVzZXQoaW50IGNvdW50KSB7DQotICAgICAgICAgICAgdGhpcy5jb3VudCA9IGNvdW50Ow0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICANCi0gICAgLyoqDQotICAgICAqIE15T09TIGlzIGFuIE9iamVjdE91dHB1dFN0cmVhbSB3aXRoIGEgZmV3IHBlcmZvcm1hbnQgYWRkaXRpb25zLg0KLSAgICAgKg0KLSAgICAgKi8NCi0gICAgc3RhdGljIGNsYXNzIE15T09TIGV4dGVuZHMgT2JqZWN0T3V0cHV0U3RyZWFtIHsNCi0gICAgICAgIE15QkFPUyBiYW9zOw0KLSAgICAgICAgaW50IGRhdGFPZmZzZXQ7DQotICAgICAgICBNeU9PUyhNeUJBT1MgYmFvcykgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgICAgICBzdXBlcihiYW9zKTsNCi0gICAgICAgICAgICBzdXBlci5mbHVzaCgpOw0KLSAgICAgICAgICAgIHRoaXMuYmFvcyA9IGJhb3M7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gQ2FwdHVyZSB0aGUgZGF0YSBvZmZzZXQgDQotICAgICAgICAgICAgLy8gKHRoZSBsb2NhdGlvbiB3aGVyZSBkYXRhIHN0YXJ0cy4ud2hpY2ggaXMgYWZ0ZXIgaGVhZGVyIGluZm9ybWF0aW9uKQ0KLSAgICAgICAgICAgIGRhdGFPZmZzZXQgPSBiYW9zLnNpemUoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgLyoqDQotICAgICAgICAgKiBPdmVycmlkZSB0aGUgcmVzZXQgc28gdGhhdCB3ZSBjYW4gcmVzZXQgdG8gdGhlIGRhdGEgb2Zmc2V0Lg0KLSAgICAgICAgICovDQotICAgICAgICBwdWJsaWMgdm9pZCByZXNldCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICAgICAgc3VwZXIucmVzZXQoKTsNCi0gICAgICAgICAgICAvLyBSZXNldCB0aGUgYnl0ZSBzdHJlYW0gdG8gdGhlIHBvc2l0aW9uIHBhc3QgdGhlIGhlYWRlcnMNCi0gICAgICAgICAgICBiYW9zLnJlc2V0KGRhdGFPZmZzZXQpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICAvKioNCi0gICAgICAgICAqIFdyaXRlIHRoZSBjb250ZW50cyBvZiBNeU9PUyB0byB0aGUgaW5kaWNhdGVkIE9iamVjdE91dHB1dC4NCi0gICAgICAgICAqIE5vdGUgdGhhdCB0aGlzIGRpcmVjdCB3cml0ZSBhdm9pZHMgYW55IGJ5dGVbXSBidWZmZXIgY3JlYXRpb24NCi0gICAgICAgICAqIEBwYXJhbSBvdXQNCi0gICAgICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24NCi0gICAgICAgICAqLw0KLSAgICAgICAgcHVibGljIHZvaWQgd3JpdGUoT2JqZWN0T3V0cHV0IG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgICAgICBvdXQuZmx1c2goKTsNCi0gICAgICAgICAgICAvLyBvdXQud3JpdGVPYmplY3Qob3V0LnRvQnl0ZUFycmF5KCkpOw0KLSAgICAgICAgICAgIG91dC53cml0ZUludChiYW9zLnNpemUoKSk7DQotICAgICAgICAgICAgb3V0LndyaXRlKGJhb3MuZ2V0Qnl0ZXMoKSwwLGJhb3Muc2l6ZSgpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY29udGV4dC9leHRlcm5hbGl6ZS9TYWZlU2VyaWFsaXphYmxlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY29udGV4dC9leHRlcm5hbGl6ZS9TYWZlU2VyaWFsaXphYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2NDU5N2IuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvbnRleHQvZXh0ZXJuYWxpemUvU2FmZVNlcmlhbGl6YWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LmV4dGVybmFsaXplOw0KLQ0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsNCi0NCi0vKioNCi0gKiBUaGlzIGlzIGEgbWFya2VyIGludGVyZmFjZSB0aGF0IGluZGljYXRlcyB0aGF0IHRoZSBPYmplY3QNCi0gKiBhbmQgYWxsIGNvbnRlbnRzIG9mIHRoZSBPYmplY3QgY2FuIGJlIHNlcmlhbGl6ZWQgc2FmZWx5IHdpdGhvdXQNCi0gKiBidWZmZXJpbmcuIA0KLSAqIA0KLSAqIEBTZWUgU2FmZU9iamVjdE91dHB1dFN0cmVhbQ0KLSAqDQotICovDQotcHVibGljIGludGVyZmFjZSBTYWZlU2VyaWFsaXphYmxlIGV4dGVuZHMgU2VyaWFsaXphYmxlIHsNCi0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFyZXRyaWV2YWwvQXhpc0RhdGFMb2NhdG9yLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YXJldHJpZXZhbC9BeGlzRGF0YUxvY2F0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI3MmQxNy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YXJldHJpZXZhbC9BeGlzRGF0YUxvY2F0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhcmV0cmlldmFsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotCi0vKioKLSAqIDxwPkF4aXNEYXRhTG9jYXRvciBpbnRlcmZhY2UgZGVmaW5lcyBnZXREYXRhIEFQSSBmb3IgcmV0cmlldmluZyBkYXRhIHBhcnRpY3VsYXJseQotICogbWV0YWRhdGEgbGlrZSBXU0RMLCBQb2xpY3ksIFNjaGVtYS4gV2ViIFNlcnZpY2UgZW5naW5lcyB0aGF0IGhhdmUgZGlmZmVyZW50IG1ldGhvZHMgaW4KLSAqIHN0b3JpbmcgbWV0YWRhdGEgb3IgZGlmZmVyZW50IHR5cGVzIG9mIGRhdGEgdG8gcmV0cmlldmUgbWF5IGNvZGUgdGhlaXIgdmVyc2lvbiBvZgotICogRGF0YSBMb2NhdG9yKHMpYnkgaW1wbGVtZW50aW5nIHRoZSBBeGlzRGF0YUxvY2F0b3IgaW50ZXJmYWNlLiBBeGlzIDIgc3VwcG9ydAotICogRGF0YSBMb2NhdG9yIHBsdWdpbiBieSBjb25maWd1cmluZyBpbiBBeGlzMi54bWwgb3Igc2VydmljZXMueG1sLiA8L3A+Ci0gKi8KLQotcHVibGljIGludGVyZmFjZSBBeGlzRGF0YUxvY2F0b3IgewotCi0KLSAgICAvKioKLSAgICAgKiBSZXRyaWV2ZXMgYW5kIHJldHVybnMgZGF0YSBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkIHJlcXVlc3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVxdWVzdCAgICBUaGUge0BsaW5rIERhdGFSZXRyaWV2YWxSZXF1ZXN0fSBhbGxvdyB0byBzcGVjaWZ5IHBhcmFtZXRlcnMKLSAgICAgKiAgICAgICAgICAgICAgICAgICBhYm91dCB0aGUgcmVxdWVzdCwgYW5kIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gdG8gcHJvY2VzcyB0aGUKLSAgICAgKiAgICAgICAgICAgICAgICAgICByZXF1ZXN0LgotICAgICAqIEBwYXJhbSBtc2dDb250ZXh0IFRoZSB7QGxpbmsgTWVzc2FnZUNvbnRleHR9IGZyb20gdGhlIG9yaWdpbmFsIHJlcXVlc3QuCi0gICAgICogQHJldHVybiB7QGxpbmsgRGF0YX1bXSBmb3IgdGhlIHJlcXVlc3QuCi0gICAgICogQHRocm93cyBEYXRhUmV0cmlldmFsRXhjZXB0aW9uCi0gICAgICovCi0KLSAgICBwdWJsaWMgRGF0YVtdIGdldERhdGEoRGF0YVJldHJpZXZhbFJlcXVlc3QgcmVxdWVzdCwgTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkKLSAgICAgICAgICAgIHRocm93cyBEYXRhUmV0cmlldmFsRXhjZXB0aW9uOwotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YXJldHJpZXZhbC9BeGlzRGF0YUxvY2F0b3JJbXBsLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YXJldHJpZXZhbC9BeGlzRGF0YUxvY2F0b3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1YjIzM2UuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFyZXRyaWV2YWwvQXhpc0RhdGFMb2NhdG9ySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhcmV0cmlldmFsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi0vKioKLSAqIFRoZSBEZWZhdWx0IEF4aXMyIERhdGEgTG9jYXRvciBpbXBsZW1lbnRhdGlvbgotICovCi0KLXB1YmxpYyBjbGFzcyBBeGlzRGF0YUxvY2F0b3JJbXBsIGltcGxlbWVudHMgQXhpc0RhdGFMb2NhdG9yIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coQXhpc0RhdGFMb2NhdG9ySW1wbC5jbGFzcyk7Ci0KLSAgICAvLyBIYXNoTWFwIHRvIGNhY2hlIERhdGEgZWxlbWVudHMgZGVmaW5lZCBpbiBTZXJ2aWNlRGF0YS4gCi0gICAgcHJpdmF0ZSBIYXNoTWFwIGRhdGFNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgcHJpdmF0ZSBBeGlzU2VydmljZSBheGlzU2VydmljZTsKLQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IKLSAgICAgKgotICAgICAqIEB0aHJvd3MgRGF0YVJldHJpZXZhbEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBBeGlzRGF0YUxvY2F0b3JJbXBsKEF4aXNTZXJ2aWNlIGluX2F4aXNTZXJ2aWNlKSB0aHJvd3MgRGF0YVJldHJpZXZhbEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIGF4aXNTZXJ2aWNlID0gaW5fYXhpc1NlcnZpY2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0cmlldmVzIGFuZCByZXR1cm5zIGRhdGEgYmFzZWQgb24gdGhlIHNwZWNpZmllZCByZXF1ZXN0LgotICAgICAqLwotICAgIHB1YmxpYyBEYXRhW10gZ2V0RGF0YShEYXRhUmV0cmlldmFsUmVxdWVzdCByZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB0aHJvd3MgRGF0YVJldHJpZXZhbEV4Y2VwdGlvbiB7Ci0gICAgICAgIERhdGFbXSBkYXRhID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIGRpYWxlY3QgPSByZXF1ZXN0LmdldERpYWxlY3QoKTsKLSAgICAgICAgU3RyaW5nIGlkZW50aWZpZXIgPSByZXF1ZXN0LmdldElkZW50aWZpZXIoKTsKLSAgICAgICAgU3RyaW5nIGtleSA9IGRpYWxlY3Q7Ci0gICAgICAgIEFycmF5TGlzdCBkYXRhTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgaWYgKGlkZW50aWZpZXIgIT0gbnVsbCkgewotICAgICAgICAgICAga2V5ID0ga2V5ICsgaWRlbnRpZmllcjsKLSAgICAgICAgICAgIGlmIChkYXRhTWFwLmdldChrZXkpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBkYXRhTGlzdC5hZGQoZGF0YU1hcC5nZXQoa2V5KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBkYXRhTGlzdCA9IGdldERhdGFMaXN0KGRpYWxlY3QpOwotICAgICAgICB9Ci0KLQotICAgICAgICBBeGlzRGF0YUxvY2F0b3IgZGF0YUxvY2F0b3IgPSBEYXRhTG9jYXRvckZhY3RvcnkKLSAgICAgICAgICAgICAgICAuY3JlYXRlRGF0YUxvY2F0b3IoZGlhbGVjdCwgKFNlcnZpY2VEYXRhW10pIGRhdGFMaXN0LnRvQXJyYXkobmV3IFNlcnZpY2VEYXRhWzBdKSk7Ci0KLSAgICAgICAgaWYgKGRhdGFMb2NhdG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgZGF0YSA9IGRhdGFMb2NhdG9yLmdldERhdGEocmVxdWVzdCwgbXNnQ29udGV4dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLSAgICAgICAgICAgICAgICBsb2cuaW5mbygiZ2V0RGF0YSByZXF1ZXN0IGZhaWxlZCBmb3IgZGlhbGVjdCwgIiArIGRpYWxlY3QsIGUpOwotICAgICAgICAgICAgICAgIHRocm93IG5ldyBEYXRhUmV0cmlldmFsRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAiRmFpbGVkIHRvIGluc3RhbnRpYXRlIERhdGEgTG9jYXRvciBmb3IgZGlhbGVjdCwgIiArIGRpYWxlY3Q7Ci0gICAgICAgICAgICBsb2cuaW5mbyhtZXNzYWdlKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBEYXRhUmV0cmlldmFsRXhjZXB0aW9uKG1lc3NhZ2UpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBkYXRhOwotICAgIH0KLQotICAgIC8qCi0gICAgKiBGb3IgQXhpc1NlcnZpY2UgdXNlIG9ubHkhCi0gICAgKi8KLSAgICBwdWJsaWMgdm9pZCBsb2FkU2VydmljZURhdGEoKSB7Ci0gICAgICAgIERhdGFSZXRyaWV2YWxVdGlsIHV0aWwgPSBEYXRhUmV0cmlldmFsVXRpbC5nZXRJbnN0YW5jZSgpOwotCi0gICAgICAgIE9NRWxlbWVudCBzZXJ2aWNlRGF0YSA9IG51bGw7Ci0gICAgICAgIFN0cmluZyBmaWxlID0gIk1FVEEtSU5GLyIgKyBEUkNvbnN0YW50cy5TRVJWSUNFX0RBVEEuRklMRV9OQU1FOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgc2VydmljZURhdGEgPSB1dGlsLmJ1aWxkT00oYXhpc1NlcnZpY2UuZ2V0Q2xhc3NMb2FkZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNRVRBLUlORi8iICsgRFJDb25zdGFudHMuU0VSVklDRV9EQVRBLkZJTEVfTkFNRSk7Ci0gICAgICAgIH0gY2F0Y2ggKERhdGFSZXRyaWV2YWxFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gSXQgaXMgbm90IHJlcXVpcmVkIHRvIGRlZmluZSBTZXJ2aWNlRGF0YSBmb3IgYSBTZXJ2aWNlLCBqdXN0IGxvZyBhIHdhcm5pbmcgbWVzc2FnZQotCi0gICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9ICJDaGVjayBsb2FkaW5nIGZhaWx1cmUgZm9yIGZpbGUsICIgKyBmaWxlOwotICAgICAgICAgICAgbG9nLmRlYnVnKG1lc3NhZ2UgKyAiLk1lc3NhZ2UgPSAiICsgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgbG9nLmRlYnVnKG1lc3NhZ2UsIGUpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzZXJ2aWNlRGF0YSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjYWNoaW5nU2VydmljZURhdGEoc2VydmljZURhdGEpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAqIGNhY2hpbmcgU2VydmljZURhdGEgZm9yIEF4aXMyIERhdGEgTG9jYXRvcnMKLSAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjYWNoaW5nU2VydmljZURhdGEoT01FbGVtZW50IGUpIHsKLSAgICAgICAgSXRlcmF0b3IgaSA9IGUuZ2V0Q2hpbGRyZW5XaXRoTmFtZShuZXcgUU5hbWUoCi0gICAgICAgICAgICAgICAgRFJDb25zdGFudHMuU0VSVklDRV9EQVRBLkRBVEEpKTsKLSAgICAgICAgU3RyaW5nIHNhdmVLZXkgPSAiIjsKLSAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBTZXJ2aWNlRGF0YSBkYXRhID0gbmV3IFNlcnZpY2VEYXRhKChPTUVsZW1lbnQpIGkubmV4dCgpKTsKLSAgICAgICAgICAgIHNhdmVLZXkgPSBkYXRhLmdldERpYWxlY3QoKTsKLQotICAgICAgICAgICAgU3RyaW5nIGlkZW50aWZpZXIgPSBkYXRhLmdldElkZW50aWZpZXIoKTsKLSAgICAgICAgICAgIGlmIChpZGVudGlmaWVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzYXZlS2V5ID0gc2F2ZUtleSArIGlkZW50aWZpZXI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkYXRhTWFwLnB1dChzYXZlS2V5LCBkYXRhKTsKLQotCi0gICAgICAgIH0KLQotICAgIH0KLQotICAgIC8qCi0gICAgKiBSZXR1cm4gU2VydmljZURhdGEgZm9yIHNwZWNpZmllZCBkaWFsZWN0Ci0gICAgKi8KLSAgICBwcml2YXRlIEFycmF5TGlzdCBnZXREYXRhTGlzdChTdHJpbmcgZGlhbGVjdCkgewotICAgICAgICBBcnJheUxpc3QgZGF0YUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIEl0ZXJhdG9yIGtleXMgPSBkYXRhTWFwLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0KLSAgICAgICAgd2hpbGUgKGtleXMuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBTdHJpbmcga2V5U3RyID0gKFN0cmluZykga2V5cy5uZXh0KCk7Ci0gICAgICAgICAgICAvLyBnZXQgYWxsIERhdGEgZWxlbWVudCB0aGF0IG1hdGNoaW5nIHRoZSBkaWFsZWN0Ci0gICAgICAgICAgICBpZiAoa2V5U3RyLmluZGV4T2YoZGlhbGVjdCkgPT0gMCkgewotICAgICAgICAgICAgICAgIGRhdGFMaXN0LmFkZChkYXRhTWFwLmdldChrZXlTdHIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZGF0YUxpc3Q7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhcmV0cmlldmFsL0Jhc2VBeGlzRGF0YUxvY2F0b3IuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhcmV0cmlldmFsL0Jhc2VBeGlzRGF0YUxvY2F0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzIxZDFiZC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YXJldHJpZXZhbC9CYXNlQXhpc0RhdGFMb2NhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFyZXRyaWV2YWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi0vKioKLSAqIEJhc2VBeGlzRGF0YUxvY2F0b3IgaW1wbGVtZW50cyBjb21tb24gY29kZSBhbmQgc2VydmVzIGFzIGEgYmFzZSBjbGFzcwotICogZm9yIHRoZSBzdXBwb3J0ZWQgZGVmYXVsdCBBeGlzMiBkaWFsZWN0IGRhdGEgbG9jYXRvcnMuCi0gKi8KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VBeGlzRGF0YUxvY2F0b3IgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhCYXNlQXhpc0RhdGFMb2NhdG9yLmNsYXNzKTsKLQotICAgIHByb3RlY3RlZCBTZXJ2aWNlRGF0YVtdIGRhdGFMaXN0ID0gbnVsbDsKLSAgICBwcml2YXRlIE91dHB1dEZvcm0gb3V0cHV0Zm9ybSA9IE91dHB1dEZvcm0uSU5MSU5FX0ZPUk07Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCBBeGlzMiBEYXRhIGxvY2F0b3IgZ2V0RGF0YSBBUEkKLSAgICAgKiBDaGVja3MgZGF0YSBpbmZvcm1hdGlvbiBjb25maWd1cmVkIGluIFNlcnZpY2VEYXRhLnhtbCBmb3IgdGhlIHN1cHBvcnRlZAotICAgICAqIG91dHB1dCBmb3JtczogaW5saW5lLCB1cmwsIEVuZHBvaW50UmVmZXJlbmNlLgotICAgICAqIDxwLz4KLSAgICAgKiBOb3RlOiBTdWJjbGFzcyB0aGF0IGhhcyBpdHMgaW1wbGVtZW50YXRpb24gb2Ygb3V0SW5saW5lRm9ybSwgb3V0cHV0TG9jYXRpb25Gb3JtLAotICAgICAqIGFuZCBvdXRwdXRSZWZlcmVuY2VGb3JtIGxvZ2ljIG11c3QgaW1wbGVtZW50IHRoZSBnZXREYXRhIEFQSS4KLSAgICAgKi8KLQotICAgIHB1YmxpYyBEYXRhW10gZ2V0RGF0YShEYXRhUmV0cmlldmFsUmVxdWVzdCByZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB0aHJvd3MgRGF0YVJldHJpZXZhbEV4Y2VwdGlvbiB7Ci0gICAgICAgIGxvZy50cmFjZSgiRGVmYXVsdCBCYXNlIERhdGFMb2NhdG9yIGdldERhdGEgc3RhcnRzIik7Ci0KLSAgICAgICAgT3V0cHV0Rm9ybSBvdXRwdXRmb3JtID0gKE91dHB1dEZvcm0pIHJlcXVlc3QuZ2V0T3V0cHV0Rm9ybSgpOwotCi0gICAgICAgIGlmIChvdXRwdXRmb3JtID09IG51bGwpIHsgLy8gbm90IGRlZmluZWQsIGRlZnVhbHQgdG8gaW5saW5lCi0gICAgICAgICAgICBvdXRwdXRmb3JtID0gT3V0cHV0Rm9ybS5JTkxJTkVfRk9STTsKLSAgICAgICAgfQotCi0gICAgICAgIERhdGFbXSBvdXRwdXQgPSBudWxsOwotCi0gICAgICAgIFN0cmluZyBvdXRwdXRGb3JtU3RyaW5nID0gb3V0cHV0Zm9ybS5nZXRUeXBlKCk7Ci0KLSAgICAgICAgaWYgKG91dHB1dGZvcm0gPT0gT3V0cHV0Rm9ybS5JTkxJTkVfRk9STSkgewotICAgICAgICAgICAgb3V0cHV0ID0gb3V0cHV0SW5saW5lRm9ybShtc2dDb250ZXh0LCBkYXRhTGlzdCk7Ci0gICAgICAgIH0gZWxzZSBpZiAob3V0cHV0Zm9ybSA9PSBPdXRwdXRGb3JtLkxPQ0FUSU9OX0ZPUk0pIHsKLSAgICAgICAgICAgIG91dHB1dCA9IG91dHB1dExvY2F0aW9uRm9ybShkYXRhTGlzdCk7Ci0KLSAgICAgICAgfSBlbHNlIGlmIChvdXRwdXRmb3JtID09IE91dHB1dEZvcm0uUkVGRVJFTkNFX0ZPUk0pIHsKLSAgICAgICAgICAgIG91dHB1dCA9IG91dHB1dFJlZmVyZW5jZUZvcm0obXNnQ29udGV4dCwgZGF0YUxpc3QpOwotCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBvdXRwdXQgPSBvdXRwdXRJbmxpbmVGb3JtKG1zZ0NvbnRleHQsIGRhdGFMaXN0KTsKLQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG91dHB1dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBsb2cuaW5mbygKLSAgICAgICAgICAgICAgICAgICAgIk51bGwgZGF0YSByZXR1cm4hIERhdGEgTG9jYXRvciBkb2VzIG5vdCBrbm93IGhvdyB0byBoYW5kbGUgcmVxdWVzdCBmb3IgZGlhbGVjdD0gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKFN0cmluZykgcmVxdWVzdC5nZXREaWFsZWN0KCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgaW4gdGhlIGZvcm0gb2YgIiArIG91dHB1dEZvcm1TdHJpbmcpOwotICAgICAgICB9Ci0KLQotICAgICAgICBsb2cudHJhY2UoIkRlZmF1bHQgQmFzZSBEYXRhTG9jYXRvciBnZXREYXRhIGVuZHMiKTsKLQotICAgICAgICByZXR1cm4gb3V0cHV0OwotICAgIH0KLQotICAgIC8qCi0gICAgICogV1NETCBvciBhIHBvbGljeSBkb2N1bWVudAotICAgICAqLwotICAgIHByb3RlY3RlZCBEYXRhW10gb3V0cHV0SW5saW5lRm9ybShNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlRGF0YVtdIHNlcnZpY2VEYXRhKSB0aHJvd3MgRGF0YVJldHJpZXZhbEV4Y2VwdGlvbiB7Ci0gICAgICAgIE9NRWxlbWVudCBtZXRhRWxlbWVudCA9IG51bGw7Ci0gICAgICAgIEFycmF5TGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGlmIChzZXJ2aWNlRGF0YSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnQgc2l6ZSA9IHNlcnZpY2VEYXRhLmxlbmd0aDsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbWV0YUVsZW1lbnQgPSBzZXJ2aWNlRGF0YVtpXS5nZXRGaWxlQ29udGVudChtc2dDb250ZXh0Ci0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0QXhpc1NlcnZpY2UoKS5nZXRDbGFzc0xvYWRlcigpKTsKLSAgICAgICAgICAgICAgICBpZiAobWV0YUVsZW1lbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXN1bHQuYWRkKG5ldyBEYXRhKG1ldGFFbGVtZW50LCBzZXJ2aWNlRGF0YVtpXS5nZXRJZGVudGlmaWVyKCkpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0KLQotCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIChEYXRhW10pIHJlc3VsdC50b0FycmF5KG5ldyBEYXRhWzBdKTsKLQotICAgIH0KLQotCi0gICAgcHJvdGVjdGVkIERhdGFbXSBvdXRwdXRMb2NhdGlvbkZvcm0oU2VydmljZURhdGFbXSBzZXJ2aWNlRGF0YSkKLSAgICAgICAgICAgIHRocm93cyBEYXRhUmV0cmlldmFsRXhjZXB0aW9uIHsKLQotICAgICAgICBBcnJheUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBpZiAoc2VydmljZURhdGEgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXJ2aWNlRGF0YS5sZW5ndGg7IGkrKykgewotCi0gICAgICAgICAgICAgICAgU3RyaW5nIHVybFZhbHVlID0gc2VydmljZURhdGFbaV0uZ2V0VVJMKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHVybFZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFkZChuZXcgRGF0YSh1cmxWYWx1ZSwgc2VydmljZURhdGFbaV0uZ2V0SWRlbnRpZmllcigpKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAoRGF0YVtdKSByZXN1bHQudG9BcnJheShuZXcgRGF0YVswXSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIERhdGFbXSBvdXRwdXRSZWZlcmVuY2VGb3JtKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZpY2VEYXRhW10gc2VydmljZURhdGEpIHRocm93cyBEYXRhUmV0cmlldmFsRXhjZXB0aW9uIHsKLSAgICAgICAgT01FbGVtZW50IGVwciA9IG51bGw7Ci0gICAgICAgIEFycmF5TGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGlmIChzZXJ2aWNlRGF0YSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlcnZpY2VEYXRhLmxlbmd0aDsgaSsrKSB7Ci0KLSAgICAgICAgICAgICAgICBlcHIgPSBzZXJ2aWNlRGF0YVtpXS5nZXRFbmRwb2ludFJlZmVyZW5jZSgpOwotICAgICAgICAgICAgICAgIGlmIChlcHIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXN1bHQuYWRkKG5ldyBEYXRhKChlcHIpLCBzZXJ2aWNlRGF0YVtpXS5nZXRJZGVudGlmaWVyKCkpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIChEYXRhW10pIHJlc3VsdC50b0FycmF5KG5ldyBEYXRhWzBdKTsKLSAgICB9Ci0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFNlcnZpY2VEYXRhKFNlcnZpY2VEYXRhW10gaW5TZXJ2aWNlRGF0YSkgewotICAgICAgICB0aGlzLmRhdGFMaXN0ID0gaW5TZXJ2aWNlRGF0YTsKLSAgICB9Ci0KLQotICAgIHByb3RlY3RlZCBPdXRwdXRGb3JtIGdldE91dHB1dEZvcm0oKSB7Ci0gICAgICAgIHJldHVybiBvdXRwdXRmb3JtOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFyZXRyaWV2YWwvRFJDb25zdGFudHMuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhcmV0cmlldmFsL0RSQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5NjAzY2EuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFyZXRyaWV2YWwvRFJDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YXJldHJpZXZhbDsKLQotLyoqCi0gKiBEZWZpbmVzIGNvbnN0YW50cyByZWZlcmVuY2VkIGluIGRhdGEgcmV0cmlldmFsIGNsYXNzZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRFJDb25zdGFudHMgewotICAgIHB1YmxpYyBpbnRlcmZhY2UgU1BFQ19WRVJTSU9OUyB7Ci0gICAgICAgIFN0cmluZyB2MV8wID0gIlNwZWNfMjAwNF8wOSI7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgaW50ZXJmYWNlIFNPQVBWZXJzaW9uIHsKLSAgICAgICAgaW50IHYxXzEgPSAxOwotCi0gICAgICAgIGludCB2MV8yID0gMjsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIERlZmluZXMgY29udGFudHMgcmVmZXJlbmNlcyBpbiBXUy1NZXggc3BlY2lmaWNhdGlvbgotICAgICAqLwotCi0gICAgcHVibGljIGludGVyZmFjZSBTUEVDIHsKLSAgICAgICAgU3RyaW5nIE5TX1VSSSA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA5L21leCI7Ci0KLSAgICAgICAgcHVibGljIGludGVyZmFjZSBBY3Rpb25zIHsKLSAgICAgICAgICAgIFN0cmluZyBHRVRfTUVUQURBVEFfUkVRVUVTVCA9Ci0gICAgICAgICAgICAgICAgICAgICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA5L21leC9HZXRNZXRhZGF0YS9SZXF1ZXN0IjsKLSAgICAgICAgICAgIFN0cmluZyBHRVRfTUVUQURBVEFfUkVTUE9OU0UgPQotICAgICAgICAgICAgICAgICAgICAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOS9tZXgvR2V0TWV0YWRhdGEvUmVzcG9uc2UiOwotCi0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgTlNfUFJFRklYID0gIm1leCI7Ci0gICAgICAgIFN0cmluZyBHRVRfTUVUQURBVEEgPSAiR2V0TWV0YWRhdGEiOwotCi0gICAgICAgIC8qKiBAZGVwcmVjYXRlZCBQbGVhc2UgdXNlIERJQUxFQ1QgaW5zdGVhZC4gIHRvZG86IGRlbGV0ZSBtZSBhZnRlciAxLjUgKi8KLSAgICAgICAgU3RyaW5nIERJQUxFVCA9ICJEaWFsZWN0IjsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBESUFMRUNUID0gIkRpYWxlY3QiOwotICAgICAgICBTdHJpbmcgSURFTlRJRklFUiA9ICJJZGVudGlmaWVyIjsKLSAgICAgICAgU3RyaW5nIE1FVEFEQVRBID0gIk1ldGFkYXRhIjsKLSAgICAgICAgU3RyaW5nIE1FVEFEQVRBX1NFQ1RJT04gPSAiTWV0YWRhdGFTZWN0aW9uIjsKLSAgICAgICAgU3RyaW5nIE1FVEFEQVRBX1JFRkVSRU5DRSA9ICJNZXRhZGF0YVJlZmVyZW5jZSI7Ci0gICAgICAgIFN0cmluZyBMT0NBVElPTiA9ICJMb2NhdGlvbiI7Ci0gICAgICAgIFN0cmluZyBUWVBFID0gInR5cGUiOwotICAgICAgICBTdHJpbmcgRElBTEVDVF9UWVBFX1dTREwgPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iOwotICAgICAgICBTdHJpbmcgRElBTEVDVF9UWVBFX1BPTElDWSA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA5L3BvbGljeSI7Ci0gICAgICAgIFN0cmluZyBESUFMRUNUX1RZUEVfU0NIRU1BID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIjsKLQotICAgIH0KLQotCi0gICAgLy8gRm9sbG93aW5nIGNvbnN0YW50cyB1c2VkIGZvciBjb25maWd1cmluZyBEYXRhIExvY2F0b3IgaW4gYXhpcy54bWwgYW5kIHNlcnZpY2VzLnhtbAotICAgIFN0cmluZyBEQVRBX0xPQ0FUT1JfRUxFTUVOVCA9ICJkYXRhTG9jYXRvciI7Ci0gICAgU3RyaW5nIERJQUxFQ1RfTE9DQVRPUl9FTEVNRU5UID0gImRpYWxlY3RMb2NhdG9yIjsKLSAgICBTdHJpbmcgRElBTEVDVF9BVFRSSUJVVEUgPSAiZGlhbGVjdCI7Ci0gICAgU3RyaW5nIENMQVNTX0FUVFJJQlVURSA9ICJjbGFzcyI7Ci0KLSAgICAvLyBTZXJ2aWNlIGxldmVsIGFuZCBHbG9iYWwgbGV2ZWwgdHlwZSBEYXRhIExvY2F0b3IKLSAgICBTdHJpbmcgU0VSVklDRV9MRVZFTCA9ICJTZXJ2aWNlTGV2ZWwiOwotICAgIFN0cmluZyBHTE9CQUxfTEVWRUwgPSAiR2xvYmFsTGV2ZWwiOwotCi0gICAgLyoqCi0gICAgICogRGVmaW5lcyBjb250YW50cyByZWZlcmVuY2VzIGluIFNlcnZpY2UgRGF0YQotICAgICAqLwotCi0gICAgcHVibGljIGludGVyZmFjZSBTRVJWSUNFX0RBVEEgewotICAgICAgICBTdHJpbmcgRklMRV9OQU1FID0gIlNlcnZpY2VEYXRhLnhtbCI7Ci0gICAgICAgIFN0cmluZyBGSUxFX1RZUEUgPSAic3ZjRGF0YSI7Ci0KLSAgICAgICAgU3RyaW5nIERBVEEgPSAiRGF0YSI7Ci0gICAgICAgIFN0cmluZyBFTkRQT0lOVF9SRUZFUkVOQ0UgPSAiRW5kcG9pbnRSZWZlcmVuY2UiOwotICAgICAgICBTdHJpbmcgVVJMID0gIlVSTCI7Ci0gICAgICAgIFN0cmluZyBGSUxFID0gImZpbGUiOwotICAgICAgICBTdHJpbmcgRElBTEVDVCA9ICJkaWFsZWN0IjsKLSAgICAgICAgU3RyaW5nIElERU5USUZJRVIgPSAiaWRlbnRpZmllciI7Ci0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhcmV0cmlldmFsL0RhdGEuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhcmV0cmlldmFsL0RhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E3ZmM4Ni4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YXJldHJpZXZhbC9EYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YXJldHJpZXZhbDsKLQotLyoqCi0gKiBEYXRhIGNvbnRhaW5zIGluc3RhbmNlIG9mIHRoZSBkYXRhIE9iamVjdCBmb3IgdGhlIHNwZWNpZmllZCBpZGVudGlmaWVyIGlmIGFwcGxpY2FibGUuCi0gKi8KLQotcHVibGljIGNsYXNzIERhdGEgewotICAgIE9iamVjdCBkYXRhOwotICAgIFN0cmluZyBpZGVudGlmaWVyOwotCi0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvcgotICAgICAqCi0gICAgICogQHBhcmFtIGluX2RhdGEgICAgICAgaW5zdGFuY2Ugb2YgT2JqZWN0IGFib3V0IHRoZSBkYXRhCi0gICAgICogQHBhcmFtIGluX2lkZW50aWZpZXIgaWRlbnRpZmllciBvZiB0aGUgZGF0YSBpbnN0YW5jZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgRGF0YShPYmplY3QgaW5fZGF0YSwgU3RyaW5nIGluX2lkZW50aWZpZXIpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgZGF0YSA9IGluX2RhdGE7Ci0gICAgICAgIGlkZW50aWZpZXIgPSBpbl9pZGVudGlmaWVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgZGF0YQotICAgICAqCi0gICAgICogQHJldHVybiBkYXRhIE9iamVjdAotICAgICAqLwotCi0gICAgcHVibGljIE9iamVjdCBnZXREYXRhKCkgewotICAgICAgICByZXR1cm4gZGF0YTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHN0cmluZyByZXByZXNlbnRpbmcgaWRlbnRpZmllciBvZiB0aGlzIGRhdGEgb2JqZWN0LgotICAgICAqCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWRlbnRpZmllcigpIHsKLSAgICAgICAgcmV0dXJuIGlkZW50aWZpZXI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFyZXRyaWV2YWwvRGF0YUxvY2F0b3JGYWN0b3J5LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YXJldHJpZXZhbC9EYXRhTG9jYXRvckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRhMzdiMC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YXJldHJpZXZhbC9EYXRhTG9jYXRvckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhcmV0cmlldmFsOwotCi0vKioKLSAqIEZhY3RvcnkgdG8gY29uc3RydWN0b3IgQXhpczIgRGF0YSBMb2NhdG9ycyBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkCi0gKiBEaWFsZWN0LgotICovCi0KLXB1YmxpYyBjbGFzcyBEYXRhTG9jYXRvckZhY3RvcnkgewotICAgIHByaXZhdGUgc3RhdGljIG9yZy5hcGFjaGUuYXhpczIuZGF0YXJldHJpZXZhbC5XU0RMRGF0YUxvY2F0b3Igd3NkbERhdGFMb2NhdG9yID0gbnVsbDsKLSAgICBwcml2YXRlIHN0YXRpYyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFyZXRyaWV2YWwuUG9saWN5RGF0YUxvY2F0b3IgcG9saWN5RGF0YUxvY2F0b3IgPSBudWxsOwotICAgIHByaXZhdGUgc3RhdGljIG9yZy5hcGFjaGUuYXhpczIuZGF0YXJldHJpZXZhbC5TY2hlbWFEYXRhTG9jYXRvciBzY2hlbWFEYXRhTG9jYXRvciA9IG51bGw7Ci0KLSAgICAvKgotICAgICogUmV0dXJuIGluc3RhbmNlIG9mIGRlZmF1bHQgRGF0YSBMb2NhdG9yIGZvciB0aGUgZGlhbGVjdC4KLSAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQXhpc0RhdGFMb2NhdG9yIGNyZWF0ZURhdGFMb2NhdG9yKFN0cmluZyBkaWFsZWN0KSB7Ci0gICAgICAgIHJldHVybiAoY3JlYXRlRGF0YUxvY2F0b3IoZGlhbGVjdCwgbnVsbCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQXhpc0RhdGFMb2NhdG9yIGNyZWF0ZURhdGFMb2NhdG9yKFN0cmluZyBkaWFsZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZpY2VEYXRhW10gc2VydmljZURhdGFBcnJheSkgewotICAgICAgICBBeGlzRGF0YUxvY2F0b3IgZGF0YUxvY2F0b3I7Ci0KLSAgICAgICAgaWYgKGRpYWxlY3QuZXF1YWxzKERSQ29uc3RhbnRzLlNQRUMuRElBTEVDVF9UWVBFX1dTREwpKSB7Ci0gICAgICAgICAgICBkYXRhTG9jYXRvciA9IGdldFdzZGxEYXRhTG9jYXRvcihzZXJ2aWNlRGF0YUFycmF5KTsKLSAgICAgICAgfSBlbHNlIGlmIChkaWFsZWN0LnRyaW0oKS5lcXVhbHMoRFJDb25zdGFudHMuU1BFQy5ESUFMRUNUX1RZUEVfUE9MSUNZKSkgewotICAgICAgICAgICAgaWYgKHBvbGljeURhdGFMb2NhdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBkYXRhTG9jYXRvciA9IG5ldyBQb2xpY3lEYXRhTG9jYXRvcihzZXJ2aWNlRGF0YUFycmF5KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZGF0YUxvY2F0b3IgPSBwb2xpY3lEYXRhTG9jYXRvcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChkaWFsZWN0LmVxdWFscyhEUkNvbnN0YW50cy5TUEVDLkRJQUxFQ1RfVFlQRV9TQ0hFTUEpKSB7Ci0gICAgICAgICAgICBpZiAoc2NoZW1hRGF0YUxvY2F0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGRhdGFMb2NhdG9yID0gbmV3IFNjaGVtYURhdGFMb2NhdG9yKHNlcnZpY2VEYXRhQXJyYXkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBkYXRhTG9jYXRvciA9IHNjaGVtYURhdGFMb2NhdG9yOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZGF0YUxvY2F0b3IgPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBkYXRhTG9jYXRvcjsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIEF4aXNEYXRhTG9jYXRvciBnZXRXc2RsRGF0YUxvY2F0b3IoU2VydmljZURhdGFbXSBzZXJ2aWNlRGF0YUFycmF5KSB7Ci0KLSAgICAgICAgaWYgKHdzZGxEYXRhTG9jYXRvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB3c2RsRGF0YUxvY2F0b3IgPSBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhcmV0cmlldmFsLldTRExEYXRhTG9jYXRvcihzZXJ2aWNlRGF0YUFycmF5KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHdzZGxEYXRhTG9jYXRvci5zZXRTZXJ2aWNlRGF0YShzZXJ2aWNlRGF0YUFycmF5KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gd3NkbERhdGFMb2NhdG9yOwotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YXJldHJpZXZhbC9EYXRhUmV0cmlldmFsRXhjZXB0aW9uLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YXJldHJpZXZhbC9EYXRhUmV0cmlldmFsRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3MmE2NjMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFyZXRyaWV2YWwvRGF0YVJldHJpZXZhbEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFyZXRyaWV2YWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLQotLyoqCi0gKiBFeGNlcHRpb24gY2xhc3MgZm9yIHJlcG9ydGluZyBEYXRhIFJldHJpZXZhbCBwcm9ibGVtcwotICovCi0KLXB1YmxpYyBjbGFzcyBEYXRhUmV0cmlldmFsRXhjZXB0aW9uIGV4dGVuZHMgQXhpc0ZhdWx0IHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMzc0OTMzMDgyMDYyMTI0OTA4TDsKLQotICAgIHB1YmxpYyBEYXRhUmV0cmlldmFsRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBEYXRhUmV0cmlldmFsRXhjZXB0aW9uKFRocm93YWJsZSBlKSB7Ci0gICAgICAgIHN1cGVyKGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBEYXRhUmV0cmlldmFsRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlLCBlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YXJldHJpZXZhbC9EYXRhUmV0cmlldmFsUmVxdWVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFyZXRyaWV2YWwvRGF0YVJldHJpZXZhbFJlcXVlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjkxNmVjNC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YXJldHJpZXZhbC9EYXRhUmV0cmlldmFsUmVxdWVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhcmV0cmlldmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLS8qKgotICogQWxsb3cgdG8gc3BlY2lmeSBvcHRpb25zL3BhcmFtZXRlcnMgZm9yIGdldERhdGEgcmVxdWVzdC4gVGhlIGxpc3QgaXMgZXh0ZW5zaWJsZQotICogYmFzZWQgb24gdGhlIGluZm9ybWF0aW9uIG5lZWRlZCBmb3IgdGhlIERhdGEgTG9jYXRvciB0byBwcm9jZXNzIHRoZSByZXF1ZXN0LgotICovCi0KLXB1YmxpYyBjbGFzcyBEYXRhUmV0cmlldmFsUmVxdWVzdCBleHRlbmRzIEhhc2hNYXAgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTM3NDkzMzA4MjA2MjEyNDkwOEw7Ci0KLSAgICAvKioKLSAgICAgKiBLZXkgdXNlZCB0byBkZWZpbmUgRGlhbGVjdCBvZiBkYXRhIHRvIGJlIHJldHJpZXZlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBESUFMRVQgPSAiRGlhbGVjdCI7Ci0gICAgLyoqCi0gICAgICogS2V5IHVzZWQgdG8gZGVmaW5lZCBJZGVudGlmeSBvZiBkYXRhIHRvIGJlIHJldHJpZXZlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBJREVOVElGSUVSID0gIklkZW50aWZpZXIiOwotICAgIC8qKgotICAgICAqIEtleSB1c2VkIHRvIGRlZmluZSB0aGUgb3V0cHV0IGZvcm1hdCBvZiByZXRyaWV2ZWQgZGF0YSB0byBiZSByZXR1cm5lZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBPVVRQVVRfRk9STSA9ICJPdXRwdXRGb3JtIjsKLQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgRGlhbGVjdCB2YWx1ZSBzcGVjaWZpZWQgaW4gdGhlIHJlcXVlc3QuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGEgU3RyaW5nIHRoYXQgaGFzIGRpYWxlY3QgaW5mby4KLSAgICAgKi8KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGlhbGVjdCgpIHRocm93cyBEYXRhUmV0cmlldmFsRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIGRpYWxlY3QgPSAoU3RyaW5nKSAoZ2V0KERJQUxFVCkpOwotICAgICAgICBpZiAoZGlhbGVjdCA9PSBudWxsIHx8IGRpYWxlY3QubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IERhdGFSZXRyaWV2YWxFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICJFbXB0eSBkaWFsZWN0IHdhcyBkZXRlY3RlZC4gRGlhbGVjdCBtdXN0IGhhdmUgdmFsdWUuIik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gKGRpYWxlY3QpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIElkZW50aWZpZXIgdmFsdWUgc3BlY2lmaWVkIGluIHRoZSByZXF1ZXN0LgotICAgICAqCi0gICAgICogQHJldHVybiBhIFN0cmluZyB0aGF0IGhhcyBJZGVudGlmaWVyIGluZm8uCi0gICAgICovCi0KLSAgICBwdWJsaWMgU3RyaW5nIGdldElkZW50aWZpZXIoKSB7Ci0gICAgICAgIHJldHVybiAoU3RyaW5nKSAoZ2V0KElERU5USUZJRVIpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBvdXRwdXQgZm9ybWF0IHNwZWNpZmllZCBpbiB0aGUgcmVxdWVzdC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gb3V0cHV0IGZvcm1hdCBvZiBkYXRhIHJldHJpZXZlZC4KLSAgICAgKi8KLQotICAgIHB1YmxpYyBPdXRwdXRGb3JtIGdldE91dHB1dEZvcm0oKSB7Ci0gICAgICAgIHJldHVybiAoT3V0cHV0Rm9ybSkgKGdldChPVVRQVVRfRk9STSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFsbG93IHRvIHNldCB0aGUgZGlhbGVjdCBvZiBkYXRhIHRvIHJldHJpZXZlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZGlhbGVjdCAtIFZhbGlkIGRpYWxlY3QgdmFsdWUgc3VwcG9ydGVkIGJ5IHRoZSBEYXRhIExvY2F0b3IuCi0gICAgICogQHRocm93cyBEYXRhUmV0cmlldmFsRXhjZXB0aW9uCi0gICAgICovCi0KLSAgICBwdWJsaWMgdm9pZCBwdXREaWFsZWN0KFN0cmluZyBkaWFsZWN0KSB0aHJvd3MgRGF0YVJldHJpZXZhbEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChkaWFsZWN0ID09IG51bGwgfHwgZGlhbGVjdC5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRGF0YVJldHJpZXZhbEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIkVtcHR5IGRpYWxlY3Qgd2FzIGRldGVjdGVkLiBEaWFsZWN0IG11c3QgaGF2ZSB2YWx1ZS4iKTsKLSAgICAgICAgfQotICAgICAgICBwdXQoRElBTEVULCBkaWFsZWN0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBbGxvdyB0byBzZXQgdGhlIGlkZW50aWZpZXIgb2YgZGF0YSB0byByZXRyaWV2ZQotICAgICAqCi0gICAgICogQHBhcmFtIGlkZW50aWZpZXIgLSBpZGVudGlmaWVyIHZhbHVlCi0gICAgICogQHRocm93cyBEYXRhUmV0cmlldmFsRXhjZXB0aW9uCi0gICAgICovCi0KLSAgICBwdWJsaWMgdm9pZCBwdXRJZGVudGlmaWVyKFN0cmluZyBpZGVudGlmaWVyKSB7Ci0gICAgICAgIHB1dChJREVOVElGSUVSLCBpZGVudGlmaWVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBbGxvdyB0byBzZXQgdGhlIG91dHB1dCBmb3JtYXQgb2YgdGhlIGRhdGEgcmV0cmlldmVkLgotICAgICAqCi0gICAgICogQHBhcmFtIGZvcm0gLSBWYWxpZCBvdXRwdXQgZm9ybWF0IHR5cGVzIHN1cHBvcnRlZCBieSB0aGUgRGF0YSBMb2NhdG9yLgotICAgICAqIEB0aHJvd3MgRGF0YVJldHJpZXZhbEV4Y2VwdGlvbgotICAgICAqLwotCi0gICAgcHVibGljIHZvaWQgcHV0T3V0cHV0Rm9ybShPdXRwdXRGb3JtIGZvcm0pIHsKLSAgICAgICAgcHV0KE9VVFBVVF9GT1JNLCBmb3JtKTsKLSAgICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFyZXRyaWV2YWwvRGF0YVJldHJpZXZhbFV0aWwuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhcmV0cmlldmFsL0RhdGFSZXRyaWV2YWxVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3YjExMmYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFyZXRyaWV2YWwvRGF0YVJldHJpZXZhbFV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YXJldHJpZXZhbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuYnVpbGRlci5TdEFYT01CdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5TdEFYVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi1wdWJsaWMgY2xhc3MgRGF0YVJldHJpZXZhbFV0aWwgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhEYXRhUmV0cmlldmFsVXRpbC5jbGFzcyk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBEYXRhUmV0cmlldmFsVXRpbCBpbnN0YW5jZSA9IG51bGw7Ci0KLSAgICBwdWJsaWMgc3RhdGljIERhdGFSZXRyaWV2YWxVdGlsIGdldEluc3RhbmNlKCkgewotICAgICAgICBpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgaW5zdGFuY2UgPSBuZXcgRGF0YVJldHJpZXZhbFV0aWwoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaW5zdGFuY2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTG9hZGluZyB4bWwgZmlsZSBjb250ZW50IGFuZCBjb252ZXJ0IHRvIE9NRWxlbWVudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmaWxlIC0gZmlsZSBwYXRoIHJlbGF0aXZlIHRvIHRoZSBTZXJ2aWNlIFJlcG9zaXRvcnkKLSAgICAgKiBAcmV0dXJuIE9NRWxlbWVudCBmb3JtYXQgb2YgdGhlIHhtbCBmaWxlIGNvbnRlbnQgCi0gICAgICogQHRocm93cyBEYXRhUmV0cmlldmFsRXhjZXB0aW9uIAotICAgICAqLwotCi0gICAgcHVibGljIE9NRWxlbWVudCBidWlsZE9NKENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyLCBTdHJpbmcgZmlsZSkKLSAgICAgICAgICAgIHRocm93cyBEYXRhUmV0cmlldmFsRXhjZXB0aW9uIHsKLSAgICAgICAgT01FbGVtZW50IGVsZW1lbnQgPSBudWxsOwotICAgICAgICBJbnB1dFN0cmVhbSBzZXJ2aWNleG1sU3RyZWFtID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNlcnZpY2V4bWxTdHJlYW0gPSBnZXRJbnB1dFN0cmVhbShjbGFzc0xvYWRlciwgZmlsZSk7Ci0KLSAgICAgICAgICAgIGVsZW1lbnQgPSBjb252ZXJ0VG9PTUVsZW1lbnQoc2VydmljZXhtbFN0cmVhbSk7Ci0gICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IERhdGFSZXRyaWV2YWxFeGNlcHRpb24oIkZhaWxlZCB0byBsb2FkIGZyb20gZmlsZSwgIiArIGZpbGUsIGUpOwotICAgICAgICB9Ci0KLQotICAgICAgICByZXR1cm4gZWxlbWVudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0IHNlcnZpY2V4bWxTdHJlYW0gdG8gT01FbGVtZW50Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gc2VydmljZXhtbFN0cmVhbSBJbnB1dFN0cmVhbSBjb250YWluIHhtbCBjb250ZW50Ci0gICAgICogQHJldHVybiBPTUVsZW1lbnQgZm9ybWF0IG9mIHRoZSB4bWwgY29udGVudAotICAgICAqIEB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uCi0gICAgICovCi0KLSAgICBwdWJsaWMgc3RhdGljIE9NRWxlbWVudCBjb252ZXJ0VG9PTUVsZW1lbnQoSW5wdXRTdHJlYW0gc2VydmljZXhtbFN0cmVhbSkKLSAgICAgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sIE9NRXhjZXB0aW9uewotICAgICAgICBPTUVsZW1lbnQgZWxlbWVudCA9IG51bGw7Ci0KLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9IFN0QVhVdGlscwotICAgICAgICAgICAgICAgIC5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoc2VydmljZXhtbFN0cmVhbSk7Ci0gICAgICAgIE9NRmFjdG9yeSBmYWMgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKTsKLSAgICAgICAgU3RBWE9NQnVpbGRlciBzdGF4T01CdWlsZGVyID0gbmV3IFN0QVhPTUJ1aWxkZXIoZmFjLCB4bWxSZWFkZXIpOwotICAgICAgICBlbGVtZW50ID0gc3RheE9NQnVpbGRlci5nZXREb2N1bWVudEVsZW1lbnQoKTsKLSAgICAgICAgZWxlbWVudC5idWlsZCgpOwotICAgICAgICByZXR1cm4gZWxlbWVudDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbShDbGFzc0xvYWRlciBjbGFzc0xvYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZmlsZSkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgSW5wdXRTdHJlYW0gc2VydmljZXhtbFN0cmVhbSA9IGNsYXNzTG9hZGVyLmdldFJlc291cmNlQXNTdHJlYW0oZmlsZSk7Ci0KLSAgICAgICAgaWYgKHNlcnZpY2V4bWxTdHJlYW0gPT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAiRmlsZSBkb2VzIG5vdCBleGlzdCBpbiB0aGUgU2VydmljZSBSZXBvc2l0b3J5ISBGaWxlPSIKLSAgICAgICAgICAgICAgICAgICAgKyBmaWxlOwotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKG1lc3NhZ2UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhyb3cgbmV3IFhNTFN0cmVhbUV4Y2VwdGlvbihtZXNzYWdlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc2VydmljZXhtbFN0cmVhbTsKLQotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhcmV0cmlldmFsL0xvY2F0b3JUeXBlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YXJldHJpZXZhbC9Mb2NhdG9yVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTk0ZDg0Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhcmV0cmlldmFsL0xvY2F0b3JUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YXJldHJpZXZhbDsKLQotLyoqCi0gKiBEZWZpbmVzIERhdGEgTG9jYXRvciB0eXBlcyBhcyBkZXNjcmliZWQgYmVsb3c6Ci0gKiBERUZBVUxUX0FYSVMgLSBEZWZhdWx0IEF4aXMyIGRhdGEgbG9jYXRvcgotICogR0xPQkFMX0xFVkVMIC0gR2xvYmFsIGxldmVsIGRhdGEgbG9jYXRvciBpLmUuLHBsdWctaW4gZGF0YSBsb2NhdG9yIHJlZ2lzdGVyZWQKLSAqIHVzaW5nIDxkYXRhTG9jYXRvcj4gZWxlbWVudCBpbiBheGlzMi54bWwuCi0gKiBHTE9CQUxfRElBTEVDVCAtIEdsb2JhbCBsZXZlbCBkaWFsZWN0IHNwZWNmaWMgZGF0YSBsb2NhdG9yIGkuZS4scGx1Zy1pbgotICogZGF0YSBsb2NhdG9yIHJlZ2lzdGVyZWQgdXNpbmcgPGRpYWxlY3RMb2NhdG9yPiBlbGVtZW50IGluIGF4aXMyLnhtbC4KLSAqIFNFUlZJQ0VfTEVWRUwgLSBTZXJ2aWNlIGxldmVsIGRhdGEgbG9jYXRvciBpLmUuIHBsdWctaW4gZGF0YSBsb2NhdG9yIHJlZ2lzdGVyZWQKLSAqIHVzaW5nIDxkYXRhTG9jYXRvcj4gZWxlbWVudCBpbiBzZXJ2aWNlcy54bWwuCi0gKiBTRVJWSUNFX0RJQUxFQ1QgLSBTZXJ2aWNlIGxldmVsIGRpYWxlY3Qgc3BlY2lmaWMgZGF0YSBsb2NhdG9yIGkuZS4gcGx1Zy1pbiBkYXRhIGxvY2F0b3IgcmVnaXN0ZXJlZAotICogdXNpbmcgPGRpYWxlY3RMb2NhdG9yPiBlbGVtZW50IGluIHNlcnZpY2VzLnhtbC4KLSAqLwotCi1wdWJsaWMgY2xhc3MgTG9jYXRvclR5cGUgewotICAgIGludCB0eXBlOwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgTG9jYXRvclR5cGUgREVGQVVMVF9BWElTID0gbmV3IExvY2F0b3JUeXBlKDApOwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgTG9jYXRvclR5cGUgR0xPQkFMX0xFVkVMID0gbmV3IExvY2F0b3JUeXBlKDEpOwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgTG9jYXRvclR5cGUgR0xPQkFMX0RJQUxFQ1QgPSBuZXcgTG9jYXRvclR5cGUoMik7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBMb2NhdG9yVHlwZSBTRVJWSUNFX0xFVkVMID0gbmV3IExvY2F0b3JUeXBlKDMpOwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgTG9jYXRvclR5cGUgU0VSVklDRV9ESUFMRUNUID0gbmV3IExvY2F0b3JUeXBlKDQpOwotCi0KLSAgICBwcm90ZWN0ZWQgTG9jYXRvclR5cGUoaW50IGludHlwZSkgewotICAgICAgICB0aGlzLnR5cGUgPSBpbnR5cGU7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRUeXBlKCkgewotICAgICAgICByZXR1cm4gdHlwZTsKLSAgICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFyZXRyaWV2YWwvT3V0cHV0Rm9ybS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFyZXRyaWV2YWwvT3V0cHV0Rm9ybS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDg1ZTM5Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhcmV0cmlldmFsL091dHB1dEZvcm0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhcmV0cmlldmFsOwotCi1wdWJsaWMgY2xhc3MgT3V0cHV0Rm9ybSB7Ci0gICAgU3RyaW5nIHR5cGU7Ci0KLSAgICAvKioKLSAgICAgKiBQb3NzaWJsZSBPdXRwdXQgZm9ybWF0cyBhcyBzdGF0ZWQgaW4gPHhzOmNob2ljZT4gb2YgPE1ldGFkYXRhU2VjdGlvbj4KLSAgICAgKiBpbiB0aGUgV1MtTUVYIHNwZWNpZmljYXRpb24uCi0gICAgICovCi0KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIE91dHB1dEZvcm0gSU5MSU5FX0ZPUk0gPSBuZXcgT3V0cHV0Rm9ybSgiSU5MSU5FX0ZPUk0iKTsKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIE91dHB1dEZvcm0gTE9DQVRJT05fRk9STSA9IG5ldyBPdXRwdXRGb3JtKCJMT0NBVElPTl9GT1JNIik7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBPdXRwdXRGb3JtIFJFRkVSRU5DRV9GT1JNID0gbmV3IE91dHB1dEZvcm0oIlJFRkVSRU5DRV9GT1JNIik7Ci0KLSAgICBwcm90ZWN0ZWQgT3V0cHV0Rm9ybShTdHJpbmcgaW50eXBlKSB7Ci0gICAgICAgIHRoaXMudHlwZSA9IGludHlwZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0gICAgICAgIHJldHVybiB0eXBlOwotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YXJldHJpZXZhbC9Qb2xpY3lEYXRhTG9jYXRvci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFyZXRyaWV2YWwvUG9saWN5RGF0YUxvY2F0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjY5MThlOS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YXJldHJpZXZhbC9Qb2xpY3lEYXRhTG9jYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFyZXRyaWV2YWw7Ci0KLQotLyoqCi0gKiBBeGlzIDIgRGF0YSBMb2NhdG9yIHJlc3BvbnNpYmxlcyBmb3IgcmV0cmlldmluZyBQb2xpY3kgbWV0YWRhdGEuIFRoZSBjbGFzcyBpcwotICogY3JlYXRlZCBhcyBtb2RlbCBmb3IgcG9saWN5IHNwZWNpZmljIGRhdGEgbG9jYXRvcjsgYW5kIGFsc28gZWFzaWVyIGZvciBhbnkKLSAqIGZ1dHVyZSBpbXBsZW1lbnRhdGlvbiBwb2xpY3kgc3BlY2lmaWMgZGF0YSByZXRyaWV2YWwgbG9naWMuCi0gKi8KLXB1YmxpYyBjbGFzcyBQb2xpY3lEYXRhTG9jYXRvciBleHRlbmRzIEJhc2VBeGlzRGF0YUxvY2F0b3IgaW1wbGVtZW50cwotCQlBeGlzRGF0YUxvY2F0b3IgewotCi0JcHJvdGVjdGVkIFBvbGljeURhdGFMb2NhdG9yKCkgewotCi0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgUG9saWN5RGF0YUxvY2F0b3IoU2VydmljZURhdGFbXSBkYXRhKSB7Ci0JCWRhdGFMaXN0ID0gZGF0YTsKLQl9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YXJldHJpZXZhbC9TY2hlbWFEYXRhTG9jYXRvci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFyZXRyaWV2YWwvU2NoZW1hRGF0YUxvY2F0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTAwM2FjNS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YXJldHJpZXZhbC9TY2hlbWFEYXRhTG9jYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhcmV0cmlldmFsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5vZGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLlhNTFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hOwotCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLS8qKgotICogQXhpcyAyIERhdGEgTG9jYXRvciByZXNwb25zaWJsZXMgZm9yIHJldHJpZXZpbmcgU2NoZW1hIG1ldGFkYXRhLiBUaGUgY2xhc3MgaXMKLSAqIGNyZWF0ZWQgYXMgbW9kZWwgZm9yIHNjaGVtYSBzcGVjaWZpYyBkYXRhIGxvY2F0b3I7IGFuZCBhbHNvIGVhc2llciBmb3IgYW55Ci0gKiBmdXR1cmUgaW1wbGVtZW50YXRpb24gc2NoZW1hIHNwZWNpZmljIGRhdGEgcmV0cmlldmFsIGxvZ2ljLgotICovCi0KLXB1YmxpYyBjbGFzcyBTY2hlbWFEYXRhTG9jYXRvciBleHRlbmRzIEJhc2VBeGlzRGF0YUxvY2F0b3IgaW1wbGVtZW50cwotICAgICAgICBBeGlzRGF0YUxvY2F0b3IgewotCi0gICAgcHJpdmF0ZSBTdHJpbmcgcmVxdWVzdElkZW50aWZpZXIgPSBudWxsOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgc2VydmljZUVQUiA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgTE9HID0gTG9nRmFjdG9yeS5nZXRMb2coU2NoZW1hRGF0YUxvY2F0b3IuY2xhc3MKLSAgICAgICAgICAgIC5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0KLSAgICBwcm90ZWN0ZWQgU2NoZW1hRGF0YUxvY2F0b3IoKSB7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvcgotICAgICAqLwotICAgIHByb3RlY3RlZCBTY2hlbWFEYXRhTG9jYXRvcihTZXJ2aWNlRGF0YVtdIGRhdGEpIHsKLSAgICAgICAgZGF0YUxpc3QgPSBkYXRhOwotICAgIH0KLQotICAgIHB1YmxpYyBEYXRhW10gZ2V0RGF0YShEYXRhUmV0cmlldmFsUmVxdWVzdCByZXF1ZXN0LAotICAgICAgICAgICAgTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgdGhyb3dzIERhdGFSZXRyaWV2YWxFeGNlcHRpb24gewotCi0gICAgICAgIHJlcXVlc3RJZGVudGlmaWVyID0gcmVxdWVzdC5nZXRJZGVudGlmaWVyKCk7Ci0gICAgICAgIHNlcnZpY2VFUFIgPSBtc2dDb250ZXh0LmdldFRvKCkuZ2V0QWRkcmVzcygpOwotCi0gICAgICAgIE91dHB1dEZvcm0gb3V0cHV0Rm9ybSA9IHJlcXVlc3QuZ2V0T3V0cHV0Rm9ybSgpOwotICAgICAgICBpZiAob3V0cHV0Rm9ybSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBvdXRwdXRGb3JtID0gT3V0cHV0Rm9ybS5JTkxJTkVfRk9STTsKLSAgICAgICAgfQotCi0gICAgICAgIERhdGFbXSBkYXRhOwotCi0gICAgICAgIGlmIChvdXRwdXRGb3JtID09IE91dHB1dEZvcm0uSU5MSU5FX0ZPUk0pIHsKLSAgICAgICAgICAgIGRhdGEgPSBvdXRwdXRJbmxpbmVGb3JtKG1zZ0NvbnRleHQsIGRhdGFMaXN0KTsKLQotICAgICAgICB9IGVsc2UgaWYgKG91dHB1dEZvcm0gPT0gT3V0cHV0Rm9ybS5MT0NBVElPTl9GT1JNKSB7Ci0gICAgICAgICAgICBkYXRhID0gb3V0cHV0TG9jYXRpb25Gb3JtKGRhdGFMaXN0KTsKLQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZGF0YSA9IG91dHB1dFJlZmVyZW5jZUZvcm0obXNnQ29udGV4dCwgZGF0YUxpc3QpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGRhdGE7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIERhdGFbXSBvdXRwdXRJbmxpbmVGb3JtKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQsCi0gICAgICAgICAgICBTZXJ2aWNlRGF0YVtdIHNlcnZpY2VEYXRhKSB0aHJvd3MgRGF0YVJldHJpZXZhbEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgRGF0YVtdIGRhdGEgPSBzdXBlci5vdXRwdXRJbmxpbmVGb3JtKG1zZ0NvbnRleHQsIHNlcnZpY2VEYXRhKTsKLQotICAgICAgICBpZiAoZGF0YS5sZW5ndGggIT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIGRhdGE7Ci0gICAgICAgIH0KLQotICAgICAgICBBeGlzU2VydmljZSBheGlzU2VydmljZSA9IG1zZ0NvbnRleHQuZ2V0QXhpc1NlcnZpY2UoKTsKLSAgICAgICAgQXJyYXlMaXN0IHNjaGVtYUxpc3QgPSBheGlzU2VydmljZS5nZXRTY2hlbWEoKTsKLQotICAgICAgICBBcnJheUxpc3QgcmVzdWx0cyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgWG1sU2NoZW1hIHNjaGVtYTsKLQotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gc2NoZW1hTGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBzY2hlbWEgPSAoWG1sU2NoZW1hKSBpdGVyYXRvci5uZXh0KCk7Ci0KLSAgICAgICAgICAgIGlmIChyZXF1ZXN0SWRlbnRpZmllciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHJlcXVlc3RJZGVudGlmaWVyLmVxdWFscyhzY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdHMuYWRkKG5ldyBEYXRhKGNvbnZlcnRUb09NKHNjaGVtYSksIHJlcXVlc3RJZGVudGlmaWVyKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXN1bHRzLmFkZChuZXcgRGF0YShjb252ZXJ0VG9PTShzY2hlbWEpLCBudWxsKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gKERhdGFbXSkgcmVzdWx0cy50b0FycmF5KG5ldyBEYXRhW3Jlc3VsdHMuc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIERhdGFbXSBvdXRwdXRMb2NhdGlvbkZvcm0oU2VydmljZURhdGFbXSBzZXJ2aWNlRGF0YSkKLSAgICAgICAgICAgIHRocm93cyBEYXRhUmV0cmlldmFsRXhjZXB0aW9uIHsKLQotICAgICAgICBEYXRhW10gZGF0YSA9IHN1cGVyLm91dHB1dExvY2F0aW9uRm9ybShzZXJ2aWNlRGF0YSk7Ci0KLSAgICAgICAgaWYgKGRhdGEgIT0gbnVsbCAmJiBkYXRhLmxlbmd0aCAhPSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gZGF0YTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IERhdGFbXSB7IG5ldyBEYXRhKHNlcnZpY2VFUFIgKyAiP3hzZCIsIHJlcXVlc3RJZGVudGlmaWVyKSB9OwotICAgIH0KLQotICAgIHByaXZhdGUgT01Ob2RlIGNvbnZlcnRUb09NKFhtbFNjaGVtYSBzY2hlbWEpIHRocm93cyBEYXRhUmV0cmlldmFsRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICAgICAgc2NoZW1hLndyaXRlKHdyaXRlcik7Ci0KLSAgICAgICAgU3RyaW5nUmVhZGVyIHJlYWRlciA9IG5ldyBTdHJpbmdSZWFkZXIod3JpdGVyLnRvU3RyaW5nKCkpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIFhNTFV0aWxzLnRvT00ocmVhZGVyKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBEYXRhUmV0cmlldmFsRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiQ2FuJ3QgY29udmVydCBYbWxTY2hlbWEgb2JqZWN0IHRvIGFuIE9NRWxlbWVudCIsIGUpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFyZXRyaWV2YWwvU2NoZW1hU3VwcGxpZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhcmV0cmlldmFsL1NjaGVtYVN1cHBsaWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5ZWE2ZTYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFyZXRyaWV2YWwvU2NoZW1hU3VwcGxpZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YXJldHJpZXZhbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7DQotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hOw0KLQ0KLS8qKg0KLSAqIFJldHVybiBhIFhNTFNjaGVtYSBhcyBhbiBPTUVsZW1lbnQuICBUaGlzIGlzIHVzZWQgYnkgYW55IEF4aXNTZXJ2aWNlIHRoYXQgd2lzaGVzDQotICogdG8gb3ZlcnJpZGUgdGhlIHN0YW5kYXJkIEF4aXNTZXJ2aWNlMldTREwgKHNlZSB0aGUgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbg0KLSAqIHBhY2thZ2UpIG1ldGhvZCBvZiBnZXR0aW5nIFhTRC4gIElmIG9uZSBvZiB0aGVzZSBpcyBwcmVzZW50IGluIHRoZSBBeGlzU2VydmljZQ0KLSAqIFBhcmFtZXRlcnMgdW5kZXIgdGhlIG5hbWUgIlNjaGVtYVN1cHBsaWVyIiwgaXQgd2lsbCBiZSBxdWVyaWVkLg0KLSAqLw0KLXB1YmxpYyBpbnRlcmZhY2UgU2NoZW1hU3VwcGxpZXIgew0KLSAgICBYbWxTY2hlbWEgZ2V0U2NoZW1hKEF4aXNTZXJ2aWNlIHNlcnZpY2UsIFN0cmluZyB4c2QpIHRocm93cyBBeGlzRmF1bHQ7DQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhcmV0cmlldmFsL1NlcnZpY2VEYXRhLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YXJldHJpZXZhbC9TZXJ2aWNlRGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTczMzJlLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhcmV0cmlldmFsL1NlcnZpY2VEYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFyZXRyaWV2YWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQXR0cmlidXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotLyoqCi0gKiBUaGlzIHJlcHJlc2VudHMgdGhlIHNlcnZpY2UgZGF0YSBmb3IgYSBkaWFsZWN0IGFuZCBpZGVudGlmaWVyIGlmIHNwZWNpZmllZC4KLSAqIEJhc2ljYWxseSwgdGhlIERhdGEgZWxlbWVudCBkZWZpbmVkIGluIHRoZSBTZXJ2aWNlRGF0YS54bWwgcGFja2FnZWQgaW4KLSAqIGEgV2ViIFNlcnZpY2UncyBhY2hpZXZlIGZpbGUuCi0gKi8KLQotcHVibGljIGNsYXNzIFNlcnZpY2VEYXRhIHsKLSAgICBPTUVsZW1lbnQgZGF0YTsKLQotICAgIFN0cmluZyBpZGVudGlmaWVyOwotCi0gICAgU3RyaW5nIGRpYWxlY3Q7Ci0KLSAgICBTdHJpbmcgZmlsZU5hbWU7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvcgotICAgICAqCi0gICAgICogQHBhcmFtIGluX2RhdGEgYW4gRGF0YSBlbGVtZW50IGluIHRoZSBTZXJ2aWNlRGF0YS4KLSAgICAgKi8KLQotICAgIHB1YmxpYyBTZXJ2aWNlRGF0YShPTUVsZW1lbnQgaW5fZGF0YSkgewotICAgICAgICBkYXRhID0gaW5fZGF0YTsKLSAgICAgICAgaWRlbnRpZmllciA9IGdldEF0dHJpYnV0ZVZhbHVlKERSQ29uc3RhbnRzLlNFUlZJQ0VfREFUQS5JREVOVElGSUVSKTsKLSAgICAgICAgZGlhbGVjdCA9IGdldEF0dHJpYnV0ZVZhbHVlKERSQ29uc3RhbnRzLlNFUlZJQ0VfREFUQS5ESUFMRUNUKTsKLSAgICAgICAgZmlsZU5hbWUgPSBnZXRBdHRyaWJ1dGVWYWx1ZShEUkNvbnN0YW50cy5TRVJWSUNFX0RBVEEuRklMRSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVWYWx1ZShTdHJpbmcgcU5hbWUpIHsKLQotICAgICAgICBTdHJpbmcgdmFsdWUgPSBudWxsOwotICAgICAgICBPTUF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSBkYXRhLmdldEF0dHJpYnV0ZShuZXcgUU5hbWUocU5hbWUpKTsKLSAgICAgICAgaWYgKGF0dHJpYnV0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB2YWx1ZSA9IGF0dHJpYnV0ZS5nZXRBdHRyaWJ1dGVWYWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHZhbHVlOwotCi0gICAgfQotCi0gICAgLy8gcmV0dXJuIGlkZW50aWZpZXIgZm9yIHRoaXMgRGF0YSBlbGVtZW50Ci0gICAgcHVibGljIFN0cmluZyBnZXRJZGVudGlmaWVyKCkgewotICAgICAgICByZXR1cm4gaWRlbnRpZmllcjsKLSAgICB9Ci0KLSAgICAvLyByZXR1cm4gZGlhbGVjdCBmb3IgdGhpcyBEYXRhIGVsZW1lbnQKLSAgICBwdWJsaWMgU3RyaW5nIGdldERpYWxlY3QoKSB7Ci0gICAgICAgIHJldHVybiBkaWFsZWN0OwotICAgIH0KLQotICAgIC8vIHJldHVybiB0aGUgRGF0YSBFTGVtZW50Ci0gICAgcHVibGljIE9NRWxlbWVudCBnZXRPTURhdGEoKSB7Ci0gICAgICAgIHJldHVybiBkYXRhOwotICAgIH0KLQotCi0gICAgLy8gR2V0IFVSTCBmcm9tIGRhdGEgRWxlbWVudAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VVJMKCkgewotCi0gICAgICAgIFN0cmluZyB1cmxWYWx1ZSA9IG51bGw7Ci0gICAgICAgIE9NRWxlbWVudCB1cmwgPSBkYXRhLmdldEZpcnN0Q2hpbGRXaXRoTmFtZShuZXcgUU5hbWUoCi0gICAgICAgICAgICAgICAgRFJDb25zdGFudHMuU0VSVklDRV9EQVRBLlVSTCkpOwotICAgICAgICBpZiAodXJsICE9IG51bGwpIHsKLSAgICAgICAgICAgIHVybFZhbHVlID0gdXJsLmdldFRleHQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB1cmxWYWx1ZTsKLSAgICB9Ci0KLSAgICAvLyBHZXQgRU5EUE9JTlRfUkVGRVJFTkNFIGZyb20gRGF0YSBFbGVtZW50Ci0gICAgcHVibGljIE9NRWxlbWVudCBnZXRFbmRwb2ludFJlZmVyZW5jZSgpIHsKLSAgICAgICAgT01FbGVtZW50IGVwciA9IGRhdGEuZ2V0Rmlyc3RDaGlsZFdpdGhOYW1lKG5ldyBRTmFtZSgKLSAgICAgICAgICAgICAgICBEUkNvbnN0YW50cy5TRVJWSUNFX0RBVEEuRU5EUE9JTlRfUkVGRVJFTkNFKSk7Ci0gICAgICAgIHJldHVybiBlcHI7Ci0gICAgfQotCi0gICAgLy8gTG9hZCB0aGUgZmlsZSBjb250ZW50IG9mIHRoZSBmaWxlIHNwZWNpZmllZCBpbiB0aGUgZmlsZSBhdHRyaWJ1dGUKLSAgICAvLyBpbiB0aGUgZGF0YSBlbGVtZW50LgotICAgIHB1YmxpYyBPTUVsZW1lbnQgZ2V0RmlsZUNvbnRlbnQoQ2xhc3NMb2FkZXIgY2xhc3Nsb2FkZXIpCi0gICAgICAgICAgICB0aHJvd3MgRGF0YVJldHJpZXZhbEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgT01FbGVtZW50IG1ldGFFbGVtZW50ID0gbnVsbDsKLSAgICAgICAgaWYgKGZpbGVOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIERhdGFSZXRyaWV2YWxVdGlsIHV0aWwgPSBEYXRhUmV0cmlldmFsVXRpbC5nZXRJbnN0YW5jZSgpOwotCi0gICAgICAgICAgICBtZXRhRWxlbWVudCA9IHV0aWwuYnVpbGRPTShjbGFzc2xvYWRlciwgZmlsZU5hbWUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtZXRhRWxlbWVudDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YXJldHJpZXZhbC9XU0RMRGF0YUxvY2F0b3IuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhcmV0cmlldmFsL1dTRExEYXRhTG9jYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzE1ZTcyLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhcmV0cmlldmFsL1dTRExEYXRhTG9jYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhcmV0cmlldmFsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTJXU0RMMTE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLS8qKgotICogQXhpcyAyIERhdGEgTG9jYXRvciByZXNwb25zaWJsZXMgZm9yIHJldHJpZXZpbmcgV1NETCBtZXRhZGF0YS4KLSAqLwotcHVibGljIGNsYXNzIFdTRExEYXRhTG9jYXRvciBleHRlbmRzIEJhc2VBeGlzRGF0YUxvY2F0b3IgaW1wbGVtZW50cyBBeGlzRGF0YUxvY2F0b3IgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhXU0RMRGF0YUxvY2F0b3IuY2xhc3MpOwotICAgIFN0cmluZyBzZXJ2aWNlVVJMID0gbnVsbDsKLSAgICBBeGlzU2VydmljZSB0aGVTZXJ2aWNlID0gbnVsbDsKLSAgICBTdHJpbmcgcmVxdWVzdF9JZGVudGlmaWVyID0gbnVsbDsKLQotICAgIHByb3RlY3RlZCBXU0RMRGF0YUxvY2F0b3IoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IKLSAgICAgKgotICAgICAqIEBwYXJhbSBkYXRhIGFuIGFycmF5IG9mIFNlcnZpY2VEYXRhIGluc3RhbmNlIGRlZmluZWQgaW4gdGhlCi0gICAgICogICAgICAgICAgICAgU2VydmljZURhdGEueG1sIGZvciB0aGUgV1NETCBkaWFsZWN0LgotICAgICAqLwotICAgIHByb3RlY3RlZCBXU0RMRGF0YUxvY2F0b3IoU2VydmljZURhdGFbXSBkYXRhKSB7Ci0gICAgICAgIGRhdGFMaXN0ID0gZGF0YTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBnZXREYXRhIEFQSQotICAgICAqIEltcGxlbWVudCBkYXRhIHJldHJpZXZhbCBsb2dpYyBmb3IgV1NETCBkaWFsZWN0Ci0gICAgICovCi0gICAgcHVibGljIERhdGFbXSBnZXREYXRhKERhdGFSZXRyaWV2YWxSZXF1ZXN0IHJlcXVlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHRocm93cyBEYXRhUmV0cmlldmFsRXhjZXB0aW9uIHsKLSAgICAgICAgbG9nLnRyYWNlKCJEZWZhdWx0IFdTREwgRGF0YUxvY2F0b3IgZ2V0RGF0YSBzdGFydHMiKTsKLQotICAgICAgICByZXF1ZXN0X0lkZW50aWZpZXIgPSByZXF1ZXN0LmdldElkZW50aWZpZXIoKTsKLSAgICAgICAgc2VydmljZVVSTCA9IG1zZ0NvbnRleHQuZ2V0VG8oKS5nZXRBZGRyZXNzKCk7Ci0KLSAgICAgICAgT3V0cHV0Rm9ybSBvdXRwdXRmb3JtID0gcmVxdWVzdC5nZXRPdXRwdXRGb3JtKCk7Ci0KLSAgICAgICAgaWYgKG91dHB1dGZvcm0gPT0gbnVsbCkgeyAvLyBub3QgZGVmaW5lZCwgZGVmdWFsdCB0byBpbmxpbmUKLSAgICAgICAgICAgIG91dHB1dGZvcm0gPSBPdXRwdXRGb3JtLklOTElORV9GT1JNOwotICAgICAgICB9Ci0KLSAgICAgICAgRGF0YVtdIG91dHB1dDsKLQotICAgICAgICBTdHJpbmcgb3V0cHV0Rm9ybVN0cmluZyA9IG91dHB1dGZvcm0uZ2V0VHlwZSgpOwotCi0gICAgICAgIGlmIChvdXRwdXRmb3JtID09IE91dHB1dEZvcm0uSU5MSU5FX0ZPUk0pIHsKLSAgICAgICAgICAgIG91dHB1dCA9IG91dHB1dElubGluZUZvcm0obXNnQ29udGV4dCwgZGF0YUxpc3QpOwotICAgICAgICB9IGVsc2UgaWYgKG91dHB1dGZvcm0gPT0gT3V0cHV0Rm9ybS5MT0NBVElPTl9GT1JNKSB7Ci0gICAgICAgICAgICBvdXRwdXQgPSBvdXRwdXRMb2NhdGlvbkZvcm0oZGF0YUxpc3QpOwotCi0gICAgICAgIH0gZWxzZSBpZiAob3V0cHV0Zm9ybSA9PSBPdXRwdXRGb3JtLlJFRkVSRU5DRV9GT1JNKSB7Ci0gICAgICAgICAgICBvdXRwdXQgPSBvdXRwdXRSZWZlcmVuY2VGb3JtKG1zZ0NvbnRleHQsIGRhdGFMaXN0KTsKLQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgb3V0cHV0ID0gb3V0cHV0SW5saW5lRm9ybShtc2dDb250ZXh0LCBkYXRhTGlzdCk7Ci0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChvdXRwdXQgPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLnRyYWNlKAotICAgICAgICAgICAgICAgICAgICAgICAgIk51bGwgZGF0YSByZXR1cm4hIERhdGEgTG9jYXRvciBkb2VzIG5vdCBrbm93IGhvdyB0byBoYW5kbGUgcmVxdWVzdCBmb3IgZGlhbGVjdD0gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuZ2V0RGlhbGVjdCgpICsgIiBpbiB0aGUgZm9ybSBvZiAiICsgb3V0cHV0Rm9ybVN0cmluZyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotCi0gICAgICAgIGxvZy50cmFjZSgiRGVmYXVsdCBXU0RMIERhdGFMb2NhdG9yIGdldERhdGEgZW5kcyIpOwotCi0KLSAgICAgICAgcmV0dXJuIG91dHB1dDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuZGF0YXJldHJpZXZhbC5CYXNlQXhpc0RhdGFMb2NhdG9yI291dHB1dElubGluZUZvcm0ob3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0LCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFyZXRyaWV2YWwuU2VydmljZURhdGFbXSkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRGF0YVtdIG91dHB1dElubGluZUZvcm0oTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCwgU2VydmljZURhdGFbXSBkYXRhTGlzdCkKLSAgICAgICAgICAgIHRocm93cyBEYXRhUmV0cmlldmFsRXhjZXB0aW9uIHsKLSAgICAgICAgRGF0YVtdICByZXN1bHQgPSBzdXBlci5vdXRwdXRJbmxpbmVGb3JtKG1zZ0NvbnRleHQsIGRhdGFMaXN0KTsKLQotICAgICAgICAvLyBEbyBub3QgZ2VuZXJhdGUgV1NETCBpZiBJZGVudGlmaWVyIHdhcyBzcGVjaWZpZWQgaW4gdGhlIHJlcXVlc3QgYXMKLSAgICAgICAgLy8gKDEpIHRoaXMgaXMgdG8gc3VwcG9ydCA/d3NkbCByZXF1ZXN0OyAKLSAgICAgICAgLy8gKDIpIERhdGEgZm9yIHNwZWNpZmllZCBJZGVudGlmaWVyIG11c3QgYmUgYXZhaWxhYmxlIHRvIHNhdGlzZnkgdGhlIEdldE1ldGFkYXRhIHJlcXVlc3QuCi0KLSAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGggPT0gMCkgewotICAgICAgICAgICAgCi0gICAgICAgICAgICBsb2cudHJhY2UoIkRlZmF1bHQgV1NETCBEYXRhTG9jYXRvciBhdHRlbXB0IHRvIGdlbmVyYXRlcyBXU0RMLiIpOwotCi0gICAgICAgICAgICBpZiAobXNnQ29udGV4dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhlU2VydmljZSA9IG1zZ0NvbnRleHQuZ2V0QXhpc1NlcnZpY2UoKTsKLSAgICAgICAgICAgICAgICBzZXJ2aWNlVVJMID0gbXNnQ29udGV4dC5nZXRUbygpLmdldEFkZHJlc3MoKTsKLSAgICAgICAgICAgICAgICB0aGVTZXJ2aWNlLnNldEVuZHBvaW50VVJMKHNlcnZpY2VVUkwpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGF0YVJldHJpZXZhbEV4Y2VwdGlvbigiTWVzc2FnZUNvbnRleHQgd2FzIG5vdCBzZXQhIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChyZXF1ZXN0X0lkZW50aWZpZXIgPT0gbnVsbCB8fCByZXF1ZXN0X0lkZW50aWZpZXIuZXF1YWxzKHRoZVNlcnZpY2UuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpKSB7Ci0KLSAgICAgICAgICAgICAgICBBeGlzU2VydmljZTJXU0RMMTEgYXhpc1NlcnZpY2UyV09NOwotICAgICAgICAgICAgICAgIE9NRWxlbWVudCB3c2RsRWxlbWVudDsKLQotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlMldPTSA9IG5ldyBBeGlzU2VydmljZTJXU0RMMTEodGhlU2VydmljZSk7Ci0gICAgICAgICAgICAgICAgICAgIHdzZGxFbGVtZW50ID0gYXhpc1NlcnZpY2UyV09NLmdlbmVyYXRlT00oKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKGUpOwotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGF0YVJldHJpZXZhbEV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAod3NkbEVsZW1lbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBsb2cudHJhY2UoIkRlZmF1bHQgV1NETCBEYXRhTG9jYXRvciBzdWNjZXNzZnVsbHkgZ2VuZXJhdGVkIFdTREwuIik7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBEYXRhWzFdOwotICAgICAgICAgICAgICAgICAgICByZXN1bHRbMF0gPSBuZXcgRGF0YSh3c2RsRWxlbWVudCwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qCi0gICAgICogCi0gICAgICovCi0gICAgcHJvdGVjdGVkIERhdGFbXSBvdXRwdXRMb2NhdGlvbkZvcm0oU2VydmljZURhdGFbXSBzZXJ2aWNlRGF0YSkgdGhyb3dzIERhdGFSZXRyaWV2YWxFeGNlcHRpb24gewotICAgICAgICBEYXRhW10gcmVzdWx0ID0gc3VwZXIub3V0cHV0TG9jYXRpb25Gb3JtKHNlcnZpY2VEYXRhKTsKLQotICAgICAgICAvLyBEbyBub3QgZ2VuZXJhdGUgVVJMIGlmIElkZW50aWZpZXIgd2FzIHNwZWNpZmllZCBpbiB0aGUgcmVxdWVzdCBhcwotICAgICAgICAvLyAoMSkgQXhpczIgP3dzZGwgVVJMIHJlcXVlc3QgaXMgbm90IHN1cHBvcnRpbmcgSWRlbnRpZmllcjsgCi0gICAgICAgIC8vICgyKSBVUkwgZGF0YSBmb3Igc3BlY2lmaWVkIElkZW50aWZpZXIgbXVzdCBiZSBhdmFpbGFibGUgdG8gc2F0aXNmeQotICAgICAgICAvLyAgICAgdGhlIEdldE1ldGFkYXRhIHJlcXVlc3QuCi0KLSAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGggPT0gMCAmJiByZXF1ZXN0X0lkZW50aWZpZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgcmVzdWx0ID0gbmV3IERhdGFbMV07Ci0gICAgICAgICAgICByZXN1bHRbMF0gPSBuZXcgRGF0YShzZXJ2aWNlVVJMICsgIj93c2RsIiwgbnVsbCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFyZXRyaWV2YWwvV1NETFN1cHBsaWVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YXJldHJpZXZhbC9XU0RMU3VwcGxpZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRkZWVhZi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YXJldHJpZXZhbC9XU0RMU3VwcGxpZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YXJldHJpZXZhbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7DQotDQotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsNCi0NCi0vKioNCi0gKiBSZXR1cm4gYSBXU0RMIGFzIGFuIE9NRWxlbWVudC4gIFRoaXMgaXMgdXNlZCBieSBhbnkgQXhpc1NlcnZpY2UgdGhhdCB3aXNoZXMNCi0gKiB0byBvdmVycmlkZSB0aGUgc3RhbmRhcmQgQXhpc1NlcnZpY2UyV1NETCAoc2VlIHRoZSBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uDQotICogcGFja2FnZSkgbWV0aG9kIG9mIGdldHRpbmcgV1NETC4gIElmIG9uZSBvZiB0aGVzZSBpcyBwcmVzZW50IGluIHRoZSBBeGlzU2VydmljZQ0KLSAqIFBhcmFtZXRlcnMgdW5kZXIgdGhlIG5hbWUgIldTRExTdXBwbGllciIsIGl0IHdpbGwgYmUgcXVlcmllZC4NCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIFdTRExTdXBwbGllciB7DQotICAgIERlZmluaXRpb24gZ2V0V1NETChBeGlzU2VydmljZSBzZXJ2aWNlKSB0aHJvd3MgQXhpc0ZhdWx0Ow0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YXJldHJpZXZhbC9jbGllbnQvTWV4Q2xpZW50LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YXJldHJpZXZhbC9jbGllbnQvTWV4Q2xpZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiMTllNWUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFyZXRyaWV2YWwvY2xpZW50L01leENsaWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFyZXRyaWV2YWwuY2xpZW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50LlNlcnZpY2VDbGllbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YXJldHJpZXZhbC5EUkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1wdWJsaWMgY2xhc3MgTWV4Q2xpZW50IGV4dGVuZHMgU2VydmljZUNsaWVudCB7Ci0KLSAgICBwdWJsaWMgTWV4Q2xpZW50KENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQsIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlKQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIHN1cGVyKGNvbmZpZ0NvbnRleHQsIGF4aXNTZXJ2aWNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWV4Q2xpZW50KENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICBEZWZpbml0aW9uIHdzZGw0akRlZmluaXRpb24sIFFOYW1lIHdzZGxTZXJ2aWNlTmFtZSwgU3RyaW5nIHBvcnROYW1lKQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIHN1cGVyKGNvbmZpZ0NvbnRleHQsIHdzZGw0akRlZmluaXRpb24sIHdzZGxTZXJ2aWNlTmFtZSwgcG9ydE5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBNZXhDbGllbnQoQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ29udGV4dCwgVVJMIHdzZGxVUkwsCi0gICAgICAgICAgICAgICAgICAgICBRTmFtZSB3c2RsU2VydmljZU5hbWUsIFN0cmluZyBwb3J0TmFtZSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIHN1cGVyKGNvbmZpZ0NvbnRleHQsIHdzZGxVUkwsIHdzZGxTZXJ2aWNlTmFtZSwgcG9ydE5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBNZXhDbGllbnQoKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBCdWlsZHMgT01FbGVtZW50IHRoYXQgbWFrZXMgdXAgb2YgU09BUCBib2R5LgotICAgICAqLwotICAgIHB1YmxpYyBPTUVsZW1lbnQgc2V0dXBHZXRNZXRhZGF0YVJlcXVlc3QoU3RyaW5nIGRpYWxlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaWRlbnRpZmllcikgdGhyb3dzIEF4aXNGYXVsdCB7Ci0KLSAgICAgICAgLy8gQXR0ZW1wdCB0byBlbmdhZ2UgTUVYIG1vZHVsZQotICAgICAgICAvKiAgICB0cnl7Ci0gICAgICAgICAgc3VwZXIuZW5nYWdlTW9kdWxlKCJtZXRhZGF0YUV4Y2hhbmdlIik7Ci0gICAgICAgfQotICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSl7Ci0gICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0ICgiVW5hYmxlIHRvIHByb2NlZWQgd2l0aCBHZXRNZXRhZGF0YSBSZXF1ZXN0ISIsIGUpOwotICAgICAgIH0gKi8KLQotICAgICAgICBPTUZhY3RvcnkgZmFjID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCk7Ci0KLSAgICAgICAgT01OYW1lc3BhY2Ugb21OcyA9IGZhYy5jcmVhdGVPTU5hbWVzcGFjZShEUkNvbnN0YW50cy5TUEVDLk5TX1VSSSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEUkNvbnN0YW50cy5TUEVDLk5TX1BSRUZJWCk7Ci0KLSAgICAgICAgT01FbGVtZW50IG1ldGhvZCA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoRFJDb25zdGFudHMuU1BFQy5HRVRfTUVUQURBVEEsIG9tTnMpOwotICAgICAgICBpZiAoZGlhbGVjdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgZGlhbGVjdEVsZW0gPSBmYWMuY3JlYXRlT01FbGVtZW50KERSQ29uc3RhbnRzLlNQRUMuRElBTEVDVCwgb21Ocyk7Ci0KLSAgICAgICAgICAgIGRpYWxlY3RFbGVtLnNldFRleHQoZGlhbGVjdCk7Ci0gICAgICAgICAgICBtZXRob2QuYWRkQ2hpbGQoZGlhbGVjdEVsZW0pOwotICAgICAgICB9Ci0gICAgICAgIC8vIGNyZWF0ZSBJZGVudGlmaWVyIGVsZW1lbnQKLSAgICAgICAgaWYgKGlkZW50aWZpZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgT01FbGVtZW50IGlkX0VsZW0gPSBmYWMuY3JlYXRlT01FbGVtZW50KERSQ29uc3RhbnRzLlNQRUMuSURFTlRJRklFUiwgb21Ocyk7Ci0gICAgICAgICAgICBpZF9FbGVtLnNldFRleHQoaWRlbnRpZmllcik7Ci0gICAgICAgICAgICBtZXRob2QuYWRkQ2hpbGQoaWRfRWxlbSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1ldGhvZDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9BeGlzQ29uZmlnQnVpbGRlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvQXhpc0NvbmZpZ0J1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNkOGIwMy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9BeGlzQ29uZmlnQnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzc0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLmF0dGFjaG1lbnRzLmxpZmVjeWNsZS5MaWZlY3ljbGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlJvbGVQbGF5ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbkNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5idWlsZGVyLkFwcGxpY2F0aW9uWE1MQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmJ1aWxkZXIuQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmJ1aWxkZXIuTUlNRUJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5idWlsZGVyLk1UT01CdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYnVpbGRlci5TT0FQQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmJ1aWxkZXIuWEZvcm1VUkxFbmNvZGVkQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFyZXRyaWV2YWwuRFJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LnV0aWwuUGhhc2VzSW5mbzsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQudXRpbC5VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0NvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc09ic2VydmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLk1lc3NhZ2VSZWNlaXZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5QaGFzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmkxOG4uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5waGFzZXJlc29sdmVyLlBoYXNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lk1lc3NhZ2VGb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuVHJhbnNwb3J0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuVHJhbnNwb3J0U2VuZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5KYXZhVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLkxvYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuVGFyZ2V0UmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLlRocmVhZENvbnRleHRNaWdyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuVGhyZWFkQ29udGV4dE1pZ3JhdG9yVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1wdWJsaWMgY2xhc3MgQXhpc0NvbmZpZ0J1aWxkZXIgZXh0ZW5kcyBEZXNjcmlwdGlvbkJ1aWxkZXIgewotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coQXhpc0NvbmZpZ0J1aWxkZXIuY2xhc3MpOwotICAgIHByaXZhdGUgRGVwbG95bWVudEVuZ2luZSBkZXBsb3ltZW50RW5naW5lOwotCi0gICAgcHVibGljIEF4aXNDb25maWdCdWlsZGVyKElucHV0U3RyZWFtIHNlcnZpY2VJbnB1dFN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZ3VyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlcGxveW1lbnRFbmdpbmUgZGVwbG95bWVudEVuZ2luZSkgewotICAgICAgICBzdXBlcihzZXJ2aWNlSW5wdXRTdHJlYW0sIGF4aXNDb25maWd1cmF0aW9uKTsKLSAgICAgICAgdGhpcy5kZXBsb3ltZW50RW5naW5lID0gZGVwbG95bWVudEVuZ2luZTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyBBeGlzQ29uZmlnQnVpbGRlcihBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlndXJhdGlvbikgewotICAgICAgICB0aGlzLmF4aXNDb25maWcgPSBheGlzQ29uZmlndXJhdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwb3B1bGF0ZUNvbmZpZygpIHRocm93cyBEZXBsb3ltZW50RXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBjb25maWdfZWxlbWVudCA9IGJ1aWxkT00oKTsKLQotICAgICAgICAgICAgaWYgKCFUQUdfQVhJU0NPTkZJRy5lcXVhbHMoY29uZmlnX2VsZW1lbnQuZ2V0TG9jYWxOYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiYmFkZWxlbWVudGZvdW5kIiwgVEFHX0FYSVNDT05GSUcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWdfZWxlbWVudC5nZXRMb2NhbE5hbWUoKSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gcHJvY2Vzc2luZyBQYXJhbWV0ZXJzCi0gICAgICAgICAgICAvLyBQcm9jZXNzaW5nIHNlcnZpY2UgbGV2ZWwgcGFyYW1ldGVycwotICAgICAgICAgICAgSXRlcmF0b3IgaXRyID0gY29uZmlnX2VsZW1lbnQuZ2V0Q2hpbGRyZW5XaXRoTmFtZShuZXcgUU5hbWUoVEFHX1BBUkFNRVRFUikpOwotCi0gICAgICAgICAgICBwcm9jZXNzUGFyYW1ldGVycyhpdHIsIGF4aXNDb25maWcsIGF4aXNDb25maWcpOwotCi0gICAgICAgICAgICAvLyBwcm9jZXNzIE1lc3NhZ2VSZWNlaXZlcgotICAgICAgICAgICAgT01FbGVtZW50IG1lc3NhZ2VSZWNlaXZlciA9Ci0gICAgICAgICAgICAgICAgICAgIGNvbmZpZ19lbGVtZW50LmdldEZpcnN0Q2hpbGRXaXRoTmFtZShuZXcgUU5hbWUoVEFHX01FU1NBR0VfUkVDRUlWRVJTKSk7Ci0gICAgICAgICAgICBpZiAobWVzc2FnZVJlY2VpdmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBIYXNoTWFwIG1ycyA9IHByb2Nlc3NNZXNzYWdlUmVjZWl2ZXJzKG1lc3NhZ2VSZWNlaXZlcik7Ci0gICAgICAgICAgICAgICAgSXRlcmF0b3Iga2V5cyA9IG1ycy5rZXlTZXQoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgIHdoaWxlIChrZXlzLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcga2V5ID0gKFN0cmluZykga2V5cy5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGF4aXNDb25maWcuYWRkTWVzc2FnZVJlY2VpdmVyKGtleSwgKE1lc3NhZ2VSZWNlaXZlcikgbXJzLmdldChrZXkpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBQcm9jZXNzIE1vZHVsZSByZWZzCi0gICAgICAgICAgICBJdGVyYXRvciBtb2R1bGVpdHIgPQotICAgICAgICAgICAgICAgICAgICBjb25maWdfZWxlbWVudC5nZXRDaGlsZHJlbldpdGhOYW1lKG5ldyBRTmFtZShEZXBsb3ltZW50Q29uc3RhbnRzLlRBR19NT0RVTEUpKTsKLQotICAgICAgICAgICAgcHJvY2Vzc01vZHVsZVJlZnMobW9kdWxlaXRyLCBheGlzQ29uZmlnKTsKLQotICAgICAgICAgICAgLy8gUHJvY2Vzc2luZyBUcmFuc3BvcnQgU2VuZGVycwotICAgICAgICAgICAgSXRlcmF0b3IgdHJzX3NlbmRlcnMgPQotICAgICAgICAgICAgICAgICAgICBjb25maWdfZWxlbWVudC5nZXRDaGlsZHJlbldpdGhOYW1lKG5ldyBRTmFtZShUQUdfVFJBTlNQT1JUX1NFTkRFUikpOwotCi0gICAgICAgICAgICBwcm9jZXNzVHJhbnNwb3J0U2VuZGVycyh0cnNfc2VuZGVycyk7Ci0KLSAgICAgICAgICAgIC8vIFByb2Nlc3NpbmcgVHJhbnNwb3J0IFJlY2VpdmVycwotICAgICAgICAgICAgSXRlcmF0b3IgdHJzX1JlaXZlcnMgPQotICAgICAgICAgICAgICAgICAgICBjb25maWdfZWxlbWVudC5nZXRDaGlsZHJlbldpdGhOYW1lKG5ldyBRTmFtZShUQUdfVFJBTlNQT1JUX1JFQ0VJVkVSKSk7Ci0KLSAgICAgICAgICAgIHByb2Nlc3NUcmFuc3BvcnRSZWNlaXZlcnModHJzX1JlaXZlcnMpOwotCi0gICAgICAgICAgICAvLyBQcm9jZXNzIFRhcmdldFJlc29sdmVycwotICAgICAgICAgICAgT01FbGVtZW50IHRhcmdldFJlc29sdmVycyA9Ci0gICAgICAgICAgICAgICAgICAgIGNvbmZpZ19lbGVtZW50LmdldEZpcnN0Q2hpbGRXaXRoTmFtZShuZXcgUU5hbWUoVEFHX1RBUkdFVF9SRVNPTFZFUlMpKTsKLSAgICAgICAgICAgIHByb2Nlc3NUYXJnZXRSZXNvbHZlcnMoYXhpc0NvbmZpZywgdGFyZ2V0UmVzb2x2ZXJzKTsKLQotICAgICAgICAgICAgLy8gUHJvY2VzcyBUaHJlYWRDb250ZXh0TWlncmF0b3JzCi0gICAgICAgICAgICBPTUVsZW1lbnQgdGhyZWFkQ29udGV4dE1pZ3JhdG9ycyA9Ci0gICAgICAgICAgICAgICAgICAgIGNvbmZpZ19lbGVtZW50LmdldEZpcnN0Q2hpbGRXaXRoTmFtZShuZXcgUU5hbWUoVEFHX1RIUkVBRF9DT05URVhUX01JR1JBVE9SUykpOwotICAgICAgICAgICAgcHJvY2Vzc1RocmVhZENvbnRleHRNaWdyYXRvcnMoYXhpc0NvbmZpZywgdGhyZWFkQ29udGV4dE1pZ3JhdG9ycyk7Ci0KLSAgICAgICAgICAgIC8vIFByb2Nlc3MgT2JzZXJ2ZXJzCi0gICAgICAgICAgICBJdGVyYXRvciBvYnNfaXR0ciA9IGNvbmZpZ19lbGVtZW50LmdldENoaWxkcmVuV2l0aE5hbWUobmV3IFFOYW1lKFRBR19MSVNURU5FUikpOwotCi0gICAgICAgICAgICBwcm9jZXNzT2JzZXJ2ZXJzKG9ic19pdHRyKTsKLQotICAgICAgICAgICAgLy8gUHJvY2Vzc2luZyBQaGFzZSBvcmRlcnMKLSAgICAgICAgICAgIEl0ZXJhdG9yIHBoYXNlb3JkZXJzID0gY29uZmlnX2VsZW1lbnQuZ2V0Q2hpbGRyZW5XaXRoTmFtZShuZXcgUU5hbWUoVEFHX1BIQVNFX09SREVSKSk7Ci0KLSAgICAgICAgICAgIHByb2Nlc3NQaGFzZU9yZGVycyhwaGFzZW9yZGVycyk7Ci0KLSAgICAgICAgICAgIEl0ZXJhdG9yIG1vZHVsZUNvbmZpZ3MgPQotICAgICAgICAgICAgICAgICAgICBjb25maWdfZWxlbWVudC5nZXRDaGlsZHJlbldpdGhOYW1lKG5ldyBRTmFtZShUQUdfTU9EVUxFX0NPTkZJRykpOwotCi0gICAgICAgICAgICBwcm9jZXNzTW9kdWxlQ29uZmlnKG1vZHVsZUNvbmZpZ3MsIGF4aXNDb25maWcsIGF4aXNDb25maWcpOwotCi0gICAgICAgICAgICAvLyBwcm9jZXNzaW5nIDx3c3A6UG9saWN5PiAuLiA8Ly4uPiBlbGVtZW50cwotICAgICAgICAgICAgSXRlcmF0b3IgcG9saWN5RWxlbWVudHMgPSBjb25maWdfZWxlbWVudC5nZXRDaGlsZHJlbldpdGhOYW1lKG5ldyBRTmFtZShQT0xJQ1lfTlNfVVJJLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQUdfUE9MSUNZKSk7Ci0KLSAgICAgICAgICAgIGlmIChwb2xpY3lFbGVtZW50cyAhPSBudWxsICYmIHBvbGljeUVsZW1lbnRzLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIHByb2Nlc3NQb2xpY3lFbGVtZW50cyhwb2xpY3lFbGVtZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpc0NvbmZpZy5nZXRQb2xpY3lTdWJqZWN0KCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBwcm9jZXNzaW5nIDx3c3A6UG9saWN5UmVmZXJlbmNlPiAuLiA8Ly4uPiBlbGVtZW50cwotICAgICAgICAgICAgSXRlcmF0b3IgcG9saWN5UmVmRWxlbWVudHMgPSBjb25maWdfZWxlbWVudC5nZXRDaGlsZHJlbldpdGhOYW1lKG5ldyBRTmFtZShQT0xJQ1lfTlNfVVJJLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQUdfUE9MSUNZX1JFRikpOwotCi0gICAgICAgICAgICBpZiAocG9saWN5UmVmRWxlbWVudHMgIT0gbnVsbCAmJiBwb2xpY3lSZWZFbGVtZW50cy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBwcm9jZXNzUG9saWN5UmVmRWxlbWVudHMocG9saWN5RWxlbWVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNDb25maWcuZ2V0UG9saWN5U3ViamVjdCgpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy90byBwcm9jZXNzIGRlZmF1bHQgbW9kdWxlIHZlcnNpb25zCi0gICAgICAgICAgICBPTUVsZW1lbnQgZGVmYXVsdE1vZHVsZVZlcmlvbkVsZW1lbnQgPSBjb25maWdfZWxlbWVudC5nZXRGaXJzdENoaWxkV2l0aE5hbWUobmV3IFFOYW1lKAotICAgICAgICAgICAgICAgICAgICBUQUdfREVGQVVMVF9NT0RVTEVfVkVSU0lPTikpOwotICAgICAgICAgICAgaWYgKGRlZmF1bHRNb2R1bGVWZXJpb25FbGVtZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBwcm9jZXNzRGVmYXVsdE1vZHVsZVZlcnNpb25zKGRlZmF1bHRNb2R1bGVWZXJpb25FbGVtZW50KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgT01FbGVtZW50IGNsdXN0ZXJFbGVtZW50ID0gY29uZmlnX2VsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgLmdldEZpcnN0Q2hpbGRXaXRoTmFtZShuZXcgUU5hbWUoVEFHX0NMVVNURVIpKTsKLSAgICAgICAgICAgIGlmIChjbHVzdGVyRWxlbWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgQ2x1c3RlckJ1aWxkZXIgY2x1c3RlckJ1aWxkZXIgPSBuZXcgQ2x1c3RlckJ1aWxkZXIoYXhpc0NvbmZpZyk7Ci0gICAgICAgICAgICAgICAgY2x1c3RlckJ1aWxkZXIuYnVpbGRDbHVzdGVyKGNsdXN0ZXJFbGVtZW50KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy9BZGQganRhIHRyYW5zYWN0aW9uICBjb25maWd1cmF0aW9uCi0gICAgICAgICAgICBPTUVsZW1lbnQgdHJhbnNhY3Rpb25FbGVtZW50ID0gY29uZmlnX2VsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgLmdldEZpcnN0Q2hpbGRXaXRoTmFtZShuZXcgUU5hbWUoVEFHX1RSQU5TQUNUSU9OKSk7Ci0gICAgICAgICAgICBpZiAodHJhbnNhY3Rpb25FbGVtZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBQYXJhbWV0ZXJJbmNsdWRlIHRyYW5zYWN0aW9uUGFyYW1ldGVycyA9IG5ldyBQYXJhbWV0ZXJJbmNsdWRlSW1wbCgpOwotICAgICAgICAgICAgICAgIEl0ZXJhdG9yIHBhcmFtZXRlcnMgPSB0cmFuc2FjdGlvbkVsZW1lbnQuZ2V0Q2hpbGRyZW5XaXRoTmFtZShuZXcgUU5hbWUoVEFHX1BBUkFNRVRFUikpOwotICAgICAgICAgICAgICAgIHByb2Nlc3NQYXJhbWV0ZXJzKHBhcmFtZXRlcnMsIHRyYW5zYWN0aW9uUGFyYW1ldGVycywgbnVsbCk7Ci0gICAgICAgICAgICAgICAgVHJhbnNhY3Rpb25Db25maWd1cmF0aW9uIHR4Y2ZnID0gbmV3IFRyYW5zYWN0aW9uQ29uZmlndXJhdGlvbih0cmFuc2FjdGlvblBhcmFtZXRlcnMpOwotCi0gICAgICAgICAgICAgICAgT01BdHRyaWJ1dGUgdGltZW91dEF0dHJpYnV0ZSA9IHRyYW5zYWN0aW9uRWxlbWVudC5nZXRBdHRyaWJ1dGUobmV3IFFOYW1lKFRBR19USU1FT1VUKSk7Ci0gICAgICAgICAgICAgICAgaWYodGltZW91dEF0dHJpYnV0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHR4Y2ZnLnNldFRyYW5zYWN0aW9uVGltZW91dChJbnRlZ2VyLnBhcnNlSW50KHRpbWVvdXRBdHRyaWJ1dGUuZ2V0QXR0cmlidXRlVmFsdWUoKSkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGF4aXNDb25maWcuc2V0VHJhbnNhY3Rpb25Db25maWcodHhjZmcpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICogQWRkIEF4aXMyIGRlZmF1bHQgYnVpbGRlcnMgaWYgdGhleSBhcmUgbm90IG92ZXJpZGRlbiBieSB0aGUgY29uZmlnCi0gICAgICAgICAgICAqLwotICAgICAgICAgICAgYXhpc0NvbmZpZy5hZGRNZXNzYWdlQnVpbGRlcigibXVsdGlwYXJ0L3JlbGF0ZWQiLCBuZXcgTUlNRUJ1aWxkZXIoKSk7Ci0gICAgICAgICAgICBheGlzQ29uZmlnLmFkZE1lc3NhZ2VCdWlsZGVyKCJhcHBsaWNhdGlvbi9zb2FwK3htbCIsIG5ldyBTT0FQQnVpbGRlcigpKTsKLSAgICAgICAgICAgIGF4aXNDb25maWcuYWRkTWVzc2FnZUJ1aWxkZXIoInRleHQveG1sIiwgbmV3IFNPQVBCdWlsZGVyKCkpOwotICAgICAgICAgICAgYXhpc0NvbmZpZy5hZGRNZXNzYWdlQnVpbGRlcigiYXBwbGljYXRpb24veG9wK3htbCIsIG5ldyBNVE9NQnVpbGRlcigpKTsKLSAgICAgICAgICAgIGF4aXNDb25maWcuYWRkTWVzc2FnZUJ1aWxkZXIoImFwcGxpY2F0aW9uL3htbCIsIG5ldyBBcHBsaWNhdGlvblhNTEJ1aWxkZXIoKSk7Ci0gICAgICAgICAgICBheGlzQ29uZmlnLmFkZE1lc3NhZ2VCdWlsZGVyKCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEZvcm1VUkxFbmNvZGVkQnVpbGRlcigpKTsKLSAgICAgICAgICAgIC8vIHByb2Nlc3MgTWVzc2FnZUJ1aWxkZXJzCi0gICAgICAgICAgICBPTUVsZW1lbnQgbWVzc2FnZUJ1aWxkZXJzRWxlbWVudCA9Ci0gICAgICAgICAgICAgICAgICAgIGNvbmZpZ19lbGVtZW50LmdldEZpcnN0Q2hpbGRXaXRoTmFtZShuZXcgUU5hbWUoVEFHX01FU1NBR0VfQlVJTERFUlMpKTsKLSAgICAgICAgICAgIGlmIChtZXNzYWdlQnVpbGRlcnNFbGVtZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBIYXNoTWFwIGJ1aWxkZXJTZWxlY3RvciA9IHByb2Nlc3NNZXNzYWdlQnVpbGRlcnMobWVzc2FnZUJ1aWxkZXJzRWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgSXRlcmF0b3Iga2V5cyA9IGJ1aWxkZXJTZWxlY3Rvci5rZXlTZXQoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgIHdoaWxlIChrZXlzLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcga2V5ID0gKFN0cmluZykga2V5cy5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGF4aXNDb25maWcuYWRkTWVzc2FnZUJ1aWxkZXIoa2V5LCAoQnVpbGRlcikgYnVpbGRlclNlbGVjdG9yLmdldChrZXkpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLQotICAgICAgICAgICAgLy9wcm9jZXNzIGRhdGFMb2NhdG9yIGNvbmZpZ3VyYXRpb24KLSAgICAgICAgICAgIE9NRWxlbWVudCBkYXRhTG9jYXRvckVsZW1lbnQgPQotICAgICAgICAgICAgICAgICAgICBjb25maWdfZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRGaXJzdENoaWxkV2l0aE5hbWUobmV3IFFOYW1lKERSQ29uc3RhbnRzLkRBVEFfTE9DQVRPUl9FTEVNRU5UKSk7Ci0KLSAgICAgICAgICAgIGlmIChkYXRhTG9jYXRvckVsZW1lbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHByb2Nlc3NEYXRhTG9jYXRvckNvbmZpZyhkYXRhTG9jYXRvckVsZW1lbnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBwcm9jZXNzIHJvbGVwbGF5ZXIgY29uZmlndXJhdGlvbgotICAgICAgICAgICAgT01FbGVtZW50IHJvbGVQbGF5ZXJFbGVtZW50ID0KLSAgICAgICAgICAgICAgICAgICAgY29uZmlnX2VsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Rmlyc3RDaGlsZFdpdGhOYW1lKG5ldyBRTmFtZShDb25zdGFudHMuU09BUF9ST0xFX0NPTkZJR1VSQVRJT05fRUxFTUVOVCkpOwotCi0gICAgICAgICAgICBpZiAocm9sZVBsYXllckVsZW1lbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHByb2Nlc3NTT0FQUm9sZUNvbmZpZyhheGlzQ29uZmlnLCByb2xlUGxheWVyRWxlbWVudCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHByb2Nlc3MgTWVzc2FnZUZvcm1hdHRlcnMKLSAgICAgICAgICAgIE9NRWxlbWVudCBtZXNzYWdlRm9ybWF0dGVyc0VsZW1lbnQgPQotICAgICAgICAgICAgICAgICAgICBjb25maWdfZWxlbWVudC5nZXRGaXJzdENoaWxkV2l0aE5hbWUobmV3IFFOYW1lKFRBR19NRVNTQUdFX0ZPUk1BVFRFUlMpKTsKLSAgICAgICAgICAgIGlmIChtZXNzYWdlRm9ybWF0dGVyc0VsZW1lbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIEhhc2hNYXAgbWVzc2FnZUZvcm1hdHRlcnMgPSBwcm9jZXNzTWVzc2FnZUZvcm1hdHRlcnMobWVzc2FnZUZvcm1hdHRlcnNFbGVtZW50KTsKLSAgICAgICAgICAgICAgICBJdGVyYXRvciBrZXlzID0gbWVzc2FnZUZvcm1hdHRlcnMua2V5U2V0KCkuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAoa2V5cy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9IChTdHJpbmcpIGtleXMubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBheGlzQ29uZmlnLmFkZE1lc3NhZ2VGb3JtYXR0ZXIoa2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE1lc3NhZ2VGb3JtYXR0ZXIpIG1lc3NhZ2VGb3JtYXR0ZXJzLmdldChrZXkpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvL1Byb2Nlc3NpbmcgZGVwbG95ZXJzLgotICAgICAgICAgICAgSXRlcmF0b3IgZGVwbG95ZXJJdHIgPSBjb25maWdfZWxlbWVudC5nZXRDaGlsZHJlbldpdGhOYW1lKG5ldyBRTmFtZShERVBMT1lFUikpOwotICAgICAgICAgICAgaWYgKGRlcGxveWVySXRyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBwcm9jZXNzRGVwbG95ZXJzKGRlcGxveWVySXRyKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy9wcm9jZXNzIEF0dGFjaG1lbnRzIExpZmVjeWNsZSBtYW5hZ2VyIGNvbmZpZ3VyYXRpb24KLSAgICAgICAgICAgIE9NRWxlbWVudCBhdHRhY2htZW50c0xpZmVjeWNsZU1hbmFnZXJFbGVtZW50ID0KLSAgICAgICAgICAgICAgICAgICAgY29uZmlnX2VsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Rmlyc3RDaGlsZFdpdGhOYW1lKG5ldyBRTmFtZShBVFRBQ0hNRU5UU19MSUZFQ1lDTEVfTUFOQUdFUikpOwotCi0gICAgICAgICAgICBpZiAoYXR0YWNobWVudHNMaWZlY3ljbGVNYW5hZ2VyRWxlbWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcHJvY2Vzc0F0dGFjaG1lbnRzTGlmZWN5Y2xlTWFuYWdlcihheGlzQ29uZmlnLCBhdHRhY2htZW50c0xpZmVjeWNsZU1hbmFnZXJFbGVtZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NUYXJnZXRSZXNvbHZlcnMoQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZywgT01FbGVtZW50IHRhcmdldFJlc29sdmVycykgewotICAgICAgICBpZiAodGFyZ2V0UmVzb2x2ZXJzICE9IG51bGwpIHsKLSAgICAgICAgICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gdGFyZ2V0UmVzb2x2ZXJzLmdldENoaWxkcmVuV2l0aE5hbWUobmV3IFFOYW1lKFRBR19UQVJHRVRfUkVTT0xWRVIpKTsKLSAgICAgICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBPTUVsZW1lbnQgdGFyZ2V0UmVzb2x2ZXIgPSAoT01FbGVtZW50KSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgT01BdHRyaWJ1dGUgY2xhc3NOYW1lQXR0cmlidXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFJlc29sdmVyLmdldEF0dHJpYnV0ZShuZXcgUU5hbWUoVEFHX0NMQVNTX05BTUUpKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gY2xhc3NOYW1lQXR0cmlidXRlLmdldEF0dHJpYnV0ZVZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgQ2xhc3MgY2xhc3NJbnN0YW5jZSA9IExvYWRlci5sb2FkQ2xhc3MoY2xhc3NOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgVGFyZ2V0UmVzb2x2ZXIgdHIgPSAoVGFyZ2V0UmVzb2x2ZXIpIGNsYXNzSW5zdGFuY2UubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgYXhpc0NvbmZpZy5hZGRUYXJnZXRSZXNvbHZlcih0cik7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cudHJhY2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcm9jZXNzVGFyZ2V0UmVzb2x2ZXJzOiBFeGNlcHRpb24gdGhyb3duIGluaXRpYWxpc2luZyBUYXJnZXRSZXNvbHZlcjogIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NUaHJlYWRDb250ZXh0TWlncmF0b3JzKEF4aXNDb25maWd1cmF0aW9uIGF4aXNDb25maWcsIE9NRWxlbWVudCB0YXJnZXRSZXNvbHZlcnMpIHsKLSAgICAgICAgaWYgKHRhcmdldFJlc29sdmVycyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBJdGVyYXRvciBpdGVyYXRvciA9IHRhcmdldFJlc29sdmVycy5nZXRDaGlsZHJlbldpdGhOYW1lKG5ldyBRTmFtZShUQUdfVEhSRUFEX0NPTlRFWFRfTUlHUkFUT1IpKTsKLSAgICAgICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBPTUVsZW1lbnQgdGhyZWFkQ29udGV4dE1pZ3JhdG9yID0gKE9NRWxlbWVudCkgaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgIE9NQXR0cmlidXRlIGxpc3RJZEF0dHJpYnV0ZSA9Ci0gICAgICAgICAgICAgICAgICAgIHRocmVhZENvbnRleHRNaWdyYXRvci5nZXRBdHRyaWJ1dGUobmV3IFFOYW1lKFRBR19MSVNUX0lEKSk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGxpc3RJZCA9IGxpc3RJZEF0dHJpYnV0ZS5nZXRBdHRyaWJ1dGVWYWx1ZSgpOwotICAgICAgICAgICAgICAgIE9NQXR0cmlidXRlIGNsYXNzTmFtZUF0dHJpYnV0ZSA9Ci0gICAgICAgICAgICAgICAgICAgIHRocmVhZENvbnRleHRNaWdyYXRvci5nZXRBdHRyaWJ1dGUobmV3IFFOYW1lKFRBR19DTEFTU19OQU1FKSk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IGNsYXNzTmFtZUF0dHJpYnV0ZS5nZXRBdHRyaWJ1dGVWYWx1ZSgpOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIENsYXNzIGNsYXp6ID0gTG9hZGVyLmxvYWRDbGFzcyhjbGFzc05hbWUpOwotICAgICAgICAgICAgICAgICAgICBUaHJlYWRDb250ZXh0TWlncmF0b3IgbWlncmF0b3IgPSAoVGhyZWFkQ29udGV4dE1pZ3JhdG9yKSBjbGF6ei5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgICAgICAgICBUaHJlYWRDb250ZXh0TWlncmF0b3JVdGlsLmFkZFRocmVhZENvbnRleHRNaWdyYXRvcihheGlzQ29uZmlnLCBsaXN0SWQsIG1pZ3JhdG9yKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZENsYXNzVmVyc2lvbkVycm9yIGUpewotICAgICAgICAgICAgICAgICAgICBsb2cuaW5mbygiRGlzYWJsZWQgLSAiICsgY2xhc3NOYW1lICsgIiAtICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cudHJhY2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcm9jZXNzVGhyZWFkQ29udGV4dE1pZ3JhdG9yczogRXhjZXB0aW9uIHRocm93biBpbml0aWFsaXNpbmcgVGhyZWFkQ29udGV4dE1pZ3JhdG9yOiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0F0dGFjaG1lbnRzTGlmZWN5Y2xlTWFuYWdlcihBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlnLCBPTUVsZW1lbnQgZWxlbWVudCkgewotICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVWYWx1ZShuZXcgUU5hbWUoVEFHX0NMQVNTX05BTUUpKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIENsYXNzIGNsYXNzSW5zdGFuY2UgPSBMb2FkZXIubG9hZENsYXNzKGNsYXNzTmFtZSk7Ci0gICAgICAgICAgICBMaWZlY3ljbGVNYW5hZ2VyIG1hbmFnZXIgPSAoTGlmZWN5Y2xlTWFuYWdlcikgY2xhc3NJbnN0YW5jZS5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgYXhpc0NvbmZpZy5hZGRQYXJhbWV0ZXIoRGVwbG95bWVudENvbnN0YW50cy5BVFRBQ0hNRU5UU19MSUZFQ1lDTEVfTUFOQUdFUiwgbWFuYWdlcik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cudHJhY2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAicHJvY2Vzc0F0dGFjaG1lbnRzTGlmZWN5Y2xlTWFuYWdlcjogRXhjZXB0aW9uIHRocm93biBpbml0aWFsaXNpbmcgTGlmZWN5Y2xlTWFuYWdlcjogIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzU09BUFJvbGVDb25maWcoQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZywgT01FbGVtZW50IHNvYXByb2xlY29uZmlnRWxlbWVudCkgewotICAgIAlpZiAoc29hcHJvbGVjb25maWdFbGVtZW50ICE9IG51bGwpIHsKLSAgICAJCWZpbmFsIGJvb2xlYW4gaXNVbHRpbWF0ZVJlY2VpZXZlciA9IEphdmFVdGlscy5pc1RydWUoc29hcHJvbGVjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZVZhbHVlKG5ldyBRTmFtZShDb25zdGFudHMuU09BUF9ST0xFX0lTX1VMVElNQVRFX1JFQ0VJVkVSX0FUVFJJQlVURSkpLCB0cnVlKTsKLSAgICAJCUFycmF5TGlzdCByb2xlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gc29hcHJvbGVjb25maWdFbGVtZW50LmdldENoaWxkcmVuV2l0aE5hbWUobmV3IFFOYW1lKENvbnN0YW50cy5TT0FQX1JPTEVfRUxFTUVOVCkpOwotICAgIAkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgIAkJCU9NRWxlbWVudCByb2xlRWxlbWVudCA9IChPTUVsZW1lbnQpIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAJCQlyb2xlcy5hZGQocm9sZUVsZW1lbnQuZ2V0VGV4dCgpKTsKLSAgICAJCX0KLSAgICAJCWZpbmFsIExpc3QgdW5tb2RpZmlhYmxlUm9sZXMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KHJvbGVzKTsKLSAgICAJCXRyeXsKLSAgICAJCQlSb2xlUGxheWVyIHJvbGVQbGF5ZXIgPSBuZXcgUm9sZVBsYXllcigpewotICAgIAkJCQlwdWJsaWMgTGlzdCBnZXRSb2xlcygpIHsKLSAgICAJCQkJCXJldHVybiB1bm1vZGlmaWFibGVSb2xlczsKLSAgICAJCQkJfQotICAgIAkJCQlwdWJsaWMgYm9vbGVhbiBpc1VsdGltYXRlRGVzdGluYXRpb24oKSB7Ci0gICAgCQkJCQlyZXR1cm4gaXNVbHRpbWF0ZVJlY2VpZXZlcjsKLSAgICAJCQkJfQotICAgIAkJCX07Ci0gICAgCQkJYXhpc0NvbmZpZy5hZGRQYXJhbWV0ZXIoInJvbGVQbGF5ZXIiLCByb2xlUGxheWVyKTsKLSAgICAJCX0gY2F0Y2ggKEF4aXNGYXVsdCBlKSB7Ci0gICAgCQkJaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7Ci0gICAgCQkJCWxvZy50cmFjZSgKLSAgICAJCQkJCQkicHJvY2Vzc1RhcmdldFJlc29sdmVyczogRXhjZXB0aW9uIHRocm93biBpbml0aWFsaXNpbmcgVGFyZ2V0UmVzb2x2ZXI6ICIgKwotICAgIAkJCQkJCWUuZ2V0TWVzc2FnZSgpKTsKLSAgICAJCQl9Ci0gICAgCQl9Ci0gICAgCX0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NEZXBsb3llcnMoSXRlcmF0b3IgZGVwbG95ZXJJdHIpIHsKLSAgICAgICAgSGFzaE1hcCBleHRlbnNpb25Ub0RlcGxveWVyTWFwcGluZ01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIERlcGxveWVyPj4gZGVwbG95ZXJzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLCBEZXBsb3llcj4+KCk7Ci0gICAgICAgIHdoaWxlIChkZXBsb3llckl0ci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBlbGVtZW50ID0gKE9NRWxlbWVudCkgZGVwbG95ZXJJdHIubmV4dCgpOwotICAgICAgICAgICAgU3RyaW5nIGRpcmVjdG9yeSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlVmFsdWUobmV3IFFOYW1lKERJUkVDVE9SWSkpOwotICAgICAgICAgICAgaWYgKGRpcmVjdG9yeSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmVycm9yKCJEZXBsb3llciBtaXNzaW5nICdkaXJlY3RvcnknIGF0dHJpYnV0ZSA6ICIgKyBlbGVtZW50LnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTdHJpbmcgZXh0ZW5zaW9uID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVWYWx1ZShuZXcgUU5hbWUoRVhURU5TSU9OKSk7Ci0gICAgICAgICAgICBpZiAoZXh0ZW5zaW9uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIkRlcGxveWVyIG1pc3NpbmcgJ2V4dGVuc2lvbicgYXR0cmlidXRlIDogIiArIGVsZW1lbnQudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEEgbGVhZGluZyBkb3QgaXMgcmVkdW5kYW50LCBzbyBzdHJpcCBpdC4gIFNvIHdlIGFsbG93IGVpdGhlciAiLmZvbyIgb3IgImZvbyIsIGVpdGhlcgotICAgICAgICAgICAgLy8gb2Ygd2hpY2ggd2lsbCByZXN1bHQgaW4gZXh0ZW5zaW9uPSJmb28iCi0gICAgICAgICAgICBpZiAoZXh0ZW5zaW9uLmNoYXJBdCgwKSA9PSAnLicpIGV4dGVuc2lvbiA9IGV4dGVuc2lvbi5zdWJzdHJpbmcoMSk7Ci0KLSAgICAgICAgICAgIFN0cmluZyBkZXBsb3llckNsYXNzTmFtZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlVmFsdWUobmV3IFFOYW1lKFRBR19DTEFTU19OQU1FKSk7Ci0gICAgICAgICAgICBEZXBsb3llciBkZXBsb3llcjsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgQ2xhc3MgZGVwbG95ZXJDbGFzcyA9IExvYWRlci5sb2FkQ2xhc3MoZGVwbG95ZXJDbGFzc05hbWUpOwotICAgICAgICAgICAgICAgIGRlcGxveWVyID0gKERlcGxveWVyKSBkZXBsb3llckNsYXNzLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZENsYXNzVmVyc2lvbkVycm9yIGV4KSB7Ci0gICAgICAgICAgICAgICAgbG9nLmluZm8oIkRpc2FibGVkIC0gIiArIGRlcGxveWVyQ2xhc3NOYW1lICsgIiAtICIgKyBleC5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBsb2cuaW5mbygiVW5hYmxlIHRvIGluc3RhbnRpYXRlIGRlcGxveWVyICIgKyBkZXBsb3llckNsYXNzTmFtZSk7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRlcGxveWVyLnNldERpcmVjdG9yeShkaXJlY3RvcnkpOwotICAgICAgICAgICAgZGVwbG95ZXIuc2V0RXh0ZW5zaW9uKGV4dGVuc2lvbik7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIERlcGxveWVyPiBleHRlbnNpb25NYXAgPSBkZXBsb3llcnMuZ2V0KGRpcmVjdG9yeSk7Ci0gICAgICAgICAgICBpZiAoZXh0ZW5zaW9uTWFwID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBleHRlbnNpb25NYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIERlcGxveWVyPigpOwotICAgICAgICAgICAgICAgIGRlcGxveWVycy5wdXQoZGlyZWN0b3J5LCBleHRlbnNpb25NYXApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZXh0ZW5zaW9uTWFwLnB1dChleHRlbnNpb24sIGRlcGxveWVyKTsKLSAgICAgICAgICAgIGV4dGVuc2lvblRvRGVwbG95ZXJNYXBwaW5nTWFwLnB1dChleHRlbnNpb24sIGRlcGxveWVyKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZGVwbG95bWVudEVuZ2luZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBkZXBsb3ltZW50RW5naW5lLnNldEV4dGVuc2lvblRvRGVwbG95ZXJNYXBwaW5nTWFwKGV4dGVuc2lvblRvRGVwbG95ZXJNYXBwaW5nTWFwKTsKLSAgICAgICAgICAgIGRlcGxveW1lbnRFbmdpbmUuc2V0RGVwbG95ZXJzKGRlcGxveWVycyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzTW9kdWxlQ29uZmlnKEl0ZXJhdG9yIG1vZHVsZUNvbmZpZ3MsIFBhcmFtZXRlckluY2x1ZGUgcGFyZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXhpc0NvbmZpZ3VyYXRpb24gY29uZmlnKQotICAgICAgICAgICAgdGhyb3dzIERlcGxveW1lbnRFeGNlcHRpb24gewotICAgICAgICB3aGlsZSAobW9kdWxlQ29uZmlncy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBtb2R1bGVDb25maWcgPSAoT01FbGVtZW50KSBtb2R1bGVDb25maWdzLm5leHQoKTsKLSAgICAgICAgICAgIE9NQXR0cmlidXRlIG1vZHVsZU5hbWVfYXR0ID0gbW9kdWxlQ29uZmlnLmdldEF0dHJpYnV0ZShuZXcgUU5hbWUoQVRUUklCVVRFX05BTUUpKTsKLQotICAgICAgICAgICAgaWYgKG1vZHVsZU5hbWVfYXR0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoRGVwbG95bWVudEVycm9yTXNncy5JTlZBTElEX01PRFVMRV9DT05GSUcpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG1vZHVsZSA9IG1vZHVsZU5hbWVfYXR0LmdldEF0dHJpYnV0ZVZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgTW9kdWxlQ29uZmlndXJhdGlvbiBtb2R1bGVDb25maWd1cmF0aW9uID0KLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBNb2R1bGVDb25maWd1cmF0aW9uKG1vZHVsZSwgcGFyZW50KTsKLSAgICAgICAgICAgICAgICBJdGVyYXRvciBwYXJhbWV0ZXJzID0gbW9kdWxlQ29uZmlnLmdldENoaWxkcmVuV2l0aE5hbWUobmV3IFFOYW1lKFRBR19QQVJBTUVURVIpKTsKLQotICAgICAgICAgICAgICAgIHByb2Nlc3NQYXJhbWV0ZXJzKHBhcmFtZXRlcnMsIG1vZHVsZUNvbmZpZ3VyYXRpb24sIHBhcmVudCk7Ci0gICAgICAgICAgICAgICAgY29uZmlnLmFkZE1vZHVsZUNvbmZpZyhtb2R1bGVDb25maWd1cmF0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVwZGF0ZSB0aGUgbGlzdCBvZiBtb2R1bGVzIHRoYXQgaXMgcmVxdWlyZWQgdG8gYmUgZW5nYWdlZCBnbG9iYWxseS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzTW9kdWxlUmVmcyhJdGVyYXRvciBtb2R1bGVSZWZzLCBBeGlzQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLSAgICAgICAgd2hpbGUgKG1vZHVsZVJlZnMuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgbW9kdWxlcmVmID0gKE9NRWxlbWVudCkgbW9kdWxlUmVmcy5uZXh0KCk7Ci0gICAgICAgICAgICBPTUF0dHJpYnV0ZSBtb2R1bGVSZWZBdHRyaWJ1dGUgPSBtb2R1bGVyZWYuZ2V0QXR0cmlidXRlKG5ldyBRTmFtZShUQUdfUkVGRVJFTkNFKSk7Ci0gICAgICAgICAgICBTdHJpbmcgcmVmTmFtZSA9IG1vZHVsZVJlZkF0dHJpYnV0ZS5nZXRBdHRyaWJ1dGVWYWx1ZSgpOwotICAgICAgICAgICAgYXhpc0NvbmZpZy5hZGRHbG9iYWxNb2R1bGVSZWYocmVmTmFtZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcm9jZXNzZXMgQXhpc09ic2VydmVycy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvc2VydmVycwotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzT2JzZXJ2ZXJzKEl0ZXJhdG9yIG9zZXJ2ZXJzKSB7Ci0gICAgICAgIHdoaWxlIChvc2VydmVycy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgT01FbGVtZW50IG9ic2VydmVyZWxlbWVudCA9IChPTUVsZW1lbnQpIG9zZXJ2ZXJzLm5leHQoKTsKLSAgICAgICAgICAgICAgICBBeGlzT2JzZXJ2ZXIgb2JzZXJ2ZXI7Ci0gICAgICAgICAgICAgICAgT01BdHRyaWJ1dGUgdHJzQ2xhcyA9IG9ic2VydmVyZWxlbWVudC5nZXRBdHRyaWJ1dGUobmV3IFFOYW1lKFRBR19DTEFTU19OQU1FKSk7Ci0gICAgICAgICAgICAgICAgaWYgKHRyc0NsYXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBsb2cuaW5mbyhNZXNzYWdlcy5nZXRNZXNzYWdlKERlcGxveW1lbnRFcnJvck1zZ3MuT0JTRVJWRVJfRVJST1IpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgY2xhc05hbWUgPSB0cnNDbGFzLmdldEF0dHJpYnV0ZVZhbHVlKCk7Ci0KLSAgICAgICAgICAgICAgICBDbGFzcyBvYnNlcnZlcmNsYXNzOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIG9ic2VydmVyY2xhc3MgPSAoQ2xhc3MpIG9yZy5hcGFjaGUuYXhpczIuamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTG9hZGVyLmxvYWRDbGFzcyhjbGFzTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgKENsYXNzTm90Rm91bmRFeGNlcHRpb24pIGUuZ2V0RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG9ic2VydmVyID0gKEF4aXNPYnNlcnZlcikgb2JzZXJ2ZXJjbGFzcy5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgICAgIC8vIHByb2Nlc3NpbmcgUGFyYW1ldGVycwotICAgICAgICAgICAgICAgIC8vIFByb2Nlc3Npbmcgc2VydmljZSBsZXZlbCBwYXJhbWV0ZXJzCi0gICAgICAgICAgICAgICAgSXRlcmF0b3IgaXRyID0gb2JzZXJ2ZXJlbGVtZW50LmdldENoaWxkcmVuV2l0aE5hbWUobmV3IFFOYW1lKFRBR19QQVJBTUVURVIpKTsKLSAgICAgICAgICAgICAgICBwcm9jZXNzUGFyYW1ldGVycyhpdHIsIG9ic2VydmVyLCBheGlzQ29uZmlnKTsKLSAgICAgICAgICAgICAgICAvLyBpbml0aWFsaXphdGlvbgotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLmluaXQoYXhpc0NvbmZpZyk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy9PYnNlcnZlciBpbml0IG1heSB0aHJvdyBydW50aW1lIGV4Y2VwdGlvbiAsIGJ1dCB3ZSBjYW4gc3RpbAotICAgICAgICAgICAgICAgICAgICAvLyBzdGFydCBBeGlzMgotICAgICAgICAgICAgICAgICAgICBsb2cuaW5mbyhlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGF4aXNDb25maWcuYWRkT2JzZXJ2ZXJzKG9ic2VydmVyKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmluZm8oZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBBcnJheUxpc3QgcHJvY2Vzc1BoYXNlTGlzdChPTUVsZW1lbnQgcGhhc2VPcmRlcnMpIHRocm93cyBEZXBsb3ltZW50RXhjZXB0aW9uIHsKLSAgICAgICAgQXJyYXlMaXN0IHBoYXNlbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgSXRlcmF0b3IgcGhhc2VzID0gcGhhc2VPcmRlcnMuZ2V0Q2hpbGRyZW5XaXRoTmFtZShuZXcgUU5hbWUoVEFHX1BIQVNFKSk7Ci0KLSAgICAgICAgd2hpbGUgKHBoYXNlcy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBwaGFzZWVsZW1lbnQgPSAoT01FbGVtZW50KSBwaGFzZXMubmV4dCgpOwotICAgICAgICAgICAgU3RyaW5nIHBoYXNlTmFtZSA9Ci0gICAgICAgICAgICAgICAgICAgIHBoYXNlZWxlbWVudC5nZXRBdHRyaWJ1dGUobmV3IFFOYW1lKEFUVFJJQlVURV9OQU1FKSkuZ2V0QXR0cmlidXRlVmFsdWUoKTsKLSAgICAgICAgICAgIFN0cmluZyBwaGFzZUNsYXNzID0gcGhhc2VlbGVtZW50LmdldEF0dHJpYnV0ZVZhbHVlKG5ldyBRTmFtZShUQUdfQ0xBU1NfTkFNRSkpOwotICAgICAgICAgICAgUGhhc2UgcGhhc2U7Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcGhhc2UgPSBnZXRQaGFzZShwaGFzZUNsYXNzKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRNZXNzYWdlKCJwaGFzZWNsYXNzbm90Zm91bmQiLCBwaGFzZUNsYXNzLCBlLmdldE1lc3NhZ2UoKSkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwaGFzZS5zZXROYW1lKHBoYXNlTmFtZSk7Ci0KLSAgICAgICAgICAgIEl0ZXJhdG9yIGhhbmRsZXJzID0gcGhhc2VlbGVtZW50LmdldENoaWxkcmVuV2l0aE5hbWUobmV3IFFOYW1lKFRBR19IQU5ETEVSKSk7Ci0KLSAgICAgICAgICAgIHdoaWxlIChoYW5kbGVycy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gKE9NRWxlbWVudCkgaGFuZGxlcnMubmV4dCgpOwotICAgICAgICAgICAgICAgIEhhbmRsZXJEZXNjcmlwdGlvbiBoYW5kbGVyID0gcHJvY2Vzc0hhbmRsZXIob21FbGVtZW50LCBheGlzQ29uZmlnLCBwaGFzZU5hbWUpOwotCi0gICAgICAgICAgICAgICAgaGFuZGxlci5nZXRSdWxlcygpLnNldFBoYXNlTmFtZShwaGFzZU5hbWUpOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChVdGlscy5sb2FkSGFuZGxlcihheGlzQ29uZmlnLmdldFN5c3RlbUNsYXNzTG9hZGVyKCksIGhhbmRsZXIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoYXNlLmFkZEhhbmRsZXIoaGFuZGxlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChQaGFzZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZENsYXNzVmVyc2lvbkVycm9yIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmluZm8oIkRpc2FibGVkIC0gIiArIGhhbmRsZXIgKyAiIC0gIiArIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHBoYXNlbGlzdC5hZGQocGhhc2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHBoYXNlbGlzdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcm9jZXNzZXMgYWxsIHRoZSBwaGFzZSBvcmRlcnMgd2hpY2ggYXJlIGRlZmluZWQgaW4gYXhpczIueG1sLgotICAgICAqCi0gICAgICogQHBhcmFtIHBoYXNlcmRlcnMKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc1BoYXNlT3JkZXJzKEl0ZXJhdG9yIHBoYXNlcmRlcnMpIHRocm93cyBEZXBsb3ltZW50RXhjZXB0aW9uIHsKLSAgICAgICAgUGhhc2VzSW5mbyBpbmZvID0gYXhpc0NvbmZpZy5nZXRQaGFzZXNJbmZvKCk7Ci0KLSAgICAgICAgd2hpbGUgKHBoYXNlcmRlcnMuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgcGhhc2VPcmRlcnMgPSAoT01FbGVtZW50KSBwaGFzZXJkZXJzLm5leHQoKTsKLSAgICAgICAgICAgIFN0cmluZyBmbG93VHlwZSA9IHBoYXNlT3JkZXJzLmdldEF0dHJpYnV0ZShuZXcgUU5hbWUoVEFHX1RZUEUpKS5nZXRBdHRyaWJ1dGVWYWx1ZSgpOwotCi0gICAgICAgICAgICBpZiAoVEFHX0ZMT1dfSU4uZXF1YWxzKGZsb3dUeXBlKSkgewotICAgICAgICAgICAgICAgIGluZm8uc2V0SU5QaGFzZXMocHJvY2Vzc1BoYXNlTGlzdChwaGFzZU9yZGVycykpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChUQUdfRkxPV19JTl9GQVVMVC5lcXVhbHMoZmxvd1R5cGUpKSB7Ci0gICAgICAgICAgICAgICAgaW5mby5zZXRJTl9GYXVsdFBoYXNlcyhwcm9jZXNzUGhhc2VMaXN0KHBoYXNlT3JkZXJzKSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKFRBR19GTE9XX09VVC5lcXVhbHMoZmxvd1R5cGUpKSB7Ci0gICAgICAgICAgICAgICAgaW5mby5zZXRPVVRQaGFzZXMocHJvY2Vzc1BoYXNlTGlzdChwaGFzZU9yZGVycykpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChUQUdfRkxPV19PVVRfRkFVTFQuZXF1YWxzKGZsb3dUeXBlKSkgewotICAgICAgICAgICAgICAgIGluZm8uc2V0T1VUX0ZhdWx0UGhhc2VzKHByb2Nlc3NQaGFzZUxpc3QocGhhc2VPcmRlcnMpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzRGVmYXVsdE1vZHVsZVZlcnNpb25zKE9NRWxlbWVudCBkZWZhdWx0VmVyc2lvbnMpCi0gICAgICAgICAgICB0aHJvd3MgRGVwbG95bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIEl0ZXJhdG9yIG1vZHVsZVZlcnNpb25zID0gZGVmYXVsdFZlcnNpb25zLmdldENoaWxkcmVuV2l0aE5hbWUobmV3IFFOYW1lKFRBR19NT0RVTEUpKTsKLSAgICAgICAgd2hpbGUgKG1vZHVsZVZlcnNpb25zLmhhc05leHQoKSkgewotICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IChPTUVsZW1lbnQpIG1vZHVsZVZlcnNpb25zLm5leHQoKTsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gb21FbGVtZW50LmdldEF0dHJpYnV0ZVZhbHVlKG5ldyBRTmFtZShBVFRSSUJVVEVfTkFNRSkpOwotICAgICAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoIm1vZHVsZW5hbWVjYW5ub3RiZW51bGwiKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTdHJpbmcgdmVyc2lvbiA9Ci0gICAgICAgICAgICAgICAgICAgIG9tRWxlbWVudC5nZXRBdHRyaWJ1dGVWYWx1ZShuZXcgUU5hbWUoQVRUUklCVVRFX0RFRkFVTFRfVkVSU0lPTikpOwotICAgICAgICAgICAgaWYgKHZlcnNpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoIm1vZHVsZXZlcnNpb25jYW5ub3RiZW51bGwiKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBheGlzQ29uZmlnLmFkZERlZmF1bHRNb2R1bGVWZXJzaW9uKG5hbWUsIHZlcnNpb24pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIEFycmF5TGlzdCAgcHJvY2Vzc1RyYW5zcG9ydFJlY2VpdmVycyhJdGVyYXRvciB0cnNfc2VuZGVycykgdGhyb3dzIERlcGxveW1lbnRFeGNlcHRpb24gewotICAgICAgICBBcnJheUxpc3QgdHJhbnNwb3J0UmVjZWl2ZXJzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICB3aGlsZSAodHJzX3NlbmRlcnMuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBUcmFuc3BvcnRJbkRlc2NyaXB0aW9uIHRyYW5zcG9ydElOOwotICAgICAgICAgICAgT01FbGVtZW50IHRyYW5zcG9ydCA9IChPTUVsZW1lbnQpIHRyc19zZW5kZXJzLm5leHQoKTsKLSAgICAgICAgICAgIC8vIGdldHRpbmcgdHJhbnNwb3J0IE5hbWUKLSAgICAgICAgICAgIE9NQXR0cmlidXRlIHRyc05hbWUgPSB0cmFuc3BvcnQuZ2V0QXR0cmlidXRlKG5ldyBRTmFtZShBVFRSSUJVVEVfTkFNRSkpOwotICAgICAgICAgICAgaWYgKHRyc05hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gdHJzTmFtZS5nZXRBdHRyaWJ1dGVWYWx1ZSgpOwotICAgICAgICAgICAgICAgIHRyYW5zcG9ydElOID0gbmV3IFRyYW5zcG9ydEluRGVzY3JpcHRpb24obmFtZSk7Ci0gICAgICAgICAgICAgICAgLy8gdHJhbnNwb3J0IGltcGwgY2xhc3MKLSAgICAgICAgICAgICAgICBPTUF0dHJpYnV0ZSB0cnNDbGFzID0gdHJhbnNwb3J0LmdldEF0dHJpYnV0ZShuZXcgUU5hbWUoVEFHX0NMQVNTX05BTUUpKTsKLSAgICAgICAgICAgICAgICBpZiAodHJzQ2xhcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY2xhc05hbWUgPSB0cnNDbGFzLmdldEF0dHJpYnV0ZVZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyByZWNlaXZlckNsYXNzOwotICAgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZXJDbGFzcyA9IExvYWRlci5sb2FkQ2xhc3MoY2xhc05hbWUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBUcmFuc3BvcnRMaXN0ZW5lciByZWNlaXZlciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChUcmFuc3BvcnRMaXN0ZW5lcikgcmVjZWl2ZXJDbGFzcy5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0SU4uc2V0UmVjZWl2ZXIocmVjZWl2ZXIpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChOb0NsYXNzRGVmRm91bmRFcnJvciBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZihkZXBsb3ltZW50RW5naW5lICE9IG51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDYWxsZWQgZnJvbSBjcmVhdGVEZWZhdWx0Q29uZmlndXJhdGlvbkNvbnRleHQgaW4gQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUGxlYXNlIGRvbid0IHRocm93IGFuIGV4Y2VwdGlvbi4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoTWVzc2FnZXMuZ2V0TWVzc2FnZSgiY2xhc3Nub3Rmb3VuZCIsIHRyc0NsYXMuZ2V0QXR0cmlidXRlVmFsdWUoKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGl0ciA9IHRyYW5zcG9ydC5nZXRDaGlsZHJlbldpdGhOYW1lKG5ldyBRTmFtZShUQUdfUEFSQU1FVEVSKSk7Ci0gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NQYXJhbWV0ZXJzKGl0ciwgdHJhbnNwb3J0SU4sIGF4aXNDb25maWcpOwotICAgICAgICAgICAgICAgICAgICAvLyBhZGRpbmcgdG8gYXhpczIgY29uZmlnCi0gICAgICAgICAgICAgICAgICAgIGF4aXNDb25maWcuYWRkVHJhbnNwb3J0SW4odHJhbnNwb3J0SU4pOwotICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnRSZWNlaXZlcnMuYWRkKHRyYW5zcG9ydElOKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgYXhpc0ZhdWx0KSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKGF4aXNGYXVsdCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cmFuc3BvcnRSZWNlaXZlcnM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJvY2Vzc1RyYW5zcG9ydFNlbmRlcnMoSXRlcmF0b3IgdHJzX3NlbmRlcnMpIHRocm93cyBEZXBsb3ltZW50RXhjZXB0aW9uIHsKLSAgICAgICAgd2hpbGUgKHRyc19zZW5kZXJzLmhhc05leHQoKSkgewotICAgICAgICAgICAgVHJhbnNwb3J0T3V0RGVzY3JpcHRpb24gdHJhbnNwb3J0b3V0OwotICAgICAgICAgICAgT01FbGVtZW50IHRyYW5zcG9ydCA9IChPTUVsZW1lbnQpIHRyc19zZW5kZXJzLm5leHQoKTsKLQotICAgICAgICAgICAgLy8gZ2V0dGluZyB0cmFuc3BvcnQgTmFtZQotICAgICAgICAgICAgT01BdHRyaWJ1dGUgdHJzTmFtZSA9IHRyYW5zcG9ydC5nZXRBdHRyaWJ1dGUobmV3IFFOYW1lKEFUVFJJQlVURV9OQU1FKSk7Ci0KLSAgICAgICAgICAgIGlmICh0cnNOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IHRyc05hbWUuZ2V0QXR0cmlidXRlVmFsdWUoKTsKLQotICAgICAgICAgICAgICAgIHRyYW5zcG9ydG91dCA9IG5ldyBUcmFuc3BvcnRPdXREZXNjcmlwdGlvbihuYW1lKTsKLQotICAgICAgICAgICAgICAgIC8vIHRyYW5zcG9ydCBpbXBsIGNsYXNzCi0gICAgICAgICAgICAgICAgT01BdHRyaWJ1dGUgdHJzQ2xhcyA9IHRyYW5zcG9ydC5nZXRBdHRyaWJ1dGUobmV3IFFOYW1lKFRBR19DTEFTU19OQU1FKSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAodHJzQ2xhcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoRGVwbG95bWVudEVycm9yTXNncy5UUkFOU1BPUlRfU0VOREVSX0VSUk9SLCBuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgU3RyaW5nIGNsYXNOYW1lID0gdHJzQ2xhcy5nZXRBdHRyaWJ1dGVWYWx1ZSgpOwotICAgICAgICAgICAgICAgIENsYXNzIHNlbmRlcjsKLQotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHNlbmRlciA9IExvYWRlci5sb2FkQ2xhc3MoY2xhc05hbWUpOwotCi0gICAgICAgICAgICAgICAgICAgIFRyYW5zcG9ydFNlbmRlciB0cmFuc3BvcnRTZW5kZXIgPSAoVHJhbnNwb3J0U2VuZGVyKSBzZW5kZXIubmV3SW5zdGFuY2UoKTsKLQotICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnRvdXQuc2V0U2VuZGVyKHRyYW5zcG9ydFNlbmRlcik7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gcHJvY2VzcyBQYXJhbWV0ZXJzCi0gICAgICAgICAgICAgICAgICAgIC8vIHByb2Nlc3NpbmcgUGFyYW1ldGVycwotICAgICAgICAgICAgICAgICAgICAvLyBQcm9jZXNzaW5nIHNlcnZpY2UgbGV2ZWwgcGFyYW1ldGVycwotICAgICAgICAgICAgICAgICAgICBJdGVyYXRvciBpdHIgPSB0cmFuc3BvcnQuZ2V0Q2hpbGRyZW5XaXRoTmFtZShuZXcgUU5hbWUoVEFHX1BBUkFNRVRFUikpOwotCi0gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NQYXJhbWV0ZXJzKGl0ciwgdHJhbnNwb3J0b3V0LCBheGlzQ29uZmlnKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gYWRkaW5nIHRvIGF4aXMyIGNvbmZpZwotICAgICAgICAgICAgICAgICAgICBheGlzQ29uZmlnLmFkZFRyYW5zcG9ydE91dCh0cmFuc3BvcnRvdXQpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE5vQ2xhc3NEZWZGb3VuZEVycm9yIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoZGVwbG95bWVudEVuZ2luZSAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhNZXNzYWdlcy5nZXRNZXNzYWdlKCJlcnJvcmlubG9hZGluZ3RzIiwgY2xhc05hbWUpLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2FsbGVkIGZyb20gY3JlYXRlRGVmYXVsdENvbmZpZ3VyYXRpb25Db250ZXh0IGluIENvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gUGxlYXNlIGRvbid0IHRocm93IGFuIGV4Y2VwdGlvbi4KLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhNZXNzYWdlcy5nZXRNZXNzYWdlKCJjbGFzc25vdGZvdW5kIiwgdHJzQ2xhcy5nZXRBdHRyaWJ1dGVWYWx1ZSgpKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKE1lc3NhZ2VzLmdldE1lc3NhZ2UoImVycm9yaW5sb2FkaW5ndHMiLCBjbGFzTmFtZSksIGUpOwotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKE1lc3NhZ2VzLmdldE1lc3NhZ2UoImVycm9yaW5sb2FkaW5ndHMiLCBjbGFzTmFtZSksIGUpOwotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKE1lc3NhZ2VzLmdldE1lc3NhZ2UoImVycm9yaW5sb2FkaW5ndHMiLCBjbGFzTmFtZSksIGUpOwotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgYXhpc0ZhdWx0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhNZXNzYWdlcy5nZXRNZXNzYWdlKCJlcnJvcmlubG9hZGluZ3RzIiwgY2xhc05hbWUpLCBheGlzRmF1bHQpOwotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEV4Y2VwdGlvbihheGlzRmF1bHQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogcHJvY2VzcyBkYXRhIGxvY2F0b3IgY29uZmlndXJhdGlvbiBmb3IgZGF0YSByZXRyaWV2YWwuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NEYXRhTG9jYXRvckNvbmZpZyhPTUVsZW1lbnQgZGF0YUxvY2F0b3JFbGVtZW50KSB7Ci0gICAgICAgIE9NQXR0cmlidXRlIHNlcnZpY2VPdmVyYWxsRGF0YUxvY2F0b3JjbGFzcyA9IGRhdGFMb2NhdG9yRWxlbWVudAotICAgICAgICAgICAgICAgIC5nZXRBdHRyaWJ1dGUobmV3IFFOYW1lKERSQ29uc3RhbnRzLkNMQVNTX0FUVFJJQlVURSkpOwotICAgICAgICBpZiAoc2VydmljZU92ZXJhbGxEYXRhTG9jYXRvcmNsYXNzICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBzZXJ2aWNlT3ZlcmFsbERhdGFMb2NhdG9yY2xhc3MKLSAgICAgICAgICAgICAgICAgICAgLmdldEF0dHJpYnV0ZVZhbHVlKCk7Ci0gICAgICAgICAgICBheGlzQ29uZmlnLmFkZERhdGFMb2NhdG9yQ2xhc3NOYW1lcyhEUkNvbnN0YW50cy5HTE9CQUxfTEVWRUwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUpOwotICAgICAgICB9Ci0gICAgICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gZGF0YUxvY2F0b3JFbGVtZW50LmdldENoaWxkcmVuV2l0aE5hbWUobmV3IFFOYW1lKAotICAgICAgICAgICAgICAgIERSQ29uc3RhbnRzLkRJQUxFQ1RfTE9DQVRPUl9FTEVNRU5UKSk7Ci0KLSAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgT01FbGVtZW50IGxvY2F0b3JFbGVtZW50ID0gKE9NRWxlbWVudCkgaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgT01BdHRyaWJ1dGUgZGlhbGVjdCA9IGxvY2F0b3JFbGVtZW50LmdldEF0dHJpYnV0ZShuZXcgUU5hbWUoCi0gICAgICAgICAgICAgICAgICAgIERSQ29uc3RhbnRzLkRJQUxFQ1RfQVRUUklCVVRFKSk7Ci0gICAgICAgICAgICBPTUF0dHJpYnV0ZSBkaWFsZWN0Y2xhc3MgPSBsb2NhdG9yRWxlbWVudC5nZXRBdHRyaWJ1dGUobmV3IFFOYW1lKAotICAgICAgICAgICAgICAgICAgICBEUkNvbnN0YW50cy5DTEFTU19BVFRSSUJVVEUpKTsKLSAgICAgICAgICAgIGF4aXNDb25maWcuYWRkRGF0YUxvY2F0b3JDbGFzc05hbWVzKGRpYWxlY3QuZ2V0QXR0cmlidXRlVmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpYWxlY3RjbGFzcy5nZXRBdHRyaWJ1dGVWYWx1ZSgpKTsKLQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIEhhc2hNYXAgcHJvY2Vzc01lc3NhZ2VGb3JtYXR0ZXJzKE9NRWxlbWVudCBtZXNzYWdlRm9ybWF0dGVyc0VsZW1lbnQpCi0gICAgICAgICAgICB0aHJvd3MgRGVwbG95bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gc3VwZXIucHJvY2Vzc01lc3NhZ2VGb3JtYXR0ZXJzKG1lc3NhZ2VGb3JtYXR0ZXJzRWxlbWVudCk7Ci0gICAgICAgIH0gY2F0Y2ggKE5vQ2xhc3NEZWZGb3VuZEVycm9yIGUpIHsKLSAgICAgICAgICAgIGlmIChkZXBsb3ltZW50RW5naW5lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gQ2FsbGVkIGZyb20gY3JlYXRlRGVmYXVsdENvbmZpZ3VyYXRpb25Db250ZXh0IGluIENvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeQotICAgICAgICAgICAgICAgIC8vIFBsZWFzZSBkb24ndCB0aHJvdyBhbiBleGNlcHRpb24uCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgSGFzaE1hcCBwcm9jZXNzTWVzc2FnZUJ1aWxkZXJzKE9NRWxlbWVudCBtZXNzYWdlQnVpbGRlcnNFbGVtZW50KQotICAgICAgICAgICAgdGhyb3dzIERlcGxveW1lbnRFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIHN1cGVyLnByb2Nlc3NNZXNzYWdlQnVpbGRlcnMobWVzc2FnZUJ1aWxkZXJzRWxlbWVudCk7Ci0gICAgICAgIH0gY2F0Y2ggKE5vQ2xhc3NEZWZGb3VuZEVycm9yIGUpIHsKLSAgICAgICAgICAgIGlmIChkZXBsb3ltZW50RW5naW5lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gQ2FsbGVkIGZyb20gY3JlYXRlRGVmYXVsdENvbmZpZ3VyYXRpb25Db250ZXh0IGluIENvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeQotICAgICAgICAgICAgICAgIC8vIFBsZWFzZSBkb24ndCB0aHJvdyBhbiBleGNlcHRpb24uCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFBoYXNlIGdldFBoYXNlKFN0cmluZyBjbGFzc05hbWUpCi0gICAgICAgICAgICB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChjbGFzc05hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBQaGFzZSgpOwotICAgICAgICB9Ci0gICAgICAgIENsYXNzIHBoYXNlQ2xhc3MgPSBMb2FkZXIubG9hZENsYXNzKGF4aXNDb25maWcuZ2V0U3lzdGVtQ2xhc3NMb2FkZXIoKSwgY2xhc3NOYW1lKTsKLSAgICAgICAgcmV0dXJuIChQaGFzZSkgcGhhc2VDbGFzcy5uZXdJbnN0YW5jZSgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L0NsdXN0ZXJCdWlsZGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9DbHVzdGVyQnVpbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4N2Y0ZDk0Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L0NsdXN0ZXJCdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLkNsdXN0ZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5DbHVzdGVyaW5nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5NZW1iZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLkxvYWRCYWxhbmNlRXZlbnRIYW5kbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25NYW5hZ2VyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLmNvbnRleHQuQ29udGV4dE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLmNvbnRleHQuQ29udGV4dE1hbmFnZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmkxOG4uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0KLS8qKgotICogQnVpbGRzIHRoZSBjbHVzdGVyIGNvbmZpZ3VyYXRpb24gZnJvbSB0aGUgYXhpczIueG1sIGZpbGUKLSAqLwotcHVibGljIGNsYXNzIENsdXN0ZXJCdWlsZGVyIGV4dGVuZHMgRGVzY3JpcHRpb25CdWlsZGVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhDbHVzdGVyQnVpbGRlci5jbGFzcyk7Ci0KLSAgICBwdWJsaWMgQ2x1c3RlckJ1aWxkZXIoQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZykgewotICAgICAgICB0aGlzLmF4aXNDb25maWcgPSBheGlzQ29uZmlnOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEJ1aWxkIHRoZSBjbHVzdGVyIGNvbmZpZ3VyYXRpb24KLSAgICAgKgotICAgICAqIEBwYXJhbSBjbHVzdGVyRWxlbWVudCBDbHVzdGVyIGVsZW1lbnQKLSAgICAgKiBAdGhyb3dzIERlcGxveW1lbnRFeGNlcHRpb24gSWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGJ1aWxkaW5nIHRoZSBjbHVzdGVyIGNvbmZpZ3VyYXRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBidWlsZENsdXN0ZXIoT01FbGVtZW50IGNsdXN0ZXJFbGVtZW50KSB0aHJvd3MgRGVwbG95bWVudEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgaWYgKCFpc0VuYWJsZWQoY2x1c3RlckVsZW1lbnQpKSB7Ci0gICAgICAgICAgICBsb2cuaW5mbygiQ2x1c3RlcmluZyBoYXMgYmVlbiBkaXNhYmxlZCIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGxvZy5pbmZvKCJDbHVzdGVyaW5nIGhhcyBiZWVuIGVuYWJsZWQiKTsKLQotICAgICAgICBPTUF0dHJpYnV0ZSBjbGFzc05hbWVBdHRyID0gY2x1c3RlckVsZW1lbnQuZ2V0QXR0cmlidXRlKG5ldyBRTmFtZShUQUdfQ0xBU1NfTkFNRSkpOwotICAgICAgICBpZiAoY2xhc3NOYW1lQXR0ciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJjbGFzc0F0dHJpYnV0ZU5vdEZvdW5kIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEFHX0NMVVNURVIpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBjbGFzc05hbWVBdHRyLmdldEF0dHJpYnV0ZVZhbHVlKCk7Ci0gICAgICAgIENsdXN0ZXJNYW5hZ2VyIGNsdXN0ZXJNYW5hZ2VyOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgQ2xhc3MgY2xheno7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGNsYXp6ID0gQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUpOwotICAgICAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiY2x1c3RlckltcGxOb3RGb3VuZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNsdXN0ZXJNYW5hZ2VyID0gKENsdXN0ZXJNYW5hZ2VyKSBjbGF6ei5uZXdJbnN0YW5jZSgpOwotCi0gICAgICAgICAgICBjbHVzdGVyTWFuYWdlci5zZXRDb25maWd1cmF0aW9uQ29udGV4dChjb25maWdDdHgpOwotCi0gICAgICAgICAgICAvL2xvYWRpbmcgdGhlIHBhcmFtZXRlcnMuCi0gICAgICAgICAgICBwcm9jZXNzUGFyYW1ldGVycyhjbHVzdGVyRWxlbWVudC5nZXRDaGlsZHJlbldpdGhOYW1lKG5ldyBRTmFtZShUQUdfUEFSQU1FVEVSKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHVzdGVyTWFuYWdlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwpOwotCi0gICAgICAgICAgICAvLyBsb2FkaW5nIHRoZSBhcHBsaWNhdGlvbiBkb21haW5zCi0gICAgICAgICAgICBsb2FkQXBwbGljYXRpb25Eb21haW5zKGNsdXN0ZXJNYW5hZ2VyLCBjbHVzdGVyRWxlbWVudCk7Ci0KLSAgICAgICAgICAgIC8vIGxvYWRpbmcgdGhlIG1lbWJlcnMKLSAgICAgICAgICAgIGxvYWRXZWxsS25vd25NZW1iZXJzKGNsdXN0ZXJNYW5hZ2VyLCBjbHVzdGVyRWxlbWVudCk7Ci0KLSAgICAgICAgICAgIC8vbG9hZGluZyB0aGUgQ29uZmlndXJhdGlvbk1hbmFnZXIKLSAgICAgICAgICAgIGxvYWRDb25maWdNYW5hZ2VyKGNsdXN0ZXJFbGVtZW50LCBjbHVzdGVyTWFuYWdlcik7Ci0KLSAgICAgICAgICAgIC8vIGxvYWRpbmcgdGhlIENvbnRleHRNYW5hZ2VyCi0gICAgICAgICAgICBsb2FkQ29udGV4dE1hbmFnZXIoY2x1c3RlckVsZW1lbnQsIGNsdXN0ZXJNYW5hZ2VyKTsKLQotICAgICAgICAgICAgYXhpc0NvbmZpZy5zZXRDbHVzdGVyTWFuYWdlcihjbHVzdGVyTWFuYWdlcik7Ci0gICAgICAgIH0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiY2Fubm90TG9hZENsdXN0ZXJJbXBsIikpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzRW5hYmxlZChPTUVsZW1lbnQgZWxlbWVudCkgewotICAgICAgICBib29sZWFuIGVuYWJsZWQgPSB0cnVlOwotICAgICAgICBPTUF0dHJpYnV0ZSBlbmFibGVBdHRyID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUobmV3IFFOYW1lKCJlbmFibGUiKSk7Ci0gICAgICAgIGlmIChlbmFibGVBdHRyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGVuYWJsZWQgPSBCb29sZWFuLnBhcnNlQm9vbGVhbihlbmFibGVBdHRyLmdldEF0dHJpYnV0ZVZhbHVlKCkudHJpbSgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZW5hYmxlZDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgbG9hZEFwcGxpY2F0aW9uRG9tYWlucyhDbHVzdGVyTWFuYWdlciBjbHVzdGVyTWFuYWdlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTUVsZW1lbnQgY2x1c3RlckVsZW1lbnQpIHRocm93cyBEZXBsb3ltZW50RXhjZXB0aW9uIHsKLSAgICAgICAgT01FbGVtZW50IGxiRWxlID0gY2x1c3RlckVsZW1lbnQuZ2V0Rmlyc3RDaGlsZFdpdGhOYW1lKG5ldyBRTmFtZSgibG9hZEJhbGFuY2VyIikpOwotICAgICAgICBpZiAobGJFbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGlzRW5hYmxlZChsYkVsZSkpIHsKLSAgICAgICAgICAgICAgICBsb2cuaW5mbygiUnVubmluZyBpbiBsb2FkIGJhbGFuY2UgbW9kZSIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBsb2cuaW5mbygiUnVubmluZyBpbiBhcHBsaWNhdGlvbiBtb2RlIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsYkVsZS5nZXRDaGlsZHJlbldpdGhOYW1lKG5ldyBRTmFtZSgiYXBwbGljYXRpb25Eb21haW4iKSk7Ci0gICAgICAgICAgICAgICAgIGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSAoT01FbGVtZW50KSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZG9tYWluTmFtZSA9IG9tRWxlbWVudC5nZXRBdHRyaWJ1dGVWYWx1ZShuZXcgUU5hbWUoIm5hbWUiKSkudHJpbSgpOwotICAgICAgICAgICAgICAgIFN0cmluZyBoYW5kbGVyQ2xhc3MgPSBvbUVsZW1lbnQuZ2V0QXR0cmlidXRlVmFsdWUobmV3IFFOYW1lKCJoYW5kbGVyIikpLnRyaW0oKTsKLSAgICAgICAgICAgICAgICBMb2FkQmFsYW5jZUV2ZW50SGFuZGxlciBldmVudEhhbmRsZXI7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgZXZlbnRIYW5kbGVyID0gKExvYWRCYWxhbmNlRXZlbnRIYW5kbGVyKSBDbGFzcy5mb3JOYW1lKGhhbmRsZXJDbGFzcykubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbXNnID0gIkNvdWxkIG5vdCBpbnN0YW50aWF0ZSBMb2FkQmFsYW5jZUV2ZW50SGFuZGxlciAiICsgaGFuZGxlckNsYXNzICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZm9yIGRvbWFpbiAiICsgZG9tYWluTmFtZTsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKG1zZywgZSk7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKG1zZywgZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNsdXN0ZXJNYW5hZ2VyLmFkZExvYWRCYWxhbmNlRXZlbnRIYW5kbGVyKGV2ZW50SGFuZGxlciwgZG9tYWluTmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgbG9hZFdlbGxLbm93bk1lbWJlcnMoQ2x1c3Rlck1hbmFnZXIgY2x1c3Rlck1hbmFnZXIsIE9NRWxlbWVudCBjbHVzdGVyRWxlbWVudCkgewotICAgICAgICBjbHVzdGVyTWFuYWdlci5zZXRNZW1iZXJzKG5ldyBBcnJheUxpc3Q8TWVtYmVyPigpKTsKLSAgICAgICAgUGFyYW1ldGVyIG1lbWJlcnNoaXBTY2hlbWVQYXJhbSA9IGNsdXN0ZXJNYW5hZ2VyLmdldFBhcmFtZXRlcigibWVtYmVyc2hpcFNjaGVtZSIpOwotICAgICAgICBpZiAobWVtYmVyc2hpcFNjaGVtZVBhcmFtICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyBtZW1iZXJzaGlwU2NoZW1lID0gKChTdHJpbmcpIG1lbWJlcnNoaXBTY2hlbWVQYXJhbS5nZXRWYWx1ZSgpKS50cmltKCk7Ci0gICAgICAgICAgICBpZiAobWVtYmVyc2hpcFNjaGVtZS5lcXVhbHMoQ2x1c3RlcmluZ0NvbnN0YW50cy5NZW1iZXJzaGlwU2NoZW1lLldLQV9CQVNFRCkpIHsKLSAgICAgICAgICAgICAgICBMaXN0PE1lbWJlcj4gbWVtYmVycyA9IG5ldyBBcnJheUxpc3Q8TWVtYmVyPigpOwotICAgICAgICAgICAgICAgIE9NRWxlbWVudCBtZW1iZXJzRWxlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNsdXN0ZXJFbGVtZW50LmdldEZpcnN0Q2hpbGRXaXRoTmFtZShuZXcgUU5hbWUoIm1lbWJlcnMiKSk7Ci0gICAgICAgICAgICAgICAgaWYgKG1lbWJlcnNFbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBtZW1iZXJzRWxlLmdldENoaWxkcmVuV2l0aExvY2FsTmFtZSgibWVtYmVyIik7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgICAgICAgICAgT01FbGVtZW50IG1lbWJlckVsZSA9IChPTUVsZW1lbnQpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhvc3ROYW1lID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtYmVyRWxlLmdldEZpcnN0Q2hpbGRXaXRoTmFtZShuZXcgUU5hbWUoImhvc3ROYW1lIikpLmdldFRleHQoKS50cmltKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcG9ydCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWJlckVsZS5nZXRGaXJzdENoaWxkV2l0aE5hbWUobmV3IFFOYW1lKCJwb3J0IikpLmdldFRleHQoKS50cmltKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZW1iZXJzLmFkZChuZXcgTWVtYmVyKHJlcGxhY2VWYXJpYWJsZXMoaG9zdE5hbWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnBhcnNlSW50KHJlcGxhY2VWYXJpYWJsZXMocG9ydCkpKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2x1c3Rlck1hbmFnZXIuc2V0TWVtYmVycyhtZW1iZXJzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIHJlcGxhY2VWYXJpYWJsZXMoU3RyaW5nIHRleHQpIHsKLSAgICAgICAgaW50IGluZGV4T2ZTdGFydGluZ0NoYXJzOwotICAgICAgICBpbnQgaW5kZXhPZkNsb3NpbmdCcmFjZTsKLQotICAgICAgICAvLyBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbiBkZWFscyB3aXRoIHByb3BlcnRpZXMuCi0gICAgICAgIC8vIFByb3BlcnRpZXMgYXJlIHNwZWNpZmllZCBhcyAke3N5c3RlbS5wcm9wZXJ0eX0sCi0gICAgICAgIC8vIGFuZCBhcmUgYXNzdW1lZCB0byBiZSBTeXN0ZW0gcHJvcGVydGllcwotICAgICAgICBpZiAoKGluZGV4T2ZTdGFydGluZ0NoYXJzID0gdGV4dC5pbmRleE9mKCIkeyIpKSAhPSAtMSAmJgotICAgICAgICAgICAgKGluZGV4T2ZDbG9zaW5nQnJhY2UgPSB0ZXh0LmluZGV4T2YoIn0iKSkgIT0gLTEpIHsgLy8gSXMgYSBwcm9wZXJ0eSB1c2VkPwotICAgICAgICAgICAgU3RyaW5nIHZhciA9IHRleHQuc3Vic3RyaW5nKGluZGV4T2ZTdGFydGluZ0NoYXJzICsgMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleE9mQ2xvc2luZ0JyYWNlKTsKLQotICAgICAgICAgICAgU3RyaW5nIHByb3BWYWx1ZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSh2YXIpOwotICAgICAgICAgICAgaWYgKHByb3BWYWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcHJvcFZhbHVlID0gU3lzdGVtLmdldGVudih2YXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHByb3BWYWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGV4dCA9IHRleHQuc3Vic3RyaW5nKDAsIGluZGV4T2ZTdGFydGluZ0NoYXJzKSArIHByb3BWYWx1ZSArCi0gICAgICAgICAgICAgICAgICAgICAgIHRleHQuc3Vic3RyaW5nKGluZGV4T2ZDbG9zaW5nQnJhY2UgKyAxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGV4dDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgbG9hZENvbnRleHRNYW5hZ2VyKE9NRWxlbWVudCBjbHVzdGVyRWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsdXN0ZXJNYW5hZ2VyIGNsdXN0ZXJNYW5hZ2VyKSB0aHJvd3MgRGVwbG95bWVudEV4Y2VwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB7Ci0gICAgICAgIE9NRWxlbWVudCBjb250ZXh0TWFuYWdlckVsZSA9Ci0gICAgICAgICAgICAgICAgY2x1c3RlckVsZW1lbnQuZ2V0Rmlyc3RDaGlsZFdpdGhOYW1lKG5ldyBRTmFtZShUQUdfQ09OVEVYVF9NQU5BR0VSKSk7Ci0gICAgICAgIGlmIChjb250ZXh0TWFuYWdlckVsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoIWlzRW5hYmxlZChjb250ZXh0TWFuYWdlckVsZSkpIHsKLSAgICAgICAgICAgICAgICBsb2cuaW5mbygiQ2x1c3RlcmluZyBjb250ZXh0IG1hbmFnZW1lbnQgaGFzIGJlZW4gZGlzYWJsZWQiKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBsb2cuaW5mbygiQ2x1c3RlcmluZyBjb250ZXh0IG1hbmFnZW1lbnQgaGFzIGJlZW4gZW5hYmxlZCIpOwotCi0gICAgICAgICAgICAvLyBMb2FkICYgc2V0IHRoZSBDb250ZXh0TWFuYWdlciBjbGFzcwotICAgICAgICAgICAgT01BdHRyaWJ1dGUgY2xhc3NOYW1lQXR0ciA9Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRleHRNYW5hZ2VyRWxlLmdldEF0dHJpYnV0ZShuZXcgUU5hbWUoQVRUUklCVVRFX0NMQVNTKSk7Ci0gICAgICAgICAgICBpZiAoY2xhc3NOYW1lQXR0ciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiY2xhc3NBdHRyaWJ1dGVOb3RGb3VuZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQUdfQ09OVEVYVF9NQU5BR0VSKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBjbGFzc05hbWVBdHRyLmdldEF0dHJpYnV0ZVZhbHVlKCk7Ci0KLSAgICAgICAgICAgIENsYXNzIGNsYXp6OwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBjbGF6eiA9IENsYXNzLmZvck5hbWUoY2xhc3NOYW1lKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoImNsdXN0ZXJJbXBsTm90Rm91bmQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBDb250ZXh0TWFuYWdlciBjb250ZXh0TWFuYWdlciA9IChDb250ZXh0TWFuYWdlcikgY2xhenoubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIGNsdXN0ZXJNYW5hZ2VyLnNldENvbnRleHRNYW5hZ2VyKGNvbnRleHRNYW5hZ2VyKTsKLQotICAgICAgICAgICAgLy8gTG9hZCAmIHNldCB0aGUgQ29udGV4dE1hbmFnZXJMaXN0ZW5lcgotICAgICAgICAgICAgT01FbGVtZW50IGxpc3RlbmVyRWxlID0KLSAgICAgICAgICAgICAgICAgICAgY29udGV4dE1hbmFnZXJFbGUuZ2V0Rmlyc3RDaGlsZFdpdGhOYW1lKG5ldyBRTmFtZShUQUdfTElTVEVORVIpKTsKLSAgICAgICAgICAgIGlmIChsaXN0ZW5lckVsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY2xhc3NOYW1lQXR0ciA9IGxpc3RlbmVyRWxlLmdldEF0dHJpYnV0ZShuZXcgUU5hbWUoVEFHX0NMQVNTX05BTUUpKTsKLSAgICAgICAgICAgICAgICBpZiAoY2xhc3NOYW1lQXR0ciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoImNsYXNzQXR0cmlidXRlTm90Rm91bmQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRBR19MSVNURU5FUikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSBjbGFzc05hbWVBdHRyLmdldEF0dHJpYnV0ZVZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgY2xhenogPSBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoImNsdXN0ZXJJbXBsTm90Rm91bmQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBDb250ZXh0TWFuYWdlckxpc3RlbmVyIGxpc3RlbmVyID0gKENvbnRleHRNYW5hZ2VyTGlzdGVuZXIpIGNsYXp6Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICAgICAgY29udGV4dE1hbmFnZXIuc2V0Q29udGV4dE1hbmFnZXJMaXN0ZW5lcihsaXN0ZW5lcik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoImNvbnRleHRNYW5hZ2VyTGlzdGVuZXJJc051bGwiKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vbG9hZGluZyB0aGUgcGFyYW1ldGVycy4KLSAgICAgICAgICAgIHByb2Nlc3NQYXJhbWV0ZXJzKGNvbnRleHRNYW5hZ2VyRWxlLmdldENoaWxkcmVuV2l0aE5hbWUobmV3IFFOYW1lKFRBR19QQVJBTUVURVIpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHRNYW5hZ2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCk7Ci0KLSAgICAgICAgICAgIC8vIExvYWQgdGhlIHJlcGxpY2F0aW9uIHBhdHRlcm5zIHRvIGJlIGV4Y2x1ZGVkLiBXZSBsb2FkIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlLgotICAgICAgICAgICAgLyo8cmVwbGljYXRpb24+Ci0gICAgICAgICAgICAgICAgPGRlZmF1bHRzPgotICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJmb28uYmFyLioiLz4KLSAgICAgICAgICAgICAgICA8L2RlZmF1bHRzPgotICAgICAgICAgICAgICAgIDxjb250ZXh0IGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQiPgotICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJteS5zYW5kZXNoYS4qIi8+Ci0gICAgICAgICAgICAgICAgPC9jb250ZXh0PgotICAgICAgICAgICAgICAgIDxjb250ZXh0IGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuU2VydmljZUdyb3VwQ29udGV4dCI+Ci0gICAgICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9Im15LnNhbmRlc2hhLioiLz4KLSAgICAgICAgICAgICAgICA8L2NvbnRleHQ+Ci0gICAgICAgICAgICAgICAgPGNvbnRleHQgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5TZXJ2aWNlQ29udGV4dCI+Ci0gICAgICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9Im15LnNhbmRlc2hhLioiLz4KLSAgICAgICAgICAgICAgICA8L2NvbnRleHQ+Ci0gICAgICAgICAgICA8L3JlcGxpY2F0aW9uPiovCi0gICAgICAgICAgICBPTUVsZW1lbnQgcmVwbGljYXRpb25FbGUgPQotICAgICAgICAgICAgICAgICAgICBjb250ZXh0TWFuYWdlckVsZS5nZXRGaXJzdENoaWxkV2l0aE5hbWUobmV3IFFOYW1lKFRBR19SRVBMSUNBVElPTikpOwotICAgICAgICAgICAgaWYgKHJlcGxpY2F0aW9uRWxlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBQcm9jZXNzIGRlZmF1bHRzCi0gICAgICAgICAgICAgICAgT01FbGVtZW50IGRlZmF1bHRzRWxlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxpY2F0aW9uRWxlLmdldEZpcnN0Q2hpbGRXaXRoTmFtZShuZXcgUU5hbWUoVEFHX0RFRkFVTFRTKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGRlZmF1bHRzRWxlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgTGlzdCBkZWZhdWx0cyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gZGVmYXVsdHNFbGUuZ2V0Q2hpbGRyZW5XaXRoTmFtZShuZXcgUU5hbWUoVEFHX0VYQ0xVREUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE9NRWxlbWVudCBleGNsdWRlRWxlID0gKE9NRWxlbWVudCkgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBPTUF0dHJpYnV0ZSBuYW1lQXR0ID0gZXhjbHVkZUVsZS5nZXRBdHRyaWJ1dGUobmV3IFFOYW1lKEFUVFJJQlVURV9OQU1FKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0cy5hZGQobmFtZUF0dC5nZXRBdHRyaWJ1dGVWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjb250ZXh0TWFuYWdlci5zZXRSZXBsaWNhdGlvbkV4Y2x1ZGVQYXR0ZXJucyhUQUdfREVGQVVMVFMsIGRlZmF1bHRzKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBQcm9jZXNzIHNwZWNpZmljcwotICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHJlcGxpY2F0aW9uRWxlLmdldENoaWxkcmVuV2l0aE5hbWUobmV3IFFOYW1lKFRBR19DT05URVhUKSk7Ci0gICAgICAgICAgICAgICAgICAgICBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICAgICAgT01FbGVtZW50IGNvbnRleHRFbGUgPSAoT01FbGVtZW50KSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGN0eENsYXNzTmFtZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dEVsZS5nZXRBdHRyaWJ1dGUobmV3IFFOYW1lKEFUVFJJQlVURV9DTEFTUykpLmdldEF0dHJpYnV0ZVZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgIExpc3QgZXhjbHVkZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlcjIgPSBjb250ZXh0RWxlLmdldENoaWxkcmVuV2l0aE5hbWUobmV3IFFOYW1lKFRBR19FWENMVURFKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgaXRlcjIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgICAgICAgICAgT01FbGVtZW50IGV4Y2x1ZGVFbGUgPSAoT01FbGVtZW50KSBpdGVyMi5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBPTUF0dHJpYnV0ZSBuYW1lQXR0ID0gZXhjbHVkZUVsZS5nZXRBdHRyaWJ1dGUobmV3IFFOYW1lKEFUVFJJQlVURV9OQU1FKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBleGNsdWRlcy5hZGQobmFtZUF0dC5nZXRBdHRyaWJ1dGVWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjb250ZXh0TWFuYWdlci5zZXRSZXBsaWNhdGlvbkV4Y2x1ZGVQYXR0ZXJucyhjdHhDbGFzc05hbWUsIGV4Y2x1ZGVzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgbG9hZENvbmZpZ01hbmFnZXIoT01FbGVtZW50IGNsdXN0ZXJFbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbHVzdGVyTWFuYWdlciBjbHVzdGVyTWFuYWdlcikgdGhyb3dzIERlcGxveW1lbnRFeGNlcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHsKLSAgICAgICAgT01FbGVtZW50IGNvbmZpZ01hbmFnZXJFbGUgPQotICAgICAgICAgICAgICAgIGNsdXN0ZXJFbGVtZW50LmdldEZpcnN0Q2hpbGRXaXRoTmFtZShuZXcgUU5hbWUoVEFHX0NPTkZJR1VSQVRJT05fTUFOQUdFUikpOwotICAgICAgICBpZiAoY29uZmlnTWFuYWdlckVsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoIWlzRW5hYmxlZChjb25maWdNYW5hZ2VyRWxlKSkgewotICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJDbHVzdGVyaW5nIGNvbmZpZ3VyYXRpb24gbWFuYWdlbWVudCBoYXMgYmVlbiBkaXNhYmxlZCIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGxvZy5pbmZvKCJDbHVzdGVyaW5nIGNvbmZpZ3VyYXRpb24gbWFuYWdlbWVudCBoYXMgYmVlbiBlbmFibGVkIik7Ci0KLSAgICAgICAgICAgIE9NQXR0cmlidXRlIGNsYXNzTmFtZUF0dHIgPSBjb25maWdNYW5hZ2VyRWxlLmdldEF0dHJpYnV0ZShuZXcgUU5hbWUoQVRUUklCVVRFX0NMQVNTKSk7Ci0gICAgICAgICAgICBpZiAoY2xhc3NOYW1lQXR0ciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiY2xhc3NBdHRyaWJ1dGVOb3RGb3VuZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQUdfQ09ORklHVVJBVElPTl9NQU5BR0VSKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBjbGFzc05hbWVBdHRyLmdldEF0dHJpYnV0ZVZhbHVlKCk7Ci0gICAgICAgICAgICBDbGFzcyBjbGF6ejsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgY2xhenogPSBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJjbHVzdGVySW1wbE5vdEZvdW5kIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZSkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBDb25maWd1cmF0aW9uTWFuYWdlciBjb25maWd1cmF0aW9uTWFuYWdlciA9Ci0gICAgICAgICAgICAgICAgICAgIChDb25maWd1cmF0aW9uTWFuYWdlcikgY2xhenoubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIGNsdXN0ZXJNYW5hZ2VyLnNldENvbmZpZ3VyYXRpb25NYW5hZ2VyKGNvbmZpZ3VyYXRpb25NYW5hZ2VyKTsKLQotICAgICAgICAgICAgT01FbGVtZW50IGxpc3RlbmVyRWxlID0KLSAgICAgICAgICAgICAgICAgICAgY29uZmlnTWFuYWdlckVsZS5nZXRGaXJzdENoaWxkV2l0aE5hbWUobmV3IFFOYW1lKFRBR19MSVNURU5FUikpOwotICAgICAgICAgICAgaWYgKGxpc3RlbmVyRWxlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjbGFzc05hbWVBdHRyID0gbGlzdGVuZXJFbGUuZ2V0QXR0cmlidXRlKG5ldyBRTmFtZShUQUdfQ0xBU1NfTkFNRSkpOwotICAgICAgICAgICAgICAgIGlmIChjbGFzc05hbWVBdHRyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiY2x1c3RlckltcGxOb3RGb3VuZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEFHX0xJU1RFTkVSKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgY2xhc3NOYW1lID0gY2xhc3NOYW1lQXR0ci5nZXRBdHRyaWJ1dGVWYWx1ZSgpOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGNsYXp6ID0gQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJjb25maWd1cmF0aW9uTWFuYWdlckxpc3RlbmVySXNOdWxsIikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uTWFuYWdlckxpc3RlbmVyIGxpc3RlbmVyID0gKENvbmZpZ3VyYXRpb25NYW5hZ2VyTGlzdGVuZXIpIGNsYXp6Ci0gICAgICAgICAgICAgICAgICAgICAgICAubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgICAgICBsaXN0ZW5lci5zZXRDb25maWd1cmF0aW9uQ29udGV4dChjb25maWdDdHgpOwotICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb25NYW5hZ2VyLnNldENvbmZpZ3VyYXRpb25NYW5hZ2VyTGlzdGVuZXIobGlzdGVuZXIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJjb25maWd1cmF0aW9uTWFuYWdlckxpc3RlbmVySXNOdWxsIikpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvL3VwZGF0aW5nIHRoZSBDb25maWd1cmF0aW9uTWFuYWdlciB3aXRoIHRoZSBuZXcgQ29uZmlndXJhdGlvbkNvbnRleHQKLSAgICAgICAgICAgIGNvbmZpZ3VyYXRpb25NYW5hZ2VyLnNldENvbmZpZ3VyYXRpb25Db250ZXh0KGNvbmZpZ0N0eCk7Ci0KLSAgICAgICAgICAgIC8vbG9hZGluZyB0aGUgcGFyYW1ldGVycy4KLSAgICAgICAgICAgIHByb2Nlc3NQYXJhbWV0ZXJzKGNvbmZpZ01hbmFnZXJFbGUuZ2V0Q2hpbGRyZW5XaXRoTmFtZShuZXcgUU5hbWUoVEFHX1BBUkFNRVRFUikpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbk1hbmFnZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L0RlcGxveWVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9EZXBsb3llci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTRiNzQ3Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L0RlcGxveWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQucmVwb3NpdG9yeS51dGlsLkRlcGxveW1lbnRGaWxlRGF0YTsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBpcyB1c2VkIHRvIHByb3ZpZGUgdGhlIGN1c3RvbSBkZXBsb3ltZW50IG1lY2hhbmlzbSAsIHdoZXJlIHlvdQotICogY2FuIHdyaXRlIHlvdXIgb3duIERlcGxveWVyIHRvIHByb2Nlc3MgYSBwYXJ0aWN1bGFyIHR5cGUgYW5kIG1ha2UgdGhhdCB0bwotICogYSBzZXJ2aWNlIG9yIGEgbW9kdWxlLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIERlcGxveWVyIHsKLSAgICAvKioKLSAgICAgKiBJbml0aWFsaXplIHRoZSBEZXBsb3llcgotICAgICAqIEBwYXJhbSBjb25maWdDdHggb3VyIENvbmZpZ3VyYXRpb25Db250ZXh0Ci0gICAgICovCi0gICAgdm9pZCBpbml0KENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0N0eCk7Ci0KLSAgICAvKioKLSAgICAgKiBQcm9jZXNzIGEgZmlsZSBhbmQgYWRkIGl0IHRvIHRoZSBjb25maWd1cmF0aW9uCi0gICAgICogQHBhcmFtIGRlcGxveW1lbnRGaWxlRGF0YSB0aGUgRGVwbG95bWVudEZpbGVEYXRhIG9iamVjdCB0byBkZXBsb3kKLSAgICAgKiBAdGhyb3dzIERlcGxveW1lbnRFeGNlcHRpb24gaWYgdGhlcmUgaXMgYSBwcm9ibGVtCi0gICAgICovCi0gICAgdm9pZCBkZXBsb3koRGVwbG95bWVudEZpbGVEYXRhIGRlcGxveW1lbnRGaWxlRGF0YSkgdGhyb3dzIERlcGxveW1lbnRFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGRpcmVjdG9yeQotICAgICAqIEBwYXJhbSBkaXJlY3RvcnkgZGlyZWN0b3J5IG5hbWUKLSAgICAgKi8KLSAgICB2b2lkIHNldERpcmVjdG9yeShTdHJpbmcgZGlyZWN0b3J5KTsKLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgZXh0ZW5zaW9uIHRvIGxvb2sgZm9yCi0gICAgICogVE9ETzogU3VwcG9ydCBtdWx0aXBsZSBleHRlbnNpb25zPwotICAgICAqIEBwYXJhbSBleHRlbnNpb24gdGhlIGZpbGUgZXh0ZW5zaW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzIERlcGxveWVyCi0gICAgICovCi0gICAgdm9pZCBzZXRFeHRlbnNpb24oU3RyaW5nIGV4dGVuc2lvbik7Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmUgYSBnaXZlbiBmaWxlIGZyb20gdGhlIGNvbmZpZ3VyYXRpb24KLSAgICAgKiBAcGFyYW0gZmlsZU5hbWUgbmFtZSBvZiBpdGVtIHRvIHJlbW92ZQotICAgICAqIEB0aHJvd3MgRGVwbG95bWVudEV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIHByb2JsZW0KLSAgICAgKi8KLSAgICB2b2lkIHVuRGVwbG95KFN0cmluZyBmaWxlTmFtZSkgdGhyb3dzIERlcGxveW1lbnRFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9EZXBsb3ltZW50Q2xhc3NMb2FkZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L0RlcGxveW1lbnRDbGFzc0xvYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjRlNmFlLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L0RlcGxveW1lbnRDbGFzc0xvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5hdHRhY2htZW50cy51dGlscy5JT1V0aWxzOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmV0LlVSTENsYXNzTG9hZGVyOwotaW1wb3J0IGphdmEubmV0LlVSTENvbm5lY3Rpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMU3RyZWFtSGFuZGxlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcElucHV0U3RyZWFtOwotCi1wdWJsaWMgY2xhc3MgRGVwbG95bWVudENsYXNzTG9hZGVyIGV4dGVuZHMgVVJMQ2xhc3NMb2FkZXIgewotICAgIC8vIExpc3Qgb2YgVVJMJ3MKLSAgICBwcml2YXRlIFVSTFtdIHVybHMgPSBudWxsOwotCi0gICAgLy8gTGlzdCBvZiBqYXIgZmlsZXMgaW5zaWRlIHRoZSBqYXJzIGluIHRoZSBvcmlnaW5hbCB1cmwKLSAgICBwcml2YXRlIExpc3QgZW1iZWRkZWRfamFyczsKLQotICAgIC8qKgotICAgICAqIERlcGxveW1lbnRDbGFzc0xvYWRlciBpcyBleHRlbmRlZCBmcm9tIFVSTENsYXNzTG9hZGVyLiBUaGUgY29uc3RydWN0b3IKLSAgICAgKiBkb2VzIG5vdCBvdmVycmlkZSB0aGUgc3VwZXIgY29uc3RydWN0b3IsIGJ1dCB0YWtlcyBpbiBhbiBhZGRpdGlvbiBsaXN0IG9mCi0gICAgICogamFyIGZpbGVzIGluc2lkZSAvbGliIGRpcmVjdG9yeS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB1cmxzICAgPGNvZGU+VVJMPC9jb2RlPnMKLSAgICAgKiBAcGFyYW0gcGFyZW50IHBhcmVudCBjbGFzc2xvYWRlciA8Y29kZT5DbGFzc0xvYWRlcjwvY29kZT4KLSAgICAgKi8KLSAgICBwdWJsaWMgRGVwbG95bWVudENsYXNzTG9hZGVyKFVSTFtdIHVybHMsIExpc3QgZW1iZWRkZWRfamFycywgQ2xhc3NMb2FkZXIgcGFyZW50KSB7Ci0gICAgICAgIHN1cGVyKHVybHMsIHBhcmVudCk7Ci0gICAgICAgIHRoaXMudXJscyA9IHVybHM7Ci0gICAgICAgIHRoaXMuZW1iZWRkZWRfamFycyA9IGVtYmVkZGVkX2phcnM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmluZHMgYW5kIGxvYWRzIHRoZSBjbGFzcyB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBmcm9tIHRoZSBVUkwgc2VhcmNoCi0gICAgICogcGF0aC4gQW55IFVSTHMgcmVmZXJyaW5nIHRvIEpBUiBmaWxlcyBhcmUgbG9hZGVkIGFuZCBvcGVuZWQgYXMgbmVlZGVkCi0gICAgICogdW50aWwgdGhlIGNsYXNzIGlzIGZvdW5kLgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGNsYXNzCi0gICAgICogQHJldHVybiB0aGUgcmVzdWx0aW5nIGNsYXNzCi0gICAgICogQGV4Y2VwdGlvbiBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGlmIHRoZSBjbGFzcyBjb3VsZCBub3QgYmUgZm91bmQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ2xhc3MgZmluZENsYXNzKFN0cmluZyBuYW1lKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIENsYXNzIGNsYXp6OwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY2xhenogPSBzdXBlci5maW5kQ2xhc3MobmFtZSk7Ci0gICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYnl0ZSByYXdbXSA9IG51bGw7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIFN0cmluZyBjb21wbGV0ZUZpbGVOYW1lID0gbmFtZTsKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiBSZXBsYWNpbmcgb3JnLmFwYWNoZS4gLT4gb3JnL2FwYWNoZS8uLi4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBjb21wbGV0ZUZpbGVOYW1lID0gY29tcGxldGVGaWxlTmFtZS5yZXBsYWNlKCcuJywgJy8nKS5jb25jYXQoIi5jbGFzcyIpOwotICAgICAgICAgICAgICAgIHJhdyA9IGdldEJ5dGVzKGNvbXBsZXRlRmlsZU5hbWUpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgLy8gRmFsbCB0aHJvdWdoCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocmF3ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbigiQ2xhc3MgTm90IGZvdW5kIDogIiArIG5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2xhenogPSBkZWZpbmVDbGFzcyhuYW1lLCByYXcsIDAsIHJhdy5sZW5ndGgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjbGF6ejsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIEZpbmRzIHRoZSByZXNvdXJjZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBvbiB0aGUgVVJMIHNlYXJjaCBwYXRoLgotICAgICAqCi0gICAgICogQHBhcmFtIHJlc291cmNlIHRoZSBuYW1lIG9mIHRoZSByZXNvdXJjZQotICAgICAqIEByZXR1cm4gYSA8Y29kZT5VUkw8L2NvZGU+IGZvciB0aGUgcmVzb3VyY2UsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0gICAgICogaWYgdGhlIHJlc291cmNlIGNvdWxkIG5vdCBiZSBmb3VuZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgVVJMIGZpbmRSZXNvdXJjZShTdHJpbmcgcmVzb3VyY2UpIHsKLSAgICAgICAgVVJMIHVybCA9IHN1cGVyLmZpbmRSZXNvdXJjZShyZXNvdXJjZSk7Ci0gICAgICAgIGlmICh1cmwgPT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGVtYmVkZGVkX2phcnMgIT0gbnVsbCAmJiBpIDwgZW1iZWRkZWRfamFycy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIFN0cmluZyBsaWJqYXJfbmFtZSA9IChTdHJpbmcpIGVtYmVkZGVkX2phcnMuZ2V0KGkpOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGluID0gZ2V0SmFyQXNTdHJlYW0obGliamFyX25hbWUpOwotICAgICAgICAgICAgICAgICAgICBaaXBJbnB1dFN0cmVhbSB6aW4gPSBuZXcgWmlwSW5wdXRTdHJlYW0oaW4pOwotICAgICAgICAgICAgICAgICAgICBaaXBFbnRyeSBlbnRyeTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGVudHJ5TmFtZTsKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKChlbnRyeSA9IHppbi5nZXROZXh0RW50cnkoKSkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZW50cnlOYW1lID0gZW50cnkuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5TmFtZSAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5TmFtZS5lbmRzV2l0aChyZXNvdXJjZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gcmF3ID0gSU9VdGlscy5nZXRTdHJlYW1Bc0J5dGVBcnJheSh6aW4pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVVJMKCJqYXIiLCAiIiwgLTEsIHVybHNbMF0gKyAiIS8iICsgbGliamFyX25hbWUgKyAiIS8iICsgZW50cnlOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJ5dGVVcmxTdHJlYW1IYW5kbGVyKHJhdykpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB1cmw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBFbnVtZXJhdGlvbiBvZiBVUkxzIHJlcHJlc2VudGluZyBhbGwgb2YgdGhlIHJlc291cmNlcwotICAgICAqIG9uIHRoZSBVUkwgc2VhcmNoIHBhdGggaGF2aW5nIHRoZSBzcGVjaWZpZWQgbmFtZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSByZXNvdXJjZSB0aGUgcmVzb3VyY2UgbmFtZQotICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gSS9PIGV4Y2VwdGlvbiBvY2N1cnMKLSAgICAgKiBAcmV0dXJuIGFuIDxjb2RlPkVudW1lcmF0aW9uPC9jb2RlPiBvZiA8Y29kZT5VUkw8L2NvZGU+cwotICAgICAqLwotICAgIHB1YmxpYyBFbnVtZXJhdGlvbiBmaW5kUmVzb3VyY2VzKFN0cmluZyByZXNvdXJjZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgQXJyYXlMaXN0IHJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgRW51bWVyYXRpb24gZSA9IHN1cGVyLmZpbmRSZXNvdXJjZXMocmVzb3VyY2UpOwotICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgcmVzb3VyY2VzLmFkZChlLm5leHRFbGVtZW50KCkpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBlbWJlZGRlZF9qYXJzICE9IG51bGwgJiYgaSA8IGVtYmVkZGVkX2phcnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIFN0cmluZyBsaWJqYXJfbmFtZSA9IChTdHJpbmcpIGVtYmVkZGVkX2phcnMuZ2V0KGkpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIElucHV0U3RyZWFtIGluID0gZ2V0SmFyQXNTdHJlYW0obGliamFyX25hbWUpOwotICAgICAgICAgICAgWmlwSW5wdXRTdHJlYW0gemluID0gbmV3IFppcElucHV0U3RyZWFtKGluKTsKLSAgICAgICAgICAgIFppcEVudHJ5IGVudHJ5OwotICAgICAgICAgICAgU3RyaW5nIGVudHJ5TmFtZTsKLSAgICAgICAgICAgICAgICB3aGlsZSAoKGVudHJ5ID0gemluLmdldE5leHRFbnRyeSgpKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVudHJ5TmFtZSA9IGVudHJ5LmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5TmFtZSAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnlOYW1lLmVuZHNXaXRoKHJlc291cmNlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIHJhdyA9IElPVXRpbHMuZ2V0U3RyZWFtQXNCeXRlQXJyYXkoemluKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlcy5hZGQobmV3IFVSTCgiamFyIiwgIiIsIC0xLCB1cmxzWzBdICsgIiEvIiArIGxpYmphcl9uYW1lICsgIiEvIiArIGVudHJ5TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJ5dGVVcmxTdHJlYW1IYW5kbGVyKHJhdykpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW51bWVyYXRpb24ocmVzb3VyY2VzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBY2Nlc3MgdGhlIGphcnMgZmlsZSAoL2xpYikgb25lIGJ5IG9uZSAsIHRoZW4gZm9yIGVhY2ggb25lIGNyZWF0ZSBhIDxjb2RlPlppcElucHV0U3RyZWFtPC9jb2RlPgotICAgICAqIGFuZCBjaGVjayB0byBzZWUgd2hldGhlciB0aGVyZSBpcyBhbnkgZW50cnkgZWl0aCBnaXZlbiBuYW1lLiBpZiBpdCBpcyBmb3VuZCB0aGVuCi0gICAgICogcmV0dXJuIHRoZSBieXRlIGFycmF5IGZvciB0aGF0Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVzb3VyY2UgPGNvZGU+U3RyaW5nPC9jb2RlPiAgTmFtZSBvZiB0aGUgZmlsZSB0byBiZSBmb3VuZAotICAgICAqIEByZXR1cm4gYnl0ZVtdCi0gICAgICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIDxjb2RlPkV4Y2VwdGlvbjwvY29kZT4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJ5dGVbXSBnZXRCeXRlcyhTdHJpbmcgcmVzb3VyY2UpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBmb3IgKGludCBpID0gMDsgZW1iZWRkZWRfamFycyAhPSBudWxsICYmIGkgPCBlbWJlZGRlZF9qYXJzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbGliamFyX25hbWUgPSAoU3RyaW5nKSBlbWJlZGRlZF9qYXJzLmdldChpKTsKLSAgICAgICAgICAgIElucHV0U3RyZWFtIGluID0gZ2V0SmFyQXNTdHJlYW0obGliamFyX25hbWUpOwotICAgICAgICAgICAgYnl0ZVtdIGJ5dGVzID0gZ2V0Qnl0ZXMoaW4sIHJlc291cmNlKTsKLSAgICAgICAgICAgIGlmKGJ5dGVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gYnl0ZXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGEgc3BlY2lmaWMgZW50cnkncyBjb250ZW50IGFzIGEgYnl0ZSBhcnJheQotICAgICAqIAotICAgICAqIEBwYXJhbSBpbgotICAgICAqIEBwYXJhbSByZXNvdXJjZQotICAgICAqIEByZXR1cm4KLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgYnl0ZVtdIGdldEJ5dGVzKElucHV0U3RyZWFtIGluLCBTdHJpbmcgcmVzb3VyY2UpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBaaXBJbnB1dFN0cmVhbSB6aW4gPSBuZXcgWmlwSW5wdXRTdHJlYW0oaW4pOwotICAgICAgICBaaXBFbnRyeSBlbnRyeTsKLSAgICAgICAgU3RyaW5nIGVudHJ5TmFtZTsKLSAgICAgICAgd2hpbGUgKChlbnRyeSA9IHppbi5nZXROZXh0RW50cnkoKSkgIT0gbnVsbCkgewotICAgICAgICAgICAgZW50cnlOYW1lID0gZW50cnkuZ2V0TmFtZSgpOwotICAgICAgICAgICAgaWYgKGVudHJ5TmFtZSAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgICAgIGVudHJ5TmFtZS5lbmRzV2l0aChyZXNvdXJjZSkpIHsKLSAgICAgICAgICAgICAgICBieXRlW10gcmF3ID0gSU9VdGlscy5nZXRTdHJlYW1Bc0J5dGVBcnJheSh6aW4pOwotICAgICAgICAgICAgICAgIHppbi5jbG9zZSgpOwotICAgICAgICAgICAgICAgIHJldHVybiByYXc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBzcGVjaWZpZWQgZW1iZWRkZWQgamFyIGZyb20gdGhlIG1haW4gamFyIAotICAgICAqCi0gICAgICogQHBhcmFtIGxpYmphcl9uYW1lCi0gICAgICogQHJldHVybgotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSBJbnB1dFN0cmVhbSBnZXRKYXJBc1N0cmVhbShTdHJpbmcgbGliamFyX25hbWUpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGdldEJ5dGVzKHVybHNbMF0ub3BlblN0cmVhbSgpLCBsaWJqYXJfbmFtZSkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQnl0ZVVybFN0cmVhbUhhbmRsZXIgZXh0ZW5kcyBVUkxTdHJlYW1IYW5kbGVyIHsKLSAgICAgICAgcHJpdmF0ZSBieXRlW10gYnl0ZXM7Ci0KLSAgICAgICAgcHVibGljIEJ5dGVVcmxTdHJlYW1IYW5kbGVyKGJ5dGVbXSBieXRlcykgewotICAgICAgICAgICAgdGhpcy5ieXRlcyA9IGJ5dGVzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIFVSTENvbm5lY3Rpb24gb3BlbkNvbm5lY3Rpb24oVVJMIHUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEJ5dGVVUkxDb25uZWN0aW9uKHUsIGJ5dGVzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQnl0ZVVSTENvbm5lY3Rpb24gZXh0ZW5kcyBVUkxDb25uZWN0aW9uIHsKLSAgICAgICAgcHJvdGVjdGVkIGJ5dGVbXSBieXRlczsKLQotICAgICAgICBwdWJsaWMgQnl0ZVVSTENvbm5lY3Rpb24oVVJMIHVybCwgYnl0ZVtdIGJ5dGVzKSB7Ci0gICAgICAgICAgICBzdXBlcih1cmwpOwotICAgICAgICAgICAgdGhpcy5ieXRlcyA9IGJ5dGVzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgY29ubmVjdCgpIHsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZXMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIElucHV0U3RyZWFtIGdldFJlc291cmNlQXNTdHJlYW0oU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgVVJMIHVybCA9IGZpbmRSZXNvdXJjZShuYW1lKTsKLSAgICAgICAgaWYodXJsID09IG51bGwpIHsKLSAgICAgICAgICAgIHVybCA9IGdldFJlc291cmNlKG5hbWUpOwotICAgICAgICB9Ci0gICAgICAgIGlmKHVybCE9bnVsbCl7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHJldHVybiB1cmwub3BlblN0cmVhbSgpOwotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L0RlcGxveW1lbnRDb25zdGFudHMuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L0RlcGxveW1lbnRDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk5N2FkMC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9EZXBsb3ltZW50Q29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzOwotCi0vKioKLSAqIENvbnN0YW50cyB1c2VkIGR1cmluZyBzZXJ2aWNlL21vZHVsZSBkZXBsb3ltZW50LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIERlcGxveW1lbnRDb25zdGFudHMgewotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE1FVEFfSU5GID0gIk1FVEEtSU5GIjsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBTRVJWSUNFU19YTUwgPSAiTUVUQS1JTkYvc2VydmljZXMueG1sIjsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBNT0RVTEVfWE1MID0gIk1FVEEtSU5GL21vZHVsZS54bWwiOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFNFUlZJQ0VfUEFUSCA9ICJzZXJ2aWNlcyI7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgU0VSVklDRV9ESVJfUEFUSCA9ICJTZXJ2aWNlc0RpcmVjdG9yeSI7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgTU9EVUxFX1BBVEggPSAibW9kdWxlcyI7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgTU9EVUxFX0RSSV9QQVRIID0gIk1vZHVsZXNEaXJlY3RvcnkiOwotCi0gICAgU3RyaW5nIFRBR19BWElTQ09ORklHID0gImF4aXNjb25maWciOwotICAgIFN0cmluZyBUQUdfUEhBU0VfT1JERVIgPSAicGhhc2VPcmRlciI7Ci0gICAgU3RyaW5nIFRBR19QQVJBTUVURVIgPSAicGFyYW1ldGVyIjsKLSAgICBTdHJpbmcgVEFHX01BUFBJTkcgPSAibWFwcGluZyI7Ci0gICAgU3RyaW5nIFRBR19QQUNLQUdFX05BTUUgPSAicGFja2FnZU5hbWUiOwotICAgIFN0cmluZyBUQUdfUU5BTUUgPSAicU5hbWUiOwotICAgIFN0cmluZyBUQUdfUEFDS0FHRTJRTkFNRSA9ICJwYWNrYWdlTWFwcGluZyI7Ci0gICAgU3RyaW5nIFRBR19NT0RVTEUgPSAibW9kdWxlIjsKLSAgICBTdHJpbmcgVEFHX01PRFVMRV9DT05GSUcgPSAibW9kdWxlQ29uZmlnIjsKLSAgICBTdHJpbmcgVEFHX01FU1NBR0UgPSAibWVzc2FnZSI7Ci0gICAgU3RyaW5nIFRBR19MSVNURU5FUiA9ICJsaXN0ZW5lciI7Ci0gICAgU3RyaW5nIFRBR19MQUJFTCA9ICJsYWJlbCI7Ci0gICAgU3RyaW5nIFRBR19IQU5ETEVSID0gImhhbmRsZXIiOwotICAgIFN0cmluZyBUQUdfVFlQRSA9ICJ0eXBlIjsKLSAgICBTdHJpbmcgVEFHX1RBUkdFVF9SRVNPTFZFUlMgPSAidGFyZ2V0UmVzb2x2ZXJzIjsKLSAgICBTdHJpbmcgVEFHX1RBUkdFVF9SRVNPTFZFUiA9ICJ0YXJnZXRSZXNvbHZlciI7Ci0gICAgU3RyaW5nIFRBR19USFJFQURfQ09OVEVYVF9NSUdSQVRPUlMgPSAidGhyZWFkQ29udGV4dE1pZ3JhdG9ycyI7Ci0gICAgU3RyaW5nIFRBR19USFJFQURfQ09OVEVYVF9NSUdSQVRPUiA9ICJ0aHJlYWRDb250ZXh0TWlncmF0b3IiOwotICAgIFN0cmluZyBUQUdfVFJBTlNQT1JUX1NFTkRFUiA9ICJ0cmFuc3BvcnRTZW5kZXIiOwotICAgIFN0cmluZyBUQUdfVFJBTlNQT1JUX1JFQ0VJVkVSID0gInRyYW5zcG9ydFJlY2VpdmVyIjsKLSAgICBTdHJpbmcgVEFHX1NFUlZJQ0VfR1JPVVAgPSAic2VydmljZUdyb3VwIjsKLSAgICBTdHJpbmcgVEFHX1NFUlZJQ0UgPSAic2VydmljZSI7Ci0gICAgU3RyaW5nIFRBR19SRUZFUkVOQ0UgPSAicmVmIjsKLSAgICBTdHJpbmcgVEFHX1BIQVNFX0xBU1QgPSAicGhhc2VMYXN0IjsKLSAgICBTdHJpbmcgVEFHX1BIQVNFX0ZJUlNUID0gInBoYXNlRmlyc3QiOwotICAgIFN0cmluZyBUQUdfT1JERVIgPSAib3JkZXIiOyAgICAgICAgICAgLy8gdG8gcmVzb2x2ZSB0aGUgb3JkZXIgdGFnCi0gICAgU3RyaW5nIFRBR19PUEVSQVRJT04gPSAib3BlcmF0aW9uIjsgICAgICAgLy8gb3BlcmF0aW9uIHN0YXJ0IHRhZwotICAgIFN0cmluZyBUQUdfUEhBU0UgPSAicGhhc2UiOyAgICAgICAvLyBvcGVyYXRpb24gc3RhcnQgdGFnCi0gICAgU3RyaW5nIFRBR19PQkpFQ1RfU1VQUExJRVIgPSAiT2JqZWN0U3VwcGxpZXIiOyAgICAgICAvLyBvcGVyYXRpb24gc3RhcnQgdGFnCi0gICAgU3RyaW5nIFRBR19FWENMVURFX09QRVJBVElPTlMgPSAiZXhjbHVkZU9wZXJhdGlvbnMiOwotICAgIFN0cmluZyBUQUdfTUVTU0FHRV9SRUNFSVZFUiA9ICJtZXNzYWdlUmVjZWl2ZXIiOwotICAgIFN0cmluZyBUQUdfTUVTU0FHRV9SRUNFSVZFUlMgPSAibWVzc2FnZVJlY2VpdmVycyI7Ci0gICAgU3RyaW5nIFRBR19UUkFOU1BPUlRTID0gInRyYW5zcG9ydHMiOwotICAgIFN0cmluZyBUQUdfVFJBTlNQT1JUID0gInRyYW5zcG9ydCI7Ci0gICAgU3RyaW5nIFRBR19NRVAgPSAibWVwIjsKLSAgICBTdHJpbmcgVEFHX0RFRkFVTFRfTU9EVUxFX1ZFUlNJT04gPSAiZGVmYXVsdE1vZHVsZVZlcnNpb25zIjsKLSAgICBTdHJpbmcgVEFHX0NMVVNURVIgPSAiY2x1c3RlciI7Ci0gICAgU3RyaW5nIFRBR19UUkFOU0FDVElPTiA9ICJ0cmFuc2FjdGlvbiI7Ci0gICAgU3RyaW5nIFRBR19USU1FT1VUID0gInRpbWVvdXQiOwotICAgIFN0cmluZyBUQUdfTUVTU0FHRV9CVUlMREVSUyA9Ci0gICAgICAgICAgICAibWVzc2FnZUJ1aWxkZXJzIjsgLy91c2VkIHRvIGFkZCBwbHVnZ2FibGUgc3VwcG9ydCBmb3IgZGlmZnJlbnQgd2lyZSBmb3JtYXRzCi0gICAgU3RyaW5nIFRBR19NRVNTQUdFX0JVSUxERVIgPSAibWVzc2FnZUJ1aWxkZXIiOwotICAgIFN0cmluZyBUQUdfQ09OVEVOVF9UWVBFID0gImNvbnRlbnRUeXBlIjsKLSAgICBTdHJpbmcgVEFHX01FU1NBR0VfRk9STUFUVEVSUyA9Ci0gICAgICAgICAgICAibWVzc2FnZUZvcm1hdHRlcnMiOyAvL3VzZWQgdG8gYWRkIHBsdWdnYWJsZSBzdXBwb3J0IGZvciBkaWZmcmVudCB3aXJlIGZvcm1hdHMKLSAgICBTdHJpbmcgVEFHX01FU1NBR0VfRk9STUFUVEVSID0gIm1lc3NhZ2VGb3JtYXR0ZXIiOwotCi0gICAgU3RyaW5nIFRBR19GTE9XX0lOID0gIkluRmxvdyI7ICAgICAgICAgLy8gaW5mbG93IHN0YXJ0IHRhZwotICAgIFN0cmluZyBUQUdfRkxPV19PVVQgPSAiT3V0RmxvdyI7ICAgICAgICAgLy8gb3V0ZmxvdyBzdGFydCB0YWcKLSAgICBTdHJpbmcgVEFHX0ZMT1dfT1VUX0ZBVUxUID0gIk91dEZhdWx0RmxvdyI7ICAgIC8vIGZhdWx0ZmxvdyBzdGFydCB0YWcKLSAgICBTdHJpbmcgVEFHX0ZMT1dfSU5fRkFVTFQgPSAiSW5GYXVsdEZsb3ciOyAgICAvLyBmYXVsdGZsb3cgc3RhcnQgdGFnCi0KLSAgICBTdHJpbmcgVEFHX0hPVF9VUERBVEUgPSAiaG90dXBkYXRlIjsKLSAgICBTdHJpbmcgVEFHX0FOVElfSkFSX0xPQ0tJTkcgPSAiYW50aUpBUkxvY2tpbmciOwotICAgIFN0cmluZyBUQUdfSE9UX0RFUExPWU1FTlQgPSAiaG90ZGVwbG95bWVudCI7Ci0gICAgU3RyaW5nIFRBR19FWFBPU0UgPSAiZXhwb3NlIjsKLSAgICBTdHJpbmcgVEFHX0VYVFJBQ1RfU0VSVklDRV9BUkNISVZFID0gImV4dHJhY3RTZXJ2aWNlQXJjaGl2ZSI7Ci0gICAgU3RyaW5nIFRBR19ESVNQQVRDSF9PUkRFUiA9ICJkaXNwYXRjaE9yZGVyIjsKLSAgICBTdHJpbmcgVEFHX0RJU1BBVENIRVIgPSAiZGlzcGF0Y2hlciI7Ci0gICAgU3RyaW5nIFRBR19ERVNDUklQVElPTiA9ICJEZXNjcmlwdGlvbiI7Ci0gICAgU3RyaW5nIFRBR19DTEFTU19OQU1FID0gImNsYXNzIjsKLSAgICBTdHJpbmcgVEFHX0xJU1RfSUQgPSAibGlzdElkIjsKLSAgICBTdHJpbmcgVEFHX0VYQ0xVREVfUFJPUEVSVElFUz0gImV4Y2x1ZGVQcm9wZXJ0aWVzIjsKLSAgICBTdHJpbmcgVEFHX0lOQ0xVREVfUFJPUEVSVElFUz0gImluY2x1ZGVQcm9wZXJ0aWVzIjsKLSAgICBTdHJpbmcgVEFHX0FGVEVSID0gImFmdGVyIjsKLSAgICBTdHJpbmcgVEFHX0JFRk9SRSA9ICJiZWZvcmUiOwotICAgIFN0cmluZyBUQUdfU1VQUE9SVEVEX1BPTElDWV9OQU1FU1BBQ0VTID0gInN1cHBvcnRlZC1wb2xpY3ktbmFtZXNwYWNlcyI7Ci0gICAgU3RyaW5nIFRBR19OQU1FU1BBQ0VTID0gIm5hbWVzcGFjZXMiOwotCi0gICAgLy9DbHVzdGVyQnVpbGRlcgotICAgIFN0cmluZyBUQUdfQ09ORklHVVJBVElPTl9NQU5BR0VSID0gImNvbmZpZ3VyYXRpb25NYW5hZ2VyIjsKLSAgICBTdHJpbmcgVEFHX0NPTlRFWFRfTUFOQUdFUiA9ICJjb250ZXh0TWFuYWdlciI7Ci0gICAgU3RyaW5nIFRBR19SRVBMSUNBVElPTiA9ICJyZXBsaWNhdGlvbiI7Ci0gICAgU3RyaW5nIFRBR19ERUZBVUxUUyA9ICJkZWZhdWx0cyI7Ci0gICAgU3RyaW5nIFRBR19DT05URVhUID0gImNvbnRleHQiOwotICAgIFN0cmluZyBUQUdfRVhDTFVERSA9ICJleGNsdWRlIjsKLSAgICBTdHJpbmcgQVRUUklCVVRFX0NMQVNTID0gImNsYXNzIjsKLQotICAgIC8vRGVwbG95ZXIgcmVsYXRlZCBjb25zCi0gICAgU3RyaW5nIERJUkVDVE9SWSA9ICJkaXJlY3RvcnkiOwotICAgIFN0cmluZyBFWFRFTlNJT04gPSAiZXh0ZW5zaW9uIjsKLSAgICBTdHJpbmcgREVQTE9ZRVIgPSAiZGVwbG95ZXIiOwotCi0gICAgLy9BdHRhY2htZW50cyBMaWZlY3ljbGVNYW5hZ2VyIAotICAgIFN0cmluZyBBVFRBQ0hNRU5UU19MSUZFQ1lDTEVfTUFOQUdFUiA9ICJhdHRhY2htZW50c0xpZmVjeWNsZU1hbmFnZXIiOwotCi0gICAgLy8gZm9yIHBhcmFtZXRlcnMKLSAgICBTdHJpbmcgQVRUUklCVVRFX05BTUUgPSAibmFtZSI7Ci0gICAgU3RyaW5nIEFUVFJJQlVURV9XU0FERFJFU1NJTkcgPSAid3NhZGRyZXNzaW5nIjsKLSAgICBTdHJpbmcgVEFSR0VUX05BTUVfU1BBQ0UgPSAidGFyZ2V0TmFtZXNwYWNlIjsKLSAgICBTdHJpbmcgU0NIRU1BX05BTUVfU1BBQ0UgPSAic2NoZW1hTmFtZXNwYWNlIjsKLSAgICBTdHJpbmcgU0NIRU1BX0VMRU1FTlRfUVVBTElGSUVEID0gImVsZW1lbnRGb3JtRGVmYXVsdFF1YWxpZmllZCI7Ci0gICAgU3RyaW5nIFNDSEVNQSA9ICJzY2hlbWEiOwotICAgIFN0cmluZyBNQVBQSU5HID0gIm1hcHBpbmciOwotICAgIFN0cmluZyBBVFRSSUJVVEVfTkFNRVNQQUNFID0gIm5hbWVzcGFjZSI7Ci0gICAgU3RyaW5nIEFUVFJJQlVURV9QQUNLQUdFID0gInBhY2thZ2UiOwotCi0gICAgU3RyaW5nIEFUVFJJQlVURV9ERUZBVUxUX1ZFUlNJT04gPSAidmVyc2lvbiI7Ci0gICAgU3RyaW5nIEFUVFJJQlVURV9TQ09QRSA9ICJzY29wZSI7Ci0gICAgU3RyaW5nIEFUVFJJQlVURV9MT0NLRUQgPSAibG9ja2VkIjsKLQotICAgIC8vIFdoZXRoZXIgdG8gYWN0aXZhdGUgYSBkZXBsb3llZCBzZXJ2aWNlLgotICAgIFN0cmluZyBBVFRSSUJVVEVfQUNUSVZBVEUgPSAiYWN0aXZhdGUiOwotCi0gICAgU3RyaW5nIFBST1BFUlRZX1RFTVBfRElSID0gImphdmEuaW8udG1wZGlyIjsKLSAgICBTdHJpbmcgRElSRUNUT1JZX0NPTkYgPSAiY29uZiI7Ci0gICAgU3RyaW5nIERJUkVDVE9SWV9BWElTMl9IT01FID0gIi5heGlzMiI7Ci0gICAgU3RyaW5nIFJFU09VUkNFX01PRFVMRVMgPSAibW9kdWxlcy8iOwotICAgIFN0cmluZyBTVUZGSVhfTUFSID0gIi5tYXIiOwotICAgIFN0cmluZyBTVUZGSVhfSkFSID0gIi5qYXIiOwotICAgIFN0cmluZyBTVUZGSVhfV1NETCA9ICIud3NkbCI7Ci0gICAgLyoqCi0gICAgICogUmVzb3VyY2UgdGhhdCBjb250YWlucyB0aGUgY29uZmlndXJhdGlvbi4KLSAgICAgKi8KLSAgICBTdHJpbmcgQVhJUzJfQ09ORklHVVJBVElPTl9SRVNPVVJDRSA9Ci0gICAgICAgICAgICAib3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L2F4aXMyX2RlZmF1bHQueG1sIjsKLSAgICBTdHJpbmcgQVhJUzJfUkVQTyA9ICJyZXBvc2l0b3J5IjsKLSAgICBTdHJpbmcgQVhJUzJfQ09ORklHVVJBVElPTl9YTUwgPSAiYXhpczIueG1sIjsKLSAgICBTdHJpbmcgQk9PTEVBTl9UUlVFID0gInRydWUiOwotICAgIFN0cmluZyBCT09MRUFOX0ZBTFNFID0gImZhbHNlIjsKLSAgICBjaGFyIFNFUEFSQVRPUl9ET1QgPSAnLic7Ci0gICAgY2hhciBTRVBBUkFUT1JfQ09MT04gPSAnOic7Ci0KLSAgICBTdHJpbmcgUE9MSUNZX05TX1VSSSA9IENvbnN0YW50cy5VUklfUE9MSUNZOwotICAgIFN0cmluZyBUQUdfUE9MSUNZID0gIlBvbGljeSI7Ci0gICAgU3RyaW5nIFRBR19QT0xJQ1lfUkVGID0gIlBvbGljeVJlZmVyZW5jZSI7Ci0gICAgCi0gICAgU3RyaW5nIFRBR19QT0xJQ1lfQVRUQUNITUVOVCA9ICJQb2xpY3lBdHRhY2htZW50IjsKLSAgICBTdHJpbmcgVEFHX0FQUExJRVNfVE8gPSAiQXBwbGllc1RvIjsKLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L0RlcGxveW1lbnRFbmdpbmUuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L0RlcGxveW1lbnRFbmdpbmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGVhOTNjNC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9EZXBsb3ltZW50RW5naW5lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjE1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsYXNzbG9hZGVyLkphckZpbGVDbGFzc0xvYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LlNlcnZpY2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC5yZXBvc2l0b3J5LnV0aWwuQXJjaGl2ZVJlYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQucmVwb3NpdG9yeS51dGlsLkRlcGxveW1lbnRGaWxlRGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQucmVwb3NpdG9yeS51dGlsLldTSW5mbzsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQucmVzb2x2ZXIuQUFSQmFzZWRXU0RMTG9jYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQucmVzb2x2ZXIuQUFSRmlsZUJhc2VkVVJJUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LnNjaGVkdWxlci5EZXBsb3ltZW50SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LnNjaGVkdWxlci5TY2hlZHVsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LnNjaGVkdWxlci5TY2hlZHVsZXJUYXNrOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC51dGlsLlV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc01vZHVsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlR3JvdXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5GbG93OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uV1NETDExVG9BeGlzU2VydmljZUJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5XU0RMMkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5NZXNzYWdlUmVjZWl2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pMThuLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5KYXZhVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIERlcGxveW1lbnRFbmdpbmUgaW1wbGVtZW50cyBEZXBsb3ltZW50Q29uc3RhbnRzIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coRGVwbG95bWVudEVuZ2luZS5jbGFzcyk7Ci0KLSAgICAvL3RvIGtlZXAgdGhlIHdlYiByZXNvdXJjZSBsb2NhdGlvbiBpZiBhbnkKLSAgICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyB3ZWJMb2NhdGlvblN0cmluZyA9IG51bGw7Ci0gICAgcHJvdGVjdGVkIFNjaGVkdWxlciBzY2hlZHVsZXI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0V2ViTG9jYXRpb25TdHJpbmcoU3RyaW5nIHdlYkxvY2F0aW9uU3RyaW5nKSB7Ci0gICAgICAgIERlcGxveW1lbnRFbmdpbmUud2ViTG9jYXRpb25TdHJpbmcgPSB3ZWJMb2NhdGlvblN0cmluZzsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFN1cHBvcnQgZm9yIGhvdCB1cGRhdGUgaXMgY29udHJvbGxlZCBieSB0aGlzIGZsYWcKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBob3RVcGRhdGUgPSB0cnVlOwotCi0gICAgLyoqCi0gICAgICogU3VwcG9ydCBmb3IgaG90IGRlcGxveW1lbnQgaXMgY29udHJvbGxlZCBieSB0aGlzIGZsYWcKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBob3REZXBsb3ltZW50ID0gdHJ1ZTsKLQotICAgIC8qKgotICAgICAqIFN0b3JlcyBhbGwgdGhlIHdlYiBTZXJ2aWNlcyB0byBkZXBsb3kuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIExpc3Qgd3NUb0RlcGxveSA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgIC8qKgotICAgICAqIFN0b3JlcyBhbGwgdGhlIHdlYiBTZXJ2aWNlcyB0byB1bmRlcGxveS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTGlzdCB3c1RvVW5EZXBsb3kgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAvKioKLSAgICAgKiB0byBrZWVwIGEgcmVmIHRvIGVuZ2luZSByZWdpc3RlcgotICAgICAqIHRoaXMgcmVmIHdpbGwgcGFzcyB0byBlbmdpbmUgd2hlbiBpdCBjYWxsIHN0YXJ0KCkKLSAgICAgKiBtZXRob2QKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZzsKLQotICAgIHByb3RlY3RlZCBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0OwotCi0gICAgcHJvdGVjdGVkIFJlcG9zaXRvcnlMaXN0ZW5lciByZXBvTGlzdGVuZXI7Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHNlcnZpY2VzUGF0aCA9IG51bGw7Ci0gICAgcHJvdGVjdGVkIEZpbGUgc2VydmljZXNEaXIgPSBudWxsOwotICAgIHByb3RlY3RlZCBTdHJpbmcgbW9kdWxlc1BhdGggPSBudWxsOwotICAgIHByb3RlY3RlZCBGaWxlIG1vZHVsZXNEaXIgPSBudWxsOwotICAgIHByaXZhdGUgRmlsZSByZXBvc2l0b3J5RGlyID0gbnVsbDsKLQotICAgIC8vdG8gZGVwbG95IHNlcnZpY2UgKGJvdGggYWFyIGFuZCBleHBhbmRlZCkKLSAgICBwcm90ZWN0ZWQgU2VydmljZURlcGxveWVyIHNlcnZpY2VEZXBsb3llcjsKLSAgICAvL1RvIGRlcGxveSBtb2R1bGVzIChib3RoIG1hciBhbmQgZXhwYW5kZWQpCi0gICAgcHJvdGVjdGVkIE1vZHVsZURlcGxveWVyIG1vZHVsZURlcGxveWVyOwotCi0gICAgLy90byBrZWVwIG1hcCBvZiB3aGljaCBkZXBsb3llciBjYW4gcHJvY2VzcyB3aGljaCBmaWxlIGV4dGVuc2lvbiAsCi0gICAgLy8gZm9yIGV4YW1wbGUgU2VydmljZURlcGxveWVyIHdpbGwgcHJvY2VzcyAuYWFyIGZpbGUKLSAgICBwcml2YXRlIEhhc2hNYXAgZXh0ZW5zaW9uVG9EZXBsb3llck1hcHBpbmdNYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgIAotICAgIHByaXZhdGUgTWFwPFN0cmluZywgTWFwPFN0cmluZywgRGVwbG95ZXI+PiBkZXBsb3llck1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgTWFwPFN0cmluZywgRGVwbG95ZXI+PigpOwotCi0gICAgcHVibGljIHZvaWQgbG9hZFNlcnZpY2VzKCkgewotICAgICAgICByZXBvTGlzdGVuZXIuY2hlY2tTZXJ2aWNlcygpOwotICAgICAgICBpZiAoaG90RGVwbG95bWVudCkgewotICAgICAgICAgICAgc3RhcnRTZWFyY2gocmVwb0xpc3RlbmVyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGxvYWRSZXBvc2l0b3J5KFN0cmluZyByZXBvRGlyKSB0aHJvd3MgRGVwbG95bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIEZpbGUgYXhpc1JlcG8gPSBuZXcgRmlsZShyZXBvRGlyKTsKLSAgICAgICAgaWYgKCFheGlzUmVwby5leGlzdHMoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoImNhbm5vdGZpbmRyZXBvIiwgcmVwb0RpcikpOwotICAgICAgICB9Ci0gICAgICAgIHNldERlcGxveW1lbnRGZWF0dXJlcygpOwotICAgICAgICBwcmVwYXJlUmVwb3NpdG9yeShyZXBvRGlyKTsKLSAgICAgICAgLy8gc2V0dGluZyB0aGUgQ0xzCi0gICAgICAgIHNldENsYXNzTG9hZGVycyhyZXBvRGlyKTsKLSAgICAgICAgcmVwb0xpc3RlbmVyID0gbmV3IFJlcG9zaXRvcnlMaXN0ZW5lcih0aGlzLCBmYWxzZSk7Ci0gICAgICAgIG9yZy5hcGFjaGUuYXhpczIudXRpbC5VdGlscwotICAgICAgICAgICAgICAgIC5jYWxjdWxhdGVEZWZhdWx0TW9kdWxlVmVyc2lvbihheGlzQ29uZmlnLmdldE1vZHVsZXMoKSwgYXhpc0NvbmZpZyk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGF4aXNDb25maWcuc2V0UmVwb3NpdG9yeShheGlzUmVwby50b1VSTCgpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmluZm8oZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXhpc0NvbmZpZy52YWxpZGF0ZVN5c3RlbVByZWRlZmluZWRQaGFzZXMoKTsKLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGF4aXNGYXVsdCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oYXhpc0ZhdWx0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGxvYWRGcm9tQ2xhc3NQYXRoKCkgdGhyb3dzIERlcGxveW1lbnRFeGNlcHRpb24gewotICAgICAgICAvL2xvYWRpbmcgbW9kdWxlcyBmcm9tIHRoZSBjbGFzc3BhdGgKLSAgICAgICAgbmV3IFJlcG9zaXRvcnlMaXN0ZW5lcih0aGlzLCB0cnVlKTsKLSAgICAgICAgb3JnLmFwYWNoZS5heGlzMi51dGlsLlV0aWxzLmNhbGN1bGF0ZURlZmF1bHRNb2R1bGVWZXJzaW9uKAotICAgICAgICAgICAgICAgIGF4aXNDb25maWcuZ2V0TW9kdWxlcygpLCBheGlzQ29uZmlnKTsKLSAgICAgICAgYXhpc0NvbmZpZy52YWxpZGF0ZVN5c3RlbVByZWRlZmluZWRQaGFzZXMoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGVuZ2FnZU1vZHVsZXMoKTsKLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGF4aXNGYXVsdCkgewotICAgICAgICAgICAgbG9nLmluZm8oTWVzc2FnZXMuZ2V0TWVzc2FnZShEZXBsb3ltZW50RXJyb3JNc2dzLk1PRFVMRV9WQUxJREFUSU9OX0ZBSUxFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpc0ZhdWx0LmdldE1lc3NhZ2UoKSkpOwotICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oYXhpc0ZhdWx0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBsb2FkQ3VzdG9tU2VydmljZXMoVVJMIHJlcG9VUkwpewotICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIE1hcDxTdHJpbmcsIERlcGxveWVyPj4gZW50cnkgOiBnZXREZXBsb3llcnMoKS5lbnRyeVNldCgpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgZGlyZWN0b3J5ID0gZW50cnkuZ2V0S2V5KCk7Ci0gICAgICAgICAgICBNYXA8U3RyaW5nLCBEZXBsb3llcj4gZXh0ZW5zaW9uTWFwID0gZW50cnkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGxpc3ROYW1lOwotICAgICAgICAgICAgICAgIGlmICghZGlyZWN0b3J5LmVuZHNXaXRoKCIvIikpIHsKLSAgICAgICAgICAgICAgICAgICAgbGlzdE5hbWUgPSBkaXJlY3RvcnkgKyAiLmxpc3QiOwotICAgICAgICAgICAgICAgICAgICBkaXJlY3RvcnkgKz0gIi8iOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGxpc3ROYW1lID0gZGlyZWN0b3J5LnJlcGxhY2VBbGwoIi8iLCIiKSArICIubGlzdCI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFN0cmluZyByZXBvUGF0aCA9IHJlcG9VUkwuZ2V0UGF0aCgpOwotICAgICAgICAgICAgICAgIGlmICghcmVwb1BhdGguZW5kc1dpdGgoIi8iKSkgewotICAgICAgICAgICAgICAgICAgICByZXBvUGF0aCArPSAiLyI7Ci0gICAgICAgICAgICAgICAgICAgIHJlcG9VUkwgPSBuZXcgVVJMKHJlcG9VUkwuZ2V0UHJvdG9jb2woKSArICI6Ly8iICsgcmVwb1BhdGgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIFVSTCBzZXJ2aWNlc0RpciA9IG5ldyBVUkwocmVwb1VSTCwgZGlyZWN0b3J5KTsKLSAgICAgICAgICAgICAgICBVUkwgZmlsZWxpc3R1cmwgPSBuZXcgVVJMKHNlcnZpY2VzRGlyLCBsaXN0TmFtZSk7Ci0gICAgICAgICAgICAgICAgQXJyYXlMaXN0IGZpbGVzID0gZ2V0RmlsZUxpc3QoZmlsZWxpc3R1cmwpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZpbGVOYW1lID0gKFN0cmluZykgZmlsZXMuZ2V0KGkpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZXh0ZW5zaW9uID0gZ2V0RXh0ZW5zaW9uKGZpbGVOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgRGVwbG95ZXIgZGVwbG95ZXIgPSBleHRlbnNpb25NYXAuZ2V0KGV4dGVuc2lvbik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkZXBsb3llciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBVUkwgc2VydmljZXNVUkwgPSBuZXcgVVJMKHNlcnZpY2VzRGlyLCBmaWxlTmFtZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gV2UgYXJlIGNhbGxpbmcgcmVmbGVjdGlvbiBjb2RlIGhlcmUgLCB0byBhdm9pZCBjaGFuZ2VzIHRvIHRoZSBpbnRlcmZhY2UKLSAgICAgICAgICAgICAgICAgICAgQ2xhc3MgY2xhc3NUb0xvYWQgPSBkZXBsb3llci5nZXRDbGFzcygpOwotICAgICAgICAgICAgICAgICAgICAvLyBXZSBjYW4gbm90IGNhbGwgY2xhc3NUb0xvYWQuZ2V0RGVjbGFyZWRNZXRoZWQoKSAsIHNpbmNlIHRoZXJlCi0gICAgICAgICAgICAgICAgICAgIC8vICBjYW4gYmUgaW5zYXRuY2Ugd2hlcmUgbXV0aXBsZSBzZXJ2aWNlcyBleHRlbmRzIHVzaW5nIG9uZSBjbGFzcwotICAgICAgICAgICAgICAgICAgICAvLyBqdXN0IGZvciBpbml0IGFuZCBvdGhlciByZWZsZWN0aW9uIG1ldGhvZHMKLSAgICAgICAgICAgICAgICAgICAgTWV0aG9kIG1ldGhvZCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QgPSBjbGFzc1RvTG9hZC5nZXRNZXRob2QoImRlcGxveUZyb21VUkwiLCBuZXcgQ2xhc3NbXXtVUkwuY2xhc3N9KTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vV2UgZG8gbm90IG5lZWQgdG8gaW5mb3JtIHRoaXMgdG8gdXNlciAsIHNpbmNlIHRoaXMgc29tZXRoaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBBeGlzMiBpcyBjaGVja2luZyB0byBzdXBwb3J0IFNlc3Npb24uIFNvIGlmIHRoZSBtZXRob2QgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdCB0aGVyZSB3ZSBzaG91bGQgaWdub3JlIHRoYXQKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAobWV0aG9kICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kLmludm9rZShkZXBsb3llciwgbmV3IE9iamVjdFtde3NlcnZpY2VzVVJMfSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJFeGNlcHRpb24gdHJ5aW5nIHRvIGNhbGwgIiArICJkZXBsb3lGcm9tVVJMIGZvciB0aGUgZGVwbG95ZXIiICsgZGVwbG95ZXIuZ2V0Q2xhc3MoKSAsIGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vSSBhbSBqdXN0IGlnbm9yaW5nIHRoZSBlcnJvciBhdCB0aGUgbW9tZW50ICwgYnV0IG5lZWQgdG8gdGhpbmsgaG93IHRvIGhhbmRsZSB0aGlzCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldEV4dGVuc2lvbihTdHJpbmcgZmlsZU5hbWUpewotICAgICAgICBpbnQgbGFzdEluZGV4ID0gZmlsZU5hbWUubGFzdEluZGV4T2YoIi4iKTsKLSAgICAgICAgcmV0dXJuIGZpbGVOYW1lLnN1YnN0cmluZyhsYXN0SW5kZXggKzEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGxvYWRTZXJ2aWNlc0Zyb21VcmwoVVJMIHJlcG9VUkwpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFN0cmluZyBwYXRoID0gc2VydmljZXNQYXRoID09IG51bGwgPyBEZXBsb3ltZW50Q29uc3RhbnRzLlNFUlZJQ0VfUEFUSCA6IHNlcnZpY2VzUGF0aDsKLSAgICAgICAgICAgIGlmICghcGF0aC5lbmRzV2l0aCgiLyIpKSB7Ci0gICAgICAgICAgICAgICAgcGF0aCArPSAiLyI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTdHJpbmcgcmVwb1BhdGggPSByZXBvVVJMLmdldFBhdGgoKTsKLSAgICAgICAgICAgIGlmICghcmVwb1BhdGguZW5kc1dpdGgoIi8iKSkgewotICAgICAgICAgICAgICAgIHJlcG9QYXRoICs9ICIvIjsKLSAgICAgICAgICAgICAgICByZXBvVVJMID0gbmV3IFVSTChyZXBvVVJMLmdldFByb3RvY29sKCkgKyAiOi8vIiArIHJlcG9QYXRoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFVSTCBzZXJ2aWNlc0RpciA9IG5ldyBVUkwocmVwb1VSTCwgcGF0aCk7Ci0gICAgICAgICAgICBVUkwgZmlsZWxpc3R1cmwgPSBuZXcgVVJMKHNlcnZpY2VzRGlyLCAic2VydmljZXMubGlzdCIpOwotICAgICAgICAgICAgQXJyYXlMaXN0IGZpbGVzID0gZ2V0RmlsZUxpc3QoZmlsZWxpc3R1cmwpOwotCi0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGZpbGVJdGVyYXRvciA9IGZpbGVzLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgIGZpbGVJdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGZpbGVVcmwgPSAoU3RyaW5nKSBmaWxlSXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgIGlmIChmaWxlVXJsLmVuZHNXaXRoKCIuYWFyIikpIHsKLSAgICAgICAgICAgICAgICAgICAgQXhpc1NlcnZpY2VHcm91cCBzZXJ2aWNlR3JvdXAgPSBuZXcgQXhpc1NlcnZpY2VHcm91cCgpOwotICAgICAgICAgICAgICAgICAgICBVUkwgc2VydmljZXNVUkwgPSBuZXcgVVJMKHNlcnZpY2VzRGlyLCBmaWxlVXJsKTsKLSAgICAgICAgICAgICAgICAgICAgQXJyYXlMaXN0IHNlcnZpY2VsaXN0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3B1bGF0ZVNlcnZpY2Uoc2VydmljZUdyb3VwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlc1VSTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVVybC5zdWJzdHJpbmcoMCwgZmlsZVVybC5pbmRleE9mKCIuYWFyIikpKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkU2VydmljZUdyb3VwKHNlcnZpY2VHcm91cCwgc2VydmljZWxpc3QsIHNlcnZpY2VzVVJMLCBudWxsLCBheGlzQ29uZmlnKTsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmluZm8oTWVzc2FnZXMuZ2V0TWVzc2FnZShEZXBsb3ltZW50RXJyb3JNc2dzLkRFUExPWUlOR19XUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlR3JvdXAuZ2V0U2VydmljZUdyb3VwTmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VzVVJMLnRvU3RyaW5nKCkpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvL0xvYWRpbmcgb3RoZXIgdHlwZSBvZiBzZXJ2aWNlcyBzdWNoIGFzIGN1c3RvbSBkZXBsb3llcnMKLSAgICAgICAgICAgIGxvYWRDdXN0b21TZXJ2aWNlcyhyZXBvVVJMKTsKLSAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGxvZy5lcnJvcihlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGxvZy5lcnJvcihlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBsb2FkUmVwb3NpdG9yeUZyb21VUkwoVVJMIHJlcG9VUkwpIHRocm93cyBEZXBsb3ltZW50RXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFN0cmluZyBwYXRoID0gbW9kdWxlc1BhdGggPT0gbnVsbCA/IERlcGxveW1lbnRDb25zdGFudHMuTU9EVUxFX1BBVEggOiBtb2R1bGVzUGF0aDsKLSAgICAgICAgICAgIGlmICghcGF0aC5lbmRzV2l0aCgiLyIpKSB7Ci0gICAgICAgICAgICAgICAgcGF0aCA9IHBhdGggKyAiLyI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTdHJpbmcgcmVwb1BhdGggPSByZXBvVVJMLmdldFBhdGgoKTsKLSAgICAgICAgICAgIGlmICghcmVwb1BhdGguZW5kc1dpdGgoIi8iKSkgewotICAgICAgICAgICAgICAgIHJlcG9QYXRoICs9ICIvIjsKLSAgICAgICAgICAgICAgICByZXBvVVJMID0gbmV3IFVSTChyZXBvVVJMLmdldFByb3RvY29sKCkgKyAiOi8vIiArIHJlcG9QYXRoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFVSTCBtb2R1bGVEaXIgPSBuZXcgVVJMKHJlcG9VUkwsIHBhdGgpOwotICAgICAgICAgICAgVVJMIGZpbGVsaXN0dXJsID0gbmV3IFVSTChtb2R1bGVEaXIsICJtb2R1bGVzLmxpc3QiKTsKLSAgICAgICAgICAgIEFycmF5TGlzdCBmaWxlcyA9IGdldEZpbGVMaXN0KGZpbGVsaXN0dXJsKTsKLSAgICAgICAgICAgIEl0ZXJhdG9yIGZpbGVJdGVyYXRvciA9IGZpbGVzLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB3aGlsZSAoZmlsZUl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBmaWxlVXJsID0gKFN0cmluZykgZmlsZUl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgICAgICBpZiAoZmlsZVVybC5lbmRzV2l0aCgiLm1hciIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFVSTCBtb2R1bGV1cmwgPSBuZXcgVVJMKG1vZHVsZURpciwgZmlsZVVybCk7Ci0gICAgICAgICAgICAgICAgICAgIENsYXNzTG9hZGVyIGRlcGxveW1lbnRDbGFzc0xvYWRlciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVXRpbHMuY3JlYXRlQ2xhc3NMb2FkZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVVJMW117bW9kdWxldXJsfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNDb25maWcuZ2V0TW9kdWxlQ2xhc3NMb2FkZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRmlsZSkgYXhpc0NvbmZpZy5nZXRQYXJhbWV0ZXJWYWx1ZShDb25zdGFudHMuQ29uZmlndXJhdGlvbi5BUlRJRkFDVFNfVEVNUF9ESVIpKTsKLSAgICAgICAgICAgICAgICAgICAgQXhpc01vZHVsZSBtb2R1bGUgPSBuZXcgQXhpc01vZHVsZSgpOwotICAgICAgICAgICAgICAgICAgICBtb2R1bGUuc2V0TW9kdWxlQ2xhc3NMb2FkZXIoZGVwbG95bWVudENsYXNzTG9hZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgbW9kdWxlLnNldFBhcmVudChheGlzQ29uZmlnKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1vZHVsZUZpbGUgPSBmaWxlVXJsLnN1YnN0cmluZygwLCBmaWxlVXJsLmluZGV4T2YoIi5tYXIiKSk7Ci0gICAgICAgICAgICAgICAgICAgIG1vZHVsZS5zZXRBcmNoaXZlTmFtZShtb2R1bGVGaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgcG9wdWxhdGVNb2R1bGUobW9kdWxlLCBtb2R1bGV1cmwpOwotICAgICAgICAgICAgICAgICAgICBtb2R1bGUuc2V0RmlsZU5hbWUobW9kdWxldXJsKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkTmV3TW9kdWxlKG1vZHVsZSwgYXhpc0NvbmZpZyk7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5pbmZvKE1lc3NhZ2VzLmdldE1lc3NhZ2UoRGVwbG95bWVudEVycm9yTXNncy5ERVBMT1lJTkdfTU9EVUxFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZS5nZXRBcmNoaXZlTmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZXVybC50b1N0cmluZygpKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi51dGlsLlV0aWxzLgotICAgICAgICAgICAgICAgICAgICBjYWxjdWxhdGVEZWZhdWx0TW9kdWxlVmVyc2lvbihheGlzQ29uZmlnLmdldE1vZHVsZXMoKSwgYXhpc0NvbmZpZyk7Ci0gICAgICAgICAgICBheGlzQ29uZmlnLnZhbGlkYXRlU3lzdGVtUHJlZGVmaW5lZFBoYXNlcygpOwotICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHBvcHVsYXRlTW9kdWxlKEF4aXNNb2R1bGUgbW9kdWxlLCBVUkwgbW9kdWxlVXJsKSB0aHJvd3MgRGVwbG95bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBDbGFzc0xvYWRlciBjbGFzc0xvYWRlciA9IG1vZHVsZS5nZXRNb2R1bGVDbGFzc0xvYWRlcigpOwotICAgICAgICAgICAgSW5wdXRTdHJlYW0gbW9kdWxlU3RyZWFtID0gY2xhc3NMb2FkZXIuZ2V0UmVzb3VyY2VBc1N0cmVhbSgiTUVUQS1JTkYvbW9kdWxlLnhtbCIpOwotICAgICAgICAgICAgaWYgKG1vZHVsZVN0cmVhbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbW9kdWxlU3RyZWFtID0gY2xhc3NMb2FkZXIuZ2V0UmVzb3VyY2VBc1N0cmVhbSgibWV0YS1pbmYvbW9kdWxlLnhtbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1vZHVsZVN0cmVhbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRNZXNzYWdlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXBsb3ltZW50RXJyb3JNc2dzLk1PRFVMRV9YTUxfTUlTU0lORywgbW9kdWxlVXJsLnRvU3RyaW5nKCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE1vZHVsZUJ1aWxkZXIgbW9kdWxlQnVpbGRlciA9IG5ldyBNb2R1bGVCdWlsZGVyKG1vZHVsZVN0cmVhbSwgbW9kdWxlLCBheGlzQ29uZmlnKTsKLSAgICAgICAgICAgIG1vZHVsZUJ1aWxkZXIucG9wdWxhdGVNb2R1bGUoKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgQXJyYXlMaXN0IHBvcHVsYXRlU2VydmljZShBeGlzU2VydmljZUdyb3VwIHNlcnZpY2VHcm91cCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkwgc2VydmljZXNVUkwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNlcnZpY2VOYW1lKSB0aHJvd3MgRGVwbG95bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzZXJ2aWNlR3JvdXAuc2V0U2VydmljZUdyb3VwTmFtZShzZXJ2aWNlTmFtZSk7Ci0gICAgICAgICAgICBDbGFzc0xvYWRlciBzZXJ2aWNlQ2xhc3NMb2FkZXIgPSBVdGlscy5jcmVhdGVDbGFzc0xvYWRlcigKLSAgICAgICAgICAgICAgICAgICAgbmV3IFVSTFtde3NlcnZpY2VzVVJMfSwKLSAgICAgICAgICAgICAgICAgICAgYXhpc0NvbmZpZy5nZXRTZXJ2aWNlQ2xhc3NMb2FkZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgKEZpbGUpIGF4aXNDb25maWcuZ2V0UGFyYW1ldGVyVmFsdWUoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uQVJUSUZBQ1RTX1RFTVBfRElSKSk7Ci0gICAgICAgICAgICBTdHJpbmcgbWV0YWluZiA9ICJtZXRhLWluZiI7Ci0gICAgICAgICAgICBzZXJ2aWNlR3JvdXAuc2V0U2VydmljZUdyb3VwQ2xhc3NMb2FkZXIoc2VydmljZUNsYXNzTG9hZGVyKTsKLSAgICAgICAgICAgIC8vcHJvY2Vzc2luZyB3c2RsLmxpc3QKLSAgICAgICAgICAgIElucHV0U3RyZWFtIHdzZGxmaWxlc1N0cmVhbSA9Ci0gICAgICAgICAgICAgICAgICAgIHNlcnZpY2VDbGFzc0xvYWRlci5nZXRSZXNvdXJjZUFzU3RyZWFtKCJtZXRhLWluZi93c2RsLmxpc3QiKTsKLSAgICAgICAgICAgIGlmICh3c2RsZmlsZXNTdHJlYW0gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHdzZGxmaWxlc1N0cmVhbSA9IHNlcnZpY2VDbGFzc0xvYWRlci5nZXRSZXNvdXJjZUFzU3RyZWFtKCJNRVRBLUlORi93c2RsLmxpc3QiKTsKLSAgICAgICAgICAgICAgICBpZiAod3NkbGZpbGVzU3RyZWFtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbWV0YWluZiA9ICJNRVRBLUlORiI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgSGFzaE1hcCBzZXJ2aWNlc01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgICAgICBpZiAod3NkbGZpbGVzU3RyZWFtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBBcmNoaXZlUmVhZGVyIHJlYWRlciA9IG5ldyBBcmNoaXZlUmVhZGVyKCk7Ci0gICAgICAgICAgICAgICAgQnVmZmVyZWRSZWFkZXIgaW5wdXQgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKHdzZGxmaWxlc1N0cmVhbSkpOwotICAgICAgICAgICAgICAgIFN0cmluZyBsaW5lOwotICAgICAgICAgICAgICAgIHdoaWxlICgobGluZSA9IGlucHV0LnJlYWRMaW5lKCkpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbGluZSA9IGxpbmUudHJpbSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobGluZS5sZW5ndGgoKSA+IDAgJiYgbGluZS5jaGFyQXQoMCkhPScjJykgewotICAgICAgICAgICAgICAgICAgICAgICAgbGluZSA9IG1ldGFpbmYgKyAiLyIgKyBsaW5lOwotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0IHNlcnZpY2VzID0gcmVhZGVyLmdldEF4aXNTZXJ2aWNlRnJvbVdzZGwoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlQ2xhc3NMb2FkZXIuZ2V0UmVzb3VyY2VBc1N0cmVhbShsaW5lKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VDbGFzc0xvYWRlciwgbGluZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlcnZpY2VzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXJ2aWNlcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UgPSAoQXhpc1NlcnZpY2UpIHNlcnZpY2VzLmdldChpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VzTWFwLnB1dChheGlzU2VydmljZS5nZXROYW1lKCksIGF4aXNTZXJ2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIElucHV0U3RyZWFtIHNlcnZpY2V4bWxTdHJlYW0gPQotICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlQ2xhc3NMb2FkZXIuZ2V0UmVzb3VyY2VBc1N0cmVhbSgiTUVUQS1JTkYvc2VydmljZXMueG1sIik7Ci0gICAgICAgICAgICBpZiAoc2VydmljZXhtbFN0cmVhbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc2VydmljZXhtbFN0cmVhbSA9IHNlcnZpY2VDbGFzc0xvYWRlci5nZXRSZXNvdXJjZUFzU3RyZWFtKCJtZXRhLWluZi9zZXJ2aWNlcy54bWwiKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbWV0YWluZiA9ICJNRVRBLUlORiI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc2VydmljZXhtbFN0cmVhbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRNZXNzYWdlKERlcGxveW1lbnRFcnJvck1zZ3MuU0VSVklDRV9YTUxfTk9UX0ZPVU5ELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlc1VSTC50b1N0cmluZygpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBEZXNjcmlwdGlvbkJ1aWxkZXIoc2VydmljZXhtbFN0cmVhbSwgY29uZmlnQ29udGV4dCk7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgcm9vdEVsZW1lbnQgPSBidWlsZGVyLmJ1aWxkT00oKTsKLSAgICAgICAgICAgIFN0cmluZyBlbGVtZW50TmFtZSA9IHJvb3RFbGVtZW50LmdldExvY2FsTmFtZSgpOwotCi0gICAgICAgICAgICBpZiAoVEFHX1NFUlZJQ0UuZXF1YWxzKGVsZW1lbnROYW1lKSkgewotICAgICAgICAgICAgICAgIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlID0gbnVsbDsKLSAgICAgICAgICAgICAgICBTdHJpbmcgd3NkbExvY2F0aW9uID0gICJNRVRBLUlORi9zZXJ2aWNlLndzZGwiOwotICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIHdzZGxTdHJlYW0gPQotICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZUNsYXNzTG9hZGVyLmdldFJlc291cmNlQXNTdHJlYW0od3NkbExvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICBVUkwgd3NkbFVSTCA9IHNlcnZpY2VDbGFzc0xvYWRlci5nZXRSZXNvdXJjZShtZXRhaW5mICsgIi9zZXJ2aWNlLndzZGwiKTsKLSAgICAgICAgICAgICAgICBpZiAod3NkbFN0cmVhbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHdzZGxMb2NhdGlvbiA9ICAiTUVUQS1JTkYvIiArIHNlcnZpY2VOYW1lICsgIi53c2RsIjsKLSAgICAgICAgICAgICAgICAgICAgd3NkbFN0cmVhbSA9IHNlcnZpY2VDbGFzc0xvYWRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRSZXNvdXJjZUFzU3RyZWFtKHdzZGxMb2NhdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIHdzZGxVUkwgPSBzZXJ2aWNlQ2xhc3NMb2FkZXIuZ2V0UmVzb3VyY2Uod3NkbExvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHdzZGxTdHJlYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBXU0RMMTFUb0F4aXNTZXJ2aWNlQnVpbGRlciB3c2RsMkF4aXNTZXJ2aWNlQnVpbGRlciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFdTREwxMVRvQXhpc1NlcnZpY2VCdWlsZGVyKHdzZGxTdHJlYW0sIG51bGwsIG51bGwpOwotICAgICAgICAgICAgICAgICAgICBGaWxlIGZpbGUgPSBVdGlscy50b0ZpbGUoc2VydmljZXNVUkwpOwotICAgICAgICAgICAgICAgICAgICBpZihmaWxlICE9IG51bGwgJiYgZmlsZS5leGlzdHMoKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3c2RsMkF4aXNTZXJ2aWNlQnVpbGRlci5zZXRDdXN0b21XU0xENEpSZXNvbHZlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBQVJCYXNlZFdTRExMb2NhdG9yKHdzZGxMb2NhdGlvbiwgZmlsZSwgd3NkbFN0cmVhbSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgd3NkbDJBeGlzU2VydmljZUJ1aWxkZXIuc2V0Q3VzdG9tUmVzb2x2ZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBQVJGaWxlQmFzZWRVUklSZXNvbHZlcihmaWxlKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHdzZGxVUkwgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgd3NkbDJBeGlzU2VydmljZUJ1aWxkZXIuc2V0RG9jdW1lbnRCYXNlVXJpKHdzZGxVUkwudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYXhpc1NlcnZpY2UgPSB3c2RsMkF4aXNTZXJ2aWNlQnVpbGRlci5wb3B1bGF0ZVNlcnZpY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgYXhpc1NlcnZpY2Uuc2V0V3NkbEZvdW5kKHRydWUpOwotICAgICAgICAgICAgICAgICAgICBheGlzU2VydmljZS5zZXRDdXN0b21Xc2RsKHRydWUpOwotICAgICAgICAgICAgICAgICAgICBheGlzU2VydmljZS5zZXROYW1lKHNlcnZpY2VOYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGF4aXNTZXJ2aWNlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYXhpc1NlcnZpY2UgPSBuZXcgQXhpc1NlcnZpY2Uoc2VydmljZU5hbWUpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlLnNldFBhcmVudChzZXJ2aWNlR3JvdXApOwotICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlLnNldENsYXNzTG9hZGVyKHNlcnZpY2VDbGFzc0xvYWRlcik7Ci0KLSAgICAgICAgICAgICAgICBTZXJ2aWNlQnVpbGRlciBzZXJ2aWNlQnVpbGRlciA9IG5ldyBTZXJ2aWNlQnVpbGRlcihjb25maWdDb250ZXh0LCBheGlzU2VydmljZSk7Ci0gICAgICAgICAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSA9IHNlcnZpY2VCdWlsZGVyLnBvcHVsYXRlU2VydmljZShyb290RWxlbWVudCk7Ci0KLSAgICAgICAgICAgICAgICBBcnJheUxpc3Qgc2VydmljZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgc2VydmljZUxpc3QuYWRkKHNlcnZpY2UpOwotICAgICAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlTGlzdDsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoVEFHX1NFUlZJQ0VfR1JPVVAuZXF1YWxzKGVsZW1lbnROYW1lKSkgewotICAgICAgICAgICAgICAgIFNlcnZpY2VHcm91cEJ1aWxkZXIgZ3JvdXBCdWlsZGVyID0gbmV3IFNlcnZpY2VHcm91cEJ1aWxkZXIocm9vdEVsZW1lbnQsIHNlcnZpY2VzTWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnQ29udGV4dCk7Ci0gICAgICAgICAgICAgICAgQXJyYXlMaXN0IHNlcnZpY0xpc3QgPSBncm91cEJ1aWxkZXIucG9wdWxhdGVTZXJ2aWNlR3JvdXAoc2VydmljZUdyb3VwKTsKLSAgICAgICAgICAgICAgICBJdGVyYXRvciBzZXJ2aWNlSXRlcmF0b3IgPSBzZXJ2aWNMaXN0Lml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKHNlcnZpY2VJdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UgPSAoQXhpc1NlcnZpY2UpIHNlcnZpY2VJdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyB3c2RsTG9jYXRpb24gPSAgIk1FVEEtSU5GL3NlcnZpY2Uud3NkbCI7Ci0gICAgICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIHdzZGxTdHJlYW0gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VDbGFzc0xvYWRlci5nZXRSZXNvdXJjZUFzU3RyZWFtKHdzZGxMb2NhdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIFVSTCB3c2RsVVJMID0gc2VydmljZUNsYXNzTG9hZGVyLmdldFJlc291cmNlKHdzZGxMb2NhdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh3c2RsU3RyZWFtID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdzZGxMb2NhdGlvbiA9ICAiTUVUQS1JTkYvIiArIHNlcnZpY2VOYW1lICsgIi53c2RsIjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdzZGxTdHJlYW0gPSBzZXJ2aWNlQ2xhc3NMb2FkZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFJlc291cmNlQXNTdHJlYW0od3NkbExvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdzZGxVUkwgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlQ2xhc3NMb2FkZXIuZ2V0UmVzb3VyY2Uod3NkbExvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAod3NkbFN0cmVhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBXU0RMMTFUb0F4aXNTZXJ2aWNlQnVpbGRlciB3c2RsMkF4aXNTZXJ2aWNlQnVpbGRlciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBXU0RMMTFUb0F4aXNTZXJ2aWNlQnVpbGRlcih3c2RsU3RyZWFtLCBheGlzU2VydmljZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBGaWxlIGZpbGUgPSBVdGlscy50b0ZpbGUoc2VydmljZXNVUkwpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYoZmlsZSAhPSBudWxsICYmIGZpbGUuZXhpc3RzKCkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzZGwyQXhpc1NlcnZpY2VCdWlsZGVyLnNldEN1c3RvbVdTTEQ0SlJlc29sdmVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBQVJCYXNlZFdTRExMb2NhdG9yKHdzZGxMb2NhdGlvbiwgZmlsZSwgd3NkbFN0cmVhbSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzZGwyQXhpc1NlcnZpY2VCdWlsZGVyLnNldEN1c3RvbVJlc29sdmVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFBUkZpbGVCYXNlZFVSSVJlc29sdmVyKGZpbGUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3c2RsVVJMICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c2RsMkF4aXNTZXJ2aWNlQnVpbGRlci5zZXREb2N1bWVudEJhc2VVcmkod3NkbFVSTC50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlID0gd3NkbDJBeGlzU2VydmljZUJ1aWxkZXIucG9wdWxhdGVTZXJ2aWNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBheGlzU2VydmljZS5zZXRXc2RsRm91bmQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBheGlzU2VydmljZS5zZXRDdXN0b21Xc2RsKHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2V0IHRoZSBkZWZhdWx0IG1lc3NhZ2UgcmVjZWl2ZXIgZm9yIHRoZSBvcGVyYXRpb25zIHRoYXQgd2VyZQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90IGxpc3RlZCBpbiB0aGUgc2VydmljZXMueG1sCi0gICAgICAgICAgICAgICAgICAgICAgICBJdGVyYXRvciBvcGVyYXRpb25zID0gYXhpc1NlcnZpY2UuZ2V0T3BlcmF0aW9ucygpOwotICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG9wZXJhdGlvbnMuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQXhpc09wZXJhdGlvbiBvcGVyYXRpb24gPSAoQXhpc09wZXJhdGlvbikgb3BlcmF0aW9ucy5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wZXJhdGlvbi5nZXRNZXNzYWdlUmVjZWl2ZXIoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbi5zZXRNZXNzYWdlUmVjZWl2ZXIobG9hZERlZmF1bHRNZXNzYWdlUmVjZWl2ZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uLmdldE1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4oKSwgYXhpc1NlcnZpY2UpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHNlcnZpY0xpc3Q7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKGUpOwotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIE1lc3NhZ2VSZWNlaXZlciBsb2FkRGVmYXVsdE1lc3NhZ2VSZWNlaXZlcihTdHJpbmcgbWVwVVJMLCBBeGlzU2VydmljZSBzZXJ2aWNlKSB7Ci0gICAgICAgIE1lc3NhZ2VSZWNlaXZlciBtZXNzYWdlUmVjZWl2ZXI7Ci0gICAgICAgIGlmIChtZXBVUkwgPT0gbnVsbCkgewotICAgICAgICAgICAgbWVwVVJMID0gV1NETDJDb25zdGFudHMuTUVQX1VSSV9JTl9PVVQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgbWVzc2FnZVJlY2VpdmVyID0gc2VydmljZS5nZXRNZXNzYWdlUmVjZWl2ZXIobWVwVVJMKTsKLSAgICAgICAgICAgIGlmIChtZXNzYWdlUmVjZWl2ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBtZXNzYWdlUmVjZWl2ZXI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGF4aXNDb25maWcuZ2V0TWVzc2FnZVJlY2VpdmVyKG1lcFVSTCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZE5ld01vZHVsZShBeGlzTW9kdWxlIG1vZHVsZW1ldGFkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZ3VyYXRpb24pIHRocm93cyBBeGlzRmF1bHQgewotCi0gICAgICAgIEZsb3cgaW5mbG93ID0gbW9kdWxlbWV0YWRhdGEuZ2V0SW5GbG93KCk7Ci0gICAgICAgIENsYXNzTG9hZGVyIG1vZHVsZUNsYXNzTG9hZGVyID0gbW9kdWxlbWV0YWRhdGEuZ2V0TW9kdWxlQ2xhc3NMb2FkZXIoKTsKLQotICAgICAgICBpZiAoaW5mbG93ICE9IG51bGwpIHsKLSAgICAgICAgICAgIFV0aWxzLmFkZEZsb3dIYW5kbGVycyhpbmZsb3csIG1vZHVsZUNsYXNzTG9hZGVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIEZsb3cgb3V0RmxvdyA9IG1vZHVsZW1ldGFkYXRhLmdldE91dEZsb3coKTsKLQotICAgICAgICBpZiAob3V0RmxvdyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBVdGlscy5hZGRGbG93SGFuZGxlcnMob3V0RmxvdywgbW9kdWxlQ2xhc3NMb2FkZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgRmxvdyBmYXVsdEluRmxvdyA9IG1vZHVsZW1ldGFkYXRhLmdldEZhdWx0SW5GbG93KCk7Ci0KLSAgICAgICAgaWYgKGZhdWx0SW5GbG93ICE9IG51bGwpIHsKLSAgICAgICAgICAgIFV0aWxzLmFkZEZsb3dIYW5kbGVycyhmYXVsdEluRmxvdywgbW9kdWxlQ2xhc3NMb2FkZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgRmxvdyBmYXVsdE91dEZsb3cgPSBtb2R1bGVtZXRhZGF0YS5nZXRGYXVsdE91dEZsb3coKTsKLQotICAgICAgICBpZiAoZmF1bHRPdXRGbG93ICE9IG51bGwpIHsKLSAgICAgICAgICAgIFV0aWxzLmFkZEZsb3dIYW5kbGVycyhmYXVsdE91dEZsb3csIG1vZHVsZUNsYXNzTG9hZGVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIGF4aXNDb25maWd1cmF0aW9uLmFkZE1vZHVsZShtb2R1bGVtZXRhZGF0YSk7Ci0gICAgICAgIGxvZy5kZWJ1ZyhNZXNzYWdlcy5nZXRNZXNzYWdlKERlcGxveW1lbnRFcnJvck1zZ3MuQURESU5HX05FV19NT0RVTEUpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkU2VydmljZUdyb3VwKEF4aXNTZXJ2aWNlR3JvdXAgc2VydmljZUdyb3VwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlMaXN0IHNlcnZpY2VMaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMIHNlcnZpY2VMb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlcGxveW1lbnRGaWxlRGF0YSBjdXJyZW50RGVwbG95bWVudEZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlndXJhdGlvbikgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIGZpbGxTZXJ2aWNlR3JvdXAoc2VydmljZUdyb3VwLCBzZXJ2aWNlTGlzdCwgc2VydmljZUxvY2F0aW9uLCBheGlzQ29uZmlndXJhdGlvbik7Ci0gICAgICAgIGF4aXNDb25maWd1cmF0aW9uLmFkZFNlcnZpY2VHcm91cChzZXJ2aWNlR3JvdXApOwotICAgICAgICBpZiAoY3VycmVudERlcGxveW1lbnRGaWxlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGFkZEFzV2ViUmVzb3VyY2VzKGN1cnJlbnREZXBsb3ltZW50RmlsZS5nZXRGaWxlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlR3JvdXAuZ2V0U2VydmljZUdyb3VwTmFtZSgpLCBzZXJ2aWNlR3JvdXApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGZpbGxTZXJ2aWNlR3JvdXAoQXhpc1NlcnZpY2VHcm91cCBzZXJ2aWNlR3JvdXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlMaXN0IHNlcnZpY2VMaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTCBzZXJ2aWNlTG9jYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZykgdGhyb3dzIEF4aXNGYXVsdCB7Ci0vLyAgICAgICAgc2VydmljZUdyb3VwLnNldFBhcmVudChheGlzQ29uZmlnKTsKLSAgICAgICAgLy8gbW9kdWxlIGZyb20gc2VydmljZXMueG1sIGF0IHNlcnZpY2VHcm91cCBsZXZlbAotICAgICAgICBBcnJheUxpc3QgZ3JvdXBNb2R1bGVzID0gc2VydmljZUdyb3VwLmdldE1vZHVsZVJlZnMoKTsKLSAgICAgICAgc2VydmljZUdyb3VwLnNldFBhcmVudChheGlzQ29uZmlnKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBncm91cE1vZHVsZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIFN0cmluZyBtb2R1bGVOYW1lID0gKFN0cmluZykgZ3JvdXBNb2R1bGVzLmdldChpKTsKLSAgICAgICAgICAgIEF4aXNNb2R1bGUgbW9kdWxlID0gYXhpc0NvbmZpZy5nZXRNb2R1bGUobW9kdWxlTmFtZSk7Ci0KLSAgICAgICAgICAgIGlmIChtb2R1bGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHNlcnZpY2VHcm91cC5lbmdhZ2VNb2R1bGUoYXhpc0NvbmZpZy5nZXRNb2R1bGUobW9kdWxlTmFtZSkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlcGxveW1lbnRFcnJvck1zZ3MuQkFEX01PRFVMRV9GUk9NX1NFUlZJQ0UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VHcm91cC5nZXRTZXJ2aWNlR3JvdXBOYW1lKCksIG1vZHVsZU5hbWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEl0ZXJhdG9yIHNlcnZpY2VzID0gc2VydmljZUxpc3QuaXRlcmF0b3IoKTsKLQotICAgICAgICB3aGlsZSAoc2VydmljZXMuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBBeGlzU2VydmljZSBheGlzU2VydmljZSA9IChBeGlzU2VydmljZSkgc2VydmljZXMubmV4dCgpOwotICAgICAgICAgICAgYXhpc1NlcnZpY2Uuc2V0VXNlRGVmYXVsdENoYWlucyhmYWxzZSk7Ci0KLSAgICAgICAgICAgIGF4aXNTZXJ2aWNlLnNldEZpbGVOYW1lKHNlcnZpY2VMb2NhdGlvbik7Ci0gICAgICAgICAgICBzZXJ2aWNlR3JvdXAuYWRkU2VydmljZShheGlzU2VydmljZSk7Ci0KLSAgICAgICAgICAgIC8vIG1vZHVsZXMgZnJvbSA8c2VydmljZT4KLSAgICAgICAgICAgIEFycmF5TGlzdCBsaXN0ID0gYXhpc1NlcnZpY2UuZ2V0TW9kdWxlcygpOwotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBBeGlzTW9kdWxlIG1vZHVsZSA9IGF4aXNDb25maWcuZ2V0TW9kdWxlKChTdHJpbmcpIGxpc3QuZ2V0KGkpKTsKLQotICAgICAgICAgICAgICAgIGlmIChtb2R1bGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRNZXNzYWdlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVwbG95bWVudEVycm9yTXNncy5CQURfTU9EVUxFX0ZST01fU0VSVklDRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlLmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUU5hbWUpIGxpc3QuZ2V0KGkpKS5nZXRMb2NhbFBhcnQoKSkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlLmVuZ2FnZU1vZHVsZShtb2R1bGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gYXhpc1NlcnZpY2UuZ2V0T3BlcmF0aW9ucygpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgQXhpc09wZXJhdGlvbiBvcERlc2MgPSAoQXhpc09wZXJhdGlvbikgaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgIEFycmF5TGlzdCBtb2R1bGVzID0gb3BEZXNjLmdldE1vZHVsZVJlZnMoKTsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbW9kdWxlcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbW9kdWxlTmFtZSA9IChTdHJpbmcpIG1vZHVsZXMuZ2V0KGkpOwotICAgICAgICAgICAgICAgICAgICBBeGlzTW9kdWxlIG1vZHVsZSA9IGF4aXNDb25maWcuZ2V0TW9kdWxlKG1vZHVsZU5hbWUpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChtb2R1bGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgb3BEZXNjLmVuZ2FnZU1vZHVsZShtb2R1bGUpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVwbG95bWVudEVycm9yTXNncy5CQURfTU9EVUxFX0ZST01fT1BFUkFUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wRGVzYy5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlTmFtZSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGZpbGUgQXJjaGl2ZUZpbGVEYXRhCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkV1NUb0RlcGxveShEZXBsb3ltZW50RmlsZURhdGEgZmlsZSkgewotICAgICAgICB3c1RvRGVwbG95LmFkZChmaWxlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gZmlsZSBXU0luZm8KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRXU1RvVW5kZXBsb3koV1NJbmZvIGZpbGUpIHsKLSAgICAgICAgd3NUb1VuRGVwbG95LmFkZChmaWxlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkb0RlcGxveSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmICh3c1RvRGVwbG95LnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHdzVG9EZXBsb3kuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgRGVwbG95bWVudEZpbGVEYXRhIGZpbGVUb0RlcGxveSA9IChEZXBsb3ltZW50RmlsZURhdGEpIHdzVG9EZXBsb3kuZ2V0KGkpOwotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVRvRGVwbG95LmRlcGxveSgpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChEZXBsb3ltZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE8gOiBUaGlzIHByb2JhYmx5IGlzbid0IHN1ZmZpY2llbnQuICBNYXliZSBwcm92aWRlIGFuIG9wdGlvbiB0byBzdG9wPwotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmluZm8oZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICB3c1RvRGVwbG95LmNsZWFyKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3MgaWYgdGhlIG1vZHVsZXMsIHJlZmVycmVkIGJ5IHNlcnZlci54bWwsIGV4aXN0IG9yIHRoYXQgdGhleSBhcmUgZGVwbG95ZWQuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0IDogSWYgc210IGdvZXMgd3JvbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBlbmdhZ2VNb2R1bGVzKCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIGF4aXNDb25maWcuZW5nYWdlR2xvYmFsTW9kdWxlcygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRvIGdldCBBeGlzQ29uZmlndXJhdGlvbiBmb3IgYSBnaXZlbiBpbnB1dFN0cmVhbSB0aGlzIG1ldGhvZCBjYW4gYmUgdXNlZC4KLSAgICAgKiBUaGUgaW5wdXRzdHJlYW0gc2hvdWxkIGJlIGEgdmFsaWQgYXhpczIueG1sICwgZWxzZSB5b3Ugd2lsbCBiZSBnZXR0aW5nCi0gICAgICogRGVwbG95bWVudEV4Y2VwdGlvbnMuCi0gICAgICogPHAvPgotICAgICAqIEZpcnN0IGNyZWF0IGEgQXhpc0NvbmZpZ3VyYXRpb24gdXNpbmcgZ2l2ZW4gaW5wdXRTcmVhbSAsIGFuZCB0aGVuIGl0IHdpbGwKLSAgICAgKiB0cnkgdG8gZmluZCB0aGUgcmVwb3NpdG9yeSBsb2NhdGlvbiBwYXJhbWV0ZXIgZnJvbSBBeGlzQ29uZmlndXJhdGlvbiwgc28KLSAgICAgKiBpZiB1c2VyIGhhcyBhZGQgYSBwYXJhbWV0ZXIgd2l0aCB0aGUgbmFtZSAicmVwb3NpdG9yeSIgLCB0aGVuIHRoZSB2YWx1ZQotICAgICAqIHNwZWNpZmllZCBieSB0aGF0IHBhcmFtZXRlciB3aWxsIGJlIHRoZSByZXBvc2l0b3J5IGFuZCBzeXN0ZW0gd2lsbCB0cnkgdG8KLSAgICAgKiBsb2FkIG1vZHVsZXMgYW5kIHNlcnZpY2VzIGZyb20gdGhhdCByZXBvc2l0b3J5IGxvY2F0aW9uIGlmIGl0IGEgdmFsaWQKLSAgICAgKiBsb2NhdGlvbi4gaG90IGRlcGxveW1lbnQgYW5kIGhvdCB1cGRhdGUgd2lsbCB3b3JrIGFzIHVzdWFsIGluIHRoaXMgY2FzZS4KLSAgICAgKiA8cC8+Ci0gICAgICogWW91IHdpbGwgYmUgZ2V0dGluZyBBeGlzQ29uZmlndXJhdGlvbiBjb3JyZXNwb25kaW5nIHRvIGdpdmVuIGlucHV0c3RyZWFtCi0gICAgICogaWYgaXQgaXMgdmFsaWQgLCBpZiBzb21ldGhpbmcgZ29lcyB3cm9uZyB5b3Ugd2lsbCBiZSBnZXR0aW5nCi0gICAgICogRGVwbG95bWVudEV4Y2VwdGlvbgotICAgICAqCi0gICAgICogQHBhcmFtIGluIDogSW5wdXRTdHJlYW0gdG8gYXhpczIueG1sCi0gICAgICogQHJldHVybiBhIHBvcHVsYXRlZCBBeGlzQ29uZmlndXJhdGlvbgotICAgICAqIEB0aHJvd3MgRGVwbG95bWVudEV4Y2VwdGlvbiA6IElmIHNvbWV0aGluZyBnb2VzIHdyb25nCi0gICAgICovCi0gICAgcHVibGljIEF4aXNDb25maWd1cmF0aW9uIHBvcHVsYXRlQXhpc0NvbmZpZ3VyYXRpb24oSW5wdXRTdHJlYW0gaW4pIHRocm93cyBEZXBsb3ltZW50RXhjZXB0aW9uIHsKLSAgICAgICAgYXhpc0NvbmZpZyA9IG5ldyBBeGlzQ29uZmlndXJhdGlvbigpOwotICAgICAgICBBeGlzQ29uZmlnQnVpbGRlciBidWlsZGVyID0gbmV3IEF4aXNDb25maWdCdWlsZGVyKGluLCBheGlzQ29uZmlnLCB0aGlzKTsKLSAgICAgICAgYnVpbGRlci5wb3B1bGF0ZUNvbmZpZygpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKGluICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpbi5jbG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBsb2cuaW5mbygiZXJyb3IgaW4gY2xvc2luZyBpbnB1dCBzdHJlYW0iKTsKLSAgICAgICAgfQotICAgICAgICBtb2R1bGVEZXBsb3llciA9IG5ldyBNb2R1bGVEZXBsb3llcihheGlzQ29uZmlnKTsKLSAgICAgICAgcmV0dXJuIGF4aXNDb25maWc7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RhcnRzIHRoZSBEZXBsb3ltZW50IGVuZ2luZSB0byBwZXJmb3JtIEhvdCBkZXBsb3ltZW50IGFuZCBzbyBvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBsaXN0ZW5lciA6IFJlcG9zaXRvcnlMaXN0ZW5lcgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHN0YXJ0U2VhcmNoKFJlcG9zaXRvcnlMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICBzY2hlZHVsZXIgPSBuZXcgU2NoZWR1bGVyKCk7Ci0KLSAgICAgICAgc2NoZWR1bGVyLnNjaGVkdWxlKG5ldyBTY2hlZHVsZXJUYXNrKGxpc3RlbmVyKSwgbmV3IERlcGxveW1lbnRJdGVyYXRvcigpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB1bkRlcGxveSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmICh3c1RvVW5EZXBsb3kuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgd3NUb1VuRGVwbG95LnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIFdTSW5mbyB3c0luZm8gPSAoV1NJbmZvKSB3c1RvVW5EZXBsb3kuZ2V0KGkpOwotICAgICAgICAgICAgICAgICAgICBpZiAod3NJbmZvLmdldFR5cGUoKSA9PSBXU0luZm8uVFlQRV9TRVJWSUNFKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL05vIG1hdHRlciB3aGF0IHdlIG5lZWQgdG8gdW5kZXBsb3kgdGhlIHNlcnZpY2UKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHVzZXIgaGFzIGRlbGV0ZWQgdGhlIGZpbGUgZnJvbSB0aGUgcmVwb3NpdG9yeQotICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZURlcGxveWVyLnVuRGVwbG95KHdzSW5mby5nZXRGaWxlTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vV2UgbmVlZCB0byB1bmRlcGxveSB0aGUgc2VydmljZSB3aGV0aGVyIHdlIGhhdmUgZW5hYmxlIGhvdFVwZGF0ZSBvciBub3QgLAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gby53IHdoYXQgaGFwcGVuIGlmIHNvbWVvbmUgZGVsZXRlIHRoZSBzZXJ2aWNlIGZyb20gdGhlIHJlcG8KLSAgICAgICAgICAgICAgICAgICAgICAgIERlcGxveWVyIGRlcGxveWVyID0gd3NJbmZvLmdldERlcGxveWVyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVwbG95ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcGxveWVyLnVuRGVwbG95KHdzSW5mby5nZXRGaWxlTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGxvZy5pbmZvKGUpOwotICAgICAgICB9Ci0gICAgICAgIHdzVG9VbkRlcGxveS5jbGVhcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgQXhpc0NvbmZpZ3VyYXRpb24uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIEF4aXNDb25maWd1cmF0aW9uIDxjb2RlPkF4aXNDb25maWd1cmF0aW9uPC9jb2RlPgotICAgICAqLwotICAgIHB1YmxpYyBBeGlzQ29uZmlndXJhdGlvbiBnZXRBeGlzQ29uZmlnKCkgewotICAgICAgICByZXR1cm4gYXhpc0NvbmZpZzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXRyaWV2ZXMgc2VydmljZSBuYW1lIGZyb20gdGhlIGFyY2hpdmUgZmlsZSBuYW1lLgotICAgICAqIElmIHRoZSBhcmNoaXZlIGZpbGUgbmFtZSBpcyBzZXJ2aWNlMS5hYXIgLCB0aGVuIGF4aXMyIHNlcnZpY2UgbmFtZSB3b3VsZCBiZSBzZXJ2aWNlMQotICAgICAqCi0gICAgICogQHBhcmFtIGZpbGVOYW1lIHRoZSBhcmNoaXZlIGZpbGUgbmFtZQotICAgICAqIEByZXR1cm4gUmV0dXJucyBTdHJpbmcuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QXhpc1NlcnZpY2VOYW1lKFN0cmluZyBmaWxlTmFtZSkgewotICAgICAgICBjaGFyIHNlcGVyYXRvciA9ICcuJzsKLSAgICAgICAgU3RyaW5nIHZhbHVlOwotICAgICAgICBpbnQgaW5kZXggPSBmaWxlTmFtZS5sYXN0SW5kZXhPZihzZXBlcmF0b3IpOwotCi0gICAgICAgIGlmIChpbmRleCA+IDApIHsKLSAgICAgICAgICAgIHZhbHVlID0gZmlsZU5hbWUuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQotICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZpbGVOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBBeGlzTW9kdWxlIGdldE1vZHVsZShTdHJpbmcgbW9kdWxlTmFtZSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIHJldHVybiBheGlzQ29uZmlnLmdldE1vZHVsZShtb2R1bGVOYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0hvdFVwZGF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIGhvdFVwZGF0ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFkZEFzV2ViUmVzb3VyY2VzKEZpbGUgaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2VydmljZUZpbGVOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXhpc1NlcnZpY2VHcm91cCBzZXJ2aWNlR3JvdXApIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmICh3ZWJMb2NhdGlvblN0cmluZyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGluLmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBGaWxlIHdlYkxvY2F0aW9uID0gbmV3IEZpbGUod2ViTG9jYXRpb25TdHJpbmcpOwotICAgICAgICAgICAgRmlsZSBvdXQgPSBuZXcgRmlsZSh3ZWJMb2NhdGlvbiwgc2VydmljZUZpbGVOYW1lKTsKLSAgICAgICAgICAgIGludCBCVUZGRVIgPSAxMDI0OwotICAgICAgICAgICAgYnl0ZSBkYXRhW10gPSBuZXcgYnl0ZVtCVUZGRVJdOwotICAgICAgICAgICAgRmlsZUlucHV0U3RyZWFtIGZpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oaW4pOwotICAgICAgICAgICAgWmlwSW5wdXRTdHJlYW0gemluID0gbmV3IFppcElucHV0U3RyZWFtKAotICAgICAgICAgICAgICAgICAgICBmaW4pOwotICAgICAgICAgICAgWmlwRW50cnkgZW50cnk7Ci0gICAgICAgICAgICB3aGlsZSAoKGVudHJ5ID0gemluLmdldE5leHRFbnRyeSgpKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgWmlwRW50cnkgemlwID0gbmV3IFppcEVudHJ5KGVudHJ5KTsKLSAgICAgICAgICAgICAgICBpZiAoemlwLmdldE5hbWUoKS50b1VwcGVyQ2FzZSgpLnN0YXJ0c1dpdGgoIldXVyIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBmaWxlTmFtZSA9IHppcC5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lID0gZmlsZU5hbWUuc3Vic3RyaW5nKCJXV1cvIi5sZW5ndGgoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWUubGVuZ3RoKCkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoemlwLmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlKG91dCwgZmlsZU5hbWUpLm1rZGlycygpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgRmlsZU91dHB1dFN0cmVhbSB0ZW1wT3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0obmV3IEZpbGUob3V0LCBmaWxlTmFtZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50OwotICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKChjb3VudCA9IHppbi5yZWFkKGRhdGEsIDAsIEJVRkZFUikpICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcE91dC53cml0ZShkYXRhLCAwLCBjb3VudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wT3V0LmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wT3V0LmZsdXNoKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc2VydmljZUdyb3VwLnNldEZvdW5kV2ViUmVzb3VyY2VzKHRydWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHppbi5jbG9zZSgpOwotICAgICAgICAgICAgZmluLmNsb3NlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGxvZy5pbmZvKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFdlYkxvY2F0aW9uU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gd2ViTG9jYXRpb25TdHJpbmc7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVG8gc2V0IHRoZSBhbGwgdGhlIGNsYXNzTG9hZGVyIGhpZXJhcmNoeSB0aGlzIG1ldGhvZCBjYW4gYmUgdXNlZCAsIHRoZSB0b3AgbW9zdCBwYXJlbnQgaXMKLSAgICAgKiBDQ0wgdGhlbiBTQ0woc3lzdGVtIENsYXNzIExvYWRlcikKLSAgICAgKiBDQ0wKLSAgICAgKiA6Ci0gICAgICogU0NMCi0gICAgICogOiAgOgotICAgICAqIE1DQ0wgIFNDQ0wKLSAgICAgKiA6ICAgICAgOgotICAgICAqIE1DTCAgICBTQ0wKLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIE1DQ0wgOiAgbW9kdWxlIGNvbW1vbiBjbGFzcyBsb2FkZXIKLSAgICAgKiBTQ0NMIDogU2VydmljZSBjb21tb24gY2xhc3MgbG9hZGVyCi0gICAgICogTUNMIDogbW9kdWxlIGNsYXNzIGxvYWRlcgotICAgICAqIFNDTCAgOiBTZXJ2aWNlIGNsYXNzIGxvYWRlcgotICAgICAqCi0gICAgICogQHBhcmFtIGF4aXMycmVwb1VSSSA6IFRoZSByZXBvc2l0b3J5IGZvbGRlciBvZiBBeGlzMgotICAgICAqIEB0aHJvd3MgRGVwbG95bWVudEV4Y2VwdGlvbiBpZiB0aGVyZSdzIGEgcHJvYmxlbQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldENsYXNzTG9hZGVycyhTdHJpbmcgYXhpczJyZXBvVVJJKSB0aHJvd3MgRGVwbG95bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIENsYXNzTG9hZGVyIHN5c0NsYXNzTG9hZGVyID0KLSAgICAgICAgICAgICAgICBVdGlscy5nZXRDbGFzc0xvYWRlcihUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpLCBheGlzMnJlcG9VUkkpOwotCi0gICAgICAgIGF4aXNDb25maWcuc2V0U3lzdGVtQ2xhc3NMb2FkZXIoc3lzQ2xhc3NMb2FkZXIpOwotICAgICAgICBpZiAoc2VydmljZXNEaXIuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIGF4aXNDb25maWcuc2V0U2VydmljZUNsYXNzTG9hZGVyKAotICAgICAgICAgICAgICAgICAgICBVdGlscy5nZXRDbGFzc0xvYWRlcihheGlzQ29uZmlnLmdldFN5c3RlbUNsYXNzTG9hZGVyKCksIHNlcnZpY2VzRGlyKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBheGlzQ29uZmlnLnNldFNlcnZpY2VDbGFzc0xvYWRlcihheGlzQ29uZmlnLmdldFN5c3RlbUNsYXNzTG9hZGVyKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1vZHVsZXNEaXIuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIGF4aXNDb25maWcuc2V0TW9kdWxlQ2xhc3NMb2FkZXIoVXRpbHMuZ2V0Q2xhc3NMb2FkZXIoYXhpc0NvbmZpZy5nZXRTeXN0ZW1DbGFzc0xvYWRlcigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVzRGlyKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBheGlzQ29uZmlnLnNldE1vZHVsZUNsYXNzTG9hZGVyKGF4aXNDb25maWcuZ2V0U3lzdGVtQ2xhc3NMb2FkZXIoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIGhvdERlcGxveW1lbnQgYW5kIGhvdCB1cGRhdGUuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0RGVwbG95bWVudEZlYXR1cmVzKCkgewotICAgICAgICBQYXJhbWV0ZXIgaG90RGVwbG95bWVudCA9IGF4aXNDb25maWcuZ2V0UGFyYW1ldGVyKFRBR19IT1RfREVQTE9ZTUVOVCk7Ci0gICAgICAgIFBhcmFtZXRlciBob3RVcGRhdGUgPSBheGlzQ29uZmlnLmdldFBhcmFtZXRlcihUQUdfSE9UX1VQREFURSk7Ci0KLSAgICAgICAgaWYgKGhvdERlcGxveW1lbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgdGhpcy5ob3REZXBsb3ltZW50ID0gSmF2YVV0aWxzLmlzVHJ1ZShob3REZXBsb3ltZW50LmdldFZhbHVlKCksIHRydWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGhvdFVwZGF0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aGlzLmhvdFVwZGF0ZSA9IEphdmFVdGlscy5pc1RydWUoaG90VXBkYXRlLmdldFZhbHVlKCksIHRydWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIHNlcnZpY2VEaXJQYXJhID0gKFN0cmluZykKLSAgICAgICAgICAgICAgICBheGlzQ29uZmlnLmdldFBhcmFtZXRlclZhbHVlKERlcGxveW1lbnRDb25zdGFudHMuU0VSVklDRV9ESVJfUEFUSCk7Ci0gICAgICAgIGlmIChzZXJ2aWNlRGlyUGFyYSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzZXJ2aWNlc1BhdGggPSBzZXJ2aWNlRGlyUGFyYTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBtb2R1bGVEaXJQYXJhID0gKFN0cmluZykKLSAgICAgICAgICAgICAgICBheGlzQ29uZmlnLmdldFBhcmFtZXRlclZhbHVlKERlcGxveW1lbnRDb25zdGFudHMuTU9EVUxFX0RSSV9QQVRIKTsKLSAgICAgICAgaWYgKG1vZHVsZURpclBhcmEgIT0gbnVsbCkgewotICAgICAgICAgICAgbW9kdWxlc1BhdGggPSBtb2R1bGVEaXJQYXJhOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBkaXJlY3RvcmllcyBmb3IgbW9kdWxlcy9zZXJ2aWNlcywgY29waWVzIGNvbmZpZ3VyYXRpb24geG1sIGZyb20gY2xhc3MgbG9hZGVyIGlmIG5lY2Vzc2FyeQotICAgICAqCi0gICAgICogQHBhcmFtIHJlcG9zaXRvcnlOYW1lIHRoZSBwYXRobmFtZSBvZiB0aGUgcmVwb3NpdG9yeQotICAgICAqLwotCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJlcGFyZVJlcG9zaXRvcnkoU3RyaW5nIHJlcG9zaXRvcnlOYW1lKSB7Ci0gICAgICAgIHJlcG9zaXRvcnlEaXIgPSBuZXcgRmlsZShyZXBvc2l0b3J5TmFtZSk7Ci0gICAgICAgIGlmIChzZXJ2aWNlc1BhdGggIT0gbnVsbCkgewotICAgICAgICAgICAgc2VydmljZXNEaXIgPSBuZXcgRmlsZShzZXJ2aWNlc1BhdGgpOwotICAgICAgICAgICAgaWYgKCFzZXJ2aWNlc0Rpci5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgIHNlcnZpY2VzRGlyID0gbmV3IEZpbGUocmVwb3NpdG9yeURpciwgc2VydmljZXNQYXRoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNlcnZpY2VzRGlyID0gbmV3IEZpbGUocmVwb3NpdG9yeURpciwgRGVwbG95bWVudENvbnN0YW50cy5TRVJWSUNFX1BBVEgpOwotICAgICAgICB9Ci0gICAgICAgIGlmICghc2VydmljZXNEaXIuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIGxvZy5pbmZvKE1lc3NhZ2VzLmdldE1lc3NhZ2UoIm5vc2VydmljZWRpcmZvdW5kIiwgZ2V0UmVwb3NpdG9yeVBhdGgocmVwb3NpdG9yeURpcikpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobW9kdWxlc1BhdGggIT0gbnVsbCkgewotICAgICAgICAgICAgbW9kdWxlc0RpciA9IG5ldyBGaWxlKG1vZHVsZXNQYXRoKTsKLSAgICAgICAgICAgIGlmICghbW9kdWxlc0Rpci5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgIG1vZHVsZXNEaXIgPSBuZXcgRmlsZShyZXBvc2l0b3J5RGlyLCBtb2R1bGVzUGF0aCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtb2R1bGVzRGlyID0gbmV3IEZpbGUocmVwb3NpdG9yeURpciwgRGVwbG95bWVudENvbnN0YW50cy5NT0RVTEVfUEFUSCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFtb2R1bGVzRGlyLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICBsb2cuaW5mbyhNZXNzYWdlcy5nZXRNZXNzYWdlKCJub21vZHVsZWRpcmZvdW5kIiwgZ2V0UmVwb3NpdG9yeVBhdGgocmVwb3NpdG9yeURpcikpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UmVwb3NpdG9yeVBhdGgoRmlsZSByZXBvc2l0b3J5KSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVwb3NpdG9yeS5nZXRDYW5vbmljYWxQYXRoKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybiByZXBvc2l0b3J5LmdldEFic29sdXRlUGF0aCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIEFycmF5TGlzdCBnZXRGaWxlTGlzdChVUkwgZmlsZUxpc3RVcmwpIHsKLSAgICAgICAgQXJyYXlMaXN0IGZpbGVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBJbnB1dFN0cmVhbSBpbjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGluID0gZmlsZUxpc3RVcmwub3BlblN0cmVhbSgpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmlsZUxpc3Q7Ci0gICAgICAgIH0KLSAgICAgICAgQnVmZmVyZWRSZWFkZXIgaW5wdXQgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaW5wdXQgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKGluKSk7Ci0gICAgICAgICAgICBTdHJpbmcgbGluZTsKLSAgICAgICAgICAgIHdoaWxlICgobGluZSA9IGlucHV0LnJlYWRMaW5lKCkpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBsaW5lID0gbGluZS50cmltKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGxpbmUubGVuZ3RoKCkgPiAwICYmIGxpbmUuY2hhckF0KDApIT0nIycpIHsKLSAgICAgICAgICAgICAgICAgICAgZmlsZUxpc3QuYWRkKGxpbmUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIGV4LnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpZiAoaW5wdXQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpbnB1dC5jbG9zZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgIGV4LnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmaWxlTGlzdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb25maWdDb250ZXh0KENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQpIHsKLSAgICAgICAgdGhpcy5jb25maWdDb250ZXh0ID0gY29uZmlnQ29udGV4dDsKLSAgICAgICAgaW5pdGlhbGl6ZURlcGxveWVycyh0aGlzLmNvbmZpZ0NvbnRleHQpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbml0aWFsaXplRGVwbG95ZXJzKENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQpIHsKLSAgICAgICAgc2VydmljZURlcGxveWVyID0gbmV3IFNlcnZpY2VEZXBsb3llcigpOwotICAgICAgICBzZXJ2aWNlRGVwbG95ZXIuaW5pdChjb25maWdDb250ZXh0KTsgICAgICAgIAotICAgICAgICBmb3IgKE1hcDxTdHJpbmcsIERlcGxveWVyPiBleHRlbnNpb25NYXAgOiBkZXBsb3llck1hcC52YWx1ZXMoKSkgewotICAgICAgICAgICAgZm9yIChEZXBsb3llciBkZXBsb3llciA6IGV4dGVuc2lvbk1hcC52YWx1ZXMoKSkgewotICAgICAgICAgICAgICAgIGRlcGxveWVyLmluaXQoY29uZmlnQ29udGV4dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQnVpbGRzIGFuIEF4aXNNb2R1bGUgZm9yIGEgZ2l2ZW4gbW9kdWxlIGFyY2hpdmUgZmlsZS4gVGhpcyBkb2VzIG5vdAotICAgICAqIGNhbGxlZCB0aGUgaW5pdCBtZXRob2Qgc2luY2UgdGhlcmUgaXMgbm8gcmVmZXJlbmNlIHRvIGNvbmZpZ3VyYXRpb24gY29udGV4dAotICAgICAqIHNvIHdobyBldmVyIGNyZWF0ZSBtb2R1bGUgdXNpbmcgdGhpcyBoYXMgdG8gY2FsbGVkIG1vZHVsZS5pbml0IGlmIGl0IGlzCi0gICAgICogcmVxdWlyZWQKLSAgICAgKgotICAgICAqIEBwYXJhbSBtb2R1bGVhcmNoaXZlIDogQWN0dWFsIG1vZHVsZSBhcmNoaXZlIGZpbGUKLSAgICAgKiBAcGFyYW0gY29uZmlnICAgICAgICA6IEF4aXNDb25maWd1cmF0aW9uIDogZm9yIGdldCBjbGFzc2xvYWRlcnMgZXRjLi4KLSAgICAgKiBAcmV0dXJuIGEgY29tcGxldGUgQXhpc01vZHVsZSByZWFkIGZyb20gdGhlIGZpbGUuCi0gICAgICogQHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQuRGVwbG95bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgIGlmIHRoZXJlJ3MgYSBwcm9ibGVtCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBBeGlzTW9kdWxlIGJ1aWxkTW9kdWxlKEZpbGUgbW9kdWxlYXJjaGl2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXhpc0NvbmZpZ3VyYXRpb24gY29uZmlnKQotICAgICAgICAgICAgdGhyb3dzIERlcGxveW1lbnRFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBTdHJpbmcgTU9EVUxFX0RFUExPWUVSID0gIm1vZHVsZURlcGxveWVyIjsKLSAgICAgICAgQXhpc01vZHVsZSBheGlzbW9kdWxlOwotICAgICAgICBNb2R1bGVEZXBsb3llciBkZXBsb3llciA9IChNb2R1bGVEZXBsb3llcikgY29uZmlnLmdldFBhcmFtZXRlclZhbHVlKE1PRFVMRV9ERVBMT1lFUik7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoZGVwbG95ZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGRlcGxveWVyID0gbmV3IE1vZHVsZURlcGxveWVyKGNvbmZpZyk7Ci0gICAgICAgICAgICAgICAgY29uZmlnLmFkZFBhcmFtZXRlcihNT0RVTEVfREVQTE9ZRVIsIGRlcGxveWVyKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgRGVwbG95bWVudEZpbGVEYXRhIGN1cnJlbnREZXBsb3ltZW50RmlsZSA9IG5ldyBEZXBsb3ltZW50RmlsZURhdGEobW9kdWxlYXJjaGl2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcGxveWVyKTsKLSAgICAgICAgICAgIGF4aXNtb2R1bGUgPSBuZXcgQXhpc01vZHVsZSgpOwotICAgICAgICAgICAgQXJjaGl2ZVJlYWRlciBhcmNoaXZlUmVhZGVyID0gbmV3IEFyY2hpdmVSZWFkZXIoKTsKLQotICAgICAgICAgICAgY3VycmVudERlcGxveW1lbnRGaWxlLnNldENsYXNzTG9hZGVyKGZhbHNlLCBjb25maWcuZ2V0TW9kdWxlQ2xhc3NMb2FkZXIoKSwgbnVsbCk7Ci0gICAgICAgICAgICBheGlzbW9kdWxlLnNldE1vZHVsZUNsYXNzTG9hZGVyKGN1cnJlbnREZXBsb3ltZW50RmlsZS5nZXRDbGFzc0xvYWRlcigpKTsKLSAgICAgICAgICAgIGFyY2hpdmVSZWFkZXIucmVhZE1vZHVsZUFyY2hpdmUoY3VycmVudERlcGxveW1lbnRGaWxlLCBheGlzbW9kdWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgY29uZmlnKTsKLSAgICAgICAgICAgIENsYXNzTG9hZGVyIG1vZHVsZUNsYXNzTG9hZGVyID0gYXhpc21vZHVsZS5nZXRNb2R1bGVDbGFzc0xvYWRlcigpOwotICAgICAgICAgICAgRmxvdyBpbmZsb3cgPSBheGlzbW9kdWxlLmdldEluRmxvdygpOwotCi0gICAgICAgICAgICBpZiAoaW5mbG93ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBVdGlscy5hZGRGbG93SGFuZGxlcnMoaW5mbG93LCBtb2R1bGVDbGFzc0xvYWRlcik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEZsb3cgb3V0RmxvdyA9IGF4aXNtb2R1bGUuZ2V0T3V0RmxvdygpOwotCi0gICAgICAgICAgICBpZiAob3V0RmxvdyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgVXRpbHMuYWRkRmxvd0hhbmRsZXJzKG91dEZsb3csIG1vZHVsZUNsYXNzTG9hZGVyKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgRmxvdyBmYXVsdEluRmxvdyA9IGF4aXNtb2R1bGUuZ2V0RmF1bHRJbkZsb3coKTsKLQotICAgICAgICAgICAgaWYgKGZhdWx0SW5GbG93ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBVdGlscy5hZGRGbG93SGFuZGxlcnMoZmF1bHRJbkZsb3csIG1vZHVsZUNsYXNzTG9hZGVyKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgRmxvdyBmYXVsdE91dEZsb3cgPSBheGlzbW9kdWxlLmdldEZhdWx0T3V0RmxvdygpOwotCi0gICAgICAgICAgICBpZiAoZmF1bHRPdXRGbG93ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBVdGlscy5hZGRGbG93SGFuZGxlcnMoZmF1bHRPdXRGbG93LCBtb2R1bGVDbGFzc0xvYWRlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBheGlzRmF1bHQpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKGF4aXNGYXVsdCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGF4aXNtb2R1bGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmlsbHMgYW4gYXhpc3NlcnZpY2Ugb2JqZWN0IHVzaW5nIHNlcnZpY2VzLnhtbC4gRmlyc3QgY3JlYXRlcwotICAgICAqIGFuIGF4aXNzZXJ2aWNlIG9iamVjdCB1c2luZyBXU0RMIGFuZCB0aGVuIGZpbGxzIGl0IHVzaW5nIHRoZSBnaXZlbiBzZXJ2aWNlcy54bWwuCi0gICAgICogTG9hZHMgYWxsIHRoZSByZXF1aXJlZCBjbGFzcyBhbmQgYnVpbGRzIHRoZSBjaGFpbnMsIGZpbmFsbHkgYWRkcyB0aGUKLSAgICAgKiBzZXJ2aWNlY29udGV4dCB0byBFbmdpbmVDb250ZXh0IGFuZCBheGlzc2VydmljZSBpbnRvIEVuZ2luZUNvbmZpZ3VyYXRpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2VydmljZUlucHV0U3RyZWFtIElucHV0U3RyZWFtIGNvbnRhaW5pbmcgY29uZmlndXJhdGlvbiBkYXRhCi0gICAgICogQHBhcmFtIGNvbmZpZ0N0eCAgICAgICAgICB0aGUgQ29uZmlndXJhdGlvbkNvbnRleHQgaW4gd2hpY2ggd2UncmUgZGVwbG95aW5nCi0gICAgICogQHJldHVybiBSZXR1cm5zIEF4aXNTZXJ2aWNlLgotICAgICAqIEB0aHJvd3MgRGVwbG95bWVudEV4Y2VwdGlvbiBpZiB0aGVyZSdzIGEgcHJvYmxlbQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQXhpc1NlcnZpY2UgYnVpbGRTZXJ2aWNlKElucHV0U3RyZWFtIHNlcnZpY2VJbnB1dFN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDdHgpCi0gICAgICAgICAgICB0aHJvd3MgRGVwbG95bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlID0gbmV3IEF4aXNTZXJ2aWNlKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTZXJ2aWNlQnVpbGRlciBidWlsZGVyID0gbmV3IFNlcnZpY2VCdWlsZGVyKHNlcnZpY2VJbnB1dFN0cmVhbSwgY29uZmlnQ3R4LCBheGlzU2VydmljZSk7Ci0gICAgICAgICAgICBidWlsZGVyLnBvcHVsYXRlU2VydmljZShidWlsZGVyLmJ1aWxkT00oKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBheGlzRmF1bHQpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKGF4aXNGYXVsdCk7Ci0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBheGlzU2VydmljZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUbyBidWlsZCBhIEF4aXNTZXJ2aWNlR3JvdXAgZm9yIGEgZ2l2ZW4gc2VydmljZXMueG1sCi0gICAgICogWW91IGhhdmUgdG8gYWRkIHRoZSBjcmVhdGVkIGdyb3VwIGludG8gQXhpc0NvbmZpZwotICAgICAqCi0gICAgICogQHBhcmFtIHNlcnZpY2VzeG1sICAgICAgSW5wdXRTdHJlYW0gY3JlYXRlZCBmcm9tIHNlcnZpY2VzLnhtbCBvciBlcXVpdmFsZW50Ci0gICAgICogQHBhcmFtIGNsYXNzTG9hZGVyICAgICAgQ2xhc3NMb2FkZXIgdG8gdXNlCi0gICAgICogQHBhcmFtIHNlcnZpY2VHcm91cE5hbWUgbmFtZSBvZiB0aGUgc2VydmljZSBncm91cAotICAgICAqIEBwYXJhbSBjb25maWdDdHggICAgICAgIHRoZSBDb25maWd1cmF0aW9uQ29udGV4dCBpbiB3aGljaCB3ZSdyZSBkZXBsb3lpbmcKLSAgICAgKiBAcGFyYW0gYXJjaGl2ZVJlYWRlciAgICB0aGUgQXJjaGl2ZVJlYWRlciB3ZSdyZSB3b3JraW5nIHdpdGgKLSAgICAgKiBAcGFyYW0gd3NkbFNlcnZpY2VzICAgICBNYXAgb2YgZXhpc3RpbmcgV1NETCBzZXJ2aWNlcwotICAgICAqIEByZXR1cm4gYSBmbGVzaGVkLW91dCBBeGlzU2VydmljZUdyb3VwCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQgaWYgdGhlcmUncyBhIHByb2JsZW0KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEF4aXNTZXJ2aWNlR3JvdXAgYnVpbGRTZXJ2aWNlR3JvdXAoSW5wdXRTdHJlYW0gc2VydmljZXN4bWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2VydmljZUdyb3VwTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcmNoaXZlUmVhZGVyIGFyY2hpdmVSZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhc2hNYXAgd3NkbFNlcnZpY2VzKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgRGVwbG95bWVudEZpbGVEYXRhIGN1cnJlbnREZXBsb3ltZW50RmlsZSA9IG5ldyBEZXBsb3ltZW50RmlsZURhdGEobnVsbCwgbnVsbCk7Ci0gICAgICAgIGN1cnJlbnREZXBsb3ltZW50RmlsZS5zZXRDbGFzc0xvYWRlcihjbGFzc0xvYWRlcik7Ci0gICAgICAgIEF4aXNTZXJ2aWNlR3JvdXAgc2VydmljZUdyb3VwID0gbmV3IEF4aXNTZXJ2aWNlR3JvdXAoKTsKLSAgICAgICAgc2VydmljZUdyb3VwLnNldFNlcnZpY2VHcm91cENsYXNzTG9hZGVyKGNsYXNzTG9hZGVyKTsKLSAgICAgICAgc2VydmljZUdyb3VwLnNldFNlcnZpY2VHcm91cE5hbWUoc2VydmljZUdyb3VwTmFtZSk7Ci0gICAgICAgIEF4aXNDb25maWd1cmF0aW9uIGF4aXNDb25maWcgPSBjb25maWdDdHguZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEFycmF5TGlzdCBzZXJ2aWNlTGlzdCA9IGFyY2hpdmVSZWFkZXIuYnVpbGRTZXJ2aWNlR3JvdXAoc2VydmljZXN4bWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnREZXBsb3ltZW50RmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZUdyb3VwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c2RsU2VydmljZXMsIGNvbmZpZ0N0eCk7Ci0gICAgICAgICAgICBmaWxsU2VydmljZUdyb3VwKHNlcnZpY2VHcm91cCwgc2VydmljZUxpc3QsIG51bGwsIGF4aXNDb25maWcpOwotICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2VHcm91cDsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEF4aXNGYXVsdC5tYWtlRmF1bHQoZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEF4aXNTZXJ2aWNlR3JvdXAgbG9hZFNlcnZpY2VHcm91cChGaWxlIHNlcnZpY2VGaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0N0eCkKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgRGVwbG95bWVudEZpbGVEYXRhIGN1cnJlbnREZXBsb3ltZW50RmlsZSA9IG5ldyBEZXBsb3ltZW50RmlsZURhdGEoc2VydmljZUZpbGUsIG51bGwpOwotICAgICAgICAgICAgRGVwbG95bWVudENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyID0gVXRpbHMuY3JlYXRlQ2xhc3NMb2FkZXIoc2VydmljZUZpbGUpOwotICAgICAgICAgICAgY3VycmVudERlcGxveW1lbnRGaWxlLnNldENsYXNzTG9hZGVyKGNsYXNzTG9hZGVyKTsKLSAgICAgICAgICAgIEF4aXNTZXJ2aWNlR3JvdXAgc2VydmljZUdyb3VwID0gbmV3IEF4aXNTZXJ2aWNlR3JvdXAoKTsKLSAgICAgICAgICAgIHNlcnZpY2VHcm91cC5zZXRTZXJ2aWNlR3JvdXBDbGFzc0xvYWRlcihjbGFzc0xvYWRlcik7Ci0KLSAgICAgICAgICAgIC8vIERyb3AgdGhlIGV4dGVuc2lvbiBhbmQgdGFrZSB0aGUgbmFtZQotICAgICAgICAgICAgU3RyaW5nIGZpbGVOYW1lID0gc2VydmljZUZpbGUuZ2V0TmFtZSgpOwotICAgICAgICAgICAgU3RyaW5nIHNlcnZpY2VHcm91cE5hbWUgPSBmaWxlTmFtZS5zdWJzdHJpbmcoMCwgZmlsZU5hbWUubGFzdEluZGV4T2YoIi4iKSk7Ci0gICAgICAgICAgICBzZXJ2aWNlR3JvdXAuc2V0U2VydmljZUdyb3VwTmFtZShzZXJ2aWNlR3JvdXBOYW1lKTsKLSAgICAgICAgICAgIEF4aXNDb25maWd1cmF0aW9uIGF4aXNDb25maWcgPSBjb25maWdDdHguZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKTsKLQotICAgICAgICAgICAgQXJjaGl2ZVJlYWRlciBhcmNoaXZlUmVhZGVyID0gbmV3IEFyY2hpdmVSZWFkZXIoKTsKLSAgICAgICAgICAgIEhhc2hNYXAgd3NkbFNlcnZpY2VzID0gYXJjaGl2ZVJlYWRlci5wcm9jZXNzV1NETHMoY3VycmVudERlcGxveW1lbnRGaWxlKTsKLSAgICAgICAgICAgIElucHV0U3RyZWFtIHNlcnZpY2VYbWwgPSBjbGFzc0xvYWRlci5nZXRSZXNvdXJjZUFzU3RyZWFtKCJNRVRBLUlORi9zZXJ2aWNlcy54bWwiKTsKLSAgICAgICAgICAgIEFycmF5TGlzdCBzZXJ2aWNlTGlzdCA9IGFyY2hpdmVSZWFkZXIuYnVpbGRTZXJ2aWNlR3JvdXAoc2VydmljZVhtbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudERlcGxveW1lbnRGaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlR3JvdXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzZGxTZXJ2aWNlcywgY29uZmlnQ3R4KTsKLSAgICAgICAgICAgIGZpbGxTZXJ2aWNlR3JvdXAoc2VydmljZUdyb3VwLCBzZXJ2aWNlTGlzdCwgbnVsbCwgYXhpc0NvbmZpZyk7Ci0gICAgICAgICAgICByZXR1cm4gc2VydmljZUdyb3VwOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgRmlsZSBnZXRTZXJ2aWNlc0RpcigpIHsKLSAgICAgICAgcmV0dXJuIHNlcnZpY2VzRGlyOwotICAgIH0KLQotICAgIHB1YmxpYyBGaWxlIGdldE1vZHVsZXNEaXIoKSB7Ci0gICAgICAgIHJldHVybiBtb2R1bGVzRGlyOwotICAgIH0KLQotCi0gICAgcHVibGljIEZpbGUgZ2V0UmVwb3NpdG9yeURpcigpIHsKLSAgICAgICAgcmV0dXJuIHJlcG9zaXRvcnlEaXI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RXh0ZW5zaW9uVG9EZXBsb3llck1hcHBpbmdNYXAoSGFzaE1hcCBleHRlbnNpb25Ub0RlcGxveWVyTWFwcGluZ01hcCkgewotICAgICAgICB0aGlzLmV4dGVuc2lvblRvRGVwbG95ZXJNYXBwaW5nTWFwID0gZXh0ZW5zaW9uVG9EZXBsb3llck1hcHBpbmdNYXA7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldERlcGxveWVycyhNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLCBEZXBsb3llcj4+IGRlcGxveWVyTWFwKSB7Ci0gICAgICAgIHRoaXMuZGVwbG95ZXJNYXAgPSBkZXBsb3llck1hcDsKLSAgICB9ICAgIAotICAgIAotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLCBEZXBsb3llcj4+IGdldERlcGxveWVycygpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuZGVwbG95ZXJNYXA7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBSZXBvc2l0b3J5TGlzdGVuZXIgZ2V0UmVwb0xpc3RlbmVyKCkgewotICAgICAgICByZXR1cm4gcmVwb0xpc3RlbmVyOwotICAgIH0KLQotCi0gICAgcHVibGljIFNlcnZpY2VEZXBsb3llciBnZXRTZXJ2aWNlRGVwbG95ZXIoKSB7Ci0gICAgICAgIHJldHVybiBzZXJ2aWNlRGVwbG95ZXI7Ci0gICAgfQotCi0gICAgcHVibGljIE1vZHVsZURlcGxveWVyIGdldE1vZHVsZURlcGxveWVyKCkgewotICAgICAgICByZXR1cm4gbW9kdWxlRGVwbG95ZXI7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBEZXBsb3llciBnZXREZXBsb3llcihTdHJpbmcgZGlyZWN0b3J5LCBTdHJpbmcgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIE1hcDxTdHJpbmcsIERlcGxveWVyPiBleHRlbnNpb25NYXAgPSBkZXBsb3llck1hcC5nZXQoZGlyZWN0b3J5KTsKLSAgICAgICAgcmV0dXJuIChleHRlbnNpb25NYXAgIT0gbnVsbCkgPyBleHRlbnNpb25NYXAuZ2V0KGV4dGVuc2lvbikgOiBudWxsOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgRGVwbG95ZXIgZ2V0RGVwbG95ZXJGb3JFeHRlbnNpb24oU3RyaW5nIGV4dGVuc2lvbikgewotICAgICAgICByZXR1cm4gKERlcGxveWVyKSBleHRlbnNpb25Ub0RlcGxveWVyTWFwcGluZ01hcC5nZXQoZXh0ZW5zaW9uKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDbGVhbiB1cCB0aGUgbWVzcwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNsZWFudXAoKSB7Ci0gICAgICAgIGlmIChheGlzQ29uZmlnLmdldE1vZHVsZUNsYXNzTG9hZGVyKCkgaW5zdGFuY2VvZiBKYXJGaWxlQ2xhc3NMb2FkZXIpIHsKLSAgICAgICAgICAgICgoSmFyRmlsZUNsYXNzTG9hZGVyKWF4aXNDb25maWcuZ2V0TW9kdWxlQ2xhc3NMb2FkZXIoKSkuZGVzdHJveSgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChheGlzQ29uZmlnLmdldFNlcnZpY2VDbGFzc0xvYWRlcigpIGluc3RhbmNlb2YgSmFyRmlsZUNsYXNzTG9hZGVyKSB7Ci0gICAgICAgICAgICAoKEphckZpbGVDbGFzc0xvYWRlcilheGlzQ29uZmlnLmdldFNlcnZpY2VDbGFzc0xvYWRlcigpKS5kZXN0cm95KCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGF4aXNDb25maWcuZ2V0U3lzdGVtQ2xhc3NMb2FkZXIoKSBpbnN0YW5jZW9mIEphckZpbGVDbGFzc0xvYWRlcikgewotICAgICAgICAgICAgKChKYXJGaWxlQ2xhc3NMb2FkZXIpYXhpc0NvbmZpZy5nZXRTeXN0ZW1DbGFzc0xvYWRlcigpKS5kZXN0cm95KCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNjaGVkdWxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzY2hlZHVsZXIuY2xlYW51cCgpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvRGVwbG95bWVudEVycm9yTXNncy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvRGVwbG95bWVudEVycm9yTXNncy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGM4MTk2Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L0RlcGxveW1lbnRFcnJvck1zZ3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBEZXBsb3ltZW50RXJyb3JNc2dzIHsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRERJTkdfTkVXX01PRFVMRSA9ICJhZGRpbmduZXdtb2R1bGUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJBRF9NT0RVTEVfRlJPTV9PUEVSQVRJT04gPSAiYmFkTW9kdWxlRnJvbU9wZXJhdGlvbiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFEX01PRFVMRV9GUk9NX1NFUlZJQ0UgPSAiYmFkTW9kdWxlRnJvbVNlcnZpY2UiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJBRF9QQVJBTUVURVJfQVJHVU1FTlQgPSAiYmFkcGFyYWFndSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHX05PVF9GT1VORCA9ICJjb25maWdub3Rmb3VuZCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NfTk9UX0ZPVU5EID0gImNsYXNzbm90Zm91bmQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFUExPWUlOR19NT0RVTEUgPSAiZGVwbG95aW5nbW9kdWxlIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERVBMT1lJTkdfV1MgPSAiZGVwbG95aW5nd3MiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFUExPWUlOR19QT0pPID0gImRlcGxveWluZ3Bvam8iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfSVNfTk9UX0FMTE9XRUQgPSAiZWxlbWVudGlzbm90YWxsb3ciOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX0lOX0xPQURJTkdfTUVTU0FHRV9SRUNFSVZFUiA9ICJlcnJvcmlubG9hZGluZ21yIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTE9XVFlQRV9JU19SRVFVSVJFRCA9ICJmbG93dHlwZWlzcmVxdWlyZCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRV9OT1RfRk9VTkQgPSAiZmlsZU5vdEZvdW5kIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTkZMT1dfTk9UX0FMTE9XRURfSU5fVFJTX09VVCA9ICJpbmZsb3dub3RhbGxvd2VkaW50cm91dCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5WQUxJRF9IQU5ETEVSID0gImludmFsaWRoYW5kbGVyIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTlZBTElEX01PRFVMRSA9ICJpbnZhbGlkbW9kdWxlIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTlZBTElEX01PRFVMRV9DT05GSUcgPSAiaW52YWxpZG1vZHVsZWNvbmZpZyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5WQUxJRF9NT0RVTEVfUkVGID0gImludmFsaWRtb2R1bGVyZWZieWNvbmZpZyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5WQUxJRF9PUCA9ICJpbnZhbGlkX29wIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTlZBTElEX1BIQVNFID0gImludmFsaWRwaGFzZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5WQUxJRF9TRVJWSUNFID0gImludmFsaWRzZXJ2aWNlIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTlZBTElEX1NUT1JBR0VfQ0xBU1MgPSAiaW52YWxpZF9zdG9yYWdlIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RVTEVfQ0FOTk9UX0hBVkVfQk9USF9OQU1FX0FORF9SRUZFUkVOQ0UgPQotICAgICAgICAgICAgIm1vZHVsZWNhbm5vdGhhdnJib3RobmFtZWFuZHJlZiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTUEFUQ0hfUEhBU0VfTk9UX0ZPVU5EID0gImRpc3BhdGNoUGhhc2VOb3RGb3VuZE9uSW5mbG93IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RVTEVfTk9UX0ZPVU5EID0gIm1vZHVsZW5vdGZvdW5kIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RVTEVfVkFMSURBVElPTl9GQUlMRUQgPSAibW9kdWxldmFsZmFpbGVkIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RVTEVfWE1MX01JU1NJTkcgPSAibW9kdWxleG1sbm90Zm91bmQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEFfSU5GX01JU1NJTkcgPSAibm9NZXRhSW5mIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPQlNFUlZFUl9FUlJPUiA9ICJvYnNlcmVycm9yIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUEVSQVRJT05fUFJPQ0VTU19FUlJPUiA9ICJvcF9lcnJvciI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1VURkxPV19OT1RfQUxMT1dFRF9JTl9UUlNfSU4gPQotICAgICAgICAgICAgIm91dGZsb3dub3RhbGxvd2VkaW50cmluIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTUVURVJfTE9DS0VEID0gInBhcmFtZXRlcmxvY2tlZGVycm9yIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVRIX1RPX0NPTkZJR19DQU5OT1RfQkVfTlVMTCA9ICJwYXRodG9jb25maWdjYW5vdG51bGwiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUE9TSVRPUllfQ0FOTk9UX0JFX05VTEwgPSAicmVwb2Nhbm5vdGJlYnVsbCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVklDRV9NT0RVTEVfQ0FOTk9UX1JFRkVSX0dMT0JBTF9QSEFTRSA9Ci0gICAgICAgICAgICAic2VydmljZW1vZHVsZWNhbm5vdGhhdmVnbG9iYWwiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZJQ0VfTkFNRV9FUlJPUiA9ICJzZXJ2aWNlbmFtZWVyb3IiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZJQ0VfUkVNT1ZFRCA9ICJzZXJ2aWNlcmVtb3ZlZCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVklDRV9YTUxfTk9UX0ZPVU5EID0gInNlcnZpY2V4bWxub3Rmb3VuZCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfU0VUVElOR19DTElFTlRfSE9NRSA9ICJzZXR0aW5nY2wiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQU5TUE9SVF9TRU5ERVJfRVJST1IgPSAidHJhbnNwb3J0U2VuZGVyRXJyb3IiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9TVFJFQU1fRVhDRVBUSU9OID0gIlN0cmVhbUV4Y2VwdGlvbiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfTE9BRElOR19NRVNTQUdFX0JVSUxERVIgPSAiZXJyb3Jsb2FkaW5nYnVpbGRlciI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfTE9BRElOR19NRVNTQUdFX0ZPUk1BVFRFUiA9ICJlcnJvcmxvYWRpbmdmb3JtYXR0ZXIiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFUExPWUlOR19FWENFUFRJT04gPSAiZGVwbG95aW5nZXhjZXB0aW9uIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVE9SSU5HX0ZBVUxUWV9TRVJWSUNFID0gInN0cm9yaW5nZmF1bHR5c2VydmljZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFYV1NfSkFSU19NSVNTSU5HID0gImpheHdzamFyc21pc3NpbmciOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBVUxUWV9TRVJWSUNFX1JFTU9WQUwgPSAiZmF1bHR5c2VydmljZXJlbW92YWwiOwotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvRGVwbG95bWVudEV4Y2VwdGlvbi5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvRGVwbG95bWVudEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjY2MmQ3Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L0RlcGxveW1lbnRFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLQotcHVibGljIGNsYXNzIERlcGxveW1lbnRFeGNlcHRpb24gZXh0ZW5kcyBBeGlzRmF1bHQgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTIwNjIxNTYxMjIwODU4MDY4NEw7Ci0KLSAgICBwdWJsaWMgRGVwbG95bWVudEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRGVwbG95bWVudEV4Y2VwdGlvbihUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIoY2F1c2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBEZXBsb3ltZW50RXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L0RlcGxveW1lbnRMaWZlQ3ljbGVMaXN0ZW5lci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvRGVwbG95bWVudExpZmVDeWNsZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyMmQxNGEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvRGVwbG95bWVudExpZmVDeWNsZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLQotLyoqCi0gKiB0aGlzIGludGVyZmFjZSBpcyB1c2VkIHRvIGluZm9ybSBkZXBsb3ltZW50IGxpZmVjeWNsZSByZWFsYXRlZCBldmVudHMgdG8KLSAqIGxpc3RuZXJzCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGVwbG95bWVudExpZmVDeWNsZUxpc3RlbmVyIHsKLQotICAgIC8qKgotICAgICAqIGNhbGxzIGJlZm9yZSBjcmVhdGluZyB0aGUgY29uZmlndXJhdGlvbiBjb250ZXh0IHRvIGRvIGFueSBpbml0aWFsaXppbmcgd29yay4KLSAgICAgKiBAcGFyYW0gYXhpc0NvbmZpZwotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgcHJlRGVwbG95KEF4aXNDb25maWd1cmF0aW9uIGF4aXNDb25maWcpIHRocm93cyBBeGlzRmF1bHQ7Ci0KLSAgICAvKioKLSAgICAgKiBjYWxscyBhZnRlciBzdGFydGluZyB0aGUgY29uZmlndXJhdGlvbiBjb250ZXh0IHRvIHJlc3VtZSBhbnkgYWN0aXZpdHkuCi0gICAgICogQHBhcmFtIGNvbmZpZ3VyYXRpb25Db250ZXh0Ci0gICAgICogQHRocm93cyBBeGlzRmF1bHQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwb3N0RGVwbG95KENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ3VyYXRpb25Db250ZXh0KSB0aHJvd3MgQXhpc0ZhdWx0OwotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9EZXNjcmlwdGlvbkJ1aWxkZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L0Rlc2NyaXB0aW9uQnVpbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWU3MzUwLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L0Rlc2NyaXB0aW9uQnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmJ1aWxkZXIuQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5GbG93OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uSGFuZGxlckRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVySW5jbHVkZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlBoYXNlUnVsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlBvbGljeUluY2x1ZGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5Qb2xpY3lTdWJqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uV1NETDJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0NvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuTWVzc2FnZVJlY2VpdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaTE4bi5NZXNzYWdlczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5NZXNzYWdlRm9ybWF0dGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5Mb2FkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLlhNTFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubmVldGhpLlBvbGljeTsKLWltcG9ydCBvcmcuYXBhY2hlLm5lZXRoaS5Qb2xpY3lFbmdpbmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5uZWV0aGkuUG9saWN5UmVmZXJlbmNlOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBkb2VzIHRoZSBjb21tb24gdGFza3MgZm9yIGFsbCAqQnVpbGRlciBjbGFzcy4KLSAqLwotcHVibGljIGNsYXNzIERlc2NyaXB0aW9uQnVpbGRlciBpbXBsZW1lbnRzIERlcGxveW1lbnRDb25zdGFudHMgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKERlc2NyaXB0aW9uQnVpbGRlci5jbGFzcyk7Ci0KLSAgICBwcm90ZWN0ZWQgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ3R4OwotCi0gICAgcHJvdGVjdGVkIEF4aXNDb25maWd1cmF0aW9uIGF4aXNDb25maWc7Ci0KLSAgICBwcm90ZWN0ZWQgSW5wdXRTdHJlYW0gZGVzY3JpcHRpb25TdHJlYW07Ci0KLSAgICBwdWJsaWMgRGVzY3JpcHRpb25CdWlsZGVyKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBEZXNjcmlwdGlvbkJ1aWxkZXIoSW5wdXRTdHJlYW0gc2VydmljZUlucHV0U3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ3R4KSB7Ci0gICAgICAgIHRoaXMuY29uZmlnQ3R4ID0gY29uZmlnQ3R4OwotICAgICAgICB0aGlzLmRlc2NyaXB0aW9uU3RyZWFtID0gc2VydmljZUlucHV0U3RyZWFtOwotICAgICAgICB0aGlzLmF4aXNDb25maWcgPSB0aGlzLmNvbmZpZ0N0eC5nZXRBeGlzQ29uZmlndXJhdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBEZXNjcmlwdGlvbkJ1aWxkZXIoSW5wdXRTdHJlYW0gc2VydmljZUlucHV0U3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZykgewotICAgICAgICB0aGlzLmRlc2NyaXB0aW9uU3RyZWFtID0gc2VydmljZUlucHV0U3RyZWFtOwotICAgICAgICB0aGlzLmF4aXNDb25maWcgPSBheGlzQ29uZmlnOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgT01FbGVtZW50IGZvciBhIGdpdmVuIGRlc2NyaXB0aW9uIGRvY3VtZW50IChheGlzMi54bWwgLAotICAgICAqIHNlcnZpY2VzLnhtbCBhbmQgbW9kdWxlLnhtbCkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgPGNvZGU+T01FbGVtZW50PC9jb2RlPiAuCi0gICAgICogQHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbgotICAgICAqCi0gICAgICovCi0gICAgcHVibGljIE9NRWxlbWVudCBidWlsZE9NKCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIE9NRWxlbWVudCBlbGVtZW50ID0gKE9NRWxlbWVudCkgWE1MVXRpbHMudG9PTShkZXNjcmlwdGlvblN0cmVhbSk7Ci0gICAgICAgIGVsZW1lbnQuYnVpbGQoKTsKLSAgICAgICAgcmV0dXJuIGVsZW1lbnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTG9hZHMgZGVmYXVsdCBtZXNzYWdlIHJlY2VpdmVycy4gRmlyc3Qgc2VhcmNoZXMgaW4gQXhpc2VydmljZSBmb3IgdGhlCi0gICAgICogZ2l2ZW4gbWVwVVJMLCBpZiBub3QgZm91bmQgc2VhcmNoZXMgaW4gQXhpc0NvbmZpZ3VyYXRpb24gd2l0aCB0aGUgZ2l2ZW4KLSAgICAgKiBtZXBVUkwuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVwVVJMICA6Ci0gICAgICogICAgICAgICAgICAgICAgY2FuIGJlIG51bGwKLSAgICAgKiBAcGFyYW0gc2VydmljZSA6Ci0gICAgICogICAgICAgICAgICAgICAgVGhpcyBjYW4gYmUgbnVsbCA8Y29kZT5BeGlzU2VydmljZTwvY29kZT4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTWVzc2FnZVJlY2VpdmVyIGxvYWREZWZhdWx0TWVzc2FnZVJlY2VpdmVyKFN0cmluZyBtZXBVUkwsIEF4aXNTZXJ2aWNlIHNlcnZpY2UpIHsKLSAgICAgICAgTWVzc2FnZVJlY2VpdmVyIG1lc3NhZ2VSZWNlaXZlcjsKLSAgICAgICAgaWYgKG1lcFVSTCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtZXBVUkwgPSBXU0RMMkNvbnN0YW50cy5NRVBfVVJJX0lOX09VVDsKLSAgICAgICAgfQotICAgICAgICBpZiAoc2VydmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtZXNzYWdlUmVjZWl2ZXIgPSBzZXJ2aWNlLmdldE1lc3NhZ2VSZWNlaXZlcihtZXBVUkwpOwotICAgICAgICAgICAgaWYgKG1lc3NhZ2VSZWNlaXZlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2VSZWNlaXZlcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYXhpc0NvbmZpZy5nZXRNZXNzYWdlUmVjZWl2ZXIobWVwVVJMKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcm9jZXNzZXMgZGVmYXVsdCBtZXNzYWdlIHJlY2VpdmVycyBzcGVjaWZpZWQgZWl0aGVyIGluIGF4aXMyLnhtbCBvcgotICAgICAqIHNlcnZpY2VzLnhtbC4KLSAgICAgKgotICAgICAqLwotICAgIHByb3RlY3RlZCBIYXNoTWFwIHByb2Nlc3NNZXNzYWdlUmVjZWl2ZXJzKE9NRWxlbWVudCBtZXNzYWdlUmVjZWl2ZXJzKQotICAgICAgICAgICAgdGhyb3dzIERlcGxveW1lbnRFeGNlcHRpb24gewotICAgICAgICBIYXNoTWFwIG1yX21lcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIEl0ZXJhdG9yIG1zZ1JlY2VpdmVycyA9IG1lc3NhZ2VSZWNlaXZlcnMuZ2V0Q2hpbGRyZW5XaXRoTmFtZShuZXcgUU5hbWUoCi0gICAgICAgICAgICAgICAgVEFHX01FU1NBR0VfUkVDRUlWRVIpKTsKLSAgICAgICAgd2hpbGUgKG1zZ1JlY2VpdmVycy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBtc2dSZWNlaXZlciA9IChPTUVsZW1lbnQpIG1zZ1JlY2VpdmVycy5uZXh0KCk7Ci0gICAgICAgICAgICBmaW5hbCBPTUVsZW1lbnQgdGVtcE1zZ1JlY2VpdmVyID0gbXNnUmVjZWl2ZXI7Ci0gICAgICAgICAgICBNZXNzYWdlUmVjZWl2ZXIgcmVjZWl2ZXIgPSBudWxsOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByZWNlaXZlciA9IChNZXNzYWdlUmVjZWl2ZXIpIG9yZy5hcGFjaGUuYXhpczIuamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQuRGVwbG95bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2FkTWVzc2FnZVJlY2VpdmVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcE1zZ1JlY2VpdmVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IChEZXBsb3ltZW50RXhjZXB0aW9uKSBlLmdldEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgT01BdHRyaWJ1dGUgbWVwQXR0ID0gbXNnUmVjZWl2ZXIuZ2V0QXR0cmlidXRlKG5ldyBRTmFtZShUQUdfTUVQKSk7Ci0gICAgICAgICAgICBtcl9tZXAucHV0KG1lcEF0dC5nZXRBdHRyaWJ1dGVWYWx1ZSgpLCByZWNlaXZlcik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1yX21lcDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcm9jZXNzZXMgZGVmYXVsdCBtZXNzYWdlIHJlY2VpdmVycyBzcGVjaWZpZWQgZWl0aGVyIGluIGF4aXMyLnhtbCBvcgotICAgICAqIHNlcnZpY2VzLnhtbC4KLSAgICAgKgotICAgICAqLwotICAgIHByb3RlY3RlZCBIYXNoTWFwIHByb2Nlc3NNZXNzYWdlUmVjZWl2ZXJzKENsYXNzTG9hZGVyIGxvYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTUVsZW1lbnQgZWxlbWVudCkgdGhyb3dzIERlcGxveW1lbnRFeGNlcHRpb24gewotICAgICAgICBIYXNoTWFwIG1lcHMgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICBJdGVyYXRvciBpdGVyYXRvciA9IGVsZW1lbnQuZ2V0Q2hpbGRyZW5XaXRoTmFtZShuZXcgUU5hbWUoCi0gICAgICAgICAgICAgICAgVEFHX01FU1NBR0VfUkVDRUlWRVIpKTsKLSAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgT01FbGVtZW50IHJlY2VpdmVyRWxlbWVudCA9IChPTUVsZW1lbnQpIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgIE1lc3NhZ2VSZWNlaXZlciByZWNlaXZlciA9IGxvYWRNZXNzYWdlUmVjZWl2ZXIobG9hZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZlckVsZW1lbnQpOwotICAgICAgICAgICAgT01BdHRyaWJ1dGUgbWVwQXR0ID0gcmVjZWl2ZXJFbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgIC5nZXRBdHRyaWJ1dGUobmV3IFFOYW1lKFRBR19NRVApKTsKLSAgICAgICAgICAgIG1lcHMucHV0KG1lcEF0dC5nZXRBdHRyaWJ1dGVWYWx1ZSgpLCByZWNlaXZlcik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1lcHM7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIE1lc3NhZ2VSZWNlaXZlciBsb2FkTWVzc2FnZVJlY2VpdmVyKENsYXNzTG9hZGVyIGxvYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01FbGVtZW50IGVsZW1lbnQpIHRocm93cyBEZXBsb3ltZW50RXhjZXB0aW9uIHsKLSAgICAgICAgT01BdHRyaWJ1dGUgcmVjZWl2ZXJOYW1lID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUobmV3IFFOYW1lKAotICAgICAgICAgICAgICAgIFRBR19DTEFTU19OQU1FKSk7Ci0gICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSByZWNlaXZlck5hbWUuZ2V0QXR0cmlidXRlVmFsdWUoKTsKLSAgICAgICAgTWVzc2FnZVJlY2VpdmVyIHJlY2VpdmVyID0gbnVsbDsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgQ2xhc3MgbWVzc2FnZVJlY2VpdmVyOwotCi0gICAgICAgICAgICBpZiAoKGNsYXNzTmFtZSAhPSBudWxsKSAmJiAhIiIuZXF1YWxzKGNsYXNzTmFtZSkpIHsKLSAgICAgICAgICAgICAgICBtZXNzYWdlUmVjZWl2ZXIgPSBMb2FkZXIubG9hZENsYXNzKGxvYWRlciwgY2xhc3NOYW1lKTsKLSAgICAgICAgICAgICAgICByZWNlaXZlciA9IChNZXNzYWdlUmVjZWl2ZXIpIG1lc3NhZ2VSZWNlaXZlci5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoCi0gICAgICAgICAgICAgICAgICAgIERlcGxveW1lbnRFcnJvck1zZ3MuRVJST1JfSU5fTE9BRElOR19NRVNTQUdFX1JFQ0VJVkVSLAotICAgICAgICAgICAgICAgICAgICAiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiIsIGNsYXNzTmFtZSksIGUpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoCi0gICAgICAgICAgICAgICAgICAgIERlcGxveW1lbnRFcnJvck1zZ3MuRVJST1JfSU5fTE9BRElOR19NRVNTQUdFX1JFQ0VJVkVSLAotICAgICAgICAgICAgICAgICAgICAiSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiIsIGNsYXNzTmFtZSksIGUpOwotICAgICAgICB9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoCi0gICAgICAgICAgICAgICAgICAgIERlcGxveW1lbnRFcnJvck1zZ3MuRVJST1JfSU5fTE9BRElOR19NRVNTQUdFX1JFQ0VJVkVSLAotICAgICAgICAgICAgICAgICAgICAiSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiIsIGNsYXNzTmFtZSksIGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlY2VpdmVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByb2Nlc3NlcyB0aGUgbWVzc2FnZSBidWlsZGVycyBzcGVjaWZpZWQgaW4gYXhpczIueG1sIG9yIHNlcnZpY2VzLnhtbC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXNzYWdlQnVpbGRlcnNFbGVtZW50Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIEhhc2hNYXAgcHJvY2Vzc01lc3NhZ2VCdWlsZGVycyhPTUVsZW1lbnQgbWVzc2FnZUJ1aWxkZXJzRWxlbWVudCkKLSAgICAgICAgICAgIHRocm93cyBEZXBsb3ltZW50RXhjZXB0aW9uIHsKLSAgICAgICAgSGFzaE1hcCBidWlsZGVyU2VsZWN0b3IgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICBJdGVyYXRvciBtc2dCdWlsZGVycyA9IG1lc3NhZ2VCdWlsZGVyc0VsZW1lbnQKLSAgICAgICAgICAgICAgICAuZ2V0Q2hpbGRyZW5XaXRoTmFtZShuZXcgUU5hbWUoVEFHX01FU1NBR0VfQlVJTERFUikpOwotICAgICAgICB3aGlsZSAobXNnQnVpbGRlcnMuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgbXNnQnVpbGRlckVsZW1lbnQgPSAoT01FbGVtZW50KSBtc2dCdWlsZGVycy5uZXh0KCk7Ci0gICAgICAgICAgICBPTUF0dHJpYnV0ZSBidWlsZGVyTmFtZSA9IG1zZ0J1aWxkZXJFbGVtZW50LmdldEF0dHJpYnV0ZShuZXcgUU5hbWUoVEFHX0NMQVNTX05BTUUpKTsKLSAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBidWlsZGVyTmFtZS5nZXRBdHRyaWJ1dGVWYWx1ZSgpOwotICAgICAgICAgICAgQ2xhc3MgYnVpbGRlckNsYXNzID0gbnVsbDsKLSAgICAgICAgICAgIEJ1aWxkZXIgYnVpbGRlck9iamVjdDsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlckNsYXNzID0gZmluZEFuZFZhbGlkYXRlU2VsZWN0b3JDbGFzcyhjbGFzc05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXBsb3ltZW50RXJyb3JNc2dzLkVSUk9SX0xPQURJTkdfTUVTU0FHRV9CVUlMREVSKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyT2JqZWN0ID0gKEJ1aWxkZXIpIGJ1aWxkZXJDbGFzcy5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgfSBjYXRjaCAoUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgKERlcGxveW1lbnRFeGNlcHRpb24pIGUuZ2V0RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgaW5zdGFudGlhdGUgdGhlIHNwZWNpZmllZCBCdWlsZGVyIENsYXNzICA6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBidWlsZGVyQ2xhc3MuZ2V0TmFtZSgpICsgIi4iLCBlKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCBpbnN0YW50aWF0ZSB0aGUgc3BlY2lmaWVkIEJ1aWxkZXIgQ2xhc3MgOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgYnVpbGRlckNsYXNzLmdldE5hbWUoKSArICIuIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBPTUF0dHJpYnV0ZSBjb250ZW50VHlwZUF0dCA9IG1zZ0J1aWxkZXJFbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgIC5nZXRBdHRyaWJ1dGUobmV3IFFOYW1lKFRBR19DT05URU5UX1RZUEUpKTsKLSAgICAgICAgICAgIGJ1aWxkZXJTZWxlY3Rvci5wdXQoY29udGVudFR5cGVBdHQuZ2V0QXR0cmlidXRlVmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlck9iamVjdCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJ1aWxkZXJTZWxlY3RvcjsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFByb2Nlc3NlcyB0aGUgbWVzc2FnZSBidWlsZGVycyBzcGVjaWZpZWQgaW4gYXhpczIueG1sIG9yIHNlcnZpY2VzLnhtbC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgSGFzaE1hcCBwcm9jZXNzTWVzc2FnZUZvcm1hdHRlcnMoT01FbGVtZW50IG1lc3NhZ2VGb3JtYXR0ZXJzRWxlbWVudCkKLSAgICAgICAgICAgIHRocm93cyBEZXBsb3ltZW50RXhjZXB0aW9uIHsKLSAgICAgICAgSGFzaE1hcCBtZXNzYWdlRm9ybWF0dGVycyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIEl0ZXJhdG9yIG1zZ0Zvcm1hdHRlcnMgPSBtZXNzYWdlRm9ybWF0dGVyc0VsZW1lbnQKLSAgICAgICAgICAgICAgICAuZ2V0Q2hpbGRyZW5XaXRoTmFtZShuZXcgUU5hbWUoVEFHX01FU1NBR0VfRk9STUFUVEVSKSk7Ci0gICAgICAgIHdoaWxlIChtc2dGb3JtYXR0ZXJzLmhhc05leHQoKSkgewotICAgICAgICAgICAgT01FbGVtZW50IG1zZ0Zvcm1hdHRlckVsZW1lbnQgPSAoT01FbGVtZW50KSBtc2dGb3JtYXR0ZXJzLm5leHQoKTsKLSAgICAgICAgICAgIE9NRWxlbWVudCB0ZW1wTXNnRm9ybWF0dGVyID0gbXNnRm9ybWF0dGVyRWxlbWVudDsKLSAgICAgICAgICAgIE9NQXR0cmlidXRlIGZvcm1hdHRlck5hbWUgPSB0ZW1wTXNnRm9ybWF0dGVyLmdldEF0dHJpYnV0ZShuZXcgUU5hbWUoVEFHX0NMQVNTX05BTUUpKTsKLSAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBmb3JtYXR0ZXJOYW1lLmdldEF0dHJpYnV0ZVZhbHVlKCk7Ci0gICAgICAgICAgICBNZXNzYWdlRm9ybWF0dGVyIGZvcm1hdHRlck9iamVjdDsKLSAgICAgICAgICAgIENsYXNzIGZvcm1hdHRlckNsYXNzID0gbnVsbDsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgZm9ybWF0dGVyQ2xhc3MgPSBmaW5kQW5kVmFsaWRhdGVTZWxlY3RvckNsYXNzKGNsYXNzTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVwbG95bWVudEVycm9yTXNncy5FUlJPUl9MT0FESU5HX01FU1NBR0VfRk9STUFUVEVSKTsKLSAgICAgICAgICAgICAgICBmb3JtYXR0ZXJPYmplY3QgPSAoTWVzc2FnZUZvcm1hdHRlcikgZm9ybWF0dGVyQ2xhc3MubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IChEZXBsb3ltZW50RXhjZXB0aW9uKSBlLmdldEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IGluc3RhbnRpYXRlIHRoZSBzcGVjaWZpZWQgRm9ybWF0dGVyIENsYXNzICA6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBmb3JtYXR0ZXJDbGFzcy5nZXROYW1lKCkgKyAiLiIsIGUpOwotICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IGluc3RhbnRpYXRlIHRoZSBzcGVjaWZpZWQgRm9ybWF0dGVyIENsYXNzIDogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGZvcm1hdHRlckNsYXNzLmdldE5hbWUoKSArICIuIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBPTUF0dHJpYnV0ZSBjb250ZW50VHlwZUF0dCA9IG1zZ0Zvcm1hdHRlckVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgLmdldEF0dHJpYnV0ZShuZXcgUU5hbWUoVEFHX0NPTlRFTlRfVFlQRSkpOwotICAgICAgICAgICAgbWVzc2FnZUZvcm1hdHRlcnMucHV0KGNvbnRlbnRUeXBlQXR0LmdldEF0dHJpYnV0ZVZhbHVlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0dGVyT2JqZWN0KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbWVzc2FnZUZvcm1hdHRlcnM7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIENsYXNzIGZpbmRBbmRWYWxpZGF0ZVNlbGVjdG9yQ2xhc3MoZmluYWwgU3RyaW5nIGNsYXNzTmFtZSwgZmluYWwgU3RyaW5nIGVycm9yTXNnKQotICAgICAgICAgICAgdGhyb3dzIFByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gKENsYXNzKSBvcmcuYXBhY2hlLmF4aXMyLmphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcgotICAgICAgICAgICAgICAgIC5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LkRlcGxveW1lbnRFeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3Mgc2VsZWN0b3JDbGFzczsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChjbGFzc05hbWUgIT0gbnVsbCkgJiYgISIiLmVxdWFscyhjbGFzc05hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yQ2xhc3MgPSBMb2FkZXIubG9hZENsYXNzKFRocmVhZC5jdXJyZW50VGhyZWFkKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCksIGNsYXNzTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZShlcnJvck1zZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBDbGFzcyBOYW1lIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKGVycm9yTXNnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNsYXNzTm90Rm91bmRFeGNlcHRpb24iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lKSwgZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZWN0b3JDbGFzczsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByb2Nlc3NlcyBmbG93IGVsZW1lbnRzIGluIHNlcnZpY2VzLnhtbCAuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZmxvd2VsZW1lbnQgPGNvZGU+T01FbGVtZW50PC9jb2RlPgotICAgICAqIEByZXR1cm4gUmV0dXJucyBGbG93LgotICAgICAqIEB0aHJvd3MgRGVwbG95bWVudEV4Y2VwdGlvbiA8Y29kZT5EZXBsb3ltZW50RXhjZXB0aW9uPC9jb2RlPgotICAgICAqLwotICAgIHByb3RlY3RlZCBGbG93IHByb2Nlc3NGbG93KE9NRWxlbWVudCBmbG93ZWxlbWVudCwgUGFyYW1ldGVySW5jbHVkZSBwYXJlbnQpCi0gICAgICAgICAgICB0aHJvd3MgRGVwbG95bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIEZsb3cgZmxvdyA9IG5ldyBGbG93KCk7Ci0KLSAgICAgICAgaWYgKGZsb3dlbGVtZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBmbG93OwotICAgICAgICB9Ci0KLSAgICAgICAgSXRlcmF0b3IgaGFuZGxlcnMgPSBmbG93ZWxlbWVudC5nZXRDaGlsZHJlbldpdGhOYW1lKG5ldyBRTmFtZSgKLSAgICAgICAgICAgICAgICBUQUdfSEFORExFUikpOwotCi0gICAgICAgIHdoaWxlIChoYW5kbGVycy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBoYW5kbGVyRWxlbWVudCA9IChPTUVsZW1lbnQpIGhhbmRsZXJzLm5leHQoKTsKLQotICAgICAgICAgICAgZmxvdy5hZGRIYW5kbGVyKHByb2Nlc3NIYW5kbGVyKGhhbmRsZXJFbGVtZW50LCBwYXJlbnQpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmbG93OwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmdbXSBwcm9jZXNzU3VwcG9ydGVkUG9saWN5TmFtZXNwYWNlcygKLSAgICAgICAgICAgIE9NRWxlbWVudCBzdXBwb3J0ZWRQb2xpY3lFbGVtZW50cykgewotICAgICAgICBPTUF0dHJpYnV0ZSBuYW1lc3BhY2VzID0gc3VwcG9ydGVkUG9saWN5RWxlbWVudHMKLSAgICAgICAgICAgICAgICAuZ2V0QXR0cmlidXRlKG5ldyBRTmFtZShUQUdfTkFNRVNQQUNFUykpOwotICAgICAgICBpZiAobmFtZXNwYWNlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBuYW1lc3BhY2VzLmdldEF0dHJpYnV0ZVZhbHVlKCk7Ci0gICAgICAgICAgICBpZiAodmFsdWUudHJpbSgpLmxlbmd0aCgpICE9IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUuc3BsaXQoIiAiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgUU5hbWVbXSBnZXRMb2NhbFBvbGljeUFzc2VydGlvbk5hbWVzKE9NRWxlbWVudCBsb2NhbFBvbGljeUFzc2VydGlvbnNFbGVtZW50KSB7Ci0KLSAgICAgICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBsb2NhbFBvbGljeUFzc2VydGlvbnNFbGVtZW50LmdldENoaWxkRWxlbWVudHMoKTsKLSAgICAgICAgaWYgKCEgaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIEFycmF5TGlzdCBxbmFtZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIE9NRWxlbWVudCBjaGlsZEVsZW1lbnQ7Ci0KLSAgICAgICAgZm9yICg7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIGNoaWxkRWxlbWVudCA9IChPTUVsZW1lbnQpIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgIHFuYW1lcy5hZGQoY2hpbGRFbGVtZW50LmdldFFOYW1lKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgUU5hbWVbXSBidWZmZXIgPSBuZXcgUU5hbWVbcW5hbWVzLnNpemUoKV07Ci0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkocW5hbWVzLnRvQXJyYXkoKSwgMCwgYnVmZmVyLCAwLCBxbmFtZXMuc2l6ZSgpKTsKLSAgICAgICAgcmV0dXJuIGJ1ZmZlcjsKLQotICAgIH0KLQotICAgIHByb3RlY3RlZCBIYW5kbGVyRGVzY3JpcHRpb24gcHJvY2Vzc0hhbmRsZXIoT01FbGVtZW50IGhhbmRsZXJfZWxlbWVudCwgUGFyYW1ldGVySW5jbHVkZSBwYXJlbnQpCi0gICAgICAgICAgICB0aHJvd3MgRGVwbG95bWVudEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmV0dXJuIHByb2Nlc3NIYW5kbGVyKGhhbmRsZXJfZWxlbWVudCwgcGFyZW50LCBudWxsKTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogUHJvY2Vzc2VzIEhhbmRsZXIgZWxlbWVudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBoYW5kbGVyX2VsZW1lbnQgPGNvZGU+T01FbGVtZW50PC9jb2RlPgotICAgICAqIEByZXR1cm4gUmV0dXJucyBIYW5kbGVyRGVzY3JpcHRpb24uCi0gICAgICogQHRocm93cyBEZXBsb3ltZW50RXhjZXB0aW9uIDxjb2RlPkRlcGxveW1lbnRFeGNlcHRpb248L2NvZGU+Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIEhhbmRsZXJEZXNjcmlwdGlvbiBwcm9jZXNzSGFuZGxlcihPTUVsZW1lbnQgaGFuZGxlcl9lbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1ldGVySW5jbHVkZSBwYXJlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY29udGFpbmluZ1BoYXNlKQotICAgICAgICAgICAgdGhyb3dzIERlcGxveW1lbnRFeGNlcHRpb24gewotCi0gICAgICAgIC8vIFNldHRpbmcgaGFuZGxlciBuYW1lCi0gICAgICAgIE9NQXR0cmlidXRlIG5hbWVfYXR0cmlidXRlID0gaGFuZGxlcl9lbGVtZW50LmdldEF0dHJpYnV0ZShuZXcgUU5hbWUoCi0gICAgICAgICAgICAgICAgQVRUUklCVVRFX05BTUUpKTsKLQotICAgICAgICBpZiAobmFtZV9hdHRyaWJ1dGUgPT0gbnVsbCB8fCBuYW1lX2F0dHJpYnV0ZS5nZXRBdHRyaWJ1dGVWYWx1ZSgpLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoCi0gICAgICAgICAgICAgICAgICAgIERlcGxveW1lbnRFcnJvck1zZ3MuSU5WQUxJRF9IQU5ETEVSLCAiVW5rbm93biIsICJOYW1lIG1pc3NpbmciKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBIYW5kbGVyRGVzY3JpcHRpb24gaGFuZGxlciA9IG5ldyBIYW5kbGVyRGVzY3JpcHRpb24obmFtZV9hdHRyaWJ1dGUuZ2V0QXR0cmlidXRlVmFsdWUoKSk7Ci0KLSAgICAgICAgLy8gU2V0dGluZyBoYW5kbGVyIGNsYXNzIG5hbWUKLSAgICAgICAgT01BdHRyaWJ1dGUgY2xhc3NfYXR0cmlidXRlID0gaGFuZGxlcl9lbGVtZW50LmdldEF0dHJpYnV0ZShuZXcgUU5hbWUoCi0gICAgICAgICAgICAgICAgVEFHX0NMQVNTX05BTUUpKTsKLQotICAgICAgICBpZiAoY2xhc3NfYXR0cmlidXRlID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKChNZXNzYWdlcy5nZXRNZXNzYWdlKAotICAgICAgICAgICAgICAgICAgICBEZXBsb3ltZW50RXJyb3JNc2dzLklOVkFMSURfSEFORExFUiwgbmFtZV9hdHRyaWJ1dGUuZ2V0QXR0cmlidXRlVmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgICAgImNsYXNzIG5hbWUgaXMgbWlzc2luZyIpKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBoYW5kbGVyLnNldENsYXNzTmFtZShjbGFzc19hdHRyaWJ1dGUuZ2V0QXR0cmlidXRlVmFsdWUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBwcm9jZXNzaW5nIHBoYXNlIHJ1bGVzIChvcmRlcikKLSAgICAgICAgT01FbGVtZW50IG9yZGVyX2VsZW1lbnQgPSBoYW5kbGVyX2VsZW1lbnQKLSAgICAgICAgICAgICAgICAuZ2V0Rmlyc3RDaGlsZFdpdGhOYW1lKG5ldyBRTmFtZShUQUdfT1JERVIpKTsKLQotICAgICAgICBQaGFzZVJ1bGUgcnVsZXMgPSBoYW5kbGVyLmdldFJ1bGVzKCk7Ci0gICAgICAgIGlmIChvcmRlcl9lbGVtZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChjb250YWluaW5nUGhhc2UgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIFRPRE8gOiBJbmNsdWRlIG1vcmUgaW5mb3JtYXRpb24gKHdoaWNoIGhhbmRsZXI/KSBpbiBtZXNzYWdlIQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKChNZXNzYWdlcy5nZXRNZXNzYWdlKAotICAgICAgICAgICAgICAgICAgICAgICAgRGVwbG95bWVudEVycm9yTXNncy5JTlZBTElEX0hBTkRMRVIsIG5hbWVfYXR0cmlidXRlLmdldEF0dHJpYnV0ZVZhbHVlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAicGhhc2UgcnVsZSBoYXMgbm90IGJlZW4gc3BlY2lmaWVkIikpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJ1bGVzLnNldFBoYXNlTmFtZShjb250YWluaW5nUGhhc2UpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgSXRlcmF0b3Igb3JkZXJfaXRyID0gb3JkZXJfZWxlbWVudC5nZXRBbGxBdHRyaWJ1dGVzKCk7Ci0KLSAgICAgICAgICAgIHdoaWxlIChvcmRlcl9pdHIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgT01BdHRyaWJ1dGUgb3JkZXJBdHRyaWJ1dGUgPSAoT01BdHRyaWJ1dGUpIG9yZGVyX2l0ci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBvcmRlckF0dHJpYnV0ZS5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IG9yZGVyQXR0cmlidXRlLmdldEF0dHJpYnV0ZVZhbHVlKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoVEFHX0FGVEVSLmVxdWFscyhuYW1lKSkgewotICAgICAgICAgICAgICAgICAgICBydWxlcy5zZXRBZnRlcih2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChUQUdfQkVGT1JFLmVxdWFscyhuYW1lKSkgewotICAgICAgICAgICAgICAgICAgICBydWxlcy5zZXRCZWZvcmUodmFsdWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoVEFHX1BIQVNFLmVxdWFscyhuYW1lKSkgewotICAgICAgICAgICAgICAgICAgICBydWxlcy5zZXRQaGFzZU5hbWUodmFsdWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoVEFHX1BIQVNFX0ZJUlNULmVxdWFscyhuYW1lKSkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYm9vbHZhbCA9IGdldFZhbHVlKHZhbHVlKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoYm9vbHZhbC5lcXVhbHMoQk9PTEVBTl9UUlVFKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcnVsZXMuc2V0UGhhc2VGaXJzdCh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChib29sdmFsLmVxdWFscyhCT09MRUFOX0ZBTFNFKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcnVsZXMuc2V0UGhhc2VGaXJzdChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFRBR19QSEFTRV9MQVNULmVxdWFscyhuYW1lKSkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYm9vbHZhbCA9IGdldFZhbHVlKHZhbHVlKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoYm9vbHZhbC5lcXVhbHMoQk9PTEVBTl9UUlVFKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcnVsZXMuc2V0UGhhc2VMYXN0KHRydWUpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJvb2x2YWwuZXF1YWxzKEJPT0xFQU5fRkFMU0UpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBydWxlcy5zZXRQaGFzZUxhc3QoZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBJdGVyYXRvciBwYXJhbWV0ZXJzID0gaGFuZGxlcl9lbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgIC5nZXRDaGlsZHJlbldpdGhOYW1lKG5ldyBRTmFtZShUQUdfUEFSQU1FVEVSKSk7Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcHJvY2Vzc1BhcmFtZXRlcnMocGFyYW1ldGVycywgaGFuZGxlciwgcGFyZW50KTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBheGlzRmF1bHQpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEV4Y2VwdGlvbihheGlzRmF1bHQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaGFuZGxlci5zZXRQYXJlbnQocGFyZW50KTsKLQotICAgICAgICByZXR1cm4gaGFuZGxlcjsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzT3BlcmF0aW9uTW9kdWxlUmVmcyhJdGVyYXRvciBtb2R1bGVSZWZzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF4aXNPcGVyYXRpb24gb3BlcmF0aW9uKSB0aHJvd3MgRGVwbG95bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB3aGlsZSAobW9kdWxlUmVmcy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBPTUVsZW1lbnQgbW9kdWxlcmVmID0gKE9NRWxlbWVudCkgbW9kdWxlUmVmcy5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgT01BdHRyaWJ1dGUgbW9kdWxlUmVmQXR0cmlidXRlID0gbW9kdWxlcmVmCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0QXR0cmlidXRlKG5ldyBRTmFtZShUQUdfUkVGRVJFTkNFKSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAobW9kdWxlUmVmQXR0cmlidXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlZk5hbWUgPSBtb2R1bGVSZWZBdHRyaWJ1dGUuZ2V0QXR0cmlidXRlVmFsdWUoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoYXhpc0NvbmZpZy5nZXRNb2R1bGUocmVmTmFtZSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVwbG95bWVudEVycm9yTXNncy5NT0RVTEVfTk9UX0ZPVU5ELCByZWZOYW1lKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24uYWRkTW9kdWxlKHJlZk5hbWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgYXhpc0ZhdWx0KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKAotICAgICAgICAgICAgICAgICAgICBEZXBsb3ltZW50RXJyb3JNc2dzLk1PRFVMRV9OT1RfRk9VTkQsIGF4aXNGYXVsdAotICAgICAgICAgICAgICAgICAgICAuZ2V0TWVzc2FnZSgpKSwgYXhpc0ZhdWx0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIFBhcmFtZXRlciBvYmplY3QgZnJvbSB0aGUgT00uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGFyYW1ldGVycyAgICAgICA8Y29kZT5QYXJhbWV0ZXI8L2NvZGU+Ci0gICAgICogQHBhcmFtIHBhcmFtZXRlckluY2x1ZGUgPGNvZGU+UGFyYW1ldGVySW5jbHVkZTwvY29kZT4KLSAgICAgKiBAcGFyYW0gcGFyZW50ICAgICAgICAgICA8Y29kZT5QYXJhbWV0ZXJJbmNsdWRlPC9jb2RlPgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NQYXJhbWV0ZXJzKEl0ZXJhdG9yIHBhcmFtZXRlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1ldGVySW5jbHVkZSBwYXJhbWV0ZXJJbmNsdWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtZXRlckluY2x1ZGUgcGFyZW50KQotICAgICAgICAgICAgdGhyb3dzIERlcGxveW1lbnRFeGNlcHRpb24gewotICAgICAgICB3aGlsZSAocGFyYW1ldGVycy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIC8vIHRoaXMgaXMgdG8gY2hlY2sgd2hldGhlciBzb21lIG9uZSBoYXMgbG9ja2VkIHRoZSBwYXJtZXRlciBhdCB0aGUKLSAgICAgICAgICAgIC8vIHRvcCBsZXZlbAotICAgICAgICAgICAgT01FbGVtZW50IHBhcmFtZXRlckVsZW1lbnQgPSAoT01FbGVtZW50KSBwYXJhbWV0ZXJzLm5leHQoKTsKLSAgICAgICAgICAgIFBhcmFtZXRlciBwYXJhbWV0ZXIgPSBuZXcgUGFyYW1ldGVyKCk7Ci0gICAgICAgICAgICAvLyBzZXR0aW5nIHBhcmFtZXRlckVsZW1lbnQKLSAgICAgICAgICAgIHBhcmFtZXRlci5zZXRQYXJhbWV0ZXJFbGVtZW50KHBhcmFtZXRlckVsZW1lbnQpOwotICAgICAgICAgICAgLy8gc2V0dGluZyBwYXJhbWV0ZXIgTmFtZQotICAgICAgICAgICAgT01BdHRyaWJ1dGUgcGFyYW1OYW1lID0gcGFyYW1ldGVyRWxlbWVudC5nZXRBdHRyaWJ1dGUobmV3IFFOYW1lKEFUVFJJQlVURV9OQU1FKSk7Ci0gICAgICAgICAgICBpZiAocGFyYW1OYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKAotICAgICAgICAgICAgICAgICAgICAgICAgRGVwbG95bWVudEVycm9yTXNncy5CQURfUEFSQU1FVEVSX0FSR1VNRU5ULAotICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyRWxlbWVudC50b1N0cmluZygpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwYXJhbWV0ZXIuc2V0TmFtZShwYXJhbU5hbWUuZ2V0QXR0cmlidXRlVmFsdWUoKSk7Ci0gICAgICAgICAgICAvLyBzZXR0aW5nIHBhcmFtZXRlciBWYWx1ZSAodGhlIGNoaWxkIGVsZW1lbnQgb2YgdGhlIHBhcmFtZXRlcikKLSAgICAgICAgICAgIE9NRWxlbWVudCBwYXJhbVZhbHVlID0gcGFyYW1ldGVyRWxlbWVudC5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgICAgICAgIGlmIChwYXJhbVZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBwYXJhbWV0ZXIuc2V0VmFsdWUocGFyYW1ldGVyRWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgcGFyYW1ldGVyLnNldFBhcmFtZXRlclR5cGUoUGFyYW1ldGVyLk9NX1BBUkFNRVRFUik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFN0cmluZyBwYXJhdGV4dFZhbHVlID0gcGFyYW1ldGVyRWxlbWVudC5nZXRUZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICBwYXJhbWV0ZXIuc2V0VmFsdWUocGFyYXRleHRWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcGFyYW1ldGVyLnNldFBhcmFtZXRlclR5cGUoUGFyYW1ldGVyLlRFWFRfUEFSQU1FVEVSKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIHNldHRpbmcgbG9ja2luZyBhdHRyaWJ1dGUKLSAgICAgICAgICAgIE9NQXR0cmlidXRlIHBhcmFtTG9ja2VkID0gcGFyYW1ldGVyRWxlbWVudC5nZXRBdHRyaWJ1dGUobmV3IFFOYW1lKAotICAgICAgICAgICAgICAgICAgICBBVFRSSUJVVEVfTE9DS0VEKSk7Ci0gICAgICAgICAgICBQYXJhbWV0ZXIgcGFyZW50UGFyYW0gPSBudWxsOwotICAgICAgICAgICAgaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcGFyZW50UGFyYW0gPSBwYXJlbnQuZ2V0UGFyYW1ldGVyKHBhcmFtZXRlci5nZXROYW1lKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHBhcmFtTG9ja2VkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbG9ja2VkVmFsdWUgPSBwYXJhbUxvY2tlZC5nZXRBdHRyaWJ1dGVWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGlmIChCT09MRUFOX1RSVUUuZXF1YWxzKGxvY2tlZFZhbHVlKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgcGFyYW1ldGVyIGlzIGxvY2tlZCBhdCBzb21lIGxldmVsIHBhcmFtZXRlciB2YWx1ZQotICAgICAgICAgICAgICAgICAgICAvLyByZXBsYWNlIGJ5IHRoYXQKLSAgICAgICAgICAgICAgICAgICAgaWYgKChwYXJlbnQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBwYXJlbnQuaXNQYXJhbWV0ZXJMb2NrZWQocGFyYW1ldGVyLmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlcGxveW1lbnRFcnJvck1zZ3MuQ09ORklHX05PVF9GT1VORCwgcGFyYW1ldGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXROYW1lKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlci5zZXRMb2NrZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIuc2V0TG9ja2VkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoKHBhcmVudFBhcmFtID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgIXBhcmVudC5pc1BhcmFtZXRlckxvY2tlZChwYXJhbWV0ZXIuZ2V0TmFtZSgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVySW5jbHVkZS5hZGRQYXJhbWV0ZXIocGFyYW1ldGVyKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlckluY2x1ZGUuYWRkUGFyYW1ldGVyKHBhcmFtZXRlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGF4aXNGYXVsdCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKGF4aXNGYXVsdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQb3B1bGF0ZSB0aGUgQXhpc09wZXJhdGlvbiB3aXRoIGRldGFpbHMgZnJvbSB0aGUgYWN0aW9uTWFwcGluZywKLSAgICAgKiBvdXRwdXRBY3Rpb25NYXBwaW5nIGFuZCBmYXVsdEFjdGlvbk1hcHBpbmcgZWxlbWVudHMgZnJvbSB0aGUgb3BlcmF0aW9uCi0gICAgICogZWxlbWVudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvcGVyYXRpb24KLSAgICAgKiBAcGFyYW0gb3BfZGVzY3JpcAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NBY3Rpb25NYXBwaW5ncyhPTUVsZW1lbnQgb3BlcmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBeGlzT3BlcmF0aW9uIG9wX2Rlc2NyaXApIHsKLSAgICAgICAgSXRlcmF0b3IgbWFwcGluZ0l0ZXJhdG9yID0gb3BlcmF0aW9uLmdldENoaWxkcmVuV2l0aE5hbWUobmV3IFFOYW1lKAotICAgICAgICAgICAgICAgIENvbnN0YW50cy5BQ1RJT05fTUFQUElORykpOwotICAgICAgICBBcnJheUxpc3QgbWFwcGluZ0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIHdoaWxlIChtYXBwaW5nSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgbWFwcGluZ0VsZW1lbnQgPSAoT01FbGVtZW50KSBtYXBwaW5nSXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgU3RyaW5nIGlucHV0QWN0aW9uU3RyaW5nID0gbWFwcGluZ0VsZW1lbnQuZ2V0VGV4dCgpLnRyaW0oKTsKLSAgICAgICAgICAgIGlmIChsb2cuaXNUcmFjZUVuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy50cmFjZSgiSW5wdXQgQWN0aW9uIE1hcHBpbmcgZm91bmQ6ICIgKyBpbnB1dEFjdGlvblN0cmluZyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoISIiLmVxdWFscyhpbnB1dEFjdGlvblN0cmluZykpIHsKLSAgICAgICAgICAgICAgICBtYXBwaW5nTGlzdC5hZGQoaW5wdXRBY3Rpb25TdHJpbmcpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLnRyYWNlKCJaZXJvIGxlbmd0aCBpbnB1dCBhY3Rpb24gc3RyaW5nIGZvdW5kLiBOb3QgYWRkZWQgdG8gbWFwcGluZyIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBvcF9kZXNjcmlwLnNldFdzYW1hcHBpbmdMaXN0KG1hcHBpbmdMaXN0KTsKLQotICAgICAgICBPTUVsZW1lbnQgb3V0cHV0QWN0aW9uID0gb3BlcmF0aW9uLmdldEZpcnN0Q2hpbGRXaXRoTmFtZShuZXcgUU5hbWUoCi0gICAgICAgICAgICAgICAgQ29uc3RhbnRzLk9VVFBVVF9BQ1RJT05fTUFQUElORykpOwotICAgICAgICBpZiAoKG91dHB1dEFjdGlvbiAhPSBudWxsKSAmJiAob3V0cHV0QWN0aW9uLmdldFRleHQoKSAhPSBudWxsKSkgewotICAgICAgICAgICAgU3RyaW5nIG91dHB1dEFjdGlvblN0cmluZyA9IG91dHB1dEFjdGlvbi5nZXRUZXh0KCkudHJpbSgpOwotICAgICAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLnRyYWNlKCJPdXRwdXQgQWN0aW9uIE1hcHBpbmcgZm91bmQ6ICIgKyBvdXRwdXRBY3Rpb25TdHJpbmcpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgb3BfZGVzY3JpcC5zZXRPdXRwdXRBY3Rpb24ob3V0cHV0QWN0aW9uU3RyaW5nKTsKLSAgICAgICAgfQotICAgICAgICBJdGVyYXRvciBmYXVsdEFjdGlvbnNJdGVyYXRvciA9IG9wZXJhdGlvbgotICAgICAgICAgICAgICAgIC5nZXRDaGlsZHJlbldpdGhOYW1lKG5ldyBRTmFtZShDb25zdGFudHMuRkFVTFRfQUNUSU9OX01BUFBJTkcpKTsKLSAgICAgICAgd2hpbGUgKGZhdWx0QWN0aW9uc0l0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgT01FbGVtZW50IGZhdWx0TWFwcGluZ0VsZW1lbnQgPSAoT01FbGVtZW50KSBmYXVsdEFjdGlvbnNJdGVyYXRvcgotICAgICAgICAgICAgICAgICAgICAubmV4dCgpOwotICAgICAgICAgICAgU3RyaW5nIGZhdWx0QWN0aW9uU3RyaW5nID0gZmF1bHRNYXBwaW5nRWxlbWVudC5nZXRUZXh0KCkudHJpbSgpOwotICAgICAgICAgICAgU3RyaW5nIGZhdWx0QWN0aW9uTmFtZSA9IGZhdWx0TWFwcGluZ0VsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgLmdldEF0dHJpYnV0ZVZhbHVlKG5ldyBRTmFtZShDb25zdGFudHMuRkFVTFRfQUNUSU9OX05BTUUpKTsKLSAgICAgICAgICAgIGlmIChmYXVsdEFjdGlvbk5hbWUgIT0gbnVsbCAmJiBmYXVsdEFjdGlvblN0cmluZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy50cmFjZSgiRmF1bHQgQWN0aW9uIE1hcHBpbmcgZm91bmQ6ICIgKyBmYXVsdEFjdGlvbk5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsICIgKyBmYXVsdEFjdGlvblN0cmluZyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG9wX2Rlc2NyaXAuYWRkRmF1bHRBY3Rpb24oZmF1bHRBY3Rpb25OYW1lLCBmYXVsdEFjdGlvblN0cmluZyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzUG9saWN5RWxlbWVudHMoSXRlcmF0b3IgcG9saWN5RWxlbWVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvbGljeVN1YmplY3QgcG9saWN5U3ViamVjdCkgewotICAgICAgICB3aGlsZSAocG9saWN5RWxlbWVudHMuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBQb2xpY3kgcCA9IFBvbGljeUVuZ2luZQotICAgICAgICAgICAgICAgICAgICAuZ2V0UG9saWN5KChPTUVsZW1lbnQpIHBvbGljeUVsZW1lbnRzLm5leHQoKSk7Ci0gICAgICAgICAgICBwb2xpY3lTdWJqZWN0LmF0dGFjaFBvbGljeShwKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NQb2xpY3lSZWZFbGVtZW50cyhJdGVyYXRvciBwb2xpY3lSZWZFbGVtZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9saWN5U3ViamVjdCBwb2xpY3lTdWJqZWN0KSB7Ci0gICAgICAgIHdoaWxlIChwb2xpY3lSZWZFbGVtZW50cy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIFBvbGljeVJlZmVyZW5jZSBwb2xpY3lSZWZlcmVuY2UgPSBQb2xpY3lFbmdpbmUKLSAgICAgICAgICAgICAgICAgICAgLmdldFBvbGljeVJlZmVyZW5jZSgoT01FbGVtZW50KSBwb2xpY3lSZWZFbGVtZW50cy5uZXh0KCkpOwotICAgICAgICAgICAgcG9saWN5U3ViamVjdC5hdHRhY2hQb2xpY3lSZWZlcmVuY2UocG9saWN5UmVmZXJlbmNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHNob3J0IGZpbGUgbmFtZS4gU2hvcnQgZmlsZSBuYW1lIGlzIHRoZSBuYW1lIGJlZm9yZSB0aGUgZG90LgotICAgICAqCi0gICAgICogQHBhcmFtIGZpbGVOYW1lCi0gICAgICogQHJldHVybiBSZXR1cm5zIFN0cmluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTaG9ydEZpbGVOYW1lKFN0cmluZyBmaWxlTmFtZSkgewotICAgICAgICBjaGFyIHNlcGVyYXRvciA9IFNFUEFSQVRPUl9ET1Q7Ci0gICAgICAgIFN0cmluZyB2YWx1ZTsKLSAgICAgICAgaW50IGluZGV4ID0gZmlsZU5hbWUubGFzdEluZGV4T2Yoc2VwZXJhdG9yKTsKLQotICAgICAgICBpZiAoaW5kZXggPiAwKSB7Ci0gICAgICAgICAgICB2YWx1ZSA9IGZpbGVOYW1lLnN1YnN0cmluZygwLCBpbmRleCk7Ci0KLSAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmaWxlTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiBhbiBhdHRyaWJ1dGUuIGVnIHhzZDphbnlWYWwgLS0+IGFueVZhbAotICAgICAqCi0gICAgICogQHJldHVybiBSZXR1cm5zIFN0cmluZy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFZhbHVlKFN0cmluZyBpbikgewotICAgICAgICBjaGFyIHNlcGVyYXRvciA9IFNFUEFSQVRPUl9DT0xPTjsKLSAgICAgICAgU3RyaW5nIHZhbHVlOwotICAgICAgICBpbnQgaW5kZXggPSBpbi5pbmRleE9mKHNlcGVyYXRvcik7Ci0KLSAgICAgICAgaWYgKGluZGV4ID4gMCkgewotICAgICAgICAgICAgdmFsdWUgPSBpbi5zdWJzdHJpbmcoaW5kZXggKyAxLCBpbi5sZW5ndGgoKSk7Ci0KLSAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBpbjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9GaWxlU3lzdGVtQ29uZmlndXJhdG9yLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9GaWxlU3lzdGVtQ29uZmlndXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhMmEyMmYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvRmlsZVN5c3RlbUNvbmZpZ3VyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5QYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0NvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0NvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuTG9hZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotcHVibGljIGNsYXNzIEZpbGVTeXN0ZW1Db25maWd1cmF0b3IgZXh0ZW5kcyBEZXBsb3ltZW50RW5naW5lIGltcGxlbWVudHMgQXhpc0NvbmZpZ3VyYXRvciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coRmlsZVN5c3RlbUNvbmZpZ3VyYXRvci5jbGFzcyk7Ci0gICAgLyoqCi0gICAgICogVG8gY2hlY2sgd2hldGhlciBuZWVkIHRvIGNyZWF0ZSBhIHNlcnZpY2Ugc2lkZSBvciBjbGllbnQgc2lkZQotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGF4aXMyeG1sID0gbnVsbDsKLSAgICBwcml2YXRlIFN0cmluZyByZXBvTG9jYXRpb24gPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogTG9hZCBhbiBBeGlzQ29uZmlndXJhdGlvbiBmcm9tIHRoZSByZXBvc2l0b3J5IGRpcmVjdG9yeSBzcGVjaWZpZWQKLSAgICAgKgotICAgICAqIEBwYXJhbSByZXBvTG9jYXRpb24KLSAgICAgKiBAcGFyYW0gYXhpczJ4bWwKLSAgICAgKi8KLSAgICBwdWJsaWMgRmlsZVN5c3RlbUNvbmZpZ3VyYXRvcihTdHJpbmcgcmVwb0xvY2F0aW9uLCBTdHJpbmcgYXhpczJ4bWwpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBpZiAocmVwb0xvY2F0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vY2hlY2tpbmcgd2V0aGVyIHVzZXIgaGFzIHNldCB0aGUgc3lzdGVtIHByb3BlcnR5Ci0gICAgICAgICAgICByZXBvTG9jYXRpb24gPSBTeXN0ZW0uZ2V0UHJvcGVydHkoQ29uc3RhbnRzLkFYSVMyX1JFUE8pOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gT0ssIHdlJ3ZlIGdvdCBhIHJlcG9zaXRvcnkgbG9jYXRpb24gaW4gbWluZC4gIExldCdzIG1ha2UKLSAgICAgICAgLy8gc3VyZSBpdCBleGlzdHMuCi0gICAgICAgIGlmIChyZXBvTG9jYXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgRmlsZSByZXBvID0gbmV3IEZpbGUocmVwb0xvY2F0aW9uKTsKLSAgICAgICAgICAgIGlmIChyZXBvLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgLy8gb2ssIHNhdmUgaXQgaWYgc28KLSAgICAgICAgICAgICAgICB0aGlzLnJlcG9Mb2NhdGlvbiA9IHJlcG8uZ2V0QWJzb2x1dGVQYXRoKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJDb3VsZG4ndCBmaW5kIHJlcG9zaXRvcnkgbG9jYXRpb24gJyIgKwotICAgICAgICAgICAgICAgICAgICAgICAgcmVwb0xvY2F0aW9uICsgIiciKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJDb3VsZG4ndCBmaW5kIHJlcG9zaXRvcnkgbG9jYXRpb24gJyIgKwotICAgICAgICAgICAgICAgICAgICAgICAgcmVwb0xvY2F0aW9uICsgIiciKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIERlYWwgd2l0aCB0aGUgY29uZmlnIGZpbGUuICBJZiBhIGZpbGVuYW1lIHdhcyBzcGVjaWZpZWQgYXMgYW4KLSAgICAgICAgLy8gYXJnIHRvIHRoaXMgY29uc3RydWN0b3IsIGp1c3QgcmVzcGVjdCBpdC4KLSAgICAgICAgaWYgKGF4aXMyeG1sID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIElmIG5vdCwgY2hlY2sgZm9yIGEgc3lzdGVtIHByb3BlcnR5IHNldHRpbmcKLSAgICAgICAgICAgIGF4aXMyeG1sID0gU3lzdGVtLmdldFByb3BlcnR5KENvbnN0YW50cy5BWElTMl9DT05GKTsKLQotICAgICAgICAgICAgLy8gQW5kIGlmIG5vdCB0aGF0LCB0cnkgYXQgdGhlIHJvb3Qgb2YgdGhlIHJlcG9zaXRvcnkgaWYgd2UgaGF2ZSBvbmUuCi0gICAgICAgICAgICAvLyBJdCBtaWdodCBiZSBuaWNlIHRvIGRlZmF1bHQgdGhlIHJlcG9zaXRvcnkgdG8gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LCBidXQgd2UgZG9uJ3QgeWV0Ci0gICAgICAgICAgICBpZiAoYXhpczJ4bWwgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChyZXBvTG9jYXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBheGlzMnhtbCA9IHJlcG9Mb2NhdGlvbiArIEZpbGUuc2VwYXJhdG9yICsgQ29uc3RhbnRzLkFYSVMyX0NPTkY7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBJbiBlaXRoZXIgY2FzZSwgY2hlY2sgdGhhdCB0aGUgZmlsZSBleGlzdHMuLi4gaWYgbm90Ci0gICAgICAgICAgICAvLyB3ZSdsbCB1c2UgdGhlIGRlZmF1bHQgYXhpczIueG1sIG9uIHRoZSBjbGFzc3BhdGguCi0gICAgICAgICAgICBpZiAoYXhpczJ4bWwgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIEZpbGUgY29uZmlnRmlsZSA9IG5ldyBGaWxlKGF4aXMyeG1sKTsKLSAgICAgICAgICAgICAgICBpZiAoIWNvbmZpZ0ZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJDb25maWcgZmlsZSAnIiArIGF4aXMyeG1sICsgIicgZG9lc24ndCBleGlzdCwgaWdub3JpbmcuIik7Ci0gICAgICAgICAgICAgICAgICAgIGF4aXMyeG1sID0gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB0aGlzLmF4aXMyeG1sID0gYXhpczJ4bWw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmlyc3QgY3JlYXRlIGEgRGVwbG95bWVudCBlbmdpbmUsIHVzZSB0aGF0IHRvIGNyZWF0ZSBhbiBBeGlzQ29uZmlndXJhdGlvbgotICAgICAqCi0gICAgICogQHJldHVybiBBeGlzIENvbmZpZ3VyYXRpb24KLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdAotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgQXhpc0NvbmZpZ3VyYXRpb24gZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgSW5wdXRTdHJlYW0gY29uZmlnU3RyZWFtID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChheGlzMnhtbCAhPSBudWxsICYmICEiIi5lcXVhbHMoYXhpczJ4bWwpKSB7Ci0gICAgICAgICAgICAgICAgY29uZmlnU3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShheGlzMnhtbCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGNvbmZpZ1N0cmVhbSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2FkZXIuZ2V0UmVzb3VyY2VBc1N0cmVhbShEZXBsb3ltZW50Q29uc3RhbnRzLkFYSVMyX0NPTkZJR1VSQVRJT05fUkVTT1VSQ0UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXhpc0NvbmZpZyA9IHBvcHVsYXRlQXhpc0NvbmZpZ3VyYXRpb24oY29uZmlnU3RyZWFtKTsKLSAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoIlN5c3RlbSBjYW4gbm90IGZpbmQgdGhlIGdpdmVuIGF4aXMyLnhtbCAiICsgYXhpczJ4bWwpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYoY29uZmlnU3RyZWFtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBjb25maWdTdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IEF4aXNGYXVsdC5tYWtlRmF1bHQoZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIFBhcmFtZXRlciBheGlzMnJlcG9QYXJhID0gYXhpc0NvbmZpZy5nZXRQYXJhbWV0ZXIoRGVwbG95bWVudENvbnN0YW50cy5BWElTMl9SRVBPKTsKLSAgICAgICAgaWYgKGF4aXMycmVwb1BhcmEgIT0gbnVsbCkgewotICAgICAgICAgICAgcmVwb0xvY2F0aW9uID0gKFN0cmluZykgYXhpczJyZXBvUGFyYS5nZXRWYWx1ZSgpOwotICAgICAgICB9Ci0gICAgICAgIGlmICghKHJlcG9Mb2NhdGlvbiA9PSBudWxsIHx8ICIiLmVxdWFscyhyZXBvTG9jYXRpb24pKSkgewotICAgICAgICAgICAgbG9hZFJlcG9zaXRvcnkocmVwb0xvY2F0aW9uKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGxvYWRGcm9tQ2xhc3NQYXRoKCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXhpc0NvbmZpZy5zZXRDb25maWd1cmF0b3IodGhpcyk7Ci0gICAgICAgIHJldHVybiBheGlzQ29uZmlnOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVuZ2FnZUdsb2JhbE1vZHVsZXMoKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgZW5nYWdlTW9kdWxlcygpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGxvYWRTZXJ2aWNlcygpIHsKLSAgICAgICAgaWYgKCEocmVwb0xvY2F0aW9uID09IG51bGwgfHwgIiIuZXF1YWxzKHJlcG9Mb2NhdGlvbikpKSB7Ci0gICAgICAgICAgICBzdXBlci5sb2FkU2VydmljZXMoKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L01vZHVsZUJ1aWxkZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L01vZHVsZUJ1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA0YTM5Ni4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9Nb2R1bGVCdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LnV0aWwuUGhhc2VzSW5mbzsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNNb2R1bGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5Jbk9ubHlBeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkRlcGxveWFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuTWVzc2FnZVJlY2VpdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaTE4bi5NZXNzYWdlczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLm1vZHVsZXMuTW9kdWxlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucGhhc2VyZXNvbHZlci5QaGFzZU1ldGFkYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5Mb2FkZXI7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotLyoqCi0gKiBCdWlsZHMgYSBtb2R1bGUgZGVzY3JpcHRpb24gZnJvbSBPTQotICovCi1wdWJsaWMgY2xhc3MgTW9kdWxlQnVpbGRlciBleHRlbmRzIERlc2NyaXB0aW9uQnVpbGRlciB7Ci0gICAgcHJpdmF0ZSBBeGlzTW9kdWxlIG1vZHVsZTsKLQotICAgIHB1YmxpYyBNb2R1bGVCdWlsZGVyKElucHV0U3RyZWFtIHNlcnZpY2VJbnB1dFN0cmVhbSwgQXhpc01vZHVsZSBtb2R1bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZykgewotICAgICAgICBzdXBlcihzZXJ2aWNlSW5wdXRTdHJlYW0sIGF4aXNDb25maWcpOwotICAgICAgICB0aGlzLm1vZHVsZSA9IG1vZHVsZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgbG9hZE1vZHVsZUNsYXNzKEF4aXNNb2R1bGUgbW9kdWxlLCBTdHJpbmcgbW9kdWxlQ2xhc3NOYW1lKQotICAgICAgICAgICAgdGhyb3dzIERlcGxveW1lbnRFeGNlcHRpb24gewotICAgICAgICBDbGFzcyBtb2R1bGVDbGFzczsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKChtb2R1bGVDbGFzc05hbWUgIT0gbnVsbCkgJiYgISIiLmVxdWFscyhtb2R1bGVDbGFzc05hbWUpKSB7Ci0gICAgICAgICAgICAgICAgbW9kdWxlQ2xhc3MgPSBMb2FkZXIubG9hZENsYXNzKG1vZHVsZS5nZXRNb2R1bGVDbGFzc0xvYWRlcigpLCBtb2R1bGVDbGFzc05hbWUpOwotICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzIGZtb2R1bGVDbGFzcyA9IG1vZHVsZUNsYXNzOwotICAgICAgICAgICAgICAgIGZpbmFsIEF4aXNNb2R1bGUgZm1vZHVsZSA9IG1vZHVsZTsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgdGhyb3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIEluc3RhbnRpYXRpb25FeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZHVsZSBuZXdfbW9kdWxlID0gKE1vZHVsZSkgZm1vZHVsZUNsYXNzLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm1vZHVsZS5zZXRNb2R1bGUobmV3X21vZHVsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBlLmdldEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZpbGwgaW4gdGhlIEF4aXNNb2R1bGUgSSdtIGhvbGRpbmcgZnJvbSB0aGUgbW9kdWxlLnhtbCBjb25maWd1cmF0aW9uLgotICAgICAqCi0gICAgICogQHRocm93cyBEZXBsb3ltZW50RXhjZXB0aW9uIGlmIHRoZXJlJ3MgYSBwcm9ibGVtIHdpdGggdGhlIG1vZHVsZS54bWwKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwb3B1bGF0ZU1vZHVsZSgpIHRocm93cyBEZXBsb3ltZW50RXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBtb2R1bGVFbGVtZW50ID0gYnVpbGRPTSgpOwotICAgICAgICAgICAgLy8gU2V0dGluZyBNb2R1bGUgQ2xhc3MgLCBpZiBpdCBpcyB0aGVyZQotICAgICAgICAgICAgT01BdHRyaWJ1dGUgbW9kdWxlQ2xhc3NBdHQgPSBtb2R1bGVFbGVtZW50LmdldEF0dHJpYnV0ZShuZXcgUU5hbWUoVEFHX0NMQVNTX05BTUUpKTsKLSAgICAgICAgICAgIC8vIHByb2Nlc3NpbmcgUGFyYW1ldGVycwotICAgICAgICAgICAgLy8gUHJvY2Vzc2luZyBzZXJ2aWNlIGxldmVsIHBhcmFtZXRlcnMKLSAgICAgICAgICAgIEl0ZXJhdG9yIGl0ciA9IG1vZHVsZUVsZW1lbnQuZ2V0Q2hpbGRyZW5XaXRoTmFtZShuZXcgUU5hbWUoVEFHX1BBUkFNRVRFUikpOwotCi0gICAgICAgICAgICBwcm9jZXNzUGFyYW1ldGVycyhpdHIsIG1vZHVsZSwgbW9kdWxlLmdldFBhcmVudCgpKTsKLSAgICAgICAgICAgIGlmIChtb2R1bGVDbGFzc0F0dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG1vZHVsZUNsYXNzID0gbW9kdWxlQ2xhc3NBdHQuZ2V0QXR0cmlidXRlVmFsdWUoKTsKLQotICAgICAgICAgICAgICAgIGlmICgobW9kdWxlQ2xhc3MgIT0gbnVsbCkgJiYgISIiLmVxdWFscyhtb2R1bGVDbGFzcykpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9hZE1vZHVsZUNsYXNzKG1vZHVsZSwgbW9kdWxlQ2xhc3MpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gR2V0IG91ciBuYW1lIGFuZCB2ZXJzaW9uLiAgSWYgdGhpcyBpcyBOT1QgcHJlc2VudCwgd2UnbGwgdHJ5IHRvIGZpZ3VyZSBpdCBvdXQKLSAgICAgICAgICAgIC8vIGZyb20gdGhlIGZpbGUgbmFtZSAoZS5nLiAiYWRkcmVzc2luZy0xLjAubWFyIikuICBJZiB0aGUgYXR0cmlidXRlIGlzIHRoZXJlLCB3ZQotICAgICAgICAgICAgLy8gYWx3YXlzIHJlc3BlY3QgaXQuCi0gICAgICAgICAgICAvL1RPRE86IE5lZWQgdG8gY2hlY2sgd2hldGhlciB0aHMgbmFtZSBpcyBnZXR0aW5nIG92ZXJyaWRkZW4gYnkgdGhlIGZpbGUgbmFtZSBvZiB0aGUgTUFSCi0gICAgICAgICAgICBPTUF0dHJpYnV0ZSBuYW1lQXR0ID0gbW9kdWxlRWxlbWVudC5nZXRBdHRyaWJ1dGUobmV3IFFOYW1lKCJuYW1lIikpOwotICAgICAgICAgICAgaWYgKG5hbWVBdHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFN0cmluZyBtb2R1bGVOYW1lID0gbmFtZUF0dC5nZXRBdHRyaWJ1dGVWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGlmIChtb2R1bGVOYW1lICE9IG51bGwgJiYgISIiLmVxdWFscyhtb2R1bGVOYW1lKSl7Ci0gICAgICAgICAgICAgICAgICAgIG1vZHVsZS5zZXROYW1lKG1vZHVsZU5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gUHJvY2VzcyBzZXJ2aWNlIGRlc2NyaXB0aW9uCi0gICAgICAgICAgICBPTUVsZW1lbnQgZGVzY3JpcHRpb25FbGVtZW50ID0KLSAgICAgICAgICAgICAgICAgICAgbW9kdWxlRWxlbWVudC5nZXRGaXJzdENoaWxkV2l0aE5hbWUobmV3IFFOYW1lKFRBR19ERVNDUklQVElPTikpOwotCi0gICAgICAgICAgICBpZiAoZGVzY3JpcHRpb25FbGVtZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBPTUVsZW1lbnQgZGVzY3JpcHRpb25WYWx1ZSA9IGRlc2NyaXB0aW9uRWxlbWVudC5nZXRGaXJzdEVsZW1lbnQoKTsKLQotICAgICAgICAgICAgICAgIGlmIChkZXNjcmlwdGlvblZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQotICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvblZhbHVlLmJ1aWxkKCk7Ci0gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uVmFsdWUuc2VyaWFsaXplKHdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgIHdyaXRlci5mbHVzaCgpOwotICAgICAgICAgICAgICAgICAgICBtb2R1bGUuc2V0TW9kdWxlRGVzY3JpcHRpb24od3JpdGVyLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1vZHVsZS5zZXRNb2R1bGVEZXNjcmlwdGlvbihkZXNjcmlwdGlvbkVsZW1lbnQuZ2V0VGV4dCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1vZHVsZS5zZXRNb2R1bGVEZXNjcmlwdGlvbigibW9kdWxlIGRlc2NyaXB0aW9uIG5vdCBmb3VuZCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBQcm9jZXNzaW5nIER5bmFtaWMgUGhhc2UKLSAgICAgICAgICAgIEl0ZXJhdG9yIHBoYXNlSXRyID0gbW9kdWxlRWxlbWVudC5nZXRDaGlsZHJlbldpdGhOYW1lKG5ldyBRTmFtZShUQUdfUEhBU0UpKTsKLSAgICAgICAgICAgIHByb2Nlc3NNb2R1bGVQaGFzZShwaGFzZUl0cik7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIHNldHRpbmcgdGhlIFBvbGljeUluY2x1ZGUKLQotICAgICAgICAgICAgLy8gcHJvY2Vzc2luZyA8d3NwOlBvbGljeT4gLi4gPC8uLj4gZWxlbWVudHMKLSAgICAgICAgICAgIEl0ZXJhdG9yIHBvbGljeUVsZW1lbnRzID0KLSAgICAgICAgICAgICAgICAgICAgbW9kdWxlRWxlbWVudC5nZXRDaGlsZHJlbldpdGhOYW1lKG5ldyBRTmFtZShQT0xJQ1lfTlNfVVJJLCBUQUdfUE9MSUNZKSk7Ci0KLSAgICAgICAgICAgIGlmIChwb2xpY3lFbGVtZW50cyAhPSBudWxsICYmIHBvbGljeUVsZW1lbnRzLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIHByb2Nlc3NQb2xpY3lFbGVtZW50cyhwb2xpY3lFbGVtZW50cywgbW9kdWxlLmdldFBvbGljeVN1YmplY3QoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHByb2Nlc3NpbmcgPHdzcDpQb2xpY3lSZWZlcmVuY2U+IC4uIDwvLi4+IGVsZW1lbnRzCi0gICAgICAgICAgICBJdGVyYXRvciBwb2xpY3lSZWZFbGVtZW50cyA9Ci0gICAgICAgICAgICAgICAgICAgIG1vZHVsZUVsZW1lbnQuZ2V0Q2hpbGRyZW5XaXRoTmFtZShuZXcgUU5hbWUoUE9MSUNZX05TX1VSSSwgVEFHX1BPTElDWV9SRUYpKTsKLQotICAgICAgICAgICAgaWYgKHBvbGljeVJlZkVsZW1lbnRzICE9IG51bGwgJiYgcG9saWN5RWxlbWVudHMuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgcHJvY2Vzc1BvbGljeVJlZkVsZW1lbnRzKHBvbGljeVJlZkVsZW1lbnRzLCBtb2R1bGUuZ2V0UG9saWN5U3ViamVjdCgpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gcHJvY2VzcyBJTkZMT1cKLSAgICAgICAgICAgIE9NRWxlbWVudCBpbkZsb3cgPSBtb2R1bGVFbGVtZW50LmdldEZpcnN0Q2hpbGRXaXRoTmFtZShuZXcgUU5hbWUoVEFHX0ZMT1dfSU4pKTsKLSAgICAgICAgICAgIGlmIChpbkZsb3cgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1vZHVsZS5zZXRJbkZsb3cocHJvY2Vzc0Zsb3coaW5GbG93LCBtb2R1bGUpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgT01FbGVtZW50IG91dEZsb3cgPSBtb2R1bGVFbGVtZW50LmdldEZpcnN0Q2hpbGRXaXRoTmFtZShuZXcgUU5hbWUoVEFHX0ZMT1dfT1VUKSk7Ci0gICAgICAgICAgICBpZiAob3V0RmxvdyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbW9kdWxlLnNldE91dEZsb3cocHJvY2Vzc0Zsb3cob3V0RmxvdywgbW9kdWxlKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIE9NRWxlbWVudCBpbkZhdWx0RmxvdyA9Ci0gICAgICAgICAgICAgICAgICAgIG1vZHVsZUVsZW1lbnQuZ2V0Rmlyc3RDaGlsZFdpdGhOYW1lKG5ldyBRTmFtZShUQUdfRkxPV19JTl9GQVVMVCkpOwotICAgICAgICAgICAgaWYgKGluRmF1bHRGbG93ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtb2R1bGUuc2V0RmF1bHRJbkZsb3cocHJvY2Vzc0Zsb3coaW5GYXVsdEZsb3csIG1vZHVsZSkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBPTUVsZW1lbnQgb3V0RmF1bHRGbG93ID0KLSAgICAgICAgICAgICAgICAgICAgbW9kdWxlRWxlbWVudC5nZXRGaXJzdENoaWxkV2l0aE5hbWUobmV3IFFOYW1lKFRBR19GTE9XX09VVF9GQVVMVCkpOwotICAgICAgICAgICAgaWYgKG91dEZhdWx0RmxvdyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbW9kdWxlLnNldEZhdWx0T3V0Rmxvdyhwcm9jZXNzRmxvdyhvdXRGYXVsdEZsb3csIG1vZHVsZSkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBPTUVsZW1lbnQgc3VwcG9ydGVkUG9saWN5TmFtZXNwYWNlcyA9Ci0gICAgICAgICAgICAgICAgICAgIG1vZHVsZUVsZW1lbnQuZ2V0Rmlyc3RDaGlsZFdpdGhOYW1lKG5ldyBRTmFtZShUQUdfU1VQUE9SVEVEX1BPTElDWV9OQU1FU1BBQ0VTKSk7Ci0gICAgICAgICAgICBpZiAoc3VwcG9ydGVkUG9saWN5TmFtZXNwYWNlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbW9kdWxlLnNldFN1cHBvcnRlZFBvbGljeU5hbWVzcGFjZXMoCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzU3VwcG9ydGVkUG9saWN5TmFtZXNwYWNlcyhzdXBwb3J0ZWRQb2xpY3lOYW1lc3BhY2VzKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAqIE1vZHVsZSBkZXNjcmlwdGlvbiBzaG91bGQgY29udGFpbiBhIGxpc3Qgb2YgUU5hbWUgb2YgdGhlIGFzc2VydGlvbnMgdGhhdCBhcmUgbG9jYWwgdG8gdGhlIHN5c3RlbS4KLSAgICAgICAgICAgICogVGhlc2UgYXNzZXJ0aW9ucyBhcmUgbm90IGV4cG9zZWQgdG8gdGhlIG91dHNpZGUuCi0gICAgICAgICAgICAqLwotICAgICAgICAgICAgT01FbGVtZW50IGxvY2FsUG9saWN5QXNzZXJ0aW9uRWxlbWVudCA9Ci0gICAgICAgICAgICAgICAgICAgIG1vZHVsZUVsZW1lbnQuZ2V0Rmlyc3RDaGlsZFdpdGhOYW1lKG5ldyBRTmFtZSgibG9jYWwtcG9saWN5LWFzc2VydGlvbnMiKSk7Ci0gICAgICAgICAgICBpZiAobG9jYWxQb2xpY3lBc3NlcnRpb25FbGVtZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtb2R1bGUuc2V0TG9jYWxQb2xpY3lBc3NlcnRpb25zKAotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TG9jYWxQb2xpY3lBc3NlcnRpb25OYW1lcyhsb2NhbFBvbGljeUFzc2VydGlvbkVsZW1lbnQpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gcHJvY2Vzc2luZyBPcGVyYXRpb25zCi0gICAgICAgICAgICBJdGVyYXRvciBvcF9pdHIgPSBtb2R1bGVFbGVtZW50LmdldENoaWxkcmVuV2l0aE5hbWUobmV3IFFOYW1lKFRBR19PUEVSQVRJT04pKTsKLSAgICAgICAgICAgIEFycmF5TGlzdDxBeGlzT3BlcmF0aW9uPiBvcGVyYXRpb25zID0gcHJvY2Vzc09wZXJhdGlvbnMob3BfaXRyKTsKLQotICAgICAgICAgICAgZm9yIChBeGlzT3BlcmF0aW9uIG9wIDogb3BlcmF0aW9ucykgewotICAgICAgICAgICAgICAgIG1vZHVsZS5hZGRPcGVyYXRpb24ob3ApOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBjYXRjaChBeGlzRmF1bHQgZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIEFycmF5TGlzdDxBeGlzT3BlcmF0aW9uPiBwcm9jZXNzT3BlcmF0aW9ucyhJdGVyYXRvciBvcGVyYXRpb25zSXRlcmF0b3IpCi0gICAgICAgICAgICB0aHJvd3MgRGVwbG95bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIEFycmF5TGlzdCBvcGVyYXRpb25zID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgICAgIHdoaWxlIChvcGVyYXRpb25zSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgb3BlcmF0aW9uID0gKE9NRWxlbWVudCkgb3BlcmF0aW9uc0l0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgIEF4aXNPcGVyYXRpb24gb3BfZGVzY3JpcDsKLQotICAgICAgICAgICAgLy9nZXR0aW5nIG9wZXJhdGlvbiBuYW1lCi0gICAgICAgICAgICBTdHJpbmcgb3BuYW1lID0gb3BlcmF0aW9uLmdldEF0dHJpYnV0ZVZhbHVlKG5ldyBRTmFtZShBVFRSSUJVVEVfTkFNRSkpOwotCi0gICAgICAgICAgICBpZiAob3BuYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVwbG95bWVudEVycm9yTXNncy5JTlZBTElEX09QLCAib3BlcmF0aW9uIG5hbWUgbWlzc2luZyIpKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0cmluZyBtZXBVUkwgPSBvcGVyYXRpb24uZ2V0QXR0cmlidXRlVmFsdWUobmV3IFFOYW1lKFRBR19NRVApKTsKLQotICAgICAgICAgICAgaWYgKG1lcFVSTCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgb3BfZGVzY3JpcCA9IG5ldyBJbk9ubHlBeGlzT3BlcmF0aW9uKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIG9wX2Rlc2NyaXAgPSBBeGlzT3BlcmF0aW9uRmFjdG9yeS5nZXRPcGVyYXRpb25EZXNjcmlwdGlvbihtZXBVUkwpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBheGlzRmF1bHQpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZ2V0TWVzc2FnZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlcGxveW1lbnRFcnJvck1zZ3MuT1BFUkFUSU9OX1BST0NFU1NfRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNGYXVsdC5nZXRNZXNzYWdlKCkpKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBvcF9kZXNjcmlwLnNldE5hbWUobmV3IFFOYW1lKG9wbmFtZSkpOwotCi0gICAgICAgICAgICAvLyBPcGVyYXRpb24gUGFyYW1ldGVycwotICAgICAgICAgICAgSXRlcmF0b3IgcGFyYW1ldGVycyA9IG9wZXJhdGlvbi5nZXRDaGlsZHJlbldpdGhOYW1lKG5ldyBRTmFtZShUQUdfUEFSQU1FVEVSKSk7Ci0gICAgICAgICAgICBwcm9jZXNzUGFyYW1ldGVycyhwYXJhbWV0ZXJzLCBvcF9kZXNjcmlwLCBtb2R1bGUpOwotCi0gICAgICAgICAgICAvL1RvIHByb2Nlc3Mgd3NhbWFwcGluZzsKLSAgICAgICAgICAgIHByb2Nlc3NBY3Rpb25NYXBwaW5ncyhvcGVyYXRpb24sIG9wX2Rlc2NyaXApOwotCi0gICAgICAgICAgICAvLyBzZXR0aW5nIHRoZSBNRVAgb2YgdGhlIG9wZXJhdGlvbgotICAgICAgICAgICAgLy8gbG9hZGluZyB0aGUgbWVzc2FnZSByZWNlaXZlcnMKLSAgICAgICAgICAgIE9NRWxlbWVudCByZWNlaXZlckVsZW1lbnQgPQotICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24uZ2V0Rmlyc3RDaGlsZFdpdGhOYW1lKG5ldyBRTmFtZShUQUdfTUVTU0FHRV9SRUNFSVZFUikpOwotCi0gICAgICAgICAgICBpZiAocmVjZWl2ZXJFbGVtZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBNZXNzYWdlUmVjZWl2ZXIgbWVzc2FnZVJlY2VpdmVyID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRNZXNzYWdlUmVjZWl2ZXIobW9kdWxlLmdldE1vZHVsZUNsYXNzTG9hZGVyKCksIHJlY2VpdmVyRWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgb3BfZGVzY3JpcC5zZXRNZXNzYWdlUmVjZWl2ZXIobWVzc2FnZVJlY2VpdmVyKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gc2V0dGluZyBkZWZhdWx0IG1lc3NhZ2UgcmVjZWl2ZXIKLSAgICAgICAgICAgICAgICBNZXNzYWdlUmVjZWl2ZXIgbXNnUmVjZWl2ZXIgPSBsb2FkRGVmYXVsdE1lc3NhZ2VSZWNlaXZlcihtZXBVUkwsIG51bGwpOwotICAgICAgICAgICAgICAgIG9wX2Rlc2NyaXAuc2V0TWVzc2FnZVJlY2VpdmVyKG1zZ1JlY2VpdmVyKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gUHJvY2VzcyBNb2R1bGUgUmVmcwotICAgICAgICAgICAgSXRlcmF0b3IgbW9kdWxlcyA9IG9wZXJhdGlvbi5nZXRDaGlsZHJlbldpdGhOYW1lKG5ldyBRTmFtZShUQUdfTU9EVUxFKSk7Ci0gICAgICAgICAgICBwcm9jZXNzT3BlcmF0aW9uTW9kdWxlUmVmcyhtb2R1bGVzLCBvcF9kZXNjcmlwKTsKLSAgICAgICAgICAgIAotLy8gICAgICAgICAgcHJvY2Vzc2luZyA8d3NwOlBvbGljeT4gLi4gPC8uLj4gZWxlbWVudHMKLSAgICAgICAgICAgIEl0ZXJhdG9yIHBvbGljeUVsZW1lbnRzID0KLSAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uLmdldENoaWxkcmVuV2l0aE5hbWUobmV3IFFOYW1lKFBPTElDWV9OU19VUkksIFRBR19QT0xJQ1kpKTsKLQotICAgICAgICAgICAgaWYgKHBvbGljeUVsZW1lbnRzICE9IG51bGwgJiYgcG9saWN5RWxlbWVudHMuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgcHJvY2Vzc1BvbGljeUVsZW1lbnRzKHBvbGljeUVsZW1lbnRzLCBvcF9kZXNjcmlwLmdldFBvbGljeVN1YmplY3QoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHByb2Nlc3NpbmcgPHdzcDpQb2xpY3lSZWZlcmVuY2U+IC4uIDwvLi4+IGVsZW1lbnRzCi0gICAgICAgICAgICBJdGVyYXRvciBwb2xpY3lSZWZFbGVtZW50cyA9Ci0gICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbi5nZXRDaGlsZHJlbldpdGhOYW1lKG5ldyBRTmFtZShQT0xJQ1lfTlNfVVJJLCBUQUdfUE9MSUNZX1JFRikpOwotCi0gICAgICAgICAgICBpZiAocG9saWN5UmVmRWxlbWVudHMgIT0gbnVsbCAmJiBwb2xpY3lSZWZFbGVtZW50cy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBwcm9jZXNzUG9saWN5UmVmRWxlbWVudHMocG9saWN5UmVmRWxlbWVudHMsIG1vZHVsZS5nZXRQb2xpY3lTdWJqZWN0KCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBzZXR0aW5nIE9wZXJhdGlvbiBwaGFzZQotICAgICAgICAgICAgUGhhc2VzSW5mbyBpbmZvID0gYXhpc0NvbmZpZy5nZXRQaGFzZXNJbmZvKCk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGluZm8uc2V0T3BlcmF0aW9uUGhhc2VzKG9wX2Rlc2NyaXApOwotICAgICAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGF4aXNGYXVsdCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKGF4aXNGYXVsdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLQotICAgICAgICAgICAgLy8gYWRkaW5nIHRoZSBvcGVyYXRpb24KLSAgICAgICAgICAgIG9wZXJhdGlvbnMuYWRkKG9wX2Rlc2NyaXApOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG9wZXJhdGlvbnM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyB3aWxsIHByb2Nlc3MgdGhlIHBoYXNlIGxpc3QgYW5kIHRoZW4gYWRkIHRoZSBzcGVjaWZpZWQgcGhhc2VzIHRvCi0gICAgICogb3VyIEF4aXNDb25maWd1cmF0aW9uLiAgVGhlIGZvcm1hdCBvZiBhIHBoYXNlIGVsZW1lbnQgbG9va3MgbGlrZSB0aGlzOgotICAgICAqCi0gICAgICogICZsdDtwaGFzZSBuYW1lPSJGb28iIGFmdGVyPSJBZnRlcl9waGFzZV9OYW1lIiBiZWZvcmU9IkJlZm9yZV9QaGFzZV9OYW1lIgotICAgICAqICBmbG93PSJbSW5GbG93LE91dEZsb3csT3V0RmF1bHRGbG93LEluRmF1bHRGbG93XSIvJmd0OwotICAgICAqCi0gICAgICogIEhlcmUgYmVmCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGhhc2VzIDogT01FbGVtZW50IGl0ZXJhdG9yCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQgOiBJZiBzb21ldGhpbmcgd2VudCB3cm9uZwotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzTW9kdWxlUGhhc2UoSXRlcmF0b3IgcGhhc2VzKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgaWYgKHBoYXNlcyA9PSBudWxsKXsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHdoaWxlIChwaGFzZXMuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgZWxlbWVudCA9IChPTUVsZW1lbnQpIHBoYXNlcy5uZXh0KCk7Ci0gICAgICAgICAgICBTdHJpbmcgcGhhc2VOYW1lID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVWYWx1ZShuZXcgUU5hbWUoQVRUUklCVVRFX05BTUUpKTsKLQotICAgICAgICAgICAgRGVwbG95YWJsZSBkID0gbmV3IERlcGxveWFibGUocGhhc2VOYW1lKTsKLSAgICAgICAgICAgIFN0cmluZyBhZnRlciA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlVmFsdWUobmV3IFFOYW1lKFRBR19BRlRFUikpOwotICAgICAgICAgICAgaWYgKGFmdGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgW10gYWZ0ZXJzID0gYWZ0ZXIuc3BsaXQoIiwiKTsKLSAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBzIDogYWZ0ZXJzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGQuYWRkUHJlZGVjZXNzb3Iocyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgU3RyaW5nIGJlZm9yZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlVmFsdWUobmV3IFFOYW1lKFRBR19CRUZPUkUpKTsKLSAgICAgICAgICAgIGlmIChiZWZvcmUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFN0cmluZyBbXSBiZWZvcmVzID0gYmVmb3JlLnNwbGl0KCIsIik7Ci0gICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgcyA6IGJlZm9yZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgZC5hZGRTdWNjZXNzb3Iocyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgU3RyaW5nIGZsb3dOYW1lID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVWYWx1ZShuZXcgUU5hbWUoImZsb3ciKSk7Ci0gICAgICAgICAgICBpZiAoZmxvd05hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKCJGbG93IGNhbiBub3QgYmUgbnVsbCBmb3IgdGhlIHBoYXNlIG5hbWUgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGhhc2VOYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFN0cmluZ1tdIGZsb3dzID0gZmxvd05hbWUuc3BsaXQoIiwiKTsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIGZsb3cgOiBmbG93cykgewotICAgICAgICAgICAgICAgIGludCBmbG93SW5kZXg7Ci0gICAgICAgICAgICAgICAgaWYgKFRBR19GTE9XX0lOLmVxdWFsc0lnbm9yZUNhc2UoZmxvdykpIHsKLSAgICAgICAgICAgICAgICAgICAgZmxvd0luZGV4ID0gUGhhc2VNZXRhZGF0YS5JTl9GTE9XOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoVEFHX0ZMT1dfT1VULmVxdWFsc0lnbm9yZUNhc2UoZmxvdykpIHsKLSAgICAgICAgICAgICAgICAgICAgZmxvd0luZGV4ID0gUGhhc2VNZXRhZGF0YS5PVVRfRkxPVzsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFRBR19GTE9XX09VVF9GQVVMVC5lcXVhbHNJZ25vcmVDYXNlKGZsb3cpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZsb3dJbmRleCA9IFBoYXNlTWV0YWRhdGEuRkFVTFRfT1VUX0ZMT1c7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChUQUdfRkxPV19JTl9GQVVMVC5lcXVhbHNJZ25vcmVDYXNlKGZsb3cpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZsb3dJbmRleCA9IFBoYXNlTWV0YWRhdGEuRkFVTFRfSU5fRkxPVzsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEV4Y2VwdGlvbigiVW5rbm93biBmbG93IG5hbWUgJyIgKyBmbG93ICsgIiciKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYXhpc0NvbmZpZy5pbnNlcnRQaGFzZShkLCBmbG93SW5kZXgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvTW9kdWxlRGVwbG95ZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L01vZHVsZURlcGxveWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxZmFjYTEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvTW9kdWxlRGVwbG95ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQucmVwb3NpdG9yeS51dGlsLkFyY2hpdmVSZWFkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LnJlcG9zaXRvcnkudXRpbC5EZXBsb3ltZW50RmlsZURhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzTW9kdWxlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaTE4bi5NZXNzYWdlczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1wdWJsaWMgY2xhc3MgTW9kdWxlRGVwbG95ZXIgaW1wbGVtZW50cyBEZXBsb3llciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coTW9kdWxlRGVwbG95ZXIuY2xhc3MpOwotICAgIHByaXZhdGUgQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZzsKLQotCi0gICAgcHVibGljIE1vZHVsZURlcGxveWVyKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBNb2R1bGVEZXBsb3llcihBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlnKSB7Ci0gICAgICAgIHRoaXMuYXhpc0NvbmZpZyA9IGF4aXNDb25maWc7Ci0gICAgfQotCi0gICAgLy9UbyBpbml0aWFsaXplIHRoZSBkZXBsb3llcgotICAgIHB1YmxpYyB2b2lkIGluaXQoQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ3R4KSB7Ci0gICAgICAgIHRoaXMuYXhpc0NvbmZpZyA9IGNvbmZpZ0N0eC5nZXRBeGlzQ29uZmlndXJhdGlvbigpOwotICAgIH0KLSAgICAvL1dpbGwgcHJvY2VzcyB0aGUgZmlsZSBhbmQgYWRkIHRoYXQgdG8gYXhpc0NvbmZpZwotCi0gICAgcHVibGljIHZvaWQgZGVwbG95KERlcGxveW1lbnRGaWxlRGF0YSBkZXBsb3ltZW50RmlsZURhdGEpIHsKLSAgICAgICAgQXJjaGl2ZVJlYWRlciBhcmNoaXZlUmVhZGVyID0gbmV3IEFyY2hpdmVSZWFkZXIoKTsKLSAgICAgICAgU3RyaW5nIG1vZHVsZVN0YXR1cyA9ICIiOwotICAgICAgICBTdHJpbmdXcml0ZXIgZXJyb3JXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgICAgIGJvb2xlYW4gaXNEaXJlY3RvcnkgPSBkZXBsb3ltZW50RmlsZURhdGEuZ2V0RmlsZSgpLmlzRGlyZWN0b3J5KCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBkZXBsb3ltZW50RmlsZURhdGEuc2V0Q2xhc3NMb2FkZXIoaXNEaXJlY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpc0NvbmZpZy5nZXRNb2R1bGVDbGFzc0xvYWRlcigpLAotICAgICAgICAgICAgICAgICAgICAoRmlsZSlheGlzQ29uZmlnLmdldFBhcmFtZXRlclZhbHVlKENvbnN0YW50cy5Db25maWd1cmF0aW9uLkFSVElGQUNUU19URU1QX0RJUikpOwotICAgICAgICAgICAgQXhpc01vZHVsZSBtZXRhRGF0YSA9IG5ldyBBeGlzTW9kdWxlKCk7Ci0gICAgICAgICAgICBtZXRhRGF0YS5zZXRNb2R1bGVDbGFzc0xvYWRlcihkZXBsb3ltZW50RmlsZURhdGEuZ2V0Q2xhc3NMb2FkZXIoKSk7Ci0gICAgICAgICAgICBtZXRhRGF0YS5zZXRQYXJlbnQoYXhpc0NvbmZpZyk7Ci0gICAgICAgICAgICBhcmNoaXZlUmVhZGVyLnJlYWRNb2R1bGVBcmNoaXZlKGRlcGxveW1lbnRGaWxlRGF0YSwgbWV0YURhdGEsIGlzRGlyZWN0b3J5LCBheGlzQ29uZmlnKTsKLSAgICAgICAgICAgIFVSTCB1cmwgPSBkZXBsb3ltZW50RmlsZURhdGEuZ2V0RmlsZSgpLnRvVVJMKCk7Ci0gICAgICAgICAgICBtZXRhRGF0YS5zZXRGaWxlTmFtZSh1cmwpOwotICAgICAgICAgICAgRGVwbG95bWVudEVuZ2luZS5hZGROZXdNb2R1bGUobWV0YURhdGEsIGF4aXNDb25maWcpOwotICAgICAgICAgICAgbG9nLmluZm8oTWVzc2FnZXMuZ2V0TWVzc2FnZShEZXBsb3ltZW50RXJyb3JNc2dzLkRFUExPWUlOR19NT0RVTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFEYXRhLmdldEFyY2hpdmVOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybC50b1N0cmluZygpKSk7Ci0gICAgICAgIH0gY2F0Y2ggKERlcGxveW1lbnRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbG9nLmVycm9yKE1lc3NhZ2VzLmdldE1lc3NhZ2UoRGVwbG95bWVudEVycm9yTXNncy5JTlZBTElEX01PRFVMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcGxveW1lbnRGaWxlRGF0YS5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmdldE1lc3NhZ2UoKSksCi0gICAgICAgICAgICAgICAgICAgICAgZSk7Ci0gICAgICAgICAgICBQcmludFdyaXRlciBlcnJvcl9wdGludFdyaXRlciA9IG5ldyBQcmludFdyaXRlcihlcnJvcldyaXRlcik7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZShlcnJvcl9wdGludFdyaXRlcik7Ci0gICAgICAgICAgICBtb2R1bGVTdGF0dXMgPSAiRXJyb3I6XG4iICsgZXJyb3JXcml0ZXIudG9TdHJpbmcoKTsKLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGF4aXNGYXVsdCkgewotICAgICAgICAgICAgbG9nLmVycm9yKE1lc3NhZ2VzLmdldE1lc3NhZ2UoRGVwbG95bWVudEVycm9yTXNncy5JTlZBTElEX01PRFVMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcGxveW1lbnRGaWxlRGF0YS5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzRmF1bHQuZ2V0TWVzc2FnZSgpKSwKLSAgICAgICAgICAgICAgICAgICAgICBheGlzRmF1bHQpOwotICAgICAgICAgICAgUHJpbnRXcml0ZXIgZXJyb3JfcHRpbnRXcml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIoZXJyb3JXcml0ZXIpOwotICAgICAgICAgICAgYXhpc0ZhdWx0LnByaW50U3RhY2tUcmFjZShlcnJvcl9wdGludFdyaXRlcik7Ci0gICAgICAgICAgICBtb2R1bGVTdGF0dXMgPSAiRXJyb3I6XG4iICsgZXJyb3JXcml0ZXIudG9TdHJpbmcoKTsKLSAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGxvZy5lcnJvcihNZXNzYWdlcy5nZXRNZXNzYWdlKERlcGxveW1lbnRFcnJvck1zZ3MuSU5WQUxJRF9NT0RVTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBsb3ltZW50RmlsZURhdGEuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5nZXRNZXNzYWdlKCkpLAotICAgICAgICAgICAgICAgICAgICAgIGUpOwotICAgICAgICAgICAgUHJpbnRXcml0ZXIgZXJyb3JfcHRpbnRXcml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIoZXJyb3JXcml0ZXIpOwotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoZXJyb3JfcHRpbnRXcml0ZXIpOwotICAgICAgICAgICAgbW9kdWxlU3RhdHVzID0gIkVycm9yOlxuIiArIGVycm9yV3JpdGVyLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzSW5mb0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIFN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICAgICAgICAgICAgICBQcmludFdyaXRlciBwdyA9IG5ldyBQcmludFdyaXRlcihzdyk7Ci0gICAgICAgICAgICAgICAgdC5wcmludFN0YWNrVHJhY2UocHcpOwotICAgICAgICAgICAgICAgIGxvZy5lcnJvcihNZXNzYWdlcy5nZXRNZXNzYWdlKERlcGxveW1lbnRFcnJvck1zZ3MuSU5WQUxJRF9NT0RVTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwbG95bWVudEZpbGVEYXRhLmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LmdldE1lc3NhZ2UoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgUHJpbnRXcml0ZXIgZXJyb3JfcHRpbnRXcml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIoZXJyb3JXcml0ZXIpOwotICAgICAgICAgICAgdC5wcmludFN0YWNrVHJhY2UoZXJyb3JfcHRpbnRXcml0ZXIpOwotICAgICAgICAgICAgbW9kdWxlU3RhdHVzID0gIkVycm9yOlxuIiArIGVycm9yV3JpdGVyLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAobW9kdWxlU3RhdHVzLnN0YXJ0c1dpdGgoIkVycm9yOiIpKSB7Ci0gICAgICAgICAgICAgICAgYXhpc0NvbmZpZy5nZXRGYXVsdHlNb2R1bGVzKCkucHV0KERlcGxveW1lbnRFbmdpbmUuZ2V0QXhpc1NlcnZpY2VOYW1lKAotICAgICAgICAgICAgICAgICAgICAgICAgZGVwbG95bWVudEZpbGVEYXRhLmdldE5hbWUoKSksIG1vZHVsZVN0YXR1cyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREaXJlY3RvcnkoU3RyaW5nIGRpcmVjdG9yeSkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEV4dGVuc2lvbihTdHJpbmcgZXh0ZW5zaW9uKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdW5EZXBsb3koU3RyaW5nIGZpbGVOYW1lKSB7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvUE9KT0RlcGxveWVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9QT0pPRGVwbG95ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZlM2ZlNi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9QT0pPRGVwbG95ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQucmVwb3NpdG9yeS51dGlsLkRlcGxveW1lbnRGaWxlRGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQudXRpbC5VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlR3JvdXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5XU0RMMkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5NZXNzYWdlUmVjZWl2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pMThuLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5Mb2FkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBJbnB1dFN0cmVhbTsKLQotcHVibGljIGNsYXNzIFBPSk9EZXBsb3llciBpbXBsZW1lbnRzIERlcGxveWVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhQT0pPRGVwbG95ZXIuY2xhc3MpOwotCi0gICAgcHJpdmF0ZSBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDdHg7Ci0KLSAgICAvL1RvIGluaXRpYWxpemUgdGhlIGRlcGxveWVyCi0gICAgcHVibGljIHZvaWQgaW5pdChDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDdHgpIHsKLSAgICAgICAgdGhpcy5jb25maWdDdHggPSBjb25maWdDdHg7Ci0gICAgfS8vV2lsbCBwcm9jZXNzIHRoZSBmaWxlIGFuZCBhZGQgdGhhdCB0byBheGlzQ29uZmlnCi0KLSAgICBwdWJsaWMgdm9pZCBkZXBsb3koRGVwbG95bWVudEZpbGVEYXRhIGRlcGxveW1lbnRGaWxlRGF0YSkgewotICAgICAgICBDbGFzc0xvYWRlciB0aHJlYWRDbGFzc0xvYWRlciA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTdHJpbmcgZXh0ZW5zaW9uID0gRGVwbG95bWVudEZpbGVEYXRhLmdldEZpbGVFeHRlbnNpb24oZGVwbG95bWVudEZpbGVEYXRhLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICBpZiAoImNsYXNzIi5lcXVhbHMoZXh0ZW5zaW9uKSkgewotICAgICAgICAgICAgICAgIEZpbGUgZmlsZSA9IGRlcGxveW1lbnRGaWxlRGF0YS5nZXRGaWxlKCk7Ci0gICAgICAgICAgICAgICAgRmlsZSBwYXJlbnRGaWxlID0gZmlsZS5nZXRQYXJlbnRGaWxlKCk7Ci0gICAgICAgICAgICAgICAgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgVXRpbHMuZ2V0Q2xhc3NMb2FkZXIoY29uZmlnQ3R4LmdldEF4aXNDb25maWd1cmF0aW9uKCkuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFN5c3RlbUNsYXNzTG9hZGVyKCksIHBhcmVudEZpbGUpOwotCi0gICAgICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIoY2xhc3NMb2FkZXIpOwotICAgICAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBmaWxlLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSBjbGFzc05hbWUucmVwbGFjZUFsbCgiLmNsYXNzIiwgIiIpOwotICAgICAgICAgICAgICAgIENsYXNzIGNsYXp6ID0gTG9hZGVyLmxvYWRDbGFzcyhjbGFzc05hbWUpOwotICAgICAgICAgICAgICAgIGxvZy5pbmZvKE1lc3NhZ2VzLmdldE1lc3NhZ2UoRGVwbG95bWVudEVycm9yTXNncy5ERVBMT1lJTkdfUE9KTywKLSAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlcGxveW1lbnRGaWxlRGF0YS5nZXRGaWxlKCkuZ2V0QWJzb2x1dGVQYXRoKCkpKTsKLQotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogU2NoZW1hIGdlbmVydGFpb24gZG9uZSBpbiB0d28gc3RhZ2UgMS4gTG9hZCBhbGwgdGhlIG1ldGhvZHMgYW5kCi0gICAgICAgICAgICAgICAgICogY3JlYXRlIHR5cGUgZm9yIG1ldGhvZHMgcGFyYW1ldGVycyAoaWYgdGhlIHBhcmFtZXRlcnMgYXJlIEJlYW4KLSAgICAgICAgICAgICAgICAgKiB0aGVuIGl0IHdpbGwgY3JlYXRlIENvbXBsZXggdHlwZXMgZm9yIHRob3NlICwgYW5kIGlmIHRoZQotICAgICAgICAgICAgICAgICAqIHBhcmFtZXRlcnMgYXJlIHNpbXBsZSB0eXBlIHdoaWNoIGRlY3JpYmUgaW4gU2ltcGxlVHlwZVRhYmxlCi0gICAgICAgICAgICAgICAgICogbm90aGluZyB3aWxsIGhhcHBlbikgMi4gSW4gdGhlIG5leHQgc3RhZ2UgZm9yIGFsbCB0aGUgbWV0aG9kcwotICAgICAgICAgICAgICAgICAqIG1lc3NhZ2VzIGFuZCBwb3J0IHR5cGVzIHdpbGwgYmUgY3JldGVhdGVkCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgV2ViU2VydmljZSBhbm5vdGF0aW9uID0gKFdlYlNlcnZpY2UpIGNsYXp6LmdldEFubm90YXRpb24oV2ViU2VydmljZS5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgaWYgKGFubm90YXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAvLyB0cnkgdG8gc2VlIHdoZXRoZXIgSkFYLVdTIGphcnMgaW4gdGhlIGNsYXNzIHBhdGggLCBpZiBzbyB1c2UgdGhlbQotICAgICAgICAgICAgICAgICAgICAvLyB0byBwcm9jZXNzIGFubm90YXRlZCBwb2pvIGVsc2UgdXNlIGFubm9nZW4gdG8gcHJvY2VzcyB0aGUgcG9qbyBjbGFzcwotICAgICAgICAgICAgICAgICAgICBBeGlzU2VydmljZSBheGlzU2VydmljZTsKLSAgICAgICAgICAgICAgICAgICAgYXhpc1NlcnZpY2UgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUF4aXNTZXJ2aWNlKGNsYXNzTG9hZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwbG95bWVudEZpbGVEYXRhLmdldEZpbGUoKS50b1VSTCgpKTsKLSAgICAgICAgICAgICAgICAgICAgY29uZmlnQ3R4LmdldEF4aXNDb25maWd1cmF0aW9uKCkuYWRkU2VydmljZShheGlzU2VydmljZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUF4aXNTZXJ2aWNlVXNpbmdBbm5vZ2VuKGNsYXNzTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTG9hZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwbG95bWVudEZpbGVEYXRhLmdldEZpbGUoKS50b1VSTCgpKTsKLSAgICAgICAgICAgICAgICAgICAgY29uZmlnQ3R4LmdldEF4aXNDb25maWd1cmF0aW9uKCkuYWRkU2VydmljZShheGlzU2VydmljZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IGVsc2UgaWYgKCJqYXIiLmVxdWFscyhleHRlbnNpb24pKSB7Ci0gICAgICAgICAgICAgICAgQXJyYXlMaXN0IGNsYXNzTGlzdDsKLSAgICAgICAgICAgICAgICBGaWxlSW5wdXRTdHJlYW0gZmluID0gbnVsbDsKLSAgICAgICAgICAgICAgICBaaXBJbnB1dFN0cmVhbSB6aW4gPSBudWxsOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZGVwbG95bWVudEZpbGVEYXRhLmdldEFic29sdXRlUGF0aCgpKTsKLSAgICAgICAgICAgICAgICAgICAgemluID0gbmV3IFppcElucHV0U3RyZWFtKGZpbik7Ci0gICAgICAgICAgICAgICAgICAgIFppcEVudHJ5IGVudHJ5OwotICAgICAgICAgICAgICAgICAgICBjbGFzc0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlICgoZW50cnkgPSB6aW4uZ2V0TmV4dEVudHJ5KCkpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gZW50cnkuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUuZW5kc1dpdGgoIi5jbGFzcyIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NMaXN0LmFkZChuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB6aW4uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgZmluLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKE1lc3NhZ2VzLmdldE1lc3NhZ2UoRGVwbG95bWVudEVycm9yTXNncy5ERVBMT1lJTkdfRVhDRVBUSU9OLGUuZ2V0TWVzc2FnZSgpKSxlKTsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHppbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB6aW4uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoZmluICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbi5jbG9zZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEFycmF5TGlzdCBheGlzU2VydmljZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgZm9yIChPYmplY3QgYUNsYXNzTGlzdCA6IGNsYXNzTGlzdCkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gKFN0cmluZylhQ2xhc3NMaXN0OwotICAgICAgICAgICAgICAgICAgICBBcnJheUxpc3QgdXJscyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICAgICAgdXJscy5hZGQoZGVwbG95bWVudEZpbGVEYXRhLmdldEZpbGUoKS50b1VSTCgpKTsKLSAgICAgICAgICAgICAgICAgICAgdXJscy5hZGQoY29uZmlnQ3R4LmdldEF4aXNDb25maWd1cmF0aW9uKCkuZ2V0UmVwb3NpdG9yeSgpKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHdlYkxvY2F0aW9uID0gRGVwbG95bWVudEVuZ2luZS5nZXRXZWJMb2NhdGlvblN0cmluZygpOwotICAgICAgICAgICAgICAgICAgICBpZiAod2ViTG9jYXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdXJscy5hZGQobmV3IEZpbGUod2ViTG9jYXRpb24pLnRvVVJMKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyID0gVXRpbHMuY3JlYXRlQ2xhc3NMb2FkZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWdDdHguZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5nZXRTeXN0ZW1DbGFzc0xvYWRlcigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZpbGUpY29uZmlnQ3R4LmdldEF4aXNDb25maWd1cmF0aW9uKCkuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRQYXJhbWV0ZXJWYWx1ZShDb25zdGFudHMuQ29uZmlndXJhdGlvbi5BUlRJRkFDVFNfVEVNUF9ESVIpKTsKLSAgICAgICAgICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIoY2xhc3NMb2FkZXIpOwotICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSBjbGFzc05hbWUucmVwbGFjZUFsbCgiLmNsYXNzIiwgIiIpOwotICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSBjbGFzc05hbWUucmVwbGFjZUFsbCgiLyIsICIuIik7Ci0gICAgICAgICAgICAgICAgICAgIENsYXNzIGNsYXp6ID0gTG9hZGVyLmxvYWRDbGFzcyhjbGFzc05hbWUpOwotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgKiBTY2hlbWEgZ2VuZXJhdGlvbiBkb25lIGluIHR3byBzdGFnZSAxLiBMb2FkIGFsbCB0aGUgbWV0aG9kcyBhbmQKLSAgICAgICAgICAgICAgICAgICAgICogY3JlYXRlIHR5cGUgZm9yIG1ldGhvZHMgcGFyYW1ldGVycyAoaWYgdGhlIHBhcmFtZXRlcnMgYXJlIEJlYW4KLSAgICAgICAgICAgICAgICAgICAgICogdGhlbiBpdCB3aWxsIGNyZWF0ZSBDb21wbGV4IHR5cGVzIGZvciB0aG9zZSAsIGFuZCBpZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICogcGFyYW1ldGVycyBhcmUgc2ltcGxlIHR5cGUgd2hpY2ggZGVjcmliZSBpbiBTaW1wbGVUeXBlVGFibGUKLSAgICAgICAgICAgICAgICAgICAgICogbm90aGluZyB3aWxsIGhhcHBlbikgMi4gSW4gdGhlIG5leHQgc3RhZ2UgZm9yIGFsbCB0aGUgbWV0aG9kcwotICAgICAgICAgICAgICAgICAgICAgKiBtZXNzYWdlcyBhbmQgcG9ydCB0eXBlcyB3aWxsIGJlIGNyZXRlYXRlZAotICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgV2ViU2VydmljZSBhbm5vdGF0aW9uID0gKFdlYlNlcnZpY2UpY2xhenouZ2V0QW5ub3RhdGlvbihXZWJTZXJ2aWNlLmNsYXNzKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGFubm90YXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICBheGlzU2VydmljZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUF4aXNTZXJ2aWNlKGNsYXNzTG9hZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcGxveW1lbnRGaWxlRGF0YS5nZXRGaWxlKCkudG9VUkwoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBheGlzU2VydmljZUxpc3QuYWRkKGF4aXNTZXJ2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChheGlzU2VydmljZUxpc3Quc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBBeGlzU2VydmljZUdyb3VwIHNlcnZpY2VHcm91cCA9IG5ldyBBeGlzU2VydmljZUdyb3VwKCk7Ci0gICAgICAgICAgICAgICAgICAgIHNlcnZpY2VHcm91cC5zZXRTZXJ2aWNlR3JvdXBOYW1lKGRlcGxveW1lbnRGaWxlRGF0YS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKE9iamVjdCBhbkF4aXNTZXJ2aWNlTGlzdCA6IGF4aXNTZXJ2aWNlTGlzdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UgPSAoQXhpc1NlcnZpY2UpYW5BeGlzU2VydmljZUxpc3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlR3JvdXAuYWRkU2VydmljZShheGlzU2VydmljZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY29uZmlnQ3R4LmdldEF4aXNDb25maWd1cmF0aW9uKCkuYWRkU2VydmljZUdyb3VwKHNlcnZpY2VHcm91cCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJFcnJvcjpcbiBObyBhbm5vdGF0ZWQgY2xhc3NlcyBmb3VuZCBpbiB0aGUgamFyOiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBsb3ltZW50RmlsZURhdGEuZ2V0RmlsZSgpLmdldE5hbWUoKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIi4gU2VydmljZSBkZXBsb3ltZW50IGZhaWxlZC4iOwotICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3IobXNnKTsKLSAgICAgICAgICAgICAgICAgICAgY29uZmlnQ3R4LmdldEF4aXNDb25maWd1cmF0aW9uKCkuZ2V0RmF1bHR5U2VydmljZXMoKS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXQoZGVwbG95bWVudEZpbGVEYXRhLmdldEZpbGUoKS5nZXRBYnNvbHV0ZVBhdGgoKSwgbXNnKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoTWVzc2FnZXMuZ2V0TWVzc2FnZShEZXBsb3ltZW50RXJyb3JNc2dzLlNUT1JJTkdfRkFVTFRZX1NFUlZJQ0UsZS5nZXRNZXNzYWdlKCkpLGUpOwotICAgICAgICAgICAgc3RvcmVGYXVsdHlTZXJ2aWNlKGRlcGxveW1lbnRGaWxlRGF0YSwgZSk7Ci0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoTWVzc2FnZXMuZ2V0TWVzc2FnZShEZXBsb3ltZW50RXJyb3JNc2dzLlNUT1JJTkdfRkFVTFRZX1NFUlZJQ0UsdC5nZXRNZXNzYWdlKCkpLHQpOwotICAgICAgICAgICAgc3RvcmVGYXVsdHlTZXJ2aWNlKGRlcGxveW1lbnRGaWxlRGF0YSwgdCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAodGhyZWFkQ2xhc3NMb2FkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyKHRocmVhZENsYXNzTG9hZGVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzdG9yZUZhdWx0eVNlcnZpY2UoRGVwbG95bWVudEZpbGVEYXRhIGRlcGxveW1lbnRGaWxlRGF0YSwgVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgU3RyaW5nV3JpdGVyIGVycm9yV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgICAgICBQcmludFdyaXRlciBwdGludFdyaXRlciA9IG5ldyBQcmludFdyaXRlcihlcnJvcldyaXRlcik7Ci0gICAgICAgIHQucHJpbnRTdGFja1RyYWNlKHB0aW50V3JpdGVyKTsKLSAgICAgICAgU3RyaW5nIGVycm9yID0gIkVycm9yOlxuIiArIGVycm9yV3JpdGVyLnRvU3RyaW5nKCk7Ci0gICAgICAgIGNvbmZpZ0N0eC5nZXRBeGlzQ29uZmlndXJhdGlvbigpLmdldEZhdWx0eVNlcnZpY2VzKCkuCi0gICAgICAgICAgICAgICAgcHV0KGRlcGxveW1lbnRGaWxlRGF0YS5nZXRGaWxlKCkuZ2V0QWJzb2x1dGVQYXRoKCksIGVycm9yKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEF4aXNTZXJ2aWNlIGNyZWF0ZUF4aXNTZXJ2aWNlKENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTCBzZXJ2aWNlTG9jYXRpb24pIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLAotICAgICAgICAgICAgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwKLSAgICAgICAgICAgIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sCi0gICAgICAgICAgICBBeGlzRmF1bHQgewotICAgICAgICBBeGlzU2VydmljZSBheGlzU2VydmljZTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIENsYXNzIGNsYXh4ID0gQ2xhc3MuZm9yTmFtZSgKLSAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRGVzY3JpcHRpb25GYWN0b3J5Iik7Ci0gICAgICAgICAgICBNZXRob2QgbXRob2QgPSBjbGF4eC5nZXRNZXRob2QoImNyZWF0ZUF4aXNTZXJ2aWNlIiwgQ2xhc3MuY2xhc3MpOwotICAgICAgICAgICAgQ2xhc3MgcG9qb0NsYXNzID0gTG9hZGVyLmxvYWRDbGFzcyhjbGFzc0xvYWRlciwgY2xhc3NOYW1lKTsKLSAgICAgICAgICAgIGF4aXNTZXJ2aWNlID0gKEF4aXNTZXJ2aWNlKSBtdGhvZC5pbnZva2UoY2xheHgsIHBvam9DbGFzcyk7Ci0gICAgICAgICAgICBpZiAoYXhpc1NlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIEl0ZXJhdG9yIG9wZXJhdGlvbnMgPSBheGlzU2VydmljZS5nZXRPcGVyYXRpb25zKCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKG9wZXJhdGlvbnMuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEF4aXNPcGVyYXRpb24gYXhpc09wZXJhdGlvbiA9IChBeGlzT3BlcmF0aW9uKSBvcGVyYXRpb25zLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGF4aXNPcGVyYXRpb24uZ2V0TWVzc2FnZVJlY2VpdmVyKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyBqYXh3c01SID0gTG9hZGVyLmxvYWRDbGFzcygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNlcnZlci5KQVhXU01lc3NhZ2VSZWNlaXZlciIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VSZWNlaXZlciBqYXh3c01SSW5zdGFuY2UgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE1lc3NhZ2VSZWNlaXZlcikgamF4d3NNUi5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNPcGVyYXRpb24uc2V0TWVzc2FnZVJlY2VpdmVyKGpheHdzTVJJbnN0YW5jZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiRXJyb3Igb2NjdXJkZSB3aGlsZSBsb2FkaW5nIEpBWFdTTWVzc2FnZVJlY2VpdmVyIGZvciAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGNsYXNzTmFtZSApOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXhpc1NlcnZpY2Uuc2V0RWxlbWVudEZvcm1EZWZhdWx0KGZhbHNlKTsKLSAgICAgICAgICAgIGF4aXNTZXJ2aWNlLnNldEZpbGVOYW1lKHNlcnZpY2VMb2NhdGlvbik7Ci0gICAgICAgICAgICBVdGlscy5maWxsQXhpc1NlcnZpY2UoYXhpc1NlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgIGNvbmZpZ0N0eC5nZXRBeGlzQ29uZmlndXJhdGlvbigpLAotICAgICAgICAgICAgICAgICAgICBuZXcgQXJyYXlMaXN0KCksCi0gICAgICAgICAgICAgICAgICAgIG5ldyBBcnJheUxpc3QoKSk7Ci0gICAgICAgICAgICAvL05vdCBuZWVkZWQgYXQgdGhpcyBjYXNlLCB0aGUgbWVzc2FnZSByZWNlaXZlcnMgYWx3YXlzIHNldCB0byBSUEMgaWYgdGhpcyBleGVjdXRlcwotICAgICAgICAgICAgLy9zZXRNZXNzYWdlUmVjZWl2ZXJzKGF4aXNTZXJ2aWNlKTsKLSAgICAgICAgICAgIAotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gU2VlbXMgbGlrZSB0aGUgamF4LXdzIGphcnMgbWlzc2luZyBpbiB0aGUgY2xhc3MgcGF0aCAuCi0gICAgICAgICAgICAvLyBsZXRzIHRyeSB3aXRoIGFubm9nZW4KLSAgICAgICAgICAgIGxvZy5pbmZvKE1lc3NhZ2VzLmdldE1lc3NhZ2UoRGVwbG95bWVudEVycm9yTXNncy5KQVhXU19KQVJTX01JU1NJTkcsZS5nZXRNZXNzYWdlKCkpLGUpOwotICAgICAgICAgICAgYXhpc1NlcnZpY2UgPSBjcmVhdGVBeGlzU2VydmljZVVzaW5nQW5ub2dlbihjbGFzc05hbWUsIGNsYXNzTG9hZGVyLCBzZXJ2aWNlTG9jYXRpb24pOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBheGlzU2VydmljZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEF4aXNTZXJ2aWNlIGNyZWF0ZUF4aXNTZXJ2aWNlVXNpbmdBbm5vZ2VuKFN0cmluZyBjbGFzc05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc0xvYWRlciBjbGFzc0xvYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTCBzZXJ2aWNlTG9jYXRpb24pCi0gICAgICAgICAgICB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiwKLSAgICAgICAgICAgIEluc3RhbnRpYXRpb25FeGNlcHRpb24sCi0gICAgICAgICAgICBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLAotICAgICAgICAgICAgQXhpc0ZhdWx0IHsKLSAgICAgICAgSGFzaE1hcCBtZXNzYWdlUmVjaXZlck1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIENsYXNzIGluT25seU1lc3NhZ2VSZWNlaXZlciA9IExvYWRlci5sb2FkQ2xhc3MoCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuYXhpczIucnBjLnJlY2VpdmVycy5SUENJbk9ubHlNZXNzYWdlUmVjZWl2ZXIiKTsKLSAgICAgICAgTWVzc2FnZVJlY2VpdmVyIG1lc3NhZ2VSZWNlaXZlciA9Ci0gICAgICAgICAgICAgICAgKE1lc3NhZ2VSZWNlaXZlcikgaW5Pbmx5TWVzc2FnZVJlY2VpdmVyLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIG1lc3NhZ2VSZWNpdmVyTWFwLnB1dChXU0RMMkNvbnN0YW50cy5NRVBfVVJJX0lOX09OTFksCi0gICAgICAgICAgICAgICAgbWVzc2FnZVJlY2VpdmVyKTsKLSAgICAgICAgQ2xhc3MgaW5vdXRNZXNzYWdlUmVjZWl2ZXIgPSBMb2FkZXIubG9hZENsYXNzKAotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmF4aXMyLnJwYy5yZWNlaXZlcnMuUlBDTWVzc2FnZVJlY2VpdmVyIik7Ci0gICAgICAgIE1lc3NhZ2VSZWNlaXZlciBpbk91dG1lc3NhZ2VSZWNlaXZlciA9Ci0gICAgICAgICAgICAgICAgKE1lc3NhZ2VSZWNlaXZlcikgaW5vdXRNZXNzYWdlUmVjZWl2ZXIubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgbWVzc2FnZVJlY2l2ZXJNYXAucHV0KFdTREwyQ29uc3RhbnRzLk1FUF9VUklfSU5fT1VULAotICAgICAgICAgICAgICAgIGluT3V0bWVzc2FnZVJlY2VpdmVyKTsKLSAgICAgICAgbWVzc2FnZVJlY2l2ZXJNYXAucHV0KFdTREwyQ29uc3RhbnRzLk1FUF9VUklfUk9CVVNUX0lOX09OTFksCi0gICAgICAgICAgICAgICAgaW5PdXRtZXNzYWdlUmVjZWl2ZXIpOwotICAgICAgICBBeGlzU2VydmljZSBheGlzU2VydmljZSA9Ci0gICAgICAgICAgICAgICAgQXhpc1NlcnZpY2UuY3JlYXRlU2VydmljZShjbGFzc05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25maWdDdHguZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VSZWNpdmVyTWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTG9hZGVyKTsKLSAgICAgICAgYXhpc1NlcnZpY2Uuc2V0RmlsZU5hbWUoc2VydmljZUxvY2F0aW9uKTsKLSAgICAgICAgcmV0dXJuIGF4aXNTZXJ2aWNlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2VSZWNlaXZlcnMoQXhpc1NlcnZpY2Ugc2VydmljZSkgewotICAgICAgICBJdGVyYXRvciBpdGVyYXRvciA9IHNlcnZpY2UuZ2V0T3BlcmF0aW9ucygpOwotICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBBeGlzT3BlcmF0aW9uIG9wZXJhdGlvbiA9IChBeGlzT3BlcmF0aW9uKSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICBTdHJpbmcgTUVQID0gb3BlcmF0aW9uLmdldE1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4oKTsKLSAgICAgICAgICAgIGlmIChNRVAgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChXU0RMMkNvbnN0YW50cy5NRVBfVVJJX0lOX09OTFkuZXF1YWxzKE1FUCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzIGluT25seU1lc3NhZ2VSZWNlaXZlciA9IExvYWRlci5sb2FkQ2xhc3MoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmF4aXMyLnJwYy5yZWNlaXZlcnMuUlBDSW5Pbmx5TWVzc2FnZVJlY2VpdmVyIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlUmVjZWl2ZXIgbWVzc2FnZVJlY2VpdmVyID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE1lc3NhZ2VSZWNlaXZlcikgaW5Pbmx5TWVzc2FnZVJlY2VpdmVyLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24uc2V0TWVzc2FnZVJlY2VpdmVyKG1lc3NhZ2VSZWNlaXZlcik7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyBpbm91dE1lc3NhZ2VSZWNlaXZlciA9IExvYWRlci5sb2FkQ2xhc3MoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmF4aXMyLnJwYy5yZWNlaXZlcnMuUlBDTWVzc2FnZVJlY2VpdmVyIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlUmVjZWl2ZXIgaW5PdXRtZXNzYWdlUmVjZWl2ZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTWVzc2FnZVJlY2VpdmVyKSBpbm91dE1lc3NhZ2VSZWNlaXZlci5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uLnNldE1lc3NhZ2VSZWNlaXZlcihpbk91dG1lc3NhZ2VSZWNlaXZlcik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREaXJlY3RvcnkoU3RyaW5nIGRpcmVjdG9yeSkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEV4dGVuc2lvbihTdHJpbmcgZXh0ZW5zaW9uKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdW5EZXBsb3koU3RyaW5nIGZpbGVOYW1lKSB7Ci0gICAgICAgIGZpbGVOYW1lID0gVXRpbHMuZ2V0U2hvcnRGaWxlTmFtZShmaWxlTmFtZSk7Ci0gICAgICAgIGlmIChmaWxlTmFtZS5lbmRzV2l0aCgiLmNsYXNzIikpIHsKLSAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBmaWxlTmFtZS5yZXBsYWNlQWxsKCIuY2xhc3MiLCAiIik7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIEF4aXNTZXJ2aWNlR3JvdXAgc2VydmljZUdyb3VwID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ0N0eC5nZXRBeGlzQ29uZmlndXJhdGlvbigpLnJlbW92ZVNlcnZpY2VHcm91cChjbGFzc05hbWUpOwotICAgICAgICAgICAgICAgIGNvbmZpZ0N0eC5yZW1vdmVTZXJ2aWNlR3JvdXBDb250ZXh0KHNlcnZpY2VHcm91cCk7Ci0gICAgICAgICAgICAgICAgbG9nLmluZm8oTWVzc2FnZXMuZ2V0TWVzc2FnZShEZXBsb3ltZW50RXJyb3JNc2dzLlNFUlZJQ0VfUkVNT1ZFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgYXhpc0ZhdWx0KSB7Ci0gICAgICAgICAgICAgICAgLy9NYXkgYmUgYSBmYXVsdHkgc2VydmljZQotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhNZXNzYWdlcy5nZXRNZXNzYWdlKERlcGxveW1lbnRFcnJvck1zZ3MuRkFVTFRZX1NFUlZJQ0VfUkVNT1ZBTCxheGlzRmF1bHQuZ2V0TWVzc2FnZSgpKSxheGlzRmF1bHQpOwotICAgICAgICAgICAgICAgIGNvbmZpZ0N0eC5nZXRBeGlzQ29uZmlndXJhdGlvbigpLnJlbW92ZUZhdWx0eVNlcnZpY2UoZmlsZU5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGZpbGVOYW1lLmVuZHNXaXRoKCIuamFyIikpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgQXhpc1NlcnZpY2VHcm91cCBzZXJ2aWNlR3JvdXAgPQotICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnQ3R4LmdldEF4aXNDb25maWd1cmF0aW9uKCkucmVtb3ZlU2VydmljZUdyb3VwKGZpbGVOYW1lKTsKLSAgICAgICAgICAgICAgICBjb25maWdDdHgucmVtb3ZlU2VydmljZUdyb3VwQ29udGV4dChzZXJ2aWNlR3JvdXApOwotICAgICAgICAgICAgICAgIGxvZy5pbmZvKE1lc3NhZ2VzLmdldE1lc3NhZ2UoRGVwbG95bWVudEVycm9yTXNncy5TRVJWSUNFX1JFTU9WRUQsCi0gICAgICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZSkpOwotICAgICAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGF4aXNGYXVsdCkgewotICAgICAgICAgICAgICAgIC8vTWF5IGJlIGEgZmF1bHR5IHNlcnZpY2UKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoTWVzc2FnZXMuZ2V0TWVzc2FnZShEZXBsb3ltZW50RXJyb3JNc2dzLkZBVUxUWV9TRVJWSUNFX1JFTU9WQUwsYXhpc0ZhdWx0LmdldE1lc3NhZ2UoKSksYXhpc0ZhdWx0KTsKLSAgICAgICAgICAgICAgICBjb25maWdDdHguZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5yZW1vdmVGYXVsdHlTZXJ2aWNlKGZpbGVOYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvUmVwb3NpdG9yeUxpc3RlbmVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9SZXBvc2l0b3J5TGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzUxNGVmNi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9SZXBvc2l0b3J5TGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LnJlcG9zaXRvcnkudXRpbC5EZXBsb3ltZW50RmlsZURhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LnJlcG9zaXRvcnkudXRpbC5XU0luZm87Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LnJlcG9zaXRvcnkudXRpbC5XU0luZm9MaXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC51dGlsLlV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5Mb2FkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmV0LlVSTENsYXNzTG9hZGVyOwotaW1wb3J0IGphdmEubmV0LlVSTERlY29kZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLXB1YmxpYyBjbGFzcyBSZXBvc2l0b3J5TGlzdGVuZXIgaW1wbGVtZW50cyBEZXBsb3ltZW50Q29uc3RhbnRzIHsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhSZXBvc2l0b3J5TGlzdGVuZXIuY2xhc3MpOwotCi0gICAgcHJvdGVjdGVkIERlcGxveW1lbnRFbmdpbmUgZGVwbG95bWVudEVuZ2luZTsKLQotICAgIC8qKiBSZWZlcmVuY2UgdG8gYSBXU0luZm9MaXN0ICovCi0gICAgcHJvdGVjdGVkIFdTSW5mb0xpc3Qgd3NJbmZvTGlzdDsKLQotICAgIC8qKgotICAgICAqIFRoaXMgY29uc3RydWN0b3IgdGFrZXMgdHdvIGFyZ3VtZW50cywgYSBmb2xkZXIgbmFtZSBhbmQgYSByZWZlcmVuY2UgdG8gRGVwbG95bWVudCBFbmdpbmUKLSAgICAgKiBGaXJzdCwgaXQgaW5pdGlhbGl6ZXMgdGhlIHN5c3RlbSwgYnkgbG9hZGluZyBhbGwgdGhlIG1vZHVsZXMgaW4gdGhlIC9tb2R1bGVzIGRpcmVjdG9yeSBhbmQKLSAgICAgKiB0aGVuIGNyZWF0ZXMgYSBXU0luZm9MaXN0IHRvIHN0b3JlIGluZm9ybWF0aW9uIGFib3V0IGF2YWlsYWJsZSBtb2R1bGVzIGFuZCBzZXJ2aWNlcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBkZXBsb3ltZW50RW5naW5lIHJlZmVyZW5jZSB0byBlbmdpbmUgcmVnaXN0cnkgZm9yIHVwZGF0ZXMKLSAgICAgKiBAcGFyYW0gaXNDbGFzc3BhdGggICAgICB0cnVlIGlmIHRoaXMgUmVwb3NpdG9yeUxpc3RlbmVyIHNob3VsZCBzY2FuIHRoZSBjbGFzc3BhdGggZm9yCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgTW9kdWxlcwotICAgICAqLwotICAgIHB1YmxpYyBSZXBvc2l0b3J5TGlzdGVuZXIoRGVwbG95bWVudEVuZ2luZSBkZXBsb3ltZW50RW5naW5lLCBib29sZWFuIGlzQ2xhc3NwYXRoKSB7Ci0gICAgICAgIHRoaXMuZGVwbG95bWVudEVuZ2luZSA9IGRlcGxveW1lbnRFbmdpbmU7Ci0gICAgICAgIHdzSW5mb0xpc3QgPSBuZXcgV1NJbmZvTGlzdChkZXBsb3ltZW50RW5naW5lKTsKLSAgICAgICAgaW5pdDIoaXNDbGFzc3BhdGgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGluaXQyKGJvb2xlYW4gaXNDbGFzc3BhdGgpIHsKLSAgICAgICAgaWYgKCFpc0NsYXNzcGF0aCkgewotICAgICAgICAgICAgaW5pdCgpOwotICAgICAgICB9Ci0gICAgICAgIGxvYWRDbGFzc1BhdGhNb2R1bGVzKCk7Ci0gICAgfQotCi0gICAgLyoqIEZpbmRzIGEgbGlzdCBvZiBtb2R1bGVzIGluIHRoZSBmb2xkZXIgYW5kIGFkZHMgdG8gd3NJbmZvTGlzdC4gKi8KLSAgICBwdWJsaWMgdm9pZCBjaGVja01vZHVsZXMoKSB7Ci0gICAgICAgIEZpbGUgcm9vdCA9IGRlcGxveW1lbnRFbmdpbmUuZ2V0TW9kdWxlc0RpcigpOwotICAgICAgICBGaWxlW10gZmlsZXMgPSByb290Lmxpc3RGaWxlcygpOwotCi0gICAgICAgIGlmIChmaWxlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgRmlsZSBmaWxlID0gZmlsZXNbaV07Ci0gICAgICAgICAgICAgICAgaWYgKGlzU291cmNlQ29udHJvbERpcihmaWxlKSkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCFmaWxlLmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERlcGxveW1lbnRGaWxlRGF0YS5pc01vZHVsZUFyY2hpdmVGaWxlKGZpbGUuZ2V0TmFtZSgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYWRkRmlsZVRvRGVwbG95KGZpbGUsIGRlcGxveW1lbnRFbmdpbmUuZ2V0TW9kdWxlRGVwbG95ZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU0luZm8uVFlQRV9NT0RVTEUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCEibGliIi5lcXVhbHNJZ25vcmVDYXNlKGZpbGUuZ2V0TmFtZSgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYWRkRmlsZVRvRGVwbG95KGZpbGUsIGRlcGxveW1lbnRFbmdpbmUuZ2V0TW9kdWxlRGVwbG95ZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU0luZm8uVFlQRV9NT0RVTEUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1NvdXJjZUNvbnRyb2xEaXIoRmlsZSBmaWxlKSB7Ci0gICAgICAgIGlmIChmaWxlLmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gZmlsZS5nZXROYW1lKCk7Ci0gICAgICAgICAgICBpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJDVlMiKSB8fCBuYW1lLmVxdWFsc0lnbm9yZUNhc2UoIi5zdm4iKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBsb2FkQ2xhc3NQYXRoTW9kdWxlcygpIHsKLSAgICAgICAgTW9kdWxlRGVwbG95ZXIgZGVwbG95ZXIgPSBkZXBsb3ltZW50RW5naW5lLmdldE1vZHVsZURlcGxveWVyKCk7Ci0KLSAgICAgICAgLy8gRmluZCBNb2R1bGVzIG9uIHRoZSBjbGFzcyBwYXRoIChpLmUuIGlmIGNsYXNzcGF0aCBpbmNsdWRlcyAiYWRkcmVzc2luZy5tYXIiIHRoZW4KLSAgICAgICAgLy8gYWRkcmVzc2luZyB3aWxsIGJlIGF2YWlsYWJsZSBmb3IgZW5nYWdpbmcpCi0KLSAgICAgICAgQ2xhc3NMb2FkZXIgbG9hZGVyID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEVudW1lcmF0aW9uIG1vZHVsZVVSTHMgPSBsb2FkZXIuZ2V0UmVzb3VyY2VzKCJNRVRBLUlORi9tb2R1bGUueG1sIik7Ci0gICAgICAgICAgICB3aGlsZSAobW9kdWxlVVJMcy5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIFVSTCB1cmwgPSAoVVJMKW1vZHVsZVVSTHMubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgVVJJIG1vZHVsZVVSSTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHVybC5nZXRQcm90b2NvbCgpLmVxdWFscygiZmlsZSIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdXJsU3RyaW5nID0gdXJsLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVVUkkgPSBuZXcgVVJJKHVybFN0cmluZy5zdWJzdHJpbmcoMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsU3RyaW5nLmxhc3RJbmRleE9mKCIvTUVUQS1JTkYvbW9kdWxlLnhtbCIpKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgVVJMIHJlZmVycyB0byBhbiBhcmNoaXZlIChzdWNoIGFzCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBqYXI6ZmlsZTovZGlyL3NvbWUuamFyIS9NRVRBLUlORi9tb2R1bGUueG1sKSBhbmQgZXh0cmFjdCB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVSTCBvZiB0aGUgYXJjaGl2ZS4gSW4gZ2VuZXJhbCB0aGUgcHJvdG9jb2wgd2lsbCBiZSAiamFyIiwgYnV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBzb21lIGNvbnRhaW5lcnMgbWF5IHVzZSBvdGhlciBwcm90b2NvbHMsIGUuZy4gV2ViU3BoZXJlIHVzZXMKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vICJ3c2phciIgKEFYSVMyLTQyNTgpLgotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhdGggPSB1cmwuZ2V0UGF0aCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlkeCA9IHBhdGgubGFzdEluZGV4T2YoIiEvIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWR4ICE9IC0xICYmIHBhdGguc3Vic3RyaW5nKGlkeCsyKS5lcXVhbHMoIk1FVEEtSU5GL21vZHVsZS54bWwiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVVSSSA9IG5ldyBVUkkocGF0aC5zdWJzdHJpbmcoMCwgaWR4KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtb2R1bGVVUkkuZ2V0U2NoZW1lKCkuZXF1YWxzKCJmaWxlIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgIAotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkRlcGxveWluZyBtb2R1bGUgZnJvbSBjbGFzc3BhdGggYXQgJyIgKyBtb2R1bGVVUkkgKyAiJyIpOwotICAgICAgICAgICAgICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShtb2R1bGVVUkkpOwotICAgICAgICAgICAgICAgICAgICBhZGRGaWxlVG9EZXBsb3koZiwgZGVwbG95ZXIsIFdTSW5mby5UWVBFX01PRFVMRSk7Ci0KLSAgICAgICAgICAgICAgICB9IGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuaW5mbyhlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBPaCB3ZWxsLCBsb2cgdGhlIHByb2JsZW0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhlKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBjbGFzc1BhdGggPSBnZXRMb2NhdGlvbigpOwotCi0gICAgICAgIGlmIChjbGFzc1BhdGggPT0gbnVsbCkgcmV0dXJuOwotCi0gICAgICAgIGludCBsc3RpbmRleCA9IGNsYXNzUGF0aC5sYXN0SW5kZXhPZihGaWxlLnNlcGFyYXRvckNoYXIpOwotICAgICAgICBpZiAobHN0aW5kZXggPiAwKSB7Ci0gICAgICAgICAgICBjbGFzc1BhdGggPSBjbGFzc1BhdGguc3Vic3RyaW5nKDAsIGxzdGluZGV4KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNsYXNzUGF0aCA9ICIuIjsKLSAgICAgICAgfQotICAgICAgICBGaWxlIHJvb3QgPSBuZXcgRmlsZShjbGFzc1BhdGgpOwotICAgICAgICBGaWxlW10gZmlsZXMgPSByb290Lmxpc3RGaWxlcygpOwotICAgICAgICBpZiAoZmlsZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIEZpbGUgZmlsZSA9IGZpbGVzW2ldOwotICAgICAgICAgICAgICAgIGlmICghZmlsZS5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChEZXBsb3ltZW50RmlsZURhdGEuaXNNb2R1bGVBcmNoaXZlRmlsZShmaWxlLmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vYWRkaW5nIG1vZHVsZXMgaW4gdGhlIGNsYXNzIHBhdGgKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZEZpbGVUb0RlcGxveShmaWxlLCBkZXBsb3llciwgV1NJbmZvLlRZUEVfTU9EVUxFKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIENsYXNzTG9hZGVyIGNsID0gZGVwbG95bWVudEVuZ2luZS5nZXRBeGlzQ29uZmlnKCkuZ2V0TW9kdWxlQ2xhc3NMb2FkZXIoKTsKLSAgICAgICAgd2hpbGUgKGNsICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChjbCBpbnN0YW5jZW9mIFVSTENsYXNzTG9hZGVyKSB7Ci0gICAgICAgICAgICAgICAgVVJMW10gdXJscyA9ICgoVVJMQ2xhc3NMb2FkZXIpY2wpLmdldFVSTHMoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgKHVybHMgIT0gbnVsbCkgJiYgaSA8IHVybHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhdGggPSB1cmxzW2ldLmdldFBhdGgoKTsKLSAgICAgICAgICAgICAgICAgICAgLy9JZiBpdCBpcyBhIGRyaXZlIGxldHRlciwgYWRqdXN0IGFjY29yZGluZ2x5LgotICAgICAgICAgICAgICAgICAgICBpZiAocGF0aC5sZW5ndGgoKSA+PSAzICYmIHBhdGguY2hhckF0KDApID09ICcvJyAmJiBwYXRoLmNoYXJBdCgyKSA9PSAnOicpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhdGggPSBwYXRoLnN1YnN0cmluZygxKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCA9IFVSTERlY29kZXIuZGVjb2RlKHBhdGgsIFV0aWxzLmRlZmF1bHRFbmNvZGluZyk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gTG9nIHRoaXM/Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUocGF0aC5yZXBsYWNlKCcvJywgRmlsZS5zZXBhcmF0b3JDaGFyKS5yZXBsYWNlKCd8JywgJzonKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmaWxlLmlzRmlsZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoRGVwbG95bWVudEZpbGVEYXRhLmlzTW9kdWxlQXJjaGl2ZUZpbGUoZmlsZS5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9hZGRpbmcgbW9kdWxlcyBpbiB0aGUgY2xhc3MgcGF0aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZEZpbGVUb0RlcGxveShmaWxlLCBkZXBsb3llciwgV1NJbmZvLlRZUEVfTU9EVUxFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNsID0gY2wuZ2V0UGFyZW50KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBkZXBsb3ltZW50RW5naW5lLmRvRGVwbG95KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVG8gZ2V0IHRoZSBsb2NhdGlvbiBvZiB0aGUgQXhpczIuamFyIGZyb20gdGhhdCBJIGNhbiBkcml2ZSB0aGUgbG9jYXRpb24gb2YgY2xhc3MgcGF0aAotICAgICAqCi0gICAgICogQHJldHVybiBTdHJpbmcgKGxvY2F0aW9uIG9mIHRoZSBheGlzMiBqYXIpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRMb2NhdGlvbigpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIENsYXNzIGNsYXp6ID0gTG9hZGVyLmxvYWRDbGFzcygib3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0VuZ2luZSIpOwotICAgICAgICAgICAgamF2YS5uZXQuVVJMIHVybCA9IGNsYXp6LmdldFByb3RlY3Rpb25Eb21haW4oKS5nZXRDb2RlU291cmNlKCkuZ2V0TG9jYXRpb24oKTsKLSAgICAgICAgICAgIFN0cmluZyBsb2NhdGlvbiA9IHVybC50b1N0cmluZygpOwotICAgICAgICAgICAgaWYgKGxvY2F0aW9uLnN0YXJ0c1dpdGgoImphciIpKSB7Ci0gICAgICAgICAgICAgICAgdXJsID0gKChqYXZhLm5ldC5KYXJVUkxDb25uZWN0aW9uKXVybC5vcGVuQ29ubmVjdGlvbigpKS5nZXRKYXJGaWxlVVJMKCk7Ci0gICAgICAgICAgICAgICAgbG9jYXRpb24gPSB1cmwudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChsb2NhdGlvbi5zdGFydHNXaXRoKCJmaWxlIikpIHsKLSAgICAgICAgICAgICAgICBGaWxlIGZpbGUgPSBVdGlscy50b0ZpbGUodXJsKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHVybC50b1N0cmluZygpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiogRmluZHMgYSBsaXN0IG9mIHNlcnZpY2VzIGluIHRoZSBmb2xkZXIgYW5kIGFkZHMgdG8gd3NJbmZvTGlzdC4gKi8KLSAgICBwdWJsaWMgdm9pZCBjaGVja1NlcnZpY2VzKCkgewotICAgICAgICBmaW5kU2VydmljZXNJbkRpcmVjdG9yeSgpOwotICAgICAgICBsb2FkT3RoZXJEaXJlY3RvcmllcygpOwotICAgICAgICB1cGRhdGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGaXJzdCBpbml0aWFsaXplcyB0aGUgV1NJbmZvTGlzdCwgdGhlbiBjYWxscyBjaGVja01vZHVsZSB0byBsb2FkIGFsbCB0aGUgbW9kdWxlcyBhbmQgY2FsbHMKLSAgICAgKiB1cGRhdGUoKSB0byB1cGRhdGUgdGhlIERlcGxveW1lbnQgZW5naW5lIGFuZCBlbmdpbmUgcmVnaXN0cnkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW5pdCgpIHsKLSAgICAgICAgd3NJbmZvTGlzdC5pbml0KCk7Ci0gICAgICAgIGNoZWNrTW9kdWxlcygpOwotICAgICAgICBkZXBsb3ltZW50RW5naW5lLmRvRGVwbG95KCk7Ci0gICAgfQotCi0gICAgLy9UaGlzIHdpbGwgbG9hZCB0aGUgZmlsZXMgZnJvbSB0aGUgZGlyZWN0b3JpZXMKLSAgICAvLyBzcGVjaWZpZWQgYnkgYXhpczIueG1sIChBcyA8ZGVwbG95ZXI+KQotICAgIHByaXZhdGUgdm9pZCBsb2FkT3RoZXJEaXJlY3RvcmllcygpIHsKLSAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBNYXA8U3RyaW5nLCBEZXBsb3llcj4+IGVudHJ5IDogZGVwbG95bWVudEVuZ2luZS5nZXREZXBsb3llcnMoKS5lbnRyeVNldCgpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgZGlyZWN0b3J5ID0gZW50cnkuZ2V0S2V5KCk7Ci0gICAgICAgICAgICBNYXA8U3RyaW5nLCBEZXBsb3llcj4gZXh0ZW5zaW9uTWFwID0gZW50cnkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIGV4dGVuc2lvbiA6IGV4dGVuc2lvbk1hcC5rZXlTZXQoKSkgewotICAgICAgICAgICAgICAgIGZpbmRGaWxlRm9yR2l2ZW5EaXJlY3RvcnkoZGlyZWN0b3J5LCBleHRlbnNpb24pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGZpbmRGaWxlRm9yR2l2ZW5EaXJlY3RvcnkoU3RyaW5nIGRpciwgU3RyaW5nIGV4dGVuc2lvbikgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgRmlsZSBkaXJlY3RvcnkgPSBkZXBsb3ltZW50RW5naW5lLmdldFJlcG9zaXRvcnlEaXIoKTsKLSAgICAgICAgICAgIFN0cmluZ1tdIHN0cmluZ3MgPSBkaXIuc3BsaXQoIi8iKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RyaW5ncy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGRpcmVjdG9yeSA9IG5ldyBGaWxlKGRpcmVjdG9yeSwgc3RyaW5nc1tpXSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChkaXJlY3RvcnkuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICBGaWxlW10gZmlsZXMgPSBkaXJlY3RvcnkubGlzdEZpbGVzKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGZpbGVzICE9IG51bGwgJiYgZmlsZXMubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBGaWxlIGZpbGUgPSBmaWxlc1tpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc1NvdXJjZUNvbnRyb2xEaXIoZmlsZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleHRlbnNpb24uZXF1YWxzKERlcGxveW1lbnRGaWxlRGF0YS5nZXRGaWxlRXh0ZW5zaW9uKGZpbGUuZ2V0TmFtZSgpKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRGaWxlVG9EZXBsb3koZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwbG95bWVudEVuZ2luZS5nZXREZXBsb3llcihkaXIsIGV4dGVuc2lvbiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdTSW5mby5UWVBFX0NVU1RPTSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvL25lZWQgdG8gbG9nIHRoZSBleGNlcHRpb24KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKiBTZWFyY2hlcyBhIGdpdmVuIGZvbGRlciBmb3IgamFyIGZpbGVzIGFuZCBhZGRzIHRoZW0gdG8gYSBsaXN0IGluIHRoZSBXU0luZm9saXN0IGNsYXNzLiAqLwotICAgIHByb3RlY3RlZCB2b2lkIGZpbmRTZXJ2aWNlc0luRGlyZWN0b3J5KCkgewotICAgICAgICBGaWxlIHJvb3QgPSBkZXBsb3ltZW50RW5naW5lLmdldFNlcnZpY2VzRGlyKCk7Ci0gICAgICAgIEZpbGVbXSBmaWxlcyA9IHJvb3QubGlzdEZpbGVzKCk7Ci0KLSAgICAgICAgaWYgKGZpbGVzICE9IG51bGwgJiYgZmlsZXMubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIEZpbGUgZmlsZSA9IGZpbGVzW2ldOwotICAgICAgICAgICAgICAgIGlmIChpc1NvdXJjZUNvbnRyb2xEaXIoZmlsZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICghZmlsZS5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChEZXBsb3ltZW50RmlsZURhdGEuaXNTZXJ2aWNlQXJjaGl2ZUZpbGUoZmlsZS5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhZGRGaWxlVG9EZXBsb3koZmlsZSwgZGVwbG95bWVudEVuZ2luZS5nZXRTZXJ2aWNlRGVwbG95ZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU0luZm8uVFlQRV9TRVJWSUNFKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBleHQgPSBEZXBsb3ltZW50RmlsZURhdGEuZ2V0RmlsZUV4dGVuc2lvbihmaWxlLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBEZXBsb3llciBkZXBsb3llciA9IGRlcGxveW1lbnRFbmdpbmUuZ2V0RGVwbG95ZXJGb3JFeHRlbnNpb24oZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHdlIGZvdW5kIGEgZGVwbG95ZXIgZm9yIHRoaXMgdHlwZSBvZiBmaWxlLCB1c2UgaXQuICBPdGhlcndpc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSB0aGUgZmlsZS4KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXBsb3llciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRmlsZVRvRGVwbG95KGZpbGUsIGRlcGxveWVyLCBXU0luZm8uVFlQRV9TRVJWSUNFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghImxpYiIuZXF1YWxzSWdub3JlQ2FzZShmaWxlLmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZEZpbGVUb0RlcGxveShmaWxlLCBkZXBsb3ltZW50RW5naW5lLmdldFNlcnZpY2VEZXBsb3llcigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdTSW5mby5UWVBFX1NFUlZJQ0UpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqIE1ldGhvZCBpbnZva2VkIGZyb20gdGhlIHNjaGVkdWxlciB0byBzdGFydCB0aGUgbGlzdGVuZXIuICovCi0gICAgcHVibGljIHZvaWQgc3RhcnRMaXN0ZW5lcigpIHsKLSAgICAgICAgY2hlY2tTZXJ2aWNlcygpOwotLy8gICAgICAgIHVwZGF0ZSgpOwotICAgIH0KLQotICAgIC8qKiBVcGRhdGVzIFdTSW5mb0xpc3Qgb2JqZWN0LiAqLwotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLSAgICAgICAgd3NJbmZvTGlzdC51cGRhdGUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB1cGRhdGVSZW1vdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZmluZFNlcnZpY2VzSW5EaXJlY3RvcnkoKTsKLSAgICAgICAgdXBkYXRlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkRmlsZVRvRGVwbG95KEZpbGUgZmlsZSwgRGVwbG95ZXIgZGVwbG95ZXIsIGludCB0eXBlKSB7Ci0gICAgICAgIHdzSW5mb0xpc3QuYWRkV1NJbmZvSXRlbShmaWxlLCBkZXBsb3llciwgdHlwZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvU2VydmljZUJ1aWxkZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L1NlcnZpY2VCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhZWI5NWQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvU2VydmljZUJ1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkFkZHJlc3NpbmdIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YXJldHJpZXZhbC5EUkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQudXRpbC5QaGFzZXNJbmZvOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC51dGlsLlV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc01lc3NhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkluT3V0QXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLk1vZHVsZUNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5QYXJhbWV0ZXJJbmNsdWRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUG9saWN5SW5jbHVkZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLldTREwyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uamF2YTJ3c2RsLkphdmEyV1NETENvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLmphdmEyd3NkbC5UeXBlVGFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuTWVzc2FnZVJlY2VpdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLk9iamVjdFN1cHBsaWVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLlNlcnZpY2VMaWZlQ3ljbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pMThuLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5Mb2FkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvcjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEJ1aWxkcyBhIHNlcnZpY2UgZGVzY3JpcHRpb24gZnJvbSBPTQotICovCi1wdWJsaWMgY2xhc3MgU2VydmljZUJ1aWxkZXIgZXh0ZW5kcyBEZXNjcmlwdGlvbkJ1aWxkZXIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhTZXJ2aWNlQnVpbGRlci5jbGFzcyk7Ci0JcHJpdmF0ZSBBeGlzU2VydmljZSBzZXJ2aWNlOwotCXByaXZhdGUgSGFzaE1hcCB3c2RsU2VydmljZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwdWJsaWMgU2VydmljZUJ1aWxkZXIoQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ3R4LCBBeGlzU2VydmljZSBzZXJ2aWNlKSB7Ci0JCXRoaXMuc2VydmljZSA9IHNlcnZpY2U7Ci0JCXRoaXMuY29uZmlnQ3R4ID0gY29uZmlnQ3R4OwotCQl0aGlzLmF4aXNDb25maWcgPSB0aGlzLmNvbmZpZ0N0eC5nZXRBeGlzQ29uZmlndXJhdGlvbigpOwotCX0KLQotCXB1YmxpYyBTZXJ2aWNlQnVpbGRlcihJbnB1dFN0cmVhbSBzZXJ2aWNlSW5wdXRTdHJlYW0sCi0JCQlDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDdHgsIEF4aXNTZXJ2aWNlIHNlcnZpY2UpIHsKLQkJc3VwZXIoc2VydmljZUlucHV0U3RyZWFtLCBjb25maWdDdHgpOwotCQl0aGlzLnNlcnZpY2UgPSBzZXJ2aWNlOwotCX0KLQotCS8qKgotCSAqIFBvcHVsYXRlcyBzZXJ2aWNlIGZyb20gY29ycmVzcG9uZGluZyBPTS4KLQkgKiAKLQkgKiBAcGFyYW0gc2VydmljZV9lbGVtZW50Ci0JICogICAgICAgICAgICBhbiBPTUVsZW1lbnQgZm9yIHRoZSAmbHQ7c2VydmljZSZndDsgdGFnCi0JICogQHJldHVybiBhIGZpbGxlZC1pbiBBeGlzU2VydmljZSwgY29uZmlndXJlZCBmcm9tIHRoZSBwYXNzZWQgWE1MCi0JICogQHRocm93cyBEZXBsb3ltZW50RXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgYSBwcm9ibGVtCi0JICovCi0JcHVibGljIEF4aXNTZXJ2aWNlIHBvcHVsYXRlU2VydmljZShPTUVsZW1lbnQgc2VydmljZV9lbGVtZW50KQotCQkJdGhyb3dzIERlcGxveW1lbnRFeGNlcHRpb24gewotCQl0cnkgewotCQkJLy8gRGV0ZXJtaW5lIHdoZXRoZXIgc2VydmljZSBzaG91bGQgYmUgYWN0aXZhdGVkLgotCQkJU3RyaW5nIHNlcnZpY2VBY3RpdmF0ZSA9IHNlcnZpY2VfZWxlbWVudAotCQkJCQkuZ2V0QXR0cmlidXRlVmFsdWUobmV3IFFOYW1lKEFUVFJJQlVURV9BQ1RJVkFURSkpOwotCQkJaWYgKHNlcnZpY2VBY3RpdmF0ZSAhPSBudWxsKSB7Ci0JCQkJaWYgKCJ0cnVlIi5lcXVhbHMoc2VydmljZUFjdGl2YXRlKSkgewotCQkJCQlzZXJ2aWNlLnNldEFjdGl2ZSh0cnVlKTsKLQkJCQl9IGVsc2UgaWYgKCJmYWxzZSIuZXF1YWxzKHNlcnZpY2VBY3RpdmF0ZSkpIHsKLQkJCQkJc2VydmljZS5zZXRBY3RpdmUoZmFsc2UpOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gUHJvY2Vzc2luZyBzZXJ2aWNlIGxldmVsIHBhcmFtZXRlcnMKLQkJCU9NQXR0cmlidXRlIHNlcnZpY2VOYW1lYXR0ID0gc2VydmljZV9lbGVtZW50Ci0JCQkJCS5nZXRBdHRyaWJ1dGUobmV3IFFOYW1lKEFUVFJJQlVURV9OQU1FKSk7Ci0KLQkJCS8vIElmIHRoZSBzZXJ2aWNlIG5hbWUgaXMgZXhwbGljaXRseSBzcGVjaWZpZWQgaW4gdGhlIHNlcnZpY2VzLnhtbAotCQkJLy8gdGhlbiB1c2UgdGhhdCBhcyB0aGUgc2VydmljZSBuYW1lCi0JCQlpZiAoc2VydmljZU5hbWVhdHQgIT0gbnVsbCkgewotCQkJCWlmICghIiIuZXF1YWxzKHNlcnZpY2VOYW1lYXR0LmdldEF0dHJpYnV0ZVZhbHVlKCkudHJpbSgpKSkgewotCQkJCQlBeGlzU2VydmljZSB3c2RsU2VydmljZSA9IChBeGlzU2VydmljZSkgd3NkbFNlcnZpY2VNYXAKLQkJCQkJCQkuZ2V0KHNlcnZpY2VOYW1lYXR0LmdldEF0dHJpYnV0ZVZhbHVlKCkpOwotCQkJCQlpZiAod3NkbFNlcnZpY2UgIT0gbnVsbCkgewotCQkJCQkJd3NkbFNlcnZpY2Uuc2V0Q2xhc3NMb2FkZXIoc2VydmljZS5nZXRDbGFzc0xvYWRlcigpKTsKLQkJCQkJCXdzZGxTZXJ2aWNlLnNldFBhcmVudChzZXJ2aWNlLmdldEF4aXNTZXJ2aWNlR3JvdXAoKSk7Ci0JCQkJCQlzZXJ2aWNlID0gd3NkbFNlcnZpY2U7Ci0JCQkJCQlzZXJ2aWNlLnNldFdzZGxGb3VuZCh0cnVlKTsKLQkJCQkJCXNlcnZpY2Uuc2V0Q3VzdG9tV3NkbCh0cnVlKTsKLQkJCQkJfQotCQkJCQlzZXJ2aWNlLnNldE5hbWUoc2VydmljZU5hbWVhdHQuZ2V0QXR0cmlidXRlVmFsdWUoKSk7Ci0JCQkJCS8vIFRvIGJlIG9uIHRoZSBzYWZlIHNpZGUKLQkJCQkJaWYgKHNlcnZpY2UuZ2V0RG9jdW1lbnRhdGlvbigpID09IG51bGwpIHsKLQkJCQkJCXNlcnZpY2Uuc2V0RG9jdW1lbnRhdGlvbihzZXJ2aWNlTmFtZWF0dAotCQkJCQkJCQkuZ2V0QXR0cmlidXRlVmFsdWUoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCUl0ZXJhdG9yIGl0ciA9IHNlcnZpY2VfZWxlbWVudC5nZXRDaGlsZHJlbldpdGhOYW1lKG5ldyBRTmFtZSgKLQkJCQkJVEFHX1BBUkFNRVRFUikpOwotCQkJcHJvY2Vzc1BhcmFtZXRlcnMoaXRyLCBzZXJ2aWNlLCBzZXJ2aWNlLmdldFBhcmVudCgpKTsKLQotCQkJLy8gSWYgbXVsdGlwbGUgc2VydmljZXMgaW4gb25lIHNlcnZpY2UgZ3JvdXAgaGF2ZSBkaWZmZXJlbnQgdmFsdWVzCi0JCQkvLyBmb3IgdGhlIFBBUkVOVF9GSVJTVAotCQkJLy8gcGFyYW1ldGVyIHRoZW4gdGhlIGZpbmFsIHZhbHVlIGJlY29tZSB0aGUgdmFsdWUgc3BlY2lmaWVkIGJ5IHRoZQotCQkJLy8gbGFzdCBzZXJ2aWNlIGluIHRoZSBncm91cAotCQkJLy8gUGFyYW1ldGVyIHBhcmFtZXRlciA9Ci0JCQkvLyBzZXJ2aWNlLmdldFBhcmFtZXRlcihEZXBsb3ltZW50Q2xhc3NMb2FkZXIuUEFSRU5UX0ZJUlNUKTsKLQkJCS8vIGlmIChwYXJhbWV0ZXIgIT1udWxsICYmICJmYWxzZSIuZXF1YWxzKHBhcmFtZXRlci5nZXRWYWx1ZSgpKSkgewotCQkJLy8gQ2xhc3NMb2FkZXIgc2VydmljZUNsYXNzTG9hZGVyID0gc2VydmljZS5nZXRDbGFzc0xvYWRlcigpOwotCQkJLy8gKChEZXBsb3ltZW50Q2xhc3NMb2FkZXIpc2VydmljZUNsYXNzTG9hZGVyKS5zZXRQYXJlbnRGaXJzdChmYWxzZSk7Ci0JCQkvLyB9Ci0JCQkvLyBwcm9jZXNzIHNlcnZpY2UgZGVzY3JpcHRpb24KLQkJCU9NRWxlbWVudCBkZXNjcmlwdGlvbkVsZW1lbnQgPSBzZXJ2aWNlX2VsZW1lbnQKLQkJCQkJLmdldEZpcnN0Q2hpbGRXaXRoTmFtZShuZXcgUU5hbWUoVEFHX0RFU0NSSVBUSU9OKSk7Ci0JCQlpZiAoZGVzY3JpcHRpb25FbGVtZW50ICE9IG51bGwpIHsKLQkJCQlPTUVsZW1lbnQgZGVzY3JpcHRpb25WYWx1ZSA9IGRlc2NyaXB0aW9uRWxlbWVudAotCQkJCQkJLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCWlmIChkZXNjcmlwdGlvblZhbHVlICE9IG51bGwpIHsKLQkJCQkJc2VydmljZS5zZXREb2N1bWVudGF0aW9uKGRlc2NyaXB0aW9uVmFsdWUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXNlcnZpY2Uuc2V0RG9jdW1lbnRhdGlvbihkZXNjcmlwdGlvbkVsZW1lbnQuZ2V0VGV4dCgpKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCXNlcnZpY2VOYW1lYXR0ID0gc2VydmljZV9lbGVtZW50LmdldEF0dHJpYnV0ZShuZXcgUU5hbWUoCi0JCQkJCQlBVFRSSUJVVEVfTkFNRSkpOwotCi0JCQkJaWYgKHNlcnZpY2VOYW1lYXR0ICE9IG51bGwpIHsKLQkJCQkJaWYgKCEiIi5lcXVhbHMoc2VydmljZU5hbWVhdHQuZ2V0QXR0cmlidXRlVmFsdWUoKS50cmltKCkpCi0JCQkJCQkJJiYgc2VydmljZS5nZXREb2N1bWVudGF0aW9uKCkgPT0gbnVsbCkgewotCQkJCQkJc2VydmljZS5zZXREb2N1bWVudGF0aW9uKHNlcnZpY2VOYW1lYXR0Ci0JCQkJCQkJCS5nZXRBdHRyaWJ1dGVWYWx1ZSgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJaWYgKHNlcnZpY2UuZ2V0UGFyYW1ldGVyKCJTZXJ2aWNlQ2xhc3MiKSA9PSBudWxsKSB7Ci0JCQkJbG9nLmRlYnVnKCJUaGUgU2VydmljZSAiICsgc2VydmljZS5nZXROYW1lKCkKLQkJCQkJCSsgIiBkb2VzIG5vdCBzcGVjaWZ5IGEgU2VydmljZSBDbGFzcyIpOwotCQkJfQotCi0JCQkvLyBQcm9jZXNzIFdTLUFkZHJlc3NpbmcgZmxhZyBhdHRyaWJ1dGUKLQkJCU9NQXR0cmlidXRlIGFkZHJlc3NpbmdSZXF1aXJlZGF0dCA9IHNlcnZpY2VfZWxlbWVudAotCQkJCQkuZ2V0QXR0cmlidXRlKG5ldyBRTmFtZShBVFRSSUJVVEVfV1NBRERSRVNTSU5HKSk7Ci0JCQlpZiAoYWRkcmVzc2luZ1JlcXVpcmVkYXR0ICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgYWRkcmVzc2luZ1JlcXVpcmVkU3RyaW5nID0gYWRkcmVzc2luZ1JlcXVpcmVkYXR0Ci0JCQkJCQkuZ2V0QXR0cmlidXRlVmFsdWUoKTsKLQkJCQlBZGRyZXNzaW5nSGVscGVyLnNldEFkZHJlc3NpbmdSZXF1aXJlbWVudFBhcmVtZXRlclZhbHVlKAotCQkJCQkJc2VydmljZSwgYWRkcmVzc2luZ1JlcXVpcmVkU3RyaW5nKTsKLQkJCX0KLQotCQkJLy8gU2V0dGluZyBzZXJ2aWNlIHRhcmdldCBuYW1lc3BhY2UgaWYgYW55Ci0JCQlPTUF0dHJpYnV0ZSB0YXJnZXROYW1lU3BhY2UgPSBzZXJ2aWNlX2VsZW1lbnQKLQkJCQkJLmdldEF0dHJpYnV0ZShuZXcgUU5hbWUoVEFSR0VUX05BTUVfU1BBQ0UpKTsKLQotCQkJaWYgKHRhcmdldE5hbWVTcGFjZSAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIG5hbWVTcGVjZVZhbGUgPSB0YXJnZXROYW1lU3BhY2UuZ2V0QXR0cmlidXRlVmFsdWUoKTsKLQkJCQlpZiAobmFtZVNwZWNlVmFsZSAhPSBudWxsICYmICEiIi5lcXVhbHMobmFtZVNwZWNlVmFsZSkpIHsKLQkJCQkJc2VydmljZS5zZXRUYXJnZXROYW1lc3BhY2UobmFtZVNwZWNlVmFsZSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpZiAoc2VydmljZS5nZXRUYXJnZXROYW1lc3BhY2UoKSA9PSBudWxsCi0JCQkJCQl8fCAiIi5lcXVhbHMoc2VydmljZS5nZXRUYXJnZXROYW1lc3BhY2UoKSkpIHsKLQkJCQkJc2VydmljZQotCQkJCQkJCS5zZXRUYXJnZXROYW1lc3BhY2UoSmF2YTJXU0RMQ29uc3RhbnRzLkRFRkFVTFRfVEFSR0VUX05BTUVTUEFDRSk7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBQcm9jZXNzaW5nIHNlcnZpY2UgbGlmZWN5Y2xlIGF0dHJpYnV0ZQotCQkJT01BdHRyaWJ1dGUgc2VydmljZUxpZmVDeWNsZUNsYXNzID0gc2VydmljZV9lbGVtZW50Ci0JCQkJCS5nZXRBdHRyaWJ1dGUobmV3IFFOYW1lKFRBR19DTEFTU19OQU1FKSk7Ci0JCQlpZiAoc2VydmljZUxpZmVDeWNsZUNsYXNzICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgY2xhc3NOYW1lID0gc2VydmljZUxpZmVDeWNsZUNsYXNzLmdldEF0dHJpYnV0ZVZhbHVlKCk7Ci0JCQkJbG9hZFNlcnZpY2VMaWZlQ3ljbGVDbGFzcyhjbGFzc05hbWUpOwotCQkJfQotCQkJLy8gU2V0dGluZyBzY2hlbWEgbmFtZXNwZWNlIGlmIGFueQotCQkJT01FbGVtZW50IHNjaGVtYUVsZW1lbnQgPSBzZXJ2aWNlX2VsZW1lbnQKLQkJCQkJLmdldEZpcnN0Q2hpbGRXaXRoTmFtZShuZXcgUU5hbWUoU0NIRU1BKSk7Ci0JCQlpZiAoc2NoZW1hRWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJT01BdHRyaWJ1dGUgc2NoZW1hTmFtZVNwYWNlID0gc2NoZW1hRWxlbWVudAotCQkJCQkJLmdldEF0dHJpYnV0ZShuZXcgUU5hbWUoU0NIRU1BX05BTUVfU1BBQ0UpKTsKLQkJCQlpZiAoc2NoZW1hTmFtZVNwYWNlICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIG5hbWVTcGVjZVZhbGUgPSBzY2hlbWFOYW1lU3BhY2UuZ2V0QXR0cmlidXRlVmFsdWUoKTsKLQkJCQkJaWYgKG5hbWVTcGVjZVZhbGUgIT0gbnVsbCAmJiAhIiIuZXF1YWxzKG5hbWVTcGVjZVZhbGUpKSB7Ci0JCQkJCQlzZXJ2aWNlLnNldFNjaGVtYVRhcmdldE5hbWVzcGFjZShuYW1lU3BlY2VWYWxlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlPTUF0dHJpYnV0ZSBlbGVtZW50Rm9ybURlZmF1bHQgPSBzY2hlbWFFbGVtZW50Ci0JCQkJCQkuZ2V0QXR0cmlidXRlKG5ldyBRTmFtZShTQ0hFTUFfRUxFTUVOVF9RVUFMSUZJRUQpKTsKLQkJCQlpZiAoZWxlbWVudEZvcm1EZWZhdWx0ICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIHZhbHVlID0gZWxlbWVudEZvcm1EZWZhdWx0LmdldEF0dHJpYnV0ZVZhbHVlKCk7Ci0JCQkJCWlmICgidHJ1ZSIuZXF1YWxzKHZhbHVlKSkgewotCQkJCQkJc2VydmljZS5zZXRFbGVtZW50Rm9ybURlZmF1bHQodHJ1ZSk7Ci0JCQkJCX0gZWxzZSBpZiAoImZhbHNlIi5lcXVhbHModmFsdWUpKSB7Ci0JCQkJCQlzZXJ2aWNlLnNldEVsZW1lbnRGb3JtRGVmYXVsdChmYWxzZSk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvLyBwYWNrYWdlIHRvIG5hbWVzcGFjZSBtYXBwaW5nLiBUaGlzIHdpbGwgYmUgYW4gZWxlbWVudCB0aGF0Ci0JCQkJLy8gbWFwcyBwa2cgbmFtZXMgdG8gYSBuYW1lc3BhY2UKLQkJCQkvLyB3aGVuIHRoaXMgaXMgZG9pbmcgQXhpc1NlcnZpY2UuZ2V0U2NoZW1hVGFyZ2V0TmFtZXNwYWNlIHdpbGwKLQkJCQkvLyBiZSBvdmVycmlkZGVuCi0JCQkJLy8gVGhpcyB3aWxsIGJlIDxtYXBwaW5nLz4gd2l0aCBAbmFtZXNwYWNlIGFuZCBAcGFja2FnZQotCQkJCUl0ZXJhdG9yIG1hcHBpbmdJdGVyYXRvciA9IHNjaGVtYUVsZW1lbnQKLQkJCQkJCS5nZXRDaGlsZHJlbldpdGhOYW1lKG5ldyBRTmFtZShNQVBQSU5HKSk7Ci0JCQkJaWYgKG1hcHBpbmdJdGVyYXRvciAhPSBudWxsKSB7Ci0JCQkJCU1hcCBwa2cybnNNYXAgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCQkJCXdoaWxlIChtYXBwaW5nSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCQlPTUVsZW1lbnQgbWFwcGluZ0VsZW1lbnQgPSAoT01FbGVtZW50KSBtYXBwaW5nSXRlcmF0b3IKLQkJCQkJCQkJLm5leHQoKTsKLQkJCQkJCU9NQXR0cmlidXRlIG5hbWVzcGFjZUF0dHJpYnV0ZSA9IG1hcHBpbmdFbGVtZW50Ci0JCQkJCQkJCS5nZXRBdHRyaWJ1dGUobmV3IFFOYW1lKEFUVFJJQlVURV9OQU1FU1BBQ0UpKTsKLQkJCQkJCU9NQXR0cmlidXRlIHBhY2thZ2VBdHRyaWJ1dGUgPSBtYXBwaW5nRWxlbWVudAotCQkJCQkJCQkuZ2V0QXR0cmlidXRlKG5ldyBRTmFtZShBVFRSSUJVVEVfUEFDS0FHRSkpOwotCQkJCQkJaWYgKG5hbWVzcGFjZUF0dHJpYnV0ZSAhPSBudWxsCi0JCQkJCQkJCSYmIHBhY2thZ2VBdHRyaWJ1dGUgIT0gbnVsbCkgewotCQkJCQkJCVN0cmluZyBuYW1lc3BhY2VBdHRyaWJ1dGVWYWx1ZSA9IG5hbWVzcGFjZUF0dHJpYnV0ZQotCQkJCQkJCQkJLmdldEF0dHJpYnV0ZVZhbHVlKCk7Ci0JCQkJCQkJU3RyaW5nIHBhY2thZ2VBdHRyaWJ1dGVWYWx1ZSA9IHBhY2thZ2VBdHRyaWJ1dGUKLQkJCQkJCQkJCS5nZXRBdHRyaWJ1dGVWYWx1ZSgpOwotCQkJCQkJCWlmIChuYW1lc3BhY2VBdHRyaWJ1dGVWYWx1ZSAhPSBudWxsCi0JCQkJCQkJCQkmJiBwYWNrYWdlQXR0cmlidXRlVmFsdWUgIT0gbnVsbCkgewotCQkJCQkJCQlwa2cybnNNYXAucHV0KHBhY2thZ2VBdHRyaWJ1dGVWYWx1ZS50cmltKCksCi0JCQkJCQkJCQkJbmFtZXNwYWNlQXR0cmlidXRlVmFsdWUudHJpbSgpKTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlsb2cKLQkJCQkJCQkJCQkud2FybigiRWl0aGVyIHZhbHVlIG9mIEBuYW1lc3BjZSBvciBAcGFja2FnZW5hbWUgbm90IGF2YWlsYWJsZS4gVGh1cywgZ2VuZXJhdGVkIHdpbGwgYmUgc2VsZWN0ZWQuIik7Ci0JCQkJCQkJfQotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlsb2cKLQkJCQkJCQkJCS53YXJuKCJFaXRoZXIgQG5hbWVzcGNlIG9yIEBwYWNrYWdlbmFtZSBub3QgYXZhaWxhYmxlLiBUaHVzLCBnZW5lcmF0ZWQgd2lsbCBiZSBzZWxlY3RlZC4iKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlzZXJ2aWNlLnNldFAybk1hcChwa2cybnNNYXApOwotCi0JCQkJfQotCi0JCQl9Ci0KLQkJCS8vIHByb2Nlc3NpbmcgRGVmYXVsdCBNZXNzYWdlIHJlY2VpdmVycwotCQkJT01FbGVtZW50IG1lc3NhZ2VSZWNlaXZlciA9IHNlcnZpY2VfZWxlbWVudAotCQkJCQkuZ2V0Rmlyc3RDaGlsZFdpdGhOYW1lKG5ldyBRTmFtZShUQUdfTUVTU0FHRV9SRUNFSVZFUlMpKTsKLQkJCWlmIChtZXNzYWdlUmVjZWl2ZXIgIT0gbnVsbCkgewotCQkJCUhhc2hNYXAgbXJzID0gcHJvY2Vzc01lc3NhZ2VSZWNlaXZlcnMoc2VydmljZS5nZXRDbGFzc0xvYWRlcigpLAotCQkJCQkJbWVzc2FnZVJlY2VpdmVyKTsKLQkJCQlJdGVyYXRvciBrZXlzID0gbXJzLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKGtleXMuaGFzTmV4dCgpKSB7Ci0JCQkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBrZXlzLm5leHQoKTsKLQkJCQkJc2VydmljZS5hZGRNZXNzYWdlUmVjZWl2ZXIoa2V5LCAoTWVzc2FnZVJlY2VpdmVyKSBtcnMKLQkJCQkJCQkuZ2V0KGtleSkpOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gUmVtb3ZpbmcgZXhjbHVkZSBvcGVyYXRpb25zCi0JCQlPTUVsZW1lbnQgZXhjbHVkZU9wZXJhdGlvbnMgPSBzZXJ2aWNlX2VsZW1lbnQKLQkJCQkJLmdldEZpcnN0Q2hpbGRXaXRoTmFtZShuZXcgUU5hbWUoVEFHX0VYQ0xVREVfT1BFUkFUSU9OUykpOwotCQkJQXJyYXlMaXN0IGV4Y2x1ZGVvcHMgPSBudWxsOwotCQkJaWYgKGV4Y2x1ZGVPcGVyYXRpb25zICE9IG51bGwpIHsKLQkJCQlleGNsdWRlb3BzID0gcHJvY2Vzc0V4Y2x1ZGVPcGVyYXRpb25zKGV4Y2x1ZGVPcGVyYXRpb25zKTsKLQkJCX0KLQkJCWlmIChleGNsdWRlb3BzID09IG51bGwpIHsKLQkJCQlleGNsdWRlb3BzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJfQotCQkJVXRpbHMuYWRkRXhjbHVkZU1ldGhvZHMoZXhjbHVkZW9wcyk7Ci0KLQkJCS8vIDxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8veC55LnoiLz4KLQkJCS8vIHNldHRpbmcgdGhlIFBvbGljeUluY2x1ZGUKLQkJCS8vIHByb2Nlc3NpbmcgPHdzcDpQb2xpY3k+IC4uIDwvLi4+IGVsZW1lbnRzCi0JCQlJdGVyYXRvciBwb2xpY3lFbGVtZW50cyA9IHNlcnZpY2VfZWxlbWVudAotCQkJCQkuZ2V0Q2hpbGRyZW5XaXRoTmFtZShuZXcgUU5hbWUoUE9MSUNZX05TX1VSSSwgVEFHX1BPTElDWSkpOwotCi0JCQlpZiAocG9saWN5RWxlbWVudHMgIT0gbnVsbCAmJiBwb2xpY3lFbGVtZW50cy5oYXNOZXh0KCkpIHsKLQkJCQlwcm9jZXNzUG9saWN5RWxlbWVudHMocG9saWN5RWxlbWVudHMsIHNlcnZpY2UuZ2V0UG9saWN5U3ViamVjdCgpKTsKLQkJCX0KLQotCQkJLy8gcHJvY2Vzc2luZyA8d3NwOlBvbGljeVJlZmVyZW5jZT4gLi4gPC8uLj4gZWxlbWVudHMKLQkJCUl0ZXJhdG9yIHBvbGljeVJlZkVsZW1lbnRzID0gc2VydmljZV9lbGVtZW50Ci0JCQkJCS5nZXRDaGlsZHJlbldpdGhOYW1lKG5ldyBRTmFtZShQT0xJQ1lfTlNfVVJJLAotCQkJCQkJCVRBR19QT0xJQ1lfUkVGKSk7Ci0KLQkJCWlmIChwb2xpY3lSZWZFbGVtZW50cyAhPSBudWxsICYmIHBvbGljeVJlZkVsZW1lbnRzLmhhc05leHQoKSkgewotCQkJCXByb2Nlc3NQb2xpY3lSZWZFbGVtZW50cyhwb2xpY3lSZWZFbGVtZW50cywgc2VydmljZS5nZXRQb2xpY3lTdWJqZWN0KCkpOwotCQkJfQotCi0JCQkvLyBwcm9jZXNzaW5nIHNlcnZpY2Ugc2NvcGUKLQkJCVN0cmluZyBzZXNzaW9uU2NvcGUgPSBzZXJ2aWNlX2VsZW1lbnQuZ2V0QXR0cmlidXRlVmFsdWUobmV3IFFOYW1lKAotCQkJCQlBVFRSSUJVVEVfU0NPUEUpKTsKLQkJCWlmIChzZXNzaW9uU2NvcGUgIT0gbnVsbCkgewotCQkJCXNlcnZpY2Uuc2V0U2NvcGUoc2Vzc2lvblNjb3BlKTsKLQkJCX0KLQotCQkJLy8gcHJvY2Vzc2luZyBzZXJ2aWNlLXdpZGUgbW9kdWxlcyB3aGljaCByZXF1aXJlZCB0byBlbmdhZ2UgZ2xvYmFsbHkKLQkJCUl0ZXJhdG9yIG1vZHVsZVJlZnMgPSBzZXJ2aWNlX2VsZW1lbnQKLQkJCQkJLmdldENoaWxkcmVuV2l0aE5hbWUobmV3IFFOYW1lKFRBR19NT0RVTEUpKTsKLQotCQkJcHJvY2Vzc01vZHVsZVJlZnMobW9kdWxlUmVmcyk7Ci0KLQkJCS8vIHByb2Nlc3NpbmcgdHJhbnNwb3J0cwotCQkJT01FbGVtZW50IHRyYW5zcG9ydHMgPSBzZXJ2aWNlX2VsZW1lbnQKLQkJCQkJLmdldEZpcnN0Q2hpbGRXaXRoTmFtZShuZXcgUU5hbWUoVEFHX1RSQU5TUE9SVFMpKTsKLQkJCWlmICh0cmFuc3BvcnRzICE9IG51bGwpIHsKLQkJCQlJdGVyYXRvciB0cmFuc3BvcnRfaXRyID0gdHJhbnNwb3J0cwotCQkJCQkJLmdldENoaWxkcmVuV2l0aE5hbWUobmV3IFFOYW1lKFRBR19UUkFOU1BPUlQpKTsKLQkJCQlBcnJheUxpc3QgdHJzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCXdoaWxlICh0cmFuc3BvcnRfaXRyLmhhc05leHQoKSkgewotCQkJCQlPTUVsZW1lbnQgdHJzRWxlID0gKE9NRWxlbWVudCkgdHJhbnNwb3J0X2l0ci5uZXh0KCk7Ci0JCQkJCVN0cmluZyB0cmFuc3BvcnROYW1lID0gdHJzRWxlLmdldFRleHQoKS50cmltKCk7Ci0JCQkJCXRycy5hZGQodHJhbnNwb3J0TmFtZSk7Ci0JCQkJCWlmIChheGlzQ29uZmlnLmdldFRyYW5zcG9ydEluKHRyYW5zcG9ydE5hbWUpID09IG51bGwpIHsKLQkJCQkJCXRocm93IG5ldyBBeGlzRmF1bHQoIlNlcnZpY2UgWyAiICsgc2VydmljZS5nZXROYW1lKCkKLQkJCQkJCQkJKyAiXSBpcyB0cnlpbmcgdG8gZXhwb3NlIGluIGEgdHJhbnNwb3J0IDogIgotCQkJCQkJCQkrIHRyYW5zcG9ydHMKLQkJCQkJCQkJKyAiIGFuZCB3aGljaCBpcyBub3QgYXZhaWxhYmxlIGluIEF4aXMyIik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJc2VydmljZS5zZXRFeHBvc2VkVHJhbnNwb3J0cyh0cnMpOwotCQkJfQotCQkJLy8gcHJvY2Vzc2luZyBvcGVyYXRpb25zCi0JCQlJdGVyYXRvciBvcGVyYXRpb25zSXRlcmF0b3IgPSBzZXJ2aWNlX2VsZW1lbnQKLQkJCQkJLmdldENoaWxkcmVuV2l0aE5hbWUobmV3IFFOYW1lKFRBR19PUEVSQVRJT04pKTsKLQkJCUFycmF5TGlzdCBvcHMgPSBwcm9jZXNzT3BlcmF0aW9ucyhvcGVyYXRpb25zSXRlcmF0b3IpOwotCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IG9wcy5zaXplKCk7IGkrKykgewotCQkJCUF4aXNPcGVyYXRpb24gb3BlcmF0aW9uRGVzYyA9IChBeGlzT3BlcmF0aW9uKSBvcHMuZ2V0KGkpOwotCQkJCUFycmF5TGlzdCB3c2FtYXBwaW5ncyA9IG9wZXJhdGlvbkRlc2MuZ2V0V1NBTWFwcGluZ0xpc3QoKTsKLQkJCQlpZiAod3NhbWFwcGluZ3MgPT0gbnVsbCkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJaWYgKHNlcnZpY2UuZ2V0T3BlcmF0aW9uKG9wZXJhdGlvbkRlc2MuZ2V0TmFtZSgpKSA9PSBudWxsKSB7Ci0JCQkJCXNlcnZpY2UuYWRkT3BlcmF0aW9uKG9wZXJhdGlvbkRlc2MpOwotCQkJCX0KLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHdzYW1hcHBpbmdzLnNpemUoKTsgaisrKSB7Ci0JCQkJCVN0cmluZyBtYXBwaW5nID0gKFN0cmluZykgd3NhbWFwcGluZ3MuZ2V0KGopOwotCQkJCQlpZiAobWFwcGluZy5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCXNlcnZpY2UubWFwQWN0aW9uVG9PcGVyYXRpb24obWFwcGluZywgb3BlcmF0aW9uRGVzYyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlTdHJpbmcgb2JqZWN0U3VwcGxpZXJWYWx1ZSA9IChTdHJpbmcpIHNlcnZpY2UKLQkJCQkJLmdldFBhcmFtZXRlclZhbHVlKFRBR19PQkpFQ1RfU1VQUExJRVIpOwotCQkJaWYgKG9iamVjdFN1cHBsaWVyVmFsdWUgIT0gbnVsbCkgewotCQkJCWxvYWRPYmplY3RTdXBwbGllckNsYXNzKG9iamVjdFN1cHBsaWVyVmFsdWUpOwotCQkJfQotCQkJLy8gU2V0IHRoZSBkZWZhdWx0IG1lc3NhZ2UgcmVjZWl2ZXIgZm9yIHRoZSBvcGVyYXRpb25zIHRoYXQgd2VyZQotCQkJLy8gbm90IGxpc3RlZCBpbiB0aGUgc2VydmljZXMueG1sCi0JCQlzZXREZWZhdWx0TWVzc2FnZVJlY2VpdmVycygpOwotCQkJVXRpbHMucHJvY2Vzc0JlYW5Qcm9wZXJ0eUV4Y2x1ZGUoc2VydmljZSk7Ci0JCQlpZiAoIXNlcnZpY2UuaXNVc2VVc2VyV1NETCgpKSB7Ci0JCQkJLy8gR2VuZXJhdGluZyBzY2hlbWEgZm9yIHRoZSBzZXJ2aWNlIGlmIHRoZSBpbXBsIGNsYXNzIGlzIEphdmEKLQkJCQlpZiAoIXNlcnZpY2UuaXNXc2RsRm91bmQoKSkgewotCQkJCQkvLyB0cnlpbmcgdG8gZ2VuZXJhdGUgV1NETCBmb3IgdGhlIHNlcnZpY2UgdXNpbmcgSkFNIGFuZAotCQkJCQkvLyBKYXZhIHJlZmxlY3Rpb24KLQkJCQkJdHJ5IHsKLQkJCQkJCWlmIChnZW5lcmF0ZVdzZGwoc2VydmljZSkpIHsKLQkJCQkJCQlVdGlscy5maWxsQXhpc1NlcnZpY2Uoc2VydmljZSwgYXhpc0NvbmZpZywKLQkJCQkJCQkJCWV4Y2x1ZGVvcHMsIG51bGwpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlBcnJheUxpc3Qgbm9uUnBjT3BlcmF0aW9ucyA9IGdldE5vblJQQ01ldGhvZHMoc2VydmljZSk7Ci0JCQkJCQkJVXRpbHMuZmlsbEF4aXNTZXJ2aWNlKHNlcnZpY2UsIGF4aXNDb25maWcsCi0JCQkJCQkJCQlleGNsdWRlb3BzLCBub25ScGNPcGVyYXRpb25zKTsKLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCXRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoCi0JCQkJCQkJCSJlcnJvcmluc2NoZW1hZ2VuIiwgZS5nZXRNZXNzYWdlKCkpLCBlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmIChzZXJ2aWNlLmlzQ3VzdG9tV3NkbCgpKSB7Ci0JCQkJT01FbGVtZW50IG1hcHBpbmdFbGVtZW50ID0gc2VydmljZV9lbGVtZW50Ci0JCQkJCQkuZ2V0Rmlyc3RDaGlsZFdpdGhOYW1lKG5ldyBRTmFtZShUQUdfUEFDS0FHRTJRTkFNRSkpOwotCQkJCWlmIChtYXBwaW5nRWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJCXByb2Nlc3NUeXBlTWFwcGluZ3MobWFwcGluZ0VsZW1lbnQpOwotCQkJCX0KLQkJCX0KLQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleGNsdWRlb3BzLnNpemUoKTsgaSsrKSB7Ci0JCQkJU3RyaW5nIG9wTmFtZSA9IChTdHJpbmcpIGV4Y2x1ZGVvcHMuZ2V0KGkpOwotCQkJCXNlcnZpY2UucmVtb3ZlT3BlcmF0aW9uKG5ldyBRTmFtZShvcE5hbWUpKTsKLQkJCX0KLQotCQkJLy8gTmVlZCB0byBjYWxsIHRoZSBzYW1lIGxvZ2ljIHRvd2ljZQotCQkJc2V0RGVmYXVsdE1lc3NhZ2VSZWNlaXZlcnMoKTsKLQkJCUl0ZXJhdG9yIG1vZHVsZUNvbmZpZ3MgPSBzZXJ2aWNlX2VsZW1lbnQKLQkJCQkJLmdldENoaWxkcmVuV2l0aE5hbWUobmV3IFFOYW1lKFRBR19NT0RVTEVfQ09ORklHKSk7Ci0JCQlwcm9jZXNzU2VydmljZU1vZHVsZUNvbmZpZyhtb2R1bGVDb25maWdzLCBzZXJ2aWNlLCBzZXJ2aWNlKTsKLQotCQkJLy8gTG9hZGluZyBEYXRhIExvY2F0b3IocykgY29uZmlndXJlZAotCQkJT01FbGVtZW50IGRhdGFMb2NhdG9yRWxlbWVudCA9IHNlcnZpY2VfZWxlbWVudAotCQkJCQkuZ2V0Rmlyc3RDaGlsZFdpdGhOYW1lKG5ldyBRTmFtZSgKLQkJCQkJCQlEUkNvbnN0YW50cy5EQVRBX0xPQ0FUT1JfRUxFTUVOVCkpOwotCQkJaWYgKGRhdGFMb2NhdG9yRWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJcHJvY2Vzc0RhdGFMb2NhdG9yQ29uZmlnKGRhdGFMb2NhdG9yRWxlbWVudCwgc2VydmljZSk7Ci0JCQl9Ci0KLQkJCXByb2Nlc3NFbmRwb2ludHMoc2VydmljZSk7Ci0JCQlwcm9jZXNzUG9saWN5QXR0YWNobWVudHMoc2VydmljZV9lbGVtZW50LCBzZXJ2aWNlKTsKLQkJCQotCi0JCX0gY2F0Y2ggKEF4aXNGYXVsdCBheGlzRmF1bHQpIHsKLQkJCXRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKGF4aXNGYXVsdCk7Ci0JCX0KLQotCQlyZXR1cm4gc2VydmljZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0RGVmYXVsdE1lc3NhZ2VSZWNlaXZlcnMoKSB7Ci0JCUl0ZXJhdG9yIG9wZXJhdGlvbnMgPSBzZXJ2aWNlLmdldFB1Ymxpc2hlZE9wZXJhdGlvbnMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAob3BlcmF0aW9ucy5oYXNOZXh0KCkpIHsKLQkJCUF4aXNPcGVyYXRpb24gb3BlcmF0aW9uID0gKEF4aXNPcGVyYXRpb24pIG9wZXJhdGlvbnMubmV4dCgpOwotCQkJaWYgKG9wZXJhdGlvbi5nZXRNZXNzYWdlUmVjZWl2ZXIoKSA9PSBudWxsKSB7Ci0JCQkJTWVzc2FnZVJlY2VpdmVyIG1lc3NhZ2VSZWNlaXZlciA9IGxvYWREZWZhdWx0TWVzc2FnZVJlY2VpdmVyKAotCQkJCQkJb3BlcmF0aW9uLmdldE1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4oKSwgc2VydmljZSk7Ci0JCQkJaWYgKG1lc3NhZ2VSZWNlaXZlciA9PSBudWxsICYmCi0JCQkJLy8gd2UgYXNzdW1lIHRoYXQgaWYgdGhlIE1FUCBpcyBST0JVU1RfSU5fT05MWSB0aGVuIHRoZSBpbi1vdXQKLQkJCQkJCS8vIE1SIGNhbiBoYW5kbGUgdGhhdAotCQkJCQkJV1NETDJDb25zdGFudHMuTUVQX1VSSV9ST0JVU1RfSU5fT05MWS5lcXVhbHMob3BlcmF0aW9uCi0JCQkJCQkJCS5nZXRNZXNzYWdlRXhjaGFuZ2VQYXR0ZXJuKCkpKSB7Ci0JCQkJCW1lc3NhZ2VSZWNlaXZlciA9IGxvYWREZWZhdWx0TWVzc2FnZVJlY2VpdmVyKAotCQkJCQkJCVdTREwyQ29uc3RhbnRzLk1FUF9VUklfSU5fT1VULCBzZXJ2aWNlKTsKLQotCQkJCX0KLQkJCQlvcGVyYXRpb24uc2V0TWVzc2FnZVJlY2VpdmVyKG1lc3NhZ2VSZWNlaXZlcik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgbG9hZE9iamVjdFN1cHBsaWVyQ2xhc3MoU3RyaW5nIG9iamVjdFN1cHBsaWVyVmFsdWUpCi0JCQl0aHJvd3MgQXhpc0ZhdWx0IHsKLQkJdHJ5IHsKLQkJCUNsYXNzTG9hZGVyIGxvYWRlciA9IHNlcnZpY2UuZ2V0Q2xhc3NMb2FkZXIoKTsKLQkJCUNsYXNzIG9iamVjdFN1cHBsaWVySW1wbCA9IExvYWRlci5sb2FkQ2xhc3MobG9hZGVyLAotCQkJCQlvYmplY3RTdXBwbGllclZhbHVlLnRyaW0oKSk7Ci0JCQlPYmplY3RTdXBwbGllciBvYmplY3RTdXBwbGllciA9IChPYmplY3RTdXBwbGllcikgb2JqZWN0U3VwcGxpZXJJbXBsCi0JCQkJCS5uZXdJbnN0YW5jZSgpOwotCQkJc2VydmljZS5zZXRPYmplY3RTdXBwbGllcihvYmplY3RTdXBwbGllcik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBBeGlzRmF1bHQubWFrZUZhdWx0KGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJvY2VzcyB0aGUgcGFja2FnZSBuYW1lIHRvIFFOYW1lIG1hcHBpbmc6Ci0JICogCi0JICogJmx0O3BhY2thZ2VNYXBwaW5nJmd0OyAmbHQ7bWFwcGluZyBwYWNrYWdlTmFtZT0iZm9vLmJhciIKLQkgKiBxbmFtZT0iaHR0cDovL2Zvby9iYXIveHNkIiVndDsgLi4uLi4uIC4uLi4uLiAmbHQ7L3BhY2thZ2VNYXBwaW5nJmd0OwotCSAqIAotCSAqIEBwYXJhbSBwYWNrYWdlTWFwcGluZ0VsZW1lbnQKLQkgKiAgICAgICAgICAgIE9NRWxlbWVudCBmb3IgdGhlIHBhY2thZ2VNYXBwaW5nRWxlbWVudAotCSAqLwotCXByaXZhdGUgdm9pZCBwcm9jZXNzVHlwZU1hcHBpbmdzKE9NRWxlbWVudCBwYWNrYWdlTWFwcGluZ0VsZW1lbnQpIHsKLQkJSXRlcmF0b3IgZWxlbWVudEl0ciA9IHBhY2thZ2VNYXBwaW5nRWxlbWVudAotCQkJCS5nZXRDaGlsZHJlbldpdGhOYW1lKG5ldyBRTmFtZShUQUdfTUFQUElORykpOwotCQlUeXBlVGFibGUgdHlwZVRhYmxlID0gc2VydmljZS5nZXRUeXBlVGFibGUoKTsKLQkJaWYgKHR5cGVUYWJsZSA9PSBudWxsKSB7Ci0JCQl0eXBlVGFibGUgPSBuZXcgVHlwZVRhYmxlKCk7Ci0JCX0KLQkJd2hpbGUgKGVsZW1lbnRJdHIuaGFzTmV4dCgpKSB7Ci0JCQlPTUVsZW1lbnQgbWFwcGluZ0VsZW1lbnQgPSAoT01FbGVtZW50KSBlbGVtZW50SXRyLm5leHQoKTsKLQkJCVN0cmluZyBwYWNrYWdlTmFtZSA9IG1hcHBpbmdFbGVtZW50LmdldEF0dHJpYnV0ZVZhbHVlKG5ldyBRTmFtZSgKLQkJCQkJVEFHX1BBQ0tBR0VfTkFNRSkpOwotCQkJU3RyaW5nIHFOYW1lID0gbWFwcGluZ0VsZW1lbnQKLQkJCQkJLmdldEF0dHJpYnV0ZVZhbHVlKG5ldyBRTmFtZShUQUdfUU5BTUUpKTsKLQkJCWlmIChwYWNrYWdlTmFtZSA9PSBudWxsIHx8IHFOYW1lID09IG51bGwpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCUl0ZXJhdG9yIGtleXMgPSBzZXJ2aWNlLmdldE5hbWVzcGFjZU1hcCgpLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoa2V5cy5oYXNOZXh0KCkpIHsKLQkJCQlTdHJpbmcga2V5ID0gKFN0cmluZykga2V5cy5uZXh0KCk7Ci0JCQkJaWYgKHFOYW1lLmVxdWFscyhzZXJ2aWNlLmdldE5hbWVzcGFjZU1hcCgpLmdldChrZXkpKSkgewotCQkJCQl0eXBlVGFibGUuYWRkQ29tcGxleFNjaGVtYShwYWNrYWdlTmFtZSwgbmV3IFFOYW1lKHFOYW1lLAotCQkJCQkJCXBhY2thZ2VOYW1lLCBrZXkpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJc2VydmljZS5zZXRUeXBlVGFibGUodHlwZVRhYmxlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgbG9hZFNlcnZpY2VMaWZlQ3ljbGVDbGFzcyhTdHJpbmcgY2xhc3NOYW1lKQotCQkJdGhyb3dzIERlcGxveW1lbnRFeGNlcHRpb24gewotCQlpZiAoY2xhc3NOYW1lICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJQ2xhc3NMb2FkZXIgbG9hZGVyID0gc2VydmljZS5nZXRDbGFzc0xvYWRlcigpOwotCQkJCUNsYXNzIHNlcnZpY2VMaWZlQ3ljbGVDbGFzc0ltcGwgPSBMb2FkZXIubG9hZENsYXNzKGxvYWRlciwKLQkJCQkJCWNsYXNzTmFtZSk7Ci0JCQkJU2VydmljZUxpZmVDeWNsZSBzZXJ2aWNlTGlmZUN5Y2xlID0gKFNlcnZpY2VMaWZlQ3ljbGUpIHNlcnZpY2VMaWZlQ3ljbGVDbGFzc0ltcGwKLQkJCQkJCS5uZXdJbnN0YW5jZSgpOwotCQkJCXNlcnZpY2VMaWZlQ3ljbGUuc3RhcnRVcChjb25maWdDdHgsIHNlcnZpY2UpOwotCQkJCXNlcnZpY2Uuc2V0U2VydmljZUxpZmVDeWNsZShzZXJ2aWNlTGlmZUN5Y2xlKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGdlbmVyYXRlV3NkbChBeGlzU2VydmljZSBheGlzU2VydmljZSkgewotCQlJdGVyYXRvciBvcGVyYXRpbnMgPSBheGlzU2VydmljZS5nZXRPcGVyYXRpb25zKCk7Ci0JCWlmIChvcGVyYXRpbnMuaGFzTmV4dCgpKSB7Ci0JCQl3aGlsZSAob3BlcmF0aW5zLmhhc05leHQoKSkgewotCQkJCUF4aXNPcGVyYXRpb24gYXhpc09wZXJhdGlvbiA9IChBeGlzT3BlcmF0aW9uKSBvcGVyYXRpbnMubmV4dCgpOwotCi0JCQkJaWYgKGF4aXNPcGVyYXRpb24uaXNDb250cm9sT3BlcmF0aW9uKCkpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJaWYgKGF4aXNPcGVyYXRpb24uZ2V0TWVzc2FnZVJlY2VpdmVyKCkgPT0gbnVsbCkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJU3RyaW5nIG1lc3NhZ2VSZWNlaXZlckNsYXNzID0gYXhpc09wZXJhdGlvbgotCQkJCQkJLmdldE1lc3NhZ2VSZWNlaXZlcigpLmdldENsYXNzKCkuZ2V0TmFtZSgpOwotCQkJCWlmICghKCJvcmcuYXBhY2hlLmF4aXMyLnJwYy5yZWNlaXZlcnMuUlBDTWVzc2FnZVJlY2VpdmVyIgotCQkJCQkJLmVxdWFscyhtZXNzYWdlUmVjZWl2ZXJDbGFzcykKLQkJCQkJCXx8ICJvcmcuYXBhY2hlLmF4aXMyLnJwYy5yZWNlaXZlcnMuUlBDSW5Pbmx5TWVzc2FnZVJlY2VpdmVyIgotCQkJCQkJCQkuZXF1YWxzKG1lc3NhZ2VSZWNlaXZlckNsYXNzKQotCQkJCQkJfHwgIm9yZy5hcGFjaGUuYXhpczIucnBjLnJlY2VpdmVycy5SUENJbk91dEFzeW5jTWVzc2FnZVJlY2VpdmVyIgotCQkJCQkJCQkuZXF1YWxzKG1lc3NhZ2VSZWNlaXZlckNsYXNzKSB8fCAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zZXJ2ZXIuSkFYV1NNZXNzYWdlUmVjZWl2ZXIiCi0JCQkJCQkuZXF1YWxzKG1lc3NhZ2VSZWNlaXZlckNsYXNzKSkpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBUbyBnZXQgdGhlIG1ldGhvZHMgd2hpY2ggZG8gbm90IHVzZSBSUEMqIE1lc3NhZ2VSZWNlaXZlcnMKLQkgKiAKLQkgKiBAcGFyYW0gYXhpc1NlcnZpY2UKLQkgKiAgICAgICAgICAgIHRoZSBBeGlzU2VydmljZSB0byBzZWFyY2gKLQkgKiBAcmV0dXJuIGFuIEFycmF5TGlzdCBvZiB0aGUgTE9DQUwgUEFSVFMgb2YgdGhlIFFOYW1lcyBvZiBhbnkgbm9uLVJQQwotCSAqICAgICAgICAgb3BlcmF0aW9ucyBUT0RPOiBXaHkgbm90IGp1c3QgcmV0dXJuIHRoZSBBeGlzT3BlcmF0aW9ucwotCSAqICAgICAgICAgdGhlbXNlbHZlcz8/Ci0JICovCi0JcHJpdmF0ZSBBcnJheUxpc3QgZ2V0Tm9uUlBDTWV0aG9kcyhBeGlzU2VydmljZSBheGlzU2VydmljZSkgewotCQlBcnJheUxpc3QgZXhjbHVkZU9wZXJhdGlvbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUl0ZXJhdG9yIG9wZXJhdGlucyA9IGF4aXNTZXJ2aWNlLmdldE9wZXJhdGlvbnMoKTsKLQkJaWYgKG9wZXJhdGlucy5oYXNOZXh0KCkpIHsKLQkJCXdoaWxlIChvcGVyYXRpbnMuaGFzTmV4dCgpKSB7Ci0JCQkJQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uID0gKEF4aXNPcGVyYXRpb24pIG9wZXJhdGlucy5uZXh0KCk7Ci0JCQkJaWYgKGF4aXNPcGVyYXRpb24uZ2V0TWVzc2FnZVJlY2VpdmVyKCkgPT0gbnVsbCkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJU3RyaW5nIG1lc3NhZ2VSZWNlaXZlckNsYXNzID0gYXhpc09wZXJhdGlvbgotCQkJCQkJLmdldE1lc3NhZ2VSZWNlaXZlcigpLmdldENsYXNzKCkuZ2V0TmFtZSgpOwotCQkJCWlmICghKCJvcmcuYXBhY2hlLmF4aXMyLnJwYy5yZWNlaXZlcnMuUlBDTWVzc2FnZVJlY2VpdmVyIgotCQkJCQkJLmVxdWFscyhtZXNzYWdlUmVjZWl2ZXJDbGFzcykKLQkJCQkJCXx8ICJvcmcuYXBhY2hlLmF4aXMyLnJwYy5yZWNlaXZlcnMuUlBDSW5Pbmx5TWVzc2FnZVJlY2VpdmVyIgotCQkJCQkJCQkuZXF1YWxzKG1lc3NhZ2VSZWNlaXZlckNsYXNzKQotCQkJCQkJfHwgIm9yZy5hcGFjaGUuYXhpczIucnBjLnJlY2VpdmVycy5SUENJbk91dEFzeW5jTWVzc2FnZVJlY2VpdmVyIgotCQkJCQkJCQkuZXF1YWxzKG1lc3NhZ2VSZWNlaXZlckNsYXNzKSB8fCAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zZXJ2ZXIuSkFYV1NNZXNzYWdlUmVjZWl2ZXIiCi0JCQkJCQkuZXF1YWxzKG1lc3NhZ2VSZWNlaXZlckNsYXNzKSkpIHsKLQkJCQkJZXhjbHVkZU9wZXJhdGlvbnMuYWRkKGF4aXNPcGVyYXRpb24uZ2V0TmFtZSgpCi0JCQkJCQkJLmdldExvY2FsUGFydCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGV4Y2x1ZGVPcGVyYXRpb25zOwotCX0KLQotCS8qKgotCSAqIFByb2Nlc3MgJmx0O2V4Y2x1ZGVPcGVyYXRpb24mZ3Q7IGVsZW1lbnQgaW4gc2VydmljZXMueG1sLiBFYWNoIG9wZXJhdGlvbgotCSAqIHJlZmVyZW5jZWQgd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIEF4aXNTZXJ2aWNlLgotCSAqIAotCSAqIEBwYXJhbSBleGNsdWRlT3BlcmF0aW9ucwotCSAqICAgICAgICAgICAgdGhlICZsdDtleGNsdWRlT3BlcmF0aW9ucyZndDsgZWxlbWVudCBmcm9tIHNlcnZpY2VzLnhtbAotCSAqIEByZXR1cm4gYW4gQXJyYXlMaXN0IG9mIHRoZSBTdHJpbmcgY29udGVudHMgb2YgdGhlICZsdDtvcGVyYXRpb24mZ3Q7Ci0JICogICAgICAgICBlbGVtZW50cwotCSAqLwotCXByaXZhdGUgQXJyYXlMaXN0IHByb2Nlc3NFeGNsdWRlT3BlcmF0aW9ucyhPTUVsZW1lbnQgZXhjbHVkZU9wZXJhdGlvbnMpIHsKLQkJQXJyYXlMaXN0IGV4T3BzID0gbmV3IEFycmF5TGlzdCgpOwotCQlJdGVyYXRvciBleGNsdWRlT3BfaXRyID0gZXhjbHVkZU9wZXJhdGlvbnMKLQkJCQkuZ2V0Q2hpbGRyZW5XaXRoTmFtZShuZXcgUU5hbWUoVEFHX09QRVJBVElPTikpOwotCQl3aGlsZSAoZXhjbHVkZU9wX2l0ci5oYXNOZXh0KCkpIHsKLQkJCU9NRWxlbWVudCBvcE5hbWUgPSAoT01FbGVtZW50KSBleGNsdWRlT3BfaXRyLm5leHQoKTsKLQkJCWV4T3BzLmFkZChvcE5hbWUuZ2V0VGV4dCgpLnRyaW0oKSk7Ci0JCX0KLQkJcmV0dXJuIGV4T3BzOwotCX0KLQotCXByaXZhdGUgdm9pZCBwcm9jZXNzTWVzc2FnZXMoSXRlcmF0b3IgbWVzc2FnZXMsIEF4aXNPcGVyYXRpb24gb3BlcmF0aW9uKQotCQkJdGhyb3dzIERlcGxveW1lbnRFeGNlcHRpb24gewotCQl3aGlsZSAobWVzc2FnZXMuaGFzTmV4dCgpKSB7Ci0JCQlPTUVsZW1lbnQgbWVzc2FnZUVsZW1lbnQgPSAoT01FbGVtZW50KSBtZXNzYWdlcy5uZXh0KCk7Ci0JCQlPTUF0dHJpYnV0ZSBsYWJlbCA9IG1lc3NhZ2VFbGVtZW50Ci0JCQkJCS5nZXRBdHRyaWJ1dGUobmV3IFFOYW1lKFRBR19MQUJFTCkpOwotCi0JCQlpZiAobGFiZWwgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKE1lc3NhZ2VzCi0JCQkJCQkuZ2V0TWVzc2FnZSgibWVzc2FnZWxhYmVsY2Fubm90Zm91bmQiKSk7Ci0JCQl9Ci0KLQkJCUF4aXNNZXNzYWdlIG1lc3NhZ2UgPSBvcGVyYXRpb24uZ2V0TWVzc2FnZShsYWJlbAotCQkJCQkuZ2V0QXR0cmlidXRlVmFsdWUoKSk7Ci0KLQkJCUl0ZXJhdG9yIHBhcmFtZXRlcnMgPSBtZXNzYWdlRWxlbWVudC5nZXRDaGlsZHJlbldpdGhOYW1lKG5ldyBRTmFtZSgKLQkJCQkJVEFHX1BBUkFNRVRFUikpOwotCi0JCQkvLyBwcm9jZXNzaW5nIDx3c3A6UG9saWN5PiAuLiA8Ly4uPiBlbGVtZW50cwotCQkJSXRlcmF0b3IgcG9saWN5RWxlbWVudHMgPSBtZXNzYWdlRWxlbWVudAotCQkJCQkuZ2V0Q2hpbGRyZW5XaXRoTmFtZShuZXcgUU5hbWUoUE9MSUNZX05TX1VSSSwgVEFHX1BPTElDWSkpOwotCi0JCQlpZiAocG9saWN5RWxlbWVudHMgIT0gbnVsbCkgewotCQkJCXByb2Nlc3NQb2xpY3lFbGVtZW50cyhwb2xpY3lFbGVtZW50cywgbWVzc2FnZS5nZXRQb2xpY3lTdWJqZWN0KCkpOwotCQkJfQotCi0JCQkvLyBwcm9jZXNzaW5nIDx3c3A6UG9saWN5UmVmZXJlbmNlPiAuLiA8Ly4uPiBlbGVtZW50cwotCQkJSXRlcmF0b3IgcG9saWN5UmVmRWxlbWVudHMgPSBtZXNzYWdlRWxlbWVudAotCQkJCQkuZ2V0Q2hpbGRyZW5XaXRoTmFtZShuZXcgUU5hbWUoUE9MSUNZX05TX1VSSSwKLQkJCQkJCQlUQUdfUE9MSUNZX1JFRikpOwotCi0JCQlpZiAocG9saWN5UmVmRWxlbWVudHMgIT0gbnVsbCkgewotCQkJCXByb2Nlc3NQb2xpY3lSZWZFbGVtZW50cyhwb2xpY3lSZWZFbGVtZW50cywgbWVzc2FnZS5nZXRQb2xpY3lTdWJqZWN0KCkpOwotCQkJfQotCi0JCQlwcm9jZXNzUGFyYW1ldGVycyhwYXJhbWV0ZXJzLCBtZXNzYWdlLCBvcGVyYXRpb24pOwotCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBsaXN0IG9mIG1vZHVsZXMgdGhhdCBpcyByZXF1aXJlZCB0byBiZSBlbmdhZ2VkIGdsb2JhbGx5LgotCSAqIAotCSAqIEBwYXJhbSBtb2R1bGVSZWZzCi0JICogICAgICAgICAgICA8Y29kZT5qYXZhLnV0aWwuSXRlcmF0b3I8L2NvZGU+Ci0JICogQHRocm93cyBEZXBsb3ltZW50RXhjZXB0aW9uCi0JICogICAgICAgICAgICAgPGNvZGU+RGVwbG95bWVudEV4Y2VwdGlvbjwvY29kZT4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzTW9kdWxlUmVmcyhJdGVyYXRvciBtb2R1bGVSZWZzKQotCQkJdGhyb3dzIERlcGxveW1lbnRFeGNlcHRpb24gewotCQl0cnkgewotCQkJd2hpbGUgKG1vZHVsZVJlZnMuaGFzTmV4dCgpKSB7Ci0JCQkJT01FbGVtZW50IG1vZHVsZXJlZiA9IChPTUVsZW1lbnQpIG1vZHVsZVJlZnMubmV4dCgpOwotCQkJCU9NQXR0cmlidXRlIG1vZHVsZVJlZkF0dHJpYnV0ZSA9IG1vZHVsZXJlZgotCQkJCQkJLmdldEF0dHJpYnV0ZShuZXcgUU5hbWUoVEFHX1JFRkVSRU5DRSkpOwotCi0JCQkJaWYgKG1vZHVsZVJlZkF0dHJpYnV0ZSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyByZWZOYW1lID0gbW9kdWxlUmVmQXR0cmlidXRlLmdldEF0dHJpYnV0ZVZhbHVlKCk7Ci0KLQkJCQkJaWYgKGF4aXNDb25maWcuZ2V0TW9kdWxlKHJlZk5hbWUpID09IG51bGwpIHsKLQkJCQkJCXRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoCi0JCQkJCQkJCURlcGxveW1lbnRFcnJvck1zZ3MuTU9EVUxFX05PVF9GT1VORCwgcmVmTmFtZSkpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJc2VydmljZS5hZGRNb2R1bGVyZWYocmVmTmFtZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEF4aXNGYXVsdCBheGlzRmF1bHQpIHsKLQkJCXRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKGF4aXNGYXVsdCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzT3BlcmF0aW9uTW9kdWxlQ29uZmlnKEl0ZXJhdG9yIG1vZHVsZUNvbmZpZ3MsCi0JCQlQYXJhbWV0ZXJJbmNsdWRlIHBhcmVudCwgQXhpc09wZXJhdGlvbiBvcGVyYXRpb24pCi0JCQl0aHJvd3MgRGVwbG95bWVudEV4Y2VwdGlvbiB7Ci0JCXdoaWxlIChtb2R1bGVDb25maWdzLmhhc05leHQoKSkgewotCQkJT01FbGVtZW50IG1vZHVsZUNvbmZpZyA9IChPTUVsZW1lbnQpIG1vZHVsZUNvbmZpZ3MubmV4dCgpOwotCQkJT01BdHRyaWJ1dGUgbW9kdWxlTmFtZV9hdHQgPSBtb2R1bGVDb25maWcuZ2V0QXR0cmlidXRlKG5ldyBRTmFtZSgKLQkJCQkJQVRUUklCVVRFX05BTUUpKTsKLQotCQkJaWYgKG1vZHVsZU5hbWVfYXR0ID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgRGVwbG95bWVudEV4Y2VwdGlvbihNZXNzYWdlcwotCQkJCQkJLmdldE1lc3NhZ2UoRGVwbG95bWVudEVycm9yTXNncy5JTlZBTElEX01PRFVMRV9DT05GSUcpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJU3RyaW5nIG1vZHVsZSA9IG1vZHVsZU5hbWVfYXR0LmdldEF0dHJpYnV0ZVZhbHVlKCk7Ci0JCQkJTW9kdWxlQ29uZmlndXJhdGlvbiBtb2R1bGVDb25maWd1cmF0aW9uID0gbmV3IE1vZHVsZUNvbmZpZ3VyYXRpb24oCi0JCQkJCQltb2R1bGUsIHBhcmVudCk7Ci0JCQkJSXRlcmF0b3IgcGFyYW1ldGVycyA9IG1vZHVsZUNvbmZpZwotCQkJCQkJLmdldENoaWxkcmVuV2l0aE5hbWUobmV3IFFOYW1lKFRBR19QQVJBTUVURVIpKTsKLQotCQkJCXByb2Nlc3NQYXJhbWV0ZXJzKHBhcmFtZXRlcnMsIG1vZHVsZUNvbmZpZ3VyYXRpb24sIHBhcmVudCk7Ci0JCQkJb3BlcmF0aW9uLmFkZE1vZHVsZUNvbmZpZyhtb2R1bGVDb25maWd1cmF0aW9uKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgQXJyYXlMaXN0IHByb2Nlc3NPcGVyYXRpb25zKEl0ZXJhdG9yIG9wZXJhdGlvbnNJdGVyYXRvcikKLQkJCXRocm93cyBBeGlzRmF1bHQgewotCQlBcnJheUxpc3Qgb3BlcmF0aW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJd2hpbGUgKG9wZXJhdGlvbnNJdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCU9NRWxlbWVudCBvcGVyYXRpb24gPSAoT01FbGVtZW50KSBvcGVyYXRpb25zSXRlcmF0b3IubmV4dCgpOwotCQkJLy8gZ2V0dGluZyBvcGVyYXRpb24gbmFtZQotCQkJT01BdHRyaWJ1dGUgb3BfbmFtZV9hdHQgPSBvcGVyYXRpb24uZ2V0QXR0cmlidXRlKG5ldyBRTmFtZSgKLQkJCQkJQVRUUklCVVRFX05BTUUpKTsKLQkJCWlmIChvcF9uYW1lX2F0dCA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZShNZXNzYWdlcwotCQkJCQkJLmdldE1lc3NhZ2UoRGVwbG95bWVudEVycm9yTXNncy5JTlZBTElEX09QLAotCQkJCQkJCQkib3BlcmF0aW9uIG5hbWUgbWlzc2luZyIpKSk7Ci0JCQl9Ci0KLQkJCS8vIHNldHRpbmcgdGhlIE1FUCBvZiB0aGUgb3BlcmF0aW9uCi0JCQlPTUF0dHJpYnV0ZSBvcF9tZXBfYXR0ID0gb3BlcmF0aW9uLmdldEF0dHJpYnV0ZShuZXcgUU5hbWUoVEFHX01FUCkpOwotCQkJU3RyaW5nIG1lcHVybCA9IG51bGw7Ci0KLQkJCWlmIChvcF9tZXBfYXR0ICE9IG51bGwpIHsKLQkJCQltZXB1cmwgPSBvcF9tZXBfYXR0LmdldEF0dHJpYnV0ZVZhbHVlKCk7Ci0JCQl9Ci0KLQkJCVN0cmluZyBvcG5hbWUgPSBvcF9uYW1lX2F0dC5nZXRBdHRyaWJ1dGVWYWx1ZSgpOwotCQkJQXhpc09wZXJhdGlvbiBvcF9kZXNjcmlwID0gbnVsbDsKLQotCQkJLy8gZ2V0dGluZyB0aGUgbmFtZXNhcGNlIGZyb20gdGhlIGF0dHJpYnV0ZS4KLQkJCU9NQXR0cmlidXRlIG9wZXJhdGlvbk5hbWVzcGFjZSA9IG9wZXJhdGlvbi5nZXRBdHRyaWJ1dGUobmV3IFFOYW1lKAotCQkJCQlBVFRSSUJVVEVfTkFNRVNQQUNFKSk7Ci0JCQlpZiAob3BlcmF0aW9uTmFtZXNwYWNlICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgbmFtZXNwYWNlID0gb3BlcmF0aW9uTmFtZXNwYWNlLmdldEF0dHJpYnV0ZVZhbHVlKCk7Ci0JCQkJb3BfZGVzY3JpcCA9IHNlcnZpY2UuZ2V0T3BlcmF0aW9uKG5ldyBRTmFtZShuYW1lc3BhY2UsIG9wbmFtZSkpOwotCQkJfQotCQkJaWYgKG9wX2Rlc2NyaXAgPT0gbnVsbCkgewotCQkJCW9wX2Rlc2NyaXAgPSBzZXJ2aWNlLmdldE9wZXJhdGlvbihuZXcgUU5hbWUob3BuYW1lKSk7Ci0JCQl9Ci0KLQkJCWlmIChvcF9kZXNjcmlwID09IG51bGwpIHsKLQkJCQlvcF9kZXNjcmlwID0gc2VydmljZS5nZXRPcGVyYXRpb24obmV3IFFOYW1lKHNlcnZpY2UKLQkJCQkJCS5nZXRUYXJnZXROYW1lc3BhY2UoKSwgb3BuYW1lKSk7Ci0JCQl9Ci0JCQlpZiAob3BfZGVzY3JpcCA9PSBudWxsKSB7Ci0JCQkJaWYgKG1lcHVybCA9PSBudWxsKSB7Ci0JCQkJCS8vIGFzc3VtZWQgTUVQIGlzIGluLW91dAotCQkJCQlvcF9kZXNjcmlwID0gbmV3IEluT3V0QXhpc09wZXJhdGlvbigpOwotCQkJCQlvcF9kZXNjcmlwLnNldFBhcmVudChzZXJ2aWNlKTsKLQotCQkJCX0gZWxzZSB7Ci0JCQkJCW9wX2Rlc2NyaXAgPSBBeGlzT3BlcmF0aW9uRmFjdG9yeQotCQkJCQkJCS5nZXRPcGVyYXRpb25EZXNjcmlwdGlvbihtZXB1cmwpOwotCQkJCX0KLQkJCQlvcF9kZXNjcmlwLnNldE5hbWUobmV3IFFOYW1lKG9wbmFtZSkpOwotCQkJCVN0cmluZyBNRVAgPSBvcF9kZXNjcmlwLmdldE1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4oKTsKLQkJCQlpZiAoV1NETDJDb25zdGFudHMuTUVQX1VSSV9JTl9PTkxZLmVxdWFscyhNRVApCi0JCQkJCQl8fCBXU0RMMkNvbnN0YW50cy5NRVBfVVJJX0lOX09QVElPTkFMX09VVC5lcXVhbHMoTUVQKQotCQkJCQkJfHwgV1NETDJDb25zdGFudHMuTUVQX1VSSV9PVVRfT1BUSU9OQUxfSU4uZXF1YWxzKE1FUCkKLQkJCQkJCXx8IFdTREwyQ29uc3RhbnRzLk1FUF9VUklfUk9CVVNUX09VVF9PTkxZLmVxdWFscyhNRVApCi0JCQkJCQl8fCBXU0RMMkNvbnN0YW50cy5NRVBfVVJJX1JPQlVTVF9JTl9PTkxZLmVxdWFscyhNRVApCi0JCQkJCQl8fCBXU0RMMkNvbnN0YW50cy5NRVBfVVJJX0lOX09VVC5lcXVhbHMoTUVQKSkgewotCQkJCQlBeGlzTWVzc2FnZSBpbmF4aXNNZXNzYWdlID0gb3BfZGVzY3JpcAotCQkJCQkJCS5nZXRNZXNzYWdlKFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9JTl9WQUxVRSk7Ci0JCQkJCWlmIChpbmF4aXNNZXNzYWdlICE9IG51bGwpIHsKLQkJCQkJCWluYXhpc01lc3NhZ2Uuc2V0TmFtZShvcG5hbWUKLQkJCQkJCQkJKyBKYXZhMldTRExDb25zdGFudHMuTUVTU0FHRV9TVUZGSVgpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJaWYgKFdTREwyQ29uc3RhbnRzLk1FUF9VUklfT1VUX09OTFkuZXF1YWxzKE1FUCkKLQkJCQkJCXx8IFdTREwyQ29uc3RhbnRzLk1FUF9VUklfT1VUX09QVElPTkFMX0lOLmVxdWFscyhNRVApCi0JCQkJCQl8fCBXU0RMMkNvbnN0YW50cy5NRVBfVVJJX0lOX09QVElPTkFMX09VVC5lcXVhbHMoTUVQKQotCQkJCQkJfHwgV1NETDJDb25zdGFudHMuTUVQX1VSSV9ST0JVU1RfT1VUX09OTFkuZXF1YWxzKE1FUCkKLQkJCQkJCXx8IFdTREwyQ29uc3RhbnRzLk1FUF9VUklfSU5fT1VULmVxdWFscyhNRVApKSB7Ci0JCQkJCUF4aXNNZXNzYWdlIG91dEF4aXNNZXNzYWdlID0gb3BfZGVzY3JpcAotCQkJCQkJCS5nZXRNZXNzYWdlKFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9PVVRfVkFMVUUpOwotCQkJCQlpZiAob3V0QXhpc01lc3NhZ2UgIT0gbnVsbCkgewotCQkJCQkJb3V0QXhpc01lc3NhZ2Uuc2V0TmFtZShvcG5hbWUKLQkJCQkJCQkJKyBKYXZhMldTRExDb25zdGFudHMuUkVTUE9OU0UpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBzZXR0aW5nIHRoZSBQb2xpY3lJbmNsdWRlCi0KLQkJCS8vIHByb2Nlc3NpbmcgPHdzcDpQb2xpY3k+IC4uIDwvLi4+IGVsZW1lbnRzCi0JCQlJdGVyYXRvciBwb2xpY3lFbGVtZW50cyA9IG9wZXJhdGlvbi5nZXRDaGlsZHJlbldpdGhOYW1lKG5ldyBRTmFtZSgKLQkJCQkJUE9MSUNZX05TX1VSSSwgVEFHX1BPTElDWSkpOwotCi0JCQlpZiAocG9saWN5RWxlbWVudHMgIT0gbnVsbCAmJiBwb2xpY3lFbGVtZW50cy5oYXNOZXh0KCkpIHsKLQkJCQlwcm9jZXNzUG9saWN5RWxlbWVudHMocG9saWN5RWxlbWVudHMsIG9wX2Rlc2NyaXAuZ2V0UG9saWN5U3ViamVjdCgpKTsKLQkJCX0KLQotCQkJLy8gcHJvY2Vzc2luZyA8d3NwOlBvbGljeVJlZmVyZW5jZT4gLi4gPC8uLj4gZWxlbWVudHMKLQkJCUl0ZXJhdG9yIHBvbGljeVJlZkVsZW1lbnRzID0gb3BlcmF0aW9uCi0JCQkJCS5nZXRDaGlsZHJlbldpdGhOYW1lKG5ldyBRTmFtZShQT0xJQ1lfTlNfVVJJLAotCQkJCQkJCVRBR19QT0xJQ1lfUkVGKSk7Ci0KLQkJCWlmIChwb2xpY3lSZWZFbGVtZW50cyAhPSBudWxsICYmIHBvbGljeVJlZkVsZW1lbnRzLmhhc05leHQoKSkgewotCQkJCXByb2Nlc3NQb2xpY3lSZWZFbGVtZW50cyhwb2xpY3lSZWZFbGVtZW50cywgb3BfZGVzY3JpcC5nZXRQb2xpY3lTdWJqZWN0KCkpOwotCQkJfQotCi0JCQkvLyBPcGVyYXRpb24gUGFyYW1ldGVycwotCQkJSXRlcmF0b3IgcGFyYW1ldGVycyA9IG9wZXJhdGlvbi5nZXRDaGlsZHJlbldpdGhOYW1lKG5ldyBRTmFtZSgKLQkJCQkJVEFHX1BBUkFNRVRFUikpOwotCQkJcHJvY2Vzc1BhcmFtZXRlcnMocGFyYW1ldGVycywgb3BfZGVzY3JpcCwgc2VydmljZSk7Ci0JCQkvLyBUbyBwcm9jZXNzIHdzYW1hcHBpbmc7Ci0JCQlwcm9jZXNzQWN0aW9uTWFwcGluZ3Mob3BlcmF0aW9uLCBvcF9kZXNjcmlwKTsKLQotCQkJLy8gbG9hZGluZyB0aGUgbWVzc2FnZSByZWNlaXZlcnMKLQkJCU9NRWxlbWVudCByZWNlaXZlckVsZW1lbnQgPSBvcGVyYXRpb24KLQkJCQkJLmdldEZpcnN0Q2hpbGRXaXRoTmFtZShuZXcgUU5hbWUoVEFHX01FU1NBR0VfUkVDRUlWRVIpKTsKLQotCQkJaWYgKHJlY2VpdmVyRWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJTWVzc2FnZVJlY2VpdmVyIG1lc3NhZ2VSZWNlaXZlciA9IGxvYWRNZXNzYWdlUmVjZWl2ZXIoc2VydmljZQotCQkJCQkJLmdldENsYXNzTG9hZGVyKCksIHJlY2VpdmVyRWxlbWVudCk7Ci0KLQkJCQlvcF9kZXNjcmlwLnNldE1lc3NhZ2VSZWNlaXZlcihtZXNzYWdlUmVjZWl2ZXIpOwotCQkJfSBlbHNlIHsKLQkJCQkvLyBzZXR0aW5nIGRlZmF1bHQgbWVzc2FnZSByZWNlaXZlcgotCQkJCU1lc3NhZ2VSZWNlaXZlciBtc2dSZWNlaXZlciA9IGxvYWREZWZhdWx0TWVzc2FnZVJlY2VpdmVyKAotCQkJCQkJb3BfZGVzY3JpcC5nZXRNZXNzYWdlRXhjaGFuZ2VQYXR0ZXJuKCksIHNlcnZpY2UpOwotCQkJCW9wX2Rlc2NyaXAuc2V0TWVzc2FnZVJlY2VpdmVyKG1zZ1JlY2VpdmVyKTsKLQkJCX0KLQotCQkJLy8gUHJvY2VzcyBNb2R1bGUgUmVmcwotCQkJSXRlcmF0b3IgbW9kdWxlcyA9IG9wZXJhdGlvbi5nZXRDaGlsZHJlbldpdGhOYW1lKG5ldyBRTmFtZSgKLQkJCQkJVEFHX01PRFVMRSkpOwotCi0JCQlwcm9jZXNzT3BlcmF0aW9uTW9kdWxlUmVmcyhtb2R1bGVzLCBvcF9kZXNjcmlwKTsKLQotCQkJLy8gcHJvY2Vzc2luZyBNZXNzYWdlcwotCQkJSXRlcmF0b3IgbWVzc2FnZXMgPSBvcGVyYXRpb24uZ2V0Q2hpbGRyZW5XaXRoTmFtZShuZXcgUU5hbWUoCi0JCQkJCVRBR19NRVNTQUdFKSk7Ci0KLQkJCXByb2Nlc3NNZXNzYWdlcyhtZXNzYWdlcywgb3BfZGVzY3JpcCk7Ci0KLQkJCS8vIHNldHRpbmcgT3BlcmF0aW9uIHBoYXNlCi0JCQlpZiAoYXhpc0NvbmZpZyAhPSBudWxsKSB7Ci0JCQkJUGhhc2VzSW5mbyBpbmZvID0gYXhpc0NvbmZpZy5nZXRQaGFzZXNJbmZvKCk7Ci0KLQkJCQlpbmZvLnNldE9wZXJhdGlvblBoYXNlcyhvcF9kZXNjcmlwKTsKLQkJCX0KLQkJCUl0ZXJhdG9yIG1vZHVsZUNvbmZpZ3MgPSBvcGVyYXRpb24uZ2V0Q2hpbGRyZW5XaXRoTmFtZShuZXcgUU5hbWUoCi0JCQkJCVRBR19NT0RVTEVfQ09ORklHKSk7Ci0JCQlwcm9jZXNzT3BlcmF0aW9uTW9kdWxlQ29uZmlnKG1vZHVsZUNvbmZpZ3MsIG9wX2Rlc2NyaXAsIG9wX2Rlc2NyaXApOwotCQkJLy8gYWRkaW5nIHRoZSBvcGVyYXRpb24KLQkJCW9wZXJhdGlvbnMuYWRkKG9wX2Rlc2NyaXApOwotCQl9Ci0JCXJldHVybiBvcGVyYXRpb25zOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NTZXJ2aWNlTW9kdWxlQ29uZmlnKEl0ZXJhdG9yIG1vZHVsZUNvbmZpZ3MsCi0JCQlQYXJhbWV0ZXJJbmNsdWRlIHBhcmVudCwgQXhpc1NlcnZpY2Ugc2VydmljZSkKLQkJCXRocm93cyBEZXBsb3ltZW50RXhjZXB0aW9uIHsKLQkJd2hpbGUgKG1vZHVsZUNvbmZpZ3MuaGFzTmV4dCgpKSB7Ci0JCQlPTUVsZW1lbnQgbW9kdWxlQ29uZmlnID0gKE9NRWxlbWVudCkgbW9kdWxlQ29uZmlncy5uZXh0KCk7Ci0JCQlPTUF0dHJpYnV0ZSBtb2R1bGVOYW1lX2F0dCA9IG1vZHVsZUNvbmZpZy5nZXRBdHRyaWJ1dGUobmV3IFFOYW1lKAotCQkJCQlBVFRSSUJVVEVfTkFNRSkpOwotCi0JCQlpZiAobW9kdWxlTmFtZV9hdHQgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKE1lc3NhZ2VzCi0JCQkJCQkuZ2V0TWVzc2FnZShEZXBsb3ltZW50RXJyb3JNc2dzLklOVkFMSURfTU9EVUxFX0NPTkZJRykpOwotCQkJfSBlbHNlIHsKLQkJCQlTdHJpbmcgbW9kdWxlID0gbW9kdWxlTmFtZV9hdHQuZ2V0QXR0cmlidXRlVmFsdWUoKTsKLQkJCQlNb2R1bGVDb25maWd1cmF0aW9uIG1vZHVsZUNvbmZpZ3VyYXRpb24gPSBuZXcgTW9kdWxlQ29uZmlndXJhdGlvbigKLQkJCQkJCW1vZHVsZSwgcGFyZW50KTsKLQkJCQlJdGVyYXRvciBwYXJhbWV0ZXJzID0gbW9kdWxlQ29uZmlnCi0JCQkJCQkuZ2V0Q2hpbGRyZW5XaXRoTmFtZShuZXcgUU5hbWUoVEFHX1BBUkFNRVRFUikpOwotCi0JCQkJcHJvY2Vzc1BhcmFtZXRlcnMocGFyYW1ldGVycywgbW9kdWxlQ29uZmlndXJhdGlvbiwgcGFyZW50KTsKLQkJCQlzZXJ2aWNlLmFkZE1vZHVsZUNvbmZpZyhtb2R1bGVDb25maWd1cmF0aW9uKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogcHJvY2VzcyBkYXRhIGxvY2F0b3IgY29uZmlndXJhdGlvbiBmb3IgZGF0YSByZXRyaWV2YWwuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NEYXRhTG9jYXRvckNvbmZpZyhPTUVsZW1lbnQgZGF0YUxvY2F0b3JFbGVtZW50LAotCQkJQXhpc1NlcnZpY2Ugc2VydmljZSkgewotCQlPTUF0dHJpYnV0ZSBzZXJ2aWNlT3ZlcmFsbERhdGFMb2NhdG9yY2xhc3MgPSBkYXRhTG9jYXRvckVsZW1lbnQKLQkJCQkuZ2V0QXR0cmlidXRlKG5ldyBRTmFtZShEUkNvbnN0YW50cy5DTEFTU19BVFRSSUJVVEUpKTsKLQkJaWYgKHNlcnZpY2VPdmVyYWxsRGF0YUxvY2F0b3JjbGFzcyAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgY2xhc3NOYW1lID0gc2VydmljZU92ZXJhbGxEYXRhTG9jYXRvcmNsYXNzCi0JCQkJCS5nZXRBdHRyaWJ1dGVWYWx1ZSgpOwotCQkJc2VydmljZS5hZGREYXRhTG9jYXRvckNsYXNzTmFtZXMoRFJDb25zdGFudHMuU0VSVklDRV9MRVZFTCwKLQkJCQkJY2xhc3NOYW1lKTsKLQkJfQotCQlJdGVyYXRvciBpdGVyYXRvciA9IGRhdGFMb2NhdG9yRWxlbWVudC5nZXRDaGlsZHJlbldpdGhOYW1lKG5ldyBRTmFtZSgKLQkJCQlEUkNvbnN0YW50cy5ESUFMRUNUX0xPQ0FUT1JfRUxFTUVOVCkpOwotCi0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCU9NRWxlbWVudCBsb2NhdG9yRWxlbWVudCA9IChPTUVsZW1lbnQpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCU9NQXR0cmlidXRlIGRpYWxlY3QgPSBsb2NhdG9yRWxlbWVudC5nZXRBdHRyaWJ1dGUobmV3IFFOYW1lKAotCQkJCQlEUkNvbnN0YW50cy5ESUFMRUNUX0FUVFJJQlVURSkpOwotCQkJT01BdHRyaWJ1dGUgZGlhbGVjdGNsYXNzID0gbG9jYXRvckVsZW1lbnQuZ2V0QXR0cmlidXRlKG5ldyBRTmFtZSgKLQkJCQkJRFJDb25zdGFudHMuQ0xBU1NfQVRUUklCVVRFKSk7Ci0JCQlzZXJ2aWNlLmFkZERhdGFMb2NhdG9yQ2xhc3NOYW1lcyhkaWFsZWN0LmdldEF0dHJpYnV0ZVZhbHVlKCksCi0JCQkJCWRpYWxlY3RjbGFzcy5nZXRBdHRyaWJ1dGVWYWx1ZSgpKTsKLQotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRXc2RsU2VydmljZU1hcChIYXNoTWFwIHdzZGxTZXJ2aWNlTWFwKSB7Ci0JCXRoaXMud3NkbFNlcnZpY2VNYXAgPSB3c2RsU2VydmljZU1hcDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJvY2Vzc0VuZHBvaW50cyhBeGlzU2VydmljZSBheGlzU2VydmljZSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0JCVN0cmluZyBlbmRwb2ludE5hbWUgPSBheGlzU2VydmljZS5nZXRFbmRwb2ludE5hbWUoKTsKLQkJaWYgKGVuZHBvaW50TmFtZSA9PSBudWxsIHx8IGVuZHBvaW50TmFtZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlVdGlscy5hZGRFbmRwb2ludHNUb1NlcnZpY2UoYXhpc1NlcnZpY2UsIHNlcnZpY2UuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NQb2xpY3lBdHRhY2htZW50cyhPTUVsZW1lbnQgc2VydmljZUVsZW1lbnQsIEF4aXNTZXJ2aWNlIHNlcnZpY2UpIHRocm93cyBEZXBsb3ltZW50RXhjZXB0aW9uIHsKLQkJSXRlcmF0b3IgYXR0YWNobWVudEVsZW1lbnRzID0gc2VydmljZUVsZW1lbnQuZ2V0Q2hpbGRyZW5XaXRoTmFtZShuZXcgUU5hbWUoUE9MSUNZX05TX1VSSSwgVEFHX1BPTElDWV9BVFRBQ0hNRU5UKSk7Ci0JCXRyeSB7Ci0JCQlVdGlscy5wcm9jZXNzUG9saWN5QXR0YWNobWVudHMoYXR0YWNobWVudEVsZW1lbnRzLCBzZXJ2aWNlKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9TZXJ2aWNlRGVwbG95ZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L1NlcnZpY2VEZXBsb3llci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmNkZTJmLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L1NlcnZpY2VEZXBsb3llci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC5yZXBvc2l0b3J5LnV0aWwuQXJjaGl2ZVJlYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQucmVwb3NpdG9yeS51dGlsLkRlcGxveW1lbnRGaWxlRGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQudXRpbC5VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlR3JvdXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0NvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pMThuLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgU2VydmljZURlcGxveWVyIGltcGxlbWVudHMgRGVwbG95ZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhTZXJ2aWNlRGVwbG95ZXIuY2xhc3MpOwotICAgIHByaXZhdGUgQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZzsKLSAgICBwcml2YXRlIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0N0eDsKLQotICAgIC8vVG8gaW5pdGlhbGl6ZSB0aGUgZGVwbG95ZXIKLSAgICBwdWJsaWMgdm9pZCBpbml0KENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0N0eCkgewotICAgICAgICB0aGlzLmNvbmZpZ0N0eCA9IGNvbmZpZ0N0eDsKLSAgICAgICAgdGhpcy5heGlzQ29uZmlnID0gdGhpcy5jb25maWdDdHguZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKTsKLSAgICB9Ci0KLSAgICAvL1dpbGwgcHJvY2VzcyB0aGUgZmlsZSBhbmQgYWRkIHRoYXQgdG8gYXhpc0NvbmZpZwotCi0gICAgcHVibGljIHZvaWQgZGVwbG95KERlcGxveW1lbnRGaWxlRGF0YSBkZXBsb3ltZW50RmlsZURhdGEpIHRocm93cyBEZXBsb3ltZW50RXhjZXB0aW9uIHsKLSAgICAgICAgYm9vbGVhbiBpc0RpcmVjdG9yeSA9IGRlcGxveW1lbnRGaWxlRGF0YS5nZXRGaWxlKCkuaXNEaXJlY3RvcnkoKTsKLSAgICAgICAgQXJjaGl2ZVJlYWRlciBhcmNoaXZlUmVhZGVyOwotICAgICAgICBTdHJpbmdXcml0ZXIgZXJyb3JXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgICAgIGFyY2hpdmVSZWFkZXIgPSBuZXcgQXJjaGl2ZVJlYWRlcigpOwotICAgICAgICBTdHJpbmcgc2VydmljZVN0YXR1cyA9ICIiOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZGVwbG95bWVudEZpbGVEYXRhLnNldENsYXNzTG9hZGVyKGlzRGlyZWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNDb25maWcuZ2V0U2VydmljZUNsYXNzTG9hZGVyKCksCi0gICAgICAgICAgICAgICAgICAgIChGaWxlKWF4aXNDb25maWcuZ2V0UGFyYW1ldGVyVmFsdWUoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uQVJUSUZBQ1RTX1RFTVBfRElSKSk7Ci0gICAgICAgICAgICBIYXNoTWFwIHdzZGxzZXJ2aWNlID0gYXJjaGl2ZVJlYWRlci5wcm9jZXNzV1NETHMoZGVwbG95bWVudEZpbGVEYXRhKTsKLSAgICAgICAgICAgIGlmICh3c2Rsc2VydmljZSAhPSBudWxsICYmIHdzZGxzZXJ2aWNlLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBJdGVyYXRvciBzZXJ2aWNlcyA9IHdzZGxzZXJ2aWNlLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKHNlcnZpY2VzLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICBBeGlzU2VydmljZSBzZXJ2aWNlID0gKEF4aXNTZXJ2aWNlKSBzZXJ2aWNlcy5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yIG9wZXJhdGlvbnMgPSBzZXJ2aWNlLmdldE9wZXJhdGlvbnMoKTsKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG9wZXJhdGlvbnMuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb24gPSAoQXhpc09wZXJhdGlvbikgb3BlcmF0aW9ucy5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBheGlzQ29uZmlnLmdldFBoYXNlc0luZm8oKS5zZXRPcGVyYXRpb25QaGFzZXMoYXhpc09wZXJhdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBeGlzU2VydmljZUdyb3VwIHNlcnZpY2VHcm91cCA9IG5ldyBBeGlzU2VydmljZUdyb3VwKGF4aXNDb25maWcpOwotICAgICAgICAgICAgc2VydmljZUdyb3VwLnNldFNlcnZpY2VHcm91cENsYXNzTG9hZGVyKGRlcGxveW1lbnRGaWxlRGF0YS5nZXRDbGFzc0xvYWRlcigpKTsKLSAgICAgICAgICAgIEFycmF5TGlzdCBzZXJ2aWNlTGlzdCA9IGFyY2hpdmVSZWFkZXIucHJvY2Vzc1NlcnZpY2VHcm91cCgKLSAgICAgICAgICAgICAgICAgICAgZGVwbG95bWVudEZpbGVEYXRhLmdldEFic29sdXRlUGF0aCgpLCBkZXBsb3ltZW50RmlsZURhdGEsCi0gICAgICAgICAgICAgICAgICAgIHNlcnZpY2VHcm91cCwgaXNEaXJlY3RvcnksIHdzZGxzZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICBjb25maWdDdHgpOwotICAgICAgICAgICAgVVJMIGxvY2F0aW9uID0gZGVwbG95bWVudEZpbGVEYXRhLmdldEZpbGUoKS50b1VSTCgpOwotICAgICAgICAgICAgRGVwbG95bWVudEVuZ2luZS5hZGRTZXJ2aWNlR3JvdXAoc2VydmljZUdyb3VwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZUxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcGxveW1lbnRGaWxlRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNDb25maWcpOwotICAgICAgICAgICAgbG9nLmluZm8oTWVzc2FnZXMuZ2V0TWVzc2FnZShEZXBsb3ltZW50RXJyb3JNc2dzLkRFUExPWUlOR19XUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwbG95bWVudEZpbGVEYXRhLmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24udG9TdHJpbmcoKSkpOwotICAgICAgICB9IGNhdGNoIChEZXBsb3ltZW50RXhjZXB0aW9uIGRlKSB7Ci0gICAgICAgICAgICBkZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIGxvZy5lcnJvcihNZXNzYWdlcy5nZXRNZXNzYWdlKERlcGxveW1lbnRFcnJvck1zZ3MuSU5WQUxJRF9TRVJWSUNFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwbG95bWVudEZpbGVEYXRhLmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlLmdldE1lc3NhZ2UoKSksCi0gICAgICAgICAgICAgICAgICAgICAgZGUpOwotICAgICAgICAgICAgUHJpbnRXcml0ZXIgZXJyb3JfcHRpbnRXcml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIoZXJyb3JXcml0ZXIpOwotICAgICAgICAgICAgZGUucHJpbnRTdGFja1RyYWNlKGVycm9yX3B0aW50V3JpdGVyKTsKLSAgICAgICAgICAgIHNlcnZpY2VTdGF0dXMgPSAiRXJyb3I6XG4iICsgZXJyb3JXcml0ZXIudG9TdHJpbmcoKTsKLQotICAgICAgICAgICAgdGhyb3cgZGU7Ci0KLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGF4aXNGYXVsdCkgewotICAgICAgICAgICAgbG9nLmVycm9yKE1lc3NhZ2VzLmdldE1lc3NhZ2UoRGVwbG95bWVudEVycm9yTXNncy5JTlZBTElEX1NFUlZJQ0UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBsb3ltZW50RmlsZURhdGEuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpc0ZhdWx0LmdldE1lc3NhZ2UoKSksCi0gICAgICAgICAgICAgICAgICAgICAgYXhpc0ZhdWx0KTsKLSAgICAgICAgICAgIFByaW50V3JpdGVyIGVycm9yX3B0aW50V3JpdGVyID0gbmV3IFByaW50V3JpdGVyKGVycm9yV3JpdGVyKTsKLSAgICAgICAgICAgIGF4aXNGYXVsdC5wcmludFN0YWNrVHJhY2UoZXJyb3JfcHRpbnRXcml0ZXIpOwotICAgICAgICAgICAgc2VydmljZVN0YXR1cyA9ICJFcnJvcjpcbiIgKyBlcnJvcldyaXRlci50b1N0cmluZygpOwotCi0gICAgICAgICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEV4Y2VwdGlvbihheGlzRmF1bHQpOwotCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzSW5mb0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIFN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICAgICAgICAgICAgICBQcmludFdyaXRlciBwdyA9IG5ldyBQcmludFdyaXRlcihzdyk7Ci0gICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UocHcpOwotICAgICAgICAgICAgICAgIGxvZy5pbmZvKE1lc3NhZ2VzLmdldE1lc3NhZ2UoCi0gICAgICAgICAgICAgICAgICAgICAgICBEZXBsb3ltZW50RXJyb3JNc2dzLklOVkFMSURfU0VSVklDRSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlcGxveW1lbnRGaWxlRGF0YS5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBzdy5nZXRCdWZmZXIoKS50b1N0cmluZygpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBQcmludFdyaXRlciBlcnJvcl9wdGludFdyaXRlciA9IG5ldyBQcmludFdyaXRlcihlcnJvcldyaXRlcik7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZShlcnJvcl9wdGludFdyaXRlcik7Ci0gICAgICAgICAgICBzZXJ2aWNlU3RhdHVzID0gIkVycm9yOlxuIiArIGVycm9yV3JpdGVyLnRvU3RyaW5nKCk7Ci0KLSAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKGUpOwotCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzSW5mb0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIFN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICAgICAgICAgICAgICBQcmludFdyaXRlciBwdyA9IG5ldyBQcmludFdyaXRlcihzdyk7Ci0gICAgICAgICAgICAgICAgdC5wcmludFN0YWNrVHJhY2UocHcpOwotICAgICAgICAgICAgICAgIGxvZy5pbmZvKE1lc3NhZ2VzLmdldE1lc3NhZ2UoCi0gICAgICAgICAgICAgICAgICAgICAgICBEZXBsb3ltZW50RXJyb3JNc2dzLklOVkFMSURfU0VSVklDRSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlcGxveW1lbnRGaWxlRGF0YS5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBzdy5nZXRCdWZmZXIoKS50b1N0cmluZygpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBQcmludFdyaXRlciBlcnJvcl9wdGludFdyaXRlciA9IG5ldyBQcmludFdyaXRlcihlcnJvcldyaXRlcik7Ci0gICAgICAgICAgICB0LnByaW50U3RhY2tUcmFjZShlcnJvcl9wdGludFdyaXRlcik7Ci0gICAgICAgICAgICBzZXJ2aWNlU3RhdHVzID0gIkVycm9yOlxuIiArIGVycm9yV3JpdGVyLnRvU3RyaW5nKCk7Ci0KLSAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKG5ldyBFeGNlcHRpb24odCkpOwotCi0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoc2VydmljZVN0YXR1cy5zdGFydHNXaXRoKCJFcnJvcjoiKSkgewotICAgICAgICAgICAgICAgIGF4aXNDb25maWcuZ2V0RmF1bHR5U2VydmljZXMoKS5wdXQoZGVwbG95bWVudEZpbGVEYXRhLmdldEZpbGUoKS5nZXRBYnNvbHV0ZVBhdGgoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VTdGF0dXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RGlyZWN0b3J5KFN0cmluZyBkaXJlY3RvcnkpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRFeHRlbnNpb24oU3RyaW5nIGV4dGVuc2lvbikgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHVuRGVwbG95KFN0cmluZyBmaWxlTmFtZSkgdGhyb3dzIERlcGxveW1lbnRFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgZmlsZU5hbWUgPSBVdGlscy5nZXRTaG9ydEZpbGVOYW1lKGZpbGVOYW1lKTsKLSAgICAgICAgICAgIGZpbGVOYW1lID0gRGVwbG95bWVudEVuZ2luZS5nZXRBeGlzU2VydmljZU5hbWUoZmlsZU5hbWUpOwotICAgICAgICAgICAgQXhpc1NlcnZpY2VHcm91cCBzZXJ2aWNlR3JvdXAgPSBheGlzQ29uZmlnLnJlbW92ZVNlcnZpY2VHcm91cChmaWxlTmFtZSk7Ci0gICAgICAgICAgICBpZiAoc2VydmljZUdyb3VwICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjb25maWdDdHgucmVtb3ZlU2VydmljZUdyb3VwQ29udGV4dChzZXJ2aWNlR3JvdXApOwotICAgICAgICAgICAgICAgIGxvZy5pbmZvKE1lc3NhZ2VzLmdldE1lc3NhZ2UoRGVwbG95bWVudEVycm9yTXNncy5TRVJWSUNFX1JFTU9WRUQsCi0gICAgICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZSkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBheGlzQ29uZmlnLnJlbW92ZUZhdWx0eVNlcnZpY2UoZmlsZU5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgYXhpc0ZhdWx0KSB7Ci0gICAgICAgICAgICAvL01heSBiZSBhIGZhdWx0eSBzZXJ2aWNlCi0gICAgICAgICAgICBheGlzQ29uZmlnLnJlbW92ZUZhdWx0eVNlcnZpY2UoZmlsZU5hbWUpOwotCi0gICAgICAgICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEV4Y2VwdGlvbihheGlzRmF1bHQpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvU2VydmljZUdyb3VwQnVpbGRlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvU2VydmljZUdyb3VwQnVpbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjYwZTE0Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L1NlcnZpY2VHcm91cEJ1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlR3JvdXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5Nb2R1bGVDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVySW5jbHVkZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmkxOG4uTWVzc2FnZXM7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgU2VydmljZUdyb3VwQnVpbGRlciBleHRlbmRzIERlc2NyaXB0aW9uQnVpbGRlciB7Ci0gICAgcHJpdmF0ZSBPTUVsZW1lbnQgc2VydmljZUVsZW1lbnQ7Ci0gICAgcHJpdmF0ZSBIYXNoTWFwIHdzZGxTZXJ2aWNlczsKLQotICAgIHB1YmxpYyBTZXJ2aWNlR3JvdXBCdWlsZGVyKE9NRWxlbWVudCBzZXJ2aWNlLCBIYXNoTWFwIHdzZGxTZXJ2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDdHgpIHsKLSAgICAgICAgdGhpcy5zZXJ2aWNlRWxlbWVudCA9IHNlcnZpY2U7Ci0gICAgICAgIHRoaXMud3NkbFNlcnZpY2VzID0gd3NkbFNlcnZpY2VzOwotICAgICAgICB0aGlzLmNvbmZpZ0N0eCA9IGNvbmZpZ0N0eDsKLSAgICAgICAgdGhpcy5heGlzQ29uZmlnID0gdGhpcy5jb25maWdDdHguZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXJyYXlMaXN0PEF4aXNTZXJ2aWNlPiBwb3B1bGF0ZVNlcnZpY2VHcm91cChBeGlzU2VydmljZUdyb3VwIGF4aXNTZXJ2aWNlR3JvdXApCi0gICAgICAgICAgICB0aHJvd3MgRGVwbG95bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIEFycmF5TGlzdCBzZXJ2aWNlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgICAgICB0cnkgewotCi0gICAgICAgICAgICAvLyBQcm9jZXNzaW5nIHNlcnZpY2UgbGV2ZWwgcGFyYW1ldGVycwotICAgICAgICAgICAgSXRlcmF0b3IgaXRyID0gc2VydmljZUVsZW1lbnQuZ2V0Q2hpbGRyZW5XaXRoTmFtZShuZXcgUU5hbWUoVEFHX1BBUkFNRVRFUikpOwotCi0gICAgICAgICAgICBwcm9jZXNzUGFyYW1ldGVycyhpdHIsIGF4aXNTZXJ2aWNlR3JvdXAsIGF4aXNTZXJ2aWNlR3JvdXAuZ2V0UGFyZW50KCkpOwotCi0gICAgICAgICAgICBJdGVyYXRvciBtb2R1bGVDb25maWdzID0KLSAgICAgICAgICAgICAgICAgICAgc2VydmljZUVsZW1lbnQuZ2V0Q2hpbGRyZW5XaXRoTmFtZShuZXcgUU5hbWUoVEFHX01PRFVMRV9DT05GSUcpKTsKLQotICAgICAgICAgICAgcHJvY2Vzc1NlcnZpY2VNb2R1bGVDb25maWcobW9kdWxlQ29uZmlncywgYXhpc1NlcnZpY2VHcm91cC5nZXRQYXJlbnQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlR3JvdXApOwotCi0gICAgICAgICAgICAvLyBwcm9jZXNzaW5nIHNlcnZpY2Utd2lkZSBtb2R1bGVzIHdoaWNoIHJlcXVpcmVkIHRvIGVuZ2FnZSBnbG9iYWxseQotICAgICAgICAgICAgSXRlcmF0b3IgbW9kdWxlUmVmcyA9IHNlcnZpY2VFbGVtZW50LmdldENoaWxkcmVuV2l0aE5hbWUobmV3IFFOYW1lKFRBR19NT0RVTEUpKTsKLQotICAgICAgICAgICAgcHJvY2Vzc01vZHVsZVJlZnMobW9kdWxlUmVmcywgYXhpc1NlcnZpY2VHcm91cCk7Ci0KLSAgICAgICAgICAgIEl0ZXJhdG9yIHNlcnZpY2VpdHIgPSBzZXJ2aWNlRWxlbWVudC5nZXRDaGlsZHJlbldpdGhOYW1lKG5ldyBRTmFtZShUQUdfU0VSVklDRSkpOwotCi0gICAgICAgICAgICB3aGlsZSAoc2VydmljZWl0ci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBPTUVsZW1lbnQgc2VydmljZSA9IChPTUVsZW1lbnQpIHNlcnZpY2VpdHIubmV4dCgpOwotICAgICAgICAgICAgICAgIE9NQXR0cmlidXRlIHNlcnZpY2VOYW1lYXR0ID0gc2VydmljZS5nZXRBdHRyaWJ1dGUobmV3IFFOYW1lKEFUVFJJQlVURV9OQU1FKSk7Ci0gICAgICAgICAgICAgICAgaWYgKHNlcnZpY2VOYW1lYXR0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZ2V0TWVzc2FnZShEZXBsb3ltZW50RXJyb3JNc2dzLlNFUlZJQ0VfTkFNRV9FUlJPUikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBTdHJpbmcgc2VydmljZU5hbWUgPSBzZXJ2aWNlTmFtZWF0dC5nZXRBdHRyaWJ1dGVWYWx1ZSgpOwotCi0gICAgICAgICAgICAgICAgaWYgKHNlcnZpY2VOYW1lID09IG51bGwgfHwgIiIuZXF1YWxzKHNlcnZpY2VOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRNZXNzYWdlKERlcGxveW1lbnRFcnJvck1zZ3MuU0VSVklDRV9OQU1FX0VSUk9SKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UgPSAoQXhpc1NlcnZpY2UpIHdzZGxTZXJ2aWNlcy5nZXQoc2VydmljZU5hbWUpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChheGlzU2VydmljZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBheGlzU2VydmljZSA9IG5ldyBBeGlzU2VydmljZShzZXJ2aWNlTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBheGlzU2VydmljZS5zZXRXc2RsRm91bmQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBheGlzU2VydmljZS5zZXRDdXN0b21Xc2RsKHRydWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHNlcnZpY2UgdGhhdCBoYXMgdG8gYmUgZGVwbG95ZWQKLSAgICAgICAgICAgICAgICAgICAgYXhpc1NlcnZpY2Uuc2V0UGFyZW50KGF4aXNTZXJ2aWNlR3JvdXApOwotICAgICAgICAgICAgICAgICAgICBheGlzU2VydmljZS5zZXRDbGFzc0xvYWRlcihheGlzU2VydmljZUdyb3VwLmdldFNlcnZpY2VHcm91cENsYXNzTG9hZGVyKCkpOwotCi0gICAgICAgICAgICAgICAgICAgIFNlcnZpY2VCdWlsZGVyIHNlcnZpY2VCdWlsZGVyID0gbmV3IFNlcnZpY2VCdWlsZGVyKGNvbmZpZ0N0eCwgYXhpc1NlcnZpY2UpOwotICAgICAgICAgICAgICAgICAgICBBeGlzU2VydmljZSBhcyA9IHNlcnZpY2VCdWlsZGVyLnBvcHVsYXRlU2VydmljZShzZXJ2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgc2VydmljZUxpc3QuYWRkKGFzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzZXJ2aWNlTGlzdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBsaXN0IG9mIG1vZHVsZXMgdGhhdCBpcyByZXF1aXJlZCB0byBiZSBlbmdhZ2VkIGdsb2JhbGx5LgotICAgICAqCi0gICAgICogQHBhcmFtIG1vZHVsZVJlZnMgPGNvZGU+amF2YS51dGlsLkl0ZXJhdG9yPC9jb2RlPgotICAgICAqIEB0aHJvd3MgRGVwbG95bWVudEV4Y2VwdGlvbiA8Y29kZT5EZXBsb3ltZW50RXhjZXB0aW9uPC9jb2RlPgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NNb2R1bGVSZWZzKEl0ZXJhdG9yIG1vZHVsZVJlZnMsIEF4aXNTZXJ2aWNlR3JvdXAgYXhpc1NlcnZpY2VHcm91cCkKLSAgICAgICAgICAgIHRocm93cyBEZXBsb3ltZW50RXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHdoaWxlIChtb2R1bGVSZWZzLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIE9NRWxlbWVudCBtb2R1bGVyZWYgPSAoT01FbGVtZW50KSBtb2R1bGVSZWZzLm5leHQoKTsKLSAgICAgICAgICAgICAgICBPTUF0dHJpYnV0ZSBtb2R1bGVSZWZBdHRyaWJ1dGUgPSBtb2R1bGVyZWYuZ2V0QXR0cmlidXRlKG5ldyBRTmFtZShUQUdfUkVGRVJFTkNFKSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAobW9kdWxlUmVmQXR0cmlidXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlZk5hbWUgPSBtb2R1bGVSZWZBdHRyaWJ1dGUuZ2V0QXR0cmlidXRlVmFsdWUoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoYXhpc0NvbmZpZy5nZXRNb2R1bGUocmVmTmFtZSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoRGVwbG95bWVudEVycm9yTXNncy5NT0RVTEVfTk9UX0ZPVU5ELCByZWZOYW1lKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBheGlzU2VydmljZUdyb3VwLmFkZE1vZHVsZXJlZihyZWZOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGF4aXNGYXVsdCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oYXhpc0ZhdWx0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NTZXJ2aWNlTW9kdWxlQ29uZmlnKEl0ZXJhdG9yIG1vZHVsZUNvbmZpZ3MsIFBhcmFtZXRlckluY2x1ZGUgcGFyZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF4aXNTZXJ2aWNlR3JvdXAgYXhpc1NlcnZpY2UpCi0gICAgICAgICAgICB0aHJvd3MgRGVwbG95bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIHdoaWxlIChtb2R1bGVDb25maWdzLmhhc05leHQoKSkgewotICAgICAgICAgICAgT01FbGVtZW50IG1vZHVsZUNvbmZpZyA9IChPTUVsZW1lbnQpIG1vZHVsZUNvbmZpZ3MubmV4dCgpOwotICAgICAgICAgICAgT01BdHRyaWJ1dGUgbW9kdWxlTmFtZV9hdHQgPSBtb2R1bGVDb25maWcuZ2V0QXR0cmlidXRlKG5ldyBRTmFtZShBVFRSSUJVVEVfTkFNRSkpOwotCi0gICAgICAgICAgICBpZiAobW9kdWxlTmFtZV9hdHQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZ2V0TWVzc2FnZShEZXBsb3ltZW50RXJyb3JNc2dzLklOVkFMSURfTU9EVUxFX0NPTkZJRykpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbW9kdWxlID0gbW9kdWxlTmFtZV9hdHQuZ2V0QXR0cmlidXRlVmFsdWUoKTsKLSAgICAgICAgICAgICAgICBNb2R1bGVDb25maWd1cmF0aW9uIG1vZHVsZUNvbmZpZ3VyYXRpb24gPQotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE1vZHVsZUNvbmZpZ3VyYXRpb24obW9kdWxlLCBwYXJlbnQpOwotICAgICAgICAgICAgICAgIEl0ZXJhdG9yIHBhcmFtZXRlcnMgPSBtb2R1bGVDb25maWcuZ2V0Q2hpbGRyZW5XaXRoTmFtZShuZXcgUU5hbWUoVEFHX1BBUkFNRVRFUikpOwotCi0gICAgICAgICAgICAgICAgcHJvY2Vzc1BhcmFtZXRlcnMocGFyYW1ldGVycywgbW9kdWxlQ29uZmlndXJhdGlvbiwgcGFyZW50KTsKLSAgICAgICAgICAgICAgICBheGlzU2VydmljZS5hZGRNb2R1bGVDb25maWcobW9kdWxlQ29uZmlndXJhdGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9UcmFuc3BvcnREZXBsb3llci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvVHJhbnNwb3J0RGVwbG95ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjMwYTFiZC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9UcmFuc3BvcnREZXBsb3llci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LnJlcG9zaXRvcnkudXRpbC5EZXBsb3ltZW50RmlsZURhdGE7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlRyYW5zcG9ydEluRGVzY3JpcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuWE1MVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi1pbXBvcnQgamF2YS5pby5GaWxlOw0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQotDQotcHVibGljIGNsYXNzIFRyYW5zcG9ydERlcGxveWVyIGltcGxlbWVudHMgRGVwbG95ZXIgew0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coVHJhbnNwb3J0RGVwbG95ZXIuY2xhc3MpOw0KLQ0KLSAgICBwcml2YXRlIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0N0eDsNCi0gICAgcHJpdmF0ZSBBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlnOw0KLQ0KLSAgICBwdWJsaWMgdm9pZCBpbml0KENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0N0eCkgew0KLSAgICAgICAgdGhpcy5jb25maWdDdHggPSBjb25maWdDdHg7DQotICAgICAgICBheGlzQ29uZmlnID0gY29uZmlnQ3R4LmdldEF4aXNDb25maWd1cmF0aW9uKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgZGVwbG95KERlcGxveW1lbnRGaWxlRGF0YSBkZXBsb3ltZW50RmlsZURhdGEpIHRocm93cyBEZXBsb3ltZW50RXhjZXB0aW9uIHsNCi0gICAgICAgIGJvb2xlYW4gaXNEaXJlY3RvcnkgPSBkZXBsb3ltZW50RmlsZURhdGEuZ2V0RmlsZSgpLmlzRGlyZWN0b3J5KCk7DQotICAgICAgICBDbGFzc0xvYWRlciBjb250ZXh0Q2xhc3NMb2FkZXIgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBkZXBsb3ltZW50RmlsZURhdGEuc2V0Q2xhc3NMb2FkZXIoaXNEaXJlY3RvcnksDQotICAgICAgICAgICAgICAgICAgICBheGlzQ29uZmlnLmdldE1vZHVsZUNsYXNzTG9hZGVyKCksDQotICAgICAgICAgICAgICAgICAgICAoRmlsZSkgYXhpc0NvbmZpZy5nZXRQYXJhbWV0ZXJWYWx1ZShDb25zdGFudHMuQ29uZmlndXJhdGlvbi5BUlRJRkFDVFNfVEVNUF9ESVIpKTsNCi0NCi0gICAgICAgICAgICBDbGFzc0xvYWRlciBsb2FkZXIgPSBkZXBsb3ltZW50RmlsZURhdGEuZ2V0Q2xhc3NMb2FkZXIoKTsNCi0gICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcihsb2FkZXIpOw0KLSAgICAgICAgICAgIElucHV0U3RyZWFtIHhtbFN0cmVhbSA9IGxvYWRlci5nZXRSZXNvdXJjZUFzU3RyZWFtKCJNRVRBLUlORi90cmFuc3BvcnQueG1sIik7DQotICAgICAgICAgICAgT01FbGVtZW50IGVsZW1lbnQgPSAoT01FbGVtZW50KSBYTUxVdGlscy50b09NKHhtbFN0cmVhbSk7DQotICAgICAgICAgICAgZWxlbWVudC5idWlsZCgpOw0KLSAgICAgICAgICAgIEF4aXNDb25maWdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgQXhpc0NvbmZpZ0J1aWxkZXIoYXhpc0NvbmZpZyk7DQotICAgICAgICAgICAgLy8gUHJvY2Vzc2luZyBUcmFuc3BvcnQgUmVjZWl2ZXJzDQotICAgICAgICAgICAgSXRlcmF0b3IgdHJzX1JlaXZlcnMgPQ0KLSAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5nZXRDaGlsZHJlbldpdGhOYW1lKG5ldyBRTmFtZShEZXBsb3ltZW50Q29uc3RhbnRzLlRBR19UUkFOU1BPUlRfUkVDRUlWRVIpKTsNCi0gICAgICAgICAgICBBcnJheUxpc3QgdHJhbnNwb3J0UmVjZWl2ZXJzID0gYnVpbGRlci5wcm9jZXNzVHJhbnNwb3J0UmVjZWl2ZXJzKHRyc19SZWl2ZXJzKTsNCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRyYW5zcG9ydFJlY2VpdmVycy5zaXplKCk7IGkrKykgew0KLSAgICAgICAgICAgICAgICBUcmFuc3BvcnRJbkRlc2NyaXB0aW9uIHRyYW5zcG9ydEluRGVzY3JpcHRpb24gPSAoVHJhbnNwb3J0SW5EZXNjcmlwdGlvbikgdHJhbnNwb3J0UmVjZWl2ZXJzLmdldChpKTsNCi0gICAgICAgICAgICAgICAgUGFyYW1ldGVyIHBhcmFtdGVyID0gdHJhbnNwb3J0SW5EZXNjcmlwdGlvbi5nZXRQYXJhbWV0ZXIoIkF1dG9TdGFydCIpOw0KLSAgICAgICAgICAgICAgICBpZiAocGFyYW10ZXIgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICAgICAgY29uZmlnQ3R4LmdldExpc3RlbmVyTWFuYWdlcigpLmFkZExpc3RlbmVyKHRyYW5zcG9ydEluRGVzY3JpcHRpb24sIGZhbHNlKTsNCi0gICAgICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJzdGFydGluZyB0aGUgdHJhbnNwb3J0IDogIiArIHRyYW5zcG9ydEluRGVzY3JpcHRpb24uZ2V0TmFtZSgpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAvLyBQcm9jZXNzaW5nIFRyYW5zcG9ydCBTZW5kZXJzDQotICAgICAgICAgICAgSXRlcmF0b3IgdHJzX3NlbmRlcnMgPQ0KLSAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5nZXRDaGlsZHJlbldpdGhOYW1lKG5ldyBRTmFtZShEZXBsb3ltZW50Q29uc3RhbnRzLlRBR19UUkFOU1BPUlRfU0VOREVSKSk7DQotDQotICAgICAgICAgICAgYnVpbGRlci5wcm9jZXNzVHJhbnNwb3J0U2VuZGVycyh0cnNfc2VuZGVycyk7DQotDQotDQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGxvZy5lcnJvcihlLmdldE1lc3NhZ2UoKSk7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyKGNvbnRleHRDbGFzc0xvYWRlcik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RGlyZWN0b3J5KFN0cmluZyBkaXJlY3RvcnkpIHsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRFeHRlbnNpb24oU3RyaW5nIGV4dGVuc2lvbikgew0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHVuRGVwbG95KFN0cmluZyBmaWxlTmFtZSkgdGhyb3dzIERlcGxveW1lbnRFeGNlcHRpb24gew0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L1VSTEJhc2VkQXhpc0NvbmZpZ3VyYXRvci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvVVJMQmFzZWRBeGlzQ29uZmlndXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5ZDI2MTEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvVVJMQmFzZWRBeGlzQ29uZmlndXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5Mb2FkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotcHVibGljIGNsYXNzIFVSTEJhc2VkQXhpc0NvbmZpZ3VyYXRvciBleHRlbmRzIERlcGxveW1lbnRFbmdpbmUgaW1wbGVtZW50cyBBeGlzQ29uZmlndXJhdG9yIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhVUkxCYXNlZEF4aXNDb25maWd1cmF0b3IuY2xhc3MpOwotICAgIHByaXZhdGUgVVJMIGF4aXMyeG1sOwotICAgIHByaXZhdGUgVVJMIHJlcG9zaXRvcnk7Ci0KLSAgICBwdWJsaWMgVVJMQmFzZWRBeGlzQ29uZmlndXJhdG9yKFVSTCBheGlzMnhtbCwgVVJMIHJlcG9zaXRvcnkpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICB0aGlzLmF4aXMyeG1sID0gYXhpczJ4bWw7Ci0gICAgICAgIHRoaXMucmVwb3NpdG9yeSA9IHJlcG9zaXRvcnk7Ci0gICAgfQotCi0gICAgcHVibGljIEF4aXNDb25maWd1cmF0aW9uIGdldEF4aXNDb25maWd1cmF0aW9uKCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIElucHV0U3RyZWFtIGF4aXMyeG1sU3RyZWFtOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKGF4aXMyeG1sID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBheGlzMnhtbFN0cmVhbSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2FkZXIuZ2V0UmVzb3VyY2VBc1N0cmVhbShEZXBsb3ltZW50Q29uc3RhbnRzLkFYSVMyX0NPTkZJR1VSQVRJT05fUkVTT1VSQ0UpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBheGlzMnhtbFN0cmVhbSA9IGF4aXMyeG1sLm9wZW5TdHJlYW0oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGF4aXNDb25maWcgPSBwb3B1bGF0ZUF4aXNDb25maWd1cmF0aW9uKGF4aXMyeG1sU3RyZWFtKTsKLSAgICAgICAgICAgIGlmIChyZXBvc2l0b3J5ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBQYXJhbWV0ZXIgYXhpczJyZXBvUGFyYSA9IGF4aXNDb25maWcuZ2V0UGFyYW1ldGVyKERlcGxveW1lbnRDb25zdGFudHMuQVhJUzJfUkVQTyk7Ci0gICAgICAgICAgICAgICAgaWYgKGF4aXMycmVwb1BhcmEgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmVwb1ZhbHVlID0gKFN0cmluZykgYXhpczJyZXBvUGFyYS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAocmVwb1ZhbHVlICE9IG51bGwgJiYgISIiLmVxdWFscyhyZXBvVmFsdWUudHJpbSgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcG9WYWx1ZS5zdGFydHNXaXRoKCJmaWxlOi8iKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIHRyZWF0IHRoaXMgY2FzZSBzcGVjaWFsbHkgLCBieSBhc3N1bWluZyBmaWxlIGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9jYXRlZCBpbiB0aGUgbG9jYWwgbWFjaGluZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRSZXBvc2l0b3J5KHJlcG9WYWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRSZXBvc2l0b3J5RnJvbVVSTChuZXcgVVJMKHJlcG9WYWx1ZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmluZm8oIk5vIHJlcG9zaXRvcnkgZm91bmQgLCBtb2R1bGUgd2lsbCBiZSBsb2FkZWQgZnJvbSBjbGFzc3BhdGgiKTsKLSAgICAgICAgICAgICAgICAgICAgbG9hZEZyb21DbGFzc1BhdGgoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGxvYWRSZXBvc2l0b3J5RnJvbVVSTChyZXBvc2l0b3J5KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgICAgICBheGlzQ29uZmlnLnNldENvbmZpZ3VyYXRvcih0aGlzKTsKLSAgICAgICAgcmV0dXJuIGF4aXNDb25maWc7Ci0gICAgfQotCi0gICAgLy90byBsb2FkIHNlcnZpY2VzCi0gICAgcHVibGljIHZvaWQgbG9hZFNlcnZpY2VzKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKHJlcG9zaXRvcnkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFBhcmFtZXRlciBheGlzMnJlcG9QYXJhID0gYXhpc0NvbmZpZy5nZXRQYXJhbWV0ZXIoRGVwbG95bWVudENvbnN0YW50cy5BWElTMl9SRVBPKTsKLSAgICAgICAgICAgICAgICBpZiAoYXhpczJyZXBvUGFyYSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyByZXBvVmFsdWUgPSAoU3RyaW5nKSBheGlzMnJlcG9QYXJhLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXBvVmFsdWUgIT0gbnVsbCAmJiAhIiIuZXF1YWxzKHJlcG9WYWx1ZS50cmltKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVwb1ZhbHVlLnN0YXJ0c1dpdGgoImZpbGU6Ly8iKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIHRyZWF0IHRoaXMgY2FzZSBzcGVjaWFsbHkgLCBieSBhc3N1bWluZyBmaWxlIGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9jYXRlIGluIHRoZSBsb2NhbCBtYWNoaW5lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXIubG9hZFNlcnZpY2VzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRTZXJ2aWNlc0Zyb21VcmwobmV3IFVSTChyZXBvVmFsdWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbG9hZFNlcnZpY2VzRnJvbVVybChyZXBvc2l0b3J5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGxvZy5pbmZvKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy9UbyBlbmdhZ2UgZ2xvYmFsbHkgbGlzdGVkIG1vZHVsZXMKLSAgICBwdWJsaWMgdm9pZCBlbmdhZ2VHbG9iYWxNb2R1bGVzKCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIGVuZ2FnZU1vZHVsZXMoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9XYXJCYXNlZEF4aXNDb25maWd1cmF0b3IuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L1dhckJhc2VkQXhpc0NvbmZpZ3VyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmNiNmYwLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L1dhckJhc2VkQXhpc0NvbmZpZ3VyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC5yZXBvc2l0b3J5LnV0aWwuQXJjaGl2ZVJlYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlR3JvdXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5QYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0NvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0NvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkhUVFBDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLkxvYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbmZpZzsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLS8qKgotICogUHJvY2Vzc2VzIHRoZSBpbml0IHBhcmFtZXRlcnMgZm9yIHRoZSBBeGlzU2VydmxldC4KLSAqIFRoaXMgYWxsb3dzIHRoZSBsb2NhdGlvbiBvZiB0aGUgYXhpczIueG1sIGFuZCB0aGUgbW9kdWxlIHJlcG9zaXRvcnkgdG8gYmUgZGlmZmVyZW50IGZyb20gdGhlIGRlZmF1bHQgbG9jYXRpb25zLgotICogVGhlIGluaXQgcGFyYW1ldGVycyBzdXBwb3J0IGFsdGVybmF0ZSBmaWxlLCBvciBVUkwgdmFsdWVzIGZvciBib3RoIG9mIHRoZXNlLgotICovCi1wdWJsaWMgY2xhc3MgV2FyQmFzZWRBeGlzQ29uZmlndXJhdG9yIGV4dGVuZHMgRGVwbG95bWVudEVuZ2luZSBpbXBsZW1lbnRzIEF4aXNDb25maWd1cmF0b3IgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFdhckJhc2VkQXhpc0NvbmZpZ3VyYXRvci5jbGFzcyk7Ci0gICAgcHJpdmF0ZSBTZXJ2bGV0Q29uZmlnIGNvbmZpZzsKLQotICAgIC8qKgotICAgICAqIFRoZSBuYW1lIG9mIHRoZSBpbml0IHBhcmFtZXRlciAoYXhpczIueG1sLnBhdGgpIHRoYXQgY2FuIGJlIHVzZWQgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgbG9jYXRpb24gZm9yIHRoZSBheGlzMi54bWwgZmlsZS4gV2hlbiBib3RoIHRoaXMgaW5pdCBwYXJhbWV0ZXIsIGFuZCB0aGUgYXhpczIueG1sLnVybCBpbml0IHBhcmFtZXRlcnMgYXJlIG5vdCBzcGVjaWZpZWQgaW4gdGhlIGF4aXMgc2VydmxldCBpbml0LXBhcmFtZXRlciwgdGhlIGRlZmF1bHQgbG9jYXRpb24gb2YgJHthcHB9L1dFQi1JTkYvY29uZi9heGlzMi54bWwgaXMgdXNlZC4KLSAgICAgKiBUaGUgdmFsdWUgb2YgdGhpcyBwYXRoIGlzIGludGVycHJldGVkIGFzIGEgZmlsZSBzeXN0ZW0gYWJzb2x1dGUgcGF0aC4KLSAgICAgKiBUaGlzIHBhcmFtZXRlciB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgdGhlIGF4aXMyLnhtbC51cmwgaW5pdCBwYXJhbWV0ZXIuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fQVhJUzJfWE1MX1BBVEggPSAiYXhpczIueG1sLnBhdGgiOwotCi0KLSAgICAvKioKLSAgICAgKiBUaGUgbmFtZSBvZiB0aGUgaW5pdCBwYXJhbWV0ZXIgKGF4aXMyLnhtbC51cmwpIHRoYXQgd2hlbiBzcGVjaWZpZWQgaW5kaWNhdGVzIHRoZSBheGlzMi54bWwgc2hvdWxkIGJlIGxvYWRlZCB1c2luZyB0aGUgVVJMIHNwZWNpZmllZCBhcyB0aGUgdmFsdWUgb2YgdGhpcyBpbml0IHBhcmFtZXRlci4gSWYgdGhlIGF4aXMyLnhtbC5wYXRoIGluaXQgcGFyYW1ldGVyIGlzIHByZXNlbnQsIHRoaXMgaW5pdCBwYXJhbWV0ZXIgaGFzIG5vIGVmZmVjdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9BWElTMl9YTUxfVVJMID0gImF4aXMyLnhtbC51cmwiOwotCi0KLSAgICAvKioKLSAgICAgKiBUaGUgbmFtZSBvZiB0aGUgaW5pdCBwYXJhbWV0ZXIgKGF4aXMyLnJlcG9zaXRvcnkucGF0aCkgdGhhdCB3aGVuIHNwZWNpZmllZCBpbmRpY2F0ZXMgdGhlIHBhdGggdG8gdGhlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fQVhJUzJfUkVQT1NJVE9SWV9QQVRIID0gImF4aXMyLnJlcG9zaXRvcnkucGF0aCI7Ci0KLQotICAgIC8qKgotICAgICAqIFRoZSBuYW1lIG9mIHRoZSBpbml0IHBhcmFtZXRlciAoYXhpczIucmVwb3NpdG9yeS51cmwpIHRoYXQgd2hlbiBzcGVjaWZpZWQgaW5kaWNhdGVzIHRoZSB1cmwgdG8gYmUgdXNlZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX0FYSVMyX1JFUE9TSVRPUllfVVJMID0gImF4aXMyLnJlcG9zaXRvcnkudXJsIjsKLQotCi0gICAgLyoqCi0gICAgICogRGVmYXVsdCBjb25zdHJ1Y3RvciBmb3IgY29uZmlndXJhdG9yLgotICAgICAqIFRoaXMgZGV0ZXJtaW5lcyB0aGUgYXhpczIueG1sIGZpbGUgdG8gYmUgdXNlZCBmcm9tIHRoZSBpbml0IHBhcmFtZXRlcnMgZm9yIHRoZSBBeGlzU2VydmxldCBpbiB0aGUgd2ViLnhtbC4KLSAgICAgKiBUaGUgb3JkZXIgb2YgaW5pdGlhbGl6YXRpb24gaXMgYWNjb3JkaW5nIHRoZSB0aGUgZm9sbG93aW5nIHByZWNlZGVuY2U6Ci0gICAgICogPHVsPgotICAgICAqIDxsaT5JZiB0aGUgcGFyYW1ldGVyIGF4aXMyLnhtbC5wYXRoIGlzIHByZXNlbnQsIHRoZSB2YWx1ZSBpcyB3ZWJhcHAgcmVsYXRpdmUgcGF0aCB0byBiZSB1c2VkIGFzIHRoZSBsb2NhdGlvbiB0byB0aGUgYXhpczIueG1sIGZpbGUuCi0gICAgICogPGxpPk90aGVyd2lzZSwgaWYgdGhlIHBhcmFtZXRlciBheGlzMi54bWwudXJsIGlzIHByZXNlbnQsIHRoZSBVUkwgaXMgdXNlZCBhcyB0aGUgbG9jYXRpb24gdG8gdGhlIGF4aXMyLnhtbCBmaWxlLgotICAgICAqIDxsaT5PdGhlcndpc2UsIHdoZW4gYm90aCBvZiB0aGUgYWJvdmUgaW5pdCBwYXJhbWV0ZXJzIGFyZSBub3QgcHJlc2VudCwgZmlsZSBpcyBhdHRlbXB0ZWQgdG8gYmUgbG9hZGVkIGZyb20gJmx0O3JlcG8mZ3Q7L1dFQi1JTkYvYXhpczIueG1sLgotICAgICAqIDxsaT4gV2hlbiBub25lIG9mIHRoZSBhYm92ZSBjb3VsZCBiZSBmb3VuZCwgdGhlIGF4aXMyLnhtbCBpcyBsb2FkZWQgZnJvbSB0aGUgY2xhc3NwYXRoIHJlc291cmNlLCB0aGUgdmFsdWUgb2YgRGVwbG95bWVuQ29uc3RhbnRzLkFYSVMyX0NPTkZJR1VSQVRJT05fUkVTT1VSQ0UuCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzZXJ2bGV0Q29uZmlnIHRoZSBTZXJ2bGV0Q29uZmlnIG9iamVjdCBmcm9tIHRoZSBBeGlzU2VydmxldC4gVGhpcyBtZXRob2QgaXMgY2FsbGVkIGZyb20gdGhlIGluaXQoKSBvZiB0aGUgQXhpc1NlcnZsZXQuCi0gICAgICovCi0gICAgcHVibGljIFdhckJhc2VkQXhpc0NvbmZpZ3VyYXRvcihTZXJ2bGV0Q29uZmlnIHNlcnZsZXRDb25maWcpIHRocm93cyBEZXBsb3ltZW50RXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHRoaXMuY29uZmlnID0gc2VydmxldENvbmZpZzsKLSAgICAgICAgICAgIElucHV0U3RyZWFtIGF4aXMyU3RyZWFtID0gbnVsbDsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgLy8gd2hlbiB0aGUgbW9kdWxlIGlzIGFuIHVucGFja2VkIHdhciBmaWxlLAotICAgICAgICAgICAgICAgIC8vIHdlIGNhbiBzZXQgdGhlIHdlYiBsb2NhdGlvbiBwYXRoIGluIHRoZSBkZXBsb3ltZW50IGVuZ2luZS4KLSAgICAgICAgICAgICAgICAvLyBUaGlzIHdpbGwgbGV0IHVzCi0gICAgICAgICAgICAgICAgU3RyaW5nIHdlYnBhdGggPSBjb25maWcuZ2V0U2VydmxldENvbnRleHQoKS5nZXRSZWFsUGF0aCgiIik7Ci0gICAgICAgICAgICAgICAgaWYgKHdlYnBhdGggPT0gbnVsbCB8fCB3ZWJwYXRoLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgd2VicGF0aCA9IGNvbmZpZy5nZXRTZXJ2bGV0Q29udGV4dCgpLmdldFJlYWxQYXRoKCIvIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICh3ZWJwYXRoICE9IG51bGwgJiYgISIiLmVxdWFscyh3ZWJwYXRoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoInNldHRpbmcgd2ViIGxvY2F0aW9uIHN0cmluZzogIiArIHdlYnBhdGgpOwotICAgICAgICAgICAgICAgICAgICBGaWxlIHdlYmxvY2F0aW9uID0gbmV3IEZpbGUod2VicGF0aCk7Ci0gICAgICAgICAgICAgICAgICAgIHNldFdlYkxvY2F0aW9uU3RyaW5nKHdlYmxvY2F0aW9uLmdldEFic29sdXRlUGF0aCgpKTsKLSAgICAgICAgICAgICAgICB9IC8vIGlmIHdlYnBhdGggbm90IG51bGwKLQotICAgICAgICAgICAgICAgIFN0cmluZyBheGlzMnhtbHBhdGggPSBjb25maWcuZ2V0SW5pdFBhcmFtZXRlcihQQVJBTV9BWElTMl9YTUxfUEFUSCk7Ci0gICAgICAgICAgICAgICAgaWYgKGF4aXMyeG1scGF0aCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHdoZW4gaW5pdCBwYXJhbWV0ZXIgd2FzIHByZXNlbnQuCi0gICAgICAgICAgICAgICAgICAgIGF4aXMyU3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShheGlzMnhtbHBhdGgpOwotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoInVzaW5nIGF4aXMyLnhtbCBmcm9tIHBhdGg6ICIgKyBheGlzMnhtbHBhdGgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChheGlzMlN0cmVhbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBheGlzdXJsID0gY29uZmlnLmdldEluaXRQYXJhbWV0ZXIoUEFSQU1fQVhJUzJfWE1MX1VSTCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChheGlzdXJsICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMyU3RyZWFtID0gbmV3IFVSTChheGlzdXJsKS5vcGVuU3RyZWFtKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBheGlzQ29uZmlnID0gcG9wdWxhdGVBeGlzQ29uZmlndXJhdGlvbihheGlzMlN0cmVhbSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoImxvYWRpbmcgYXhpczIueG1sIGZyb20gVVJMOiAiICsgYXhpc3VybCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoYXhpczJTdHJlYW0gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAvLyBib3RoIHRoZSBheGlzMi54bWwucGF0aCBhbmQgYXhpczIueG1sLnVybCBpbml0IHBhcmFtZXRlcnMgd2VyZSBub3QgcHJlc2VudAotICAgICAgICAgICAgICAgICAgICAvLyB0cnkgdG8gZmluZCB0aGUgZGVmYXVsdCAvV0VCLUlORi9jb25mL2F4aXMyLnhtbAotICAgICAgICAgICAgICAgICAgICBheGlzMlN0cmVhbSA9IGNvbmZpZy5nZXRTZXJ2bGV0Q29udGV4dCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFJlc291cmNlQXNTdHJlYW0oIi9XRUItSU5GL2NvbmYvYXhpczIueG1sIik7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygidHJ5aW5nIHRvIGxvYWQgYXhpczIueG1sIGZyb20gbW9kdWxlOiAvV0VCLUlORi9jb25mL2F4aXMyLnhtbCIpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChheGlzMlN0cmVhbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFNpbXBsZSBkZXBsb3ltZW50LCBubyBuZWVkIGZvciBjb25mIGRpcmVjdG9yeSBlaXRoZXIKLSAgICAgICAgICAgICAgICAgICAgYXhpczJTdHJlYW0gPSBjb25maWcuZ2V0U2VydmxldENvbnRleHQoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRSZXNvdXJjZUFzU3RyZWFtKCIvV0VCLUlORi9heGlzMi54bWwiKTsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJ0cnlpbmcgdG8gbG9hZCBheGlzMi54bWwgZnJvbSBtb2R1bGU6IC9XRUItSU5GL2NvbmYvYXhpczIueG1sIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSAvLyB0cnkKLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGxvZy5lcnJvcihlLCBlKTsKLSAgICAgICAgICAgICAgICBsb2cud2FybigiVXNpbmcgZGVmYXVsdCBjb25maWd1cmF0aW9uOiAiICsgRGVwbG95bWVudENvbnN0YW50cwotICAgICAgICAgICAgICAgICAgICAgICAgLkFYSVMyX0NPTkZJR1VSQVRJT05fUkVTT1VSQ0UpOwotICAgICAgICAgICAgICAgIC8vIG5vdCB0aGVyZSwgdXNlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBmcm9tIGNsYXNzIHBhdGggcmVzb3VyY2UuCi0gICAgICAgICAgICB9IC8vIGNhdGNoCi0KLSAgICAgICAgICAgIGlmIChheGlzMlN0cmVhbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmluZm8oIkNvdWxkIG5vdCBmaW5kIGF4aXMyLnhtbCwgbG9hZGluZyBkZWZhdWx0ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgRGVwbG95bWVudENvbnN0YW50cy5BWElTMl9DT05GSUdVUkFUSU9OX1JFU09VUkNFICsgIiBmcm9tIGNsYXNzcGF0aCIpOwotICAgICAgICAgICAgICAgIGF4aXMyU3RyZWFtID0KLSAgICAgICAgICAgICAgICAgICAgICAgIExvYWRlci5nZXRSZXNvdXJjZUFzU3RyZWFtKERlcGxveW1lbnRDb25zdGFudHMuQVhJUzJfQ09ORklHVVJBVElPTl9SRVNPVVJDRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBheGlzQ29uZmlnID0gcG9wdWxhdGVBeGlzQ29uZmlndXJhdGlvbihheGlzMlN0cmVhbSk7Ci0KLSAgICAgICAgICAgIGlmKGF4aXMyU3RyZWFtICE9IG51bGwpewotICAgICAgICAgICAgICAgIGF4aXMyU3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBQYXJhbWV0ZXIgcGFyYW0gPSBuZXcgUGFyYW1ldGVyKCk7Ci0gICAgICAgICAgICBwYXJhbS5zZXROYW1lKENvbnN0YW50cy5Db25maWd1cmF0aW9uLkFSVElGQUNUU19URU1QX0RJUik7Ci0gICAgICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZSgoRmlsZSkgY29uZmlnLmdldFNlcnZsZXRDb250ZXh0KCkuZ2V0QXR0cmlidXRlKCJqYXZheC5zZXJ2bGV0LmNvbnRleHQudGVtcGRpciIpLCAiX2F4aXMyIik7Ci0gICAgICAgICAgICBpZiAoZi5leGlzdHMoKSB8fCBmLm1rZGlycygpKSB7Ci0gICAgICAgICAgICAgICAgcGFyYW0uc2V0VmFsdWUoZik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGYgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaW8udG1wZGlyIiksICJfYXhpczIiKTsKLSAgICAgICAgICAgICAgICBpZiAoZi5leGlzdHMoKSB8fCBmLm1rZGlycygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmFtLnNldFZhbHVlKGYpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKCJVbmFibGUgdG8gY3JlYXRlIGEgdGVtcG9yYXJ5IHdvcmtpbmcgZGlyZWN0b3J5Iik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBheGlzQ29uZmlnLmFkZFBhcmFtZXRlcihwYXJhbSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgYXhpc0ZhdWx0KSB7Ci0gICAgICAgICAgICAgICAgbG9nLmVycm9yKGF4aXNGYXVsdC5nZXRNZXNzYWdlKCksIGF4aXNGYXVsdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKERlcGxveW1lbnRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbG9nLmVycm9yKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGxvZy5lcnJvcihlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGF4aXMgY29uZmlndXJhdGlvbiBvYmplY3QgYnkgbG9hZGluZyB0aGUgcmVwb3NpdG9yeS4KLSAgICAgKiBUaGUgb3JkZXIgb2YgaW5pdGlhbGl6YXRpb24gaXMgYWNjb3JkaW5nIHRoZSB0aGUgZm9sbG93aW5nIHByZWNlZGVuY2U6Ci0gICAgICogPHVsPgotICAgICAqIDxsaT5JZiB0aGUgcGFyYW1ldGVyIGF4aXMyLnJlcG9zaXRvcnkucGF0aCBpcyBwcmVzZW50LCB0aGlzIGZvbGRlciBpcyB1c2VkIGFzIHRoZSBsb2NhdGlvbiB0byB0aGUgcmVwb3NpdG9yeS4KLSAgICAgKiA8bGk+T3RoZXJ3aXNlLCBpZiB0aGUgcGFyYW1ldGVyIGF4aXMyLnJlcG9zaXRvcnkudXJsIGlzIHByZXNlbnQsIHRoZSBVUkwgaXMgdXNlZCBhcyB0aGUgbG9jYXRpb24gdG8gdGhlIHJlcG9zaXRvcnkuCi0gICAgICogPGxpPk90aGVyd2lzZSwgd2hlbiBib3RoIG9mIHRoZSBhYm92ZSBpbml0IHBhcmFtZXRlcnMgYXJlIG5vdCBwcmVzZW50LCB0aGUgd2ViIGFwcGxpY2F0aW9ucyBXRUItSU5GIGZvbGRlciBpcyB1c2VkIGFzIHRoZSBmb2xkZXIgZm9yIHRoZSByZXBvc2l0b3J5LgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBpbnN0YW5jZSBvZiB0aGUgQXhpc0NvbmZpZ3VyYXRpb24gb2JqZWN0IHRoYXQgcmVmbGVjdHMgdGhlIHJlcG9zaXRvcnkgYWNjb3JkaW5nIHRvIHRoZSBydWxlcyBhYm92ZS4KLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdCB3aGVuIGFuIGVycm9yIG9jY3VycmVkIGluIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgQXhpc0NvbmZpZ3VyYXRpb24uCi0gICAgICovCi0gICAgcHVibGljIEF4aXNDb25maWd1cmF0aW9uIGdldEF4aXNDb25maWd1cmF0aW9uKCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTdHJpbmcgcmVwb3NpdG9yeSA9IGNvbmZpZy5nZXRJbml0UGFyYW1ldGVyKFBBUkFNX0FYSVMyX1JFUE9TSVRPUllfUEFUSCk7Ci0gICAgICAgICAgICBpZiAocmVwb3NpdG9yeSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbG9hZFJlcG9zaXRvcnkocmVwb3NpdG9yeSk7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJsb2FkZWQgcmVwb3NpdG9yeSBmcm9tIHBhdGg6ICIgKyByZXBvc2l0b3J5KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHJlcG9zaXRvcnkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJlcG9zaXRvcnkgPSBjb25maWcuZ2V0SW5pdFBhcmFtZXRlcihQQVJBTV9BWElTMl9SRVBPU0lUT1JZX1VSTCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlcG9zaXRvcnkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBsb2FkUmVwb3NpdG9yeUZyb21VUkwobmV3IFVSTChyZXBvc2l0b3J5KSk7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygibG9hZGVkIHJlcG9zaXRvcnkgZnJvbSB1cmw6ICIgKyByZXBvc2l0b3J5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChyZXBvc2l0b3J5ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoY29uZmlnLmdldFNlcnZsZXRDb250ZXh0KCkuZ2V0UmVhbFBhdGgoIiIpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBhbiB1bnBhY2tlZCB3YXIgZmlsZQotICAgICAgICAgICAgICAgICAgICByZXBvc2l0b3J5ID0gY29uZmlnLmdldFNlcnZsZXRDb250ZXh0KCkuZ2V0UmVhbFBhdGgoIi9XRUItSU5GIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChyZXBvc2l0b3J5ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5nZXRTZXJ2bGV0Q29udGV4dCgpLmdldFJlYWxQYXRoKCIvIikgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBhbiB1bnBhY2tlZCB3YXIgZmlsZQotICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3NpdG9yeSA9IGNvbmZpZy5nZXRTZXJ2bGV0Q29udGV4dCgpLmdldFJlYWxQYXRoKCIvV0VCLUlORiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChyZXBvc2l0b3J5ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9hZFJlcG9zaXRvcnkocmVwb3NpdG9yeSk7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygibG9hZGVkIHJlcG9zaXRvcnkgZnJvbSAvV0VCLUlORiBmb2xkZXIgKHVucGFja2VkIHdhcikiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChyZXBvc2l0b3J5ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBVUkwgdXJsID0gY29uZmlnLmdldFNlcnZsZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2UoIi9XRUItSU5GLyIpOwotICAgICAgICAgICAgICAgIGlmICh1cmwgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXBvc2l0b3J5ID0gdXJsLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgIGxvYWRSZXBvc2l0b3J5RnJvbVVSTCh1cmwpOwotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoImxvYWRlZCByZXBvc2l0b3J5IGZyb20gL1dFQi1JTkYvIGZvbGRlciAoVVJMKSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHJlcG9zaXRvcnkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGxvYWRGcm9tQ2xhc3NQYXRoKCk7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJsb2FkZWQgcmVwb3NpdG9yeSBmcm9tIGNsYXNzcGF0aCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgbG9nLmVycm9yKGV4ICsgIjogbG9hZGluZyByZXBvc2l0b3J5IGZyb20gY2xhc3NwYXRoIiwgZXgpOwotICAgICAgICAgICAgbG9hZEZyb21DbGFzc1BhdGgoKTsKLSAgICAgICAgfQotICAgICAgICBheGlzQ29uZmlnLnNldENvbmZpZ3VyYXRvcih0aGlzKTsKLSAgICAgICAgcmV0dXJuIGF4aXNDb25maWc7Ci0gICAgfQotCi0gICAgLy90byBsb2FkIHNlcnZpY2VzCi0KLSAgICAvKioKLSAgICAgKiBMb2FkcyB0aGUgc2VydmljZXMgd2l0aGluIHRoZSByZXBvc2l0b3J5LgotICAgICAqIFdoZW4gdGhlIGF4aXMyLnJlcG9zaXRvcnkucGF0aCBpbml0IHBhcmFtZXRlciB3YXMgcHJlc2VudCwgd2UganVzdCBjYWxsIGxvYWRTZXJ2aWNlcygpIGluIHRoZSBkZXBsb3ltZW50IGVuZ2luZS48YnIvPgotICAgICAqIFdoZW4gdGhlIGF4aXMyLnJlcG9zaXRvcnkudXJsIGluaXQgcGFyYW1ldGVyIHdhcyBwcmVzZW50IHdlIGxvYWQgc2VydmljZXMgZnJvbSB0aGUgcmVzcGVjdGl2ZSBVUkwgdmFsdWUgb2YgdGhlIGluaXQgcGFyYW1ldGVyLjxici8+Ci0gICAgICogT3RoZXJ3aXNlLCB0cnkgdG8gbG9hZCB0aGUgc2VydmljZXMgZnJvbSB0aGUgL1dFQi1JTkYgZm9sZGVyIHdpdGhpbiB0aGUgd2ViIGFwcGxpY2F0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGxvYWRTZXJ2aWNlcygpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFN0cmluZyByZXBvc2l0b3J5OwotCi0gICAgICAgICAgICByZXBvc2l0b3J5ID0gY29uZmlnLmdldEluaXRQYXJhbWV0ZXIoUEFSQU1fQVhJUzJfUkVQT1NJVE9SWV9QQVRIKTsKLSAgICAgICAgICAgIGlmIChyZXBvc2l0b3J5ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzdXBlci5sb2FkU2VydmljZXMoKTsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoImxvYWRlZCBzZXJ2aWNlcyBmcm9tIHBhdGg6ICIgKyByZXBvc2l0b3J5KTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJlcG9zaXRvcnkgPSBjb25maWcuZ2V0SW5pdFBhcmFtZXRlcihQQVJBTV9BWElTMl9SRVBPU0lUT1JZX1VSTCk7Ci0gICAgICAgICAgICBpZiAocmVwb3NpdG9yeSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbG9hZFNlcnZpY2VzRnJvbVVybChuZXcgVVJMKHJlcG9zaXRvcnkpKTsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoImxvYWRlZCBzZXJ2aWNlcyBmcm9tIFVSTDogIiArIHJlcG9zaXRvcnkpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGxvYWRTZXJ2aWNlc0Zyb21XZWJJbmYoKTsKLSAgICAgICAgICAgIGlmIChjb25maWcuZ2V0U2VydmxldENvbnRleHQoKS5nZXRSZWFsUGF0aCgiIikgIT0gbnVsbCB8fCAKLSAgICAgICAgICAgICAgICAgICAgY29uZmlnLmdldFNlcnZsZXRDb250ZXh0KCkuZ2V0UmVhbFBhdGgoIi8iKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc3VwZXIubG9hZFNlcnZpY2VzKCk7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJsb2FkZWQgc2VydmljZXMgZnJvbSB3ZWJhcHAiKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFVSTCB1cmwgPSBjb25maWcuZ2V0U2VydmxldENvbnRleHQoKS5nZXRSZXNvdXJjZSgiL1dFQi1JTkYvIik7Ci0gICAgICAgICAgICBpZiAodXJsICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBsb2FkU2VydmljZXNGcm9tVXJsKHVybCk7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJsb2FkZWQgc2VydmljZXMgZnJvbSAvV0VCLUlORi8gZm9sZGVyIChVUkwpIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBsb2cuaW5mbyhlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvL1RvIGVuZ2FnZSBnbG9iYWxseSBsaXN0ZWQgbW9kdWxlcwotICAgIHB1YmxpYyB2b2lkIGVuZ2FnZUdsb2JhbE1vZHVsZXMoKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgZW5nYWdlTW9kdWxlcygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgbG9vayBpbnNpZGUgdGhlIHdlYi1pbmYgZGlyZWN0b3J5IHRvIGZpbmQgc2VydmljZXMueG1sCi0gICAgICogaW5zaWRlIHRoYXQgLCBpZiBpdCBpcyB0aGVyZSB3aWxsIGxvYWQgdGhhdCBhbmQgY3JlYXQgc2VydmljZSBncm91cCBvdXQKLSAgICAgKiBvZiB0aGF0IGFuZCBhZGQgaW50byBheGlzQ29uZmlnLiBVc2VyIGNhbiBkcm9wIGNvcnJlc3BvbmRpbmcgY2xhc3MgZmlsZXMKLSAgICAgKiBpbnRvIGNsYXNzIGRpcmVjdG9yeS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgbG9hZFNlcnZpY2VzRnJvbVdlYkluZigpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIElucHV0U3RyZWFtIHNlcnZpY2V4bWwgPSBjb25maWcuZ2V0U2VydmxldENvbnRleHQoKS4KLSAgICAgICAgICAgICAgICAgICAgZ2V0UmVzb3VyY2VBc1N0cmVhbSgiL1dFQi1JTkYvc2VydmljZXMueG1sIik7Ci0gICAgICAgICAgICBpZiAoc2VydmljZXhtbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgSGFzaE1hcCB3c2RsU2VydmljZXMgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICAgICAgICAgIEFyY2hpdmVSZWFkZXIgYXJjaGl2ZVJlYWRlciA9IG5ldyBBcmNoaXZlUmVhZGVyKCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBjb25maWcuZ2V0U2VydmxldENvbnRleHQoKS5nZXRSZWFsUGF0aCgiL1dFQi1JTkYiKTsKLSAgICAgICAgICAgICAgICBpZiAocGF0aCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFyY2hpdmVSZWFkZXIucHJvY2Vzc0ZpbGVzSW5Gb2xkZXIobmV3IEZpbGUocGF0aCksIHdzZGxTZXJ2aWNlcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEF4aXNTZXJ2aWNlR3JvdXAgc2VydmljZUdyb3VwID0gRGVwbG95bWVudEVuZ2luZS5idWlsZFNlcnZpY2VHcm91cChzZXJ2aWNleG1sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYW5ub25TZXJ2aWNlR3JvdXAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWdDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmNoaXZlUmVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c2RsU2VydmljZXMpOwotICAgICAgICAgICAgICAgIGF4aXNDb25maWcuYWRkU2VydmljZUdyb3VwKHNlcnZpY2VHcm91cCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBheGlzRmF1bHQpIHsKLSAgICAgICAgICAgIGxvZy5pbmZvKGF4aXNGYXVsdCk7Ci0gICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBsb2cuaW5mbyhlKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGxvZy5pbmZvKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q29uZmlnQ29udGV4dChDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0KSB7Ci0gICAgICAgIC8vIHNldHRpbmcgU2VydmxldENvbnRleHQgaW50byBjb25maWdjdHgKLSAgICAgICAgY29uZmlnQ29udGV4dC5zZXRQcm9wZXJ0eShIVFRQQ29uc3RhbnRzLk1DX0hUVFBfU0VSVkxFVENPTlRFWFQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLmdldFNlcnZsZXRDb250ZXh0KCkpOwotICAgICAgICBQYXJhbWV0ZXIgc2VydmxldENvbmZpZ1BhcmFtID0gbmV3IFBhcmFtZXRlcigpOwotICAgICAgICBzZXJ2bGV0Q29uZmlnUGFyYW0uc2V0TmFtZShIVFRQQ29uc3RhbnRzLkhUVFBfU0VSVkxFVENPTkZJRyk7Ci0gICAgICAgIHNlcnZsZXRDb25maWdQYXJhbS5zZXRWYWx1ZShjb25maWcpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY29uZmlnQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpLmFkZFBhcmFtZXRlcihzZXJ2bGV0Q29uZmlnUGFyYW0pOwotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgYXhpc0ZhdWx0KSB7Ci0gICAgICAgICAgICBsb2cuZXJyb3IoYXhpc0ZhdWx0LmdldE1lc3NhZ2UoKSwgYXhpc0ZhdWx0KTsKLSAgICAgICAgfQotICAgICAgICBzdXBlci5zZXRDb25maWdDb250ZXh0KGNvbmZpZ0NvbnRleHQpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L2F4aXMyX2RlZmF1bHQueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvYXhpczJfZGVmYXVsdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmYmQzY2MuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvYXhpczJfZGVmYXVsdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNzggKzAsMCBAQAotPCEtLQotICB+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+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvcmVwb3NpdG9yeS91dGlsL0FyY2hpdmVSZWFkZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L3JlcG9zaXRvcnkvdXRpbC9BcmNoaXZlUmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5MmMxOGQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvcmVwb3NpdG9yeS91dGlsL0FyY2hpdmVSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LnJlcG9zaXRvcnkudXRpbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01OYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC5EZXBsb3ltZW50Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC5EZXBsb3ltZW50RXJyb3JNc2dzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC5EZXBsb3ltZW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC5EZXNjcmlwdGlvbkJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50Lk1vZHVsZUJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LlNlcnZpY2VCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC5TZXJ2aWNlR3JvdXBCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC5yZXNvbHZlci5BQVJCYXNlZFdTRExMb2NhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC5yZXNvbHZlci5BQVJGaWxlQmFzZWRVUklSZXNvbHZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQucmVzb2x2ZXIuV2FyQmFzZWRXU0RMTG9jYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQucmVzb2x2ZXIuV2FyRmlsZUJhc2VkVVJJUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzTW9kdWxlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZUdyb3VwOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uV1NETDExVG9BbGxBeGlzU2VydmljZXNCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uV1NETDExVG9BeGlzU2VydmljZUJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5XU0RMMjBUb0FsbEF4aXNTZXJ2aWNlc0J1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5XU0RMMkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLldTRExUb0F4aXNTZXJ2aWNlQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmkxOG4uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5uYW1lc3BhY2UuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5YTUxVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBJbnB1dFN0cmVhbTsKLQotcHVibGljIGNsYXNzIEFyY2hpdmVSZWFkZXIgaW1wbGVtZW50cyBEZXBsb3ltZW50Q29uc3RhbnRzIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coQXJjaGl2ZVJlYWRlci5jbGFzcyk7Ci0KLSAgICBwdWJsaWMgQXJyYXlMaXN0PEF4aXNTZXJ2aWNlPiBidWlsZFNlcnZpY2VHcm91cChJbnB1dFN0cmVhbSB6aW4sIERlcGxveW1lbnRGaWxlRGF0YSBjdXJyZW50RmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF4aXNTZXJ2aWNlR3JvdXAgYXhpc1NlcnZpY2VHcm91cCwgSGFzaE1hcDxTdHJpbmcsIEF4aXNTZXJ2aWNlPiB3c2RsU2VydmljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDdHgpCi0gICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uLCBBeGlzRmF1bHQgewotCi0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlciBidWlsZGVyID0gbmV3IERlc2NyaXB0aW9uQnVpbGRlcih6aW4sIGNvbmZpZ0N0eCk7Ci0gICAgICAgIE9NRWxlbWVudCByb290RWxlbWVudCA9IGJ1aWxkZXIuYnVpbGRPTSgpOwotICAgICAgICBTdHJpbmcgZWxlbWVudE5hbWUgPSByb290RWxlbWVudC5nZXRMb2NhbE5hbWUoKTsKLQotICAgICAgICBpZiAoVEFHX1NFUlZJQ0UuZXF1YWxzKGVsZW1lbnROYW1lKSkgewotICAgICAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UgPSBudWxsOwotICAgICAgICAgICAgU3RyaW5nIHNlcnZpY2VOYW1lID0gRGVzY3JpcHRpb25CdWlsZGVyLmdldFNob3J0RmlsZU5hbWUoY3VycmVudEZpbGUuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIGlmIChzZXJ2aWNlTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYXhpc1NlcnZpY2UgPSAoQXhpc1NlcnZpY2UpIHdzZGxTZXJ2aWNlcy5nZXQoc2VydmljZU5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGF4aXNTZXJ2aWNlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBheGlzU2VydmljZSA9IChBeGlzU2VydmljZSkgd3NkbFNlcnZpY2VzLmdldCgKLSAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uQnVpbGRlci5nZXRTaG9ydEZpbGVOYW1lKGN1cnJlbnRGaWxlLmdldE5hbWUoKSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGF4aXNTZXJ2aWNlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBheGlzU2VydmljZSA9IG5ldyBBeGlzU2VydmljZShzZXJ2aWNlTmFtZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlLnNldFdzZGxGb3VuZCh0cnVlKTsKLSAgICAgICAgICAgICAgICBheGlzU2VydmljZS5zZXRDdXN0b21Xc2RsKHRydWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBheGlzU2VydmljZS5zZXRQYXJlbnQoYXhpc1NlcnZpY2VHcm91cCk7Ci0gICAgICAgICAgICBheGlzU2VydmljZS5zZXRDbGFzc0xvYWRlcihjdXJyZW50RmlsZS5nZXRDbGFzc0xvYWRlcigpKTsKLQotICAgICAgICAgICAgU2VydmljZUJ1aWxkZXIgc2VydmljZUJ1aWxkZXIgPSBuZXcgU2VydmljZUJ1aWxkZXIoY29uZmlnQ3R4LCBheGlzU2VydmljZSk7Ci0gICAgICAgICAgICBzZXJ2aWNlQnVpbGRlci5zZXRXc2RsU2VydmljZU1hcCh3c2RsU2VydmljZXMpOwotICAgICAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSA9IHNlcnZpY2VCdWlsZGVyLnBvcHVsYXRlU2VydmljZShyb290RWxlbWVudCk7Ci0KLSAgICAgICAgICAgIEFycmF5TGlzdDxBeGlzU2VydmljZT4gc2VydmljZUxpc3QgPSBuZXcgQXJyYXlMaXN0PEF4aXNTZXJ2aWNlPigpOwotICAgICAgICAgICAgc2VydmljZUxpc3QuYWRkKHNlcnZpY2UpOwotICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2VMaXN0OwotICAgICAgICB9IGVsc2UgaWYgKFRBR19TRVJWSUNFX0dST1VQLmVxdWFscyhlbGVtZW50TmFtZSkpIHsKLSAgICAgICAgICAgIFNlcnZpY2VHcm91cEJ1aWxkZXIgZ3JvdXBCdWlsZGVyID0gbmV3IFNlcnZpY2VHcm91cEJ1aWxkZXIocm9vdEVsZW1lbnQsIHdzZGxTZXJ2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnQ3R4KTsKLSAgICAgICAgICAgIHJldHVybiBncm91cEJ1aWxkZXIucG9wdWxhdGVTZXJ2aWNlR3JvdXAoYXhpc1NlcnZpY2VHcm91cCk7Ci0gICAgICAgIH0KLSAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiSW52YWxpZCBzZXJ2aWNlcy54bWwgZm91bmQiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFeHRyYWN0cyBTZXJ2aWNlIFhNTCBmaWxlcyBhbmQgYnVpbGRzIHRoZSBzZXJ2aWNlIGdyb3Vwcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmaWxlbmFtZQotICAgICAqIEBwYXJhbSBheGlzU2VydmljZUdyb3VwCi0gICAgICogQHBhcmFtIGV4dHJhY3RTZXJ2aWNlCi0gICAgICogQHBhcmFtIHdzZGxTZXJ2aWNlcwotICAgICAqIEBwYXJhbSBjb25maWdDdHgKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgQXJyYXlMaXN0LgotICAgICAqIEB0aHJvd3MgRGVwbG95bWVudEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBBcnJheUxpc3Q8QXhpc1NlcnZpY2U+IHByb2Nlc3NTZXJ2aWNlR3JvdXAoU3RyaW5nIGZpbGVuYW1lLCBEZXBsb3ltZW50RmlsZURhdGEgY3VycmVudEZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF4aXNTZXJ2aWNlR3JvdXAgYXhpc1NlcnZpY2VHcm91cCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBleHRyYWN0U2VydmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFzaE1hcDxTdHJpbmcsIEF4aXNTZXJ2aWNlPiB3c2RsU2VydmljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0N0eCkKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICAvLyBnZXQgYXR0cmlidXRlIHZhbHVlcwotICAgICAgICBpZiAoIWV4dHJhY3RTZXJ2aWNlKSB7Ci0gICAgICAgICAgICBaaXBJbnB1dFN0cmVhbSB6aW4gPSBudWxsOwotICAgICAgICAgICAgRmlsZUlucHV0U3RyZWFtIGZpbiA9IG51bGw7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGZpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZW5hbWUpOwotICAgICAgICAgICAgICAgIHppbiA9IG5ldyBaaXBJbnB1dFN0cmVhbShmaW4pOwotICAgICAgICAgICAgICAgIFppcEVudHJ5IGVudHJ5OwotICAgICAgICAgICAgICAgIHdoaWxlICgoZW50cnkgPSB6aW4uZ2V0TmV4dEVudHJ5KCkpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5LmdldE5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKFNFUlZJQ0VTX1hNTCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlR3JvdXAuc2V0U2VydmljZUdyb3VwTmFtZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyLmdldFNob3J0RmlsZU5hbWUoY3VycmVudEZpbGUuZ2V0TmFtZSgpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYnVpbGRTZXJ2aWNlR3JvdXAoemluLCBjdXJyZW50RmlsZSwgYXhpc1NlcnZpY2VHcm91cCwgd3NkbFNlcnZpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ0N0eCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRNZXNzYWdlKERlcGxveW1lbnRFcnJvck1zZ3MuU0VSVklDRV9YTUxfTk9UX0ZPVU5ELCBmaWxlbmFtZSkpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgaWYgKHppbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB6aW4uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmluZm8oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiZXJyb3JpbmlucHV0c3RyZWFtY2xvc2UiKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGZpbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW4uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmluZm8oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiZXJyb3JpbmlucHV0c3RyZWFtY2xvc2UiKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShmaWxlbmFtZSwgU0VSVklDRVNfWE1MKTsKLSAgICAgICAgICAgIGlmICghZmlsZS5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgIC8vIHRyeSBmb3IgbWV0YS1pbmYKLSAgICAgICAgICAgICAgICBmaWxlID0gbmV3IEZpbGUoZmlsZW5hbWUsIFNFUlZJQ0VTX1hNTC50b0xvd2VyQ2FzZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChmaWxlLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gaW4gPSBudWxsOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgYXhpc1NlcnZpY2VHcm91cC5zZXRTZXJ2aWNlR3JvdXBOYW1lKGN1cnJlbnRGaWxlLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBidWlsZFNlcnZpY2VHcm91cChpbiwgY3VycmVudEZpbGUsIGF4aXNTZXJ2aWNlR3JvdXAsIHdzZGxTZXJ2aWNlcywgY29uZmlnQ3R4KTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRNZXNzYWdlKERlcGxveW1lbnRFcnJvck1zZ3MuRklMRV9OT1RfRk9VTkQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmdldE1lc3NhZ2UoKSkpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoRGVwbG95bWVudEVycm9yTXNncy5YTUxfU1RSRUFNX0VYQ0VQVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZ2V0TWVzc2FnZSgpKSk7Ci0gICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGluICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuaW5mbyhNZXNzYWdlcy5nZXRNZXNzYWdlKCJlcnJvcmluaW5wdXRzdHJlYW1jbG9zZSIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRNZXNzYWdlKERlcGxveW1lbnRFcnJvck1zZ3MuU0VSVklDRV9YTUxfTk9UX0ZPVU5EKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdHMgQXhpc1NlcnZpY2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaW4KLSAgICAgKiBAcmV0dXJuIFJldHVybnMgQXhpc1NlcnZpY2UuCi0gICAgICogQHRocm93cyBEZXBsb3ltZW50RXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSBMaXN0PEF4aXNTZXJ2aWNlPiBwcm9jZXNzV1NETEZpbGUoV1NETFRvQXhpc1NlcnZpY2VCdWlsZGVyIGF4aXNTZXJ2aWNlQnVpbGRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUgc2VydmljZUFyY2hpdmVGaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0FyY2hpdmUsIElucHV0U3RyZWFtIGluLCBTdHJpbmcgYmFzZVVSSSkKLSAgICAgICAgICAgIHRocm93cyBEZXBsb3ltZW50RXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLQotICAgICAgICAgICAgaWYgKHNlcnZpY2VBcmNoaXZlRmlsZSAhPSBudWxsICYmIGlzQXJjaGl2ZSkgewotICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlQnVpbGRlci5zZXRDdXN0b21SZXNvbHZlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBQVJGaWxlQmFzZWRVUklSZXNvbHZlcihzZXJ2aWNlQXJjaGl2ZUZpbGUpKTsKLSAgICAgICAgICAgICAgICBpZiAoYXhpc1NlcnZpY2VCdWlsZGVyIGluc3RhbmNlb2YgV1NETDExVG9BbGxBeGlzU2VydmljZXNCdWlsZGVyKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgKChXU0RMMTFUb0FsbEF4aXNTZXJ2aWNlc0J1aWxkZXIpIGF4aXNTZXJ2aWNlQnVpbGRlcikuc2V0Q3VzdG9tV1NETFJlc29sdmVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBQVJCYXNlZFdTRExMb2NhdG9yKGJhc2VVUkksIHNlcnZpY2VBcmNoaXZlRmlsZSwgaW4pKTsKLQotICAgICAgICAgICAgICAgICAgICAoKFdTREwxMVRvQWxsQXhpc1NlcnZpY2VzQnVpbGRlcikgYXhpc1NlcnZpY2VCdWlsZGVyKS5zZXREb2N1bWVudEJhc2VVcmkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZUFyY2hpdmVGaWxlLmdldENhbm9uaWNhbEZpbGUoKS50b1VSSSgpLnRvU3RyaW5nKCkpOwotCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChheGlzU2VydmljZUJ1aWxkZXIgaW5zdGFuY2VvZiBXU0RMMjBUb0FsbEF4aXNTZXJ2aWNlc0J1aWxkZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgKChXU0RMMjBUb0FsbEF4aXNTZXJ2aWNlc0J1aWxkZXIpIGF4aXNTZXJ2aWNlQnVpbGRlcikuc2V0Q3VzdG9tV1NETFJlc29sdmVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBQVJCYXNlZFdTRExMb2NhdG9yKGJhc2VVUkksIHNlcnZpY2VBcmNoaXZlRmlsZSwgaW4pKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gdHJ5aW5nIHRvIHVzZSB0aGUgamFyIHNjaGVtZSBhcyB0aGUgYmFzZSBVUkkuIEkgdGhpbmsgdGhpcyBjYW4gYmUgdXNlZCB0byBoYW5kbGUKLSAgICAgICAgICAgICAgICAgICAgLy8gd3NkbCAxLjEgYXMgd2VsbCB3aXRob3V0IHVzaW5nIGEgY3VzdG9tIFVSSSByZXNvbHZlci4gTmVlZCB0byBsb29rIGF0IGl0IGxhdGVyLgotICAgICAgICAgICAgICAgICAgICBheGlzU2VydmljZUJ1aWxkZXIuc2V0QmFzZVVyaSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiamFyOmZpbGU6Ly8iICsgc2VydmljZUFyY2hpdmVGaWxlLnRvVVJJKCkgKyAiIS8iICsgYmFzZVVSSSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoc2VydmljZUFyY2hpdmVGaWxlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYXhpc1NlcnZpY2VCdWlsZGVyLnNldEJhc2VVcmkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZUFyY2hpdmVGaWxlLmdldFBhcmVudEZpbGUoKS50b1VSSSgpLnRvU3RyaW5nKCkpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChheGlzU2VydmljZUJ1aWxkZXIgaW5zdGFuY2VvZiBXU0RMMTFUb0FsbEF4aXNTZXJ2aWNlc0J1aWxkZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICgoV1NETDExVG9BbGxBeGlzU2VydmljZXNCdWlsZGVyKSBheGlzU2VydmljZUJ1aWxkZXIpLnNldERvY3VtZW50QmFzZVVyaSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZUFyY2hpdmVGaWxlLmdldENhbm9uaWNhbEZpbGUoKS50b1VSSSgpLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGF4aXNTZXJ2aWNlQnVpbGRlciBpbnN0YW5jZW9mIFdTREwxMVRvQWxsQXhpc1NlcnZpY2VzQnVpbGRlcikgewotICAgICAgICAgICAgICAgIHJldHVybiAoKFdTREwxMVRvQWxsQXhpc1NlcnZpY2VzQnVpbGRlcikgYXhpc1NlcnZpY2VCdWlsZGVyKS5wb3B1bGF0ZUFsbFNlcnZpY2VzKCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGF4aXNTZXJ2aWNlQnVpbGRlciBpbnN0YW5jZW9mIFdTREwyMFRvQWxsQXhpc1NlcnZpY2VzQnVpbGRlcikgewotICAgICAgICAgICAgICAgIHJldHVybiAoKFdTREwyMFRvQWxsQXhpc1NlcnZpY2VzQnVpbGRlcikgYXhpc1NlcnZpY2VCdWlsZGVyKS5wb3B1bGF0ZUFsbFNlcnZpY2VzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBheGlzRmF1bHQpIHsKLSAgICAgICAgICAgIGxvZy5pbmZvKCJUcm91YmxlIHByb2Nlc3Npbmcgd3NkbCBmaWxlIDoiICsgYXhpc0ZhdWx0LmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoYXhpc0ZhdWx0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9leCkgewotICAgICAgICAgICAgbG9nLmluZm8oIlRyb3VibGUgcHJvY2Vzc2luZyB3c2RsIGZpbGUgOiIgKyBpb2V4LmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoaW9leCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBzZXJ2aWNlIG9iamVjdHMgZnJvbSB3c2RsIGZpbGUgaW5zaWRlIGEgc2VydmljZSBhcmNoaXZlIGZpbGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZmlsZSA8Y29kZT5BcmNoaXZlRmlsZURhdGE8L2NvZGU+Ci0gICAgICogQHRocm93cyBEZXBsb3ltZW50RXhjZXB0aW9uIDxjb2RlPkRlcGxveW1lbnRFeGNlcHRpb248L2NvZGU+Ci0gICAgICovCi0gICAgcHVibGljIEhhc2hNYXA8U3RyaW5nLCBBeGlzU2VydmljZT4gcHJvY2Vzc1dTRExzKERlcGxveW1lbnRGaWxlRGF0YSBmaWxlKQotICAgICAgICAgICAgdGhyb3dzIERlcGxveW1lbnRFeGNlcHRpb24gewotICAgICAgICBGaWxlIHNlcnZpY2VGaWxlID0gZmlsZS5nZXRGaWxlKCk7Ci0gICAgICAgIC8vIHRvIHN0b3JlIHNlcnZpY2UgY29tZSBmcm9tIHdzZGwgZmlsZXMKLSAgICAgICAgSGFzaE1hcDxTdHJpbmcsIEF4aXNTZXJ2aWNlPiBzZXJ2aWNlc01hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgQXhpc1NlcnZpY2U+KCk7Ci0gICAgICAgIGJvb2xlYW4gaXNEaXJlY3RvcnkgPSBzZXJ2aWNlRmlsZS5pc0RpcmVjdG9yeSgpOwotICAgICAgICBpZiAoaXNEaXJlY3RvcnkpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgRmlsZSBtZXRhSW5mRm9sZGVyID0gbmV3IEZpbGUoc2VydmljZUZpbGUsIE1FVEFfSU5GKTsKLQotICAgICAgICAgICAgICAgIGlmICghbWV0YUluZkZvbGRlci5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgICAgICBtZXRhSW5mRm9sZGVyID0gbmV3IEZpbGUoc2VydmljZUZpbGUsIE1FVEFfSU5GLnRvTG93ZXJDYXNlKCkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIW1ldGFJbmZGb2xkZXIuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRNZXNzYWdlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlcGxveW1lbnRFcnJvck1zZ3MuTUVUQV9JTkZfTUlTU0lORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlRmlsZS5nZXROYW1lKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHByb2Nlc3NGaWxlc0luRm9sZGVyKG1ldGFJbmZGb2xkZXIsIHNlcnZpY2VzTWFwKTsKLQotICAgICAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBaaXBJbnB1dFN0cmVhbSB6aW47Ci0gICAgICAgICAgICBGaWxlSW5wdXRTdHJlYW0gZmluOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBmaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKHNlcnZpY2VGaWxlKTsKLSAgICAgICAgICAgICAgICB6aW4gPSBuZXcgWmlwSW5wdXRTdHJlYW0oZmluKTsKLQotICAgICAgICAgICAgICAgIC8vVE9ETyBDaGVjayB3aGV0aGVyIHRoaXMgV1NETCBpcyBlbXB0eQotCi0gICAgICAgICAgICAgICAgWmlwRW50cnkgZW50cnk7Ci0gICAgICAgICAgICAgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzEwMjRdOwotICAgICAgICAgICAgICAgIGludCByZWFkOwotICAgICAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQ7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKChlbnRyeSA9IHppbi5nZXROZXh0RW50cnkoKSkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZW50cnlOYW1lID0gZW50cnkuZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChlbnRyeU5hbWUuc3RhcnRzV2l0aChNRVRBX0lORi50b0xvd2VyQ2FzZSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgZW50cnlOYW1lLmVuZHNXaXRoKFNVRkZJWF9XU0RMKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBkbyBub3Qgd2FudCB0byBnZW5lcmF0ZSB0aGUgc2VydmljZXMgZm9yIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW1wb3J0ZWQgd3NkbCBvZiBvbmUgZmlsZS4KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoZW50cnlOYW1lLmluZGV4T2YoIi8iKSAhPSBlbnRyeU5hbWUubGFzdEluZGV4T2YoIi8iKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoZW50cnlOYW1lLmluZGV4T2YoIndzZGxfIikgIT0gLTEpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9vbmx5IGNhcmUgYWJ0IHRoZSB0b3BsZXZlbCB3c2RsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgocmVhZCA9IHppbi5yZWFkKGJ1ZikpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZShidWYsIDAsIHJlYWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBpbiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvdXQudG9CeXRlQXJyYXkoKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdyB0aGUgcXVlc3Rpb24gaXMgd2hpY2ggdmVyc2lvbiBvZiBXU0RMIGZpbGUgdGhpcyBhcmNoaXZlIGNvbnRhaW5zLgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGV0cyBjaGVjayB0aGUgbmFtZXNwYWNlIG9mIHRoZSByb290IGVsZW1lbnQgYW5kIGRlY2lkZS4gQnV0IHNpbmNlIHdlIGFyZQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXNpbmcgYXhpb20gKGR1ZGUsIHlvdSBhcmUgYmVjb21pbmcgaGFuZHkgaGVyZSA6KSksIHdlIHdpbGwgbm90IGJ1aWxkIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hvbGUgdGhpbmcuCi0gICAgICAgICAgICAgICAgICAgICAgICBPTU5hbWVzcGFjZSBkb2N1bWVudEVsZW1lbnROUyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoT01FbGVtZW50KSBYTUxVdGlscy50b09NKGluKSkuZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZG9jdW1lbnRFbGVtZW50TlMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdTRExUb0F4aXNTZXJ2aWNlQnVpbGRlciB3c2RsVG9BeGlzU2VydmljZUJ1aWxkZXI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFdTREwyQ29uc3RhbnRzLldTRExfTkFNRVNQQUNFCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKGRvY3VtZW50RWxlbWVudE5TLmdldE5hbWVzcGFjZVVSSSgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIGEgV1NETCAyLjAgZG9jdW1lbnQgaGVyZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NkbFRvQXhpc1NlcnZpY2VCdWlsZGVyID0gbmV3IFdTREwyMFRvQWxsQXhpc1NlcnZpY2VzQnVpbGRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob3V0LnRvQnl0ZUFycmF5KCkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NkbFRvQXhpc1NlcnZpY2VCdWlsZGVyLnNldEJhc2VVcmkoZW50cnlOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKENvbnN0YW50cy5OU19VUklfV1NETDExLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXF1YWxzKGRvY3VtZW50RWxlbWVudE5TLmdldE5hbWVzcGFjZVVSSSgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c2RsVG9BeGlzU2VydmljZUJ1aWxkZXIgPSBuZXcgV1NETDExVG9BbGxBeGlzU2VydmljZXNCdWlsZGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvdXQudG9CeXRlQXJyYXkoKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFdTREwxMVRvQXhpc1NlcnZpY2VCdWlsZGVyKSB3c2RsVG9BeGlzU2VydmljZUJ1aWxkZXIpLnNldERvY3VtZW50QmFzZVVyaShlbnRyeU5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoImludmFsaWRXU0RMRm91bmQiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8QXhpc1NlcnZpY2U+IHNlcnZpY2VzID0gcHJvY2Vzc1dTRExGaWxlKHdzZGxUb0F4aXNTZXJ2aWNlQnVpbGRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VGaWxlLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQudG9CeXRlQXJyYXkoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXJ2aWNlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VydmljZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlID0gKEF4aXNTZXJ2aWNlKSBzZXJ2aWNlcy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXhpc1NlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VzTWFwLnB1dChheGlzU2VydmljZS5nZXROYW1lKCksIGF4aXNTZXJ2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICB6aW4uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5pbmZvKGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBmaW4uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5pbmZvKGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzZXJ2aWNlc01hcDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxBeGlzU2VydmljZT4gZ2V0QXhpc1NlcnZpY2VGcm9tV3NkbChJbnB1dFN0cmVhbSBpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzTG9hZGVyIGxvYWRlciwgU3RyaW5nIHdzZGxVcmwpIHRocm93cyBFeGNlcHRpb24gewotLy8gICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBpbiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvdXQudG9CeXRlQXJyYXkoKSk7Ci0KLSAgICAgICAgLy8gbm93IHRoZSBxdWVzdGlvbiBpcyB3aGljaCB2ZXJzaW9uIG9mIFdTREwgZmlsZSB0aGlzIGFyY2hpdmUgY29udGFpbnMuCi0gICAgICAgIC8vIGxldHMgY2hlY2sgdGhlIG5hbWVzcGFjZSBvZiB0aGUgcm9vdCBlbGVtZW50IGFuZCBkZWNpZGUuIEJ1dCBzaW5jZSB3ZSBhcmUKLSAgICAgICAgLy8gdXNpbmcgYXhpb20gKGR1ZGUsIHlvdSBhcmUgYmVjb21pbmcgaGFuZHkgaGVyZSA6KSksIHdlIHdpbGwgbm90IGJ1aWxkIHRoZQotICAgICAgICAvLyB3aG9sZSB0aGluZy4KLSAgICAgICAgT01FbGVtZW50IGVsZW1lbnQgPSAoT01FbGVtZW50KSBYTUxVdGlscy50b09NKGluKTsKLSAgICAgICAgT01OYW1lc3BhY2UgZG9jdW1lbnRFbGVtZW50TlMgPSBlbGVtZW50LmdldE5hbWVzcGFjZSgpOwotICAgICAgICBpZiAoZG9jdW1lbnRFbGVtZW50TlMgIT0gbnVsbCkgewotICAgICAgICAgICAgV1NETFRvQXhpc1NlcnZpY2VCdWlsZGVyIHdzZGxUb0F4aXNTZXJ2aWNlQnVpbGRlcjsKLSAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICBlbGVtZW50LnNlcmlhbGl6ZShvdXQpOwotICAgICAgICAgICAgaWYgKENvbnN0YW50cy5OU19VUklfV1NETDExLgotICAgICAgICAgICAgICAgICAgICBlcXVhbHMoZG9jdW1lbnRFbGVtZW50TlMuZ2V0TmFtZXNwYWNlVVJJKCkpKSB7Ci0gICAgICAgICAgICAgICAgd3NkbFRvQXhpc1NlcnZpY2VCdWlsZGVyID0gbmV3IFdTREwxMVRvQWxsQXhpc1NlcnZpY2VzQnVpbGRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvdXQudG9CeXRlQXJyYXkoKSkpOwotICAgICAgICAgICAgICAgICgoV1NETDExVG9BbGxBeGlzU2VydmljZXNCdWlsZGVyKXdzZGxUb0F4aXNTZXJ2aWNlQnVpbGRlcikuc2V0Q3VzdG9tV1NETFJlc29sdmVyKG5ldyBXYXJCYXNlZFdTRExMb2NhdG9yKHdzZGxVcmwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC50b0J5dGVBcnJheSgpKSkpOwotICAgICAgICAgICAgICAgIHdzZGxUb0F4aXNTZXJ2aWNlQnVpbGRlci5zZXRDdXN0b21SZXNvbHZlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBXYXJGaWxlQmFzZWRVUklSZXNvbHZlcihsb2FkZXIpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gKChXU0RMMTFUb0FsbEF4aXNTZXJ2aWNlc0J1aWxkZXIpd3NkbFRvQXhpc1NlcnZpY2VCdWlsZGVyKS5wb3B1bGF0ZUFsbFNlcnZpY2VzKCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKFdTREwyQ29uc3RhbnRzLldTRExfTkFNRVNQQUNFLgotICAgICAgICAgICAgICAgICAgICBlcXVhbHMoZG9jdW1lbnRFbGVtZW50TlMuZ2V0TmFtZXNwYWNlVVJJKCkpKXsKLSAgICAgICAgICAgICAgICB3c2RsVG9BeGlzU2VydmljZUJ1aWxkZXIgPSBuZXcgV1NETDIwVG9BbGxBeGlzU2VydmljZXNCdWlsZGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG91dC50b0J5dGVBcnJheSgpKSk7Ci0gICAgICAgICAgICAgICAgKChXU0RMMjBUb0FsbEF4aXNTZXJ2aWNlc0J1aWxkZXIpd3NkbFRvQXhpc1NlcnZpY2VCdWlsZGVyKS5zZXRDdXN0b21XU0RMUmVzb2x2ZXIobmV3IFdhckJhc2VkV1NETExvY2F0b3Iod3NkbFVybCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnRvQnl0ZUFycmF5KCkpKSk7Ci0gICAgICAgICAgICAgICAgd3NkbFRvQXhpc1NlcnZpY2VCdWlsZGVyLnNldEN1c3RvbVJlc29sdmVyKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFdhckZpbGVCYXNlZFVSSVJlc29sdmVyKGxvYWRlcikpOwotICAgICAgICAgICAgICAgIHJldHVybiAoKFdTREwyMFRvQWxsQXhpc1NlcnZpY2VzQnVpbGRlcil3c2RsVG9BeGlzU2VydmljZUJ1aWxkZXIpLnBvcHVsYXRlQWxsU2VydmljZXMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoImludmFsaWRXU0RMRm91bmQiKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJvY2Vzc0ZpbGVzSW5Gb2xkZXIoRmlsZSBmb2xkZXIsIEhhc2hNYXA8U3RyaW5nLCBBeGlzU2VydmljZT4gc2VydmljZXNNYXApCi0gICAgICAgICAgICB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBYTUxTdHJlYW1FeGNlcHRpb24sIERlcGxveW1lbnRFeGNlcHRpb24gewotICAgICAgICBGaWxlIGZpbGVzW10gPSBmb2xkZXIubGlzdEZpbGVzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIEZpbGUgZmlsZTEgPSBmaWxlc1tpXTsKLSAgICAgICAgICAgIGlmIChmaWxlMS5nZXROYW1lKCkudG9Mb3dlckNhc2UoKS5lbmRzV2l0aChTVUZGSVhfV1NETCkpIHsKLSAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZTEpOwotICAgICAgICAgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBpbjI7Ci0KLSAgICAgICAgICAgICAgICAvLyBub3cgdGhlIHF1ZXN0aW9uIGlzIHdoaWNoIHZlcnNpb24gb2YgV1NETCBmaWxlIHRoaXMgYXJjaGl2ZSBjb250YWlucy4KLSAgICAgICAgICAgICAgICAvLyBsZXRzIGNoZWNrIHRoZSBuYW1lc3BhY2Ugb2YgdGhlIHJvb3QgZWxlbWVudCBhbmQgZGVjaWRlLiBCdXQgc2luY2Ugd2UgYXJlCi0gICAgICAgICAgICAgICAgLy8gdXNpbmcgYXhpb20gKGR1ZGUsIHlvdSBhcmUgYmVjb21pbmcgaGFuZHkgaGVyZSA6KSksIHdlIHdpbGwgbm90IGJ1aWxkIHRoZQotICAgICAgICAgICAgICAgIC8vIHdob2xlIHRoaW5nLgotICAgICAgICAgICAgICAgIE9NTmFtZXNwYWNlIGRvY3VtZW50RWxlbWVudE5TID0gKChPTUVsZW1lbnQpIFhNTFV0aWxzLnRvT00oaW4pKS5nZXROYW1lc3BhY2UoKTsKLSAgICAgICAgICAgICAgICBpZiAoZG9jdW1lbnRFbGVtZW50TlMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBXU0RMVG9BeGlzU2VydmljZUJ1aWxkZXIgd3NkbFRvQXhpc1NlcnZpY2VCdWlsZGVyOwotICAgICAgICAgICAgICAgICAgICBpZiAoV1NETDJDb25zdGFudHMuV1NETF9OQU1FU1BBQ0UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKGRvY3VtZW50RWxlbWVudE5TLmdldE5hbWVzcGFjZVVSSSgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSBhIFdTREwgMi4wIGRvY3VtZW50IGhlcmUuCi0gICAgICAgICAgICAgICAgICAgICAgICBpbjIgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdzZGxUb0F4aXNTZXJ2aWNlQnVpbGRlciA9IG5ldyBXU0RMMjBUb0FsbEF4aXNTZXJ2aWNlc0J1aWxkZXIoaW4yKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChDb25zdGFudHMuTlNfVVJJX1dTREwxMS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcXVhbHMoZG9jdW1lbnRFbGVtZW50TlMuZ2V0TmFtZXNwYWNlVVJJKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbjIgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdzZGxUb0F4aXNTZXJ2aWNlQnVpbGRlciA9IG5ldyBXU0RMMTFUb0FsbEF4aXNTZXJ2aWNlc0J1aWxkZXIoaW4yKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICgoV1NETDExVG9BeGlzU2VydmljZUJ1aWxkZXIpIHdzZGxUb0F4aXNTZXJ2aWNlQnVpbGRlcikuc2V0RG9jdW1lbnRCYXNlVXJpKGZpbGUxLnRvVVJJKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiaW52YWxpZFdTRExGb3VuZCIpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBpbjMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUxKTsKLSAgICAgICAgICAgICAgICAgICAgTGlzdDxBeGlzU2VydmljZT4gc2VydmljZXMgPSBwcm9jZXNzV1NETEZpbGUod3NkbFRvQXhpc1NlcnZpY2VCdWlsZGVyLCBmaWxlMSwgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4yLCBmaWxlMS50b1VSSSgpLnRvU3RyaW5nKCkpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChzZXJ2aWNlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHNlcnZpY2VzLnNpemUoKTsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UgPSAoQXhpc1NlcnZpY2UpIHNlcnZpY2VzLmdldChqKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXhpc1NlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlc01hcC5wdXQoYXhpc1NlcnZpY2UuZ2V0TmFtZSgpLCBheGlzU2VydmljZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbjIuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluMy5jbG9zZSgpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuaW5mbyhlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBpbi5jbG9zZSgpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmluZm8oZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVhZE1vZHVsZUFyY2hpdmUoRGVwbG95bWVudEZpbGVEYXRhIGRlcGxveW1lbnRGaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF4aXNNb2R1bGUgbW9kdWxlLCBib29sZWFuIGV4cGxvZGVkRGlyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF4aXNDb25maWd1cmF0aW9uIGF4aXNDb25maWcpCi0gICAgICAgICAgICB0aHJvd3MgRGVwbG95bWVudEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgLy8gZ2V0IGF0dHJpYnV0ZSB2YWx1ZXMKLSAgICAgICAgYm9vbGVhbiBtb2R1bGVYTUxGb3VuZCA9IGZhbHNlOwotICAgICAgICBTdHJpbmcgc2hvcnRGaWxlTmFtZSA9IERlc2NyaXB0aW9uQnVpbGRlci5nZXRTaG9ydEZpbGVOYW1lKGRlcGxveW1lbnRGaWxlLmdldE5hbWUoKSk7Ci0gICAgICAgIGlmICghZXhwbG9kZWREaXIpIHsKLSAgICAgICAgICAgIFppcElucHV0U3RyZWFtIHppbjsKLSAgICAgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBmaW47Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGZpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZGVwbG95bWVudEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgICAgICAgICAgICAgIHppbiA9IG5ldyBaaXBJbnB1dFN0cmVhbShmaW4pOwotICAgICAgICAgICAgICAgIFppcEVudHJ5IGVudHJ5OwotICAgICAgICAgICAgICAgIHdoaWxlICgoZW50cnkgPSB6aW4uZ2V0TmV4dEVudHJ5KCkpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5LmdldE5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKE1PRFVMRV9YTUwpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVYTUxGb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNb2R1bGVCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgTW9kdWxlQnVpbGRlcih6aW4sIG1vZHVsZSwgYXhpc0NvbmZpZyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXR0aW5nIG1vZHVsZSBuYW1lIGFuZCB2ZXJzaW9uCi0gICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGUuc2V0QXJjaGl2ZU5hbWUoc2hvcnRGaWxlTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLnBvcHVsYXRlTW9kdWxlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB6aW4uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICBmaW4uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICBpZiAoIW1vZHVsZVhNTEZvdW5kKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXBsb3ltZW50RXJyb3JNc2dzLk1PRFVMRV9YTUxfTUlTU0lORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcGxveW1lbnRGaWxlLmdldEFic29sdXRlUGF0aCgpKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGRlcGxveW1lbnRGaWxlLmdldEFic29sdXRlUGF0aCgpLCBNT0RVTEVfWE1MKTsKLQotICAgICAgICAgICAgaWYgKGZpbGUuZXhpc3RzKCkgfHwKLSAgICAgICAgICAgICAgICAoZmlsZSA9IG5ldyBGaWxlKGRlcGxveW1lbnRGaWxlLmdldEFic29sdXRlUGF0aCgpLCBNT0RVTEVfWE1MLnRvTG93ZXJDYXNlKCkpKQotICAgICAgICAgICAgICAgICAgICAgICAgLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gaW4gPSBudWxsOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgTW9kdWxlQnVpbGRlciBidWlsZGVyID0gbmV3IE1vZHVsZUJ1aWxkZXIoaW4sIG1vZHVsZSwgYXhpc0NvbmZpZyk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHNldHRpbmcgbW9kdWxlIG5hbWUgYW5kIHZlcnNpb24KLSAgICAgICAgICAgICAgICAgICAgbW9kdWxlLnNldEFyY2hpdmVOYW1lKHNob3J0RmlsZU5hbWUpOwotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLnBvcHVsYXRlTW9kdWxlKCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZ2V0TWVzc2FnZShEZXBsb3ltZW50RXJyb3JNc2dzLkZJTEVfTk9UX0ZPVU5ELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5nZXRNZXNzYWdlKCkpKTsKLSAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICBpZiAoaW4gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbi5jbG9zZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5pbmZvKE1lc3NhZ2VzLmdldE1lc3NhZ2UoImVycm9yaW5pbnB1dHN0cmVhbWNsb3NlIikpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlcGxveW1lbnRFcnJvck1zZ3MuTU9EVUxFX1hNTF9NSVNTSU5HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBsb3ltZW50RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvcmVwb3NpdG9yeS91dGlsL0RlcGxveW1lbnRGaWxlRGF0YS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvcmVwb3NpdG9yeS91dGlsL0RlcGxveW1lbnRGaWxlRGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDM0N2FlLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L3JlcG9zaXRvcnkvdXRpbC9EZXBsb3ltZW50RmlsZURhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LnJlcG9zaXRvcnkudXRpbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC5EZXBsb3llcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQuRGVwbG95bWVudEVycm9yTXNnczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQuRGVwbG95bWVudEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQudXRpbC5VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmkxOG4uTWVzc2FnZXM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi0vKioKLSAqIERlcGxveW1lbnRGaWxlRGF0YSByZXByZXNlbnRzIGEgInRoaW5nIHRvIGRlcGxveSIgaW4gQXhpczIuICBJdCBjb25zaXN0cyBvZiBhIGZpbGUsCi0gKiBhIGRlcGxveW1lbnQgQ2xhc3NMb2FkZXIsIGFuZCBhIERlcGxveWVyLgotICovCi1wdWJsaWMgY2xhc3MgRGVwbG95bWVudEZpbGVEYXRhIHsKLSAgICBwcml2YXRlIEZpbGUgZmlsZTsKLSAgICBwcml2YXRlIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyOwotICAgIHByaXZhdGUgRGVwbG95ZXIgZGVwbG95ZXI7Ci0KLSAgICBwdWJsaWMgRGVwbG95bWVudEZpbGVEYXRhKEZpbGUgZmlsZSkgewotICAgICAgICB0aGlzLmZpbGUgPSBmaWxlOwotICAgIH0KLQotICAgIHB1YmxpYyBEZXBsb3ltZW50RmlsZURhdGEoRmlsZSBmaWxlLCBEZXBsb3llciBkZXBsb3llcikgewotICAgICAgICB0aGlzKGZpbGUpOwotICAgICAgICB0aGlzLmRlcGxveWVyID0gZGVwbG95ZXI7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBYnNvbHV0ZVBhdGgoKSB7Ci0gICAgICAgIHJldHVybiBmaWxlLmdldEFic29sdXRlUGF0aCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBDbGFzc0xvYWRlciBnZXRDbGFzc0xvYWRlcigpIHsKLSAgICAgICAgcmV0dXJuIGNsYXNzTG9hZGVyOwotICAgIH0KLQotICAgIHB1YmxpYyBGaWxlIGdldEZpbGUoKSB7Ci0gICAgICAgIHJldHVybiBmaWxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgbmFtZSBvZiB0aGUgZmlsZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHJlZmVyZW5jZWQgZmlsZQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGZpbGUuZ2V0TmFtZSgpOyAvLyBObyBuZWVkIHRvIGNoZWNrIGZvciBudWxsIGR1ZSB0byBjb25zdHJ1Y3RvciBjaGVjawotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgbmFtZSBvZiB0aGUgZmlsZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHJlZmVyZW5jZWQgZmlsZQotICAgICAqIEBkZXByZWNhdGVkIHBsZWFzZSB1c2UgZ2V0TmFtZSgpIGluc3RlYWQgLSB0aGlzIHdpbGwgZGlzYXBwZWFyIGFmdGVyIDEuMy4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNlcnZpY2VOYW1lKCkgewotICAgICAgICByZXR1cm4gZ2V0TmFtZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc01vZHVsZUFyY2hpdmVGaWxlKFN0cmluZyBmaWxlbmFtZSkgewotICAgICAgICByZXR1cm4gKGZpbGVuYW1lLmVuZHNXaXRoKCIubWFyIikpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrcyB3aGV0aGVyIGEgZ2l2ZW4gZmlsZSBpcyBhIGphciBvciBhbiBhYXIgZmlsZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmaWxlbmFtZSBmaWxlIHRvIGNoZWNrCi0gICAgICogQHJldHVybiBSZXR1cm5zIGJvb2xlYW4uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzU2VydmljZUFyY2hpdmVGaWxlKFN0cmluZyBmaWxlbmFtZSkgewotICAgICAgICByZXR1cm4gKChmaWxlbmFtZS5lbmRzV2l0aCgiLmphciIpKSB8IChmaWxlbmFtZS5lbmRzV2l0aCgiLmFhciIpKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RmlsZUV4dGVuc2lvbihTdHJpbmcgZmlsZU5hbWUpIHsKLSAgICAgICAgaW50IGluZGV4ID0gZmlsZU5hbWUubGFzdEluZGV4T2YoJy4nKTsKLSAgICAgICAgcmV0dXJuIGZpbGVOYW1lLnN1YnN0cmluZyhpbmRleCArIDEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENsYXNzTG9hZGVyKENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKSB7Ci0gICAgICAgIHRoaXMuY2xhc3NMb2FkZXIgPSBjbGFzc0xvYWRlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc0xvYWRlcihib29sZWFuIGlzRGlyZWN0b3J5LCBDbGFzc0xvYWRlciBwYXJlbnQsIEZpbGUgZmlsZSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIGlmICghaXNEaXJlY3RvcnkpIHsKLSAgICAgICAgICAgIGlmICh0aGlzLmZpbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFVSTFtdIHVybHNUb0xvYWRGcm9tOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5maWxlLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KE1lc3NhZ2VzLmdldE1lc3NhZ2UoRGVwbG95bWVudEVycm9yTXNncy5GSUxFX05PVF9GT1VORCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB1cmxzVG9Mb2FkRnJvbSA9IG5ldyBVUkxbXXt0aGlzLmZpbGUudG9VUkwoKX07Ci0gICAgICAgICAgICAgICAgICAgIGNsYXNzTG9hZGVyID0gVXRpbHMuY3JlYXRlQ2xhc3NMb2FkZXIodXJsc1RvTG9hZEZyb20sIHBhcmVudCwgdHJ1ZSwgZmlsZSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAodGhpcy5maWxlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjbGFzc0xvYWRlciA9IFV0aWxzLmdldENsYXNzTG9hZGVyKHBhcmVudCwgdGhpcy5maWxlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBEZXBsb3llciBnZXREZXBsb3llcigpIHsKLSAgICAgICAgcmV0dXJuIGRlcGxveWVyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERlcGxveWVyKERlcGxveWVyIGRlcGxveWVyKSB7Ci0gICAgICAgIHRoaXMuZGVwbG95ZXIgPSBkZXBsb3llcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkZXBsb3koKSB0aHJvd3MgRGVwbG95bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIGRlcGxveWVyLmRlcGxveSh0aGlzKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9yZXBvc2l0b3J5L3V0aWwvV1NJbmZvLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9yZXBvc2l0b3J5L3V0aWwvV1NJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmZTA0ZjEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvcmVwb3NpdG9yeS91dGlsL1dTSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC5yZXBvc2l0b3J5LnV0aWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQuRGVwbG95ZXI7Ci0KLXB1YmxpYyBjbGFzcyBXU0luZm8gewotICAgIHByaXZhdGUgU3RyaW5nIGZpbGVOYW1lOwotICAgIHByaXZhdGUgbG9uZyBsYXN0TW9kaWZpZWREYXRlOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9TRVJWSUNFID0gMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX01PRFVMRSA9IDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9DVVNUT00gPSAyOwotCi0gICAgLyoqCi0gICAgICogVG8gY2hlY2sgd2hldGhlciB0aGUgZmlsZSBpcyBhIG1vZHVsZSBvciBhIHNlcnZpY2UKLSAgICAgKi8KLSAgICBwcml2YXRlIGludCB0eXBlID0gVFlQRV9TRVJWSUNFOwotCi0gICAgcHJpdmF0ZSBEZXBsb3llciBkZXBsb3llcjsKLQotICAgIHB1YmxpYyBXU0luZm8oU3RyaW5nIGZpbGVOYW1lLCBsb25nIGxhc3RNb2RpZmllZERhdGUsIERlcGxveWVyIGRlcGxveWVyICxpbnQgdHlwZSkgewotICAgICAgICB0aGlzLmZpbGVOYW1lID0gZmlsZU5hbWU7Ci0gICAgICAgIHRoaXMubGFzdE1vZGlmaWVkRGF0ZSA9IGxhc3RNb2RpZmllZERhdGU7Ci0gICAgICAgIHRoaXMuZGVwbG95ZXIgPSBkZXBsb3llcjsKLSAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZpbGVOYW1lKCkgewotICAgICAgICByZXR1cm4gZmlsZU5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIGxvbmcgZ2V0TGFzdE1vZGlmaWVkRGF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIGxhc3RNb2RpZmllZERhdGU7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRUeXBlKCkgewotICAgICAgICByZXR1cm4gdHlwZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRGaWxlTmFtZShTdHJpbmcgZmlsZU5hbWUpIHsKLSAgICAgICAgdGhpcy5maWxlTmFtZSA9IGZpbGVOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldExhc3RNb2RpZmllZERhdGUobG9uZyBsYXN0bW9kaWZpZWRkYXRlKSB7Ci0gICAgICAgIHRoaXMubGFzdE1vZGlmaWVkRGF0ZSA9IGxhc3Rtb2RpZmllZGRhdGU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBEZXBsb3llciBnZXREZXBsb3llcigpIHsKLSAgICAgICAgcmV0dXJuIGRlcGxveWVyOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L3JlcG9zaXRvcnkvdXRpbC9XU0luZm9MaXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9yZXBvc2l0b3J5L3V0aWwvV1NJbmZvTGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTllMDFmLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L3JlcG9zaXRvcnkvdXRpbC9XU0luZm9MaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC5yZXBvc2l0b3J5LnV0aWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQuRGVwbG95ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LkRlcGxveW1lbnRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LkRlcGxveW1lbnRFbmdpbmU7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotcHVibGljIGNsYXNzIFdTSW5mb0xpc3QgaW1wbGVtZW50cyBEZXBsb3ltZW50Q29uc3RhbnRzIHsKLQotICAgIC8qKgotICAgICAqIFRoaXMgaXMgdG8gc3RvcmUgYWxsIHRoZSBqYXIgZmlsZXMgaW4gYSBzcGVjaWZpZWQgZm9sZGVyIChXRUJfSU5GKQotICAgICAqLwotICAgIHByaXZhdGUgTGlzdCBqYXJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgLyoqCi0gICAgICogQWxsIHRoZSBjdXJyZW50bHkgdXBkYXRlZCBqYXJzCi0gICAgICovCi0gICAgcHVibGljIE1hcCBjdXJyZW50SmFycyA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZWZlcmVuY2UgdG8gRGVwbG95bWVudEVuZ2luZSB0byBtYWtlIHVwZGF0ZQotICAgICAqLwotCi0gICAgcHJpdmF0ZSBib29sZWFuIGxvY2tlZCA9IGZhbHNlOwotICAgIHByaXZhdGUgZmluYWwgRGVwbG95bWVudEVuZ2luZSBkZXBsb3ltZW50RW5naW5lOwotCi0gICAgcHVibGljIFdTSW5mb0xpc3QoRGVwbG95bWVudEVuZ2luZSBkZXBsb3lfZW5naW5lKSB7Ci0gICAgICAgIGRlcGxveW1lbnRFbmdpbmUgPSBkZXBsb3lfZW5naW5lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZpcnN0IGNoZWNrcyB3aGV0aGVyIHRoZSBmaWxlIGlzIGFscmVhZHkgYXZhaWxhYmxlIGJ5IHRoZQotICAgICAqIHN5c3RlbSBjYWxsIGZpbGVFeGlzdHMuIElmIGl0IGlzIG5vdCBkZXBsb3llZCB5ZXQgdGhlbiBhZGRzIHRvIHRoZSBqYXJMaXN0Ci0gICAgICogYW5kIHRvIHRoZSBkZXBsb3ltZW50IGVuZ2luZSBhcyBhIG5ldyBzZXJ2aWNlIG9yIG1vZHVsZS4KLSAgICAgKiBXaGlsZSBhZGRpbmcgbmV3IGl0ZW0gdG8gamFyTGlzdCwgZmlyc3QgY3JlYXRlcyB0aGUgV1NJbmZvIG9iamVjdCBhbmQKLSAgICAgKiB0aGVuIGFkZHMgdG8gdGhlIGphcmxpc3QgYW5kIGFjdHVhbCBqYXIgZmlsZSBpcyBhZGRlZCB0byBEZXBsb3ltZW50RW5naW5lLgotICAgICAqIDxwLz4KLSAgICAgKiBJZiB0aGUgZmlsZXMgYWxyZWFkeSBleGlzdHMsIHRoZW4gY2hlY2tzIHdoZXRoZXIgaXQgaGFzIGJlZW4gdXBkYXRlZAotICAgICAqIHRoZW4gY2hhbmdlcyB0aGUgbGFzdCB1cGRhdGUgZGF0ZSBvZiB0aGUgd3NJbmZvIGFuZCBhZGRzIHR3byBlbnRyaWVzIHRvCi0gICAgICogRGVwbG95bWVudEVuZ2luZSAtIG9uZSBmb3IgbmV3IGRlcGxveW1lbnQgYW5kIG90aGVyIGZvciB1bmRlcGxveW1lbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZmlsZSBhY3R1YWwgamFyIGZpbGVzIGZvciBlaXRoZXIgTW9kdWxlIG9yIHNlcnZpY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkV1NJbmZvSXRlbShGaWxlIGZpbGUsIERlcGxveWVyIGRlcGxveWVyICwgaW50IHR5cGUpIHsKLSAgICAgICAgV1NJbmZvIGluZm8gPSAoV1NJbmZvKSBjdXJyZW50SmFycy5nZXQoZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgICAgIGlmIChpbmZvICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChkZXBsb3ltZW50RW5naW5lLmlzSG90VXBkYXRlKCkgJiYgaXNNb2RpZmllZChmaWxlLCBpbmZvKSkgewotICAgICAgICAgICAgICAgIFdTSW5mbyB3c0luZm8gPSBuZXcgV1NJbmZvKGluZm8uZ2V0RmlsZU5hbWUoKSwgaW5mby5nZXRMYXN0TW9kaWZpZWREYXRlKCksIGRlcGxveWVyLHR5cGUpOwotICAgICAgICAgICAgICAgIGRlcGxveW1lbnRFbmdpbmUuYWRkV1NUb1VuZGVwbG95KHdzSW5mbyk7ICAgICAgICAgICAvLyBhZGQgZW50cnkgdG8gdW5kZXBsb3kgbGlzdAotICAgICAgICAgICAgICAgIERlcGxveW1lbnRGaWxlRGF0YSBkZXBsb3ltZW50RmlsZURhdGEgPSBuZXcgRGVwbG95bWVudEZpbGVEYXRhKGZpbGUsIGRlcGxveWVyKTsKLSAgICAgICAgICAgICAgICBkZXBsb3ltZW50RW5naW5lLmFkZFdTVG9EZXBsb3koZGVwbG95bWVudEZpbGVEYXRhKTsgICAgLy8gYWRkIGVudHJ5IHRvIGRlcGxveWxpc3QKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGluZm8gPSBnZXRGaWxlSXRlbShmaWxlLCBkZXBsb3llciwgdHlwZSk7Ci0gICAgICAgICAgICBzZXRMYXN0TW9kaWZpZWREYXRlKGZpbGUsIGluZm8pOwotICAgICAgICB9Ci0KLSAgICAgICAgamFyTGlzdC5hZGQoaW5mby5nZXRGaWxlTmFtZSgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3MgdW5kZXBsb3llZCBTZXJ2aWNlcy4gQ2hlY2tzIG9sZCBqYXJzIGZpbGVzIGFuZCBjdXJyZW50IGphcnMuCi0gICAgICogSWYgbmFtZSBvZiB0aGUgb2xkIGphciBmaWxlIGRvZXMgbm90IGV4aXN0IGluIHRoZSBjdXJyZW50IGphcgotICAgICAqIGxpc3QgdGhlbiBpdCBpcyBhc3N1bWVkIHRoYXQgdGhlIGphciBmaWxlIGhhcyBiZWVuIHJlbW92ZWQKLSAgICAgKiBhbmQgdGhhdCBpcyBob3QgdW5kZXBsb3ltZW50LgotICAgICAqLwotICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgY2hlY2tGb3JVbmRlcGxveWVkU2VydmljZXMoKSB7Ci0gICAgICAgIGlmKCFsb2NrZWQpIHsKLSAgICAgICAgICAgIGxvY2tlZCA9IHRydWU7Ci0gICAgICAgIH0gZWxzZXsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBJdGVyYXRvciBpbmZvSXRlbXMgPSBjdXJyZW50SmFycy5rZXlTZXQoKS5pdGVyYXRvcigpOwotICAgICAgICBMaXN0IHRvYmVSZW1vdmVkID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICB3aGlsZSAoaW5mb0l0ZW1zLmhhc05leHQoKSkgewotICAgICAgICAgICAgU3RyaW5nICBmaWxlTmFtZSA9IChTdHJpbmcpIGluZm9JdGVtcy5uZXh0KCk7Ci0gICAgICAgICAgICBXU0luZm8gaW5mb0l0ZW0gPSAoV1NJbmZvKSBjdXJyZW50SmFycy5nZXQoZmlsZU5hbWUpOwotICAgICAgICAgICAgaWYgKGluZm9JdGVtLmdldFR5cGUoKSA9PSBXU0luZm8uVFlQRV9NT0RVTEUpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vc2VlbXMgbGlrZSBzb21lb25lIGhhcyBkZWxldGVkIHRoZSBmaWxlICwgc28gbmVlZCB0byB1bmRlcGxveQotICAgICAgICAgICAgYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBqYXJMaXN0LnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHMgPSAoU3RyaW5nKSBqYXJMaXN0LmdldChpKTsKLSAgICAgICAgICAgICAgICBpZihmaWxlTmFtZS5lcXVhbHMocykpewotICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoIWZvdW5kKXsKLSAgICAgICAgICAgICAgICB0b2JlUmVtb3ZlZC5hZGQoZmlsZU5hbWUpOwotICAgICAgICAgICAgICAgIGRlcGxveW1lbnRFbmdpbmUuYWRkV1NUb1VuZGVwbG95KGluZm9JdGVtKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdG9iZVJlbW92ZWQuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIFN0cmluZyBmaWxlTmFtZSA9IChTdHJpbmcpIHRvYmVSZW1vdmVkLmdldChpKTsKLSAgICAgICAgICAgIGN1cnJlbnRKYXJzLnJlbW92ZShmaWxlTmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgdG9iZVJlbW92ZWQuY2xlYXIoKTsKLSAgICAgICAgamFyTGlzdC5jbGVhcigpOwotICAgICAgICBsb2NrZWQgPSBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDbGVhcnMgdGhlIGphcmxpc3QuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW5pdCgpIHsKLSAgICAgICAgamFyTGlzdC5jbGVhcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdXBkYXRlKCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKGRlcGxveW1lbnRFbmdpbmUpIHsKLSAgICAgICAgICAgIGNoZWNrRm9yVW5kZXBsb3llZFNlcnZpY2VzKCk7Ci0gICAgICAgICAgICBkZXBsb3ltZW50RW5naW5lLnVuRGVwbG95KCk7Ci0gICAgICAgICAgICBkZXBsb3ltZW50RW5naW5lLmRvRGVwbG95KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBXU0luZm8gb2JqZWN0IHJlbGF0ZWQgdG8gYSBmaWxlIGlmIGl0IGV4aXN0cywgbnVsbCBvdGhlcndpc2UuCi0gICAgICoKLSAgICAgKi8KLSAgICBwcml2YXRlIFdTSW5mbyBnZXRGaWxlSXRlbShGaWxlIGZpbGUgLCBEZXBsb3llciBkZXBsb3llciAsIGludCB0eXBlKSB7Ci0gICAgICAgIFN0cmluZyBmaWxlTmFtZSA9IGZpbGUuZ2V0TmFtZSgpOwotICAgICAgICBXU0luZm8gaW5mbyA9IChXU0luZm8pIGN1cnJlbnRKYXJzLmdldChmaWxlTmFtZSk7Ci0gICAgICAgIGlmKGluZm89PW51bGwpewotICAgICAgICAgICAgaW5mbyA9IG5ldyBXU0luZm8oZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgZmlsZS5sYXN0TW9kaWZpZWQoKSwgZGVwbG95ZXIgLHR5cGUpOwotICAgICAgICAgICAgY3VycmVudEphcnMucHV0KGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIGluZm8pOwotICAgICAgICAgICAgRGVwbG95bWVudEZpbGVEYXRhIGZpbGVEYXRhID0gbmV3IERlcGxveW1lbnRGaWxlRGF0YShmaWxlLCBkZXBsb3llcik7Ci0gICAgICAgICAgICBkZXBsb3ltZW50RW5naW5lLmFkZFdTVG9EZXBsb3koZmlsZURhdGEpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpbmZvOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrcyBpZiBhIGZpbGUgaGFzIGJlZW4gbW9kaWZpZWQgYnkgY29tcGFyaW5nIHRoZSBsYXN0IHVwZGF0ZSBkYXRlIG9mCi0gICAgICogYm90aCBmaWxlcyBhbmQgV1NJbmZvLiBJZiB0aGV5IGFyZSBkaWZmZXJlbnQsIHRoZSBmaWxlIGlzIGFzc3VtZWQgdG8gaGF2ZQotICAgICAqIGJlZW4gbW9kaWZpZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZmlsZQotICAgICAqIEBwYXJhbSB3c0luZm8KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNNb2RpZmllZChGaWxlIGZpbGUsIFdTSW5mbyB3c0luZm8pIHsKLSAgICAgICAgbG9uZyBjdXJyZW50VGltZVN0YW1wID0gd3NJbmZvLmdldExhc3RNb2RpZmllZERhdGUoKTsKLSAgICAgICAgCi0gICAgICAgIHNldExhc3RNb2RpZmllZERhdGUoZmlsZSwgd3NJbmZvKTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiAoY3VycmVudFRpbWVTdGFtcCAhPSB3c0luZm8uZ2V0TGFzdE1vZGlmaWVkRGF0ZSgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBPYnRhaW5zIHRoZSBuZXdlc3QgKGFzIGNvbXBhcmVkIHdpdGggdGltZXN0YW1wIHN0b3JlZCBpbiB3c0luZm8pCi0gICAgICogdGltZXN0YW1wIGFuZCBzdG9yZXMgaXQgaW4gV1NJbmZvLiAKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2V0TGFzdE1vZGlmaWVkRGF0ZShGaWxlIGZpbGUsIFdTSW5mbyB3c0luZm8pIHsKLSAgICAgICAgaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgRmlsZSBmaWxlcyBbXSA9IGZpbGUubGlzdEZpbGVzKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgRmlsZSBmaWxlSXRlbSA9IGZpbGVzW2ldOwotICAgICAgICAgICAgICAgIGlmIChmaWxlSXRlbS5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldExhc3RNb2RpZmllZERhdGUoZmlsZUl0ZW0sIHdzSW5mbyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYod3NJbmZvLmdldExhc3RNb2RpZmllZERhdGUoKSA8IGZpbGVJdGVtLmxhc3RNb2RpZmllZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHdzSW5mby5zZXRMYXN0TW9kaWZpZWREYXRlKGZpbGVJdGVtLmxhc3RNb2RpZmllZCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZih3c0luZm8uZ2V0TGFzdE1vZGlmaWVkRGF0ZSgpIDwgZmlsZS5sYXN0TW9kaWZpZWQoKSkgewotICAgICAgICAgICAgd3NJbmZvLnNldExhc3RNb2RpZmllZERhdGUoZmlsZS5sYXN0TW9kaWZpZWQoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9yZXNvbHZlci9BQVJCYXNlZFdTRExMb2NhdG9yLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9yZXNvbHZlci9BQVJCYXNlZFdTRExMb2NhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4NDMyYWYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvcmVzb2x2ZXIvQUFSQmFzZWRXU0RMTG9jYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LnJlc29sdmVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS53b2Rlbi5XU0RMRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUud29kZW4ucmVzb2x2ZXIuVVJJUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5yZXNvbHZlci5EZWZhdWx0VVJJUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci0KLWltcG9ydCBqYXZheC53c2RsLnhtbC5XU0RMTG9jYXRvcjsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5OwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwSW5wdXRTdHJlYW07Ci0KLS8qKgotICogQ3VzdG9tIFdTREwgbG9jYXRvciB0byBsb2FkIHNjaGVtYXMgZnJvbSB6aXAgYXJjaGl2ZXMKLSAqIE5lZWQgdG8gcHJvdmlkZSB0aGUgYWFyRmlsZSBhbmQgdGhlIGJhc2VJbnB1dFN0cmVhbSBmb3IKLSAqIHRoZSBiYXNlIFdTREwgZmlsZQotICogPHAvPgotICogVGhlIGxvZ2ljIGhlcmUgaXMgdGhhdCB3ZSBvbmx5IGNhcmUgYWJvdXQgdGhlIGltcG9ydCBsb2NhdGlvbgotICogYWxsIGltcG9ydHMgbXVzdCBiZSByZWxhdGl2ZSB0byB0aGUgTUVUQS1JTkYgZm9sZGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBBQVJCYXNlZFdTRExMb2NhdG9yIGV4dGVuZHMgRGVmYXVsdFVSSVJlc29sdmVyIGltcGxlbWVudHMgV1NETExvY2F0b3IsIFVSSVJlc29sdmVyIHsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkKLSAgICAgICAgICAgIC5nZXRMb2coQUFSQmFzZWRXU0RMTG9jYXRvci5jbGFzcyk7Ci0KLSAgICBwcml2YXRlIEZpbGUgYWFyRmlsZTsKLSAgICBwcml2YXRlIElucHV0U3RyZWFtIGJhc2VJbnB1dFN0cmVhbTsKLSAgICBwcml2YXRlIFVSSSBsYXN0SW1wb3J0TG9jYXRpb247Ci0gICAgcHJpdmF0ZSBTdHJpbmcgYmFzZVVSSTsKLQotICAgIHB1YmxpYyBBQVJCYXNlZFdTRExMb2NhdG9yKFN0cmluZyBiYXNlVVJJLCBGaWxlIHppcEZpbGUsIElucHV0U3RyZWFtIGJhc2VJbnB1dFN0cmVhbSkgewotICAgICAgICB0aGlzLmJhc2VVUkkgPSBiYXNlVVJJOwotICAgICAgICB0aGlzLmJhc2VJbnB1dFN0cmVhbSA9IGJhc2VJbnB1dFN0cmVhbTsKLSAgICAgICAgdGhpcy5hYXJGaWxlID0gemlwRmlsZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSW5wdXRTb3VyY2UgZ2V0QmFzZUlucHV0U291cmNlKCkgewotICAgICAgICByZXR1cm4gbmV3IElucHV0U291cmNlKGJhc2VJbnB1dFN0cmVhbSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHBhcmVudExvY2F0aW9uCi0gICAgICogQHBhcmFtIGltcG9ydExvY2F0aW9uCi0gICAgICovCi0gICAgcHVibGljIElucHV0U291cmNlIGdldEltcG9ydElucHV0U291cmNlKFN0cmluZyBwYXJlbnRMb2NhdGlvbiwgU3RyaW5nIGltcG9ydExvY2F0aW9uKSB7Ci0gICAgICAgIGxhc3RJbXBvcnRMb2NhdGlvbiA9IFVSSS5jcmVhdGUocGFyZW50TG9jYXRpb24pLnJlc29sdmUoaW1wb3J0TG9jYXRpb24pOwotCi0gICAgICAgIGlmIChpc0Fic29sdXRlKGltcG9ydExvY2F0aW9uKSkgewotICAgICAgICAgICAgcmV0dXJuIHN1cGVyLnJlc29sdmVFbnRpdHkoCi0gICAgICAgICAgICAgICAgICAgIG51bGwsIGltcG9ydExvY2F0aW9uLCBwYXJlbnRMb2NhdGlvbik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvL3dlIGRvbid0IGNhcmUgYWJvdXQgdGhlIHBhcmVudCBsb2NhdGlvbgotICAgICAgICAgICAgWmlwSW5wdXRTdHJlYW0gemluID0gbnVsbDsKLSAgICAgICAgICAgIHRyeSB7Ci0KLSAgICAgICAgICAgICAgICB6aW4gPSBuZXcgWmlwSW5wdXRTdHJlYW0obmV3IEZpbGVJbnB1dFN0cmVhbShhYXJGaWxlKSk7Ci0gICAgICAgICAgICAgICAgWmlwRW50cnkgZW50cnk7Ci0gICAgICAgICAgICAgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzEwMjRdOwotICAgICAgICAgICAgICAgIGludCByZWFkOwotICAgICAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQ7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHNlYXJjaGluZ1N0ciA9IGxhc3RJbXBvcnRMb2NhdGlvbi50b1N0cmluZygpOwotICAgICAgICAgICAgICAgIHdoaWxlICgoZW50cnkgPSB6aW4uZ2V0TmV4dEVudHJ5KCkpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGVudHJ5TmFtZSA9IGVudHJ5LmdldE5hbWUoKS50b0xvd2VyQ2FzZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZW50cnlOYW1lLmVxdWFsc0lnbm9yZUNhc2Uoc2VhcmNoaW5nU3RyKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKChyZWFkID0gemluLnJlYWQoYnVmKSkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlKGJ1ZiwgMCwgcmVhZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBpbiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvdXQudG9CeXRlQXJyYXkoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IElucHV0U291cmNlKGluKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHppbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB6aW4uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGxvZy5pbmZvKCJBQVJCYXNlZFdTRExMb2NhdG9yOiBVbmFibGUgdG8gcmVzb2x2ZSAiICsgbGFzdEltcG9ydExvY2F0aW9uKTsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXMgZm9yIHRoZSB6aXAgdGhlcmUgaXMgbm8gcG9pbnQgaW4gcmV0dXJuaW5nCi0gICAgICogYSBiYXNlIFVSSQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QmFzZVVSSSgpIHsKLSAgICAgICAgLy8gd2UgZG9uJ3QgY2FyZQotICAgICAgICByZXR1cm4gYmFzZVVSSTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiByZXR1cm5zIHRoZSBsYXRlc3QgaW1wb3J0Ci0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRMYXRlc3RJbXBvcnRVUkkoKSB7Ci0gICAgICAgIC8vd2UgZG9uJ3QgY2FyZSBhYm91dCB0aGlzIGVpdGhlcgotICAgICAgICByZXR1cm4gbGFzdEltcG9ydExvY2F0aW9uLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2xvc2UoKSB7Ci0gICAgICAgIC8vVE9ETzogRklYTUU6ICAgIAotICAgIH0KLQotICAgIHB1YmxpYyBVUkkgcmVzb2x2ZVVSSShVUkkgdXJpKSB0aHJvd3MgV1NETEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotICAgICAgICBsYXN0SW1wb3J0TG9jYXRpb24gPSBVUkkuY3JlYXRlKGJhc2VVUkkpLnJlc29sdmUodXJpKTsKLQotICAgICAgICBpZiAoaXNBYnNvbHV0ZSh1cmkudG9TdHJpbmcoKSkpIHsKLSAgICAgICAgICAgIHJldHVybiB1cmk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBTdHJpbmcgYWJzb2x1dGVQYXRoID0gYWFyRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBVUkkoImphcjpmaWxlOi8vIiArIGFic29sdXRlUGF0aCArICIhLyIgKyBsYXN0SW1wb3J0TG9jYXRpb24pOwotICAgICAgICAgICAgfSBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbG9nLmluZm8oIkFBUkJhc2VkV1NETExvY2F0b3I6IFVuYWJsZSB0byByZXNvbHZlICIgKyBsYXN0SW1wb3J0TG9jYXRpb24pOwotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvcmVzb2x2ZXIvQUFSRmlsZUJhc2VkVVJJUmVzb2x2ZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L3Jlc29sdmVyL0FBUkZpbGVCYXNlZFVSSVJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmYjAxYmYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvcmVzb2x2ZXIvQUFSRmlsZUJhc2VkVVJJUmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC5yZXNvbHZlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEucmVzb2x2ZXIuRGVmYXVsdFVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcElucHV0U3RyZWFtOwotCi0vKioKLSAqIEEgY3VzdG9tIFVSSSByZXNvbHZlciB0aGF0IGNhbgotICovCi1wdWJsaWMgY2xhc3MgQUFSRmlsZUJhc2VkVVJJUmVzb2x2ZXIgZXh0ZW5kcyBEZWZhdWx0VVJJUmVzb2x2ZXIgewotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeQotICAgICAgICAgICAgLmdldExvZyhBQVJGaWxlQmFzZWRVUklSZXNvbHZlci5jbGFzcyk7Ci0KLSAgICBwcml2YXRlIEZpbGUgYWFyRmlsZTsKLSAgICBwcml2YXRlIFVSSSBsYXN0SW1wb3J0TG9jYXRpb247Ci0KLSAgICBwdWJsaWMgQUFSRmlsZUJhc2VkVVJJUmVzb2x2ZXIoRmlsZSBhYXJGaWxlKSB7Ci0gICAgICAgIHRoaXMuYWFyRmlsZSA9IGFhckZpbGU7Ci0gICAgfQotCi0gICAgcHVibGljIElucHV0U291cmNlIHJlc29sdmVFbnRpdHkoCi0gICAgICAgICAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlLAotICAgICAgICAgICAgU3RyaW5nIHNjaGVtYUxvY2F0aW9uLAotICAgICAgICAgICAgU3RyaW5nIGJhc2VVcmkpIHsKLSAgICAgICAgLy9ubyBpc3N1ZSB3aXRoCi0gICAgICAgIGlmIChpc0Fic29sdXRlKHNjaGVtYUxvY2F0aW9uKSkgewotICAgICAgICAgICAgcmV0dXJuIHN1cGVyLnJlc29sdmVFbnRpdHkoCi0gICAgICAgICAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZSwgc2NoZW1hTG9jYXRpb24sIGJhc2VVcmkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy92YWxpZGF0ZQotICAgICAgICAgICAgaWYgKChiYXNlVXJpID09IG51bGwgfHwgIiIuZXF1YWxzKGJhc2VVcmkpKSAmJiBzY2hlbWFMb2NhdGlvbi5zdGFydHNXaXRoKCIuLiIpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAiVW5zdXBwb3J0ZWQgc2NoZW1hIGxvY2F0aW9uICIgKyBzY2hlbWFMb2NhdGlvbik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGxhc3RJbXBvcnRMb2NhdGlvbiA9IFVSSS5jcmVhdGUoYmFzZVVyaSkucmVzb2x2ZShzY2hlbWFMb2NhdGlvbik7Ci0gICAgICAgICAgICBaaXBJbnB1dFN0cmVhbSB6aW4gPSBudWxsOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICB6aW4gPSBuZXcgWmlwSW5wdXRTdHJlYW0obmV3IEZpbGVJbnB1dFN0cmVhbShhYXJGaWxlKSk7Ci0KLSAgICAgICAgICAgICAgICBaaXBFbnRyeSBlbnRyeTsKLSAgICAgICAgICAgICAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbMTAyNF07Ci0gICAgICAgICAgICAgICAgaW50IHJlYWQ7Ci0gICAgICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dDsKLSAgICAgICAgICAgICAgICBTdHJpbmcgc2VhcmNoaW5nU3RyID0gbGFzdEltcG9ydExvY2F0aW9uLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKChlbnRyeSA9IHppbi5nZXROZXh0RW50cnkoKSkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZW50cnlOYW1lID0gZW50cnkuZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChlbnRyeU5hbWUuZXF1YWxzSWdub3JlQ2FzZShzZWFyY2hpbmdTdHIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKHJlYWQgPSB6aW4ucmVhZChidWYpKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGUoYnVmLCAwLCByZWFkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGluID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG91dC50b0J5dGVBcnJheSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIElucHV0U291cmNlIGlucHV0U29ydWNlID0gbmV3IElucHV0U291cmNlKGluKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0U29ydWNlLnNldFN5c3RlbUlkKGxhc3RJbXBvcnRMb2NhdGlvbi5nZXRQYXRoKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRTb3J1Y2Uuc2V0UHVibGljSWQodGFyZ2V0TmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbnB1dFNvcnVjZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotCi0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh6aW4gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgemluLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0gICAgICAgIGxvZy5pbmZvKCJBQVJGaWxlQmFzZWRVUklSZXNvbHZlcjogVW5hYmxlIHRvIHJlc29sdmUiICsgbGFzdEltcG9ydExvY2F0aW9uKTsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvcmVzb2x2ZXIvV2FyQmFzZWRXU0RMTG9jYXRvci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvcmVzb2x2ZXIvV2FyQmFzZWRXU0RMTG9jYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDIzZTgzLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L3Jlc29sdmVyL1dhckJhc2VkV1NETExvY2F0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC5yZXNvbHZlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUud29kZW4uV1NETEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLndvZGVuLnJlc29sdmVyLlVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEucmVzb2x2ZXIuRGVmYXVsdFVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotCi1pbXBvcnQgamF2YXgud3NkbC54bWwuV1NETExvY2F0b3I7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1wdWJsaWMgY2xhc3MgV2FyQmFzZWRXU0RMTG9jYXRvciBleHRlbmRzIERlZmF1bHRVUklSZXNvbHZlciBpbXBsZW1lbnRzIFdTRExMb2NhdG9yLCBVUklSZXNvbHZlciB7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeQotICAgICAgICAgICAgLmdldExvZyhXYXJCYXNlZFdTRExMb2NhdG9yLmNsYXNzKTsKLQotICAgIHByaXZhdGUgSW5wdXRTdHJlYW0gYmFzZUlucHV0U3RyZWFtOwotICAgIHByaXZhdGUgVVJJIGxhc3RJbXBvcnRMb2NhdGlvbjsKLSAgICBwcml2YXRlIFN0cmluZyBiYXNlVVJJOwotICAgIHByaXZhdGUgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXI7Ci0KLSAgICBwdWJsaWMgV2FyQmFzZWRXU0RMTG9jYXRvcihTdHJpbmcgYmFzZVVSSSwgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gYmFzZUlucHV0U3RyZWFtKSB7Ci0gICAgICAgIHRoaXMuYmFzZVVSSSA9IGJhc2VVUkk7Ci0gICAgICAgIHRoaXMuYmFzZUlucHV0U3RyZWFtID0gYmFzZUlucHV0U3RyZWFtOwotICAgICAgICB0aGlzLmNsYXNzTG9hZGVyID0gY2xhc3NMb2FkZXI7Ci0gICAgfQotCi0gICAgcHVibGljIElucHV0U291cmNlIGdldEJhc2VJbnB1dFNvdXJjZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBJbnB1dFNvdXJjZShiYXNlSW5wdXRTdHJlYW0pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBwYXJlbnRMb2NhdGlvbgotICAgICAqIEBwYXJhbSBpbXBvcnRMb2NhdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBJbnB1dFNvdXJjZSBnZXRJbXBvcnRJbnB1dFNvdXJjZShTdHJpbmcgcGFyZW50TG9jYXRpb24sIFN0cmluZyBpbXBvcnRMb2NhdGlvbikgewotICAgICAgICBsYXN0SW1wb3J0TG9jYXRpb24gPSBVUkkuY3JlYXRlKHBhcmVudExvY2F0aW9uKS5yZXNvbHZlKGltcG9ydExvY2F0aW9uKTsKLQotICAgICAgICBpZiAoaXNBYnNvbHV0ZShpbXBvcnRMb2NhdGlvbikpIHsKLSAgICAgICAgICAgIHJldHVybiBzdXBlci5yZXNvbHZlRW50aXR5KAotICAgICAgICAgICAgICAgICAgICBudWxsLCBpbXBvcnRMb2NhdGlvbiwgcGFyZW50TG9jYXRpb24pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgU3RyaW5nIHNlYXJjaGluZ1N0ciA9IGxhc3RJbXBvcnRMb2NhdGlvbi50b1N0cmluZygpOwotICAgICAgICAgICAgcmV0dXJuIG5ldyBJbnB1dFNvdXJjZShjbGFzc0xvYWRlci5nZXRSZXNvdXJjZUFzU3RyZWFtKHNlYXJjaGluZ1N0cikpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXMgZm9yIHRoZSB6aXAgdGhlcmUgaXMgbm8gcG9pbnQgaW4gcmV0dXJuaW5nCi0gICAgICogYSBiYXNlIFVSSQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QmFzZVVSSSgpIHsKLSAgICAgICAgLy8gd2UgZG9uJ3QgY2FyZQotICAgICAgICByZXR1cm4gYmFzZVVSSTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiByZXR1cm5zIHRoZSBsYXRlc3QgaW1wb3J0Ci0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRMYXRlc3RJbXBvcnRVUkkoKSB7Ci0gICAgICAgIC8vd2UgZG9uJ3QgY2FyZSBhYm91dCB0aGlzIGVpdGhlcgotICAgICAgICByZXR1cm4gbGFzdEltcG9ydExvY2F0aW9uLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2xvc2UoKSB7Ci0gICAgICAgIC8vVE9ETzogRklYTUU6Ci0gICAgfQotCi0gICAgcHVibGljIFVSSSByZXNvbHZlVVJJKFVSSSB1cmkpIHRocm93cyBXU0RMRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0KLSAgICAgICAgaWYgKGlzQWJzb2x1dGUodXJpLnRvU3RyaW5nKCkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdXJpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbGFzdEltcG9ydExvY2F0aW9uID0gVVJJLmNyZWF0ZShiYXNlVVJJKS5yZXNvbHZlKHVyaS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIFN0cmluZyBzZWFyY2hpbmdTdHIgPSBsYXN0SW1wb3J0TG9jYXRpb24udG9TdHJpbmcoKTsKLSAgICAgICAgICAgIFVSTCByZXNvdXJjZSA9IGNsYXNzTG9hZGVyLmdldFJlc291cmNlKHNlYXJjaGluZ1N0cik7Ci0gICAgICAgICAgICBpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVVJJKHJlc291cmNlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGxvZy5pbmZvKCJBQVJCYXNlZFdTRExMb2NhdG9yOiBVbmFibGUgdG8gcmVzb2x2ZSAiICsgbGFzdEltcG9ydExvY2F0aW9uKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L3Jlc29sdmVyL1dhckZpbGVCYXNlZFVSSVJlc29sdmVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9yZXNvbHZlci9XYXJGaWxlQmFzZWRVUklSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMGY2ZmY0Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L3Jlc29sdmVyL1dhckZpbGVCYXNlZFVSSVJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC5yZXNvbHZlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEucmVzb2x2ZXIuRGVmYXVsdFVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotCi1pbXBvcnQgamF2YS5uZXQuVVJJOwotCi1wdWJsaWMgY2xhc3MgV2FyRmlsZUJhc2VkVVJJUmVzb2x2ZXIgZXh0ZW5kcyBEZWZhdWx0VVJJUmVzb2x2ZXIgewotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeQotICAgICAgICAgICAgLmdldExvZyhXYXJGaWxlQmFzZWRVUklSZXNvbHZlci5jbGFzcyk7Ci0KLSAgICBwcml2YXRlIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyOwotCi0gICAgcHVibGljIFdhckZpbGVCYXNlZFVSSVJlc29sdmVyKENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKSB7Ci0gICAgICAgIHRoaXMuY2xhc3NMb2FkZXIgPSBjbGFzc0xvYWRlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSW5wdXRTb3VyY2UgcmVzb2x2ZUVudGl0eSgKLSAgICAgICAgICAgIFN0cmluZyB0YXJnZXROYW1lc3BhY2UsCi0gICAgICAgICAgICBTdHJpbmcgc2NoZW1hTG9jYXRpb24sCi0gICAgICAgICAgICBTdHJpbmcgYmFzZVVyaSkgewotICAgICAgICAvL25vIGlzc3VlIHdpdGgKLSAgICAgICAgaWYgKGlzQWJzb2x1dGUoc2NoZW1hTG9jYXRpb24pKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3VwZXIucmVzb2x2ZUVudGl0eSgKLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlLCBzY2hlbWFMb2NhdGlvbiwgYmFzZVVyaSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvL3ZhbGlkYXRlCi0gICAgICAgICAgICBpZiAoKGJhc2VVcmkgPT0gbnVsbCB8fCAiIi5lcXVhbHMoYmFzZVVyaSkpICYmIHNjaGVtYUxvY2F0aW9uLnN0YXJ0c1dpdGgoIi4uIikpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICJVbnN1cHBvcnRlZCBzY2hlbWEgbG9jYXRpb24gIiArIHNjaGVtYUxvY2F0aW9uKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgVVJJIGxhc3RJbXBvcnRMb2NhdGlvbiA9IFVSSS5jcmVhdGUoYmFzZVVyaSkucmVzb2x2ZShzY2hlbWFMb2NhdGlvbik7Ci0gICAgICAgICAgICBTdHJpbmcgc2VhcmNoaW5nU3RyID0gbGFzdEltcG9ydExvY2F0aW9uLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IElucHV0U291cmNlKGNsYXNzTG9hZGVyLmdldFJlc291cmNlQXNTdHJlYW0oc2VhcmNoaW5nU3RyKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L3NjaGVkdWxlci9EZXBsb3ltZW50SXRlcmF0b3IuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L3NjaGVkdWxlci9EZXBsb3ltZW50SXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDEyZmFjMi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9zY2hlZHVsZXIvRGVwbG95bWVudEl0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LnNjaGVkdWxlcjsKLQotaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLQotcHVibGljIGNsYXNzIERlcGxveW1lbnRJdGVyYXRvciB7Ci0gICAgcHJpdmF0ZSBDYWxlbmRhciBjYWxlbmRhciA9IENhbGVuZGFyLmdldEluc3RhbmNlKCk7Ci0KLSAgICBwdWJsaWMgRGF0ZSBuZXh0KCkgewotICAgICAgICBjYWxlbmRhci5hZGQoQ2FsZW5kYXIuU0VDT05ELCAxMCk7Ci0KLSAgICAgICAgcmV0dXJuIGNhbGVuZGFyLmdldFRpbWUoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9zY2hlZHVsZXIvU2NoZWR1bGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9zY2hlZHVsZXIvU2NoZWR1bGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlMjhjM2QuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvc2NoZWR1bGVyL1NjaGVkdWxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC5zY2hlZHVsZXI7Ci0KLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci1pbXBvcnQgamF2YS51dGlsLlRpbWVyOwotaW1wb3J0IGphdmEudXRpbC5UaW1lclRhc2s7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKLQotcHVibGljIGNsYXNzIFNjaGVkdWxlciB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBUaW1lciB0aW1lciA9IChUaW1lcilBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEFjdGlvbigpIHsKLSAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFRpbWVyKHRydWUpOwotICAgICAgICB9Ci0gICAgfSk7Ci0KLSAgICBwcml2YXRlIHZvaWQgcmVzY2hlZHVsZShTY2hlZHVsZXJUYXNrIHNjaGVkdWxlclRhc2ssIERlcGxveW1lbnRJdGVyYXRvciBpdGVyYXRvcikgewotICAgICAgICBEYXRlIHRpbWUgPSBpdGVyYXRvci5uZXh0KCk7Ci0KLSAgICAgICAgaWYgKHRpbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgc2NoZWR1bGVyVGFzay5jYW5jZWwoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAoc2NoZWR1bGVyVGFzay5sb2NrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNjaGVkdWxlclRhc2suc3RhdGUgIT0gU2NoZWR1bGVyVGFzay5DQU5DRUxMRUQpIHsKLSAgICAgICAgICAgICAgICAgICAgc2NoZWR1bGVyVGFzay50aW1lclRhc2sgPSBuZXcgU2NoZWR1bGVyVGltZXJUYXNrKHNjaGVkdWxlclRhc2ssIGl0ZXJhdG9yKTsKLSAgICAgICAgICAgICAgICAgICAgdGltZXIuc2NoZWR1bGUoc2NoZWR1bGVyVGFzay50aW1lclRhc2ssIHRpbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNjaGVkdWxlcyB0aGUgc3BlY2lmaWVkIHRhc2sgZm9yIGV4ZWN1dGlvbiBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBzY2hlZHVsZS4KLSAgICAgKiBJZiB0aW1lcyBzcGVjaWZpZWQgYnkgdGhlIDxjb2RlPlNjaGVkdWxlSXRlcmF0b3I8L2NvZGU+IGFyZSBpbiB0aGUgcGFzdCB0aGV5IGFyZQotICAgICAqIHNjaGVkdWxlZCBmb3IgaW1tZWRpYXRlIGV4ZWN1dGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzY2hlZHVsZXJUYXNrIHRhc2sgdG8gYmUgc2NoZWR1bGVkCi0gICAgICogQHBhcmFtIGl0ZXJhdG9yICAgICAgaXRlcmF0b3IgdGhhdCBkZXNjcmliZXMgdGhlIHNjaGVkdWxlCi0gICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGFzayB3YXMgYWxyZWFkeSBzY2hlZHVsZWQgb3IgY2FuY2VsbGVkLAotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVkdWxlciB3YXMgY2FuY2VsbGVkLCBvciBzY2hlZHVsZXIgdGhyZWFkIHRlcm1pbmF0ZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2NoZWR1bGUoU2NoZWR1bGVyVGFzayBzY2hlZHVsZXJUYXNrLCBEZXBsb3ltZW50SXRlcmF0b3IgaXRlcmF0b3IpIHsKLSAgICAgICAgRGF0ZSB0aW1lID0gaXRlcmF0b3IubmV4dCgpOwotCi0gICAgICAgIGlmICh0aW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIHNjaGVkdWxlclRhc2suY2FuY2VsKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHNjaGVkdWxlclRhc2subG9jaykgewotICAgICAgICAgICAgICAgIHNjaGVkdWxlclRhc2suc3RhdGUgPSBTY2hlZHVsZXJUYXNrLlNDSEVEVUxFRDsKLSAgICAgICAgICAgICAgICBzY2hlZHVsZXJUYXNrLnRpbWVyVGFzayA9IG5ldyBTY2hlZHVsZXJUaW1lclRhc2soc2NoZWR1bGVyVGFzaywgaXRlcmF0b3IpOwotICAgICAgICAgICAgICAgIHRpbWVyLnNjaGVkdWxlKHNjaGVkdWxlclRhc2sudGltZXJUYXNrLCB0aW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNsZWFudXAoKXsKLSAgICAgICAgdGltZXIuY2FuY2VsKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGNsYXNzIFNjaGVkdWxlclRpbWVyVGFzayBleHRlbmRzIFRpbWVyVGFzayB7Ci0gICAgICAgIHByaXZhdGUgRGVwbG95bWVudEl0ZXJhdG9yIGl0ZXJhdG9yOwotICAgICAgICBwcml2YXRlIFNjaGVkdWxlclRhc2sgc2NoZWR1bGVyVGFzazsKLQotICAgICAgICBwdWJsaWMgU2NoZWR1bGVyVGltZXJUYXNrKFNjaGVkdWxlclRhc2sgc2NoZWR1bGVyVGFzaywgRGVwbG95bWVudEl0ZXJhdG9yIGl0ZXJhdG9yKSB7Ci0gICAgICAgICAgICB0aGlzLnNjaGVkdWxlclRhc2sgPSBzY2hlZHVsZXJUYXNrOwotICAgICAgICAgICAgdGhpcy5pdGVyYXRvciA9IGl0ZXJhdG9yOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgc2NoZWR1bGVyVGFzay5ydW4oKTsKLSAgICAgICAgICAgIHJlc2NoZWR1bGUoc2NoZWR1bGVyVGFzaywgaXRlcmF0b3IpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvc2NoZWR1bGVyL1NjaGVkdWxlclRhc2suamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L3NjaGVkdWxlci9TY2hlZHVsZXJUYXNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzYzU1YTguLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvc2NoZWR1bGVyL1NjaGVkdWxlclRhc2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQuc2NoZWR1bGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LlJlcG9zaXRvcnlMaXN0ZW5lcjsKLQotaW1wb3J0IGphdmEudXRpbC5UaW1lclRhc2s7Ci0KLXB1YmxpYyBjbGFzcyBTY2hlZHVsZXJUYXNrIGltcGxlbWVudHMgUnVubmFibGUgewotICAgIHN0YXRpYyBmaW5hbCBpbnQgU0NIRURVTEVEID0gMTsKLSAgICBzdGF0aWMgZmluYWwgaW50IENBTkNFTExFRCA9IDI7Ci0gICAgZmluYWwgT2JqZWN0IGxvY2sgPSBuZXcgT2JqZWN0KCk7Ci0gICAgaW50IHN0YXRlID0gMDsKLSAgICBUaW1lclRhc2sgdGltZXJUYXNrOwotICAgIHByaXZhdGUgUmVwb3NpdG9yeUxpc3RlbmVyIHdzTGlzdGVuZXI7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IHNjaGVkdWxlciB0YXNrLgotICAgICAqLwotICAgIHB1YmxpYyBTY2hlZHVsZXJUYXNrKFJlcG9zaXRvcnlMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICB0aGlzLndzTGlzdGVuZXIgPSBsaXN0ZW5lcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYW5jZWxzIHRoaXMgc2NoZWR1bGVyIHRhc2suCi0gICAgICogPHAvPgotICAgICAqIFRoaXMgbWV0aG9kIG1heSBiZSBjYWxsZWQgcmVwZWF0ZWRseTsgdGhlIHNlY29uZCBhbmQgc3Vic2VxdWVudCBjYWxscyBoYXZlIG5vIGVmZmVjdC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gUmV0dXJucyB0cnVlIGlmIHRoaXMgdGFzayB3YXMgYWxyZWFkeSBzY2hlZHVsZWQgdG8gcnVuLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGNhbmNlbCgpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChsb2NrKSB7Ci0gICAgICAgICAgICBpZiAodGltZXJUYXNrICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aW1lclRhc2suY2FuY2VsKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gKHN0YXRlID09IFNDSEVEVUxFRCk7Ci0KLSAgICAgICAgICAgIHN0YXRlID0gQ0FOQ0VMTEVEOwotCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrUmVwb3NpdG9yeSgpIHsKLSAgICAgICAgd3NMaXN0ZW5lci5zdGFydExpc3RlbmVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIGFjdGlvbiB0byBiZSBwZXJmb3JtZWQgYnkgdGhpcyBzY2hlZHVsZXIgdGFzay4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgIGNoZWNrUmVwb3NpdG9yeSgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L3V0aWwvQmVhbkV4Y2x1ZGVJbmZvLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC91dGlsL0JlYW5FeGNsdWRlSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Njk1ODI4Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L3V0aWwvQmVhbkV4Y2x1ZGVJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC51dGlsOwotCi0vKioKLSAqIHRoaXMgY2xhc3MgaXMgdXNlZCB0byBrZWVwIHRoZSBleGNsdWRlUHJvcGVydGllcyBhbmQgaW5jbHVkZVByb3BlcnRlcwotICogb2YgdGhlIGdpdmVuIGJlYW4gd2hlbiBnZW5lcmF0aW5nIHRoZSB3c2RsLCBhbmQgc2VyaWFsaXppbmcuCi0gKi8KLXB1YmxpYyBjbGFzcyBCZWFuRXhjbHVkZUluZm8gewotCi0gICAgLy8gZXhjbHVkZSBwcm9wZXJ0eSBsaXN0IGdpdmVuIGFzIGEgcmVndWFsYXIgZXhwcmVzc2lvbgotICAgIC8vIGJ1dCB3ZSBleGNsdWRlIHRoaXMgcHJvcGVydHkgb25seSBpZiBpdCBpcyBub3QgYXZhaWxhYmxlCi0gICAgLy8gaW4gdGhlIGluY2x1ZGUgcHJvcGVydGllcyBsaXN0Ci0gICAgcHJpdmF0ZSBTdHJpbmcgZXhjbHVkZVByb3BlcnRpZXM7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgaW5jbHVkZVByb3BlcnRpZXM7Ci0KLSAgICBwdWJsaWMgQmVhbkV4Y2x1ZGVJbmZvKFN0cmluZyBleGNsdWRlUHJvcGVydGllcywgU3RyaW5nIGluY2x1ZGVQcm9wZXJ0aWVzKSB7Ci0gICAgICAgIHRoaXMuZXhjbHVkZVByb3BlcnRpZXMgPSBleGNsdWRlUHJvcGVydGllczsKLSAgICAgICAgdGhpcy5pbmNsdWRlUHJvcGVydGllcyA9IGluY2x1ZGVQcm9wZXJ0aWVzOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXhjbHVkZVByb3BlcnRpZXMoKSB7Ci0gICAgICAgIHJldHVybiBleGNsdWRlUHJvcGVydGllczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRFeGNsdWRlUHJvcGVydGllcyhTdHJpbmcgZXhjbHVkZVByb3BlcnRpZXMpIHsKLSAgICAgICAgdGhpcy5leGNsdWRlUHJvcGVydGllcyA9IGV4Y2x1ZGVQcm9wZXJ0aWVzOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW5jbHVkZVByb3BlcnRpZXMoKSB7Ci0gICAgICAgIHJldHVybiBpbmNsdWRlUHJvcGVydGllczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRJbmNsdWRlUHJvcGVydGllcyhTdHJpbmcgaW5jbHVkZVByb3BlcnRpZXMpIHsKLSAgICAgICAgdGhpcy5pbmNsdWRlUHJvcGVydGllcyA9IGluY2x1ZGVQcm9wZXJ0aWVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGEgcHJvcGVydHkgaXMgZXhjbHVkZWQgaWYgaXQgdGhzIGdpdmVuIGluIHRoZSBleGNsdWRlIGxpc3QKLSAgICAgKiBidXQgbm90IGluIGluY2x1ZGUgbGlzdAotICAgICAqIEBwYXJhbSBwcm9wZXJ0eQotICAgICAqIEByZXR1cm4gaXMgZXhjbHVkZSB0aGUgcHJvcGVydHkgb3Igbm90Ci0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNFeGNsdWRlZFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eSl7Ci0gICAgICAgYm9vbGVhbiBpc0V4Y2x1ZGUgPSBmYWxzZTsKLSAgICAgICBpZiAoKGV4Y2x1ZGVQcm9wZXJ0aWVzICE9IG51bGwpICYmIChleGNsdWRlUHJvcGVydGllcy50cmltKCkubGVuZ3RoKCkgPiAwKSl7Ci0gICAgICAgICAgIGlmIChwcm9wZXJ0eS5tYXRjaGVzKGV4Y2x1ZGVQcm9wZXJ0aWVzKSl7Ci0gICAgICAgICAgICAgICBpc0V4Y2x1ZGUgPSB0cnVlOwotICAgICAgICAgICAgICAgaWYgKChpbmNsdWRlUHJvcGVydGllcyAhPSBudWxsKSAmJiAoaW5jbHVkZVByb3BlcnRpZXMudHJpbSgpLmxlbmd0aCgpID4gMCkpewotICAgICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eS5tYXRjaGVzKGluY2x1ZGVQcm9wZXJ0aWVzKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgIGlzRXhjbHVkZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgfQotICAgICAgIH0KLSAgICAgICByZXR1cm4gaXNFeGNsdWRlOwotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC91dGlsL0V4Y2x1ZGVJbmZvLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC91dGlsL0V4Y2x1ZGVJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMWM2OWQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvdXRpbC9FeGNsdWRlSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIHRoaXMgY2xhc3MgaXMgdXNlZCB0byBrZWVwIHRoZSBleGNsdWRlIHByb3BlcnR5IGRldGFpbHMgb2YgYWxsIHRoZSBjbGFzc2VzLgotICogQSBtYXAgb2JqZWN0IGlzIHVzZWQgdG8gbWFwIHRoZSBjbGFzcyBuYW1lIHRvIGFuIGJlYW5JbmZvIG9iamVjdC4gaGVyZSB0aGUgY2xhc3MgbmFtZSBpcwotICogYWNjdHVhbGx5IGEgcmVndWxhciBleHByZXNzaW9uCi0gKgotICovCi1wdWJsaWMgY2xhc3MgRXhjbHVkZUluZm8gewotCi0gICAgcHJpdmF0ZSBNYXAgY2xhc3NOYW1lVG9CZWFuSW5mb01hcDsKLQotICAgIHB1YmxpYyBFeGNsdWRlSW5mbygpIHsKLSAgICAgICAgdGhpcy5jbGFzc05hbWVUb0JlYW5JbmZvTWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwdXRCZWFuSW5mbyhTdHJpbmcgY2xhc3NOYW1lUmVneCxCZWFuRXhjbHVkZUluZm8gYmVhbkV4Y2x1ZGVJbmZvKXsKLSAgICAgICAgdGhpcy5jbGFzc05hbWVUb0JlYW5JbmZvTWFwLnB1dChjbGFzc05hbWVSZWd4LGJlYW5FeGNsdWRlSW5mbyk7Ci0gICAgfQotCi0gICAgcHVibGljIEJlYW5FeGNsdWRlSW5mbyBnZXRCZWFuRXhjbHVkZUluZm9Gb3JDbGFzcyhTdHJpbmcgY2xhc3NOYW1lKXsKLSAgICAgICAgLy8gaGVyZSBtYXAga2V5cyByZXByZXNlbnRzIHRoZSByZWd1YWxyIGV4cHJlc3Npb25zIGZvciBjbGFzcyBuYW1lcwotICAgICAgICAvLyBzbyB3ZSBoYXZlIHRvIGl0ZXJhdGUgdGhyb3VnaCB0aGUga2V5cyBhbmQgZmluZCB0aGUgYmVhbkluZm8gb2JqZWN0Ci0gICAgICAgIFN0cmluZyBjbGFzc05hbWVSZWd4ID0gbnVsbDsKLSAgICAgICAgQmVhbkV4Y2x1ZGVJbmZvIGJlYW5FeGNsdWRlSW5mbyA9IG51bGw7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHRoaXMuY2xhc3NOYW1lVG9CZWFuSW5mb01hcC5rZXlTZXQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspewotICAgICAgICAgICAgIGNsYXNzTmFtZVJlZ3ggPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICBpZiAoY2xhc3NOYW1lLm1hdGNoZXMoY2xhc3NOYW1lUmVneCkpewotICAgICAgICAgICAgICAgICBiZWFuRXhjbHVkZUluZm8gPSAoQmVhbkV4Y2x1ZGVJbmZvKSB0aGlzLmNsYXNzTmFtZVRvQmVhbkluZm9NYXAuZ2V0KGNsYXNzTmFtZVJlZ3gpOwotICAgICAgICAgICAgICAgICAvLyB0aGlzIG1lYW5zIHdlIGhhdmUgZmluZCB0aGUgcmVxdWlyZWQgb2JqZWN0Ci0gICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYmVhbkV4Y2x1ZGVJbmZvOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvdXRpbC9QaGFzZXNJbmZvLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC91dGlsL1BoYXNlc0luZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThmNjVkMS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC91dGlsL1BoYXNlc0luZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQuRGVwbG95bWVudEVycm9yTXNnczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQuRGVwbG95bWVudEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5IYW5kbGVyRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuSGFuZGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5QaGFzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmkxOG4uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5waGFzZXJlc29sdmVyLlBoYXNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucGhhc2VyZXNvbHZlci5QaGFzZU1ldGFkYXRhOwotCi1wdWJsaWMgY2xhc3MgUGhhc2VzSW5mbyB7Ci0gICAgcHJpdmF0ZSBMaXN0PFBoYXNlPiBJTlBoYXNlczsKLSAgICBwcml2YXRlIExpc3Q8UGhhc2U+IElOX0ZhdWx0UGhhc2VzOwotICAgIHByaXZhdGUgTGlzdDxQaGFzZT4gT1VUUGhhc2VzOwotICAgIHByaXZhdGUgTGlzdDxQaGFzZT4gT1VUX0ZhdWx0UGhhc2VzOwotCi0gICAgcHVibGljIFBoYXNlc0luZm8oKSB7Ci0gICAgICAgIElOUGhhc2VzID0gbmV3IEFycmF5TGlzdDxQaGFzZT4oKTsKLSAgICAgICAgSU5fRmF1bHRQaGFzZXMgPSBuZXcgQXJyYXlMaXN0PFBoYXNlPigpOwotICAgICAgICBPVVRQaGFzZXMgPSBuZXcgQXJyYXlMaXN0PFBoYXNlPigpOwotICAgICAgICBPVVRfRmF1bHRQaGFzZXMgPSBuZXcgQXJyYXlMaXN0PFBoYXNlPigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRvIGNvcHkgcGhhc2UgaW5mb3JtYXRpb24gZnJvbSBvbmUgdG8gYW5vdGhlcgotICAgICAqCi0gICAgICogQHBhcmFtIHBoYXNlCi0gICAgICovCi0gICAgcHJpdmF0ZSBQaGFzZSBjb3B5UGhhc2UoUGhhc2UgcGhhc2UpIHRocm93cyBEZXBsb3ltZW50RXhjZXB0aW9uIHsKLSAgICAgICAgUGhhc2UgbmV3UGhhc2UgPSBuZXcgUGhhc2UocGhhc2UuZ2V0UGhhc2VOYW1lKCkpOwotICAgICAgICBJdGVyYXRvcjxIYW5kbGVyPiBoYW5kbGVycyA9IHBoYXNlLmdldEhhbmRsZXJzKCkuaXRlcmF0b3IoKTsKLQotICAgICAgICB3aGlsZSAoaGFuZGxlcnMuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIEhhbmRsZXIgaGFuZGxlckRlc2NyaXB0aW9uID0gKEhhbmRsZXIpIGhhbmRsZXJzLm5leHQoKTsKLQotICAgICAgICAgICAgICAgIG5ld1BoYXNlLmFkZEhhbmRsZXIoaGFuZGxlckRlc2NyaXB0aW9uLmdldEhhbmRsZXJEZXNjKCkpOwotICAgICAgICAgICAgfSBjYXRjaCAoUGhhc2VFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG5ld1BoYXNlOwotICAgIH0KLQotICAgIEhhbmRsZXJEZXNjcmlwdGlvbiBtYWtlSGFuZGxlcihPTUVsZW1lbnQgaGFuZGxlckVsZW1lbnQpIHsKLSAgICAgICAgU3RyaW5nIG5hbWUgPSBoYW5kbGVyRWxlbWVudC5nZXRBdHRyaWJ1dGVWYWx1ZShuZXcgUU5hbWUoIm5hbWUiKSk7Ci0gICAgICAgIFFOYW1lIHFuYW1lID0gaGFuZGxlckVsZW1lbnQucmVzb2x2ZVFOYW1lKG5hbWUpOwotICAgICAgICBIYW5kbGVyRGVzY3JpcHRpb24gZGVzYyA9IG5ldyBIYW5kbGVyRGVzY3JpcHRpb24ocW5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gaGFuZGxlckVsZW1lbnQuZ2V0QXR0cmlidXRlVmFsdWUobmV3IFFOYW1lKCJjbGFzcyIpKTsKLQotICAgICAgICBkZXNjLnNldENsYXNzTmFtZShjbGFzc05hbWUpOwotCi0gICAgICAgIHJldHVybiBkZXNjOwotICAgIH0KLQotICAgIHB1YmxpYyBQaGFzZSBtYWtlUGhhc2UoT01FbGVtZW50IHBoYXNlRWxlbWVudCkgdGhyb3dzIFBoYXNlRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHBoYXNlTmFtZSA9IHBoYXNlRWxlbWVudC5nZXRBdHRyaWJ1dGVWYWx1ZShuZXcgUU5hbWUoIm5hbWUiKSk7Ci0gICAgICAgIFBoYXNlIHBoYXNlID0gbmV3IFBoYXNlKHBoYXNlTmFtZSk7Ci0gICAgICAgIEl0ZXJhdG9yIGNoaWxkcmVuID0gcGhhc2VFbGVtZW50LmdldENoaWxkRWxlbWVudHMoKTsKLQotICAgICAgICB3aGlsZSAoY2hpbGRyZW4uaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgaGFuZGxlckVsZW1lbnQgPSAoT01FbGVtZW50KSBjaGlsZHJlbi5uZXh0KCk7Ci0gICAgICAgICAgICBIYW5kbGVyRGVzY3JpcHRpb24gaGFuZGxlckRlc2MgPSBtYWtlSGFuZGxlcihoYW5kbGVyRWxlbWVudCk7Ci0KLSAgICAgICAgICAgIHBoYXNlLmFkZEhhbmRsZXIoaGFuZGxlckRlc2MpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHBoYXNlOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PFBoYXNlPiBnZXRHbG9iYWxJbmZsb3coKSB0aHJvd3MgRGVwbG95bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIEFycmF5TGlzdDxQaGFzZT4gZ2xvYmFscGhhc2UgPSBuZXcgQXJyYXlMaXN0PFBoYXNlPigpOwotICAgICAgICBib29sZWFuIGZvdW5kRGlzcGF0Y2hQaGFzZSA9IGZhbHNlOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IElOUGhhc2VzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBQaGFzZSBwaGFzZSA9IChQaGFzZSkgSU5QaGFzZXMuZ2V0KGkpOwotICAgICAgICAgICAgU3RyaW5nIHBoYXNlTmFtZSA9IHBoYXNlLmdldFBoYXNlTmFtZSgpOwotICAgICAgICAgICAgaWYgKCFmb3VuZERpc3BhdGNoUGhhc2UpIHsKLSAgICAgICAgICAgICAgICBpZiAoUGhhc2VNZXRhZGF0YS5QSEFTRV9ESVNQQVRDSC5lcXVhbHMocGhhc2VOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICBmb3VuZERpc3BhdGNoUGhhc2UgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBnbG9iYWxwaGFzZS5hZGQocGhhc2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICghZm91bmREaXNwYXRjaFBoYXNlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZ2V0TWVzc2FnZShEZXBsb3ltZW50RXJyb3JNc2dzLkRJU1BBVENIX1BIQVNFX05PVF9GT1VORCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBnbG9iYWxwaGFzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxQaGFzZT4gZ2V0R2xvYmFsT3V0UGhhc2VMaXN0KCkgdGhyb3dzIERlcGxveW1lbnRFeGNlcHRpb24gewotICAgICAgICAvKioKLSAgICAgICAgICogSSBoYXZlIGFzc3VtZWQgdGhhdCAgICAgUG9saWN5RGV0ZXJtaW5hdGlvbiBhbmQgIE1lc3NhZ2VQcm9jZXNzaW5nIGFyZSBnbG9iYWwgb3V0IHBoYXNlCi0gICAgICAgICAqLwotICAgICAgICBBcnJheUxpc3Q8UGhhc2U+IGdsb2JhbFBoYXNlTGlzdCA9IG5ldyBBcnJheUxpc3Q8UGhhc2U+KCk7Ci0KLSAgICAgICAgYm9vbGVhbiBtZXNzYWdlT3V0ID0gZmFsc2U7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgT1VUUGhhc2VzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBQaGFzZSBwaGFzZSA9IChQaGFzZSkgT1VUUGhhc2VzLmdldChpKTsKLSAgICAgICAgICAgIFN0cmluZyBwaGFzZU5hbWUgPSBwaGFzZS5nZXRQaGFzZU5hbWUoKTsKLSAgICAgICAgICAgIGlmICghbWVzc2FnZU91dCkgewotICAgICAgICAgICAgICAgIGlmIChQaGFzZU1ldGFkYXRhLlBIQVNFX01FU1NBR0VfT1VULmVxdWFscyhwaGFzZU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VPdXQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBnbG9iYWxQaGFzZUxpc3QuYWRkKGNvcHlQaGFzZShwaGFzZSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZ2xvYmFsUGhhc2VMaXN0LmFkZChjb3B5UGhhc2UocGhhc2UpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZ2xvYmFsUGhhc2VMaXN0OwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PFBoYXNlPiBnZXRJTlBoYXNlcygpIHsKLSAgICAgICAgcmV0dXJuIElOUGhhc2VzOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PFBoYXNlPiBnZXRJTl9GYXVsdFBoYXNlcygpIHsKLSAgICAgICAgcmV0dXJuIElOX0ZhdWx0UGhhc2VzOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PFBoYXNlPiBnZXRPVVRQaGFzZXMoKSB7Ci0gICAgICAgIHJldHVybiBPVVRQaGFzZXM7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8UGhhc2U+IGdldE91dEZhdWx0UGhhc2VMaXN0KCl7Ci0gICAgICAgIHJldHVybiBPVVRfRmF1bHRQaGFzZXM7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8UGhhc2U+IGdldE9VVF9GYXVsdFBoYXNlcygpIHRocm93cyBEZXBsb3ltZW50RXhjZXB0aW9uIHsKLSAgICAgICAgQXJyYXlMaXN0PFBoYXNlPiBnbG9iYWxQaGFzZUxpc3QgPSBuZXcgQXJyYXlMaXN0PFBoYXNlPigpOwotICAgICAgICBib29sZWFuIG1lc3NhZ2VPdXQgPSBmYWxzZTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBPVVRfRmF1bHRQaGFzZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIFBoYXNlIHBoYXNlID0gKFBoYXNlKSBPVVRfRmF1bHRQaGFzZXMuZ2V0KGkpOwotICAgICAgICAgICAgU3RyaW5nIHBoYXNlTmFtZSA9IHBoYXNlLmdldFBoYXNlTmFtZSgpOwotICAgICAgICAgICAgaWYgKCFtZXNzYWdlT3V0KSB7Ci0gICAgICAgICAgICAgICAgaWYgKFBoYXNlTWV0YWRhdGEuUEhBU0VfTUVTU0FHRV9PVVQuZXF1YWxzKHBoYXNlTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgbWVzc2FnZU91dCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGdsb2JhbFBoYXNlTGlzdC5hZGQoY29weVBoYXNlKHBoYXNlKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBnbG9iYWxQaGFzZUxpc3QuYWRkKGNvcHlQaGFzZShwaGFzZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBnbG9iYWxQaGFzZUxpc3Q7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8UGhhc2U+IGdldE9wZXJhdGlvbkluRmF1bHRQaGFzZXMoKSB0aHJvd3MgRGVwbG95bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIEFycmF5TGlzdDxQaGFzZT4gb3BlcmF0aW9uSU5QaGFzZXMgPSBuZXcgQXJyYXlMaXN0PFBoYXNlPigpOwotICAgICAgICBib29sZWFuIGZvdW5kRGlzcGF0aFBoYXNlID0gZmFsc2U7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgSU5fRmF1bHRQaGFzZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIFBoYXNlIHBoYXNlID0gKFBoYXNlKSBJTl9GYXVsdFBoYXNlcy5nZXQoaSk7Ci0gICAgICAgICAgICBTdHJpbmcgcGhhc2VOYW1lID0gcGhhc2UuZ2V0UGhhc2VOYW1lKCk7Ci0gICAgICAgICAgICBpZiAoZm91bmREaXNwYXRoUGhhc2UpIHsKLSAgICAgICAgICAgICAgICBvcGVyYXRpb25JTlBoYXNlcy5hZGQoY29weVBoYXNlKHBoYXNlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoUGhhc2VNZXRhZGF0YS5QSEFTRV9ESVNQQVRDSC5lcXVhbHMocGhhc2VOYW1lKSkgewotICAgICAgICAgICAgICAgIGZvdW5kRGlzcGF0aFBoYXNlID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gb3BlcmF0aW9uSU5QaGFzZXM7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8UGhhc2U+IGdldEdsb2JhbEluRmF1bHRQaGFzZXMoKSB0aHJvd3MgRGVwbG95bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIEFycmF5TGlzdDxQaGFzZT4gZ2xvYmFsSW5mYXVsdHBoYXNlID0gbmV3IEFycmF5TGlzdDxQaGFzZT4oKTsKLSAgICAgICAgYm9vbGVhbiBmb3VuZERpc3BhdGNoUGhhc2UgPSBmYWxzZTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBJTl9GYXVsdFBoYXNlcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgUGhhc2UgcGhhc2UgPSAoUGhhc2UpIElOX0ZhdWx0UGhhc2VzLmdldChpKTsKLSAgICAgICAgICAgIFN0cmluZyBwaGFzZU5hbWUgPSBwaGFzZS5nZXRQaGFzZU5hbWUoKTsKLSAgICAgICAgICAgIGlmICghZm91bmREaXNwYXRjaFBoYXNlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKFBoYXNlTWV0YWRhdGEuUEhBU0VfRElTUEFUQ0guZXF1YWxzKHBoYXNlTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgZm91bmREaXNwYXRjaFBoYXNlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZ2xvYmFsSW5mYXVsdHBoYXNlLmFkZChwaGFzZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFmb3VuZERpc3BhdGNoUGhhc2UpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRNZXNzYWdlKERlcGxveW1lbnRFcnJvck1zZ3MuRElTUEFUQ0hfUEhBU0VfTk9UX0ZPVU5EKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGdsb2JhbEluZmF1bHRwaGFzZTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyBBcnJheUxpc3Q8UGhhc2U+IGdldE9wZXJhdGlvbkluUGhhc2VzKCkgdGhyb3dzIERlcGxveW1lbnRFeGNlcHRpb24gewotICAgICAgICBBcnJheUxpc3Q8UGhhc2U+IG9wZXJhdGlvbklOUGhhc2VzID0gbmV3IEFycmF5TGlzdDxQaGFzZT4oKTsKLSAgICAgICAgYm9vbGVhbiBmb3VuZERpc3BhdGhQaGFzZSA9IGZhbHNlOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IElOUGhhc2VzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBQaGFzZSBwaGFzZSA9IChQaGFzZSkgSU5QaGFzZXMuZ2V0KGkpOwotICAgICAgICAgICAgU3RyaW5nIHBoYXNlTmFtZSA9IHBoYXNlLmdldFBoYXNlTmFtZSgpOwotICAgICAgICAgICAgaWYgKGZvdW5kRGlzcGF0aFBoYXNlKSB7Ci0gICAgICAgICAgICAgICAgb3BlcmF0aW9uSU5QaGFzZXMuYWRkKGNvcHlQaGFzZShwaGFzZSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKFBoYXNlTWV0YWRhdGEuUEhBU0VfRElTUEFUQ0guZXF1YWxzKHBoYXNlTmFtZSkpIHsKLSAgICAgICAgICAgICAgICBmb3VuZERpc3BhdGhQaGFzZSA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG9wZXJhdGlvbklOUGhhc2VzOwotICAgIH0KLQotICAgIHB1YmxpYyBBcnJheUxpc3Q8UGhhc2U+IGdldE9wZXJhdGlvbk91dEZhdWx0UGhhc2VzKCkgdGhyb3dzIERlcGxveW1lbnRFeGNlcHRpb24gewotICAgICAgICBBcnJheUxpc3Q8UGhhc2U+IG9wZXJhdGlvbkZhdWx0T3V0UGhhc2VzID0gbmV3IEFycmF5TGlzdDxQaGFzZT4oKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBPVVRfRmF1bHRQaGFzZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIFBoYXNlIHBoYXNlID0gKFBoYXNlKSBPVVRfRmF1bHRQaGFzZXMuZ2V0KGkpOwotICAgICAgICAgICAgU3RyaW5nIHBoYXNlTmFtZSA9IHBoYXNlLmdldFBoYXNlTmFtZSgpOwotICAgICAgICAgICAgaWYgKFBoYXNlTWV0YWRhdGEuUEhBU0VfTUVTU0FHRV9PVVQuZXF1YWxzKHBoYXNlTmFtZSkpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG9wZXJhdGlvbkZhdWx0T3V0UGhhc2VzLmFkZChjb3B5UGhhc2UocGhhc2UpKTsKLQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBvcGVyYXRpb25GYXVsdE91dFBoYXNlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXJyYXlMaXN0PFBoYXNlPiBnZXRPcGVyYXRpb25PdXRQaGFzZXMoKSB0aHJvd3MgRGVwbG95bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIEFycmF5TGlzdDxQaGFzZT4gb3ByYXRpb25PVVRQaGFzZXMgPSBuZXcgQXJyYXlMaXN0PFBoYXNlPigpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgT1VUUGhhc2VzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBQaGFzZSBwaGFzZSA9IChQaGFzZSkgT1VUUGhhc2VzLmdldChpKTsKLSAgICAgICAgICAgIFN0cmluZyBwaGFzZU5hbWUgPSBwaGFzZS5nZXRQaGFzZU5hbWUoKTsKLSAgICAgICAgICAgIGlmIChQaGFzZU1ldGFkYXRhLlBIQVNFX01FU1NBR0VfT1VULmVxdWFscyhwaGFzZU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvcHJhdGlvbk9VVFBoYXNlcy5hZGQoY29weVBoYXNlKHBoYXNlKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gb3ByYXRpb25PVVRQaGFzZXM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SU5QaGFzZXMoTGlzdDxQaGFzZT4gSU5QaGFzZXMpIHsKLSAgICAgICAgdGhpcy5JTlBoYXNlcyA9IElOUGhhc2VzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldElOX0ZhdWx0UGhhc2VzKExpc3Q8UGhhc2U+IElOX0ZhdWx0UGhhc2VzKSB7Ci0gICAgICAgIHRoaXMuSU5fRmF1bHRQaGFzZXMgPSBJTl9GYXVsdFBoYXNlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRPVVRQaGFzZXMoTGlzdDxQaGFzZT4gT1VUUGhhc2VzKSB7Ci0gICAgICAgIHRoaXMuT1VUUGhhc2VzID0gT1VUUGhhc2VzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE9VVF9GYXVsdFBoYXNlcyhMaXN0PFBoYXNlPiBPVVRfRmF1bHRQaGFzZXMpIHsKLSAgICAgICAgdGhpcy5PVVRfRmF1bHRQaGFzZXMgPSBPVVRfRmF1bHRQaGFzZXM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0T3BlcmF0aW9uUGhhc2VzKEF4aXNPcGVyYXRpb24gYXhpc09wZXJhdGlvbikgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIGlmIChheGlzT3BlcmF0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYXhpc09wZXJhdGlvbi5zZXRSZW1haW5pbmdQaGFzZXNJbkZsb3coZ2V0T3BlcmF0aW9uSW5QaGFzZXMoKSk7Ci0gICAgICAgICAgICAgICAgYXhpc09wZXJhdGlvbi5zZXRQaGFzZXNPdXRGbG93KGdldE9wZXJhdGlvbk91dFBoYXNlcygpKTsKLSAgICAgICAgICAgICAgICBheGlzT3BlcmF0aW9uLnNldFBoYXNlc0luRmF1bHRGbG93KG5ldyBBcnJheUxpc3QoZ2V0T3BlcmF0aW9uSW5GYXVsdFBoYXNlcygpKSk7Ci0gICAgICAgICAgICAgICAgYXhpc09wZXJhdGlvbi5zZXRQaGFzZXNPdXRGYXVsdEZsb3coZ2V0T3BlcmF0aW9uT3V0RmF1bHRQaGFzZXMoKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChEZXBsb3ltZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBBeGlzRmF1bHQubWFrZUZhdWx0KGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvdXRpbC9UZW1wRmlsZU1hbmFnZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L3V0aWwvVGVtcEZpbGVNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3M2ZlZTAuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvdXRpbC9UZW1wRmlsZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQudXRpbDsNCi0NCi1pbXBvcnQgamF2YS5pby4qOw0KLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsNCi1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOw0KLQ0KLQ0KLS8qKg0KLSAqIEdlbmVyYXRlcyBhbmQgcHJvcGVybHkgY2xlYW5zIHVwIHRlbXBvcmFyeSBmaWxlcy4gU2ltaWxhciB0byB7QGxpbmsNCi0gKiBGaWxlI2NyZWF0ZVRlbXBGaWxlKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpfSwgdGhpcyBjbGFzcyBwcm92aWRlcyBhIHN0YXRpYyBtZXRob2QgdG8NCi0gKiBjcmVhdGUgdGVtcG9yYXJ5IGZpbGVzLiBUaGUgdGVtcG9yYXJ5IGZpbGVzIHdpbGwgYmUgY3JlYXRlZCBpbiBhIHNwZWNpYWwgZGlyZWN0b3J5IHRvIGJlIGNsZWFuZWQNCi0gKiB1cCB0aGUgbmV4dCB0aW1lIHRoaXMgY2xhc3MgaXMgbG9hZGVkIGJ5IHRoZSBKVk0uIFRoaXMgZnVuY3Rpb25hbGl0eSBpcyByZXF1aXJlZCBiZWNhdXNlIFdpbjMyDQotICogcGxhdGZvcm1zIHdpbGwgbm90IGFsbG93IHRoZSBKVk0gdG8gZGVsZXRlIGZpbGVzIHRoYXQgYXJlIG9wZW4uIFRoaXMgY2F1c2VzIHByb2JsZW1zIHdpdGggaXRlbXMNCi0gKiBzdWNoIGFzIEpBUnMgdGhhdCBnZXQgb3BlbmVkIGJ5IGEgVVJMQ2xhc3NMb2FkZXIgYW5kIGNhbiB0aGVyZWZvcmUgbm90IGJlIGRlbGV0ZWQgYnkgdGhlIEpWTQ0KLSAqIChpbmNsdWRpbmcgZGVsZXRlT25FeGl0KS4NCi0gKiA8cC8+DQotICogVGhlIGNhbGxlciBzaG91bGQgbm90IG5lZWQgdG8gY3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MsIGFsdGhvdWdoIGl0IGlzIHBvc3NpYmxlLiBTaW1wbHkNCi0gKiB1c2UgdGhlIHN0YXRpYyBtZXRob2RzIHRvIHBlcmZvcm0gdGhlIHJlcXVpcmVkIG9wZXJhdGlvbnMuIE5vdGUgdGhhdCBhbGwgZmlsZXMgY3JlYXRlZCBieSB0aGlzDQotICogY2xhc3Mgc2hvdWxkIGJlIGNvbnNpZGVyZWQgYXMgZGVsZXRlZCBhdCBKVk0gZXhpdCAoYWx0aG91Z2ggdGhlIGFjdHVhbCBkZWxldGlvbiBtYXkgYmUgZGVsYXllZCkuDQotICogSWYgcGVyc2lzdGVudCB0ZW1wb3JhcnkgZmlsZXMgYXJlIHJlcXVpcmVkLCB1c2Uge0BsaW5rIGphdmEuaW8uRmlsZX0gaW5zdGVhZC4NCi0gKiA8cC8+DQotICogUmVmZXIgdG8gU3VuIGJ1Z3MgNDE3MTIzOSBhbmQgNDk1MDE0OCBmb3IgbW9yZSBkZXRhaWxzLg0KLSAqIDxwLz4NCi0gKiBUaGFua3MgdG8gTWlrZSBQaWxvbmUgZm9yIHRoaXMgY29kZSwgd2hpY2ggd2FzIHNvdXJjZWQgZnJvbQ0KLSAqIGh0dHA6Ly93d3cuZGV2eC5jb20vSmF2YS9BcnRpY2xlLzIyMDE4LyBhbmQgY29udHJpYnV0ZWQgdG8gQXBhY2hlLg0KLSAqLw0KLQ0KLXB1YmxpYyBjbGFzcyBUZW1wRmlsZU1hbmFnZXIgew0KLQ0KLSAgICAvKioNCi0gICAgICogQ3JlYXRlcyBhIHRlbXBvcmFyeSBmaWxlIGluIHRoZSBwcm9wZXIgZGlyZWN0b3J5IHRvIGFsbG93IGZvciBjbGVhbnVwIGFmdGVyIGV4ZWN1dGlvbi4gVGhpcw0KLSAgICAgKiBtZXRob2QgZGVsZWdhdGVzIHRvIHtAbGluayBGaWxlI2NyZWF0ZVRlbXBGaWxlKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsDQotICAgICAqIGphdmEuaW8uRmlsZSl9IHNvIHJlZmVyIHRvIGl0IGZvciBtb3JlIGRvY3VtZW50YXRpb24uIEFueSBmaWxlIGNyZWF0ZWQgdXNpbmcgdGhpcyBtZXRob2Qgc2hvdWxkDQotICAgICAqIGJlIGNvbnNpZGVyZWQgYXMgZGVsZXRlZCBhdCBKVk0gZXhpdDsgdGhlcmVmb3JlLCBkbyBub3QgdXNlIHRoaXMgbWV0aG9kIHRvIGNyZWF0ZSBmaWxlcyB0aGF0DQotICAgICAqIG5lZWQgdG8gYmUgcGVyc2lzdGVudCBiZXR3ZWVuIGFwcGxpY2F0aW9uIHJ1bnMuDQotICAgICAqDQotICAgICAqIEBwYXJhbSBwcmVmaXggdGhlIHByZWZpeCBzdHJpbmcgdXNlZCBpbiBnZW5lcmF0aW5nIHRoZSBmaWxlIG5hbWU7IG11c3QgYmUgYXQgbGVhc3QgdGhyZWUNCi0gICAgICogICAgICAgICAgICAgICBjaGFyYWN0ZXJzIGxvbmcNCi0gICAgICogQHBhcmFtIHN1ZmZpeCB0aGUgc3VmZml4IHN0cmluZyB0byBiZSB1c2VkIGluIGdlbmVyYXRpbmcgdGhlIGZpbGUncyBuYW1lOyBtYXkgYmUgbnVsbCwgaW4gd2hpY2gNCi0gICAgICogICAgICAgICAgICAgICBjYXNlIHRoZSBzdWZmaXggIi50bXAiIHdpbGwgYmUgdXNlZA0KLSAgICAgKiBAcmV0dXJuIGFuIGFic3RyYWN0IHBhdGhuYW1lIGRlbm90aW5nIGEgbmV3bHkgY3JlYXRlZCBlbXB0eSBmaWxlDQotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYSBmaWxlIGNvdWxkIG5vdCBiZSBjcmVhdGVkDQotICAgICAqLw0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7IlJlc3VsdE9mTWV0aG9kQ2FsbElnbm9yZWQifSkNCi0gICAgcHVibGljIHN0YXRpYyBGaWxlIGNyZWF0ZVRlbXBGaWxlKFN0cmluZyBwcmVmaXgsIFN0cmluZyBzdWZmaXgpDQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB5b3UgaGF2ZSBhbHJlYWR5IGluaXRpYWxpemVkIGEgdGVtcCBkaXJlY3RvcnkNCi0gICAgICAgIC8vIGZvciB0aGlzIGNsYXNzLg0KLSAgICAgICAgaWYgKHNUbXBEaXIgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIC8vIEluaXRpYWxpemUgeW91ciB0ZW1wIGRpcmVjdG9yeS4gWW91IHVzZSB0aGUgamF2YSB0ZW1wIGRpcmVjdG9yeQ0KLSAgICAgICAgICAgIC8vIHByb3BlcnR5LCBzbyB5b3UgYXJlIHN1cmUgdG8gZmluZCB0aGUgZmlsZXMgb24gdGhlIG5leHQgcnVuLg0KLSAgICAgICAgICAgIFN0cmluZyB0bXBEaXJOYW1lID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmlvLnRtcGRpciIpOw0KLSAgICAgICAgICAgIEZpbGUgdG1wRGlyID0gRmlsZS5jcmVhdGVUZW1wRmlsZShURU1QX0RJUl9QUkVGSVgsICIudG1wIiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGUodG1wRGlyTmFtZSkpOw0KLQ0KLSAgICAgICAgICAgIC8vIERlbGV0ZSB0aGUgZmlsZSBpZiBvbmUgd2FzIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCBieSB0aGUgSlZNLg0KLSAgICAgICAgICAgIC8vIFlvdSBhcmUgZ29pbmcgdG8gdXNlIHRoZSBuYW1lIG9mIHRoZSBmaWxlIGFzIGEgZGlyZWN0b3J5IG5hbWUsDQotICAgICAgICAgICAgLy8gc28geW91IGRvIG5vdCB3YW50IHRoZSBmaWxlIGxheWluZyBhcm91bmQuDQotICAgICAgICAgICAgdG1wRGlyLmRlbGV0ZSgpOw0KLQ0KLSAgICAgICAgICAgIC8vIENyZWF0ZSBhIGxvY2sgYmVmb3JlIGNyZWF0aW5nIHRoZSBkaXJlY3Rvcnkgc28NCi0gICAgICAgICAgICAvLyB0aGVyZSBpcyBubyByYWNlIGNvbmRpdGlvbiB3aXRoIGFub3RoZXIgYXBwbGljYXRpb24gdHJ5aW5nDQotICAgICAgICAgICAgLy8gdG8gY2xlYW4geW91ciB0ZW1wIGRpci4NCi0gICAgICAgICAgICBGaWxlIGxvY2tGaWxlID0gbmV3IEZpbGUodG1wRGlyTmFtZSwgdG1wRGlyLmdldE5hbWUoKSArICIubGNrIik7DQotICAgICAgICAgICAgbG9ja0ZpbGUuY3JlYXRlTmV3RmlsZSgpOw0KLQ0KLSAgICAgICAgICAgIC8vIFNldCB0aGUgbG9jayBmaWxlIHRvIGRlbGV0ZSBvbiBleGl0IHNvIGl0IGlzIHByb3Blcmx5IGNsZWFuZWQNCi0gICAgICAgICAgICAvLyBieSB0aGUgSlZNLiBUaGlzIHdpbGwgYWxsb3cgdGhlIFRlbXBGaWxlTWFuYWdlciB0byBjbGVhbg0KLSAgICAgICAgICAgIC8vIHRoZSBvdmVyYWxsIHRlbXAgZGlyZWN0b3J5IG5leHQgdGltZS4NCi0gICAgICAgICAgICBsb2NrRmlsZS5kZWxldGVPbkV4aXQoKTsNCi0NCi0gICAgICAgICAgICAvLyBNYWtlIGEgdGVtcCBkaXJlY3RvcnkgdGhhdCB5b3Ugd2lsbCB1c2UgZm9yIGFsbCBmdXR1cmUgcmVxdWVzdHMuDQotICAgICAgICAgICAgaWYgKCF0bXBEaXIubWtkaXJzKCkpIHsNCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJVbmFibGUgdG8gY3JlYXRlIHRlbXBvcmFyeSBkaXJlY3Rvcnk6Ig0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB0bXBEaXIuZ2V0QWJzb2x1dGVQYXRoKCkpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBzVG1wRGlyID0gdG1wRGlyOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy8gR2VuZXJhdGUgYSB0ZW1wIGZpbGUgZm9yIHRoZSB1c2VyIGluIHlvdXIgdGVtcCBkaXJlY3RvcnkNCi0gICAgICAgIC8vIGFuZCByZXR1cm4gaXQuDQotICAgICAgICByZXR1cm4gRmlsZS5jcmVhdGVUZW1wRmlsZShwcmVmaXgsIHN1ZmZpeCwgc1RtcERpcik7DQotICAgIH0NCi0NCi0NCi0gICAgLyoqDQotICAgICAqIFV0aWxpdHkgbWV0aG9kIHRvIGxvYWQgdGhlIFRlbXBGaWxlTWFuYWdlciBhdCBhbnkgdGltZSBhbmQgYWxsb3cgaXQgdG8gY2xlYW4gdGhlIHRlbXBvcmFyeQ0KLSAgICAgKiBmaWxlcyB0aGF0IG1heSBiZSBsZWZ0IGZyb20gcHJldmlvdXMgaW5zdGFuY2VzDQotICAgICAqDQotICAgICAqIEBwYXJhbSBhcmdzIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgYXJlIGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7DQotICAgICAgICAvLyBBbHRob3VnaCB0aGUgSlZNIHdpbGwgbG9hZCB0aGUgY2xhc3MgaW4gb3JkZXIgdG8NCi0gICAgICAgIC8vIHJ1biB0aGUgbWFpbiBtZXRob2QsIHRoaXMgZ2l2ZXMgYSBsaXR0bGUgY2xhcml0eSB0bw0KLSAgICAgICAgLy8gd2hhdCBpcyBoYXBwZW5pbmcgYW5kIHdoeSB3ZSB3YW50IHRoZSBtYWluIG1ldGhvZC4NCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgLy8gVGhpcyB3aWxsIGxvYWQgdGhlIFRlbXBGaWxlTWFuYWdlciwgd2hpY2ggd2lsbA0KLSAgICAgICAgICAgIC8vIGNhdXNlIHRoZSBzdGF0aWMgYmxvY2sgdG8gZXhlY3V0ZSwgY2xlYW5pbmcNCi0gICAgICAgICAgICAvLyBhbnkgb2xkIHRlbXAgZmlsZXMuDQotICAgICAgICAgICAgQ2xhc3MuZm9yTmFtZShUZW1wRmlsZU1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGV4KSB7DQotICAgICAgICAgICAgZXgucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0NCi0gICAgLyoqDQotICAgICAqIERlbGV0ZXMgYWxsIG9mIHRoZSBmaWxlcyBpbiB0aGUgZ2l2ZW4gZGlyZWN0b3J5LCByZWN1cnNpbmcgaW50byBhbnkgc3ViIGRpcmVjdG9yaWVzIGZvdW5kLiBBbHNvDQotICAgICAqIGRlbGV0ZXMgdGhlIHJvb3QgZGlyZWN0b3J5Lg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gcm9vdERpciB0aGUgcm9vdCBkaXJlY3RvcnkgdG8gYmUgcmVjdXJzaXZlbHkgZGVsZXRlZA0KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFueSBmaWxlIG9yIGRpcmVjdG9yeSBjb3VsZCBub3QgYmUgZGVsZXRlZA0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCByZWN1cnNpdmVEZWxldGUoRmlsZSByb290RGlyKQ0KLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICAvLyBTZWxlY3QgYWxsIHRoZSBmaWxlcw0KLSAgICAgICAgRmlsZVtdIGZpbGVzID0gcm9vdERpci5saXN0RmlsZXMoKTsNCi0gICAgICAgIGZvciAoRmlsZSBmaWxlIDogZmlsZXMpIHsNCi0gICAgICAgICAgICAvLyBJZiB0aGUgZmlsZSBpcyBhIGRpcmVjdG9yeSwgd2Ugd2lsbA0KLSAgICAgICAgICAgIC8vIHJlY3Vyc2l2ZWx5IGNhbGwgZGVsZXRlIG9uIGl0Lg0KLSAgICAgICAgICAgIGlmIChmaWxlLmlzRGlyZWN0b3J5KCkpIHsNCi0gICAgICAgICAgICAgICAgcmVjdXJzaXZlRGVsZXRlKGZpbGUpOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIC8vIEl0IGlzIGp1c3QgYSBmaWxlIHNvIHdlIGFyZSBzYWZlIHRvDQotICAgICAgICAgICAgICAgIC8vIGRlbGV0ZSBpdA0KLSAgICAgICAgICAgICAgICBpZiAoIWZpbGUuZGVsZXRlKCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiQ291bGQgbm90IGRlbGV0ZTogIiArIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy8gRmluYWxseSwgZGVsZXRlIHRoZSByb290IGRpcmVjdG9yeSBub3cNCi0gICAgICAgIC8vIHRoYXQgYWxsIG9mIHRoZSBmaWxlcyBpbiB0aGUgZGlyZWN0b3J5IGhhdmUNCi0gICAgICAgIC8vIGJlZW4gcHJvcGVybHkgZGVsZXRlZC4NCi0gICAgICAgIGlmICghcm9vdERpci5kZWxldGUoKSkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiQ291bGQgbm90IGRlbGV0ZTogIiArIHJvb3REaXIuZ2V0QWJzb2x1dGVQYXRoKCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotDQotICAgIC8qKiBUaGUgcHJlZml4IGZvciB0aGUgdGVtcCBkaXJlY3RvcnkgaW4gdGhlIHN5c3RlbSB0ZW1wIGRpcmVjdG9yeSAqLw0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgVEVNUF9ESVJfUFJFRklYID0gImF4aXMyLXRtcC0iOw0KLQ0KLSAgICAvKiogVGhlIHRlbXAgZGlyZWN0b3J5IHRvIGdlbmVyYXRlIGFsbCBmaWxlcyBpbiAqLw0KLSAgICBwcml2YXRlIHN0YXRpYyBGaWxlIHNUbXBEaXIgPSBudWxsOw0KLQ0KLSAgICAvKioNCi0gICAgICogIFN0YXRpYyBibG9jayB1c2VkIHRvIGNsZWFuIHVwIGFueSBvbGQgdGVtcCBkaXJlY3RvcmllcyBmb3VuZCAtLSB0aGUgSlZNDQotICAgICAqICB3aWxsIHJ1biB0aGlzIGJsb2NrIHdoZW4gYSBjbGFzcyBsb2FkZXIgbG9hZHMgdGhlIGNsYXNzLg0KLSAgICAgKi8NCi0gICAgc3RhdGljIHsNCi0gICAgICAgIC8vIENsZWFuIHVwIGFueSBvbGQgdGVtcCBkaXJlY3RvcmllcyBieSBsaXN0aW5nDQotICAgICAgICAvLyBhbGwgb2YgdGhlIGZpbGVzLCB1c2luZyBhIGZpbHRlciB0aGF0IHdpbGwNCi0gICAgICAgIC8vIHJldHVybiBvbmx5IGRpcmVjdG9yaWVzIHRoYXQgc3RhcnQgd2l0aCB5b3VyDQotICAgICAgICAvLyBwcmVmaXguDQotICAgICAgICBGaWxlRmlsdGVyIHRtcERpckZpbHRlciA9DQotICAgICAgICAgICAgICAgIG5ldyBGaWxlRmlsdGVyKCkgew0KLSAgICAgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgcGF0aG5hbWUpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHBhdGhuYW1lLmlzRGlyZWN0b3J5KCkgJiYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhuYW1lLmdldE5hbWUoKS5zdGFydHNXaXRoKFRFTVBfRElSX1BSRUZJWCkpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9Ow0KLQ0KLSAgICAgICAgLy8gR2V0IHRoZSBzeXN0ZW0gdGVtcCBkaXJlY3RvcnkgYW5kIGZpbHRlciB0aGUgZmlsZXMuDQotICAgICAgICBTdHJpbmcgdG1wRGlyTmFtZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5pby50bXBkaXIiKTsNCi0gICAgICAgIEZpbGUgdG1wRGlyID0gbmV3IEZpbGUodG1wRGlyTmFtZSk7DQotICAgICAgICBGaWxlW10gdG1wRmlsZXMgPSB0bXBEaXIubGlzdEZpbGVzKHRtcERpckZpbHRlcik7DQotDQotICAgICAgICAvLyBGaW5kIGFsbCB0aGUgZmlsZXMgdGhhdCBkbyBub3QgaGF2ZSBhIGxvY2sgYnkNCi0gICAgICAgIC8vIGNoZWNraW5nIGlmIHRoZSBsb2NrIGZpbGUgZXhpc3RzLg0KLSAgICAgICAgZm9yIChGaWxlIHRtcEZpbGUgOiB0bXBGaWxlcykgew0KLSAgICAgICAgICAgIC8vIENyZWF0ZSBhIGZpbGUgdG8gcmVwcmVzZW50IHRoZSBsb2NrIGFuZCB0ZXN0Lg0KLSAgICAgICAgICAgIEZpbGUgbG9ja0ZpbGUgPSBuZXcgRmlsZSh0bXBGaWxlLmdldFBhcmVudCgpLCB0bXBGaWxlLmdldE5hbWUoKSArICIubGNrIik7DQotICAgICAgICAgICAgaWYgKCFsb2NrRmlsZS5leGlzdHMoKSkgew0KLSAgICAgICAgICAgICAgICAvLyBEZWxldGUgdGhlIGNvbnRlbnRzIG9mIHRoZSBkaXJlY3Rvcnkgc2luY2UNCi0gICAgICAgICAgICAgICAgLy8gaXQgaXMgbm8gbG9uZ2VyIGxvY2tlZC4NCi0gICAgICAgICAgICAgICAgTG9nZ2VyLmdldExvZ2dlcigiZGVmYXVsdCIpLmxvZyhMZXZlbC5GSU5FLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUZW1wRmlsZU1hbmFnZXI6OmRlbGV0aW5nIG9sZCB0ZW1wIGRpcmVjdG9yeSAiICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXBGaWxlKTsNCi0NCi0gICAgICAgICAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICAgICAgICAgIHJlY3Vyc2l2ZURlbGV0ZSh0bXBGaWxlKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsNCi0gICAgICAgICAgICAgICAgICAgIC8vIFlvdSBsb2cgYXQgYSBmaW5lIGxldmVsIHNpbmNlIG5vdCBiZWluZyBhYmxlIHRvIGRlbGV0ZQ0KLSAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHRlbXAgZGlyZWN0b3J5IHNob3VsZCBub3Qgc3RvcCB0aGUgYXBwbGljYXRpb24NCi0gICAgICAgICAgICAgICAgICAgIC8vIGZyb20gcGVyZm9ybWluZyBjb3JyZWN0bHkuIEhvd2V2ZXIsIGlmIHRoZSBhcHBsaWNhdGlvbg0KLSAgICAgICAgICAgICAgICAgICAgLy8gZ2VuZXJhdGVzIGEgbG90IG9mIHRlbXAgZmlsZXMsIHRoaXMgY291bGQgYmVjb21lDQotICAgICAgICAgICAgICAgICAgICAvLyBhIGRpc2sgc3BhY2UgcHJvYmxlbSBhbmQgdGhlIGxldmVsIHNob3VsZCBiZSByYWlzZWQuDQotICAgICAgICAgICAgICAgICAgICBMb2dnZXIuZ2V0TG9nZ2VyKCJkZWZhdWx0IikubG9nKExldmVsLklORk8sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUZW1wRmlsZU1hbmFnZXI6OnVuYWJsZSB0byBkZWxldGUgIiArDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOw0KLQ0KLSAgICAgICAgICAgICAgICAgICAgLy8gUHJpbnQgdGhlIGV4Y2VwdGlvbi4NCi0gICAgICAgICAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvc3RyZWFtID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOw0KLSAgICAgICAgICAgICAgICAgICAgZXgucHJpbnRTdGFja1RyYWNlKG5ldyBQcmludFN0cmVhbShvc3RyZWFtKSk7DQotDQotICAgICAgICAgICAgICAgICAgICBMb2dnZXIuZ2V0TG9nZ2VyKCJkZWZhdWx0IikubG9nKExldmVsLkZJTkUsIG9zdHJlYW0udG9TdHJpbmcoKSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvdXRpbC9VdGlscy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvdXRpbC9VdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTJmMzk4Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L3V0aWwvVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MzggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQudXRpbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVAxMUNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUDEyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xhc3Nsb2FkZXIuSmFyRmlsZUNsYXNzTG9hZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQuRGVwbG95bWVudENsYXNzTG9hZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC5EZXBsb3ltZW50Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC5EZXBsb3ltZW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC5yZXBvc2l0b3J5LnV0aWwuQXJjaGl2ZVJlYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQucmVwb3NpdG9yeS51dGlsLkRlcGxveW1lbnRGaWxlRGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5qYXZhMndzZGwuRGVmYXVsdFNjaGVtYUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLmphdmEyd3NkbC5Eb2NMaXRCYXJlU2NoZW1hR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uamF2YTJ3c2RsLkphdmEyV1NETENvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLmphdmEyd3NkbC5TY2hlbWFHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0NvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuSGFuZGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5NZXNzYWdlUmVjZWl2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLkphdmFVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuTG9hZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5Qb2xpY3lVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm5lZXRoaS5Qb2xpY3lDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS51dGlscy5OYW1lc3BhY2VNYXA7Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViTWV0aG9kOwotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5GYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmV0LlVSTENsYXNzTG9hZGVyOwotaW1wb3J0IGphdmEubmV0LlVSTERlY29kZXI7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBJbnB1dFN0cmVhbTsKLQotcHVibGljIGNsYXNzIFV0aWxzIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlZmF1bHRFbmNvZGluZyA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoU3lzdGVtLm91dCkuZ2V0RW5jb2RpbmcoKTsKLQotICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhVdGlscy5jbGFzcyk7Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkRmxvd0hhbmRsZXJzKEZsb3cgZmxvdywgQ2xhc3NMb2FkZXIgY2xzTG9hZGVyKQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIGludCBjb3VudCA9IGZsb3cuZ2V0SGFuZGxlckNvdW50KCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBjb3VudDsgaisrKSB7Ci0gICAgICAgICAgICBIYW5kbGVyRGVzY3JpcHRpb24gaGFuZGxlcm1kID0gZmxvdy5nZXRIYW5kbGVyKGopOwotICAgICAgICAgICAgSGFuZGxlciBoYW5kbGVyOwotCi0gICAgICAgICAgICBmaW5hbCBDbGFzcyBoYW5kbGVyQ2xhc3MgPSBnZXRIYW5kbGVyQ2xhc3MoCi0gICAgICAgICAgICAgICAgICAgIGhhbmRsZXJtZC5nZXRDbGFzc05hbWUoKSwgY2xzTG9hZGVyKTsKLQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBoYW5kbGVyID0gKEhhbmRsZXIpb3JnLmFwYWNoZS5heGlzMi5qYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIC5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlckNsYXNzLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICAgICAgaGFuZGxlci5pbml0KGhhbmRsZXJtZCk7Ci0gICAgICAgICAgICAgICAgaGFuZGxlcm1kLnNldEhhbmRsZXIoaGFuZGxlcik7Ci0gICAgICAgICAgICB9IGNhdGNoIChQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBBeGlzRmF1bHQubWFrZUZhdWx0KGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGxvYWRIYW5kbGVyKENsYXNzTG9hZGVyIGxvYWRlcjEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZXJEZXNjcmlwdGlvbiBkZXNjKSB0aHJvd3MgRGVwbG95bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBoYW5kbGVybmFtZSA9IGRlc2MuZ2V0Q2xhc3NOYW1lKCk7Ci0gICAgICAgIEhhbmRsZXIgaGFuZGxlcjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZpbmFsIENsYXNzIGhhbmRsZXJDbGFzcyA9IExvYWRlci5sb2FkQ2xhc3MobG9hZGVyMSwgaGFuZGxlcm5hbWUpOwotICAgICAgICAgICAgUGFja2FnZSBhUGFja2FnZSA9IChQYWNrYWdlKW9yZy5hcGFjaGUuYXhpczIuamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyCi0gICAgICAgICAgICAgICAgICAgIC5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRBY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlckNsYXNzLmdldFBhY2thZ2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICBpZiAoYVBhY2thZ2UgIT0gbnVsbAotICAgICAgICAgICAgICAgICYmIGFQYWNrYWdlLmdldE5hbWUoKS5lcXVhbHMoIm9yZy5hcGFjaGUuYXhpczIuZW5naW5lIikpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGhhbmRsZXJDbGFzcy5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgbG9nLndhcm4oIkRpc3BhdGNoZXIgIiArIG5hbWUgKyAiIGlzIG5vdyBkZXByZWNhdGVkLiIpOwotICAgICAgICAgICAgICAgIGlmIChuYW1lLmluZGV4T2YoIkluc3RhbmNlRGlzcGF0Y2hlciIpICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKCJQbGVhc2UgcmVtb3ZlIHRoZSBlbnRyeSBmb3IgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGhhbmRsZXJDbGFzcy5nZXROYW1lKCkgKyAiZnJvbSBheGlzMi54bWwiKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBsb2cud2FybigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUGxlYXNlIGVkaXQgYXhpczIueG1sIGFuZCByZXBsYWNlIHdpdGggdGhlIHNhbWUgY2xhc3MgaW4gb3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycyBwYWNrYWdlIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaGFuZGxlciA9IChIYW5kbGVyKW9yZy5hcGFjaGUuYXhpczIuamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyCi0gICAgICAgICAgICAgICAgICAgIC5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlckNsYXNzLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgaGFuZGxlci5pbml0KGRlc2MpOwotICAgICAgICAgICAgZGVzYy5zZXRIYW5kbGVyKGhhbmRsZXIpOwotICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlmIChoYW5kbGVybmFtZS5pbmRleE9mKCJqYXh3cyIpID4gMCkgewotICAgICAgICAgICAgICAgIGxvZy53YXJuKCJbSkFYV1NdIC0gdW5hYmxlIHRvIGxvYWQgIiArIGhhbmRsZXJuYW1lKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVVJMW10gZ2V0VVJMc0ZvckFsbEphcnMoVVJMIHVybCwgRmlsZSB0bXBEaXIpIHsKLSAgICAgICAgRmlsZUlucHV0U3RyZWFtIGZpbiA9IG51bGw7Ci0gICAgICAgIElucHV0U3RyZWFtIGluID0gbnVsbDsKLSAgICAgICAgWmlwSW5wdXRTdHJlYW0gemluID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEFycmF5TGlzdCBhcnJheSA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgIGluID0gdXJsLm9wZW5TdHJlYW0oKTsKLSAgICAgICAgICAgIFN0cmluZyBmaWxlTmFtZSA9IHVybC5nZXRGaWxlKCk7Ci0gICAgICAgICAgICBpbnQgaW5kZXggPSBmaWxlTmFtZS5sYXN0SW5kZXhPZignLycpOwotICAgICAgICAgICAgaWYgKGluZGV4ICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgZmlsZU5hbWUgPSBmaWxlTmFtZS5zdWJzdHJpbmcoaW5kZXggKyAxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsIEZpbGUgZiA9IGNyZWF0ZVRlbXBGaWxlKGZpbGVOYW1lLCBpbiwgdG1wRGlyKTsKLQotICAgICAgICAgICAgZmluID0gKEZpbGVJbnB1dFN0cmVhbSlvcmcuYXBhY2hlLmF4aXMyLmphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcgotICAgICAgICAgICAgICAgICAgICAuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEZpbGVJbnB1dFN0cmVhbShmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICBhcnJheS5hZGQoZi50b1VSTCgpKTsKLSAgICAgICAgICAgIHppbiA9IG5ldyBaaXBJbnB1dFN0cmVhbShmaW4pOwotCi0gICAgICAgICAgICBaaXBFbnRyeSBlbnRyeTsKLSAgICAgICAgICAgIFN0cmluZyBlbnRyeU5hbWU7Ci0gICAgICAgICAgICB3aGlsZSAoKGVudHJ5ID0gemluLmdldE5leHRFbnRyeSgpKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZW50cnlOYW1lID0gZW50cnkuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIGlkIHRoZSBlbnRyeSBuYW1lIHN0YXJ0IHdpdGggL2xpYiBhbmQgZW5kIHdpdGggLmphciB0aGVuCi0gICAgICAgICAgICAgICAgICogdGhvc2UgZW50cnkgbmFtZSB3aWxsIGJlIGFkZGVkIHRvIHRoZSBhcnJheWxpc3QKLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBpZiAoKGVudHJ5TmFtZSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAmJiBlbnRyeU5hbWUudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKCJsaWIvIikKLSAgICAgICAgICAgICAgICAgICAgJiYgZW50cnlOYW1lLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoIi5qYXIiKSkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc3VmZml4ID0gZW50cnlOYW1lLnN1YnN0cmluZyg0KTsKLSAgICAgICAgICAgICAgICAgICAgRmlsZSBmMiA9IGNyZWF0ZVRlbXBGaWxlKHN1ZmZpeCwgemluLCB0bXBEaXIpOwotICAgICAgICAgICAgICAgICAgICBhcnJheS5hZGQoZjIudG9VUkwoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIChVUkxbXSlhcnJheS50b0FycmF5KG5ldyBVUkxbYXJyYXkuc2l6ZSgpXSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChmaW4gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbi5jbG9zZSgpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoaW4gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGluLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAvLwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh6aW4gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHppbi5jbG9zZSgpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEZpbGUgY3JlYXRlVGVtcEZpbGUoZmluYWwgU3RyaW5nIHN1ZmZpeCwgSW5wdXRTdHJlYW0gaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEZpbGUgdG1wRGlyKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBieXRlIGRhdGFbXSA9IG5ldyBieXRlWzIwNDhdOwotICAgICAgICBpbnQgY291bnQ7Ci0gICAgICAgIEZpbGUgZiA9IFRlbXBGaWxlTWFuYWdlci5jcmVhdGVUZW1wRmlsZSgiYXhpczIiLCBzdWZmaXgpOwotICAgICAgICAKLS8vICAgICAgICBpZiAodG1wRGlyID09IG51bGwpIHsKLS8vICAgICAgICAgICAgU3RyaW5nIGRpcmVjdG9yeSA9IChTdHJpbmcpb3JnLmFwYWNoZS5heGlzMi5qYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXIKLS8vICAgICAgICAgICAgICAgICAgICAuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkQWN0aW9uKCkgewotLy8gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaW8udG1wZGlyIik7Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgICAgICAgICB9KTsKLS8vICAgICAgICAgICAgZmluYWwgRmlsZSB0ZW1wRmlsZSA9IG5ldyBGaWxlKGRpcmVjdG9yeSwgIl9heGlzMiIpOwotLy8gICAgICAgICAgICBCb29sZWFuIGV4aXN0cyA9IChCb29sZWFuKW9yZy5hcGFjaGUuYXhpczIuamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyCi0vLyAgICAgICAgICAgICAgICAgICAgLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEFjdGlvbigpIHsKLS8vICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB7Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGVtcEZpbGUuZXhpc3RzKCk7Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgICAgICAgICB9KTsKLS8vICAgICAgICAgICAgaWYgKCFleGlzdHMpIHsKLS8vICAgICAgICAgICAgICAgIEJvb2xlYW4gbWtkaXJzID0gKEJvb2xlYW4pb3JnLmFwYWNoZS5heGlzMi5qYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXIKLS8vICAgICAgICAgICAgICAgICAgICAgICAgLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEFjdGlvbigpIHsKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgewotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0ZW1wRmlsZS5ta2RpcnMoKTsKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0vLyAgICAgICAgICAgICAgICBpZiAoIW1rZGlycykgewotLy8gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiVW5hYmxlIHRvIGNyZWF0ZSB0aGUgZGlyZWN0b3J5Iik7Ci0vLyAgICAgICAgICAgICAgICB9Ci0vLyAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgdHJ5IHsKLS8vICAgICAgICAgICAgICAgIGYgPSAoRmlsZSlvcmcuYXBhY2hlLmF4aXMyLmphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcgotLy8gICAgICAgICAgICAgICAgICAgICAgICAuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uKCkgewotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJheGlzMiIsIHN1ZmZpeCwKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wRmlsZSk7Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgIH0pOwotLy8gICAgICAgICAgICAgICAgZi5kZWxldGVPbkV4aXQoKTsKLS8vICAgICAgICAgICAgfSBjYXRjaCAoUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiBlKSB7Ci0vLyAgICAgICAgICAgICAgICB0aHJvdyAoSU9FeGNlcHRpb24pZS5nZXRFeGNlcHRpb24oKTsKLS8vICAgICAgICAgICAgfQotLy8gICAgICAgIH0gZWxzZSB7Ci0vLyAgICAgICAgICAgIHRyeSB7Ci0vLyAgICAgICAgICAgICAgICBmID0gKEZpbGUpb3JnLmFwYWNoZS5heGlzMi5qYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXIKLS8vICAgICAgICAgICAgICAgICAgICAgICAgLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbigpIHsKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRmlsZS5jcmVhdGVUZW1wRmlsZSgiYXhpczIiLCBzdWZmaXgsCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wRGlyKTsKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0vLyAgICAgICAgICAgICAgICBmLmRlbGV0ZU9uRXhpdCgpOwotLy8gICAgICAgICAgICB9IGNhdGNoIChQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uIGUpIHsKLS8vICAgICAgICAgICAgICAgIHRocm93IChJT0V4Y2VwdGlvbillLmdldEV4Y2VwdGlvbigpOwotLy8gICAgICAgICAgICB9Ci0vLyAgICAgICAgfQotLy8gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotLy8gICAgICAgICAgICBsb2cuZGVidWcoIkNyZWF0ZWQgdGVtcG9yYXJ5IGZpbGUgOiAiICsgZi5nZXRBYnNvbHV0ZVBhdGgoKSk7Ly8gJE5PTi1TRUMtNAotLy8gICAgICAgIH0KLS8vICAgICAgICBmaW5hbCBGaWxlIGYyID0gZjsKLS8vICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcgotLy8gICAgICAgICAgICAgICAgLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEFjdGlvbigpIHsKLS8vICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsKLS8vICAgICAgICAgICAgICAgICAgICAgICAgZjIuZGVsZXRlT25FeGl0KCk7Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotLy8gICAgICAgICAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgICAgIH0pOwotICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIG91dDsKLSAgICAgICAgZmluYWwgRmlsZSBmMiA9IGY7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBvdXQgPSAoRmlsZU91dHB1dFN0cmVhbSlvcmcuYXBhY2hlLmF4aXMyLmphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcgotICAgICAgICAgICAgICAgICAgICAuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZjIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgfSBjYXRjaCAoUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uKWUuZ2V0RXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgd2hpbGUgKChjb3VudCA9IGluLnJlYWQoZGF0YSwgMCwgMjA0OCkpICE9IC0xKSB7Ci0gICAgICAgICAgICBvdXQud3JpdGUoZGF0YSwgMCwgY291bnQpOwotICAgICAgICB9Ci0gICAgICAgIG91dC5jbG9zZSgpOwotICAgICAgICByZXR1cm4gZjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIENsYXNzTG9hZGVyIGdldENsYXNzTG9hZGVyKENsYXNzTG9hZGVyIHBhcmVudCwgU3RyaW5nIHBhdGgpCi0gICAgICAgICAgICB0aHJvd3MgRGVwbG95bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBnZXRDbGFzc0xvYWRlcihwYXJlbnQsIG5ldyBGaWxlKHBhdGgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYSBDbGFzc0xvYWRlciB3aGljaCBjb250YWlucyBhIGNsYXNzcGF0aCBvZiBhKSB0aGUgcGFzc2VkIGRpcmVjdG9yeSBhbmQgYikgYW55IGphciBmaWxlcwotICAgICAqIGluc2lkZSB0aGUgImxpYi8iIG9yICJMaWIvIiBzdWJkaXJlY3Rvcnkgb2YgdGhlIHBhc3NlZCBkaXJlY3RvcnkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGFyZW50IHBhcmVudCBDbGFzc0xvYWRlciB3aGljaCB3aWxsIGJlIHRoZSBwYXJlbnQgb2YgdGhlIHJlc3VsdCBvZiB0aGlzIG1ldGhvZAotICAgICAqIEBwYXJhbSBmaWxlICAgYSBGaWxlIHdoaWNoIG11c3QgYmUgYSBkaXJlY3RvcnkgZm9yIHRoaXMgdG8gYmUgdXNlZnVsCi0gICAgICogQHJldHVybiBhIG5ldyBDbGFzc0xvYWRlciBwb2ludGluZyB0byBib3RoIHRoZSBwYXNzZWQgZGlyIGFuZCBqYXIgZmlsZXMgdW5kZXIgbGliLwotICAgICAqIEB0aHJvd3MgRGVwbG95bWVudEV4Y2VwdGlvbiBpZiBwcm9ibGVtcyBvY2N1cgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQ2xhc3NMb2FkZXIgZ2V0Q2xhc3NMb2FkZXIoZmluYWwgQ2xhc3NMb2FkZXIgcGFyZW50LCBGaWxlIGZpbGUpCi0gICAgICAgICAgICB0aHJvd3MgRGVwbG95bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIFVSTENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyOwotCi0gICAgICAgIGlmIChmaWxlID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsgLy8gU2hvdWxkbid0IHRoaXMganVzdCByZXR1cm4gdGhlIHBhcmVudD8KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgQXJyYXlMaXN0IHVybHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICB1cmxzLmFkZChmaWxlLnRvVVJMKCkpOwotCi0gICAgICAgICAgICAvLyBsb3dlciBjYXNlIGRpcmVjdG9yeSBuYW1lCi0gICAgICAgICAgICBGaWxlIGxpYmZpbGVzID0gbmV3IEZpbGUoZmlsZSwgImxpYiIpOwotICAgICAgICAgICAgaWYgKCFhZGRGaWxlcyh1cmxzLCBsaWJmaWxlcykpIHsKLSAgICAgICAgICAgICAgICAvLyB1cHBlciBjYXNlIGRpcmVjdG9yeSBuYW1lCi0gICAgICAgICAgICAgICAgbGliZmlsZXMgPSBuZXcgRmlsZShmaWxlLCAiTGliIik7Ci0gICAgICAgICAgICAgICAgYWRkRmlsZXModXJscywgbGliZmlsZXMpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmaW5hbCBVUkwgdXJsbGlzdFtdID0gbmV3IFVSTFt1cmxzLnNpemUoKV07Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHVybHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICB1cmxsaXN0W2ldID0gKFVSTCl1cmxzLmdldChpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNsYXNzTG9hZGVyID0gKFVSTENsYXNzTG9hZGVyKUFjY2Vzc0NvbnRyb2xsZXIKLSAgICAgICAgICAgICAgICAgICAgLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEFjdGlvbigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1c2VKYXJGaWxlQ2xhc3NMb2FkZXIoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEphckZpbGVDbGFzc0xvYWRlcih1cmxsaXN0LCBwYXJlbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVVJMQ2xhc3NMb2FkZXIodXJsbGlzdCwgcGFyZW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgcmV0dXJuIGNsYXNzTG9hZGVyOwotICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIHVzZUphckZpbGVDbGFzc0xvYWRlcigpIHsKLSAgICAgICAgLy8gVGhlIEphckZpbGVDbGFzc0xvYWRlciB3YXMgY3JlYXRlZCB0byBhZGRyZXNzIGEgbG9ja2luZyBwcm9ibGVtIHNlZW4gb25seSBvbiBXaW5kb3dzIHBsYXRmb3Jtcy4KLSAgICAgICAgLy8gSXQgY2FycmllcyB3aXRoIGl0IGEgc2xpZ2h0IHBlcmZvcm1hbmNlIHBlbmFsdHkgdGhhdCBuZWVkcyB0byBiZSBhZGRyZXNzZWQuICBSYXRoZXIgdGhhbiBtYWtlCi0gICAgICAgIC8vICpuaXggT1NlcyBjYXJyeSB0aGlzIGJ1cmRlbiB3ZSdsbCBlbmdhZ2UgdGhlIEphckZpbGVDbGFzc0xvYWRlciBmb3IgV2luZG93cyBvciBpZiB0aGUgdXNlciAKLSAgICAgICAgLy8gc3BlY2lmaWNhbGx5IHJlcXVlc3RzIGl0LgotICAgICAgICBib29sZWFuIHVzZUphckZpbGVDbGFzc0xvYWRlcjsKLSAgICAgICAgaWYgKFN5c3RlbS5nZXRQcm9wZXJ0eSgib3JnLmFwYWNoZS5heGlzMi5jbGFzc2xvYWRlci5KYXJGaWxlQ2xhc3NMb2FkZXIiKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB1c2VKYXJGaWxlQ2xhc3NMb2FkZXIgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLm5hbWUiKS5zdGFydHNXaXRoKCJXaW5kb3dzIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB1c2VKYXJGaWxlQ2xhc3NMb2FkZXIgPSBCb29sZWFuLmdldEJvb2xlYW4oIm9yZy5hcGFjaGUuYXhpczIuY2xhc3Nsb2FkZXIuSmFyRmlsZUNsYXNzTG9hZGVyIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHVzZUphckZpbGVDbGFzc0xvYWRlcjsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBhZGRGaWxlcyhBcnJheUxpc3QgdXJscywgZmluYWwgRmlsZSBsaWJmaWxlcykKLSAgICAgICAgICAgIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24gewotICAgICAgICBCb29sZWFuIGV4aXN0cyA9IChCb29sZWFuKW9yZy5hcGFjaGUuYXhpczIuamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyCi0gICAgICAgICAgICAgICAgLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEFjdGlvbigpIHsKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGliZmlsZXMuZXhpc3RzKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgaWYgKGV4aXN0cykgewotICAgICAgICAgICAgdXJscy5hZGQobGliZmlsZXMudG9VUkwoKSk7Ci0gICAgICAgICAgICBGaWxlIGphcmZpbGVzW10gPSAoRmlsZVtdKW9yZy5hcGFjaGUuYXhpczIuamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyCi0gICAgICAgICAgICAgICAgICAgIC5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRBY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGliZmlsZXMubGlzdEZpbGVzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgaW50IGkgPSAwOwotICAgICAgICAgICAgd2hpbGUgKGkgPCBqYXJmaWxlcy5sZW5ndGgpIHsKLSAgICAgICAgICAgICAgICBGaWxlIGphcmZpbGUgPSBqYXJmaWxlc1tpXTsKLSAgICAgICAgICAgICAgICBpZiAoamFyZmlsZS5nZXROYW1lKCkuZW5kc1dpdGgoIi5qYXIiKSkgewotICAgICAgICAgICAgICAgICAgICB1cmxzLmFkZChqYXJmaWxlLnRvVVJMKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGV4aXN0czsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBDbGFzcyBnZXRIYW5kbGVyQ2xhc3MoU3RyaW5nIGNsYXNzTmFtZSwgQ2xhc3NMb2FkZXIgbG9hZGVyMSkKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBDbGFzcyBoYW5kbGVyQ2xhc3M7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGhhbmRsZXJDbGFzcyA9IExvYWRlci5sb2FkQ2xhc3MobG9hZGVyMSwgY2xhc3NOYW1lKTsKLSAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBBeGlzRmF1bHQubWFrZUZhdWx0KGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGhhbmRsZXJDbGFzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIGd1eSB3aWxsIGNyZWF0ZSBhIEF4aXNTZXJ2aWNlIHVzaW5nIGphdmEgcmVmbGVjdGlvbgotICAgICAqCi0gICAgICogQHBhcmFtIGF4aXNTZXJ2aWNlICAgICAgIHRoZSB0YXJnZXQgQXhpc1NlcnZpY2UKLSAgICAgKiBAcGFyYW0gYXhpc0NvbmZpZyAgICAgICAgdGhlIGluLXNjb3BlIEF4aXNDb25maWd1cmF0aW9uCi0gICAgICogQHBhcmFtIGV4Y2x1ZGVPcGVyYXRpb25zIGEgTGlzdCBvZiBTdHJpbmdzIChvciBudWxsKSwgZWFjaCBjb250YWluaW5nIGEgbWV0aG9kIHRvIGV4Y2x1ZGUKLSAgICAgKiBAcGFyYW0gbm9uUnBjTWV0aG9kcyAgICAgYSBMaXN0IG9mIFN0cmluZ3MgKG9yIG51bGwpLCBlYWNoIGNvbnRhaW5pbmcgYSBub24tcnBjIG1ldGhvZCBuYW1lCi0gICAgICogQHRocm93cyBFeGNlcHRpb24gaWYgYSBwcm9ibGVtIG9jY3VycwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBmaWxsQXhpc1NlcnZpY2UoZmluYWwgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlnLCBBcnJheUxpc3QgZXhjbHVkZU9wZXJhdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheUxpc3Qgbm9uUnBjTWV0aG9kcykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBzZXJ2aWNlQ2xhc3M7Ci0gICAgICAgIFBhcmFtZXRlciBpbXBsSW5mb1BhcmFtID0gYXhpc1NlcnZpY2UKLSAgICAgICAgICAgICAgICAuZ2V0UGFyYW1ldGVyKENvbnN0YW50cy5TRVJWSUNFX0NMQVNTKTsKLSAgICAgICAgQ2xhc3NMb2FkZXIgc2VydmljZUNsYXNzTG9hZGVyID0gYXhpc1NlcnZpY2UuZ2V0Q2xhc3NMb2FkZXIoKTsKLQotICAgICAgICBpZiAoaW1wbEluZm9QYXJhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzZXJ2aWNlQ2xhc3MgPSAoU3RyaW5nKWltcGxJbmZvUGFyYW0uZ2V0VmFsdWUoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIGlmIFNlcnZpY2VfQ2xhc3MgaXMgbnVsbCwgZXZlcnkgQWJzdHJhY3RNUiB3aWxsIGxvb2sgZm9yCi0gICAgICAgICAgICAvLyBTZXJ2aWNlT2JqZWN0U3VwcGxpZXIuIFRoaXMgaXMgdXNlciBzcGVjaWZpYyBhbmQgbWF5IGNvbnRhaW4KLSAgICAgICAgICAgIC8vIG90aGVyIGxvb2tzLgotICAgICAgICAgICAgaW1wbEluZm9QYXJhbSA9IGF4aXNTZXJ2aWNlCi0gICAgICAgICAgICAgICAgICAgIC5nZXRQYXJhbWV0ZXIoQ29uc3RhbnRzLlNFUlZJQ0VfT0JKRUNUX1NVUFBMSUVSKTsKLSAgICAgICAgICAgIGlmIChpbXBsSW5mb1BhcmFtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gKChTdHJpbmcpaW1wbEluZm9QYXJhbS5nZXRWYWx1ZSgpKS50cmltKCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgQ2xhc3Mgc2VydmljZU9iamVjdE1ha2VyID0gTG9hZGVyLmxvYWRDbGFzcygKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VDbGFzc0xvYWRlciwgY2xhc3NOYW1lKTsKLSAgICAgICAgICAgICAgICBpZiAoc2VydmljZU9iamVjdE1ha2VyLmdldE1vZGlmaWVycygpICE9IE1vZGlmaWVyLlBVQkxJQykgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJTZXJ2aWNlIGNsYXNzICIgKyBjbGFzc05hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgbXVzdCBoYXZlIHB1YmxpYyBhcyBhY2Nlc3MgTW9kaWZpZXIiKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBGaW5kIHN0YXRpYyBnZXRTZXJ2aWNlT2JqZWN0KCkgbWV0aG9kLCBjYWxsIGl0IGlmIHRoZXJlCi0gICAgICAgICAgICAgICAgZmluYWwgTWV0aG9kIG1ldGhvZCA9IChNZXRob2Qpb3JnLmFwYWNoZS5heGlzMi5qYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIC5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2VPYmplY3RNYWtlci5nZXRNZXRob2QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdldFNlcnZpY2VPYmplY3QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF4aXNTZXJ2aWNlLmNsYXNzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgICAgICBPYmplY3Qgb2JqID0gbnVsbDsKLSAgICAgICAgICAgICAgICBpZiAobWV0aG9kICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgb2JqID0gb3JnLmFwYWNoZS5heGlzMi5qYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtZXRob2QuaW52b2tlKHNlcnZpY2VPYmplY3RNYWtlci5uZXdJbnN0YW5jZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpc1NlcnZpY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChvYmogPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBsb2cud2FybigiU2VydmljZU9iamVjdFN1cHBsaWVyIGltcGxtZW50YXRpb24gT2JqZWN0IGNvdWxkIG5vdCBiZSBmb3VuZCIpOwotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2VydmljZUNsYXNzIG9yIFNlcnZpY2VPYmplY3RTdXBwbGllciBpbXBsbWVudGF0aW9uIE9iamVjdCBjb3VsZCBub3QgYmUgZm91bmQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2VydmljZUNsYXNzID0gb2JqLmdldENsYXNzKCkuZ2V0TmFtZSgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gYWRkaW5nIG5hbWUgc3BhY2VzCi0gICAgICAgIE5hbWVzcGFjZU1hcCBtYXAgPSBuZXcgTmFtZXNwYWNlTWFwKCk7Ci0gICAgICAgIG1hcC5wdXQoSmF2YTJXU0RMQ29uc3RhbnRzLkFYSVMyX05BTUVTUEFDRV9QUkVGSVgsCi0gICAgICAgICAgICAgICAgSmF2YTJXU0RMQ29uc3RhbnRzLkFYSVMyX1hTRCk7Ci0gICAgICAgIG1hcC5wdXQoSmF2YTJXU0RMQ29uc3RhbnRzLkRFRkFVTFRfU0NIRU1BX05BTUVTUEFDRV9QUkVGSVgsCi0gICAgICAgICAgICAgICAgSmF2YTJXU0RMQ29uc3RhbnRzLlVSSV8yMDAxX1NDSEVNQV9YU0QpOwotICAgICAgICBheGlzU2VydmljZS5zZXROYW1lc3BhY2VNYXAobWFwKTsKLSAgICAgICAgU2NoZW1hR2VuZXJhdG9yIHNjaGVtYUdlbmVyYXRvcjsKLSAgICAgICAgUGFyYW1ldGVyIGdlbmVyYXRlQmFyZSA9IGF4aXNTZXJ2aWNlCi0gICAgICAgICAgICAgICAgLmdldFBhcmFtZXRlcihKYXZhMldTRExDb25zdGFudHMuRE9DX0xJVF9CQVJFX1BBUkFNRVRFUik7Ci0gICAgICAgIGlmIChnZW5lcmF0ZUJhcmUgIT0gbnVsbCAmJiAidHJ1ZSIuZXF1YWxzKGdlbmVyYXRlQmFyZS5nZXRWYWx1ZSgpKSkgewotICAgICAgICAgICAgc2NoZW1hR2VuZXJhdG9yID0gbmV3IERvY0xpdEJhcmVTY2hlbWFHZW5lcmF0b3Ioc2VydmljZUNsYXNzTG9hZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZUNsYXNzLnRyaW0oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlLmdldFNjaGVtYVRhcmdldE5hbWVzcGFjZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpc1NlcnZpY2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFNjaGVtYVRhcmdldE5hbWVzcGFjZVByZWZpeCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpc1NlcnZpY2UpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc2NoZW1hR2VuZXJhdG9yID0gbmV3IERlZmF1bHRTY2hlbWFHZW5lcmF0b3Ioc2VydmljZUNsYXNzTG9hZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZUNsYXNzLnRyaW0oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlLmdldFNjaGVtYVRhcmdldE5hbWVzcGFjZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpc1NlcnZpY2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFNjaGVtYVRhcmdldE5hbWVzcGFjZVByZWZpeCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpc1NlcnZpY2UpOwotICAgICAgICB9Ci0gICAgICAgIHNjaGVtYUdlbmVyYXRvci5zZXRFeGNsdWRlTWV0aG9kcyhleGNsdWRlT3BlcmF0aW9ucyk7Ci0gICAgICAgIHNjaGVtYUdlbmVyYXRvci5zZXROb25ScGNNZXRob2RzKG5vblJwY01ldGhvZHMpOwotICAgICAgICBpZiAoIWF4aXNTZXJ2aWNlLmlzRWxlbWVudEZvcm1EZWZhdWx0KCkpIHsKLSAgICAgICAgICAgIHNjaGVtYUdlbmVyYXRvcgotICAgICAgICAgICAgICAgICAgICAuc2V0RWxlbWVudEZvcm1EZWZhdWx0KEphdmEyV1NETENvbnN0YW50cy5GT1JNX0RFRkFVTFRfVU5RVUFMSUZJRUQpOwotICAgICAgICB9Ci0gICAgICAgIC8vIHBhY2thZ2UgdG8gbmFtZXNwYWNlIG1hcAotICAgICAgICBzY2hlbWFHZW5lcmF0b3Iuc2V0UGtnMm5zbWFwKGF4aXNTZXJ2aWNlLmdldFAybk1hcCgpKTsKLSAgICAgICAgQ29sbGVjdGlvbiBzY2hlbWFzID0gc2NoZW1hR2VuZXJhdG9yLmdlbmVyYXRlU2NoZW1hKCk7Ci0gICAgICAgIGF4aXNTZXJ2aWNlLmFkZFNjaGVtYShzY2hlbWFzKTsKLSAgICAgICAgYXhpc1NlcnZpY2Uuc2V0U2NoZW1hVGFyZ2V0TmFtZXNwYWNlKHNjaGVtYUdlbmVyYXRvcgotICAgICAgICAgICAgICAgIC5nZXRTY2hlbWFUYXJnZXROYW1lU3BhY2UoKSk7Ci0gICAgICAgIGF4aXNTZXJ2aWNlLnNldFR5cGVUYWJsZShzY2hlbWFHZW5lcmF0b3IuZ2V0VHlwZVRhYmxlKCkpOwotICAgICAgICBpZiAoSmF2YTJXU0RMQ29uc3RhbnRzLkRFRkFVTFRfVEFSR0VUX05BTUVTUEFDRS5lcXVhbHMoYXhpc1NlcnZpY2UKLSAgICAgICAgICAgICAgICAuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpKSB7Ci0gICAgICAgICAgICBheGlzU2VydmljZQotICAgICAgICAgICAgICAgICAgICAuc2V0VGFyZ2V0TmFtZXNwYWNlKHNjaGVtYUdlbmVyYXRvci5nZXRUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBNZXRob2RbXSBtZXRob2QgPSBzY2hlbWFHZW5lcmF0b3IuZ2V0TWV0aG9kcygpOwotICAgICAgICBQaGFzZXNJbmZvIHBpbmZvID0gYXhpc0NvbmZpZy5nZXRQaGFzZXNJbmZvKCk7Ci0KLSAgICAgICAgZm9yIChNZXRob2Qgam1ldGhvZCA6IG1ldGhvZCkgewotICAgICAgICAgICAgU3RyaW5nIG9wTmFtZSA9IGptZXRob2QuZ2V0TmFtZSgpOwotICAgICAgICAgICAgQXhpc09wZXJhdGlvbiBvcGVyYXRpb24gPSBheGlzU2VydmljZQotICAgICAgICAgICAgICAgICAgICAuZ2V0T3BlcmF0aW9uKG5ldyBRTmFtZShvcE5hbWUpKTsKLSAgICAgICAgICAgIC8vIGlmIHRoZSBvcGVyYXRpb24gdGhlcmUgaW4gc2VydmljZXMueG1sIHRoZW4gdHJ5IHRvIHNldCBpdCBzY2hlbWEKLSAgICAgICAgICAgIC8vIGVsZW1lbnQgbmFtZQotICAgICAgICAgICAgaWYgKG9wZXJhdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgb3BlcmF0aW9uID0gYXhpc1NlcnZpY2UuZ2V0T3BlcmF0aW9uKG5ldyBRTmFtZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIGptZXRob2QuZ2V0TmFtZSgpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBNZXNzYWdlUmVjZWl2ZXIgbXIgPQotICAgICAgICAgICAgICAgICAgICBheGlzU2VydmljZS5nZXRNZXNzYWdlUmVjZWl2ZXIob3BlcmF0aW9uLmdldE1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4oKSk7Ci0gICAgICAgICAgICBpZiAobXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1yID0gYXhpc0NvbmZpZy5nZXRNZXNzYWdlUmVjZWl2ZXIob3BlcmF0aW9uLmdldE1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4oKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAob3BlcmF0aW9uLmdldE1lc3NhZ2VSZWNlaXZlcigpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBvcGVyYXRpb24uc2V0TWVzc2FnZVJlY2VpdmVyKG1yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBpbmZvLnNldE9wZXJhdGlvblBoYXNlcyhvcGVyYXRpb24pOwotICAgICAgICAgICAgYXhpc1NlcnZpY2UuYWRkT3BlcmF0aW9uKG9wZXJhdGlvbik7Ci0gICAgICAgICAgICBpZiAob3BlcmF0aW9uLmdldFNvYXBBY3Rpb24oKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgb3BlcmF0aW9uLnNldFNvYXBBY3Rpb24oInVybjoiICsgb3BOYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQXhpc09wZXJhdGlvbiBnZXRBeGlzT3BlcmF0aW9uRm9ySm1ldGhvZChNZXRob2QgbWV0aG9kKQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIEF4aXNPcGVyYXRpb24gb3BlcmF0aW9uOwotICAgICAgICBpZiAoInZvaWQiLmVxdWFscyhtZXRob2QuZ2V0UmV0dXJuVHlwZSgpLmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgIGlmIChtZXRob2QuZ2V0RXhjZXB0aW9uVHlwZXMoKS5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICAgICAgb3BlcmF0aW9uID0gQXhpc09wZXJhdGlvbkZhY3RvcnkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRBeGlzT3BlcmF0aW9uKFdTRExDb25zdGFudHMuTUVQX0NPTlNUQU5UX1JPQlVTVF9JTl9PTkxZKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgb3BlcmF0aW9uID0gQXhpc09wZXJhdGlvbkZhY3RvcnkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRBeGlzT3BlcmF0aW9uKFdTRExDb25zdGFudHMuTUVQX0NPTlNUQU5UX0lOX09OTFkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgb3BlcmF0aW9uID0gQXhpc09wZXJhdGlvbkZhY3RvcnkKLSAgICAgICAgICAgICAgICAgICAgLmdldEF4aXNPcGVyYXRpb24oV1NETENvbnN0YW50cy5NRVBfQ09OU1RBTlRfSU5fT1VUKTsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgb3BOYW1lID0gbWV0aG9kLmdldE5hbWUoKTsKLSAgICAgICAgb3BlcmF0aW9uLnNldE5hbWUobmV3IFFOYW1lKG9wTmFtZSkpOwotICAgICAgICBXZWJNZXRob2QgbWV0aG9kQW5ub24gPSBtZXRob2QuZ2V0QW5ub3RhdGlvbihXZWJNZXRob2QuY2xhc3MpOwotICAgICAgICBpZiAobWV0aG9kQW5ub24gIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIGFjdGlvbiA9IG1ldGhvZEFubm9uLmFjdGlvbigpOwotICAgICAgICAgICAgaWYgKGFjdGlvbiAhPSBudWxsICYmICEiIi5lcXVhbHMoYWN0aW9uKSkgewotICAgICAgICAgICAgICAgIG9wZXJhdGlvbi5zZXRTb2FwQWN0aW9uKGFjdGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG9wZXJhdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9NRWxlbWVudCBnZXRQYXJhbWV0ZXIoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBsb2NrZWQpIHsKLSAgICAgICAgT01GYWN0b3J5IGZhYyA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpOwotICAgICAgICBPTUVsZW1lbnQgcGFyYW1ldGVyID0gZmFjLmNyZWF0ZU9NRWxlbWVudCgicGFyYW1ldGVyIiwgbnVsbCk7Ci0gICAgICAgIHBhcmFtZXRlci5hZGRBdHRyaWJ1dGUoIm5hbWUiLCBuYW1lLCBudWxsKTsKLSAgICAgICAgcGFyYW1ldGVyLmFkZEF0dHJpYnV0ZSgibG9ja2VkIiwgQm9vbGVhbi50b1N0cmluZyhsb2NrZWQpLCBudWxsKTsKLSAgICAgICAgcGFyYW1ldGVyLnNldFRleHQodmFsdWUpOwotICAgICAgICByZXR1cm4gcGFyYW1ldGVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1vZHVsZXMgY2FuIGNvbnRhaW4gc2VydmljZXMgaW4gc29tZSBjYXNlcy4gIFRoaXMgbWV0aG9kIHdpbGwgZGVwbG95IGFsbCB0aGUgc2VydmljZXMKLSAgICAgKiBmb3IgYSBnaXZlbiBBeGlzTW9kdWxlIGludG8gdGhlIGN1cnJlbnQgQXhpc0NvbmZpZ3VyYXRpb24uCi0gICAgICogPHA+Ci0gICAgICogVGhlIGNvZGUgbG9va3MgZm9yIGFuICJhYXJzLyIgZGlyZWN0b3J5IGluc2lkZSB0aGUgbW9kdWxlIChlaXRoZXIgLm1hciBvciBleHBsb2RlZCksCi0gICAgICogYW5kIGFuICJhYXJzLmxpc3QiIGZpbGUgaW5zaWRlIHRoYXQgdG8gZmlndXJlIG91dCB3aGljaCBzZXJ2aWNlcyB0byBkZXBsb3kuICBOb3RlIHRoYXQgYWxsCi0gICAgICogc2VydmljZXMgZGVwbG95ZWQgdGhpcyB3YXkgd2lsbCBoYXZlIGFjY2VzcyB0byB0aGUgTW9kdWxlJ3MgY2xhc3Nlcy4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbW9kdWxlIHRoZSBBeGlzTW9kdWxlIHRvIHNlYXJjaCBmb3Igc2VydmljZXMKLSAgICAgKiBAcGFyYW0gY29uZmlnQ3R4IENvbmZpZ3VyYXRpb25Db250ZXh0IGluIHdoaWNoIHRvIGRlcGxveQotICAgICAqLwotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGRlcGxveU1vZHVsZVNlcnZpY2VzKEF4aXNNb2R1bGUgbW9kdWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDdHgpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZyA9IGNvbmZpZ0N0eC5nZXRBeGlzQ29uZmlndXJhdGlvbigpOwotICAgICAgICAgICAgQXJjaGl2ZVJlYWRlciBhcmNoaXZlUmVhZGVyID0gbmV3IEFyY2hpdmVSZWFkZXIoKTsKLSAgICAgICAgICAgIFBoYXNlc0luZm8gcGhhc2VzSW5mbyA9IGF4aXNDb25maWcuZ2V0UGhhc2VzSW5mbygpOwotICAgICAgICAgICAgZmluYWwgQ2xhc3NMb2FkZXIgbW9kdWxlQ2xhc3NMb2FkZXIgPSBtb2R1bGUuZ2V0TW9kdWxlQ2xhc3NMb2FkZXIoKTsKLSAgICAgICAgICAgIEFycmF5TGlzdCBzZXJ2aWNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgIGZpbmFsIElucHV0U3RyZWFtIGluID0gKElucHV0U3RyZWFtKW9yZy5hcGFjaGUuYXhpczIuamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyCi0gICAgICAgICAgICAgICAgICAgIC5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRBY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbW9kdWxlQ2xhc3NMb2FkZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRSZXNvdXJjZUFzU3RyZWFtKCJhYXJzL2FhcnMubGlzdCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIGlmIChpbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgQnVmZmVyZWRSZWFkZXIgaW5wdXQ7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgaW5wdXQgPSBuZXcgQnVmZmVyZWRSZWFkZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKElucHV0U3RyZWFtUmVhZGVyKW9yZy5hcGFjaGUuYXhpczIuamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkQWN0aW9uKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IElucHV0U3RyZWFtUmVhZGVyKGluKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBsaW5lOwotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKGxpbmUgPSBpbnB1dC5yZWFkTGluZSgpKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsaW5lID0gbGluZS50cmltKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGluZS5sZW5ndGgoKSA+IDAgJiYgbGluZS5jaGFyQXQoMCkgIT0gJyMnKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZXMuYWRkKGxpbmUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlucHV0LmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHNlcnZpY2VzLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBmb3IgKE9iamVjdCBzZXJ2aWNlMSA6IHNlcnZpY2VzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBzZXJ2aWNlbmFtZSA9IChTdHJpbmcpc2VydmljZTE7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzZXJ2aWNlbmFtZSA9PSBudWxsIHx8ICIiLmVxdWFscyhzZXJ2aWNlbmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGZpbiA9IChJbnB1dFN0cmVhbSlvcmcuYXBhY2hlLmF4aXMyLmphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRBY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vZHVsZUNsYXNzTG9hZGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRSZXNvdXJjZUFzU3RyZWFtKCJhYXJzLyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzZXJ2aWNlbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZpbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJObyBzZXJ2aWNlIGFyY2hpdmUgZm91bmQgOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc2VydmljZW5hbWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIEZpbGUgaW5wdXRGaWxlID0gVXRpbHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlVGVtcEZpbGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGaWxlKWF4aXNDb25maWcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFBhcmFtZXRlclZhbHVlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5Db25maWd1cmF0aW9uLkFSVElGQUNUU19URU1QX0RJUikpOwotICAgICAgICAgICAgICAgICAgICBEZXBsb3ltZW50RmlsZURhdGEgZmlsZWRhdGEgPSBuZXcgRGVwbG95bWVudEZpbGVEYXRhKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0RmlsZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgZmlsZWRhdGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0Q2xhc3NMb2FkZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZUNsYXNzTG9hZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZpbGUpYXhpc0NvbmZpZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UGFyYW1ldGVyVmFsdWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uQVJUSUZBQ1RTX1RFTVBfRElSKSk7Ci0gICAgICAgICAgICAgICAgICAgIEhhc2hNYXAgd3NkbHNlcnZpY2UgPSBhcmNoaXZlUmVhZGVyLnByb2Nlc3NXU0RMcyhmaWxlZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh3c2Rsc2VydmljZSAhPSBudWxsICYmIHdzZGxzZXJ2aWNlLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yIHNlcnZpY2VzaXRyID0gd3NkbHNlcnZpY2UudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChzZXJ2aWNlc2l0ci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBeGlzU2VydmljZSBzZXJ2aWNlID0gKEF4aXNTZXJ2aWNlKXNlcnZpY2VzaXRyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yIG9wZXJhdGlvbnMgPSBzZXJ2aWNlLmdldE9wZXJhdGlvbnMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAob3BlcmF0aW9ucy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uID0gKEF4aXNPcGVyYXRpb24pb3BlcmF0aW9ucwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoYXNlc0luZm8uc2V0T3BlcmF0aW9uUGhhc2VzKGF4aXNPcGVyYXRpb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBBeGlzU2VydmljZUdyb3VwIHNlcnZpY2VHcm91cCA9IG5ldyBBeGlzU2VydmljZUdyb3VwKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNDb25maWcpOwotICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlR3JvdXAuc2V0U2VydmljZUdyb3VwQ2xhc3NMb2FkZXIoZmlsZWRhdGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Q2xhc3NMb2FkZXIoKSk7Ci0gICAgICAgICAgICAgICAgICAgIEFycmF5TGlzdCBzZXJ2aWNlTGlzdCA9IGFyY2hpdmVSZWFkZXIucHJvY2Vzc1NlcnZpY2VHcm91cCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlZGF0YS5nZXRBYnNvbHV0ZVBhdGgoKSwgZmlsZWRhdGEsIHNlcnZpY2VHcm91cCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgd3NkbHNlcnZpY2UsIGNvbmZpZ0N0eCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoT2JqZWN0IGFTZXJ2aWNlTGlzdCA6IHNlcnZpY2VMaXN0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBeGlzU2VydmljZSBheGlzU2VydmljZSA9IChBeGlzU2VydmljZSlhU2VydmljZUxpc3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXIgbW9kdWxlU2VydmljZSA9IG5ldyBQYXJhbWV0ZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVNlcnZpY2Uuc2V0VmFsdWUoInRydWUiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVNlcnZpY2Uuc2V0TmFtZShBeGlzTW9kdWxlLk1PRFVMRV9TRVJWSUNFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlLmFkZFBhcmFtZXRlcihtb2R1bGVTZXJ2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VHcm91cC5hZGRTZXJ2aWNlKGF4aXNTZXJ2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBheGlzQ29uZmlnLmFkZFNlcnZpY2VHcm91cChzZXJ2aWNlR3JvdXApOwotICAgICAgICAgICAgICAgICAgICBmaW4uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEF4aXNGYXVsdC5tYWtlRmF1bHQoZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBOb3JtYWxpemUgYSB1cmkgY29udGFpbmluZyAuLi8gYW5kIC4vIHBhdGhzLgotICAgICAqCi0gICAgICogQHBhcmFtIHVyaSBUaGUgdXJpIHBhdGggdG8gbm9ybWFsaXplCi0gICAgICogQHJldHVybiBUaGUgbm9ybWFsaXplZCB1cmkKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBub3JtYWxpemUoU3RyaW5nIHVyaSkgewotICAgICAgICBpZiAoIiIuZXF1YWxzKHVyaSkpIHsKLSAgICAgICAgICAgIHJldHVybiB1cmk7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IGxlYWRpbmdTbGFzaGVzOwotICAgICAgICBmb3IgKGxlYWRpbmdTbGFzaGVzID0gMDsgbGVhZGluZ1NsYXNoZXMgPCB1cmkubGVuZ3RoKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHVyaS5jaGFyQXQobGVhZGluZ1NsYXNoZXMpID09ICcvJzsgKytsZWFkaW5nU2xhc2hlcykgewotICAgICAgICAgICAgLy8gRklYTUU6IHRoaXMgYmxvY2sgaXMgZW1wdHkhIQotICAgICAgICB9Ci0gICAgICAgIGJvb2xlYW4gaXNEaXIgPSAodXJpLmNoYXJBdCh1cmkubGVuZ3RoKCkgLSAxKSA9PSAnLycpOwotICAgICAgICBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHVyaSwgIi8iKTsKLSAgICAgICAgTGlua2VkTGlzdCBjbGVhbiA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0gICAgICAgIHdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpIHsKLSAgICAgICAgICAgIFN0cmluZyB0b2tlbiA9IHN0Lm5leHRUb2tlbigpOwotICAgICAgICAgICAgaWYgKCIuLiIuZXF1YWxzKHRva2VuKSkgewotICAgICAgICAgICAgICAgIGlmICghY2xlYW4uaXNFbXB0eSgpICYmICEiLi4iLmVxdWFscyhjbGVhbi5nZXRMYXN0KCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNsZWFuLnJlbW92ZUxhc3QoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFzdC5oYXNNb3JlVG9rZW5zKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlzRGlyID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGNsZWFuLmFkZCgiLi4iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCEiLiIuZXF1YWxzKHRva2VuKSAmJiAhIiIuZXF1YWxzKHRva2VuKSkgewotICAgICAgICAgICAgICAgIGNsZWFuLmFkZCh0b2tlbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICB3aGlsZSAobGVhZGluZ1NsYXNoZXMtLSA+IDApIHsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgnLycpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBjbGVhbi5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoaXQubmV4dCgpKTsKLSAgICAgICAgICAgIGlmIChpdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoJy8nKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoaXNEaXIgJiYgc2IubGVuZ3RoKCkgPiAwICYmIHNiLmNoYXJBdChzYi5sZW5ndGgoKSAtIDEpICE9ICcvJykgewotICAgICAgICAgICAgc2IuYXBwZW5kKCcvJyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UGF0aChTdHJpbmcgcGFyZW50LCBTdHJpbmcgY2hpbGRQYXRoKSB7Ci0gICAgICAgIFN0YWNrIHBhcmVudFN0YWNrID0gbmV3IFN0YWNrKCk7Ci0gICAgICAgIFN0YWNrIGNoaWxkU3RhY2sgPSBuZXcgU3RhY2soKTsKLSAgICAgICAgaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmdbXSB2YWx1ZXMgPSBwYXJlbnQuc3BsaXQoIi8iKTsKLSAgICAgICAgICAgIGlmICh2YWx1ZXMubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIHZhbHVlIDogdmFsdWVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmVudFN0YWNrLnB1c2godmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBTdHJpbmdbXSB2YWx1ZXMgPSBjaGlsZFBhdGguc3BsaXQoIi8iKTsKLSAgICAgICAgaWYgKHZhbHVlcy5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICBmb3IgKFN0cmluZyB2YWx1ZSA6IHZhbHVlcykgewotICAgICAgICAgICAgICAgIGNoaWxkU3RhY2sucHVzaCh2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nIGZpbGVwYXRoID0gIiI7Ci0gICAgICAgIHdoaWxlICghY2hpbGRTdGFjay5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IChTdHJpbmcpY2hpbGRTdGFjay5wb3AoKTsKLSAgICAgICAgICAgIGlmICgiLi4iLmVxdWFscyh2YWx1ZSkpIHsKLSAgICAgICAgICAgICAgICBwYXJlbnRTdGFjay5wb3AoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoISIiLmVxdWFscyh2YWx1ZSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoIiIuZXF1YWxzKGZpbGVwYXRoKSkgewotICAgICAgICAgICAgICAgICAgICBmaWxlcGF0aCA9IHZhbHVlOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbGVwYXRoID0gdmFsdWUgKyAiLyIgKyBmaWxlcGF0aDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgd2hpbGUgKCFwYXJlbnRTdGFjay5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IChTdHJpbmcpcGFyZW50U3RhY2sucG9wKCk7Ci0gICAgICAgICAgICBpZiAoISIiLmVxdWFscyh2YWx1ZSkpIHsKLSAgICAgICAgICAgICAgICBmaWxlcGF0aCA9IHZhbHVlICsgIi8iICsgZmlsZXBhdGg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZpbGVwYXRoOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBuYW1lcyBvZiBhbGwgKi5qYXIgZmlsZXMgaW5zaWRlIHRoZSBsaWIvIGRpcmVjdG9yeSBvZiBhIGdpdmVuIGphciBVUkwKLSAgICAgKgotICAgICAqIEBwYXJhbSB1cmwgYmFzZSBVUkwgb2YgYSBKQVIgdG8gc2VhcmNoCi0gICAgICogQHJldHVybiBhIExpc3QgY29udGFpbmluZyBmaWxlIG5hbWVzIChTdHJpbmdzKSBvZiBhbGwgZmlsZXMgbWF0Y2hpbmcgIltsTF1pYi8qLmphciIKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIExpc3QgZmluZExpYkphcnMoVVJMIHVybCkgewotICAgICAgICBBcnJheUxpc3QgZW1iZWRkZWRfamFycyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFppcElucHV0U3RyZWFtIHppbiA9IG5ldyBaaXBJbnB1dFN0cmVhbSh1cmwub3BlblN0cmVhbSgpKTsKLSAgICAgICAgICAgIFppcEVudHJ5IGVudHJ5OwotICAgICAgICAgICAgU3RyaW5nIGVudHJ5TmFtZTsKLSAgICAgICAgICAgIHdoaWxlICgoZW50cnkgPSB6aW4uZ2V0TmV4dEVudHJ5KCkpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBlbnRyeU5hbWUgPSBlbnRyeS5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogaWYgdGhlIGVudHJ5IG5hbWUgc3RhcnQgd2l0aCAvbGliIGFuZCBlbmRzIHdpdGggLmphciBhZGQgaXQKLSAgICAgICAgICAgICAgICAgKiB0byB0aGUgdGhlIGFycmF5bGlzdAotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIGlmIChlbnRyeU5hbWUgIT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAmJiAoZW50cnlOYW1lLnN0YXJ0c1dpdGgoImxpYi8iKSB8fCBlbnRyeU5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgIC5zdGFydHNXaXRoKCJMaWIvIikpCi0gICAgICAgICAgICAgICAgICAgICYmIGVudHJ5TmFtZS5lbmRzV2l0aCgiLmphciIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVtYmVkZGVkX2phcnMuYWRkKGVudHJ5TmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgemluLmNsb3NlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZW1iZWRkZWRfamFyczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgdGhlIEF4aXMyIGxpZmVjeWNsZSAvIHNlc3Npb24gbWV0aG9kcyB0byBhIHByZS1leGlzdGluZyBsaXN0IG9mIG5hbWVzIHRoYXQgd2lsbCBiZQotICAgICAqIGV4Y2x1ZGVkIHdoZW4gZ2VuZXJhdGluZyBzY2hlbWFzLgotICAgICAqCi0gICAgICogQHBhcmFtIGV4Y2x1ZGVMaXN0IGFuIEFycmF5TGlzdCBjb250YWluaW5nIG1ldGhvZCBuYW1lcyAtIHdlJ2xsIGFkZCBvdXJzIHRvIHRoaXMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZEV4Y2x1ZGVNZXRob2RzKEFycmF5TGlzdCBleGNsdWRlTGlzdCkgewotICAgICAgICBleGNsdWRlTGlzdC5hZGQoImluaXQiKTsKLSAgICAgICAgZXhjbHVkZUxpc3QuYWRkKCJzZXRPcGVyYXRpb25Db250ZXh0Iik7Ci0gICAgICAgIGV4Y2x1ZGVMaXN0LmFkZCgic3RhcnRVcCIpOwotICAgICAgICBleGNsdWRlTGlzdC5hZGQoImRlc3Ryb3kiKTsKLSAgICAgICAgZXhjbHVkZUxpc3QuYWRkKCJzaHV0RG93biIpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgRGVwbG95bWVudENsYXNzTG9hZGVyIGNyZWF0ZUNsYXNzTG9hZGVyKEZpbGUgc2VydmljZUZpbGUpCi0gICAgICAgICAgICB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKLSAgICAgICAgQ2xhc3NMb2FkZXIgY29udGV4dENsYXNzTG9hZGVyID0KLSAgICAgICAgICAgICAgICAoQ2xhc3NMb2FkZXIpb3JnLmFwYWNoZS5heGlzMi5qYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIC5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRBY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0pOwotICAgICAgICByZXR1cm4gY3JlYXRlRGVwbG95bWVudENsYXNzTG9hZGVyKG5ldyBVUkxbXXtzZXJ2aWNlRmlsZS50b1VSTCgpfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0Q2xhc3NMb2FkZXIsIG5ldyBBcnJheUxpc3QoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBDbGFzc0xvYWRlciBjcmVhdGVDbGFzc0xvYWRlcihBcnJheUxpc3QgdXJscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzTG9hZGVyIHNlcnZpY2VDbGFzc0xvYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZXh0cmFjdEphcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlIHRtcERpcikgewotICAgICAgICBVUkwgdXJsID0gKFVSTCl1cmxzLmdldCgwKTsKLSAgICAgICAgaWYgKGV4dHJhY3RKYXJzKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIFVSTFtdIHVybHMxID0gVXRpbHMuZ2V0VVJMc0ZvckFsbEphcnModXJsLCB0bXBEaXIpOwotICAgICAgICAgICAgICAgIHVybHMucmVtb3ZlKDApOwotICAgICAgICAgICAgICAgIHVybHMuYWRkQWxsKDAsIEFycmF5cy5hc0xpc3QodXJsczEpKTsKLSAgICAgICAgICAgICAgICBVUkxbXSB1cmxzMiA9IChVUkxbXSl1cmxzLnRvQXJyYXkobmV3IFVSTFt1cmxzLnNpemUoKV0pOwotICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVEZXBsb3ltZW50Q2xhc3NMb2FkZXIodXJsczIsIHNlcnZpY2VDbGFzc0xvYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBsb2cKLSAgICAgICAgICAgICAgICAgICAgICAgIC53YXJuKCJFeGNlcHRpb24gZXh0cmFjdGluZyBqYXJzIGludG8gdGVtcG9yYXJ5IGRpcmVjdG9yeSA6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiA6IHN3aXRjaGluZyB0byBhbHRlcm5hdGUgY2xhc3MgbG9hZGluZyBtZWNoYW5pc20iKTsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIExpc3QgZW1iZWRkZWRfamFycyA9IFV0aWxzLmZpbmRMaWJKYXJzKHVybCk7Ci0gICAgICAgIFVSTFtdIHVybHMyID0gKFVSTFtdKXVybHMudG9BcnJheShuZXcgVVJMW3VybHMuc2l6ZSgpXSk7Ci0gICAgICAgIHJldHVybiBjcmVhdGVEZXBsb3ltZW50Q2xhc3NMb2FkZXIodXJsczIsIHNlcnZpY2VDbGFzc0xvYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWJlZGRlZF9qYXJzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEZpbGUgdG9GaWxlKFVSTCB1cmwpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHBhdGggPSBVUkxEZWNvZGVyLmRlY29kZSh1cmwuZ2V0UGF0aCgpLCBkZWZhdWx0RW5jb2RpbmcpOwotICAgICAgICByZXR1cm4gbmV3IEZpbGUocGF0aC5yZXBsYWNlKCcvJywgRmlsZS5zZXBhcmF0b3JDaGFyKS5yZXBsYWNlKCd8JywgJzonKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBDbGFzc0xvYWRlciBjcmVhdGVDbGFzc0xvYWRlcihVUkxbXSB1cmxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NMb2FkZXIgc2VydmljZUNsYXNzTG9hZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBleHRyYWN0SmFycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUgdG1wRGlyKSB7Ci0gICAgICAgIGlmIChleHRyYWN0SmFycykgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBVUkxbXSB1cmxzMSA9IFV0aWxzLmdldFVSTHNGb3JBbGxKYXJzKHVybHNbMF0sIHRtcERpcik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZURlcGxveW1lbnRDbGFzc0xvYWRlcih1cmxzMSwgc2VydmljZUNsYXNzTG9hZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGxvZwotICAgICAgICAgICAgICAgICAgICAgICAgLndhcm4oIkV4Y2VwdGlvbiBleHRyYWN0aW5nIGphcnMgaW50byB0ZW1wb3JhcnkgZGlyZWN0b3J5IDogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIDogc3dpdGNoaW5nIHRvIGFsdGVybmF0ZSBjbGFzcyBsb2FkaW5nIG1lY2hhbmlzbSIpOwotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgTGlzdCBlbWJlZGRlZF9qYXJzID0gVXRpbHMuZmluZExpYkphcnModXJsc1swXSk7Ci0gICAgICAgIHJldHVybiBjcmVhdGVEZXBsb3ltZW50Q2xhc3NMb2FkZXIodXJscywgc2VydmljZUNsYXNzTG9hZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtYmVkZGVkX2phcnMpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIERlcGxveW1lbnRDbGFzc0xvYWRlciBjcmVhdGVEZXBsb3ltZW50Q2xhc3NMb2FkZXIoCi0gICAgICAgICAgICBmaW5hbCBVUkxbXSB1cmxzLCBmaW5hbCBDbGFzc0xvYWRlciBzZXJ2aWNlQ2xhc3NMb2FkZXIsCi0gICAgICAgICAgICBmaW5hbCBMaXN0IGVtYmVkZGVkSmFycykgewotICAgICAgICByZXR1cm4gKERlcGxveW1lbnRDbGFzc0xvYWRlcilBY2Nlc3NDb250cm9sbGVyCi0gICAgICAgICAgICAgICAgLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEFjdGlvbigpIHsKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERlcGxveW1lbnRDbGFzc0xvYWRlcih1cmxzLCBlbWJlZGRlZEphcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlQ2xhc3NMb2FkZXIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgaXMgdG8gcHJvY2VzcyBiZWFuIGV4Y2x1ZGUgcGFyYW1ldGVyIGFuZCB0aGUgWE1MIGZvcm1hdCBvZiB0aGF0IHdvdWxkIGJlCi0gICAgICogPHBhcmFtZXRlciBuYW1lPSJiZWFuUHJvcGVydHlSdWxlcyI+IDxiZWFuIGNsYXNzPSJmdWxsIHF1YWxpZmllZCBjbGFzcyBuYW1lIgotICAgICAqIGV4Y2x1ZGVQcm9wZXJ0aWVzPSJuYW1lLGFnZSIvPisgPC9wYXJhbWV0ZXI+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gc2VydmljZSAsIEF4aXNTZXJ2aWNlIG9iamVjdAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwcm9jZXNzQmVhblByb3BlcnR5RXhjbHVkZShBeGlzU2VydmljZSBzZXJ2aWNlKSB7Ci0gICAgICAgIFBhcmFtZXRlciBleGNsdWRlQmVhblByb3BlcnR5ID0gc2VydmljZQotICAgICAgICAgICAgICAgIC5nZXRQYXJhbWV0ZXIoImJlYW5Qcm9wZXJ0eVJ1bGVzIik7Ci0gICAgICAgIGlmIChleGNsdWRlQmVhblByb3BlcnR5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBwYXJhbWV0ZXJFbGVtZW50ID0gZXhjbHVkZUJlYW5Qcm9wZXJ0eQotICAgICAgICAgICAgICAgICAgICAuZ2V0UGFyYW1ldGVyRWxlbWVudCgpOwotICAgICAgICAgICAgSXRlcmF0b3IgYm5lYXNJdHIgPSBwYXJhbWV0ZXJFbGVtZW50LmdldENoaWxkcmVuV2l0aE5hbWUobmV3IFFOYW1lKAotICAgICAgICAgICAgICAgICAgICAiYmVhbiIpKTsKLSAgICAgICAgICAgIEV4Y2x1ZGVJbmZvIGV4Y2x1ZGVJbmZvID0gbmV3IEV4Y2x1ZGVJbmZvKCk7Ci0gICAgICAgICAgICB3aGlsZSAoYm5lYXNJdHIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgT01FbGVtZW50IGJlYW4gPSAoT01FbGVtZW50KWJuZWFzSXRyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgY2xhenogPSBiZWFuLmdldEF0dHJpYnV0ZVZhbHVlKG5ldyBRTmFtZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIERlcGxveW1lbnRDb25zdGFudHMuVEFHX0NMQVNTX05BTUUpKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZXhjbHVkZVByb3BlcnRlZXMgPSBiZWFuLmdldEF0dHJpYnV0ZVZhbHVlKG5ldyBRTmFtZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIERlcGxveW1lbnRDb25zdGFudHMuVEFHX0VYQ0xVREVfUFJPUEVSVElFUykpOwotICAgICAgICAgICAgICAgIFN0cmluZyBpbmNsdWRlUHJvcGVydGllcyA9IGJlYW4uZ2V0QXR0cmlidXRlVmFsdWUobmV3IFFOYW1lKAotICAgICAgICAgICAgICAgICAgICAgICAgRGVwbG95bWVudENvbnN0YW50cy5UQUdfSU5DTFVERV9QUk9QRVJUSUVTKSk7Ci0gICAgICAgICAgICAgICAgZXhjbHVkZUluZm8ucHV0QmVhbkluZm8oY2xhenosIG5ldyBCZWFuRXhjbHVkZUluZm8oCi0gICAgICAgICAgICAgICAgICAgICAgICBleGNsdWRlUHJvcGVydGVlcywgaW5jbHVkZVByb3BlcnRpZXMpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNlcnZpY2Uuc2V0RXhjbHVkZUluZm8oZXhjbHVkZUluZm8pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U2hvcnRGaWxlTmFtZShTdHJpbmcgZmlsZW5hbWUpIHsKLSAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoZmlsZW5hbWUpOwotICAgICAgICByZXR1cm4gZmlsZS5nZXROYW1lKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIHV0aWwgbWV0aG9kIHRvIHByZXBhcmUgdGhlIEpTUiAxODEgYW5ub3RhdGVkIHNlcnZpY2UgbmFtZSBmcm9tIGdpdmVuIGFubm90YXRpb24gb3IgZm9yCi0gICAgICogZGVmYXVsdHMgSlNSIDE4MSBzcGVjaWZpZXMgdGhhdCB0aGUgaW4gamF2YXguandzLldlYlNlcnZpY2UgdGhlIHBhcmFtZXRlciBzZXJ2aWNlTmFtZQotICAgICAqIGNvbnRhaW5zIHRoZSB3c2RsOnNlcnZpY2UgbmFtZSB0byBtYXBwLiBJZiBpdHMgbm90IGF2YWlsYWJsZSB0aGVuIHRoZSBkZWZhdWx0IHdpbGwgYmUgU2ltcGxlCi0gICAgICogbmFtZSBvZiB0aGUgY2xhc3MgKyAiU2VydmljZSIKLSAgICAgKgotICAgICAqIEBwYXJhbSBzZXJ2aWNlQ2xhc3MgdGhlIHNlcnZpY2UgQ2xhc3MKLSAgICAgKiBAcGFyYW0gc2VydmljZUFubm90YXRpb24gYSBXZWJTZXJ2aWNlIGFubm90YXRpb24sIG9yIG51bGwKLSAgICAgKiBAcmV0dXJuIFN0cmluZyB2ZXJzaW9uIG9mIHRoZSBTZXJ2aWNlTmFtZSBhY2NvcmRpbmcgdG8gdGhlIEpTUiAxODEgc3BlYwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEFubm90YXRlZFNlcnZpY2VOYW1lKENsYXNzIHNlcnZpY2VDbGFzcywgV2ViU2VydmljZSBzZXJ2aWNlQW5ub3RhdGlvbikgewotICAgICAgICBTdHJpbmcgc2VydmljZU5hbWUgPSAiIjsKLSAgICAgICAgaWYgKHNlcnZpY2VBbm5vdGF0aW9uICE9IG51bGwgJiYgc2VydmljZUFubm90YXRpb24uc2VydmljZU5hbWUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzZXJ2aWNlTmFtZSA9IHNlcnZpY2VBbm5vdGF0aW9uLnNlcnZpY2VOYW1lKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNlcnZpY2VOYW1lLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgIHNlcnZpY2VOYW1lID0gc2VydmljZUNsYXNzLmdldE5hbWUoKTsKLSAgICAgICAgICAgIGludCBmaXJzdENoYXIgPSBzZXJ2aWNlTmFtZS5sYXN0SW5kZXhPZignLicpICsgMTsKLSAgICAgICAgICAgIGlmIChmaXJzdENoYXIgPiAwKSB7Ci0gICAgICAgICAgICAgICAgc2VydmljZU5hbWUgPSBzZXJ2aWNlTmFtZS5zdWJzdHJpbmcoZmlyc3RDaGFyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNlcnZpY2VOYW1lICs9ICJTZXJ2aWNlIjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc2VydmljZU5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZEVuZHBvaW50c1RvU2VydmljZShBeGlzU2VydmljZSBheGlzU2VydmljZSkKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotCi0gICAgICAgIFN0cmluZyBzZXJ2aWNlTmFtZSA9IGF4aXNTZXJ2aWNlLmdldE5hbWUoKTsKLSAgICAgICAgSXRlcmF0b3IgdHJhbnNwb3J0SW5WYWx1ZXMgPSBudWxsOwotCi0gICAgICAgIGlmIChheGlzU2VydmljZS5pc0VuYWJsZUFsbFRyYW5zcG9ydHMoKSkgewotICAgICAgICAgICAgQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZ3VyYXRpb24gPSBheGlzU2VydmljZQotICAgICAgICAgICAgICAgICAgICAuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKTsKLSAgICAgICAgICAgIGlmIChheGlzQ29uZmlndXJhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgQXJyYXlMaXN0IHRyYW5zcG9ydHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgZm9yIChPYmplY3QgbyA6IGF4aXNDb25maWd1cmF0aW9uLmdldFRyYW5zcG9ydHNJbigpLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFRyYW5zcG9ydEluRGVzY3JpcHRpb24gdHJhbnNwb3J0SW5EZXNjcmlwdGlvbiA9IChUcmFuc3BvcnRJbkRlc2NyaXB0aW9uKW87Ci0gICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydHMuYWRkKHRyYW5zcG9ydEluRGVzY3JpcHRpb24uZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdHJhbnNwb3J0SW5WYWx1ZXMgPSB0cmFuc3BvcnRzLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0cmFuc3BvcnRJblZhbHVlcyA9IGF4aXNTZXJ2aWNlLmdldEV4cG9zZWRUcmFuc3BvcnRzKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEhhc2hNYXAgYmluZGluZ0NhY2hlID0gbmV3IEhhc2hNYXAoKTsKLQotICAgICAgICBpZiAodHJhbnNwb3J0SW5WYWx1ZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yICg7IHRyYW5zcG9ydEluVmFsdWVzLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdHJhbnNwb3J0TmFtZSA9IChTdHJpbmcpdHJhbnNwb3J0SW5WYWx1ZXMubmV4dCgpOwotICAgICAgICAgICAgICAgIFN0cmluZyBwcm90b2NvbCA9IHRyYW5zcG9ydE5hbWUuc3Vic3RyaW5nKDAsIDEpLnRvVXBwZXJDYXNlKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHRyYW5zcG9ydE5hbWUuc3Vic3RyaW5nKDEsIHRyYW5zcG9ydE5hbWUubGVuZ3RoKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAudG9Mb3dlckNhc2UoKTsKLQotICAgICAgICAgICAgICAgIC8vVE9ETyBkbyB3ZSB1c2UgdGhpcyBtZXRob2QgLCB3ZSBuZWVkIHRvIGRpc2FibGUgSHR0cCwgU09BUDExLFNPQVAxMgotICAgICAgICAgICAgICAgIC8vIEJpbmRpbmdzIGFjY29yZGluZyB0byBwYXJhbWV0ZXJzIGlmIHdlIGFyZSB1c2luZyB0aGlzCi0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgICogcG9wdWxhdGVzIHNvYXAxMSBlbmRwb2ludAotICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBTdHJpbmcgc29hcDExRW5kcG9pbnROYW1lID0gc2VydmljZU5hbWUgKyBwcm90b2NvbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJTb2FwMTFFbmRwb2ludCI7Ci0KLSAgICAgICAgICAgICAgICBBeGlzRW5kcG9pbnQgaHR0cFNvYXAxMUVuZHBvaW50ID0gbmV3IEF4aXNFbmRwb2ludCgpOwotICAgICAgICAgICAgICAgIGh0dHBTb2FwMTFFbmRwb2ludC5zZXROYW1lKHNvYXAxMUVuZHBvaW50TmFtZSk7Ci0gICAgICAgICAgICAgICAgaHR0cFNvYXAxMUVuZHBvaW50LnNldFBhcmVudChheGlzU2VydmljZSk7Ci0gICAgICAgICAgICAgICAgaHR0cFNvYXAxMUVuZHBvaW50LnNldFRyYW5zcG9ydEluRGVzY3JpcHRpb24odHJhbnNwb3J0TmFtZSk7Ci0gICAgICAgICAgICAgICAgcG9wdWxhdGVTb2FwMTFFbmRwb2ludChheGlzU2VydmljZSwgaHR0cFNvYXAxMUVuZHBvaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZGluZ0NhY2hlKTsKLSAgICAgICAgICAgICAgICBheGlzU2VydmljZS5hZGRFbmRwb2ludChodHRwU29hcDExRW5kcG9pbnQuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBTb2FwMTFFbmRwb2ludCk7Ci0gICAgICAgICAgICAgICAgLy8gc2V0dGluZyBzb2FwMTEgZW5kcG9pbnQgYXMgdGhlIGRlZmF1bHQgZW5kcG9pbnQKLSAgICAgICAgICAgICAgICBheGlzU2VydmljZS5zZXRFbmRwb2ludE5hbWUoc29hcDExRW5kcG9pbnROYW1lKTsKLQotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICAgICAqIGdlbmVyYXRpbmcgU29hcDEyIGVuZHBvaW50Ci0gICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIFN0cmluZyBzb2FwMTJFbmRwb2ludE5hbWUgPSBzZXJ2aWNlTmFtZSArIHByb3RvY29sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlNvYXAxMkVuZHBvaW50IjsKLSAgICAgICAgICAgICAgICBBeGlzRW5kcG9pbnQgaHR0cFNvYXAxMkVuZHBvaW50ID0gbmV3IEF4aXNFbmRwb2ludCgpOwotICAgICAgICAgICAgICAgIGh0dHBTb2FwMTJFbmRwb2ludC5zZXROYW1lKHNvYXAxMkVuZHBvaW50TmFtZSk7Ci0gICAgICAgICAgICAgICAgaHR0cFNvYXAxMkVuZHBvaW50LnNldFBhcmVudChheGlzU2VydmljZSk7Ci0gICAgICAgICAgICAgICAgaHR0cFNvYXAxMkVuZHBvaW50LnNldFRyYW5zcG9ydEluRGVzY3JpcHRpb24odHJhbnNwb3J0TmFtZSk7Ci0gICAgICAgICAgICAgICAgcG9wdWxhdGVTb2FwMTJFbmRwb2ludChheGlzU2VydmljZSwgaHR0cFNvYXAxMkVuZHBvaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZGluZ0NhY2hlKTsKLSAgICAgICAgICAgICAgICBheGlzU2VydmljZS5hZGRFbmRwb2ludChodHRwU29hcDEyRW5kcG9pbnQuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBTb2FwMTJFbmRwb2ludCk7Ci0KLSAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAgICAgKiBnZW5lcmF0aW5nIEh0dHAgZW5kcG9pbnQKLSAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgaWYgKCJodHRwIi5lcXVhbHModHJhbnNwb3J0TmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGh0dHBFbmRwb2ludE5hbWUgPSBzZXJ2aWNlTmFtZSArIHByb3RvY29sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiRW5kcG9pbnQiOwotICAgICAgICAgICAgICAgICAgICBBeGlzRW5kcG9pbnQgaHR0cEVuZHBvaW50ID0gbmV3IEF4aXNFbmRwb2ludCgpOwotICAgICAgICAgICAgICAgICAgICBodHRwRW5kcG9pbnQuc2V0TmFtZShodHRwRW5kcG9pbnROYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgaHR0cEVuZHBvaW50LnNldFBhcmVudChheGlzU2VydmljZSk7Ci0gICAgICAgICAgICAgICAgICAgIGh0dHBFbmRwb2ludC5zZXRUcmFuc3BvcnRJbkRlc2NyaXB0aW9uKHRyYW5zcG9ydE5hbWUpOwotICAgICAgICAgICAgICAgICAgICBwb3B1bGF0ZUh0dHBFbmRwb2ludChheGlzU2VydmljZSwgaHR0cEVuZHBvaW50LCBiaW5kaW5nQ2FjaGUpOwotICAgICAgICAgICAgICAgICAgICBheGlzU2VydmljZS5hZGRFbmRwb2ludChodHRwRW5kcG9pbnQuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodHRwRW5kcG9pbnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRFbmRwb2ludHNUb1NlcnZpY2UoQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlndXJhdGlvbikgdGhyb3dzIEF4aXNGYXVsdCB7Ci0KLSAgICAgICAgU3RyaW5nIHNlcnZpY2VOYW1lID0gYXhpc1NlcnZpY2UuZ2V0TmFtZSgpOwotICAgICAgICBJdGVyYXRvciB0cmFuc3BvcnRJblZhbHVlcyA9IG51bGw7Ci0KLSAgICAgICAgaWYgKGF4aXNDb25maWd1cmF0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIEFycmF5TGlzdCB0cmFuc3BvcnRzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgZm9yIChPYmplY3QgbyA6IGF4aXNDb25maWd1cmF0aW9uLmdldFRyYW5zcG9ydHNJbigpLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICAgICAgVHJhbnNwb3J0SW5EZXNjcmlwdGlvbiB0cmFuc3BvcnRJbkRlc2NyaXB0aW9uID0gKFRyYW5zcG9ydEluRGVzY3JpcHRpb24pbzsKLSAgICAgICAgICAgICAgICB0cmFuc3BvcnRzLmFkZCh0cmFuc3BvcnRJbkRlc2NyaXB0aW9uLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0cmFuc3BvcnRJblZhbHVlcyA9IHRyYW5zcG9ydHMuaXRlcmF0b3IoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEhhc2hNYXAgYmluZGluZ0NhY2hlID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgaWYgKHRyYW5zcG9ydEluVmFsdWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoOyB0cmFuc3BvcnRJblZhbHVlcy5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHRyYW5zcG9ydE5hbWUgPSAoU3RyaW5nKXRyYW5zcG9ydEluVmFsdWVzLm5leHQoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcHJvdG9jb2wgPSB0cmFuc3BvcnROYW1lLnN1YnN0cmluZygwLCAxKS50b1VwcGVyQ2FzZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB0cmFuc3BvcnROYW1lLnN1YnN0cmluZygxLCB0cmFuc3BvcnROYW1lLmxlbmd0aCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgLnRvTG93ZXJDYXNlKCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBheGlzMi54bWwgaW5kaWNhdGVkIG5vIEhUVFAgYmluZGluZz8KLSAgICAgICAgICAgICAgICBib29sZWFuIGRpc2FibGVSRVNUID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgUGFyYW1ldGVyIGRpc2FibGVSRVNUUGFyYW1ldGVyID0gYXhpc1NlcnZpY2UKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRQYXJhbWV0ZXIob3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHMuQ29uZmlndXJhdGlvbi5ESVNBQkxFX1JFU1QpOwotICAgICAgICAgICAgICAgIGlmIChkaXNhYmxlUkVTVFBhcmFtZXRlciAhPSBudWxsCi0gICAgICAgICAgICAgICAgICAgICYmIEphdmFVdGlscy5pc1RydWVFeHBsaWNpdGx5KGRpc2FibGVSRVNUUGFyYW1ldGVyLmdldFZhbHVlKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRpc2FibGVSRVNUID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBib29sZWFuIGRpc2FibGVTT0FQMTEgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBQYXJhbWV0ZXIgZGlzYWJsZVNPQVAxMVBhcmFtZXRlciA9IGF4aXNTZXJ2aWNlCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UGFyYW1ldGVyKG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uRElTQUJMRV9TT0FQMTEpOwotICAgICAgICAgICAgICAgIGlmIChkaXNhYmxlU09BUDExUGFyYW1ldGVyICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgJiYgSmF2YVV0aWxzLmlzVHJ1ZUV4cGxpY2l0bHkoZGlzYWJsZVNPQVAxMVBhcmFtZXRlci5nZXRWYWx1ZSgpKSkgewotICAgICAgICAgICAgICAgICAgICBkaXNhYmxlU09BUDExID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBib29sZWFuIGRpc2FibGVTT0FQMTIgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBQYXJhbWV0ZXIgZGlzYWJsZVNPQVAxMlBhcmFtZXRlciA9IGF4aXNTZXJ2aWNlCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UGFyYW1ldGVyKG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uRElTQUJMRV9TT0FQMTIpOwotICAgICAgICAgICAgICAgIGlmIChkaXNhYmxlU09BUDEyUGFyYW1ldGVyICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgJiYgSmF2YVV0aWxzCi0gICAgICAgICAgICAgICAgICAgICAgICAuaXNUcnVlRXhwbGljaXRseShkaXNhYmxlU09BUDEyUGFyYW1ldGVyLmdldFZhbHVlKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRpc2FibGVTT0FQMTIgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICAgICAqIHBvcHVsYXRlcyBzb2FwMTEgZW5kcG9pbnQKLSAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgaWYgKCFkaXNhYmxlU09BUDExKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBzb2FwMTFFbmRwb2ludE5hbWUgPSBzZXJ2aWNlTmFtZSArIHByb3RvY29sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJTb2FwMTFFbmRwb2ludCI7Ci0KLSAgICAgICAgICAgICAgICAgICAgQXhpc0VuZHBvaW50IGh0dHBTb2FwMTFFbmRwb2ludCA9IG5ldyBBeGlzRW5kcG9pbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgaHR0cFNvYXAxMUVuZHBvaW50LnNldE5hbWUoc29hcDExRW5kcG9pbnROYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgaHR0cFNvYXAxMUVuZHBvaW50LnNldFBhcmVudChheGlzU2VydmljZSk7Ci0gICAgICAgICAgICAgICAgICAgIGh0dHBTb2FwMTFFbmRwb2ludC5zZXRUcmFuc3BvcnRJbkRlc2NyaXB0aW9uKHRyYW5zcG9ydE5hbWUpOwotICAgICAgICAgICAgICAgICAgICBwb3B1bGF0ZVNvYXAxMUVuZHBvaW50KGF4aXNTZXJ2aWNlLCBodHRwU29hcDExRW5kcG9pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZGluZ0NhY2hlKTsKLSAgICAgICAgICAgICAgICAgICAgYXhpc1NlcnZpY2UuYWRkRW5kcG9pbnQoaHR0cFNvYXAxMUVuZHBvaW50LmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cFNvYXAxMUVuZHBvaW50KTsKLSAgICAgICAgICAgICAgICAgICAgLy8gc2V0dGluZyBzb2FwMTEgZW5kcG9pbnQgYXMgdGhlIGRlZmF1bHQgZW5kcG9pbnQKLSAgICAgICAgICAgICAgICAgICAgYXhpc1NlcnZpY2Uuc2V0RW5kcG9pbnROYW1lKHNvYXAxMUVuZHBvaW50TmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgICogZ2VuZXJhdGluZyBTb2FwMTIgZW5kcG9pbnQKLSAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgaWYgKCFkaXNhYmxlU09BUDEyKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBzb2FwMTJFbmRwb2ludE5hbWUgPSBzZXJ2aWNlTmFtZSArIHByb3RvY29sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJTb2FwMTJFbmRwb2ludCI7Ci0gICAgICAgICAgICAgICAgICAgIEF4aXNFbmRwb2ludCBodHRwU29hcDEyRW5kcG9pbnQgPSBuZXcgQXhpc0VuZHBvaW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIGh0dHBTb2FwMTJFbmRwb2ludC5zZXROYW1lKHNvYXAxMkVuZHBvaW50TmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGh0dHBTb2FwMTJFbmRwb2ludC5zZXRQYXJlbnQoYXhpc1NlcnZpY2UpOwotICAgICAgICAgICAgICAgICAgICBodHRwU29hcDEyRW5kcG9pbnQuc2V0VHJhbnNwb3J0SW5EZXNjcmlwdGlvbih0cmFuc3BvcnROYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgcG9wdWxhdGVTb2FwMTJFbmRwb2ludChheGlzU2VydmljZSwgaHR0cFNvYXAxMkVuZHBvaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRpbmdDYWNoZSk7Ci0gICAgICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlLmFkZEVuZHBvaW50KGh0dHBTb2FwMTJFbmRwb2ludC5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBTb2FwMTJFbmRwb2ludCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgICogZ2VuZXJhdGluZyBIdHRwIGVuZHBvaW50Ci0gICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIGlmICgoImh0dHAiLmVxdWFscyh0cmFuc3BvcnROYW1lKQotICAgICAgICAgICAgICAgICAgICAgfHwgImh0dHBzIi5lcXVhbHModHJhbnNwb3J0TmFtZSkpICYmICFkaXNhYmxlUkVTVCkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaHR0cEVuZHBvaW50TmFtZSA9IHNlcnZpY2VOYW1lICsgcHJvdG9jb2wKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJFbmRwb2ludCI7Ci0gICAgICAgICAgICAgICAgICAgIEF4aXNFbmRwb2ludCBodHRwRW5kcG9pbnQgPSBuZXcgQXhpc0VuZHBvaW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIGh0dHBFbmRwb2ludC5zZXROYW1lKGh0dHBFbmRwb2ludE5hbWUpOwotICAgICAgICAgICAgICAgICAgICBodHRwRW5kcG9pbnQuc2V0UGFyZW50KGF4aXNTZXJ2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgaHR0cEVuZHBvaW50LnNldFRyYW5zcG9ydEluRGVzY3JpcHRpb24odHJhbnNwb3J0TmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIHBvcHVsYXRlSHR0cEVuZHBvaW50KGF4aXNTZXJ2aWNlLCBodHRwRW5kcG9pbnQsIGJpbmRpbmdDYWNoZSk7Ci0gICAgICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlLmFkZEVuZHBvaW50KGh0dHBFbmRwb2ludC5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBFbmRwb2ludCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZFNvYXAxMUVuZHBvaW50KEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlLCBVUkwgdXJsKQotICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBwcm90b2NvbCA9IHVybC5nZXRQcm90b2NvbCgpOwotICAgICAgICBwcm90b2NvbCA9IHByb3RvY29sLnN1YnN0cmluZygwLCAxKS50b1VwcGVyQ2FzZSgpCi0gICAgICAgICAgICAgICAgICAgKyBwcm90b2NvbC5zdWJzdHJpbmcoMSwgcHJvdG9jb2wubGVuZ3RoKCkpLnRvTG93ZXJDYXNlKCk7Ci0KLSAgICAgICAgU3RyaW5nIHNlcnZpY2VOYW1lID0gYXhpc1NlcnZpY2UuZ2V0TmFtZSgpOwotICAgICAgICBTdHJpbmcgc29hcDExRW5kcG9pbnROYW1lID0gc2VydmljZU5hbWUgKyBwcm90b2NvbCArICJTb2FwMTFFbmRwb2ludCI7Ci0KLSAgICAgICAgQXhpc0VuZHBvaW50IGh0dHBTb2FwMTFFbmRwb2ludCA9IG5ldyBBeGlzRW5kcG9pbnQoKTsKLSAgICAgICAgaHR0cFNvYXAxMUVuZHBvaW50LnNldE5hbWUoc29hcDExRW5kcG9pbnROYW1lKTsKLSAgICAgICAgaHR0cFNvYXAxMUVuZHBvaW50LnNldFBhcmVudChheGlzU2VydmljZSk7Ci0gICAgICAgIGh0dHBTb2FwMTFFbmRwb2ludC5zZXRFbmRwb2ludFVSTCh1cmwudG9TdHJpbmcoKSk7Ci0gICAgICAgIGh0dHBTb2FwMTFFbmRwb2ludC5zZXRUcmFuc3BvcnRJbkRlc2NyaXB0aW9uKHVybC5nZXRQcm90b2NvbCgpKTsKLQotICAgICAgICBwb3B1bGF0ZVNvYXAxMUVuZHBvaW50KGF4aXNTZXJ2aWNlLCBodHRwU29hcDExRW5kcG9pbnQsIG51bGwpOwotICAgICAgICBheGlzU2VydmljZS5hZGRFbmRwb2ludChodHRwU29hcDExRW5kcG9pbnQuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodHRwU29hcDExRW5kcG9pbnQpOwotICAgICAgICAvLyBzZXR0aW5nIHNvYXAxMSBlbmRwb2ludCBhcyB0aGUgZGVmYXVsdCBlbmRwb2ludAotICAgICAgICBheGlzU2VydmljZS5zZXRFbmRwb2ludE5hbWUoc29hcDExRW5kcG9pbnROYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkU29hcDEyRW5kcG9pbnQoQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UsIFVSTCB1cmwpCi0gICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHByb3RvY29sID0gdXJsLmdldFByb3RvY29sKCk7Ci0gICAgICAgIHByb3RvY29sID0gcHJvdG9jb2wuc3Vic3RyaW5nKDAsIDEpLnRvVXBwZXJDYXNlKCkKLSAgICAgICAgICAgICAgICAgICArIHByb3RvY29sLnN1YnN0cmluZygxLCBwcm90b2NvbC5sZW5ndGgoKSkudG9Mb3dlckNhc2UoKTsKLQotICAgICAgICBTdHJpbmcgc2VydmljZU5hbWUgPSBheGlzU2VydmljZS5nZXROYW1lKCk7Ci0gICAgICAgIFN0cmluZyBzb2FwMTJFbmRwb2ludE5hbWUgPSBzZXJ2aWNlTmFtZSArIHByb3RvY29sICsgIlNvYXAxMkVuZHBvaW50IjsKLQotICAgICAgICBBeGlzRW5kcG9pbnQgaHR0cFNvYXAxMkVuZHBvaW50ID0gbmV3IEF4aXNFbmRwb2ludCgpOwotICAgICAgICBodHRwU29hcDEyRW5kcG9pbnQuc2V0TmFtZShzb2FwMTJFbmRwb2ludE5hbWUpOwotICAgICAgICBodHRwU29hcDEyRW5kcG9pbnQuc2V0UGFyZW50KGF4aXNTZXJ2aWNlKTsKLSAgICAgICAgaHR0cFNvYXAxMkVuZHBvaW50LnNldEVuZHBvaW50VVJMKHVybC50b1N0cmluZygpKTsKLSAgICAgICAgaHR0cFNvYXAxMkVuZHBvaW50LnNldFRyYW5zcG9ydEluRGVzY3JpcHRpb24odXJsLmdldFByb3RvY29sKCkpOwotCi0gICAgICAgIHBvcHVsYXRlU29hcDEyRW5kcG9pbnQoYXhpc1NlcnZpY2UsIGh0dHBTb2FwMTJFbmRwb2ludCwgbnVsbCk7Ci0gICAgICAgIGF4aXNTZXJ2aWNlLmFkZEVuZHBvaW50KGh0dHBTb2FwMTJFbmRwb2ludC5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBTb2FwMTJFbmRwb2ludCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZEh0dHBFbmRwb2ludChBeGlzU2VydmljZSBheGlzU2VydmljZSwgVVJMIHVybCkgewotICAgICAgICBTdHJpbmcgc2VydmljZU5hbWUgPSBheGlzU2VydmljZS5nZXROYW1lKCk7Ci0gICAgICAgIFN0cmluZyBwcm90b2NvbCA9IHVybC5nZXRQcm90b2NvbCgpOwotICAgICAgICBwcm90b2NvbCA9IHByb3RvY29sLnN1YnN0cmluZygwLCAxKS50b1VwcGVyQ2FzZSgpCi0gICAgICAgICAgICAgICAgICAgKyBwcm90b2NvbC5zdWJzdHJpbmcoMSwgcHJvdG9jb2wubGVuZ3RoKCkpLnRvTG93ZXJDYXNlKCk7Ci0KLSAgICAgICAgU3RyaW5nIGh0dHBFbmRwb2ludE5hbWUgPSBzZXJ2aWNlTmFtZSArIHByb3RvY29sICsgIkVuZHBvaW50IjsKLSAgICAgICAgQXhpc0VuZHBvaW50IGh0dHBFbmRwb2ludCA9IG5ldyBBeGlzRW5kcG9pbnQoKTsKLSAgICAgICAgaHR0cEVuZHBvaW50LnNldE5hbWUoaHR0cEVuZHBvaW50TmFtZSk7Ci0gICAgICAgIGh0dHBFbmRwb2ludC5zZXRQYXJlbnQoYXhpc1NlcnZpY2UpOwotICAgICAgICBodHRwRW5kcG9pbnQuc2V0RW5kcG9pbnRVUkwodXJsLnRvU3RyaW5nKCkpOwotICAgICAgICBodHRwRW5kcG9pbnQuc2V0VHJhbnNwb3J0SW5EZXNjcmlwdGlvbih1cmwuZ2V0UHJvdG9jb2woKSk7Ci0gICAgICAgIHBvcHVsYXRlSHR0cEVuZHBvaW50KGF4aXNTZXJ2aWNlLCBodHRwRW5kcG9pbnQsIG51bGwpOwotICAgICAgICBheGlzU2VydmljZS5hZGRFbmRwb2ludChodHRwRW5kcG9pbnQuZ2V0TmFtZSgpLCBodHRwRW5kcG9pbnQpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwcm9jZXNzUG9saWN5QXR0YWNobWVudHMoSXRlcmF0b3IgYXR0YWNobWVudEVsZW1lbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwKLSAgICAgICAgICAgIEZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3IgewotICAgICAgICBPTUVsZW1lbnQgYXR0YWNobWVudEVsZW1lbnQ7Ci0gICAgICAgIEhhc2hNYXAgYXR0YWNobWVudHNNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgICAgIGZvciAoOyBhdHRhY2htZW50RWxlbWVudHMuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgYXR0YWNobWVudEVsZW1lbnQgPSAoT01FbGVtZW50KWF0dGFjaG1lbnRFbGVtZW50cy5uZXh0KCk7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgYXBwbGllc1RvRWxlbSA9IGF0dGFjaG1lbnRFbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgIC5nZXRGaXJzdENoaWxkV2l0aE5hbWUobmV3IFFOYW1lKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlcGxveW1lbnRDb25zdGFudHMuUE9MSUNZX05TX1VSSSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXBsb3ltZW50Q29uc3RhbnRzLlRBR19BUFBMSUVTX1RPKSk7Ci0gICAgICAgICAgICBBcnJheUxpc3QgcG9saWN5Q29tcG9uZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgICAgICAgICAgLy8gcHJvY2VzcyA8d3NwOlBvbGljeT4gZWxlbWVudHMgLi4KLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgcG9saWN5RWxlbWVudHMgPSBhdHRhY2htZW50RWxlbWVudAotICAgICAgICAgICAgICAgICAgICAuZ2V0Q2hpbGRyZW5XaXRoTmFtZShuZXcgUU5hbWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVwbG95bWVudENvbnN0YW50cy5QT0xJQ1lfTlNfVVJJLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlcGxveW1lbnRDb25zdGFudHMuVEFHX1BPTElDWSkpOyBwb2xpY3lFbGVtZW50cwotICAgICAgICAgICAgICAgICAgICAuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIFBvbGljeUNvbXBvbmVudCBwb2xpY3kgPSBQb2xpY3lVdGlsCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UG9saWN5RnJvbU9NRWxlbWVudCgoT01FbGVtZW50KXBvbGljeUVsZW1lbnRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5uZXh0KCkpOwotICAgICAgICAgICAgICAgIHBvbGljeUNvbXBvbmVudHMuYWRkKHBvbGljeSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHByb2Nlc3MgPHdzcDpQb2xpY3lSZWZlcmVuY2U+IGVsZW1lbnRzIC4uCi0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIHBvbGljeVJlZkVsZW1lbnRzID0gYXR0YWNobWVudEVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgLmdldENoaWxkcmVuV2l0aE5hbWUobmV3IFFOYW1lKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlcGxveW1lbnRDb25zdGFudHMuUE9MSUNZX05TX1VSSSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXBsb3ltZW50Q29uc3RhbnRzLlRBR19QT0xJQ1lfUkVGKSk7IHBvbGljeVJlZkVsZW1lbnRzCi0gICAgICAgICAgICAgICAgICAgIC5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgUG9saWN5Q29tcG9uZW50IHBvbGljeVJlZiA9IFBvbGljeVV0aWwKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRQb2xpY3lSZWZlcmVuY2VGcm9tT01FbGVtZW50KChPTUVsZW1lbnQpcG9saWN5UmVmRWxlbWVudHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm5leHQoKSk7Ci0gICAgICAgICAgICAgICAgcG9saWN5Q29tcG9uZW50cy5hZGQocG9saWN5UmVmKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBwb2xpY3lTdWJqZWN0cyA9IGFwcGxpZXNUb0VsZW0KLSAgICAgICAgICAgICAgICAgICAgLmdldENoaWxkcmVuV2l0aE5hbWUobmV3IFFOYW1lKCJwb2xpY3ktc3ViamVjdCIpKTsgcG9saWN5U3ViamVjdHMKLSAgICAgICAgICAgICAgICAgICAgLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICBPTUVsZW1lbnQgcG9saWN5U3ViamVjdCA9IChPTUVsZW1lbnQpcG9saWN5U3ViamVjdHMubmV4dCgpOwotICAgICAgICAgICAgICAgIFN0cmluZyBpZGVudGlmaWVyID0gcG9saWN5U3ViamVjdC5nZXRBdHRyaWJ1dGVWYWx1ZShuZXcgUU5hbWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAiaWRlbnRpZmllciIpKTsKLQotICAgICAgICAgICAgICAgIEFycmF5TGlzdCB2YWx1ZXMgPSAoQXJyYXlMaXN0KWF0dGFjaG1lbnRzTWFwLmdldChpZGVudGlmaWVyKTsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWVzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgICAgICBhdHRhY2htZW50c01hcC5wdXQoaWRlbnRpZmllciwgdmFsdWVzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdmFsdWVzLmFkZEFsbChwb2xpY3lDb21wb25lbnRzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoT2JqZWN0IG8gOiBhdHRhY2htZW50c01hcC5rZXlTZXQoKSkgewotICAgICAgICAgICAgU3RyaW5nIGlkZW50aWZpZXIgPSAoU3RyaW5nKW87Ci0gICAgICAgICAgICBpZiAoaWRlbnRpZmllci5zdGFydHNXaXRoKCJiaW5kaW5nOnNvYXAiKSkgewotICAgICAgICAgICAgICAgIHByb2Nlc3NTb2FwQXR0YWNobWVudHMoaWRlbnRpZmllciwgKExpc3QpYXR0YWNobWVudHNNYXAKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXQoaWRlbnRpZmllciksIHNlcnZpY2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwb3B1bGF0ZVNvYXAxMUVuZHBvaW50KEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBeGlzRW5kcG9pbnQgYXhpc0VuZHBvaW50LCBIYXNoTWFwIGJpbmRpbmdDYWNoZSkgewotICAgICAgICBTdHJpbmcgc2VydmljZU5hbWUgPSBheGlzU2VydmljZS5nZXROYW1lKCk7Ci0gICAgICAgIFN0cmluZyBuYW1lID0gc2VydmljZU5hbWUgKyAiU29hcDExQmluZGluZyI7Ci0KLSAgICAgICAgUU5hbWUgYmluZGluZ05hbWUgPSBuZXcgUU5hbWUobmFtZSk7Ci0KLSAgICAgICAgQXhpc0JpbmRpbmcgYXhpc0JpbmRpbmcgPSAoYmluZGluZ0NhY2hlICE9IG51bGwpID8gKEF4aXNCaW5kaW5nKWJpbmRpbmdDYWNoZQotICAgICAgICAgICAgICAgIC5nZXQobmFtZSkKLSAgICAgICAgICAgICAgICA6IG51bGw7Ci0gICAgICAgIGlmIChheGlzQmluZGluZyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBheGlzQmluZGluZyA9IG5ldyBBeGlzQmluZGluZygpOwotICAgICAgICAgICAgYXhpc0JpbmRpbmcuc2V0TmFtZShiaW5kaW5nTmFtZSk7Ci0KLSAgICAgICAgICAgIGF4aXNCaW5kaW5nLnNldFR5cGUoSmF2YTJXU0RMQ29uc3RhbnRzLlRSQU5TUE9SVF9VUkkpOwotICAgICAgICAgICAgYXhpc0JpbmRpbmcuc2V0UHJvcGVydHkoV1NETENvbnN0YW50cy5XU0RMXzFfMV9TVFlMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdTRExDb25zdGFudHMuU1RZTEVfRE9DKTsKLQotICAgICAgICAgICAgYXhpc0JpbmRpbmcuc2V0UHJvcGVydHkoV1NETDJDb25zdGFudHMuQVRUUl9XU09BUF9WRVJTSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09BUDExQ29uc3RhbnRzLlNPQVBfRU5WRUxPUEVfTkFNRVNQQUNFX1VSSSk7Ci0KLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBheGlzU2VydmljZS5nZXRDaGlsZHJlbigpOyBpdGVyYXRvcgotICAgICAgICAgICAgICAgICAgICAuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIEF4aXNPcGVyYXRpb24gb3BlcmF0aW9uID0gKEF4aXNPcGVyYXRpb24paXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgIEF4aXNCaW5kaW5nT3BlcmF0aW9uIGF4aXNCaW5kaW5nT3BlcmF0aW9uID0gbmV3IEF4aXNCaW5kaW5nT3BlcmF0aW9uKCk7Ci0KLSAgICAgICAgICAgICAgICBheGlzQmluZGluZ09wZXJhdGlvbi5zZXROYW1lKG9wZXJhdGlvbi5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIGF4aXNCaW5kaW5nT3BlcmF0aW9uLnNldEF4aXNPcGVyYXRpb24ob3BlcmF0aW9uKTsKLQotICAgICAgICAgICAgICAgIFN0cmluZyBzb2FwQWN0aW9uID0gb3BlcmF0aW9uLmdldFNvYXBBY3Rpb24oKTsKLSAgICAgICAgICAgICAgICBpZiAoc29hcEFjdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF4aXNCaW5kaW5nT3BlcmF0aW9uLnNldFByb3BlcnR5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdTREwyQ29uc3RhbnRzLkFUVFJfV1NPQVBfQUNUSU9OLCBzb2FwQWN0aW9uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYXhpc0JpbmRpbmcuYWRkQ2hpbGQoYXhpc0JpbmRpbmdPcGVyYXRpb24uZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNCaW5kaW5nT3BlcmF0aW9uKTsKLSAgICAgICAgICAgICAgICBwb3B1bGF0ZUJpbmRpbmdPcGVyYXRpb24oYXhpc0JpbmRpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNCaW5kaW5nT3BlcmF0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChiaW5kaW5nQ2FjaGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGJpbmRpbmdDYWNoZS5wdXQobmFtZSwgYXhpc0JpbmRpbmcpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGF4aXNCaW5kaW5nLnNldFBhcmVudChheGlzRW5kcG9pbnQpOwotICAgICAgICBheGlzRW5kcG9pbnQuc2V0QmluZGluZyhheGlzQmluZGluZyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwb3B1bGF0ZVNvYXAxMkVuZHBvaW50KEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBeGlzRW5kcG9pbnQgYXhpc0VuZHBvaW50LCBIYXNoTWFwIGJpbmRpbmdDYWNoZSkgewotICAgICAgICBTdHJpbmcgc2VydmljZU5hbWUgPSBheGlzU2VydmljZS5nZXROYW1lKCk7Ci0gICAgICAgIFN0cmluZyBuYW1lID0gc2VydmljZU5hbWUgKyAiU29hcDEyQmluZGluZyI7Ci0KLSAgICAgICAgUU5hbWUgYmluZGluZ05hbWUgPSBuZXcgUU5hbWUobmFtZSk7Ci0KLSAgICAgICAgQXhpc0JpbmRpbmcgYXhpc0JpbmRpbmcgPSAoYmluZGluZ0NhY2hlICE9IG51bGwpID8gKEF4aXNCaW5kaW5nKWJpbmRpbmdDYWNoZQotICAgICAgICAgICAgICAgIC5nZXQobmFtZSkKLSAgICAgICAgICAgICAgICA6IG51bGw7Ci0gICAgICAgIGlmIChheGlzQmluZGluZyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBheGlzQmluZGluZyA9IG5ldyBBeGlzQmluZGluZygpOwotICAgICAgICAgICAgYXhpc0JpbmRpbmcuc2V0TmFtZShiaW5kaW5nTmFtZSk7Ci0KLSAgICAgICAgICAgIGF4aXNCaW5kaW5nLnNldFR5cGUoSmF2YTJXU0RMQ29uc3RhbnRzLlRSQU5TUE9SVF9VUkkpOwotICAgICAgICAgICAgYXhpc0JpbmRpbmcuc2V0UHJvcGVydHkoV1NETENvbnN0YW50cy5XU0RMXzFfMV9TVFlMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdTRExDb25zdGFudHMuU1RZTEVfRE9DKTsKLQotICAgICAgICAgICAgYXhpc0JpbmRpbmcuc2V0UHJvcGVydHkoV1NETDJDb25zdGFudHMuQVRUUl9XU09BUF9WRVJTSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09BUDEyQ29uc3RhbnRzLlNPQVBfRU5WRUxPUEVfTkFNRVNQQUNFX1VSSSk7Ci0KLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBheGlzU2VydmljZS5nZXRDaGlsZHJlbigpOyBpdGVyYXRvcgotICAgICAgICAgICAgICAgICAgICAuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIEF4aXNPcGVyYXRpb24gb3BlcmF0aW9uID0gKEF4aXNPcGVyYXRpb24paXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgIEF4aXNCaW5kaW5nT3BlcmF0aW9uIGF4aXNCaW5kaW5nT3BlcmF0aW9uID0gbmV3IEF4aXNCaW5kaW5nT3BlcmF0aW9uKCk7Ci0KLSAgICAgICAgICAgICAgICBheGlzQmluZGluZ09wZXJhdGlvbi5zZXROYW1lKG9wZXJhdGlvbi5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIGF4aXNCaW5kaW5nT3BlcmF0aW9uLnNldEF4aXNPcGVyYXRpb24ob3BlcmF0aW9uKTsKLQotICAgICAgICAgICAgICAgIFN0cmluZyBzb2FwQWN0aW9uID0gb3BlcmF0aW9uLmdldFNvYXBBY3Rpb24oKTsKLSAgICAgICAgICAgICAgICBpZiAoc29hcEFjdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF4aXNCaW5kaW5nT3BlcmF0aW9uLnNldFByb3BlcnR5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdTREwyQ29uc3RhbnRzLkFUVFJfV1NPQVBfQUNUSU9OLCBzb2FwQWN0aW9uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYXhpc0JpbmRpbmcuYWRkQ2hpbGQoYXhpc0JpbmRpbmdPcGVyYXRpb24uZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNCaW5kaW5nT3BlcmF0aW9uKTsKLQotICAgICAgICAgICAgICAgIHBvcHVsYXRlQmluZGluZ09wZXJhdGlvbihheGlzQmluZGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpc0JpbmRpbmdPcGVyYXRpb24pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGJpbmRpbmdDYWNoZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYmluZGluZ0NhY2hlLnB1dChuYW1lLCBheGlzQmluZGluZyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYXhpc0JpbmRpbmcuc2V0UGFyZW50KGF4aXNFbmRwb2ludCk7Ci0gICAgICAgIGF4aXNFbmRwb2ludC5zZXRCaW5kaW5nKGF4aXNCaW5kaW5nKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHBvcHVsYXRlSHR0cEVuZHBvaW50KEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXhpc0VuZHBvaW50IGF4aXNFbmRwb2ludCwgSGFzaE1hcCBiaW5kaW5nQ2FjaGUpIHsKLSAgICAgICAgU3RyaW5nIHNlcnZpY2VOYW1lID0gYXhpc1NlcnZpY2UuZ2V0TmFtZSgpOwotICAgICAgICBTdHJpbmcgbmFtZSA9IHNlcnZpY2VOYW1lICsgIkh0dHBCaW5kaW5nIjsKLQotICAgICAgICBRTmFtZSBiaW5kaW5nTmFtZSA9IG5ldyBRTmFtZShuYW1lKTsKLQotICAgICAgICBBeGlzQmluZGluZyBheGlzQmluZGluZyA9IChiaW5kaW5nQ2FjaGUgIT0gbnVsbCkgPyAoQXhpc0JpbmRpbmcpYmluZGluZ0NhY2hlCi0gICAgICAgICAgICAgICAgLmdldChuYW1lKQotICAgICAgICAgICAgICAgIDogbnVsbDsKLQotICAgICAgICBpZiAoYXhpc0JpbmRpbmcgPT0gbnVsbCkgewotICAgICAgICAgICAgYXhpc0JpbmRpbmcgPSBuZXcgQXhpc0JpbmRpbmcoKTsKLSAgICAgICAgICAgIGF4aXNCaW5kaW5nLnNldE5hbWUoYmluZGluZ05hbWUpOwotCi0gICAgICAgICAgICBheGlzQmluZGluZy5zZXRUeXBlKFdTREwyQ29uc3RhbnRzLlVSSV9XU0RMMl9IVFRQKTsKLSAgICAgICAgICAgIGF4aXNCaW5kaW5nLnNldFByb3BlcnR5KFdTREwyQ29uc3RhbnRzLkFUVFJfV0hUVFBfTUVUSE9ELCAiUE9TVCIpOwotCi0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gYXhpc1NlcnZpY2UuZ2V0Q2hpbGRyZW4oKTsgaXRlcmF0b3IKLSAgICAgICAgICAgICAgICAgICAgLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICBBeGlzT3BlcmF0aW9uIG9wZXJhdGlvbiA9IChBeGlzT3BlcmF0aW9uKWl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgICAgICBBeGlzQmluZGluZ09wZXJhdGlvbiBheGlzQmluZGluZ09wZXJhdGlvbiA9IG5ldyBBeGlzQmluZGluZ09wZXJhdGlvbigpOwotCi0gICAgICAgICAgICAgICAgUU5hbWUgb3BlcmF0aW9uUU5hbWUgPSBvcGVyYXRpb24uZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgIGF4aXNCaW5kaW5nT3BlcmF0aW9uLnNldE5hbWUob3BlcmF0aW9uUU5hbWUpOwotICAgICAgICAgICAgICAgIGF4aXNCaW5kaW5nT3BlcmF0aW9uLnNldEF4aXNPcGVyYXRpb24ob3BlcmF0aW9uKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgaHR0cExvY2F0aW9uID0gb3BlcmF0aW9uUU5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgYXhpc0JpbmRpbmdPcGVyYXRpb24uc2V0UHJvcGVydHkoV1NETDJDb25zdGFudHMuQVRUUl9XSFRUUF9MT0NBVElPTiwgaHR0cExvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICBheGlzQmluZGluZy5hZGRDaGlsZChheGlzQmluZGluZ09wZXJhdGlvbi5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpc0JpbmRpbmdPcGVyYXRpb24pOwotCi0gICAgICAgICAgICAgICAgcG9wdWxhdGVCaW5kaW5nT3BlcmF0aW9uKGF4aXNCaW5kaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzQmluZGluZ09wZXJhdGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoYmluZGluZ0NhY2hlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBiaW5kaW5nQ2FjaGUucHV0KG5hbWUsIGF4aXNCaW5kaW5nKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBheGlzQmluZGluZy5zZXRQYXJlbnQoYXhpc0VuZHBvaW50KTsKLSAgICAgICAgYXhpc0VuZHBvaW50LnNldEJpbmRpbmcoYXhpc0JpbmRpbmcpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcG9wdWxhdGVCaW5kaW5nT3BlcmF0aW9uKEF4aXNCaW5kaW5nIGF4aXNCaW5kaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF4aXNCaW5kaW5nT3BlcmF0aW9uIGF4aXNCaW5kaW5nT3BlcmF0aW9uKSB7Ci0KLSAgICAgICAgQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uID0gYXhpc0JpbmRpbmdPcGVyYXRpb24uZ2V0QXhpc09wZXJhdGlvbigpOwotCi0gICAgICAgIGlmIChXU0RMVXRpbC5pc0lucHV0UHJlc2VudEZvck1FUChheGlzT3BlcmF0aW9uCi0gICAgICAgICAgICAgICAgLmdldE1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4oKSkpIHsKLSAgICAgICAgICAgIEF4aXNNZXNzYWdlIGF4aXNJbk1lc3NhZ2UgPSBheGlzT3BlcmF0aW9uCi0gICAgICAgICAgICAgICAgICAgIC5nZXRNZXNzYWdlKFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9JTl9WQUxVRSk7Ci0gICAgICAgICAgICBBeGlzQmluZGluZ01lc3NhZ2UgYXhpc0JpbmRpbmdJbk1lc3NhZ2UgPSBuZXcgQXhpc0JpbmRpbmdNZXNzYWdlKCk7Ci0KLSAgICAgICAgICAgIGF4aXNCaW5kaW5nSW5NZXNzYWdlLnNldE5hbWUoYXhpc0luTWVzc2FnZS5nZXROYW1lKCkpOwotICAgICAgICAgICAgYXhpc0JpbmRpbmdJbk1lc3NhZ2Uuc2V0RGlyZWN0aW9uKGF4aXNJbk1lc3NhZ2UuZ2V0RGlyZWN0aW9uKCkpOwotICAgICAgICAgICAgYXhpc0JpbmRpbmdJbk1lc3NhZ2Uuc2V0QXhpc01lc3NhZ2UoYXhpc0luTWVzc2FnZSk7Ci0KLSAgICAgICAgICAgIGF4aXNCaW5kaW5nSW5NZXNzYWdlLnNldFBhcmVudChheGlzQmluZGluZ09wZXJhdGlvbik7Ci0gICAgICAgICAgICBheGlzQmluZGluZ09wZXJhdGlvbi5hZGRDaGlsZChXU0RMQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfSU5fVkFMVUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzQmluZGluZ0luTWVzc2FnZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoV1NETFV0aWwuaXNPdXRwdXRQcmVzZW50Rm9yTUVQKGF4aXNPcGVyYXRpb24KLSAgICAgICAgICAgICAgICAuZ2V0TWVzc2FnZUV4Y2hhbmdlUGF0dGVybigpKSkgewotICAgICAgICAgICAgQXhpc01lc3NhZ2UgYXhpc091dE1lc3NhZ2UgPSBheGlzT3BlcmF0aW9uCi0gICAgICAgICAgICAgICAgICAgIC5nZXRNZXNzYWdlKFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9PVVRfVkFMVUUpOwotICAgICAgICAgICAgQXhpc0JpbmRpbmdNZXNzYWdlIGF4aXNCaW5kaW5nT3V0TWVzc2FnZSA9IG5ldyBBeGlzQmluZGluZ01lc3NhZ2UoKTsKLQotICAgICAgICAgICAgYXhpc0JpbmRpbmdPdXRNZXNzYWdlLnNldE5hbWUoYXhpc091dE1lc3NhZ2UuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIGF4aXNCaW5kaW5nT3V0TWVzc2FnZS5zZXREaXJlY3Rpb24oYXhpc091dE1lc3NhZ2UuZ2V0RGlyZWN0aW9uKCkpOwotICAgICAgICAgICAgYXhpc0JpbmRpbmdPdXRNZXNzYWdlLnNldEF4aXNNZXNzYWdlKGF4aXNPdXRNZXNzYWdlKTsKLQotICAgICAgICAgICAgYXhpc0JpbmRpbmdPdXRNZXNzYWdlLnNldFBhcmVudChheGlzQmluZGluZ09wZXJhdGlvbik7Ci0gICAgICAgICAgICBheGlzQmluZGluZ09wZXJhdGlvbi5hZGRDaGlsZCgKLSAgICAgICAgICAgICAgICAgICAgV1NETENvbnN0YW50cy5NRVNTQUdFX0xBQkVMX09VVF9WQUxVRSwKLSAgICAgICAgICAgICAgICAgICAgYXhpc0JpbmRpbmdPdXRNZXNzYWdlKTsKLSAgICAgICAgfQotCi0gICAgICAgIEFycmF5TGlzdCBmYXVsdE1lc3NhZ2VzTGlzdCA9IGF4aXNPcGVyYXRpb24uZ2V0RmF1bHRNZXNzYWdlcygpOwotICAgICAgICBmb3IgKE9iamVjdCBhRmF1bHRNZXNzYWdlc0xpc3QgOiBmYXVsdE1lc3NhZ2VzTGlzdCkgewotICAgICAgICAgICAgQXhpc01lc3NhZ2UgYXhpc0ZhdWx0TWVzc2FnZSA9IChBeGlzTWVzc2FnZSlhRmF1bHRNZXNzYWdlc0xpc3Q7Ci0gICAgICAgICAgICBBeGlzQmluZGluZ01lc3NhZ2UgYXhpc0JpbmRpbmdGYXVsdE1lc3NhZ2UgPSBuZXcgQXhpc0JpbmRpbmdNZXNzYWdlKCk7Ci0gICAgICAgICAgICBheGlzQmluZGluZ0ZhdWx0TWVzc2FnZS5zZXROYW1lKGF4aXNGYXVsdE1lc3NhZ2UuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIGF4aXNCaW5kaW5nRmF1bHRNZXNzYWdlLnNldEZhdWx0KHRydWUpOwotICAgICAgICAgICAgYXhpc0JpbmRpbmdGYXVsdE1lc3NhZ2Uuc2V0QXhpc01lc3NhZ2UoYXhpc0ZhdWx0TWVzc2FnZSk7Ci0gICAgICAgICAgICBheGlzQmluZGluZ0ZhdWx0TWVzc2FnZS5zZXRQYXJlbnQoYXhpc0JpbmRpbmdPcGVyYXRpb24pOwotICAgICAgICAgICAgYXhpc0JpbmRpbmdPcGVyYXRpb24uYWRkRmF1bHQoYXhpc0JpbmRpbmdGYXVsdE1lc3NhZ2UpOwotICAgICAgICAgICAgYXhpc0JpbmRpbmcuYWRkRmF1bHQoYXhpc0JpbmRpbmdGYXVsdE1lc3NhZ2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgYXhpc0JpbmRpbmdPcGVyYXRpb24uc2V0QXhpc09wZXJhdGlvbihheGlzT3BlcmF0aW9uKTsKLSAgICAgICAgYXhpc0JpbmRpbmdPcGVyYXRpb24uc2V0UGFyZW50KGF4aXNCaW5kaW5nKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHByb2Nlc3NTb2FwQXR0YWNobWVudHMoU3RyaW5nIGlkZW50aWZpZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3QgcG9saWN5Q29tcG9uZW50cywgQXhpc1NlcnZpY2Ugc2VydmljZSkgewotICAgICAgICBNYXAgbWFwID0gc2VydmljZS5nZXRFbmRwb2ludHMoKTsKLSAgICAgICAgU3RyaW5nIHNvYXBWZXJzaW9uID0KLSAgICAgICAgICAgICAgICAoaWRlbnRpZmllci5pbmRleE9mKCJzb2FwMTIiKSA+IC0xKSA/IFNPQVAxMkNvbnN0YW50cy5TT0FQX0VOVkVMT1BFX05BTUVTUEFDRV9VUkkKLSAgICAgICAgICAgICAgICAgICAgICAgIDogU09BUDExQ29uc3RhbnRzLlNPQVBfRU5WRUxPUEVfTkFNRVNQQUNFX1VSSTsKLQotICAgICAgICBmb3IgKE9iamVjdCBvIDogbWFwLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICBBeGlzRW5kcG9pbnQgYXhpc0VuZHBvaW50ID0gKEF4aXNFbmRwb2ludClvOwotICAgICAgICAgICAgQXhpc0JpbmRpbmcgYXhpc0JpbmRpbmcgPSBheGlzRW5kcG9pbnQuZ2V0QmluZGluZygpOwotICAgICAgICAgICAgU3RyaW5nIHdzb2FwID0gKFN0cmluZylheGlzQmluZGluZwotICAgICAgICAgICAgICAgICAgICAuZ2V0UHJvcGVydHkoV1NETDJDb25zdGFudHMuQVRUUl9XU09BUF9WRVJTSU9OKTsKLSAgICAgICAgICAgIGlmIChzb2FwVmVyc2lvbi5lcXVhbHMod3NvYXApKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nW10gaWRlbnRpZmllcnMgPSBpZGVudGlmaWVyLnNwbGl0KCIvIik7Ci0gICAgICAgICAgICAgICAgaW50IGtleSA9IGlkZW50aWZpZXJzLmxlbmd0aDsKLSAgICAgICAgICAgICAgICBpZiAoa2V5ID09IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgYXhpc0JpbmRpbmcuZ2V0UG9saWN5U3ViamVjdCgpLmF0dGFjaFBvbGljeUNvbXBvbmVudHMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9saWN5Q29tcG9uZW50cyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChrZXkgPT0gMiB8fCBrZXkgPT0gMykgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgb3BOYW1lID0gaWRlbnRpZmllcnNbMV07Ci0gICAgICAgICAgICAgICAgICAgIG9wTmFtZSA9IG9wTmFtZS5zdWJzdHJpbmcob3BOYW1lLmluZGV4T2YoIjoiKSArIDEsIG9wTmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5sZW5ndGgoKSk7Ci0gICAgICAgICAgICAgICAgICAgIEF4aXNCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24gPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGF4aXNCaW5kaW5nLmdldENoaWxkcmVuKCk7IGkuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgICAgICAgICAgYmluZGluZ09wZXJhdGlvbiA9IChBeGlzQmluZGluZ09wZXJhdGlvbilpLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcE5hbWUuZXF1YWxzKGJpbmRpbmdPcGVyYXRpb24uZ2V0TmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRMb2NhbFBhcnQoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgYmluZGluZyBvcGVyYXRpb24gIiArIG9wTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAoa2V5ID09IDIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRpbmdPcGVyYXRpb24uZ2V0UG9saWN5U3ViamVjdCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRhY2hQb2xpY3lDb21wb25lbnRzKHBvbGljeUNvbXBvbmVudHMpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCJpbiIuZXF1YWxzKGlkZW50aWZpZXJzWzJdKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF4aXNCaW5kaW5nTWVzc2FnZSBiaW5kaW5nSW5NZXNzYWdlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBeGlzQmluZGluZ01lc3NhZ2UpYmluZGluZ09wZXJhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Q2hpbGQoV1NETENvbnN0YW50cy5NRVNTQUdFX0xBQkVMX0lOX1ZBTFVFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kaW5nSW5NZXNzYWdlLmdldFBvbGljeVN1YmplY3QoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmF0dGFjaFBvbGljeUNvbXBvbmVudHMocG9saWN5Q29tcG9uZW50cyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIm91dCIuZXF1YWxzKGlkZW50aWZpZXJzWzJdKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF4aXNCaW5kaW5nTWVzc2FnZSBiaW5kaW5nT3V0TWVzc2FnZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQXhpc0JpbmRpbmdNZXNzYWdlKWJpbmRpbmdPcGVyYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldENoaWxkKFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9PVVRfVkFMVUUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRpbmdPdXRNZXNzYWdlLmdldFBvbGljeVN1YmplY3QoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmF0dGFjaFBvbGljeUNvbXBvbmVudHMocG9saWN5Q29tcG9uZW50cyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FIGZhdWx0cwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzU29hcDExQmluZGluZyhBeGlzQmluZGluZyBiaW5kaW5nKSB7Ci0gICAgICAgIFN0cmluZyB0eXBlID0gYmluZGluZy5nZXRUeXBlKCk7Ci0gICAgICAgIGlmIChKYXZhMldTRExDb25zdGFudHMuVFJBTlNQT1JUX1VSSS5lcXVhbHModHlwZSkKLSAgICAgICAgICAgIHx8IFdTREwyQ29uc3RhbnRzLlVSSV9XU0RMMl9TT0FQLmVxdWFscyh0eXBlKSkgewotICAgICAgICAgICAgU3RyaW5nIHYgPSAoU3RyaW5nKWJpbmRpbmcKLSAgICAgICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KFdTREwyQ29uc3RhbnRzLkFUVFJfV1NPQVBfVkVSU0lPTik7Ci0gICAgICAgICAgICBpZiAoU09BUDExQ29uc3RhbnRzLlNPQVBfRU5WRUxPUEVfTkFNRVNQQUNFX1VSSS5lcXVhbHModikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzU29hcDEyQmluZGluZyhBeGlzQmluZGluZyBiaW5kaW5nKSB7Ci0gICAgICAgIFN0cmluZyB0eXBlID0gYmluZGluZy5nZXRUeXBlKCk7Ci0gICAgICAgIGlmIChKYXZhMldTRExDb25zdGFudHMuVFJBTlNQT1JUX1VSSS5lcXVhbHModHlwZSkKLSAgICAgICAgICAgIHx8IFdTREwyQ29uc3RhbnRzLlVSSV9XU0RMMl9TT0FQLmVxdWFscyh0eXBlKSkgewotICAgICAgICAgICAgU3RyaW5nIHYgPSAoU3RyaW5nKWJpbmRpbmcKLSAgICAgICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KFdTREwyQ29uc3RhbnRzLkFUVFJfV1NPQVBfVkVSU0lPTik7Ci0gICAgICAgICAgICBpZiAoU09BUDEyQ29uc3RhbnRzLlNPQVBfRU5WRUxPUEVfTkFNRVNQQUNFX1VSSS5lcXVhbHModikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzSHR0cEJpbmRpbmcoQXhpc0JpbmRpbmcgYmluZGluZykgewotICAgICAgICBTdHJpbmcgdHlwZSA9IGJpbmRpbmcuZ2V0VHlwZSgpOwotICAgICAgICByZXR1cm4gV1NETDJDb25zdGFudHMuVVJJX1dTREwyX0hUVFAuZXF1YWxzKHR5cGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQXhpc0JpbmRpbmcgZ2V0U29hcDExQmluZGluZyhBeGlzU2VydmljZSBzZXJ2aWNlKSB7Ci0gICAgICAgIGZvciAoT2JqZWN0IG8gOiBzZXJ2aWNlLmdldEVuZHBvaW50cygpLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICBBeGlzRW5kcG9pbnQgZW5kcG9pbnQgPSAoQXhpc0VuZHBvaW50KW87Ci0gICAgICAgICAgICBBeGlzQmluZGluZyBiaW5kaW5nID0gZW5kcG9pbnQuZ2V0QmluZGluZygpOwotCi0gICAgICAgICAgICBpZiAoaXNTb2FwMTFCaW5kaW5nKGJpbmRpbmcpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGJpbmRpbmc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBBeGlzQmluZGluZyBnZXRTb2FwMTJCaW5kaW5nKEF4aXNTZXJ2aWNlIHNlcnZpY2UpIHsKLSAgICAgICAgZm9yIChPYmplY3QgbyA6IHNlcnZpY2UuZ2V0RW5kcG9pbnRzKCkudmFsdWVzKCkpIHsKLSAgICAgICAgICAgIEF4aXNFbmRwb2ludCBlbmRwb2ludCA9IChBeGlzRW5kcG9pbnQpbzsKLSAgICAgICAgICAgIEF4aXNCaW5kaW5nIGJpbmRpbmcgPSBlbmRwb2ludC5nZXRCaW5kaW5nKCk7Ci0KLSAgICAgICAgICAgIGlmIChpc1NvYXAxMkJpbmRpbmcoYmluZGluZykpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gYmluZGluZzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEF4aXNCaW5kaW5nIGdldEh0dHBCaW5kaW5nKEF4aXNTZXJ2aWNlIHNlcnZpY2UpIHsKLSAgICAgICAgZm9yIChPYmplY3QgbyA6IHNlcnZpY2UuZ2V0RW5kcG9pbnRzKCkudmFsdWVzKCkpIHsKLSAgICAgICAgICAgIEF4aXNFbmRwb2ludCBlbmRwb2ludCA9IChBeGlzRW5kcG9pbnQpbzsKLSAgICAgICAgICAgIEF4aXNCaW5kaW5nIGJpbmRpbmcgPSBlbmRwb2ludC5nZXRCaW5kaW5nKCk7Ci0KLSAgICAgICAgICAgIGlmIChpc0h0dHBCaW5kaW5nKGJpbmRpbmcpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGJpbmRpbmc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBBeGlzQmluZGluZ09wZXJhdGlvbiBnZXRCaW5kaW5nT3BlcmF0aW9uKEF4aXNCaW5kaW5nIGJpbmRpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF4aXNPcGVyYXRpb24gb3BlcmF0aW9uKSB7Ci0gICAgICAgIFFOYW1lIG9wTmFtZSA9IG9wZXJhdGlvbi5nZXROYW1lKCk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgYmluZGluZ09wcyA9IGJpbmRpbmcuZ2V0Q2hpbGRyZW4oKTsgYmluZGluZ09wcy5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBBeGlzQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3AgPSAoQXhpc0JpbmRpbmdPcGVyYXRpb24pYmluZGluZ09wcy5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAob3BOYW1lLmVxdWFscyhiaW5kaW5nT3AuZ2V0TmFtZSgpKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBiaW5kaW5nT3A7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBBeGlzQmluZGluZ01lc3NhZ2UgZ2V0QmluZGluZ01lc3NhZ2UoQXhpc0JpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBeGlzTWVzc2FnZSBtZXNzYWdlKSB7Ci0gICAgICAgIFN0cmluZyBtc2dOYW1lID0gbWVzc2FnZS5nZXROYW1lKCk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgYmluZGluZ01lc3NhZ2VzID0gYmluZGluZ09wZXJhdGlvbi5nZXRDaGlsZHJlbigpOwotICAgICAgICAgICAgIGJpbmRpbmdNZXNzYWdlcy5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBBeGlzQmluZGluZ01lc3NhZ2UgYmluZGluZ01lc3NhZ2UgPSAoQXhpc0JpbmRpbmdNZXNzYWdlKWJpbmRpbmdNZXNzYWdlcy5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAobXNnTmFtZS5lcXVhbHMoYmluZGluZ01lc3NhZ2UuZ2V0TmFtZSgpKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBiaW5kaW5nTWVzc2FnZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vQXhpc0JpbmRpbmcuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9BeGlzQmluZGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmEwMzMzLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9BeGlzQmluZGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQMTFDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLlBvbGljeVV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLldTRExTZXJpYWxpemF0aW9uVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLm5lZXRoaS5Qb2xpY3k7Ci1pbXBvcnQgb3JnLmFwYWNoZS5uZWV0aGkuUG9saWN5Q29tcG9uZW50OwotCi0vKioKLSAqIEFuIEF4aXNCaW5kaW5nIHJlcHJlc2VudHMgYSBXU0RMIGJpbmRpbmcsIGFuZCBjb250YWlucyBBeGlzQmluZGluZ09wZXJhdGlvbnMuCi0gKi8KLXB1YmxpYyBjbGFzcyBBeGlzQmluZGluZyBleHRlbmRzIEF4aXNEZXNjcmlwdGlvbiB7Ci0KLSAgICBwcml2YXRlIFFOYW1lIG5hbWU7Ci0KLSAgICBwcml2YXRlIFN0cmluZyB0eXBlOwotCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBPYmplY3Q+IG9wdGlvbnM7Ci0KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIEF4aXNCaW5kaW5nTWVzc2FnZT4gZmF1bHRzOwotCi0gICAgcHVibGljIEF4aXNCaW5kaW5nTWVzc2FnZSBnZXRGYXVsdChTdHJpbmcgbmFtZSkgewotICAgICAgICByZXR1cm4gKEF4aXNCaW5kaW5nTWVzc2FnZSkgZmF1bHRzLmdldChuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRGYXVsdChBeGlzQmluZGluZ01lc3NhZ2UgZmF1bHQpIHsKLSAgICAgICAgdGhpcy5mYXVsdHMucHV0KGZhdWx0LmdldE5hbWUoKSwgZmF1bHQpOwotICAgIH0KLQotICAgIHB1YmxpYyBBeGlzQmluZGluZygpIHsKLSAgICAgICAgb3B0aW9ucyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotICAgICAgICBmYXVsdHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEF4aXNCaW5kaW5nTWVzc2FnZT4oKTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgb3B0aW9ucy5wdXQobmFtZSwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBuYW1lIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIHNlYXJjaCBmb3IKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHksIG9yIG51bGwgaWYgdGhlIHByb3BlcnR5IGlzIG5vdCBmb3VuZAotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgT2JqZWN0IG9iaiA9IG9wdGlvbnMuZ2V0KG5hbWUpOwotICAgICAgICBpZiAob2JqICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBvYmo7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBuZWVkIHRoaXMgaGVyZSB0byBndWFyYW50ZWUgdGhhdCB3ZSBkb250IHJldHVybiBhIFNPQVAgdmVyc2lvbiBmb3IgSFRUUCBCaW5kaW5ncwotICAgICAgICBpZiAoV1NETDJDb25zdGFudHMuQVRUUl9XU09BUF9WRVJTSU9OLmVxdWFscyhuYW1lKSAmJgotICAgICAgICAgICAgICAgIFdTREwyQ29uc3RhbnRzLlVSSV9XU0RMMl9IVFRQLmVxdWFscyh0eXBlKSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBvYmogPSBXU0RMMjBEZWZhdWx0VmFsdWVIb2xkZXIuZ2V0RGVmYXVsdFZhbHVlKG5hbWUpOwotCi0gICAgICAgIHJldHVybiBvYmo7Ci0gICAgfQotCi0gICAgcHVibGljIFFOYW1lIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoUU5hbWUgbmFtZSkgewotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIHR5cGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgdHlwZSkgewotICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0S2V5KCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBlbmdhZ2VNb2R1bGUoQXhpc01vZHVsZSBheGlzTW9kdWxlKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJTb3JyeSB3ZSBkbyBub3Qgc3VwcG9ydCB0aGlzIik7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbmdhZ2VkKFN0cmluZyBtb2R1bGVOYW1lKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiYXhpc01lc3NhZ2UuaXNFbmdhZ2VkKCkgaXMgbm90IHN1cHBvcnRlZCIpOwotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2VuZXJhdGUgdGhlICZsdDtiaW5kaW5nJmd0OyBlbGVtZW50Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gd3NkbCB0aGUgV1NETCBuYW1lc3BhY2UKLSAgICAgKiBAcGFyYW0gdG5zIHRoZSB0YXJnZXQgbmFtZXNwYWNlCi0gICAgICogQHBhcmFtIHdzb2FwIHRoZSBTT0FQIG5hbWVzcGFjZQotICAgICAqIEBwYXJhbSB3aHR0cCB0aGUgSFRUUCBuYW1lc3BhY2UKLSAgICAgKiBAcGFyYW0gaW50ZXJmYWNlTmFtZSB0aGUgbmFtZSBvZiB0aGUgaW50ZXJmYWNlCi0gICAgICogQHBhcmFtIG5hbWVTcGFjZU1hcCB0aGUgbmFtZXNwYWNlTWFwIChwcmVmaXggLT4gbmFtZXNwYWNlVVJJKSBvZiB0aGUgc2VydmljZQotICAgICAqIEBwYXJhbSBhZGRyZXNzaW5nRmxhZyBhZGRyZXNzaW5nIHVzYWdlIGZsYWcgKHNlZSBBZGRyZXNzaW5nQ29uc3RhbnRzKQotICAgICAqIEBwYXJhbSBzZXJ2aWNlTmFtZSB0aGUgbmFtZSBvZiB0aGUgc2VydmljZQotICAgICAqIEByZXR1cm4gdGhlIGdlbmVyYXRlZCBiaW5kaW5nIGVsZW1lbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgT01FbGVtZW50IHRvV1NETDIwKE9NTmFtZXNwYWNlIHdzZGwsIE9NTmFtZXNwYWNlIHRucywgT01OYW1lc3BhY2Ugd3NvYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTU5hbWVzcGFjZSB3aHR0cCwgU3RyaW5nIGludGVyZmFjZU5hbWUsIE1hcCBuYW1lU3BhY2VNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYWRkcmVzc2luZ0ZsYWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2VydmljZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTU5hbWVzcGFjZSB3c2F3KSB7Ci0gICAgICAgIFN0cmluZyBwcm9wZXJ0eTsKLSAgICAgICAgT01GYWN0b3J5IG9tRmFjdG9yeSA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpOwotICAgICAgICBPTUVsZW1lbnQgYmluZGluZ0VsZW1lbnQ7Ci0gICAgICAgIGJpbmRpbmdFbGVtZW50ID0gb21GYWN0b3J5LmNyZWF0ZU9NRWxlbWVudChXU0RMMkNvbnN0YW50cy5CSU5ESU5HX0xPQ0FMX05BTUUsIHdzZGwpOwotICAgICAgICBiaW5kaW5nRWxlbWVudC5hZGRBdHRyaWJ1dGUob21GYWN0b3J5LmNyZWF0ZU9NQXR0cmlidXRlKFdTREwyQ29uc3RhbnRzLkFUVFJJQlVURV9OQU1FLCBudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmFtZS5nZXRMb2NhbFBhcnQoKSkpOwotICAgICAgICBiaW5kaW5nRWxlbWVudC5hZGRBdHRyaWJ1dGUob21GYWN0b3J5LmNyZWF0ZU9NQXR0cmlidXRlKFdTREwyQ29uc3RhbnRzLklOVEVSRkFDRV9MT0NBTF9OQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIHRucy5nZXRQcmVmaXgoKSArICI6IiArCi0gICAgICAgICAgICAgICAgaW50ZXJmYWNlTmFtZSkpOwotCi0gICAgICAgIGlmIChXU0RMMkNvbnN0YW50cy5VUklfV1NETDJfU09BUC5lcXVhbHModHlwZSkgfHwgQ29uc3RhbnRzLlVSSV9TT0FQMTFfSFRUUC5lcXVhbHModHlwZSkgfHwKLSAgICAgICAgICAgICAgICBDb25zdGFudHMuVVJJX1NPQVAxMl9IVFRQLmVxdWFscyh0eXBlKSkgewotICAgICAgICAgICAgLy8gU09BUCBCaW5kaW5nIHNwZWNpZmljIHByb3BlcnRpZXMKLSAgICAgICAgICAgIGJpbmRpbmdFbGVtZW50LmFkZEF0dHJpYnV0ZShvbUZhY3RvcnkuY3JlYXRlT01BdHRyaWJ1dGUoV1NETDJDb25zdGFudHMuQVRUUklCVVRFX1RZUEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdTREwyQ29uc3RhbnRzLlVSSV9XU0RMMl9TT0FQKSk7Ci0gICAgICAgICAgICBwcm9wZXJ0eSA9IChTdHJpbmcpb3B0aW9ucy5nZXQoV1NETDJDb25zdGFudHMuQVRUUl9XU09BUF9WRVJTSU9OKTsKLSAgICAgICAgICAgIGlmIChwcm9wZXJ0eSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKFNPQVAxMUNvbnN0YW50cy5TT0FQX0VOVkVMT1BFX05BTUVTUEFDRV9VUkkuZXF1YWxzKHByb3BlcnR5KSkgewotICAgICAgICAgICAgICAgICAgICBiaW5kaW5nRWxlbWVudC5hZGRBdHRyaWJ1dGUob21GYWN0b3J5LmNyZWF0ZU9NQXR0cmlidXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdTREwyQ29uc3RhbnRzLkFUVFJJQlVURV9WRVJTSU9OLCB3c29hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU0RMMkNvbnN0YW50cy5TT0FQX1ZFUlNJT05fMV8xKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYmluZGluZ0VsZW1lbnQuYWRkQXR0cmlidXRlKG9tRmFjdG9yeS5jcmVhdGVPTUF0dHJpYnV0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU0RMMkNvbnN0YW50cy5BVFRSSUJVVEVfVkVSU0lPTiwgd3NvYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NETDJDb25zdGFudHMuU09BUF9WRVJTSU9OXzFfMikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHByb3BlcnR5ID0gKFN0cmluZylvcHRpb25zLmdldChXU0RMMkNvbnN0YW50cy5BVFRSX1dTT0FQX1BST1RPQ09MKTsKLSAgICAgICAgICAgIGlmIChwcm9wZXJ0eSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYmluZGluZ0VsZW1lbnQuYWRkQXR0cmlidXRlKG9tRmFjdG9yeS5jcmVhdGVPTUF0dHJpYnV0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIFdTREwyQ29uc3RhbnRzLkFUVFJJQlVURV9QUk9UT0NPTCwgd3NvYXAsIHByb3BlcnR5KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwcm9wZXJ0eSA9IChTdHJpbmcpb3B0aW9ucy5nZXQoV1NETDJDb25zdGFudHMuQVRUUl9XU09BUF9NRVApOwotICAgICAgICAgICAgaWYgKHByb3BlcnR5ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBiaW5kaW5nRWxlbWVudC5hZGRBdHRyaWJ1dGUob21GYWN0b3J5LmNyZWF0ZU9NQXR0cmlidXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgV1NETDJDb25zdGFudHMuQVRUUklCVVRFX01FUF9ERUZBVUxULCB3c29hcCwgcHJvcGVydHkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFycmF5TGlzdCBzb2FwTW9kdWxlcyA9IChBcnJheUxpc3Qpb3B0aW9ucy5nZXQoV1NETDJDb25zdGFudHMuQVRUUl9XU09BUF9NT0RVTEUpOwotICAgICAgICAgICAgaWYgKHNvYXBNb2R1bGVzICE9IG51bGwgJiYgc29hcE1vZHVsZXMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgICAgIFdTRExTZXJpYWxpemF0aW9uVXRpbAotICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFNPQVBNb2R1bGVFbGVtZW50cyhvbUZhY3RvcnksIHNvYXBNb2R1bGVzLCB3c29hcCwgYmluZGluZ0VsZW1lbnQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBXU0RMU2VyaWFsaXphdGlvblV0aWwKLSAgICAgICAgICAgICAgICAgICAgLmFkZFdTQWRkcmVzc2luZ1RvQmluZGluZyhhZGRyZXNzaW5nRmxhZywgb21GYWN0b3J5LCBiaW5kaW5nRWxlbWVudCwgd3Nhdyk7Ci0KLSAgICAgICAgfSBlbHNlIGlmIChXU0RMMkNvbnN0YW50cy5VUklfV1NETDJfSFRUUC5lcXVhbHModHlwZSkpIHsKLSAgICAgICAgICAgIC8vIEhUVFAgQmluZGluZyBzcGVjaWZpYyBwcm9wZXJ0aWVzCi0gICAgICAgICAgICBwcm9wZXJ0eSA9IChTdHJpbmcpb3B0aW9ucy5nZXQoV1NETDJDb25zdGFudHMuQVRUUl9XSFRUUF9NRVRIT0QpOwotICAgICAgICAgICAgaWYgKHByb3BlcnR5ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBiaW5kaW5nRWxlbWVudC5hZGRBdHRyaWJ1dGUob21GYWN0b3J5LmNyZWF0ZU9NQXR0cmlidXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgV1NETDJDb25zdGFudHMuQVRUUklCVVRFX01FVEhPRF9ERUZBVUxULCB3aHR0cCwgcHJvcGVydHkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJpbmRpbmdFbGVtZW50LmFkZEF0dHJpYnV0ZShvbUZhY3RvcnkuY3JlYXRlT01BdHRyaWJ1dGUoV1NETDJDb25zdGFudHMuQVRUUklCVVRFX1RZUEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdTREwyQ29uc3RhbnRzLlVSSV9XU0RMMl9IVFRQKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBDb21tb24gUHJvcGVydGllcwotICAgICAgICBwcm9wZXJ0eSA9IChTdHJpbmcpb3B0aW9ucy5nZXQoV1NETDJDb25zdGFudHMuQVRUUl9XSFRUUF9DT05URU5UX0VOQ09ESU5HKTsKLSAgICAgICAgaWYgKHByb3BlcnR5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGJpbmRpbmdFbGVtZW50LmFkZEF0dHJpYnV0ZShvbUZhY3RvcnkuY3JlYXRlT01BdHRyaWJ1dGUoCi0gICAgICAgICAgICAgICAgICAgIFdTREwyQ29uc3RhbnRzLkFUVFJJQlVURV9DT05URU5UX0VOQ09ESU5HX0RFRkFVTFQsIHdodHRwLCBwcm9wZXJ0eSkpOwotICAgICAgICB9Ci0gICAgICAgIHByb3BlcnR5ID0gKFN0cmluZylvcHRpb25zLmdldChXU0RMMkNvbnN0YW50cy5BVFRSX1dIVFRQX1FVRVJZX1BBUkFNRVRFUl9TRVBBUkFUT1IpOwotICAgICAgICBpZiAocHJvcGVydHkgIT0gbnVsbCkgewotICAgICAgICAgICAgYmluZGluZ0VsZW1lbnQuYWRkQXR0cmlidXRlKG9tRmFjdG9yeS5jcmVhdGVPTUF0dHJpYnV0ZSgKLSAgICAgICAgICAgICAgICAgICAgV1NETDJDb25zdGFudHMuQVRUUklCVVRFX1FVRVJZX1BBUkFNRVRFUl9TRVBFUkFUT1JfREVGQVVMVCwgd2h0dHAsIHByb3BlcnR5KSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBQb3B1bGF0ZSBCaW5kaW5nIGZhdWx0cwotICAgICAgICBpZiAoZmF1bHRzICE9IG51bGwpIHsKLSAgICAgICAgICAgIEl0ZXJhdG9yPEF4aXNCaW5kaW5nTWVzc2FnZT4gaXRlcmF0b3IgPSBmYXVsdHMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBBeGlzQmluZGluZ01lc3NhZ2UgYXhpc0JpbmRpbmdGYXVsdCA9IChBeGlzQmluZGluZ01lc3NhZ2UpaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgYXhpc0JpbmRpbmdGYXVsdC50b1dTREwyMCh3c2RsLCB0bnMsIHdzb2FwLCB3aHR0cCwgbmFtZVNwYWNlTWFwKTsKLSAgICAgICAgICAgICAgICBvbUVsZW1lbnQuc2V0TG9jYWxOYW1lKFdTREwyQ29uc3RhbnRzLkZBVUxUX0xPQ0FMX05BTUUpOwotICAgICAgICAgICAgICAgIGJpbmRpbmdFbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ2hpbGQob21FbGVtZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIFBvcHVsYXRlIEJpbmRpbmcgT3BlcmF0aW9ucwotICAgICAgICBJdGVyYXRvciBpdGVyYXRvciA9IHRoaXMuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgQXhpc0JpbmRpbmdPcGVyYXRpb24gYXhpc0JpbmRpbmdPcGVyYXRpb24gPSAoQXhpc0JpbmRpbmdPcGVyYXRpb24paXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uID0gYXhpc0JpbmRpbmdPcGVyYXRpb24uZ2V0QXhpc09wZXJhdGlvbigpOwotCi0gICAgICAgICAgICAvLyBJZiB0aGUgYXhpc09wZXJhdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoaXMgaXMgYSBjb250cm9sIG9wZXJhdGlvbiB3ZSBkbyBub3Qgd2FudCB0bwotICAgICAgICAgICAgLy8gaGF2ZSBpdCBsaXN0ZWQgaW4gdGhlIFdTREwKLSAgICAgICAgICAgIGlmIChheGlzT3BlcmF0aW9uICE9IG51bGwgJiYgYXhpc09wZXJhdGlvbi5pc0NvbnRyb2xPcGVyYXRpb24oKSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYmluZGluZ0VsZW1lbnQuYWRkQ2hpbGQoYXhpc0JpbmRpbmdPcGVyYXRpb24udG9XU0RMMjAod3NkbCwgdG5zLCB3c29hcCwgd2h0dHAsIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lU3BhY2VNYXAsIHNlcnZpY2VOYW1lKSk7Ci0gICAgICAgIH0KLSAgICAgICAgV1NETFNlcmlhbGl6YXRpb25VdGlsLmFkZFdTRExEb2N1bWVudGF0aW9uRWxlbWVudCh0aGlzLCBiaW5kaW5nRWxlbWVudCwgb21GYWN0b3J5LCB3c2RsKTsKLSAgICAgICAgV1NETFNlcmlhbGl6YXRpb25VdGlsLmFkZFBvbGljaWVzQXNFeHRlbnNpYmxlRWxlbWVudCh0aGlzLAotCQkJCWJpbmRpbmdFbGVtZW50KTsKLSAgICAgICAgcmV0dXJuIGJpbmRpbmdFbGVtZW50OwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgUG9saWN5IGdldEVmZmVjdGl2ZVBvbGljeSgpIHsKLSAgICAgICAgQXJyYXlMaXN0PFBvbGljeUNvbXBvbmVudD4gcG9saWN5TGlzdCA9IG5ldyBBcnJheUxpc3Q8UG9saWN5Q29tcG9uZW50PigpOwotICAgICAgICBwb2xpY3lMaXN0LmFkZEFsbChnZXRQb2xpY3lJbmNsdWRlKCkuZ2V0QXR0YWNoZWRQb2xpY2llcygpKTsKLSAgICAgCi0gICAgICAgIC8vIEF4aXNFbmRwb2ludAotICAgICAgICBBeGlzRW5kcG9pbnQgYXhpc0VuZHBvaW50ID0gZ2V0QXhpc0VuZHBvaW50KCk7Ci0gICAgICAgIAotICAgICAgICBpZiAoYXhpc0VuZHBvaW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHBvbGljeUxpc3QuYWRkQWxsKGF4aXNFbmRwb2ludC5nZXRQb2xpY3lJbmNsdWRlKCkKLSAgICAgICAgICAgICAgICAgICAgLmdldEF0dGFjaGVkUG9saWNpZXMoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2UgPSBudWxsOwotICAgICAgICAKLSAgICAgICAgaWYgKGF4aXNFbmRwb2ludCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzZXJ2aWNlID0gYXhpc0VuZHBvaW50LmdldEF4aXNTZXJ2aWNlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmIChzZXJ2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIFBvbGljeSBlZmZlY3RpdmVQb2xpY3kgPSBzZXJ2aWNlLmdldFBvbGljeUluY2x1ZGUoKS5nZXRFZmZlY3RpdmVQb2xpY3koKTsKLSAgICAgICAgICAgIGlmIChlZmZlY3RpdmVQb2xpY3kgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHBvbGljeUxpc3QuYWRkKGVmZmVjdGl2ZVBvbGljeSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBQb2xpY3lVdGlsLmdldE1lcmdlZFBvbGljeShwb2xpY3lMaXN0LCAgdGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIEF4aXNFbmRwb2ludCBnZXRBeGlzRW5kcG9pbnQoKSB7Ci0gICAgICAgIHJldHVybiAoQXhpc0VuZHBvaW50KXBhcmVudDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIEl0ZXJhdG9yPEF4aXNCaW5kaW5nT3BlcmF0aW9uPiBnZXRDaGlsZHJlbigpewotICAgIAlyZXR1cm4gKEl0ZXJhdG9yPEF4aXNCaW5kaW5nT3BlcmF0aW9uPikgc3VwZXIuZ2V0Q2hpbGRyZW4oKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vQXhpc0JpbmRpbmdNZXNzYWdlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vQXhpc0JpbmRpbmdNZXNzYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1MDBmZTcuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL0F4aXNCaW5kaW5nTWVzc2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuUG9saWN5VXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuV1NETDIwVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuV1NETFNlcmlhbGl6YXRpb25VdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUubmVldGhpLlBvbGljeTsKLQotcHVibGljIGNsYXNzIEF4aXNCaW5kaW5nTWVzc2FnZSBleHRlbmRzIEF4aXNEZXNjcmlwdGlvbiB7Ci0KLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCi0JcHJpdmF0ZSBTdHJpbmcgZGlyZWN0aW9uOwotCi0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBPYmplY3Q+IG9wdGlvbnM7Ci0KLQlwcml2YXRlIEF4aXNNZXNzYWdlIGF4aXNNZXNzYWdlOwotCi0JLy8gVXNlZCB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoaXMgbWVzc2FnZSBpcyBhIGZhdWx0IG9yIG5vdC4gTmVlZGVkIGZvciB0aGUKLQkvLyBXU0RMIDIuMCBzZXJpYWxpemVyCi0JcHJpdmF0ZSBib29sZWFuIGZhdWx0ID0gZmFsc2U7Ci0KLQlwcml2YXRlIFBvbGljeSBlZmZlY3RpdmVQb2xpY3kgPSBudWxsOwotCXByaXZhdGUgRGF0ZSBsYXN0UG9saWN5Q2FsY3VhdGVkVGltZSA9IG51bGw7Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0ZhdWx0KCkgewotCQlyZXR1cm4gZmF1bHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RmF1bHQoYm9vbGVhbiBmYXVsdCkgewotCQl0aGlzLmZhdWx0ID0gZmF1bHQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JfQotCi0JcHVibGljIEF4aXNNZXNzYWdlIGdldEF4aXNNZXNzYWdlKCkgewotCQlyZXR1cm4gYXhpc01lc3NhZ2U7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QXhpc01lc3NhZ2UoQXhpc01lc3NhZ2UgYXhpc01lc3NhZ2UpIHsKLQkJdGhpcy5heGlzTWVzc2FnZSA9IGF4aXNNZXNzYWdlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGlyZWN0aW9uKCkgewotCQlyZXR1cm4gZGlyZWN0aW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERpcmVjdGlvbihTdHJpbmcgZGlyZWN0aW9uKSB7Ci0JCXRoaXMuZGlyZWN0aW9uID0gZGlyZWN0aW9uOwotCX0KLQotCXB1YmxpYyBBeGlzQmluZGluZ01lc3NhZ2UoKSB7Ci0JCW9wdGlvbnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlKSB7Ci0JCW9wdGlvbnMucHV0KG5hbWUsIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gc2VhcmNoIGZvcgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSwgb3IgbnVsbCBpZiB0aGUgcHJvcGVydHkgaXMgbm90IGZvdW5kCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgbmFtZSkgewotCQlPYmplY3Qgb2JqID0gb3B0aW9ucy5nZXQobmFtZSk7Ci0JCWlmIChvYmogIT0gbnVsbCkgewotCQkJcmV0dXJuIG9iajsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0S2V5KCkgewotCQlyZXR1cm4gbnVsbDsgLy8gVG8gY2hhbmdlIGJvZHkgb2YgaW1wbGVtZW50ZWQgbWV0aG9kcyB1c2UgRmlsZSB8Ci0JCS8vIFNldHRpbmdzIHwgRmlsZSBUZW1wbGF0ZXMuCi0JfQotCi0JcHVibGljIHZvaWQgZW5nYWdlTW9kdWxlKEF4aXNNb2R1bGUgYXhpc01vZHVsZSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiU29ycnkgd2UgZG8gbm90IHN1cHBvcnQgdGhpcyIpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRW5nYWdlZChTdHJpbmcgbW9kdWxlTmFtZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCi0JCQkJImF4aXNNZXNzYWdlLmlzRW5nYWdlZCgpIGlzIG5vdCBzdXBwb3J0ZWQiKTsKLQotCX0KLQotCS8qKgotCSAqIEdlbmVyYXRlcyB0aGUgYmluZGluZ01lc3NhZ2UgZWxlbWVudCAoY2FuIGJlIGlucHV0LCBvdXRwdXQsIGluZmF1bHQgb3IKLQkgKiBvdXRmYXVsdCkKLQkgKiAKLQkgKiBAcGFyYW0gdG5zIC0KLQkgKiAgICAgICAgICAgIFRoZSB0YXJnZXRuYW1lc3BhY2UKLQkgKiBAcGFyYW0gd3NvYXAgLQotCSAqICAgICAgICAgICAgVGhlIFNPQVAgbmFtZXNwYWNlIChXU0RMIDIuMCkKLQkgKiBAcGFyYW0gd2h0dHAgLQotCSAqICAgICAgICAgICAgVGhlIEhUVFAgbmFtZXNwYWNlIChXU0RMIDIuMCkKLQkgKiBAcGFyYW0gbmFtZVNwYWNlTWFwIC0KLQkgKiAgICAgICAgICAgIFRoZSBuYW1lc3BhY2VtYXAgb2YgdGhlIHNlcnZpY2UKLQkgKiBAcmV0dXJuIFRoZSBnZW5lcmF0ZWQgYmluZGluZ01lc3NhZ2UgZWxlbWVudAotCSAqLwotCXB1YmxpYyBPTUVsZW1lbnQgdG9XU0RMMjAoT01OYW1lc3BhY2Ugd3NkbCwgT01OYW1lc3BhY2UgdG5zLAotCQkJT01OYW1lc3BhY2Ugd3NvYXAsIE9NTmFtZXNwYWNlIHdodHRwLCBNYXA8U3RyaW5nLCBTdHJpbmc+IG5hbWVTcGFjZU1hcCkgewotCQlTdHJpbmcgcHJvcGVydHk7Ci0JCUFycmF5TGlzdCBsaXN0OwotCQlPTUZhY3Rvcnkgb21GYWN0b3J5ID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCk7Ci0JCU9NRWxlbWVudCBiaW5kaW5nTWVzc2FnZUVsZW1lbnQ7Ci0KLQkJLy8gSWYgdGhpcyBpcyBhIGZhdWx0LCBjcmVhdGUgYSBmYXVsdCBlbGVtZW50IGFuZCBhZGQgZmF1bHQgc3BlY2lmaWMKLQkJLy8gcHJvcGVydGllcwotCQlpZiAodGhpcy5pc0ZhdWx0KCkpIHsKLQkJCWlmICh0aGlzLmdldFBhcmVudCgpIGluc3RhbmNlb2YgQXhpc0JpbmRpbmcpIHsKLQkJCQliaW5kaW5nTWVzc2FnZUVsZW1lbnQgPSBvbUZhY3RvcnkuY3JlYXRlT01FbGVtZW50KAotCQkJCQkJV1NETDJDb25zdGFudHMuRkFVTFRfTE9DQUxfTkFNRSwgd3NkbCk7Ci0JCQl9IGVsc2UgaWYgKFdTRExDb25zdGFudHMuV1NETF9NRVNTQUdFX0RJUkVDVElPTl9JTi5lcXVhbHModGhpcwotCQkJCQkuZ2V0RGlyZWN0aW9uKCkpKSB7Ci0JCQkJYmluZGluZ01lc3NhZ2VFbGVtZW50ID0gb21GYWN0b3J5LmNyZWF0ZU9NRWxlbWVudCgKLQkJCQkJCVdTREwyQ29uc3RhbnRzLklOX0ZBVUxUX0xPQ0FMX05BTUUsIHdzZGwpOwotCQkJfSBlbHNlIHsKLQkJCQliaW5kaW5nTWVzc2FnZUVsZW1lbnQgPSBvbUZhY3RvcnkuY3JlYXRlT01FbGVtZW50KAotCQkJCQkJV1NETDJDb25zdGFudHMuT1VUX0ZBVUxUX0xPQ0FMX05BTUUsIHdzZGwpOwotCQkJfQotCQkJYmluZGluZ01lc3NhZ2VFbGVtZW50LmFkZEF0dHJpYnV0ZShvbUZhY3RvcnkuY3JlYXRlT01BdHRyaWJ1dGUoCi0JCQkJCVdTREwyQ29uc3RhbnRzLkFUVFJJQlVURV9SRUYsIG51bGwsIHRucy5nZXRQcmVmaXgoKSArICI6IgotCQkJCQkJCSsgdGhpcy5uYW1lKSk7Ci0KLQkJCVdTREwyMFV0aWwuZXh0cmFjdFdTREwyMFNvYXBGYXVsdEluZm8ob3B0aW9ucywKLQkJCQkJYmluZGluZ01lc3NhZ2VFbGVtZW50LCBvbUZhY3RvcnksIHdzb2FwKTsKLQotCQkJSW50ZWdlciBjb2RlID0gKEludGVnZXIpIHRoaXMub3B0aW9ucwotCQkJCQkuZ2V0KFdTREwyQ29uc3RhbnRzLkFUVFJfV0hUVFBfQ09ERSk7Ci0JCQlpZiAoY29kZSAhPSBudWxsKSB7Ci0JCQkJYmluZGluZ01lc3NhZ2VFbGVtZW50LmFkZEF0dHJpYnV0ZShvbUZhY3RvcnkuY3JlYXRlT01BdHRyaWJ1dGUoCi0JCQkJCQlXU0RMMkNvbnN0YW50cy5BVFRSSUJVVEVfQ09ERSwgd2h0dHAsIGNvZGUudG9TdHJpbmcoKSkpOwotCQkJfQotCi0JCQkvLyBDaGVja3Mgd2hldGhlciB0aGUgbWVzc2FnZSBpcyBhbiBpbnB1dCBtZXNzYWdlCi0JCX0gZWxzZSBpZiAoV1NETENvbnN0YW50cy5XU0RMX01FU1NBR0VfRElSRUNUSU9OX0lOLmVxdWFscyh0aGlzCi0JCQkJLmdldERpcmVjdGlvbigpKSkgewotCQkJYmluZGluZ01lc3NhZ2VFbGVtZW50ID0gb21GYWN0b3J5LmNyZWF0ZU9NRWxlbWVudCgKLQkJCQkJV1NETDJDb25zdGFudHMuSU5fUFVUX0xPQ0FMX05BTUUsIHdzZGwpOwotCi0JCQkvLyBNZXNzYWdlIHNob3VsZCBiZSBhbiBvdXRwdXQgbWVzc2FnZQotCQl9IGVsc2UgewotCQkJYmluZGluZ01lc3NhZ2VFbGVtZW50ID0gb21GYWN0b3J5LmNyZWF0ZU9NRWxlbWVudCgKLQkJCQkJV1NETDJDb25zdGFudHMuT1VUX1BVVF9MT0NBTF9OQU1FLCB3c2RsKTsKLQkJfQotCi0JCS8vIFBvcHVsYXRlIGNvbW1vbiBwcm9wZXJ0aWVzCi0JCXByb3BlcnR5ID0gKFN0cmluZykgdGhpcy5vcHRpb25zCi0JCQkJLmdldChXU0RMMkNvbnN0YW50cy5BVFRSX1dIVFRQX0NPTlRFTlRfRU5DT0RJTkcpOwotCQlpZiAocHJvcGVydHkgIT0gbnVsbCkgewotCQkJYmluZGluZ01lc3NhZ2VFbGVtZW50Ci0JCQkJCS5hZGRBdHRyaWJ1dGUob21GYWN0b3J5LmNyZWF0ZU9NQXR0cmlidXRlKAotCQkJCQkJCVdTREwyQ29uc3RhbnRzLkFUVFJJQlVURV9DT05URU5UX0VOQ09ESU5HLCB3aHR0cCwKLQkJCQkJCQlwcm9wZXJ0eSkpOwotCQl9Ci0JCWxpc3QgPSAoQXJyYXlMaXN0KSB0aGlzLm9wdGlvbnMuZ2V0KFdTREwyQ29uc3RhbnRzLkFUVFJfV0hUVFBfSEVBREVSKTsKLQkJaWYgKGxpc3QgIT0gbnVsbCAmJiBsaXN0LnNpemUoKSA+IDApIHsKLQkJCVdTRExTZXJpYWxpemF0aW9uVXRpbC5hZGRIVFRQSGVhZGVyRWxlbWVudHMob21GYWN0b3J5LCBsaXN0LCB3aHR0cCwKLQkJCQkJYmluZGluZ01lc3NhZ2VFbGVtZW50LCBuYW1lU3BhY2VNYXApOwotCQl9Ci0JCWxpc3QgPSAoQXJyYXlMaXN0KSB0aGlzLm9wdGlvbnMuZ2V0KFdTREwyQ29uc3RhbnRzLkFUVFJfV1NPQVBfSEVBREVSKTsKLQkJaWYgKGxpc3QgIT0gbnVsbCAmJiBsaXN0LnNpemUoKSA+IDApIHsKLQkJCVdTRExTZXJpYWxpemF0aW9uVXRpbC5hZGRTT0FQSGVhZGVyRWxlbWVudHMob21GYWN0b3J5LCBsaXN0LCB3c29hcCwKLQkJCQkJYmluZGluZ01lc3NhZ2VFbGVtZW50LCBuYW1lU3BhY2VNYXApOwotCQl9Ci0JCWxpc3QgPSAoQXJyYXlMaXN0KSB0aGlzLm9wdGlvbnMuZ2V0KFdTREwyQ29uc3RhbnRzLkFUVFJfV1NPQVBfTU9EVUxFKTsKLQkJaWYgKGxpc3QgIT0gbnVsbCAmJiBsaXN0LnNpemUoKSA+IDApIHsKLQkJCVdTRExTZXJpYWxpemF0aW9uVXRpbC5hZGRTT0FQTW9kdWxlRWxlbWVudHMob21GYWN0b3J5LCBsaXN0LCB3c29hcCwKLQkJCQkJYmluZGluZ01lc3NhZ2VFbGVtZW50KTsKLQkJfQotCQlXU0RMU2VyaWFsaXphdGlvblV0aWwuYWRkV1NETERvY3VtZW50YXRpb25FbGVtZW50KHRoaXMsCi0JCQkJYmluZGluZ01lc3NhZ2VFbGVtZW50LCBvbUZhY3RvcnksIHdzZGwpOwotCQlXU0RMU2VyaWFsaXphdGlvblV0aWwuYWRkUG9saWNpZXNBc0V4dGVuc2libGVFbGVtZW50KHRoaXMsCi0JCQkJYmluZGluZ01lc3NhZ2VFbGVtZW50KTsKLQkJcmV0dXJuIGJpbmRpbmdNZXNzYWdlRWxlbWVudDsKLQl9Ci0KLQlwdWJsaWMgQXhpc0JpbmRpbmdPcGVyYXRpb24gZ2V0QXhpc0JpbmRpbmdPcGVyYXRpb24oKSB7Ci0JCXJldHVybiAoQXhpc0JpbmRpbmdPcGVyYXRpb24pIHBhcmVudDsKLQl9Ci0KLQlwdWJsaWMgUG9saWN5IGdldEVmZmVjdGl2ZVBvbGljeSgpIHsKLQkgICAgICAgaWYgKGxhc3RQb2xpY3lDYWxjdWF0ZWRUaW1lID09IG51bGwgfHwgaXNQb2xpY3lVcGRhdGVkKCkpIHsKLQkJCWVmZmVjdGl2ZVBvbGljeSA9IGNhbGN1bGF0ZUVmZmVjdGl2ZVBvbGljeSgpOwotCQl9Ci0JCXJldHVybiBlZmZlY3RpdmVQb2xpY3k7Ci0JfQotCi0JcHVibGljIFBvbGljeSBjYWxjdWxhdGVFZmZlY3RpdmVQb2xpY3koKSB7Ci0JCVBvbGljeVN1YmplY3QgcG9saWN5U3ViamVjdCA9IG51bGw7Ci0JCUFycmF5TGlzdCBwb2xpY3lMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCS8vIEF4aXNCaW5kaW5nTWVzc2FnZQotCQlwb2xpY3lTdWJqZWN0ID0gZ2V0UG9saWN5U3ViamVjdCgpOwotCQlwb2xpY3lMaXN0LmFkZEFsbChwb2xpY3lTdWJqZWN0LmdldEF0dGFjaGVkUG9saWN5Q29tcG9uZW50cygpKTsKLQotCQkvLyBBeGlzQmluZGluZ09wZXJhdGlvbiBwb2xpY2llcwotCQlBeGlzQmluZGluZ09wZXJhdGlvbiBheGlzQmluZGluZ09wZXJhdGlvbiA9IGdldEF4aXNCaW5kaW5nT3BlcmF0aW9uKCk7Ci0JCWlmIChheGlzQmluZGluZ09wZXJhdGlvbiAhPSBudWxsKSB7Ci0JCQlwb2xpY3lMaXN0LmFkZEFsbChheGlzQmluZGluZ09wZXJhdGlvbi5nZXRQb2xpY3lTdWJqZWN0KCkKLQkJCQkJLmdldEF0dGFjaGVkUG9saWN5Q29tcG9uZW50cygpKTsKLQkJfQotCi0JCS8vIEF4aXNCaW5kaW5nCi0JCUF4aXNCaW5kaW5nIGF4aXNCaW5kaW5nID0gKGF4aXNCaW5kaW5nT3BlcmF0aW9uID09IG51bGwpID8gbnVsbAotCQkJCTogYXhpc0JpbmRpbmdPcGVyYXRpb24uZ2V0QXhpc0JpbmRpbmcoKTsKLQkJaWYgKGF4aXNCaW5kaW5nICE9IG51bGwpIHsKLQkJCXBvbGljeUxpc3QuYWRkQWxsKGF4aXNCaW5kaW5nLmdldFBvbGljeVN1YmplY3QoKQotCQkJCQkuZ2V0QXR0YWNoZWRQb2xpY3lDb21wb25lbnRzKCkpOwotCQl9Ci0KLQkJLy8gQXhpc0VuZHBvaW50Ci0JCUF4aXNFbmRwb2ludCBheGlzRW5kcG9pbnQgPSAoYXhpc0JpbmRpbmcgPT0gbnVsbCkgPyBudWxsIDogYXhpc0JpbmRpbmcKLQkJCQkuZ2V0QXhpc0VuZHBvaW50KCk7Ci0JCWlmIChheGlzRW5kcG9pbnQgIT0gbnVsbCkgewotCQkJcG9saWN5TGlzdC5hZGRBbGwoYXhpc0VuZHBvaW50LmdldFBvbGljeVN1YmplY3QoKQotCQkJCQkuZ2V0QXR0YWNoZWRQb2xpY3lDb21wb25lbnRzKCkpOwotCQl9Ci0KLQkJLy8gQXhpc01lc3NhZ2UKLQkJaWYgKGF4aXNNZXNzYWdlICE9IG51bGwpIHsKLQkJCXBvbGljeUxpc3QuYWRkQWxsKGF4aXNNZXNzYWdlLmdldFBvbGljeVN1YmplY3QoKQotCQkJCQkuZ2V0QXR0YWNoZWRQb2xpY3lDb21wb25lbnRzKCkpOwotCQl9Ci0KLQkJLy8gQXhpc09wZXJhdGlvbgotCQlBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb24gPSAoYXhpc01lc3NhZ2UgPT0gbnVsbCkgPyBudWxsCi0JCQkJOiBheGlzTWVzc2FnZS5nZXRBeGlzT3BlcmF0aW9uKCk7Ci0JCWlmIChheGlzT3BlcmF0aW9uICE9IG51bGwpIHsKLQkJCXBvbGljeUxpc3QuYWRkQWxsKGF4aXNPcGVyYXRpb24uZ2V0UG9saWN5U3ViamVjdCgpCi0JCQkJCS5nZXRBdHRhY2hlZFBvbGljeUNvbXBvbmVudHMoKSk7Ci0JCX0KLQotCQkvLyBBeGlzU2VydmljZQotCQlBeGlzU2VydmljZSBheGlzU2VydmljZSA9IChheGlzT3BlcmF0aW9uID09IG51bGwpID8gbnVsbAotCQkJCTogYXhpc09wZXJhdGlvbi5nZXRBeGlzU2VydmljZSgpOwotCQlpZiAoYXhpc1NlcnZpY2UgIT0gbnVsbCkgewotCQkJcG9saWN5TGlzdC5hZGRBbGwoYXhpc1NlcnZpY2UuZ2V0UG9saWN5U3ViamVjdCgpCi0JCQkJCS5nZXRBdHRhY2hlZFBvbGljeUNvbXBvbmVudHMoKSk7Ci0JCX0KLQotCQkvLyBBeGlzQ29uZmlndXJhdGlvbgotCQlBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlndXJhdGlvbiA9IChheGlzU2VydmljZSA9PSBudWxsKSA/IG51bGwKLQkJCQk6IGF4aXNTZXJ2aWNlLmdldEF4aXNDb25maWd1cmF0aW9uKCk7Ci0JCWlmIChheGlzQ29uZmlndXJhdGlvbiAhPSBudWxsKSB7Ci0JCQlwb2xpY3lMaXN0LmFkZEFsbChheGlzQ29uZmlndXJhdGlvbi5nZXRQb2xpY3lTdWJqZWN0KCkKLQkJCQkJLmdldEF0dGFjaGVkUG9saWN5Q29tcG9uZW50cygpKTsKLQkJfQotCi0JCWxhc3RQb2xpY3lDYWxjdWF0ZWRUaW1lID0gbmV3IERhdGUoKTsKLQkJcmV0dXJuIFBvbGljeVV0aWwuZ2V0TWVyZ2VkUG9saWN5KHBvbGljeUxpc3QsIGF4aXNTZXJ2aWNlKTsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGlzUG9saWN5VXBkYXRlZCgpIHsKLQkJaWYgKGdldFBvbGljeVN1YmplY3QoKS5nZXRMYXN0VXBkYXRlZFRpbWUoKS5hZnRlcigKLQkJCQlsYXN0UG9saWN5Q2FsY3VhdGVkVGltZSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCS8vIEF4aXNCaW5kaW5nT3BlcmF0aW9uCi0JCUF4aXNCaW5kaW5nT3BlcmF0aW9uIGF4aXNCaW5kaW5nT3BlcmF0aW9uID0gZ2V0QXhpc0JpbmRpbmdPcGVyYXRpb24oKTsKLQkJaWYgKGF4aXNCaW5kaW5nT3BlcmF0aW9uICE9IG51bGwKLQkJCQkmJiBheGlzQmluZGluZ09wZXJhdGlvbi5nZXRQb2xpY3lTdWJqZWN0KCkuZ2V0TGFzdFVwZGF0ZWRUaW1lKCkKLQkJCQkJCS5hZnRlcihsYXN0UG9saWN5Q2FsY3VhdGVkVGltZSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCS8vIEF4aXNCaW5kaW5nCi0JCUF4aXNCaW5kaW5nIGF4aXNCaW5kaW5nID0gKGF4aXNCaW5kaW5nT3BlcmF0aW9uID09IG51bGwpID8gbnVsbAotCQkJCTogYXhpc0JpbmRpbmdPcGVyYXRpb24uZ2V0QXhpc0JpbmRpbmcoKTsKLQkJaWYgKGF4aXNCaW5kaW5nICE9IG51bGwKLQkJCQkmJiBheGlzQmluZGluZy5nZXRQb2xpY3lTdWJqZWN0KCkuZ2V0TGFzdFVwZGF0ZWRUaW1lKCkuYWZ0ZXIoCi0JCQkJCQlsYXN0UG9saWN5Q2FsY3VhdGVkVGltZSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCS8vIEF4aXNFbmRwb2ludAotCQlBeGlzRW5kcG9pbnQgYXhpc0VuZHBvaW50ID0gKGF4aXNCaW5kaW5nID09IG51bGwpID8gbnVsbCA6IGF4aXNCaW5kaW5nCi0JCQkJLmdldEF4aXNFbmRwb2ludCgpOwotCQlpZiAoYXhpc0VuZHBvaW50ICE9IG51bGwKLQkJCQkmJiBheGlzRW5kcG9pbnQuZ2V0UG9saWN5U3ViamVjdCgpLmdldExhc3RVcGRhdGVkVGltZSgpLmFmdGVyKAotCQkJCQkJbGFzdFBvbGljeUNhbGN1YXRlZFRpbWUpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkvLyBBeGlzTWVzc2FnZQotCQlpZiAoYXhpc01lc3NhZ2UgIT0gbnVsbAotCQkJCSYmIGF4aXNNZXNzYWdlLmdldFBvbGljeVN1YmplY3QoKS5nZXRMYXN0VXBkYXRlZFRpbWUoKS5hZnRlcigKLQkJCQkJCWxhc3RQb2xpY3lDYWxjdWF0ZWRUaW1lKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJLy8gQXhpc09wZXJhdGlvbgotCQlBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb24gPSAoYXhpc01lc3NhZ2UgPT0gbnVsbCkgPyBudWxsCi0JCQkJOiBheGlzTWVzc2FnZS5nZXRBeGlzT3BlcmF0aW9uKCk7Ci0JCWlmIChheGlzT3BlcmF0aW9uICE9IG51bGwKLQkJCQkmJiBheGlzT3BlcmF0aW9uLmdldFBvbGljeVN1YmplY3QoKS5nZXRMYXN0VXBkYXRlZFRpbWUoKS5hZnRlcigKLQkJCQkJCWxhc3RQb2xpY3lDYWxjdWF0ZWRUaW1lKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJLy8gQXhpc1NlcnZpY2UKLQkJQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UgPSAoYXhpc09wZXJhdGlvbiA9PSBudWxsKSA/IG51bGwKLQkJCQk6IGF4aXNPcGVyYXRpb24uZ2V0QXhpc1NlcnZpY2UoKTsKLQkJaWYgKGF4aXNTZXJ2aWNlICE9IG51bGwKLQkJCQkmJiBheGlzU2VydmljZS5nZXRQb2xpY3lTdWJqZWN0KCkuZ2V0TGFzdFVwZGF0ZWRUaW1lKCkuYWZ0ZXIoCi0JCQkJCQlsYXN0UG9saWN5Q2FsY3VhdGVkVGltZSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCS8vIEF4aXNDb25maWd1cmF0aW9uCi0JCUF4aXNDb25maWd1cmF0aW9uIGF4aXNDb25maWd1cmF0aW9uID0gKGF4aXNTZXJ2aWNlID09IG51bGwpID8gbnVsbAotCQkJCTogYXhpc1NlcnZpY2UuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKTsKLQkJaWYgKGF4aXNDb25maWd1cmF0aW9uICE9IG51bGwKLQkJCQkmJiBheGlzQ29uZmlndXJhdGlvbi5nZXRQb2xpY3lTdWJqZWN0KCkuZ2V0TGFzdFVwZGF0ZWRUaW1lKCkKLQkJCQkJCS5hZnRlcihsYXN0UG9saWN5Q2FsY3VhdGVkVGltZSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vQXhpc0JpbmRpbmdPcGVyYXRpb24uamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9BeGlzQmluZGluZ09wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMGFlZDU1Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9BeGlzQmluZGluZ09wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5Qb2xpY3lVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5XU0RMU2VyaWFsaXphdGlvblV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5uZWV0aGkuUG9saWN5OwotaW1wb3J0IG9yZy5hcGFjaGUubmVldGhpLlBvbGljeUNvbXBvbmVudDsKLQotLyoqCi0gKiBBbiBBeGlzQmluZGluZ09wZXJhdGlvbiByZXByZXNlbnRzIGEgV1NETCAmbHQ7YmluZGluZ09wZXJhdGlvbiZndDsKLSAqLwotcHVibGljIGNsYXNzIEF4aXNCaW5kaW5nT3BlcmF0aW9uIGV4dGVuZHMgQXhpc0Rlc2NyaXB0aW9uIHsKLQotCXByaXZhdGUgQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uOwotCi0JcHJpdmF0ZSBRTmFtZSBuYW1lOwotCi0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBBeGlzQmluZGluZ01lc3NhZ2U+IGZhdWx0czsKLQotCXByaXZhdGUgTWFwPFN0cmluZywgT2JqZWN0PiBvcHRpb25zOwotCi0JcHVibGljIEF4aXNCaW5kaW5nT3BlcmF0aW9uKCkgewotCQlvcHRpb25zID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0JCWZhdWx0cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgQXhpc0JpbmRpbmdNZXNzYWdlPigpOwotCX0KLQotCXB1YmxpYyBBcnJheUxpc3Q8QXhpc0JpbmRpbmdNZXNzYWdlPiBnZXRGYXVsdHMoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlMaXN0PEF4aXNCaW5kaW5nTWVzc2FnZT4oZmF1bHRzLnZhbHVlcygpKTsKLQl9Ci0KLQlwdWJsaWMgQXhpc0JpbmRpbmdNZXNzYWdlIGdldEZhdWx0KFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiAoQXhpc0JpbmRpbmdNZXNzYWdlKSBmYXVsdHMuZ2V0KG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZEZhdWx0KEF4aXNCaW5kaW5nTWVzc2FnZSBmYXVsdCkgewotCQl0aGlzLmZhdWx0cy5wdXQoZmF1bHQuZ2V0TmFtZSgpLCBmYXVsdCk7Ci0JfQotCi0JcHVibGljIFFOYW1lIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5hbWUoUU5hbWUgbmFtZSkgewotCQl0aGlzLm5hbWUgPSBuYW1lOwotCX0KLQotCXB1YmxpYyBBeGlzT3BlcmF0aW9uIGdldEF4aXNPcGVyYXRpb24oKSB7Ci0JCXJldHVybiBheGlzT3BlcmF0aW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEF4aXNPcGVyYXRpb24oQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uKSB7Ci0JCXRoaXMuYXhpc09wZXJhdGlvbiA9IGF4aXNPcGVyYXRpb247Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSkgewotCQlvcHRpb25zLnB1dChuYW1lLCB2YWx1ZSk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgbmFtZSkgewotCQlPYmplY3QgcHJvcGVydHkgPSB0aGlzLm9wdGlvbnMuZ2V0KG5hbWUpOwotCi0JCUF4aXNCaW5kaW5nIHBhcmVudDsKLQkJaWYgKHByb3BlcnR5ID09IG51bGwgJiYgKHBhcmVudCA9IGdldEF4aXNCaW5kaW5nKCkpICE9IG51bGwpIHsKLQkJCXByb3BlcnR5ID0gcGFyZW50LmdldFByb3BlcnR5KG5hbWUpOwotCQl9Ci0KLQkJaWYgKHByb3BlcnR5ID09IG51bGwpIHsKLQkJCXByb3BlcnR5ID0gV1NETDIwRGVmYXVsdFZhbHVlSG9sZGVyLmdldERlZmF1bHRWYWx1ZShuYW1lKTsKLQkJfQotCi0JCXJldHVybiBwcm9wZXJ0eTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEtleSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgZW5nYWdlTW9kdWxlKEF4aXNNb2R1bGUgYXhpc01vZHVsZSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiU29ycnkgd2UgZG8gbm90IHN1cHBvcnQgdGhpcyIpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRW5nYWdlZChTdHJpbmcgbW9kdWxlTmFtZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCi0JCQkJImF4aXNNZXNzYWdlLmlzRW5nYWdlZCgpIGlzIG5vdCBzdXBwb3J0ZWQiKTsKLQotCX0KLQotCS8qKgotCSAqIEdlbmVyYXRlcyB0aGUgYmluZGluZ09wZXJhdGlvbiBlbGVtZW50Ci0JICogCi0JICogQHBhcmFtIHdzZGwKLQkgKiAgICAgICAgICAgIFRoZSBXU0RMIG5hbWVzcGFjZQotCSAqIEBwYXJhbSB0bnMKLQkgKiAgICAgICAgICAgIFRoZSB0YXJnZXRuYW1lc3BhY2UKLQkgKiBAcGFyYW0gd3NvYXAKLQkgKiAgICAgICAgICAgIFRoZSBTT0FQIG5hbWVzcGFjZSAoV1NETCAyLjApCi0JICogQHBhcmFtIHdodHRwCi0JICogICAgICAgICAgICBUaGUgSFRUUCBuYW1lc3BhY2UgKFdTREwgMi4wKQotCSAqIEBwYXJhbSB0eXBlCi0JICogICAgICAgICAgICBJbmRpY2F0ZXMgd2hldGhlciB0aGUgYmluZGluZyBpcyBTT0FQIG9yIEhUVFAKLQkgKiBAcGFyYW0gbmFtZXNwYWNlTWFwCi0JICogICAgICAgICAgICB0aGUgc2VydmljZSdzIG5hbWVzcGFjZSBtYXAgKHByZWZpeCAtPiBuYW1lc3BhY2UpCi0JICogQHBhcmFtIHNlcnZpY2VOYW1lCi0JICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgc2VydmljZQotCSAqIEByZXR1cm4gVGhlIGdlbmVyYXRlZCBiaW5kaW5nIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgT01FbGVtZW50IHRvV1NETDIwKE9NTmFtZXNwYWNlIHdzZGwsIE9NTmFtZXNwYWNlIHRucywKLQkJCU9NTmFtZXNwYWNlIHdzb2FwLCBPTU5hbWVzcGFjZSB3aHR0cCwgU3RyaW5nIHR5cGUsCi0JCQlNYXA8U3RyaW5nLCBTdHJpbmc+IG5hbWVzcGFjZU1hcCwgU3RyaW5nIHNlcnZpY2VOYW1lKSB7Ci0JCVN0cmluZyBwcm9wZXJ0eTsKLQkJT01GYWN0b3J5IG9tRmFjdG9yeSA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpOwotCQlPTUVsZW1lbnQgYmluZGluZ09wRWxlbWVudCA9IG9tRmFjdG9yeS5jcmVhdGVPTUVsZW1lbnQoCi0JCQkJV1NETDJDb25zdGFudHMuT1BFUkFUSU9OX0xPQ0FMX05BTUUsIHdzZGwpOwotCQliaW5kaW5nT3BFbGVtZW50LmFkZEF0dHJpYnV0ZShvbUZhY3RvcnkuY3JlYXRlT01BdHRyaWJ1dGUoCi0JCQkJV1NETDJDb25zdGFudHMuQVRUUklCVVRFX1JFRiwgbnVsbCwgdG5zLmdldFByZWZpeCgpICsgIjoiCi0JCQkJCQkrIHRoaXMubmFtZS5nZXRMb2NhbFBhcnQoKSkpOwotCi0JCWlmIChXU0RMMkNvbnN0YW50cy5VUklfV1NETDJfU09BUC5lcXVhbHModHlwZSkKLQkJCQl8fCBDb25zdGFudHMuVVJJX1NPQVAxMV9IVFRQLmVxdWFscyh0eXBlKQotCQkJCXx8IENvbnN0YW50cy5VUklfU09BUDEyX0hUVFAuZXF1YWxzKHR5cGUpKSB7Ci0JCQkvLyBTT0FQIEJpbmRpbmcgc3BlY2lmaWMgcHJvcGVydGllcwotCQkJcHJvcGVydHkgPSAoU3RyaW5nKSB0aGlzLm9wdGlvbnMKLQkJCQkJLmdldChXU0RMMkNvbnN0YW50cy5BVFRSX1dTT0FQX0FDVElPTik7Ci0JCQlpZiAocHJvcGVydHkgIT0gbnVsbCkgewotCQkJCWJpbmRpbmdPcEVsZW1lbnQuYWRkQXR0cmlidXRlKG9tRmFjdG9yeS5jcmVhdGVPTUF0dHJpYnV0ZSgKLQkJCQkJCVdTREwyQ29uc3RhbnRzLkFUVFJJQlVURV9BQ1RJT04sIHdzb2FwLCBwcm9wZXJ0eSkpOwotCQkJfQotCQkJQXJyYXlMaXN0IHNvYXBNb2R1bGVzID0gKEFycmF5TGlzdCkgdGhpcy5vcHRpb25zCi0JCQkJCS5nZXQoV1NETDJDb25zdGFudHMuQVRUUl9XU09BUF9NT0RVTEUpOwotCQkJaWYgKHNvYXBNb2R1bGVzICE9IG51bGwgJiYgc29hcE1vZHVsZXMuc2l6ZSgpID4gMCkgewotCQkJCVdTRExTZXJpYWxpemF0aW9uVXRpbC5hZGRTT0FQTW9kdWxlRWxlbWVudHMob21GYWN0b3J5LAotCQkJCQkJc29hcE1vZHVsZXMsIHdzb2FwLCBiaW5kaW5nT3BFbGVtZW50KTsKLQkJCX0KLQkJCXByb3BlcnR5ID0gKFN0cmluZykgdGhpcy5vcHRpb25zLmdldChXU0RMMkNvbnN0YW50cy5BVFRSX1dTT0FQX01FUCk7Ci0JCQlpZiAocHJvcGVydHkgIT0gbnVsbCkgewotCQkJCWJpbmRpbmdPcEVsZW1lbnQuYWRkQXR0cmlidXRlKG9tRmFjdG9yeS5jcmVhdGVPTUF0dHJpYnV0ZSgKLQkJCQkJCVdTREwyQ29uc3RhbnRzLkFUVFJJQlVURV9NRVAsIHdzb2FwLCBwcm9wZXJ0eSkpOwotCQkJfQotCQl9IGVsc2UgaWYgKFdTREwyQ29uc3RhbnRzLlVSSV9XU0RMMl9IVFRQLmVxdWFscyh0eXBlKSkgewotCi0JCQkvLyBIVFRQIEJpbmRpbmcgc3BlY2lmaWMgcHJvcGVydGllcwotCQkJcHJvcGVydHkgPSAoU3RyaW5nKSB0aGlzLm9wdGlvbnMKLQkJCQkJLmdldChXU0RMMkNvbnN0YW50cy5BVFRSX1dIVFRQX0lOUFVUX1NFUklBTElaQVRJT04pOwotCQkJaWYgKHByb3BlcnR5ICE9IG51bGwpIHsKLQkJCQliaW5kaW5nT3BFbGVtZW50LmFkZEF0dHJpYnV0ZShvbUZhY3RvcnkuY3JlYXRlT01BdHRyaWJ1dGUoCi0JCQkJCQlXU0RMMkNvbnN0YW50cy5BVFRSSUJVVEVfSU5QVVRfU0VSSUFMSVpBVElPTiwgd2h0dHAsCi0JCQkJCQlwcm9wZXJ0eSkpOwotCQkJfQotCQkJcHJvcGVydHkgPSAoU3RyaW5nKSB0aGlzLm9wdGlvbnMKLQkJCQkJLmdldChXU0RMMkNvbnN0YW50cy5BVFRSX1dIVFRQX09VVFBVVF9TRVJJQUxJWkFUSU9OKTsKLQkJCWlmIChwcm9wZXJ0eSAhPSBudWxsKSB7Ci0JCQkJYmluZGluZ09wRWxlbWVudC5hZGRBdHRyaWJ1dGUob21GYWN0b3J5LmNyZWF0ZU9NQXR0cmlidXRlKAotCQkJCQkJV1NETDJDb25zdGFudHMuQVRUUklCVVRFX09VVFBVVF9TRVJJQUxJWkFUSU9OLCB3aHR0cCwKLQkJCQkJCXByb3BlcnR5KSk7Ci0JCQl9Ci0JCQlwcm9wZXJ0eSA9IChTdHJpbmcpIHRoaXMub3B0aW9ucwotCQkJCQkuZ2V0KFdTREwyQ29uc3RhbnRzLkFUVFJfV0hUVFBfRkFVTFRfU0VSSUFMSVpBVElPTik7Ci0JCQlpZiAocHJvcGVydHkgIT0gbnVsbCkgewotCQkJCWJpbmRpbmdPcEVsZW1lbnQuYWRkQXR0cmlidXRlKG9tRmFjdG9yeS5jcmVhdGVPTUF0dHJpYnV0ZSgKLQkJCQkJCVdTREwyQ29uc3RhbnRzLkFUVFJJQlVURV9GQVVMVF9TRVJJQUxJWkFUSU9OLCB3aHR0cCwKLQkJCQkJCXByb3BlcnR5KSk7Ci0JCQl9Ci0JCQlCb29sZWFuIGlnbm9yZVVuY2l0ZWQgPSAoQm9vbGVhbikgdGhpcy5vcHRpb25zCi0JCQkJCS5nZXQoV1NETDJDb25zdGFudHMuQVRUUl9XSFRUUF9JR05PUkVfVU5DSVRFRCk7Ci0JCQlpZiAoaWdub3JlVW5jaXRlZCAhPSBudWxsKSB7Ci0JCQkJYmluZGluZ09wRWxlbWVudC5hZGRBdHRyaWJ1dGUob21GYWN0b3J5LmNyZWF0ZU9NQXR0cmlidXRlKAotCQkJCQkJV1NETDJDb25zdGFudHMuQVRUUklCVVRFX0lHTk9SRV9VTkNJVEVELCB3aHR0cCwKLQkJCQkJCWlnbm9yZVVuY2l0ZWQudG9TdHJpbmcoKSkpOwotCQkJfQotCQkJcHJvcGVydHkgPSAoU3RyaW5nKSB0aGlzLm9wdGlvbnMKLQkJCQkJLmdldChXU0RMMkNvbnN0YW50cy5BVFRSX1dIVFRQX01FVEhPRCk7Ci0JCQlpZiAocHJvcGVydHkgIT0gbnVsbCkgewotCQkJCWJpbmRpbmdPcEVsZW1lbnQuYWRkQXR0cmlidXRlKG9tRmFjdG9yeS5jcmVhdGVPTUF0dHJpYnV0ZSgKLQkJCQkJCVdTREwyQ29uc3RhbnRzLkFUVFJJQlVURV9NRVRIT0QsIHdodHRwLCBwcm9wZXJ0eSkpOwotCQkJfQotCQl9Ci0KLQkJLy8gQ29tbW9uIHByb3BlcnRpZXMKLQkJcHJvcGVydHkgPSAoU3RyaW5nKSB0aGlzLm9wdGlvbnMKLQkJCQkuZ2V0KFdTREwyQ29uc3RhbnRzLkFUVFJfV0hUVFBfTE9DQVRJT04pOwotCQlpZiAocHJvcGVydHkgIT0gbnVsbCkgewotCQkJYmluZGluZ09wRWxlbWVudC5hZGRBdHRyaWJ1dGUob21GYWN0b3J5LmNyZWF0ZU9NQXR0cmlidXRlKAotCQkJCQlXU0RMMkNvbnN0YW50cy5BVFRSSUJVVEVfTE9DQVRJT04sIHdodHRwLCBwcm9wZXJ0eSkpOwotCQl9Ci0JCXByb3BlcnR5ID0gKFN0cmluZykgdGhpcy5vcHRpb25zCi0JCQkJLmdldChXU0RMMkNvbnN0YW50cy5BVFRSX1dIVFRQX0NPTlRFTlRfRU5DT0RJTkcpOwotCQlpZiAocHJvcGVydHkgIT0gbnVsbCkgewotCQkJYmluZGluZ09wRWxlbWVudAotCQkJCQkuYWRkQXR0cmlidXRlKG9tRmFjdG9yeS5jcmVhdGVPTUF0dHJpYnV0ZSgKLQkJCQkJCQlXU0RMMkNvbnN0YW50cy5BVFRSSUJVVEVfQ09OVEVOVF9FTkNPRElORywgd2h0dHAsCi0JCQkJCQkJcHJvcGVydHkpKTsKLQkJfQotCQlwcm9wZXJ0eSA9IChTdHJpbmcpIHRoaXMub3B0aW9ucwotCQkJCS5nZXQoV1NETDJDb25zdGFudHMuQVRUUl9XSFRUUF9RVUVSWV9QQVJBTUVURVJfU0VQQVJBVE9SKTsKLQkJaWYgKHByb3BlcnR5ICE9IG51bGwpIHsKLQkJCWJpbmRpbmdPcEVsZW1lbnQuYWRkQXR0cmlidXRlKG9tRmFjdG9yeS5jcmVhdGVPTUF0dHJpYnV0ZSgKLQkJCQkJV1NETDJDb25zdGFudHMuQVRUUklCVVRFX1FVRVJZX1BBUkFNRVRFUl9TRVBFUkFUT1IsIHdodHRwLAotCQkJCQlwcm9wZXJ0eSkpOwotCQl9Ci0JCQotCQkvLyBBZGQgdGhlIGlucHV0IGVsZW1lbnQKLQkJQXhpc0JpbmRpbmdNZXNzYWdlIGluTWVzc2FnZSA9IChBeGlzQmluZGluZ01lc3NhZ2UpIHRoaXMKLQkJCQkuZ2V0Q2hpbGQoV1NETENvbnN0YW50cy5XU0RMX01FU1NBR0VfRElSRUNUSU9OX0lOKTsKLQkJaWYgKGluTWVzc2FnZSAhPSBudWxsKSB7Ci0JCQliaW5kaW5nT3BFbGVtZW50LmFkZENoaWxkKGluTWVzc2FnZS50b1dTREwyMCh3c2RsLCB0bnMsIHdzb2FwLAotCQkJCQl3aHR0cCwgbmFtZXNwYWNlTWFwKSk7Ci0JCX0KLQotCQkvLyBBZGQgdGhlIG91dHB1dCBlbGVtZW50Ci0JCUF4aXNCaW5kaW5nTWVzc2FnZSBvdXRNZXNzYWdlID0gKEF4aXNCaW5kaW5nTWVzc2FnZSkgdGhpcwotCQkJCS5nZXRDaGlsZChXU0RMQ29uc3RhbnRzLldTRExfTUVTU0FHRV9ESVJFQ1RJT05fT1VUKTsKLQkJaWYgKG91dE1lc3NhZ2UgIT0gbnVsbCkgewotCQkJYmluZGluZ09wRWxlbWVudC5hZGRDaGlsZChvdXRNZXNzYWdlLnRvV1NETDIwKHdzZGwsIHRucywgd3NvYXAsCi0JCQkJCXdodHRwLCBuYW1lc3BhY2VNYXApKTsKLQkJfQotCi0JCS8vIEFkZCBhbnkgZmF1bHQgZWxlbWVudHMKLQkJaWYgKGZhdWx0cyAhPSBudWxsICYmIGZhdWx0cy5zaXplKCkgPiAwKSB7Ci0JCQlDb2xsZWN0aW9uPEF4aXNCaW5kaW5nTWVzc2FnZT4gZmF1bHRWYWx1ZXMgPSBmYXVsdHMudmFsdWVzKCk7Ci0JCQlJdGVyYXRvcjxBeGlzQmluZGluZ01lc3NhZ2U+IGl0ZXJhdG9yID0gZmF1bHRWYWx1ZXMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlBeGlzQmluZGluZ01lc3NhZ2UgZmF1bHRNZXNzYWdlID0gKEF4aXNCaW5kaW5nTWVzc2FnZSkgaXRlcmF0b3IKLQkJCQkJCS5uZXh0KCk7Ci0JCQkJYmluZGluZ09wRWxlbWVudC5hZGRDaGlsZChmYXVsdE1lc3NhZ2UudG9XU0RMMjAod3NkbCwgdG5zLAotCQkJCQkJd3NvYXAsIHdodHRwLCBuYW1lc3BhY2VNYXApKTsKLQkJCX0KLQkJfQotCQlXU0RMU2VyaWFsaXphdGlvblV0aWwuYWRkV1NETERvY3VtZW50YXRpb25FbGVtZW50KHRoaXMsCi0JCQkJYmluZGluZ09wRWxlbWVudCwgb21GYWN0b3J5LCB3c2RsKTsKLQkJV1NETFNlcmlhbGl6YXRpb25VdGlsLmFkZFBvbGljaWVzQXNFeHRlbnNpYmxlRWxlbWVudCh0aGlzLAotCQkJCWJpbmRpbmdPcEVsZW1lbnQpOwotCQlyZXR1cm4gYmluZGluZ09wRWxlbWVudDsKLQl9Ci0KLQlwdWJsaWMgUG9saWN5IGdldEVmZmVjdGl2ZVBvbGljeSgpIHsKLQkJQXJyYXlMaXN0PFBvbGljeUNvbXBvbmVudD4gcG9saWN5TGlzdCA9IG5ldyBBcnJheUxpc3Q8UG9saWN5Q29tcG9uZW50PigpOwotCi0JCVBvbGljeUluY2x1ZGUgcG9saWN5SW5jbHVkZTsKLQotCQkvLyBBeGlzQmluZGluZ09wZXJhdGlvbiBwb2xpY2llcwotCQlwb2xpY3lJbmNsdWRlID0gZ2V0UG9saWN5SW5jbHVkZSgpOwotCQlwb2xpY3lMaXN0LmFkZEFsbChwb2xpY3lJbmNsdWRlLmdldEF0dGFjaGVkUG9saWNpZXMoKSk7Ci0KLQkJLy8gQXhpc0JpbmRpbmcKLQkJQXhpc0JpbmRpbmcgYXhpc0JpbmRpbmcgPSBnZXRBeGlzQmluZGluZygpOwotCQlpZiAoYXhpc0JpbmRpbmcgIT0gbnVsbCkgewotCQkJcG9saWN5TGlzdC5hZGRBbGwoYXhpc0JpbmRpbmcuZ2V0UG9saWN5SW5jbHVkZSgpCi0JCQkJCS5nZXRBdHRhY2hlZFBvbGljaWVzKCkpOwotCQl9Ci0KLQkJLy8gQXhpc0VuZHBvaW50Ci0JCUF4aXNFbmRwb2ludCBheGlzRW5kcG9pbnQgPSBudWxsOwotCQlpZiAoYXhpc0JpbmRpbmcgIT0gbnVsbCkgewotCQkJYXhpc0VuZHBvaW50ID0gYXhpc0JpbmRpbmcuZ2V0QXhpc0VuZHBvaW50KCk7Ci0JCX0KLQotCQlpZiAoYXhpc0VuZHBvaW50ICE9IG51bGwpIHsKLQkJCXBvbGljeUxpc3QuYWRkQWxsKGF4aXNFbmRwb2ludC5nZXRQb2xpY3lJbmNsdWRlKCkKLQkJCQkJLmdldEF0dGFjaGVkUG9saWNpZXMoKSk7Ci0JCX0KLQotCQkvLyBBeGlzT3BlcmF0aW9uCi0JCVBvbGljeSBheGlzT3BlcmF0aW9uUG9saWN5ID0gYXhpc09wZXJhdGlvbi5nZXRQb2xpY3lJbmNsdWRlKCkKLQkJCQkuZ2V0RWZmZWN0aXZlUG9saWN5KCk7Ci0KLQkJaWYgKGF4aXNPcGVyYXRpb25Qb2xpY3kgIT0gbnVsbCkgewotCQkJcG9saWN5TGlzdC5hZGQoYXhpc09wZXJhdGlvblBvbGljeSk7Ci0JCX0KLQotCQlyZXR1cm4gUG9saWN5VXRpbC5nZXRNZXJnZWRQb2xpY3kocG9saWN5TGlzdCwgdGhpcyk7Ci0JfQotCi0JcHVibGljIEF4aXNCaW5kaW5nIGdldEF4aXNCaW5kaW5nKCkgewotCQlyZXR1cm4gKEF4aXNCaW5kaW5nKSBwYXJlbnQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL0F4aXNEZXNjcmlwdGlvbi5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL0F4aXNEZXNjcmlwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWFiNTk4Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9BeGlzRGVzY3JpcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01Ob2RlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01UZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaTE4bi5NZXNzYWdlczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLm1vZHVsZXMuTW9kdWxlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5KYXZhVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLlV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm5lZXRoaS5Bc3NlcnRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5uZWV0aGkuUG9saWN5OwotCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50SGFzaE1hcDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEF4aXNEZXNjcmlwdGlvbiBpbXBsZW1lbnRzIFBhcmFtZXRlckluY2x1ZGUsIERlc2NyaXB0aW9uQ29uc3RhbnRzIHsKLQotICAgIHByb3RlY3RlZCBBeGlzRGVzY3JpcHRpb24gcGFyZW50ID0gbnVsbDsKLQotICAgIHByaXZhdGUgUGFyYW1ldGVySW5jbHVkZSBwYXJhbWV0ZXJJbmNsdWRlOwotCi0gICAgcHJpdmF0ZSBQb2xpY3lJbmNsdWRlIHBvbGljeUluY2x1ZGUgPSBudWxsOwotCi0gICAgcHJpdmF0ZSBQb2xpY3lTdWJqZWN0IHBvbGljeVN1YmplY3QgPSBudWxsOwotCi0gICAgcHJpdmF0ZSBNYXA8T2JqZWN0LCBBeGlzRGVzY3JpcHRpb24+IGNoaWxkcmVuOwotCi0gICAgLyoqCi0gICAgICogTWFwIG9mIG1vZHVsZXMgZW5nYWdlZCBvbiB0aGlzIG9iamVjdC4gVGhlIGtleSBpcyB0aGUgYXJjaGl2ZSBuYW1lIGFzIGRlZmluZWQgYnkKLSAgICAgKiB7QGxpbmsgQXhpc01vZHVsZSNnZXRBcmNoaXZlTmFtZSgpfS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTWFwPFN0cmluZywgQXhpc01vZHVsZT4gZW5nYWdlZE1vZHVsZXM7Ci0KLSAgICAvKiogTGlzdCBvZiBQYXJhbWV0ZXJPYnNlcnZlcnMgd2hvIHdhbnQgdG8gYmUgbm90aWZpZWQgb2YgY2hhbmdlcyAqLwotICAgIHByb3RlY3RlZCBMaXN0PFBhcmFtZXRlck9ic2VydmVyPiBwYXJhbWV0ZXJPYnNlcnZlcnMgPSBudWxsOwotCi0gICAgcHJpdmF0ZSBPTUZhY3Rvcnkgb21GYWN0b3J5ID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCk7Ci0KLSAgICAvLyBIb2xkcyB0aGUgZG9jdW1lbnRhdGlvbiBkZXRhaWxzIGZvciBlYWNoIGVsZW1lbnQKLSAgICBwcml2YXRlIE9NTm9kZSBkb2N1bWVudGF0aW9uOwotCi0gICAgLy8gY3JlYXRpbmcgYSBsb2dnZXIgaW5zdGFuY2UKLSAgICBwcml2YXRlIHN0YXRpYyBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coQXhpc0Rlc2NyaXB0aW9uLmNsYXNzKTsKLQotICAgIHB1YmxpYyBBeGlzRGVzY3JpcHRpb24oKSB7Ci0gICAgICAgIHBhcmFtZXRlckluY2x1ZGUgPSBuZXcgUGFyYW1ldGVySW5jbHVkZUltcGwoKTsKLSAgICAgICAgY2hpbGRyZW4gPSBuZXcgQ29uY3VycmVudEhhc2hNYXA8T2JqZWN0LCBBeGlzRGVzY3JpcHRpb24+KCk7Ci0gICAgICAgIHBvbGljeVN1YmplY3QgPSBuZXcgUG9saWN5U3ViamVjdCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFBhcmFtZXRlck9ic2VydmVyKFBhcmFtZXRlck9ic2VydmVyIG9ic2VydmVyKSB7Ci0gICAgICAgIGlmIChwYXJhbWV0ZXJPYnNlcnZlcnMgPT0gbnVsbCkKLSAgICAgICAgICAgIHBhcmFtZXRlck9ic2VydmVycyA9IG5ldyBBcnJheUxpc3Q8UGFyYW1ldGVyT2JzZXJ2ZXI+KCk7Ci0gICAgICAgIHBhcmFtZXRlck9ic2VydmVycy5hZGQob2JzZXJ2ZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVBhcmFtZXRlck9ic2VydmVyKFBhcmFtZXRlck9ic2VydmVyIG9ic2VydmVyKSB7Ci0gICAgICAgIGlmIChwYXJhbWV0ZXJPYnNlcnZlcnMgIT0gbnVsbCkgewotICAgICAgICAgICAgcGFyYW1ldGVyT2JzZXJ2ZXJzLnJlbW92ZShvYnNlcnZlcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRQYXJhbWV0ZXIoUGFyYW1ldGVyIHBhcmFtKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgaWYgKHBhcmFtID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpc1BhcmFtZXRlckxvY2tlZChwYXJhbS5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KE1lc3NhZ2VzLmdldE1lc3NhZ2UoInBhcmFtdGVybG9ja2VkYnlwYXJlbnQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLmdldE5hbWUoKSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcGFyYW1ldGVySW5jbHVkZS5hZGRQYXJhbWV0ZXIocGFyYW0pOwotCi0gICAgICAgIC8vIFRlbGwgYW55b25lIHdobyB3YW50cyB0byBrbm93Ci0gICAgICAgIGlmIChwYXJhbWV0ZXJPYnNlcnZlcnMgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChPYmplY3QgcGFyYW1ldGVyT2JzZXJ2ZXIgOiBwYXJhbWV0ZXJPYnNlcnZlcnMpIHsKLSAgICAgICAgICAgICAgICBQYXJhbWV0ZXJPYnNlcnZlciBvYnNlcnZlciA9IChQYXJhbWV0ZXJPYnNlcnZlcilwYXJhbWV0ZXJPYnNlcnZlcjsKLSAgICAgICAgICAgICAgICBvYnNlcnZlci5wYXJhbWV0ZXJDaGFuZ2VkKHBhcmFtLmdldE5hbWUoKSwgcGFyYW0uZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRQYXJhbWV0ZXIoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIGFkZFBhcmFtZXRlcihuZXcgUGFyYW1ldGVyKG5hbWUsIHZhbHVlKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlUGFyYW1ldGVyKFBhcmFtZXRlciBwYXJhbSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIHBhcmFtZXRlckluY2x1ZGUucmVtb3ZlUGFyYW1ldGVyKHBhcmFtKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkZXNlcmlhbGl6ZVBhcmFtZXRlcnMoT01FbGVtZW50IHBhcmFtZXRlckVsZW1lbnQpCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLQotICAgICAgICBwYXJhbWV0ZXJJbmNsdWRlLmRlc2VyaWFsaXplUGFyYW1ldGVycyhwYXJhbWV0ZXJFbGVtZW50KTsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIElmIHRoZSBwYXJhbWV0ZXIgaXMgZm91bmQgaW4gdGhlIGN1cnJlbnQgZGVzY3JpcHRpb24gdGhlbiB0aGUgUGFyYW1ldGVyIHdpbGwgYmUgd3JpdGFibGUgZWxzZQotICAgICAqIGl0IHdpbGwgYmUgcmVhZCBvbmx5Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSBuYW1lIG9mIFBhcmFtZXRlciB0byByZXRyaWV2ZQotICAgICAqIEByZXR1cm4gdGhlIFBhcmFtZXRlciwgaWYgZm91bmQgYW55d2hlcmUgaW4gdGhlIHN0YWNrLCBvciBudWxsIGlmIG5vdAotICAgICAqLwotICAgIHB1YmxpYyBQYXJhbWV0ZXIgZ2V0UGFyYW1ldGVyKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIFBhcmFtZXRlciBwYXJhbWV0ZXIgPSBwYXJhbWV0ZXJJbmNsdWRlLmdldFBhcmFtZXRlcihuYW1lKTsKLSAgICAgICAgaWYgKHBhcmFtZXRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwYXJhbWV0ZXIuc2V0RWRpdGFibGUodHJ1ZSk7Ci0gICAgICAgICAgICByZXR1cm4gcGFyYW1ldGVyOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgcGFyYW1ldGVyID0gcGFyZW50LmdldFBhcmFtZXRlcihuYW1lKTsKLSAgICAgICAgICAgIGlmIChwYXJhbWV0ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHBhcmFtZXRlci5zZXRFZGl0YWJsZShmYWxzZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcGFyYW1ldGVyOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0UGFyYW1ldGVyVmFsdWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgUGFyYW1ldGVyIHBhcmFtID0gZ2V0UGFyYW1ldGVyKG5hbWUpOwotICAgICAgICBpZiAocGFyYW0gPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHBhcmFtLmdldFZhbHVlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNQYXJhbWV0ZXJUcnVlKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIFBhcmFtZXRlciBwYXJhbSA9IGdldFBhcmFtZXRlcihuYW1lKTsKLSAgICAgICAgcmV0dXJuIHBhcmFtICE9IG51bGwgJiYgSmF2YVV0aWxzLmlzVHJ1ZShwYXJhbS5nZXRWYWx1ZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXJyYXlMaXN0PFBhcmFtZXRlcj4gZ2V0UGFyYW1ldGVycygpIHsKLSAgICAgICAgcmV0dXJuIHBhcmFtZXRlckluY2x1ZGUuZ2V0UGFyYW1ldGVycygpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzUGFyYW1ldGVyTG9ja2VkKFN0cmluZyBwYXJhbWV0ZXJOYW1lKSB7Ci0KLSAgICAgICAgaWYgKHRoaXMucGFyZW50ICE9IG51bGwgJiYgdGhpcy5wYXJlbnQuaXNQYXJhbWV0ZXJMb2NrZWQocGFyYW1ldGVyTmFtZSkpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgUGFyYW1ldGVyIHBhcmFtZXRlciA9IGdldFBhcmFtZXRlcihwYXJhbWV0ZXJOYW1lKTsKLSAgICAgICAgcmV0dXJuIHBhcmFtZXRlciAhPSBudWxsICYmIHBhcmFtZXRlci5pc0xvY2tlZCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RG9jdW1lbnRhdGlvbigpIHsKLSAgICAgICAgaWYgKGRvY3VtZW50YXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGRvY3VtZW50YXRpb24uZ2V0VHlwZSgpID09IE9NTm9kZS5URVhUX05PREUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKChPTVRleHQpZG9jdW1lbnRhdGlvbikuZ2V0VGV4dCgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBTdHJpbmdXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgICAgICAgICAgICAgIGRvY3VtZW50YXRpb24uYnVpbGQoKTsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBkb2N1bWVudGF0aW9uLnNlcmlhbGl6ZSh3cml0ZXIpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcihlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgd3JpdGVyLmZsdXNoKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHdyaXRlci50b1N0cmluZygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBPTU5vZGUgZ2V0RG9jdW1lbnRhdGlvbk5vZGUoKSB7Ci0gICAgICAgIHJldHVybiBkb2N1bWVudGF0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERvY3VtZW50YXRpb24oT01Ob2RlIGRvY3VtZW50YXRpb24pIHsKLSAgICAgICAgdGhpcy5kb2N1bWVudGF0aW9uID0gZG9jdW1lbnRhdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREb2N1bWVudGF0aW9uKFN0cmluZyBkb2N1bWVudGF0aW9uKSB7Ci0gICAgICAgIGlmICghIiIuZXF1YWxzKGRvY3VtZW50YXRpb24pKSB7Ci0gICAgICAgICAgICB0aGlzLmRvY3VtZW50YXRpb24gPSBvbUZhY3RvcnkuY3JlYXRlT01UZXh0KGRvY3VtZW50YXRpb24pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGFyZW50KEF4aXNEZXNjcmlwdGlvbiBwYXJlbnQpIHsKLSAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIEF4aXNEZXNjcmlwdGlvbiBnZXRQYXJlbnQoKSB7Ci0gICAgICAgIHJldHVybiBwYXJlbnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHBvbGljeUluY2x1ZGUgUG9saWN5SW5jbHVkZSB2YWx1ZQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzRGVzY3JpcHRpb24jc2V0UG9saWN5SW5jbHVkZShQb2xpY3lJbmNsdWRlKQotICAgICAqIEBkZXByZWNhdGVkIEFzIG9mIHJlbGVhc2UgMS40LCBpZiB5b3Ugd2FudCB0byBhY2Nlc3MgdGhlIHBvbGljeSBjYWNoZSBvZiBhIHBhcnRpY3VsYXIKLSAgICAgKiAgICAgICAgICAgICBBeGlzRGVzY3JpcHRpb24gb2JqZWN0IHVzZSB7QGxpbmsgI2dldFBvbGljeVN1YmplY3QoKX0gaW5zdGVhZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQb2xpY3lJbmNsdWRlKFBvbGljeUluY2x1ZGUgcG9saWN5SW5jbHVkZSkgewotICAgICAgICB0aGlzLnBvbGljeUluY2x1ZGUgPSBwb2xpY3lJbmNsdWRlOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgYWN0aXZlIFBvbGljeUluY2x1ZQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzRGVzY3JpcHRpb24jZ2V0UG9saWN5U3ViamVjdCgpCi0gICAgICogQGRlcHJlY2F0ZWQgQXMgb2YgcmVsZWFzZSAxLjQsIHJlcGxhY2VkIGJ5IHtAbGluayAjZ2V0UG9saWN5U3ViamVjdCgpfQotICAgICAqLwotICAgIHB1YmxpYyBQb2xpY3lJbmNsdWRlIGdldFBvbGljeUluY2x1ZGUoKSB7Ci0gICAgICAgIGlmIChwb2xpY3lJbmNsdWRlID09IG51bGwpIHsKLSAgICAgICAgICAgIHBvbGljeUluY2x1ZGUgPSBuZXcgUG9saWN5SW5jbHVkZSh0aGlzKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcG9saWN5SW5jbHVkZTsKLSAgICB9Ci0KLQotICAgIC8vIE5PVEUgLSBUaGVzZSBhcmUgTk9UIHR5cGVzYWZlIQotICAgIHB1YmxpYyB2b2lkIGFkZENoaWxkKEF4aXNEZXNjcmlwdGlvbiBjaGlsZCkgewotICAgICAgICBpZiAoY2hpbGQuZ2V0S2V5KCkgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gRklYTUU6IFNldmVyYWwgY2xhc3NlcyB0aGF0IGV4dGVuZCBBeGlzRGVzY3JpcHRpb24gcGFzcyBudWxsIGluIHRoZWlyIGdldEtleSBtZXRob2QuCi0vLyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlBsZWFzZSBzcGVjaWZ5IGEga2V5IGluIHRoZSBjaGlsZCIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY2hpbGRyZW4ucHV0KGNoaWxkLmdldEtleSgpLCBjaGlsZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIHB1YmxpYyB2b2lkIGFkZENoaWxkKE9iamVjdCBrZXksIEF4aXNEZXNjcmlwdGlvbiBjaGlsZCkgewotICAgICAgICBjaGlsZHJlbi5wdXQoa2V5LCBjaGlsZCk7Ci0gICAgfQotCi0gICAgcHVibGljIEl0ZXJhdG9yPD8gZXh0ZW5kcyBBeGlzRGVzY3JpcHRpb24+IGdldENoaWxkcmVuKCkgewotICAgICAgICByZXR1cm4gY2hpbGRyZW4udmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXhpc0Rlc2NyaXB0aW9uIGdldENoaWxkKE9iamVjdCBrZXkpIHsKLSAgICAgICAgaWYgKGtleSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBGSVhNRTogV2h5IGFyZSBmb2xrcyBzZW5kaW5nIGluIG51bGw/Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKEF4aXNEZXNjcmlwdGlvbiljaGlsZHJlbi5nZXQoa2V5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVDaGlsZChPYmplY3Qga2V5KSB7Ci0gICAgICAgIGNoaWxkcmVuLnJlbW92ZShrZXkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIHNldHMgdGhlIHBvbGljeSBhcyB0aGUgZGVmYXVsdCBvZiB0aGlzIEF4aXNEZXNjcmlwdGlvbiBpbnN0YW5jZS4gRnVydGhlciBtb3JlCi0gICAgICogdGhpcyBtZXRob2QgZG9lcyB0aGUgZm9sbG93aW5ncy4gPHAvPiAoMSkgRW5nYWdlIHdoYXRldmVyIG1vZHVsZXMgbmVjZXNzYXJ5IHRvIGV4ZWN1dGUgbmV3Ci0gICAgICogdGhlIGVmZmVjdGl2ZSBwb2xpY3kgb2YgdGhpcyBBeGlzRGVzY3JpcHRpb24gaW5zdGFuY2UuICgyKSBEaXNlbmdhZ2Ugd2hhdGV2ZXIgbW9kdWxlcyB0aGF0Ci0gICAgICogYXJlIG5vdCBuZWNlc3NhcnkgdG8gZXhlY3V0ZSB0aGUgbmV3IGVmZmVjdGl2ZSBwb2xpY3kgb2YgdGhpcyBBeGlzRGVzY3JpcHRpb24gaW5zdGFuY2UuICgzKQotICAgICAqIENoZWNrIHdoZXRoZXIgZWFjaCBtb2R1bGUgY2FuIGV4ZWN1dGUgdGhlIG5ldyBlZmZlY3RpdmUgcG9saWN5IG9mIHRoaXMgQXhpc0Rlc2NyaXB0aW9uCi0gICAgICogaW5zdGFuY2UuICg0KSBJZiBub3QgdGhyb3cgYW4gQXhpc0ZhdWx0IHRvIG5vdGlmeSB0aGUgdXNlci4gKDUpIEVsc2Ugbm90aWZ5IGVhY2ggbW9kdWxlIGFib3V0Ci0gICAgICogdGhlIG5ldyBlZmZlY3RpdmUgcG9saWN5LgotICAgICAqCi0gICAgICogQHBhcmFtIHBvbGljeSB0aGUgbmV3IHBvbGljeSBvZiB0aGlzIEF4aXNEZXNjcmlwdGlvbiBpbnN0YW5jZS4gVGhlIGVmZmVjdGl2ZSBwb2xpY3kgaXMgdGhlCi0gICAgICogICAgICAgICAgICAgICBtZXJnZSBvZiB0aGlzIGFyZ3VtZW50IHdpdGggZWZmZWN0aXZlIHBvbGljeSBvZiBwYXJlbnQgb2YgdGhpcwotICAgICAqICAgICAgICAgICAgICAgQXhpc0Rlc2NyaXB0aW9uLgotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0IGlmIGFueSBtb2R1bGUgaXMgdW5hYmxlIHRvIGV4ZWN1dGUgdGhlIGVmZmVjdGl2ZSBwb2xpY3kgb2YgdGhpcwotICAgICAqICAgICAgICAgICAgICAgICAgIEF4aXNEZXNjcmlwdGlvbiBpbnN0YW5jZSBzdWNjZXNzZnVsbHkgb3Igbm8gbW9kdWxlIHRvIGV4ZWN1dGUgc29tZSBwb3J0aW9uCi0gICAgICogICAgICAgICAgICAgICAgICAgKG9uZSBvciBtb3JlIFByaW10aXZlQXNzZXJ0aW9ucyApIG9mIHRoYXQgZWZmZWN0aXZlIHBvbGljeS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhcHBseVBvbGljeShQb2xpY3kgcG9saWN5KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgLy8gc2V0cyBBeGlzRGVzY3JpcHRpb24gcG9saWN5Ci0gICAgICAgIGdldFBvbGljeVN1YmplY3QoKS5jbGVhcigpOwotICAgICAgICBnZXRQb2xpY3lTdWJqZWN0KCkuYXR0YWNoUG9saWN5KHBvbGljeSk7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICAgKiBub3cgd2UgdHJ5IHRvIGVuZ2FnZSBhcHByb3ByaWF0ZSBtb2R1bGVzIGJhc2VkIG9uIHRoZSBtZXJnZWQgcG9saWN5Ci0gICAgICAgICAgICogb2YgYXhpcyBkZXNjcmlwdGlvbiBvYmplY3QgYW5kIHRoZSBjb3JyZXNwb25kaW5nIGF4aXMgYmluZGluZwotICAgICAgICAgICAqIGRlc2NyaXB0aW9uIG9iamVjdC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgYXBwbHlQb2xpY3koKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBcHBsaWVzIHRoZSBwb2xpY2llcyBvbiB0aGUgRGVzY3JpcHRpb24gSGllcmFyY2h5IHJlY3Vyc2l2ZWx5LgotICAgICAqCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQgYW4gZXJyb3Igb2NjdXJyZWQgYXBwbHlpbmcgdGhlIHBvbGljeQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFwcGx5UG9saWN5KCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIEF4aXNDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gPSBnZXRBeGlzQ29uZmlndXJhdGlvbigpOwotICAgICAgICBpZiAoY29uZmlndXJhdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBQb2xpY3kgYXBwbGljYWJsZVBvbGljeSA9IGdldEFwcGxpY2FibGVQb2xpY3kodGhpcyk7Ci0gICAgICAgIGlmIChhcHBsaWNhYmxlUG9saWN5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGVuZ2FnZU1vZHVsZXNGb3JQb2xpY3koYXBwbGljYWJsZVBvbGljeSwgY29uZmlndXJhdGlvbik7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKEl0ZXJhdG9yPD8gZXh0ZW5kcyBBeGlzRGVzY3JpcHRpb24+IGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4oKTsgY2hpbGRyZW4uaGFzTmV4dCgpOykgewotICAgICAgICAgICAgQXhpc0Rlc2NyaXB0aW9uIGNoaWxkID0gY2hpbGRyZW4ubmV4dCgpOwotICAgICAgICAgICAgY2hpbGQuYXBwbHlQb2xpY3koKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBjYW5TdXBwb3J0QXNzZXJ0aW9uKEFzc2VydGlvbiBhc3NlcnRpb24sIExpc3Q8QXhpc01vZHVsZT4gbW9kdWxlTGlzdCkgewotCi0gICAgICAgIE1vZHVsZSBtb2R1bGU7Ci0KLSAgICAgICAgZm9yIChBeGlzTW9kdWxlIGF4aXNNb2R1bGUgOiBtb2R1bGVMaXN0KSB7Ci0gICAgICAgICAgICAvLyBGSVhNRSBpcyB0aGlzIHN0ZXAgcmVhbGx5IG5lZWRlZCA/PwotICAgICAgICAgICAgLy8gU2hvdWxkbid0IGF4aXNNb3VkbGUuZ2V0TW9kdWxlIGFsd2F5cyByZXR1cm4gbm90LW51bGwgdmFsdWUgPz8KLSAgICAgICAgICAgIG1vZHVsZSA9IGF4aXNNb2R1bGUuZ2V0TW9kdWxlKCk7Ci0KLSAgICAgICAgICAgIGlmICghKG1vZHVsZSA9PSBudWxsIHx8IG1vZHVsZS5jYW5TdXBwb3J0QXNzZXJ0aW9uKGFzc2VydGlvbikpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKGF4aXNNb2R1bGUuZ2V0TmFtZSgpICsgIiBzYXlzIGl0IGNhbid0IHN1cHBvcnQgIiArIGFzc2VydGlvbi5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBlbmdhZ2VNb2R1bGVzRm9yUG9saWN5KFBvbGljeSBwb2xpY3ksIEF4aXNDb25maWd1cmF0aW9uIGF4aXNDb25maWd1cmF0aW9uKQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIC8qCi0gICAgICAgICAgICogZm9yIHRoZSBtb21lbnQgd2UgY29uc2lkZXIgcG9saWNpZXMgd2l0aCBvbmx5IG9uZSBhbHRlcm5hdGl2ZS4gSWYgdGhlCi0gICAgICAgICAgICogcG9saWN5IGNvbnRhaW5zIG11bHRpcGxlIGFsdGVybmF0aXZlcyBvbmx5IHRoZSBmaXJzdCBhbHRlcm5hdGl2ZSB3aWxsCi0gICAgICAgICAgICogYmUgY29uc2lkZXJlZC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBwb2xpY3kuZ2V0QWx0ZXJuYXRpdmVzKCk7Ci0gICAgICAgIGlmICghaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJQb2xpY3kgZG9lc24ndCBjb250YWluIGFueSBwb2xpY3kgYWx0ZXJuYXRpdmVzIik7Ci0gICAgICAgIH0KLQotICAgICAgICBMaXN0IGFzc2VydGlvbkxpc3QgPSAoTGlzdClpdGVyYXRvci5uZXh0KCk7Ci0KLSAgICAgICAgQXNzZXJ0aW9uIGFzc2VydGlvbjsKLSAgICAgICAgU3RyaW5nIG5hbWVzcGFjZVVSSTsKLQotICAgICAgICBMaXN0IG1vZHVsZUxpc3Q7Ci0KLSAgICAgICAgTGlzdCBuYW1lc3BhY2VMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBMaXN0IG1vZHVsZXNUb0VuZ2FnZSA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgICAgICBmb3IgKE9iamVjdCBhbkFzc2VydGlvbkxpc3QgOiBhc3NlcnRpb25MaXN0KSB7Ci0gICAgICAgICAgICBhc3NlcnRpb24gPSAoQXNzZXJ0aW9uKWFuQXNzZXJ0aW9uTGlzdDsKLSAgICAgICAgICAgIG5hbWVzcGFjZVVSSSA9IGFzc2VydGlvbi5nZXROYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLSAgICAgICAgICAgIG1vZHVsZUxpc3QgPSBheGlzQ29uZmlndXJhdGlvbi5nZXRNb2R1bGVzRm9yUG9saWN5TmFtZXNhcGNlKG5hbWVzcGFjZVVSSSk7Ci0KLSAgICAgICAgICAgIGlmIChtb2R1bGVMaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoImNhbid0IGZpbmQgYW55IG1vZHVsZSB0byBwcm9jZXNzICIgKyBhc3NlcnRpb24uZ2V0TmFtZSgpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIiB0eXBlIGFzc2VydGlvbnMiKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFjYW5TdXBwb3J0QXNzZXJ0aW9uKGFzc2VydGlvbiwgbW9kdWxlTGlzdCkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJhdGxlYXN0IG9uZSBtb2R1bGUgY2FuJ3Qgc3VwcG9ydCAiICsgYXNzZXJ0aW9uLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghbmFtZXNwYWNlTGlzdC5jb250YWlucyhuYW1lc3BhY2VVUkkpKSB7Ci0gICAgICAgICAgICAgICAgbmFtZXNwYWNlTGlzdC5hZGQobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICBtb2R1bGVzVG9FbmdhZ2UuYWRkQWxsKG1vZHVsZUxpc3QpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVuZ2FnZU1vZHVsZXNUb0F4aXNEZXNjcmlwdGlvbihtb2R1bGVzVG9FbmdhZ2UsIHRoaXMpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBlbmdhZ2VNb2R1bGVzVG9BeGlzRGVzY3JpcHRpb24oTGlzdDxBeGlzTW9kdWxlPiBtb2R1bGVMaXN0LCBBeGlzRGVzY3JpcHRpb24gZGVzY3JpcHRpb24pCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLQotICAgICAgICBBeGlzTW9kdWxlIGF4aXNNb2R1bGU7Ci0gICAgICAgIE1vZHVsZSBtb2R1bGU7Ci0KLSAgICAgICAgZm9yIChPYmplY3QgYU1vZHVsZUxpc3QgOiBtb2R1bGVMaXN0KSB7Ci0gICAgICAgICAgICBheGlzTW9kdWxlID0gKEF4aXNNb2R1bGUpYU1vZHVsZUxpc3Q7Ci0gICAgICAgICAgICAvLyBGSVhNRSBpcyB0aGlzIHN0ZXAgcmVhbGx5IG5lZWRlZCA/PwotICAgICAgICAgICAgLy8gU2hvdWxkbid0IGF4aXNNb3VkbGUuZ2V0TW9kdWxlIGFsd2F5cyByZXR1cm4gbm90LW51bGwgdmFsdWUgPz8KLSAgICAgICAgICAgIG1vZHVsZSA9IGF4aXNNb2R1bGUuZ2V0TW9kdWxlKCk7Ci0KLSAgICAgICAgICAgIGlmICghKG1vZHVsZSA9PSBudWxsIHx8IGRlc2NyaXB0aW9uLmlzRW5nYWdlZChheGlzTW9kdWxlLmdldE5hbWUoKSkpKSB7Ci0gICAgICAgICAgICAgICAgLy8gZW5nYWdlcyB0aGUgbW9kdWxlIHRvIEF4aXNEZXNjcmlwdGlvbgotICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uLmVuZ2FnZU1vZHVsZShheGlzTW9kdWxlKTsKLSAgICAgICAgICAgICAgICAvLyBub3RpZmllcyB0aGUgbW9kdWxlIGFib3V0IHRoZSBlbmdhZ2VtZW50Ci0gICAgICAgICAgICAgICAgYXhpc01vZHVsZS5nZXRNb2R1bGUoKS5lbmdhZ2VOb3RpZnkoZGVzY3JpcHRpb24pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIEF4aXNDb25maWd1cmF0aW9uIGdldEF4aXNDb25maWd1cmF0aW9uKCkgewotCi0gICAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgQXhpc0NvbmZpZ3VyYXRpb24pIHsKLSAgICAgICAgICAgIHJldHVybiAoQXhpc0NvbmZpZ3VyYXRpb24pdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh0aGlzLnBhcmVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnQuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBhYnN0cmFjdCBPYmplY3QgZ2V0S2V5KCk7Ci0KLQotICAgIC8qKgotICAgICAqIEVuZ2FnZSBhIE1vZHVsZSBhdCB0aGlzIGxldmVsCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYXhpc01vZHVsZSB0aGUgTW9kdWxlIHRvIGVuZ2FnZQotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0IGlmIHRoZXJlJ3MgYSBwcm9ibGVtIGVuZ2FnaW5nCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZW5nYWdlTW9kdWxlKEF4aXNNb2R1bGUgYXhpc01vZHVsZSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIGVuZ2FnZU1vZHVsZShheGlzTW9kdWxlLCB0aGlzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFbmdhZ2UgYSBNb2R1bGUgYXQgdGhpcyBsZXZlbCwga2VlcGluZyB0cmFjayBvZiB3aGljaCBsZXZlbCB0aGUgZW5nYWdlIHdhcyBvcmlnaW5hbGx5IGNhbGxlZAotICAgICAqIGZyb20uICBUaGlzIGlzIG1lYW50IGZvciBpbnRlcm5hbCB1c2Ugb25seS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBheGlzTW9kdWxlIG1vZHVsZSB0byBlbmdhZ2UKLSAgICAgKiBAcGFyYW0gc291cmNlICAgICB0aGUgQXhpc0Rlc2NyaXB0aW9uIHdoaWNoIG9yaWdpbmFsbHkgY2FsbGVkIGVuZ2FnZU1vZHVsZSgpCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQgaWYgdGhlcmUncyBhIHByb2JsZW0gZW5nYWdpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBlbmdhZ2VNb2R1bGUoQXhpc01vZHVsZSBheGlzTW9kdWxlLCBBeGlzRGVzY3JpcHRpb24gc291cmNlKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgaWYgKGVuZ2FnZWRNb2R1bGVzID09IG51bGwpIGVuZ2FnZWRNb2R1bGVzID0gbmV3IENvbmN1cnJlbnRIYXNoTWFwPFN0cmluZywgQXhpc01vZHVsZT4oKTsKLSAgICAgICAgU3RyaW5nIG1vZHVsZU5hbWUgPSBheGlzTW9kdWxlLmdldE5hbWUoKTsKLSAgICAgICAgZm9yIChPYmplY3QgbyA6IGVuZ2FnZWRNb2R1bGVzLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICBBeGlzTW9kdWxlIHRlbXBBeGlzTW9kdWxlID0gKChBeGlzTW9kdWxlKW8pOwotICAgICAgICAgICAgU3RyaW5nIHRlbXBNb2R1bGVOYW1lID0gdGVtcEF4aXNNb2R1bGUuZ2V0TmFtZSgpOwotCi0gICAgICAgICAgICBpZiAobW9kdWxlTmFtZS5lcXVhbHModGVtcE1vZHVsZU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgVmVyc2lvbiBleGlzdGluZyA9IHRlbXBBeGlzTW9kdWxlLmdldFZlcnNpb24oKTsKLSAgICAgICAgICAgICAgICBpZiAoIVV0aWxzLmNoZWNrVmVyc2lvbihheGlzTW9kdWxlLmdldFZlcnNpb24oKSwgZXhpc3RpbmcpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoTWVzc2FnZXMuZ2V0TWVzc2FnZSgibWlzbWF0Y2hlZE1vZHVsZVZlcnNpb25zIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldENsYXNzKCkuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKGV4aXN0aW5nKSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTGV0IHRoZSBNb2R1bGUga25vdyBpdCdzIGJlaW5nIGVuZ2FnZWQuICBJZiBpdCdzIG5vdCBoYXBweSBhYm91dCBpdCwgaXQgY2FuIHRocm93LgotICAgICAgICBNb2R1bGUgbW9kdWxlID0gYXhpc01vZHVsZS5nZXRNb2R1bGUoKTsKLSAgICAgICAgaWYgKG1vZHVsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtb2R1bGUuZW5nYWdlTm90aWZ5KHRoaXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSWYgd2UgaGF2ZSBhbnl0aGluZyBzcGVjaWZpYyB0byBkbywgbGV0IHRoYXQgaGFwcGVuCi0gICAgICAgIG9uRW5nYWdlKGF4aXNNb2R1bGUsIHNvdXJjZSk7Ci0KLSAgICAgICAgZW5nYWdlZE1vZHVsZXMucHV0KGF4aXNNb2R1bGUuZ2V0QXJjaGl2ZU5hbWUoKSwgYXhpc01vZHVsZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgb25FbmdhZ2UoQXhpc01vZHVsZSBtb2R1bGUsIEF4aXNEZXNjcmlwdGlvbiBlbmdhZ2VyKQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIC8vIERlZmF1bHQgdmVyc2lvbiBkb2VzIG5vdGhpbmcsIGZlZWwgZnJlZSB0byBvdmVycmlkZQotICAgIH0KLQotICAgIHN0YXRpYyBDb2xsZWN0aW9uPEF4aXNNb2R1bGU+IE5VTExfTU9EVUxFUyA9IG5ldyBBcnJheUxpc3Q8QXhpc01vZHVsZT4oMCk7Ci0KLSAgICBwdWJsaWMgQ29sbGVjdGlvbjxBeGlzTW9kdWxlPiBnZXRFbmdhZ2VkTW9kdWxlcygpIHsKLSAgICAgICAgcmV0dXJuIGVuZ2FnZWRNb2R1bGVzID09IG51bGwgPyBOVUxMX01PRFVMRVMgOiBlbmdhZ2VkTW9kdWxlcy52YWx1ZXMoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVjayBpZiBhIGdpdmVuIG1vZHVsZSBpcyBlbmdhZ2VkIGF0IHRoaXMgbGV2ZWwuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbW9kdWxlTmFtZSBtb2R1bGUgdG8gaW52ZXN0aWdhdGUuCi0gICAgICogQHJldHVybiB0cnVlIGlmIGVuZ2FnZWQsIGZhbHNlIGlmIG5vdC4gVE9ETzogSGFuZGxlIHZlcnNpb25zPyBpc0VuZ2FnZWQoImFkZHJlc3NpbmciKSBzaG91bGQKLSAgICAgKiAgICAgICAgIGJlIHRydWUgZXZlbiBmb3IgdmVyc2lvbmVkIG1vZHVsZW5hbWUuLi4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VuZ2FnZWQoU3RyaW5nIG1vZHVsZU5hbWUpIHsKLSAgICAgICAgcmV0dXJuIGVuZ2FnZWRNb2R1bGVzICE9IG51bGwKLSAgICAgICAgICAgICAgICYmIGVuZ2FnZWRNb2R1bGVzLmtleVNldCgpLmNvbnRhaW5zKG1vZHVsZU5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRW5nYWdlZChBeGlzTW9kdWxlIGF4aXNNb2R1bGUpIHsKLSAgICAgICAgU3RyaW5nIGlkID0gYXhpc01vZHVsZS5nZXRBcmNoaXZlTmFtZSgpOwotICAgICAgICByZXR1cm4gZW5nYWdlZE1vZHVsZXMgIT0gbnVsbCAmJiBlbmdhZ2VkTW9kdWxlcy5rZXlTZXQoKS5jb250YWlucyhpZCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGlzZW5nYWdlTW9kdWxlKEF4aXNNb2R1bGUgbW9kdWxlKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgaWYgKG1vZHVsZSA9PSBudWxsIHx8IGVuZ2FnZWRNb2R1bGVzID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIC8vIFN0cmluZyBpZCA9IFV0aWxzLmdldE1vZHVsZU5hbWUobW9kdWxlLmdldE5hbWUoKSwKLSAgICAgICAgLy8gbW9kdWxlLmdldFZlcnNpb24oKSk7Ci0gICAgICAgIGlmIChpc0VuZ2FnZWQobW9kdWxlKSkgewotICAgICAgICAgICAgb25EaXNlbmdhZ2UobW9kdWxlKTsKLSAgICAgICAgICAgIGVuZ2FnZWRNb2R1bGVzLnJlbW92ZShtb2R1bGUuZ2V0QXJjaGl2ZU5hbWUoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBvbkRpc2VuZ2FnZShBeGlzTW9kdWxlIG1vZHVsZSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIC8vIEJhc2UgdmVyc2lvbiBkb2VzIG5vdGhpbmcKLSAgICB9Ci0KLSAgICBwcml2YXRlIFBvbGljeSBnZXRBcHBsaWNhYmxlUG9saWN5KEF4aXNEZXNjcmlwdGlvbiBheGlzRGVzY3JpcHRpb24pIHsKLSAgICAgICAgaWYgKGF4aXNEZXNjcmlwdGlvbiBpbnN0YW5jZW9mIEF4aXNNZXNzYWdlKSB7Ci0gICAgICAgICAgICBBeGlzTWVzc2FnZSBheGlzTWVzc2FnZSA9IChBeGlzTWVzc2FnZSlheGlzRGVzY3JpcHRpb247Ci0gICAgICAgICAgICBBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb24gPSBheGlzTWVzc2FnZS5nZXRBeGlzT3BlcmF0aW9uKCk7Ci0gICAgICAgICAgICBpZiAoYXhpc09wZXJhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UgPSBheGlzT3BlcmF0aW9uLmdldEF4aXNTZXJ2aWNlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGF4aXNTZXJ2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGF4aXNTZXJ2aWNlLmdldEVuZHBvaW50TmFtZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEF4aXNFbmRwb2ludCBheGlzRW5kcG9pbnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzU2VydmljZS5nZXRFbmRwb2ludChheGlzU2VydmljZS5nZXRFbmRwb2ludE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXhpc0VuZHBvaW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBeGlzQmluZGluZyBheGlzQmluZGluZyA9IGF4aXNFbmRwb2ludC5nZXRCaW5kaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQXhpc0JpbmRpbmdPcGVyYXRpb24gYXhpc0JpbmRpbmdPcGVyYXRpb24gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEF4aXNCaW5kaW5nT3BlcmF0aW9uKWF4aXNCaW5kaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDaGlsZChheGlzT3BlcmF0aW9uLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGRpcmVjdGlvbiA9IGF4aXNNZXNzYWdlLmdldERpcmVjdGlvbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF4aXNCaW5kaW5nTWVzc2FnZSBheGlzQmluZGluZ01lc3NhZ2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFdTRExDb25zdGFudHMuV1NETF9NRVNTQUdFX0RJUkVDVElPTl9JTi5lcXVhbHMoZGlyZWN0aW9uKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBXU0RMVXRpbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmlzSW5wdXRQcmVzZW50Rm9yTUVQKGF4aXNPcGVyYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldE1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4oKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpc0JpbmRpbmdNZXNzYWdlID0gKEF4aXNCaW5kaW5nTWVzc2FnZSlheGlzQmluZGluZ09wZXJhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDaGlsZChXU0RMQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfSU5fVkFMVUUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXhpc0JpbmRpbmdNZXNzYWdlLmdldEVmZmVjdGl2ZVBvbGljeSgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChXU0RMQ29uc3RhbnRzLldTRExfTUVTU0FHRV9ESVJFQ1RJT05fT1VUCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKGRpcmVjdGlvbikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIFdTRExVdGlsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaXNPdXRwdXRQcmVzZW50Rm9yTUVQKGF4aXNPcGVyYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldE1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4oKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpc0JpbmRpbmdNZXNzYWdlID0gKEF4aXNCaW5kaW5nTWVzc2FnZSlheGlzQmluZGluZ09wZXJhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDaGlsZChXU0RMQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfT1VUX1ZBTFVFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF4aXNCaW5kaW5nTWVzc2FnZS5nZXRFZmZlY3RpdmVQb2xpY3koKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiAoKEF4aXNNZXNzYWdlKWF4aXNEZXNjcmlwdGlvbikuZ2V0RWZmZWN0aXZlUG9saWN5KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIFBvbGljeVN1YmplY3QgZ2V0UG9saWN5U3ViamVjdCgpIHsKLSAgICAgICAgcmV0dXJuIHBvbGljeVN1YmplY3Q7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vQXhpc0VuZHBvaW50LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vQXhpc0VuZHBvaW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyZDRjM2EuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL0F4aXNFbmRwb2ludC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0NvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuVHJhbnNwb3J0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLlV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5XU0RMU2VyaWFsaXphdGlvblV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLm5ldC5Tb2NrZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotcHVibGljIGNsYXNzIEF4aXNFbmRwb2ludCBleHRlbmRzIEF4aXNEZXNjcmlwdGlvbiB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coQXhpc0VuZHBvaW50LmNsYXNzKTsKLQotICAgIC8vIFRoZSBuYW1lIG9mIHRoZSBlbmRwb2ludAotICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0KLSAgICAvLyBUaGUgYmluZGluZyByZWZmZXJlZCB0byBieSB0aGUgZW5kcG9pbnQKLSAgICBwcml2YXRlIEF4aXNCaW5kaW5nIGJpbmRpbmc7Ci0KLSAgICAvLyBUaGUgYWRkcmVzcyBvZiB0aGUgZW5kcG9pbnQKLSAgICBwcml2YXRlIFN0cmluZyBlbmRwb2ludFVSTDsKLQotICAgIC8vIFRoZSBhbGlhcyB1c2VkIGZvciB0aGUgZW5kcG9pbnQKLSAgICBwcml2YXRlIFN0cmluZyBhbGlhczsKLQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgT2JqZWN0PiBvcHRpb25zOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgdHJhbnNwb3J0SW5EZXNjTmFtZTsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RW5kcG9pbnRVUkwoKSB7Ci0vLyAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZjZSA9IChBeGlzU2VydmljZSkgdGhpcy5nZXRQYXJlbnQoKTsKLS8vICAgICAgICBpZiAoKGF4aXNTZXJ2Y2UhPSBudWxsICYmIGF4aXNTZXJ2Y2UuaXNNb2RpZnlVc2VyV1NETFBvcnRBZGRyZXNzKCkpIHx8IGVuZHBvaW50VVJMID09IG51bGwpIHsKLSAgICAgICAgaWYgKGVuZHBvaW50VVJMID09IG51bGwpIHsKLSAgICAgICAgICAgIGVuZHBvaW50VVJMID0gY2FsY3VsYXRlRW5kcG9pbnRVUkwoKTsKLSAgICAgICAgfQotCQlyZXR1cm4gZW5kcG9pbnRVUkw7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RW5kcG9pbnRVUkwoU3RyaW5nIGVuZHBvaW50VVJMKSB7Ci0gICAgICAgIHRoaXMuZW5kcG9pbnRVUkwgPSBlbmRwb2ludFVSTDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXhpc0VuZHBvaW50KCkgewotICAgICAgICBvcHRpb25zID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSkgewotICAgICAgICBvcHRpb25zLnB1dChuYW1lLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIG5hbWUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gc2VhcmNoIGZvcgotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSwgb3IgbnVsbCBpZiB0aGUgcHJvcGVydHkgaXMgbm90IGZvdW5kCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgbmFtZSkgewotICAgICAgICBPYmplY3Qgb2JqID0gb3B0aW9ucy5nZXQobmFtZSk7Ci0gICAgICAgIGlmIChvYmogIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG9iajsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWxpYXMoKSB7Ci0gICAgICAgIHJldHVybiBhbGlhczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRBbGlhcyhTdHJpbmcgYWxpYXMpIHsKLSAgICAgICAgdGhpcy5hbGlhcyA9IGFsaWFzOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBBeGlzQmluZGluZyBnZXRCaW5kaW5nKCkgewotICAgICAgICByZXR1cm4gYmluZGluZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRCaW5kaW5nKEF4aXNCaW5kaW5nIGJpbmRpbmcpIHsKLSAgICAgICAgdGhpcy5iaW5kaW5nID0gYmluZGluZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldEtleSgpIHsKLSAgICAgICAgLy8gVG9ETwotICAgICAgICByZXR1cm4gbnVsbDsgLy8gVG8gY2hhbmdlIGJvZHkgb2YgaW1wbGVtZW50ZWQgbWV0aG9kcyB1c2UgRmlsZSB8Ci0gICAgICAgIC8vIFNldHRpbmdzIHwgRmlsZSBUZW1wbGF0ZXMuCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZW5nYWdlTW9kdWxlKEF4aXNNb2R1bGUgYXhpc01vZHVsZSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIC8vIFRPRE8gLSBXZSB0b3RhbGx5IHNob3VsZCBzdXBwb3J0IHRoaXMuICBFbmRwb2ludCBQb2xpY3kgU3ViamVjdCwgYW55b25lPwotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlNvcnJ5IHdlIGRvIG5vdCBzdXBwb3J0IHRoaXMiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VuZ2FnZWQoU3RyaW5nIG1vZHVsZU5hbWUpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJheGlzTWVzc2FnZS5pc0VuZ2FnZWQoKSBpcyBub3Qgc3VwcG9ydGVkIik7Ci0gICAgfQotCi0gICAgcHVibGljIE9NRWxlbWVudCB0b1dTREwyMChPTU5hbWVzcGFjZSB3c2RsLCBPTU5hbWVzcGFjZSB0bnMsIE9NTmFtZXNwYWNlIHdodHRwKSB7Ci0gICAgICAgIFN0cmluZyBwcm9wZXJ0eTsKLSAgICAgICAgT01GYWN0b3J5IG9tRmFjdG9yeSA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpOwotICAgICAgICBPTUVsZW1lbnQgZW5kcG9pbnRFbGVtZW50ID0KLSAgICAgICAgICAgICAgICBvbUZhY3RvcnkuY3JlYXRlT01FbGVtZW50KFdTREwyQ29uc3RhbnRzLkVORFBPSU5UX0xPQ0FMX05BTUUsIHdzZGwpOwotICAgICAgICBlbmRwb2ludEVsZW1lbnQuYWRkQXR0cmlidXRlKAotICAgICAgICAgICAgICAgIG9tRmFjdG9yeS5jcmVhdGVPTUF0dHJpYnV0ZShXU0RMMkNvbnN0YW50cy5BVFRSSUJVVEVfTkFNRSwgbnVsbCwgbmFtZSkpOwotICAgICAgICBlbmRwb2ludEVsZW1lbnQuYWRkQXR0cmlidXRlKG9tRmFjdG9yeS5jcmVhdGVPTUF0dHJpYnV0ZShXU0RMMkNvbnN0YW50cy5CSU5ESU5HX0xPQ0FMX05BTUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIHRucy5nZXRQcmVmaXgoKSArICI6IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEJpbmRpbmcoKS5nZXROYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0TG9jYWxQYXJ0KCkpKTsKLSAgICAgICAgZW5kcG9pbnRFbGVtZW50LmFkZEF0dHJpYnV0ZShvbUZhY3RvcnkuY3JlYXRlT01BdHRyaWJ1dGUoV1NETDJDb25zdGFudHMuQVRUUklCVVRFX0FERFJFU1MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIGdldEVuZHBvaW50VVJMKCkpKTsKLSAgICAgICAgT2JqZWN0IGF1dGhlbnRpY2F0aW9uU2NoZW1lID0KLSAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuZ2V0KFdTREwyQ29uc3RhbnRzLkFUVFJfV0hUVFBfQVVUSEVOVElDQVRJT05fVFlQRSk7Ci0gICAgICAgIGlmIChhdXRoZW50aWNhdGlvblNjaGVtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBlbmRwb2ludEVsZW1lbnQuYWRkQXR0cmlidXRlKG9tRmFjdG9yeS5jcmVhdGVPTUF0dHJpYnV0ZSgKLSAgICAgICAgICAgICAgICAgICAgV1NETDJDb25zdGFudHMuQVRUUklCVVRFX0FVVEhFTlRJQ0FUSU9OX1RZUEUsIHdodHRwLAotICAgICAgICAgICAgICAgICAgICBhdXRoZW50aWNhdGlvblNjaGVtZS50b1N0cmluZygpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcHJvcGVydHkgPSAoU3RyaW5nKW9wdGlvbnMuZ2V0KFdTREwyQ29uc3RhbnRzLkFUVFJfV0hUVFBfQVVUSEVOVElDQVRJT05fUkVBTE0pOwotICAgICAgICBpZiAocHJvcGVydHkgIT0gbnVsbCkgewotICAgICAgICAgICAgZW5kcG9pbnRFbGVtZW50LmFkZEF0dHJpYnV0ZShvbUZhY3RvcnkuY3JlYXRlT01BdHRyaWJ1dGUoCi0gICAgICAgICAgICAgICAgICAgIFdTREwyQ29uc3RhbnRzLkFUVFJJQlVURV9BVVRIRU5USUNBVElPTl9SRUFMTSwgd2h0dHAsIHByb3BlcnR5KSk7Ci0gICAgICAgIH0KLSAgICAgICAgV1NETFNlcmlhbGl6YXRpb25VdGlsLmFkZFdTRExEb2N1bWVudGF0aW9uRWxlbWVudCh0aGlzLCBlbmRwb2ludEVsZW1lbnQsIG9tRmFjdG9yeSwgd3NkbCk7Ci0gICAgICAgIFdTRExTZXJpYWxpemF0aW9uVXRpbC5hZGRQb2xpY2llc0FzRXh0ZW5zaWJsZUVsZW1lbnQodGhpcywgZW5kcG9pbnRFbGVtZW50KTsKLSAgICAgICAgcmV0dXJuIGVuZHBvaW50RWxlbWVudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXhpc1NlcnZpY2UgZ2V0QXhpc1NlcnZpY2UoKSB7Ci0gICAgICAgIHJldHVybiAoQXhpc1NlcnZpY2UpcGFyZW50OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBhcmVudChBeGlzU2VydmljZSBzZXJ2aWNlKSB7Ci0gICAgICAgIHBhcmVudCA9IHNlcnZpY2U7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VHJhbnNwb3J0SW5EZXNjcmlwdGlvbihTdHJpbmcgdHJhbnNwb3J0SW5EZXNjTmFtZSkgewotICAgICAgICB0aGlzLnRyYW5zcG9ydEluRGVzY05hbWUgPSB0cmFuc3BvcnRJbkRlc2NOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgY2FsY3VsYXRlRW5kcG9pbnRVUkwoKSB7Ci0gICAgICAgIHJldHVybiBjYWxjdWxhdGVFbmRwb2ludFVSTChudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGNhbGN1bGF0ZUVuZHBvaW50VVJMKFN0cmluZyBob3N0SVApIHsKLSAgICAgICAgaWYgKHRyYW5zcG9ydEluRGVzY05hbWUgIT0gbnVsbCAmJiBwYXJlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZ3VyYXRpb24gPSBnZXRBeGlzQ29uZmlndXJhdGlvbigpOwotICAgICAgICAgICAgaWYgKGF4aXNDb25maWd1cmF0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2VydmljZU5hbWUgPSAoKEF4aXNTZXJ2aWNlKXBhcmVudCkuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgICAgICBUcmFuc3BvcnRJbkRlc2NyaXB0aW9uIGluID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzQ29uZmlndXJhdGlvbi5nZXRUcmFuc3BvcnRJbih0cmFuc3BvcnRJbkRlc2NOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgVHJhbnNwb3J0TGlzdGVuZXIgbGlzdGVuZXIgPSBpbi5nZXRSZWNlaXZlcigpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaXA7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGhvc3RJUCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpcCA9IGhvc3RJUDsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlwID0gVXRpbHMuZ2V0SXBBZGRyZXNzKGF4aXNDb25maWd1cmF0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8vIHdlIHNob3VsZCBwYXNzIFtzZXJ2aWNlTmFtZV0uW2VuZHBvaW50TmFtZV0gaW5zdGVhZCBvZgotICAgICAgICAgICAgICAgICAgICAvLyBbZW5kcG9pbnROYW1lXQotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc0RPVGUgPSBzZXJ2aWNlTmFtZSArICIuIiArIG5hbWU7Ci0gICAgICAgICAgICAgICAgICAgIEVuZHBvaW50UmVmZXJlbmNlW10gZXByc0ZvclNlcnZpY2UgPSBsaXN0ZW5lci5nZXRFUFJzRm9yU2VydmljZShzRE9UZSwgaXApOwotICAgICAgICAgICAgICAgICAgICAvLyB3ZSBjb25zaWRlciBvbmx5IHRoZSBmaXJzdCBhZGRyZXNzIHJldHVybiBieSB0aGUgbGlzdGVuZXIKLSAgICAgICAgICAgICAgICAgICAgaWYgKGVwcnNGb3JTZXJ2aWNlICE9IG51bGwgJiYgZXByc0ZvclNlcnZpY2UubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwcnNGb3JTZXJ2aWNlWzBdLmdldEFkZHJlc3MoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNvY2tldEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgZSkgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybihlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNBY3RpdmUoKSB7Ci0gICAgICAgIGlmICh0cmFuc3BvcnRJbkRlc2NOYW1lICE9IG51bGwgJiYgcGFyZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIEF4aXNDb25maWd1cmF0aW9uIGF4aXNDb25maWd1cmF0aW9uID0gZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKTsKLSAgICAgICAgICAgIGlmIChheGlzQ29uZmlndXJhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSA9IChBeGlzU2VydmljZSlwYXJlbnQ7Ci0gICAgICAgICAgICAgICAgaWYgKHNlcnZpY2UuaXNFbmFibGVBbGxUcmFuc3BvcnRzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF4aXNDb25maWd1cmF0aW9uLmdldFRyYW5zcG9ydHNJbigpLmNvbnRhaW5zS2V5KHRyYW5zcG9ydEluRGVzY05hbWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlLmdldEV4cG9zZWRUcmFuc3BvcnRzKCkuY29udGFpbnModHJhbnNwb3J0SW5EZXNjTmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vQXhpc01lc3NhZ2UuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9BeGlzTWVzc2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTNkMzIzLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9BeGlzTWVzc2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uamF2YTJ3c2RsLkphdmEyV1NETENvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5IYW5kbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucGhhc2VyZXNvbHZlci5QaGFzZVJlc29sdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5Qb2xpY3lVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5TT0FQSGVhZGVyTWVzc2FnZTsKLWltcG9ydCBvcmcuYXBhY2hlLm5lZXRoaS5Qb2xpY3k7Ci1pbXBvcnQgb3JnLmFwYWNoZS5uZWV0aGkuUG9saWN5Q29tcG9uZW50OwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hOwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYUltcG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYUluY2x1ZGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFPYmplY3RDb2xsZWN0aW9uOwotCi0KLS8qKgotICogVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBtZXNzYWdlcyBpbiBXU0RMLiBUaGVyZSBjYW4gYmUgbWVzc2FnZSBlbGVtZW50IGluIHNlcnZpY2VzLnhtbAotICogd2hpY2ggYXJlIHJlcHJlc2VudGVkIGJ5IHRoaXMgY2xhc3MuCi0gKi8KLXB1YmxpYyBjbGFzcyBBeGlzTWVzc2FnZSBleHRlbmRzIEF4aXNEZXNjcmlwdGlvbiB7Ci0KLSAgICBwcml2YXRlIEFycmF5TGlzdDxIYW5kbGVyPiBoYW5kbGVyQ2hhaW47Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLSAgICBwcml2YXRlIEFycmF5TGlzdCBzb2FwSGVhZGVyczsKLQotICAgIC8vdG8ga2VlcCBkYXRhIGluIFdTREwgbWVzc2FnZSByZWZlcmVuY2UgYW5kIHRvIGtlZXAgdGhlIEphdmEyV1NETCBkYXRhCi0gICAgLy8gc3VjaCBhcyBTY2hlbWFFbGVtZW50TmFtZSAsIGRpcmVjdGlvbiBldGMuCi0gICAgcHJpdmF0ZSBRTmFtZSBlbGVtZW50UW5hbWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgZGlyZWN0aW9uOwotICAgIHByaXZhdGUgU3RyaW5nIG1lc3NhZ2VQYXJ0TmFtZTsKLQotICAgIC8vIFRvIHN0b3JlIGRlcGxveS10aW1lIG1vZHVsZSByZWZzCi0gICAgcHJpdmF0ZSBBcnJheUxpc3Q8U3RyaW5nPiBtb2R1bGVyZWZzOwotICAgIHByaXZhdGUgU3RyaW5nIHBhcnROYW1lID0gSmF2YTJXU0RMQ29uc3RhbnRzLlBBUkFNRVRFUlM7Ci0KLSAgICAvLyBwcml2YXRlIFBvbGljeUluY2x1ZGUgcG9saWN5SW5jbHVkZTsKLQotICAgIC8vVG8gY2hjZWsgd2hldGhlciB0aGUgbWVzc2FnZSBpcyB3cmFwcGVkIG9yIHVud3JhcHBlZAotICAgIHByaXZhdGUgYm9vbGVhbiB3cmFwcGVkID0gdHJ1ZTsKLSAgICAKLSAgICBwcml2YXRlIFBvbGljeSBlZmZlY3RpdmVQb2xpY3kgPSBudWxsOwotICAgIHByaXZhdGUgRGF0ZSBsYXN0UG9saWN5Q2FsY3VhdGVkVGltZSA9IG51bGw7Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlUGFydE5hbWUoKSB7Ci0JCXJldHVybiBtZXNzYWdlUGFydE5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TWVzc2FnZVBhcnROYW1lKFN0cmluZyBtZXNzYWdlUGFydE5hbWUpIHsKLQkJdGhpcy5tZXNzYWdlUGFydE5hbWUgPSBtZXNzYWdlUGFydE5hbWU7Ci0JfQotCi0JcHVibGljIEF4aXNNZXNzYWdlKCkgewotICAgICAgICBzb2FwSGVhZGVycyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgaGFuZGxlckNoYWluID0gbmV3IEFycmF5TGlzdDxIYW5kbGVyPigpOwotICAgICAgICBtb2R1bGVyZWZzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgfQotCi0gICAgcHVibGljIEFycmF5TGlzdDxIYW5kbGVyPiBnZXRNZXNzYWdlRmxvdygpIHsKLSAgICAgICAgcmV0dXJuIGhhbmRsZXJDaGFpbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1BhcmFtZXRlckxvY2tlZChTdHJpbmcgcGFyYW1ldGVyTmFtZSkgewotCi0gICAgICAgIC8vIGNoZWNraW5nIHRoZSBsb2NrZWQgdmFsdWUgb2YgcGFyZW50Ci0gICAgICAgIGJvb2xlYW4gbG9ja2VkID0gZmFsc2U7Ci0KLSAgICAgICAgaWYgKGdldFBhcmVudCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIGxvY2tlZCA9IGdldFBhcmVudCgpLmlzUGFyYW1ldGVyTG9ja2VkKHBhcmFtZXRlck5hbWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGxvY2tlZCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBQYXJhbWV0ZXIgcGFyYW1ldGVyID0gZ2V0UGFyYW1ldGVyKHBhcmFtZXRlck5hbWUpOwotCi0gICAgICAgICAgICByZXR1cm4gKHBhcmFtZXRlciAhPSBudWxsKSAmJiBwYXJhbWV0ZXIuaXNMb2NrZWQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2VGbG93KEFycmF5TGlzdDxIYW5kbGVyPiBvcGVyYXRpb25GbG93KSB7Ci0gICAgICAgIHRoaXMuaGFuZGxlckNoYWluID0gb3BlcmF0aW9uRmxvdzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldERpcmVjdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIGRpcmVjdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREaXJlY3Rpb24oU3RyaW5nIGRpcmVjdGlvbikgewotICAgICAgICB0aGlzLmRpcmVjdGlvbiA9IGRpcmVjdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUU5hbWUgZ2V0RWxlbWVudFFOYW1lKCkgewotICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50UW5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RWxlbWVudFFOYW1lKFFOYW1lIGVsZW1lbnQpIHsKLSAgICAgICAgdGhpcy5lbGVtZW50UW5hbWUgPSBlbGVtZW50OwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0S2V5KCkgewotICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50UW5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFhtbFNjaGVtYUVsZW1lbnQgZ2V0U2NoZW1hRWxlbWVudCgpIHsKLSAgICAgICAgWG1sU2NoZW1hRWxlbWVudCB4bWxTY2hlbWFFbGVtZW50ID0gbnVsbDsKLSAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSA9IGdldEF4aXNPcGVyYXRpb24oKS5nZXRBeGlzU2VydmljZSgpOwotICAgICAgICBBcnJheUxpc3Qgc2NoZW1hcyA9IHNlcnZpY2UuZ2V0U2NoZW1hKCk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3Igc2NoZW1hSXRlciA9IHNjaGVtYXMuaXRlcmF0b3IoKTsgc2NoZW1hSXRlci5oYXNOZXh0KCk7KXsKLSAgICAgICAgICAgIHhtbFNjaGVtYUVsZW1lbnQgPSBnZXRTY2hlbWFFbGVtZW50KChYbWxTY2hlbWEpIHNjaGVtYUl0ZXIubmV4dCgpKTsKLSAgICAgICAgICAgIGlmICh4bWxTY2hlbWFFbGVtZW50ICE9IG51bGwpewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB4bWxTY2hlbWFFbGVtZW50OwotICAgIH0KLQotICAgIHByaXZhdGUgWG1sU2NoZW1hRWxlbWVudCBnZXRTY2hlbWFFbGVtZW50KFhtbFNjaGVtYSBzY2hlbWEpIHsKLSAgICAgICAgWG1sU2NoZW1hRWxlbWVudCB4bWxTY2hlbWFFbGVtZW50ID0gbnVsbDsKLSAgICAgICAgaWYgKHNjaGVtYSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB4bWxTY2hlbWFFbGVtZW50ID0gc2NoZW1hLmdldEVsZW1lbnRCeU5hbWUodGhpcy5lbGVtZW50UW5hbWUpOwotICAgICAgICAgICAgaWYgKHhtbFNjaGVtYUVsZW1lbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIHRyeSB0byBmaW5kIGluIGFuIGltcG9ydCBvciBhbiBpbmNsdWRlCi0gICAgICAgICAgICAgICAgWG1sU2NoZW1hT2JqZWN0Q29sbGVjdGlvbiBpbmNsdWRlcyA9IHNjaGVtYS5nZXRJbmNsdWRlcygpOwotICAgICAgICAgICAgICAgIGlmIChpbmNsdWRlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGluY2x1ZGVzSXRlciA9IGluY2x1ZGVzLmdldEl0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgIE9iamVjdCBvYmplY3Q7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlIChpbmNsdWRlc0l0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvYmplY3QgPSBpbmNsdWRlc0l0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFhtbFNjaGVtYUltcG9ydCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhtbFNjaGVtYSBzY2hlbWExID0gKChYbWxTY2hlbWFJbXBvcnQpIG9iamVjdCkuZ2V0U2NoZW1hKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sU2NoZW1hRWxlbWVudCA9IGdldFNjaGVtYUVsZW1lbnQoc2NoZW1hMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgWG1sU2NoZW1hSW5jbHVkZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhtbFNjaGVtYSBzY2hlbWExID0gKChYbWxTY2hlbWFJbmNsdWRlKSBvYmplY3QpLmdldFNjaGVtYSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFNjaGVtYUVsZW1lbnQgPSBnZXRTY2hlbWFFbGVtZW50KHNjaGVtYTEpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHhtbFNjaGVtYUVsZW1lbnQgIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHhtbFNjaGVtYUVsZW1lbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyB3aWxsIHJldHVybiBhIGxpc3Qgb2YgV1NETEV4dGVuc2liaWxpdHlBdHRyaWJ1dGUKLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdCBnZXRFeHRlbnNpYmlsaXR5QXR0cmlidXRlcygpIHsKLSAgICAgICAgLy8gVE9ETyA6IERlZXBhbCBpbXBsZW1lbnQgdGhpcyBwcm9wZXJseS4KLQotICAgICAgICAvLyB0aGUgbGlzdCBzaG91bGQgY29udGFpbiBsaXN0IG9mIFdTRExFeHRlbnNpYmlsaXR5QXR0cmlidXRlCi0gICAgICAgIHJldHVybiBuZXcgQXJyYXlMaXN0KDApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFNvYXBIZWFkZXIoU09BUEhlYWRlck1lc3NhZ2Ugc29hcEhlYWRlck1lc3NhZ2UpIHsKLSAgICAgICAgc29hcEhlYWRlcnMuYWRkKHNvYXBIZWFkZXJNZXNzYWdlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXJyYXlMaXN0IGdldFNvYXBIZWFkZXJzCi0gICAgICAgICAgICAoKSB7Ci0gICAgICAgIHJldHVybiBzb2FwSGVhZGVyczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXZSBkbyBub3Qgc3VwcG9ydCBhZGRpbmcgbW9kdWxlIG9wZXJhdGlvbnMgd2hlbiBlbmdhZ2luZyBhIG1vZHVsZSB0byBhbiBBeGlzTWVzc2FnZQotICAgICAqIAotICAgICAqIEBwYXJhbSBheGlzTW9kdWxlIEF4aXNNb2R1bGUgdG8gZW5nYWdlCi0gICAgICogQHBhcmFtIGVuZ2FnZXIKLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdCBzb21ldGhpbmcgd2VudCB3cm9uZwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG9uRW5nYWdlKEF4aXNNb2R1bGUgYXhpc01vZHVsZSwgQXhpc0Rlc2NyaXB0aW9uIGVuZ2FnZXIpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBQaGFzZVJlc29sdmVyIHBoYXNlUmVzb2x2ZXIgPSBuZXcgUGhhc2VSZXNvbHZlcihnZXRBeGlzQ29uZmlndXJhdGlvbigpKTsKLSAgICAgICAgcGhhc2VSZXNvbHZlci5lbmdhZ2VNb2R1bGVUb01lc3NhZ2UodGhpcywgYXhpc01vZHVsZSk7Ci0gICAgfQotCi0gICAgcHVibGljIEFycmF5TGlzdDxTdHJpbmc+IGdldE1vZHVsZXJlZnMoKSB7Ci0gICAgICAgIHJldHVybiBtb2R1bGVyZWZzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZE1vZHVsZVJlZnMoU3RyaW5nIG1vZHVsZU5hbWUpIHsKLSAgICAgICAgbW9kdWxlcmVmcy5hZGQobW9kdWxlTmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIEF4aXNPcGVyYXRpb24gZ2V0QXhpc09wZXJhdGlvbigpewotICAgICAgICByZXR1cm4gKEF4aXNPcGVyYXRpb24pcGFyZW50OwotICAgIH0KLQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQYXJ0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHBhcnROYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBhcnROYW1lKFN0cmluZyBwYXJ0TmFtZSkgewotICAgICAgICB0aGlzLnBhcnROYW1lID0gcGFydE5hbWU7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1dyYXBwZWQoKSB7Ci0gICAgICAgIHJldHVybiB3cmFwcGVkOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFdyYXBwZWQoYm9vbGVhbiB3cmFwcGVkKSB7Ci0gICAgICAgIHRoaXMud3JhcHBlZCA9IHdyYXBwZWQ7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBQb2xpY3kgZ2V0RWZmZWN0aXZlUG9saWN5KCkgewotCQlpZiAobGFzdFBvbGljeUNhbGN1YXRlZFRpbWUgPT0gbnVsbCB8fCBpc1BvbGljeVVwZGF0ZWQoKSkgewotCQkJZWZmZWN0aXZlUG9saWN5ID0gY2FsY3VsYXRlRWZmZWN0aXZlUG9saWN5KCk7Ci0JCX0KLQkJcmV0dXJuIGVmZmVjdGl2ZVBvbGljeTsKLQl9Ci0KLQlwdWJsaWMgUG9saWN5IGNhbGN1bGF0ZUVmZmVjdGl2ZVBvbGljeSgpIHsKLQkJUG9saWN5U3ViamVjdCBwb2xpY3lTdWJqZWN0ID0gbnVsbDsKLQkJQXJyYXlMaXN0PFBvbGljeUNvbXBvbmVudD4gcG9saWN5TGlzdCA9IG5ldyBBcnJheUxpc3Q8UG9saWN5Q29tcG9uZW50PigpOwotCi0JCS8vIEF4aXNNZXNzYWdlCi0JCXBvbGljeVN1YmplY3QgPSBnZXRQb2xpY3lTdWJqZWN0KCk7Ci0JCXBvbGljeUxpc3QuYWRkQWxsKHBvbGljeVN1YmplY3QuZ2V0QXR0YWNoZWRQb2xpY3lDb21wb25lbnRzKCkpOwotCi0JCS8vIEF4aXNPcGVyYXRpb24KLQkJQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uID0gZ2V0QXhpc09wZXJhdGlvbigpOwotCQlpZiAoYXhpc09wZXJhdGlvbiAhPSBudWxsKSB7Ci0JCQlwb2xpY3lMaXN0LmFkZEFsbChheGlzT3BlcmF0aW9uLmdldFBvbGljeVN1YmplY3QoKQotCQkJCQkuZ2V0QXR0YWNoZWRQb2xpY3lDb21wb25lbnRzKCkpOwotCQl9Ci0KLQkJLy8gQXhpc1NlcnZpY2UKLQkJQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UgPSAoYXhpc09wZXJhdGlvbiA9PSBudWxsKSA/IG51bGwKLQkJCQk6IGF4aXNPcGVyYXRpb24uZ2V0QXhpc1NlcnZpY2UoKTsKLQkJaWYgKGF4aXNTZXJ2aWNlICE9IG51bGwpIHsKLQkJCXBvbGljeUxpc3QuYWRkQWxsKGF4aXNTZXJ2aWNlLmdldFBvbGljeVN1YmplY3QoKQotCQkJCQkuZ2V0QXR0YWNoZWRQb2xpY3lDb21wb25lbnRzKCkpOwotCQl9Ci0KLQkJLy8gQXhpc0NvbmZpZ3VyYXRpb24KLQkJQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZ3VyYXRpb24gPSAoYXhpc1NlcnZpY2UgPT0gbnVsbCkgPyBudWxsCi0JCQkJOiBheGlzU2VydmljZS5nZXRBeGlzQ29uZmlndXJhdGlvbigpOwotCQlpZiAoYXhpc0NvbmZpZ3VyYXRpb24gIT0gbnVsbCkgewotCQkJcG9saWN5TGlzdC5hZGRBbGwoYXhpc0NvbmZpZ3VyYXRpb24uZ2V0UG9saWN5U3ViamVjdCgpCi0JCQkJCS5nZXRBdHRhY2hlZFBvbGljeUNvbXBvbmVudHMoKSk7Ci0JCX0KLQotCQlQb2xpY3kgcmVzdWx0ID0gUG9saWN5VXRpbC5nZXRNZXJnZWRQb2xpY3kocG9saWN5TGlzdCwgYXhpc1NlcnZpY2UpOwotCQlsYXN0UG9saWN5Q2FsY3VhdGVkVGltZSA9IG5ldyBEYXRlKCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNQb2xpY3lVcGRhdGVkKCkgewotCQkvLyBBeGlzTWVzc2FnZQotCQlpZiAoZ2V0UG9saWN5U3ViamVjdCgpLmdldExhc3RVcGRhdGVkVGltZSgpLmFmdGVyKAotCQkJCWxhc3RQb2xpY3lDYWxjdWF0ZWRUaW1lKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJLy8gQXhpc09wZXJhdGlvbgotCQlBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb24gPSAoQXhpc09wZXJhdGlvbikgcGFyZW50OwotCQlpZiAoYXhpc09wZXJhdGlvbiAhPSBudWxsCi0JCQkJJiYgYXhpc09wZXJhdGlvbi5nZXRQb2xpY3lTdWJqZWN0KCkuZ2V0TGFzdFVwZGF0ZWRUaW1lKCkuYWZ0ZXIoCi0JCQkJCQlsYXN0UG9saWN5Q2FsY3VhdGVkVGltZSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCS8vIEF4aXNTZXJ2aWNlCi0JCUF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlID0gKGF4aXNPcGVyYXRpb24gPT0gbnVsbCkgPyBudWxsCi0JCQkJOiBheGlzT3BlcmF0aW9uLmdldEF4aXNTZXJ2aWNlKCk7Ci0JCWlmIChheGlzU2VydmljZSAhPSBudWxsCi0JCQkJJiYgYXhpc1NlcnZpY2UuZ2V0UG9saWN5U3ViamVjdCgpLmdldExhc3RVcGRhdGVkVGltZSgpLmFmdGVyKAotCQkJCQkJbGFzdFBvbGljeUNhbGN1YXRlZFRpbWUpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkvLyBBeGlzQ29uZmlndXJhdGlvbgotCQlBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlndXJhdGlvbiA9IChheGlzU2VydmljZSA9PSBudWxsKSA/IG51bGwKLQkJCQk6IGF4aXNTZXJ2aWNlLmdldEF4aXNDb25maWd1cmF0aW9uKCk7Ci0JCWlmIChheGlzQ29uZmlndXJhdGlvbiAhPSBudWxsCi0JCQkJJiYgYXhpc0NvbmZpZ3VyYXRpb24uZ2V0UG9saWN5U3ViamVjdCgpLmdldExhc3RVcGRhdGVkVGltZSgpCi0JCQkJCQkuYWZ0ZXIobGFzdFBvbGljeUNhbGN1YXRlZFRpbWUpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL0F4aXNNb2R1bGUuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9BeGlzTW9kdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzYThmMGUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL0F4aXNNb2R1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaTE4bi5NZXNzYWdlczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLm1vZHVsZXMuTW9kdWxlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5VdGlsczsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudGV4dC5QYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi0vKioKLSAqIDxwPlRoaXMgaG9sZHMgdGhlIGluZm9ybWF0aW9uIGFib3V0IGEgTW9kdWxlLiA8L3A+Ci0gKiA8b2w+Ci0gKiA8bGk+cGFyYW1ldGVyczxsaT4KLSAqIDxsaT5oYW5kbGVyczxsaT4KLSAqIDxvbD4KLSAqIDxwPkhhbmRsZXIgYXJlIHJlZ2lzdGVyZWQgb25jZSB0aGV5IGFyZSBhdmFpbGFibGUuIFRoZXkgYXJlIGF2YWlsYWJsZSB0byBhbGwgc2VydmljZXMgaWYgYXhpczIueG1sCi0gKiBoYXMgYSBtb2R1bGUgcmVmPSIuIiBvciBhdmFpbGFibGUgdG8gYSBzaW5nbGUgc2VydmljZSBpZiBzZXJ2aWNlcy54bWwgaGF2ZSBtb2R1bGUgcmVmPSIuLiI8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBBeGlzTW9kdWxlIGltcGxlbWVudHMgUGFyYW1ldGVySW5jbHVkZSB7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBmbG93SW5jbHVkZQotICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgRmxvd0luY2x1ZGUgZmxvd0luY2x1ZGUgPSBuZXcgRmxvd0luY2x1ZGUoKTsKLQotICAgIC8qKgotICAgICAqIEZpZWxkIHBhcmFtZXRlcnMKLSAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIFBhcmFtZXRlckluY2x1ZGUgcGFyYW1ldGVycyA9IG5ldyBQYXJhbWV0ZXJJbmNsdWRlSW1wbCgpOwotICAgIHByaXZhdGUgTW9kdWxlIG1vZHVsZTsKLSAgICBwcml2YXRlIENsYXNzTG9hZGVyIG1vZHVsZUNsYXNzTG9hZGVyOwotICAgIC8vIFRvIGtlZXAgdGhlIEZpbGUgdGhhdCBtb2R1bGUgY2FtZSBmcm9tCi0gICAgcHJpdmF0ZSBVUkwgZmlsZU5hbWU7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBuYW1lCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQotICAgIC8vVGhpcyBpcyB0byBrZWVwIHRoZSB2ZXJzaW9uIG51bWJlciBvZiB0aGUgbW9kdWxlLCBpZiB0aGUgbW9kdWxlIG5hbWUgaXMgYS1iLWMtMS4zLm1hciAsCi0gICAgLy8gdGhlbiB0aGUgbW9kdWxlIHZlcnNpb24gd291bGQgYmUgMS4zCi0gICAgcHJpdmF0ZSBWZXJzaW9uIHZlcnNpb247Ci0KLSAgICAvLyB0byBzdG9yZSBtb2R1bGUgb3BlcmF0aW9ucyAsIHdoaWNoIGFyZSBzdXBwb3NlIHRvIGJlIGFkZGVkIHRvIGEgc2VydmljZSBpZiBpdCBpcyBlbmdhZ2VkIHRvIGEgc2VydmljZQotICAgIHByaXZhdGUgSGFzaE1hcDxRTmFtZSwgQXhpc09wZXJhdGlvbj4gb3BlcmF0aW9ucyA9IG5ldyBIYXNoTWFwPFFOYW1lLCBBeGlzT3BlcmF0aW9uPigpOwotICAgIHByaXZhdGUgQXhpc0NvbmZpZ3VyYXRpb24gcGFyZW50OwotCi0gICAgLyoKLSAgICAqIHRvIHN0b3JlIHBvbGljaWVzIHdoaWNoIGFyZSB2YWxpZCBmb3IgYW55IHNlcnZpY2UgZm9yIHdoaWNoIHRoZSBtb2R1bGUgaXMgZW5nYWdlZAotICAgICovCi0gICAgcHJpdmF0ZSBQb2xpY3lJbmNsdWRlIHBvbGljeUluY2x1ZGUgPSBudWxsOwotCi0gICAgLy8gU21hbGwgZGVzY3JpcHRpb24gYWJvdXQgdGhlIG1vZHVsZQotICAgIHByaXZhdGUgU3RyaW5nIG1vZHVsZURlc2NyaXB0aW9uOwotCi0gICAgcHJpdmF0ZSBTdHJpbmdbXSBzdXBwb3J0ZWRQb2xpY3lOYW1lczsKLQotICAgIHByaXZhdGUgUU5hbWVbXSBsb2NhbFBvbGljeUFzc2VydGlvbnM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSU0lPTl9TTkFQU0hPVCA9ICJTTkFQU0hPVCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9EVUxFX1NFUlZJQ0UgPSAibW9kdWxlU2VydmljZSI7Ci0KLSAgICBwcml2YXRlIFBvbGljeVN1YmplY3QgcG9saWN5U3ViamVjdCA9IG5ldyBQb2xpY3lTdWJqZWN0KCk7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBNb2R1bGVEZXNjcmlwdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgQXhpc01vZHVsZSgpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBNb2R1bGVEZXNjcmlwdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIDogTmFtZSBvZiB0aGUgbW9kdWxlCi0gICAgICovCi0gICAgcHVibGljIEF4aXNNb2R1bGUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIG5hbWUgb2YgdGhpcyBtb2R1bGUuCi0gICAgICogTm90ZSB0aGF0IGl0IGlzIHBvc3NpYmxlIHRvIGRlcGxveSBzZXZlcmFsIHZlcnNpb25zIG9mIHRoZSBzYW1lIG1vZHVsZS4gVGhlcmVmb3JlLAotICAgICAqIHRoZSBuYW1lIG9mIGEgbW9kdWxlIGlzIG5vdCB1bmlxdWUgaW4gdGhlIHNjb3BlIG9mIGEgZ2l2ZW4ge0BsaW5rIEF4aXNDb25maWd1cmF0aW9ufS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBtb2R1bGUKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgbmFtZSBvZiB0aGlzIG1vZHVsZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgbW9kdWxlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgYXJjaGl2ZSBuYW1lIG9mIHRoaXMgbW9kdWxlLiBUaGUgYXJjaGl2ZSBuYW1lIGlzIHRoZSBjb21iaW5hdGlvbgotICAgICAqIG9mIHRoZSBtb2R1bGUgbmFtZSBhbmQgdmVyc2lvbiAoaWYgYXZhaWxhYmxlKS4gSW4gZ2VuZXJhbCBpdCBpcyBlcXVhbCB0byB0aGUKLSAgICAgKiBuYW1lIG9mIHRoZSBtb2R1bGUgYXJjaGl2ZSBmaWxlIHdpdGhvdXQgdGhlIHN1ZmZpeC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBhcmNoaXZlIG5hbWUgb2YgdGhlIG1vZHVsZQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXJjaGl2ZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiB2ZXJzaW9uID09IG51bGwgPyBuYW1lIDogKG5hbWUgKyAiLSIgKyB2ZXJzaW9uKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGFyY2hpdmUgbmFtZSBvZiB0aGlzIG1vZHVsZS4gVGhpcyBtZXRob2Qgd2lsbCBzcGxpdCB0aGUgYXJjaGl2ZSBuYW1lCi0gICAgICogdG8gZXh0cmFjdCB0aGUgbW9kdWxlIG5hbWUgYW5kIHZlcnNpb24gKHdoaWNoIGNhbiBiZSByZXRyaWV2ZWQgdXNpbmcKLSAgICAgKiB7QGxpbmsgI2dldE5hbWUoKX0gYW5kIHtAbGluayAjZ2V0VmVyc2lvbigpfSkuCi0gICAgICogCi0gICAgICogQHBhcmFtIGFyY2hpdmVOYW1lIHRoZSBhcmNoaXZlIG5hbWUgb2YgdGhlIG1vZHVsZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEFyY2hpdmVOYW1lKFN0cmluZyBhcmNoaXZlTmFtZSkgewotICAgICAgICBpbnQgaW5kZXggPSAwOwotICAgICAgICAvLyBGaXJzdCBsb29rIGZvciBhIHBhcnQgdGhhdCBzdGFydHMgd2l0aCBhIGRpZ2l0Ci0gICAgICAgIHdoaWxlICgoaW5kZXggPSBhcmNoaXZlTmFtZS5pbmRleE9mKCctJywgaW5kZXgpKSAhPSAtMSkgewotICAgICAgICAgICAgY2hhciBjID0gYXJjaGl2ZU5hbWUuY2hhckF0KCsraW5kZXgpOwotICAgICAgICAgICAgaWYgKCcwJyA8PSBjICYmIGMgPD0gJzknKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gQWxzbyBzdXBwb3J0IFNOQVBTSE9UCi0gICAgICAgIGlmIChpbmRleCA9PSAtMSAmJiBhcmNoaXZlTmFtZS5lbmRzV2l0aCgiLVNOQVBTSE9UIikpIHsKLSAgICAgICAgICAgIGluZGV4ID0gYXJjaGl2ZU5hbWUubGVuZ3RoKCktODsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKGluZGV4ID09IC0xKSB7Ci0gICAgICAgICAgICBuYW1lID0gYXJjaGl2ZU5hbWU7Ci0gICAgICAgICAgICB2ZXJzaW9uID0gbnVsbDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgdmVyc2lvbiA9IG5ldyBWZXJzaW9uKGFyY2hpdmVOYW1lLnN1YnN0cmluZyhpbmRleCkpOwotICAgICAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICB2ZXJzaW9uID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh2ZXJzaW9uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBuYW1lID0gYXJjaGl2ZU5hbWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG5hbWUgPSBhcmNoaXZlTmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgtMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHZlcnNpb24gb2YgdGhpcyBtb2R1bGUuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdmVyc2lvbiBvZiB0aGUgbW9kdWxlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgbW9kdWxlIGRvZXNuJ3QgaGF2ZSBhCi0gICAgICogICAgICAgICB2ZXJzaW9uIG51bWJlcgotICAgICAqLwotICAgIHB1YmxpYyBWZXJzaW9uIGdldFZlcnNpb24oKSB7Ci0gICAgICAgIHJldHVybiB2ZXJzaW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgdmVyc2lvbiBvZiB0aGlzIG1vZHVsZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdmVyc2lvbiB0aGUgdmVyc2lvbiBvZiB0aGUgbW9kdWxlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmVyc2lvbihWZXJzaW9uIHZlcnNpb24pIHsKLSAgICAgICAgdGhpcy52ZXJzaW9uID0gdmVyc2lvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRPcGVyYXRpb24oQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uKSB7Ci0gICAgICAgIG9wZXJhdGlvbnMucHV0KGF4aXNPcGVyYXRpb24uZ2V0TmFtZSgpLCBheGlzT3BlcmF0aW9uKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gcGFyYW0gOiBQYXJhbWV0ZXIgdG8gYmUgYWRkZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRQYXJhbWV0ZXIoUGFyYW1ldGVyIHBhcmFtKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgaWYgKGlzUGFyYW1ldGVyTG9ja2VkKHBhcmFtLmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoTWVzc2FnZXMuZ2V0TWVzc2FnZSgicGFyYW10ZXJsb2NrZWRieXBhcmVudCIsIHBhcmFtLmdldE5hbWUoKSkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcGFyYW1ldGVycy5hZGRQYXJhbWV0ZXIocGFyYW0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlUGFyYW1ldGVyKFBhcmFtZXRlciBwYXJhbSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIGlmIChpc1BhcmFtZXRlckxvY2tlZChwYXJhbS5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KE1lc3NhZ2VzLmdldE1lc3NhZ2UoInBhcmFtdGVybG9ja2VkYnlwYXJlbnQiLCBwYXJhbS5nZXROYW1lKCkpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHBhcmFtZXRlcnMucmVtb3ZlUGFyYW1ldGVyKHBhcmFtKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRlc2VyaWFsaXplUGFyYW1ldGVycyhPTUVsZW1lbnQgcGFyYW1ldGVyRWxlbWVudCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIHRoaXMucGFyYW1ldGVycy5kZXNlcmlhbGl6ZVBhcmFtZXRlcnMocGFyYW1ldGVyRWxlbWVudCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBSZXR1cm5zIEZsb3cuCi0gICAgICovCi0gICAgcHVibGljIEZsb3cgZ2V0RmF1bHRJbkZsb3coKSB7Ci0gICAgICAgIHJldHVybiBmbG93SW5jbHVkZS5nZXRGYXVsdEluRmxvdygpOwotICAgIH0KLQotICAgIHB1YmxpYyBGbG93IGdldEZhdWx0T3V0RmxvdygpIHsKLSAgICAgICAgcmV0dXJuIGZsb3dJbmNsdWRlLmdldEZhdWx0T3V0RmxvdygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gUmV0dXJucyBGbG93LgotICAgICAqLwotICAgIHB1YmxpYyBGbG93IGdldEluRmxvdygpIHsKLSAgICAgICAgcmV0dXJuIGZsb3dJbmNsdWRlLmdldEluRmxvdygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gUmV0dXJucyBNb2R1bGUuCi0gICAgICovCi0gICAgcHVibGljIE1vZHVsZSBnZXRNb2R1bGUoKSB7Ci0gICAgICAgIHJldHVybiBtb2R1bGU7Ci0gICAgfQotCi0gICAgcHVibGljIENsYXNzTG9hZGVyIGdldE1vZHVsZUNsYXNzTG9hZGVyKCkgewotICAgICAgICByZXR1cm4gbW9kdWxlQ2xhc3NMb2FkZXI7Ci0gICAgfQotCi0gICAgcHVibGljIEhhc2hNYXA8UU5hbWUsIEF4aXNPcGVyYXRpb24+IGdldE9wZXJhdGlvbnMoKSB7Ci0gICAgICAgIHJldHVybiBvcGVyYXRpb25zOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gUmV0dXJucyBGbG93LgotICAgICAqLwotICAgIHB1YmxpYyBGbG93IGdldE91dEZsb3coKSB7Ci0gICAgICAgIHJldHVybiBmbG93SW5jbHVkZS5nZXRPdXRGbG93KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBSZXR1cm5zIFBhcmFtZXRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgUGFyYW1ldGVyIGdldFBhcmFtZXRlcihTdHJpbmcgbmFtZSkgewotICAgICAgICByZXR1cm4gcGFyYW1ldGVycy5nZXRQYXJhbWV0ZXIobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIEFycmF5TGlzdDxQYXJhbWV0ZXI+IGdldFBhcmFtZXRlcnMoKSB7Ci0gICAgICAgIHJldHVybiBwYXJhbWV0ZXJzLmdldFBhcmFtZXRlcnMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXhpc0NvbmZpZ3VyYXRpb24gZ2V0UGFyZW50KCkgewotICAgICAgICByZXR1cm4gcGFyZW50OwotICAgIH0KLQotICAgIC8vIHRvIGNoZWNrIHdoZXRoZXIgYSBnaXZlbiBwYXJhbWV0ZXIgaXMgbG9ja2VkCi0gICAgcHVibGljIGJvb2xlYW4gaXNQYXJhbWV0ZXJMb2NrZWQoU3RyaW5nIHBhcmFtZXRlck5hbWUpIHsKLQotICAgICAgICAvLyBjaGVja2luZyB0aGUgbG9ja2VkIHZhbHVlIG9mIHBhcmVudAotICAgICAgICBib29sZWFuIGxvc2NrZWQgPSBmYWxzZTsKLQotICAgICAgICBpZiAodGhpcy5wYXJlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgbG9zY2tlZCA9IHRoaXMucGFyZW50LmlzUGFyYW1ldGVyTG9ja2VkKHBhcmFtZXRlck5hbWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGxvc2NrZWQpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgUGFyYW1ldGVyIHBhcmFtZXRlciA9IGdldFBhcmFtZXRlcihwYXJhbWV0ZXJOYW1lKTsKLQotICAgICAgICAgICAgcmV0dXJuIChwYXJhbWV0ZXIgIT0gbnVsbCkgJiYgcGFyYW1ldGVyLmlzTG9ja2VkKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gZmF1bHRGbG93IDogQXJyeWFsaXN0IG9mIGhhbmRsZXJEZXNjcmlwdGlvbnMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRGYXVsdEluRmxvdyhGbG93IGZhdWx0RmxvdykgewotICAgICAgICBmbG93SW5jbHVkZS5zZXRGYXVsdEluRmxvdyhmYXVsdEZsb3cpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBmYXVsdEZsb3cgOiBBcnJ5YWxpc3Qgb2YgSGFuZGxlckRlc2NyaXB0aW9ucwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEZhdWx0T3V0RmxvdyhGbG93IGZhdWx0RmxvdykgewotICAgICAgICBmbG93SW5jbHVkZS5zZXRGYXVsdE91dEZsb3coZmF1bHRGbG93KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRJbkZsb3coRmxvdyBpbkZsb3cpIHsKLSAgICAgICAgZmxvd0luY2x1ZGUuc2V0SW5GbG93KGluRmxvdyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIG1vZHVsZSA6IEF4aXNNb2R1bGUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRNb2R1bGUoTW9kdWxlIG1vZHVsZSkgewotICAgICAgICB0aGlzLm1vZHVsZSA9IG1vZHVsZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRNb2R1bGVDbGFzc0xvYWRlcihDbGFzc0xvYWRlciBtb2R1bGVDbGFzc0xvYWRlcikgewotICAgICAgICB0aGlzLm1vZHVsZUNsYXNzTG9hZGVyID0gbW9kdWxlQ2xhc3NMb2FkZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0T3V0RmxvdyhGbG93IG91dEZsb3cpIHsKLSAgICAgICAgZmxvd0luY2x1ZGUuc2V0T3V0RmxvdyhvdXRGbG93KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJlbnQoQXhpc0NvbmZpZ3VyYXRpb24gcGFyZW50KSB7Ci0gICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBvbGljeUluY2x1ZGUoUG9saWN5SW5jbHVkZSBwb2xpY3lJbmNsdWRlKSB7Ci0gICAgICAgIHRoaXMucG9saWN5SW5jbHVkZSA9IHBvbGljeUluY2x1ZGU7Ci0gICAgfQotCi0gICAgcHVibGljIFBvbGljeUluY2x1ZGUgZ2V0UG9saWN5SW5jbHVkZSgpIHsKLSAgICAgICAgaWYgKHBvbGljeUluY2x1ZGUgPT0gbnVsbCkgewotICAgICAgICAgICAgcG9saWN5SW5jbHVkZSA9IG5ldyBQb2xpY3lJbmNsdWRlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHBvbGljeUluY2x1ZGU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBQb2xpY3lTdWJqZWN0IGdldFBvbGljeVN1YmplY3QoKSB7Ci0gICAgCXJldHVybiBwb2xpY3lTdWJqZWN0OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TW9kdWxlRGVzY3JpcHRpb24oKSB7Ci0gICAgICAgIHJldHVybiBtb2R1bGVEZXNjcmlwdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRNb2R1bGVEZXNjcmlwdGlvbihTdHJpbmcgbW9kdWxlRGVzY3JpcHRpb24pIHsKLSAgICAgICAgdGhpcy5tb2R1bGVEZXNjcmlwdGlvbiA9IG1vZHVsZURlc2NyaXB0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRTdXBwb3J0ZWRQb2xpY3lOYW1lc3BhY2VzKCkgewotICAgICAgICByZXR1cm4gc3VwcG9ydGVkUG9saWN5TmFtZXM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U3VwcG9ydGVkUG9saWN5TmFtZXNwYWNlcyhTdHJpbmdbXSBzdXBwb3J0ZWRQb2xpY3lOYW1lc3BhY2VzKSB7Ci0gICAgICAgIHRoaXMuc3VwcG9ydGVkUG9saWN5TmFtZXMgPSBzdXBwb3J0ZWRQb2xpY3lOYW1lc3BhY2VzOwotICAgIH0KLQotICAgIHB1YmxpYyBRTmFtZVtdIGdldExvY2FsUG9saWN5QXNzZXJ0aW9ucygpIHsKLSAgICAgICAgcmV0dXJuIGxvY2FsUG9saWN5QXNzZXJ0aW9uczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRMb2NhbFBvbGljeUFzc2VydGlvbnMoUU5hbWVbXSBsb2NhbFBvbGljeUFzc2VydGlvbnMpIHsKLSAgICAgICAgdGhpcy5sb2NhbFBvbGljeUFzc2VydGlvbnMgPSBsb2NhbFBvbGljeUFzc2VydGlvbnM7Ci0gICAgfQotCi0gICAgcHVibGljIFVSTCBnZXRGaWxlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGZpbGVOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEZpbGVOYW1lKFVSTCBmaWxlTmFtZSkgewotICAgICAgICB0aGlzLmZpbGVOYW1lID0gZmlsZU5hbWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL0F4aXNPcGVyYXRpb24uamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9BeGlzT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlNjk2NjIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL0F4aXNPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5VVUlER2VuZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50Lk9wZXJhdGlvbkNsaWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5PcHRpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk9wZXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LlNlcnZpY2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNFcnJvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5NZXNzYWdlUmVjZWl2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pMThuLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucGhhc2VyZXNvbHZlci5QaGFzZVJlc29sdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQXhpc09wZXJhdGlvbiBleHRlbmRzIEF4aXNEZXNjcmlwdGlvbgotICAgICAgICBpbXBsZW1lbnRzIFdTRExDb25zdGFudHMgewotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RZTEVfUlBDID0gInJwYyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RZTEVfTVNHID0gIm1zZyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RZTEVfRE9DID0gImRvYyI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coQXhpc09wZXJhdGlvbi5jbGFzcyk7Ci0gICAgLyoqIG1lc3NhZ2UgZXhjaGFuZ2UgcGF0dGVybiAqLwotICAgIHByaXZhdGUgaW50IG1lcCA9IFdTRExDb25zdGFudHMuTUVQX0NPTlNUQU5UX0lOVkFMSUQ7Ci0KLSAgICAvLyB0byBoaWRlIGNvbnRyb2wgb3BlcmF0aW9uICwgb3BlcmF0aW9uIHdoaWNoIGFkZGVkIGJ5IFJNIGxpa2UgbW9kdWxlCi0gICAgcHJpdmF0ZSBib29sZWFuIGNvbnRyb2xPcGVyYXRpb24gPSBmYWxzZTsKLSAgICBwcml2YXRlIFN0cmluZyBzdHlsZSA9IFNUWUxFX0RPQzsKLQotICAgIC8vIHRvIHN0b3JlIG1lcFVSTAotICAgIHByb3RlY3RlZCBTdHJpbmcgbWVwVVJJOwotCi0gICAgcHJpdmF0ZSBNZXNzYWdlUmVjZWl2ZXIgbWVzc2FnZVJlY2VpdmVyOwotCi0gICAgcHJpdmF0ZSBIYXNoTWFwPFN0cmluZywgTW9kdWxlQ29uZmlndXJhdGlvbj4gbW9kdWxlQ29uZmlnbWFwOwotCi0gICAgLy8gVG8gc3RvcmUgZGVwbG95LXRpbWUgbW9kdWxlIHJlZnMKLSAgICBwcml2YXRlIEFycmF5TGlzdDxTdHJpbmc+IG1vZHVsZXJlZnM7Ci0KLSAgICBwcml2YXRlIEFycmF5TGlzdDxBeGlzTWVzc2FnZT4gZmF1bHRNZXNzYWdlczsKLQotICAgIHByaXZhdGUgUU5hbWUgbmFtZTsKLQotICAgIHByaXZhdGUgQXJyYXlMaXN0PFN0cmluZz4gd3NhbWFwcGluZ0xpc3Q7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgb3V0cHV0QWN0aW9uOwotICAgIHByaXZhdGUgTGlua2VkSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gZmF1bHRBY3Rpb25zID0gbmV3IExpbmtlZEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBzb2FwQWN0aW9uOwotCi0KLSAgICAvKiogRGVmYXVsdCBjb25zdHJ1Y3RvciAqLwotICAgIHB1YmxpYyBBeGlzT3BlcmF0aW9uKCkgewotICAgICAgICBtZXBVUkkgPSBXU0RMMkNvbnN0YW50cy5NRVBfVVJJX0lOX09VVDsKLSAgICAgICAgbW9kdWxlcmVmcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICBtb2R1bGVDb25maWdtYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE1vZHVsZUNvbmZpZ3VyYXRpb24+KCk7Ci0gICAgICAgIGZhdWx0TWVzc2FnZXMgPSBuZXcgQXJyYXlMaXN0PEF4aXNNZXNzYWdlPigpOwotICAgICAgICAvL3NldHVwIGEgdGVtcG9yYXJ5IG5hbWUKLSAgICAgICAgUU5hbWUgdG1wTmFtZSA9IG5ldyBRTmFtZSh0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIl8iICsgVVVJREdlbmVyYXRvci5nZXRVVUlEKCkpOwotICAgICAgICB0aGlzLnNldE5hbWUodG1wTmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIEF4aXNPcGVyYXRpb24oUU5hbWUgbmFtZSkgewotICAgICAgICB0aGlzKCk7Ci0gICAgICAgIHRoaXMuc2V0TmFtZShuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBhZGRNZXNzYWdlKEF4aXNNZXNzYWdlIG1lc3NhZ2UsIFN0cmluZyBsYWJlbCk7Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgbWVzc2FnZSBjb250ZXh0IGludG8gYW4gb3BlcmF0aW9uIGNvbnRleHQuIERlcGVuZGluZyBvbiBNRVBzLCB0aGlzIG1ldGhvZCBoYXMgdG8gYmUKLSAgICAgKiBvdmVycmlkZGVuLiBEZXBlbmRpbmcgb24gdGhlIE1FUCBvcGVyYXRpb24gZGVzY3JpcHRpb24ga25vdyBob3cgdG8gZmlsbCB0aGUgbWVzc2FnZSBjb250ZXh0Ci0gICAgICogbWFwIGluIG9wZXJhdGlvbkNvbnRleHQuIEFzIGFuIGV4YW1wbGUsIGlmIHRoZSBNRVAgaXMgSU4tT1VUIHRoZW4gZGVwZW5kaW5nIG9uIG1lc3NhZ2FibGUKLSAgICAgKiBvcGVyYXRpb24gZGVzY3JpcHRpb24gc2hvdWxkIGtub3cgaG93IHRvIGtlZXAgdGhlbSBpbiBjb3JyZWN0IGxvY2F0aW9ucy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtc2dDb250ZXh0IDxjb2RlPk1lc3NhZ2VDb250ZXh0PC9jb2RlPgotICAgICAqIEBwYXJhbSBvcENvbnRleHQgIDxjb2RlPk9wZXJhdGlvbkNvbnRleHQ8L2NvZGU+Ci0gICAgICogQHRocm93cyBBeGlzRmF1bHQgPGNvZGU+QXhpc0ZhdWx0PC9jb2RlPgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGFkZE1lc3NhZ2VDb250ZXh0KE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQsIE9wZXJhdGlvbkNvbnRleHQgb3BDb250ZXh0KQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdDsKLQotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGFkZEZhdWx0TWVzc2FnZUNvbnRleHQoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhdGlvbkNvbnRleHQgb3BDb250ZXh0KQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdDsKLQotICAgIHB1YmxpYyB2b2lkIGFkZE1vZHVsZShTdHJpbmcgbW9kdWxlTmFtZSkgewotICAgICAgICBtb2R1bGVyZWZzLmFkZChtb2R1bGVOYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIG1vZHVsZSBjb25maWd1cmF0aW9uLCBpZiB0aGVyZSBpcyBtb2R1bGVDb25maWcgdGFnIGluIG9wZXJhdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtb2R1bGVDb25maWd1cmF0aW9uIGEgTW9kdWxlQ29uZmlndXJhdGlvbiB3aGljaCB3aWxsIGJlIGFkZGVkIChieSBuYW1lKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZE1vZHVsZUNvbmZpZyhNb2R1bGVDb25maWd1cmF0aW9uIG1vZHVsZUNvbmZpZ3VyYXRpb24pIHsKLSAgICAgICAgbW9kdWxlQ29uZmlnbWFwLnB1dChtb2R1bGVDb25maWd1cmF0aW9uLmdldE1vZHVsZU5hbWUoKSwgbW9kdWxlQ29uZmlndXJhdGlvbik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBpcyBjYWxsZWQgd2hlbiBhIG1vZHVsZSBpcyBlbmdhZ2VkIG9uIHRoaXMgb3BlcmF0aW9uLiAgSGFuZGxlIG9wZXJhdGlvbi1zcGVjaWZpYyB0YXNrcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBheGlzTW9kdWxlIEF4aXNNb2R1bGUgYmVpbmcgZW5nYWdlZAotICAgICAqIEBwYXJhbSBlbmdhZ2VyICAgIHRoZSBBeGlzRGVzY3JpcHRpb24gd2hlcmUgdGhlIGVuZ2FnZSBvY2N1cnJlZCAtIGNvdWxkIGJlIHVzIG9yIGEgcGFyZW50Ci0gICAgICogQHRocm93cyBBeGlzRmF1bHQKLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgdm9pZCBvbkVuZ2FnZShBeGlzTW9kdWxlIGF4aXNNb2R1bGUsIEF4aXNEZXNjcmlwdGlvbiBlbmdhZ2VyKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgLy8gQW0gSSB0aGUgc291cmNlIG9mIHRoaXMgZW5nYWdlbWVudD8KLSAgICAgICAgYm9vbGVhbiBzZWxmRW5nYWdlZCA9IChlbmdhZ2VyID09IHRoaXMpOwotCi0gICAgICAgIC8vIElmIEknbSBub3QsIHRoZSBvcGVyYXRpb25zIHdpbGwgYWxyZWFkeSBoYXZlIGJlZW4gYWRkZWQgYnkgc29tZW9uZSBhYm92ZSwgc28gZG9uJ3QKLSAgICAgICAgLy8gZG8gaXQgYWdhaW4uCi0gICAgICAgIGlmIChzZWxmRW5nYWdlZCkgewotICAgICAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSA9IGdldEF4aXNTZXJ2aWNlKCk7Ci0gICAgICAgICAgICBpZiAoc2VydmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc2VydmljZS5hZGRNb2R1bGVPcGVyYXRpb25zKGF4aXNNb2R1bGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIEF4aXNDb25maWd1cmF0aW9uIGF4aXNDb25maWcgPSBnZXRBeGlzQ29uZmlndXJhdGlvbigpOwotICAgICAgICBQaGFzZVJlc29sdmVyIHBoYXNlUmVzb2x2ZXIgPSBuZXcgUGhhc2VSZXNvbHZlcihheGlzQ29uZmlnKTsKLSAgICAgICAgcGhhc2VSZXNvbHZlci5lbmdhZ2VNb2R1bGVUb09wZXJhdGlvbih0aGlzLCBheGlzTW9kdWxlKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBvbkRpc2VuZ2FnZShBeGlzTW9kdWxlIG1vZHVsZSkgewotICAgICAgICBBeGlzU2VydmljZSBzZXJ2aWNlID0gZ2V0QXhpc1NlcnZpY2UoKTsKLSAgICAgICAgaWYgKHNlcnZpY2UgPT0gbnVsbCkgcmV0dXJuOwotCi0gICAgICAgIEF4aXNDb25maWd1cmF0aW9uIGF4aXNDb25maWd1cmF0aW9uID0gc2VydmljZS5nZXRBeGlzQ29uZmlndXJhdGlvbigpOwotICAgICAgICBQaGFzZVJlc29sdmVyIHBoYXNlUmVzb2x2ZXIgPSBuZXcgUGhhc2VSZXNvbHZlcihheGlzQ29uZmlndXJhdGlvbik7Ci0gICAgICAgIGlmICghc2VydmljZS5pc0VuZ2FnZWQobW9kdWxlLmdldE5hbWUoKSkgJiYKLSAgICAgICAgICAgIChheGlzQ29uZmlndXJhdGlvbiAhPSBudWxsICYmICFheGlzQ29uZmlndXJhdGlvbi5pc0VuZ2FnZWQobW9kdWxlLmdldE5hbWUoKSkpKSB7Ci0gICAgICAgICAgICBwaGFzZVJlc29sdmVyLmRpc2VuZ2FnZU1vZHVsZUZyb21HbG9iYWxDaGFpbnMobW9kdWxlKTsKLSAgICAgICAgfQotICAgICAgICBwaGFzZVJlc29sdmVyLmRpc2VuZ2FnZU1vZHVsZUZyb21PcGVyYXRpb25DaGFpbihtb2R1bGUsIHRoaXMpOwotCi0gICAgICAgIC8vcmVtb3Zpbmcgb3BlcmF0aW9ucyBhZGRlZCBhdCB0aGUgdGltZSBvZiBtb2R1bGUgZW5nYWdlbW50Ci0gICAgICAgIEhhc2hNYXA8UU5hbWUsIEF4aXNPcGVyYXRpb24+IG1vZHVsZU9wZXJhdGlvbnMgPSBtb2R1bGUuZ2V0T3BlcmF0aW9ucygpOwotICAgICAgICBpZiAobW9kdWxlT3BlcmF0aW9ucyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBJdGVyYXRvcjxBeGlzT3BlcmF0aW9uPiBtb2R1bGVPcGVyYXRpb25zX2l0ciA9IG1vZHVsZU9wZXJhdGlvbnMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIHdoaWxlIChtb2R1bGVPcGVyYXRpb25zX2l0ci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBBeGlzT3BlcmF0aW9uIG9wZXJhdGlvbiA9IChBeGlzT3BlcmF0aW9uKW1vZHVsZU9wZXJhdGlvbnNfaXRyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBzZXJ2aWNlLnJlbW92ZU9wZXJhdGlvbihvcGVyYXRpb24uZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRvIHJlbW92ZSBtb2R1bGUgZnJvbSBlbmdhZ2UgIG1vZHVsZSBsaXN0Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbW9kdWxlIG1vZHVsZSB0byByZW1vdmUKLSAgICAgKiBAZGVwcmVjYXRlZCBwbGVhc2UgdXNlIGRpc2VuZ2FnZU1vZHVsZSgpLCB0aGlzIG1ldGhvZCB3aWxsIGRpc2FwcGVhciBhZnRlciAxLjMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVGcm9tRW5nYWdlZE1vZHVsZUxpc3QoQXhpc01vZHVsZSBtb2R1bGUpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGRpc2VuZ2FnZU1vZHVsZShtb2R1bGUpOwotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgYXhpc0ZhdWx0KSB7Ci0gICAgICAgICAgICAvLyBDYW4ndCBkbyBtdWNoIGhlcmUuLi4KLSAgICAgICAgICAgIGxvZy5lcnJvcihheGlzRmF1bHQuZ2V0TWVzc2FnZSgpLCBheGlzRmF1bHQpOwotICAgICAgICB9Ci0gICAgfQotCi0vLyAgTm90ZSAtIHJlbW92ZWQgdGhpcyBtZXRob2Qgd2hpY2ggd2FzIGRlYWQgY29kZS4KLS8vICAgIHByaXZhdGUgQXhpc09wZXJhdGlvbiBjb3B5T3BlcmF0aW9uKEF4aXNPcGVyYXRpb24gYXhpc09wZXJhdGlvbikgdGhyb3dzIEF4aXNGYXVsdCB7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFzIGV4aXN0aW5nIE9wZXJhdGlvbkNvbnRleHQgcmVsYXRlZCB0byB0aGlzIG1lc3NhZ2UgaWYgb25lIGV4aXN0cy4KLSAgICAgKiA8cC8+Ci0gICAgICogVE9ETyAtIHdoeSBib3RoIHRoaXMgYW5kIGZpbmRPcGVyYXRpb25Db250ZXh0KCk/IChHRCkKLSAgICAgKgotICAgICAqIEBwYXJhbSBtc2dDb250ZXh0IHRoZSBNZXNzYWdlQ29udGV4dCBmb3Igd2hpY2ggd2UnZCBsaWtlIGFuIE9wZXJhdGlvbkNvbnRleHQKLSAgICAgKiBAcmV0dXJuIHRoZSBPcGVyYXRpb25Db250ZXh0LCBvciBudWxsCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQKLSAgICAgKi8KLSAgICBwdWJsaWMgT3BlcmF0aW9uQ29udGV4dCBmaW5kRm9yRXhpc3RpbmdPcGVyYXRpb25Db250ZXh0KE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgT3BlcmF0aW9uQ29udGV4dCBvcGVyYXRpb25Db250ZXh0OwotCi0gICAgICAgIGlmICgob3BlcmF0aW9uQ29udGV4dCA9IG1zZ0NvbnRleHQuZ2V0T3BlcmF0aW9uQ29udGV4dCgpKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gb3BlcmF0aW9uQ29udGV4dDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIElmIHRoaXMgbWVzc2FnZSBpcyBub3QgcmVsYXRlZCB0byBhbm90aGVyIG9uZSwgb3IgaXQgaXMgYnV0IG5vdCBvbmUgZW1pdHRlZAotICAgICAgICAvLyBmcm9tIHRoZSBzYW1lIG9wZXJhdGlvbiwgZG9uJ3QgZnVydGhlciBsb29rIGZvciBhbiBvcGVyYXRpb24gY29udGV4dCBvciBmYXVsdC4KLSAgICAgICAgaWYgKG51bGwgIT0gbXNnQ29udGV4dC5nZXRSZWxhdGVzVG8oKSkgewotICAgICAgICAgICAgLy8gU28gdGhpcyBtZXNzYWdlIG1heSBiZSBwYXJ0IG9mIGFuIG9uZ29pbmcgTUVQCi0gICAgICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0ID0gbXNnQ29udGV4dC5nZXRDb25maWd1cmF0aW9uQ29udGV4dCgpOwotCi0gICAgICAgICAgICBvcGVyYXRpb25Db250ZXh0ID0KLSAgICAgICAgICAgICAgICAgICAgY29uZmlnQ29udGV4dC5nZXRPcGVyYXRpb25Db250ZXh0KG1zZ0NvbnRleHQuZ2V0UmVsYXRlc1RvKCkuZ2V0VmFsdWUoKSk7Ci0KLSAgICAgICAgICAgIGlmIChudWxsID09IG9wZXJhdGlvbkNvbnRleHQgJiYgbG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcobXNnQ29udGV4dC5nZXRMb2dJRFN0cmluZygpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIiBDYW5ub3QgY29ycmVsYXRlIGluYm91bmQgbWVzc2FnZSBSZWxhdGVzVG8gdmFsdWUgWyIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICBtc2dDb250ZXh0LmdldFJlbGF0ZXNUbygpICsgIl0gdG8gaW4tcHJvZ3JlZSBNRVAiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBvcGVyYXRpb25Db250ZXh0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZpbmRzIGFuIE9wZXJhdGlvbkNvbnRleHQgZm9yIGFuIGluY29taW5nIG1lc3NhZ2UuIEFuIGluY29taW5nIG1lc3NhZ2UgY2FuIGJlIG9mIHR3byBzdGF0ZXMuCi0gICAgICogPHAvPgotICAgICAqIDEpVGhpcyBpcyBhIG5ldyBpbmNvbWluZyBtZXNzYWdlIG9mIGEgZ2l2ZW4gTUVQLiAyKVRoaXMgbWVzc2FnZSBpcyBhIHBhcnQgb2YgYW4gTUVQIHdoaWNoIGhhcwotICAgICAqIGFscmVhZHkgYmVndW4uCi0gICAgICogPHAvPgotICAgICAqIFRoZSBtZXRob2QgaXMgc3BlY2lhbCBjYXNlZCBmb3IgdGhlIHR3byBNRVBzCi0gICAgICogPHAvPgotICAgICAqICNJTl9PTkxZICNJTl9PVVQKLSAgICAgKiA8cC8+Ci0gICAgICogZm9yIHR3byByZWFzb25zLiBGaXJzdCByZWFzb24gaXMgdGhlIHdpZGUgdXNhZ2UgYW5kIHRoZSBzZWNvbmQgYmVpbmcgdGhhdCB0aGUgbmVlZCBmb3IgdGhlCi0gICAgICogTUVQQ29udGV4dCB0byBiZSBzYXZlZCBmb3IgZnVydGhlciBpbmNvbWluZyBtZXNzYWdlcy4KLSAgICAgKiA8cC8+Ci0gICAgICogSW4gdGhlIGV2ZW50IHRoYXQgTUVQIG9mIHRoaXMgb3BlcmF0aW9uIGlzIGRpZmZlcmVudCBmcm9tIHRoZSB0d28gTUVQcyBkZWZhdWx0ZWQgYWJvdmUgdGhlCi0gICAgICogZGVjaXNpb24gb2YgY3JlYXRpbmcgYSBuZXcgb3IgdGhpcyBtZXNzYWdlIHJlbGF0ZXMgdG8gYSBNRVAgd2hpY2ggYWxyZWFkeSBpbiBidXNpbmVzcyBpcwotICAgICAqIGRlY2lkZWQgYnkgbG9va2luZyBhdCB0aGUgV1NBIFJlbGF0ZXMgVE8gb2YgdGhlIGluY29taW5nIG1lc3NhZ2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbXNnQ29udGV4dCAgICAgTWVzc2FnZUNvbnRleHQgdG8gc2VhcmNoCi0gICAgICogQHBhcmFtIHNlcnZpY2VDb250ZXh0IFNlcnZpY2VDb250ZXh0IChUT0RPIC0gd2h5IHBhc3MgdGhpcz8gKEdEKSkKLSAgICAgKiBAcmV0dXJuIHRoZSBhY3RpdmUgT3BlcmF0aW9uQ29udGV4dAotICAgICAqLwotICAgIHB1YmxpYyBPcGVyYXRpb25Db250ZXh0IGZpbmRPcGVyYXRpb25Db250ZXh0KE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VydmljZUNvbnRleHQgc2VydmljZUNvbnRleHQpCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgT3BlcmF0aW9uQ29udGV4dCBvcGVyYXRpb25Db250ZXh0OwotCi0gICAgICAgIGlmIChudWxsID09IG1zZ0NvbnRleHQuZ2V0UmVsYXRlc1RvKCkpIHsKLQotICAgICAgICAgICAgLy8gSXRzIGEgbmV3IGluY29taW5nIG1lc3NhZ2Ugc28gZ2V0IHRoZSBmYWN0b3J5IHRvIGNyZWF0ZSBhIG5ldwotICAgICAgICAgICAgLy8gb25lCi0gICAgICAgICAgICBvcGVyYXRpb25Db250ZXh0ID0gc2VydmljZUNvbnRleHQuY3JlYXRlT3BlcmF0aW9uQ29udGV4dCh0aGlzKTsKLSAgICAgICAgfSBlbHNlIHsKLQotICAgICAgICAgICAgLy8gU28gdGhpcyBtZXNzYWdlIGlzIHBhcnQgb2YgYW4gb25nb2luZyBNRVAKLSAgICAgICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQgPSBtc2dDb250ZXh0LmdldENvbmZpZ3VyYXRpb25Db250ZXh0KCk7Ci0KLSAgICAgICAgICAgIG9wZXJhdGlvbkNvbnRleHQgPQotICAgICAgICAgICAgICAgICAgICBjb25maWdDb250ZXh0LmdldE9wZXJhdGlvbkNvbnRleHQobXNnQ29udGV4dC5nZXRSZWxhdGVzVG8oKS5nZXRWYWx1ZSgpKTsKLQotICAgICAgICAgICAgaWYgKG51bGwgPT0gb3BlcmF0aW9uQ29udGV4dCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoTWVzc2FnZXMuZ2V0TWVzc2FnZSgiY2Fubm90Q29ycmVsYXRlTXNnIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uYW1lLnRvU3RyaW5nKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZ0NvbnRleHQuZ2V0UmVsYXRlc1RvKCkuZ2V0VmFsdWUoKSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBvcGVyYXRpb25Db250ZXh0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyT3BlcmF0aW9uQ29udGV4dChNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYXRpb25Db250ZXh0IG9wZXJhdGlvbkNvbnRleHQpCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgbXNnQ29udGV4dC5zZXRBeGlzT3BlcmF0aW9uKHRoaXMpOwotICAgICAgICBtc2dDb250ZXh0LmdldENvbmZpZ3VyYXRpb25Db250ZXh0KCkucmVnaXN0ZXJPcGVyYXRpb25Db250ZXh0KG1zZ0NvbnRleHQuZ2V0TWVzc2FnZUlEKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uQ29udGV4dCk7Ci0gICAgICAgIG9wZXJhdGlvbkNvbnRleHQuYWRkTWVzc2FnZUNvbnRleHQobXNnQ29udGV4dCk7Ci0gICAgICAgIG1zZ0NvbnRleHQuc2V0T3BlcmF0aW9uQ29udGV4dChvcGVyYXRpb25Db250ZXh0KTsKLSAgICAgICAgaWYgKG9wZXJhdGlvbkNvbnRleHQuaXNDb21wbGV0ZSgpKSB7Ci0gICAgICAgICAgICBvcGVyYXRpb25Db250ZXh0LmNsZWFudXAoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyTWVzc2FnZUNvbnRleHQoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhdGlvbkNvbnRleHQgb3BlcmF0aW9uQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIG1zZ0NvbnRleHQuc2V0QXhpc09wZXJhdGlvbih0aGlzKTsKLSAgICAgICAgb3BlcmF0aW9uQ29udGV4dC5hZGRNZXNzYWdlQ29udGV4dChtc2dDb250ZXh0KTsKLSAgICAgICAgbXNnQ29udGV4dC5zZXRPcGVyYXRpb25Db250ZXh0KG9wZXJhdGlvbkNvbnRleHQpOwotICAgICAgICBpZiAob3BlcmF0aW9uQ29udGV4dC5pc0NvbXBsZXRlKCkpIHsKLSAgICAgICAgICAgIG9wZXJhdGlvbkNvbnRleHQuY2xlYW51cCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWFwcyB0aGUgU3RyaW5nIFVSSSBvZiB0aGUgTWVzc2FnZSBleGNoYW5nZSBwYXR0ZXJuIHRvIGFuIGludGVnZXIuIEZ1cnRoZXIsIGluIHRoZSBmaXJzdAotICAgICAqIGxvb2t1cCwgaXQgd2lsbCBjYWNoZSB0aGUgbG9va2VkIHVwIHZhbHVlIHNvIHRoYXQgdGhlIHN1YnNlcXVlbnQgbWV0aG9kIGNhbGxzIGFyZSBleHRyZW1lbHkKLSAgICAgKiBlZmZpY2llbnQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGFuIE1FUCBjb25zdGFudCBmcm9tIFdTRExDb25zdGFudHMKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldEF4aXNTcGVjaWZpY01FUENvbnN0YW50KCkgewotICAgICAgICBpZiAodGhpcy5tZXAgIT0gV1NETENvbnN0YW50cy5NRVBfQ09OU1RBTlRfSU5WQUxJRCkgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMubWVwOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IHRlbXAgPSBXU0RMQ29uc3RhbnRzLk1FUF9DT05TVEFOVF9JTlZBTElEOwotCi0gICAgICAgIGlmIChXU0RMMkNvbnN0YW50cy5NRVBfVVJJX0lOX09VVC5lcXVhbHMobWVwVVJJKSkgewotICAgICAgICAgICAgdGVtcCA9IFdTRExDb25zdGFudHMuTUVQX0NPTlNUQU5UX0lOX09VVDsKLSAgICAgICAgfSBlbHNlIGlmIChXU0RMMkNvbnN0YW50cy5NRVBfVVJJX0lOX09OTFkuZXF1YWxzKG1lcFVSSSkpIHsKLSAgICAgICAgICAgIHRlbXAgPSBXU0RMQ29uc3RhbnRzLk1FUF9DT05TVEFOVF9JTl9PTkxZOwotICAgICAgICB9IGVsc2UgaWYgKFdTREwyQ29uc3RhbnRzLk1FUF9VUklfSU5fT1BUSU9OQUxfT1VULmVxdWFscyhtZXBVUkkpKSB7Ci0gICAgICAgICAgICB0ZW1wID0gV1NETENvbnN0YW50cy5NRVBfQ09OU1RBTlRfSU5fT1BUSU9OQUxfT1VUOwotICAgICAgICB9IGVsc2UgaWYgKFdTREwyQ29uc3RhbnRzLk1FUF9VUklfT1VUX0lOLmVxdWFscyhtZXBVUkkpKSB7Ci0gICAgICAgICAgICB0ZW1wID0gV1NETENvbnN0YW50cy5NRVBfQ09OU1RBTlRfT1VUX0lOOwotICAgICAgICB9IGVsc2UgaWYgKFdTREwyQ29uc3RhbnRzLk1FUF9VUklfT1VUX09OTFkuZXF1YWxzKG1lcFVSSSkpIHsKLSAgICAgICAgICAgIHRlbXAgPSBXU0RMQ29uc3RhbnRzLk1FUF9DT05TVEFOVF9PVVRfT05MWTsKLSAgICAgICAgfSBlbHNlIGlmIChXU0RMMkNvbnN0YW50cy5NRVBfVVJJX09VVF9PUFRJT05BTF9JTi5lcXVhbHMobWVwVVJJKSkgewotICAgICAgICAgICAgdGVtcCA9IFdTRExDb25zdGFudHMuTUVQX0NPTlNUQU5UX09VVF9PUFRJT05BTF9JTjsKLSAgICAgICAgfSBlbHNlIGlmIChXU0RMMkNvbnN0YW50cy5NRVBfVVJJX1JPQlVTVF9JTl9PTkxZLmVxdWFscyhtZXBVUkkpKSB7Ci0gICAgICAgICAgICB0ZW1wID0gV1NETENvbnN0YW50cy5NRVBfQ09OU1RBTlRfUk9CVVNUX0lOX09OTFk7Ci0gICAgICAgIH0gZWxzZSBpZiAoV1NETDJDb25zdGFudHMuTUVQX1VSSV9ST0JVU1RfT1VUX09OTFkuZXF1YWxzKG1lcFVSSSkpIHsKLSAgICAgICAgICAgIHRlbXAgPSBXU0RMQ29uc3RhbnRzLk1FUF9DT05TVEFOVF9ST0JVU1RfT1VUX09OTFk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodGVtcCA9PSBXU0RMQ29uc3RhbnRzLk1FUF9DT05TVEFOVF9JTlZBTElEKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0Vycm9yKE1lc3NhZ2VzLmdldE1lc3NhZ2UoIm1lcG1hcHBpbmdlcnJvciIpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRoaXMubWVwID0gdGVtcDsKLQotICAgICAgICByZXR1cm4gdGhpcy5tZXA7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICoKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2UjZ2V0RW5nYWRnZWRNb2R1bGVzKCkKLSAgICAgKi8KLQotICAgIHB1YmxpYyBhYnN0cmFjdCBBeGlzTWVzc2FnZSBnZXRNZXNzYWdlKFN0cmluZyBsYWJlbCk7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4oKSB7Ci0gICAgICAgIHJldHVybiBtZXBVUkk7Ci0gICAgfQotCi0gICAgcHVibGljIE1lc3NhZ2VSZWNlaXZlciBnZXRNZXNzYWdlUmVjZWl2ZXIoKSB7Ci0gICAgICAgIHJldHVybiBtZXNzYWdlUmVjZWl2ZXI7Ci0gICAgfQotCi0gICAgcHVibGljIE1vZHVsZUNvbmZpZ3VyYXRpb24gZ2V0TW9kdWxlQ29uZmlnKFN0cmluZyBtb2R1bGVOYW1lKSB7Ci0gICAgICAgIHJldHVybiAoTW9kdWxlQ29uZmlndXJhdGlvbiltb2R1bGVDb25maWdtYXAuZ2V0KG1vZHVsZU5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBBcnJheUxpc3Q8U3RyaW5nPiBnZXRNb2R1bGVSZWZzKCkgewotICAgICAgICByZXR1cm4gbW9kdWxlcmVmczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUU5hbWUgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIGFic3RyYWN0IEFycmF5TGlzdCBnZXRQaGFzZXNJbkZhdWx0RmxvdygpOwotCi0gICAgcHVibGljIGFic3RyYWN0IEFycmF5TGlzdCBnZXRQaGFzZXNPdXRGYXVsdEZsb3coKTsKLQotICAgIHB1YmxpYyBhYnN0cmFjdCBBcnJheUxpc3QgZ2V0UGhhc2VzT3V0RmxvdygpOwotCi0gICAgcHVibGljIGFic3RyYWN0IEFycmF5TGlzdCBnZXRSZW1haW5pbmdQaGFzZXNJbkZsb3coKTsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3R5bGUoKSB7Ci0gICAgICAgIHJldHVybiBzdHlsZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXJyYXlMaXN0PFN0cmluZz4gZ2V0V1NBTWFwcGluZ0xpc3QoKSB7Ci0gICAgICAgIHJldHVybiB3c2FtYXBwaW5nTGlzdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0NvbnRyb2xPcGVyYXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBjb250cm9sT3BlcmF0aW9uOwotICAgIH0KLQotICAgIC8vIHRvIGNoZWNrIHdoZXRoZXIgYSBnaXZlbiBwYXJhbWV0ZXIgaXMgbG9ja2VkCi0gICAgcHVibGljIGJvb2xlYW4gaXNQYXJhbWV0ZXJMb2NrZWQoU3RyaW5nIHBhcmFtZXRlck5hbWUpIHsKLQotICAgICAgICAvLyBjaGVja2luZyB0aGUgbG9ja2VkIHZhbHVlIG9mIHBhcmVudAotICAgICAgICBib29sZWFuIGxvY2tlZCA9IGZhbHNlOwotCi0gICAgICAgIGlmIChnZXRQYXJlbnQoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBsb2NrZWQgPSBnZXRQYXJlbnQoKS5pc1BhcmFtZXRlckxvY2tlZChwYXJhbWV0ZXJOYW1lKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChsb2NrZWQpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgUGFyYW1ldGVyIHBhcmFtZXRlciA9IGdldFBhcmFtZXRlcihwYXJhbWV0ZXJOYW1lKTsKLQotICAgICAgICAgICAgcmV0dXJuIChwYXJhbWV0ZXIgIT0gbnVsbCkgJiYgcGFyYW1ldGVyLmlzTG9ja2VkKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb250cm9sT3BlcmF0aW9uKGJvb2xlYW4gY29udHJvbE9wZXJhdGlvbikgewotICAgICAgICB0aGlzLmNvbnRyb2xPcGVyYXRpb24gPSBjb250cm9sT3BlcmF0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4oU3RyaW5nIG1lcFVSSSkgewotICAgICAgICB0aGlzLm1lcFVSSSA9IG1lcFVSSTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXNzYWdlUmVjZWl2ZXIoTWVzc2FnZVJlY2VpdmVyIG1lc3NhZ2VSZWNlaXZlcikgewotICAgICAgICB0aGlzLm1lc3NhZ2VSZWNlaXZlciA9IG1lc3NhZ2VSZWNlaXZlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFFOYW1lIG5hbWUpIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRQaGFzZXNJbkZhdWx0RmxvdyhBcnJheUxpc3QgbGlzdCk7Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRQaGFzZXNPdXRGYXVsdEZsb3coQXJyYXlMaXN0IGxpc3QpOwotCi0gICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0UGhhc2VzT3V0RmxvdyhBcnJheUxpc3QgbGlzdCk7Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRSZW1haW5pbmdQaGFzZXNJbkZsb3coQXJyYXlMaXN0IGxpc3QpOwotCi0gICAgcHVibGljIHZvaWQgc2V0U3R5bGUoU3RyaW5nIHN0eWxlKSB7Ci0gICAgICAgIGlmICghIiIuZXF1YWxzKHN0eWxlKSkgewotICAgICAgICAgICAgdGhpcy5zdHlsZSA9IHN0eWxlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0V3NhbWFwcGluZ0xpc3QoQXJyYXlMaXN0PFN0cmluZz4gd3NhbWFwcGluZ0xpc3QpIHsKLSAgICAgICAgdGhpcy53c2FtYXBwaW5nTGlzdCA9IHdzYW1hcHBpbmdMaXN0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiBhbiBPcGVyYXRpb25DbGllbnQgc3VpdGFibGUgZm9yIHRoaXMgQXhpc09wZXJhdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzYyAgICAgIGFjdGl2ZSBTZXJ2aWNlQ29udGV4dAotICAgICAqIEBwYXJhbSBvcHRpb25zIGFjdGl2ZSBPcHRpb25zCi0gICAgICogQHJldHVybiBhbiBPcGVyYXRpb25DbGllbnQgc2V0IHVwIGFwcHJvcHJpYXRlbHkgZm9yIHRoaXMgb3BlcmF0aW9uCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IE9wZXJhdGlvbkNsaWVudCBjcmVhdGVDbGllbnQoU2VydmljZUNvbnRleHQgc2MsIE9wdGlvbnMgb3B0aW9ucyk7Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldEtleSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMubmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXJyYXlMaXN0PEF4aXNNZXNzYWdlPiBnZXRGYXVsdE1lc3NhZ2VzKCkgewotICAgICAgICByZXR1cm4gZmF1bHRNZXNzYWdlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRGYXVsdE1lc3NhZ2VzKEF4aXNNZXNzYWdlIGZhdWx0TWVzc2FnZSkgewotICAgICAgICBmYXVsdE1lc3NhZ2Uuc2V0UGFyZW50KHRoaXMpOwotICAgICAgICBmYXVsdE1lc3NhZ2VzLmFkZChmYXVsdE1lc3NhZ2UpOwotICAgICAgICBpZiAoZ2V0RmF1bHRBY3Rpb24oZmF1bHRNZXNzYWdlLmdldE5hbWUoKSkgPT0gbnVsbCkgewotICAgICAgICAgICAgYWRkRmF1bHRBY3Rpb24oZmF1bHRNZXNzYWdlLmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1cm46IiArIG5hbWUuZ2V0TG9jYWxQYXJ0KCkgKyBmYXVsdE1lc3NhZ2UuZ2V0TmFtZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFNvYXBBY3Rpb24oU3RyaW5nIHNvYXBBY3Rpb24pIHsKLSAgICAgICAgdGhpcy5zb2FwQWN0aW9uID0gc29hcEFjdGlvbjsKLSAgICB9Ci0KLSAgICAvKgotICAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIGFjY2VzcyB0aGUgV1MtQSBJbnB1dCBBY3Rpb24gcGVyIHRoZQotICAgICogV1MtQSBzcGVjLiBFZmZlY3RpdmVseSB1c2UgdGhlIHNvYXBBY3Rpb24gaWYgYXZhaWxhYmxlIGVsc2UKLSAgICAqIHVzZSB0aGUgZmlyc3QgZW50cnkgaW4gdGhlIFdTQSBNYXBwaW5nIGxpc3QuCi0gICAgKgotICAgICogVXNlIGdldFNvYXBBY3Rpb24gd2hlbiB5b3Ugd2FudCB0byBnZXQgdGhlIHNvYXAgYWN0aW9uIGFuZCB0aGlzCi0gICAgKiB3aGVuIHlvdSB3YW50IHRvIGdldCB0aGUgd3NhIGlucHV0IGFjdGlvbi4KLSAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW5wdXRBY3Rpb24oKSB7Ci0gICAgICAgIFN0cmluZyByZXN1bHQgPSBudWxsOwotICAgICAgICBpZiAoc29hcEFjdGlvbiAhPSBudWxsICYmICEiIi5lcXVhbHMoc29hcEFjdGlvbikpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IHNvYXBBY3Rpb247Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAod3NhbWFwcGluZ0xpc3QgIT0gbnVsbCAmJiAhd3NhbWFwcGluZ0xpc3QuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gKFN0cmluZyl3c2FtYXBwaW5nTGlzdC5nZXQoMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE91dHB1dEFjdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIG91dHB1dEFjdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRPdXRwdXRBY3Rpb24oU3RyaW5nIGFjdCkgewotICAgICAgICBvdXRwdXRBY3Rpb24gPSBhY3Q7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkRmF1bHRBY3Rpb24oU3RyaW5nIGZhdWx0TmFtZSwgU3RyaW5nIGFjdGlvbikgewotICAgICAgICBmYXVsdEFjdGlvbnMucHV0KGZhdWx0TmFtZSwgYWN0aW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVGYXVsdEFjdGlvbihTdHJpbmcgZmF1bHROYW1lKSB7Ci0gICAgICAgIGZhdWx0QWN0aW9ucy5yZW1vdmUoZmF1bHROYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZhdWx0QWN0aW9uKFN0cmluZyBmYXVsdE5hbWUpIHsKLSAgICAgICAgcmV0dXJuIChTdHJpbmcpZmF1bHRBY3Rpb25zLmdldChmYXVsdE5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRGYXVsdEFjdGlvbk5hbWVzKCkgewotICAgICAgICBTZXQ8U3RyaW5nPiBrZXlzID0gZmF1bHRBY3Rpb25zLmtleVNldCgpOwotICAgICAgICBTdHJpbmdbXSBmYXVsdEFjdGlvbk5hbWVzID0gbmV3IFN0cmluZ1trZXlzLnNpemUoKV07Ci0gICAgICAgIGZhdWx0QWN0aW9uTmFtZXMgPSAoU3RyaW5nW10pa2V5cy50b0FycmF5KGZhdWx0QWN0aW9uTmFtZXMpOwotICAgICAgICByZXR1cm4gZmF1bHRBY3Rpb25OYW1lczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZhdWx0QWN0aW9uKCkgewotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLSAgICAgICAgSXRlcmF0b3I8U3RyaW5nPiBpdGVyID0gZmF1bHRBY3Rpb25zLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgICAgIGlmIChpdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgcmVzdWx0ID0gKFN0cmluZylpdGVyLm5leHQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgbWVzc2FnZXMgcmVmZXJlbmNlZCBieSB0aGlzIG9wZXJhdGlvbgotICAgICAqCi0gICAgICogQHJldHVybiBhbiBJdGVyYXRvciBvZiBhbGwgdGhlIEF4aXNNZXNzYWdlcyB3ZSBkZWFsIHdpdGgKLSAgICAgKi8KLSAgICBwdWJsaWMgSXRlcmF0b3I8QXhpc01lc3NhZ2U+IGdldE1lc3NhZ2VzKCkgewotICAgICAgICByZXR1cm4gKEl0ZXJhdG9yPEF4aXNNZXNzYWdlPilnZXRDaGlsZHJlbigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFR5cGVzYWZlIGFjY2VzcyB0byBwYXJlbnQgc2VydmljZQotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgQXhpc1NlcnZpY2Ugd2hpY2ggY29udGFpbnMgdGhpcyBBeGlzT3BlcmF0aW9uCi0gICAgICovCi0gICAgcHVibGljIEF4aXNTZXJ2aWNlIGdldEF4aXNTZXJ2aWNlKCkgewotICAgICAgICByZXR1cm4gKEF4aXNTZXJ2aWNlKWdldFBhcmVudCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U29hcEFjdGlvbigpIHsKLSAgICAgICAgLyoKLSAgICAgICAgICogVGhpcyBBeGlzT3BlcmF0aW9uIGluc3RhbmNlIG1heSBiZSB1c2VkIGZvciB0aGUgY2xpZW50IE9VVC1JTiBvciBmb3IKLSAgICAgICAgICogdGhlIHNlcnZlciBJTi1PVVQuICBJZiB0aGUgYmVsb3cgY29kZSB3ZXJlIGNoYW5nZWQgdG8gZ2V0SW5wdXRBY3Rpb25zLCBhbmQgdGhlCi0gICAgICAgICAqIHJlc3VsdCBvZiBnZXRJbnB1dEFjdGlvbiB3ZXJlIHB1dCBpbiB0aGUgU09BUCBhY3Rpb24gaGVhZGVyIG9uIGEgY2xpZW50IG91dGJvdW5kCi0gICAgICAgICAqIG1lc3NhZ2UsIHRoZSBzZXJ2ZXIgd291bGQgcmVjZWl2ZSBhbiBJTkNPUlJFQ1QgU09BUCBhY3Rpb24gaGVhZGVyLiAgV2Ugc2hvdWxkIGxlYXZlCi0gICAgICAgICAqIHRoaXMgYXMgJ3JldHVybiBzb2FwQWN0aW9uOycgT1IgbWFrZSBpdCBjbGllbnQvc2VydmVyIGF3YXJlLgotICAgICAgICAgKi8KLSAgICAgICAgcmV0dXJuIHNvYXBBY3Rpb247Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL0F4aXNPcGVyYXRpb25GYWN0b3J5LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vQXhpc09wZXJhdGlvbkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBlMjgxZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vQXhpc09wZXJhdGlvbkZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmkxOG4uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLldTRExDb25zdGFudHM7Ci0KLXB1YmxpYyBjbGFzcyBBeGlzT3BlcmF0aW9uRmFjdG9yeSBpbXBsZW1lbnRzIFdTRExDb25zdGFudHMgewotCi0gICAgcHVibGljIHN0YXRpYyBBeGlzT3BlcmF0aW9uIGdldEF4aXNPcGVyYXRpb24oaW50IG1lcFVSSSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIEF4aXNPcGVyYXRpb24gYWJPcGRlc2M7Ci0KLSAgICAgICAgc3dpdGNoIChtZXBVUkkpIHsKLSAgICAgICAgICAgIGNhc2UgV1NETENvbnN0YW50cy5NRVBfQ09OU1RBTlRfSU5fT05MWSA6IHsKLSAgICAgICAgICAgICAgICBhYk9wZGVzYyA9IG5ldyBJbk9ubHlBeGlzT3BlcmF0aW9uKCk7Ci0gICAgICAgICAgICAgICAgYWJPcGRlc2Muc2V0TWVzc2FnZUV4Y2hhbmdlUGF0dGVybihXU0RMMkNvbnN0YW50cy5NRVBfVVJJX0lOX09OTFkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBXU0RMQ29uc3RhbnRzLk1FUF9DT05TVEFOVF9PVVRfT05MWSA6IHsKLSAgICAgICAgICAgICAgICBhYk9wZGVzYyA9IG5ldyBPdXRPbmx5QXhpc09wZXJhdGlvbigpOwotICAgICAgICAgICAgICAgIGFiT3BkZXNjLnNldE1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4oV1NETDJDb25zdGFudHMuTUVQX1VSSV9PVVRfT05MWSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFdTRExDb25zdGFudHMuTUVQX0NPTlNUQU5UX0lOX09VVCA6IHsKLSAgICAgICAgICAgICAgICBhYk9wZGVzYyA9IG5ldyBJbk91dEF4aXNPcGVyYXRpb24oKTsKLSAgICAgICAgICAgICAgICBhYk9wZGVzYy5zZXRNZXNzYWdlRXhjaGFuZ2VQYXR0ZXJuKFdTREwyQ29uc3RhbnRzLk1FUF9VUklfSU5fT1VUKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgV1NETENvbnN0YW50cy5NRVBfQ09OU1RBTlRfSU5fT1BUSU9OQUxfT1VUIDogewotICAgICAgICAgICAgICAgIGFiT3BkZXNjID0gbmV3IEluT3V0QXhpc09wZXJhdGlvbigpOwotICAgICAgICAgICAgICAgIGFiT3BkZXNjLnNldE1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4oV1NETDJDb25zdGFudHMuTUVQX1VSSV9JTl9PUFRJT05BTF9PVVQpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBXU0RMQ29uc3RhbnRzLk1FUF9DT05TVEFOVF9ST0JVU1RfSU5fT05MWSA6IHsKLSAgICAgICAgICAgICAgICBhYk9wZGVzYyA9IG5ldyBJbk9ubHlBeGlzT3BlcmF0aW9uKCk7Ci0gICAgICAgICAgICAgICAgYWJPcGRlc2Muc2V0TWVzc2FnZUV4Y2hhbmdlUGF0dGVybihXU0RMMkNvbnN0YW50cy5NRVBfVVJJX1JPQlVTVF9JTl9PTkxZKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgV1NETENvbnN0YW50cy5NRVBfQ09OU1RBTlRfT1VUX0lOIDogewotICAgICAgICAgICAgICAgIGFiT3BkZXNjID0gbmV3IE91dEluQXhpc09wZXJhdGlvbigpOwotICAgICAgICAgICAgICAgIGFiT3BkZXNjLnNldE1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4oV1NETDJDb25zdGFudHMuTUVQX1VSSV9PVVRfSU4pOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBXU0RMQ29uc3RhbnRzLk1FUF9DT05TVEFOVF9PVVRfT1BUSU9OQUxfSU4gOiB7Ci0gICAgICAgICAgICAgICAgYWJPcGRlc2MgPSBuZXcgT3V0SW5BeGlzT3BlcmF0aW9uKCk7Ci0gICAgICAgICAgICAgICAgYWJPcGRlc2Muc2V0TWVzc2FnZUV4Y2hhbmdlUGF0dGVybihXU0RMMkNvbnN0YW50cy5NRVBfVVJJX09VVF9PUFRJT05BTF9JTik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFdTRExDb25zdGFudHMuTUVQX0NPTlNUQU5UX1JPQlVTVF9PVVRfT05MWSA6IHsKLSAgICAgICAgICAgICAgICBhYk9wZGVzYyA9IG5ldyBSb2J1c3RPdXRPbmx5QXhpc09wZXJhdGlvbigpOwotICAgICAgICAgICAgICAgIGFiT3BkZXNjLnNldE1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4oV1NETDJDb25zdGFudHMuTUVQX1VSSV9ST0JVU1RfT1VUX09OTFkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGVmYXVsdCA6IHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KE1lc3NhZ2VzLmdldE1lc3NhZ2UoInVuU3VwcG9ydGVkTUVQIiwgIklEIGlzICIgKyBtZXBVUkkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYWJPcGRlc2M7Ci0gICAgfQotCi0gICAgLy9GSVhNRSBhZGQgaW4gdGhlIGxhdGVzdCBNRVAgVVJJcyBBTkQgbmVlZHMgdG8gZG91YmxlIGNoZWNrIG9uIGFib3V0IHRoZSBtZXAgd2UgaGFkIGluIDIwMDQKLSAgICBwdWJsaWMgc3RhdGljIEF4aXNPcGVyYXRpb24gZ2V0T3BlcmF0aW9uRGVzY3JpcHRpb24oU3RyaW5nIG1lcFVSSSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIEF4aXNPcGVyYXRpb24gYWJPcGRlc2M7Ci0gICAgICAgIGlmIChXU0RMMkNvbnN0YW50cy5NRVBfVVJJX0lOX09OTFkuZXF1YWxzKG1lcFVSSSkgfHwKLSAgICAgICAgICAgICAgICBXU0RMMjBfMjAwNkNvbnN0YW50cy5NRVBfVVJJX0lOX09OTFkuZXF1YWxzKG1lcFVSSSkgfHwKLSAgICAgICAgICAgICAgICBXU0RMMjBfMjAwNF9Db25zdGFudHMuTUVQX1VSSV9JTl9PTkxZLmVxdWFscyhtZXBVUkkpKSB7Ci0gICAgICAgICAgICBhYk9wZGVzYyA9IG5ldyBJbk9ubHlBeGlzT3BlcmF0aW9uKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoV1NETDJDb25zdGFudHMuTUVQX1VSSV9PVVRfT05MWS5lcXVhbHMobWVwVVJJKSB8fAotICAgICAgICAgICAgICAgIFdTREwyMF8yMDA2Q29uc3RhbnRzLk1FUF9VUklfT1VUX09OTFkuZXF1YWxzKG1lcFVSSSkgfHwKLSAgICAgICAgICAgICAgICBXU0RMMjBfMjAwNF9Db25zdGFudHMuTUVQX1VSSV9PVVRfT05MWS5lcXVhbHMobWVwVVJJKSkgewotICAgICAgICAgICAgYWJPcGRlc2MgPSBuZXcgT3V0T25seUF4aXNPcGVyYXRpb24oKTsKLSAgICAgICAgfSBlbHNlIGlmIChXU0RMMkNvbnN0YW50cy5NRVBfVVJJX0lOX09VVC5lcXVhbHMobWVwVVJJKSB8fAotICAgICAgICAgICAgICAgIFdTREwyMF8yMDA2Q29uc3RhbnRzLk1FUF9VUklfSU5fT1VULmVxdWFscyhtZXBVUkkpIHx8Ci0gICAgICAgICAgICAgICAgV1NETDIwXzIwMDRfQ29uc3RhbnRzLk1FUF9VUklfSU5fT1VULmVxdWFscyhtZXBVUkkpKSB7Ci0gICAgICAgICAgICBhYk9wZGVzYyA9IG5ldyBJbk91dEF4aXNPcGVyYXRpb24oKTsKLSAgICAgICAgfSBlbHNlIGlmIChXU0RMMkNvbnN0YW50cy5NRVBfVVJJX0lOX09QVElPTkFMX09VVC5lcXVhbHMobWVwVVJJKSB8fAotICAgICAgICAgICAgICAgIFdTREwyMF8yMDA2Q29uc3RhbnRzLk1FUF9VUklfSU5fT1BUSU9OQUxfT1VULmVxdWFscyhtZXBVUkkpIHx8Ci0gICAgICAgICAgICAgICAgV1NETDIwXzIwMDRfQ29uc3RhbnRzLk1FUF9VUklfSU5fT1BUSU9OQUxfT1VULmVxdWFscyhtZXBVUkkpKSB7Ci0gICAgICAgICAgICBhYk9wZGVzYyA9IG5ldyBJbk91dEF4aXNPcGVyYXRpb24oKTsKLSAgICAgICAgfSBlbHNlIGlmIChXU0RMMkNvbnN0YW50cy5NRVBfVVJJX09VVF9JTi5lcXVhbHMobWVwVVJJKSB8fAotICAgICAgICAgICAgICAgIFdTREwyMF8yMDA2Q29uc3RhbnRzLk1FUF9VUklfT1VUX0lOLmVxdWFscyhtZXBVUkkpIHx8Ci0gICAgICAgICAgICAgICAgV1NETDIwXzIwMDRfQ29uc3RhbnRzLk1FUF9VUklfT1VUX0lOLmVxdWFscyhtZXBVUkkpKSB7Ci0gICAgICAgICAgICBhYk9wZGVzYyA9IG5ldyBPdXRJbkF4aXNPcGVyYXRpb24oKTsKLSAgICAgICAgfSBlbHNlIGlmIChXU0RMMkNvbnN0YW50cy5NRVBfVVJJX09VVF9PUFRJT05BTF9JTi5lcXVhbHMobWVwVVJJKSB8fAotICAgICAgICAgICAgICAgIFdTREwyMF8yMDA2Q29uc3RhbnRzLk1FUF9VUklfT1VUX09QVElPTkFMX0lOLmVxdWFscyhtZXBVUkkpIHx8Ci0gICAgICAgICAgICAgICAgV1NETDIwXzIwMDRfQ29uc3RhbnRzLk1FUF9VUklfT1VUX09QVElPTkFMX0lOLmVxdWFscyhtZXBVUkkpKSB7Ci0gICAgICAgICAgICBhYk9wZGVzYyA9IG5ldyBPdXRJbkF4aXNPcGVyYXRpb24oKTsKLSAgICAgICAgfSBlbHNlIGlmIChXU0RMMkNvbnN0YW50cy5NRVBfVVJJX1JPQlVTVF9PVVRfT05MWS5lcXVhbHMobWVwVVJJKSB8fAotICAgICAgICAgICAgICAgIFdTREwyMF8yMDA2Q29uc3RhbnRzLk1FUF9VUklfUk9CVVNUX09VVF9PTkxZLmVxdWFscyhtZXBVUkkpIHx8Ci0gICAgICAgICAgICAgICAgV1NETDIwXzIwMDRfQ29uc3RhbnRzLk1FUF9VUklfUk9CVVNUX09VVF9PTkxZLmVxdWFscyhtZXBVUkkpKSB7Ci0gICAgICAgICAgICBhYk9wZGVzYyA9IG5ldyBPdXRJbkF4aXNPcGVyYXRpb24oKTsKLSAgICAgICAgICAgIGFiT3BkZXNjLnNldE1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4oV1NETDJDb25zdGFudHMuTUVQX1VSSV9ST0JVU1RfT1VUX09OTFkpOwotICAgICAgICB9IGVsc2UgaWYgKFdTREwyQ29uc3RhbnRzLk1FUF9VUklfUk9CVVNUX0lOX09OTFkuZXF1YWxzKG1lcFVSSSkgfHwKLSAgICAgICAgICAgICAgICBXU0RMMjBfMjAwNkNvbnN0YW50cy5NRVBfVVJJX1JPQlVTVF9JTl9PTkxZLmVxdWFscyhtZXBVUkkpIHx8Ci0gICAgICAgICAgICAgICAgV1NETDIwXzIwMDRfQ29uc3RhbnRzLk1FUF9VUklfUk9CVVNUX0lOX09OTFkuZXF1YWxzKG1lcFVSSSkpIHsKLSAgICAgICAgICAgIGFiT3BkZXNjID0gbmV3IEluT25seUF4aXNPcGVyYXRpb24oKTsKLSAgICAgICAgICAgIGFiT3BkZXNjLnNldE1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4oV1NETDJDb25zdGFudHMuTUVQX1VSSV9ST0JVU1RfSU5fT05MWSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KE1lc3NhZ2VzLmdldE1lc3NhZ2UoInVuU3VwcG9ydGVkTUVQIiwgIklEIGlzICIgKyBtZXBVUkkpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYWJPcGRlc2M7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL0F4aXNTZXJ2aWNlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vQXhpc1NlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjYwNTNhMy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vQXhpc1NlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxNDMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkFkZHJlc3NpbmdIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50Lk9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuU2VydmljZUNsaWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LlNlcnZpY2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YXJldHJpZXZhbC4qOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC5EZXBsb3ltZW50Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC51dGlsLkV4Y2x1ZGVJbmZvOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC51dGlsLlBoYXNlc0luZm87Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LnV0aWwuVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5qYXZhMndzZGwuKjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS4qOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaTE4bi5NZXNzYWdlczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnBoYXNlcmVzb2x2ZXIuUGhhc2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5UcmFuc3BvcnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuKjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuWE1MVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5uZWV0aGkuUG9saWN5OwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hOwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYUV4dGVybmFsOwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hT2JqZWN0Q29sbGVjdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLnV0aWxzLk5hbWVzcGFjZU1hcDsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLnV0aWxzLk5hbWVzcGFjZVByZWZpeExpc3Q7Ci1pbXBvcnQgb3JnLnczYy5kb20uKjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZheC53c2RsLio7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUEFkZHJlc3M7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNjaGVtYS5TY2hlbWE7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEFkZHJlc3M7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAxMi5TT0FQMTJBZGRyZXNzOwotaW1wb3J0IGphdmF4LndzZGwuZmFjdG9yeS5XU0RMRmFjdG9yeTsKLWltcG9ydCBqYXZheC53c2RsLnhtbC5XU0RMUmVhZGVyOwotaW1wb3J0IGphdmF4LndzZGwueG1sLldTRExXcml0ZXI7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS5uZXQuU29ja2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29weU9uV3JpdGVBcnJheUxpc3Q7Ci0KLS8qKgotICogQ2xhc3MgQXhpc1NlcnZpY2UKLSAqLwotcHVibGljIGNsYXNzIEF4aXNTZXJ2aWNlIGV4dGVuZHMgQXhpc0Rlc2NyaXB0aW9uIHsKLQotCS8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQkvLyBTdGFuZGFyZCBQYXJhbWV0ZXIgbmFtZXMKLQotCS8qKgotCSAqIElmIHRoaXMgcGFyYW0gaXMgdHJ1ZSwgYW5kIHRoZSBzZXJ2aWNlIGhhcyBleGFjdGx5IG9uZSBBeGlzT3BlcmF0aW9uLAotCSAqIG5vcm1hbCBvcGVyYXRpb24gZGlzcGF0Y2ggKHZpYSBVUkkvc29hcEFjdGlvbi9ldGMpIHdpbGwgbm90IGJlIG5lY2Vzc2FyeSwKLQkgKiBhbmQgd2UnbGwganVzdCBkZWZhdWx0IHRvIGZ1bm5lbGluZyBhbGwgbWVzc2FnZXMgdG8gdGhhdCBvcC4gVGhpcyBpcwotCSAqIHVzZWZ1bCBmb3IgcGFzc3Rocm91Z2gvRVNCL2VtYmVkZGVkIGFwcGxpY2F0aW9ucy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVVBQT1JUX1NJTkdMRV9PUCA9ICJzdXBwb3J0U2luZ2xlT3BlcmF0aW9uIjsKLQkvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTVBPUlRfVEFHID0gImltcG9ydCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5DTFVERV9UQUcgPSAiaW5jbHVkZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NIRU1BX0xPQ0FUSU9OID0gInNjaGVtYUxvY2F0aW9uIjsKLQotCXByaXZhdGUgTWFwPFN0cmluZywgQXhpc0VuZHBvaW50PiBlbmRwb2ludE1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgQXhpc0VuZHBvaW50PigpOwotCi0JLyoKLQkgKiBUaGlzIGlzIGEgbWFwIGJldHdlZW4gdGhlIFFOYW1lIG9mIHRoZSBlbGVtZW50IG9mIGEgbWVzc2FnZSBzcGVjaWZpZWQgaW4KLQkgKiB0aGUgV1NETCBhbmQgYW4gT3BlcmF0aW9uLiBJdCBlbmFibGVzIFNPQVAgQm9keS1iYXNlZCBkaXNwYXRjaGluZyBmb3IKLQkgKiBkb2MtbGl0ZXJhbCBiaW5kaW5ncy4KLQkgKi8KLQlwcml2YXRlIE1hcDxRTmFtZSwgQXhpc09wZXJhdGlvbj4gbWVzc2FnZUVsZW1lbnRRTmFtZVRvT3BlcmF0aW9uTWFwID0gbmV3IEhhc2hNYXA8UU5hbWUsIEF4aXNPcGVyYXRpb24+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+ZmFsc2U8L3BhcmFtZXRlcj4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc01vZGlmeVVzZXJXU0RMUG9ydEFkZHJlc3MoKSB7Ci0JCVBhcmFtZXRlciBwYXJhbWV0ZXIgPSBnZXRQYXJhbWV0ZXIoIm1vZGlmeVVzZXJXU0RMUG9ydEFkZHJlc3MiKTsKLQkJaWYgKHBhcmFtZXRlciAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKSBwYXJhbWV0ZXIuZ2V0VmFsdWUoKTsKLQkJCWlmICgiZmFsc2UiLmVxdWFscyh2YWx1ZSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIFNlcnZpY2VMaWZlQ3ljbGUgZ2V0U2VydmljZUxpZmVDeWNsZSgpIHsKLQkJcmV0dXJuIHNlcnZpY2VMaWZlQ3ljbGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2VydmljZUxpZmVDeWNsZShTZXJ2aWNlTGlmZUN5Y2xlIHNlcnZpY2VMaWZlQ3ljbGUpIHsKLQkJdGhpcy5zZXJ2aWNlTGlmZUN5Y2xlID0gc2VydmljZUxpZmVDeWNsZTsKLQl9Ci0KLQlwdWJsaWMgTWFwIGdldFAybk1hcCgpIHsKLQkJcmV0dXJuIHAybk1hcDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQMm5NYXAoTWFwIHAybk1hcCkgewotCQl0aGlzLnAybk1hcCA9IHAybk1hcDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0U3VwcGxpZXIgZ2V0T2JqZWN0U3VwcGxpZXIoKSB7Ci0JCXJldHVybiBvYmplY3RTdXBwbGllcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRPYmplY3RTdXBwbGllcihPYmplY3RTdXBwbGllciBvYmplY3RTdXBwbGllcikgewotCQl0aGlzLm9iamVjdFN1cHBsaWVyID0gb2JqZWN0U3VwcGxpZXI7Ci0JfQotCi0JcHVibGljIFR5cGVUYWJsZSBnZXRUeXBlVGFibGUoKSB7Ci0JCXJldHVybiB0eXBlVGFibGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VHlwZVRhYmxlKFR5cGVUYWJsZSB0eXBlVGFibGUpIHsKLQkJdGhpcy50eXBlVGFibGUgPSB0eXBlVGFibGU7Ci0JfQotCi0JLyoqCi0JICogRmluZCBhIGRhdGEgbG9jYXRvciBmcm9tIHRoZSBhdmFpbGFibGUgZGF0YSBsb2NhdG9ycyAoYm90aCBjb25maWd1cmVkIGFuZAotCSAqIGRlZmF1bHQgb25lcykgdG8gcmV0cmlldmUgTWV0YWRhdGEgb3IgZGF0YSBzcGVjaWZpZWQgaW4gdGhlIHJlcXVlc3QuCi0JICogCi0JICogQHBhcmFtIHJlcXVlc3QKLQkgKiAgICAgICAgICAgIGFuIHtAbGluayBEYXRhUmV0cmlldmFsUmVxdWVzdH0gb2JqZWN0Ci0JICogQHBhcmFtIG1zZ0NvbnRleHQKLQkgKiAgICAgICAgICAgIG1lc3NhZ2UgY29udGV4dAotCSAqIEByZXR1cm4gYXJyYXkgb2Yge0BsaW5rIERhdGF9IG9iamVjdCBmb3IgdGhlIHJlcXVlc3QuCi0JICogQHRocm93cyBBeGlzRmF1bHQKLQkgKi8KLQotCXB1YmxpYyBEYXRhW10gZ2V0RGF0YShEYXRhUmV0cmlldmFsUmVxdWVzdCByZXF1ZXN0LAotCQkJTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0KLQkJRGF0YVtdIGRhdGE7Ci0JCVN0cmluZyBkaWFsZWN0ID0gcmVxdWVzdC5nZXREaWFsZWN0KCk7Ci0JCUF4aXNEYXRhTG9jYXRvciBkYXRhTG9jYXRvciA9IG51bGw7Ci0JCWludCBuZXh0RGF0YUxvY2F0b3JJbmRleCA9IDA7Ci0JCWludCB0b3RhbExvY2F0b3JzID0gYXZhaWxhYmxlRGF0YUxvY2F0b3JUeXBlcy5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdG90YWxMb2NhdG9yczsgaSsrKSB7Ci0JCQlkYXRhTG9jYXRvciA9IGdldERhdGFMb2NhdG9yKGF2YWlsYWJsZURhdGFMb2NhdG9yVHlwZXNbaV0sIGRpYWxlY3QpOwotCQkJaWYgKGRhdGFMb2NhdG9yICE9IG51bGwpIHsKLQkJCQluZXh0RGF0YUxvY2F0b3JJbmRleCA9IGkgKyAxOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJaWYgKGRhdGFMb2NhdG9yID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJZGF0YSA9IGRhdGFMb2NhdG9yLmdldERhdGEocmVxdWVzdCwgbXNnQ29udGV4dCk7Ci0JCS8vIE51bGwgbWVhbnMgRGF0YSBMb2NhdG9yIG5vdCB1bmRlcnN0b29kIHJlcXVlc3QuIEF1dG9tYXRpY2FsbHkgZmluZAotCQkvLyBEYXRhIExvY2F0b3IgaW4gdGhlIGhpZXJhcmNoeSB0byBwcm9jZXNzIHRoZSByZXF1ZXN0LgotCQlpZiAoZGF0YSA9PSBudWxsKSB7Ci0JCQlpZiAobmV4dERhdGFMb2NhdG9ySW5kZXggPCB0b3RhbExvY2F0b3JzKSB7Ci0JCQkJZGF0YSA9IGJ1YmJsZXVwRGF0YUxvY2F0b3JzKG5leHREYXRhTG9jYXRvckluZGV4LCByZXF1ZXN0LAotCQkJCQkJbXNnQ29udGV4dCk7Ci0JCQl9Ci0KLQkJfQotCQlyZXR1cm4gZGF0YTsKLQl9Ci0KLQkvKgotCSAqIFRvIHNlYXJjaCB0aGUgbmV4dCBEYXRhIExvY2F0b3IgZnJvbSB0aGUgYXZhaWxhYmxlIERhdGEgTG9jYXRvcnMgdGhhdAotCSAqIHVuZGVyc3Rvb2QgdGhlIGRhdGEgcmV0cmlldmFsIHJlcXVlc3QuCi0JICovCi0JcHJpdmF0ZSBEYXRhW10gYnViYmxldXBEYXRhTG9jYXRvcnMoaW50IG5leHRJbmRleCwKLQkJCURhdGFSZXRyaWV2YWxSZXF1ZXN0IHJlcXVlc3QsIE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpCi0JCQl0aHJvd3MgQXhpc0ZhdWx0IHsKLQkJRGF0YVtdIGRhdGEgPSBudWxsOwotCQlpZiAobmV4dEluZGV4IDwgYXZhaWxhYmxlRGF0YUxvY2F0b3JUeXBlcy5sZW5ndGgpIHsKLQkJCUF4aXNEYXRhTG9jYXRvciBkYXRhTG9jYXRvciA9IGdldERhdGFMb2NhdG9yKAotCQkJCQlhdmFpbGFibGVEYXRhTG9jYXRvclR5cGVzW25leHRJbmRleF0sIHJlcXVlc3QuZ2V0RGlhbGVjdCgpKTsKLQkJCW5leHRJbmRleCsrOwotCQkJaWYgKGRhdGFMb2NhdG9yICE9IG51bGwpIHsKLQkJCQlkYXRhID0gZGF0YUxvY2F0b3IuZ2V0RGF0YShyZXF1ZXN0LCBtc2dDb250ZXh0KTsKLQkJCQlpZiAoZGF0YSA9PSBudWxsKSB7Ci0JCQkJCWRhdGEgPSBidWJibGV1cERhdGFMb2NhdG9ycyhuZXh0SW5kZXgsIHJlcXVlc3QsIG1zZ0NvbnRleHQpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJldHVybiBkYXRhOwotCQkJCX0KLQotCQkJfSBlbHNlIHsKLQkJCQlkYXRhID0gYnViYmxldXBEYXRhTG9jYXRvcnMobmV4dEluZGV4LCByZXF1ZXN0LCBtc2dDb250ZXh0KTsKLQkJCX0KLQotCQl9Ci0JCXJldHVybiBkYXRhOwotCX0KLQotCS8qKgotCSAqIFNhdmUgZGF0YSBMb2NhdG9yIGNvbmZpZ3VyZWQgYXQgc2VydmljZSBsZXZlbCBmb3IgdGhpcyBBeGlzIFNlcnZpY2UKLQkgKiAKLQkgKiBAcGFyYW0gZGlhbGVjdC0KLQkgKiAgICAgICAgICAgIGFuIGFic29sdXRlIFVSSSByZXByZXNlbnRzIHRoZSBEaWFsZWN0IGkuZS4gV1NETCwgUG9saWN5LAotCSAqICAgICAgICAgICAgU2NoZW1hIG9yICJTZXJ2aWNlTGV2ZWwiIGZvciBub24tZGlhbGVjdCBzZXJ2aWNlIGxldmVsIGRhdGEKLQkgKiAgICAgICAgICAgIGxvY2F0b3IuCi0JICogQHBhcmFtIGRhdGFMb2NhdG9yQ2xhc3NOYW1lIC0KLQkgKiAgICAgICAgICAgIGNsYXNzIG5hbWUgb2YgdGhlIERhdGEgTG9jYXRvciBjb25maWd1cmVkIHRvIHN1cHBvcnQgZGF0YQotCSAqICAgICAgICAgICAgcmV0cmlldmFsIGZvciB0aGUgc3BlY2lmaWVkIGRpYWxlY3QuCi0JICovCi0JcHVibGljIHZvaWQgYWRkRGF0YUxvY2F0b3JDbGFzc05hbWVzKFN0cmluZyBkaWFsZWN0LAotCQkJU3RyaW5nIGRhdGFMb2NhdG9yQ2xhc3NOYW1lKSB7Ci0JCWRhdGFMb2NhdG9yQ2xhc3NOYW1lcy5wdXQoZGlhbGVjdCwgZGF0YUxvY2F0b3JDbGFzc05hbWUpOwotCX0KLQotCS8qCi0JICogR2V0IGRhdGEgbG9jYXRvciBpbnN0YW5jZSBiYXNlZCBvbiB0aGUgTG9jYXRvclR5cGUgYW5kIGRpYWxlY3QuCi0JICovCi0JcHVibGljIEF4aXNEYXRhTG9jYXRvciBnZXREYXRhTG9jYXRvcihMb2NhdG9yVHlwZSBsb2NhdG9yVHlwZSwKLQkJCVN0cmluZyBkaWFsZWN0KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLQkJQXhpc0RhdGFMb2NhdG9yIGxvY2F0b3I7Ci0JCWlmIChsb2NhdG9yVHlwZSA9PSBMb2NhdG9yVHlwZS5TRVJWSUNFX0RJQUxFQ1QpIHsKLQkJCWxvY2F0b3IgPSBnZXRTZXJ2aWNlRGF0YUxvY2F0b3IoZGlhbGVjdCk7Ci0JCX0gZWxzZSBpZiAobG9jYXRvclR5cGUgPT0gTG9jYXRvclR5cGUuU0VSVklDRV9MRVZFTCkgewotCQkJbG9jYXRvciA9IGdldFNlcnZpY2VEYXRhTG9jYXRvcihEUkNvbnN0YW50cy5TRVJWSUNFX0xFVkVMKTsKLQkJfSBlbHNlIGlmIChsb2NhdG9yVHlwZSA9PSBMb2NhdG9yVHlwZS5HTE9CQUxfRElBTEVDVCkgewotCQkJbG9jYXRvciA9IGdldEdsb2JhbERhdGFMb2NhdG9yKGRpYWxlY3QpOwotCQl9IGVsc2UgaWYgKGxvY2F0b3JUeXBlID09IExvY2F0b3JUeXBlLkdMT0JBTF9MRVZFTCkgewotCQkJbG9jYXRvciA9IGdldEdsb2JhbERhdGFMb2NhdG9yKERSQ29uc3RhbnRzLkdMT0JBTF9MRVZFTCk7Ci0JCX0gZWxzZSBpZiAobG9jYXRvclR5cGUgPT0gTG9jYXRvclR5cGUuREVGQVVMVF9BWElTKSB7Ci0JCQlsb2NhdG9yID0gZ2V0RGVmYXVsdERhdGFMb2NhdG9yKCk7Ci0JCX0gZWxzZSB7Ci0JCQlsb2NhdG9yID0gZ2V0RGVmYXVsdERhdGFMb2NhdG9yKCk7Ci0JCX0KLQotCQlyZXR1cm4gbG9jYXRvcjsKLQl9Ci0KLQkvLyBSZXR1cm4gZGVmYXVsdCBBeGlzMiBEYXRhIExvY2F0b3IKLQlwcml2YXRlIEF4aXNEYXRhTG9jYXRvciBnZXREZWZhdWx0RGF0YUxvY2F0b3IoKQotCQkJdGhyb3dzIERhdGFSZXRyaWV2YWxFeGNlcHRpb24gewotCi0JCWlmIChkZWZhdWx0RGF0YUxvY2F0b3IgPT0gbnVsbCkgewotCQkJZGVmYXVsdERhdGFMb2NhdG9yID0gbmV3IEF4aXNEYXRhTG9jYXRvckltcGwodGhpcyk7Ci0JCX0KLQotCQlkZWZhdWx0RGF0YUxvY2F0b3IubG9hZFNlcnZpY2VEYXRhKCk7Ci0KLQkJcmV0dXJuIGRlZmF1bHREYXRhTG9jYXRvcjsKLQl9Ci0KLQkvKgotCSAqIENoZWNrcyBpZiBzZXJ2aWNlIGxldmVsIGRhdGEgbG9jYXRvciBjb25maWd1cmVkIGZvciBzcGVjaWZpZWQgZGlhbGVjdC4KLQkgKiBSZXR1cm5zIGFuIGluc3RhbmNlIG9mIHRoZSBkYXRhIGxvY2F0b3IgaWYgZXhpc3RzLCBhbmQgbnVsbCBvdGhlcndpc2UuCi0JICovCi0JcHJpdmF0ZSBBeGlzRGF0YUxvY2F0b3IgZ2V0U2VydmljZURhdGFMb2NhdG9yKFN0cmluZyBkaWFsZWN0KQotCQkJdGhyb3dzIEF4aXNGYXVsdCB7Ci0JCUF4aXNEYXRhTG9jYXRvciBsb2NhdG9yOwotCQlsb2NhdG9yID0gKEF4aXNEYXRhTG9jYXRvcikgZGF0YUxvY2F0b3JzLmdldChkaWFsZWN0KTsKLQkJaWYgKGxvY2F0b3IgPT0gbnVsbCkgewotCQkJU3RyaW5nIGNsYXNzTmFtZSA9IChTdHJpbmcpIGRhdGFMb2NhdG9yQ2xhc3NOYW1lcy5nZXQoZGlhbGVjdCk7Ci0JCQlpZiAoY2xhc3NOYW1lICE9IG51bGwpIHsKLQkJCQlsb2NhdG9yID0gbG9hZERhdGFMb2NhdG9yKGNsYXNzTmFtZSk7Ci0JCQkJZGF0YUxvY2F0b3JzLnB1dChkaWFsZWN0LCBsb2NhdG9yKTsKLQkJCX0KLQotCQl9Ci0KLQkJcmV0dXJuIGxvY2F0b3I7Ci0KLQl9Ci0KLQkvKgotCSAqIENoZWNrcyBpZiBnbG9iYWwgbGV2ZWwgZGF0YSBsb2NhdG9yIGNvbmZpZ3VyZWQgZm9yIHNwZWNpZmllZCBkaWFsZWN0LgotCSAqIEBwYXJhbSBkaWFsZWN0LSBhbiBhYnNvbHV0ZSBVUkkgcmVwcmVzZW50cyB0aGUgRGlhbGVjdCBpLmUuIFdTREwsIFBvbGljeSwKLQkgKiBTY2hlbWEgb3IgIkdsb2JhbExldmVsIiBmb3Igbm9uLWRpYWxlY3QgR2xvYmFsIGxldmVsIGRhdGEgbG9jYXRvci4KLQkgKiBSZXR1cm5zIGFuIGluc3RhbmNlIG9mIHRoZSBkYXRhIGxvY2F0b3IgaWYgZXhpc3RzLCBhbmQgbnVsbCBvdGhlcndpc2UuCi0JICovCi0KLQlwdWJsaWMgQXhpc0RhdGFMb2NhdG9yIGdldEdsb2JhbERhdGFMb2NhdG9yKFN0cmluZyBkaWFsZWN0KQotCQkJdGhyb3dzIEF4aXNGYXVsdCB7Ci0JCUF4aXNDb25maWd1cmF0aW9uIGF4aXNDb25maWcgPSBnZXRBeGlzQ29uZmlndXJhdGlvbigpOwotCQlBeGlzRGF0YUxvY2F0b3IgbG9jYXRvciA9IG51bGw7Ci0JCWlmIChheGlzQ29uZmlnICE9IG51bGwpIHsKLQkJCWxvY2F0b3IgPSBheGlzQ29uZmlnLmdldERhdGFMb2NhdG9yKGRpYWxlY3QpOwotCQkJaWYgKGxvY2F0b3IgPT0gbnVsbCkgewotCQkJCVN0cmluZyBjbGFzc05hbWUgPSBheGlzQ29uZmlnLmdldERhdGFMb2NhdG9yQ2xhc3NOYW1lKGRpYWxlY3QpOwotCQkJCWlmIChjbGFzc05hbWUgIT0gbnVsbCkgewotCQkJCQlsb2NhdG9yID0gbG9hZERhdGFMb2NhdG9yKGNsYXNzTmFtZSk7Ci0JCQkJCWF4aXNDb25maWcuYWRkRGF0YUxvY2F0b3IoZGlhbGVjdCwgbG9jYXRvcik7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGxvY2F0b3I7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgQXhpc0RhdGFMb2NhdG9yIGxvYWREYXRhTG9jYXRvcihTdHJpbmcgY2xhc3NOYW1lKQotCQkJdGhyb3dzIEF4aXNGYXVsdCB7Ci0KLQkJQXhpc0RhdGFMb2NhdG9yIGxvY2F0b3I7Ci0KLQkJdHJ5IHsKLQkJCUNsYXNzIGRhdGFMb2NhdG9yOwotCQkJZGF0YUxvY2F0b3IgPSBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSwgdHJ1ZSwgc2VydmljZUNsYXNzTG9hZGVyKTsKLQkJCWxvY2F0b3IgPSAoQXhpc0RhdGFMb2NhdG9yKSBkYXRhTG9jYXRvci5uZXdJbnN0YW5jZSgpOwotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IEF4aXNGYXVsdC5tYWtlRmF1bHQoZSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKTsKLQkJfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBBeGlzRmF1bHQubWFrZUZhdWx0KGUpOwotCi0JCX0KLQotCQlyZXR1cm4gbG9jYXRvcjsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIG1hcCBvZiBXU0RMIG1lc3NhZ2UgZWxlbWVudCBRTmFtZXMgdG8gQXhpc09wZXJhdGlvbnMgZm9yIHRoaXMKLQkgKiBzZXJ2aWNlLiBUaGlzIG1hcCBpcyB1c2VkIGR1cmluZyBTT0FQIEJvZHktYmFzZWQgcm91dGluZyBmb3IKLQkgKiBkb2N1bWVudC9saXRlcmFsIGJhcmUgc2VydmljZXMgdG8gbWF0Y2ggdGhlIGZpcnN0IGNoaWxkIGVsZW1lbnQgb2YgdGhlCi0JICogU09BUCBCb2R5IGVsZW1lbnQgdG8gYW4gb3BlcmF0aW9uLiAoUm91dGluZyBmb3IgUlBDIGFuZCBkb2N1bWVudC9saXRlcmFsCi0JICogd3JhcHBlZCBzZXJ2aWNlcyBvY2N1cnMgdmlhIHRoZSBvcGVyYXRpb25zQWxpYXNlc01hcC4pIDxwLz4gRnJvbSBzZWN0aW9uCi0JICogNC43LjYgb2YgdGhlIFdTLUkgQlAgMS4xOiB0aGUgIm9wZXJhdGlvbiBzaWduYXR1cmUiIGlzICJ0aGUgZnVsbHkKLQkgKiBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgY2hpbGQgZWxlbWVudCBvZiBTT0FQIGJvZHkgb2YgdGhlIFNPQVAgaW5wdXQKLQkgKiBtZXNzYWdlIGRlc2NyaWJlZCBieSBhbiBvcGVyYXRpb24gaW4gYSBXU0RMIGJpbmRpbmcsIiBhbmQgdGh1cyB0aGlzIG1hcAotCSAqIG11c3QgYmUgZnJvbSBhIFFOYW1lIHRvIGFuIG9wZXJhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gbWVzc2FnZUVsZW1lbnRRTmFtZVRvT3BlcmF0aW9uTWFwCi0JICogICAgICAgICAgICBUaGUgbWFwIGZyb20gV1NETCBtZXNzYWdlIGVsZW1lbnQgUU5hbWVzIHRvIEF4aXNPcGVyYXRpb25zLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1lc3NhZ2VFbGVtZW50UU5hbWVUb09wZXJhdGlvbk1hcCgKLQkJCU1hcCBtZXNzYWdlRWxlbWVudFFOYW1lVG9PcGVyYXRpb25NYXApIHsKLQkJdGhpcy5tZXNzYWdlRWxlbWVudFFOYW1lVG9PcGVyYXRpb25NYXAgPSBtZXNzYWdlRWxlbWVudFFOYW1lVG9PcGVyYXRpb25NYXA7Ci0JfQotCi0JLyoqCi0JICogTG9vayB1cCBhbiBBeGlzT3BlcmF0aW9uIGZvciB0aGlzIHNlcnZpY2UgYmFzZWQgb2ZmIG9mIGFuIGVsZW1lbnQgUU5hbWUKLQkgKiBmcm9tIGEgV1NETCBtZXNzYWdlIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIG1lc3NhZ2VFbGVtZW50UU5hbWUKLQkgKiAgICAgICAgICAgIFRoZSBRTmFtZSB0byBzZWFyY2ggZm9yLgotCSAqIEByZXR1cm4gVGhlIEF4aXNPcGVyYXRpb24gcmVnaXN0ZXJlZCB0byB0aGUgUU5hbWUgb3IgbnVsbCBpZiBubyBtYXRjaCB3YXMKLQkgKiAgICAgICAgIGZvdW5kLgotCSAqIEBzZWUgI3NldE1lc3NhZ2VFbGVtZW50UU5hbWVUb09wZXJhdGlvbk1hcChNYXApCi0JICovCi0JcHVibGljIEF4aXNPcGVyYXRpb24gZ2V0T3BlcmF0aW9uQnlNZXNzYWdlRWxlbWVudFFOYW1lKAotCQkJUU5hbWUgbWVzc2FnZUVsZW1lbnRRTmFtZSkgewotCQlyZXR1cm4gKEF4aXNPcGVyYXRpb24pIG1lc3NhZ2VFbGVtZW50UU5hbWVUb09wZXJhdGlvbk1hcAotCQkJCS5nZXQobWVzc2FnZUVsZW1lbnRRTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQWRkIGFuIGVudHJ5IHRvIHRoZSBtYXAgYmV0d2VlbiBlbGVtZW50IFFOYW1lcyBpbiBXU0RMIG1lc3NhZ2VzIGFuZAotCSAqIEF4aXNPcGVyYXRpb25zIGZvciB0aGlzIHNlcnZpY2UuCi0JICogCi0JICogQHBhcmFtIG1lc3NhZ2VFbGVtZW50UU5hbWUKLQkgKiAgICAgICAgICAgIFRoZSBRTmFtZSBvZiB0aGUgZWxlbWVudCBvbiB0aGUgaW5wdXQgbWVzc2FnZSB0aGF0IG1hcHMgdG8gdGhlCi0JICogICAgICAgICAgICBnaXZlbiBvcGVyYXRpb24uCi0JICogQHBhcmFtIG9wZXJhdGlvbgotCSAqICAgICAgICAgICAgVGhlIEF4aXNPcGVyYXRpb24gdG8gYmUgbWFwcGVkIHRvLgotCSAqIEBzZWUgI3NldE1lc3NhZ2VFbGVtZW50UU5hbWVUb09wZXJhdGlvbk1hcChNYXApCi0JICovCi0JcHVibGljIHZvaWQgYWRkTWVzc2FnZUVsZW1lbnRRTmFtZVRvT3BlcmF0aW9uTWFwcGluZygKLQkJCVFOYW1lIG1lc3NhZ2VFbGVtZW50UU5hbWUsIEF4aXNPcGVyYXRpb24gb3BlcmF0aW9uKSB7Ci0JCS8vIHdoZW4gc2V0dGluZyBhbiBvcGVyYXRpb24gd2UgaGF2ZSB0byBzZXQgaXQgb25seSBpZiB0aGUKLQkJLy8gbWVzc2VnZUVsZW1lbnRRTmFtZSBkb2VzIG5vdAotCQkvLyBleGlzdHMgaW4gdGhlIG1hcC4KLQkJLy8gZG9lcyBleGlzdHMgbWVhbnMgdGhlcmUgYXJlIHR3byBvciBtb3JlIG9wZXJhdGlvbnMgd2hpY2ggaGFzIHRoZSBzYW1lCi0JCS8vIGlucHV0IGVsZW1lbnQgKGluIGRvYy9saXRlcmFsCi0JCS8vIHRoaXMgaXMgcG9zc2libGUuIEluIHRoaXMgY2FzZSBiZXR0ZXIgdG8gc2V0IGl0IGFzIG51bGwgd2l0aG91dAotCQkvLyBnaXZpbmcKLQkJLy8gYSByYW5kb20gb3BlcmF0aW9uLgotCQlpZiAobWVzc2FnZUVsZW1lbnRRTmFtZVRvT3BlcmF0aW9uTWFwLmNvbnRhaW5zS2V5KG1lc3NhZ2VFbGVtZW50UU5hbWUpCi0JCQkJJiYgbWVzc2FnZUVsZW1lbnRRTmFtZVRvT3BlcmF0aW9uTWFwLmdldChtZXNzYWdlRWxlbWVudFFOYW1lKSAhPSBvcGVyYXRpb24pIHsKLQkJCW1lc3NhZ2VFbGVtZW50UU5hbWVUb09wZXJhdGlvbk1hcC5wdXQobWVzc2FnZUVsZW1lbnRRTmFtZSwgbnVsbCk7Ci0JCX0gZWxzZSB7Ci0JCQltZXNzYWdlRWxlbWVudFFOYW1lVG9PcGVyYXRpb25NYXAucHV0KG1lc3NhZ2VFbGVtZW50UU5hbWUsCi0JCQkJCW9wZXJhdGlvbik7Ci0JCX0KLQotCX0KLQotCS8vIEBkZXByZWNhdGVkIC0gdXNlIGdldEVuZHBvaW50VVJMIGluIGF4aXNFbmRwb2ludAotCXB1YmxpYyBTdHJpbmcgZ2V0RW5kcG9pbnRVUkwoKSB7Ci0JCXJldHVybiBlbmRwb2ludFVSTDsKLQl9Ci0KLQkvLyBAZGVwcmVjYXRlZCAtIHVzZSBzZXRFbmRwb2ludFVSTCBpbiBheGlzRW5kcG9pbnQKLQlwdWJsaWMgdm9pZCBzZXRFbmRwb2ludFVSTChTdHJpbmcgZW5kcG9pbnRVUkwpIHsKLQkJdGhpcy5lbmRwb2ludFVSTCA9IGVuZHBvaW50VVJMOwotCX0KLQotCS8vIFRPRE8gOiBFeHBsYWluIHdoYXQgZ29lcyBpbiB0aGlzIG1hcCEKLQlwdWJsaWMgTWFwPFN0cmluZywgQXhpc0VuZHBvaW50PiBnZXRFbmRwb2ludHMoKSB7Ci0JCXJldHVybiBlbmRwb2ludE1hcDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0N1c3RvbVdzZGwoKSB7Ci0JCXJldHVybiBjdXN0b21Xc2RsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEN1c3RvbVdzZGwoYm9vbGVhbiBjdXN0b21Xc2RsKSB7Ci0JCXRoaXMuY3VzdG9tV3NkbCA9IGN1c3RvbVdzZGw7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0T3BlcmF0aW9uc05hbWVMaXN0KCkgewotCQlyZXR1cm4gb3BlcmF0aW9uc05hbWVMaXN0OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE9wZXJhdGlvbnNOYW1lTGlzdChMaXN0IG9wZXJhdGlvbnNOYW1lTGlzdCkgewotCQl0aGlzLm9wZXJhdGlvbnNOYW1lTGlzdCA9IG9wZXJhdGlvbnNOYW1lTGlzdDsKLQl9Ci0KLQlwdWJsaWMgQXhpc1NlcnZpY2VHcm91cCBnZXRBeGlzU2VydmljZUdyb3VwKCkgewotCQlyZXR1cm4gKEF4aXNTZXJ2aWNlR3JvdXApIHBhcmVudDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnQoQXhpc1NlcnZpY2VHcm91cCBwYXJlbnQpIHsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIGdldE5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgRXhjbHVkZUluZm8gZ2V0RXhjbHVkZUluZm8oKSB7Ci0JCXJldHVybiBleGNsdWRlSW5mbzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFeGNsdWRlSW5mbyhFeGNsdWRlSW5mbyBleGNsdWRlSW5mbykgewotCQl0aGlzLmV4Y2x1ZGVJbmZvID0gZXhjbHVkZUluZm87Ci0JfQotCi0JcHVibGljIHZvaWQgcmVnaXN0ZXJQb2xpY3koU3RyaW5nIGtleSwgUG9saWN5IHBvbGljeSkgewotCQlwb2xpY3lNYXAucHV0KGtleSwgcG9saWN5KTsKLQl9Ci0KLQlwdWJsaWMgUG9saWN5IGxvb2t1cFBvbGljeShTdHJpbmcga2V5KSB7Ci0JCXJldHVybiAoUG9saWN5KSBwb2xpY3lNYXAuZ2V0KGtleSk7Ci0JfQotICAgIAotICAgIC8qKgotICAgICAqIEFkZCBhIFNlcnZpY2VDb250ZXh0TGlzdGVuZXIKLSAgICAgKiBAcGFyYW0gc2NsCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkTWVzc2FnZUNvbnRleHRMaXN0ZW5lcihNZXNzYWdlQ29udGV4dExpc3RlbmVyIHNjbCkgewotICAgICAgICBtZXNzYWdlQ29udGV4dExpc3RlbmVycy5hZGQoc2NsKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmVtb3ZlIGEgU2VydmljZUNvbnRleHRMaXN0ZW5lcgotICAgICAqIEBwYXJhbSBzY2wKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVNZXNzYWdlQ29udGV4dExpc3RlbmVyKE1lc3NhZ2VDb250ZXh0TGlzdGVuZXIgc2NsKSB7Ci0gICAgICAgIG1lc3NhZ2VDb250ZXh0TGlzdGVuZXJzLnJlbW92ZShzY2wpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAcGFyYW0gY2xzIENsYXNzIG9mIFNlcnZpY2VDb250ZXh0TGlzdGVuZXIKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgU2VydmljZUNvbnRleHRMaXN0ZXIgaXMgaW4gdGhlIGxpc3QKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNNZXNzYWdlQ29udGV4dExpc3RlbmVyKENsYXNzIGNscykgewotICAgICAgICBmb3IgKGludCBpPTA7IGk8bWVzc2FnZUNvbnRleHRMaXN0ZW5lcnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChtZXNzYWdlQ29udGV4dExpc3RlbmVycy5nZXQoaSkuZ2V0Q2xhc3MoKSA9PSBjbHMpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFNpZ25hbCBhbiBBdHRhY2ggU2VydmljZUNvbnRleHQgRXZlbnQKLSAgICAgKiBAcGFyYW0gc2MgU2VydmljZUNvbnRleHQKLSAgICAgKiBAcGFyYW0gbWMgTWVzc2FnZUNvbnRleHQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhdHRhY2hTZXJ2aWNlQ29udGV4dEV2ZW50KFNlcnZpY2VDb250ZXh0IHNjLCBNZXNzYWdlQ29udGV4dCBtYykgewotICAgICAgICBmb3IgKGludCBpPTA7IGk8bWVzc2FnZUNvbnRleHRMaXN0ZW5lcnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIG1lc3NhZ2VDb250ZXh0TGlzdGVuZXJzLmdldChpKS5hdHRhY2hTZXJ2aWNlQ29udGV4dEV2ZW50KHNjLCBtYyk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2lnbmFsIGFuIEF0dGFjaCBFbnZlbG9wZSBFdmVudAotICAgICAqIEBwYXJhbSBtYyBNZXNzYWdlQ29udGV4dAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGF0dGFjaEVudmVsb3BlRXZlbnQoTWVzc2FnZUNvbnRleHQgbWMpIHsKLSAgICAgICAgZm9yIChpbnQgaT0wOyBpPG1lc3NhZ2VDb250ZXh0TGlzdGVuZXJzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBtZXNzYWdlQ29udGV4dExpc3RlbmVycy5nZXQoaSkuYXR0YWNoRW52ZWxvcGVFdmVudChtYyk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vQXhpc1NlcnZpY2UyV1NETDExLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vQXhpc1NlcnZpY2UyV1NETDExLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjYjlkZWYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL0F4aXNTZXJ2aWNlMldTREwxMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM0MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVAxMUNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUDEyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5BZGRyZXNzaW5nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5BZGRyZXNzaW5nSGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uamF2YTJ3c2RsLkphdmEyV1NETENvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLm5hbWVzcGFjZS5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLlhNTFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5TT0FQSGVhZGVyTWVzc2FnZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuV1NETENvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLm5lZXRoaS5Qb2xpY3k7Ci1pbXBvcnQgb3JnLmFwYWNoZS5uZWV0aGkuUG9saWN5Q29tcG9uZW50OwotaW1wb3J0IG9yZy5hcGFjaGUubmVldGhpLlBvbGljeVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLm5lZXRoaS5Qb2xpY3lSZWdpc3RyeTsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYTsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLXB1YmxpYyBjbGFzcyBBeGlzU2VydmljZTJXU0RMMTEgaW1wbGVtZW50cyBKYXZhMldTRExDb25zdGFudHMgewotCi0JcHJpdmF0ZSBBeGlzU2VydmljZSBheGlzU2VydmljZTsKLQotCXByaXZhdGUgU3RyaW5nIHNlcnZpY2VOYW1lOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlOwotCi0JcHJpdmF0ZSBPTUVsZW1lbnQgZGVmaW5pdGlvbjsKLQotCXByaXZhdGUgT01OYW1lc3BhY2Ugc29hcDsKLQotCXByaXZhdGUgT01OYW1lc3BhY2Ugc29hcDEyOwotCi0JcHJpdmF0ZSBPTU5hbWVzcGFjZSBodHRwOwotCi0JcHJpdmF0ZSBPTU5hbWVzcGFjZSBtaW1lOwotCi0JcHJpdmF0ZSBPTU5hbWVzcGFjZSB0bnM7Ci0KLQlwcml2YXRlIE9NTmFtZXNwYWNlIHdzZGw7Ci0KLQlwcml2YXRlIE9NTmFtZXNwYWNlIHdzYXc7Ci0KLQlwcml2YXRlIFN0cmluZyBzdHlsZSA9IERPQ1VNRU5UOwotCi0JcHJpdmF0ZSBTdHJpbmcgdXNlID0gTElURVJBTDsKLQotCXByaXZhdGUgSGFzaE1hcCBwb2xpY2llc0luRGVmaW5pdGlvbnM7Ci0KLQlwcml2YXRlIEV4dGVybmFsUG9saWN5U2VyaWFsaXplciBzZXJpYWxpemVyOwotCi0JcHJpdmF0ZSBIYXNoTWFwIG1lc3NhZ2VzTWFwOwotCi0gICAgcHVibGljIEF4aXNTZXJ2aWNlMldTREwxMShBeGlzU2VydmljZSBzZXJ2aWNlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5heGlzU2VydmljZSA9IHNlcnZpY2U7Ci0gICAgICAgIHRoaXMuc2VydmljZU5hbWUgPSBzZXJ2aWNlLmdldE5hbWUoKTsKLSAgICAgICAgaW5pdCgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0KCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0vKgotCQkvLyB0aGUgRVBSIGxpc3Qgb2YgQXhpc1NlcnZpY2UgY29udGFpbnMgUkVTVCBFUFJzIGFzIHdlbGwuIFRob3NlIFJFU1QKLQkJLy8gRVBScyB3aWxsIGJlIHVzZWQgdG8gZ2VuZXJhdGVkIEhUVFBCaW5kaW5nCi0JCS8vIGFuZCByZXN0IG9mIHRoZSBFUFJzIHdpbGwgYmUgdXNlZCB0byBnZW5lcmF0ZSBTT0FQIDEuMSBhbmQgMS4yCi0JCS8vIGJpbmRpbmdzLiBMZXQncyBmaXJzdCBpbml0aWFsaXplIHRob3NlIHNldCBvZgotCQkvLyBFUFJzIG5vdyB0byBiZSB1c2VkIGxhdGVyLCBlc3BlY2lhbGx5IHdoZW4gd2UgZ2VuZXJhdGUgdGhlIFdTREwuCi0gICAgICAgIFN0cmluZ1tdIHNlcnZpY2VFbmRwb2ludFVSTHMgPSBheGlzU2VydmljZS5nZXRFUFJzKCk7Ci0JCWlmIChzZXJ2aWNlRW5kcG9pbnRVUkxzID09IG51bGwpIHsKLQkJCU1hcCBlbmRwb2ludE1hcCA9IGF4aXNTZXJ2aWNlLmdldEVuZHBvaW50cygpOwotCQkJaWYgKGVuZHBvaW50TWFwLnNpemUoKSA+IDApIHsKLQkJCQlJdGVyYXRvciBlbmRwb2ludEl0ciA9IGVuZHBvaW50TWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCQkJaWYgKGVuZHBvaW50SXRyLmhhc05leHQoKSkgewotCQkJCQlBeGlzRW5kcG9pbnQgZW5kcG9pbnQgPSAoQXhpc0VuZHBvaW50KSBlbmRwb2ludEl0ci5uZXh0KCk7Ci0JCQkJCXNlcnZpY2VFbmRwb2ludFVSTHMgPSBuZXcgU3RyaW5nW10geyBlbmRwb2ludAotCQkJCQkJCS5nZXRFbmRwb2ludFVSTCgpIH07Ci0JCQkJfQotCi0JCQl9IGVsc2UgewotCQkJCXNlcnZpY2VFbmRwb2ludFVSTHMgPSBuZXcgU3RyaW5nW10geyBheGlzU2VydmljZQotCQkJCQkJLmdldEVuZHBvaW50TmFtZSgpIH07Ci0JCQl9Ci0JCX0KLSovCi0JCXRoaXMudGFyZ2V0TmFtZXNwYWNlID0gYXhpc1NlcnZpY2UuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0KLQkJc2VyaWFsaXplciA9IG5ldyBFeHRlcm5hbFBvbGljeVNlcmlhbGl6ZXIoKTsKLQkJLy8gQ0hFQ0tNRSBjaGVjayB3aGV0aGVyIHNlcnZpY2UuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKSByZXR1cm4gbnVsbCA/Pz8KLQotCQlBeGlzQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uID0gYXhpc1NlcnZpY2UuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKTsKLQkJaWYgKGNvbmZpZ3VyYXRpb24gIT0gbnVsbCkgewotCQkJc2VyaWFsaXplci5zZXRBc3NlcnRpb25zVG9GaWx0ZXIoY29uZmlndXJhdGlvbgotCQkJCQkuZ2V0TG9jYWxQb2xpY3lBc3NlcnRpb25zKCkpOwotCQl9Ci0JfQotCi0JcHVibGljIEF4aXNTZXJ2aWNlMldTREwxMShBeGlzU2VydmljZSBzZXJ2aWNlLCBTdHJpbmcgc2VydmljZU5hbWUpCi0JCQl0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5heGlzU2VydmljZSA9IHNlcnZpY2U7Ci0JCXRoaXMuc2VydmljZU5hbWUgPSBzZXJ2aWNlTmFtZTsKLQkJaW5pdCgpOwotCX0KLQotICAgIC8qKgotICAgICAqIEJ1aWxkIHRoZSBPTSBzdHJ1Y3R1cmUgb2YgdGhlIFdTREwgZG9jdW1lbnQKLSAgICAgKgotICAgICAqIEByZXR1cm4gYW4gT01FbGVtZW50IGNvbnRhaW5pbmcgYSBXU0RMIGRvY3VtZW50Ci0gICAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgT01FbGVtZW50IGdlbmVyYXRlT00oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlPTUZhY3RvcnkgZmFjID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCk7Ci0JCXdzZGwgPSBmYWMuY3JlYXRlT01OYW1lc3BhY2UoV1NETF9OQU1FU1BBQ0UsIERFRkFVTFRfV1NETF9OQU1FU1BBQ0VfUFJFRklYKTsKLQkJT01FbGVtZW50IGVsZSA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoImRlZmluaXRpb25zIiwgd3NkbCk7Ci0JCXNldERlZmluaXRpb25FbGVtZW50KGVsZSk7Ci0KLQkJcG9saWNpZXNJbkRlZmluaXRpb25zID0gbmV3IEhhc2hNYXAoKTsKLQotCQlNYXAgbmFtZXNwYWNlTWFwID0gYXhpc1NlcnZpY2UuZ2V0TmFtZXNwYWNlTWFwKCk7Ci0JCWlmIChuYW1lc3BhY2VNYXAgPT0gbnVsbCkKLQkJCW5hbWVzcGFjZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkJV1NETFNlcmlhbGl6YXRpb25VdGlsLnBvcHVsYXRlTmFtZXNwYWNlcyhlbGUsIG5hbWVzcGFjZU1hcCk7Ci0JCXNvYXAgPSBlbGUuZGVjbGFyZU5hbWVzcGFjZShVUklfV1NETDExX1NPQVAsIFNPQVAxMV9QUkVGSVgpOwotCQlzb2FwMTIgPSBlbGUuZGVjbGFyZU5hbWVzcGFjZShVUklfV1NETDEyX1NPQVAsIFNPQVAxMl9QUkVGSVgpOwotCQlodHRwID0gZWxlLmRlY2xhcmVOYW1lc3BhY2UoSFRUUF9OQU1FU1BBQ0UsIEhUVFBfUFJFRklYKTsKLQkJbWltZSA9IGVsZS5kZWNsYXJlTmFtZXNwYWNlKE1JTUVfTkFNRVNQQUNFLCBNSU1FX1BSRUZJWCk7Ci0JCXdzYXcgPSBlbGUuZGVjbGFyZU5hbWVzcGFjZShBZGRyZXNzaW5nQ29uc3RhbnRzLkZpbmFsLldTQVdfTkFNRVNQQUNFLCAid3NhdyIpOwotCQlTdHJpbmcgcHJlZml4ID0gV1NETFNlcmlhbGl6YXRpb25VdGlsLmdldFByZWZpeChheGlzU2VydmljZS5nZXRUYXJnZXROYW1lc3BhY2UoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlTWFwKTsKLQkJaWYgKHByZWZpeCA9PSBudWxsIHx8ICIiLmVxdWFscyhwcmVmaXgpKSB7Ci0JCQlwcmVmaXggPSBERUZBVUxUX1RBUkdFVF9OQU1FU1BBQ0VfUFJFRklYOwotCQl9Ci0KLQkJbmFtZXNwYWNlTWFwLnB1dChwcmVmaXgsIGF4aXNTZXJ2aWNlLmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLQkJdG5zID0gZWxlLmRlY2xhcmVOYW1lc3BhY2UoYXhpc1NlcnZpY2UuZ2V0VGFyZ2V0TmFtZXNwYWNlKCksIHByZWZpeCk7Ci0KLQkJLy8gYXhpczIueG1sIGluZGljYXRlZCBubyBIVFRQIGJpbmRpbmc/Ci0JCWJvb2xlYW4gZGlzYWJsZVJFU1QgPSBmYWxzZTsKLQkJUGFyYW1ldGVyIGRpc2FibGVSRVNUUGFyYW1ldGVyID0gYXhpc1NlcnZpY2UuZ2V0UGFyYW1ldGVyKAotICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uRElTQUJMRV9SRVNUKTsKLQkJaWYgKGRpc2FibGVSRVNUUGFyYW1ldGVyICE9IG51bGwKLQkJCQkmJiBKYXZhVXRpbHMuaXNUcnVlRXhwbGljaXRseShkaXNhYmxlUkVTVFBhcmFtZXRlci5nZXRWYWx1ZSgpKSkgewotCQkJZGlzYWJsZVJFU1QgPSB0cnVlOwotCQl9Ci0KLSAgICAgICAgYm9vbGVhbiBkaXNhYmxlU09BUDExID0gZmFsc2U7Ci0JCVBhcmFtZXRlciBkaXNhYmxlU09BUDExUGFyYW1ldGVyID0gYXhpc1NlcnZpY2UKLQkJCQkuZ2V0UGFyYW1ldGVyKG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uRElTQUJMRV9TT0FQMTEpOwotCQlpZiAoZGlzYWJsZVNPQVAxMVBhcmFtZXRlciAhPSBudWxsCi0JCQkJJiYgSmF2YVV0aWxzLmlzVHJ1ZUV4cGxpY2l0bHkoZGlzYWJsZVNPQVAxMVBhcmFtZXRlci5nZXRWYWx1ZSgpKSkgewotCQkJZGlzYWJsZVNPQVAxMSA9IHRydWU7Ci0JCX0KLQotICAgICAgICAvLyBheGlzMi54bWwgaW5kaWNhdGVkIG5vIFNPQVAgMS4yIGJpbmRpbmc/Ci0JCWJvb2xlYW4gZGlzYWJsZVNPQVAxMiA9IGZhbHNlOwotCQlQYXJhbWV0ZXIgZGlzYWJsZVNPQVAxMlBhcmFtZXRlciA9IGF4aXNTZXJ2aWNlCi0JCQkJLmdldFBhcmFtZXRlcihvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50cy5Db25maWd1cmF0aW9uLkRJU0FCTEVfU09BUDEyKTsKLQkJaWYgKGRpc2FibGVTT0FQMTJQYXJhbWV0ZXIgIT0gbnVsbAotCQkJCSYmIEphdmFVdGlscy5pc1RydWVFeHBsaWNpdGx5KGRpc2FibGVTT0FQMTJQYXJhbWV0ZXIuZ2V0VmFsdWUoKSkpIHsKLQkJCWRpc2FibGVTT0FQMTIgPSB0cnVlOwotCQl9Ci0KLQkJLy8gYWRkaW5nIGRvY3VtZW50YXRpb24gZWxlbWVudAotCQkvLyA8ZG9jdW1lbnRhdGlvbj4mbHQ7YiZndDtORVchJmx0Oy9iJmd0OyBUaGlzIG1ldGhvZCBhY2NlcHRzIGFuIElTQk4KLQkJLy8gc3RyaW5nIGFuZCByZXR1cm5zICZsdDtiJmd0O0FtYXpvbi5jby51ayZsdDsvYiZndDsgU2FsZXMgUmFuayBmb3IKLQkJLy8gdGhhdCBib29rLjwvZG9jdW1lbnRhdGlvbj4KLQkJV1NETFNlcmlhbGl6YXRpb25VdGlsLmFkZFdTRExEb2N1bWVudGF0aW9uRWxlbWVudChheGlzU2VydmljZSwgZWxlLAlmYWMsIHdzZGwpOwotCi0JCWVsZS5hZGRBdHRyaWJ1dGUoInRhcmdldE5hbWVzcGFjZSIsIGF4aXNTZXJ2aWNlLmdldFRhcmdldE5hbWVzcGFjZSgpLCBudWxsKTsKLQkJT01FbGVtZW50IHdzZGxUeXBlcyA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoInR5cGVzIiwgd3NkbCk7Ci0JCWVsZS5hZGRDaGlsZCh3c2RsVHlwZXMpOwotCi0JCS8vIHBvcHVsYXRlIHRoZSBzY2hlbWEgbWFwcGluZ3MKLQkJYXhpc1NlcnZpY2UucG9wdWxhdGVTY2hlbWFNYXBwaW5ncygpOwotCi0JCUFycmF5TGlzdCBzY2hlbWFzID0gYXhpc1NlcnZpY2UuZ2V0U2NoZW1hKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2NoZW1hcy5zaXplKCk7IGkrKykgewotCQkJU3RyaW5nV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQotCQkJLy8gWG1sU2NoZW1hIHNjaGVtYSA9IChYbWxTY2hlbWEpIHNjaGVtYXMuZ2V0KGkpOwotCQkJWG1sU2NoZW1hIHNjaGVtYSA9IGF4aXNTZXJ2aWNlLmdldFNjaGVtYShpKTsKLQotCQkJU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9IHNjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLQkJCWlmICghQ29uc3RhbnRzLk5TX1VSSV9YTUwuZXF1YWxzKHRhcmdldE5hbWVzcGFjZSkpIHsKLQkJCQlzY2hlbWEud3JpdGUod3JpdGVyKTsKLQkJCQlTdHJpbmcgc2NoZW1hU3RyaW5nID0gd3JpdGVyLnRvU3RyaW5nKCk7Ci0JCQkJaWYgKCEiIi5lcXVhbHMoc2NoZW1hU3RyaW5nKSkgewotCQkJCQl3c2RsVHlwZXMuYWRkQ2hpbGQoWE1MVXRpbHMudG9PTShuZXcgU3RyaW5nUmVhZGVyKHNjaGVtYVN0cmluZykpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZ2VuZXJhdGVNZXNzYWdlcyhmYWMsIGVsZSk7Ci0JCWdlbmVyYXRlUG9ydFR5cGUoZmFjLCBlbGUpOwotCi0JCS8vIGdlbmVyYXRlU09BUDExQmluZGluZyhmYWMsIGVsZSk7Ci0JCS8vIGlmICghZGlzYWJsZVNPQVAxMikgewotCQkvLyBnZW5lcmF0ZVNPQVAxMkJpbmRpbmcoZmFjLCBlbGUpOwotCQkvLyB9Ci0JCS8vIGlmICghZGlzYWJsZVJFU1QpIHsKLQkJLy8gZ2VuZXJhdGVIVFRQQmluZGluZyhmYWMsIGVsZSk7Ci0JCS8vIH0KLQotCQlnZW5lcmF0ZVNlcnZpY2UoZmFjLCBlbGUsIGRpc2FibGVSRVNULCBkaXNhYmxlU09BUDEyICwgZGlzYWJsZVNPQVAxMSk7Ci0JCWFkZFBvbGljaWVzVG9EZWZpbml0aW9uRWxlbWVudChwb2xpY2llc0luRGVmaW5pdGlvbnMudmFsdWVzKCkuaXRlcmF0b3IoKSwgZGVmaW5pdGlvbik7Ci0KLQkJcmV0dXJuIGVsZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZ2VuZXJhdGVNZXNzYWdlcyhPTUZhY3RvcnkgZmFjLCBPTUVsZW1lbnQgZGVmaW50aW9ucykgewotCQlIYXNoU2V0IGZhdWx0TWVzc2FnZU5hbWVzID0gbmV3IEhhc2hTZXQoKTsKLQkJbWVzc2FnZXNNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JCUl0ZXJhdG9yIG9wZXJhdGlvbnMgPSBheGlzU2VydmljZS5nZXRPcGVyYXRpb25zKCk7Ci0JCXdoaWxlIChvcGVyYXRpb25zLmhhc05leHQoKSkgewotCQkJQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uID0gKEF4aXNPcGVyYXRpb24pIG9wZXJhdGlvbnMubmV4dCgpOwotCQkJaWYgKGF4aXNPcGVyYXRpb24uaXNDb250cm9sT3BlcmF0aW9uKCkpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCVN0cmluZyBNRVAgPSBheGlzT3BlcmF0aW9uLmdldE1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4oKTsKLQkJCWlmIChXU0RMMkNvbnN0YW50cy5NRVBfVVJJX0lOX09OTFkuZXF1YWxzKE1FUCkKLQkJCQkJfHwgV1NETDJDb25zdGFudHMuTUVQX1VSSV9JTl9PUFRJT05BTF9PVVQuZXF1YWxzKE1FUCkKLQkJCQkJfHwgV1NETDJDb25zdGFudHMuTUVQX1VSSV9PVVRfT1BUSU9OQUxfSU4uZXF1YWxzKE1FUCkKLQkJCQkJfHwgV1NETDJDb25zdGFudHMuTUVQX1VSSV9ST0JVU1RfT1VUX09OTFkuZXF1YWxzKE1FUCkKLQkJCQkJfHwgV1NETDJDb25zdGFudHMuTUVQX1VSSV9ST0JVU1RfSU5fT05MWS5lcXVhbHMoTUVQKQotCQkJCQl8fCBXU0RMMkNvbnN0YW50cy5NRVBfVVJJX0lOX09VVC5lcXVhbHMoTUVQKSkgewotICAgICAgICAgICAgICAgIEF4aXNNZXNzYWdlIGluYXhpc01lc3NhZ2UgPQotICAgICAgICAgICAgICAgICAgICAgICAgYXhpc09wZXJhdGlvbi5nZXRNZXNzYWdlKFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9JTl9WQUxVRSk7Ci0JCQkJaWYgKGluYXhpc01lc3NhZ2UgIT0gbnVsbCkgewotCQkJCQl3cml0ZU1lc3NhZ2UoaW5heGlzTWVzc2FnZSwgZmFjLCBkZWZpbnRpb25zKTsKLQkJCQkJZ2VuZXJhdGVIZWFkZXJNZXNzYWdlcyhpbmF4aXNNZXNzYWdlLCBmYWMsIGRlZmludGlvbnMpOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKFdTREwyQ29uc3RhbnRzLk1FUF9VUklfT1VUX09OTFkuZXF1YWxzKE1FUCkKLQkJCQkJfHwgV1NETDJDb25zdGFudHMuTUVQX1VSSV9PVVRfT1BUSU9OQUxfSU4uZXF1YWxzKE1FUCkKLQkJCQkJfHwgV1NETDJDb25zdGFudHMuTUVQX1VSSV9JTl9PUFRJT05BTF9PVVQuZXF1YWxzKE1FUCkKLQkJCQkJfHwgV1NETDJDb25zdGFudHMuTUVQX1VSSV9ST0JVU1RfT1VUX09OTFkuZXF1YWxzKE1FUCkKLQkJCQkJfHwgV1NETDJDb25zdGFudHMuTUVQX1VSSV9JTl9PVVQuZXF1YWxzKE1FUCkpIHsKLQkJCQlBeGlzTWVzc2FnZSBvdXRBeGlzTWVzc2FnZSA9IGF4aXNPcGVyYXRpb24KLQkJCQkJCS5nZXRNZXNzYWdlKFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9PVVRfVkFMVUUpOwotCQkJCWlmIChvdXRBeGlzTWVzc2FnZSAhPSBudWxsKSB7Ci0JCQkJCXdyaXRlTWVzc2FnZShvdXRBeGlzTWVzc2FnZSwgZmFjLCBkZWZpbnRpb25zKTsKLQkJCQkJZ2VuZXJhdGVIZWFkZXJNZXNzYWdlcyhvdXRBeGlzTWVzc2FnZSwgZmFjLCBkZWZpbnRpb25zKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIGdlbmVyYXRlIGZhdWx0IE1lc3NhZ2VzCi0JCQlBcnJheUxpc3QgZmF1bHR5TWVzc2FnZXMgPSBheGlzT3BlcmF0aW9uLmdldEZhdWx0TWVzc2FnZXMoKTsKLQkJCWlmIChmYXVsdHlNZXNzYWdlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChPYmplY3QgZmF1bHR5TWVzc2FnZSA6IGZhdWx0eU1lc3NhZ2VzKSB7Ci0gICAgICAgICAgICAgICAgICAgIEF4aXNNZXNzYWdlIGF4aXNNZXNzYWdlID0gKEF4aXNNZXNzYWdlKWZhdWx0eU1lc3NhZ2U7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gYXhpc01lc3NhZ2UuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZmF1bHRNZXNzYWdlTmFtZXMuYWRkKG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3cml0ZU1lc3NhZ2UoYXhpc01lc3NhZ2UsIGZhYywgZGVmaW50aW9ucyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZUhlYWRlck1lc3NhZ2VzKGF4aXNNZXNzYWdlLCBmYWMsIGRlZmludGlvbnMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGdlbmVyYXRlSGVhZGVyTWVzc2FnZXMoQXhpc01lc3NhZ2UgYXhpc21lc3NhZ2UsIE9NRmFjdG9yeSBmYWMsCi0JCQlPTUVsZW1lbnQgZGVmaW50aW9ucykgewotCQlBcnJheUxpc3QgZXh0TGlzdCA9IGF4aXNtZXNzYWdlLmdldFNvYXBIZWFkZXJzKCk7Ci0gICAgICAgIGZvciAoT2JqZWN0IGFuRXh0TGlzdCA6IGV4dExpc3QpIHsKLSAgICAgICAgICAgIFNPQVBIZWFkZXJNZXNzYWdlIGhlYWRlciA9IChTT0FQSGVhZGVyTWVzc2FnZSlhbkV4dExpc3Q7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgbWVzc2FnZUVsZW1lbnQgPSBmYWMuY3JlYXRlT01FbGVtZW50KE1FU1NBR0VfTE9DQUxfTkFNRSwgd3NkbCk7Ci0gICAgICAgICAgICBtZXNzYWdlRWxlbWVudC5hZGRBdHRyaWJ1dGUoQVRUUklCVVRFX05BTUUsIGhlYWRlci5nZXRNZXNzYWdlKCkuZ2V0TG9jYWxQYXJ0KCksIG51bGwpOwotICAgICAgICAgICAgZGVmaW50aW9ucy5hZGRDaGlsZChtZXNzYWdlRWxlbWVudCk7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgbWVzc2FnZVBhcnQgPSBmYWMuY3JlYXRlT01FbGVtZW50KFBBUlRfQVRUUklCVVRFX05BTUUsIHdzZGwpOwotICAgICAgICAgICAgbWVzc2FnZUVsZW1lbnQuYWRkQ2hpbGQobWVzc2FnZVBhcnQpOwotICAgICAgICAgICAgbWVzc2FnZVBhcnQuYWRkQXR0cmlidXRlKEFUVFJJQlVURV9OQU1FLCBoZWFkZXIucGFydCgpLCBudWxsKTsKLSAgICAgICAgICAgIGlmIChoZWFkZXIuZ2V0RWxlbWVudCgpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihFTEVNRU5UX0FUVFJJQlVURV9OQU1FCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGlzIG51bGwgZm9yICIgKyBoZWFkZXIuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1lc3NhZ2VQYXJ0LmFkZEF0dHJpYnV0ZShFTEVNRU5UX0FUVFJJQlVURV9OQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdTRExTZXJpYWxpemF0aW9uVXRpbC5nZXRQcmVmaXgoaGVhZGVyLmdldEVsZW1lbnQoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldE5hbWVzcGFjZVVSSSgpLCBheGlzU2VydmljZS5nZXROYW1lc3BhY2VNYXAoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICI6IiArIGhlYWRlci5nZXRFbGVtZW50KCkuZ2V0TG9jYWxQYXJ0KCksIG51bGwpOwotICAgICAgICB9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHdyaXRlTWVzc2FnZShBeGlzTWVzc2FnZSBheGlzbWVzc2FnZSwgT01GYWN0b3J5IGZhYywgT01FbGVtZW50IGRlZmludGlvbnMpIHsKLQkJaWYgKG1lc3NhZ2VzTWFwLmdldChheGlzbWVzc2FnZS5nZXROYW1lKCkpID09IG51bGwpIHsKLQkJCW1lc3NhZ2VzTWFwLnB1dChheGlzbWVzc2FnZS5nZXROYW1lKCksIGF4aXNtZXNzYWdlKTsKLQkJCVFOYW1lIHNjaGVtYUVsZW1lbnROYW1lID0gYXhpc21lc3NhZ2UuZ2V0RWxlbWVudFFOYW1lKCk7Ci0JCQlPTUVsZW1lbnQgbWVzc2FnZUVsZW1lbnQgPSBmYWMuY3JlYXRlT01FbGVtZW50KE1FU1NBR0VfTE9DQUxfTkFNRSwgd3NkbCk7Ci0JCQltZXNzYWdlRWxlbWVudC5hZGRBdHRyaWJ1dGUoQVRUUklCVVRFX05BTUUsIGF4aXNtZXNzYWdlLmdldE5hbWUoKSwgbnVsbCk7Ci0JCQlkZWZpbnRpb25zLmFkZENoaWxkKG1lc3NhZ2VFbGVtZW50KTsKLQkJCWlmIChzY2hlbWFFbGVtZW50TmFtZSAhPSBudWxsKSB7Ci0JCQkJT01FbGVtZW50IG1lc3NhZ2VQYXJ0ID0gZmFjLmNyZWF0ZU9NRWxlbWVudChQQVJUX0FUVFJJQlVURV9OQU1FLCB3c2RsKTsKLQkJCQltZXNzYWdlRWxlbWVudC5hZGRDaGlsZChtZXNzYWdlUGFydCk7Ci0JCQkJaWYgKGF4aXNtZXNzYWdlLmdldE1lc3NhZ2VQYXJ0TmFtZSgpICE9IG51bGwpIHsKLQkJCQkJbWVzc2FnZVBhcnQuYWRkQXR0cmlidXRlKEFUVFJJQlVURV9OQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpc21lc3NhZ2UuZ2V0TWVzc2FnZVBhcnROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsKTsKLQkJCQl9IGVsc2UgewotCQkJCQltZXNzYWdlUGFydC5hZGRBdHRyaWJ1dGUoQVRUUklCVVRFX05BTUUsIGF4aXNtZXNzYWdlLmdldFBhcnROYW1lKCksIG51bGwpOwotCQkJCX0KLQkJCQltZXNzYWdlUGFydC5hZGRBdHRyaWJ1dGUoRUxFTUVOVF9BVFRSSUJVVEVfTkFNRSwKLQkJCQkJCVdTRExTZXJpYWxpemF0aW9uVXRpbC5nZXRQcmVmaXgoc2NoZW1hRWxlbWVudE5hbWUuZ2V0TmFtZXNwYWNlVVJJKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlLmdldE5hbWVzcGFjZU1hcCgpKQotCQkJCQkJCQkrICI6IiArIHNjaGVtYUVsZW1lbnROYW1lLmdldExvY2FsUGFydCgpLCBudWxsKTsKLQkJCX0KLQkJfQotCi0JfQotCi0JLyoqCi0JICogQnVpbGRzIHRoZSAmbHQ7cG9ydFR5cGUmZ3Q7IGVsZW1lbnQgaW4gdGhlIHBhc3NlZCBXU0RMIGRlZmluaXRpb24uIFdoZW4KLQkgKiB0aGlzIHJldHVybnMgc3VjY2Vzc2Z1bGx5LCB0aGVyZSB3aWxsIGJlIGEgbmV3IGNoaWxkIGVsZW1lbnQgdW5kZXIKLQkgKiBkZWZpbml0b25zIGZvciB0aGUgcG9ydFR5cGUuCi0JICogCi0JICogQHBhcmFtIGZhYwotCSAqICAgICAgICAgICAgdGhlIGFjdGl2ZSBPTUZhY3RvcnkKLQkgKiBAcGFyYW0gZGVmaW50aW9ucwotCSAqICAgICAgICAgICAgdGhlIFdTREwgJmx0O2RlZmluaXRpb25zJmd0OyBlbGVtZW50Ci0JICogQHRocm93cyBFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiB0aGVyZSdzIGEgcHJvYmxlbQotCSAqLwotCXByaXZhdGUgdm9pZCBnZW5lcmF0ZVBvcnRUeXBlKE9NRmFjdG9yeSBmYWMsIE9NRWxlbWVudCBkZWZpbnRpb25zKQotCQkJdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9NRWxlbWVudCBwb3J0VHlwZSA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoUE9SVF9UWVBFX0xPQ0FMX05BTUUsIHdzZGwpOwotCQlkZWZpbnRpb25zLmFkZENoaWxkKHBvcnRUeXBlKTsKLQotCQlwb3J0VHlwZS5hZGRBdHRyaWJ1dGUoQVRUUklCVVRFX05BTUUsIHNlcnZpY2VOYW1lICsgUE9SVF9UWVBFX1NVRkZJWCwKLQkJCQludWxsKTsKLQotCQlhZGRQb2xpY3lBc0V4dEF0dHJpYnV0ZShheGlzU2VydmljZSwgcG9ydFR5cGUsIGZhYyk7Ci0KLQkJZm9yIChJdGVyYXRvciBvcGVyYXRpb25zID0gYXhpc1NlcnZpY2UuZ2V0T3BlcmF0aW9ucygpOyBvcGVyYXRpb25zCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCUF4aXNPcGVyYXRpb24gYXhpc09wZXJhdGlvbiA9IChBeGlzT3BlcmF0aW9uKSBvcGVyYXRpb25zLm5leHQoKTsKLQkJCWlmIChheGlzT3BlcmF0aW9uLmlzQ29udHJvbE9wZXJhdGlvbigpCi0JCQkJCXx8IGF4aXNPcGVyYXRpb24uZ2V0TmFtZSgpID09IG51bGwpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCVN0cmluZyBvcGVyYXRpb25OYW1lID0gYXhpc09wZXJhdGlvbi5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCk7Ci0JCQlPTUVsZW1lbnQgb3BlcmF0aW9uID0gZmFjLmNyZWF0ZU9NRWxlbWVudChPUEVSQVRJT05fTE9DQUxfTkFNRSwKLQkJCQkJd3NkbCk7Ci0JCQlXU0RMU2VyaWFsaXphdGlvblV0aWwuYWRkV1NETERvY3VtZW50YXRpb25FbGVtZW50KGF4aXNPcGVyYXRpb24sCi0JCQkJCW9wZXJhdGlvbiwgZmFjLCB3c2RsKTsKLQkJCXBvcnRUeXBlLmFkZENoaWxkKG9wZXJhdGlvbik7Ci0JCQlvcGVyYXRpb24uYWRkQXR0cmlidXRlKEFUVFJJQlVURV9OQU1FLCBvcGVyYXRpb25OYW1lLCBudWxsKTsKLQkJCWFkZFBvbGljeUFzRXh0QXR0cmlidXRlKGF4aXNPcGVyYXRpb24sIG9wZXJhdGlvbixmYWMpOwotCi0JCQlTdHJpbmcgTUVQID0gYXhpc09wZXJhdGlvbi5nZXRNZXNzYWdlRXhjaGFuZ2VQYXR0ZXJuKCk7Ci0JCQlpZiAoV1NETDJDb25zdGFudHMuTUVQX1VSSV9JTl9PTkxZLmVxdWFscyhNRVApCi0JCQkJCXx8IFdTREwyQ29uc3RhbnRzLk1FUF9VUklfSU5fT1BUSU9OQUxfT1VULmVxdWFscyhNRVApCi0JCQkJCXx8IFdTREwyQ29uc3RhbnRzLk1FUF9VUklfT1VUX09QVElPTkFMX0lOLmVxdWFscyhNRVApCi0JCQkJCXx8IFdTREwyQ29uc3RhbnRzLk1FUF9VUklfUk9CVVNUX09VVF9PTkxZLmVxdWFscyhNRVApCi0JCQkJCXx8IFdTREwyQ29uc3RhbnRzLk1FUF9VUklfUk9CVVNUX0lOX09OTFkuZXF1YWxzKE1FUCkKLQkJCQkJfHwgV1NETDJDb25zdGFudHMuTUVQX1VSSV9JTl9PVVQuZXF1YWxzKE1FUCkpIHsKLQkJCQlBeGlzTWVzc2FnZSBpbmF4aXNNZXNzYWdlID0gYXhpc09wZXJhdGlvbgotCQkJCQkJLmdldE1lc3NhZ2UoV1NETENvbnN0YW50cy5NRVNTQUdFX0xBQkVMX0lOX1ZBTFVFKTsKLQkJCQlpZiAoaW5heGlzTWVzc2FnZSAhPSBudWxsKSB7Ci0JCQkJCU9NRWxlbWVudCBpbnB1dCA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoSU5fUFVUX0xPQ0FMX05BTUUsCi0JCQkJCQkJd3NkbCk7Ci0JCQkJCVdTRExTZXJpYWxpemF0aW9uVXRpbC5hZGRXU0RMRG9jdW1lbnRhdGlvbkVsZW1lbnQoCi0JCQkJCQkJaW5heGlzTWVzc2FnZSwgaW5wdXQsIGZhYywgd3NkbCk7Ci0JCQkJCWlucHV0LmFkZEF0dHJpYnV0ZShNRVNTQUdFX0xPQ0FMX05BTUUsIHRucy5nZXRQcmVmaXgoKQotCQkJCQkJCSsgIjoiICsgaW5heGlzTWVzc2FnZS5nZXROYW1lKCksIG51bGwpOwotCQkJCQlhZGRQb2xpY3lBc0V4dEF0dHJpYnV0ZShpbmF4aXNNZXNzYWdlLCBpbnB1dCxmYWMpOwotCi0JCQkJCVdTRExTZXJpYWxpemF0aW9uVXRpbC5hZGRXU0FXQWN0aW9uQXR0cmlidXRlKGlucHV0LAotCQkJCQkJCWF4aXNPcGVyYXRpb24uZ2V0SW5wdXRBY3Rpb24oKSwgd3Nhdyk7Ci0JCQkJCW9wZXJhdGlvbi5hZGRDaGlsZChpbnB1dCk7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoV1NETDJDb25zdGFudHMuTUVQX1VSSV9PVVRfT05MWS5lcXVhbHMoTUVQKQotCQkJCQl8fCBXU0RMMkNvbnN0YW50cy5NRVBfVVJJX09VVF9PUFRJT05BTF9JTi5lcXVhbHMoTUVQKQotCQkJCQl8fCBXU0RMMkNvbnN0YW50cy5NRVBfVVJJX0lOX09QVElPTkFMX09VVC5lcXVhbHMoTUVQKQotCQkJCQl8fCBXU0RMMkNvbnN0YW50cy5NRVBfVVJJX1JPQlVTVF9PVVRfT05MWS5lcXVhbHMoTUVQKQotCQkJCQl8fCBXU0RMMkNvbnN0YW50cy5NRVBfVVJJX0lOX09VVC5lcXVhbHMoTUVQKSkgewotCQkJCUF4aXNNZXNzYWdlIG91dEF4aXNNZXNzYWdlID0gYXhpc09wZXJhdGlvbgotCQkJCQkJLmdldE1lc3NhZ2UoV1NETENvbnN0YW50cy5NRVNTQUdFX0xBQkVMX09VVF9WQUxVRSk7Ci0JCQkJaWYgKG91dEF4aXNNZXNzYWdlICE9IG51bGwpIHsKLQkJCQkJT01FbGVtZW50IG91dHB1dCA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoT1VUX1BVVF9MT0NBTF9OQU1FLAotCQkJCQkJCXdzZGwpOwotCQkJCQlXU0RMU2VyaWFsaXphdGlvblV0aWwuYWRkV1NETERvY3VtZW50YXRpb25FbGVtZW50KAotCQkJCQkJCW91dEF4aXNNZXNzYWdlLCBvdXRwdXQsIGZhYywgd3NkbCk7Ci0JCQkJCW91dHB1dC5hZGRBdHRyaWJ1dGUoTUVTU0FHRV9MT0NBTF9OQU1FLCB0bnMuZ2V0UHJlZml4KCkKLQkJCQkJCQkrICI6IiArIG91dEF4aXNNZXNzYWdlLmdldE5hbWUoKSwgbnVsbCk7Ci0JCQkJCWFkZFBvbGljeUFzRXh0QXR0cmlidXRlKG91dEF4aXNNZXNzYWdlLCBvdXRwdXQsIGZhYyk7Ci0JCQkJCVdTRExTZXJpYWxpemF0aW9uVXRpbC5hZGRXU0FXQWN0aW9uQXR0cmlidXRlKG91dHB1dCwKLQkJCQkJCQlheGlzT3BlcmF0aW9uLmdldE91dHB1dEFjdGlvbigpLCB3c2F3KTsKLQkJCQkJb3BlcmF0aW9uLmFkZENoaWxkKG91dHB1dCk7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBnZW5lcmF0ZSBmYXVsdCBNZXNzYWdlcwotCQkJQXJyYXlMaXN0IGZhdWx0TWVzc2FnZXMgPSBheGlzT3BlcmF0aW9uLmdldEZhdWx0TWVzc2FnZXMoKTsKLQkJCWlmIChmYXVsdE1lc3NhZ2VzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb3IgKE9iamVjdCBmYXVsdE1lc3NhZ2UgOiBmYXVsdE1lc3NhZ2VzKSB7Ci0gICAgICAgICAgICAgICAgICAgIEF4aXNNZXNzYWdlIGZhdWx0eU1lc3NhZ2UgPSAoQXhpc01lc3NhZ2UpZmF1bHRNZXNzYWdlOwotICAgICAgICAgICAgICAgICAgICBPTUVsZW1lbnQgZmF1bHQgPSBmYWMuY3JlYXRlT01FbGVtZW50KEZBVUxUX0xPQ0FMX05BTUUsIHdzZGwpOwotICAgICAgICAgICAgICAgICAgICBXU0RMU2VyaWFsaXphdGlvblV0aWwuYWRkV1NETERvY3VtZW50YXRpb25FbGVtZW50KGZhdWx0eU1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmF1bHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzZGwpOwotICAgICAgICAgICAgICAgICAgICBmYXVsdC5hZGRBdHRyaWJ1dGUoTUVTU0FHRV9MT0NBTF9OQU1FLCB0bnMuZ2V0UHJlZml4KCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiOiIgKyBmYXVsdHlNZXNzYWdlLmdldE5hbWUoKSwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgIGZhdWx0LmFkZEF0dHJpYnV0ZShBVFRSSUJVVEVfTkFNRSwgZmF1bHR5TWVzc2FnZS5nZXROYW1lKCksIG51bGwpOwotICAgICAgICAgICAgICAgICAgICBXU0RMU2VyaWFsaXphdGlvblV0aWwuYWRkV1NBV0FjdGlvbkF0dHJpYnV0ZShmYXVsdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpc09wZXJhdGlvbi5nZXRGYXVsdEFjdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYXVsdHlNZXNzYWdlLmdldE5hbWUoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzYXcpOwotICAgICAgICAgICAgICAgICAgICAvLyBUT0RPIGFkZCBwb2xpY2llcyBmb3IgZmF1bHQgbWVzc2FnZXMKLSAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uLmFkZENoaWxkKGZhdWx0KTsKLSAgICAgICAgICAgICAgICB9Ci0JCQl9Ci0KLQkJfQotCX0KLQotCS8qKgotCSAqIEdlbmVyYXRlIHRoZSBXU0RMICZsdDtzZXJ2aWNlJmd0OyBlbGVtZW50Ci0JICogCi0JICogQHBhcmFtIGZhYwotCSAqICAgICAgICAgICAgdGhlIGFjdGl2ZSBPTUZhY3RvcnkKLQkgKiBAcGFyYW0gZGVmaW50aW9ucwotCSAqICAgICAgICAgICAgdGhlIFdTREwgJmx0O2RlZmluaXRpb25zJmd0OyBlbGVtZW50IHVuZGVyIHdoaWNoIHRvIHB1dCB0aGUKLQkgKiAgICAgICAgICAgIHNlcnZpY2UKLQkgKiBAcGFyYW0gZGlzYWJsZVJFU1QKLQkgKiAgICAgICAgICAgIGlmIGZhbHNlLCBnZW5lcmF0ZSBSRVNUIGJpbmRpbmcsIGlmIHRydWUsIGRvbid0Ci0JICogQHBhcmFtIGRpc2FibGVTT0FQMTIKLQkgKiAgICAgICAgICAgIGlmIGZhbHNlLCBnZW5lcmF0ZSBTT0FQIDEuMiBiaW5kaW5nLCBpZiB0cnVlLCBkb24ndAotCSAqIEB0aHJvd3MgRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgdGhlcmUncyBhIHByb2JsZW0KLQkgKi8KLQlwdWJsaWMgdm9pZCBnZW5lcmF0ZVNlcnZpY2UoT01GYWN0b3J5IGZhYywgT01FbGVtZW50IGRlZmludGlvbnMsIGJvb2xlYW4gZGlzYWJsZVJFU1QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZGlzYWJsZVNPQVAxMiwgYm9vbGVhbiBkaXNhYmxlU09BUDExKQotICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9NRWxlbWVudCBzZXJ2aWNlID0gZmFjLmNyZWF0ZU9NRWxlbWVudChTRVJWSUNFX0xPQ0FMX05BTUUsIHdzZGwpOwotCQlkZWZpbnRpb25zLmFkZENoaWxkKHNlcnZpY2UpOwotCQlzZXJ2aWNlLmFkZEF0dHJpYnV0ZShBVFRSSUJVVEVfTkFNRSwgc2VydmljZU5hbWUsIG51bGwpOwotCi0gICAgICAgIGlmICghZGlzYWJsZVNPQVAxMSkgewotCQkJZ2VuZXJhdGVTb2FwMTFQb3J0KGZhYywgZGVmaW50aW9ucywgc2VydmljZSk7Ci0JCX0KLQotICAgICAgICBpZiAoIWRpc2FibGVTT0FQMTIpIHsKLQkJCS8vIGdlbmVyYXRlU09BUDEyUG9ydHMoZmFjLCBzZXJ2aWNlKTsKLQkJCWdlbmVyYXRlU29hcDEyUG9ydChmYWMsIGRlZmludGlvbnMsIHNlcnZpY2UpOwotCQl9Ci0KLQotICAgICAgICBhZGRQb2xpY3lBc0V4dEVsZW1lbnQoUG9saWN5SW5jbHVkZS5TRVJWSUNFX1BPTElDWSwgYXhpc1NlcnZpY2UuZ2V0UG9saWN5SW5jbHVkZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZSk7Ci0JCS8vIGFkZFBvbGljeUFzRXh0RWxlbWVudChQb2xpY3lJbmNsdWRlLkFYSVNfU0VSVklDRV9QT0xJQ1ksIGF4aXNTZXJ2aWNlLgotCQkvLyBnZXRQb2xpY3lJbmNsdWRlKCksIHNlcnZpY2UpOwotCi0JCWlmICghZGlzYWJsZVJFU1QpIHsKLQkJCS8vIGdlbmVyYXRlSFRUUFBvcnRzKGZhYywgc2VydmljZSk7Ci0JCQlnZW5lcmF0ZUh0dHBQb3J0KGZhYywgZGVmaW5pdGlvbiwgc2VydmljZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgd3JpdGVTb2FwSGVhZGVycyhBeGlzTWVzc2FnZSBpbmF4aXNNZXNzYWdlLCBPTUZhY3RvcnkgZmFjLAotCQkJT01FbGVtZW50IGlucHV0LCBPTU5hbWVzcGFjZSBzb2FwTmFtZVNwYWNlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJQXJyYXlMaXN0IGV4dEVsZW1lbnRMaXN0OwotCQlleHRFbGVtZW50TGlzdCA9IGluYXhpc01lc3NhZ2UuZ2V0U29hcEhlYWRlcnMoKTsKLQkJaWYgKGV4dEVsZW1lbnRMaXN0ICE9IG51bGwpIHsKLQkJCUl0ZXJhdG9yIGVsZW1lbnRzID0gZXh0RWxlbWVudExpc3QuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChlbGVtZW50cy5oYXNOZXh0KCkpIHsKLQkJCQlTT0FQSGVhZGVyTWVzc2FnZSBzb2FwaGVhZGVyID0gKFNPQVBIZWFkZXJNZXNzYWdlKSBlbGVtZW50cwotCQkJCQkJLm5leHQoKTsKLQkJCQlhZGRTT0FQSGVhZGVyKGZhYywgaW5wdXQsIHNvYXBoZWFkZXIsIHNvYXBOYW1lU3BhY2UpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZEV4dGVuc2lvbkVsZW1lbnQoT01GYWN0b3J5IGZhYywgT01FbGVtZW50IGVsZW1lbnQsCi0JCQlTdHJpbmcgbmFtZSwgU3RyaW5nIGF0dDFOYW1lLCBTdHJpbmcgYXR0MVZhbHVlLCBTdHJpbmcgYXR0Mk5hbWUsCi0JCQlTdHJpbmcgYXR0MlZhbHVlLCBPTU5hbWVzcGFjZSBzb2FwTmFtZVNwYWNlKSB7Ci0JCU9NRWxlbWVudCBzb2FwYmluZGluZyA9IGZhYy5jcmVhdGVPTUVsZW1lbnQobmFtZSwgc29hcE5hbWVTcGFjZSk7Ci0JCWVsZW1lbnQuYWRkQ2hpbGQoc29hcGJpbmRpbmcpOwotCQlzb2FwYmluZGluZy5hZGRBdHRyaWJ1dGUoYXR0MU5hbWUsIGF0dDFWYWx1ZSwgbnVsbCk7Ci0JCWlmIChhdHQyTmFtZSAhPSBudWxsKSB7Ci0JCQlzb2FwYmluZGluZy5hZGRBdHRyaWJ1dGUoYXR0Mk5hbWUsIGF0dDJWYWx1ZSwgbnVsbCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0RGVmaW5pdGlvbkVsZW1lbnQoT01FbGVtZW50IGRlZmludGlvbikgewotCQl0aGlzLmRlZmluaXRpb24gPSBkZWZpbnRpb247Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZFNPQVBIZWFkZXIoT01GYWN0b3J5IGZhYywgT01FbGVtZW50IGVsZW1lbnQsCi0JCQlTT0FQSGVhZGVyTWVzc2FnZSBoZWFkZXIsIE9NTmFtZXNwYWNlIHNvYXBOYW1lU3BhY2UpIHsKLQkJT01FbGVtZW50IGV4dEVsZW1lbnQgPSBmYWMuY3JlYXRlT01FbGVtZW50KCJoZWFkZXIiLCBzb2FwTmFtZVNwYWNlKTsKLQkJZWxlbWVudC5hZGRDaGlsZChleHRFbGVtZW50KTsKLQkJU3RyaW5nIHVzZSA9IGhlYWRlci5nZXRVc2UoKTsKLQkJaWYgKHVzZSAhPSBudWxsKSB7Ci0JCQlleHRFbGVtZW50LmFkZEF0dHJpYnV0ZSgidXNlIiwgdXNlLCBudWxsKTsKLQkJfQotCQlpZiAoaGVhZGVyLnBhcnQoKSAhPSBudWxsKSB7Ci0JCQlleHRFbGVtZW50LmFkZEF0dHJpYnV0ZSgicGFydCIsIGhlYWRlci5wYXJ0KCksIG51bGwpOwotCQl9Ci0JCWlmIChoZWFkZXIuZ2V0TWVzc2FnZSgpICE9IG51bGwpIHsKLQkJCWV4dEVsZW1lbnQuYWRkQXR0cmlidXRlKCJtZXNzYWdlIiwgV1NETFNlcmlhbGl6YXRpb25VdGlsLmdldFByZWZpeCgKLQkJCQkJdGFyZ2V0TmFtZXNwYWNlLCBheGlzU2VydmljZS5nZXROYW1lc3BhY2VNYXAoKSkKLQkJCQkJKyAiOiIgKyBoZWFkZXIuZ2V0TWVzc2FnZSgpLmdldExvY2FsUGFydCgpLCBudWxsKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRQb2xpY3lBc0V4dEVsZW1lbnQoaW50IHR5cGUsIFBvbGljeUluY2x1ZGUgcG9saWN5SW5jbHVkZSwKLQkJCU9NRWxlbWVudCBwYXJlbnRFbGVtZW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJQXJyYXlMaXN0IGVsZW1lbnRMaXN0ID0gcG9saWN5SW5jbHVkZS5nZXRQb2xpY3lFbGVtZW50cyh0eXBlKTsKLQotICAgICAgICBmb3IgKE9iamVjdCBwb2xpY3lFbGVtZW50IDogZWxlbWVudExpc3QpIHsKLSAgICAgICAgICAgIGlmIChwb2xpY3lFbGVtZW50IGluc3RhbmNlb2YgUG9saWN5KSB7Ci0gICAgICAgICAgICAgICAgT01FbGVtZW50IGNoaWxkID0gUG9saWN5VXRpbC5nZXRQb2xpY3lDb21wb25lbnRBc09NRWxlbWVudCgKLSAgICAgICAgICAgICAgICAgICAgICAgIChQb2xpY3lDb21wb25lbnQpcG9saWN5RWxlbWVudCwgc2VyaWFsaXplcik7Ci0KLS8vICAgICAgICAgICAgICAgIE9NTm9kZSBmaXJzdENoaWxkRWxlbSA9IHBhcmVudEVsZW1lbnQuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBpZiAoZmlyc3RDaGlsZEVsZW0gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIHBhcmVudEVsZW1lbnQuYWRkQ2hpbGQoY2hpbGQpOwotICAgICAgICAgICAgICAgIC8vIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gZmlyc3RDaGlsZEVsZW0uaW5zZXJ0U2libGluZ0JlZm9yZShjaGlsZCk7Ci0gICAgICAgICAgICAgICAgLy8gfQotICAgICAgICAgICAgICAgIC8vIHRoZXJlIGlzIGEgcHJvYmxlbSB3aXRoIHRoZSBPTSBpbnNlcnRTaWJsaW5nQmVmb3JlIGVsZW1lbnQKLSAgICAgICAgICAgICAgICAvLyB3aXRoCi0gICAgICAgICAgICAgICAgLy8gZHJvcHMgdGhlIGFscmVhZHkgZXhpc3RzIGVsZW1lbnRzLgotICAgICAgICAgICAgICAgIC8vIHNpbmNlIHRoZXJlIGlzIG5vIGFueSB0ZWNoaWNhbCBwcm9ibGVtIG9mIGFkZGluZyBwb2xpY3kKLSAgICAgICAgICAgICAgICAvLyBlbGVtZW50cyBhZnRlciBvdGhlcgotICAgICAgICAgICAgICAgIC8vIGNoaWxkcmVuIHRlbXBvcmFsaXkgZml4IHRoaXMgYXMgaXQgaXMuCi0gICAgICAgICAgICAgICAgLy8gb25lIE9NIGZpeCB0aGlzIGlzc3VlIHdlIGNhbiByZXZlcnQgdGhpcyBjaGFuZ2UuCi0gICAgICAgICAgICAgICAgcGFyZW50RWxlbWVudC5hZGRDaGlsZChjaGlsZCk7Ci0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAocG9saWN5RWxlbWVudCBpbnN0YW5jZW9mIFBvbGljeVJlZmVyZW5jZSkgewotICAgICAgICAgICAgICAgIE9NRWxlbWVudCBjaGlsZCA9IFBvbGljeVV0aWwKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRQb2xpY3lDb21wb25lbnRBc09NRWxlbWVudCgoUG9saWN5Q29tcG9uZW50KXBvbGljeUVsZW1lbnQpOwotICAgICAgICAgICAgICAgIE9NRWxlbWVudCBmaXJzdENoaWxkRWxlbSA9IHBhcmVudEVsZW1lbnQuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZmlyc3RDaGlsZEVsZW0gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwYXJlbnRFbGVtZW50LmFkZENoaWxkKGNoaWxkKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBmaXJzdENoaWxkRWxlbS5pbnNlcnRTaWJsaW5nQmVmb3JlKGNoaWxkKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBQb2xpY3lSZWdpc3RyeSByZWcgPSBwb2xpY3lJbmNsdWRlLmdldFBvbGljeVJlZ2lzdHJ5KCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9ICgoUG9saWN5UmVmZXJlbmNlKXBvbGljeUVsZW1lbnQpLmdldFVSSSgpOwotCi0gICAgICAgICAgICAgICAgaWYgKGtleS5zdGFydHNXaXRoKCIjIikpIHsKLSAgICAgICAgICAgICAgICAgICAga2V5ID0ga2V5LnN1YnN0cmluZyhrZXkuaW5kZXhPZigiIyIpICsgMSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgUG9saWN5IHAgPSByZWcubG9va3VwKGtleSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlBvbGljeSBub3QgZm91bmQgZm9yIHVyaSA6ICIgKyBrZXkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGFkZFBvbGljeVRvRGVmaW5pdGlvbkVsZW1lbnQoa2V5LCBwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRQb2xpY2llc1RvRGVmaW5pdGlvbkVsZW1lbnQoSXRlcmF0b3IgaXRlcmF0b3IsCi0JCQlPTUVsZW1lbnQgZGVmaW5pdGlvbkVsZW1lbnQpIHRocm93cyBFeGNlcHRpb24gewotCQlQb2xpY3kgcG9saWN5OwotCQlPTUVsZW1lbnQgcG9saWN5RWxlbWVudDsKLQkJT01Ob2RlIGZpcnN0Q2hpbGQ7Ci0KLQkJZm9yICg7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCXBvbGljeSA9IChQb2xpY3kpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCXBvbGljeUVsZW1lbnQgPSBQb2xpY3lVdGlsLmdldFBvbGljeUNvbXBvbmVudEFzT01FbGVtZW50KHBvbGljeSwKLQkJCQkJc2VyaWFsaXplcik7Ci0JCQlmaXJzdENoaWxkID0gZGVmaW5pdGlvbi5nZXRGaXJzdE9NQ2hpbGQoKTsKLQkJCWlmIChmaXJzdENoaWxkICE9IG51bGwpIHsKLQkJCQlmaXJzdENoaWxkLmluc2VydFNpYmxpbmdCZWZvcmUocG9saWN5RWxlbWVudCk7Ci0JCQl9IGVsc2UgewotCQkJCWRlZmluaXRpb25FbGVtZW50LmFkZENoaWxkKHBvbGljeUVsZW1lbnQpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZFBvbGljeVRvRGVmaW5pdGlvbkVsZW1lbnQoU3RyaW5nIGtleSwgUG9saWN5IHBvbGljeSkgewotCQlwb2xpY2llc0luRGVmaW5pdGlvbnMucHV0KGtleSwgcG9saWN5KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFN0eWxlKCkgewotCQlyZXR1cm4gc3R5bGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3R5bGUoU3RyaW5nIHN0eWxlKSB7Ci0JCXRoaXMuc3R5bGUgPSBzdHlsZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFVzZSgpIHsKLQkJcmV0dXJuIHVzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRVc2UoU3RyaW5nIHVzZSkgewotCQl0aGlzLnVzZSA9IHVzZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZ2VuZXJhdGVTb2FwMTFQb3J0KE9NRmFjdG9yeSBmYWMsIE9NRWxlbWVudCBkZWZpbml0aW9uLAotCQkJT01FbGVtZW50IHNlcnZpY2UpIHRocm93cyBFeGNlcHRpb24gewotCQlJdGVyYXRvciBpdGVyYXRvciA9IGF4aXNTZXJ2aWNlLmdldEVuZHBvaW50cygpLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCUF4aXNFbmRwb2ludCBheGlzRW5kcG9pbnQ7Ci0JCUF4aXNCaW5kaW5nIGF4aXNCaW5kaW5nOwotCQlmb3IgKDsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJYXhpc0VuZHBvaW50ID0gKEF4aXNFbmRwb2ludCkgaXRlcmF0b3IubmV4dCgpOwotCQkJLyoKLQkJCSAqIFNvbWUgdHJhbnNwb3J0cyBtaWdodCBub3QgYmUgYWN0aXZlIGF0IHJ1bnRpbWUuCi0JCQkgKi8KLQkJCWlmICghYXhpc0VuZHBvaW50LmlzQWN0aXZlKCkpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWF4aXNCaW5kaW5nID0gYXhpc0VuZHBvaW50LmdldEJpbmRpbmcoKTsKLQkJCVN0cmluZyB0eXBlID0gYXhpc0JpbmRpbmcuZ2V0VHlwZSgpOwotCQkJaWYgKEphdmEyV1NETENvbnN0YW50cy5UUkFOU1BPUlRfVVJJLmVxdWFscyh0eXBlKQotCQkJCQl8fCBXU0RMMkNvbnN0YW50cy5VUklfV1NETDJfU09BUC5lcXVhbHModHlwZSkpIHsKLQkJCQlTdHJpbmcgdmVyc2lvbiA9IChTdHJpbmcpIGF4aXNCaW5kaW5nCi0JCQkJCQkuZ2V0UHJvcGVydHkoV1NETDJDb25zdGFudHMuQVRUUl9XU09BUF9WRVJTSU9OKTsKLQkJCQlpZiAoU09BUDExQ29uc3RhbnRzLlNPQVBfRU5WRUxPUEVfTkFNRVNQQUNFX1VSSS5lcXVhbHModmVyc2lvbikpIHsKLQkJCQkJT01FbGVtZW50IHBvcnQgPSBmYWMuY3JlYXRlT01FbGVtZW50KFBPUlQsIHdzZGwpOwotCQkJCQlzZXJ2aWNlLmFkZENoaWxkKHBvcnQpOwotCQkJCQlwb3J0LmFkZEF0dHJpYnV0ZShBVFRSSUJVVEVfTkFNRSwgYXhpc0VuZHBvaW50LmdldE5hbWUoKSwKLQkJCQkJCQludWxsKTsKLQkJCQkJUU5hbWUgcW5hbWUgPSBheGlzQmluZGluZy5nZXROYW1lKCk7Ci0JCQkJCXBvcnQuYWRkQXR0cmlidXRlKEJJTkRJTkdfTE9DQUxfTkFNRSwgdG5zLmdldFByZWZpeCgpICsgIjoiCi0JCQkJCQkJKyBxbmFtZS5nZXRMb2NhbFBhcnQoKSwgbnVsbCk7Ci0JCQkJCVN0cmluZyBlbmRwb2ludFVSTCA9IGdldEVuZHBvaW50VVJMKGF4aXNFbmRwb2ludCk7Ci0JCQkJCVdTRExTZXJpYWxpemF0aW9uVXRpbC5hZGRFeHRlbnNpb25FbGVtZW50KGZhYywgcG9ydCwKLQkJCQkJCQlTT0FQX0FERFJFU1MsIExPQ0FUSU9OLCAoZW5kcG9pbnRVUkwgPT0gbnVsbCkgPyAiIgotCQkJCQkJCQkJOiBlbmRwb2ludFVSTCwgc29hcCk7Ci0JCQkJCWdlbmVyYXRlRVBSRWxlbWVudChmYWMsIHBvcnQsIGVuZHBvaW50VVJMKTsKLQkJCQkJYWRkUG9saWN5QXNFeHRFbGVtZW50KGF4aXNFbmRwb2ludCwgcG9ydCk7Ci0JCQkJCWdlbmVyYXRlU29hcDExQmluZGluZyhmYWMsIGRlZmluaXRpb24sIGF4aXNFbmRwb2ludAotCQkJCQkJCS5nZXRCaW5kaW5nKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBnZW5lcmF0ZVNvYXAxMlBvcnQoT01GYWN0b3J5IGZhYywgT01FbGVtZW50IGRlZmluaXRpb24sCi0JCQlPTUVsZW1lbnQgc2VydmljZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJLy8gLy8vLy8vLy8vLy8vLy8vLy8vLyBGSVhNRSAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBheGlzU2VydmljZS5nZXRFbmRwb2ludHMoKS52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQlBeGlzRW5kcG9pbnQgYXhpc0VuZHBvaW50OwotCQlBeGlzQmluZGluZyBheGlzQmluZGluZzsKLQkJZm9yICg7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCWF4aXNFbmRwb2ludCA9IChBeGlzRW5kcG9pbnQpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCS8qCi0JCQkgKiAKLQkJCSAqLwotCQkJaWYgKCFheGlzRW5kcG9pbnQuaXNBY3RpdmUoKSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJYXhpc0JpbmRpbmcgPSBheGlzRW5kcG9pbnQuZ2V0QmluZGluZygpOwotCQkJU3RyaW5nIHR5cGUgPSBheGlzQmluZGluZy5nZXRUeXBlKCk7Ci0JCQlpZiAoSmF2YTJXU0RMQ29uc3RhbnRzLlRSQU5TUE9SVF9VUkkuZXF1YWxzKHR5cGUpCi0JCQkJCXx8IFdTREwyQ29uc3RhbnRzLlVSSV9XU0RMMl9TT0FQLmVxdWFscyh0eXBlKSkgewotCQkJCVN0cmluZyB2ZXJzaW9uID0gKFN0cmluZykgYXhpc0JpbmRpbmcKLQkJCQkJCS5nZXRQcm9wZXJ0eShXU0RMMkNvbnN0YW50cy5BVFRSX1dTT0FQX1ZFUlNJT04pOwotCQkJCWlmIChTT0FQMTJDb25zdGFudHMuU09BUF9FTlZFTE9QRV9OQU1FU1BBQ0VfVVJJLmVxdWFscyh2ZXJzaW9uKSkgewotCi0JCQkJCU9NRWxlbWVudCBwb3J0ID0gZmFjLmNyZWF0ZU9NRWxlbWVudChQT1JULCB3c2RsKTsKLQkJCQkJc2VydmljZS5hZGRDaGlsZChwb3J0KTsKLQkJCQkJcG9ydC5hZGRBdHRyaWJ1dGUoQVRUUklCVVRFX05BTUUsIGF4aXNFbmRwb2ludC5nZXROYW1lKCksCi0JCQkJCQkJbnVsbCk7Ci0JCQkJCVFOYW1lIHFuYW1lID0gYXhpc0JpbmRpbmcuZ2V0TmFtZSgpOwotCQkJCQlwb3J0LmFkZEF0dHJpYnV0ZShCSU5ESU5HX0xPQ0FMX05BTUUsIHRucy5nZXRQcmVmaXgoKSArICI6IgotCQkJCQkJCSsgcW5hbWUuZ2V0TG9jYWxQYXJ0KCksIG51bGwpOwotCQkJCQlTdHJpbmcgZW5kcG9pbnRVUkwgPSBnZXRFbmRwb2ludFVSTChheGlzRW5kcG9pbnQpOwotCQkJCQlXU0RMU2VyaWFsaXphdGlvblV0aWwuYWRkRXh0ZW5zaW9uRWxlbWVudChmYWMsIHBvcnQsCi0JCQkJCQkJU09BUF9BRERSRVNTLCBMT0NBVElPTiwgKGVuZHBvaW50VVJMID09IG51bGwpID8gIiIKLQkJCQkJCQkJCTogZW5kcG9pbnRVUkwsIHNvYXAxMik7Ci0JCQkJCWdlbmVyYXRlRVBSRWxlbWVudChmYWMsIHBvcnQsIGVuZHBvaW50VVJMKTsKLQkJCQkJYWRkUG9saWN5QXNFeHRFbGVtZW50KGF4aXNFbmRwb2ludCwgcG9ydCk7Ci0JCQkJCWdlbmVyYXRlU29hcDEyQmluZGluZyhmYWMsIGRlZmluaXRpb24sIGF4aXNFbmRwb2ludAotCQkJCQkJCS5nZXRCaW5kaW5nKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBnZW5lcmF0ZUh0dHBQb3J0KE9NRmFjdG9yeSBmYWMsIE9NRWxlbWVudCBkZWZpbml0aW9uLAotCQkJT01FbGVtZW50IHNlcnZpY2UpIHRocm93cyBFeGNlcHRpb24gewotCi0JCS8vIC8vLy8vLy8vLy8vLy8vLy8vLy8gRklYTUUgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gYXhpc1NlcnZpY2UuZ2V0RW5kcG9pbnRzKCkudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJQXhpc0VuZHBvaW50IGF4aXNFbmRwb2ludDsKLQkJQXhpc0JpbmRpbmcgYXhpc0JpbmRpbmc7Ci0JCWZvciAoOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlheGlzRW5kcG9pbnQgPSAoQXhpc0VuZHBvaW50KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkvKgotCQkJICogCi0JCQkgKi8KLQkJCWlmICghYXhpc0VuZHBvaW50LmlzQWN0aXZlKCkpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWF4aXNCaW5kaW5nID0gYXhpc0VuZHBvaW50LmdldEJpbmRpbmcoKTsKLQkJCVN0cmluZyB0eXBlID0gYXhpc0JpbmRpbmcuZ2V0VHlwZSgpOwotCQkJaWYgKFdTREwyQ29uc3RhbnRzLlVSSV9XU0RMMl9IVFRQLmVxdWFscyh0eXBlKSkgewotCQkJCU9NRWxlbWVudCBwb3J0ID0gZmFjLmNyZWF0ZU9NRWxlbWVudChQT1JULCB3c2RsKTsKLQkJCQlzZXJ2aWNlLmFkZENoaWxkKHBvcnQpOwotCQkJCXBvcnQuYWRkQXR0cmlidXRlKEFUVFJJQlVURV9OQU1FLCBheGlzRW5kcG9pbnQuZ2V0TmFtZSgpLCBudWxsKTsKLQkJCQlRTmFtZSBxbmFtZSA9IGF4aXNCaW5kaW5nLmdldE5hbWUoKTsKLQkJCQlwb3J0LmFkZEF0dHJpYnV0ZShCSU5ESU5HX0xPQ0FMX05BTUUsIHRucy5nZXRQcmVmaXgoKSArICI6IgotCQkJCQkJKyBxbmFtZS5nZXRMb2NhbFBhcnQoKSwgbnVsbCk7Ci0JCQkJT01FbGVtZW50IGV4dEVsZW1lbnQgPSBmYWMuY3JlYXRlT01FbGVtZW50KCJhZGRyZXNzIiwgaHR0cCk7Ci0JCQkJU3RyaW5nIGVuZHBvaW50VVJMID0gZ2V0RW5kcG9pbnRVUkwoYXhpc0VuZHBvaW50KTsKLQkJCQlleHRFbGVtZW50LmFkZEF0dHJpYnV0ZSgibG9jYXRpb24iLCAoZW5kcG9pbnRVUkwgPT0gbnVsbCkgPyAiIgotCQkJCQkJOiBlbmRwb2ludFVSTCwgbnVsbCk7Ci0JCQkJcG9ydC5hZGRDaGlsZChleHRFbGVtZW50KTsKLQotCQkJCWFkZFBvbGljeUFzRXh0RWxlbWVudChheGlzRW5kcG9pbnQsIHBvcnQpOwotCQkJCWdlbmVyYXRlSHR0cEJpbmRpbmcoZmFjLCBkZWZpbml0aW9uLCBheGlzRW5kcG9pbnQuZ2V0QmluZGluZygpKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBnZW5lcmF0ZVNvYXAxMUJpbmRpbmcoT01GYWN0b3J5IGZhYywgT01FbGVtZW50IGRlZmludGlvbnMsCi0JCQlBeGlzQmluZGluZyBheGlzQmluZGluZykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmIChpc0FscmVhZHlBZGRlZChheGlzQmluZGluZywgZGVmaW50aW9ucykpIHsKLQkJCXJldHVybjsKLQkJfQotCQlPTUVsZW1lbnQgYmluZGluZyA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoQklORElOR19MT0NBTF9OQU1FLCB3c2RsKTsKLQkJT01FbGVtZW50IHNlcnZpY2VFbGVtZW50ID0gZGVmaW50aW9ucy5nZXRGaXJzdENoaWxkV2l0aE5hbWUobmV3IFFOYW1lKAotCQkJCXdzZGwuZ2V0TmFtZXNwYWNlVVJJKCksIFNFUlZJQ0VfTE9DQUxfTkFNRSkpOwotCQlzZXJ2aWNlRWxlbWVudC5pbnNlcnRTaWJsaW5nQmVmb3JlKGJpbmRpbmcpOwotCi0JCVFOYW1lIHFuYW1lID0gYXhpc0JpbmRpbmcuZ2V0TmFtZSgpOwotCQliaW5kaW5nLmFkZEF0dHJpYnV0ZShBVFRSSUJVVEVfTkFNRSwgcW5hbWUuZ2V0TG9jYWxQYXJ0KCksIG51bGwpOwotCQliaW5kaW5nLmFkZEF0dHJpYnV0ZSgidHlwZSIsIHRucy5nZXRQcmVmaXgoKSArICI6IiArIHNlcnZpY2VOYW1lCi0JCQkJKyBQT1JUX1RZUEVfU1VGRklYLCBudWxsKTsKLQotCQkvLyBBZGRpbmcgZXh0IGVsZW1lbnRzCi0JCWFkZFBvbGljeUFzRXh0RWxlbWVudChheGlzQmluZGluZywgYmluZGluZyk7Ci0JCWFkZEV4dGVuc2lvbkVsZW1lbnQoZmFjLCBiaW5kaW5nLCBCSU5ESU5HX0xPQ0FMX05BTUUsIFRSQU5TUE9SVCwKLQkJCQlUUkFOU1BPUlRfVVJJLCBTVFlMRSwgc3R5bGUsIHNvYXApOwotCi0JCS8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCQkvLyBBZGQgV1MtQWRkcmVzc2luZyBVc2luZ0FkZHJlc3NpbmcgZWxlbWVudCBpZiBhcHByb3ByaWF0ZQotCQkvLyBTSE9VTEQgYmUgb24gdGhlIGJpbmRpbmcgZWxlbWVudCBwZXIgdGhlIHNwZWNpZmljYXRpb24KLQkJaWYgKEFkZHJlc3NpbmdIZWxwZXIKLQkJCQkuZ2V0QWRkcmVzc2luZ1JlcXVpcmVtZW50UGFyZW1ldGVyVmFsdWUoYXhpc1NlcnZpY2UpLmVxdWFscygKLQkJCQkJCUFkZHJlc3NpbmdDb25zdGFudHMuQUREUkVTU0lOR19PUFRJT05BTCkpIHsKLQkJCVdTRExTZXJpYWxpemF0aW9uVXRpbC5hZGRFeHRlbnNpb25FbGVtZW50KGZhYywgYmluZGluZywKLQkJCQkJQWRkcmVzc2luZ0NvbnN0YW50cy5VU0lOR19BRERSRVNTSU5HLAotCQkJCQlERUZBVUxUX1dTRExfTkFNRVNQQUNFX1BSRUZJWCArICI6cmVxdWlyZWQiLCAidHJ1ZSIsIHdzYXcpOwotCQl9IGVsc2UgaWYgKEFkZHJlc3NpbmdIZWxwZXIuZ2V0QWRkcmVzc2luZ1JlcXVpcmVtZW50UGFyZW1ldGVyVmFsdWUoCi0JCQkJYXhpc1NlcnZpY2UpLmVxdWFscyhBZGRyZXNzaW5nQ29uc3RhbnRzLkFERFJFU1NJTkdfUkVRVUlSRUQpKSB7Ci0JCQlXU0RMU2VyaWFsaXphdGlvblV0aWwuYWRkRXh0ZW5zaW9uRWxlbWVudChmYWMsIGJpbmRpbmcsCi0JCQkJCUFkZHJlc3NpbmdDb25zdGFudHMuVVNJTkdfQUREUkVTU0lORywKLQkJCQkJREVGQVVMVF9XU0RMX05BTUVTUEFDRV9QUkVGSVggKyAiOnJlcXVpcmVkIiwgInRydWUiLCB3c2F3KTsKLQkJfQotCQkvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLQkJZm9yIChJdGVyYXRvciBheGlzQmluZGluZ09wZXJhdGlvbnMgPSBheGlzQmluZGluZy5nZXRDaGlsZHJlbigpOyBheGlzQmluZGluZ09wZXJhdGlvbnMKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJQXhpc0JpbmRpbmdPcGVyYXRpb24gYXhpc0JpbmRpbmdPcGVyYXRpb24gPSAoQXhpc0JpbmRpbmdPcGVyYXRpb24pIGF4aXNCaW5kaW5nT3BlcmF0aW9ucwotCQkJCQkubmV4dCgpOwotCQkJQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uID0gYXhpc0JpbmRpbmdPcGVyYXRpb24KLQkJCQkJLmdldEF4aXNPcGVyYXRpb24oKTsKLQkJCWlmIChheGlzT3BlcmF0aW9uLmlzQ29udHJvbE9wZXJhdGlvbigpCi0JCQkJCXx8IGF4aXNPcGVyYXRpb24uZ2V0TmFtZSgpID09IG51bGwpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCVN0cmluZyBvcGVhcnRpb25OYW1lID0gYXhpc09wZXJhdGlvbi5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCk7Ci0JCQlPTUVsZW1lbnQgb3BlcmF0aW9uID0gZmFjLmNyZWF0ZU9NRWxlbWVudChPUEVSQVRJT05fTE9DQUxfTkFNRSwKLQkJCQkJd3NkbCk7Ci0JCQliaW5kaW5nLmFkZENoaWxkKG9wZXJhdGlvbik7Ci0JCQlTdHJpbmcgc29hcEFjdGlvbiA9IGF4aXNPcGVyYXRpb24uZ2V0U29hcEFjdGlvbigpOwotCQkJaWYgKHNvYXBBY3Rpb24gPT0gbnVsbCkgewotCQkJCXNvYXBBY3Rpb24gPSAiIjsKLQkJCX0KLQkJCWFkZFBvbGljeUFzRXh0RWxlbWVudChheGlzQmluZGluZ09wZXJhdGlvbiwgb3BlcmF0aW9uKTsKLQkJCWFkZEV4dGVuc2lvbkVsZW1lbnQoZmFjLCBvcGVyYXRpb24sIE9QRVJBVElPTl9MT0NBTF9OQU1FLAotCQkJCQlTT0FQX0FDVElPTiwgc29hcEFjdGlvbiwgU1RZTEUsIHN0eWxlLCBzb2FwKTsKLQotCQkJLy8gYWRkUG9saWN5QXNFeHRFbGVtZW50KFBvbGljeUluY2x1ZGUuQklORElOR19PUEVSQVRJT05fUE9MSUNZLAotCQkJLy8gYXhpc09wZXJhdGlvbi5nZXRQb2xpY3lJbmNsdWRlKCksIG9wZXJhdGlvbik7Ci0KLQkJCVN0cmluZyBNRVAgPSBheGlzT3BlcmF0aW9uLmdldE1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4oKTsKLQotCQkJaWYgKFdTREwyQ29uc3RhbnRzLk1FUF9VUklfSU5fT05MWS5lcXVhbHMoTUVQKQotCQkJCQl8fCBXU0RMMkNvbnN0YW50cy5NRVBfVVJJX0lOX09QVElPTkFMX09VVC5lcXVhbHMoTUVQKQotCQkJCQl8fCBXU0RMMkNvbnN0YW50cy5NRVBfVVJJX09VVF9PUFRJT05BTF9JTi5lcXVhbHMoTUVQKQotCQkJCQl8fCBXU0RMMkNvbnN0YW50cy5NRVBfVVJJX1JPQlVTVF9PVVRfT05MWS5lcXVhbHMoTUVQKQotCQkJCQl8fCBXU0RMMkNvbnN0YW50cy5NRVBfVVJJX1JPQlVTVF9JTl9PTkxZLmVxdWFscyhNRVApCi0JCQkJCXx8IFdTREwyQ29uc3RhbnRzLk1FUF9VUklfSU5fT1VULmVxdWFscyhNRVApKSB7Ci0JCQkJQXhpc0JpbmRpbmdNZXNzYWdlIGF4aXNCaW5kaW5nSW5NZXNzYWdlID0gKEF4aXNCaW5kaW5nTWVzc2FnZSkgYXhpc0JpbmRpbmdPcGVyYXRpb24KLQkJCQkJCS5nZXRDaGlsZChXU0RMQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfSU5fVkFMVUUpOwotCQkJCWlmIChheGlzQmluZGluZ0luTWVzc2FnZSAhPSBudWxsKSB7Ci0JCQkJCUF4aXNNZXNzYWdlIGluYXhpc01lc3NhZ2UgPSBheGlzQmluZGluZ0luTWVzc2FnZQotCQkJCQkJCS5nZXRBeGlzTWVzc2FnZSgpOwotCi0JCQkJCWlmIChpbmF4aXNNZXNzYWdlICE9IG51bGwpIHsKLQkJCQkJCW9wZXJhdGlvbi5hZGRBdHRyaWJ1dGUoQVRUUklCVVRFX05BTUUsIG9wZWFydGlvbk5hbWUsCi0JCQkJCQkJCW51bGwpOwotCQkJCQkJT01FbGVtZW50IGlucHV0ID0gZmFjLmNyZWF0ZU9NRWxlbWVudCgKLQkJCQkJCQkJSU5fUFVUX0xPQ0FMX05BTUUsIHdzZGwpOwotCQkJCQkJYWRkUG9saWN5QXNFeHRFbGVtZW50KGF4aXNCaW5kaW5nSW5NZXNzYWdlLCBpbnB1dCk7Ci0JCQkJCQlhZGRFeHRlbnNpb25FbGVtZW50KGZhYywgaW5wdXQsIFNPQVBfQk9EWSwgU09BUF9VU0UsCi0JCQkJCQkJCXVzZSwgbnVsbCwgdGFyZ2V0TmFtZXNwYWNlLCBzb2FwKTsKLQkJCQkJCS8vIGFkZFBvbGljeUFzRXh0RWxlbWVudChQb2xpY3lJbmNsdWRlLkJJTkRJTkdfSU5QVVRfUE9MSUNZLAotCQkJCQkJLy8gaW5heGlzTWVzc2FnZS5nZXRQb2xpY3lJbmNsdWRlKCksIGlucHV0KTsKLQkJCQkJCW9wZXJhdGlvbi5hZGRDaGlsZChpbnB1dCk7Ci0JCQkJCQl3cml0ZVNvYXBIZWFkZXJzKGluYXhpc01lc3NhZ2UsIGZhYywgaW5wdXQsIHNvYXAxMik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChXU0RMMkNvbnN0YW50cy5NRVBfVVJJX09VVF9PTkxZLmVxdWFscyhNRVApCi0JCQkJCXx8IFdTREwyQ29uc3RhbnRzLk1FUF9VUklfT1VUX09QVElPTkFMX0lOLmVxdWFscyhNRVApCi0JCQkJCXx8IFdTREwyQ29uc3RhbnRzLk1FUF9VUklfSU5fT1BUSU9OQUxfT1VULmVxdWFscyhNRVApCi0JCQkJCXx8IFdTREwyQ29uc3RhbnRzLk1FUF9VUklfUk9CVVNUX09VVF9PTkxZLmVxdWFscyhNRVApCi0JCQkJCXx8IFdTREwyQ29uc3RhbnRzLk1FUF9VUklfSU5fT1VULmVxdWFscyhNRVApKSB7Ci0KLQkJCQlBeGlzQmluZGluZ01lc3NhZ2UgYXhpc0JpbmRpbmdPdXRNZXNzYWdlID0gKEF4aXNCaW5kaW5nTWVzc2FnZSkgYXhpc0JpbmRpbmdPcGVyYXRpb24KLQkJCQkJCS5nZXRDaGlsZChXU0RMQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfT1VUX1ZBTFVFKTsKLQkJCQlpZiAoYXhpc0JpbmRpbmdPdXRNZXNzYWdlICE9IG51bGwpIHsKLQkJCQkJQXhpc01lc3NhZ2Ugb3V0QXhpc01lc3NhZ2UgPSBheGlzQmluZGluZ091dE1lc3NhZ2UKLQkJCQkJCQkuZ2V0QXhpc01lc3NhZ2UoKTsKLQkJCQkJaWYgKG91dEF4aXNNZXNzYWdlICE9IG51bGwpIHsKLQkJCQkJCU9NRWxlbWVudCBvdXRwdXQgPSBmYWMuY3JlYXRlT01FbGVtZW50KAotCQkJCQkJCQlPVVRfUFVUX0xPQ0FMX05BTUUsIHdzZGwpOwotCQkJCQkJYWRkUG9saWN5QXNFeHRFbGVtZW50KGF4aXNCaW5kaW5nT3V0TWVzc2FnZSwgb3V0cHV0KTsKLQkJCQkJCWFkZEV4dGVuc2lvbkVsZW1lbnQoZmFjLCBvdXRwdXQsIFNPQVBfQk9EWSwgU09BUF9VU0UsCi0JCQkJCQkJCXVzZSwgbnVsbCwgdGFyZ2V0TmFtZXNwYWNlLCBzb2FwKTsKLQkJCQkJCS8vIGFkZFBvbGljeUFzRXh0RWxlbWVudChQb2xpY3lJbmNsdWRlLkJJTkRJTkdfT1VUUFVUX1BPTElDWSwKLQkJCQkJCS8vIG91dEF4aXNNZXNzYWdlLmdldFBvbGljeUluY2x1ZGUoKSwgb3V0cHV0KTsKLQkJCQkJCW9wZXJhdGlvbi5hZGRDaGlsZChvdXRwdXQpOwotCQkJCQkJd3JpdGVTb2FwSGVhZGVycyhvdXRBeGlzTWVzc2FnZSwgZmFjLCBvdXRwdXQsIHNvYXAxMik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIGdlbmVyYXRlIGZhdWx0IE1lc3NhZ2VzCi0JCQlBcnJheUxpc3QgZmF1bHR5TWVzc2FnZXMgPSBheGlzQmluZGluZ09wZXJhdGlvbi5nZXRGYXVsdHMoKTsKLQkJCWlmIChmYXVsdHlNZXNzYWdlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChPYmplY3QgZmF1bHR5TWVzc2FnZTEgOiBmYXVsdHlNZXNzYWdlcykgewotICAgICAgICAgICAgICAgICAgICBBeGlzQmluZGluZ01lc3NhZ2UgYmluZGluZ0ZhdWx0eU1lc3NhZ2UgPSAoQXhpc0JpbmRpbmdNZXNzYWdlKWZhdWx0eU1lc3NhZ2UxOwotICAgICAgICAgICAgICAgICAgICBpZiAoYmluZGluZ0ZhdWx0eU1lc3NhZ2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgQXhpc01lc3NhZ2UgZmF1bHR5TWVzc2FnZSA9IGJpbmRpbmdGYXVsdHlNZXNzYWdlLmdldEF4aXNNZXNzYWdlKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIE9NRWxlbWVudCBmYXVsdCA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoRkFVTFRfTE9DQUxfTkFNRSwgd3NkbCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZFBvbGljeUFzRXh0RWxlbWVudChiaW5kaW5nRmF1bHR5TWVzc2FnZSwgZmF1bHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgYWRkRXh0ZW5zaW9uRWxlbWVudChmYWMsIGZhdWx0LCBGQVVMVF9MT0NBTF9OQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT0FQX1VTRSwgdXNlLCBBVFRSSUJVVEVfTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmF1bHR5TWVzc2FnZS5nZXROYW1lKCksIHNvYXApOwotICAgICAgICAgICAgICAgICAgICAgICAgZmF1bHQuYWRkQXR0cmlidXRlKEFUVFJJQlVURV9OQU1FLCBmYXVsdHlNZXNzYWdlLmdldE5hbWUoKSwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGQgcG9saWNpZXMgZm9yIGZhdWx0IG1lc3NhZ2VzCi0gICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24uYWRkQ2hpbGQoZmF1bHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVTb2FwSGVhZGVycyhmYXVsdHlNZXNzYWdlLCBmYWMsIGZhdWx0LCBzb2FwKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBnZW5lcmF0ZVNvYXAxMkJpbmRpbmcoT01GYWN0b3J5IGZhYywgT01FbGVtZW50IGRlZmluaXRpb25zLAotCQkJQXhpc0JpbmRpbmcgYXhpc0JpbmRpbmcpIHRocm93cyBFeGNlcHRpb24gewotCQlpZiAoaXNBbHJlYWR5QWRkZWQoYXhpc0JpbmRpbmcsIGRlZmluaXRpb25zKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCU9NRWxlbWVudCBiaW5kaW5nID0gZmFjLmNyZWF0ZU9NRWxlbWVudChCSU5ESU5HX0xPQ0FMX05BTUUsIHdzZGwpOwotCQlPTUVsZW1lbnQgc2VydmljZUVsZW1lbnQgPSBkZWZpbml0aW9ucy5nZXRGaXJzdENoaWxkV2l0aE5hbWUobmV3IFFOYW1lKAotCQkJCXdzZGwuZ2V0TmFtZXNwYWNlVVJJKCksIFNFUlZJQ0VfTE9DQUxfTkFNRSkpOwotCQlzZXJ2aWNlRWxlbWVudC5pbnNlcnRTaWJsaW5nQmVmb3JlKGJpbmRpbmcpOwotCi0JCVFOYW1lIHFuYW1lID0gYXhpc0JpbmRpbmcuZ2V0TmFtZSgpOwotCQliaW5kaW5nLmFkZEF0dHJpYnV0ZShBVFRSSUJVVEVfTkFNRSwgcW5hbWUuZ2V0TG9jYWxQYXJ0KCksIG51bGwpOwotCQliaW5kaW5nLmFkZEF0dHJpYnV0ZSgidHlwZSIsIHRucy5nZXRQcmVmaXgoKSArICI6IiArIHNlcnZpY2VOYW1lCi0JCQkJKyBQT1JUX1RZUEVfU1VGRklYLCBudWxsKTsKLQotCQkvLyBBZGRpbmcgZXh0IGVsZW1lbnRzCi0JCWFkZFBvbGljeUFzRXh0RWxlbWVudChheGlzQmluZGluZywgYmluZGluZyk7Ci0JCWFkZEV4dGVuc2lvbkVsZW1lbnQoZmFjLCBiaW5kaW5nLCBCSU5ESU5HX0xPQ0FMX05BTUUsIFRSQU5TUE9SVCwKLQkJCQlUUkFOU1BPUlRfVVJJLCBTVFlMRSwgc3R5bGUsIHNvYXAxMik7Ci0KLQkJLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JCS8vIEFkZCBXUy1BZGRyZXNzaW5nIFVzaW5nQWRkcmVzc2luZyBlbGVtZW50IGlmIGFwcHJvcHJpYXRlCi0JCS8vIFNIT1VMRCBiZSBvbiB0aGUgYmluZGluZyBlbGVtZW50IHBlciB0aGUgc3BlY2lmaWNhdGlvbgotCQlpZiAoQWRkcmVzc2luZ0hlbHBlcgotCQkJCS5nZXRBZGRyZXNzaW5nUmVxdWlyZW1lbnRQYXJlbWV0ZXJWYWx1ZShheGlzU2VydmljZSkuZXF1YWxzKAotCQkJCQkJQWRkcmVzc2luZ0NvbnN0YW50cy5BRERSRVNTSU5HX09QVElPTkFMKSkgewotCQkJV1NETFNlcmlhbGl6YXRpb25VdGlsLmFkZEV4dGVuc2lvbkVsZW1lbnQoZmFjLCBiaW5kaW5nLAotCQkJCQlBZGRyZXNzaW5nQ29uc3RhbnRzLlVTSU5HX0FERFJFU1NJTkcsCi0JCQkJCURFRkFVTFRfV1NETF9OQU1FU1BBQ0VfUFJFRklYICsgIjpyZXF1aXJlZCIsICJ0cnVlIiwgd3Nhdyk7Ci0JCX0gZWxzZSBpZiAoQWRkcmVzc2luZ0hlbHBlci5nZXRBZGRyZXNzaW5nUmVxdWlyZW1lbnRQYXJlbWV0ZXJWYWx1ZSgKLQkJCQlheGlzU2VydmljZSkuZXF1YWxzKEFkZHJlc3NpbmdDb25zdGFudHMuQUREUkVTU0lOR19SRVFVSVJFRCkpIHsKLQkJCVdTRExTZXJpYWxpemF0aW9uVXRpbC5hZGRFeHRlbnNpb25FbGVtZW50KGZhYywgYmluZGluZywKLQkJCQkJQWRkcmVzc2luZ0NvbnN0YW50cy5VU0lOR19BRERSRVNTSU5HLAotCQkJCQlERUZBVUxUX1dTRExfTkFNRVNQQUNFX1BSRUZJWCArICI6cmVxdWlyZWQiLCAidHJ1ZSIsIHdzYXcpOwotCQl9Ci0JCS8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotCQlmb3IgKEl0ZXJhdG9yIGF4aXNCaW5kaW5nT3BlcmF0aW9ucyA9IGF4aXNCaW5kaW5nLmdldENoaWxkcmVuKCk7IGF4aXNCaW5kaW5nT3BlcmF0aW9ucwotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlBeGlzQmluZGluZ09wZXJhdGlvbiBheGlzQmluZGluZ09wZXJhdGlvbiA9IChBeGlzQmluZGluZ09wZXJhdGlvbikgYXhpc0JpbmRpbmdPcGVyYXRpb25zCi0JCQkJCS5uZXh0KCk7Ci0JCQlBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb24gPSBheGlzQmluZGluZ09wZXJhdGlvbgotCQkJCQkuZ2V0QXhpc09wZXJhdGlvbigpOwotCQkJaWYgKGF4aXNPcGVyYXRpb24uaXNDb250cm9sT3BlcmF0aW9uKCkKLQkJCQkJfHwgYXhpc09wZXJhdGlvbi5nZXROYW1lKCkgPT0gbnVsbCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJU3RyaW5nIG9wZWFydGlvbk5hbWUgPSBheGlzT3BlcmF0aW9uLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKTsKLQkJCU9NRWxlbWVudCBvcGVyYXRpb24gPSBmYWMuY3JlYXRlT01FbGVtZW50KE9QRVJBVElPTl9MT0NBTF9OQU1FLAotCQkJCQl3c2RsKTsKLQkJCWJpbmRpbmcuYWRkQ2hpbGQob3BlcmF0aW9uKTsKLQkJCVN0cmluZyBzb2FwQWN0aW9uID0gYXhpc09wZXJhdGlvbi5nZXRTb2FwQWN0aW9uKCk7Ci0JCQlpZiAoc29hcEFjdGlvbiA9PSBudWxsKSB7Ci0JCQkJc29hcEFjdGlvbiA9ICIiOwotCQkJfQotCQkJYWRkUG9saWN5QXNFeHRFbGVtZW50KGF4aXNCaW5kaW5nT3BlcmF0aW9uLCBvcGVyYXRpb24pOwotCQkJYWRkRXh0ZW5zaW9uRWxlbWVudChmYWMsIG9wZXJhdGlvbiwgT1BFUkFUSU9OX0xPQ0FMX05BTUUsCi0JCQkJCVNPQVBfQUNUSU9OLCBzb2FwQWN0aW9uLCBTVFlMRSwgc3R5bGUsIHNvYXAxMik7Ci0KLQkJCS8vIGFkZFBvbGljeUFzRXh0RWxlbWVudChQb2xpY3lJbmNsdWRlLkJJTkRJTkdfT1BFUkFUSU9OX1BPTElDWSwKLQkJCS8vIGF4aXNPcGVyYXRpb24uZ2V0UG9saWN5SW5jbHVkZSgpLCBvcGVyYXRpb24pOwotCi0JCQlTdHJpbmcgTUVQID0gYXhpc09wZXJhdGlvbi5nZXRNZXNzYWdlRXhjaGFuZ2VQYXR0ZXJuKCk7Ci0KLQkJCWlmIChXU0RMMkNvbnN0YW50cy5NRVBfVVJJX0lOX09OTFkuZXF1YWxzKE1FUCkKLQkJCQkJfHwgV1NETDJDb25zdGFudHMuTUVQX1VSSV9JTl9PUFRJT05BTF9PVVQuZXF1YWxzKE1FUCkKLQkJCQkJfHwgV1NETDJDb25zdGFudHMuTUVQX1VSSV9PVVRfT1BUSU9OQUxfSU4uZXF1YWxzKE1FUCkKLQkJCQkJfHwgV1NETDJDb25zdGFudHMuTUVQX1VSSV9ST0JVU1RfT1VUX09OTFkuZXF1YWxzKE1FUCkKLQkJCQkJfHwgV1NETDJDb25zdGFudHMuTUVQX1VSSV9ST0JVU1RfSU5fT05MWS5lcXVhbHMoTUVQKQotCQkJCQl8fCBXU0RMMkNvbnN0YW50cy5NRVBfVVJJX0lOX09VVC5lcXVhbHMoTUVQKSkgewotCQkJCUF4aXNCaW5kaW5nTWVzc2FnZSBheGlzQmluZGluZ0luTWVzc2FnZSA9IChBeGlzQmluZGluZ01lc3NhZ2UpIGF4aXNCaW5kaW5nT3BlcmF0aW9uCi0JCQkJCQkuZ2V0Q2hpbGQoV1NETENvbnN0YW50cy5NRVNTQUdFX0xBQkVMX0lOX1ZBTFVFKTsKLQkJCQlpZiAoYXhpc0JpbmRpbmdJbk1lc3NhZ2UgIT0gbnVsbCkgewotCQkJCQlBeGlzTWVzc2FnZSBpbmF4aXNNZXNzYWdlID0gYXhpc0JpbmRpbmdJbk1lc3NhZ2UKLQkJCQkJCQkuZ2V0QXhpc01lc3NhZ2UoKTsKLQotCQkJCQlpZiAoaW5heGlzTWVzc2FnZSAhPSBudWxsKSB7Ci0JCQkJCQlvcGVyYXRpb24uYWRkQXR0cmlidXRlKEFUVFJJQlVURV9OQU1FLCBvcGVhcnRpb25OYW1lLAotCQkJCQkJCQludWxsKTsKLQkJCQkJCU9NRWxlbWVudCBpbnB1dCA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoCi0JCQkJCQkJCUlOX1BVVF9MT0NBTF9OQU1FLCB3c2RsKTsKLQkJCQkJCWFkZFBvbGljeUFzRXh0RWxlbWVudChheGlzQmluZGluZ0luTWVzc2FnZSwgaW5wdXQpOwotCQkJCQkJYWRkRXh0ZW5zaW9uRWxlbWVudChmYWMsIGlucHV0LCBTT0FQX0JPRFksIFNPQVBfVVNFLAotCQkJCQkJCQl1c2UsIG51bGwsIHRhcmdldE5hbWVzcGFjZSwgc29hcDEyKTsKLQkJCQkJCW9wZXJhdGlvbi5hZGRDaGlsZChpbnB1dCk7Ci0JCQkJCQl3cml0ZVNvYXBIZWFkZXJzKGluYXhpc01lc3NhZ2UsIGZhYywgaW5wdXQsIHNvYXAxMik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChXU0RMMkNvbnN0YW50cy5NRVBfVVJJX09VVF9PTkxZLmVxdWFscyhNRVApCi0JCQkJCXx8IFdTREwyQ29uc3RhbnRzLk1FUF9VUklfT1VUX09QVElPTkFMX0lOLmVxdWFscyhNRVApCi0JCQkJCXx8IFdTREwyQ29uc3RhbnRzLk1FUF9VUklfSU5fT1BUSU9OQUxfT1VULmVxdWFscyhNRVApCi0JCQkJCXx8IFdTREwyQ29uc3RhbnRzLk1FUF9VUklfUk9CVVNUX09VVF9PTkxZLmVxdWFscyhNRVApCi0JCQkJCXx8IFdTREwyQ29uc3RhbnRzLk1FUF9VUklfSU5fT1VULmVxdWFscyhNRVApKSB7Ci0KLQkJCQlBeGlzQmluZGluZ01lc3NhZ2UgYXhpc0JpbmRpbmdPdXRNZXNzYWdlID0gKEF4aXNCaW5kaW5nTWVzc2FnZSkgYXhpc0JpbmRpbmdPcGVyYXRpb24KLQkJCQkJCS5nZXRDaGlsZChXU0RMQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfT1VUX1ZBTFVFKTsKLQkJCQlpZiAoYXhpc0JpbmRpbmdPdXRNZXNzYWdlICE9IG51bGwpIHsKLQkJCQkJQXhpc01lc3NhZ2Ugb3V0QXhpc01lc3NhZ2UgPSBheGlzQmluZGluZ091dE1lc3NhZ2UKLQkJCQkJCQkuZ2V0QXhpc01lc3NhZ2UoKTsKLQkJCQkJaWYgKG91dEF4aXNNZXNzYWdlICE9IG51bGwpIHsKLQkJCQkJCU9NRWxlbWVudCBvdXRwdXQgPSBmYWMuY3JlYXRlT01FbGVtZW50KAotCQkJCQkJCQlPVVRfUFVUX0xPQ0FMX05BTUUsIHdzZGwpOwotCQkJCQkJYWRkUG9saWN5QXNFeHRFbGVtZW50KGF4aXNCaW5kaW5nT3V0TWVzc2FnZSwgb3V0cHV0KTsKLQkJCQkJCWFkZEV4dGVuc2lvbkVsZW1lbnQoZmFjLCBvdXRwdXQsIFNPQVBfQk9EWSwgU09BUF9VU0UsCi0JCQkJCQkJCXVzZSwgbnVsbCwgdGFyZ2V0TmFtZXNwYWNlLCBzb2FwMTIpOwotCQkJCQkJLy8gYWRkUG9saWN5QXNFeHRFbGVtZW50KFBvbGljeUluY2x1ZGUuQklORElOR19PVVRQVVRfUE9MSUNZLAotCQkJCQkJLy8gb3V0QXhpc01lc3NhZ2UuZ2V0UG9saWN5SW5jbHVkZSgpLCBvdXRwdXQpOwotCQkJCQkJb3BlcmF0aW9uLmFkZENoaWxkKG91dHB1dCk7Ci0JCQkJCQl3cml0ZVNvYXBIZWFkZXJzKG91dEF4aXNNZXNzYWdlLCBmYWMsIG91dHB1dCwgc29hcDEyKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJLy8gZ2VuZXJhdGUgZmF1bHQgTWVzc2FnZXMKLQkJCUFycmF5TGlzdCBmYXVsdHlNZXNzYWdlcyA9IGF4aXNCaW5kaW5nT3BlcmF0aW9uLmdldEZhdWx0cygpOwotCQkJaWYgKGZhdWx0eU1lc3NhZ2VzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb3IgKE9iamVjdCBmYXVsdHlNZXNzYWdlMSA6IGZhdWx0eU1lc3NhZ2VzKSB7Ci0gICAgICAgICAgICAgICAgICAgIEF4aXNCaW5kaW5nTWVzc2FnZSBiaW5kaW5nRmF1bHR5TWVzc2FnZSA9IChBeGlzQmluZGluZ01lc3NhZ2UpZmF1bHR5TWVzc2FnZTE7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChiaW5kaW5nRmF1bHR5TWVzc2FnZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBeGlzTWVzc2FnZSBmYXVsdHlNZXNzYWdlID0gYmluZGluZ0ZhdWx0eU1lc3NhZ2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEF4aXNNZXNzYWdlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBPTUVsZW1lbnQgZmF1bHQgPSBmYWMuY3JlYXRlT01FbGVtZW50KEZBVUxUX0xPQ0FMX05BTUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzZGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgYWRkUG9saWN5QXNFeHRFbGVtZW50KGJpbmRpbmdGYXVsdHlNZXNzYWdlLCBmYXVsdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhZGRFeHRlbnNpb25FbGVtZW50KGZhYywgZmF1bHQsIEZBVUxUX0xPQ0FMX05BTUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPQVBfVVNFLCB1c2UsIEFUVFJJQlVURV9OQU1FLCBmYXVsdHlNZXNzYWdlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXROYW1lKCksIHNvYXAxMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmYXVsdC5hZGRBdHRyaWJ1dGUoQVRUUklCVVRFX05BTUUsIGZhdWx0eU1lc3NhZ2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldE5hbWUoKSwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGQgcG9saWNpZXMgZm9yIGZhdWx0IG1lc3NhZ2VzCi0gICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24uYWRkQ2hpbGQoZmF1bHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVTb2FwSGVhZGVycyhmYXVsdHlNZXNzYWdlLCBmYWMsIGZhdWx0LCBzb2FwMTIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGdlbmVyYXRlSHR0cEJpbmRpbmcoT01GYWN0b3J5IGZhYywgT01FbGVtZW50IGRlZmluaXRpb25zLAotCQkJQXhpc0JpbmRpbmcgYXhpc0JpbmRpbmcpIHRocm93cyBFeGNlcHRpb24gewotCQlpZiAoaXNBbHJlYWR5QWRkZWQoYXhpc0JpbmRpbmcsIGRlZmluaXRpb25zKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCU9NRWxlbWVudCBiaW5kaW5nID0gZmFjLmNyZWF0ZU9NRWxlbWVudChCSU5ESU5HX0xPQ0FMX05BTUUsIHdzZGwpOwotCQlPTUVsZW1lbnQgc2VydmljZUVsZW1lbnQgPSBkZWZpbml0aW9ucy5nZXRGaXJzdENoaWxkV2l0aE5hbWUobmV3IFFOYW1lKAotCQkJCXdzZGwuZ2V0TmFtZXNwYWNlVVJJKCksIFNFUlZJQ0VfTE9DQUxfTkFNRSkpOwotCQlzZXJ2aWNlRWxlbWVudC5pbnNlcnRTaWJsaW5nQmVmb3JlKGJpbmRpbmcpOwotCi0JCVFOYW1lIHFuYW1lID0gYXhpc0JpbmRpbmcuZ2V0TmFtZSgpOwotCQliaW5kaW5nLmFkZEF0dHJpYnV0ZShBVFRSSUJVVEVfTkFNRSwgcW5hbWUuZ2V0TG9jYWxQYXJ0KCksIG51bGwpOwotCQliaW5kaW5nLmFkZEF0dHJpYnV0ZSgidHlwZSIsIHRucy5nZXRQcmVmaXgoKSArICI6IiArIHNlcnZpY2VOYW1lCi0JCQkJKyBQT1JUX1RZUEVfU1VGRklYLCBudWxsKTsKLQotCQlPTUVsZW1lbnQgaHR0cEJpbmRpbmcgPSBmYWMuY3JlYXRlT01FbGVtZW50KCJiaW5kaW5nIiwgaHR0cCk7Ci0JCWJpbmRpbmcuYWRkQ2hpbGQoaHR0cEJpbmRpbmcpOwotCQlodHRwQmluZGluZy5hZGRBdHRyaWJ1dGUoInZlcmIiLCAiUE9TVCIsIG51bGwpOwotCi0JCWZvciAoSXRlcmF0b3IgYXhpc0JpbmRpbmdPcGVyYXRpb25zID0gYXhpc0JpbmRpbmcuZ2V0Q2hpbGRyZW4oKTsgYXhpc0JpbmRpbmdPcGVyYXRpb25zCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCUF4aXNCaW5kaW5nT3BlcmF0aW9uIGF4aXNCaW5kaW5nT3BlcmF0aW9uID0gKEF4aXNCaW5kaW5nT3BlcmF0aW9uKSBheGlzQmluZGluZ09wZXJhdGlvbnMKLQkJCQkJLm5leHQoKTsKLQkJCUF4aXNPcGVyYXRpb24gYXhpc09wZXJhdGlvbiA9IGF4aXNCaW5kaW5nT3BlcmF0aW9uCi0JCQkJCS5nZXRBeGlzT3BlcmF0aW9uKCk7Ci0JCQlpZiAoYXhpc09wZXJhdGlvbi5pc0NvbnRyb2xPcGVyYXRpb24oKQotCQkJCQl8fCBheGlzT3BlcmF0aW9uLmdldE5hbWUoKSA9PSBudWxsKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlTdHJpbmcgb3BlYXJ0aW9uTmFtZSA9IGF4aXNPcGVyYXRpb24uZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpOwotCQkJT01FbGVtZW50IG9wZXJhdGlvbiA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoT1BFUkFUSU9OX0xPQ0FMX05BTUUsCi0JCQkJCXdzZGwpOwotCQkJYmluZGluZy5hZGRDaGlsZChvcGVyYXRpb24pOwotCi0JCQlPTUVsZW1lbnQgaHR0cE9wZXJhdGlvbiA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoIm9wZXJhdGlvbiIsIGh0dHApOwotCQkJb3BlcmF0aW9uLmFkZENoaWxkKGh0dHBPcGVyYXRpb24pOwotCQkJaHR0cE9wZXJhdGlvbi5hZGRBdHRyaWJ1dGUoImxvY2F0aW9uIiwgc2VydmljZU5hbWUgKyAiLyIKLQkJCQkJKyBheGlzT3BlcmF0aW9uLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKSwgbnVsbCk7Ci0KLQkJCVN0cmluZyBNRVAgPSBheGlzT3BlcmF0aW9uLmdldE1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4oKTsKLQotCQkJaWYgKFdTREwyQ29uc3RhbnRzLk1FUF9VUklfSU5fT05MWS5lcXVhbHMoTUVQKQotCQkJCQl8fCBXU0RMMkNvbnN0YW50cy5NRVBfVVJJX0lOX09QVElPTkFMX09VVC5lcXVhbHMoTUVQKQotCQkJCQl8fCBXU0RMMkNvbnN0YW50cy5NRVBfVVJJX09VVF9PUFRJT05BTF9JTi5lcXVhbHMoTUVQKQotCQkJCQl8fCBXU0RMMkNvbnN0YW50cy5NRVBfVVJJX1JPQlVTVF9PVVRfT05MWS5lcXVhbHMoTUVQKQotCQkJCQl8fCBXU0RMMkNvbnN0YW50cy5NRVBfVVJJX1JPQlVTVF9JTl9PTkxZLmVxdWFscyhNRVApCi0JCQkJCXx8IFdTREwyQ29uc3RhbnRzLk1FUF9VUklfSU5fT1VULmVxdWFscyhNRVApKSB7Ci0JCQkJQXhpc0JpbmRpbmdNZXNzYWdlIGF4aXNCaW5kaW5nSW5NZXNzYWdlID0gKEF4aXNCaW5kaW5nTWVzc2FnZSkgYXhpc0JpbmRpbmdPcGVyYXRpb24KLQkJCQkJCS5nZXRDaGlsZChXU0RMQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfSU5fVkFMVUUpOwotCQkJCWlmIChheGlzQmluZGluZ0luTWVzc2FnZSAhPSBudWxsKSB7Ci0JCQkJCUF4aXNNZXNzYWdlIGluYXhpc01lc3NhZ2UgPSBheGlzQmluZGluZ0luTWVzc2FnZQotCQkJCQkJCS5nZXRBeGlzTWVzc2FnZSgpOwotCi0JCQkJCWlmIChpbmF4aXNNZXNzYWdlICE9IG51bGwpIHsKLQkJCQkJCW9wZXJhdGlvbi5hZGRBdHRyaWJ1dGUoQVRUUklCVVRFX05BTUUsIG9wZWFydGlvbk5hbWUsCi0JCQkJCQkJCW51bGwpOwotCQkJCQkJT01FbGVtZW50IGlucHV0ID0gZmFjLmNyZWF0ZU9NRWxlbWVudCgKLQkJCQkJCQkJSU5fUFVUX0xPQ0FMX05BTUUsIHdzZGwpOwotCQkJCQkJT01FbGVtZW50IGlucHV0ZWxlbWVudCA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoImNvbnRlbnQiLAotCQkJCQkJCQltaW1lKTsKLQkJCQkJCWlucHV0LmFkZENoaWxkKGlucHV0ZWxlbWVudCk7Ci0JCQkJCQlpbnB1dGVsZW1lbnQuYWRkQXR0cmlidXRlKCJ0eXBlIiwgInRleHQveG1sIiwgbnVsbCk7Ci0JCQkJCQlpbnB1dGVsZW1lbnQuYWRkQXR0cmlidXRlKCJwYXJ0IiwgYXhpc09wZXJhdGlvbgotCQkJCQkJCQkuZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpLCBudWxsKTsKLQkJCQkJCW9wZXJhdGlvbi5hZGRDaGlsZChpbnB1dCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChXU0RMMkNvbnN0YW50cy5NRVBfVVJJX09VVF9PTkxZLmVxdWFscyhNRVApCi0JCQkJCXx8IFdTREwyQ29uc3RhbnRzLk1FUF9VUklfT1VUX09QVElPTkFMX0lOLmVxdWFscyhNRVApCi0JCQkJCXx8IFdTREwyQ29uc3RhbnRzLk1FUF9VUklfSU5fT1BUSU9OQUxfT1VULmVxdWFscyhNRVApCi0JCQkJCXx8IFdTREwyQ29uc3RhbnRzLk1FUF9VUklfUk9CVVNUX09VVF9PTkxZLmVxdWFscyhNRVApCi0JCQkJCXx8IFdTREwyQ29uc3RhbnRzLk1FUF9VUklfSU5fT1VULmVxdWFscyhNRVApKSB7Ci0KLQkJCQlBeGlzQmluZGluZ01lc3NhZ2UgYXhpc0JpbmRpbmdPdXRNZXNzYWdlID0gKEF4aXNCaW5kaW5nTWVzc2FnZSkgYXhpc0JpbmRpbmdPcGVyYXRpb24KLQkJCQkJCS5nZXRDaGlsZChXU0RMQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfT1VUX1ZBTFVFKTsKLQkJCQlpZiAoYXhpc0JpbmRpbmdPdXRNZXNzYWdlICE9IG51bGwpIHsKLQkJCQkJQXhpc01lc3NhZ2Ugb3V0QXhpc01lc3NhZ2UgPSBheGlzQmluZGluZ091dE1lc3NhZ2UKLQkJCQkJCQkuZ2V0QXhpc01lc3NhZ2UoKTsKLQkJCQkJaWYgKG91dEF4aXNNZXNzYWdlICE9IG51bGwpIHsKLQkJCQkJCU9NRWxlbWVudCBvdXRwdXQgPSBmYWMuY3JlYXRlT01FbGVtZW50KAotCQkJCQkJCQlPVVRfUFVUX0xPQ0FMX05BTUUsIHdzZGwpOwotCQkJCQkJT01FbGVtZW50IG91dEVsZW1lbnQgPSBmYWMuY3JlYXRlT01FbGVtZW50KCJjb250ZW50IiwKLQkJCQkJCQkJbWltZSk7Ci0JCQkJCQlvdXRFbGVtZW50LmFkZENoaWxkKG91dEVsZW1lbnQpOwotCQkJCQkJb3V0RWxlbWVudC5hZGRBdHRyaWJ1dGUoInR5cGUiLCAidGV4dC94bWwiLCBudWxsKTsKLQkJCQkJCW91dEVsZW1lbnQuYWRkQXR0cmlidXRlKCJwYXJ0IiwgYXhpc09wZXJhdGlvbi5nZXROYW1lKCkKLQkJCQkJCQkJLmdldExvY2FsUGFydCgpLCBudWxsKTsKLQkJCQkJCW91dHB1dC5hZGRDaGlsZChvdXRFbGVtZW50KTsKLQkJCQkJCW9wZXJhdGlvbi5hZGRDaGlsZChvdXRwdXQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZFBvbGljeUFzRXh0RWxlbWVudChBeGlzRGVzY3JpcHRpb24gYXhpc0Rlc2NyaXB0aW9uLAotCQkJT01FbGVtZW50IHdzZGxFbGVtZW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJUG9saWN5U3ViamVjdCBwb2xpY3lTdWJqZWN0ID0gYXhpc0Rlc2NyaXB0aW9uLmdldFBvbGljeVN1YmplY3QoKTsKLQkJQ29sbGVjdGlvbiBhdHRhY2hQb2xpY3lDb21wb25lbnRzID0gcG9saWN5U3ViamVjdAotCQkJCS5nZXRBdHRhY2hlZFBvbGljeUNvbXBvbmVudHMoKTsKLQotICAgICAgICBmb3IgKE9iamVjdCBwb2xpY3lFbGVtZW50IDogYXR0YWNoUG9saWN5Q29tcG9uZW50cykgewotICAgICAgICAgICAgaWYgKHBvbGljeUVsZW1lbnQgaW5zdGFuY2VvZiBQb2xpY3kpIHsKLSAgICAgICAgICAgICAgICBQb2xpY3lSZWZlcmVuY2UgcG9saWN5UmVmZXJlbmNlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIFBvbGljeVV0aWwuY3JlYXRlUG9saWN5UmVmZXJlbmNlKChQb2xpY3kpcG9saWN5RWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgT01FbGVtZW50IHBvbGljeVJlZkVsZW1lbnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgUG9saWN5VXRpbC5nZXRQb2xpY3lDb21wb25lbnRBc09NRWxlbWVudChwb2xpY3lSZWZlcmVuY2UsIHNlcmlhbGl6ZXIpOwotCi0gICAgICAgICAgICAgICAgT01Ob2RlIGZpcnN0Q2hpbGRFbGVtID0gd3NkbEVsZW1lbnQuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgaWYgKGZpcnN0Q2hpbGRFbGVtID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgd3NkbEVsZW1lbnQuYWRkQ2hpbGQocG9saWN5UmVmRWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZmlyc3RDaGlsZEVsZW0uaW5zZXJ0U2libGluZ0JlZm9yZShwb2xpY3lSZWZFbGVtZW50KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9IHBvbGljeVJlZmVyZW5jZS5nZXRVUkkoKTsKLSAgICAgICAgICAgICAgICBpZiAoa2V5LnN0YXJ0c1dpdGgoIiMiKSkgewotICAgICAgICAgICAgICAgICAgICBrZXkgPSBrZXkuc3Vic3RyaW5nKGtleS5pbmRleE9mKCIjIikgKyAxKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYWRkUG9saWN5VG9EZWZpbml0aW9uRWxlbWVudChrZXksIChQb2xpY3kpcG9saWN5RWxlbWVudCk7Ci0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAocG9saWN5RWxlbWVudCBpbnN0YW5jZW9mIFBvbGljeVJlZmVyZW5jZSkgewotICAgICAgICAgICAgICAgIE9NRWxlbWVudCBjaGlsZCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBQb2xpY3lVdGlsLmdldFBvbGljeUNvbXBvbmVudEFzT01FbGVtZW50KChQb2xpY3lDb21wb25lbnQpcG9saWN5RWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplcik7Ci0gICAgICAgICAgICAgICAgT01FbGVtZW50IGZpcnN0Q2hpbGRFbGVtID0gd3NkbEVsZW1lbnQuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZmlyc3RDaGlsZEVsZW0gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB3c2RsRWxlbWVudC5hZGRDaGlsZChjaGlsZCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZmlyc3RDaGlsZEVsZW0uaW5zZXJ0U2libGluZ0JlZm9yZShjaGlsZCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9ICgoUG9saWN5UmVmZXJlbmNlKXBvbGljeUVsZW1lbnQpLmdldFVSSSgpOwotICAgICAgICAgICAgICAgIGlmIChrZXkuc3RhcnRzV2l0aCgiIyIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGtleSA9IGtleS5zdWJzdHJpbmcoa2V5LmluZGV4T2YoIiMiKSArIDEpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIFBvbGljeUxvY2F0b3IgbG9jYXRvciA9IG5ldyBQb2xpY3lMb2NhdG9yKGF4aXNTZXJ2aWNlKTsKLSAgICAgICAgICAgICAgICBQb2xpY3kgcCA9IGxvY2F0b3IubG9va3VwKGtleSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlBvbGljeSBub3QgZm91bmQgZm9yIHVyaSA6ICIgKyBrZXkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBhZGRQb2xpY3lUb0RlZmluaXRpb25FbGVtZW50KGtleSwgcCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkUG9saWN5QXNFeHRBdHRyaWJ1dGUoQXhpc0Rlc2NyaXB0aW9uIGF4aXNEZXNjcmlwdGlvbiwKLQkJCU9NRWxlbWVudCBlbGVtZW50LCBPTUZhY3RvcnkgZmFjdG9yeSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJUG9saWN5U3ViamVjdCBwb2xpY3lTdWJqZWN0ID0gYXhpc0Rlc2NyaXB0aW9uLmdldFBvbGljeVN1YmplY3QoKTsKLQkJQXJyYXlMaXN0IHBvbGljeVVSSXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgZm9yIChPYmplY3QgcG9saWN5RWxlbWVudCA6IHBvbGljeVN1YmplY3QuZ2V0QXR0YWNoZWRQb2xpY3lDb21wb25lbnRzKCkpIHsKLSAgICAgICAgICAgIFN0cmluZyBrZXk7Ci0KLSAgICAgICAgICAgIGlmIChwb2xpY3lFbGVtZW50IGluc3RhbmNlb2YgUG9saWN5KSB7Ci0gICAgICAgICAgICAgICAgUG9saWN5IHAgPSAoUG9saWN5KXBvbGljeUVsZW1lbnQ7Ci0KLSAgICAgICAgICAgICAgICBpZiAocC5nZXRJZCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAga2V5ID0gIiMiICsgcC5nZXRJZCgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocC5nZXROYW1lKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBrZXkgPSBwLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2FuJ3QgYWRkIHRoZSBQb2xpY3kgYXMgYW4gZXh0ZW5zaWJpbGl0eSBhdHRyaWJ1dGUgc2luY2UgaXQgZG9lc24ndCBoYXZlIGEgaWQgb3IgYSBuYW1lIGF0dHJpYnV0ZSIpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHBvbGljeVVSSXMuYWRkKGtleSk7Ci0gICAgICAgICAgICAgICAgYWRkUG9saWN5VG9EZWZpbml0aW9uRWxlbWVudChrZXksIHApOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdXJpID0gKChQb2xpY3lSZWZlcmVuY2UpcG9saWN5RWxlbWVudCkuZ2V0VVJJKCk7Ci0gICAgICAgICAgICAgICAgUG9saWN5TG9jYXRvciBsb2NhdG9yID0gbmV3IFBvbGljeUxvY2F0b3IoYXhpc1NlcnZpY2UpOwotICAgICAgICAgICAgICAgIGlmICh1cmkuc3RhcnRzV2l0aCgiIyIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGtleSA9IHVyaS5zdWJzdHJpbmcodXJpLmluZGV4T2YoJyMnKSArIDEpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGtleSA9IHVyaTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBQb2xpY3kgcCA9IGxvY2F0b3IubG9va3VwKGtleSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJDYW5ub3QgcmVzb2x2ZSAiICsgdXJpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiB0byBhIFBvbGljeSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwb2xpY3lVUklzLmFkZCh1cmkpOwotICAgICAgICAgICAgICAgIGFkZFBvbGljeVRvRGVmaW5pdGlvbkVsZW1lbnQoa2V5LCBwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0JCWlmICghcG9saWN5VVJJcy5pc0VtcHR5KCkpIHsKLQkJCVN0cmluZyB2YWx1ZSA9IG51bGw7Ci0KLQkJCS8qCi0JCQkgKiBXZSBuZWVkIHRvIGNyZWF0ZSBhIFN0cmluZyB0aGF0IGlzIGxpa2UgJ3VyaTEgdXJpMiAuLiIgdG8gc2V0IGFzCi0JCQkgKiB0aGUgdmFsdWUgb2YgdGhlIHdzcDpQb2xpY3lVUklzIGF0dHJpYnV0ZS4KLQkJCSAqLwotICAgICAgICAgICAgZm9yIChPYmplY3QgcG9saWN5VVJJIDogcG9saWN5VVJJcykgewotICAgICAgICAgICAgICAgIFN0cmluZyB1cmkgPSAoU3RyaW5nKXBvbGljeVVSSTsKLSAgICAgICAgICAgICAgICB2YWx1ZSA9ICh2YWx1ZSA9PSBudWxsKSA/IHVyaSA6IHZhbHVlICsgIiAiICsgdXJpOwotICAgICAgICAgICAgfQotCi0JCQlPTU5hbWVzcGFjZSBucyA9IGZhY3RvcnkuY3JlYXRlT01OYW1lc3BhY2UoCi0JCQkJCW9yZy5hcGFjaGUubmVldGhpLkNvbnN0YW50cy5VUklfUE9MSUNZX05TLAotCQkJCQlvcmcuYXBhY2hlLm5lZXRoaS5Db25zdGFudHMuQVRUUl9XU1ApOwotCQkJT01BdHRyaWJ1dGUgVVJJcyA9IGZhY3RvcnkuY3JlYXRlT01BdHRyaWJ1dGUoIlBvbGljeVVSSXMiLCBucywKLQkJCQkJdmFsdWUpOwotCQkJZWxlbWVudC5hZGRBdHRyaWJ1dGUoVVJJcyk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNBbHJlYWR5QWRkZWQoQXhpc0JpbmRpbmcgYXhpc0JpbmRpbmcsCi0JCQlPTUVsZW1lbnQgZGVmaW5pdGlvbkVsZW1lbnQpIHsKLQkJUU5hbWUgYmluZGluZ05hbWUgPSBheGlzQmluZGluZy5nZXROYW1lKCk7Ci0JCVFOYW1lIG5hbWUgPSBuZXcgUU5hbWUoIm5hbWUiKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGRlZmluaXRpb25FbGVtZW50Ci0JCQkJLmdldENoaWxkcmVuV2l0aE5hbWUobmV3IFFOYW1lKHdzZGwuZ2V0TmFtZXNwYWNlVVJJKCksCi0JCQkJCQlCSU5ESU5HX0xPQ0FMX05BTUUpKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJT01FbGVtZW50IGVsZW1lbnQgPSAoT01FbGVtZW50KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlTdHJpbmcgdmFsdWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZVZhbHVlKG5hbWUpOwotCQkJaWYgKGJpbmRpbmdOYW1lLmdldExvY2FsUGFydCgpLmVxdWFscyh2YWx1ZSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGdldEVuZHBvaW50VVJMKEF4aXNFbmRwb2ludCBheGlzRW5kcG9pbnQpIHsKLQkJUGFyYW1ldGVyIG1vZGlmeUFkZHJlc3NQYXJhbSA9IGF4aXNTZXJ2aWNlLmdldFBhcmFtZXRlcigibW9kaWZ5VXNlcldTRExQb3J0QWRkcmVzcyIpOwotICAgICAgICAgICAgU3RyaW5nIGVuZHBvaW50VVJMID0gYXhpc0VuZHBvaW50LmdldEVuZHBvaW50VVJMKCk7Ci0gICAgICAgICAgICBpZiAobW9kaWZ5QWRkcmVzc1BhcmFtICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAgICAgIUJvb2xlYW4ucGFyc2VCb29sZWFuKChTdHJpbmcpbW9kaWZ5QWRkcmVzc1BhcmFtLmdldFZhbHVlKCkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVuZHBvaW50VVJMOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTdHJpbmcgaG9zdElQOwotICAgIAotICAgICAgICAgICAgLy8gRmlyc3QgY2hlY2sgdGhlIGhvc3RuYW1lIHBhcmFtZXRlciAKLSAgICAgICAgICAgIGhvc3RJUCA9IFV0aWxzLmdldEhvc3RuYW1lKGF4aXNTZXJ2aWNlLmdldEF4aXNDb25maWd1cmF0aW9uKCkpOwotICAgICAgICAKLSAgICAgICAgICAgIC8vSWYgaXQgaXMgbm90IHNldCBleHRyYWN0IHRoZSBob3N0SVAgZnJvbSB0aGUgVVJMCi0gICAgICAgICAgICBpZiAoaG9zdElQID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBob3N0SVAgPSBXU0RMU2VyaWFsaXphdGlvblV0aWwuZXh0cmFjdEhvc3RJUChheGlzU2VydmljZS5nZXRFbmRwb2ludFVSTCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgICAgICAvL1RPRE8gVGhpcyBpcyB0byBwcmV2ZW50IHByb2JsZW1zIHdoZW4gSkFWQTJXU0RMIHRvb2wgaXMgdXNlZCB3aGVyZSB0aGVyZSBpcyBubwotICAgICAgICAgICAgLy9BeGlzIHNlcnZlciBydW5uaW5nLiBjYWxjdWxhdGVFbmRwb2ludFVSTCBmYWlscyBpbiB0aGlzIHNjZW5hcmlvLCByZWZlciB0byAKLSAgICAgICAgICAgIC8vIFNpbXBsZUhUVFBTZXJ2ZXIjZ2V0RVBSc0ZvclNlcnZpY2UoKQotICAKLSAgICAgICAgICAgIGlmIChob3N0SVAgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBheGlzRW5kcG9pbnQuY2FsY3VsYXRlRW5kcG9pbnRVUkwoaG9zdElQKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVuZHBvaW50VVJMOwotICAgICAgICAgICAgfQotCX0KLQkKLQkvKioKLQkgKiBHZW5lcmF0ZSB0aGUgSWRlbnRpdHkgZWxlbWVudCBhY2NvcmRpbmcgdG8gdGhlIFdTLUFkZHJlc3NpbmdBbmRJZGVudGl0eSBpZiB0aGUgCi0JICogQWRkcmVzc2luZ0NvbnN0YW50cy5JREVOVElUWV9QQVJBTUVURVIgcGFyYW1ldGVyIGlzIHNldC4gCi0JICogaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNi8wMi9hZGRyZXNzaW5naWRlbnRpdHkvIAotCSAqLwotCQotCXByaXZhdGUgdm9pZCBnZW5lcmF0ZUlkZW50aXR5RWxlbWVudChPTUZhY3RvcnkgZmFjLE9NRWxlbWVudCBlcHIsIFBhcmFtZXRlciB3c2FJZFBhcmFtKSB7Ci0JICAgIAotCSAgICAvLyBDcmVhdGUgdGhlIElkZW50aXR5IGVsZW1lbnQKLQkgICAgT01FbGVtZW50IGlkZW50aXR5ID0gZmFjLmNyZWF0ZU9NRWxlbWVudChBZGRyZXNzaW5nQ29uc3RhbnRzLlFOQU1FX0lERU5USVRZKTsKLQkgICAgT01FbGVtZW50IGtleUluZm8gPSBmYWMuY3JlYXRlT01FbGVtZW50KEFkZHJlc3NpbmdDb25zdGFudHMuUU5BTUVfSURFTlRJVFlfS0VZX0lORk8pOwotCSAgICBPTUVsZW1lbnQgeDUwOURhdGEgPSBmYWMuY3JlYXRlT01FbGVtZW50KEFkZHJlc3NpbmdDb25zdGFudHMuUU5BTUVfSURFTlRJVFlfWDUwOV9EQVRBKTsKLQkgICAgT01FbGVtZW50IHg1MDljZXJ0ID0gZmFjLmNyZWF0ZU9NRWxlbWVudChBZGRyZXNzaW5nQ29uc3RhbnRzLlFOQU1FX0lERU5USVRZX1g1MDlfQ0VSVCk7Ci0JICAgIHg1MDljZXJ0LnNldFRleHQoKFN0cmluZyl3c2FJZFBhcmFtLmdldFZhbHVlKCkpOwotCSAgICAKLQkgICAgeDUwOURhdGEuYWRkQ2hpbGQoeDUwOWNlcnQpOwotCSAgICBrZXlJbmZvLmFkZENoaWxkKHg1MDlEYXRhKTsKLQkgICAgaWRlbnRpdHkuYWRkQ2hpbGQoa2V5SW5mbyk7Ci0JICAgIAotCSAgICBlcHIuYWRkQ2hpbGQoaWRlbnRpdHkpOwotCSAgICAKLQl9Ci0JCi0JCi0JLyoKLQkgKiBHZW5lcmF0ZSB0aGUgRW5kcG9pbnRSZWZlcmVuY2UgZWxlbWVudAotCSAqIDx3c2E6RW5kcG9pbnRSZWZlcmVuY2U+Ci0gICAgICAgICAqICAgIDx3c2E6QWRkcmVzcz4KLSAgICAgICAgICogICAgICAgIGh0dHA6Ly9zb21lLnNlcnZpY2UuZXByLwotICAgICAgICAgKiAgICAgPC93c2E6QWRkcmVzcz4KLSAgICAgICAgICogPC93c2E6RW5kcG9pbnRSZWZlcmVuY2U+Ci0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGdlbmVyYXRlRVBSRWxlbWVudChPTUZhY3RvcnkgZmFjLCBPTUVsZW1lbnQgcG9ydCwgU3RyaW5nIGVuZHBvaW50VVJMKXsKLQkgICAgCi0JICAgIFBhcmFtZXRlciBwYXJhbWV0ZXIgPSBheGlzU2VydmljZS5nZXRQYXJhbWV0ZXIoQWRkcmVzc2luZ0NvbnN0YW50cy5JREVOVElUWV9QQVJBTUVURVIpOwotCSAgICAgICAgICAgIAotCSAgICAvLyBJZiB0aGUgcGFyYW1ldGVyIGlzIG5vdCBzZXQsIHJldHVybgotCSAgICBpZiAocGFyYW1ldGVyID09IG51bGwgfHwgcGFyYW1ldGVyLmdldFZhbHVlKCkgPT0gbnVsbCkgewotCSAgICAgICAgcmV0dXJuOwotCSAgICB9Ci0JICAgIAotCSAgICBPTUVsZW1lbnQgd3NhRXByID0gZmFjLmNyZWF0ZU9NRWxlbWVudChBZGRyZXNzaW5nQ29uc3RhbnRzLkZpbmFsLldTQV9FTkRQT0lOVF9SRUZFUkVOQ0UpOwotCSAgICAKLQkgICAgT01FbGVtZW50IGFkZHJlc3MgPSBmYWMuY3JlYXRlT01FbGVtZW50KEFkZHJlc3NpbmdDb25zdGFudHMuRmluYWwuV1NBX0FERFJFU1MpOwotCSAgICBhZGRyZXNzLnNldFRleHQoKGVuZHBvaW50VVJMID09IG51bGwpID8gIiI6IGVuZHBvaW50VVJMKTsKLQkgICAgCi0JICAgIHdzYUVwci5hZGRDaGlsZChhZGRyZXNzKTsKLQkgICAgCi0JICAgIC8vIFRoaXMgd2lsbCBnZW5lcmF0ZSB0aGUgaWRlbnRpdHkgZWxlbWVudCBpZiB0aGUgc2VydmljZSBwYXJhbWV0ZXIgaXMgc2V0Ci0JICAgIGdlbmVyYXRlSWRlbnRpdHlFbGVtZW50KGZhYywgd3NhRXByLCBwYXJhbWV0ZXIpOwotCSAgICAKLQkgICAgcG9ydC5hZGRDaGlsZCh3c2FFcHIpOyAgIAotCSAgICAKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL0F4aXNTZXJ2aWNlMldTREwyMC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL0F4aXNTZXJ2aWNlMldTREwyMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzk3ZjhkLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9BeGlzU2VydmljZTJXU0RMMjAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTm9kZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUDEyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQMTFDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkFkZHJlc3NpbmdDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkFkZHJlc3NpbmdIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5qYXZhMndzZGwuSmF2YTJXU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5FeHRlcm5hbFBvbGljeVNlcmlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLkphdmFVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuUG9saWN5TG9jYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuUG9saWN5VXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuV1NETFNlcmlhbGl6YXRpb25VdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5YTUxVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuV1NETENvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLm5lZXRoaS5Qb2xpY3k7Ci1pbXBvcnQgb3JnLmFwYWNoZS5uZWV0aGkuUG9saWN5Q29tcG9uZW50OwotaW1wb3J0IG9yZy5hcGFjaGUubmVldGhpLlBvbGljeVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYTsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYUNvbXBsZXhUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYU9iamVjdENvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFQYXJ0aWNsZTsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYVNlcXVlbmNlOwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hU2ltcGxlVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYVR5cGU7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvcjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1wdWJsaWMgY2xhc3MgQXhpc1NlcnZpY2UyV1NETDIwIGltcGxlbWVudHMgV1NETDJDb25zdGFudHMgewotCi0gICAgcHJpdmF0ZSBBeGlzU2VydmljZSBheGlzU2VydmljZTsKLSAgICBwcml2YXRlIFN0cmluZyBzZXJ2aWNlTmFtZTsKLSAgICBwcml2YXRlIFN0cmluZ1tdIGVwcnMgPSBudWxsOwotICAgIHByaXZhdGUgT01OYW1lc3BhY2Ugd3NhdzsKLQotICAgIHByaXZhdGUgSGFzaE1hcCBwb2xpY2llc0luRGVzY3JpcHRpb24gPSBuZXcgSGFzaE1hcCgpOwotICAgIHByaXZhdGUgRXh0ZXJuYWxQb2xpY3lTZXJpYWxpemVyIGZpbHRlciA9IG51bGw7Ci0gICAgCi0gICAgcHVibGljIEF4aXNTZXJ2aWNlMldTREwyMChBeGlzU2VydmljZSBzZXJ2aWNlKSB7Ci0gICAgICAgIHRoaXMuYXhpc1NlcnZpY2UgPSBzZXJ2aWNlOwotICAgICAgICB0aGlzLnNlcnZpY2VOYW1lID0gc2VydmljZS5nZXROYW1lKCk7Ci0gICAgfQotCi0gICAgcHVibGljIEF4aXNTZXJ2aWNlMldTREwyMChBeGlzU2VydmljZSBzZXJ2aWNlLCBTdHJpbmcgc2VydmljZU5hbWUpIHsKLSAgICAgICAgdGhpcy5heGlzU2VydmljZSA9IHNlcnZpY2U7Ci0gICAgICAgIHRoaXMuc2VydmljZU5hbWUgPSBzZXJ2aWNlTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZW5lcmF0ZXMgYSBXU0RMIDIuMCBkb2N1bWVudCBmb3IgdGhpcyB3ZWIgc2VydmljZQotICAgICAqIEByZXR1cm4gVGhlIFdTREwyIGRvY3VtZW50IGVsZW1lbnQKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiAtIFRocm93biBpbiBjYXNlIGFuIGV4Y2VwdGlvbiBvY2N1cnMKLSAgICAgKi8KLSAgICBwdWJsaWMgT01FbGVtZW50IGdlbmVyYXRlT00oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICBNYXAgbmFtZVNwYWNlc01hcCA9IGF4aXNTZXJ2aWNlLmdldE5hbWVzcGFjZU1hcCgpOwotICAgICAgICBPTUZhY3Rvcnkgb21GYWN0b3J5ID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCk7Ci0gICAgICAgIE9NTmFtZXNwYWNlIHdzZGw7Ci0gICAgICAgIAotICAgICAgICAvLwotICAgICAgICBmaWx0ZXIgPSBuZXcgRXh0ZXJuYWxQb2xpY3lTZXJpYWxpemVyKCk7Ci0JCUF4aXNDb25maWd1cmF0aW9uIGF4aXNDb25maWd1cmF0aW9uID0gYXhpc1NlcnZpY2UKLQkJCQkuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKTsKLQkJaWYgKGF4aXNDb25maWd1cmF0aW9uICE9IG51bGwpIHsKLQkJCWZpbHRlci5zZXRBc3NlcnRpb25zVG9GaWx0ZXIoYXhpc0NvbmZpZ3VyYXRpb24KLQkJCQkJLmdldExvY2FsUG9saWN5QXNzZXJ0aW9ucygpKTsKLQkJfQotCQkvLwotCi0gICAgICAgIGlmIChuYW1lU3BhY2VzTWFwICE9IG51bGwgJiYgbmFtZVNwYWNlc01hcC5jb250YWluc1ZhbHVlKFdTREwyQ29uc3RhbnRzLldTRExfTkFNRVNQQUNFKSkgewotICAgICAgICAgICAgd3NkbCA9IG9tRmFjdG9yeQotICAgICAgICAgICAgICAgICAgICAuY3JlYXRlT01OYW1lc3BhY2UoV1NETDJDb25zdGFudHMuV1NETF9OQU1FU1BBQ0UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU0RMU2VyaWFsaXphdGlvblV0aWwuZ2V0UHJlZml4KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU0RMMkNvbnN0YW50cy5XU0RMX05BTUVTUEFDRSwgbmFtZVNwYWNlc01hcCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgd3NkbCA9IG9tRmFjdG9yeQotICAgICAgICAgICAgICAgICAgICAuY3JlYXRlT01OYW1lc3BhY2UoV1NETDJDb25zdGFudHMuV1NETF9OQU1FU1BBQ0UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU0RMMkNvbnN0YW50cy5ERUZBVUxUX1dTRExfTkFNRVNQQUNFX1BSRUZJWCk7Ci0gICAgICAgIH0KLQotICAgICAgICBPTUVsZW1lbnQgZGVzY3JpcHRpb25FbGVtZW50ID0gb21GYWN0b3J5LmNyZWF0ZU9NRWxlbWVudChXU0RMMkNvbnN0YW50cy5ERVNDUklQVElPTiwgd3NkbCk7Ci0KLSAgICAgICAgLy8gRGVjbGFyZSBhbGwgdGhlIGRlZmluZWQgbmFtZXNwYWNlcyBpbiB0aGUgZG9jdW1lbnQKLSAgICAgICAgV1NETFNlcmlhbGl6YXRpb25VdGlsLnBvcHVsYXRlTmFtZXNwYWNlcyhkZXNjcmlwdGlvbkVsZW1lbnQsIG5hbWVTcGFjZXNNYXApOwotCi0gICAgICAgIGRlc2NyaXB0aW9uRWxlbWVudC5kZWNsYXJlTmFtZXNwYWNlKGF4aXNTZXJ2aWNlLmdldFRhcmdldE5hbWVzcGFjZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzU2VydmljZS5nZXRUYXJnZXROYW1lc3BhY2VQcmVmaXgoKSk7Ci0gICAgICAgIHdzYXcgPSBkZXNjcmlwdGlvbkVsZW1lbnQuZGVjbGFyZU5hbWVzcGFjZShBZGRyZXNzaW5nQ29uc3RhbnRzLkZpbmFsLldTQVdfTkFNRVNQQUNFLCAid3NhdyIpOwotICAgICAgICAvLyBOZWVkIHRvIGFkZCB0aGUgdGFyZ2V0bmFtZXNwYWNlIGFzIGFuIGF0dHJpYnV0ZSBhY2NvcmRpbmcgdG8gdGhlIHdzZGwgMi4wIHNwZWMKLSAgICAgICAgT01BdHRyaWJ1dGUgdGFyZ2V0TmFtZXNwYWNlID0gb21GYWN0b3J5Ci0gICAgICAgICAgICAgICAgLmNyZWF0ZU9NQXR0cmlidXRlKFdTREwyQ29uc3RhbnRzLlRBUkdFVF9OQU1FU1BBQ0UsIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlLmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgZGVzY3JpcHRpb25FbGVtZW50LmFkZEF0dHJpYnV0ZSh0YXJnZXROYW1lc3BhY2UpOwotCi0gICAgICAgIC8vIENoZWNrIHdoZXRoZXIgdGhlIHJlcXVpcmVkIG5hbWVzcGFjZXMgYXJlIGFscmVhZHkgaW4gbmFtZXNwYWNlTWFwLCBpZiB0aGV5IGFyZSBub3QKLSAgICAgICAgLy8gcHJlc2VudCBkZWNsYXJlIHRoZW0uCi0gICAgICAgIE9NTmFtZXNwYWNlIHdzb2FwOwotICAgICAgICBPTU5hbWVzcGFjZSB3aHR0cDsKLSAgICAgICAgT01OYW1lc3BhY2Ugd3NkbHg7Ci0gICAgICAgIE9NTmFtZXNwYWNlIHdycGM7Ci0KLSAgICAgICAgT01OYW1lc3BhY2UgdG5zID0gb21GYWN0b3J5Ci0gICAgICAgICAgICAgICAgLmNyZWF0ZU9NTmFtZXNwYWNlKGF4aXNTZXJ2aWNlLmdldFRhcmdldE5hbWVzcGFjZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzU2VydmljZS5nZXRUYXJnZXROYW1lc3BhY2VQcmVmaXgoKSk7Ci0gICAgICAgIGlmIChuYW1lU3BhY2VzTWFwICE9IG51bGwgJiYgbmFtZVNwYWNlc01hcC5jb250YWluc1ZhbHVlKFdTREwyQ29uc3RhbnRzLlVSSV9XU0RMMl9TT0FQKSkgewotICAgICAgICAgICAgd3NvYXAgPSBvbUZhY3RvcnkKLSAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZU9NTmFtZXNwYWNlKFdTREwyQ29uc3RhbnRzLlVSSV9XU0RMMl9TT0FQLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NETFNlcmlhbGl6YXRpb25VdGlsLmdldFByZWZpeCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NETDJDb25zdGFudHMuVVJJX1dTREwyX1NPQVAsIG5hbWVTcGFjZXNNYXApKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHdzb2FwID0gZGVzY3JpcHRpb25FbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgIC5kZWNsYXJlTmFtZXNwYWNlKFdTREwyQ29uc3RhbnRzLlVSSV9XU0RMMl9TT0FQLCBXU0RMMkNvbnN0YW50cy5TT0FQX1BSRUZJWCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG5hbWVTcGFjZXNNYXAgIT0gbnVsbCAmJiBuYW1lU3BhY2VzTWFwLmNvbnRhaW5zVmFsdWUoV1NETDJDb25zdGFudHMuVVJJX1dTREwyX0hUVFApKSB7Ci0gICAgICAgICAgICB3aHR0cCA9IG9tRmFjdG9yeQotICAgICAgICAgICAgICAgICAgICAuY3JlYXRlT01OYW1lc3BhY2UoV1NETDJDb25zdGFudHMuVVJJX1dTREwyX0hUVFAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU0RMU2VyaWFsaXphdGlvblV0aWwuZ2V0UHJlZml4KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU0RMMkNvbnN0YW50cy5VUklfV1NETDJfSFRUUCwgbmFtZVNwYWNlc01hcCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgd2h0dHAgPSBkZXNjcmlwdGlvbkVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgLmRlY2xhcmVOYW1lc3BhY2UoV1NETDJDb25zdGFudHMuVVJJX1dTREwyX0hUVFAsIFdTREwyQ29uc3RhbnRzLkhUVFBfUFJFRklYKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobmFtZVNwYWNlc01hcCAhPSBudWxsICYmIG5hbWVTcGFjZXNNYXAuY29udGFpbnNWYWx1ZShXU0RMMkNvbnN0YW50cy5VUklfV1NETDJfRVhURU5TSU9OUykpIHsKLSAgICAgICAgICAgIHdzZGx4ID0gb21GYWN0b3J5Ci0gICAgICAgICAgICAgICAgICAgIC5jcmVhdGVPTU5hbWVzcGFjZShXU0RMMkNvbnN0YW50cy5VUklfV1NETDJfRVhURU5TSU9OUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdTRExTZXJpYWxpemF0aW9uVXRpbC5nZXRQcmVmaXgoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdTREwyQ29uc3RhbnRzLlVSSV9XU0RMMl9FWFRFTlNJT05TLCBuYW1lU3BhY2VzTWFwKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB3c2RseCA9IGRlc2NyaXB0aW9uRWxlbWVudC5kZWNsYXJlTmFtZXNwYWNlKFdTREwyQ29uc3RhbnRzLlVSSV9XU0RMMl9FWFRFTlNJT05TLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU0RMMkNvbnN0YW50cy5XU0RMX0VYVEVOVElPTl9QUkVGSVgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChuYW1lU3BhY2VzTWFwICE9IG51bGwgJiYgbmFtZVNwYWNlc01hcC5jb250YWluc1ZhbHVlKFdTREwyQ29uc3RhbnRzLlVSSV9XU0RMMl9SUEMpKSB7Ci0gICAgICAgICAgICB3cnBjID0gb21GYWN0b3J5Ci0gICAgICAgICAgICAgICAgICAgIC5jcmVhdGVPTU5hbWVzcGFjZShXU0RMMkNvbnN0YW50cy5VUklfV1NETDJfUlBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NETFNlcmlhbGl6YXRpb25VdGlsLmdldFByZWZpeCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NETDJDb25zdGFudHMuVVJJX1dTREwyX1JQQywgbmFtZVNwYWNlc01hcCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgd3JwYyA9IGRlc2NyaXB0aW9uRWxlbWVudC5kZWNsYXJlTmFtZXNwYWNlKFdTREwyQ29uc3RhbnRzLlVSSV9XU0RMMl9SUEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdTREwyQ29uc3RhbnRzLldTRExfUlBDX1BSRUZJWCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBBZGQgdGhlIGRvY3VtZW50YXRpb24gZWxlbWVudAotICAgICAgICBXU0RMU2VyaWFsaXphdGlvblV0aWwKLSAgICAgICAgICAgICAgICAuYWRkV1NETERvY3VtZW50YXRpb25FbGVtZW50KGF4aXNTZXJ2aWNlLCBkZXNjcmlwdGlvbkVsZW1lbnQsIG9tRmFjdG9yeSwgd3NkbCk7Ci0KLSAgICAgICAgLy8gQWRkIHR5cGVzIGVsZW1lbnQKLSAgICAgICAgT01FbGVtZW50IHR5cGVzRWxlbWVudCA9IG9tRmFjdG9yeS5jcmVhdGVPTUVsZW1lbnQoV1NETDJDb25zdGFudHMuVFlQRVNfTE9DQUxfTkFMRSwgd3NkbCk7Ci0gICAgICAgIGF4aXNTZXJ2aWNlLnBvcHVsYXRlU2NoZW1hTWFwcGluZ3MoKTsKLSAgICAgICAgQXJyYXlMaXN0IHNjaGVtYXMgPSBheGlzU2VydmljZS5nZXRTY2hlbWEoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzY2hlbWFzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBTdHJpbmdXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgICAgICAgICAgWG1sU2NoZW1hIHNjaGVtYSA9IGF4aXNTZXJ2aWNlLmdldFNjaGVtYShpKTsKLQotICAgICAgICAgICAgaWYgKCFvcmcuYXBhY2hlLmF4aXMyLm5hbWVzcGFjZS5Db25zdGFudHMuVVJJXzIwMDFfU0NIRU1BX1hTRAotICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKHNjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2UoKSkpIHsKLSAgICAgICAgICAgICAgICBzY2hlbWEud3JpdGUod3JpdGVyKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgc2NoZW1hU3RyaW5nID0gd3JpdGVyLnRvU3RyaW5nKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoISIiLmVxdWFscyhzY2hlbWFTdHJpbmcpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlc0VsZW1lbnQuYWRkQ2hpbGQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTFV0aWxzLnRvT00obmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHNjaGVtYVN0cmluZy5nZXRCeXRlcygpKSkpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBkZXNjcmlwdGlvbkVsZW1lbnQuYWRkQ2hpbGQodHlwZXNFbGVtZW50KTsKLQotICAgICAgICBQYXJhbWV0ZXIgcGFyYW1ldGVyID0gYXhpc1NlcnZpY2UuZ2V0UGFyYW1ldGVyKFdTREwyQ29uc3RhbnRzLklOVEVSRkFDRV9MT0NBTF9OQU1FKTsKLSAgICAgICAgU3RyaW5nIGludGVyZmFjZU5hbWU7Ci0gICAgICAgIGlmIChwYXJhbWV0ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgaW50ZXJmYWNlTmFtZSA9IChTdHJpbmcpIHBhcmFtZXRlci5nZXRWYWx1ZSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaW50ZXJmYWNlTmFtZSA9IFdTREwyQ29uc3RhbnRzLkRFRkFVTFRfSU5URVJGQUNFX05BTUU7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBBZGQgdGhlIGludGVyZmFjZSBlbGVtZW50Ci0gICAgICAgIGRlc2NyaXB0aW9uRWxlbWVudC5hZGRDaGlsZChnZXRJbnRlcmZhY2VFbGVtZW50KHdzZGwsIHRucywgd3NkbHgsIHdycGMsIG9tRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlTmFtZSkpOwotCi0gICAgICAgIC8vIGF4aXMyLnhtbCBpbmRpY2F0ZWQgbm8gSFRUUCBiaW5kaW5nPwotICAgICAgICBib29sZWFuIGRpc2FibGVSRVNUID0gZmFsc2U7Ci0gICAgICAgIFBhcmFtZXRlciBkaXNhYmxlUkVTVFBhcmFtZXRlciA9Ci0gICAgICAgICAgICAgICAgYXhpc1NlcnZpY2UuZ2V0UGFyYW1ldGVyKENvbnN0YW50cy5Db25maWd1cmF0aW9uLkRJU0FCTEVfUkVTVCk7Ci0gICAgICAgIGlmIChkaXNhYmxlUkVTVFBhcmFtZXRlciAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgSmF2YVV0aWxzLmlzVHJ1ZUV4cGxpY2l0bHkoZGlzYWJsZVJFU1RQYXJhbWV0ZXIuZ2V0VmFsdWUoKSkpIHsKLSAgICAgICAgICAgIGRpc2FibGVSRVNUID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gZGlzYWJsZVNPQVAxMSA9IGZhbHNlOwotICAgICAgICBQYXJhbWV0ZXIgZGlzYWJsZVNPQVAxMVBhcmFtZXRlciA9IGF4aXNTZXJ2aWNlCi0gICAgICAgICAgICAgICAgLmdldFBhcmFtZXRlcihvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50cy5Db25maWd1cmF0aW9uLkRJU0FCTEVfU09BUDExKTsKLSAgICAgICAgaWYgKGRpc2FibGVTT0FQMTFQYXJhbWV0ZXIgIT0gbnVsbAotICAgICAgICAgICAgICAgICYmIEphdmFVdGlscy5pc1RydWVFeHBsaWNpdGx5KGRpc2FibGVTT0FQMTFQYXJhbWV0ZXIuZ2V0VmFsdWUoKSkpIHsKLSAgICAgICAgICAgIGRpc2FibGVTT0FQMTEgPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gYXhpczIueG1sIGluZGljYXRlZCBubyBTT0FQIDEuMiBiaW5kaW5nPwotICAgICAgICBib29sZWFuIGRpc2FibGVTT0FQMTIgPSBmYWxzZTsKLSAgICAgICAgUGFyYW1ldGVyIGRpc2FibGVTT0FQMTJQYXJhbWV0ZXIgPQotICAgICAgICBheGlzU2VydmljZS5nZXRQYXJhbWV0ZXIob3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHMuQ29uZmlndXJhdGlvbi5ESVNBQkxFX1NPQVAxMik7Ci0gICAgICAgIGlmIChkaXNhYmxlU09BUDEyUGFyYW1ldGVyICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICBKYXZhVXRpbHMuaXNUcnVlRXhwbGljaXRseShkaXNhYmxlU09BUDEyUGFyYW1ldGVyLmdldFZhbHVlKCkpKSB7Ci0gICAgICAgICAgICBkaXNhYmxlU09BUDEyID0gdHJ1ZTsKLSAgICAgICAgfSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAvLyBDaGVjayB3aGV0aGVyIHRoZSBheGlzU2VydmljZSBoYXMgYW55IGVuZHBvaW50cy4gSWYgdGhleSBleGlzdHMgc2VyaWFsaXplIHRoZW0gZWxzZQotICAgICAgICAvLyBnZW5lcmF0ZSBkZWZhdWx0IGVuZHBvaW50IGVsZW1lbnRzLgotICAgICAgICBTZXQgYmluZGluZ3MgPSBuZXcgSGFzaFNldCgpOwotICAgICAgICBNYXAgZW5kcG9pbnRNYXAgPSBheGlzU2VydmljZS5nZXRFbmRwb2ludHMoKTsKLSAgICAgICAgT2JqZWN0IHZhbHVlID0gYXhpc1NlcnZpY2UuZ2V0UGFyYW1ldGVyVmFsdWUoImlzQ29kZWdlbiIpOwotICAgICAgICBib29sZWFuIGlzQ29kZWdlbiA9IGZhbHNlOwotICAgICAgICBpZiAoSmF2YVV0aWxzLmlzVHJ1ZUV4cGxpY2l0bHkodmFsdWUpKSB7Ci0gICAgICAgICAgIGlzQ29kZWdlbiA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGVuZHBvaW50TWFwICE9IG51bGwgJiYgZW5kcG9pbnRNYXAuc2l6ZSgpID4gMCkgewotCi0gICAgICAgICAgICBPTUVsZW1lbnQgc2VydmljZUVsZW1lbnQgPSBnZXRTZXJ2aWNlRWxlbWVudCh3c2RsLCB0bnMsIG9tRmFjdG9yeSwgaW50ZXJmYWNlTmFtZSk7Ci0gICAgICAgICAgICBJdGVyYXRvciBpdGVyYXRvciA9IGVuZHBvaW50TWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgLy8gV2l0aCB0aGUgbmV3IGJpbmRpbmcgaGllcmFjaHkgaW4gcGxhY2Ugd2UgbmVlZCB0byBkbyBzb21lIGV4dHJhIGNoZWNraW5nIGhlcmUuCi0gICAgICAgICAgICAgICAgLy8gSWYgYSBzZXJ2aWNlIGhhcyBib3RoIGh0dHAgYW5kIGh0dHBzIGxpc3RuZXJzIHVwIHdlIHNob3VsZCBzaG93IHR3byBzZXBhcmF0ZSBlcHJzCi0gICAgICAgICAgICAgICAgLy8gSWYgdGhlIHNlcnZpY2Ugd2FzIGRlcGxveWVkIHdpdGggYSBXU0RMIGFuZCBpdCBoYWQgdHdvIGVuZHBvaW50cyBmb3IgaHR0cCBhbmQKLSAgICAgICAgICAgICAgICAvLyBodHRwcyB0aGVuIHdlIGhhdmUgdHdvIGVuZHBvaW50cyBwb3B1bGF0ZWQgc28gd2Ugc2hvdWxkIHNlcmlhbGl6ZSB0aGVtIGluc3RlYWQKLSAgICAgICAgICAgICAgICAvLyBvZiB1cGRhdGluZyB0aGUgZW5kcG9pbnRzLgotICAgICAgICAgICAgICAgIEF4aXNFbmRwb2ludCBheGlzRW5kcG9pbnQgPSAoQXhpc0VuZHBvaW50KSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgLyoKLQkJCSAgICAqIFNvbWUgdHJhbnNwb3J0cyBtaWdodCBub3QgYmUgYWN0aXZlIGF0IHJ1bnRpbWUuCi0JCQkgICAgKi8KLSAgICAgICAgICAgICAgICBpZiAoIWlzQ29kZWdlbiAmJiAhYXhpc0VuZHBvaW50LmlzQWN0aXZlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEF4aXNCaW5kaW5nIGF4aXNCaW5kaW5nID0gYXhpc0VuZHBvaW50LmdldEJpbmRpbmcoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdHlwZSA9IGF4aXNCaW5kaW5nLmdldFR5cGUoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBJZiBIVFRQIGJpbmRpbmcgaXMgZGlzYWJsZWQsIGRvIG5vdCBhZGQuCi0gICAgICAgICAgICAgICAgaWYgKFdTREwyQ29uc3RhbnRzLlVSSV9XU0RMMl9IVFRQLmVxdWFscyh0eXBlKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoZGlzYWJsZVJFU1QpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIElmIFNPQVAgMS4yIGJpbmRpbmcgaXMgZGlzYWJsZWQsIGRvIG5vdCBhZGQuCi0gICAgICAgICAgICAgICAgU3RyaW5nIHByb3BlcnR5U09BUFZlcnNpb24gPQotICAgICAgICAgICAgICAgICAgICAgICAgKFN0cmluZykgYXhpc0JpbmRpbmcuZ2V0UHJvcGVydHkoV1NETDJDb25zdGFudHMuQVRUUl9XU09BUF9WRVJTSU9OKTsKLSAgICAgICAgICAgICAgICBpZiAoU09BUDEyQ29uc3RhbnRzLlNPQVBfRU5WRUxPUEVfTkFNRVNQQUNFX1VSSS5lcXVhbHMocHJvcGVydHlTT0FQVmVyc2lvbikpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGRpc2FibGVTT0FQMTIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKFNPQVAxMUNvbnN0YW50cy5TT0FQX0VOVkVMT1BFX05BTUVTUEFDRV9VUkkuZXF1YWxzKHByb3BlcnR5U09BUFZlcnNpb24pKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkaXNhYmxlU09BUDExKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotCi0KLSAgICAgICAgICAgICAgICBiaW5kaW5ncy5hZGQoYXhpc0JpbmRpbmcpOwotICAgICAgICAgICAgICAgIE9NRWxlbWVudCBlbmRwb2ludEVsZW1lbnQgPSBheGlzRW5kcG9pbnQudG9XU0RMMjAod3NkbCwgdG5zLCB3aHR0cCk7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBlbmRwb2ludEFscmVhZHlBZGRlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGVuZHBvaW50c0FkZGVkID0gc2VydmljZUVsZW1lbnQuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAoZW5kcG9pbnRzQWRkZWQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIE9NRWxlbWVudCBlbmRwb2ludCA9IChPTUVsZW1lbnQpIGVuZHBvaW50c0FkZGVkLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2tpbmcgd2hldGhlciBhIGVuZHBvaW50IHdpdGggdGhlIHNhbWUgYmluZGluZyBhbmQgYWRkcmVzcyBleGlzdHMuCi0gICAgICAgICAgICAgICAgICAgIGlmIChlbmRwb2ludC5nZXRBdHRyaWJ1dGUobmV3IFFOYW1lKFdTREwyQ29uc3RhbnRzLkJJTkRJTkdfTE9DQUxfTkFNRSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEF0dHJpYnV0ZVZhbHVlKCkuZXF1YWxzKGVuZHBvaW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFFOYW1lKFdTREwyQ29uc3RhbnRzLkJJTkRJTkdfTE9DQUxfTkFNRSkpLmdldEF0dHJpYnV0ZVZhbHVlKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgZW5kcG9pbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0QXR0cmlidXRlKG5ldyBRTmFtZShXU0RMMkNvbnN0YW50cy5BVFRSSUJVVEVfQUREUkVTUykpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEF0dHJpYnV0ZVZhbHVlKCkuZXF1YWxzKGVuZHBvaW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFFOYW1lKFdTREwyQ29uc3RhbnRzLkFUVFJJQlVURV9BRERSRVNTKSkuZ2V0QXR0cmlidXRlVmFsdWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVuZHBvaW50QWxyZWFkeUFkZGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICghZW5kcG9pbnRBbHJlYWR5QWRkZWQpIHsKLS8vICAgICAgICAgICAgICAgIAlhZGRQb2xpY3lBc0V4dGVuc2libGVFbGVtZW50KGF4aXNFbmRwb2ludCwgZW5kcG9pbnRFbGVtZW50KTsKLSAgICAgICAgICAgICAgICAJUGFyYW1ldGVyIG1vZGlmeUFkZHJlc3NQYXJhbSA9IGF4aXNTZXJ2aWNlCi0JCQkJCQkJLmdldFBhcmFtZXRlcigibW9kaWZ5VXNlcldTRExQb3J0QWRkcmVzcyIpOwotCQkJCQlpZiAobW9kaWZ5QWRkcmVzc1BhcmFtICE9IG51bGwpIHsKLQkJCQkJCWlmIChCb29sZWFuLnBhcnNlQm9vbGVhbigoU3RyaW5nKSBtb2RpZnlBZGRyZXNzUGFyYW0KLQkJCQkJCQkJLmdldFZhbHVlKCkpKSB7Ci0JCQkJCQkJU3RyaW5nIGVuZHBvaW50VVJMID0gYXhpc0VuZHBvaW50Ci0JCQkJCQkJCQkuY2FsY3VsYXRlRW5kcG9pbnRVUkwoKTsKLQkJCQkJCQllbmRwb2ludEVsZW1lbnQKLQkJCQkJCQkJCS5nZXRBdHRyaWJ1dGUoCi0JCQkJCQkJCQkJCW5ldyBRTmFtZSgKLQkJCQkJCQkJCQkJCQlXU0RMMkNvbnN0YW50cy5BVFRSSUJVVEVfQUREUkVTUykpCi0JCQkJCQkJCQkuc2V0QXR0cmlidXRlVmFsdWUoZW5kcG9pbnRVUkwpOwotCQkJCQkJfQotCQkJCQl9Ci0gICAgICAgICAgICAgICAgCXNlcnZpY2VFbGVtZW50LmFkZENoaWxkKGVuZHBvaW50RWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgSXRlcmF0b3IgaXRlciA9IGJpbmRpbmdzLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBBeGlzQmluZGluZyBiaW5kaW5nID0gKEF4aXNCaW5kaW5nKSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBPTUVsZW1lbnQgYmluZGluZ0VsZW1lbnQgPSBiaW5kaW5nLnRvV1NETDIwKHdzZGwsIHRucywgd3NvYXAsIHdodHRwLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlLmdldE5hbWVzcGFjZU1hcCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzc2luZ0hlbHBlci5nZXRBZGRyZXNzaW5nUmVxdWlyZW1lbnRQYXJlbWV0ZXJWYWx1ZShheGlzU2VydmljZSksCi0gICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlTmFtZSx3c2F3KTsKLSAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbkVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRDaGlsZChiaW5kaW5nRWxlbWVudCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGRlc2NyaXB0aW9uRWxlbWVudC5hZGRDaGlsZChzZXJ2aWNlRWxlbWVudCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0KLSAgICAgICAgICAgIC8vIFRoZXJlIGFyZSBubyBhbmRwb2ludHMgZGVmaW5lZCBoZW5jZSBnZW5lcmF0ZSBkZWZhdWx0IGJpbmRpbmdzIGFuZCBlbmRwb2ludHMKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uRWxlbWVudC5hZGRDaGlsZCgKLSAgICAgICAgICAgICAgICAgICAgV1NETFNlcmlhbGl6YXRpb25VdGlsLmdlbmVyYXRlU09BUDExQmluZGluZyhvbUZhY3RvcnksIGF4aXNTZXJ2aWNlLCB3c2RsLCB3c29hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bnMsIHNlcnZpY2VOYW1lKSk7Ci0gICAgICAgICAgICBpZiAoIWRpc2FibGVTT0FQMTIpIHsKLSAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbkVsZW1lbnQuYWRkQ2hpbGQoCi0gICAgICAgICAgICAgICAgICAgICAgICBXU0RMU2VyaWFsaXphdGlvblV0aWwuZ2VuZXJhdGVTT0FQMTJCaW5kaW5nKG9tRmFjdG9yeSwgYXhpc1NlcnZpY2UsIHdzZGwsIHdzb2FwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bnMsIHNlcnZpY2VOYW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWRpc2FibGVTT0FQMTEpIHsKLSAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbkVsZW1lbnQuYWRkQ2hpbGQoCi0gICAgICAgICAgICAgICAgICAgICAgICBXU0RMU2VyaWFsaXphdGlvblV0aWwuZ2VuZXJhdGVTT0FQMTFCaW5kaW5nKG9tRmFjdG9yeSwgYXhpc1NlcnZpY2UsIHdzZGwsIHdzb2FwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bnMsIHNlcnZpY2VOYW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWRpc2FibGVSRVNUKSB7Ci0gICAgICAgICAgICAgICAgZGVzY3JpcHRpb25FbGVtZW50LmFkZENoaWxkKAotICAgICAgICAgICAgICAgICAgICAgICAgV1NETFNlcmlhbGl6YXRpb25VdGlsLmdlbmVyYXRlSFRUUEJpbmRpbmcob21GYWN0b3J5LCBheGlzU2VydmljZSwgd3NkbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdodHRwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG5zLCBzZXJ2aWNlTmFtZSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGVzY3JpcHRpb25FbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgIC5hZGRDaGlsZChXU0RMU2VyaWFsaXphdGlvblV0aWwuZ2VuZXJhdGVTZXJ2aWNlRWxlbWVudChvbUZhY3RvcnksIHdzZGwsIHRucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlLCBkaXNhYmxlUkVTVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVTT0FQMTIsZGlzYWJsZVNPQVAxMSwgZXBycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZU5hbWUpKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgQXJyYXlMaXN0IHBvbGljaWVzID0gbmV3IEFycmF5TGlzdChwb2xpY2llc0luRGVzY3JpcHRpb24udmFsdWVzKCkpOwotICAgICAgICBhZGRQb2xpY2llc1RvRGVzY3JpcHRpb25FbGVtZW50KHBvbGljaWVzLCBkZXNjcmlwdGlvbkVsZW1lbnQpOwotCi0gICAgICAgIHJldHVybiBkZXNjcmlwdGlvbkVsZW1lbnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2VuZXJhdGVzIHRoZSBpbnRlcmZhY2UgZWxlbWVudCBmb3IgdGhlIHNlcnZpY2UKLSAgICAgKgotICAgICAqIEBwYXJhbSB3c2RsIFRoZSBXU0RMIG5hbWVzcGFjZQotICAgICAqIEBwYXJhbSB0bnMgVGhlIHRhcmdldCBuYW1lc3BhY2UKLSAgICAgKiBAcGFyYW0gd3NkbHggVGhlIFdTREwgZXh0ZW5zaW9ucyBuYW1lc3BhY2UKLSAgICAgKiBAcGFyYW0gZmFjIFRoZSBhY3RpdmUgT01GYWN0b3J5Ci0gICAgICogQHBhcmFtIGludGVyZmFjZU5hbWUgVGhlIG5hbWUgb2YgdGhlIGludGVyZmFjZQotICAgICAqIEByZXR1cm4gVGhlIGdlbmVyYXRlZCBpbnRlcmZhY2UgZWxlbWVudAotICAgICAqIEB0aHJvd3MgRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvciAKLSAgICAgKiBAdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiAKLSAgICAgKi8KLSAgICBwcml2YXRlIE9NRWxlbWVudCBnZXRJbnRlcmZhY2VFbGVtZW50KE9NTmFtZXNwYWNlIHdzZGwsIE9NTmFtZXNwYWNlIHRucywgT01OYW1lc3BhY2Ugd3NkbHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTU5hbWVzcGFjZSB3cnBjLCBPTUZhY3RvcnkgZmFjLCBTdHJpbmcgaW50ZXJmYWNlTmFtZSkKLSAgICAgICAgICAgIHRocm93cyBVUklTeW50YXhFeGNlcHRpb24sIEF4aXNGYXVsdCwgWE1MU3RyZWFtRXhjZXB0aW9uLCBGYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yIHsKLQotICAgICAgICBPTUVsZW1lbnQgaW50ZXJmYWNlRWxlbWVudCA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoV1NETDJDb25zdGFudHMuSU5URVJGQUNFX0xPQ0FMX05BTUUsIHdzZGwpOwotICAgICAgICBpbnRlcmZhY2VFbGVtZW50LmFkZEF0dHJpYnV0ZShmYWMuY3JlYXRlT01BdHRyaWJ1dGUoV1NETDJDb25zdGFudHMuQVRUUklCVVRFX05BTUUsIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2VOYW1lKSk7Ci0gICAgICAgIAotICAgICAgICBhZGRQb2xpY3lBc0V4dGVuc2libGVFbGVtZW50KGF4aXNTZXJ2aWNlLCBpbnRlcmZhY2VFbGVtZW50KTsKLSAgICAgICAgCi0gICAgICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gYXhpc1NlcnZpY2UuZ2V0T3BlcmF0aW9ucygpOwotICAgICAgICBBcnJheUxpc3QgaW50ZXJmYWNlT3BlcmF0aW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgQXJyYXlMaXN0IGludGVyZmFjZUZhdWx0cyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgaW50IGkgPSAwOwotICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb24gPSAoQXhpc09wZXJhdGlvbikgaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgaWYgKGF4aXNPcGVyYXRpb24uaXNDb250cm9sT3BlcmF0aW9uKCkpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludGVyZmFjZU9wZXJhdGlvbnMuYWRkKGksIGdlbmVyYXRlSW50ZXJmYWNlT3BlcmF0aW9uRWxlbWVudChheGlzT3BlcmF0aW9uLCB3c2RsLCB0bnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NkbHgsIHdycGMpKTsKLSAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgIEl0ZXJhdG9yIGZhdWx0c0l0ZXJhdG9yID0gYXhpc09wZXJhdGlvbi5nZXRGYXVsdE1lc3NhZ2VzKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIHdoaWxlIChmYXVsdHNJdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBBeGlzTWVzc2FnZSBmYXVsdE1lc3NhZ2UgPSAoQXhpc01lc3NhZ2UpIGZhdWx0c0l0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGZhdWx0TWVzc2FnZS5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFpbnRlcmZhY2VGYXVsdHMuY29udGFpbnMobmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgT01FbGVtZW50IGZhdWx0RWxlbWVudCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjLmNyZWF0ZU9NRWxlbWVudChXU0RMMkNvbnN0YW50cy5GQVVMVF9MT0NBTF9OQU1FLCB3c2RsKTsKLSAgICAgICAgICAgICAgICAgICAgZmF1bHRFbGVtZW50LmFkZEF0dHJpYnV0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWMuY3JlYXRlT01BdHRyaWJ1dGUoV1NETDJDb25zdGFudHMuQVRUUklCVVRFX05BTUUsIG51bGwsIG5hbWUpKTsKLSAgICAgICAgICAgICAgICAgICAgZmF1bHRFbGVtZW50LmFkZEF0dHJpYnV0ZShmYWMuY3JlYXRlT01BdHRyaWJ1dGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NETDJDb25zdGFudHMuQVRUUklCVVRFX0VMRU1FTlQsIG51bGwsIFdTRExTZXJpYWxpemF0aW9uVXRpbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRFbGVtZW50TmFtZShmYXVsdE1lc3NhZ2UsIGF4aXNTZXJ2aWNlLmdldE5hbWVzcGFjZU1hcCgpKSkpOwotICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2VGYXVsdHMuYWRkKG5hbWUpOwotICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2VFbGVtZW50LmFkZENoaWxkKGZhdWx0RWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IGludGVyZmFjZU9wZXJhdGlvbnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIGludGVyZmFjZUVsZW1lbnQuYWRkQ2hpbGQoKE9NTm9kZSkgaW50ZXJmYWNlT3BlcmF0aW9ucy5nZXQoaSkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpbnRlcmZhY2VFbGVtZW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdlbmVyYXRlcyB0aGUgc2VydmljZSBlbGVtZW50IGZvciB0aGUgc2VydmljZQotICAgICAqCi0gICAgICogQHBhcmFtIHdzZGwgdGhlIFdTREwgbmFtZXNwYWNlCi0gICAgICogQHBhcmFtIHRucyB0aGUgdGFyZ2V0IG5hbWVzcGFjZQotICAgICAqIEBwYXJhbSBvbUZhY3RvcnkgdGhlIGFjdGl2ZSBPTUZhY3RvcnkKLSAgICAgKiBAcGFyYW0gaW50ZXJmYWNlTmFtZSB0aGUgbmFtZSBvZiB0aGUgaW50ZXJmYWNlCi0gICAgICogQHJldHVybiB0aGUgZ2VuZXJhdGVkIHNlcnZpY2UgZWxlbWVudAotICAgICAqLwotICAgIHByaXZhdGUgT01FbGVtZW50IGdldFNlcnZpY2VFbGVtZW50KE9NTmFtZXNwYWNlIHdzZGwsIE9NTmFtZXNwYWNlIHRucywgT01GYWN0b3J5IG9tRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaW50ZXJmYWNlTmFtZSkgewotICAgICAgICBPTUVsZW1lbnQgc2VydmljZUVsZW1lbnQgPQotICAgICAgICAgICAgICAgIG9tRmFjdG9yeS5jcmVhdGVPTUVsZW1lbnQoV1NETDJDb25zdGFudHMuU0VSVklDRV9MT0NBTF9OQU1FLCB3c2RsKTsKLSAgICAgICAgc2VydmljZUVsZW1lbnQuYWRkQXR0cmlidXRlKAotICAgICAgICAgICAgICAgIG9tRmFjdG9yeS5jcmVhdGVPTUF0dHJpYnV0ZShXU0RMMkNvbnN0YW50cy5BVFRSSUJVVEVfTkFNRSwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZU5hbWUpKTsKLSAgICAgICAgc2VydmljZUVsZW1lbnQuYWRkQXR0cmlidXRlKG9tRmFjdG9yeS5jcmVhdGVPTUF0dHJpYnV0ZShXU0RMMkNvbnN0YW50cy5JTlRFUkZBQ0VfTE9DQUxfTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCB0bnMuZ2V0UHJlZml4KCkgKyAiOiIgKwotICAgICAgICAgICAgICAgIGludGVyZmFjZU5hbWUpKTsKLSAgICAgICAgcmV0dXJuIHNlcnZpY2VFbGVtZW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdlbmVyYXRlcyB0aGUgaW50ZXJmYWNlIE9wZXJhdGlvbiBlbGVtZW50LiBBcyB3aXRoIHRoZSBiaW5kaW5nIG9wZXJhdGlvbnMgd2UgZG9udCBuZWVkIHRvCi0gICAgICogYXNrIEF4aXNNZXNzYWdlIHRvIHNlcmlhbGl6ZSBpdHMgbWVzc2FnZSBjYXVzZSBBeGlzTWVzc2FnZSBkb2VzIG5vdCBoYXZlIHNwZWNpZmljIHByb3BlcnRpZXMKLSAgICAgKiBhcyBiaW5kaW5ncy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBheGlzT3BlcmF0aW9uIHRoZSBvcGVyYXRpb24gdG8gd3JpdGUKLSAgICAgKiBAcGFyYW0gd3NkbCB0aGUgV1NETCBuYW1lc3BhY2UKLSAgICAgKiBAcGFyYW0gdG5zIHRoZSB0YXJnZXQgbmFtZXNwYWNlCi0gICAgICogQHBhcmFtIHdzZGx4IHRoZSBXU0RMIGV4dGVudGlvbnMgbmFtZXNwYWNlIChXU0RMIDIuMCkKLSAgICAgKiBAcmV0dXJuIHRoZSBnZW5lcmF0ZWQgJmx0O29wZXJhdGlvbiZndDsgZWxlbWVudAotICAgICAqIEB0aHJvd3MgRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvciAKLSAgICAgKiBAdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiAKLSAgICAgKi8KLSAgICBwdWJsaWMgT01FbGVtZW50IGdlbmVyYXRlSW50ZXJmYWNlT3BlcmF0aW9uRWxlbWVudChBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01OYW1lc3BhY2Ugd3NkbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTU5hbWVzcGFjZSB0bnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01OYW1lc3BhY2Ugd3NkbHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01OYW1lc3BhY2Ugd3JwYykgdGhyb3dzCi0gICAgICAgICAgICBVUklTeW50YXhFeGNlcHRpb24sIEF4aXNGYXVsdCwgWE1MU3RyZWFtRXhjZXB0aW9uLCBGYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yIHsKLSAgICAgICAgT01GYWN0b3J5IG9tRmFjdG9yeSA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpOwotICAgICAgICBPTUVsZW1lbnQgYXhpc09wZXJhdGlvbkVsZW1lbnQgPQotICAgICAgICAgICAgICAgIG9tRmFjdG9yeS5jcmVhdGVPTUVsZW1lbnQoV1NETDJDb25zdGFudHMuT1BFUkFUSU9OX0xPQ0FMX05BTUUsIHdzZGwpOwotICAgICAgICBXU0RMU2VyaWFsaXphdGlvblV0aWwKLSAgICAgICAgICAgICAgICAuYWRkV1NETERvY3VtZW50YXRpb25FbGVtZW50KGF4aXNPcGVyYXRpb24sIGF4aXNPcGVyYXRpb25FbGVtZW50LCBvbUZhY3RvcnksIHdzZGwpOwotICAgICAgICBheGlzT3BlcmF0aW9uRWxlbWVudC5hZGRBdHRyaWJ1dGUob21GYWN0b3J5LmNyZWF0ZU9NQXR0cmlidXRlKFdTREwyQ29uc3RhbnRzLkFUVFJJQlVURV9OQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpc09wZXJhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKSkpOwotICAgICAgICBhZGRQb2xpY3lBc0V4dGVuc2libGVFbGVtZW50KGF4aXNPcGVyYXRpb24sIGF4aXNPcGVyYXRpb25FbGVtZW50KTsKLSAgICAgICAgCi0gICAgICAgIFVSSVtdIG9wU3R5bGUgPSAoVVJJW10pIGF4aXNPcGVyYXRpb24uZ2V0UGFyYW1ldGVyVmFsdWUoV1NETDJDb25zdGFudHMuT1BFUkFUSU9OX1NUWUxFKTsKLSAgICAgICAgaWYgKG9wU3R5bGUgPT0gbnVsbCkgewotICAgICAgICAgICAgb3BTdHlsZSA9IGNoZWNrU3R5bGUoYXhpc09wZXJhdGlvbik7Ci0gICAgICAgICAgICBQYXJhbWV0ZXIgb3BTdHlsZVBhcmFtZXRlciA9IG5ldyBQYXJhbWV0ZXIoKTsKLSAgICAgICAgICAgIG9wU3R5bGVQYXJhbWV0ZXIuc2V0TmFtZShXU0RMMkNvbnN0YW50cy5PUEVSQVRJT05fU1RZTEUpOwotICAgICAgICAgICAgb3BTdHlsZVBhcmFtZXRlci5zZXRWYWx1ZShvcFN0eWxlKTsKLSAgICAgICAgICAgIGF4aXNPcGVyYXRpb24uYWRkUGFyYW1ldGVyKG9wU3R5bGVQYXJhbWV0ZXIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChvcFN0eWxlICE9IG51bGwgJiYgb3BTdHlsZS5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICBTdHJpbmcgc3R5bGUgPSBvcFN0eWxlWzBdLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IG9wU3R5bGUubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBVUkkgdXJpID0gb3BTdHlsZVtpXTsKLSAgICAgICAgICAgICAgICBzdHlsZSA9IHN0eWxlICsgIiAiICsgdXJpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXhpc09wZXJhdGlvbkVsZW1lbnQuYWRkQXR0cmlidXRlKAotICAgICAgICAgICAgICAgICAgICBvbUZhY3RvcnkuY3JlYXRlT01BdHRyaWJ1dGUoV1NETDJDb25zdGFudHMuQVRUUklCVVRFX1NUWUxFLCBudWxsLCBzdHlsZSkpOwotICAgICAgICAgICAgaWYgKHN0eWxlLmluZGV4T2YoV1NETDJDb25zdGFudHMuU1RZTEVfUlBDKSA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgYXhpc09wZXJhdGlvbkVsZW1lbnQuYWRkQXR0cmlidXRlKAotICAgICAgICAgICAgICAgICAgICBvbUZhY3RvcnkuY3JlYXRlT01BdHRyaWJ1dGUoV1NETDJDb25zdGFudHMuQVRUUklCVVRFX1NJR05BVFVSRSwgd3JwYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTdHJpbmcpIGF4aXNPcGVyYXRpb24uZ2V0UGFyYW1ldGVyVmFsdWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdTREwyQ29uc3RhbnRzLkFUVFJfV1JQQ19TSUdOQVRVUkUpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYXhpc09wZXJhdGlvbkVsZW1lbnQuYWRkQXR0cmlidXRlKG9tRmFjdG9yeS5jcmVhdGVPTUF0dHJpYnV0ZSgKLSAgICAgICAgICAgICAgICBXU0RMMkNvbnN0YW50cy5BVFRSSUJVVEVfTkFNRV9QQVRURVJOLCBudWxsLCBheGlzT3BlcmF0aW9uLmdldE1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4oKSkpOwotICAgICAgICBQYXJhbWV0ZXIgcGFyYW0gPSBheGlzT3BlcmF0aW9uLmdldFBhcmFtZXRlcihXU0RMMkNvbnN0YW50cy5BVFRSX1dTRExYX1NBRkUpOwotICAgICAgICBpZiAocGFyYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgYXhpc09wZXJhdGlvbkVsZW1lbnQuYWRkQXR0cmlidXRlKG9tRmFjdG9yeS5jcmVhdGVPTUF0dHJpYnV0ZSgKLSAgICAgICAgICAgICAgICAgICAgV1NETDJDb25zdGFudHMuQVRUUklCVVRFX1NBRkUsIHdzZGx4LCAocGFyYW0uZ2V0VmFsdWUoKSkudG9TdHJpbmcoKSkpOwotICAgICAgICB9Ci0gICAgICAgIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlID0gYXhpc09wZXJhdGlvbi5nZXRBeGlzU2VydmljZSgpOwotICAgICAgICBNYXAgbmFtZVNwYWNlTWFwID0gYXhpc1NlcnZpY2UuZ2V0TmFtZXNwYWNlTWFwKCk7Ci0KLSAgICAgICAgLy8gQWRkIHRoZSBpbnB1dCBlbGVtZW50Ci0gICAgICAgIEF4aXNNZXNzYWdlIGluTWVzc2FnZSA9IChBeGlzTWVzc2FnZSkgYXhpc09wZXJhdGlvbi5nZXRDaGlsZChXU0RMQ29uc3RhbnRzLldTRExfTUVTU0FHRV9JTl9NRVNTQUdFKTsKLSAgICAgICAgaWYgKGluTWVzc2FnZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgaW5NZXNzYWdlRWxlbWVudCA9IG9tRmFjdG9yeS5jcmVhdGVPTUVsZW1lbnQoV1NETDJDb25zdGFudHMuSU5fUFVUX0xPQ0FMX05BTUUsIHdzZGwpOwotICAgICAgICAgICAgaW5NZXNzYWdlRWxlbWVudC5hZGRBdHRyaWJ1dGUob21GYWN0b3J5LmNyZWF0ZU9NQXR0cmlidXRlKAotICAgICAgICAgICAgICAgICAgICBXU0RMMkNvbnN0YW50cy5BVFRSSUJVVEVfRUxFTUVOVCwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgV1NETFNlcmlhbGl6YXRpb25VdGlsLmdldEVsZW1lbnROYW1lKGluTWVzc2FnZSwgbmFtZVNwYWNlTWFwKSkpOwotICAgICAgICAgICAgV1NETFNlcmlhbGl6YXRpb25VdGlsLmFkZFdTQVdBY3Rpb25BdHRyaWJ1dGUoaW5NZXNzYWdlRWxlbWVudCwgYXhpc09wZXJhdGlvbi5nZXRJbnB1dEFjdGlvbigpLHdzYXcpOwotICAgICAgICAgICAgV1NETFNlcmlhbGl6YXRpb25VdGlsLmFkZFdTRExEb2N1bWVudGF0aW9uRWxlbWVudChpbk1lc3NhZ2UsIGluTWVzc2FnZUVsZW1lbnQsIG9tRmFjdG9yeSwgd3NkbCk7Ci0gICAgICAgICAgICBheGlzT3BlcmF0aW9uRWxlbWVudC5hZGRDaGlsZChpbk1lc3NhZ2VFbGVtZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEFkZCB0aGUgb3V0cHV0IGVsZW1lbnQKLSAgICAgICAgQXhpc01lc3NhZ2Ugb3V0TWVzc2FnZSA9IChBeGlzTWVzc2FnZSkgYXhpc09wZXJhdGlvbi5nZXRDaGlsZChXU0RMQ29uc3RhbnRzLldTRExfTUVTU0FHRV9PVVRfTUVTU0FHRSk7Ci0gICAgICAgIGlmIChvdXRNZXNzYWdlICE9IG51bGwpIHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBvdXRNZXNzYWdlRWxlbWVudCA9IG9tRmFjdG9yeS5jcmVhdGVPTUVsZW1lbnQoV1NETDJDb25zdGFudHMuT1VUX1BVVF9MT0NBTF9OQU1FLCB3c2RsKTsKLSAgICAgICAgICAgIG91dE1lc3NhZ2VFbGVtZW50LmFkZEF0dHJpYnV0ZShvbUZhY3RvcnkuY3JlYXRlT01BdHRyaWJ1dGUoCi0gICAgICAgICAgICAgICAgICAgIFdTREwyQ29uc3RhbnRzLkFUVFJJQlVURV9FTEVNRU5ULCBudWxsLAotICAgICAgICAgICAgICAgICAgICBXU0RMU2VyaWFsaXphdGlvblV0aWwuZ2V0RWxlbWVudE5hbWUob3V0TWVzc2FnZSwgbmFtZVNwYWNlTWFwKSkpOwotICAgICAgICAgICAgV1NETFNlcmlhbGl6YXRpb25VdGlsLmFkZFdTQVdBY3Rpb25BdHRyaWJ1dGUob3V0TWVzc2FnZUVsZW1lbnQsIGF4aXNPcGVyYXRpb24uZ2V0T3V0cHV0QWN0aW9uKCksd3Nhdyk7Ci0gICAgICAgICAgICBXU0RMU2VyaWFsaXphdGlvblV0aWwuYWRkV1NETERvY3VtZW50YXRpb25FbGVtZW50KG91dE1lc3NhZ2UsIG91dE1lc3NhZ2VFbGVtZW50LCBvbUZhY3RvcnksIHdzZGwpOwotICAgICAgICAgICAgYXhpc09wZXJhdGlvbkVsZW1lbnQuYWRkQ2hpbGQob3V0TWVzc2FnZUVsZW1lbnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQWRkIHRoZSBmYXVsdCBlbGVtZW50Ci0gICAgICAgIEFycmF5TGlzdCBmYXVsdHMgPSBheGlzT3BlcmF0aW9uLmdldEZhdWx0TWVzc2FnZXMoKTsKLSAgICAgICAgaWYgKGZhdWx0cyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBJdGVyYXRvciBpdGVyYXRvciA9IGZhdWx0cy5pdGVyYXRvcigpOwotICAgICAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIEF4aXNNZXNzYWdlIGZhdWx0TWVzc2FnZSA9IChBeGlzTWVzc2FnZSkgaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgIE9NRWxlbWVudCBmYXVsdEVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgaWYgKFdTRExDb25zdGFudHMuV1NETF9NRVNTQUdFX0RJUkVDVElPTl9JTi5lcXVhbHMoZmF1bHRNZXNzYWdlLmdldERpcmVjdGlvbigpKSkgewotICAgICAgICAgICAgICAgICAgICBmYXVsdEVsZW1lbnQgPSBvbUZhY3RvcnkuY3JlYXRlT01FbGVtZW50KFdTREwyQ29uc3RhbnRzLklOX0ZBVUxUX0xPQ0FMX05BTUUsIHdzZGwpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGZhdWx0RWxlbWVudCA9IG9tRmFjdG9yeS5jcmVhdGVPTUVsZW1lbnQoV1NETDJDb25zdGFudHMuT1VUX0ZBVUxUX0xPQ0FMX05BTUUsIHdzZGwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmYXVsdEVsZW1lbnQuYWRkQXR0cmlidXRlKG9tRmFjdG9yeS5jcmVhdGVPTUF0dHJpYnV0ZShXU0RMMkNvbnN0YW50cy5BVFRSSUJVVEVfUkVGLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIHRucy5nZXRQcmVmaXgoKSArICI6IiArCi0gICAgICAgICAgICAgICAgICAgICAgICBmYXVsdE1lc3NhZ2UuZ2V0TmFtZSgpKSk7Ci0gICAgICAgICAgICAgICAgV1NETFNlcmlhbGl6YXRpb25VdGlsLmFkZFdTQVdBY3Rpb25BdHRyaWJ1dGUoZmF1bHRFbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNPcGVyYXRpb24uZ2V0RmF1bHRBY3Rpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYXVsdE1lc3NhZ2UuZ2V0TmFtZSgpKSwgd3Nhdyk7Ci0gICAgICAgICAgICAgICAgV1NETFNlcmlhbGl6YXRpb25VdGlsCi0gICAgICAgICAgICAgICAgICAgICAgICAuYWRkV1NETERvY3VtZW50YXRpb25FbGVtZW50KGZhdWx0TWVzc2FnZSwgZmF1bHRFbGVtZW50LCBvbUZhY3RvcnksIHdzZGwpOwotICAgICAgICAgICAgICAgIGF4aXNPcGVyYXRpb25FbGVtZW50LmFkZENoaWxkKGZhdWx0RWxlbWVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGF4aXNPcGVyYXRpb25FbGVtZW50OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEVQUnMoU3RyaW5nW10gZXBycykgewotICAgICAgICB0aGlzLmVwcnMgPSBlcHJzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgZnVuY3Rpb24gY2hlY2tzIHRoZSBzY2hlbWEgYW5kIHJldHVybnMgdGhlIFdTREwgMi4wIHN0eWxlcyB0aGF0IGl0IGNvbmZvcm0gdG8uCi0gICAgICogSXQgY2hlY2tzIGZvciBSUEMsIElSSSBhbmQgTXVsdGlwYXJ0IHN0eWxlcy4KLSAgICAgKiBGb3IgZnVsbCBkZXRhaWxzIG9uIHRoZSBydWxlcyBwbGVhc2UgcmVmZXIgaHR0cDovL3d3dy53My5vcmcvVFIvMjAwNy9SRUMtd3NkbDIwLWFkanVuY3RzLTIwMDcwNjI2LyNzdHlsZXMKLSAgICAgKiBAcGFyYW0gYXhpc09wZXJhdGlvbiAtIFRoZSBheGlzT3BlcmF0aW9uIHRoYXQgbmVlZHMgdG8gYmUgY2hlY2tlZAotICAgICAqIEByZXR1cm4gU3RyaW5nIFtdIC0gQW4gYXJyYXkgb2Ygc3R5bGVzIHRoYXQgdGhlIG9wZXJhdGlvbiBhZGhlcmVzIHRvLgotICAgICAqLwotICAgIHByaXZhdGUgVVJJIFtdIGNoZWNrU3R5bGUoQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uKSB0aHJvd3MgVVJJU3ludGF4RXhjZXB0aW9uLCBBeGlzRmF1bHQgewotICAgICAgICBib29sZWFuIGlzUlBDID0gdHJ1ZTsKLSAgICAgICAgYm9vbGVhbiBpc011bHRpcGFydCA9IHRydWU7Ci0gICAgICAgIGJvb2xlYW4gaXNJUkkgPSB0cnVlOwotICAgICAgICBBcnJheUxpc3Qgc3R5bGVzID0gbmV3IEFycmF5TGlzdCgzKTsKLQotICAgICAgICBTdHJpbmcgbWVwID0gYXhpc09wZXJhdGlvbi5nZXRNZXNzYWdlRXhjaGFuZ2VQYXR0ZXJuKCk7Ci0gICAgICAgIGlmICghKFdTREwyQ29uc3RhbnRzLk1FUF9VUklfSU5fT05MWS5lcXVhbHMobWVwKSB8fAotICAgICAgICAgICAgICAgIFdTREwyQ29uc3RhbnRzLk1FUF9VUklfSU5fT1VULmVxdWFscyhtZXApKSkgewotICAgICAgICAgICAgaXNSUEMgPSBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIFFOYW1lIGluTWVzc2FnZUVsZW1lbnRRbmFtZTsKLSAgICAgICAgTWFwIGluTWVzc2FnZUVsZW1lbnREZXRhaWxzID0gbmV3IExpbmtlZEhhc2hNYXAoKTsKLSAgICAgICAgQXhpc01lc3NhZ2UgaW5NZXNzYWdlID0gYXhpc09wZXJhdGlvbi5nZXRNZXNzYWdlKFdTREwyQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfSU4pOwotICAgICAgICBpZiAoaW5NZXNzYWdlICE9IG51bGwpIHsKLSAgICAgICAgICAgIFFOYW1lIHFOYW1lID0gaW5NZXNzYWdlLmdldEVsZW1lbnRRTmFtZSgpOwotICAgICAgICAgICAgaWYgKHFOYW1lID09IG51bGwgfHwgQ29uc3RhbnRzLlhTRF9BTlkuZXF1YWxzKHFOYW1lKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVVJJIFswXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFhtbFNjaGVtYUVsZW1lbnQgc2NoZW1hRWxlbWVudCA9IGluTWVzc2FnZS5nZXRTY2hlbWFFbGVtZW50KCk7Ci0gICAgICAgICAgICBpZiAoc2NoZW1hRWxlbWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFheGlzT3BlcmF0aW9uLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKS5lcXVhbHMoc2NoZW1hRWxlbWVudC5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVVJJIFswXTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaW5NZXNzYWdlRWxlbWVudFFuYW1lID0gc2NoZW1hRWxlbWVudC5nZXRRTmFtZSgpOwotICAgICAgICAgICAgICAgIFhtbFNjaGVtYVR5cGUgdHlwZSA9IHNjaGVtYUVsZW1lbnQuZ2V0U2NoZW1hVHlwZSgpOwotICAgICAgICAgICAgICAgIGlmICh0eXBlICE9IG51bGwgJiYgdHlwZSBpbnN0YW5jZW9mIFhtbFNjaGVtYUNvbXBsZXhUeXBlKXsKLSAgICAgICAgICAgICAgICAgICAgWG1sU2NoZW1hQ29tcGxleFR5cGUgY29tcGxleFR5cGUgPSAoWG1sU2NoZW1hQ29tcGxleFR5cGUpIHR5cGU7Ci0gICAgICAgICAgICAgICAgICAgIFhtbFNjaGVtYVBhcnRpY2xlIHBhcnRpY2xlID0gY29tcGxleFR5cGUuZ2V0UGFydGljbGUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnRpY2xlICE9IG51bGwgJiYgcGFydGljbGUgaW5zdGFuY2VvZiBYbWxTY2hlbWFTZXF1ZW5jZSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBYbWxTY2hlbWFTZXF1ZW5jZSB4bWxTY2hlbWFTZXF1ZW5jZSA9IChYbWxTY2hlbWFTZXF1ZW5jZSkgcGFydGljbGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBYbWxTY2hlbWFPYmplY3RDb2xsZWN0aW9uIHNjaGVtYU9iamVjdENvbGxlY3Rpb24gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxTY2hlbWFTZXF1ZW5jZS5nZXRJdGVtcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNjaGVtYU9iamVjdENvbGxlY3Rpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gc2NoZW1hT2JqZWN0Q29sbGVjdGlvbi5nZXRJdGVyYXRvcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IG5leHQgPSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKG5leHQgaW5zdGFuY2VvZiBYbWxTY2hlbWFFbGVtZW50KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBVUkkgWzBdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhtbFNjaGVtYUVsZW1lbnQgaW5uZXJFbGVtZW50ID0gKFhtbFNjaGVtYUVsZW1lbnQpIG5leHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbm5lckVsZW1lbnQuZ2V0UmVmTmFtZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVVJJIFswXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5uZXJFbGVtZW50LmdldE1pbk9jY3VycygpICE9IDEgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbm5lckVsZW1lbnQuZ2V0TWF4T2NjdXJzKCkgIT0gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNNdWx0aXBhcnQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYbWxTY2hlbWFUeXBlIHNjaGVtYVR5cGUgPSBpbm5lckVsZW1lbnQuZ2V0U2NoZW1hVHlwZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRTmFtZSBpbm5lckVsZW1lbnRRTmFtZSA9IGlubmVyRWxlbWVudC5nZXRTY2hlbWFUeXBlTmFtZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2NoZW1hVHlwZSBpbnN0YW5jZW9mIFhtbFNjaGVtYVNpbXBsZVR5cGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChDb25zdGFudHMuWFNEX1FOQU1FLmVxdWFscyhpbm5lckVsZW1lbnRRTmFtZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLlhTRF9OT1RBVElPTi5lcXVhbHMoaW5uZXJFbGVtZW50UU5hbWUpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5YU0RfSEVYQklOLmVxdWFscyhpbm5lckVsZW1lbnRRTmFtZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLlhTRF9CQVNFNjQuZXF1YWxzKGlubmVyRWxlbWVudFFOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0lSSSA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNJUkkgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQ29uc3RhbnRzLlhTRF9BTlkuZXF1YWxzKGlubmVyRWxlbWVudFFOYW1lKSAmJiBpdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUlBDID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBpbm5lckVsZW1lbnQuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5NZXNzYWdlRWxlbWVudERldGFpbHMuZ2V0KG5hbWUpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUlBDID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc011bHRpcGFydCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluTWVzc2FnZUVsZW1lbnREZXRhaWxzLnB1dChuYW1lLCBpbm5lckVsZW1lbnRRTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBVUkkgWzBdOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVVJJIFswXTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFVSSSBbMF07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFVSSSBbMF07Ci0gICAgICAgIH0KLSAgICAgICAgQXhpc01lc3NhZ2Ugb3V0TWVzc2FnZSA9IG51bGw7Ci0gICAgICAgIE1hcCBvdXRNZXNzYWdlRWxlbWVudERldGFpbHMgPSBuZXcgTGlua2VkSGFzaE1hcCgpOwotICAgICAgICBpZiAoaXNSUEMgJiYgIVdTREwyQ29uc3RhbnRzLk1FUF9VUklfSU5fT05MWS5lcXVhbHMobWVwKSkgewotICAgICAgICAgICAgb3V0TWVzc2FnZSA9IGF4aXNPcGVyYXRpb24uZ2V0TWVzc2FnZShXU0RMMkNvbnN0YW50cy5NRVNTQUdFX0xBQkVMX09VVCk7Ci0gICAgICAgICAgICBRTmFtZSBxTmFtZSA9IG91dE1lc3NhZ2UuZ2V0RWxlbWVudFFOYW1lKCk7Ci0gICAgICAgICAgICBpZiAocU5hbWUgPT0gbnVsbCAmJiBDb25zdGFudHMuWFNEX0FOWS5lcXVhbHMocU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgaXNSUEMgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFhtbFNjaGVtYUVsZW1lbnQgc2NoZW1hRWxlbWVudCA9IG91dE1lc3NhZ2UuZ2V0U2NoZW1hRWxlbWVudCgpOwotICAgICAgICAgICAgaWYgKHNjaGVtYUVsZW1lbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmICghKGF4aXNPcGVyYXRpb24uZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpICsgSmF2YTJXU0RMQ29uc3RhbnRzLlJFU1BPTlNFKQotICAgICAgICAgICAgICAgICAgICAgICAgLmVxdWFscyhzY2hlbWFFbGVtZW50LmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaXNSUEMgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCFzY2hlbWFFbGVtZW50LmdldFFOYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5lcXVhbHMoaW5NZXNzYWdlRWxlbWVudFFuYW1lLmdldE5hbWVzcGFjZVVSSSgpKSkgewotICAgICAgICAgICAgICAgICAgICBpc1JQQyA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBYbWxTY2hlbWFUeXBlIHR5cGUgPSBzY2hlbWFFbGVtZW50LmdldFNjaGVtYVR5cGUoKTsKLSAgICAgICAgICAgICAgICBpZiAodHlwZSAhPSBudWxsICYmIHR5cGUgaW5zdGFuY2VvZiBYbWxTY2hlbWFDb21wbGV4VHlwZSkgewotICAgICAgICAgICAgICAgICAgICBYbWxTY2hlbWFDb21wbGV4VHlwZSBjb21wbGV4VHlwZSA9IChYbWxTY2hlbWFDb21wbGV4VHlwZSkgdHlwZTsKLSAgICAgICAgICAgICAgICAgICAgWG1sU2NoZW1hUGFydGljbGUgcGFydGljbGUgPSBjb21wbGV4VHlwZS5nZXRQYXJ0aWNsZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAocGFydGljbGUgIT0gbnVsbCAmJiBwYXJ0aWNsZSBpbnN0YW5jZW9mIFhtbFNjaGVtYVNlcXVlbmNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBYbWxTY2hlbWFTZXF1ZW5jZSB4bWxTY2hlbWFTZXF1ZW5jZSA9IChYbWxTY2hlbWFTZXF1ZW5jZSkgcGFydGljbGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBYbWxTY2hlbWFPYmplY3RDb2xsZWN0aW9uIHNjaGVtYU9iamVjdENvbGxlY3Rpb24gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxTY2hlbWFTZXF1ZW5jZS5nZXRJdGVtcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNjaGVtYU9iamVjdENvbGxlY3Rpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gc2NoZW1hT2JqZWN0Q29sbGVjdGlvbi5nZXRJdGVyYXRvcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IG5leHQgPSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKG5leHQgaW5zdGFuY2VvZiBYbWxTY2hlbWFFbGVtZW50KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNSUEMgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYbWxTY2hlbWFFbGVtZW50IGlubmVyRWxlbWVudCA9IChYbWxTY2hlbWFFbGVtZW50KSBuZXh0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRTmFtZSBzY2hlbWFUeXBlTmFtZSA9IGlubmVyRWxlbWVudC5nZXRTY2hlbWFUeXBlTmFtZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGlubmVyRWxlbWVudC5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbm5lckVsZW1lbnQuZ2V0UmVmTmFtZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUlBDID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG91dE1lc3NhZ2VFbGVtZW50RGV0YWlscy5nZXQobmFtZSkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNSUEMgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRTmFtZSBpbk1lc3NhZ2VFbGVtZW50VHlwZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFFOYW1lKSBpbk1lc3NhZ2VFbGVtZW50RGV0YWlscy5nZXQobmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbk1lc3NhZ2VFbGVtZW50VHlwZSAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5NZXNzYWdlRWxlbWVudFR5cGUgIT0gc2NoZW1hVHlwZU5hbWUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUlBDID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0TWVzc2FnZUVsZW1lbnREZXRhaWxzLnB1dChuYW1lLCBzY2hlbWFUeXBlTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaXNSUEMgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlzUlBDID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpc1JQQyA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGludCBjb3VudCA9IDA7Ci0gICAgICAgIGlmIChpc1JQQykgewotICAgICAgICAgICAgc3R5bGVzLmFkZChuZXcgVVJJKFdTREwyQ29uc3RhbnRzLlNUWUxFX1JQQykpOwotICAgICAgICAgICAgYXhpc09wZXJhdGlvbi5hZGRQYXJhbWV0ZXIoV1NETDJDb25zdGFudHMuQVRUUl9XUlBDX1NJR05BVFVSRSwgZ2VuZXJhdGVSUENTaWduYXR1cmUoCi0gICAgICAgICAgICAgICAgICAgIGluTWVzc2FnZUVsZW1lbnREZXRhaWxzLCBvdXRNZXNzYWdlRWxlbWVudERldGFpbHMpKTsKLSAgICAgICAgICAgIGNvdW50ICsrOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpc0lSSSkgewotICAgICAgICAgICAgc3R5bGVzLmFkZChuZXcgVVJJKFdTREwyQ29uc3RhbnRzLlNUWUxFX0lSSSkpOwotICAgICAgICAgICAgY291bnQgKys7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlzTXVsdGlwYXJ0KSB7Ci0gICAgICAgICAgICBzdHlsZXMuYWRkKG5ldyBVUkkoV1NETDJDb25zdGFudHMuU1RZTEVfTVVMVElQQVJUKSk7Ci0gICAgICAgICAgICBjb3VudCArKzsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKFVSSVtdKSBzdHlsZXMudG9BcnJheShuZXcgVVJJW2NvdW50XSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2VuZXJhdGVSUENTaWduYXR1cmUoTWFwIGluTWVzc2FnZUVsZW1lbnREZXRhaWxzLCBNYXAgb3V0TWVzc2FnZUVsZW1lbnREZXRhaWxzKSB7Ci0gICAgICAgIFN0cmluZyBpbiA9ICIiOwotICAgICAgICBTdHJpbmcgb3V0ID0gIiI7Ci0gICAgICAgIFN0cmluZyBpbk91dCA9ICIiOwotICAgICAgICBTZXQgaW5FbGVtZW50U2V0ID0gaW5NZXNzYWdlRWxlbWVudERldGFpbHMua2V5U2V0KCk7Ci0gICAgICAgIFNldCBvdXRFbGVtZW50U2V0ID0gb3V0TWVzc2FnZUVsZW1lbnREZXRhaWxzLmtleVNldCgpOwotCi0gICAgICAgIEl0ZXJhdG9yIGluRWxlbWVudEl0ZXJhdG9yID0gaW5FbGVtZW50U2V0Lml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpbkVsZW1lbnRJdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIFN0cmluZyBpbkVsZW1lbnROYW1lID0gKFN0cmluZykgaW5FbGVtZW50SXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgaWYgKG91dEVsZW1lbnRTZXQuY29udGFpbnMoaW5FbGVtZW50TmFtZSkpIHsKLSAgICAgICAgICAgICAgICBpbk91dCA9IGluT3V0ICsgaW5FbGVtZW50TmFtZSArICIgIiArIFdTREwyQ29uc3RhbnRzLlJQQ19JTk9VVCArICIgIjsKLSAgICAgICAgICAgICAgICBvdXRFbGVtZW50U2V0LnJlbW92ZShpbkVsZW1lbnROYW1lKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaW4gPSBpbiArIGluRWxlbWVudE5hbWUgKyAiICIgKyBXU0RMMkNvbnN0YW50cy5SUENfSU4gKyAiICI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgSXRlcmF0b3Igb3V0RWxlbWVudEl0ZXJhdG9yID0gb3V0RWxlbWVudFNldC5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAob3V0RWxlbWVudEl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgU3RyaW5nIG91dEVsZW1lbnROYW1lID0gKFN0cmluZykgb3V0RWxlbWVudEl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgIG91dCA9IG91dCArIG91dEVsZW1lbnROYW1lICsgIiAiICsgV1NETDJDb25zdGFudHMuUlBDX1JFVFVSTiArICIgIjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaW4gKyBvdXQgKyBpbk91dDsKLSAgICB9Ci0gICAgCi0JcHJpdmF0ZSB2b2lkIGFkZFBvbGljeUFzRXh0ZW5zaWJsZUVsZW1lbnQoQXhpc0Rlc2NyaXB0aW9uIGF4aXNEZXNjcmlwdGlvbiwKLQkJCU9NRWxlbWVudCBkZXNjcmlwdGlvbkVsZW1lbnQpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sCi0JCQlGYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yLCBBeGlzRmF1bHQgewotCQlQb2xpY3lTdWJqZWN0IHBvbGljeVN1YmplY3QgPSBheGlzRGVzY3JpcHRpb24uZ2V0UG9saWN5U3ViamVjdCgpOwotCQlDb2xsZWN0aW9uIGF0dGFjaFBvbGljeUNvbXBvbmVudHMgPSBwb2xpY3lTdWJqZWN0Ci0JCQkJLmdldEF0dGFjaGVkUG9saWN5Q29tcG9uZW50cygpOwotCi0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBhdHRhY2hQb2xpY3lDb21wb25lbnRzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBwb2xpY3lFbGVtZW50ID0gaXRlcmF0b3IubmV4dCgpOwotCi0JCQlpZiAocG9saWN5RWxlbWVudCBpbnN0YW5jZW9mIFBvbGljeSkgewotCQkJCVBvbGljeVJlZmVyZW5jZSBwb2xpY3lSZWZlcmVuY2UgPSBQb2xpY3lVdGlsCi0JCQkJCQkuY3JlYXRlUG9saWN5UmVmZXJlbmNlKChQb2xpY3kpIHBvbGljeUVsZW1lbnQpOwotCQkJCU9NRWxlbWVudCBwb2xpY3lSZWZFbGVtZW50ID0gUG9saWN5VXRpbAotCQkJCQkJLmdldFBvbGljeUNvbXBvbmVudEFzT01FbGVtZW50KAotCQkJCQkJCQkoUG9saWN5Q29tcG9uZW50KSBwb2xpY3lSZWZlcmVuY2UsIGZpbHRlcik7Ci0KLQkJCQlPTU5vZGUgZmlyc3RDaGlsZEVsZW0gPSBkZXNjcmlwdGlvbkVsZW1lbnQuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJaWYgKGZpcnN0Q2hpbGRFbGVtID09IG51bGwpIHsKLQkJCQkJZGVzY3JpcHRpb25FbGVtZW50LmFkZENoaWxkKHBvbGljeVJlZkVsZW1lbnQpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWZpcnN0Q2hpbGRFbGVtLmluc2VydFNpYmxpbmdCZWZvcmUocG9saWN5UmVmRWxlbWVudCk7Ci0JCQkJfQotCQkJCVN0cmluZyBrZXkgPSAoKFBvbGljeVJlZmVyZW5jZSkgcG9saWN5UmVmZXJlbmNlKS5nZXRVUkkoKTsKLQkJCQlpZiAoa2V5LnN0YXJ0c1dpdGgoIiMiKSkgewotCQkJCQlrZXkgPSBrZXkuc3Vic3RyaW5nKGtleS5pbmRleE9mKCIjIikgKyAxKTsKLQkJCQl9Ci0JCQkJcG9saWNpZXNJbkRlc2NyaXB0aW9uLnB1dChrZXksIChQb2xpY3kpIHBvbGljeUVsZW1lbnQpOwotCi0JCQl9IGVsc2UgaWYgKHBvbGljeUVsZW1lbnQgaW5zdGFuY2VvZiBQb2xpY3lSZWZlcmVuY2UpIHsKLQkJCQlPTUVsZW1lbnQgY2hpbGQgPSBQb2xpY3lVdGlsCi0JCQkJCQkuZ2V0UG9saWN5Q29tcG9uZW50QXNPTUVsZW1lbnQoKFBvbGljeUNvbXBvbmVudCkgcG9saWN5RWxlbWVudCk7Ci0JCQkJT01FbGVtZW50IGZpcnN0Q2hpbGRFbGVtID0gZGVzY3JpcHRpb25FbGVtZW50LmdldEZpcnN0RWxlbWVudCgpOwotCi0JCQkJaWYgKGZpcnN0Q2hpbGRFbGVtID09IG51bGwpIHsKLQkJCQkJZGVzY3JpcHRpb25FbGVtZW50LmFkZENoaWxkKGNoaWxkKTsKLQkJCQl9IGVsc2UgewotCQkJCQlmaXJzdENoaWxkRWxlbS5pbnNlcnRTaWJsaW5nQmVmb3JlKGNoaWxkKTsKLQkJCQl9Ci0KLQkJCQlTdHJpbmcga2V5ID0gKChQb2xpY3lSZWZlcmVuY2UpIHBvbGljeUVsZW1lbnQpLmdldFVSSSgpOwotCQkJCWlmIChrZXkuc3RhcnRzV2l0aCgiIyIpKSB7Ci0JCQkJCWtleSA9IGtleS5zdWJzdHJpbmcoa2V5LmluZGV4T2YoIiMiKSArIDEpOwotCQkJCX0KLQotCQkJCVBvbGljeUxvY2F0b3IgbG9jYXRvciA9IG5ldyBQb2xpY3lMb2NhdG9yKGF4aXNTZXJ2aWNlKTsKLQkJCQlQb2xpY3kgcCA9IGxvY2F0b3IubG9va3VwKGtleSk7Ci0KLQkJCQlpZiAocCA9PSBudWxsKSB7Ci0JCQkJCXRocm93IG5ldyBBeGlzRmF1bHQoIlBvbGljeSBub3QgZm91bmQgZm9yIHVyaSA6ICIgKyBrZXkpOwotCQkJCX0KLQkJCQlwb2xpY2llc0luRGVzY3JpcHRpb24ucHV0KGtleSwgcCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZFBvbGljaWVzVG9EZXNjcmlwdGlvbkVsZW1lbnQoTGlzdCBwb2xpY2llcywKLQkJCU9NRWxlbWVudCBkZXNjcmlwdGlvbkVsZW1lbnQpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sCi0JCQlGYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yIHsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHBvbGljaWVzLnNpemUoKTsgaSsrKSB7Ci0JCQlQb2xpY3kgcG9saWN5ID0gKFBvbGljeSkgcG9saWNpZXMuZ2V0KGkpOwotCQkJT01FbGVtZW50IHBvbGljeUVsZW1lbnQgPSBQb2xpY3lVdGlsLmdldFBvbGljeUNvbXBvbmVudEFzT01FbGVtZW50KAotCQkJCQlwb2xpY3ksIGZpbHRlcik7Ci0JCQlPTU5vZGUgZmlyc3RDaGlsZCA9IGRlc2NyaXB0aW9uRWxlbWVudC5nZXRGaXJzdE9NQ2hpbGQoKTsKLQkJCWlmIChmaXJzdENoaWxkICE9IG51bGwpIHsKLQkJCQlmaXJzdENoaWxkLmluc2VydFNpYmxpbmdCZWZvcmUocG9saWN5RWxlbWVudCk7Ci0JCQl9IGVsc2UgewotCQkJCWRlc2NyaXB0aW9uRWxlbWVudC5hZGRDaGlsZChwb2xpY3lFbGVtZW50KTsKLQkJCX0KLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vQXhpc1NlcnZpY2VHcm91cC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL0F4aXNTZXJ2aWNlR3JvdXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU0ZDFlNi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vQXhpc1NlcnZpY2VHcm91cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0NvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0V2ZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaTE4bi5NZXNzYWdlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgQXhpc1NlcnZpY2VHcm91cCBleHRlbmRzIEF4aXNEZXNjcmlwdGlvbiB7Ci0KLSAgICAvL3RvIGNoZWNrIHdoZXRoZXIgdXNlciBoYXMgcHV0IFdXVyBkaXIgb3Igbm90Ci0gICAgcHJpdmF0ZSBib29sZWFuIGZvdW5kV2ViUmVzb3VyY2VzOwotICAgIC8vIHRvIHN0b3JlIG1vZHVsZSByZWYgYXQgZGVwbG95IHRpbWUgcGFyc2luZwotICAgIHByaXZhdGUgQXJyYXlMaXN0PFN0cmluZz4gbW9kdWxlc0xpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQotICAgIC8vIHRvIHN0b3JlIG1vZGV1bGUgY29uZmlndXJhdGlvbiBpbmZvCi0gICAgcHJpdmF0ZSBIYXNoTWFwPFN0cmluZywgTW9kdWxlQ29uZmlndXJhdGlvbj4gbW9kdWxlQ29uZmlnbWFwOwotCi0gICAgLy8gY2xhc3MgbG9hZGVyCi0gICAgcHJpdmF0ZSBDbGFzc0xvYWRlciBzZXJ2aWNlR3JvdXBDbGFzc0xvYWRlcjsKLQotICAgIC8vIHRvIGtlZXAgbmFtZSBvZiB0aGUgc2VydmljZSBncm91cAotICAgIHByaXZhdGUgU3RyaW5nIHNlcnZpY2VHcm91cE5hbWU7Ci0KLSAgICBwdWJsaWMgQXhpc1NlcnZpY2VHcm91cCgpIHsKLSAgICAgICAgbW9kdWxlQ29uZmlnbWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBNb2R1bGVDb25maWd1cmF0aW9uPigpOwotICAgIH0KLQotICAgIHB1YmxpYyBBeGlzU2VydmljZUdyb3VwKEF4aXNDb25maWd1cmF0aW9uIGF4aXNEZXNjcmlwdGlvbikgewotICAgICAgICB0aGlzKCk7Ci0gICAgICAgIHNldFBhcmVudChheGlzRGVzY3JpcHRpb24pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgbW9kdWxlIGNvbmZpZ3VyYXRpb24sIGlmIHRoZXJlIGlzIG1vZHVsZUNvbmZpZyB0YWcgaW4gc2VydmljZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtb2R1bGVDb25maWd1cmF0aW9uIHRoZSBNb2R1bGVDb25maWd1cmF0aW9uIHRvIGFkZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZE1vZHVsZUNvbmZpZyhNb2R1bGVDb25maWd1cmF0aW9uIG1vZHVsZUNvbmZpZ3VyYXRpb24pIHsKLSAgICAgICAgaWYgKG1vZHVsZUNvbmZpZ21hcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtb2R1bGVDb25maWdtYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE1vZHVsZUNvbmZpZ3VyYXRpb24+KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBtb2R1bGVDb25maWdtYXAucHV0KG1vZHVsZUNvbmZpZ3VyYXRpb24uZ2V0TW9kdWxlTmFtZSgpLCBtb2R1bGVDb25maWd1cmF0aW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRNb2R1bGVyZWYoU3RyaW5nIG1vZHVsZXJlZikgewotICAgICAgICBtb2R1bGVzTGlzdC5hZGQobW9kdWxlcmVmKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRTZXJ2aWNlKEF4aXNTZXJ2aWNlIHNlcnZpY2UpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBpZiAoc2VydmljZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc2VydmljZUdyb3VwTmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBzZXR1cCBhIHRlbXBvcmFyeSBuYW1lIGJhc2VkIG9uIHRoZSBmaXJzdCBzZXJ2aWNlIHVuZGVyIHRoaXMgZ3JvdXAKLSAgICAgICAgICAgIHNlcnZpY2VHcm91cE5hbWUgPSBzZXJ2aWNlLmdldE5hbWUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHNlcnZpY2Uuc2V0UGFyZW50KHRoaXMpOwotCi0gICAgICAgIEF4aXNDb25maWd1cmF0aW9uIGF4aXNDb25maWcgPSBnZXRBeGlzQ29uZmlndXJhdGlvbigpOwotCi0gICAgICAgIGlmIChheGlzQ29uZmlnICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3I8QXhpc01vZHVsZT4gaXRlcmF0b3IgPSBnZXRFbmdhZ2VkTW9kdWxlcygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICBPYmplY3QgbyA9IGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgICAgICBBeGlzTW9kdWxlIGF4aXNNb2R1bGU7Ci0gICAgICAgICAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBBeGlzTW9kdWxlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF4aXNNb2R1bGUgPSAoQXhpc01vZHVsZSkgbzsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBTdHJpbmcpIHsgLy9TaG91bGQgdGhpcyBiZSBjaGVja2VkCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBtb2R1bGVOYW1lID0gKFN0cmluZykgbzsKLSAgICAgICAgICAgICAgICAgICAgYXhpc01vZHVsZSA9IGF4aXNDb25maWcuZ2V0TW9kdWxlKG1vZHVsZU5hbWUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoYXhpc01vZHVsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KE1lc3NhZ2VzLmdldE1lc3NhZ2UoIm1vZHVsZW5vdGF2YWlsYmxlIiwgbW9kdWxlTmFtZSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdChNZXNzYWdlcy5nZXRNZXNzYWdlKCJtb2R1bGVub3RhdmFpbGJsZSIpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2VydmljZS5lbmdhZ2VNb2R1bGUoYXhpc01vZHVsZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgICBzZXJ2aWNlLnNldExhc3RVcGRhdGUoKTsKLSAgICAgICAgYWRkQ2hpbGQoc2VydmljZSk7Ci0gICAgICAgIGlmIChheGlzQ29uZmlnICE9IG51bGwpIHsKLSAgICAgICAgICAgIGF4aXNDb25maWcuYWRkVG9BbGxTZXJ2aWNlc01hcChzZXJ2aWNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqCi0gICAgICogQHBhcmFtIHNlcnZpY2UKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqIEBkZXByZWNhdGVkIHBsZWFzZSB1c2UgYWRkU2VydmljZSgpIGluc3RlYWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRUb0dyb3VwKEF4aXNTZXJ2aWNlIHNlcnZpY2UpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhZGRTZXJ2aWNlKHNlcnZpY2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdoZW4gYSBtb2R1bGUgZ2V0cyBlbmdhZ2VkIG9uIGEgU2VydmljZUdyb3VwLCB3ZSBoYXZlIHRvIGVuZ2FnZSBpdCBmb3IgZWFjaCBTZXJ2aWNlLgotICAgICAqCi0gICAgICogQHBhcmFtIG1vZHVsZSB0aGUgbmV3bHktZW5nYWdlZCBBeGlzTW9kdWxlCi0gICAgICogQHBhcmFtIGVuZ2FnZXIKLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdCBpZiB0aGVyZSBpcyBhIHByb2JsZW0KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBvbkVuZ2FnZShBeGlzTW9kdWxlIG1vZHVsZSwgQXhpc0Rlc2NyaXB0aW9uIGVuZ2FnZXIpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBmb3IgKEl0ZXJhdG9yPEF4aXNTZXJ2aWNlPiBzZXJ2aWNlSXRlciA9IGdldFNlcnZpY2VzKCk7IHNlcnZpY2VJdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlID0gKEF4aXNTZXJ2aWNlKSBzZXJ2aWNlSXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBheGlzU2VydmljZS5lbmdhZ2VNb2R1bGUobW9kdWxlLCBlbmdhZ2VyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9uRGlzZW5nYWdlKEF4aXNNb2R1bGUgbW9kdWxlKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgZm9yIChJdGVyYXRvcjxBeGlzU2VydmljZT4gc2VydmljZUl0ZXIgPSBnZXRTZXJ2aWNlcygpOyBzZXJ2aWNlSXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBBeGlzU2VydmljZSBheGlzU2VydmljZSA9IChBeGlzU2VydmljZSkgc2VydmljZUl0ZXIubmV4dCgpOwotICAgICAgICAgICAgYXhpc1NlcnZpY2UuZGlzZW5nYWdlTW9kdWxlKG1vZHVsZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVTZXJ2aWNlKFN0cmluZyBuYW1lKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSA9IGdldFNlcnZpY2UobmFtZSk7Ci0KLSAgICAgICAgaWYgKHNlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5ub3RpZnlPYnNlcnZlcnMoQXhpc0V2ZW50LlNFUlZJQ0VfUkVNT1ZFLCBzZXJ2aWNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJlbW92ZUNoaWxkKG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBNb2R1bGVDb25maWd1cmF0aW9uIGdldE1vZHVsZUNvbmZpZyhTdHJpbmcgbW9kdWxlTmFtZSkgewotICAgICAgICByZXR1cm4gKE1vZHVsZUNvbmZpZ3VyYXRpb24pIG1vZHVsZUNvbmZpZ21hcC5nZXQobW9kdWxlTmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIEFycmF5TGlzdDxTdHJpbmc+IGdldE1vZHVsZVJlZnMoKSB7Ci0gICAgICAgIHJldHVybiBtb2R1bGVzTGlzdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXhpc1NlcnZpY2UgZ2V0U2VydmljZShTdHJpbmcgbmFtZSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIHJldHVybiAoQXhpc1NlcnZpY2UpIGdldENoaWxkKG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBDbGFzc0xvYWRlciBnZXRTZXJ2aWNlR3JvdXBDbGFzc0xvYWRlcigpIHsKLSAgICAgICAgcmV0dXJuIHNlcnZpY2VHcm91cENsYXNzTG9hZGVyOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmljZUdyb3VwTmFtZSgpIHsKLSAgICAgICAgLy8gTm90ZTogaWYgdGhlIHNlcnZpY2VHcm91cE5hbWUgaXMgbm90IHNldCwgdGhlbiB0aGlzIGNvdWxkIGJlIG51bGwuCi0gICAgICAgIC8vIElmIHRoZSBzZXJ2aWNlR3JvdXBOYW1lIGhhcyBub3QgYmVlbiBzZXQgYW5kIGEgc2VydmljZSBpcyBhZGRlZCB0byB0aGlzIGdyb3VwLAotICAgICAgICAvLyB0aGVuIHRoZSBzZXJ2aWNlR3JvdXBOYW1lIHdpbGwgZGVmYXVsdCB0byB0aGUgbmFtZSBvZiB0aGUgZmlyc3Qgc2VydmljZQotICAgICAgICByZXR1cm4gc2VydmljZUdyb3VwTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSXRlcmF0b3I8QXhpc1NlcnZpY2U+IGdldFNlcnZpY2VzKCkgewotICAgICAgICByZXR1cm4gKEl0ZXJhdG9yPEF4aXNTZXJ2aWNlPilnZXRDaGlsZHJlbigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEF4aXNEZXNjcmlwdGlvbihBeGlzQ29uZmlndXJhdGlvbiBheGlzRGVzY3JpcHRpb24pIHsKLSAgICAgICAgc2V0UGFyZW50KGF4aXNEZXNjcmlwdGlvbik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2VydmljZUdyb3VwQ2xhc3NMb2FkZXIoQ2xhc3NMb2FkZXIgc2VydmljZUdyb3VwQ2xhc3NMb2FkZXIpIHsKLSAgICAgICAgdGhpcy5zZXJ2aWNlR3JvdXBDbGFzc0xvYWRlciA9IHNlcnZpY2VHcm91cENsYXNzTG9hZGVyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VHcm91cE5hbWUoU3RyaW5nIHNlcnZpY2VHcm91cE5hbWUpIHsKLSAgICAgICAgdGhpcy5zZXJ2aWNlR3JvdXBOYW1lID0gc2VydmljZUdyb3VwTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldEtleSgpIHsKLSAgICAgICAgLy8gTm90ZTogaWYgdGhlIHNlcnZpY2VHcm91cE5hbWUgaXMgbm90IHNldCwgdGhlbiB0aGlzIGNvdWxkIGJlIG51bGwuCi0gICAgICAgIC8vIElmIHRoZSBzZXJ2aWNlR3JvdXBOYW1lIGhhcyBub3QgYmVlbiBzZXQgYW5kIGEgc2VydmljZSBpcyBhZGRlZCB0byB0aGlzIGdyb3VwLAotICAgICAgICAvLyB0aGVuIHRoZSBzZXJ2aWNlR3JvdXBOYW1lIHdpbGwgZGVmYXVsdCB0byB0aGUgbmFtZSBvZiB0aGUgZmlyc3Qgc2VydmljZQotICAgICAgICByZXR1cm4gdGhpcy5zZXJ2aWNlR3JvdXBOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRm91bmRXZWJSZXNvdXJjZXMoKSB7Ci0gICAgICAgIHJldHVybiBmb3VuZFdlYlJlc291cmNlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRGb3VuZFdlYlJlc291cmNlcyhib29sZWFuIGZvdW5kV2ViUmVzb3VyY2VzKSB7Ci0gICAgICAgIHRoaXMuZm91bmRXZWJSZXNvdXJjZXMgPSBmb3VuZFdlYlJlc291cmNlczsKLSAgICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL0NsaWVudFV0aWxzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vQ2xpZW50VXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ExMTEyOS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vQ2xpZW50VXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuT3B0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0NvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuTGlzdGVuZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaTE4bi5NZXNzYWdlczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247Ci0KLS8qKgotICogVXRpbGl0eSBtZXRob2RzIGZvciB2YXJpb3VzIGNsaWVudHMgdG8gdXNlLgotICovCi1wdWJsaWMgY2xhc3MgQ2xpZW50VXRpbHMgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKENsaWVudFV0aWxzLmNsYXNzKTsKLQotICAgIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIFRyYW5zcG9ydE91dERlc2NyaXB0aW9uIGluZmVyT3V0VHJhbnNwb3J0KEF4aXNDb25maWd1cmF0aW9uIGFjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuZHBvaW50UmVmZXJlbmNlIGVwciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlQ29udGV4dCBtc2djdHgpCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgU3RyaW5nIHRyYW5zcG9ydFVSSSA9IChTdHJpbmcpIG1zZ2N0eC5nZXRQcm9wZXJ0eShDb25zdGFudHMuQ29uZmlndXJhdGlvbi5UUkFOU1BPUlRfVVJMKTsKLSAgICAgICAgaWYgKHRyYW5zcG9ydFVSSSAhPSBudWxsICYmICEiIi5lcXVhbHModHJhbnNwb3J0VVJJKSkgewotICAgICAgICAgICAgaW50IGluZGV4ID0gdHJhbnNwb3J0VVJJLmluZGV4T2YoJzonKTsKLSAgICAgICAgICAgIFN0cmluZyB0cmFuc3BvcnQgPSAoaW5kZXggPiAwKSA/IHRyYW5zcG9ydFVSSS5zdWJzdHJpbmcoMCwgaW5kZXgpIDogbnVsbDsKLSAgICAgICAgICAgIGlmICh0cmFuc3BvcnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFRyYW5zcG9ydE91dERlc2NyaXB0aW9uIHRyYW5zcG9ydE91dCA9IGFjLmdldFRyYW5zcG9ydE91dCh0cmFuc3BvcnQpOwotICAgICAgICAgICAgICAgIGlmICh0cmFuc3BvcnRPdXQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIk5vIFRyYW5wb3J0IFNlbmRlciBmb3VuZCBmb3IgOiAiICsgdHJhbnNwb3J0KTsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiTm8gVHJhbnBvcnQgU2VuZGVyIGZvdW5kIGZvciA6ICIgKyB0cmFuc3BvcnQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBhYy5nZXRUcmFuc3BvcnRPdXQodHJhbnNwb3J0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGxvZy5lcnJvcihNZXNzYWdlcy5nZXRNZXNzYWdlKCJjYW5ub3RJbmZlclRyYW5zcG9ydCIsIHRyYW5zcG9ydFVSSSkpOwotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoTWVzc2FnZXMuZ2V0TWVzc2FnZSgiY2Fubm90SW5mZXJUcmFuc3BvcnQiLCB0cmFuc3BvcnRVUkkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChtc2djdHguZ2V0T3B0aW9ucygpLmdldFRyYW5zcG9ydE91dCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAobXNnY3R4LmdldE9wdGlvbnMoKS5nZXRUcmFuc3BvcnRPdXQoKS5nZXRTZW5kZXIoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcihNZXNzYWdlcy5nZXRNZXNzYWdlKCJJbmNvbXBsZXRlIHRyYW5zcG9ydCBzZW5kZXI6IG1pc3Npbmcgc2VuZGVyISIpKTsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiSW5jb21wbGV0ZSB0cmFuc3BvcnQgc2VuZGVyOiBtaXNzaW5nIHNlbmRlciEiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1zZ2N0eC5nZXRPcHRpb25zKCkuZ2V0VHJhbnNwb3J0T3V0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZXByID09IG51bGwgfHwgKGVwci5nZXRBZGRyZXNzKCkgPT0gbnVsbCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZXJyb3IoTWVzc2FnZXMuZ2V0TWVzc2FnZSgiY2Fubm90SW5mZXJUcmFuc3BvcnROb0FkZHIiKSk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdChNZXNzYWdlcy5nZXRNZXNzYWdlKCJjYW5ub3RJbmZlclRyYW5zcG9ydE5vQWRkciIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFN0cmluZyB1cmkgPSBlcHIuZ2V0QWRkcmVzcygpOwotICAgICAgICAgICAgaW50IGluZGV4ID0gdXJpLmluZGV4T2YoJzonKTsKLSAgICAgICAgICAgIFN0cmluZyB0cmFuc3BvcnQgPSAoaW5kZXggPiAwKSA/IHVyaS5zdWJzdHJpbmcoMCwgaW5kZXgpIDogbnVsbDsKLSAgICAgICAgICAgIGlmICh0cmFuc3BvcnQgIT0gbnVsbCAmJiBhYy5nZXRUcmFuc3BvcnRPdXQodHJhbnNwb3J0KSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGFjLmdldFRyYW5zcG9ydE91dCh0cmFuc3BvcnQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBsb2cuZXJyb3IoTWVzc2FnZXMuZ2V0TWVzc2FnZSgiY2Fubm90SW5mZXJUcmFuc3BvcnQiLCB1cmkpKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KE1lc3NhZ2VzLmdldE1lc3NhZ2UoImNhbm5vdEluZmVyVHJhbnNwb3J0IiwgdXJpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCBUcmFuc3BvcnRJbkRlc2NyaXB0aW9uIGluZmVySW5UcmFuc3BvcnQoQXhpc0NvbmZpZ3VyYXRpb24gYWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbnMgb3B0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUNvbnRleHQgbXNnQ3R4dCkKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBTdHJpbmcgbGlzdGVuZXJUcmFuc3BvcnRQcm90b2NvbCA9IG9wdGlvbnMuZ2V0VHJhbnNwb3J0SW5Qcm90b2NvbCgpOwotICAgICAgICBpZiAobGlzdGVuZXJUcmFuc3BvcnRQcm90b2NvbCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBFbmRwb2ludFJlZmVyZW5jZSByZXBseVRvID0gbXNnQ3R4dC5nZXRSZXBseVRvKCk7Ci0gICAgICAgICAgICBpZiAocmVwbHlUbyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgVVJJIHVyaSA9IG5ldyBVUkkocmVwbHlUby5nZXRBZGRyZXNzKCkpOwotICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lclRyYW5zcG9ydFByb3RvY29sID0gdXJpLmdldFNjaGVtZSgpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vbmVlZCB0byBpZ25vcmUKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vYXNzdW1lIGxpc3RlbmVyIHRyYW5zcG9ydCBhcyBzZW5kZXIgdHJhbnNwb3J0Ci0gICAgICAgICAgICAgICAgaWYgKG1zZ0N0eHQuZ2V0VHJhbnNwb3J0T3V0KCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lclRyYW5zcG9ydFByb3RvY29sID0gbXNnQ3R4dC5nZXRUcmFuc3BvcnRPdXQoKS5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIFRyYW5zcG9ydEluRGVzY3JpcHRpb24gdHJhbnNwb3J0SW4gPSBudWxsOwotICAgICAgICBpZiAob3B0aW9ucy5pc1VzZVNlcGFyYXRlTGlzdGVuZXIoKSB8fCBtc2dDdHh0LmdldE9wdGlvbnMoKS5pc1VzZVNlcGFyYXRlTGlzdGVuZXIoKSkgewotICAgICAgICAgICAgaWYgKChsaXN0ZW5lclRyYW5zcG9ydFByb3RvY29sICE9IG51bGwpICYmICEiIi5lcXVhbHMobGlzdGVuZXJUcmFuc3BvcnRQcm90b2NvbCkpIHsKLSAgICAgICAgICAgICAgICB0cmFuc3BvcnRJbiA9IGFjLmdldFRyYW5zcG9ydEluKGxpc3RlbmVyVHJhbnNwb3J0UHJvdG9jb2wpOwotICAgICAgICAgICAgICAgIExpc3RlbmVyTWFuYWdlciBsaXN0ZW5lck1hbmFnZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgbXNnQ3R4dC5nZXRDb25maWd1cmF0aW9uQ29udGV4dCgpLmdldExpc3RlbmVyTWFuYWdlcigpOwotICAgICAgICAgICAgICAgIGlmICh0cmFuc3BvcnRJbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRPRE8gOiBVc2VyIHNob3VsZCBub3QgYmUgbWFuZGF0ZWQgdG8gZ2l2ZSBhbiBJTiB0cmFuc3BvcnQuIElmIGl0IGlzIG5vdCBnaXZlbiwgd2Ugc2hvdWxkCi0gICAgICAgICAgICAgICAgICAgIC8vIGFzayBmcm9tIHRoZSBMaXN0ZW5lck1hbmFnZXIgdG8gZ2l2ZSBhbnkgYXZhaWxhYmxlIHRyYW5zcG9ydCBmb3IgdGhpcyBjbGllbnQuCi0gICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcihNZXNzYWdlcy5nZXRNZXNzYWdlKCJ1bmtub3duVHJhbnNwb3J0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyVHJhbnNwb3J0UHJvdG9jb2wpKTsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdChNZXNzYWdlcy5nZXRNZXNzYWdlKCJ1bmtub3duVHJhbnNwb3J0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyVHJhbnNwb3J0UHJvdG9jb2wpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCFsaXN0ZW5lck1hbmFnZXIuaXNMaXN0ZW5lclJ1bm5pbmcodHJhbnNwb3J0SW4uZ2V0TmFtZSgpKSkgewotICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lck1hbmFnZXIuYWRkTGlzdGVuZXIodHJhbnNwb3J0SW4sIGZhbHNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobXNnQ3R4dC5nZXRBeGlzU2VydmljZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoIW1zZ0N0eHQuaXNFbmdhZ2VkKENvbnN0YW50cy5NT0RVTEVfQUREUkVTU0lORykpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKE1lc3NhZ2VzLmdldE1lc3NhZ2UoIjJjaGFubmVsTmVlZEFkZHJlc3NpbmciKSk7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoTWVzc2FnZXMuZ2V0TWVzc2FnZSgiMmNoYW5uZWxOZWVkQWRkcmVzc2luZyIpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmICghYWMuaXNFbmdhZ2VkKENvbnN0YW50cy5NT0RVTEVfQUREUkVTU0lORykpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKE1lc3NhZ2VzLmdldE1lc3NhZ2UoIjJjaGFubmVsTmVlZEFkZHJlc3NpbmciKSk7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoTWVzc2FnZXMuZ2V0TWVzc2FnZSgiMmNoYW5uZWxOZWVkQWRkcmVzc2luZyIpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdHJhbnNwb3J0SW47Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL0Rlc2NyaXB0aW9uQ29uc3RhbnRzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vRGVzY3JpcHRpb25Db25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJiOGVhMy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vRGVzY3JpcHRpb25Db25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbjsKLQotcHVibGljIGludGVyZmFjZSBEZXNjcmlwdGlvbkNvbnN0YW50cyB7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBFWEVDVVRJT05fQ0hBSU5fS0VZCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhFQ1VUSU9OX0NIQUlOX0tFWSA9ICJFWEVDVVRJT05fQ0hBSU5fS0VZIjsKLQotICAgIC8qKgotICAgICAqIEZpZWxkIEVYRUNVVElPTl9PVVRfQ0hBSU5fS0VZCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhFQ1VUSU9OX09VVF9DSEFJTl9LRVkgPSAiRVhFQ1VUSU9OX09VVF9DSEFJTl9LRVkiOwotCi0gICAgLyoqCi0gICAgICogRmllbGQgRVhFQ1VUSU9OX0ZBVUxUX0NIQUlOX0tFWQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYRUNVVElPTl9GQVVMVF9DSEFJTl9LRVkgPSAiRVhFQ1VUSU9OX0ZBVUxUX0NIQUlOX0tFWSI7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBNT0RVTEVSRUZfS0VZCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9EVUxFUkVGX0tFWSA9ICJNT0RVTEVSRUZfS0VZIjsKLQotICAgIC8qKgotICAgICAqIEZpZWxkIE9QRVJBVElPTl9LRVkKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUEVSQVRJT05fS0VZID0gIk9QRVJBVElPTl9LRVkiOwotCi0gICAgLyoqCi0gICAgICogRmllbGQgTUVTU0FHRV9SRUNFSVZFUl9LRVkKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVNTQUdFX1JFQ0VJVkVSX0tFWSA9ICJQUk9WSURFUl9LRVkiOwotCi0gICAgLyoqCi0gICAgICogRmllbGQgQ09OVEVYVFBBVEhfS0VZCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVYVFBBVEhfS0VZID0gIkNPTlRFWFRQQVRIX0tFWSI7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBDTEFTU0xPQURFUl9LRVkKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU0xPQURFUl9LRVkgPSAiQ0xBU1NMT0FERVJfS0VZIjsKLQotICAgIC8qKgotICAgICAqIEZpZWxkIFNUWUxFX0tFWQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUWUxFX0tFWSA9ICJTVFlMRV9LRVkiOwotCi0gICAgLyoqCi0gICAgICogRmllbGQgU0VSVklDRV9DTEFTU19OQU1FCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVklDRV9DTEFTU19OQU1FID0gIlNFUlZJQ0VfQ0xBU1NfTkFNRSI7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBQSEFTRVNfS0VZCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEhBU0VTX0tFWSA9ICJQSEFTRVNfS0VZIjsKLQotICAgIC8qKgotICAgICAqIEZpZWxkIFBBUkFNRVRFUl9LRVkKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTUVURVJfS0VZID0gIlBBUkFNRVRFUl9LRVkiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9VVF9GQVVMVEZMT1dfS0VZID0gIk9VVF9GQVVMVEZMT1dfS0VZIjsKLQotICAgIC8qKgotICAgICAqIEZpZWxkIE9VVEZMT1dfS0VZCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1VURkxPV19LRVkgPSAiT1VURkxPV19LRVkiOwotCi0gICAgLyoqCi0gICAgICogRmllbGQgSU5fRkFVTFRGTE9XX0tFWQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOX0ZBVUxURkxPV19LRVkgPSAiSU5fRkFVTFRGTE9XX0tFWSI7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBJTkZMT1dfS0VZCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5GTE9XX0tFWSA9ICJJTkZMT1dfS0VZIjsKLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9GbG93LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vRmxvdy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Mzk0OTQ5Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9GbG93LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogQ2xhc3MgRmxvd0ltcGwKLSAqLwotcHVibGljIGNsYXNzIEZsb3cgewotCi0gICAgLyoqCi0gICAgICogRmllbGQgbGlzdAotICAgICAqLwotICAgIHByb3RlY3RlZCBmaW5hbCBMaXN0PEhhbmRsZXJEZXNjcmlwdGlvbj4gbGlzdDsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIEZsb3dJbXBsCi0gICAgICovCi0gICAgcHVibGljIEZsb3coKSB7Ci0gICAgICAgIGxpc3QgPSBuZXcgQXJyYXlMaXN0PEhhbmRsZXJEZXNjcmlwdGlvbj4oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgYWRkSGFuZGxlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBoYW5kbGVyCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkSGFuZGxlcihIYW5kbGVyRGVzY3JpcHRpb24gaGFuZGxlcikgewotICAgICAgICBsaXN0LmFkZChoYW5kbGVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgZ2V0SGFuZGxlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpbmRleAotICAgICAqIEByZXR1cm4gUmV0dXJucyBIYW5kbGVyRGVzY3JpcHRpb24uCi0gICAgICovCi0gICAgcHVibGljIEhhbmRsZXJEZXNjcmlwdGlvbiBnZXRIYW5kbGVyKGludCBpbmRleCkgewotICAgICAgICByZXR1cm4gKEhhbmRsZXJEZXNjcmlwdGlvbikgbGlzdC5nZXQoaW5kZXgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ldGhvZCBnZXRIYW5kbGVyQ291bnQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgaW50LgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0SGFuZGxlckNvdW50KCkgewotICAgICAgICByZXR1cm4gbGlzdC5zaXplKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL0Zsb3dJbmNsdWRlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vRmxvd0luY2x1ZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTcyYmNlZi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vRmxvd0luY2x1ZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbjsKLQotLyoqCi0gKiBDbGFzcyBGbG93SW5jbHVkZUltcGwKLSAqLwotcHVibGljIGNsYXNzIEZsb3dJbmNsdWRlIHsKLQotICAgIC8qKgotICAgICAqIEZpZWxkIGZhdWx0Ci0gICAgICovCi0gICAgcHJpdmF0ZSBGbG93IEluX2ZhdWx0OwotICAgIHByaXZhdGUgRmxvdyBPdXRfZmF1bHQ7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBpbgotICAgICAqLwotICAgIHByaXZhdGUgRmxvdyBpbjsKLQotICAgIC8qKgotICAgICAqIEZpZWxkIG91dAotICAgICAqLwotICAgIHByaXZhdGUgRmxvdyBvdXQ7Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgZ2V0RmF1bHRJbkZsb3cuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgRmxvdy4KLSAgICAgKi8KLSAgICBwdWJsaWMgRmxvdyBnZXRGYXVsdEluRmxvdygpIHsKLSAgICAgICAgcmV0dXJuIEluX2ZhdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyBGbG93IGdldEZhdWx0T3V0RmxvdygpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuT3V0X2ZhdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ldGhvZCBnZXRJbkZsb3cuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgRmxvdy4KLSAgICAgKi8KLSAgICBwdWJsaWMgRmxvdyBnZXRJbkZsb3coKSB7Ci0gICAgICAgIHJldHVybiBpbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgZ2V0T3V0Rmxvdy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gUmV0dXJucyBGbG93LgotICAgICAqLwotICAgIHB1YmxpYyBGbG93IGdldE91dEZsb3coKSB7Ci0gICAgICAgIHJldHVybiBvdXQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWV0aG9kIHNldEZhdWx0SW5GbG93LgotICAgICAqCi0gICAgICogQHBhcmFtIGZsb3cKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRGYXVsdEluRmxvdyhGbG93IGZsb3cpIHsKLSAgICAgICAgdGhpcy5Jbl9mYXVsdCA9IGZsb3c7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RmF1bHRPdXRGbG93KEZsb3cgZmF1bHRGbG93KSB7Ci0gICAgICAgIHRoaXMuT3V0X2ZhdWx0ID0gZmF1bHRGbG93OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ldGhvZCBzZXRJbkZsb3cuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZmxvdwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEluRmxvdyhGbG93IGZsb3cpIHsKLSAgICAgICAgdGhpcy5pbiA9IGZsb3c7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWV0aG9kIHNldE91dEZsb3cuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZmxvdwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE91dEZsb3coRmxvdyBmbG93KSB7Ci0gICAgICAgIHRoaXMub3V0ID0gZmxvdzsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vSGFuZGxlckRlc2NyaXB0aW9uLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vSGFuZGxlckRlc2NyaXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzZWQ0MmIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL0hhbmRsZXJEZXNjcmlwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuSGFuZGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmkxOG4uTWVzc2FnZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi0vKioKLSAqIFJlcHJlc2VudHMgdGhlIGRlcGxveW1lbnQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGhhbmRsZXIKLSAqLwotcHVibGljIGNsYXNzIEhhbmRsZXJEZXNjcmlwdGlvbiBpbXBsZW1lbnRzIFBhcmFtZXRlckluY2x1ZGUgewotCi0gICAgLyoqCi0gICAgICogRmllbGQgY2xhc3NOYW1lCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgY2xhc3NOYW1lOwotCi0gICAgcHJpdmF0ZSBIYW5kbGVyIGhhbmRsZXI7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLSAgICBwcml2YXRlIGZpbmFsIFBhcmFtZXRlckluY2x1ZGUgcGFyYW1ldGVySW5jbHVkZTsKLSAgICBwcml2YXRlIFBhcmFtZXRlckluY2x1ZGUgcGFyZW50OwotICAgIHByaXZhdGUgUGhhc2VSdWxlIHJ1bGVzOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgSGFuZGxlckRlc2NyaXB0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBIYW5kbGVyRGVzY3JpcHRpb24oKSB7Ci0gICAgICAgIHRoaXMucGFyYW1ldGVySW5jbHVkZSA9IG5ldyBQYXJhbWV0ZXJJbmNsdWRlSW1wbCgpOwotICAgICAgICB0aGlzLnJ1bGVzID0gbmV3IFBoYXNlUnVsZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIEhhbmRsZXJEZXNjcmlwdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIG5hbWUgb2YgaGFuZGxlcgotICAgICAqLwotICAgIHB1YmxpYyBIYW5kbGVyRGVzY3JpcHRpb24oU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgdGhpcygpOwotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZCBhIFBhcmFtZXRlcgotICAgICAqCi0gICAgICogQHBhcmFtIHBhcmFtIHRoZSBQYXJhbWV0ZXIgdG8gYXNzb2NpYXRlIHdpdGggdGhpcyBIYW5kbGVyRGVzY3JpcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRQYXJhbWV0ZXIoUGFyYW1ldGVyIHBhcmFtKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgaWYgKGlzUGFyYW1ldGVyTG9ja2VkKHBhcmFtLmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoTWVzc2FnZXMuZ2V0TWVzc2FnZSgicGFyYW10ZXJsb2NrZWRieXBhcmVudCIsIHBhcmFtLmdldE5hbWUoKSkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcGFyYW1ldGVySW5jbHVkZS5hZGRQYXJhbWV0ZXIocGFyYW0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlUGFyYW1ldGVyKFBhcmFtZXRlciBwYXJhbSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIGlmIChpc1BhcmFtZXRlckxvY2tlZChwYXJhbS5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KE1lc3NhZ2VzLmdldE1lc3NhZ2UoInBhcmFtdGVybG9ja2VkYnlwYXJlbnQiLCBwYXJhbS5nZXROYW1lKCkpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHBhcmFtZXRlckluY2x1ZGUucmVtb3ZlUGFyYW1ldGVyKHBhcmFtKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRlc2VyaWFsaXplUGFyYW1ldGVycyhPTUVsZW1lbnQgcGFyYW1ldGVyRWxlbWVudCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIHRoaXMucGFyYW1ldGVySW5jbHVkZS5kZXNlcmlhbGl6ZVBhcmFtZXRlcnMocGFyYW1ldGVyRWxlbWVudCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWV0aG9kIGdldENsYXNzTmFtZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gUmV0dXJucyBTdHJpbmcuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0gICAgICAgIHJldHVybiBjbGFzc05hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBSZXR1cm5zIEhhbmRsZXIuCi0gICAgICovCi0gICAgcHVibGljIEhhbmRsZXIgZ2V0SGFuZGxlcigpIHsKLSAgICAgICAgcmV0dXJuIGhhbmRsZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBSZXR1cm5zIFFOYW1lLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGEgbmFtZWQgUGFyYW1ldGVyCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSBuYW1lIG9mIFBhcmFtZXRlciB0byBzZWFyY2gKLSAgICAgKiBAcmV0dXJuIGEgUGFyYW1ldGVyLCB3aGljaCBtYXkgY29tZSBmcm9tIHVzIG9yIGZyb20gc29tZSBwYXJlbnQgdXAgdGhlIHRyZWUsIG9yIG51bGwuCi0gICAgICovCi0gICAgcHVibGljIFBhcmFtZXRlciBnZXRQYXJhbWV0ZXIoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgUGFyYW1ldGVyIHBhcmFtZXRlciA9IHBhcmFtZXRlckluY2x1ZGUuZ2V0UGFyYW1ldGVyKG5hbWUpOwotICAgICAgICBpZiAocGFyYW1ldGVyID09IG51bGwgJiYgcGFyZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBwYXJlbnQuZ2V0UGFyYW1ldGVyKG5hbWUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIHBhcmFtZXRlcjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBBcnJheUxpc3Q8UGFyYW1ldGVyPiBnZXRQYXJhbWV0ZXJzKCkgewotICAgICAgICByZXR1cm4gcGFyYW1ldGVySW5jbHVkZS5nZXRQYXJhbWV0ZXJzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFBhcmFtZXRlckluY2x1ZGUgZ2V0UGFyZW50KCkgewotICAgICAgICByZXR1cm4gcGFyZW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ldGhvZCBnZXRSdWxlcy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gUmV0dXJucyBQaGFzZVJ1bGUuCi0gICAgICovCi0gICAgcHVibGljIFBoYXNlUnVsZSBnZXRSdWxlcygpIHsKLSAgICAgICAgcmV0dXJuIHJ1bGVzOwotICAgIH0KLQotICAgIC8vIHRvIGNoZWNrIHdoZXRoZXIgdGhlIHBhcmFtZXRlciBpcyBsb2NrZWQgYXQgYW55IGxldmVsCi0gICAgcHVibGljIGJvb2xlYW4gaXNQYXJhbWV0ZXJMb2NrZWQoU3RyaW5nIHBhcmFtZXRlck5hbWUpIHsKLSAgICAgICAgaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAocGFyZW50LmlzUGFyYW1ldGVyTG9ja2VkKHBhcmFtZXRlck5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcGFyYW1ldGVySW5jbHVkZS5pc1BhcmFtZXRlckxvY2tlZChwYXJhbWV0ZXJOYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2Qgc2V0Q2xhc3NOYW1lLgotICAgICAqCi0gICAgICogQHBhcmFtIGNsYXNzTmFtZSB0aGUgY2xhc3MgbmFtZSBvZiB0aGUgSGFuZGxlciBjbGFzcwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENsYXNzTmFtZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0gICAgICAgIHRoaXMuY2xhc3NOYW1lID0gY2xhc3NOYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEV4cGxpY2l0bHkgc2V0IHRoZSBIYW5kbGVyIG9iamVjdAotICAgICAqCi0gICAgICogQHBhcmFtIGhhbmRsZXIgYSBIYW5kbGVyIGluc3RhbmNlLCB3aGljaCB3aWxsIGJlIGRlcGxveWVkIHdoZXJldmVyIHRoaXMgSGFuZGxlckRlc2NyaXB0aW9uIGlzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SGFuZGxlcihIYW5kbGVyIGhhbmRsZXIpIHsKLSAgICAgICAgdGhpcy5oYW5kbGVyID0gaGFuZGxlcjsKLSAgICAgICAgdGhpcy5jbGFzc05hbWUgPSBoYW5kbGVyLmdldENsYXNzKCkuZ2V0TmFtZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgbmFtZQotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIGRlc2lyZWQgbmFtZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJlbnQoUGFyYW1ldGVySW5jbHVkZSBwYXJlbnQpIHsKLSAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBkZXBsb3ltZW50IHJ1bGVzIGZvciB0aGlzIEhhbmRsZXJEZXNjcmlwdGlvbgotICAgICAqCi0gICAgICogQHBhcmFtIHJ1bGVzIGEgUGhhc2VSdWxlIG9iamVjdAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFJ1bGVzKFBoYXNlUnVsZSBydWxlcykgewotICAgICAgICB0aGlzLnJ1bGVzID0gcnVsZXM7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL0luT25seUF4aXNPcGVyYXRpb24uamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9Jbk9ubHlBeGlzT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2MWI5NTIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL0luT25seUF4aXNPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLnV0aWwuVVVJREdlbmVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5PcGVyYXRpb25DbGllbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuT3B0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk9wZXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LlNlcnZpY2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaTE4bi5NZXNzYWdlczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuV1NETENvbnN0YW50czsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotcHVibGljIGNsYXNzIEluT25seUF4aXNPcGVyYXRpb24gZXh0ZW5kcyBBeGlzT3BlcmF0aW9uIHsKLQotICAgIHByaXZhdGUgQXhpc01lc3NhZ2UgaW5GYXVsdE1lc3NhZ2U7Ci0vLyAgICBwcml2YXRlIEF4aXNNZXNzYWdlIGluTWVzc2FnZTsKLSAgICBwcml2YXRlIEF4aXNNZXNzYWdlIG91dEZhdWx0TWVzc2FnZTsKLQotICAgIC8vIHRoaXMgaXMganVzdCB0byBzdG9yZSB0aGUgY2hhaW4gLCB3ZSBkb24ndCB1c2UgaXQKLSAgICBwcml2YXRlIEFycmF5TGlzdCBvdXRQaGFzZTsKLQotICAgIHB1YmxpYyBJbk9ubHlBeGlzT3BlcmF0aW9uKCkgewotICAgICAgICBzdXBlcigpOwotICAgICAgICAvL3NldHVwIGEgdGVtcG9yYXJ5IG5hbWUKLSAgICAgICAgUU5hbWUgdG1wTmFtZSA9IG5ldyBRTmFtZSh0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIl8iICsgVVVJREdlbmVyYXRvci5nZXRVVUlEKCkpOwotICAgICAgICB0aGlzLnNldE5hbWUodG1wTmFtZSk7Ci0gICAgICAgIGNyZWF0ZU1lc3NhZ2UoKTsKLSAgICAgICAgc2V0TWVzc2FnZUV4Y2hhbmdlUGF0dGVybihXU0RMMkNvbnN0YW50cy5NRVBfVVJJX0lOX09OTFkpOwotICAgIH0KLQotICAgIHB1YmxpYyBJbk9ubHlBeGlzT3BlcmF0aW9uKFFOYW1lIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgICAgIGNyZWF0ZU1lc3NhZ2UoKTsKLSAgICAgICAgc2V0TWVzc2FnZUV4Y2hhbmdlUGF0dGVybihXU0RMMkNvbnN0YW50cy5NRVBfVVJJX0lOX09OTFkpOwotICAgIH0KLQotICAgIHB1YmxpYyBPcGVyYXRpb25DbGllbnQgY3JlYXRlQ2xpZW50KFNlcnZpY2VDb250ZXh0IHNjLCBPcHRpb25zIG9wdGlvbnMpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoIm1lcG5vdHlldGltcGxlbWVudGVkIiwgbWVwVVJJKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkTWVzc2FnZShBeGlzTWVzc2FnZSBtZXNzYWdlLCBTdHJpbmcgbGFiZWwpIHsKLSAgICAgICAgaWYgKFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9JTl9WQUxVRS5lcXVhbHMobGFiZWwpKSB7Ci0vLyAgICAgICAgICAgIGluTWVzc2FnZSA9IG1lc3NhZ2U7Ci0gICAgICAgICAgICBhZGRDaGlsZCgiaW5NZXNzYWdlIiwgbWVzc2FnZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCB5ZXQgaW1wbGVtZW50ZWQiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZE1lc3NhZ2VDb250ZXh0KE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQsIE9wZXJhdGlvbkNvbnRleHQgb3BDb250ZXh0KQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIGlmICghb3BDb250ZXh0LmlzQ29tcGxldGUoKSkgewotICAgICAgICAgICAgb3BDb250ZXh0LmdldE1lc3NhZ2VDb250ZXh0cygpLnB1dChNRVNTQUdFX0xBQkVMX0lOX1ZBTFVFLCBtc2dDb250ZXh0KTsKLSAgICAgICAgICAgIG9wQ29udGV4dC5zZXRDb21wbGV0ZSh0cnVlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoTWVzc2FnZXMuZ2V0TWVzc2FnZSgibWVwY29tcGxldGVkIikpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkRmF1bHRNZXNzYWdlQ29udGV4dChNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0LCBPcGVyYXRpb25Db250ZXh0IG9wQ29udGV4dCkKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBIYXNoTWFwPFN0cmluZywgTWVzc2FnZUNvbnRleHQ+IG1lcCA9IG9wQ29udGV4dC5nZXRNZXNzYWdlQ29udGV4dHMoKTsKLSAgICAgICAgTWVzc2FnZUNvbnRleHQgZmF1bHRNZXNzYWdlQ3R4dCA9IChNZXNzYWdlQ29udGV4dCkgbWVwLmdldChNRVNTQUdFX0xBQkVMX0ZBVUxUX1ZBTFVFKTsKLSAgICAgICAgaWYgKGZhdWx0TWVzc2FnZUN0eHQgIT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdChNZXNzYWdlcy5nZXRNZXNzYWdlKCJtZXBjb21wbGV0ZWQiKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtZXAucHV0KE1FU1NBR0VfTEFCRUxfRkFVTFRfVkFMVUUsIG1zZ0NvbnRleHQpOwotICAgICAgICAgICAgb3BDb250ZXh0LnNldENvbXBsZXRlKHRydWUpOwotICAgICAgICAgICAgb3BDb250ZXh0LmNsZWFudXAoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVNZXNzYWdlKCkgewotICAgICAgICBBeGlzTWVzc2FnZSBpbk1lc3NhZ2UgPSBuZXcgQXhpc01lc3NhZ2UoKTsKLSAgICAgICAgaW5NZXNzYWdlLnNldERpcmVjdGlvbihXU0RMQ29uc3RhbnRzLldTRExfTUVTU0FHRV9ESVJFQ1RJT05fSU4pOwotICAgICAgICBpbk1lc3NhZ2Uuc2V0UGFyZW50KHRoaXMpOwotCi0gICAgICAgIGluRmF1bHRNZXNzYWdlID0gbmV3IEF4aXNNZXNzYWdlKCk7Ci0gICAgICAgIGluRmF1bHRNZXNzYWdlLnNldFBhcmVudCh0aGlzKTsKLQotICAgICAgICBvdXRGYXVsdE1lc3NhZ2UgPSBuZXcgQXhpc01lc3NhZ2UoKTsKLSAgICAgICAgb3V0RmF1bHRNZXNzYWdlLnNldFBhcmVudCh0aGlzKTsKLQotICAgICAgICBvdXRQaGFzZSA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgICAgICBhZGRDaGlsZCgiaW5NZXNzYWdlIiwgaW5NZXNzYWdlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXhpc01lc3NhZ2UgZ2V0TWVzc2FnZShTdHJpbmcgbGFiZWwpIHsKLSAgICAgICAgaWYgKFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9JTl9WQUxVRS5lcXVhbHMobGFiZWwpKSB7Ci0gICAgICAgICAgICByZXR1cm4gKEF4aXNNZXNzYWdlKSBnZXRDaGlsZCgiaW5NZXNzYWdlIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiaW52YWxpZGFjZXNzIikpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIEFycmF5TGlzdCBnZXRQaGFzZXNJbkZhdWx0RmxvdygpIHsKLSAgICAgICAgcmV0dXJuIGluRmF1bHRNZXNzYWdlLmdldE1lc3NhZ2VGbG93KCk7Ci0gICAgfQotCi0gICAgcHVibGljIEFycmF5TGlzdCBnZXRQaGFzZXNPdXRGYXVsdEZsb3coKSB7Ci0gICAgICAgIHJldHVybiBvdXRGYXVsdE1lc3NhZ2UuZ2V0TWVzc2FnZUZsb3coKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXJyYXlMaXN0IGdldFBoYXNlc091dEZsb3coKSB7Ci0gICAgICAgIHJldHVybiBvdXRQaGFzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXJyYXlMaXN0IGdldFJlbWFpbmluZ1BoYXNlc0luRmxvdygpIHsKLSAgICAgICAgcmV0dXJuICgoQXhpc01lc3NhZ2UpIGdldENoaWxkKCJpbk1lc3NhZ2UiKSkuZ2V0TWVzc2FnZUZsb3coKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQaGFzZXNJbkZhdWx0RmxvdyhBcnJheUxpc3QgbGlzdCkgewotICAgICAgICBpbkZhdWx0TWVzc2FnZS5zZXRNZXNzYWdlRmxvdyhsaXN0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQaGFzZXNPdXRGYXVsdEZsb3coQXJyYXlMaXN0IGxpc3QpIHsKLSAgICAgICAgb3V0RmF1bHRNZXNzYWdlLnNldE1lc3NhZ2VGbG93KGxpc3QpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBoYXNlc091dEZsb3coQXJyYXlMaXN0IGxpc3QpIHsKLSAgICAgICAgb3V0UGhhc2UgPSBsaXN0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFJlbWFpbmluZ1BoYXNlc0luRmxvdyhBcnJheUxpc3QgbGlzdCkgewotICAgICAgICAoKEF4aXNNZXNzYWdlKSBnZXRDaGlsZCgiaW5NZXNzYWdlIikpLnNldE1lc3NhZ2VGbG93KGxpc3QpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9Jbk91dEF4aXNPcGVyYXRpb24uamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9Jbk91dEF4aXNPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk5OGYyYy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vSW5PdXRBeGlzT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLnV0aWwuVVVJREdlbmVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5PcGVyYXRpb25DbGllbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuT3B0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk9wZXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LlNlcnZpY2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaTE4bi5NZXNzYWdlczsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLXB1YmxpYyBjbGFzcyBJbk91dEF4aXNPcGVyYXRpb24gZXh0ZW5kcyBUd29DaGFubmVsQXhpc09wZXJhdGlvbiB7Ci0KLSAgICBwdWJsaWMgSW5PdXRBeGlzT3BlcmF0aW9uKCkgewotICAgICAgICBzdXBlcigpOwotICAgICAgICAvL3NldHVwIGEgdGVtcG9yYXJ5IG5hbWUKLSAgICAgICAgUU5hbWUgdG1wTmFtZSA9IG5ldyBRTmFtZSh0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIl8iICsgVVVJREdlbmVyYXRvci5nZXRVVUlEKCkpOwotICAgICAgICB0aGlzLnNldE5hbWUodG1wTmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIEluT3V0QXhpc09wZXJhdGlvbihRTmFtZSBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBPcGVyYXRpb25DbGllbnQgY3JlYXRlQ2xpZW50KFNlcnZpY2VDb250ZXh0IHNjLCBPcHRpb25zIG9wdGlvbnMpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoIm1lcG5vdHlldGltcGxlbWVudGVkIiwgbWVwVVJJKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkTWVzc2FnZUNvbnRleHQoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCwgT3BlcmF0aW9uQ29udGV4dCBvcENvbnRleHQpCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgSGFzaE1hcCBtZXAgPSBvcENvbnRleHQuZ2V0TWVzc2FnZUNvbnRleHRzKCk7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IGluTXNnQ29udGV4dCA9IChNZXNzYWdlQ29udGV4dCkgbWVwLmdldChNRVNTQUdFX0xBQkVMX0lOX1ZBTFVFKTsKLSAgICAgICAgTWVzc2FnZUNvbnRleHQgb3V0bXNnQ29udGV4dCA9IChNZXNzYWdlQ29udGV4dCkgbWVwLmdldChNRVNTQUdFX0xBQkVMX09VVF9WQUxVRSk7Ci0KLSAgICAgICAgaWYgKChpbk1zZ0NvbnRleHQgIT0gbnVsbCkgJiYgKG91dG1zZ0NvbnRleHQgIT0gbnVsbCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoTWVzc2FnZXMuZ2V0TWVzc2FnZSgibWVwY29tcGxldGVkIikpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGluTXNnQ29udGV4dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtZXAucHV0KE1FU1NBR0VfTEFCRUxfSU5fVkFMVUUsIG1zZ0NvbnRleHQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbWVwLnB1dChNRVNTQUdFX0xBQkVMX09VVF9WQUxVRSwgbXNnQ29udGV4dCk7Ci0gICAgICAgICAgICBvcENvbnRleHQuc2V0Q29tcGxldGUodHJ1ZSk7Ci0gICAgICAgICAgICBvcENvbnRleHQuY2xlYW51cCgpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL01lc3NhZ2VDb250ZXh0TGlzdGVuZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9NZXNzYWdlQ29udGV4dExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNWQyMWIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL01lc3NhZ2VDb250ZXh0TGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LlNlcnZpY2VDb250ZXh0Ow0KLQ0KLS8qKg0KLSAqIEEgTWVzc2FnZUNvbnRleHRMaXN0ZW5lciBpcyByZWdpc3RlcmVkIG9uIHRoZSBBeGlzU2VydmljZS4NCi0gKiBXaGVuIGEgU2VydmljZUNvbnRleHQgaXMgYXR0YWNoZWQgdG8gdGhlIE1lc3NhZ2VDb250ZXh0LCANCi0gKiB0aGUgYXR0YWNoU2VydmljZUNvbnRleHRFdmVudCBpcyB0cmlnZ2VyZWQuDQotICogV2hlbiBhbiBFbnZlbG9wZSBpcyBhdHRhY2hlZCB0byB0aGUgTWVzc2FnZUNvbnRleHQsIA0KLSAqIHRoZSBhdHRhY2hFbnZlbG9wZUV2ZW50IGlzIHRyaWdnZXJlZC4NCi0gKiANCi0gKiBUaGVzZSB0d28gZXZlbnRzIG9jY3VyIGF0IGNyaXRpY2FsIHBvaW50cyBpbiB0aGUgbWVzc2FnZSBzZW5kaW5nDQotICogb3IgcmVjZWl2aW5nLiAgQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIE1lc3NhZ2VDb250ZXh0TGlzdGVuZXINCi0gKiBtYXkgbG9nIGluZm9ybWF0aW9uLCBzZXQgc3BlY2lhbCBwcm9wZXJ0aWVzIG9yIHRyaWdnZXIgZXZlbnRzLg0KLSAqIA0KLSAqIEZvciBleGFtcGxlIHRoZSBKQVhXUyBtb2R1bGUgdXNlcyBhIE1lc3NhZ2VDb250ZXh0TGlzdGVuZXIgdG8gDQotICogcmVnaXN0ZXIgYSBKQVhCQ3VzdG9tQnVpbGRlciBvbiB0aGUgZW52ZWxvcGUncyBTdEFYT01CdWlsZGVyLg0KLSAqLw0KLXB1YmxpYyBpbnRlcmZhY2UgTWVzc2FnZUNvbnRleHRMaXN0ZW5lciB7DQotDQotICAgIHB1YmxpYyB2b2lkIGF0dGFjaFNlcnZpY2VDb250ZXh0RXZlbnQoU2VydmljZUNvbnRleHQgc2MsIE1lc3NhZ2VDb250ZXh0IG1jKTsNCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIGF0dGFjaEVudmVsb3BlRXZlbnQoTWVzc2FnZUNvbnRleHQgbWMpOw0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vTW9kdWxlQ29uZmlndXJhdGlvbi5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL01vZHVsZUNvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNmNzlhMy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vTW9kdWxlQ29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmkxOG4uTWVzc2FnZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi0vKioKLSAqIFRoaXMgaXMgdG8gc3RvcmUgZGVwbG95bWVudCB0aW1lIGRhdGEgLCBkZXNjcmliZWQgYnkKLSAqIDxtb2R1bGVDb25maWcgbW9kdWxlPSJtb2R1bGVuYW1lIj4KLSAqIDxwYXJhbWV0ZXI+IC4uLi48L3BhcmFtZXRlcj4KLSAqIDwvbW9kdWxlQ29uZmlnPgotICogPHAvPgotICogUmlnaHQgbm93IHRoaXMganVzdCBrZWVwcyBzdG9yZXMgdGhlIHNldCBvZiBwYXJhbWV0ZXJzCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2R1bGVDb25maWd1cmF0aW9uIGltcGxlbWVudHMgUGFyYW1ldGVySW5jbHVkZSB7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbW9kdWxlTmFtZTsKLSAgICBwcml2YXRlIFBhcmFtZXRlckluY2x1ZGUgcGFyYW1ldGVySW5jbHVkZTsKLQotICAgIC8vIHRvIGtlZXAgdGhlIHBvaW50ZXIgdG8gaXRzIHBhcmVudCAsIG9ubHkgdG8gYWNjZXNzIHBhcmFtZXRlcnMKLSAgICBwcml2YXRlIFBhcmFtZXRlckluY2x1ZGUgcGFyZW50OwotCi0gICAgcHVibGljIE1vZHVsZUNvbmZpZ3VyYXRpb24oU3RyaW5nIG1vZHVsZU5hbWUsIFBhcmFtZXRlckluY2x1ZGUgcGFyZW50KSB7Ci0gICAgICAgIHRoaXMubW9kdWxlTmFtZSA9IG1vZHVsZU5hbWU7Ci0gICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50OwotICAgICAgICBwYXJhbWV0ZXJJbmNsdWRlID0gbmV3IFBhcmFtZXRlckluY2x1ZGVJbXBsKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkUGFyYW1ldGVyKFBhcmFtZXRlciBwYXJhbSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIGlmIChpc1BhcmFtZXRlckxvY2tlZChwYXJhbS5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KE1lc3NhZ2VzLmdldE1lc3NhZ2UoInBhcmFtdGVybG9ja2VkYnlwYXJlbnQiLCBwYXJhbS5nZXROYW1lKCkpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHBhcmFtZXRlckluY2x1ZGUuYWRkUGFyYW1ldGVyKHBhcmFtKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVBhcmFtZXRlcihQYXJhbWV0ZXIgcGFyYW0pIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBpZiAoaXNQYXJhbWV0ZXJMb2NrZWQocGFyYW0uZ2V0TmFtZSgpKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdChNZXNzYWdlcy5nZXRNZXNzYWdlKCJwYXJhbXRlcmxvY2tlZGJ5cGFyZW50IiwgcGFyYW0uZ2V0TmFtZSgpKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwYXJhbWV0ZXJJbmNsdWRlLnJlbW92ZVBhcmFtZXRlcihwYXJhbSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkZXNlcmlhbGl6ZVBhcmFtZXRlcnMoT01FbGVtZW50IHBhcmFtZXRlckVsZW1lbnQpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICB0aGlzLnBhcmFtZXRlckluY2x1ZGUuZGVzZXJpYWxpemVQYXJhbWV0ZXJzKHBhcmFtZXRlckVsZW1lbnQpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TW9kdWxlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG1vZHVsZU5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFBhcmFtZXRlciBnZXRQYXJhbWV0ZXIoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgcmV0dXJuIHBhcmFtZXRlckluY2x1ZGUuZ2V0UGFyYW1ldGVyKG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBBcnJheUxpc3Q8UGFyYW1ldGVyPiBnZXRQYXJhbWV0ZXJzKCkgewotICAgICAgICByZXR1cm4gcGFyYW1ldGVySW5jbHVkZS5nZXRQYXJhbWV0ZXJzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNQYXJhbWV0ZXJMb2NrZWQoU3RyaW5nIHBhcmFtZXRlck5hbWUpIHsKLQotICAgICAgICAvLyBjaGVja2luZyB0aGUgbG9ja2VkIHZhbHVlIG9mIHBhcmVudAotICAgICAgICBib29sZWFuIGxvc2NrZWQgPSBmYWxzZTsKLQotICAgICAgICBpZiAocGFyZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGxvc2NrZWQgPSBwYXJlbnQuaXNQYXJhbWV0ZXJMb2NrZWQocGFyYW1ldGVyTmFtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobG9zY2tlZCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBQYXJhbWV0ZXIgcGFyYW1ldGVyID0gZ2V0UGFyYW1ldGVyKHBhcmFtZXRlck5hbWUpOwotCi0gICAgICAgICAgICByZXR1cm4gKHBhcmFtZXRlciAhPSBudWxsKSAmJiBwYXJhbWV0ZXIuaXNMb2NrZWQoKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9PdXRJbkF4aXNPcGVyYXRpb24uamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9PdXRJbkF4aXNPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTgxZmE2OC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vT3V0SW5BeGlzT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NjIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS51dGlsLlVVSURHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBCb2R5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkFkZHJlc3NpbmdDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50Lk9wZXJhdGlvbkNsaWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5PcHRpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50LmFzeW5jLkFzeW5jUmVzdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50LmFzeW5jLkF4aXNDYWxsYmFjazsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5hc3luYy5DYWxsYmFjazsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5PcGVyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5TZXJ2aWNlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzRW5naW5lOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaTE4bi5NZXNzYWdlczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5UcmFuc3BvcnRVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkhUVFBDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLkNhbGxiYWNrUmVjZWl2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLlV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgT3V0SW5BeGlzT3BlcmF0aW9uIGV4dGVuZHMgVHdvQ2hhbm5lbEF4aXNPcGVyYXRpb24gewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKE91dEluQXhpc09wZXJhdGlvbi5jbGFzcyk7Ci0KLSAgICBwdWJsaWMgT3V0SW5BeGlzT3BlcmF0aW9uKCkgewotICAgICAgICBzdXBlcigpOwotICAgICAgICAvL3NldHVwIGEgdGVtcG9yYXJ5IG5hbWUKLSAgICAgICAgUU5hbWUgdG1wTmFtZSA9IG5ldyBRTmFtZSh0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIl8iICsgVVVJREdlbmVyYXRvci5nZXRVVUlEKCkpOwotICAgICAgICB0aGlzLnNldE5hbWUodG1wTmFtZSk7Ci0gICAgICAgIHNldE1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4oV1NETDJDb25zdGFudHMuTUVQX1VSSV9PVVRfSU4pOwotICAgIH0KLQotICAgIHB1YmxpYyBPdXRJbkF4aXNPcGVyYXRpb24oUU5hbWUgbmFtZSkgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICAgICAgc2V0TWVzc2FnZUV4Y2hhbmdlUGF0dGVybihXU0RMMkNvbnN0YW50cy5NRVBfVVJJX09VVF9JTik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkTWVzc2FnZUNvbnRleHQoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYXRpb25Db250ZXh0IG9wQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIEhhc2hNYXA8U3RyaW5nLCBNZXNzYWdlQ29udGV4dD4gbWVwID0gb3BDb250ZXh0LmdldE1lc3NhZ2VDb250ZXh0cygpOwotICAgICAgICBNZXNzYWdlQ29udGV4dCBpbW1zZ0NvbnRleHQgPSAoTWVzc2FnZUNvbnRleHQpIG1lcAotICAgICAgICAgICAgICAgIC5nZXQoTUVTU0FHRV9MQUJFTF9JTl9WQUxVRSk7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG91dG1zZ0NvbnRleHQgPSAoTWVzc2FnZUNvbnRleHQpIG1lcAotICAgICAgICAgICAgICAgIC5nZXQoTUVTU0FHRV9MQUJFTF9PVVRfVkFMVUUpOwotCi0gICAgICAgIGlmICgoaW1tc2dDb250ZXh0ICE9IG51bGwpICYmIChvdXRtc2dDb250ZXh0ICE9IG51bGwpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KE1lc3NhZ2VzLmdldE1lc3NhZ2UoIm1lcGNvbXBsZXRlZCIpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChvdXRtc2dDb250ZXh0ID09IG51bGwpIHsKLSAgICAgICAgICAgIG1lcC5wdXQoTUVTU0FHRV9MQUJFTF9PVVRfVkFMVUUsIG1zZ0NvbnRleHQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbWVwLnB1dChNRVNTQUdFX0xBQkVMX0lOX1ZBTFVFLCBtc2dDb250ZXh0KTsKLSAgICAgICAgICAgIG9wQ29udGV4dC5zZXRDb21wbGV0ZSh0cnVlKTsKLSAgICAgICAgICAgIG9wQ29udGV4dC5jbGVhbnVwKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgTUVQIGNsaWVudCBmb3IgYW4gT3V0LUlOIG9wZXJhdGlvbi4gVGhpcyBjbGllbnQgY2FuIGJlIHVzZWQgdG8KLSAgICAgKiBpbnRlcmFjdCB3aXRoIGEgc2VydmVyIHdoaWNoIGlzIG9mZmVyaW5nIGFuIEluLU91dCBvcGVyYXRpb24uIFRvIHVzZSB0aGUKLSAgICAgKiBjbGllbnQsIHlvdSBtdXN0IGNhbGwgYWRkTWVzc2FnZUNvbnRleHQoKSB3aXRoIGEgbWVzc2FnZSBjb250ZXh0IGFuZCB0aGVuCi0gICAgICogY2FsbCBleGVjdXRlKCkgdG8gZXhlY3V0ZSB0aGUgY2xpZW50LgotICAgICAqCi0gICAgICogQHBhcmFtIHNjICAgICAgVGhlIHNlcnZpY2UgY29udGV4dCBmb3IgdGhpcyBjbGllbnQgdG8gbGl2ZSB3aXRoaW4uIENhbm5vdCBiZQotICAgICAqICAgICAgICAgICAgICAgIG51bGwuCi0gICAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyB0byB1c2UgYXMgZGVmYXVsdHMgZm9yIHRoaXMgY2xpZW50LiBJZiBhbnkgb3B0aW9ucyBhcmUKLSAgICAgKiAgICAgICAgICAgICAgICBzZXQgc3BlY2lmaWNhbGx5IG9uIHRoZSBjbGllbnQgdGhlbiB0aG9zZSBvdmVycmlkZSBvcHRpb25zCi0gICAgICogICAgICAgICAgICAgICAgaGVyZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgT3BlcmF0aW9uQ2xpZW50IGNyZWF0ZUNsaWVudChTZXJ2aWNlQ29udGV4dCBzYywgT3B0aW9ucyBvcHRpb25zKSB7Ci0gICAgICAgIHJldHVybiBuZXcgT3V0SW5BeGlzT3BlcmF0aW9uQ2xpZW50KHRoaXMsIHNjLCBvcHRpb25zKTsKLSAgICB9Ci19Ci0KLS8qKgotICogTUVQIGNsaWVudCBmb3IgbW9pLgotICovCi1jbGFzcyBPdXRJbkF4aXNPcGVyYXRpb25DbGllbnQgZXh0ZW5kcyBPcGVyYXRpb25DbGllbnQgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKE91dEluQXhpc09wZXJhdGlvbkNsaWVudC5jbGFzcyk7Ci0KLSAgICBPdXRJbkF4aXNPcGVyYXRpb25DbGllbnQoT3V0SW5BeGlzT3BlcmF0aW9uIGF4aXNPcCwgU2VydmljZUNvbnRleHQgc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbnMgb3B0aW9ucykgewotICAgICAgICBzdXBlcihheGlzT3AsIHNjLCBvcHRpb25zKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIG1lc3NhZ2UgY29udGV4dCB0byBvcGVyYXRpb24gY29udGV4dCwgc28gdGhhdCBpdCB3aWxsIGhhbmRsZSB0aGUKLSAgICAgKiBsb2dpYyBjb3JyZWN0bHkgaWYgdGhlIE9wZXJhdGlvbkNvbnRleHQgaXMgbnVsbCB0aGVuIG5ldyBvbmUgd2lsbCBiZQotICAgICAqIGNyZWF0ZWQsIGFuZCBPcGVyYXRpb24gQ29udGV4dCB3aWxsIGJlY29tZSBudWxsIHdoZW4gc29tZSBvbmUgY2FsbHMgcmVzZXQoKS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtc2dDb250ZXh0IHRoZSBNZXNzYWdlQ29udGV4dCB0byBhZGQKLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZE1lc3NhZ2VDb250ZXh0KE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBtc2dDb250ZXh0LnNldFNlcnZpY2VDb250ZXh0KHNjKTsKLSAgICAgICAgaWYgKG1zZ0NvbnRleHQuZ2V0TWVzc2FnZUlEKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgc2V0TWVzc2FnZUlEKG1zZ0NvbnRleHQpOwotICAgICAgICB9Ci0gICAgICAgIGF4aXNPcC5yZWdpc3Rlck9wZXJhdGlvbkNvbnRleHQobXNnQ29udGV4dCwgb2MpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1lc3NhZ2UgY29udGV4dCBmb3IgYSBnaXZlbiBtZXNzYWdlIGxhYmVsLgotICAgICAqCi0gICAgICogQHBhcmFtIG1lc3NhZ2VMYWJlbCA6Ci0gICAgICogICAgICAgICAgICAgICAgICAgICBsYWJlbCBvZiB0aGUgbWVzc2FnZSBhbmQgdGhhdCBjYW4gYmUgZWl0aGVyICJPdXQiIG9yICJJbiIgYW5kCi0gICAgICogICAgICAgICAgICAgICAgICAgICBub3RoaW5nIGVsc2UKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgTWVzc2FnZUNvbnRleHQuCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQKLSAgICAgKi8KLSAgICBwdWJsaWMgTWVzc2FnZUNvbnRleHQgZ2V0TWVzc2FnZUNvbnRleHQoU3RyaW5nIG1lc3NhZ2VMYWJlbCkKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICByZXR1cm4gb2MuZ2V0TWVzc2FnZUNvbnRleHQobWVzc2FnZUxhYmVsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDYWxsYmFjayhDYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICB0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2s7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRXhlY3V0ZXMgdGhlIE1FUC4gV2hhdCB0aGlzIGRvZXMgZGVwZW5kcyBvbiB0aGUgc3BlY2lmaWMgTUVQIGNsaWVudC4gVGhlCi0gICAgICogYmFzaWMgaWRlYSBpcyB0byBoYXZlIHRoZSBNRVAgY2xpZW50IGV4ZWN1dGUgYW5kIGRvIHNvbWV0aGluZyB3aXRoIHRoZQotICAgICAqIG1lc3NhZ2VzIHRoYXQgaGF2ZSBiZWVuIGFkZGVkIHRvIGl0IHNvIGZhci4gRm9yIGV4YW1wbGUsIGlmIGl0cyBhbiBPdXQtSW4KLSAgICAgKiBNRVAsIHRoZW4gaWYgdGhlIE91dCBtZXNzYWdlIGhhcyBiZWVuIHNldCwgdGhlbiBleGVjdXRpbmcgdGhlIGNsaWVudCBhc2tzCi0gICAgICogaXQgdG8gc2VuZCB0aGUgbWVzc2FnZSBhbmQgZ2V0IHRoZSBJbiBtZXNzYWdlLCBwb3NzaWJseSB1c2luZyBhIGRpZmZlcmVudAotICAgICAqIHRocmVhZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBibG9jayBJbmRpY2F0ZXMgd2hldGhlciBleGVjdXRpb24gc2hvdWxkIGJsb2NrIG9yIHJldHVybiBBU0FQLiBXaGF0Ci0gICAgICogICAgICAgICAgICAgIGJsb2NrIG1lYW5zIGlzIG9mIGNvdXJzZSBhIGZ1bmN0aW9uIG9mIHRoZSBzcGVjaWZpYyBNRVAKLSAgICAgKiAgICAgICAgICAgICAgY2xpZW50LiBJR05PUkVEIEJZIFRISVMgTUVQIENMSUVOVC4KLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdCBpZiBzb21ldGhpbmcgZ29lcyB3cm9uZyBkdXJpbmcgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgTUVQLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGVJbXBsKGJvb2xlYW4gYmxvY2spIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiRW50cnk6IE91dEluQXhpc09wZXJhdGlvbkNsaWVudDo6ZXhlY3V0ZSwgIiArIGJsb2NrKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY29tcGxldGVkKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KE1lc3NhZ2VzLmdldE1lc3NhZ2UoIm1lcGlzY29tcGx0ZWQiKSk7Ci0gICAgICAgIH0KLSAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHQgY2MgPSBzYy5nZXRDb25maWd1cmF0aW9uQ29udGV4dCgpOwotCi0gICAgICAgIC8vIGNvcHkgaW50ZXJlc3RpbmcgaW5mbyBmcm9tIG9wdGlvbnMgdG8gbWVzc2FnZSBjb250ZXh0LgotICAgICAgICBNZXNzYWdlQ29udGV4dCBtYyA9IG9jLmdldE1lc3NhZ2VDb250ZXh0KFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9PVVRfVkFMVUUpOwotICAgICAgICBpZiAobWMgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdChNZXNzYWdlcy5nZXRNZXNzYWdlKCJvdXRtc2djdHhudWxsIikpOwotICAgICAgICB9Ci0gICAgICAgIHByZXBhcmVNZXNzYWdlQ29udGV4dChjYywgbWMpOwotCi0gICAgICAgIGlmIChvcHRpb25zLmdldFRyYW5zcG9ydEluKCkgPT0gbnVsbCAmJiBtYy5nZXRUcmFuc3BvcnRJbigpID09IG51bGwpIHsKLSAgICAgICAgICAgIG1jLnNldFRyYW5zcG9ydEluKENsaWVudFV0aWxzLmluZmVySW5UcmFuc3BvcnQoY2MKLSAgICAgICAgICAgICAgICAgICAgLmdldEF4aXNDb25maWd1cmF0aW9uKCksIG9wdGlvbnMsIG1jKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAobWMuZ2V0VHJhbnNwb3J0SW4oKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtYy5zZXRUcmFuc3BvcnRJbihvcHRpb25zLmdldFRyYW5zcG9ydEluKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIElmIGEgbW9kdWxlIGhhcyBzZXQgdGhlIFVTRV9BU1lOQ19PUEVSQVRJT05TIG9wdGlvbiB0aGVuIHdlIG92ZXJyaWRlIHRoZSBiZWhhdmlvdXIKLSAgICAgICAgICogZm9yIHN5bmMgY2FsbHMsIGFuZCBlZmZlY3RpdmVseSBVU0VfQ1VTVE9NX0xJU1RFTkVSIHRvby4gSG93ZXZlciB3ZSBsZWF2ZSByZWFsCi0gICAgICAgICAqIGFzeW5jIGNhbGxzIGFsb25lLgotICAgICAgICAgKi8KLSAgICAgICAgYm9vbGVhbiB1c2VBc3luYyA9IGZhbHNlOwotICAgICAgICBpZiAoIW1jLmdldE9wdGlvbnMoKS5pc1VzZVNlcGFyYXRlTGlzdGVuZXIoKSkgewotICAgICAgICAgICAgQm9vbGVhbiB1c2VBc3luY09wdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgIChCb29sZWFuKSBtYy5nZXRQcm9wZXJ0eShDb25zdGFudHMuQ29uZmlndXJhdGlvbi5VU0VfQVNZTkNfT1BFUkFUSU9OUyk7Ci0JCQlpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIGxvZy5kZWJ1ZygiT3V0SW5BeGlzT3BlcmF0aW9uQ2xpZW50OiB1c2VBc3luY09wdGlvbiAiICsgdXNlQXN5bmNPcHRpb24pOwotICAgICAgICAgICAgaWYgKHVzZUFzeW5jT3B0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB1c2VBc3luYyA9IHVzZUFzeW5jT3B0aW9uLmJvb2xlYW5WYWx1ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgRW5kcG9pbnRSZWZlcmVuY2UgcmVwbHlUbyA9IG1jLmdldFJlcGx5VG8oKTsKLSAgICAgICAgaWYgKHJlcGx5VG8gIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKHJlcGx5VG8uaGFzTm9uZUFkZHJlc3MoKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoIHJlcGx5VG8uZ2V0QWRkcmVzcygpICsgIiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIiBjYW4gbm90IGJlIHVzZWQgd2l0aCBPdXRJbkF4aXNPcGVyYXRpb25DbGllbnQgLCB1c2VyIGVpdGhlciAiCi0gICAgICAgICAgICAgICAgICAgICAgICArICJmaXJlQW5kRm9yZ2V0IG9yIHNlbmRSb2J1c3QpIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChyZXBseVRvLmlzV1NBZGRyZXNzaW5nQW5vbnltb3VzKCkgJiYKLSAgICAgICAgICAgICAgICAgICAgIHJlcGx5VG8uZ2V0QWxsUmVmZXJlbmNlUGFyYW1ldGVycygpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtYy5zZXRQcm9wZXJ0eShBZGRyZXNzaW5nQ29uc3RhbnRzLklOQ0xVREVfT1BUSU9OQUxfSEVBREVSUywgQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgU3RyaW5nIGN1c3RvbVJlcGx5VG8gPSAoU3RyaW5nKW9wdGlvbnMuZ2V0UHJvcGVydHkoT3B0aW9ucy5DVVNUT01fUkVQTFlUT19BRERSRVNTKTsKLSAgICAgICAgICAgIGlmICggISAoT3B0aW9ucy5DVVNUT01fUkVQTFlUT19BRERSRVNTX1RSVUUuZXF1YWxzKGN1c3RvbVJlcGx5VG8pKSkgewotICAgICAgICAgICAgICAgIGlmICghcmVwbHlUby5oYXNBbm9ueW1vdXNBZGRyZXNzKCkpewotICAgICAgICAgICAgICAgICAgICB1c2VBc3luYyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHVzZUFzeW5jIHx8IG1jLmdldE9wdGlvbnMoKS5pc1VzZVNlcGFyYXRlTGlzdGVuZXIoKSkgewotICAgICAgICAgICAgc2VuZEFzeW5jKHVzZUFzeW5jLCBtYyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoYmxvY2spIHsKLSAgICAgICAgICAgICAgICAvLyBTZW5kIHRoZSBTT0FQIE1lc3NhZ2UgYW5kIHJlY2VpdmUgYSByZXNwb25zZQotICAgICAgICAgICAgICAgIHNlbmQobWMpOwotICAgICAgICAgICAgICAgIGNvbXBsZXRlZCA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNjLmdldENvbmZpZ3VyYXRpb25Db250ZXh0KCkuZ2V0VGhyZWFkUG9vbCgpLmV4ZWN1dGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgTm9uQmxvY2tpbmdJbnZvY2F0aW9uV29ya2VyKGNhbGxiYWNrLCBtYywgYXhpc0NhbGxiYWNrKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2VuZEFzeW5jKGJvb2xlYW4gdXNlQXN5bmMsIE1lc3NhZ2VDb250ZXh0IG1jKQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJ1c2VBc3luYz0iICsgdXNlQXN5bmMgKyAiLCBzZXBlcmF0ZUxpc3RlbmVyPSIgKwotICAgICAgICAgICAgICAgICAgICBtYy5nZXRPcHRpb25zKCkuaXNVc2VTZXBhcmF0ZUxpc3RlbmVyKCkpOwotICAgICAgICB9Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBXZSBhcmUgZm9sbG93aW5nIHRoZSBhc3luYyBwYXRoLiBJZiB0aGUgdXNlciBoYXNuJ3Qgc2V0IGEgY2FsbGJhY2sgb2JqZWN0IHRoZW4gd2UgbXVzdAotICAgICAgICAgKiBibG9jayB1bnRpbCB0aGUgd2hvbGUgTUVQIGlzIGNvbXBsZXRlLCBhcyB0aGV5IGhhdmUgbm8gb3RoZXIgd2F5IHRvIGdldCB0aGVpciByZXBseSBtZXNzYWdlLgotICAgICAgICAgKi8KLSAgICAgICAgLy8gVEhSRUFEU0FGRSBpc3N1ZTogTXVsdGlwbGUgdGhyZWFkcyBjb3VsZCBiZSB0cnlpbmcgdG8gaW5pdGlhbGl6ZSB0aGUgY2FsbGJhY2sgcmVjZWl2ZXIKLSAgICAgICAgLy8gc28gaXQgaXMgc3luY2hyb25pemVkLiAgSXQgaXMgbm90IGRvbmUgd2l0aGluIHRoZSBlbHNlIGNsYXVzZSB0byBhdm9pZCB0aGUgCi0gICAgICAgIC8vIGRvdWJsZS1jaGVja2VkIGxvY2sgYW50aXBhdHRlcm4uCi0gICAgICAgIENhbGxiYWNrUmVjZWl2ZXIgY2FsbGJhY2tSZWNlaXZlcjsKLSAgICAgICAgc3luY2hyb25pemVkIChheGlzT3ApIHsKLSAgICAgICAgICAgIGlmIChheGlzT3AuZ2V0TWVzc2FnZVJlY2VpdmVyKCkgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgICAgICBheGlzT3AuZ2V0TWVzc2FnZVJlY2VpdmVyKCkgaW5zdGFuY2VvZiBDYWxsYmFja1JlY2VpdmVyKSB7Ci0gICAgICAgICAgICAgICAgY2FsbGJhY2tSZWNlaXZlciA9IChDYWxsYmFja1JlY2VpdmVyKSBheGlzT3AuZ2V0TWVzc2FnZVJlY2VpdmVyKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkNyZWF0aW5nIG5ldyBjYWxsYmFjayByZWNlaXZlciIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYWxsYmFja1JlY2VpdmVyID0gbmV3IENhbGxiYWNrUmVjZWl2ZXIoKTsKLSAgICAgICAgICAgICAgICBheGlzT3Auc2V0TWVzc2FnZVJlY2VpdmVyKGNhbGxiYWNrUmVjZWl2ZXIpOwotCQkJCWlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgbG9nLmRlYnVnKCJPdXRJbkF4aXNPcGVyYXRpb246IGNhbGxiYWNrUmVjZWl2ZXIgIiArIGNhbGxiYWNrUmVjZWl2ZXIgKyAiIDogIiArIGF4aXNPcCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBTeW5jQ2FsbEJhY2sgaW50ZXJuYWxDYWxsYmFjayA9IG51bGw7Ci0gICAgICAgIGlmIChjYWxsYmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjYWxsYmFja1JlY2VpdmVyLmFkZENhbGxiYWNrKG1jLmdldE1lc3NhZ2VJRCgpLCBjYWxsYmFjayk7Ci0JCQlpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIGxvZy5kZWJ1ZygiT3V0SW5BeGlzT3BlcmF0aW9uQ2xpZW50OiBDcmVhdGluZyBjYWxsYmFjayIpOwotICAgICAgICB9IGVsc2UgaWYgKGF4aXNDYWxsYmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjYWxsYmFja1JlY2VpdmVyLmFkZENhbGxiYWNrKG1jLmdldE1lc3NhZ2VJRCgpLCBheGlzQ2FsbGJhY2spOyAgCi0JCQlpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIGxvZy5kZWJ1ZygiT3V0SW5BeGlzT3BlcmF0aW9uQ2xpZW50OiBDcmVhdGluZyBheGlzIGNhbGxiYWNrIik7CQkJCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkNyZWF0aW5nIGludGVybmFsIGNhbGxiYWNrIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnRlcm5hbENhbGxiYWNrID0gbmV3IFN5bmNDYWxsQmFjaygpOwotICAgICAgICAgICAgY2FsbGJhY2tSZWNlaXZlci5hZGRDYWxsYmFjayhtYy5nZXRNZXNzYWdlSUQoKSwgaW50ZXJuYWxDYWxsYmFjayk7Ci0JCQlpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIGxvZy5kZWJ1ZygiT3V0SW5BeGlzT3BlcmF0aW9uQ2xpZW50OiBDcmVhdGluZyBpbnRlcm5hbCBjYWxsYmFjayIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIElmIFVTRV9DVVNUT01fTElTVEVORVIgaXMgc2V0IHRvICd0cnVlJyB0aGUgcmVwbHlUbyB2YWx1ZSB3aWxsIG5vdCBiZSByZXBsYWNlZCBhbmQgQXhpczIgd2lsbCBub3QKLSAgICAgICAgICogc3RhcnQgaXRzIGludGVybmFsIGxpc3RuZXIuIFNvbWUgb3RoZXIgZW5udGl0eSAoZS5nLiBhIG1vZHVsZSkgc2hvdWxkIHRha2UgY2FyZSBvZiBvYnRhaW5pbmcgdGhlCi0gICAgICAgICAqIHJlc3BvbnNlIG1lc3NhZ2UuCi0gICAgICAgICAqLwotICAgICAgICBCb29sZWFuIHVzZUN1c3RvbUxpc3RlbmVyID0KLSAgICAgICAgICAgICAgICAoQm9vbGVhbikgb3B0aW9ucy5nZXRQcm9wZXJ0eShDb25zdGFudHMuQ29uZmlndXJhdGlvbi5VU0VfQ1VTVE9NX0xJU1RFTkVSKTsKLSAgICAgICAgaWYgKHVzZUFzeW5jKSB7Ci0gICAgICAgICAgICB1c2VDdXN0b21MaXN0ZW5lciA9IEJvb2xlYW4uVFJVRTsKLSAgICAgICAgfQotICAgICAgICBpZiAodXNlQ3VzdG9tTGlzdGVuZXIgPT0gbnVsbCB8fCAhdXNlQ3VzdG9tTGlzdGVuZXIuYm9vbGVhblZhbHVlKCkpIHsKLSAgICAgICAgICAgIEVuZHBvaW50UmVmZXJlbmNlIHJlcGx5VG8gPSBtYy5nZXRSZXBseVRvKCk7Ci0gICAgICAgICAgICBpZiAocmVwbHlUbyA9PSBudWxsIHx8IHJlcGx5VG8uaGFzQW5vbnltb3VzQWRkcmVzcygpKXsKLSAgICAgICAgICAgICAgICBFbmRwb2ludFJlZmVyZW5jZSByZXBseVRvRnJvbVRyYW5zcG9ydCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtYy5nZXRDb25maWd1cmF0aW9uQ29udGV4dCgpLmdldExpc3RlbmVyTWFuYWdlcigpLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRFUFJmb3JTZXJ2aWNlKHNjLmdldEF4aXNTZXJ2aWNlKCkuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNPcC5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCksIG1jCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFRyYW5zcG9ydEluKCkuZ2V0TmFtZSgpKTsKLQotICAgICAgICAgICAgICAgIGlmIChyZXBseVRvID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbWMuc2V0UmVwbHlUbyhyZXBseVRvRnJvbVRyYW5zcG9ydCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmVwbHlUby5zZXRBZGRyZXNzKHJlcGx5VG9Gcm9tVHJhbnNwb3J0LmdldEFkZHJlc3MoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy9pZiB3ZSBkb24ndCBkbyB0aGlzICwgdGhpcyBndXkgd2lsbCB3YWl0IHRpbGwgaXQgZ2V0cyBIVFRQIDIwMiBpbiB0aGUgSFRUUCBjYXNlCi0gICAgICAgIG1jLnNldFByb3BlcnR5KE1lc3NhZ2VDb250ZXh0LlRSQU5TUE9SVF9OT05fQkxPQ0tJTkcsIEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgIG1jLmdldENvbmZpZ3VyYXRpb25Db250ZXh0KCkucmVnaXN0ZXJPcGVyYXRpb25Db250ZXh0KG1jLmdldE1lc3NhZ2VJRCgpLCBvYyk7Ci0gICAgICAgIEF4aXNFbmdpbmUuc2VuZChtYyk7Ci0gICAgICAgIGlmIChpbnRlcm5hbENhbGxiYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgIGludGVybmFsQ2FsbGJhY2sud2FpdEZvckNvbXBsZXRpb24ob3B0aW9ucy5nZXRUaW1lT3V0SW5NaWxsaVNlY29uZHMoKSk7Ci0KLSAgICAgICAgICAgIC8vIHByb2Nlc3MgdGhlIHJlc3VsdCBvZiB0aGUgaW52b2NhdGlvbgotICAgICAgICAgICAgaWYgKGludGVybmFsQ2FsbGJhY2suZW52ZWxvcGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChpbnRlcm5hbENhbGxiYWNrLmVycm9yID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKCJDYWxsYmFjayBoYWQgbmVpdGhlciBlcnJvciBub3IgcmVzcG9uc2UiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuaXNFeGNlcHRpb25Ub0JlVGhyb3duT25TT0FQRmF1bHQoKSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBBeGlzRmF1bHQubWFrZUZhdWx0KGludGVybmFsQ2FsbGJhY2suZXJyb3IpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdoZW4gc3luY2hyb25vdXMgc2VuZCgpIGdldHMgYmFjayBhIHJlc3BvbnNlIE1lc3NhZ2VDb250ZXh0LCB0aGlzIGlzIHRoZSB3b3JraG9yc2UKLSAgICAgKiBtZXRob2Qgd2hpY2ggcHJvY2Vzc2VzIGl0LgotICAgICAqCi0gICAgICogQHBhcmFtIHJlc3BvbnNlTWVzc2FnZUNvbnRleHQgdGhlIGFjdGl2ZSByZXNwb25zZSBNZXNzYWdlQ29udGV4dAotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0IGlmIHNvbWV0aGluZyB3ZW50IHdyb25nCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlUmVzcG9uc2UoTWVzc2FnZUNvbnRleHQgcmVzcG9uc2VNZXNzYWdlQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdHsKLSAgICAgICAgLy8gT3B0aW9ucyBvYmplY3QgcmV1c2VkIGFib3ZlIHNvIHNvYXBBY3Rpb24gbmVlZHMgdG8gYmUgcmVtb3ZlZCBzbwotICAgICAgICAvLyB0aGF0IHNvYXBBY3Rpb24rd3NhOkFjdGlvbiBvbiByZXNwb25zZSBkb24ndCBjb25mbGljdAotICAgICAgICByZXNwb25zZU1lc3NhZ2VDb250ZXh0LnNldFNvYXBBY3Rpb24obnVsbCk7Ci0KLSAgICAgICAgaWYgKHJlc3BvbnNlTWVzc2FnZUNvbnRleHQuZ2V0RW52ZWxvcGUoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBJZiByZXF1ZXN0IGlzIFJFU1Qgd2UgYXNzdW1lIHRoZSByZXNwb25zZU1lc3NhZ2VDb250ZXh0IGlzIFJFU1QsIHNvCi0gICAgICAgICAgICAvLyBzZXQgdGhlIHZhcmlhYmxlCi0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogb2xkIGNvZGUgaGVyZSB3YXMgdXNpbmcgdGhlIG91dGJvdW5kIG1lc3NhZ2UgY29udGV4dCB0byBzZXQgdGhlIGluYm91bmQgU09BUCBuYW1lc3BhY2UsCi0gICAgICAgICAgICAgKiBhcyBzdWNoIGFuZCBwYXNzaW5nIGl0IHRvIFRyYW5zcG9ydFV0aWxzLmNyZWF0ZVNPQVBNZXNzYWdlCi0gICAgICAgICAgICAgKgotICAgICAgICAgICAgICogbXNnY3R4LmdldEVudmVsb3BlKCkuZ2V0TmFtZXNwYWNlKCkuZ2V0TmFtZXNwYWNlVVJJKCkKLSAgICAgICAgICAgICAqCi0gICAgICAgICAgICAgKiBIb3dldmVyLCB0aGUgU09BUDEuMiBzcGVjLCBhcHBlbmRpeCBBIGluZGljYXRlcyB0aGF0IGlmIGEgU09BUDEuMiBtZXNzYWdlIGlzIHNlbnQgdG8gYSBTT0FQMS4xCi0gICAgICAgICAgICAgKiBlbmRwb2ludCwgd2Ugd2lsbCBnZXQgYSBTT0FQMS4xIChmYXVsdCkgbWVzc2FnZSByZXNwb25zZS4gIFdlIG5lZWQgYW5vdGhlciB3YXkgdG8gc2V0Ci0gICAgICAgICAgICAgKiB0aGUgaW5ib3VuZCBTT0FQIHZlcnNpb24uICBCZXN0IHdheSB0byBkbyB0aGlzIGlzIHRvIHRydXN0IHRoZSBjb250ZW50IHR5cGUgYW5kIGxldAotICAgICAgICAgICAgICogY3JlYXRlU09BUE1lc3NhZ2UgdGFrZSBjYXJlIG9mIGZpZ3VyaW5nIG91dCB3aGF0IHRoZSBTT0FQIG5hbWVzcGFjZSBpcy4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgU09BUEVudmVsb3BlIHJlc2VudmVsb3BlID0gVHJhbnNwb3J0VXRpbHMuY3JlYXRlU09BUE1lc3NhZ2UocmVzcG9uc2VNZXNzYWdlQ29udGV4dCk7Ci0gICAgICAgICAgICBpZiAocmVzZW52ZWxvcGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJlc3BvbnNlTWVzc2FnZUNvbnRleHQuc2V0RW52ZWxvcGUocmVzZW52ZWxvcGUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KE1lc3NhZ2VzCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0TWVzc2FnZSgiYmxvY2tpbmdJbnZvY2F0aW9uRXhwZWN0c1Jlc3BvbnNlIikpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIFNPQVBFbnZlbG9wZSByZXNlbnZlbG9wZSA9IHJlc3BvbnNlTWVzc2FnZUNvbnRleHQuZ2V0RW52ZWxvcGUoKTsKLSAgICAgICAgaWYgKHJlc2VudmVsb3BlICE9IG51bGwpIHsKLSAgICAgICAgICAgIEF4aXNFbmdpbmUucmVjZWl2ZShyZXNwb25zZU1lc3NhZ2VDb250ZXh0KTsKLSAgICAgICAgICAgIGlmIChyZXNwb25zZU1lc3NhZ2VDb250ZXh0LmdldFJlcGx5VG8oKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc2Muc2V0VGFyZ2V0RVBSKHJlc3BvbnNlTWVzc2FnZUNvbnRleHQuZ2V0UmVwbHlUbygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChyZXNlbnZlbG9wZS5oYXNGYXVsdCgpfHxyZXNwb25zZU1lc3NhZ2VDb250ZXh0LmlzUHJvY2Vzc2luZ0ZhdWx0KCkpIHsKLSAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5pc0V4Y2VwdGlvblRvQmVUaHJvd25PblNPQVBGYXVsdCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGRvZXMgdGhlIFNPQVBGYXVsdCBoYXMgYSBkZXRhaWwgZWxlbWVudCBmb3IgRXhjcGV0aW9uCi0gICAgICAgICAgICAgICAgICAgIHRocm93IFV0aWxzLmdldEluYm91bmRGYXVsdEZyb21NZXNzYWdlQ29udGV4dChyZXNwb25zZU1lc3NhZ2VDb250ZXh0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTeW5jaHJvbm91c2x5IHNlbmQgdGhlIHJlcXVlc3QgYW5kIHJlY2VpdmUgYSByZXNwb25zZS4gIFRoaXMgcmVsaWVzIG9uIHRoZSB0cmFuc3BvcnQKLSAgICAgKiBjb3JyZWN0bHkgY29ubmVjdGluZyB0aGUgcmVzcG9uc2UgSW5wdXRTdHJlYW0hCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbXNnQ29udGV4dCB0aGUgcmVxdWVzdCBNZXNzYWdlQ29udGV4dCB0byBzZW5kLgotICAgICAqIEByZXR1cm4gUmV0dXJucyBNZXNzYWdlQ29udGV4dC4KLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdCBTZW5kcyB0aGUgbWVzc2FnZSB1c2luZyBhIHR3byB3YXkgdHJhbnNwb3J0IGFuZCB3YWl0cyBmb3IgYSByZXNwb25zZQotICAgICAqLwotICAgIHByb3RlY3RlZCBNZXNzYWdlQ29udGV4dCBzZW5kKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHRocm93cyBBeGlzRmF1bHQgewotCi0gICAgICAgIC8vIGNyZWF0ZSB0aGUgcmVzcG9uc2VNZXNzYWdlQ29udGV4dAotCi0gICAgICAgIE1lc3NhZ2VDb250ZXh0IHJlc3BvbnNlTWVzc2FnZUNvbnRleHQgPQotICAgICAgICAgICAgICAgIG1zZ0NvbnRleHQuZ2V0Q29uZmlndXJhdGlvbkNvbnRleHQoKS5jcmVhdGVNZXNzYWdlQ29udGV4dCgpOwotCi0gICAgICAgIHJlc3BvbnNlTWVzc2FnZUNvbnRleHQuc2V0U2VydmVyU2lkZShmYWxzZSk7Ci0gICAgICAgIHJlc3BvbnNlTWVzc2FnZUNvbnRleHQuc2V0T3BlcmF0aW9uQ29udGV4dChtc2dDb250ZXh0LmdldE9wZXJhdGlvbkNvbnRleHQoKSk7Ci0gICAgICAgIHJlc3BvbnNlTWVzc2FnZUNvbnRleHQuc2V0T3B0aW9ucyhuZXcgT3B0aW9ucyhvcHRpb25zKSk7Ci0gICAgICAgIHJlc3BvbnNlTWVzc2FnZUNvbnRleHQuc2V0TWVzc2FnZUlEKG1zZ0NvbnRleHQuZ2V0TWVzc2FnZUlEKCkpOwotICAgICAgICBhZGRNZXNzYWdlQ29udGV4dChyZXNwb25zZU1lc3NhZ2VDb250ZXh0KTsKLSAgICAgICAgcmVzcG9uc2VNZXNzYWdlQ29udGV4dC5zZXRTZXJ2aWNlQ29udGV4dChtc2dDb250ZXh0LmdldFNlcnZpY2VDb250ZXh0KCkpOwotICAgICAgICByZXNwb25zZU1lc3NhZ2VDb250ZXh0LnNldEF4aXNNZXNzYWdlKAotICAgICAgICAgICAgICAgIGF4aXNPcC5nZXRNZXNzYWdlKFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9JTl9WQUxVRSkpOwotCi0gICAgICAgIC8vc2VuZGluZyB0aGUgbWVzc2FnZQotICAgICAgICBBeGlzRW5naW5lLnNlbmQobXNnQ29udGV4dCk7Ci0KLSAgICAgICAgcmVzcG9uc2VNZXNzYWdlQ29udGV4dC5zZXREb2luZ1JFU1QobXNnQ29udGV4dC5pc0RvaW5nUkVTVCgpKTsKLQotICAgICAgICAvLyBDb3B5IFJFU1BPTlNFIHByb3BlcnRpZXMgd2hpY2ggdGhlIHRyYW5zcG9ydCBzZXQgb250byB0aGUgcmVxdWVzdCBtZXNzYWdlIGNvbnRleHQgd2hlbiBpdCBwcm9jZXNzZWQKLSAgICAgICAgLy8gdGhlIGluY29taW5nIHJlc3BvbnNlIHJlY2lldmVkIGluIHJlcGx5IHRvIGFuIG91dGdvaW5nIHJlcXVlc3QuCi0gICAgICAgIHJlc3BvbnNlTWVzc2FnZUNvbnRleHQuc2V0UHJvcGVydHkoTWVzc2FnZUNvbnRleHQuVFJBTlNQT1JUX0hFQURFUlMsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZ0NvbnRleHQuZ2V0UHJvcGVydHkoTWVzc2FnZUNvbnRleHQuVFJBTlNQT1JUX0hFQURFUlMpKTsKLSAgICAgICAgcmVzcG9uc2VNZXNzYWdlQ29udGV4dC5zZXRQcm9wZXJ0eShIVFRQQ29uc3RhbnRzLk1DX0hUVFBfU1RBVFVTX0NPREUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnQ29udGV4dC5nZXRQcm9wZXJ0eShIVFRQQ29uc3RhbnRzLk1DX0hUVFBfU1RBVFVTX0NPREUpKTsKLQotICAgICAgICByZXNwb25zZU1lc3NhZ2VDb250ZXh0LnNldFByb3BlcnR5KE1lc3NhZ2VDb250ZXh0LlRSQU5TUE9SVF9JTiwgbXNnQ29udGV4dAotICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eShNZXNzYWdlQ29udGV4dC5UUkFOU1BPUlRfSU4pKTsKLSAgICAgICAgcmVzcG9uc2VNZXNzYWdlQ29udGV4dC5zZXRUcmFuc3BvcnRJbihtc2dDb250ZXh0LmdldFRyYW5zcG9ydEluKCkpOwotICAgICAgICByZXNwb25zZU1lc3NhZ2VDb250ZXh0LnNldFRyYW5zcG9ydE91dChtc2dDb250ZXh0LmdldFRyYW5zcG9ydE91dCgpKTsKLSAgICAgICAgaGFuZGxlUmVzcG9uc2UocmVzcG9uc2VNZXNzYWdlQ29udGV4dCk7Ci0gICAgICAgIHJldHVybiByZXNwb25zZU1lc3NhZ2VDb250ZXh0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgY2xhc3MgaXMgdGhlIHdvcmtob3JzZSBmb3IgYSBub24tYmxvY2tpbmcgaW52b2NhdGlvbiB0aGF0IHVzZXMgYSB0d28KLSAgICAgKiB3YXkgdHJhbnNwb3J0LgotICAgICAqLwotICAgIHByaXZhdGUgY2xhc3MgTm9uQmxvY2tpbmdJbnZvY2F0aW9uV29ya2VyIGltcGxlbWVudHMgUnVubmFibGUgewotICAgICAgICBwcml2YXRlIENhbGxiYWNrIGNhbGxiYWNrOwotCi0gICAgICAgIHByaXZhdGUgTWVzc2FnZUNvbnRleHQgbXNnY3R4OwotICAgICAgICBwcml2YXRlIEF4aXNDYWxsYmFjayBheGlzQ2FsbGJhY2s7Ci0KLSAgICAgICAgcHVibGljIE5vbkJsb2NraW5nSW52b2NhdGlvbldvcmtlcihDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlQ29udGV4dCBtc2djdHggLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF4aXNDYWxsYmFjayBheGlzQ2FsbGJhY2spIHsKLSAgICAgICAgICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFjazsKLSAgICAgICAgICAgIHRoaXMubXNnY3R4ID0gbXNnY3R4OwotICAgICAgICAgICAgdGhpcy5heGlzQ2FsbGJhY2sgPWF4aXNDYWxsYmFjazsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgLy8gc2VuZCB0aGUgcmVxdWVzdCBhbmQgd2FpdCBmb3IgcmVzcG9uc2UKLSAgICAgICAgICAgICAgICBNZXNzYWdlQ29udGV4dCByZXNwb25zZSA9IHNlbmQobXNnY3R4KTsKLSAgICAgICAgICAgICAgICAvLyBjYWxsIHRoZSBjYWxsYmFjawotICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIFNPQVBFbnZlbG9wZSByZXNlbnZlbG9wZSA9IHJlc3BvbnNlLmdldEVudmVsb3BlKCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpZiAocmVzZW52ZWxvcGUuaGFzRmF1bHQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgU09BUEJvZHkgYm9keSA9IHJlc2VudmVsb3BlLmdldEJvZHkoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIGEgZmF1bHQgd2FzIGZvdW5kLCBjcmVhdGUgYW4gQXhpc0ZhdWx0IHdpdGggYSBNZXNzYWdlQ29udGV4dCBzbyB0aGF0Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBvdGhlciBwcm9ncmFtbWluZyBtb2RlbHMgY2FuIGRlc2VyaWFsaXplIHRoZSBmYXVsdCB0byBhbiBhbHRlcm5hdGl2ZSBmb3JtLgotICAgICAgICAgICAgICAgICAgICAgICAgQXhpc0ZhdWx0IGZhdWx0ID0gbmV3IEF4aXNGYXVsdChib2R5LmdldEZhdWx0KCksIHJlc3BvbnNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sub25FcnJvcihmYXVsdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGF4aXNDYWxsYmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpc0NhbGxiYWNrLm9uRXJyb3IoZmF1bHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzeW5jUmVzdWx0IGFzeW5jUmVzdWx0ID0gbmV3IEFzeW5jUmVzdWx0KHJlc3BvbnNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5vbkNvbXBsZXRlKGFzeW5jUmVzdWx0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYXhpc0NhbGxiYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzQ2FsbGJhY2sub25NZXNzYWdlKHJlc3BvbnNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLm9uRXJyb3IoZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChheGlzQ2FsbGJhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBheGlzQ2FsbGJhY2sub25FcnJvcihlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suc2V0Q29tcGxldGUodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgfWVsc2UgaWYgKGF4aXNDYWxsYmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF4aXNDYWxsYmFjay5vbkNvbXBsZXRlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBjbGFzcyBhY3RzIGFzIGEgY2FsbGJhY2sgdGhhdCBhbGxvd3MgdXNlcnMgdG8gd2FpdCBvbiB0aGUgcmVzdWx0LgotICAgICAqLwotICAgIHByaXZhdGUgY2xhc3MgU3luY0NhbGxCYWNrIGltcGxlbWVudHMgQXhpc0NhbGxiYWNrIHsKLSAgICAgICAgYm9vbGVhbiBjb21wbGV0ZTsKLSAgICAgICAgYm9vbGVhbiByZWNlaXZlZEZhdWx0OwotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIHdhaXRGb3JDb21wbGV0aW9uKGxvbmcgdGltZW91dCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBpZiAoY29tcGxldGUpIHJldHVybiAhcmVjZWl2ZWRGYXVsdDsKLSAgICAgICAgICAgICAgICAgICAgd2FpdCh0aW1lb3V0KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFjb21wbGV0ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgdGltZWQgb3V0IQotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCggTWVzc2FnZXMuZ2V0TWVzc2FnZSgicmVzcG9uc2VUaW1lT3V0IikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAvLyBTb21ldGhpbmcgaW50ZXJydXB0ZWQgb3VyIHdhaXQhCi0gICAgICAgICAgICAgICAgICAgIGVycm9yID0gZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChlcnJvciAhPSBudWxsKSB0aHJvdyBBeGlzRmF1bHQubWFrZUZhdWx0KGVycm9yKTsKLQotICAgICAgICAgICAgcmV0dXJuICFyZWNlaXZlZEZhdWx0OwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoaXMgaXMgY2FsbGVkIHdoZW4gd2UgcmVjZWl2ZSBhIG1lc3NhZ2UuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBtc2dDb250ZXh0IHRoZSAocmVzcG9uc2UpIE1lc3NhZ2VDb250ZXh0Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBvbk1lc3NhZ2UoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgewotICAgICAgICAgICAgLy8gVHJhbnNwb3J0IGlucHV0IHN0cmVhbSBnZXRzIGNsb3NlZCBhZnRlciBjYWxsaW5nIHNldENvbXBsZXRlCi0gICAgICAgICAgICAvLyBtZXRob2QuIEhhdmUgdG8gYnVpbGQgdGhlIHdob2xlIGVudmVsb3BlIGluY2x1ZGluZyB0aGUKLSAgICAgICAgICAgIC8vIGF0dGFjaG1lbnRzIGF0IHRoaXMgc3RhZ2UuIERhdGEgbWlnaHQgZ2V0IGxvc3QgaWYgdGhlIGlucHV0Ci0gICAgICAgICAgICAvLyBzdHJlYW0gZ2V0cyBjbG9zZWQgYmVmb3JlIGJ1aWxkaW5nIHRoZSB3aG9sZSBlbnZlbG9wZS4KLQotICAgICAgICAgICAgLy8gVE9ETzogU2hvdWxkbid0IG5lZWQgdG8gZG8gdGhpcyAtIG5lZWQgdG8gaG9vayB1cCBzdHJlYW0gY2xvc3VyZSB0byBBeGlvbSBjb21wbGV0aW9uCi0gICAgICAgICAgICB0aGlzLmVudmVsb3BlID0gbXNnQ29udGV4dC5nZXRFbnZlbG9wZSgpOwotICAgICAgICAgICAgdGhpcy5lbnZlbG9wZS5idWlsZFdpdGhBdHRhY2htZW50cygpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoaXMgZ2V0cyBjYWxsZWQgd2hlbiBhIGZhdWx0IG1lc3NhZ2UgaXMgcmVjZWl2ZWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBtc2dDb250ZXh0IHRoZSBNZXNzYWdlQ29udGV4dCBjb250YWluaW5nIHRoZSBmYXVsdC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uRmF1bHQoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgewotICAgICAgICAgICBlcnJvciA9IFV0aWxzLmdldEluYm91bmRGYXVsdEZyb21NZXNzYWdlQ29udGV4dChtc2dDb250ZXh0KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGlzIGlzIGNhbGxlZCBhdCB0aGUgZW5kIG9mIHRoZSBNRVAgbm8gbWF0dGVyIHdoYXQgaGFwcGVucywgcXVpdGUgbGlrZSBhCi0gICAgICAgICAqIGZpbmFsbHkgYmxvY2suCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgb25Db21wbGV0ZSgpIHsKLSAgICAgICAgICAgIGNvbXBsZXRlID0gdHJ1ZTsKLSAgICAgICAgICAgIG5vdGlmeSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBTT0FQRW52ZWxvcGUgZW52ZWxvcGU7Ci0KLSAgICAgICAgcHJpdmF0ZSBFeGNlcHRpb24gZXJyb3I7Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25FcnJvcihFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJFbnRyeTogT3V0SW5BeGlzT3BlcmF0aW9uQ2xpZW50JFN5bmNDYWxsQmFjazo6b25FcnJvciwgIiArIGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZXJyb3IgPSBlOwotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJFeGl0OiBPdXRJbkF4aXNPcGVyYXRpb25DbGllbnQkU3luY0NhbGxCYWNrOjpvbkVycm9yIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9PdXRPbmx5QXhpc09wZXJhdGlvbi5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL091dE9ubHlBeGlzT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwYTgzMjkuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL091dE9ubHlBeGlzT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS51dGlsLlVVSURHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkFkZHJlc3NpbmdDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkFkZHJlc3NpbmdDb25zdGFudHMuRmluYWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50Lk9wZXJhdGlvbkNsaWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5PcHRpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50LmFzeW5jLkNhbGxiYWNrOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk9wZXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LlNlcnZpY2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNFbmdpbmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pMThuLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMQ29uc3RhbnRzOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1wdWJsaWMgY2xhc3MgT3V0T25seUF4aXNPcGVyYXRpb24gZXh0ZW5kcyBBeGlzT3BlcmF0aW9uIHsKLQotICAgIHByaXZhdGUgQXhpc01lc3NhZ2UgaW5GYXVsdE1lc3NhZ2U7Ci0KLSAgICAvLyBqdXN0IHRvIGtlZXAgdGhlIGluZmxvdyAsIHRoZXJlIHdvbid0IGJlIGFueSB1c2FnZQotICAgIHByaXZhdGUgQXJyYXlMaXN0IGluUGhhc2VzOwotCi0gICAgcHJpdmF0ZSBBeGlzTWVzc2FnZSBvdXRGYXVsdE1lc3NhZ2U7Ci0KLSAgICBwcml2YXRlIEF4aXNNZXNzYWdlIG91dE1lc3NhZ2U7Ci0KLSAgICBwdWJsaWMgT3V0T25seUF4aXNPcGVyYXRpb24oKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIC8vc2V0dXAgYSB0ZW1wb3JhcnkgbmFtZQotICAgICAgICBRTmFtZSB0bXBOYW1lID0gbmV3IFFOYW1lKHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiXyIgKyBVVUlER2VuZXJhdG9yLmdldFVVSUQoKSk7Ci0gICAgICAgIHRoaXMuc2V0TmFtZSh0bXBOYW1lKTsKLSAgICAgICAgY3JlYXRlTWVzc2FnZSgpOwotICAgICAgICBzZXRNZXNzYWdlRXhjaGFuZ2VQYXR0ZXJuKFdTREwyQ29uc3RhbnRzLk1FUF9VUklfT1VUX09OTFkpOwotICAgIH0KLQotICAgIHB1YmxpYyBPdXRPbmx5QXhpc09wZXJhdGlvbihRTmFtZSBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgICAgICBjcmVhdGVNZXNzYWdlKCk7Ci0gICAgICAgIHNldE1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4oV1NETDJDb25zdGFudHMuTUVQX1VSSV9PVVRfT05MWSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkTWVzc2FnZShBeGlzTWVzc2FnZSBtZXNzYWdlLCBTdHJpbmcgbGFiZWwpIHsKLSAgICAgICAgaWYgKFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9PVVRfVkFMVUUuZXF1YWxzKGxhYmVsKSkgewotICAgICAgICAgICAgb3V0TWVzc2FnZSA9IG1lc3NhZ2U7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCB5ZXQgaW1wbGVtZW50ZWQiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZE1lc3NhZ2VDb250ZXh0KE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmF0aW9uQ29udGV4dCBvcENvbnRleHQpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBpZiAoIW9wQ29udGV4dC5pc0NvbXBsZXRlKCkpIHsKLSAgICAgICAgICAgIG9wQ29udGV4dC5nZXRNZXNzYWdlQ29udGV4dHMoKS5wdXQoTUVTU0FHRV9MQUJFTF9PVVRfVkFMVUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZ0NvbnRleHQpOwotICAgICAgICAgICAgb3BDb250ZXh0LnNldENvbXBsZXRlKHRydWUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdChNZXNzYWdlcy5nZXRNZXNzYWdlKCJtZXBjb21wbGV0ZWQiKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRGYXVsdE1lc3NhZ2VDb250ZXh0KE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQsIE9wZXJhdGlvbkNvbnRleHQgb3BDb250ZXh0KQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIEhhc2hNYXAgbWVwID0gb3BDb250ZXh0LmdldE1lc3NhZ2VDb250ZXh0cygpOwotICAgICAgICBNZXNzYWdlQ29udGV4dCBmYXVsdE1lc3NhZ2VDdHh0ID0gKE1lc3NhZ2VDb250ZXh0KSBtZXAuZ2V0KE1FU1NBR0VfTEFCRUxfRkFVTFRfVkFMVUUpOwotCi0gICAgICAgIGlmIChmYXVsdE1lc3NhZ2VDdHh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoTWVzc2FnZXMuZ2V0TWVzc2FnZSgibWVwY29tcGxldGVkIikpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbWVwLnB1dChNRVNTQUdFX0xBQkVMX0ZBVUxUX1ZBTFVFLCBtc2dDb250ZXh0KTsKLSAgICAgICAgICAgIG9wQ29udGV4dC5zZXRDb21wbGV0ZSh0cnVlKTsKLSAgICAgICAgICAgIG9wQ29udGV4dC5jbGVhbnVwKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlTWVzc2FnZSgpIHsKLSAgICAgICAgb3V0TWVzc2FnZSA9IG5ldyBBeGlzTWVzc2FnZSgpOwotICAgICAgICBvdXRNZXNzYWdlLnNldERpcmVjdGlvbihXU0RMQ29uc3RhbnRzLldTRExfTUVTU0FHRV9ESVJFQ1RJT05fT1VUKTsKLSAgICAgICAgb3V0TWVzc2FnZS5zZXRQYXJlbnQodGhpcyk7Ci0gICAgICAgIGluRmF1bHRNZXNzYWdlID0gbmV3IEF4aXNNZXNzYWdlKCk7Ci0gICAgICAgIGluRmF1bHRNZXNzYWdlLnNldFBhcmVudCh0aGlzKTsKLSAgICAgICAgb3V0RmF1bHRNZXNzYWdlID0gbmV3IEF4aXNNZXNzYWdlKCk7Ci0gICAgICAgIG91dEZhdWx0TWVzc2FnZS5zZXRQYXJlbnQodGhpcyk7Ci0gICAgICAgIGluUGhhc2VzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBBeGlzTWVzc2FnZSBnZXRNZXNzYWdlKFN0cmluZyBsYWJlbCkgewotICAgICAgICBpZiAoV1NETENvbnN0YW50cy5NRVNTQUdFX0xBQkVMX09VVF9WQUxVRS5lcXVhbHMobGFiZWwpKSB7Ci0gICAgICAgICAgICByZXR1cm4gb3V0TWVzc2FnZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTm90IHlldCBpbXBsZW1lbnRlZCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIEFycmF5TGlzdCBnZXRQaGFzZXNJbkZhdWx0RmxvdygpIHsKLSAgICAgICAgcmV0dXJuIGluRmF1bHRNZXNzYWdlLmdldE1lc3NhZ2VGbG93KCk7Ci0gICAgfQotCi0gICAgcHVibGljIEFycmF5TGlzdCBnZXRQaGFzZXNPdXRGYXVsdEZsb3coKSB7Ci0gICAgICAgIHJldHVybiBvdXRGYXVsdE1lc3NhZ2UuZ2V0TWVzc2FnZUZsb3coKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXJyYXlMaXN0IGdldFBoYXNlc091dEZsb3coKSB7Ci0gICAgICAgIHJldHVybiBvdXRNZXNzYWdlLmdldE1lc3NhZ2VGbG93KCk7Ci0gICAgfQotCi0gICAgcHVibGljIEFycmF5TGlzdCBnZXRSZW1haW5pbmdQaGFzZXNJbkZsb3coKSB7Ci0gICAgICAgIHJldHVybiBpblBoYXNlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQaGFzZXNJbkZhdWx0RmxvdyhBcnJheUxpc3QgbGlzdCkgewotICAgICAgICBpbkZhdWx0TWVzc2FnZS5zZXRNZXNzYWdlRmxvdyhsaXN0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQaGFzZXNPdXRGYXVsdEZsb3coQXJyYXlMaXN0IGxpc3QpIHsKLSAgICAgICAgb3V0RmF1bHRNZXNzYWdlLnNldE1lc3NhZ2VGbG93KGxpc3QpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBoYXNlc091dEZsb3coQXJyYXlMaXN0IGxpc3QpIHsKLSAgICAgICAgb3V0TWVzc2FnZS5zZXRNZXNzYWdlRmxvdyhsaXN0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRSZW1haW5pbmdQaGFzZXNJbkZsb3coQXJyYXlMaXN0IGxpc3QpIHsKLSAgICAgICAgaW5QaGFzZXMgPSBsaXN0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBNRVAgY2xpZW50IGZvciBhbiBPdXQtb25seSBvcGVyYXRpb24uIFRoaXMgY2xpZW50IGNhbiBiZSB1c2VkIHRvCi0gICAgICogaW50ZXJhY3Qgd2l0aCBhIHNlcnZlciB3aGljaCBpcyBvZmZlcmluZyBhbiBJbi1vbmx5IG9wZXJhdGlvbi4gVG8gdXNlIHRoZQotICAgICAqIGNsaWVudCwgeW91IG11c3QgY2FsbCBhZGRNZXNzYWdlQ29udGV4dCgpIHdpdGggYSBtZXNzYWdlIGNvbnRleHQgYW5kIHRoZW4KLSAgICAgKiBjYWxsIGV4ZWN1dGUoKSB0byBleGVjdXRlIHRoZSBjbGllbnQuIE5vdGUgdGhhdCB0aGUgZXhlY3V0ZSBtZXRob2QncwotICAgICAqIGJsb2NrIHBhcmFtZXRlciBpcyBpZ25vcmVkIGJ5IHRoaXMgY2xpZW50IGFuZCBhbHNvIHRoZSBzZXRNZXNzYWdlUmVjZWl2ZXIKLSAgICAgKiBtZXRob2QgY2Fubm90IGJlIHVzZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2MgICAgICBUaGUgc2VydmljZSBjb250ZXh0IGZvciB0aGlzIGNsaWVudCB0byBsaXZlIHdpdGhpbi4gQ2Fubm90IGJlCi0gICAgICogICAgICAgICAgICAgICAgbnVsbC4KLSAgICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIHRvIHVzZSBhcyBkZWZhdWx0cyBmb3IgdGhpcyBjbGllbnQuIElmIGFueSBvcHRpb25zIGFyZQotICAgICAqICAgICAgICAgICAgICAgIHNldCBzcGVjaWZpY2FsbHkgb24gdGhlIGNsaWVudCB0aGVuIHRob3NlIG92ZXJyaWRlIG9wdGlvbnMKLSAgICAgKiAgICAgICAgICAgICAgICBoZXJlLgotICAgICAqLwotICAgIHB1YmxpYyBPcGVyYXRpb25DbGllbnQgY3JlYXRlQ2xpZW50KFNlcnZpY2VDb250ZXh0IHNjLCBPcHRpb25zIG9wdGlvbnMpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBPdXRPbmx5QXhpc09wZXJhdGlvbkNsaWVudCh0aGlzLCBzYywgb3B0aW9ucyk7Ci0gICAgfQotfQotCi0vKioKLSAqIE1FUCBjbGllbnQgZm9yIG1vaS4KLSAqLwotY2xhc3MgT3V0T25seUF4aXNPcGVyYXRpb25DbGllbnQgZXh0ZW5kcyBPcGVyYXRpb25DbGllbnQgewotCi0gICAgcHJpdmF0ZSBNZXNzYWdlQ29udGV4dCBtYzsKLQotICAgIE91dE9ubHlBeGlzT3BlcmF0aW9uQ2xpZW50KE91dE9ubHlBeGlzT3BlcmF0aW9uIGF4aXNPcCwgU2VydmljZUNvbnRleHQgc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9ucyBvcHRpb25zKSB7Ci0gICAgICAgIHN1cGVyKGF4aXNPcCwgc2MsIG9wdGlvbnMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSBtZXNzYWdlIGNvbnRleHQgdG8gdGhlIGNsaWVudCBmb3IgcHJvY2Vzc2luZy4gVGhpcyBtZXRob2QgbXVzdCBub3QKLSAgICAgKiBwcm9jZXNzIHRoZSBtZXNzYWdlIC0gaXQgb25seSByZWNvcmRzIGl0IGluIHRoZSBNRVAgY2xpZW50LiBQcm9jZXNzaW5nCi0gICAgICogb25seSBvY2N1cnMgd2hlbiBleGVjdXRlKCkgaXMgY2FsbGVkLgotICAgICAqCi0gICAgICogQHBhcmFtIG1jIHRoZSBtZXNzYWdlIGNvbnRleHQKLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdCBpZiB0aGlzIGlzIGNhbGxlZCBpbmFwcHJvcHJpYXRlbHkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkTWVzc2FnZUNvbnRleHQoTWVzc2FnZUNvbnRleHQgbWMpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBpZiAodGhpcy5tYyAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KE1lc3NhZ2VzLmdldE1lc3NhZ2UoImNhbm5vdGFkZG1zZ2N0eCIpKTsKLSAgICAgICAgfQotICAgICAgICB0aGlzLm1jID0gbWM7Ci0gICAgICAgIGlmIChtYy5nZXRNZXNzYWdlSUQoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBzZXRNZXNzYWdlSUQobWMpOwotICAgICAgICB9Ci0gICAgICAgIG1jLnNldFNlcnZpY2VDb250ZXh0KHNjKTsKLSAgICAgICAgYXhpc09wLnJlZ2lzdGVyT3BlcmF0aW9uQ29udGV4dChtYywgb2MpOwotICAgICAgICB0aGlzLmNvbXBsZXRlZCA9IGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBtZXNzYWdlIGZyb20gdGhlIGNsaWVudCAtIHdpbGwgcmV0dXJuIG51bGwgaWYgdGhlIHJlcXVlc3RlZAotICAgICAqIG1lc3NhZ2UgaXMgbm90IGF2YWlsYWJsZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXNzYWdlTGFiZWwgdGhlIG1lc3NhZ2UgbGFiZWwgb2YgdGhlIGRlc2lyZWQgbWVzc2FnZSBjb250ZXh0Ci0gICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBkZXNpcmVkIG1lc3NhZ2UgY29udGV4dCBvciBudWxsIGlmIGl0cyBub3QgYXZhaWxhYmxlLgotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0IGlmIHRoZSBtZXNzYWdlIGxhYmVsIGlzIGludmFsaWQKLSAgICAgKi8KLSAgICBwdWJsaWMgTWVzc2FnZUNvbnRleHQgZ2V0TWVzc2FnZUNvbnRleHQoU3RyaW5nIG1lc3NhZ2VMYWJlbCkKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBpZiAobWVzc2FnZUxhYmVsLmVxdWFscyhXU0RMQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfT1VUX1ZBTFVFKSkgewotICAgICAgICAgICAgcmV0dXJuIG1jOwotICAgICAgICB9Ci0gICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoTWVzc2FnZXMuZ2V0TWVzc2FnZSgidW5rbm93bk1zZ0xhYmVsIiwgbWVzc2FnZUxhYmVsKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbWVzc2FnZSByZWNlaXZlciB0byBiZSBleGVjdXRlZCB3aGVuIGEgbWVzc2FnZSBjb21lcyBpbnRvIHRoZSBNRVAKLSAgICAgKiBhbmQgdGhlIE1FUCBpcyBleGVjdXRlZC4gVGhpcyBpcyB0aGUgd2F5IHRoZSBNRVAgY2xpZW50IHByb3ZpZGVzCi0gICAgICogbm90aWZpY2F0aW9uIHRoYXQgYSBtZXNzYWdlIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IGl0LiBFeGFjdGx5IHdoZW4gaXRzCi0gICAgICogZXhlY3V0ZWQgYW5kIHVuZGVyIHdoYXQgY29uZGl0aW9ucyBpcyBhIGZ1bmN0aW9uIG9mIHRoZSBzcGVjaWZpYyBNRVAKLSAgICAgKiBjbGllbnQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q2FsbGJhY2soQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICJUaGlzIGZlYXR1cmUgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIE1FUCIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEV4ZWN1dGVzIHRoZSBNRVAuIFdoYXQgdGhpcyBkb2VzIGRlcGVuZHMgb24gdGhlIHNwZWNpZmljIE1FUCBjbGllbnQuIFRoZQotICAgICAqIGJhc2ljIGlkZWEgaXMgdG8gaGF2ZSB0aGUgTUVQIGNsaWVudCBleGVjdXRlIGFuZCBkbyBzb21ldGhpbmcgd2l0aCB0aGUKLSAgICAgKiBtZXNzYWdlcyB0aGF0IGhhdmUgYmVlbiBhZGRlZCB0byBpdCBzbyBmYXIuIEZvciBleGFtcGxlLCBpZiBpdHMgYW4gT3V0LUluCi0gICAgICogTUVQLCB0aGVuIGlmIHRoZSBPdXQgbWVzc2FnZSBoYXMgYmVlbiBzZXQsIHRoZW4gZXhlY3V0aW5nIHRoZSBjbGllbnQgYXNrcwotICAgICAqIGl0IHRvIHNlbmQgdGhlIG1lc3NhZ2UgYW5kIGdldCB0aGUgSW4gbWVzc2FnZSwgcG9zc2libHkgdXNpbmcgYSBkaWZmZXJlbnQKLSAgICAgKiB0aHJlYWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYmxvY2sgSW5kaWNhdGVzIHdoZXRoZXIgZXhlY3V0aW9uIHNob3VsZCBibG9jayBvciByZXR1cm4gQVNBUC4gV2hhdAotICAgICAqICAgICAgICAgICAgICBibG9jayBtZWFucyBpcyBvZiBjb3Vyc2UgYSBmdW5jdGlvbiBvZiB0aGUgc3BlY2lmaWMgTUVQCi0gICAgICogICAgICAgICAgICAgIGNsaWVudC4gSUdOT1JFRCBCWSBUSElTIE1FUCBDTElFTlQuCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQgaWYgc29tZXRoaW5nIGdvZXMgd3JvbmcgZHVyaW5nIHRoZSBleGVjdXRpb24gb2YgdGhlIE1FUC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlSW1wbChib29sZWFuIGJsb2NrKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgaWYgKGNvbXBsZXRlZCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdChNZXNzYWdlcy5nZXRNZXNzYWdlKCJtZXBpc2NvbXBsdGVkIikpOwotICAgICAgICB9Ci0gICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNjID0gc2MuZ2V0Q29uZmlndXJhdGlvbkNvbnRleHQoKTsKLSAgICAgICAgcHJlcGFyZU1lc3NhZ2VDb250ZXh0KGNjLCBtYyk7Ci0KLSAgICAgICAgLy9BcyB0aGlzIGlzIGFuIG91dC1vbmx5IE1FUCB3ZSBleHBsaWNpdGx5IGFkZCBhIG1vcmUgc2Vuc2libGUgZGVmYXVsdCBmb3IKLSAgICAgICAgLy90aGUgcmVwbHlUbywgaWYgcmVxdWlyZWQuIFdlIGFsc28gbmVlZCB0byBlbnN1cmUgdGhhdCBpZiB0aGUgcmVwbHlUbyBFUFIKLSAgICAgICAgLy9oYXMgYW4gYW5vbnltb3VzIGFkZHJlc3MgYW5kIHJlZmVyZW5jZSBwYXJhbWV0ZXJzIHRoYXQgaXQgZ2V0cyBmbG93ZWQKLSAgICAgICAgLy9hY3Jvc3MgdGhlIHdpcmUuCi0gICAgICAgIEVuZHBvaW50UmVmZXJlbmNlIGVwciA9IG1jLmdldFJlcGx5VG8oKTsKLSAgICAgICAgaWYgKGVwciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtYy5zZXRSZXBseVRvKG5ldyBFbmRwb2ludFJlZmVyZW5jZShGaW5hbC5XU0FfTk9ORV9VUkkpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChlcHIuaXNXU0FkZHJlc3NpbmdBbm9ueW1vdXMoKSAmJiBlcHIuZ2V0QWxsUmVmZXJlbmNlUGFyYW1ldGVycygpICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1jLnNldFByb3BlcnR5KEFkZHJlc3NpbmdDb25zdGFudHMuSU5DTFVERV9PUFRJT05BTF9IRUFERVJTLCBCb29sZWFuLlRSVUUpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBjcmVhdGUgdGhlIG9wZXJhdGlvbiBjb250ZXh0IGZvciBteXNlbGYKLSAgICAgICAgT3BlcmF0aW9uQ29udGV4dCBvYyA9IHNjLmNyZWF0ZU9wZXJhdGlvbkNvbnRleHQoYXhpc09wKTsKLSAgICAgICAgb2MuYWRkTWVzc2FnZUNvbnRleHQobWMpOwotICAgICAgICAKLSAgICAgICAgLy8gaGVyZSB3ZSBzaG91bGQgbm90IHNldCBpdCBhcyBOT04gYmxva2luZy4gaWYgbmVlZGVkIHRoZW4gdXNlciBjYW4gZG8KLSAgICAgICAgLy8gaXQuIGlmIGFsbCB0aGUgc2VuZGVycyBpbnZva2UgaW4gYSBkaWZmZXJlbnQgdGhyZWFkcyB0aGVuIGl0IGNhdXNlcwotICAgICAgICAvLyBhIHBlcmZvcm1hbmNlIHByb2JsZW0gd2hlbiB1c2luZyBhIE11bHRpVGhyZWFkZWRIdHRwQ29ubmVjdGlvbk1hbmFnZXIKLSAgICAgICAgCi0gICAgICAgIEF4aXNFbmdpbmUuc2VuZChtYyk7Ci0gICAgICAgIC8vIGFsbCBkb25lCi0gICAgICAgIGNvbXBsZXRlZCA9IHRydWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL1BhcmFtZXRlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL1BhcmFtZXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGI1ZDIzLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9QYXJhbWV0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5idWlsZGVyLlN0QVhPTUJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LmV4dGVybmFsaXplLkV4dGVybmFsaXplQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5leHRlcm5hbGl6ZS5TYWZlT2JqZWN0SW5wdXRTdHJlYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LmV4dGVybmFsaXplLlNhZmVPYmplY3RPdXRwdXRTdHJlYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LmV4dGVybmFsaXplLlNhZmVTZXJpYWxpemFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTElucHV0RmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRXh0ZXJuYWxpemFibGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0OwotaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0OwotCi0KLS8qKgotICogQ2xhc3MgUGFyYW1ldGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBQYXJhbWV0ZXIgaW1wbGVtZW50cyBFeHRlcm5hbGl6YWJsZSwgU2FmZVNlcmlhbGl6YWJsZSB7Ci0KLSAgICAvKgotICAgICAqIHNldHVwIGZvciBsb2dnaW5nCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFBhcmFtZXRlci5jbGFzcyk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgbXlDbGFzc05hbWUgPSAiUGFyYW1ldGVyIjsKLQotICAgIC8qKgotICAgICAqIEBzZXJpYWwgVGhlIHNlcmlhbGl6YXRpb24gdmVyc2lvbiBJRCB0cmFja3MgdGhlIHZlcnNpb24gb2YgdGhlIGNsYXNzLgotICAgICAqIElmIGEgY2xhc3MgZGVmaW5pdGlvbiBjaGFuZ2VzLCB0aGVuIHRoZSBzZXJpYWxpemF0aW9uL2V4dGVybmFsaXphdGlvbgotICAgICAqIG9mIHRoZSBjbGFzcyBpcyBhZmZlY3RlZC4gSWYgYSBjaGFuZ2UgdG8gdGhlIGNsYXNzIGlzIG1hZGUgd2hpY2ggaXMKLSAgICAgKiBub3QgY29tcGF0aWJsZSB3aXRoIHRoZSBzZXJpYWxpemF0aW9uL2V4dGVybmFsaXphdGlvbiBvZiB0aGUgY2xhc3MsCi0gICAgICogdGhlbiB0aGUgc2VyaWFsaXphdGlvbiB2ZXJzaW9uIElEIHNob3VsZCBiZSB1cGRhdGVkLgotICAgICAqIFJlZmVyIHRvIHRoZSAic2VyaWFsVmVyIiB1dGlsaXR5IHRvIGNvbXB1dGUgYSBzZXJpYWxpemF0aW9uCi0gICAgICogdmVyc2lvbiBJRC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNjYwMTY2NDIwMDY3MzA2MzUzMUw7Ci0KLSAgICAvKioKLSAgICAgKiBAc2VyaWFsIFRyYWNrcyB0aGUgcmV2aXNpb24gbGV2ZWwgb2YgYSBjbGFzcyB0byBpZGVudGlmeSBjaGFuZ2VzIHRvIHRoZQotICAgICAqIGNsYXNzIGRlZmluaXRpb24gdGhhdCBhcmUgY29tcGF0aWJsZSB0byBzZXJpYWxpemF0aW9uL2V4dGVybmFsaXphdGlvbi4KLSAgICAgKiBJZiBhIGNsYXNzIGRlZmluaXRpb24gY2hhbmdlcywgdGhlbiB0aGUgc2VyaWFsaXphdGlvbi9leHRlcm5hbGl6YXRpb24KLSAgICAgKiBvZiB0aGUgY2xhc3MgaXMgYWZmZWN0ZWQuCi0gICAgICogUmVmZXIgdG8gdGhlIHdyaXRlRXh0ZXJuYWwoKSBhbmQgcmVhZEV4dGVybmFsKCkgbWV0aG9kcy4KLSAgICAgKi8KLSAgICAvLyBzdXBwb3J0ZWQgcmV2aXNpb24gbGV2ZWxzLCBhZGQgYSBuZXcgbGV2ZWwgdG8gbWFuYWdlIGNvbXBhdGlibGUgY2hhbmdlcwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRVZJU0lPTl8yID0gMjsKLSAgICAvLyBjdXJyZW50IHJldmlzaW9uIGxldmVsIG9mIHRoaXMgb2JqZWN0Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IHJldmlzaW9uSUQgPSBSRVZJU0lPTl8yOwotCi0KLSAgICAvKioKLSAgICAgKiBGaWVsZCAgQU5ZX1BBUkFNRVRFUgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEFOWV9QQVJBTUVURVIgPSAwOwotICAgIC8qKgotICAgICAqIEZpZWxkIFRFWFRfUEFSQU1FVEVSCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgVEVYVF9QQVJBTUVURVIgPSAxOwotCi0gICAgLyoqCi0gICAgICogRmllbGQgT01fUEFSQU1FVEVSCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgT01fUEFSQU1FVEVSID0gMjsKLQotICAgIC8qKgotICAgICAqIEZpZWxkIHR5cGUKLSAgICAgKi8KLSAgICBwcml2YXRlIGludCB0eXBlID0gVEVYVF9QQVJBTUVURVI7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBsb2NrZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gbG9ja2VkOwotCi0gICAgLyoqCi0gICAgICogRmllbGQgbmFtZQotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0KLSAgICAvKioKLSAgICAgKiB0byBzdG9yZSB0aGUgcGFyYW1ldGVyIGVsZW1lbnQKLSAgICAgKiA8cGFyYW1ldGVyIG5hbWU9IlNlcnZpY2VDbGFzczEiPgotICAgICAqIG9yZy5hcGFjaGUuYXhpczIuc2FtcGxlLmVjaG8uRWNob0ltcGw8L3BhcmFtZXRlcj4KLSAgICAgKi8KLSAgICBwcml2YXRlIE9NRWxlbWVudCBwYXJhbWV0ZXJFbGVtZW50OwotCi0gICAgLyoqCi0gICAgICogRmllbGQgdmFsdWUKLSAgICAgKi8KLSAgICBwcml2YXRlIE9iamVjdCB2YWx1ZTsKLSAgICAKLSAgICBwcml2YXRlIGJvb2xlYW4gX3RyYW5zaWVudDsgIC8vIEluZGljYXRlcyB0aGF0IHRoZSBwYXJhbWV0ZXIgaXMgdHJhbnNpZW50IChub3QgcGVyc2lzdGVkKQotCi0gICAgLy9UbyBjaGVjayB3aGV0aGVyIHRoZSBwYXJhbWV0ZXIgaXMgZWRpdGFibGUgb3Igbm90ICwKLSAgICAvLyBpZiB0aGUgdmFsdWUgaXMgZmFsc2UgdGhlbiBubyBvbmUgY2FuIGNhbGwgc2V0dmFsdWUKLSAgICAvLyBUT0RPCi0gICAgLy8gQ3VycmVudGx5IHRoZSBlZGl0YWJsZSBmaWVsZCBpcyBub3QgcGVyc2lzdGVkLiBUaGlzIHNlZW1zIGxpa2UgYSBwcm9ibGVtLgotICAgIHByaXZhdGUgYm9vbGVhbiBlZGl0YWJsZSA9IHRydWU7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgUGFyYW1ldGVyKCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIGZyb20gbmFtZSBhbmQgdmFsdWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZQotICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqLwotICAgIHB1YmxpYyBQYXJhbWV0ZXIoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSkgewotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7Ci0gICAgICAgIHBhcnNlVmFsdWVGb3JUeXBlKHRoaXMudmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ldGhvZCBnZXROYW1lLgotICAgICAqCi0gICAgICogQHJldHVybiBSZXR1cm5zIFN0cmluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBPTUVsZW1lbnQgZ2V0UGFyYW1ldGVyRWxlbWVudCgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucGFyYW1ldGVyRWxlbWVudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgZ2V0UGFyYW1ldGVyVHlwZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gUmV0dXJucyBpbnQuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRQYXJhbWV0ZXJUeXBlKCkgewotICAgICAgICByZXR1cm4gdHlwZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgZ2V0VmFsdWUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgT2JqZWN0LgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgaXNMb2NrZWQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgYm9vbGVhbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0xvY2tlZCgpIHsKLSAgICAgICAgcmV0dXJuIGxvY2tlZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2Qgc2V0TG9ja2VkLgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TG9ja2VkKGJvb2xlYW4gdmFsdWUpIHsKLSAgICAgICAgbG9ja2VkID0gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWV0aG9kIHNldE5hbWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJhbWV0ZXJFbGVtZW50KE9NRWxlbWVudCBlbGVtZW50KSB7Ci0gICAgICAgIHRoaXMucGFyYW1ldGVyRWxlbWVudCA9IGVsZW1lbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGFyYW1ldGVyVHlwZShpbnQgdHlwZSkgewotICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ldGhvZCBzZXRWYWx1ZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKE9iamVjdCB2YWx1ZSkgewotICAgICAgICBpZighZWRpdGFibGUpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiUGFyYW1ldGVyICIgICsgZ2V0TmFtZSgpICsgIiAgY2FuIG5vdCBiZSBlZGl0Iik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgcGFyc2VWYWx1ZUZvclR5cGUodmFsdWUpOwotICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIHB1cnBvc2Ugb2YgdGhpcyBtZXRob2QgaXMgdG8gcGFycyB0aGUgaW5qZWN0ZWQgdmFsdWUgZm9yIGl0cyB0eXBlLgotICAgICAqIFR5cGUgd2lsbCBiZSBzZXQgdXNpbmcgc2V0UGFyYW1ldGVyVHlwZS4KLSAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcGFyc2VWYWx1ZUZvclR5cGUoT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotICAgICAgICAgICAgc2V0UGFyYW1ldGVyVHlwZShURVhUX1BBUkFNRVRFUik7Ci0gICAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBPTUVsZW1lbnQpIHsKLSAgICAgICAgICAgIHNldFBhcmFtZXRlclR5cGUoT01fUEFSQU1FVEVSKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNldFBhcmFtZXRlclR5cGUoQU5ZX1BBUkFNRVRFUik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gIlBhcmFtZXRlciA6ICIgKyBuYW1lICsgIj0iICsgdmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLSAgICAgICAgaWYgKHRoaXMgPT0gb2JqKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgUGFyYW1ldGVyKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChQYXJhbWV0ZXIpIG9iaikubmFtZS5lcXVhbHMobmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgIHJldHVybiBuYW1lLmhhc2hDb2RlKCk7Ci0gICAgfQotCi0gICAgLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgKiBFeHRlcm5hbGl6YWJsZSBzdXBwb3J0Ci0gICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAqLwotCi0KLSAgICAvKioKLSAgICAgKiBTYXZlIHRoZSBjb250ZW50cyBvZiB0aGlzIG9iamVjdC4KLSAgICAgKiA8cC8+Ci0gICAgICogTk9URTogVHJhbnNpZW50IGZpZWxkcyBhbmQgc3RhdGljIGZpZWxkcyBhcmUgbm90IHNhdmVkLgotICAgICAqIEFsc28sIG9iamVjdHMgdGhhdCByZXByZXNlbnQgInN0YXRpYyIgZGF0YSBhcmUKLSAgICAgKiBub3Qgc2F2ZWQsIGV4Y2VwdCBmb3IgZW5vdWdoIGluZm9ybWF0aW9uIHRvIGJlCi0gICAgICogYWJsZSB0byBmaW5kIG1hdGNoaW5nIG9iamVjdHMgd2hlbiB0aGUgbWVzc2FnZQotICAgICAqIGNvbnRleHQgaXMgcmUtY29uc3RpdHV0ZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb3V0IFRoZSBzdHJlYW0gdG8gd3JpdGUgdGhlIG9iamVjdCBjb250ZW50cyB0bwotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUV4dGVybmFsKE9iamVjdE91dHB1dCBvKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBTYWZlT2JqZWN0T3V0cHV0U3RyZWFtIG91dCA9IFNhZmVPYmplY3RPdXRwdXRTdHJlYW0uaW5zdGFsbChvKTsKLSAgICAgICAgCi0gICAgICAgIC8vIERvbid0IHdyaXRlIG91dCB0cmFuc2llbnQgcGFyYW1ldGVycwotICAgICAgICBpZiAodGhpcy5pc1RyYW5zaWVudCgpKSB7Ci0gICAgICAgICAgICByZXR1cm47ICAKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gd3JpdGUgb3V0IGNvbnRlbnRzIG9mIHRoaXMgb2JqZWN0Ci0KLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gaW4gb3JkZXIgdG8gaGFuZGxlIGZ1dHVyZSBjaGFuZ2VzIHRvIHRoZSBtZXNzYWdlCi0gICAgICAgIC8vIGNvbnRleHQgZGVmaW5pdGlvbiwgYmUgc3VyZSB0byBtYWludGFpbiB0aGUKLSAgICAgICAgLy8gb2JqZWN0IGxldmVsIGlkZW50aWZpZXJzCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIHNlcmlhbGl6YXRpb24gdmVyc2lvbiBJRAotICAgICAgICBvdXQud3JpdGVMb25nKHNlcmlhbFZlcnNpb25VSUQpOwotCi0gICAgICAgIC8vIHJldmlzaW9uIElECi0gICAgICAgIG91dC53cml0ZUludChyZXZpc2lvbklEKTsKLQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBzaW1wbGUgZmllbGRzCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgb3V0LndyaXRlSW50KHR5cGUpOwotICAgICAgICBvdXQud3JpdGVCb29sZWFuKGxvY2tlZCk7Ci0gICAgICAgIG91dC53cml0ZU9iamVjdChuYW1lKTsKLQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBvYmplY3QgZmllbGRzCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgLy8gVE9ETzogaW52ZXN0aWdhdGUgc2VyaWFsaXppbmcgdGhlIE9NRWxlbWVudCBtb3JlIGVmZmljaWVudGx5Ci0gICAgICAgIC8vIFRoaXMgY3VycmVudGx5IHdpbGwgYmFzaWNhbGx5IHNlcmlhbGl6ZSB0aGUgZ2l2ZW4gT01FbGVtZW50Ci0gICAgICAgIC8vIHRvIGEgU3RyaW5nIGJ1dCB3aWxsIGJ1aWxkIHRoZSBPTVRyZWUgaW4gdGhlIG1lbW9yeQotCi0gICAgICAgIFN0cmluZyB0bXAgPSBudWxsOwotCi0gICAgICAgIGlmIChwYXJhbWV0ZXJFbGVtZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRtcCA9IHBhcmFtZXRlckVsZW1lbnQudG9TdHJpbmcoKTsKLSAgICAgICAgfQotICAgICAgICBvdXQud3JpdGVPYmplY3QodG1wKTsgLy8gcGFyYW1ldGVyRWxlbWVudAotICAgICAgICBvdXQud3JpdGVPYmplY3QodmFsdWUpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogUmVzdG9yZSB0aGUgY29udGVudHMgb2YgdGhlIG9iamVjdCB0aGF0IHdhcyBwcmV2aW91c2x5IHNhdmVkLgotICAgICAqIDxwLz4KLSAgICAgKiBOT1RFOiBUaGUgZmllbGQgZGF0YSBtdXN0IHJlYWQgYmFjayBpbiB0aGUgc2FtZSBvcmRlciBhbmQgdHlwZQotICAgICAqIGFzIGl0IHdhcyB3cml0dGVuLiAgU29tZSBkYXRhIHdpbGwgbmVlZCB0byBiZSB2YWxpZGF0ZWQgd2hlbgotICAgICAqIHJlc3VycmVjdGVkLgotICAgICAqCi0gICAgICogQHBhcmFtIGluIFRoZSBzdHJlYW0gdG8gcmVhZCB0aGUgb2JqZWN0IGNvbnRlbnRzIGZyb20KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVhZEV4dGVybmFsKE9iamVjdElucHV0IGluT2JqZWN0KSB0aHJvd3MgSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICBTYWZlT2JqZWN0SW5wdXRTdHJlYW0gaW4gPSBTYWZlT2JqZWN0SW5wdXRTdHJlYW0uaW5zdGFsbChpbk9iamVjdCk7Ci0gICAgICAgIC8vIHRyYWNlIHBvaW50Ci0gICAgICAgIGlmIChsb2cuaXNUcmFjZUVuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLnRyYWNlKG15Q2xhc3NOYW1lICsgIjpyZWFkRXh0ZXJuYWwoKTogIEJFR0lOICBieXRlcyBhdmFpbGFibGUgaW4gc3RyZWFtIFsiICsKLSAgICAgICAgICAgICAgICAgICAgaW4uYXZhaWxhYmxlKCkgKyAiXSAgIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBzZXJpYWxpemF0aW9uIHZlcnNpb24gSUQKLSAgICAgICAgbG9uZyBzdWlkID0gaW4ucmVhZExvbmcoKTsKLQotICAgICAgICAvLyByZXZpc2lvbiBJRAotICAgICAgICBpbnQgcmV2SUQgPSBpbi5yZWFkSW50KCk7Ci0KLSAgICAgICAgLy8gbWFrZSBzdXJlIHRoZSBvYmplY3QgZGF0YSBpcyBpbiBhIHZlcnNpb24gd2UgY2FuIGhhbmRsZQotICAgICAgICBpZiAoc3VpZCAhPSBzZXJpYWxWZXJzaW9uVUlEKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbihFeHRlcm5hbGl6ZUNvbnN0YW50cy5VTlNVUFBPUlRFRF9TVUlEKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIG1ha2Ugc3VyZSB0aGUgb2JqZWN0IGRhdGEgaXMgaW4gYSByZXZpc2lvbiBsZXZlbCB3ZSBjYW4gaGFuZGxlCi0gICAgICAgIGlmIChyZXZJRCAhPSBSRVZJU0lPTl8yKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbihFeHRlcm5hbGl6ZUNvbnN0YW50cy5VTlNVUFBPUlRFRF9SRVZJRCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBzaW1wbGUgZmllbGRzCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgdHlwZSA9IGluLnJlYWRJbnQoKTsKLSAgICAgICAgbG9ja2VkID0gaW4ucmVhZEJvb2xlYW4oKTsKLSAgICAgICAgbmFtZSA9IChTdHJpbmcpIGluLnJlYWRPYmplY3QoKTsKLQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBvYmplY3QgZmllbGRzCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgLy8gVE9ETzogaW52ZXN0aWdhdGUgc2VyaWFsaXppbmcgdGhlIE9NRWxlbWVudCBtb3JlIGVmZmljaWVudGx5Ci0gICAgICAgIC8vIFRoaXMgY3VycmVudGx5IHdpbGwgYmFzaWNhbGx5IHNlcmlhbGl6ZSB0aGUgZ2l2ZW4gT01FbGVtZW50Ci0gICAgICAgIC8vIHRvIGEgU3RyaW5nIGJ1dCB3aWxsIGJ1aWxkIHRoZSBPTVRyZWUgaW4gdGhlIG1lbW9yeQotCi0gICAgICAgIC8vIHRyZWF0IGFzIGFuIG9iamVjdCwgZG9uJ3QgZG8gVVRGCi0gICAgICAgIFN0cmluZyB0bXAgPSAoU3RyaW5nKSBpbi5yZWFkT2JqZWN0KCk7Ci0KLSAgICAgICAgLy8gY29udmVydCB0byBhbiBPTUVsZW1lbnQKLSAgICAgICAgaWYgKHRtcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGJhaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0odG1wLmdldEJ5dGVzKCkpOwotCi0gICAgICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHBhcnNlciA9IFhNTElucHV0RmFjdG9yeS5uZXdJbnN0YW5jZSgpLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihiYWlzKTsKLQotICAgICAgICAgICAgICAgIC8vIFRPRE86IHRoZSBTdEFYT01CdWlsZGVyIGlzIGFuIGltcGwgY2xhc3MgLSBpcyB0aGVyZSBhIGJldHRlciBtZWNoYW5pc20gcmF0aGVyIHRoYW4gYW4gaW1wbCBjbGFzcyA/Ci0gICAgICAgICAgICAgICAgU3RBWE9NQnVpbGRlciBidWlsZGVyID0gbmV3IFN0QVhPTUJ1aWxkZXIoT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCksIHBhcnNlcik7Ci0KLSAgICAgICAgICAgICAgICBPTUVsZW1lbnQgZG9jRWxlbWVudCA9IGJ1aWxkZXIuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZG9jRWxlbWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlckVsZW1lbnQgPSBkb2NFbGVtZW50OwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGVycm9yIGhhbmRsaW5nIGlmIGNhbid0IGNyZWF0ZSBhbiBPTUVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyRWxlbWVudCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleGMpIHsKLSAgICAgICAgICAgICAgICAvLyBUT0RPOiBlcnJvciBoYW5kbGluZyBpZiBjYW4ndCBjcmVhdGUgYW4gT01FbGVtZW50Ci0gICAgICAgICAgICAgICAgcGFyYW1ldGVyRWxlbWVudCA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwYXJhbWV0ZXJFbGVtZW50ID0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFRPRE86IGVycm9yIGhhbmRsaW5nIGlmIHRoaXMgY2FuJ3QgYmUgc2VyaWFsaXplZAotICAgICAgICB2YWx1ZSA9IGluLnJlYWRPYmplY3QoKTsKLQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBkb25lCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICB9Ci0KLQotICAgIHB1YmxpYyB2b2lkIHNldEVkaXRhYmxlKGJvb2xlYW4gZWRpdGFibGUpIHsKLSAgICAgICAgdGhpcy5lZGl0YWJsZSA9IGVkaXRhYmxlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzVHJhbnNpZW50KCkgewotICAgICAgICByZXR1cm4gX3RyYW5zaWVudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRUcmFuc2llbnQoYm9vbGVhbiBfdHJhbnNpZW50KSB7Ci0gICAgICAgIHRoaXMuX3RyYW5zaWVudCA9IF90cmFuc2llbnQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL1BhcmFtZXRlckluY2x1ZGUuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9QYXJhbWV0ZXJJbmNsdWRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlN2M3YWYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL1BhcmFtZXRlckluY2x1ZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi0vKioKLSAqIEludGVyZmFjZSBQYXJhbWV0ZXJJbmNsdWRlCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUGFyYW1ldGVySW5jbHVkZSB7Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgYWRkUGFyYW1ldGVyLgotICAgICAqCi0gICAgICogQHBhcmFtIHBhcmFtCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkUGFyYW1ldGVyKFBhcmFtZXRlciBwYXJhbSkgdGhyb3dzIEF4aXNGYXVsdDsKLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVBhcmFtZXRlcihQYXJhbWV0ZXIgcGFyYW0pIHRocm93cyBBeGlzRmF1bHQ7Ci0KLSAgICBwdWJsaWMgdm9pZCBkZXNlcmlhbGl6ZVBhcmFtZXRlcnMoT01FbGVtZW50IHBhcmFtZXRlckVsZW1lbnQpIHRocm93cyBBeGlzRmF1bHQ7Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgZ2V0UGFyYW1ldGVyLgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgUGFyYW1ldGVyLgotICAgICAqLwotICAgIHB1YmxpYyBQYXJhbWV0ZXIgZ2V0UGFyYW1ldGVyKFN0cmluZyBuYW1lKTsKLQotICAgIC8qKgotICAgICAqIEdldHMgYWxsIHRoZSBwYXJhbWV0ZXJzIGluIGEgZ2l2ZW4gZGVzY3JpcHRpb24uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgQXJyYXlMaXN0LgotICAgICAqLwotICAgIEFycmF5TGlzdDxQYXJhbWV0ZXI+IGdldFBhcmFtZXRlcnMoKTsKLQotICAgIC8qKgotICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBwYXJhbWV0ZXIgaXMgbG9ja2VkIGF0IGFueSBsZXZlbC4KLSAgICAgKi8KLSAgICBib29sZWFuIGlzUGFyYW1ldGVyTG9ja2VkKFN0cmluZyBwYXJhbWV0ZXJOYW1lKTsKLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9QYXJhbWV0ZXJJbmNsdWRlSW1wbC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL1BhcmFtZXRlckluY2x1ZGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxZTc1ZjEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL1BhcmFtZXRlckluY2x1ZGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQXR0cmlidXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5leHRlcm5hbGl6ZS5FeHRlcm5hbGl6ZUNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuZXh0ZXJuYWxpemUuU2FmZU9iamVjdElucHV0U3RyZWFtOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5leHRlcm5hbGl6ZS5TYWZlT2JqZWN0T3V0cHV0U3RyZWFtOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5leHRlcm5hbGl6ZS5TYWZlU2VyaWFsaXphYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC5EZXBsb3ltZW50Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5KYXZhVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLlV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZhLmlvLkV4dGVybmFsaXphYmxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dDsKLWltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotLyoqCi0gKiBDbGFzcyBQYXJhbWV0ZXJJbmNsdWRlSW1wbAotICovCi1wdWJsaWMgY2xhc3MgUGFyYW1ldGVySW5jbHVkZUltcGwgCi0gICAgaW1wbGVtZW50cyBQYXJhbWV0ZXJJbmNsdWRlLCBFeHRlcm5hbGl6YWJsZSwgU2FmZVNlcmlhbGl6YWJsZSB7Ci0KLSAgICAvKgotICAgICAqIHNldHVwIGZvciBsb2dnaW5nCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFBhcmFtZXRlckluY2x1ZGVJbXBsLmNsYXNzKTsKLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIERFQlVHX0VOQUJMRUQgPSBsb2cuaXNUcmFjZUVuYWJsZWQoKTsKLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIERFQlVHX1BST1BFUlRZX1NFVCA9IGxvZy5pc0RlYnVnRW5hYmxlZCgpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIG15Q2xhc3NOYW1lID0gIlBhcmFtZXRlckluY2x1ZGVJbXBsIjsKLQotICAgIC8qKgotICAgICAqIEBzZXJpYWwgVGhlIHNlcmlhbGl6YXRpb24gdmVyc2lvbiBJRCB0cmFja3MgdGhlIHZlcnNpb24gb2YgdGhlIGNsYXNzLgotICAgICAqIElmIGEgY2xhc3MgZGVmaW5pdGlvbiBjaGFuZ2VzLCB0aGVuIHRoZSBzZXJpYWxpemF0aW9uL2V4dGVybmFsaXphdGlvbgotICAgICAqIG9mIHRoZSBjbGFzcyBpcyBhZmZlY3RlZC4gSWYgYSBjaGFuZ2UgdG8gdGhlIGNsYXNzIGlzIG1hZGUgd2hpY2ggaXMKLSAgICAgKiBub3QgY29tcGF0aWJsZSB3aXRoIHRoZSBzZXJpYWxpemF0aW9uL2V4dGVybmFsaXphdGlvbiBvZiB0aGUgY2xhc3MsCi0gICAgICogdGhlbiB0aGUgc2VyaWFsaXphdGlvbiB2ZXJzaW9uIElEIHNob3VsZCBiZSB1cGRhdGVkLgotICAgICAqIFJlZmVyIHRvIHRoZSAic2VyaWFsVmVyIiB1dGlsaXR5IHRvIGNvbXB1dGUgYSBzZXJpYWxpemF0aW9uCi0gICAgICogdmVyc2lvbiBJRC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA4MTUzNzM2NzE5MDkwMTI2ODkxTDsKLQotICAgIC8qKgotICAgICAqIEBzZXJpYWwgVHJhY2tzIHRoZSByZXZpc2lvbiBsZXZlbCBvZiBhIGNsYXNzIHRvIGlkZW50aWZ5IGNoYW5nZXMgdG8gdGhlCi0gICAgICogY2xhc3MgZGVmaW5pdGlvbiB0aGF0IGFyZSBjb21wYXRpYmxlIHRvIHNlcmlhbGl6YXRpb24vZXh0ZXJuYWxpemF0aW9uLgotICAgICAqIElmIGEgY2xhc3MgZGVmaW5pdGlvbiBjaGFuZ2VzLCB0aGVuIHRoZSBzZXJpYWxpemF0aW9uL2V4dGVybmFsaXphdGlvbgotICAgICAqIG9mIHRoZSBjbGFzcyBpcyBhZmZlY3RlZC4KLSAgICAgKiBSZWZlciB0byB0aGUgd3JpdGVFeHRlcm5hbCgpIGFuZCByZWFkRXh0ZXJuYWwoKSBtZXRob2RzLgotICAgICAqLwotICAgIC8vIHN1cHBvcnRlZCByZXZpc2lvbiBsZXZlbHMsIGFkZCBhIG5ldyBsZXZlbCB0byBtYW5hZ2UgY29tcGF0aWJsZSBjaGFuZ2VzCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFVklTSU9OXzIgPSAyOwotICAgIC8vIGN1cnJlbnQgcmV2aXNpb24gbGV2ZWwgb2YgdGhpcyBvYmplY3QKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgcmV2aXNpb25JRCA9IFJFVklTSU9OXzI7Ci0KLQotICAgIC8qKgotICAgICAqIEZpZWxkIHBhcm1ldGVycwotICAgICAqLwotICAgIHByb3RlY3RlZCBmaW5hbCBIYXNoTWFwPFN0cmluZywgUGFyYW1ldGVyPiBwYXJhbWV0ZXJzOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgUGFyYW1ldGVySW5jbHVkZUltcGwuCi0gICAgICovCi0gICAgcHVibGljIFBhcmFtZXRlckluY2x1ZGVJbXBsKCkgewotICAgICAgICBwYXJhbWV0ZXJzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBQYXJhbWV0ZXI+KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWV0aG9kIGFkZFBhcmFtZXRlcgotICAgICAqCi0gICAgICogQHBhcmFtIHBhcmFtCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkUGFyYW1ldGVyKFBhcmFtZXRlciBwYXJhbSkgewotICAgICAgICBpZiAocGFyYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgcGFyYW1ldGVycy5wdXQocGFyYW0uZ2V0TmFtZSgpLCBwYXJhbSk7Ci0gICAgICAgICAgICBpZiAoREVCVUdfRU5BQkxFRCkgewotICAgICAgICAgICAgICAgIHRoaXMuZGVidWdQYXJhbWV0ZXJBZGQocGFyYW0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlUGFyYW1ldGVyKFBhcmFtZXRlciBwYXJhbSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIHBhcmFtZXRlcnMucmVtb3ZlKHBhcmFtLmdldE5hbWUoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2luY2UgYXQgcnVudGltZSBpdCBwYXJhbWV0ZXJzIG1heSBiZSBtb2RpZmllZAotICAgICAqIHRvIGdldCB0aGUgb3JpZ2luYWwgc3RhdGUgdGhpcyBtZXRob2QgY2FuIGJlIHVzZWQKLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJzIDxjb2RlPk9NRWxlbWVudDwvY29kZT4KLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRlc2VyaWFsaXplUGFyYW1ldGVycyhPTUVsZW1lbnQgcGFyYW1ldGVycykgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0KLSAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLmdldENoaWxkcmVuV2l0aE5hbWUobmV3IFFOYW1lKERlcGxveW1lbnRDb25zdGFudHMuVEFHX1BBUkFNRVRFUikpOwotCi0gICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQotICAgICAgICAgICAgLy8gdGhpcyBpcyB0byBjaGVjayB3aGV0aGVyIHNvbWUgb25lIGhhcyBsb2NrZWQgdGhlIHBhcm1ldGVyIGF0IHRoZSB0b3AgbGV2ZWwKLSAgICAgICAgICAgIE9NRWxlbWVudCBwYXJhbWV0ZXJFbGVtZW50ID0gKE9NRWxlbWVudCkgaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgUGFyYW1ldGVyIHBhcmFtZXRlciA9IG5ldyBQYXJhbWV0ZXIoKTsKLQotICAgICAgICAgICAgLy8gc2V0dGluZyBwYXJhbWV0ZXJFbGVtZW50Ci0gICAgICAgICAgICBwYXJhbWV0ZXIuc2V0UGFyYW1ldGVyRWxlbWVudChwYXJhbWV0ZXJFbGVtZW50KTsKLQotICAgICAgICAgICAgLy8gc2V0dGluZyBwYXJhbWV0ZXIgTmFtZQotICAgICAgICAgICAgT01BdHRyaWJ1dGUgcGFyYU5hbWUgPQotICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJFbGVtZW50LmdldEF0dHJpYnV0ZShuZXcgUU5hbWUoRGVwbG95bWVudENvbnN0YW50cy5BVFRSSUJVVEVfTkFNRSkpOwotCi0gICAgICAgICAgICBwYXJhbWV0ZXIuc2V0TmFtZShwYXJhTmFtZS5nZXRBdHRyaWJ1dGVWYWx1ZSgpKTsKLQotICAgICAgICAgICAgLy8gc2V0dGluZyBwYXJhbWV0ZXIgVmFsdWUgKHRoZSBjaGlsZCBlbGVtZW50IG9mIHRoZSBwYXJhbWV0ZXIpCi0gICAgICAgICAgICBPTUVsZW1lbnQgcGFyYVZhbHVlID0gcGFyYW1ldGVyRWxlbWVudC5nZXRGaXJzdEVsZW1lbnQoKTsKLQotICAgICAgICAgICAgaWYgKHBhcmFWYWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcGFyYW1ldGVyLnNldFZhbHVlKHBhcmFtZXRlckVsZW1lbnQpOwotICAgICAgICAgICAgICAgIHBhcmFtZXRlci5zZXRQYXJhbWV0ZXJUeXBlKFBhcmFtZXRlci5PTV9QQVJBTUVURVIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcGFyYXRleHRWYWx1ZSA9IHBhcmFtZXRlckVsZW1lbnQuZ2V0VGV4dCgpOwotCi0gICAgICAgICAgICAgICAgcGFyYW1ldGVyLnNldFZhbHVlKHBhcmF0ZXh0VmFsdWUpOwotICAgICAgICAgICAgICAgIHBhcmFtZXRlci5zZXRQYXJhbWV0ZXJUeXBlKFBhcmFtZXRlci5URVhUX1BBUkFNRVRFUik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHNldHRpbmcgbG9ja2luZyBhdHRyaWJ1dGUKLSAgICAgICAgICAgIE9NQXR0cmlidXRlIHBhcmFMb2NrZWQgPQotICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJFbGVtZW50LmdldEF0dHJpYnV0ZShuZXcgUU5hbWUoRGVwbG95bWVudENvbnN0YW50cy5BVFRSSUJVVEVfTE9DS0VEKSk7Ci0KLSAgICAgICAgICAgIGlmIChwYXJhTG9ja2VkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbG9ja2VkVmFsdWUgPSBwYXJhTG9ja2VkLmdldEF0dHJpYnV0ZVZhbHVlKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoInRydWUiLmVxdWFscyhsb2NrZWRWYWx1ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyLnNldExvY2tlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIuc2V0TG9ja2VkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGFkZFBhcmFtZXRlcihwYXJhbWV0ZXIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWV0aG9kIGdldFBhcmFtZXRlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lCi0gICAgICogQHJldHVybiBSZXR1cm5zIHBhcmFtZXRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgUGFyYW1ldGVyIGdldFBhcmFtZXRlcihTdHJpbmcgbmFtZSkgewotICAgICAgICByZXR1cm4gKFBhcmFtZXRlcikgcGFyYW1ldGVycy5nZXQobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIEFycmF5TGlzdDxQYXJhbWV0ZXI+IGdldFBhcmFtZXRlcnMoKSB7Ci0gICAgICAgIENvbGxlY3Rpb248UGFyYW1ldGVyPiBjb2wgPSBwYXJhbWV0ZXJzLnZhbHVlcygpOwotICAgICAgICBBcnJheUxpc3Q8UGFyYW1ldGVyPiBwYXJhX2xpc3QgPSBuZXcgQXJyYXlMaXN0PFBhcmFtZXRlcj4oKTsKLQotICAgICAgICBmb3IgKEl0ZXJhdG9yPFBhcmFtZXRlcj4gaXRlcmF0b3IgPSBjb2wuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgUGFyYW1ldGVyIHBhcmFtZXRlciA9IChQYXJhbWV0ZXIpIGl0ZXJhdG9yLm5leHQoKTsKLQotICAgICAgICAgICAgcGFyYV9saXN0LmFkZChwYXJhbWV0ZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHBhcmFfbGlzdDsKLSAgICB9Ci0KLSAgICAvLyB0byBjaGVjayB3aGV0aGVyIHRoZSBwYXJhbWV0ZXIgaXMgbG9ja2VkIGF0IGFueSBsZXZlbAotICAgIHB1YmxpYyBib29sZWFuIGlzUGFyYW1ldGVyTG9ja2VkKFN0cmluZyBwYXJhbWV0ZXJOYW1lKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgKiBFeHRlcm5hbGl6YWJsZSBzdXBwb3J0IAotICAgICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICAqLwotCi0KLSAgICAvKioKLSAgICAgKiBTYXZlIHRoZSBjb250ZW50cyBvZiB0aGlzIG9iamVjdC4KLSAgICAgKiA8cC8+Ci0gICAgICogTk9URTogVHJhbnNpZW50IGZpZWxkcyBhbmQgc3RhdGljIGZpZWxkcyBhcmUgbm90IHNhdmVkLgotICAgICAqIEFsc28sIG9iamVjdHMgdGhhdCByZXByZXNlbnQgInN0YXRpYyIgZGF0YSBhcmUKLSAgICAgKiBub3Qgc2F2ZWQsIGV4Y2VwdCBmb3IgZW5vdWdoIGluZm9ybWF0aW9uIHRvIGJlCi0gICAgICogYWJsZSB0byBmaW5kIG1hdGNoaW5nIG9iamVjdHMgd2hlbiB0aGUgbWVzc2FnZQotICAgICAqIGNvbnRleHQgaXMgcmUtY29uc3RpdHV0ZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb3V0IFRoZSBzdHJlYW0gdG8gd3JpdGUgdGhlIG9iamVjdCBjb250ZW50cyB0bwotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUV4dGVybmFsKE9iamVjdE91dHB1dCBvKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBTYWZlT2JqZWN0T3V0cHV0U3RyZWFtIG91dCA9IFNhZmVPYmplY3RPdXRwdXRTdHJlYW0uaW5zdGFsbChvKTsKLSAgICAgICAgLy8gd3JpdGUgb3V0IGNvbnRlbnRzIG9mIHRoaXMgb2JqZWN0Ci0KLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gaW4gb3JkZXIgdG8gaGFuZGxlIGZ1dHVyZSBjaGFuZ2VzIHRvIHRoZSBtZXNzYWdlIAotICAgICAgICAvLyBjb250ZXh0IGRlZmluaXRpb24sIGJlIHN1cmUgdG8gbWFpbnRhaW4gdGhlIAotICAgICAgICAvLyBvYmplY3QgbGV2ZWwgaWRlbnRpZmllcnMKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gc2VyaWFsaXphdGlvbiB2ZXJzaW9uIElECi0gICAgICAgIG91dC53cml0ZUxvbmcoc2VyaWFsVmVyc2lvblVJRCk7Ci0KLSAgICAgICAgLy8gcmV2aXNpb24gSUQKLSAgICAgICAgb3V0LndyaXRlSW50KHJldmlzaW9uSUQpOwotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIGNvbGxlY3Rpb24gb2YgcGFyYW1ldGVycwotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICBvdXQud3JpdGVNYXAocGFyYW1ldGVycyk7Ci0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFJlc3RvcmUgdGhlIGNvbnRlbnRzIG9mIHRoZSBvYmplY3QgdGhhdCB3YXMgcHJldmlvdXNseSBzYXZlZC4KLSAgICAgKiA8cC8+Ci0gICAgICogTk9URTogVGhlIGZpZWxkIGRhdGEgbXVzdCByZWFkIGJhY2sgaW4gdGhlIHNhbWUgb3JkZXIgYW5kIHR5cGUKLSAgICAgKiBhcyBpdCB3YXMgd3JpdHRlbi4gIFNvbWUgZGF0YSB3aWxsIG5lZWQgdG8gYmUgdmFsaWRhdGVkIHdoZW4KLSAgICAgKiByZXN1cnJlY3RlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpbiBUaGUgc3RyZWFtIHRvIHJlYWQgdGhlIG9iamVjdCBjb250ZW50cyBmcm9tCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlYWRFeHRlcm5hbChPYmplY3RJbnB1dCBpbk9iamVjdCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgU2FmZU9iamVjdElucHV0U3RyZWFtIGluID0gU2FmZU9iamVjdElucHV0U3RyZWFtLmluc3RhbGwoaW5PYmplY3QpOwotICAgICAgICAvLyB0cmFjZSBwb2ludAotICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy50cmFjZShteUNsYXNzTmFtZSArICI6cmVhZEV4dGVybmFsKCk6ICBCRUdJTiAgYnl0ZXMgYXZhaWxhYmxlIGluIHN0cmVhbSBbIiArCi0gICAgICAgICAgICAgICAgICAgIGluLmF2YWlsYWJsZSgpICsgIl0gICIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gc2VyaWFsaXphdGlvbiB2ZXJzaW9uIElECi0gICAgICAgIGxvbmcgc3VpZCA9IGluLnJlYWRMb25nKCk7Ci0KLSAgICAgICAgLy8gcmV2aXNpb24gSUQKLSAgICAgICAgaW50IHJldklEID0gaW4ucmVhZEludCgpOwotCi0gICAgICAgIC8vIG1ha2Ugc3VyZSB0aGUgb2JqZWN0IGRhdGEgaXMgaW4gYSB2ZXJzaW9uIHdlIGNhbiBoYW5kbGUKLSAgICAgICAgaWYgKHN1aWQgIT0gc2VyaWFsVmVyc2lvblVJRCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENsYXNzTm90Rm91bmRFeGNlcHRpb24oRXh0ZXJuYWxpemVDb25zdGFudHMuVU5TVVBQT1JURURfU1VJRCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBtYWtlIHN1cmUgdGhlIG9iamVjdCBkYXRhIGlzIGluIGEgcmV2aXNpb24gbGV2ZWwgd2UgY2FuIGhhbmRsZQotICAgICAgICBpZiAocmV2SUQgIT0gUkVWSVNJT05fMikgewotICAgICAgICAgICAgdGhyb3cgbmV3IENsYXNzTm90Rm91bmRFeGNlcHRpb24oRXh0ZXJuYWxpemVDb25zdGFudHMuVU5TVVBQT1JURURfUkVWSUQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gY29sbGVjdGlvbiBvZiBwYXJhbWV0ZXJzCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIGluLnJlYWRNYXAocGFyYW1ldGVycyk7Ci0KLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gZG9uZQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIERlYnVnIGZvciBmb3IgcHJvcGVydHkga2V5IGFuZCB2YWx1ZS4KLSAgICAgKiBAcGFyYW0ga2V5Ci0gICAgICogQHBhcmFtIHZhbHVlCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGRlYnVnUGFyYW1ldGVyQWRkKFBhcmFtZXRlciBwYXJhbWV0ZXIpIHsKLSAgICAgICAgaWYgKERFQlVHX1BST1BFUlRZX1NFVCkgewotICAgICAgICAgICAgU3RyaW5nIGtleSA9IHBhcmFtZXRlci5nZXROYW1lKCk7Ci0gICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBwYXJhbWV0ZXIuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSAodmFsdWUgPT0gbnVsbCkgPyAibnVsbCIgOiB2YWx1ZS5nZXRDbGFzcygpLmdldE5hbWUoKTsKLSAgICAgICAgICAgIFN0cmluZyBjbGFzc2xvYWRlciA9ICJudWxsIjsKLSAgICAgICAgICAgIGlmKHZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBDbGFzc0xvYWRlciBjbCA9IFV0aWxzLmdldE9iamVjdENsYXNzTG9hZGVyKHZhbHVlKTsKLSAgICAgICAgICAgICAgICBpZihjbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNsYXNzbG9hZGVyID0gY2wudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTdHJpbmcgdmFsdWVUZXh0ID0gKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSA/IHZhbHVlLnRvU3RyaW5nKCkgOiBudWxsOwotICAgICAgICAgICAgU3RyaW5nIGlkZW50aXR5ID0gZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAnQCcgKyAKLSAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvSGV4U3RyaW5nKFN5c3RlbS5pZGVudGl0eUhhc2hDb2RlKHRoaXMpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgbG9nLmRlYnVnKCI9PT09PT09PT09PT09PT09PT0iKTsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiIFBhcmFtZXRlciBhZGQgb24gb2JqZWN0ICIgKyBpZGVudGl0eSk7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIiAgS2V5ID0iICsga2V5KTsKLSAgICAgICAgICAgIGlmICh2YWx1ZVRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiICBWYWx1ZSA9IiArIHZhbHVlVGV4dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBsb2cuZGVidWcoIiAgVmFsdWUgQ2xhc3MgPSAiICsgY2xhc3NOYW1lKTsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiICBWYWx1ZSBDbGFzc2xvYWRlciA9ICIgKyBjbGFzc2xvYWRlcik7Ci0gICAgICAgICAgICBsb2cuZGVidWcoICAiQ2FsbCBTdGFjayA9ICIgKyBKYXZhVXRpbHMuY2FsbFN0YWNrVG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIj09PT09PT09PT09PT09PT09PSIpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL1BhcmFtZXRlck9ic2VydmVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vUGFyYW1ldGVyT2JzZXJ2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QyNzdhMi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vUGFyYW1ldGVyT2JzZXJ2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb247DQotDQotcHVibGljIGludGVyZmFjZSBQYXJhbWV0ZXJPYnNlcnZlciB7DQotICAgIHZvaWQgcGFyYW1ldGVyQ2hhbmdlZChTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlKTsNCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL1BoYXNlUnVsZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL1BoYXNlUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTkyYTljLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9QaGFzZVJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucGhhc2VyZXNvbHZlci5QaGFzZUV4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotCi0vKioKLSAqIENsYXNzIFBoYXNlUnVsZQotICovCi1wdWJsaWMgY2xhc3MgUGhhc2VSdWxlIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKLQotICAgIC8qKgotICAgICAqIEZpZWxkIGFmdGVyCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgYWZ0ZXI7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBiZWZvcmUKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBiZWZvcmU7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBwaGFzZUZpcnN0Ci0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIHBoYXNlRmlyc3Q7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBwaGFzZUxhc3QKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gcGhhc2VMYXN0OwotCi0gICAgLyoqCi0gICAgICogRmllbGQgcGhhc2VOYW1lCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgcGhhc2VOYW1lOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgUGhhc2VSdWxlLgotICAgICAqLwotICAgIHB1YmxpYyBQaGFzZVJ1bGUoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIFBoYXNlUnVsZShTdHJpbmcgcGhhc2VOYW1lKSB7Ci0gICAgICAgIHRoaXMucGhhc2VOYW1lID0gcGhhc2VOYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ldGhvZCBnZXRBZnRlci4KLSAgICAgKgotICAgICAqIEByZXR1cm4gUmV0dXJucyBTdHJpbmcuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRBZnRlcigpIHsKLSAgICAgICAgcmV0dXJuIGFmdGVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ldGhvZCBnZXRCZWZvcmUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgU3RyaW5nLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QmVmb3JlKCkgewotICAgICAgICByZXR1cm4gYmVmb3JlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ldGhvZCBnZXRQaGFzZU5hbWUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgU3RyaW5nLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGhhc2VOYW1lKCkgewotICAgICAgICByZXR1cm4gcGhhc2VOYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ldGhvZCBpc1BoYXNlRmlyc3QuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgYm9vbGVhbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1BoYXNlRmlyc3QoKSB7Ci0gICAgICAgIHJldHVybiBwaGFzZUZpcnN0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ldGhvZCBpc1BoYXNlTGFzdC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gUmV0dXJucyBib29sZWFuLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzUGhhc2VMYXN0KCkgewotICAgICAgICByZXR1cm4gcGhhc2VMYXN0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgImFmdGVyIiBuYW1lIGZvciB0aGlzIHJ1bGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYWZ0ZXIgdGhlIG5hbWUgb2YgdGhlICJhZnRlciIgaGFuZGxlcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEFmdGVyKFN0cmluZyBhZnRlcikgewotICAgICAgICBpZiAoIiIuZXF1YWxzKGFmdGVyKSkgYWZ0ZXIgPSBudWxsOwotICAgICAgICB0aGlzLmFmdGVyID0gYWZ0ZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSAiYmVmb3JlIiBuYW1lIGZvciB0aGlzIHJ1bGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYmVmb3JlIHRoZSBuYW1lIG9mIHRoZSAiYmVmb3JlIiBoYW5kbGVyCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0QmVmb3JlKFN0cmluZyBiZWZvcmUpIHsKLSAgICAgICAgaWYgKCIiLmVxdWFscyhiZWZvcmUpKSBiZWZvcmUgPSBudWxsOwotICAgICAgICB0aGlzLmJlZm9yZSA9IGJlZm9yZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2Qgc2V0UGhhc2VGaXJzdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwaGFzZUZpcnN0IHRydWUgaWYgdGhpcyBydWxlIGRlZmluZXMgdGhlIGZpcnN0IEhhbmRsZXIgaW4gYSBQaGFzZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFBoYXNlRmlyc3QoYm9vbGVhbiBwaGFzZUZpcnN0KSB7Ci0gICAgICAgIHRoaXMucGhhc2VGaXJzdCA9IHBoYXNlRmlyc3Q7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWV0aG9kIHNldFBoYXNlTGFzdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwaGFzZUxhc3QgdHJ1ZSBpZiB0aGlzIHJ1bGUgZGVmaW5lcyB0aGUgbGFzdCBIYW5kbGVyIGluIGEgUGhhc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQaGFzZUxhc3QoYm9vbGVhbiBwaGFzZUxhc3QpIHsKLSAgICAgICAgdGhpcy5waGFzZUxhc3QgPSBwaGFzZUxhc3Q7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWV0aG9kIHNldFBoYXNlTmFtZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwaGFzZU5hbWUgdGhlIG5hbWUgb2YgdGhlIFBoYXNlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UGhhc2VOYW1lKFN0cmluZyBwaGFzZU5hbWUpIHsKLSAgICAgICAgdGhpcy5waGFzZU5hbWUgPSBwaGFzZU5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVmFsaWRhdGUgInNhbmUiIHJ1bGVzIC0gY2Fubm90IGhhdmUgYm90aCBwaGFzZUZpcnN0L3BoYXNlTGFzdCBhbmQgYmVmb3JlL2FmdGVyCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIFBoYXNlRXhjZXB0aW9uIGlmIHBoYXNlRmlyc3QvcGhhc2VMYXN0IGlzIHNldCBhbG9uZyB3aXRoIGJlZm9yZS9hZnRlcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlKCkgdGhyb3dzIFBoYXNlRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGJlZm9yZSAhPSBudWxsIHx8IGFmdGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChwaGFzZUZpcnN0KSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFBoYXNlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgUGhhc2VSdWxlIChwaGFzZUZpcnN0IGlzIHNldCBhbG9uZyB3aXRoIGJlZm9yZS9hZnRlcikiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwaGFzZUxhc3QpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUGhhc2VFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBQaGFzZVJ1bGUgKHBoYXNlTGFzdCBpcyBzZXQgYWxvbmcgd2l0aCBiZWZvcmUvYWZ0ZXIpIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vUG9saWN5SW5jbHVkZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL1BvbGljeUluY2x1ZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ5OWYzNy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vUG9saWN5SW5jbHVkZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5VVUlER2VuZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5BeGlzUG9saWN5TG9jYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuUG9saWN5VXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLm5lZXRoaS5Qb2xpY3k7Ci1pbXBvcnQgb3JnLmFwYWNoZS5uZWV0aGkuUG9saWN5Q29tcG9uZW50OwotaW1wb3J0IG9yZy5hcGFjaGUubmVldGhpLlBvbGljeVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLm5lZXRoaS5Qb2xpY3lSZWdpc3RyeTsKLWltcG9ydCBvcmcuYXBhY2hlLm5lZXRoaS5Qb2xpY3lSZWdpc3RyeUltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1wdWJsaWMgY2xhc3MgUG9saWN5SW5jbHVkZSB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBTk9OX1BPTElDWSA9IDEwMDsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFYSVNfUE9MSUNZID0gMTsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFYSVNfTU9EVUxFX1BPTElDWSA9IDI7Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVhJU19NT0RVTEVfT1BFUkFUSU9OX1BPTElDWSA9IDE3OwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVhJU19TRVJWSUNFX1BPTElDWSA9IDM7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBWElTX09QRVJBVElPTl9QT0xJQ1kgPSA0OwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVhJU19NRVNTQUdFX1BPTElDWSA9IDU7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVJWSUNFX1BPTElDWSA9IDY7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQT1JUX1BPTElDWSA9IDc7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQT1JUX1RZUEVfUE9MSUNZID0gODsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJJTkRJTkdfUE9MSUNZID0gOTsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QRVJBVElPTl9QT0xJQ1kgPSAxMDsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJJTkRJTkdfT1BFUkFUSU9OX1BPTElDWSA9IDExOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5QVVRfUE9MSUNZID0gMTI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPVVRQVVRfUE9MSUNZID0gMTM7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCSU5ESU5HX0lOUFVUX1BPTElDWSA9IDE0OwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQklORElOR19PVVRQVVRfUE9MSUNZID0gMTU7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNRVNTQUdFX1BPTElDWSA9IDE2OwotCi0gICAgcHJpdmF0ZSBQb2xpY3kgcG9saWN5ID0gbnVsbDsKLQotICAgIHByaXZhdGUgUG9saWN5IGVmZmVjdGl2ZVBvbGljeSA9IG51bGw7Ci0KLSAgICBwcml2YXRlIFBvbGljeVJlZ2lzdHJ5IHJlZzsKLQotICAgIHByaXZhdGUgQXhpc0Rlc2NyaXB0aW9uIGRlc2NyaXB0aW9uOwotCi0gICAgcHJpdmF0ZSBIYXNodGFibGU8U3RyaW5nLCBXcmFwcGVyPiB3cmFwcGVyRWxlbWVudHMgPSBuZXcgSGFzaHRhYmxlPFN0cmluZywgV3JhcHBlcj4oKTsKLQotICAgIHB1YmxpYyBQb2xpY3lJbmNsdWRlKCkgewotICAgICAgICByZWcgPSBuZXcgUG9saWN5UmVnaXN0cnlJbXBsKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFBvbGljeUluY2x1ZGUoQXhpc0Rlc2NyaXB0aW9uIGF4aXNEZXNjcmlwdGlvbikgewotCi0gICAgICAgIGlmIChheGlzRGVzY3JpcHRpb24uZ2V0UGFyZW50KCkgIT0gbnVsbCkgewotICAgICAgICAgICAgUG9saWN5SW5jbHVkZSBwYXJlbnRQb2xpY3lJbmNsdWRlID0gYXhpc0Rlc2NyaXB0aW9uLmdldFBhcmVudCgpLmdldFBvbGljeUluY2x1ZGUoKTsKLSAgICAgICAgICAgIHJlZyA9IG5ldyBQb2xpY3lSZWdpc3RyeUltcGwocGFyZW50UG9saWN5SW5jbHVkZS5nZXRQb2xpY3lSZWdpc3RyeSgpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJlZyA9IG5ldyBQb2xpY3lSZWdpc3RyeUltcGwoKTsKLSAgICAgICAgfQotICAgICAgICBzZXREZXNjcmlwdGlvbihheGlzRGVzY3JpcHRpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBvbGljeVJlZ2lzdHJ5KFBvbGljeVJlZ2lzdHJ5IHJlZykgewotICAgICAgICB0aGlzLnJlZyA9IHJlZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUG9saWN5UmVnaXN0cnkgZ2V0UG9saWN5UmVnaXN0cnkoKSB7Ci0gICAgICAgIHJldHVybiByZWc7Ci0gICAgfQotCi0gICAgLyoqCi0JICogQHBhcmFtIHBvbGljeQotCSAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5Qb2xpY3lTdWJqZWN0I2F0dGFjaFBvbGljeShQb2xpY3kpCi0JICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlBvbGljeVN1YmplY3QjY2xlYXIoKQotCSAqIEBkZXByZWNhdGVkIEFzIG9mIDEuNCByZWxlYXNlLCByZXBsYWNlZCBieQotCSAqICAgICAgICAgICAgIHtAbGluayBQb2xpY3lTdWJqZWN0ICNhdHRhY2hQb2xpY3koUG9saWN5KX0gVXNlCi0JICogICAgICAgICAgICAge0BsaW5rIFBvbGljeVN1YmplY3QgI2NsZWFyKCl9IGJlZm9yZWhhbmQgZWZmZWN0aXZlIHBvbGljeSBvZgotCSAqICAgICAgICAgICAgIHtAbGluayBBeGlzRGVzY3JpcHRpb259IGhhcyB0byBiZSBzZXQgYXMgdGhlIGFyZ3VtZW50LgotCSAqIAotCSAqLwotICAgIHB1YmxpYyB2b2lkIHNldFBvbGljeShQb2xpY3kgcG9saWN5KSB7Ci0gICAgICAgIHdyYXBwZXJFbGVtZW50cy5jbGVhcigpOwotCi0gICAgICAgIGlmIChwb2xpY3kuZ2V0TmFtZSgpID09IG51bGwgJiYgcG9saWN5LmdldElkKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgcG9saWN5LnNldElkKFVVSURHZW5lcmF0b3IuZ2V0VVVJRCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFdyYXBwZXIgd3JhcHBlciA9IG5ldyBXcmFwcGVyKFBvbGljeUluY2x1ZGUuQU5PTl9QT0xJQ1ksIHBvbGljeSk7Ci0gICAgICAgIGlmIChwb2xpY3kuZ2V0TmFtZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIHdyYXBwZXJFbGVtZW50cy5wdXQocG9saWN5LmdldE5hbWUoKSwgd3JhcHBlcik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB3cmFwcGVyRWxlbWVudHMucHV0KHBvbGljeS5nZXRJZCgpLCB3cmFwcGVyKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKGRlc2NyaXB0aW9uICE9IG51bGwpIHsKLQkJCWRlc2NyaXB0aW9uLmdldFBvbGljeVN1YmplY3QoKS5jbGVhcigpOwotCQkJZGVzY3JpcHRpb24uZ2V0UG9saWN5U3ViamVjdCgpLmF0dGFjaFBvbGljeShwb2xpY3kpOwotCQl9Ci0gICAgfQotCi0gICAgLyoqCi0JICogQGRlcHJlY2F0ZWQgQXMgb2YgMS40IHJlbGVhc2UsIHJlcGxhY2VkIGJ5Ci0JICogICAgICAgICAgICAge0BsaW5rIFBvbGljeVN1YmplY3QgI3VwZGF0ZVBvbGljeShQb2xpY3kpfS4KLQkgKi8KLSAgICBwdWJsaWMgdm9pZCB1cGRhdGVQb2xpY3koUG9saWN5IHBvbGljeSkgewotICAgICAgICBTdHJpbmcga2V5OwotCi0gICAgICAgIGlmICgoa2V5ID0gcG9saWN5LmdldE5hbWUoKSkgPT0gbnVsbCAmJiAoa2V5ID0gcG9saWN5LmdldElkKCkpID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIFRPRE8gdGhyb3cgbW9yZSBtZWFuaW5nZnVsIGV4Y2VwdGlvbiAuLgotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oInBvbGljeSBkb2Vzbid0IGhhdmUgYSBuYW1lIG9yIGFuIGlkICIpOwotICAgICAgICB9Ci0KLSAgICAgICAgV3JhcHBlciB3cmFwcGVyID0gKFdyYXBwZXIpIHdyYXBwZXJFbGVtZW50cy5nZXQoa2V5KTsKLSAgICAgICAgd3JhcHBlci52YWx1ZSA9IHBvbGljeTsKLSAgICAgICAgCi0gICAgICAgIGlmIChkZXNjcmlwdGlvbiAhPSBudWxsKSB7Ci0JCQlkZXNjcmlwdGlvbi5nZXRQb2xpY3lTdWJqZWN0KCkudXBkYXRlUG9saWN5KHBvbGljeSk7Ci0JCX0KLSAgICB9Ci0KLSAgICAvKioKLQkgKiBAZGVwcmVjYXRlZCBBcyBvZiAxLjQgcmVsZWFzZS4gWW91IGNhbid0IG92ZXJyaWRlIGEgcG9saWNpZXMgdGhhdAotCSAqICAgICAgICAgICAgIGFwcGxpY2FibGUgZm9yIHRoZSBjdXJyZW50IHBvbGljeSBzY29wZSB2aWEKLQkgKiAgICAgICAgICAgICB7QGxpbmsgUG9saWN5SW5jbHVkZSAjc2V0RWZmZWN0aXZlUG9saWN5KFBvbGljeSl9LiBJbiBjYXNlCi0JICogICAgICAgICAgICAgeW91IG5lZWQgdG8gbWFrZSBhIHBvbGljeSB0aGUgb25seSBwb2xpY3kgdGhhdCBpcyB3aXRoaW4gdGhlCi0JICogICAgICAgICAgICAgcG9saWN5IGNhY2hlIG9mIGFuIHtAbGluayBBeGlzRGVzY3JpcHRpb259IHBsZWFzZSB1c2UKLQkgKiAgICAgICAgICAgICB7QGxpbmsgUG9saWN5U3ViamVjdCAjY2xlYXIoKX0gYW5kCi0JICogICAgICAgICAgICAge0BsaW5rIFBvbGljeVN1YmplY3QgI2F0dGFjaFBvbGljeShQb2xpY3kpfSBhY2NvcmRpbmdseS4KLQkgKiAKLQkgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRFZmZlY3RpdmVQb2xpY3koUG9saWN5IGVmZmVjdGl2ZVBvbGljeSkgewotICAgICAgICB0aGlzLmVmZmVjdGl2ZVBvbGljeSA9IGVmZmVjdGl2ZVBvbGljeTsKLSAgICAgICAgCi0gICAgICAgIGlmIChkZXNjcmlwdGlvbiAhPSBudWxsICYmIGVmZmVjdGl2ZVBvbGljeSAhPSBudWxsKSB7Ci0JCQlkZXNjcmlwdGlvbi5nZXRQb2xpY3lTdWJqZWN0KCkuY2xlYXIoKTsKLQkJCWRlc2NyaXB0aW9uLmdldFBvbGljeVN1YmplY3QoKS5hdHRhY2hQb2xpY3koZWZmZWN0aXZlUG9saWN5KTsKLQkJfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKEF4aXNEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgewotICAgICAgICB0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0gICAgfQotCi0gICAgcHVibGljIEF4aXNEZXNjcmlwdGlvbiBnZXREZXNjcmlwdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIGRlc2NyaXB0aW9uOwotICAgIH0KLQotICAgIHByaXZhdGUgUG9saWN5SW5jbHVkZSBnZXRQYXJlbnQoKSB7Ci0KLSAgICAgICAgaWYgKGRlc2NyaXB0aW9uICE9IG51bGwgJiYgZGVzY3JpcHRpb24uZ2V0UGFyZW50KCkgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGRlc2NyaXB0aW9uLmdldFBhcmVudCgpLmdldFBvbGljeUluY2x1ZGUoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2FsY3VsYXRlUG9saWN5KCkgewotCi0gICAgICAgIFBvbGljeSByZXN1bHQgPSBudWxsOwotICAgICAgICBJdGVyYXRvcjxXcmFwcGVyPiBpdGVyYXRvciA9IHdyYXBwZXJFbGVtZW50cy52YWx1ZXMoKS5pdGVyYXRvcigpOwotCi0gICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIE9iamVjdCBwb2xpY3lFbGVtZW50ID0gKChXcmFwcGVyKSBpdGVyYXRvci5uZXh0KCkpLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICBQb2xpY3kgcDsKLQotICAgICAgICAgICAgaWYgKHBvbGljeUVsZW1lbnQgaW5zdGFuY2VvZiBQb2xpY3lSZWZlcmVuY2UpIHsKLSAgICAgICAgICAgICAgICBBeGlzUG9saWN5TG9jYXRvciBsb2NhdG9yID0gbmV3IEF4aXNQb2xpY3lMb2NhdG9yKGRlc2NyaXB0aW9uKTsKLSAgICAgICAgICAgICAgICBwID0gKFBvbGljeSkgKChQb2xpY3lSZWZlcmVuY2UpIHBvbGljeUVsZW1lbnQpCi0gICAgICAgICAgICAgICAgICAgICAgICAubm9ybWFsaXplKGxvY2F0b3IsIGZhbHNlKTsKLQotICAgICAgICAgICAgfSBlbHNlIGlmIChwb2xpY3lFbGVtZW50IGluc3RhbmNlb2YgUG9saWN5KSB7Ci0gICAgICAgICAgICAgICAgcCA9IChQb2xpY3kpIHBvbGljeUVsZW1lbnQ7Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETyBBeGlzRmF1bHQ/Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCA9PSBudWxsKSA/IChQb2xpY3kpIHAgOiAoUG9saWN5KSByZXN1bHQubWVyZ2UocCk7Ci0gICAgICAgIH0KLQotICAgICAgICB0aGlzLnBvbGljeSA9IHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2FsY3VsYXRlRWZmZWN0aXZlUG9saWN5KCkgewotICAgICAgICBQb2xpY3kgcmVzdWx0OwotCi0gICAgICAgIGlmIChnZXRQYXJlbnQoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBQb2xpY3kgcGFyZW50UG9saWN5ID0gZ2V0UGFyZW50KCkuZ2V0RWZmZWN0aXZlUG9saWN5KCk7Ci0KLSAgICAgICAgICAgIGlmIChwYXJlbnRQb2xpY3kgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJlc3VsdCA9IGdldFBvbGljeSgpOwotCi0gICAgICAgICAgICB9IGVsc2UgewotCi0gICAgICAgICAgICAgICAgaWYgKGdldFBvbGljeSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKFBvbGljeSkgcGFyZW50UG9saWN5Lm1lcmdlKGdldFBvbGljeSgpKTsKLQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHBhcmVudFBvbGljeTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IGdldFBvbGljeSgpOwotICAgICAgICB9Ci0gICAgICAgIHNldEVmZmVjdGl2ZVBvbGljeShyZXN1bHQpOwotICAgIH0KLQotICAgIC8qKgotCSAqIEBkZXByZWNhdGVkIEFzIG9mIDEuNCByZWxlYXNlLiBJZiB5b3UgbmVlZCB0byBjYWxjdWxhdGUgbWVyZ2VkIHBvbGljeSBvZgotCSAqICAgICAgICAgICAgIGFsbCBwb2xpY2llcyB0aGF0IGFyZSBpbiB0aGUgcG9saWN5IGNhY2hlIG9mCi0JICogICAgICAgICAgICAge0BsaW5rIEF4aXNEZXNjcmlwdGlvbn0sIHVzZQotCSAqICAgICAgICAgICAgIHtAbGluayBQb2xpY3lTdWJqZWN0ICNnZXRBdHRhY2hlZFBvbGljeUNvbXBvbmVudHMoKSBhbmQge0BsaW5rIG9yZy5Qb2xpY3lVdGlsICNnZXRNZXJnZWRQb2xpY3koTGlzdCwgQXhpc0Rlc2NyaXB0aW9uKX19Ci0JICovCi0gICAgcHVibGljIFBvbGljeSBnZXRQb2xpY3koKSB7Ci0gICAgCWlmIChkZXNjcmlwdGlvbiAhPSBudWxsKSB7Ci0JCQlBcnJheUxpc3Q8UG9saWN5Q29tcG9uZW50PiBwb2xpY3lMaXN0ID0gbmV3IEFycmF5TGlzdDxQb2xpY3lDb21wb25lbnQ+KGRlc2NyaXB0aW9uLmdldFBvbGljeVN1YmplY3QoKQotCQkJCQkuZ2V0QXR0YWNoZWRQb2xpY3lDb21wb25lbnRzKCkpOwotCQkJcmV0dXJuIFBvbGljeVV0aWwuZ2V0TWVyZ2VkUG9saWN5KHBvbGljeUxpc3QsIGRlc2NyaXB0aW9uKTsKLQkJfQotICAgIAkKLSAgICAgICAgY2FsY3VsYXRlUG9saWN5KCk7Ci0gICAgICAgIHJldHVybiBwb2xpY3k7Ci0gICAgfQotCi0gICAgLyoqCi0JICogQGRlcHJlY2F0ZWQgQXMgb2YgMS40IHJlbGVhc2UuIFVzZQotCSAqICAgICAgICAgICAgIHtAbGluayBBeGlzTWVzc2FnZSAjZ2V0RWZmZWN0aXZlUG9saWN5KCl9IG9yCi0JICogICAgICAgICAgICAge0BsaW5rIEF4aXNCaW5kaW5nTWVzc2FnZSAjZ2V0RWZmZWN0aXZlUG9saWN5KCl9IHdoZW4KLQkgKiAgICAgICAgICAgICBhcHBsaWNhYmxlLgotCSAqLwotICAgIHB1YmxpYyBQb2xpY3kgZ2V0RWZmZWN0aXZlUG9saWN5KCkgewotICAgIAlpZiAoZGVzY3JpcHRpb24gIT0gbnVsbCkgewotCQkJaWYgKGRlc2NyaXB0aW9uIGluc3RhbmNlb2YgQXhpc01lc3NhZ2UpIHsKLQkJCQlyZXR1cm4gKChBeGlzTWVzc2FnZSkgZGVzY3JpcHRpb24pLmdldEVmZmVjdGl2ZVBvbGljeSgpOwotCQkJfSBlbHNlIGlmIChkZXNjcmlwdGlvbiBpbnN0YW5jZW9mIEF4aXNCaW5kaW5nTWVzc2FnZSkgewotCQkJCXJldHVybiAoKEF4aXNCaW5kaW5nTWVzc2FnZSkgZGVzY3JpcHRpb24pLmdldEVmZmVjdGl2ZVBvbGljeSgpOwotCQkJfQotCQl9Ci0gICAgCQotICAgICAgICBjYWxjdWxhdGVFZmZlY3RpdmVQb2xpY3koKTsKLSAgICAgICAgcmV0dXJuIGVmZmVjdGl2ZVBvbGljeTsKLSAgICB9Ci0KLSAgICAvKioKLQkgKiBAZGVwcmVjYXRlZCBBcyBvZiAxLjQgcmVsZWFzZSwgcmVwbGFjZWQgYnkKLQkgKiAgICAgICAgICAgICB7QGxpbmsgUG9saWN5U3ViamVjdCAjZ2V0QXR0YWNoZWRQb2xpY3lDb21wb25lbnRzKCl9Ci0JICovCi0gICAgcHVibGljIEFycmF5TGlzdCBnZXRQb2xpY3lFbGVtZW50cygpIHsKLSAgICAJaWYgKGRlc2NyaXB0aW9uICE9IG51bGwpIHsKLQkJCXJldHVybiBuZXcgQXJyYXlMaXN0PFBvbGljeUNvbXBvbmVudD4oZGVzY3JpcHRpb24uZ2V0UG9saWN5U3ViamVjdCgpCi0JCQkJCS5nZXRBdHRhY2hlZFBvbGljeUNvbXBvbmVudHMoKSk7Ci0JCX0KLSAgICAJCi0gICAgICAgIEFycmF5TGlzdCBwb2xpY3lFbGVtZW50c0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIEl0ZXJhdG9yPFdyYXBwZXI+IHBvbGljeUVsZW1lbnRJdGVyYXRvciA9IHdyYXBwZXJFbGVtZW50cy52YWx1ZXMoKS5pdGVyYXRvcigpOwotCi0gICAgICAgIHdoaWxlIChwb2xpY3lFbGVtZW50SXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBwb2xpY3lFbGVtZW50c0xpc3QKLSAgICAgICAgICAgICAgICAgICAgLmFkZChwb2xpY3lFbGVtZW50SXRlcmF0b3IubmV4dCgpLmdldFZhbHVlKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwb2xpY3lFbGVtZW50c0xpc3Q7Ci0gICAgfQotCi0gICAgLyoqCi0JICogQGRlcHJlY2F0ZWQgQXMgb2YgMS40IHJlbGVhc2UuIFRoZSBwb2xpY3kgZWxlbWVudCB0eXBlIGlzIG5vIGxvbmdlcgotCSAqICAgICAgICAgICAgIHJlcXVpcmVkIHNpbmNlIHdlIG1haW50YWluIGEgY29tcGxldGUgYmluZGluZyBkZXNjcmlwdGlvbgotCSAqICAgICAgICAgICAgIGhpZXJhcmNoeSBmb3IgdGhlIHN0YXRpYyBkZXNjcmlwdGlvbiB0aGUgc2VydmljZS4gSGVuY2UgdXNlCi0JICogICAgICAgICAgICAge0BsaW5rIFBvbGljeVN1YmplY3QgI2dldEF0dGFjaGVkUG9saWN5Q29tcG9uZW50cygpfSBvbgotCSAqICAgICAgICAgICAgIGFwcHJvcHJpYXRlIGRlc2NyaXB0aW9uIG9iamVjdC4KLQkgKi8KLSAgICBwdWJsaWMgQXJyYXlMaXN0IGdldFBvbGljeUVsZW1lbnRzKGludCB0eXBlKSB7Ci0gICAgICAgIEFycmF5TGlzdCBwb2xpY3lFbGVtZW50TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgSXRlcmF0b3I8V3JhcHBlcj4gd3JhcHBlckVsZW1lbnRJdGVyYXRvciA9IHdyYXBwZXJFbGVtZW50cy52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgICAgICBXcmFwcGVyIHdyYXBwZXI7Ci0KLSAgICAgICAgd2hpbGUgKHdyYXBwZXJFbGVtZW50SXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICB3cmFwcGVyID0gKFdyYXBwZXIpIHdyYXBwZXJFbGVtZW50SXRlcmF0b3IubmV4dCgpOwotCi0gICAgICAgICAgICBpZiAod3JhcHBlci5nZXRUeXBlKCkgPT0gdHlwZSkgewotICAgICAgICAgICAgICAgIHBvbGljeUVsZW1lbnRMaXN0LmFkZCh3cmFwcGVyLmdldFZhbHVlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwb2xpY3lFbGVtZW50TGlzdDsKLSAgICB9Ci0KLSAgICAvKioKLQkgKiBAZGVwcmVjYXRlZCBBcyBvZiAxLjQgcmVsZWFzZS4gVXNlIFNlcnZpY2VEYXRhLnhtbCBvciBBeGlzMiBEYXRhTG9jYXRvcnMKLQkgKiAgICAgICAgICAgICB0byBjb25maWd1cmUgcG9saWNpZXMgdGhhdCBhcmUgc3RvcmVkIHNlcGFyYXRlbHkuCi0JICovCi0gICAgcHVibGljIHZvaWQgcmVnaXN0ZXJQb2xpY3koU3RyaW5nIGtleSwgUG9saWN5IHBvbGljeSkgewotICAgICAgICByZWcucmVnaXN0ZXIoa2V5LCBwb2xpY3kpOwotICAgIH0KLQotICAgIC8qKgotCSAqIEBkZXByZWNhdGVkIEFzIG9mIDEuNCByZWxlYXNlLCByZXBsYWNlZCBieQotCSAqICAgICAgICAgICAgIHtAbGluayBQb2xpY3lTdWJqZWN0ICNnZXRBdHRhY2hlZFBvbGljeUNvbXBvbmVudChTdHJpbmcpfQotCSAqLwotICAgIHB1YmxpYyBQb2xpY3kgZ2V0UG9saWN5KFN0cmluZyBrZXkpIHsKLSAgICAJaWYgKGRlc2NyaXB0aW9uICE9IG51bGwpIHsKLQkJCVBvbGljeUNvbXBvbmVudCByZXN1bHQgPSBkZXNjcmlwdGlvbi5nZXRQb2xpY3lTdWJqZWN0KCkKLQkJCQkJLmdldEF0dGFjaGVkUG9saWN5Q29tcG9uZW50KGtleSk7Ci0JCQlpZiAocmVzdWx0ICE9IG51bGwgJiYgcmVzdWx0IGluc3RhbmNlb2YgUG9saWN5KSB7Ci0JCQkJcmV0dXJuIChQb2xpY3kpIHJlc3VsdDsKLQkJCX0KLQkJfQotICAgIAkKLSAgICAgICAgcmV0dXJuIHJlZy5sb29rdXAoa2V5KTsKLSAgICB9Ci0KLSAgICAvKioKLQkgKiBAZGVwcmVjYXRlZCBBcyBvZiAxLjQgcmVsZWFzZSwgcmVwbGFjZWQgYnkKLQkgKiAgICAgICAgICAgICB7QGxpbmsgUG9saWN5U3ViamVjdCAjYXR0YWNoUG9saWN5KFBvbGljeSl9Ci0JICovCi0gICAgcHVibGljIHZvaWQgYWRkUG9saWN5RWxlbWVudChpbnQgdHlwZSwgUG9saWN5IHBvbGljeSkgewotCi0gICAgICAgIFN0cmluZyBrZXk7Ci0KLSAgICAgICAgaWYgKChrZXkgPSBwb2xpY3kuZ2V0TmFtZSgpKSA9PSBudWxsICYmIChrZXkgPSBwb2xpY3kuZ2V0SWQoKSkgPT0gbnVsbCkgewotICAgICAgICAgICAgcG9saWN5LnNldElkKFVVSURHZW5lcmF0b3IuZ2V0VVVJRCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGtleSA9IChwb2xpY3kuZ2V0TmFtZSgpICE9IG51bGwpID8gcG9saWN5LmdldE5hbWUoKSA6IHBvbGljeS5nZXRJZCgpOwotCi0gICAgICAgIFdyYXBwZXIgd3JhcHBlciA9IG5ldyBXcmFwcGVyKHR5cGUsIHBvbGljeSk7Ci0gICAgICAgIHdyYXBwZXJFbGVtZW50cy5wdXQoa2V5LCB3cmFwcGVyKTsKLSAgICAgICAgcmVnLnJlZ2lzdGVyKGtleSwgcG9saWN5KTsKLSAgICAgICAgCi0gICAgICAgIGlmIChkZXNjcmlwdGlvbiAhPSBudWxsKSB7Ci0JCQlkZXNjcmlwdGlvbi5nZXRQb2xpY3lTdWJqZWN0KCkuYXR0YWNoUG9saWN5KHBvbGljeSk7Ci0JCX0KLSAgICB9Ci0KLSAgICAvKioKLQkgKiBAZGVwcmVjYXRlZCBBcyBvZiAxLjQgcmVsZWFzZSwgcmVwbGFjZWQgYnkKLQkgKiAgICAgICAgICAgICB7QGxpbmsgUG9saWN5U3ViamVjdCAjYXR0YWNoUG9saWN5UmVmZXJlbmNlKFBvbGljeVJlZmVyZW5jZSl9Ci0JICovCi0gICAgcHVibGljIHZvaWQgYWRkUG9saWN5UmVmRWxlbWVudChpbnQgdHlwZSwgUG9saWN5UmVmZXJlbmNlIHBvbGljeVJlZmVyZW5jZSkgewotICAgICAgICBXcmFwcGVyIHdyYXBwZXIgPSBuZXcgV3JhcHBlcih0eXBlLCBwb2xpY3lSZWZlcmVuY2UpOwotICAgICAgICB3cmFwcGVyRWxlbWVudHMucHV0KHBvbGljeVJlZmVyZW5jZS5nZXRVUkkoKSwgd3JhcHBlcik7Ci0gICAgICAgIAotICAgICAgICBpZiAoZGVzY3JpcHRpb24gIT0gbnVsbCkgewotCQkJZGVzY3JpcHRpb24uZ2V0UG9saWN5U3ViamVjdCgpLmF0dGFjaFBvbGljeVJlZmVyZW5jZSgKLQkJCQkJcG9saWN5UmVmZXJlbmNlKTsKLQkJfQotICAgIH0KLQotICAgIGNsYXNzIFdyYXBwZXIgewotICAgICAgICBwcml2YXRlIGludCB0eXBlOwotICAgICAgICBwcml2YXRlIE9iamVjdCB2YWx1ZTsKLQotICAgICAgICBXcmFwcGVyKGludCB0eXBlLCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgICAgIHNldFR5cGUodHlwZSk7Ci0gICAgICAgICAgICBzZXRWYWx1ZSh2YWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHNldFR5cGUoaW50IHR5cGUpIHsKLSAgICAgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgZ2V0VHlwZSgpIHsKLSAgICAgICAgICAgIHJldHVybiB0eXBlOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBzZXRWYWx1ZShPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIE9iamVjdCBnZXRWYWx1ZSgpIHsKLSAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotCSAqIEBkZXByZWNhdGVkIEFzIG9mIDEuNCByZWxlYXNlLCByZXBsYWNlZCBieQotCSAqICAgICAgICAgICAgIHtAbGluayBQb2xpY3lTdWJqZWN0ICNkZXRhY2hQb2xpY3lDb21wb25lbnQoU3RyaW5nKX0KLQkgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVQb2xpY3lFbGVtZW50KFN0cmluZyBwb2xpY3lVUkkpIHsKLSAgICAgICAgd3JhcHBlckVsZW1lbnRzLnJlbW92ZShwb2xpY3lVUkkpOwotICAgICAgICByZWcucmVtb3ZlKHBvbGljeVVSSSk7Ci0gICAgICAgIAotICAgICAgICBpZiAoZGVzY3JpcHRpb24gIT0gbnVsbCkgewotCQkJZGVzY3JpcHRpb24uZ2V0UG9saWN5U3ViamVjdCgpLmRldGFjaFBvbGljeUNvbXBvbmVudChwb2xpY3lVUkkpOwotCQl9Ci0gICAgfQotCi0gICAgLyoqCi0JICogQGRlcHJlY2F0ZWQgQXMgb2YgMS40IHJlbGVhc2UsIHJlcGxhY2VkIGJ5IHtAbGluayBQb2xpY3lTdWJqZWN0ICNjbGVhcigpfQotCSAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZUFsbFBvbGljeUVsZW1lbnRzKCkgewotICAgICAgICB3cmFwcGVyRWxlbWVudHMuY2xlYXIoKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChkZXNjcmlwdGlvbiAhPSBudWxsKSB7Ci0JCQlkZXNjcmlwdGlvbi5nZXRQb2xpY3lTdWJqZWN0KCkuY2xlYXIoKTsKLQkJfQotICAgIH0KLSAgICAKLSAgICAvKioKLQkgKiBAZGVwcmVjYXRlZCBBcyBvZiAxLjQgcmVsZWFzZSwgcmVwbGFjZWQgYnkKLQkgKiAgICAgICAgICAgICB7QGxpbmsgUG9saWN5U3ViamVjdCAjZ2V0QXR0YWNoZWRQb2xpY3lDb21wb25lbnRzKCl9Ci0JICovCi0gICAgcHVibGljIExpc3QgZ2V0QXR0YWNoZWRQb2xpY2llcygpIHsKLSAgICAJaWYgKGRlc2NyaXB0aW9uICE9IG51bGwpIHsKLQkJCXJldHVybiBuZXcgQXJyYXlMaXN0KGRlc2NyaXB0aW9uLmdldFBvbGljeVN1YmplY3QoKQotCQkJCQkuZ2V0QXR0YWNoZWRQb2xpY3lDb21wb25lbnRzKCkpOwotCQl9Ci0gICAgCQotICAgICAgICBBcnJheUxpc3QgIGFycmF5TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSB3cmFwcGVyRWxlbWVudHMudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgYXJyYXlMaXN0LmFkZCgoKFdyYXBwZXIpIGl0ZXJhdG9yLm5leHQoKSkudmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gYXJyYXlMaXN0OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9Qb2xpY3lTdWJqZWN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vUG9saWN5U3ViamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjRkM2U2Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9Qb2xpY3lTdWJqZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS51dGlsLlVVSURHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5uZWV0aGkuUG9saWN5OwotaW1wb3J0IG9yZy5hcGFjaGUubmVldGhpLlBvbGljeUNvbXBvbmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLm5lZXRoaS5Qb2xpY3lSZWZlcmVuY2U7Ci0KLXB1YmxpYyBjbGFzcyBQb2xpY3lTdWJqZWN0IHsKLQotCXByaXZhdGUgYm9vbGVhbiB1cGRhdGVkID0gZmFsc2U7Ci0JcHJpdmF0ZSBEYXRlIGxhc3RVcGRhdGVkVGltZSA9IG5ldyBEYXRlKCk7Ci0JCi0JcHJpdmF0ZSBIYXNoTWFwPFN0cmluZywgUG9saWN5Q29tcG9uZW50PiBhdHRhY2hlZFBvbGljeUNvbXBvbmVudHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFBvbGljeUNvbXBvbmVudD4oKTsKLQotCXB1YmxpYyB2b2lkIGF0dGFjaFBvbGljeShQb2xpY3kgcG9saWN5KSB7Ci0JCVN0cmluZyBrZXkgPSBwb2xpY3kuZ2V0TmFtZSgpOwotCQlpZiAoa2V5ID09IG51bGwpIHsKLQkJCWtleSA9IHBvbGljeS5nZXRJZCgpOwotCQkJaWYgKGtleSA9PSBudWxsKSB7Ci0JCQkJa2V5ID0gVVVJREdlbmVyYXRvci5nZXRVVUlEKCk7Ci0JCQkJcG9saWN5LnNldElkKGtleSk7Ci0JCQl9Ci0JCX0KLQkJYXR0YWNoUG9saWN5Q29tcG9uZW50KGtleSwgcG9saWN5KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhdHRhY2hQb2xpY3lSZWZlcmVuY2UoUG9saWN5UmVmZXJlbmNlIHJlZmVyZW5jZSkgewotCQlhdHRhY2hlZFBvbGljeUNvbXBvbmVudHMucHV0KHJlZmVyZW5jZS5nZXRVUkkoKSwgcmVmZXJlbmNlKTsKLQkJc2V0TGFzdFVwZGF0ZWRUaW1lKG5ldyBEYXRlKCkpOyAKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhdHRhY2hQb2xpY3lDb21wb25lbnRzKExpc3Q8UG9saWN5Q29tcG9uZW50PiBwb2xpY3lDb21wb25lbnRzKSB7Ci0JCWZvciAoSXRlcmF0b3I8UG9saWN5Q29tcG9uZW50PiBpdGVyYXRvciA9IHBvbGljeUNvbXBvbmVudHMuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJYXR0YWNoUG9saWN5Q29tcG9uZW50KChQb2xpY3lDb21wb25lbnQpIGl0ZXJhdG9yLm5leHQoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhdHRhY2hQb2xpY3lDb21wb25lbnQoUG9saWN5Q29tcG9uZW50IHBvbGljeUNvbXBvbmVudCkgewotCQlpZiAocG9saWN5Q29tcG9uZW50IGluc3RhbmNlb2YgUG9saWN5KSB7Ci0JCQlhdHRhY2hQb2xpY3koKFBvbGljeSkgcG9saWN5Q29tcG9uZW50KTsKLQkJfSBlbHNlIGlmIChwb2xpY3lDb21wb25lbnQgaW5zdGFuY2VvZiBQb2xpY3lSZWZlcmVuY2UpIHsKLQkJCWF0dGFjaFBvbGljeVJlZmVyZW5jZSgoUG9saWN5UmVmZXJlbmNlKSBwb2xpY3lDb21wb25lbnQpOwotCQl9IGVsc2UgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLQkJCQkJIkludmFsaWQgdG9wIGxldmVsIHBvbGljeSBjb21wb25lbnQgdHlwZSIpOwotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhdHRhY2hQb2xpY3lDb21wb25lbnQoU3RyaW5nIGtleSwKLQkJCVBvbGljeUNvbXBvbmVudCBwb2xpY3lDb21wb25lbnQpIHsKLQkJYXR0YWNoZWRQb2xpY3lDb21wb25lbnRzLnB1dChrZXksIHBvbGljeUNvbXBvbmVudCk7Ci0JCXNldExhc3RVcGRhdGVkVGltZShuZXcgRGF0ZSgpKTsKLQkJCi0JCWlmICghaXNVcGRhdGVkKCkpIHsKLQkJCXNldFVwZGF0ZWQodHJ1ZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgUG9saWN5Q29tcG9uZW50IGdldEF0dGFjaGVkUG9saWN5Q29tcG9uZW50KFN0cmluZyBrZXkpIHsKLQkJcmV0dXJuIChQb2xpY3lDb21wb25lbnQpIGF0dGFjaGVkUG9saWN5Q29tcG9uZW50cy5nZXQoa2V5KTsKLQotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uPFBvbGljeUNvbXBvbmVudD4gZ2V0QXR0YWNoZWRQb2xpY3lDb21wb25lbnRzKCkgewotCQlyZXR1cm4gYXR0YWNoZWRQb2xpY3lDb21wb25lbnRzLnZhbHVlcygpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzVXBkYXRlZCgpIHsKLQkJcmV0dXJuIHVwZGF0ZWQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VXBkYXRlZChib29sZWFuIHVwZGF0ZWQpIHsKLQkJdGhpcy51cGRhdGVkID0gdXBkYXRlZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGVQb2xpY3koUG9saWN5IHBvbGljeSkgewotCQlTdHJpbmcga2V5ID0gKHBvbGljeS5nZXROYW1lKCkgIT0gbnVsbCkgPyBwb2xpY3kuZ2V0TmFtZSgpIDogcG9saWN5Ci0JCQkJLmdldElkKCk7Ci0JCWlmIChrZXkgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLQkJCQkJInBvbGljeSBkb2Vzbid0IGhhdmUgYSBuYW1lIG9yIGFuIGlkICIpOwotCQl9Ci0JCWF0dGFjaGVkUG9saWN5Q29tcG9uZW50cy5wdXQoa2V5LCBwb2xpY3kpOwotCQlzZXRMYXN0VXBkYXRlZFRpbWUobmV3IERhdGUoKSk7Ci0JCQotCQlpZiAoIWlzVXBkYXRlZCgpKSB7Ci0JCQlzZXRVcGRhdGVkKHRydWUpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZGV0YWNoUG9saWN5Q29tcG9uZW50KFN0cmluZyBrZXkpIHsKLQkJYXR0YWNoZWRQb2xpY3lDb21wb25lbnRzLnJlbW92ZShrZXkpOwotCQlzZXRMYXN0VXBkYXRlZFRpbWUobmV3IERhdGUoKSk7Ci0JCWlmICghaXNVcGRhdGVkKCkpIHsKLQkJCXNldFVwZGF0ZWQodHJ1ZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJYXR0YWNoZWRQb2xpY3lDb21wb25lbnRzLmNsZWFyKCk7Ci0JCXNldExhc3RVcGRhdGVkVGltZShuZXcgRGF0ZSgpKTsKLQkJaWYgKCFpc1VwZGF0ZWQoKSkgewotCQkJc2V0VXBkYXRlZCh0cnVlKTsKLQkJfQotCX0KLQotCXB1YmxpYyBEYXRlIGdldExhc3RVcGRhdGVkVGltZSgpIHsKLQkJcmV0dXJuIGxhc3RVcGRhdGVkVGltZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMYXN0VXBkYXRlZFRpbWUoRGF0ZSBsYXN0VXBkYXRlZFRpbWUpIHsKLQkJdGhpcy5sYXN0VXBkYXRlZFRpbWUgPSBsYXN0VXBkYXRlZFRpbWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL1JvYnVzdE91dE9ubHlBeGlzT3BlcmF0aW9uLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vUm9idXN0T3V0T25seUF4aXNPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjU2YzAzNy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vUm9idXN0T3V0T25seUF4aXNPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5VVUlER2VuZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuT3BlcmF0aW9uQ2xpZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50Lk9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5TZXJ2aWNlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzRW5naW5lOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0LlRyYW5zcG9ydFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5VdGlsczsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotcHVibGljIGNsYXNzIFJvYnVzdE91dE9ubHlBeGlzT3BlcmF0aW9uIGV4dGVuZHMgT3V0SW5BeGlzT3BlcmF0aW9uIHsKLQotICAgIHB1YmxpYyBSb2J1c3RPdXRPbmx5QXhpc09wZXJhdGlvbigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgLy9zZXR1cCBhIHRlbXBvcmFyeSBuYW1lCi0gICAgICAgIFFOYW1lIHRtcE5hbWUgPSBuZXcgUU5hbWUodGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSArICJfIiArIFVVSURHZW5lcmF0b3IuZ2V0VVVJRCgpKTsKLSAgICAgICAgdGhpcy5zZXROYW1lKHRtcE5hbWUpOwotICAgICAgICBzZXRNZXNzYWdlRXhjaGFuZ2VQYXR0ZXJuKFdTREwyQ29uc3RhbnRzLk1FUF9VUklfUk9CVVNUX09VVF9PTkxZKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUm9idXN0T3V0T25seUF4aXNPcGVyYXRpb24oUU5hbWUgbmFtZSkgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICAgICAgc2V0TWVzc2FnZUV4Y2hhbmdlUGF0dGVybihXU0RMMkNvbnN0YW50cy5NRVBfVVJJX1JPQlVTVF9PVVRfT05MWSk7Ci0gICAgfQotCi0gICAgcHVibGljIE9wZXJhdGlvbkNsaWVudCBjcmVhdGVDbGllbnQoU2VydmljZUNvbnRleHQgc2MsIE9wdGlvbnMgb3B0aW9ucykgewotICAgICAgICByZXR1cm4gbmV3IFJvYnVzdE91dE9ubHlPcGVyYXRpb25DbGllbnQodGhpcywgc2MsIG9wdGlvbnMpOwotICAgIH0KLQotICAgIGNsYXNzIFJvYnVzdE91dE9ubHlPcGVyYXRpb25DbGllbnQgZXh0ZW5kcyBPdXRJbkF4aXNPcGVyYXRpb25DbGllbnQgewotCi0gICAgICAgIHB1YmxpYyBSb2J1c3RPdXRPbmx5T3BlcmF0aW9uQ2xpZW50KE91dEluQXhpc09wZXJhdGlvbiBheGlzT3AsIFNlcnZpY2VDb250ZXh0IHNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25zIG9wdGlvbnMpIHsKLSAgICAgICAgICAgIHN1cGVyKGF4aXNPcCwgc2MsIG9wdGlvbnMpOwotICAgICAgICB9Ci0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCB0aW1lT3V0KCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgICAgIC8vTm90aGluZyB0byB3b3JyeQotICAgICAgICB9Ci0KLQotICAgICAgICAvKioKLSAgICAgICAgICogSWYgdGhlcmUgaXMgYSBmYXVsdCB0aGVuIG5lZWQgdG8gaGFuZGxlIHRoYXQKLSAgICAgICAgICogQHBhcmFtIHJlc3BvbnNlTWVzc2FnZUNvbnRleHQgcmVzcG9uc2VNZXNzYWdlQ29udGV4dAotICAgICAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdAotICAgICAgICAgKi8KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlUmVzcG9uc2UoTWVzc2FnZUNvbnRleHQgcmVzcG9uc2VNZXNzYWdlQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgICAgICBTT0FQRW52ZWxvcGUgZW52ZWxvcGUgPSByZXNwb25zZU1lc3NhZ2VDb250ZXh0LmdldEVudmVsb3BlKCk7Ci0gICAgICAgICAgICBpZiAoZW52ZWxvcGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIElmIHJlcXVlc3QgaXMgUkVTVCB3ZSBhc3N1bWUgdGhlIHJlc3BvbnNlTWVzc2FnZUNvbnRleHQgaXMgUkVTVCwgc28KLSAgICAgICAgICAgICAgICAvLyBzZXQgdGhlIHZhcmlhYmxlCi0gICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gaW5TdHJlYW0gPSAoSW5wdXRTdHJlYW0pIHJlc3BvbnNlTWVzc2FnZUNvbnRleHQuCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRQcm9wZXJ0eShNZXNzYWdlQ29udGV4dC5UUkFOU1BPUlRfSU4pOwotICAgICAgICAgICAgICAgIGlmIChpblN0cmVhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVudmVsb3BlID0gVHJhbnNwb3J0VXRpbHMuY3JlYXRlU09BUE1lc3NhZ2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VNZXNzYWdlQ29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlTWVzc2FnZUNvbnRleHQuc2V0RW52ZWxvcGUoZW52ZWxvcGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXNwb25zZU1lc3NhZ2VDb250ZXh0LnNldEVudmVsb3BlKGVudmVsb3BlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChlbnZlbG9wZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGVudmVsb3BlLmhhc0ZhdWx0KCl8fCByZXNwb25zZU1lc3NhZ2VDb250ZXh0LmlzUHJvY2Vzc2luZ0ZhdWx0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy9yZWNlaXZpbmcgYSBmYXVsdAotICAgICAgICAgICAgICAgICAgICBBeGlzRW5naW5lLnJlY2VpdmUocmVzcG9uc2VNZXNzYWdlQ29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IFV0aWxzLmdldEluYm91bmRGYXVsdEZyb21NZXNzYWdlQ29udGV4dChyZXNwb25zZU1lc3NhZ2VDb250ZXh0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vVHJhbnNwb3J0SW5EZXNjcmlwdGlvbi5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL1RyYW5zcG9ydEluRGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGUyYjk4OS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vVHJhbnNwb3J0SW5EZXNjcmlwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLlBoYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucGhhc2VyZXNvbHZlci5QaGFzZU1ldGFkYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0LlRyYW5zcG9ydExpc3RlbmVyOwotCi0vKioKLSAqIFJlcHJlc2VudHMgYW4gaW5jb21pbmcgdHJhbnNwb3J0IGRlcGxveWVkIGluIEF4aXMyLgotICovCi1wdWJsaWMgY2xhc3MgVHJhbnNwb3J0SW5EZXNjcmlwdGlvbiBpbXBsZW1lbnRzIFBhcmFtZXRlckluY2x1ZGUgewotCi0gICAgLyoqCi0gICAgICogRmllbGQgZmxvd0luY2x1ZGUKLSAgICAgKi8KLSAgICBwcml2YXRlIEZsb3cgZmF1bHRGbG93OwotCi0gICAgLy8gU3RvcmVzIGhhbmRsZXIgRmF1bHQgaW4gaW5GbG93Ci0gICAgcHJpdmF0ZSBQaGFzZSBmYXVsdFBoYXNlOwotCi0gICAgLyoqCi0gICAgICogRmllbGQgZmxvd0luY2x1ZGUKLSAgICAgKi8KLSAgICBwcml2YXRlIEZsb3cgaW5GbG93OwotCi0gICAgLy8gdG8gc3RvcmUgaGFuZGxlciBpbiBpbkZsb3cKLSAgICBwcml2YXRlIFBoYXNlIGluUGhhc2U7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBuYW1lCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBuYW1lOwotCi0gICAgLyoqCi0gICAgICogRmllbGQgcGFyYW1JbmNsdWRlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGZpbmFsIFBhcmFtZXRlckluY2x1ZGUgcGFyYW1JbmNsdWRlOwotICAgIHByb3RlY3RlZCBUcmFuc3BvcnRMaXN0ZW5lciByZWNlaXZlcjsKLQotICAgIHB1YmxpYyBUcmFuc3BvcnRJbkRlc2NyaXB0aW9uKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHBhcmFtSW5jbHVkZSA9IG5ldyBQYXJhbWV0ZXJJbmNsdWRlSW1wbCgpOwotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgICAgICBpblBoYXNlID0gbmV3IFBoYXNlKFBoYXNlTWV0YWRhdGEuVFJBTlNQT1JUX1BIQVNFKTsKLSAgICAgICAgZmF1bHRQaGFzZSA9IG5ldyBQaGFzZShQaGFzZU1ldGFkYXRhLlRSQU5TUE9SVF9QSEFTRSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWV0aG9kIGFkZFBhcmFtZXRlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJhbQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZFBhcmFtZXRlcihQYXJhbWV0ZXIgcGFyYW0pIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBwYXJhbUluY2x1ZGUuYWRkUGFyYW1ldGVyKHBhcmFtKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVQYXJhbWV0ZXIoUGFyYW1ldGVyIHBhcmFtKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgcGFyYW1JbmNsdWRlLnJlbW92ZVBhcmFtZXRlcihwYXJhbSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGVzZXJpYWxpemVQYXJhbWV0ZXJzKE9NRWxlbWVudCBwYXJhbWV0ZXJFbGVtZW50KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgdGhpcy5wYXJhbUluY2x1ZGUuZGVzZXJpYWxpemVQYXJhbWV0ZXJzKHBhcmFtZXRlckVsZW1lbnQpOwotICAgIH0KLQotICAgIHB1YmxpYyBGbG93IGdldEZhdWx0RmxvdygpIHsKLSAgICAgICAgcmV0dXJuIGZhdWx0RmxvdzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUGhhc2UgZ2V0RmF1bHRQaGFzZSgpIHsKLSAgICAgICAgcmV0dXJuIGZhdWx0UGhhc2U7Ci0gICAgfQotCi0gICAgcHVibGljIEZsb3cgZ2V0SW5GbG93KCkgewotICAgICAgICByZXR1cm4gaW5GbG93OwotICAgIH0KLQotICAgIHB1YmxpYyBQaGFzZSBnZXRJblBoYXNlKCkgewotICAgICAgICByZXR1cm4gaW5QaGFzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgVHJhbnNwb3J0IG5hbWUgYXMgYSBRTmFtZQotICAgICAqIEByZXR1cm4gUmV0dXJucyBRTmFtZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ldGhvZCBnZXRQYXJhbWV0ZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZQotICAgICAqIEByZXR1cm4gUmV0dXJucyBQYXJhbWV0ZXIuCi0gICAgICovCi0gICAgcHVibGljIFBhcmFtZXRlciBnZXRQYXJhbWV0ZXIoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgcmV0dXJuIHBhcmFtSW5jbHVkZS5nZXRQYXJhbWV0ZXIobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIEFycmF5TGlzdDxQYXJhbWV0ZXI+IGdldFBhcmFtZXRlcnMoKSB7Ci0gICAgICAgIHJldHVybiBwYXJhbUluY2x1ZGUuZ2V0UGFyYW1ldGVycygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gUmV0dXJucyBUcmFuc3BvcnRMaXN0ZW5lci4KLSAgICAgKi8KLSAgICBwdWJsaWMgVHJhbnNwb3J0TGlzdGVuZXIgZ2V0UmVjZWl2ZXIoKSB7Ci0gICAgICAgIHJldHVybiByZWNlaXZlcjsKLSAgICB9Ci0KLSAgICAvLyB0byBjaGVjayB3aGV0aGVyIHRoZSBwYXJhbWV0ZXIgaXMgbG9ja2VkIGF0IGFueSBsZXZlbAotICAgIHB1YmxpYyBib29sZWFuIGlzUGFyYW1ldGVyTG9ja2VkKFN0cmluZyBwYXJhbWV0ZXJOYW1lKSB7Ci0gICAgICAgIHJldHVybiBwYXJhbUluY2x1ZGUuaXNQYXJhbWV0ZXJMb2NrZWQocGFyYW1ldGVyTmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RmF1bHRGbG93KEZsb3cgZmF1bHRGbG93KSB7Ci0gICAgICAgIHRoaXMuZmF1bHRGbG93ID0gZmF1bHRGbG93OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEZhdWx0UGhhc2UoUGhhc2UgZmF1bHRQaGFzZSkgewotICAgICAgICB0aGlzLmZhdWx0UGhhc2UgPSBmYXVsdFBoYXNlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEluRmxvdyhGbG93IGluRmxvdykgewotICAgICAgICB0aGlzLmluRmxvdyA9IGluRmxvdzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRJblBoYXNlKFBoYXNlIGluUGhhc2UpIHsKLSAgICAgICAgdGhpcy5pblBoYXNlID0gaW5QaGFzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gbmFtZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gcmVjZWl2ZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRSZWNlaXZlcihUcmFuc3BvcnRMaXN0ZW5lciByZWNlaXZlcikgewotICAgICAgICB0aGlzLnJlY2VpdmVyID0gcmVjZWl2ZXI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL1RyYW5zcG9ydE91dERlc2NyaXB0aW9uLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vVHJhbnNwb3J0T3V0RGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWUwYmI1MC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vVHJhbnNwb3J0T3V0RGVzY3JpcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLlBoYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucGhhc2VyZXNvbHZlci5QaGFzZU1ldGFkYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0LlRyYW5zcG9ydFNlbmRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLS8qKgotICogUmVwcmVzZW50cyBhIHRyYW5zcG9ydCBkZXBsb3llZCBpbiBBWGlzMgotICovCi1wdWJsaWMgY2xhc3MgVHJhbnNwb3J0T3V0RGVzY3JpcHRpb24gaW1wbGVtZW50cyBQYXJhbWV0ZXJJbmNsdWRlIHsKLQotICAgIC8qKgotICAgICAqIEZpZWxkIGZsb3dJbmNsdWRlCi0gICAgICovCi0gICAgcHJpdmF0ZSBGbG93IGZhdWx0RmxvdzsKLSAgICBwcml2YXRlIFBoYXNlIGZhdWx0UGhhc2U7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBuYW1lCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBuYW1lOwotCi0gICAgLyoqCi0gICAgICogRmllbGQgb3V0RmxvdwotICAgICAqLwotICAgIHByaXZhdGUgRmxvdyBvdXRGbG93OwotICAgIHByaXZhdGUgUGhhc2Ugb3V0UGhhc2U7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBwYXJhbUluY2x1ZGUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgZmluYWwgUGFyYW1ldGVySW5jbHVkZSBwYXJhbUluY2x1ZGU7Ci0gICAgcHJvdGVjdGVkIFRyYW5zcG9ydFNlbmRlciBzZW5kZXI7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBBeGlzVHJhbnNwb3J0LgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgVHJhbnNwb3J0T3V0RGVzY3JpcHRpb24oU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgcGFyYW1JbmNsdWRlID0gbmV3IFBhcmFtZXRlckluY2x1ZGVJbXBsKCk7Ci0gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgICAgIG91dFBoYXNlID0gbmV3IFBoYXNlKFBoYXNlTWV0YWRhdGEuVFJBTlNQT1JUX1BIQVNFKTsKLSAgICAgICAgZmF1bHRQaGFzZSA9IG5ldyBQaGFzZShQaGFzZU1ldGFkYXRhLlRSQU5TUE9SVF9QSEFTRSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWV0aG9kIGFkZFBhcmFtZXRlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJhbQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZFBhcmFtZXRlcihQYXJhbWV0ZXIgcGFyYW0pIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBwYXJhbUluY2x1ZGUuYWRkUGFyYW1ldGVyKHBhcmFtKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVQYXJhbWV0ZXIoUGFyYW1ldGVyIHBhcmFtKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgcGFyYW1JbmNsdWRlLnJlbW92ZVBhcmFtZXRlcihwYXJhbSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGVzZXJpYWxpemVQYXJhbWV0ZXJzKE9NRWxlbWVudCBwYXJhbWV0ZXJFbGVtZW50KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgdGhpcy5wYXJhbUluY2x1ZGUuZGVzZXJpYWxpemVQYXJhbWV0ZXJzKHBhcmFtZXRlckVsZW1lbnQpOwotICAgIH0KLQotICAgIHB1YmxpYyBGbG93IGdldEZhdWx0RmxvdygpIHsKLSAgICAgICAgcmV0dXJuIGZhdWx0RmxvdzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUGhhc2UgZ2V0RmF1bHRQaGFzZSgpIHsKLSAgICAgICAgcmV0dXJuIGZhdWx0UGhhc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBSZXR1cm5zIFFOYW1lLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIEZsb3cgZ2V0T3V0RmxvdygpIHsKLSAgICAgICAgcmV0dXJuIG91dEZsb3c7Ci0gICAgfQotCi0gICAgcHVibGljIFBoYXNlIGdldE91dFBoYXNlKCkgewotICAgICAgICByZXR1cm4gb3V0UGhhc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWV0aG9kIGdldFBhcmFtZXRlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lCi0gICAgICogQHJldHVybiBSZXR1cm5zIFBhcmFtZXRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgUGFyYW1ldGVyIGdldFBhcmFtZXRlcihTdHJpbmcgbmFtZSkgewotICAgICAgICByZXR1cm4gcGFyYW1JbmNsdWRlLmdldFBhcmFtZXRlcihuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXJyYXlMaXN0PFBhcmFtZXRlcj4gZ2V0UGFyYW1ldGVycygpIHsKLSAgICAgICAgcmV0dXJuIHBhcmFtSW5jbHVkZS5nZXRQYXJhbWV0ZXJzKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBSZXR1cm5zIFRyYW5zcG9ydFNlbmRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgVHJhbnNwb3J0U2VuZGVyIGdldFNlbmRlcigpIHsKLSAgICAgICAgcmV0dXJuIHNlbmRlcjsKLSAgICB9Ci0KLSAgICAvLyB0byBjaGVjayB3aGV0aGVyIHRoZSBwYXJhbWV0ZXIgaXMgbG9ja2VkIGF0IGFueSBsZXZlbAotICAgIHB1YmxpYyBib29sZWFuIGlzUGFyYW1ldGVyTG9ja2VkKFN0cmluZyBwYXJhbWV0ZXJOYW1lKSB7Ci0gICAgICAgIHJldHVybiBwYXJhbUluY2x1ZGUuaXNQYXJhbWV0ZXJMb2NrZWQocGFyYW1ldGVyTmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RmF1bHRGbG93KEZsb3cgZmF1bHRGbG93KSB7Ci0gICAgICAgIHRoaXMuZmF1bHRGbG93ID0gZmF1bHRGbG93OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEZhdWx0UGhhc2UoUGhhc2UgZmF1bHRQaGFzZSkgewotICAgICAgICB0aGlzLmZhdWx0UGhhc2UgPSBmYXVsdFBoYXNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBuYW1lCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE91dEZsb3coRmxvdyBvdXRGbG93KSB7Ci0gICAgICAgIHRoaXMub3V0RmxvdyA9IG91dEZsb3c7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0T3V0UGhhc2UoUGhhc2Ugb3V0UGhhc2UpIHsKLSAgICAgICAgdGhpcy5vdXRQaGFzZSA9IG91dFBoYXNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBzZW5kZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTZW5kZXIoVHJhbnNwb3J0U2VuZGVyIHNlbmRlcikgewotICAgICAgICB0aGlzLnNlbmRlciA9IHNlbmRlcjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vVHdvQ2hhbm5lbEF4aXNPcGVyYXRpb24uamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9Ud29DaGFubmVsQXhpc09wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzE5YTJmLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9Ud29DaGFubmVsQXhpc09wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5VVUlER2VuZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuT3BlcmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmkxOG4uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLldTRExDb25zdGFudHM7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpcyB0byBrZWVwIGNvbW1vbiBtZXRob2RzIGFuZCBwcm9wZXJ0aWVzIGluIEluT3V0IGFuZCBPdXRJbiBheGlzT3BlcmF0aW9uCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUd29DaGFubmVsQXhpc09wZXJhdGlvbiBleHRlbmRzIEF4aXNPcGVyYXRpb24gewotCi0gICAgcHJvdGVjdGVkIEF4aXNNZXNzYWdlIGluRmF1bHRNZXNzYWdlOwotICAgIHByb3RlY3RlZCBBeGlzTWVzc2FnZSBvdXRGYXVsdE1lc3NhZ2U7Ci0gICAgcHJvdGVjdGVkIEF4aXNNZXNzYWdlIGluTWVzc2FnZTsKLSAgICBwcm90ZWN0ZWQgQXhpc01lc3NhZ2Ugb3V0TWVzc2FnZTsKLQotICAgIHB1YmxpYyBUd29DaGFubmVsQXhpc09wZXJhdGlvbigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgLy9zZXR1cCBhIHRlbXBvcmFyeSBuYW1lCi0gICAgICAgIFFOYW1lIHRtcE5hbWUgPSBuZXcgUU5hbWUodGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSArICJfIiArIFVVSURHZW5lcmF0b3IuZ2V0VVVJRCgpKTsKLSAgICAgICAgdGhpcy5zZXROYW1lKHRtcE5hbWUpOwotICAgICAgICBjcmVhdGVNZXNzYWdlcygpOwotICAgIH0KLQotICAgIHB1YmxpYyBUd29DaGFubmVsQXhpc09wZXJhdGlvbihRTmFtZSBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgICAgICBjcmVhdGVNZXNzYWdlcygpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVNZXNzYWdlcygpIHsKLSAgICAgICAgaW5NZXNzYWdlID0gbmV3IEF4aXNNZXNzYWdlKCk7Ci0gICAgICAgIGluTWVzc2FnZS5zZXREaXJlY3Rpb24oV1NETENvbnN0YW50cy5XU0RMX01FU1NBR0VfRElSRUNUSU9OX0lOKTsKLSAgICAgICAgaW5NZXNzYWdlLnNldFBhcmVudCh0aGlzKTsKLSAgICAgICAgYWRkQ2hpbGQoImluTWVzc2FnZSIsIGluTWVzc2FnZSk7Ci0KLSAgICAgICAgaW5GYXVsdE1lc3NhZ2UgPSBuZXcgQXhpc01lc3NhZ2UoKTsKLSAgICAgICAgaW5GYXVsdE1lc3NhZ2Uuc2V0UGFyZW50KHRoaXMpOwotCi0gICAgICAgIG91dEZhdWx0TWVzc2FnZSA9IG5ldyBBeGlzTWVzc2FnZSgpOwotICAgICAgICBvdXRGYXVsdE1lc3NhZ2Uuc2V0UGFyZW50KHRoaXMpOwotCi0gICAgICAgIG91dE1lc3NhZ2UgPSBuZXcgQXhpc01lc3NhZ2UoKTsKLSAgICAgICAgb3V0TWVzc2FnZS5zZXREaXJlY3Rpb24oV1NETENvbnN0YW50cy5XU0RMX01FU1NBR0VfRElSRUNUSU9OX09VVCk7Ci0gICAgICAgIG91dE1lc3NhZ2Uuc2V0UGFyZW50KHRoaXMpOwotICAgICAgICBhZGRDaGlsZCgib3V0TWVzc2FnZSIsIG91dE1lc3NhZ2UpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZE1lc3NhZ2UoQXhpc01lc3NhZ2UgbWVzc2FnZSwgU3RyaW5nIGxhYmVsKSB7Ci0gICAgICAgIGlmIChXU0RMQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfT1VUX1ZBTFVFLmVxdWFscyhsYWJlbCkpIHsKLSAgICAgICAgICAgIGFkZENoaWxkKCJvdXRNZXNzYWdlIiwgbWVzc2FnZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoV1NETENvbnN0YW50cy5NRVNTQUdFX0xBQkVMX0lOX1ZBTFVFLmVxdWFscyhsYWJlbCkpIHsKLSAgICAgICAgICAgIGFkZENoaWxkKCJpbk1lc3NhZ2UiLCBtZXNzYWdlKTsKLSAgICAgICAgfSBlbHNlIGlmIChXU0RMQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfRkFVTFRfVkFMVUUuZXF1YWxzKGxhYmVsKSkgewotICAgICAgICAgICAgYWRkQ2hpbGQoImZhdWx0TWVzc2FnZSIsIG1lc3NhZ2UpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJOb3QgeWV0IGltcGxlbWVudGVkIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIHB1YmxpYyBBeGlzTWVzc2FnZSBnZXRNZXNzYWdlKFN0cmluZyBsYWJlbCkgewotICAgICAgICBpZiAoV1NETENvbnN0YW50cy5NRVNTQUdFX0xBQkVMX09VVF9WQUxVRS5lcXVhbHMobGFiZWwpKSB7Ci0gICAgICAgICAgICByZXR1cm4gKEF4aXNNZXNzYWdlKSBnZXRDaGlsZCgib3V0TWVzc2FnZSIpOwotICAgICAgICB9IGVsc2UgaWYgKFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9JTl9WQUxVRS5lcXVhbHMobGFiZWwpKSB7Ci0gICAgICAgICAgICByZXR1cm4gKEF4aXNNZXNzYWdlKSBnZXRDaGlsZCgiaW5NZXNzYWdlIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCB5ZXQgaW1wbGVtZW50ZWQiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZEZhdWx0TWVzc2FnZUNvbnRleHQoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCwgT3BlcmF0aW9uQ29udGV4dCBvcENvbnRleHQpCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgSGFzaE1hcDxTdHJpbmcsIE1lc3NhZ2VDb250ZXh0PiBtZXAgPSBvcENvbnRleHQuZ2V0TWVzc2FnZUNvbnRleHRzKCk7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IGZhdWx0TWVzc2FnZUN0eHQgPSAoTWVzc2FnZUNvbnRleHQpIG1lcC5nZXQoTUVTU0FHRV9MQUJFTF9GQVVMVF9WQUxVRSk7Ci0KLSAgICAgICAgaWYgKGZhdWx0TWVzc2FnZUN0eHQgIT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdChNZXNzYWdlcy5nZXRNZXNzYWdlKCJtZXBjb21wbGV0ZWQiKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtZXAucHV0KE1FU1NBR0VfTEFCRUxfRkFVTFRfVkFMVUUsIG1zZ0NvbnRleHQpOwotICAgICAgICAgICAgb3BDb250ZXh0LnNldENvbXBsZXRlKHRydWUpOwotICAgICAgICAgICAgb3BDb250ZXh0LmNsZWFudXAoKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHVibGljIEFycmF5TGlzdCBnZXRQaGFzZXNJbkZhdWx0RmxvdygpIHsKLSAgICAgICAgcmV0dXJuIGluRmF1bHRNZXNzYWdlLmdldE1lc3NhZ2VGbG93KCk7Ci0gICAgfQotCi0gICAgcHVibGljIEFycmF5TGlzdCBnZXRQaGFzZXNPdXRGYXVsdEZsb3coKSB7Ci0gICAgICAgIHJldHVybiBvdXRGYXVsdE1lc3NhZ2UuZ2V0TWVzc2FnZUZsb3coKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXJyYXlMaXN0IGdldFBoYXNlc091dEZsb3coKSB7Ci0gICAgICAgIHJldHVybiBvdXRNZXNzYWdlLmdldE1lc3NhZ2VGbG93KCk7Ci0gICAgfQotCi0gICAgcHVibGljIEFycmF5TGlzdCBnZXRSZW1haW5pbmdQaGFzZXNJbkZsb3coKSB7Ci0gICAgICAgIHJldHVybiBpbk1lc3NhZ2UuZ2V0TWVzc2FnZUZsb3coKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQaGFzZXNJbkZhdWx0RmxvdyhBcnJheUxpc3QgbGlzdCkgewotICAgICAgICBpbkZhdWx0TWVzc2FnZS5zZXRNZXNzYWdlRmxvdyhsaXN0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQaGFzZXNPdXRGYXVsdEZsb3coQXJyYXlMaXN0IGxpc3QpIHsKLSAgICAgICAgb3V0RmF1bHRNZXNzYWdlLnNldE1lc3NhZ2VGbG93KGxpc3QpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBoYXNlc091dEZsb3coQXJyYXlMaXN0IGxpc3QpIHsKLSAgICAgICAgb3V0TWVzc2FnZS5zZXRNZXNzYWdlRmxvdyhsaXN0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRSZW1haW5pbmdQaGFzZXNJbkZsb3coQXJyYXlMaXN0IGxpc3QpIHsKLSAgICAgICAgaW5NZXNzYWdlLnNldE1lc3NhZ2VGbG93KGxpc3QpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9WZXJzaW9uLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vVmVyc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjkwNGFhLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9WZXJzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS50ZXh0LlBhcnNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLS8qKgotICogQ2xhc3MgcmVwcmVzZW50aW5nIGEgdmVyc2lvbiBudW1iZXIgYW5kIGltcGxlbWVudGluZyBhIGNvbXBhcmlzb24gYWxnb3JpdGhtIGNvbXBhdGlibGUKLSAqIHdpdGggTWF2ZW4uIFRoaXMgY2xhc3MgaXMgcHJpbWFyaWx5IHVzZWQgZm9yIG1vZHVsZSB2ZXJzaW9ucy4KLSAqLwotcHVibGljIGNsYXNzIFZlcnNpb24gaW1wbGVtZW50cyBTZXJpYWxpemFibGUsIENvbXBhcmFibGU8VmVyc2lvbj4gewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTX1NOQVBTSE9UID0gIlNOQVBTSE9UIjsKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFZlcnNpb24gU05BUFNIT1QgPSBuZXcgVmVyc2lvbihudWxsLCBTX1NOQVBTSE9UKTsKLSAgICAKLSAgICBwcml2YXRlIGZpbmFsIGludFtdIGNvbXBvbmVudHM7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcXVhbGlmaWVyOwotICAgIAotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqIAotICAgICAqIEBwYXJhbSBjb21wb25lbnRzIHRoZSBudW1lcmljIGNvbXBvbmVudHMgb2YgdGhlIHZlcnNpb247IG1heSBiZSBudWxsIGZvciBTTkFQU0hPVCB2ZXJzaW9uCi0gICAgICogQHBhcmFtIHF1YWxpZmllciB0aGUgcXVhbGlmaWVyCi0gICAgICovCi0gICAgcHVibGljIFZlcnNpb24oaW50W10gY29tcG9uZW50cywgU3RyaW5nIHF1YWxpZmllcikgewotICAgICAgICB0aGlzLmNvbXBvbmVudHMgPSBjb21wb25lbnRzID09IG51bGwgPyBudWxsIDogY29tcG9uZW50cy5jbG9uZSgpOwotICAgICAgICB0aGlzLnF1YWxpZmllciA9IHF1YWxpZmllcjsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgdGhhdCBwYXJzZXMgdGhlIHZlcnNpb24gZnJvbSBhIHN0cmluZy4gVGhlIHZlcnNpb24gbXVzdCBoYXZlIHRoZQotICAgICAqIGZvbGxvd2luZyBmb3JtYXQ6Ci0gICAgICogPHByZT4KLSAgICAgKiBpbnRlZ2VyICggIi4iIGludGVnZXIgKSogKCAiLSIgcXVhbGlmaWVyICk/Ci0gICAgICogPC9wcmU+Ci0gICAgICogCi0gICAgICogQHBhcmFtIHZlcnNpb25TdHJpbmcgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgdmVyc2lvbgotICAgICAqIEB0aHJvd3MgUGFyc2VFeGNlcHRpb24gaWYgdGhlIHZlcnNpb24gaXMgbm90IGluIHRoZSBjb3JyZWN0IGZvcm1hdAotICAgICAqLwotICAgIHB1YmxpYyBWZXJzaW9uKFN0cmluZyB2ZXJzaW9uU3RyaW5nKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICBpZiAodmVyc2lvblN0cmluZy5lcXVhbHMoU19TTkFQU0hPVCkpIHsKLSAgICAgICAgICAgIGNvbXBvbmVudHMgPSBudWxsOwotICAgICAgICAgICAgcXVhbGlmaWVyID0gU19TTkFQU0hPVDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGludCBkYXNoSW5kZXggPSB2ZXJzaW9uU3RyaW5nLmluZGV4T2YoJy0nKTsKLSAgICAgICAgICAgIGlmIChkYXNoSW5kZXggIT0gLTEpIHsKLSAgICAgICAgICAgICAgICBxdWFsaWZpZXIgPSB2ZXJzaW9uU3RyaW5nLnN1YnN0cmluZyhkYXNoSW5kZXggKyAxKTsKLSAgICAgICAgICAgICAgICB2ZXJzaW9uU3RyaW5nID0gdmVyc2lvblN0cmluZy5zdWJzdHJpbmcoMCwgZGFzaEluZGV4KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcXVhbGlmaWVyID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFN0cmluZ1tdIGNvbXBvbmVudFN0cmluZ3MgPSB2ZXJzaW9uU3RyaW5nLnNwbGl0KCJcXC4iKTsKLSAgICAgICAgICAgIGludCBsID0gY29tcG9uZW50U3RyaW5ncy5sZW5ndGg7Ci0gICAgICAgICAgICBjb21wb25lbnRzID0gbmV3IGludFtsXTsKLSAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxsOyBpKyspIHsKLSAgICAgICAgICAgICAgICBjb21wb25lbnRzW2ldID0gSW50ZWdlci5wYXJzZUludChjb21wb25lbnRTdHJpbmdzW2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICByZXR1cm4gMzEqQXJyYXlzLmhhc2hDb2RlKGNvbXBvbmVudHMpICsgKChxdWFsaWZpZXIgPT0gbnVsbCkgPyAwIDogcXVhbGlmaWVyLmhhc2hDb2RlKCkpOwotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotICAgICAgICBpZiAodGhpcyA9PSBvYmopIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBWZXJzaW9uKSB7Ci0gICAgICAgICAgICBWZXJzaW9uIG90aGVyID0gKFZlcnNpb24pb2JqOwotICAgICAgICAgICAgcmV0dXJuIEFycmF5cy5lcXVhbHMoY29tcG9uZW50cywgb3RoZXIuY29tcG9uZW50cykKLSAgICAgICAgICAgICAgICAmJiAocXVhbGlmaWVyID09IG90aGVyLnF1YWxpZmllciB8fAotICAgICAgICAgICAgICAgICAgICAgICAgcXVhbGlmaWVyICE9IG51bGwgJiYgcXVhbGlmaWVyLmVxdWFscyhvdGhlci5xdWFsaWZpZXIpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgaWYgKGNvbXBvbmVudHMgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPGNvbXBvbmVudHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoaT4wKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoJy4nKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChjb21wb25lbnRzW2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAocXVhbGlmaWVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChjb21wb25lbnRzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCctJyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBidWZmZXIuYXBwZW5kKHF1YWxpZmllcik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgY29tcGFyZVRvKFZlcnNpb24gbykgewotICAgICAgICAvLyBjb21wb25lbnRzID09IG51bGwgbWVhbnMgU05BUFNIT1QgYW5kIFNOQVBTSE9UIGlzIGFsd2F5cwotICAgICAgICAvLyBhc3N1bWVkIHRvIGJlIHRoZSBtb3N0IHJlY2VudCB2ZXJzaW9uCi0gICAgICAgIGlmIChjb21wb25lbnRzID09IG51bGwgJiYgby5jb21wb25lbnRzICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9IGVsc2UgaWYgKGNvbXBvbmVudHMgIT0gbnVsbCAmJiBvLmNvbXBvbmVudHMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9IGVsc2UgaWYgKGNvbXBvbmVudHMgPT0gbnVsbCAmJiBvLmNvbXBvbmVudHMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gTm93IGNvbXBhcmUgdmVyc2lvbiBjb21wb25lbnRzCi0gICAgICAgIGludCBsID0gTWF0aC5taW4oY29tcG9uZW50cy5sZW5ndGgsIG8uY29tcG9uZW50cy5sZW5ndGgpOwotICAgICAgICBmb3IgKGludCBpPTA7IGk8bDsgaSsrKSB7Ci0gICAgICAgICAgICBpbnQgYyA9IGNvbXBvbmVudHNbaV0gLSBvLmNvbXBvbmVudHNbaV07Ci0gICAgICAgICAgICBpZiAoYyAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8geC55IGFsd2F5cyBjb21lcyBiZWZvcmUgeC55LnoKLSAgICAgICAgaW50IGMgPSBjb21wb25lbnRzLmxlbmd0aCAtIG8uY29tcG9uZW50cy5sZW5ndGg7Ci0gICAgICAgIGlmIChjICE9IDApIHsKLSAgICAgICAgICAgIHJldHVybiBjOwotICAgICAgICB9Ci0gICAgICAgIC8vIHgueSBhbHdheXMgY29tZXMgYWZ0ZXIgeC55LXFxcXFxcQotICAgICAgICBpZiAocXVhbGlmaWVyID09IG51bGwgJiYgby5xdWFsaWZpZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIH0gZWxzZSBpZiAocXVhbGlmaWVyICE9IG51bGwgJiYgby5xdWFsaWZpZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9IGVsc2UgaWYgKHF1YWxpZmllciA9PSBudWxsICYmIG8ucXVhbGlmaWVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIC8vIHgueS1TTkFQU0hPVCBjb21lcyBhZnRlciBhbnkgeC55LXFxcXFxcQotICAgICAgICBib29sZWFuIHRoaXNJc1NuYXBzaG90ID0gcXVhbGlmaWVyLmVxdWFscyhTX1NOQVBTSE9UKTsKLSAgICAgICAgYm9vbGVhbiBvdGhlcklzU25hcHNob3QgPSBvLnF1YWxpZmllci5lcXVhbHMoU19TTkFQU0hPVCk7Ci0gICAgICAgIGlmICh0aGlzSXNTbmFwc2hvdCAmJiAhb3RoZXJJc1NuYXBzaG90KSB7Ci0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfSBlbHNlIGlmICghdGhpc0lzU25hcHNob3QgJiYgdGhpc0lzU25hcHNob3QpIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfSBlbHNlIGlmICh0aGlzSXNTbmFwc2hvdCAmJiBvdGhlcklzU25hcHNob3QpIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIC8vIEZpbmFsbHkgY29tcGFyZSB0aGUgcXVhbGlmaWVycyB1c2luZyBjYXNlLWluc2Vuc2l0aXZlIHN0cmluZyBjb21wYXJpc29uLgotICAgICAgICByZXR1cm4gcXVhbGlmaWVyLmNvbXBhcmVUb0lnbm9yZUNhc2Uoby5xdWFsaWZpZXIpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9XU0RMMTFUb0FsbEF4aXNTZXJ2aWNlc0J1aWxkZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9XU0RMMTFUb0FsbEF4aXNTZXJ2aWNlc0J1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODVmYWJjYy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vV1NETDExVG9BbGxBeGlzU2VydmljZXNCdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5TZXJ2aWNlOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogRXh0ZW5kcyB0aGUgV1NETDExVG9BeGlzU2VydmljZUJ1aWxkZXIgY2xhc3MgdG8gcHJvdmlkZSBmdW5jdGlvbmFsaXR5IHRvIHJldHVybgotICogbXVsdGlwbGUgQXhpc1NlcnZpY2Ugb2JqZWN0czsgb25lIGZvciBlYWNoIHBvcnQgb24gZWFjaCBzZXJ2aWNlIGluIHRoZSBXU0RMIDEuMSBmaWxlLgotICovCi1wdWJsaWMgY2xhc3MgV1NETDExVG9BbGxBeGlzU2VydmljZXNCdWlsZGVyIGV4dGVuZHMgV1NETDExVG9BeGlzU2VydmljZUJ1aWxkZXIgewotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgTG9nIGxvZyA9Ci0gICAgICAgICAgICBMb2dGYWN0b3J5LmdldExvZyhXU0RMMTFUb0FsbEF4aXNTZXJ2aWNlc0J1aWxkZXIuY2xhc3MpOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NETF9TRVJWSUNFX1FOQU1FID0gIldTRExfU0VSVklDRV9RTkFNRSI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXU0RMX1BPUlQgPSAiV1NETF9QT1JUIjsKLQotICAgIHByaXZhdGUgQXJyYXlMaXN0PEF4aXNTZXJ2aWNlPiBheGlzU2VydmljZXMgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogQ2xhc3MgY29uc3RydWN0b3IuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaW4gLSBDb250YWlucyB0aGUgd3NkbCAxLjEgZmlsZQotICAgICAqLwotICAgIHB1YmxpYyBXU0RMMTFUb0FsbEF4aXNTZXJ2aWNlc0J1aWxkZXIoSW5wdXRTdHJlYW0gaW4pIHsKLSAgICAgICAgc3VwZXIoaW4pOwotICAgICAgICBheGlzU2VydmljZXMgPSBuZXcgQXJyYXlMaXN0PEF4aXNTZXJ2aWNlPigpOyAgIC8vIGNyZWF0ZSBhbiBlbXB0eSBBcnJheUxpc3QKLSAgICB9Ci0KLSAgICBwdWJsaWMgV1NETDExVG9BbGxBeGlzU2VydmljZXNCdWlsZGVyKERlZmluaXRpb24gZGVmKSB7Ci0gICAgICAgIHN1cGVyKGRlZiwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIGF4aXNTZXJ2aWNlcyA9IG5ldyBBcnJheUxpc3Q8QXhpc1NlcnZpY2U+KCk7ICAgLy8gY3JlYXRlIGFuIGVtcHR5IEFycmF5TGlzdAotICAgIH0KLQotICAgICBwdWJsaWMgV1NETDExVG9BbGxBeGlzU2VydmljZXNCdWlsZGVyKERlZmluaXRpb24gZGVmLCBTdHJpbmcgcG9ydE5hbWUpIHsKLSAgICAgICAgc3VwZXIoZGVmLCBudWxsLCBwb3J0TmFtZSk7Ci0gICAgICAgIGF4aXNTZXJ2aWNlcyA9IG5ldyBBcnJheUxpc3Q8QXhpc1NlcnZpY2U+KCk7ICAgLy8gY3JlYXRlIGFuIGVtcHR5IEFycmF5TGlzdAotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogUHVibGljIG1ldGhvZCB0byBhY2Nlc3MgdGhlIHdzZGwgMS4xIGZpbGUgYW5kIGNyZWF0ZSBhIExpc3Qgb2YgQXhpc1NlcnZpY2Ugb2JqZWN0cy4KLSAgICAgKiBGb3IgZWFjaCBwb3J0IG9uIGVhY2ggc2VydmljZSBpbiB0aGUgd3NkbCwgYW4gQXhpc1NlcnZpY2Ugb2JqZWN0IGlzIGNyZWF0ZWQgYW5kCi0gICAgICogYWRkZWQgdG8gdGhlIExpc3QuICBUaGUgbmFtZSBvZiB0aGUgQXhpc1NlcnZpY2UgaXMgY2hhbmdlZCBmcm9tIHRoZSBzZXJ2aWNlIG5hbWUKLSAgICAgKiB0byB0aGUgcG9ydCBuYW1lLCBzaW5jZSBwb3J0IG5hbWVzIGFyZSB1bmlxdWUgdG8gdGhlIHdzZGwuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIEEgTGlzdCBjb250YWluaW5nIG9uZSBBeGlzU2VydmljZSBvYmplY3QgZm9yIGVhY2ggcG9ydCBpbiB0aGUgd3NkbCBmaWxlLgotICAgICAqICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIEF4aXNTZXJ2aWNlIGlzIG1vZGlmaWVkIGZyb20gdGhlIHNlcnZpY2UgbmFtZSB0byB0aGUgcG9ydCBuYW1lLgotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0Ci0gICAgICovCi0gICAgcHVibGljIExpc3Q8QXhpc1NlcnZpY2U+IHBvcHVsYXRlQWxsU2VydmljZXMoKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiRW50cnk6IHBvcHVsYXRlQWxsU2VydmljZXMiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc2V0dXAoKTsgIC8vIHNldHVwIGNvbnRhaW5zIGNvZGUgd2l0aCBnYXRoZXJzIG5vbi1zZXJ2aWNlIHNwZWNpZmljIGluZm8KLSAgICAgICAgICAgIC8vIGZyb20gdGhlIFdTREwuICBUaGlzIG9ubHkgbmVlZHMgdG8gYmUgZG9uZSBvbmNlIHBlciBXU0RMLgotICAgICAgICAgICAgaWYgKHdzZGw0akRlZmluaXRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkV4aXQ6IHBvcHVsYXRlQWxsU2VydmljZXMuICB3c2RsIGRlZmluaXRpb24gaXMgbnVsbCEiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7ICAgLy8gY2FuJ3QgZ28gYW55IGZ1cnRoZXIgd2l0aG91dCB0aGUgd3NkbAotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAod3NkbDRqRGVmaW5pdGlvbi5nZXRTZXJ2aWNlcygpLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBJdGVyYXRvciB3c2RsU2Vydkl0ZXIgPSB3c2RsNGpEZWZpbml0aW9uLmdldFNlcnZpY2VzKCkudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICBpZiAod3NkbDRqRGVmaW5pdGlvbi5nZXRTZXJ2aWNlcygpLnNpemUoKSA+IDEpewotICAgICAgICAgICAgICAgICAgICAgLy8gbGV0IHRoZSB3c2RsVG9zZXJ2aWNlIGJ1aWxkZXIgdG8gZGVjaWRlIHRoZSBwb3J0IHRvIGdlbmVyYXRlIGJpbmRpbmcKLSAgICAgICAgICAgICAgICAgICAgIHBvcnROYW1lID0gbnVsbDsKLSAgICAgICAgICAgICAgICB9IAotCi0gICAgICAgICAgICAgICAgd2hpbGUgKHdzZGxTZXJ2SXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gKFNlcnZpY2UpIHdzZGxTZXJ2SXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHNldCB0aGUgc2VydmljZU5hbWUgb24gdGhlIHBhcmVudCB0byBzZXR1cCBjYWxsIHRvIHBvcHVsYXRlU2VydmljZQotICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlTmFtZSA9IHNlcnZpY2UuZ2V0UU5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5heGlzU2VydmljZSA9IG5ldyBBeGlzU2VydmljZSgpOwotICAgICAgICAgICAgICAgICAgICAvLyBub3cgdGhhdCBzZXJ2aWNlTmFtZSBhbmQgcG9ydE5hbWUgYXJlIHNldCwgY2FsbCB1cCB0byB0aGUKLSAgICAgICAgICAgICAgICAgICAgLy8gcGFyZW50IGNsYXNzIHRvIHBvcHVsYXRlIHRoaXMgc2VydmljZS4KLSAgICAgICAgICAgICAgICAgICAgQXhpc1NlcnZpY2UgcmV0QXhpc1NlcnZpY2UgPSBwb3B1bGF0ZVNlcnZpY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJldEF4aXNTZXJ2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlcy5hZGQocmV0QXhpc1NlcnZpY2UpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIHJlc2V0IHRoZSBwb3J0IG5hbWUgaWYgaXQgaGFkIHNldCB3aGVuIG1vdmluZyB0byBuZXh0IHNlcnZpY2UKLSAgICAgICAgICAgICAgICAgICAgcG9ydE5hbWUgPSBudWxsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiTm8gc2VydmljZSB3YXMgbm90IGZvdW5kIGluIHRoZSBXU0RMIGF0ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgd3NkbDRqRGVmaW5pdGlvbi5nZXREb2N1bWVudEJhc2VVUkkoKQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHdpdGggdGFyZ2V0bmFtZXNwYWNlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgd3NkbDRqRGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJFeGl0OiBwb3B1bGF0ZUFsbFNlcnZpY2VzLiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGF4aXNTZXJ2aWNlczsKLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGUpIHsKLSAgICAgICAgICAgIHRocm93IGU7ICAvLyBqdXN0IHJldGhyb3cgYW55IEF4aXNGYXVsdHMKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygicG9wdWxhdGVBbGxTZXJ2aWNlcyBjYXVnaHQgRXhjZXB0aW9uLiAgQ29udmVydGluZyB0byBBeGlzRmF1bHQuICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRocm93IEF4aXNGYXVsdC5tYWtlRmF1bHQoZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9XU0RMMTFUb0F4aXNTZXJ2aWNlQnVpbGRlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL1dTREwxMVRvQXhpc1NlcnZpY2VCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4NDVkYjcuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL1dTREwxMVRvQXhpc1NlcnZpY2VCdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDkxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbjsKLQotaW1wb3J0IGNvbS5pYm0ud3NkbC51dGlsLnhtbC5ET00yV3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQMTFDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVAxMkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuQWRkcmVzc2luZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuQWRkcmVzc2luZ0hlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlSGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy53c2RsLldTREwxMUFjdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkhUVFBDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLkxvZ2dpbmdDb250cm9sOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5Qb2xpY3lVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5YTUxVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuU09BUEhlYWRlck1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLldTRExVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC51dGlsLldTRExEZWZpbml0aW9uV3JhcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm5lZXRoaS5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5uZWV0aGkuUG9saWN5OwotaW1wb3J0IG9yZy5hcGFjaGUubmVldGhpLlBvbGljeVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLnV0aWxzLk5hbWVzcGFjZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZzsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdGYXVsdDsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdJbnB1dDsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nT3V0cHV0OwotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLkZhdWx0OwotaW1wb3J0IGphdmF4LndzZGwuSW1wb3J0OwotaW1wb3J0IGphdmF4LndzZGwuSW5wdXQ7Ci1pbXBvcnQgamF2YXgud3NkbC5NZXNzYWdlOwotaW1wb3J0IGphdmF4LndzZGwuT3BlcmF0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuT3BlcmF0aW9uVHlwZTsKLWltcG9ydCBqYXZheC53c2RsLk91dHB1dDsKLWltcG9ydCBqYXZheC53c2RsLlBhcnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5Qb3J0OwotaW1wb3J0IGphdmF4LndzZGwuUG9ydFR5cGU7Ci1pbXBvcnQgamF2YXgud3NkbC5TZXJ2aWNlOwotaW1wb3J0IGphdmF4LndzZGwuVHlwZXM7Ci1pbXBvcnQgamF2YXgud3NkbC5XU0RMRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBBZGRyZXNzOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBCaW5kaW5nOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBPcGVyYXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRU11bHRpcGFydFJlbGF0ZWQ7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRVBhcnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNjaGVtYS5TY2hlbWE7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEFkZHJlc3M7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEJpbmRpbmc7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEJvZHk7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEhlYWRlcjsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQT3BlcmF0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwMTIuU09BUDEyQWRkcmVzczsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcDEyLlNPQVAxMkJpbmRpbmc7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAxMi5TT0FQMTJCb2R5OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwMTIuU09BUDEySGVhZGVyOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwMTIuU09BUDEyT3BlcmF0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuZmFjdG9yeS5XU0RMRmFjdG9yeTsKLWltcG9ydCBqYXZheC53c2RsLnhtbC5XU0RMTG9jYXRvcjsKLWltcG9ydCBqYXZheC53c2RsLnhtbC5XU0RMUmVhZGVyOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1wdWJsaWMgY2xhc3MgV1NETDExVG9BeGlzU2VydmljZUJ1aWxkZXIgZXh0ZW5kcyBXU0RMVG9BeGlzU2VydmljZUJ1aWxkZXIgewotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09NUE9ORU5UX1BPUlRfVFlQRSA9IDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09NUE9ORU5UX01FU1NBR0UgPSAyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTVBPTkVOVF9CSU5ESU5HID0gMzsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkKLSAgICAgICAgICAgIC5nZXRMb2coV1NETDExVG9BeGlzU2VydmljZUJ1aWxkZXIuY2xhc3MpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNUcmFjZUVuYWJsZWQgPSBsb2cuaXNUcmFjZUVuYWJsZWQoKTsKLQotICAgIHByb3RlY3RlZCBTdHJpbmcgcG9ydE5hbWU7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQklORElORyA9ICJCaW5kaW5nIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWSUNFID0gIlNlcnZpY2UiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBPUlQgPSAiUG9ydCI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUE9SVF9UWVBFID0gIlBvcnRUeXBlIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQT1JUX1RZUEVfT1BFUkFUSU9OID0gIlBvcnRUeXBlLk9wZXJhdGlvbiI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUE9SVF9UWVBFX09QRVJBVElPTl9JTlBVVCA9ICJQb3J0VHlwZS5PcGVyYXRpb24uSW5wdXQiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBPUlRfVFlQRV9PUEVSQVRJT05fT1VUUFVUID0gIlBvcnRUeXBlLk9wZXJhdGlvbi5PdXRwdXQiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBPUlRfVFlQRV9PUEVSQVRJT05fRkFVTFQgPSAiUG9ydFR5cGUuT3BlcmF0aW9uLkZhdWx0IjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCSU5ESU5HX09QRVJBVElPTiA9ICJCaW5kaW5nLk9wZXJhdGlvbiI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQklORElOR19PUEVSQVRJT05fSU5QVVQgPSAiQmluZGluZy5PcGVyYXRpb24uSW5wdXQiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJJTkRJTkdfT1BFUkFUSU9OX09VVFBVVCA9ICJCaW5kaW5nLk9wZXJhdGlvbi5PdXRwdXQiOwotCi0gICAgcHJvdGVjdGVkIERlZmluaXRpb24gd3NkbDRqRGVmaW5pdGlvbiA9IG51bGw7Ci0gICAgcHJvdGVjdGVkIFN0cmluZyAgICAgd3NkbEJhc2VEb2N1bWVudFVSSSA9IG51bGw7Ci0KLSAgICBwcml2YXRlIFdTRExMb2NhdG9yIGN1c3RvbVdTRExSZXNvbHZlcjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJQQ19TVFlMRSA9ICJycGMiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9DVU1FTlRfU1RZTEUgPSAiZG9jdW1lbnQiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5DT0RFRF9VU0UgPSAiZW5jb2RlZCI7Ci0KLSAgICAvKioKLSAgICAgKiBMaXN0IG9mIEJpbmRpbmdPcGVyYXRpb25FbnRyeSBvYmplY3RzLgotICAgICAqIEVhY2ggb2JqZWN0IGluIHRoZSBsaXN0IG1heSByZXF1aXJlIGEgd3JhcHBlZCBzY2hlbWEgZWxlbWVudCBmb3IgCi0gICAgICogdGhlIGlucHV0L291dHB1dCBvciBib3RoLgotICAgICAqLwotICAgIHByaXZhdGUgTGlzdCB3cmFwcGFibGVCT0VzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIC8vIHVzZWQgdG8ga2VlcCB0aGUgYmluZGluZyB0eXBlIG9mIHRoZSBzZWxlY3RlZCBiaW5kaW5nCi0gICAgcHJpdmF0ZSBTdHJpbmcgYmluZGluZ1R5cGU7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXUkFQUEVEX09VVFBVVE5BTUVfU1VGRklYID0gIlJlc3BvbnNlIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9OQU1FU1BBQ0VfVVJJID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDAveG1sbnMvIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVTUEFDRV9ERUNMQVJBVElPTl9QUkVGSVggPSAieG1sbnM6IjsKLQotICAgIHByaXZhdGUgc3RhdGljIGludCBwcmVmaXhDb3VudGVyID0gMDsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVTUEFDRV9VUkkgPSAibmFtZXNwYWNlIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQUdFVF9OQU1FU1BBQ0UgPSAidGFyZ2V0TmFtZXNwYWNlIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJJTkRJTkdfVFlQRV9TT0FQID0gInNvYXAiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJJTkRJTkdfVFlQRV9IVFRQID0gImh0dHAiOwotCi0gICAgLyoqCi0gICAgICoga2VlcCB0cmFjayBvZiB3aGV0aGVyIHNldHVwIGNvZGUgcmVsYXRlZCB0byB0aGUgZW50aXJlIHdzZGwgaXMgY29tcGxldGUuCi0gICAgICogTm90ZSB0aGF0IFdTREwxMVRvQWxsQXhpc1NlcnZpY2VzIHdpbGwgY2FsbCBzZXR1cCBtdWx0aXBsZSB0aW1lcywgc28gdGhpcwotICAgICAqIGZpZWxkIGlzIHVzZWQgdG8gbWFrZSBzdWJzZXF1ZW50IGNhbGxzIG5vLW9wcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gc2V0dXBDb21wbGV0ZSA9IGZhbHNlOwotCi0gICAgcHJpdmF0ZSBNYXAgc2NoZW1hTWFwID0gbnVsbDsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBWF9XU0RMX1ZFUkJPU0VfTU9ERV9LRVkgPSAiamF2YXgud3NkbC52ZXJib3NlIjsKLQotICAgIC8vIEFzIGJpbmRpbmdzIGFyZSBwcm9jZXNzZWQgYWRkIGl0IHRvIHRoaXMgYXJyYXkgc28gdGhhdCB3ZSBkb250IHByb2Nlc3MgdGhlIHNhbWUgYmluZGluZyB0d2ljZQotICAgIHByaXZhdGUgTWFwIHByb2Nlc3NlZEJpbmRpbmdzOwotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzQWxsUG9ydHM7Ci0KLSAgICAvKioKLSAgICAgKiBjb25zdHJ1Y3RvciB0YWtpbmcgaW4gdGhlIHNlcnZpY2UgbmFtZSBhbmQgdGhlIHBvcnQgbmFtZQotICAgICAqCi0gICAgICogQHBhcmFtIGluIC0gSW5wdXRTdHJlYW0gZm9yIHRoZSBXU0RMCi0gICAgICogQHBhcmFtIHNlcnZpY2VOYW1lIC0gVGhlIHNlcnZpY2UgTmFtZQotICAgICAqIEBwYXJhbSBwb3J0TmFtZSAtIFRoZSBwb3J0IG5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgV1NETDExVG9BeGlzU2VydmljZUJ1aWxkZXIoSW5wdXRTdHJlYW0gaW4sIFFOYW1lIHNlcnZpY2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcG9ydE5hbWUpIHsKLSAgICAgICAgc3VwZXIoaW4sIHNlcnZpY2VOYW1lKTsKLSAgICAgICAgdGhpcy5wb3J0TmFtZSA9IHBvcnROYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBkZWYgLSBUaGUgV1NETDRKIERlZmluaXRpb24gb2JqZWN0Ci0gICAgICogQHBhcmFtIHNlcnZpY2VOYW1lIC0gVGhlIHNlcnZpY2UgTmFtZQotICAgICAqIEBwYXJhbSBwb3J0TmFtZSAtIFRoZSBwb3J0IG5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgV1NETDExVG9BeGlzU2VydmljZUJ1aWxkZXIoRGVmaW5pdGlvbiBkZWYsIFFOYW1lIHNlcnZpY2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcG9ydE5hbWUpIHsKLSAgICAgICAgc3VwZXIobnVsbCwgc2VydmljZU5hbWUpOwotICAgICAgICB0aGlzLndzZGw0akRlZmluaXRpb24gPSBkZWY7Ci0gICAgICAgIHRoaXMucG9ydE5hbWUgPSBwb3J0TmFtZTsKLSAgICAgICAgdGhpcy5pc0FsbFBvcnRzID0gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGRlZiAtIFRoZSBXU0RMNEogRGVmaW5pdGlvbiBvYmplY3QKLSAgICAgKiBAcGFyYW0gc2VydmljZU5hbWUgLSBUaGUgc2VydmljZSBOYW1lCi0gICAgICogQHBhcmFtIHBvcnROYW1lIC0gVGhlIHBvcnQgbmFtZQotICAgICAqIEBwYXJhbSBpc0FsbFBvcnRzIC0gYm9vbGVhbiByZXByZXNlbnRpbmcgd2hldGhlciB0byBnZW5lcmF0ZSBjb2RlIGZvciBhbGwgcG9ydHMgb3Igbm90Ci0gICAgICovCi0gICAgcHVibGljIFdTREwxMVRvQXhpc1NlcnZpY2VCdWlsZGVyKERlZmluaXRpb24gZGVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRTmFtZSBzZXJ2aWNlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBvcnROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzQWxsUG9ydHMpIHsKLSAgICAgICAgdGhpcyhkZWYsIHNlcnZpY2VOYW1lLCBwb3J0TmFtZSk7Ci0gICAgICAgIHRoaXMuaXNBbGxQb3J0cyA9IGlzQWxsUG9ydHM7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gaW4KLSAgICAgKiBAcGFyYW0gc2VydmljZQotICAgICAqLwotICAgIHB1YmxpYyBXU0RMMTFUb0F4aXNTZXJ2aWNlQnVpbGRlcihJbnB1dFN0cmVhbSBpbiwgQXhpc1NlcnZpY2Ugc2VydmljZSkgewotICAgICAgICBzdXBlcihpbiwgc2VydmljZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGluCi0gICAgICovCi0gICAgcHVibGljIFdTREwxMVRvQXhpc1NlcnZpY2VCdWlsZGVyKElucHV0U3RyZWFtIGluKSB7Ci0gICAgICAgIHRoaXMoaW4sIG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICogQHNlZSBzZXRDdXN0b21XU0RMUmVzb2x2ZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDdXN0b21XU0xENEpSZXNvbHZlcihXU0RMTG9jYXRvciBjdXN0b21SZXNvbHZlcikgewotICAgICAgICBzZXRDdXN0b21XU0RMUmVzb2x2ZXIoY3VzdG9tUmVzb2x2ZXIpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogc2V0cyBhIGN1c3RvbSBXU0RMIGxvY2F0b3IKLSAgICAgKgotICAgICAqIEBwYXJhbSBjdXN0b21SZXNvbHZlcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEN1c3RvbVdTRExSZXNvbHZlcihXU0RMTG9jYXRvciBjdXN0b21SZXNvbHZlcikgewotICAgICAgICB0aGlzLmN1c3RvbVdTRExSZXNvbHZlciA9IGN1c3RvbVJlc29sdmVyOwotICAgICAgICBzZXREb2N1bWVudEJhc2VVcmkodGhpcy5jdXN0b21XU0RMUmVzb2x2ZXIuZ2V0QmFzZVVSSSgpKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIFVSSSB0byB0aGUgYmFzZSBkb2N1bWVudCBhc3NvY2lhdGVkIHdpdGggdGhlIFdTREwgZGVmaW5pdGlvbi4KLSAgICAgKiBUaGlzIGlkZW50aWZpZXMgdGhlIG9yaWdpbiBvZiB0aGUgRGVmaW5pdGlvbiBhbmQgYWxsb3dzIHRoZQotICAgICAqIERlZmluaXRpb24gdG8gYmUgcmVsb2FkZWQuICBOb3RlIHRoYXQgdGhpcyBpcyB0aGUgVVJJIG9mIHRoZSBiYXNlCi0gICAgICogZG9jdW1lbnQsIG5vdCB0aGUgaW1wb3J0cy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBiYXNlVXJpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RG9jdW1lbnRCYXNlVXJpKFN0cmluZyBiYXNlVXJpKSB7Ci0gICAgICAgIGlmICh3c2RsNGpEZWZpbml0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIHdzZGw0akRlZmluaXRpb24uc2V0RG9jdW1lbnRCYXNlVVJJKGJhc2VVcmkpOwotICAgICAgICB9Ci0gICAgICAgIHdzZGxCYXNlRG9jdW1lbnRVUkkgPSBiYXNlVXJpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIFVSSSB0byB0aGUgYmFzZSBkb2N1bWVudCBhc3NvY2lhdGVkIHdpdGggdGhlIFdTREwgZGVmaW5pdGlvbi4KLSAgICAgKiBUaGlzIGlkZW50aWZpZXMgdGhlIG9yaWdpbiBvZiB0aGUgRGVmaW5pdGlvbiBhbmQgYWxsb3dzIHRoZQotICAgICAqIERlZmluaXRpb24gdG8gYmUgcmVsb2FkZWQuICBOb3RlIHRoYXQgdGhpcyBpcyB0aGUgVVJJIG9mIHRoZSBiYXNlCi0gICAgICogZG9jdW1lbnQsIG5vdCB0aGUgaW1wb3J0cy4KLSAgICAgKgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RG9jdW1lbnRCYXNlVXJpKCkgewotICAgICAgICByZXR1cm4gd3NkbEJhc2VEb2N1bWVudFVSSTsKLSAgICB9Ci0KLQotCi0KLSAgICAvKioKLSAgICAgKiBQb3B1bGF0ZXMgYSBnaXZlbiBzZXJ2aWNlLgotICAgICAqCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQKLSAgICAgKi8KLSAgICBwdWJsaWMgQXhpc1NlcnZpY2UgcG9wdWxhdGVTZXJ2aWNlKCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzZXR1cCgpOwotCi0gICAgICAgICAgICAvLyBOT1RFOiBzZXQgdGhlIGF4aXNTZXJ2aWNlIHdpdGggdGhlIFBhcmFtZXRlciBmb3IgdGhlIFdTREwKLSAgICAgICAgICAgIC8vIERlZmluaXRpb24gYWZ0ZXIgdGhlIHJlc3Qgb2YgdGhlIHdvcmsKLQotICAgICAgICAgICAgaWYgKHdzZGw0akRlZmluaXRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBzZXR0aW5nIHRhcmdldCBuYW1lIHNwYWNlCi0gICAgICAgICAgICBheGlzU2VydmljZS5zZXRUYXJnZXROYW1lc3BhY2Uod3NkbDRqRGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgICAgICBheGlzU2VydmljZS5zZXROYW1lc3BhY2VNYXAobmV3IE5hbWVzcGFjZU1hcCh3c2RsNGpEZWZpbml0aW9uLmdldE5hbWVzcGFjZXMoKSkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBNYXAgaW1wb3J0c01hcCA9IHdzZGw0akRlZmluaXRpb24uZ2V0SW1wb3J0cygpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoaW1wb3J0c01hcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTGlzdCBpbXBvcnRzID0gbmV3IEFycmF5TGlzdChpbXBvcnRzTWFwLmtleVNldCgpKTsKLSAgICAgICAgICAgICAgICBheGlzU2VydmljZS5zZXRJbXBvcnRlZE5hbWVzcGFjZXMoaW1wb3J0cyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vVE9ETyA6IGZpbmQgdGhlIHNlcnZpY2UgYWxzbyBpbiBpbXBvcnRlZCB3c2RscwotICAgICAgICAgICAgU2VydmljZSB3c2RsNGpTZXJ2aWNlID0gZmluZFNlcnZpY2Uod3NkbDRqRGVmaW5pdGlvbik7Ci0KLSAgICAgICAgICAgIEJpbmRpbmcgYmluZGluZyA9IGZpbmRCaW5kaW5nKHdzZGw0akRlZmluaXRpb24sIHdzZGw0alNlcnZpY2UpOwotICAgICAgICAgICAgRGVmaW5pdGlvbiBiaW5kaW5nV1NETCA9IGdldFBhcmVudERlZmluaXRpb24od3NkbDRqRGVmaW5pdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgYmluZGluZy5nZXRRTmFtZSgpLCBDT01QT05FTlRfQklORElORywgbmV3IEhhc2hTZXQoKSk7Ci0gICAgICAgICAgICBEZWZpbml0aW9uIHBvcnRUeXBlV1NETCA9IGdldFBhcmVudERlZmluaXRpb24oYmluZGluZ1dTREwsCi0gICAgICAgICAgICAgICAgICAgIGJpbmRpbmcuZ2V0UG9ydFR5cGUoKS5nZXRRTmFtZSgpLCBDT01QT05FTlRfUE9SVF9UWVBFLCBuZXcgSGFzaFNldCgpKTsKLSAgICAgICAgICAgIFBvcnRUeXBlIHBvcnRUeXBlID0gcG9ydFR5cGVXU0RMLmdldFBvcnRUeXBlKGJpbmRpbmcuZ2V0UG9ydFR5cGUoKS5nZXRRTmFtZSgpKTsKLQotCi0gICAgICAgICAgICBpZiAocG9ydFR5cGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoIlRoZXJlIGlzIG5vIHBvcnQgdHlwZSBhc3NvY2lhdGVkIHdpdGggdGhlIGJpbmRpbmciKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gY3JlYXRlIG5ldyBTY2hlbWEgZXh0ZW5zaW9ucyBlbGVtZW50IGZvciB3cmFwcGluZwotICAgICAgICAgICAgLy8gKGlmIGl0cyBwcmVzZW50KQotICAgICAgICAgICAgRWxlbWVudFtdIHNjaGVtYUVsZW1lbnRzID0gZ2VuZXJhdGVXcmFwcGVyU2NoZW1hKHNjaGVtYU1hcCwgYmluZGluZywgcG9ydFR5cGUpOwotCi0gICAgICAgICAgICBwcm9jZXNzVHlwZXMod3NkbDRqRGVmaW5pdGlvbiwgYXhpc1NlcnZpY2UpOwotCi0gICAgICAgICAgICAvLyBhZGQgdGhlIG5ld2x5IGNyZWF0ZWQgc2NoZW1hcwotICAgICAgICAgICAgaWYgKHNjaGVtYUVsZW1lbnRzICE9IG51bGwgJiYgc2NoZW1hRWxlbWVudHMubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2NoZW1hRWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgRWxlbWVudCBzY2hlbWFFbGVtZW50ID0gc2NoZW1hRWxlbWVudHNbaV07Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzY2hlbWFFbGVtZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlLmFkZFNjaGVtYShnZXRYTUxTY2hlbWEoc2NoZW1hRWxlbWVudCwgbnVsbCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gY29weSB0aGUgZG9jdW1lbnRhdGlvbiBlbGVtZW50IGNvbnRlbnQgdG8gdGhlIGRlc2NyaXB0aW9uCi0gICAgICAgICAgICBFbGVtZW50IGRvY3VtZW50YXRpb25FbGVtZW50ID0gd3NkbDRqRGVmaW5pdGlvbi5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpOwotICAgICAgICAgICAgYWRkRG9jdW1lbnRhdGlvbihheGlzU2VydmljZSwgZG9jdW1lbnRhdGlvbkVsZW1lbnQpOwotCi0gICAgICAgICAgICBheGlzU2VydmljZS5zZXROYW1lKHdzZGw0alNlcnZpY2UuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICBwb3B1bGF0ZUVuZHBvaW50cyhiaW5kaW5nLCBiaW5kaW5nV1NETCx3c2RsNGpTZXJ2aWNlLCBwb3J0VHlwZSwgcG9ydFR5cGVXU0RMKTsKLSAgICAgICAgICAgIHByb2Nlc3NQb2xpY2llc0luRGVmaW50aW9uKHdzZGw0akRlZmluaXRpb24pOwotICAgICAgICAgICAgYXhpc1NlcnZpY2UuZ2V0UG9saWN5SW5jbHVkZSgpLnNldFBvbGljeVJlZ2lzdHJ5KHJlZ2lzdHJ5KTsKLQotCi0gICAgICAgICAgICAvLyBTZXR0aW5nIHdzZGw0amRlZmludGlvbiB0byB0aGUgYXhpc1NlcnZpY2UgcGFyYW1ldGVyIGluY2x1ZGUgbGlzdCwKLSAgICAgICAgICAgIC8vIHNvIGlmIHNvbWVvbmUgbmVlZHMgdG8gdXNlIHRoZSBkZWZpbml0aW9uIGRpcmVjdGx5LAotICAgICAgICAgICAgLy8gaGUgY2FuIGRvIHRoYXQgYnkgZ2V0dGluZyB0aGUgcGFyYW1ldGVyCi0gICAgICAgICAgICBQYXJhbWV0ZXIgd3NkbERlZmluaXRpb25QYXJhbWV0ZXIgPSBuZXcgUGFyYW1ldGVyKCk7Ci0gICAgICAgICAgICB3c2RsRGVmaW5pdGlvblBhcmFtZXRlci5zZXROYW1lKFdTRExDb25zdGFudHMuV1NETF80X0pfREVGSU5JVElPTik7Ci0KLSAgICAgICAgICAgIGlmICghKHdzZGw0akRlZmluaXRpb24gaW5zdGFuY2VvZiBXU0RMRGVmaW5pdGlvbldyYXBwZXIpKSB7Ci0gICAgICAgICAgICAgICAgQXhpc0NvbmZpZ3VyYXRpb24gYWMgPSBheGlzU2VydmljZS5nZXRBeGlzQ29uZmlndXJhdGlvbigpOwotICAgICAgICAgICAgICAgIGlmIChhYyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFjID0gdGhpcy5heGlzQ29uZmlnOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBXU0RMRGVmaW5pdGlvbldyYXBwZXIgd3JhcHBlciA9IG5ldyBXU0RMRGVmaW5pdGlvbldyYXBwZXIod3NkbDRqRGVmaW5pdGlvbiwgYWMpOwotICAgICAgICAgICAgICAgIHdzZGxEZWZpbml0aW9uUGFyYW1ldGVyLnNldFZhbHVlKHdyYXBwZXIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB3c2RsRGVmaW5pdGlvblBhcmFtZXRlci5zZXRWYWx1ZSh3c2RsNGpEZWZpbml0aW9uKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYXhpc1NlcnZpY2UuYWRkUGFyYW1ldGVyKHdzZGxEZWZpbml0aW9uUGFyYW1ldGVyKTsKLSAgICAgICAgICAgIGF4aXNTZXJ2aWNlLnNldFdzZGxGb3VuZCh0cnVlKTsKLSAgICAgICAgICAgIGF4aXNTZXJ2aWNlLnNldEN1c3RvbVdzZGwodHJ1ZSk7Ci0KLQotICAgICAgICAgICAgcmV0dXJuIGF4aXNTZXJ2aWNlOwotCi0gICAgICAgIH0gY2F0Y2ggKFdTRExFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbG9nLmVycm9yKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgIHRocm93IEF4aXNGYXVsdC5tYWtlRmF1bHQoZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBsb2cuZXJyb3IoZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICAgICAgdGhyb3cgQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzVHlwZXMoRGVmaW5pdGlvbiB3c2RsRGVmaW5pdGlvbiwgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UpCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgcHJvY2Vzc1R5cGVzKHdzZGxEZWZpbml0aW9uLCBheGlzU2VydmljZSwgbmV3IEhhc2hTZXQoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NUeXBlcyhEZWZpbml0aW9uIHdzZGxEZWZpbml0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXQgdmlzaXRlZFdTRExzKQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIHZpc2l0ZWRXU0RMcy5hZGQod3NkbERlZmluaXRpb24uZ2V0RG9jdW1lbnRCYXNlVVJJKCkpOwotICAgICAgICAvLyBwcm9jZXNzIGFsbCB0aGUgdHlwZXMgaW4gYWxsIHRoZSB3c2RscwotICAgICAgICBUeXBlcyB0eXBlcyA9IHdzZGxEZWZpbml0aW9uLmdldFR5cGVzKCk7Ci0gICAgICAgIGlmICh0eXBlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjb3B5RXh0ZW5zaWJsZUVsZW1lbnRzKHR5cGVzLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c2RsRGVmaW5pdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpc1NlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRZUEVTKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHByb2Nlc3MgdGhlIHR5cGVzIGluIG90aGVyIHdzZGxzCi0gICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSB3c2RsRGVmaW5pdGlvbi5nZXRJbXBvcnRzKCkudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgVmVjdG9yIHZhbHVlcyA9IG51bGw7Ci0gICAgICAgIEltcG9ydCB3c2RsSW1wb3J0ID0gbnVsbDsKLSAgICAgICAgZm9yICg7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgdmFsdWVzID0gKFZlY3RvcikgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIHZhbHVlc0l0ZXIgPSB2YWx1ZXMuaXRlcmF0b3IoKTsgdmFsdWVzSXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgd3NkbEltcG9ydCA9IChJbXBvcnQpIHZhbHVlc0l0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgIC8vIHByb2Nlc3MgdGhlIHR5cGVzIHJlY3VyZXNpdmVpbHQKLSAgICAgICAgICAgICAgICBEZWZpbml0aW9uIGlubmVyRGVmaW5pdGlvbiA9IHdzZGxJbXBvcnQuZ2V0RGVmaW5pdGlvbigpOwotICAgICAgICAgICAgICAgIGlmKCF2aXNpdGVkV1NETHMuY29udGFpbnMoaW5uZXJEZWZpbml0aW9uLmdldERvY3VtZW50QmFzZVVSSSgpKSl7Ci0gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NUeXBlcyhpbm5lckRlZmluaXRpb24sIGF4aXNTZXJ2aWNlLCB2aXNpdGVkV1NETHMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGREb2N1bWVudGF0aW9uKEF4aXNEZXNjcmlwdGlvbiBheGlzRGVzY3JpcHRpb24sIEVsZW1lbnQgZG9jdW1lbnRhdGlvbkVsZW1lbnQpIHsKLSAgICAgICAgaWYgKChkb2N1bWVudGF0aW9uRWxlbWVudCAhPSBudWxsKSAmJiAoZG9jdW1lbnRhdGlvbkVsZW1lbnQuZ2V0Rmlyc3RDaGlsZCgpICE9IG51bGwpKSB7Ci0gICAgICAgICAgICBOb2RlIGZpcnN0Q2hpbGQgPSBkb2N1bWVudGF0aW9uRWxlbWVudC5nZXRGaXJzdENoaWxkKCk7Ci0gICAgICAgICAgICBTdHJpbmcgZG9jdW1lbnRhdGlvbiA9IERPTTJXcml0ZXIubm9kZVRvU3RyaW5nKGZpcnN0Q2hpbGQpOwotICAgICAgICAgICAgaWYgKCEiIi5lcXVhbHMoZG9jdW1lbnRhdGlvbikpIHsKLSAgICAgICAgICAgICAgICBheGlzRGVzY3JpcHRpb24uc2V0RG9jdW1lbnRhdGlvbihkb2N1bWVudGF0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBiaW5kaW5nCi0gICAgICogQHBhcmFtIHdzZGw0alNlcnZpY2UgbXVzdCBoYXZlIGF0bGVhc2Ugb25lIHBvcnQKLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBwb3B1bGF0ZUVuZHBvaW50cyhCaW5kaW5nIGJpbmRpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmluaXRpb24gYmluZGluZ1dTREwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZpY2Ugd3NkbDRqU2VydmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9ydFR5cGUgcG9ydFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmluaXRpb24gcG9ydFR5cGVXU0RMKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLQotICAgICAgICBNYXAgd3NkbDRqUG9ydHMgPSB3c2RsNGpTZXJ2aWNlLmdldFBvcnRzKCk7Ci0gICAgICAgIFFOYW1lIGJpbmRpbmdOYW1lID0gYmluZGluZy5nZXRRTmFtZSgpOwotCi0gICAgICAgIFBvcnQgcG9ydDsKLSAgICAgICAgQXhpc0VuZHBvaW50IGF4aXNFbmRwb2ludCA9IG51bGw7Ci0KLSAgICAgICAgcHJvY2Vzc2VkQmluZGluZ3MgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgICAgIC8vIHByb2Nlc3MgdGhlIHBvcnQgdHlwZSBmb3IgdGhpcyBiaW5kaW5nCi0gICAgICAgIC8vIGFsdGhvdWdoIHdlIHN1cHBvcnQgbXVsdGlwb3J0cyB0aGV5IG11c3QgYmUgYmVsb25ncyB0byBzYW1lIHBvcnQgdHlwZSBhbmQgc2hvdWxkIGhhdmUgdGhlCi0gICAgICAgIC8vIHNhbWUgc29hcCBzdHlsZQotICAgICAgICBwb3B1bGF0ZVBvcnRUeXBlKHBvcnRUeXBlLCBwb3J0VHlwZVdTREwpOwotCi0gICAgICAgIEJpbmRpbmcgY3VycmVudEJpbmRpbmc7Ci0gICAgICAgIERlZmluaXRpb24gY3VycmVudEJpbmRpbmdXU0RMID0gbnVsbDsKLQotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gd3NkbDRqUG9ydHMudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgcG9ydCA9IChQb3J0KSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICAvLyBpZiB0aGUgdXNlciBoYXMgcGlja2VkIGEgcG9ydCB0aGVuIHdlIGhhdmUgdG8gcHJvY2VzcyBvbmx5IHRoYXQgcG9ydAotICAgICAgICAgICAgaWYgKCh0aGlzLnBvcnROYW1lID09IG51bGwpIHx8ICh0aGlzLnBvcnROYW1lLmVxdWFscyhwb3J0LmdldE5hbWUoKSkpKSB7Ci0gICAgICAgICAgICAgICAgLy8gd2UgcHJvY2VzcyB0aGUgcG9ydCBvbmx5IGlmIGl0IGhhcyB0aGUgc2FtZSBwb3J0IHR5cGUgYXMgdGhlIHNlbGVjdGVkIGJpbmRpbmcKLSAgICAgICAgICAgICAgICBjdXJyZW50QmluZGluZ1dTREwgPSBnZXRQYXJlbnREZWZpbml0aW9uKHdzZGw0akRlZmluaXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICBwb3J0LmdldEJpbmRpbmcoKS5nZXRRTmFtZSgpLCBDT01QT05FTlRfQklORElORywgbmV3IEhhc2hTZXQoKSk7Ci0gICAgICAgICAgICAgICAgY3VycmVudEJpbmRpbmcgPSBjdXJyZW50QmluZGluZ1dTREwuZ2V0QmluZGluZyhwb3J0LmdldEJpbmRpbmcoKS5nZXRRTmFtZSgpKTsKLQotICAgICAgICAgICAgICAgIGlmIChjdXJyZW50QmluZGluZy5nZXRQb3J0VHlwZSgpLmdldFFOYW1lKCkuZXF1YWxzKGJpbmRpbmcuZ2V0UG9ydFR5cGUoKS5nZXRRTmFtZSgpKSkgewotICAgICAgICAgICAgICAgICAgICBheGlzRW5kcG9pbnQgPSBuZXcgQXhpc0VuZHBvaW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIGF4aXNFbmRwb2ludC5zZXROYW1lKHBvcnQuZ2V0TmFtZSgpKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoYXhpc1NlcnZpY2UuZ2V0RW5kcG9pbnROYW1lKCkgPT0gbnVsbCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRpbmdOYW1lLmVxdWFscyhwb3J0LmdldEJpbmRpbmcoKS5nZXRRTmFtZSgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcG9wdWxhdGVFbmRwb2ludChheGlzRW5kcG9pbnQsIHBvcnQsIGN1cnJlbnRCaW5kaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kaW5nV1NETCwgcG9ydFR5cGUsIHBvcnRUeXBlV1NETCwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBheGlzU2VydmljZS5zZXRFbmRwb2ludE5hbWUoYXhpc0VuZHBvaW50LmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBheGlzU2VydmljZS5zZXRCaW5kaW5nTmFtZShheGlzRW5kcG9pbnQuZ2V0QmluZGluZygpLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwb3B1bGF0ZUVuZHBvaW50KGF4aXNFbmRwb2ludCwgcG9ydCwgY3VycmVudEJpbmRpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRpbmdXU0RMLCBwb3J0VHlwZSwgcG9ydFR5cGVXU0RMLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBheGlzRW5kcG9pbnQuc2V0UGFyZW50KGF4aXNTZXJ2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgYXhpc1NlcnZpY2UuYWRkRW5kcG9pbnQocG9ydC5nZXROYW1lKCksIGF4aXNFbmRwb2ludCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogc2V0dGluZyBtZXNzYWdlIHFuYW1lIGlzIGEgYmluZGluZyBkZXBlbmRlbnQgcHJvY2VzcyBmb3IgYW4gZXhhbXBsZSBtZXNzYWdlIGVsZW1lbnQgZGVwZW5kcyBvbiB0aGUKLSAgICAgKiBzb2FwIHN0eWxlIChycGMgb3IgZG9jdW1lbnQpIGFuZCBwYXJ0cyBlbGVtZW1ldCBvZiB0aGUgc29hcCBib2R5Ci0gICAgICogT24gdGhlIG90aGVyaGFuZCB3ZSBrZWVwIG9ubHkgb25lIHNldCBvZiBheGlzIG9wZXJhdGlvbnMgYmVsb25ncyB0byBhIHNlbGVjdGVkIHBvcnQgdHlwZSBpbiBheGlzIHNlcnZpY2UKLSAgICAgKiBTbyBzZXR0aW5nIHFuYW1lIHJlZmV0ZW5jZXMgZG9uZSBvbmx5IHdpdGggdGhlIHNlbGVjdGVkIGJpbmRpbmcgcHJvY2Vzc2luZwotICAgICAqCi0gICAgICogQHBhcmFtIGF4aXNFbmRwb2ludAotICAgICAqIEBwYXJhbSB3c2RsNGpQb3J0Ci0gICAgICogQHBhcmFtIGlzU2V0TWVzc2FnZVFOYW1lcwotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0Ci0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHBvcHVsYXRlRW5kcG9pbnQoQXhpc0VuZHBvaW50IGF4aXNFbmRwb2ludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3J0IHdzZGw0alBvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmluZGluZyB3c2RsNGpCaW5kaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmluaXRpb24gYmluZGluZ1dTREwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9ydFR5cGUgcG9ydFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmaW5pdGlvbiBwb3J0VHlwZVdTREwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc1NldE1lc3NhZ2VRTmFtZXMpCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLQotICAgICAgICBjb3B5RXh0ZW5zaWJsZUVsZW1lbnRzKHdzZGw0alBvcnQuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCksIHdzZGw0akRlZmluaXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpc0VuZHBvaW50LCBCSU5ESU5HKTsKLSAgICAgICAgcHJvY2Vzc0VtYmVkZGVkRVBSKHdzZGw0alBvcnQuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCksIGF4aXNFbmRwb2ludCk7Ci0gICAgICAgIGFkZERvY3VtZW50YXRpb24oYXhpc0VuZHBvaW50LCB3c2RsNGpQb3J0LmdldERvY3VtZW50YXRpb25FbGVtZW50KCkpOwotICAgICAgICBpZiAocHJvY2Vzc2VkQmluZGluZ3MuY29udGFpbnNLZXkod3NkbDRqQmluZGluZy5nZXRRTmFtZSgpKSkgewotICAgICAgICAgICAgYXhpc0VuZHBvaW50LnNldEJpbmRpbmcoCi0gICAgICAgICAgICAgICAgICAgIChBeGlzQmluZGluZykgcHJvY2Vzc2VkQmluZGluZ3MuZ2V0KHdzZGw0akJpbmRpbmcuZ2V0UU5hbWUoKSkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQXhpc0JpbmRpbmcgYXhpc0JpbmRpbmcgPSBuZXcgQXhpc0JpbmRpbmcoKTsKLSAgICAgICAgICAgIGF4aXNCaW5kaW5nLnNldE5hbWUod3NkbDRqQmluZGluZy5nZXRRTmFtZSgpKTsKLSAgICAgICAgICAgIGF4aXNCaW5kaW5nLnNldFBhcmVudChheGlzRW5kcG9pbnQpOwotICAgICAgICAgICAgYXhpc0VuZHBvaW50LnNldEJpbmRpbmcoYXhpc0JpbmRpbmcpOwotICAgICAgICAgICAgYXhpc0JpbmRpbmcuc2V0UGFyZW50KGF4aXNFbmRwb2ludCk7Ci0gICAgICAgICAgICBwb3B1bGF0ZUJpbmRpbmcoYXhpc0JpbmRpbmcsCi0gICAgICAgICAgICAgICAgICAgIHdzZGw0akJpbmRpbmcsCi0gICAgICAgICAgICAgICAgICAgIGJpbmRpbmdXU0RMLAotICAgICAgICAgICAgICAgICAgICBwb3J0VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgcG9ydFR5cGVXU0RMLAotICAgICAgICAgICAgICAgICAgICBpc1NldE1lc3NhZ2VRTmFtZXMpOwotICAgICAgICAgICAgcHJvY2Vzc2VkQmluZGluZ3MucHV0KHdzZGw0akJpbmRpbmcuZ2V0UU5hbWUoKSwgYXhpc0JpbmRpbmcpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NFbWJlZGRlZEVQUihMaXN0IGV4dGVuc2liaWxpdHlFbGVtZW50cywgQXhpc0VuZHBvaW50IGF4aXNFbmRwb2ludCkgewotICAgIAlJdGVyYXRvciBlZWx0cyA9IGV4dGVuc2liaWxpdHlFbGVtZW50cy5pdGVyYXRvcigpOwotICAgIAl3aGlsZShlZWx0cy5oYXNOZXh0KCkpewotICAgIAkJRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZWUgPSAoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpZWVsdHMubmV4dCgpOwotICAgIAkJaWYoQWRkcmVzc2luZ0NvbnN0YW50cy5GaW5hbC5XU0FfRU5EUE9JTlRfUkVGRVJFTkNFLmVxdWFscyhlZS5nZXRFbGVtZW50VHlwZSgpKSl7Ci0gICAgCQkJdHJ5IHsKLSAgICAJCQkJRWxlbWVudCBlbHQgPSAoKFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCllZSkuZ2V0RWxlbWVudCgpOwotICAgIAkJCQlPTUVsZW1lbnQgZXByT01FbGVtZW50ID0gWE1MVXRpbHMudG9PTShlbHQpOwotICAgIAkJCQlFbmRwb2ludFJlZmVyZW5jZSBlcHIgPSBFbmRwb2ludFJlZmVyZW5jZUhlbHBlci5mcm9tT00oZXByT01FbGVtZW50KTsKLSAgICAJCQkJTWFwIHJlZmVyZW5jZVBhcmFtZXRlcnMgPSBlcHIuZ2V0QWxsUmVmZXJlbmNlUGFyYW1ldGVycygpOwotICAgIAkJCQlpZihyZWZlcmVuY2VQYXJhbWV0ZXJzICE9IG51bGwpewotICAgIAkJCQkJYXhpc0VuZHBvaW50LmFkZFBhcmFtZXRlcihBZGRyZXNzaW5nQ29uc3RhbnRzLlJFRkVSRU5DRV9QQVJBTUVURVJfUEFSQU1FVEVSLCBuZXcgQXJyYXlMaXN0KHJlZmVyZW5jZVBhcmFtZXRlcnMudmFsdWVzKCkpKTsKLSAgICAJCQkJfQotICAgIAkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgCQkJCWlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKXsKLSAgICAJCQkJCWxvZy5kZWJ1ZygiRXhjZXB0aW9uIGVuY291bnRlcmVkIHByb2Nlc3NpbmcgZW1iZWRkZWQgd3NhOkVuZHBvaW50UmVmZXJlbmNlIiwgZSk7Ci0gICAgCQkJCX0KLSAgICAJCQl9Ci0gICAgCQl9Ci0gICAgCX0KLSAgICB9Ci0KLQlwcml2YXRlIHZvaWQgcG9wdWxhdGVQb3J0VHlwZShQb3J0VHlwZSB3c2RsNGpQb3J0VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZpbml0aW9uIHBvcnRUeXBlV1NETCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0JCWNvcHlFeHRlbnNpb25BdHRyaWJ1dGVzKHdzZGw0alBvcnRUeXBlLmdldEV4dGVuc2lvbkF0dHJpYnV0ZXMoKSwKLQkJCQlheGlzU2VydmljZSwgUE9SVF9UWVBFKTsKLSAgICAgICAgTGlzdCB3c2RsNGpPcGVyYXRpb25zID0gd3NkbDRqUG9ydFR5cGUuZ2V0T3BlcmF0aW9ucygpOwotCi0gICAgICAgIC8vIEFkZGVkIHRvIHVzZSBpbiA/d3NkbDIgYXMgdGhlIGludGVyZmFjZSBuYW1lCi0gICAgICAgIGF4aXNTZXJ2aWNlLmFkZFBhcmFtZXRlcihuZXcgUGFyYW1ldGVyKFdTREwyQ29uc3RhbnRzLklOVEVSRkFDRV9MT0NBTF9OQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c2RsNGpQb3J0VHlwZS5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpKSk7Ci0gICAgICAgIGlmICh3c2RsNGpPcGVyYXRpb25zLnNpemUoKSA8IDEpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoIk5vIG9wZXJhdGlvbiBmb3VuZCBpbiB0aGUgcG9ydFR5cGUgZWxlbWVudCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uOwotICAgICAgICBMaXN0IG9wZXJhdGlvbk5hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgICAgIFFOYW1lIG9wTmFtZTsKLSAgICAgICAgT3BlcmF0aW9uIHdzZGw0ak9wZXJhdGlvbjsKLQotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gd3NkbDRqT3BlcmF0aW9ucy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICB3c2RsNGpPcGVyYXRpb24gPSAoT3BlcmF0aW9uKSBpdGVyYXRvci5uZXh0KCk7Ci0KLSAgICAgICAgICAgIGF4aXNPcGVyYXRpb24gPSBwb3B1bGF0ZU9wZXJhdGlvbnMod3NkbDRqT3BlcmF0aW9uLCB3c2RsNGpQb3J0VHlwZSwgcG9ydFR5cGVXU0RMKTsKLSAgICAgICAgICAgIGFkZERvY3VtZW50YXRpb24oYXhpc09wZXJhdGlvbiwgd3NkbDRqT3BlcmF0aW9uLmdldERvY3VtZW50YXRpb25FbGVtZW50KCkpOwotICAgICAgICAgICAgYXhpc09wZXJhdGlvbi5zZXRQYXJlbnQoYXhpc1NlcnZpY2UpOwotICAgICAgICAgICAgYXhpc1NlcnZpY2UuYWRkQ2hpbGQoYXhpc09wZXJhdGlvbik7Ci0gICAgICAgICAgICBvcGVyYXRpb25OYW1lcy5hZGQoYXhpc09wZXJhdGlvbi5nZXROYW1lKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gdGhpcyBpcyB1c2VkIG9ubHkgaW4gY29kZWdlbiB0byBwcmVzZXJ2ZSBvcGVyYXRpb24gb3JkZXIKLSAgICAgICAgaWYgKGlzQ29kZWdlbikgewotICAgICAgICAgICAgYXhpc1NlcnZpY2Uuc2V0T3BlcmF0aW9uc05hbWVMaXN0KG9wZXJhdGlvbk5hbWVzKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHBvcHVsYXRlQmluZGluZyhBeGlzQmluZGluZyBheGlzQmluZGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpbmRpbmcgd3NkbDRqQmluZGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmluaXRpb24gYmluZGluZ1dTREwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3J0VHlwZSBwb3J0VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmluaXRpb24gcG9ydFR5cGVXU0RMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc1NldE1lc3NhZ2VRTmFtZXMpCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLQotICAgICAgICBjb3B5RXh0ZW5zaWJsZUVsZW1lbnRzKHdzZGw0akJpbmRpbmcuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCksIGJpbmRpbmdXU0RMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNCaW5kaW5nLCBCSU5ESU5HKTsKLQotICAgICAgICBMaXN0IHdzZGw0akJpZGluZ09wZXJhdGlvbnMgPSB3c2RsNGpCaW5kaW5nLmdldEJpbmRpbmdPcGVyYXRpb25zKCk7Ci0KLSAgICAgICAgaWYgKHdzZGw0akJpZGluZ09wZXJhdGlvbnMuc2l6ZSgpIDwgMSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiTm8gb3BlcmF0aW9uIGZvdW5kIGZvciB0aGUgYmluZGluZyIpOwotICAgICAgICB9Ci0KLSAgICAgICAgYWRkRG9jdW1lbnRhdGlvbihheGlzQmluZGluZywgd3NkbDRqQmluZGluZy5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpKTsKLQotICAgICAgICBBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb247Ci0gICAgICAgIE9wZXJhdGlvbiB3c2RsNGpPcGVyYXRpb247Ci0KLSAgICAgICAgQXhpc0JpbmRpbmdPcGVyYXRpb24gYXhpc0JpbmRpbmdPcGVyYXRpb247Ci0gICAgICAgIEJpbmRpbmdPcGVyYXRpb24gd3NkbDRqQmluZGluZ09wZXJhdGlvbjsKLQotICAgICAgICBNYXAgaHR0cExvY2F0aW9uTWFwID0gbmV3IFRyZWVNYXAoKTsKLSAgICAgICAgU3RyaW5nIGh0dHBMb2NhdGlvbiA9IG51bGw7Ci0KLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHdzZGw0akJpZGluZ09wZXJhdGlvbnMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCi0gICAgICAgICAgICBheGlzQmluZGluZ09wZXJhdGlvbiA9IG5ldyBBeGlzQmluZGluZ09wZXJhdGlvbigpOwotICAgICAgICAgICAgd3NkbDRqQmluZGluZ09wZXJhdGlvbiA9IChCaW5kaW5nT3BlcmF0aW9uKSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICB3c2RsNGpPcGVyYXRpb24gPSBmaW5kT3BlcmF0aW9uKHBvcnRUeXBlLCB3c2RsNGpCaW5kaW5nT3BlcmF0aW9uKTsKLQotICAgICAgICAgICAgYXhpc0JpbmRpbmdPcGVyYXRpb24uc2V0TmFtZShuZXcgUU5hbWUoYmluZGluZ1dTREwuZ2V0VGFyZ2V0TmFtZXNwYWNlKCksIHdzZGw0akJpbmRpbmdPcGVyYXRpb24uZ2V0TmFtZSgpKSk7Ci0gICAgICAgICAgICBhZGREb2N1bWVudGF0aW9uKGF4aXNCaW5kaW5nT3BlcmF0aW9uLCB3c2RsNGpCaW5kaW5nT3BlcmF0aW9uLmdldERvY3VtZW50YXRpb25FbGVtZW50KCkpOwotCi0gICAgICAgICAgICBheGlzT3BlcmF0aW9uID0gYXhpc1NlcnZpY2UuZ2V0T3BlcmF0aW9uKG5ldyBRTmFtZShwb3J0VHlwZVdTREwuZ2V0VGFyZ2V0TmFtZXNwYWNlKCksIHdzZGw0ak9wZXJhdGlvbi5nZXROYW1lKCkpKTsKLSAgICAgICAgICAgIGF4aXNCaW5kaW5nT3BlcmF0aW9uLnNldEF4aXNPcGVyYXRpb24oYXhpc09wZXJhdGlvbik7Ci0KLSAgICAgICAgICAgIC8vIHByb2Nlc3MgRXh0ZW5zaWJpbGl0eUVsZW1lbnRzIG9mIHRoZSB3c2RsNGpCaW5kaW5nCi0gICAgICAgICAgICBjb3B5RXh0ZW5zaWJsZUVsZW1lbnRzKHdzZGw0akJpbmRpbmdPcGVyYXRpb24uZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzZGw0akRlZmluaXRpb24sIGF4aXNCaW5kaW5nT3BlcmF0aW9uLCBCSU5ESU5HX09QRVJBVElPTik7Ci0KLSAgICAgICAgICAgIGh0dHBMb2NhdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgIChTdHJpbmcpIGF4aXNCaW5kaW5nT3BlcmF0aW9uLmdldFByb3BlcnR5KFdTREwyQ29uc3RhbnRzLkFUVFJfV0hUVFBfTE9DQVRJT04pOwotICAgICAgICAgICAgU3RyaW5nIGh0dHBNZXRob2QgPQotICAgICAgICAgICAgICAgICAgICAoU3RyaW5nKSBheGlzQmluZGluZ09wZXJhdGlvbi5nZXRQcm9wZXJ0eShXU0RMMkNvbnN0YW50cy5BVFRSX1dIVFRQX01FVEhPRCk7Ci0gICAgICAgICAgICBpZiAoaHR0cE1ldGhvZCA9PSBudWxsIHx8ICIiLmVxdWFscyhodHRwTWV0aG9kKSkgewotICAgICAgICAgICAgICAgIGh0dHBNZXRob2QgPSBIVFRQQ29uc3RhbnRzLkhFQURFUl9QT1NUOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGh0dHBMb2NhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaHR0cExvY2F0aW9uTWFwLnB1dChXU0RMVXRpbC5nZXRDb25zdGFudEZyb21IVFRQTG9jYXRpb24oaHR0cExvY2F0aW9uLCBodHRwTWV0aG9kKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNCaW5kaW5nT3BlcmF0aW9uLmdldEF4aXNPcGVyYXRpb24oKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEJpbmRpbmdJbnB1dCB3c2RsNGpCaW5kaW5nSW5wdXQgPSB3c2RsNGpCaW5kaW5nT3BlcmF0aW9uLmdldEJpbmRpbmdJbnB1dCgpOwotCi0gICAgICAgICAgICBpZiAod3NkbDRqQmluZGluZ0lucHV0ICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICBXU0RMVXRpbC5pc0lucHV0UHJlc2VudEZvck1FUChheGlzT3BlcmF0aW9uLmdldE1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4oKSkpIHsKLSAgICAgICAgICAgICAgICBBeGlzQmluZGluZ01lc3NhZ2UgYXhpc0JpbmRpbmdJbk1lc3NhZ2UgPSBuZXcgQXhpc0JpbmRpbmdNZXNzYWdlKCk7Ci0gICAgICAgICAgICAgICAgYWRkRG9jdW1lbnRhdGlvbihheGlzQmluZGluZ0luTWVzc2FnZSwgd3NkbDRqQmluZGluZ0lucHV0LmdldERvY3VtZW50YXRpb25FbGVtZW50KCkpOwotICAgICAgICAgICAgICAgIGNvcHlFeHRlbnNpYmxlRWxlbWVudHMod3NkbDRqQmluZGluZ0lucHV0LmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NkbDRqRGVmaW5pdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNCaW5kaW5nSW5NZXNzYWdlLCBCSU5ESU5HX09QRVJBVElPTl9JTlBVVCk7Ci0KLSAgICAgICAgICAgICAgICBBeGlzTWVzc2FnZSBheGlzSW5NZXNzYWdlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNPcGVyYXRpb24uZ2V0TWVzc2FnZShXU0RMQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfSU5fVkFMVUUpOwotICAgICAgICAgICAgICAgIC8vVGhpcyBpcyBhIGhhY2sgdG8gZ2V0IEFYSVMyLTI3NzEgd29ya2luZyAsIEkgaGFkIHRvIGNvcHkgc29hcCBoZWFkZXJzCi0gICAgICAgICAgICAgICAgLy8gIGZyb20gYmluZGluZyBtZXNzYWdlIHRvIEF4aXNNZXNzYWdlCi0gICAgICAgICAgICAgICAgTGlzdCBzb2FwSGVhZGVycyA9IChMaXN0KSBheGlzQmluZGluZ0luTWVzc2FnZS5nZXRQcm9wZXJ0eSgKLSAgICAgICAgICAgICAgICAgICAgICAgIFdTREwyQ29uc3RhbnRzLkFUVFJfV1NPQVBfSEVBREVSKTsKLSAgICAgICAgICAgICAgICBpZiAoc29hcEhlYWRlcnMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNvYXBIZWFkZXJzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTT0FQSGVhZGVyTWVzc2FnZSBoZWFkZXJNZXNzYWdlID0gKFNPQVBIZWFkZXJNZXNzYWdlKSBzb2FwSGVhZGVycy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBheGlzSW5NZXNzYWdlLmFkZFNvYXBIZWFkZXIoaGVhZGVyTWVzc2FnZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoaXNTZXRNZXNzYWdlUU5hbWVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIEJpbmRpbmdPcGVyYXRpb25FbnRyeSBib2UgPSBmaW5kKHdyYXBwYWJsZUJPRXMsIHdzZGw0akJpbmRpbmdPcGVyYXRpb24pOwotICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzV3JhcHBlZCA9IChib2UgPT0gbnVsbCkgPyBmYWxzZSA6IGJvZS5pc1dyYXBwZWRJbnB1dCgpOwotICAgICAgICAgICAgICAgICAgICBheGlzSW5NZXNzYWdlLnNldFdyYXBwZWQoaXNXcmFwcGVkKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkUU5hbWVSZWZlcmVuY2UoYXhpc0luTWVzc2FnZSwgd3NkbDRqT3BlcmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c2RsNGpCaW5kaW5nSW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzV3JhcHBlZCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgYXhpc0JpbmRpbmdJbk1lc3NhZ2Uuc2V0QXhpc01lc3NhZ2UoYXhpc0luTWVzc2FnZSk7Ci0gICAgICAgICAgICAgICAgYXhpc0JpbmRpbmdJbk1lc3NhZ2Uuc2V0TmFtZShheGlzSW5NZXNzYWdlLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgYXhpc0JpbmRpbmdJbk1lc3NhZ2Uuc2V0RGlyZWN0aW9uKGF4aXNJbk1lc3NhZ2UuZ2V0RGlyZWN0aW9uKCkpOwotCi0gICAgICAgICAgICAgICAgYXhpc0JpbmRpbmdJbk1lc3NhZ2Uuc2V0UGFyZW50KGF4aXNCaW5kaW5nT3BlcmF0aW9uKTsKLSAgICAgICAgICAgICAgICBheGlzQmluZGluZ09wZXJhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENoaWxkKFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9JTl9WQUxVRSwgYXhpc0JpbmRpbmdJbk1lc3NhZ2UpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBCaW5kaW5nT3V0cHV0IHdzZGw0akJpbmRpbmdPdXRwdXQgPSB3c2RsNGpCaW5kaW5nT3BlcmF0aW9uLmdldEJpbmRpbmdPdXRwdXQoKTsKLQotICAgICAgICAgICAgaWYgKHdzZGw0akJpbmRpbmdPdXRwdXQgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgIFdTRExVdGlsLmlzT3V0cHV0UHJlc2VudEZvck1FUChheGlzT3BlcmF0aW9uLmdldE1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4oKSkpIHsKLSAgICAgICAgICAgICAgICBBeGlzQmluZGluZ01lc3NhZ2UgYXhpc0JpbmRpbmdPdXRNZXNzYWdlID0gbmV3IEF4aXNCaW5kaW5nTWVzc2FnZSgpOwotICAgICAgICAgICAgICAgIGFkZERvY3VtZW50YXRpb24oYXhpc0JpbmRpbmdPdXRNZXNzYWdlLCB3c2RsNGpCaW5kaW5nT3V0cHV0LmdldERvY3VtZW50YXRpb25FbGVtZW50KCkpOwotICAgICAgICAgICAgICAgIEF4aXNNZXNzYWdlIGF4aXNPdXRNZXNzYWdlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNPcGVyYXRpb24uZ2V0TWVzc2FnZShXU0RMQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfT1VUX1ZBTFVFKTsKLQotICAgICAgICAgICAgICAgIGNvcHlFeHRlbnNpYmxlRWxlbWVudHMod3NkbDRqQmluZGluZ091dHB1dC5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzZGw0akRlZmluaXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzQmluZGluZ091dE1lc3NhZ2UsIEJJTkRJTkdfT1BFUkFUSU9OX09VVFBVVCk7Ci0KLSAgICAgICAgICAgICAgICAvL1RoaXMgaXMgYSBoYWNrIHRvIGdldCBBWElTMi0yNzcxIHdvcmtpbmcgLCBJIGhhZCB0byBjb3B5IHNvYXAgaGVhZGVycwotICAgICAgICAgICAgICAgIC8vICBmcm9tIGJpbmRpbmcgbWVzc2FnZSB0byBBeGlzTWVzc2FnZQotICAgICAgICAgICAgICAgIExpc3Qgc29hcEhlYWRlcnMgPQotICAgICAgICAgICAgICAgICAgICAgICAgKExpc3QpIGF4aXNCaW5kaW5nT3V0TWVzc2FnZS5nZXRQcm9wZXJ0eShXU0RMMkNvbnN0YW50cy5BVFRSX1dTT0FQX0hFQURFUik7Ci0gICAgICAgICAgICAgICAgaWYgKHNvYXBIZWFkZXJzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzb2FwSGVhZGVycy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgU09BUEhlYWRlck1lc3NhZ2UgaGVhZGVyTWVzc2FnZSA9IChTT0FQSGVhZGVyTWVzc2FnZSkgc29hcEhlYWRlcnMuZ2V0KGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgYXhpc091dE1lc3NhZ2UuYWRkU29hcEhlYWRlcihoZWFkZXJNZXNzYWdlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChpc1NldE1lc3NhZ2VRTmFtZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgQmluZGluZ09wZXJhdGlvbkVudHJ5IGJvZSA9IGZpbmQod3JhcHBhYmxlQk9Fcywgd3NkbDRqQmluZGluZ09wZXJhdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNXcmFwcGVkID0gKGJvZSA9PSBudWxsKSA/IGZhbHNlIDogYm9lLmlzV3JhcHBlZE91dHB1dCgpOwotICAgICAgICAgICAgICAgICAgICBheGlzT3V0TWVzc2FnZS5zZXRXcmFwcGVkKGlzV3JhcHBlZCk7Ci0gICAgICAgICAgICAgICAgICAgIGFkZFFOYW1lUmVmZXJlbmNlKGF4aXNPdXRNZXNzYWdlLCB3c2RsNGpPcGVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzZGw0akJpbmRpbmdPdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzV3JhcHBlZCk7Ci0gICAgICAgICAgICAgICAgfQotCi0KLSAgICAgICAgICAgICAgICBheGlzQmluZGluZ091dE1lc3NhZ2Uuc2V0QXhpc01lc3NhZ2UoYXhpc091dE1lc3NhZ2UpOwotICAgICAgICAgICAgICAgIGF4aXNCaW5kaW5nT3V0TWVzc2FnZS5zZXROYW1lKGF4aXNPdXRNZXNzYWdlLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgYXhpc0JpbmRpbmdPdXRNZXNzYWdlLnNldERpcmVjdGlvbihheGlzT3V0TWVzc2FnZS5nZXREaXJlY3Rpb24oKSk7Ci0KLSAgICAgICAgICAgICAgICBheGlzQmluZGluZ091dE1lc3NhZ2Uuc2V0UGFyZW50KGF4aXNCaW5kaW5nT3BlcmF0aW9uKTsKLSAgICAgICAgICAgICAgICBheGlzQmluZGluZ09wZXJhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENoaWxkKFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9PVVRfVkFMVUUsIGF4aXNCaW5kaW5nT3V0TWVzc2FnZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIE1hcCBiaW5kaW5nRmF1bHRzTWFwID0gd3NkbDRqQmluZGluZ09wZXJhdGlvbi5nZXRCaW5kaW5nRmF1bHRzKCk7Ci0KLSAgICAgICAgICAgIC8qIHByb2Nlc3MgdGhlIGJpbmRpbmcgZmF1bHRzICovCi0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGJpbmRpbmdGYXVsdHMgPSBiaW5kaW5nRmF1bHRzTWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgIGJpbmRpbmdGYXVsdHMuaGFzTmV4dCgpOykgewotCi0gICAgICAgICAgICAgICAgQmluZGluZ0ZhdWx0IGJpbmRpbmdGYXVsdCA9IChCaW5kaW5nRmF1bHQpIGJpbmRpbmdGYXVsdHMubmV4dCgpOwotICAgICAgICAgICAgICAgIGlmIChiaW5kaW5nRmF1bHQuZ2V0TmFtZSgpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiQmluZGluZyBuYW1lIGlzIG51bGwgZm9yIHRoZSBiaW5kaW5nIGZhdWx0IGluICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgYmluZGluZyBvcGVyYXRpb24gPT0+ICIgKyB3c2RsNGpCaW5kaW5nT3BlcmF0aW9uLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgRmF1bHQgd3NkbDRqRmF1bHQgPSB3c2RsNGpPcGVyYXRpb24uZ2V0RmF1bHQoYmluZGluZ0ZhdWx0LmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh3c2RsNGpGYXVsdCA9PSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoIkNhbiBub3QgZmluZCB0aGUgY29ycmVzcG9uZGluZyBmYXVsdCBlbGVtZW50IGluICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid3NkbCBvcGVyYXRpb24gIiArIHdzZGw0ak9wZXJhdGlvbi5nZXROYW1lKCkgKyAiIGZvciB0aGUgZmF1bHQiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBuYW1lICIgKyBiaW5kaW5nRmF1bHQuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2Ugd3NkbDRqRmF1bHRNZXNzZ2UgPSB3c2RsNGpGYXVsdC5nZXRNZXNzYWdlKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIEF4aXNNZXNzYWdlIGZhdWx0TWVzc2FnZSA9IGZpbmRGYXVsdE1lc3NhZ2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzZGw0akZhdWx0TWVzc2dlLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNPcGVyYXRpb24uZ2V0RmF1bHRNZXNzYWdlcygpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgQXhpc0JpbmRpbmdNZXNzYWdlIGF4aXNCaW5kaW5nRmF1bHRNZXNzYWdlID0gbmV3IEF4aXNCaW5kaW5nTWVzc2FnZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYWRkRG9jdW1lbnRhdGlvbihheGlzQmluZGluZ0ZhdWx0TWVzc2FnZSwgd3NkbDRqRmF1bHRNZXNzZ2UuZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBheGlzQmluZGluZ0ZhdWx0TWVzc2FnZS5zZXRGYXVsdCh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNCaW5kaW5nRmF1bHRNZXNzYWdlLnNldEF4aXNNZXNzYWdlKGZhdWx0TWVzc2FnZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBheGlzQmluZGluZ0ZhdWx0TWVzc2FnZS5zZXROYW1lKGZhdWx0TWVzc2FnZS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgYXhpc0JpbmRpbmdGYXVsdE1lc3NhZ2Uuc2V0UGFyZW50KGF4aXNCaW5kaW5nT3BlcmF0aW9uKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgYXhpc0JpbmRpbmdPcGVyYXRpb24uYWRkRmF1bHQoYXhpc0JpbmRpbmdGYXVsdE1lc3NhZ2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzU2V0TWVzc2FnZVFOYW1lcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZFFOYW1lUmVmZXJlbmNlKGZhdWx0TWVzc2FnZSwgd3NkbDRqRmF1bHQuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYXhpc0JpbmRpbmdPcGVyYXRpb24uc2V0UGFyZW50KGF4aXNCaW5kaW5nKTsKLSAgICAgICAgICAgIGF4aXNCaW5kaW5nLmFkZENoaWxkKGF4aXNCaW5kaW5nT3BlcmF0aW9uLmdldE5hbWUoKSwgYXhpc0JpbmRpbmdPcGVyYXRpb24pOwotICAgICAgICB9Ci0gICAgICAgIGF4aXNCaW5kaW5nLnNldFByb3BlcnR5KFdTREwyQ29uc3RhbnRzLkhUVFBfTE9DQVRJT05fVEFCTEUsIGh0dHBMb2NhdGlvbk1hcCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogY29udGFpbnMgYWxsIGNvZGUgd2hpY2ggZ2F0aGVycyBub24tc2VydmljZSBzcGVjaWZpYyBpbmZvcm1hdGlvbiBmcm9tIHRoZQotICAgICAqIHdzZGwuIDxwLz4gQWZ0ZXIgYWxsIHRoZSBzZXR1cCBjb21wbGV0ZXMgc3VjY2Vzc2Z1bGx5LCB0aGUgc2V0dXBDb21wbGV0ZQotICAgICAqIGZpZWxkIGlzIHNldCBzbyB0aGF0IGFueSBzdWJzZXF1ZW50IGNhbGxzIHRvIHNldHVwKCkgd2lsbCByZXN1bHQgaW4gYQotICAgICAqIG5vLW9wLiBOb3RlIHRoYXQgc3ViY2xhc3MgV1NETDExVG9BbGxBeGlzU2VydmljZXNCdWlsZGVyIHdpbGwgY2FsbAotICAgICAqIHBvcHVsYXRlU2VydmljZSBmb3IgZWFjaCBwb3J0IGluIHRoZSBXU0RMLiBTZXBhcmF0aW5nIHRoZSBub24tc2VydmljZQotICAgICAqIHNwZWNpZmljIGluZm9ybWF0aW9uIGhlcmUgYWxsb3dzIFdTREwxMVRvQWxsQXhpc1NlcnZpY2VzQnVpbGRlciB0byBvbmx5Ci0gICAgICogZG8gdGhpcyB3b3JrIDEgdGltZSBwZXIgV1NETCwgaW5zdGVhZCBvZiBmb3IgZWFjaCBwb3J0IG9uIGVhY2ggc2VydmljZS4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgV1NETEV4Y2VwdGlvbiBpZiByZWFkSW5UaGVXU0RMRmlsZSBmYWlscwotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldHVwKCkgdGhyb3dzIFdTRExFeGNlcHRpb24gewotICAgICAgICBpZiAoc2V0dXBDb21wbGV0ZSkgeyAvLyBhbHJlYWR5IHNldHVwLCBqdXN0IGRvIG5vdGhpbmcgYW5kIHJldHVybgotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmICh3c2RsNGpEZWZpbml0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgIHdzZGw0akRlZmluaXRpb24gPSByZWFkSW5UaGVXU0RMRmlsZShpbik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHdzZGw0akRlZmluaXRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOyAvLyBjYW4ndCBjb250aW51ZSB3aXRob3V0IHdzZGwKLSAgICAgICAgfQotCi0KLSAgICAgICAgLy8gc2V0dXAgdGhlIHNjaGVtYU1hcAotICAgICAgICB0aGlzLnNjaGVtYU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIHBvcHVsYXRlU2NoZW1hTWFwKHdzZGw0akRlZmluaXRpb24sIG5ldyBIYXNoU2V0KCkpOwotCi0gICAgICAgIHNldFBvbGljeVJlZ2lzdHJ5RnJvbVNlcnZpY2UoYXhpc1NlcnZpY2UpOwotCi0gICAgICAgIHNldHVwQ29tcGxldGUgPSB0cnVlOyAvLyBpZiBhbnkgcGFydCBvZiBzZXR1cCBmYWlscywgZG9uJ3QgbWFyawotICAgICAgICAvLyBzZXR1cENvbXBsZXRlCi0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBQb3B1bGF0ZSBhIG1hcCBvZiB0YXJnZXROYW1lc3BhY2UgdnMgRE9NIHNjaGVtYSBlbGVtZW50IFRoaXMgaXMgdXNlZCB0bwotICAgICAqIGdyYWIgdGhlIGNvcnJlY3Qgc2NoZW1hIGVsZW1lbnQgd2hlbiBhZGRpbmcgYSBuZXcgZWxlbWVudAotICAgICAqCi0gICAgICogQHBhcmFtIGRlZmluaXRpb24KLSAgICAgKi8KLQotICAgIHByaXZhdGUgdm9pZCBwb3B1bGF0ZVNjaGVtYU1hcChEZWZpbml0aW9uIGRlZmluaXRpb24sIFNldCB2aXNpdGVkV1NETHMpIHsKLSAgICAgICAgdmlzaXRlZFdTRExzLmFkZChkZWZpbml0aW9uLmdldERvY3VtZW50QmFzZVVSSSgpKTsKLSAgICAgICAgLy8gZmlyc3QgcHJvY2VzcyB0aGUgdHlwZXMgaW4gdGhlIGdpdmVuIHdzZGwKLSAgICAgICAgVHlwZXMgdHlwZXMgPSBkZWZpbml0aW9uLmdldFR5cGVzKCk7Ci0gICAgICAgIE9iamVjdCBleHRlbnNpYmlsaXR5RWxlbWVudDsKLSAgICAgICAgaWYgKHR5cGVzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSB0eXBlcy5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGV4dGVuc2liaWxpdHlFbGVtZW50ID0gaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgIGlmIChleHRlbnNpYmlsaXR5RWxlbWVudCBpbnN0YW5jZW9mIFNjaGVtYSkgewotICAgICAgICAgICAgICAgICAgICBFbGVtZW50IHNjaGVtYUVsZW1lbnQgPSAoKFNjaGVtYSkgZXh0ZW5zaWJpbGl0eUVsZW1lbnQpLmdldEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgc2NoZW1hTWFwLnB1dChzY2hlbWFFbGVtZW50LmdldEF0dHJpYnV0ZShYU0RfVEFSR0VUTkFNRVNQQUNFKSwgc2NoZW1hRWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gcG9wdWFsdGUgdGhlIGltcG9ydHMgYXMgd2VsbAotICAgICAgICBJdGVyYXRvciBpdGVyID0gZGVmaW5pdGlvbi5nZXRJbXBvcnRzKCkudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgVmVjdG9yIHZhbHVlcyA9IG51bGw7Ci0gICAgICAgIEltcG9ydCB3c2RsSW1wb3J0ID0gbnVsbDsKLSAgICAgICAgZm9yICg7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgdmFsdWVzID0gKFZlY3RvcikgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIHZhbHVlc0l0ZXIgPSB2YWx1ZXMuaXRlcmF0b3IoKTsgdmFsdWVzSXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgd3NkbEltcG9ydCA9IChJbXBvcnQpIHZhbHVlc0l0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgIERlZmluaXRpb24gaW5uZXJEZWZpbml0aW9uID0gd3NkbEltcG9ydC5nZXREZWZpbml0aW9uKCk7Ci0gICAgICAgICAgICAgICAgaWYoIXZpc2l0ZWRXU0RMcy5jb250YWlucyhpbm5lckRlZmluaXRpb24uZ2V0RG9jdW1lbnRCYXNlVVJJKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBvcHVsYXRlU2NoZW1hTWFwKGlubmVyRGVmaW5pdGlvbiwgdmlzaXRlZFdTRExzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIHJldHVybiB0aGUgc2VydmljZSB0byBwcm9jZXNzCi0gICAgICogaWYgdXNlciBoYXMgc3BlY2lmaWVkIHdlIGNoZWNrIHdoZXRoZXIgaXQgZXhpc3RzCi0gICAgICogZWxzZSBwaWNrIGEgcmFuZG9tIHNlcnZpY2UgYW5kIHRocm93cyBhbiBleGNlcHRpb24gaWYgbm90IGZvdW5kIGFueSB0aGluZwotICAgICAqCi0gICAgICogQHBhcmFtIGRlZmluaXRpb24KLSAgICAgKiBAcmV0dXJuIHNlcnZpY2UgdG8gcHJvY2VzcwotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0Ci0gICAgICovCi0KLSAgICBwcml2YXRlIFNlcnZpY2UgZmluZFNlcnZpY2UoRGVmaW5pdGlvbiBkZWZpbml0aW9uKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgTWFwIHNlcnZpY2VzID0gZGVmaW5pdGlvbi5nZXRTZXJ2aWNlcygpOwotICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSBudWxsOwotICAgICAgICBpZiAoc2VydmljZU5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gaS5lIGlmIGEgdXNlciBoYXMgc3BlY2lmaWVkIGEgcGlydGljdWxhciBwb3J0Ci0gICAgICAgICAgICBzZXJ2aWNlID0gKFNlcnZpY2UpIHNlcnZpY2VzLmdldChzZXJ2aWNlTmFtZSk7Ci0gICAgICAgICAgICBpZiAoc2VydmljZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiU2VydmljZSAiICsgc2VydmljZU5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiB3YXMgbm90IGZvdW5kIGluIHRoZSBXU0RMIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoc2VydmljZXMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHNlcnZpY2VzLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlID0gKFNlcnZpY2UpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoc2VydmljZS5nZXRQb3J0cygpLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vaS5lIHdlIGhhdmUgZm91bmQgYSBzZXJ2aWNlIHdpdGggcG9ydHMKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICgoc2VydmljZSA9PSBudWxsKSB8fCAoc2VydmljZS5nZXRQb3J0cygpLnNpemUoKSA9PSAwKSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJ0aGVyZSBpcyBubyBzZXJ2aWNlIHdpdGggcG9ydHMgdG8gcGljayIpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJObyBzZXJ2aWNlIHdhcyBub3QgZm91bmQgaW4gdGhlIFdTREwgYXQgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZpbml0aW9uLmdldERvY3VtZW50QmFzZVVSSSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgd2l0aCB0YXJnZXRuYW1lc3BhY2UgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBkZWZpbml0aW9uLmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc2VydmljZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMb29rIGZvciB0aGUgcmVsZXZhbnQgYmluZGluZyEKLSAgICAgKiBpZiB1c2VyIGhhcyBzcGNpZmVkIGEgcG9ydCBnZXQgaXQKLSAgICAgKiBvdGhlcndpc2UgZmluZCBmaXJzdCBzb2FwIHBvcnQgb3IgcGljayByYW5kb20gb25lIGlmIHRoZXJlIGlzIG5vIHNvYXAgcG9ydAotICAgICAqCi0gICAgICogQHBhcmFtIGRpZgotICAgICAqIEBwYXJhbSBzZXJ2aWNlIHNlcnZpY2UgY2FuIG5vdCBiZSBudWxsCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQKLSAgICAgKi8KLSAgICBwcml2YXRlIEJpbmRpbmcgZmluZEJpbmRpbmcoRGVmaW5pdGlvbiBkaWYsIFNlcnZpY2Ugc2VydmljZSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0KLSAgICAgICAgQmluZGluZyBiaW5kaW5nID0gbnVsbDsKLSAgICAgICAgUG9ydCBwb3J0ID0gbnVsbDsKLSAgICAgICAgY29weUV4dGVuc2libGVFbGVtZW50cyhzZXJ2aWNlLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpLCBkaWYsIGF4aXNTZXJ2aWNlLCBTRVJWSUNFKTsKLSAgICAgICAgaWYgKHBvcnROYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIGkuZSBpZiB1c2VyIGhhcyBzcGVjaWZpZWQgYSBzZXJ2aWNlCi0gICAgICAgICAgICBwb3J0ID0gc2VydmljZS5nZXRQb3J0KHBvcnROYW1lKTsKLSAgICAgICAgICAgIGlmIChwb3J0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJObyBwb3J0IGZvdW5kIGZvciB0aGUgZ2l2ZW4gbmFtZSA6IiArIHBvcnROYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIE1hcCBwb3J0cyA9IHNlcnZpY2UuZ2V0UG9ydHMoKTsKLSAgICAgICAgICAgIGlmIChwb3J0cyAhPSBudWxsICYmIHBvcnRzLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAvLyBwaWNrIHRoZSBwb3J0IHdpdGggdGhlIFNPQVAgYWRkcmVzcyBhcyB0aGUgZGVmYXVsdCBwb3J0Ci0gICAgICAgICAgICAgICAgcG9ydCA9IGZpbmRQb3J0KHBvcnRzKTsKLSAgICAgICAgICAgICAgICBpZiAocG9ydCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGEgU09BUCBwb3J0IHdhcyBub3QgZm91bmQgLSBsb2cgYSB3YXJuaW5nCi0gICAgICAgICAgICAgICAgICAgIC8vIGFuZCB1c2UgdGhlIGZpcnN0IHBvcnQgaW4gdGhlIGxpc3QKLSAgICAgICAgICAgICAgICAgICAgbG9nLmluZm8oIkEgU09BUCBwb3J0IHdhcyBub3QgZm91bmQgLSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgInBpY2tpbmcgYSByYW5kb20gcG9ydCEiKTsKLSAgICAgICAgICAgICAgICAgICAgcG9ydCA9IChQb3J0KSBwb3J0cy52YWx1ZXMoKS50b0FycmF5KClbMF07Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHBvcnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAvLyBpLmUgd2UgaGF2ZSBmaW5kIGEgY29ycmVjdCBwb3J0Ci0gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgb25seSB1c2UgZnVsbCBpbiBjb2RlZ2VuIHRpbWUuCi0gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzQ29kZWdlbiAmJiAhdGhpcy5pc0FsbFBvcnRzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB1c2VyIGhhcyBub3Qgc2V0IGFsbCBvcHRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gZ2VuZXJhdGUgY29kZSBvbmx5IGZvciB0aGF0IG9wdGlvbi4KLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucG9ydE5hbWUgPSBwb3J0LmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGF4aXNTZXJ2aWNlLnNldE5hbWUoc2VydmljZS5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpKTsKLQotICAgICAgICBpZiAocG9ydCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjb3B5RXh0ZW5zaWJsZUVsZW1lbnRzKHBvcnQuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCksIGRpZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpc1NlcnZpY2UsIFBPUlQpOwotICAgICAgICAgICAgRGVmaW5pdGlvbiBwYXJlbnREZWZpbml0aW9uID0gZ2V0UGFyZW50RGVmaW5pdGlvbihkaWYsCi0gICAgICAgICAgICAgICAgICAgIHBvcnQuZ2V0QmluZGluZygpLmdldFFOYW1lKCksIENPTVBPTkVOVF9CSU5ESU5HLCBuZXcgSGFzaFNldCgpKTsKLSAgICAgICAgICAgIGJpbmRpbmcgPSBwYXJlbnREZWZpbml0aW9uLmdldEJpbmRpbmcocG9ydC5nZXRCaW5kaW5nKCkuZ2V0UU5hbWUoKSk7Ci0gICAgICAgICAgICBpZiAoYmluZGluZyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYmluZGluZyA9IHBvcnQuZ2V0QmluZGluZygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGJpbmRpbmc7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmluZHMgYSBTT0FQIHBvcnQgZ2l2ZW4gdGhlIHBvcnQgbWFwCi0gICAgICovCi0gICAgcHJpdmF0ZSBQb3J0IGZpbmRQb3J0KE1hcCBwb3J0cykgewotICAgICAgICBQb3J0IHBvcnQ7Ci0gICAgICAgIFBvcnQgcmV0dXJuUG9ydCA9IG51bGw7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgcG9ydHNJdGVyYXRvciA9IHBvcnRzLnZhbHVlcygpLml0ZXJhdG9yKCk7IHBvcnRzSXRlcmF0b3IuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgcG9ydCA9IChQb3J0KSBwb3J0c0l0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgIExpc3QgZXh0ZW5zaWJpbGl0eUVsZW1lbnRzID0gcG9ydC5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaWJpbGl0eUVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IGV4dEVsZW1lbnQgPSBleHRlbnNpYmlsaXR5RWxlbWVudHMuZ2V0KGkpOwotICAgICAgICAgICAgICAgIGlmIChleHRFbGVtZW50IGluc3RhbmNlb2YgU09BUDEyQWRkcmVzcykgewotICAgICAgICAgICAgICAgICAgICAvLyBTT0FQIDEuMiBhZGRyZXNzIGZvdW5kIC0ga2VlcCB0aGlzIGFuZCBsb29wIHVudGlsIGh0dHAgYWRkcmVzcyBpcyBmb3VuZAotICAgICAgICAgICAgICAgICAgICByZXR1cm5Qb3J0ID0gcG9ydDsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxvY2F0aW9uID0gKChTT0FQMTJBZGRyZXNzKWV4dEVsZW1lbnQpLmdldExvY2F0aW9uVVJJKCkudHJpbSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoKGxvY2F0aW9uICE9IG51bGwpICYmIGxvY2F0aW9uLnN0YXJ0c1dpdGgoImh0dHA6IikpewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gaS5lIHdlIGhhdmUgZm91bmQgYW4gaHR0cCBwb3J0IHNvIHJldHVybiBmcm9tIGhlcmUKLSAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocmV0dXJuUG9ydCAhPSBudWxsKXsKLSAgICAgICAgICAgIHJldHVybiByZXR1cm5Qb3J0OwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChJdGVyYXRvciBwb3J0c0l0ZXJhdG9yID0gcG9ydHMudmFsdWVzKCkuaXRlcmF0b3IoKTsgcG9ydHNJdGVyYXRvcgotICAgICAgICAgICAgICAgIC5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBwb3J0ID0gKFBvcnQpIHBvcnRzSXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgTGlzdCBleHRlbnNpYmlsaXR5RWxlbWVudHMgPSBwb3J0LmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpYmlsaXR5RWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBPYmplY3QgZXh0RWxlbWVudCA9IGV4dGVuc2liaWxpdHlFbGVtZW50cy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgaWYgKGV4dEVsZW1lbnQgaW5zdGFuY2VvZiBTT0FQQWRkcmVzcykgewotICAgICAgICAgICAgICAgICAgICAvLyBTT0FQIDEuMSBhZGRyZXNzIGZvdW5kIC0ga2VlcCB0aGlzIGFuZCBsb29wIHVudGlsIGh0dHAgYWRkcmVzcyBpcyBmb3VuZAotICAgICAgICAgICAgICAgICAgICByZXR1cm5Qb3J0ID0gcG9ydDsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxvY2F0aW9uID0gKChTT0FQQWRkcmVzcylleHRFbGVtZW50KS5nZXRMb2NhdGlvblVSSSgpLnRyaW0oKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChsb2NhdGlvbiAhPSBudWxsKSAmJiBsb2NhdGlvbi5zdGFydHNXaXRoKCJodHRwOiIpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGkuZSB3ZSBoYXZlIGZvdW5kIGFuIGh0dHAgcG9ydCBzbyByZXR1cm4gZnJvbSBoZXJlCi0gICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHJldHVyblBvcnQgIT0gbnVsbCl7Ci0gICAgICAgICAgICByZXR1cm4gcmV0dXJuUG9ydDsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoSXRlcmF0b3IgcG9ydHNJdGVyYXRvciA9IHBvcnRzLnZhbHVlcygpLml0ZXJhdG9yKCk7IHBvcnRzSXRlcmF0b3IKLSAgICAgICAgICAgICAgICAuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgcG9ydCA9IChQb3J0KSBwb3J0c0l0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgIExpc3QgZXh0ZW5zaWJpbGl0eUVsZW1lbnRzID0gcG9ydC5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaWJpbGl0eUVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IGV4dEVsZW1lbnQgPSBleHRlbnNpYmlsaXR5RWxlbWVudHMuZ2V0KGkpOwotICAgICAgICAgICAgICAgIGlmIChleHRFbGVtZW50IGluc3RhbmNlb2YgSFRUUEFkZHJlc3MpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSFRUUCBhZGRyZXNzIGZvdW5kIC0ga2VlcCB0aGlzIGFuZCBsb29wIHVudGlsIGh0dHAgYWRkcmVzcyBpcyBmb3VuZAotICAgICAgICAgICAgICAgICAgICByZXR1cm5Qb3J0ID0gcG9ydDsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxvY2F0aW9uID0gKChIVFRQQWRkcmVzcylleHRFbGVtZW50KS5nZXRMb2NhdGlvblVSSSgpLnRyaW0oKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChsb2NhdGlvbiAhPSBudWxsKSAmJiBsb2NhdGlvbi5zdGFydHNXaXRoKCJodHRwOiIpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGkuZSB3ZSBoYXZlIGZvdW5kIGFuIGh0dHAgcG9ydCBzbyByZXR1cm4gZnJvbSBoZXJlCi0gICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXR1cm5Qb3J0OwotICAgIH0KLQotICAgIHByaXZhdGUgT3BlcmF0aW9uIGZpbmRPcGVyYXRpb24oUG9ydFR5cGUgcG9ydFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaW5kaW5nT3BlcmF0aW9uIHdzZGw0akJpbmRpbmdPcGVyYXRpb24pIHsKLSAgICAgICAgT3BlcmF0aW9uIG9wID0gd3NkbDRqQmluZGluZ09wZXJhdGlvbi5nZXRPcGVyYXRpb24oKTsKLSAgICAgICAgU3RyaW5nIGlucHV0ID0gbnVsbDsKLSAgICAgICAgaWYgKG9wICE9IG51bGwgJiYgb3AuZ2V0SW5wdXQoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnB1dCA9IG9wLmdldElucHV0KCkuZ2V0TmFtZSgpOwotICAgICAgICAgICAgaWYgKCI6bm9uZSIuZXF1YWxzKGlucHV0KSkgewotICAgICAgICAgICAgICAgIGlucHV0ID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgb3V0cHV0ID0gbnVsbDsKLSAgICAgICAgaWYgKG9wICE9IG51bGwgJiYgb3AuZ2V0T3V0cHV0KCkgIT0gbnVsbCkgewotICAgICAgICAgICAgb3V0cHV0ID0gb3AuZ2V0T3V0cHV0KCkuZ2V0TmFtZSgpOwotICAgICAgICAgICAgaWYgKCI6bm9uZSIuZXF1YWxzKG91dHB1dCkpIHsKLSAgICAgICAgICAgICAgICBvdXRwdXQgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIE9wZXJhdGlvbiBvcDIgPSBwb3J0VHlwZS5nZXRPcGVyYXRpb24ob3AuZ2V0TmFtZSgpLCBpbnB1dCwgb3V0cHV0KTsKLSAgICAgICAgcmV0dXJuICgob3AyID09IG51bGwpID8gb3AgOiBvcDIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZpbmQgdGhlIGZhdWx0IG1lc3NhZ2UgcmVsZXZhbnQgdG8gYSBnaXZlbiBuYW1lIGZyb20gdGhlIGZhdWx0IG1lc3NhZ2UKLSAgICAgKiBsaXN0Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZQotICAgICAqIEBwYXJhbSBmYXVsdE1lc3NhZ2VzCi0gICAgICovCi0gICAgcHJpdmF0ZSBBeGlzTWVzc2FnZSBmaW5kRmF1bHRNZXNzYWdlKFN0cmluZyBuYW1lLCBBcnJheUxpc3QgZmF1bHRNZXNzYWdlcykgewotICAgICAgICBBeGlzTWVzc2FnZSB0ZW1wTWVzc2FnZTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmYXVsdE1lc3NhZ2VzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICB0ZW1wTWVzc2FnZSA9IChBeGlzTWVzc2FnZSkgZmF1bHRNZXNzYWdlcy5nZXQoaSk7Ci0gICAgICAgICAgICBpZiAobmFtZS5lcXVhbHModGVtcE1lc3NhZ2UuZ2V0TmFtZSgpKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0ZW1wTWVzc2FnZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZCB0aGUgUU5hbWUgZm9yIHRoZSBiaW5kaW5nIGlucHV0Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gaW5NZXNzYWdlCi0gICAgICogQHBhcmFtIHdzZGw0ak9wZXJhdGlvbgotICAgICAqIEBwYXJhbSBiaW5kaW5nSW5wdXQKLSAgICAgKiBAcGFyYW0gaXNXcmFwcGVkICAgICAgIC0gYmFzaWNhbGx5IHdoZXRoZXIgdGhlIG9wZXJhdGlvbiBpcyBzb2FwL3JwYyBvciBub3QKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYWRkUU5hbWVSZWZlcmVuY2UoQXhpc01lc3NhZ2UgaW5NZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYXRpb24gd3NkbDRqT3BlcmF0aW9uLCBCaW5kaW5nSW5wdXQgYmluZGluZ0lucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzV3JhcHBlZCkgewotCi0gICAgICAgIExpc3QgZXh0ZW5zaWJpbGl0eUVsZW1lbnRzID0gYmluZGluZ0lucHV0LmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICAgICAgICBNZXNzYWdlIHdzZGw0ak1lc3NhZ2UgPSB3c2RsNGpPcGVyYXRpb24uZ2V0SW5wdXQoKS5nZXRNZXNzYWdlKCk7Ci0KLSAgICAgICAgYWRkUU5hbWVSZWZlcmVuY2UoaW5NZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICB3c2RsNGpPcGVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGlzV3JhcHBlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaWJpbGl0eUVsZW1lbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICB3c2RsNGpNZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICB3c2RsNGpPcGVyYXRpb24uZ2V0TmFtZSgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgdGhlIFFOYW1lIGZvciB0aGUgYmluZGluZyBvdXRwdXQKLSAgICAgKgotICAgICAqIEBwYXJhbSBvdXRNZXNzYWdlCi0gICAgICogQHBhcmFtIHdzZGw0ak9wZXJhdGlvbgotICAgICAqIEBwYXJhbSBpc1dyYXBwZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYWRkUU5hbWVSZWZlcmVuY2UoQXhpc01lc3NhZ2Ugb3V0TWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmF0aW9uIHdzZGw0ak9wZXJhdGlvbiwgQmluZGluZ091dHB1dCBiaW5kaW5nT3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzV3JhcHBlZCkgewotCi0gICAgICAgIGlmIChiaW5kaW5nT3V0cHV0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIExpc3QgZXh0ZW5zaWJpbGl0eUVsZW1lbnRzID0gYmluZGluZ091dHB1dC5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICAgICAgICAgIGlmICh3c2RsNGpPcGVyYXRpb24uZ2V0T3V0cHV0KCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE1lc3NhZ2Ugd3NkbDRqTWVzc2FnZSA9IHdzZGw0ak9wZXJhdGlvbi5nZXRPdXRwdXQoKS5nZXRNZXNzYWdlKCk7Ci0KLSAgICAgICAgICAgIGFkZFFOYW1lUmVmZXJlbmNlKG91dE1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c2RsNGpPcGVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1dyYXBwZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpYmlsaXR5RWxlbWVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c2RsNGpNZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NkbDRqT3BlcmF0aW9uLmdldE5hbWUoKSArIFdSQVBQRURfT1VUUFVUTkFNRV9TVUZGSVgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZFFOYW1lUmVmZXJlbmNlKEF4aXNNZXNzYWdlIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhdGlvbiB3c2RsNGpPcGVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNXcmFwcGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0IGV4dGVuc2liaWxpdHlFbGVtZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSB3c2RsNGpNZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcnBjT3BlcmF0aW9uTmFtZSkgewotICAgICAgICBpZiAoaXNXcmFwcGVkKSB7Ci0gICAgICAgICAgICAvLyB3ZSBoYXZlIGFscmVhZHkgdmFsaWRhdGVkIGFuZCBwcm9jZXNzIHRoZSBxbmFtZSByZWZlcmVuY2VzCi0gICAgICAgICAgICAvLyBzbyBzZXQgaXQgaGVyZQotICAgICAgICAgICAgLy8gVGhlIHNjaGVtYSBmb3IgdGhpcyBzaG91bGQgYmUgYWxyZWFkeSBtYWRlICEgRmluZCB0aGUKLSAgICAgICAgICAgIC8vIFFOYW1lIGZyb20KLSAgICAgICAgICAgIC8vIHRoZSBsaXN0IGFuZCBhZGQgaXQgLSB0aGUgbmFtZSBmb3IgdGhpcyBpcyBqdXN0IHRoZQotICAgICAgICAgICAgbWVzc2FnZS5zZXRFbGVtZW50UU5hbWUoKFFOYW1lKSByZXNvbHZlZFJwY1dyYXBwZWRFbGVtZW50TWFwCi0gICAgICAgICAgICAgICAgICAgIC5nZXQocnBjT3BlcmF0aW9uTmFtZSkpOwotICAgICAgICAgICAgbWVzc2FnZS5nZXRBeGlzT3BlcmF0aW9uKCkuZ2V0QXhpc1NlcnZpY2UoKS5hZGRNZXNzYWdlRWxlbWVudFFOYW1lVG9PcGVyYXRpb25NYXBwaW5nKAotICAgICAgICAgICAgICAgICAgICAoUU5hbWUpIHJlc29sdmVkUnBjV3JhcHBlZEVsZW1lbnRNYXAuZ2V0KHJwY09wZXJhdGlvbk5hbWUpLAotICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmdldEF4aXNPcGVyYXRpb24oKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBub3cgd2UgYXJlIHN1cmUgdGhpcyBpcyBhbiBkb2N1bWVudCBsaXRlcmFsIHR5cGUgZWxlbWVudAotICAgICAgICAgICAgTGlzdCBiaW5kaW5nUGFydHNMaXN0ID0gZ2V0UGFydHNMaXN0RnJvbVNvYXBCb2R5KGV4dGVuc2liaWxpdHlFbGVtZW50cyk7Ci0gICAgICAgICAgICBpZiAoYmluZGluZ1BhcnRzTGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gaS5lIHVzZXIgaGFzIG5vdCBnaXZlbiBhbnkgcGFydCBsaXN0IHNvIHdlIGdvIHRvIG1lc3NhZ2UgYW5kIHBpY2sgdGhlIGZpcmVzdCBwYXJ0IGlmCi0gICAgICAgICAgICAgICAgLy8gYXZhaWxhYmxlCi0gICAgICAgICAgICAgICAgaWYgKCh3c2RsNGpNZXNzYWdlLmdldFBhcnRzKCkgIT0gbnVsbCkgJiYgKHdzZGw0ak1lc3NhZ2UuZ2V0UGFydHMoKS5zaXplKCkgPiAwKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAod3NkbDRqTWVzc2FnZS5nZXRQYXJ0cygpLnNpemUoKSA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBQYXJ0IHBhcnQgPSAoUGFydCkgd3NkbDRqTWVzc2FnZS5nZXRQYXJ0cygpLnZhbHVlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgUU5hbWUgZWxlbWVudE5hbWUgPSBwYXJ0LmdldEVsZW1lbnROYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudE5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc2V0RWxlbWVudFFOYW1lKGVsZW1lbnROYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnNldE1lc3NhZ2VQYXJ0TmFtZShwYXJ0LmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQXhpc09wZXJhdGlvbiBvcGVyYXRpb24gPSBtZXNzYWdlLmdldEF4aXNPcGVyYXRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBeGlzU2VydmljZSBzZXJ2aWNlID0gb3BlcmF0aW9uLmdldEF4aXNTZXJ2aWNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZS5hZGRNZXNzYWdlRWxlbWVudFFOYW1lVG9PcGVyYXRpb25NYXBwaW5nKGVsZW1lbnROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV1NETFByb2Nlc3NpbmdFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm8gZWxlbWVudCB0eXBlIGlzIGRlZmluZWQgZm9yIG1lc3NhZ2UgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c2RsNGpNZXNzYWdlLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXNlciBoYXMgc3BlY2lmaWVkIG1vcmUgdGhhbiBvbmUgcGFydHMgd2l0aCBvdXQgc3BlY2lmaW5nIGEgcGFydCBpbgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gc29hcCBib2R5Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV1NETFByb2Nlc3NpbmdFeGNlcHRpb24oIk1vcmUgdGhhbiBvbmUgcGFydCBmb3IgbWVzc2FnZSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c2RsNGpNZXNzYWdlLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBhbGxvd2VkIGluIHRoZSBzcGVjIGluIHRoaXMgY2FzZSBlbGVtZW50IHFuYW1lIGlzIG51bGwgYW5kIG5vdGhpbmcgaXMgc2VuZAotICAgICAgICAgICAgICAgICAgICAvLyBpbiB0aGUgc29hcCBib2R5Ci0gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc2V0RWxlbWVudFFOYW1lKG51bGwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGJpbmRpbmdQYXJ0c0xpc3Quc2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gd2UgZG9ub3QgaGF2ZSB0byBzZXQgdGhlIGVsZW1lbnQgcW5hbWUKLSAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5zZXRFbGVtZW50UU5hbWUobnVsbCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChiaW5kaW5nUGFydHNMaXN0LnNpemUoKSA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIFBhcnQgcGFydCA9IHdzZGw0ak1lc3NhZ2UuZ2V0UGFydCgoU3RyaW5nKSBiaW5kaW5nUGFydHNMaXN0LmdldCgwKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwYXJ0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFFOYW1lIGVsZW1lbnROYW1lID0gcGFydC5nZXRFbGVtZW50TmFtZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnROYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnNldEVsZW1lbnRRTmFtZShlbGVtZW50TmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5zZXRNZXNzYWdlUGFydE5hbWUocGFydC5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF4aXNPcGVyYXRpb24gb3BlcmF0aW9uID0gbWVzc2FnZS5nZXRBeGlzT3BlcmF0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSA9IG9wZXJhdGlvbi5nZXRBeGlzU2VydmljZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UuYWRkTWVzc2FnZUVsZW1lbnRRTmFtZVRvT3BlcmF0aW9uTWFwcGluZyhlbGVtZW50TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFdTRExQcm9jZXNzaW5nRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vIGVsZW1lbnQgdHlwZSBpcyBkZWZpbmVkIGZvciBtZXNzYWdlIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c2RsNGpNZXNzYWdlLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFdTRExQcm9jZXNzaW5nRXhjZXB0aW9uKCJNaXNzaW5nIHBhcnQgbmFtZWQgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgYmluZGluZ1BhcnRzTGlzdC5nZXQoMCkgKyAiICIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBpLmUgbW9yZSB0aGFuIG9uZSBwYXJ0IHNwZWNpZmllZCBpbiB0aGlzIGNhc2Ugd2UgaGF2ZQotICAgICAgICAgICAgICAgICAgICAvLyB0byBzZW5kIGFuIGV4Y2VwdGlvbgotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV1NETFByb2Nlc3NpbmdFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1vcmUgdGhhbiBvbmUgZWxlbWVudCBwYXJ0IGlzIG5vdCBhbGx3ZWQgaW4gZG9jdW1lbnQgbGl0ZXJhbCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHR5cGUgYmluZGluZyBvcGVyYXRpb24gIiArIHdzZGw0ak9wZXJhdGlvbi5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgdGhlIFFOYW1lIGZvciB0aGUgYmluZGluZyBvdXRwdXQKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYWRkUU5hbWVSZWZlcmVuY2UoQXhpc01lc3NhZ2UgZmF1bHRNZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlIHdzZGw0ak1lc3NhZ2UpIHRocm93cyBBeGlzRmF1bHQgewotCi0gICAgICAgIC8vIGZvciBhIGZhdWx0IHRoaXMgaXMgdHJpdmlhbCAtIEFsbCBmYXVsdHMgYXJlIHJlbGF0ZWQgZGlyZWN0bHkgdG8gYQotICAgICAgICAvLyBtZXNzYWdlIGJ5IHRoZSBuYW1lIGFuZCBhcmUgc3VwcG9zZWQgdG8gaGF2ZSBhIHNpbmdsZSBwYXJ0LiBTbyBpdCBpcwotICAgICAgICAvLyBhIG1hdHRlciBvZiBjb3B5aW5nIHRoZSByaWdodCBRTmFtZSBmcm9tIHRoZSBtZXNzYWdlIHBhcnQKLQotICAgICAgICAvLyBnZXQgdGhlIHBhcnQKLSAgICAgICAgTWFwIHBhcnRzID0gd3NkbDRqTWVzc2FnZS5nZXRQYXJ0cygpOwotICAgICAgICBpZiAocGFydHMgPT0gbnVsbCB8fCBwYXJ0cy5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAiVGhlcmUgYXJlIG5vIHBhcnRzIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZm9yIGZhdWx0IG1lc3NhZ2UgOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgd3NkbDRqTWVzc2FnZS5nZXRRTmFtZSgpOwotICAgICAgICAgICAgbG9nLmVycm9yKG1lc3NhZ2UpOwotICAgICAgICAgICAgdGhyb3cgbmV3IFdTRExQcm9jZXNzaW5nRXhjZXB0aW9uKG1lc3NhZ2UpOwotICAgICAgICB9Ci0gICAgICAgIFBhcnQgd3NkbDRqTWVzc2FnZVBhcnQgPSAoUGFydCkgcGFydHMudmFsdWVzKCkKLSAgICAgICAgICAgICAgICAudG9BcnJheSgpWzBdOwotICAgICAgICBpZiAod3NkbDRqTWVzc2FnZVBhcnQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFdTRExQcm9jZXNzaW5nRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgUU5hbWUgbmFtZSA9IHdzZGw0ak1lc3NhZ2VQYXJ0LmdldEVsZW1lbnROYW1lKCk7Ci0gICAgICAgIGlmIChuYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gIlBhcnQgJyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB3c2RsNGpNZXNzYWdlUGFydC5nZXROYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiJyBvZiBmYXVsdCBtZXNzYWdlICciCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgd3NkbDRqTWVzc2FnZS5nZXRRTmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIicgbXVzdCBiZSBkZWZpbmVkIHdpdGggJ2VsZW1lbnQ9UU5hbWUnIGFuZCBub3QgJ3R5cGU9UU5hbWUnIjsKLSAgICAgICAgICAgIGxvZy5lcnJvcihtZXNzYWdlKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQobWVzc2FnZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBmYXVsdE1lc3NhZ2Uuc2V0TWVzc2FnZVBhcnROYW1lKHdzZGw0ak1lc3NhZ2VQYXJ0LmdldE5hbWUoKSk7Ci0gICAgICAgIGZhdWx0TWVzc2FnZS5zZXRFbGVtZW50UU5hbWUobmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQSB1dGlsIG1ldGhvZCB0aGF0IHJldHVybnMgdGhlIFNPQVAgc3R5bGUgaW5jbHVkZWQgaW4gdGhlIGJpbmRpbmcKLSAgICAgKiBvcGVyYXRpb24KLSAgICAgKgotICAgICAqIEBwYXJhbSBiaW5kaW5nT3AKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBnZXRTT0FQU3R5bGUoQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3ApIHsKLSAgICAgICAgTGlzdCBleHRlbnNpYmlsaXR5RWxlbWVudHMgPSBiaW5kaW5nT3AuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaWJpbGl0eUVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBPYmplY3QgZXh0RWxlbWVudCA9IGV4dGVuc2liaWxpdHlFbGVtZW50cy5nZXQoaSk7Ci0gICAgICAgICAgICBpZiAoZXh0RWxlbWVudCBpbnN0YW5jZW9mIFNPQVBPcGVyYXRpb24pIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKChTT0FQT3BlcmF0aW9uKSBleHRFbGVtZW50KS5nZXRTdHlsZSgpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChleHRFbGVtZW50IGluc3RhbmNlb2YgU09BUDEyT3BlcmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICgoU09BUDEyT3BlcmF0aW9uKSBleHRFbGVtZW50KS5nZXRTdHlsZSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29weSB0aGUgY29tcG9uZW50IGZyb20gdGhlIG9wZXJhdGlvbgotICAgICAqCi0gICAgICogQHBhcmFtIHdzZGw0ak9wZXJhdGlvbgotICAgICAqIEBwYXJhbSBkaWYKLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdAotICAgICAqLwotICAgIHByaXZhdGUgQXhpc09wZXJhdGlvbiBwb3B1bGF0ZU9wZXJhdGlvbnMoT3BlcmF0aW9uIHdzZGw0ak9wZXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvcnRUeXBlIHdzZGw0alBvcnRUeXBlLCBEZWZpbml0aW9uIGRpZikKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBRTmFtZSBvcE5hbWUgPSBuZXcgUU5hbWUoZGlmLmdldFRhcmdldE5hbWVzcGFjZSgpLCB3c2RsNGpPcGVyYXRpb24uZ2V0TmFtZSgpKTsKLSAgICAgICAgLy8gQ29weSBOYW1lIEF0dHJpYnV0ZQotICAgICAgICBBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb24gPSBheGlzU2VydmljZS5nZXRPcGVyYXRpb24ob3BOYW1lKTsKLSAgICAgICAgaWYgKGF4aXNPcGVyYXRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIE1FUCA9IGdldE1FUCh3c2RsNGpPcGVyYXRpb24pOwotICAgICAgICAgICAgYXhpc09wZXJhdGlvbiA9IEF4aXNPcGVyYXRpb25GYWN0b3J5LmdldE9wZXJhdGlvbkRlc2NyaXB0aW9uKE1FUCk7Ci0gICAgICAgICAgICBheGlzT3BlcmF0aW9uLnNldE5hbWUob3BOYW1lKTsKLQotICAgICAgICAgICAgLy8gc2V0dGluZyB0aGUgUG9saWN5SW5jbHVkZSBwcm9wZXJ0eSBvZiB0aGUgQXhpc09wZXJhdGlvbgotICAgICAgICAgICAgUG9saWN5SW5jbHVkZSBwb2xpY3lJbmNsdWRlID0gbmV3IFBvbGljeUluY2x1ZGUoYXhpc09wZXJhdGlvbik7Ci0gICAgICAgICAgICBheGlzT3BlcmF0aW9uLnNldFBvbGljeUluY2x1ZGUocG9saWN5SW5jbHVkZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBjb3B5RXh0ZW5zaW9uQXR0cmlidXRlcyh3c2RsNGpPcGVyYXRpb24uZ2V0RXh0ZW5zaW9uQXR0cmlidXRlcygpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzT3BlcmF0aW9uLCBQT1JUX1RZUEVfT1BFUkFUSU9OKTsKLQotICAgICAgICBJbnB1dCB3c2RsNGpJbnB1dE1lc3NhZ2UgPSB3c2RsNGpPcGVyYXRpb24uZ2V0SW5wdXQoKTsKLQotICAgICAgICBpZiAoaXNTZXJ2ZXJTaWRlKSB7Ci0gICAgICAgICAgICBpZiAobnVsbCAhPSB3c2RsNGpJbnB1dE1lc3NhZ2UpIHsKLSAgICAgICAgICAgICAgICBBeGlzTWVzc2FnZSBpbk1lc3NhZ2UgPSBheGlzT3BlcmF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0TWVzc2FnZShXU0RMQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfSU5fVkFMVUUpOwotICAgICAgICAgICAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9IHdzZGw0aklucHV0TWVzc2FnZS5nZXRNZXNzYWdlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKG51bGwgIT0gbWVzc2FnZSkgewotICAgICAgICAgICAgICAgICAgICBpbk1lc3NhZ2Uuc2V0TmFtZShtZXNzYWdlLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICBjb3B5RXh0ZW5zaW9uQXR0cmlidXRlcyh3c2RsNGpJbnB1dE1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQXR0cmlidXRlcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluTWVzc2FnZSwgUE9SVF9UWVBFX09QRVJBVElPTl9JTlBVVCk7Ci0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGFjdGlvbiBpcyBhbHJlYWR5IHNldCBhcyB3ZSBkb24ndCB3YW50IHRvCi0gICAgICAgICAgICAgICAgLy8gb3ZlcnJpZGUgaXQKLSAgICAgICAgICAgICAgICAvLyB3aXRoIHRoZSBEZWZhdWx0IEFjdGlvbiBQYXR0ZXJuCi0gICAgICAgICAgICAgICAgQXJyYXlMaXN0IGlucHV0QWN0aW9ucyA9IGF4aXNPcGVyYXRpb24uZ2V0V1NBTWFwcGluZ0xpc3QoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgYWN0aW9uID0gbnVsbDsKLSAgICAgICAgICAgICAgICBpZiAoaW5wdXRBY3Rpb25zID09IG51bGwgfHwgaW5wdXRBY3Rpb25zLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFjdGlvbiA9IFdTREwxMUFjdGlvbkhlbHBlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRBY3Rpb25Gcm9tSW5wdXRFbGVtZW50KGRpZiwgd3NkbDRqUG9ydFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NkbDRqT3BlcmF0aW9uLCB3c2RsNGpJbnB1dE1lc3NhZ2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoYWN0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0QWN0aW9ucyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dEFjdGlvbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBheGlzT3BlcmF0aW9uLnNldFdzYW1hcHBpbmdMaXN0KGlucHV0QWN0aW9ucyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaW5wdXRBY3Rpb25zLmFkZChhY3Rpb24pOwotICAgICAgICAgICAgICAgICAgICBheGlzU2VydmljZS5tYXBBY3Rpb25Ub09wZXJhdGlvbihhY3Rpb24sIGF4aXNPcGVyYXRpb24pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIENyZWF0ZSBhbiBvdXRwdXQgbWVzc2FnZSBhbmQgYWRkCi0gICAgICAgICAgICBPdXRwdXQgd3NkbDRqT3V0cHV0TWVzc2FnZSA9IHdzZGw0ak9wZXJhdGlvbi5nZXRPdXRwdXQoKTsKLSAgICAgICAgICAgIGlmIChudWxsICE9IHdzZGw0ak91dHB1dE1lc3NhZ2UpIHsKLSAgICAgICAgICAgICAgICBBeGlzTWVzc2FnZSBvdXRNZXNzYWdlID0gYXhpc09wZXJhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgLmdldE1lc3NhZ2UoV1NETENvbnN0YW50cy5NRVNTQUdFX0xBQkVMX09VVF9WQUxVRSk7Ci0gICAgICAgICAgICAgICAgTWVzc2FnZSBtZXNzYWdlID0gd3NkbDRqT3V0cHV0TWVzc2FnZS5nZXRNZXNzYWdlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKG51bGwgIT0gbWVzc2FnZSkgewotCi0gICAgICAgICAgICAgICAgICAgIG91dE1lc3NhZ2Uuc2V0TmFtZShtZXNzYWdlLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICBjb3B5RXh0ZW5zaW9uQXR0cmlidXRlcyh3c2RsNGpJbnB1dE1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQXR0cmlidXRlcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dE1lc3NhZ2UsIFBPUlRfVFlQRV9PUEVSQVRJT05fT1VUUFVUKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyB3c2RsOnBvcnRUeXBlIC0+IHdzZGw6b3BlcmF0aW9uIC0+IHdzZGw6b3V0cHV0Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBhY3Rpb24gaXMgYWxyZWFkeSBzZXQgYXMgd2UgZG9uJ3Qgd2FudCB0bwotICAgICAgICAgICAgICAgIC8vIG92ZXJyaWRlIGl0Ci0gICAgICAgICAgICAgICAgLy8gd2l0aCB0aGUgRGVmYXVsdCBBY3Rpb24gUGF0dGVybgotICAgICAgICAgICAgICAgIFN0cmluZyBhY3Rpb24gPSBheGlzT3BlcmF0aW9uLmdldE91dHB1dEFjdGlvbigpOwotICAgICAgICAgICAgICAgIGlmIChhY3Rpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhY3Rpb24gPSBXU0RMMTFBY3Rpb25IZWxwZXIuZ2V0QWN0aW9uRnJvbU91dHB1dEVsZW1lbnQoZGlmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NkbDRqUG9ydFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c2RsNGpPcGVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c2RsNGpPdXRwdXRNZXNzYWdlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGFjdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF4aXNPcGVyYXRpb24uc2V0T3V0cHV0QWN0aW9uKGFjdGlvbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotCi0gICAgICAgICAgICAvLyBmb3IgdGhlIGNsaWVudCBzaWRlIHdlIGhhdmUgdG8gZG8gc29tZXRoaW5nIHRoYXQgaXMgYSBiaXQKLSAgICAgICAgICAgIC8vIHdlaXJkLiBUaGUgaW4gbWVzc2FnZSBpcyBhY3R1YWxseSB0YWtlbiBmcm9tIHRoZSBvdXRwdXQKLSAgICAgICAgICAgIC8vIGFuZCB0aGUgb3V0cHV0IGlzIHRha2VuIGZyb20gdGhlIGluCi0KLSAgICAgICAgICAgIGlmIChudWxsICE9IHdzZGw0aklucHV0TWVzc2FnZSkgewotICAgICAgICAgICAgICAgIEF4aXNNZXNzYWdlIGluTWVzc2FnZSA9IGF4aXNPcGVyYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRNZXNzYWdlKFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9PVVRfVkFMVUUpOwotICAgICAgICAgICAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9IHdzZGw0aklucHV0TWVzc2FnZS5nZXRNZXNzYWdlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKG51bGwgIT0gbWVzc2FnZSkgewotCi0gICAgICAgICAgICAgICAgICAgIGluTWVzc2FnZS5zZXROYW1lKG1lc3NhZ2UuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvcHlFeHRlbnNpb25BdHRyaWJ1dGVzKHdzZGw0aklucHV0TWVzc2FnZS5nZXRFeHRlbnNpb25BdHRyaWJ1dGVzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5NZXNzYWdlLCBQT1JUX1RZUEVfT1BFUkFUSU9OX09VVFBVVCk7Ci0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGFjdGlvbiBpcyBhbHJlYWR5IHNldCBhcyB3ZSBkb24ndCB3YW50IHRvCi0gICAgICAgICAgICAgICAgLy8gb3ZlcnJpZGUgaXQKLSAgICAgICAgICAgICAgICAvLyB3aXRoIHRoZSBEZWZhdWx0IEFjdGlvbiBQYXR0ZXJuCi0gICAgICAgICAgICAgICAgU3RyaW5nIGFjdGlvbiA9IGF4aXNPcGVyYXRpb24uZ2V0T3V0cHV0QWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGFjdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFjdGlvbiA9IFdTREwxMUFjdGlvbkhlbHBlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRBY3Rpb25Gcm9tSW5wdXRFbGVtZW50KGRpZiwgd3NkbDRqUG9ydFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NkbDRqT3BlcmF0aW9uLCB3c2RsNGpJbnB1dE1lc3NhZ2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoYWN0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYXhpc09wZXJhdGlvbi5zZXRPdXRwdXRBY3Rpb24oYWN0aW9uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBDcmVhdGUgYW4gb3V0cHV0IG1lc3NhZ2UgYW5kIGFkZAotICAgICAgICAgICAgT3V0cHV0IHdzZGw0ak91dHB1dE1lc3NhZ2UgPSB3c2RsNGpPcGVyYXRpb24uZ2V0T3V0cHV0KCk7Ci0gICAgICAgICAgICBpZiAobnVsbCAhPSB3c2RsNGpPdXRwdXRNZXNzYWdlKSB7Ci0gICAgICAgICAgICAgICAgQXhpc01lc3NhZ2Ugb3V0TWVzc2FnZSA9IGF4aXNPcGVyYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRNZXNzYWdlKFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9JTl9WQUxVRSk7Ci0gICAgICAgICAgICAgICAgTWVzc2FnZSBtZXNzYWdlID0gd3NkbDRqT3V0cHV0TWVzc2FnZS5nZXRNZXNzYWdlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKG51bGwgIT0gbWVzc2FnZSkgewotCi0gICAgICAgICAgICAgICAgICAgIG91dE1lc3NhZ2Uuc2V0TmFtZShtZXNzYWdlLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICBjb3B5RXh0ZW5zaW9uQXR0cmlidXRlcyh3c2RsNGpJbnB1dE1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQXR0cmlidXRlcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dE1lc3NhZ2UsIFBPUlRfVFlQRV9PUEVSQVRJT05fSU5QVVQpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIHdzZGw6cG9ydFR5cGUgLT4gd3NkbDpvcGVyYXRpb24gLT4gd3NkbDpvdXRwdXQKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGFjdGlvbiBpcyBhbHJlYWR5IHNldCBhcyB3ZSBkb24ndCB3YW50IHRvCi0gICAgICAgICAgICAgICAgLy8gb3ZlcnJpZGUgaXQKLSAgICAgICAgICAgICAgICAvLyB3aXRoIHRoZSBEZWZhdWx0IEFjdGlvbiBQYXR0ZXJuCi0gICAgICAgICAgICAgICAgQXJyYXlMaXN0IGlucHV0QWN0aW9ucyA9IGF4aXNPcGVyYXRpb24uZ2V0V1NBTWFwcGluZ0xpc3QoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgYWN0aW9uID0gbnVsbDsKLSAgICAgICAgICAgICAgICBpZiAoaW5wdXRBY3Rpb25zID09IG51bGwgfHwgaW5wdXRBY3Rpb25zLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFjdGlvbiA9IFdTREwxMUFjdGlvbkhlbHBlci5nZXRBY3Rpb25Gcm9tT3V0cHV0RWxlbWVudChkaWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c2RsNGpQb3J0VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzZGw0ak9wZXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzZGw0ak91dHB1dE1lc3NhZ2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoYWN0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0QWN0aW9ucyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dEFjdGlvbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBheGlzT3BlcmF0aW9uLnNldFdzYW1hcHBpbmdMaXN0KGlucHV0QWN0aW9ucyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaW5wdXRBY3Rpb25zLmFkZChhY3Rpb24pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIE1hcCBmYXVsdHMgPSB3c2RsNGpPcGVyYXRpb24uZ2V0RmF1bHRzKCk7Ci0gICAgICAgIEl0ZXJhdG9yIGZhdWx0S2V5SXRlcmF0b3IgPSBmYXVsdHMua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQotICAgICAgICB3aGlsZSAoZmF1bHRLZXlJdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIEZhdWx0IGZhdWx0ID0gKEZhdWx0KSBmYXVsdHMuZ2V0KGZhdWx0S2V5SXRlcmF0b3IubmV4dCgpKTsKLSAgICAgICAgICAgIEF4aXNNZXNzYWdlIGF4aXNGYXVsdE1lc3NhZ2UgPSBuZXcgQXhpc01lc3NhZ2UoKTsKLSAgICAgICAgICAgIGFkZERvY3VtZW50YXRpb24oYXhpc0ZhdWx0TWVzc2FnZSxmYXVsdC5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpKTsKLSAgICAgICAgICAgIE1lc3NhZ2UgZmF1bHRNZXNzYWdlID0gZmF1bHQuZ2V0TWVzc2FnZSgpOwotICAgICAgICAgICAgaWYgKG51bGwgIT0gZmF1bHRNZXNzYWdlKSB7Ci0gICAgICAgICAgICAgICAgYXhpc0ZhdWx0TWVzc2FnZQotICAgICAgICAgICAgICAgICAgICAgICAgLnNldE5hbWUoZmF1bHRNZXNzYWdlLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpOwotCi0gICAgICAgICAgICAgICAgY29weUV4dGVuc2libGVFbGVtZW50cyhmYXVsdE1lc3NhZ2UuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWYsIGF4aXNGYXVsdE1lc3NhZ2UsIFBPUlRfVFlQRV9PUEVSQVRJT05fRkFVTFQpOwotCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBhY3Rpb24gaXMgYWxyZWFkeSBzZXQgYXMgd2UgZG9uJ3Qgd2FudCB0byBvdmVycmlkZQotICAgICAgICAgICAgLy8gaXQKLSAgICAgICAgICAgIC8vIHdpdGggdGhlIERlZmF1bHQgQWN0aW9uIFBhdHRlcm4KLSAgICAgICAgICAgIFN0cmluZyBhY3Rpb24gPSBheGlzT3BlcmF0aW9uLmdldEZhdWx0QWN0aW9uKGZhdWx0LmdldE5hbWUoKSk7Ci0gICAgICAgICAgICBpZiAoYWN0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBhY3Rpb24gPSBXU0RMMTFBY3Rpb25IZWxwZXIuZ2V0QWN0aW9uRnJvbUZhdWx0RWxlbWVudChkaWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NkbDRqUG9ydFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NkbDRqT3BlcmF0aW9uLCBmYXVsdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoYWN0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBheGlzT3BlcmF0aW9uLmFkZEZhdWx0QWN0aW9uKGZhdWx0LmdldE5hbWUoKSwgYWN0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGF4aXNPcGVyYXRpb24uc2V0RmF1bHRNZXNzYWdlcyhheGlzRmF1bHRNZXNzYWdlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYXhpc09wZXJhdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZW5lcmF0ZXMgYSBsaXN0IG9mIHdyYXBwZXIgc2NoZW1hcwotICAgICAqCi0gICAgICogQHBhcmFtIHdzZGw0akJpbmRpbmcKLSAgICAgKi8KLSAgICBwcml2YXRlIEVsZW1lbnRbXSBnZW5lcmF0ZVdyYXBwZXJTY2hlbWEoTWFwIHNjaGVtYU1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmluZGluZyB3c2RsNGpCaW5kaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3J0VHlwZSBwb3J0VHlwZSkgewotCi0gICAgICAgIExpc3Qgc2NoZW1hRWxlbWVudExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIC8vIHRhcmdldCBuYW1lc3BhY2UgZm9yIHRoaXMgc2hvdWxkIGJlIHRoZSBuYW1lc3BhY2UgVVJJIGZvcgotICAgICAgICAvLyB0aGUgcG9ydHR5cGUKLSAgICAgICAgU3RyaW5nIHBvcnR0eXBlTmFtZXNwYWNlVVJJID0gcG9ydFR5cGUuZ2V0UU5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKTsKLQotICAgICAgICAvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgICAgIC8vIGlmIHRoZXJlIGFyZSBhbnkgYmluZGluZ3MgcHJlc2VudCB0aGVuIHdlIGhhdmUgdG8gcHJvY2VzcyB0aGVtLiB3ZQotICAgICAgICAvLyBoYXZlIHRvIGdlbmVyYXRlIGEgc2NoZW1hIHBlciB3c2RsNGpCaW5kaW5nICh0aGF0IGlzIHRoZSBzYWZlc3QKLSAgICAgICAgLy8gb3B0aW9uKS4KLSAgICAgICAgLy8gaWYgbm90IHdlIGp1c3QgcmVzb2x2ZSB0bwotICAgICAgICAvLyB0aGUgZ29vZCBvbGQgcG9ydCB0eXBlCi0gICAgICAgIC8vIGxpc3QsIGluIHdoaWNoIGNhc2Ugd2UnbGwgZ2VuZXJhdGUgYSBzY2hlbWEgcGVyIHBvcnR0eXBlCi0gICAgICAgIC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgICAgICAvLyBmaW5kd3JhcHBhYmxlIG9wZXJhdGlvbnMgcmV0dXJuIGVpdGhlciB0aGUgcnBjIHNvYXAgb3BlcmF0aW9ucyBvcgotICAgICAgICAvLyBIdHRwIGJpbmRpbmcgb3BlcmF0aW9ucwotCi0gICAgICAgIExpc3Qgd3JhcHBhYmxlQk9FTGlzdCA9IGZpbmRXcmFwcGFibGVCaW5kaW5nT3BlcmF0aW9ucyh3c2RsNGpCaW5kaW5nKTsKLQotICAgICAgICAvLyB0aGlzIG1ldGhvZCByZXR1cm5zIGFsbCB0aGUgbmV3IHNjaGVtYXMgY3JlYXRlZCB3aGVuIHByb2Nlc3NpbmcgdGhlIHJwYyBtZXNzYWdlcwotICAgICAgICBNYXAgbmV3U2NoZW1hTWFwID0gY3JlYXRlU2NoZW1hRm9yUG9ydHR5cGUocG9ydHR5cGVOYW1lc3BhY2VVUkksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGFibGVCT0VMaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hTWFwKTsKLQotICAgICAgICBzY2hlbWFFbGVtZW50TGlzdC5hZGRBbGwobmV3U2NoZW1hTWFwLnZhbHVlcygpKTsKLSAgICAgICAgcmV0dXJuIChFbGVtZW50W10pIHNjaGVtYUVsZW1lbnRMaXN0Ci0gICAgICAgICAgICAgICAgLnRvQXJyYXkobmV3IEVsZW1lbnRbc2NoZW1hRWxlbWVudExpc3Quc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgc2NoZW1hIGJ5IGxvb2tpbmcgYXQgdGhlIHBvcnQgdHlwZQotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWVzcGFjZVVSSSAtIG5hbWVzcGFjZSBvZiB0aGUgcG9ydHR5cGUgdXJpLgotICAgICAqICB3ZSB1c2UgdGhpcyBvbmx5IGlmIGEgdXNlciBoYXMgbm90IHNwZWNpZmllZCBhIG5hbWVzcGFjZSBpbiBzb2FwOmJvZHkKLSAgICAgKiBAcGFyYW0gYm9lTGlzdFRvUHJvY2VzcyAtIExpc3Qgb2YgQmluZGluZ09wZXJhdGlvbkVudHJ5IG9iamVjdHMgd2hpY2ggcmVxdWlyZSB3cmFwcGVyaW5nCi0gICAgICogICAgICAgICAgICAgICAgICAgICAKLSAgICAgKiBAcmV0dXJuIG51bGwgaWYgdGhlcmUgaXMgbm8gZWxlbWVudAotICAgICAqLwotICAgIHByaXZhdGUgTWFwIGNyZWF0ZVNjaGVtYUZvclBvcnR0eXBlKFN0cmluZyBuYW1lc3BhY2VVUkksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdCBib2VMaXN0VG9Qcm9jZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcCBleGlzdGluZ1NjaGVtYU1hcCkgewotCi0gICAgICAgIC8vIHRoaXMgbWFwIGlzIHVzZWQgdG8ga2VlcCB0aGUgbmV3bHkgYWRkZWQgc2NoZW1hcwotICAgICAgICBNYXAgbmV3U2NoZW1hTWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgLy8gZmlyc3Qgb2YgYWxsIGxvb2sgYXQgdGhlIG9wZXJhdGlvbnMgbGlzdAotICAgICAgICAvLyB3ZSBjYW4gcmV0dXJuIGltbWVkaWF0ZWx5IGlmIHdlIGdldCB0aGUgb3BlcmF0aW9ucyBsaXN0Ci0gICAgICAgIC8vIGFzIGVtcHR5Ci0gICAgICAgIGlmIChib2VMaXN0VG9Qcm9jZXNzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgcmV0dXJuIG5ld1NjaGVtYU1hcDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGxvb3AgdGhyb3VnaCB0aGUgbWVzc2FnZXMuIFdlJ2xsIHBvcHVsYXRlIHRoaW5zIG1hcCB3aXRoIHRoZSByZWxldmFudAotICAgICAgICAvLyBtZXNzYWdlcwotICAgICAgICAvLyBmcm9tIHRoZSBvcGVyYXRpb25zCi0gICAgICAgIE1hcCBtZXNzYWdlUW5hbWVUb01lc3NhZ2VNYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICBNYXAgYm9lVG9JbnB1dE1lc3NhZ2VNYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICBNYXAgYm9lVG9PdXRwdXRNZXNzYWdlTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotICAgICAgICAvLyB0aGlzIGNvbnRhaW5zIHRoZSByZXF1aXJlZCBuYW1lc3BhY2UgaW1wb3J0cy4gdGhlIGtleSBpbiB0aGlzCi0gICAgICAgIC8vIG1hcCB3b3VsZCBiZSB0aGUgbmFtYXNwYWNlIFVSSQotICAgICAgICBNYXAgbmFtZXNwYWNlSW1wb3J0c01hcCA9IG51bGw7Ci0gICAgICAgIC8vIGxpc3QgbmFtZXNwYWNlIHByZWZpeCBtYXAuIFRoaXMgbWFwIHdpbGwgaW5jbHVkZSB1cmkgLT4gcHJlZml4Ci0gICAgICAgIE1hcCBuYW1lc3BhY2VQcmVmaXhNYXAgPSBudWxsOwotCi0gICAgICAgIC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgICAgIC8vIEZpcnN0IHRoaW5nIGlzIHRvIHBvcHVsYXRlIHRoZSBtZXNzYWdlIG1hcCB3aXRoIHRoZSBtZXNzYWdlcyB0bwotICAgICAgICAvLyBwcm9jZXNzLgotICAgICAgICAvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0gICAgICAgIC8vIHdlIHJlYWxseSBuZWVkIHRvIGRvIHRoaXMgZm9yIGEgc2luZ2xlIHBvcnR0eXBlIQotICAgICAgICBCaW5kaW5nT3BlcmF0aW9uRW50cnkgYm9lOwotICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IGJvZUxpc3RUb1Byb2Nlc3Muc2l6ZSgpOyBrKyspIHsKLSAgICAgICAgICAgIGJvZSA9IChCaW5kaW5nT3BlcmF0aW9uRW50cnkpIGJvZUxpc3RUb1Byb2Nlc3MuZ2V0KGspOwotICAgICAgICAgICAgSW5wdXQgaW5wdXQgPSBib2UuZ2V0QmluZGluZ09wZXJhdGlvbigpLmdldE9wZXJhdGlvbigpLmdldElucHV0KCk7Ci0gICAgICAgICAgICBNZXNzYWdlIG1lc3NhZ2U7Ci0gICAgICAgICAgICBpZiAoaW5wdXQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBpbnB1dC5nZXRNZXNzYWdlKCk7Ci0gICAgICAgICAgICAgICAgbWVzc2FnZVFuYW1lVG9NZXNzYWdlTWFwLnB1dChtZXNzYWdlLmdldFFOYW1lKCksIG1lc3NhZ2UpOwotICAgICAgICAgICAgICAgIGJvZVRvSW5wdXRNZXNzYWdlTWFwLnB1dChib2UsIG1lc3NhZ2UpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBPdXRwdXQgb3V0cHV0ID0gYm9lLmdldEJpbmRpbmdPcGVyYXRpb24oKS5nZXRPcGVyYXRpb24oKS5nZXRPdXRwdXQoKTsKLSAgICAgICAgICAgIGlmIChvdXRwdXQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBvdXRwdXQuZ2V0TWVzc2FnZSgpOwotICAgICAgICAgICAgICAgIG1lc3NhZ2VRbmFtZVRvTWVzc2FnZU1hcC5wdXQobWVzc2FnZS5nZXRRTmFtZSgpLCBtZXNzYWdlKTsKLSAgICAgICAgICAgICAgICBib2VUb091dHB1dE1lc3NhZ2VNYXAucHV0KGJvZSwgbWVzc2FnZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHdlIGRvIG5vdCB3YW50IHRvIHByb2Nlc3MgZmF1bHQgbWVzc2FnZXMgc2luY2UgdGhleSBjYW4gb25seSBiZSB1c2VkIGFzIGRvY3VtZW50IHR5cGUKLSAgICAgICAgICAgIC8vIHNlZSBiYXNpYyBwcm9maWxlIDQuNC4yCi0gICAgICAgIH0KLQotICAgICAgICAvLyBmaW5kIHRoZSB4c2QgcHJlZml4Ci0gICAgICAgIFN0cmluZyB4c2RQcmVmaXggPSBmaW5kU2NoZW1hUHJlZml4KCk7Ci0gICAgICAgIC8vIERPTSBkb2N1bWVudCB0aGF0IHdpbGwgYmUgdGhlIHVsdGltYXRlIGNyZWF0b3IKLSAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBnZXRET01Eb2N1bWVudEJ1aWxkZXIoKS5uZXdEb2N1bWVudCgpOwotCi0gICAgICAgIEVsZW1lbnQgZWxlbWVudERlY2xhcmF0aW9uOwotCi0gICAgICAgIC8vbG9vcCB0aHJvdWdoIHRoZSBpbnB1dCBvcCBtYXAgYW5kIGdlbmVyYXRlIHRoZSBlbGVtZW50cwotICAgICAgICBCaW5kaW5nT3BlcmF0aW9uRW50cnkgYm9FbnRyeTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBib2VJdGVyID0gYm9lVG9JbnB1dE1lc3NhZ2VNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICBib2VJdGVyLmhhc05leHQoKTspIHsKLQotICAgICAgICAgICAgYm9FbnRyeSA9IChCaW5kaW5nT3BlcmF0aW9uRW50cnkpIGJvZUl0ZXIubmV4dCgpOwotICAgICAgICAgICAgZWxlbWVudERlY2xhcmF0aW9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKAotICAgICAgICAgICAgICAgICAgICBYTUxTQ0hFTUFfTkFNRVNQQUNFX1VSSSwgeHNkUHJlZml4ICsgIjoiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIFhNTF9TQ0hFTUFfRUxFTUVOVF9MT0NBTF9OQU1FKTsKLSAgICAgICAgICAgIGVsZW1lbnREZWNsYXJhdGlvbi5zZXRBdHRyaWJ1dGUoWFNEX05BTUUsIGJvRW50cnkuZ2V0QmluZGluZ09wZXJhdGlvbigpLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgICAgIC8vd2hlbiBjcmVhdGluZyB0aGUgaW5uZXIgY29tcGxleCB0eXBlIHdlIGhhdmUgdG8gZmluZCB0aGUgcGFydHMgbGlzdCBmcm9tIHRoZSBiaW5kaW5nIGlucHV0Ci0gICAgICAgICAgICBCaW5kaW5nSW5wdXQgYmluZGluZ0lucHV0ID0gYm9FbnRyeS5nZXRCaW5kaW5nT3BlcmF0aW9uKCkuZ2V0QmluZGluZ0lucHV0KCk7Ci0gICAgICAgICAgICBNZXNzYWdlIG1lc3NhZ2UgPSAoTWVzc2FnZSkgYm9lVG9JbnB1dE1lc3NhZ2VNYXAuZ2V0KGJvRW50cnkpOwotCi0gICAgICAgICAgICBpZiAoYmluZGluZ0lucHV0ICE9IG51bGwpIHsKLQotICAgICAgICAgICAgICAgIENvbGxlY3Rpb24gcGFydHNDb2xsZWN0aW9uID0gbnVsbDsKLSAgICAgICAgICAgICAgICBpZiAoQklORElOR19UWVBFX1NPQVAuZXF1YWxzKHRoaXMuYmluZGluZ1R5cGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGZpcnN0IHNlZSB0aGUgYm9keSBwYXJ0cyBsaXN0Ci0gICAgICAgICAgICAgICAgICAgIExpc3QgYm9keVBhcnRzTGlzdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBnZXRQYXJ0c0xpc3RGcm9tU29hcEJvZHkoYmluZGluZ0lucHV0LmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpKTsKLSAgICAgICAgICAgICAgICAgICAgcGFydHNDb2xsZWN0aW9uID0gbWVzc2FnZS5nZXRPcmRlcmVkUGFydHMoYm9keVBhcnRzTGlzdCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaS5lIGh0dHAgYmluZGluZwotICAgICAgICAgICAgICAgICAgICBwYXJ0c0NvbGxlY3Rpb24gPSBtZXNzYWdlLmdldFBhcnRzKCkudmFsdWVzKCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgTGlzdCBwYXJhbWV0ZXJPcmRlciA9IAotICAgICAgICAgICAgICAgICAgIGJvRW50cnkuZ2V0QmluZGluZ09wZXJhdGlvbigpLmdldE9wZXJhdGlvbigpLmdldFBhcmFtZXRlck9yZGVyaW5nKCk7Ci0gICAgICAgICAgICAgICAgbmFtZXNwYWNlSW1wb3J0c01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgICAgICAgICAgbmFtZXNwYWNlUHJlZml4TWFwID0gbmV3IEhhc2hNYXAoKTsKLQotICAgICAgICAgICAgICAgIE5vZGUgbmV3Q29tcGxleFR5cGUgPSBnZXROZXdDb21wbGV4dFR5cGUoZG9jdW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4c2RQcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0c0NvbGxlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJPcmRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlSW1wb3J0c01hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVByZWZpeE1hcCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib0VudHJ5KTsKLQotICAgICAgICAgICAgICAgIGVsZW1lbnREZWNsYXJhdGlvbi5hcHBlbmRDaGlsZChuZXdDb21wbGV4VHlwZSk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG5hbWVzcGFjZVRvVXNlID0gbmFtZXNwYWNlVVJJOwotCi0gICAgICAgICAgICAgICAgaWYgKEJJTkRJTkdfVFlQRV9TT0FQLmVxdWFscyh0aGlzLmJpbmRpbmdUeXBlKSkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYm9keU5hbWVzcGFjZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TmFtZXNwYWNlRnJvbVNvYXBCb2R5KGJpbmRpbmdJbnB1dC5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSk7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVRvVXNlID0gYm9keU5hbWVzcGFjZSAhPSBudWxsID8gYm9keU5hbWVzcGFjZSA6IG5hbWVzcGFjZVVSSTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmdTY2hlbWFNYXAuY29udGFpbnNLZXkobmFtZXNwYWNlVG9Vc2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGkuZSB0aGlzIG5hbWVzcGFjZSBpcyBhbHJlYWR5IGV4aXN0cyB3aXRoIHRoZSBvcmlnaW5hbCB3c2RsIHNjaGVtYXMKLSAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudFRvQW5FeGlzdGluZ1NjaGVtYSgoRWxlbWVudCkgZXhpc3RpbmdTY2hlbWFNYXAuZ2V0KG5hbWVzcGFjZVRvVXNlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50RGVjbGFyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlUHJlZml4TWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZUltcG9ydHNNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlVG9Vc2UpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobmV3U2NoZW1hTWFwLmNvbnRhaW5zS2V5KG5hbWVzcGFjZVRvVXNlKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBpLmUgdGhpcyBuYW1lc3BhY2UgaXMgd2l0aCBhIG5ld2x5IGNyZWF0ZWQgc2NoZW1hCi0gICAgICAgICAgICAgICAgICAgIGFkZEVsZW1lbnRUb0FuRXhpc3RpbmdTY2hlbWEoKEVsZW1lbnQpIG5ld1NjaGVtYU1hcC5nZXQobmFtZXNwYWNlVG9Vc2UpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnREZWNsYXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VQcmVmaXhNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlSW1wb3J0c01hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VUb1VzZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaS5lIHRoaXMgZWxlbWVudCBuYW1lc3BhY2UgaGFzIG5vdCBmb3VuZCB5ZXQgc28KLSAgICAgICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBjcmVhdGUgbmV3IHNjaGVtYSBmb3IgaXQKLSAgICAgICAgICAgICAgICAgICAgRWxlbWVudCBuZXdTY2hlbWEgPSBjcmVhdGVOZXdTY2hlbWFXaXRoRWxlbWVudChlbGVtZW50RGVjbGFyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlUHJlZml4TWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZUltcG9ydHNNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlVG9Vc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeHNkUHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgbmV3U2NoZW1hTWFwLnB1dChuYW1lc3BhY2VUb1VzZSwgbmV3U2NoZW1hKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmVzb2x2ZWRScGNXcmFwcGVkRWxlbWVudE1hcC5wdXQoYm9FbnRyeS5nZXRCaW5kaW5nT3BlcmF0aW9uKCkuZ2V0TmFtZSgpLCBuZXcgUU5hbWUoCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VUb1VzZSwgYm9FbnRyeS5nZXRCaW5kaW5nT3BlcmF0aW9uKCkuZ2V0TmFtZSgpLCBBWElTMldSQVBQRUQpKTsKLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV1NETFByb2Nlc3NpbmdFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAiTm8gYmluZGluZyBpbnB1dCBpcyBkZWZpZW5kIGZvciBiaW5kaW5nIG9wZXJhdGlvbiA9PT4gIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBib0VudHJ5LmdldEJpbmRpbmdPcGVyYXRpb24oKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotICAgICAgICAvLyBsb29wIHRocm91Z2ggdGhlIG91dHB1dCB0byBtYXAgYW5kIGdlbmVyYXRlIHRoZSBlbGVtZW50cwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGJvZUl0ZXJhdG9yID0gYm9lVG9PdXRwdXRNZXNzYWdlTWFwLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgYm9lSXRlcmF0b3IuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgYm9FbnRyeSA9IChCaW5kaW5nT3BlcmF0aW9uRW50cnkpIGJvZUl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgIFN0cmluZyBiYXNlb3V0cHV0T3BOYW1lID0gYm9FbnRyeS5nZXRCaW5kaW5nT3BlcmF0aW9uKCkuZ2V0TmFtZSgpOwotICAgICAgICAgICAgLy8gc2VlIGJhc2ljIHByb2ZpbGUgNC43LjE5Ci0gICAgICAgICAgICBTdHJpbmcgb3V0cHV0T3BOYW1lID0gYmFzZW91dHB1dE9wTmFtZSArIFdSQVBQRURfT1VUUFVUTkFNRV9TVUZGSVg7Ci0gICAgICAgICAgICBlbGVtZW50RGVjbGFyYXRpb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoCi0gICAgICAgICAgICAgICAgICAgIFhNTFNDSEVNQV9OQU1FU1BBQ0VfVVJJLCB4c2RQcmVmaXggKyAiOiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgWE1MX1NDSEVNQV9FTEVNRU5UX0xPQ0FMX05BTUUpOwotICAgICAgICAgICAgZWxlbWVudERlY2xhcmF0aW9uLnNldEF0dHJpYnV0ZShYU0RfTkFNRSwgb3V0cHV0T3BOYW1lKTsKLQotICAgICAgICAgICAgQmluZGluZ091dHB1dCBiaW5kaW5nT3V0cHV0ID0gYm9FbnRyeS5nZXRCaW5kaW5nT3BlcmF0aW9uKCkuZ2V0QmluZGluZ091dHB1dCgpOwotICAgICAgICAgICAgTWVzc2FnZSBtZXNzYWdlID0gKE1lc3NhZ2UpIGJvZVRvT3V0cHV0TWVzc2FnZU1hcC5nZXQoYm9FbnRyeSk7Ci0KLSAgICAgICAgICAgIGlmIChiaW5kaW5nT3V0cHV0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBDb2xsZWN0aW9uIHBhcnRzQ29sbGVjdGlvbiA9IG51bGw7Ci0gICAgICAgICAgICAgICAgaWYgKEJJTkRJTkdfVFlQRV9TT0FQLmVxdWFscyh0aGlzLmJpbmRpbmdUeXBlKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBmaXJzdCBzZWUgdGhlIGJvZHkgcGFydHMgbGlzdAotICAgICAgICAgICAgICAgICAgICBMaXN0IGJvZHlQYXJ0c0xpc3QgPQotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UGFydHNMaXN0RnJvbVNvYXBCb2R5KGJpbmRpbmdPdXRwdXQuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkpOwotICAgICAgICAgICAgICAgICAgICBwYXJ0c0NvbGxlY3Rpb24gPSBtZXNzYWdlLmdldE9yZGVyZWRQYXJ0cyhib2R5UGFydHNMaXN0KTsKLQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGkuZSBpZiBodHRwIGJpbmRpbmcKLSAgICAgICAgICAgICAgICAgICAgcGFydHNDb2xsZWN0aW9uID0gbWVzc2FnZS5nZXRQYXJ0cygpLnZhbHVlcygpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIExpc3QgcGFyYW1ldGVyT3JkZXIgPSAKLSAgICAgICAgICAgICAgICAgICAgYm9FbnRyeS5nZXRCaW5kaW5nT3BlcmF0aW9uKCkuZ2V0T3BlcmF0aW9uKCkuZ2V0UGFyYW1ldGVyT3JkZXJpbmcoKTsKLQotICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gaW5pdGlhbGl6ZSB0aGUgaGFzaCBtYXBzIGFsd2F5cyBzaW5jZSB3ZSBhZGQgdGhlIGVsZW1lbnRzIG9uZWNlIHdlCi0gICAgICAgICAgICAgICAgLy8gZ2VuZXJhdGUgaXQKLSAgICAgICAgICAgICAgICBuYW1lc3BhY2VQcmVmaXhNYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICAgICAgICAgIG5hbWVzcGFjZUltcG9ydHNNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgICAgICAgICAgICAgTm9kZSBuZXdDb21wbGV4VHlwZSA9IGdldE5ld0NvbXBsZXh0VHlwZShkb2N1bWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhzZFByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRzQ29sbGVjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlck9yZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZUltcG9ydHNNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VQcmVmaXhNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib0VudHJ5KTsKLSAgICAgICAgICAgICAgICBlbGVtZW50RGVjbGFyYXRpb24uYXBwZW5kQ2hpbGQobmV3Q29tcGxleFR5cGUpOwotCi0gICAgICAgICAgICAgICAgU3RyaW5nIG5hbWVzcGFjZVRvVXNlID0gbmFtZXNwYWNlVVJJOwotCi0gICAgICAgICAgICAgICAgaWYgKEJJTkRJTkdfVFlQRV9TT0FQLmVxdWFscyh0aGlzLmJpbmRpbmdUeXBlKSkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYm9keU5hbWVzcGFjZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TmFtZXNwYWNlRnJvbVNvYXBCb2R5KGJpbmRpbmdPdXRwdXQuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkpOwotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VUb1VzZSA9IGJvZHlOYW1lc3BhY2UgIT0gbnVsbCA/IGJvZHlOYW1lc3BhY2UgOiBuYW1lc3BhY2VVUkk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nU2NoZW1hTWFwLmNvbnRhaW5zS2V5KG5hbWVzcGFjZVRvVXNlKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBpLmUgdGhpcyBuYW1lc3BhY2UgaXMgYWxyZWFkeSBleGlzdHMgd2l0aCB0aGUgb3JpZ2luYWwgd3NkbCBzY2hlbWFzCi0gICAgICAgICAgICAgICAgICAgIGFkZEVsZW1lbnRUb0FuRXhpc3RpbmdTY2hlbWEoKEVsZW1lbnQpIGV4aXN0aW5nU2NoZW1hTWFwLmdldChuYW1lc3BhY2VUb1VzZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudERlY2xhcmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVByZWZpeE1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VJbXBvcnRzTWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVRvVXNlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5ld1NjaGVtYU1hcC5jb250YWluc0tleShuYW1lc3BhY2VUb1VzZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaS5lIHRoaXMgbmFtZXNwYWNlIGlzIHdpdGggYSBuZXdseSBjcmVhdGVkIHNjaGVtYQotICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50VG9BbkV4aXN0aW5nU2NoZW1hKChFbGVtZW50KSBuZXdTY2hlbWFNYXAuZ2V0KG5hbWVzcGFjZVRvVXNlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50RGVjbGFyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlUHJlZml4TWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZUltcG9ydHNNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlVG9Vc2UpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGkuZSB0aGlzIGVsZW1lbnQgbmFtZXNwYWNlIGhhcyBub3QgZm91bmQgeWV0IHNvCi0gICAgICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gY3JlYXRlIG5ldyBzY2hlbWEgZm9yIGl0Ci0gICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgbmV3U2NoZW1hID0gY3JlYXRlTmV3U2NoZW1hV2l0aEVsZW1lbnQoZWxlbWVudERlY2xhcmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVByZWZpeE1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VJbXBvcnRzTWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVRvVXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhzZFByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgIG5ld1NjaGVtYU1hcC5wdXQobmFtZXNwYWNlVG9Vc2UsIG5ld1NjaGVtYSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJlc29sdmVkUnBjV3JhcHBlZEVsZW1lbnRNYXAucHV0KG91dHB1dE9wTmFtZSwgbmV3IFFOYW1lKAotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlVG9Vc2UsIG91dHB1dE9wTmFtZSwgQVhJUzJXUkFQUEVEKSk7Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFdTRExQcm9jZXNzaW5nRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgIk5vIGJpbmRpbmcgb3V0IHB1dCBpcyBkZWZpbmVkIGZvciBiaW5kaW5nIG9wZXJhdGlvbiA9PT4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvRW50cnkuZ2V0QmluZGluZ09wZXJhdGlvbigpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbmV3U2NoZW1hTWFwOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGRFbGVtZW50VG9BbkV4aXN0aW5nU2NoZW1hKEVsZW1lbnQgc2NoZW1hRWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50IG5ld0VsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwIG5hbWVzcGFjZVByZWZpeE1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXAgbmFtZXNwYWNlSW1wb3J0c01hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlKSB7Ci0KLSAgICAgICAgRG9jdW1lbnQgb3duZXJEb2N1bWVudCA9IHNjaGVtYUVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpOwotCi0gICAgICAgIC8vIGxvb3AgdGhyb3VnaCB0aGUgbmFtZXNwYWNlIGRlY2xhcmF0aW9ucyBmaXJzdCBhbmQgYWRkIHRoZW0KLSAgICAgICAgU3RyaW5nW10gbmFtZVNwYWNlRGVjbGFyYXRpb25BcnJheSA9IChTdHJpbmdbXSkgbmFtZXNwYWNlUHJlZml4TWFwCi0gICAgICAgICAgICAgICAgLmtleVNldCgpLnRvQXJyYXkobmV3IFN0cmluZ1tuYW1lc3BhY2VQcmVmaXhNYXAuc2l6ZSgpXSk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmFtZVNwYWNlRGVjbGFyYXRpb25BcnJheS5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgU3RyaW5nIHMgPSBuYW1lU3BhY2VEZWNsYXJhdGlvbkFycmF5W2ldOwotICAgICAgICAgICAgY2hlY2tBbmRBZGROYW1lc3BhY2VEZWNsYXJhdGlvbnMocywgbmFtZXNwYWNlUHJlZml4TWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hRWxlbWVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBhZGQgaW1wb3J0cyAtIGNoZWNrIHdoZXRoZXIgaXQgaXMgdGhlIHRhcmdldG5hbWVzcGFjZSBiZWZvcmUKLSAgICAgICAgLy8gYWRkaW5nCi0gICAgICAgIEVsZW1lbnRbXSBuYW1lc3BhY2VJbXBvcnRzID0gKEVsZW1lbnRbXSkgbmFtZXNwYWNlSW1wb3J0c01hcAotICAgICAgICAgICAgICAgIC52YWx1ZXMoKS50b0FycmF5KG5ldyBFbGVtZW50W25hbWVzcGFjZUltcG9ydHNNYXAuc2l6ZSgpXSk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmFtZXNwYWNlSW1wb3J0cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKCF0YXJnZXROYW1lc3BhY2UuZXF1YWxzKG5hbWVzcGFjZUltcG9ydHNbaV0KLSAgICAgICAgICAgICAgICAgICAgLmdldEF0dHJpYnV0ZShOQU1FU1BBQ0VfVVJJKSkpIHsKLSAgICAgICAgICAgICAgICBzY2hlbWFFbGVtZW50LmFwcGVuZENoaWxkKG93bmVyRG9jdW1lbnQuaW1wb3J0Tm9kZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZUltcG9ydHNbaV0sIHRydWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHNjaGVtYUVsZW1lbnQuYXBwZW5kQ2hpbGQob3duZXJEb2N1bWVudC5pbXBvcnROb2RlKG5ld0VsZW1lbnQsIHRydWUpKTsKLQotICAgIH0KLQotICAgIHByaXZhdGUgRWxlbWVudCBjcmVhdGVOZXdTY2hlbWFXaXRoRWxlbWVudChFbGVtZW50IG5ld0VsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcCBuYW1lc3BhY2VQcmVmaXhNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcCBuYW1lc3BhY2VJbXBvcnRzTWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEb2N1bWVudCBkb2N1bWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHhzZFByZWZpeCkgewotCi0gICAgICAgIEVsZW1lbnQgc2NoZW1hRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygKLSAgICAgICAgICAgICAgICBYTUxTQ0hFTUFfTkFNRVNQQUNFX1VSSSwgeHNkUHJlZml4ICsgIjoiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgWE1MX1NDSEVNQV9MT0NBTF9OQU1FKTsKLQotICAgICAgICAvLyBsb29wIHRocm91Z2ggdGhlIG5hbWVzcGFjZSBkZWNsYXJhdGlvbnMgZmlyc3QKLSAgICAgICAgU3RyaW5nW10gbmFtZVNwYWNlRGVjbGFyYXRpb25BcnJheSA9IChTdHJpbmdbXSkgbmFtZXNwYWNlUHJlZml4TWFwCi0gICAgICAgICAgICAgICAgLmtleVNldCgpLnRvQXJyYXkobmV3IFN0cmluZ1tuYW1lc3BhY2VQcmVmaXhNYXAuc2l6ZSgpXSk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmFtZVNwYWNlRGVjbGFyYXRpb25BcnJheS5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgU3RyaW5nIHMgPSBuYW1lU3BhY2VEZWNsYXJhdGlvbkFycmF5W2ldOwotICAgICAgICAgICAgc2NoZW1hRWxlbWVudC5zZXRBdHRyaWJ1dGVOUyhYTUxfTkFNRVNQQUNFX1VSSSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkFNRVNQQUNFX0RFQ0xBUkFUSU9OX1BSRUZJWAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG5hbWVzcGFjZVByZWZpeE1hcC5nZXQocykudG9TdHJpbmcoKSwgcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc2NoZW1hRWxlbWVudC5nZXRBdHRyaWJ1dGVOUyhYTUxfTkFNRVNQQUNFX1VSSSwgeHNkUHJlZml4KS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICBzY2hlbWFFbGVtZW50LnNldEF0dHJpYnV0ZU5TKFhNTF9OQU1FU1BBQ0VfVVJJLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQU1FU1BBQ0VfREVDTEFSQVRJT05fUFJFRklYICsgeHNkUHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxTQ0hFTUFfTkFNRVNQQUNFX1VSSSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBhZGQgdGhlIHRhcmdldE5hbWVzcGFjZQotICAgICAgICBzY2hlbWFFbGVtZW50LnNldEF0dHJpYnV0ZU5TKFhNTF9OQU1FU1BBQ0VfVVJJLCBYTUxOU19BWElTMldSQVBQRUQsIHRhcmdldE5hbWVzcGFjZSk7Ci0gICAgICAgIHNjaGVtYUVsZW1lbnQuc2V0QXR0cmlidXRlKFhTRF9UQVJHRVROQU1FU1BBQ0UsIHRhcmdldE5hbWVzcGFjZSk7Ci0gICAgICAgIHNjaGVtYUVsZW1lbnQuc2V0QXR0cmlidXRlKFhTRF9FTEVNRU5UX0ZPUk1fREVGQVVMVCwgWFNEX1VOUVVBTElGSUVEKTsKLQotICAgICAgICAvLyBhZGQgaW1wb3J0cwotICAgICAgICBFbGVtZW50W10gbmFtZXNwYWNlSW1wb3J0cyA9IChFbGVtZW50W10pIG5hbWVzcGFjZUltcG9ydHNNYXAKLSAgICAgICAgICAgICAgICAudmFsdWVzKCkudG9BcnJheShuZXcgRWxlbWVudFtuYW1lc3BhY2VJbXBvcnRzTWFwLnNpemUoKV0pOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5hbWVzcGFjZUltcG9ydHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIHNjaGVtYUVsZW1lbnQuYXBwZW5kQ2hpbGQobmFtZXNwYWNlSW1wb3J0c1tpXSk7Ci0KLSAgICAgICAgfQotCi0gICAgICAgIHNjaGVtYUVsZW1lbnQuYXBwZW5kQ2hpbGQobmV3RWxlbWVudCk7Ci0gICAgICAgIHJldHVybiBzY2hlbWFFbGVtZW50OwotICAgIH0KLQotICAgIHByaXZhdGUgTGlzdCBnZXRQYXJ0c0xpc3RGcm9tU29hcEJvZHkoTGlzdCBleHRlbnNpYmlsaXR5RWxlbWVudHMpIHsKLSAgICAgICAgTGlzdCBwYXJ0c0xpc3QgPSBudWxsOwotICAgICAgICBFeHRlbnNpYmlsaXR5RWxlbWVudCBleHRFbGVtZW50OwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBleHRlbnNpYmlsaXR5RWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZXh0RWxlbWVudCA9IChFeHRlbnNpYmlsaXR5RWxlbWVudCkgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiRXh0ZW5zaWJpbGl0eSBFbGVtZW50IHR5cGUgaXM6IiArIGV4dEVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSk7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJFeHRlbnNpYmlsaXR5IEVsZW1lbnQgY2xhc3MgaXM6IiArIGV4dEVsZW1lbnQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gU09BUCAxLjEgYm9keSBlbGVtZW50IGZvdW5kIQotICAgICAgICAgICAgaWYgKGV4dEVsZW1lbnQgaW5zdGFuY2VvZiBTT0FQQm9keSkgewotICAgICAgICAgICAgICAgIFNPQVBCb2R5IHNvYXBCb2R5ID0gKFNPQVBCb2R5KSBleHRFbGVtZW50OwotICAgICAgICAgICAgICAgIHBhcnRzTGlzdCA9IHNvYXBCb2R5LmdldFBhcnRzKCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGV4dEVsZW1lbnQgaW5zdGFuY2VvZiBTT0FQMTJCb2R5KSB7Ci0gICAgICAgICAgICAgICAgU09BUDEyQm9keSBzb2FwQm9keSA9IChTT0FQMTJCb2R5KSBleHRFbGVtZW50OwotICAgICAgICAgICAgICAgIHBhcnRzTGlzdCA9IHNvYXBCb2R5LmdldFBhcnRzKCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGV4dEVsZW1lbnQgaW5zdGFuY2VvZiBNSU1FTXVsdGlwYXJ0UmVsYXRlZCkgewotICAgICAgICAgICAgICAgIE1JTUVNdWx0aXBhcnRSZWxhdGVkIG1pbk1pbWVNdWx0aXBhcnRSZWxhdGVkID0gKE1JTUVNdWx0aXBhcnRSZWxhdGVkKSBleHRFbGVtZW50OwotICAgICAgICAgICAgICAgIExpc3QgbWltZVBhcnRzTGlzdCA9IG1pbk1pbWVNdWx0aXBhcnRSZWxhdGVkLmdldE1JTUVQYXJ0cygpOwotICAgICAgICAgICAgICAgIE1JTUVQYXJ0IG1pbWVQYXJ0ID0gbnVsbDsKLSAgICAgICAgICAgICAgICBPYmplY3Qgb2JqZWN0OwotICAgICAgICAgICAgICAgIExpc3QgbWltZVBhcnRFbGVtZW50czsKLSAgICAgICAgICAgICAgICBFeHRlbnNpYmlsaXR5RWxlbWVudCBtaW1lUGFydEV4dGVuc2liaWxpdHlFbGVtZW50OwotICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgbWltZVBhcnRzSXRlciA9IG1pbWVQYXJ0c0xpc3QuaXRlcmF0b3IoKTsgbWltZVBhcnRzSXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgICAgIG9iamVjdCA9IG1pbWVQYXJ0c0l0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgTUlNRVBhcnQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbWVQYXJ0ID0gKE1JTUVQYXJ0KSBvYmplY3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtaW1lUGFydEVsZW1lbnRzID0gbWltZVBhcnQuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIG1pbWVQYXJ0RWxlbWVudHNJdGVyID0gbWltZVBhcnRFbGVtZW50cy5pdGVyYXRvcigpOyBtaW1lUGFydEVsZW1lbnRzSXRlci5oYXNOZXh0KCk7KQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbWVQYXJ0RXh0ZW5zaWJpbGl0eUVsZW1lbnQgPSAoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpIG1pbWVQYXJ0RWxlbWVudHNJdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWltZVBhcnRFeHRlbnNpYmlsaXR5RWxlbWVudCBpbnN0YW5jZW9mIFNPQVBCb2R5KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPQVBCb2R5IHNvYXBCb2R5ID0gKFNPQVBCb2R5KSBtaW1lUGFydEV4dGVuc2liaWxpdHlFbGVtZW50OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0c0xpc3QgPSBzb2FwQm9keS5nZXRQYXJ0cygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobWltZVBhcnRFeHRlbnNpYmlsaXR5RWxlbWVudCBpbnN0YW5jZW9mIFNPQVAxMkJvZHkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09BUDEyQm9keSBzb2FwQm9keSA9IChTT0FQMTJCb2R5KSBtaW1lUGFydEV4dGVuc2liaWxpdHlFbGVtZW50OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0c0xpc3QgPSBzb2FwQm9keS5nZXRQYXJ0cygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gCi0gICAgICAgIH0KLSAgICAgICAgaWYgKHBhcnRzTGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIlNPQVAgYm9keSBwYXJ0cyBoYXZlIG5vdCBiZWVuIHNldC4gQWxsIHRoZSBwYXJ0cyBpbiB0aGUgbWVzc2FnZSB3ZXJlIGFkZGVkIHRvIHRoZSBtZXNzYWdlLiIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwYXJ0c0xpc3Q7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0TmFtZXNwYWNlRnJvbVNvYXBCb2R5KExpc3QgZXh0ZW5zaWJpbGl0eUVsZW1lbnRzKSB7Ci0KLSAgICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZXh0RWxlbWVudDsKLSAgICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9IG51bGw7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGV4dGVuc2liaWxpdHlFbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIGV4dEVsZW1lbnQgPSAoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgLy8gU09BUCAxLjEgYm9keSBlbGVtZW50IGZvdW5kIQotICAgICAgICAgICAgaWYgKGV4dEVsZW1lbnQgaW5zdGFuY2VvZiBTT0FQQm9keSkgewotICAgICAgICAgICAgICAgIFNPQVBCb2R5IHNvYXBCb2R5ID0gKFNPQVBCb2R5KSBleHRFbGVtZW50OwotICAgICAgICAgICAgICAgIG5hbWVzcGFjZSA9IHNvYXBCb2R5LmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChleHRFbGVtZW50IGluc3RhbmNlb2YgU09BUDEyQm9keSkgewotICAgICAgICAgICAgICAgIFNPQVAxMkJvZHkgc29hcEJvZHkgPSAoU09BUDEyQm9keSkgZXh0RWxlbWVudDsKLSAgICAgICAgICAgICAgICBuYW1lc3BhY2UgPSBzb2FwQm9keS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmFtZXNwYWNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGNyZWF0ZXMgYSBuZXcgc2hlbWEgY29tcGxleCBlbGVtZW50IGFjY29yZGluZyB0byB0aGUgZWxlbWVudHMgc2VxdWVuY2UgZGlmaW5lZAotICAgICAqIHRoaXMgcGFydHMgbGlzdCBpcyBhbHdheXMgZm9yIGEgbWVzc2FnZSByZWZlcmluZyBmcm9tIHRoZQotICAgICAqIHNvYXAgcnBjIHR5cGUgb3BlcmF0aW9uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZG9jdW1lbnQKLSAgICAgKiBAcGFyYW0geHNkUHJlZml4Ci0gICAgICogQHBhcmFtIHBhcnRzQ29sbGVjdGlvbiAgICAgLSBwYXJ0cyB0byBiZSBhZGRlZAotICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJPcmRlciAgICAgIC0gcGFyYW0gT3JkZXIgbGlzdCBpZiBpdCBpcyBnaXZlbgotICAgICAqIEBwYXJhbSBpc091dE1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gbmFtZXNwYWNlSW1wb3J0c01hcAotICAgICAqIEBwYXJhbSBuYW1lc3BhY2VQcmVmaXhNYXAKLSAgICAgKiBAcGFyYW0gYm9lIEJpbmRpbmdPcGVyYXRpb25FbnRyeSBmb3IgdGhpcyBwYXJ0Q29sbGVjdGlvbgotICAgICAqIEByZXR1cm4gbmV3IGVsZW1lbnQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVsZW1lbnQgZ2V0TmV3Q29tcGxleHRUeXBlKERvY3VtZW50IGRvY3VtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHhzZFByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb24gcGFydHNDb2xsZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdCBwYXJhbWV0ZXJPcmRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNPdXRNZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwIG5hbWVzcGFjZUltcG9ydHNNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXAgbmFtZXNwYWNlUHJlZml4TWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmluZGluZ09wZXJhdGlvbkVudHJ5IGJvZSkgewotICAgICAgICAvLyBhZGQgdGhlIGNvbXBsZXggdHlwZQotICAgICAgICBFbGVtZW50IG5ld0NvbXBsZXhUeXBlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKAotICAgICAgICAgICAgICAgIFhNTFNDSEVNQV9OQU1FU1BBQ0VfVVJJLCB4c2RQcmVmaXggKyAiOiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBYTUxfU0NIRU1BX0NPTVBMRVhfVFlQRV9MT0NBTF9OQU1FKTsKLQotICAgICAgICBFbGVtZW50IGNtcGx4VHlwZVNlcXVlbmNlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKAotICAgICAgICAgICAgICAgIFhNTFNDSEVNQV9OQU1FU1BBQ0VfVVJJLCB4c2RQcmVmaXggKyAiOiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBYTUxfU0NIRU1BX1NFUVVFTkNFX0xPQ0FMX05BTUUpOwotCi0gICAgICAgIFBhcnQgcGFydDsKLSAgICAgICAgaWYgKChwYXJhbWV0ZXJPcmRlciA9PSBudWxsKSB8fCAocGFyYW1ldGVyT3JkZXIuc2l6ZSgpID09IDApKSB7Ci0gICAgICAgICAgICAvLyBubyBwYXJhbWV0ZXIgb3JkZXIgdGhlbiBqdXN0IGFkZCB0aGUgZWxlbWVudHMgaW4gdGhlIHBhcnRzIGNvbGxlY3Rpb24KLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgcGFydHNJdGVyID0gcGFydHNDb2xsZWN0aW9uLml0ZXJhdG9yKCk7IHBhcnRzSXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgcGFydCA9IChQYXJ0KSBwYXJ0c0l0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgIC8vIHRoZSBwYXJ0IG5hbWUKLSAgICAgICAgICAgICAgICBhZGRQYXJ0VG9FbGVtZW50KHBhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhzZFByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZUltcG9ydHNNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VQcmVmaXhNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXBseFR5cGVTZXF1ZW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzT3V0TWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvZSk7Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIGkuZSBhbiBwYXJ0cyBvcmRlciBpcyBnaXZlbgotICAgICAgICAgICAgLy8gZmlyc3QgcG9wdWxhdGUgYWxsIHRoZSBwYXJ0cyB0byBhIG1hcAotICAgICAgICAgICAgTWFwIHBhcnRzTWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgcGFydHNJdGVyID0gcGFydHNDb2xsZWN0aW9uLml0ZXJhdG9yKCk7IHBhcnRzSXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgcGFydCA9IChQYXJ0KSBwYXJ0c0l0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgIHBhcnRzTWFwLnB1dChwYXJ0LmdldE5hbWUoKSwgcGFydCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0cmluZyBwYXJ0TmFtZTsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgcGFyYW1PcmRlckl0ZXIgPSBwYXJhbWV0ZXJPcmRlci5pdGVyYXRvcigpOyBwYXJhbU9yZGVySXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgcGFydE5hbWUgPSAoU3RyaW5nKSBwYXJhbU9yZGVySXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgcGFydCA9IChQYXJ0KSBwYXJ0c01hcC5nZXQocGFydE5hbWUpOwotICAgICAgICAgICAgICAgIGlmIChwYXJ0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkUGFydFRvRWxlbWVudChwYXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhzZFByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VJbXBvcnRzTWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVByZWZpeE1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXBseFR5cGVTZXF1ZW5jZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNPdXRNZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvZSk7Ci0gICAgICAgICAgICAgICAgICAgIHBhcnRzTWFwLnJlbW92ZShwYXJ0TmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gaWYgdGhpcyBpcyBhbiBvdXRwdXQgbWVzc2FnZSB0aGVuIHdlIGhhdmUgdG8gc2V0IHRoZQotICAgICAgICAgICAgLy8gcmV0dXJuIHR5cGUgaWYgZXhpc3RzCi0gICAgICAgICAgICBpZiAoaXNPdXRNZXNzYWdlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBhcnRzTWFwLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnRzTWFwLnNpemUoKSA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYXJ0ID0gKFBhcnQpIHBhcnRzTWFwLnZhbHVlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hhbmdlIHRoZSBuYW1lIG9mIHRoaXMgcGFydAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyB0aGUgcmV0dXJuIHR5cGUgYW5kIGl0cyBuYW1lIHNob3VsZCBiZSByZXN1bHQKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhcnQuc2V0TmFtZSgicmVzdWx0Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhZGRQYXJ0VG9FbGVtZW50KHBhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4c2RQcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZUltcG9ydHNNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVByZWZpeE1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21wbHhUeXBlU2VxdWVuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzT3V0TWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9lKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBXU0RMUHJvY2Vzc2luZ0V4Y2VwdGlvbigidGhlIHBhcmFtZXRlciBvcmRlciBjYW4gbGVmdCBhdG1vc3QiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIG9uZSBwYXJ0Iik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBuZXdDb21wbGV4VHlwZS5hcHBlbmRDaGlsZChjbXBseFR5cGVTZXF1ZW5jZSk7Ci0gICAgICAgIHJldHVybiBuZXdDb21wbGV4VHlwZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gcGFydAotICAgICAqIEBwYXJhbSBkb2N1bWVudAotICAgICAqIEBwYXJhbSB4c2RQcmVmaXgKLSAgICAgKiBAcGFyYW0gbmFtZXNwYWNlSW1wb3J0c01hcAotICAgICAqIEBwYXJhbSBuYW1lc3BhY2VQcmVmaXhNYXAKLSAgICAgKiBAcGFyYW0gY21wbHhUeXBlU2VxdWVuY2UKLSAgICAgKiBAcGFyYW0gaXNPdXRNZXNzYWdlICh0cnVlIGlzIHBhcnQgaXMgcmVmZXJlbmNlZCBieSB0aGUgb3V0cHV0IGNsYXVzZSkKLSAgICAgKiBAcGFyYW0gYm9lIEJpbmRpbmdPcGVyYXRpb25FbnRyeSB0aGF0IGNhdXNlZCB0aGUgY3JlYXRpb24gb2YgdGhpcyBwYXJ0LgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBhZGRQYXJ0VG9FbGVtZW50KFBhcnQgcGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEb2N1bWVudCBkb2N1bWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgeHNkUHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcCBuYW1lc3BhY2VJbXBvcnRzTWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcCBuYW1lc3BhY2VQcmVmaXhNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWxlbWVudCBjbXBseFR5cGVTZXF1ZW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzT3V0TWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaW5kaW5nT3BlcmF0aW9uRW50cnkgYm9lKSB7Ci0gICAgICAgIEVsZW1lbnQgY2hpbGQ7Ci0gICAgICAgIFN0cmluZyBlbGVtZW50TmFtZSA9IHBhcnQuZ2V0TmFtZSgpOwotCi0gICAgICAgIC8vIHRoZSB0eXBlIG5hbWUKLSAgICAgICAgUU5hbWUgc2NoZW1hVHlwZU5hbWUgPSBwYXJ0LmdldFR5cGVOYW1lKCk7Ci0KLSAgICAgICAgaWYgKHNjaGVtYVR5cGVOYW1lICE9IG51bGwpIHsKLQotICAgICAgICAgICAgY2hpbGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoWE1MU0NIRU1BX05BTUVTUEFDRV9VUkksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4c2RQcmVmaXggKyAiOiIgKyBYTUxfU0NIRU1BX0VMRU1FTlRfTE9DQUxfTkFNRSk7Ci0gICAgICAgICAgICAvLyBhbHdheXMgY2hpbGQgYXR0cmlidXRlIHNob3VsZCBiZSBpbiBubyBuYW1lc3BhY2UKLSAgICAgICAgICAgIGNoaWxkLnNldEF0dHJpYnV0ZSgiZm9ybSIsICJ1bnF1YWxpZmllZCIpOwotCi0gICAgICAgICAgICBTdHJpbmcgcHJlZml4OwotICAgICAgICAgICAgaWYgKFhNTFNDSEVNQV9OQU1FU1BBQ0VfVVJJLmVxdWFscyhzY2hlbWFUeXBlTmFtZS5nZXROYW1lc3BhY2VVUkkoKSkpIHsKLSAgICAgICAgICAgICAgICBwcmVmaXggPSB4c2RQcmVmaXg7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIHRoaXMgc2NoZW1hIGlzIGEgdGhpcmQgcGFydHkgb25lLiBTbyB3ZSBuZWVkIHRvIGhhdmUKLSAgICAgICAgICAgICAgICAvLyBhbiBpbXBvcnQgc3RhdGVtZW50IGluIG91ciBnZW5lcmF0ZWQgc2NoZW1hCi0gICAgICAgICAgICAgICAgU3RyaW5nIHVyaSA9IHNjaGVtYVR5cGVOYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgIGlmICghbmFtZXNwYWNlSW1wb3J0c01hcC5jb250YWluc0tleSh1cmkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBFbGVtZW50IGZvciBuYW1lc3BhY2UgaW1wb3J0Ci0gICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgbmFtZXNwYWNlSW1wb3J0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTFNDSEVNQV9OQU1FU1BBQ0VfVVJJLCB4c2RQcmVmaXggKyAiOiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBYTUxfU0NIRU1BX0lNUE9SVF9MT0NBTF9OQU1FKTsKLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlSW1wb3J0LnNldEF0dHJpYnV0ZShOQU1FU1BBQ0VfVVJJLCB1cmkpOwotICAgICAgICAgICAgICAgICAgICAvLyBhZGQgdGhpcyB0byB0aGUgbWFwCi0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZUltcG9ydHNNYXAucHV0KHVyaSwgbmFtZXNwYWNlSW1wb3J0KTsKLSAgICAgICAgICAgICAgICAgICAgLy8gd2UgYWxzbyBuZWVkIHRvIGFzc29jaWF0ZSB0aGlzIHVyaSB3aXRoIGEgcHJlZml4Ci0gICAgICAgICAgICAgICAgICAgIC8vIGFuZCBpbmNsdWRlIHRoYXQgcHJlZml4Ci0gICAgICAgICAgICAgICAgICAgIC8vIGluIHRoZSBzY2hlbWEncyBuYW1zcGFjZSBkZWNsYXJhdGlvbnMuIFNvIGFkZAotICAgICAgICAgICAgICAgICAgICAvLyB0aGVpcyBwYXJ0aWN1bGFyIG5hbWVzcGFjZSB0byB0aGUKLSAgICAgICAgICAgICAgICAgICAgLy8gcHJlZml4IG1hcCBhcyB3ZWxsCi0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdldFRlbXBvcmFyeU5hbWVzcGFjZVByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VQcmVmaXhNYXAucHV0KHVyaSwgcHJlZml4KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIFVSSSBzaG91bGQgYmUgYWxyZWFkeSBpbiB0aGUgbmFtc3BhY2UgcHJlZml4Ci0gICAgICAgICAgICAgICAgICAgIC8vIG1hcAotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSAoU3RyaW5nKSBuYW1lc3BhY2VQcmVmaXhNYXAuZ2V0KHVyaSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNoaWxkLnNldEF0dHJpYnV0ZShYU0RfTkFNRSwgZWxlbWVudE5hbWUpOwotICAgICAgICAgICAgY2hpbGQuc2V0QXR0cmlidXRlKFhTRF9UWVBFLCBwcmVmaXggKyAiOiIgKyBzY2hlbWFUeXBlTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICBjbXBseFR5cGVTZXF1ZW5jZS5hcHBlbmRDaGlsZChjaGlsZCk7Ci0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFN0cmluZyBiaW5kaW5nT3BlcmF0aW9uTmFtZSA9IGJvZS5nZXRCaW5kaW5nT3BlcmF0aW9uKCkuZ2V0TmFtZSgpOwotICAgICAgICAgICAgU3RyaW5nIHBhcnROYW1lID0gcGFydC5nZXROYW1lKCk7Ci0gICAgICAgICAgICBpZiAoYm9lLmlzUlBDKCkpIHsKLSAgICAgICAgICAgICAgICAvLyBzZWUgdGhlIGJhc2ljIHByb2ZpbGUgNC40LjEgZm9yIHJwYy1saXRlcmFsLgotICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2VzIHBhcnRzIGNhbiBoYXZlIG9ubHkgdHlwZXMKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV1NETFByb2Nlc3NpbmdFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIlRoZSBiaW5kaW5nIG9wZXJhdGlvbiAiICsgYmluZGluZ09wZXJhdGlvbk5hbWUgKyAiIGlzIFJQQy9saXRlcmFsLiAiICsKLSAgICAgICAgICAgICAgICAgICAiVGhlIG1lc3NhZ2UgcGFydHMgZm9yIHRoaXMgb3BlcmF0aW9uIG11c3QgdXNlIHRoZSB0eXBlICIgKwotICAgICAgICAgICAgICAgICAgICJhdHRyaWJ1dGUgYXMgc3BlY2lmaWNlZCBieSAiICsKLSAgICAgICAgICAgICAgICAgICAiV1MtSSBCYXNpYyBQcm9maWxlIHNwZWNpZmljYXRpb24gKDQuNC4xKS4gIE1lc3NhZ2UgcGFydCwgIiArIAotICAgICAgICAgICAgICAgICAgIHBhcnROYW1lICsgIiwgdmlvbGF0ZXMiICsKLSAgICAgICAgICAgICAgICAgICAidGhpcyBydWxlLiAgUGxlYXNlIHJlbW92ZSB0aGUgZWxlbWVudCBhdHRyaWJ1dGUgIiArCi0gICAgICAgICAgICAgICAgICAgImFuZCB1c2UgdGhlIHR5cGUgYXR0cmlidXRlLiIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBUaGUgcHJlc2Vuc2Ugb2YgYW4gZWxlbWVudCBtZWFucyB0aGF0IGEgd3JhcHBlciB4c2QgZWxlbWVudCBpcyBub3QgbmVlZGVkLgotICAgICAgICAgICAgICAgIGJvZS5zZXRXcmFwcGVkT3V0cHV0KGZhbHNlKTsKLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJUaGUgYmluZGluZyBvcGVyYXRpb24gIiArIGJpbmRpbmdPcGVyYXRpb25OYW1lICsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHJlZmVyZW5jZXMgbWVzc2FnZSBwYXJ0ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydE5hbWUgKyAiLiAgVGhpcyBwYXJ0IGRvZXMgbm90IHVzZSB0aGUgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSBhdHRyaWJ1dGUsIHNvIGEgd3JhcHBlcmluZyBlbGVtZW50IGlzIG5vdCBhZGRlZC4iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBwcmVmaXhNYXAKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tBbmRBZGROYW1lc3BhY2VEZWNsYXJhdGlvbnMoU3RyaW5nIG5hbWVzcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwIHByZWZpeE1hcCwgRWxlbWVudCBzY2hlbWFFbGVtZW50KSB7Ci0gICAgICAgIC8vIGdldCB0aGUgYXR0cmlidXRlIGZvciB0aGUgY3VycmVudCBuYW1lc3BhY2UKLSAgICAgICAgU3RyaW5nIHByZWZpeCA9IChTdHJpbmcpIHByZWZpeE1hcC5nZXQobmFtZXNwYWNlKTsKLSAgICAgICAgLy8gQSBwcmVmaXggbXVzdCBiZSBmb3VuZCBhdCB0aGlzIHBvaW50IQotICAgICAgICBTdHJpbmcgZXhpc3RpbmdVUkwgPSBzY2hlbWFFbGVtZW50LmdldEF0dHJpYnV0ZU5TKFhNTF9OQU1FU1BBQ0VfVVJJLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5BTUVTUEFDRV9ERUNMQVJBVElPTl9QUkVGSVggKyBwcmVmaXgpOwotICAgICAgICBpZiAoZXhpc3RpbmdVUkwgPT0gbnVsbCB8fCBleGlzdGluZ1VSTC5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICAvLyB0aGVyZSBpcyBubyBleGlzdGluZyBVUkwgYnkgdGhhdCBwcmVmaXggLSBkZWNsYXJlIGEgbmV3IG5hbWVzcGFjZQotICAgICAgICAgICAgc2NoZW1hRWxlbWVudC5zZXRBdHRyaWJ1dGVOUyhYTUxfTkFNRVNQQUNFX1VSSSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkFNRVNQQUNFX0RFQ0xBUkFUSU9OX1BSRUZJWCArIHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgfSBlbHNlIGlmIChleGlzdGluZ1VSTC5lcXVhbHMobmFtZXNwYWNlKSkgewotICAgICAgICAgICAgLy8gdGhpcyBuYW1lc3BhY2UgZGVjbGFyYXRpb24gaXMgYWxyZWFkeSB0aGVyZSB3aXRoIHRoZSBzYW1lIHByZWZpeAotICAgICAgICAgICAgLy8gaWdub3JlIGl0Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyB0aGVyZSBpcyBhIGRpZmZlcmVudCBuYW1lc3BhY2UgZGVjbGFyZWQgaW4gdGhlIGdpdmVuIHByZWZpeAotICAgICAgICAgICAgLy8gY2hhbmdlIHRoZSBwcmVmaXggaW4gdGhlIHByZWZpeCBtYXAgdG8gYSBuZXcgb25lIGFuZCBkZWNsYXJlIGl0Ci0KLSAgICAgICAgICAgIC8vIGNyZWF0ZSBhIHByZWZpeAotICAgICAgICAgICAgU3RyaW5nIGdlbmVyYXRlZFByZWZpeCA9ICJucyIgKyBwcmVmaXhDb3VudGVyKys7Ci0gICAgICAgICAgICB3aGlsZSAocHJlZml4TWFwLmNvbnRhaW5zS2V5KGdlbmVyYXRlZFByZWZpeCkpIHsKLSAgICAgICAgICAgICAgICBnZW5lcmF0ZWRQcmVmaXggPSAibnMiICsgcHJlZml4Q291bnRlcisrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2NoZW1hRWxlbWVudC5zZXRBdHRyaWJ1dGVOUyhYTUxfTkFNRVNQQUNFX1VSSSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkFNRVNQQUNFX0RFQ0xBUkFUSU9OX1BSRUZJWCArIGdlbmVyYXRlZFByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgIC8vIGFkZCB0byB0aGUgbWFwCi0gICAgICAgICAgICBwcmVmaXhNYXAucHV0KG5hbWVzcGFjZSwgZ2VuZXJhdGVkUHJlZml4KTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVhZCB0aGUgV1NETCBmaWxlIGdpdmVuIHRoZSBpbnB1dHN0cmVhbSBmb3IgdGhlIFdTREwgc291cmNlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaW4KLSAgICAgKiBAdGhyb3dzIFdTRExFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIERlZmluaXRpb24gcmVhZEluVGhlV1NETEZpbGUoSW5wdXRTdHJlYW0gaW4pIHRocm93cyBXU0RMRXhjZXB0aW9uIHsKLQotICAgICAgICBXU0RMUmVhZGVyIHJlYWRlciA9IFdTRExGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3V1NETFJlYWRlcigpOwotCi0gICAgICAgIC8vIHN3aXRjaCBvZmYgdGhlIHZlcmJvc2UgbW9kZSBmb3IgYWxsIHVzZWNhc2VzCi0gICAgICAgIHJlYWRlci5zZXRGZWF0dXJlKEpBVkFYX1dTRExfVkVSQk9TRV9NT0RFX0tFWSwgZmFsc2UpOwotICAgICAgICByZWFkZXIuc2V0RmVhdHVyZSgiamF2YXgud3NkbC5pbXBvcnREb2N1bWVudHMiLCB0cnVlKTsKLQotICAgICAgICBEZWZpbml0aW9uIGRlZjsKLSAgICAgICAgLy8gaWYgdGhlIGN1c3RlbSByZXNvbHZlciBpcyBwcmVzZW50IHRoZW4gdXNlIGl0Ci0gICAgICAgIGlmIChjdXN0b21XU0RMUmVzb2x2ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHRoZSB3c2RsIGRlZmluaXRpb24gaGFzIHRoZSBVUkkgZm9yIHRoZSBiYXNlIGRvY3VtZW50IHNldAotICAgICAgICAgICAgZGVmID0gcmVhZGVyLnJlYWRXU0RMKGN1c3RvbVdTRExSZXNvbHZlcik7Ci0gICAgICAgICAgICBkZWYuc2V0RG9jdW1lbnRCYXNlVVJJKGN1c3RvbVdTRExSZXNvbHZlci5nZXRCYXNlVVJJKCkpOwotICAgICAgICAgICAgcmV0dXJuIGRlZjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIERvY3VtZW50IGRvYzsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgZG9jID0gWE1MVXRpbHMubmV3RG9jdW1lbnQoaW4pOwotICAgICAgICAgICAgfSBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFdTRExFeGNlcHRpb24oV1NETEV4Y2VwdGlvbi5QQVJTRVJfRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBhcnNlciBDb25maWd1cmF0aW9uIEVycm9yIiwgZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBXU0RMRXhjZXB0aW9uKFdTRExFeGNlcHRpb24uUEFSU0VSX0VSUk9SLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQYXJzZXIgU0FYIEVycm9yIiwgZSk7Ci0KLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV1NETEV4Y2VwdGlvbihXU0RMRXhjZXB0aW9uLklOVkFMSURfV1NETCwgIklPIEVycm9yIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gTG9nIHdoZW4gYW5kIGZyb20gd2hlcmUgdGhlIFdTREwgaXMgbG9hZGVkLgotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJSZWFkaW5nIDEuMSBXU0RMIHdpdGggYmFzZSB1cmkgPSAiICsgZ2V0QmFzZVVyaSgpKTsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIiAgdGhlIGRvY3VtZW50IGJhc2UgdXJpID0gIiArIGdldERvY3VtZW50QmFzZVVyaSgpKTsKLSAgICAgICAgICAgICAgICBsb2cudHJhY2UoIiAgdGhlIHN0YWNrIGF0IHRoaXMgcG9pbnQgaXM6ICIgKyBzdGFja1RvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGVmID0gcmVhZGVyLnJlYWRXU0RMKGdldEJhc2VVcmkoKSwgZG9jKTsKLSAgICAgICAgICAgIGRlZi5zZXREb2N1bWVudEJhc2VVUkkoZ2V0RG9jdW1lbnRCYXNlVXJpKCkpOwotICAgICAgICAgICAgcmV0dXJuIGRlZjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgRXh0ZW5zaWJsZSBlbGVtZW50cyBmb3JtIHdzZGw0akV4dGVuc2libGVFbGVtZW50cwotICAgICAqIDxjb2RlPlZlY3RvcjwvY29kZT4gaWYgYW55IGFuZCBjb3B5IHRoZW0gdG8gPGNvZGU+Q29tcG9uZW50PC9jb2RlPgotICAgICAqIDxwLz4gTm90ZSAtIFNPQVAgYm9keSBleHRlbnNpYmxlIGVsZW1lbnQgd2lsbCBiZSBwcm9jZXNzZWQgZGlmZmVyZW50bHkKLSAgICAgKgotICAgICAqIEBwYXJhbSB3c2RsNGpFeHRlbnNpYmxlRWxlbWVudHMKLSAgICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgd2hlcmUgaXMgdGhlIGV4dCBlbGVtZW50IChwb3J0ICwgcG9ydHlwZSAsIGJpZGluZykKLSAgICAgKiBAcGFyYW0gd3NkbDRqRGVmaW5pdGlvbgotICAgICAqIEBwYXJhbSBvcmlnaW5PZkV4dGVuc2liaWxpdHlFbGVtZW50cyAtCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgd2lsbCBpbmRpY2F0ZSB0aGUgcGxhY2UgdGhpcyBleHRlbnNpYmlsaXR5IGVsZW1lbnQgY2FtZQotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjb3B5RXh0ZW5zaWJsZUVsZW1lbnRzKExpc3Qgd3NkbDRqRXh0ZW5zaWJsZUVsZW1lbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmluaXRpb24gd3NkbDRqRGVmaW5pdGlvbiwgQXhpc0Rlc2NyaXB0aW9uIGRlc2NyaXB0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBvcmlnaW5PZkV4dGVuc2liaWxpdHlFbGVtZW50cykgdGhyb3dzIEF4aXNGYXVsdCB7Ci0KLSAgICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgd3NkbDRqRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci0KLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHdzZGw0akV4dGVuc2libGVFbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0KLSAgICAgICAgICAgIHdzZGw0akV4dGVuc2liaWxpdHlFbGVtZW50ID0gKEV4dGVuc2liaWxpdHlFbGVtZW50KSBpdGVyYXRvci5uZXh0KCk7Ci0KLSAgICAgICAgICAgIGlmICh3c2RsNGpFeHRlbnNpYmlsaXR5RWxlbWVudCBpbnN0YW5jZW9mIFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCkgewotCi0gICAgICAgICAgICAgICAgVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50IHVua25vd24gPQotICAgICAgICAgICAgICAgICAgICAgICAgKFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCkgKHdzZGw0akV4dGVuc2liaWxpdHlFbGVtZW50KTsKLSAgICAgICAgICAgICAgICBRTmFtZSB0eXBlID0gdW5rbm93bi5nZXRFbGVtZW50VHlwZSgpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIDx3c3A6UG9saWN5PgotICAgICAgICAgICAgICAgIGlmIChXU0RMQ29uc3RhbnRzLldTREwxMUNvbnN0YW50cy5QT0xJQ1kuZXF1YWxzKHR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpc1RyYWNlRW5hYmxlZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLnRyYWNlKCJjb3B5RXh0ZW5zaWJsZUVsZW1lbnRzOjogUG9saWN5RWxlbWVudCBmb3VuZCAiICsgdW5rbm93bik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgUG9saWN5IHBvbGljeSA9IChQb2xpY3kpIFBvbGljeVV0aWwuZ2V0UG9saWN5Q29tcG9uZW50KHVua25vd24uZ2V0RWxlbWVudCgpKTsKLSAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24uZ2V0UG9saWN5U3ViamVjdCgpLmF0dGFjaFBvbGljeShwb2xpY3kpOwotICAgICAgICAgICAgICAgICAgICAKLS8vICAgICAgICAgICAgICAgICAgICBpbnQgYXR0YWNobWVudFNjb3BlID0KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFBvbGljeUF0dGFjaG1lbnRQb2ludChkZXNjcmlwdGlvbiwgb3JpZ2luT2ZFeHRlbnNpYmlsaXR5RWxlbWVudHMpOwotLy8gICAgICAgICAgICAgICAgICAgIGlmIChhdHRhY2htZW50U2NvcGUgPiAtMSkgewotLy8gICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbi5nZXRQb2xpY3lJbmNsdWRlKCkuYWRkUG9saWN5RWxlbWVudCgKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRhY2htZW50U2NvcGUsIHBvbGljeSk7Ci0vLyAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyA8d3NwOlBvbGljeVJlZmVyZW5jZT4KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFdTRExDb25zdGFudHMuV1NETDExQ29uc3RhbnRzLlBPTElDWV9SRUZFUkVOQ0UKLSAgICAgICAgICAgICAgICAgICAgICAgIC5lcXVhbHModHlwZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzVHJhY2VFbmFibGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cudHJhY2UoImNvcHlFeHRlbnNpYmxlRWxlbWVudHM6OiBQb2xpY3lSZWZlcmVuY2UgZm91bmQgIiArIHVua25vd24pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIFBvbGljeVJlZmVyZW5jZSBwb2xpY3lSZWZlcmVuY2UgPSAoUG9saWN5UmVmZXJlbmNlKSBQb2xpY3lVdGlsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFBvbGljeUNvbXBvbmVudCh1bmtub3duLmdldEVsZW1lbnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uLmdldFBvbGljeVN1YmplY3QoKS5hdHRhY2hQb2xpY3lSZWZlcmVuY2UocG9saWN5UmVmZXJlbmNlKTsKLSAgICAgICAgICAgICAgICAgICAgCi0vLyAgICAgICAgICAgICAgICAgICAgaW50IGF0dGFjaG1lbnRTY29wZSA9Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRQb2xpY3lBdHRhY2htZW50UG9pbnQoZGVzY3JpcHRpb24sIG9yaWdpbk9mRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKTsKLS8vICAgICAgICAgICAgICAgICAgICBpZiAoYXR0YWNobWVudFNjb3BlID4gLTEpIHsKLS8vICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24uZ2V0UG9saWN5SW5jbHVkZSgpLmFkZFBvbGljeVJlZkVsZW1lbnQoCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0YWNobWVudFNjb3BlLCBwb2xpY3lSZWZlcmVuY2UpOwotLy8gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKEFkZHJlc3NpbmdDb25zdGFudHMuRmluYWwuV1NBV19VU0lOR19BRERSRVNTSU5HCi0gICAgICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKHR5cGUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBBZGRyZXNzaW5nQ29uc3RhbnRzLlN1Ym1pc3Npb24uV1NBV19VU0lOR19BRERSRVNTSU5HCi0gICAgICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKHVua25vd24uZ2V0RWxlbWVudFR5cGUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzVHJhY2VFbmFibGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cudHJhY2UoImNvcHlFeHRlbnNpYmxlRWxlbWVudHM6OiB3c2F3OlVzaW5nQWRkcmVzc2luZyBmb3VuZCAiICsgdW5rbm93bik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gRklYTUUgV2UgbmVlZCB0byBzZXQgdGhpcyB0aGUgYXBwcm9wcmlhdGUgQXhpcyBEZXNjcmlwdGlvbiBBeGlzRW5kcG9pbnQgb3IKLSAgICAgICAgICAgICAgICAgICAgLy8gQXhpc0JpbmRpbmcgLgotICAgICAgICAgICAgICAgICAgICBpZiAob3JpZ2luT2ZFeHRlbnNpYmlsaXR5RWxlbWVudHMuZXF1YWxzKFBPUlQpCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCBvcmlnaW5PZkV4dGVuc2liaWxpdHlFbGVtZW50cy5lcXVhbHMoQklORElORykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChCb29sZWFuLlRSVUUuZXF1YWxzKHVua25vd24uZ2V0UmVxdWlyZWQoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIAlBZGRyZXNzaW5nSGVscGVyLnNldEFkZHJlc3NpbmdSZXF1aXJlbWVudFBhcmVtZXRlclZhbHVlKGF4aXNTZXJ2aWNlLCBBZGRyZXNzaW5nQ29uc3RhbnRzLkFERFJFU1NJTkdfUkVRVUlSRUQpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIAlBZGRyZXNzaW5nSGVscGVyLnNldEFkZHJlc3NpbmdSZXF1aXJlbWVudFBhcmVtZXRlclZhbHVlKGF4aXNTZXJ2aWNlLCBBZGRyZXNzaW5nQ29uc3RhbnRzLkFERFJFU1NJTkdfT1BUSU9OQUwpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB9ICAgIGVsc2UgaWYgKHdzZGw0akV4dGVuc2liaWxpdHlFbGVtZW50LmdldEVsZW1lbnRUeXBlKCkgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgd3NkbDRqRXh0ZW5zaWJpbGl0eUVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKS5nZXROYW1lc3BhY2VVUkkoKS5lcXVhbHMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIubmFtZXNwYWNlLkNvbnN0YW50cy5GT1JNQVRfQklORElORykpIHsKLSAgICAgICAgICAgICAgICAgICAgRWxlbWVudCB0eXBlTWFwcGluZyA9IHVua25vd24uZ2V0RWxlbWVudCgpOwotICAgICAgICAgICAgICAgICAgICBOb2RlTGlzdCB0eXBlTWFwcyA9IHR5cGVNYXBwaW5nLmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5uYW1lc3BhY2UuQ29uc3RhbnRzLkZPUk1BVF9CSU5ESU5HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlTWFwIik7Ci0gICAgICAgICAgICAgICAgICAgIGludCBjb3VudCA9IHR5cGVNYXBzLmdldExlbmd0aCgpOwotICAgICAgICAgICAgICAgICAgICBIYXNoTWFwIHR5cGVNYXBwZXIgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgY291bnQ7IGluZGV4KyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE5vZGUgbm9kZSA9IHR5cGVNYXBzLml0ZW0oaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgTmFtZWROb2RlTWFwIGF0dHJpYnV0ZXMgPSBub2RlLmdldEF0dHJpYnV0ZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIE5vZGUgdHlwZU5hbWUgPSBhdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgidHlwZU5hbWUiKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gZ2V0UHJlZml4KHR5cGVOYW1lLmdldE5vZGVWYWx1ZSgpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbnMgPSAoU3RyaW5nKSB3c2RsNGpEZWZpbml0aW9uLmdldE5hbWVzcGFjZXMoKS5nZXQocHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5zICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vZGUgZm9ybWF0VHlwZSA9IGF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCJmb3JtYXRUeXBlIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlTWFwcGVyLnB1dChuZXcgUU5hbWUobnMsIGdldFR5cGVOYW1lKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlTmFtZS5nZXROb2RlVmFsdWUoKSkpLCBmb3JtYXRUeXBlLmdldE5vZGVWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3c2RsNGpFeHRlbnNpYmlsaXR5RWxlbWVudC5nZXRFbGVtZW50VHlwZSgpICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIHdzZGw0akV4dGVuc2liaWxpdHlFbGVtZW50LmdldEVsZW1lbnRUeXBlKCkuZ2V0TmFtZXNwYWNlVVJJKCkuZXF1YWxzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLm5hbWVzcGFjZS5Db25zdGFudHMuSkFWQV9OUykpIHsKLSAgICAgICAgICAgICAgICAgICAgRWxlbWVudCB1bmtub3dKYXZhRWxlbWVudCA9IHVua25vd24uZ2V0RWxlbWVudCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAodW5rbm93SmF2YUVsZW1lbnQuZ2V0TG9jYWxOYW1lKCkuZXF1YWxzKCJhZGRyZXNzIikgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBOYW1lZE5vZGVNYXAgbmFtZUF0dHJpYnV0ZXMgPSB1bmtub3dKYXZhRWxlbWVudC5nZXRBdHRyaWJ1dGVzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBOb2RlIG5vZGUgPSBuYW1lQXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oImNsYXNzTmFtZSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1ldGVyIHNlcnZpY2VDbGFzcyA9IG5ldyBQYXJhbWV0ZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VDbGFzcy5zZXROYW1lKCJjbGFzc05hbWUiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VDbGFzcy5zZXRWYWx1ZShub2RlLmdldE5vZGVWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlLmFkZFBhcmFtZXRlcihzZXJ2aWNlQ2xhc3MpOwotICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1ldGVyIHRyYW5zcG9ydE5hbWUgPSBuZXcgUGFyYW1ldGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnROYW1lLnNldE5hbWUoIlRSQU5TUE9SVF9OQU1FIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnROYW1lLnNldFZhbHVlKCJqYXZhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBheGlzU2VydmljZS5hZGRQYXJhbWV0ZXIodHJhbnNwb3J0TmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9ICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlIHRoaXMgZWxlbWVudCAtIGl0IGlzIGEgdG90YWxseSB1bmtub3duIGVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzVHJhY2VFbmFibGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cudHJhY2UoImNvcHlFeHRlbnNpYmxlRWxlbWVudHM6OiBVbmtub3duIEV4dGVuc2liaWxpdHkgRWxlbWVudCBmb3VuZCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmtub3duKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBlbHNlIGlmICh3c2RsNGpFeHRlbnNpYmlsaXR5RWxlbWVudCBpbnN0YW5jZW9mIFNPQVAxMkFkZHJlc3MpIHsKLSAgICAgICAgICAgICAgICBTT0FQMTJBZGRyZXNzIHNvYXBBZGRyZXNzID0gKFNPQVAxMkFkZHJlc3MpIHdzZGw0akV4dGVuc2liaWxpdHlFbGVtZW50OwotICAgICAgICAgICAgICAgIGlmIChkZXNjcmlwdGlvbiBpbnN0YW5jZW9mIEF4aXNFbmRwb2ludCkgewotICAgICAgICAgICAgICAgIAlzZXRFbmRwb2ludFVSTCgoQXhpc0VuZHBvaW50KSBkZXNjcmlwdGlvbiwgc29hcEFkZHJlc3MuZ2V0TG9jYXRpb25VUkkoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IGVsc2UgaWYgKHdzZGw0akV4dGVuc2liaWxpdHlFbGVtZW50IGluc3RhbmNlb2YgU09BUEFkZHJlc3MpIHsKLSAgICAgICAgICAgICAgICBTT0FQQWRkcmVzcyBzb2FwQWRkcmVzcyA9IChTT0FQQWRkcmVzcykgd3NkbDRqRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgaWYgKGRlc2NyaXB0aW9uIGluc3RhbmNlb2YgQXhpc0VuZHBvaW50KSB7Ci0gICAgICAgICAgICAgICAgCXNldEVuZHBvaW50VVJMKChBeGlzRW5kcG9pbnQpIGRlc2NyaXB0aW9uLCBzb2FwQWRkcmVzcy5nZXRMb2NhdGlvblVSSSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHdzZGw0akV4dGVuc2liaWxpdHlFbGVtZW50IGluc3RhbmNlb2YgSFRUUEFkZHJlc3MpIHsKLSAgICAgICAgICAgICAgICBIVFRQQWRkcmVzcyBodHRwQWRkcmVzcyA9IChIVFRQQWRkcmVzcykgd3NkbDRqRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgaWYgKGRlc2NyaXB0aW9uIGluc3RhbmNlb2YgQXhpc0VuZHBvaW50KSB7Ci0gICAgICAgICAgICAgICAgCXNldEVuZHBvaW50VVJMKChBeGlzRW5kcG9pbnQpIGRlc2NyaXB0aW9uLCBodHRwQWRkcmVzcy5nZXRMb2NhdGlvblVSSSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAod3NkbDRqRXh0ZW5zaWJpbGl0eUVsZW1lbnQgaW5zdGFuY2VvZiBTY2hlbWEpIHsKLSAgICAgICAgICAgICAgICBTY2hlbWEgc2NoZW1hID0gKFNjaGVtYSkgd3NkbDRqRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgLy8ganVzdCBhZGQgdGhpcyBzY2hlbWEgLSBubyBuZWVkIHRvIHdvcnJ5IGFib3V0IHRoZSBpbXBvcnRlZAotICAgICAgICAgICAgICAgIC8vIG9uZXMKLSAgICAgICAgICAgICAgICBheGlzU2VydmljZS5hZGRTY2hlbWEoZ2V0WE1MU2NoZW1hKHNjaGVtYS5nZXRFbGVtZW50KCksIHNjaGVtYQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldERvY3VtZW50QmFzZVVSSSgpKSk7Ci0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAod3NkbDRqRXh0ZW5zaWJpbGl0eUVsZW1lbnQgaW5zdGFuY2VvZiBTT0FQMTJPcGVyYXRpb24pIHsKLSAgICAgICAgICAgICAgICBTT0FQMTJPcGVyYXRpb24gc29hcE9wZXJhdGlvbiA9IChTT0FQMTJPcGVyYXRpb24pIHdzZGw0akV4dGVuc2liaWxpdHlFbGVtZW50OwotICAgICAgICAgICAgICAgIEF4aXNCaW5kaW5nT3BlcmF0aW9uIGF4aXNCaW5kaW5nT3BlcmF0aW9uID0gKEF4aXNCaW5kaW5nT3BlcmF0aW9uKSBkZXNjcmlwdGlvbjsKLQotICAgICAgICAgICAgICAgIFN0cmluZyBzdHlsZSA9IHNvYXBPcGVyYXRpb24uZ2V0U3R5bGUoKTsKLSAgICAgICAgICAgICAgICBpZiAoc3R5bGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBheGlzQmluZGluZ09wZXJhdGlvbi5zZXRQcm9wZXJ0eShXU0RMQ29uc3RhbnRzLldTRExfMV8xX1NUWUxFLCBzdHlsZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgU3RyaW5nIHNvYXBBY3Rpb25VUkkgPSBzb2FwT3BlcmF0aW9uLmdldFNvYXBBY3Rpb25VUkkoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0NvZGVnZW4gJiYgKChzb2FwQWN0aW9uVVJJID09IG51bGwpIHx8IChzb2FwQWN0aW9uVVJJLmVxdWFscygiIikpKSkgewotICAgICAgICAgICAgICAgICAgICBzb2FwQWN0aW9uVVJJID0gYXhpc0JpbmRpbmdPcGVyYXRpb24uZ2V0QXhpc09wZXJhdGlvbigpLmdldElucHV0QWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkICYmIGxvZy5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIldTREwgQmluZGluZyBPcGVyYXRpb246ICIgKyBheGlzQmluZGluZ09wZXJhdGlvbi5nZXROYW1lKCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsIFNPQVBBY3Rpb246ICIgKyBzb2FwQWN0aW9uVVJJKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAoc29hcEFjdGlvblVSSSAhPSBudWxsICYmICFzb2FwQWN0aW9uVVJJLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICAgICAgYXhpc0JpbmRpbmdPcGVyYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UHJvcGVydHkoV1NETDJDb25zdGFudHMuQVRUUl9XU09BUF9BQ1RJT04sIHNvYXBBY3Rpb25VUkkpOwotICAgICAgICAgICAgICAgICAgICBheGlzQmluZGluZ09wZXJhdGlvbi5nZXRBeGlzT3BlcmF0aW9uKCkuc2V0U29hcEFjdGlvbihzb2FwQWN0aW9uVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1NlcnZlclNpZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNCaW5kaW5nT3BlcmF0aW9uLmdldEF4aXNPcGVyYXRpb24oKS5zZXRPdXRwdXRBY3Rpb24oc29hcEFjdGlvblVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBheGlzU2VydmljZS5tYXBBY3Rpb25Ub09wZXJhdGlvbihzb2FwQWN0aW9uVVJJLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzQmluZGluZ09wZXJhdGlvbi5nZXRBeGlzT3BlcmF0aW9uKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBlbHNlIGlmICh3c2RsNGpFeHRlbnNpYmlsaXR5RWxlbWVudCBpbnN0YW5jZW9mIFNPQVBPcGVyYXRpb24pIHsKLSAgICAgICAgICAgICAgICBTT0FQT3BlcmF0aW9uIHNvYXBPcGVyYXRpb24gPSAoU09BUE9wZXJhdGlvbikgd3NkbDRqRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgQXhpc0JpbmRpbmdPcGVyYXRpb24gYXhpc0JpbmRpbmdPcGVyYXRpb24gPSAoQXhpc0JpbmRpbmdPcGVyYXRpb24pIGRlc2NyaXB0aW9uOwotCi0gICAgICAgICAgICAgICAgU3RyaW5nIHN0eWxlID0gc29hcE9wZXJhdGlvbi5nZXRTdHlsZSgpOwotICAgICAgICAgICAgICAgIGlmIChzdHlsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF4aXNCaW5kaW5nT3BlcmF0aW9uLnNldFByb3BlcnR5KFdTRExDb25zdGFudHMuV1NETF8xXzFfU1RZTEUsIHN0eWxlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBTdHJpbmcgc29hcEFjdGlvbiA9IHNvYXBPcGVyYXRpb24uZ2V0U29hcEFjdGlvblVSSSgpOwotICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzQ29kZWdlbiAmJiAoKHNvYXBBY3Rpb24gPT0gbnVsbCkgfHwgKHNvYXBBY3Rpb24uZXF1YWxzKCIiKSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNvYXBBY3Rpb24gPSBheGlzQmluZGluZ09wZXJhdGlvbi5nZXRBeGlzT3BlcmF0aW9uKCkuZ2V0SW5wdXRBY3Rpb24oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQgJiYgbG9nLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiV1NETCBCaW5kaW5nIE9wZXJhdGlvbjogIiArIGF4aXNCaW5kaW5nT3BlcmF0aW9uLmdldE5hbWUoKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwgU09BUEFjdGlvbjogIiArIHNvYXBBY3Rpb24pOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChzb2FwQWN0aW9uICE9IG51bGwgJiYgIXNvYXBBY3Rpb24uZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgICAgICBheGlzQmluZGluZ09wZXJhdGlvbi5zZXRQcm9wZXJ0eShXU0RMMkNvbnN0YW50cy5BVFRSX1dTT0FQX0FDVElPTiwgc29hcEFjdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIGF4aXNCaW5kaW5nT3BlcmF0aW9uLmdldEF4aXNPcGVyYXRpb24oKS5zZXRTb2FwQWN0aW9uKHNvYXBBY3Rpb24pOwotICAgICAgICAgICAgICAgICAgICBpZiAoIWlzU2VydmVyU2lkZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYXhpc0JpbmRpbmdPcGVyYXRpb24uZ2V0QXhpc09wZXJhdGlvbigpLnNldE91dHB1dEFjdGlvbihzb2FwQWN0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlLm1hcEFjdGlvblRvT3BlcmF0aW9uKHNvYXBBY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNCaW5kaW5nT3BlcmF0aW9uLmdldEF4aXNPcGVyYXRpb24oKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmICh3c2RsNGpFeHRlbnNpYmlsaXR5RWxlbWVudCBpbnN0YW5jZW9mIEhUVFBPcGVyYXRpb24pIHsKLSAgICAgICAgICAgICAgICBIVFRQT3BlcmF0aW9uIGh0dHBPcGVyYXRpb24gPSAoSFRUUE9wZXJhdGlvbikgd3NkbDRqRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgQXhpc0JpbmRpbmdPcGVyYXRpb24gYXhpc0JpbmRpbmdPcGVyYXRpb24gPSAoQXhpc0JpbmRpbmdPcGVyYXRpb24pIGRlc2NyaXB0aW9uOwotCi0gICAgICAgICAgICAgICAgU3RyaW5nIGh0dHBMb2NhdGlvbiA9IGh0dHBPcGVyYXRpb24uZ2V0TG9jYXRpb25VUkkoKTsKLSAgICAgICAgICAgICAgICBpZiAoaHR0cExvY2F0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSB0byBtYWtlIGl0IHNhbWUgYXMgV1NETCAyIHRlbXBsYXRlCi0gICAgICAgICAgICAgICAgICAgIGh0dHBMb2NhdGlvbiA9IGh0dHBMb2NhdGlvbi5yZXBsYWNlQWxsKCJcXCgiLCAieyIpOwotICAgICAgICAgICAgICAgICAgICBodHRwTG9jYXRpb24gPSBodHRwTG9jYXRpb24ucmVwbGFjZUFsbCgiXFwpIiwgIn0iKTsKLSAgICAgICAgICAgICAgICAgICAgYXhpc0JpbmRpbmdPcGVyYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UHJvcGVydHkoV1NETDJDb25zdGFudHMuQVRUUl9XSFRUUF9MT0NBVElPTiwgaHR0cExvY2F0aW9uKTsKLQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBheGlzQmluZGluZ09wZXJhdGlvbi5zZXRQcm9wZXJ0eShXU0RMMkNvbnN0YW50cy5BVFRSX1dIVFRQX0lOUFVUX1NFUklBTElaQVRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFRUUENvbnN0YW50cy5NRURJQV9UWVBFX1hfV1dXX0ZPUk0pOwotCi0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAod3NkbDRqRXh0ZW5zaWJpbGl0eUVsZW1lbnQgaW5zdGFuY2VvZiBTT0FQMTJIZWFkZXIpIHsKLQotICAgICAgICAgICAgICAgIFNPQVAxMkhlYWRlciBzb2FwSGVhZGVyID0gKFNPQVAxMkhlYWRlcikgd3NkbDRqRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgU09BUEhlYWRlck1lc3NhZ2UgaGVhZGVyTWVzc2FnZSA9IG5ldyBTT0FQSGVhZGVyTWVzc2FnZSgpOwotCi0gICAgICAgICAgICAgICAgaGVhZGVyTWVzc2FnZS5zZXROYW1lc3BhY2VVUkkoc29hcEhlYWRlci5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgICAgICAgICAgaGVhZGVyTWVzc2FnZS5zZXRVc2Uoc29hcEhlYWRlci5nZXRVc2UoKSk7Ci0KLSAgICAgICAgICAgICAgICBCb29sZWFuIHJlcXVpcmVkID0gc29hcEhlYWRlci5nZXRSZXF1aXJlZCgpOwotCi0gICAgICAgICAgICAgICAgaWYgKHJlcXVpcmVkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaGVhZGVyTWVzc2FnZS5zZXRSZXF1aXJlZChyZXF1aXJlZC5ib29sZWFuVmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHdzZGw0akRlZmluaXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAvLyBmaW5kIHRoZSByZWxldmFudCBzY2hlbWEgcGFydCBmcm9tIHRoZSBtZXNzYWdlcwotICAgICAgICAgICAgICAgICAgICBNZXNzYWdlIG1zZyA9IHdzZGw0akRlZmluaXRpb24uZ2V0TWVzc2FnZShzb2FwSGVhZGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldE1lc3NhZ2UoKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1zZyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPIGkxOG4gdGhpcwotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgibWVzc2FnZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc29hcEhlYWRlci5nZXRNZXNzYWdlKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIG5vdCBmb3VuZCBpbiB0aGUgV1NETCAiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBQYXJ0IG1zZ1BhcnQgPSBtc2cuZ2V0UGFydChzb2FwSGVhZGVyLmdldFBhcnQoKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1zZ1BhcnQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyBpMThuIHRoaXMKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoIm1lc3NhZ2UgcGFydCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc29hcEhlYWRlci5nZXRQYXJ0KCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIG5vdCBmb3VuZCBpbiB0aGUgV1NETCAiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBzZWUgYmFzaWMgcHJvZmlsZSA0LjQuMiBCaW5kaW5ncyBhbmQgRmF1bHRzIGhlYWRlciwgZmF1bHQgYW5kIGhlYWRlcmZhdWx0cwotICAgICAgICAgICAgICAgICAgICAvLyBjYW4gb25seSBoYXZlIGVsZW1lbnRzCi0gICAgICAgICAgICAgICAgICAgIGhlYWRlck1lc3NhZ2Uuc2V0RWxlbWVudChtc2dQYXJ0LmdldEVsZW1lbnROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGhlYWRlck1lc3NhZ2Uuc2V0TWVzc2FnZShzb2FwSGVhZGVyLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgaGVhZGVyTWVzc2FnZS5zZXRQYXJ0KHNvYXBIZWFkZXIuZ2V0UGFydCgpKTsKLQotICAgICAgICAgICAgICAgIGlmIChkZXNjcmlwdGlvbiBpbnN0YW5jZW9mIEF4aXNCaW5kaW5nTWVzc2FnZSkgewotICAgICAgICAgICAgICAgICAgICBBeGlzQmluZGluZ01lc3NhZ2UgYmluZGluZ01lc3NhZ2UgPSAoQXhpc0JpbmRpbmdNZXNzYWdlKSBkZXNjcmlwdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgTGlzdCBzb2FwSGVhZGVycyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKExpc3QpIGJpbmRpbmdNZXNzYWdlLmdldFByb3BlcnR5KFdTREwyQ29uc3RhbnRzLkFUVFJfV1NPQVBfSEVBREVSKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNvYXBIZWFkZXJzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNvYXBIZWFkZXJzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYmluZGluZ01lc3NhZ2Uuc2V0UHJvcGVydHkoV1NETDJDb25zdGFudHMuQVRUUl9XU09BUF9IRUFERVIsIHNvYXBIZWFkZXJzKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzb2FwSGVhZGVycy5hZGQoaGVhZGVyTWVzc2FnZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IGVsc2UgaWYgKHdzZGw0akV4dGVuc2liaWxpdHlFbGVtZW50IGluc3RhbmNlb2YgU09BUEhlYWRlcikgewotCi0gICAgICAgICAgICAgICAgU09BUEhlYWRlciBzb2FwSGVhZGVyID0gKFNPQVBIZWFkZXIpIHdzZGw0akV4dGVuc2liaWxpdHlFbGVtZW50OwotICAgICAgICAgICAgICAgIFNPQVBIZWFkZXJNZXNzYWdlIGhlYWRlck1lc3NhZ2UgPSBuZXcgU09BUEhlYWRlck1lc3NhZ2UoKTsKLSAgICAgICAgICAgICAgICBoZWFkZXJNZXNzYWdlLnNldE5hbWVzcGFjZVVSSShzb2FwSGVhZGVyLmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICAgICAgICAgICAgICBoZWFkZXJNZXNzYWdlLnNldFVzZShzb2FwSGVhZGVyLmdldFVzZSgpKTsKLSAgICAgICAgICAgICAgICBCb29sZWFuIHJlcXVpcmVkID0gc29hcEhlYWRlci5nZXRSZXF1aXJlZCgpOwotICAgICAgICAgICAgICAgIGlmIChudWxsICE9IHJlcXVpcmVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIGhlYWRlck1lc3NhZ2Uuc2V0UmVxdWlyZWQocmVxdWlyZWQuYm9vbGVhblZhbHVlKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSB3c2RsNGpEZWZpbml0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGZpbmQgdGhlIHJlbGV2YW50IHNjaGVtYSBwYXJ0IGZyb20gdGhlIG1lc3NhZ2VzCi0gICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gd3NkbDRqRGVmaW5pdGlvbi5nZXRNZXNzYWdlKHNvYXBIZWFkZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1zZyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyB0b2RvIGkxOG4gdGhpcwotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgibWVzc2FnZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc29hcEhlYWRlci5nZXRNZXNzYWdlKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIG5vdCBmb3VuZCBpbiB0aGUgV1NETCAiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBQYXJ0IG1zZ1BhcnQgPSBtc2cuZ2V0UGFydChzb2FwSGVhZGVyLmdldFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtc2dQYXJ0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvZG8gaTE4biB0aGlzCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJtZXNzYWdlIHBhcnQgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHNvYXBIZWFkZXIuZ2V0UGFydCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBub3QgZm91bmQgaW4gdGhlIFdTREwgIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaGVhZGVyTWVzc2FnZS5zZXRFbGVtZW50KG1zZ1BhcnQuZ2V0RWxlbWVudE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGhlYWRlck1lc3NhZ2Uuc2V0TWVzc2FnZShzb2FwSGVhZGVyLmdldE1lc3NhZ2UoKSk7Ci0KLSAgICAgICAgICAgICAgICBoZWFkZXJNZXNzYWdlLnNldFBhcnQoc29hcEhlYWRlci5nZXRQYXJ0KCkpOwotCi0gICAgICAgICAgICAgICAgaWYgKGRlc2NyaXB0aW9uIGluc3RhbmNlb2YgQXhpc0JpbmRpbmdNZXNzYWdlKSB7Ci0gICAgICAgICAgICAgICAgICAgIEF4aXNCaW5kaW5nTWVzc2FnZSBiaW5kaW5nTWVzc2FnZSA9IChBeGlzQmluZGluZ01lc3NhZ2UpIGRlc2NyaXB0aW9uOwotICAgICAgICAgICAgICAgICAgICBMaXN0IHNvYXBIZWFkZXJzID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTGlzdCkgYmluZGluZ01lc3NhZ2UuZ2V0UHJvcGVydHkoV1NETDJDb25zdGFudHMuQVRUUl9XU09BUF9IRUFERVIpOwotICAgICAgICAgICAgICAgICAgICBpZiAoc29hcEhlYWRlcnMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc29hcEhlYWRlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiaW5kaW5nTWVzc2FnZS5zZXRQcm9wZXJ0eShXU0RMMkNvbnN0YW50cy5BVFRSX1dTT0FQX0hFQURFUiwgc29hcEhlYWRlcnMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHNvYXBIZWFkZXJzLmFkZChoZWFkZXJNZXNzYWdlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHdzZGw0akV4dGVuc2liaWxpdHlFbGVtZW50IGluc3RhbmNlb2YgU09BUEJpbmRpbmcpIHsKLQotICAgICAgICAgICAgICAgIFNPQVBCaW5kaW5nIHNvYXBCaW5kaW5nID0gKFNPQVBCaW5kaW5nKSB3c2RsNGpFeHRlbnNpYmlsaXR5RWxlbWVudDsKLSAgICAgICAgICAgICAgICBBeGlzQmluZGluZyBheGlzQmluZGluZyA9IChBeGlzQmluZGluZykgZGVzY3JpcHRpb247Ci0KLSAgICAgICAgICAgICAgICBheGlzQmluZGluZy5zZXRUeXBlKHNvYXBCaW5kaW5nLmdldFRyYW5zcG9ydFVSSSgpKTsKLQotICAgICAgICAgICAgICAgIGF4aXNCaW5kaW5nLnNldFByb3BlcnR5KFdTREwyQ29uc3RhbnRzLkFUVFJfV1NPQVBfVkVSU0lPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT0FQMTFDb25zdGFudHMuU09BUF9FTlZFTE9QRV9OQU1FU1BBQ0VfVVJJKTsKLQotICAgICAgICAgICAgICAgIFN0cmluZyBzdHlsZSA9IHNvYXBCaW5kaW5nLmdldFN0eWxlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHN0eWxlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYXhpc0JpbmRpbmcuc2V0UHJvcGVydHkoV1NETENvbnN0YW50cy5XU0RMXzFfMV9TVFlMRSwgc3R5bGUpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBlbHNlIGlmICh3c2RsNGpFeHRlbnNpYmlsaXR5RWxlbWVudCBpbnN0YW5jZW9mIFNPQVAxMkJpbmRpbmcpIHsKLQotICAgICAgICAgICAgICAgIFNPQVAxMkJpbmRpbmcgc29hcEJpbmRpbmcgPSAoU09BUDEyQmluZGluZykgd3NkbDRqRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgQXhpc0JpbmRpbmcgYXhpc0JpbmRpbmcgPSAoQXhpc0JpbmRpbmcpIGRlc2NyaXB0aW9uOwotCi0gICAgICAgICAgICAgICAgYXhpc0JpbmRpbmcuc2V0UHJvcGVydHkoV1NETDJDb25zdGFudHMuQVRUUl9XU09BUF9WRVJTSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPQVAxMkNvbnN0YW50cy5TT0FQX0VOVkVMT1BFX05BTUVTUEFDRV9VUkkpOwotCi0gICAgICAgICAgICAgICAgU3RyaW5nIHN0eWxlID0gc29hcEJpbmRpbmcuZ2V0U3R5bGUoKTsKLSAgICAgICAgICAgICAgICBpZiAoc3R5bGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBheGlzQmluZGluZy5zZXRQcm9wZXJ0eShXU0RMQ29uc3RhbnRzLldTRExfMV8xX1NUWUxFLCBzdHlsZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgU3RyaW5nIHRyYW5zcG9ydFVSSSA9IHNvYXBCaW5kaW5nLmdldFRyYW5zcG9ydFVSSSgpOwotICAgICAgICAgICAgICAgIGF4aXNCaW5kaW5nLnNldFR5cGUodHJhbnNwb3J0VVJJKTsKLQotICAgICAgICAgICAgfSBlbHNlIGlmICh3c2RsNGpFeHRlbnNpYmlsaXR5RWxlbWVudCBpbnN0YW5jZW9mIEhUVFBCaW5kaW5nKSB7Ci0gICAgICAgICAgICAgICAgSFRUUEJpbmRpbmcgaHR0cEJpbmRpbmcgPSAoSFRUUEJpbmRpbmcpIHdzZGw0akV4dGVuc2liaWxpdHlFbGVtZW50OwotICAgICAgICAgICAgICAgIEF4aXNCaW5kaW5nIGF4aXNCaW5kaW5nID0gKEF4aXNCaW5kaW5nKSBkZXNjcmlwdGlvbjsKLSAgICAgICAgICAgICAgICAvLyBzZXQgdGhlIGJpbmRpbmcgc3R5bGUgc2FtZSBhcyB0aGUgd3NkMiB0byBwcm9jZXNzIHNtb290aGx5Ci0gICAgICAgICAgICAgICAgYXhpc0JpbmRpbmcuc2V0VHlwZShXU0RMMkNvbnN0YW50cy5VUklfV1NETDJfSFRUUCk7Ci0gICAgICAgICAgICAgICAgYXhpc0JpbmRpbmcuc2V0UHJvcGVydHkoV1NETDJDb25zdGFudHMuQVRUUl9XSFRUUF9NRVRIT0QsIGh0dHBCaW5kaW5nLmdldFZlcmIoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCBnZXRQb2xpY3lBdHRhY2htZW50UG9pbnQoQXhpc0Rlc2NyaXB0aW9uIGRlc2NyaXB0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgb3JpZ2luT2ZFeHRlbnNpYmlsaXR5RWxlbWVudHMpIHsKLSAgICAgICAgaW50IHJlc3VsdCA9IC0xOyAvLyBBdHRhY2htZW50IFBvaW50IE5vdCBJZGVudGlmaWVkCi0KLSAgICAgICAgaWYgKFNFUlZJQ0UuZXF1YWxzKG9yaWdpbk9mRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKSkgewotICAgICAgICAgICAgcmVzdWx0ID0gUG9saWN5SW5jbHVkZS5TRVJWSUNFX1BPTElDWTsKLSAgICAgICAgfSBlbHNlIGlmIChQT1JULmVxdWFscyhvcmlnaW5PZkV4dGVuc2liaWxpdHlFbGVtZW50cykpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IFBvbGljeUluY2x1ZGUuUE9SVF9QT0xJQ1k7Ci0gICAgICAgIH0gZWxzZSBpZiAoQklORElORy5lcXVhbHMob3JpZ2luT2ZFeHRlbnNpYmlsaXR5RWxlbWVudHMpKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBQb2xpY3lJbmNsdWRlLkJJTkRJTkdfUE9MSUNZOwotICAgICAgICB9IGVsc2UgaWYgKEJJTkRJTkdfT1BFUkFUSU9OLmVxdWFscyhvcmlnaW5PZkV4dGVuc2liaWxpdHlFbGVtZW50cykpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IFBvbGljeUluY2x1ZGUuQklORElOR19PUEVSQVRJT05fUE9MSUNZOwotICAgICAgICB9IGVsc2UgaWYgKEJJTkRJTkdfT1BFUkFUSU9OX0lOUFVULmVxdWFscyhvcmlnaW5PZkV4dGVuc2liaWxpdHlFbGVtZW50cykpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IFBvbGljeUluY2x1ZGUuQklORElOR19JTlBVVF9QT0xJQ1k7Ci0gICAgICAgIH0gZWxzZSBpZiAoQklORElOR19PUEVSQVRJT05fT1VUUFVULmVxdWFscyhvcmlnaW5PZkV4dGVuc2liaWxpdHlFbGVtZW50cykpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IFBvbGljeUluY2x1ZGUuQklORElOR19PVVRQVVRfUE9MSUNZOwotICAgICAgICB9IGVsc2UgaWYgKFBPUlRfVFlQRS5lcXVhbHMob3JpZ2luT2ZFeHRlbnNpYmlsaXR5RWxlbWVudHMpKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBQb2xpY3lJbmNsdWRlLlBPUlRfVFlQRV9QT0xJQ1k7Ci0gICAgICAgIH0gZWxzZSBpZiAoUE9SVF9UWVBFX09QRVJBVElPTi5lcXVhbHMob3JpZ2luT2ZFeHRlbnNpYmlsaXR5RWxlbWVudHMpKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBQb2xpY3lJbmNsdWRlLk9QRVJBVElPTl9QT0xJQ1k7Ci0gICAgICAgIH0gZWxzZSBpZiAoUE9SVF9UWVBFX09QRVJBVElPTl9JTlBVVC5lcXVhbHMob3JpZ2luT2ZFeHRlbnNpYmlsaXR5RWxlbWVudHMpKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBQb2xpY3lJbmNsdWRlLklOUFVUX1BPTElDWTsKLSAgICAgICAgfSBlbHNlIGlmIChQT1JUX1RZUEVfT1BFUkFUSU9OX09VVFBVVC5lcXVhbHMob3JpZ2luT2ZFeHRlbnNpYmlsaXR5RWxlbWVudHMpKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBQb2xpY3lJbmNsdWRlLk9VVFBVVF9QT0xJQ1k7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaXNUcmFjZUVuYWJsZWQpIHsKLSAgICAgICAgICAgIGxvZy50cmFjZSgiZ2V0UG9saWN5QXR0YWNobWVudFBvaW50OjogYXhpc0Rlc2NyaXB0aW9uPSIgKyBkZXNjcmlwdGlvbiArCi0gICAgICAgICAgICAgICAgICAgICAgIiBleHRlbnNpYmlsaXR5UG9pbnQ9IiArIG9yaWdpbk9mRXh0ZW5zaWJpbGl0eUVsZW1lbnRzICsgIiByZXN1bHQ9IiArIHJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIExvb2sgZm9yIHRoZSB3cmFwcGFibGUgb3BlcmF0aW9ucyBkZXBlbmRpbmcgb24gdGhlIHN0eWxlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYmluZGluZwotICAgICAqIEByZXR1cm4gTGlzdCBvZiBCaW5kaW5nT3BlcmF0aW9uRW50cnkgb2JqZWN0cwotICAgICAqLwotICAgIHByaXZhdGUgTGlzdCBmaW5kV3JhcHBhYmxlQmluZGluZ09wZXJhdGlvbnMoQmluZGluZyBiaW5kaW5nKSB7Ci0gICAgICAgIC8vIGZpcnN0IGZpbmQgdGhlIGdsb2JhbCBzdHlsZSBkZWNsYXJhdGlvbi4KLSAgICAgICAgLy8gZm9yIGEgU09BUCBiaW5kaW5nIHRoaXMgY2FuIGJlIG9ubHkgcnBjIG9yIGRvY3VtZW50Ci0gICAgICAgIC8vIGFzIHBlciB0aGUgV1NETCBzcGVjIChzZWN0aW9uIDMuNCkgdGhlIGRlZmF1bHQgc3R5bGUgaXMgZG9jdW1lbnQKLQotICAgICAgICAvLyBub3cgd2UgaGF2ZSB0byBoYW5kbGUgdGhlIGh0dHAgYmluZGluZ3MgY2FzZSBhcyB3ZWxsCi0gICAgICAgIC8vCi0KLSAgICAgICAgYm9vbGVhbiBpc1JQQyA9IGZhbHNlOwotICAgICAgICBib29sZWFuIGlzU09BUEJpbmRpbmcgPSBmYWxzZTsKLSAgICAgICAgYm9vbGVhbiBpc0h0dHBCaW5kaW5nID0gZmFsc2U7Ci0KLSAgICAgICAgTGlzdCBleHRFbGVtZW50cyA9IGJpbmRpbmcuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXh0RWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChleHRFbGVtZW50cy5nZXQoaSkgaW5zdGFuY2VvZiBTT0FQQmluZGluZykgewotICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgYSBnbG9iYWwgU09BUCBiaW5kaW5nIQotICAgICAgICAgICAgICAgIGlzU09BUEJpbmRpbmcgPSB0cnVlOwotICAgICAgICAgICAgICAgIFNPQVBCaW5kaW5nIHNvYXBCaW5kaW5nID0gKFNPQVBCaW5kaW5nKSBleHRFbGVtZW50cy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgaWYgKFJQQ19TVFlMRS5lcXVhbHMoc29hcEJpbmRpbmcuZ2V0U3R5bGUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gc2V0IHRoZSBnbG9iYWwgc3R5bGUgdG8gcnBjCi0gICAgICAgICAgICAgICAgICAgIGlzUlBDID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdGhpcy5iaW5kaW5nVHlwZSA9IEJJTkRJTkdfVFlQRV9TT0FQOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfSBlbHNlIGlmIChleHRFbGVtZW50cy5nZXQoaSkgaW5zdGFuY2VvZiBTT0FQMTJCaW5kaW5nKSB7Ci0gICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSBhIGdsb2JhbCBTT0FQIGJpbmRpbmchCi0gICAgICAgICAgICAgICAgaXNTT0FQQmluZGluZyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgU09BUDEyQmluZGluZyBzb2FwQmluZGluZyA9IChTT0FQMTJCaW5kaW5nKSBleHRFbGVtZW50cy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgaWYgKFJQQ19TVFlMRS5lcXVhbHMoc29hcEJpbmRpbmcuZ2V0U3R5bGUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gc2V0IHRoZSBnbG9iYWwgc3R5bGUgdG8gcnBjCi0gICAgICAgICAgICAgICAgICAgIGlzUlBDID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdGhpcy5iaW5kaW5nVHlwZSA9IEJJTkRJTkdfVFlQRV9TT0FQOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfSBlbHNlIGlmIChleHRFbGVtZW50cy5nZXQoaSkgaW5zdGFuY2VvZiBIVFRQQmluZGluZykgewotICAgICAgICAgICAgICAgIGlzSHR0cEJpbmRpbmcgPSB0cnVlOwotICAgICAgICAgICAgICAgIHRoaXMuYmluZGluZ1R5cGUgPSBCSU5ESU5HX1RZUEVfSFRUUDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIkJpbmRpbmcgTmFtZSAgICA9IiArIGJpbmRpbmcuZ2V0UU5hbWUoKSk7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIiAgaXNTT0FQQmluZGluZyA9IiArIGlzU09BUEJpbmRpbmcgKTsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiICBpc0h0dHBCaW5kaW5nID0iICsgaXNIdHRwQmluZGluZyApOwotICAgICAgICAgICAgbG9nLmRlYnVnKCIgIGlzUlBDICAgICAgICAgPSIgKyBpc1JQQyApOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZ28gdGhyb3VnaCBldmVyeSBvcGVyYXRpb24gYW5kIGdldCB0aGVpciBzdHlsZXMuCi0gICAgICAgIC8vIGVhY2ggb25lIGNhbiBoYXZlIGEgc3R5bGUgb3ZlcnJpZGUgZnJvbSB0aGUgZ2xvYmFsCi0gICAgICAgIC8vIHN0eWxlcy4gRGVwZW5kaW5nIG9uIHRoZSBzdHlsZSBhZGQgdGhlIHJlbGV2YW50IG9wZXJhdGlvbnMKLSAgICAgICAgLy8gdG8gdGhlIHJldHVybiBsaXN0Ci0gICAgICAgIExpc3QgcmV0dXJuTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgICAgICBpZiAoaXNIdHRwQmluZGluZyB8fCBpc1NPQVBCaW5kaW5nKSB7Ci0gICAgICAgICAgICBCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcDsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgYmluZGluZ09wZXJhdGlvbnNJdGVyYXRvciA9Ci0gICAgICAgICAgICAgICAgICAgIGJpbmRpbmcuZ2V0QmluZGluZ09wZXJhdGlvbnMoKS5pdGVyYXRvcigpOyBiaW5kaW5nT3BlcmF0aW9uc0l0ZXJhdG9yLmhhc05leHQoKTspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYmluZGluZ09wID0gKEJpbmRpbmdPcGVyYXRpb24pIGJpbmRpbmdPcGVyYXRpb25zSXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIiAgQmluZGluZyBPcGVyYXRpb24gID0iICsgYmluZGluZ09wLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChpc1NPQVBCaW5kaW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBzdHlsZSA9IGdldFNPQVBTdHlsZShiaW5kaW5nT3ApOwotICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiICAgIFNPQVBTdHlsZSAgPSIgKyBzdHlsZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0eWxlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vIHN0eWxlIHNwZWNpZmllZAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXNlIHRoZSBnbG9iYWwgc3R5bGUgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdG8gcHV0IHRoaXMgb25lIG9yCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBub3QKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc1JQQykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIiAgICBzY2hlbWEgd3JhcHBlcmluZyByZXF1aXJlZCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaW5kaW5nT3BlcmF0aW9uRW50cnkgYm9lID0gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCaW5kaW5nT3BlcmF0aW9uRW50cnkoYmluZGluZ09wLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5MaXN0LmFkZChib2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFJQQ19TVFlMRS5lcXVhbHMoc3R5bGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGQgdG8gdGhlIGxpc3QKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiICAgIHNjaGVtYSB3cmFwcGVyaW5nIHJlcXVpcmVkIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBCaW5kaW5nT3BlcmF0aW9uRW50cnkgYm9lID0gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJpbmRpbmdPcGVyYXRpb25FbnRyeShiaW5kaW5nT3AsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5MaXN0LmFkZChib2UpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIGlmIG5vdCBSUEMgd2UganVzdCBsZWF2ZSBpdCAtIGRlZmF1bHQgaXMgZG9jCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaS5lIGFuIGh0dHAgYmluZGluZyB0aGVuIHdlIGhhdmUgdG8gYWRkIHRoZSBvcGVyYXRpb24gYW55IHdheQotICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiICAgIHNjaGVtYSB3cmFwcGVyaW5nIHJlcXVpcmVkIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgQmluZGluZ09wZXJhdGlvbkVudHJ5IGJvZSA9IAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJpbmRpbmdPcGVyYXRpb25FbnRyeShiaW5kaW5nT3AsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuTGlzdC5hZGQoYm9lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBpZiB0aGUgYmluZGluZyBpcyBub3QgZWl0aGVyIHNvYXAgb3IgaHR0cCBiaW5kaW5nIHRoZW4gd2UgcmV0dXJuIGFuZCBlbXB0eSBsaXN0Ci0KLSAgICAgICAgLy8gc2V0IHRoaXMgdG8gdGhlIGdsb2JhbCBsaXN0Ci0gICAgICAgIHdyYXBwYWJsZUJPRXMgPSByZXR1cm5MaXN0OwotICAgICAgICByZXR1cm4gcmV0dXJuTGlzdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHdWVzcyB0aGUgTUVQIGJhc2VkIG9uIHRoZSBvcmRlciBvZiBtZXNzYWdlcwotICAgICAqCi0gICAgICogQHBhcmFtIG9wZXJhdGlvbgotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0Ci0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0TUVQKE9wZXJhdGlvbiBvcGVyYXRpb24pIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBPcGVyYXRpb25UeXBlIG9wZXJhdGlvblR5cGUgPSBvcGVyYXRpb24uZ2V0U3R5bGUoKTsKLSAgICAgICAgaWYgKGlzU2VydmVyU2lkZSkgewotICAgICAgICAgICAgaWYgKG9wZXJhdGlvblR5cGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChvcGVyYXRpb25UeXBlLmVxdWFscyhPcGVyYXRpb25UeXBlLlJFUVVFU1RfUkVTUE9OU0UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBXU0RMMkNvbnN0YW50cy5NRVBfVVJJX0lOX09VVDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAob3BlcmF0aW9uVHlwZS5lcXVhbHMoT3BlcmF0aW9uVHlwZS5PTkVfV0FZKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAob3BlcmF0aW9uLmdldEZhdWx0cygpLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBXU0RMMkNvbnN0YW50cy5NRVBfVVJJX1JPQlVTVF9JTl9PTkxZOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBXU0RMMkNvbnN0YW50cy5NRVBfVVJJX0lOX09OTFk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG9wZXJhdGlvblR5cGUuZXF1YWxzKE9wZXJhdGlvblR5cGUuTk9USUZJQ0FUSU9OKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gV1NETDJDb25zdGFudHMuTUVQX1VSSV9PVVRfT05MWTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAob3BlcmF0aW9uVHlwZS5lcXVhbHMoT3BlcmF0aW9uVHlwZS5TT0xJQ0lUX1JFU1BPTlNFKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gV1NETDJDb25zdGFudHMuTUVQX1VSSV9PVVRfSU47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoIkNhbm5vdCBEZXRlcm1pbmUgdGhlIE1FUCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKG9wZXJhdGlvblR5cGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChvcGVyYXRpb25UeXBlLmVxdWFscyhPcGVyYXRpb25UeXBlLlJFUVVFU1RfUkVTUE9OU0UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBXU0RMMkNvbnN0YW50cy5NRVBfVVJJX09VVF9JTjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAob3BlcmF0aW9uVHlwZS5lcXVhbHMoT3BlcmF0aW9uVHlwZS5PTkVfV0FZKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gV1NETDJDb25zdGFudHMuTUVQX1VSSV9PVVRfT05MWTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAob3BlcmF0aW9uVHlwZS5lcXVhbHMoT3BlcmF0aW9uVHlwZS5OT1RJRklDQVRJT04pKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBXU0RMMkNvbnN0YW50cy5NRVBfVVJJX0lOX09OTFk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG9wZXJhdGlvblR5cGUuZXF1YWxzKE9wZXJhdGlvblR5cGUuU09MSUNJVF9SRVNQT05TRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFdTREwyQ29uc3RhbnRzLk1FUF9VUklfSU5fT1VUOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJDYW5ub3QgRGV0ZXJtaW5lIHRoZSBNRVAiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJDYW5ub3QgRGV0ZXJtaW5lIHRoZSBNRVAiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb3BpZXMgdGhlIGV4dGVuc2lvbiBhdHRyaWJ1dGVzCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZXh0QXR0cmlidXRlcwotICAgICAqIEBwYXJhbSBkZXNjcmlwdGlvbgotICAgICAqIEBwYXJhbSBvcmlnaW4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY29weUV4dGVuc2lvbkF0dHJpYnV0ZXMoTWFwIGV4dEF0dHJpYnV0ZXMsCi0JCQlBeGlzRGVzY3JpcHRpb24gZGVzY3JpcHRpb24sIFN0cmluZyBvcmlnaW4pIHsKLQotCQlRTmFtZSBrZXk7Ci0JCVFOYW1lIHZhbHVlOwotCi0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBleHRBdHRyaWJ1dGVzLmtleVNldCgpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCWtleSA9IChRTmFtZSkgaXRlcmF0b3IubmV4dCgpOwotCi0JCQlpZiAoQ29uc3RhbnRzLlVSSV9QT0xJQ1lfTlMuZXF1YWxzKGtleS5nZXROYW1lc3BhY2VVUkkoKSkKLQkJCQkJJiYgIlBvbGljeVVSSXMiLmVxdWFscyhrZXkuZ2V0TG9jYWxQYXJ0KCkpKSB7Ci0KLQkJCQl2YWx1ZSA9IChRTmFtZSkgZXh0QXR0cmlidXRlcy5nZXQoa2V5KTsKLQkJCQlTdHJpbmcgcG9saWN5VVJJcyA9IHZhbHVlLmdldExvY2FsUGFydCgpOwotCi0JCQkJaWYgKHBvbGljeVVSSXMubGVuZ3RoKCkgIT0gMCkgewotCQkJCQlTdHJpbmdbXSB1cmlzID0gcG9saWN5VVJJcy5zcGxpdCgiICIpOwotCi0JCQkJCVBvbGljeVJlZmVyZW5jZSByZWY7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdXJpcy5sZW5ndGg7IGkrKykgewotCQkJCQkJcmVmID0gbmV3IFBvbGljeVJlZmVyZW5jZSgpOwotCQkJCQkJcmVmLnNldFVSSSh1cmlzW2ldKTsKLQotCQkJCQkJaWYgKFBPUlRfVFlQRS5lcXVhbHMob3JpZ2luKQotCQkJCQkJICAgICAgICB8fCBQT1JUX1RZUEVfT1BFUkFUSU9OLmVxdWFscyhvcmlnaW4pCi0JCQkJCQkgICAgICAgIHx8IFBPUlRfVFlQRV9PUEVSQVRJT05fSU5QVVQuZXF1YWxzKG9yaWdpbikgCi0JCQkJCQkgICAgICAgIHx8IFBPUlRfVFlQRV9PUEVSQVRJT05fT1VUUFVULmVxdWFscyhvcmlnaW4pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgCi0JCQkJCQkgICAgaWYgKGRlc2NyaXB0aW9uICE9IG51bGwpIHsKLQkJCQkJCSAgICAgICAgUG9saWN5U3ViamVjdCBzdWJqZWN0ID0gZGVzY3JpcHRpb24uZ2V0UG9saWN5U3ViamVjdCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkJCQkJCSAgICAgICAgaWYgKHN1YmplY3QgIT0gbnVsbCkgewotCQkJCQkJICAgICAgICAgICAgc3ViamVjdC5hdHRhY2hQb2xpY3lSZWZlcmVuY2UocmVmKTsKLQkJCQkJCSAgICAgICAgfQotCQkJCQkJICAgIH0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotICAgIC8qKgotCSAqIFByb2Nlc3MgdGhlIHBvbGljeSBkZWZpbml0aW9ucwotCSAqIAotCSAqIEBwYXJhbSBkZWZpbml0aW9uCi0JICovCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NQb2xpY2llc0luRGVmaW50aW9uKERlZmluaXRpb24gZGVmaW5pdGlvbikgewotICAgICAgICBwcm9jZXNzUG9saWNpZXNJbkRlZmludGlvbihkZWZpbml0aW9uLCBuZXcgSGFzaFNldCgpKTsKLSAgICB9Ci0KLSAgICAvKioKLQkgKiBQcm9jZXNzIHRoZSBwb2xpY3kgZGVmaW5pdGlvbnMKLQkgKiAKLQkgKiBAcGFyYW0gZGVmaW5pdGlvbgotCSAqLwotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzUG9saWNpZXNJbkRlZmludGlvbihEZWZpbml0aW9uIGRlZmluaXRpb24sIFNldCB2aXNpdGVkV1NETHMpIHsKLSAgICAgICAgdmlzaXRlZFdTRExzLmFkZChkZWZpbml0aW9uLmdldERvY3VtZW50QmFzZVVSSSgpKTsKLSAgICAgICAgTGlzdCBleHRFbGVtZW50cyA9IGRlZmluaXRpb24uZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IGV4dEVsZW1lbnQ7Ci0gICAgICAgIFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCB1bmtub3duID0gbnVsbDsKLSAgICAgICAgUG9saWN5IHBvbGljeSA9IG51bGw7Ci0KLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGV4dEVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIGV4dEVsZW1lbnQgPSAoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpIGl0ZXJhdG9yLm5leHQoKTsKLQotICAgICAgICAgICAgaWYgKGV4dEVsZW1lbnQgaW5zdGFuY2VvZiBVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQpIHsKLSAgICAgICAgICAgICAgICB1bmtub3duID0gKFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCkgZXh0RWxlbWVudDsKLSAgICAgICAgICAgICAgICBpZiAoV1NETENvbnN0YW50cy5XU0RMMTFDb25zdGFudHMuUE9MSUNZLmVxdWFscyh1bmtub3duLmdldEVsZW1lbnRUeXBlKCkpKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgcG9saWN5ID0gKFBvbGljeSkgUG9saWN5VXRpbC5nZXRQb2xpY3lDb21wb25lbnQodW5rbm93bi5nZXRFbGVtZW50KCkpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcga2V5OwotICAgICAgICAgICAgICAgICAgICBpZiAoKGtleSA9IHBvbGljeS5nZXROYW1lKCkpICE9IG51bGwgfHwgKGtleSA9IHBvbGljeS5nZXRJZCgpKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIAlheGlzU2VydmljZS5yZWdpc3RlclBvbGljeShrZXksIHBvbGljeSk7Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyKGtleSwgcG9saWN5KTsKLS8vICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0cnkucmVnaXN0ZXIoIiMiICsga2V5LCBwb2xpY3kpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gaW5jbHVkZSBwb2xpY2ljZXMgaW4gb3RoZXIgaW1wb3J0ZWQgd3NkbHMKLSAgICAgICAgSXRlcmF0b3IgaXRlciA9IGRlZmluaXRpb24uZ2V0SW1wb3J0cygpLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgICAgIFZlY3RvciB2YWx1ZXMgPSBudWxsOwotICAgICAgICBJbXBvcnQgd3NkbEltcG9ydCA9IG51bGw7Ci0gICAgICAgIGZvciAoOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIHZhbHVlcyA9IChWZWN0b3IpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgZm9yIChJdGVyYXRvciB2YWx1ZXNJdGVyID0gdmFsdWVzLml0ZXJhdG9yKCk7IHZhbHVlc0l0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIHdzZGxJbXBvcnQgPSAoSW1wb3J0KSB2YWx1ZXNJdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBEZWZpbml0aW9uIGlubmVyRGVmaW5pdGlvbiA9IHdzZGxJbXBvcnQuZ2V0RGVmaW5pdGlvbigpOwotICAgICAgICAgICAgICAgIC8vIGZpbmQgdGhlIGJpbmRpbmcgcmVjdXJzaXZlbHkKLSAgICAgICAgICAgICAgICBpZighdmlzaXRlZFdTRExzLmNvbnRhaW5zKGlubmVyRGVmaW5pdGlvbi5nZXREb2N1bWVudEJhc2VVUkkoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc1BvbGljaWVzSW5EZWZpbnRpb24oaW5uZXJEZWZpbml0aW9uLCB2aXNpdGVkV1NETHMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgc2V0RW5kcG9pbnRVUkwoQXhpc0VuZHBvaW50IGF4aXNFbmRwb2ludCwgU3RyaW5nIGVuZHBvaW50VVJMKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAJYXhpc0VuZHBvaW50LnNldEVuZHBvaW50VVJMKGVuZHBvaW50VVJMKTsKLSAgICAJdHJ5IHsKLSAgICAJCVVSTCB1cmwgPSBuZXcgVVJMKGVuZHBvaW50VVJMKTsKLSAgICAJCWF4aXNFbmRwb2ludC5zZXRUcmFuc3BvcnRJbkRlc2NyaXB0aW9uKHVybC5nZXRQcm90b2NvbCgpKTsKLSAgICAJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAJCWxvZy5kZWJ1ZyhlLmdldE1lc3NhZ2UoKSxlKTsKLQkJfSAgICAJCi0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBJbm5lciBjbGFzcyBkZWNsYXJhdGlvbiBmb3IgdGhlIHByb2Nlc3NpbmcgZXhjZXB0aW9ucwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgV1NETFByb2Nlc3NpbmdFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKLSAgICAgICAgcHVibGljIFdTRExQcm9jZXNzaW5nRXhjZXB0aW9uKCkgewotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFdTRExQcm9jZXNzaW5nRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgICAgICBzdXBlcihtZXNzYWdlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBXU0RMUHJvY2Vzc2luZ0V4Y2VwdGlvbihUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgICAgIHN1cGVyKGNhdXNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBXU0RMUHJvY2Vzc2luZ0V4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGNhdXNlKSB7Ci0gICAgICAgICAgICBzdXBlcihtZXNzYWdlLCBjYXVzZSk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQWxsUG9ydHMoKSB7Ci0gICAgICAgIHJldHVybiBpc0FsbFBvcnRzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEFsbFBvcnRzKGJvb2xlYW4gYWxsUG9ydHMpIHsKLSAgICAgICAgaXNBbGxQb3J0cyA9IGFsbFBvcnRzOwotICAgIH0KLQotLy8gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NQb2xpY2llc0luRGVmaW5pdGlvbigpIHsKLS8vCi0vLyAgICAgICAgT2JqZWN0IG9iajsKLS8vICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gd3NkbDRqRGVmaW5pdGlvbi5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0vLyAgICAgICAgICAgIG9iaiA9IGl0ZXJhdG9yLm5leHQoKTsKLS8vCi0vLyAgICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQpIHsKLS8vICAgICAgICAgICAgICAgIEVsZW1lbnQgZSA9ICgoVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50KSBvYmopLmdldEVsZW1lbnQoKTsKLS8vICAgICAgICAgICAgICAgIGlmIChXU0RMQ29uc3RhbnRzLldTREwxMUNvbnN0YW50cy5QT0xJQ1kuZ2V0TmFtZXNwYWNlVVJJKCkuZXF1YWxzKGUuZ2V0TmFtZXNwYWNlVVJJKCkpICYmCi0vLyAgICAgICAgICAgICAgICAgICAgICAgIFdTRExDb25zdGFudHMuV1NETDExQ29uc3RhbnRzLlBPTElDWS5nZXRMb2NhbFBhcnQoKS5lcXVhbHMoZS5nZXRMb2NhbE5hbWUoKSkpIHsKLS8vICAgICAgICAgICAgICAgICAgICBQb2xpY3kgcCA9IChQb2xpY3kpIFBvbGljeVV0aWwuZ2V0UG9saWN5Q29tcG9uZW50KGUpOwotLy8gICAgICAgICAgICAgICAgICAgIHJlZy5yZWdpc3RlcihwLmdldElkKCksIHApOwotLy8gICAgICAgICAgICAgICAgfQotLy8gICAgICAgICAgICB9Ci0vLyAgICAgICAgfQotLy8gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgaXMgdG8gc3BsaXQgYXR0cmlidXRlIGxpa2UgYWJjOmNkZSBhbmQgZ2V0IHRoZSBwcmVmaXggcGFydCBvZiBpdAotICAgICAqIHNvIHRoZSBtZXRob2Qgd2lsbCByZXR1ZW4gYWJjIGlmIHRoZSAiOiIgaXMgcHJlc2VudCBpbiB0aGUgdGhlIHN0cmluZyBlbHNlIGl0Ci0gICAgICogd2lsbCByZXR1cm4gbnVsbAotICAgICAqCi0gICAgICogQHBhcmFtIGF0dHJpYnV0ZVZhbHVlICA6IFN0cmluZwotICAgICAqIEByZXR1cm4gU3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UHJlZml4KFN0cmluZyBhdHRyaWJ1dGVWYWx1ZSkgewotICAgICAgICBpZiAoYXR0cmlidXRlVmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgaW50IHNwbGl0SWRleCA9IGF0dHJpYnV0ZVZhbHVlLmluZGV4T2YoJzonKTsKLSAgICAgICAgICAgIGlmIChzcGxpdElkZXggPiAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZVZhbHVlLnN1YnN0cmluZygwLCBzcGxpdElkZXgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFR5cGVOYW1lKFN0cmluZyBhdHRyaWJ1dGVWYWx1ZSkgewotICAgICAgICBpZiAoYXR0cmlidXRlVmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgaW50IHNwbGl0SWRleCA9IGF0dHJpYnV0ZVZhbHVlLmluZGV4T2YoJzonKTsKLSAgICAgICAgICAgIGlmIChzcGxpdElkZXggPiAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZVZhbHVlLnN1YnN0cmluZyhzcGxpdElkZXggKyAxKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZVZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHJldHVybnMgdGhlIHdzbGQgZGVmaW50aW9uIGZvciB0aGUgZ2l2ZW4gY29tcG9uZW50LgotICAgICAqIEBwYXJhbSBkZWZpbml0aW9uCi0gICAgICogQHBhcmFtIHFuYW1lCi0gICAgICogQHBhcmFtIGNvbXBvbmVudFR5cGUKLSAgICAgKiBAcGFyYW0gdmlzaXRlZFdTRExzCi0gICAgICogQHJldHVybiBkZWZpbml0aW9uIGNvbnRhaW5pbmcgdGhlIGNvbXBvbmVudC4KLSAgICAgKi8KLSAgICBwcml2YXRlIERlZmluaXRpb24gZ2V0UGFyZW50RGVmaW5pdGlvbihEZWZpbml0aW9uIGRlZmluaXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUU5hbWUgcW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbXBvbmVudFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0IHZpc2l0ZWRXU0RMcyl7Ci0gICAgICAgIHZpc2l0ZWRXU0RMcy5hZGQoZGVmaW5pdGlvbi5nZXREb2N1bWVudEJhc2VVUkkoKSk7Ci0gICAgICAgIERlZmluaXRpb24gbmV3UGFyZW50RGVmaW5pdGlvbiA9IG51bGw7Ci0gICAgICAgIC8vIGZpcnN0IGZpbmQgdGhyb3VnaCBpbXBvcnRzCi0gICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSBkZWZpbml0aW9uLmdldEltcG9ydHMoKS52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgICAgICBWZWN0b3IgdmFsdWVzID0gbnVsbDsKLSAgICAgICAgSW1wb3J0IHdzZGxJbXBvcnQgPSBudWxsOwotICAgICAgICBmb3IgKDsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICB2YWx1ZXMgPSAoVmVjdG9yKSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgdmFsdWVzSXRlciA9IHZhbHVlcy5pdGVyYXRvcigpOyB2YWx1ZXNJdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICB3c2RsSW1wb3J0ID0gKEltcG9ydCkgdmFsdWVzSXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgRGVmaW5pdGlvbiBpbm5lckRlZmluaXRpb24gPSB3c2RsSW1wb3J0LmdldERlZmluaXRpb24oKTsKLSAgICAgICAgICAgICAgICBpZiAoIXZpc2l0ZWRXU0RMcy5jb250YWlucyhpbm5lckRlZmluaXRpb24uZ2V0RG9jdW1lbnRCYXNlVVJJKCkpKXsKLSAgICAgICAgICAgICAgICAgICAgbmV3UGFyZW50RGVmaW5pdGlvbiA9IGdldFBhcmVudERlZmluaXRpb24oaW5uZXJEZWZpbml0aW9uLHFuYW1lLGNvbXBvbmVudFR5cGUsdmlzaXRlZFdTRExzKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1BhcmVudERlZmluaXRpb24gIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChuZXdQYXJlbnREZWZpbml0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGlmIGl0IG5vdCBhdmFpbGFibGUgaW4gaW1wb3J0cyB3ZSBjaGVjayBmb3IgdGhlIGN1cnJlbnQgZGVmaW5pdGlvbi4KLSAgICAgICAgaWYgKG5ld1BhcmVudERlZmluaXRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gdGhpcyBjYW4gYmUgaW4gYSBpbXBvcnRlZCB3c2RsCi0gICAgICAgICAgICBpZiAoaXNDb21wb25ldEF2YWlsYWJsZShkZWZpbml0aW9uLCBxbmFtZSwgY29tcG9uZW50VHlwZSkpIHsKLSAgICAgICAgICAgICAgICBuZXdQYXJlbnREZWZpbml0aW9uID0gZGVmaW5pdGlvbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBuZXdQYXJlbnREZWZpbml0aW9uOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0NvbXBvbmV0QXZhaWxhYmxlKERlZmluaXRpb24gZGVmaW5pdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRTmFtZSBxbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29tcG9uZW50VHlwZSl7Ci0gICAgICAgIGJvb2xlYW4gaXNBdmFpbGFibGUgPSBmYWxzZTsKLSAgICAgICAgc3dpdGNoIChjb21wb25lbnRUeXBlKXsKLSAgICAgICAgICAgIGNhc2UgQ09NUE9ORU5UX0JJTkRJTkcgOiB7Ci0gICAgICAgICAgICAgICAgaXNBdmFpbGFibGUgPSAoZGVmaW5pdGlvbi5nZXRCaW5kaW5nKHFuYW1lKSAhPSBudWxsKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgKGRlZmluaXRpb24uZ2V0QmluZGluZyhxbmFtZSkuZ2V0UG9ydFR5cGUoKSAhPSBudWxsKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgQ09NUE9ORU5UX1BPUlRfVFlQRSA6IHsKLSAgICAgICAgICAgICAgICBpc0F2YWlsYWJsZSA9IChkZWZpbml0aW9uLmdldFBvcnRUeXBlKHFuYW1lKSAhPSBudWxsKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgQ09NUE9ORU5UX01FU1NBR0UgOiB7Ci0gICAgICAgICAgICAgICAgaXNBdmFpbGFibGUgPSAoZGVmaW5pdGlvbi5nZXRNZXNzYWdlKHFuYW1lKSAhPSBudWxsKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXNBdmFpbGFibGU7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEZpbmQgQmluZGluZ09wZXJhdGlvbkVudHJ5Ci0gICAgICogQHBhcmFtIGJvZXMgTGlzdCBvZiBCaW5kaW5nT3BlcmF0aW9uRW50cnkKLSAgICAgKiBAcGFyYW0gYm8gQmluZGluZ09wZXJhdGlvbiAKLSAgICAgKiBAcmV0dXJuIEJpbmRpbmdPcGVyYXRpb24gb3IgbnVsbAotICAgICAqLwotICAgIHByaXZhdGUgQmluZGluZ09wZXJhdGlvbkVudHJ5IGZpbmQoTGlzdCBib2VzLCBCaW5kaW5nT3BlcmF0aW9uIGJvKSB7Ci0gICAgICAgIGZvciAoaW50IGk9MDsgaSA8IGJvZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIEJpbmRpbmdPcGVyYXRpb25FbnRyeSBib2UgPSAoQmluZGluZ09wZXJhdGlvbkVudHJ5KSBib2VzLmdldChpKTsKLSAgICAgICAgICAgIGlmIChib2UuZ2V0QmluZGluZ09wZXJhdGlvbigpID09IGJvKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGJvZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogQmluZGluZ09wZXJhdGlvbiBwbHVzIHN0YXRlIGluZm9ybWF0aW9uCi0gICAgICovCi0gICAgY2xhc3MgQmluZGluZ09wZXJhdGlvbkVudHJ5IHsKLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gaXNTT0FQQmluZGluZzsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGlzSFRUUEJpbmRpbmc7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIHNvYXBTdHlsZTsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGlzUlBDOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gd3JhcHBlZElucHV0ID0gdHJ1ZTsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIHdyYXBwZWRPdXRwdXQgPSB0cnVlOwotICAgICAgICAKLSAgICAgICAgcHVibGljIEJpbmRpbmdPcGVyYXRpb25FbnRyeShCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24sIGJvb2xlYW4gaXNTT0FQQmluZGluZywgYm9vbGVhbiBpc0hUVFBCaW5kaW5nLCBTdHJpbmcgc29hcFN0eWxlLCBib29sZWFuIGlzUlBDKSB7Ci0gICAgICAgICAgICBzdXBlcigpOwotICAgICAgICAgICAgdGhpcy5iaW5kaW5nT3BlcmF0aW9uID0gYmluZGluZ09wZXJhdGlvbjsKLSAgICAgICAgICAgIHRoaXMuaXNTT0FQQmluZGluZyA9IGlzU09BUEJpbmRpbmc7Ci0gICAgICAgICAgICB0aGlzLmlzSFRUUEJpbmRpbmcgPSBpc0hUVFBCaW5kaW5nOwotICAgICAgICAgICAgdGhpcy5zb2FwU3R5bGUgPSBzb2FwU3R5bGU7Ci0gICAgICAgICAgICB0aGlzLmlzUlBDID0gaXNSUEM7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzSFRUUEJpbmRpbmcoKSB7Ci0gICAgICAgICAgICByZXR1cm4gaXNIVFRQQmluZGluZzsKLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1NPQVBCaW5kaW5nKCkgewotICAgICAgICAgICAgcmV0dXJuIGlzU09BUEJpbmRpbmc7Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRTb2FwU3R5bGUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gc29hcFN0eWxlOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1JQQygpIHsKLSAgICAgICAgICAgIHJldHVybiBpc1JQQzsKLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgQmluZGluZ09wZXJhdGlvbiBnZXRCaW5kaW5nT3BlcmF0aW9uKCkgewotICAgICAgICAgICAgcmV0dXJuIGJpbmRpbmdPcGVyYXRpb247Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQHJldHVybiB0cnVlIGlmIHdyYXBwZXIgeHNkIGlzIHVzZWQKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzV3JhcHBlZElucHV0KCkgewotICAgICAgICAgICAgcmV0dXJuIHdyYXBwZWRJbnB1dDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBAcGFyYW0gd3JhcHBlZElucHV0IGluZGljYXRlIGlmIHdyYXBwZXIgeHNkIGlzIG5lZWRlZAotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgc2V0V3JhcHBlZElucHV0KGJvb2xlYW4gd3JhcHBlZElucHV0KSB7Ci0gICAgICAgICAgICB0aGlzLndyYXBwZWRJbnB1dCA9IHdyYXBwZWRJbnB1dDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBAcmV0dXJuIHRydWUgaWYgd3JhcHBlciB4c2QgaXMgbmVlZGVkIGZvciB0aGUgb3V0cHV0IG1lc3NhZ2UKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzV3JhcHBlZE91dHB1dCgpIHsKLSAgICAgICAgICAgIHJldHVybiB3cmFwcGVkT3V0cHV0OwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEBwYXJhbSB3cmFwcGVkT3V0cHV0IGluZGljYXRlIGlmIHdyYXBwZXIgeHNkIGlzIG5lZWRlZCBvbiB0aGUgb3V0cHV0IG1lc3NhZ2UKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFdyYXBwZWRPdXRwdXQoYm9vbGVhbiB3cmFwcGVkT3V0cHV0KSB7Ci0gICAgICAgICAgICB0aGlzLndyYXBwZWRPdXRwdXQgPSB3cmFwcGVkT3V0cHV0OwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL1dTREwyMERlZmF1bHRWYWx1ZUhvbGRlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL1dTREwyMERlZmF1bHRWYWx1ZUhvbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTFkMTRkLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9XU0RMMjBEZWZhdWx0VmFsdWVIb2xkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQMTJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLldTRExDb25zdGFudHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1wdWJsaWMgY2xhc3MgV1NETDIwRGVmYXVsdFZhbHVlSG9sZGVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIE1hcCBkZWZhdWx0VmFsdWVzTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdIVFRQX01FVEhPRF9XU0RMWF9TQUZFID0gIndodHRwOm1ldGhvZFdTRExzYWZlIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXSFRUUF9NRVRIT0RfV1NETFhfTk9UU0FGRSA9ICJ3aHR0cDptZXRob2RXU0RMTm90c2FmZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9XSFRUUF9RVUVSWV9QQVJBTUVURVJfU0VQQVJBVE9SX0RFRkFVTFQgPSAiJiI7Ci0KLQotICAgIHN0YXRpYyB7Ci0gICAgICAgIGRlZmF1bHRWYWx1ZXNNYXAucHV0KFdTREwyQ29uc3RhbnRzLkFUVFJfV1NPQVBfVkVSU0lPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09BUDEyQ29uc3RhbnRzLlNPQVBfRU5WRUxPUEVfTkFNRVNQQUNFX1VSSSk7Ci0gICAgICAgIGRlZmF1bHRWYWx1ZXNNYXAucHV0KFdTREwyQ29uc3RhbnRzLkFUVFJfV1NPQVBfQUNUSU9OLCAiXFxcIlxcXCIiKTsKLSAgICAgICAgZGVmYXVsdFZhbHVlc01hcC5wdXQoV0hUVFBfTUVUSE9EX1dTRExYX1NBRkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uSFRUUF9NRVRIT0RfR0VUKTsKLSAgICAgICAgZGVmYXVsdFZhbHVlc01hcC5wdXQoV0hUVFBfTUVUSE9EX1dTRExYX1NBRkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uSFRUUF9NRVRIT0RfUE9TVCk7Ci0gICAgICAgIGRlZmF1bHRWYWx1ZXNNYXAucHV0KFdTREwyQ29uc3RhbnRzLkFUVFJfV0hUVFBfUVVFUllfUEFSQU1FVEVSX1NFUEFSQVRPUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVRUUl9XSFRUUF9RVUVSWV9QQVJBTUVURVJfU0VQQVJBVE9SX0RFRkFVTFQpOwotICAgICAgICBkZWZhdWx0VmFsdWVzTWFwLnB1dChXU0RMQ29uc3RhbnRzLldTRExfMV8xX1NUWUxFLCBXU0RMQ29uc3RhbnRzLlNUWUxFX0RPQyk7Ci0gICAgICAgIGRlZmF1bHRWYWx1ZXNNYXAucHV0KFdTREwyQ29uc3RhbnRzLkFUVFJfV1NPQVBfTUVQLFdTREwyQ29uc3RhbnRzLk1FUF9VUklfSU5fT1VUKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREZWZhdWx0VmFsdWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgcmV0dXJuIChTdHJpbmcpIGRlZmF1bHRWYWx1ZXNNYXAuZ2V0KG5hbWUpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9XU0RMMjBUb0FsbEF4aXNTZXJ2aWNlc0J1aWxkZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9XU0RMMjBUb0FsbEF4aXNTZXJ2aWNlc0J1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDZhMDJjMy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vV1NETDIwVG9BbGxBeGlzU2VydmljZXNCdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS53b2Rlbi5XU0RMRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUud29kZW4ud3NkbDIwLlNlcnZpY2U7Ci0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogRXh0ZW5kcyB0aGUgV1NETDIwVG9BeGlzU2VydmljZUJ1aWxkZXIgY2xhc3MgdG8gcHJvdmlkZSBmdW5jdGlvbmFsaXR5IHRvIHJldHVybgotICogbXVsdGlwbGUgQXhpc1NlcnZpY2Ugb2JqZWN0czsgb25lIGZvciBlYWNoIGVuZHBvaW50IG9uIGVhY2ggc2VydmljZSBpbiB0aGUgV1NETCAyLjAgZmlsZS4KLSAqLwotcHVibGljIGNsYXNzIFdTREwyMFRvQWxsQXhpc1NlcnZpY2VzQnVpbGRlciBleHRlbmRzIFdTREwyMFRvQXhpc1NlcnZpY2VCdWlsZGVyIHsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIExvZyBsb2cgPQotICAgICAgICAgICAgTG9nRmFjdG9yeS5nZXRMb2coV1NETDIwVG9BbGxBeGlzU2VydmljZXNCdWlsZGVyLmNsYXNzKTsKLQotICAgIHByaXZhdGUgQXJyYXlMaXN0PEF4aXNTZXJ2aWNlPiBheGlzU2VydmljZXMgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogQ2xhc3MgY29uc3RydWN0b3IuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaW4gLSBDb250YWlucyB0aGUgd3NkbCAyLjAgZmlsZQotICAgICAqLwotICAgIHB1YmxpYyBXU0RMMjBUb0FsbEF4aXNTZXJ2aWNlc0J1aWxkZXIoSW5wdXRTdHJlYW0gaW4pIHsKLSAgICAgICAgc3VwZXIoaW4sIG51bGwsIG51bGwpOwotICAgICAgICBheGlzU2VydmljZXMgPSBuZXcgQXJyYXlMaXN0PEF4aXNTZXJ2aWNlPigpOyAgIC8vIGNyZWF0ZSBhbiBlbXB0eSBBcnJheUxpc3QKLSAgICB9Ci0KLSAgICBwdWJsaWMgV1NETDIwVG9BbGxBeGlzU2VydmljZXNCdWlsZGVyKFN0cmluZyB3c2RsVXJpLCBTdHJpbmcgZW5kcG9pbnROYW1lKSB0aHJvd3MgV1NETEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyKHdzZGxVcmksIG51bGwsIGVuZHBvaW50TmFtZSk7Ci0gICAgICAgIGF4aXNTZXJ2aWNlcyA9IG5ldyBBcnJheUxpc3Q8QXhpc1NlcnZpY2U+KCk7ICAgLy8gY3JlYXRlIGFuIGVtcHR5IEFycmF5TGlzdAotICAgIH0KLQotICAgIC8qKgotICAgICAqIFB1YmxpYyBtZXRob2QgdG8gYWNjZXNzIHRoZSB3c2RsIDIuMCBmaWxlIGFuZCBjcmVhdGUgYSBMaXN0IG9mIEF4aXNTZXJ2aWNlIG9iamVjdHMuCi0gICAgICogRm9yIGVhY2ggZW5kcG9pbnQgb24gZWFjaCBzZXJ2aWNlIGluIHRoZSB3c2RsLCBhbiBBeGlzU2VydmljZSBvYmplY3QgaXMgY3JlYXRlZCBhbmQKLSAgICAgKiBhZGRlZCB0byB0aGUgTGlzdC4gIFRoZSBuYW1lIG9mIHRoZSBBeGlzU2VydmljZSBpcyBjaGFuZ2VkIGZyb20gdGhlIHNlcnZpY2UgbmFtZQotICAgICAqIHRvIHRoZSB0aGUgZm9sbG93aW5nOiA8c2VydmljZSBuYW1lPiM8ZW5kcG9pbnQgbmFtZT4uICBOb3RlIHRoYXQgdGhlIGVuZHBvaW50IG5hbWUKLSAgICAgKiBpcyBub3QgdW5pcXVlIHRvIGEgd3NkbCAyLjAgZmlsZS4gIE11bHRpcGxlIHNlcnZpY2VzIGluIHRoZSBmaWxlIG1heSBoYXZlIGVuZHBvaW50cwotICAgICAqIHdpdGggdGhlIHNhbWUgbmFtZS4gIFRoZXJlZm9yZSB0aGUgbmFtZSBvZiB0aGUgQXhpc1NlcnZpY2UgbmVlZHMgdG8gYmUgYSBjb21iaW5hdGlvbgotICAgICAqIG9mIHNlcnZpY2UvZW5kcG9pbnQgbmFtZSB0byBiZSB1bmlxdWUgdG8gdGhlIHdzZGwuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIEEgTGlzdCBjb250YWluaW5nIG9uZSBBeGlzU2VydmljZSBvYmplY3QgZm9yIGVhY2ggcG9ydCBpbiB0aGUgd3NkbCBmaWxlLgotICAgICAqICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIEF4aXNTZXJ2aWNlIGlzIG1vZGlmaWVkIHRvIHVuaXF1ZWx5IHJlcHJlc2VudCB0aGUgc2VydmljZS9lbmRwb2ludAotICAgICAqICAgICAgICAgcGFpci4gIFRoZSBmb3JtYXQgb2YgdGhlIG5hbWUgaXMgIjx3c2RsIHNlcnZpY2UgbmFtZT4jPHdzZGwgZW5kcG9pbnQgbmFtZT4iCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQKLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxBeGlzU2VydmljZT4gcG9wdWxhdGVBbGxTZXJ2aWNlcygpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJFbnRyeTogcG9wdWxhdGVBbGxTZXJ2aWNlcyIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0dXAoKTsgIC8vIHNldHVwIGNvbnRhaW5zIGNvZGUgd2l0aCBnYXRoZXJzIG5vbi1zZXJ2aWNlIHNwZWNpZmljIGluZm8KLSAgICAgICAgICAgIC8vIGZyb20gdGhlIFdTREwuICBUaGlzIG9ubHkgbmVlZHMgdG8gYmUgZG9uZSBvbmNlIHBlciBXU0RMLgotICAgICAgICAgICAgaWYgKGRlc2NyaXB0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJFeGl0OiBwb3B1bGF0ZUFsbFNlcnZpY2VzLiAgd3NkbCBkZXNjcmlwdGlvbiBpcyBudWxsISIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsgICAvLyBjYW4ndCBnbyBhbnkgZnVydGhlciB3aXRob3V0IHRoZSB3c2RsCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTZXJ2aWNlW10gc2VydmljZXMgPSBkZXNjcmlwdGlvbi5nZXRTZXJ2aWNlcygpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXJ2aWNlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IHNlcnZpY2VzW2ldOwotICAgICAgICAgICAgICAgIC8vIHNldCB0aGUgc2VydmljZU5hbWUgb24gdGhlIHBhcmVudCB0byBzZXR1cCBjYWxsIHRvIHBvcHVsYXRlU2VydmljZQotICAgICAgICAgICAgICAgIHNlcnZpY2VOYW1lID0gc2VydmljZS5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgdGhpcy5heGlzU2VydmljZSA9IG5ldyBBeGlzU2VydmljZSgpOwotICAgICAgICAgICAgICAgICAgICBBeGlzU2VydmljZSByZXRBeGlzU2VydmljZSA9IHBvcHVsYXRlU2VydmljZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAocmV0QXhpc1NlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgYXhpc1NlcnZpY2VzLmFkZChyZXRBeGlzU2VydmljZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gLy8gZW5kIGlmIGF4aXNTZXJ2aWNlIHdhcyByZXR1cm5lZAotICAgICAgICAgICAgICAgIH0gLy8gZW5kIGZvciBhbGwgcG9ydHMgb2YgYSBzZXJ2aWNlCi0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkV4aXQ6IHBvcHVsYXRlQWxsU2VydmljZXMuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gYXhpc1NlcnZpY2VzOwotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgZSkgewotICAgICAgICAgICAgdGhyb3cgZTsgIC8vIGp1c3QgcmV0aHJvdyBhbnkgQXhpc0ZhdWx0cwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJwb3B1bGF0ZUFsbFNlcnZpY2VzIGNhdWdodCBFeGNlcHRpb24uICBDb252ZXJ0aW5nIHRvIEF4aXNGYXVsdC4gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICBlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhyb3cgQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL1dTREwyMFRvQXhpc1NlcnZpY2VCdWlsZGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vV1NETDIwVG9BeGlzU2VydmljZUJ1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWIzNjY1YS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vV1NETDIwVG9BeGlzU2VydmljZUJ1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMzUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uOwotCi1pbXBvcnQgY29tLmlibS53c2RsLnV0aWwueG1sLkRPTTJXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVAxMUNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUDEyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIubmFtZXNwYWNlLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkhUVFBDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS53b2Rlbi5XU0RMRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUud29kZW4uV1NETFJlYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLndvZGVuLldTRExTb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS53b2Rlbi5YTUxFbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUud29kZW4uaW50ZXJuYWwuRE9NV1NETEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS53b2Rlbi5pbnRlcm5hbC53c2RsMjAuQmluZGluZ0ZhdWx0SW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLndvZGVuLmludGVybmFsLndzZGwyMC5CaW5kaW5nT3BlcmF0aW9uSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLndvZGVuLmludGVybmFsLndzZGwyMC5leHRlbnNpb25zLkludGVyZmFjZU9wZXJhdGlvbkV4dGVuc2lvbnNJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUud29kZW4uaW50ZXJuYWwud3NkbDIwLmV4dGVuc2lvbnMuaHR0cC5IVFRQQmluZGluZ0V4dGVuc2lvbnNJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUud29kZW4uaW50ZXJuYWwud3NkbDIwLmV4dGVuc2lvbnMuaHR0cC5IVFRQSGVhZGVySW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLndvZGVuLmludGVybmFsLndzZGwyMC5leHRlbnNpb25zLnNvYXAuU09BUEJpbmRpbmdFeHRlbnNpb25zSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLndvZGVuLnJlc29sdmVyLlVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUud29kZW4uc2NoZW1hLlNjaGVtYTsKLWltcG9ydCBvcmcuYXBhY2hlLndvZGVuLnR5cGVzLk5hbWVzcGFjZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUud29kZW4ud3NkbDIwLkJpbmRpbmc7Ci1pbXBvcnQgb3JnLmFwYWNoZS53b2Rlbi53c2RsMjAuQmluZGluZ0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUud29kZW4ud3NkbDIwLkJpbmRpbmdGYXVsdFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLndvZGVuLndzZGwyMC5CaW5kaW5nTWVzc2FnZVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLndvZGVuLndzZGwyMC5CaW5kaW5nT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUud29kZW4ud3NkbDIwLkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUud29kZW4ud3NkbDIwLkVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLndvZGVuLndzZGwyMC5FbmRwb2ludDsKLWltcG9ydCBvcmcuYXBhY2hlLndvZGVuLndzZGwyMC5JbnRlcmZhY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS53b2Rlbi53c2RsMjAuSW50ZXJmYWNlRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS53b2Rlbi53c2RsMjAuSW50ZXJmYWNlRmF1bHRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS53b2Rlbi53c2RsMjAuSW50ZXJmYWNlTWVzc2FnZVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLndvZGVuLndzZGwyMC5JbnRlcmZhY2VPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS53b2Rlbi53c2RsMjAuU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLndvZGVuLndzZGwyMC5lbnVtZXJhdGlvbi5NZXNzYWdlTGFiZWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS53b2Rlbi53c2RsMjAuZXh0ZW5zaW9ucy5odHRwLkhUVFBCaW5kaW5nRmF1bHRFeHRlbnNpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUud29kZW4ud3NkbDIwLmV4dGVuc2lvbnMuaHR0cC5IVFRQQmluZGluZ01lc3NhZ2VSZWZlcmVuY2VFeHRlbnNpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUud29kZW4ud3NkbDIwLmV4dGVuc2lvbnMuaHR0cC5IVFRQQmluZGluZ09wZXJhdGlvbkV4dGVuc2lvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS53b2Rlbi53c2RsMjAuZXh0ZW5zaW9ucy5odHRwLkhUVFBFbmRwb2ludEV4dGVuc2lvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS53b2Rlbi53c2RsMjAuZXh0ZW5zaW9ucy5odHRwLkhUVFBIZWFkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS53b2Rlbi53c2RsMjAuZXh0ZW5zaW9ucy5odHRwLkhUVFBMb2NhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLndvZGVuLndzZGwyMC5leHRlbnNpb25zLnJwYy5Bcmd1bWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLndvZGVuLndzZGwyMC5leHRlbnNpb25zLnJwYy5SUENJbnRlcmZhY2VPcGVyYXRpb25FeHRlbnNpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUud29kZW4ud3NkbDIwLmV4dGVuc2lvbnMuc29hcC5TT0FQQmluZGluZ0V4dGVuc2lvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS53b2Rlbi53c2RsMjAuZXh0ZW5zaW9ucy5zb2FwLlNPQVBCaW5kaW5nRmF1bHRFeHRlbnNpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUud29kZW4ud3NkbDIwLmV4dGVuc2lvbnMuc29hcC5TT0FQQmluZGluZ0ZhdWx0UmVmZXJlbmNlRXh0ZW5zaW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLndvZGVuLndzZGwyMC5leHRlbnNpb25zLnNvYXAuU09BUEJpbmRpbmdNZXNzYWdlUmVmZXJlbmNlRXh0ZW5zaW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLndvZGVuLndzZGwyMC5leHRlbnNpb25zLnNvYXAuU09BUEJpbmRpbmdPcGVyYXRpb25FeHRlbnNpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUud29kZW4ud3NkbDIwLmV4dGVuc2lvbnMuc29hcC5TT0FQRW5kcG9pbnRFeHRlbnNpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUud29kZW4ud3NkbDIwLmV4dGVuc2lvbnMuc29hcC5TT0FQSGVhZGVyQmxvY2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS53b2Rlbi53c2RsMjAuZXh0ZW5zaW9ucy5zb2FwLlNPQVBNb2R1bGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS53b2Rlbi53c2RsMjAueG1sLkRlc2NyaXB0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLndvZGVuLndzZGwyMC54bWwuRG9jdW1lbnRhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLndvZGVuLndzZGwyMC54bWwuRG9jdW1lbnRhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS53b2Rlbi53c2RsMjAueG1sLkludGVyZmFjZU1lc3NhZ2VSZWZlcmVuY2VFbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUud29kZW4ud3NkbDIwLnhtbC5UeXBlc0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS53b2Rlbi54bWwuWE1MQXR0cjsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYTsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLnV0aWxzLk5hbWVzcGFjZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKLQotcHVibGljIGNsYXNzIFdTREwyMFRvQXhpc1NlcnZpY2VCdWlsZGVyIGV4dGVuZHMgV1NETFRvQXhpc1NlcnZpY2VCdWlsZGVyIHsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFdTREwyMFRvQXhpc1NlcnZpY2VCdWlsZGVyLmNsYXNzKTsKLSAgICBwcm90ZWN0ZWQgRGVzY3JpcHRpb24gZGVzY3JpcHRpb247Ci0KLSAgICBwcml2YXRlIFN0cmluZyB3c2RsVVJJOwotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBpbnRlcmZhY2VOYW1lOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgc2F2ZWRUYXJnZXROYW1lc3BhY2U7Ci0KLSAgICBwcml2YXRlIE5hbWVzcGFjZURlY2xhcmF0aW9uW10gbmFtZXNwYWNlbWFwOwotCi0gICAgcHJpdmF0ZSBMaXN0IG9wZXJhdGlvbk5hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgcHJpdmF0ZSBOYW1lc3BhY2VNYXAgc3RyaW5nQmFzZWROYW1lc3BhY2VNYXA7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gc2V0dXBDb21wbGV0ZSA9IGZhbHNlOwotCi0gICAgcHJpdmF0ZSBTZXJ2aWNlIHdzZGxTZXJ2aWNlOwotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzQWxsUG9ydHM7Ci0KLSAgICBwcml2YXRlIFVSSVJlc29sdmVyIGN1c3RvbVdTRExSZXNvbHZlcjsKLQotLy8gICAgQXMgYmluZGluZ3MgYXJlIHByb2Nlc3NlZCBhZGQgaXQgdG8gdGhpcyBhcnJheSBzbyB0aGF0IHdlIGRvbnQgcHJvY2VzcyB0aGUgc2FtZSBiaW5kaW5nIHR3aWNlCi0gICAgcHJpdmF0ZSBNYXAgcHJvY2Vzc2VkQmluZGluZ3M7Ci0KLQotICAgIHB1YmxpYyBXU0RMMjBUb0F4aXNTZXJ2aWNlQnVpbGRlcihJbnB1dFN0cmVhbSBpbiwgUU5hbWUgc2VydmljZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBpbnRlcmZhY2VOYW1lKSB7Ci0gICAgICAgIHRoaXMuaW4gPSBpbjsKLSAgICAgICAgdGhpcy5zZXJ2aWNlTmFtZSA9IHNlcnZpY2VOYW1lOwotICAgICAgICB0aGlzLmludGVyZmFjZU5hbWUgPSBpbnRlcmZhY2VOYW1lOwotICAgICAgICB0aGlzLmF4aXNTZXJ2aWNlID0gbmV3IEF4aXNTZXJ2aWNlKCk7Ci0gICAgICAgIHNldFBvbGljeVJlZ2lzdHJ5RnJvbVNlcnZpY2UoYXhpc1NlcnZpY2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBXU0RMMjBUb0F4aXNTZXJ2aWNlQnVpbGRlcihTdHJpbmcgd3NkbFVyaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUsIFN0cmluZyBpbnRlcmZhY2VOYW1lKSB0aHJvd3MgV1NETEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBmdWxsUGF0aCA9IHdzZGxVcmk7Ci0gICAgICAgIGlmICghd3NkbFVyaS5zdGFydHNXaXRoKCJodHRwOi8vIikpIHsKLSAgICAgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKHdzZGxVcmkpOwotICAgICAgICAgICAgZnVsbFBhdGggPSBmaWxlLmdldEFic29sdXRlUGF0aCgpOwotICAgICAgICB9Ci0gICAgICAgIHNldEJhc2VVcmkoZnVsbFBhdGgpOwotICAgICAgICBEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gcmVhZEluVGhlV1NETEZpbGUoZnVsbFBhdGgpOwotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgYXhpc0ZhdWx0KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgV1NETEV4Y2VwdGlvbigiRVJST1IiLCAiRXhjZXB0aW9uIG9jY3VyZWQgd2hpbGUgcmVhZGluZyBXU0RMIDIuMCBkb2MiLCBheGlzRmF1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgRGVzY3JpcHRpb25FbGVtZW50IGRlc2NyaXB0aW9uRWxlbWVudCA9IGRlc2NyaXB0aW9uLnRvRWxlbWVudCgpOwotICAgICAgICBzYXZlZFRhcmdldE5hbWVzcGFjZSA9IGRlc2NyaXB0aW9uRWxlbWVudC5nZXRUYXJnZXROYW1lc3BhY2UoKQotICAgICAgICAgICAgICAgIC50b1N0cmluZygpOwotICAgICAgICBuYW1lc3BhY2VtYXAgPSBkZXNjcmlwdGlvbkVsZW1lbnQuZ2V0RGVjbGFyZWROYW1lc3BhY2VzKCk7Ci0gICAgICAgIHRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLSAgICAgICAgdGhpcy5zZXJ2aWNlTmFtZSA9IG51bGw7Ci0gICAgICAgIGlmIChuYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNlcnZpY2VOYW1lID0gbmV3IFFOYW1lKGRlc2NyaXB0aW9uRWxlbWVudC5nZXRUYXJnZXROYW1lc3BhY2UoKS50b1N0cmluZygpLCBuYW1lKTsKLSAgICAgICAgfQotICAgICAgICB0aGlzLmludGVyZmFjZU5hbWUgPSBpbnRlcmZhY2VOYW1lOwotICAgICAgICB0aGlzLmF4aXNTZXJ2aWNlID0gbmV3IEF4aXNTZXJ2aWNlKCk7Ci0gICAgICAgIHNldFBvbGljeVJlZ2lzdHJ5RnJvbVNlcnZpY2UoYXhpc1NlcnZpY2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBXU0RMMjBUb0F4aXNTZXJ2aWNlQnVpbGRlcihTdHJpbmcgd3NkbFVyaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUsIFN0cmluZyBpbnRlcmZhY2VOYW1lLCBib29sZWFuIGlzQWxsUG9ydHMpIHRocm93cyBXU0RMRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcyh3c2RsVXJpLCBuYW1lLCBpbnRlcmZhY2VOYW1lKTsKLSAgICAgICAgdGhpcy5pc0FsbFBvcnRzID0gaXNBbGxQb3J0czsKLSAgICB9Ci0KLSAgICBwdWJsaWMgV1NETDIwVG9BeGlzU2VydmljZUJ1aWxkZXIoU3RyaW5nIHdzZGxVcmksIFFOYW1lIHNlcnZpY2VOYW1lKSB7Ci0gICAgICAgIHN1cGVyKG51bGwsIHNlcnZpY2VOYW1lKTsKLSAgICAgICAgdGhpcy53c2RsVVJJID0gd3NkbFVyaTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgV1NETDIwVG9BeGlzU2VydmljZUJ1aWxkZXIoU3RyaW5nIHdzZGxVcmksIEF4aXNTZXJ2aWNlIHNlcnZpY2UpIHsKLSAgICAgICAgc3VwZXIobnVsbCwgc2VydmljZSk7Ci0gICAgICAgIHRoaXMud3NkbFVSSSA9IHdzZGxVcmk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNBbGxQb3J0cygpIHsKLSAgICAgICAgcmV0dXJuIGlzQWxsUG9ydHM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QWxsUG9ydHMoYm9vbGVhbiBhbGxQb3J0cykgewotICAgICAgICBpc0FsbFBvcnRzID0gYWxsUG9ydHM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogc2V0cyBhIGN1c3RvbSBXU0RMIGxvY2F0b3IKLSAgICAgKgotICAgICAqIEBwYXJhbSBjdXN0b21SZXNvbHZlciAtIEEgY3VzdG9tIFJlc29sdmVyIHRoYXQgY2FuIHJlc29sdmUgaW1wb3J0cyBhbmQgaW5jbHVkZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDdXN0b21XU0RMUmVzb2x2ZXIoVVJJUmVzb2x2ZXIgY3VzdG9tUmVzb2x2ZXIpIHsKLSAgICAgICAgdGhpcy5jdXN0b21XU0RMUmVzb2x2ZXIgPSBjdXN0b21SZXNvbHZlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXhpc1NlcnZpY2UgcG9wdWxhdGVTZXJ2aWNlKCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNldHVwKCk7Ci0gICAgICAgICAgICAvLyBTZXR0aW5nIHdzZGw0amRlZmludGlvbiB0byBheGlzU2VydmljZSAsIHNvIGlmIHNvbWUgb25lIHdhbnQKLSAgICAgICAgICAgIC8vIHRvIHBsYXkgd2l0aCBpdCBoZSBjYW4gZG8gdGhhdCBieSBnZXR0aW5nIHRoZSBwYXJhbWV0ZXIKLSAgICAgICAgICAgIFBhcmFtZXRlciB3c2RsRGVzY3JpcHRpb25QYXJhbXRlciA9IG5ldyBQYXJhbWV0ZXIoKTsKLSAgICAgICAgICAgIHdzZGxEZXNjcmlwdGlvblBhcmFtdGVyLnNldE5hbWUoV1NETENvbnN0YW50cy5XU0RMXzIwX0RFU0NSSVBUSU9OKTsKLSAgICAgICAgICAgIHdzZGxEZXNjcmlwdGlvblBhcmFtdGVyLnNldFZhbHVlKGRlc2NyaXB0aW9uKTsKLSAgICAgICAgICAgIGF4aXNTZXJ2aWNlLmFkZFBhcmFtZXRlcih3c2RsRGVzY3JpcHRpb25QYXJhbXRlcik7Ci0KLSAgICAgICAgICAgIGlmIChpc0NvZGVnZW4pIHsKLSAgICAgICAgICAgICAgICBheGlzU2VydmljZS5hZGRQYXJhbWV0ZXIoImlzQ29kZWdlbiIsIEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZGVzY3JpcHRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gc2V0dGluZyB0YXJnZXQgbmFtZSBzcGFjZQotICAgICAgICAgICAgYXhpc1NlcnZpY2Uuc2V0VGFyZ2V0TmFtZXNwYWNlKHNhdmVkVGFyZ2V0TmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgLy8gaWYgdGhlcmUgYXJlIGRvY3VtZW50YXRpb24gZWxlbWVudHMgaW4gdGhlIHJvb3QuIExldHMgYWRkIHRoZW0gYXMgdGhlIHdzZGxTZXJ2aWNlIGRlc2NyaXB0aW9uCi0gICAgICAgICAgICAvLyBidXQgc2luY2UgdGhlcmUgY2FuIGJlIG11bHRpcGxlIGRvY3VtZW50YXRpb24gZWxlbWVudHMsIGxldHMgb25seSBhZGQgdGhlIGZpcnN0IG9uZQotICAgICAgICAgICAgYWRkRG9jdW1lbnRhdGlvbihheGlzU2VydmljZSwgZGVzY3JpcHRpb24udG9FbGVtZW50KCkpOwotLy8gICAgICAgICAgICBEb2N1bWVudGF0aW9uRWxlbWVudFtdIGRvY3VtZW50YXRpb25FbGVtZW50cyA9IGRlc2NyaXB0aW9uLnRvRWxlbWVudCgpLmdldERvY3VtZW50YXRpb25FbGVtZW50cygpOwotLy8gICAgICAgICAgICBpZiAoZG9jdW1lbnRhdGlvbkVsZW1lbnRzICE9IG51bGwgJiYgZG9jdW1lbnRhdGlvbkVsZW1lbnRzLmxlbmd0aCA+IDApIHsKLS8vICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlLnNldFNlcnZpY2VEZXNjcmlwdGlvbihkb2N1bWVudGF0aW9uRWxlbWVudHNbMF0uZ2V0Q29udGVudCgpLnRvU3RyaW5nKCkpOwotLy8gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGFkZGluZyBucyBpbiB0aGUgb3JpZ2luYWwgV1NETAotICAgICAgICAgICAgLy8gcHJvY2Vzc1BvbGljaWVzSW5EZWZpbnRpb24od3NkbDRqRGVmaW5pdGlvbik7IFRPRE8gOiBEZWZlcmluZyBwb2xpY3kgaGFuZGxpbmcgZm9yIG5vdyAtIENoaW50aGFrYQotICAgICAgICAgICAgLy8gcG9saWN5IHN1cHBvcnQKLQotICAgICAgICAgICAgLy8gc2NoZW1hIGdlbmVyYXRpb24KLQotICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBuYW1lc3BhY2VtYXAKLQotICAgICAgICAgICAgYXhpc1NlcnZpY2Uuc2V0TmFtZXNwYWNlTWFwKHN0cmluZ0Jhc2VkTmFtZXNwYWNlTWFwKTsKLSAgICAgICAgICAgIC8vIFR5cGVEZWZpbml0aW9uW10gdHlwZURlZmluaXRpb25zID0KLSAgICAgICAgICAgIC8vIGRlc2NyaXB0aW9uLmdldFR5cGVEZWZpbml0aW9ucygpOwotICAgICAgICAgICAgLy8gZm9yKGludCBpPTA7IGk8dHlwZURlZmluaXRpb25zLmxlbmd0aDsgaSsrKXsKLSAgICAgICAgICAgIC8vIGlmKCJvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hIi5lcXVhbHModHlwZURlZmluaXRpb25zW2ldLmdldENvbnRlbnRNb2RlbCgpKSl7Ci0gICAgICAgICAgICAvLyBheGlzU2VydmljZS5hZGRTY2hlbWEoKFhtbFNjaGVtYSl0eXBlRGVmaW5pdGlvbnNbaV0uZ2V0Q29udGVudCgpKTsKLSAgICAgICAgICAgIC8vIH1lbHNlCi0gICAgICAgICAgICAvLyBpZigib3JnLnczYy5kb20iLmVxdWFscyh0eXBlRGVmaW5pdGlvbnNbaV0uZ2V0Q29udGVudE1vZGVsKCkpKXsKLSAgICAgICAgICAgIC8vIGF4aXNTZXJ2aWNlLmFkZFNjaGVtYShnZXRYTUxTY2hlbWEoKEVsZW1lbnQpdHlwZURlZmluaXRpb25zW2ldLmdldENvbnRlbnQoKSwKLSAgICAgICAgICAgIC8vIG51bGwpKTsKLSAgICAgICAgICAgIC8vIH0KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyB9Ci0KLSAgICAgICAgICAgIERlc2NyaXB0aW9uRWxlbWVudCBkZXNjcmlwdGlvbkVsZW1lbnQgPSBkZXNjcmlwdGlvbi50b0VsZW1lbnQoKTsKLSAgICAgICAgICAgIFR5cGVzRWxlbWVudCB0eXBlc0VsZW1lbnQgPSBkZXNjcmlwdGlvbkVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgLmdldFR5cGVzRWxlbWVudCgpOwotICAgICAgICAgICAgaWYgKHR5cGVzRWxlbWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgU2NoZW1hW10gc2NoZW1hcyA9IHR5cGVzRWxlbWVudC5nZXRTY2hlbWFzKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzY2hlbWFzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIFhtbFNjaGVtYSBzY2hlbWFEZWZpbml0aW9uID0gc2NoZW1hc1tpXS5nZXRTY2hlbWFEZWZpbml0aW9uKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gV1NETCAyLjAgc3BlYyByZXF1aXJlcyB0aGF0IGV2ZW4gdGhlIGJ1aWx0LWluIHNjaGVtYSBzaG91bGQgYmUgcmV0dXJuZWQKLSAgICAgICAgICAgICAgICAgICAgLy8gb25jZSBhc2tlZCBmb3Igc2NoZW1hIGRlZmluaXRpb25zLiBCdXQgZm9yIGRhdGEgYmluZGluZyBwdXJwb3NlcyB3ZSBjYW4gaWdub3JlIHRoYXQKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNjaGVtYURlZmluaXRpb24gIT0gbnVsbCAmJiAhQ29uc3RhbnRzLlVSSV8yMDAxX1NDSEVNQV9YU0QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKHNjaGVtYURlZmluaXRpb24uZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBheGlzU2VydmljZS5hZGRTY2hlbWEoc2NoZW1hRGVmaW5pdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHByb2Nlc3NTZXJ2aWNlKCk7Ci0gICAgICAgICAgICByZXR1cm4gYXhpc1NlcnZpY2U7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBBeGlzRmF1bHQubWFrZUZhdWx0KGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NFbmRwb2ludHMoSW50ZXJmYWNlIHNlcnZpY2VJbnRlcmZhY2UpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBFbmRwb2ludFtdIGVuZHBvaW50cyA9IHdzZGxTZXJ2aWNlLmdldEVuZHBvaW50cygpOwotCi0gICAgICAgIGlmIChlbmRwb2ludHMubGVuZ3RoID09IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoIk5vIGVuZHBvaW50cyBmb3VuZCBpbiB0aGUgV1NETCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvY2Vzc2VkQmluZGluZ3MgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICBFbmRwb2ludCBlbmRwb2ludCA9IG51bGw7Ci0KLSAgICAgICAgLy8gSWYgdGhlIGludGVyZmFjZSBuYW1lIGlzIG5vdCBudWxsIHRoYXRzIG1lYW5zIHRoYXQgdGhpcyBpcyBhIGNhbGwgZnJvbSB0aGUgY29kZWdlbiBlbmdpbmUKLSAgICAgICAgLy8gYW5kIHdlIG5lZWQgdG8gcG9wdWxhdGUgYSBzaW5nbGUgZW5kcG9pbnQuIEhlbmNlIGZpbmQgdGhlIGVuZHBvaW50IGFuZCBwb3B1bGF0ZSBpdC4KLSAgICAgICAgLy8gSWYgdGhhdCB3YXMgbm90IHRoZSBjYXNlIHRoZW4gd2UgbmVlZCB0byBjaGVjayB3aGV0aGVyIHRoZSBjYWxsIGlzIGZyb20gdGhlIGNvZGVnZW4KLSAgICAgICAgLy8gZW5naW5lIHdpdGggdGh3IGFsbHBvcnRzIGNoZWNrIGZhbHNlLiBJZiBpdHMgc28gbm8gbmVlZCB0byBwb3B1bGF0ZSBhbGwgZW5kcG9pbnRzLCB3ZQotICAgICAgICAvLyBzZWxlY3QgYW4gZW5zcG9pbnQgYWNjcmRpbmcgdG8gdGhlIGZvbGxvd2luZyBjcml0ZXJpYS4KLSAgICAgICAgLy8gMS4gRmluZCB0aGUgZmlyc3QgU09BUCAxLjIgZW5kcG9pbnQKLSAgICAgICAgLy8gMi4gRmluZCB0aGUgZmlyc3QgU09BUCAxLjEgZW5kcG9pbnQKLSAgICAgICAgLy8gMy4gVXNlIHRoZSBmaXJzdCBlbmRwb2ludAotICAgICAgICBpZiAodGhpcy5pbnRlcmZhY2VOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZW5kcG9pbnRzLmxlbmd0aDsgKytpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHRoaXMuaW50ZXJmYWNlTmFtZS5lcXVhbHMoZW5kcG9pbnRzW2ldLmdldE5hbWUoKS50b1N0cmluZygpKSkgewotICAgICAgICAgICAgICAgICAgICBlbmRwb2ludCA9IGVuZHBvaW50c1tpXTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAvLyBmb3VuZCBpdC4gIFN0b3AgbG9va2luZwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChlbmRwb2ludCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiTm8gZW5kcG9pbnQgZm91bmQgZm9yIHRoZSBnaXZlbiBuYW1lIDoiCi0gICAgICAgICAgICAgICAgICAgICAgICArIHRoaXMuaW50ZXJmYWNlTmFtZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGF4aXNTZXJ2aWNlCi0gICAgICAgICAgICAgICAgICAgIC5hZGRFbmRwb2ludChlbmRwb2ludC5nZXROYW1lKCkudG9TdHJpbmcoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NFbmRwb2ludChlbmRwb2ludCwgc2VydmljZUludGVyZmFjZSkpOwotICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNDb2RlZ2VuICYmICF0aGlzLmlzQWxsUG9ydHMpIHsKLSAgICAgICAgICAgIEVuZHBvaW50IHNvYXAxMUVuZHBvaW50ID0gbnVsbDsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZW5kcG9pbnRzLmxlbmd0aDsgKytpKSB7Ci0gICAgICAgICAgICAgICAgQmluZGluZyBiaW5kaW5nID0gZW5kcG9pbnRzW2ldLmdldEJpbmRpbmcoKTsKLSAgICAgICAgICAgICAgICBpZiAoV1NETDJDb25zdGFudHMuVVJJX1dTREwyX1NPQVAuZXF1YWxzKGJpbmRpbmcuZ2V0VHlwZSgpLnRvU3RyaW5nKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFNPQVBCaW5kaW5nRXh0ZW5zaW9ucyBzb2FwQmluZGluZ0V4dGVuc2lvbnM7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzb2FwQmluZGluZ0V4dGVuc2lvbnMgPSAoU09BUEJpbmRpbmdFeHRlbnNpb25zSW1wbCkgYmluZGluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Q29tcG9uZW50RXh0ZW5zaW9uQ29udGV4dCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVVJJKFdTREwyQ29uc3RhbnRzLlVSSV9XU0RMMl9TT0FQKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJTb2FwIEJpbmRpbmcgRXh0ZW50aW9uIG5vdCBmb3VuZCIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmICghV1NETDJDb25zdGFudHMuU09BUF9WRVJTSU9OXzFfMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5lcXVhbHMoc29hcEJpbmRpbmdFeHRlbnNpb25zLmdldFNvYXBWZXJzaW9uKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbmRwb2ludCA9IGVuZHBvaW50c1tpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgLy8gZm91bmQgaXQuICBTdG9wIGxvb2tpbmcKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzb2FwMTFFbmRwb2ludCA9PSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNvYXAxMUVuZHBvaW50ID0gZW5kcG9pbnRzW2ldOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGVuZHBvaW50ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBlbmRwb2ludCA9IGVuZHBvaW50c1swXTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYXhpc1NlcnZpY2UKLSAgICAgICAgICAgICAgICAgICAgLmFkZEVuZHBvaW50KGVuZHBvaW50LmdldE5hbWUoKS50b1N0cmluZygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0VuZHBvaW50KGVuZHBvaW50LCBzZXJ2aWNlSW50ZXJmYWNlKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVuZHBvaW50cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlCi0gICAgICAgICAgICAgICAgICAgICAgICAuYWRkRW5kcG9pbnQoZW5kcG9pbnRzW2ldLmdldE5hbWUoKS50b1N0cmluZygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NFbmRwb2ludChlbmRwb2ludHNbaV0sIHNlcnZpY2VJbnRlcmZhY2UpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChlbmRwb2ludCA9PSBudWxsICYmIGVuZHBvaW50cy5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICBlbmRwb2ludCA9IGVuZHBvaW50c1swXTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChlbmRwb2ludCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBheGlzU2VydmljZS5zZXRFbmRwb2ludE5hbWUoZW5kcG9pbnQuZ2V0TmFtZSgpLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgYXhpc1NlcnZpY2Uuc2V0QmluZGluZ05hbWUoZW5kcG9pbnQuZ2V0QmluZGluZygpLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICBheGlzU2VydmljZS5zZXRFbmRwb2ludFVSTChlbmRwb2ludC5nZXRBZGRyZXNzKCkudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc1NlcnZpY2UoKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgU2VydmljZVtdIHNlcnZpY2VzID0gZGVzY3JpcHRpb24uZ2V0U2VydmljZXMoKTsKLSAgICAgICAgaWYgKHNlcnZpY2VzLmxlbmd0aCA9PSAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJObyB3c2RsU2VydmljZSBmb3VuZCBpbiB0aGUgV1NETCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNlcnZpY2VOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VydmljZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoc2VydmljZU5hbWUuZXF1YWxzKHNlcnZpY2VzW2ldLmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgd3NkbFNlcnZpY2UgPSBzZXJ2aWNlc1tpXTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAvLyBmb3VuZCBpdC4gU3RvcCBsb29raW5nLgotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh3c2RsU2VydmljZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiU2VydmljZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBub3QgZm91bmQgaW4gdGhlIFdTREwgOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICArIHNlcnZpY2VOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgd3NkbFNlcnZpY2UgPSBzZXJ2aWNlc1swXTsKLSAgICAgICAgfQotCi0gICAgICAgIGF4aXNTZXJ2aWNlLnNldE5hbWUod3NkbFNlcnZpY2UuZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgSW50ZXJmYWNlIHNlcnZpY2VJbnRlcmZhY2UgPSB3c2RsU2VydmljZS5nZXRJbnRlcmZhY2UoKTsKLSAgICAgICAgYXhpc1NlcnZpY2UuYWRkUGFyYW1ldGVyKG5ldyBQYXJhbWV0ZXIoV1NETDJDb25zdGFudHMuSU5URVJGQUNFX0xPQ0FMX05BTUUsIHNlcnZpY2VJbnRlcmZhY2UuZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpKSk7Ci0gICAgICAgIHByb2Nlc3NJbnRlcmZhY2Uoc2VydmljZUludGVyZmFjZSk7Ci0gICAgICAgIGlmIChpc0NvZGVnZW4pIHsKLSAgICAgICAgICAgIGF4aXNTZXJ2aWNlLnNldE9wZXJhdGlvbnNOYW1lTGlzdChvcGVyYXRpb25OYW1lcyk7Ci0gICAgICAgIH0KLSAgICAgICAgcHJvY2Vzc0VuZHBvaW50cyhzZXJ2aWNlSW50ZXJmYWNlKTsKLQotICAgIH0KLQotICAgIHByaXZhdGUgQXhpc0VuZHBvaW50IHByb2Nlc3NFbmRwb2ludChFbmRwb2ludCBlbmRwb2ludCwgSW50ZXJmYWNlIHNlcnZpY2VJbnRlcmZhY2UpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBBeGlzRW5kcG9pbnQgYXhpc0VuZHBvaW50ID0gbmV3IEF4aXNFbmRwb2ludCgpOwotICAgICAgICBheGlzRW5kcG9pbnQuc2V0UGFyZW50KGF4aXNTZXJ2aWNlKTsKLSAgICAgICAgYXhpc0VuZHBvaW50LnNldE5hbWUoZW5kcG9pbnQuZ2V0TmFtZSgpLnRvU3RyaW5nKCkpOwotICAgICAgICBzZXRFbmRwb2ludFVSTChheGlzRW5kcG9pbnQsIGVuZHBvaW50LmdldEFkZHJlc3MoKS50b1N0cmluZygpKTsKLSAgICAgICAgQmluZGluZyBiaW5kaW5nID0gZW5kcG9pbnQuZ2V0QmluZGluZygpOwotICAgICAgICBBeGlzQmluZGluZyBheGlzQmluZGluZzsKLSAgICAgICAgaWYgKHByb2Nlc3NlZEJpbmRpbmdzLmNvbnRhaW5zS2V5KGJpbmRpbmcuZ2V0TmFtZSgpKSkgewotICAgICAgICAgICAgYXhpc0JpbmRpbmcgPSAoQXhpc0JpbmRpbmcpIHByb2Nlc3NlZEJpbmRpbmdzLmdldChiaW5kaW5nLmdldE5hbWUoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBheGlzQmluZGluZyA9IHByb2Nlc3NCaW5kaW5nKGJpbmRpbmcsIHNlcnZpY2VJbnRlcmZhY2UpOwotICAgICAgICB9Ci0gICAgICAgIGF4aXNFbmRwb2ludC5zZXRCaW5kaW5nKGF4aXNCaW5kaW5nKTsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBiaW5kaW5nVHlwZSA9IGJpbmRpbmcuZ2V0VHlwZSgpLnRvU3RyaW5nKCk7Ci0gICAgICAgIGlmIChiaW5kaW5nVHlwZS5lcXVhbHMoV1NETDJDb25zdGFudHMuVVJJX1dTREwyX1NPQVApKSB7Ci0gICAgICAgICAgICBwcm9jZXNzU09BUEJpbmRpbmdFbmRwb2ludEV4dGVuc2lvbnMoZW5kcG9pbnQsIGF4aXNFbmRwb2ludCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoYmluZGluZ1R5cGUuZXF1YWxzKFdTREwyQ29uc3RhbnRzLlVSSV9XU0RMMl9IVFRQKSkgewotICAgICAgICAgICAgcHJvY2Vzc0hUVFBCaW5kaW5nRW5kcG9pbnRFeHRlbnNpb25zKGVuZHBvaW50LCBheGlzRW5kcG9pbnQpOwotICAgICAgICB9Ci0gICAgICAgIGFkZERvY3VtZW50YXRpb24oYXhpc0VuZHBvaW50LCBlbmRwb2ludC50b0VsZW1lbnQoKSk7Ci0gICAgICAgIHJldHVybiBheGlzRW5kcG9pbnQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NTT0FQQmluZGluZ0VuZHBvaW50RXh0ZW5zaW9ucyhFbmRwb2ludCBlbmRwb2ludCwgQXhpc0VuZHBvaW50IGF4aXNFbmRwb2ludCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIFNPQVBFbmRwb2ludEV4dGVuc2lvbnMgc29hcEVuZHBvaW50RXh0ZW5zaW9uczsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNvYXBFbmRwb2ludEV4dGVuc2lvbnMgPSAoU09BUEVuZHBvaW50RXh0ZW5zaW9ucykgZW5kcG9pbnQKLSAgICAgICAgICAgICAgICAgICAgLmdldENvbXBvbmVudEV4dGVuc2lvbkNvbnRleHQobmV3IFVSSShXU0RMMkNvbnN0YW50cy5VUklfV1NETDJfU09BUCkpOwotICAgICAgICB9IGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiU09BUCBCaW5kaW5nIEVuZHBvaW50IEV4dGVuc2lvbiBub3QgZm91bmQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzb2FwRW5kcG9pbnRFeHRlbnNpb25zICE9IG51bGwpIHsKLSAgICAgICAgICAgIGF4aXNFbmRwb2ludC5zZXRQcm9wZXJ0eShXU0RMMkNvbnN0YW50cy5BVFRSX1dIVFRQX0FVVEhFTlRJQ0FUSU9OX1RZUEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29hcEVuZHBvaW50RXh0ZW5zaW9ucy5nZXRIdHRwQXV0aGVudGljYXRpb25TY2hlbWUoKSk7Ci0gICAgICAgICAgICBheGlzRW5kcG9pbnQuc2V0UHJvcGVydHkoV1NETDJDb25zdGFudHMuQVRUUl9XSFRUUF9BVVRIRU5USUNBVElPTl9SRUFMTSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2FwRW5kcG9pbnRFeHRlbnNpb25zLmdldEh0dHBBdXRoZW50aWNhdGlvblJlYWxtKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NIVFRQQmluZGluZ0VuZHBvaW50RXh0ZW5zaW9ucyhFbmRwb2ludCBlbmRwb2ludCwgQXhpc0VuZHBvaW50IGF4aXNFbmRwb2ludCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIEhUVFBFbmRwb2ludEV4dGVuc2lvbnMgaHR0cEVuZHBvaW50RXh0ZW5zaW9uczsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGh0dHBFbmRwb2ludEV4dGVuc2lvbnMgPSAoSFRUUEVuZHBvaW50RXh0ZW5zaW9ucykgZW5kcG9pbnQKLSAgICAgICAgICAgICAgICAgICAgLmdldENvbXBvbmVudEV4dGVuc2lvbkNvbnRleHQobmV3IFVSSShXU0RMMkNvbnN0YW50cy5VUklfV1NETDJfSFRUUCkpOwotICAgICAgICB9IGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiSFRUUCBCaW5kaW5nIEVuZHBvaW50IEV4dGVuc2lvbiBub3QgZm91bmQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChodHRwRW5kcG9pbnRFeHRlbnNpb25zICE9IG51bGwpIHsKLSAgICAgICAgICAgIGF4aXNFbmRwb2ludC5zZXRQcm9wZXJ0eShXU0RMMkNvbnN0YW50cy5BVFRSX1dIVFRQX0FVVEhFTlRJQ0FUSU9OX1RZUEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cEVuZHBvaW50RXh0ZW5zaW9ucy5nZXRIdHRwQXV0aGVudGljYXRpb25TY2hlbWUoKSk7Ci0gICAgICAgICAgICBheGlzRW5kcG9pbnQuc2V0UHJvcGVydHkoV1NETDJDb25zdGFudHMuQVRUUl9XSFRUUF9BVVRIRU5USUNBVElPTl9SRUFMTSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodHRwRW5kcG9pbnRFeHRlbnNpb25zLmdldEh0dHBBdXRoZW50aWNhdGlvblJlYWxtKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogY29udGFpbnMgYWxsIGNvZGUgd2hpY2ggZ2F0aGVycyBub24td3NkbFNlcnZpY2Ugc3BlY2lmaWMgaW5mb3JtYXRpb24gZnJvbSB0aGUKLSAgICAgKiB3c2RsLgotICAgICAqIDxwLz4KLSAgICAgKiBBZnRlciBhbGwgdGhlIHNldHVwIGNvbXBsZXRlcyBzdWNjZXNzZnVsbHksIHRoZSBzZXR1cENvbXBsZXRlIGZpZWxkIGlzCi0gICAgICogc2V0IHNvIHRoYXQgYW55IHN1YnNlcXVlbnQgY2FsbHMgdG8gc2V0dXAoKSB3aWxsIHJlc3VsdCBpbiBhIG5vLW9wLiBOb3RlCi0gICAgICogdGhhdCBzdWJjbGFzcyBXU0RMMjBUb0FsbEF4aXNTZXJ2aWNlc0J1aWxkZXIgd2lsbCBjYWxsIHBvcHVsYXRlU2VydmljZQotICAgICAqIGZvciBlYWNoIGVuZHBvaW50IGluIHRoZSBXU0RMLiBTZXBhcmF0aW5nIHRoZSBub24td3NkbFNlcnZpY2Ugc3BlY2lmaWMKLSAgICAgKiBpbmZvcm1hdGlvbiBoZXJlIGFsbG93cyBXU0RMMjBUb0FsbEF4aXNTZXJ2aWNlc0J1aWxkZXIgdG8gb25seSBkbyB0aGlzCi0gICAgICogd29yayAxIHRpbWUgcGVyIFdTREwsIGluc3RlYWQgb2YgZm9yIGVhY2ggZW5kcG9pbnQgb24gZWFjaCB3c2RsU2VydmljZS4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0IC0gVGhyb3duIGluIGNhc2UgdGhlIG5lY2Vzc2FyeSByZXNvdXJjZXMgYXJlIG5vdCBhdmFpbGFibGUgaW4gdGhlIFdTREwKLSAgICAgKiBAdGhyb3dzIFdTRExFeGNlcHRpb24gLSBUaHJvd24gaW4gY2FzZSBXb2RlbiB0aHJvd3MgYW4gZXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0dXAoKSB0aHJvd3MgQXhpc0ZhdWx0LCBXU0RMRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHNldHVwQ29tcGxldGUpIHsgLy8gYWxyZWFkeSBzZXR1cCwganVzdCBkbyBub3RoaW5nIGFuZCByZXR1cm4KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKGRlc2NyaXB0aW9uID09IG51bGwpIHsKLQotICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uOwotICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uRWxlbWVudCBkZXNjcmlwdGlvbkVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgaWYgKHdzZGxVUkkgIT0gbnVsbCAmJiAhIiIuZXF1YWxzKHdzZGxVUkkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gcmVhZEluVGhlV1NETEZpbGUod3NkbFVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uRWxlbWVudCA9IGRlc2NyaXB0aW9uLnRvRWxlbWVudCgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaW4gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiA9IHJlYWRJblRoZVdTRExGaWxlKGluKTsKLSAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb25FbGVtZW50ID0gZGVzY3JpcHRpb24udG9FbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiTm8gcmVzb3VyY2VzIGZvdW5kIHRvIHJlYWQgdGhlIHdzZGwiKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBzYXZlZFRhcmdldE5hbWVzcGFjZSA9IGRlc2NyaXB0aW9uRWxlbWVudC5nZXRUYXJnZXROYW1lc3BhY2UoKS50b1N0cmluZygpOwotICAgICAgICAgICAgICAgIG5hbWVzcGFjZW1hcCA9IGRlc2NyaXB0aW9uRWxlbWVudC5nZXREZWNsYXJlZE5hbWVzcGFjZXMoKTsKLSAgICAgICAgICAgICAgICB0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgbmFtZXNwYWNlbWFwCi0KLSAgICAgICAgICAgIHN0cmluZ0Jhc2VkTmFtZXNwYWNlTWFwID0gbmV3IE5hbWVzcGFjZU1hcCgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lc3BhY2VtYXAubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBOYW1lc3BhY2VEZWNsYXJhdGlvbiBuYW1lc3BhY2VEZWNsYXJhdGlvbiA9IG5hbWVzcGFjZW1hcFtpXTsKLSAgICAgICAgICAgICAgICBzdHJpbmdCYXNlZE5hbWVzcGFjZU1hcC5wdXQobmFtZXNwYWNlRGVjbGFyYXRpb24uZ2V0UHJlZml4KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZURlY2xhcmF0aW9uLmdldE5hbWVzcGFjZVVSSSgpLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzZXR1cENvbXBsZXRlID0gdHJ1ZTsKLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGUpIHsKLSAgICAgICAgICAgIHRocm93IGU7IC8vIGp1c3QgcmV0aHJvdyBBeGlzRmF1bHRzCi0gICAgICAgIH0gY2F0Y2ggKFdTRExFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gUHJlc2VydmUgdGhlIFdTRExFeGNlcHRpb24KLSAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEF4aXNGYXVsdC5tYWtlRmF1bHQoZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIEF4aXNCaW5kaW5nIHByb2Nlc3NCaW5kaW5nKEJpbmRpbmcgYmluZGluZywgSW50ZXJmYWNlIHNlcnZpY2VJbnRlcmZhY2UpCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgQXhpc0JpbmRpbmcgYXhpc0JpbmRpbmcgPSBuZXcgQXhpc0JpbmRpbmcoKTsKLSAgICAgICAgYXhpc0JpbmRpbmcuc2V0TmFtZShiaW5kaW5nLmdldE5hbWUoKSk7Ci0gICAgICAgIFN0cmluZyBiaW5kaW5nVHlwZSA9IGJpbmRpbmcuZ2V0VHlwZSgpLnRvU3RyaW5nKCk7Ci0gICAgICAgIGF4aXNCaW5kaW5nLnNldFR5cGUoYmluZGluZ1R5cGUpOwotCi0gICAgICAgIGlmIChiaW5kaW5nVHlwZS5lcXVhbHMoV1NETDJDb25zdGFudHMuVVJJX1dTREwyX1NPQVApKSB7Ci0gICAgICAgICAgICBwcm9jZXNzU09BUEJpbmRpbmdFeHRlbnRpb24oYmluZGluZywgYXhpc0JpbmRpbmcsIHNlcnZpY2VJbnRlcmZhY2UpOwotICAgICAgICB9IGVsc2UgaWYgKGJpbmRpbmdUeXBlLmVxdWFscyhXU0RMMkNvbnN0YW50cy5VUklfV1NETDJfSFRUUCkpIHsKLSAgICAgICAgICAgIHByb2Nlc3NIVFRQQmluZGluZ0V4dGVudGlvbihiaW5kaW5nLCBheGlzQmluZGluZywgc2VydmljZUludGVyZmFjZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBXZSBzaG91bGQgcHJvY2VzcyB0aGUgaW50ZXJmYWNlIGJhc2VkIG9uIHRoZSBzZXJ2aWNlIG5vdCBvbiBhIGJpbmRpbmcKLQotICAgICAgICBwcm9jZXNzZWRCaW5kaW5ncy5wdXQoYmluZGluZy5nZXROYW1lKCksIGF4aXNCaW5kaW5nKTsKLSAgICAgICAgYWRkRG9jdW1lbnRhdGlvbihheGlzQmluZGluZywgYmluZGluZy50b0VsZW1lbnQoKSk7Ci0gICAgICAgIHJldHVybiBheGlzQmluZGluZzsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc1NPQVBCaW5kaW5nRXh0ZW50aW9uKEJpbmRpbmcgYmluZGluZywgQXhpc0JpbmRpbmcgYXhpc0JpbmRpbmcsIEludGVyZmFjZSBzZXJ2aWNlSW50ZXJmYWNlKQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0KLSAgICAgICAgLy8gQ2FwdHVyZSBhbGwgdGhlIGJpbmRpbmcgc3BlY2lmaWMgcHJvcGVydGllcwotCi0gICAgICAgIC8vIFNldCBhIGNvbXBhcmF0b3Igc28gdGhhIGh0dHBMb2NhdGlvbnMgYXJlIHN0b3JlZCBpbiBkZWNlbmRpbmcgb3JkZXIKLSAgICAgICAgTWFwIGh0dHBMb2NhdGlvblRhYmxlID0gbmV3IFRyZWVNYXAobmV3IENvbXBhcmF0b3IoKXsKLSAgICAgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgewotICAgICAgICAgICAgICAgIHJldHVybiAoLTEgKiAoKENvbXBhcmFibGUpbzEpLmNvbXBhcmVUbyhvMikpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgU09BUEJpbmRpbmdFeHRlbnNpb25zIHNvYXBCaW5kaW5nRXh0ZW5zaW9uczsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNvYXBCaW5kaW5nRXh0ZW5zaW9ucyA9IChTT0FQQmluZGluZ0V4dGVuc2lvbnNJbXBsKSBiaW5kaW5nCi0gICAgICAgICAgICAgICAgICAgIC5nZXRDb21wb25lbnRFeHRlbnNpb25Db250ZXh0KG5ldyBVUkkoV1NETDJDb25zdGFudHMuVVJJX1dTREwyX1NPQVApKTsKLSAgICAgICAgfSBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoIlNvYXAgQmluZGluZyBFeHRlbnRpb24gbm90IGZvdW5kIik7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgc29hcFZlcnNpb247Ci0gICAgICAgIGlmICgoc29hcFZlcnNpb24gPSBzb2FwQmluZGluZ0V4dGVuc2lvbnMuZ2V0U29hcFZlcnNpb24oKSkgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKHNvYXBWZXJzaW9uLmVxdWFscyhXU0RMMkNvbnN0YW50cy5TT0FQX1ZFUlNJT05fMV8xKSkgewotICAgICAgICAgICAgICAgIGF4aXNCaW5kaW5nLnNldFByb3BlcnR5KFdTREwyQ29uc3RhbnRzLkFUVFJfV1NPQVBfVkVSU0lPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT0FQMTFDb25zdGFudHMuU09BUF9FTlZFTE9QRV9OQU1FU1BBQ0VfVVJJKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYXhpc0JpbmRpbmcuc2V0UHJvcGVydHkoV1NETDJDb25zdGFudHMuQVRUUl9XU09BUF9WRVJTSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPQVAxMkNvbnN0YW50cy5TT0FQX0VOVkVMT1BFX05BTUVTUEFDRV9VUkkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gU2V0IHRoZSBkZWZhdWx0IHRvIHNvYXAgMS4yCi0gICAgICAgICAgICBheGlzQmluZGluZy5zZXRQcm9wZXJ0eShXU0RMMkNvbnN0YW50cy5BVFRSX1dTT0FQX1ZFUlNJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU0RMMjBEZWZhdWx0VmFsdWVIb2xkZXIuZ2V0RGVmYXVsdFZhbHVlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU0RMMkNvbnN0YW50cy5BVFRSX1dTT0FQX1ZFUlNJT04pKTsKLSAgICAgICAgfQotCi0gICAgICAgIFVSSSBzb2FwVW5kZXJseWluZ1Byb3RvY29sID0gc29hcEJpbmRpbmdFeHRlbnNpb25zLmdldFNvYXBVbmRlcmx5aW5nUHJvdG9jb2woKTsKLSAgICAgICAgaWYgKHNvYXBVbmRlcmx5aW5nUHJvdG9jb2wgIT0gbnVsbCkgewotICAgICAgICAgICAgYXhpc0JpbmRpbmcuc2V0UHJvcGVydHkoV1NETDJDb25zdGFudHMuQVRUUl9XU09BUF9QUk9UT0NPTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvYXBVbmRlcmx5aW5nUHJvdG9jb2wudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgVVJJIHNvYXBNZXBEZWZhdWx0ID0gc29hcEJpbmRpbmdFeHRlbnNpb25zLmdldFNvYXBNZXBEZWZhdWx0KCk7Ci0gICAgICAgIGlmIChzb2FwTWVwRGVmYXVsdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBheGlzQmluZGluZy5zZXRQcm9wZXJ0eShXU0RMMkNvbnN0YW50cy5BVFRSX1dTT0FQX01FUCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvYXBNZXBEZWZhdWx0LnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgICAgIGF4aXNCaW5kaW5nLnNldFByb3BlcnR5KFdTREwyQ29uc3RhbnRzLkFUVFJfV0hUVFBfQ09OVEVOVF9FTkNPRElORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29hcEJpbmRpbmdFeHRlbnNpb25zLmdldEh0dHBDb250ZW50RW5jb2RpbmdEZWZhdWx0KCkpOwotICAgICAgICBheGlzQmluZGluZy5zZXRQcm9wZXJ0eShXU0RMMkNvbnN0YW50cy5BVFRSX1dTT0FQX01PRFVMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlU29hcE1vZHVsZXMoc29hcEJpbmRpbmdFeHRlbnNpb25zLmdldFNvYXBNb2R1bGVzKCkpKTsKLSAgICAgICAgYXhpc0JpbmRpbmcuc2V0UHJvcGVydHkoV1NETDJDb25zdGFudHMuQVRUUl9XSFRUUF9RVUVSWV9QQVJBTUVURVJfU0VQQVJBVE9SLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2FwQmluZGluZ0V4dGVuc2lvbnMuZ2V0SHR0cFF1ZXJ5UGFyYW1ldGVyU2VwYXJhdG9yRGVmYXVsdCgpKTsKLQotICAgICAgICAvLyBDYXB0dXJlIGFsbCB0aGUgZmF1bHQgc3BlY2lmaWMgcHJvcGVydGllcwotCi0gICAgICAgIEJpbmRpbmdGYXVsdFtdIGJpbmRpbmdGYXVsdHMgPSBiaW5kaW5nLmdldEJpbmRpbmdGYXVsdHMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBiaW5kaW5nRmF1bHRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBCaW5kaW5nRmF1bHRJbXBsIGJpbmRpbmdGYXVsdCA9IChCaW5kaW5nRmF1bHRJbXBsKSBiaW5kaW5nRmF1bHRzW2ldOwotICAgICAgICAgICAgSW50ZXJmYWNlRmF1bHQgaW50ZXJmYWNlRmF1bHQgPSBzZXJ2aWNlSW50ZXJmYWNlLmdldEZyb21BbGxJbnRlcmZhY2VGYXVsdHMoYmluZGluZ0ZhdWx0LmdldFJlZigpKTsKLSAgICAgICAgICAgIEF4aXNCaW5kaW5nTWVzc2FnZSBheGlzQmluZGluZ0ZhdWx0ID0gbmV3IEF4aXNCaW5kaW5nTWVzc2FnZSgpOwotICAgICAgICAgICAgYXhpc0JpbmRpbmdGYXVsdC5zZXRGYXVsdCh0cnVlKTsKLSAgICAgICAgICAgIGF4aXNCaW5kaW5nRmF1bHQuc2V0TmFtZShpbnRlcmZhY2VGYXVsdC5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgYXhpc0JpbmRpbmdGYXVsdC5zZXRQYXJlbnQoYXhpc0JpbmRpbmcpOwotCi0gICAgICAgICAgICBhZGREb2N1bWVudGF0aW9uKGF4aXNCaW5kaW5nRmF1bHQsIGludGVyZmFjZUZhdWx0LnRvRWxlbWVudCgpKTsKLSAgICAgICAgICAgIFNPQVBCaW5kaW5nRmF1bHRFeHRlbnNpb25zIHNvYXBCaW5kaW5nRmF1bHRFeHRlbnNpb25zOwotCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHNvYXBCaW5kaW5nRmF1bHRFeHRlbnNpb25zID0gKFNPQVBCaW5kaW5nRmF1bHRFeHRlbnNpb25zKSBiaW5kaW5nRmF1bHQKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDb21wb25lbnRFeHRlbnNpb25Db250ZXh0KG5ldyBVUkkoV1NETDJDb25zdGFudHMuVVJJX1dTREwyX1NPQVApKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiU29hcCBCaW5kaW5nIEV4dGVudGlvbiBub3QgZm91bmQiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYXhpc0JpbmRpbmdGYXVsdC5zZXRQcm9wZXJ0eShXU0RMMkNvbnN0YW50cy5BVFRSX1dIVFRQX0hFQURFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlSHR0cEhlYWRlcnMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29hcEJpbmRpbmdGYXVsdEV4dGVuc2lvbnMuZ2V0SHR0cEhlYWRlcnMoKSkpOwotICAgICAgICAgICAgYXhpc0JpbmRpbmdGYXVsdC5zZXRQcm9wZXJ0eShXU0RMMkNvbnN0YW50cy5BVFRSX1dIVFRQX0NPTlRFTlRfRU5DT0RJTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvYXBCaW5kaW5nRmF1bHRFeHRlbnNpb25zLmdldEh0dHBDb250ZW50RW5jb2RpbmcoKSk7Ci0gICAgICAgICAgICBheGlzQmluZGluZ0ZhdWx0LnNldFByb3BlcnR5KFdTREwyQ29uc3RhbnRzLkFUVFJfV1NPQVBfQ09ERSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29hcEJpbmRpbmdGYXVsdEV4dGVuc2lvbnMuZ2V0U29hcEZhdWx0Q29kZSgpKTsKLSAgICAgICAgICAgIGF4aXNCaW5kaW5nRmF1bHQuc2V0UHJvcGVydHkoV1NETDJDb25zdGFudHMuQVRUUl9XU09BUF9TVUJDT0RFUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29hcEJpbmRpbmdGYXVsdEV4dGVuc2lvbnMuZ2V0U29hcEZhdWx0U3ViY29kZXMoKSk7Ci0gICAgICAgICAgICBheGlzQmluZGluZ0ZhdWx0LnNldFByb3BlcnR5KFdTREwyQ29uc3RhbnRzLkFUVFJfV1NPQVBfSEVBREVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVTb2FwSGVhZGVycygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2FwQmluZGluZ0ZhdWx0RXh0ZW5zaW9ucy5nZXRTb2FwSGVhZGVycygpKSk7Ci0gICAgICAgICAgICBheGlzQmluZGluZ0ZhdWx0LnNldFByb3BlcnR5KFdTREwyQ29uc3RhbnRzLkFUVFJfV1NPQVBfTU9EVUxFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVTb2FwTW9kdWxlcygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2FwQmluZGluZ0ZhdWx0RXh0ZW5zaW9ucy5nZXRTb2FwTW9kdWxlcygpKSk7Ci0KLSAgICAgICAgICAgIGF4aXNCaW5kaW5nLmFkZEZhdWx0KGF4aXNCaW5kaW5nRmF1bHQpOwotCi0gICAgICAgIH0KLQotICAgICAgICAvLyBDYXB0dXJlIGFsbCB0aGUgYmluZGluZyBvcGVyYXRpb24gc3BlY2lmaWMgcHJvcGVydGllcwotCi0gICAgICAgIEJpbmRpbmdPcGVyYXRpb25bXSBiaW5kaW5nT3BlcmF0aW9ucyA9IGJpbmRpbmcuZ2V0QmluZGluZ09wZXJhdGlvbnMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBiaW5kaW5nT3BlcmF0aW9ucy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgQmluZGluZ09wZXJhdGlvbkltcGwgYmluZGluZ09wZXJhdGlvbiA9IChCaW5kaW5nT3BlcmF0aW9uSW1wbCkgYmluZGluZ09wZXJhdGlvbnNbaV07Ci0KLSAgICAgICAgICAgIEF4aXNCaW5kaW5nT3BlcmF0aW9uIGF4aXNCaW5kaW5nT3BlcmF0aW9uID0gbmV3IEF4aXNCaW5kaW5nT3BlcmF0aW9uKCk7Ci0gICAgICAgICAgICBJbnRlcmZhY2VPcGVyYXRpb24gaW50ZXJmYWNlT3BlcmF0aW9uID0gc2VydmljZUludGVyZmFjZS5nZXRGcm9tQWxsSW50ZXJmYWNlT3BlcmF0aW9ucyhiaW5kaW5nT3BlcmF0aW9uLmdldFJlZigpKTsKLSAgICAgICAgICAgIEF4aXNPcGVyYXRpb24gYXhpc09wZXJhdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlLmdldE9wZXJhdGlvbihpbnRlcmZhY2VPcGVyYXRpb24uZ2V0TmFtZSgpKTsKLQotICAgICAgICAgICAgYXhpc0JpbmRpbmdPcGVyYXRpb24uc2V0QXhpc09wZXJhdGlvbihheGlzT3BlcmF0aW9uKTsKLSAgICAgICAgICAgIGF4aXNCaW5kaW5nT3BlcmF0aW9uLnNldFBhcmVudChheGlzQmluZGluZyk7Ci0gICAgICAgICAgICBheGlzQmluZGluZ09wZXJhdGlvbi5zZXROYW1lKGF4aXNPcGVyYXRpb24uZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIGFkZERvY3VtZW50YXRpb24oYXhpc0JpbmRpbmdPcGVyYXRpb24sIGJpbmRpbmdPcGVyYXRpb24udG9FbGVtZW50KCkpOwotICAgICAgICAgICAgU09BUEJpbmRpbmdPcGVyYXRpb25FeHRlbnNpb25zIHNvYXBCaW5kaW5nT3BlcmF0aW9uRXh0ZW5zaW9uczsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgc29hcEJpbmRpbmdPcGVyYXRpb25FeHRlbnNpb25zID0gKChTT0FQQmluZGluZ09wZXJhdGlvbkV4dGVuc2lvbnMpCi0gICAgICAgICAgICAgICAgICAgICAgICBiaW5kaW5nT3BlcmF0aW9uLmdldENvbXBvbmVudEV4dGVuc2lvbkNvbnRleHQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBVUkkoV1NETDJDb25zdGFudHMuVVJJX1dTREwyX1NPQVApKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoIlNvYXAgQmluZGluZyBFeHRlbnRpb24gbm90IGZvdW5kIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFVSSSBzb2FwQWN0aW9uID0gc29hcEJpbmRpbmdPcGVyYXRpb25FeHRlbnNpb25zLmdldFNvYXBBY3Rpb24oKTsKLSAgICAgICAgICAgIGlmIChzb2FwQWN0aW9uICE9IG51bGwgJiYgISJcIlwiIi5lcXVhbHMoc29hcEFjdGlvbi50b1N0cmluZygpKSkgewotICAgICAgICAgICAgICAgIGF4aXNCaW5kaW5nT3BlcmF0aW9uLnNldFByb3BlcnR5KFdTREwyQ29uc3RhbnRzLkFUVFJfV1NPQVBfQUNUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvYXBBY3Rpb24udG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBheGlzQmluZGluZ09wZXJhdGlvbi5zZXRQcm9wZXJ0eShXU0RMMkNvbnN0YW50cy5BVFRSX1dTT0FQX01PRFVMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZVNvYXBNb2R1bGVzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2FwQmluZGluZ09wZXJhdGlvbkV4dGVuc2lvbnMuZ2V0U29hcE1vZHVsZXMoKSkpOwotICAgICAgICAgICAgVVJJIHNvYXBNZXAgPSBzb2FwQmluZGluZ09wZXJhdGlvbkV4dGVuc2lvbnMuZ2V0U29hcE1lcCgpOwotICAgICAgICAgICAgaWYgKHNvYXBNZXAgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGF4aXNCaW5kaW5nT3BlcmF0aW9uLnNldFByb3BlcnR5KFdTREwyQ29uc3RhbnRzLkFUVFJfV1NPQVBfTUVQLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvYXBNZXAudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBIVFRQTG9jYXRpb24gaHR0cExvY2F0aW9uID0gc29hcEJpbmRpbmdPcGVyYXRpb25FeHRlbnNpb25zLmdldEh0dHBMb2NhdGlvbigpOwotICAgICAgICAgICAgLy8gSWYgaHR0cExvY2F0aW9uIGlzIG5vdCBudWxsIHdlIHNob3VsZCBleHRyYWN0IGEgY29uc3RhbnQgcGFydCBmcm9tIGl0IGFuZCBhZGQgaXRzIHZhbHVlIGFuZCB0aGUKLSAgICAgICAgICAgIC8vIGNvcnJlc3BvbmRpbmcgQXhpc09wZXJhdGlvbiB0byBhIG1hcCBpbiBvcmRlciB0byBkaXNwYXRjaCByZXN0IG1lc3NhZ2VzLiBJZiBodHRwTG9jYXRpb24gaXMgbnVsbCB3ZSBhZGQKLSAgICAgICAgICAgIC8vIHRoZSBvcGVyYXRpb24gbmFtZSBpbnRvIHRoaXMgbWFwLgotICAgICAgICAgICAgU3RyaW5nIGh0dHBMb2NhdGlvblN0cmluZyA9ICIiOwotICAgICAgICAgICAgaWYgKGh0dHBMb2NhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGh0dHBMb2NhdGlvblRlbXBsZXRlID0gaHR0cExvY2F0aW9uLmdldE9yaWdpbmFsTG9jYXRpb24oKTsKLSAgICAgICAgICAgICAgICBheGlzQmluZGluZ09wZXJhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgLnNldFByb3BlcnR5KFdTREwyQ29uc3RhbnRzLkFUVFJfV0hUVFBfTE9DQVRJT04sIGh0dHBMb2NhdGlvblRlbXBsZXRlKTsKLSAgICAgICAgICAgICAgICBodHRwTG9jYXRpb25TdHJpbmcgPSBXU0RMVXRpbC5nZXRDb25zdGFudEZyb21IVFRQTG9jYXRpb24oaHR0cExvY2F0aW9uVGVtcGxldGUsIEhUVFBDb25zdGFudHMuSEVBREVSX1BPU1QpOwotCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGh0dHBMb2NhdGlvblRhYmxlLnB1dChodHRwTG9jYXRpb25TdHJpbmcsIGF4aXNPcGVyYXRpb24pOwotICAgICAgICAgICAgYXhpc0JpbmRpbmdPcGVyYXRpb24uc2V0UHJvcGVydHkoV1NETDJDb25zdGFudHMuQVRUUl9XSFRUUF9DT05URU5UX0VOQ09ESU5HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29hcEJpbmRpbmdPcGVyYXRpb25FeHRlbnNpb25zLmdldEh0dHBDb250ZW50RW5jb2RpbmdEZWZhdWx0KCkpOwotICAgICAgICAgICAgYXhpc0JpbmRpbmdPcGVyYXRpb24uc2V0UHJvcGVydHkoV1NETDJDb25zdGFudHMuQVRUUl9XSFRUUF9RVUVSWV9QQVJBTUVURVJfU0VQQVJBVE9SLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29hcEJpbmRpbmdPcGVyYXRpb25FeHRlbnNpb25zLmdldEh0dHBRdWVyeVBhcmFtZXRlclNlcGFyYXRvcigpKTsKLQotCi0gICAgICAgICAgICBCaW5kaW5nTWVzc2FnZVJlZmVyZW5jZVtdIGJpbmRpbmdNZXNzYWdlUmVmZXJlbmNlcyA9Ci0gICAgICAgICAgICAgICAgICAgIGJpbmRpbmdPcGVyYXRpb24uZ2V0QmluZGluZ01lc3NhZ2VSZWZlcmVuY2VzKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGJpbmRpbmdNZXNzYWdlUmVmZXJlbmNlcy5sZW5ndGg7IGorKykgewotICAgICAgICAgICAgICAgIEJpbmRpbmdNZXNzYWdlUmVmZXJlbmNlIGJpbmRpbmdNZXNzYWdlUmVmZXJlbmNlID0gYmluZGluZ01lc3NhZ2VSZWZlcmVuY2VzW2pdOwotCi0gICAgICAgICAgICAgICAgQXhpc0JpbmRpbmdNZXNzYWdlIGF4aXNCaW5kaW5nTWVzc2FnZSA9IG5ldyBBeGlzQmluZGluZ01lc3NhZ2UoKTsKLSAgICAgICAgICAgICAgICBheGlzQmluZGluZ01lc3NhZ2Uuc2V0UGFyZW50KGF4aXNCaW5kaW5nT3BlcmF0aW9uKTsKLSAgICAgICAgICAgICAgICBhZGREb2N1bWVudGF0aW9uKGF4aXNCaW5kaW5nTWVzc2FnZSwgYmluZGluZ01lc3NhZ2VSZWZlcmVuY2UudG9FbGVtZW50KCkpOwotICAgICAgICAgICAgICAgIEF4aXNNZXNzYWdlIGF4aXNNZXNzYWdlID0gYXhpc09wZXJhdGlvbi5nZXRNZXNzYWdlKGJpbmRpbmdNZXNzYWdlUmVmZXJlbmNlCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0SW50ZXJmYWNlTWVzc2FnZVJlZmVyZW5jZSgpLmdldE1lc3NhZ2VMYWJlbCgpLnRvU3RyaW5nKCkpOwotCi0gICAgICAgICAgICAgICAgYXhpc0JpbmRpbmdNZXNzYWdlLnNldEF4aXNNZXNzYWdlKGF4aXNNZXNzYWdlKTsKLSAgICAgICAgICAgICAgICBheGlzQmluZGluZ01lc3NhZ2Uuc2V0TmFtZShheGlzTWVzc2FnZS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIGF4aXNCaW5kaW5nTWVzc2FnZS5zZXREaXJlY3Rpb24oYXhpc01lc3NhZ2UuZ2V0RGlyZWN0aW9uKCkpOwotCi0KLSAgICAgICAgICAgICAgICBTT0FQQmluZGluZ01lc3NhZ2VSZWZlcmVuY2VFeHRlbnNpb25zIHNvYXBCaW5kaW5nTWVzc2FnZVJlZmVyZW5jZUV4dGVuc2lvbnM7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgc29hcEJpbmRpbmdNZXNzYWdlUmVmZXJlbmNlRXh0ZW5zaW9ucyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKFNPQVBCaW5kaW5nTWVzc2FnZVJlZmVyZW5jZUV4dGVuc2lvbnMpIGJpbmRpbmdNZXNzYWdlUmVmZXJlbmNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Q29tcG9uZW50RXh0ZW5zaW9uQ29udGV4dCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFVSSShXU0RMMkNvbnN0YW50cy5VUklfV1NETDJfU09BUCkpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoIlNvYXAgQmluZGluZyBFeHRlbnRpb24gbm90IGZvdW5kIik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgYXhpc0JpbmRpbmdNZXNzYWdlLnNldFByb3BlcnR5KFdTREwyQ29uc3RhbnRzLkFUVFJfV0hUVFBfSEVBREVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVIdHRwSGVhZGVycygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2FwQmluZGluZ01lc3NhZ2VSZWZlcmVuY2VFeHRlbnNpb25zLmdldEh0dHBIZWFkZXJzKCkpKTsKLSAgICAgICAgICAgICAgICBheGlzQmluZGluZ01lc3NhZ2Uuc2V0UHJvcGVydHkoV1NETDJDb25zdGFudHMuQVRUUl9XSFRUUF9DT05URU5UX0VOQ09ESU5HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2FwQmluZGluZ01lc3NhZ2VSZWZlcmVuY2VFeHRlbnNpb25zLmdldEh0dHBDb250ZW50RW5jb2RpbmcoKSk7Ci0gICAgICAgICAgICAgICAgYXhpc0JpbmRpbmdNZXNzYWdlLnNldFByb3BlcnR5KFdTREwyQ29uc3RhbnRzLkFUVFJfV1NPQVBfSEVBREVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVTb2FwSGVhZGVycygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2FwQmluZGluZ01lc3NhZ2VSZWZlcmVuY2VFeHRlbnNpb25zLmdldFNvYXBIZWFkZXJzKCkpKTsKLSAgICAgICAgICAgICAgICBheGlzQmluZGluZ01lc3NhZ2Uuc2V0UHJvcGVydHkoV1NETDJDb25zdGFudHMuQVRUUl9XU09BUF9NT0RVTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZVNvYXBNb2R1bGVzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvYXBCaW5kaW5nTWVzc2FnZVJlZmVyZW5jZUV4dGVuc2lvbnMuZ2V0U29hcE1vZHVsZXMoKSkpOwotCi0gICAgICAgICAgICAgICAgYXhpc0JpbmRpbmdPcGVyYXRpb24uYWRkQ2hpbGQoYXhpc01lc3NhZ2UuZ2V0RGlyZWN0aW9uKCksIGF4aXNCaW5kaW5nTWVzc2FnZSk7Ci0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQmluZGluZ0ZhdWx0UmVmZXJlbmNlIFtdIGJpbmRpbmdGYXVsdFJlZmVyZW5jZXMgPQotICAgICAgICAgICAgICAgICAgICBiaW5kaW5nT3BlcmF0aW9uLmdldEJpbmRpbmdGYXVsdFJlZmVyZW5jZXMoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgYmluZGluZ0ZhdWx0UmVmZXJlbmNlcy5sZW5ndGg7IGorKykgewotICAgICAgICAgICAgICAgIEJpbmRpbmdGYXVsdFJlZmVyZW5jZSBiaW5kaW5nRmF1bHRSZWZlcmVuY2UgPSBiaW5kaW5nRmF1bHRSZWZlcmVuY2VzW2pdOwotCi0gICAgICAgICAgICAgICAgQXhpc0JpbmRpbmdNZXNzYWdlIGF4aXNCaW5kaW5nTWVzc2FnZUZhdWx0ID0gbmV3IEF4aXNCaW5kaW5nTWVzc2FnZSgpOwotICAgICAgICAgICAgICAgIGFkZERvY3VtZW50YXRpb24oYXhpc0JpbmRpbmdNZXNzYWdlRmF1bHQsIGJpbmRpbmdGYXVsdFJlZmVyZW5jZS50b0VsZW1lbnQoKSk7Ci0gICAgICAgICAgICAgICAgYXhpc0JpbmRpbmdNZXNzYWdlRmF1bHQuc2V0UGFyZW50KGF4aXNCaW5kaW5nT3BlcmF0aW9uKTsKLSAgICAgICAgICAgICAgICBheGlzQmluZGluZ01lc3NhZ2VGYXVsdC5zZXRGYXVsdCh0cnVlKTsKLSAgICAgICAgICAgICAgICBheGlzQmluZGluZ01lc3NhZ2VGYXVsdC5zZXROYW1lKGJpbmRpbmdGYXVsdFJlZmVyZW5jZS5nZXRJbnRlcmZhY2VGYXVsdFJlZmVyZW5jZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0SW50ZXJmYWNlRmF1bHQoKS5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpOwotCi0gICAgICAgICAgICAgICAgU09BUEJpbmRpbmdGYXVsdFJlZmVyZW5jZUV4dGVuc2lvbnMgc29hcEJpbmRpbmdGYXVsdFJlZmVyZW5jZUV4dGVuc2lvbnM7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgc29hcEJpbmRpbmdGYXVsdFJlZmVyZW5jZUV4dGVuc2lvbnMgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTT0FQQmluZGluZ0ZhdWx0UmVmZXJlbmNlRXh0ZW5zaW9ucykgYmluZGluZ0ZhdWx0UmVmZXJlbmNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Q29tcG9uZW50RXh0ZW5zaW9uQ29udGV4dCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFVSSShXU0RMMkNvbnN0YW50cy5VUklfV1NETDJfU09BUCkpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoIlNvYXAgQmluZGluZyBFeHRlbnRpb24gbm90IGZvdW5kIik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgYXhpc0JpbmRpbmdNZXNzYWdlRmF1bHQuc2V0UHJvcGVydHkoV1NETDJDb25zdGFudHMuQVRUUl9XU09BUF9NT0RVTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlU29hcE1vZHVsZXMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2FwQmluZGluZ0ZhdWx0UmVmZXJlbmNlRXh0ZW5zaW9ucy5nZXRTb2FwTW9kdWxlcygpKSk7Ci0KLSAgICAgICAgICAgICAgICBheGlzQmluZGluZ09wZXJhdGlvbi5hZGRGYXVsdChheGlzQmluZGluZ01lc3NhZ2VGYXVsdCk7Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGF4aXNCaW5kaW5nLnNldFByb3BlcnR5KFdTREwyQ29uc3RhbnRzLkhUVFBfTE9DQVRJT05fVEFCTEUsIGh0dHBMb2NhdGlvblRhYmxlKTsKLSAgICAgICAgICAgIGF4aXNCaW5kaW5nLmFkZENoaWxkKGF4aXNCaW5kaW5nT3BlcmF0aW9uLmdldE5hbWUoKSwgYXhpc0JpbmRpbmdPcGVyYXRpb24pOwotCi0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzSFRUUEJpbmRpbmdFeHRlbnRpb24oQmluZGluZyBiaW5kaW5nLCBBeGlzQmluZGluZyBheGlzQmluZGluZywgSW50ZXJmYWNlIHNlcnZpY2VJbnRlcmZhY2UpCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLQotCi0gICAgICAgIC8vIFNldCBhIGNvbXBhcmF0b3Igc28gdGhhIGh0dHBMb2NhdGlvbnMgYXJlIHN0b3JlZCBpbiBkZWNlbmRpbmcgb3JkZXIKLSAgICAgICAgTWFwIGh0dHBMb2NhdGlvblRhYmxlID0gbmV3IFRyZWVNYXAobmV3IENvbXBhcmF0b3IoKXsKLSAgICAgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgewotICAgICAgICAgICAgICAgIHJldHVybiAoLTEgKiAoKENvbXBhcmFibGUpbzEpLmNvbXBhcmVUbyhvMikpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgLy8gQ2FwdHVyZSBhbGwgdGhlIGJpbmRpbmcgc3BlY2lmaWMgcHJvcGVydGllcwotCi0gICAgICAgIEhUVFBCaW5kaW5nRXh0ZW5zaW9uc0ltcGwgaHR0cEJpbmRpbmdFeHRlbnNpb25zOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaHR0cEJpbmRpbmdFeHRlbnNpb25zID0gKEhUVFBCaW5kaW5nRXh0ZW5zaW9uc0ltcGwpIGJpbmRpbmcKLSAgICAgICAgICAgICAgICAgICAgLmdldENvbXBvbmVudEV4dGVuc2lvbkNvbnRleHQobmV3IFVSSShXU0RMMkNvbnN0YW50cy5VUklfV1NETDJfSFRUUCkpOwotICAgICAgICB9IGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiSFRUUCBCaW5kaW5nIEV4dGVudGlvbiBub3QgZm91bmQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBodHRwTWV0aG9kRGVmYXVsdCA9IGh0dHBCaW5kaW5nRXh0ZW5zaW9ucy5nZXRIdHRwTWV0aG9kRGVmYXVsdCgpOwotICAgICAgICBheGlzQmluZGluZy5zZXRQcm9wZXJ0eShXU0RMMkNvbnN0YW50cy5BVFRSX1dIVFRQX01FVEhPRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cE1ldGhvZERlZmF1bHQpOwotICAgICAgICBheGlzQmluZGluZy5zZXRQcm9wZXJ0eShXU0RMMkNvbnN0YW50cy5BVFRSX1dIVFRQX1FVRVJZX1BBUkFNRVRFUl9TRVBBUkFUT1IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBCaW5kaW5nRXh0ZW5zaW9ucy5nZXRIdHRwUXVlcnlQYXJhbWV0ZXJTZXBhcmF0b3JEZWZhdWx0KCkpOwotICAgICAgICBheGlzQmluZGluZy5zZXRQcm9wZXJ0eShXU0RMMkNvbnN0YW50cy5BVFRSX1dIVFRQX0NPTlRFTlRfRU5DT0RJTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBCaW5kaW5nRXh0ZW5zaW9ucy5nZXRIdHRwQ29udGVudEVuY29kaW5nRGVmYXVsdCgpKTsKLQotICAgICAgICAvLyBDYXB0dXJlIGFsbCB0aGUgZmF1bHQgc3BlY2lmaWMgcHJvcGVydGllcwotCi0gICAgICAgIEJpbmRpbmdGYXVsdFtdIGJpbmRpbmdGYXVsdHMgPSBiaW5kaW5nLmdldEJpbmRpbmdGYXVsdHMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBiaW5kaW5nRmF1bHRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBCaW5kaW5nRmF1bHRJbXBsIGJpbmRpbmdGYXVsdCA9IChCaW5kaW5nRmF1bHRJbXBsKSBiaW5kaW5nRmF1bHRzW2ldOwotICAgICAgICAgICAgSW50ZXJmYWNlRmF1bHQgaW50ZXJmYWNlRmF1bHQgPQotICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlSW50ZXJmYWNlLmdldEZyb21BbGxJbnRlcmZhY2VGYXVsdHMoYmluZGluZ0ZhdWx0LmdldFJlZigpKTsKLSAgICAgICAgICAgIEF4aXNCaW5kaW5nTWVzc2FnZSBheGlzQmluZGluZ0ZhdWx0ID0gbmV3IEF4aXNCaW5kaW5nTWVzc2FnZSgpOwotICAgICAgICAgICAgYXhpc0JpbmRpbmdGYXVsdC5zZXRGYXVsdCh0cnVlKTsKLSAgICAgICAgICAgIGF4aXNCaW5kaW5nRmF1bHQuc2V0TmFtZShpbnRlcmZhY2VGYXVsdC5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgYXhpc0JpbmRpbmdGYXVsdC5zZXRQYXJlbnQoYXhpc0JpbmRpbmcpOwotCi0gICAgICAgICAgICBhZGREb2N1bWVudGF0aW9uKGF4aXNCaW5kaW5nRmF1bHQsIGludGVyZmFjZUZhdWx0LnRvRWxlbWVudCgpKTsKLSAgICAgICAgICAgIEhUVFBCaW5kaW5nRmF1bHRFeHRlbnNpb25zIGh0dHBCaW5kaW5nRmF1bHRFeHRlbnNpb25zOwotCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGh0dHBCaW5kaW5nRmF1bHRFeHRlbnNpb25zID0gKEhUVFBCaW5kaW5nRmF1bHRFeHRlbnNpb25zKSBiaW5kaW5nRmF1bHQKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDb21wb25lbnRFeHRlbnNpb25Db250ZXh0KG5ldyBVUkkoV1NETDJDb25zdGFudHMuVVJJX1dTREwyX0hUVFApKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiSFRUUCBCaW5kaW5nIEV4dGVudGlvbiBub3QgZm91bmQiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYXhpc0JpbmRpbmdGYXVsdC5zZXRQcm9wZXJ0eShXU0RMMkNvbnN0YW50cy5BVFRSX1dIVFRQX0NPREUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBCaW5kaW5nRmF1bHRFeHRlbnNpb25zCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEh0dHBFcnJvclN0YXR1c0NvZGUoKS5nZXRDb2RlKCkpOwotICAgICAgICAgICAgYXhpc0JpbmRpbmdGYXVsdC5zZXRQcm9wZXJ0eShXU0RMMkNvbnN0YW50cy5BVFRSX1dIVFRQX0hFQURFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlSHR0cEhlYWRlcnMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cEJpbmRpbmdGYXVsdEV4dGVuc2lvbnMuZ2V0SHR0cEhlYWRlcnMoKSkpOwotICAgICAgICAgICAgYXhpc0JpbmRpbmdGYXVsdC5zZXRQcm9wZXJ0eShXU0RMMkNvbnN0YW50cy5BVFRSX1dIVFRQX0NPTlRFTlRfRU5DT0RJTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBCaW5kaW5nRmF1bHRFeHRlbnNpb25zLmdldEh0dHBDb250ZW50RW5jb2RpbmcoKSk7Ci0gICAgICAgICAgICBheGlzQmluZGluZy5hZGRGYXVsdChheGlzQmluZGluZ0ZhdWx0KTsKLQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQ2FwdHVyZSBhbGwgdGhlIGJpbmRpbmcgb3BlcmF0aW9uIHNwZWNpZmljIHByb3BlcnRpZXMKLQotICAgICAgICBCaW5kaW5nT3BlcmF0aW9uW10gYmluZGluZ09wZXJhdGlvbnMgPSBiaW5kaW5nLmdldEJpbmRpbmdPcGVyYXRpb25zKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYmluZGluZ09wZXJhdGlvbnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIEJpbmRpbmdPcGVyYXRpb25JbXBsIGJpbmRpbmdPcGVyYXRpb24gPSAoQmluZGluZ09wZXJhdGlvbkltcGwpIGJpbmRpbmdPcGVyYXRpb25zW2ldOwotCi0gICAgICAgICAgICBBeGlzQmluZGluZ09wZXJhdGlvbiBheGlzQmluZGluZ09wZXJhdGlvbiA9IG5ldyBBeGlzQmluZGluZ09wZXJhdGlvbigpOwotICAgICAgICAgICAgSW50ZXJmYWNlT3BlcmF0aW9uIGludGVyZmFjZU9wZXJhdGlvbiA9IHNlcnZpY2VJbnRlcmZhY2UuZ2V0RnJvbUFsbEludGVyZmFjZU9wZXJhdGlvbnMoYmluZGluZ09wZXJhdGlvbi5nZXRSZWYoKSk7Ci0gICAgICAgICAgICBBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb24gPQotICAgICAgICAgICAgICAgICAgICBheGlzU2VydmljZS5nZXRPcGVyYXRpb24oaW50ZXJmYWNlT3BlcmF0aW9uLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgICAgIGF4aXNCaW5kaW5nT3BlcmF0aW9uLnNldEF4aXNPcGVyYXRpb24oYXhpc09wZXJhdGlvbik7Ci0gICAgICAgICAgICBheGlzQmluZGluZ09wZXJhdGlvbi5zZXRQYXJlbnQoYXhpc0JpbmRpbmcpOwotICAgICAgICAgICAgYXhpc0JpbmRpbmdPcGVyYXRpb24uc2V0TmFtZShheGlzT3BlcmF0aW9uLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgICAgIGFkZERvY3VtZW50YXRpb24oYXhpc0JpbmRpbmdPcGVyYXRpb24sIGJpbmRpbmdPcGVyYXRpb24udG9FbGVtZW50KCkpOwotICAgICAgICAgICAgSFRUUEJpbmRpbmdPcGVyYXRpb25FeHRlbnNpb25zIGh0dHBCaW5kaW5nT3BlcmF0aW9uRXh0ZW5zaW9uczsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaHR0cEJpbmRpbmdPcGVyYXRpb25FeHRlbnNpb25zID0gKChIVFRQQmluZGluZ09wZXJhdGlvbkV4dGVuc2lvbnMpCi0gICAgICAgICAgICAgICAgICAgICAgICBiaW5kaW5nT3BlcmF0aW9uLmdldENvbXBvbmVudEV4dGVuc2lvbkNvbnRleHQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBVUkkoV1NETDJDb25zdGFudHMuVVJJX1dTREwyX0hUVFApKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoIkhUVFAgQmluZGluZyBFeHRlbnRpb24gbm90IGZvdW5kIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGF4aXNCaW5kaW5nT3BlcmF0aW9uLnNldFByb3BlcnR5KFdTREwyQ29uc3RhbnRzLkFUVFJfV0hUVFBfRkFVTFRfU0VSSUFMSVpBVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBCaW5kaW5nT3BlcmF0aW9uRXh0ZW5zaW9ucy5nZXRIdHRwRmF1bHRTZXJpYWxpemF0aW9uKCkpOwotICAgICAgICAgICAgYXhpc0JpbmRpbmdPcGVyYXRpb24uc2V0UHJvcGVydHkoV1NETDJDb25zdGFudHMuQVRUUl9XSFRUUF9JTlBVVF9TRVJJQUxJWkFUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cEJpbmRpbmdPcGVyYXRpb25FeHRlbnNpb25zLmdldEh0dHBJbnB1dFNlcmlhbGl6YXRpb24oKSk7Ci0gICAgICAgICAgICBTdHJpbmcgaHR0cE1ldGhvZCA9IGh0dHBCaW5kaW5nT3BlcmF0aW9uRXh0ZW5zaW9ucy4KLSAgICAgICAgICAgICAgICAgICAgZ2V0SHR0cE1ldGhvZCgpOwotICAgICAgICAgICAgaWYgKGh0dHBNZXRob2QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChodHRwTWV0aG9kRGVmYXVsdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGh0dHBNZXRob2QgPSBodHRwTWV0aG9kRGVmYXVsdDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBCb29sZWFuIHNhZmVQYXJhbWV0ZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCb29sZWFuKSBheGlzT3BlcmF0aW9uLmdldFBhcmFtZXRlclZhbHVlKFdTREwyQ29uc3RhbnRzLkFUVFJfV1NETFhfU0FGRSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzYWZlUGFyYW1ldGVyICE9IG51bGwgJiYgc2FmZVBhcmFtZXRlci5ib29sZWFuVmFsdWUoKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBodHRwTWV0aG9kID0gSFRUUENvbnN0YW50cy5IRUFERVJfR0VUOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cE1ldGhvZCA9IEhUVFBDb25zdGFudHMuSEVBREVSX1BPU1Q7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBheGlzQmluZGluZ09wZXJhdGlvbgotICAgICAgICAgICAgICAgICAgICAuc2V0UHJvcGVydHkoV1NETDJDb25zdGFudHMuQVRUUl9XSFRUUF9NRVRIT0QsIGh0dHBNZXRob2QpOwotICAgICAgICAgICAgSFRUUExvY2F0aW9uIGh0dHBMb2NhdGlvbiA9IGh0dHBCaW5kaW5nT3BlcmF0aW9uRXh0ZW5zaW9ucy5nZXRIdHRwTG9jYXRpb24oKTsKLQotICAgICAgICAgICAgLy8gSWYgaHR0cExvY2F0aW9uIGlzIG5vdCBudWxsIHdlIHNob3VsZCBleHRyYWN0IGEgY29uc3RhbnQgcGFydCBmcm9tIGl0IGFuZCBhZGQgaXRzIHZhbHVlIGFuZCB0aGUKLSAgICAgICAgICAgIC8vIGNvcnJlc3BvbmRpbmcgQXhpc09wZXJhdGlvbiB0byBhIG1hcCBpbiBvcmRlciB0byBkaXNwYXRjaCByZXN0IG1lc3NhZ2VzLiBJZiBodHRwTG9jYXRpb24gaXMgbnVsbCB3ZSBhZGQKLSAgICAgICAgICAgIC8vIHRoZSBvcGVyYXRpb24gbmFtZSBpbnRvIHRoaXMgbWFwLgotICAgICAgICAgICAgU3RyaW5nIGh0dHBMb2NhdGlvblN0cmluZyA9ICIiOwotICAgICAgICAgICAgaWYgKGh0dHBMb2NhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGh0dHBMb2NhdGlvblRlbXBsZXRlID0gaHR0cExvY2F0aW9uLmdldE9yaWdpbmFsTG9jYXRpb24oKTsKLSAgICAgICAgICAgICAgICBheGlzQmluZGluZ09wZXJhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgLnNldFByb3BlcnR5KFdTREwyQ29uc3RhbnRzLkFUVFJfV0hUVFBfTE9DQVRJT04sIGh0dHBMb2NhdGlvblRlbXBsZXRlKTsKLSAgICAgICAgICAgICAgICBodHRwTG9jYXRpb25TdHJpbmcgPSBXU0RMVXRpbC5nZXRDb25zdGFudEZyb21IVFRQTG9jYXRpb24oaHR0cExvY2F0aW9uVGVtcGxldGUsIGh0dHBNZXRob2QpOwotCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGh0dHBMb2NhdGlvblRhYmxlLnB1dChodHRwTG9jYXRpb25TdHJpbmcsIGF4aXNPcGVyYXRpb24pOwotCi0gICAgICAgICAgICBheGlzQmluZGluZ09wZXJhdGlvbi5zZXRQcm9wZXJ0eShXU0RMMkNvbnN0YW50cy5BVFRSX1dIVFRQX0lHTk9SRV9VTkNJVEVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cEJpbmRpbmdPcGVyYXRpb25FeHRlbnNpb25zLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0h0dHBMb2NhdGlvbklnbm9yZVVuY2l0ZWQoKSk7Ci0gICAgICAgICAgICBheGlzQmluZGluZ09wZXJhdGlvbi5zZXRQcm9wZXJ0eShXU0RMMkNvbnN0YW50cy5BVFRSX1dIVFRQX09VVFBVVF9TRVJJQUxJWkFUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cEJpbmRpbmdPcGVyYXRpb25FeHRlbnNpb25zLmdldEh0dHBPdXRwdXRTZXJpYWxpemF0aW9uKCkpOwotICAgICAgICAgICAgYXhpc0JpbmRpbmdPcGVyYXRpb24uc2V0UHJvcGVydHkoV1NETDJDb25zdGFudHMuQVRUUl9XSFRUUF9RVUVSWV9QQVJBTUVURVJfU0VQQVJBVE9SLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cEJpbmRpbmdPcGVyYXRpb25FeHRlbnNpb25zLmdldEh0dHBRdWVyeVBhcmFtZXRlclNlcGFyYXRvcigpKTsKLSAgICAgICAgICAgIGF4aXNCaW5kaW5nT3BlcmF0aW9uLnNldFByb3BlcnR5KFdTREwyQ29uc3RhbnRzLkFUVFJfV0hUVFBfQ09OVEVOVF9FTkNPRElORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBCaW5kaW5nT3BlcmF0aW9uRXh0ZW5zaW9ucy5nZXRIdHRwQ29udGVudEVuY29kaW5nRGVmYXVsdCgpKTsKLQotICAgICAgICAgICAgQmluZGluZ01lc3NhZ2VSZWZlcmVuY2VbXSBiaW5kaW5nTWVzc2FnZVJlZmVyZW5jZXMgPQotICAgICAgICAgICAgICAgICAgICBiaW5kaW5nT3BlcmF0aW9uLmdldEJpbmRpbmdNZXNzYWdlUmVmZXJlbmNlcygpOwotICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBiaW5kaW5nTWVzc2FnZVJlZmVyZW5jZXMubGVuZ3RoOyBqKyspIHsKLSAgICAgICAgICAgICAgICBCaW5kaW5nTWVzc2FnZVJlZmVyZW5jZSBiaW5kaW5nTWVzc2FnZVJlZmVyZW5jZSA9IGJpbmRpbmdNZXNzYWdlUmVmZXJlbmNlc1tqXTsKLQotICAgICAgICAgICAgICAgIEF4aXNCaW5kaW5nTWVzc2FnZSBheGlzQmluZGluZ01lc3NhZ2UgPSBuZXcgQXhpc0JpbmRpbmdNZXNzYWdlKCk7Ci0gICAgICAgICAgICAgICAgYXhpc0JpbmRpbmdNZXNzYWdlLnNldFBhcmVudChheGlzQmluZGluZ09wZXJhdGlvbik7Ci0KLSAgICAgICAgICAgICAgICBBeGlzTWVzc2FnZSBheGlzTWVzc2FnZSA9IGF4aXNPcGVyYXRpb24uZ2V0TWVzc2FnZShiaW5kaW5nTWVzc2FnZVJlZmVyZW5jZQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldEludGVyZmFjZU1lc3NhZ2VSZWZlcmVuY2UoKS5nZXRNZXNzYWdlTGFiZWwoKS50b1N0cmluZygpKTsKLQotICAgICAgICAgICAgICAgIGF4aXNCaW5kaW5nTWVzc2FnZS5zZXRBeGlzTWVzc2FnZShheGlzTWVzc2FnZSk7Ci0gICAgICAgICAgICAgICAgYXhpc0JpbmRpbmdNZXNzYWdlLnNldE5hbWUoYXhpc01lc3NhZ2UuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICBheGlzQmluZGluZ01lc3NhZ2Uuc2V0RGlyZWN0aW9uKGF4aXNNZXNzYWdlLmdldERpcmVjdGlvbigpKTsKLQotICAgICAgICAgICAgICAgIGFkZERvY3VtZW50YXRpb24oYXhpc0JpbmRpbmdNZXNzYWdlLCBiaW5kaW5nTWVzc2FnZVJlZmVyZW5jZS50b0VsZW1lbnQoKSk7Ci0gICAgICAgICAgICAgICAgSFRUUEJpbmRpbmdNZXNzYWdlUmVmZXJlbmNlRXh0ZW5zaW9ucyBodHRwQmluZGluZ01lc3NhZ2VSZWZlcmVuY2VFeHRlbnNpb25zOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGh0dHBCaW5kaW5nTWVzc2FnZVJlZmVyZW5jZUV4dGVuc2lvbnMgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChIVFRQQmluZGluZ01lc3NhZ2VSZWZlcmVuY2VFeHRlbnNpb25zKSBiaW5kaW5nTWVzc2FnZVJlZmVyZW5jZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldENvbXBvbmVudEV4dGVuc2lvbkNvbnRleHQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBVUkkoV1NETDJDb25zdGFudHMuVVJJX1dTREwyX0hUVFApKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJIVFRQIEJpbmRpbmcgRXh0ZW50aW9uIG5vdCBmb3VuZCIpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGF4aXNCaW5kaW5nTWVzc2FnZS5zZXRQcm9wZXJ0eShXU0RMMkNvbnN0YW50cy5BVFRSX1dIVFRQX0hFQURFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlSHR0cEhlYWRlcnMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cEJpbmRpbmdNZXNzYWdlUmVmZXJlbmNlRXh0ZW5zaW9ucy5nZXRIdHRwSGVhZGVycygpKSk7Ci0gICAgICAgICAgICAgICAgYXhpc0JpbmRpbmdNZXNzYWdlLnNldFByb3BlcnR5KFdTREwyQ29uc3RhbnRzLkFUVFJfV0hUVFBfQ09OVEVOVF9FTkNPRElORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cEJpbmRpbmdNZXNzYWdlUmVmZXJlbmNlRXh0ZW5zaW9ucy5nZXRIdHRwQ29udGVudEVuY29kaW5nKCkpOwotICAgICAgICAgICAgICAgIGF4aXNCaW5kaW5nT3BlcmF0aW9uLmFkZENoaWxkKFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9JTl9WQUxVRSwgYXhpc0JpbmRpbmdNZXNzYWdlKTsKLQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBCaW5kaW5nRmF1bHRSZWZlcmVuY2VbXSBiaW5kaW5nRmF1bHRSZWZlcmVuY2VzID0KLSAgICAgICAgICAgICAgICAgICAgYmluZGluZ09wZXJhdGlvbi5nZXRCaW5kaW5nRmF1bHRSZWZlcmVuY2VzKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGJpbmRpbmdGYXVsdFJlZmVyZW5jZXMubGVuZ3RoOyBqKyspIHsKLSAgICAgICAgICAgICAgICBCaW5kaW5nRmF1bHRSZWZlcmVuY2UgYmluZGluZ0ZhdWx0UmVmZXJlbmNlID0gYmluZGluZ0ZhdWx0UmVmZXJlbmNlc1tqXTsKLQotICAgICAgICAgICAgICAgIEF4aXNCaW5kaW5nTWVzc2FnZSBheGlzQmluZGluZ01lc3NhZ2VGYXVsdCA9IG5ldyBBeGlzQmluZGluZ01lc3NhZ2UoKTsKLSAgICAgICAgICAgICAgICBheGlzQmluZGluZ01lc3NhZ2VGYXVsdC5zZXRGYXVsdCh0cnVlKTsKLSAgICAgICAgICAgICAgICBheGlzQmluZGluZ01lc3NhZ2VGYXVsdC5zZXROYW1lKGJpbmRpbmdGYXVsdFJlZmVyZW5jZS5nZXRJbnRlcmZhY2VGYXVsdFJlZmVyZW5jZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0SW50ZXJmYWNlRmF1bHQoKS5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgIGF4aXNCaW5kaW5nTWVzc2FnZUZhdWx0LnNldFBhcmVudChheGlzQmluZGluZ09wZXJhdGlvbik7Ci0gICAgICAgICAgICAgICAgYXhpc0JpbmRpbmdPcGVyYXRpb24uYWRkRmF1bHQoYXhpc0JpbmRpbmdNZXNzYWdlRmF1bHQpOwotICAgICAgICAgICAgICAgIGFkZERvY3VtZW50YXRpb24oYXhpc0JpbmRpbmdNZXNzYWdlRmF1bHQsIGJpbmRpbmdGYXVsdFJlZmVyZW5jZS50b0VsZW1lbnQoKSk7Ci0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYXhpc0JpbmRpbmcuc2V0UHJvcGVydHkoV1NETDJDb25zdGFudHMuSFRUUF9MT0NBVElPTl9UQUJMRSwgaHR0cExvY2F0aW9uVGFibGUpOwotICAgICAgICAgICAgYXhpc0JpbmRpbmcuYWRkQ2hpbGQoYXhpc0JpbmRpbmdPcGVyYXRpb24uZ2V0TmFtZSgpLCBheGlzQmluZGluZ09wZXJhdGlvbik7Ci0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzSW50ZXJmYWNlKEludGVyZmFjZSBzZXJ2aWNlSW50ZXJmYWNlKQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0KLSAgICAgICAgLy8gVE9ETyBjb3B5IHRoZSBwb2xpY3kgZWxlbWVudHMKLSAgICAgICAgLy8gY29weUV4dGVuc2lvbkF0dHJpYnV0ZXMod3NkbDRqUG9ydFR5cGUuZ2V0RXh0ZW5zaW9uQXR0cmlidXRlcygpLAotICAgICAgICAvLyBheGlzU2VydmljZSwgUE9SVF9UWVBFKTsKLQotICAgICAgICBJbnRlcmZhY2VPcGVyYXRpb25bXSBpbnRlcmZhY2VPcGVyYXRpb25zID0gc2VydmljZUludGVyZmFjZQotICAgICAgICAgICAgICAgIC5nZXRJbnRlcmZhY2VPcGVyYXRpb25zKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW50ZXJmYWNlT3BlcmF0aW9ucy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgYXhpc1NlcnZpY2UuYWRkT3BlcmF0aW9uKHBvcHVsYXRlT3BlcmF0aW9ucyhpbnRlcmZhY2VPcGVyYXRpb25zW2ldKSk7Ci0gICAgICAgICAgICBvcGVyYXRpb25OYW1lcy5hZGQoaW50ZXJmYWNlT3BlcmF0aW9uc1tpXS5nZXROYW1lKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgSW50ZXJmYWNlW10gZXh0ZW5kZWRJbnRlcmZhY2VzID0gc2VydmljZUludGVyZmFjZS5nZXRFeHRlbmRlZEludGVyZmFjZXMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbmRlZEludGVyZmFjZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIEludGVyZmFjZSBleHRlbmRlZEludGVyZmFjZSA9IGV4dGVuZGVkSW50ZXJmYWNlc1tpXTsKLSAgICAgICAgICAgIHByb2Nlc3NJbnRlcmZhY2UoZXh0ZW5kZWRJbnRlcmZhY2UpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwcml2YXRlIEF4aXNPcGVyYXRpb24gcG9wdWxhdGVPcGVyYXRpb25zKEludGVyZmFjZU9wZXJhdGlvbiBvcGVyYXRpb24pIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBRTmFtZSBvcE5hbWUgPSBvcGVyYXRpb24uZ2V0TmFtZSgpOwotICAgICAgICAvLyBDb3B5IE5hbWUgQXR0cmlidXRlCi0gICAgICAgIEF4aXNPcGVyYXRpb24gYXhpc09wZXJhdGlvbiA9IGF4aXNTZXJ2aWNlLmdldE9wZXJhdGlvbihvcE5hbWUpOwotCi0gICAgICAgIGlmIChheGlzT3BlcmF0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgIFVSSSBwYXR0ZXJuID0gb3BlcmF0aW9uLmdldE1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4oKTsKLSAgICAgICAgICAgIFN0cmluZyBNRVA7Ci0gICAgICAgICAgICBpZiAocGF0dGVybiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTUVQID0gV1NETDIwRGVmYXVsdFZhbHVlSG9sZGVyLmdldERlZmF1bHRWYWx1ZShXU0RMMkNvbnN0YW50cy5BVFRSX1dTT0FQX01FUCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIE1FUCA9IHBhdHRlcm4udG9TdHJpbmcoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKCFpc1NlcnZlclNpZGUpewotICAgICAgICAgICAgCS8vIElmIGluIHRoZSBjbGllbnQsIG5lZWQgdG8gdG9nZ2xlIGluLW91dCB0byBvdXQtaW4gZXRjLgotICAgICAgICAgICAgCWlmKFdTREwyQ29uc3RhbnRzLk1FUF9VUklfSU5fT1VULmVxdWFscyhNRVApKXsKLSAgICAgICAgICAgIAkJTUVQID0gV1NETDJDb25zdGFudHMuTUVQX1VSSV9PVVRfSU47Ci0gICAgICAgICAgICAJfQotICAgICAgICAgICAgCWlmKFdTREwyQ29uc3RhbnRzLk1FUF9VUklfSU5fT05MWS5lcXVhbHMoTUVQKSl7Ci0gICAgICAgICAgICAJCU1FUCA9IFdTREwyQ29uc3RhbnRzLk1FUF9VUklfT1VUX09OTFk7Ci0gICAgICAgICAgICAJfQotICAgICAgICAgICAgCWlmKFdTREwyQ29uc3RhbnRzLk1FUF9VUklfSU5fT1BUSU9OQUxfT1VULmVxdWFscyhNRVApKXsKLSAgICAgICAgICAgIAkJTUVQID0gV1NETDJDb25zdGFudHMuTUVQX1VSSV9PVVRfT1BUSU9OQUxfSU47Ci0gICAgICAgICAgICAJfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXhpc09wZXJhdGlvbiA9IEF4aXNPcGVyYXRpb25GYWN0b3J5LmdldE9wZXJhdGlvbkRlc2NyaXB0aW9uKE1FUCk7Ci0gICAgICAgICAgICBheGlzT3BlcmF0aW9uLnNldE5hbWUob3BOYW1lKTsKLQotICAgICAgICB9Ci0gICAgICAgIFVSSVtdIG9wZXJhdGlvblN0eWxlID0gb3BlcmF0aW9uLmdldFN0eWxlKCk7Ci0gICAgICAgIGlmIChvcGVyYXRpb25TdHlsZSAhPSBudWxsICYmIG9wZXJhdGlvblN0eWxlLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgIFBhcmFtZXRlciBvcFN0eWxlUGFyYW1ldGVyID0gbmV3IFBhcmFtZXRlcigpOwotICAgICAgICAgICAgb3BTdHlsZVBhcmFtZXRlci5zZXROYW1lKFdTREwyQ29uc3RhbnRzLk9QRVJBVElPTl9TVFlMRSk7Ci0gICAgICAgICAgICBvcFN0eWxlUGFyYW1ldGVyLnNldFZhbHVlKG9wZXJhdGlvblN0eWxlKTsKLSAgICAgICAgICAgIGF4aXNPcGVyYXRpb24uYWRkUGFyYW1ldGVyKG9wU3R5bGVQYXJhbWV0ZXIpOwotICAgICAgICB9Ci0gICAgICAgIGFkZERvY3VtZW50YXRpb24oYXhpc09wZXJhdGlvbiwgb3BlcmF0aW9uLnRvRWxlbWVudCgpKTsKLQotICAgICAgICAvLyBhc3N1bWluZyB0aGUgc3R5bGUgb2YgdGhlIG9wZXJhdGlvbnMgb2YgV1NETCAyLjAgaXMgYWx3YXlzIGRvY3VtZW50LCBmb3IgdGhlIHRpbWUgYmVpbmcgOikKLSAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBjYW4gYmUgdXNlZCB0byBjYXB0dXJlIHRoZSB3c2RseDpzYWZlIGF0dHJpYnV0ZQotCi0gICAgICAgIEludGVyZmFjZU9wZXJhdGlvbkV4dGVuc2lvbnNJbXBsIGludGVyZmFjZU9wZXJhdGlvbkV4dGVuc2lvbnM7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpbnRlcmZhY2VPcGVyYXRpb25FeHRlbnNpb25zID0gKEludGVyZmFjZU9wZXJhdGlvbkV4dGVuc2lvbnNJbXBsKSBvcGVyYXRpb24KLSAgICAgICAgICAgICAgICAgICAgLmdldENvbXBvbmVudEV4dGVuc2lvbkNvbnRleHQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFVSSShXU0RMMkNvbnN0YW50cy5VUklfV1NETDJfRVhURU5TSU9OUykpOwotICAgICAgICB9IGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiV1NETDIgZXh0ZW5zaW9ucyBub3QgZGVmaW5lZCBmb3IgdGhpcyBvcGVyYXRpb24iKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpbnRlcmZhY2VPcGVyYXRpb25FeHRlbnNpb25zICE9IG51bGwpIHsKLSAgICAgICAgICAgIFBhcmFtZXRlciBwYXJhbWV0ZXIgPSBuZXcgUGFyYW1ldGVyKFdTREwyQ29uc3RhbnRzLkFUVFJfV1NETFhfU0FGRSwgQm9vbGVhbi52YWx1ZU9mKAotICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2VPcGVyYXRpb25FeHRlbnNpb25zLmlzU2FmZSgpKSk7Ci0gICAgICAgICAgICBheGlzT3BlcmF0aW9uLmFkZFBhcmFtZXRlcihwYXJhbWV0ZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgUlBDSW50ZXJmYWNlT3BlcmF0aW9uRXh0ZW5zaW9ucyBycGNJbnRlcmZhY2VPcGVyYXRpb25FeHRlbnNpb25zOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcnBjSW50ZXJmYWNlT3BlcmF0aW9uRXh0ZW5zaW9ucyA9IChSUENJbnRlcmZhY2VPcGVyYXRpb25FeHRlbnNpb25zKSBvcGVyYXRpb24KLSAgICAgICAgICAgICAgICAgICAgLmdldENvbXBvbmVudEV4dGVuc2lvbkNvbnRleHQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFVSSShXU0RMMkNvbnN0YW50cy5VUklfV1NETDJfUlBDKSk7Ci0gICAgICAgIH0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJXU0RMMiBleHRlbnNpb25zIG5vdCBkZWZpbmVkIGZvciB0aGlzIG9wZXJhdGlvbiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHJwY0ludGVyZmFjZU9wZXJhdGlvbkV4dGVuc2lvbnMgIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIHJwY3NpZyA9ICIiOwotICAgICAgICAgICAgQXJndW1lbnRbXSBzaWduYXR1cmVzID0gcnBjSW50ZXJmYWNlT3BlcmF0aW9uRXh0ZW5zaW9ucy5nZXRSUENTaWduYXR1cmUoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2lnbmF0dXJlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIEFyZ3VtZW50IHNpZ0FyZ3VtZW50ID0gc2lnbmF0dXJlc1tpXTsKLSAgICAgICAgICAgICAgICBycGNzaWcgPSBycGNzaWcgKyBzaWdBcmd1bWVudC5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCkgKyAiICIgKyBzaWdBcmd1bWVudC5nZXREaXJlY3Rpb24oKSArICIgIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFBhcmFtZXRlciBwYXJhbWV0ZXIgPSBuZXcgUGFyYW1ldGVyKFdTREwyQ29uc3RhbnRzLkFUVFJfV1JQQ19TSUdOQVRVUkUsIHJwY3NpZyk7Ci0gICAgICAgICAgICBheGlzT3BlcmF0aW9uLmFkZFBhcmFtZXRlcihwYXJhbWV0ZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgSW50ZXJmYWNlTWVzc2FnZVJlZmVyZW5jZVtdIGludGVyZmFjZU1lc3NhZ2VSZWZlcmVuY2VzID0gb3BlcmF0aW9uCi0gICAgICAgICAgICAgICAgLmdldEludGVyZmFjZU1lc3NhZ2VSZWZlcmVuY2VzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW50ZXJmYWNlTWVzc2FnZVJlZmVyZW5jZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIEludGVyZmFjZU1lc3NhZ2VSZWZlcmVuY2UgbWVzc2FnZVJlZmVyZW5jZSA9IGludGVyZmFjZU1lc3NhZ2VSZWZlcmVuY2VzW2ldOwotICAgICAgICAgICAgaWYgKG1lc3NhZ2VSZWZlcmVuY2UuZ2V0TWVzc2FnZUxhYmVsKCkuZXF1YWxzKAotICAgICAgICAgICAgICAgICAgICBNZXNzYWdlTGFiZWwuSU4pKSB7Ci0gICAgICAgICAgICAgICAgLy8gSXRzIGFuIGlucHV0IG1lc3NhZ2UKLQotICAgICAgICAgICAgICAgIGlmIChpc1NlcnZlclNpZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgY3JlYXRlQXhpc01lc3NhZ2UoYXhpc09wZXJhdGlvbiwgbWVzc2FnZVJlZmVyZW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NETENvbnN0YW50cy5NRVNTQUdFX0xBQkVMX0lOX1ZBTFVFKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBjcmVhdGVBeGlzTWVzc2FnZShheGlzT3BlcmF0aW9uLCBtZXNzYWdlUmVmZXJlbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU0RMQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfT1VUX1ZBTFVFKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1lc3NhZ2VSZWZlcmVuY2UuZ2V0TWVzc2FnZUxhYmVsKCkuZXF1YWxzKAotICAgICAgICAgICAgICAgICAgICBNZXNzYWdlTGFiZWwuT1VUKSkgewotICAgICAgICAgICAgICAgIGlmIChpc1NlcnZlclNpZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgY3JlYXRlQXhpc01lc3NhZ2UoYXhpc09wZXJhdGlvbiwgbWVzc2FnZVJlZmVyZW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NETENvbnN0YW50cy5NRVNTQUdFX0xBQkVMX09VVF9WQUxVRSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgY3JlYXRlQXhpc01lc3NhZ2UoYXhpc09wZXJhdGlvbiwgbWVzc2FnZVJlZmVyZW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NETENvbnN0YW50cy5NRVNTQUdFX0xBQkVMX0lOX1ZBTFVFKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGFkZCBvcGVyYXRpb24gbGV2ZWwgZmF1bHRzCi0KLSAgICAgICAgSW50ZXJmYWNlRmF1bHRSZWZlcmVuY2VbXSBmYXVsdHMgPSBvcGVyYXRpb24uZ2V0SW50ZXJmYWNlRmF1bHRSZWZlcmVuY2VzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmF1bHRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBBeGlzTWVzc2FnZSBmYXVsdE1lc3NhZ2UgPSBuZXcgQXhpc01lc3NhZ2UoKTsKLQotICAgICAgICAgICAgSW50ZXJmYWNlRmF1bHRSZWZlcmVuY2UgaW50ZXJmYWNlRmF1bHRSZWZlcmVuY2UgPSBmYXVsdHNbaV07Ci0gICAgICAgICAgICBmYXVsdE1lc3NhZ2Uuc2V0RGlyZWN0aW9uKGludGVyZmFjZUZhdWx0UmVmZXJlbmNlLmdldERpcmVjdGlvbigpLnRvU3RyaW5nKCkpOwotCi0gICAgICAgICAgICBJbnRlcmZhY2VGYXVsdCBpbnRlcmZhY2VGYXVsdCA9IGludGVyZmFjZUZhdWx0UmVmZXJlbmNlLmdldEludGVyZmFjZUZhdWx0KCk7Ci0KLSAgICAgICAgICAgIGlmIChpbnRlcmZhY2VGYXVsdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiSW50ZXJmYWNlIEZhdWx0IHJlZmVyZW5jZSBkZWZpbmVkIGluIG9wZXJhdGlvbiAiICsgb3BOYW1lICsgIiBjYW5ub3QgYmUgZm91bmQgaW4gaW50ZXJmYWNlIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZhdWx0TWVzc2FnZS5zZXRFbGVtZW50UU5hbWUoaW50ZXJmYWNlRmF1bHQuZ2V0RWxlbWVudERlY2xhcmF0aW9uKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIGZhdWx0TWVzc2FnZS5zZXROYW1lKGludGVyZmFjZUZhdWx0LmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKSk7Ci0KLSAgICAgICAgICAgIGF4aXNPcGVyYXRpb24uc2V0RmF1bHRNZXNzYWdlcyhmYXVsdE1lc3NhZ2UpOwotICAgICAgICB9Ci0KLQotICAgICAgICByZXR1cm4gYXhpc09wZXJhdGlvbjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlQXhpc01lc3NhZ2UoQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlcmZhY2VNZXNzYWdlUmVmZXJlbmNlIG1lc3NhZ2VSZWZlcmVuY2UsIFN0cmluZyBtZXNzYWdlTGFiZWwpCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgQXhpc01lc3NhZ2UgbWVzc2FnZSA9IGF4aXNPcGVyYXRpb24KLSAgICAgICAgICAgICAgICAuZ2V0TWVzc2FnZShtZXNzYWdlTGFiZWwpOwotCi0gICAgICAgIFN0cmluZyBtZXNzYWdlQ29udGVudE1vZGVsTmFtZSA9IG1lc3NhZ2VSZWZlcmVuY2UuZ2V0TWVzc2FnZUNvbnRlbnRNb2RlbCgpOwotICAgICAgICBRTmFtZSBlbGVtZW50UU5hbWUgPSBudWxsOwotCi0gICAgICAgIGlmIChXU0RMMkNvbnN0YW50cy5OTVRPS0VOX0VMRU1FTlQuZXF1YWxzKG1lc3NhZ2VDb250ZW50TW9kZWxOYW1lKSkgewotICAgICAgICAgICAgRWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnREZWNsYXJhdGlvbiA9IG1lc3NhZ2VSZWZlcmVuY2UuZ2V0RWxlbWVudERlY2xhcmF0aW9uKCk7Ci0gICAgICAgICAgICBpZiAoZWxlbWVudERlY2xhcmF0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBJbnRlcmZhY2VNZXNzYWdlUmVmZXJlbmNlRWxlbWVudCBtZXNzYWdlUmVmZXJlbmNlRWxlbWVudCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUmVmZXJlbmNlLnRvRWxlbWVudCgpOwotICAgICAgICAgICAgICAgIFFOYW1lIHFOYW1lID0gbWVzc2FnZVJlZmVyZW5jZUVsZW1lbnQuZ2V0RWxlbWVudCgpLmdldFFOYW1lKCk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiVW5hYmxlIHRvIGZpbmQgZWxlbWVudCAiICsgcU5hbWUudG9TdHJpbmcoKSArICIgcmVmZmVyZWQgdG8gYnkgb3BlcmF0aW9uICIgKyBheGlzT3BlcmF0aW9uLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbGVtZW50UU5hbWUgPSBlbGVtZW50RGVjbGFyYXRpb24uZ2V0TmFtZSgpOwotICAgICAgICB9IGVsc2UgaWYgKFdTREwyQ29uc3RhbnRzLk5NVE9LRU5fQU5ZLmVxdWFscyhtZXNzYWdlQ29udGVudE1vZGVsTmFtZSkpIHsKLSAgICAgICAgICAgIGVsZW1lbnRRTmFtZSA9IENvbnN0YW50cy5YU0RfQU5ZOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgaWYgKFdTREwyQ29uc3RhbnRzLk5NVE9LRU5fTk9ORS5lcXVhbHMobWVzc2FnZUNvbnRlbnRNb2RlbE5hbWUpKSB7Ci0gICAgICAgICAgICAvLyBub3RoaW5nIHRvIGRvIGhlcmUga2VlcCB0aGUgbWVzc2FnZSBlbGVtZW50IGFzIG51bGwKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoIlNvcnJ5IHdlIGRvIG5vdCBzdXBwb3J0ICIgKyBtZXNzYWdlQ29udGVudE1vZGVsTmFtZSArCi0gICAgICAgICAgICAgICAgICAgICIuIFdlIGRvIG9ubHkgc3VwcG9ydCAjYW55LCAjbm9uZSBhbmQgI2VsZW1lbnQgYXMgbWVzc2FnZSBjb250ZW50IG1vZGVscy4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1lc3NhZ2Uuc2V0RWxlbWVudFFOYW1lKGVsZW1lbnRRTmFtZSk7Ci0gICAgICAgIG1lc3NhZ2Uuc2V0TmFtZShlbGVtZW50UU5hbWUgIT0gbnVsbCA/IGVsZW1lbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSA6IGF4aXNPcGVyYXRpb24uZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgYXhpc09wZXJhdGlvbi5hZGRNZXNzYWdlKG1lc3NhZ2UsIG1lc3NhZ2VMYWJlbCk7Ci0KLSAgICAgICAgCi0gICAgICAgIGlmKFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9JTl9WQUxVRS5lcXVhbHMobWVzc2FnZUxhYmVsKSl7Ci0gICAgICAgIAlYTUxBdHRyIHhhID0gbWVzc2FnZVJlZmVyZW5jZS50b0VsZW1lbnQoKS5nZXRFeHRlbnNpb25BdHRyaWJ1dGUobmV3IFFOYW1lKCJodHRwOi8vd3d3LnczLm9yZy8yMDA2LzA1L2FkZHJlc3Npbmcvd3NkbCIsIkFjdGlvbiIpKTsKLSAgICAgICAgCWlmKHhhIT1udWxsKXsKLSAgICAgICAgCQlTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKXhhLmdldENvbnRlbnQoKTsKLSAgICAgICAgCQlpZih2YWx1ZSAhPSBudWxsKXsKLSAgICAgICAgCQkJQXJyYXlMaXN0IGFsID0gYXhpc09wZXJhdGlvbi5nZXRXU0FNYXBwaW5nTGlzdCgpOwotICAgICAgICAJCQlpZihhbCA9PSBudWxsKXsKLSAgICAgICAgCQkJCWFsID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAJCQkJYXhpc09wZXJhdGlvbi5zZXRXc2FtYXBwaW5nTGlzdChhbCk7Ci0gICAgICAgIAkJCX0KLSAgICAgICAgCQkJYWwuYWRkKHZhbHVlKTsKLSAgICAgICAgCQl9Ci0gICAgICAgIAl9Ci0gICAgICAgIH1lbHNlewotICAgICAgICAJWE1MQXR0ciB4YSA9IG1lc3NhZ2VSZWZlcmVuY2UudG9FbGVtZW50KCkuZ2V0RXh0ZW5zaW9uQXR0cmlidXRlKG5ldyBRTmFtZSgiaHR0cDovL3d3dy53My5vcmcvMjAwNi8wNS9hZGRyZXNzaW5nL3dzZGwiLCJBY3Rpb24iKSk7Ci0gICAgICAgIAlpZih4YSE9bnVsbCl7Ci0gICAgICAgIAkJU3RyaW5nIHZhbHVlID0gKFN0cmluZyl4YS5nZXRDb250ZW50KCk7Ci0gICAgICAgIAkJaWYodmFsdWUgIT0gbnVsbCl7Ci0gICAgICAgIAkJCWF4aXNPcGVyYXRpb24uc2V0T3V0cHV0QWN0aW9uKHZhbHVlKTsKLSAgICAgICAgCQl9Ci0gICAgICAgIAl9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIHBvcHVsYXRlIHRoaXMgbWFwIHNvIHRoYXQgdGhpcyBjYW4gYmUgdXNlZCBpbiBTT0FQQm9keSBiYXNlZCBkaXNwYXRjaGluZwotICAgICAgICBpZiAoZWxlbWVudFFOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIGF4aXNTZXJ2aWNlCi0gICAgICAgICAgICAgICAgICAgIC5hZGRNZXNzYWdlRWxlbWVudFFOYW1lVG9PcGVyYXRpb25NYXBwaW5nKGVsZW1lbnRRTmFtZSwgYXhpc09wZXJhdGlvbik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIERlc2NyaXB0aW9uIHJlYWRJblRoZVdTRExGaWxlKFN0cmluZyB3c2RsVVJJKSB0aHJvd3MgV1NETEV4Y2VwdGlvbiwgQXhpc0ZhdWx0IHsKLSAgICAgICAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBkb2N1bWVudEJ1aWxkZXJGYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeQotICAgICAgICAgICAgICAgIC5uZXdJbnN0YW5jZSgpOwotICAgICAgICBkb2N1bWVudEJ1aWxkZXJGYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOwotICAgICAgICBEb2N1bWVudEJ1aWxkZXIgZG9jdW1lbnRCdWlsZGVyOwotICAgICAgICBEb2N1bWVudCBkb2N1bWVudDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGRvY3VtZW50QnVpbGRlciA9IGRvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0gICAgICAgICAgICBkb2N1bWVudCA9IGRvY3VtZW50QnVpbGRlci5wYXJzZSh3c2RsVVJJKTsKLSAgICAgICAgfSBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBBeGlzRmF1bHQubWFrZUZhdWx0KGUpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBBeGlzRmF1bHQubWFrZUZhdWx0KGUpOwotICAgICAgICB9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVhZEluVGhlV1NETEZpbGUoZG9jdW1lbnQpOwotICAgIH0KLQotICAgIHByaXZhdGUgRGVzY3JpcHRpb24gcmVhZEluVGhlV1NETEZpbGUoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHRocm93cyBXU0RMRXhjZXB0aW9uLCBBeGlzRmF1bHQgewotCi0gICAgICAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBkb2N1bWVudEJ1aWxkZXJGYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeQotICAgICAgICAgICAgICAgIC5uZXdJbnN0YW5jZSgpOwotICAgICAgICBkb2N1bWVudEJ1aWxkZXJGYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOwotICAgICAgICBEb2N1bWVudEJ1aWxkZXIgZG9jdW1lbnRCdWlsZGVyOwotICAgICAgICBEb2N1bWVudCBkb2N1bWVudDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGRvY3VtZW50QnVpbGRlciA9IGRvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0gICAgICAgICAgICBkb2N1bWVudCA9IGRvY3VtZW50QnVpbGRlci5wYXJzZShpbnB1dFN0cmVhbSk7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKTsKLSAgICAgICAgfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEF4aXNGYXVsdC5tYWtlRmF1bHQoZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlYWRJblRoZVdTRExGaWxlKGRvY3VtZW50KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIERlc2NyaXB0aW9uIHJlYWRJblRoZVdTRExGaWxlKERvY3VtZW50IGRvY3VtZW50KSB0aHJvd3MgV1NETEV4Y2VwdGlvbiB7Ci0gICAgICAgIFdTRExSZWFkZXIgcmVhZGVyID0gRE9NV1NETEZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdXU0RMUmVhZGVyKCk7Ci0gICAgICAgIGlmIChjdXN0b21XU0RMUmVzb2x2ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgcmVhZGVyLnNldFVSSVJlc29sdmVyKGN1c3RvbVdTRExSZXNvbHZlcik7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gVGhpcyB0dXJucyBvbiBXU0RMIHZhbGlkYXRpb24gd2hpY2ggaXMgc2V0IG9mZiBieSBkZWZhdWx0LgotICAgICAgICByZWFkZXIuc2V0RmVhdHVyZShXU0RMUmVhZGVyLkZFQVRVUkVfVkFMSURBVElPTiwgdHJ1ZSk7Ci0gICAgICAgIFdTRExTb3VyY2Ugd3NkbFNvdXJjZSA9IHJlYWRlci5jcmVhdGVXU0RMU291cmNlKCk7Ci0gICAgICAgIHdzZGxTb3VyY2Uuc2V0U291cmNlKGRvY3VtZW50LmdldERvY3VtZW50RWxlbWVudCgpKTsKLSAgICAgICAgU3RyaW5nIHVyaSA9IGdldEJhc2VVcmkoKTsKLSAgICAgICAgaWYgKHVyaSAhPSBudWxsICYmICEiIi5lcXVhbHModXJpKSkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICB3c2RsU291cmNlLnNldEJhc2VVUkkobmV3IFVSSSh1cmkpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUodXJpKTsKLSAgICAgICAgICAgICAgICBpZihmLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHdzZGxTb3VyY2Uuc2V0QmFzZVVSSShmLnRvVVJJKCkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcihlLnRvU3RyaW5nKCksIGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiUmVhZGluZyAyLjAgV1NETCB3aXRoIHdzZGwgdXJpID0gIiArIHdzZGxVUkkpOwotICAgICAgICAgICAgbG9nLnRyYWNlKCIgIHRoZSBzdGFjayBhdCB0aGlzIHBvaW50IGlzOiAiICsgc3RhY2tUb1N0cmluZygpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVhZGVyLnJlYWRXU0RMKHdzZGxTb3VyY2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnQgd29kZW4gZGVwZW5kZW50IFNPQVBIZWFkZXJCbG9jayBvYmplY3RzIHRvIFNPQVBIZWFkZXJNZXNzYWdlIG9iamVjdHMKLSAgICAgKgotICAgICAqIEBwYXJhbSBzb2FwSGVhZGVyQmxvY2tzIC0gQW4gYXJyYXkgb2YgU09BUEhlYWRlckJsb2NrIG9iamVjdHMKLSAgICAgKiBAcmV0dXJuIEFycmF5TGlzdCAtIEFuIEFycmF5TGlzdCBvZiBTT0FQSGVhZGVyTWVzc2FnZSBvYmplY3RzCi0gICAgICovCi0gICAgcHJpdmF0ZSBBcnJheUxpc3QgY3JlYXRlU29hcEhlYWRlcnMoU09BUEhlYWRlckJsb2NrIHNvYXBIZWFkZXJCbG9ja3NbXSkgewotCi0gICAgICAgIGlmIChzb2FwSGVhZGVyQmxvY2tzLmxlbmd0aCA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBBcnJheUxpc3Qgc29hcEhlYWRlck1lc3NhZ2VzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc29hcEhlYWRlckJsb2Nrcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgU09BUEhlYWRlckJsb2NrIHNvYXBIZWFkZXJCbG9jayA9IHNvYXBIZWFkZXJCbG9ja3NbaV07Ci0gICAgICAgICAgICBFbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudERlY2xhcmF0aW9uID0gc29hcEhlYWRlckJsb2NrLmdldEVsZW1lbnREZWNsYXJhdGlvbigpOwotCi0gICAgICAgICAgICBpZiAoZWxlbWVudERlY2xhcmF0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBRTmFtZSBuYW1lID0gZWxlbWVudERlY2xhcmF0aW9uLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICBTT0FQSGVhZGVyTWVzc2FnZSBzb2FwSGVhZGVyTWVzc2FnZSA9IG5ldyBTT0FQSGVhZGVyTWVzc2FnZSgpOwotICAgICAgICAgICAgICAgIHNvYXBIZWFkZXJNZXNzYWdlLnNldEVsZW1lbnQobmFtZSk7Ci0gICAgICAgICAgICAgICAgc29hcEhlYWRlck1lc3NhZ2Uuc2V0UmVxdWlyZWQoc29hcEhlYWRlckJsb2NrLmlzUmVxdWlyZWQoKS5ib29sZWFuVmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgc29hcEhlYWRlck1lc3NhZ2UKLSAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRNdXN0VW5kZXJzdGFuZChzb2FwSGVhZGVyQmxvY2subXVzdFVuZGVyc3RhbmQoKS5ib29sZWFuVmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgc29hcEhlYWRlck1lc3NhZ2VzLmFkZChzb2FwSGVhZGVyTWVzc2FnZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNvYXBIZWFkZXJNZXNzYWdlczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0IHdvZGVuIGRlcGVuZGVudCBTT0FQSGVhZGVyQmxvY2sgb2JqZWN0cyB0byBTT0FQSGVhZGVyTWVzc2FnZSBvYmplY3RzCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc29hcE1vZHVsZXMgLSBBbiBhcnJheSBvZiBTT0FQTW9kdWxlIG9iamVjdHMKLSAgICAgKiBAcmV0dXJuIEFycmF5TGlzdCAtIEFuIEFycmF5TGlzdCBvZiBTT0FQSGVhZGVyTWVzc2FnZSBvYmplY3RzCi0gICAgICovCi0gICAgcHJpdmF0ZSBBcnJheUxpc3QgY3JlYXRlU29hcE1vZHVsZXMoU09BUE1vZHVsZSBzb2FwTW9kdWxlc1tdKSB7Ci0KLSAgICAgICAgaWYgKHNvYXBNb2R1bGVzLmxlbmd0aCA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBBcnJheUxpc3Qgc29hcE1vZHVsZU1lc3NhZ2VzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc29hcE1vZHVsZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFNPQVBNb2R1bGUgc29hcE1vZHVsZSA9IHNvYXBNb2R1bGVzW2ldOwotICAgICAgICAgICAgU09BUE1vZHVsZU1lc3NhZ2Ugc29hcE1vZHVsZU1lc3NhZ2UgPSBuZXcgU09BUE1vZHVsZU1lc3NhZ2UoKTsKLSAgICAgICAgICAgIHNvYXBNb2R1bGVNZXNzYWdlLnNldFVyaShzb2FwTW9kdWxlLmdldFJlZigpLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgc29hcE1vZHVsZU1lc3NhZ2VzLmFkZChzb2FwTW9kdWxlTWVzc2FnZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNvYXBNb2R1bGVNZXNzYWdlczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0IHdvZGVuIGRlcGVuZGVudCBIVFRQSGVhZGVyIG9iamVjdHMgdG8gSGVhZGVyIG9iamVjdHMKLSAgICAgKgotICAgICAqIEBwYXJhbSBodHRwSGVhZGVycyAtIEFuIGFycmF5IG9mIEhUVFBIZWFkZXIgb2JqZWN0cwotICAgICAqIEByZXR1cm4gQXJyYXlMaXN0IC0gQW4gQXJyYXlMaXN0IG9mIEhlYWRlciBvYmplY3RzCi0gICAgICovCi0gICAgcHJpdmF0ZSBBcnJheUxpc3QgY3JlYXRlSHR0cEhlYWRlcnMoSFRUUEhlYWRlciBodHRwSGVhZGVyc1tdKSB7Ci0KLSAgICAgICAgaWYgKGh0dHBIZWFkZXJzLmxlbmd0aCA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBBcnJheUxpc3QgaHR0cEhlYWRlck1lc3NhZ2VzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaHR0cEhlYWRlcnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIEhUVFBIZWFkZXJJbXBsIGh0dHBIZWFkZXIgPSAoSFRUUEhlYWRlckltcGwpIGh0dHBIZWFkZXJzW2ldOwotICAgICAgICAgICAgSFRUUEhlYWRlck1lc3NhZ2UgaHR0cEhlYWRlck1lc3NhZ2UgPSBuZXcgSFRUUEhlYWRlck1lc3NhZ2UoKTsKLSAgICAgICAgICAgIGh0dHBIZWFkZXJNZXNzYWdlLnNldHFOYW1lKGh0dHBIZWFkZXIuZ2V0VHlwZU5hbWUoKSk7Ci0gICAgICAgICAgICBodHRwSGVhZGVyTWVzc2FnZS5zZXROYW1lKGh0dHBIZWFkZXIuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIGh0dHBIZWFkZXJNZXNzYWdlLnNldFJlcXVpcmVkKGh0dHBIZWFkZXIuaXNSZXF1aXJlZCgpLmJvb2xlYW5WYWx1ZSgpKTsKLSAgICAgICAgICAgIGh0dHBIZWFkZXJNZXNzYWdlcy5hZGQoaHR0cEhlYWRlck1lc3NhZ2UpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBodHRwSGVhZGVyTWVzc2FnZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBkb2N1bWVudGF0aW9uIGRldGFpbHMgdG8gYSBnaXZlbiBBeGlzRGVzY3JpcHRpb24uCi0gICAgICogVGhlIGRvY3VtZW50YXRpb24gZGV0YWlscyBpcyBleHRyYWN0ZWQgZnJvbSB0aGUgV1NETCBlbGVtZW50IGdpdmVuLgotICAgICAqIEBwYXJhbSBheGlzRGVzY3JpcHRpb24gLSBUaGUgZG9jdW1lbnRhdGlvbiB3aWxsIGJlIGFkZGVkIHRvIHRoaXMKLSAgICAgKiBAcGFyYW0gZWxlbWVudCAtIFRoZSBlbGVtZW50IHRoYXQgdGhlIGRvY3VtZW50YXRpb24gaXMgZXh0cmFjdGVkIGZyb20uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGFkZERvY3VtZW50YXRpb24oQXhpc0Rlc2NyaXB0aW9uIGF4aXNEZXNjcmlwdGlvbiwgRG9jdW1lbnRhYmxlRWxlbWVudCBlbGVtZW50KSB7Ci0gICAgICAgIERvY3VtZW50YXRpb25FbGVtZW50W10gZG9jdW1lbnRhdGlvbkVsZW1lbnRzID0gZWxlbWVudC5nZXREb2N1bWVudGF0aW9uRWxlbWVudHMoKTsKLSAgICAgICAgU3RyaW5nIGRvY3VtZW50YXRpb24gPSAiIjsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkb2N1bWVudGF0aW9uRWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIERvY3VtZW50YXRpb25FbGVtZW50IGRvY3VtZW50YXRpb25FbGVtZW50ID0gZG9jdW1lbnRhdGlvbkVsZW1lbnRzW2ldOwotICAgICAgICAgICAgWE1MRWxlbWVudCBjb250ZW50RWxlbWVudCA9IGRvY3VtZW50YXRpb25FbGVtZW50LmdldENvbnRlbnQoKTsKLSAgICAgICAgICAgIEVsZW1lbnQgY29udGVudCA9IChFbGVtZW50KWNvbnRlbnRFbGVtZW50LmdldFNvdXJjZSgpOwotICAgICAgICAgICAgaWYgKGNvbnRlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGRvY3VtZW50YXRpb24gPSBkb2N1bWVudGF0aW9uICsgRE9NMldyaXRlci5ub2RlVG9TdHJpbmcoY29udGVudC5nZXRGaXJzdENoaWxkKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICghIiIuZXF1YWxzKGRvY3VtZW50YXRpb24pKSB7Ci0gICAgICAgICAgICBheGlzRGVzY3JpcHRpb24uc2V0RG9jdW1lbnRhdGlvbihkb2N1bWVudGF0aW9uKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgc2V0RW5kcG9pbnRVUkwoQXhpc0VuZHBvaW50IGF4aXNFbmRwb2ludCwgU3RyaW5nIGVuZHBvaW50VVJMKSB7Ci0gICAgCWF4aXNFbmRwb2ludC5zZXRFbmRwb2ludFVSTChlbmRwb2ludFVSTCk7Ci0gICAgCXRyeSB7Ci0gICAgCQlVUkwgdXJsID0gbmV3IFVSTChlbmRwb2ludFVSTCk7Ci0gICAgCQlheGlzRW5kcG9pbnQuc2V0VHJhbnNwb3J0SW5EZXNjcmlwdGlvbih1cmwuZ2V0UHJvdG9jb2woKSk7Ci0gICAgCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgCQlsb2cuZGVidWcoZS5nZXRNZXNzYWdlKCksIGUpOwotCQl9ICAgIAkKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vV1NETDJDb25zdGFudHMuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9XU0RMMkNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzMwY2Q5Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9XU0RMMkNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbjsKLQotcHVibGljIGludGVyZmFjZSBXU0RMMkNvbnN0YW50cyB7Ci0KLSAgICBTdHJpbmcgV1NETF9OQU1FU1BBQ0UgPSAiaHR0cDovL3d3dy53My5vcmcvbnMvd3NkbCI7Ci0gICAgU3RyaW5nIERFRkFVTFRfV1NETF9OQU1FU1BBQ0VfUFJFRklYID0gIndzZGwyIjsKLSAgICBTdHJpbmcgREVTQ1JJUFRJT04gPSAiZGVzY3JpcHRpb24iOwotICAgIFN0cmluZyBVUklfV1NETDJfU09BUCA9ICJodHRwOi8vd3d3LnczLm9yZy9ucy93c2RsL3NvYXAiOwotICAgIFN0cmluZyBVUklfV1NETDJfSFRUUCA9ICJodHRwOi8vd3d3LnczLm9yZy9ucy93c2RsL2h0dHAiOwotICAgIFN0cmluZyBVUklfV1NETDJfRVhURU5TSU9OUyA9ICJodHRwOi8vd3d3LnczLm9yZy9ucy93c2RsLWV4dGVuc2lvbnMiOwotICAgIFN0cmluZyBVUklfV1NETDJfUlBDID0gImh0dHA6Ly93d3cudzMub3JnL25zL3dzZGwvcnBjIjsKLSAgICBTdHJpbmcgU09BUF9QUkVGSVggPSAid3NvYXAiOwotICAgIFN0cmluZyBIVFRQX1BSRUZJWCA9ICJ3aHR0cCI7Ci0gICAgU3RyaW5nIFdTRExfRVhURU5USU9OX1BSRUZJWCA9ICJ3c2RseCI7Ci0gICAgU3RyaW5nIFdTRExfUlBDX1BSRUZJWCA9ICJ3cnBjIjsKLSAgICBTdHJpbmcgU09BUF9FTlZfUFJFRklYID0gInNvYXAiOwotICAgIFN0cmluZyBERUZBVUxUX1RBUkdFVF9OQU1FU1BBQ0VfUFJFRklYID0gImF4aXMyIjsKLSAgICBTdHJpbmcgRE9DVU1FTlRBVElPTiA9ICJkb2N1bWVudGF0aW9uIjsKLQotICAgIFN0cmluZyBERUZBVUxUX1NPQVAxMV9FTkRQT0lOVF9OQU1FID0gIlNPQVAxMUVuZHBvaW50IjsKLSAgICBTdHJpbmcgREVGQVVMVF9TT0FQMTJfRU5EUE9JTlRfTkFNRSA9ICJTT0FQMTJFbmRwb2ludCI7Ci0gICAgU3RyaW5nIERFRkFVTFRfSFRUUF9FTkRQT0lOVF9OQU1FID0gIkhUVFBFbmRwb2ludCI7Ci0gICAgU3RyaW5nIERFRkFVTFRfSFRUUFNfUFJFRklYID0gIlNlY3VyZSI7Ci0gICAgU3RyaW5nIERFRkFVTFRfSU5URVJGQUNFX05BTUUgPSAiU2VydmljZUludGVyZmFjZSI7Ci0gICAgU3RyaW5nIFRZUEVTX0xPQ0FMX05BTEUgPSAidHlwZXMiOwotICAgIFN0cmluZyBJTlRFUkZBQ0VfTE9DQUxfTkFNRSA9ICJpbnRlcmZhY2UiOwotICAgIFN0cmluZyBJTlRFUkZBQ0VfUFJFRklYID0gIkludGVyZmFjZSI7Ci0gICAgU3RyaW5nIE9QRVJBVElPTl9MT0NBTF9OQU1FID0gIm9wZXJhdGlvbiI7Ci0gICAgU3RyaW5nIEFUVFJJQlVURV9OQU1FID0gIm5hbWUiOwotICAgIFN0cmluZyBUQVJHRVRfTkFNRVNQQUNFPSAidGFyZ2V0TmFtZXNwYWNlIjsKLSAgICBTdHJpbmcgQVRUUklCVVRFX1JFRiA9ICJyZWYiOwotICAgIFN0cmluZyBBVFRSSUJVVEVfTE9DQVRJT04gPSAibG9jYXRpb24iOwotICAgIFN0cmluZyBBVFRSSUJVVEVfQ09OVEVOVF9FTkNPRElOR19ERUZBVUxUID0gImNvbnRlbnRFbmNvZGluZ0RlZmF1bHQiOwotICAgIFN0cmluZyBBVFRSSUJVVEVfQ09OVEVOVF9FTkNPRElORyA9ICJjb250ZW50RW5jb2RpbmciOwotICAgIFN0cmluZyBBVFRSSUJVVEVfUVVFUllfUEFSQU1FVEVSX1NFUEVSQVRPUiA9ICJxdWVyeVBhcmFtZXRlclNlcGFyYXRvciI7Ci0gICAgU3RyaW5nIEFUVFJJQlVURV9RVUVSWV9QQVJBTUVURVJfU0VQRVJBVE9SX0RFRkFVTFQgPSAicXVlcnlQYXJhbWV0ZXJTZXBhcmF0b3JEZWZhdWx0IjsKLSAgICBTdHJpbmcgQVRUUklCVVRFX0FDVElPTiA9ICJhY3Rpb24iOwotICAgIFN0cmluZyBBVFRSSUJVVEVfTUVQID0gIm1lcCI7Ci0gICAgU3RyaW5nIEFUVFJJQlVURV9NRVBfREVGQVVMVCA9ICJtZXBEZWZhdWx0IjsKLSAgICBTdHJpbmcgQVRUUklCVVRFX01FVEhPRCA9ICJtZXRob2QiOwotICAgIFN0cmluZyBBVFRSSUJVVEVfTUVUSE9EX0RFRkFVTFQgPSAibWV0aG9kRGVmYXVsdCI7Ci0gICAgU3RyaW5nIEFUVFJJQlVURV9NT0RVTEUgPSAibW9kdWxlIjsKLSAgICBTdHJpbmcgQVRUUklCVVRFX0lHTk9SRV9VTkNJVEVEID0gImlnbm9yZVVuY2l0ZWQiOwotICAgIFN0cmluZyBBVFRSSUJVVEVfSU5QVVRfU0VSSUFMSVpBVElPTiA9ICJpbnB1dFNlcmlhbGl6YXRpb24iOwotICAgIFN0cmluZyBBVFRSSUJVVEVfT1VUUFVUX1NFUklBTElaQVRJT04gPSAib3V0cHV0U2VyaWFsaXphdGlvbiI7Ci0gICAgU3RyaW5nIEFUVFJJQlVURV9GQVVMVF9TRVJJQUxJWkFUSU9OID0gImZhdWx0U2VyaWFsaXphdGlvbiI7Ci0gICAgU3RyaW5nIEFUVFJJQlVURV9DT0RFID0gImNvZGUiOwotICAgIFN0cmluZyBBVFRSSUJVVEVfU1VCQ09ERVMgPSAic3ViY29kZXMiOwotICAgIFN0cmluZyBBVFRSSUJVVEVfSEVBREVSID0gImhlYWRlciI7Ci0gICAgU3RyaW5nIEFUVFJJQlVURV9UWVBFID0gInR5cGUiOwotICAgIFN0cmluZyBBVFRSSUJVVEVfUkVRVUlSRUQgPSAicmVxdWlyZWQiOwotICAgIFN0cmluZyBBVFRSSUJVVEVfTVVTVF9VTkRFUlNUQU5EID0gIm11c3RVbmRlcnN0YW5kIjsKLSAgICBTdHJpbmcgQVRUUklCVVRFX1ZFUlNJT04gPSAidmVyc2lvbiI7Ci0gICAgU3RyaW5nIEFUVFJJQlVURV9QUk9UT0NPTCA9ICJwcm90b2NvbCI7Ci0gICAgU3RyaW5nIEFUVFJJQlVURV9TQUZFID0gInNhZmUiOwotICAgIFN0cmluZyBBVFRSSUJVVEVfQUREUkVTUyA9ICJhZGRyZXNzIjsKLSAgICBTdHJpbmcgQVRUUklCVVRFX0FVVEhFTlRJQ0FUSU9OX1RZUEUgPSAiYXV0aGVudGljYXRpb25UeXBlIjsKLSAgICBTdHJpbmcgQVRUUklCVVRFX0FVVEhFTlRJQ0FUSU9OX1JFQUxNID0gImF1dGhlbnRpY2F0aW9uUmVhbG0iOwotICAgIFN0cmluZyBBVFRSSUJVVEVfU1RZTEUgPSAic3R5bGUiOwotICAgIFN0cmluZyBBVFRSSUJVVEVfU0lHTkFUVVJFID0gInNpZ25hdHVyZSI7Ci0gICAgU3RyaW5nIE9QRVJBVElPTl9TVFlMRSA9ICJvcGVyYXRpb25TdHlsZSI7Ci0gICAgU3RyaW5nIElOX1BVVF9MT0NBTF9OQU1FID0gImlucHV0IjsKLSAgICBTdHJpbmcgT1VUX1BVVF9MT0NBTF9OQU1FID0gIm91dHB1dCI7Ci0gICAgU3RyaW5nIE9VVF9GQVVMVF9MT0NBTF9OQU1FID0gIm91dGZhdWx0IjsKLSAgICBTdHJpbmcgSU5fRkFVTFRfTE9DQUxfTkFNRSA9ICJpbmZhdWx0IjsKLSAgICBTdHJpbmcgRkFVTFRfTE9DQUxfTkFNRSA9ICJmYXVsdCI7Ci0gICAgU3RyaW5nIEFUVFJJQlVURV9OQU1FX1BBVFRFUk4gPSAicGF0dGVybiI7Ci0gICAgU3RyaW5nIE1FU1NBR0VfTEFCRUwgPSAibWVzc2FnZUxhYmVsIjsKLSAgICBTdHJpbmcgQVRUUklCVVRFX0VMRU1FTlQgPSAiZWxlbWVudCI7Ci0KLSAgICBTdHJpbmcgQklORElOR19MT0NBTF9OQU1FID0gImJpbmRpbmciOwotICAgIFN0cmluZyBFTkRQT0lOVF9MT0NBTF9OQU1FID0gImVuZHBvaW50IjsKLSAgICBTdHJpbmcgU09BUF9CSU5ESU5HX1BSRUZJWCA9ICJTT0FQQmluZGluZyI7Ci0gICAgU3RyaW5nIEhUVFBfUFJPVE9DQUwgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwL2JpbmRpbmdzL0hUVFAiOwotICAgIFN0cmluZyBTRVJWSUNFX0xPQ0FMX05BTUUgPSAic2VydmljZSI7Ci0KLSAgICBTdHJpbmcgVVJJX1dTT0FQX01FUCA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAvbWVwL3NvYXAtcmVzcG9uc2UvIjsKLQotICAgIFN0cmluZyBBVFRSX1dTT0FQX1BST1RPQ09MID0gIndzb2FwOnByb3RvY29sIjsKLSAgICBTdHJpbmcgQVRUUl9XU09BUF9WRVJTSU9OID0gIndzb2FwOnZlcnNpb24iOwotICAgIFN0cmluZyBBVFRSX1dTT0FQX0NPREUgPSAid3NvYXA6Y29kZSI7Ci0gICAgU3RyaW5nIEFUVFJfV1NPQVBfTUVQID0gIndzb2FwOm1lcCI7Ci0gICAgU3RyaW5nIEFUVFJfV1NPQVBfTU9EVUxFID0gIndzb2FwOm1vZHVsZSI7Ci0gICAgU3RyaW5nIEFUVFJfV1NPQVBfU1VCQ09ERVMgPSAid3NvYXA6c3ViY29kZXMiOwotICAgIFN0cmluZyBBVFRSX1dTT0FQX0hFQURFUiA9ICJ3c29hcDpoZWFkZXIiOwotICAgIFN0cmluZyBBVFRSX1dTT0FQX0FDVElPTiA9ICJ3c29hcDphY3Rpb24iOwotICAgIFN0cmluZyBBVFRSX1dTT0FQX0FERFJFU1MgPSAid3NvYXA6YWRkcmVzcyI7Ci0KLSAgICBTdHJpbmcgQVRUUl9XSFRUUF9DT05URU5UX0VOQ09ESU5HID0gIndodHRwOmNvbnRlbnRFbmNvZGluZyI7Ci0gICAgU3RyaW5nIEFUVFJfV0hUVFBfTE9DQVRJT04gPSAid2h0dHA6bG9jYXRpb24iOwotICAgIFN0cmluZyBBVFRSX1dIVFRQX0hFQURFUiA9ICJ3aHR0cDpoZWFkZXIiOwotICAgIFN0cmluZyBBVFRSX1dIVFRQX01FVEhPRCA9ICJ3aHR0cDptZXRob2QiOwotICAgIFN0cmluZyBBVFRSX1dIVFRQX0NPREUgPSAid2h0dHA6Y29kZSI7Ci0gICAgU3RyaW5nIEFUVFJfV0hUVFBfUVVFUllfUEFSQU1FVEVSX1NFUEFSQVRPUiA9ICJ3aHR0cDpxdWVyeVBhcmFtZXRlclNlcGFyYXRvciI7Ci0gICAgU3RyaW5nIEFUVFJfV0hUVFBfSUdOT1JFX1VOQ0lURUQgPSAid2h0dHA6aWdub3JlVW5jaXRlZCI7Ci0gICAgU3RyaW5nIEFUVFJfV0hUVFBfSU5QVVRfU0VSSUFMSVpBVElPTiA9ICJ3aHR0cDppbnB1dFNlcmlhbGl6YXRpb24iOwotICAgIFN0cmluZyBBVFRSX1dIVFRQX09VVFBVVF9TRVJJQUxJWkFUSU9OID0gIndodHRwOm91dHB1dFNlcmlhbGl6YXRpb24iOwotICAgIFN0cmluZyBBVFRSX1dIVFRQX0ZBVUxUX1NFUklBTElaQVRJT04gPSAid2h0dHA6ZmF1bHRTZXJpYWxpemF0aW9uIjsKLSAgICBTdHJpbmcgQVRUUl9XSFRUUF9BVVRIRU5USUNBVElPTl9UWVBFID0gIndodHRwOmF1dGhlbnRpY2F0aW9uVHlwZSI7Ci0gICAgU3RyaW5nIEFUVFJfV0hUVFBfQVVUSEVOVElDQVRJT05fUkVBTE0gPSAid2h0dHA6YXV0aGVudGljYXRpb25SZWFsbSI7Ci0KLSAgICBTdHJpbmcgQVRUUl9XU0RMWF9TQUZFID0gIndzZGx4OnNhZmUiOwotCi0gICAgU3RyaW5nIEFUVFJfV1JQQ19TSUdOQVRVUkUgPSAid3JwYzpzaWduYXR1cmUiOwotCi0gICAgU3RyaW5nIFNPQVBfVkVSU0lPTl8xXzEgPSAiMS4xIjsKLSAgICBTdHJpbmcgU09BUF9WRVJTSU9OXzFfMiA9ICIxLjIiOwotCi0gICAgU3RyaW5nIE1FU1NBR0VfTEFCRUxfSU4gPSAiSW4iOwotICAgIFN0cmluZyBNRVNTQUdFX0xBQkVMX09VVCA9ICJPdXQiOwotCi0gICAgU3RyaW5nIFJQQ19JTiA9ICIjaW4iOwotICAgIFN0cmluZyBSUENfUkVUVVJOID0gIiNyZXR1cm4iOwotICAgIFN0cmluZyBSUENfSU5PVVQgPSAiI2lub3V0IjsKLQotICAgIFN0cmluZyBIVFRQX0xPQ0FUSU9OX1RBQkxFID0gIkhUVFBMb2NhdGlvblRhYmxlIjsKLQotICAgIC8vIFRoaXMgd2FzIHRha2VuIGZyb20gdGh5ZSByZXNvbHV0aW9uIG9mIENSMTE3IChXU0RMIDIuMCB3b3JraW5nIGdyb3VwKQotICAgIC8vIGh0dHA6Ly93d3cudzMub3JnLzIwMDIvd3MvZGVzYy81L2NyLWlzc3Vlcy9pc3N1ZXMuaHRtbD92aWV3PW5vcm1hbCNDUjExNwotICAgIC8vIGh0dHA6Ly9saXN0cy53My5vcmcvQXJjaGl2ZXMvUHVibGljL3d3dy13cy1kZXNjLzIwMDdGZWIvMDAzOS5odG1sCi0gICAgU3RyaW5nIExFR0FMX0NIQVJBQ1RFUlNfSU5fVVJMID0gIi0uX34hJCYoKSorLDs9OkA/LyUiOwotICAgIFN0cmluZyBMRUdBTF9DSEFSQUNURVJTX0lOX1BBVEggPSAiLS5ffiEkJygpKissOz06QCI7Ci0gICAgU3RyaW5nIExFR0FMX0NIQVJBQ1RFUlNfSU5fUVVFUlkgPSAiLS5ffiEkJygpKissOz06QC8/IjsKLSAgICBTdHJpbmcgVEVNUExBVEVfRU5DT0RFX0VTQ0FQSU5HX0NIQVJBQ1RFUiA9ICIhIjsKLQotICAgIHB1YmxpYyBTdHJpbmcgTUVQX1VSSV9JTl9PTkxZID0gImh0dHA6Ly93d3cudzMub3JnL25zL3dzZGwvaW4tb25seSI7Ci0gICAgcHVibGljIFN0cmluZyBNRVBfVVJJX1JPQlVTVF9JTl9PTkxZID0gImh0dHA6Ly93d3cudzMub3JnL25zL3dzZGwvcm9idXN0LWluLW9ubHkiOwotICAgIHB1YmxpYyBTdHJpbmcgTUVQX1VSSV9JTl9PVVQgPSAiaHR0cDovL3d3dy53My5vcmcvbnMvd3NkbC9pbi1vdXQiOwotICAgIHB1YmxpYyBTdHJpbmcgTUVQX1VSSV9JTl9PUFRJT05BTF9PVVQgPSAiaHR0cDovL3d3dy53My5vcmcvbnMvd3NkbC9pbi1vcHQtb3V0IjsKLSAgICBwdWJsaWMgU3RyaW5nIE1FUF9VUklfT1VUX09OTFkgPSAiaHR0cDovL3d3dy53My5vcmcvbnMvd3NkbC9vdXQtb25seSI7Ci0gICAgcHVibGljIFN0cmluZyBNRVBfVVJJX1JPQlVTVF9PVVRfT05MWSA9ICJodHRwOi8vd3d3LnczLm9yZy9ucy93c2RsL3JvYnVzdC1vdXQtb25seSI7Ci0gICAgcHVibGljIFN0cmluZyBNRVBfVVJJX09VVF9JTiA9ICJodHRwOi8vd3d3LnczLm9yZy9ucy93c2RsL291dC1pbiI7Ci0gICAgcHVibGljIFN0cmluZyBNRVBfVVJJX09VVF9PUFRJT05BTF9JTiA9ICJodHRwOi8vd3d3LnczLm9yZy9ucy93c2RsL291dC1vcHQtaW4iOwotCi0gICAgcHVibGljIFN0cmluZyBTVFlMRV9JUkkgPSAiaHR0cDovL3d3dy53My5vcmcvbnMvd3NkbC9zdHlsZS9pcmkiOwotICAgIHB1YmxpYyBTdHJpbmcgU1RZTEVfUlBDID0gImh0dHA6Ly93d3cudzMub3JnL25zL3dzZGwvc3R5bGUvcnBjIjsKLSAgICBwdWJsaWMgU3RyaW5nIFNUWUxFX01VTFRJUEFSVCA9ICJodHRwOi8vd3d3LnczLm9yZy9ucy93c2RsL3N0eWxlL211bHRpcGFydCI7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIE5NVE9LRU5fQU5ZID0gIiNhbnkiOwotICAgIHB1YmxpYyBTdHJpbmcgTk1UT0tFTl9OT05FID0gIiNub25lIjsKLSAgICBwdWJsaWMgU3RyaW5nIE5NVE9LRU5fT1RIRVIgPSAiI290aGVyIjsKLSAgICBwdWJsaWMgU3RyaW5nIE5NVE9LRU5fRUxFTUVOVCA9ICIjZWxlbWVudCI7Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vV1NETFRvQXhpc1NlcnZpY2VCdWlsZGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vV1NETFRvQXhpc1NlcnZpY2VCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyMDU5YjkuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL1dTRExUb0F4aXNTZXJ2aWNlQnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIubmFtZXNwYWNlLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLm5lZXRoaS5Qb2xpY3lSZWdpc3RyeTsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYTsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYUNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5yZXNvbHZlci5VUklSZXNvbHZlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBXU0RMVG9BeGlzU2VydmljZUJ1aWxkZXIgewotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MU0NIRU1BX05BTUVTUEFDRV9VUkkgPSBDb25zdGFudHMuVVJJXzIwMDFfU0NIRU1BX1hTRDsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTFNDSEVNQV9OQU1FU1BBQ0VfUFJFRklYID0gInhzIjsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9TQ0hFTUFfTE9DQUxfTkFNRSA9ICJzY2hlbWEiOwotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX1NDSEVNQV9TRVFVRU5DRV9MT0NBTF9OQU1FID0gInNlcXVlbmNlIjsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9TQ0hFTUFfQ09NUExFWF9UWVBFX0xPQ0FMX05BTUUgPSAiY29tcGxleFR5cGUiOwotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX1NDSEVNQV9FTEVNRU5UX0xPQ0FMX05BTUUgPSAiZWxlbWVudCI7Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfU0NIRU1BX0lNUE9SVF9MT0NBTF9OQU1FID0gImltcG9ydCI7Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RfTkFNRSA9ICJuYW1lIjsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFhTRF9UQVJHRVROQU1FU1BBQ0UgPSAidGFyZ2V0TmFtZXNwYWNlIjsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTE5TX0FYSVMyV1JBUFBFRCA9ICJ4bWxuczpheGlzMndyYXBwZWQiOwotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVhJUzJXUkFQUEVEID0gImF4aXMyd3JhcHBlZCI7Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RfVFlQRSA9ICJ0eXBlIjsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFhTRF9SRUYgPSAicmVmIjsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgaW50IG5zQ291bnQgPSAwOwotCi0gICAgcHJvdGVjdGVkIE1hcCByZXNvbHZlZFJwY1dyYXBwZWRFbGVtZW50TWFwID0gbmV3IEhhc2hNYXAoKTsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFhTRF9FTEVNRU5UX0ZPUk1fREVGQVVMVCA9ICJlbGVtZW50Rm9ybURlZmF1bHQiOwotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNEX1VOUVVBTElGSUVEID0gInVucXVhbGlmaWVkIjsKLQotICAgIHByb3RlY3RlZCBJbnB1dFN0cmVhbSBpbjsKLQotICAgIHByb3RlY3RlZCBBeGlzU2VydmljZSBheGlzU2VydmljZTsKLQotICAgIHByb3RlY3RlZCBQb2xpY3lSZWdpc3RyeSByZWdpc3RyeTsKLSAgICAKLSAgICBwcm90ZWN0ZWQgQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZzsKLQotICAgIHByb3RlY3RlZCBRTmFtZSBzZXJ2aWNlTmFtZTsKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1NlcnZlclNpZGUgPSB0cnVlOwotICAgIHByb3RlY3RlZCBTdHJpbmcgc3R5bGUgPSBudWxsOwotICAgIHByaXZhdGUgVVJJUmVzb2x2ZXIgY3VzdG9tUmVzb2x2ZXI7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgYmFzZVVyaSA9IG51bGw7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRVMgPSAiVHlwZXMiOwotCi0gICAgLy8ga2VlcGluZyB3aGV0aGVyIGJ1aWxkZXIgaXMgdXNlZCBpbiBjb2RlZ2VuIG9yIG5vdAotICAgIHByb3RlY3RlZCBib29sZWFuIGlzQ29kZWdlbjsKLQotICAgIHByb3RlY3RlZCBXU0RMVG9BeGlzU2VydmljZUJ1aWxkZXIoKSB7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgV1NETFRvQXhpc1NlcnZpY2VCdWlsZGVyKElucHV0U3RyZWFtIGluLCBRTmFtZSBzZXJ2aWNlTmFtZSkgewotICAgICAgICB0aGlzLmluID0gaW47Ci0gICAgICAgIHRoaXMuc2VydmljZU5hbWUgPSBzZXJ2aWNlTmFtZTsKLSAgICAgICAgdGhpcy5heGlzU2VydmljZSA9IG5ldyBBeGlzU2VydmljZSgpOwotICAgICAgICBzZXRQb2xpY3lSZWdpc3RyeUZyb21TZXJ2aWNlKGF4aXNTZXJ2aWNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgV1NETFRvQXhpc1NlcnZpY2VCdWlsZGVyKElucHV0U3RyZWFtIGluLCBBeGlzU2VydmljZSBheGlzU2VydmljZSkgewotICAgICAgICB0aGlzLmluID0gaW47Ci0gICAgICAgIHRoaXMuYXhpc1NlcnZpY2UgPSBheGlzU2VydmljZTsKLSAgICAgICAgc2V0UG9saWN5UmVnaXN0cnlGcm9tU2VydmljZShheGlzU2VydmljZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyBhIGN1c3RvbSB4bWxzY2hlbWEgVVJJIHJlc29sdmVyCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY3VzdG9tUmVzb2x2ZXIgYSBVUklSZXNvbHZlciB0byB1c2Ugd2hlbiB3b3JraW5nIHdpdGggc2NoZW1hcwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEN1c3RvbVJlc29sdmVyKFVSSVJlc29sdmVyIGN1c3RvbVJlc29sdmVyKSB7Ci0gICAgICAgIHRoaXMuY3VzdG9tUmVzb2x2ZXIgPSBjdXN0b21SZXNvbHZlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1NlcnZlclNpZGUoKSB7Ci0gICAgICAgIHJldHVybiBpc1NlcnZlclNpZGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2VydmVyU2lkZShib29sZWFuIHNlcnZlclNpZGUpIHsKLSAgICAgICAgaXNTZXJ2ZXJTaWRlID0gc2VydmVyU2lkZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRQb2xpY3lSZWdpc3RyeUZyb21TZXJ2aWNlKEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlKSB7Ci0gICAgICAgIFBvbGljeUluY2x1ZGUgcG9saWN5SW5jbHVkZSA9IGF4aXNTZXJ2aWNlLmdldFBvbGljeUluY2x1ZGUoKTsKLSAgICAgICAgdGhpcy5yZWdpc3RyeSA9IHBvbGljeUluY2x1ZGUuZ2V0UG9saWN5UmVnaXN0cnkoKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgWG1sU2NoZW1hIGdldFhNTFNjaGVtYShFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBiYXNlVXJpKSB7Ci0gICAgICAgIFhtbFNjaGVtYUNvbGxlY3Rpb24gc2NoZW1hQ29sbGVjdGlvbiA9IG5ldyBYbWxTY2hlbWFDb2xsZWN0aW9uKCk7Ci0KLSAgICAgICAgaWYgKGJhc2VVcmkgIT0gbnVsbCkgewotICAgICAgICAgICAgc2NoZW1hQ29sbGVjdGlvbi5zZXRCYXNlVXJpKGJhc2VVcmkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGN1c3RvbVJlc29sdmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNjaGVtYUNvbGxlY3Rpb24uc2V0U2NoZW1hUmVzb2x2ZXIoY3VzdG9tUmVzb2x2ZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHNjaGVtYUNvbGxlY3Rpb24ucmVhZChlbGVtZW50KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGaW5kIHRoZSBYTUwgc2NoZW1hIHByZWZpeAotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgYWN0aXZlIHNjaGVtYSBwcmVmaXgsIG9yIHRoZSBkZWZhdWx0IHNjaGVtYSBwcmVmaXggaWYgbm90IGRlY2xhcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBmaW5kU2NoZW1hUHJlZml4KCkgewotICAgICAgICBTdHJpbmcgeHNkUHJlZml4ID0gbnVsbDsKLSAgICAgICAgTWFwIGRlY2xhcmVkTmFtZVNwYWNlcyA9IGF4aXNTZXJ2aWNlLmdldE5hbWVzcGFjZU1hcCgpOwotICAgICAgICBpZiAoZGVjbGFyZWROYW1lU3BhY2VzLmNvbnRhaW5zVmFsdWUoWE1MU0NIRU1BX05BTUVTUEFDRV9VUkkpKSB7Ci0gICAgICAgICAgICAvL2xvb3AgYW5kIGZpbmQgdGhlIHByZWZpeAotICAgICAgICAgICAgSXRlcmF0b3IgaXQgPSBkZWNsYXJlZE5hbWVTcGFjZXMua2V5U2V0KCkuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIFN0cmluZyBrZXk7Ci0gICAgICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAga2V5ID0gKFN0cmluZykgaXQubmV4dCgpOwotICAgICAgICAgICAgICAgIGlmIChYTUxTQ0hFTUFfTkFNRVNQQUNFX1VSSS5lcXVhbHMoZGVjbGFyZWROYW1lU3BhY2VzLmdldChrZXkpKSkgewotICAgICAgICAgICAgICAgICAgICB4c2RQcmVmaXggPSBrZXk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHhzZFByZWZpeCA9IFhNTFNDSEVNQV9OQU1FU1BBQ0VfUFJFRklYOyAvL2RlZmF1bHQgcHJlZml4Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHhzZFByZWZpeDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgQXhpc1NlcnZpY2UgcG9wdWxhdGVTZXJ2aWNlKCkgdGhyb3dzIEF4aXNGYXVsdDsKLQotICAgIC8qKgotICAgICAqIFV0aWxpdHkgbWV0aG9kIHRoYXQgcmV0dXJucyBhIERPTSBCdWlsZGVyCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGEgbmFtZXNwYWNlLWF3YXJlIERPTSBEb2N1bWVudEJ1aWxkZXIKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRG9jdW1lbnRCdWlsZGVyIGdldERPTURvY3VtZW50QnVpbGRlcigpIHsKLSAgICAgICAgRG9jdW1lbnRCdWlsZGVyIGRvY3VtZW50QnVpbGRlcjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZG9jdW1lbnRCdWlsZGVyRmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkKLSAgICAgICAgICAgICAgICAgICAgLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICBkb2N1bWVudEJ1aWxkZXJGYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOwotICAgICAgICAgICAgZG9jdW1lbnRCdWlsZGVyID0gZG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKLSAgICAgICAgfSBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZG9jdW1lbnRCdWlsZGVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBhIHRlbXBvcmFyeSBuYW1lc3BhY2UgcHJlZml4LiAgTk9UIHRocmVhZHNhZmUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGEgbmV3IG5hbWVzcGFjZSBwcmVmaXggb2YgdGhlIGZvcm0gIm5zWCIKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFRlbXBvcmFyeU5hbWVzcGFjZVByZWZpeCgpIHsKLSAgICAgICAgcmV0dXJuICJucyIgKyBuc0NvdW50Kys7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgVVJJIGFzc29jaWF0ZWQgd2l0aCB0aGUgYmFzZSBkb2N1bWVudAotICAgICAqIGZvciB0aGUgV1NETCBkZWZpbml0aW9uLiAgTm90ZSB0aGF0IHRoaXMgVVJJCi0gICAgICogaXMgZm9yIHRoZSBiYXNlIGRvY3VtZW50LCBub3QgdGhlIGltcG9ydHMuCi0gICAgICogCi0gICAgICogQHJldHVybiBUaGUgVVJJIGFzIGEgU3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRCYXNlVXJpKCkgewotICAgICAgICByZXR1cm4gYmFzZVVyaTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBVUkkgYXNzb2NpYXRlZCB3aXRoIHRoZSBiYXNlIGRvY3VtZW50Ci0gICAgICogZm9yIHRoZSBXU0RMIGRlZmluaXRpb24uICBOb3RlIHRoYXQgdGhpcyBVUkkKLSAgICAgKiBpcyBmb3IgdGhlIGJhc2UgZG9jdW1lbnQsIG5vdCB0aGUgaW1wb3J0cy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYmFzZVVyaSAgVGhlIFVSSSBhcyBhIFN0cmluZwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEJhc2VVcmkoU3RyaW5nIGJhc2VVcmkpIHsKLSAgICAgICAgdGhpcy5iYXNlVXJpID0gYmFzZVVyaTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0NvZGVnZW4oKSB7Ci0gICAgICAgIHJldHVybiBpc0NvZGVnZW47Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q29kZWdlbihib29sZWFuIGNvZGVnZW4pIHsKLSAgICAgICAgaXNDb2RlZ2VuID0gY29kZWdlbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUU5hbWUgZ2V0U2VydmljZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBzZXJ2aWNlTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlTmFtZShRTmFtZSBzZXJ2aWNlTmFtZSkgewotICAgICAgICB0aGlzLnNlcnZpY2VOYW1lID0gc2VydmljZU5hbWU7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEdldCBhIHN0cmluZyBjb250YWluaW5nIHRoZSBzdGFjayBvZiB0aGUgY3VycmVudCBsb2NhdGlvbgotICAgICAqCi0gICAgICogQHJldHVybiBTdHJpbmcKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBzdGFja1RvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gc3RhY2tUb1N0cmluZyhuZXcgUnVudGltZUV4Y2VwdGlvbigpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgc3RhY2sgb2YgdGhlIHNwZWNpZmllZCBleGNlcHRpb24KLSAgICAgKgotICAgICAqIEBwYXJhbSBlCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIHN0YWNrVG9TdHJpbmcoVGhyb3dhYmxlIGUpIHsKLSAgICAgICAgamF2YS5pby5TdHJpbmdXcml0ZXIgc3cgPSBuZXcgamF2YS5pby5TdHJpbmdXcml0ZXIoKTsKLSAgICAgICAgamF2YS5pby5CdWZmZXJlZFdyaXRlciBidyA9IG5ldyBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyKHN3KTsKLSAgICAgICAgamF2YS5pby5QcmludFdyaXRlciBwdyA9IG5ldyBqYXZhLmlvLlByaW50V3JpdGVyKGJ3KTsKLSAgICAgICAgZS5wcmludFN0YWNrVHJhY2UocHcpOwotICAgICAgICBwdy5jbG9zZSgpOwotICAgICAgICBTdHJpbmcgdGV4dCA9IHN3LmdldEJ1ZmZlcigpLnRvU3RyaW5nKCk7Ci0gICAgICAgIC8vIEp1bXAgcGFzdCB0aGUgdGhyb3dhYmxlCi0gICAgICAgIHRleHQgPSB0ZXh0LnN1YnN0cmluZyh0ZXh0LmluZGV4T2YoImF0IikpOwotICAgICAgICB0ZXh0ID0gcmVwbGFjZSh0ZXh0LCAiYXQgIiwgIkRFQlVHX0ZSQU1FID0gIik7Ci0gICAgICAgIHJldHVybiB0ZXh0OwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiByZXBsYWNlOiBMaWtlIFN0cmluZy5yZXBsYWNlIGV4Y2VwdCB0aGF0IHRoZSBvbGQgbmV3IGl0ZW1zIGFyZSBzdHJpbmdzLgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgc3RyaW5nCi0gICAgICogQHBhcmFtIG9sZFQgb2xkIHRleHQgdG8gcmVwbGFjZQotICAgICAqIEBwYXJhbSBuZXdUIG5ldyB0ZXh0IHRvIHVzZQotICAgICAqIEByZXR1cm4gcmVwbGFjZW1lbnQgc3RyaW5nCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgcmVwbGFjZShTdHJpbmcgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBvbGRULCBTdHJpbmcgbmV3VCkgewotCi0gICAgICAgIGlmIChuYW1lID09IG51bGwpIHJldHVybiAiIjsKLQotICAgICAgICAvLyBDcmVhdGUgYSBzdHJpbmcgYnVmZmVyIHRoYXQgaXMgdHdpY2UgaW5pdGlhbCBsZW5ndGguCi0gICAgICAgIC8vIFRoaXMgaXMgYSBnb29kIHN0YXJ0aW5nIHBvaW50LgotICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKG5hbWUubGVuZ3RoKCkgKiAyKTsKLQotICAgICAgICBpbnQgbGVuID0gb2xkVC5sZW5ndGgoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGludCBzdGFydCA9IDA7Ci0gICAgICAgICAgICBpbnQgaSA9IG5hbWUuaW5kZXhPZihvbGRULCBzdGFydCk7Ci0KLSAgICAgICAgICAgIHdoaWxlIChpID49IDApIHsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQobmFtZS5zdWJzdHJpbmcoc3RhcnQsIGkpKTsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQobmV3VCk7Ci0gICAgICAgICAgICAgICAgc3RhcnQgPSBpICsgbGVuOwotICAgICAgICAgICAgICAgIGkgPSBuYW1lLmluZGV4T2Yob2xkVCwgc3RhcnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHN0YXJ0IDwgbmFtZS5sZW5ndGgoKSkKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQobmFtZS5zdWJzdHJpbmcoc3RhcnQpKTsKLSAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoc2IpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB1c2VBeGlzQ29uZmlndXJhdGlvbihBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlnKSB7Ci0gICAgICAgIHRoaXMuYXhpc0NvbmZpZyA9IGF4aXNDb25maWc7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL2phdmEyd3NkbC9Bbm5vdGF0aW9uQ29uc3RhbnRzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vamF2YTJ3c2RsL0Fubm90YXRpb25Db25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM5OTQ0Ny4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vamF2YTJ3c2RsL0Fubm90YXRpb25Db25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5qYXZhMndzZGw7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgQW5ub3RhdGlvbkNvbnN0YW50cyB7Ci0gICAgU3RyaW5nIFdFQl9TRVJWSUNFID0gImphdmF4Lmp3cy5XZWJTZXJ2aWNlIjsKLSAgICBTdHJpbmcgV0VCX01FVEhPRCA9ICJqYXZheC5qd3MuV2ViTWV0aG9kIjsKLSAgICBTdHJpbmcgV0VCX1BBUkFNID0gImphdmF4Lmp3cy5XZWJQYXJhbSI7Ci0gICAgU3RyaW5nIFdFQl9SRVNVTFQgPSAiamF2YXguandzLldlYlJlc3VsdCI7Ci0gICAgU3RyaW5nIFdFQl9TRVJWSUNFX1BST1ZJREVSID0gImphdmF4LnhtbC53cy5XZWJTZXJ2aWNlUHJvdmlkZXIiOwotICAgIFN0cmluZyBUQVJHRVROQU1FU1BBQ0UgPSAidGFyZ2V0TmFtZXNwYWNlIjsKLSAgICBTdHJpbmcgTkFNRSA9ICJuYW1lIjsKLSAgICBTdHJpbmcgU0VSVklDRV9OQU1FID0gInNlcnZpY2VOYW1lIjsKLSAgICBTdHJpbmcgRVhDTFVERSA9ICJleGNsdWRlIjsKLSAgICBTdHJpbmcgQUNUSU9OID0gImFjdGlvbiI7Ci0gICAgU3RyaW5nIFdTRExfTE9DQVRJT04gPSAid3NkbExvY2F0aW9uIjsKLSAgICBTdHJpbmcgT1BFUkFUSU9OX05BTUUgPSJvcGVyYXRpb25OYW1lIjsKLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9qYXZhMndzZGwvRGVmYXVsdE5hbWVzcGFjZUdlbmVyYXRvci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL2phdmEyd3NkbC9EZWZhdWx0TmFtZXNwYWNlR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4YzdjN2IuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL2phdmEyd3NkbC9EZWZhdWx0TmFtZXNwYWNlR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uamF2YTJ3c2RsOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRvaW4gZm9yIG1hcHBpbmcgamF2YSBjbGFzc2VzIHRvIG5hbWVzcGFjZXMKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWZhdWx0TmFtZXNwYWNlR2VuZXJhdG9yIGltcGxlbWVudHMgTmFtZXNwYWNlR2VuZXJhdG9yIHsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQID0gImh0dHA6Ly8iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBQQUNLQUdFX0NMQVNTX0RFTElNSVRFUiA9ICcuJzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQ0hFTUFfTkFNRVNQQUNFX0VYVE4gPSAiL3hzZCI7Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLmphdmEyd3NkbC5OYW1lc3BhY2VHZW5lcmF0b3IjbmFtZXNwYWNlRnJvbVBhY2thZ2VOYW1lKGphdmEubGFuZy5TdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZ0J1ZmZlciBuYW1lc3BhY2VGcm9tUGFja2FnZU5hbWUoU3RyaW5nIHBhY2thZ2VOYW1lKSB7Ci0KLSAgICAgICAgU3RyaW5nQnVmZmVyIHN0ckJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgaW50IHByZXZJbmRleCA9IHBhY2thZ2VOYW1lLmxlbmd0aCgpOwotICAgICAgICBpbnQgY3VycmVudEluZGV4ID0gcGFja2FnZU5hbWUubGFzdEluZGV4T2YoUEFDS0FHRV9DTEFTU19ERUxJTUlURVIpOwotICAgICAgICBpZiAoY3VycmVudEluZGV4ID4gMCkgewotICAgICAgICAgICAgc3RyQnVmLmFwcGVuZChIVFRQKTsKLSAgICAgICAgfSBlbHNlIGlmIChwcmV2SW5kZXggPiAwKSB7Ci0gICAgICAgICAgICBzdHJCdWYuYXBwZW5kKEhUVFApOwotICAgICAgICAgICAgc3RyQnVmLmFwcGVuZChwYWNrYWdlTmFtZSk7Ci0gICAgICAgICAgICByZXR1cm4gc3RyQnVmOwotICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRJbmRleCA9PSAtMSkgewotLy8gICAgICAgICAgICBzdHJCdWYuYXBwZW5kKEhUVFApOwotLy8gICAgICAgICAgICBzdHJCdWYuYXBwZW5kKHBhY2thZ2VOYW1lKTsKLSAgICAgICAgICAgIHJldHVybiBzdHJCdWY7Ci0gICAgICAgIH0KLSAgICAgICAgd2hpbGUgKGN1cnJlbnRJbmRleCAhPSAtMSkgewotICAgICAgICAgICAgc3RyQnVmLmFwcGVuZChwYWNrYWdlTmFtZS5zdWJzdHJpbmcoY3VycmVudEluZGV4ICsgMSwgcHJldkluZGV4KSk7Ci0gICAgICAgICAgICBwcmV2SW5kZXggPSBjdXJyZW50SW5kZXg7Ci0gICAgICAgICAgICBjdXJyZW50SW5kZXggPSBwYWNrYWdlTmFtZS5sYXN0SW5kZXhPZihQQUNLQUdFX0NMQVNTX0RFTElNSVRFUiwgcHJldkluZGV4IC0gMSk7Ci0gICAgICAgICAgICBzdHJCdWYuYXBwZW5kKFBBQ0tBR0VfQ0xBU1NfREVMSU1JVEVSKTsKLQotICAgICAgICAgICAgaWYgKGN1cnJlbnRJbmRleCA9PSAtMSkgewotICAgICAgICAgICAgICAgIHN0ckJ1Zi5hcHBlbmQocGFja2FnZU5hbWUuc3Vic3RyaW5nKDAsIHByZXZJbmRleCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdHJCdWY7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5qYXZhMndzZGwuTmFtZXNwYWNlR2VuZXJhdG9yI3NjaGVtYU5hbWVzcGFjZUZyb21QYWNrYWdlTmFtZShqYXZhLmxhbmcuU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmdCdWZmZXIgc2NoZW1hTmFtZXNwYWNlRnJvbVBhY2thZ2VOYW1lKFN0cmluZyBwYWNrYWdlTmFtZSkgewotICAgICAgICBpZiAocGFja2FnZU5hbWUubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmFtZXNwYWNlRnJvbVBhY2thZ2VOYW1lKHBhY2thZ2VOYW1lKS5hcHBlbmQoU0NIRU1BX05BTUVTUEFDRV9FWFROKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICBidWZmZXIuYXBwZW5kKEphdmEyV1NETENvbnN0YW50cy5ERUZBVUxUX1RBUkdFVF9OQU1FU1BBQ0UpOwotICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChTQ0hFTUFfTkFNRVNQQUNFX0VYVE4pOwotICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlcjsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAKLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL2phdmEyd3NkbC9EZWZhdWx0U2NoZW1hR2VuZXJhdG9yLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vamF2YTJ3c2RsL0RlZmF1bHRTY2hlbWFHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNiNmM5ZC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vamF2YTJ3c2RsL0RlZmF1bHRTY2hlbWFHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyODUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLmphdmEyd3NkbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5KYXZhVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LnV0aWwuQmVhbkV4Y2x1ZGVJbmZvOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC51dGlsLlV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uKjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLmphdmEyd3NkbC5ieXRlY29kZS5NZXRob2RUYWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuV1NETENvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS51dGlscy5OYW1lc3BhY2VNYXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS51dGlscy5OYW1lc3BhY2VQcmVmaXhMaXN0OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotCi1pbXBvcnQgamF2YXguYWN0aXZhdGlvbi5EYXRhSGFuZGxlcjsKLWltcG9ydCBqYXZheC5qd3MuV2ViTWV0aG9kOwotaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbTsKLWltcG9ydCBqYXZheC5qd3MuV2ViUmVzdWx0OwotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgamF2YS5iZWFucy5CZWFuSW5mbzsKLWltcG9ydCBqYXZhLmJlYW5zLkludHJvc3BlY3RvcjsKLQotcHVibGljIGNsYXNzIERlZmF1bHRTY2hlbWFHZW5lcmF0b3IgaW1wbGVtZW50cyBKYXZhMldTRExDb25zdGFudHMsIFNjaGVtYUdlbmVyYXRvciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coRGVmYXVsdFNjaGVtYUdlbmVyYXRvci5jbGFzcyk7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX1NQQUNFX1BSRUZJWCA9ICJheDIiOy8vIGF4aXMyIG5hbWUgc3BhY2UKLQotICAgIHByaXZhdGUgc3RhdGljIGludCBwcmVmaXhDb3VudCA9IDE7Ci0KLSAgICBwcm90ZWN0ZWQgTWFwIHRhcmdldE5hbWVzcGFjZVByZWZpeE1hcCA9IG5ldyBIYXNodGFibGUoKTsKLQotICAgIHByb3RlY3RlZCBNYXAgc2NoZW1hTWFwID0gbmV3IEhhc2h0YWJsZSgpOwotCi0gICAgcHJvdGVjdGVkIFhtbFNjaGVtYUNvbGxlY3Rpb24geG1sU2NoZW1hQ29sbGVjdGlvbiA9IG5ldyBYbWxTY2hlbWFDb2xsZWN0aW9uKCk7Ci0KLQotICAgIHByb3RlY3RlZCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcjsKLQotICAgIHByb3RlY3RlZCBTdHJpbmcgY2xhc3NOYW1lOwotCi0gICAgcHJvdGVjdGVkIFR5cGVUYWJsZSB0eXBlVGFibGUgPSBuZXcgVHlwZVRhYmxlKCk7Ci0KLSAgICAvLyB0byBrZWVwIGxvYWRkZWQgbWV0aG9kIHVzaW5nIEpBTQotICAgIHByb3RlY3RlZCBNZXRob2QgbWV0aG9kc1tdOwotCi0gICAgLy90byBzdG9yZSBieXRlIGNvZGUgbWV0aG9kIHVzaW5nIEF4aXMgMS54IGNvZGVzCi0gICAgcHJvdGVjdGVkIE1ldGhvZFRhYmxlIG1ldGhvZFRhYmxlOwotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBzY2hlbWFUYXJnZXROYW1lU3BhY2U7Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHNjaGVtYV9uYW1lc3BhY2VfcHJlZml4OwotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBhdHRyRm9ybURlZmF1bHQgPSBudWxsOwotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBlbGVtZW50Rm9ybURlZmF1bHQgPSBudWxsOwotCi0gICAgcHJvdGVjdGVkIEFycmF5TGlzdCBleGNsdWRlTWV0aG9kcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgIHByb3RlY3RlZCBBcnJheUxpc3QgZXh0cmFDbGFzc2VzID0gbnVsbDsKLQotICAgIHByb3RlY3RlZCBib29sZWFuIHVzZVdTRExUeXBlc05hbWVzcGFjZSA9IGZhbHNlOwotCi0gICAgcHJvdGVjdGVkIE1hcCBwa2cybnNtYXAgPSBudWxsOwotCi0gICAgcHJvdGVjdGVkIE5hbWVzcGFjZUdlbmVyYXRvciBuc0dlbiA9IG51bGw7Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9IG51bGw7Ci0gICAgLy90byBrZWVwIHRoZSBsaXN0IG9mIG9wZXJhdGlvbiB3aGljaCB1c2VzIE1SIG90aGVyIHRoYW4gUlBDIE1SCi0gICAgcHJvdGVjdGVkIEFycmF5TGlzdCBub25ScGNNZXRob2RzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgcHJvdGVjdGVkIENsYXNzIHNlcnZpY2VDbGFzcyA9IG51bGw7Ci0gICAgcHJvdGVjdGVkIEF4aXNTZXJ2aWNlIHNlcnZpY2U7Ci0gICAgLy8gbG9jYXRpb24gb2YgdGhlIGN1c3RvbSBzY2hlbWEgLCBpZiBhbnkKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGN1c3RvbVNjaGVtYUxvY2F0aW9uOwotICAgIC8vIGxvY2F0aW9uIG9mIHRoZSBjbGFzcyBuYW1lIHRvIHBhY2thZ2UgbWFwcGluZyBmaWxlCi0gICAgLy8gRmlsZSBpcyBzaW1wbGUgZmlsZSB3aXRoIHF1YWxpZmllZENsYXNzTmFtZTpTY2hlbWFRTmFtZQotICAgIHByb3RlY3RlZCBTdHJpbmcgbWFwcGluZ0ZpbGVMb2NhdGlvbjsKLQotICAgIC8vVG8gY2hlY2sgd2hldGhlciB3ZSBuZWVkIHRvIGdlbmVyYXRlIFNjaGVtYSBlbGVtZW50IGZvciBFeGNlcHRpb24KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBnZW5lcmF0ZUJhc2VFeGNlcHRpb247Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBzb3J0QXR0cmlidXRlcyA9IHRydWU7Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0dlbmVyYXRlV3JhcHBlZEFycmF5VHlwZXMgPSBmYWxzZTsKLQotICAgIHB1YmxpYyBOYW1lc3BhY2VHZW5lcmF0b3IgZ2V0TnNHZW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKG5zR2VuID09IG51bGwpIHsKLSAgICAgICAgICAgIG5zR2VuID0gbmV3IERlZmF1bHROYW1lc3BhY2VHZW5lcmF0b3IoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnNHZW47Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TnNHZW4oTmFtZXNwYWNlR2VuZXJhdG9yIG5zR2VuKSB7Ci0gICAgICAgIHRoaXMubnNHZW4gPSBuc0dlbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRGVmYXVsdFNjaGVtYUdlbmVyYXRvcihDbGFzc0xvYWRlciBsb2FkZXIsIFN0cmluZyBjbGFzc05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNjaGVtYXRhcmdldE5hbWVzcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2NoZW1hdGFyZ2V0TmFtZXNwYWNlUHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2UpCi0gICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5jbGFzc0xvYWRlciA9IGxvYWRlcjsKLSAgICAgICAgdGhpcy5jbGFzc05hbWUgPSBjbGFzc05hbWU7Ci0gICAgICAgIHRoaXMuc2VydmljZSA9IHNlcnZpY2U7Ci0KLSAgICAgICAgc2VydmljZUNsYXNzID0gQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUsIHRydWUsIGxvYWRlcik7Ci0gICAgICAgIG1ldGhvZFRhYmxlID0gbmV3IE1ldGhvZFRhYmxlKHNlcnZpY2VDbGFzcyk7Ci0KLSAgICAgICAgdGhpcy50YXJnZXROYW1lc3BhY2UgPSBKYXZhMldTRExVdGlscy50YXJnZXROYW1lc3BhY2VGcm9tQ2xhc3NOYW1lKAotICAgICAgICAgICAgICAgIGNsYXNzTmFtZSwgbG9hZGVyLCBnZXROc0dlbigpKS50b1N0cmluZygpOwotCi0gICAgICAgIGlmIChzY2hlbWF0YXJnZXROYW1lc3BhY2UgIT0gbnVsbAotICAgICAgICAgICAgICAgICYmIHNjaGVtYXRhcmdldE5hbWVzcGFjZS50cmltKCkubGVuZ3RoKCkgIT0gMCkgewotICAgICAgICAgICAgdGhpcy5zY2hlbWFUYXJnZXROYW1lU3BhY2UgPSBzY2hlbWF0YXJnZXROYW1lc3BhY2U7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aGlzLnNjaGVtYVRhcmdldE5hbWVTcGFjZSA9Ci0gICAgICAgICAgICAgICAgICAgIEphdmEyV1NETFV0aWxzLnNjaGVtYU5hbWVzcGFjZUZyb21DbGFzc05hbWUoY2xhc3NOYW1lLCBsb2FkZXIsIGdldE5zR2VuKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc2NoZW1hdGFyZ2V0TmFtZXNwYWNlUHJlZml4ICE9IG51bGwKLSAgICAgICAgICAgICAgICAmJiBzY2hlbWF0YXJnZXROYW1lc3BhY2VQcmVmaXgudHJpbSgpLmxlbmd0aCgpICE9IDApIHsKLSAgICAgICAgICAgIHRoaXMuc2NoZW1hX25hbWVzcGFjZV9wcmVmaXggPSBzY2hlbWF0YXJnZXROYW1lc3BhY2VQcmVmaXg7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aGlzLnNjaGVtYV9uYW1lc3BhY2VfcHJlZml4ID0gU0NIRU1BX05BTUVTUEFDRV9QUkZJWDsKLSAgICAgICAgfQotICAgICAgICBpZiAoc2VydmljZSAhPW51bGwgKSB7Ci0gICAgICAgICAgICBQYXJhbWV0ZXIgc29ydEF0dCA9IHNlcnZpY2UuZ2V0UGFyYW1ldGVyKCJTb3J0QXR0cmlidXRlcyIpOwotICAgICAgICAgICAgaWYgKHNvcnRBdHQgIT1udWxsICYmICJmYWxzZSIuZXF1YWxzKHNvcnRBdHQuZ2V0VmFsdWUoKSkpewotICAgICAgICAgICAgICAgIHNvcnRBdHRyaWJ1dGVzID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFBhcmFtZXRlciBnZW5lcmF0ZVdyYXBwZWRBcnJheVR5cGVzID0gc2VydmljZS5nZXRQYXJhbWV0ZXIoImdlbmVyYXRlV3JhcHBlZEFycmF5VHlwZXMiKTsKLSAgICAgICAgICAgIGlmICgoZ2VuZXJhdGVXcmFwcGVkQXJyYXlUeXBlcyAhPSBudWxsKSAmJiBKYXZhVXRpbHMuaXNUcnVlKGdlbmVyYXRlV3JhcHBlZEFycmF5VHlwZXMuZ2V0VmFsdWUoKSkpewotICAgICAgICAgICAgICAgaXNHZW5lcmF0ZVdyYXBwZWRBcnJheVR5cGVzID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0KLSAgICB9Ci0KLSAgICAvL1RoaXMgd2lsbCBsb2NhZCB0aGUgY3VzdG9tIHNjaGVtYSBmaWxlIGFuZCBhZGQgdGhhdCBpbnRvIHRoZSBzY2hlbWEgbWFwCi0gICAgcHJpdmF0ZSB2b2lkIGxvYWRDdXN0b21TY2hlbWFGaWxlKCkgewotICAgICAgICBpZiAoY3VzdG9tU2NoZW1hTG9jYXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGRvY3VtZW50QnVpbGRlckZhY3RvcnkgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICAgICAgZG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKLSAgICAgICAgICAgICAgICBEb2N1bWVudCBkb2MgPSBkb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpLnBhcnNlKG5ldyBGaWxlKGN1c3RvbVNjaGVtYUxvY2F0aW9uKSk7Ci0gICAgICAgICAgICAgICAgWG1sU2NoZW1hIHNjaGVtYSA9IHhtbFNjaGVtYUNvbGxlY3Rpb24ucmVhZChkb2MsIG51bGwpOwotICAgICAgICAgICAgICAgIHNjaGVtYU1hcC5wdXQoc2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpLCBzY2hlbWEpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBsb2cuaW5mbyhlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHdpbGwgbG9hZCB0aGUgbWFwcGluZyBmaWxlIGFuZCB1cGRhdGUgdGhlIFR5cGV0YWJsZSB3aXRoIHRoZSBDbGFzcyBuYW1lIGFuZCB0aGUgUW5hbWUKLSAgICAgKiBNYXBwaW5nIGZpbGUgbG9vayBsaWtlCi0gICAgICogb3JnLmZvby5iYXIuRm9vRXhjZXB0aW9ufGh0dHA6Ly93d3cuYWJjLmNvbS9zb2FmcmFtZXdvcmsvY29tbW9uL3R5cGVzfEVycm9yTWVzc2FnZQotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBsb2FkTWFwcGluZ0ZpbGUoKSB7Ci0gICAgICAgIGlmIChtYXBwaW5nRmlsZUxvY2F0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKG1hcHBpbmdGaWxlTG9jYXRpb24pOwotICAgICAgICAgICAgQnVmZmVyZWRSZWFkZXIgaW5wdXQgPSBudWxsOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpbnB1dCA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIobmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKSkpOwotICAgICAgICAgICAgICAgIFN0cmluZyBsaW5lOwotICAgICAgICAgICAgICAgIHdoaWxlICgobGluZSA9IGlucHV0LnJlYWRMaW5lKCkpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbGluZSA9IGxpbmUudHJpbSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobGluZS5sZW5ndGgoKSA+IDAgJiYgbGluZS5jaGFyQXQoMCkgIT0gJyMnKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWVzW10gPSBsaW5lLnNwbGl0KCJcXHwiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZXMgIT0gbnVsbCAmJiB2YWx1ZXMubGVuZ3RoID4gMikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVUYWJsZS5hZGRDb21wbGV4U2NoZW1hKHZhbHVlc1swXSwgbmV3IFFOYW1lKHZhbHVlc1sxXSwgdmFsdWVzWzJdKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgIGV4LnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBHZW5lcmF0ZXMgc2NoZW1hIGZvciBhbGwgdGhlIHBhcmFtZXRlcnMgaW4gbWV0aG9kLiBGaXJzdCBnZW5lcmF0ZXMgc2NoZW1hIGZvciBhbGwgZGlmZmVyZW50Ci0gICAgICogcGFyYW1ldGVyIHR5cGUgYW5kIGxhdGVyIHJlZmVycyB0byB0aGVtLgotICAgICAqCi0gICAgICogQHJldHVybiBSZXR1cm5zIFhtbFNjaGVtYS4KLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBDb2xsZWN0aW9uIGdlbmVyYXRlU2NoZW1hKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGxvYWRDdXN0b21TY2hlbWFGaWxlKCk7Ci0gICAgICAgIGxvYWRNYXBwaW5nRmlsZSgpOwotICAgICAgICAvL2FsbCBtb3N0IGFsbCB0aGUgdGltZSB0aGUgaXR0ciB3aWxsIGhhdmUgb25seSBvbmUgY2xhc3MgaW4gaXQKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNjaGVtYSBnZW5lcnRhaW9uIGRvbmUgaW4gdHdvIHN0YWdlIDEuIExvYWQgYWxsIHRoZSBtZXRob2RzIGFuZAotICAgICAgICAgKiBjcmVhdGUgdHlwZSBmb3IgbWV0aG9kcyBwYXJhbWV0ZXJzIChpZiB0aGUgcGFyYW1ldGVycyBhcmUgQmVhbgotICAgICAgICAgKiB0aGVuIGl0IHdpbGwgY3JlYXRlIENvbXBsZXggdHlwZXMgZm9lciB0aG9zZSAsIGFuZCBpZiB0aGUKLSAgICAgICAgICogcGFyYW1ldGVycyBhcmUgc2ltcGxlIHR5cGUgd2hpY2ggZGVjcmliZSBpbiBTaW1wbGVUeXBlVGFibGUKLSAgICAgICAgICogbm90aGluZyB3aWxsIGhhcHBlbikgMi4gSW4gdGhlIG5leHQgc3RhZ2UgZm9yIGFsbCB0aGUgbWV0aG9kcwotICAgICAgICAgKiBtZXNzYWdlcyBhbmQgcG9ydCB0eXBlcyB3aWxsIGJlIGNyZXRlYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgV2ViU2VydmljZSB3ZWJlcnZpY2UgPSAoV2ViU2VydmljZSkgc2VydmljZUNsYXNzLmdldEFubm90YXRpb24oV2ViU2VydmljZS5jbGFzcyk7Ci0gICAgICAgIGlmICh3ZWJlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIHRucyA9IHdlYmVydmljZS50YXJnZXROYW1lc3BhY2UoKTsKLSAgICAgICAgICAgIGlmICh0bnMgIT0gbnVsbCAmJiAhIiIuZXF1YWxzKHRucykpIHsKLSAgICAgICAgICAgICAgICB0YXJnZXROYW1lc3BhY2UgPSB0bnM7Ci0gICAgICAgICAgICAgICAgc2NoZW1hVGFyZ2V0TmFtZVNwYWNlID0gdG5zOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2VydmljZS5zZXROYW1lKFV0aWxzLmdldEFubm90YXRlZFNlcnZpY2VOYW1lKHNlcnZpY2VDbGFzcywgd2ViZXJ2aWNlKSk7Ci0gICAgICAgIH0KLSAgICAgICAgbWV0aG9kcyA9IHByb2Nlc3NNZXRob2RzKHNlcnZpY2VDbGFzcy5nZXREZWNsYXJlZE1ldGhvZHMoKSk7Ci0gICAgICAgIHJldHVybiBzY2hlbWFNYXAudmFsdWVzKCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIE1ldGhvZFtdIHByb2Nlc3NNZXRob2RzKE1ldGhvZFtdIGRlY2xhcmVkTWV0aG9kcykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAvL3Nob3J0IHRoZSBlbGVtZW50cyBpbiB0aGUgYXJyYXkKLSAgICAgICAgQXJyYXlzLnNvcnQoZGVjbGFyZWRNZXRob2RzLCBuZXcgTWF0aG9kQ29tcGFyYXRvcigpKTsKLQotCi0gICAgICAgIC8vIHNpbmNlIHdlIGRvIG5vdCBzdXBwb3J0IG92ZXJsb2FkCi0gICAgICAgIEhhc2hNYXAgdW5pcXVlTWV0aG9kcyA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7Ci0gICAgICAgIFhtbFNjaGVtYUNvbXBsZXhUeXBlIG1ldGhvZFNjaGVtYVR5cGU7Ci0gICAgICAgIFhtbFNjaGVtYVNlcXVlbmNlIHNlcXVlbmNlID0gbnVsbDsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlY2xhcmVkTWV0aG9kcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgTWV0aG9kIGpNZXRob2QgPSBkZWNsYXJlZE1ldGhvZHNbaV07Ci0gICAgICAgICAgICBXZWJNZXRob2QgbWV0aG9kQW5ub24gPSBqTWV0aG9kLmdldEFubm90YXRpb24oV2ViTWV0aG9kLmNsYXNzKTsKLSAgICAgICAgICAgIGlmIChtZXRob2RBbm5vbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1ldGhvZEFubm9uLmV4Y2x1ZGUoKSkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTdHJpbmcgbWV0aG9kTmFtZSA9IGpNZXRob2QuZ2V0TmFtZSgpOwotICAgICAgICAgICAgLy8gbm8gbmVlZCB0byB0aGluayBhYnQgdGhpcyBtZXRob2QgLCBzaW5jZSB0aGF0IGlzIHN5c3RlbQotICAgICAgICAgICAgLy8gY29uZmlnIG1ldGhvZAotICAgICAgICAgICAgaWYgKGV4Y2x1ZGVNZXRob2RzLmNvbnRhaW5zKG1ldGhvZE5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICh1bmlxdWVNZXRob2RzLmdldChtZXRob2ROYW1lKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbG9nLndhcm4oIldlIGRvbid0IHN1cHBvcnQgbWV0aG9kIG92ZXJsb2FkaW5nLiBJZ25vcmluZyBbIiArCi0gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lICsgIl0iKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghTW9kaWZpZXIuaXNQdWJsaWMoak1ldGhvZC5nZXRNb2RpZmllcnMoKSkpIHsKLSAgICAgICAgICAgICAgICAvLyBubyBuZWVkIHRvIGdlbmVyYXRlIFNjaGVtYSBmb3Igbm9uIHB1YmxpYyBtZXRob2RzCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBib29sZWFuIGFkZFRvU2VydmljZSA9IGZhbHNlOwotICAgICAgICAgICAgQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uID0gc2VydmljZS5nZXRPcGVyYXRpb24obmV3IFFOYW1lKG1ldGhvZE5hbWUpKTsKLSAgICAgICAgICAgIGlmIChheGlzT3BlcmF0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBheGlzT3BlcmF0aW9uID0gVXRpbHMuZ2V0QXhpc09wZXJhdGlvbkZvckptZXRob2Qoak1ldGhvZCk7Ci0vLyAgICAgICAgICAgICAgICBpZiAoV1NETDJDb25zdGFudHMuTUVQX1VSSV9ST0JVU1RfSU5fT05MWS5lcXVhbHMoCi0vLyAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNPcGVyYXRpb24uZ2V0TWVzc2FnZUV4Y2hhbmdlUGF0dGVybigpKSkgewotLy8gICAgICAgICAgICAgICAgICAgIEF4aXNNZXNzYWdlIG91dE1lc3NhZ2UgPSBheGlzT3BlcmF0aW9uLmdldE1lc3NhZ2UoCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU0RMQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfT1VUX1ZBTFVFKTsKLS8vICAgICAgICAgICAgICAgICAgICBpZiAob3V0TWVzc2FnZSAhPSBudWxsKSB7Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgIG91dE1lc3NhZ2Uuc2V0TmFtZShtZXRob2ROYW1lICsgUkVTUE9OU0UpOwotLy8gICAgICAgICAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBhZGRUb1NlcnZpY2UgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gTWFpbnRhaW4gYSBsaXN0IG9mIG1ldGhvZHMgd2UgYWN0dWFsbHkgd29yayB3aXRoCi0gICAgICAgICAgICBsaXN0LmFkZChqTWV0aG9kKTsKLQotICAgICAgICAgICAgcHJvY2Vzc0V4Y2VwdGlvbihqTWV0aG9kLCBheGlzT3BlcmF0aW9uKTsKLSAgICAgICAgICAgIHVuaXF1ZU1ldGhvZHMucHV0KG1ldGhvZE5hbWUsIGpNZXRob2QpOwotICAgICAgICAgICAgQ2xhc3NbXSBwYXJhbWV0ZXJzID0gak1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpOwotICAgICAgICAgICAgU3RyaW5nIHBhcmFtZXRlck5hbWVzW10gPSBudWxsOwotICAgICAgICAgICAgQXhpc01lc3NhZ2UgaW5NZXNzYWdlID0gYXhpc09wZXJhdGlvbi5nZXRNZXNzYWdlKFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9JTl9WQUxVRSk7Ci0gICAgICAgICAgICBpZiAoaW5NZXNzYWdlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpbk1lc3NhZ2Uuc2V0TmFtZShtZXRob2ROYW1lICsgSmF2YTJXU0RMQ29uc3RhbnRzLk1FU1NBR0VfU1VGRklYKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwYXJhbWV0ZXJzLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgICAgICBwYXJhbWV0ZXJOYW1lcyA9IG1ldGhvZFRhYmxlLmdldFBhcmFtZXRlck5hbWVzKG1ldGhvZE5hbWUpOwotICAgICAgICAgICAgICAgIHNlcXVlbmNlID0gbmV3IFhtbFNjaGVtYVNlcXVlbmNlKCk7Ci0KLSAgICAgICAgICAgICAgICBtZXRob2RTY2hlbWFUeXBlID0gY3JlYXRlU2NoZW1hVHlwZUZvck1ldGhvZFBhcnQobWV0aG9kTmFtZSk7Ci0gICAgICAgICAgICAgICAgbWV0aG9kU2NoZW1hVHlwZS5zZXRQYXJ0aWNsZShzZXF1ZW5jZSk7Ci0gICAgICAgICAgICAgICAgaW5NZXNzYWdlLnNldEVsZW1lbnRRTmFtZSh0eXBlVGFibGUuZ2V0UU5hbWVmb3J0aGVUeXBlKG1ldGhvZE5hbWUpKTsKLSAgICAgICAgICAgICAgICBzZXJ2aWNlLmFkZE1lc3NhZ2VFbGVtZW50UU5hbWVUb09wZXJhdGlvbk1hcHBpbmcobWV0aG9kU2NoZW1hVHlwZS5nZXRRTmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgYXhpc09wZXJhdGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBbm5vdGF0aW9uW11bXSBwYXJhbWV0ZXJBbm5vdGF0aW9uID0gak1ldGhvZC5nZXRQYXJhbWV0ZXJBbm5vdGF0aW9ucygpOwotICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBwYXJhbWV0ZXJzLmxlbmd0aDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgQ2xhc3MgbWV0aG9kUGFyYW1ldGVyID0gcGFyYW1ldGVyc1tqXTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcGFyYW1ldGVyTmFtZSA9IGdldFBhcmFtZXRlck5hbWUocGFyYW1ldGVyQW5ub3RhdGlvbiwgaiwgcGFyYW1ldGVyTmFtZXMpOwotICAgICAgICAgICAgICAgIGlmIChub25ScGNNZXRob2RzLmNvbnRhaW5zKGpNZXRob2QuZ2V0TmFtZSgpKSkgewotICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZVNjaGVtYUZvclR5cGUoc2VxdWVuY2UsIG51bGwsIGpNZXRob2QuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVTY2hlbWFGb3JUeXBlKHNlcXVlbmNlLCBtZXRob2RQYXJhbWV0ZXIsIHBhcmFtZXRlck5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIGZvciBpdHMgcmV0dXJuIHR5cGUKLSAgICAgICAgICAgIENsYXNzIHJldHVyblR5cGUgPSBqTWV0aG9kLmdldFJldHVyblR5cGUoKTsKLSAgICAgICAgICAgIGlmICghInZvaWQiLmVxdWFscyhqTWV0aG9kLmdldFJldHVyblR5cGUoKS5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHBhcnRRbmFtZSA9IG1ldGhvZE5hbWUgKyBSRVNQT05TRTsKLSAgICAgICAgICAgICAgICBtZXRob2RTY2hlbWFUeXBlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZVNjaGVtYVR5cGVGb3JNZXRob2RQYXJ0KHBhcnRRbmFtZSk7Ci0gICAgICAgICAgICAgICAgc2VxdWVuY2UgPSBuZXcgWG1sU2NoZW1hU2VxdWVuY2UoKTsKLSAgICAgICAgICAgICAgICBtZXRob2RTY2hlbWFUeXBlLnNldFBhcnRpY2xlKHNlcXVlbmNlKTsKLSAgICAgICAgICAgICAgICBXZWJSZXN1bHQgcmV0dXJuQW5ub24gPSBqTWV0aG9kLmdldEFubm90YXRpb24oV2ViUmVzdWx0LmNsYXNzKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcmV0dXJuTmFtZSA9ICJyZXR1cm4iOwotICAgICAgICAgICAgICAgIGlmIChyZXR1cm5Bbm5vbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybk5hbWUgPSByZXR1cm5Bbm5vbi5uYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXR1cm5OYW1lICE9IG51bGwgJiYgISIiLmVxdWFscyhyZXR1cm5OYW1lKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuTmFtZSA9ICJyZXR1cm4iOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChub25ScGNNZXRob2RzLmNvbnRhaW5zKGpNZXRob2QuZ2V0TmFtZSgpKSkgewotICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZVNjaGVtYUZvclR5cGUoc2VxdWVuY2UsIG51bGwsIHJldHVybk5hbWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlU2NoZW1hRm9yVHlwZShzZXF1ZW5jZSwgcmV0dXJuVHlwZSwgcmV0dXJuTmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEF4aXNNZXNzYWdlIG91dE1lc3NhZ2UgPSBheGlzT3BlcmF0aW9uLmdldE1lc3NhZ2UoCi0gICAgICAgICAgICAgICAgICAgICAgICBXU0RMQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfT1VUX1ZBTFVFKTsKLSAgICAgICAgICAgICAgICBvdXRNZXNzYWdlLnNldEVsZW1lbnRRTmFtZSh0eXBlVGFibGUuZ2V0UU5hbWVmb3J0aGVUeXBlKHBhcnRRbmFtZSkpOwotICAgICAgICAgICAgICAgIG91dE1lc3NhZ2Uuc2V0TmFtZShwYXJ0UW5hbWUpOwotICAgICAgICAgICAgICAgIHNlcnZpY2UuYWRkTWVzc2FnZUVsZW1lbnRRTmFtZVRvT3BlcmF0aW9uTWFwcGluZyhtZXRob2RTY2hlbWFUeXBlLmdldFFOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBheGlzT3BlcmF0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChhZGRUb1NlcnZpY2UpIHsKLSAgICAgICAgICAgICAgICBzZXJ2aWNlLmFkZE9wZXJhdGlvbihheGlzT3BlcmF0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKE1ldGhvZFtdKSBsaXN0LnRvQXJyYXkobmV3IE1ldGhvZFtsaXN0LnNpemUoKV0pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgZ2VuZXJhdGUgU2NoZW1hIGVsZW1lbnQgZm9yIGFsbCB0aGUgZXhjZXRpb24gdHlwZXMgaW4gYSBnaXZlbiBKTWV0aG9kCi0gICAgICogLSBObyBtYXR0ZXIgd2hhdCBpdCB3aWxsIGdlbmVyYXRlIFNjaGVtYSBlbGVtZW50IGZvciBqYXZhLmxhbmcuRXhjZXB0aW9uIHNvIHRoYXQgZm9yIG90aGVyCi0gICAgICogZXhjZXB0aW9uIHdoaWNoIGV4dGVuZCBqYXZhLmxhbmcuRXhjZXRpb24gY2FuIHVzZSBhcyB0aGUgYmFzZSBjbGFzcyB0eXBlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0V4Y2VwdGlvbihNZXRob2Qgak1ldGhvZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF4aXNPcGVyYXRpb24gYXhpc09wZXJhdGlvbikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFhtbFNjaGVtYUNvbXBsZXhUeXBlIG1ldGhvZFNjaGVtYVR5cGU7Ci0gICAgICAgIFhtbFNjaGVtYVNlcXVlbmNlIHNlcXVlbmNlOwotICAgICAgICBpZiAoak1ldGhvZC5nZXRFeGNlcHRpb25UeXBlcygpLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgIGlmICghZ2VuZXJhdGVCYXNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHR5cGVUYWJsZS5nZXRDb21wbGV4U2NoZW1hVHlwZShFeGNlcHRpb24uY2xhc3MuZ2V0TmFtZSgpKSAhPSBudWxsKSB7Ci0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZSA9IG5ldyBYbWxTY2hlbWFTZXF1ZW5jZSgpOwotICAgICAgICAgICAgICAgICAgICBYbWxTY2hlbWEgeG1sU2NoZW1hID0gZ2V0WG1sU2NoZW1hKHNjaGVtYVRhcmdldE5hbWVTcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIFFOYW1lIGVsZW1lbnROYW1lID0gbmV3IFFOYW1lKHNjaGVtYVRhcmdldE5hbWVTcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhjZXB0aW9uIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWFfbmFtZXNwYWNlX3ByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgIFhtbFNjaGVtYUNvbXBsZXhUeXBlIGNvbXBsZXhUeXBlID0gbmV3IFhtbFNjaGVtYUNvbXBsZXhUeXBlKHhtbFNjaGVtYSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbXBsZXhUeXBlLnNldE5hbWUoIkV4Y2VwdGlvbiIpOwotICAgICAgICAgICAgICAgICAgICB4bWxTY2hlbWEuZ2V0SXRlbXMoKS5hZGQoY29tcGxleFR5cGUpOwotICAgICAgICAgICAgICAgICAgICB4bWxTY2hlbWEuZ2V0RWxlbWVudHMoKS5hZGQoZWxlbWVudE5hbWUsIGNvbXBsZXhUeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgdHlwZVRhYmxlLmFkZENvbXBsZXhTY2hlbWEoRXhjZXB0aW9uLmNsYXNzLmdldE5hbWUoKSwgZWxlbWVudE5hbWUpOwotICAgICAgICAgICAgICAgICAgICBRTmFtZSBzY2hlbWFUeXBlTmFtZSA9IFR5cGVUYWJsZS5BTllfVFlQRTsKLSAgICAgICAgICAgICAgICAgICAgYWRkQ29udGVudFRvTWV0aG9kU2NoZW1hVHlwZShzZXF1ZW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWFUeXBlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhjZXB0aW9uIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbXBsZXhUeXBlLnNldFBhcnRpY2xlKHNlcXVlbmNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZ2VuZXJhdGVCYXNlRXhjZXB0aW9uID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENsYXNzW10gZXh0eXBlcyA9IGpNZXRob2QuZ2V0RXhjZXB0aW9uVHlwZXMoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgZXh0eXBlcy5sZW5ndGg7IGorKykgewotICAgICAgICAgICAgICAgIENsYXNzIGV4dHlwZSA9IGV4dHlwZXNbal07Ci0gICAgICAgICAgICAgICAgaWYgKEF4aXNGYXVsdC5jbGFzcy5nZXROYW1lKCkuZXF1YWxzKGV4dHlwZS5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBTdHJpbmcgcGFydFFuYW1lID0gZXh0eXBlLmdldFNpbXBsZU5hbWUoKTsKLSAgICAgICAgICAgICAgICBtZXRob2RTY2hlbWFUeXBlID0gY3JlYXRlU2NoZW1hVHlwZUZvckZhdWx0KHBhcnRRbmFtZSk7Ci0gICAgICAgICAgICAgICAgUU5hbWUgZWxlbWVudE5hbWUgPQotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFFOYW1lKHRoaXMuc2NoZW1hVGFyZ2V0TmFtZVNwYWNlLCBwYXJ0UW5hbWUsIHRoaXMuc2NoZW1hX25hbWVzcGFjZV9wcmVmaXgpOwotICAgICAgICAgICAgICAgIHNlcXVlbmNlID0gbmV3IFhtbFNjaGVtYVNlcXVlbmNlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKEV4Y2VwdGlvbi5jbGFzcy5nZXROYW1lKCkuZXF1YWxzKGV4dHlwZS5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFFOYW1lIHNjaGVtYVR5cGVOYW1lID0gdHlwZVRhYmxlLmdldENvbXBsZXhTY2hlbWFUeXBlKEV4Y2VwdGlvbi5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICBhZGRDb250ZW50VG9NZXRob2RTY2hlbWFUeXBlKHNlcXVlbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYVR5cGVOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRRbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1ldGhvZFNjaGVtYVR5cGUuc2V0UGFydGljbGUoc2VxdWVuY2UpOwotICAgICAgICAgICAgICAgICAgICB0eXBlVGFibGUuYWRkQ29tcGxleFNjaGVtYShFeGNlcHRpb24uY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RTY2hlbWFUeXBlLmdldFFOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICByZXNvbHZlU2NoZW1hTmFtZXNwYWNlKEV4Y2VwdGlvbi5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkSW1wb3J0KGdldFhtbFNjaGVtYShzY2hlbWFUYXJnZXROYW1lU3BhY2UpLCBzY2hlbWFUeXBlTmFtZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVTY2hlbWFGb3JUeXBlKHNlcXVlbmNlLCBleHR5cGUsIGV4dHlwZS5nZXRTaW1wbGVOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICBtZXRob2RTY2hlbWFUeXBlLnNldFBhcnRpY2xlKHNlcXVlbmNlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB0eXBlVGFibGUuYWRkQ29tcGxleFNjaGVtYShwYXJ0UW5hbWUsIGVsZW1lbnROYW1lKTsKLQotICAgICAgICAgICAgICAgIGlmIChBeGlzRmF1bHQuY2xhc3MuZ2V0TmFtZSgpLmVxdWFscyhleHR5cGUuZ2V0TmFtZSgpKSkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQXhpc01lc3NhZ2UgZmF1bHRNZXNzYWdlID0gbmV3IEF4aXNNZXNzYWdlKCk7Ci0gICAgICAgICAgICAgICAgZmF1bHRNZXNzYWdlLnNldE5hbWUoZXh0eXBlLmdldFNpbXBsZU5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgZmF1bHRNZXNzYWdlLnNldEVsZW1lbnRRTmFtZSh0eXBlVGFibGUuZ2V0UU5hbWVmb3J0aGVUeXBlKHBhcnRRbmFtZSkpOwotICAgICAgICAgICAgICAgIGF4aXNPcGVyYXRpb24uc2V0RmF1bHRNZXNzYWdlcyhmYXVsdE1lc3NhZ2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2VuZXJhdGUgc2NoZW1hIGNvbnN0cnVjdCBmb3IgZ2l2ZW4gdHlwZQotICAgICAqCi0gICAgICogQHBhcmFtIGphdmFUeXBlIDogQ2xhc3MgdG8gd2hjaWggbmVlZCB0byBnZW5lcmF0ZSBTY2hlbWEKLSAgICAgKiBAcmV0dXJuIDogR2VuZXJhdGVkIFFOYW1lCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFFOYW1lIGdlbmVyYXRlU2NoZW1hKENsYXNzIGphdmFUeXBlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIG5hbWUgPSBnZXRDbGFzc05hbWUoamF2YVR5cGUpOwotICAgICAgICBRTmFtZSBzY2hlbWFUeXBlTmFtZSA9IHR5cGVUYWJsZS5nZXRDb21wbGV4U2NoZW1hVHlwZShuYW1lKTsKLSAgICAgICAgaWYgKHNjaGVtYVR5cGVOYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyBzaW1wbGVOYW1lID0gamF2YVR5cGUuZ2V0U2ltcGxlTmFtZSgpOwotCi0gICAgICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSBnZXRRdWFsaWZpZWROYW1lKGphdmFUeXBlLmdldFBhY2thZ2UoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgdGFyZ2V0TmFtZVNwYWNlID0gcmVzb2x2ZVNjaGVtYU5hbWVzcGFjZShwYWNrYWdlTmFtZSk7Ci0KLSAgICAgICAgICAgIFhtbFNjaGVtYSB4bWxTY2hlbWEgPSBnZXRYbWxTY2hlbWEodGFyZ2V0TmFtZVNwYWNlKTsKLSAgICAgICAgICAgIFN0cmluZyB0YXJnZXROYW1lc3BhY2VQcmVmaXggPSAoU3RyaW5nKSB0YXJnZXROYW1lc3BhY2VQcmVmaXhNYXAuZ2V0KHRhcmdldE5hbWVTcGFjZSk7Ci0gICAgICAgICAgICBpZiAodGFyZ2V0TmFtZXNwYWNlUHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0YXJnZXROYW1lc3BhY2VQcmVmaXggPSBnZW5lcmF0ZVByZWZpeCgpOwotICAgICAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZVByZWZpeE1hcC5wdXQodGFyZ2V0TmFtZVNwYWNlLCB0YXJnZXROYW1lc3BhY2VQcmVmaXgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBYbWxTY2hlbWFDb21wbGV4VHlwZSBjb21wbGV4VHlwZSA9IG5ldyBYbWxTY2hlbWFDb21wbGV4VHlwZSh4bWxTY2hlbWEpOwotICAgICAgICAgICAgWG1sU2NoZW1hU2VxdWVuY2Ugc2VxdWVuY2UgPSBuZXcgWG1sU2NoZW1hU2VxdWVuY2UoKTsKLSAgICAgICAgICAgIFhtbFNjaGVtYUNvbXBsZXhDb250ZW50RXh0ZW5zaW9uIGNvbXBsZXhFeHRlbnNpb24gPQotICAgICAgICAgICAgICAgICAgICBuZXcgWG1sU2NoZW1hQ29tcGxleENvbnRlbnRFeHRlbnNpb24oKTsKLQotICAgICAgICAgICAgWG1sU2NoZW1hRWxlbWVudCBlbHRPdXRlciA9IG5ldyBYbWxTY2hlbWFFbGVtZW50KCk7Ci0gICAgICAgICAgICBzY2hlbWFUeXBlTmFtZSA9IG5ldyBRTmFtZSh0YXJnZXROYW1lU3BhY2UsIHNpbXBsZU5hbWUsIHRhcmdldE5hbWVzcGFjZVByZWZpeCk7Ci0gICAgICAgICAgICBlbHRPdXRlci5zZXROYW1lKHNpbXBsZU5hbWUpOwotICAgICAgICAgICAgZWx0T3V0ZXIuc2V0UU5hbWUoc2NoZW1hVHlwZU5hbWUpOwotCi0gICAgICAgICAgICBDbGFzcyBzdXAgPSBqYXZhVHlwZS5nZXRTdXBlcmNsYXNzKCk7Ci0gICAgICAgICAgICBpZiAoKHN1cCAhPSBudWxsKSAmJiAhKCJqYXZhLmxhbmcuT2JqZWN0Ii5jb21wYXJlVG8oc3VwLmdldE5hbWUoKSkgPT0gMCkgJiYKLSAgICAgICAgICAgICAgICAgICAgIShnZXRRdWFsaWZpZWROYW1lKHN1cC5nZXRQYWNrYWdlKCkpLmluZGV4T2YoIm9yZy5hcGFjaGUuYXhpczIiKSA+IDApCi0gICAgICAgICAgICAgICAgICAgICYmICEoZ2V0UXVhbGlmaWVkTmFtZShzdXAuZ2V0UGFja2FnZSgpKS5pbmRleE9mKCJqYXZhLnV0aWwiKSA+IDApKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0cmluZyBzdXBlckNsYXNzTmFtZSA9IHN1cC5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHN1cGVyY2xhc3NuYW1lID0gc3VwLmdldFNpbXBsZU5hbWUoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdGd0TmFtZXNwYWNlOwotICAgICAgICAgICAgICAgIFN0cmluZyB0Z3ROYW1lc3BhY2VwZng7Ci0gICAgICAgICAgICAgICAgUU5hbWUgcU5hbWUgPSB0eXBlVGFibGUuZ2V0U2ltcGxlU2NoZW1hVHlwZU5hbWUoc3VwZXJDbGFzc05hbWUpOwotICAgICAgICAgICAgICAgIGlmIChxTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRndE5hbWVzcGFjZSA9IHFOYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgICAgICB0Z3ROYW1lc3BhY2VwZnggPSBxTmFtZS5nZXRQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0Z3ROYW1lc3BhY2UgPSByZXNvbHZlU2NoZW1hTmFtZXNwYWNlKGdldFF1YWxpZmllZE5hbWUoc3VwLmdldFBhY2thZ2UoKSkpOwotICAgICAgICAgICAgICAgICAgICB0Z3ROYW1lc3BhY2VwZnggPSAoU3RyaW5nKSB0YXJnZXROYW1lc3BhY2VQcmVmaXhNYXAuZ2V0KHRndE5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIFFOYW1lIHN1cGVyQ2xhc3NRbmFtZSA9IGdlbmVyYXRlU2NoZW1hKHN1cCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdXBlckNsYXNzUW5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGd0TmFtZXNwYWNlcGZ4ID0gc3VwZXJDbGFzc1FuYW1lLmdldFByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgdGd0TmFtZXNwYWNlID0gc3VwZXJDbGFzc1FuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICh0Z3ROYW1lc3BhY2VwZnggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0Z3ROYW1lc3BhY2VwZnggPSBnZW5lcmF0ZVByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICB0YXJnZXROYW1lc3BhY2VQcmVmaXhNYXAucHV0KHRndE5hbWVzcGFjZSwgdGd0TmFtZXNwYWNlcGZ4KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy9pZiB0aGUgcGFyZW50IGNsYXNzIHBhY2thZ2UgbmFtZSBpcyBkaWZmZXIgZnJvbSB0aGUgY2hpbGQKLSAgICAgICAgICAgICAgICBpZiAoISgoTmFtZXNwYWNlTWFwKSB4bWxTY2hlbWEuZ2V0TmFtZXNwYWNlQ29udGV4dCgpKS52YWx1ZXMoKS4KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5zKHRndE5hbWVzcGFjZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgWG1sU2NoZW1hSW1wb3J0IGltcG9ydEVsZW1lbnQgPSBuZXcgWG1sU2NoZW1hSW1wb3J0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGltcG9ydEVsZW1lbnQuc2V0TmFtZXNwYWNlKHRndE5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFNjaGVtYS5nZXRJdGVtcygpLmFkZChpbXBvcnRFbGVtZW50KTsKLSAgICAgICAgICAgICAgICAgICAgKChOYW1lc3BhY2VNYXApIHhtbFNjaGVtYS5nZXROYW1lc3BhY2VDb250ZXh0KCkpLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1dChnZW5lcmF0ZVByZWZpeCgpLCB0Z3ROYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIFFOYW1lIGJhc2V0eXBlID0gbmV3IFFOYW1lKHRndE5hbWVzcGFjZSwgc3VwZXJjbGFzc25hbWUsIHRndE5hbWVzcGFjZXBmeCk7Ci0gICAgICAgICAgICAgICAgY29tcGxleEV4dGVuc2lvbi5zZXRCYXNlVHlwZU5hbWUoYmFzZXR5cGUpOwotICAgICAgICAgICAgICAgIGNvbXBsZXhFeHRlbnNpb24uc2V0UGFydGljbGUoc2VxdWVuY2UpOwotICAgICAgICAgICAgICAgIFhtbFNjaGVtYUNvbXBsZXhDb250ZW50IGNvbnRlbnRNb2RlbCA9IG5ldyBYbWxTY2hlbWFDb21wbGV4Q29udGVudCgpOwotICAgICAgICAgICAgICAgIGNvbnRlbnRNb2RlbC5zZXRDb250ZW50KGNvbXBsZXhFeHRlbnNpb24pOwotICAgICAgICAgICAgICAgIGNvbXBsZXhUeXBlLnNldENvbnRlbnRNb2RlbChjb250ZW50TW9kZWwpOwotCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGNvbXBsZXhUeXBlLnNldFBhcnRpY2xlKHNlcXVlbmNlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY29tcGxleFR5cGUuc2V0TmFtZShzaW1wbGVOYW1lKTsKLQotLy8gICAgICAgICAgICB4bWxTY2hlbWEuZ2V0SXRlbXMoKS5hZGQoZWx0T3V0ZXIpOwotICAgICAgICAgICAgeG1sU2NoZW1hLmdldEVsZW1lbnRzKCkuYWRkKHNjaGVtYVR5cGVOYW1lLCBlbHRPdXRlcik7Ci0gICAgICAgICAgICBlbHRPdXRlci5zZXRTY2hlbWFUeXBlTmFtZShjb21wbGV4VHlwZS5nZXRRTmFtZSgpKTsKLQotICAgICAgICAgICAgeG1sU2NoZW1hLmdldEl0ZW1zKCkuYWRkKGNvbXBsZXhUeXBlKTsKLSAgICAgICAgICAgIHhtbFNjaGVtYS5nZXRTY2hlbWFUeXBlcygpLmFkZChzY2hlbWFUeXBlTmFtZSwgY29tcGxleFR5cGUpOwotCi0gICAgICAgICAgICAvLyBhZGRpbmcgdGhpcyB0eXBlIHRvIHRoZSB0YWJsZQotICAgICAgICAgICAgdHlwZVRhYmxlLmFkZENvbXBsZXhTY2hlbWEobmFtZSwgZWx0T3V0ZXIuZ2V0UU5hbWUoKSk7Ci0gICAgICAgICAgICAvLyBhZGRpbmcgdGhpcyB0eXBlJ3MgcGFja2FnZSB0byB0aGUgdGFibGUsIHRvIHN1cHBvcnQgaW5oZXJpdGFuY2UuCi0gICAgICAgICAgICB0eXBlVGFibGUuYWRkQ29tcGxleFNjaGVtYShnZXRRdWFsaWZpZWROYW1lKGphdmFUeXBlLmdldFBhY2thZ2UoKSksIGVsdE91dGVyLmdldFFOYW1lKCkpOwotCi0gICAgICAgICAgICBCZWFuRXhjbHVkZUluZm8gYmVhbkV4Y2x1ZGVJbmZvID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChzZXJ2aWNlLmdldEV4Y2x1ZGVJbmZvKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGJlYW5FeGNsdWRlSW5mbyA9IHNlcnZpY2UuZ2V0RXhjbHVkZUluZm8oKS5nZXRCZWFuRXhjbHVkZUluZm9Gb3JDbGFzcyhnZXRDbGFzc05hbWUoamF2YVR5cGUpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gd2UgbmVlZCB0byBnZXQgcHJvcGVydGllcyBvbmx5IGZvciB0aGlzIGJlYW4uIGhlbmNlIGlnbm9yZSB0aGUgc3VwZXIKLSAgICAgICAgICAgIC8vIGNsYXNzIHByb3BlcnRpZXMKLSAgICAgICAgICAgIEJlYW5JbmZvIGJlYW5JbmZvID0gSW50cm9zcGVjdG9yLmdldEJlYW5JbmZvKGphdmFUeXBlLCBqYXZhVHlwZS5nZXRTdXBlcmNsYXNzKCkpOwotICAgICAgICAgICAgUHJvcGVydHlEZXNjcmlwdG9yW10gcHJvcGVydGllcyA9IGJlYW5JbmZvLmdldFByb3BlcnR5RGVzY3JpcHRvcnMoKTsKLSAgICAgICAgICAgIFByb3BlcnR5RGVzY3JpcHRvciBwcm9wZXJ0eSA9IG51bGw7Ci0gICAgICAgICAgICBTdHJpbmcgcHJvcGVydHlOYW1lID0gbnVsbDsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvcGVydGllcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIHByb3BlcnR5ID0gcHJvcGVydGllc1tpXTsKLSAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eS5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFwcm9wZXJ0eS5nZXROYW1lKCkuZXF1YWxzKCJjbGFzcyIpICYmIChwcm9wZXJ0eS5nZXRQcm9wZXJ0eVR5cGUoKSAhPSBudWxsKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoKGJlYW5FeGNsdWRlSW5mbyA9PSBudWxsKSB8fCAhYmVhbkV4Y2x1ZGVJbmZvLmlzRXhjbHVkZWRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eS5nZXRQcm9wZXJ0eVR5cGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlU2NoZW1hZm9yRmllbGRzYW5kUHJvcGVydGllcyh4bWxTY2hlbWEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eS5nZXRQcm9wZXJ0eVR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eS5nZXRQcm9wZXJ0eVR5cGUoKS5pc0FycmF5KCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzY2hlbWFUeXBlTmFtZTsKLSAgICB9Ci0KLQotICAgIC8vIG1vdmVkIGNvZGUgY29tbW9uIHRvIEZpZWxkcyAmIHByb3BlcnRpZXMgb3V0IG9mIGFib3ZlIG1ldGhvZAotICAgIHByb3RlY3RlZCB2b2lkIGdlbmVyYXRlU2NoZW1hZm9yRmllbGRzYW5kUHJvcGVydGllcyhYbWxTY2hlbWEgeG1sU2NoZW1hLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYbWxTY2hlbWFTZXF1ZW5jZSBzZXF1ZW5jZSwgQ2xhc3MgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUsIGJvb2xlYW4gaXNBcnJheVR5cGUpCi0gICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHByb3BlcnR5TmFtZTsKLSAgICAgICAgaWYgKGlzQXJyYXlUeXBlKSB7Ci0gICAgICAgICAgICBwcm9wZXJ0eU5hbWUgPSB0eXBlLmdldENvbXBvbmVudFR5cGUoKS5nZXROYW1lKCk7Ci0gICAgICAgICAgICBpZiAodHlwZS5nZXRDb21wb25lbnRUeXBlKCkuaXNBcnJheSgpKSB7Ci0gICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBhIGRvYmxlIGFycmF5IGVsZW1lbnQKLSAgICAgICAgICAgICAgICBDbGFzcyBzaW1wbGVUeXBlID0gdHlwZS5nZXRDb21wb25lbnRUeXBlKCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHNpbXBsZVR5cGVOYW1lID0gIiI7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKHNpbXBsZVR5cGUuaXNBcnJheSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNpbXBsZVR5cGVOYW1lICs9ICJBcnJheU9mIjsKLSAgICAgICAgICAgICAgICAgICAgc2ltcGxlVHlwZSA9IHNpbXBsZVR5cGUuZ2V0Q29tcG9uZW50VHlwZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzaW1wbGVUeXBlTmFtZSArPSBzaW1wbGVUeXBlLmdldFNpbXBsZU5hbWUoKTsKLQotICAgICAgICAgICAgICAgIGlmICh4bWxTY2hlbWEuZ2V0VHlwZUJ5TmFtZShzaW1wbGVUeXBlTmFtZSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBYbWxTY2hlbWFDb21wbGV4VHlwZSB4bWxTY2hlbWFDb21wbGV4VHlwZSA9IG5ldyBYbWxTY2hlbWFDb21wbGV4VHlwZSh4bWxTY2hlbWEpOwotICAgICAgICAgICAgICAgICAgICBYbWxTY2hlbWFTZXF1ZW5jZSB4bWxTY2hlbWFTZXF1ZW5jZSA9IG5ldyBYbWxTY2hlbWFTZXF1ZW5jZSgpOwotICAgICAgICAgICAgICAgICAgICB4bWxTY2hlbWFDb21wbGV4VHlwZS5zZXRQYXJ0aWNsZSh4bWxTY2hlbWFTZXF1ZW5jZSk7Ci0gICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlU2NoZW1hZm9yRmllbGRzYW5kUHJvcGVydGllcyh4bWxTY2hlbWEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sU2NoZW1hU2VxdWVuY2UsIHR5cGUuZ2V0Q29tcG9uZW50VHlwZSgpLCAiYXJyYXkiLCB0cnVlKTsKLQotICAgICAgICAgICAgICAgICAgICB4bWxTY2hlbWFDb21wbGV4VHlwZS5zZXROYW1lKHNpbXBsZVR5cGVOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sU2NoZW1hLmdldEl0ZW1zKCkuYWRkKHhtbFNjaGVtYUNvbXBsZXhUeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sU2NoZW1hLmdldFNjaGVtYVR5cGVzKCkuYWRkKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBRTmFtZSh4bWxTY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCksIHNpbXBsZVR5cGVOYW1lKSwgeG1sU2NoZW1hQ29tcGxleFR5cGUpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChpc0dlbmVyYXRlV3JhcHBlZEFycmF5VHlwZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgWG1sU2NoZW1hRWxlbWVudCB4bWxTY2hlbWFFbGVtZW50ID0gbmV3IFhtbFNjaGVtYUVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sU2NoZW1hRWxlbWVudC5zZXROYW1lKCBuYW1lICsgIldyYXBwZXIiKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sU2NoZW1hRWxlbWVudC5zZXROaWxsYWJsZSh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2UuZ2V0SXRlbXMoKS5hZGQoeG1sU2NoZW1hRWxlbWVudCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNvbXBsZXhUeXBlTmFtZSA9IHNpbXBsZVR5cGVOYW1lICsgIldyYXBwZXIiOwotCi0gICAgICAgICAgICAgICAgICAgIFhtbFNjaGVtYUNvbXBsZXhUeXBlIHhtbFNjaGVtYUNvbXBsZXhUeXBlID0gbmV3IFhtbFNjaGVtYUNvbXBsZXhUeXBlKHhtbFNjaGVtYSk7Ci0gICAgICAgICAgICAgICAgICAgIFhtbFNjaGVtYVNlcXVlbmNlIHhtbFNjaGVtYVNlcXVlbmNlID0gbmV3IFhtbFNjaGVtYVNlcXVlbmNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFNjaGVtYUNvbXBsZXhUeXBlLnNldFBhcnRpY2xlKHhtbFNjaGVtYVNlcXVlbmNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sU2NoZW1hQ29tcGxleFR5cGUuc2V0TmFtZShjb21wbGV4VHlwZU5hbWUpOwotCi0gICAgICAgICAgICAgICAgICAgIHhtbFNjaGVtYS5nZXRJdGVtcygpLmFkZCh4bWxTY2hlbWFDb21wbGV4VHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFNjaGVtYS5nZXRTY2hlbWFUeXBlcygpLmFkZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUU5hbWUoc2NoZW1hVGFyZ2V0TmFtZVNwYWNlLCB4bWxTY2hlbWFDb21wbGV4VHlwZS5nZXROYW1lKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFNjaGVtYUNvbXBsZXhUeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkQ29udGVudFRvTWV0aG9kU2NoZW1hVHlwZSh4bWxTY2hlbWFTZXF1ZW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUU5hbWUoeG1sU2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpLCBzaW1wbGVUeXBlTmFtZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgImFycmF5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKLQotICAgICAgICAgICAgICAgICAgICB4bWxTY2hlbWFFbGVtZW50LnNldFNjaGVtYVR5cGUoeG1sU2NoZW1hQ29tcGxleFR5cGUpOwotICAgICAgICAgICAgICAgICAgICB4bWxTY2hlbWFFbGVtZW50LnNldFNjaGVtYVR5cGVOYW1lKG5ldyBRTmFtZShzY2hlbWFUYXJnZXROYW1lU3BhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sU2NoZW1hQ29tcGxleFR5cGUuZ2V0TmFtZSgpKSk7Ci0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhZGRDb250ZW50VG9NZXRob2RTY2hlbWFUeXBlKHNlcXVlbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBRTmFtZSh4bWxTY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCksIHNpbXBsZVR5cGVOYW1lKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOwotCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHByb3BlcnR5TmFtZSA9IHR5cGUuZ2V0TmFtZSgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpc0FycmF5VHlwZSAmJiAiYnl0ZSIuZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKLSAgICAgICAgICAgIHByb3BlcnR5TmFtZSA9ICJiYXNlNjRCaW5hcnkiOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpc0RhdGFIYW5kbGVyKHR5cGUpKSB7Ci0gICAgICAgICAgICBwcm9wZXJ0eU5hbWUgPSAiYmFzZTY0QmluYXJ5IjsKLSAgICAgICAgfQotICAgICAgICBpZiAodHlwZVRhYmxlLmlzU2ltcGxlVHlwZShwcm9wZXJ0eU5hbWUpKSB7Ci0KLSAgICAgICAgICAgIGlmIChpc0dlbmVyYXRlV3JhcHBlZEFycmF5VHlwZXMgJiYgaXNBcnJheVR5cGUpIHsKLQotICAgICAgICAgICAgICAgIFhtbFNjaGVtYUVsZW1lbnQgeG1sU2NoZW1hRWxlbWVudCA9IG5ldyBYbWxTY2hlbWFFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgeG1sU2NoZW1hRWxlbWVudC5zZXROYW1lKCBuYW1lICsgIldyYXBwZXIiKTsKLSAgICAgICAgICAgICAgICB4bWxTY2hlbWFFbGVtZW50LnNldE5pbGxhYmxlKHRydWUpOwotICAgICAgICAgICAgICAgIHNlcXVlbmNlLmdldEl0ZW1zKCkuYWRkKHhtbFNjaGVtYUVsZW1lbnQpOwotCi0gICAgICAgICAgICAgICAgU3RyaW5nIGNvbXBsZXhUeXBlTmFtZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlVGFibGUuZ2V0U2ltcGxlU2NoZW1hVHlwZU5hbWUocHJvcGVydHlOYW1lKS5nZXRMb2NhbFBhcnQoKSArICJXcmFwcGVyIjsKLQotICAgICAgICAgICAgICAgIFhtbFNjaGVtYUNvbXBsZXhUeXBlIHhtbFNjaGVtYUNvbXBsZXhUeXBlID0gbnVsbDsKLSAgICAgICAgICAgICAgICBpZiAoeG1sU2NoZW1hLmdldFR5cGVCeU5hbWUoY29tcGxleFR5cGVOYW1lKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFNjaGVtYUNvbXBsZXhUeXBlID0gbmV3IFhtbFNjaGVtYUNvbXBsZXhUeXBlKHhtbFNjaGVtYSk7Ci0gICAgICAgICAgICAgICAgICAgIFhtbFNjaGVtYVNlcXVlbmNlIHhtbFNjaGVtYVNlcXVlbmNlID0gbmV3IFhtbFNjaGVtYVNlcXVlbmNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFNjaGVtYUNvbXBsZXhUeXBlLnNldFBhcnRpY2xlKHhtbFNjaGVtYVNlcXVlbmNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sU2NoZW1hQ29tcGxleFR5cGUuc2V0TmFtZShjb21wbGV4VHlwZU5hbWUpOwotCi0gICAgICAgICAgICAgICAgICAgIHhtbFNjaGVtYS5nZXRJdGVtcygpLmFkZCh4bWxTY2hlbWFDb21wbGV4VHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFNjaGVtYS5nZXRTY2hlbWFUeXBlcygpLmFkZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUU5hbWUoc2NoZW1hVGFyZ2V0TmFtZVNwYWNlLCB4bWxTY2hlbWFDb21wbGV4VHlwZS5nZXROYW1lKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFNjaGVtYUNvbXBsZXhUeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudFRvU2VxdWVuY2UoImFycmF5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVUYWJsZS5nZXRTaW1wbGVTY2hlbWFUeXBlTmFtZShwcm9wZXJ0eU5hbWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgeG1sU2NoZW1hU2VxdWVuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWUuZXF1YWxzKCJiYXNlNjRCaW5hcnkiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGlzQXJyYXlUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZS5pc1ByaW1pdGl2ZSgpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgIHhtbFNjaGVtYUNvbXBsZXhUeXBlID0gKFhtbFNjaGVtYUNvbXBsZXhUeXBlKSB4bWxTY2hlbWEuZ2V0VHlwZUJ5TmFtZShjb21wbGV4VHlwZU5hbWUpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHhtbFNjaGVtYUVsZW1lbnQuc2V0U2NoZW1hVHlwZSh4bWxTY2hlbWFDb21wbGV4VHlwZSk7Ci0gICAgICAgICAgICAgICAgeG1sU2NoZW1hRWxlbWVudC5zZXRTY2hlbWFUeXBlTmFtZShuZXcgUU5hbWUoc2NoZW1hVGFyZ2V0TmFtZVNwYWNlLCB4bWxTY2hlbWFDb21wbGV4VHlwZS5nZXROYW1lKCkpKTsKLQotCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGFkZEVsZW1lbnRUb1NlcXVlbmNlKG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlVGFibGUuZ2V0U2ltcGxlU2NoZW1hVHlwZU5hbWUocHJvcGVydHlOYW1lKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlOYW1lLmVxdWFscygiYmFzZTY0QmluYXJ5IiksCi0gICAgICAgICAgICAgICAgICAgICAgICBpc0FycmF5VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUuaXNQcmltaXRpdmUoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChpc0FycmF5VHlwZSkgewotICAgICAgICAgICAgICAgIGdlbmVyYXRlU2NoZW1hKHR5cGUuZ2V0Q29tcG9uZW50VHlwZSgpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZ2VuZXJhdGVTY2hlbWEodHlwZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChpc0dlbmVyYXRlV3JhcHBlZEFycmF5VHlwZXMgJiYgaXNBcnJheVR5cGUpIHsKLQotICAgICAgICAgICAgICAgIFhtbFNjaGVtYUVsZW1lbnQgeG1sU2NoZW1hRWxlbWVudCA9IG5ldyBYbWxTY2hlbWFFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgeG1sU2NoZW1hRWxlbWVudC5zZXROYW1lKG5hbWUgKyAiV3JhcHBlciIpOwotICAgICAgICAgICAgICAgIHhtbFNjaGVtYUVsZW1lbnQuc2V0TmlsbGFibGUodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgc2VxdWVuY2UuZ2V0SXRlbXMoKS5hZGQoeG1sU2NoZW1hRWxlbWVudCk7Ci0KLSAgICAgICAgICAgICAgICBTdHJpbmcgY29tcGxleFR5cGVOYW1lID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVUYWJsZS5nZXRTaW1wbGVTY2hlbWFUeXBlTmFtZShwcm9wZXJ0eU5hbWUpLmdldExvY2FsUGFydCgpICsgIldyYXBwZXIiOwotCi0gICAgICAgICAgICAgICAgWG1sU2NoZW1hQ29tcGxleFR5cGUgeG1sU2NoZW1hQ29tcGxleFR5cGUgPSBudWxsOwotICAgICAgICAgICAgICAgIGlmICh4bWxTY2hlbWEuZ2V0VHlwZUJ5TmFtZShjb21wbGV4VHlwZU5hbWUpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgeG1sU2NoZW1hQ29tcGxleFR5cGUgPSBuZXcgWG1sU2NoZW1hQ29tcGxleFR5cGUoeG1sU2NoZW1hKTsKLSAgICAgICAgICAgICAgICAgICAgWG1sU2NoZW1hU2VxdWVuY2UgeG1sU2NoZW1hU2VxdWVuY2UgPSBuZXcgWG1sU2NoZW1hU2VxdWVuY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sU2NoZW1hQ29tcGxleFR5cGUuc2V0UGFydGljbGUoeG1sU2NoZW1hU2VxdWVuY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxTY2hlbWFDb21wbGV4VHlwZS5zZXROYW1lKGNvbXBsZXhUeXBlTmFtZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgeG1sU2NoZW1hLmdldEl0ZW1zKCkuYWRkKHhtbFNjaGVtYUNvbXBsZXhUeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sU2NoZW1hLmdldFNjaGVtYVR5cGVzKCkuYWRkKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBRTmFtZShzY2hlbWFUYXJnZXROYW1lU3BhY2UsIHhtbFNjaGVtYUNvbXBsZXhUeXBlLmdldE5hbWUoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sU2NoZW1hQ29tcGxleFR5cGUpOwotICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50VG9TZXF1ZW5jZSgiYXJyYXkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVUYWJsZS5nZXRTaW1wbGVTY2hlbWFUeXBlTmFtZShwcm9wZXJ0eU5hbWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFNjaGVtYVNlcXVlbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5TmFtZS5lcXVhbHMoImJhc2U2NEJpbmFyeSIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQXJyYXlUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUuaXNQcmltaXRpdmUoKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgeG1sU2NoZW1hQ29tcGxleFR5cGUgPSAoWG1sU2NoZW1hQ29tcGxleFR5cGUpIHhtbFNjaGVtYS5nZXRUeXBlQnlOYW1lKGNvbXBsZXhUeXBlTmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgeG1sU2NoZW1hRWxlbWVudC5zZXRTY2hlbWFUeXBlKHhtbFNjaGVtYUNvbXBsZXhUeXBlKTsKLSAgICAgICAgICAgICAgICB4bWxTY2hlbWFFbGVtZW50LnNldFNjaGVtYVR5cGVOYW1lKG5ldyBRTmFtZShzY2hlbWFUYXJnZXROYW1lU3BhY2UsIHhtbFNjaGVtYUNvbXBsZXhUeXBlLmdldE5hbWUoKSkpOwotCi0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYWRkRWxlbWVudFRvU2VxdWVuY2UobmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVUYWJsZS5nZXRDb21wbGV4U2NoZW1hVHlwZShwcm9wZXJ0eU5hbWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGlzQXJyYXlUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZS5pc1ByaW1pdGl2ZSgpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHR5cGVUYWJsZS5nZXRDb21wbGV4U2NoZW1hVHlwZShwcm9wZXJ0eU5hbWUpICE9IG51bGwgJiYgISgoTmFtZXNwYWNlTWFwKSB4bWxTY2hlbWEuZ2V0TmFtZXNwYWNlQ29udGV4dCgpKS52YWx1ZXMoKS4KLSAgICAgICAgICAgICAgICAgICAgY29udGFpbnModHlwZVRhYmxlLmdldENvbXBsZXhTY2hlbWFUeXBlKHByb3BlcnR5TmFtZSkuZ2V0TmFtZXNwYWNlVVJJKCkpKSB7Ci0gICAgICAgICAgICAgICAgWG1sU2NoZW1hSW1wb3J0IGltcG9ydEVsZW1lbnQgPSBuZXcgWG1sU2NoZW1hSW1wb3J0KCk7Ci0gICAgICAgICAgICAgICAgaW1wb3J0RWxlbWVudC5zZXROYW1lc3BhY2UoCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlVGFibGUuZ2V0Q29tcGxleFNjaGVtYVR5cGUocHJvcGVydHlOYW1lKS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgICAgICAgICAgeG1sU2NoZW1hLmdldEl0ZW1zKCkuYWRkKGltcG9ydEVsZW1lbnQpOwotICAgICAgICAgICAgICAgICgoTmFtZXNwYWNlTWFwKSB4bWxTY2hlbWEuZ2V0TmFtZXNwYWNlQ29udGV4dCgpKS4KLSAgICAgICAgICAgICAgICAgICAgICAgIHB1dChnZW5lcmF0ZVByZWZpeCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlVGFibGUuZ2V0Q29tcGxleFNjaGVtYVR5cGUocHJvcGVydHlOYW1lKS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotCi0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZEVsZW1lbnRUb1NlcXVlbmNlKFN0cmluZyBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRTmFtZSBwcm9wZXJ0eVFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYbWxTY2hlbWFTZXF1ZW5jZSBzZXF1ZW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0Jhc2U2NEJpbmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0FycnlUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzUHJpbWl0aXZlKSB7Ci0gICAgICAgIFhtbFNjaGVtYUVsZW1lbnQgZWx0MSA9IG5ldyBYbWxTY2hlbWFFbGVtZW50KCk7Ci0gICAgICAgIGVsdDEuc2V0TmFtZShuYW1lKTsKLSAgICAgICAgZWx0MS5zZXRTY2hlbWFUeXBlTmFtZShwcm9wZXJ0eVFOYW1lKTsKLSAgICAgICAgc2VxdWVuY2UuZ2V0SXRlbXMoKS5hZGQoZWx0MSk7Ci0gICAgICAgIGlmIChpc0FycnlUeXBlICYmICFpc0Jhc2U2NEJpbmFyeSkgewotICAgICAgICAgICAgZWx0MS5zZXRNYXhPY2N1cnMoTG9uZy5NQVhfVkFMVUUpOwotICAgICAgICB9Ci0gICAgICAgIGVsdDEuc2V0TWluT2NjdXJzKDApOwotICAgICAgICBpZiAoIWlzUHJpbWl0aXZlKSB7Ci0gICAgICAgICAgICBlbHQxLnNldE5pbGxhYmxlKHRydWUpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICBwcml2YXRlIFFOYW1lIGdlbmVyYXRlU2NoZW1hRm9yVHlwZShYbWxTY2hlbWFTZXF1ZW5jZSBzZXF1ZW5jZSwgQ2xhc3MgdHlwZSwgU3RyaW5nIHBhcnROYW1lKQotICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgYm9vbGVhbiBpc0FycmF5VHlwZSA9IGZhbHNlOwotICAgICAgICBpZiAodHlwZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpc0FycmF5VHlwZSA9IHR5cGUuaXNBcnJheSgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpc0FycmF5VHlwZSkgewotICAgICAgICAgICAgaWYgKHR5cGUuZ2V0Q29tcG9uZW50VHlwZSgpLmlzQXJyYXkoKSkgewotICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgYSBkb2JsZSBhcnJheSBlbGVtZW50Ci0gICAgICAgICAgICAgICAgQ2xhc3Mgc2ltcGxlVHlwZSA9IHR5cGUuZ2V0Q29tcG9uZW50VHlwZSgpOwotICAgICAgICAgICAgICAgIFN0cmluZyBzaW1wbGVUeXBlTmFtZSA9ICIiOwotICAgICAgICAgICAgICAgIHdoaWxlIChzaW1wbGVUeXBlLmlzQXJyYXkoKSkgewotICAgICAgICAgICAgICAgICAgICBzaW1wbGVUeXBlTmFtZSArPSAiQXJyYXlPZiI7Ci0gICAgICAgICAgICAgICAgICAgIHNpbXBsZVR5cGUgPSBzaW1wbGVUeXBlLmdldENvbXBvbmVudFR5cGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2ltcGxlVHlwZU5hbWUgKz0gc2ltcGxlVHlwZS5nZXRTaW1wbGVOYW1lKCk7Ci0KLSAgICAgICAgICAgICAgICBYbWxTY2hlbWEgeG1sU2NoZW1hID0gZ2V0WG1sU2NoZW1hKHNjaGVtYVRhcmdldE5hbWVTcGFjZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHhtbFNjaGVtYS5nZXRUeXBlQnlOYW1lKHNpbXBsZVR5cGVOYW1lKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIFhtbFNjaGVtYUNvbXBsZXhUeXBlIHhtbFNjaGVtYUNvbXBsZXhUeXBlID0gbmV3IFhtbFNjaGVtYUNvbXBsZXhUeXBlKHhtbFNjaGVtYSk7Ci0gICAgICAgICAgICAgICAgICAgIFhtbFNjaGVtYVNlcXVlbmNlIHhtbFNjaGVtYVNlcXVlbmNlID0gbmV3IFhtbFNjaGVtYVNlcXVlbmNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFNjaGVtYUNvbXBsZXhUeXBlLnNldFBhcnRpY2xlKHhtbFNjaGVtYVNlcXVlbmNlKTsKLSAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVTY2hlbWFGb3JUeXBlKHhtbFNjaGVtYVNlcXVlbmNlLCB0eXBlLmdldENvbXBvbmVudFR5cGUoKSwgImFycmF5Iik7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFNjaGVtYUNvbXBsZXhUeXBlLnNldE5hbWUoc2ltcGxlVHlwZU5hbWUpOwotICAgICAgICAgICAgICAgICAgICB4bWxTY2hlbWEuZ2V0SXRlbXMoKS5hZGQoeG1sU2NoZW1hQ29tcGxleFR5cGUpOwotICAgICAgICAgICAgICAgICAgICB4bWxTY2hlbWEuZ2V0U2NoZW1hVHlwZXMoKS5hZGQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFFOYW1lKHhtbFNjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2UoKSwgc2ltcGxlVHlwZU5hbWUpLCB4bWxTY2hlbWFDb21wbGV4VHlwZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGlzR2VuZXJhdGVXcmFwcGVkQXJyYXlUeXBlcykgewotICAgICAgICAgICAgICAgICAgICBYbWxTY2hlbWFFbGVtZW50IHhtbFNjaGVtYUVsZW1lbnQgPSBuZXcgWG1sU2NoZW1hRWxlbWVudCgpOwotICAgICAgICAgICAgICAgICAgICB4bWxTY2hlbWFFbGVtZW50LnNldE5hbWUocGFydE5hbWUgKyAiV3JhcHBlciIpOwotICAgICAgICAgICAgICAgICAgICB4bWxTY2hlbWFFbGVtZW50LnNldE5pbGxhYmxlKHRydWUpOwotICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZS5nZXRJdGVtcygpLmFkZCh4bWxTY2hlbWFFbGVtZW50KTsKLQotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY29tcGxleFR5cGVOYW1lID0gc2ltcGxlVHlwZU5hbWUgKyAiV3JhcHBlciI7Ci0KLSAgICAgICAgICAgICAgICAgICAgWG1sU2NoZW1hQ29tcGxleFR5cGUgeG1sU2NoZW1hQ29tcGxleFR5cGUgPSBuZXcgWG1sU2NoZW1hQ29tcGxleFR5cGUoeG1sU2NoZW1hKTsKLSAgICAgICAgICAgICAgICAgICAgWG1sU2NoZW1hU2VxdWVuY2UgeG1sU2NoZW1hU2VxdWVuY2UgPSBuZXcgWG1sU2NoZW1hU2VxdWVuY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sU2NoZW1hQ29tcGxleFR5cGUuc2V0UGFydGljbGUoeG1sU2NoZW1hU2VxdWVuY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxTY2hlbWFDb21wbGV4VHlwZS5zZXROYW1lKGNvbXBsZXhUeXBlTmFtZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgeG1sU2NoZW1hLmdldEl0ZW1zKCkuYWRkKHhtbFNjaGVtYUNvbXBsZXhUeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sU2NoZW1hLmdldFNjaGVtYVR5cGVzKCkuYWRkKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBRTmFtZShzY2hlbWFUYXJnZXROYW1lU3BhY2UsIHhtbFNjaGVtYUNvbXBsZXhUeXBlLmdldE5hbWUoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sU2NoZW1hQ29tcGxleFR5cGUpOwotICAgICAgICAgICAgICAgICAgICBhZGRDb250ZW50VG9NZXRob2RTY2hlbWFUeXBlKHhtbFNjaGVtYVNlcXVlbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBRTmFtZSh4bWxTY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCksIHNpbXBsZVR5cGVOYW1lKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXJyYXkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOwotCi0gICAgICAgICAgICAgICAgICAgIHhtbFNjaGVtYUVsZW1lbnQuc2V0U2NoZW1hVHlwZSh4bWxTY2hlbWFDb21wbGV4VHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFNjaGVtYUVsZW1lbnQuc2V0U2NoZW1hVHlwZU5hbWUobmV3IFFOYW1lKHNjaGVtYVRhcmdldE5hbWVTcGFjZSwgeG1sU2NoZW1hQ29tcGxleFR5cGUuZ2V0TmFtZSgpKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUU5hbWUoeG1sU2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpLCBjb21wbGV4VHlwZU5hbWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZENvbnRlbnRUb01ldGhvZFNjaGVtYVR5cGUoc2VxdWVuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFFOYW1lKHhtbFNjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2UoKSwgc2ltcGxlVHlwZU5hbWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFFOYW1lKHhtbFNjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2UoKSwgc2ltcGxlVHlwZU5hbWUpOwotICAgICAgICAgICAgICAgIH0KLQotCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHR5cGUgPSB0eXBlLmdldENvbXBvbmVudFR5cGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoQXhpc0ZhdWx0LmNsYXNzLmdldE5hbWUoKS5lcXVhbHModHlwZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZyBjbGFzc1R5cGVOYW1lOwotICAgICAgICBpZiAodHlwZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBjbGFzc1R5cGVOYW1lID0gImphdmEubGFuZy5PYmplY3QiOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY2xhc3NUeXBlTmFtZSA9IHR5cGUuZ2V0TmFtZSgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpc0FycmF5VHlwZSAmJiAiYnl0ZSIuZXF1YWxzKGNsYXNzVHlwZU5hbWUpKSB7Ci0gICAgICAgICAgICBjbGFzc1R5cGVOYW1lID0gImJhc2U2NEJpbmFyeSI7Ci0gICAgICAgICAgICBpc0FycmF5VHlwZSA9IGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGlzRGF0YUhhbmRsZXIodHlwZSkpIHsKLSAgICAgICAgICAgIGNsYXNzVHlwZU5hbWUgPSAiYmFzZTY0QmluYXJ5IjsKLSAgICAgICAgfQotICAgICAgICBRTmFtZSBzY2hlbWFUeXBlTmFtZSA9IHR5cGVUYWJsZS5nZXRTaW1wbGVTY2hlbWFUeXBlTmFtZShjbGFzc1R5cGVOYW1lKTsKLSAgICAgICAgaWYgKHNjaGVtYVR5cGVOYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIHNjaGVtYVR5cGVOYW1lID0gZ2VuZXJhdGVTY2hlbWEodHlwZSk7Ci0gICAgICAgICAgICBpZiAoaXNHZW5lcmF0ZVdyYXBwZWRBcnJheVR5cGVzICYmIGlzQXJyYXlUeXBlKSB7Ci0KLSAgICAgICAgICAgICAgICBYbWxTY2hlbWFFbGVtZW50IHhtbFNjaGVtYUVsZW1lbnQgPSBuZXcgWG1sU2NoZW1hRWxlbWVudCgpOwotICAgICAgICAgICAgICAgIHhtbFNjaGVtYUVsZW1lbnQuc2V0TmFtZShwYXJ0TmFtZSArICJXcmFwcGVyIik7Ci0gICAgICAgICAgICAgICAgeG1sU2NoZW1hRWxlbWVudC5zZXROaWxsYWJsZSh0cnVlKTsKLSAgICAgICAgICAgICAgICBzZXF1ZW5jZS5nZXRJdGVtcygpLmFkZCh4bWxTY2hlbWFFbGVtZW50KTsKLQotICAgICAgICAgICAgICAgIFN0cmluZyBjb21wbGV4VHlwZU5hbWUgPSBzY2hlbWFUeXBlTmFtZS5nZXRMb2NhbFBhcnQoKSArICJXcmFwcGVyIjsKLSAgICAgICAgICAgICAgICBYbWxTY2hlbWEgeG1sU2NoZW1hID0gZ2V0WG1sU2NoZW1hKHNjaGVtYVRhcmdldE5hbWVTcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICBYbWxTY2hlbWFDb21wbGV4VHlwZSB4bWxTY2hlbWFDb21wbGV4VHlwZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgaWYgKHhtbFNjaGVtYS5nZXRUeXBlQnlOYW1lKGNvbXBsZXhUeXBlTmFtZSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB4bWxTY2hlbWFDb21wbGV4VHlwZSA9IG5ldyBYbWxTY2hlbWFDb21wbGV4VHlwZSh4bWxTY2hlbWEpOwotICAgICAgICAgICAgICAgICAgICBYbWxTY2hlbWFTZXF1ZW5jZSB4bWxTY2hlbWFTZXF1ZW5jZSA9IG5ldyBYbWxTY2hlbWFTZXF1ZW5jZSgpOwotICAgICAgICAgICAgICAgICAgICB4bWxTY2hlbWFDb21wbGV4VHlwZS5zZXRQYXJ0aWNsZSh4bWxTY2hlbWFTZXF1ZW5jZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFNjaGVtYUNvbXBsZXhUeXBlLnNldE5hbWUoY29tcGxleFR5cGVOYW1lKTsKLQotICAgICAgICAgICAgICAgICAgICB4bWxTY2hlbWEuZ2V0SXRlbXMoKS5hZGQoeG1sU2NoZW1hQ29tcGxleFR5cGUpOwotICAgICAgICAgICAgICAgICAgICB4bWxTY2hlbWEuZ2V0U2NoZW1hVHlwZXMoKS5hZGQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFFOYW1lKHNjaGVtYVRhcmdldE5hbWVTcGFjZSwgeG1sU2NoZW1hQ29tcGxleFR5cGUuZ2V0TmFtZSgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxTY2hlbWFDb21wbGV4VHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgIGFkZENvbnRlbnRUb01ldGhvZFNjaGVtYVR5cGUoeG1sU2NoZW1hU2VxdWVuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWFUeXBlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICJhcnJheSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBpc0FycmF5VHlwZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICB4bWxTY2hlbWFDb21wbGV4VHlwZSA9IChYbWxTY2hlbWFDb21wbGV4VHlwZSkgeG1sU2NoZW1hLmdldFR5cGVCeU5hbWUoY29tcGxleFR5cGVOYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB4bWxTY2hlbWFFbGVtZW50LnNldFNjaGVtYVR5cGUoeG1sU2NoZW1hQ29tcGxleFR5cGUpOwotICAgICAgICAgICAgICAgIHhtbFNjaGVtYUVsZW1lbnQuc2V0U2NoZW1hVHlwZU5hbWUobmV3IFFOYW1lKHNjaGVtYVRhcmdldE5hbWVTcGFjZSwgeG1sU2NoZW1hQ29tcGxleFR5cGUuZ2V0TmFtZSgpKSk7Ci0KLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBhZGRDb250ZW50VG9NZXRob2RTY2hlbWFUeXBlKHNlcXVlbmNlLAotICAgICAgICAgICAgICAgICAgICBzY2hlbWFUeXBlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgcGFydE5hbWUsCi0gICAgICAgICAgICAgICAgICAgIGlzQXJyYXlUeXBlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3RyaW5nIHNjaGVtYU5hbWVzcGFjZTsKLSAgICAgICAgICAgIHNjaGVtYU5hbWVzcGFjZSA9IHJlc29sdmVTY2hlbWFOYW1lc3BhY2UoZ2V0UXVhbGlmaWVkTmFtZSh0eXBlLmdldFBhY2thZ2UoKSkpOwotICAgICAgICAgICAgYWRkSW1wb3J0KGdldFhtbFNjaGVtYShzY2hlbWFOYW1lc3BhY2UpLCBzY2hlbWFUeXBlTmFtZSk7Ci0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChpc0dlbmVyYXRlV3JhcHBlZEFycmF5VHlwZXMgJiYgaXNBcnJheVR5cGUpIHsKLQotICAgICAgICAgICAgICAgIFhtbFNjaGVtYUVsZW1lbnQgeG1sU2NoZW1hRWxlbWVudCA9IG5ldyBYbWxTY2hlbWFFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgeG1sU2NoZW1hRWxlbWVudC5zZXROYW1lKHBhcnROYW1lICsiV3JhcHBlciIpOwotICAgICAgICAgICAgICAgIHhtbFNjaGVtYUVsZW1lbnQuc2V0TmlsbGFibGUodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgc2VxdWVuY2UuZ2V0SXRlbXMoKS5hZGQoeG1sU2NoZW1hRWxlbWVudCk7Ci0KLSAgICAgICAgICAgICAgICBTdHJpbmcgY29tcGxleFR5cGVOYW1lID0gc2NoZW1hVHlwZU5hbWUuZ2V0TG9jYWxQYXJ0KCkgKyAiV3JhcHBlciI7Ci0gICAgICAgICAgICAgICAgWG1sU2NoZW1hIHhtbFNjaGVtYSA9IGdldFhtbFNjaGVtYShzY2hlbWFUYXJnZXROYW1lU3BhY2UpOwotCi0gICAgICAgICAgICAgICAgWG1sU2NoZW1hQ29tcGxleFR5cGUgeG1sU2NoZW1hQ29tcGxleFR5cGUgPSBudWxsOwotICAgICAgICAgICAgICAgIGlmICh4bWxTY2hlbWEuZ2V0VHlwZUJ5TmFtZShjb21wbGV4VHlwZU5hbWUpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgeG1sU2NoZW1hQ29tcGxleFR5cGUgPSBuZXcgWG1sU2NoZW1hQ29tcGxleFR5cGUoeG1sU2NoZW1hKTsKLSAgICAgICAgICAgICAgICAgICAgWG1sU2NoZW1hU2VxdWVuY2UgeG1sU2NoZW1hU2VxdWVuY2UgPSBuZXcgWG1sU2NoZW1hU2VxdWVuY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sU2NoZW1hQ29tcGxleFR5cGUuc2V0UGFydGljbGUoeG1sU2NoZW1hU2VxdWVuY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxTY2hlbWFDb21wbGV4VHlwZS5zZXROYW1lKGNvbXBsZXhUeXBlTmFtZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgeG1sU2NoZW1hLmdldEl0ZW1zKCkuYWRkKHhtbFNjaGVtYUNvbXBsZXhUeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sU2NoZW1hLmdldFNjaGVtYVR5cGVzKCkuYWRkKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBRTmFtZShzY2hlbWFUYXJnZXROYW1lU3BhY2UsIHhtbFNjaGVtYUNvbXBsZXhUeXBlLmdldE5hbWUoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sU2NoZW1hQ29tcGxleFR5cGUpOwotICAgICAgICAgICAgICAgICAgICBhZGRDb250ZW50VG9NZXRob2RTY2hlbWFUeXBlKHhtbFNjaGVtYVNlcXVlbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hVHlwZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAiYXJyYXkiLAotICAgICAgICAgICAgICAgICAgICAgICAgaXNBcnJheVR5cGUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgeG1sU2NoZW1hQ29tcGxleFR5cGUgPSAoWG1sU2NoZW1hQ29tcGxleFR5cGUpIHhtbFNjaGVtYS5nZXRUeXBlQnlOYW1lKGNvbXBsZXhUeXBlTmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgeG1sU2NoZW1hRWxlbWVudC5zZXRTY2hlbWFUeXBlKHhtbFNjaGVtYUNvbXBsZXhUeXBlKTsKLSAgICAgICAgICAgICAgICB4bWxTY2hlbWFFbGVtZW50LnNldFNjaGVtYVR5cGVOYW1lKG5ldyBRTmFtZShzY2hlbWFUYXJnZXROYW1lU3BhY2UsIHhtbFNjaGVtYUNvbXBsZXhUeXBlLmdldE5hbWUoKSkpOwotCi0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYWRkQ29udGVudFRvTWV0aG9kU2NoZW1hVHlwZShzZXF1ZW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYVR5cGVOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgcGFydE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBpc0FycmF5VHlwZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgICBhZGRJbXBvcnQoZ2V0WG1sU2NoZW1hKHNjaGVtYVRhcmdldE5hbWVTcGFjZSksIHNjaGVtYVR5cGVOYW1lKTsKLSAgICAgICAgcmV0dXJuIHNjaGVtYVR5cGVOYW1lOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIGlzRGF0YUhhbmRsZXIoQ2xhc3MgY2xhenopIHsKLSAgICAgICAgcmV0dXJuIGNsYXp6ICE9IG51bGwgJiYgRGF0YUhhbmRsZXIuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShjbGF6eik7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkQ29udGVudFRvTWV0aG9kU2NoZW1hVHlwZShYbWxTY2hlbWFTZXF1ZW5jZSBzZXF1ZW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFOYW1lIHNjaGVtYVR5cGVOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhcmFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0FycmF5KSB7Ci0gICAgICAgIFhtbFNjaGVtYUVsZW1lbnQgZWx0MSA9IG5ldyBYbWxTY2hlbWFFbGVtZW50KCk7Ci0gICAgICAgIGVsdDEuc2V0TmFtZShwYXJhTmFtZSk7Ci0KLSAgICAgICAgZWx0MS5zZXRTY2hlbWFUeXBlTmFtZShzY2hlbWFUeXBlTmFtZSk7Ci0gICAgICAgIGlmIChzZXF1ZW5jZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzZXF1ZW5jZS5nZXRJdGVtcygpLmFkZChlbHQxKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpc0FycmF5KSB7Ci0gICAgICAgICAgICBlbHQxLnNldE1heE9jY3VycyhMb25nLk1BWF9WQUxVRSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWx0MS5zZXRNaW5PY2N1cnMoMCk7Ci0gICAgICAgIGlmICghKCJpbnQiLmVxdWFscyhzY2hlbWFUeXBlTmFtZS5nZXRMb2NhbFBhcnQoKSkgfHwKLSAgICAgICAgICAgICAgICAiZG91YmxlIi5lcXVhbHMoc2NoZW1hVHlwZU5hbWUuZ2V0TG9jYWxQYXJ0KCkpIHx8Ci0gICAgICAgICAgICAgICAgImxvbmciLmVxdWFscyhzY2hlbWFUeXBlTmFtZS5nZXRMb2NhbFBhcnQoKSkgfHwKLSAgICAgICAgICAgICAgICAiYm9vbGVhbiIuZXF1YWxzKHNjaGVtYVR5cGVOYW1lLmdldExvY2FsUGFydCgpKSB8fAotICAgICAgICAgICAgICAgICJzaG9ydCIuZXF1YWxzKHNjaGVtYVR5cGVOYW1lLmdldExvY2FsUGFydCgpKSB8fAotICAgICAgICAgICAgICAgICJmbG9hdCIuZXF1YWxzKHNjaGVtYVR5cGVOYW1lLmdldExvY2FsUGFydCgpKSkpIHsKLSAgICAgICAgICAgIGVsdDEuc2V0TmlsbGFibGUodHJ1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFhtbFNjaGVtYUNvbXBsZXhUeXBlIGNyZWF0ZVNjaGVtYVR5cGVGb3JNZXRob2RQYXJ0KFN0cmluZyBsb2NhbFBhcnROYW1lKSB7Ci0gICAgICAgIFhtbFNjaGVtYSB4bWxTY2hlbWEgPSBnZXRYbWxTY2hlbWEoc2NoZW1hVGFyZ2V0TmFtZVNwYWNlKTsKLSAgICAgICAgUU5hbWUgZWxlbWVudE5hbWUgPQotICAgICAgICAgICAgICAgIG5ldyBRTmFtZSh0aGlzLnNjaGVtYVRhcmdldE5hbWVTcGFjZSwgbG9jYWxQYXJ0TmFtZSwgdGhpcy5zY2hlbWFfbmFtZXNwYWNlX3ByZWZpeCk7Ci0KLSAgICAgICAgWG1sU2NoZW1hQ29tcGxleFR5cGUgY29tcGxleFR5cGUgPSBnZXRDb21wbGV4VHlwZUZvckVsZW1lbnQoeG1sU2NoZW1hLCBlbGVtZW50TmFtZSk7Ci0gICAgICAgIGlmIChjb21wbGV4VHlwZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBjb21wbGV4VHlwZSA9IG5ldyBYbWxTY2hlbWFDb21wbGV4VHlwZSh4bWxTY2hlbWEpOwotCi0gICAgICAgICAgICBYbWxTY2hlbWFFbGVtZW50IGdsb2JhbEVsZW1lbnQgPSBuZXcgWG1sU2NoZW1hRWxlbWVudCgpOwotICAgICAgICAgICAgZ2xvYmFsRWxlbWVudC5zZXRTY2hlbWFUeXBlKGNvbXBsZXhUeXBlKTsKLSAgICAgICAgICAgIGdsb2JhbEVsZW1lbnQuc2V0TmFtZShsb2NhbFBhcnROYW1lKTsKLSAgICAgICAgICAgIGdsb2JhbEVsZW1lbnQuc2V0UU5hbWUoZWxlbWVudE5hbWUpOwotICAgICAgICAgICAgeG1sU2NoZW1hLmdldEl0ZW1zKCkuYWRkKGdsb2JhbEVsZW1lbnQpOwotICAgICAgICAgICAgeG1sU2NoZW1hLmdldEVsZW1lbnRzKCkuYWRkKGVsZW1lbnROYW1lLCBnbG9iYWxFbGVtZW50KTsKLSAgICAgICAgfQotICAgICAgICB0eXBlVGFibGUuYWRkQ29tcGxleFNjaGVtYShsb2NhbFBhcnROYW1lLCBlbGVtZW50TmFtZSk7Ci0KLSAgICAgICAgcmV0dXJuIGNvbXBsZXhUeXBlOwotICAgIH0KLQotICAgIHByaXZhdGUgWG1sU2NoZW1hQ29tcGxleFR5cGUgY3JlYXRlU2NoZW1hVHlwZUZvckZhdWx0KFN0cmluZyBsb2NhbFBhcnROYW1lKSB7Ci0gICAgICAgIFhtbFNjaGVtYSB4bWxTY2hlbWEgPSBnZXRYbWxTY2hlbWEoc2NoZW1hVGFyZ2V0TmFtZVNwYWNlKTsKLSAgICAgICAgUU5hbWUgZWxlbWVudE5hbWUgPQotICAgICAgICAgICAgICAgIG5ldyBRTmFtZSh0aGlzLnNjaGVtYVRhcmdldE5hbWVTcGFjZSwgbG9jYWxQYXJ0TmFtZSwgdGhpcy5zY2hlbWFfbmFtZXNwYWNlX3ByZWZpeCk7Ci0KLSAgICAgICAgWG1sU2NoZW1hQ29tcGxleFR5cGUgY29tcGxleFR5cGUgPSBnZXRDb21wbGV4VHlwZUZvckVsZW1lbnQoeG1sU2NoZW1hLCBlbGVtZW50TmFtZSk7Ci0gICAgICAgIGlmIChjb21wbGV4VHlwZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBjb21wbGV4VHlwZSA9IG5ldyBYbWxTY2hlbWFDb21wbGV4VHlwZSh4bWxTY2hlbWEpOwotCi0gICAgICAgICAgICBYbWxTY2hlbWFFbGVtZW50IGdsb2JhbEVsZW1lbnQgPSBuZXcgWG1sU2NoZW1hRWxlbWVudCgpOwotICAgICAgICAgICAgZ2xvYmFsRWxlbWVudC5zZXRTY2hlbWFUeXBlKGNvbXBsZXhUeXBlKTsKLSAgICAgICAgICAgIGdsb2JhbEVsZW1lbnQuc2V0TmFtZShsb2NhbFBhcnROYW1lKTsKLSAgICAgICAgICAgIGdsb2JhbEVsZW1lbnQuc2V0UU5hbWUoZWxlbWVudE5hbWUpOwotICAgICAgICAgICAgeG1sU2NoZW1hLmdldEl0ZW1zKCkuYWRkKGdsb2JhbEVsZW1lbnQpOwotICAgICAgICAgICAgeG1sU2NoZW1hLmdldEVsZW1lbnRzKCkuYWRkKGVsZW1lbnROYW1lLCBnbG9iYWxFbGVtZW50KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY29tcGxleFR5cGU7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFhtbFNjaGVtYUNvbXBsZXhUeXBlIGdldENvbXBsZXhUeXBlRm9yRWxlbWVudChYbWxTY2hlbWEgeG1sU2NoZW1hLCBRTmFtZSBuYW1lKSB7Ci0gICAgICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0geG1sU2NoZW1hLmdldEl0ZW1zKCkuZ2V0SXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgWG1sU2NoZW1hT2JqZWN0IG9iamVjdCA9IChYbWxTY2hlbWFPYmplY3QpIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBYbWxTY2hlbWFFbGVtZW50ICYmICgoWG1sU2NoZW1hRWxlbWVudCkgb2JqZWN0KS5nZXRRTmFtZSgpLmVxdWFscyhuYW1lKSkgewotICAgICAgICAgICAgICAgIHJldHVybiAoWG1sU2NoZW1hQ29tcGxleFR5cGUpICgoWG1sU2NoZW1hRWxlbWVudCkgb2JqZWN0KS5nZXRTY2hlbWFUeXBlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFhtbFNjaGVtYSBnZXRYbWxTY2hlbWEoU3RyaW5nIHRhcmdldE5hbWVzcGFjZSkgewotICAgICAgICBYbWxTY2hlbWEgeG1sU2NoZW1hOwotCi0gICAgICAgIGlmICgoeG1sU2NoZW1hID0gKFhtbFNjaGVtYSkgc2NoZW1hTWFwLmdldCh0YXJnZXROYW1lc3BhY2UpKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlUHJlZml4OwotCi0gICAgICAgICAgICBpZiAodGFyZ2V0TmFtZXNwYWNlLmVxdWFscyhzY2hlbWFUYXJnZXROYW1lU3BhY2UpICYmCi0gICAgICAgICAgICAgICAgICAgIHNjaGVtYV9uYW1lc3BhY2VfcHJlZml4ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0YXJnZXROYW1lc3BhY2VQcmVmaXggPSBzY2hlbWFfbmFtZXNwYWNlX3ByZWZpeDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlUHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgoKTsKLSAgICAgICAgICAgIH0KLQotCi0gICAgICAgICAgICB4bWxTY2hlbWEgPSBuZXcgWG1sU2NoZW1hKHRhcmdldE5hbWVzcGFjZSwgeG1sU2NoZW1hQ29sbGVjdGlvbik7Ci0gICAgICAgICAgICB4bWxTY2hlbWEuc2V0QXR0cmlidXRlRm9ybURlZmF1bHQoZ2V0QXR0ckZvcm1EZWZhdWx0U2V0dGluZygpKTsKLSAgICAgICAgICAgIHhtbFNjaGVtYS5zZXRFbGVtZW50Rm9ybURlZmF1bHQoZ2V0RWxlbWVudEZvcm1EZWZhdWx0U2V0dGluZygpKTsKLQotCi0gICAgICAgICAgICB0YXJnZXROYW1lc3BhY2VQcmVmaXhNYXAucHV0KHRhcmdldE5hbWVzcGFjZSwgdGFyZ2V0TmFtZXNwYWNlUHJlZml4KTsKLSAgICAgICAgICAgIHNjaGVtYU1hcC5wdXQodGFyZ2V0TmFtZXNwYWNlLCB4bWxTY2hlbWEpOwotCi0gICAgICAgICAgICBOYW1lc3BhY2VNYXAgcHJlZml4bWFwID0gbmV3IE5hbWVzcGFjZU1hcCgpOwotICAgICAgICAgICAgcHJlZml4bWFwLnB1dChERUZBVUxUX1NDSEVNQV9OQU1FU1BBQ0VfUFJFRklYLCBVUklfMjAwMV9TQ0hFTUFfWFNEKTsKLSAgICAgICAgICAgIHByZWZpeG1hcC5wdXQodGFyZ2V0TmFtZXNwYWNlUHJlZml4LCB0YXJnZXROYW1lc3BhY2UpOwotICAgICAgICAgICAgeG1sU2NoZW1hLnNldE5hbWVzcGFjZUNvbnRleHQocHJlZml4bWFwKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4geG1sU2NoZW1hOwotICAgIH0KLQotCi0gICAgcHVibGljIFR5cGVUYWJsZSBnZXRUeXBlVGFibGUoKSB7Ci0gICAgICAgIHJldHVybiB0eXBlVGFibGU7Ci0gICAgfQotCi0gICAgcHVibGljIE1ldGhvZFtdIGdldE1ldGhvZHMoKSB7Ci0gICAgICAgIHJldHVybiBtZXRob2RzOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2VuZXJhdGVQcmVmaXgoKSB7Ci0gICAgICAgIHJldHVybiBOQU1FX1NQQUNFX1BSRUZJWCArIHByZWZpeENvdW50Kys7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RXhjbHVkZU1ldGhvZHMoQXJyYXlMaXN0IGV4Y2x1ZGVNZXRob2RzKSB7Ci0gICAgICAgIGlmIChleGNsdWRlTWV0aG9kcyA9PSBudWxsKSBleGNsdWRlTWV0aG9kcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgdGhpcy5leGNsdWRlTWV0aG9kcyA9IGV4Y2x1ZGVNZXRob2RzOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2NoZW1hVGFyZ2V0TmFtZVNwYWNlKCkgewotICAgICAgICByZXR1cm4gc2NoZW1hVGFyZ2V0TmFtZVNwYWNlOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFkZEltcG9ydChYbWxTY2hlbWEgeG1sU2NoZW1hLCBRTmFtZSBzY2hlbWFUeXBlTmFtZSkgewotICAgICAgICBOYW1lc3BhY2VQcmVmaXhMaXN0IG1hcCA9IHhtbFNjaGVtYS5nZXROYW1lc3BhY2VDb250ZXh0KCk7Ci0gICAgICAgIGlmIChtYXAgPT0gbnVsbCB8fAotICAgICAgICAgICAgICAgICgobWFwIGluc3RhbmNlb2YgTmFtZXNwYWNlTWFwKSAmJiAoKE5hbWVzcGFjZU1hcCkgbWFwKS52YWx1ZXMoKSA9PSBudWxsKSB8fAotICAgICAgICAgICAgICAgIHNjaGVtYVR5cGVOYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAobWFwIGluc3RhbmNlb2YgTmFtZXNwYWNlTWFwICYmICEoKE5hbWVzcGFjZU1hcCkgbWFwKS52YWx1ZXMoKS4KLSAgICAgICAgICAgICAgICBjb250YWlucyhzY2hlbWFUeXBlTmFtZS5nZXROYW1lc3BhY2VVUkkoKSkpIHsKLSAgICAgICAgICAgIFhtbFNjaGVtYUltcG9ydCBpbXBvcnRFbGVtZW50ID0gbmV3IFhtbFNjaGVtYUltcG9ydCgpOwotICAgICAgICAgICAgaW1wb3J0RWxlbWVudC5zZXROYW1lc3BhY2Uoc2NoZW1hVHlwZU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgICAgICAgICAgeG1sU2NoZW1hLmdldEl0ZW1zKCkuYWRkKGltcG9ydEVsZW1lbnQpOwotICAgICAgICAgICAgKChOYW1lc3BhY2VNYXApIHhtbFNjaGVtYS5nZXROYW1lc3BhY2VDb250ZXh0KCkpLgotICAgICAgICAgICAgICAgICAgICBwdXQoZ2VuZXJhdGVQcmVmaXgoKSwgc2NoZW1hVHlwZU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBdHRyRm9ybURlZmF1bHQoKSB7Ci0gICAgICAgIHJldHVybiBhdHRyRm9ybURlZmF1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QXR0ckZvcm1EZWZhdWx0KFN0cmluZyBhdHRyRm9ybURlZmF1bHQpIHsKLSAgICAgICAgdGhpcy5hdHRyRm9ybURlZmF1bHQgPSBhdHRyRm9ybURlZmF1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRFbGVtZW50Rm9ybURlZmF1bHQoKSB7Ci0gICAgICAgIHJldHVybiBlbGVtZW50Rm9ybURlZmF1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RWxlbWVudEZvcm1EZWZhdWx0KFN0cmluZyBlbGVtZW50Rm9ybURlZmF1bHQpIHsKLSAgICAgICAgdGhpcy5lbGVtZW50Rm9ybURlZmF1bHQgPSBlbGVtZW50Rm9ybURlZmF1bHQ7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFhtbFNjaGVtYUZvcm0gZ2V0QXR0ckZvcm1EZWZhdWx0U2V0dGluZygpIHsKLSAgICAgICAgaWYgKEZPUk1fREVGQVVMVF9VTlFVQUxJRklFRC5lcXVhbHMoZ2V0QXR0ckZvcm1EZWZhdWx0KCkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFhtbFNjaGVtYUZvcm0oWG1sU2NoZW1hRm9ybS5VTlFVQUxJRklFRCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFhtbFNjaGVtYUZvcm0oWG1sU2NoZW1hRm9ybS5RVUFMSUZJRUQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFhtbFNjaGVtYUZvcm0gZ2V0RWxlbWVudEZvcm1EZWZhdWx0U2V0dGluZygpIHsKLSAgICAgICAgaWYgKEZPUk1fREVGQVVMVF9VTlFVQUxJRklFRC5lcXVhbHMoZ2V0RWxlbWVudEZvcm1EZWZhdWx0KCkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFhtbFNjaGVtYUZvcm0oWG1sU2NoZW1hRm9ybS5VTlFVQUxJRklFRCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFhtbFNjaGVtYUZvcm0oWG1sU2NoZW1hRm9ybS5RVUFMSUZJRUQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIEFycmF5TGlzdCBnZXRFeHRyYUNsYXNzZXMoKSB7Ci0gICAgICAgIGlmIChleHRyYUNsYXNzZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgZXh0cmFDbGFzc2VzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBleHRyYUNsYXNzZXM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RXh0cmFDbGFzc2VzKEFycmF5TGlzdCBleHRyYUNsYXNzZXMpIHsKLSAgICAgICAgdGhpcy5leHRyYUNsYXNzZXMgPSBleHRyYUNsYXNzZXM7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyByZXNvbHZlU2NoZW1hTmFtZXNwYWNlKFN0cmluZyBwYWNrYWdlTmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vaWYgYWxsIHR5cGVzIG11c3QgZ28gaW50byB0aGUgd3NkbCB0eXBlcyBzY2hlbWEgbmFtZXNwYWNlCi0gICAgICAgIGlmICh1c2VXU0RMVHlwZXNOYW1lc3BhY2UpIHsKLSAgICAgICAgICAgIC8vcmV0dXJuIHNjaGVtYVRhcmdldE5hbWVTcGFjZTsKLSAgICAgICAgICAgIHJldHVybiAoU3RyaW5nKSBwa2cybnNtYXAuZ2V0KCJhbGwiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChwa2cybnNtYXAgIT0gbnVsbCAmJiAhcGtnMm5zbWFwLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIC8vaWYgdHlwZXMgc2hvdWxkIGdvIGludG8gbmFtZXNwYWNlcyB0aGF0IGFyZSBtYXBwZWQgYWdhaW5zdCB0aGUgcGFja2FnZSBuYW1lIGZvciB0aGUgdHlwZQotICAgICAgICAgICAgICAgIGlmIChwa2cybnNtYXAuZ2V0KHBhY2thZ2VOYW1lKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vcmV0dXJuIHRoYXQgbWFwcGluZwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFN0cmluZykgcGtnMm5zbWFwLmdldChwYWNrYWdlTmFtZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldE5zR2VuKCkuc2NoZW1hTmFtZXNwYWNlRnJvbVBhY2thZ2VOYW1lKHBhY2thZ2VOYW1lKS50b1N0cmluZygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gaWYgIHBrZzJuc21hcCBpcyBudWxsIGFuZCBpZiBub3QgZGVmYXVsdCBzY2hlbWEgbnMgZm91bmQgZm9yIHRoZSBjdXN0b20gYmVhbgotICAgICAgICAgICAgICAgIHJldHVybiBnZXROc0dlbigpLnNjaGVtYU5hbWVzcGFjZUZyb21QYWNrYWdlTmFtZShwYWNrYWdlTmFtZSkudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzVXNlV1NETFR5cGVzTmFtZXNwYWNlKCkgewotICAgICAgICByZXR1cm4gdXNlV1NETFR5cGVzTmFtZXNwYWNlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFVzZVdTRExUeXBlc05hbWVzcGFjZShib29sZWFuIHVzZVdTRExUeXBlc05hbWVzcGFjZSkgewotICAgICAgICB0aGlzLnVzZVdTRExUeXBlc05hbWVzcGFjZSA9IHVzZVdTRExUeXBlc05hbWVzcGFjZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWFwIGdldFBrZzJuc21hcCgpIHsKLSAgICAgICAgcmV0dXJuIHBrZzJuc21hcDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQa2cybnNtYXAoTWFwIHBrZzJuc21hcCkgewotICAgICAgICB0aGlzLnBrZzJuc21hcCA9IHBrZzJuc21hcDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRhcmdldE5hbWVzcGFjZSgpIHsKLSAgICAgICAgcmV0dXJuIHRhcmdldE5hbWVzcGFjZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzTmFtZShDbGFzcyB0eXBlKSB7Ci0gICAgICAgIFN0cmluZyBuYW1lID0gdHlwZS5nZXROYW1lKCk7Ci0gICAgICAgIGlmIChuYW1lLmluZGV4T2YoIiQiKSA+IDApIHsKLSAgICAgICAgICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UoJyQnLCAnXycpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UXVhbGlmaWVkTmFtZShQYWNrYWdlIHBhY2thZ2V6KSB7Ci0gICAgICAgIGlmIChwYWNrYWdleiAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gcGFja2FnZXouZ2V0TmFtZSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuICIiOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Tm9uUnBjTWV0aG9kcyhBcnJheUxpc3Qgbm9uUnBjTWV0aG9kcykgewotICAgICAgICBpZiAobm9uUnBjTWV0aG9kcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aGlzLm5vblJwY01ldGhvZHMgPSBub25ScGNNZXRob2RzOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QXhpc1NlcnZpY2UoQXhpc1NlcnZpY2Ugc2VydmljZSkgewotICAgICAgICB0aGlzLnNlcnZpY2UgPSBzZXJ2aWNlOwotICAgIH0KLQotCi0gICAgcHVibGljIFN0cmluZyBnZXRDdXN0b21TY2hlbWFMb2NhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIGN1c3RvbVNjaGVtYUxvY2F0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEN1c3RvbVNjaGVtYUxvY2F0aW9uKFN0cmluZyBjdXN0b21TY2hlbWFMb2NhdGlvbikgewotICAgICAgICB0aGlzLmN1c3RvbVNjaGVtYUxvY2F0aW9uID0gY3VzdG9tU2NoZW1hTG9jYXRpb247Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRNYXBwaW5nRmlsZUxvY2F0aW9uKCkgewotICAgICAgICByZXR1cm4gbWFwcGluZ0ZpbGVMb2NhdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRNYXBwaW5nRmlsZUxvY2F0aW9uKFN0cmluZyBtYXBwaW5nRmlsZUxvY2F0aW9uKSB7Ci0gICAgICAgIHRoaXMubWFwcGluZ0ZpbGVMb2NhdGlvbiA9IG1hcHBpbmdGaWxlTG9jYXRpb247Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRQYXJhbWV0ZXJOYW1lKEFubm90YXRpb25bXVtdIHBhcmFtZXRlckFubm90YXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSBwYXJhbWV0ZXJOYW1lcykgewotICAgICAgICBTdHJpbmcgcGFyYW1ldGVyTmFtZSA9IG51bGw7Ci0gICAgICAgIGlmIChwYXJhbWV0ZXJBbm5vdGF0aW9uLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgIEFubm90YXRpb25bXSB0ZW1wQW5ub24gPSBwYXJhbWV0ZXJBbm5vdGF0aW9uW2pdOwotICAgICAgICAgICAgaWYgKHRlbXBBbm5vbi5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICAgICAgV2ViUGFyYW0gcGFyYSA9IChXZWJQYXJhbSkgdGVtcEFubm9uWzBdOwotICAgICAgICAgICAgICAgIGlmIChwYXJhICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyTmFtZSA9IHBhcmEubmFtZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAocGFyYW1ldGVyTmFtZSA9PSBudWxsIHx8ICIiLmVxdWFscyhwYXJhbWV0ZXJOYW1lKSkgewotICAgICAgICAgICAgaWYocGFyYW1ldGVyTmFtZXMgIT0gbnVsbCAmJiBwYXJhbWV0ZXJOYW1lcy5sZW5ndGggPiBqKSB7Ci0gICAgICAgICAgICAgICAgcGFyYW1ldGVyTmFtZSA9IHBhcmFtZXRlck5hbWVzW2pdOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHBhcmFtZXRlck5hbWUgPT0gbnVsbCB8fCAiIi5lcXVhbHMocGFyYW1ldGVyTmFtZSkpIHsKLSAgICAgICAgICAgICAgICBwYXJhbWV0ZXJOYW1lID0gImFyZ3MiICsgajsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcGFyYW1ldGVyTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgY2xhc3MgTWF0aG9kQ29tcGFyYXRvciBpbXBsZW1lbnRzIENvbXBhcmF0b3IgewotICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKLSAgICAgICAgICAgIE1ldGhvZCBtZXRob2QxID0gKE1ldGhvZCkgbzE7Ci0gICAgICAgICAgICBNZXRob2QgbWV0aG9kMiA9IChNZXRob2QpIG8yOwotICAgICAgICAgICAgU3RyaW5nW10gdmFsdWVzID0gbmV3IFN0cmluZ1syXTsKLSAgICAgICAgICAgIHZhbHVlc1swXSA9IG1ldGhvZDEuZ2V0TmFtZSgpOwotICAgICAgICAgICAgdmFsdWVzWzFdID0gbWV0aG9kMi5nZXROYW1lKCk7Ci0gICAgICAgICAgICBBcnJheXMuc29ydCh2YWx1ZXMpOwotICAgICAgICAgICAgaWYgKHZhbHVlc1swXS5lcXVhbHMobWV0aG9kMS5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGNsYXNzIFByb3BlcnR5Q29tcGFyYXRvciBpbXBsZW1lbnRzIENvbXBhcmF0b3IgewotICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKLSAgICAgICAgICAgIFByb3BlcnR5RGVzY3JpcHRvciBwcm9wZXJ0eURlc2NyaXB0b3IxID0gKFByb3BlcnR5RGVzY3JpcHRvcikgbzE7Ci0gICAgICAgICAgICBQcm9wZXJ0eURlc2NyaXB0b3IgcHJvcGVydHlEZXNjcmlwdG9yMiA9IChQcm9wZXJ0eURlc2NyaXB0b3IpIG8yOwotICAgICAgICAgICAgU3RyaW5nW10gdmFsdWVzID0gbmV3IFN0cmluZ1syXTsKLSAgICAgICAgICAgIHZhbHVlc1swXSA9IHByb3BlcnR5RGVzY3JpcHRvcjEuZ2V0TmFtZSgpOwotICAgICAgICAgICAgdmFsdWVzWzFdID0gcHJvcGVydHlEZXNjcmlwdG9yMi5nZXROYW1lKCk7Ci0gICAgICAgICAgICBBcnJheXMuc29ydCh2YWx1ZXMpOwotICAgICAgICAgICAgaWYgKHZhbHVlc1swXS5lcXVhbHMocHJvcGVydHlEZXNjcmlwdG9yMS5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9qYXZhMndzZGwvRG9jTGl0QmFyZVNjaGVtYUdlbmVyYXRvci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL2phdmEyd3NkbC9Eb2NMaXRCYXJlU2NoZW1hR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3YTkxMDcuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL2phdmEyd3NkbC9Eb2NMaXRCYXJlU2NoZW1hR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLmphdmEyd3NkbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC51dGlsLlV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc01lc3NhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5XU0RMMkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuV1NETENvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYTsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYUNvbXBsZXhUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYVNlcXVlbmNlOwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEudXRpbHMuTmFtZXNwYWNlTWFwOwotCi1pbXBvcnQgamF2YXguandzLldlYk1ldGhvZDsKLWltcG9ydCBqYXZheC5qd3MuV2ViUmVzdWx0OwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOwotCi1wdWJsaWMgY2xhc3MgRG9jTGl0QmFyZVNjaGVtYUdlbmVyYXRvciBleHRlbmRzIERlZmF1bHRTY2hlbWFHZW5lcmF0b3IgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKERvY0xpdEJhcmVTY2hlbWFHZW5lcmF0b3IuY2xhc3MpOwotICAgIHByaXZhdGUgSGFzaE1hcCBwcm9jZXNzZWRQYXJhbWV0ZXJzID0gbmV3IExpbmtlZEhhc2hNYXAoKTsKLQotICAgIHB1YmxpYyBEb2NMaXRCYXJlU2NoZW1hR2VuZXJhdG9yKENsYXNzTG9hZGVyIGxvYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzY2hlbWF0YXJnZXROYW1lc3BhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNjaGVtYXRhcmdldE5hbWVzcGFjZVByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBeGlzU2VydmljZSBzZXJ2aWNlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIobG9hZGVyLCBjbGFzc05hbWUsIHNjaGVtYXRhcmdldE5hbWVzcGFjZSwKLSAgICAgICAgICAgICAgICBzY2hlbWF0YXJnZXROYW1lc3BhY2VQcmVmaXgsIHNlcnZpY2UpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBNZXRob2RbXSBwcm9jZXNzTWV0aG9kcyhNZXRob2RbXSBkZWNsYXJlZE1ldGhvZHMpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgLy9zaG9ydCB0aGUgZWxlbWVudHMgaW4gdGhlIGFycmF5Ci0gICAgICAgIEFycmF5cy5zb3J0KGRlY2xhcmVkTWV0aG9kcyAsIG5ldyBNYXRob2RDb21wYXJhdG9yKCkpOwotCi0gICAgICAgIC8vIHNpbmNlIHdlIGRvIG5vdCBzdXBwb3J0IG92ZXJsb2FkCi0gICAgICAgIEhhc2hNYXAgdW5pcXVlTWV0aG9kcyA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7Ci0gICAgICAgIFhtbFNjaGVtYUNvbXBsZXhUeXBlIG1ldGhvZFNjaGVtYVR5cGU7Ci0gICAgICAgIFhtbFNjaGVtYVNlcXVlbmNlIHNlcXVlbmNlOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVjbGFyZWRNZXRob2RzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBNZXRob2Qgak1ldGhvZCA9IGRlY2xhcmVkTWV0aG9kc1tpXTsKLSAgICAgICAgICAgIFdlYk1ldGhvZCBtZXRob2RBbm5vbiA9IGpNZXRob2QuZ2V0QW5ub3RhdGlvbihXZWJNZXRob2QuY2xhc3MpOwotICAgICAgICAgICAgaWYgKG1ldGhvZEFubm9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAobWV0aG9kQW5ub24uZXhjbHVkZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFN0cmluZyBtZXRob2ROYW1lID0gak1ldGhvZC5nZXROYW1lKCk7Ci0gICAgICAgICAgICAvLyBubyBuZWVkIHRvIHRoaW5rIGFidCB0aGlzIG1ldGhvZCAsIHNpbmNlIHRoYXQgaXMgc3lzdGVtCi0gICAgICAgICAgICAvLyBjb25maWcgbWV0aG9kCi0gICAgICAgICAgICBpZiAoZXhjbHVkZU1ldGhvZHMuY29udGFpbnMobWV0aG9kTmFtZSkpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHVuaXF1ZU1ldGhvZHMuZ2V0KG1ldGhvZE5hbWUpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBsb2cud2FybigiV2UgZG9uJ3Qgc3VwcG9ydCBtZXRob2Qgb3ZlcmxvYWRpbmcuIElnbm9yaW5nIFsiICsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgKyAiXSIpOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgIGlmICghTW9kaWZpZXIuaXNQdWJsaWMoak1ldGhvZC5nZXRNb2RpZmllcnMoKSkpIHsKLSAgICAgICAgICAgICAgICAvLyBubyBuZWVkIHRvIGdlbmVyYXRlIFNjaGVtYSBmb3Igbm9uIHB1YmxpYyBtZXRob2RzCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJvb2xlYW4gYWRkVG9TZXJ2aWNlID0gZmFsc2U7Ci0gICAgICAgICAgICBBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb24gPSBzZXJ2aWNlLmdldE9wZXJhdGlvbihuZXcgUU5hbWUobWV0aG9kTmFtZSkpOwotICAgICAgICAgICAgaWYgKGF4aXNPcGVyYXRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGF4aXNPcGVyYXRpb24gPSBVdGlscy5nZXRBeGlzT3BlcmF0aW9uRm9ySm1ldGhvZChqTWV0aG9kKTsKLSAgICAgICAgICAgICAgICBpZiAoV1NETDJDb25zdGFudHMuTUVQX1VSSV9ST0JVU1RfSU5fT05MWS5lcXVhbHMoCi0gICAgICAgICAgICAgICAgICAgICAgICBheGlzT3BlcmF0aW9uLmdldE1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4oKSkpewotICAgICAgICAgICAgICAgICAgICBBeGlzTWVzc2FnZSBvdXRNZXNzYWdlID0gYXhpc09wZXJhdGlvbi5nZXRNZXNzYWdlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9PVVRfVkFMVUUpOwotICAgICAgICAgICAgICAgICAgICBpZiAob3V0TWVzc2FnZSAhPW51bGwgKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dE1lc3NhZ2Uuc2V0TmFtZShtZXRob2ROYW1lICsgUkVTVUxUKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBhZGRUb1NlcnZpY2UgPSB0cnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBNYWludGFpbiBhIGxpc3Qgb2YgbWV0aG9kcyB3ZSBhY3R1YWxseSB3b3JrIHdpdGgKLSAgICAgICAgICAgIGxpc3QuYWRkKGpNZXRob2QpOwotICAgICAgICAgICAgcHJvY2Vzc0V4Y2VwdGlvbihqTWV0aG9kLGF4aXNPcGVyYXRpb24pOwotICAgICAgICAgICAgdW5pcXVlTWV0aG9kcy5wdXQobWV0aG9kTmFtZSwgak1ldGhvZCk7Ci0gICAgICAgICAgICAvL2NyZWF0ZSB0aGUgc2NoZW1hIHR5cGUgZm9yIHRoZSBtZXRob2Qgd3JhcHBlcgotCi0gICAgICAgICAgICB1bmlxdWVNZXRob2RzLnB1dChtZXRob2ROYW1lLCBqTWV0aG9kKTsKLSAgICAgICAgICAgIENsYXNzIFtdIHBhcmFzID0gak1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpOwotICAgICAgICAgICAgU3RyaW5nIHBhcmFtZXRlck5hbWVzW10gPSBtZXRob2RUYWJsZS5nZXRQYXJhbWV0ZXJOYW1lcyhtZXRob2ROYW1lKTsKLSAgICAgICAgICAgIEF4aXNNZXNzYWdlIGluTWVzc2FnZSA9IGF4aXNPcGVyYXRpb24uZ2V0TWVzc2FnZShXU0RMQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfSU5fVkFMVUUpOwotICAgICAgICAgICAgaWYgKGluTWVzc2FnZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaW5NZXNzYWdlLnNldE5hbWUobWV0aG9kTmFtZSArICJSZXF1ZXN0TWVzc2FnZSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQW5ub3RhdGlvbltdW10gcGFyYW1ldGVyQW5ub3RhdGlvbiA9IGpNZXRob2QuZ2V0UGFyYW1ldGVyQW5ub3RhdGlvbnMoKTsKLSAgICAgICAgICAgIGlmIChwYXJhcy5sZW5ndGggPiAxKSB7Ci0gICAgICAgICAgICAgICAgc2VxdWVuY2UgPSBuZXcgWG1sU2NoZW1hU2VxdWVuY2UoKTsKLSAgICAgICAgICAgICAgICBtZXRob2RTY2hlbWFUeXBlID0gY3JlYXRlU2NoZW1hVHlwZUZvck1ldGhvZFBhcnQobWV0aG9kTmFtZSk7Ci0gICAgICAgICAgICAgICAgbWV0aG9kU2NoZW1hVHlwZS5zZXRQYXJ0aWNsZShzZXF1ZW5jZSk7Ci0gICAgICAgICAgICAgICAgaW5NZXNzYWdlLnNldEVsZW1lbnRRTmFtZSh0eXBlVGFibGUuZ2V0UU5hbWVmb3J0aGVUeXBlKG1ldGhvZE5hbWUpKTsKLSAgICAgICAgICAgICAgICBzZXJ2aWNlLmFkZE1lc3NhZ2VFbGVtZW50UU5hbWVUb09wZXJhdGlvbk1hcHBpbmcobWV0aG9kU2NoZW1hVHlwZS5nZXRRTmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgYXhpc09wZXJhdGlvbik7Ci0gICAgICAgICAgICAgICAgaW5NZXNzYWdlLnNldFBhcnROYW1lKG1ldGhvZE5hbWUpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgcGFyYXMubGVuZ3RoOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgQ2xhc3MgbWV0aG9kUGFyYW1ldGVyID0gcGFyYXNbal07Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXJhbWV0ZXJOYW1lID0gZ2V0UGFyYW1ldGVyTmFtZShwYXJhbWV0ZXJBbm5vdGF0aW9uLCBqLCBwYXJhbWV0ZXJOYW1lcyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChnZW5lcmF0ZVJlcXVlc3RTY2hlbWEobWV0aG9kUGFyYW1ldGVyICwgcGFyYW1ldGVyTmFtZSxqTWV0aG9kLCBzZXF1ZW5jZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJhcy5sZW5ndGggPT0gMSkgewotICAgICAgICAgICAgICAgIGlmIChwYXJhc1swXS5pc0FycmF5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2UgPSBuZXcgWG1sU2NoZW1hU2VxdWVuY2UoKTsKLQotICAgICAgICAgICAgICAgICAgICBtZXRob2RTY2hlbWFUeXBlID0gY3JlYXRlU2NoZW1hVHlwZUZvck1ldGhvZFBhcnQobWV0aG9kTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1ldGhvZFNjaGVtYVR5cGUuc2V0UGFydGljbGUoc2VxdWVuY2UpOwotICAgICAgICAgICAgICAgICAgICBDbGFzcyBtZXRob2RQYXJhbWV0ZXIgPSBwYXJhc1swXTsKLSAgICAgICAgICAgICAgICAgICAgaW5NZXNzYWdlLnNldEVsZW1lbnRRTmFtZSh0eXBlVGFibGUuZ2V0UU5hbWVmb3J0aGVUeXBlKG1ldGhvZE5hbWUpKTsKLSAgICAgICAgICAgICAgICAgICAgc2VydmljZS5hZGRNZXNzYWdlRWxlbWVudFFOYW1lVG9PcGVyYXRpb25NYXBwaW5nKG1ldGhvZFNjaGVtYVR5cGUuZ2V0UU5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzT3BlcmF0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgaW5NZXNzYWdlLnNldFBhcnROYW1lKG1ldGhvZE5hbWUpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGFyYW1ldGVyTmFtZSA9IGdldFBhcmFtZXRlck5hbWUocGFyYW1ldGVyQW5ub3RhdGlvbiwgMCwgcGFyYW1ldGVyTmFtZXMpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZ2VuZXJhdGVSZXF1ZXN0U2NoZW1hKG1ldGhvZFBhcmFtZXRlciAsIHBhcmFtZXRlck5hbWUsak1ldGhvZCwgc2VxdWVuY2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXJhbWV0ZXJOYW1lID0gZ2V0UGFyYW1ldGVyTmFtZShwYXJhbWV0ZXJBbm5vdGF0aW9uLCAwLCBwYXJhbWV0ZXJOYW1lcyk7Ci0gICAgICAgICAgICAgICAgICAgIENsYXNzIG1ldGhvZFBhcmFtZXRlciA9IHBhcmFzWzBdOwotICAgICAgICAgICAgICAgICAgICBNZXRob2QgcHJvY2Vzc01ldGhvZCA9IChNZXRob2QpIHByb2Nlc3NlZFBhcmFtZXRlcnMuZ2V0KHBhcmFtZXRlck5hbWUpOwotICAgICAgICAgICAgICAgICAgICBpZiAocHJvY2Vzc01ldGhvZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJJbmF2YWxpZCBKYXZhIGNsYXNzLCIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHRoZXJlIGFyZSB0d28gbWV0aG9kcyBbIiArIHByb2Nlc3NNZXRob2QuZ2V0TmFtZSgpICsgIiBhbmQgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpNZXRob2QuZ2V0TmFtZSgpICsgIiBdd2hpY2ggaGF2ZSB0aGUgc2FtZSBwYXJhbWV0ZXIgbmFtZXMiKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZFBhcmFtZXRlcnMucHV0KHBhcmFtZXRlck5hbWUsIGpNZXRob2QpOwotICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVTY2hlbWFGb3JUeXBlKG51bGwsIG1ldGhvZFBhcmFtZXRlciwgcGFyYW1ldGVyTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbk1lc3NhZ2Uuc2V0RWxlbWVudFFOYW1lKHR5cGVUYWJsZS5nZXRRTmFtZWZvcnRoZVR5cGUocGFyYW1ldGVyTmFtZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaW5NZXNzYWdlLnNldFBhcnROYW1lKHBhcmFtZXRlck5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgaW5NZXNzYWdlLnNldFdyYXBwZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZS5hZGRNZXNzYWdlRWxlbWVudFFOYW1lVG9PcGVyYXRpb25NYXBwaW5nKHR5cGVUYWJsZS5nZXRRTmFtZWZvcnRoZVR5cGUocGFyYW1ldGVyTmFtZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNPcGVyYXRpb24pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBmb3IgaXRzIHJldHVybiB0eXBlCi0gICAgICAgICAgICBDbGFzcyByZXR1cm5UeXBlID0gak1ldGhvZC5nZXRSZXR1cm5UeXBlKCk7Ci0KLSAgICAgICAgICAgIGlmICghInZvaWQiLmVxdWFscyhqTWV0aG9kLmdldFJldHVyblR5cGUoKS5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgQXhpc01lc3NhZ2Ugb3V0TWVzc2FnZSA9IGF4aXNPcGVyYXRpb24uZ2V0TWVzc2FnZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9PVVRfVkFMVUUpOwotICAgICAgICAgICAgICAgIGlmIChyZXR1cm5UeXBlLmlzQXJyYXkoKSkgewotICAgICAgICAgICAgICAgICAgICBtZXRob2RTY2hlbWFUeXBlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVTY2hlbWFUeXBlRm9yTWV0aG9kUGFydChqTWV0aG9kLmdldE5hbWUoKSArIFJFU1VMVCk7Ci0gICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlID0gbmV3IFhtbFNjaGVtYVNlcXVlbmNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1ldGhvZFNjaGVtYVR5cGUuc2V0UGFydGljbGUoc2VxdWVuY2UpOwotICAgICAgICAgICAgICAgICAgICBXZWJSZXN1bHQgcmV0dXJuQW5ub24gPSBqTWV0aG9kLmdldEFubm90YXRpb24oV2ViUmVzdWx0LmNsYXNzKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJldHVybk5hbWUgPSAicmV0dXJuIjsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJldHVybkFubm9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybk5hbWUgPSByZXR1cm5Bbm5vbi5uYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0dXJuTmFtZSAhPSBudWxsICYmICEiIi5lcXVhbHMocmV0dXJuTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5OYW1lID0gInJldHVybiI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG5vblJwY01ldGhvZHMuY29udGFpbnMobWV0aG9kTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlU2NoZW1hRm9yVHlwZShzZXF1ZW5jZSwgbnVsbCwgcmV0dXJuTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZVNjaGVtYUZvclR5cGUoc2VxdWVuY2UsIHJldHVyblR5cGUsIHJldHVybk5hbWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVTY2hlbWFGb3JUeXBlKG51bGwsIHJldHVyblR5cGUsIG1ldGhvZE5hbWUgKyBSRVNVTFQpOwotICAgICAgICAgICAgICAgICAgICBvdXRNZXNzYWdlLnNldFdyYXBwZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBvdXRNZXNzYWdlLnNldEVsZW1lbnRRTmFtZSh0eXBlVGFibGUuZ2V0UU5hbWVmb3J0aGVUeXBlKG1ldGhvZE5hbWUgKyBSRVNVTFQpKTsKLSAgICAgICAgICAgICAgICBvdXRNZXNzYWdlLnNldE5hbWUobWV0aG9kTmFtZSArICJSZXNwb25zZU1lc3NhZ2UiKTsKLSAgICAgICAgICAgICAgICBvdXRNZXNzYWdlLnNldFBhcnROYW1lKG1ldGhvZE5hbWUgKyBSRVNVTFQpOwotICAgICAgICAgICAgICAgIHNlcnZpY2UuYWRkTWVzc2FnZUVsZW1lbnRRTmFtZVRvT3BlcmF0aW9uTWFwcGluZygKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVUYWJsZS5nZXRRTmFtZWZvcnRoZVR5cGUobWV0aG9kTmFtZSArIFJFU1VMVCksCi0gICAgICAgICAgICAgICAgICAgICAgICBheGlzT3BlcmF0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChhZGRUb1NlcnZpY2UpIHsKLSAgICAgICAgICAgICAgICBzZXJ2aWNlLmFkZE9wZXJhdGlvbihheGlzT3BlcmF0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKE1ldGhvZFtdKSBsaXN0LnRvQXJyYXkobmV3IE1ldGhvZFtsaXN0LnNpemUoKV0pOwotICAgIH0KLQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGdlbmVyYXRlUmVxdWVzdFNjaGVtYShDbGFzcyBtZXRob2RQYXJhbWV0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGFyYW1ldGVyTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGhvZCBqTWV0aG9kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWG1sU2NoZW1hU2VxdWVuY2Ugc2VxdWVuY2UpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAobm9uUnBjTWV0aG9kcy5jb250YWlucyhqTWV0aG9kLmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgIGdlbmVyYXRlU2NoZW1hRm9yVHlwZShzZXF1ZW5jZSwgbnVsbCwgak1ldGhvZC5nZXROYW1lKCkpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBnZW5lcmF0ZVNjaGVtYUZvclR5cGUoc2VxdWVuY2UsIG1ldGhvZFBhcmFtZXRlciwgcGFyYW1ldGVyTmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgUU5hbWUgZ2VuZXJhdGVTY2hlbWFGb3JUeXBlKFhtbFNjaGVtYVNlcXVlbmNlIHNlcXVlbmNlLCBDbGFzcyB0eXBlLCBTdHJpbmcgcGFydE5hbWUpCi0gICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICBib29sZWFuIGlzQXJyYXlUeXBlID0gZmFsc2U7Ci0gICAgICAgIGlmICh0eXBlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlzQXJyYXlUeXBlID0gdHlwZS5pc0FycmF5KCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlzQXJyYXlUeXBlKSB7Ci0gICAgICAgICAgICB0eXBlID0gdHlwZS5nZXRDb21wb25lbnRUeXBlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKEF4aXNGYXVsdC5jbGFzcy5nZXROYW1lKCkuZXF1YWxzKHR5cGUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgY2xhc3NUeXBlTmFtZTsKLSAgICAgICAgaWYgKHR5cGUgPT0gbnVsbCkgewotICAgICAgICAgICAgY2xhc3NUeXBlTmFtZSA9ICJqYXZhLmxhbmcuT2JqZWN0IjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNsYXNzVHlwZU5hbWUgPSB0eXBlLmdldE5hbWUoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaXNBcnJheVR5cGUgJiYgImJ5dGUiLmVxdWFscyhjbGFzc1R5cGVOYW1lKSkgewotICAgICAgICAgICAgY2xhc3NUeXBlTmFtZSA9ICJiYXNlNjRCaW5hcnkiOwotICAgICAgICAgICAgaXNBcnJheVR5cGUgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaXNEYXRhSGFuZGxlcih0eXBlKSkgewotICAgICAgICAgICAgY2xhc3NUeXBlTmFtZSA9ICJiYXNlNjRCaW5hcnkiOwotICAgICAgICB9Ci0gICAgICAgIFFOYW1lIHNjaGVtYVR5cGVOYW1lID0gdHlwZVRhYmxlLmdldFNpbXBsZVNjaGVtYVR5cGVOYW1lKGNsYXNzVHlwZU5hbWUpOwotICAgICAgICBpZiAoc2NoZW1hVHlwZU5hbWUgPT0gbnVsbCAmJiB0eXBlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNjaGVtYVR5cGVOYW1lID0gZ2VuZXJhdGVTY2hlbWEodHlwZSk7Ci0gICAgICAgICAgICBhZGRDb250ZW50VG9NZXRob2RTY2hlbWFUeXBlKHNlcXVlbmNlLAotICAgICAgICAgICAgICAgICAgICBzY2hlbWFUeXBlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgcGFydE5hbWUsCi0gICAgICAgICAgICAgICAgICAgIGlzQXJyYXlUeXBlKTsKLSAgICAgICAgICAgIFN0cmluZyBzY2hlbWFOYW1lc3BhY2UgPSByZXNvbHZlU2NoZW1hTmFtZXNwYWNlKGdldFF1YWxpZmllZE5hbWUodHlwZS5nZXRQYWNrYWdlKCkpKTsKLSAgICAgICAgICAgIGFkZEltcG9ydChnZXRYbWxTY2hlbWEoc2NoZW1hTmFtZXNwYWNlKSwgc2NoZW1hVHlwZU5hbWUpOwotICAgICAgICAgICAgaWYoc2VxdWVuY2U9PW51bGwpewotICAgICAgICAgICAgICAgICBnZW5lcmF0ZVNjaGVtYUZvclNpbmdsZUVsZW1lbnQoc2NoZW1hVHlwZU5hbWUsIHBhcnROYW1lLCBpc0FycmF5VHlwZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoc2VxdWVuY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGdlbmVyYXRlU2NoZW1hRm9yU2luZ2xlRWxlbWVudChzY2hlbWFUeXBlTmFtZSwgcGFydE5hbWUsIGlzQXJyYXlUeXBlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYWRkQ29udGVudFRvTWV0aG9kU2NoZW1hVHlwZShzZXF1ZW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYVR5cGVOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgcGFydE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBpc0FycmF5VHlwZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYWRkSW1wb3J0KGdldFhtbFNjaGVtYShzY2hlbWFUYXJnZXROYW1lU3BhY2UpLCBzY2hlbWFUeXBlTmFtZSk7Ci0gICAgICAgIHJldHVybiBzY2hlbWFUeXBlTmFtZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBnZW5lcmF0ZVNjaGVtYUZvclNpbmdsZUVsZW1lbnQoUU5hbWUgc2NoZW1hVHlwZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXJhTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0FycmF5KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgWG1sU2NoZW1hRWxlbWVudCBlbHQxID0gbmV3IFhtbFNjaGVtYUVsZW1lbnQoKTsKLSAgICAgICAgZWx0MS5zZXROYW1lKHBhcmFOYW1lKTsKLSAgICAgICAgZWx0MS5zZXRTY2hlbWFUeXBlTmFtZShzY2hlbWFUeXBlTmFtZSk7Ci0gICAgICAgIGVsdDEuc2V0TmlsbGFibGUodHJ1ZSk7Ci0gICAgICAgIFFOYW1lIGVsZW1lbnROYW1lID0KLSAgICAgICAgICAgICAgICBuZXcgUU5hbWUoc2NoZW1hVGFyZ2V0TmFtZVNwYWNlLCBwYXJhTmFtZSwgc2NoZW1hX25hbWVzcGFjZV9wcmVmaXgpOwotICAgICAgICBlbHQxLnNldFFOYW1lKGVsZW1lbnROYW1lKTsKLSAgICAgICAgWG1sU2NoZW1hIHhtbFNjaGVtYSA9IGdldFhtbFNjaGVtYShzY2hlbWFUYXJnZXROYW1lU3BhY2UpOwotICAgICAgICB4bWxTY2hlbWEuZ2V0RWxlbWVudHMoKS5hZGQoZWxlbWVudE5hbWUsIGVsdDEpOwotICAgICAgICB4bWxTY2hlbWEuZ2V0SXRlbXMoKS5hZGQoZWx0MSk7Ci0gICAgICAgIHR5cGVUYWJsZS5hZGRDb21wbGV4U2NoZW1hKHBhcmFOYW1lLCBlbGVtZW50TmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2VuZXJhdGUgc2NoZW1hIGNvbnN0cnVjdCBmb3IgZ2l2ZW4gdHlwZQotICAgICAqCi0gICAgICogQHBhcmFtIGphdmFUeXBlCi0gICAgICovCi0gICAgcHJpdmF0ZSBYbWxTY2hlbWFDb21wbGV4VHlwZSBjcmVhdGVTY2hlbWFUeXBlRm9yTWV0aG9kUGFydChTdHJpbmcgbG9jYWxQYXJ0TmFtZSkgewotICAgICAgICBYbWxTY2hlbWEgeG1sU2NoZW1hID0gZ2V0WG1sU2NoZW1hKHNjaGVtYVRhcmdldE5hbWVTcGFjZSk7Ci0gICAgICAgIFFOYW1lIGVsZW1lbnROYW1lID0KLSAgICAgICAgICAgICAgICBuZXcgUU5hbWUodGhpcy5zY2hlbWFUYXJnZXROYW1lU3BhY2UsIGxvY2FsUGFydE5hbWUsIHRoaXMuc2NoZW1hX25hbWVzcGFjZV9wcmVmaXgpOwotCi0gICAgICAgIFhtbFNjaGVtYUNvbXBsZXhUeXBlIGNvbXBsZXhUeXBlID0gZ2V0Q29tcGxleFR5cGVGb3JFbGVtZW50KHhtbFNjaGVtYSwgZWxlbWVudE5hbWUpOwotICAgICAgICBpZiAoY29tcGxleFR5cGUgPT0gbnVsbCkgewotICAgICAgICAgICAgY29tcGxleFR5cGUgPSBuZXcgWG1sU2NoZW1hQ29tcGxleFR5cGUoeG1sU2NoZW1hKTsKLQotICAgICAgICAgICAgWG1sU2NoZW1hRWxlbWVudCBnbG9iYWxFbGVtZW50ID0gbmV3IFhtbFNjaGVtYUVsZW1lbnQoKTsKLSAgICAgICAgICAgIGdsb2JhbEVsZW1lbnQuc2V0U2NoZW1hVHlwZShjb21wbGV4VHlwZSk7Ci0gICAgICAgICAgICBnbG9iYWxFbGVtZW50LnNldE5hbWUobG9jYWxQYXJ0TmFtZSk7Ci0gICAgICAgICAgICBnbG9iYWxFbGVtZW50LnNldFFOYW1lKGVsZW1lbnROYW1lKTsKLSAgICAgICAgICAgIHhtbFNjaGVtYS5nZXRJdGVtcygpLmFkZChnbG9iYWxFbGVtZW50KTsKLSAgICAgICAgICAgIHhtbFNjaGVtYS5nZXRFbGVtZW50cygpLmFkZChlbGVtZW50TmFtZSwgZ2xvYmFsRWxlbWVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgdHlwZVRhYmxlLmFkZENvbXBsZXhTY2hlbWEobG9jYWxQYXJ0TmFtZSwgZWxlbWVudE5hbWUpOwotCi0gICAgICAgIHJldHVybiBjb21wbGV4VHlwZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgWG1sU2NoZW1hIGdldFhtbFNjaGVtYShTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlKSB7Ci0gICAgICAgIFhtbFNjaGVtYSB4bWxTY2hlbWE7Ci0KLSAgICAgICAgaWYgKCh4bWxTY2hlbWEgPSAoWG1sU2NoZW1hKSBzY2hlbWFNYXAuZ2V0KHRhcmdldE5hbWVzcGFjZSkpID09IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyB0YXJnZXROYW1lc3BhY2VQcmVmaXg7Ci0KLSAgICAgICAgICAgIGlmICh0YXJnZXROYW1lc3BhY2UuZXF1YWxzKHNjaGVtYVRhcmdldE5hbWVTcGFjZSkgJiYKLSAgICAgICAgICAgICAgICAgICAgc2NoZW1hX25hbWVzcGFjZV9wcmVmaXggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZVByZWZpeCA9IHNjaGVtYV9uYW1lc3BhY2VfcHJlZml4OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0YXJnZXROYW1lc3BhY2VQcmVmaXggPSBnZW5lcmF0ZVByZWZpeCgpOwotICAgICAgICAgICAgfQotCi0KLSAgICAgICAgICAgIHhtbFNjaGVtYSA9IG5ldyBYbWxTY2hlbWEodGFyZ2V0TmFtZXNwYWNlLCB4bWxTY2hlbWFDb2xsZWN0aW9uKTsKLSAgICAgICAgICAgIHhtbFNjaGVtYS5zZXRBdHRyaWJ1dGVGb3JtRGVmYXVsdChnZXRBdHRyRm9ybURlZmF1bHRTZXR0aW5nKCkpOwotICAgICAgICAgICAgeG1sU2NoZW1hLnNldEVsZW1lbnRGb3JtRGVmYXVsdChnZXRFbGVtZW50Rm9ybURlZmF1bHRTZXR0aW5nKCkpOwotCi0KLSAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZVByZWZpeE1hcC5wdXQodGFyZ2V0TmFtZXNwYWNlLCB0YXJnZXROYW1lc3BhY2VQcmVmaXgpOwotICAgICAgICAgICAgc2NoZW1hTWFwLnB1dCh0YXJnZXROYW1lc3BhY2UsIHhtbFNjaGVtYSk7Ci0KLSAgICAgICAgICAgIE5hbWVzcGFjZU1hcCBwcmVmaXhtYXAgPSBuZXcgTmFtZXNwYWNlTWFwKCk7Ci0gICAgICAgICAgICBwcmVmaXhtYXAucHV0KERFRkFVTFRfU0NIRU1BX05BTUVTUEFDRV9QUkVGSVgsIFVSSV8yMDAxX1NDSEVNQV9YU0QpOwotICAgICAgICAgICAgcHJlZml4bWFwLnB1dCh0YXJnZXROYW1lc3BhY2VQcmVmaXgsIHRhcmdldE5hbWVzcGFjZSk7Ci0gICAgICAgICAgICB4bWxTY2hlbWEuc2V0TmFtZXNwYWNlQ29udGV4dChwcmVmaXhtYXApOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB4bWxTY2hlbWE7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vamF2YTJ3c2RsL0ZpZWxkQ29tcGFyYXRvci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL2phdmEyd3NkbC9GaWVsZENvbXBhcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODdlYmZmYS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vamF2YTJ3c2RsL0ZpZWxkQ29tcGFyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5qYXZhMndzZGw7DQotDQotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOw0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOw0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsNCi0NCi1wdWJsaWMgY2xhc3MgRmllbGRDb21wYXJhdG9yIGltcGxlbWVudHMgQ29tcGFyYXRvciB7DQotICAgIHB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgew0KLSAgICAgICAgRmllbGQgZmllbGQxID0gKEZpZWxkKSBvMTsNCi0gICAgICAgIEZpZWxkIGZpZWxkMiA9IChGaWVsZCkgbzI7DQotICAgICAgICBTdHJpbmdbXSB2YWx1ZXMgPSBuZXcgU3RyaW5nWzJdOw0KLSAgICAgICAgdmFsdWVzWzBdID0gZmllbGQxLmdldE5hbWUoKTsNCi0gICAgICAgIHZhbHVlc1sxXSA9IGZpZWxkMi5nZXROYW1lKCk7DQotICAgICAgICBBcnJheXMuc29ydCh2YWx1ZXMpOw0KLSAgICAgICAgaWYgKHZhbHVlc1swXS5lcXVhbHMoZmllbGQxLmdldE5hbWUoKSkpIHsNCi0gICAgICAgICAgICByZXR1cm4gMDsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgcmV0dXJuIDE7DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL2phdmEyd3NkbC9KYXZhMldTRExDb25zdGFudHMuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9qYXZhMndzZGwvSmF2YTJXU0RMQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5NjU1NTEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL2phdmEyd3NkbC9KYXZhMldTRExDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uamF2YTJ3c2RsOwotCi1wdWJsaWMgaW50ZXJmYWNlIEphdmEyV1NETENvbnN0YW50cyB7Ci0KLSAgICBTdHJpbmcgU09BUDExX1BSRUZJWCA9ICJzb2FwIjsKLSAgICBTdHJpbmcgU09BUDEyX1BSRUZJWCA9ICJzb2FwMTIiOwotICAgIFN0cmluZyBERUZBVUxUX1dTRExfTkFNRVNQQUNFX1BSRUZJWCA9ICJ3c2RsIjsKLSAgICBTdHJpbmcgREVGQVVMVF9TQ0hFTUFfTkFNRVNQQUNFX1BSRUZJWCA9ICJ4cyI7Ci0gICAgU3RyaW5nIERFRkFVTFRfVEFSR0VUX05BTUVTUEFDRV9QUkVGSVggPSAiYXhpczIiOwotICAgIFN0cmluZyBUQVJHRVROQU1FU1BBQ0VfUFJFRklYID0gInRucyI7Ci0gICAgU3RyaW5nIFNDSEVNQV9OQU1FU1BBQ0VfUFJGSVggPSAibnMiOwotICAgIFN0cmluZyBGT1JNX0RFRkFVTFRfUVVBTElGSUVEID0gInF1YWxpZmllZCI7Ci0gICAgU3RyaW5nIEZPUk1fREVGQVVMVF9VTlFVQUxJRklFRCA9ICJ1bnF1YWxpZmllZCI7Ci0gICAgU3RyaW5nIERPQ19MSVRfQkFSRV9QQVJBTUVURVIgPSJkb2NsaXRCYXJlIjsKLSAgICAKLQotICAgIFN0cmluZyBERUZBVUxUX1RBUkdFVF9OQU1FU1BBQ0UgPSAiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIiOwotICAgIFN0cmluZyBXU0RMX05BTUVTUEFDRSA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI7Ci0gICAgU3RyaW5nIEFYSVMyX1hTRCA9ICJodHRwOi8vb3JnLmFwYWNoZS5heGlzMi94c2QiOwotICAgIFN0cmluZyBVUklfV1NETDEyX1NPQVAgPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwMTIvIjsKLSAgICBTdHJpbmcgVVJJX1dTREwxMV9TT0FQID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iOwotICAgIFN0cmluZyBUUkFOU1BPUlRfVVJJID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCI7Ci0gICAgU3RyaW5nIERFRkFVTFRfTE9DQVRJT05fVVJMID0gImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9heGlzMi9zZXJ2aWNlcy8iOwotICAgIFN0cmluZyBXU0FEX05TID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDYvMDUvYWRkcmVzc2luZy93c2RsIjsKLQotCi0gICAgU3RyaW5nIEhUVFBfTkFNRVNQQUNFID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvaHR0cC8iOwotICAgIFN0cmluZyBNSU1FX05BTUVTUEFDRSA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL21pbWUvIjsKLSAgICBTdHJpbmcgSFRUUF9QUkVGSVggPSAiaHR0cCI7Ci0gICAgU3RyaW5nIE1JTUVfUFJFRklYID0gIm1pbWUiOwotICAgIFN0cmluZyBVUk5fUFJFRklYID0gInVybiI7Ci0gICAgU3RyaW5nIENPTE9OX1NFUEFSQVRPUiA9ICI6IjsKLQotICAgIFN0cmluZyBCSU5ESU5HX05BTUVfU1VGRklYID0gIlNPQVAxMUJpbmRpbmciOwotICAgIFN0cmluZyBTT0FQMTJCSU5ESU5HX05BTUVfU1VGRklYID0gIlNPQVAxMkJpbmRpbmciOwotICAgIFN0cmluZyBIVFRQX0JJTkRJTkcgPSAiSHR0cEJpbmRpbmciOwotICAgIFN0cmluZyBQT1JUX1RZUEVfU1VGRklYID0gIlBvcnRUeXBlIjsKLSAgICBTdHJpbmcgUE9SVF9OQU1FX1NVRkZJWCA9ICJQb3J0IjsKLSAgICBTdHJpbmcgTUVTU0FHRV9MT0NBTF9OQU1FID0gIm1lc3NhZ2UiOwotICAgIFN0cmluZyBBVFRSSUJVVEVfTkFNRSA9ICJuYW1lIjsKLSAgICBTdHJpbmcgUkVRVUVTVF9NRVNTQUdFID0gIlJlcXVlc3RNZXNzYWdlIjsKLSAgICBTdHJpbmcgUkVTUE9OU0VfTUVTU0FHRSA9ICJSZXNwb25zZU1lc3NhZ2UiOwotICAgIFN0cmluZyBGQVVMVF9NRVNTQUdFID0gIk1lc3NhZ2UiOwotICAgIFN0cmluZyBNRVNTQUdFX1NVRkZJWCA9ICJSZXF1ZXN0IjsKLSAgICBTdHJpbmcgUkVRVUVTVCA9ICJSZXF1ZXN0IjsKLSAgICBTdHJpbmcgUkVTUE9OU0UgPSAiUmVzcG9uc2UiOwotICAgIFN0cmluZyBSRVNVTFQgPSAiUmVzdWx0IjsKLSAgICBTdHJpbmcgUE9SVF9UWVBFX0xPQ0FMX05BTUUgPSAicG9ydFR5cGUiOwotICAgIFN0cmluZyBPUEVSQVRJT05fTE9DQUxfTkFNRSA9ICJvcGVyYXRpb24iOwotICAgIFN0cmluZyBJTl9QVVRfTE9DQUxfTkFNRSA9ICJpbnB1dCI7Ci0gICAgU3RyaW5nIE9VVF9QVVRfTE9DQUxfTkFNRSA9ICJvdXRwdXQiOwotICAgIFN0cmluZyBTRVJWSUNFX0xPQ0FMX05BTUUgPSAic2VydmljZSI7Ci0gICAgU3RyaW5nIEJJTkRJTkdfTE9DQUxfTkFNRSA9ICJiaW5kaW5nIjsKLSAgICBTdHJpbmcgUE9SVCA9ICJwb3J0IjsKLSAgICBTdHJpbmcgU09BUDEyUE9SVCA9ICJTT0FQMTJwb3J0IjsKLSAgICBTdHJpbmcgU09BUDExUE9SVCA9ICJTT0FQMTFwb3J0IjsKLSAgICBTdHJpbmcgSFRUUF9QT1JUID0gIkh0dHBwb3J0IjsKLSAgICBTdHJpbmcgUEFSVF9BVFRSSUJVVEVfTkFNRSA9ICJwYXJ0IjsKLSAgICBTdHJpbmcgRUxFTUVOVF9BVFRSSUJVVEVfTkFNRSA9ICJlbGVtZW50IjsKLSAgICBTdHJpbmcgRkFVTFRfTE9DQUxfTkFNRSA9ICJmYXVsdCI7Ci0KLSAgICBTdHJpbmcgU09BUF9BRERSRVNTID0gImFkZHJlc3MiOwotICAgIFN0cmluZyBMT0NBVElPTiA9ICJsb2NhdGlvbiI7Ci0gICAgU3RyaW5nIFRSQU5TUE9SVCA9ICJ0cmFuc3BvcnQiOwotICAgIFN0cmluZyBTVFlMRSA9ICJzdHlsZSI7Ci0gICAgU3RyaW5nIFNPQVBfQUNUSU9OID0gInNvYXBBY3Rpb24iOwotICAgIFN0cmluZyBTT0FQX0JPRFkgPSAiYm9keSI7Ci0gICAgU3RyaW5nIFNPQVBfVVNFID0gInVzZSI7Ci0gICAgU3RyaW5nIERPQ1VNRU5UID0gImRvY3VtZW50IjsKLSAgICBTdHJpbmcgTElURVJBTCA9ICJsaXRlcmFsIjsKLSAgICAvLwotICAgIC8vIFNjaGVtYSBYU0QgTmFtZXNwYWNlcwotICAgIC8vCi0gICAgU3RyaW5nIFVSSV8yMDAxX1NDSEVNQV9YU0QgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiOwotCi0KLSAgICBTdHJpbmcgQVRUUl9GT1JNX0RFRkFVTFRfT1BUSU9OID0gImFmZCI7Ci0gICAgU3RyaW5nIEFUVFJfRk9STV9ERUZBVUxUX09QVElPTl9MT05HID0gImF0dHJpYnV0ZUZvcm1EZWZhdWx0IjsKLSAgICBTdHJpbmcgQ0xBU1NOQU1FX09QVElPTiA9ICJjbiI7Ci0gICAgU3RyaW5nIENMQVNTTkFNRV9PUFRJT05fTE9ORyA9ICJjbGFzc05hbWUiOwotICAgIFN0cmluZyBDTEFTU1BBVEhfT1BUSU9OID0gImNwIjsKLSAgICBTdHJpbmcgQ0xBU1NQQVRIX09QVElPTl9MT05HID0gImNsYXNzUGF0aCI7Ci0gICAgU3RyaW5nIERPQ19MSVRfQkFSRSA9ICJkbGIiOwotICAgIFN0cmluZyBET0NfTElUX0JBUkVfTE9ORyA9ICJkb2NsaXRiYXJlIjsKLSAgICBTdHJpbmcgRUxFTUVOVF9GT1JNX0RFRkFVTFRfT1BUSU9OID0gImVmZCI7Ci0gICAgU3RyaW5nIEVMRU1FTlRfRk9STV9ERUZBVUxUX09QVElPTl9MT05HID0gImVsZW1lbnRGb3JtRGVmYXVsdCI7Ci0gICAgU3RyaW5nIEVYVFJBX0NMQVNTRVNfREVGQVVMVF9PUFRJT04gPSAieGMiOwotICAgIFN0cmluZyBFWFRSQV9DTEFTU0VTX0RFRkFVTFRfT1BUSU9OX0xPTkcgPSAiZXh0cmFDbGFzc2VzIjsKLSAgICBTdHJpbmcgSkFWQV9QS0dfMl9OU01BUF9PUFRJT04gPSAicDJuIjsKLSAgICBTdHJpbmcgSkFWQV9QS0dfMl9OU01BUF9PUFRJT05fTE9ORyA9ICJwYWNrYWdlMk5hbWVzcGFjZSI7Ci0gICAgU3RyaW5nIExPQ0FUSU9OX09QVElPTiA9ICJsIjsKLSAgICBTdHJpbmcgTE9DQVRJT05fT1BUSU9OX0xPTkcgPSAibG9jYXRpb24iOwotICAgIFN0cmluZyBOQU1FU1BBQ0VfR0VORVJBVE9SX09QVElPTiA9ICJuc2ciOwotICAgIFN0cmluZyBOQU1FU1BBQ0VfR0VORVJBVE9SX09QVElPTl9MT05HID0gIm5hbWVzcGFjZUdlbmVyYXRvciI7Ci0gICAgU3RyaW5nIE9VVFBVVF9GSUxFTkFNRV9PUFRJT04gPSAib2YiOwotICAgIFN0cmluZyBPVVRQVVRfRklMRU5BTUVfT1BUSU9OX0xPTkcgPSAib3V0cHV0RmlsZW5hbWUiOwotICAgIFN0cmluZyBPVVRQVVRfTE9DQVRJT05fT1BUSU9OID0gIm8iOwotICAgIFN0cmluZyBPVVRQVVRfTE9DQVRJT05fT1BUSU9OX0xPTkcgPSAib3V0cHV0IjsKLSAgICBTdHJpbmcgU0NIRU1BX0dFTkVSQVRPUl9PUFRJT04gPSAic2ciOwotICAgIFN0cmluZyBTQ0hFTUFfR0VORVJBVE9SX09QVElPTl9MT05HID0gInNjaGVtYUdlbmVyYXRvciI7Ci0gICAgU3RyaW5nIFNDSEVNQV9UQVJHRVRfTkFNRVNQQUNFX09QVElPTiA9ICJzdG4iOwotICAgIFN0cmluZyBTQ0hFTUFfVEFSR0VUX05BTUVTUEFDRV9PUFRJT05fTE9ORyA9ICJzY2hlbWFUYXJnZXRuYW1lc3BhY2UiOwotICAgIFN0cmluZyBTQ0hFTUFfVEFSR0VUX05BTUVTUEFDRV9QUkVGSVhfT1BUSU9OID0gInN0cCI7Ci0gICAgU3RyaW5nIFNDSEVNQV9UQVJHRVRfTkFNRVNQQUNFX1BSRUZJWF9PUFRJT05fTE9ORyA9ICJzY2hlbWFUYXJnZXRuYW1lc3BhY2VQcmVmaXgiOwotICAgIFN0cmluZyBTRVJWSUNFX05BTUVfT1BUSU9OID0gInNuIjsKLSAgICBTdHJpbmcgU0VSVklDRV9OQU1FX09QVElPTl9MT05HID0gInNlcnZpY2VOYW1lIjsKLSAgICBTdHJpbmcgU1RZTEVfT1BUSU9OID0gInN0IjsKLSAgICBTdHJpbmcgU1RZTEVfT1BUSU9OX0xPTkcgPSAic3R5bGUiOwotICAgIFN0cmluZyBUQVJHRVRfTkFNRVNQQUNFX09QVElPTiA9ICJ0biI7Ci0gICAgU3RyaW5nIFRBUkdFVF9OQU1FU1BBQ0VfT1BUSU9OX0xPTkcgPSAidGFyZ2V0TmFtZXNwYWNlIjsKLSAgICBTdHJpbmcgVEFSR0VUX05BTUVTUEFDRV9QUkVGSVhfT1BUSU9OID0gInRwIjsKLSAgICBTdHJpbmcgVEFSR0VUX05BTUVTUEFDRV9QUkVGSVhfT1BUSU9OX0xPTkcgPSAidGFyZ2V0TmFtZXNwYWNlUHJlZml4IjsKLSAgICBTdHJpbmcgVVNFX09QVElPTiA9ICJ1IjsKLSAgICBTdHJpbmcgVVNFX09QVElPTl9MT05HID0gInVzZSI7Ci0gICAgU3RyaW5nIFdTRExfVkVSU0lPTl9PUFRJT04gPSAid3YiOwotICAgIFN0cmluZyBXU0RMX1ZFUlNJT05fT1BUSU9OX0xPTkcgPSAid3NkbC12ZXJzaW9uIjsKLSAgICBTdHJpbmcgQ1VTVE9NX1NDSEVNQV9MT0NBVElPTiA9ICJjc2wiOwotICAgIFN0cmluZyBDVVNUT01fU0NIRU1BX0xPQ0FUSU9OX0xPTkcgPSAiY3VzdG9tLXNjaGVtYS1sb2NhdGlvbiI7Ci0gICAgU3RyaW5nIFNDSEVNQV9NQVBQSU5HX0ZJTEVfTE9DQVRJT04gPSAibWZsIjsKLSAgICBTdHJpbmcgU0NIRU1BX01BUFBJTkdfRklMRV9MT0NBVElPTl9MT05HID0gIm1hcHBpbmctZmlsZS1sb2NhdGlvbiI7Ci0KLSAgICBTdHJpbmcgQVhJUzJfTkFNRVNQQUNFX1BSRUZJWCA9ICJuczEiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09MRV9JTlBVVCA9ICJTT0xFX0lOUFVUIjsKLQotICAgIFN0cmluZyBXU0RMX1ZFUlNJT05fMiA9ICIyLjAiOwotICAgIFN0cmluZyBXU0RMX1ZFUlNJT05fMl9PUFRJT05BTCA9ICIyIjsKLSAgICBTdHJpbmcgV1NETF9WRVJTSU9OXzEgPSAiMS4xIjsKLSAgICBTdHJpbmcgUEFSQU1FVEVSUyA9ICJwYXJhbWV0ZXJzIjsKLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9qYXZhMndzZGwvSmF2YTJXU0RMVXRpbHMuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9qYXZhMndzZGwvSmF2YTJXU0RMVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNiYzc0NC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vamF2YTJ3c2RsL0phdmEyV1NETFV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLmphdmEyd3NkbDsKLQotcHVibGljIGNsYXNzIEphdmEyV1NETFV0aWxzIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhUVFAgPSAiaHR0cDovLyI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgUEFDS0FHRV9DTEFTU19ERUxJTUlURVIgPSAnLic7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQ0hFTUFfTkFNRVNQQUNFX0VYVE4gPSAiL3hzZCI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBOYW1lc3BhY2VHZW5lcmF0b3IgZGVmYXVsdE5zR2VuZXJhdG9yID0gbmV3IERlZmF1bHROYW1lc3BhY2VHZW5lcmF0b3IoKTsKLQotICAgIC8qKgotICAgICAqIGNoZWNrIHRoZSBlbnRyeSBmb3IgYSBVUkwuIFRoaXMgaXMgYSBzaW1wbGUgY2hlY2sgYW5kIG5lZWQgdG8gYmUgaW1wcm92ZWQKLSAgICAgKgotICAgICAqIEBwYXJhbSBlbnRyeQotICAgICAqLwotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVVJMKFN0cmluZyBlbnRyeSkgewotICAgICAgICByZXR1cm4gZW50cnkuc3RhcnRzV2l0aCgiaHR0cDovLyIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEEgbWV0aG9kIHRvIHN0cmlwIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3NOYW1lIHRvIGEgc2ltcGxlIGNsYXNzbmFtZQotICAgICAqCi0gICAgICogQHBhcmFtIHF1YWxpZmllZE5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTaW1wbGVDbGFzc05hbWUoU3RyaW5nIHF1YWxpZmllZE5hbWUpIHsKLSAgICAgICAgaW50IGluZGV4ID0gcXVhbGlmaWVkTmFtZS5sYXN0SW5kZXhPZigiLiIpOwotICAgICAgICBpZiAoaW5kZXggPiAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gcXVhbGlmaWVkTmFtZS5zdWJzdHJpbmcoaW5kZXggKyAxLAotICAgICAgICAgICAgICAgICAgICBxdWFsaWZpZWROYW1lLmxlbmd0aCgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcXVhbGlmaWVkTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZ0J1ZmZlciBuYW1lc3BhY2VGcm9tQ2xhc3NOYW1lKFN0cmluZyBjbGFzc05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBuYW1lc3BhY2VGcm9tQ2xhc3NOYW1lKGNsYXNzTmFtZSwgY2xhc3NMb2FkZXIsIGRlZmF1bHROc0dlbmVyYXRvcik7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZ0J1ZmZlciBuYW1lc3BhY2VGcm9tQ2xhc3NOYW1lKFN0cmluZyBjbGFzc05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc0xvYWRlciBjbGFzc0xvYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWVzcGFjZUdlbmVyYXRvciBuc0dlbikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIENsYXNzIGNsYXp6ID0gQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUsCi0gICAgICAgICAgICAgICAgdHJ1ZSwKLSAgICAgICAgICAgICAgICBjbGFzc0xvYWRlcik7Ci0gICAgICAgIFBhY2thZ2UgcGtnID0gY2xhenouZ2V0UGFja2FnZSgpOwotICAgICAgICBTdHJpbmcgbmFtZTsKLQotICAgICAgICBpZiAocGtnICE9IG51bGwpCi0gICAgICAgICAgICBuYW1lID0gcGtnLmdldE5hbWUoKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgbmFtZSA9IHBhY2thZ2VOYW1lRnJvbUNsYXNzKGNsYXNzTmFtZSk7Ci0KLSAgICAgICAgcmV0dXJuIG5zR2VuLm5hbWVzcGFjZUZyb21QYWNrYWdlTmFtZShuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZ0J1ZmZlciBzY2hlbWFOYW1lc3BhY2VGcm9tQ2xhc3NOYW1lKFN0cmluZyBwYWNrYWdlTmFtZSwgQ2xhc3NMb2FkZXIgbG9hZGVyKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIHNjaGVtYU5hbWVzcGFjZUZyb21DbGFzc05hbWUocGFja2FnZU5hbWUsIGxvYWRlciwgZGVmYXVsdE5zR2VuZXJhdG9yKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZ0J1ZmZlciBzY2hlbWFOYW1lc3BhY2VGcm9tQ2xhc3NOYW1lKFN0cmluZyBwYWNrYWdlTmFtZSwgQ2xhc3NMb2FkZXIgbG9hZGVyLCBOYW1lc3BhY2VHZW5lcmF0b3IgbnNHZW4pIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmdCdWZmZXIgc3RyaW5nQnVmZmVyID0gbmFtZXNwYWNlRnJvbUNsYXNzTmFtZShwYWNrYWdlTmFtZSwKLSAgICAgICAgICAgICAgICBsb2FkZXIsCi0gICAgICAgICAgICAgICAgbnNHZW4pOwotICAgICAgICBpZiAoc3RyaW5nQnVmZmVyLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoSmF2YTJXU0RMQ29uc3RhbnRzLkRFRkFVTFRfVEFSR0VUX05BTUVTUEFDRSk7Ci0gICAgICAgIH0KLS8vICAgICAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFNDSEVNQV9OQU1FU1BBQ0VfRVhUTik7Ci0gICAgICAgIHJldHVybiBzdHJpbmdCdWZmZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmdCdWZmZXIgdGFyZ2V0TmFtZXNwYWNlRnJvbUNsYXNzTmFtZShTdHJpbmcgcGFja2FnZU5hbWUsIENsYXNzTG9hZGVyIGxvYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWVzcGFjZUdlbmVyYXRvciBuc0dlbikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBzdHJpbmdCdWZmZXIgPSBuYW1lc3BhY2VGcm9tQ2xhc3NOYW1lKHBhY2thZ2VOYW1lLAotICAgICAgICAgICAgICAgIGxvYWRlciwKLSAgICAgICAgICAgICAgICBuc0dlbik7Ci0gICAgICAgIGlmIChzdHJpbmdCdWZmZXIubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChKYXZhMldTRExDb25zdGFudHMuREVGQVVMVF9UQVJHRVRfTkFNRVNQQUNFKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RyaW5nQnVmZmVyOwotICAgIH0KLQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoU3RyaW5nIGNsYXNzTmFtZSwgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBDbGFzcyBjbGF6eiA9IENsYXNzLmZvck5hbWUoY2xhc3NOYW1lLAotICAgICAgICAgICAgICAgIHRydWUsCi0gICAgICAgICAgICAgICAgY2xhc3NMb2FkZXIpOwotICAgICAgICBQYWNrYWdlIHBrZyA9IGNsYXp6LmdldFBhY2thZ2UoKTsKLSAgICAgICAgU3RyaW5nIG5hbWU7Ci0KLSAgICAgICAgaWYgKHBrZyAhPSBudWxsKQotICAgICAgICAgICAgbmFtZSA9IHBrZy5nZXROYW1lKCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIG5hbWUgPSBwYWNrYWdlTmFtZUZyb21DbGFzcyhjbGFzc05hbWUpOwotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBwYWNrYWdlTmFtZUZyb21DbGFzcyhTdHJpbmcgbmFtZSkgewotICAgICAgICBTdHJpbmcgcmV0ID0gIiI7Ci0gICAgICAgIGludCBsYXN0RG90ID0gbmFtZS5sYXN0SW5kZXhPZignLicpOwotCi0gICAgICAgIGlmIChsYXN0RG90ICE9IC0xKQotICAgICAgICAgICAgcmV0ID0gbmFtZS5zdWJzdHJpbmcoMCwgbGFzdERvdCk7Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL2phdmEyd3NkbC9OYW1lc3BhY2VHZW5lcmF0b3IuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9qYXZhMndzZGwvTmFtZXNwYWNlR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczMzlkN2MuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL2phdmEyd3NkbC9OYW1lc3BhY2VHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5qYXZhMndzZGw7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgbXVzdCBiZSBpbXBsZW1lbnRlZCB0byBwcm92aWRlIGN1c3RvbSBpbXBsZW10YXRpb25zIGZvciwgCi0gKiBqYXZhIHBhY2thZ2UgbmFtZSB0byBuYW1lc3BhY2UgbWFwcGluZy4gIEFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgaXMgdXNlZCBieSB0aGUgc2NoZW1hIGdlbmVyYXRvcgotICogZm9yIGdlbmVyYXRpb24gbmFtZXNwYWNlcwotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBOYW1lc3BhY2VHZW5lcmF0b3IgewotICAgIHB1YmxpYyBTdHJpbmdCdWZmZXIgbmFtZXNwYWNlRnJvbVBhY2thZ2VOYW1lKFN0cmluZyBwYWNrYWdlTmFtZSk7Ci0gICAgcHVibGljIFN0cmluZ0J1ZmZlciBzY2hlbWFOYW1lc3BhY2VGcm9tUGFja2FnZU5hbWUoU3RyaW5nIHBhY2thZ2VOYW1lKTsKLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9qYXZhMndzZGwvU2NoZW1hR2VuZXJhdG9yLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vamF2YTJ3c2RsL1NjaGVtYUdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjgzMTI3Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9qYXZhMndzZGwvU2NoZW1hR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uamF2YTJ3c2RsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgU2NoZW1hR2VuZXJhdG9yIHsKLSAgICB2b2lkIHNldE5zR2VuKE5hbWVzcGFjZUdlbmVyYXRvciBuc0dlbik7Ci0KLSAgICBDb2xsZWN0aW9uIGdlbmVyYXRlU2NoZW1hKCkgdGhyb3dzIEV4Y2VwdGlvbjsKLQotICAgIFR5cGVUYWJsZSBnZXRUeXBlVGFibGUoKTsKLQotICAgIE1ldGhvZFtdIGdldE1ldGhvZHMoKTsKLQotICAgIHZvaWQgc2V0RXhjbHVkZU1ldGhvZHMoQXJyYXlMaXN0IGV4Y2x1ZGVNZXRob2RzKTsKLQotICAgIFN0cmluZyBnZXRTY2hlbWFUYXJnZXROYW1lU3BhY2UoKTsKLQotICAgIHZvaWQgc2V0QXR0ckZvcm1EZWZhdWx0KFN0cmluZyBhdHRyRm9ybURlZmF1bHQpOwotCi0gICAgdm9pZCBzZXRFbGVtZW50Rm9ybURlZmF1bHQoU3RyaW5nIGVsZW1lbnRGb3JtRGVmYXVsdCk7Ci0KLSAgICB2b2lkIHNldEV4dHJhQ2xhc3NlcyhBcnJheUxpc3QgZXh0cmFDbGFzc2VzKTsKLQotICAgIHZvaWQgc2V0VXNlV1NETFR5cGVzTmFtZXNwYWNlKGJvb2xlYW4gdXNlV1NETFR5cGVzTmFtZXNwYWNlKTsKLQotICAgIHZvaWQgc2V0UGtnMm5zbWFwKE1hcCBwa2cybnNtYXApOwotCi0gICAgU3RyaW5nIGdldFRhcmdldE5hbWVzcGFjZSgpOwotCi0gICAgdm9pZCBzZXROb25ScGNNZXRob2RzKEFycmF5TGlzdCBub25ScGNNZXRob2RzKTsKLQotICAgIHZvaWQgc2V0QXhpc1NlcnZpY2UoQXhpc1NlcnZpY2Ugc2VydmljZSk7Ci0KLSAgICBTdHJpbmcgZ2V0Q3VzdG9tU2NoZW1hTG9jYXRpb24oKTsKLQotCi0gICAgdm9pZCBzZXRDdXN0b21TY2hlbWFMb2NhdGlvbihTdHJpbmcgY3VzdG9tU2NoZW1hTG9jYXRpb24pOwotCi0gICAgU3RyaW5nIGdldE1hcHBpbmdGaWxlTG9jYXRpb24oKSA7Ci0KLSAgICB2b2lkIHNldE1hcHBpbmdGaWxlTG9jYXRpb24oU3RyaW5nIG1hcHBpbmdGaWxlTG9jYXRpb24pIDsKLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9qYXZhMndzZGwvVHlwZVRhYmxlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vamF2YTJ3c2RsL1R5cGVUYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTQ3ODA1Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9qYXZhMndzZGwvVHlwZVRhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLmphdmEyd3NkbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1wdWJsaWMgY2xhc3MgVHlwZVRhYmxlIHsKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBIYXNoTWFwICBzaW1wbGVUeXBldG94c2Q7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBBTllfVFlQRSA9IG5ldyBRTmFtZShKYXZhMldTRExDb25zdGFudHMuVVJJXzIwMDFfU0NIRU1BX1hTRCwgImFueVR5cGUiLCAieHMiKTsKLQotICAgIHByaXZhdGUgSGFzaE1hcCBjb21wbGV4VHlwZU1hcDsKLQotICAgIHB1YmxpYyBUeXBlVGFibGUoKSB7Ci0gICAgICAgIC8vY29tcGxleCB0eXBlIHRhYmxlIGlzIHJlc2V0dGVkIGV2ZXJ5IHRpbWUgdGhpcyBpcwotICAgICAgICAvL2luc3RhbnRpYXRlZAotICAgICAgICBjb21wbGV4VHlwZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgfQotCi0gICAgLyogc3RhdGljYWxseSBwb3B1bGF0ZSB0aGUgc2ltcGxlIHR5cGUgbWFwICAtIHRoaXMgaXMgbm90IGxpa2VseSB0bwotICAgICogY2hhbmdlIGFuZCB3ZSBuZWVkIG5vdCBwb3B1bGF0ZSBpdCBvdmVyIGFuZCBvdmVyICovCi0gICAgc3RhdGljewotICAgICAgICAgIHBvcHVsYXRlU2ltcGxlVHlwZXMoKTsKLSAgICB9Ci0KLSAgICAvKiBwb3B1bGF0ZSB0aGUgc2ltcGxldHlwZSBoYXNobWFwICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwb3B1bGF0ZVNpbXBsZVR5cGVzKCkgewotICAgICAgICBzaW1wbGVUeXBldG94c2QgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICAvL3RvZG8gcGxzIHVzZSB0aGUgdHlwZXMgZnJvbSBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLmNvbnN0YW50cy5Db25zdGFudHMKLSAgICAgICAgc2ltcGxlVHlwZXRveHNkLnB1dCgiaW50IiwKLSAgICAgICAgICAgICAgICBuZXcgUU5hbWUoSmF2YTJXU0RMQ29uc3RhbnRzLlVSSV8yMDAxX1NDSEVNQV9YU0QsICJpbnQiLCAieHMiKSk7Ci0gICAgICAgIHNpbXBsZVR5cGV0b3hzZC5wdXQoImphdmEubGFuZy5TdHJpbmciLAotICAgICAgICAgICAgICAgIG5ldyBRTmFtZShKYXZhMldTRExDb25zdGFudHMuVVJJXzIwMDFfU0NIRU1BX1hTRCwgInN0cmluZyIsICJ4cyIpKTsKLSAgICAgICAgc2ltcGxlVHlwZXRveHNkLnB1dCgiYm9vbGVhbiIsCi0gICAgICAgICAgICAgICAgbmV3IFFOYW1lKEphdmEyV1NETENvbnN0YW50cy5VUklfMjAwMV9TQ0hFTUFfWFNELCAiYm9vbGVhbiIsICJ4cyIpKTsKLSAgICAgICAgc2ltcGxlVHlwZXRveHNkLnB1dCgiZmxvYXQiLAotICAgICAgICAgICAgICAgIG5ldyBRTmFtZShKYXZhMldTRExDb25zdGFudHMuVVJJXzIwMDFfU0NIRU1BX1hTRCwgImZsb2F0IiwgInhzIikpOwotICAgICAgICBzaW1wbGVUeXBldG94c2QucHV0KCJkb3VibGUiLAotICAgICAgICAgICAgICAgIG5ldyBRTmFtZShKYXZhMldTRExDb25zdGFudHMuVVJJXzIwMDFfU0NIRU1BX1hTRCwgImRvdWJsZSIsICJ4cyIpKTsKLSAgICAgICAgc2ltcGxlVHlwZXRveHNkLnB1dCgic2hvcnQiLAotICAgICAgICAgICAgICAgIG5ldyBRTmFtZShKYXZhMldTRExDb25zdGFudHMuVVJJXzIwMDFfU0NIRU1BX1hTRCwgInNob3J0IiwgInhzIikpOwotICAgICAgICBzaW1wbGVUeXBldG94c2QucHV0KCJsb25nIiwKLSAgICAgICAgICAgICAgICBuZXcgUU5hbWUoSmF2YTJXU0RMQ29uc3RhbnRzLlVSSV8yMDAxX1NDSEVNQV9YU0QsICJsb25nIiwgInhzIikpOwotICAgICAgICBzaW1wbGVUeXBldG94c2QucHV0KCJieXRlIiwKLSAgICAgICAgICAgICAgICBuZXcgUU5hbWUoSmF2YTJXU0RMQ29uc3RhbnRzLlVSSV8yMDAxX1NDSEVNQV9YU0QsICJieXRlIiwgInhzIikpOwotICAgICAgICBzaW1wbGVUeXBldG94c2QucHV0KCJjaGFyIiwKLSAgICAgICAgICAgICAgICBuZXcgUU5hbWUoSmF2YTJXU0RMQ29uc3RhbnRzLlVSSV8yMDAxX1NDSEVNQV9YU0QsICJzdHJpbmciLCAieHMiKSk7Ci0gICAgICAgIHNpbXBsZVR5cGV0b3hzZC5wdXQoImphdmEubGFuZy5JbnRlZ2VyIiwKLSAgICAgICAgICAgICAgICBuZXcgUU5hbWUoSmF2YTJXU0RMQ29uc3RhbnRzLlVSSV8yMDAxX1NDSEVNQV9YU0QsICJpbnQiLCAieHMiKSk7Ci0gICAgICAgIHNpbXBsZVR5cGV0b3hzZC5wdXQoImphdmEubGFuZy5Eb3VibGUiLAotICAgICAgICAgICAgICAgIG5ldyBRTmFtZShKYXZhMldTRExDb25zdGFudHMuVVJJXzIwMDFfU0NIRU1BX1hTRCwgImRvdWJsZSIsICJ4cyIpKTsKLSAgICAgICAgc2ltcGxlVHlwZXRveHNkLnB1dCgiamF2YS5sYW5nLkZsb2F0IiwKLSAgICAgICAgICAgICAgICBuZXcgUU5hbWUoSmF2YTJXU0RMQ29uc3RhbnRzLlVSSV8yMDAxX1NDSEVNQV9YU0QsICJmbG9hdCIsICJ4cyIpKTsKLSAgICAgICAgc2ltcGxlVHlwZXRveHNkLnB1dCgiamF2YS5sYW5nLkxvbmciLAotICAgICAgICAgICAgICAgIG5ldyBRTmFtZShKYXZhMldTRExDb25zdGFudHMuVVJJXzIwMDFfU0NIRU1BX1hTRCwgImxvbmciLCAieHMiKSk7Ci0gICAgICAgIHNpbXBsZVR5cGV0b3hzZC5wdXQoImphdmEubGFuZy5DaGFyYWN0ZXIiLAotICAgICAgICAgICAgICAgIEFOWV9UWVBFKTsKLSAgICAgICAgc2ltcGxlVHlwZXRveHNkLnB1dCgiamF2YS5sYW5nLkJvb2xlYW4iLAotICAgICAgICAgICAgICAgIG5ldyBRTmFtZShKYXZhMldTRExDb25zdGFudHMuVVJJXzIwMDFfU0NIRU1BX1hTRCwgImJvb2xlYW4iLCAieHMiKSk7Ci0gICAgICAgIHNpbXBsZVR5cGV0b3hzZC5wdXQoImphdmEubGFuZy5CeXRlIiwKLSAgICAgICAgICAgICAgICBuZXcgUU5hbWUoSmF2YTJXU0RMQ29uc3RhbnRzLlVSSV8yMDAxX1NDSEVNQV9YU0QsICJieXRlIiwgInhzIikpOwotICAgICAgICBzaW1wbGVUeXBldG94c2QucHV0KCJqYXZhLmxhbmcuU2hvcnQiLAotICAgICAgICAgICAgICAgIG5ldyBRTmFtZShKYXZhMldTRExDb25zdGFudHMuVVJJXzIwMDFfU0NIRU1BX1hTRCwgInNob3J0IiwgInhzIikpOwotICAgICAgICBzaW1wbGVUeXBldG94c2QucHV0KCJqYXZhLnV0aWwuRGF0ZSIsCi0gICAgICAgICAgICAgICAgbmV3IFFOYW1lKEphdmEyV1NETENvbnN0YW50cy5VUklfMjAwMV9TQ0hFTUFfWFNELCAiZGF0ZSIsICJ4cyIpKTsKLSAgICAgICAgc2ltcGxlVHlwZXRveHNkLnB1dCgiamF2YS51dGlsLkNhbGVuZGFyIiwKLSAgICAgICAgICAgICAgICBuZXcgUU5hbWUoSmF2YTJXU0RMQ29uc3RhbnRzLlVSSV8yMDAxX1NDSEVNQV9YU0QsICJkYXRlVGltZSIsICJ4cyIpKTsKLQotICAgICAgICAvLyBTUUwgZGF0ZSB0aW1lCi0gICAgICAgICBzaW1wbGVUeXBldG94c2QucHV0KCJqYXZhLnNxbC5EYXRlIiwKLSAgICAgICAgICAgICAgICBuZXcgUU5hbWUoSmF2YTJXU0RMQ29uc3RhbnRzLlVSSV8yMDAxX1NDSEVNQV9YU0QsICJkYXRlIiwgInhzIikpOwotICAgICAgICAgc2ltcGxlVHlwZXRveHNkLnB1dCgiamF2YS5zcWwuVGltZSIsCi0gICAgICAgICAgICAgICAgbmV3IFFOYW1lKEphdmEyV1NETENvbnN0YW50cy5VUklfMjAwMV9TQ0hFTUFfWFNELCAidGltZSIsICJ4cyIpKTsKLSAgICAgICAgc2ltcGxlVHlwZXRveHNkLnB1dCgiamF2YS5zcWwuVGltZXN0YW1wIiwKLSAgICAgICAgICAgICAgICBuZXcgUU5hbWUoSmF2YTJXU0RMQ29uc3RhbnRzLlVSSV8yMDAxX1NDSEVNQV9YU0QsICJkYXRlVGltZSIsICJ4cyIpKTsKLQotICAgICAgICAgLy9jb25zaWRlciBCaWdEZWNpbWFsLCBCaWdJbnRlZ2VyLCBEYXksIER1cmF0aW9uLCBNb250aCwgTW9udGhEYXksCi0gICAgICAgIC8vVGltZSwgWWVhciwgWWVhck1vbnRoIGFzIFNpbXBsZVR5cGUgYXMgd2VsbAotICAgICAgICBzaW1wbGVUeXBldG94c2QucHV0KCJqYXZhLm1hdGguQmlnRGVjaW1hbCIsCi0gICAgICAgICAgICAgICAgbmV3IFFOYW1lKEphdmEyV1NETENvbnN0YW50cy5VUklfMjAwMV9TQ0hFTUFfWFNELCAiZGVjaW1hbCIsICJ4cyIpKTsKLSAgICAgICAgc2ltcGxlVHlwZXRveHNkLnB1dCgiamF2YS5tYXRoLkJpZ0ludGVnZXIiLAotICAgICAgICAgICAgICAgIG5ldyBRTmFtZShKYXZhMldTRExDb25zdGFudHMuVVJJXzIwMDFfU0NIRU1BX1hTRCwgImludGVnZXIiLCAieHMiKSk7Ci0gICAgICAgIHNpbXBsZVR5cGV0b3hzZC5wdXQoIm9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuRGF5IiwKLSAgICAgICAgICAgICAgICBuZXcgUU5hbWUoSmF2YTJXU0RMQ29uc3RhbnRzLlVSSV8yMDAxX1NDSEVNQV9YU0QsICJnRGF5IiwgInhzIikpOwotICAgICAgICBzaW1wbGVUeXBldG94c2QucHV0KCJvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLkR1cmF0aW9uIiwKLSAgICAgICAgICAgICAgICBuZXcgUU5hbWUoSmF2YTJXU0RMQ29uc3RhbnRzLlVSSV8yMDAxX1NDSEVNQV9YU0QsICJkdXJhdGlvbiIsICJ4cyIpKTsKLSAgICAgICAgc2ltcGxlVHlwZXRveHNkLnB1dCgib3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5Nb250aCIsCi0gICAgICAgICAgICAgICAgbmV3IFFOYW1lKEphdmEyV1NETENvbnN0YW50cy5VUklfMjAwMV9TQ0hFTUFfWFNELCAiZ01vbnRoIiwgInhzIikpOwotICAgICAgICBzaW1wbGVUeXBldG94c2QucHV0KCJvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLk1vbnRoRGF5IiwKLSAgICAgICAgICAgICAgICBuZXcgUU5hbWUoSmF2YTJXU0RMQ29uc3RhbnRzLlVSSV8yMDAxX1NDSEVNQV9YU0QsICJnTW9udGhEYXkiLCAieHMiKSk7Ci0gICAgICAgIHNpbXBsZVR5cGV0b3hzZC5wdXQoIm9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuVGltZSIsCi0gICAgICAgICAgICAgICAgbmV3IFFOYW1lKEphdmEyV1NETENvbnN0YW50cy5VUklfMjAwMV9TQ0hFTUFfWFNELCAidGltZSIsICJ4cyIpKTsKLSAgICAgICAgc2ltcGxlVHlwZXRveHNkLnB1dCgib3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5ZZWFyIiwKLSAgICAgICAgICAgICAgICBuZXcgUU5hbWUoSmF2YTJXU0RMQ29uc3RhbnRzLlVSSV8yMDAxX1NDSEVNQV9YU0QsICJnWWVhciIsICJ4cyIpKTsKLSAgICAgICAgc2ltcGxlVHlwZXRveHNkLnB1dCgib3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5ZZWFyTW9udGgiLAotICAgICAgICAgICAgICAgIG5ldyBRTmFtZShKYXZhMldTRExDb25zdGFudHMuVVJJXzIwMDFfU0NIRU1BX1hTRCwgImdZZWFyTW9udGgiLCAieHMiKSk7ICAgICAgIAotCi0gICAgICAgIHNpbXBsZVR5cGV0b3hzZC5wdXQoImphdmEubGFuZy5PYmplY3QiLAotICAgICAgICAgICAgICAgIEFOWV9UWVBFKTsKLQotICAgICAgICAvLyBBbnkgdHlwZXMKLSAgICAgICAgc2ltcGxlVHlwZXRveHNkLnB1dChPTUVsZW1lbnQuY2xhc3MuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgIEFOWV9UWVBFKTsKLSAgICAgICAgc2ltcGxlVHlwZXRveHNkLnB1dChBcnJheUxpc3QuY2xhc3MuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgIEFOWV9UWVBFKTsKLSAgICAgICAgc2ltcGxlVHlwZXRveHNkLnB1dChWZWN0b3IuY2xhc3MuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgIEFOWV9UWVBFKTsKLSAgICAgICAgc2ltcGxlVHlwZXRveHNkLnB1dChMaXN0LmNsYXNzLmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICBBTllfVFlQRSk7Ci0gICAgICAgICBzaW1wbGVUeXBldG94c2QucHV0KEhhc2hNYXAuY2xhc3MuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICBBTllfVFlQRSk7Ci0gICAgICAgICBzaW1wbGVUeXBldG94c2QucHV0KEhhc2h0YWJsZS5jbGFzcy5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgIEFOWV9UWVBFKTsKLSAgICAgICAgLy9ieXRlQXJyYXQKLSAgICAgICAgc2ltcGxlVHlwZXRveHNkLnB1dCgiYmFzZTY0QmluYXJ5IiwKLSAgICAgICAgICAgICAgICBuZXcgUU5hbWUoSmF2YTJXU0RMQ29uc3RhbnRzLlVSSV8yMDAxX1NDSEVNQV9YU0QsICJiYXNlNjRCaW5hcnkiLCAieHMiKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBzY2hlbWEgdHlwZSBRTmFtZSBnaXZlbiB0aGUgdHlwZSBjbGFzcyBuYW1lCi0gICAgICogQHBhcmFtIHR5cGVOYW1lICB0aGUgbmFtZSBvZiB0aGUgdHlwZQotICAgICAqIEByZXR1cm4gICB0aGUgbmFtZSBvZiB0aGUgc2ltcGxlIHR5cGUgb3IgbnVsbCBpZiBpdCBpcyBub3QgYSBzaW1wbGUgdHlwZQotICAgICAqLwotICAgIHB1YmxpYyBRTmFtZSBnZXRTaW1wbGVTY2hlbWFUeXBlTmFtZShTdHJpbmcgdHlwZU5hbWUpIHsKLSAgICAgICAgUU5hbWUgcU5hbWUgPSAoUU5hbWUpIHNpbXBsZVR5cGV0b3hzZC5nZXQodHlwZU5hbWUpOwotICAgICAgICBpZihxTmFtZSA9PSBudWxsKXsKLSAgICAgICAgICAgIGlmKCh0eXBlTmFtZS5zdGFydHNXaXRoKCJqYXZhLmxhbmciKXx8dHlwZU5hbWUuc3RhcnRzV2l0aCgiamF2YXguIikpICYmCi0gICAgICAgICAgICAgICAgICAgICFFeGNlcHRpb24uY2xhc3MuZ2V0TmFtZSgpLmVxdWFscyh0eXBlTmFtZSkpewotICAgICAgICAgICAgICAgIHJldHVybiBBTllfVFlQRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcU5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHdoZXRoZXIgdGhlIGdpdmVuIHR5cGUgaXMgYSBzaW1wbGUgdHlwZSBvciBub3QKLSAgICAgKiBAcGFyYW0gdHlwZU5hbWUgdGhlIG5hbWUgb2YgdGhlIHR5cGUKLSAgICAgKiBAcmV0dXJuICB0cnVlIGlmIHRoZSB0eXBlIGlzIGEgc2ltcGxlIHR5cGUKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1NpbXBsZVR5cGUoU3RyaW5nIHR5cGVOYW1lKSB7Ci0gICAgICAgIAotICAgICAgICBpZiAoc2ltcGxlVHlwZXRveHNkLmtleVNldCgpLmNvbnRhaW5zKHR5cGVOYW1lKSl7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfWVsc2UgaWYodHlwZU5hbWUuc3RhcnRzV2l0aCgiamF2YS5sYW5nIil8fHR5cGVOYW1lLnN0YXJ0c1dpdGgoImphdmF4LiIpKXsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIGNvbXBsZXggdHlwZSBtYXAKLSAgICAgKiBAcmV0dXJuICB0aGUgbWFwIHdpdGggY29tcGxleCB0eXBlcwotICAgICAqLwotICAgIHB1YmxpYyBNYXAgZ2V0Q29tcGxleFNjaGVtYU1hcCgpIHsKLSAgICAgICAgcmV0dXJuIGNvbXBsZXhUeXBlTWFwOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZENvbXBsZXhTY2hlbWEoU3RyaW5nIG5hbWUsIFFOYW1lIHNjaGVtYVR5cGUpIHsKLSAgICAgICAgY29tcGxleFR5cGVNYXAucHV0KG5hbWUsIHNjaGVtYVR5cGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBRTmFtZSBnZXRDb21wbGV4U2NoZW1hVHlwZShTdHJpbmcgbmFtZSkgewotICAgICAgICByZXR1cm4gKFFOYW1lKSBjb21wbGV4VHlwZU1hcC5nZXQobmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBxbmFtZSBmb3IgYSB0eXBlCi0gICAgICogZmlyc3QgdHJ5IHRoZSBzaW1wbGUgdHlwZXMgaWYgbm90IHRyeSB0aGUgY29tcGxleCB0eXBlcwotICAgICAqIEBwYXJhbSB0eXBlTmFtZSAgbmFtZSBvZiB0aGUgdHlwZQotICAgICAqIEByZXR1cm4gIHRoZSBRbmFtZSBmb3IgdGhpcyB0eXBlCi0gICAgICovCi0gICAgcHVibGljIFFOYW1lIGdldFFOYW1lZm9ydGhlVHlwZShTdHJpbmcgdHlwZU5hbWUpIHsKLSAgICAgICAgUU5hbWUgdHlwZSA9IGdldFNpbXBsZVNjaGVtYVR5cGVOYW1lKHR5cGVOYW1lKTsKLSAgICAgICAgaWYgKHR5cGUgPT0gbnVsbCkgewotICAgICAgICAgICAgdHlwZSA9IGdldENvbXBsZXhTY2hlbWFUeXBlKHR5cGVOYW1lKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHlwZTsKLSAgICB9Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL2phdmEyd3NkbC9ieXRlY29kZS9DaGFpbmVkUGFyYW1SZWFkZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9qYXZhMndzZGwvYnl0ZWNvZGUvQ2hhaW5lZFBhcmFtUmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjNGY0YzYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL2phdmEyd3NkbC9ieXRlY29kZS9DaGFpbmVkUGFyYW1SZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uamF2YTJ3c2RsLmJ5dGVjb2RlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBEZXNjcmlwdGlvbjogSW4gUGFyYW1SZWFkZXIgY2xhc3MsIHVzZXIgY2Fubm90IGdldCBpbmhlcml0ZWQgbWV0aG9kIHBhcmFtZXRlcgotICogZnJvbSB0aGUgY2xhc3MgdGhleSBwYXNzZWQgaW4gZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMgVGhpcyBjbGFzcwotICogaXMgd2Fsa3MgdXAgdGhlIGluaGVyaXRhbmNlIGNoYWluLiBJZiB0aGUgbWV0aG9kIGlzIG5vdCBmb3VuZCBpbgotICogdGhlIGRlcml2ZWQgY2xhc3MsIHNlYXJjaCBpbiBzdXBlciBjbGFzcy4gSWYgbm90IGZvdW5kIGluIHRoZSBpbW1lZGlkYXRlIHN1cGVyCi0gKiBjbGFzcywgc2VhcmNoIHN1cGVyIGNsYXNzJ3Mgc3VwZXIgY2xhc3MsIHVudGlsIHRoZSByb290LCB3aGljaCBpcyBqYXZhLmxhbmcuT2JqZWN0LAotICogaXMgcmVhY2hlZC4gVGhpcyBpcyBub3QgYW4gZWFnZXIgbG9hZCBzaW5jZSBpdCBvbmx5IHN0YXJ0IHNlYXJjaGluZyB0aGUgc3VwZXIgY2xhc3MKLSAqIHdoZW4gaXQgaXMgYXNrZWQgdG8uCi0gKi8KLXB1YmxpYyBjbGFzcyBDaGFpbmVkUGFyYW1SZWFkZXIgewotICAgIHByaXZhdGUgTGlzdCBjaGFpbiA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBwcml2YXRlIExpc3QgY2xzQ2hhaW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgcHJpdmF0ZSBNYXAgbWV0aG9kVG9QYXJhbU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICAvKioKLSAgICAgKiBQcm9jZXNzZXMgYSBnaXZlbiBjbGFzcydzIHBhcmFtZXRlciBuYW1lcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjbHMgdGhlIGNsYXNzIHdoaWNoIHVzZXIgd2FudHMgdG8gZ2V0IHBhcmFtZXRlciBpbmZvIGZyb20KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIENoYWluZWRQYXJhbVJlYWRlcihDbGFzcyBjbHMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIFBhcmFtUmVhZGVyIHJlYWRlciA9IG5ldyBQYXJhbVJlYWRlcihjbHMpOwotICAgICAgICBjaGFpbi5hZGQocmVhZGVyKTsKLSAgICAgICAgY2xzQ2hhaW4uYWRkKGNscyk7Ci0gICAgfQotCi0gICAgLy9ub3cgSSBuZWVkIHRvIGNyZWF0ZSBkZWxpZ2F0ZSBtZXRob2RzCi0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuYW1lcyBvZiB0aGUgZGVjbGFyZWQgcGFyYW1ldGVycyBmb3IgdGhlIGdpdmVuIGNvbnN0cnVjdG9yLgotICAgICAqIElmIHdlIGNhbm5vdCBkZXRlcm1pbmUgdGhlIG5hbWVzLCByZXR1cm4gbnVsbC4gIFRoZSByZXR1cm5lZCBhcnJheSB3aWxsCi0gICAgICogaGF2ZSBvbmUgbmFtZSBwZXIgcGFyYW1ldGVyLiAgVGhlIGxlbmd0aCBvZiB0aGUgYXJyYXkgd2lsbCBiZSB0aGUgc2FtZQotICAgICAqIGFzIHRoZSBsZW5ndGggb2YgdGhlIENsYXNzW10gYXJyYXkgcmV0dXJuZWQgYnkgQ29uc3RydWN0b3IuZ2V0UGFyYW1ldGVyVHlwZXMoKS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjdG9yCi0gICAgICogQHJldHVybiBSZXR1cm5zIGFycmF5IG9mIG5hbWVzLCBvbmUgcGVyIHBhcmFtZXRlciwgb3IgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRQYXJhbWV0ZXJOYW1lcyhDb25zdHJ1Y3RvciBjdG9yKSB7Ci0gICAgICAgIC8vdGhlcmUgaXMgbm8gbmVlZCBmb3IgdGhlIGNvbnN0cnVjdG9yIGNoYWluaW5nLgotICAgICAgICByZXR1cm4gKChQYXJhbVJlYWRlcikgY2hhaW4uZ2V0KDApKS5nZXRQYXJhbWV0ZXJOYW1lcyhjdG9yKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuYW1lcyBvZiB0aGUgZGVjbGFyZWQgcGFyYW1ldGVycyBmb3IgdGhlIGdpdmVuIG1ldGhvZC4KLSAgICAgKiBJZiBjYW5ub3QgZGV0ZXJtaW5lIHRoZSBuYW1lcyBpbiB0aGUgY3VycmVudCBjbGFzcywgc2VhcmNoIGl0cyBwYXJlbnQgCi0gICAgICogY2xhc3MgdW50aWwgd2UgcmVhY2ggamF2YS5sYW5nLk9iamVjdC4gSWYgc3RpbGwgY2FuIG5vdCBmaW5kIHRoZSBtZXRob2QsCi0gICAgICogcmV0dXJucyBudWxsLiBUaGUgcmV0dXJuZWQgYXJyYXkgaGFzIG9uZSBuYW1lIHBlciBwYXJhbWV0ZXIuIFRoZSBsZW5ndGggCi0gICAgICogb2YgdGhlIGFycmF5IHdpbGwgYmUgdGhlIHNhbWUgYXMgdGhlIGxlbmd0aCBvZiB0aGUgQ2xhc3NbXSBhcnJheSAKLSAgICAgKiByZXR1cm5lZCBieSBNZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXRob2QKLSAgICAgKiBAcmV0dXJuIFN0cmluZ1tdIFJldHVybnMgYXJyYXkgb2YgbmFtZXMsIG9uZSBwZXIgcGFyYW1ldGVyLCBvciBudWxsCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZ1tdIGdldFBhcmFtZXRlck5hbWVzKE1ldGhvZCBtZXRob2QpIHsKLSAgICAgICAgLy9nbyBmaW5kIHRoZSBvbmUgZnJvbSB0aGUgY2FjaGUgZmlyc3QKLSAgICAgICAgaWYgKG1ldGhvZFRvUGFyYW1NYXAuY29udGFpbnNLZXkobWV0aG9kKSkgewotICAgICAgICAgICAgcmV0dXJuIChTdHJpbmdbXSkgbWV0aG9kVG9QYXJhbU1hcC5nZXQobWV0aG9kKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZ1tdIHJldCA9IG51bGw7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBjaGFpbi5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBQYXJhbVJlYWRlciByZWFkZXIgPSAoUGFyYW1SZWFkZXIpIGl0Lm5leHQoKTsKLSAgICAgICAgICAgIHJldCA9IHJlYWRlci5nZXRQYXJhbWV0ZXJOYW1lcyhtZXRob2QpOwotICAgICAgICAgICAgaWYgKHJldCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbWV0aG9kVG9QYXJhbU1hcC5wdXQobWV0aG9kLCByZXQpOwotICAgICAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy9pZiB3ZSBoZXJlLCBpdCBtZWFucyB3ZSBuZWVkIHRvIGNyZWF0ZSBuZXcgY2hhaW4uCi0gICAgICAgIENsYXNzIGNscyA9IChDbGFzcykgY2xzQ2hhaW4uZ2V0KGNoYWluLnNpemUoKSAtIDEpOwotICAgICAgICB3aGlsZSAoY2xzICE9IG51bGwgJiYgY2xzICE9IGphdmEubGFuZy5PYmplY3QuY2xhc3MgJiYgY2xzLmdldFN1cGVyY2xhc3MoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBDbGFzcyBzdXBlckNsYXNzID0gY2xzLmdldFN1cGVyY2xhc3MoKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgUGFyYW1SZWFkZXIgX3JlYWRlciA9IG5ldyBQYXJhbVJlYWRlcihzdXBlckNsYXNzKTsKLSAgICAgICAgICAgICAgICBjaGFpbi5hZGQoX3JlYWRlcik7Ci0gICAgICAgICAgICAgICAgY2xzQ2hhaW4uYWRkKGNscyk7Ci0gICAgICAgICAgICAgICAgcmV0ID0gX3JlYWRlci5nZXRQYXJhbWV0ZXJOYW1lcyhtZXRob2QpOwotICAgICAgICAgICAgICAgIGlmIChyZXQgIT0gbnVsbCkgeyAvL3dlIGZvdW5kIGl0IHNvIGp1c3QgcmV0dXJuIGl0LgotICAgICAgICAgICAgICAgICAgICBtZXRob2RUb1BhcmFtTWFwLnB1dChtZXRob2QsIHJldCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vY2FuIG5vdCBmaW5kIHRoZSBzdXBlciBjbGFzcyBpbiB0aGUgY2xhc3MgcGF0aCwgYWJvcnQgaGVyZQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2xzID0gc3VwZXJDbGFzczsKLSAgICAgICAgfQotICAgICAgICBtZXRob2RUb1BhcmFtTWFwLnB1dChtZXRob2QsIHJldCk7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9qYXZhMndzZGwvYnl0ZWNvZGUvQ2xhc3NSZWFkZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9qYXZhMndzZGwvYnl0ZWNvZGUvQ2xhc3NSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ViNzM5Yy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vamF2YTJ3c2RsL2J5dGVjb2RlL0NsYXNzUmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLmphdmEyd3NkbC5ieXRlY29kZTsKLQotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkVPRkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZW1iZXI7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgY2xhc3MgZmlsZSByZWFkZXIgZm9yIG9idGFpbmluZyB0aGUgcGFyYW1ldGVyIG5hbWVzCi0gKiBmb3IgZGVjbGFyZWQgbWV0aG9kcyBpbiBhIGNsYXNzLiAgVGhlIGNsYXNzIG11c3QgaGF2ZSBkZWJ1Z2dpbmcKLSAqIGF0dHJpYnV0ZXMgZm9yIHVzIHRvIG9idGFpbiB0aGlzIGluZm9ybWF0aW9uLiA8cD4KLSAqIDxwLz4KLSAqIFRoaXMgZG9lcyBub3Qgd29yayBmb3IgaW5oZXJpdGVkIG1ldGhvZHMuICBUbyBvYnRhaW4gcGFyYW1ldGVyCi0gKiBuYW1lcyBmb3IgaW5oZXJpdGVkIG1ldGhvZHMsIHlvdSBtdXN0IHVzZSBhIHBhcmFtUmVhZGVyIGZvciB0aGUKLSAqIGNsYXNzIHRoYXQgb3JpZ2luYWxseSBkZWNsYXJlZCB0aGUgbWV0aG9kLiA8cD4KLSAqIDxwLz4KLSAqIGRvbid0IGdldCB0cmlja3ksIGl0J3MgdGhlIGJhcmUgbWluaW11bS4gIEluc3RhbmNlcyBvZiB0aGlzIGNsYXNzCi0gKiBhcmUgbm90IHRocmVhZHNhZmUgLS0gZG9uJ3Qgc2hhcmUgdGhlbS4gPHA+Ci0gKi8KLXB1YmxpYyBjbGFzcyBDbGFzc1JlYWRlciBleHRlbmRzIEJ5dGVBcnJheUlucHV0U3RyZWFtIHsKLSAgICAvLyBjb25zdGFudHMgdmFsdWVzIHRoYXQgYXBwZWFyIGluIGphdmEgY2xhc3MgZmlsZXMsCi0gICAgLy8gZnJvbSBqdm0gc3BlYyAybmQgZWQsIHNlY3Rpb24gNC40LCBwcCAxMDMKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09OU1RBTlRfQ2xhc3MgPSA3OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT05TVEFOVF9GaWVsZHJlZiA9IDk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENPTlNUQU5UX01ldGhvZHJlZiA9IDEwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT05TVEFOVF9JbnRlcmZhY2VNZXRob2RyZWYgPSAxMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09OU1RBTlRfU3RyaW5nID0gODsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09OU1RBTlRfSW50ZWdlciA9IDM7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENPTlNUQU5UX0Zsb2F0ID0gNDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09OU1RBTlRfTG9uZyA9IDU7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENPTlNUQU5UX0RvdWJsZSA9IDY7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENPTlNUQU5UX05hbWVBbmRUeXBlID0gMTI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENPTlNUQU5UX1V0ZjggPSAxOwotICAgIC8qKgotICAgICAqIHRoZSBjb25zdGFudCBwb29sLiAgY29uc3RhbnQgcG9vbCBpbmRpY2VzIGluIHRoZSBjbGFzcyBmaWxlCi0gICAgICogZGlyZWN0bHkgaW5kZXggaW50byB0aGlzIGFycmF5LiAgVGhlIHZhbHVlIHN0b3JlZCBpbiB0aGlzIGFycmF5Ci0gICAgICogaXMgdGhlIHBvc2l0aW9uIGluIHRoZSBjbGFzcyBmaWxlIHdoZXJlIHRoYXQgY29uc3RhbnQgYmVnaW5zLgotICAgICAqLwotICAgIHByaXZhdGUgaW50W10gY3Bvb2xJbmRleDsKLSAgICBwcml2YXRlIE9iamVjdFtdIGNwb29sOwotCi0gICAgcHJpdmF0ZSBNYXAgYXR0ck1ldGhvZHM7Ci0KLSAgICAvKioKLSAgICAgKiBMb2FkcyB0aGUgYnl0ZWNvZGUgZm9yIGEgZ2l2ZW4gY2xhc3MsIGJ5IHVzaW5nIHRoZSBjbGFzcydzIGRlZmluaW5nCi0gICAgICogY2xhc3Nsb2FkZXIgYW5kIGFzc3VtaW5nIHRoYXQgZm9yIGEgY2xhc3MgbmFtZWQgUC5DLCB0aGUgYnl0ZWNvZGVzIGFyZQotICAgICAqIGluIGEgcmVzb3VyY2UgbmFtZWQgL1AvQy5jbGFzcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjIHRoZSBjbGFzcyBvZiBpbnRlcmVzdAotICAgICAqIEByZXR1cm4gUmV0dXJucyBhIGJ5dGUgYXJyYXkgY29udGFpbmluZyB0aGUgYnl0ZWNvZGUKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBieXRlW10gZ2V0Qnl0ZXMoQ2xhc3MgYykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgSW5wdXRTdHJlYW0gZmluID0gYy5nZXRSZXNvdXJjZUFzU3RyZWFtKCcvJyArIGMuZ2V0TmFtZSgpLnJlcGxhY2UoJy4nLCAnLycpICsgIi5jbGFzcyIpOwotICAgICAgICBpZiAoZmluID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiVW5hYmxlIHRvIGxvYWQgYnl0ZWNvZGUgZm9yIGNsYXNzICIgKyBjLmdldE5hbWUoKQotICAgICAgICAgICAgICAgICAgICk7Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbMTAyNF07Ci0gICAgICAgICAgICBpbnQgYWN0dWFsOwotICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIGFjdHVhbCA9IGZpbi5yZWFkKGJ1Zik7Ci0gICAgICAgICAgICAgICAgaWYgKGFjdHVhbCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlKGJ1ZiwgMCwgYWN0dWFsKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IHdoaWxlIChhY3R1YWwgPiAwKTsKLSAgICAgICAgICAgIHJldHVybiBvdXQudG9CeXRlQXJyYXkoKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGZpbi5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIFN0cmluZyBjbGFzc0Rlc2NyaXB0b3JUb05hbWUoU3RyaW5nIGRlc2MpIHsKLSAgICAgICAgcmV0dXJuIGRlc2MucmVwbGFjZSgnLycsICcuJyk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBNYXAgZmluZEF0dHJpYnV0ZVJlYWRlcnMoQ2xhc3MgYykgewotICAgICAgICBIYXNoTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIE1ldGhvZFtdIG1ldGhvZHMgPSBjLmdldE1ldGhvZHMoKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gbWV0aG9kc1tpXS5nZXROYW1lKCk7Ci0gICAgICAgICAgICBpZiAobmFtZS5zdGFydHNXaXRoKCJyZWFkIikgJiYgbWV0aG9kc1tpXS5nZXRSZXR1cm5UeXBlKCkgPT0gdm9pZC5jbGFzcykgewotICAgICAgICAgICAgICAgIG1hcC5wdXQobmFtZS5zdWJzdHJpbmcoNCksIG1ldGhvZHNbaV0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG1hcDsKLSAgICB9Ci0KLQotICAgIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGdldFNpZ25hdHVyZShNZW1iZXIgbWV0aG9kLCBDbGFzc1tdIHBhcmFtVHlwZXMpIHsKLSAgICAgICAgLy8gY29tcHV0ZSB0aGUgbWV0aG9kIGRlc2NyaXB0b3IKLQotICAgICAgICBTdHJpbmdCdWZmZXIgYiA9IG5ldyBTdHJpbmdCdWZmZXIoKG1ldGhvZCBpbnN0YW5jZW9mIE1ldGhvZCkgPyBtZXRob2QuZ2V0TmFtZSgpIDogIjxpbml0PiIpOwotICAgICAgICBiLmFwcGVuZCgnKCcpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1UeXBlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgYWRkRGVzY3JpcHRvcihiLCBwYXJhbVR5cGVzW2ldKTsKLSAgICAgICAgfQotCi0gICAgICAgIGIuYXBwZW5kKCcpJyk7Ci0gICAgICAgIGlmIChtZXRob2QgaW5zdGFuY2VvZiBNZXRob2QpIHsKLSAgICAgICAgICAgIGFkZERlc2NyaXB0b3IoYiwgKChNZXRob2QpIG1ldGhvZCkuZ2V0UmV0dXJuVHlwZSgpKTsKLSAgICAgICAgfSBlbHNlIGlmIChtZXRob2QgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikgewotICAgICAgICAgICAgYWRkRGVzY3JpcHRvcihiLCB2b2lkLmNsYXNzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBiLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGREZXNjcmlwdG9yKFN0cmluZ0J1ZmZlciBiLCBDbGFzcyBjKSB7Ci0gICAgICAgIGlmIChjLmlzUHJpbWl0aXZlKCkpIHsKLSAgICAgICAgICAgIGlmIChjID09IHZvaWQuY2xhc3MpCi0gICAgICAgICAgICAgICAgYi5hcHBlbmQoJ1YnKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKGMgPT0gaW50LmNsYXNzKQotICAgICAgICAgICAgICAgIGIuYXBwZW5kKCdJJyk7Ci0gICAgICAgICAgICBlbHNlIGlmIChjID09IGJvb2xlYW4uY2xhc3MpCi0gICAgICAgICAgICAgICAgYi5hcHBlbmQoJ1onKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKGMgPT0gYnl0ZS5jbGFzcykKLSAgICAgICAgICAgICAgICBiLmFwcGVuZCgnQicpOwotICAgICAgICAgICAgZWxzZSBpZiAoYyA9PSBzaG9ydC5jbGFzcykKLSAgICAgICAgICAgICAgICBiLmFwcGVuZCgnUycpOwotICAgICAgICAgICAgZWxzZSBpZiAoYyA9PSBsb25nLmNsYXNzKQotICAgICAgICAgICAgICAgIGIuYXBwZW5kKCdKJyk7Ci0gICAgICAgICAgICBlbHNlIGlmIChjID09IGNoYXIuY2xhc3MpCi0gICAgICAgICAgICAgICAgYi5hcHBlbmQoJ0MnKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKGMgPT0gZmxvYXQuY2xhc3MpCi0gICAgICAgICAgICAgICAgYi5hcHBlbmQoJ0YnKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKGMgPT0gZG91YmxlLmNsYXNzKSBiLmFwcGVuZCgnRCcpOwotICAgICAgICB9IGVsc2UgaWYgKGMuaXNBcnJheSgpKSB7Ci0gICAgICAgICAgICBiLmFwcGVuZCgnWycpOwotICAgICAgICAgICAgYWRkRGVzY3JpcHRvcihiLCBjLmdldENvbXBvbmVudFR5cGUoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBiLmFwcGVuZCgnTCcpLmFwcGVuZChjLmdldE5hbWUoKS5yZXBsYWNlKCcuJywgJy8nKSkuYXBwZW5kKCc7Jyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgbmV4dCB1bnNpZ25lZCAxNiBiaXQgdmFsdWUuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGZpbmFsIGludCByZWFkU2hvcnQoKSB7Ci0gICAgICAgIHJldHVybiAocmVhZCgpIDw8IDgpIHwgcmVhZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgbmV4dCBzaWduZWQgMzIgYml0IHZhbHVlLgotICAgICAqLwotICAgIHByb3RlY3RlZCBmaW5hbCBpbnQgcmVhZEludCgpIHsKLSAgICAgICAgcmV0dXJuIChyZWFkKCkgPDwgMjQpIHwgKHJlYWQoKSA8PCAxNikgfCAocmVhZCgpIDw8IDgpIHwgcmVhZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNraXBzIG4gYnl0ZXMgaW4gdGhlIGlucHV0IHN0cmVhbS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBza2lwRnVsbHkoaW50IG4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHdoaWxlIChuID4gMCkgewotICAgICAgICAgICAgaW50IGMgPSAoaW50KSBza2lwKG4pOwotICAgICAgICAgICAgaWYgKGMgPD0gMCkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRU9GRXhjZXB0aW9uKCJFcnJvciBsb29raW5nIGZvciBwYXJhbXRlciBuYW1lcyBpbiBieXRlY29kZTogdW5leHBlY3RlZCBlbmQgb2YgZmlsZSIpOwotICAgICAgICAgICAgbiAtPSBjOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGZpbmFsIE1lbWJlciByZXNvbHZlTWV0aG9kKGludCBpbmRleCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLCBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotICAgICAgICBpbnQgb2xkUG9zID0gcG9zOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgTWVtYmVyIG0gPSAoTWVtYmVyKSBjcG9vbFtpbmRleF07Ci0gICAgICAgICAgICBpZiAobSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcG9zID0gY3Bvb2xJbmRleFtpbmRleF07Ci0gICAgICAgICAgICAgICAgQ2xhc3Mgb3duZXIgPSByZXNvbHZlQ2xhc3MocmVhZFNob3J0KCkpOwotICAgICAgICAgICAgICAgIE5hbWVBbmRUeXBlIG50ID0gcmVzb2x2ZU5hbWVBbmRUeXBlKHJlYWRTaG9ydCgpKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgc2lnbmF0dXJlID0gbnQubmFtZSArIG50LnR5cGU7Ci0gICAgICAgICAgICAgICAgaWYgKG50Lm5hbWUuZXF1YWxzKCI8aW5pdD4iKSkgewotICAgICAgICAgICAgICAgICAgICBDb25zdHJ1Y3RvcltdIGN0b3JzID0gb3duZXIuZ2V0Q29uc3RydWN0b3JzKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY3RvcnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzaWcgPSBnZXRTaWduYXR1cmUoY3RvcnNbaV0sIGN0b3JzW2ldLmdldFBhcmFtZXRlclR5cGVzKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNpZy5lcXVhbHMoc2lnbmF0dXJlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwb29sW2luZGV4XSA9IG0gPSBjdG9yc1tpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIE1ldGhvZFtdIG1ldGhvZHMgPSBvd25lci5nZXREZWNsYXJlZE1ldGhvZHMoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2lnID0gZ2V0U2lnbmF0dXJlKG1ldGhvZHNbaV0sIG1ldGhvZHNbaV0uZ2V0UGFyYW1ldGVyVHlwZXMoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2lnLmVxdWFscyhzaWduYXR1cmUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Bvb2xbaW5kZXhdID0gbSA9IG1ldGhvZHNbaV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG07Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaE1ldGhvZEV4Y2VwdGlvbihzaWduYXR1cmUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG07Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBwb3MgPSBvbGRQb3M7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHByb3RlY3RlZCBmaW5hbCBGaWVsZCByZXNvbHZlRmllbGQoaW50IGkpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiwgTm9TdWNoRmllbGRFeGNlcHRpb24gewotICAgICAgICBpbnQgb2xkUG9zID0gcG9zOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgRmllbGQgZiA9IChGaWVsZCkgY3Bvb2xbaV07Ci0gICAgICAgICAgICBpZiAoZiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcG9zID0gY3Bvb2xJbmRleFtpXTsKLSAgICAgICAgICAgICAgICBDbGFzcyBvd25lciA9IHJlc29sdmVDbGFzcyhyZWFkU2hvcnQoKSk7Ci0gICAgICAgICAgICAgICAgTmFtZUFuZFR5cGUgbnQgPSByZXNvbHZlTmFtZUFuZFR5cGUocmVhZFNob3J0KCkpOwotICAgICAgICAgICAgICAgIGNwb29sW2ldID0gZiA9IG93bmVyLmdldERlY2xhcmVkRmllbGQobnQubmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZjsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHBvcyA9IG9sZFBvczsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE5hbWVBbmRUeXBlIHsKLSAgICAgICAgU3RyaW5nIG5hbWU7Ci0gICAgICAgIFN0cmluZyB0eXBlOwotCi0gICAgICAgIHB1YmxpYyBOYW1lQW5kVHlwZShTdHJpbmcgbmFtZSwgU3RyaW5nIHR5cGUpIHsKLSAgICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGZpbmFsIE5hbWVBbmRUeXBlIHJlc29sdmVOYW1lQW5kVHlwZShpbnQgaSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaW50IG9sZFBvcyA9IHBvczsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE5hbWVBbmRUeXBlIG50ID0gKE5hbWVBbmRUeXBlKSBjcG9vbFtpXTsKLSAgICAgICAgICAgIGlmIChudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcG9zID0gY3Bvb2xJbmRleFtpXTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IHJlc29sdmVVdGY4KHJlYWRTaG9ydCgpKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdHlwZSA9IHJlc29sdmVVdGY4KHJlYWRTaG9ydCgpKTsKLSAgICAgICAgICAgICAgICBjcG9vbFtpXSA9IG50ID0gbmV3IE5hbWVBbmRUeXBlKG5hbWUsIHR5cGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG50OwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgcG9zID0gb2xkUG9zOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICBwcm90ZWN0ZWQgZmluYWwgQ2xhc3MgcmVzb2x2ZUNsYXNzKGludCBpKSB0aHJvd3MgSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICBpbnQgb2xkUG9zID0gcG9zOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgQ2xhc3MgYyA9IChDbGFzcykgY3Bvb2xbaV07Ci0gICAgICAgICAgICBpZiAoYyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcG9zID0gY3Bvb2xJbmRleFtpXTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IHJlc29sdmVVdGY4KHJlYWRTaG9ydCgpKTsKLSAgICAgICAgICAgICAgICBjcG9vbFtpXSA9IGMgPSBDbGFzcy5mb3JOYW1lKGNsYXNzRGVzY3JpcHRvclRvTmFtZShuYW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gYzsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHBvcyA9IG9sZFBvczsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgcmVzb2x2ZVV0ZjgoaW50IGkpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGludCBvbGRQb3MgPSBwb3M7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTdHJpbmcgcyA9IChTdHJpbmcpIGNwb29sW2ldOwotICAgICAgICAgICAgaWYgKHMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHBvcyA9IGNwb29sSW5kZXhbaV07Ci0gICAgICAgICAgICAgICAgaW50IGxlbiA9IHJlYWRTaG9ydCgpOwotICAgICAgICAgICAgICAgIHNraXBGdWxseShsZW4pOwotICAgICAgICAgICAgICAgIGNwb29sW2ldID0gcyA9IG5ldyBTdHJpbmcoYnVmLCBwb3MgLSBsZW4sIGxlbiwgInV0Zi04Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gczsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHBvcyA9IG9sZFBvczsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIHJlYWRDcG9vbCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGludCBjb3VudCA9IHJlYWRTaG9ydCgpOyAvLyBjcG9vbCBjb3VudAotICAgICAgICBjcG9vbEluZGV4ID0gbmV3IGludFtjb3VudF07Ci0gICAgICAgIGNwb29sID0gbmV3IE9iamVjdFtjb3VudF07Ci0gICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgaW50IGMgPSByZWFkKCk7Ci0gICAgICAgICAgICBjcG9vbEluZGV4W2ldID0gc3VwZXIucG9zOwotICAgICAgICAgICAgc3dpdGNoIChjKSAvLyBjb25zdGFudCBwb29sIHRhZwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgQ09OU1RBTlRfRmllbGRyZWY6Ci0gICAgICAgICAgICAgICAgY2FzZSBDT05TVEFOVF9NZXRob2RyZWY6Ci0gICAgICAgICAgICAgICAgY2FzZSBDT05TVEFOVF9JbnRlcmZhY2VNZXRob2RyZWY6Ci0gICAgICAgICAgICAgICAgY2FzZSBDT05TVEFOVF9OYW1lQW5kVHlwZToKLQotICAgICAgICAgICAgICAgICAgICByZWFkU2hvcnQoKTsgLy8gY2xhc3MgaW5kZXggb3IgKDEyKSBuYW1lIGluZGV4Ci0gICAgICAgICAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaAotCi0gICAgICAgICAgICAgICAgY2FzZSBDT05TVEFOVF9DbGFzczoKLSAgICAgICAgICAgICAgICBjYXNlIENPTlNUQU5UX1N0cmluZzoKLQotICAgICAgICAgICAgICAgICAgICByZWFkU2hvcnQoKTsgLy8gc3RyaW5nIGluZGV4IG9yIGNsYXNzIGluZGV4Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBDT05TVEFOVF9Mb25nOgotICAgICAgICAgICAgICAgIGNhc2UgQ09OU1RBTlRfRG91YmxlOgotCi0gICAgICAgICAgICAgICAgICAgIHJlYWRJbnQoKTsgLy8gaGktdmFsdWUKLQotICAgICAgICAgICAgICAgICAgICAvLyBzZWUganZtIHNwZWMgc2VjdGlvbiA0LjQuNSAtIGRvdWJsZSBhbmQgbG9uZyBjcG9vbAotICAgICAgICAgICAgICAgICAgICAvLyBlbnRyaWVzIG9jY3VweSB0d28gInNsb3RzIiBpbiB0aGUgY3Bvb2wgdGFibGUuCi0gICAgICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoCi0KLSAgICAgICAgICAgICAgICBjYXNlIENPTlNUQU5UX0ludGVnZXI6Ci0gICAgICAgICAgICAgICAgY2FzZSBDT05TVEFOVF9GbG9hdDoKLQotICAgICAgICAgICAgICAgICAgICByZWFkSW50KCk7IC8vIHZhbHVlCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBDT05TVEFOVF9VdGY4OgotCi0gICAgICAgICAgICAgICAgICAgIGludCBsZW4gPSByZWFkU2hvcnQoKTsKLSAgICAgICAgICAgICAgICAgICAgc2tpcEZ1bGx5KGxlbik7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgLy8gY29ycnVwdCBjbGFzcyBmaWxlCi0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkVycm9yIGxvb2tpbmcgZm9yIHBhcmFtdGVyIG5hbWVzIGluIGJ5dGVjb2RlOiB1bmV4cGVjdGVkIGJ5dGVzIGluIGZpbGUiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIHNraXBBdHRyaWJ1dGVzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaW50IGNvdW50ID0gcmVhZFNob3J0KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgcmVhZFNob3J0KCk7IC8vIG5hbWUgaW5kZXgKLSAgICAgICAgICAgIHNraXBGdWxseShyZWFkSW50KCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVhZHMgYW4gYXR0cmlidXRlcyBhcnJheS4gIFRoZSBlbGVtZW50cyBvZiBhIGNsYXNzIGZpbGUgdGhhdAotICAgICAqIGNhbiBjb250YWluIGF0dHJpYnV0ZXMgYXJlOiBmaWVsZHMsIG1ldGhvZHMsIHRoZSBjbGFzcyBpdHNlbGYsCi0gICAgICogYW5kIHNvbWUgb3RoZXIgdHlwZXMgb2YgYXR0cmlidXRlcy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCByZWFkQXR0cmlidXRlcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGludCBjb3VudCA9IHJlYWRTaG9ydCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIGludCBuYW1lSW5kZXggPSByZWFkU2hvcnQoKTsgLy8gbmFtZSBpbmRleAotICAgICAgICAgICAgaW50IGF0dHJMZW4gPSByZWFkSW50KCk7Ci0gICAgICAgICAgICBpbnQgY3VyUG9zID0gcG9zOwotCi0gICAgICAgICAgICBTdHJpbmcgYXR0ck5hbWUgPSByZXNvbHZlVXRmOChuYW1lSW5kZXgpOwotCi0gICAgICAgICAgICBNZXRob2QgbSA9IChNZXRob2QpIGF0dHJNZXRob2RzLmdldChhdHRyTmFtZSk7Ci0KLSAgICAgICAgICAgIGlmIChtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBtLmludm9rZSh0aGlzLCBuZXcgT2JqZWN0W117fSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBvcyA9IGN1clBvczsKLSAgICAgICAgICAgICAgICAgICAgc2tpcEZ1bGx5KGF0dHJMZW4pOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZS5nZXRUYXJnZXRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXJyb3IgZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGV4OwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBleDsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGV4OwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBvcyA9IGN1clBvczsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNraXBGdWxseShhdHRyTGVuKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gZG9uJ3QgY2FyZSB3aGF0IGF0dHJpYnV0ZSB0aGlzIGlzCi0gICAgICAgICAgICAgICAgc2tpcEZ1bGx5KGF0dHJMZW4pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVhZHMgYSBjb2RlIGF0dHJpYnV0ZS4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZWFkQ29kZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHJlYWRTaG9ydCgpOyAvLyBtYXggc3RhY2sKLSAgICAgICAgcmVhZFNob3J0KCk7IC8vIG1heCBsb2NhbHMKLSAgICAgICAgc2tpcEZ1bGx5KHJlYWRJbnQoKSk7IC8vIGNvZGUKLSAgICAgICAgc2tpcEZ1bGx5KDggKiByZWFkU2hvcnQoKSk7IC8vIGV4Y2VwdGlvbiB0YWJsZQotCi0gICAgICAgIC8vIHJlYWQgdGhlIGNvZGUgYXR0cmlidXRlcyAocmVjdXJzaXZlKS4gIFRoaXMgaXMgd2hlcmUKLSAgICAgICAgLy8gd2Ugd2lsbCBmaW5kIHRoZSBMb2NhbFZhcmlhYmxlVGFibGUgYXR0cmlidXRlLgotICAgICAgICByZWFkQXR0cmlidXRlcygpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBDbGFzc1JlYWRlcihieXRlIGJ1ZltdLCBNYXAgYXR0ck1ldGhvZHMpIHsKLSAgICAgICAgc3VwZXIoYnVmKTsKLQotICAgICAgICB0aGlzLmF0dHJNZXRob2RzID0gYXR0ck1ldGhvZHM7Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vamF2YTJ3c2RsL2J5dGVjb2RlL01ldGhvZFRhYmxlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vamF2YTJ3c2RsL2J5dGVjb2RlL01ldGhvZFRhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwYTljZTcuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL2phdmEyd3NkbC9ieXRlY29kZS9NZXRob2RUYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLmphdmEyd3NkbC5ieXRlY29kZTsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotcHVibGljIGNsYXNzIE1ldGhvZFRhYmxlIHsKLQotICAgIHByaXZhdGUgSGFzaE1hcCBuYW1lVG9NZXRob2RNYXA7Ci0gICAgcHJpdmF0ZSBDaGFpbmVkUGFyYW1SZWFkZXIgY3ByOwotCi0gICAgcHVibGljIE1ldGhvZFRhYmxlKENsYXNzIGNscykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGNwciA9IG5ldyBDaGFpbmVkUGFyYW1SZWFkZXIoY2xzKTsKLSAgICAgICAgbmFtZVRvTWV0aG9kTWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgbG9hZE1ldGhvZHMoY2xzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUbyBsb2FkIGFsbCB0aGUgbWV0aG9kcyBpbiB0aGUgZ2l2ZW4gY2xhc3MgYnkgSmF2YSByZWZsZWN0aW9uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2xzCi0gICAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgbG9hZE1ldGhvZHMoQ2xhc3MgY2xzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgTWV0aG9kIFtdIG1ldGhvZHMgPSBjbHMuZ2V0TWV0aG9kcygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIE1ldGhvZCBtZXRob2QgPSBtZXRob2RzW2ldOwotICAgICAgICAgICAgbmFtZVRvTWV0aG9kTWFwLnB1dChtZXRob2QuZ2V0TmFtZSgpLCBtZXRob2QpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBbXSBnZXRQYXJhbWV0ZXJOYW1lcyhTdHJpbmcgbWV0aG9kTmFtZSkgewotICAgICAgICBNZXRob2QgbWV0aG9kID0gKE1ldGhvZCkgbmFtZVRvTWV0aG9kTWFwLmdldChtZXRob2ROYW1lKTsKLSAgICAgICAgaWYgKG1ldGhvZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY3ByLmdldFBhcmFtZXRlck5hbWVzKG1ldGhvZCk7Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9qYXZhMndzZGwvYnl0ZWNvZGUvUGFyYW1OYW1lRXh0cmFjdG9yLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vamF2YTJ3c2RsL2J5dGVjb2RlL1BhcmFtTmFtZUV4dHJhY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWQ1NTA3Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9qYXZhMndzZGwvYnl0ZWNvZGUvUGFyYW1OYW1lRXh0cmFjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uamF2YTJ3c2RsLmJ5dGVjb2RlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Qcm94eTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHJldHJpZXZlcyBmdW5jdGlvbiBwYXJhbWV0ZXIgbmFtZXMgZnJvbSBieXRlY29kZSBidWlsdCB3aXRoCi0gKiBkZWJ1Z2dpbmcgc3ltYm9scy4gIFVzZWQgYXMgYSBsYXN0IHJlc29ydCB3aGVuIGNyZWF0aW5nIFdTREwuCi0gKi8KLXB1YmxpYyBjbGFzcyBQYXJhbU5hbWVFeHRyYWN0b3IgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFBhcmFtTmFtZUV4dHJhY3Rvci5jbGFzcyk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXRyaWV2ZXMgYSBsaXN0IG9mIGZ1bmN0aW9uIHBhcmFtZXRlciBuYW1lcyBmcm9tIGEgbWV0aG9kLiAKLSAgICAgKiBSZXR1cm5zIG51bGwgaWYgdW5hYmxlIHRvIHJlYWQgcGFyYW1ldGVyIG5hbWVzIChpLmUuIGJ5dGVjb2RlIG5vdAotICAgICAqIGJ1aWx0IHdpdGggZGVidWcpLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0UGFyYW1ldGVyTmFtZXNGcm9tRGVidWdJbmZvKE1ldGhvZCBtZXRob2QpIHsKLSAgICAgICAgLy8gRG9uJ3Qgd29ycnkgYWJvdXQgaXQgaWYgdGhlcmUgYXJlIG5vIHBhcmFtcy4KLSAgICAgICAgaW50IG51bVBhcmFtcyA9IG1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpLmxlbmd0aDsKLSAgICAgICAgaWYgKG51bVBhcmFtcyA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgLy8gZ2V0IGRlY2xhcmluZyBjbGFzcwotICAgICAgICBDbGFzcyBjID0gbWV0aG9kLmdldERlY2xhcmluZ0NsYXNzKCk7Ci0KLSAgICAgICAgLy8gRG9uJ3Qgd29ycnkgYWJvdXQgaXQgaWYgdGhlIGNsYXNzIGlzIGEgSmF2YSBkeW5hbWljIHByb3h5Ci0gICAgICAgIGlmIChQcm94eS5pc1Byb3h5Q2xhc3MoYykpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIGdldCBhIHBhcmFtZXRlciByZWFkZXIKLSAgICAgICAgICAgIFBhcmFtUmVhZGVyIHByID0gbmV3IFBhcmFtUmVhZGVyKGMpOwotICAgICAgICAgICAgLy8gZ2V0IHRoZSBwYXJhbWV0ZXIgbmFtZXMKLSAgICAgICAgICAgIHJldHVybiBwci5nZXRQYXJhbWV0ZXJOYW1lcyhtZXRob2QpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBsb2cgaXQgYW5kIGxlYXZlCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9qYXZhMndzZGwvYnl0ZWNvZGUvUGFyYW1SZWFkZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9qYXZhMndzZGwvYnl0ZWNvZGUvUGFyYW1SZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTAxYzNjYy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vamF2YTJ3c2RsL2J5dGVjb2RlL1BhcmFtUmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLmphdmEyd3NkbC5ieXRlY29kZTsKLQotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZW1iZXI7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgY2xhc3MgZmlsZSByZWFkZXIgZm9yIG9idGFpbmluZyB0aGUgcGFyYW1ldGVyIG5hbWVzCi0gKiBmb3IgZGVjbGFyZWQgbWV0aG9kcyBpbiBhIGNsYXNzLiAgVGhlIGNsYXNzIG11c3QgaGF2ZSBkZWJ1Z2dpbmcKLSAqIGF0dHJpYnV0ZXMgZm9yIHVzIHRvIG9idGFpbiB0aGlzIGluZm9ybWF0aW9uLiA8cD4KLSAqIDxwLz4KLSAqIFRoaXMgZG9lcyBub3Qgd29yayBmb3IgaW5oZXJpdGVkIG1ldGhvZHMuICBUbyBvYnRhaW4gcGFyYW1ldGVyCi0gKiBuYW1lcyBmb3IgaW5oZXJpdGVkIG1ldGhvZHMsIHlvdSBtdXN0IHVzZSBhIHBhcmFtUmVhZGVyIGZvciB0aGUKLSAqIGNsYXNzIHRoYXQgb3JpZ2luYWxseSBkZWNsYXJlZCB0aGUgbWV0aG9kLiA8cD4KLSAqIDxwLz4KLSAqIGRvbid0IGdldCB0cmlja3ksIGl0J3MgdGhlIGJhcmUgbWluaW11bS4gIEluc3RhbmNlcyBvZiB0aGlzIGNsYXNzCi0gKiBhcmUgbm90IHRocmVhZHNhZmUgLS0gZG9uJ3Qgc2hhcmUgdGhlbS4gPHA+Ci0gKi8KLXB1YmxpYyBjbGFzcyBQYXJhbVJlYWRlcgotICAgICAgICBleHRlbmRzIENsYXNzUmVhZGVyIHsKLSAgICBwcml2YXRlIFN0cmluZyBtZXRob2ROYW1lOwotICAgIHByaXZhdGUgTWFwIG1ldGhvZHMgPSBuZXcgSGFzaE1hcCgpOwotICAgIHByaXZhdGUgQ2xhc3NbXSBwYXJhbVR5cGVzOwotCi0gICAgLyoqCi0gICAgICogUHJvY2Vzc2VzIGEgY2xhc3MgZmlsZSwgZ2l2ZW4gaXQncyBjbGFzcy4gIFdlJ2xsIHVzZSB0aGUgZGVmaW5pbmcKLSAgICAgKiBjbGFzc2xvYWRlciB0byBsb2NhdGUgdGhlIGJ5dGVjb2RlLgotICAgICAqCi0gICAgICogQHBhcmFtIGMKLSAgICAgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgUGFyYW1SZWFkZXIoQ2xhc3MgYykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcyhnZXRCeXRlcyhjKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJvY2Vzc2VzIHRoZSBnaXZlbiBjbGFzcyBieXRlcyBkaXJlY3RseS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBiCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBQYXJhbVJlYWRlcihieXRlW10gYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIoYiwgZmluZEF0dHJpYnV0ZVJlYWRlcnMoUGFyYW1SZWFkZXIuY2xhc3MpKTsKLQotICAgICAgICAvLyBjaGVjayB0aGUgbWFnaWMgbnVtYmVyCi0gICAgICAgIGlmIChyZWFkSW50KCkgIT0gMHhDQUZFQkFCRSkgewotICAgICAgICAgICAgLy8gbm90IGEgY2xhc3MgZmlsZSEKLSAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiRXJyb3IgbG9va2luZyBmb3IgcGFyYW10ZXIgbmFtZXMgaW4gYnl0ZWNvZGU6IGlucHV0IGRvZXMgbm90IGFwcGVhciB0byBiZSBhIHZhbGlkIGNsYXNzIGZpbGUiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJlYWRTaG9ydCgpOyAvLyBtaW5vciB2ZXJzaW9uCi0gICAgICAgIHJlYWRTaG9ydCgpOyAvLyBtYWpvciB2ZXJzaW9uCi0KLSAgICAgICAgcmVhZENwb29sKCk7IC8vIHNsdXJwIGluIHRoZSBjb25zdGFudCBwb29sCi0KLSAgICAgICAgcmVhZFNob3J0KCk7IC8vIGFjY2VzcyBmbGFncwotICAgICAgICByZWFkU2hvcnQoKTsgLy8gdGhpcyBjbGFzcyBuYW1lCi0gICAgICAgIHJlYWRTaG9ydCgpOyAvLyBzdXBlciBjbGFzcyBuYW1lCi0KLSAgICAgICAgaW50IGNvdW50ID0gcmVhZFNob3J0KCk7IC8vIGlmYWNlcyBjb3VudAotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIHJlYWRTaG9ydCgpOyAvLyBpbnRlcmZhY2UgaW5kZXgKLSAgICAgICAgfQotCi0gICAgICAgIGNvdW50ID0gcmVhZFNob3J0KCk7IC8vIGZpZWxkcyBjb3VudAotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIHJlYWRTaG9ydCgpOyAvLyBhY2Nlc3MgZmxhZ3MKLSAgICAgICAgICAgIHJlYWRTaG9ydCgpOyAvLyBuYW1lIGluZGV4Ci0gICAgICAgICAgICByZWFkU2hvcnQoKTsgLy8gZGVzY3JpcHRvciBpbmRleAotICAgICAgICAgICAgc2tpcEF0dHJpYnV0ZXMoKTsgLy8gZmllbGQgYXR0cmlidXRlcwotICAgICAgICB9Ci0KLSAgICAgICAgY291bnQgPSByZWFkU2hvcnQoKTsgLy8gbWV0aG9kcyBjb3VudAotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIHJlYWRTaG9ydCgpOyAvLyBhY2Nlc3MgZmxhZ3MKLSAgICAgICAgICAgIGludCBtID0gcmVhZFNob3J0KCk7IC8vIG5hbWUgaW5kZXgKLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gcmVzb2x2ZVV0ZjgobSk7Ci0gICAgICAgICAgICBpbnQgZCA9IHJlYWRTaG9ydCgpOyAvLyBkZXNjcmlwdG9yIGluZGV4Ci0gICAgICAgICAgICB0aGlzLm1ldGhvZE5hbWUgPSBuYW1lICsgcmVzb2x2ZVV0ZjgoZCk7Ci0gICAgICAgICAgICByZWFkQXR0cmlidXRlcygpOyAvLyBtZXRob2QgYXR0cmlidXRlcwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZWFkQ29kZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHJlYWRTaG9ydCgpOyAvLyBtYXggc3RhY2sKLSAgICAgICAgaW50IG1heExvY2FscyA9IHJlYWRTaG9ydCgpOyAvLyBtYXggbG9jYWxzCi0KLSAgICAgICAgTWV0aG9kSW5mbyBpbmZvID0gbmV3IE1ldGhvZEluZm8obWF4TG9jYWxzKTsKLSAgICAgICAgaWYgKG1ldGhvZHMgIT0gbnVsbCAmJiBtZXRob2ROYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1ldGhvZHMucHV0KG1ldGhvZE5hbWUsIGluZm8pOwotICAgICAgICB9Ci0KLSAgICAgICAgc2tpcEZ1bGx5KHJlYWRJbnQoKSk7IC8vIGNvZGUKLSAgICAgICAgc2tpcEZ1bGx5KDggKiByZWFkU2hvcnQoKSk7IC8vIGV4Y2VwdGlvbiB0YWJsZQotICAgICAgICAvLyByZWFkIHRoZSBjb2RlIGF0dHJpYnV0ZXMgKHJlY3Vyc2l2ZSkuICBUaGlzIGlzIHdoZXJlCi0gICAgICAgIC8vIHdlIHdpbGwgZmluZCB0aGUgTG9jYWxWYXJpYWJsZVRhYmxlIGF0dHJpYnV0ZS4KLSAgICAgICAgcmVhZEF0dHJpYnV0ZXMoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuYW1lcyBvZiB0aGUgZGVjbGFyZWQgcGFyYW1ldGVycyBmb3IgdGhlIGdpdmVuIGNvbnN0cnVjdG9yLgotICAgICAqIElmIHdlIGNhbm5vdCBkZXRlcm1pbmUgdGhlIG5hbWVzLCByZXR1cm4gbnVsbC4gIFRoZSByZXR1cm5lZCBhcnJheSB3aWxsCi0gICAgICogaGF2ZSBvbmUgbmFtZSBwZXIgcGFyYW1ldGVyLiAgVGhlIGxlbmd0aCBvZiB0aGUgYXJyYXkgd2lsbCBiZSB0aGUgc2FtZQotICAgICAqIGFzIHRoZSBsZW5ndGggb2YgdGhlIENsYXNzW10gYXJyYXkgcmV0dXJuZWQgYnkgQ29uc3RydWN0b3IuZ2V0UGFyYW1ldGVyVHlwZXMoKS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjdG9yCi0gICAgICogQHJldHVybiBSZXR1cm5zIFN0cmluZ1tdIGFycmF5IG9mIG5hbWVzLCBvbmUgcGVyIHBhcmFtZXRlciwgb3IgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRQYXJhbWV0ZXJOYW1lcyhDb25zdHJ1Y3RvciBjdG9yKSB7Ci0gICAgICAgIHBhcmFtVHlwZXMgPSBjdG9yLmdldFBhcmFtZXRlclR5cGVzKCk7Ci0gICAgICAgIHJldHVybiBnZXRQYXJhbWV0ZXJOYW1lcyhjdG9yLCBwYXJhbVR5cGVzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuYW1lcyBvZiB0aGUgZGVjbGFyZWQgcGFyYW1ldGVycyBmb3IgdGhlIGdpdmVuIG1ldGhvZC4KLSAgICAgKiBJZiB3ZSBjYW5ub3QgZGV0ZXJtaW5lIHRoZSBuYW1lcywgcmV0dXJuIG51bGwuICBUaGUgcmV0dXJuZWQgYXJyYXkgd2lsbAotICAgICAqIGhhdmUgb25lIG5hbWUgcGVyIHBhcmFtZXRlci4gIFRoZSBsZW5ndGggb2YgdGhlIGFycmF5IHdpbGwgYmUgdGhlIHNhbWUKLSAgICAgKiBhcyB0aGUgbGVuZ3RoIG9mIHRoZSBDbGFzc1tdIGFycmF5IHJldHVybmVkIGJ5IE1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpLgotICAgICAqCi0gICAgICogQHBhcmFtIG1ldGhvZAotICAgICAqIEByZXR1cm4gUmV0dXJucyBTdHJpbmdbXSBhcnJheSBvZiBuYW1lcywgb25lIHBlciBwYXJhbWV0ZXIsIG9yIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0UGFyYW1ldGVyTmFtZXMoTWV0aG9kIG1ldGhvZCkgewotICAgICAgICBwYXJhbVR5cGVzID0gbWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCk7Ci0gICAgICAgIHJldHVybiBnZXRQYXJhbWV0ZXJOYW1lcyhtZXRob2QsIHBhcmFtVHlwZXMpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmdbXSBnZXRQYXJhbWV0ZXJOYW1lcyhNZW1iZXIgbWVtYmVyLCBDbGFzcyBbXSBwYXJhbVR5cGVzKSB7Ci0gICAgICAgIC8vIGxvb2sgdXAgdGhlIG5hbWVzIGZvciB0aGlzIG1ldGhvZAotICAgICAgICBNZXRob2RJbmZvIGluZm8gPSAoTWV0aG9kSW5mbykgbWV0aG9kcy5nZXQoZ2V0U2lnbmF0dXJlKG1lbWJlciwgcGFyYW1UeXBlcykpOwotCi0gICAgICAgIC8vIHdlIGtub3cgYWxsIHRoZSBsb2NhbCB2YXJpYWJsZSBuYW1lcywgYnV0IHdlIG9ubHkgbmVlZCB0byByZXR1cm4KLSAgICAgICAgLy8gdGhlIG5hbWVzIG9mIHRoZSBwYXJhbWV0ZXJzLgotCi0gICAgICAgIGlmIChpbmZvICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZ1tdIHBhcmFtTmFtZXMgPSBuZXcgU3RyaW5nW3BhcmFtVHlwZXMubGVuZ3RoXTsKLSAgICAgICAgICAgIGludCBqID0gTW9kaWZpZXIuaXNTdGF0aWMobWVtYmVyLmdldE1vZGlmaWVycygpKSA/IDAgOiAxOwotCi0gICAgICAgICAgICBib29sZWFuIGZvdW5kID0gZmFsc2U7ICAvLyBkaWQgd2UgZmluZCBhbnkgbm9uLW51bGwgbmFtZXMKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1OYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChpbmZvLm5hbWVzW2pdICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWVzW2ldID0gaW5mby5uYW1lc1tqXTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaisrOwotICAgICAgICAgICAgICAgIGlmIChwYXJhbVR5cGVzW2ldID09IGRvdWJsZS5jbGFzcyB8fCBwYXJhbVR5cGVzW2ldID09IGxvbmcuY2xhc3MpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gc2tpcCBhIHNsb3QgZm9yIDY0Yml0IHBhcmFtcwotICAgICAgICAgICAgICAgICAgICBqKys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoZm91bmQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcGFyYW1OYW1lczsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE1ldGhvZEluZm8gewotICAgICAgICBTdHJpbmdbXSBuYW1lczsKLSAgICAgICAgaW50IG1heExvY2FsczsKLQotICAgICAgICBwdWJsaWMgTWV0aG9kSW5mbyhpbnQgbWF4TG9jYWxzKSB7Ci0gICAgICAgICAgICB0aGlzLm1heExvY2FscyA9IG1heExvY2FsczsKLSAgICAgICAgICAgIG5hbWVzID0gbmV3IFN0cmluZ1ttYXhMb2NhbHNdOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBNZXRob2RJbmZvIGdldE1ldGhvZEluZm8oKSB7Ci0gICAgICAgIE1ldGhvZEluZm8gaW5mbyA9IG51bGw7Ci0gICAgICAgIGlmIChtZXRob2RzICE9IG51bGwgJiYgbWV0aG9kTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbmZvID0gKE1ldGhvZEluZm8pIG1ldGhvZHMuZ2V0KG1ldGhvZE5hbWUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpbmZvOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgaXMgaW52b2tlZCB3aGVuIGEgTG9jYWxWYXJpYWJsZVRhYmxlIGF0dHJpYnV0ZSBpcyBlbmNvdW50ZXJlZC4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZWFkTG9jYWxWYXJpYWJsZVRhYmxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaW50IGxlbiA9IHJlYWRTaG9ydCgpOyAvLyB0YWJsZSBsZW5ndGgKLSAgICAgICAgTWV0aG9kSW5mbyBpbmZvID0gZ2V0TWV0aG9kSW5mbygpOwotICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGxlbjsgaisrKSB7Ci0gICAgICAgICAgICByZWFkU2hvcnQoKTsgLy8gc3RhcnQgcGMKLSAgICAgICAgICAgIHJlYWRTaG9ydCgpOyAvLyBsZW5ndGgKLSAgICAgICAgICAgIGludCBuYW1lSW5kZXggPSByZWFkU2hvcnQoKTsgLy8gbmFtZV9pbmRleAotICAgICAgICAgICAgcmVhZFNob3J0KCk7IC8vIGRlc2NyaXB0b3JfaW5kZXgKLSAgICAgICAgICAgIGludCBpbmRleCA9IHJlYWRTaG9ydCgpOyAvLyBsb2NhbCBpbmRleAotICAgICAgICAgICAgaWYgKGluZm8gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGluZm8ubmFtZXNbaW5kZXhdID0gcmVzb2x2ZVV0ZjgobmFtZUluZGV4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kaXNwYXRjaGVycy9BYnN0cmFjdE9wZXJhdGlvbkRpc3BhdGNoZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kaXNwYXRjaGVycy9BYnN0cmFjdE9wZXJhdGlvbkRpc3BhdGNoZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk2ZGM5My4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGlzcGF0Y2hlcnMvQWJzdHJhY3RPcGVyYXRpb25EaXNwYXRjaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5IYW5kbGVyRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5oYW5kbGVycy5BYnN0cmFjdEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pMThuLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5Mb2dnaW5nQ29udHJvbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuV1NETENvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0T3BlcmF0aW9uRGlzcGF0Y2hlciBleHRlbmRzIEFic3RyYWN0SGFuZGxlciB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FID0gIkFic3RyYWN0T3BlcmF0aW9uRGlzcGF0Y2hlciI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEFic3RyYWN0T3BlcmF0aW9uRGlzcGF0Y2hlci5jbGFzcyk7Ci0KLSAgICBwdWJsaWMgQWJzdHJhY3RPcGVyYXRpb25EaXNwYXRjaGVyKCkgewotICAgICAgICBpbml0KG5ldyBIYW5kbGVyRGVzY3JpcHRpb24oTkFNRSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCBieSBBeGlzIEVuZ2luZSB0byBmaW5kIHRoZSBvcGVyYXRpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2VydmljZQotICAgICAqIEBwYXJhbSBtZXNzYWdlQ29udGV4dAotICAgICAqIEByZXR1cm4gUmV0dXJucyBBeGlzT3BlcmF0aW9uLgotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0Ci0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IEF4aXNPcGVyYXRpb24gZmluZE9wZXJhdGlvbihBeGlzU2VydmljZSBzZXJ2aWNlLCBNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCkKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQ7Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBpbml0RGlzcGF0Y2hlcigpOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIG1zZ2N0eAotICAgICAqIEB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQKLSAgICAgKi8KLSAgICBwdWJsaWMgSW52b2NhdGlvblJlc3BvbnNlIGludm9rZShNZXNzYWdlQ29udGV4dCBtc2djdHgpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBpZiAoKG1zZ2N0eC5nZXRBeGlzU2VydmljZSgpICE9IG51bGwpICYmIChtc2djdHguZ2V0QXhpc09wZXJhdGlvbigpID09IG51bGwpKSB7Ci0gICAgICAgICAgICBBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb24gPSBmaW5kT3BlcmF0aW9uKG1zZ2N0eC5nZXRBeGlzU2VydmljZSgpLCBtc2djdHgpOwotCi0gICAgICAgICAgICBpZiAoYXhpc09wZXJhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQgJiYgbG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKG1zZ2N0eC5nZXRMb2dJRFN0cmluZygpICsgIiAiICsgTWVzc2FnZXMuZ2V0TWVzc2FnZSgib3BlcmF0aW9uZm91bmQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNPcGVyYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBtc2djdHguc2V0QXhpc09wZXJhdGlvbihheGlzT3BlcmF0aW9uKTsKLSAgICAgICAgICAgICAgICAvL3NldHRpbmcgYXhpc01lc3NhZ2UgaW50byBtZXNzYWdlQ29udGV4dAotICAgICAgICAgICAgICAgIG1zZ2N0eC5zZXRBeGlzTWVzc2FnZShheGlzT3BlcmF0aW9uLmdldE1lc3NhZ2UoCi0gICAgICAgICAgICAgICAgICAgICAgICBXU0RMQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfSU5fVkFMVUUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gSW52b2NhdGlvblJlc3BvbnNlLkNPTlRJTlVFOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kaXNwYXRjaGVycy9BYnN0cmFjdFNlcnZpY2VEaXNwYXRjaGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGlzcGF0Y2hlcnMvQWJzdHJhY3RTZXJ2aWNlRGlzcGF0Y2hlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZGZjMDlmLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kaXNwYXRjaGVycy9BYnN0cmFjdFNlcnZpY2VEaXNwYXRjaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkhhbmRsZXJEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmhhbmRsZXJzLkFic3RyYWN0SGFuZGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmkxOG4uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLkxvZ2dpbmdDb250cm9sOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RTZXJ2aWNlRGlzcGF0Y2hlciBleHRlbmRzIEFic3RyYWN0SGFuZGxlciB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FID0gIkFic3RyYWN0U2VydmljZURpc3BhdGNoZXIiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhBYnN0cmFjdFNlcnZpY2VEaXNwYXRjaGVyLmNsYXNzKTsKLQotICAgIHB1YmxpYyBBYnN0cmFjdFNlcnZpY2VEaXNwYXRjaGVyKCkgewotICAgICAgICBpbml0KG5ldyBIYW5kbGVyRGVzY3JpcHRpb24oTkFNRSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCBieSBBeGlzIEVuZ2luZSB0byBmaW5kIHRoZSBzZXJ2aWNlLgotICAgICAqCi0gICAgICogQHBhcmFtIG1lc3NhZ2VDb250ZXh0Ci0gICAgICogQHJldHVybiBSZXR1cm5zIEF4aXNTZXJ2aWNlLgotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0Ci0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IEF4aXNTZXJ2aWNlIGZpbmRTZXJ2aWNlKE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0KSB0aHJvd3MgQXhpc0ZhdWx0OwotCi0gICAgcHVibGljIGFic3RyYWN0IHZvaWQgaW5pdERpc3BhdGNoZXIoKTsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBtc2djdHgKLSAgICAgKiBAdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0Ci0gICAgICovCi0gICAgcHVibGljIEludm9jYXRpb25SZXNwb25zZSBpbnZva2UoTWVzc2FnZUNvbnRleHQgbXNnY3R4KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UgPSBtc2djdHguZ2V0QXhpc1NlcnZpY2UoKTsKLQotICAgICAgICBpZiAoYXhpc1NlcnZpY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgYXhpc1NlcnZpY2UgPSBmaW5kU2VydmljZShtc2djdHgpOwotCi0gICAgICAgICAgICBpZiAoYXhpc1NlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkICYmIGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1Zyhtc2djdHguZ2V0TG9nSURTdHJpbmcoKSArICIgIiArIE1lc3NhZ2VzLmdldE1lc3NhZ2UoInNlcnZpY2Vmb3VuZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpc1NlcnZpY2UuZ2V0TmFtZSgpKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1zZ2N0eC5zZXRBeGlzU2VydmljZShheGlzU2VydmljZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEludm9jYXRpb25SZXNwb25zZS5DT05USU5VRTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGlzcGF0Y2hlcnMvQWN0aW9uQmFzZWRPcGVyYXRpb25EaXNwYXRjaGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGlzcGF0Y2hlcnMvQWN0aW9uQmFzZWRPcGVyYXRpb25EaXNwYXRjaGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3ZGJjNWYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rpc3BhdGNoZXJzL0FjdGlvbkJhc2VkT3BlcmF0aW9uRGlzcGF0Y2hlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uSGFuZGxlckRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5Mb2dnaW5nQ29udHJvbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLXB1YmxpYyBjbGFzcyBBY3Rpb25CYXNlZE9wZXJhdGlvbkRpc3BhdGNoZXIgZXh0ZW5kcyBBYnN0cmFjdE9wZXJhdGlvbkRpc3BhdGNoZXIgewotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRSA9ICJBY3Rpb25CYXNlZE9wZXJhdGlvbkRpc3BhdGNoZXIiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhBY3Rpb25CYXNlZE9wZXJhdGlvbkRpc3BhdGNoZXIuY2xhc3MpOwotCi0gICAgcHVibGljIEF4aXNPcGVyYXRpb24gZmluZE9wZXJhdGlvbihBeGlzU2VydmljZSBzZXJ2aWNlLCBNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCkKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBTdHJpbmcgYWN0aW9uID0gbWVzc2FnZUNvbnRleHQuZ2V0U29hcEFjdGlvbigpOwotCi0gICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkICYmIGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcobWVzc2FnZUNvbnRleHQuZ2V0TG9nSURTdHJpbmcoKSArICIgQ2hlY2tpbmcgZm9yIE9wZXJhdGlvbiB1c2luZyBBY3Rpb24gOiAiICsKLSAgICAgICAgICAgICAgICAgICAgYWN0aW9uKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYWN0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIFJFVklFVzogU2hvdWxkIHdlIEZJUlNUIHRyeSB0byBmaW5kIGFuIG9wZXJhdGlvbiB0aGF0IGV4cGxpY2l0bHkgbWFwcGVkIHRoaXMgCi0gICAgICAgICAgICAvLyBTT0FQQWN0aW9uIGFzIGFuIGFsaWFzIGJ5IGNhbGxpbmc6IAotICAgICAgICAgICAgLy8gQXhpc09wZXJhdGlvbiBvcCA9IHNlcnZpY2UuZ2V0T3BlcmF0aW9uQnlBY3Rpb24oYWN0aW9uKTsKLSAgICAgICAgICAgIC8vIEFuZCBUSEVOLCBpZiB3ZSBkaWRuJ3QgZmluZCBhbiBleHBsaWNpdCBtYXBwaW5nIG9mIHRoaXMgYWN0aW9uLCBzZWUgaWYgdGhlcmUncyBhbiAKLSAgICAgICAgICAgIC8vIG9wZXJhdGlvbiB0aGF0IGhhcyB0aGUgc2FtZSBuYW1lIGFzIHRoZSBhY3Rpb24sIGFuZCByb3V0ZSB0byB0aGF0IGJ5IGNhbGxpbmc6Ci0gICAgICAgICAgICAvLyBzZXJ2aWNlLmdldE9wZXJhdGlvbkJ5U09BUEFjdGlvbihhY3Rpb24pOwotICAgICAgICAgICAgQXhpc09wZXJhdGlvbiBvcCA9IHNlcnZpY2UuZ2V0T3BlcmF0aW9uQnlTT0FQQWN0aW9uKGFjdGlvbik7Ci0gICAgICAgICAgICBpZiAob3AgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG9wID0gc2VydmljZS5nZXRPcGVyYXRpb25CeUFjdGlvbihhY3Rpb24pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogSEFDSzogUGxlYXNlIHJlbW92ZSB0aGlzIHdoZW4gd2UgYWRkIHN1cHBvcnQgZm9yIGN1c3RvbSBhY3Rpb24KLSAgICAgICAgICAgICAqIHVyaQotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAoKG9wID09IG51bGwpICYmIChhY3Rpb24ubGFzdEluZGV4T2YoJy8nKSAhPSAtMSkpIHsKLSAgICAgICAgICAgICAgICBvcCA9IHNlcnZpY2UuZ2V0T3BlcmF0aW9uKG5ldyBRTmFtZShhY3Rpb24uc3Vic3RyaW5nKGFjdGlvbi5sYXN0SW5kZXhPZignLycpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uLmxlbmd0aCgpKSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gb3A7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbml0RGlzcGF0Y2hlcigpIHsKLSAgICAgICAgaW5pdChuZXcgSGFuZGxlckRlc2NyaXB0aW9uKE5BTUUpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGlzcGF0Y2hlcnMvQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rpc3BhdGNoZXJzL0FkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNiYTRlYS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGlzcGF0Y2hlcnMvQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVyczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5BZGRyZXNzaW5nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5BZGRyZXNzaW5nRmF1bHRzSGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuT3BlcmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuU2VydmljZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LlNlcnZpY2VHcm91cENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5IYW5kbGVyRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQWJzdHJhY3REaXNwYXRjaGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaTE4bi5NZXNzYWdlczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuSmF2YVV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5Mb2dnaW5nQ29udHJvbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotLyoqCi0gKiBEaXNwYXRjaGVyIGJhc2VkIG9uIHRoZSBXUy1BZGRyZXNzaW5nIHByb3BlcnRpZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBBZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIGV4dGVuZHMgQWJzdHJhY3REaXNwYXRjaGVyIGltcGxlbWVudHMgQWRkcmVzc2luZ0NvbnN0YW50cyB7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBOQU1FCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRSA9ICJBZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlci5jbGFzcyk7Ci0gICAgcHJpdmF0ZSBSZXF1ZXN0VVJJQmFzZWRTZXJ2aWNlRGlzcGF0Y2hlciBydWJzZCA9IG5ldyBSZXF1ZXN0VVJJQmFzZWRTZXJ2aWNlRGlzcGF0Y2hlcigpOwotICAgIHByaXZhdGUgQWN0aW9uQmFzZWRPcGVyYXRpb25EaXNwYXRjaGVyIGFib2QgPSBuZXcgQWN0aW9uQmFzZWRPcGVyYXRpb25EaXNwYXRjaGVyKCk7Ci0KLSAgICBwdWJsaWMgQXhpc09wZXJhdGlvbiBmaW5kT3BlcmF0aW9uKEF4aXNTZXJ2aWNlIHNlcnZpY2UsIE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0KQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIHJldHVybiBhYm9kLmZpbmRPcGVyYXRpb24oc2VydmljZSwgbWVzc2FnZUNvbnRleHQpOwotICAgIH0KLQotICAgIHB1YmxpYyBBeGlzU2VydmljZSBmaW5kU2VydmljZShNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgCXJldHVybiBydWJzZC5maW5kU2VydmljZShtZXNzYWdlQ29udGV4dCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaW5pdERpc3BhdGNoZXIoKSB7Ci0gICAgICAgIGluaXQobmV3IEhhbmRsZXJEZXNjcmlwdGlvbihOQU1FKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIG1zZ2N0eAotICAgICAqIEB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQKLSAgICAgKiBAbm9pbnNwZWN0aW9uIE1ldGhvZFJldHVybk9mQ29uY3JldGVDbGFzcwotICAgICAqLwotICAgIHB1YmxpYyBJbnZvY2F0aW9uUmVzcG9uc2UgaW52b2tlKE1lc3NhZ2VDb250ZXh0IG1zZ2N0eCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIEludm9jYXRpb25SZXNwb25zZSByZXNwb25zZSA9IEludm9jYXRpb25SZXNwb25zZS5DT05USU5VRTsKLSAgICAgICAgCi0gICAgICAgIC8vIGZpcnN0IGNoZWNrIHdlIGNhbiBkaXNwYXRjaCB1c2luZyB0aGUgcmVsYXRlcyB0bwotICAgICAgICBpZiAobXNnY3R4LmdldFJlbGF0ZXNUbygpICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyByZWxhdGVzVG8gPSBtc2djdHguZ2V0UmVsYXRlc1RvKCkuZ2V0VmFsdWUoKTsKLQotICAgICAgICAgICAgaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQgJiYgbG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcobXNnY3R4LmdldExvZ0lEU3RyaW5nKCkgKyAiICIgKyBNZXNzYWdlcy5nZXRNZXNzYWdlKCJjaGVja2luZ3JlbGF0ZXN0byIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGVzVG8pKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChyZWxhdGVzVG8gIT0gbnVsbCAmJiAhIiIuZXF1YWxzKHJlbGF0ZXNUbykgJiYgKG1zZ2N0eC5nZXRPcGVyYXRpb25Db250ZXh0KCk9PW51bGwpKSB7Ci0gICAgICAgICAgICAgICAgT3BlcmF0aW9uQ29udGV4dCBvcGVyYXRpb25Db250ZXh0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1zZ2N0eC5nZXRDb25maWd1cmF0aW9uQ29udGV4dCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRPcGVyYXRpb25Db250ZXh0KHJlbGF0ZXNUbyk7Ci0KLSAgICAgICAgICAgICAgICBpZiAob3BlcmF0aW9uQ29udGV4dCAhPSBudWxsKSAvL25vaW5zcGVjdGlvbiBUb2RvQ29tbWVudAotICAgICAgICAgICAgICAgIHsKLS8vICAgICAgICAgICAgICAgICAgICBpZihvcGVyYXRpb25Db250ZXh0LmlzQ29tcGxldGUoKSl7Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBkaXNwYXRjaCBoYXBwZW5zIGJlY2F1c2Ugb2YgdGhlIFJlbGF0ZXNUbyBhbmQgdGhlIG1lcCBpcyBjb21wbGV0ZQotLy8gICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBzaG91bGQgdGhyb3cgYSBtb3JlIGRlc2NyaXB0aXZlIGZhdWx0LgotLy8gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KE1lc3NhZ2VzLmdldE1lc3NhZ2UoImR1cGxpY2F0ZXJlbGF0ZXN0byIscmVsYXRlc1RvKSk7Ci0vLyAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtc2djdHguc2V0QXhpc09wZXJhdGlvbihvcGVyYXRpb25Db250ZXh0LmdldEF4aXNPcGVyYXRpb24oKSk7Ci0gICAgICAgICAgICAgICAgICAgIG1zZ2N0eC5zZXRPcGVyYXRpb25Db250ZXh0KG9wZXJhdGlvbkNvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICBtc2djdHguc2V0U2VydmljZUNvbnRleHQoKFNlcnZpY2VDb250ZXh0KSBvcGVyYXRpb25Db250ZXh0LmdldFBhcmVudCgpKTsKLSAgICAgICAgICAgICAgICAgICAgbXNnY3R4LnNldEF4aXNTZXJ2aWNlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU2VydmljZUNvbnRleHQpIG9wZXJhdGlvbkNvbnRleHQuZ2V0UGFyZW50KCkpLmdldEF4aXNTZXJ2aWNlKCkpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIFRPRE8gOiBJcyB0aGlzIG5lY2Vzc2FyeSBoZXJlPwotICAgICAgICAgICAgICAgICAgICBtc2djdHguZ2V0QXhpc09wZXJhdGlvbigpLnJlZ2lzdGVyTWVzc2FnZUNvbnRleHQobXNnY3R4LCBvcGVyYXRpb25Db250ZXh0KTsKLQotICAgICAgICAgICAgICAgICAgICBtc2djdHguc2V0U2VydmljZUdyb3VwQ29udGV4dElkKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU2VydmljZUdyb3VwQ29udGV4dCkgbXNnY3R4LmdldFNlcnZpY2VDb250ZXh0KCkuZ2V0UGFyZW50KCkpLmdldElkKCkpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkICYmIGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcobXNnY3R4LmdldExvZ0lEU3RyaW5nKCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIERpc3BhdGNoZWQgc3VjY2Vzc2Z1bGx5IG9uIHRoZSBSZWxhdGVzVG8uIG9wZXJhdGlvbj0iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uQ29udGV4dC5nZXRBeGlzT3BlcmF0aW9uKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vRWxzZSB3ZSB3aWxsIHRyeSB0byBkaXNwYXRjaCBiYXNlZCBvbiB0aGUgV1MtQSBBY3Rpb24KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICByZXNwb25zZSA9IHN1cGVyLmludm9rZShtc2djdHgpOwotICAgICAgICAgICAgT2JqZWN0IGZsYWcgPSBtc2djdHguZ2V0TG9jYWxQcm9wZXJ0eShJU19BRERSX0lORk9fQUxSRUFEWV9QUk9DRVNTRUQpOwotICAgICAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLnRyYWNlKCJpbnZva2U6IElTX0FERFJfSU5GT19BTFJFQURZX1BST0NFU1NFRD0iICsgZmxhZyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChKYXZhVXRpbHMuaXNUcnVlRXhwbGljaXRseShmbGFnKSkgewotICAgICAgICAgICAgICAgIC8vIElmIG5vIEF4aXNPcGVyYXRpb24gaGFzIGJlZW4gZm91bmQgYXQgdGhlIGVuZCBvZiB0aGUgZGlzcGF0Y2ggcGhhc2UgYW5kIGFkZHJlc3NpbmcKLSAgICAgICAgICAgICAgICAvLyBpcyBpbiB1c2Ugd2Ugc2hvdWxkIHRocm93IGFuIEFjdGlvbk5vdFN1cHBvcnRlZCBGYXVsdCwgdW5sZXNzIHdlJ3ZlIGJlZW4gdG9sZAotICAgICAgICAgICAgICAgIC8vIG5vdCB0byBkbyB0aGlzIGNoZWNrIChieSBTeW5hcHNlLCBmb3IgaW5zdGFuY2UpCi0gICAgICAgICAgICAgICAgaWYgKEphdmFVdGlscy5pc1RydWUobXNnY3R4LmdldFByb3BlcnR5KEFERFJfVkFMSURBVEVfQUNUSU9OKSwgdHJ1ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgY2hlY2tBY3Rpb24obXNnY3R4KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiByZXNwb25zZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogSWYgYWRkcmVzc2luZyB3YXMgZm91bmQgYW5kIHRoZSBkaXNwYXRjaCBmYWlsZWQgd2UgU0hPVUxEIChhbmQgaGVuY2Ugd2lsbCkgcmV0dXJuIGEKLSAgICAgKiBXUy1BZGRyZXNzaW5nIEFjdGlvbk5vdFN1cHBvcnRlZCBmYXVsdC4gVGhpcyB3aWxsIG1ha2UgbW9yZSBzZW5zZSBvbmNlIHRoZQotICAgICAqIEFkZHJlc3NpbmdCYXNlZERzaXBhdGNoZXIgaXMgbW92ZWQgaW50byB0aGUgYWRkcmVzc2luZyBtb2R1bGUKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tBY3Rpb24oTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIGlmICgobXNnQ29udGV4dC5nZXRBeGlzU2VydmljZSgpID09IG51bGwpIHx8IChtc2dDb250ZXh0LmdldEF4aXNPcGVyYXRpb24oKSA9PSBudWxsKSkgewotICAgICAgICAgICAgQWRkcmVzc2luZ0ZhdWx0c0hlbHBlcgotICAgICAgICAgICAgICAgICAgICAudHJpZ2dlckFjdGlvbk5vdFN1cHBvcnRlZEZhdWx0KG1zZ0NvbnRleHQsIG1zZ0NvbnRleHQuZ2V0V1NBQWN0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rpc3BhdGNoZXJzL0hUVFBMb2NhdGlvbkJhc2VkRGlzcGF0Y2hlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rpc3BhdGNoZXJzL0hUVFBMb2NhdGlvbkJhc2VkRGlzcGF0Y2hlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjBiOTBjLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kaXNwYXRjaGVycy9IVFRQTG9jYXRpb25CYXNlZERpc3BhdGNoZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVyczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNFbmRwb2ludDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkhhbmRsZXJEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLldTREwyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkFic3RyYWN0RGlzcGF0Y2hlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkhUVFBDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBEaXNwYXRjaGVzIHRoZSBvcGVyYXRpb24gYmFzZWQgb24gdGhlIGluZm9ybWF0aW9uIGZyb20gdGhlIHRhcmdldCBlbmRwb2ludCBVUkwuCi0gKi8KLXB1YmxpYyBjbGFzcyBIVFRQTG9jYXRpb25CYXNlZERpc3BhdGNoZXIgZXh0ZW5kcyBBYnN0cmFjdERpc3BhdGNoZXIgewotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRSA9ICJIVFRQTG9jYXRpb25CYXNlZERpc3BhdGNoZXIiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhIVFRQTG9jYXRpb25CYXNlZERpc3BhdGNoZXIuY2xhc3MpOwotCi0gICAgLyoKLSAgICAgKiAgKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQWJzdHJhY3REaXNwYXRjaGVyI2ZpbmRPcGVyYXRpb24ob3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZSwgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0KQotICAgICAqLwotICAgIHB1YmxpYyBBeGlzT3BlcmF0aW9uIGZpbmRPcGVyYXRpb24oQXhpc1NlcnZpY2Ugc2VydmljZSwgTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQpCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLQotICAgICAgICBBeGlzU2VydmljZSBheGlzU2VydmljZSA9IG1lc3NhZ2VDb250ZXh0LmdldEF4aXNTZXJ2aWNlKCk7Ci0gICAgICAgIGlmIChheGlzU2VydmljZSAhPSBudWxsICYmIG1lc3NhZ2VDb250ZXh0LmdldFRvKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIHVyaSA9IG1lc3NhZ2VDb250ZXh0LmdldFRvKCkuZ2V0QWRkcmVzcygpOwotICAgICAgICAgICAgU3RyaW5nIGh0dHBMb2NhdGlvbiA9IHBhcnNlUmVxdWVzdFVSTCh1cmksIG1lc3NhZ2VDb250ZXh0Ci0gICAgICAgICAgICAgICAgICAgIC5nZXRDb25maWd1cmF0aW9uQ29udGV4dCgpLmdldFNlcnZpY2VDb250ZXh0UGF0aCgpKTsKLSAgICAgICAgICAgIFN0cmluZyBodHRwTWV0aG9kID0gKFN0cmluZykgbWVzc2FnZUNvbnRleHQuZ2V0UHJvcGVydHkoSFRUUENvbnN0YW50cy5IVFRQX01FVEhPRCk7Ci0KLSAgICAgICAgICAgIGlmIChodHRwTG9jYXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGh0dHBMb2NhdGlvbiA9IGh0dHBNZXRob2QgKyBodHRwTG9jYXRpb247Ci0gICAgICAgICAgICAgICAgQXhpc0VuZHBvaW50IGF4aXNFbmRwb2ludCA9IChBeGlzRW5kcG9pbnQpIG1lc3NhZ2VDb250ZXh0Ci0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UHJvcGVydHkoV1NETDJDb25zdGFudHMuRU5EUE9JTlRfTE9DQUxfTkFNRSk7Ci0gICAgICAgICAgICAgICAgLy8gSGVyZSB3ZSBjaGVjayB3aGV0aGVyIHRoZSByZXF1ZXN0IHdhcyBkaXNwYXRjaGVkIHRvIHRoZSBjb3JyZWN0IGVuZHBvaW50LiBJZiBpdAotICAgICAgICAgICAgICAgIC8vIHdhcyB3ZSBjYW4gZGlzcGF0Y2ggdGhlIG9wZXJhdGlvbiB1c2luZyB0aGUgSFRUUExvY2F0aW9uRGlzcGF0Y2hlciB0YWJsZSBvZiB0aGF0Ci0gICAgICAgICAgICAgICAgLy8gc3BlY2lmaWMgZW5kcG9pbnQuIAotICAgICAgICAgICAgICAgIGlmIChheGlzRW5kcG9pbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBNYXAgaHR0cExvY2F0aW9uVGFibGUgPSAoTWFwKSBheGlzRW5kcG9pbnQuZ2V0QmluZGluZygpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KFdTREwyQ29uc3RhbnRzLkhUVFBfTE9DQVRJT05fVEFCTEUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoaHR0cExvY2F0aW9uVGFibGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldE9wZXJhdGlvbkZyb21IVFRQTG9jYXRpb24oaHR0cExvY2F0aW9uLCBodHRwTG9jYXRpb25UYWJsZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IAotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkF0dGVtcHQgdG8gY2hlY2sgZm9yIE9wZXJhdGlvbiB1c2luZyBIVFRQIExvY2F0aW9uIGZhaWxlZCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qCi0gICAgICogIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkFic3RyYWN0RGlzcGF0Y2hlciNmaW5kU2VydmljZShvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQpCi0gICAgICovCi0gICAgcHVibGljIEF4aXNTZXJ2aWNlIGZpbmRTZXJ2aWNlKE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgLy8gVGhpcyBEaXNwYXRjaGVyIGRvZXMgbm90IG5lZWQgdG8gcmVzb2x2ZSB0aGUgc2VydmljZSwgYXMgdGhhdCBpcyBoYW5kbGVkCi0gICAgICAgIC8vIGJ5IHRoZSBSZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyLgotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbml0RGlzcGF0Y2hlcigpIHsKLSAgICAgICAgaW5pdChuZXcgSGFuZGxlckRlc2NyaXB0aW9uKE5BTUUpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBwYXJzZVJlcXVlc3RVUkwoU3RyaW5nIHBhdGgsIFN0cmluZyBzZXJ2aWNlUGF0aCkgewotCi0gICAgICAgIGludCBpbmRleCA9IHBhdGgubGFzdEluZGV4T2Yoc2VydmljZVBhdGgpOwotICAgICAgICBTdHJpbmcgc2VydmljZSA9IG51bGw7Ci0KLSAgICAgICAgaWYgKC0xICE9IGluZGV4KSB7Ci0gICAgICAgICAgICBpbnQgc2VydmljZVN0YXJ0ID0gaW5kZXggKyBzZXJ2aWNlUGF0aC5sZW5ndGgoKTsKLSAgICAgICAgICAgIGlmIChwYXRoLmxlbmd0aCgpID4gc2VydmljZVN0YXJ0ICsgMSkgewotICAgICAgICAgICAgICAgIHNlcnZpY2UgPSBwYXRoLnN1YnN0cmluZyhzZXJ2aWNlU3RhcnQgKyAxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzZXJ2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGluZGV4ID0gc2VydmljZS5pbmRleE9mKCIvIik7Ci0gICAgICAgICAgICBpZiAoLTEgIT0gaW5kZXgpIHsKLSAgICAgICAgICAgICAgICBzZXJ2aWNlID0gc2VydmljZS5zdWJzdHJpbmcoaW5kZXgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpbnQgcXVlcnlJbmRleCA9IHNlcnZpY2UuaW5kZXhPZigiPyIpOwotICAgICAgICAgICAgICAgIGlmIChxdWVyeUluZGV4ICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNlcnZpY2UgPSBzZXJ2aWNlLnN1YnN0cmluZyhxdWVyeUluZGV4KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNlcnZpY2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2l2ZW4gdGhlIHJlcXVlc3RQYXRoIHRoYXQgdGhlIHJlcXVlc3QgY2FtZSB0byBoaXMgbWV0aG9kIHJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgYXhpc09wZXJhdGlvbgotICAgICAqCi0gICAgICogQHBhcmFtIHJlcXVlc3RQYXRoIC0gUGFydCBvZiB0aGUgcmVxdWVzdCB1cmwgd2hpY2ggaXMgdGhlIHBhcnQgYWZ0ZXIgdGhlIHNlcnZpY2UgbmFtZQotICAgICAqIEBwYXJhbSBodHRwTG9jYXRpb25UYWJsZSAtIFRoZSBodHRwTG9jYXRpb25UYWJsZSBzdG9yZWQgaW4gdGhlIHJlbGF2YW50IGJpbmRpbmcKLSAgICAgKiBAcmV0dXJuIEF4aXNPcGVyYXRpb24gLSBUaGUgY29ycmVzcG9uZGluZyBBeGlzT3BlcmF0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSBBeGlzT3BlcmF0aW9uIGdldE9wZXJhdGlvbkZyb21IVFRQTG9jYXRpb24oU3RyaW5nIHJlcXVlc3RQYXRoLCBNYXAgaHR0cExvY2F0aW9uVGFibGUpIHsKLQotICAgICAgICBDb2xsZWN0aW9uIGh0dHBMb2NhdGlvbnMgPSBodHRwTG9jYXRpb25UYWJsZS5rZXlTZXQoKTsKLSAgICAgICAgSXRlcmF0b3IgaXRlciA9IGh0dHBMb2NhdGlvbnMuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbG9jYXRpb24gPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIGludCBpbmRleCA9IHJlcXVlc3RQYXRoLmluZGV4T2YobG9jYXRpb24pOwotICAgICAgICAgICAgaWYgKGluZGV4ID09IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKEF4aXNPcGVyYXRpb24pIGh0dHBMb2NhdGlvblRhYmxlLmdldChsb2NhdGlvbik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGlzcGF0Y2hlcnMvUmVsYXRlc1RvQmFzZWRPcGVyYXRpb25EaXNwYXRjaGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGlzcGF0Y2hlcnMvUmVsYXRlc1RvQmFzZWRPcGVyYXRpb25EaXNwYXRjaGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmYWIxMmIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rpc3BhdGNoZXJzL1JlbGF0ZXNUb0Jhc2VkT3BlcmF0aW9uRGlzcGF0Y2hlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLlJlbGF0ZXNUbzsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5PcGVyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uSGFuZGxlckRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5Mb2dnaW5nQ29udHJvbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotcHVibGljIGNsYXNzIFJlbGF0ZXNUb0Jhc2VkT3BlcmF0aW9uRGlzcGF0Y2hlciBleHRlbmRzIEFic3RyYWN0T3BlcmF0aW9uRGlzcGF0Y2hlciB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FID0gIlJlbGF0ZXNUb0Jhc2VkT3BlcmF0aW9uRGlzcGF0Y2hlciI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFJlbGF0ZXNUb0Jhc2VkT3BlcmF0aW9uRGlzcGF0Y2hlci5jbGFzcyk7Ci0KLSAgICBwdWJsaWMgQXhpc09wZXJhdGlvbiBmaW5kT3BlcmF0aW9uKEF4aXNTZXJ2aWNlIHNlcnZpY2UsIE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0KQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIFJlbGF0ZXNUbyByZWxhdGVzVG8gPSBtZXNzYWdlQ29udGV4dC5nZXRSZWxhdGVzVG8oKTsKLSAgICAgICAgaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQgJiYgbG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhtZXNzYWdlQ29udGV4dC5nZXRMb2dJRFN0cmluZygpICsKLSAgICAgICAgICAgICAgICAgICAgIiBDaGVja2luZyBmb3IgT3BlcmF0aW9uQ29udGV4dCB1c2luZyBSZWxhdGVzVG8gOiAiICsgcmVsYXRlc1RvKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoKHJlbGF0ZXNUbyAhPSBudWxsKSAmJiAocmVsYXRlc1RvLmdldFZhbHVlKCkgIT0gbnVsbCkpIHsKLSAgICAgICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ3VyYXRpb25Db250ZXh0ID0gbWVzc2FnZUNvbnRleHQuZ2V0Q29uZmlndXJhdGlvbkNvbnRleHQoKTsKLSAgICAgICAgICAgIE9wZXJhdGlvbkNvbnRleHQgb3BlcmF0aW9uQ29udGV4dCA9Ci0gICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb25Db250ZXh0LmdldE9wZXJhdGlvbkNvbnRleHQocmVsYXRlc1RvLmdldFZhbHVlKCkpOwotICAgICAgICAgICAgaWYgKG9wZXJhdGlvbkNvbnRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkICYmIGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhtZXNzYWdlQ29udGV4dC5nZXRMb2dJRFN0cmluZygpICsgIiBGb3VuZCBPcGVyYXRpb25Db250ZXh0OiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25Db250ZXh0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG9wZXJhdGlvbkNvbnRleHQuZ2V0QXhpc09wZXJhdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGluaXREaXNwYXRjaGVyKCkgewotICAgICAgICBpbml0KG5ldyBIYW5kbGVyRGVzY3JpcHRpb24oTkFNRSkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kaXNwYXRjaGVycy9SZWxhdGVzVG9CYXNlZFNlcnZpY2VEaXNwYXRjaGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGlzcGF0Y2hlcnMvUmVsYXRlc1RvQmFzZWRTZXJ2aWNlRGlzcGF0Y2hlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjY1NGY3Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kaXNwYXRjaGVycy9SZWxhdGVzVG9CYXNlZFNlcnZpY2VEaXNwYXRjaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuUmVsYXRlc1RvOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk9wZXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkhhbmRsZXJEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuTG9nZ2luZ0NvbnRyb2w7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBSZWxhdGVzVG9CYXNlZFNlcnZpY2VEaXNwYXRjaGVyIGV4dGVuZHMgQWJzdHJhY3RTZXJ2aWNlRGlzcGF0Y2hlciB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FID0gIlJlbGF0ZXNUb0Jhc2VkU2VydmljZURpc3BhdGNoZXIiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhSZWxhdGVzVG9CYXNlZFNlcnZpY2VEaXNwYXRjaGVyLmNsYXNzKTsKLQotICAgIHB1YmxpYyBBeGlzU2VydmljZSBmaW5kU2VydmljZShNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIFJlbGF0ZXNUbyByZWxhdGVzVG8gPSBtZXNzYWdlQ29udGV4dC5nZXRSZWxhdGVzVG8oKTsKLSAgICAgICAgaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQgJiYgbG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhtZXNzYWdlQ29udGV4dC5nZXRMb2dJRFN0cmluZygpICsKLSAgICAgICAgICAgICAgICAgICAgIiBDaGVja2luZyBmb3IgT3BlcmF0aW9uQ29udGV4dCB1c2luZyBSZWxhdGVzVG8gOiAiICsgcmVsYXRlc1RvKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoKHJlbGF0ZXNUbyAhPSBudWxsKSAmJiAocmVsYXRlc1RvLmdldFZhbHVlKCkgIT0gbnVsbCkpIHsKLSAgICAgICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ3VyYXRpb25Db250ZXh0ID0gbWVzc2FnZUNvbnRleHQuZ2V0Q29uZmlndXJhdGlvbkNvbnRleHQoKTsKLSAgICAgICAgICAgIE9wZXJhdGlvbkNvbnRleHQgb3BlcmF0aW9uQ29udGV4dCA9Ci0gICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb25Db250ZXh0LmdldE9wZXJhdGlvbkNvbnRleHQocmVsYXRlc1RvLmdldFZhbHVlKCkpOwotICAgICAgICAgICAgaWYgKG9wZXJhdGlvbkNvbnRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkICYmIGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhtZXNzYWdlQ29udGV4dC5nZXRMb2dJRFN0cmluZygpICsgIiBGb3VuZCBPcGVyYXRpb25Db250ZXh0OiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25Db250ZXh0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG9wZXJhdGlvbkNvbnRleHQuZ2V0U2VydmljZUNvbnRleHQoKS5nZXRBeGlzU2VydmljZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGluaXREaXNwYXRjaGVyKCkgewotICAgICAgICBpbml0KG5ldyBIYW5kbGVyRGVzY3JpcHRpb24oTkFNRSkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kaXNwYXRjaGVycy9SZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGlzcGF0Y2hlcnMvUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGM5NjYzLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kaXNwYXRjaGVycy9SZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5IYW5kbGVyRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQWJzdHJhY3REaXNwYXRjaGVyOwotCi0vKioKLSAqIERpc3BhdGNoZXMgdGhlIHNlcnZpY2UgYmFzZWQgb24gdGhlIGluZm9ybWF0aW9uIGZyb20gdGhlIHRhcmdldCBlbmRwb2ludCBVUkwuCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIGV4dGVuZHMgQWJzdHJhY3REaXNwYXRjaGVyIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUUgPSAiUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciI7Ci0gICAgcHJpdmF0ZSBSZXF1ZXN0VVJJQmFzZWRTZXJ2aWNlRGlzcGF0Y2hlciBydWJzZCA9IG5ldyBSZXF1ZXN0VVJJQmFzZWRTZXJ2aWNlRGlzcGF0Y2hlcigpOwotICAgIAotICAgIC8qCi0gICAgICogIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkFic3RyYWN0RGlzcGF0Y2hlciNmaW5kT3BlcmF0aW9uKG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2UsIG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dCkKLSAgICAgKi8KLSAgICBwdWJsaWMgQXhpc09wZXJhdGlvbiBmaW5kT3BlcmF0aW9uKEF4aXNTZXJ2aWNlIHNlcnZpY2UsIE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0KQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIC8vIFRoaXMgRGlzcGF0Y2hlciBkb2VzIG5vdCBuZWVkIHRvIHJlc29sdmUgdGhlIG9wZXJhdGlvbiwgYXMgdGhhdCBpcyBoYW5kbGVkCi0gICAgICAgIC8vIGJ5IHRoZSBSZXF1ZXN0VVJJT3BlcmF0aW9uRGlzcGF0Y2hlci4KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAgKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQWJzdHJhY3REaXNwYXRjaGVyI2ZpbmRTZXJ2aWNlKG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dCkKLSAgICAgKi8KLSAgICBwdWJsaWMgQXhpc1NlcnZpY2UgZmluZFNlcnZpY2UoTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQpIHRocm93cyBBeGlzRmF1bHQgewotICAgIAlyZXR1cm4gcnVic2QuZmluZFNlcnZpY2UobWVzc2FnZUNvbnRleHQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGluaXREaXNwYXRjaGVyKCkgewotICAgICAgICBpbml0KG5ldyBIYW5kbGVyRGVzY3JpcHRpb24oTkFNRSkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kaXNwYXRjaGVycy9SZXF1ZXN0VVJJQmFzZWRPcGVyYXRpb25EaXNwYXRjaGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGlzcGF0Y2hlcnMvUmVxdWVzdFVSSUJhc2VkT3BlcmF0aW9uRGlzcGF0Y2hlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjU0ODU1Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kaXNwYXRjaGVycy9SZXF1ZXN0VVJJQmFzZWRPcGVyYXRpb25EaXNwYXRjaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVyczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5IYW5kbGVyRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLlV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotLyoqCi0gKiBEaXNwYXRjaGVzIHRoZSBvcGVyYXRpb24gYmFzZWQgb24gdGhlIGluZm9ybWF0aW9uIGZyb20gdGhlIHRhcmdldCBlbmRwb2ludCBVUkwuCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXF1ZXN0VVJJQmFzZWRPcGVyYXRpb25EaXNwYXRjaGVyIGV4dGVuZHMgQWJzdHJhY3RPcGVyYXRpb25EaXNwYXRjaGVyIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUUgPSAiUmVxdWVzdFVSSUJhc2VkT3BlcmF0aW9uRGlzcGF0Y2hlciI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFJlcXVlc3RVUklCYXNlZE9wZXJhdGlvbkRpc3BhdGNoZXIuY2xhc3MpOwotCi0gICAgLyoKLSAgICAgKiAgKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQWJzdHJhY3REaXNwYXRjaGVyI2ZpbmRPcGVyYXRpb24ob3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZSwgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0KQotICAgICAqLwotICAgIHB1YmxpYyBBeGlzT3BlcmF0aW9uIGZpbmRPcGVyYXRpb24oQXhpc1NlcnZpY2Ugc2VydmljZSwgTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQpCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLQotICAgICAgICBFbmRwb2ludFJlZmVyZW5jZSB0b0VQUiA9IG1lc3NhZ2VDb250ZXh0LmdldFRvKCk7Ci0gICAgICAgIGlmICh0b0VQUiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgZmlsZVBhcnQgPSB0b0VQUi5nZXRBZGRyZXNzKCk7Ci0gICAgICAgICAgICBTdHJpbmdbXSB2YWx1ZXMgPSBVdGlscy5wYXJzZVJlcXVlc3RVUkxGb3JTZXJ2aWNlQW5kT3BlcmF0aW9uKGZpbGVQYXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlQ29udGV4dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDb25maWd1cmF0aW9uQ29udGV4dCgpLmdldFNlcnZpY2VDb250ZXh0UGF0aCgpKTsKLQotICAgICAgICAgICAgaWYgKCh2YWx1ZXMubGVuZ3RoID49IDIpICYmICh2YWx1ZXNbMV0gIT0gbnVsbCkpIHsKLSAgICAgICAgICAgICAgICBRTmFtZSBvcGVyYXRpb25OYW1lID0gbmV3IFFOYW1lKHZhbHVlc1sxXSk7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKG1lc3NhZ2VDb250ZXh0LmdldExvZ0lEU3RyaW5nKCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgIiBDaGVja2luZyBmb3IgT3BlcmF0aW9uIHVzaW5nIFFOYW1lKHRhcmdldCBlbmRwb2ludCBVUkkgZnJhZ21lbnQpIDogIiArCi0gICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25OYW1lKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gc2VydmljZS5nZXRPcGVyYXRpb24ob3BlcmF0aW9uTmFtZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhtZXNzYWdlQ29udGV4dC5nZXRMb2dJRFN0cmluZygpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIgQXR0ZW1wdGVkIHRvIGNoZWNrIGZvciBPcGVyYXRpb24gdXNpbmcgdGFyZ2V0IGVuZHBvaW50IFVSSSwgYnV0IHRoZSBvcGVyYXRpb24gZnJhZ21lbnQgd2FzIG1pc3NpbmciKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhtZXNzYWdlQ29udGV4dC5nZXRMb2dJRFN0cmluZygpICsKLSAgICAgICAgICAgICAgICAgICAgIiBBdHRlbXB0ZWQgdG8gY2hlY2sgZm9yIE9wZXJhdGlvbiB1c2luZyBudWxsIHRhcmdldCBlbmRwb2ludCBVUkkiKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaW5pdERpc3BhdGNoZXIoKSB7Ci0gICAgICAgIGluaXQobmV3IEhhbmRsZXJEZXNjcmlwdGlvbihOQU1FKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rpc3BhdGNoZXJzL1JlcXVlc3RVUklCYXNlZFNlcnZpY2VEaXNwYXRjaGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGlzcGF0Y2hlcnMvUmVxdWVzdFVSSUJhc2VkU2VydmljZURpc3BhdGNoZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI5ZTdlMy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGlzcGF0Y2hlcnMvUmVxdWVzdFVSSUJhc2VkU2VydmljZURpc3BhdGNoZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uSGFuZGxlckRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uV1NETDJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0NvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLkxvZ2dpbmdDb250cm9sOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLXB1YmxpYyBjbGFzcyBSZXF1ZXN0VVJJQmFzZWRTZXJ2aWNlRGlzcGF0Y2hlciBleHRlbmRzIEFic3RyYWN0U2VydmljZURpc3BhdGNoZXIgewotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRSA9ICJSZXF1ZXN0VVJJQmFzZWRTZXJ2aWNlRGlzcGF0Y2hlciI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFJlcXVlc3RVUklCYXNlZFNlcnZpY2VEaXNwYXRjaGVyLmNsYXNzKTsKLQotICAgIC8qCi0gICAgICogIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkFic3RyYWN0RGlzcGF0Y2hlciNmaW5kU2VydmljZShvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQpCi0gICAgICovCi0gICAgcHVibGljIEF4aXNTZXJ2aWNlIGZpbmRTZXJ2aWNlKE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgRW5kcG9pbnRSZWZlcmVuY2UgdG9FUFIgPSBtZXNzYWdlQ29udGV4dC5nZXRUbygpOwotICAgICAgICBpZiAodG9FUFIgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQgJiYgbG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcobWVzc2FnZUNvbnRleHQuZ2V0TG9nSURTdHJpbmcoKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAiIENoZWNraW5nIGZvciBTZXJ2aWNlIHVzaW5nIHRhcmdldCBlbmRwb2ludCBhZGRyZXNzIDogIiArCi0gICAgICAgICAgICAgICAgICAgICAgICB0b0VQUi5nZXRBZGRyZXNzKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgU3RyaW5nIGZpbGVQYXJ0ID0gdG9FUFIuZ2V0QWRkcmVzcygpOwotICAgICAgICAgICAgLy9SRVZJRVc6IChuYWd5KSBQYXJzaW5nIHRoZSBSZXF1ZXN0VVJJIHdpbGwgYWxzbyBnaXZlIHVzIHRoZSBvcGVyYXRpb25OYW1lIGlmIHByZXNlbnQsIHNvIHdlIGNvdWxkIGNvbmNlaXZhYmx5IHN0b3JlIGl0IGluIHRoZSBNZXNzYWdlQ29udGV4dCwgYnV0IGRvaW5nIHNvIGFuZCByZXRyaWV2aW5nIGl0IGlzIHByb2JhYmx5IG5vIGZhc3RlciB0aGFuIHNpbXBseSByZXBhcnNpbmcgdGhlIFVSSQotICAgICAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlndXJhdGlvbkNvbnRleHQgPSBtZXNzYWdlQ29udGV4dC5nZXRDb25maWd1cmF0aW9uQ29udGV4dCgpOwotICAgICAgICAgICAgU3RyaW5nW10gdmFsdWVzID0gVXRpbHMucGFyc2VSZXF1ZXN0VVJMRm9yU2VydmljZUFuZE9wZXJhdGlvbihmaWxlUGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUNvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Q29uZmlndXJhdGlvbkNvbnRleHQoKS5nZXRTZXJ2aWNlQ29udGV4dFBhdGgoKSk7Ci0KLSAgICAgICAgICAgIGlmICgodmFsdWVzLmxlbmd0aCA+PSAxKSAmJiAodmFsdWVzWzBdICE9IG51bGwpKSB7Ci0gICAgICAgICAgICAJCi0gICAgICAgICAgICAJQXhpc0NvbmZpZ3VyYXRpb24gcmVnaXN0cnkgPQotICAgICAgICAgICAgCQljb25maWd1cmF0aW9uQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpOwotCi0gICAgICAgICAgICAJQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UgPSByZWdpc3RyeS5nZXRTZXJ2aWNlKHZhbHVlc1swXSk7Ci0KLSAgICAgICAgICAgIAkvLyBJZiB0aGUgYXhpc1NlcnZpY2UgaXMgbm90IG51bGwgd2UgZ2V0IHRoZSBiaW5kaW5nIHRoYXQgdGhlIHJlcXVlc3QgY2FtZSB0byBhZGQKLSAgICAgICAgICAgIAkvLyBhZGQgaXQgYXMgYSBwcm9wZXJ0eSB0byB0aGUgbWVzc2FnZUNvbnRleHQKLSAgICAgICAgICAgIAlpZiAoYXhpc1NlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgCQlNYXAgZW5kcG9pbnRzID0gYXhpc1NlcnZpY2UuZ2V0RW5kcG9pbnRzKCk7Ci0gICAgICAgICAgICAJCWlmIChlbmRwb2ludHMgIT0gbnVsbCkgewotICAgICAgICAgICAgCQkJaWYgKGVuZHBvaW50cy5zaXplKCkgPT0gMSkgewotICAgICAgICAgICAgCQkJCW1lc3NhZ2VDb250ZXh0LnNldFByb3BlcnR5KFdTREwyQ29uc3RhbnRzLkVORFBPSU5UX0xPQ0FMX05BTUUsCi0gICAgICAgICAgICAJCQkJCQllbmRwb2ludHMuZ2V0KAotICAgICAgICAgICAgCQkJCQkJCQlheGlzU2VydmljZS5nZXRFbmRwb2ludE5hbWUoKSkpOwotICAgICAgICAgICAgCQkJfSBlbHNlIHsKLSAgICAgICAgICAgIAkJCQlTdHJpbmcgZW5kcG9pbnROYW1lID0gdmFsdWVzWzBdLnN1YnN0cmluZyh2YWx1ZXNbMF0uaW5kZXhPZigiLiIpICsgMSk7Ci0gICAgICAgICAgICAJCQkJbWVzc2FnZUNvbnRleHQuc2V0UHJvcGVydHkoV1NETDJDb25zdGFudHMuRU5EUE9JTlRfTE9DQUxfTkFNRSwKLSAgICAgICAgICAgIAkJCQkJCWVuZHBvaW50cy5nZXQoZW5kcG9pbnROYW1lKSk7Ci0gICAgICAgICAgICAJCQl9Ci0gICAgICAgICAgICAJCX0KLSAgICAgICAgICAgIAl9Ci0KLSAgICAgICAgICAgIAlyZXR1cm4gYXhpc1NlcnZpY2U7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkICYmIGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhtZXNzYWdlQ29udGV4dC5nZXRMb2dJRFN0cmluZygpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIEF0dGVtcHRlZCB0byBjaGVjayBmb3IgU2VydmljZSB1c2luZyB0YXJnZXQgZW5kcG9pbnQgVVJJLCBidXQgdGhlIHNlcnZpY2UgZnJhZ21lbnQgd2FzIG1pc3NpbmciKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoTG9nZ2luZ0NvbnRyb2wuZGVidWdMb2dnaW5nQWxsb3dlZCAmJiBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhtZXNzYWdlQ29udGV4dC5nZXRMb2dJRFN0cmluZygpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIgQXR0ZW1wdGVkIHRvIGNoZWNrIGZvciBTZXJ2aWNlIHVzaW5nIG51bGwgdGFyZ2V0IGVuZHBvaW50IFVSSSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbml0RGlzcGF0Y2hlcigpIHsKLSAgICAgICAgaW5pdChuZXcgSGFuZGxlckRlc2NyaXB0aW9uKE5BTUUpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGlzcGF0Y2hlcnMvUmVxdWVzdFVSSU9wZXJhdGlvbkRpc3BhdGNoZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kaXNwYXRjaGVycy9SZXF1ZXN0VVJJT3BlcmF0aW9uRGlzcGF0Y2hlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTVjOGIxLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kaXNwYXRjaGVycy9SZXF1ZXN0VVJJT3BlcmF0aW9uRGlzcGF0Y2hlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uSGFuZGxlckRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkFic3RyYWN0RGlzcGF0Y2hlcjsKLQotLyoqCi0gKiBEaXNwYXRjaGVzIHRoZSBvcGVyYXRpb24gYmFzZWQgb24gdGhlIGluZm9ybWF0aW9uIGZyb20gdGhlIHRhcmdldCBlbmRwb2ludCBVUkwuCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXF1ZXN0VVJJT3BlcmF0aW9uRGlzcGF0Y2hlciBleHRlbmRzIEFic3RyYWN0RGlzcGF0Y2hlciB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FID0gIlJlcXVlc3RVUklPcGVyYXRpb25EaXNwYXRjaGVyIjsKLSAgICBwcml2YXRlIFJlcXVlc3RVUklCYXNlZE9wZXJhdGlvbkRpc3BhdGNoZXIgcnVib2QgPSBuZXcgUmVxdWVzdFVSSUJhc2VkT3BlcmF0aW9uRGlzcGF0Y2hlcigpOwotCi0gICAgLyoKLSAgICAgKiAgKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQWJzdHJhY3REaXNwYXRjaGVyI2ZpbmRPcGVyYXRpb24ob3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZSwgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0KQotICAgICAqLwotICAgIHB1YmxpYyBBeGlzT3BlcmF0aW9uIGZpbmRPcGVyYXRpb24oQXhpc1NlcnZpY2Ugc2VydmljZSwgTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQpCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAJcmV0dXJuIHJ1Ym9kLmZpbmRPcGVyYXRpb24oc2VydmljZSwgbWVzc2FnZUNvbnRleHQpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkFic3RyYWN0RGlzcGF0Y2hlciNmaW5kU2VydmljZShvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQpCi0gICAgICovCi0gICAgcHVibGljIEF4aXNTZXJ2aWNlIGZpbmRTZXJ2aWNlKE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgLy8gVGhpcyBEaXNwYXRjaGVyIGRvZXMgbm90IG5lZWQgdG8gcmVzb2x2ZSB0aGUgc2VydmljZSwgYXMgdGhhdCBpcyBoYW5kbGVkCi0gICAgICAgIC8vIGJ5IHRoZSBSZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyLgotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbml0RGlzcGF0Y2hlcigpIHsKLSAgICAgICAgaW5pdChuZXcgSGFuZGxlckRlc2NyaXB0aW9uKE5BTUUpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGlzcGF0Y2hlcnMvU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rpc3BhdGNoZXJzL1NPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDYzMTYzOC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGlzcGF0Y2hlcnMvU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uSGFuZGxlckRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkFic3RyYWN0RGlzcGF0Y2hlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuTG9nZ2luZ0NvbnRyb2w7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLS8qKgotICogRGlzcGF0Y2hlcyBiYXNlZCBvbiB0aGUgU09BUEFjdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIFNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIgZXh0ZW5kcyBBYnN0cmFjdERpc3BhdGNoZXIgewotCi0gICAgLyoqCi0gICAgICogRmllbGQgTkFNRQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUUgPSAiU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIuY2xhc3MpOwotICAgIHByaXZhdGUgQWN0aW9uQmFzZWRPcGVyYXRpb25EaXNwYXRjaGVyIGFib2QgPSBuZXcgQWN0aW9uQmFzZWRPcGVyYXRpb25EaXNwYXRjaGVyKCk7Ci0KLSAgICBwdWJsaWMgQXhpc09wZXJhdGlvbiBmaW5kT3BlcmF0aW9uKEF4aXNTZXJ2aWNlIHNlcnZpY2UsIE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0KQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIHJldHVybiBhYm9kLmZpbmRPcGVyYXRpb24oc2VydmljZSwgbWVzc2FnZUNvbnRleHQpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BYnN0cmFjdERpc3BhdGNoZXIjZmluZFNlcnZpY2Uob3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0KQotICAgICAqLwotICAgIHB1YmxpYyBBeGlzU2VydmljZSBmaW5kU2VydmljZShNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkICYmIGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcobWVzc2FnZUNvbnRleHQuZ2V0TG9nSURTdHJpbmcoKSArCi0gICAgICAgICAgICAgICAgICAgICIgQ2hlY2tpbmcgZm9yIFNlcnZpY2UgdXNpbmcgU09BUEFjdGlvbiBpcyBhIFRPRE8gaXRlbSIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGluaXREaXNwYXRjaGVyKCkgewotICAgICAgICBpbml0KG5ldyBIYW5kbGVyRGVzY3JpcHRpb24oTkFNRSkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kaXNwYXRjaGVycy9TT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kaXNwYXRjaGVycy9TT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE4NmE1OC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGlzcGF0Y2hlcnMvU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5IYW5kbGVyRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQWJzdHJhY3REaXNwYXRjaGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5Mb2dnaW5nQ29udHJvbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi0vKioKLSAqIERpc3BhdGNoZXMgYmFzZWQgb24gdGhlIG5hbWVzcGFjZSBVUkkgb2YgdGhlIGZpcnN0IGNoaWxkIG9mCi0gKiB0aGUgYm9keS4KLSAqLwotcHVibGljIGNsYXNzIFNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciBleHRlbmRzIEFic3RyYWN0RGlzcGF0Y2hlciB7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBOQU1FCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRSA9ICJTT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhTT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIuY2xhc3MpOwotCi0gICAgcHVibGljIEF4aXNPcGVyYXRpb24gZmluZE9wZXJhdGlvbihBeGlzU2VydmljZSBzZXJ2aWNlLCBNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCkKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotCi0gICAgICAgIFN0cmluZyBsb2NhbE5hbWUgPSBtZXNzYWdlQ29udGV4dC5nZXRFbnZlbG9wZSgpLmdldFNPQVBCb2R5Rmlyc3RFbGVtZW50TG9jYWxOYW1lKCk7Ci0KLSAgICAgICAgQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uID0gbnVsbDsKLSAgICAgICAgaWYgKGxvY2FsTmFtZSAhPSBudWxsKXsKLSAgICAgICAgICAgT01OYW1lc3BhY2UgbnMgPSBtZXNzYWdlQ29udGV4dC5nZXRFbnZlbG9wZSgpLmdldFNPQVBCb2R5Rmlyc3RFbGVtZW50TlMoKTsKLSAgICAgICAgICAgUU5hbWUgcU5hbWUgPSBudWxsOwotICAgICAgICAgICBpZiAobnMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgcU5hbWUgPSBuZXcgUU5hbWUobnMuZ2V0TmFtZXNwYWNlVVJJKCksIGxvY2FsTmFtZSk7Ci0gICAgICAgICAgICAgICBheGlzT3BlcmF0aW9uID0gc2VydmljZS5nZXRPcGVyYXRpb25CeU1lc3NhZ2VFbGVtZW50UU5hbWUocU5hbWUpOwotICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgLy8gdGhpcyBpcyByZXF1aXJlZCBmb3Igc2VydmljZXMgdXNlcyB0aGUgUlBDIG1lc3NhZ2UgcmVjZWl2ZXIKLSAgICAgICAgICAgaWYgKGF4aXNPcGVyYXRpb24gPT0gbnVsbCl7Ci0gICAgICAgICAgICAgICBRTmFtZSBvcGVyYXRpb25OYW1lID0gbmV3IFFOYW1lKGxvY2FsTmFtZSk7Ci0gICAgICAgICAgICAgICBheGlzT3BlcmF0aW9uID0gc2VydmljZS5nZXRPcGVyYXRpb24ob3BlcmF0aW9uTmFtZSk7Ci0gICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBheGlzT3BlcmF0aW9uOwotICAgIH0KLQotICAgIC8qCi0gICAgICogIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkFic3RyYWN0RGlzcGF0Y2hlciNmaW5kU2VydmljZShvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQpCi0gICAgICovCi0gICAgcHVibGljIEF4aXNTZXJ2aWNlIGZpbmRTZXJ2aWNlKE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgU3RyaW5nIHNlcnZpY2VOYW1lOwotCi0gICAgICAgIFN0cmluZyBsb2NhbFBhcnQgPSBtZXNzYWdlQ29udGV4dC5nZXRFbnZlbG9wZSgpLmdldFNPQVBCb2R5Rmlyc3RFbGVtZW50TG9jYWxOYW1lKCk7Ci0KLSAgICAgICAgaWYgKGxvY2FsUGFydCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBPTU5hbWVzcGFjZSBucyA9IG1lc3NhZ2VDb250ZXh0LmdldEVudmVsb3BlKCkuZ2V0U09BUEJvZHlGaXJzdEVsZW1lbnROUygpOwotCi0gICAgICAgICAgICBpZiAobnMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFN0cmluZyBmaWxlUGFydCA9IG5zLmdldE5hbWVzcGFjZVVSSSgpOwotCi0gICAgICAgICAgICAgICAgaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQgJiYgbG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKG1lc3NhZ2VDb250ZXh0LmdldExvZ0lEU3RyaW5nKCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgQ2hlY2tpbmcgZm9yIFNlcnZpY2UgdXNpbmcgU09BUCBtZXNzYWdlIGJvZHkncyBmaXJzdCBjaGlsZCdzIG5hbWVzcGFjZSA6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGZpbGVQYXJ0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlndXJhdGlvbkNvbnRleHQgPQotICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUNvbnRleHQuZ2V0Q29uZmlndXJhdGlvbkNvbnRleHQoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmdbXSB2YWx1ZXMgPSBVdGlscy5wYXJzZVJlcXVlc3RVUkxGb3JTZXJ2aWNlQW5kT3BlcmF0aW9uKGZpbGVQYXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbkNvbnRleHQuZ2V0U2VydmljZUNvbnRleHRQYXRoKCkpOwotCi0gICAgICAgICAgICAgICAgaWYgKHZhbHVlc1swXSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNlcnZpY2VOYW1lID0gdmFsdWVzWzBdOwotCi0gICAgICAgICAgICAgICAgICAgIEF4aXNDb25maWd1cmF0aW9uIHJlZ2lzdHJ5ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpOwotCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZWdpc3RyeS5nZXRTZXJ2aWNlKHNlcnZpY2VOYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbml0RGlzcGF0Y2hlcigpIHsKLSAgICAgICAgaW5pdChuZXcgSGFuZGxlckRlc2NyaXB0aW9uKE5BTUUpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGlzcGF0Y2hlcnMvU09BUE1lc3NhZ2VCb2R5QmFzZWRPcGVyYXRpb25EaXNwYXRjaGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGlzcGF0Y2hlcnMvU09BUE1lc3NhZ2VCb2R5QmFzZWRPcGVyYXRpb25EaXNwYXRjaGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyNTEzNjYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rpc3BhdGNoZXJzL1NPQVBNZXNzYWdlQm9keUJhc2VkT3BlcmF0aW9uRGlzcGF0Y2hlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5IYW5kbGVyRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLkxvZ2dpbmdDb250cm9sOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotcHVibGljIGNsYXNzIFNPQVBNZXNzYWdlQm9keUJhc2VkT3BlcmF0aW9uRGlzcGF0Y2hlciBleHRlbmRzIEFic3RyYWN0T3BlcmF0aW9uRGlzcGF0Y2hlciB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FID0gIlNPQVBNZXNzYWdlQm9keUJhc2VkT3BlcmF0aW9uRGlzcGF0Y2hlciI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFNPQVBNZXNzYWdlQm9keUJhc2VkT3BlcmF0aW9uRGlzcGF0Y2hlci5jbGFzcyk7Ci0KLSAgICBwdWJsaWMgQXhpc09wZXJhdGlvbiBmaW5kT3BlcmF0aW9uKEF4aXNTZXJ2aWNlIHNlcnZpY2UsIE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0KQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIFN0cmluZyBsb2NhbFBhcnQgPSBtZXNzYWdlQ29udGV4dC5nZXRFbnZlbG9wZSgpLmdldFNPQVBCb2R5Rmlyc3RFbGVtZW50TG9jYWxOYW1lKCk7Ci0gICAgICAgIGlmIChsb2NhbFBhcnQgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQgJiYgbG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhtZXNzYWdlQ29udGV4dC5nZXRMb2dJRFN0cmluZygpICsKLSAgICAgICAgICAgICAgICAgICAgIiBDaGVja2luZyBmb3IgT3BlcmF0aW9uIHVzaW5nIFNPQVAgbWVzc2FnZSBib2R5J3MgZmlyc3QgY2hpbGQncyBsb2NhbCBuYW1lIDogIgotICAgICAgICAgICAgICAgICAgICArIGxvY2FsUGFydCk7Ci0gICAgICAgIH0KLSAgICAgICAgQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uID0gc2VydmljZS5nZXRPcGVyYXRpb24obmV3IFFOYW1lKGxvY2FsUGFydCkpOwotCi0gICAgICAgIGlmIChheGlzT3BlcmF0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgIE9NTmFtZXNwYWNlIG5zID0gbWVzc2FnZUNvbnRleHQuZ2V0RW52ZWxvcGUoKS5nZXRTT0FQQm9keUZpcnN0RWxlbWVudE5TKCk7Ci0gICAgICAgICAgICBpZiAobnMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFFOYW1lIHFOYW1lID0gbmV3IFFOYW1lKG5zLmdldE5hbWVzcGFjZVVSSSgpLCBsb2NhbFBhcnQpOwotICAgICAgICAgICAgICAgIGF4aXNPcGVyYXRpb24gPSBzZXJ2aWNlLmdldE9wZXJhdGlvbkJ5TWVzc2FnZUVsZW1lbnRRTmFtZShxTmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoYXhpc09wZXJhdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgUU5hbWUgcU5hbWUgPSBuZXcgUU5hbWUobG9jYWxQYXJ0KTsKLSAgICAgICAgICAgICAgICBheGlzT3BlcmF0aW9uID0gc2VydmljZS5nZXRPcGVyYXRpb24ocU5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBheGlzT3BlcmF0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGluaXREaXNwYXRjaGVyKCkgewotICAgICAgICBpbml0KG5ldyBIYW5kbGVyRGVzY3JpcHRpb24oTkFNRSkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kaXNwYXRjaGVycy9TT0FQTWVzc2FnZUJvZHlCYXNlZFNlcnZpY2VEaXNwYXRjaGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGlzcGF0Y2hlcnMvU09BUE1lc3NhZ2VCb2R5QmFzZWRTZXJ2aWNlRGlzcGF0Y2hlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzcwOTU0Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kaXNwYXRjaGVycy9TT0FQTWVzc2FnZUJvZHlCYXNlZFNlcnZpY2VEaXNwYXRjaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uSGFuZGxlckRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5Mb2dnaW5nQ29udHJvbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBTT0FQTWVzc2FnZUJvZHlCYXNlZFNlcnZpY2VEaXNwYXRjaGVyIGV4dGVuZHMgQWJzdHJhY3RTZXJ2aWNlRGlzcGF0Y2hlciB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FID0gIlNPQVBNZXNzYWdlQm9keUJhc2VkU2VydmljZURpc3BhdGNoZXIiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhTT0FQTWVzc2FnZUJvZHlCYXNlZFNlcnZpY2VEaXNwYXRjaGVyLmNsYXNzKTsKLQotICAgIHB1YmxpYyBBeGlzU2VydmljZSBmaW5kU2VydmljZShNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIFN0cmluZyBzZXJ2aWNlTmFtZSA9IG51bGw7Ci0gICAgICAgIFN0cmluZyBsb2NhbFBhcnQgPSBtZXNzYWdlQ29udGV4dC5nZXRFbnZlbG9wZSgpLmdldFNPQVBCb2R5Rmlyc3RFbGVtZW50TG9jYWxOYW1lKCk7Ci0KLSAgICAgICAgaWYgKGxvY2FsUGFydCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBPTU5hbWVzcGFjZSBucyA9IG1lc3NhZ2VDb250ZXh0LmdldEVudmVsb3BlKCkuZ2V0U09BUEJvZHlGaXJzdEVsZW1lbnROUygpOwotCi0gICAgICAgICAgICBpZiAobnMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFN0cmluZyBmaWxlUGFydCA9IG5zLmdldE5hbWVzcGFjZVVSSSgpOwotCi0gICAgICAgICAgICAgICAgaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQgJiYgbG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKG1lc3NhZ2VDb250ZXh0LmdldExvZ0lEU3RyaW5nKCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDaGVja2luZyBmb3IgU2VydmljZSB1c2luZyBTT0FQIG1lc3NhZ2UgYm9keSdzIGZpcnN0IGNoaWxkJ3MgbmFtZXNwYWNlIDogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZmlsZVBhcnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBTdHJpbmdbXSB2YWx1ZXMgPSBVdGlscy5wYXJzZVJlcXVlc3RVUkxGb3JTZXJ2aWNlQW5kT3BlcmF0aW9uKGZpbGVQYXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUNvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldENvbmZpZ3VyYXRpb25Db250ZXh0KCkuZ2V0U2VydmljZUNvbnRleHRQYXRoKCkpOwotCi0gICAgICAgICAgICAgICAgaWYgKHZhbHVlc1swXSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNlcnZpY2VOYW1lID0gdmFsdWVzWzBdOwotCi0gICAgICAgICAgICAgICAgICAgIEF4aXNDb25maWd1cmF0aW9uIHJlZ2lzdHJ5ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlQ29udGV4dC5nZXRDb25maWd1cmF0aW9uQ29udGV4dCgpLmdldEF4aXNDb25maWd1cmF0aW9uKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlZ2lzdHJ5LmdldFNlcnZpY2Uoc2VydmljZU5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGluaXREaXNwYXRjaGVyKCkgewotICAgICAgICBpbml0KG5ldyBIYW5kbGVyRGVzY3JpcHRpb24oTkFNRSkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvQWJzdHJhY3REaXNwYXRjaGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZW5naW5lL0Fic3RyYWN0RGlzcGF0Y2hlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTFjYjA5Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvQWJzdHJhY3REaXNwYXRjaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZW5naW5lOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc0JpbmRpbmc7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzQmluZGluZ09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNFbmRwb2ludDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkhhbmRsZXJEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLldTREwyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaGFuZGxlcnMuQWJzdHJhY3RIYW5kbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaTE4bi5NZXNzYWdlczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuTG9nZ2luZ0NvbnRyb2w7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLS8qKgotICogVGhpcyB0aGUgYmFzZSBjbGFzcyBmb3IgYWxsIGRpc3BhdGNoZXJzLiBBIGRpc3BhdGNoZXIncyB0YXNrIGlzCi0gKiB0byBmaW5kIHRoZSBzZXJ2aWNlIGZvciBhbiBpbmNvbWluZyBTT0FQIG1lc3NhZ2UuCi0gKiA8cC8+Ci0gKiBJbiBBeGlzMiwgYSBjaGFpbiBvZiBkaXNwYXRjaGVycyBpcyBzZXR1cC4gRWFjaCB0cmllcyB0bwotICogZGlzcGF0Y2ggYW5kIHJldHVybiB3aXRob3V0IHRocm93aW5nIGFuIGV4Y2VwdGlvbiwgaW4gY2FzZSBpdCBmYWlscwotICogdG8gZmluZCB0aGUgc2VydmljZSBvciBvcGVyYXRpb24uIERpc3BhdGNoZXJzIGxvb2sgZm9yIHNlcnZpY2VzLCBvcGVyYXRpb25zLAotICogb3IgYm90aC4KLSAqIAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3REaXNwYXRjaGVyIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyIHsKLQotICAgIC8qKgotICAgICAqIEZpZWxkIE5BTUUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FID0gIkFic3RyYWN0RGlzcGF0Y2hlciI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEFic3RyYWN0RGlzcGF0Y2hlci5jbGFzcyk7Ci0KLSAgICBwdWJsaWMgQWJzdHJhY3REaXNwYXRjaGVyKCkgewotICAgICAgICBpbml0KG5ldyBIYW5kbGVyRGVzY3JpcHRpb24oTkFNRSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCBieSBBeGlzIEVuZ2luZSB0byBmaW5kIHRoZSBvcGVyYXRpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2VydmljZQotICAgICAqIEBwYXJhbSBtZXNzYWdlQ29udGV4dAotICAgICAqIEByZXR1cm4gUmV0dXJucyBBeGlzT3BlcmF0aW9uLgotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0Ci0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IEF4aXNPcGVyYXRpb24gZmluZE9wZXJhdGlvbihBeGlzU2VydmljZSBzZXJ2aWNlLCBNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCkKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQ7Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgYnkgQXhpcyBFbmdpbmUgdG8gZmluZCB0aGUgc2VydmljZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXNzYWdlQ29udGV4dAotICAgICAqIEByZXR1cm4gUmV0dXJucyBBeGlzU2VydmljZS4KLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdAotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBBeGlzU2VydmljZSBmaW5kU2VydmljZShNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdDsKLQotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGluaXREaXNwYXRjaGVyKCk7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gbXNnY3R4Ci0gICAgICogQHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdAotICAgICAqLwotICAgIHB1YmxpYyBJbnZvY2F0aW9uUmVzcG9uc2UgaW52b2tlKE1lc3NhZ2VDb250ZXh0IG1zZ2N0eCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlID0gbXNnY3R4LmdldEF4aXNTZXJ2aWNlKCk7Ci0KLSAgICAgICAgaWYgKGF4aXNTZXJ2aWNlID09IG51bGwpIHsKLSAgICAgICAgICAgIGF4aXNTZXJ2aWNlID0gZmluZFNlcnZpY2UobXNnY3R4KTsKLQotICAgICAgICAgICAgaWYgKGF4aXNTZXJ2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoTG9nZ2luZ0NvbnRyb2wuZGVidWdMb2dnaW5nQWxsb3dlZCAmJiBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcobXNnY3R4LmdldExvZ0lEU3RyaW5nKCkgKyAiICIgKyBNZXNzYWdlcy5nZXRNZXNzYWdlKCJzZXJ2aWNlZm91bmQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlLmdldE5hbWUoKSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtc2djdHguc2V0QXhpc1NlcnZpY2UoYXhpc1NlcnZpY2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKChheGlzU2VydmljZSAhPSBudWxsKSAmJiAobXNnY3R4LmdldEF4aXNPcGVyYXRpb24oKSA9PSBudWxsKSkgewotICAgICAgICAgICAgQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uID0gZmluZE9wZXJhdGlvbihheGlzU2VydmljZSwgbXNnY3R4KTsKLQotICAgICAgICAgICAgaWYgKGF4aXNPcGVyYXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkICYmIGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1Zyhtc2djdHguZ2V0TG9nSURTdHJpbmcoKSArICIgIiArIE1lc3NhZ2VzLmdldE1lc3NhZ2UoIm9wZXJhdGlvbmZvdW5kIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzT3BlcmF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbXNnY3R4LnNldEF4aXNPcGVyYXRpb24oYXhpc09wZXJhdGlvbik7Ci0gICAgICAgICAgICAgICAgLy9zZXR0aW5nIGF4aXNNZXNzYWdlIGludG8gbWVzc2FnZUNvbnRleHQKLSAgICAgICAgICAgICAgICBtc2djdHguc2V0QXhpc01lc3NhZ2UoYXhpc09wZXJhdGlvbi5nZXRNZXNzYWdlKAotICAgICAgICAgICAgICAgICAgICAgICAgV1NETENvbnN0YW50cy5NRVNTQUdFX0xBQkVMX0lOX1ZBTFVFKSk7Ci0gICAgICAgICAgICAgICAgQXhpc0VuZHBvaW50IGF4aXNFbmRwb2ludCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoQXhpc0VuZHBvaW50KSBtc2djdHguZ2V0UHJvcGVydHkoV1NETDJDb25zdGFudHMuRU5EUE9JTlRfTE9DQUxfTkFNRSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoYXhpc0VuZHBvaW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgQXhpc0JpbmRpbmcgYXhpc0JpbmRpbmcgPSBheGlzRW5kcG9pbnQuZ2V0QmluZGluZygpOwotCQkJCQlBeGlzQmluZGluZ09wZXJhdGlvbiBheGlzQmluZGluZ09wZXJhdGlvbiA9IChBeGlzQmluZGluZ09wZXJhdGlvbikgYXhpc0JpbmRpbmcKLQkJCQkJCQkuZ2V0Q2hpbGQoYXhpc09wZXJhdGlvbi5nZXROYW1lKCkpOwotCQkJCQlpZiAoYXhpc0JpbmRpbmdPcGVyYXRpb24gPT0gbnVsbCkgewotCQkJCQkJU3RyaW5nIGxvY2FsTmFtZSA9IGF4aXNPcGVyYXRpb24uZ2V0TmFtZSgpCi0JCQkJCQkJCS5nZXRMb2NhbFBhcnQoKTsKLQkJCQkJCUF4aXNCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcCA9IG51bGw7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yPEF4aXNCaW5kaW5nT3BlcmF0aW9uPiBpdGVyYXRvciA9IGF4aXNCaW5kaW5nLmdldENoaWxkcmVuKCk7IGl0ZXJhdG9yCi0JCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJYmluZGluZ09wID0gKEF4aXNCaW5kaW5nT3BlcmF0aW9uKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQkJaWYgKGxvY2FsTmFtZS5lcXVhbHMoYmluZGluZ09wLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKSkpIHsKLQkJCQkJCQkJYXhpc0JpbmRpbmdPcGVyYXRpb24gPSBiaW5kaW5nT3A7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkgaWYgKGF4aXNCaW5kaW5nT3BlcmF0aW9uICE9IG51bGwpIHsKLQkJCQkJCW1zZ2N0eAotCQkJCQkJCQkuc2V0UHJvcGVydHkoCi0JCQkJCQkJCQkJQ29uc3RhbnRzLkFYSVNfQklORElOR19NRVNTQUdFLAotCQkJCQkJCQkJCWF4aXNCaW5kaW5nT3BlcmF0aW9uCi0JCQkJCQkJCQkJCQkuZ2V0Q2hpbGQoV1NETENvbnN0YW50cy5NRVNTQUdFX0xBQkVMX0lOX1ZBTFVFKSk7Ci0JCQkJCQltc2djdHguc2V0UHJvcGVydHkoQ29uc3RhbnRzLkFYSVNfQklORElOR19PUEVSQVRJT04sCi0JCQkJCQkJCWF4aXNCaW5kaW5nT3BlcmF0aW9uKTsKLQkJCQkJfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gSW52b2NhdGlvblJlc3BvbnNlLkNPTlRJTlVFOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9BZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwYWExNmYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9BZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZW5naW5lOwotCi0vKioKLSAqIERpc3BhdGNoZXIgYmFzZWQgb24gdGhlIFdTLUFkZHJlc3NpbmcgcHJvcGVydGllcy4KLSAqIEBkZXByZWNhdGVkIHVzZSBvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIKLSAqLwotcHVibGljIGNsYXNzIEFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIgZXh0ZW5kcyBvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIgewotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9BeGlzQ29uZmlndXJhdGlvbi5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9BeGlzQ29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjUwZTU2Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvQXhpc0NvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMzUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uOwotaW1wb3J0IGphdmEudGV4dC5QYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50SGFzaE1hcDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmJ1aWxkZXIuQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmJ1aWxkZXIudW5rbm93bmNvbnRlbnQuVW5rbm93bkNvbnRlbnRCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5DbHVzdGVyTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhcmV0cmlldmFsLkF4aXNEYXRhTG9jYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQuRGVwbG95bWVudEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQuTW9kdWxlRGVwbG95ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LnJlcG9zaXRvcnkudXRpbC5EZXBsb3ltZW50RmlsZURhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LnV0aWwuUGhhc2VzSW5mbzsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNFbmRwb2ludDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNNb2R1bGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZUdyb3VwOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uTW9kdWxlQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlRyYW5zcG9ydEluRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5UcmFuc3BvcnRPdXREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlZlcnNpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5qYXZhMndzZGwuSmF2YTJXU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaTE4bi5NZXNzYWdlczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnBoYXNlcmVzb2x2ZXIuUGhhc2VNZXRhZGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnBoYXNlcmVzb2x2ZXIuUGhhc2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5NZXNzYWdlRm9ybWF0dGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5UYXJnZXRSZXNvbHZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLS8qKgotICogQ2xhc3MgQXhpc0NvbmZpZ3VyYXRpb24KLSAqLwotcHVibGljIGNsYXNzIEF4aXNDb25maWd1cmF0aW9uIGV4dGVuZHMgQXhpc0Rlc2NyaXB0aW9uIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhBeGlzQ29uZmlndXJhdGlvbi5jbGFzcyk7Ci0gICAgLyogCi0gICAgICogVG8gc3RvcmUgY29uZmlndXJlZCBkYXRhIGxvY2F0b3JzCi0gICAgICovCi0gICAgcHJpdmF0ZSBIYXNoTWFwPFN0cmluZywgQXhpc0RhdGFMb2NhdG9yPiBkYXRhTG9jYXRvcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEF4aXNEYXRhTG9jYXRvcj4oKTsKLSAgICBwcml2YXRlIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+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+IGVjID0gbmV3IERlcGxveWFibGVDaGFpbjxQaGFzZT4oKTsKLSAgICAgICAgU3RyaW5nIGxhc3QgPSBudWxsOwotICAgICAgICBmb3IgKEl0ZXJhdG9yPFBoYXNlPiBpID0gcGhhc2VMaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgUGhhc2UgcGhhc2UgPSAoUGhhc2UpaS5uZXh0KCk7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9IHBoYXNlLmdldE5hbWUoKTsKLSAgICAgICAgICAgIERlcGxveWFibGUgZXhpc3RpbmcgPSBuZXcgRGVwbG95YWJsZShuYW1lKTsKLSAgICAgICAgICAgIGV4aXN0aW5nLnNldFRhcmdldChwaGFzZSk7Ci0gICAgICAgICAgICBpZiAobGFzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gU2V0IHVwIGV4cGxpY2l0IGNoYWluIHJlbGF0aW9uc2hpcCBmb3IgcHJlZXhpc3RpbmcgcGhhc2VzLCBmb3Igbm93LgotICAgICAgICAgICAgICAgIGVjLmFkZFJlbGF0aW9uc2hpcChsYXN0LCBuYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGxhc3QgPSBuYW1lOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBlYy5kZXBsb3koZXhpc3RpbmcpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4gd2hlbiBidWlsZGluZyBhIHNpbXBsZSBsaXN0IGxpa2UgdGhlIGFib3ZlCi0gICAgICAgICAgICAgICAgdGhyb3cgQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBlYy5kZXBsb3koZCk7Ci0KLSAgICAgICAgICAgIGlmIChkLmdldFRhcmdldCgpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBQaGFzZSBwaGFzZSA9IG5ldyBQaGFzZSgpOwotICAgICAgICAgICAgICAgIHBoYXNlLnNldE5hbWUoZC5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIGQuc2V0VGFyZ2V0KHBoYXNlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZWMucmVidWlsZCgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHBoYXNlTGlzdCA9IGVjLmdldENoYWluKCk7Ci0KLSAgICAgICAgcmV0dXJuIHBoYXNlTGlzdDsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NFbmRwb2ludHMoQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UsCi0gICAgCQlBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlndXJhdGlvbikgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIE1hcDxTdHJpbmcsIEF4aXNFbmRwb2ludD4gZW5zcG9pbnRzID0gYXhpc1NlcnZpY2UuZ2V0RW5kcG9pbnRzKCk7Ci0gICAgICAgIGlmIChlbnNwb2ludHMgPT0gbnVsbCB8fCBlbnNwb2ludHMuc2l6ZSgpID09IDApIHsKLQkJCW9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC51dGlsLlV0aWxzLmFkZEVuZHBvaW50c1RvU2VydmljZSgKLQkJCQkJYXhpc1NlcnZpY2UsIGF4aXNDb25maWd1cmF0aW9uKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvQXhpc0NvbmZpZ3VyYXRvci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9BeGlzQ29uZmlndXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhOTg5NTkuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9BeGlzQ29uZmlndXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZW5naW5lOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgQXhpc0NvbmZpZ3VyYXRvciB7Ci0KLSAgICAvKioKLSAgICAgKiBDb25maWd1cmF0aW9uY29udGV4dGZhY3Rvcnkgd2lsbCBpbnZva2UgdGhpcyBtZXRob2QgdG8gZ2V0IHRoZSBBeGlzQ29uZmlndXJhdGlvbgotICAgICAqCi0gICAgICogQHJldHVybiBBeGlzQ29uZmlndXJhdG9yCi0gICAgICovCi0gICAgQXhpc0NvbmZpZ3VyYXRpb24gZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKSB0aHJvd3MgQXhpc0ZhdWx0OwotCi0gICAgLyoqCi0gICAgICogTWV0aG9kIHRvIGRlcGxveSBzZXJ2aWNlcyBmcm9tIHRoZSByZXBvc2l0b3J5Ci0gICAgICovCi0gICAgdm9pZCBsb2FkU2VydmljZXMoKTsKLQotICAgIC8qKgotICAgICAqIEVuZ2FnZXMgdGhlIGdsb2JhbCBtb2R1bGVzIHNwZWNpZmllZCBpbiB0aGUgY29uZmlndXJhdGlvbgotICAgICAqCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQKLSAgICAgKi8KLSAgICB2b2lkIGVuZ2FnZUdsb2JhbE1vZHVsZXMoKSB0aHJvd3MgQXhpc0ZhdWx0OwotCi0gICAgLyoqCi0gICAgICogQ2xlYW4gdXAgdGhlIG1lc3MKLSAgICAgKi8KLSAgICB2b2lkIGNsZWFudXAoKTsKLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvQXhpc0VuZ2luZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9BeGlzRW5naW5lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczOGRhNGMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9BeGlzRW5naW5lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NTIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZW5naW5lOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlJvbGVQbGF5ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEhlYWRlckJsb2NrOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50LmFzeW5jLkF4aXNDYWxsYmFjazsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5hc3luYy5DYWxsYmFjazsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5PcGVyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlRyYW5zcG9ydE91dERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uV1NETDJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuSGFuZGxlci5JbnZvY2F0aW9uUmVzcG9uc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pMThuLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0LlRyYW5zcG9ydFNlbmRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuQ2FsbGJhY2tSZWNlaXZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuTG9nZ2luZ0NvbnRyb2w7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLk1lc3NhZ2VDb250ZXh0QnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuV1NETENvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotLyoqCi0gKiBUaGVyZSBpcyBvbmUgZW5naW5lIGZvciB0aGUgU2VydmVyIGFuZCB0aGUgQ2xpZW50LiB0aGUgc2VuZCgpIGFuZCByZWNlaXZlKCkKLSAqIE1ldGhvZHMgYXJlIHRoZSBiYXNpYyBvcGVyYXRpb25zIHRoZSBTeW5jLCBBc3luYyBtZXNzYWdlaW5nIGFyZSBidWlsZCBvbiB0b3AuCi0gKi8KLXB1YmxpYyBjbGFzcyBBeGlzRW5naW5lIHsKLQotICAgIC8qKgotICAgICAqIEZpZWxkIGxvZwotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhBeGlzRW5naW5lLmNsYXNzKTsKLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gUkVTVU1JTkdfRVhFQ1VUSU9OID0gdHJ1ZTsKLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIE5PVF9SRVNVTUlOR19FWEVDVVRJT04gPSBmYWxzZTsKLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY2hlY2tNdXN0VW5kZXJzdGFuZChNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgTGlzdDxRTmFtZT4gdW5wcm9jZXNzZWQgPSBudWxsOwotICAgICAgICBTT0FQRW52ZWxvcGUgZW52ZWxvcGUgPSBtc2dDb250ZXh0LmdldEVudmVsb3BlKCk7Ci0gICAgICAgIGlmIChlbnZlbG9wZS5nZXRIZWFkZXIoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgLy8gR2V0IGFsbCB0aGUgaGVhZGVycyB0YXJnZXRlZCB0byB1cwotICAgICAgICBJdGVyYXRvciBoZWFkZXJCbG9ja3MgPSBlbnZlbG9wZS5nZXRIZWFkZXIoKS5nZXRIZWFkZXJzVG9Qcm9jZXNzKChSb2xlUGxheWVyKW1zZ0NvbnRleHQuZ2V0Q29uZmlndXJhdGlvbkNvbnRleHQoKS5nZXRBeGlzQ29uZmlndXJhdGlvbigpLmdldFBhcmFtZXRlclZhbHVlKCJyb2xlUGxheWVyIikpOwotICAgICAgICB3aGlsZSAoaGVhZGVyQmxvY2tzLmhhc05leHQoKSkgewotICAgICAgICAgICAgU09BUEhlYWRlckJsb2NrIGhlYWRlckJsb2NrID0gKFNPQVBIZWFkZXJCbG9jaykgaGVhZGVyQmxvY2tzLm5leHQoKTsKLSAgICAgICAgICAgIFFOYW1lIGhlYWRlck5hbWUgPSBoZWFkZXJCbG9jay5nZXRRTmFtZSgpOwotICAgICAgICAgICAgLy8gaWYgdGhpcyBoZWFkZXIgYmxvY2sgaGFzIGJlZW4gcHJvY2Vzc2VkIG9yIG11c3RVbmRlcnN0YW5kIGlzbid0Ci0gICAgICAgICAgICAvLyB0dXJuZWQgb24gdGhlbiBpdHMgY29vbAotICAgICAgICAgICAgaWYgKGhlYWRlckJsb2NrLmlzUHJvY2Vzc2VkKCkgfHwgIWhlYWRlckJsb2NrLmdldE11c3RVbmRlcnN0YW5kKCkpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYoTG9nZ2luZ0NvbnRyb2wuZGVidWdMb2dnaW5nQWxsb3dlZCAmJiBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSl7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJNdXN0VW5kZXJzdGFuZCBoZWFkZXIgbm90IHByb2Nlc3NlZCBvciByZWdpc3RlcmVkIGFzIHVuZGVyc3Rvb2QiK2hlYWRlck5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoaXNSZWNlaXZlck11c3RVbmRlcnN0YW5kUHJvY2Vzc29yKG1zZ0NvbnRleHQpKXsKLSAgICAgICAgICAgICAgICBpZih1bnByb2Nlc3NlZCA9PSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgdW5wcm9jZXNzZWQgPSBuZXcgQXJyYXlMaXN0PFFOYW1lPigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZighdW5wcm9jZXNzZWQuY29udGFpbnMoaGVhZGVyTmFtZSkpewotICAgICAgICAgICAgICAgICAgICB1bnByb2Nlc3NlZC5hZGQoaGVhZGVyTmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gT29wcywgdGhyb3cgYW4gYXBwcm9wcmlhdGUgTXVzdFVuZGVyc3RhbmQgZmF1bHQhIQotICAgICAgICAgICAgUU5hbWUgZmF1bHRRTmFtZSA9IGhlYWRlckJsb2NrLmdldFZlcnNpb24oKS5nZXRNdXN0VW5kZXJzdGFuZEZhdWx0Q29kZSgpOwotICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdChNZXNzYWdlcy5nZXRNZXNzYWdlKCJtdXN0dW5kZXJzdGFuZGZhaWxlZCIsCi0gICAgICAgICAgICAgICAgaGVhZGVyQmxvY2suZ2V0TmFtZXNwYWNlKCkuZ2V0TmFtZXNwYWNlVVJJKCksCi0gICAgICAgICAgICAgICAgaGVhZGVyQmxvY2suZ2V0TG9jYWxOYW1lKCkpLCBmYXVsdFFOYW1lKTsKLSAgICAgICAgfQotICAgICAgICBpZih1bnByb2Nlc3NlZCAhPW51bGwgJiYgdW5wcm9jZXNzZWQuc2l6ZSgpPjApewotICAgICAgICAgICAgLy9BZGRpbmcgSGVhZGVyUU5hbWVzIHRoYXQgZmFpbGVkIE1VIGNoZWNrIGFzIEF4aXNTZXJ2aWNlIFBhcmFtZXRlcgotICAgICAgICAgICAgLy9UaGV5IHdpbGwgYmUgZXhhbWluZWQgbGF0ZXIgYnkgTWVzc2FnZVJlY2VpdmVycy4KLSAgICAgICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKXsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkFkZGluZyBVbnByb2Nlc3NlZCBoZWFkZXJzIHRvIE1lc3NhZ2VDb250ZXh0LiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbXNnQ29udGV4dC5zZXRQcm9wZXJ0eShDb25zdGFudHMuVU5QUk9DRVNTRURfSEVBREVSX1FOQU1FUywgdW5wcm9jZXNzZWQpOyAgICAgICAgICAgCi0gICAgICAgIH0gICAgICAgCi0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1JlY2VpdmVyTXVzdFVuZGVyc3RhbmRQcm9jZXNzb3IoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCl7Ci0gICAgICAgIE1lc3NhZ2VSZWNlaXZlciByZWNlaXZlciA9IG51bGw7Ci0gICAgICAgIGlmKG1zZ0NvbnRleHQuaXNTZXJ2ZXJTaWRlKCkpewotICAgICAgICAgICAgcmVjZWl2ZXIgPSBtc2dDb250ZXh0LmdldEF4aXNPcGVyYXRpb24oKS5nZXRNZXNzYWdlUmVjZWl2ZXIoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKHJlY2VpdmVyIT1udWxsICYmIHJlY2VpdmVyLmdldENsYXNzKCkuZ2V0TmFtZSgpLmVuZHNXaXRoKCJKQVhXU01lc3NhZ2VSZWNlaXZlciIpKTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHRvIGhhbmRsZSBhbnkgZXJyb3IgdGhhdCBvY2N1cnMgYXQgaW5mbG93IG9yIG91dGZsb3cuIEJ1dCBpZiB0aGUKLSAgICAgKiBtZXRob2QgaXMgY2FsbGVkIHR3aWNlLCBpdCBpbXBsaWVzIHRoYXQgc2VuZGluZyB0aGUgZXJyb3IgaGFuZGxpbmcgaGFzIGZhaWxlZCwgaW4gd2hpY2ggY2FzZQotICAgICAqIHRoZSBtZXRob2QgbG9ncyB0aGUgZXJyb3IgYW5kIGV4aXN0cy4KLSAgICAgKgotICAgICAqIEBkZXByZWNhdGVkIChwb3N0IDEuMSBicmFuY2gpCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBNZXNzYWdlQ29udGV4dCBjcmVhdGVGYXVsdE1lc3NhZ2VDb250ZXh0KE1lc3NhZ2VDb250ZXh0IHByb2Nlc3NpbmdDb250ZXh0LCBUaHJvd2FibGUgZSkKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICByZXR1cm4gTWVzc2FnZUNvbnRleHRCdWlsZGVyLmNyZWF0ZUZhdWx0TWVzc2FnZUNvbnRleHQocHJvY2Vzc2luZ0NvbnRleHQsIGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kcyByZXByZXNlbnRzIHRoZSBpbmZsb3cgb2YgdGhlIEF4aXMsIHRoaXMgY291bGQgYmUgZWl0aGVyIGF0IHRoZSBzZXJ2ZXIgc2lkZSBvciB0aGUgY2xpZW50IHNpZGUuCi0gICAgICogSGVyZSB0aGUgPGNvZGU+RXhlY3V0aW9uQ2hhaW48L2NvZGU+IGlzIGNyZWF0ZWQgdXNpbmcgdGhlIFBoYXNlcy4gVGhlIEhhbmRsZXJzIGF0IHRoZSBlYWNoIFBoYXNlcyBpcyBvcmRlcmVkIGluCi0gICAgICogZGVwbG95bWVudCB0aW1lIGJ5IHRoZSBkZXBsb3ltZW50IG1vZHVsZQotICAgICAqCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQKLSAgICAgKiBAc2VlIE1lc3NhZ2VDb250ZXh0Ci0gICAgICogQHNlZSBQaGFzZQotICAgICAqIEBzZWUgSGFuZGxlcgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSW52b2NhdGlvblJlc3BvbnNlIHJlY2VpdmUoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkICYmIGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cudHJhY2UobXNnQ29udGV4dC5nZXRMb2dJRFN0cmluZygpICsgIiByZWNlaXZlOiIgKyBtc2dDb250ZXh0LmdldE1lc3NhZ2VJRCgpKTsKLSAgICAgICAgfQotICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBjb25mQ29udGV4dCA9IG1zZ0NvbnRleHQuZ2V0Q29uZmlndXJhdGlvbkNvbnRleHQoKTsKLSAgICAgICAgTGlzdDxQaGFzZT4gcHJlQ2FsY3VsYXRlZFBoYXNlczsKLSAgICAgICAgaWYgKG1zZ0NvbnRleHQuaXNGYXVsdCgpIHx8IG1zZ0NvbnRleHQuaXNQcm9jZXNzaW5nRmF1bHQoKSkgewotICAgICAgICAgICAgcHJlQ2FsY3VsYXRlZFBoYXNlcyA9IGNvbmZDb250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCkuZ2V0SW5GYXVsdEZsb3dQaGFzZXMoKTsKLSAgICAgICAgICAgIG1zZ0NvbnRleHQuc2V0RkxPVyhNZXNzYWdlQ29udGV4dC5JTl9GQVVMVF9GTE9XKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHByZUNhbGN1bGF0ZWRQaGFzZXMgPSBjb25mQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpLmdldEluRmxvd1BoYXNlcygpOwotICAgICAgICAgICAgbXNnQ29udGV4dC5zZXRGTE9XKE1lc3NhZ2VDb250ZXh0LklOX0ZMT1cpOwotICAgICAgICB9Ci0gICAgICAgIC8vIFNldCB0aGUgaW5pdGlhbCBleGVjdXRpb24gY2hhaW4gaW4gdGhlIE1lc3NhZ2VDb250ZXh0IHRvIGEgKmNvcHkqIG9mIHdoYXQKLSAgICAgICAgLy8gd2UgZ290IGFib3ZlLiAgVGhpcyBhbGxvd3MgaW5kaXZpZHVhbCBtZXNzYWdlIHByb2Nlc3NpbmcgdG8gY2hhbmdlIHRoZSBjaGFpbiB3aXRob3V0Ci0gICAgICAgIC8vIGFmZmVjdGluZyBsYXRlciBtZXNzYWdlcy4KLSAgICAgICAgQXJyYXlMaXN0PEhhbmRsZXI+IGV4ZWN1dGlvbkNoYWluID0gbmV3IEFycmF5TGlzdDxIYW5kbGVyPigpOwotICAgICAgICBleGVjdXRpb25DaGFpbi5hZGRBbGwocHJlQ2FsY3VsYXRlZFBoYXNlcyk7Ci0gICAgICAgIG1zZ0NvbnRleHQuc2V0RXhlY3V0aW9uQ2hhaW4oZXhlY3V0aW9uQ2hhaW4pOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgSW52b2NhdGlvblJlc3BvbnNlIHBpID0gaW52b2tlKG1zZ0NvbnRleHQsIE5PVF9SRVNVTUlOR19FWEVDVVRJT04pOwotCi0gICAgICAgICAgICBpZiAocGkuZXF1YWxzKEludm9jYXRpb25SZXNwb25zZS5DT05USU5VRSkpIHsKLSAgICAgICAgICAgICAgICBjaGVja011c3RVbmRlcnN0YW5kKG1zZ0NvbnRleHQpOwotICAgICAgICAgICAgICAgIGlmIChtc2dDb250ZXh0LmlzU2VydmVyU2lkZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGludm9rZSB0aGUgTWVzc2FnZSBSZWNlaXZlcnMKLQotICAgICAgICAgICAgICAgICAgICBNZXNzYWdlUmVjZWl2ZXIgcmVjZWl2ZXIgPSBtc2dDb250ZXh0LmdldEF4aXNPcGVyYXRpb24oKS5nZXRNZXNzYWdlUmVjZWl2ZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlY2VpdmVyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoTWVzc2FnZXMuZ2V0TWVzc2FnZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vbWVzc2FnZXJlY2lldmVyIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnQ29udGV4dC5nZXRBeGlzT3BlcmF0aW9uKCkuZ2V0TmFtZSgpLnRvU3RyaW5nKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZWNlaXZlci5yZWNlaXZlKG1zZ0NvbnRleHQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmbG93Q29tcGxldGUobXNnQ29udGV4dCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHBpLmVxdWFscyhJbnZvY2F0aW9uUmVzcG9uc2UuU1VTUEVORCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcGk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHBpLmVxdWFscyhJbnZvY2F0aW9uUmVzcG9uc2UuQUJPUlQpKSB7Ci0gICAgICAgICAgICAgICAgZmxvd0NvbXBsZXRlKG1zZ0NvbnRleHQpOwotICAgICAgICAgICAgICAgIC8vIFVuZG8gYW55IHBhcnRpYWwgd29yay4KLSAgICAgICAgICAgICAgICAvLyBSZW1vdmUgdGhlIGluY29taW5nIG1lc3NhZ2UgY29udGV4dAotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkludm9jYXRpb25SZXNwb25zZSBpcyBhYm9ydGVkLiAgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgaW5jb21pbmcgTWVzc2FnZUNvbnRleHQgaXMgcmVtb3ZlZCwgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbmQgdGhlIE9wZXJhdGlvbkNvbnRleHQgaXMgbWFya2VkIGFzIGluY29tcGxldGUiKTsKLSAgICAgICAgICAgICAgICB9Ci0JCQkJQXhpc09wZXJhdGlvbiBheGlzT3AgPSBtc2dDb250ZXh0LmdldEF4aXNPcGVyYXRpb24oKTsKLSAgICAgICAgICAgICAgICBpZihheGlzT3AhPW51bGwpewotCQkJCQlTdHJpbmcgbWVwVVJJICA9IGF4aXNPcC5nZXRNZXNzYWdlRXhjaGFuZ2VQYXR0ZXJuKCk7Ci0JCQkJCWlmIChXU0RMMkNvbnN0YW50cy5NRVBfVVJJX09VVF9JTi5lcXVhbHMobWVwVVJJKSkgewotCQkJCQkJT3BlcmF0aW9uQ29udGV4dCBvcEN0eCA9IG1zZ0NvbnRleHQuZ2V0T3BlcmF0aW9uQ29udGV4dCgpOwotCQkJCQkJaWYgKG9wQ3R4ICE9IG51bGwpIHsKLQkJCQkJCQlvcEN0eC5yZW1vdmVNZXNzYWdlQ29udGV4dChXU0RMQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfSU5fVkFMVUUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2V7Ci0JCQkJCWxvZy5kZWJ1ZygiQ291bGQgbm90IGNsZWFuIHVwIG9wIGN0eCBmb3IgIiArIG1zZ0NvbnRleHQpOwotCQkJCX0KLSAgICAgICAgICAgICAgICByZXR1cm4gcGk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFN0cmluZyBlcnJvck1zZyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAiVW5yZWNvZ25pemVkIEludm9jYXRpb25SZXNwb25zZSBlbmNvdW50ZXJlZCBpbiBBeGlzRW5naW5lLnJlY2VpdmUoKSI7Ci0gICAgICAgICAgICAgICAgbG9nLmVycm9yKG1zZ0NvbnRleHQuZ2V0TG9nSURTdHJpbmcoKSArICIgIiArIGVycm9yTXNnKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KGVycm9yTXNnKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoQXhpc0ZhdWx0IGUpIHsKLSAgICAgICAgICAgIGxvZy5lcnJvcihlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgICAgICBtc2dDb250ZXh0LnNldEZhaWx1cmVSZWFzb24oZSk7Ci0gICAgICAgICAgICBmbG93Q29tcGxldGUobXNnQ29udGV4dCk7Ci0gICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIEludm9jYXRpb25SZXNwb25zZS5DT05USU5VRTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFRha2UgdGhlIGV4ZWN1dGlvbiBjaGFpbiBmcm9tIHRoZSBtc2dDb250ZXh0ICwgYW5kIHRoZW4gdGFrZSB0aGUgY3VycmVudCBJbmRleAotICAgICAqIGFuZCBpbnZva2UgYWxsIHRoZSBwaGFzZXMgaW4gdGhlIGFycmF5bGlzdAotICAgICAqIGlmIHRoZSBtc2dDb250ZXh0IGlzIHBhdWVzZCB0aGVuIHRoZSBleGVjdXRpb24gd2lsbCBiZSBicmVha2VkCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbXNnQ29udGV4dAotICAgICAqIEByZXR1cm4gQW4gSW52b2NhdGlvblJlc3BvbnNlIHRoYXQgaW5kaWNhdGVzIHdoYXQKLSAgICAgKiAgICAgICAgIHRoZSBuZXh0IHN0ZXAgaW4gdGhlIG1lc3NhZ2UgcHJvY2Vzc2luZyBzaG91bGQgYmUuCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBJbnZvY2F0aW9uUmVzcG9uc2UgaW52b2tlKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQsIGJvb2xlYW4gcmVzdW1pbmcpCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLQotICAgICAgICBpZiAobXNnQ29udGV4dC5nZXRDdXJyZW50SGFuZGxlckluZGV4KCkgPT0gLTEpIHsKLSAgICAgICAgICAgIG1zZ0NvbnRleHQuc2V0Q3VycmVudEhhbmRsZXJJbmRleCgwKTsKLSAgICAgICAgfQotCi0gICAgICAgIEludm9jYXRpb25SZXNwb25zZSBwaSA9IEludm9jYXRpb25SZXNwb25zZS5DT05USU5VRTsKLQotICAgICAgICB3aGlsZSAobXNnQ29udGV4dC5nZXRDdXJyZW50SGFuZGxlckluZGV4KCkgPCBtc2dDb250ZXh0LmdldEV4ZWN1dGlvbkNoYWluKCkuc2l6ZSgpKSB7Ci0gICAgICAgICAgICBIYW5kbGVyIGN1cnJlbnRIYW5kbGVyID0gKEhhbmRsZXIpIG1zZ0NvbnRleHQuZ2V0RXhlY3V0aW9uQ2hhaW4oKS4KLSAgICAgICAgICAgICAgICAgICAgZ2V0KG1zZ0NvbnRleHQuZ2V0Q3VycmVudEhhbmRsZXJJbmRleCgpKTsKLQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpZiAoIXJlc3VtaW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1zZ0NvbnRleHQuYWRkRXhlY3V0ZWRQaGFzZShjdXJyZW50SGFuZGxlcik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLyogSWYgd2UgYXJlIHJlc3VtaW5nIHRoZSBmbG93LCB3ZSBkb24ndCB3YW50IHRvIGFkZCB0aGUgcGhhc2UKLSAgICAgICAgICAgICAgICAgICAgKiBhZ2FpbiwgYXMgaXQgaGFzIGFscmVhZHkgYmVlbiBhZGRlZC4KLSAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgcmVzdW1pbmcgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcGkgPSBjdXJyZW50SGFuZGxlci5pbnZva2UobXNnQ29udGV4dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoQXhpc0ZhdWx0IGUpIHsKLSAgICAgICAgICAgICAgICBpZiAobXNnQ29udGV4dC5nZXRDdXJyZW50UGhhc2VJbmRleCgpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgLyogSWYgd2UgZ290IGEgZmF1bHQsIHdlIHN0aWxsIHdhbnQgdG8gYWRkIHRoZSBwaGFzZSB0byB0aGUKLSAgICAgICAgICAgICAgICAgICAgbGlzdCB0byBiZSBleGVjdXRlZCBmb3IgZmxvd0NvbXBsZXRlKC4uLikgdW5sZXNzIHRoaXMgd2FzCi0gICAgICAgICAgICAgICAgICAgIHRoZSBmaXJzdCBoYW5kbGVyLCBhcyB0aGVuIHRoZSBjdXJyZW50UGhhc2VJbmRleCB3aWxsIGJlCi0gICAgICAgICAgICAgICAgICAgIHNldCB0byAwIGFuZCB0aGlzIHdpbGwgbG9vayBsaWtlIHdlJ3ZlIGV4ZWN1dGVkIGFsbCBvZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlcnMuICBJZiwgYXQgc29tZSBwb2ludCwgYSBwaGFzZSByZWFsbHkgbmVlZHMgdG8gZ2V0Ci0gICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbiBvZiBmbG93Q29tcGxldGUsIHRoZW4gd2UnbGwgbmVlZCB0byBpbnRyb2R1Y2UKLSAgICAgICAgICAgICAgICAgICAgc29tZSBtb3JlIGNvbXBsZXggbG9naWMgdG8ga2VlcCB0cmFjayBvZiB3aGF0IGhhcyBiZWVuCi0gICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVkLiovCi0gICAgICAgICAgICAgICAgICAgIG1zZ0NvbnRleHQucmVtb3ZlRmlyc3RFeGVjdXRlZFBoYXNlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChwaS5lcXVhbHMoSW52b2NhdGlvblJlc3BvbnNlLlNVU1BFTkQpIHx8Ci0gICAgICAgICAgICAgICAgICAgIHBpLmVxdWFscyhJbnZvY2F0aW9uUmVzcG9uc2UuQUJPUlQpKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1zZ0NvbnRleHQuc2V0Q3VycmVudEhhbmRsZXJJbmRleChtc2dDb250ZXh0LmdldEN1cnJlbnRIYW5kbGVySW5kZXgoKSArIDEpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHBpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZmxvd0NvbXBsZXRlKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHsKLSAgICAgICAgSXRlcmF0b3I8SGFuZGxlcj4gaW52b2tlZFBoYXNlSXRlcmF0b3IgPSBtc2dDb250ZXh0LmdldEV4ZWN1dGVkUGhhc2VzKCk7Ci0KLSAgICAgICAgd2hpbGUgKGludm9rZWRQaGFzZUl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgSGFuZGxlciBjdXJyZW50SGFuZGxlciA9ICgoSGFuZGxlcikgaW52b2tlZFBoYXNlSXRlcmF0b3IubmV4dCgpKTsKLSAgICAgICAgICAgIGN1cnJlbnRIYW5kbGVyLmZsb3dDb21wbGV0ZShtc2dDb250ZXh0KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSB0aGUgT3V0SW5BeGlzT3BlcmF0aW9uIGN1cnJlbnRseSBpbnZva2VzCi0gICAgICAgICogcmVjZWl2ZSgpIGV2ZW4gd2hlbiBhIGZhdWx0IG9jY3VycywgYW5kIHdlIHdpbGwgaGF2ZSBhbHJlYWR5IGV4ZWN1dGVkCi0gICAgICAgICogdGhlIGZsb3dDb21wbGV0ZSBvbiB0aG9zZSBiZWZvcmUgcmVjZWl2ZUZhdWx0KCkgaXMgY2FsbGVkLgotICAgICAgICAqLwotICAgICAgICBtc2dDb250ZXh0LnJlc2V0RXhlY3V0ZWRQaGFzZXMoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJZiB0aGUgbXNnQ29uZXRleHQgaXMgcHVhc2VkIGFuZCB0cnkgdG8gaW52b2tlIHRoZW4KLSAgICAgKiBmaXJzdCBpbnZva2UgdGhlIHBoYXNlIGxpc3QgYW5kIGFmdGVyIHRoZSBtZXNzYWdlIHJlY2VpdmVyCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbXNnQ29udGV4dAotICAgICAqIEByZXR1cm4gQW4gSW52b2NhdGlvblJlc3BvbnNlIGFsbG93aW5nIHRoZSBpbnZva2VyIHRvIHBlcmhhcHMgZGV0ZXJtaW5lCi0gICAgICogICAgICAgICB3aGV0aGVyIG9yIG5vdCB0aGUgbWVzc2FnZSBwcm9jZXNzaW5nIHdpbGwgZXZlciBzdWNjZWVkLgotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBJbnZvY2F0aW9uUmVzcG9uc2UgcmVzdW1lUmVjZWl2ZShNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQgJiYgbG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy50cmFjZShtc2dDb250ZXh0LmdldExvZ0lEU3RyaW5nKCkgKyAiIHJlc3VtZVJlY2VpdmU6IiArIG1zZ0NvbnRleHQuZ2V0TWVzc2FnZUlEKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy9SRVZJRVc6IFRoaXMgbmFtZSBpcyBhIGxpdHRsZSBtaXNsZWFkaW5nLCBhcyBpdCBzZWVtcyB0byBpbmRpY2F0ZSB0aGF0IHRoZXJlIHNob3VsZCBiZSBhIHJlc3VtZVJlY2VpdmVGYXVsdCBhcyB3ZWxsLCB3aGVuLCBpbiBmYWN0LCB0aGlzIGRvZXMgYm90aAotICAgICAgICAvL1JFVklFVzogVW5saWtlIHdpdGggcmVjZWl2ZSwgdGhlcmUgaXMgbm8gd3JhcHBpbmcgdHJ5L2NhdGNoIGNsYXVzZSB3aGljaCB3b3VsZAotICAgICAgICAvL2ZpcmUgb2ZmIHRoZSBmbG93Q29tcGxldGUgb24gYW4gZXJyb3IsIGFzIHdlIGhhdmUgdG8gYXNzdW1lIHRoYXQgdGhlCi0gICAgICAgIC8vbWVzc2FnZSB3aWxsIGJlIHJlc3VtZWQgYWdhaW4sIGJ1dCBwZXJoYXBzIHdlIG5lZWQgdG8gdW53aW5kIGJhY2sgdG8KLSAgICAgICAgLy90aGUgcG9pbnQgYXQgd2hpY2ggdGhlIG1lc3NhZ2Ugd2FzIHJlc3VtZWQgYW5kIHByb3ZpZGUgYW5vdGhlciBBUEkKLSAgICAgICAgLy90byBhbGxvdyB0aGUgZnVsbCB1bndpbmQgaWYgdGhlIG1lc3NhZ2UgaXMgZ29pbmcgdG8gYmUgZGlzY2FyZGVkLgotICAgICAgICAvL2ludm9rZSB0aGUgcGhhc2VzCi0gICAgICAgIEludm9jYXRpb25SZXNwb25zZSBwaSA9IGludm9rZShtc2dDb250ZXh0LCBSRVNVTUlOR19FWEVDVVRJT04pOwotICAgICAgICAvL2ludm9raW5nIHRoZSBNUgotCi0gICAgICAgIGlmIChwaS5lcXVhbHMoSW52b2NhdGlvblJlc3BvbnNlLkNPTlRJTlVFKSkgewotICAgICAgICAgICAgY2hlY2tNdXN0VW5kZXJzdGFuZChtc2dDb250ZXh0KTsKLSAgICAgICAgICAgIGlmIChtc2dDb250ZXh0LmlzU2VydmVyU2lkZSgpKSB7Ci0gICAgICAgICAgICAgICAgLy8gaW52b2tlIHRoZSBNZXNzYWdlIFJlY2VpdmVycwotICAgICAgICAgICAgICAgIE1lc3NhZ2VSZWNlaXZlciByZWNlaXZlciA9IG1zZ0NvbnRleHQuZ2V0QXhpc09wZXJhdGlvbigpLmdldE1lc3NhZ2VSZWNlaXZlcigpOwotICAgICAgICAgICAgICAgIGlmIChyZWNlaXZlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoTWVzc2FnZXMuZ2V0TWVzc2FnZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm9tZXNzYWdlcmVjaWV2ZXIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZ0NvbnRleHQuZ2V0QXhpc09wZXJhdGlvbigpLmdldE5hbWUoKS50b1N0cmluZygpKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJlY2VpdmVyLnJlY2VpdmUobXNnQ29udGV4dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmbG93Q29tcGxldGUobXNnQ29udGV4dCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcGk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVG8gcmVzdW1lIHRoZSBpbnZvY2F0aW9uIGF0IHRoZSBzZW5kIHBhdGggLCB0aGlzIGlzIG5lZW5lZCBzaW5jZSBpdCBpcyByZXF1aXJlIHRvIGNhbGwKLSAgICAgKiBUcmFuc3BvcnRTZW5kZXIgYXQgdGhlIGVuZAotICAgICAqCi0gICAgICogQHBhcmFtIG1zZ0NvbnRleHQKLSAgICAgKiBAcmV0dXJuIEFuIEludm9jYXRpb25SZXNwb25zZSBhbGxvd2luZyB0aGUgaW52b2tlciB0byBwZXJoYXBzIGRldGVybWluZQotICAgICAqICAgICAgICAgd2hldGhlciBvciBub3QgdGhlIG1lc3NhZ2UgcHJvY2Vzc2luZyB3aWxsIGV2ZXIgc3VjY2VlZC4KLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSW52b2NhdGlvblJlc3BvbnNlIHJlc3VtZVNlbmQoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkICYmIGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cudHJhY2UobXNnQ29udGV4dC5nZXRMb2dJRFN0cmluZygpICsgIiByZXN1bWVTZW5kOiIgKyBtc2dDb250ZXh0LmdldE1lc3NhZ2VJRCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vUkVWSUVXOiBUaGlzIG5hbWUgaXMgYSBsaXR0bGUgbWlzbGVhZGluZywgYXMgaXQgc2VlbXMgdG8gaW5kaWNhdGUgdGhhdCB0aGVyZSBzaG91bGQgYmUgYSByZXN1bWVTZW5kRmF1bHQgYXMgd2VsbCwgd2hlbiwgaW4gZmFjdCwgdGhpcyBkb2VzIGJvdGgKLSAgICAgICAgLy9SRVZJRVc6IFVubGlrZSB3aXRoIHNlbmQsIHRoZXJlIGlzIG5vIHdyYXBwaW5nIHRyeS9jYXRjaCBjbGF1c2Ugd2hpY2ggd291bGQKLSAgICAgICAgLy9maXJlIG9mZiB0aGUgZmxvd0NvbXBsZXRlIG9uIGFuIGVycm9yLCBhcyB3ZSBoYXZlIHRvIGFzc3VtZSB0aGF0IHRoZQotICAgICAgICAvL21lc3NhZ2Ugd2lsbCBiZSByZXN1bWVkIGFnYWluLCBidXQgcGVyaGFwcyB3ZSBuZWVkIHRvIHVud2luZCBiYWNrIHRvCi0gICAgICAgIC8vdGhlIHBvaW50IGF0IHdoaWNoIHRoZSBtZXNzYWdlIHdhcyByZXN1bWVkIGFuZCBwcm92aWRlIGFub3RoZXIgQVBJCi0gICAgICAgIC8vdG8gYWxsb3cgdGhlIGZ1bGwgdW53aW5kIGlmIHRoZSBtZXNzYWdlIGlzIGdvaW5nIHRvIGJlIGRpc2NhcmRlZC4KLSAgICAgICAgLy9pbnZva2UgdGhlIHBoYXNlcwotICAgICAgICBJbnZvY2F0aW9uUmVzcG9uc2UgcGkgPSBpbnZva2UobXNnQ29udGV4dCwgUkVTVU1JTkdfRVhFQ1VUSU9OKTsKLSAgICAgICAgLy9JbnZva2luZyBUcmFuc3BvcnQgU2VuZGVyCi0gICAgICAgIGlmIChwaS5lcXVhbHMoSW52b2NhdGlvblJlc3BvbnNlLkNPTlRJTlVFKSkgewotICAgICAgICAgICAgLy8gd3JpdGUgdGhlIE1lc3NhZ2UgdG8gdGhlIFdpcmUKLSAgICAgICAgICAgIFRyYW5zcG9ydE91dERlc2NyaXB0aW9uIHRyYW5zcG9ydE91dCA9IG1zZ0NvbnRleHQuZ2V0VHJhbnNwb3J0T3V0KCk7Ci0gICAgICAgICAgICBUcmFuc3BvcnRTZW5kZXIgc2VuZGVyID0gdHJhbnNwb3J0T3V0LmdldFNlbmRlcigpOwotICAgICAgICAgICAgc2VuZGVyLmludm9rZShtc2dDb250ZXh0KTsKLSAgICAgICAgICAgIGZsb3dDb21wbGV0ZShtc2dDb250ZXh0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBwaTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXN1bWUgcHJvY2Vzc2luZyBvZiBhIG1lc3NhZ2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbXNnY3R4Ci0gICAgICogQHJldHVybiBBbiBJbnZvY2F0aW9uUmVzcG9uc2UgYWxsb3dpbmcgdGhlIGludm9rZXIgdG8gcGVyaGFwcyBkZXRlcm1pbmUKLSAgICAgKiAgICAgICAgIHdoZXRoZXIgb3Igbm90IHRoZSBtZXNzYWdlIHByb2Nlc3Npbmcgd2lsbCBldmVyIHN1Y2NlZWQuCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEludm9jYXRpb25SZXNwb25zZSByZXN1bWUoTWVzc2FnZUNvbnRleHQgbXNnY3R4KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQgJiYgbG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy50cmFjZShtc2djdHguZ2V0TG9nSURTdHJpbmcoKSArICIgcmVzdW1lOiIgKyBtc2djdHguZ2V0TWVzc2FnZUlEKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgbXNnY3R4LnNldFBhdXNlZChmYWxzZSk7Ci0gICAgICAgIGlmIChtc2djdHguZ2V0RkxPVygpID09IE1lc3NhZ2VDb250ZXh0LklOX0ZMT1cpIHsKLSAgICAgICAgICAgIHJldHVybiByZXN1bWVSZWNlaXZlKG1zZ2N0eCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVzdW1lU2VuZChtc2djdHgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2RzIHJlcHJlc2VudHMgdGhlIG91dGZsb3cgb2YgdGhlIEF4aXMsIHRoaXMgY291bGQgYmUgZWl0aGVyIGF0IHRoZSBzZXJ2ZXIgc2lkZSBvciB0aGUgY2xpZW50IHNpZGUuCi0gICAgICogSGVyZSB0aGUgPGNvZGU+RXhlY3V0aW9uQ2hhaW48L2NvZGU+IGlzIGNyZWF0ZWQgdXNpbmcgdGhlIFBoYXNlcy4gVGhlIEhhbmRsZXJzIGF0IHRoZSBlYWNoIFBoYXNlcyBpcyBvcmRlcmVkIGluCi0gICAgICogZGVwbG95bWVudCB0aW1lIGJ5IHRoZSBkZXBsb3ltZW50IG1vZHVsZQotICAgICAqCi0gICAgICogQHBhcmFtIG1zZ0NvbnRleHQKLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdAotICAgICAqIEBzZWUgTWVzc2FnZUNvbnRleHQKLSAgICAgKiBAc2VlIFBoYXNlCi0gICAgICogQHNlZSBIYW5kbGVyCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNlbmQoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkICYmIGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cudHJhY2UobXNnQ29udGV4dC5nZXRMb2dJRFN0cmluZygpICsgIiBzZW5kOiIgKyBtc2dDb250ZXh0LmdldE1lc3NhZ2VJRCgpKTsKLSAgICAgICAgfQotICAgICAgICAvLyBmaW5kIGFuZCBpbnZva2UgdGhlIFBoYXNlcwotICAgICAgICBPcGVyYXRpb25Db250ZXh0IG9wZXJhdGlvbkNvbnRleHQgPSBtc2dDb250ZXh0LmdldE9wZXJhdGlvbkNvbnRleHQoKTsKLSAgICAgICAgQXJyYXlMaXN0IGV4ZWN1dGlvbkNoYWluID0gb3BlcmF0aW9uQ29udGV4dC5nZXRBeGlzT3BlcmF0aW9uKCkuZ2V0UGhhc2VzT3V0RmxvdygpOwotICAgICAgICAvL3JhdGhlciB0aGFuIGhhdmluZyB0d28gc3RlcHMgYWRkZWQgYm90aCBvcGFyYXRpb24gYW5kIGdsb2JhbCBjaGFpbiB0b2dldGhlcgotICAgICAgICBBcnJheUxpc3Qgb3V0UGhhc2VzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBvdXRQaGFzZXMuYWRkQWxsKGV4ZWN1dGlvbkNoYWluKTsKLSAgICAgICAgb3V0UGhhc2VzLmFkZEFsbChtc2dDb250ZXh0LmdldENvbmZpZ3VyYXRpb25Db250ZXh0KCkuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5nZXRPdXRGbG93UGhhc2VzKCkpOwotICAgICAgICBtc2dDb250ZXh0LnNldEV4ZWN1dGlvbkNoYWluKG91dFBoYXNlcyk7Ci0gICAgICAgIG1zZ0NvbnRleHQuc2V0RkxPVyhNZXNzYWdlQ29udGV4dC5PVVRfRkxPVyk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJbnZvY2F0aW9uUmVzcG9uc2UgcGkgPSBpbnZva2UobXNnQ29udGV4dCwgTk9UX1JFU1VNSU5HX0VYRUNVVElPTik7Ci0KLSAgICAgICAgICAgIGlmIChwaS5lcXVhbHMoSW52b2NhdGlvblJlc3BvbnNlLkNPTlRJTlVFKSkgewotICAgICAgICAgICAgICAgIC8vIHdyaXRlIHRoZSBNZXNzYWdlIHRvIHRoZSBXaXJlCi0gICAgICAgICAgICAgICAgVHJhbnNwb3J0T3V0RGVzY3JpcHRpb24gdHJhbnNwb3J0T3V0ID0gbXNnQ29udGV4dC5nZXRUcmFuc3BvcnRPdXQoKTsKLSAgICAgICAgICAgICAgICBpZiAodHJhbnNwb3J0T3V0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiVHJhbnNwb3J0IG91dCBoYXMgbm90IGJlZW4gc2V0Iik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFRyYW5zcG9ydFNlbmRlciBzZW5kZXIgPSB0cmFuc3BvcnRPdXQuZ2V0U2VuZGVyKCk7Ci0gICAgICAgICAgICAgICAgLy8gVGhpcyBib29sZWFuIHByb3BlcnR5IG9ubHkgdXNlZCBpbiBjbGllbnQgc2lkZSBmaXJlQW5kRm9yZ2V0IGludm9jYXRpb24KLSAgICAgICAgICAgICAgICAvL0l0IHdpbGwgc2V0IGEgcHJvcGVydHkgaW50byBtZXNzYWdlIGNvbnRleHQgYW5kIGlmIHNvbWUgb25lIGhhcyBzZXQgdGhlCi0gICAgICAgICAgICAgICAgLy9wcm9wZXJ0eSB0aGVuIHRyYW5zcG9ydCBzZW5kZXIgd2lsbCBpbnZva2UgaW4gYSBkaWZmcmVudCB0aHJlYWQKLSAgICAgICAgICAgICAgICBPYmplY3QgaXNUcmFuc3BvcnROb25CbG9ja2luZyA9IG1zZ0NvbnRleHQuZ2V0UHJvcGVydHkoCi0gICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlQ29udGV4dC5UUkFOU1BPUlRfTk9OX0JMT0NLSU5HKTsKLSAgICAgICAgICAgICAgICBpZiAoaXNUcmFuc3BvcnROb25CbG9ja2luZyAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAoKEJvb2xlYW4pIGlzVHJhbnNwb3J0Tm9uQmxvY2tpbmcpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1zZ0NvbnRleHQuZ2V0Q29uZmlndXJhdGlvbkNvbnRleHQoKS5nZXRUaHJlYWRQb29sKCkuZXhlY3V0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVHJhbnNwb3J0Tm9uQmxvY2tpbmdJbnZvY2F0aW9uV29ya2VyKG1zZ0NvbnRleHQsIHNlbmRlcikpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHNlbmRlci5pbnZva2UobXNnQ29udGV4dCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vUkVWSUVXOiBJbiB0aGUgY2FzZSBvZiB0aGUgVHJhbnNwb3J0Tm9uQmxvY2tpbmdJbnZvY2F0aW9uV29ya2VyLCBkb2VzIHRoaXMgbmVlZCB0byB3YWl0IHVudGlsIHRoYXQgZmluaXNoZXM/Ci0gICAgICAgICAgICAgICAgZmxvd0NvbXBsZXRlKG1zZ0NvbnRleHQpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChwaS5lcXVhbHMoSW52b2NhdGlvblJlc3BvbnNlLlNVU1BFTkQpKSB7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHBpLmVxdWFscyhJbnZvY2F0aW9uUmVzcG9uc2UuQUJPUlQpKSB7Ci0gICAgICAgICAgICAgICAgZmxvd0NvbXBsZXRlKG1zZ0NvbnRleHQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZXJyb3JNc2cgPQotICAgICAgICAgICAgICAgICAgICAgICAgIlVucmVjb2duaXplZCBJbnZvY2F0aW9uUmVzcG9uc2UgZW5jb3VudGVyZWQgaW4gQXhpc0VuZ2luZS5zZW5kKCkiOwotICAgICAgICAgICAgICAgIGxvZy5lcnJvcihtc2dDb250ZXh0LmdldExvZ0lEU3RyaW5nKCkgKyAiICIgKyBlcnJvck1zZyk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdChlcnJvck1zZyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBlKSB7Ci0gICAgICAgICAgICBtc2dDb250ZXh0LnNldEZhaWx1cmVSZWFzb24oZSk7Ci0gICAgICAgICAgICBmbG93Q29tcGxldGUobXNnQ29udGV4dCk7Ci0gICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VuZHMgdGhlIFNPQVAgRmF1bHQgdG8gYW5vdGhlciBTT0FQIG5vZGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbXNnQ29udGV4dAotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNlbmRGYXVsdChNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQgJiYgbG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy50cmFjZShtc2dDb250ZXh0LmdldExvZ0lEU3RyaW5nKCkgKyAiIHNlbmRGYXVsdDoiICsgbXNnQ29udGV4dC5nZXRNZXNzYWdlSUQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgT3BlcmF0aW9uQ29udGV4dCBvcENvbnRleHQgPSBtc2dDb250ZXh0LmdldE9wZXJhdGlvbkNvbnRleHQoKTsKLQotICAgICAgICAvL0ZJWE1FOiBJZiB0aGlzIGdldHMgcGF1c2VkIGluIHRoZSBvcGVyYXRpb24tc3BlY2lmaWMgcGhhc2VzLCB0aGUgcmVzdW1lIGlzIG5vdCBnb2luZyB0byBmdW5jdGlvbiBjb3JyZWN0bHkgYXMgdGhlIHBoYXNlcyB3aWxsIG5vdCBoYXZlIGFsbCBiZWVuIHNldAotCi0gICAgICAgIC8vIGZpbmQgYW5kIGV4ZWN1dGUgdGhlIEZhdWx0IE91dCBGbG93IEhhbmRsZXJzCi0gICAgICAgIGlmIChvcENvbnRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uID0gb3BDb250ZXh0LmdldEF4aXNPcGVyYXRpb24oKTsKLSAgICAgICAgICAgIEFycmF5TGlzdCBmYXVsdEV4ZWN1dGlvbkNoYWluID0gYXhpc09wZXJhdGlvbi5nZXRQaGFzZXNPdXRGYXVsdEZsb3coKTsKLQotICAgICAgICAgICAgLy9hZGRpbmcgYm90aCBvcGVyYXRpb24gc3BlY2lmaWMgYW5kIGdsb2JhbCBvdXQgZmF1bHQgZmxvd3MuCi0KLSAgICAgICAgICAgIEFycmF5TGlzdCBvdXRGYXVsdFBoYXNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgIG91dEZhdWx0UGhhc2VzLmFkZEFsbCgoQXJyYXlMaXN0KSBmYXVsdEV4ZWN1dGlvbkNoYWluLmNsb25lKCkpOwotICAgICAgICAgICAgbXNnQ29udGV4dC5zZXRFeGVjdXRpb25DaGFpbigoQXJyYXlMaXN0KSBvdXRGYXVsdFBoYXNlcy5jbG9uZSgpKTsKLSAgICAgICAgICAgIG1zZ0NvbnRleHQuc2V0RkxPVyhNZXNzYWdlQ29udGV4dC5PVVRfRkFVTFRfRkxPVyk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIEludm9jYXRpb25SZXNwb25zZSBwaSA9IGludm9rZShtc2dDb250ZXh0LCBOT1RfUkVTVU1JTkdfRVhFQ1VUSU9OKTsKLQotICAgICAgICAgICAgICAgIGlmIChwaS5lcXVhbHMoSW52b2NhdGlvblJlc3BvbnNlLlNVU1BFTkQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKG1zZ0NvbnRleHQuZ2V0TG9nSURTdHJpbmcoKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBUaGUgcmVzdW1wdGlvbiBvZiB0aGlzIGZsb3cgbWF5IGZ1bmN0aW9uIGluY29ycmVjdGx5LCBhcyB0aGUgT3V0RmF1bHRGbG93IHdpbGwgbm90IGJlIHVzZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGkuZXF1YWxzKEludm9jYXRpb25SZXNwb25zZS5BQk9SVCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZmxvd0NvbXBsZXRlKG1zZ0NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghcGkuZXF1YWxzKEludm9jYXRpb25SZXNwb25zZS5DT05USU5VRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGVycm9yTXNnID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5yZWNvZ25pemVkIEludm9jYXRpb25SZXNwb25zZSBlbmNvdW50ZXJlZCBpbiBBeGlzRW5naW5lLnNlbmRGYXVsdCgpIjsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKG1zZ0NvbnRleHQuZ2V0TG9nSURTdHJpbmcoKSArICIgIiArIGVycm9yTXNnKTsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdChlcnJvck1zZyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEF4aXNGYXVsdCBlKSB7Ci0gICAgICAgICAgICAgICAgbXNnQ29udGV4dC5zZXRGYWlsdXJlUmVhc29uKGUpOwotICAgICAgICAgICAgICAgIGZsb3dDb21wbGV0ZShtc2dDb250ZXh0KTsKLSAgICAgICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQXJyYXlMaXN0PEhhbmRsZXI+IGV4ZWN1dGlvbkNoYWluID0gbmV3IEFycmF5TGlzdDxIYW5kbGVyPihtc2dDb250ZXh0LmdldENvbmZpZ3VyYXRpb25Db250ZXh0KCkKLSAgICAgICAgICAgICAgICAuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5nZXRPdXRGYXVsdEZsb3dQaGFzZXMoKSk7Ci0gICAgICAgIG1zZ0NvbnRleHQuc2V0RXhlY3V0aW9uQ2hhaW4oZXhlY3V0aW9uQ2hhaW4pOwotICAgICAgICBtc2dDb250ZXh0LnNldEZMT1coTWVzc2FnZUNvbnRleHQuT1VUX0ZBVUxUX0ZMT1cpOwotICAgICAgICBJbnZvY2F0aW9uUmVzcG9uc2UgcGkgPSBpbnZva2UobXNnQ29udGV4dCwgTk9UX1JFU1VNSU5HX0VYRUNVVElPTik7Ci0KLSAgICAgICAgaWYgKHBpLmVxdWFscyhJbnZvY2F0aW9uUmVzcG9uc2UuQ09OVElOVUUpKSB7Ci0gICAgICAgICAgICAvLyBBY3R1YWxseSBzZW5kIHRoZSBTT0FQIEZhdWx0Ci0gICAgICAgICAgICBUcmFuc3BvcnRPdXREZXNjcmlwdGlvbiB0cmFuc3BvcnRPdXQgPSBtc2dDb250ZXh0LmdldFRyYW5zcG9ydE91dCgpOwotICAgICAgICAgICAgaWYgKHRyYW5zcG9ydE91dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiVHJhbnNwb3J0IG91dCBoYXMgbm90IGJlZW4gc2V0Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBUcmFuc3BvcnRTZW5kZXIgc2VuZGVyID0gdHJhbnNwb3J0T3V0LmdldFNlbmRlcigpOwotCi0gICAgICAgICAgICBzZW5kZXIuaW52b2tlKG1zZ0NvbnRleHQpOwotICAgICAgICAgICAgZmxvd0NvbXBsZXRlKG1zZ0NvbnRleHQpOwotICAgICAgICB9IGVsc2UgaWYgKHBpLmVxdWFscyhJbnZvY2F0aW9uUmVzcG9uc2UuU1VTUEVORCkpIHsKLSAgICAgICAgfSBlbHNlIGlmIChwaS5lcXVhbHMoSW52b2NhdGlvblJlc3BvbnNlLkFCT1JUKSkgewotICAgICAgICAgICAgZmxvd0NvbXBsZXRlKG1zZ0NvbnRleHQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgU3RyaW5nIGVycm9yTXNnID0KLSAgICAgICAgICAgICAgICAgICAgIlVucmVjb2duaXplZCBJbnZvY2F0aW9uUmVzcG9uc2UgZW5jb3VudGVyZWQgaW4gQXhpc0VuZ2luZS5zZW5kRmF1bHQoKSI7Ci0gICAgICAgICAgICBsb2cuZXJyb3IobXNnQ29udGV4dC5nZXRMb2dJRFN0cmluZygpICsgIiAiICsgZXJyb3JNc2cpOwotICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdChlcnJvck1zZyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBoZXJlIHdlIGFzc3VtZSB0aGF0IGl0IGlzIHJlc3VtZSBmcm9tIGFuIG9wZXJhdGlvbiBsZXZlbCBoYW5kbGVyCi0gICAgICogQHBhcmFtIG1zZ0NvbnRleHQKLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZXN1bWVTZW5kRmF1bHQoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdHsKLSAgICAgICAgaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQgJiYgbG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy50cmFjZShtc2dDb250ZXh0LmdldExvZ0lEU3RyaW5nKCkgKyAiIHJlc3VtZVNlbmRGYXVsdDoiICsgbXNnQ29udGV4dC5nZXRNZXNzYWdlSUQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgT3BlcmF0aW9uQ29udGV4dCBvcENvbnRleHQgPSBtc2dDb250ZXh0LmdldE9wZXJhdGlvbkNvbnRleHQoKTsKLQotICAgICAgICBpZiAob3BDb250ZXh0ICE9IG51bGwpIHsKLQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBJbnZvY2F0aW9uUmVzcG9uc2UgcGkgPSBpbnZva2UobXNnQ29udGV4dCwgUkVTVU1JTkdfRVhFQ1VUSU9OKTsKLQotICAgICAgICAgICAgICAgIGlmIChwaS5lcXVhbHMoSW52b2NhdGlvblJlc3BvbnNlLlNVU1BFTkQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKG1zZ0NvbnRleHQuZ2V0TG9nSURTdHJpbmcoKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBUaGUgcmVzdW1wdGlvbiBvZiB0aGlzIGZsb3cgbWF5IGZ1bmN0aW9uIGluY29ycmVjdGx5LCBhcyB0aGUgT3V0RmF1bHRGbG93IHdpbGwgbm90IGJlIHVzZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGkuZXF1YWxzKEludm9jYXRpb25SZXNwb25zZS5BQk9SVCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZmxvd0NvbXBsZXRlKG1zZ0NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghcGkuZXF1YWxzKEludm9jYXRpb25SZXNwb25zZS5DT05USU5VRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGVycm9yTXNnID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5yZWNvZ25pemVkIEludm9jYXRpb25SZXNwb25zZSBlbmNvdW50ZXJlZCBpbiBBeGlzRW5naW5lLnNlbmRGYXVsdCgpIjsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKG1zZ0NvbnRleHQuZ2V0TG9nSURTdHJpbmcoKSArICIgIiArIGVycm9yTXNnKTsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdChlcnJvck1zZyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGUpIHsKLSAgICAgICAgICAgICAgICBtc2dDb250ZXh0LnNldEZhaWx1cmVSZWFzb24oZSk7Ci0gICAgICAgICAgICAgICAgZmxvd0NvbXBsZXRlKG1zZ0NvbnRleHQpOwotICAgICAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBBcnJheUxpc3Q8SGFuZGxlcj4gZXhlY3V0aW9uQ2hhaW4gPSBuZXcgQXJyYXlMaXN0PEhhbmRsZXI+KG1zZ0NvbnRleHQuZ2V0Q29uZmlndXJhdGlvbkNvbnRleHQoKQotICAgICAgICAgICAgICAgIC5nZXRBeGlzQ29uZmlndXJhdGlvbigpLmdldE91dEZhdWx0Rmxvd1BoYXNlcygpKTsKLSAgICAgICAgbXNnQ29udGV4dC5zZXRFeGVjdXRpb25DaGFpbihleGVjdXRpb25DaGFpbik7Ci0gICAgICAgIG1zZ0NvbnRleHQuc2V0RkxPVyhNZXNzYWdlQ29udGV4dC5PVVRfRkFVTFRfRkxPVyk7Ci0gICAgICAgIEludm9jYXRpb25SZXNwb25zZSBwaSA9IGludm9rZShtc2dDb250ZXh0LCBOT1RfUkVTVU1JTkdfRVhFQ1VUSU9OKTsKLQotICAgICAgICBpZiAocGkuZXF1YWxzKEludm9jYXRpb25SZXNwb25zZS5DT05USU5VRSkpIHsKLSAgICAgICAgICAgIC8vIEFjdHVhbGx5IHNlbmQgdGhlIFNPQVAgRmF1bHQKLSAgICAgICAgICAgIFRyYW5zcG9ydE91dERlc2NyaXB0aW9uIHRyYW5zcG9ydE91dCA9IG1zZ0NvbnRleHQuZ2V0VHJhbnNwb3J0T3V0KCk7Ci0gICAgICAgICAgICBpZiAodHJhbnNwb3J0T3V0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJUcmFuc3BvcnQgb3V0IGhhcyBub3QgYmVlbiBzZXQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFRyYW5zcG9ydFNlbmRlciBzZW5kZXIgPSB0cmFuc3BvcnRPdXQuZ2V0U2VuZGVyKCk7Ci0KLSAgICAgICAgICAgIHNlbmRlci5pbnZva2UobXNnQ29udGV4dCk7Ci0gICAgICAgICAgICBmbG93Q29tcGxldGUobXNnQ29udGV4dCk7Ci0gICAgICAgIH0gZWxzZSBpZiAocGkuZXF1YWxzKEludm9jYXRpb25SZXNwb25zZS5TVVNQRU5EKSkgewotICAgICAgICB9IGVsc2UgaWYgKHBpLmVxdWFscyhJbnZvY2F0aW9uUmVzcG9uc2UuQUJPUlQpKSB7Ci0gICAgICAgICAgICBmbG93Q29tcGxldGUobXNnQ29udGV4dCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBTdHJpbmcgZXJyb3JNc2cgPQotICAgICAgICAgICAgICAgICAgICAiVW5yZWNvZ25pemVkIEludm9jYXRpb25SZXNwb25zZSBlbmNvdW50ZXJlZCBpbiBBeGlzRW5naW5lLnNlbmRGYXVsdCgpIjsKLSAgICAgICAgICAgIGxvZy5lcnJvcihtc2dDb250ZXh0LmdldExvZ0lEU3RyaW5nKCkgKyAiICIgKyBlcnJvck1zZyk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KGVycm9yTXNnKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogVGhpcyBjbGFzcyBpcyB1c2VkIHdoZW4gc29tZW9uZSBpbnZva2UgYSBzZXJ2aWNlIGludm9jYXRpb24gd2l0aCB0d28gdHJhbnNwb3J0cwotICAgICAqIElmIHdlIGRvbnQgY3JlYXRlIGEgbmV3IHRocmVhZCB0aGVuIHRoZSBtYWluIHRocmVhZCB3aWxsIGJsb2NrIHVudGlsbCBpdCBnZXRzIHRoZQotICAgICAqIHJlc3BvbnNlIC4gSW4gdGhlIGNhc2Ugb2YgSFRUUCB0cmFuc3BvcnRzZW5kZXIgd2lsbCBibG9jayB1bnRpbGwgaXQgZ2V0cyBIVFRQIDIwMAotICAgICAqIFNvICwgbWFpbiB0aHJlYWQgYWxzbyBibG9jayB0aWxsIHRyYW5zcG9ydCBzZW5kZXIgcmVyZWFzZXMgdGhlIHRyZWFkLiBTbyB0aGVyZSBpcyBubwotICAgICAqIGFjdHVhbCBub24tYmxvY2tpbmcuIFRoYXQgaXMgd2h5IHdoZW4gc2VuZGluZyB3ZSBjcmVhdCBhIG5ldyB0aGVhZCBhbmQgc2VuZCB0aGUKLSAgICAgKiByZXF1c2V0IHZpYSB0aGF0LgotICAgICAqIDxwLz4KLSAgICAgKiBTbyB3aG9sZSBwb3Jwb3NlIG9mIHRoaXMgY2xhc3MgdG8gc2VuZCB0aGUgcmVxdXNldCB2aWEgYSBuZXcgdGhyZWFkCi0gICAgICogPHAvPgotICAgICAqIHdheSB0cmFuc3BvcnQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVHJhbnNwb3J0Tm9uQmxvY2tpbmdJbnZvY2F0aW9uV29ya2VyIGltcGxlbWVudHMgUnVubmFibGUgewotICAgICAgICBwcml2YXRlIE1lc3NhZ2VDb250ZXh0IG1zZ2N0eDsKLSAgICAgICAgcHJpdmF0ZSBUcmFuc3BvcnRTZW5kZXIgc2VuZGVyOwotCi0gICAgICAgIHB1YmxpYyBUcmFuc3BvcnROb25CbG9ja2luZ0ludm9jYXRpb25Xb3JrZXIoTWVzc2FnZUNvbnRleHQgbXNnY3R4LAotICAgICAgICAgICAgVHJhbnNwb3J0U2VuZGVyIHNlbmRlcikgewotICAgICAgICAgICAgdGhpcy5tc2djdHggPSBtc2djdHg7Ci0gICAgICAgICAgICB0aGlzLnNlbmRlciA9IHNlbmRlcjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgc2VuZGVyLmludm9rZShtc2djdHgpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBsb2cuaW5mbyhtc2djdHguZ2V0TG9nSURTdHJpbmcoKSArICIgIiArIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICBpZiAobXNnY3R4LmdldFByb3BlcnR5KE1lc3NhZ2VDb250ZXh0LkRJU0FCTEVfQVNZTkNfQ0FMTEJBQ0tfT05fVFJBTlNQT1JUX0VSUk9SKSA9PQotICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb24gPSBtc2djdHguZ2V0QXhpc09wZXJhdGlvbigpOwotICAgICAgICAgICAgICAgICAgICBpZiAoYXhpc09wZXJhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlUmVjZWl2ZXIgbXNnUmVjZWl2ZXIgPSBheGlzT3BlcmF0aW9uLmdldE1lc3NhZ2VSZWNlaXZlcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChtc2dSZWNlaXZlciAhPSBudWxsKSAmJiAobXNnUmVjZWl2ZXIgaW5zdGFuY2VvZiBDYWxsYmFja1JlY2VpdmVyKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjYWxsYmFjayA9ICgoQ2FsbGJhY2tSZWNlaXZlcikgbXNnUmVjZWl2ZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubG9va3VwQ2FsbGJhY2sobXNnY3R4LmdldE1lc3NhZ2VJRCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2sgPT0gbnVsbCkgcmV0dXJuOyAvLyBUT0RPOiBzaG91bGQgd2UgbG9nIHRoaXM/PwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjayBpbnN0YW5jZW9mIENhbGxiYWNrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluc3RhbmNlcyBvZiBDYWxsYmFjayBvbmx5IGV4cGVjdCBvbkNvbXBsZXRlIHRvIGJlIGNhbGxlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgYSBzdWNjZXNzZnVsIE1FUC4gIEVycm9ycyBhcmUgcmVwb3J0ZWQgdGhyb3VnaCB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXN5bmMgUmVzcG9uc2Ugb2JqZWN0LCB3aGljaCB0aGUgQ2FsbGJhY2sgaW1wbGVtZW50YXRpb25zIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGwgdXNlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENhbGxiYWNrKWNhbGxiYWNrKS5vbkVycm9yKGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBBeGlzQ2FsbGJhY2sgKHdoaWNoIGlzIE91dEluQXhpc09wZXJhdGlvbkNsaWVudCRTeW5jQ2FsbEJhY2sKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXNlZCB0byBzdXBwb3J0IGFzeW5jLW9uLXRoZS13aXJlIHVuZGVyIGEgc3luY2hyb25vdXMgQVBJIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvcGVyYXRpb24pIG5lZWQgdG8gYmUgdG9sZCB0aGUgTUVQIGlzIGNvbXBsZXRlIGFmdGVyIGJlaW5nIHRvbGQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2YgdGhlIGVycm9yLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEF4aXNDYWxsYmFjayljYWxsYmFjaykub25FcnJvcihlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChBeGlzQ2FsbGJhY2spY2FsbGJhY2spLm9uQ29tcGxldGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZW5naW5lL0F4aXNFcnJvci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9BeGlzRXJyb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE2NzI3Yy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZW5naW5lL0F4aXNFcnJvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZTsKLQotcHVibGljIGNsYXNzIEF4aXNFcnJvciBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24gewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNjI5MTA2MjEzNjQwNzk5NTkyMEw7Ci0KLSAgICBwdWJsaWMgQXhpc0Vycm9yKCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBtZXNzYWdlIEVycm9yIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgQXhpc0Vycm9yKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBtZXNzYWdlIEVycm9yIG1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gY2F1c2UgICBDYXVzZQotICAgICAqLwotICAgIHB1YmxpYyBBeGlzRXJyb3IoU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlLCBjYXVzZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9BeGlzRXZlbnQuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvQXhpc0V2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyZDk1MTIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9BeGlzRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZTsKLQotcHVibGljIGNsYXNzIEF4aXNFdmVudCB7Ci0KLSAgICAvKioKLSAgICAgKiBBbiBBeGlzIGV2ZW50IGlzIHNlbnQgdG8gcmVnaXN0ZXJlZCBsaXN0ZW5lcnMgd2hlbmV2ZXIgYW55dGhpbmcgc2lnbmlmaWNhbnQKLSAgICAgKiBoYXBwZW5zIHRvIDxjb2RlPkF4aXNDb25maWd1cmF0aW9uPC9jb2RlPi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVJWSUNFX0RFUExPWSA9IDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VSVklDRV9SRU1PVkUgPSAwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFUlZJQ0VfU1RPUCA9IDI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VSVklDRV9TVEFSVCA9IDM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9EVUxFX0RFUExPWSA9IDQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9EVUxFX1JFTU9WRSA9IDU7Ci0gICAgcHJpdmF0ZSBpbnQgRVZFTlRfVFlQRTsKLQotICAgIHB1YmxpYyBBeGlzRXZlbnQoaW50IEVWRU5UX1RZUEUpIHsKLSAgICAgICAgdGhpcy5FVkVOVF9UWVBFID0gRVZFTlRfVFlQRTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldEV2ZW50VHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIEVWRU5UX1RZUEU7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZW5naW5lL0F4aXNPYnNlcnZlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9BeGlzT2JzZXJ2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYyNTY0MS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZW5naW5lL0F4aXNPYnNlcnZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZW5naW5lOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzTW9kdWxlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZUdyb3VwOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVySW5jbHVkZTsKLQotcHVibGljIGludGVyZmFjZSBBeGlzT2JzZXJ2ZXIgZXh0ZW5kcyBQYXJhbWV0ZXJJbmNsdWRlIHsKLQotICAgIC8vIFRoZSBpbml0aWxpemF0aW9uIGNvZGUgd2lsbCBnbyBoZXJlCi0gICAgdm9pZCBpbml0KEF4aXNDb25maWd1cmF0aW9uIGF4aXNDb25maWcpOwotCi0gICAgdm9pZCBzZXJ2aWNlVXBkYXRlKEF4aXNFdmVudCBldmVudCwgQXhpc1NlcnZpY2Ugc2VydmljZSk7Ci0KLSAgICB2b2lkIHNlcnZpY2VHcm91cFVwZGF0ZShBeGlzRXZlbnQgZXZlbnQsIEF4aXNTZXJ2aWNlR3JvdXAgc2VydmljZUdyb3VwKTsKLQotICAgIHZvaWQgbW9kdWxlVXBkYXRlKEF4aXNFdmVudCBldmVudCwgQXhpc01vZHVsZSBtb2R1bGUpOwotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9BeGlzU2VydmVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZW5naW5lL0F4aXNTZXJ2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI0NDg1Mi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZW5naW5lL0F4aXNTZXJ2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZW5naW5lOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLkNsdXN0ZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5DbHVzdGVyaW5nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBwcm92aWRlIGEgdmVyeSBjb252ZW5pZW50IHdheSBvZiBjcmVhdGluZyBzZXJ2ZXIgYW5kIGRlcGxveWluZyBzZXJ2aWNlcy4KLSAqIE9uY2Ugc29tZW9uZSBjYWxsIHN0YXJ0IG1ldGhvZCBpdCB3aWxsIGZpcmUgdXAgY29uZmlndXJhdGlvbiBjb250ZXh0IGFuZCBzdGFydCB1cCB0aGUgbGlzdGVuZXJzLgotICogT25lIGNhbiBwcm92aWRlIHJlcG9zaXRvcnkgbG9jYXRpb24gYW5kIGF4aXMueG1sIGFzIHN5c3RlbSBwcm9wZXJ0aWVzLgotICovCi0KLXB1YmxpYyBjbGFzcyBBeGlzU2VydmVyIHsKLQotICAgIHByb3RlY3RlZCBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0OwotICAgIHByb3RlY3RlZCBMaXN0ZW5lck1hbmFnZXIgbGlzdGVuZXJNYW5hZ2VyOwotICAgIHByaXZhdGUgYm9vbGVhbiBzdGFydE9uRGVwbG95OwotICAgIHByaXZhdGUgYm9vbGVhbiBzdGFydGVkID0gZmFsc2U7Ci0KLQotICAgIC8qKgotICAgICAqIElmIHlvdSBkbyBub3Qgd2FudCBBeGlzMiB0byBzdGFydCB0aGUgc2VydmVyIGF1dG9tYXRpY2FsbHkgdGhlbiBwYXNzIHRoZSAiZmFsc2UiIGVsc2UgInRydWUiCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3RhcnRPbkRlcGxveSA6IGJvb2xlYW4KLSAgICAgKi8KLSAgICBwdWJsaWMgQXhpc1NlcnZlcihib29sZWFuIHN0YXJ0T25EZXBsb3kpIHsKLSAgICAgICAgdGhpcy5zdGFydE9uRGVwbG95ID0gc3RhcnRPbkRlcGxveTsKLSAgICAgICAgbGlzdGVuZXJNYW5hZ2VyID0gbmV3IExpc3RlbmVyTWFuYWdlcigpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogU2VydmVyIHdpbGwgc3RhcnQgYXV0b21hdGljYWxseSBpZiB5b3UgY2FsbCBkZXBsb3lTZXJ2aWNlCi0gICAgICovCi0gICAgcHVibGljIEF4aXNTZXJ2ZXIoKSB7Ci0gICAgICAgIHRoaXModHJ1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV2lsbCBtYWtlIEphdmEgY2xhc3MgaW50byBhIHdlYiBzZXJ2aWNlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2VydmljZUNsYXNzTmFtZSA6IEFjdHVhbCBjbGFzcyB5b3Ugd2FudCB0byBtYWtlIGFzIGEgd2ViIHNlcnZpY2UKLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdCA6IElmIHNvbWV0aGluZyB3ZW50IHdyb25nCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGVwbG95U2VydmljZShTdHJpbmcgc2VydmljZUNsYXNzTmFtZSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIGlmIChjb25maWdDb250ZXh0ID09IG51bGwpIHsKLSAgICAgICAgICAgIGNvbmZpZ0NvbnRleHQgPSBnZXRDb25maWd1cmF0aW9uQ29udGV4dCgpOwotICAgICAgICB9Ci0gICAgICAgIEF4aXNDb25maWd1cmF0aW9uIGF4aXNDb25maWcgPSBjb25maWdDb250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2UgPSBBeGlzU2VydmljZS5jcmVhdGVTZXJ2aWNlKHNlcnZpY2VDbGFzc05hbWUsIGF4aXNDb25maWcpOwotICAgICAgICBheGlzQ29uZmlnLmFkZFNlcnZpY2Uoc2VydmljZSk7Ci0gICAgICAgIGlmIChzdGFydE9uRGVwbG95KSB7Ci0gICAgICAgICAgICBzdGFydCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV2lsbCBjcmVhdGUgYSBjb25maWd1cmF0aW9uIGNvbnRleHQgZnJvbSB0aGUgYXZpYWxhYmxlIGRhdGEgYW5kIHRoZW4gaXQKLSAgICAgKiB3aWxsIHN0YXJ0IHRoZSBsaXN0ZW5lciBtYW5hZ2VyCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdCBpZiBzb21ldGhpbmcgd2VudCB3cm9uZwotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHN0YXJ0KCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIGlmIChjb25maWdDb250ZXh0ID09IG51bGwpIHsKLSAgICAgICAgICAgIGNvbmZpZ0NvbnRleHQgPSBnZXRDb25maWd1cmF0aW9uQ29udGV4dCgpOwotICAgICAgICB9Ci0gICAgICAgIGlmICghc3RhcnRlZCkgewotCi0gICAgICAgICAgICBDbHVzdGVyTWFuYWdlciBjbHVzdGVyTWFuYWdlciA9Ci0gICAgICAgICAgICAgICAgICAgIGNvbmZpZ0NvbnRleHQuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5nZXRDbHVzdGVyTWFuYWdlcigpOwotICAgICAgICAgICAgU3RyaW5nIGF2b2lkSW5pdCA9IENsdXN0ZXJpbmdDb25zdGFudHMuUGFyYW1ldGVycy5BVk9JRF9JTklUSUFUSU9OOwotICAgICAgICAgICAgaWYgKGNsdXN0ZXJNYW5hZ2VyICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICBjbHVzdGVyTWFuYWdlci5nZXRQYXJhbWV0ZXIoYXZvaWRJbml0KSAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgKChTdHJpbmcpIGNsdXN0ZXJNYW5hZ2VyLmdldFBhcmFtZXRlcihhdm9pZEluaXQpLmdldFZhbHVlKCkpLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKSkgewotICAgICAgICAgICAgICAgIGNsdXN0ZXJNYW5hZ2VyLnNldENvbmZpZ3VyYXRpb25Db250ZXh0KGNvbmZpZ0NvbnRleHQpOwotICAgICAgICAgICAgICAgIGNsdXN0ZXJNYW5hZ2VyLmluaXQoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbGlzdGVuZXJNYW5hZ2VyLnN0YXJ0U3lzdGVtKGNvbmZpZ0NvbnRleHQpOwotICAgICAgICAgICAgc3RhcnRlZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdG9wIHRoZSBzZXJ2ZXIsIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlcyB0aGUgbGlzdGVuZXIgbWFuYWdlciBhcyB3ZWxsLgotICAgICAqCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdG9wKCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIGlmIChjb25maWdDb250ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNvbmZpZ0NvbnRleHQudGVybWluYXRlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGNvbmZpZ3VyYXRpb24gY29udGV4dC4gUGxlYXNlIGNhbGwgdGhpcyBiZWZvcmUgeW91IGNhbGwgZGVwbG95U2VydmljZSBvciBzdGFydCBtZXRob2QKLSAgICAgKgotICAgICAqIEBwYXJhbSBjb25maWdDb250ZXh0IENvbmZpZ3VyYXRpb25Db250ZXh0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q29uZmlndXJhdGlvbkNvbnRleHQoQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ29udGV4dCkgewotICAgICAgICB0aGlzLmNvbmZpZ0NvbnRleHQgPSBjb25maWdDb250ZXh0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gY29udGV4dCBpZiBvbmUgaXMgbm90IHNldCBhbHJlYWR5IHZpYSBzZXRDb25maWd1cmF0aW9uQ29udGV4dAotICAgICAqCi0gICAgICogQHJldHVybiBDb25maWd1cmF0aW9uQ29udGV4dAotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0Ci0gICAgICovCi0gICAgcHVibGljIENvbmZpZ3VyYXRpb25Db250ZXh0IGdldENvbmZpZ3VyYXRpb25Db250ZXh0KCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIGlmIChjb25maWdDb250ZXh0ID09IG51bGwpIHsKLSAgICAgICAgICAgIGNvbmZpZ0NvbnRleHQgPSBjcmVhdGVEZWZhdWx0Q29uZmlndXJhdGlvbkNvbnRleHQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY29uZmlnQ29udGV4dDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVc2VycyBleHRlbmRpbmcgdGhpcyBjbGFzcyBjYW4gb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gc3VwcGx5IGEgY3VzdG9tIENvbmZpZ3VyYXRpb25Db250ZXh0Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIENvbmZpZ3VyYXRpb25Db250ZXh0Ci0gICAgICogQHRocm93cyBBeGlzRmF1bHQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ29uZmlndXJhdGlvbkNvbnRleHQgY3JlYXRlRGVmYXVsdENvbmZpZ3VyYXRpb25Db250ZXh0KCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIHJldHVybiBDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkuY3JlYXRlQ29uZmlndXJhdGlvbkNvbnRleHRGcm9tRmlsZVN5c3RlbShudWxsKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZW5naW5lL0RlZmF1bHRPYmplY3RTdXBwbGllci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9EZWZhdWx0T2JqZWN0U3VwcGxpZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThhY2E2OS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZW5naW5lL0RlZmF1bHRPYmplY3RTdXBwbGllci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotCi1wdWJsaWMgY2xhc3MgRGVmYXVsdE9iamVjdFN1cHBsaWVyIGltcGxlbWVudHMgT2JqZWN0U3VwcGxpZXIgewotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuT2JqZWN0U3VwcGxpZXIjZ2V0T2JqZWN0KGphdmEubGFuZy5DbGFzcykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldE9iamVjdChDbGFzcyBjbGF6eikgdGhyb3dzIEF4aXNGYXVsdCB7Ci0JCXRyeSB7Ci0JCQlDbGFzcyBwYXJlbnQgPSBjbGF6ei5nZXREZWNsYXJpbmdDbGFzcygpOwotCQkJT2JqZWN0IGluc3RhbmNlID0gbnVsbDsKLQotCQkJaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQkJLy8gaWYgdGhpcyBpcyBhbiBpbm5lciBjbGFzcyB0aGVuIHRoYXQgY2FuIGJlIGEgbm9uIHN0YXRpYyBpbm5lciBjbGFzcy4gCi0JCQkJLy8gdGhvc2UgY2xhc3NlcyBoYXZlIHRvIGJlIGluc3RhbnRpYXRlZCBpbiBhIGRpZmZlcmVudCB3YXkgdGhhbiBhIG5vcm1hbCBpbml0aWFsaXphdGlvbi4KLQkJCQlpbnN0YW5jZSA9IGNsYXp6LmdldENvbnN0cnVjdG9yKG5ldyBDbGFzc1tdIHsgcGFyZW50IH0pCi0JCQkJCQkubmV3SW5zdGFuY2UobmV3IE9iamVjdFtdIHsgZ2V0T2JqZWN0KHBhcmVudCkgfSk7Ci0JCQl9IGVsc2UgewotCQkJCWluc3RhbmNlID0gY2xhenoubmV3SW5zdGFuY2UoKTsKLQkJCX0KLQotCQkJcmV0dXJuIGluc3RhbmNlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvRGVwZW5kZW5jeU1hbmFnZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvRGVwZW5kZW5jeU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU0NWYzZC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZW5naW5lL0RlcGVuZGVuY3lNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZW5naW5lOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LlNlcnZpY2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5TZXJ2aWNlR3JvdXBDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZUdyb3VwOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuc2VydmljZS5MaWZlY3ljbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLkxvYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotLyoqCi0gKiBJZiB0aGUgc2VydmljZSBpbXBsZW1lbnRhdGlvbiBoYXMgYW4gaW5pdCBtZXRob2Qgd2l0aCAxIG9yIDIgbWVzc2FnZSBjb250ZXh0IGFzIGl0cyBwYXJhbWV0ZXJzLCB0aGVuCi0gKiB0aGUgRGVwZW5kZW5jeU1hbmFnZXIgY2FsbHMgdGhlIGluaXQgbWV0aG9kIHdpdGggYXBwcm9wcmlhdGUgcGFyYW1ldGVycy4KLSAqLwotcHVibGljIGNsYXNzIERlcGVuZGVuY3lNYW5hZ2VyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coRGVwZW5kZW5jeU1hbmFnZXIuY2xhc3MpOwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFNFUlZJQ0VfSU5JVF9NRVRIT0QgPSAiaW5pdCI7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU0VSVklDRV9ERVNUUk9ZX01FVEhPRCA9ICJkZXN0cm95IjsKLQotICAgIC8qKgotICAgICAqIEluaXRpYWxpemUgYSBuZXcgc2VydmljZSBvYmplY3QuICBFc3NlbnRpYWxseSwgY2hlY2sgdG8gc2VlIGlmIHRoZSBvYmplY3Qgd2FudHMgdG8gcmVjZWl2ZQotICAgICAqIGFuIGluaXQoKSBjYWxsIC0gaWYgc28sIGNhbGwgaXQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb2JqIHRoZSBzZXJ2aWNlIG9iamVjdAotICAgICAqIEBwYXJhbSBzZXJ2aWNlQ29udGV4dCB0aGUgYWN0aXZlIFNlcnZpY2VDb250ZXh0Ci0gICAgICogQHRocm93cyBBeGlzRmF1bHQgaWYgdGhlcmUncyBhIHByb2JsZW0gaW5pdGlhbGl6aW5nCi0gICAgICogCi0gICAgICogQGRlcHJlY2F0ZWQgcGxlYXNlIHVzZSBpbml0U2VydmljZU9iamVjdCgpCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGluaXRTZXJ2aWNlQ2xhc3MoT2JqZWN0IG9iaiwgU2VydmljZUNvbnRleHQgc2VydmljZUNvbnRleHQpCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgaW5pdFNlcnZpY2VPYmplY3Qob2JqLCBzZXJ2aWNlQ29udGV4dCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5pdGlhbGl6ZSBhIG5ldyBzZXJ2aWNlIG9iamVjdC4gIEVzc2VudGlhbGx5LCBjaGVjayB0byBzZWUgaWYgdGhlIG9iamVjdCB3YW50cyB0byByZWNlaXZlCi0gICAgICogYW4gaW5pdCgpIGNhbGwgLSBpZiBzbywgY2FsbCBpdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvYmogdGhlIHNlcnZpY2Ugb2JqZWN0Ci0gICAgICogQHBhcmFtIHNlcnZpY2VDb250ZXh0IHRoZSBhY3RpdmUgU2VydmljZUNvbnRleHQKLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdCBpZiB0aGVyZSdzIGEgcHJvYmxlbSBpbml0aWFsaXppbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgaW5pdFNlcnZpY2VPYmplY3QoT2JqZWN0IG9iaiwgU2VydmljZUNvbnRleHQgc2VydmljZUNvbnRleHQpCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgLy8gVGhpcyBpcyB0aGUgd2F5IHRvIGRvIHRoaW5ncyBpbnRvIHRoZSBmdXR1cmUuCi0gICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBMaWZlY3ljbGUpIHsKLSAgICAgICAgICAgICgoTGlmZWN5Y2xlKW9iaikuaW5pdChzZXJ2aWNlQ29udGV4dCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyAuLi5ob3dldmVyLCB3ZSBhbHNvIHN0aWxsIHN1cHBvcnQgdGhlIG9sZCB3YXkgZm9yIG5vdy4gIE5vdGUgdGhhdCBpbnRyb3NwZWN0aW5nIGZvcgotICAgICAgICAvLyBhIG1ldGhvZCBsaWtlIHRoaXMgaXMgc29tZXRoaW5nIGxpa2UgMTAgdGltZXMgc2xvd2VyIHRoYW4gdGhlIGFib3ZlIGluc3RhbmNlb2YgY2hlY2suCi0KLSAgICAgICAgQ2xhc3MgY2xhc3NUb0xvYWQgPSBvYmouZ2V0Q2xhc3MoKTsKLSAgICAgICAgLy8gV2UgY2FuIG5vdCBjYWxsIGNsYXNzVG9Mb2FkLmdldERlY2xhcmVkTWV0aGVkKCkgLCBzaW5jZSB0aGVyZQotICAgICAgICAvLyAgY2FuIGJlIGluc2F0bmNlIHdoZXJlIG11dGlwbGUgc2VydmljZXMgZXh0ZW5kcyB1c2luZyBvbmUgY2xhc3MKLSAgICAgICAgLy8ganVzdCBmb3IgaW5pdCBhbmQgb3RoZXIgcmVmbGVjdGlvbiBtZXRob2RzCi0gICAgICAgIE1ldGhvZCBtZXRob2QgPQotICAgICAgICAgICAgICAgIG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtZXRob2QgPSBjbGFzc1RvTG9hZC5nZXRNZXRob2QoU0VSVklDRV9JTklUX01FVEhPRCwgbmV3IENsYXNzW117U2VydmljZUNvbnRleHQuY2xhc3N9KTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vV2UgZG8gbm90IG5lZWQgdG8gaW5mb3JtIHRoaXMgdG8gdXNlciAsIHNpbmNlIHRoaXMgc29tZXRoaW5nCi0gICAgICAgICAgICAvLyBBeGlzMiBpcyBjaGVja2luZyB0byBzdXBwb3J0IFNlc3Npb24uIFNvIGlmIHRoZSBtZXRob2QgaXMKLSAgICAgICAgICAgIC8vIG5vdCB0aGVyZSB3ZSBzaG91bGQgaWdub3JlIHRoYXQKLSAgICAgICAgfQotICAgICAgICBpZiAobWV0aG9kICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbWV0aG9kLmludm9rZShvYmosIG5ldyBPYmplY3RbXXtzZXJ2aWNlQ29udGV4dH0pOwotICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmluZm8oIkV4Y2VwdGlvbiB0cnlpbmcgdG8gY2FsbCAiICsgU0VSVklDRV9JTklUX01FVEhPRCwgZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJFeGNlcHRpb24gdHJ5aW5nIHRvIGNhbGwgIiArIFNFUlZJQ0VfSU5JVF9NRVRIT0QsIGUpOwotICAgICAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmluZm8oIkV4Y2VwdGlvbiB0cnlpbmcgdG8gY2FsbCAiICsgU0VSVklDRV9JTklUX01FVEhPRCwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUbyBpbml0IGFsbCB0aGUgc2VydmljZXMgaW4gYXBwbGljYXRpb24gc2NvcGUKLSAgICAgKgotICAgICAqIEBwYXJhbSBzZXJ2aWNlR3JvdXBDb250ZXh0IHRoZSBTZXJ2aWNlR3JvdXBDb250ZXh0IGZyb20gd2hpY2ggdG8gZXh0cmFjdCBhbGwgdGhlIHNlcnZpY2VzCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQgaWYgdGhlcmUncyBhIHByb2JsZW0gaW5pdGlhbGl6aW5nCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGluaXRTZXJ2aWNlKFNlcnZpY2VHcm91cENvbnRleHQgc2VydmljZUdyb3VwQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIEF4aXNTZXJ2aWNlR3JvdXAgc2VydmljZUdyb3VwID0gc2VydmljZUdyb3VwQ29udGV4dC5nZXREZXNjcmlwdGlvbigpOwotICAgICAgICBJdGVyYXRvcjxBeGlzU2VydmljZT4gc2VydmljZUl0ciA9IHNlcnZpY2VHcm91cC5nZXRTZXJ2aWNlcygpOwotICAgICAgICB3aGlsZSAoc2VydmljZUl0ci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlID0gKEF4aXNTZXJ2aWNlKSBzZXJ2aWNlSXRyLm5leHQoKTsKLSAgICAgICAgICAgIFNlcnZpY2VDb250ZXh0IHNlcnZpY2VDb250ZXh0ID0gc2VydmljZUdyb3VwQ29udGV4dC5nZXRTZXJ2aWNlQ29udGV4dChheGlzU2VydmljZSk7Ci0gICAgICAgICAgICBBeGlzU2VydmljZSBzZXJ2aWNlID0gc2VydmljZUNvbnRleHQuZ2V0QXhpc1NlcnZpY2UoKTsKLSAgICAgICAgICAgIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyID0gc2VydmljZS5nZXRDbGFzc0xvYWRlcigpOwotICAgICAgICAgICAgUGFyYW1ldGVyIGltcGxJbmZvUGFyYW0gPSBzZXJ2aWNlLmdldFBhcmFtZXRlcihDb25zdGFudHMuU0VSVklDRV9DTEFTUyk7Ci0gICAgICAgICAgICBpZiAoaW1wbEluZm9QYXJhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgQ2xhc3MgaW1wbENsYXNzID0gTG9hZGVyLmxvYWRDbGFzcygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc0xvYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFN0cmluZykgaW1wbEluZm9QYXJhbS5nZXRWYWx1ZSgpKS50cmltKCkpOwotICAgICAgICAgICAgICAgICAgICBPYmplY3Qgc2VydmljZUltcGwgPSBpbXBsQ2xhc3MubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgc2VydmljZUNvbnRleHQuc2V0UHJvcGVydHkoU2VydmljZUNvbnRleHQuU0VSVklDRV9PQkpFQ1QsIHNlcnZpY2VJbXBsKTsKLSAgICAgICAgICAgICAgICAgICAgaW5pdFNlcnZpY2VPYmplY3Qoc2VydmljZUltcGwsIHNlcnZpY2VDb250ZXh0KTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBBeGlzRmF1bHQubWFrZUZhdWx0KGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIE5vdGlmeSBhIHNlcnZpY2Ugb2JqZWN0IHRoYXQgaXQncyBvbiBkZWF0aCByb3cuCi0gICAgICogQHBhcmFtIHNlcnZpY2VDb250ZXh0IHRoZSBhY3RpdmUgU2VydmljZUNvbnRleHQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGVzdHJveVNlcnZpY2VPYmplY3QoU2VydmljZUNvbnRleHQgc2VydmljZUNvbnRleHQpIHsKLSAgICAgICAgT2JqZWN0IG9iaiA9IHNlcnZpY2VDb250ZXh0LmdldFByb3BlcnR5KFNlcnZpY2VDb250ZXh0LlNFUlZJQ0VfT0JKRUNUKTsKLSAgICAgICAgaWYgKG9iaiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBJZiB0aGlzIGlzIGEgTGlmZWN5Y2xlIG9iamVjdCwganVzdCBjYWxsIGl0LgotICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIExpZmVjeWNsZSkgewotICAgICAgICAgICAgICAgICgoTGlmZWN5Y2xlKW9iaikuZGVzdHJveShzZXJ2aWNlQ29udGV4dCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBGb3Igbm93LCB3ZSBhbHNvIHVzZSAicmF3IiBpbnRyb3NwZWN0aW9uIHRvIHRyeSBhbmQgZmluZCB0aGUgZGVzdHJveSBtZXRob2QuCi0KLSAgICAgICAgICAgIENsYXNzIGNsYXNzVG9Mb2FkID0gb2JqLmdldENsYXNzKCk7Ci0gICAgICAgICAgICBNZXRob2QgbWV0aG9kID0KLSAgICAgICAgICAgICAgICAgICAgbnVsbDsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbWV0aG9kID0gY2xhc3NUb0xvYWQuZ2V0TWV0aG9kKFNFUlZJQ0VfREVTVFJPWV9NRVRIT0QsIG5ldyBDbGFzc1tde1NlcnZpY2VDb250ZXh0LmNsYXNzfSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vV2UgZG8gbm90IG5lZWQgdG8gaW5mb3JtIHRoaXMgdG8gdXNlciAsIHNpbmNlIHRoaXMgc29tZXRoaW5nCi0gICAgICAgICAgICAgICAgLy8gQXhpczIgaXMgY2hlY2tpbmcgdG8gc3VwcG9ydCBTZXNzaW9uLiBTbyBpZiB0aGUgbWV0aG9kIGlzCi0gICAgICAgICAgICAgICAgLy8gbm90IHRoZXJlIHdlIHNob3VsZCBpZ25vcmUgdGhhdAotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZihtZXRob2QhPW51bGwpewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIG1ldGhvZC5pbnZva2Uob2JqLCBuZXcgT2JqZWN0W117c2VydmljZUNvbnRleHR9KTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmluZm8oIkV4Y2VwdGlvbiB0cnlpbmcgdG8gY2FsbCAiICsgU0VSVklDRV9ERVNUUk9ZX01FVEhPRCwgZSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJFeGNlcHRpb24gdHJ5aW5nIHRvIGNhbGwgIiArIFNFUlZJQ0VfREVTVFJPWV9NRVRIT0QsIGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9EZXBsb3lhYmxlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZW5naW5lL0RlcGxveWFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U5OTYyOS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZW5naW5lL0RlcGxveWFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7DQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotDQotLyoqDQotICogQSBEZXBsb3lhYmxlIGlzIGEgY29udGFpbmVyIGZvciBzb21ldGhpbmcgKFBoYXNlcywgSGFuZGxlcnMpIHdoaWNoIHdhbnRzDQotICogdG8gYmUgZGVwbG95ZWQgaW4gYW4gb3JkZXJlZCBhbmQgY29uc3RyYWluZWQgZmFzaGlvbiB2aWEgYQ0KLSAqIERlcGxveWFibGVDaGFpbi4NCi0gKi8NCi1wdWJsaWMgY2xhc3MgRGVwbG95YWJsZSB7DQotICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7DQotICAgIHByaXZhdGUgU3RyaW5nIHBoYXNlOw0KLSAgICBwcml2YXRlIFNldDxTdHJpbmc+IHN1Y2Nlc3NvcnM7DQotICAgIHByaXZhdGUgU2V0PFN0cmluZz4gcHJlZGVjZXNzb3JzOw0KLSAgICANCi0gICAgYm9vbGVhbiBmaXJzdDsNCi0gICAgYm9vbGVhbiBsYXN0Ow0KLQ0KLSAgICBPYmplY3QgdGFyZ2V0Ow0KLQ0KLSAgICBwdWJsaWMgRGVwbG95YWJsZShTdHJpbmcgbmFtZSkgew0KLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgRGVwbG95YWJsZShTdHJpbmcgbmFtZSwgT2JqZWN0IHRhcmdldCkgew0KLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsNCi0gICAgICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsNCi0gICAgICAgIHJldHVybiBuYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGFkZFN1Y2Nlc3NvcihTdHJpbmcgbmFtZSkgew0KLSAgICAgICAgaWYgKHN1Y2Nlc3NvcnMgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHN1Y2Nlc3NvcnMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7DQotICAgICAgICB9DQotICAgICAgICBzdWNjZXNzb3JzLmFkZChuYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZGRQcmVkZWNlc3NvcihTdHJpbmcgbmFtZSkgew0KLSAgICAgICAgaWYgKHByZWRlY2Vzc29ycyA9PSBudWxsKSB7DQotICAgICAgICAgICAgcHJlZGVjZXNzb3JzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcHJlZGVjZXNzb3JzLmFkZChuYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU2V0PFN0cmluZz4gZ2V0UHJlZGVjZXNzb3JzKCkgew0KLSAgICAgICAgcmV0dXJuIHByZWRlY2Vzc29yczsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU2V0PFN0cmluZz4gZ2V0U3VjY2Vzc29ycygpIHsNCi0gICAgICAgIHJldHVybiBzdWNjZXNzb3JzOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGhhc2UoKSB7DQotICAgICAgICByZXR1cm4gcGhhc2U7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0UGhhc2UoU3RyaW5nIHBoYXNlKSB7DQotICAgICAgICB0aGlzLnBoYXNlID0gcGhhc2U7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaXNGaXJzdCgpIHsNCi0gICAgICAgIHJldHVybiBmaXJzdDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRGaXJzdChib29sZWFuIGZpcnN0KSB7DQotICAgICAgICB0aGlzLmZpcnN0ID0gZmlyc3Q7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaXNMYXN0KCkgew0KLSAgICAgICAgcmV0dXJuIGxhc3Q7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TGFzdChib29sZWFuIGxhc3QpIHsNCi0gICAgICAgIHRoaXMubGFzdCA9IGxhc3Q7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0VGFyZ2V0KE9iamVjdCB0YXJnZXQpIHsNCi0gICAgICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBPYmplY3QgZ2V0VGFyZ2V0KCkgew0KLSAgICAgICAgcmV0dXJuIHRhcmdldDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZW5naW5lL0RlcGxveWFibGVDaGFpbi5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9EZXBsb3lhYmxlQ2hhaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc2Y2E1MS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZW5naW5lL0RlcGxveWFibGVDaGFpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZW5naW5lOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hTZXQ7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLQ0KLS8qKg0KLSAqIEEgRGVwbG95YWJsZUNoYWluIGlzIGEgY29udGFpbmVyIHdoaWNoIG1hbmFnZXMgZGVwZW5kZW5jaWVzIGJldHdlZW4gRGVwbG95YWJsZXMuICBZb3UNCi0gKiBkZXBsb3koKSB0aGVtIGluLCB0aGVuIGNhbGwgcmVidWlsZCgpIHdoaWNoIHdpbGwgc2V0IHVwIGEgY2hhaW4sIGNvcnJlY3RseSBvcmRlcmVkIGFjY29yZGluZw0KLSAqIHRvIHRoZSBjb25zdHJhaW50cyBpbiB0aGUgRGVwbG95YWJsZXMuDQotICovDQotcHVibGljIGNsYXNzIERlcGxveWFibGVDaGFpbjxUPiB7DQotICAgIC8qKiBUaGUgYWN0dWFsIHRoaW5ncyAoaGFuZGxlcnMgb3IgcGhhc2VzKSAqLw0KLSAgICBMaXN0PE9iamVjdD4gY2hhaW4gPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsNCi0NCi0gICAgRGVwbG95YWJsZSBmaXJzdDsNCi0gICAgRGVwbG95YWJsZSBsYXN0Ow0KLQ0KLSAgICAvKiogQSBNYXAgb2YgbmFtZSAtPiBMaXN0IChvZiBTdHJpbmdzKS4gIEVhY2ggTGlzdCBjb250YWlucyB0aGUga2V5J3Mgc3VjY2Vzc29ycyAqLw0KLSAgICBNYXA8U3RyaW5nLCBTZXQ8U3RyaW5nPj4gYWN0aXZlQ29uc3RyYWludHMgPSBuZXcgTGlua2VkSGFzaE1hcDxTdHJpbmcsIFNldDxTdHJpbmc+PigpOw0KLQ0KLSAgICAvKiogQSBNYXAgb2YgbmFtZSAtPiBEZXBsb3lhYmxlIGZvciBhbGwgZGVwbG95ZWQgaXRlbXMgKi8NCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBEZXBsb3lhYmxlPiBkZXBsb3llZCA9IG5ldyBMaW5rZWRIYXNoTWFwPFN0cmluZywgRGVwbG95YWJsZT4oKTsNCi0NCi0gICAgLyoqDQotICAgICAqIERlcGxveSBhIERlcGxveWFibGUgaW50byB0aGlzIGNoYWluLiAgTm90ZSB0aGF0IHRoaXMgZG9lcyBOT1Qgb3JkZXIgeWV0LiAgVGhlIGlkZWENCi0gICAgICogaXMgdG8gZGVwbG95IGV2ZXJ5dGhpbmcgZmlyc3QsIHRoZW4gY2FsbCByZWJ1aWxkKCkgdG8gZ2VuZXJhdGUgdGhlIGZ1bGx5IG9yZGVyZWQgY2hhaW4uDQotICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgdmFsaWRhdGUgdGhlIERlcGxveWFibGUsIGluY2x1ZGluZyBjb25maXJtaW5nIHRoYXQgaXQncyBjb21wYXRpYmxlIHdpdGgNCi0gICAgICogYW55IHByZXZpb3VzbHkgZGVwbG95ZWQgaXRlbSBvZiB0aGUgc2FtZSBuYW1lLg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gZGVwbG95YWJsZSBEZXBsb3lhYmxlIHRvIGRlcGxveS4NCi0gICAgICogQHRocm93cyBFeGNlcHRpb24gaWYgdGhlcmUgaXMgYSBkZXBsb3ltZW50IGVycm9yLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgZGVwbG95KERlcGxveWFibGUgZGVwbG95YWJsZSkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBTdHJpbmcgbmFtZSA9IGRlcGxveWFibGUuZ2V0TmFtZSgpOw0KLSAgICAgICAgU2V0PFN0cmluZz4gbXlTdWNjZXNzb3JzID0gZGVwbG95YWJsZS5nZXRTdWNjZXNzb3JzKCk7DQotICAgICAgICBTZXQ8U3RyaW5nPiBteVByZWRlY2Vzc29ycyA9IGRlcGxveWFibGUuZ2V0UHJlZGVjZXNzb3JzKCk7DQotDQotICAgICAgICBpZiAoZGVwbG95YWJsZS5pc0ZpcnN0KCkpIHsNCi0gICAgICAgICAgICBpZiAoZmlyc3QgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCInIiArIGZpcnN0LmdldE5hbWUoKSArICInIGlzIGFscmVhZHkgZmlyc3QsIGNhbid0IGRlcGxveSAnIiArDQotICAgICAgICAgICAgICAgICAgICBuYW1lICsgIicgYXMgZmlyc3QgYWxzby4iKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYgKG15UHJlZGVjZXNzb3JzICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiRGVwbG95aW5nICciICsgbmFtZSArDQotICAgICAgICAgICAgICAgICAgICAgICAgIicgLSBjYW4ndCBib3RoIGJlIGZpcnN0IGFuZCBoYXZlIHByZWRlY2Vzc29ycyEiKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZmlyc3QgPSBkZXBsb3lhYmxlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKGRlcGxveWFibGUuaXNMYXN0KCkpIHsNCi0gICAgICAgICAgICBpZiAobGFzdCAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIiciICsgbGFzdC5nZXROYW1lKCkgKyAiJyBpcyBhbHJlYWR5IGxhc3QsIGNhbid0IGRlcGxveSAnIiArDQotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSArICInIGFzIGxhc3QgYWxzby4iKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYgKG15U3VjY2Vzc29ycyAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIkRlcGxveWluZyAnIiArIG5hbWUgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICInIC0gY2FuJ3QgYm90aCBiZSBsYXN0IGFuZCBoYXZlIHN1Y2Nlc3NvcnMhIik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGxhc3QgPSBkZXBsb3lhYmxlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgRGVwbG95YWJsZSBwcmV2aW91cyA9IChEZXBsb3lhYmxlKWRlcGxveWVkLmdldChuYW1lKTsNCi0gICAgICAgIGlmIChwcmV2aW91cyA9PSBudWxsKSB7DQotICAgICAgICAgICAgZGVwbG95ZWQucHV0KG5hbWUsIGRlcGxveWFibGUpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAvLyBJZiBzb21ldGhpbmcgYnkgdGhpcyBuYW1lIGFscmVhZHkgZXhpc3RzLCBlbnN1cmUgaXQncyBjb21wYXRpYmxlDQotICAgICAgICAgICAgaWYgKHByZXZpb3VzLmlzRmlyc3QoKSAhPSBkZXBsb3lhYmxlLmlzRmlyc3QoKSkgew0KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJDYW4ndCBkZXBsb3kgJyIgKyBuYW1lICsgIicsIHZhbHVlcyBmb3IgZmlyc3QgZG9uJ3QgbWF0Y2ghIik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmIChwcmV2aW91cy5pc0xhc3QoKSAhPSBkZXBsb3lhYmxlLmlzTGFzdCgpKSB7DQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIkNhbid0IGRlcGxveSAnIiArIG5hbWUgKyAiJywgdmFsdWVzIGZvciBsYXN0IGRvbid0IG1hdGNoISIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBPYmplY3QgdGFyZ2V0ID0gcHJldmlvdXMuZ2V0VGFyZ2V0KCk7DQotICAgICAgICAgICAgaWYgKHRhcmdldCAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgIGlmIChkZXBsb3lhYmxlLmdldFRhcmdldCgpICE9IG51bGwgJiYgIXRhcmdldC5lcXVhbHMoZGVwbG95YWJsZS5nZXRUYXJnZXQoKSkpIHsNCi0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIkNhbid0IGRlcGxveSAnIiArIG5hbWUgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJywgIHRhcmdldHMgbXVzdCBlaXRoZXIgbWF0Y2ggb3IgYmUgbnVsbC4iKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIHByZXZpb3VzLnNldFRhcmdldChkZXBsb3lhYmxlLmdldFRhcmdldCgpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAobXlTdWNjZXNzb3JzICE9IG51bGwgJiYgIW15U3VjY2Vzc29ycy5pc0VtcHR5KCkpIHsNCi0gICAgICAgICAgICBTZXQ8U3RyaW5nPiBzdWNjZXNzb3JzID0gYWN0aXZlQ29uc3RyYWludHMuZ2V0KG5hbWUpOw0KLSAgICAgICAgICAgIGlmIChzdWNjZXNzb3JzID09IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgc3VjY2Vzc29ycyA9IG5ldyBMaW5rZWRIYXNoU2V0PFN0cmluZz4oKTsNCi0gICAgICAgICAgICAgICAgYWN0aXZlQ29uc3RyYWludHMucHV0KG5hbWUsIHN1Y2Nlc3NvcnMpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBzdWNjZXNzb3JzLmFkZEFsbChteVN1Y2Nlc3NvcnMpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKG15UHJlZGVjZXNzb3JzICE9IG51bGwpIHsNCi0gICAgICAgICAgICBmb3IgKE9iamVjdCBteVByZWRlY2Vzc29yIDogbXlQcmVkZWNlc3NvcnMpIHsNCi0gICAgICAgICAgICAgICAgU3RyaW5nIHByZWRlY2Vzc29yID0gKFN0cmluZylteVByZWRlY2Vzc29yOw0KLSAgICAgICAgICAgICAgICAvLyBkZWZpbmUgcmVsYXRpb25zaGlwIGZvciBlYWNoIG9uZQ0KLSAgICAgICAgICAgICAgICBhZGRSZWxhdGlvbnNoaXAocHJlZGVjZXNzb3IsIG5hbWUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogRmluZCB0aGUgY29ycmVjdCAobWluaW11bSkgaW5kZXggZm9yIGEgZ2l2ZW4gbmFtZS4gIEZpbmRzIHRoZSBhY3RpdmUgY29uc3RyYWludHMNCi0gICAgICogZm9yIHRoZSBuYW1lLCB0aGVuIHdhbGtzIHRoYXQgbGlzdCwgbWFraW5nIHN1cmUgdGhhdCBlYWNoIG9uZSBpcyBhbHJlYWR5IHBsYWNlZC4NCi0gICAgICogSWYgYSBnaXZlbiBzdWNjZXNzb3IgaXNuJ3QgeWV0IHBsYWNlZCwgd2UgcmVjdXJzaXZlbHkgY2FsbCB0aGlzIG1ldGhvZCB0byBwbGFjZSBpdCwNCi0gICAgICogcGFzc2luZyBhIHNldCBvZiAid2hhdCdzIGxlZnQgdG8gZG8iIGFuZCBhIHNldCBvZiAid2hhdCB3ZSd2ZSBzZWVuIi4NCi0gICAgICoNCi0gICAgICogVGhpcyByZXN1bHRzIGluIGNoYWluIGNvbnRhaW5pbmcgdGhlIG5hbWVzIChTdHJpbmdzKS4NCi0gICAgICoNCi0gICAgICogVE9ETzogaW52ZXN0aWdhdGUgb3B0aW1pemluZyB0aGlzIGFsZ29yaXRobSBhIGJpdA0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgdGFyZ2V0IGRlcGxveWFibGUncyBuYW1lDQotICAgICAqIEBwYXJhbSByZW1haW5pbmcgYSBTZXQgb2YgdGhlIG5hbWVzIG9mIHRoaW5ncyB3ZSBoYXZlIHlldCB0byBkZXBsb3kNCi0gICAgICogQHBhcmFtIHNlZW4gYSBTZXQgb2YgdGhlIG5hbWVzIG9mIHRoaW5ncyB3ZSd2ZSBhbHJlYWR5IHNlZW4gKHRvIGRldGVjdCBsb29wcykNCi0gICAgICogQHJldHVybiBhbiBpbmRleCA+PTAgb3IgLTEgaWYgdGhlcmUgd2FzIGEgZGVwZW5kZW5jeSBjeWNsZQ0KLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBpZiB0aGVyZSdzIGEgY3ljbGljIGRlcGVuZGVuY3kNCi0gICAgICovDQotICAgIHByaXZhdGUgaW50IGdldE1pbkluZGV4KFN0cmluZyBuYW1lLCBTZXQ8U3RyaW5nPiByZW1haW5pbmcsIFNldDxTdHJpbmc+IHNlZW4pIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgaWYgKHNlZW4uY29udGFpbnMobmFtZSkpIHsNCi0gICAgICAgICAgICAvLyBXZSByZXR1cm4gLTEgaGVyZSBpbnN0ZWFkIG9mIHRocm93aW5nIHRoZSBFeGNlcHRpb24gc28gd2UgY2FuIGJ1aWxkIGEgYmV0dGVyDQotICAgICAgICAgICAgLy8gZXJyb3IgbWVzc2FnZSBiZWxvdy4NCi0gICAgICAgICAgICByZXR1cm4gLTE7DQotICAgICAgICB9DQotDQotICAgICAgICBTZXQ8U3RyaW5nPiBzdWNjZXNzb3JzID0gYWN0aXZlQ29uc3RyYWludHMuZ2V0KG5hbWUpOw0KLSAgICAgICAgaWYgKHN1Y2Nlc3NvcnMgPT0gbnVsbCB8fCBzdWNjZXNzb3JzLmlzRW1wdHkoKSkgew0KLSAgICAgICAgICAgIC8vIE5ldmVyIHB1dCBhbnl0aGluZyBhZnRlciB0aGUgdGhpbmcgbWFya2VkICJsYXN0Ii4uLg0KLSAgICAgICAgICAgIGludCBpbmRleCA9IChsYXN0ID09IG51bGwpID8gY2hhaW4uc2l6ZSgpIDogY2hhaW4uc2l6ZSgpIC0gMTsNCi0gICAgICAgICAgICBjaGFpbi5hZGQoaW5kZXgsIG5hbWUpOw0KLSAgICAgICAgICAgIHJlbWFpbmluZy5yZW1vdmUobmFtZSk7DQotICAgICAgICAgICAgcmV0dXJuIGluZGV4Ow0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaW50IG1pbkluZGV4ID0gLTE7DQotICAgICAgICBmb3IgKE9iamVjdCBzdWNjZXNzb3IgOiBzdWNjZXNzb3JzKSB7DQotICAgICAgICAgICAgU3RyaW5nIG90aGVyTmFtZSA9IChTdHJpbmcpc3VjY2Vzc29yOw0KLSAgICAgICAgICAgIGludCBvdGhlcklkeCA9IGNoYWluLmluZGV4T2Yob3RoZXJOYW1lKTsNCi0gICAgICAgICAgICBpZiAob3RoZXJJZHggPiAtMSkgew0KLSAgICAgICAgICAgICAgICBpZiAoKG1pbkluZGV4ID09IC0xKSB8fCAobWluSW5kZXggPiBvdGhlcklkeCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIG1pbkluZGV4ID0gb3RoZXJJZHg7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAvLyBUaGlzIGd1eSBpc24ndCBpbiBvdXIgbGlzdCB5ZXQgLSBwdXQgaGltIGluIElGIGhlJ3MgcmVhbCAoZXhpc3RzIGluDQotICAgICAgICAgICAgICAgIC8vIHRoZSBkZXBsb3llZCBsaXN0KSBhbmQgd2UgaGF2ZW4ndCBhbHJlYWR5IHBsYWNlZCBoaW0gKGV4aXN0cyBpbg0KLSAgICAgICAgICAgICAgICAvLyB0aGUgcmVtYWluaW5nIHNldCkuDQotICAgICAgICAgICAgICAgIGlmICgoZGVwbG95ZWQuZ2V0KG90aGVyTmFtZSkgIT0gbnVsbCkgJiYgcmVtYWluaW5nLmNvbnRhaW5zKG90aGVyTmFtZSkpIHsNCi0gICAgICAgICAgICAgICAgICAgIHNlZW4uYWRkKG5hbWUpOw0KLSAgICAgICAgICAgICAgICAgICAgLy8gTm90IGluIGxpc3QgeWV0LCBnbyBwbGFjZSBpdA0KLSAgICAgICAgICAgICAgICAgICAgaW50IG1pbiA9IGdldE1pbkluZGV4KG90aGVyTmFtZSwgcmVtYWluaW5nLCBzZWVuKTsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChtaW5JbmRleCA9PSAtMSB8fCBtaW4gPCBtaW5JbmRleCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbkluZGV4ID0gbWluOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1pbkluZGV4ID09IC0xKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiVHJ5aW5nIHRvIHB1dCAnIiArIG5hbWUgKyAiJyBiZWZvcmUgJyIgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJOYW1lICsgIicgLSBpbmNvbXBhdGlibGUgY29uc3RyYWludHMhIik7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAobWluSW5kZXggPT0gLTEpIG1pbkluZGV4ID0gMDsNCi0NCi0gICAgICAgIGNoYWluLmFkZChtaW5JbmRleCwgbmFtZSk7DQotICAgICAgICByZW1haW5pbmcucmVtb3ZlKG5hbWUpOw0KLQ0KLSAgICAgICAgcmV0dXJuIG1pbkluZGV4Ow0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBUYWtpbmcgaW50byBhY2NvdW50IGFsbCB0aGUgYWN0aXZlIGNvbnN0cmFpbnRzLCBvcmRlciB0aGUgbGlzdC4gIFRoaXMgYmxvd3MNCi0gICAgICogYXdheSB0aGUgb2xkIG9yZGVyLiAgQ291bGQgaW1wcm92ZSB0aGlzIHNsaWdodGx5IHdpdGggYSAiZGlydHkiIGZsYWcuDQotICAgICAqDQotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIGlmIHRoZXJlJ3MgYW4gb3JkZXJpbmcgY29uZmxpY3QNCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHJlYnVpbGQoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIGNoYWluLmNsZWFyKCk7DQotDQotICAgICAgICBTZXQ8U3RyaW5nPiBrZXlzID0gbmV3IExpbmtlZEhhc2hTZXQ8U3RyaW5nPigpOw0KLSAgICAgICAga2V5cy5hZGRBbGwoZGVwbG95ZWQua2V5U2V0KCkpOw0KLQ0KLSAgICAgICAgLy8gRmlyc3QgZ29lcyBmaXJzdC4NCi0gICAgICAgIGlmIChmaXJzdCAhPSBudWxsKSB7DQotICAgICAgICAgICAgY2hhaW4uYWRkKGZpcnN0LmdldE5hbWUoKSk7DQotICAgICAgICAgICAga2V5cy5yZW1vdmUoZmlyc3QuZ2V0TmFtZSgpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vIExhc3QgZ29lcyBuZXh0LCBhbmQgZXZlcnl0aGluZyBlbHNlIHdpbGwgZ2V0IGluc2VydGVkIGJlZm9yZSBpdCBpZiBpdCBleGlzdHMuDQotICAgICAgICBpZiAobGFzdCAhPSBudWxsKSB7DQotICAgICAgICAgICAgU2V0PFN0cmluZz4gYWZ0ZXJMYXN0ID0gYWN0aXZlQ29uc3RyYWludHMuZ2V0KGxhc3QuZ2V0TmFtZSgpKTsNCi0gICAgICAgICAgICBpZiAoYWZ0ZXJMYXN0ICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiQ2FuJ3QgaGF2ZSBhbnl0aGluZyB3aGljaCBnb2VzIGFmdGVyICciICsgbGFzdC5nZXROYW1lKCkgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICInLCB3aGljaCBoYXMgYmVlbiBkZWNsYXJlZCBsYXN0LiIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBjaGFpbi5hZGQobGFzdC5nZXROYW1lKCkpOw0KLSAgICAgICAgICAgIGtleXMucmVtb3ZlKGxhc3QuZ2V0TmFtZSgpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHdoaWxlICgha2V5cy5pc0VtcHR5KCkpIHsNCi0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpa2V5cy5pdGVyYXRvcigpLm5leHQoKTsNCi0gICAgICAgICAgICBnZXRNaW5JbmRleChuYW1lLCBrZXlzLCBuZXcgTGlua2VkSGFzaFNldDxTdHJpbmc+KCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy8gTm93IHdlJ3ZlIGdvdCBhIGNoYWluIG9mIG5hbWVzLiAgQ29udmVydCB0byBhY3R1YWwgdGhpbmdzIGJlZm9yZSB3ZSByZXR1cm4uDQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoYWluLnNpemUoKTsgaSsrKSB7DQotICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSAoU3RyaW5nKWNoYWluLmdldChpKTsNCi0gICAgICAgICAgICBjaGFpbi5zZXQoaSwgKChEZXBsb3lhYmxlKWRlcGxveWVkLmdldChuYW1lKSkuZ2V0VGFyZ2V0KCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBBZGRzIGEgYmVmb3JlL2FmdGVyIHJlbGF0aW9uc2hpcCB0byB0aGUgYWN0aXZlIGNvbnN0cmFpbnRzLg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gYmVmb3JlIG5hbWUgb2YgdGhlIERlcGxveWFibGUgdGhhdCBtdXN0IGNvbWUgZmlyc3QNCi0gICAgICogQHBhcmFtIGFmdGVyIG5hbWUgb2YgdGhlIERlcGxveWFibGUgdGhhdCBtdXN0IGNvbWUgbGF0ZXINCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIGFkZFJlbGF0aW9uc2hpcChTdHJpbmcgYmVmb3JlLCBTdHJpbmcgYWZ0ZXIpIHsNCi0gICAgICAgIFNldDxTdHJpbmc+IHN1Y2Nlc3NvcnMgPSBhY3RpdmVDb25zdHJhaW50cy5nZXQoYmVmb3JlKTsNCi0gICAgICAgIGlmIChzdWNjZXNzb3JzID09IG51bGwpIHsNCi0gICAgICAgICAgICBzdWNjZXNzb3JzID0gbmV3IExpbmtlZEhhc2hTZXQ8U3RyaW5nPigpOw0KLSAgICAgICAgICAgIGFjdGl2ZUNvbnN0cmFpbnRzLnB1dChiZWZvcmUsIHN1Y2Nlc3NvcnMpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgc3VjY2Vzc29ycy5hZGQoYWZ0ZXIpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBHZXQgdGhlIGNoYWluIC0gb25jZSByZWJ1aWxkKCkgaGFzIGJlZW4gY2FsbGVkIHRoaXMgd2lsbCBiZSB0aGUgY2hhaW4gb2YgdGFyZ2V0IG9iamVjdHMuDQotICAgICAqDQotICAgICAqIEByZXR1cm4gYSBMaXN0IG9mIHRhcmdldCBvYmplY3RzIGluIHRoZSBjb3JyZWN0IG9yZGVyDQotICAgICAqLw0KLSAgICBwdWJsaWMgTGlzdDxUPiBnZXRDaGFpbigpIHsNCi0gICAgICAgIC8vIHRvZG8gLSBzaG91bGQgdGhpcyBjYWxsIHJlYnVpbGQoKSBhdXRvbWF0aWNhbGx5IChpZiBkaXJ0eSBmbGFnIGlzIHNldCk/DQotICAgICAgICByZXR1cm4gKExpc3Q8VD4pIGNoYWluOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvRGlzcGF0Y2hQaGFzZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9EaXNwYXRjaFBoYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzZWU1NGUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9EaXNwYXRjaFBoYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQSGVhZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5BZGRyZXNzaW5nSGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5PcGVyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5TZXJ2aWNlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuU2VydmljZUdyb3VwQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuU2Vzc2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZUdyb3VwOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uV1NETDJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pMThuLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0LlJlcXVlc3RSZXNwb25zZVRyYW5zcG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5UcmFuc3BvcnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkhUVFBDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLkphdmFVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuV1NETENvbnN0YW50cy5XU0RMMjBfMjAwNF9Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLldTRExDb25zdGFudHMuV1NETDIwXzIwMDZDb25zdGFudHM7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1wdWJsaWMgY2xhc3MgRGlzcGF0Y2hQaGFzZSBleHRlbmRzIFBoYXNlIHsKLQotICAgIHB1YmxpYyBEaXNwYXRjaFBoYXNlKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBEaXNwYXRjaFBoYXNlKFN0cmluZyBwaGFzZU5hbWUpIHsKLSAgICAgICAgc3VwZXIocGhhc2VOYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjaGVja1Bvc3RDb25kaXRpb25zKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBFbmRwb2ludFJlZmVyZW5jZSB0b0VQUiA9IG1zZ0NvbnRleHQuZ2V0VG8oKTsKLQotICAgICAgICBpZiAobXNnQ29udGV4dC5nZXRBeGlzU2VydmljZSgpID09IG51bGwpIHsKLSAgICAgICAgICAgIEF4aXNGYXVsdCBmYXVsdCA9IG5ldyBBeGlzRmF1bHQoTWVzc2FnZXMuZ2V0TWVzc2FnZSgic2VydmljZW5vdGZvdW5kZm9yZXByIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHRvRVBSICE9IG51bGwpID8gdG9FUFIuZ2V0QWRkcmVzcygpIDogIiIpKSk7Ci0gICAgICAgICAgICBmYXVsdC5zZXRGYXVsdENvZGUob3JnLmFwYWNoZS5heGlzMi5uYW1lc3BhY2UuQ29uc3RhbnRzLkZBVUxUX0NMSUVOVCk7Ci0gICAgICAgICAgICB0aHJvdyBmYXVsdDsKLSAgICAgICAgfQotCi0gICAgICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2UgPSBtc2dDb250ZXh0LmdldEF4aXNTZXJ2aWNlKCk7Ci0gICAgICAgIEF4aXNPcGVyYXRpb24gb3BlcmF0aW9uID0gbXNnQ29udGV4dC5nZXRBeGlzT3BlcmF0aW9uKCk7Ci0gICAgICAgIC8vIElmIHdlJ3JlIGNvbmZpZ3VyZWQgdG8gZG8gc28sIGNoZWNrIHRoZSBzZXJ2aWNlIGZvciBhIHNpbmdsZSBvcC4uLgotICAgICAgICBpZiAob3BlcmF0aW9uID09IG51bGwgJiYKLSAgICAgICAgICAgICAgICBKYXZhVXRpbHMuaXNUcnVlKHNlcnZpY2UuZ2V0UGFyYW1ldGVyVmFsdWUoQXhpc1NlcnZpY2UuU1VQUE9SVF9TSU5HTEVfT1ApKSkgewotICAgICAgICAgICAgSXRlcmF0b3I8QXhpc09wZXJhdGlvbj4gb3BzID0gc2VydmljZS5nZXRPcGVyYXRpb25zKCk7Ci0gICAgICAgICAgICAvLyBJZiB0aGVyZSdzIGV4YWN0bHkgb25lLCB0aGF0J3MgdGhlIG9uZSB3ZSB3YW50LiAgSWYgdGhlcmUncyBtb3JlLCBmb3JnZXQgaXQuCi0gICAgICAgICAgICBpZiAob3BzLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIG9wZXJhdGlvbiA9IChBeGlzT3BlcmF0aW9uKW9wcy5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKG9wcy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uID0gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtc2dDb250ZXh0LnNldEF4aXNPcGVyYXRpb24ob3BlcmF0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIElmIHdlIHN0aWxsIGRvbid0IGhhdmUgYW4gb3BlcmF0aW9uLCBmYXVsdC4KLSAgICAgICAgaWYgKG9wZXJhdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICBBeGlzRmF1bHQgZmF1bHQgPSBuZXcgQXhpc0ZhdWx0KE1lc3NhZ2VzLmdldE1lc3NhZ2UoIm9wZXJhdGlvbm5vdGZvdW5kZm9yZXByIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHRvRVBSICE9IG51bGwpID8gdG9FUFIuZ2V0QWRkcmVzcygpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICIiKSwgbXNnQ29udGV4dC5nZXRXU0FBY3Rpb24oKSkpOwotICAgICAgICAgICAgZmF1bHQuc2V0RmF1bHRDb2RlKG9yZy5hcGFjaGUuYXhpczIubmFtZXNwYWNlLkNvbnN0YW50cy5GQVVMVF9DTElFTlQpOwotICAgICAgICAgICAgdGhyb3cgZmF1bHQ7Ci0gICAgICAgIH0KLQotICAgICAgICB2YWxpZGF0ZVRyYW5zcG9ydChtc2dDb250ZXh0KTsKLSAgICAgICAgCi0gICAgICAgIHZhbGlkYXRlQmluZGluZ3MobXNnQ29udGV4dCk7Ci0KLSAgICAgICAgbG9hZENvbnRleHRzKHNlcnZpY2UsIG1zZ0NvbnRleHQpOwotCi0gICAgICAgIGlmIChtc2dDb250ZXh0LmdldE9wZXJhdGlvbkNvbnRleHQoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KE1lc3NhZ2VzLmdldE1lc3NhZ2UoImNhbm5vdEJlTnVsbE9wZXJhdGlvbkNvbnRleHQiKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobXNnQ29udGV4dC5nZXRTZXJ2aWNlQ29udGV4dCgpID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoTWVzc2FnZXMuZ2V0TWVzc2FnZSgiY2Fubm90QmVOdWxsU2VydmljZUNvbnRleHQiKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBUT0RPIC0gcmV2aWV3IHRoaXMKLSAgICAgICAgaWYgKChtc2dDb250ZXh0LmdldEF4aXNPcGVyYXRpb24oKSA9PSBudWxsKSAmJiAobXNnQ29udGV4dC5nZXRPcGVyYXRpb25Db250ZXh0KCkgIT0gbnVsbCkpIHsKLSAgICAgICAgICAgIG1zZ0NvbnRleHQuc2V0QXhpc09wZXJhdGlvbihtc2dDb250ZXh0LmdldE9wZXJhdGlvbkNvbnRleHQoKS5nZXRBeGlzT3BlcmF0aW9uKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKChtc2dDb250ZXh0LmdldEF4aXNTZXJ2aWNlKCkgPT0gbnVsbCkgJiYgKG1zZ0NvbnRleHQuZ2V0U2VydmljZUNvbnRleHQoKSAhPSBudWxsKSkgewotICAgICAgICAgICAgbXNnQ29udGV4dC5zZXRBeGlzU2VydmljZShtc2dDb250ZXh0LmdldFNlcnZpY2VDb250ZXh0KCkuZ2V0QXhpc1NlcnZpY2UoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBXZSBzaG91bGQgc2VuZCBhbiBlYXJseSBhY2sgdG8gdGhlIHRyYW5zcG9ydCB3aGV2ZXIgcG9zc2libGUsIGJ1dCBzb21lIG1vZHVsZXMgbmVlZAotICAgICAgICAvLyB0byB1c2UgdGhlIGJhY2tjaGFubmVsLCBzbyB3ZSBuZWVkIHRvIGNoZWNrIGlmIHRoZXkgaGF2ZSBkaXNhYmxlZCB0aGlzIGNvZGUuCi0gICAgICAgIEJvb2xlYW4gZGlzYWJsZUFjayA9IChCb29sZWFuKSBtc2dDb250ZXh0LmdldFByb3BlcnR5KENvbnN0YW50cy5Db25maWd1cmF0aW9uLkRJU0FCTEVfUkVTUE9OU0VfQUNLKTsKLSAgICAgICAgaWYoZGlzYWJsZUFjayA9PSBudWxsKSB7Ci0gICAgICAgICAgICBkaXNhYmxlQWNrID0gKEJvb2xlYW4pIChtc2dDb250ZXh0LmdldEF4aXNTZXJ2aWNlKCkgIT0gbnVsbCA/IAotICAgICAgICAgICAgICAgICAgICBtc2dDb250ZXh0LmdldEF4aXNTZXJ2aWNlKCkuZ2V0UGFyYW1ldGVyVmFsdWUoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uRElTQUJMRV9SRVNQT05TRV9BQ0spIDogbnVsbCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmKGRpc2FibGVBY2sgPT0gbnVsbCB8fCBkaXNhYmxlQWNrLmJvb2xlYW5WYWx1ZSgpID09IGZhbHNlKSB7Ci0gICAgICAgIAlTdHJpbmcgbWVwU3RyaW5nID0gbXNnQ29udGV4dC5nZXRBeGlzT3BlcmF0aW9uKCkuZ2V0TWVzc2FnZUV4Y2hhbmdlUGF0dGVybigpOwotICAgICAgICAJaWYgKGlzT25ld2F5KG1lcFN0cmluZykpIHsKLQkgICAgICAgICAgICBPYmplY3QgcmVxdWVzdFJlc3BvbnNlVHJhbnNwb3J0ID0KLQkgICAgICAgICAgICAgICAgICAgIG1zZ0NvbnRleHQuZ2V0UHJvcGVydHkoUmVxdWVzdFJlc3BvbnNlVHJhbnNwb3J0LlRSQU5TUE9SVF9DT05UUk9MKTsKLQkgICAgICAgICAgICBpZiAocmVxdWVzdFJlc3BvbnNlVHJhbnNwb3J0ICE9IG51bGwpIHsKLQkgICAgICAgICAgICAgICAgKChSZXF1ZXN0UmVzcG9uc2VUcmFuc3BvcnQpIHJlcXVlc3RSZXNwb25zZVRyYW5zcG9ydCkuYWNrbm93bGVkZ2VNZXNzYWdlKG1zZ0NvbnRleHQpOwotCSAgICAgICAgICAgIH0KLQkgICAgICAgIH0gZWxzZSBpZiAobWVwU3RyaW5nLmVxdWFscyhXU0RMMjBfMjAwNkNvbnN0YW50cy5NRVBfVVJJX0lOX09VVCkKLQkgICAgICAgICAgICAgICAgfHwgbWVwU3RyaW5nLmVxdWFscyhXU0RMMjBfMjAwNF9Db25zdGFudHMuTUVQX1VSSV9JTl9PVVQpCi0JICAgICAgICAgICAgICAgIHx8IG1lcFN0cmluZy5lcXVhbHMoV1NETDJDb25zdGFudHMuTUVQX1VSSV9JTl9PVVQpKSB7IC8vIE9SLCBpZiAyIHdheSBvcGVyYXRpb24gYnV0IHRoZSByZXNwb25zZSBpcyBpbnRlbmRlZCB0byBub3QgdXNlIHRoZSByZXNwb25zZSBjaGFubmVsIG9mIGEgMi13YXkgdHJhbnNwb3J0Ci0JICAgICAgICAgICAgLy8gdGhlbiB3ZSBkb24ndCBuZWVkIHRvIGtlZXAgdGhlIHRyYW5zcG9ydCB3YWl0aW5nLgotCSAgICAgICAgICAgIE9iamVjdCByZXF1ZXN0UmVzcG9uc2VUcmFuc3BvcnQgPQotCSAgICAgICAgICAgICAgICAgICAgbXNnQ29udGV4dC5nZXRQcm9wZXJ0eShSZXF1ZXN0UmVzcG9uc2VUcmFuc3BvcnQuVFJBTlNQT1JUX0NPTlRST0wpOwotCSAgICAgICAgICAgIGlmIChyZXF1ZXN0UmVzcG9uc2VUcmFuc3BvcnQgIT0gbnVsbCkgewotCSAgICAgICAgICAgICAgICBpZiAoQWRkcmVzc2luZ0hlbHBlci5pc1JlcGx5UmVkaXJlY3RlZChtc2dDb250ZXh0KQotCSAgICAgICAgICAgICAgICAgICAgICAgICYmIEFkZHJlc3NpbmdIZWxwZXIuaXNGYXVsdFJlZGlyZWN0ZWQobXNnQ29udGV4dCkpIHsKLQkgICAgICAgICAgICAgICAgICAgICgoUmVxdWVzdFJlc3BvbnNlVHJhbnNwb3J0KSByZXF1ZXN0UmVzcG9uc2VUcmFuc3BvcnQpLmFja25vd2xlZGdlTWVzc2FnZShtc2dDb250ZXh0KTsKLQkgICAgICAgICAgICAgICAgfQotCSAgICAgICAgICAgIH0KLQkgICAgICAgIH0gICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIAotCi0gICAgICAgIEFycmF5TGlzdCBvcGVyYXRpb25DaGFpbiA9IG1zZ0NvbnRleHQuZ2V0QXhpc09wZXJhdGlvbigpLmdldFJlbWFpbmluZ1BoYXNlc0luRmxvdygpOwotICAgICAgICBtc2dDb250ZXh0LnNldEV4ZWN1dGlvbkNoYWluKChBcnJheUxpc3QpIG9wZXJhdGlvbkNoYWluLmNsb25lKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBsb2FkQ29udGV4dHMoQXhpc1NlcnZpY2Ugc2VydmljZSwgTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIFN0cmluZyBzY29wZSA9IHNlcnZpY2UgPT0gbnVsbCA/IG51bGwgOiBzZXJ2aWNlLmdldFNjb3BlKCk7Ci0gICAgICAgIFNlcnZpY2VDb250ZXh0IHNlcnZpY2VDb250ZXh0ID0gbXNnQ29udGV4dC5nZXRTZXJ2aWNlQ29udGV4dCgpOwotCi0gICAgICAgIGlmICgobXNnQ29udGV4dC5nZXRPcGVyYXRpb25Db250ZXh0KCkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAmJiAoc2VydmljZUNvbnRleHQgIT0gbnVsbCkpIHsKLSAgICAgICAgICAgIG1zZ0NvbnRleHQuc2V0U2VydmljZUdyb3VwQ29udGV4dElkKAotICAgICAgICAgICAgICAgICAgICAoKFNlcnZpY2VHcm91cENvbnRleHQpc2VydmljZUNvbnRleHQuZ2V0UGFyZW50KCkpLmdldElkKCkpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChDb25zdGFudHMuU0NPUEVfVFJBTlNQT1JUX1NFU1NJT04uZXF1YWxzKHNjb3BlKSkgewotICAgICAgICAgICAgZmlsbENvbnRleHRzRnJvbVNlc3Npb25Db250ZXh0KG1zZ0NvbnRleHQpOwotICAgICAgICB9IGVsc2UgaWYgKENvbnN0YW50cy5TQ09QRV9TT0FQX1NFU1NJT04uZXF1YWxzKHNjb3BlKSkgewotICAgICAgICAgICAgZXh0cmFjdFNlcnZpY2VHcm91cENvbnRleHRJZChtc2dDb250ZXh0KTsKLSAgICAgICAgfQotCi0gICAgICAgIEF4aXNPcGVyYXRpb24gYXhpc09wZXJhdGlvbiA9IG1zZ0NvbnRleHQuZ2V0QXhpc09wZXJhdGlvbigpOwotLy8gICAgICAgIGlmIChheGlzT3BlcmF0aW9uID09IG51bGwpIHsKLS8vICAgICAgICAgICAgcmV0dXJuOwotLy8gICAgICAgIH0KLSAgICAgICAgT3BlcmF0aW9uQ29udGV4dCBvcGVyYXRpb25Db250ZXh0ID0KLSAgICAgICAgICAgICAgICBheGlzT3BlcmF0aW9uLmZpbmRGb3JFeGlzdGluZ09wZXJhdGlvbkNvbnRleHQobXNnQ29udGV4dCk7Ci0KLSAgICAgICAgaWYgKG9wZXJhdGlvbkNvbnRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gcmVnaXN0ZXIgb3BlcmF0aW9uIGNvbnRleHQgYW5kIG1lc3NhZ2UgY29udGV4dAotLy8gICAgICAgICAgICBheGlzT3BlcmF0aW9uLnJlZ2lzdGVyT3BlcmF0aW9uQ29udGV4dChtc2dDb250ZXh0LCBvcGVyYXRpb25Db250ZXh0KTsKLSAgICAgICAgICAgIGF4aXNPcGVyYXRpb24ucmVnaXN0ZXJNZXNzYWdlQ29udGV4dChtc2dDb250ZXh0LCBvcGVyYXRpb25Db250ZXh0KTsKLQotICAgICAgICAgICAgc2VydmljZUNvbnRleHQgPSAoU2VydmljZUNvbnRleHQpIG9wZXJhdGlvbkNvbnRleHQuZ2V0UGFyZW50KCk7Ci0gICAgICAgICAgICBTZXJ2aWNlR3JvdXBDb250ZXh0IHNlcnZpY2VHcm91cENvbnRleHQgPQotICAgICAgICAgICAgICAgICAgICAoU2VydmljZUdyb3VwQ29udGV4dCkgc2VydmljZUNvbnRleHQuZ2V0UGFyZW50KCk7Ci0KLSAgICAgICAgICAgIG1zZ0NvbnRleHQuc2V0U2VydmljZUNvbnRleHQoc2VydmljZUNvbnRleHQpOwotICAgICAgICAgICAgbXNnQ29udGV4dC5zZXRTZXJ2aWNlR3JvdXBDb250ZXh0KHNlcnZpY2VHcm91cENvbnRleHQpOwotICAgICAgICAgICAgbXNnQ29udGV4dC5zZXRTZXJ2aWNlR3JvdXBDb250ZXh0SWQoc2VydmljZUdyb3VwQ29udGV4dC5nZXRJZCgpKTsKLSAgICAgICAgfSBlbHNlIHsgICAgLy8gMi4gaWYgbnVsbCwgY3JlYXRlIG5ldyBvcEN0eHQKLSAgICAgICAgICAgIGlmIChzZXJ2aWNlQ29udGV4dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gZmlsbCB0aGUgc2VydmljZSBncm91cCBjb250ZXh0IGFuZCBzZXJ2aWNlIGNvbnRleHQgaW5mbwotICAgICAgICAgICAgICAgIG1zZ0NvbnRleHQuZ2V0Q29uZmlndXJhdGlvbkNvbnRleHQoKS4KLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbGxTZXJ2aWNlQ29udGV4dEFuZFNlcnZpY2VHcm91cENvbnRleHQobXNnQ29udGV4dCk7Ci0gICAgICAgICAgICAgICAgc2VydmljZUNvbnRleHQgPSBtc2dDb250ZXh0LmdldFNlcnZpY2VDb250ZXh0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvcGVyYXRpb25Db250ZXh0ID0gc2VydmljZUNvbnRleHQuY3JlYXRlT3BlcmF0aW9uQ29udGV4dChheGlzT3BlcmF0aW9uKTsKLSAgICAgICAgICAgIGF4aXNPcGVyYXRpb24ucmVnaXN0ZXJNZXNzYWdlQ29udGV4dChtc2dDb250ZXh0LCBvcGVyYXRpb25Db250ZXh0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHNlcnZpY2VDb250ZXh0LnNldE15RVBSKG1zZ0NvbnRleHQuZ2V0VG8oKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVG8gY2hlY2sgd2V0aGVyIHRoZSBpbmNvbWluZyByZXF1ZXN0IGhhcyBjb21lIGluIHZhbGlkIHRyYW5zcG9ydCAsIHNpbXBsZXkgdGhlIHRyYW5zcG9ydHMKLSAgICAgKiB0aGF0IHNlcnZpY2UgYXV0aG9yIHdhbnRzIHRvIGV4cG9zZQotICAgICAqCi0gICAgICogQHBhcmFtIG1zZ2N0eCB0aGUgY3VycmVudCBNZXNzYWdlQ29udGV4dAotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0IGluIGNhc2Ugb2YgZXJyb3IKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVUcmFuc3BvcnQoTWVzc2FnZUNvbnRleHQgbXNnY3R4KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSA9IG1zZ2N0eC5nZXRBeGlzU2VydmljZSgpOwotICAgICAgICBpZiAoc2VydmljZS5pc0VuYWJsZUFsbFRyYW5zcG9ydHMoKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTGlzdCB0cnMgPSBzZXJ2aWNlLmdldEV4cG9zZWRUcmFuc3BvcnRzKCk7Ci0gICAgICAgICAgICBTdHJpbmcgaW5jb21taW5nVHJzID0gbXNnY3R4LmdldEluY29taW5nVHJhbnNwb3J0TmFtZSgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0cnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdHIgPSAoU3RyaW5nKSB0cnMuZ2V0KGkpOwotICAgICAgICAgICAgICAgIGlmIChpbmNvbW1pbmdUcnMgIT0gbnVsbCAmJiBpbmNvbW1pbmdUcnMuZXF1YWxzKHRyKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIEVuZHBvaW50UmVmZXJlbmNlIHRvRVBSID0gbXNnY3R4LmdldFRvKCk7Ci0gICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoTWVzc2FnZXMuZ2V0TWVzc2FnZSgic2VydmljZW5vdGZvdW5kZm9yZXByIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodG9FUFIgIT0gbnVsbCkgPyB0b0VQUi5nZXRBZGRyZXNzKCkgOiAiIikpKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVG8gY2hlY2sgd2hldGhlciB0aGUgaW5jb21pbmcgcmVxdWVzdCBoYXMgY29tZSBpbiB2YWxpZCBiaW5kaW5nICwgd2UgY2hlY2sgd2hldGhlciBzZXJ2aWNlCi0gICAgICogYXV0aG9yIGhhcyBkaXNhYmxlZCBhbnkgYmluZGluZyB1c2luZyBwYXJhbWV0ZXJzCi0gICAgICogPGNvZGU+b3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHMuQ29uZmlndXJhdGlvbi5ESVNBQkxFX1NPQVAxMjwvY29kZT4KLSAgICAgKiA8Y29kZT5vcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50cy5Db25maWd1cmF0aW9uLkRJU0FCTEVfU09BUDExPC9jb2RlPgotICAgICAqIDxjb2RlPm9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uRElTQUJMRV9SRVNUPC9jb2RlPgotICAgICAqIEBwYXJhbSBzZXJ2aWNlIG1zZ2N0eCB0aGUgY3VycmVudCBNZXNzYWdlQ29udGV4dAotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0IGluIGNhc2Ugb2YgZXJyb3IKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVCaW5kaW5ncyhNZXNzYWdlQ29udGV4dCBtc2djdHgpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICAKLSAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSA9IG1zZ2N0eC5nZXRBeGlzU2VydmljZSgpOwotICAgICAgICAKLSAgICAgICAgYm9vbGVhbiBkaXNhYmxlUkVTVCA9IGZhbHNlOwotICAgICAgICBQYXJhbWV0ZXIgZGlzYWJsZVJFU1RQYXJhbWV0ZXIgPSBzZXJ2aWNlCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UGFyYW1ldGVyKG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uRElTQUJMRV9SRVNUKTsKLSAgICAgICAgaWYgKGRpc2FibGVSRVNUUGFyYW1ldGVyICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIEphdmFVdGlscy5pc1RydWVFeHBsaWNpdGx5KGRpc2FibGVSRVNUUGFyYW1ldGVyLmdldFZhbHVlKCkpKSB7Ci0gICAgICAgICAgICAgICAgZGlzYWJsZVJFU1QgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBib29sZWFuIGRpc2FibGVTT0FQMTEgPSBmYWxzZTsKLSAgICAgICAgUGFyYW1ldGVyIGRpc2FibGVTT0FQMTFQYXJhbWV0ZXIgPSBzZXJ2aWNlCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UGFyYW1ldGVyKG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uRElTQUJMRV9TT0FQMTEpOwotICAgICAgICBpZiAoZGlzYWJsZVNPQVAxMVBhcmFtZXRlciAhPSBudWxsCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBKYXZhVXRpbHMuaXNUcnVlRXhwbGljaXRseShkaXNhYmxlU09BUDExUGFyYW1ldGVyLmdldFZhbHVlKCkpKSB7Ci0gICAgICAgICAgICAgICAgZGlzYWJsZVNPQVAxMSA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBib29sZWFuIGRpc2FibGVTT0FQMTIgPSBmYWxzZTsKLSAgICAgICAgUGFyYW1ldGVyIGRpc2FibGVTT0FQMTJQYXJhbWV0ZXIgPSBzZXJ2aWNlCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UGFyYW1ldGVyKG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uRElTQUJMRV9TT0FQMTIpOwotICAgICAgICBpZiAoZGlzYWJsZVNPQVAxMlBhcmFtZXRlciAhPSBudWxsCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBKYXZhVXRpbHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaXNUcnVlRXhwbGljaXRseShkaXNhYmxlU09BUDEyUGFyYW1ldGVyLmdldFZhbHVlKCkpKSB7Ci0gICAgICAgICAgICAgICAgZGlzYWJsZVNPQVAxMiA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmIChtc2djdHguaXNEb2luZ1JFU1QoKSkgewotICAgICAgICAgICAgaWYgKGRpc2FibGVSRVNUKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdChNZXNzYWdlcy5nZXRNZXNzYWdlKCJiaW5kaW5nRGlzYWJsZWQiLCJIdHRwIikpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKG1zZ2N0eC5pc1NPQVAxMSgpKSB7Ci0gICAgICAgICAgICBpZiAoZGlzYWJsZVNPQVAxMSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoTWVzc2FnZXMuZ2V0TWVzc2FnZSgiYmluZGluZ0Rpc2FibGVkIiwiU09BUDExIikpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYoZGlzYWJsZVNPQVAxMikgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoTWVzc2FnZXMuZ2V0TWVzc2FnZSgiYmluZGluZ0Rpc2FibGVkIiwiU09BUDEyIikpOyAgCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGZpbGxDb250ZXh0c0Zyb21TZXNzaW9uQ29udGV4dChNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSA9IG1zZ0NvbnRleHQuZ2V0QXhpc1NlcnZpY2UoKTsKLSAgICAgICAgaWYgKHNlcnZpY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdChNZXNzYWdlcy5nZXRNZXNzYWdlKCJ1bmFibGV0b2ZpbmRzZXJ2aWNlIikpOwotICAgICAgICB9Ci0gICAgICAgIFNlc3Npb25Db250ZXh0IHNlc3Npb25Db250ZXh0ID0gbXNnQ29udGV4dC5nZXRTZXNzaW9uQ29udGV4dCgpOwotICAgICAgICBpZiAoc2Vzc2lvbkNvbnRleHQgPT0gbnVsbCkgewotICAgICAgICAgICAgVHJhbnNwb3J0TGlzdGVuZXIgbGlzdGVuZXIgPSBtc2dDb250ZXh0LmdldFRyYW5zcG9ydEluKCkuZ2V0UmVjZWl2ZXIoKTsKLSAgICAgICAgICAgIHNlc3Npb25Db250ZXh0ID0gbGlzdGVuZXIuZ2V0U2Vzc2lvbkNvbnRleHQobXNnQ29udGV4dCk7Ci0gICAgICAgICAgICBpZiAoc2Vzc2lvbkNvbnRleHQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNyZWF0ZUFuZEZpbGxDb250ZXh0cyhzZXJ2aWNlLCBtc2dDb250ZXh0LCBzZXNzaW9uQ29udGV4dCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIFN0cmluZyBzZXJ2aWNlR3JvdXBOYW1lID0gbXNnQ29udGV4dC5nZXRBeGlzU2VydmljZUdyb3VwKCkuZ2V0U2VydmljZUdyb3VwTmFtZSgpOwotICAgICAgICBTZXJ2aWNlR3JvdXBDb250ZXh0IHNlcnZpY2VHcm91cENvbnRleHQgPQotICAgICAgICAgICAgICAgIHNlc3Npb25Db250ZXh0LmdldFNlcnZpY2VHcm91cENvbnRleHQoc2VydmljZUdyb3VwTmFtZSk7Ci0gICAgICAgIGlmIChzZXJ2aWNlR3JvdXBDb250ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vc2V0dGluZyBzZXJ2aWNlIGdyb3VwIGNvbnRleHQKLSAgICAgICAgICAgIG1zZ0NvbnRleHQuc2V0U2VydmljZUdyb3VwQ29udGV4dChzZXJ2aWNlR3JvdXBDb250ZXh0KTsKLSAgICAgICAgICAgIC8vIHNldHRpbmcgU2VydmljZSBjb250ZXh0Ci0gICAgICAgICAgICBtc2dDb250ZXh0LnNldFNlcnZpY2VDb250ZXh0KHNlcnZpY2VHcm91cENvbnRleHQuZ2V0U2VydmljZUNvbnRleHQoc2VydmljZSkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY3JlYXRlQW5kRmlsbENvbnRleHRzKHNlcnZpY2UsIG1zZ0NvbnRleHQsIHNlc3Npb25Db250ZXh0KTsKLSAgICAgICAgfQotICAgICAgICBTZXJ2aWNlQ29udGV4dCBzZXJ2aWNlQ29udGV4dCA9IHNlc3Npb25Db250ZXh0LmdldFNlcnZpY2VDb250ZXh0KHNlcnZpY2UpOwotICAgICAgICAvL2ZvdW5kIHRoZSBzZXJ2aWNlQ29udGV4dCBmcm9tIHNlc3Npb24gY29udGV4dCAsIHNvIGFkZGluZyB0aGF0IGludG8gbXNnQ29udGV4dAotICAgICAgICBpZiAoc2VydmljZUNvbnRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgbXNnQ29udGV4dC5zZXRTZXJ2aWNlQ29udGV4dChzZXJ2aWNlQ29udGV4dCk7Ci0gICAgICAgICAgICBzZXJ2aWNlQ29udGV4dC5zZXRQcm9wZXJ0eShIVFRQQ29uc3RhbnRzLkNPT0tJRV9TVFJJTkcsIHNlc3Npb25Db250ZXh0LmdldENvb2tpZUlEKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUFuZEZpbGxDb250ZXh0cyhBeGlzU2VydmljZSBzZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlc3Npb25Db250ZXh0IHNlc3Npb25Db250ZXh0KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgU2VydmljZUdyb3VwQ29udGV4dCBzZXJ2aWNlR3JvdXBDb250ZXh0OwotICAgICAgICBBeGlzU2VydmljZUdyb3VwIGF4aXNTZXJ2aWNlR3JvdXAgPSBzZXJ2aWNlLmdldEF4aXNTZXJ2aWNlR3JvdXAoKTsKLSAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ3R4ID0gbXNnQ29udGV4dC5nZXRDb25maWd1cmF0aW9uQ29udGV4dCgpOwotICAgICAgICBzZXJ2aWNlR3JvdXBDb250ZXh0ID0gY29uZmlnQ3R4LmNyZWF0ZVNlcnZpY2VHcm91cENvbnRleHQoYXhpc1NlcnZpY2VHcm91cCk7Ci0KLSAgICAgICAgbXNnQ29udGV4dC5zZXRTZXJ2aWNlR3JvdXBDb250ZXh0KHNlcnZpY2VHcm91cENvbnRleHQpOwotICAgICAgICBTZXJ2aWNlQ29udGV4dCBzZXJ2aWNlQ29udGV4dCA9IHNlcnZpY2VHcm91cENvbnRleHQuZ2V0U2VydmljZUNvbnRleHQoc2VydmljZSk7Ci0gICAgICAgIG1zZ0NvbnRleHQuc2V0U2VydmljZUNvbnRleHQoc2VydmljZUNvbnRleHQpOwotICAgICAgICBpZiAoc2Vzc2lvbkNvbnRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgc2Vzc2lvbkNvbnRleHQuYWRkU2VydmljZUNvbnRleHQoc2VydmljZUNvbnRleHQpOwotICAgICAgICAgICAgc2Vzc2lvbkNvbnRleHQuYWRkU2VydmljZUdyb3VwQ29udGV4dChzZXJ2aWNlR3JvdXBDb250ZXh0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFFOYW1lIFNFUlZJQ0VfR1JPVVBfUU5BTUUgPSBuZXcgUU5hbWUoQ29uc3RhbnRzLkFYSVMyX05BTUVTUEFDRV9VUkksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuU0VSVklDRV9HUk9VUF9JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5BWElTMl9OQU1FU1BBQ0VfUFJFRklYKTsKLQotICAgIHByaXZhdGUgdm9pZCBleHRyYWN0U2VydmljZUdyb3VwQ29udGV4dElkKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBTT0FQSGVhZGVyIHNvYXBIZWFkZXIgPSBtc2dDb250ZXh0LmdldEVudmVsb3BlKCkuZ2V0SGVhZGVyKCk7Ci0gICAgICAgIGlmIChzb2FwSGVhZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBzZXJ2aWNlR3JvdXBJZCA9IHNvYXBIZWFkZXIuZ2V0Rmlyc3RDaGlsZFdpdGhOYW1lKFNFUlZJQ0VfR1JPVVBfUU5BTUUpOwotICAgICAgICAgICAgaWYgKHNlcnZpY2VHcm91cElkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtc2dDb250ZXh0LnNldFNlcnZpY2VHcm91cENvbnRleHRJZChzZXJ2aWNlR3JvdXBJZC5nZXRUZXh0KCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgZGV0ZXJtaW5lIGlmIHRoZSBNRVAgaW5kaWNhdGVkIGJ5ICdtZXBTdHJpbmcnIHNwZWNpZmllcwotICAgICAqIGEgb25ld2F5IE1FUC4KLSAgICAgKi8KLSAgICBib29sZWFuIGlzT25ld2F5KFN0cmluZyBtZXBTdHJpbmcpIHsKLSAgICAgICAgcmV0dXJuIChtZXBTdHJpbmcuZXF1YWxzKFdTREwyMF8yMDA2Q29uc3RhbnRzLk1FUF9VUklfSU5fT05MWSkKLSAgICAgICAgICAgICAgICB8fCBtZXBTdHJpbmcuZXF1YWxzKFdTREwyMF8yMDA0X0NvbnN0YW50cy5NRVBfVVJJX0lOX09OTFkpCi0gICAgICAgICAgICAgICAgfHwgbWVwU3RyaW5nLmVxdWFscyhXU0RMMkNvbnN0YW50cy5NRVBfVVJJX0lOX09OTFkpKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvSFRUUExvY2F0aW9uQmFzZWREaXNwYXRjaGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZW5naW5lL0hUVFBMb2NhdGlvbkJhc2VkRGlzcGF0Y2hlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWMzNGZlLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvSFRUUExvY2F0aW9uQmFzZWREaXNwYXRjaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5lbmdpbmU7Ci0KLS8qKgotICogRGlzcGF0Y2hlcyB0aGUgb3BlcmF0aW9uIGJhc2VkIG9uIHRoZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSB0YXJnZXQgZW5kcG9pbnQgVVJMLgotICoKLSAqIEBkZXByZWNhdGVkIHVzZSBvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLkhUVFBMb2NhdGlvbkJhc2VkRGlzcGF0Y2hlcgotICovCi1wdWJsaWMgY2xhc3MgSFRUUExvY2F0aW9uQmFzZWREaXNwYXRjaGVyIGV4dGVuZHMgb3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5IVFRQTG9jYXRpb25CYXNlZERpc3BhdGNoZXIgewotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9IYW5kbGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZW5naW5lL0hhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBiYTg3ZC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZW5naW5lL0hhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5lbmdpbmU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5IYW5kbGVyRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5QYXJhbWV0ZXI7Ci0KLS8qKgotICogQSBIYW5kbGVyIHJlcHJlc2VudHMgYSBwaWVjZSBvZiBtZXNzYWdlIHByb2Nlc3NpbmcgZnVuY3Rpb25hbGl0eSBpbiBBeGlzMi4KLSAqCi0gKiBIYW5kbGVycyBhcmUgY29tYmluZWQgaW50byBjaGFpbnMgYW5kIHBoYXNlcyBpbiBvcmRlciB0byBwcm92aWRlIGN1c3RvbWl6YWJsZSBmdW5jdGlvbmFsaXR5Ci0gKiBzdWNoIGFzIHNlY3VyaXR5LCByZWxpYWJpbGl0eSwgZXRjLiAgSGFuZGxlcnMgbXVzdCBiZSBtdWx0aS10aHJlYWQgc2FmZSBhbmQgc2hvdWxkIGtlZXAgYWxsCi0gKiB0aGVpciBzdGF0ZSBpbiBDb250ZXh0IG9iamVjdHMgKHNlZSB0aGUgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0IHBhY2thZ2UpLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEhhbmRsZXIgewotCi0gICAgLyoqCi0gICAgICogQGRlcHJlY2F0ZWQgVGhpcyBtZXRob2Qgd2lsbCBiZSBnb2luZyBhd2F5IGFmdGVyIHRoZSAxLjMgcmVsZWFzZSwgaXQgd2FzIG5ldmVyIHVzZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY2xlYW51cCgpOwotCi0gICAgLyoqCi0gICAgICogSW5pdGlhbGl6ZSBhIEhhbmRsZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaGFuZGxlckRlc2MgdGhlIEhhbmRsZXJEZXNjcmlwdGlvbiBmb3IgdGhpcyBIYW5kbGVyCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW5pdChIYW5kbGVyRGVzY3JpcHRpb24gaGFuZGxlckRlc2MpOwotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgb24gZWFjaCByZWdpc3RlcmVkIGhhbmRsZXIgd2hlbiBhIG1lc3NhZ2UKLSAgICAgKiBuZWVkcyB0byBiZSBwcm9jZXNzZWQuICBJZiB0aGUgbWVzc2FnZSBwcm9jZXNzaW5nIGlzIHBhdXNlZCBieSB0aGUKLSAgICAgKiBoYW5kbGVyLCB0aGVuIHRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIGFnYWluIGZvciB0aGUgaGFuZGxlciB0aGF0Ci0gICAgICogcGF1c2VkIHRoZSBwcm9jZXNzaW5nIG9uY2UgaXQgaXMgcmVzdW1lZC4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhpcyBtZXRob2QgbWF5IGJlIGNhbGxlZCBjb25jdXJyZW50bHkgZnJvbSBtdWx0aXBsZSB0aHJlYWRzLgotICAgICAqIDxwLz4KLSAgICAgKiBIYW5kbGVycyB0aGF0IHdhbnQgdG8gZGV0ZXJtaW5lIHRoZSB0eXBlIG9mIG1lc3NhZ2UgdGhhdCBpcyB0byBiZQotICAgICAqIHByb2Nlc3NlZCAoZS5nLiByZXNwb25zZSB2cyByZXF1ZXN0LCBpbmJvdW5kIHZzLiBvdXRib3VuZCwgZXRjLikgY2FuCi0gICAgICogcmV0cmlldmUgdGhhdCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBNZXNzYWdlQ29udGV4dCB2aWEKLSAgICAgKiBNZXNzYWdlQ29udGV4dC5nZXRGTE9XKCkgYW5kCi0gICAgICogTWVzc2FnZUNvbnRleHQuZ2V0QXhpc09wZXJhdGlvbigpLmdldE1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4oKSBBUElzLgotICAgICAqCi0gICAgICogQHBhcmFtIG1zZ0NvbnRleHQgdGhlIDxjb2RlPk1lc3NhZ2VDb250ZXh0PC9jb2RlPiB0byBwcm9jZXNzIHdpdGggdGhpcwotICAgICAqICAgICAgICAgICAgICAgICAgIDxjb2RlPkhhbmRsZXI8L2NvZGU+LgotICAgICAqIEByZXR1cm4gQW4gSW52b2NhdGlvblJlc3BvbnNlIHRoYXQgaW5kaWNhdGVzIHdoYXQKLSAgICAgKiAgICAgICAgIHRoZSBuZXh0IHN0ZXAgaW4gdGhlIG1lc3NhZ2UgcHJvY2Vzc2luZyBzaG91bGQgYmUuCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQgaWYgdGhlIGhhbmRsZXIgZW5jb3VudGVycyBhbiBlcnJvcgotICAgICAqLwotICAgIHB1YmxpYyBJbnZvY2F0aW9uUmVzcG9uc2UgaW52b2tlKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHRocm93cyBBeGlzRmF1bHQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBvbiBlYWNoIHJlZ2lzdGVyZWQgaGFuZGxlciB0aGF0IGhhZCBpdHMKLSAgICAgKiBpbnZva2UoLi4uKSBtZXRob2QgY2FsbGVkIGR1cmluZyB0aGUgcHJvY2Vzc2luZyBvZiB0aGUgbWVzc2FnZSwgb25jZQotICAgICAqIHRoZSBtZXNzYWdlIHByb2Nlc3NpbmcgaGFzIGNvbXBsZXRlZC4gIER1cmluZyBleGVjdXRpb24gb2YgdGhlCi0gICAgICogZmxvd0NvbXBsZXRlJ3MsIGhhbmRsZXJzIGFyZSBpbnZva2VkIGluIHRoZSBvcHBvc2l0ZSBvcmRlciB0aGF0IHRoZXkKLSAgICAgKiB3ZXJlIGludm9rZWQgb3JpZ2luYWxseS4gIE5vdGUgdGhhdCBpbXBsZW1lbnRhdGlvbnMgU0hPVUxEIGNoZWNrCi0gICAgICogbXNnQ29udGV4dC5nZXRGYWlsdXJlUmVhc29uKCkgdG8gc2VlIGlmIHRoaXMgaXMgYW4gZXJyb3Igb3IgYSBub3JtYWwKLSAgICAgKiBjb21wbGV0aW9uLgotICAgICAqCi0gICAgICogQHBhcmFtIG1zZ0NvbnRleHQgdGhlIDxjb2RlPk1lc3NhZ2VDb250ZXh0PC9jb2RlPiB0byBwcm9jZXNzIHdpdGggdGhpcwotICAgICAqICAgICAgICAgICAgICAgICAgIDxjb2RlPkhhbmRsZXI8L2NvZGU+LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGZsb3dDb21wbGV0ZShNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KTsKLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIEhhbmRsZXJEZXNjcmlwdGlvbiBvZiBhIGhhbmRsZXIuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgSGFuZGxlckRlc2NyaXB0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBIYW5kbGVyRGVzY3JpcHRpb24gZ2V0SGFuZGxlckRlc2MoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGlzIEhhbmRsZXIKLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIGhhbmRsZXIncyBuYW1lIGFzIGEgU3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCk7Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYSBQYXJhbWV0ZXIgZnJvbSB0aGlzIEhhbmRsZXIKLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBkZXNpcmVkIHZhbHVlCi0gICAgICogQHJldHVybiB0aGUgUGFyYW1ldGVyLCBvciBudWxsLgotICAgICAqLwotICAgIHB1YmxpYyBQYXJhbWV0ZXIgZ2V0UGFyYW1ldGVyKFN0cmluZyBuYW1lKTsKLQotICAgIC8qKgotICAgICAqIFRoaXMgdHlwZSBlbmNhcHN1bGF0ZXMgYW4gZW51bWVyYXRpb24gb2YgcG9zc2libGUgbWVzc2FnZSBwcm9jZXNzaW5nCi0gICAgICogaW5zdHJ1Y3Rpb24gdmFsdWVzIHRoYXQgbWF5IGJlIHJldHVybmVkIGJ5IGEgaGFuZGxlci9waGFzZSB3aXRoaW4gdGhlCi0gICAgICogcnVudGltZS4gIFRoZSByZXR1cm5lZCBpbnN0cnVjdGlvbiB3aWxsIGRldGVybWluZSB0aGUgbmV4dCBzdGVwIGluCi0gICAgICogdGhlIHByb2Nlc3NpbmcuCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIGNsYXNzIEludm9jYXRpb25SZXNwb25zZSB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSW52b2NhdGlvblJlc3BvbnNlIENPTlRJTlVFID0KLSAgICAgICAgICAgICAgICBuZXcgSW52b2NhdGlvblJlc3BvbnNlKDAsICJJbnZvY2F0aW9uUmVzcG9uc2UuQ09OVElOVUUiKTsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBJbnZvY2F0aW9uUmVzcG9uc2UgU1VTUEVORCA9Ci0gICAgICAgICAgICAgICAgbmV3IEludm9jYXRpb25SZXNwb25zZSgxLCAiSW52b2NhdGlvblJlc3BvbnNlLlNVU1BFTkQiKTsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBJbnZvY2F0aW9uUmVzcG9uc2UgQUJPUlQgPQotICAgICAgICAgICAgICAgIG5ldyBJbnZvY2F0aW9uUmVzcG9uc2UoMiwgIkludm9jYXRpb25SZXNwb25zZS5BQk9SVCIpOwotCi0gICAgICAgIHByaXZhdGUgZmluYWwgaW50IGluc3RydWN0aW9uSUQ7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGRlc2NyaXB0aW9uOwotCi0gICAgICAgIHByaXZhdGUgSW52b2NhdGlvblJlc3BvbnNlKGludCBpbnN0cnVjdGlvbklELCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKLSAgICAgICAgICAgIHRoaXMuaW5zdHJ1Y3Rpb25JRCA9IGluc3RydWN0aW9uSUQ7Ci0gICAgICAgICAgICB0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICAgICAgcmV0dXJuIGluc3RydWN0aW9uSUQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotICAgICAgICAJaWYodGhpcz09b2JqKSB7Ci0gICAgICAgIAkJcmV0dXJuIHRydWU7Ci0gICAgICAgIAl9Ci0gICAgICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBJbnZvY2F0aW9uUmVzcG9uc2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWwgSW52b2NhdGlvblJlc3BvbnNlIGluc3RhbmNlID0gKEludm9jYXRpb25SZXNwb25zZSkgb2JqOwotICAgICAgICAgICAgcmV0dXJuIChpbnN0cnVjdGlvbklEID09IGluc3RhbmNlLmluc3RydWN0aW9uSUQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgICAgIHJldHVybiBkZXNjcmlwdGlvbjsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvSW5zdGFuY2VEaXNwYXRjaGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZW5naW5lL0luc3RhbmNlRGlzcGF0Y2hlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2Y3YTIzLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvSW5zdGFuY2VEaXNwYXRjaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5lbmdpbmU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5oYW5kbGVycy5BYnN0cmFjdEhhbmRsZXI7Ci0KLS8qKgotICogQnkgdGhlIHRpbWUgdGhlIGNvbnRyb2wgY29tZXMgdG8gdGhpcyBoYW5kbGVyLCB0aGUgZGlzcGF0Y2hpbmcgbXVzdCBoYXZlIGhhcHBlbmVkCi0gKiBzbyB0aGF0IHRoZSBtZXNzYWdlIGNvbnRleHQgY29udGFpbnMgdGhlIEF4aXNTZXJ2aWNlR3JvdXAsIEF4aXNTZXJ2aWNlIGFuZAotICogQXhpc09wZXJhdGlvbi4KLSAqIFRoaXMgd2lsbCB0aGVuIHRyeSB0byBmaW5kIHRoZSBDb250ZXh0cyBvZiBTZXJ2aWNlR3JvdXAsIFNlcnZpY2UgYW5kIHRoZSBPcGVyYXRpb24uCi0gKiBAZGVwcmVjYXRlZCBUaGUgZnVuY3Rpb25hbGl0eSBvZiB0aGlzIGNsYXNzIGhhcyBtb3ZlZCBpbnRvIHRoZSBEaXNwYXRjaFBoYXNlIHBvc3Rjb25kaXRpb25zCi0gKi8KLXB1YmxpYyBjbGFzcyBJbnN0YW5jZURpc3BhdGNoZXIgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIgewotCi0gICAgLyoqCi0gICAgICogVGhpcyBkb2Vzbid0IGRvIGFueXRoaW5nLCBhcyB0aGUgZnVuY3Rpb25hbGl0eSBpcyBub3cgaW4gRGlzcGF0Y2hQaGFzZS5jaGVja1Bvc3RDb25kaXRpb25zKCkKLSAgICAgKiBUaGUgY2xhc3MgcmVtYWlucyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgb2YgYXhpczIueG1sIGZpbGVzLCBidXQgaXQgc2hvdWxkIGdvIGF3YXkgYWZ0ZXIKLSAgICAgKiAxLjMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbXNnQ29udGV4dCB0aGUgPGNvZGU+TWVzc2FnZUNvbnRleHQ8L2NvZGU+IHRvIHByb2Nlc3Mgd2l0aCB0aGlzIDxjb2RlPkhhbmRsZXI8L2NvZGU+LgotICAgICAqIEByZXR1cm4gQW4gSW52b2NhdGlvblJlc3BvbnNlIHRoYXQgaW5kaWNhdGVzIHdoYXQgdGhlIG5leHQgc3RlcCBpbiB0aGUgbWVzc2FnZSBwcm9jZXNzaW5nCi0gICAgICogICAgICAgICBzaG91bGQgYmUuCi0gICAgICogQHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdCBpZiB0aGUgaGFuZGxlciBlbmNvdW50ZXJzIGFuIGVycm9yCi0gICAgICovCi0gICAgcHVibGljIEludm9jYXRpb25SZXNwb25zZSBpbnZva2UoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIHJldHVybiBJbnZvY2F0aW9uUmVzcG9uc2UuQ09OVElOVUU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9MaXN0ZW5lck1hbmFnZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvTGlzdGVuZXJNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzNDNlOGMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9MaXN0ZW5lck1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZW5naW5lOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNNb2R1bGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlRyYW5zcG9ydEluRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5UcmFuc3BvcnRPdXREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmkxOG4uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5tb2R1bGVzLk1vZHVsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5UcmFuc3BvcnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5UcmFuc3BvcnRTZW5kZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBMaXN0ZW5lck1hbmFnZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKExpc3RlbmVyTWFuYWdlci5jbGFzcyk7Ci0KLSAgICBwdWJsaWMgc3RhdGljIENvbmZpZ3VyYXRpb25Db250ZXh0IGRlZmF1bHRDb25maWd1cmF0aW9uQ29udGV4dDsKLSAgICBwcm90ZWN0ZWQgTGlzdGVuZXJNYW5hZ2VyU2h1dGRvd25UaHJlYWQgc2h1dGRvd25Ib29rVGhyZWFkID0gbnVsbDsKLQotICAgIHB1YmxpYyBzdGF0aWMgTGlzdGVuZXJNYW5hZ2VyIGdldERlZmF1bHRMaXN0ZW5lck1hbmFnZXIoKSB7Ci0gICAgICAgIGlmIChkZWZhdWx0Q29uZmlndXJhdGlvbkNvbnRleHQgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0gICAgICAgIHJldHVybiBkZWZhdWx0Q29uZmlndXJhdGlvbkNvbnRleHQuZ2V0TGlzdGVuZXJNYW5hZ2VyKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdjdHg7Ci0gICAgcHJpdmF0ZSBIYXNoTWFwPFN0cmluZywgVHJhbnNwb3J0TGlzdGVuZXI+IHN0YXJ0ZWRUcmFuc3BvcnRzID0KLSAgICAgICAgICAgIG5ldyBIYXNoTWFwPFN0cmluZywgVHJhbnNwb3J0TGlzdGVuZXI+KCk7Ci0KLSAgICAvLyBXZSdyZSBzdG9wcGVkIGF0IGZpcnN0LgotICAgIHByaXZhdGUgYm9vbGVhbiBzdG9wcGVkID0gdHJ1ZTsKLQotICAgIC8vIG5lZWQgdG8gcHJlc2VydmUgdGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgcmVxdWlyaW5nIGEgc2h1dGRvd24gaG9vawotICAgIHByaXZhdGUgYm9vbGVhbiBzaHV0ZG93bkhvb2tSZXF1aXJlZCA9IHRydWU7Ci0KLSAgICBwdWJsaWMgdm9pZCBpbml0KENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0N0eCkgewotICAgICAgICBpZiAodGhpcy5jb25maWdjdHggIT0gbnVsbCkgcmV0dXJuOwotCi0gICAgICAgIGNvbmZpZ0N0eC5zZXRUcmFuc3BvcnRNYW5hZ2VyKHRoaXMpOwotICAgICAgICB0aGlzLmNvbmZpZ2N0eCA9IGNvbmZpZ0N0eDsKLQotICAgICAgICAvLyBpbml0aWFsaXplIGFsbCB0aGUgdHJhbnNwb3J0IGxpc3RlbmVycwotICAgICAgICBmb3IgKE9iamVjdCBvIDogY29uZmlnY3R4LmdldEF4aXNDb25maWd1cmF0aW9uKCkuZ2V0VHJhbnNwb3J0c0luKCkudmFsdWVzKCkpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgVHJhbnNwb3J0SW5EZXNjcmlwdGlvbiB0cmFuc3BvcnRJbiA9IChUcmFuc3BvcnRJbkRlc2NyaXB0aW9uKW87Ci0gICAgICAgICAgICAgICAgVHJhbnNwb3J0TGlzdGVuZXIgbGlzdGVuZXIgPSB0cmFuc3BvcnRJbi5nZXRSZWNlaXZlcigpOwotICAgICAgICAgICAgICAgIGlmIChsaXN0ZW5lciAhPSBudWxsICYmIHN0YXJ0ZWRUcmFuc3BvcnRzLmdldCh0cmFuc3BvcnRJbi5nZXROYW1lKCkpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIuaW5pdChjb25maWdjdHgsIHRyYW5zcG9ydEluKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGxvZy5pbmZvKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBDb25maWd1cmF0aW9uQ29udGV4dCBnZXRDb25maWdjdHgoKSB7Ci0gICAgICAgIHJldHVybiBjb25maWdjdHg7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVG8gZ2V0IGFuIEVQUiBmb3IgYSBnaXZlbiBzZXJ2aWNlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2VydmljZU5hbWUgICB0aGUgbmFtZSBvZiB0aGUgc2VydmljZQotICAgICAqIEBwYXJhbSBvcE5hbWUgICAgICAgIHRoZSBvcGVyYXRpb24gbmFtZQotICAgICAqIEBwYXJhbSB0cmFuc3BvcnROYW1lIHRoZSBuYW1lIG9mIHRoZSB0cmFuc3BvcnQsIG9yIG51bGwuCi0gICAgICogQHJldHVybiBTdHJpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIEVuZHBvaW50UmVmZXJlbmNlIGdldEVQUmZvclNlcnZpY2UoU3RyaW5nIHNlcnZpY2VOYW1lLCBTdHJpbmcgb3BOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdHJhbnNwb3J0TmFtZSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIGlmICh0cmFuc3BvcnROYW1lID09IG51bGwgfHwgIiIuZXF1YWxzKHRyYW5zcG9ydE5hbWUpKSB7Ci0gICAgICAgICAgICBBeGlzU2VydmljZSBzZXJ2aWNlID0gY29uZmlnY3R4LmdldEF4aXNDb25maWd1cmF0aW9uKCkuZ2V0U2VydmljZShzZXJ2aWNlTmFtZSk7Ci0gICAgICAgICAgICBpZiAoc2VydmljZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdChNZXNzYWdlcy5nZXRNZXNzYWdlKCJzZXJ2aWNlbm90Zm91bmRpbnRoZXN5c3RlbSIsIHNlcnZpY2VOYW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc2VydmljZS5pc0VuYWJsZUFsbFRyYW5zcG9ydHMoKSkgewotICAgICAgICAgICAgICAgIEl0ZXJhdG9yPFRyYW5zcG9ydExpc3RlbmVyPiBpdHJfc3QgPSBzdGFydGVkVHJhbnNwb3J0cy52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgIHdoaWxlIChpdHJfc3QuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFRyYW5zcG9ydExpc3RlbmVyIHRyYW5zcG9ydExpc3RlbmVyID0gaXRyX3N0Lm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgRW5kcG9pbnRSZWZlcmVuY2VbXSBlcFJzRm9yU2VydmljZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0TGlzdGVuZXIuZ2V0RVBSc0ZvclNlcnZpY2Uoc2VydmljZU5hbWUsIG51bGwpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZXBSc0ZvclNlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwUnNGb3JTZXJ2aWNlWzBdOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gaWYgbm90aGluZyBjYW4gYmUgZm91bmQgcmV0dXJuIG51bGwKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBMaXN0PFN0cmluZz4gZXhwb3NlVHJhbnNwb3J0ID0gc2VydmljZS5nZXRFeHBvc2VkVHJhbnNwb3J0cygpOwotICAgICAgICAgICAgICAgIFRyYW5zcG9ydExpc3RlbmVyIGxpc3RlbmVyID0gc3RhcnRlZFRyYW5zcG9ydHMuZ2V0KGV4cG9zZVRyYW5zcG9ydC5nZXQoMCkpOwotCi0gICAgICAgICAgICAgICAgRW5kcG9pbnRSZWZlcmVuY2VbXSBlcHJzRm9yU2VydmljZTsKLSAgICAgICAgICAgICAgICBlcHJzRm9yU2VydmljZSA9IGxpc3RlbmVyLmdldEVQUnNGb3JTZXJ2aWNlKHNlcnZpY2VOYW1lLCBudWxsKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXByc0ZvclNlcnZpY2UgIT0gbnVsbCA/IGVwcnNGb3JTZXJ2aWNlWzBdIDogbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgVHJhbnNwb3J0SW5EZXNjcmlwdGlvbiB0cnNJTiA9IGNvbmZpZ2N0eC5nZXRBeGlzQ29uZmlndXJhdGlvbigpCi0gICAgICAgICAgICAgICAgICAgIC5nZXRUcmFuc3BvcnRJbih0cmFuc3BvcnROYW1lKTsKLSAgICAgICAgICAgIFRyYW5zcG9ydExpc3RlbmVyIGxpc3RlbmVyID0gdHJzSU4uZ2V0UmVjZWl2ZXIoKTsKLSAgICAgICAgICAgIEVuZHBvaW50UmVmZXJlbmNlW10gZXByc0ZvclNlcnZpY2U7Ci0gICAgICAgICAgICBlcHJzRm9yU2VydmljZSA9IGxpc3RlbmVyLmdldEVQUnNGb3JTZXJ2aWNlKHNlcnZpY2VOYW1lLCBudWxsKTsKLSAgICAgICAgICAgIHJldHVybiBlcHJzRm9yU2VydmljZSAhPSBudWxsID8gZXByc0ZvclNlcnZpY2VbMF0gOiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqIFRvIHN0YXJ0IGFsbCB0aGUgdHJhbnNwb3J0cyAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdGFydCgpIHsKLSAgICAgICAgaWYgKCFzdG9wcGVkKSByZXR1cm47Ci0KLSAgICAgICAgaWYgKGNvbmZpZ2N0eCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBsb2cuZXJyb3IoIkNhbid0IHN0YXJ0IHVuaW5pdGlhbGl6ZWQgTGlzdGVuZXJNYW5hZ2VyISIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChPYmplY3QgbyA6IGNvbmZpZ2N0eC5nZXRBeGlzQ29uZmlndXJhdGlvbigpLmdldFRyYW5zcG9ydHNJbigpLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIFRyYW5zcG9ydEluRGVzY3JpcHRpb24gdHJhbnNwb3J0SW4gPSAoVHJhbnNwb3J0SW5EZXNjcmlwdGlvbilvOwotICAgICAgICAgICAgICAgIFRyYW5zcG9ydExpc3RlbmVyIGxpc3RlbmVyID0gdHJhbnNwb3J0SW4uZ2V0UmVjZWl2ZXIoKTsKLSAgICAgICAgICAgICAgICBpZiAobGlzdGVuZXIgIT0gbnVsbCAmJiBzdGFydGVkVHJhbnNwb3J0cy5nZXQodHJhbnNwb3J0SW4uZ2V0TmFtZSgpKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLnN0YXJ0KCk7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXJ0ZWRUcmFuc3BvcnRzLnB1dCh0cmFuc3BvcnRJbi5nZXROYW1lKCksIGxpc3RlbmVyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGxvZy5pbmZvKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzaHV0ZG93bkhvb2tUaHJlYWQgPT0gbnVsbCAmJiBpc1NodXRkb3duSG9va1JlcXVpcmVkKCkpIHsKLSAgICAgICAgICAgIHNodXRkb3duSG9va1RocmVhZCA9IG5ldyBMaXN0ZW5lck1hbmFnZXJTaHV0ZG93blRocmVhZCh0aGlzKTsKLSAgICAgICAgICAgIFJ1bnRpbWUuZ2V0UnVudGltZSgpLmFkZFNodXRkb3duSG9vayhzaHV0ZG93bkhvb2tUaHJlYWQpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBzdG9wcGVkID0gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHN0YXJ0U3lzdGVtKENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ3VyYXRpb25Db250ZXh0KSB7Ci0gICAgICAgIGluaXQoY29uZmlndXJhdGlvbkNvbnRleHQpOwotICAgICAgICBzdGFydCgpOwotICAgIH0KLQotICAgIC8qKiBTdG9wIGFsbCB0aGUgdHJhbnNwb3J0cyBhbmQgbm90aWZ5IG1vZHVsZXMgb2Ygc2h1dGRvd24uICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHN0b3AoKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgaWYgKHN0b3BwZWQpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFJlbW92ZSB0aGUgc2h1dGRvd24gaG9vawotICAgICAgICBpZiAoc2h1dGRvd25Ib29rVGhyZWFkICE9IG51bGwgJiYgc2h1dGRvd25Ib29rVGhyZWFkLmdldFN0YXRlKCkgIT0gVGhyZWFkLlN0YXRlLlJVTk5BQkxFKSB7Ci0gICAgICAgIAlSdW50aW1lLmdldFJ1bnRpbWUoKS5yZW1vdmVTaHV0ZG93bkhvb2soc2h1dGRvd25Ib29rVGhyZWFkKTsKLSAgICAgICAgICAgIHNodXRkb3duSG9va1RocmVhZCA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKE9iamVjdCBvIDogc3RhcnRlZFRyYW5zcG9ydHMudmFsdWVzKCkpIHsKLSAgICAgICAgICAgIFRyYW5zcG9ydExpc3RlbmVyIHRyYW5zcG9ydExpc3RlbmVyID0gKFRyYW5zcG9ydExpc3RlbmVyKW87Ci0gICAgICAgICAgICB0cmFuc3BvcnRMaXN0ZW5lci5zdG9wKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTdG9wIHRoZSB0cmFuc3BvcnQgc2VuZGVycwotICAgICAgICBIYXNoTWFwPFN0cmluZywgVHJhbnNwb3J0T3V0RGVzY3JpcHRpb24+IG91dFRyYW5zcG9ydHMgPQotICAgICAgICAgICAgICAgIGNvbmZpZ2N0eC5nZXRBeGlzQ29uZmlndXJhdGlvbigpLmdldFRyYW5zcG9ydHNPdXQoKTsKLSAgICAgICAgaWYgKG91dFRyYW5zcG9ydHMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgSXRlcmF0b3I8VHJhbnNwb3J0T3V0RGVzY3JpcHRpb24+IHRyc0l0ciA9IG91dFRyYW5zcG9ydHMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIHdoaWxlICh0cnNJdHIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgVHJhbnNwb3J0T3V0RGVzY3JpcHRpb24gb3V0RGVzY3JpcHRpb24gPSB0cnNJdHIubmV4dCgpOwotICAgICAgICAgICAgICAgIFRyYW5zcG9ydFNlbmRlciBzZW5kZXIgPSBvdXREZXNjcmlwdGlvbi5nZXRTZW5kZXIoKTsKLSAgICAgICAgICAgICAgICBpZiAoc2VuZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgc2VuZGVyLnN0b3AoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTaHV0IGRvd24gdGhlIHNlcnZpY2VzCi0gICAgICAgIGZvciAoT2JqZWN0IG8gOiBjb25maWdjdHguZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5nZXRTZXJ2aWNlcygpLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICBBeGlzU2VydmljZSBheGlzU2VydmljZSA9IChBeGlzU2VydmljZSlvOwotICAgICAgICAgICAgU2VydmljZUxpZmVDeWNsZSBzZXJ2aWNlTGlmZUN5Y2xlID0gYXhpc1NlcnZpY2UuZ2V0U2VydmljZUxpZmVDeWNsZSgpOwotICAgICAgICAgICAgaWYgKHNlcnZpY2VMaWZlQ3ljbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHNlcnZpY2VMaWZlQ3ljbGUuc2h1dERvd24oY29uZmlnY3R4LCBheGlzU2VydmljZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIFNodXQgZG93biB0aGUgbW9kdWxlcwotICAgICAgICBIYXNoTWFwPFN0cmluZywgQXhpc01vZHVsZT4gbW9kdWxlcyA9IGNvbmZpZ2N0eC5nZXRBeGlzQ29uZmlndXJhdGlvbigpLmdldE1vZHVsZXMoKTsKLSAgICAgICAgaWYgKG1vZHVsZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgSXRlcmF0b3I8QXhpc01vZHVsZT4gbW9kdWxlaXRyID0gbW9kdWxlcy52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgd2hpbGUgKG1vZHVsZWl0ci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBBeGlzTW9kdWxlIGF4aXNNb2R1bGUgPSBtb2R1bGVpdHIubmV4dCgpOwotICAgICAgICAgICAgICAgIE1vZHVsZSBtb2R1bGUgPSBheGlzTW9kdWxlLmdldE1vZHVsZSgpOwotICAgICAgICAgICAgICAgIGlmIChtb2R1bGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtb2R1bGUuc2h1dGRvd24oY29uZmlnY3R4KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY29uZmlnY3R4LmNsZWFudXBDb250ZXh0cygpOwotCi0gICAgICAgIHN0b3BwZWQgPSB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSB0cnNJbiAgIDogVHJhbnNwb3J0IGluIGRlc2NyaXB0aW9uICh3aGljaCBjb250YWlucyBUcmFuc3BvcnQgTGlzdGVuZXIpCi0gICAgICogQHBhcmFtIHN0YXJ0ZWQgOiB3aGV0aGVyIHRyYW5zcG9ydCBMaXN0ZW5lciBydW5uaW5nIG9yIG5vdAotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0IDogd2lsbCB0aHJvdyBBeGlzRmF1bHQgaWYgc29tZXRoaW5nIGdvZXMgd3JvbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkTGlzdGVuZXIoVHJhbnNwb3J0SW5EZXNjcmlwdGlvbiB0cnNJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzdGFydGVkKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgY29uZmlnY3R4LmdldEF4aXNDb25maWd1cmF0aW9uKCkuYWRkVHJhbnNwb3J0SW4odHJzSW4pOwotICAgICAgICBUcmFuc3BvcnRMaXN0ZW5lciB0cmFuc3BvcnRMaXN0ZW5lciA9IHRyc0luLmdldFJlY2VpdmVyKCk7Ci0gICAgICAgIGlmICh0cmFuc3BvcnRMaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoIXN0YXJ0ZWQpIHsKLSAgICAgICAgICAgICAgICB0cmFuc3BvcnRMaXN0ZW5lci5pbml0KGNvbmZpZ2N0eCwgdHJzSW4pOwotICAgICAgICAgICAgICAgIHRyYW5zcG9ydExpc3RlbmVyLnN0YXJ0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKHNodXRkb3duSG9va1RocmVhZCA9PSBudWxsICYmIGlzU2h1dGRvd25Ib29rUmVxdWlyZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBzaHV0ZG93bkhvb2tUaHJlYWQgPSBuZXcgTGlzdGVuZXJNYW5hZ2VyU2h1dGRvd25UaHJlYWQodGhpcyk7Ci0gICAgICAgICAgICAgICAgICAgIFJ1bnRpbWUuZ2V0UnVudGltZSgpLmFkZFNodXRkb3duSG9vayhzaHV0ZG93bkhvb2tUaHJlYWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzdG9wcGVkID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdGFydGVkVHJhbnNwb3J0cy5wdXQodHJzSW4uZ2V0TmFtZSgpLCB0cmFuc3BvcnRMaXN0ZW5lcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaXNMaXN0ZW5lclJ1bm5pbmcoU3RyaW5nIHRyYW5zcG9ydE5hbWUpIHsKLSAgICAgICAgcmV0dXJuIHN0YXJ0ZWRUcmFuc3BvcnRzLmdldCh0cmFuc3BvcnROYW1lKSAhPSBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzU3RvcHBlZCgpIHsKLSAgICAgICAgcmV0dXJuIHN0b3BwZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGVzdHJveSgpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBzdG9wKCk7Ci0gICAgICAgIHRoaXMuY29uZmlnY3R4LnNldFRyYW5zcG9ydE1hbmFnZXIobnVsbCk7Ci0gICAgICAgIGZvciAoT2JqZWN0IG8gOiBzdGFydGVkVHJhbnNwb3J0cy52YWx1ZXMoKSkgewotICAgICAgICAgICAgVHJhbnNwb3J0TGlzdGVuZXIgdHJhbnNwb3J0TGlzdGVuZXIgPSAoVHJhbnNwb3J0TGlzdGVuZXIpbzsKLSAgICAgICAgICAgIHRyYW5zcG9ydExpc3RlbmVyLmRlc3Ryb3koKTsKLSAgICAgICAgfQotICAgICAgICB0aGlzLnN0YXJ0ZWRUcmFuc3BvcnRzLmNsZWFyKCk7Ci0gICAgICAgIHRoaXMuY29uZmlnY3R4ID0gbnVsbDsKLSAgICAgICAgZGVmYXVsdENvbmZpZ3VyYXRpb25Db250ZXh0ID0gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1NodXRkb3duSG9va1JlcXVpcmVkKCkgewotICAgICAgICByZXR1cm4gc2h1dGRvd25Ib29rUmVxdWlyZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2h1dGRvd25Ib29rUmVxdWlyZWQoYm9vbGVhbiBzaHV0ZG93bkhvb2tSZXF1aXJlZCkgewotICAgICAgICB0aGlzLnNodXRkb3duSG9va1JlcXVpcmVkID0gc2h1dGRvd25Ib29rUmVxdWlyZWQ7Ci0gICAgfQotCi0gICAgc3RhdGljIGNsYXNzIExpc3RlbmVyTWFuYWdlclNodXRkb3duVGhyZWFkIGV4dGVuZHMgVGhyZWFkIHsKLSAgICAgICAgTGlzdGVuZXJNYW5hZ2VyIGxpc3RlbmVyTWFuYWdlcjsKLQotICAgICAgICBwdWJsaWMgTGlzdGVuZXJNYW5hZ2VyU2h1dGRvd25UaHJlYWQoTGlzdGVuZXJNYW5hZ2VyIGxpc3RlbmVyTWFuYWdlcikgewotICAgICAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgICAgIHRoaXMubGlzdGVuZXJNYW5hZ2VyID0gbGlzdGVuZXJNYW5hZ2VyOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpZiAoIWxpc3RlbmVyTWFuYWdlci5zdG9wcGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyTWFuYWdlci5zdG9wKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGF4aXNGYXVsdCkgewotICAgICAgICAgICAgICAgIGxvZy5lcnJvcihheGlzRmF1bHQuZ2V0TWVzc2FnZSgpLCBheGlzRmF1bHQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9NZXNzYWdlUmVjZWl2ZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvTWVzc2FnZVJlY2VpdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0YTg0OTguLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9NZXNzYWdlUmVjZWl2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLQotLyoqCi0gKiBBbiBpbnN0YW5jZSBvZiBNZXNzYWdlUmVjZWl2ZXIgY2FuIGJlIHNldHVwIHRvIHJlY2VpdmUgbWVzc2FnZXMuIFRoZSBhcHBsaWNhdGlvbiBsb2dpYyBoYXMgbm8gaW1wYWN0Ci0gKiBvbiB0aGUgQXhpcyBFbmdpbmUgaXRzZWxmLiBJdCBpcyB1cCB0byB0aGUgYXBwbGljYXRpb24gbG9naWMgdG8gZG8gd2hhdGV2ZXIgaXQgbmVlZHMuIEZvciBlLmcuCi0gKiB0aGUgTWVzc2FnZVJlY2VpdmVyIGNhbiBoYW5kbGUgYSBtZXNzYWdlLCBzZW5kIGEgcmVzcG9uc2UgYmFjayBhbmQvb3Igc2VuZCBvdGhlciBtZXNzYWdlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBNZXNzYWdlUmVjZWl2ZXIgewotICAgIHB1YmxpYyB2b2lkIHJlY2VpdmUoTWVzc2FnZUNvbnRleHQgbWVzc2FnZUN0eCkgdGhyb3dzIEF4aXNGYXVsdDsKLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvT2JqZWN0U3VwcGxpZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvT2JqZWN0U3VwcGxpZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjYxNDE4Ny4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZW5naW5lL09iamVjdFN1cHBsaWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZW5naW5lOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgT2JqZWN0U3VwcGxpZXIgewotICAgIC8qKgotICAgICAqIElmIHNvbWVvbmUgd2FudCB0byB3cml0ZSBzZXJ2aWNlIGltcGwgY2xhc3Mgd2l0aCBpbnRlcmZhY2UKLSAgICAgKiBiZWluZyB0aGVyZSBtZXRob2QgcGFyYW1ldGVyICwgdGhlbiBhdCB0aGUgdGltZSBvZiBkZXNlcmlsaXphdGlvbgotICAgICAqIHRoaXMgbWV0aG9kIHdpbGwgcHJvdmlkZSB0aGUgaW1wbCBjbGFzcyBmb3IgdGhhdCBpbnRlcmZhY2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2xhenogVHlwZQotICAgICAqIEByZXR1cm4KLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdCA6IHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uIHdoZW4gc29tZXRoaW5nIGdvZXMgd3JvbmcKLSAgICAgKi8KLSAgICBPYmplY3QgZ2V0T2JqZWN0KENsYXNzIGNsYXp6KSB0aHJvd3MgQXhpc0ZhdWx0OwotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9QaGFzZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9QaGFzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjBjYTk1Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvUGhhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5lbmdpbmU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5IYW5kbGVyRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5QYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5QaGFzZVJ1bGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5waGFzZXJlc29sdmVyLlBoYXNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5Mb2dnaW5nQ29udHJvbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3B5T25Xcml0ZUFycmF5TGlzdDsKLQotLyoqCi0gKiBBIFBoYXNlIGlzIGFuIG9yZGVyZWQgY29sbGVjdGlvbiBvZiBIYW5kbGVycy4KLSAqLwotcHVibGljIGNsYXNzIFBoYXNlIGltcGxlbWVudHMgSGFuZGxlciB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTExfUEhBU0VTID0gIioiOwotCi0gICAgLyoqCi0gICAgICogRmllbGQgbG9nCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFBoYXNlLmNsYXNzKTsKLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzRGVidWdFbmFibGVkID0gTG9nZ2luZ0NvbnRyb2wuZGVidWdMb2dnaW5nQWxsb3dlZCAmJiBsb2cuaXNEZWJ1Z0VuYWJsZWQoKTsKLQotICAgIC8qKgotICAgICAqIEZpZWxkIGhhbmRsZXJzCi0gICAgICovCi0gICAgcHJpdmF0ZSBMaXN0PEhhbmRsZXI+IGhhbmRsZXJzOwotCi0gICAgLyoqCi0gICAgICogQSBoYW5kbGVyIGhhcyBiZWVuIG1hcmtlZCBhcyBwcmVzZW50IGluIGJvdGggdGhlIGZpcnN0IHBoYXNlIGFuZCB0aGUgbGFzdCBwaGFzZQotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBpc09uZUhhbmRsZXI7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBwaGFzZU5hbWUKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBwaGFzZU5hbWU7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBwaGFzZUZpcnN0U2V0Ci0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIHBoYXNlRmlyc3RTZXQ7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBwaGFzZUxhc3RTZXQKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gcGhhc2VMYXN0U2V0OwotCi0gICAgLyoqCi0gICAgICogRGVmYXVsdCBjb25zdHJ1Y3RvcgotICAgICAqLwotICAgIHB1YmxpYyBQaGFzZSgpIHsKLSAgICAgICAgdGhpcyhudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBuYW1lZCBQaGFzZQotICAgICAqCi0gICAgICogQHBhcmFtIHBoYXNlTmFtZSB0aGUgbmFtZSBmb3IgdGhpcyBQaGFzZQotICAgICAqLwotICAgIHB1YmxpYyBQaGFzZShTdHJpbmcgcGhhc2VOYW1lKSB7Ci0gICAgICAgIGhhbmRsZXJzID0gbmV3IENvcHlPbldyaXRlQXJyYXlMaXN0PEhhbmRsZXI+KCk7Ci0gICAgICAgIHRoaXMucGhhc2VOYW1lID0gcGhhc2VOYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZCBhIGhhbmRsZXIgdG8gdGhlIFBoYXNlLgotICAgICAqCi0gICAgICogQHBhcmFtIGhhbmRsZXIgdGhlIEhhbmRsZXIgdG8gYWRkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkSGFuZGxlcihIYW5kbGVyIGhhbmRsZXIpIHsKLSAgICAgICAgbG9nLmRlYnVnKCJIYW5kbGVyICIgKyBoYW5kbGVyLmdldE5hbWUoKSArICIgYWRkZWQgdG8gUGhhc2UgIiArIHBoYXNlTmFtZSk7Ci0KLSAgICAgICAgaWYgKHBoYXNlTGFzdFNldCkgewotICAgICAgICAgICAgLy8gaGFuZGxlcnMuc2l6ZSgpIGNhbiBub3QgYmUgMCAsIHNpbmNlIHdoZW4gc2V0dGluZyBwaGFzZSBsYXN0IGl0IGlzIGFsd2F5cyA+IDAKLSAgICAgICAgICAgIGlmIChoYW5kbGVycy5zaXplKCkgPT0gMSkgewotICAgICAgICAgICAgICAgIGhhbmRsZXJzLmFkZCgwLCBoYW5kbGVyKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlcnMuYWRkKGhhbmRsZXJzLnNpemUoKSAtIDIsIGhhbmRsZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaGFuZGxlcnMuYWRkKGhhbmRsZXIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkIGEgSGFuZGxlckRlc2NyaXB0aW9uIHRvIHRoZSBQaGFzZQotICAgICAqCi0gICAgICogQHBhcmFtIGhhbmRsZXJEZXNjIHRoZSBIYW5kbGVyRGVzY3JpcHRpb24gdG8gYWRkCi0gICAgICogQHRocm93cyBQaGFzZUV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIHByb2JsZW0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRIYW5kbGVyKEhhbmRsZXJEZXNjcmlwdGlvbiBoYW5kbGVyRGVzYykgdGhyb3dzIFBoYXNlRXhjZXB0aW9uIHsKLSAgICAgICAgSXRlcmF0b3I8SGFuZGxlcj4gaGFuZGxlcnNfaXRyID0gZ2V0SGFuZGxlcnMoKS5pdGVyYXRvcigpOwotCi0gICAgICAgIHdoaWxlIChoYW5kbGVyc19pdHIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBIYW5kbGVyIGhhbmQgPSAoSGFuZGxlcikgaGFuZGxlcnNfaXRyLm5leHQoKTsKLSAgICAgICAgICAgIEhhbmRsZXJEZXNjcmlwdGlvbiB0aGlzRGVzYyA9IGhhbmQuZ2V0SGFuZGxlckRlc2MoKTsKLSAgICAgICAgICAgIGlmIChoYW5kbGVyRGVzYy5nZXROYW1lKCkuZXF1YWxzKHRoaXNEZXNjLmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaXNPbmVIYW5kbGVyKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUGhhc2VFeGNlcHRpb24oIlBoYXNlICciICsgdGhpcy5nZXRQaGFzZU5hbWUoKQotICAgICAgICAgICAgICAgICAgICArICInIGNhbiBvbmx5IGhhdmUgb25lIGhhbmRsZXIsIHNpbmNlIHRoZXJlIGlzIGEgIgotICAgICAgICAgICAgICAgICAgICArICJoYW5kbGVyIHdpdGggYm90aCBwaGFzZUZpcnN0IGFuZCBwaGFzZUxhc3QgdHJ1ZSAiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChoYW5kbGVyRGVzYy5nZXRSdWxlcygpLmlzUGhhc2VGaXJzdCgpICYmIGhhbmRsZXJEZXNjLmdldFJ1bGVzKCkuaXNQaGFzZUxhc3QoKSkgewotICAgICAgICAgICAgaWYgKCFoYW5kbGVycy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUGhhc2VFeGNlcHRpb24odGhpcy5nZXRQaGFzZU5hbWUoKQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGFscmVhZHkgY29udGFpbnMgSGFuZGxlcnMsIGFuZCAiCi0gICAgICAgICAgICAgICAgICAgICAgICArIGhhbmRsZXJEZXNjLmdldE5hbWUoKQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGNhbm5vdCB0aGVyZWZvcmUgYmUgYm90aCBwaGFzZUZpcnN0IGFuZCBwaGFzZUxhc3QuIik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGhhbmRsZXJzLmFkZChoYW5kbGVyRGVzYy5nZXRIYW5kbGVyKCkpOwotICAgICAgICAgICAgICAgIGlzT25lSGFuZGxlciA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoaGFuZGxlckRlc2MuZ2V0UnVsZXMoKS5pc1BoYXNlRmlyc3QoKSkgewotICAgICAgICAgICAgc2V0UGhhc2VGaXJzdChoYW5kbGVyRGVzYy5nZXRIYW5kbGVyKCkpOwotICAgICAgICB9IGVsc2UgaWYgKGhhbmRsZXJEZXNjLmdldFJ1bGVzKCkuaXNQaGFzZUxhc3QoKSkgewotICAgICAgICAgICAgc2V0UGhhc2VMYXN0KGhhbmRsZXJEZXNjLmdldEhhbmRsZXIoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpbnNlcnRIYW5kbGVyKGhhbmRsZXJEZXNjKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZCBhIEhhbmRsZXIgYXQgYSBwYXJ0aWN1bGFyIGluZGV4IHdpdGhpbiB0aGUgUGhhc2UuCi0gICAgICoKLSAgICAgKiBJZiB3ZSBoYXZlIGEgUGhhc2Ugd2l0aCAoSDEsIEgyKSwgY2FsbGluZyBhZGRIYW5kbGVyKEgzLCAxKSB3aWxsIHJlc3VsdCBpbiAoSDEsIEgzLCBIMikKLSAgICAgKgotICAgICAqIEBwYXJhbSBoYW5kbGVyIHRoZSBIYW5kbGVyIHRvIGFkZAotICAgICAqIEBwYXJhbSBpbmRleCB0aGUgcG9zaXRpb24gaW4gdGhlIFBoYXNlIGF0IHdoaWNoIHRvIHBsYWNlIHRoZSBIYW5kbGVyCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkSGFuZGxlcihIYW5kbGVyIGhhbmRsZXIsIGludCBpbmRleCkgewotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiSGFuZGxlciAiICsgaGFuZGxlci5nZXROYW1lKCkgKyAiIGluc2VydGVkIGF0IHBvc2l0aW9uICIgKyBpbmRleCArCi0gICAgICAgICAgICAgICAgICAgICIgb2YgUGhhc2UgIiArIHBoYXNlTmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaGFuZGxlcnMuYWRkKGluZGV4LCBoYW5kbGVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25maXJtIHRoYXQgYWxsIHBvc3QtY29uZGl0aW9ucyBvZiB0aGlzIFBoYXNlIGFyZSBtZXQuICBBZnRlciBhbGwgSGFuZGxlcnMgaW4gYQotICAgICAqIFBoYXNlIGFyZSBpbnZva2UoKWQsIHRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkLiAgU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgaXQgaW4gb3JkZXIKLSAgICAgKiB0byBjb25maXJtIHRoYXQgdGhlIHB1cnBvc2Ugb2YgdGhlIGdpdmVuIFBoYXNlIGhhcyBiZWVuIGFjaGVpdmVkLgotICAgICAqCi0gICAgICogQHBhcmFtIG1zZ0NvbnRleHQgdGhlIGFjdGl2ZSBNZXNzYWdlQ29udGV4dAotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0IGlmIGEgcG9zdC1jb25kaXRpb24gaGFzIG5vdCBiZWVuIG1ldCwgb3Igb3RoZXIgcHJvYmxlbXMgb2NjdXIKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjaGVja1Bvc3RDb25kaXRpb25zKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICAvLyBEZWZhdWx0IHZlcnNpb24gZG9lcyBub3RoaW5nCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2sgdGhlIHByZWNvbmRpdGlvbnMgZm9yIGEgUGhhc2UuICBUaGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSBQaGFzZSBpcwotICAgICAqIGludm9rZWQsIEJFRk9SRSBhbnkgSGFuZGxlcnMgYXJlIGludm9rZWQuICBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBpdCBpbiBvcmRlcgotICAgICAqIHRvIGNvbmZpcm0gdGhhdCBuZWNlc3NhcnkgcHJlY29uZGl0aW9ucyBhcmUgbWV0IGJlZm9yZSB0aGUgUGhhc2UgZG9lcyBpdHMgd29yay4gIFRoZXkKLSAgICAgKiBzaG91bGQgdGhyb3cgYW4gYXBwcm9wcmlhdGUgQXhpc0ZhdWx0IGlmIG5vdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtc2dDb250ZXh0IHRoZSBhY3RpdmUgTWVzc2FnZUNvbnRleHQKLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdCBpZiBhIHByZWNvbmRpdGlvbiBpcyBub3QgbWV0LCBvciBpbiBjYXNlIG9mIG90aGVyIHByb2JsZW0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjaGVja1ByZWNvbmRpdGlvbnMoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIC8vIERlZmF1bHQgdmVyc2lvbiBkb2VzIG5vdGhpbmcKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjbGVhbnVwKCkgewotICAgICAgICAvLyBEZWZhdWx0IHZlcnNpb24gZG9lcyBub3RoaW5nCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaW5pdChIYW5kbGVyRGVzY3JpcHRpb24gaGFuZGxlcmRlc2MpIHsKLSAgICAgICAgLy8gRGVmYXVsdCB2ZXJzaW9uIGRvZXMgbm90aGluZwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbnNlcnRIYW5kbGVyKEhhbmRsZXJEZXNjcmlwdGlvbiBoYW5kbGVyRGVzYykgdGhyb3dzIFBoYXNlRXhjZXB0aW9uIHsKLSAgICAgICAgSGFuZGxlciBoYW5kbGVyID0gaGFuZGxlckRlc2MuZ2V0SGFuZGxlcigpOwotICAgICAgICBQaGFzZVJ1bGUgcnVsZXMgPSBoYW5kbGVyLmdldEhhbmRsZXJEZXNjKCkuZ2V0UnVsZXMoKTsKLSAgICAgICAgU3RyaW5nIGJlZm9yZU5hbWUgPSBydWxlcy5nZXRCZWZvcmUoKTsKLSAgICAgICAgU3RyaW5nIGFmdGVyTmFtZSA9IHJ1bGVzLmdldEFmdGVyKCk7Ci0KLSAgICAgICAgLy8gSWYgd2UgZG9uJ3QgY2FyZSB3aGVyZSBpdCBnb2VzLCB0YWNrIGl0IG9uIGF0IHRoZSBlbmQKLSAgICAgICAgaWYgKGJlZm9yZU5hbWUgPT0gbnVsbCAmJiBhZnRlck5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgYWRkSGFuZGxlcihoYW5kbGVyKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIE90aGVyd2lzZSB3YWxrIHRoZSBsaXN0IGFuZCBmaW5kIHRoZSByaWdodCBwbGFjZSB0byBwdXQgaXQKLSAgICAgICAgaW50IGJlZm9yZUluZGV4ID0gLTEsIGFmdGVySW5kZXggPSAtMTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGhhbmRsZXJzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBIYW5kbGVyIHRlbXBIYW5kbGVyID0gKEhhbmRsZXIpIGhhbmRsZXJzLmdldChpKTsKLQotICAgICAgICAgICAgaWYgKChiZWZvcmVOYW1lICE9IG51bGwpICYmIChiZWZvcmVJbmRleCA9PSAtMSkpIHsKLSAgICAgICAgICAgICAgICBpZiAodGVtcEhhbmRsZXIuZ2V0TmFtZSgpLmVxdWFscyhiZWZvcmVOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBGb3VuZCB0aGUgImJlZm9yZSIgaGFuZGxlcgotICAgICAgICAgICAgICAgICAgICBiZWZvcmVJbmRleCA9IGk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoKGFmdGVyTmFtZSAhPSBudWxsKSAmJiAoYWZ0ZXJJbmRleCA9PSAtMSkpIHsKLSAgICAgICAgICAgICAgICBpZiAodGVtcEhhbmRsZXIuZ2V0TmFtZSgpLmVxdWFscyhhZnRlck5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEZvdW5kIHRoZSAiYWZ0ZXIiIGhhbmRsZXIKLSAgICAgICAgICAgICAgICAgICAgYWZ0ZXJJbmRleCA9IGk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKChiZWZvcmVJbmRleCA+IC0xKSAmJiAoYWZ0ZXJJbmRleCA+PSBiZWZvcmVJbmRleCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBQaGFzZUV4Y2VwdGlvbigiQ2FuJ3QgaW5zZXJ0IGhhbmRsZXIgYmVjYXVzZSAiICsgYmVmb3JlTmFtZSArICIgaXMgYmVmb3JlICIgKwotICAgICAgICAgICAgICAgICAgICBhZnRlck5hbWUgKyAiIGluIFBoYXNlICciICsgcGhhc2VOYW1lICsgIiciKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwaGFzZUZpcnN0U2V0ICYmIGJlZm9yZUluZGV4ID09IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBQaGFzZUV4Y2VwdGlvbigiQ2FuJ3QgaW5zZXJ0IGhhbmRsZXIgYmVmb3JlIGhhbmRsZXIgJyIKLSAgICAgICAgICAgICAgICAgICAgKyBiZWZvcmVOYW1lCi0gICAgICAgICAgICAgICAgICAgICsgIicsIHdoaWNoIGlzIG1hcmtlZCBwaGFzZUZpcnN0Iik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocGhhc2VMYXN0U2V0ICYmIGFmdGVySW5kZXggPT0gKGhhbmRsZXJzLnNpemUoKSAtIDEpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUGhhc2VFeGNlcHRpb24oIkNhbid0IGluc2VydCBoYW5kbGVyIGFmdGVyIGhhbmRsZXIgJyIKLSAgICAgICAgICAgICAgICAgICAgKyBhZnRlck5hbWUKLSAgICAgICAgICAgICAgICAgICAgKyAiJywgd2hpY2ggaXMgbWFya2VkIHBoYXNlTGFzdCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGJlZm9yZUluZGV4ID4gLTEpIHsKLSAgICAgICAgICAgIGhhbmRsZXJzLmFkZChiZWZvcmVJbmRleCwgaGFuZGxlcik7Ci0gICAgICAgIH0gZWxzZSBpZiAoYWZ0ZXJJbmRleCA+IC0xKXsKLSAgICAgICAgICAgIGlmIChwaGFzZUxhc3RTZXQpewotICAgICAgICAgICAgICAgIGlmIChoYW5kbGVycy5zaXplKCkgPT0xKXsKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlcnMuYWRkKDAsaGFuZGxlcik7Ci0gICAgICAgICAgICAgICAgfSAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZXJzLmFkZChoYW5kbGVycy5zaXplKCkgLTIsaGFuZGxlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGFmdGVySW5kZXggPT0gKGhhbmRsZXJzLnNpemUoKSAtMSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlcnMuYWRkKGhhbmRsZXIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZXJzLmFkZChhZnRlckluZGV4ICsxLGhhbmRsZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSAgZWxzZSB7Ci0gICAgICAgICAgICBpZiAocGhhc2VMYXN0U2V0KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGhhbmRsZXJzLnNpemUoKSA9PTEpewotICAgICAgICAgICAgICAgICAgICBoYW5kbGVycy5hZGQoMCxoYW5kbGVyKTsKLSAgICAgICAgICAgICAgICB9ICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlcnMuYWRkKGhhbmRsZXJzLnNpemUoKSAtMixoYW5kbGVyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9ICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGhhbmRsZXJzLmFkZChoYW5kbGVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEludm9rZSBhbGwgdGhlIGhhbmRsZXJzIGluIHRoaXMgUGhhc2UKLSAgICAgKgotICAgICAqIEBwYXJhbSBtc2djdHggdGhlIGN1cnJlbnQgTWVzc2FnZUNvbnRleHQKLSAgICAgKiBAcmV0dXJuIEFuIEludm9jYXRpb25SZXNwb25zZSB0aGF0IGluZGljYXRlcyB3aGF0Ci0gICAgICogICAgICAgICB0aGUgbmV4dCBzdGVwIGluIHRoZSBtZXNzYWdlIHByb2Nlc3Npbmcgc2hvdWxkIGJlLgotICAgICAqIEB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQKLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgSW52b2NhdGlvblJlc3BvbnNlIGludm9rZShNZXNzYWdlQ29udGV4dCBtc2djdHgpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICAKLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcobXNnY3R4LmdldExvZ0lEU3RyaW5nKCkgKyAiIENoZWNraW5nIHByZS1jb25kaXRpb24gZm9yIFBoYXNlIFwiIiArIHBoYXNlTmFtZSArCi0gICAgICAgICAgICAgICAgICAgICJcIiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgSW52b2NhdGlvblJlc3BvbnNlIHBpID0gSW52b2NhdGlvblJlc3BvbnNlLkNPTlRJTlVFOwotCi0gICAgICAgIGludCBjdXJyZW50SW5kZXggPSBtc2djdHguZ2V0Q3VycmVudFBoYXNlSW5kZXgoKTsKLQotICAgICAgICBpZiAoY3VycmVudEluZGV4ID09IDApIHsKLSAgICAgICAgICAgIGNoZWNrUHJlY29uZGl0aW9ucyhtc2djdHgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcobXNnY3R4LmdldExvZ0lEU3RyaW5nKCkgKyAiIEludm9raW5nIHBoYXNlIFwiIiArIHBoYXNlTmFtZSArICJcIiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGhhbmRsZXJzU2l6ZSA9IGhhbmRsZXJzLnNpemUoKTsKLSAgICAgICAgCi0gICAgICAgIHdoaWxlIChjdXJyZW50SW5kZXggPCBoYW5kbGVyc1NpemUpIHsKLSAgICAgICAgICAgIEhhbmRsZXIgaGFuZGxlciA9IChIYW5kbGVyKSBoYW5kbGVycy5nZXQoY3VycmVudEluZGV4KTsKLQotICAgICAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKG1zZ2N0eC5nZXRMb2dJRFN0cmluZygpICsgIiBJbnZva2luZyBIYW5kbGVyICciICsgaGFuZGxlci5nZXROYW1lKCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgIicgaW4gUGhhc2UgJyIgKyBwaGFzZU5hbWUgKyAiJyIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcGkgPSBoYW5kbGVyLmludm9rZShtc2djdHgpOwotCi0gICAgICAgICAgICBpZiAoIXBpLmVxdWFscyhJbnZvY2F0aW9uUmVzcG9uc2UuQ09OVElOVUUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHBpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjdXJyZW50SW5kZXgrKzsKLSAgICAgICAgICAgIG1zZ2N0eC5zZXRDdXJyZW50UGhhc2VJbmRleChjdXJyZW50SW5kZXgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcobXNnY3R4LmdldExvZ0lEU3RyaW5nKCkgKyAiIENoZWNraW5nIHBvc3QtY29uZGl0aW9ucyBmb3IgcGhhc2UgXCIiICsKLSAgICAgICAgICAgICAgICAgICAgcGhhc2VOYW1lICsgIlwiIik7Ci0gICAgICAgIH0KLQotICAgICAgICBtc2djdHguc2V0Q3VycmVudFBoYXNlSW5kZXgoMCk7Ci0gICAgICAgIGNoZWNrUG9zdENvbmRpdGlvbnMobXNnY3R4KTsKLSAgICAgICAgcmV0dXJuIHBpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGZsb3dDb21wbGV0ZShNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB7Ci0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgewotICAgICAgICAgICAgbG9nLmRlYnVnKG1zZ0NvbnRleHQuZ2V0TG9nSURTdHJpbmcoKSArICIgSW52b2tpbmcgZmxvd0NvbXBsZXRlKCkgaW4gUGhhc2UgXCIiICsKLSAgICAgICAgICAgICAgICAgICAgcGhhc2VOYW1lICsgIlwiIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBUaGlzIHdpbGwgYmUgbm9uLXplcm8gaWYgd2UgZmFpbGVkIGR1cmluZyBleGVjdXRpb24gb2Ygb25lIG9mIHRoZQotICAgICAgICAvLyBoYW5kbGVycyBpbiB0aGlzIHBoYXNlCi0gICAgICAgIGludCBjdXJyZW50SGFuZGxlckluZGV4ID0gbXNnQ29udGV4dC5nZXRDdXJyZW50UGhhc2VJbmRleCgpOwotICAgICAgICBpZiAoY3VycmVudEhhbmRsZXJJbmRleCA9PSAwKSB7Ci0gICAgICAgICAgICBjdXJyZW50SGFuZGxlckluZGV4ID0gaGFuZGxlcnMuc2l6ZSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLypXZSBuZWVkIHRvIHNldCBpdCB0byAwIHNvIHRoYXQgYW55IHByZXZpb3VzIHBoYXNlcyB3aWxsIGV4ZWN1dGUgYWxsCi0gICAgICAgICAqIG9mIHRoZWlyIGhhbmRsZXJzLiovCi0gICAgICAgICAgICBtc2dDb250ZXh0LnNldEN1cnJlbnRQaGFzZUluZGV4KDApOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yICg7IGN1cnJlbnRIYW5kbGVySW5kZXggPiAwOyBjdXJyZW50SGFuZGxlckluZGV4LS0pIHsKLSAgICAgICAgICAgIEhhbmRsZXIgaGFuZGxlciA9IChIYW5kbGVyKSBoYW5kbGVycy5nZXQoY3VycmVudEhhbmRsZXJJbmRleCAtIDEpOwotCi0gICAgICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcobXNnQ29udGV4dC5nZXRMb2dJRFN0cmluZygpICsgIiBJbnZva2luZyBmbG93Q29tcGxldGUoKSBmb3IgSGFuZGxlciAnIiArCi0gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyLmdldE5hbWUoKSArICInIGluIFBoYXNlICciICsgcGhhc2VOYW1lICsgIiciKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaGFuZGxlci5mbG93Q29tcGxldGUobXNnQ29udGV4dCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gdGhpcy5nZXRQaGFzZU5hbWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldEhhbmRsZXJDb3VudCgpIHsKLSAgICAgICAgcmV0dXJuIGhhbmRsZXJzLnNpemUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSGFuZGxlckRlc2NyaXB0aW9uIGdldEhhbmRsZXJEZXNjKCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGFsbCB0aGUgaGFuZGxlcnMgaW4gdGhlIHBoYXNlLgotICAgICAqCi0gICAgICogQHJldHVybiBSZXR1cm5zIGFuIEFycmF5TGlzdCBvZiBIYW5kbGVycwotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PEhhbmRsZXI+IGdldEhhbmRsZXJzKCkgewotICAgICAgICByZXR1cm4gaGFuZGxlcnM7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gcGhhc2VOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBQYXJhbWV0ZXIgZ2V0UGFyYW1ldGVyKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgbmFtZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBoYXNlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHBoYXNlTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBwaGFzZU5hbWUpIHsKLSAgICAgICAgdGhpcy5waGFzZU5hbWUgPSBwaGFzZU5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkIGEgSGFuZGxlciB0byB0aGUgUGhhc2UgaW4gdGhlIHZlcnkgZmlyc3QgcG9zaXRpb24sIGFuZCBlbnN1cmUgbm8gb3RoZXIgSGFuZGxlcgotICAgICAqIHdpbGwgY29tZSBiZWZvcmUgaXQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaGFuZGxlciB0aGUgSGFuZGxlciB0byBhZGQKLSAgICAgKiBAdGhyb3dzIFBoYXNlRXhjZXB0aW9uIGlmIGFub3RoZXIgSGFuZGxlciBpcyBhbHJlYWR5IHNldCBhcyBwaGFzZUZpcnN0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UGhhc2VGaXJzdChIYW5kbGVyIGhhbmRsZXIpIHRocm93cyBQaGFzZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChwaGFzZUZpcnN0U2V0KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUGhhc2VFeGNlcHRpb24oIlBoYXNlRmlyc3QgaGFzIGJlZW4gc2V0IGFscmVhZHksIGNhbm5vdCBoYXZlIHR3byIKLSAgICAgICAgICAgICAgICAgICAgKyAiIHBoYXNlRmlyc3QgSGFuZGxlcnMgZm9yIFBoYXNlICciICsgdGhpcy5nZXRQaGFzZU5hbWUoKSArICInIik7Ci0gICAgICAgIH0KLSAgICAgICAgaGFuZGxlcnMuYWRkKDAsIGhhbmRsZXIpOwotICAgICAgICBwaGFzZUZpcnN0U2V0ID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgYSBIYW5kbGVyIHRvIHRoZSBQaGFzZSBpbiB0aGUgdmVyeSBsYXN0IHBvc2l0aW9uLCBhbmQgZW5zdXJlIG5vIG90aGVyIEhhbmRsZXIKLSAgICAgKiB3aWxsIGNvbWUgYWZ0ZXIgaXQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaGFuZGxlciB0aGUgSGFuZGxlciB0byBhZGQKLSAgICAgKiBAdGhyb3dzIFBoYXNlRXhjZXB0aW9uIGlmIGFub3RoZXIgSGFuZGxlciBpcyBhbHJlYWR5IHNldCBhcyBwaGFzZUxhc3QKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQaGFzZUxhc3QoSGFuZGxlciBoYW5kbGVyKSB0aHJvd3MgUGhhc2VFeGNlcHRpb24gewotICAgICAgICBpZiAocGhhc2VMYXN0U2V0KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUGhhc2VFeGNlcHRpb24oIlBoYXNlTGFzdCBhbHJlYWR5IGhhcyBiZWVuIHNldCwiCi0gICAgICAgICAgICAgICAgICAgICsgIiBjYW5ub3QgaGF2ZSB0d28gUGhhc2VMYXN0IEhhbmRsZXIgZm9yIHNhbWUgcGhhc2UgIgotICAgICAgICAgICAgICAgICAgICArIHRoaXMuZ2V0UGhhc2VOYW1lKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaGFuZGxlcnMuYWRkKGhhbmRsZXIpOwotICAgICAgICBwaGFzZUxhc3RTZXQgPSB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZSBhIGdpdmVuIEhhbmRsZXIgZnJvbSBhIHBoYXNlIHVzaW5nIGEgSGFuZGxlckRlc2NyaXB0aW9uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaGFuZGxlckRlc2MgdGhlIEhhbmRsZXJEZXNjcmlwdGlvbiB0byByZW1vdmUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVIYW5kbGVyKEhhbmRsZXJEZXNjcmlwdGlvbiBoYW5kbGVyRGVzYykgewotICAgICAgICBpZiAoaGFuZGxlcnMucmVtb3ZlKGhhbmRsZXJEZXNjLmdldEhhbmRsZXIoKSkpIHsKLSAgICAgICAgICAgIFBoYXNlUnVsZSBydWxlID0gaGFuZGxlckRlc2MuZ2V0UnVsZXMoKTsKLSAgICAgICAgICAgIGlmIChydWxlLmlzUGhhc2VGaXJzdCgpKSB7Ci0gICAgICAgICAgICAgICAgcGhhc2VGaXJzdFNldCA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHJ1bGUuaXNQaGFzZUxhc3QoKSkgewotICAgICAgICAgICAgICAgIHBoYXNlTGFzdFNldCA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHJ1bGUuaXNQaGFzZUZpcnN0KCkgJiYgcnVsZS5pc1BoYXNlTGFzdCgpKSB7Ci0gICAgICAgICAgICAgICAgaXNPbmVIYW5kbGVyID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBsb2cuZGVidWcoInJlbW92ZWQgaGFuZGxlciAiICsgaGFuZGxlckRlc2MuZ2V0TmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICsgIiBmcm9tIHRoZSBwaGFzZSAiICsgcGhhc2VOYW1lKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygidW5hYmxlIHRvIHJlbW92ZSBoYW5kbGVyICIgKyBoYW5kbGVyRGVzYy5nZXROYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgKyAiIGZyb20gdGhlIHBoYXNlICIgKyBwaGFzZU5hbWUpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZW5naW5lL1BpbmdhYmxlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZW5naW5lL1BpbmdhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhYmUwZGMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9QaW5nYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotCi1wdWJsaWMgaW50ZXJmYWNlIFBpbmdhYmxlIHsKLSAgICBwdWJsaWMgaW50IFBJTkdfRkFJTEQgPSAwOwotICAgIHB1YmxpYyBpbnQgUElOR19NT0RVTEVfTEVWRUwgPSAxOwotICAgIHB1YmxpYyBpbnQgUElOR19NUl9MRVZFTCA9IDI7Ci0gICAgcHVibGljIGludCBQSU5HX1NVQ0NFU1NGVUwgPSAzOwotCi0gICAgcHVibGljIFN0cmluZyBPUEVSQVRJT05fVE9fUElORyA9ICJvcGVyYXRpb25Ub1BpbmciOwotCi0gICAgaW50IHBpbmcoKSB0aHJvd3MgQXhpc0ZhdWx0OwotfQotCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZW5naW5lL1JlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWEwNWE2Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZTsKLQotLyoqCi0gKiBEaXNwYXRjaGVzIHRoZSBzZXJ2aWNlIGJhc2VkIG9uIHRoZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSB0YXJnZXQgZW5kcG9pbnQgVVJMLgotICoKLSAqIEBkZXByZWNhdGVkIHVzZSBvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIKLSAqLwotcHVibGljIGNsYXNzIFJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIgZXh0ZW5kcyBvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIgewotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9SZXF1ZXN0VVJJT3BlcmF0aW9uRGlzcGF0Y2hlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9SZXF1ZXN0VVJJT3BlcmF0aW9uRGlzcGF0Y2hlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzFkY2Y2Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvUmVxdWVzdFVSSU9wZXJhdGlvbkRpc3BhdGNoZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5lbmdpbmU7Ci0KLS8qKgotICogRGlzcGF0Y2hlcyB0aGUgb3BlcmF0aW9uIGJhc2VkIG9uIHRoZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSB0YXJnZXQgZW5kcG9pbnQgVVJMLgotICoKLSAqIEBkZXByZWNhdGVkIHVzZSBvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklPcGVyYXRpb25EaXNwYXRjaGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXF1ZXN0VVJJT3BlcmF0aW9uRGlzcGF0Y2hlciBleHRlbmRzIG9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSU9wZXJhdGlvbkRpc3BhdGNoZXIgewotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9TT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZW5naW5lL1NPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ0NmQ5NC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZW5naW5lL1NPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5lbmdpbmU7Ci0KLS8qKgotICogRGlzcGF0Y2hlcyBiYXNlZCBvbiB0aGUgU09BUEFjdGlvbi4KLSAqCi0gKiBAZGVwcmVjYXRlZCB1c2Ugb3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBTT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIGV4dGVuZHMgb3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIHsKLX0KLQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9TT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzMDdjODkuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9TT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZTsKLQotLyoqCi0gKiBEaXNwYXRjaGVzIGJhc2VkIG9uIHRoZSBuYW1lc3BhY2UgVVJJIG9mIHRoZSBmaXJzdCBjaGlsZCBvZgotICogdGhlIGJvZHkuCi0gKgotICogQGRlcHJlY2F0ZWQgdXNlIG9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBTT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIgZXh0ZW5kcyBvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciB7Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZW5naW5lL1NlcnZpY2VMaWZlQ3ljbGUuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvU2VydmljZUxpZmVDeWNsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWVmNzM1Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvU2VydmljZUxpZmVDeWNsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotCi0vKioKLSAqIFdoZW4geW91IHdhbnQgdG8gaW5pdGlhbGl6ZSBkYXRhYmFzZSBjb25uZWN0aW9ucyAsIHN0YXJ0aW5nIHRocmVhZHMgYW5kIGV0Yy4uCi0gKiBhdCB0aGUgdGltZSB5b3UgZGVwbG95ICBzZXJ2aWNlIChzaW1pbGFyIHRvIGxvYWRvbnN0YXJ0dXApLgotICogWW91IG5lZWQgdG8gaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlIGFuZCBhZGQgYWRkaXRpb25hbCAob3B0aW9uYWwpIGF0dHJpYnV0ZQotICogaW50byBzZXJ2aWNlcy54bWwgPHNlcnZpY2UgbmFtZT0iRm9vIiAgY2xhc3M9IlNlcnZpY2UgbGlmZSBjeWNsZSBpbXBsIGNsYXNzIj4KLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIFNlcnZpY2VMaWZlQ3ljbGUgewotCi0gICAgLyoqCi0gICAgICogdGhpcyB3aWxsIGJlIGNhbGxlZCBkdXJpbmcgdGhlIGRlcGxveWVtZW50IHRpbWUgb2YgdGhlIHNlcnZpY2UuIGlycmVzcGVjdGl2ZQotICAgICAqIG9mIHRoZSBzZXJ2aWNlIHNjb3BlIHRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc3RhcnRVcChDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdjdHgsIEF4aXNTZXJ2aWNlIHNlcnZpY2UpOwotCi0gICAgLyoqCi0gICAgICogdGhpcyB3aWxsIGJlIGNhbGxlZCBkdXJpbmcgdGhlIHN5c3RlbSBzaHV0IGRvd24gdGltZS4gaXJyZXNwZWN0aXZlCi0gICAgICogb2YgdGhlIHNlcnZpY2Ugc2NvcGUgdGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzaHV0RG93bihDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdjdHgsIEF4aXNTZXJ2aWNlIHNlcnZpY2UpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9oYW5kbGVycy9BYnN0cmFjdEhhbmRsZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9oYW5kbGVycy9BYnN0cmFjdEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTcwOWRkOC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvaGFuZGxlcnMvQWJzdHJhY3RIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuaGFuZGxlcnM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5IYW5kbGVyRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5QYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuSGFuZGxlcjsKLQotLyoqCi0gKiBDbGFzcyBBYnN0cmFjdEhhbmRsZXIKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SGFuZGxlciBpbXBsZW1lbnRzIEhhbmRsZXIgewotCi0gICAgLyoqCi0gICAgICogRmllbGQgaGFuZGxlckRlc2MKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgSGFuZGxlckRlc2NyaXB0aW9uIGhhbmRsZXJEZXNjOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgQWJzdHJhY3RIYW5kbGVyLgotICAgICAqLwotICAgIHB1YmxpYyBBYnN0cmFjdEhhbmRsZXIoKSB7Ci0gICAgICAgIGhhbmRsZXJEZXNjID0gbmV3IEhhbmRsZXJEZXNjcmlwdGlvbigiRGVmYXVsdEhhbmRsZXIiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTaW5jZSB0aGlzIG1pZ2h0IGNoYW5nZSB0aGUgd2hvbGUgYmVoYXZpb3Igb2YgQXhpczIgaGFuZGxlcnMsIGFuZCBzaW5jZSB0aGlzIGlzIHN0aWxsIHVuZGVyIGRpc2N1c3Npb24KLSAgICAgKiAoaHR0cDovL21hcmMudGhlYWltc2dyb3VwLmNvbS8/bD1heGlzLWRldiZtPTExNDUwNDA4NDkyOTI4NSZ3PTIpIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIGlzIGRlZmVycmVkLgotICAgICAqIE5vdGUgOiBUaGlzIG1ldGhvZCB3aWxsIG5vdCBiZSBhdXRvbWF0aWNhbGx5IGNhbGxlZCwgZnJvbSBBeGlzMiBlbmdpbmUsIHVudGlsIHRoaXMgaXMgZnVsbHkgaW1wbGVtZW50ZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY2xlYW51cCgpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgaW5pdC4KLSAgICAgKgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGluaXQoSGFuZGxlckRlc2NyaXB0aW9uIGhhbmRsZXJkZXNjKSB7Ci0gICAgICAgIHRoaXMuaGFuZGxlckRlc2MgPSBoYW5kbGVyZGVzYzsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqICAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBTdHJpbmcgbmFtZSA9IHRoaXMuZ2V0TmFtZSgpOwotCi0gICAgICAgIHJldHVybiAobmFtZSAhPSBudWxsKQotICAgICAgICAgICAgICAgID8gbmFtZQotICAgICAgICAgICAgICAgIDogbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBwaGFzZVJ1bGUgb2YgYSBoYW5kbGVyLgotICAgICAqCi0gICAgICogQHJldHVybiBSZXR1cm5zIEhhbmRsZXJEZXNjcmlwdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgSGFuZGxlckRlc2NyaXB0aW9uIGdldEhhbmRsZXJEZXNjKCkgewotICAgICAgICByZXR1cm4gaGFuZGxlckRlc2M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWV0aG9kIGdldE5hbWUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgUU5hbWUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gaGFuZGxlckRlc2MuZ2V0TmFtZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ldGhvZCBnZXRQYXJhbWV0ZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgUGFyYW1ldGVyLgotICAgICAqLwotICAgIHB1YmxpYyBQYXJhbWV0ZXIgZ2V0UGFyYW1ldGVyKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHJldHVybiBoYW5kbGVyRGVzYy5nZXRQYXJhbWV0ZXIobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZmxvd0NvbXBsZXRlKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvaTE4bi9NZXNzYWdlQnVuZGxlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvaTE4bi9NZXNzYWdlQnVuZGxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmYjQ0YjMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2kxOG4vTWVzc2FnZUJ1bmRsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5pMThuOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotLyoqCi0gKiBBY2NlcHQgcGFyYW1ldGVycyBmb3IgUHJvamVjdFJlc291cmNlQnVuZGxlLAotICogYnV0IGRlZmVyIG9iamVjdCBpbnN0YW50aWF0aW9uIChhbmQgdGhlcmVmb3JlCi0gKiByZXNvdXJjZSBidW5kbGUgbG9hZGluZykgdW50aWwgcmVxdWlyZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXNzYWdlQnVuZGxlIHsKLSAgICBwcml2YXRlIGJvb2xlYW4gbG9hZGVkID0gZmFsc2U7Ci0KLSAgICBwcml2YXRlIFByb2plY3RSZXNvdXJjZUJ1bmRsZSBfcmVzb3VyY2VCdW5kbGUgPSBudWxsOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcHJvamVjdE5hbWU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcGFja2FnZU5hbWU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcmVzb3VyY2VOYW1lOwotICAgIHByaXZhdGUgZmluYWwgTG9jYWxlIGxvY2FsZTsKLSAgICBwcml2YXRlIGZpbmFsIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyOwotICAgIHByaXZhdGUgZmluYWwgUmVzb3VyY2VCdW5kbGUgcGFyZW50OwotCi0KLSAgICBwdWJsaWMgZmluYWwgUHJvamVjdFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKCkgewotICAgICAgICBpZiAoIWxvYWRlZCkgewotICAgICAgICAgICAgX3Jlc291cmNlQnVuZGxlID0gUHJvamVjdFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShwcm9qZWN0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc0xvYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50KTsKLSAgICAgICAgICAgIGxvYWRlZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIF9yZXNvdXJjZUJ1bmRsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgRXh0ZW5kTWVzc2FnZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgTWVzc2FnZUJ1bmRsZShTdHJpbmcgcHJvamVjdE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyByZXNvdXJjZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxlIGxvY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc0xvYWRlciBjbGFzc0xvYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZUJ1bmRsZSBwYXJlbnQpCi0gICAgICAgICAgICB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5wcm9qZWN0TmFtZSA9IHByb2plY3ROYW1lOwotICAgICAgICB0aGlzLnBhY2thZ2VOYW1lID0gcGFja2FnZU5hbWU7Ci0gICAgICAgIHRoaXMucmVzb3VyY2VOYW1lID0gcmVzb3VyY2VOYW1lOwotICAgICAgICB0aGlzLmxvY2FsZSA9IGxvY2FsZTsKLSAgICAgICAgdGhpcy5jbGFzc0xvYWRlciA9IGNsYXNzTG9hZGVyOwotICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGEgc3RyaW5nIG1lc3NhZ2UgZnJvbSB0aGUgcmVzb3VyY2UgYnVuZGxlIGZvciB0aGUgZ2l2ZW4ga2V5Ci0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5IFRoZSByZXNvdXJjZSBrZXkKLSAgICAgKiBAcmV0dXJuIFRoZSBtZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBrZXkpIHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZ2V0TWVzc2FnZShrZXksIChTdHJpbmdbXSkgbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPHA+R2V0cyBhIHN0cmluZyBtZXNzYWdlIGZyb20gdGhlIHJlc291cmNlIGJ1bmRsZSBmb3IgdGhlIGdpdmVuIGtleS4gVGhlCi0gICAgICogbWVzc2FnZSBtYXkgY29udGFpbiB2YXJpYWJsZXMgdGhhdCB3aWxsIGJlIHN1YnN0aXR1dGVkIHdpdGggdGhlIGdpdmVuCi0gICAgICogYXJndW1lbnRzLiBWYXJpYWJsZXMgaGF2ZSB0aGUgZm9ybWF0OjwvcD4KLSAgICAgKiA8ZGlyPgotICAgICAqIFRoaXMgbWVzc2FnZSBoYXMgdHdvIHZhcmlhYmxlczogezB9IGFuZCB7MX0KLSAgICAgKiA8L2Rpcj4KLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXkgIFRoZSByZXNvdXJjZSBrZXkKLSAgICAgKiBAcGFyYW0gYXJnMCBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezB9Ci0gICAgICogQHJldHVybiBUaGUgbWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZShTdHJpbmcga2V5LCBTdHJpbmcgYXJnMCkgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBnZXRNZXNzYWdlKGtleSwgbmV3IFN0cmluZ1tde2FyZzB9KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8cD5HZXRzIGEgc3RyaW5nIG1lc3NhZ2UgZnJvbSB0aGUgcmVzb3VyY2UgYnVuZGxlIGZvciB0aGUgZ2l2ZW4ga2V5LiBUaGUKLSAgICAgKiBtZXNzYWdlIG1heSBjb250YWluIHZhcmlhYmxlcyB0aGF0IHdpbGwgYmUgc3Vic3RpdHV0ZWQgd2l0aCB0aGUgZ2l2ZW4KLSAgICAgKiBhcmd1bWVudHMuIFZhcmlhYmxlcyBoYXZlIHRoZSBmb3JtYXQ6PC9wPgotICAgICAqIDxkaXI+Ci0gICAgICogVGhpcyBtZXNzYWdlIGhhcyB0d28gdmFyaWFibGVzOiB7MH0gYW5kIHsxfQotICAgICAqIDwvZGlyPgotICAgICAqCi0gICAgICogQHBhcmFtIGtleSAgVGhlIHJlc291cmNlIGtleQotICAgICAqIEBwYXJhbSBhcmcwIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7MH0KLSAgICAgKiBAcGFyYW0gYXJnMSBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezF9Ci0gICAgICogQHJldHVybiBUaGUgbWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZShTdHJpbmcga2V5LCBTdHJpbmcgYXJnMCwgU3RyaW5nIGFyZzEpIHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZ2V0TWVzc2FnZShrZXksIG5ldyBTdHJpbmdbXXthcmcwLCBhcmcxfSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPHA+R2V0cyBhIHN0cmluZyBtZXNzYWdlIGZyb20gdGhlIHJlc291cmNlIGJ1bmRsZSBmb3IgdGhlIGdpdmVuIGtleS4gVGhlCi0gICAgICogbWVzc2FnZSBtYXkgY29udGFpbiB2YXJpYWJsZXMgdGhhdCB3aWxsIGJlIHN1YnN0aXR1dGVkIHdpdGggdGhlIGdpdmVuCi0gICAgICogYXJndW1lbnRzLiBWYXJpYWJsZXMgaGF2ZSB0aGUgZm9ybWF0OjwvcD4KLSAgICAgKiA8ZGlyPgotICAgICAqIFRoaXMgbWVzc2FnZSBoYXMgdHdvIHZhcmlhYmxlczogezB9IGFuZCB7MX0KLSAgICAgKiA8L2Rpcj4KLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXkgIFRoZSByZXNvdXJjZSBrZXkKLSAgICAgKiBAcGFyYW0gYXJnMCBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezB9Ci0gICAgICogQHBhcmFtIGFyZzEgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHsxfQotICAgICAqIEBwYXJhbSBhcmcyIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7Mn0KLSAgICAgKiBAcmV0dXJuIFRoZSBtZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBrZXksIFN0cmluZyBhcmcwLCBTdHJpbmcgYXJnMSwgU3RyaW5nIGFyZzIpCi0gICAgICAgICAgICB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGdldE1lc3NhZ2Uoa2V5LCBuZXcgU3RyaW5nW117YXJnMCwgYXJnMSwgYXJnMn0pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDxwPkdldHMgYSBzdHJpbmcgbWVzc2FnZSBmcm9tIHRoZSByZXNvdXJjZSBidW5kbGUgZm9yIHRoZSBnaXZlbiBrZXkuIFRoZQotICAgICAqIG1lc3NhZ2UgbWF5IGNvbnRhaW4gdmFyaWFibGVzIHRoYXQgd2lsbCBiZSBzdWJzdGl0dXRlZCB3aXRoIHRoZSBnaXZlbgotICAgICAqIGFyZ3VtZW50cy4gVmFyaWFibGVzIGhhdmUgdGhlIGZvcm1hdDo8L3A+Ci0gICAgICogPGRpcj4KLSAgICAgKiBUaGlzIG1lc3NhZ2UgaGFzIHR3byB2YXJpYWJsZXM6IHswfSBhbmQgezF9Ci0gICAgICogPC9kaXI+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5ICBUaGUgcmVzb3VyY2Uga2V5Ci0gICAgICogQHBhcmFtIGFyZzAgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHswfQotICAgICAqIEBwYXJhbSBhcmcxIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7MX0KLSAgICAgKiBAcGFyYW0gYXJnMiBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezJ9Ci0gICAgICogQHBhcmFtIGFyZzMgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHszfQotICAgICAqIEByZXR1cm4gVGhlIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIGtleSwgU3RyaW5nIGFyZzAsIFN0cmluZyBhcmcxLCBTdHJpbmcgYXJnMiwgU3RyaW5nIGFyZzMpCi0gICAgICAgICAgICB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGdldE1lc3NhZ2Uoa2V5LCBuZXcgU3RyaW5nW117YXJnMCwgYXJnMSwgYXJnMiwgYXJnM30pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDxwPkdldHMgYSBzdHJpbmcgbWVzc2FnZSBmcm9tIHRoZSByZXNvdXJjZSBidW5kbGUgZm9yIHRoZSBnaXZlbiBrZXkuIFRoZQotICAgICAqIG1lc3NhZ2UgbWF5IGNvbnRhaW4gdmFyaWFibGVzIHRoYXQgd2lsbCBiZSBzdWJzdGl0dXRlZCB3aXRoIHRoZSBnaXZlbgotICAgICAqIGFyZ3VtZW50cy4gVmFyaWFibGVzIGhhdmUgdGhlIGZvcm1hdDo8L3A+Ci0gICAgICogPGRpcj4KLSAgICAgKiBUaGlzIG1lc3NhZ2UgaGFzIHR3byB2YXJpYWJsZXM6IHswfSBhbmQgezF9Ci0gICAgICogPC9kaXI+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5ICBUaGUgcmVzb3VyY2Uga2V5Ci0gICAgICogQHBhcmFtIGFyZzAgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHswfQotICAgICAqIEBwYXJhbSBhcmcxIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7MX0KLSAgICAgKiBAcGFyYW0gYXJnMiBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezJ9Ci0gICAgICogQHBhcmFtIGFyZzMgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHszfQotICAgICAqIEBwYXJhbSBhcmc0IFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7NH0KLSAgICAgKiBAcmV0dXJuIFRoZSBtZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBrZXksIFN0cmluZyBhcmcwLCBTdHJpbmcgYXJnMSwgU3RyaW5nIGFyZzIsIFN0cmluZyBhcmczLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYXJnNCkgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBnZXRNZXNzYWdlKGtleSwgbmV3IFN0cmluZ1tde2FyZzAsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzR9KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8cD5HZXRzIGEgc3RyaW5nIG1lc3NhZ2UgZnJvbSB0aGUgcmVzb3VyY2UgYnVuZGxlIGZvciB0aGUgZ2l2ZW4ga2V5LiBUaGUKLSAgICAgKiBtZXNzYWdlIG1heSBjb250YWluIHZhcmlhYmxlcyB0aGF0IHdpbGwgYmUgc3Vic3RpdHV0ZWQgd2l0aCB0aGUgZ2l2ZW4KLSAgICAgKiBhcmd1bWVudHMuIFZhcmlhYmxlcyBoYXZlIHRoZSBmb3JtYXQ6PC9wPgotICAgICAqIDxkaXI+Ci0gICAgICogVGhpcyBtZXNzYWdlIGhhcyB0d28gdmFyaWFibGVzOiB7MH0gYW5kIHsxfQotICAgICAqIDwvZGlyPgotICAgICAqCi0gICAgICogQHBhcmFtIGtleSAgIFRoZSByZXNvdXJjZSBrZXkKLSAgICAgKiBAcGFyYW0gYXJyYXkgQW4gYXJyYXkgb2Ygb2JqZWN0cyB0byBwbGFjZSBpbiBjb3JyZXNwb25kaW5nIHZhcmlhYmxlcwotICAgICAqIEByZXR1cm4gVGhlIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIGtleSwgU3RyaW5nW10gYXJyYXkpIHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgbXNnID0gbnVsbDsKLSAgICAgICAgaWYgKGdldFJlc291cmNlQnVuZGxlKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgbXNnID0gZ2V0UmVzb3VyY2VCdW5kbGUoKS5nZXRTdHJpbmcoa2V5KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtc2cgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbigiQ2Fubm90IGZpbmQgcmVzb3VyY2Uga2V5IFwiIiArIGtleSArCi0gICAgICAgICAgICAgICAgICAgICJcIiBpbiBiYXNlIG5hbWUgIiArCi0gICAgICAgICAgICAgICAgICAgIGdldFJlc291cmNlQnVuZGxlKCkuZ2V0UmVzb3VyY2VOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFJlc291cmNlQnVuZGxlKCkuZ2V0UmVzb3VyY2VOYW1lKCksIGtleSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQobXNnLCBhcnJheSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2kxOG4vTWVzc2FnZXMuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9pMThuL01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2MTYyNjYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2kxOG4vTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuaTE4bjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLXB1YmxpYyBjbGFzcyBNZXNzYWdlcyB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3MgdGhpc0NsYXNzID0gTWVzc2FnZXMuY2xhc3M7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgcHJvamVjdE5hbWUgPSBNZXNzYWdlc0NvbnN0YW50cy5wcm9qZWN0TmFtZTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyByZXNvdXJjZU5hbWUgPSBNZXNzYWdlc0NvbnN0YW50cy5yZXNvdXJjZU5hbWU7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9jYWxlIGxvY2FsZSA9IE1lc3NhZ2VzQ29uc3RhbnRzLmxvY2FsZTsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfTUVTU0FHRV9CVU5ETEVfS0VZID0gImRlZmF1bHQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOT19NRVNTQUdFX0JVTkRMRSA9ICJNZXNzYWdlIEJ1bmRsZSBpcyBub3QgYXZhaWxhYmxlIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBwYWNrYWdlTmFtZSA9IGdldFBhY2thZ2UodGhpc0NsYXNzLmdldE5hbWUoKSk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIgPSB0aGlzQ2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFJlc291cmNlQnVuZGxlIHBhcmVudCA9Ci0gICAgICAgICAgICAoTWVzc2FnZXNDb25zdGFudHMucm9vdFBhY2thZ2VOYW1lLmVxdWFscyhwYWNrYWdlTmFtZSkpCi0gICAgICAgICAgICAgICAgICAgID8gbnVsbAotICAgICAgICAgICAgICAgICAgICA6IE1lc3NhZ2VzQ29uc3RhbnRzLnJvb3RCdW5kbGU7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBIYXNoTWFwIG1lc3NhZ2VCdW5kbGVNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgc3RhdGljIHsKLSAgICAgICAgTWVzc2FnZUJ1bmRsZSBkZWZhdWx0TWVzc2FnZUJ1bmRsZSA9Ci0gICAgICAgICAgICAgICAgbmV3IE1lc3NhZ2VCdW5kbGUocHJvamVjdE5hbWUsIHBhY2thZ2VOYW1lLCByZXNvdXJjZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxlLCBjbGFzc0xvYWRlciwgcGFyZW50KTsKLSAgICAgICAgYWRkTWVzc2FnZUJ1bmRsZShERUZBVUxUX01FU1NBR0VfQlVORExFX0tFWSwgZGVmYXVsdE1lc3NhZ2VCdW5kbGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRvIGFkZCBhIG5ldyBNZXNzYWdlIEJ1bmRsZSB0byB0aGUgTWVzc2FnZUJ1bmRsZSBsaXN0LgotICAgICAqCi0gICAgICogQHBhcmFtIG1lc3NhZ2VCdW5kbGVLZXkgVGhlIGtleSB3aGljaCB3aWxsIGJlIHVzZWQgdG8gcmVmZXIgdG8gdGhpcyBtZXNzYWdlIGJ1bmRsZSBsYXRlci4KLSAgICAgKiBAcGFyYW0gbWVzc2FnZUJ1bmRsZSAgICBUaGUgbWVzc2FnZSBidW5kbGUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZE1lc3NhZ2VCdW5kbGUoU3RyaW5nIG1lc3NhZ2VCdW5kbGVLZXksIE1lc3NhZ2VCdW5kbGUgbWVzc2FnZUJ1bmRsZSkgewotICAgICAgICBtZXNzYWdlQnVuZGxlTWFwLnB1dChtZXNzYWdlQnVuZGxlS2V5LCBtZXNzYWdlQnVuZGxlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYSBtZXNzYWdlIGZyb20gcmVzb3VyY2UucHJvcGVydGllcyBmcm9tIHRoZSBwYWNrYWdlIG9mIHRoZSBnaXZlbiBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5IFRoZSByZXNvdXJjZSBrZXkKLSAgICAgKiBAcmV0dXJuIFRoZSBmb3JtYXR0ZWQgbWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIGtleSkKLSAgICAgICAgICAgIHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gewotICAgICAgICBNZXNzYWdlQnVuZGxlIG1lc3NhZ2VCdW5kbGUgPSBnZXRNZXNzYWdlQnVuZGxlKERFRkFVTFRfTUVTU0FHRV9CVU5ETEVfS0VZKTsKLSAgICAgICAgcmV0dXJuIG1lc3NhZ2VCdW5kbGUuZ2V0TWVzc2FnZShrZXkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBhIG1lc3NhZ2UgZnJvbSByZXNvdXJjZS5wcm9wZXJ0aWVzIGZyb20gdGhlIHBhY2thZ2Ugb2YgdGhlIGdpdmVuIG9iamVjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXkgIFRoZSByZXNvdXJjZSBrZXkKLSAgICAgKiBAcGFyYW0gYXJnMCBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezB9Ci0gICAgICogQHJldHVybiBUaGUgZm9ybWF0dGVkIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBrZXksIFN0cmluZyBhcmcwKQotICAgICAgICAgICAgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIE1lc3NhZ2VCdW5kbGUgbWVzc2FnZUJ1bmRsZSA9IGdldE1lc3NhZ2VCdW5kbGUoREVGQVVMVF9NRVNTQUdFX0JVTkRMRV9LRVkpOwotICAgICAgICByZXR1cm4gbWVzc2FnZUJ1bmRsZS5nZXRNZXNzYWdlKGtleSwgYXJnMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGEgbWVzc2FnZSBmcm9tIHJlc291cmNlLnByb3BlcnRpZXMgZnJvbSB0aGUgcGFja2FnZSBvZiB0aGUgZ2l2ZW4gb2JqZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIGtleSAgVGhlIHJlc291cmNlIGtleQotICAgICAqIEBwYXJhbSBhcmcwIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7MH0KLSAgICAgKiBAcGFyYW0gYXJnMSBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezF9Ci0gICAgICogQHJldHVybiBUaGUgZm9ybWF0dGVkIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBrZXksIFN0cmluZyBhcmcwLCBTdHJpbmcgYXJnMSkKLSAgICAgICAgICAgIHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gewotICAgICAgICBNZXNzYWdlQnVuZGxlIG1lc3NhZ2VCdW5kbGUgPSBnZXRNZXNzYWdlQnVuZGxlKERFRkFVTFRfTUVTU0FHRV9CVU5ETEVfS0VZKTsKLSAgICAgICAgcmV0dXJuIG1lc3NhZ2VCdW5kbGUuZ2V0TWVzc2FnZShrZXksIGFyZzAsIGFyZzEpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBhIG1lc3NhZ2UgZnJvbSByZXNvdXJjZS5wcm9wZXJ0aWVzIGZyb20gdGhlIHBhY2thZ2Ugb2YgdGhlIGdpdmVuIG9iamVjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXkgIFRoZSByZXNvdXJjZSBrZXkKLSAgICAgKiBAcGFyYW0gYXJnMCBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezB9Ci0gICAgICogQHBhcmFtIGFyZzEgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHsxfQotICAgICAqIEBwYXJhbSBhcmcyIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7Mn0KLSAgICAgKiBAcmV0dXJuIFRoZSBmb3JtYXR0ZWQgbWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIGtleSwgU3RyaW5nIGFyZzAsIFN0cmluZyBhcmcxLCBTdHJpbmcgYXJnMikKLSAgICAgICAgICAgIHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gewotICAgICAgICBNZXNzYWdlQnVuZGxlIG1lc3NhZ2VCdW5kbGUgPSBnZXRNZXNzYWdlQnVuZGxlKERFRkFVTFRfTUVTU0FHRV9CVU5ETEVfS0VZKTsKLSAgICAgICAgcmV0dXJuIG1lc3NhZ2VCdW5kbGUuZ2V0TWVzc2FnZShrZXksIGFyZzAsIGFyZzEsIGFyZzIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBhIG1lc3NhZ2UgZnJvbSByZXNvdXJjZS5wcm9wZXJ0aWVzIGZyb20gdGhlIHBhY2thZ2Ugb2YgdGhlIGdpdmVuIG9iamVjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXkgIFRoZSByZXNvdXJjZSBrZXkKLSAgICAgKiBAcGFyYW0gYXJnMCBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezB9Ci0gICAgICogQHBhcmFtIGFyZzEgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHsxfQotICAgICAqIEBwYXJhbSBhcmcyIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7Mn0KLSAgICAgKiBAcGFyYW0gYXJnMyBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezN9Ci0gICAgICogQHJldHVybiBUaGUgZm9ybWF0dGVkIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBrZXksIFN0cmluZyBhcmcwLCBTdHJpbmcgYXJnMSwgU3RyaW5nIGFyZzIsIFN0cmluZyBhcmczKQotICAgICAgICAgICAgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIE1lc3NhZ2VCdW5kbGUgbWVzc2FnZUJ1bmRsZSA9IGdldE1lc3NhZ2VCdW5kbGUoREVGQVVMVF9NRVNTQUdFX0JVTkRMRV9LRVkpOwotICAgICAgICByZXR1cm4gbWVzc2FnZUJ1bmRsZS5nZXRNZXNzYWdlKGtleSwgYXJnMCwgYXJnMSwgYXJnMiwgYXJnMyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGEgbWVzc2FnZSBmcm9tIHJlc291cmNlLnByb3BlcnRpZXMgZnJvbSB0aGUgcGFja2FnZSBvZiB0aGUgZ2l2ZW4gb2JqZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIGtleSAgVGhlIHJlc291cmNlIGtleQotICAgICAqIEBwYXJhbSBhcmcwIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7MH0KLSAgICAgKiBAcGFyYW0gYXJnMSBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezF9Ci0gICAgICogQHBhcmFtIGFyZzIgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHsyfQotICAgICAqIEBwYXJhbSBhcmczIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7M30KLSAgICAgKiBAcGFyYW0gYXJnNCBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezR9Ci0gICAgICogQHJldHVybiBUaGUgZm9ybWF0dGVkIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBrZXksIFN0cmluZyBhcmcwLCBTdHJpbmcgYXJnMSwgU3RyaW5nIGFyZzIsIFN0cmluZyBhcmczLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGFyZzQpCi0gICAgICAgICAgICB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHsKLSAgICAgICAgTWVzc2FnZUJ1bmRsZSBtZXNzYWdlQnVuZGxlID0gZ2V0TWVzc2FnZUJ1bmRsZShERUZBVUxUX01FU1NBR0VfQlVORExFX0tFWSk7Ci0gICAgICAgIHJldHVybiBtZXNzYWdlQnVuZGxlLmdldE1lc3NhZ2Uoa2V5LCBhcmcwLCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYSBtZXNzYWdlIGZyb20gcmVzb3VyY2UucHJvcGVydGllcyBmcm9tIHRoZSBwYWNrYWdlIG9mIHRoZSBnaXZlbiBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5ICBUaGUgcmVzb3VyY2Uga2V5Ci0gICAgICogQHBhcmFtIGFyZ3MgQW4gYXJyYXkgb2Ygb2JqZWN0cyB0byBwbGFjZSBpbiBjb3JyZXNwb25kaW5nIHZhcmlhYmxlcwotICAgICAqIEByZXR1cm4gVGhlIGZvcm1hdHRlZCBtZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZShTdHJpbmcga2V5LCBTdHJpbmdbXSBhcmdzKQotICAgICAgICAgICAgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIE1lc3NhZ2VCdW5kbGUgbWVzc2FnZUJ1bmRsZSA9IGdldE1lc3NhZ2VCdW5kbGUoREVGQVVMVF9NRVNTQUdFX0JVTkRMRV9LRVkpOwotICAgICAgICByZXR1cm4gbWVzc2FnZUJ1bmRsZS5nZXRNZXNzYWdlKGtleSwgYXJncyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpIHsKLSAgICAgICAgTWVzc2FnZUJ1bmRsZSBtZXNzYWdlQnVuZGxlID0gZ2V0TWVzc2FnZUJ1bmRsZShERUZBVUxUX01FU1NBR0VfQlVORExFX0tFWSk7Ci0gICAgICAgIHJldHVybiBtZXNzYWdlQnVuZGxlLmdldFJlc291cmNlQnVuZGxlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBNZXNzYWdlQnVuZGxlIGdldE1lc3NhZ2VCdW5kbGUoKSB7Ci0gICAgICAgIHJldHVybiBnZXRNZXNzYWdlQnVuZGxlKERFRkFVTFRfTUVTU0FHRV9CVU5ETEVfS0VZKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE1lc3NhZ2VCdW5kbGUgZ2V0TWVzc2FnZUJ1bmRsZShTdHJpbmcgbWVzc2FnZUJ1bmRsZUtleSkgewotICAgICAgICByZXR1cm4gKE1lc3NhZ2VCdW5kbGUpIG1lc3NhZ2VCdW5kbGVNYXAuZ2V0KG1lc3NhZ2VCdW5kbGVLZXkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBhIG1lc3NhZ2UgZnJvbSByZXNvdXJjZS5wcm9wZXJ0aWVzIGZyb20gdGhlIHBhY2thZ2Ugb2YgdGhlIGdpdmVuIG9iamVjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXNzYWdlQnVuZGxlS2V5IFRoZSBrZXkgZm9yIGdldHRpbmcgdGhlIGNvcnJlY3QgbWVzc2FnZSBidW5kbGUuCi0gICAgICogQHBhcmFtIGtleSAgICAgICAgICAgICAgVGhlIHJlc291cmNlIGtleQotICAgICAqIEByZXR1cm4gVGhlIGZvcm1hdHRlZCBtZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZUZyb21CdW5kbGUoU3RyaW5nIG1lc3NhZ2VCdW5kbGVLZXksIFN0cmluZyBrZXkpCi0gICAgICAgICAgICB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uLCBFeGNlcHRpb24gewotICAgICAgICBNZXNzYWdlQnVuZGxlIG1lc3NhZ2VCdW5kbGUgPSBnZXRNZXNzYWdlQnVuZGxlKG1lc3NhZ2VCdW5kbGVLZXkpOwotICAgICAgICBpZiAobWVzc2FnZUJ1bmRsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKE5PX01FU1NBR0VfQlVORExFKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBtZXNzYWdlQnVuZGxlLmdldE1lc3NhZ2Uoa2V5KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYSBtZXNzYWdlIGZyb20gcmVzb3VyY2UucHJvcGVydGllcyBmcm9tIHRoZSBwYWNrYWdlIG9mIHRoZSBnaXZlbiBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVzc2FnZUJ1bmRsZUtleSBUaGUga2V5IGZvciBnZXR0aW5nIHRoZSBjb3JyZWN0IG1lc3NhZ2UgYnVuZGxlLgotICAgICAqIEBwYXJhbSBrZXkgICAgICAgICAgICAgIFRoZSByZXNvdXJjZSBrZXkKLSAgICAgKiBAcGFyYW0gYXJnMCAgICAgICAgICAgICBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezB9Ci0gICAgICogQHJldHVybiBUaGUgZm9ybWF0dGVkIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXNzYWdlRnJvbUJ1bmRsZShTdHJpbmcgbWVzc2FnZUJ1bmRsZUtleSwgU3RyaW5nIGtleSwgU3RyaW5nIGFyZzApCi0gICAgICAgICAgICB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uLCBFeGNlcHRpb24gewotICAgICAgICBNZXNzYWdlQnVuZGxlIG1lc3NhZ2VCdW5kbGUgPSBnZXRNZXNzYWdlQnVuZGxlKG1lc3NhZ2VCdW5kbGVLZXkpOwotICAgICAgICBpZiAobWVzc2FnZUJ1bmRsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKE5PX01FU1NBR0VfQlVORExFKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBtZXNzYWdlQnVuZGxlLmdldE1lc3NhZ2Uoa2V5LCBhcmcwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYSBtZXNzYWdlIGZyb20gcmVzb3VyY2UucHJvcGVydGllcyBmcm9tIHRoZSBwYWNrYWdlIG9mIHRoZSBnaXZlbiBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVzc2FnZUJ1bmRsZUtleSBUaGUga2V5IGZvciBnZXR0aW5nIHRoZSBjb3JyZWN0IG1lc3NhZ2UgYnVuZGxlLgotICAgICAqIEBwYXJhbSBrZXkgICAgICAgICAgICAgIFRoZSByZXNvdXJjZSBrZXkKLSAgICAgKiBAcGFyYW0gYXJnMCAgICAgICAgICAgICBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezB9Ci0gICAgICogQHBhcmFtIGFyZzEgICAgICAgICAgICAgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHsxfQotICAgICAqIEByZXR1cm4gVGhlIGZvcm1hdHRlZCBtZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZUZyb21CdW5kbGUoU3RyaW5nIG1lc3NhZ2VCdW5kbGVLZXksIFN0cmluZyBrZXksIFN0cmluZyBhcmcwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhcmcxKQotICAgICAgICAgICAgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiwgRXhjZXB0aW9uIHsKLSAgICAgICAgTWVzc2FnZUJ1bmRsZSBtZXNzYWdlQnVuZGxlID0gZ2V0TWVzc2FnZUJ1bmRsZShtZXNzYWdlQnVuZGxlS2V5KTsKLSAgICAgICAgaWYgKG1lc3NhZ2VCdW5kbGUgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbihOT19NRVNTQUdFX0JVTkRMRSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbWVzc2FnZUJ1bmRsZS5nZXRNZXNzYWdlKGtleSwgYXJnMCwgYXJnMSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGEgbWVzc2FnZSBmcm9tIHJlc291cmNlLnByb3BlcnRpZXMgZnJvbSB0aGUgcGFja2FnZSBvZiB0aGUgZ2l2ZW4gb2JqZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIG1lc3NhZ2VCdW5kbGVLZXkgVGhlIGtleSBmb3IgZ2V0dGluZyB0aGUgY29ycmVjdCBtZXNzYWdlIGJ1bmRsZS4KLSAgICAgKiBAcGFyYW0ga2V5ICAgICAgICAgICAgICBUaGUgcmVzb3VyY2Uga2V5Ci0gICAgICogQHBhcmFtIGFyZzAgICAgICAgICAgICAgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHswfQotICAgICAqIEBwYXJhbSBhcmcxICAgICAgICAgICAgIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7MX0KLSAgICAgKiBAcGFyYW0gYXJnMiAgICAgICAgICAgICBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezJ9Ci0gICAgICogQHJldHVybiBUaGUgZm9ybWF0dGVkIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXNzYWdlRnJvbUJ1bmRsZShTdHJpbmcgbWVzc2FnZUJ1bmRsZUtleSwgU3RyaW5nIGtleSwgU3RyaW5nIGFyZzAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGFyZzEsIFN0cmluZyBhcmcyKQotICAgICAgICAgICAgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiwgRXhjZXB0aW9uIHsKLSAgICAgICAgTWVzc2FnZUJ1bmRsZSBtZXNzYWdlQnVuZGxlID0gZ2V0TWVzc2FnZUJ1bmRsZShtZXNzYWdlQnVuZGxlS2V5KTsKLSAgICAgICAgaWYgKG1lc3NhZ2VCdW5kbGUgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbihOT19NRVNTQUdFX0JVTkRMRSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbWVzc2FnZUJ1bmRsZS5nZXRNZXNzYWdlKGtleSwgYXJnMCwgYXJnMSwgYXJnMik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGEgbWVzc2FnZSBmcm9tIHJlc291cmNlLnByb3BlcnRpZXMgZnJvbSB0aGUgcGFja2FnZSBvZiB0aGUgZ2l2ZW4gb2JqZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIG1lc3NhZ2VCdW5kbGVLZXkgVGhlIGtleSBmb3IgZ2V0dGluZyB0aGUgY29ycmVjdCBtZXNzYWdlIGJ1bmRsZS4KLSAgICAgKiBAcGFyYW0ga2V5ICAgICAgICAgICAgICBUaGUgcmVzb3VyY2Uga2V5Ci0gICAgICogQHBhcmFtIGFyZzAgICAgICAgICAgICAgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHswfQotICAgICAqIEBwYXJhbSBhcmcxICAgICAgICAgICAgIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7MX0KLSAgICAgKiBAcGFyYW0gYXJnMiAgICAgICAgICAgICBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezJ9Ci0gICAgICogQHBhcmFtIGFyZzMgICAgICAgICAgICAgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHszfQotICAgICAqIEByZXR1cm4gVGhlIGZvcm1hdHRlZCBtZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZUZyb21CdW5kbGUoU3RyaW5nIG1lc3NhZ2VCdW5kbGVLZXksIFN0cmluZyBrZXksIFN0cmluZyBhcmcwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhcmcxLCBTdHJpbmcgYXJnMiwgU3RyaW5nIGFyZzMpCi0gICAgICAgICAgICB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uLCBFeGNlcHRpb24gewotICAgICAgICBNZXNzYWdlQnVuZGxlIG1lc3NhZ2VCdW5kbGUgPSBnZXRNZXNzYWdlQnVuZGxlKG1lc3NhZ2VCdW5kbGVLZXkpOwotICAgICAgICBpZiAobWVzc2FnZUJ1bmRsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKE5PX01FU1NBR0VfQlVORExFKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBtZXNzYWdlQnVuZGxlLmdldE1lc3NhZ2Uoa2V5LCBhcmcwLCBhcmcxLCBhcmcyLCBhcmczKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYSBtZXNzYWdlIGZyb20gcmVzb3VyY2UucHJvcGVydGllcyBmcm9tIHRoZSBwYWNrYWdlIG9mIHRoZSBnaXZlbiBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVzc2FnZUJ1bmRsZUtleSBUaGUga2V5IGZvciBnZXR0aW5nIHRoZSBjb3JyZWN0IG1lc3NhZ2UgYnVuZGxlLgotICAgICAqIEBwYXJhbSBrZXkgICAgICAgICAgICAgIFRoZSByZXNvdXJjZSBrZXkKLSAgICAgKiBAcGFyYW0gYXJnMCAgICAgICAgICAgICBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezB9Ci0gICAgICogQHBhcmFtIGFyZzEgICAgICAgICAgICAgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHsxfQotICAgICAqIEBwYXJhbSBhcmcyICAgICAgICAgICAgIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7Mn0KLSAgICAgKiBAcGFyYW0gYXJnMyAgICAgICAgICAgICBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezN9Ci0gICAgICogQHBhcmFtIGFyZzQgICAgICAgICAgICAgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHs0fQotICAgICAqIEByZXR1cm4gVGhlIGZvcm1hdHRlZCBtZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZUZyb21CdW5kbGUoU3RyaW5nIG1lc3NhZ2VCdW5kbGVLZXksIFN0cmluZyBrZXksIFN0cmluZyBhcmcwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhcmcxLCBTdHJpbmcgYXJnMiwgU3RyaW5nIGFyZzMsIFN0cmluZyBhcmc0KQotICAgICAgICAgICAgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiwgRXhjZXB0aW9uIHsKLSAgICAgICAgTWVzc2FnZUJ1bmRsZSBtZXNzYWdlQnVuZGxlID0gZ2V0TWVzc2FnZUJ1bmRsZShtZXNzYWdlQnVuZGxlS2V5KTsKLSAgICAgICAgaWYgKG1lc3NhZ2VCdW5kbGUgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbihOT19NRVNTQUdFX0JVTkRMRSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbWVzc2FnZUJ1bmRsZS5nZXRNZXNzYWdlKGtleSwgYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFBhY2thZ2UoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgcmV0dXJuIG5hbWUuc3Vic3RyaW5nKDAsIG5hbWUubGFzdEluZGV4T2YoJy4nKSkuaW50ZXJuKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2kxOG4vTWVzc2FnZXNDb25zdGFudHMuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9pMThuL01lc3NhZ2VzQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljMmIwYTguLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2kxOG4vTWVzc2FnZXNDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5pMThuOwotCi1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLXB1YmxpYyBjbGFzcyBNZXNzYWdlc0NvbnN0YW50cyB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgcHJvamVjdE5hbWUgPSAib3JnLmFwYWNoZS5heGlzMiIuaW50ZXJuKCk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgcmVzb3VyY2VOYW1lID0gInJlc291cmNlIi5pbnRlcm4oKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIExvY2FsZSBsb2NhbGUgPSBudWxsOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgcm9vdFBhY2thZ2VOYW1lID0gIm9yZy5hcGFjaGUuYXhpczIuaTE4biIuaW50ZXJuKCk7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFJlc291cmNlQnVuZGxlIHJvb3RCdW5kbGUgPQotICAgICAgICAgICAgUHJvamVjdFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShwcm9qZWN0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9vdFBhY2thZ2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXNDb25zdGFudHMuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCk7Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvaTE4bi9Qcm9qZWN0UmVzb3VyY2VCdW5kbGUuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9pMThuL1Byb2plY3RSZXNvdXJjZUJ1bmRsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzNkOTVmLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9pMThuL1Byb2plY3RSZXNvdXJjZUJ1bmRsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDU3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5pMThuOwotCi0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi0vKioKLSAqIDxwPldyYXBwZXIgY2xhc3MgZm9yIHJlc291cmNlIGJ1bmRsZXMuIFByb3BlcnR5IGZpbGVzIGFyZSB1c2VkIHRvIHN0b3JlCi0gKiByZXNvdXJjZSBzdHJpbmdzLCB3aGljaCBhcmUgdGhlIG9ubHkgdHlwZXMgb2YgcmVzb3VyY2VzIGF2YWlsYWJsZS4KLSAqIFByb3BlcnR5IGZpbGVzIGNhbiBpbmhlcml0IHByb3BlcnRpZXMgZnJvbSBvdGhlciBmaWxlcyBzbyB0aGF0Ci0gKiBhIGJhc2UgcHJvcGVydHkgZmlsZSBjYW4gYmUgdXNlZCBhbmQgYSBzbWFsbCBudW1iZXIgb2YgcHJvcGVydGllcwotICogY2FuIGJlIG92ZXItcmlkZGVuIGJ5IGFub3RoZXIgcHJvcGVydHkgZmlsZS4gRm9yIGV4YW1wbGUgeW91IG1heQotICogY3JlYXRlIGFuIGVuZ2xpc2ggdmVyc2lvbiBvZiBhIHJlc291cmNlIGZpbGUgbmFtZWQgInJlc291cmNlLnByb3BlcnRpZXMiLgotICogWW91IHRoZW4gZGVjaWRlIHRoYXQgdGhlIEJyaXRpc2ggRW5nbGlzaCB2ZXJzaW9uIG9mIGFsbCBvZiB0aGUgcHJvcGVydGllcwotICogZXhjZXB0IG9uZSBhcmUgdGhlIHNhbWUsIHNvIHRoZXJlIGlzIG5vIG5lZWQgdG8gcmVkZWZpbmUgYWxsIG9mIHRoZQotICogcHJvcGVydGllcyBpbiAicmVzb3VyY2VfZW5fR0IiLCBqdXN0IHRoZSBvbmUgdGhhdCBpcyBkaWZmZXJlbnQuPC9wPgotICogPHA+VGhlIGJhc2VuYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBmaWxlIHdpdGhvdXQgdGhlICIucHJvcGVydGllcyIKLSAqIGV4dGVuc2lvbi48L3A+Ci0gKiA8cD5Qcm9wZXJ0aWVzIHdpbGwgYmUgY2FjaGVkIGZvciBwZXJmb3JtYW5jZS48cD4KLSAqIDxwPlByb3BlcnR5IHZhbHVlcyBzdG9yZWQgaW4gdGhlIHByb3BlcnR5IGZpbGVzIGNhbiBhbHNvIGNvbnRhaW4gZHluYW1pYwotICogdmFyaWFibGVzLiBBbnkgZHluYW1pYyB2YXJpYWJsZSBkZWZpbmVkIGluIFByb3BlcnRpZXNVdGlsLmdldFZhcmlhYmxlVmFsdWUoKQotICogY2FuIGJlIHVzZWQgKHN1Y2ggYXMge2RhdGV9KSwgYXMgd2VsbCBhcyBhcmd1bWVudHMgaW4gdGhlIGZvcm0gezB9LCB7MX0sIGV0Yy4KLSAqIEFyZ3VtZW50IHZhbHVlcyBhcmUgc3BlY2lmaWVkIGluIHRoZSB2YXJpb3VzIG92ZXJsb2FkZWQgZ2V0U3RyaW5nKCkgbWV0aG9kcy48L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBQcm9qZWN0UmVzb3VyY2VCdW5kbGUgZXh0ZW5kcyBSZXNvdXJjZUJ1bmRsZSB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFByb2plY3RSZXNvdXJjZUJ1bmRsZS5jbGFzcyk7Ci0KLQotICAgIC8vIFRoZSBzdGF0aWMgY2FjaGUgb2YgUmVzb3VyY2VCdW5kbGVzLgotICAgIC8vIFRoZSBrZXkgaXMgdGhlICdiYXNlbmFtZSArIGxvY2FsZSArIGRlZmF1bHQgbG9jYWxlJwotICAgIC8vIFRoZSBlbGVtZW50IGlzIGEgUmVzb3VyY2VCdW5kbGUgb2JqZWN0Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSGFzaHRhYmxlIGJ1bmRsZUNhY2hlID0gbmV3IEhhc2h0YWJsZSgpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9jYWxlIGRlZmF1bHRMb2NhbGUgPSBMb2NhbGUuZ2V0RGVmYXVsdCgpOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZTsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyByZXNvdXJjZU5hbWU7Ci0KLQotICAgIHByb3RlY3RlZCBPYmplY3QgaGFuZGxlR2V0T2JqZWN0KFN0cmluZyBrZXkpCi0gICAgICAgICAgICB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcodGhpcy50b1N0cmluZygpICsgIjo6aGFuZGxlR2V0T2JqZWN0KCIgKyBrZXkgKyAiKSIpOwotICAgICAgICB9Ci0gICAgICAgIE9iamVjdCBvYmo7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBvYmogPSByZXNvdXJjZUJ1bmRsZS5nZXRPYmplY3Qoa2V5KTsKLSAgICAgICAgfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8qIGNhdGNoIG1pc3NpbmcgcmVzb3VyY2UsIGlnbm9yZSwgJiByZXR1cm4gbnVsbAotICAgICAgICAgICAgICogaWYgdGhpcyBtZXRob2QgZG9lc24ndCByZXR1cm4gbnVsbCwgdGhlbiBwYXJlbnRzCi0gICAgICAgICAgICAgKiBhcmUgbm90IHNlYXJjaGVkCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIG9iaiA9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG9iajsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0S2V5cygpIHsKLSAgICAgICAgRW51bWVyYXRpb24gbXlLZXlzID0gcmVzb3VyY2VCdW5kbGUuZ2V0S2V5cygpOwotICAgICAgICBpZiAocGFyZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBteUtleXM7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmaW5hbCBIYXNoU2V0IHNldCA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgICAgICAgICB3aGlsZSAobXlLZXlzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICAgICAgc2V0LmFkZChteUtleXMubmV4dEVsZW1lbnQoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEVudW1lcmF0aW9uIHBLZXlzID0gcGFyZW50LmdldEtleXMoKTsKLSAgICAgICAgICAgIHdoaWxlIChwS2V5cy5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgICAgIHNldC5hZGQocEtleXMubmV4dEVsZW1lbnQoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBuZXcgRW51bWVyYXRpb24oKSB7Ci0gICAgICAgICAgICAgICAgcHJpdmF0ZSBJdGVyYXRvciBpdCA9IHNldC5pdGVyYXRvcigpOwotCi0gICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTW9yZUVsZW1lbnRzKCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXQuaGFzTmV4dCgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgbmV4dEVsZW1lbnQoKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBpdC5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0IGEgbmV3IFByb2plY3RSZXNvdXJjZUJ1bmRsZQotICAgICAqCi0gICAgICogQHBhcmFtIHByb2plY3ROYW1lICBUaGUgbmFtZSBvZiB0aGUgcHJvamVjdCB0byB3aGljaCB0aGUgY2xhc3MgYmVsb25ncy4KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgIEl0IG11c3QgYmUgYSBwcm9wZXIgcHJlZml4IG9mIHRoZSBjYWxsZXIncyBwYWNrYWdlLgotICAgICAqIEBwYXJhbSBwYWNrYWdlTmFtZSAgVGhlIHBhY2thZ2UgbmFtZSB0byBmdXJ0aGVyIGNvbnN0cnVjdAotICAgICAqICAgICAgICAgICAgICAgICAgICAgdGhlIGJhc2VuYW1lLgotICAgICAqIEBwYXJhbSByZXNvdXJjZU5hbWUgVGhlIG5hbWUgb2YgdGhlIHJlc291cmNlIHdpdGhvdXQgdGhlCi0gICAgICogICAgICAgICAgICAgICAgICAgICAiLnByb3BlcnRpZXMiIGV4dGVuc2lvbgotICAgICAqIEB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGlmIHByb2plY3ROYW1lIGlzIG5vdCBhIHByZWZpeCBvZgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjYWxsZXIncyBwYWNrYWdlIG5hbWUsIG9yIGlmIHRoZSByZXNvdXJjZSBjb3VsZCBub3QgYmUKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZC9sb2FkZWQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBQcm9qZWN0UmVzb3VyY2VCdW5kbGUgZ2V0QnVuZGxlKFN0cmluZyBwcm9qZWN0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmVzb3VyY2VOYW1lKQotICAgICAgICAgICAgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBnZXRCdW5kbGUocHJvamVjdE5hbWUsIHBhY2thZ2VOYW1lLCByZXNvdXJjZU5hbWUsIG51bGwsIG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdCBhIG5ldyBQcm9qZWN0UmVzb3VyY2VCdW5kbGUKLSAgICAgKgotICAgICAqIEBwYXJhbSBwcm9qZWN0TmFtZSAgVGhlIG5hbWUgb2YgdGhlIHByb2plY3QgdG8gd2hpY2ggdGhlIGNsYXNzIGJlbG9uZ3MuCi0gICAgICogICAgICAgICAgICAgICAgICAgICBJdCBtdXN0IGJlIGEgcHJvcGVyIHByZWZpeCBvZiB0aGUgY2FsbGVyJ3MgcGFja2FnZS4KLSAgICAgKiBAcGFyYW0gY2FsbGVyICAgICAgIFRoZSBjYWxsaW5nIGNsYXNzLgotICAgICAqIEBwYXJhbSByZXNvdXJjZU5hbWUgVGhlIG5hbWUgb2YgdGhlIHJlc291cmNlIHdpdGhvdXQgdGhlCi0gICAgICogICAgICAgICAgICAgICAgICAgICAiLnByb3BlcnRpZXMiIGV4dGVuc2lvbgotICAgICAqIEB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGlmIHByb2plY3ROYW1lIGlzIG5vdCBhIHByZWZpeCBvZgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjYWxsZXIncyBwYWNrYWdlIG5hbWUsIG9yIGlmIHRoZSByZXNvdXJjZSBjb3VsZCBub3QgYmUKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZC9sb2FkZWQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBQcm9qZWN0UmVzb3VyY2VCdW5kbGUgZ2V0QnVuZGxlKFN0cmluZyBwcm9qZWN0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MgY2FsbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmVzb3VyY2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbGUgbG9jYWxlKQotICAgICAgICAgICAgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBnZXRCdW5kbGUocHJvamVjdE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0IGEgbmV3IFByb2plY3RSZXNvdXJjZUJ1bmRsZQotICAgICAqCi0gICAgICogQHBhcmFtIHByb2plY3ROYW1lICBUaGUgbmFtZSBvZiB0aGUgcHJvamVjdCB0byB3aGljaCB0aGUgY2xhc3MgYmVsb25ncy4KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgIEl0IG11c3QgYmUgYSBwcm9wZXIgcHJlZml4IG9mIHRoZSBjYWxsZXIncyBwYWNrYWdlLgotICAgICAqIEBwYXJhbSBwYWNrYWdlTmFtZSAgVGhlIHBhY2thZ2UgbmFtZSB0byBjb25zdHJ1Y3QgYmFzZSBuYW1lLgotICAgICAqIEBwYXJhbSByZXNvdXJjZU5hbWUgVGhlIG5hbWUgb2YgdGhlIHJlc291cmNlIHdpdGhvdXQgdGhlCi0gICAgICogICAgICAgICAgICAgICAgICAgICAiLnByb3BlcnRpZXMiIGV4dGVuc2lvbgotICAgICAqIEBwYXJhbSBsb2NhbGUgICAgICAgVGhlIGxvY2FsZQotICAgICAqIEB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGlmIHByb2plY3ROYW1lIGlzIG5vdCBhIHByZWZpeCBvZgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjYWxsZXIncyBwYWNrYWdlIG5hbWUsIG9yIGlmIHRoZSByZXNvdXJjZSBjb3VsZCBub3QgYmUKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZC9sb2FkZWQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBQcm9qZWN0UmVzb3VyY2VCdW5kbGUgZ2V0QnVuZGxlKFN0cmluZyBwcm9qZWN0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmVzb3VyY2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbGUgbG9jYWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc0xvYWRlciBsb2FkZXIpCi0gICAgICAgICAgICB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGdldEJ1bmRsZShwcm9qZWN0TmFtZSwgcGFja2FnZU5hbWUsIHJlc291cmNlTmFtZSwgbG9jYWxlLCBsb2FkZXIsIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdCBhIG5ldyBQcm9qZWN0UmVzb3VyY2VCdW5kbGUKLSAgICAgKgotICAgICAqIEBwYXJhbSBwcm9qZWN0TmFtZSAgIFRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0IHRvIHdoaWNoIHRoZSBjbGFzcyBiZWxvbmdzLgotICAgICAqICAgICAgICAgICAgICAgICAgICAgIEl0IG11c3QgYmUgYSBwcm9wZXIgcHJlZml4IG9mIHRoZSBjYWxsZXIncyBwYWNrYWdlLgotICAgICAqIEBwYXJhbSBjYWxsZXIgICAgICAgIFRoZSBjYWxsaW5nIGNsYXNzLgotICAgICAqICAgICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgdXNlZCB0byBnZXQgdGhlIHBhY2thZ2UgbmFtZSB0byBmdXJ0aGVyIGNvbnN0cnVjdAotICAgICAqICAgICAgICAgICAgICAgICAgICAgIHRoZSBiYXNlbmFtZSBhcyB3ZWxsIGFzIHRvIGdldCB0aGUgcHJvcGVyIENsYXNzTG9hZGVyLgotICAgICAqIEBwYXJhbSByZXNvdXJjZU5hbWUgIFRoZSBuYW1lIG9mIHRoZSByZXNvdXJjZSB3aXRob3V0IHRoZQotICAgICAqICAgICAgICAgICAgICAgICAgICAgICIucHJvcGVydGllcyIgZXh0ZW5zaW9uCi0gICAgICogQHBhcmFtIGxvY2FsZSAgICAgICAgVGhlIGxvY2FsZQotICAgICAqIEBwYXJhbSBleHRlbmRzQnVuZGxlIElmIG5vbi1udWxsLCB0aGVuIHRoaXMgRXh0ZW5kTWVzc2FnZXMgd2lsbAotICAgICAqICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgdG8gZXh0ZW5kc0J1bmRsZS4KLSAgICAgKiBAdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBpZiBwcm9qZWN0TmFtZSBpcyBub3QgYSBwcmVmaXggb2YKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY2FsbGVyJ3MgcGFja2FnZSBuYW1lLCBvciBpZiB0aGUgcmVzb3VyY2UgY291bGQgbm90IGJlCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQvbG9hZGVkLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgUHJvamVjdFJlc291cmNlQnVuZGxlIGdldEJ1bmRsZShTdHJpbmcgcHJvamVjdE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzIGNhbGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlc291cmNlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxlIGxvY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VCdW5kbGUgZXh0ZW5kc0J1bmRsZSkKLSAgICAgICAgICAgIHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZ2V0QnVuZGxlKHByb2plY3ROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgIGdldFBhY2thZ2UoY2FsbGVyLmdldENsYXNzKCkuZ2V0TmFtZSgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxlci5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5kc0J1bmRsZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0IGEgbmV3IFByb2plY3RSZXNvdXJjZUJ1bmRsZQotICAgICAqCi0gICAgICogQHBhcmFtIHByb2plY3ROYW1lICAgVGhlIG5hbWUgb2YgdGhlIHByb2plY3QgdG8gd2hpY2ggdGhlIGNsYXNzIGJlbG9uZ3MuCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgSXQgbXVzdCBiZSBhIHByb3BlciBwcmVmaXggb2YgdGhlIGNhbGxlcidzIHBhY2thZ2UuCi0gICAgICogQHBhcmFtIHBhY2thZ2VOYW1lICAgVGhlIHBhY2thZ2UgbmFtZSB0byBmdXJ0aGVyIGNvbnN0cnVjdAotICAgICAqICAgICAgICAgICAgICAgICAgICAgIHRoZSBiYXNlbmFtZS4KLSAgICAgKiBAcGFyYW0gcmVzb3VyY2VOYW1lICBUaGUgbmFtZSBvZiB0aGUgcmVzb3VyY2Ugd2l0aG91dCB0aGUKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAiLnByb3BlcnRpZXMiIGV4dGVuc2lvbgotICAgICAqIEBwYXJhbSBsb2NhbGUgICAgICAgIFRoZSBsb2NhbGUKLSAgICAgKiBAcGFyYW0gZXh0ZW5kc0J1bmRsZSBJZiBub24tbnVsbCwgdGhlbiB0aGlzIEV4dGVuZE1lc3NhZ2VzIHdpbGwKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0IHRvIGV4dGVuZHNCdW5kbGUuCi0gICAgICogQHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gaWYgcHJvamVjdE5hbWUgaXMgbm90IGEgcHJlZml4IG9mCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGNhbGxlcidzIHBhY2thZ2UgbmFtZSwgb3IgaWYgdGhlIHJlc291cmNlIGNvdWxkIG5vdCBiZQotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kL2xvYWRlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFByb2plY3RSZXNvdXJjZUJ1bmRsZSBnZXRCdW5kbGUoU3RyaW5nIHByb2plY3ROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyByZXNvdXJjZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY2FsZSBsb2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzTG9hZGVyIGxvYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VCdW5kbGUgZXh0ZW5kc0J1bmRsZSkKLSAgICAgICAgICAgIHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gewotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiZ2V0QnVuZGxlKCIgKyBwcm9qZWN0TmFtZSArICIsIgotICAgICAgICAgICAgICAgICAgICArIHBhY2thZ2VOYW1lICsgIiwiCi0gICAgICAgICAgICAgICAgICAgICsgcmVzb3VyY2VOYW1lICsgIiwiCi0gICAgICAgICAgICAgICAgICAgICsgU3RyaW5nLnZhbHVlT2YobG9jYWxlKSArICIsLi4uKSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gbmV3IENvbnRleHQoKTsKLSAgICAgICAgY29udGV4dC5zZXRMb2NhbGUobG9jYWxlKTsKLSAgICAgICAgY29udGV4dC5zZXRMb2FkZXIobG9hZGVyKTsKLSAgICAgICAgY29udGV4dC5zZXRQcm9qZWN0TmFtZShwcm9qZWN0TmFtZSk7Ci0gICAgICAgIGNvbnRleHQuc2V0UmVzb3VyY2VOYW1lKHJlc291cmNlTmFtZSk7Ci0gICAgICAgIGNvbnRleHQuc2V0UGFyZW50QnVuZGxlKGV4dGVuZHNCdW5kbGUpOwotCi0gICAgICAgIHBhY2thZ2VOYW1lID0gY29udGV4dC52YWxpZGF0ZShwYWNrYWdlTmFtZSk7Ci0KLSAgICAgICAgUHJvamVjdFJlc291cmNlQnVuZGxlIGJ1bmRsZSA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBidW5kbGUgPSBnZXRCdW5kbGUoY29udGV4dCwgcGFja2FnZU5hbWUpOwotICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiRXhjZXB0aW9uOiAiLCBlKTsKLSAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYnVuZGxlID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24oIkNhbm5vdCBmaW5kIHJlc291cmNlICciICsKLSAgICAgICAgICAgICAgICAgICAgcGFja2FnZU5hbWUgKyAnLicgKyByZXNvdXJjZU5hbWUgKyAiJyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlTmFtZSwgIiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGJ1bmRsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBnZXQgYnVuZGxlLi4uCi0gICAgICogLSBjaGVjayBjYWNoZQotICAgICAqIC0gdHJ5IHVwIGhpZXJhcmNoeQotICAgICAqIC0gaWYgYXQgdG9wIG9mIGhpZXJhcmNoeSwgdXNlIChsaW5rIHRvKSBjb250ZXh0LmdldFBhcmVudEJ1bmRsZSgpCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgc3luY2hyb25pemVkIFByb2plY3RSZXNvdXJjZUJ1bmRsZSBnZXRCdW5kbGUoQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgcGFja2FnZU5hbWUpCi0gICAgICAgICAgICB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIGNhY2hlS2V5ID0gY29udGV4dC5nZXRDYWNoZUtleShwYWNrYWdlTmFtZSk7Ci0KLSAgICAgICAgUHJvamVjdFJlc291cmNlQnVuZGxlIHByYiA9IChQcm9qZWN0UmVzb3VyY2VCdW5kbGUpIGJ1bmRsZUNhY2hlLmdldChjYWNoZUtleSk7Ci0KLSAgICAgICAgaWYgKHByYiA9PSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9IHBhY2thZ2VOYW1lICsgJy4nICsgY29udGV4dC5nZXRSZXNvdXJjZU5hbWUoKTsKLSAgICAgICAgICAgIFJlc291cmNlQnVuZGxlIHJiID0gY29udGV4dC5sb2FkQnVuZGxlKHBhY2thZ2VOYW1lKTsKLSAgICAgICAgICAgIFJlc291cmNlQnVuZGxlIHBhcmVudCA9IGNvbnRleHQuZ2V0UGFyZW50QnVuZGxlKHBhY2thZ2VOYW1lKTsKLQotICAgICAgICAgICAgaWYgKHJiICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBwcmIgPSBuZXcgUHJvamVjdFJlc291cmNlQnVuZGxlKG5hbWUsIHJiKTsKLSAgICAgICAgICAgICAgICBwcmIuc2V0UGFyZW50KHBhcmVudCk7Ci0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ3JlYXRlZCAiICsgcHJiICsgIiwgbGlua2VkIHRvIHBhcmVudCAiICsgU3RyaW5nLnZhbHVlT2YocGFyZW50KSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAocGFyZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFByb2plY3RSZXNvdXJjZUJ1bmRsZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJiID0gKFByb2plY3RSZXNvdXJjZUJ1bmRsZSkgcGFyZW50OwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJiID0gbmV3IFByb2plY3RSZXNvdXJjZUJ1bmRsZShuYW1lLCBwYXJlbnQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJSb290IHBhY2thZ2Ugbm90IGZvdW5kLCBjcm9zcyBsaW5rIHRvICIgKyBwYXJlbnQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocHJiICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBDYWNoZSB0aGUgcmVzb3VyY2UKLSAgICAgICAgICAgICAgICBidW5kbGVDYWNoZS5wdXQoY2FjaGVLZXksIHByYik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcHJiOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRQYWNrYWdlKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHJldHVybiBuYW1lLnN1YnN0cmluZygwLCBuYW1lLmxhc3RJbmRleE9mKCcuJykpLmludGVybigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdCBhIG5ldyBQcm9qZWN0UmVzb3VyY2VCdW5kbGUKLSAgICAgKi8KLSAgICBwcml2YXRlIFByb2plY3RSZXNvdXJjZUJ1bmRsZShTdHJpbmcgbmFtZSwgUmVzb3VyY2VCdW5kbGUgYnVuZGxlKQotICAgICAgICAgICAgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMucmVzb3VyY2VCdW5kbGUgPSBidW5kbGU7Ci0gICAgICAgIHRoaXMucmVzb3VyY2VOYW1lID0gbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFJlc291cmNlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHJlc291cmNlTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDbGVhcnMgdGhlIGludGVybmFsIGNhY2hlCi0gICAgICovCi0vLyAgICBwdWJsaWMgc3RhdGljIHZvaWQgY2xlYXJDYWNoZSgpIHsKLS8vICAgICAgICBidW5kbGVDYWNoZS5jbGVhcigpOwotLy8gICAgfQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiByZXNvdXJjZU5hbWU7Ci0gICAgfQotCi0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDb250ZXh0IHsKLSAgICAgICAgcHJpdmF0ZSBMb2NhbGUgX2xvY2FsZTsKLSAgICAgICAgcHJpdmF0ZSBDbGFzc0xvYWRlciBfbG9hZGVyOwotICAgICAgICBwcml2YXRlIFN0cmluZyBfcHJvamVjdE5hbWU7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIF9yZXNvdXJjZU5hbWU7Ci0gICAgICAgIHByaXZhdGUgUmVzb3VyY2VCdW5kbGUgX3BhcmVudDsKLQotICAgICAgICB2b2lkIHNldExvY2FsZShMb2NhbGUgbCkgewotICAgICAgICAgICAgLyogMS4gRG9jcyBpbmRpY2F0ZSB0aGF0IGlmIGxvY2FsZSBpcyBub3Qgc3BlY2lmaWVkLAotICAgICAgICAgICAgICogICAgdGhlbiB0aGUgZGVmYXVsdCBsb2NhbCBpcyB1c2VkIGluIGl0J3MgcGxhY2UuCi0gICAgICAgICAgICAgKiAyLiBBIG51bGwgdmFsdWUgZm9yIGxvY2FsZSBpcyBpbnZhbGlkLgotICAgICAgICAgICAgICogCi0gICAgICAgICAgICAgKiBUaGVyZWZvcmUsIGRlZmF1bHQuLi4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgX2xvY2FsZSA9IChsID09IG51bGwpID8gZGVmYXVsdExvY2FsZSA6IGw7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHNldExvYWRlcihDbGFzc0xvYWRlciBsKSB7Ci0gICAgICAgICAgICBfbG9hZGVyID0gKGwgIT0gbnVsbCkgPyBsIDogdGhpcy5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCk7Ci0gICAgICAgICAgICAvLyBTVEFSVCBGSVg6IGh0dHA6Ly9uYWdveWEuYXBhY2hlLm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MTY4NjgKLSAgICAgICAgICAgIGlmIChfbG9hZGVyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBfbG9hZGVyID0gQ2xhc3NMb2FkZXIuZ2V0U3lzdGVtQ2xhc3NMb2FkZXIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEVORCBGSVg6IGh0dHA6Ly9uYWdveWEuYXBhY2hlLm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MTY4NjgKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgc2V0UHJvamVjdE5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgICAgIF9wcm9qZWN0TmFtZSA9IG5hbWUuaW50ZXJuKCk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHNldFJlc291cmNlTmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICAgICAgX3Jlc291cmNlTmFtZSA9IG5hbWUuaW50ZXJuKCk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHNldFBhcmVudEJ1bmRsZShSZXNvdXJjZUJ1bmRsZSBiKSB7Ci0gICAgICAgICAgICBfcGFyZW50ID0gYjsKLSAgICAgICAgfQotCi0gICAgICAgIExvY2FsZSBnZXRMb2NhbGUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gX2xvY2FsZTsKLSAgICAgICAgfQotCi0gICAgICAgIENsYXNzTG9hZGVyIGdldExvYWRlcigpIHsKLSAgICAgICAgICAgIHJldHVybiBfbG9hZGVyOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGdldFByb2plY3ROYW1lKCkgewotICAgICAgICAgICAgcmV0dXJuIF9wcm9qZWN0TmFtZTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBnZXRSZXNvdXJjZU5hbWUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gX3Jlc291cmNlTmFtZTsKLSAgICAgICAgfQotCi0gICAgICAgIFJlc291cmNlQnVuZGxlIGdldFBhcmVudEJ1bmRsZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBfcGFyZW50OwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGdldENhY2hlS2V5KFN0cmluZyBwYWNrYWdlTmFtZSkgewotICAgICAgICAgICAgU3RyaW5nIGxvYWRlck5hbWUgPSAoX2xvYWRlciA9PSBudWxsKSA/ICIiIDogKCI6IiArIF9sb2FkZXIuaGFzaENvZGUoKSk7Ci0gICAgICAgICAgICByZXR1cm4gcGFja2FnZU5hbWUgKyAiLiIgKyBfcmVzb3VyY2VOYW1lICsgIjoiICsgX2xvY2FsZSArICI6IiArIGRlZmF1bHRMb2NhbGUgKwotICAgICAgICAgICAgICAgICAgICBsb2FkZXJOYW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgUmVzb3VyY2VCdW5kbGUgbG9hZEJ1bmRsZShTdHJpbmcgcGFja2FnZU5hbWUpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShwYWNrYWdlTmFtZSArICcuJyArIF9yZXNvdXJjZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbG9jYWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2xvYWRlcik7Ci0gICAgICAgICAgICB9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIERlbGliZXJhdGVseSBzdXJwcmVzc2luZyBwcmludCBzdGFjay4uIGp1c3QgdGhlIHN0cmluZyBmb3IgaW5mby4KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoImxvYWRCdW5kbGU6IElnbm9yaW5nIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgUmVzb3VyY2VCdW5kbGUgZ2V0UGFyZW50QnVuZGxlKFN0cmluZyBwYWNrYWdlTmFtZSkgewotICAgICAgICAgICAgUmVzb3VyY2VCdW5kbGUgcDsKLSAgICAgICAgICAgIGlmICghcGFja2FnZU5hbWUuZXF1YWxzKF9wcm9qZWN0TmFtZSkpIHsKLSAgICAgICAgICAgICAgICBwID0gZ2V0QnVuZGxlKHRoaXMsIGdldFBhY2thZ2UocGFja2FnZU5hbWUpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcCA9IF9wYXJlbnQ7Ci0gICAgICAgICAgICAgICAgX3BhcmVudCA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcDsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyB2YWxpZGF0ZShTdHJpbmcgcGFja2FnZU5hbWUpCi0gICAgICAgICAgICAgICAgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBpZiAoX3Byb2plY3ROYW1lID09IG51bGwgfHwgX3Byb2plY3ROYW1lLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlByb2plY3QgbmFtZSBub3Qgc3BlY2lmaWVkIik7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbigiUHJvamVjdCBuYW1lIG5vdCBzcGVjaWZpZWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIsICIiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHBhY2thZ2VOYW1lID09IG51bGwgfHwgcGFja2FnZU5hbWUubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiUGFja2FnZSBuYW1lIG5vdCBzcGVjaWZpZWQiKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uKCJQYWNrYWdlIG5vdCBzcGVjaWZpZWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZU5hbWUsICIiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBhY2thZ2VOYW1lID0gcGFja2FnZU5hbWUuaW50ZXJuKCk7Ci0KLSAgICAgICAgICAgIC8qIEVuc3VyZSB0aGF0IHByb2plY3QgaXMgYSBwcm9wZXIgcHJlZml4IG9mIGNsYXNzLgotICAgICAgICAgICAgKiBUZXJtaW5hdGUgcHJvamVjdCBuYW1lIHdpdGggJy4nIHRvIGVuc3VyZSBwcm9wZXIgbWF0Y2guCi0gICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKCFwYWNrYWdlTmFtZS5lcXVhbHMoX3Byb2plY3ROYW1lKSAmJiAhcGFja2FnZU5hbWUuc3RhcnRzV2l0aChfcHJvamVjdE5hbWUgKyAnLicpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJQcm9qZWN0IG5vdCBhIHByZWZpeCBvZiBQYWNrYWdlIik7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbigiUHJvamVjdCAnIiArIF9wcm9qZWN0TmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiJyBtdXN0IGJlIGEgcHJlZml4IG9mIFBhY2thZ2UgJyIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgcGFja2FnZU5hbWUgKyAiJyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlTmFtZSArICcuJyArIF9yZXNvdXJjZU5hbWUsICIiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHBhY2thZ2VOYW1lOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2kxOG4vUkIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9pMThuL1JCLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmNzI4MWIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2kxOG4vUkIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczMiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuaTE4bjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci0KLS8qKgotICogQ1VSUkVOVExZIE5PVCBVU0VECi0gKiBLRUVQSU5HIEZPUiBSRUZFUkVOQ0UgIDkvMTkvMjAwMgotICogPHAvPgotICogPHA+V3JhcHBlciBjbGFzcyBmb3IgcmVzb3VyY2UgYnVuZGxlcy4gUHJvcGVydHkgZmlsZXMgYXJlIHVzZWQgdG8gc3RvcmUKLSAqIHJlc291cmNlIHN0cmluZ3MsIHdoaWNoIGFyZSB0aGUgb25seSB0eXBlcyBvZiByZXNvdXJjZXMgYXZhaWxhYmxlLgotICogUHJvcGVydHkgZmlsZXMgY2FuIGluaGVyaXQgcHJvcGVydGllcyBmcm9tIG90aGVyIGZpbGVzIHNvIHRoYXQKLSAqIGEgYmFzZSBwcm9wZXJ0eSBmaWxlIGNhbiBiZSB1c2VkIGFuZCBhIHNtYWxsIG51bWJlciBvZiBwcm9wZXJ0aWVzCi0gKiBjYW4gYmUgb3Zlci1yaWRkZW4gYnkgYW5vdGhlciBwcm9wZXJ0eSBmaWxlLiBGb3IgZXhhbXBsZSB5b3UgbWF5Ci0gKiBjcmVhdGUgYW4gZW5nbGlzaCB2ZXJzaW9uIG9mIGEgcmVzb3VyY2UgZmlsZSBuYW1lZCAicmVzb3VyY2UucHJvcGVydGllcyIuCi0gKiBZb3UgdGhlbiBkZWNpZGUgdGhhdCB0aGUgQnJpdGlzaCBFbmdsaXNoIHZlcnNpb24gb2YgYWxsIG9mIHRoZSBwcm9wZXJ0aWVzCi0gKiBleGNlcHQgb25lIGFyZSB0aGUgc2FtZSwgc28gdGhlcmUgaXMgbm8gbmVlZCB0byByZWRlZmluZSBhbGwgb2YgdGhlCi0gKiBwcm9wZXJ0aWVzIGluICJyZXNvdXJjZV9lbl9HQiIsIGp1c3QgdGhlIG9uZSB0aGF0IGlzIGRpZmZlcmVudC48L3A+Ci0gKiA8cD5UaGUgcHJvcGVydHkgZmlsZSBsb29rdXAgc2VhcmNoZXMgZm9yIGNsYXNzZXMgd2l0aCB2YXJpb3VzIHN1ZmZpeGVzCi0gKiBvbiB0aGUgYmFzaXMgaWYgdGhlIGRlc2lyZWQgbG9jYWwgYW5kIHRoZSBjdXJyZW50IGRlZmF1bHQgbG9jYWwKLSAqIChhcyByZXR1cm5lZCBieSBMb2NhbC5nZXREZWZhdWx0KCkpLiBBcyBwcm9wZXJ0eSBmaWxlcyBhcmUgZm91bmQgdGhlCi0gKiBwcm9wZXJ0eSB2YWx1ZXMgYXJlIG1lcmdlZCBzbyB0aGF0IGluaGVyaXRhbmNlIGlzIHByZXNlcnZlZC48L3A+Ci0gKiA8cD5UaGUgb3JkZXIgb2Ygc2VhcmNoaW5nIGlzOjwvcD4KLSAqIDxkaXI+Ci0gKiBiYXNlbmFtZSArICJfIiArIGxhbmdhZ2UgKyAiXyIgKyBjb3VudHJ5ICsgIl8iICsgdmFyaWFudAotICogYmFzZW5hbWUgKyAiXyIgKyBsYW5nYWdlICsgIl8iICsgY291bnRyeQotICogYmFzZW5hbWUgKyAiXyIgKyBsYW5nYWdlCi0gKiBiYXNlbmFtZSArICJfIiArIGRlZmF1bHRMYW5ndWFnZSArICJfIiArIGRlZmF1bHRDb3VudHJ5ICsgIl8iICsgZGVmYXVsdFZhcmlhbnQKLSAqIGJhc2VuYW1lICsgIl8iICsgZGVmYXVsdExhbmd1YWdlICsgIl8iICsgZGVmYXVsdENvdW50cnkKLSAqIGJhc2VuYW1lICsgIl8iICsgZGVmYXVsdExhbmd1YWdlCi0gKiBiYXNlbmFtZQotICogPC9kaXI+Ci0gKiA8cD5UaGUgYmFzZW5hbWUgaXMgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IGZpbGUgd2l0aG91dCB0aGUgIi5wcm9wZXJ0aWVzIgotICogZXh0ZW5zaW9uLjwvcD4KLSAqIDxwPlByb3BlcnRpZXMgd2lsbCBiZSBjYWNoZWQgZm9yIHBlcmZvcm1hbmNlLjxwPgotICogPHA+UHJvcGVydHkgdmFsdWVzIHN0b3JlZCBpbiB0aGUgcHJvcGVydHkgZmlsZXMgY2FuIGFsc28gY29udGFpbiBkeW5hbWljCi0gKiB2YXJpYWJsZXMuIEFueSBkeW5hbWljIHZhcmlhYmxlIGRlZmluZWQgaW4gUHJvcGVydGllc1V0aWwuZ2V0VmFyaWFibGVWYWx1ZSgpCi0gKiBjYW4gYmUgdXNlZCAoc3VjaCBhcyB7ZGF0ZX0pLCBhcyB3ZWxsIGFzIGFyZ3VtZW50cyBpbiB0aGUgZm9ybSB7MH0sIHsxfSwgZXRjLgotICogQXJndW1lbnQgdmFsdWVzIGFyZSBzcGVjaWZpZWQgaW4gdGhlIHZhcmlvdXMgb3ZlcmxvYWRlZCBnZXRTdHJpbmcoKSBtZXRob2RzLjwvcD4KLSAqLwotcHVibGljIGNsYXNzIFJCIHsKLSAgICAvLyBUaGUgc3RhdGljIGNhY2hlIG9mIHByb3BlcnRpZXMuIFRoZSBrZXkgaXMgdGhlIGJhc2VuYW1lICsgdGhlIGxvY2FsICsKLSAgICAvLyB0aGUgZGVmYXVsdCBsb2NhbCBhbmQgdGhlIGVsZW1lbnQgaXMgdGhlIFByb3BlcnRpZXMgb2JqZWN0IGNvbnRhaW5pbmcKLSAgICAvLyB0aGUgcmVzb3VyY2VzCi0gICAgc3RhdGljIEhhc2h0YWJsZSBwcm9wZXJ0eUNhY2hlID0gbmV3IEhhc2h0YWJsZSgpOwotCi0gICAgLy8gVGhlIGRlZmF1bHQgYmFzZSBuYW1lCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFTRV9OQU1FID0gInJlc291cmNlIjsKLQotICAgIC8vIFRoZSBwcm9wZXJ0eSBmaWxlIGV4dGVuc2lvbgotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0VYVCA9ICIucHJvcGVydGllcyI7Ci0KLSAgICAvLyBUaGUgbmFtZSBvZiB0aGUgY3VycmVudCBiYXNlIHByb3BlcnR5IGZpbGUgKHdpdGggZXh0ZW5zaW9uKQotICAgIHByb3RlY3RlZCBTdHJpbmcgYmFzZVByb3BlcnR5RmlsZU5hbWU7Ci0KLSAgICAvLyBUaGUgcHJvcGVydGllcyBmb3IgdGhlIGN1cnJlbnQgcmVzb3VyY2UgYnVuZGxlCi0gICAgcHJvdGVjdGVkIFByb3BlcnRpZXMgcmVzb3VyY2VQcm9wZXJ0aWVzOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0IGEgbmV3IFJCCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgZmlsZSB3aXRob3V0IHRoZSAiLnByb3BlcnRpZXMiIGV4dGVuc2lvbgotICAgICAqLwotICAgIHB1YmxpYyBSQihTdHJpbmcgbmFtZSkgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMobnVsbCwgbmFtZSwgbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0IGEgbmV3IFJCCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2FsbGVyIFRoZSBjYWxsaW5nIG9iamVjdC4gVGhpcyBpcyB1c2VkIHRvIGdldCB0aGUgcGFja2FnZSBuYW1lCi0gICAgICogICAgICAgICAgICAgICB0byBmdXJ0aGVyIGNvbnN0cnVjdCB0aGUgYmFzZW5hbWUgYXMgd2VsbCBhcyB0byBnZXQgdGhlIHByb3BlciBDbGFzc0xvYWRlcgotICAgICAqIEBwYXJhbSBuYW1lICAgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IGZpbGUgd2l0aG91dCB0aGUgIi5wcm9wZXJ0aWVzIiBleHRlbnNpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgUkIoT2JqZWN0IGNhbGxlciwgU3RyaW5nIG5hbWUpIHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gewotICAgICAgICB0aGlzKGNhbGxlciwgbmFtZSwgbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0IGEgbmV3IFJCCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2FsbGVyIFRoZSBjYWxsaW5nIG9iamVjdC4gVGhpcyBpcyB1c2VkIHRvIGdldCB0aGUgcGFja2FnZSBuYW1lCi0gICAgICogICAgICAgICAgICAgICB0byBmdXJ0aGVyIGNvbnN0cnVjdCB0aGUgYmFzZW5hbWUgYXMgd2VsbCBhcyB0byBnZXQgdGhlIHByb3BlciBDbGFzc0xvYWRlcgotICAgICAqIEBwYXJhbSBuYW1lICAgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IGZpbGUgd2l0aG91dCB0aGUgIi5wcm9wZXJ0aWVzIiBleHRlbnNpb24KLSAgICAgKiBAcGFyYW0gbG9jYWxlIFRoZSBsb2NhbGUKLSAgICAgKi8KLSAgICBwdWJsaWMgUkIoT2JqZWN0IGNhbGxlciwgU3RyaW5nIG5hbWUsIExvY2FsZSBsb2NhbGUpIHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gewotICAgICAgICBDbGFzc0xvYWRlciBjbCA9IG51bGw7Ci0KLSAgICAgICAgaWYgKGNhbGxlciAhPSBudWxsKSB7Ci0KLSAgICAgICAgICAgIENsYXNzIGM7Ci0gICAgICAgICAgICBpZiAoY2FsbGVyIGluc3RhbmNlb2YgQ2xhc3MpIHsKLSAgICAgICAgICAgICAgICBjID0gKENsYXNzKSBjYWxsZXI7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGMgPSBjYWxsZXIuZ2V0Q2xhc3MoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gR2V0IHRoZSBhcHByb3ByaWF0ZSBjbGFzcyBsb2FkZXIKLSAgICAgICAgICAgIGNsID0gYy5nZXRDbGFzc0xvYWRlcigpOwotCi0gICAgICAgICAgICBpZiAobmFtZS5pbmRleE9mKCIvIikgPT0gLTEpIHsKLQotICAgICAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgZnVsbCBiYXNlbmFtZSBvbmx5IGlmIG5vdCBnaXZlbgotICAgICAgICAgICAgICAgIFN0cmluZyBmdWxsTmFtZSA9IGMuZ2V0TmFtZSgpOwotCi0gICAgICAgICAgICAgICAgaW50IHBvcyA9IGZ1bGxOYW1lLmxhc3RJbmRleE9mKCIuIik7Ci0gICAgICAgICAgICAgICAgaWYgKHBvcyA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGZ1bGxOYW1lLnN1YnN0cmluZygwLCBwb3MgKyAxKS5yZXBsYWNlKCcuJywgJy8nKSArIG5hbWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gVHJ5IHRoZSBzaGFyZWQgZGVmYXVsdCBwcm9wZXJ0aWVzIGZpbGUuLi4KLSAgICAgICAgICAgIGlmIChuYW1lLmluZGV4T2YoIi8iKSA9PSAtMSkgewotICAgICAgICAgICAgICAgIG5hbWUgPSAib3JnL2FwYWNoZS9heGlzMi9kZWZhdWx0LXJlc291cmNlIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIExvY2FsZSBkZWZhdWx0TG9jYWxlID0gTG9jYWxlLmdldERlZmF1bHQoKTsKLQotICAgICAgICAvLyBJZiB0aGUgbG9jYWxlIGdpdmVuIGlzIHRoZSBzYW1lIGFzIHRoZSBkZWZhdWx0IGxvY2FsZSwgaWdub3JlIGl0Ci0gICAgICAgIGlmIChsb2NhbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGxvY2FsZS5lcXVhbHMoZGVmYXVsdExvY2FsZSkpIHsKLSAgICAgICAgICAgICAgICBsb2NhbGUgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTG9hZCB0aGUgcHJvcGVydGllcy4gSWYgbm8gcHJvcGVydHkgZmlsZXMgZXhpc3QgdGhlbiBhCi0gICAgICAgIC8vIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bgotICAgICAgICBsb2FkUHJvcGVydGllcyhuYW1lLCBjbCwgbG9jYWxlLCBkZWZhdWx0TG9jYWxlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGEgc3RyaW5nIG1lc3NhZ2UgZnJvbSB0aGUgcmVzb3VyY2UgYnVuZGxlIGZvciB0aGUgZ2l2ZW4ga2V5Ci0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5IFRoZSByZXNvdXJjZSBrZXkKLSAgICAgKiBAcmV0dXJuIFRoZSBtZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBnZXRTdHJpbmcoa2V5LCAoT2JqZWN0W10pIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDxwPkdldHMgYSBzdHJpbmcgbWVzc2FnZSBmcm9tIHRoZSByZXNvdXJjZSBidW5kbGUgZm9yIHRoZSBnaXZlbiBrZXkuIFRoZQotICAgICAqIG1lc3NhZ2UgbWF5IGNvbnRhaW4gdmFyaWFibGVzIHRoYXQgd2lsbCBiZSBzdWJzdGl0dXRlZCB3aXRoIHRoZSBnaXZlbgotICAgICAqIGFyZ3VtZW50cy4gVmFyaWFibGVzIGhhdmUgdGhlIGZvcm1hdDo8L3A+Ci0gICAgICogPGRpcj4KLSAgICAgKiBUaGlzIG1lc3NhZ2UgaGFzIHR3byB2YXJpYWJsZXM6IHswfSBhbmQgezF9Ci0gICAgICogPC9kaXI+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5ICBUaGUgcmVzb3VyY2Uga2V5Ci0gICAgICogQHBhcmFtIGFyZzAgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHswfQotICAgICAqIEByZXR1cm4gVGhlIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBPYmplY3QgYXJnMCkgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIE9iamVjdFtdIG8gPSBuZXcgT2JqZWN0WzFdOwotICAgICAgICBvWzBdID0gYXJnMDsKLSAgICAgICAgcmV0dXJuIGdldFN0cmluZyhrZXksIG8pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDxwPkdldHMgYSBzdHJpbmcgbWVzc2FnZSBmcm9tIHRoZSByZXNvdXJjZSBidW5kbGUgZm9yIHRoZSBnaXZlbiBrZXkuIFRoZQotICAgICAqIG1lc3NhZ2UgbWF5IGNvbnRhaW4gdmFyaWFibGVzIHRoYXQgd2lsbCBiZSBzdWJzdGl0dXRlZCB3aXRoIHRoZSBnaXZlbgotICAgICAqIGFyZ3VtZW50cy4gVmFyaWFibGVzIGhhdmUgdGhlIGZvcm1hdDo8L3A+Ci0gICAgICogPGRpcj4KLSAgICAgKiBUaGlzIG1lc3NhZ2UgaGFzIHR3byB2YXJpYWJsZXM6IHswfSBhbmQgezF9Ci0gICAgICogPC9kaXI+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5ICBUaGUgcmVzb3VyY2Uga2V5Ci0gICAgICogQHBhcmFtIGFyZzAgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHswfQotICAgICAqIEBwYXJhbSBhcmcxIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7MX0KLSAgICAgKiBAcmV0dXJuIFRoZSBtZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSwgT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHsKLSAgICAgICAgT2JqZWN0W10gbyA9IG5ldyBPYmplY3RbMl07Ci0gICAgICAgIG9bMF0gPSBhcmcwOwotICAgICAgICBvWzFdID0gYXJnMTsKLSAgICAgICAgcmV0dXJuIGdldFN0cmluZyhrZXksIG8pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDxwPkdldHMgYSBzdHJpbmcgbWVzc2FnZSBmcm9tIHRoZSByZXNvdXJjZSBidW5kbGUgZm9yIHRoZSBnaXZlbiBrZXkuIFRoZQotICAgICAqIG1lc3NhZ2UgbWF5IGNvbnRhaW4gdmFyaWFibGVzIHRoYXQgd2lsbCBiZSBzdWJzdGl0dXRlZCB3aXRoIHRoZSBnaXZlbgotICAgICAqIGFyZ3VtZW50cy4gVmFyaWFibGVzIGhhdmUgdGhlIGZvcm1hdDo8L3A+Ci0gICAgICogPGRpcj4KLSAgICAgKiBUaGlzIG1lc3NhZ2UgaGFzIHR3byB2YXJpYWJsZXM6IHswfSBhbmQgezF9Ci0gICAgICogPC9kaXI+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5ICBUaGUgcmVzb3VyY2Uga2V5Ci0gICAgICogQHBhcmFtIGFyZzAgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHswfQotICAgICAqIEBwYXJhbSBhcmcxIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7MX0KLSAgICAgKiBAcGFyYW0gYXJnMiBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezF9Ci0gICAgICogQHJldHVybiBUaGUgbWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSwgT2JqZWN0IGFyZzIpCi0gICAgICAgICAgICB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHsKLSAgICAgICAgT2JqZWN0W10gbyA9IG5ldyBPYmplY3RbM107Ci0gICAgICAgIG9bMF0gPSBhcmcwOwotICAgICAgICBvWzFdID0gYXJnMTsKLSAgICAgICAgb1syXSA9IGFyZzI7Ci0gICAgICAgIHJldHVybiBnZXRTdHJpbmcoa2V5LCBvKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8cD5HZXRzIGEgc3RyaW5nIG1lc3NhZ2UgZnJvbSB0aGUgcmVzb3VyY2UgYnVuZGxlIGZvciB0aGUgZ2l2ZW4ga2V5LiBUaGUKLSAgICAgKiBtZXNzYWdlIG1heSBjb250YWluIHZhcmlhYmxlcyB0aGF0IHdpbGwgYmUgc3Vic3RpdHV0ZWQgd2l0aCB0aGUgZ2l2ZW4KLSAgICAgKiBhcmd1bWVudHMuIFZhcmlhYmxlcyBoYXZlIHRoZSBmb3JtYXQ6PC9wPgotICAgICAqIDxkaXI+Ci0gICAgICogVGhpcyBtZXNzYWdlIGhhcyB0d28gdmFyaWFibGVzOiB7MH0gYW5kIHsxfQotICAgICAqIDwvZGlyPgotICAgICAqCi0gICAgICogQHBhcmFtIGtleSAgIFRoZSByZXNvdXJjZSBrZXkKLSAgICAgKiBAcGFyYW0gYXJyYXkgQW4gYXJyYXkgb2Ygb2JqZWN0cyB0byBwbGFjZSBpbiBjb3JyZXNwb25kaW5nIHZhcmlhYmxlcwotICAgICAqIEByZXR1cm4gVGhlIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBPYmplY3RbXSBhcnJheSkgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBtc2cgPSBudWxsOwotICAgICAgICBpZiAocmVzb3VyY2VQcm9wZXJ0aWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1zZyA9IHJlc291cmNlUHJvcGVydGllcy5nZXRQcm9wZXJ0eShrZXkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1zZyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uKCJDYW5ub3QgZmluZCByZXNvdXJjZSBrZXkgXCIiICsga2V5ICsKLSAgICAgICAgICAgICAgICAgICAgIlwiIGluIGJhc2UgbmFtZSAiICsgYmFzZVByb3BlcnR5RmlsZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VQcm9wZXJ0eUZpbGVOYW1lLCBrZXkpOwotICAgICAgICB9Ci0KLSAgICAgICAgbXNnID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQobXNnLCBhcnJheSk7Ci0gICAgICAgIHJldHVybiBtc2c7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgbG9hZFByb3BlcnRpZXMoU3RyaW5nIGJhc2VuYW1lLCBDbGFzc0xvYWRlciBsb2FkZXIsIExvY2FsZSBsb2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxlIGRlZmF1bHRMb2NhbGUpCi0gICAgICAgICAgICB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gQ2hlY2sgdGhlIGNhY2hlIGZpcnN0Ci0gICAgICAgIFN0cmluZyBsb2FkZXJOYW1lID0gIiI7Ci0gICAgICAgIGlmIChsb2FkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbG9hZGVyTmFtZSA9ICI6IiArIGxvYWRlci5oYXNoQ29kZSgpOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZyBjYWNoZUtleSA9IGJhc2VuYW1lICsgIjoiICsgbG9jYWxlICsgIjoiICsgZGVmYXVsdExvY2FsZSArIGxvYWRlck5hbWU7Ci0gICAgICAgIFByb3BlcnRpZXMgcCA9IChQcm9wZXJ0aWVzKSBwcm9wZXJ0eUNhY2hlLmdldChjYWNoZUtleSk7Ci0gICAgICAgIGJhc2VQcm9wZXJ0eUZpbGVOYW1lID0gYmFzZW5hbWUgKyBQUk9QRVJUWV9FWFQ7Ci0KLSAgICAgICAgaWYgKHAgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gVGhlIHByb3BlcnRpZXMgd2VyZSBub3QgZm91bmQgaW4gdGhlIGNhY2hlLiBTZWFyY2ggdGhlIGdpdmVuIGxvY2FsZQotICAgICAgICAgICAgLy8gZmlyc3QKLSAgICAgICAgICAgIGlmIChsb2NhbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHAgPSBsb2FkUHJvcGVydGllcyhiYXNlbmFtZSwgbG9hZGVyLCBsb2NhbGUsIHApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBTZWFyY2ggdGhlIGRlZmF1bHQgbG9jYWxlCi0gICAgICAgICAgICBpZiAoZGVmYXVsdExvY2FsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcCA9IGxvYWRQcm9wZXJ0aWVzKGJhc2VuYW1lLCBsb2FkZXIsIGRlZmF1bHRMb2NhbGUsIHApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBTZWFyY2ggZm9yIHRoZSBiYXNlbmFtZQotICAgICAgICAgICAgcCA9IG1lcmdlKHAsIGxvYWRQcm9wZXJ0aWVzKGJhc2VQcm9wZXJ0eUZpbGVOYW1lLCBsb2FkZXIpKTsKLQotICAgICAgICAgICAgaWYgKHAgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24oIkNhbm5vdCBmaW5kIHJlc291cmNlIGZvciBiYXNlIG5hbWUgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICBiYXNlUHJvcGVydHlGaWxlTmFtZSwgYmFzZVByb3BlcnR5RmlsZU5hbWUsICIiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gQ2FjaGUgdGhlIHByb3BlcnRpZXMKLSAgICAgICAgICAgIHByb3BlcnR5Q2FjaGUucHV0KGNhY2hlS2V5LCBwKTsKLQotICAgICAgICB9Ci0KLSAgICAgICAgcmVzb3VyY2VQcm9wZXJ0aWVzID0gcDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgUHJvcGVydGllcyBsb2FkUHJvcGVydGllcyhTdHJpbmcgYmFzZW5hbWUsIENsYXNzTG9hZGVyIGxvYWRlciwgTG9jYWxlIGxvY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0aWVzIHByb3BzKSB7Ci0KLSAgICAgICAgU3RyaW5nIGxhbmd1YWdlID0gbG9jYWxlLmdldExhbmd1YWdlKCk7Ci0gICAgICAgIFN0cmluZyBjb3VudHJ5ID0gbG9jYWxlLmdldENvdW50cnkoKTsKLSAgICAgICAgU3RyaW5nIHZhcmlhbnQgPSBsb2NhbGUuZ2V0VmFyaWFudCgpOwotICAgICAgICBpZiAodmFyaWFudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAodmFyaWFudC50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgIHZhcmlhbnQgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGxhbmd1YWdlICE9IG51bGwpIHsKLQotICAgICAgICAgICAgaWYgKGNvdW50cnkgIT0gbnVsbCkgewotCi0gICAgICAgICAgICAgICAgaWYgKHZhcmlhbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcm9wcyA9IG1lcmdlKHByb3BzLCBsb2FkUHJvcGVydGllcygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlbmFtZSArICJfIiArIGxhbmd1YWdlICsgIl8iICsgY291bnRyeSArICJfIiArIHZhcmlhbnQgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPUEVSVFlfRVhULCBsb2FkZXIpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcHJvcHMgPSBtZXJnZShwcm9wcywgbG9hZFByb3BlcnRpZXMoYmFzZW5hbWUgKyAiXyIgKyBsYW5ndWFnZSArICJfIiArIGNvdW50cnkgKwotICAgICAgICAgICAgICAgICAgICAgICAgUFJPUEVSVFlfRVhULCBsb2FkZXIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHByb3BzID0gbWVyZ2UocHJvcHMsIGxvYWRQcm9wZXJ0aWVzKGJhc2VuYW1lICsgIl8iICsgbGFuZ3VhZ2UgKyBQUk9QRVJUWV9FWFQsIGxvYWRlcikpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwcm9wczsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgUHJvcGVydGllcyBsb2FkUHJvcGVydGllcyhTdHJpbmcgcmVzbmFtZSwgQ2xhc3NMb2FkZXIgbG9hZGVyKSB7Ci0gICAgICAgIFByb3BlcnRpZXMgcHJvcHMgPSBudWxsOwotCi0gICAgICAgIC8vIEF0dGVtcHQgdG8gb3BlbiBhbmQgbG9hZCB0aGUgcHJvcGVydGllcwotICAgICAgICBJbnB1dFN0cmVhbSBpbiA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAobG9hZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpbiA9IGxvYWRlci5nZXRSZXNvdXJjZUFzU3RyZWFtKHJlc25hbWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBFaXRoZXIgd2UncmUgdXNpbmcgdGhlIHN5c3RlbSBjbGFzcyBsb2FkZXIgb3Igd2UgZGlkbid0IGZpbmQgdGhlCi0gICAgICAgICAgICAvLyByZXNvdXJjZSB1c2luZyB0aGUgZ2l2ZW4gY2xhc3MgbG9hZGVyCi0gICAgICAgICAgICBpZiAoaW4gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGluID0gQ2xhc3NMb2FkZXIuZ2V0U3lzdGVtUmVzb3VyY2VBc1N0cmVhbShyZXNuYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChpbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHByb3BzLmxvYWQoaW4pOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIE9uIGVycm9yLCBjbGVhciB0aGUgcHJvcHMKLSAgICAgICAgICAgICAgICAgICAgcHJvcHMgPSBudWxsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChpbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgaW4uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlIGVycm9yIG9uIGNsb3NlCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwcm9wczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXJnZSB0d28gUHJvcGVydGllcyBvYmplY3RzCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFByb3BlcnRpZXMgbWVyZ2UoUHJvcGVydGllcyBwMSwgUHJvcGVydGllcyBwMikgewotICAgICAgICBpZiAoKHAxID09IG51bGwpICYmCi0gICAgICAgICAgICAgICAgKHAyID09IG51bGwpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfSBlbHNlIGlmIChwMSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gcDI7Ci0gICAgICAgIH0gZWxzZSBpZiAocDIgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHAxOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTm93IG1lcmdlLiBwMSB0YWtlcyBwcmVjZWRlbmNlCi0gICAgICAgIEVudW1lcmF0aW9uIGVudW1lcmF0aW9uID0gcDIua2V5cygpOwotICAgICAgICB3aGlsZSAoZW51bWVyYXRpb24uaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgIFN0cmluZyBrZXkgPSAoU3RyaW5nKSBlbnVtZXJhdGlvbi5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgaWYgKHAxLmdldFByb3BlcnR5KGtleSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHAxLnB1dChrZXksIHAyLmdldFByb3BlcnR5KGtleSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHAxOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgdW5kZXJseWluZyBwcm9wZXJ0aWVzCi0gICAgICovCi0gICAgcHVibGljIFByb3BlcnRpZXMgZ2V0UHJvcGVydGllcygpIHsKLSAgICAgICAgcmV0dXJuIHJlc291cmNlUHJvcGVydGllczsKLSAgICB9Ci0KLSAgICAvLyBTVEFUSUMgQUNDRVNTT1JTCi0KLSAgICAvKioKLSAgICAgKiBHZXQgYSBtZXNzYWdlIGZyb20gcmVzb3VyY2UucHJvcGVydGllcyBmcm9tIHRoZSBwYWNrYWdlIG9mIHRoZSBnaXZlbiBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2FsbGVyIFRoZSBjYWxsaW5nIG9iamVjdCwgdXNlZCB0byBnZXQgdGhlIHBhY2thZ2UgbmFtZSBhbmQgY2xhc3MgbG9hZGVyCi0gICAgICogQHBhcmFtIGtleSAgICBUaGUgcmVzb3VyY2Uga2V5Ci0gICAgICogQHJldHVybiBUaGUgZm9ybWF0dGVkIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoT2JqZWN0IGNhbGxlciwgU3RyaW5nIGtleSkKLSAgICAgICAgICAgIHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZ2V0TWVzc2FnZShjYWxsZXIsIEJBU0VfTkFNRSwgbnVsbCwga2V5LCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYSBtZXNzYWdlIGZyb20gcmVzb3VyY2UucHJvcGVydGllcyBmcm9tIHRoZSBwYWNrYWdlIG9mIHRoZSBnaXZlbiBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2FsbGVyIFRoZSBjYWxsaW5nIG9iamVjdCwgdXNlZCB0byBnZXQgdGhlIHBhY2thZ2UgbmFtZSBhbmQgY2xhc3MgbG9hZGVyCi0gICAgICogQHBhcmFtIGtleSAgICBUaGUgcmVzb3VyY2Uga2V5Ci0gICAgICogQHBhcmFtIGFyZzAgICBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezB9Ci0gICAgICogQHJldHVybiBUaGUgZm9ybWF0dGVkIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoT2JqZWN0IGNhbGxlciwgU3RyaW5nIGtleSwgT2JqZWN0IGFyZzApCi0gICAgICAgICAgICB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHsKLSAgICAgICAgT2JqZWN0W10gbyA9IG5ldyBPYmplY3RbMV07Ci0gICAgICAgIG9bMF0gPSBhcmcwOwotICAgICAgICByZXR1cm4gZ2V0TWVzc2FnZShjYWxsZXIsIEJBU0VfTkFNRSwgbnVsbCwga2V5LCBvKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYSBtZXNzYWdlIGZyb20gcmVzb3VyY2UucHJvcGVydGllcyBmcm9tIHRoZSBwYWNrYWdlIG9mIHRoZSBnaXZlbiBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2FsbGVyIFRoZSBjYWxsaW5nIG9iamVjdCwgdXNlZCB0byBnZXQgdGhlIHBhY2thZ2UgbmFtZSBhbmQgY2xhc3MgbG9hZGVyCi0gICAgICogQHBhcmFtIGtleSAgICBUaGUgcmVzb3VyY2Uga2V5Ci0gICAgICogQHBhcmFtIGFyZzAgICBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezB9Ci0gICAgICogQHBhcmFtIGFyZzEgICBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezF9Ci0gICAgICogQHJldHVybiBUaGUgZm9ybWF0dGVkIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoT2JqZWN0IGNhbGxlciwgU3RyaW5nIGtleSwgT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKQotICAgICAgICAgICAgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIE9iamVjdFtdIG8gPSBuZXcgT2JqZWN0WzJdOwotICAgICAgICBvWzBdID0gYXJnMDsKLSAgICAgICAgb1sxXSA9IGFyZzE7Ci0gICAgICAgIHJldHVybiBnZXRNZXNzYWdlKGNhbGxlciwgQkFTRV9OQU1FLCBudWxsLCBrZXksIG8pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBhIG1lc3NhZ2UgZnJvbSByZXNvdXJjZS5wcm9wZXJ0aWVzIGZyb20gdGhlIHBhY2thZ2Ugb2YgdGhlIGdpdmVuIG9iamVjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjYWxsZXIgVGhlIGNhbGxpbmcgb2JqZWN0LCB1c2VkIHRvIGdldCB0aGUgcGFja2FnZSBuYW1lIGFuZCBjbGFzcyBsb2FkZXIKLSAgICAgKiBAcGFyYW0ga2V5ICAgIFRoZSByZXNvdXJjZSBrZXkKLSAgICAgKiBAcGFyYW0gYXJnMCAgIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7MH0KLSAgICAgKiBAcGFyYW0gYXJnMSAgIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7MX0KLSAgICAgKiBAcGFyYW0gYXJnMiAgIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7Mn0KLSAgICAgKiBAcmV0dXJuIFRoZSBmb3JtYXR0ZWQgbWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhPYmplY3QgY2FsbGVyLCBTdHJpbmcga2V5LCBPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEsIE9iamVjdCBhcmcyKQotICAgICAgICAgICAgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIE9iamVjdFtdIG8gPSBuZXcgT2JqZWN0WzNdOwotICAgICAgICBvWzBdID0gYXJnMDsKLSAgICAgICAgb1sxXSA9IGFyZzE7Ci0gICAgICAgIG9bMl0gPSBhcmcyOwotICAgICAgICByZXR1cm4gZ2V0TWVzc2FnZShjYWxsZXIsIEJBU0VfTkFNRSwgbnVsbCwga2V5LCBvKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYSBtZXNzYWdlIGZyb20gcmVzb3VyY2UucHJvcGVydGllcyBmcm9tIHRoZSBwYWNrYWdlIG9mIHRoZSBnaXZlbiBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2FsbGVyIFRoZSBjYWxsaW5nIG9iamVjdCwgdXNlZCB0byBnZXQgdGhlIHBhY2thZ2UgbmFtZSBhbmQgY2xhc3MgbG9hZGVyCi0gICAgICogQHBhcmFtIGtleSAgICBUaGUgcmVzb3VyY2Uga2V5Ci0gICAgICogQHBhcmFtIGFyZzAgICBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezB9Ci0gICAgICogQHBhcmFtIGFyZzEgICBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezF9Ci0gICAgICogQHBhcmFtIGFyZzIgICBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezJ9Ci0gICAgICogQHBhcmFtIGFyZzMgICBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezN9Ci0gICAgICogQHJldHVybiBUaGUgZm9ybWF0dGVkIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoT2JqZWN0IGNhbGxlciwgU3RyaW5nIGtleSwgT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxLCBPYmplY3QgYXJnMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGFyZzMpCi0gICAgICAgICAgICB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHsKLSAgICAgICAgT2JqZWN0W10gbyA9IG5ldyBPYmplY3RbNF07Ci0gICAgICAgIG9bMF0gPSBhcmcwOwotICAgICAgICBvWzFdID0gYXJnMTsKLSAgICAgICAgb1syXSA9IGFyZzI7Ci0gICAgICAgIG9bM10gPSBhcmczOwotICAgICAgICByZXR1cm4gZ2V0TWVzc2FnZShjYWxsZXIsIEJBU0VfTkFNRSwgbnVsbCwga2V5LCBvKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIEdldCBhIG1lc3NhZ2UgZnJvbSByZXNvdXJjZS5wcm9wZXJ0aWVzIGZyb20gdGhlIHBhY2thZ2Ugb2YgdGhlIGdpdmVuIG9iamVjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjYWxsZXIgVGhlIGNhbGxpbmcgb2JqZWN0LCB1c2VkIHRvIGdldCB0aGUgcGFja2FnZSBuYW1lIGFuZCBjbGFzcyBsb2FkZXIKLSAgICAgKiBAcGFyYW0ga2V5ICAgIFRoZSByZXNvdXJjZSBrZXkKLSAgICAgKiBAcGFyYW0gYXJnMCAgIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7MH0KLSAgICAgKiBAcGFyYW0gYXJnMSAgIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7MX0KLSAgICAgKiBAcGFyYW0gYXJnMiAgIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7Mn0KLSAgICAgKiBAcGFyYW0gYXJnMyAgIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7M30KLSAgICAgKiBAcGFyYW0gYXJnNCAgIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7NH0KLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGZvcm1hdHRlZCBtZXNzYWdlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhPYmplY3QgY2FsbGVyLCBTdHJpbmcga2V5LCBPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEsIE9iamVjdCBhcmcyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgYXJnMywgT2JqZWN0IGFyZzQpCi0gICAgICAgICAgICB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHsKLSAgICAgICAgT2JqZWN0W10gbyA9IG5ldyBPYmplY3RbNV07Ci0gICAgICAgIG9bMF0gPSBhcmcwOwotICAgICAgICBvWzFdID0gYXJnMTsKLSAgICAgICAgb1syXSA9IGFyZzI7Ci0gICAgICAgIG9bM10gPSBhcmczOwotICAgICAgICBvWzRdID0gYXJnNDsKLSAgICAgICAgcmV0dXJuIGdldE1lc3NhZ2UoY2FsbGVyLCBCQVNFX05BTUUsIG51bGwsIGtleSwgbyk7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBHZXQgYSBtZXNzYWdlIGZyb20gcmVzb3VyY2UucHJvcGVydGllcyBmcm9tIHRoZSBwYWNrYWdlIG9mIHRoZSBnaXZlbiBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2FsbGVyIFRoZSBjYWxsaW5nIG9iamVjdCwgdXNlZCB0byBnZXQgdGhlIHBhY2thZ2UgbmFtZSBhbmQgY2xhc3MgbG9hZGVyCi0gICAgICogQHBhcmFtIGtleSAgICBUaGUgcmVzb3VyY2Uga2V5Ci0gICAgICogQHBhcmFtIGFyZ3MgICBBbiBhcnJheSBvZiBvYmplY3RzIHRvIHBsYWNlIGluIGNvcnJlc3BvbmRpbmcgdmFyaWFibGVzCi0gICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBmb3JtYXR0ZWQgbWVzc2FnZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoT2JqZWN0IGNhbGxlciwgU3RyaW5nIGtleSwgT2JqZWN0W10gYXJncykKLSAgICAgICAgICAgIHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZ2V0TWVzc2FnZShjYWxsZXIsIEJBU0VfTkFNRSwgbnVsbCwga2V5LCBhcmdzKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIEdldCBhIG1lc3NhZ2UgZnJvbSByZXNvdXJjZS5wcm9wZXJ0aWVzIGZyb20gdGhlIHBhY2thZ2Ugb2YgdGhlIGdpdmVuIG9iamVjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjYWxsZXIgVGhlIGNhbGxpbmcgb2JqZWN0LCB1c2VkIHRvIGdldCB0aGUgcGFja2FnZSBuYW1lIGFuZCBjbGFzcyBsb2FkZXIKLSAgICAgKiBAcGFyYW0gbG9jYWxlIFRoZSBsb2NhbGUKLSAgICAgKiBAcGFyYW0ga2V5ICAgIFRoZSByZXNvdXJjZSBrZXkKLSAgICAgKiBAcmV0dXJuIFRoZSBmb3JtYXR0ZWQgbWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhPYmplY3QgY2FsbGVyLCBMb2NhbGUgbG9jYWxlLCBTdHJpbmcga2V5KQotICAgICAgICAgICAgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBnZXRNZXNzYWdlKGNhbGxlciwgQkFTRV9OQU1FLCBsb2NhbGUsIGtleSwgbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGEgbWVzc2FnZSBmcm9tIHJlc291cmNlLnByb3BlcnRpZXMgZnJvbSB0aGUgcGFja2FnZSBvZiB0aGUgZ2l2ZW4gb2JqZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIGNhbGxlciBUaGUgY2FsbGluZyBvYmplY3QsIHVzZWQgdG8gZ2V0IHRoZSBwYWNrYWdlIG5hbWUgYW5kIGNsYXNzIGxvYWRlcgotICAgICAqIEBwYXJhbSBsb2NhbGUgVGhlIGxvY2FsZQotICAgICAqIEBwYXJhbSBrZXkgICAgVGhlIHJlc291cmNlIGtleQotICAgICAqIEBwYXJhbSBhcmcwICAgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHswfQotICAgICAqIEByZXR1cm4gVGhlIGZvcm1hdHRlZCBtZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKE9iamVjdCBjYWxsZXIsIExvY2FsZSBsb2NhbGUsIFN0cmluZyBrZXksIE9iamVjdCBhcmcwKQotICAgICAgICAgICAgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIE9iamVjdFtdIG8gPSBuZXcgT2JqZWN0WzFdOwotICAgICAgICBvWzBdID0gYXJnMDsKLSAgICAgICAgcmV0dXJuIGdldE1lc3NhZ2UoY2FsbGVyLCBCQVNFX05BTUUsIGxvY2FsZSwga2V5LCBvKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYSBtZXNzYWdlIGZyb20gcmVzb3VyY2UucHJvcGVydGllcyBmcm9tIHRoZSBwYWNrYWdlIG9mIHRoZSBnaXZlbiBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2FsbGVyIFRoZSBjYWxsaW5nIG9iamVjdCwgdXNlZCB0byBnZXQgdGhlIHBhY2thZ2UgbmFtZSBhbmQgY2xhc3MgbG9hZGVyCi0gICAgICogQHBhcmFtIGxvY2FsZSBUaGUgbG9jYWxlCi0gICAgICogQHBhcmFtIGtleSAgICBUaGUgcmVzb3VyY2Uga2V5Ci0gICAgICogQHBhcmFtIGFyZzAgICBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezB9Ci0gICAgICogQHBhcmFtIGFyZzEgICBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezF9Ci0gICAgICogQHJldHVybiBUaGUgZm9ybWF0dGVkIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoT2JqZWN0IGNhbGxlciwgTG9jYWxlIGxvY2FsZSwgU3RyaW5nIGtleSwgT2JqZWN0IGFyZzAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBhcmcxKQotICAgICAgICAgICAgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIE9iamVjdFtdIG8gPSBuZXcgT2JqZWN0WzJdOwotICAgICAgICBvWzBdID0gYXJnMDsKLSAgICAgICAgb1sxXSA9IGFyZzE7Ci0gICAgICAgIHJldHVybiBnZXRNZXNzYWdlKGNhbGxlciwgQkFTRV9OQU1FLCBsb2NhbGUsIGtleSwgbyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGEgbWVzc2FnZSBmcm9tIHJlc291cmNlLnByb3BlcnRpZXMgZnJvbSB0aGUgcGFja2FnZSBvZiB0aGUgZ2l2ZW4gb2JqZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIGNhbGxlciBUaGUgY2FsbGluZyBvYmplY3QsIHVzZWQgdG8gZ2V0IHRoZSBwYWNrYWdlIG5hbWUgYW5kIGNsYXNzIGxvYWRlcgotICAgICAqIEBwYXJhbSBsb2NhbGUgVGhlIGxvY2FsZQotICAgICAqIEBwYXJhbSBrZXkgICAgVGhlIHJlc291cmNlIGtleQotICAgICAqIEBwYXJhbSBhcmcwICAgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHswfQotICAgICAqIEBwYXJhbSBhcmcxICAgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHsxfQotICAgICAqIEBwYXJhbSBhcmcyICAgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHsyfQotICAgICAqIEByZXR1cm4gVGhlIGZvcm1hdHRlZCBtZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKE9iamVjdCBjYWxsZXIsIExvY2FsZSBsb2NhbGUsIFN0cmluZyBrZXksIE9iamVjdCBhcmcwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgYXJnMSwgT2JqZWN0IGFyZzIpCi0gICAgICAgICAgICB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHsKLSAgICAgICAgT2JqZWN0W10gbyA9IG5ldyBPYmplY3RbM107Ci0gICAgICAgIG9bMF0gPSBhcmcwOwotICAgICAgICBvWzFdID0gYXJnMTsKLSAgICAgICAgb1syXSA9IGFyZzI7Ci0gICAgICAgIHJldHVybiBnZXRNZXNzYWdlKGNhbGxlciwgQkFTRV9OQU1FLCBsb2NhbGUsIGtleSwgbyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGEgbWVzc2FnZSBmcm9tIHJlc291cmNlLnByb3BlcnRpZXMgZnJvbSB0aGUgcGFja2FnZSBvZiB0aGUgZ2l2ZW4gb2JqZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIGNhbGxlciBUaGUgY2FsbGluZyBvYmplY3QsIHVzZWQgdG8gZ2V0IHRoZSBwYWNrYWdlIG5hbWUgYW5kIGNsYXNzIGxvYWRlcgotICAgICAqIEBwYXJhbSBsb2NhbGUgVGhlIGxvY2FsZQotICAgICAqIEBwYXJhbSBrZXkgICAgVGhlIHJlc291cmNlIGtleQotICAgICAqIEBwYXJhbSBhcmcwICAgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHswfQotICAgICAqIEBwYXJhbSBhcmcxICAgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHsxfQotICAgICAqIEBwYXJhbSBhcmcyICAgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHsyfQotICAgICAqIEBwYXJhbSBhcmczICAgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHszfQotICAgICAqIEByZXR1cm4gVGhlIGZvcm1hdHRlZCBtZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKE9iamVjdCBjYWxsZXIsIExvY2FsZSBsb2NhbGUsIFN0cmluZyBrZXksIE9iamVjdCBhcmcwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgYXJnMSwgT2JqZWN0IGFyZzIsIE9iamVjdCBhcmczKQotICAgICAgICAgICAgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIE9iamVjdFtdIG8gPSBuZXcgT2JqZWN0WzRdOwotICAgICAgICBvWzBdID0gYXJnMDsKLSAgICAgICAgb1sxXSA9IGFyZzE7Ci0gICAgICAgIG9bMl0gPSBhcmcyOwotICAgICAgICBvWzNdID0gYXJnMzsKLSAgICAgICAgcmV0dXJuIGdldE1lc3NhZ2UoY2FsbGVyLCBCQVNFX05BTUUsIGxvY2FsZSwga2V5LCBvKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYSBtZXNzYWdlIGZyb20gcmVzb3VyY2UucHJvcGVydGllcyBmcm9tIHRoZSBwYWNrYWdlIG9mIHRoZSBnaXZlbiBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2FsbGVyIFRoZSBjYWxsaW5nIG9iamVjdCwgdXNlZCB0byBnZXQgdGhlIHBhY2thZ2UgbmFtZSBhbmQgY2xhc3MgbG9hZGVyCi0gICAgICogQHBhcmFtIGxvY2FsZSBUaGUgbG9jYWxlCi0gICAgICogQHBhcmFtIGtleSAgICBUaGUgcmVzb3VyY2Uga2V5Ci0gICAgICogQHBhcmFtIGFyZzAgICBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezB9Ci0gICAgICogQHBhcmFtIGFyZzEgICBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezF9Ci0gICAgICogQHBhcmFtIGFyZzIgICBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezJ9Ci0gICAgICogQHBhcmFtIGFyZzMgICBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezN9Ci0gICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBmb3JtYXR0ZWQgbWVzc2FnZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoT2JqZWN0IGNhbGxlciwgTG9jYWxlIGxvY2FsZSwgU3RyaW5nIGtleSwgT2JqZWN0IGFyZzAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBhcmcxLCBPYmplY3QgYXJnMiwgT2JqZWN0IGFyZzMsIE9iamVjdCBhcmc0KQotICAgICAgICAgICAgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIE9iamVjdFtdIG8gPSBuZXcgT2JqZWN0WzVdOwotICAgICAgICBvWzBdID0gYXJnMDsKLSAgICAgICAgb1sxXSA9IGFyZzE7Ci0gICAgICAgIG9bMl0gPSBhcmcyOwotICAgICAgICBvWzNdID0gYXJnMzsKLSAgICAgICAgb1s0XSA9IGFyZzQ7Ci0gICAgICAgIHJldHVybiBnZXRNZXNzYWdlKGNhbGxlciwgQkFTRV9OQU1FLCBsb2NhbGUsIGtleSwgbyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGEgbWVzc2FnZSBmcm9tIHJlc291cmNlLnByb3BlcnRpZXMgZnJvbSB0aGUgcGFja2FnZSBvZiB0aGUgZ2l2ZW4gb2JqZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIGNhbGxlciBUaGUgY2FsbGluZyBvYmplY3QsIHVzZWQgdG8gZ2V0IHRoZSBwYWNrYWdlIG5hbWUgYW5kIGNsYXNzIGxvYWRlcgotICAgICAqIEBwYXJhbSBsb2NhbGUgVGhlIGxvY2FsZQotICAgICAqIEBwYXJhbSBrZXkgICAgVGhlIHJlc291cmNlIGtleQotICAgICAqIEBwYXJhbSBhcmdzICAgQW4gYXJyYXkgb2Ygb2JqZWN0cyB0byBwbGFjZSBpbiBjb3JyZXNwb25kaW5nIHZhcmlhYmxlcwotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgZm9ybWF0dGVkIG1lc3NhZ2UuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKE9iamVjdCBjYWxsZXIsIExvY2FsZSBsb2NhbGUsIFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3MpCi0gICAgICAgICAgICB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGdldE1lc3NhZ2UoY2FsbGVyLCBCQVNFX05BTUUsIGxvY2FsZSwga2V5LCBhcmdzKTsKLSAgICB9Ci0KLSAgICAvLyBXb3JraG9yc2UgdGhhdCBkb2VzIHRoZSByZXNvdXJjZSBsb2FkaW5nIGFuZCBrZXkgbG9va3VwCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZShPYmplY3QgY2FsbGVyLCBTdHJpbmcgYmFzZW5hbWUsIExvY2FsZSBsb2NhbGUsIFN0cmluZyBrZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RbXSBhcmdzKQotICAgICAgICAgICAgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBtc2cgPSBudWxsOwotICAgICAgICBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZmlyc3RFeCA9IG51bGw7Ci0gICAgICAgIFN0cmluZyBmdWxsTmFtZSA9IG51bGw7Ci0gICAgICAgIENsYXNzIGN1ckNsYXNzID0gbnVsbDsKLSAgICAgICAgYm9vbGVhbiBkaWROdWxsID0gZmFsc2U7Ci0KLSAgICAgICAgaWYgKGNhbGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoY2FsbGVyIGluc3RhbmNlb2YgQ2xhc3MpIHsKLSAgICAgICAgICAgICAgICBjdXJDbGFzcyA9IChDbGFzcykgY2FsbGVyOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBjdXJDbGFzcyA9IGNhbGxlci5nZXRDbGFzcygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgd2hpbGUgKG1zZyA9PSBudWxsKSB7Ci0KLSAgICAgICAgICAgIC8vIEdldCB0aGUgZnVsbCBuYW1lIG9mIHRoZSByZXNvdXJjZQotICAgICAgICAgICAgaWYgKGN1ckNsYXNzICE9IG51bGwpIHsKLQotICAgICAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgZnVsbCBiYXNlbmFtZQotICAgICAgICAgICAgICAgIFN0cmluZyBwa2dOYW1lID0gY3VyQ2xhc3MuZ2V0TmFtZSgpOwotCi0gICAgICAgICAgICAgICAgaW50IHBvcyA9IHBrZ05hbWUubGFzdEluZGV4T2YoIi4iKTsKLSAgICAgICAgICAgICAgICBpZiAocG9zID4gMCkgewotICAgICAgICAgICAgICAgICAgICBmdWxsTmFtZSA9IHBrZ05hbWUuc3Vic3RyaW5nKDAsIHBvcyArIDEpLnJlcGxhY2UoJy4nLCAnLycpICsgYmFzZW5hbWU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZnVsbE5hbWUgPSBiYXNlbmFtZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZ1bGxOYW1lID0gYmFzZW5hbWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgUkIgcmIgPSBuZXcgUkIoY2FsbGVyLCBmdWxsTmFtZSwgbG9jYWxlKTsKLSAgICAgICAgICAgICAgICBtc2cgPSByYi5nZXRTdHJpbmcoa2V5LCBhcmdzKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgIGlmIChjdXJDbGFzcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IGV4OwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIFNhdmUgdGhlIGZpcnN0IGV4Y2VwdGlvbgotICAgICAgICAgICAgICAgIGlmIChmaXJzdEV4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZmlyc3RFeCA9IGV4OwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgc3VwZXJjbGFzcwotICAgICAgICAgICAgICAgIGN1ckNsYXNzID0gY3VyQ2xhc3MuZ2V0U3VwZXJjbGFzcygpOwotICAgICAgICAgICAgICAgIGlmIChjdXJDbGFzcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkaWROdWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBmaXJzdEV4OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGRpZE51bGwgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBjYWxsZXIgPSBudWxsOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBjbmFtZSA9IGN1ckNsYXNzLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNuYW1lLnN0YXJ0c1dpdGgoImphdmEuIikgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbmFtZS5zdGFydHNXaXRoKCJqYXZheC4iKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpZE51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBmaXJzdEV4OwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZGlkTnVsbCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYWxsZXIgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgY3VyQ2xhc3MgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1zZzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDbGVhcnMgdGhlIGludGVybmFsIGNhY2hlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjbGVhckNhY2hlKCkgewotICAgICAgICBwcm9wZXJ0eUNhY2hlLmNsZWFyKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2kxOG4vcmVzb3VyY2UucHJvcGVydGllcyBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9pMThuL3Jlc291cmNlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliYjMxNzYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2kxOG4vcmVzb3VyY2UucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI4NCArMCwwIEBACi0jCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLSMgVHJhbnNsYXRpb24gaW5zdHJ1Y3Rpb25zLgotIyAxLiAgRWFjaCBtZXNzYWdlIGxpbmUgaXMgb2YgdGhlIGZvcm0ga2V5PXZhbHVlLgotIyAgICAgVHJhbnNsYXRlIHRoZSB2YWx1ZSwgRE8gTk9UIHRyYW5zbGF0ZSB0aGUga2V5LgotIyAyLiAgVGhlIG1lc3NhZ2VzIG1heSBjb250YWluIGFyZ3VtZW50cyB0aGF0IHdpbGwgYmUgZmlsbGVkIGluCi0jICAgICBieSB0aGUgcnVudGltZS4gIFRoZXNlIGFyZSBvZiB0aGUgZm9ybTogezB9LCB7MX0sIGV0Yy4KLSMgICAgIFRoZXNlIG11c3QgYXBwZWFyIGFzIGlzIGluIHRoZSBtZXNzYWdlLCB0aG91Z2ggdGhlIG9yZGVyCi0jICAgICBtYXkgYmUgY2hhbmdlZCB0byBzdXBwb3J0IHByb3BlciBsYW5ndWFnZSBzeW50YXguCi0jIDMuICBJZiBhIHNpbmdsZSBxdW90ZSBjaGFyYWN0ZXIgaXMgdG8gYXBwZWFyIGluIHRoZSByZXN1bHRpbmcKLSMgICAgIG1lc3NhZ2UsIGl0IG11c3QgYXBwZWFyIGluIHRoaXMgZmlsZSBhcyB0d28gY29uc2VjdXRpdmUKLSMgICAgIHNpbmdsZSBxdW90ZSBjaGFyYWN0ZXJzLgotIyA0LiAgTGluZXMgYmVnaW5uaW5nIHdpdGggIiMiIChsaWtlIHRoaXMgb25lKSBhcmUgY29tbWVudCBsaW5lcwotIyAgICAgYW5kIG1heSBjb250YWluIHRyYW5zbGF0aW9uIGluc3RydWN0aW9ucy4gIFRoZXkgbmVlZCBub3QgYmUKLSMgICAgIHRyYW5zbGF0ZWQgdW5sZXNzIHlvdXIgdHJhbnNsYXRlZCBmaWxlLCByYXRoZXIgdGhhbiB0aGlzIGZpbGUsCi0jICAgICB3aWxsIHNlcnZlIGFzIGEgYmFzZSBmb3Igb3RoZXIgdHJhbnNsYXRvcnMuCi0jCi0jIERvIG5vdCByZW1vdmUgdGhlIGZvbGxvd2luZyBjb21tZW50IGxpbmUuIEl0IGlzIGEgdmFyaWFibGUgdXNlZCBieSBhIHRyYW5zbGF0aW9uIHRvb2wuCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBETyBOT1QgVE9VQ0ggVEhFU0UgUFJPUEVSVElFUyAtIFRIRVkgQVJFIEFVVE9NQVRJQ0FMTFkgVVBEQVRFRCBCWSBUSEUgQlVJTEQKLSMgUFJPQ0VTUy4KLWF4aXNWZXJzaW9uPUFwYWNoZSBBeGlzMiB2ZXJzaW9uOiBAYXhpc1ZlcnNpb25ACi1heGlzVmVyc2lvblJhdz1AYXhpc1ZlcnNpb25ACi1heGlzQnVpbHRPblJhdz1AVE9EQVlACi1heGlzVXNlckFnZW50PUF4aXMvQGF4aXNWZXJzaW9uQAotYnVpbHRPbj1CdWlsdCBvbiBAVE9EQVlACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi10aHJlYWRwb29sc2h1dGRvd249VGhyZWFkIHBvb2wgaXMgc2h1dCBkb3duLgotZXJyb3JXaGlsZVNhZmVTaHV0RG93bj1FcnJvciBkdXJpbmcgc2FmZSBzaHV0ZG93bgotaW52YWxpZHVzZXI9VGhlIHVzZXIgbmFtZSBpcyBub3QgdmFsaWQuCi1pbnZhbGlkU09BUHZlcnNpb249VGhlIFNPQVAgVVJJIGlzIG5vdCB2YWxpZC4gQXhpczIgc3VwcG9ydHMgU09BUCBWZXJzaW9uIDEuMSBhbmQgMS4yIG9ubHkuCi1jYW5ub3RJbmZlclRyYW5zcG9ydD1UaGUgc3lzdGVtIGNhbm5vdCBpbmZlciB0aGUgdHJhbnNwb3J0IGluZm9ybWF0aW9uIGZyb20gdGhlIHswfSBVUkwuCi1jYW5ub3RJbmZlclRyYW5zcG9ydE5vQWRkcj1BZGRyZXNzIGluZm9ybWF0aW9uIGRvZXMgbm90IGV4aXN0IGluIHRoZSBFbmRwb2ludCBSZWZlcmVuY2UgKEVQUikuVGhlIHN5c3RlbSBjYW5ub3QgaW5mZXIgdGhlIHRyYW5zcG9ydCBtZWNoYW5pc20uCi1jYW5ub3RCZU51bGxBeGlzT3BlcmF0aW9uPVRoZSBBeGlzIG9wZXJhdGlvbiBjYW5ub3QgYmUgbnVsbC4KLWNhbm5vdEJlTnVsbFNlcnZpY2VDb250ZXh0PVRoZSBTZXJ2aWNlQ29udGV4dCBjYW5ub3QgYmUgbnVsbC4KLWNhbm5vdEJlTnVsbENvbmZpZ3VyYXRpb25Db250ZXh0PVRoZSBDb25maWd1cmF0aW9uQ29udGV4dCBjYW5ub3QgYmUgbnVsbC4KLWNhbm5vdEJlTnVsbE9wZXJhdGlvbkNvbnRleHQ9VGhlIE9wZXJhdGlvbkNvbnRleHQgY2Fubm90IGJlIG51bGwuCi1ub3doZXJlVG9TZW5kRXJyb3I9VGhlIHJldHVybiByZXNwb25zZSBwYXRoIGlzIG1pc3NpbmcgYW5kIGZhdWx0VG8gaXMgbm90IHNwZWNpZmllZC4KLWVycm9yd2hpbGVQcm9jZXNzaW5nRmF1bHQ9QW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgcHJvY2Vzc2luZyB0aGUgZmF1bHQuIFNlZSB0aGUgcHJldmlvdXMgZXJyb3IgaW4gdGhlIHN0YWNrIHRyYWNlIGZvciBtb3JlIGluZm9ybWF0aW9uLiAKLXVuU3VwcG9ydGVkTUVQPUFuIHVuc3VwcG9ydGVkIG1lc3NhZ2UgZXhjaGFuZ2UgcGF0dGVybiAoTUVQKSBleGlzdHMgaW4gezB9LgotbWVwQ2xpZW50U3VwcG9ydE9ubHk9VGhpcyBtZXNzYWdlIGV4Y2hhbmdlIHBhdHRlcm4gKE1FUCkgY2xpZW50IHN1cHBvcnRzIHswfSBvbmx5IGFuZCB0aGUgc3VwcGxpZWQgQXhpcyBvcGVyYXRpb25zIHN1cHBvcnRzIHsxfS4KLWlucHV0c3RyZWFtTnVsbD1UaGUgaW5wdXQgc3RyZWFtIGZvciBhbiBpbmNvbWluZyBtZXNzYWdlIGlzIG51bGwuCi11bmtub3duVHJhbnNwb3J0PUFuIHVua25vd24gdHJhbnNwb3J0IGNhbGxlZCB7MH0gZXhpc3RzLgotcGFyYW1Jc05vdFNwZWNpZmllZD1UaGUgezB9IHBhcmFtZXRlciBpcyBub3Qgc3BlY2lmaWVkLgotZ3Jvb3Z5Tm9hbnN3ZXI9QW4gYW5zd2VyIGhhcyBub3QgYmVlbiByZWNlaXZlZCBmcm9tIGdyb292eS4gCi1ncm9vdnlVbmFibGVUb0xvYWQ9VGhlIHN5c3RlbSBjYW5ub3QgbG9hZCB7MH0KLW91dE1lc3NhZ2VOdWxsPVRoZSBvdXQgbWVzc2FnZSBpcyBOVUxMLCBub3RoaW5nIHRvIHdyaXRlLgotY2FuTm90QmVOdWxsPXswfSBjYW5ub3QgYmUgTlVMTC4KLW5vdEZvdW5kPXswfSBjYW5ub3QgYmUgZm91bmQuCi10cmFuc3BvcnRFcnJvcj1UcmFuc3BvcnQgZXJyb3I6IHswfSBFcnJvcjogezF9Ci1odHRwVHJhbnNwb3J0RXJyb3I9SFRUUCBUcmFuc3BvcnQgZXJyb3I6ICcnezB9JycgLSAnJ3sxfScnCi1wcmVhdHVyZUVPUz1BIHByZW1hdHVyZSBlbmQgb2Ygc3RyZWFtIGhhcyBvY2N1cnJlZC4KLXJlc3BvbnNlVGltZU91dD1UaW1lIG91dCB3aGlsZSB3YWl0aW5nIGZvciB0aGUgc2VydmVyIHRvIHNlbmQgdGhlIHJlc3BvbnNlLgotY2FsbEJhY2tDb21wbGV0ZWRXaXRoRXJyb3I9VGhlIGNhbGxiYWNrIGNvbXBsZXRlLCBidXQgdGhlcmUgd2FzIG5vIGVudmVsb3BlIGVsZW1lbnQgb3IgYW4gZXJyb3IuCi0yY2hhbm5lbE5lZWRBZGRyZXNzaW5nPVRvIHVzZSB0d28gdHJhbnNwb3J0IGNoYW5uZWxzIHlvdSBtdXN0IHVzZSB0aGUgV1MtQWRkcmVzc2luZyBtb2R1bGUuIAotdXNlU2VwYXJhdGVMaXN0ZW5lckxpbWl0ZWQ9U2V0dGluZyB1c2VTZXBhcmF0ZUxpc3RlbmVyIHRvIGZhbHNlIGlzIG5vdCBhIHZhbGlkIG9wdGlvbiB3aGVuIHRoZSBTZW5kZXIgaXMgezB9IGFuZCBMaXN0ZW5lciBpcyB7MX0gICAKLXJlcGx5TmVlZFN0YXJ0aW5nPUJlZm9yZSByZXF1ZXN0aW5nIHRoZSBSZXBseVRvIHZhbHVlLCB0aGUgc3lzdGVtIG11c3Qgc3RhcnQgdGhlIFRyYW5zcG9ydExpc3RlbmVyLiBUaGUgVHJhbnNwb3J0IGlzIHswfQotZmFpbGVkVG9PcGVuU29ja2V0PVRoZSBzeXN0ZW0gZmFpbGVkIHRvIG9wZW4gdGhlIHNvY2tldC4KLW5vUmVjZXA0RW1haWw9QSByZWNpcGllbnQgaXMgbm90IHNwZWNpZmllZCBpbiB0aGUgZS1tYWlsIG1lc3NhZ2UuCi11bmtub3duTXNnTGFiZWw9QW4gdW5rbm93biBtZXNzYWdlIGxhYmVsIGhhcyBiZWVuIGVuY291bnRlcmVkOiB7MH0KLWNhbm5vdENvcnJlbGF0ZU1zZz0gVGhlIHN5c3RlbSBjYW5ub3QgY29ycmVsYXRlIHRoZSB7MH0gbWVzc2FnZSBvcGVyYXRpb24gdG8gUmVsYXRlc1RvIHsxfQotYWRkQWZ0ZXJJbnZva2UwMD17MH06IFRoZSBjaGFpbiBhbHJlYWR5IGhhcyBiZWVuIGludm9rZWQuCi0jQWFuZEJkb25vdG1hdGNoPVRoZSB7MH0gdmFsdWUgZG9lcyBub3QgbWF0Y2ggezF9IHZhbHVlLiBUaGUgc3lzdGVtIGV4cGVjdGVkIHRoZSB7Mn0gdmFsdWUsIGJ1dCBmb3VuZCB0aGUgezN9IHZhbHVlLgotcnBjTmVlZG1hdGNoaW5nQ2hpbGQ9VGhlIHJlbW90ZSBwcm9jZWR1cmUgY2FsbCAoUlBDKSBzdHlsZSBleHBlY3RzIHRoZSBpbW1lZGlhdGUgY2hpbGQgb2YgdGhlIFNPQVAgYm9keS4KLXVua25vd25TdHlsZT1UaGUgezB9IHN0eWxlIGlzIGFuIHVua25vd24gc3R5bGUuCi1yYXdYbWxQcm92aWRlcklzTGltaXRlZD1UaGUgWE1MIHByb3ZpZGVyIHN1cHBvcnRzIG9ubHkgdGhlIG1ldGhvZHMgdGhhdCBjb250YWluIHRoZSBwdWJsaWMgT01FbGVtZW50ICZsdDttZXRob2QtbmFtZSZndDsoT01FbGVtZW50KSBzaWduYXR1cmUgd2hlcmUgdGhlIG1ldGhvZC1uYW1lIHZhcmlhYmxlIGNhbiBiZSBhbnkgdmFsdWUuCi1tZXRob2ROb3RJbXBsZW1lbnRlZD1UaGUgaW1wbGVtZW50YXRpb24gY2xhc3MgZG9lcyBub3QgZGVmaW5lIGEgbWV0aG9kIGNhbGxlZAotbWV0aG9kRG9lc05vdEV4aXN0SW5PdXQ9VGhlIFNlcnZpY2VDbGFzcyBvYmplY3QgZG9lcyBub3QgaW1wbGVtZW50IHRoZSByZXF1aXJlZCBtZXRob2QgaW4gdGhlIGZvbGxvd2luZyBmb3JtOiBPTUVsZW1lbnQgezB9KE9NRWxlbWVudCBlKQotbWV0aG9kRG9lc05vdEV4aXN0SW5Pbmx5PVJhd1hNTE1lc3NhZ2VSZWNlaXZlciBjYW4gbm90IGhhbmRsZSB0aGlzIHNjZW5hcmlvIHNpbmNlIFNlcnZpY2VDbGFzcyBoYXMgaW1wbGVtZW50ZWQgdG8gdGFrZSBOb24gT01FbGVtZW50IGFzIG1ldGhvZCBhcmd1bWVudHMuCi1pbXBsUmV0dXJuZWROdWxsPVRoZSBpbXBsZW1lbnRhdGlvbiBjbGFzcyByZXR1cm5lZCBhIG51bGwgdmFsdWUuCi1pbnZhbGlkTWV0aG9kTmFtZT1UaGUgezB9IG1ldGhvZCBuYW1lIGlzIG5vdCB2YWxpZCBmb3IgdGhlIHNlcnZpY2UgaW1wbGVtZW50YXRpb24gY2xhc3MuCi1ibG9ja0ludm9jYXRpb25FeHBlY3RzUmVzPVRoZSBibG9ja2luZyBpbnZvY2F0aW9uIGRvZXMgbm90IGNvbnRhaW4gYSByZXNwb25zZS4KLXNlcnZpY2VHcm91cElETm90Rm91bmQ9VGhlIFNPQVAgc2Vzc2lvbiBpbmZvcm1hdGlvbiBjYW5ub3QgYmUgcmV0cmlldmVkIGZyb20gdGhlIGNvcnJlbGF0aW9uIGlkIHRoYXQgd2FzIHJlY2VpdmVkLgotCi0jICAgIENsaWVudAotb3BlcmF0aW9ubm90Zm91bmQ9VGhlIHswfSBvcGVyYXRpb24gY2Fubm90IGJlIGZvdW5kLgotdW5zdXBwb3J0ZWR5eXBlPUFuIHVuc3VwcG9ydGVkIHR5cGUgZXhpc3RzLgotdW5rbm93bnNvYXB2ZXJzaW9uPVRoZSBzeXN0ZW0gZG9lcyBub3QgcmVjb2duaXplIHRoZSBTT0FQIHZlcnNpb24uCi1jYW5ub3RmaW5kYW1vZHVsZXRvcHJvY2Vzcz1UaGUgc3lzdGVtIGNhbm5vdCBmaW5kIGEgbW9kdWxlIHRvIHByb2Nlc3MgezB9IHR5cGUgYXNzZXJ0aW9ucy4KLW5vZW5kcG9pbnRmb3VuZD1BbiBlbmRwb2ludCBjYW5ub3QgYmUgZm91bmQgaW4gdGhlIFNlcnZpY2UgezB9IAotZW5kcG9pbnRub3Rmb3VuZD1BbiBlbmRwb2ludCBjYW5ub3QgYmUgZm91bmQuCi11bnN1cHBvcnRkbWVwPUFuIHVuc3VwcG9ydGVkIG1lc3NhZ2UgZXhjaGFuZ2UgcGF0dGVybiAoTUVQKSBleGlzdHMuCi1ub3NlcnZpY2Vmb3VuZD1BIHNlcnZpY2Ugd2FzIG5vdCBsb2NhdGVkLiAKLQotIyBjb250ZXh0Ci1zZXJ2aWNlbm90Zm91bmQ9QSBzZXJ2aWNlIGNhbm5vdCBiZSBsb2NhdGVkLgotdGhyZWFkcG9vbHNldD1UaGUgdGhyZWFkIHBvb2wgaXMgYWxyZWFkeSBzZXQuCi10cmFuc3BvcnRpbml0ZXJyb3I9QSB0cmFuc3BvcnQtT1VUIGluaXRpYWxpemF0aW9uIGVycm9yOiB7MH0KLWludmFsaWRzZXJ2aWNlaW5hZ3JvdXA9VGhlIHswfSBzZXJ2aWNlLCB3aGljaCBpcyBub3QgdmFsaWQsIGRvZXMgbm90IGJlbG9uZyB0byB0aGUgezF9IHNlcnZpY2UgZ3JvdXAuCi1jYW5ub3RGbHVzaFJvb3ROdWxsPUNvbnRleHQgY2Fubm90IGJlIGZsdXNoZWQgc2luY2UgdGhlIHJvb3QgY29udGV4dCBpcyBudWxsCi0KLSMgICAgIERlcGxveW1lbnQgRXJyb3JzCi1pbnZhbGlkV1NETEZvdW5kPVRoZSBXU0RMIGZpbGUgZm91bmQgaW4gdGhlIHNlcnZpY2UgYXJjaGl2ZSBmaWxlIGlzIG5vdCB2YWxpZC4gVGhlIFdTREwgZmlsZSBtdXN0IGhhdmUgZWl0aGVyIGh0dHA6Ly93d3cudzMub3JnLzIwMDYvMDEvd3NkbCBvciBodHRwOi8vd3d3LnczLm9yZy8yMDA0LzAzL3dzZGwgYXMgdGhlIG5hbWVzcGFjZSBvZiB0aGUgZG9jdW1lbnQgZWxlbWVudC4KLSN3c2RsZmlsZW5vdGZvdW5kPVRoZSBXU0RMIGZpbGUgY2Fubm90IGJlIGZvdW5kIGZvciB0aGUgc2VydmljZTogezB9Ci1zZXJ2aWNleG1sbm90Zm91bmQ9VGhlIHNlcnZpY2VzLnhtbCBmaWxlIGNhbm5vdCBiZSBmb3VuZCBmb3IgdGhlIHNlcnZpY2U6IHswfQotbW9kdWxleG1sbm90Zm91bmQ9VGhlIG1vZHVsZS54bWwgZmlsZSBjYW5ub3QgYmUgZm91bmQgZm9yIHRoZSBtb2R1bGU6IHswfQotY2xhc3Nub3Rmb3VuZD1UaGUgezB9IGNsYXNzIGNhbm5vdCBiZSBmb3VuZC4KLWZpbGVOb3RGb3VuZD1UaGUgezB9IGZpbGUgY2Fubm90IGJlIGZvdW5kLgotcmVwb2Nhbm5vdGJlYnVsbD1UaGUgQXhpczIgcmVwb3NpdG9yeSBjYW5ub3QgYmUgbnVsbC4KLWNvbmZpZ25vdGZvdW5kPVRoZSBzeXN0ZW0gY2Fubm90IGZpbmQgdGhlIGF4aXMyLnhtbCBmaWxlLgotcGF0aHRvY29uZmlnY2Fub3RudWxsPVRoZSBwYXRoIHRvIGF4aXMyLnhtbCBmaWxlIGNhbm5vdCBiZSBOVUxMLgotbW9kdWxldmFsZmFpbGVkPU1vZHVsZSB2YWxpZGF0aW9uIGZhaWxlZDogezB9Ci1pbnZhbGlkcGhhc2U9RGlkIG5vdCBmaW5kIHRoZSBkZXNpcmVkIHBoYXNlICcnezB9Jycgd2hpbGUgZGVwbG95aW5nIGhhbmRsZXIgJyd7MX0nJy4KLWRpc3BhdGNoUGhhc2VOb3RGb3VuZE9uSW5mbG93PVRoZSAnIkRpc3BhdGNoJyIgcGhhc2UgaXMgbm90IGZvdW5kIG9uIHRoZSBnbG9iYWwgJyJJbkZsb3cnIiBwaGFzZSBvZiB0aGUgYXhpczIueG1sIGZpbGUuIE1ha2Ugc3VyZSB0aGUgcGhhc2UgaXMgd2l0aGluIHRoZSBheGlzMi54bWwgZmlsZS4KLSNpbnZhbGlkbW9kdWxlcmVmPVRoZSB7MH0gc2VydmljZSByZWZlcnMgdG8gdGhlIHsxfSBtb2R1bGUsIHdoaWNoIGlzIG5vdCB2YWxpZC4KLWludmFsaWRtb2R1bGVyZWZieW9wPXswfSBvcGVyYXRpb24gcmVmZXJzIHRvIHRoZSB7MX0gbW9kdWxlLCB3aGljaCBpcyBub3QgdmFsaWQuCi1hZGRpbmduZXdtb2R1bGU9QWRkaW5nIG5ldyBtb2R1bGUKLXNldHRpbmdjbD1UaGUgc2VydmljZSBpcyBzZXR0aW5nIHRoZSB7MH0gY2xhc3MgbG9hZGVyLgotZGVwbG95aW5nd3M9RGVwbG95aW5nIFdlYiBzZXJ2aWNlOiB7MH0gLSB7MX0KLWludmFsaWRzZXJ2aWNlPVRoZSB7MH0gc2VydmljZSwgd2hpY2ggaXMgbm90IHZhbGlkLCBjYXVzZWQgezF9Ci1kZXBsb3lpbmdtb2R1bGU9RGVwbG95aW5nIG1vZHVsZTogezB9IC0gezF9Ci1kZXBsb3lpbmdwb2pvPURlcGxveWluZyBwb2pvOiB7MH0gLSB7MX0KLWludmFsaWRtb2R1bGU9VGhlIHswfSBtb2R1bGUsIHdoaWNoIGlzIG5vdCB2YWxpZCwgY2F1c2VkIHsxfQotc2VydmljZXJlbW92ZWQ9VW5kZXBsb3lpbmcgV2ViIHNlcnZpY2U6IHswfQotdHlwZW1hcHBpbmdub3RhbGxvd2VkPVR5cGUgTWFwcGluZ3MgYXJlIG5vdCBhbGxvd2VkIGluIHRoZSBheGlzMi54bWwgZmlsZS4KLWVycm9yaW5sb2FkaW5nbXI9QSB7MH0gZXJyb3Igb2NjdXJyZWQgaW4gbG9hZGluZyB0aGUgbWVzc2FnZSByZWNlaXZlciB7MX0KLWVycm9yaW5sb2FkaW5ndHM9QSB7MH0gZXJyb3Igb2NjdXJyZWQgaW4gbG9hZGluZyB0aGUgdHJhbnNwb3J0IHNlbmRlciB7MX0gCi1lcnJvcmxvYWRpbmdidWlsZGVyPUEgezB9IGVycm9yIG9jY3VycmVkIHdoaWxlIHZhbGlkYXRpbmcgdGhlIG1lc3NhZ2UgYnVpbGRlciB7MX0KLWVycm9ybG9hZGluZ2Zvcm1hdHRlcj1BIHswfSBlcnJvciBvY2N1cnJlZCB3aGlsZSB2YWxpZGF0aW5nIHRoZSBtZXNzYWdlIGZvcm1hdHRlciB7MX0KLWludmFsaWRjb25maWdhdHRyaWJ1dGU9QXR0cmlidXRlcyBleGlzdCBpbiB0aGUgYXhpczIueG1sIGZpbGUgdGhhdCBhcmUgbm90IHZhbGlkLiAgezB9IHsxfQotdW5kZWZpbmVkRmxvd1R5cGU9QW4gdW5kZWZpbmVkIGZsb3cgdHlwZSBleGlzdHMgaW4gezB9Ci1mbG93dHlwZWlzcmVxdWlyZD1UaGUgZmxvdyB0eXBlIGlzIGEgcmVxdWlyZWQgYXR0cmlidXRlIGluIHswfQotZWxlbWVudGlzbm90YWxsb3c9VGhlIHswfSBlbGVtZW50IGlzIG5vdCBhbGxvd2VkIGluIHRoZSBheGlzMi54bWwgZmlsZS4KLSMgb3V0Zmxvd25vdGFsbG93ZWRpbnRyaW4gaXMgbm90IHVzZWQKLSNvdXRmbG93bm90YWxsb3dlZGludHJpbj1PVVRGbG93IGRvZXMgbm90IHN1cHBvcnQgaW4gQXhpc1RyYW5zcG9ydElOICB7MH0KLXVua25vd25lbGVtZW50PVRoaXMgZWxlbWVudCBpcyB1bmtub3duOiB7MH0KLWluZmxvd25vdGFsbG93ZWRpbnRyb3V0PUluRmxvdyBpcyBub3Qgc3VwcG9ydGVkIGluIFRyYW5zcG9ydE91dERlc2NyaXB0aW9uIHswfQotYmFkYXJndWZvcnNlcnZpY2U9VGhlIHswfSBhcmd1bWVudHMgYXJlIG5vdCB2YWxpZCBmb3IgdGhlIHsxfSBzZXJ2aWNlLgotdHlwZW1hcHBpbmdub3RpbXBsPVR5cGUgbWFwcGluZyBzdXBwb3J0IGlzIG5vdCBhdmFpbGFibGUuCi1iZWFubWFwcGluZ25vdGltcGw9QmVhbiBtYXBwaW5nIHN1cHBvcnQgaXMgbm90IGF2YWlsYWJsZS4KLW1vZHVsZW5vdGZvdW5kPVRoZSB7MH0gbW9kdWxlIGlzIG5vdCB2YWxpZCBvciBoYXMgbm90IGJlZW4gZGVwbG95ZWQuCi1iYWRwYXJhYWd1PWJhZCBwYXJhbWV0ZXIgYXJndW1lbnRzLiBuYW1lIGNhbm5vdCBiZSBudWxsIDogezB9Ci1iYWRsaXN0YWd1PVRoZSBsaXN0ZW5lciBhcmd1bWVudHMgYXJlIG5vdCB2YWxpZC4KLSMgaW52YWxpZGhhbmRsZXJkaWYgYW5kIHRoaXNzaG91bGRiZWltcGxlbWVudCBhcmUgbm90IHVzZWQuCi0jaW52YWxpZGhhbmRsZXJkaWY9IFRoZSBIYW5kbGVyIGNhbm5vdCBoYXZlIGJvdGggYSBuYW1lIGFuZCBhIHJlZiB7MH0KLSN0aGlzc2hvdWxkYmVpbXBsbWVudD1UaGlzIHNob3VsZCBiZSBpbXBsZW1lbnRlZCB7MH0KLW9wbm90Zm91bmRpbndzZGw9VGhlIHswfSBPcGVyYXRpb24gTmFtZSBjYW5ub3QgYmUgZm91bmQgaW4gdGhlIFdTREwgZmlsZS4KLSMgYmFkb3BlYXR0cmlidXRlIGFuZCB1bmtub3duZWxlbWVudGlub3AgYXJlIG5vdCB1c2VkLgotI2JhZG9wYXR0cmlidXRlPUFuIGF0dHJpYnV0ZSB0aGF0IGlzIG5vdCB2YWxpZCB3YXMgZm91bmQgaW4gdGhlIG9wZXJhdGlvbjogezB9Ci0jdW5rbm93bmVsZW1lbnRpbm9wPUFuIHVua25vd24gZWxlbWVudCBleGlzdHMgaW4gdGhlIG9wZXJhdGlvbjogezB9Ci1tb2R1bGVjYW5ub3RoYXZyYm90aG5hbWVhbmRyZWY9QSBtb2R1bGUgY2Fubm90IGhhdmUgYm90aCBhIG5hbWUgYW5kIGEgcmVmIHswfS4KLWludmFsaWRlbGVpbm1vZHVsZT1UaGUgezB9IGVsZW1lbnQgaXMgbm90IGFsbG93ZWQgaW4gdGhlIG1vZHVsZS54bWwgZmlsZS4KLSMgaW52YWxpZHBoYXNlMDEgaXMgbm90IHVzZWQuCi0jaW52YWxpZHBoYXNlMDE9SW52YWxpZCBQaGFzZSA6IHswfSBmb3IgdGhlIGhhbmRsZXIgezF9IGRvZXMgbm90IGV4aXQgaW4gYXhpczIueG1sIG9yIHJlZmVyaW5nIHRvIHBoYXNlIGluIGRpZmZlcmVudCBmbG93Ci1pbnZhbGlkbW9kdWxlcmVmYnljb25maWc9QSByZWZlcmVuY2UgYnkgdGhlIGF4aXMyLnhtbCBmaWxlIGlzIG1hZGUgdG8gdGhlIHswfSBtb2R1bGUsIHdoaWNoIGlzIG5vdCB2YWxpZC4KLXBoYXNlZG9zZW5vdHNwZWNpZmllZD1BIFBoYXNlIGlzIHNwZWNpZmllZCBmb3IgdGhlIHswfSBoYW5kbGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1zZXJ2aWNlbW9kdWxlY2Fubm90aGF2ZWdsb2JhbD1BIHNlcnZpY2Utc3BlY2lmaWMgbW9kdWxlIGNhbm5vdCByZWZlciBzeXN0ZW0gcHJlLWRlZmluZWQgcGhhc2VzOiAgezB9Ci1mbmY9VGhlIGZpbGUgY2Fubm90IGJlIGZvdW5kLgotZm5mX2U9VGhlIHswfSBmaWxlIGNhbm5vdCBiZSBmb3VuZC4KLVN0cmVhbUV4Y2VwdGlvbj1YTUxTdHJlYW1FeGNlcHRpb24gOiB7MH0KLW1uZj17MH0gOiBUaGUgbW9kdWxlIGNhbm5vdCBiZSBmb3VuZC4KLWludmFsaWRfc3RvcmFnZT1UaGUgZGVmaW5pdGlvbiBvZiB0aGUgc3RvcmFnZSBjbGFzcyBpcyBub3QgdmFsaWQgYmVjYXVzZSB0aGUgY2xhc3MgbmFtZSBpcyBtaXNzaW5nLgotbm9fZGlzcGF0Y2hlcl9mb3VuZD1BIGRpc3BhdGNoZXIgY2Fubm90IGJlIGZvdW5kIGFuZCBjYW5ub3QgY29udGludWUuCi1ub01ldGFJbmY9SW52YWxpZCBzZXJ2aWNlLiBNRVRBLUlORiBkaXJlY3Rvcnkgbm90IGZvdW5kLgotaXZzPUludmFsaWQgc2VydmljZS4gTUVUQS1JTkYgZGlyZWN0b3J5IG5vdCBmb3VuZC4KLWJhZE1vZHVsZUZyb21PcGVyYXRpb249QW4gZXJyb3Igb2NjdXJyZWQgaW4gdGhlIHswfSBlbmdhZ2luZyBtb2R1bGUgdG8gdGhlIHsxfSBvcGVyYXRpb24uIEEgbW9kdWxlIHJlZmVyZW5jZSB0aGF0IGlzIG5vdCB2YWxpZCBleGlzdHMgYXQgdGhlIG9wZXJhdGlvbi4KLWJhZE1vZHVsZUZyb21TZXJ2aWNlPUFuIGVycm9yIG9jY3VycmVkIGluIHRoZSB7MH0gZW5nYWdpbmcgbW9kdWxlIHRvIHRoZSB7MX0gc2VydmljZS4gQSBtb2R1bGUgcmVmZXJlbmNlIHRoYXQgaXMgbm90IHZhbGlkIGV4aXN0cyBhdCB0aGUgc2VydmljZS4KLUluc3RhbnRpYXRpb25FeGNlcHRpb249QW4gSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlcnJvciBvY2N1cnJlZCBpbiBBeGlzIHN0b3JhZ2UgcHJvY2Vzc2luZyAgezB9Ci1JbGxlZ2FsQWNjZXNzRXhjZXB0aW9uPUFuIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZXJyb3Igb2NjdXJyZWQgaW4gQXhpcyBzdG9yYWdlIHByb2Nlc3NpbmcgIHswfQotdHJhbnNwb3J0U2VuZGVyRXJyb3I9VGhlIFRyYW5zcG9ydFNlbmRlciBpbXBsZW1lbnRhdGlvbiBjbGFzcyBpcyByZXF1aXJlZCBmb3IgdGhlIHRyYW5zcG9ydCB7MH0KLW9ic2VyZXJyb3I9QW4gaW1wbGVtZW5hdGlvbiBjbGFzcyBvZiB0aGUgT2JzZXJ2ZXIgb2JqZWN0IGlzIHJlcXVpcmVkLgotaW52YWxpZG1vZHVsZWNvbmZpZz1BIG1vZHVsZSBjb25maWd1cmF0aW9uIGV4aXN0cyB0aGF0IGlzIG5vdCB2YWxpZC4KLWludmFsaWRoYW5kbGVyPUludmFsaWQgaGFuZGxlciBjb25maWchICBOYW1lOiB7MH0gUmVhc29uOiB7MX0KLXBhcmFtZXRlcmxvY2tlZGVycm9yPVRoZSB7MH0gcGFyYW1ldGVyIGlzIGxvY2tlZCBhdCB0aGUgdG9wIGxldmVsIGFuZCBjYW5ub3QgYmUgb3ZlcnJpZGRlbi4KLW9wX2Vycm9yPVByb2Nlc3NpbmcgT3BlcmF0aW9ucyBNb2R1bGVzIHdpdGggYW4gZXJyb3Igb2YgezB9Ci1zZXJ2aWNlbmFtZWVyb3I9QSBzZXJ2aWNlIG5hbWUgaXMgcmVxdWlyZWQuCi1pbnZhbGlkX29wPVRoZSBvcGVyYXRpb24gaXMgbm90IHZhbGlkOiB7MH0gCi1jYW5ub3RDb3JyZWxhdGVNc2cwMT1DYW5ub3QgY29ycmVsYXRlIE1lc3NhZ2VJRCB7MX0gdG8gezB9Ci1maWxlRXhpc3RzTm9PdmVyd3JpdGU9VGhlIHswfSBmaWxlIGNhbm5vdCBiZSBvdmVyd3JpdHRlbi4KLWNhbm5vdENvbm5lY3RFcnJvcj1VbmFibGUgdG8gY29ubmVjdAotZmFpbGVkSk1TQ29ubmVjdG9yU2h1dGRvd249QSBmYWlsdXJlIG9jY3VycmVkIGluIHRoZSBKTVNDb25uZWN0b3JTaHV0ZG93bgotZXJyb3JpbnNjaGVtYWdlbj1UaGUgZm9sbG93aW5nIGVycm9yIG9jY3VycmVkIGR1cmluZyBzY2hlbWEgZ2VuZXJhdGlvbjogezB9Ci1lcnJvcmluaW5wdXRzdHJlYW1jbG9zZT1BbiBlcnJvciBvY2N1cnJlZCBpbiBjbG9zaW5nIGlucHV0IHN0cmVhbS4KLXBoYXNlY2xhc3Nub3Rmb3VuZD1UaGUgc3lzdGVtIGNhbm5vdCBmaW5kIHRoZSBwaGFzZSBjbGFzczogezB9IDogezF9Ci1tb2R1bGVuYW1lY2Fubm90YmVudWxsPVRoZSBmb2xsb3dpbmcgYXR0cmlidXRlIC9kZWZhdWx0TW9kdWxlVmVyc2lvbnMvbW9kdWxlL0BuYW1lIGlzIG5vdCBzZXQgaW4gYXhpczIueG1sCi1tb2R1bGV2ZXJzaW9uY2Fubm90YmVudWxsPVRoZSBmb2xsb3dpbmcgYXR0cmlidXRlIC9kZWZhdWx0TW9kdWxlVmVyc2lvbnMvbW9kdWxlL0B2ZXJzaW9uIGlzIG5vdCBzZXQgaW4gYXhpczIueG1sCi0jIGRvY3VtZW50Y3JlYXRpbmdlcnJvciBpcyBub3QgdXNlZC4KLSNkb2N1bWVudGNyZWF0aW5nZXJyb3I9QW4gZXhjZXB0aW9uIG9jY3VycmVkIHdoZW4gY3JlYXRpbmcgdGhlIGRvY3VtZW50IGZyb20gdGhlIFdTREwgZmlsZTogezB9Ci1ub3NlcnZpY2VlbGVtdGZvdW5kPVRoZSBqYXZheC53c2RsLlNlcnZpY2UgZWxlbWVudCBjYW5ub3QgYmUgZm91bmQuCi1zZXJ2aWNlcG9ydGVycm9yPVRoZSBzeXN0ZW0gbXVzdCBzcGVjaWZ5IGF0IGxlYXN0IG9uZSBwb3J0Lgotc29hcGJpbmRpbmdlcnJvcj1UaGUgc3lzdGVtIG11c3Qgc3BlY2lmeSBhdCBsZWFzdCBvbmUgcG9ydCB3aXRoIGEgU09BUCBiaW5kaW5nLgotYXhpc29wZXJhdGlvbmNyZWF0ZWVycm9yPUFuIGV4Y2VwdGlvbiB3aGVuIGNyZWF0aW5nIEF4aXNPcGVyYXRpb24gZm9yIHRoZSBBeGlzU2VydmljZTogezB9Ci13cmFwcGVyZWxlbWVudGNyZWF0ZXJyb3I9QW4gZXhjZXB0aW9uIG9jY3VycmVkIHdoZW4gY3JlYXRpbmcgdGhlIHdyYXBwZXIgZWxlbWVudC4KLXBvbGljeXByb2Nlc3NpbmdlcnJvcj1BbiBleGNlcHRpb24gb2NjdXJyZWQgd2hlbiBwcm9jZXNzaW5nIHBvbGljeSBlbGVtZW50cy4KLWJvdGhyZXBvYW5kY29uZmlnbnVsbD1UaGUgcmVwb3NpdG9yeSBsb2NhdGlvbiBpcyBub3Qgc3BlY2lmaWVkIGFuZCB0aGUgYXhpczIueG1sIGZpbGUgaXMgbm90IHByb3ZpZGVkLiBUaGUgc3lzdGVtIHdpbGwgdXNlIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24sIHdoaWNoIHVzZXMgdGhlIGRlZmF1bHRfYXhpczIueG1sIGZpbGUuCi1jYW5ub3RmaW5kcmVwbz1UaGUgc3lzdGVtIGNhbm5vdCBsb2NhdGUgdGhlIHNwZWNpZmllZCByZXBvc2l0b3J5IGxvY2F0aW9uOiB7MH0KLW5vcmVwb2ZvdW5kaW5heGlzMj1BIHJlcG9zaXRvcnkgbG9jYXRpb24gaXMgbm90IGZvdW5kIGluIHRoZSBheGlzMi54bWwgZmlsZS4KLW5vc2VydmljZWRpcmZvdW5kPU5vIHNlcnZpY2VzIGRpcmVjdG9yeSB3YXMgZm91bmQgdW5kZXIgezB9Lgotbm9tb2R1bGVkaXJmb3VuZD1ObyBtb2R1bGVzIGRpcmVjdG9yeSB3YXMgZm91bmQgdW5kZXIgezB9LgotY29uZmRpcm5vdGZvdW5kPVRoZSBjb25mIGRpcmVjdG9yeSBjYW5ub3QgYmUgZm91bmQgYW5kIHRoZSBheGlzMi54bWwgZmlsZSBpcyBub3QgcHJvdmlkZWQuIFRoZSBzeXN0ZW0gd2lsbCB1c2UgdGhlIGRlZmF1bHRfYXhpczIueG1sIGZpbGUuCi1ub2F4aXMyeG1sZm91bmQ9VGhlIGF4aXMyLnhtbCBmaWxlIGNhbm5vdCBiZSBmb3VuZCBpbiBjb25mIGRpcmVjdG9yeS4gIFRoZSBzeXN0ZW0gd2lsbCB1c2UgdGhlIGRlZmF1bHRfYXhpczIueG1sIGZpbGUuCi1iYWRlbGVtZW50Zm91bmQ9VGhlIHN5c3RlbSB3YXMgbG9va2luZyBmb3IgdGhlICcnezB9JycgZWxlbWVudCwgYnV0IGl0IGZvdW5kICcnezF9JycKLW1lc3NhZ2VsYWJlbGNhbm5vdGZvdW5kPVRoZSBtZXNzYWdlIGxhYmVsIGNhbm5vdCBiZSBudWxsLgotcGFyYW10ZXJsb2NrZWRieXBhcmVudD1UaGUgezB9IHBhcmFtZXRlciBpcyBhbHJlYWR5IGxvY2tlZCBhbmQgdGhlIHZhbHVlIGNhbm5vdCBiZSBvdmVycmlkZGVuLgotbW9kdWxlYWxyZWR5ZW5nYWdlZD1UaGUgezB9IG1vZHVsZSBpcyBhbHJlYWR5IGVuZ2FnZWQuIFRoZSBvcGVyYXRpb24gaGFzIGJlZW4gc3RvcHBlZC4gCi1tZXBtYXBwaW5nZXJyb3I9VGhlIHN5c3RlbSBjYW5ub3QgbWFwIHRoZSBtZXNzYWdlIGV4Y2hhbmdlIHBhdHRlcm4gKE1FUCkgVVJJIHRvIGEgY29uc3RhbnQgdmFsdWUgZm9yIHRoZSBheGlzMiBNRVAuCi1tZXBub3R5ZXRpbXBsZW1lbnRlZD1UaGUgbWVzc2FnZSBleGNoYW5nZSBwYXR0ZXJuIChNRVApIHswfSBoYXMgbm90IGltcGxlbWVudGVkIHRoZSBjcmVhdGVDbGllbnQgbWV0aG9kLgotbW9kdWxlYWxyZWR5ZW5nYWdldG9zZXJ2aWNlPVRoZSBzeXN0ZW0gaXMgYXR0ZW1wdGluZyB0byBlbmdhZ2UgYSBtb2R1bGUgdGhhdCBpcyBhbHJlYWR5IGVuZ2FnZWQ6IHswfQotaW52YWxpZG9wZXJhdGlvbj1UaGUgZm9sbG93aW5nIG9wZXJhdGlvbiBpcyBub3QgdmFsaWQ6IHswfQotbm9zY2hlbWFmb3VuZD1BIHNjaGVtYSBjYW5ub3QgYmUgZm91bmQgZm9yIHRoZSBzZXJ2aWNlLgotbW9kdWxlbm90YXZhaWxibGU9VGhlIHN5c3RlbSBpcyBhdHRlbXB0aW5nIHRvIGVuZ2FnZSBhIG1vZHVsZSB0aGF0IGlzIG5vdCBhdmFpbGFibGU6IHswfQotbW9kdWxlYWxyZWR5ZW5nYWdlZHRvc2VydmljZWdyb3VwPVRoZSB7MH0gbW9kdWxlIGhhcyBhbHJlYWR5IGJlZW4gZW5nYWdlZCBvbiB0aGUgc2VydmljZSBncm91cC4gVGhlIG9wZXJhdGlvbiBoYXMgYmVlbiBzdG9wcGVkLiAKLXNlcnZpY2Vub3Rmb3VuZGlud3NkbD1UaGUgezB9IHNlcnZpY2UgY2Fubm90IGJlIGZvdW5kIGluIHRoZSBXU0RMIGZpbGUuCi1ub3NlcnZpY2Vmb3VuZGlud3NkbD1UaGUgc2VydmljZSBjYW5ub3QgYmUgZm91bmQgaW4gdGhlIGdpdmVuIFdTREwgZmlsZS4KLW5vcG9ydHR5cGVmb3VuZGZvcj1BIHBvcnQgY2Fubm90IGJlIGZvdW5kIGZvciB0aGUgezB9IHBvcnQgbmFtZS4KLW5vcG9ydHR5cGVmb3VuZD1BIHBvcnQgY2Fubm90IGJlIGZvdW5kIGluIHRoZSBzZXJ2aWNlIGVsZW1lbnQuCi1tb2R1bGVuZj1BIG1vZHVsZSBjYW5ub3QgYmUgZm91bmQuCi1tZXBjb21wbGV0ZWQ9QSBtZXNzYWdlIHdhcyBhZGRlZCB0aGF0IGlzIG5vdCB2YWxpZC4gSG93ZXZlciwgdGhlIG9wZXJhdGlvbiBjb250ZXh0IHdhcyBjb21wbGV0ZS4KLWludmFsaWRhY2Vzcz0gQW4gYWNjZXNzIG9jY3VycmVkIHRoYXQgaXMgbm90IHZhbGlkLgotbWVwaXNjb21wbHRlZD1UaGUgbWVzc2FnZSBleGNoYW5nZSBwYXR0ZXJuIChNRVApIGlzIGFscmVhZHkgY29tcGxldGUuIFVzZSB0aGUgcmVzZXQgbWV0aG9kIGJlZm9yZSByZS1ydW5uaW5nLgotb3V0bXNnY3R4bnVsbD1UaGUgb3V0IG1lc3NhZ2UgY29udGV4dCBpcyBudWxsLiBTZXQgdGhlIG91dCBtZXNzYWdlIGNvbnRleHQgYmVmb3JlIGNhbGxpbmcgdGhpcyBtZXRob2QuCi1jYW5ub3RyZXNldD1UaGUgbWVzc2FnZSBleGNoYW5nZSBwYXR0ZXJuIChNRVApIGlzIG5vdCBjb21wbGV0ZS4gQ2Fubm90IHJlc2V0Ci1jYW5ub3RhZGRtc2djdHg9VGhlIHN5c3RlbSBjYW5ub3QgYWRkIHRoZSBtZXNzYWdlIGNvbnRleHQgYWdhaW4gdW50aWwgY2xpZW50IHJ1bnMuCi1jbHVzdGVySW1wbE5vdEZvdW5kPUNsdXN0ZXJpbmcgaW1wbGVtZW50YXRpb24gY2xhc3MgezB9IG5vdCBmb3VuZAotY29udGV4dE1hbmFnZXJMaXN0ZW5lcklzTnVsbD1DbHVzdGVyIENvbnRleHRNYW5hZ2VyIGVudHJ5IG5vdCBmb3VuZCBpbiBheGlzMi54bWwKLWNvbmZpZ3VyYXRpb25NYW5hZ2VyTGlzdGVuZXJJc051bGw9Q2x1c3RlciBDb25maWd1cmF0aW9uTWFuYWdlciBlbnRyeSBub3QgZm91bmQgaW4gYXhpczIueG1sCi1jYW5ub3RMb2FkQ2x1c3RlckltcGw9Q2x1c3RlciBpbXBsZW1lbnRhdGlvbiBjYW5ub3QgYmUgbG9hZGVkCi1jbGFzc0F0dHJpYnV0ZU5vdEZvdW5kPVRoZSBlbGVtZW50IHswfSBtdXN0IGhhdmUgYSBhdHRyaWJ1dGUgd2l0aCB0aGUgbmFtZSAnJ2NsYXNzJycKLQotI1BvbGljeQotZW1wdHlwb2xpY3k9VGhlIFBvbGljeSBJRCBpcyBlaXRoZXIgbnVsbCBvciBlbXB0eS4KLSMgb3V0TWVzc2FnZU51bGwgaXMgbm90IHVzZWQuCi0jb3V0TWVzc2FnZU51bGw9VGhlIG91dCBtZXNzYWdlIGlzIG51bGwuCi1tYWxmb3JtZWRVUkxFeGNlcHRpb24wMD1NYWxmb3JtZWRVUkxFeGNlcHRpb246Ci1leGNlcHRpb24wMD1FeGNlcHRpb246Ci0jQnl0ZSBjb2RlIHJlYWRpbmcgZm9yIEphdmEyV1NETAotYmFkQ2xhc3NGaWxlMDA9QW4gZXJyb3Igb2NjdXJyZWQgd2hlbiBsb29raW5nIGZvciBwYXJhbWV0ZXIgbmFtZXMgaW4gdGhlIGJ5dGVjb2RlLiBUaGUgaW5wdXQgbWlnaHQgbm90IGJlIGEgdmFsaWQgY2xhc3MgZmlsZS4KLWNhbnRMb2FkQnllY29kZT1UaGUgc3lzdGVtIGNhbm5vdCBsb2FkIHRoZSBieXRlY29kZSBmb3IgdGhlIGNsYXNzICJ7MH0iCi11bmV4cGVjdGVkRU9GMDA9QW4gZXJyb3Igb2NjdXJyZWQgd2hlbiBsb29raW5nIGZvciB0aGUgcGFyYW1ldGVyIG5hbWVzIGluIHRoZSBieXRlY29kZS4gVGhlIGVuZCBvZiB0aGUgZmlsZSB3YXMgcmVhY2hlZCB1bmV4cGVjdGVkbHkuIAotdW5leHBlY3RlZEJ5dGVzMDA9QW4gZXJyb3Igb2NjdXJyZWQgd2hlbiBsb29raW5nIGZvciB0aGUgcGFyYW1ldGVyIG5hbWVzIGluIHRoZSBieXRlY29kZS4gVGhlcmUgYXJlIHVuZXhwZWN0ZWQgYnl0ZXMgaW4gdGhlIGZpbGUuCi0jZGVzY3JpcHRpb24KLXNlcnZpY2Vmb3VuZD1Gb3VuZCBBeGlzU2VydmljZSA6IHswfQotb3BlcmF0aW9uZm91bmQ9Rm91bmQgQXhpc09wZXJhdGlvbiA6IHswfQotY2hlY2tpbmdvcGVyYXRpb249VGhlIHN5c3RlbSBpcyBjaGVja2luZyBmb3IgdGhlIG9wZXJhdGlvbiB1c2luZyB0aGUgZm9sbG93aW5nIFdTQUFjdGlvbjogezB9Ci1jaGVja2luZ3NlcnZpY2Vmb3JlcHI9VGhlIHN5c3RlbSBpcyBjaGVja2luZyBmb3IgdGhlIHNlcnZpY2UgdXNpbmcgdGhlIGZvbGxvd2luZyB0b0VQUiBhZGRyZXNzOiB7MH0KLWNoZWNraW5ncmVsYXRlc3RvPVRoZSBzeXN0ZW0gaXMgY2hlY2tpbmcgdGhlIGZvbGxvd2luZyAgUmVsYXRlc1RvOiB7MH0KLXR3b3NlcnZpY2VjYW5ub3RoYXZlc2FtZW5hbWU9VHdvIHNlcnZpY2VzIGNhbm5vdCBoYXZlIHNhbWUgbmFtZS4gIEEgc2VydmljZSB3aXRoIHRoZSB7MH0gbmFtZSBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgc3lzdGVtLgotY2Fubm90YWRkYXBwbGljYXRpb25zY29wZXNlcnZpY2U9VGhlIHN5c3RlbSBjYW5ub3QgYWRkIGEgc2VydmljZSB3aXRoIGFwcGxpY2F0aW9uIHNjb3BlIGFmdGVyIHRoZSBzeXN0ZW0gaGFzIHN0YXJ0ZWQuCi1pbnZhbGlkc2VydmljZWdyb3VwbmFtZT1UaGUgezB9IHNlcnZpY2UgZ3JvdXAgbmFtZSBpcyBub3QgdmFsaWQuCi1tb2R1bGVhbHJlZHllbmdhZ2VkZ2xvYmFseT1BbiBhdHRlbXB0IHdhcyBtYWRlIHRvIGVuZ2FnZSB0aGUgezB9IG1vZHVsZSwgd2hpY2ggaXMgYWxyZWFkeSBlbmdhZ2VkLgotcmVmZXJ0b2ludmFsaWRtb2R1bGU9QSByZWZlcmVuY2Ugd2FzIG1hZGUgdG8gYSBtb2R1bGUgdGhhdCBoYXMgbm90IGJlZW4gZGVwbG95ZWQuIAotc2VydmljZWluYWN0aXZlPVRoZSBzeXN0ZW0gaXMgYXR0ZW1wdGluZyB0byBhY2Nlc3MgYW4gaW5hY3RpdmUgc2VydmljZTogezB9Ci1zZXJ2aWNlbmFtZW5vdHZhbGlkPVRoZSB7MH0gc2VydmljZSBuYW1lIGluIG5vdCB2YWxpZC4KLWVuZ2luZXN0YXJ0ZWQ9VGhlIEF4aXMgZW5naW5lIHN0YXJ0ZWQuCi1tdXN0dW5kZXJzdGFuZGZhaWxlZD1NdXN0IFVuZGVyc3RhbmQgY2hlY2sgZmFpbGVkIGZvciBoZWFkZXIgezB9IDogezF9Ci1tdXN0dW5kZXJzdGFuZGZhaWxlZDI9TXVzdCBVbmRlcnN0YW5kIGNoZWNrIGZhaWxlZCBmb3IgaGVhZGVyczogezB9Ci1yZWNlaXZlZGVycm9ybWVzc2FnZT1UaGUgc3lzdGVtIHJlY2VpdmVkIGFuIGVycm9yIG1lc3NhZ2Ugd2l0aCB0aGUgezB9IElELiAKLXNlcnZpY2Vub3Rmb3VuZGZvcmVwcj1UaGUgc2VydmljZSBjYW5ub3QgYmUgZm91bmQgZm9yIHRoZSBlbmRwb2ludCByZWZlcmVuY2UgKEVQUikgezB9Ci1iaW5kaW5nRGlzYWJsZWQ9ezB9IGJpbmRpbmcgaXMgZGlzYWJsZWQgZm9yIHRoaXMgc2VydmljZS4KLW9wZXJhdGlvbm5vdGZvdW5kZm9yZXByPVRoZSBlbmRwb2ludCByZWZlcmVuY2UgKEVQUikgZm9yIHRoZSBPcGVyYXRpb24gbm90IGZvdW5kIGlzIHswfSBhbmQgdGhlIFdTQSBBY3Rpb24gPSB7MX0KLXVuYWJsZXRvZmluZHNlcnZpY2U9VGhlIHJlcXVlc3RlZCBzZXJ2aWNlIGNvdWxkIG5vdCBiZSBmb3VuZCAtLSB0aGUgb3BlcmF0aW9uIGhhcyBiZWVuIHN0b3BwZWQuCi1pbnZhbGlkc2VydmljZWdyb3VvaWQ9VGhlIHswfSBTZXJ2aWNlIEdyb3VwIElEIGlzIG5vdCB2YWxpZC4KLXNlcnZpY2Vub3Rmb3VuZGludGhlc3lzdGVtPVRoZSB7MH0gc2VydmljZSBpcyBub3QgZm91bmQgaW4gdGhlIHN5c3RlbS4KLXRyYW5zcG9ydG5vdGZvdW5kPVRoZSB0cmFuc3BvcnQgaXMgbm90IGZvdW5kOiB7MH0KLUNhbm5vdENvbmZpZ3VyZUF4aXMyPVRoZSBzeXN0ZW0gY2Fubm90IGNvbmZpZ3VyZSBBeGlzMi4KLXdzYWRkcmVzc2luZ3JlcXVpcmVkbm90cHJlc2VudD1XUy1BZGRyZXNzaW5nIGlzIHJlcXVpcmVkLCBidXQgaXQgY2Fubm90IGJlIGZvdW5kLgotbm9tZXNzYWdlcmVjaWV2ZXI9TWVzc2FnZSBSZWNlaXZlciBub3QgZm91bmQgZm9yIEF4aXNPcGVyYXRpb246IHswfQotZHVwbGljYXRlcmVsYXRlc3RvPVRoZSBtZXNzYWdlIGlzIGEgZHVwbGljYXRlIChoYXMgdGhlIHNhbWUgcmVwbHkgcmVsYXRpb25zaGlwIHZhbHVlKSBvZiBhbiBhbHJlYWR5IHByb2Nlc3NlZCBtZXNzYWdlLiBSZWxhdGVzVG8gPSB7MH0KLWdldE1lc3NhZ2VDb250ZXh0RXJyb3I9VGhlIG1lc3NhZ2UgY29udGV4dCBjb3VsZCBub3QgYmUgcmV0cmlldmVkIGR1ZSB0byB0aGUgZm9sbG93aW5nIGVycm9yOiB7MH0KLW1pc21hdGNoZWRNb2R1bGVWZXJzaW9ucz1UcmllZCB0byBkZXBsb3kgKHRvIHswfSkgYSBtb2R1bGUgJyd7MX0nJyB3aGVuICcnezJ9Jycgd2FzIGFscmVhZHkgZGVwbG95ZWQgLSB2ZXJzaW9uIG1pc21hdGNoIQotZGVwbG95aW5nZXhjZXB0aW9uPURlcGxveWluZyBFeGNlcHRpb24gT2NjdXJlZCB3aXRoIHswfQotc3Ryb3JpbmdmYXVsdHlzZXJ2aWNlPUV4Y2VwdGlvbiBvY2N1cmVkIGFuZCBtYWRlIHRoZSBzZXJ2aWNlIGZhdWx0eSB3aXRoIHswfQotamF4d3NqYXJzbWlzc2luZz1KQVhXUyBqYXJzIGFyZSBtaXNzaW5nIGluIHRoZSBjbGFzc3BhdGggd2l0aCB7MH0sIHN3aXRjaGluZyB0byBhbm5vbmdlbgotZmF1bHR5c2VydmljZXJlbW92YWw9UHJlZGljdGluZyBmYXVsdHkgc2VydmljZSB3aXRoIHswfSwgYW5kIHJlbW92aW5nIGl0ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2phdmEvc2VjdXJpdHkvQWNjZXNzQ29udHJvbGxlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2phdmEvc2VjdXJpdHkvQWNjZXNzQ29udHJvbGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NWM1NDAxLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXZhL3NlY3VyaXR5L0FjY2Vzc0NvbnRyb2xsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF2YS5zZWN1cml0eTsKLQotaW1wb3J0IGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbENvbnRleHQ7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb247Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbjsKLQotLyoqCi0gKiBUaGlzIHV0aWxpdHkgd3JhcHBlciBjbGFzcyBpcyBjcmVhdGVkIHRvIHN1cHBvcnQgQVhJUzIgcnVucwotICogaW5zaWRlIG9mIEphdmEgMiBTZWN1cml0eSBlbnZpcm9ubWVudC4gRHVlIHRvIHRoZSBhY2Nlc3MgY29udHJvbAotICogY2hlY2tpbmcgYWxnb3JpdGhtLCBmb3IgSmF2YSAyIFNlY3VyaXR5IHRvIGZ1bmN0aW9uIHByb3Blcmx5LAotICogPGNvZGU+ZG9Qcml2aWxlZ2VkKCk8L2NvZGU+Ci0gKiBpcyByZXF1aXJlZCBpbiBjYXNlcyB3aGVyZSB0aGVyZSBpcyBhcHBsaWNhdGlvbiBjb2RlIG9uIHRoZSBzdGFjayBmcmFtZQotICogYWNjZXNzaW5nIHRoZSBzeXN0ZW0gcmVzb3VyY2VzIChpZSwgcmVhZC93cml0ZSBmaWxlcywgb3BlbmluZyBwb3J0cywgYW5kIGV0YykuCi0gKiBUaGlzIGNsYXNzIGFsc28gaW1wcm92ZSBwZXJmb3JtYW5jZSBubyBtYXR0aGVyIFNlY3VyaXR5IE1hbmFnZXIgaXMgYmVpbmcgZW5hYmxlZAotICogb3Igbm90LgotICogPHAvPgotICogTm90ZTogVGhpcyB1dGlsaXR5IHNob3VsZCBiZSB1c2VkIHByb3Blcmx5LCBvdGhlcndpc2UgbWlnaHQgaW50cm9kdWNlCi0gKiBzZWN1cml0eSBob2xlcy4KLSAqIDxwLz4KLSAqIFVzYWdlIEV4YW1wbGU6Ci0gKiA8Y29kZT4KLSAqIHB1YmxpYyB2b2lkIGNoYW5nZVBhc3N3b3JkKCkgewotICogLi4uCi0gKiBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEFjdGlvbigpIHsKLSAqIHB1YmxpYyBPYmplY3QgcnVuKCkgewotICogZiA9IFV0aWwub3BlblBhc3N3b3JkRmlsZSgpOwotICogLi4uCi0gKiA8cC8+Ci0gKiB9Ci0gKiB9KTsKLSAqIC4uLgotICogfQotICogPC9jb2RlPgotICovCi0KLQotcHVibGljIGNsYXNzIEFjY2Vzc0NvbnRyb2xsZXIgewotCi0gICAgLyoqCi0gICAgICogUGVyZm9ybXMgdGhlIHNwZWNpZmllZCA8Y29kZT5Qcml2aWxlZ2VkQWN0aW9uPC9jb2RlPiB3aXRoIHByaXZpbGVnZXMKLSAgICAgKiBlbmFibGVkIGlmIGEgc2VjdXJpdHkgbWFuYWdlciBpcyBwcmVzZW50LgotICAgICAqIDxwLz4KLSAgICAgKiBJZiB0aGUgYWN0aW9uJ3MgPGNvZGU+cnVuPC9jb2RlPiBtZXRob2QgdGhyb3dzIGFuICh1bmNoZWNrZWQpIGV4Y2VwdGlvbiwKLSAgICAgKiBpdCB3aWxsIHByb3BhZ2F0ZSB0aHJvdWdoIHRoaXMgbWV0aG9kLgotICAgICAqCi0gICAgICogQHBhcmFtIGFjdGlvbiB0aGUgYWN0aW9uIHRvIGJlIHBlcmZvcm1lZC4KLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSByZXR1cm5lZCBieSB0aGUgYWN0aW9uJ3MgPGNvZGU+cnVuPC9jb2RlPiBtZXRob2QuCi0gICAgICogQHNlZSAjZG9Qcml2aWxlZ2VkKFByaXZpbGVnZWRBY3Rpb24sQWNjZXNzQ29udHJvbENvbnRleHQpCi0gICAgICogQHNlZSAjZG9Qcml2aWxlZ2VkKFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24pCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyA8VD4gVCBkb1ByaXZpbGVnZWQoUHJpdmlsZWdlZEFjdGlvbjxUPiBhY3Rpb24pIHsKLSAgICAgICAgU2VjdXJpdHlNYW5hZ2VyIHNtID0gU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpOwotICAgICAgICBpZiAoc20gPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIChhY3Rpb24ucnVuKCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoYWN0aW9uKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogUGVyZm9ybXMgdGhlIHNwZWNpZmllZCA8Y29kZT5Qcml2aWxlZ2VkQWN0aW9uPC9jb2RlPiB3aXRoIHByaXZpbGVnZXMKLSAgICAgKiBlbmFibGVkIGFuZCByZXN0cmljdGVkIGJ5IHRoZSBzcGVjaWZpZWQgPGNvZGU+QWNjZXNzQ29udHJvbENvbnRleHQ8L2NvZGU+LgotICAgICAqIFRoZSBhY3Rpb24gaXMgcGVyZm9ybWVkIHdpdGggdGhlIGludGVyc2VjdGlvbiBvZiB0aGUgcGVybWlzc2lvbnMKLSAgICAgKiBwb3NzZXNzZWQgYnkgdGhlIGNhbGxlcidzIHByb3RlY3Rpb24gZG9tYWluLCBhbmQgdGhvc2UgcG9zc2Vzc2VkCi0gICAgICogYnkgdGhlIGRvbWFpbnMgcmVwcmVzZW50ZWQgYnkgdGhlIHNwZWNpZmllZAotICAgICAqIDxjb2RlPkFjY2Vzc0NvbnRyb2xDb250ZXh0PC9jb2RlPiBpZiBhIHNlY3VyaXR5IG1hbmFnZXIgaXMgcHJlc2VudC4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIElmIHRoZSBhY3Rpb24ncyA8Y29kZT5ydW48L2NvZGU+IG1ldGhvZCB0aHJvd3MgYW4gKHVuY2hlY2tlZCkgZXhjZXB0aW9uLAotICAgICAqIGl0IHdpbGwgcHJvcGFnYXRlIHRocm91Z2ggdGhpcyBtZXRob2QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYWN0aW9uICB0aGUgYWN0aW9uIHRvIGJlIHBlcmZvcm1lZC4KLSAgICAgKiBAcGFyYW0gY29udGV4dCBhbiA8aT5hY2Nlc3MgY29udHJvbCBjb250ZXh0PC9pPiByZXByZXNlbnRpbmcgdGhlCi0gICAgICogICAgICAgICAgICAgICAgcmVzdHJpY3Rpb24gdG8gYmUgYXBwbGllZCB0byB0aGUgY2FsbGVyJ3MgZG9tYWluJ3MKLSAgICAgKiAgICAgICAgICAgICAgICBwcml2aWxlZ2VzIGJlZm9yZSBwZXJmb3JtaW5nIHRoZSBzcGVjaWZpZWQgYWN0aW9uLgotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIHJldHVybmVkIGJ5IHRoZSBhY3Rpb24ncyA8Y29kZT5ydW48L2NvZGU+IG1ldGhvZC4KLSAgICAgKiBAc2VlICNkb1ByaXZpbGVnZWQoUHJpdmlsZWdlZEFjdGlvbikKLSAgICAgKiBAc2VlICNkb1ByaXZpbGVnZWQoUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbixBY2Nlc3NDb250cm9sQ29udGV4dCkKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIDxUPiBUIGRvUHJpdmlsZWdlZChQcml2aWxlZ2VkQWN0aW9uPFQ+IGFjdGlvbiwgQWNjZXNzQ29udHJvbENvbnRleHQgY29udGV4dCkgewotICAgICAgICBTZWN1cml0eU1hbmFnZXIgc20gPSBTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCk7Ci0gICAgICAgIGlmIChzbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gYWN0aW9uLnJ1bigpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoYWN0aW9uLCBjb250ZXh0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBlcmZvcm1zIHRoZSBzcGVjaWZpZWQgPGNvZGU+UHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbjwvY29kZT4gd2l0aAotICAgICAqIHByaXZpbGVnZXMgZW5hYmxlZC4gIFRoZSBhY3Rpb24gaXMgcGVyZm9ybWVkIHdpdGggPGk+YWxsPC9pPiBvZiB0aGUKLSAgICAgKiBwZXJtaXNzaW9ucyBwb3NzZXNzZWQgYnkgdGhlIGNhbGxlcidzIHByb3RlY3Rpb24gZG9tYWluLgotICAgICAqIDxwLz4KLSAgICAgKiBJZiB0aGUgYWN0aW9uJ3MgPGNvZGU+cnVuPC9jb2RlPiBtZXRob2QgdGhyb3dzIGFuIDxpPnVuY2hlY2tlZDwvaT4KLSAgICAgKiBleGNlcHRpb24sIGl0IHdpbGwgcHJvcGFnYXRlIHRocm91Z2ggdGhpcyBtZXRob2QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYWN0aW9uIHRoZSBhY3Rpb24gdG8gYmUgcGVyZm9ybWVkLgotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIHJldHVybmVkIGJ5IHRoZSBhY3Rpb24ncyA8Y29kZT5ydW48L2NvZGU+IG1ldGhvZC4KLSAgICAgKiBAdGhyb3dzIFByaXZpbGdlZEFjdGlvbkV4Y2VwdGlvbiB0aGUgc3BlY2lmaWVkIGFjdGlvbidzCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvZGU+cnVuPC9jb2RlPiBtZXRob2QgdGhyZXcgYSA8aT5jaGVja2VkPC9pPiBleGNlcHRpb24uCi0gICAgICogQHNlZSAjZG9Qcml2aWxlZ2VkKFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24sQWNjZXNzQ29udHJvbENvbnRleHQpCi0gICAgICogQHNlZSAjZG9Qcml2aWxlZ2VkKFByaXZpbGVnZWRBY3Rpb24pCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyA8VD4gVCBkb1ByaXZpbGVnZWQoUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbjxUPiBhY3Rpb24pCi0gICAgICAgICAgICB0aHJvd3MgUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIFNlY3VyaXR5TWFuYWdlciBzbSA9IFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKTsKLSAgICAgICAgaWYgKHNtID09IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGFjdGlvbi5ydW4oKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKGFjdGlvbik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFBlcmZvcm1zIHRoZSBzcGVjaWZpZWQgPGNvZGU+UHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbjwvY29kZT4gd2l0aAotICAgICAqIHByaXZpbGVnZXMgZW5hYmxlZCBhbmQgcmVzdHJpY3RlZCBieSB0aGUgc3BlY2lmaWVkCi0gICAgICogPGNvZGU+QWNjZXNzQ29udHJvbENvbnRleHQ8L2NvZGU+LiAgVGhlIGFjdGlvbiBpcyBwZXJmb3JtZWQgd2l0aCB0aGUKLSAgICAgKiBpbnRlcnNlY3Rpb24gb2YgdGhlIHRoZSBwZXJtaXNzaW9ucyBwb3NzZXNzZWQgYnkgdGhlIGNhbGxlcidzCi0gICAgICogcHJvdGVjdGlvbiBkb21haW4sIGFuZCB0aG9zZSBwb3NzZXNzZWQgYnkgdGhlIGRvbWFpbnMgcmVwcmVzZW50ZWQgYnkgdGhlCi0gICAgICogc3BlY2lmaWVkIDxjb2RlPkFjY2Vzc0NvbnRyb2xDb250ZXh0PC9jb2RlPi4KLSAgICAgKiA8cC8+Ci0gICAgICogSWYgdGhlIGFjdGlvbidzIDxjb2RlPnJ1bjwvY29kZT4gbWV0aG9kIHRocm93cyBhbiA8aT51bmNoZWNrZWQ8L2k+Ci0gICAgICogZXhjZXB0aW9uLCBpdCB3aWxsIHByb3BhZ2F0ZSB0aHJvdWdoIHRoaXMgbWV0aG9kLgotICAgICAqCi0gICAgICogQHBhcmFtIGFjdGlvbiAgdGhlIGFjdGlvbiB0byBiZSBwZXJmb3JtZWQuCi0gICAgICogQHBhcmFtIGNvbnRleHQgYW4gPGk+YWNjZXNzIGNvbnRyb2wgY29udGV4dDwvaT4gcmVwcmVzZW50aW5nIHRoZQotICAgICAqICAgICAgICAgICAgICAgIHJlc3RyaWN0aW9uIHRvIGJlIGFwcGxpZWQgdG8gdGhlIGNhbGxlcidzIGRvbWFpbidzCi0gICAgICogICAgICAgICAgICAgICAgcHJpdmlsZWdlcyBiZWZvcmUgcGVyZm9ybWluZyB0aGUgc3BlY2lmaWVkIGFjdGlvbi4KLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSByZXR1cm5lZCBieSB0aGUgYWN0aW9uJ3MgPGNvZGU+cnVuPC9jb2RlPiBtZXRob2QuCi0gICAgICogQHRocm93cyBQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uIHRoZSBzcGVjaWZpZWQgYWN0aW9uJ3MKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvZGU+cnVuPC9jb2RlPiBtZXRob2QKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZXcgYSA8aT5jaGVja2VkPC9pPiBleGNlcHRpb24uCi0gICAgICogQHNlZSAjZG9Qcml2aWxlZ2VkKFByaXZpbGVnZWRBY3Rpb24pCi0gICAgICogQHNlZSAjZG9Qcml2aWxlZ2VkKFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24sQWNjZXNzQ29udHJvbENvbnRleHQpCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyA8VD4gVCBkb1ByaXZpbGVnZWQoUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbjxUPiBhY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjY2Vzc0NvbnRyb2xDb250ZXh0IGNvbnRleHQpCi0gICAgICAgICAgICB0aHJvd3MgUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgU2VjdXJpdHlNYW5hZ2VyIHNtID0gU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpOwotICAgICAgICBpZiAoc20gPT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByZXR1cm4gYWN0aW9uLnJ1bigpOwotICAgICAgICAgICAgfSBjYXRjaCAoamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoYWN0aW9uLCBjb250ZXh0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIHRha2VzIGEgInNuYXBzaG90IiBvZiB0aGUgY3VycmVudCBjYWxsaW5nIGNvbnRleHQsIHdoaWNoCi0gICAgICogaW5jbHVkZXMgdGhlIGN1cnJlbnQgVGhyZWFkJ3MgaW5oZXJpdGVkIEFjY2Vzc0NvbnRyb2xDb250ZXh0LAotICAgICAqIGFuZCBwbGFjZXMgaXQgaW4gYW4gQWNjZXNzQ29udHJvbENvbnRleHQgb2JqZWN0LiBUaGlzIGNvbnRleHQgbWF5IHRoZW4KLSAgICAgKiBiZSBjaGVja2VkIGF0IGEgbGF0ZXIgcG9pbnQsIHBvc3NpYmx5IGluIGFub3RoZXIgdGhyZWFkLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgQWNjZXNzQ29udHJvbENvbnRleHQgYmFzZWQgb24gdGhlIGN1cnJlbnQgY29udGV4dC4KLSAgICAgKiBAc2VlIEFjY2Vzc0NvbnRyb2xDb250ZXh0Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBBY2Nlc3NDb250cm9sQ29udGV4dCBnZXRDb250ZXh0KCkgewotICAgICAgICByZXR1cm4gamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyLmdldENvbnRleHQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGFjY2VzcyByZXF1ZXN0IGluZGljYXRlZCBieSB0aGUKLSAgICAgKiBzcGVjaWZpZWQgcGVybWlzc2lvbiBzaG91bGQgYmUgYWxsb3dlZCBvciBkZW5pZWQsIGJhc2VkIG9uCi0gICAgICogdGhlIHNlY3VyaXR5IHBvbGljeSBjdXJyZW50bHkgaW4gZWZmZWN0LgotICAgICAqIFRoaXMgbWV0aG9kIHF1aWV0bHkgcmV0dXJucyBpZiB0aGUgYWNjZXNzIHJlcXVlc3QKLSAgICAgKiBpcyBwZXJtaXR0ZWQsIG9yIHRocm93cyBhIHN1aXRhYmxlIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gb3RoZXJ3aXNlLgotICAgICAqCi0gICAgICogQHBhcmFtIHBlcm0gdGhlIHJlcXVlc3RlZCBwZXJtaXNzaW9uLgotICAgICAqIEB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiBpZiB0aGUgc3BlY2lmaWVkIHBlcm1pc3Npb24KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgbm90IHBlcm1pdHRlZCwgYmFzZWQgb24gdGhlIGN1cnJlbnQgc2VjdXJpdHkgcG9saWN5LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjaGVja1Blcm1pc3Npb24oUGVybWlzc2lvbiBwZXJtKSB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiB7Ci0gICAgICAgIGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlci5jaGVja1Blcm1pc3Npb24ocGVybSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTm8gaW5zdGFudGlhdGlvbiBhbGxvd2VkCi0gICAgICovCi0gICAgcHJpdmF0ZSBBY2Nlc3NDb250cm9sbGVyKCkgewotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9tb2R1bGVzL01vZHVsZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL21vZHVsZXMvTW9kdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4YTA2ZmYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL21vZHVsZXMvTW9kdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5tb2R1bGVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc0Rlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc01vZHVsZTsKLWltcG9ydCBvcmcuYXBhY2hlLm5lZXRoaS5Bc3NlcnRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5uZWV0aGkuUG9saWN5OwotCi0vKioKLSAqIEV2ZXJ5IG1vZHVsZSBwcm92aWRlcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGNsYXNzLiBNb2R1bGVzIGFyZSBpbiBvbmUgb2YKLSAqIHR3byBzdGF0ZXM6ICJhdmFpbGFibGUiIG9yICJlbmdhZ2VkIi4gQWxsIG1vZHVsZXMgdGhhdCB0aGUgcnVudGltZQotICogZGV0ZWN0cyAoZnJvbSB0aGUgc3lzdGVtIG1vZHVsZXMvIGRpcmVjdG9yeSBvciBmcm9tIG90aGVyIG1lYW5zKSBhcmUgc2FpZCB0bwotICogYmUgaW4gdGhlICJhdmFpbGFibGUiIHN0YXRlLiBJZiBzb21lIHNlcnZpY2UgaW5kaWNhdGVzIGEgZGVwZW5kZW5jeSBvbiB0aGlzCi0gKiBtb2R1bGUgdGhlbiB0aGUgbW9kdWxlIGlzIGluaXRpYWxpemVkIChvbmNlIGZvciB0aGUgbGlmZSBvZiB0aGUgc3lzdGVtKSBhbmQKLSAqIHRoZSBzdGF0ZSBjaGFuZ2VzIHRvICJpbml0aWFsaXplZCIuCi0gKiA8cC8+Ci0gKiA8cC8+QW55IG1vZHVsZSB3aGljaCBpcyBpbiB0aGUgImVuZ2FnZWQiIHN0YXRlIGNhbiBiZSBlbmdhZ2VkIGFzIG5lZWRlZAotICogYnkgdGhlIGVuZ2luZSB0byByZXNwb25kIHRvIGEgbWVzc2FnZS4gQ3VycmVudGx5IG1vZHVsZSBlbmdhZ2VtZW50IGlzIGRvbmUKLSAqIHZpYSBkZXBsb3ltZW50ICh1c2luZyBtb2R1bGUueG1sKS4gSW4gdGhlIGZ1dHVyZSB3ZSBtYXkgZW5nYWdlIG1vZHVsZXMKLSAqIHByb2dyYW1tYXRpY2FsbHkgYnkgaW50cm9kdWNpbmcgYW4gZW5nYWdlKCkgbWV0aG9kIHRvIHRoaXMgaW50ZXJmYWNlLCB0aGVyZWJ5Ci0gKiBhbGxvd2luZyBtb3JlIGR5bmFtaWMgc2NlbmFyaW9zLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1vZHVsZSB7Ci0KLSAgICAvLyBpbml0aWFsaXplIHRoZSBtb2R1bGUKLSAgICBwdWJsaWMgdm9pZCBpbml0KENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQsIEF4aXNNb2R1bGUgbW9kdWxlKSB0aHJvd3MgQXhpc0ZhdWx0OwotCi0gICAgLyoqCi0gICAgICogV2hlbiBlbmdhZ2luZyB0aGlzIG1vZHVsZSB0byBzb21lIHNlcnZpY2Ugb3Igb3BlcmF0aW9uICwgbW9kdWxlIHdpbGwgYmUgbm90aWZ5IGJ5IGNhbGxpbmcgdGhpcwotICAgICAqIG1ldGhvZCB0aGVyZSBtb2R1bGUgYXV0aG9yIGNhbiB2YWxpZGF0ZSAsIGFkZCBwb2xpY3kgYW5kIGRvIGFueSB0aGluZyB0aGF0IGhlIHdhbnQgLCBhbmQgaGUgY2FuCi0gICAgICogcmVmdXNlIHRoZSBlbmdhZ2UgYXMgd2VsbAotICAgICAqCi0gICAgICogQHBhcmFtIGF4aXNEZXNjcmlwdGlvbgotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0Ci0gICAgICovCi0gICAgdm9pZCBlbmdhZ2VOb3RpZnkoQXhpc0Rlc2NyaXB0aW9uIGF4aXNEZXNjcmlwdGlvbikgdGhyb3dzIEF4aXNGYXVsdDsKLQotICAgIC8qKgotICAgICAqIEV2YWx1YXRlIHdoZXRoZXIgaXQgY2FuIHN1cHBvcnQgdGhlIHNwZWNpZmllZCBhc3NlcnRpb24gYW5kIHJldHVybnMgdHJ1ZSBpZiB0aGUgYXNzZXJ0aW9uIGNhbgotICAgICAqIGJlIHN1cHBvcnRlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhc3NlcnRpb24gdGhlIGFzc2VydGlvbiB0aGF0IHRoZSBtb2R1bGUgbXVzdCBkZWNpZGUgd2hldGhlciBpdCBjYW4gc3VwcG9ydCBvciBub3QuCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgYXNzZXJ0aW9uIGNhbiBiZSBzdXBwb3J0ZWQgYnkgdGhlIG1vZHVsZQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGNhblN1cHBvcnRBc3NlcnRpb24oQXNzZXJ0aW9uIGFzc2VydGlvbik7Ci0KLSAgICAvKioKLSAgICAgKiBFdmFsdWF0ZXMgc3BlY2lmaWVkIHBvbGljeSBmb3IgdGhlIHNwZWNpZmllZCBBeGlzRGVzY3JpcHRpb24uIEl0IGNvbXB1dGVzIHRoZSBjb25maWd1cmF0aW9uIHRoYXQKLSAgICAgKiBpcyBhcHByb3ByaWF0ZSB0byBzdXBwb3J0IHRoZSBwb2xpY3kgYW5kIHN0b3JlcyBpdCB0aGUgYXBwcm9wcmlhdGUgZGVzY3JpcHRpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcG9saWN5IHRoZSBwb2xpY3kgdGhhdCBpcyBhcHBsaWNhYmxlIGZvciB0aGUgc3BlY2lmaWVkIEF4aXNEZXNjcmlwdGlvbgotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0IGlmIGFueXRoaW5nIGdvZXMgd3JvbmcuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYXBwbHlQb2xpY3koUG9saWN5IHBvbGljeSwgQXhpc0Rlc2NyaXB0aW9uIGF4aXNEZXNjcmlwdGlvbikgdGhyb3dzIEF4aXNGYXVsdDsKLQotCi0gICAgLy8gc2h1dGRvd24gdGhlIG1vZHVsZQotICAgIHB1YmxpYyB2b2lkIHNodXRkb3duKENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ3VyYXRpb25Db250ZXh0KSB0aHJvd3MgQXhpc0ZhdWx0OwotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL25hbWVzcGFjZS9Db25zdGFudHMuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9uYW1lc3BhY2UvQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyM2Y5MjMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL25hbWVzcGFjZS9Db25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIubmFtZXNwYWNlOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotcHVibGljIGNsYXNzIENvbnN0YW50cyB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBWElTMl9OQU1FU1BBQ0VfVVJJID0KLSAgICAgICAgICAgICJodHRwOi8vd3MuYXBhY2hlLm9yZy9uYW1lc3BhY2VzL2F4aXMyIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBWElTMl9OQU1FU1BBQ0VfUFJFRklYID0gImF4aXMyIjsKLQotICAgIC8vIE5hbWVzcGFjZSBQcmVmaXggQ29uc3RhbnRzCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOU19QUkVGSVhfU09BUF9FTlYgPSAic29hcGVudiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlNfUFJFRklYX1NPQVBfRU5DID0gInNvYXBlbmMiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5TX1BSRUZJWF9TQ0hFTUFfWFNJID0gInhzaSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlNfUFJFRklYX1NDSEVNQV9YU0QgPSAieHNkIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOU19QUkVGSVhfV1NETCA9ICJ3c2RsIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOU19QUkVGSVhfV1NETF9TT0FQID0gIndzZGxzb2FwIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOU19QUkVGSVhfWE1MID0gInhtbCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlNfUFJFRklYX1hPUCA9ICJ4b3AiOwotCi0gICAgLy8KLSAgICAvLyBTT0FQLUVOViBOYW1lc3BhY2VzCi0gICAgLy8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUklfU09BUDExX0VOViA9Ci0gICAgICAgICAgICAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVSSV9TT0FQMTJfRU5WID0KLSAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJJX0xJVEVSQUxfRU5DID0gIiI7Ci0KLSAgICAvLwotICAgIC8vIFNPQVAtRU5DIE5hbWVzcGFjZXMKLSAgICAvLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVSSV9TT0FQMTFfRU5DID0KLSAgICAgICAgICAgICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJJX1NPQVAxMl9FTkMgPQotICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbmNvZGluZyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJJX1NPQVAxMl9OT0VOQyA9Ci0gICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlL2VuY29kaW5nL25vbmUiOwotCi0gICAgLy8gTWlzYyBTT0FQIE5hbWVzcGFjZXMgLyBVUklzCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJJX1NPQVAxMV9ORVhUX0FDVE9SID0KLSAgICAgICAgICAgICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2FjdG9yL25leHQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVSSV9TT0FQMTJfTkVYVF9ST0xFID0KLSAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUvcm9sZS9uZXh0IjsKLSAgICAvKioKLSAgICAgKiBAZGVwcmVjYXRlZCB1c2UgVVJJX1NPQVAxMl9ORVhUX1JPTEUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUklfU09BUDEyX05FWFRfQUNUT1IgPSBVUklfU09BUDEyX05FWFRfUk9MRTsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVSSV9TT0FQMTJfUlBDID0KLSAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtcnBjIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVSSV9TT0FQMTJfTk9ORV9ST0xFID0KLSAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUvcm9sZS9ub25lIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUklfU09BUDEyX1VMVElNQVRFX1JPTEUgPQotICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZS9yb2xlL3VsdGltYXRlUmVjZWl2ZXIiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJJX1NPQVAxMV9IVFRQID0KLSAgICAgICAgICAgICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVSSV9TT0FQMTJfSFRUUCA9Ci0gICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9odHRwIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5TX1VSSV9YTUxOUyA9Ci0gICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvMjAwMC94bWxucy8iOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlNfVVJJX1hNTCA9Ci0gICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIjsKLQotICAgIC8vCi0gICAgLy8gU2NoZW1hIFhTRCBOYW1lc3BhY2VzCi0gICAgLy8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUklfMTk5OV9TQ0hFTUFfWFNEID0KLSAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hNTFNjaGVtYSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJJXzIwMDBfU0NIRU1BX1hTRCA9Ci0gICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvMjAwMC8xMC9YTUxTY2hlbWEiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVSSV8yMDAxX1NDSEVNQV9YU0QgPQotICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVSSV9ERUZBVUxUX1NDSEVNQV9YU0QgPSBVUklfMjAwMV9TQ0hFTUFfWFNEOwotCi0gICAgLy8KLSAgICAvLyBTY2hlbWEgWFNJIE5hbWVzcGFjZXMKLSAgICAvLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVSSV8xOTk5X1NDSEVNQV9YU0kgPQotICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnLzE5OTkvWE1MU2NoZW1hLWluc3RhbmNlIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUklfMjAwMF9TQ0hFTUFfWFNJID0KLSAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzEwL1hNTFNjaGVtYS1pbnN0YW5jZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJJXzIwMDFfU0NIRU1BX1hTSSA9Ci0gICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVSSV9ERUZBVUxUX1NDSEVNQV9YU0kgPSBVUklfMjAwMV9TQ0hFTUFfWFNJOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJJX1BPTElDWSA9Ci0gICAgICAgICAgICAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOS9wb2xpY3kiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1BVF9CSU5ESU5HID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvZm9ybWF0YmluZGluZy8iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFfTlMgPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9qYXZhLyI7Ci0gICAgLyoqCi0gICAgICogV1NETCBOYW1lc3BhY2UuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlNfVVJJX1dTREwxMSA9Ci0gICAgICAgICAgICAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlNfVVJJX1dTREwyMCA9Ci0gICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvbnMvd3NkbCI7Ci0KLSAgICAvLwotICAgIC8vIFdTREwgZXh0ZW5zaW9ucyBmb3IgU09BUCBpbiBESU1FCi0gICAgLy8gKGh0dHA6Ly9nb3Rkb3RuZXQuY29tL3RlYW0veG1sX3dzc3BlY3MvZGltZS9XU0RMLUV4dGVuc2lvbi1mb3ItRElNRS5odG0pCi0gICAgLy8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUklfRElNRV9XU0RMID0KLSAgICAgICAgICAgICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDAyLzA0L2RpbWUvd3NkbC8iOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJJX0RJTUVfQ09OVEVOVCA9Ci0gICAgICAgICAgICAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwMi8wNC9jb250ZW50LXR5cGUvIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVSSV9ESU1FX1JFRkVSRU5DRSA9Ci0gICAgICAgICAgICAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwMi8wNC9yZWZlcmVuY2UvIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVSSV9ESU1FX0NMT1NFRF9MQVlPVVQgPQotICAgICAgICAgICAgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDIvMDQvZGltZS9jbG9zZWQtbGF5b3V0IjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVSSV9ESU1FX09QRU5fTEFZT1VUID0KLSAgICAgICAgICAgICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDAyLzA0L2RpbWUvb3Blbi1sYXlvdXQiOwotCi0gICAgLy8gWE9QL01UT00KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUklfWE9QX0lOQ0xVREUgPQotICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgveG9wL2luY2x1ZGUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1fWE9QX0lOQ0xVREUgPSAiSW5jbHVkZSI7Ci0KLQotICAgIC8vCi0gICAgLy8gV1NETCBTT0FQIE5hbWVzcGFjZQotICAgIC8vCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJJX1dTREwxMV9TT0FQID0KLSAgICAgICAgICAgICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUklfV1NETDEyX1NPQVAgPQotICAgICAgICAgICAgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcDEyLyI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX0VOVkVMT1BFID0gIkVudmVsb3BlIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX0hFQURFUiA9ICJIZWFkZXIiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1fQk9EWSA9ICJCb2R5IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX0ZBVUxUID0gIkZhdWx0IjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1fTk9UVU5ERVJTVE9PRCA9ICJOb3RVbmRlcnN0b29kIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX1VQR1JBREUgPSAiVXBncmFkZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTV9TVVBQT1JURURFTlZFTE9QRSA9ICJTdXBwb3J0ZWRFbnZlbG9wZSI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX0ZBVUxUX0NPREUgPSAiZmF1bHRjb2RlIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX0ZBVUxUX1NUUklORyA9ICJmYXVsdHN0cmluZyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTV9GQVVMVF9ERVRBSUwgPSAiZGV0YWlsIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX0ZBVUxUX0FDVE9SID0gImZhdWx0YWN0b3IiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTV9GQVVMVF9DT0RFX1NPQVAxMiA9ICJDb2RlIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX0ZBVUxUX1ZBTFVFX1NPQVAxMiA9ICJWYWx1ZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTV9GQVVMVF9TVUJDT0RFX1NPQVAxMiA9ICJTdWJjb2RlIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX0ZBVUxUX1JFQVNPTl9TT0FQMTIgPSAiUmVhc29uIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX0ZBVUxUX05PREVfU09BUDEyID0gIk5vZGUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1fRkFVTFRfUk9MRV9TT0FQMTIgPSAiUm9sZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTV9GQVVMVF9ERVRBSUxfU09BUDEyID0gIkRldGFpbCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTV9URVhUX1NPQVAxMiA9ICJUZXh0IjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTVVTVF9VTkRFUlNUQU5EID0gIm11c3RVbmRlcnN0YW5kIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0VOQ09ESU5HX1NUWUxFID0gImVuY29kaW5nU3R5bGUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfQUNUT1IgPSAiYWN0b3IiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfUk9MRSA9ICJyb2xlIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1JFTEFZID0gInJlbGF5IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1JPT1QgPSAicm9vdCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9JRCA9ICJpZCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9IUkVGID0gImhyZWYiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfUkVGID0gInJlZiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9RTkFNRSA9ICJxbmFtZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9BUlJBWV9UWVBFID0gImFycmF5VHlwZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9JVEVNX1RZUEUgPSAiaXRlbVR5cGUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfQVJSQVlfU0laRSA9ICJhcnJheVNpemUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfT0ZGU0VUID0gIm9mZnNldCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9QT1NJVElPTiA9ICJwb3NpdGlvbiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9UWVBFID0gInR5cGUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfSEFORExFUklORk9DSEFJTiA9ICJoYW5kbGVySW5mb0NoYWluIjsKLQotICAgIC8vIEZhdWx0IENvZGVzCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGQVVMVF9DTElFTlQgPSAiQ2xpZW50IjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBVUxUX1NFUlZFUl9HRU5FUkFMID0KLSAgICAgICAgICAgICJTZXJ2ZXIuZ2VuZXJhbEV4Y2VwdGlvbiI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGQVVMVF9TRVJWRVJfVVNFUiA9Ci0gICAgICAgICAgICAiU2VydmVyLnVzZXJFeGNlcHRpb24iOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBGQVVMVF9WRVJTSU9OTUlTTUFUQ0ggPQotICAgICAgICAgICAgbmV3IFFOYW1lKFVSSV9TT0FQMTFfRU5WLCAiVmVyc2lvbk1pc21hdGNoIik7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIEZBVUxUX01VU1RVTkRFUlNUQU5EID0KLSAgICAgICAgICAgIG5ldyBRTmFtZShVUklfU09BUDExX0VOViwgIk11c3RVbmRlcnN0YW5kIik7Ci0KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgRkFVTFRfU09BUDEyX01VU1RVTkRFUlNUQU5EID0KLSAgICAgICAgICAgIG5ldyBRTmFtZShVUklfU09BUDEyX0VOViwgIk11c3RVbmRlcnN0YW5kIik7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIEZBVUxUX1NPQVAxMl9WRVJTSU9OTUlTTUFUQ0ggPQotICAgICAgICAgICAgbmV3IFFOYW1lKFVSSV9TT0FQMTJfRU5WLCAiVmVyc2lvbk1pc21hdGNoIik7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIEZBVUxUX1NPQVAxMl9EQVRBRU5DT0RJTkdVTktOT1dOID0KLSAgICAgICAgICAgIG5ldyBRTmFtZShVUklfU09BUDEyX0VOViwgIkRhdGFFbmNvZGluZ1Vua25vd24iKTsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgRkFVTFRfU09BUDEyX1NFTkRFUiA9Ci0gICAgICAgICAgICBuZXcgUU5hbWUoVVJJX1NPQVAxMl9FTlYsICJTZW5kZXIiKTsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgRkFVTFRfU09BUDEyX1JFQ0VJVkVSID0KLSAgICAgICAgICAgIG5ldyBRTmFtZShVUklfU09BUDEyX0VOViwgIlJlY2VpdmVyIik7Ci0KLSAgICAvLyBTT0FQIDEuMiBGYXVsdCBzdWJjb2RlcwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgRkFVTFRfU1VCQ09ERV9CQURBUkdTID0KLSAgICAgICAgICAgIG5ldyBRTmFtZShVUklfU09BUDEyX1JQQywgIkJhZEFyZ3VtZW50cyIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgRkFVTFRfU1VCQ09ERV9QUk9DX05PVF9QUkVTRU5UID0KLSAgICAgICAgICAgIG5ldyBRTmFtZShVUklfU09BUDEyX1JQQywgIlByb2NlZHVyZU5vdFByZXNlbnQiKTsKLQotICAgIC8vIFFOYW1lcwotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBRTkFNRV9GQVVMVENPREUgPQotICAgICAgICAgICAgbmV3IFFOYW1lKCIiLCBFTEVNX0ZBVUxUX0NPREUpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgUU5BTUVfRkFVTFRTVFJJTkcgPQotICAgICAgICAgICAgbmV3IFFOYW1lKCIiLCBFTEVNX0ZBVUxUX1NUUklORyk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBRTkFNRV9GQVVMVEFDVE9SID0KLSAgICAgICAgICAgIG5ldyBRTmFtZSgiIiwgRUxFTV9GQVVMVF9BQ1RPUik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBRTkFNRV9GQVVMVERFVEFJTFMgPQotICAgICAgICAgICAgbmV3IFFOYW1lKCIiLCBFTEVNX0ZBVUxUX0RFVEFJTCk7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFFOQU1FX0ZBVUxUQ09ERV9TT0FQMTIgPQotICAgICAgICAgICAgbmV3IFFOYW1lKFVSSV9TT0FQMTJfRU5WLCBFTEVNX0ZBVUxUX0NPREVfU09BUDEyKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFFOQU1FX0ZBVUxUVkFMVUVfU09BUDEyID0KLSAgICAgICAgICAgIG5ldyBRTmFtZShVUklfU09BUDEyX0VOViwgRUxFTV9GQVVMVF9WQUxVRV9TT0FQMTIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgUU5BTUVfRkFVTFRTVUJDT0RFX1NPQVAxMiA9Ci0gICAgICAgICAgICBuZXcgUU5hbWUoVVJJX1NPQVAxMl9FTlYsIEVMRU1fRkFVTFRfU1VCQ09ERV9TT0FQMTIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgUU5BTUVfRkFVTFRSRUFTT05fU09BUDEyID0KLSAgICAgICAgICAgIG5ldyBRTmFtZShVUklfU09BUDEyX0VOViwgRUxFTV9GQVVMVF9SRUFTT05fU09BUDEyKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFFOQU1FX1RFWFRfU09BUDEyID0KLSAgICAgICAgICAgIG5ldyBRTmFtZShVUklfU09BUDEyX0VOViwgRUxFTV9URVhUX1NPQVAxMik7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFFOQU1FX0ZBVUxUTk9ERV9TT0FQMTIgPQotICAgICAgICAgICAgbmV3IFFOYW1lKFVSSV9TT0FQMTJfRU5WLCBFTEVNX0ZBVUxUX05PREVfU09BUDEyKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFFOQU1FX0ZBVUxUUk9MRV9TT0FQMTIgPQotICAgICAgICAgICAgbmV3IFFOYW1lKFVSSV9TT0FQMTJfRU5WLCBFTEVNX0ZBVUxUX1JPTEVfU09BUDEyKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFFOQU1FX0ZBVUxUREVUQUlMX1NPQVAxMiA9Ci0gICAgICAgICAgICBuZXcgUU5hbWUoVVJJX1NPQVAxMl9FTlYsIEVMRU1fRkFVTFRfREVUQUlMX1NPQVAxMik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBRTkFNRV9OT1RVTkRFUlNUT09EID0KLSAgICAgICAgICAgIG5ldyBRTmFtZShVUklfU09BUDEyX0VOViwgRUxFTV9OT1RVTkRFUlNUT09EKTsKLQotICAgIC8vIERlZmluZSBxbmFtZXMgZm9yIHRoZSBhbGwgb2YgdGhlIFhTRCBhbmQgU09BUC1FTkMgZW5jb2RpbmdzCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBYU0RfU1RSSU5HID0gbmV3IFFOYW1lKFVSSV9ERUZBVUxUX1NDSEVNQV9YU0QsICJzdHJpbmciKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9CT09MRUFOID0gbmV3IFFOYW1lKFVSSV9ERUZBVUxUX1NDSEVNQV9YU0QsICJib29sZWFuIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBYU0RfRE9VQkxFID0gbmV3IFFOYW1lKFVSSV9ERUZBVUxUX1NDSEVNQV9YU0QsICJkb3VibGUiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9GTE9BVCA9IG5ldyBRTmFtZShVUklfREVGQVVMVF9TQ0hFTUFfWFNELCAiZmxvYXQiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9JTlQgPSBuZXcgUU5hbWUoVVJJX0RFRkFVTFRfU0NIRU1BX1hTRCwgImludCIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgWFNEX0lOVEVHRVIgPSBuZXcgUU5hbWUoVVJJX0RFRkFVTFRfU0NIRU1BX1hTRCwgImludGVnZXIiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9MT05HID0gbmV3IFFOYW1lKFVSSV9ERUZBVUxUX1NDSEVNQV9YU0QsICJsb25nIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBYU0RfU0hPUlQgPSBuZXcgUU5hbWUoVVJJX0RFRkFVTFRfU0NIRU1BX1hTRCwgInNob3J0Iik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBYU0RfQllURSA9IG5ldyBRTmFtZShVUklfREVGQVVMVF9TQ0hFTUFfWFNELCAiYnl0ZSIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgWFNEX0RFQ0lNQUwgPSBuZXcgUU5hbWUoVVJJX0RFRkFVTFRfU0NIRU1BX1hTRCwgImRlY2ltYWwiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9CQVNFNjQgPSBuZXcgUU5hbWUoVVJJX0RFRkFVTFRfU0NIRU1BX1hTRCwgImJhc2U2NEJpbmFyeSIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgWFNEX0hFWEJJTiA9IG5ldyBRTmFtZShVUklfREVGQVVMVF9TQ0hFTUFfWFNELCAiaGV4QmluYXJ5Iik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBYU0RfQU5ZU0lNUExFVFlQRSA9Ci0gICAgICAgICAgICBuZXcgUU5hbWUoVVJJX0RFRkFVTFRfU0NIRU1BX1hTRCwgImFueVNpbXBsZVR5cGUiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9BTllUWVBFID0gbmV3IFFOYW1lKFVSSV9ERUZBVUxUX1NDSEVNQV9YU0QsICJhbnlUeXBlIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBYU0RfQU5ZID0gbmV3IFFOYW1lKFVSSV9ERUZBVUxUX1NDSEVNQV9YU0QsICJhbnkiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIEFYSVMyX05PTkUgPSBuZXcgUU5hbWUoImh0dHA6Ly9vcmcuYXBhY2hlLmF4aXMyIiwgIm5vbmUiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9RTkFNRSA9IG5ldyBRTmFtZShVUklfREVGQVVMVF9TQ0hFTUFfWFNELCAiUU5hbWUiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9EQVRFVElNRSA9IG5ldyBRTmFtZShVUklfREVGQVVMVF9TQ0hFTUFfWFNELCAiZGF0ZVRpbWUiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9EQVRFID0gbmV3IFFOYW1lKFVSSV9ERUZBVUxUX1NDSEVNQV9YU0QsICJkYXRlIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBYU0RfVElNRSA9IG5ldyBRTmFtZShVUklfREVGQVVMVF9TQ0hFTUFfWFNELCAidGltZSIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgWFNEX1RJTUVJTlNUQU5UMTk5OSA9IG5ldyBRTmFtZShVUklfMTk5OV9TQ0hFTUFfWFNELCAidGltZUluc3RhbnQiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9USU1FSU5TVEFOVDIwMDAgPSBuZXcgUU5hbWUoVVJJXzIwMDBfU0NIRU1BX1hTRCwgInRpbWVJbnN0YW50Iik7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9OT1JNQUxJWkVEU1RSSU5HID0KLSAgICAgICAgICAgIG5ldyBRTmFtZShVUklfMjAwMV9TQ0hFTUFfWFNELCAibm9ybWFsaXplZFN0cmluZyIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgWFNEX1RPS0VOID0gbmV3IFFOYW1lKFVSSV8yMDAxX1NDSEVNQV9YU0QsICJ0b2tlbiIpOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBYU0RfVU5TSUdORURMT05HID0gbmV3IFFOYW1lKFVSSV8yMDAxX1NDSEVNQV9YU0QsICJ1bnNpZ25lZExvbmciKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9VTlNJR05FRElOVCA9IG5ldyBRTmFtZShVUklfMjAwMV9TQ0hFTUFfWFNELCAidW5zaWduZWRJbnQiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9VTlNJR05FRFNIT1JUID0gbmV3IFFOYW1lKFVSSV8yMDAxX1NDSEVNQV9YU0QsICJ1bnNpZ25lZFNob3J0Iik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBYU0RfVU5TSUdORURCWVRFID0gbmV3IFFOYW1lKFVSSV8yMDAxX1NDSEVNQV9YU0QsICJ1bnNpZ25lZEJ5dGUiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9QT1NJVElWRUlOVEVHRVIgPQotICAgICAgICAgICAgbmV3IFFOYW1lKFVSSV8yMDAxX1NDSEVNQV9YU0QsICJwb3NpdGl2ZUludGVnZXIiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9ORUdBVElWRUlOVEVHRVIgPQotICAgICAgICAgICAgbmV3IFFOYW1lKFVSSV8yMDAxX1NDSEVNQV9YU0QsICJuZWdhdGl2ZUludGVnZXIiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9OT05ORUdBVElWRUlOVEVHRVIgPQotICAgICAgICAgICAgbmV3IFFOYW1lKFVSSV8yMDAxX1NDSEVNQV9YU0QsICJub25OZWdhdGl2ZUludGVnZXIiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9OT05QT1NJVElWRUlOVEVHRVIgPQotICAgICAgICAgICAgbmV3IFFOYW1lKFVSSV8yMDAxX1NDSEVNQV9YU0QsICJub25Qb3NpdGl2ZUludGVnZXIiKTsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgWFNEX1lFQVJNT05USCA9IG5ldyBRTmFtZShVUklfMjAwMV9TQ0hFTUFfWFNELCAiZ1llYXJNb250aCIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgWFNEX01PTlRIREFZID0gbmV3IFFOYW1lKFVSSV8yMDAxX1NDSEVNQV9YU0QsICJnTW9udGhEYXkiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9ZRUFSID0gbmV3IFFOYW1lKFVSSV8yMDAxX1NDSEVNQV9YU0QsICJnWWVhciIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgWFNEX01PTlRIID0gbmV3IFFOYW1lKFVSSV8yMDAxX1NDSEVNQV9YU0QsICJnTW9udGgiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9EQVkgPSBuZXcgUU5hbWUoVVJJXzIwMDFfU0NIRU1BX1hTRCwgImdEYXkiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9EVVJBVElPTiA9IG5ldyBRTmFtZShVUklfMjAwMV9TQ0hFTUFfWFNELCAiZHVyYXRpb24iKTsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgWFNEX05BTUUgPSBuZXcgUU5hbWUoVVJJXzIwMDFfU0NIRU1BX1hTRCwgIk5hbWUiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9OQ05BTUUgPSBuZXcgUU5hbWUoVVJJXzIwMDFfU0NIRU1BX1hTRCwgIk5DTmFtZSIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgWFNEX05NVE9LRU4gPSBuZXcgUU5hbWUoVVJJXzIwMDFfU0NIRU1BX1hTRCwgIk5NVE9LRU4iKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9OTVRPS0VOUyA9IG5ldyBRTmFtZShVUklfMjAwMV9TQ0hFTUFfWFNELCAiTk1UT0tFTlMiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9OT1RBVElPTiA9IG5ldyBRTmFtZShVUklfMjAwMV9TQ0hFTUFfWFNELCAiTk9UQVRJT04iKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9FTlRJVFkgPSBuZXcgUU5hbWUoVVJJXzIwMDFfU0NIRU1BX1hTRCwgIkVOVElUWSIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgWFNEX0VOVElUSUVTID0gbmV3IFFOYW1lKFVSSV8yMDAxX1NDSEVNQV9YU0QsICJFTlRJVElFUyIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgWFNEX0lEUkVGID0gbmV3IFFOYW1lKFVSSV8yMDAxX1NDSEVNQV9YU0QsICJJRFJFRiIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgWFNEX0lEUkVGUyA9IG5ldyBRTmFtZShVUklfMjAwMV9TQ0hFTUFfWFNELCAiSURSRUZTIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBYU0RfQU5ZVVJJID0gbmV3IFFOYW1lKFVSSV8yMDAxX1NDSEVNQV9YU0QsICJhbnlVUkkiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9MQU5HVUFHRSA9IG5ldyBRTmFtZShVUklfMjAwMV9TQ0hFTUFfWFNELCAibGFuZ3VhZ2UiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9JRCA9IG5ldyBRTmFtZShVUklfMjAwMV9TQ0hFTUFfWFNELCAiSUQiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9TQ0hFTUEgPSBuZXcgUU5hbWUoVVJJXzIwMDFfU0NIRU1BX1hTRCwgInNjaGVtYSIpOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBYTUxfTEFORyA9IG5ldyBRTmFtZShOU19VUklfWE1MLCAibGFuZyIpOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBTT0FQX0JBU0U2NCA9IG5ldyBRTmFtZShVUklfU09BUDExX0VOQywgImJhc2U2NCIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgU09BUF9CQVNFNjRCSU5BUlkgPSBuZXcgUU5hbWUoVVJJX1NPQVAxMV9FTkMsICJiYXNlNjRCaW5hcnkiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFNPQVBfU1RSSU5HID0gbmV3IFFOYW1lKFVSSV9TT0FQMTFfRU5DLCAic3RyaW5nIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBTT0FQX0JPT0xFQU4gPSBuZXcgUU5hbWUoVVJJX1NPQVAxMV9FTkMsICJib29sZWFuIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBTT0FQX0RPVUJMRSA9IG5ldyBRTmFtZShVUklfU09BUDExX0VOQywgImRvdWJsZSIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgU09BUF9GTE9BVCA9IG5ldyBRTmFtZShVUklfU09BUDExX0VOQywgImZsb2F0Iik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBTT0FQX0lOVCA9IG5ldyBRTmFtZShVUklfU09BUDExX0VOQywgImludCIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgU09BUF9MT05HID0gbmV3IFFOYW1lKFVSSV9TT0FQMTFfRU5DLCAibG9uZyIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgU09BUF9TSE9SVCA9IG5ldyBRTmFtZShVUklfU09BUDExX0VOQywgInNob3J0Iik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBTT0FQX0JZVEUgPSBuZXcgUU5hbWUoVVJJX1NPQVAxMV9FTkMsICJieXRlIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBTT0FQX0lOVEVHRVIgPSBuZXcgUU5hbWUoVVJJX1NPQVAxMV9FTkMsICJpbnRlZ2VyIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBTT0FQX0RFQ0lNQUwgPSBuZXcgUU5hbWUoVVJJX1NPQVAxMV9FTkMsICJkZWNpbWFsIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBTT0FQX0FSUkFZID0gbmV3IFFOYW1lKFVSSV9TT0FQMTFfRU5DLCAiQXJyYXkiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFNPQVBfQ09NTU9OX0FUVFJTMTEgPSBuZXcgUU5hbWUoVVJJX1NPQVAxMV9FTkMsICJjb21tb25BdHRyaWJ1dGVzIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBTT0FQX0NPTU1PTl9BVFRSUzEyID0gbmV3IFFOYW1lKFVSSV9TT0FQMTJfRU5DLCAiY29tbW9uQXR0cmlidXRlcyIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgU09BUF9BUlJBWV9BVFRSUzExID0gbmV3IFFOYW1lKFVSSV9TT0FQMTFfRU5DLCAiYXJyYXlBdHRyaWJ1dGVzIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBTT0FQX0FSUkFZX0FUVFJTMTIgPSBuZXcgUU5hbWUoVVJJX1NPQVAxMl9FTkMsICJhcnJheUF0dHJpYnV0ZXMiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFNPQVBfQVJSQVkxMiA9IG5ldyBRTmFtZShVUklfU09BUDEyX0VOQywgIkFycmF5Iik7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFFOQU1FX0xJVEVSQUxfSVRFTSA9IG5ldyBRTmFtZShVUklfTElURVJBTF9FTkMsICJpdGVtIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBRTkFNRV9SUENfUkVTVUxUID0gbmV3IFFOYW1lKFVSSV9TT0FQMTJfUlBDLCAicmVzdWx0Iik7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNSU1FX0NUX0FQUExJQ0FUSU9OX09DVEVUU1RSRUFNID0gImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlNRV9DVF9URVhUX1BMQUlOID0gInRleHQvcGxhaW4iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1JTUVfQ1RfSU1BR0VfSlBFRyA9ICJpbWFnZS9qcGVnIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNSU1FX0NUX0lNQUdFX0dJRiA9ICJpbWFnZS9naWYiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1JTUVfQ1RfVEVYVF9YTUwgPSAidGV4dC94bWwiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1JTUVfQ1RfQVBQTElDQVRJT05fWE1MID0gImFwcGxpY2F0aW9uL3htbCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlNRV9DVF9NVUxUSVBBUlRfUFJFRklYID0gIm11bHRpcGFydC8iOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBCQVNFXzY0X0NPTlRFTlRfUU5BTUUgPQotICAgICAgICAgICAgbmV3IFFOYW1lKFVSSV8yMDAxX1NDSEVNQV9YU0QsICJiYXNlNjRCaW5hcnkiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhNSU1FX0NPTlRFTlRfVFlQRV9RTkFNRSA9Ci0gICAgICAgICAgICBuZXcgUU5hbWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDYveG1sbWltZSIsICJjb250ZW50VHlwZSIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVSSV9TRUNVUklUWVBPTElDWSA9Ci0gICAgICAgICAgICAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNS8wNy9zZWN1cml0eXBvbGljeSI7Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvcGhhc2VyZXNvbHZlci9QaGFzZUV4Y2VwdGlvbi5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3BoYXNlcmVzb2x2ZXIvUGhhc2VFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU2ZmJhOS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvcGhhc2VyZXNvbHZlci9QaGFzZUV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucGhhc2VyZXNvbHZlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotCi0vKioKLSAqIENsYXNzIFBoYXNlRXhjZXB0aW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBQaGFzZUV4Y2VwdGlvbiBleHRlbmRzIEF4aXNGYXVsdCB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA1NjkwNTAzMzk2NzI0OTI5MzIyTDsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIFBoYXNlRXhjZXB0aW9uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyBQaGFzZUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBQaGFzZUV4Y2VwdGlvbgotICAgICAqCi0gICAgICogQHBhcmFtIGNhdXNlCi0gICAgICovCi0gICAgcHVibGljIFBoYXNlRXhjZXB0aW9uKFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICBzdXBlcihjYXVzZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgUGhhc2VFeGNlcHRpb24KLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXNzYWdlCi0gICAgICogQHBhcmFtIGNhdXNlCi0gICAgICovCi0gICAgcHVibGljIFBoYXNlRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9waGFzZXJlc29sdmVyL1BoYXNlSG9sZGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvcGhhc2VyZXNvbHZlci9QaGFzZUhvbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDNjNmY1Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9waGFzZXJlc29sdmVyL1BoYXNlSG9sZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucGhhc2VyZXNvbHZlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC5EZXBsb3ltZW50RXJyb3JNc2dzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uSGFuZGxlckRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGhhc2VSdWxlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLlBoYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaTE4bi5NZXNzYWdlczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaG9sZCBhbGwgdGhlIHBoYXNlcyBmb3VuZCBpbiB0aGUgc2VydmljZXMueG1sIGFuZCBzZXJ2ZXIueG1sCi0gKi8KLXB1YmxpYyBjbGFzcyBQaGFzZUhvbGRlciB7Ci0gICAgcHJpdmF0ZSBMaXN0IHBoYXNlTGlzdDsKLQotICAgIHB1YmxpYyBQaGFzZUhvbGRlcigpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUGhhc2VIb2xkZXIoTGlzdCBwaGFzZXMpIHsKLSAgICAgICAgdGhpcy5waGFzZUxpc3QgPSBwaGFzZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSWYgdGhlIHBoYXNlIG5hbWUgaXMgZXF1YWwgdG8gIioiIHRoYXQgaW1wbGllcyAsIHRoZSBoYW5kbGVyIHNob3VsZCBiZQotICAgICAqIGFkZGVkIHRvIGVhY2ggYW5kIGV2ZXJ5IHBoYXNlIGluIHRoZSBzeXN0ZW0gZm9yIGEgZ2l2ZW4gZmxvdyAgLCBhbmQgYXQgdGhhdAotICAgICAqIHBvaW50IGlmIHRoZSBwaGFzZSBydWxlIGNvbnRhaW5zIGFueSBiZWZvcmVzIG9yIGFmdGVycyB0aGVuIHRoZXkgd2lsbCBiZQotICAgICAqIGlnbm9yZWQuIFBoYXNlIGZpcnN0IGFuZCBwaGFzZSBsYXN0IGFyZSBzdXBwb3J0ZWQgLCBidXQgbWFrZSBzdXJlIHlvdSBkb250Ci0gICAgICogYnJlYWsgYW55IG9mIHRoZSBwaGFzZSBydWxlcy4KLSAgICAgKiA8cC8+Ci0gICAgICogSWYgdGhlIHBoYXNlIG5hbWUgaXMgbm90IGFib3ZlIHRoZW4gdGhlIGhhZGxlciB3aWxsIGJlIGFkZGVkIHRvIHRoZSBwaGFzZQotICAgICAqIHNwZWNpZmllZCBieSAgdGhlIHBoYXNlIHJ1bGUgLCBhbmQgbm8gcnVsZXMgd2lsbCBiZSBpZ25vcmVkLgotICAgICAqCi0gICAgICogQHBhcmFtIGhhbmRsZXJEZXNjIEhhbmRsZXJEZXNjcmlwdGlvbiB0byBkZXBsb3kKLSAgICAgKiBAdGhyb3dzIFBoYXNlRXhjZXB0aW9uIGlmIHRoZXJlJ3MgYSBwcm9ibGVtCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkSGFuZGxlcihIYW5kbGVyRGVzY3JpcHRpb24gaGFuZGxlckRlc2MpIHRocm93cyBQaGFzZUV4Y2VwdGlvbiB7Ci0gICAgICAgIFBoYXNlUnVsZSBydWxlID0gaGFuZGxlckRlc2MuZ2V0UnVsZXMoKTsKLQotICAgICAgICAvLyBNYWtlIHN1cmUgdGhpcyBydWxlIG1ha2VzIHNlbnNlICh0aHJvd3MgUGhhc2VFeGNlcHRpb24gaWYgbm90KQotICAgICAgICBydWxlLnZhbGlkYXRlKCk7Ci0KLSAgICAgICAgU3RyaW5nIHBoYXNlTmFtZSA9IHJ1bGUuZ2V0UGhhc2VOYW1lKCk7Ci0gICAgICAgIGlmIChQaGFzZS5BTExfUEhBU0VTLmVxdWFscyhwaGFzZU5hbWUpKSB7Ci0gICAgICAgICAgICBoYW5kbGVyRGVzYy5nZXRSdWxlcygpLnNldEJlZm9yZSgiIik7Ci0gICAgICAgICAgICBoYW5kbGVyRGVzYy5nZXRSdWxlcygpLnNldEFmdGVyKCIiKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGhhc2VMaXN0LnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgUGhhc2UgcGhhc2UgPSAoUGhhc2UpIHBoYXNlTGlzdC5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgcGhhc2UuYWRkSGFuZGxlcihoYW5kbGVyRGVzYyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAocGhhc2VFeGlzdHMocGhhc2VOYW1lKSkgewotICAgICAgICAgICAgICAgIGdldFBoYXNlKHBoYXNlTmFtZSkuYWRkSGFuZGxlcihoYW5kbGVyRGVzYyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBQaGFzZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKERlcGxveW1lbnRFcnJvck1zZ3MuSU5WQUxJRF9QSEFTRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaGFzZU5hbWUsIGhhbmRsZXJEZXNjLmdldE5hbWUoKSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogdGhpcyBtZXRob2QgaXMgdXNlZCB0byBnZXQgdGhlIGFjdHVhbCBwaGFzZSBvYmplY3QgZ2l2ZW4gaW4gdGhlIHBoYXNlIGFycmF5IGxpc3QKLSAgICAgKgotICAgICAqIEBwYXJhbSBwaGFzZU5hbWUgdGhlIG5hbWUgb2YgdGhlIGRlc2lyZWQgUGhhc2UKLSAgICAgKiBAcmV0dXJuIHRoZSBtYXRjaGluZyBQaGFzZSwgb3IgbnVsbAotICAgICAqLwotICAgIHByaXZhdGUgUGhhc2UgZ2V0UGhhc2UoU3RyaW5nIHBoYXNlTmFtZSkgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBoYXNlTGlzdC5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgUGhhc2UgcGhhc2UgPSAoUGhhc2UpIHBoYXNlTGlzdC5nZXQoaSk7Ci0KLSAgICAgICAgICAgIGlmIChwaGFzZS5nZXRQaGFzZU5hbWUoKS5lcXVhbHMocGhhc2VOYW1lKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBwaGFzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrIGlmIGEgbmFtZWQgUGhhc2UgZXhpc3RzIGluIHRoaXMgaG9sZGVyLgotICAgICAqCi0gICAgICogQHBhcmFtIHBoYXNlTmFtZSBuYW1lIHRvIGNoZWNrCi0gICAgICogQHJldHVybiB0cnVlIGlmIGEgUGhhc2UgbWF0Y2hpbmcgdGhlIG5hbWUgd2FzIGZvdW5kLCBmYWxzZSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gcGhhc2VFeGlzdHMoU3RyaW5nIHBoYXNlTmFtZSkgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBoYXNlTGlzdC5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgUGhhc2UgcGhhc2UgPSAoUGhhc2UpIHBoYXNlTGlzdC5nZXQoaSk7Ci0KLSAgICAgICAgICAgIGlmIChwaGFzZS5nZXRQaGFzZU5hbWUoKS5lcXVhbHMocGhhc2VOYW1lKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9waGFzZXJlc29sdmVyL1BoYXNlTWV0YWRhdGEuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9waGFzZXJlc29sdmVyL1BoYXNlTWV0YWRhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU0ZWI2Zi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvcGhhc2VyZXNvbHZlci9QaGFzZU1ldGFkYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5waGFzZXJlc29sdmVyOwotCi0vKioKLSAqIENsYXNzIFBoYXNlTWV0YWRhdGEKLSAqLwotcHVibGljIGNsYXNzIFBoYXNlTWV0YWRhdGEgewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOX0ZMT1cgPSAxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9VVF9GTE9XID0gMjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGQVVMVF9PVVRfRkxPVyA9IDQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkFVTFRfSU5fRkxPVyA9IDM7Ci0KLSAgICAvLyBJTkZMT1cKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQSEFTRV9UUkFOU1BPUlRJTiA9ICJUcmFuc3BvcnRJbiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEhBU0VfUFJFX0RJU1BBVENIID0gIlByZURpc3BhdGNoIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQSEFTRV9QT1NUX0RJU1BBVENIID0gIlBvc3REaXNwYXRjaCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEhBU0VfUE9MSUNZX0RFVEVSTUlOQVRJT04gPSAiUG9saWN5RGV0ZXJtaW5hdGlvbiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEhBU0VfTUVTU0FHRV9QUk9DRVNTSU5HID0gIk1lc3NhZ2VQcm9jZXNzaW5nIjsKLQotICAgIC8vIE9VVEZMT1cKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQSEFTRV9NRVNTQUdFX09VVCA9ICJNZXNzYWdlT3V0IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQSEFTRV9ESVNQQVRDSCA9ICJEaXNwYXRjaCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEhBU0VfVFJBTlNQT1JUX09VVCA9ICJUcmFuc3BvcnRPdXQiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJBTlNQT1JUX1BIQVNFID0gIlRSQU5TUE9SVCI7Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvcGhhc2VyZXNvbHZlci9QaGFzZVJlc29sdmVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvcGhhc2VyZXNvbHZlci9QaGFzZVJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzNTc5NzYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3BoYXNlcmVzb2x2ZXIvUGhhc2VSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnBoYXNlcmVzb2x2ZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNNZXNzYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc01vZHVsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5GbG93OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uSGFuZGxlckRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLlBoYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMQ29uc3RhbnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogQ2xhc3MgUGhhc2VSZXNvbHZlcgotICovCi1wdWJsaWMgY2xhc3MgUGhhc2VSZXNvbHZlciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5fRkxPVyA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9VVF9GQVVMVF9GTE9XID0gNTsKLQotICAgIC8qKgotICAgICAqIEZpZWxkIGF4aXNDb25maWcKLSAgICAgKi8KLSAgICBwcml2YXRlIEF4aXNDb25maWd1cmF0aW9uIGF4aXNDb25maWc7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBwaGFzZUhvbGRlcgotICAgICAqLwotICAgIHByaXZhdGUgUGhhc2VIb2xkZXIgcGhhc2VIb2xkZXI7Ci0KLSAgICAvKioKLSAgICAgKiBkZWZhdWx0IGNvbnN0cnVjdG9yICwgdG8gb2J1aWxkIGNoYWlucyBmb3IgR2xvYmFsRGVzY3JpcHRpb24KLSAgICAgKgotICAgICAqIEBwYXJhbSBheGlzY29uZmlnCi0gICAgICovCi0gICAgcHVibGljIFBoYXNlUmVzb2x2ZXIoQXhpc0NvbmZpZ3VyYXRpb24gYXhpc2NvbmZpZykgewotICAgICAgICB0aGlzLmF4aXNDb25maWcgPSBheGlzY29uZmlnOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBlbmdhZ2VNb2R1bGVUb0Zsb3coRmxvdyBmbG93LCBMaXN0IGhhbmRsZXJDaGFpbikgdGhyb3dzIFBoYXNlRXhjZXB0aW9uIHsKLSAgICAgICAgcGhhc2VIb2xkZXIgPSBuZXcgUGhhc2VIb2xkZXIoaGFuZGxlckNoYWluKTsKLSAgICAgICAgaWYgKGZsb3cgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBmbG93LmdldEhhbmRsZXJDb3VudCgpOyBqKyspIHsKLSAgICAgICAgICAgICAgICBIYW5kbGVyRGVzY3JpcHRpb24gbWV0YWRhdGEgPSBmbG93LmdldEhhbmRsZXIoaik7Ci0gICAgICAgICAgICAgICAgcGhhc2VIb2xkZXIuYWRkSGFuZGxlcihtZXRhZGF0YSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZW5nYWdlTW9kdWxlVG9PcGVyYXRpb24oQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBeGlzTW9kdWxlIGF4aXNNb2R1bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbG93VHlwZSkgdGhyb3dzIFBoYXNlRXhjZXB0aW9uIHsKLSAgICAgICAgTGlzdCBwaGFzZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIEZsb3cgZmxvdyA9IG51bGw7Ci0gICAgICAgIHN3aXRjaCAoZmxvd1R5cGUpIHsKLSAgICAgICAgICAgIGNhc2UgUGhhc2VNZXRhZGF0YS5JTl9GTE9XIDogewotICAgICAgICAgICAgICAgIHBoYXNlcy5hZGRBbGwoYXhpc0NvbmZpZy5nZXRJbkZsb3dQaGFzZXMoKSk7Ci0gICAgICAgICAgICAgICAgcGhhc2VzLmFkZEFsbChheGlzT3BlcmF0aW9uLmdldFJlbWFpbmluZ1BoYXNlc0luRmxvdygpKTsKLSAgICAgICAgICAgICAgICBmbG93ID0gYXhpc01vZHVsZS5nZXRJbkZsb3coKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgUGhhc2VNZXRhZGF0YS5PVVRfRkxPVyA6IHsKLSAgICAgICAgICAgICAgICBwaGFzZXMuYWRkQWxsKGF4aXNPcGVyYXRpb24uZ2V0UGhhc2VzT3V0RmxvdygpKTsKLSAgICAgICAgICAgICAgICBwaGFzZXMuYWRkQWxsKGF4aXNDb25maWcuZ2V0T3V0Rmxvd1BoYXNlcygpKTsKLSAgICAgICAgICAgICAgICBmbG93ID0gYXhpc01vZHVsZS5nZXRPdXRGbG93KCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFBoYXNlTWV0YWRhdGEuRkFVTFRfT1VUX0ZMT1cgOiB7Ci0gICAgICAgICAgICAgICAgcGhhc2VzLmFkZEFsbChheGlzT3BlcmF0aW9uLmdldFBoYXNlc091dEZhdWx0RmxvdygpKTsKLSAgICAgICAgICAgICAgICBwaGFzZXMuYWRkQWxsKGF4aXNDb25maWcuZ2V0T3V0RmF1bHRGbG93UGhhc2VzKCkpOwotICAgICAgICAgICAgICAgIGZsb3cgPSBheGlzTW9kdWxlLmdldEZhdWx0T3V0RmxvdygpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBQaGFzZU1ldGFkYXRhLkZBVUxUX0lOX0ZMT1cgOiB7Ci0gICAgICAgICAgICAgICAgcGhhc2VzLmFkZEFsbChheGlzT3BlcmF0aW9uLmdldFBoYXNlc0luRmF1bHRGbG93KCkpOwotICAgICAgICAgICAgICAgIHBoYXNlcy5hZGRBbGwoYXhpc0NvbmZpZy5nZXRJbkZhdWx0Rmxvd1BoYXNlcygpKTsKLSAgICAgICAgICAgICAgICBmbG93ID0gYXhpc01vZHVsZS5nZXRGYXVsdEluRmxvdygpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVuZ2FnZU1vZHVsZVRvRmxvdyhmbG93LCBwaGFzZXMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVuZ2FnZU1vZHVsZVRvT3BlcmF0aW9uKEF4aXNPcGVyYXRpb24gYXhpc09wZXJhdGlvbiwgQXhpc01vZHVsZSBtb2R1bGUpCi0gICAgICAgICAgICB0aHJvd3MgUGhhc2VFeGNlcHRpb24gewotICAgICAgICBmb3IgKGludCB0eXBlID0gSU5fRkxPVzsgdHlwZSA8IE9VVF9GQVVMVF9GTE9XOyB0eXBlKyspIHsKLSAgICAgICAgICAgIGVuZ2FnZU1vZHVsZVRvT3BlcmF0aW9uKGF4aXNPcGVyYXRpb24sIG1vZHVsZSwgdHlwZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUbyByZW1vdmUgaGFuZGxlcnMgZnJvbSBnbG9iYWwgY2hpYW5zIHRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkICwgZmlyc3QgaXQgdGFrZSBpbmZsb3cKLSAgICAgKiBvZiB0aGUgbW9kdWxlIGFuZCB0aGVuIHRha2UgaGFuZGxlciBvbmUgYnkgb25lIGFuZCB0aGVuIHJlbW92ZSB0aG9zZSBoYW5kbGVycyBmcm9tCi0gICAgICogZ2xvYmFsIGluY2hhaW4gLAotICAgICAqIHRoZSBzYW1lIHByb2NlZHVyZSB3aWxsIGJlIGNhcnJ5IG91dCBmb3IgYWxsIHRoZSBvdGhlciBmbG93cyBhcyB3ZWxsLgotICAgICAqCi0gICAgICogQHBhcmFtIG1vZHVsZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRpc2VuZ2FnZU1vZHVsZUZyb21HbG9iYWxDaGFpbnMoQXhpc01vZHVsZSBtb2R1bGUpIHsKLSAgICAgICAgLy9JTkZMT1cKLSAgICAgICAgRmxvdyBmbG93ID0gbW9kdWxlLmdldEluRmxvdygpOwotICAgICAgICBpZiAoZmxvdyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGZsb3cuZ2V0SGFuZGxlckNvdW50KCk7IGorKykgewotICAgICAgICAgICAgICAgIEhhbmRsZXJEZXNjcmlwdGlvbiBoYW5kbGVyID0gZmxvdy5nZXRIYW5kbGVyKGopOwotICAgICAgICAgICAgICAgIHJlbW92ZUhhbmRsZXJmcm9tYVBoYXNlKGhhbmRsZXIsIGF4aXNDb25maWcuZ2V0SW5GbG93UGhhc2VzKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vT1VURkxPVwotICAgICAgICBmbG93ID0gbW9kdWxlLmdldE91dEZsb3coKTsKLSAgICAgICAgaWYgKGZsb3cgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBmbG93LmdldEhhbmRsZXJDb3VudCgpOyBqKyspIHsKLSAgICAgICAgICAgICAgICBIYW5kbGVyRGVzY3JpcHRpb24gaGFuZGxlciA9IGZsb3cuZ2V0SGFuZGxlcihqKTsKLSAgICAgICAgICAgICAgICByZW1vdmVIYW5kbGVyZnJvbWFQaGFzZShoYW5kbGVyLCBheGlzQ29uZmlnLmdldE91dEZsb3dQaGFzZXMoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy9JTkZBVUxURkxPVwotICAgICAgICBmbG93ID0gbW9kdWxlLmdldEZhdWx0SW5GbG93KCk7Ci0gICAgICAgIGlmIChmbG93ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgZmxvdy5nZXRIYW5kbGVyQ291bnQoKTsgaisrKSB7Ci0gICAgICAgICAgICAgICAgSGFuZGxlckRlc2NyaXB0aW9uIGhhbmRsZXIgPSBmbG93LmdldEhhbmRsZXIoaik7Ci0gICAgICAgICAgICAgICAgcmVtb3ZlSGFuZGxlcmZyb21hUGhhc2UoaGFuZGxlciwgYXhpc0NvbmZpZy5nZXRJbkZhdWx0Rmxvd1BoYXNlcygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvL09VVEZBVUxURkxPVwotICAgICAgICBmbG93ID0gbW9kdWxlLmdldEZhdWx0T3V0RmxvdygpOwotICAgICAgICBpZiAoZmxvdyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGZsb3cuZ2V0SGFuZGxlckNvdW50KCk7IGorKykgewotICAgICAgICAgICAgICAgIEhhbmRsZXJEZXNjcmlwdGlvbiBoYW5kbGVyID0gZmxvdy5nZXRIYW5kbGVyKGopOwotICAgICAgICAgICAgICAgIHJlbW92ZUhhbmRsZXJmcm9tYVBoYXNlKGhhbmRsZXIsIGF4aXNDb25maWcuZ2V0T3V0RmF1bHRGbG93UGhhc2VzKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVG8gcmVtb3ZlIGhhbmRsZXJzIGZyb20gb3BlcmF0aW9ucyBjaGlhbnMgdGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgLCBmaXJzdCBpdCB0YWtlIGluZmxvdwotICAgICAqIG9mIHRoZSBtb2R1bGUgYW5kIHRoZW4gdGFrZSBoYW5kbGVyIG9uZSBieSBvbmUgYW5kIHRoZW4gcmVtb3ZlIHRob3NlIGhhbmRsZXJzIGZyb20KLSAgICAgKiBnbG9iYWwgaW5jaGFpbiAsCi0gICAgICogdGhlIHNhbWUgcHJvY2VkdXJlIHdpbGwgYmUgY2Fycnkgb3V0IGZvciBhbGwgdGhlIG90aGVyIGZsb3dzIGFzIHdlbGwuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbW9kdWxlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGlzZW5nYWdlTW9kdWxlRnJvbU9wZXJhdGlvbkNoYWluKEF4aXNNb2R1bGUgbW9kdWxlLCBBeGlzT3BlcmF0aW9uIG9wZXJhdGlvbikgewotICAgICAgICAvL0lORkxPVwotICAgICAgICBGbG93IGZsb3cgPSBtb2R1bGUuZ2V0SW5GbG93KCk7Ci0gICAgICAgIGlmIChmbG93ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgZmxvdy5nZXRIYW5kbGVyQ291bnQoKTsgaisrKSB7Ci0gICAgICAgICAgICAgICAgSGFuZGxlckRlc2NyaXB0aW9uIGhhbmRsZXIgPSBmbG93LmdldEhhbmRsZXIoaik7Ci0gICAgICAgICAgICAgICAgcmVtb3ZlSGFuZGxlcmZyb21hUGhhc2UoaGFuZGxlciwgb3BlcmF0aW9uLmdldFJlbWFpbmluZ1BoYXNlc0luRmxvdygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvL09VVEZMT1cKLSAgICAgICAgZmxvdyA9IG1vZHVsZS5nZXRPdXRGbG93KCk7Ci0gICAgICAgIGlmIChmbG93ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgZmxvdy5nZXRIYW5kbGVyQ291bnQoKTsgaisrKSB7Ci0gICAgICAgICAgICAgICAgSGFuZGxlckRlc2NyaXB0aW9uIGhhbmRsZXIgPSBmbG93LmdldEhhbmRsZXIoaik7Ci0gICAgICAgICAgICAgICAgcmVtb3ZlSGFuZGxlcmZyb21hUGhhc2UoaGFuZGxlciwgb3BlcmF0aW9uLmdldFBoYXNlc091dEZsb3coKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy9JTkZBVUxURkxPVwotICAgICAgICBmbG93ID0gbW9kdWxlLmdldEZhdWx0SW5GbG93KCk7Ci0gICAgICAgIGlmIChmbG93ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgZmxvdy5nZXRIYW5kbGVyQ291bnQoKTsgaisrKSB7Ci0gICAgICAgICAgICAgICAgSGFuZGxlckRlc2NyaXB0aW9uIGhhbmRsZXIgPSBmbG93LmdldEhhbmRsZXIoaik7Ci0gICAgICAgICAgICAgICAgcmVtb3ZlSGFuZGxlcmZyb21hUGhhc2UoaGFuZGxlciwgb3BlcmF0aW9uLmdldFBoYXNlc0luRmF1bHRGbG93KCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vT1VURkFVTFRGTE9XCi0gICAgICAgIGZsb3cgPSBtb2R1bGUuZ2V0RmF1bHRPdXRGbG93KCk7Ci0gICAgICAgIGlmIChmbG93ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgZmxvdy5nZXRIYW5kbGVyQ291bnQoKTsgaisrKSB7Ci0gICAgICAgICAgICAgICAgSGFuZGxlckRlc2NyaXB0aW9uIGhhbmRsZXIgPSBmbG93LmdldEhhbmRsZXIoaik7Ci0gICAgICAgICAgICAgICAgcmVtb3ZlSGFuZGxlcmZyb21hUGhhc2UoaGFuZGxlciwgb3BlcmF0aW9uLmdldFBoYXNlc091dEZhdWx0RmxvdygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRvIHJlbW92ZSBhIHNpbmdsZSBoYW5kbGVyIGZyb20gYSBnaXZlbiBsaXN0IG9mIHBoYXNlcwotICAgICAqCi0gICAgICogQHBhcmFtIGhhbmRsZXIKLSAgICAgKiBAcGFyYW0gcGhhc2VMaXN0Ci0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHJlbW92ZUhhbmRsZXJmcm9tYVBoYXNlKEhhbmRsZXJEZXNjcmlwdGlvbiBoYW5kbGVyLCBMaXN0PFBoYXNlPiBwaGFzZUxpc3QpIHsKLSAgICAgICAgU3RyaW5nIHBoYXNlTmFtZSA9IGhhbmRsZXIuZ2V0UnVsZXMoKS5nZXRQaGFzZU5hbWUoKTsKLSAgICAgICAgSXRlcmF0b3I8UGhhc2U+IHBoYXNlSXRyID0gcGhhc2VMaXN0Lml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChwaGFzZUl0ci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIFBoYXNlIHBoYXNlID0gKFBoYXNlKSBwaGFzZUl0ci5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAocGhhc2UuZ2V0UGhhc2VOYW1lKCkuZXF1YWxzKHBoYXNlTmFtZSkpIHsKLSAgICAgICAgICAgICAgICBwaGFzZS5yZW1vdmVIYW5kbGVyKGhhbmRsZXIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZW5nYWdlTW9kdWxlVG9NZXNzYWdlKEF4aXNNZXNzYWdlIGF4aXNNZXNzYWdlLCBBeGlzTW9kdWxlIGF4aXNNb2R1bGUpCi0gICAgICAgICAgICB0aHJvd3MgUGhhc2VFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgZGlyZWN0aW9uID0gYXhpc01lc3NhZ2UuZ2V0RGlyZWN0aW9uKCk7Ci0gICAgICAgIEF4aXNPcGVyYXRpb24gYXhpc09wZXJhdGlvbiA9IGF4aXNNZXNzYWdlLmdldEF4aXNPcGVyYXRpb24oKTsKLSAgICAgICAgaWYgKFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9PVVRfVkFMVUUuZXF1YWxzSWdub3JlQ2FzZShkaXJlY3Rpb24pKSB7Ci0gICAgICAgICAgICBlbmdhZ2VNb2R1bGVUb09wZXJhdGlvbihheGlzT3BlcmF0aW9uLCBheGlzTW9kdWxlLCBQaGFzZU1ldGFkYXRhLk9VVF9GTE9XKTsKLSAgICAgICAgfSBlbHNlIGlmIChXU0RMQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfSU5fVkFMVUUuZXF1YWxzSWdub3JlQ2FzZShkaXJlY3Rpb24pKSB7Ci0gICAgICAgICAgICBlbmdhZ2VNb2R1bGVUb09wZXJhdGlvbihheGlzT3BlcmF0aW9uLCBheGlzTW9kdWxlLCBQaGFzZU1ldGFkYXRhLklOX0ZMT1cpOwotICAgICAgICB9IGVsc2UgaWYgKFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9GQVVMVF9WQUxVRS5lcXVhbHMoZGlyZWN0aW9uKSkgewotICAgICAgICAgICAgLy9UT0RPIDogTmVlZCB0byBoYW5kbGUgZmF1bHQgY29ycmVjdGx5Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvcmVjZWl2ZXJzL0Fic3RyYWN0SW5NZXNzYWdlUmVjZWl2ZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9yZWNlaXZlcnMvQWJzdHJhY3RJbk1lc3NhZ2VSZWNlaXZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmUyOTcxLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9yZWNlaXZlcnMvQWJzdHJhY3RJbk1lc3NhZ2VSZWNlaXZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzOwotCi0vKioKLSAqIFRoaXMgaXMgdGFrZXMgY2FyZSBvZiB0aGUgSU4tT05MWSBNRVAgb24gdGhlIHNlcnZlciBzaWRlCi0gKgotICogVE9ETzogRGVwcmVjYXRlIHRoaXMgYW5kIHVzZSBBTVIgZGlyZWN0bHk/Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEluTWVzc2FnZVJlY2VpdmVyIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlUmVjZWl2ZXIgewotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JlY2VpdmVycy9BYnN0cmFjdEluT3V0QXN5bmNNZXNzYWdlUmVjZWl2ZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9yZWNlaXZlcnMvQWJzdHJhY3RJbk91dEFzeW5jTWVzc2FnZVJlY2VpdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0NTU0OTEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JlY2VpdmVycy9BYnN0cmFjdEluT3V0QXN5bmNNZXNzYWdlUmVjZWl2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVyczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLQotLyoqCi0gKiBUaGlzIGlzIHRha2VzIGNhcmUgb2YgdGhlIElOLU9VVCBzeW5jIE1FUCBpbiB0aGUgc2VydmVyIHNpZGUKLSAqCi0gKiBAZGVwcmVjYXRlZCBubyBsb25nZXIgbmVlZGVkLCBnb2luZyBhd2F5IGFmdGVyIDEuMwotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RJbk91dEFzeW5jTWVzc2FnZVJlY2VpdmVyIGV4dGVuZHMgQWJzdHJhY3RJbk91dE1lc3NhZ2VSZWNlaXZlciB7Ci0gICAgcHVibGljIHZvaWQgcmVjZWl2ZShmaW5hbCBNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ3R4KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgbWVzc2FnZUN0eC5zZXRQcm9wZXJ0eShET19BU1lOQywgQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgc3VwZXIucmVjZWl2ZShtZXNzYWdlQ3R4KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvcmVjZWl2ZXJzL0Fic3RyYWN0SW5PdXRNZXNzYWdlUmVjZWl2ZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9yZWNlaXZlcnMvQWJzdHJhY3RJbk91dE1lc3NhZ2VSZWNlaXZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzA3N2Q0Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9yZWNlaXZlcnMvQWJzdHJhY3RJbk91dE1lc3NhZ2VSZWNlaXZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNFbmdpbmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLk1lc3NhZ2VDb250ZXh0QnVpbGRlcjsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBBYnNyYWN0IElOLU9VVCBNRVAgTWVzc2FnZVJlY2VpdmVyLiBUaGUKLSAqIHByb3RlY3RlZCBhYnN0cmFjdCBtZXRob2RzIGFyZSBvbmx5IGZvciB0aGUgc2FrZSBvZiBicmVha2luZyBkb3duIHRoZSBsb2dpYwotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RJbk91dE1lc3NhZ2VSZWNlaXZlciBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVJlY2VpdmVyIHsKLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBpbnZva2VCdXNpbmVzc0xvZ2ljKE1lc3NhZ2VDb250ZXh0IGluTWVzc2FnZSwgTWVzc2FnZUNvbnRleHQgb3V0TWVzc2FnZSkKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQ7Ci0KLSAgICBwdWJsaWMgZmluYWwgdm9pZCBpbnZva2VCdXNpbmVzc0xvZ2ljKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBNZXNzYWdlQ29udGV4dCBvdXRNc2dDb250ZXh0ID0gTWVzc2FnZUNvbnRleHRCdWlsZGVyLmNyZWF0ZU91dE1lc3NhZ2VDb250ZXh0KG1zZ0NvbnRleHQpOwotICAgICAgICBvdXRNc2dDb250ZXh0LmdldE9wZXJhdGlvbkNvbnRleHQoKS5hZGRNZXNzYWdlQ29udGV4dChvdXRNc2dDb250ZXh0KTsKLQotICAgICAgICBpbnZva2VCdXNpbmVzc0xvZ2ljKG1zZ0NvbnRleHQsIG91dE1zZ0NvbnRleHQpOwotICAgICAgICByZXBsaWNhdGVTdGF0ZShtc2dDb250ZXh0KTsKLQotICAgICAgICBBeGlzRW5naW5lLnNlbmQob3V0TXNnQ29udGV4dCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JlY2VpdmVycy9BYnN0cmFjdEluT3V0U3luY01lc3NhZ2VSZWNlaXZlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JlY2VpdmVycy9BYnN0cmFjdEluT3V0U3luY01lc3NhZ2VSZWNlaXZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmI5NGYyLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9yZWNlaXZlcnMvQWJzdHJhY3RJbk91dFN5bmNNZXNzYWdlUmVjZWl2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVyczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzRW5naW5lOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5NZXNzYWdlQ29udGV4dEJ1aWxkZXI7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgQWJzcmFjdCBJTi1PVVQgTUVQIE1lc3NhZ2VSZWNlaXZlci4gVGhlCi0gKiBwcm90ZWN0ZWQgYWJzdHJhY3QgbWV0aG9kcyBhcmUgb25seSBmb3IgdGhlIHNha2Ugb2YgYnJlYWtpbmcgZG93biB0aGUgbG9naWMKLSAqCi0gKiBAZGVwcmVjYXRlZCB1c2UgQWJzdHJhY3RJbk91dE1lc3NhZ2VSZWNlaXZlcgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RJbk91dFN5bmNNZXNzYWdlUmVjZWl2ZXIgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VSZWNlaXZlciB7Ci0gICAgcHVibGljIGFic3RyYWN0IHZvaWQgaW52b2tlQnVzaW5lc3NMb2dpYyhNZXNzYWdlQ29udGV4dCBpbk1lc3NhZ2UsIE1lc3NhZ2VDb250ZXh0IG91dE1lc3NhZ2UpCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0OwotCi0gICAgcHVibGljIGZpbmFsIHZvaWQgaW52b2tlQnVzaW5lc3NMb2dpYyhNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgTWVzc2FnZUNvbnRleHQgb3V0TXNnQ29udGV4dCA9IE1lc3NhZ2VDb250ZXh0QnVpbGRlci5jcmVhdGVPdXRNZXNzYWdlQ29udGV4dChtc2dDb250ZXh0KTsKLSAgICAgICAgb3V0TXNnQ29udGV4dC5nZXRPcGVyYXRpb25Db250ZXh0KCkuYWRkTWVzc2FnZUNvbnRleHQob3V0TXNnQ29udGV4dCk7Ci0KLSAgICAgICAgaW52b2tlQnVzaW5lc3NMb2dpYyhtc2dDb250ZXh0LCBvdXRNc2dDb250ZXh0KTsKLSAgICAgICAgcmVwbGljYXRlU3RhdGUobXNnQ29udGV4dCk7Ci0KLSAgICAgICAgQXhpc0VuZ2luZS5zZW5kKG91dE1zZ0NvbnRleHQpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9yZWNlaXZlcnMvQWJzdHJhY3RNZXNzYWdlUmVjZWl2ZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9yZWNlaXZlcnMvQWJzdHJhY3RNZXNzYWdlUmVjZWl2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjIzODgwMS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvcmVjZWl2ZXJzL0Fic3RyYWN0TWVzc2FnZVJlY2VpdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUDExQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQMTJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsYXNzbG9hZGVyLk11bHRpUGFyZW50Q2xhc3NMb2FkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLkNsdXN0ZXJpbmdGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuY29udGV4dC5SZXBsaWNhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuU2VydmljZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkluT25seUF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5QYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5XU0RMMkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzRW5naW5lOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkRlcGVuZGVuY3lNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLk1lc3NhZ2VSZWNlaXZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmkxOG4uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLkphdmFVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuTG9hZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5NZXNzYWdlQ29udGV4dEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLldTRExVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb247Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RNZXNzYWdlUmVjZWl2ZXIgaW1wbGVtZW50cyBNZXNzYWdlUmVjZWl2ZXIgewotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEFic3RyYWN0TWVzc2FnZVJlY2VpdmVyLmNsYXNzKTsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNDT1BFID0gInNjb3BlIjsKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHNlcnZpY2VUQ0NMID0gbnVsbDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQVZFRF9UQ0NMID0gIl9TQVZFRF9UQ0NMXyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FWRURfTUMgPSAiX1NBVkVEX01DXyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9fQVNZTkMgPSAibWVzc2FnZVJlY2VpdmVyLmludm9rZU9uU2VwYXJhdGVUaHJlYWQiOwotCi0gICAgLy8gUGxhY2UgdG8gc3RvcmUgcHJldmlvdXMgdmFsdWVzCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBUaHJlYWRDb250ZXh0RGVzY3JpcHRvciB7Ci0gICAgICAgIHB1YmxpYyBDbGFzc0xvYWRlciBvbGRDbGFzc0xvYWRlcjsKLSAgICAgICAgcHVibGljIE1lc3NhZ2VDb250ZXh0IG9sZE1lc3NhZ2VDb250ZXh0OwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHJlcGxpY2F0ZVN0YXRlKE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0KSB0aHJvd3MgQ2x1c3RlcmluZ0ZhdWx0IHsKLSAgICAgICAgUmVwbGljYXRvci5yZXBsaWNhdGUobWVzc2FnZUNvbnRleHQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERvIHRoZSBhY3R1YWwgd29yayBvZiB0aGUgTWVzc2FnZVJlY2VpdmVyLiAgTXVzdCBiZSBvdmVycmlkZGVuIGJ5IGNvbmNyZXRlIHN1YmNsYXNzZXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVzc2FnZUN0eCBhY3RpdmUgTWVzc2FnZUNvbnRleHQKLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdCBpZiBhIHByb2JsZW0gb2NjdXJyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBpbnZva2VCdXNpbmVzc0xvZ2ljKE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDdHgpIHRocm93cyBBeGlzRmF1bHQ7Ci0KLSAgICAvKioKLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXNzYWdlQ3R4IGFjdGl2ZSBNZXNzYWdlQ29udGV4dAotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0IGlmIGEgcHJvYmxlbSBvY2N1cnJlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlY2VpdmUoZmluYWwgTWVzc2FnZUNvbnRleHQgbWVzc2FnZUN0eCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgCWlmIChtZXNzYWdlQ3R4LmlzUHJvcGVydHlUcnVlKERPX0FTWU5DKQotCQkJCXx8ICgobWVzc2FnZUN0eC5nZXRQYXJhbWV0ZXIoRE9fQVNZTkMpICE9IG51bGwpICYmCi0gICAgICAgICAgICAgICAgICAgIEphdmFVdGlscy5pc1RydWVFeHBsaWNpdGx5KG1lc3NhZ2VDdHguZ2V0UGFyYW1ldGVyKERPX0FTWU5DKS5nZXRWYWx1ZSgpKSkpIHsKLQotICAgICAgICAgICAgU3RyaW5nIG1lcCA9IG1lc3NhZ2VDdHguZ2V0QXhpc09wZXJhdGlvbigpCi0JCQkJCS5nZXRNZXNzYWdlRXhjaGFuZ2VQYXR0ZXJuKCk7Ci0JCQlFbmRwb2ludFJlZmVyZW5jZSByZXBseVRvID0gbWVzc2FnZUN0eC5nZXRSZXBseVRvKCk7Ci0JCQkvLyBJbiBvcmRlciB0byBpbnZva2UgdGhlIHNlcnZpY2UgaW4gdGhlIEFTWU5DIG1vZGUsIHRoZSByZXF1ZXN0Ci0JCQkvLyBzaG91bGQgY29udGFpbiBSZXBseVRvIGhlYWRlciBpZiB0aGUgTUVQIG9mIHRoZSBzZXJ2aWNlIGlzIG5vdAotCQkJLy8gSW5Pbmx5IHR5cGUKLQkJCWlmICgoIVdTRExVdGlsLmlzT3V0cHV0UHJlc2VudEZvck1FUChtZXApKQotCQkJCQl8fCAocmVwbHlUbyAhPSBudWxsICYmICFyZXBseVRvLmhhc0Fub255bW91c0FkZHJlc3MoKSkpIHsKLQkJCQlBc3luY01lc3NhZ2VSZWNlaXZlcldvcmtlciB3b3JrZXIgPSBuZXcgQXN5bmNNZXNzYWdlUmVjZWl2ZXJXb3JrZXIoCi0JCQkJCQltZXNzYWdlQ3R4KTsKLQkJCQltZXNzYWdlQ3R4LmdldEVudmVsb3BlKCkuYnVpbGQoKTsKLQkJCQltZXNzYWdlQ3R4LmdldENvbmZpZ3VyYXRpb25Db250ZXh0KCkuZ2V0VGhyZWFkUG9vbCgpLmV4ZWN1dGUoCi0JCQkJCQl3b3JrZXIpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCi0KLSAgICAgICAgVGhyZWFkQ29udGV4dERlc2NyaXB0b3IgdGMgPSBzZXRUaHJlYWRDb250ZXh0KG1lc3NhZ2VDdHgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaW52b2tlQnVzaW5lc3NMb2dpYyhtZXNzYWdlQ3R4KTsKLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGZhdWx0KSB7Ci0gICAgICAgICAgICAvLyBJZiB3ZSdyZSBpbi1vbmx5LCBlYXQgdGhpcy4gIE90aGVyd2lzZSwgdG9zcyBpdCB1cHdhcmRzIQotICAgICAgICAgICAgaWYgKChtZXNzYWdlQ3R4LmdldEF4aXNPcGVyYXRpb24oKSBpbnN0YW5jZW9mIEluT25seUF4aXNPcGVyYXRpb24pICYmCi0gICAgICAgICAgICAgICAgICAgICFXU0RMMkNvbnN0YW50cy5NRVBfVVJJX1JPQlVTVF9JTl9PTkxZLmVxdWFscyhtZXNzYWdlQ3R4LmdldEF4aXNPcGVyYXRpb24oKS5nZXRNZXNzYWdlRXhjaGFuZ2VQYXR0ZXJuKCkpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmVycm9yKGZhdWx0KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZmF1bHQuc2V0RmF1bHRUeXBlKENvbnN0YW50cy5BUFBMSUNBVElPTl9GQVVMVCk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgZmF1bHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICByZXN0b3JlVGhyZWFkQ29udGV4dCh0Yyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXZlcmFsIHBpZWNlcyBvZiBpbmZvcm1hdGlvbiBuZWVkIHRvIGJlIGF2YWlsYWJsZSB0byB0aGUgc2VydmljZQotICAgICAqIGltcGxlbWVudGF0aW9uIGNsYXNzLiAgRm9yIG9uZSwgdGhlIFRocmVhZENvbnRleHRDbGFzc0xvYWRlciBuZWVkcwotICAgICAqIHRvIGJlIGNvcnJlY3QsIGFuZCBmb3IgYW5vdGhlciB3ZSBuZWVkIHRvIGdpdmUgdGhlIHNlcnZpY2UgY29kZQotICAgICAqIGFjY2VzcyB0byB0aGUgTWVzc2FnZUNvbnRleHQgKGdldEN1cnJlbnRDb250ZXh0KCkpLiAgU28gd2UgdG9zcyB0aGVzZQotICAgICAqIHRoaW5ncyBpbiBUTFMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbXNnQ29udGV4dCB0aGUgY3VycmVudCBNZXNzYWdlQ29udGV4dAotICAgICAqIEByZXR1cm4gYSBUaHJlYWRDb250ZXh0RGVzY3JpcHRvciBjb250YWluaW5nIHRoZSBvbGQgdmFsdWVzCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFRocmVhZENvbnRleHREZXNjcmlwdG9yIHNldFRocmVhZENvbnRleHQoZmluYWwgTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgewotICAgICAgICBUaHJlYWRDb250ZXh0RGVzY3JpcHRvciB0YyA9IG5ldyBUaHJlYWRDb250ZXh0RGVzY3JpcHRvcigpOwotICAgICAgICB0Yy5vbGRNZXNzYWdlQ29udGV4dCA9IChNZXNzYWdlQ29udGV4dCkgTWVzc2FnZUNvbnRleHQuY3VycmVudE1lc3NhZ2VDb250ZXh0LmdldCgpOwotICAgICAgICBmaW5hbCBDbGFzc0xvYWRlciBjb250ZXh0Q2xhc3NMb2FkZXIgPSBnZXRDb250ZXh0Q2xhc3NMb2FkZXJfZG9Qcml2KCk7Ci0gICAgICAgIHRjLm9sZENsYXNzTG9hZGVyID0gY29udGV4dENsYXNzTG9hZGVyOwotCi0gICAgICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2UgPSBtc2dDb250ZXh0LmdldEF4aXNTZXJ2aWNlKCk7Ci0gICAgICAgIFN0cmluZyBzZXJ2aWNlVENDTCA9IChTdHJpbmcpIHNlcnZpY2UuZ2V0UGFyYW1ldGVyVmFsdWUoQ29uc3RhbnRzLlNFUlZJQ0VfVENDTCk7Ci0gICAgICAgIGlmIChzZXJ2aWNlVENDTCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzZXJ2aWNlVENDTCA9IHNlcnZpY2VUQ0NMLnRyaW0oKS50b0xvd2VyQ2FzZSgpOwotCi0gICAgICAgICAgICBpZiAoc2VydmljZVRDQ0wuZXF1YWxzKENvbnN0YW50cy5UQ0NMX0NPTVBPU0lURSkpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBDbGFzc0xvYWRlciBsb2FkZXIgPSAoQ2xhc3NMb2FkZXIpIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkQWN0aW9uKCkgewotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTXVsdGlQYXJlbnRDbGFzc0xvYWRlcihuZXcgVVJMW117fSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzTG9hZGVyW117Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnQ29udGV4dC5nZXRBeGlzU2VydmljZSgpLmdldENsYXNzTG9hZGVyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dENsYXNzTG9hZGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5qYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFByaXZpbGVnZWRBY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICApOwotICAgICAgICAgICAgfSBlbHNlIGlmIChzZXJ2aWNlVENDTC5lcXVhbHMoQ29uc3RhbnRzLlRDQ0xfU0VSVklDRSkpIHsKLSAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgUHJpdmlsZWdlZEFjdGlvbigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnQ29udGV4dC5nZXRBeGlzU2VydmljZSgpLmdldENsYXNzTG9hZGVyKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgTWVzc2FnZUNvbnRleHQuc2V0Q3VycmVudE1lc3NhZ2VDb250ZXh0KG1zZ0NvbnRleHQpOwotICAgICAgICByZXR1cm4gdGM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBDbGFzc0xvYWRlciBnZXRDb250ZXh0Q2xhc3NMb2FkZXJfZG9Qcml2KCkgewotICAgICAgICByZXR1cm4gKENsYXNzTG9hZGVyKSBvcmcuYXBhY2hlLmF4aXMyLmphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoCi0gICAgICAgICAgICAgICAgbmV3IFByaXZpbGVnZWRBY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVzdG9yZVRocmVhZENvbnRleHQoZmluYWwgVGhyZWFkQ29udGV4dERlc2NyaXB0b3IgdGMpIHsKLSAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5qYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAotICAgICAgICAgICAgICAgIG5ldyBQcml2aWxlZ2VkQWN0aW9uKCkgewotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyKHRjLm9sZENsYXNzTG9hZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICApOwotICAgICAgICBNZXNzYWdlQ29udGV4dC5jdXJyZW50TWVzc2FnZUNvbnRleHQuc2V0KHRjLm9sZE1lc3NhZ2VDb250ZXh0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBuZXcgc2VydmljZSBvYmplY3QuICBPdmVycmlkZSBpZiB5b3Ugd2FudCB0byBjdXN0b21pemUgaG93Ci0gICAgICogdGhpcyBoYXBwZW5zIGluIHlvdXIgb3duIE1lc3NhZ2VSZWNlaXZlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtc2dDb250ZXh0Ci0gICAgICogQHJldHVybiBSZXR1cm5zIE9iamVjdC4KLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdAotICAgICAqLwotICAgIHByb3RlY3RlZCBPYmplY3QgbWFrZU5ld1NlcnZpY2VPYmplY3QoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmaW5hbCBBeGlzU2VydmljZSBzZXJ2aWNlID0gbXNnQ29udGV4dC5nZXRBeGlzU2VydmljZSgpOwotICAgICAgICAgICAgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIgPSBzZXJ2aWNlLmdldENsYXNzTG9hZGVyKCk7Ci0KLSAgICAgICAgICAgIC8vIGFsbG93IGFsdGVybmF0aXZlIGRlZmluaXRpb24gb2YgbWFrZU5ld1NlcnZpY2VPYmplY3QKLSAgICAgICAgICAgIGlmIChzZXJ2aWNlLmdldFBhcmFtZXRlcihDb25zdGFudHMuU0VSVklDRV9PQkpFQ1RfU1VQUExJRVIpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBQYXJhbWV0ZXIgc2VydmljZU9iamVjdFBhcmFtID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UuZ2V0UGFyYW1ldGVyKENvbnN0YW50cy5TRVJWSUNFX09CSkVDVF9TVVBQTElFUik7Ci0gICAgICAgICAgICAgICAgZmluYWwgQ2xhc3Mgc2VydmljZU9iamVjdE1ha2VyID0gTG9hZGVyLmxvYWRDbGFzcyhjbGFzc0xvYWRlciwgKChTdHJpbmcpCi0gICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlT2JqZWN0UGFyYW0uZ2V0VmFsdWUoKSkudHJpbSgpKTsKLQotICAgICAgICAgICAgICAgIC8vIEZpbmQgc3RhdGljIGdldFNlcnZpY2VPYmplY3QoKSBtZXRob2QsIGNhbGwgaXQgaWYgdGhlcmUKLSAgICAgICAgICAgICAgICBmaW5hbCBNZXRob2QgbWV0aG9kID0gKE1ldGhvZCkgb3JnLmFwYWNoZS5heGlzMi5qYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2VPYmplY3RNYWtlci5nZXRNZXRob2QoImdldFNlcnZpY2VPYmplY3QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tde0F4aXNTZXJ2aWNlLmNsYXNzfSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICk7Ci0gICAgICAgICAgICAgICAgaWYgKG1ldGhvZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIEluc3RhbnRpYXRpb25FeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1ldGhvZC5pbnZva2Uoc2VydmljZU9iamVjdE1ha2VyLm5ld0luc3RhbmNlKCksIG5ldyBPYmplY3RbXXtzZXJ2aWNlfSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBQYXJhbWV0ZXIgaW1wbEluZm9QYXJhbSA9IHNlcnZpY2UuZ2V0UGFyYW1ldGVyKENvbnN0YW50cy5TRVJWSUNFX0NMQVNTKTsKLSAgICAgICAgICAgIGlmIChpbXBsSW5mb1BhcmFtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBDbGFzcyBpbXBsQ2xhc3MgPSBMb2FkZXIubG9hZENsYXNzKAotICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NMb2FkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAoKFN0cmluZykgaW1wbEluZm9QYXJhbS5nZXRWYWx1ZSgpKS50cmltKCkpOwotICAgICAgICAgICAgICAgIHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGltcGxDbGFzcy5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICApOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KAotICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZ2V0TWVzc2FnZSgicGFyYW1Jc05vdFNwZWNpZmllZCIsICJTRVJWSUNFX09CSkVDVF9TVVBQTElFUiIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEF4aXNGYXVsdC5tYWtlRmF1bHQoZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU09BUEZhY3RvcnkgZ2V0U09BUEZhY3RvcnkoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIFN0cmluZyBuc1VSSSA9IG1zZ0NvbnRleHQuZ2V0RW52ZWxvcGUoKS5nZXROYW1lc3BhY2UoKS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgaWYgKFNPQVAxMkNvbnN0YW50cy5TT0FQX0VOVkVMT1BFX05BTUVTUEFDRV9VUkkuZXF1YWxzKG5zVVJJKSkgewotICAgICAgICAgICAgcmV0dXJuIE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMkZhY3RvcnkoKTsKLSAgICAgICAgfSBlbHNlIGlmIChTT0FQMTFDb25zdGFudHMuU09BUF9FTlZFTE9QRV9OQU1FU1BBQ0VfVVJJLmVxdWFscyhuc1VSSSkpIHsKLSAgICAgICAgICAgIHJldHVybiBPTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTFGYWN0b3J5KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KE1lc3NhZ2VzLmdldE1lc3NhZ2UoImludmFsaWRTT0FQdmVyc2lvbiIpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHJpZXZlIHRoZSBpbXBsZW1lbnRhdGlvbiBvYmplY3QuICBUaGlzIHdpbGwgZWl0aGVyIHJldHVybiBhIGNhY2hlZAotICAgICAqIG9iamVjdCBpZiBwcmVzZW50IGluIHRoZSBTZXJ2aWNlQ29udGV4dCwgb3IgY3JlYXRlIGEgbmV3IG9uZSB2aWEKLSAgICAgKiBtYWtlTmV3U2VydmljZU9iamVjdCgpIChhbmQgdGhlbiBjYWNoZSB0aGF0KS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtc2dDb250ZXh0IHRoZSBhY3RpdmUgTWVzc2FnZUNvbnRleHQKLSAgICAgKiBAcmV0dXJuIHRoZSBhcHByb3ByaWF0ZSBiYWNrLWVuZCBzZXJ2aWNlIG9iamVjdC4KLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdCBpZiB0aGVyZSdzIGEgcHJvYmxlbQotICAgICAqLwotICAgIHByb3RlY3RlZCBPYmplY3QgZ2V0VGhlSW1wbGVtZW50YXRpb25PYmplY3QoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIFNlcnZpY2VDb250ZXh0IHNlcnZpY2VDb250ZXh0ID0gbXNnQ29udGV4dC5nZXRTZXJ2aWNlQ29udGV4dCgpOwotICAgICAgICBPYmplY3Qgc2VydmljZWltcGwgPSBzZXJ2aWNlQ29udGV4dC5nZXRQcm9wZXJ0eShTZXJ2aWNlQ29udGV4dC5TRVJWSUNFX09CSkVDVCk7Ci0gICAgICAgIGlmIChzZXJ2aWNlaW1wbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBzaW5jZSBzZXJ2aWNlIGltcGwgaXMgdGhlcmUgaW4gc2VydmljZSBjb250ZXh0ICwgdGFrZSB0aGF0IGZyb20gdGhlcmUKLSAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlaW1wbDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIGNyZWF0ZSBhIG5ldyBzZXJ2aWNlIGltcGwgY2xhc3MgZm9yIHRoYXQgc2VydmljZQotICAgICAgICAgICAgc2VydmljZWltcGwgPSBtYWtlTmV3U2VydmljZU9iamVjdChtc2dDb250ZXh0KTsKLSAgICAgICAgICAgIC8vU2VydmljZSBpbml0aWFsaXphdGlvbgotICAgICAgICAgICAgRGVwZW5kZW5jeU1hbmFnZXIuaW5pdFNlcnZpY2VPYmplY3Qoc2VydmljZWltcGwsIG1zZ0NvbnRleHQuZ2V0U2VydmljZUNvbnRleHQoKSk7Ci0gICAgICAgICAgICBzZXJ2aWNlQ29udGV4dC5zZXRQcm9wZXJ0eShTZXJ2aWNlQ29udGV4dC5TRVJWSUNFX09CSkVDVCwgc2VydmljZWltcGwpOwotICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2VpbXBsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGNsYXNzIEFzeW5jTWVzc2FnZVJlY2VpdmVyV29ya2VyIGltcGxlbWVudHMgUnVubmFibGUgewotICAgIAlwcml2YXRlIE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDdHg7Ci0KLSAgICAJcHVibGljIEFzeW5jTWVzc2FnZVJlY2VpdmVyV29ya2VyKE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDdHgpewotICAgIAkJdGhpcy5tZXNzYWdlQ3R4ID0gbWVzc2FnZUN0eDsKLSAgICAJfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgVGhyZWFkQ29udGV4dERlc2NyaXB0b3IgdGMgPSBzZXRUaHJlYWRDb250ZXh0KG1lc3NhZ2VDdHgpOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGludm9rZUJ1c2luZXNzTG9naWMobWVzc2FnZUN0eCk7Ci0gICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdG9yZVRocmVhZENvbnRleHQodGMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gSWYgd2UncmUgSU4tT05MWSwgc3dhbGxvdyB0aGlzLiAgT3RoZXJ3aXNlLCBzZW5kIGl0LgotICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlQ3R4LmdldEF4aXNPcGVyYXRpb24oKSBpbnN0YW5jZW9mIEluT25seUF4aXNPcGVyYXRpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUNvbnRleHQgZmF1bHRDb250ZXh0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUNvbnRleHRCdWlsZGVyLmNyZWF0ZUZhdWx0TWVzc2FnZUNvbnRleHQobWVzc2FnZUN0eCwgZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIEF4aXNFbmdpbmUuc2VuZEZhdWx0KGZhdWx0Q29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBheGlzRmF1bHQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcihlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvcmVjZWl2ZXJzL0Fic3RyYWN0Um9idXN0SW5NZXNzYWdlUmVjZWl2ZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9yZWNlaXZlcnMvQWJzdHJhY3RSb2J1c3RJbk1lc3NhZ2VSZWNlaXZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTdjZDcxLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9yZWNlaXZlcnMvQWJzdHJhY3RSb2J1c3RJbk1lc3NhZ2VSZWNlaXZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzOwotCi0vKioKLSAqIFRoaXMgaXMgdGFrZXMgY2FyZSBvZiB0aGUgSU4tT1VUIHN5bmMgTUVQIGluIHRoZSBzZXJ2ZXIgc2lkZQotICoKLSAqIEBkZXByZWNhdGVkIG5vdCBuZWVkZWQsIHNpbmNlIGluLW9ubHkgTWVzc2FnZVJlY2VpdmVycyBjYW4gdGhyb3cgZmF1bHRzCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFJvYnVzdEluTWVzc2FnZVJlY2VpdmVyIGV4dGVuZHMgIEFic3RyYWN0TWVzc2FnZVJlY2VpdmVyewotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JlY2VpdmVycy9SYXdYTUxJTk9ubHlNZXNzYWdlUmVjZWl2ZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9yZWNlaXZlcnMvUmF3WE1MSU5Pbmx5TWVzc2FnZVJlY2VpdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3NzYyNjMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JlY2VpdmVycy9SYXdYTUxJTk9ubHlNZXNzYWdlUmVjZWl2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVyczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuTWVzc2FnZVJlY2VpdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaTE4bi5NZXNzYWdlczsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLQotLyoqCi0gKiBUaGUgUmF3WE1MSU5Pbmx5TWVzc2FnZVJlY2VpdmVyIE1lc3NhZ2VSZWNlaXZlciBoYW5kcyBvdmVyIHRoZSByYXcgcmVxdWVzdCByZWNlaXZlZCB0bwotICogdGhlIHNlcnZpY2UgaW1wbGVtZW50YXRpb24gY2xhc3MgYXMgYW4gT01FbGVtZW50LiBUaGUgaW1wbGVtZW50YXRpb24gY2xhc3MgaXMgTk9UCi0gKiBleHBlY3RlZCB0byByZXR1cm4gYW55IHZhbHVlLCBidXQgbWF5IGRvIHNvIGFuZCBpdCB3b3VsZCBiZSBpZ25vcmVkLiBUaGlzIGlzIGEKLSAqIHN5bmNocm9ub3VzIE1lc3NhZ2VSZWNlaXZlciwgYW5kIGZpbmRzIHRoZSBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIGNsYXNzIHRvIGludm9rZSBieQotICogcmVmZXJyaW5nIHRvIHRoZSAiU2VydmljZUNsYXNzIiBwYXJhbWV0ZXIgdmFsdWUgc3BlY2lmaWVkIGluIHRoZSBzZXJ2aWNlLnhtbCBhbmQKLSAqIGxvb2tpbmcgYXQgdGhlIG1ldGhvZHMgb2YgdGhlIGZvcm0gdm9pZCA8PG1ldGhvZE5hbWU+PihPTUVsZW1lbnQgcmVxdWVzdCkKLSAqCi0gKiBAc2VlIFJhd1hNTElOT3V0TWVzc2FnZVJlY2VpdmVyCi0gKiBAc2VlIFJhd1hNTElOT3V0QXN5bmNNZXNzYWdlUmVjZWl2ZXIKLSAqLwotcHVibGljIGNsYXNzIFJhd1hNTElOT25seU1lc3NhZ2VSZWNlaXZlciBleHRlbmRzIEFic3RyYWN0SW5NZXNzYWdlUmVjZWl2ZXIKLSAgICAgICAgaW1wbGVtZW50cyBNZXNzYWdlUmVjZWl2ZXIgewotCi0gICAgcHJpdmF0ZSBNZXRob2QgZmluZE9wZXJhdGlvbihBeGlzT3BlcmF0aW9uIG9wLCBDbGFzcyBpbXBsQ2xhc3MpIHsKLSAgICAgICAgTWV0aG9kIG1ldGhvZCA9IChNZXRob2QpKG9wLmdldFBhcmFtZXRlclZhbHVlKCJteU1ldGhvZCIpKTsKLSAgICAgICAgaWYgKG1ldGhvZCAhPSBudWxsKSByZXR1cm4gbWV0aG9kOwotCi0gICAgICAgIFN0cmluZyBtZXRob2ROYW1lID0gb3AuZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gTG9va2luZyBmb3IgYSBtZXRob2Qgb2YgdGhlIGZvcm0gInZvaWQgbWV0aG9kKE9NRWxlbWVudCkiCi0gICAgICAgICAgICBtZXRob2QgPSBpbXBsQ2xhc3MuZ2V0TWV0aG9kKG1ldGhvZE5hbWUsIG5ldyBDbGFzcyBbXSB7IE9NRWxlbWVudC5jbGFzcyB9KTsKLSAgICAgICAgICAgIGlmIChtZXRob2QuZ2V0UmV0dXJuVHlwZSgpLmVxdWFscyh2b2lkLmNsYXNzKSkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIG9wLmFkZFBhcmFtZXRlcigibXlNZXRob2QiLCBtZXRob2QpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBheGlzRmF1bHQpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gRG8gbm90aGluZyBoZXJlCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBtZXRob2Q7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBGYWxsIHRocm91Z2gKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEludm9rZXMgdGhlIGJ1c2luZXNzIGxvZ2ljIGludm9jYXRpb24gb24gdGhlIHNlcnZpY2UgaW1wbGVtZW50YXRpb24gY2xhc3MKLSAgICAgKgotICAgICAqIEBwYXJhbSBtc2dDb250ZXh0IHRoZSBpbmNvbWluZyBtZXNzYWdlIGNvbnRleHQKLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdCBvbiBpbnZhbGlkIG1ldGhvZCAod3Jvbmcgc2lnbmF0dXJlKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGludm9rZUJ1c2luZXNzTG9naWMoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBnZXQgdGhlIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciB0aGUgV2ViIFNlcnZpY2UKLSAgICAgICAgICAgIE9iamVjdCBvYmogPSBnZXRUaGVJbXBsZW1lbnRhdGlvbk9iamVjdChtc2dDb250ZXh0KTsKLQotICAgICAgICAgICAgLy8gZmluZCB0aGUgV2ViU2VydmljZSBtZXRob2QKLSAgICAgICAgICAgIENsYXNzIGltcGxDbGFzcyA9IG9iai5nZXRDbGFzcygpOwotCi0gICAgICAgICAgICBBeGlzT3BlcmF0aW9uIG9wID0gbXNnQ29udGV4dC5nZXRBeGlzT3BlcmF0aW9uKCk7Ci0gICAgICAgICAgICBNZXRob2QgbWV0aG9kID0gZmluZE9wZXJhdGlvbihvcCwgaW1wbENsYXNzKTsKLQotICAgICAgICAgICAgaWYgKG1ldGhvZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdChNZXNzYWdlcy5nZXRNZXNzYWdlKCJtZXRob2REb2VzTm90RXhpc3RJbk9ubHkiKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1ldGhvZC5pbnZva2Uob2JqLAotICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0IFtdIHsgbXNnQ29udGV4dC5nZXRFbnZlbG9wZSgpLmdldEJvZHkoKS5nZXRGaXJzdEVsZW1lbnQoKSB9KTsKLQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9yZWNlaXZlcnMvUmF3WE1MSU5PdXRBc3luY01lc3NhZ2VSZWNlaXZlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JlY2VpdmVycy9SYXdYTUxJTk91dEFzeW5jTWVzc2FnZVJlY2VpdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmZjE3NjguLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JlY2VpdmVycy9SYXdYTUxJTk91dEFzeW5jTWVzc2FnZVJlY2VpdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotCi0vKioKLSAqIFRoZSBSYXdYTUxJTk91dEFzeW5jTWVzc2FnZVJlY2VpdmVyIE1lc3NhZ2VSZWNlaXZlciBoYW5kcyBvdmVyIHRoZSByYXcgcmVxdWVzdCByZWNlaXZlZCB0bwotICogdGhlIHNlcnZpY2UgaW1wbGVtZW50YXRpb24gY2xhc3MgYXMgYW4gT01FbGVtZW50LiBUaGUgaW1wbGVtZW50YXRpb24gY2xhc3MgaXMgZXhwZWN0ZWQKLSAqIHRvIHJldHVybiBiYWNrIHRoZSBPTUVsZW1lbnQgdG8gYmUgcmV0dXJuZWQgdG8gdGhlIGNhbGxlci4gVGhpcyBpcyBhbiBhc3luY2hyb25vdXMKLSAqIE1lc3NhZ2VSZWNlaXZlciwgYW5kIGZpbmRzIHRoZSBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIGNsYXNzIHRvIGludm9rZSBieSByZWZlcnJpbmcgdG8KLSAqIHRoZSAiU2VydmljZUNsYXNzIiBwYXJhbWV0ZXIgdmFsdWUgc3BlY2lmaWVkIGluIHRoZSBzZXJ2aWNlLnhtbCBhbmQgbG9va2luZyBhdCB0aGUKLSAqIG1ldGhvZHMgb2YgdGhlIGZvcm0gT01FbGVtZW50IDw8bWV0aG9kTmFtZT4+KE9NRWxlbWVudCByZXF1ZXN0KQotICoKLSAqIEBzZWUgUmF3WE1MSU5Pbmx5TWVzc2FnZVJlY2VpdmVyCi0gKiBAc2VlIFJhd1hNTElOT3V0TWVzc2FnZVJlY2VpdmVyCi0gKiBAZGVwcmVjYXRlZCB1c2UgUmF3WE1MSU5PdXRNZXNzYWdlUmVjZWl2ZXIgYW5kIHRoZSBET19BU1lOQyBwcm9wZXJ0eSBpbnN0ZWFkLi4uLgotICovCi1wdWJsaWMgY2xhc3MgUmF3WE1MSU5PdXRBc3luY01lc3NhZ2VSZWNlaXZlciBleHRlbmRzIFJhd1hNTElOT3V0TWVzc2FnZVJlY2VpdmVyIHsKLSAgICBwdWJsaWMgdm9pZCByZWNlaXZlKGZpbmFsIE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDdHgpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBtZXNzYWdlQ3R4LnNldFByb3BlcnR5KERPX0FTWU5DLCBCb29sZWFuLlRSVUUpOwotICAgICAgICBzdXBlci5yZWNlaXZlKG1lc3NhZ2VDdHgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9yZWNlaXZlcnMvUmF3WE1MSU5PdXRNZXNzYWdlUmVjZWl2ZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9yZWNlaXZlcnMvUmF3WE1MSU5PdXRNZXNzYWdlUmVjZWl2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NlOTU2ZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvcmVjZWl2ZXJzL1Jhd1hNTElOT3V0TWVzc2FnZVJlY2VpdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5NZXNzYWdlUmVjZWl2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pMThuLk1lc3NhZ2VzOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotCi0vKioKLSAqIFRoZSBSYXdYTUxJTk91dE1lc3NhZ2VSZWNlaXZlciBNZXNzYWdlUmVjZWl2ZXIgaGFuZHMgb3ZlciB0aGUgcmF3IHJlcXVlc3QgcmVjZWl2ZWQgdG8KLSAqIHRoZSBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIGNsYXNzIGFzIGFuIE9NRWxlbWVudC4gVGhlIGltcGxlbWVudGF0aW9uIGNsYXNzIGlzIGV4cGVjdGVkCi0gKiB0byByZXR1cm4gYmFjayB0aGUgT01FbGVtZW50IHRvIGJlIHJldHVybmVkIHRvIHRoZSBjYWxsZXIuIFRoaXMgaXMgYSBzeW5jaHJvbm91cwotICogTWVzc2FnZVJlY2VpdmVyLCBhbmQgZmluZHMgdGhlIHNlcnZpY2UgaW1wbGVtZW50YXRpb24gY2xhc3MgdG8gaW52b2tlIGJ5IHJlZmVycmluZyB0bwotICogdGhlICJTZXJ2aWNlQ2xhc3MiIHBhcmFtZXRlciB2YWx1ZSBzcGVjaWZpZWQgaW4gdGhlIHNlcnZpY2UueG1sIGFuZCBsb29raW5nIGF0IHRoZQotICogbWV0aG9kcyBvZiB0aGUgZm9ybSBPTUVsZW1lbnQgPDxtZXRob2ROYW1lPj4oT01FbGVtZW50IHJlcXVlc3QpCi0gKgotICogQHNlZSBSYXdYTUxJTk9ubHlNZXNzYWdlUmVjZWl2ZXIKLSAqIEBzZWUgUmF3WE1MSU5PdXRBc3luY01lc3NhZ2VSZWNlaXZlcgotICovCi1wdWJsaWMgY2xhc3MgUmF3WE1MSU5PdXRNZXNzYWdlUmVjZWl2ZXIgZXh0ZW5kcyBBYnN0cmFjdEluT3V0U3luY01lc3NhZ2VSZWNlaXZlcgotICAgICAgICBpbXBsZW1lbnRzIE1lc3NhZ2VSZWNlaXZlciB7Ci0KLSAgICBwcml2YXRlIE1ldGhvZCBmaW5kT3BlcmF0aW9uKEF4aXNPcGVyYXRpb24gb3AsIENsYXNzIGltcGxDbGFzcykgewotICAgICAgICBNZXRob2QgbWV0aG9kID0gKE1ldGhvZCkob3AuZ2V0UGFyYW1ldGVyVmFsdWUoIm15TWV0aG9kIikpOwotICAgICAgICBpZiAobWV0aG9kICE9IG51bGwpIHJldHVybiBtZXRob2Q7Ci0KLSAgICAgICAgU3RyaW5nIG1ldGhvZE5hbWUgPSBvcC5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIExvb2tpbmcgZm9yIGEgbWV0aG9kIG9mIHRoZSBmb3JtICJPTUVsZW1lbnQgbWV0aG9kKE9NRWxlbWVudCkiCi0gICAgICAgICAgICBtZXRob2QgPSBpbXBsQ2xhc3MuZ2V0TWV0aG9kKG1ldGhvZE5hbWUsIG5ldyBDbGFzcyBbXSB7IE9NRWxlbWVudC5jbGFzcyB9KTsKLSAgICAgICAgICAgIGlmIChtZXRob2QuZ2V0UmV0dXJuVHlwZSgpLmVxdWFscyhPTUVsZW1lbnQuY2xhc3MpKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgb3AuYWRkUGFyYW1ldGVyKCJteU1ldGhvZCIsIG1ldGhvZCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGF4aXNGYXVsdCkgewotICAgICAgICAgICAgICAgICAgICAvLyBEbyBub3RoaW5nIGhlcmUKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1ldGhvZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIEZhdWx0IHRocm91Z2gKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEludm9rZXMgdGhlIGJ1c3NpbmVzcyBsb2dpYyBpbnZvY2F0aW9uIG9uIHRoZSBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIGNsYXNzCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbXNnQ29udGV4dCAgICB0aGUgaW5jb21pbmcgbWVzc2FnZSBjb250ZXh0Ci0gICAgICogQHBhcmFtIG5ld21zZ0NvbnRleHQgdGhlIHJlc3BvbnNlIG1lc3NhZ2UgY29udGV4dAotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0IG9uIGludmFsaWQgbWV0aG9kICh3cm9uZyBzaWduYXR1cmUpIG9yIGJlaGF2aW91ciAocmV0dXJuIG51bGwpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW52b2tlQnVzaW5lc3NMb2dpYyhNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0LCBNZXNzYWdlQ29udGV4dCBuZXdtc2dDb250ZXh0KQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIHRyeSB7Ci0KLSAgICAgICAgICAgIC8vIGdldCB0aGUgaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIHRoZSBXZWIgU2VydmljZQotICAgICAgICAgICAgT2JqZWN0IG9iaiA9IGdldFRoZUltcGxlbWVudGF0aW9uT2JqZWN0KG1zZ0NvbnRleHQpOwotCi0gICAgICAgICAgICAvLyBmaW5kIHRoZSBXZWJTZXJ2aWNlIG1ldGhvZAotICAgICAgICAgICAgQ2xhc3MgaW1wbENsYXNzID0gb2JqLmdldENsYXNzKCk7Ci0KLSAgICAgICAgICAgIEF4aXNPcGVyYXRpb24gb3BEZXNjID0gbXNnQ29udGV4dC5nZXRBeGlzT3BlcmF0aW9uKCk7Ci0gICAgICAgICAgICBNZXRob2QgbWV0aG9kID0gZmluZE9wZXJhdGlvbihvcERlc2MsIGltcGxDbGFzcyk7Ci0KLSAgICAgICAgICAgIGlmIChtZXRob2QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoTWVzc2FnZXMuZ2V0TWVzc2FnZSgibWV0aG9kRG9lc05vdEV4aXN0SW5PdXQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcERlc2MuZ2V0TmFtZSgpLnRvU3RyaW5nKCkpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgT01FbGVtZW50IHJlc3VsdCA9IChPTUVsZW1lbnQpIG1ldGhvZC5pbnZva2UoCi0gICAgICAgICAgICAgICAgICAgIG9iaiwgbmV3IE9iamVjdFtde21zZ0NvbnRleHQuZ2V0RW52ZWxvcGUoKS5nZXRCb2R5KCkuZ2V0Rmlyc3RFbGVtZW50KCl9KTsKLSAgICAgICAgICAgIFNPQVBGYWN0b3J5IGZhYyA9IGdldFNPQVBGYWN0b3J5KG1zZ0NvbnRleHQpOwotICAgICAgICAgICAgU09BUEVudmVsb3BlIGVudmVsb3BlID0gZmFjLmdldERlZmF1bHRFbnZlbG9wZSgpOwotCi0gICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBlbnZlbG9wZS5nZXRCb2R5KCkuYWRkQ2hpbGQocmVzdWx0KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbmV3bXNnQ29udGV4dC5zZXRFbnZlbG9wZShlbnZlbG9wZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBBeGlzRmF1bHQubWFrZUZhdWx0KGUpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JlY2VpdmVycy9TZXJ2ZXJDYWxsYmFjay5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JlY2VpdmVycy9TZXJ2ZXJDYWxsYmFjay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDA2NzExLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9yZWNlaXZlcnMvU2VydmVyQ2FsbGJhY2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVyczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLQotcHVibGljIGludGVyZmFjZSBTZXJ2ZXJDYWxsYmFjayB7Ci0gICAgcHVibGljIHZvaWQgaGFuZGxlRmF1bHQoQXhpc0ZhdWx0IGZhdWx0KSB0aHJvd3MgQXhpc0ZhdWx0OwotCi0gICAgcHVibGljIHZvaWQgaGFuZGxlUmVzdWx0KE1lc3NhZ2VDb250ZXh0IHJlc3VsdCkgdGhyb3dzIEF4aXNGYXVsdDsKLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9zZXJ2aWNlL0xpZmVjeWNsZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NlcnZpY2UvTGlmZWN5Y2xlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5ZDZmOWIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NlcnZpY2UvTGlmZWN5Y2xlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2VydmljZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5TZXJ2aWNlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgTGlmZWN5Y2xlIGludGVyZmFjZSBzaG91bGQgYmUgaW1wbGVtZW50ZWQgYnkgeW91ciBiYWNrLWVuZCBzZXJ2aWNlCi0gKiBjbGFzcyBpZiB5b3Ugd2lzaCB0byBiZSBub3RpZmllZCBvZiBjcmVhdGlvbiBhbmQgY2xlYW51cCBieSB0aGUgQXhpczIKLSAqIGZyYW1ld29yay4KLSAqLwotcHVibGljIGludGVyZmFjZSBMaWZlY3ljbGUgewotCi0gICAgLyoqCi0gICAgICogaW5pdCgpIGlzIGNhbGxlZCB3aGVuIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBpbXBsZW1lbnRpbmcgY2xhc3MgaGFzIGJlZW4gY3JlYXRlZC4KLSAgICAgKiBUaGlzIG9jY3VycyBpbiBzeW5jIHdpdGggc2Vzc2lvbi9TZXJ2aWNlQ29udGV4dCBjcmVhdGlvbi4gIFRoaXMgbWV0aG9kIGdpdmVzIGNsYXNzZXMKLSAgICAgKiBhIGNoYW5jZSB0byBkbyBhbnkgc2V0dXAgd29yayAoZ3JhYiByZXNvdXJjZXMsIGVzdGFibGlzaCBjb25uZWN0aW9ucywgZXRjKSBiZWZvcmUKLSAgICAgKiB0aGV5IGFyZSBpbnZva2VkIGJ5IGEgc2VydmljZSByZXF1ZXN0LgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbnRleHQgdGhlIGFjdGl2ZSBTZXJ2aWNlQ29udGV4dAotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0IGlmIHNvbWV0aGluZyBnb2VzIHdyb25nLiAgVGhyb3dpbmcgYSBmYXVsdCBoZXJlIHdpbGwgcmVzdWx0IGluIGVpdGhlcgotICAgICAqICAgICAgICAgICAgICAgICAgIGZhaWxlZCBkZXBsb3ltZW50IChmb3IgYXBwbGljYXRpb24tc2NvcGVkIHNlcnZpY2VzKSBvciBmYWlsZWQgcmVxdWVzdHMuCi0gICAgICovCi0gICAgdm9pZCBpbml0KFNlcnZpY2VDb250ZXh0IGNvbnRleHQpIHRocm93cyBBeGlzRmF1bHQ7Ci0KLSAgICAvKioKLSAgICAgKiBkZXN0cm95KCkgaXMgY2FsbGVkIHdoZW4gQXhpczIgZGVjaWRlcyB0aGF0IGl0IGlzIGZpbmlzaGVkIHdpdGggYSBwYXJ0aWN1bGFyIGluc3RhbmNlCi0gICAgICogb2YgdGhlIGJhY2stZW5kIHNlcnZpY2UgY2xhc3MuICBJdCBhbGxvd3MgY2xhc3NlcyB0byBjbGVhbiB1cCByZXNvdXJjZXMuCi0gICAgICogQHBhcmFtIGNvbnRleHQgdGhlIGFjdGl2ZSBTZXJ2aWNlQ29udGV4dAotICAgICAqLwotICAgIHZvaWQgZGVzdHJveShTZXJ2aWNlQ29udGV4dCBjb250ZXh0KTsKLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc2FjdGlvbi9UcmFuc2FjdGlvbkNvbmZpZ3VyYXRpb24uamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc2FjdGlvbi9UcmFuc2FjdGlvbkNvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE2YTU0Yy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNhY3Rpb24vVHJhbnNhY3Rpb25Db25maWd1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zYWN0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LkRlcGxveW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5QYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5QYXJhbWV0ZXJJbmNsdWRlOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXgubmFtaW5nLkNvbnRleHQ7Ci1pbXBvcnQgamF2YXgubmFtaW5nLkluaXRpYWxDb250ZXh0OwotaW1wb3J0IGphdmF4Lm5hbWluZy5OYW1pbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25NYW5hZ2VyOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgVHJhbnNhY3Rpb25Db25maWd1cmF0aW9uIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhUcmFuc2FjdGlvbkNvbmZpZ3VyYXRpb24uY2xhc3MpOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9UWF9USU1FX09VVCA9IDMwMDAwMCA7IC8vMzBzCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFhfTUFOQUdFUl9KTkRJX05BTUUgPSAiVHJhbnNhY3Rpb25NYW5hZ2VySk5ESU5hbWUiOwotCi0gICAgcHJpdmF0ZSBpbnQgdHJhbnNhY3Rpb25UaW1lb3V0ID0gREVGQVVMVF9UWF9USU1FX09VVDsKLSAgICBwcml2YXRlIFRocmVhZExvY2FsIHRocmVhZFRyYW5zYWN0aW9uTWFuYWdlciA9IG51bGw7Ci0gICAgcHJpdmF0ZSBIYXNodGFibGU8U3RyaW5nLCBTdHJpbmc+IGpuZGlQcm9wZXJ0aWVzID0gbmV3IEhhc2h0YWJsZTxTdHJpbmcsIFN0cmluZz4oKTsKLSAgICBwcml2YXRlIFN0cmluZyB0cmFuc2FjdGlvbk1hbmFnZXJKTkRJTmFtZSA9IG51bGw7Ci0KLQotCi0gICAgcHVibGljIFRyYW5zYWN0aW9uQ29uZmlndXJhdGlvbihQYXJhbWV0ZXJJbmNsdWRlIHRyYW5zYWN0aW9uUGFyYW1ldGVycykgdGhyb3dzIERlcGxveW1lbnRFeGNlcHRpb24gewotICAgICAgIEl0ZXJhdG9yIGl0ID0gdHJhbnNhY3Rpb25QYXJhbWV0ZXJzLmdldFBhcmFtZXRlcnMoKS5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBQYXJhbWV0ZXIgcGFyYW1ldGVyID0gKFBhcmFtZXRlcikgaXQubmV4dCgpOwotICAgICAgICAgICAgam5kaVByb3BlcnRpZXMucHV0KHBhcmFtZXRlci5nZXROYW1lKCksIChTdHJpbmcpIHBhcmFtZXRlci5nZXRWYWx1ZSgpKTsKLSAgICAgICAgfSAgICAgICAgIAotICAgICAKLSAgICAgICAgdHJhbnNhY3Rpb25NYW5hZ2VySk5ESU5hbWUgPSAoU3RyaW5nKSB0cmFuc2FjdGlvblBhcmFtZXRlcnMuZ2V0UGFyYW1ldGVyKFRYX01BTkFHRVJfSk5ESV9OQU1FKS5nZXRWYWx1ZSgpOwotCi0gICAgICAgIGlmKHRyYW5zYWN0aW9uTWFuYWdlckpORElOYW1lID09IG51bGwpewotICAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKCJSZXF1aXJlZCB0cmFuc2FjdGlvbiBwYXJhbWV0ZXIgIiArIFRYX01BTkFHRVJfSk5ESV9OQU1FICsgIiBtaXNzaW5nIik7Ci0gICAgICAgIH0KLQotICAgICAgICB0aHJlYWRUcmFuc2FjdGlvbk1hbmFnZXIgPSBuZXcgVGhyZWFkTG9jYWwoKTsgICAgIAotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0VHJhbnNhY3Rpb25UaW1lb3V0KCl7Ci0gICAgICAgIHJldHVybiB0cmFuc2FjdGlvblRpbWVvdXQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VHJhbnNhY3Rpb25UaW1lb3V0KGludCB0cmFuc2FjdGlvblRpbWVvdXQpewotICAgICAgICB0aGlzLnRyYW5zYWN0aW9uVGltZW91dCA9IHRyYW5zYWN0aW9uVGltZW91dDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIFRyYW5zYWN0aW9uTWFuYWdlciBnZXRUcmFuc2FjdGlvbk1hbmFnZXIoKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgVHJhbnNhY3Rpb25NYW5hZ2VyIHRyYW5zYWN0aW9uTWFuYWdlciA9IChUcmFuc2FjdGlvbk1hbmFnZXIpIHRocmVhZFRyYW5zYWN0aW9uTWFuYWdlci5nZXQoKTsKLSAgICAgICAgaWYgKHRyYW5zYWN0aW9uTWFuYWdlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0cmFuc2FjdGlvbk1hbmFnZXIgPSBsb29rdXBUcmFuc2FjdGlvbk1hbmFnZXIoKTsKLSAgICAgICAgICAgIHRocmVhZFRyYW5zYWN0aW9uTWFuYWdlci5zZXQodHJhbnNhY3Rpb25NYW5hZ2VyKTsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgbG9nLmRlYnVnKCJKTkRJIGxvb2t1cCBUcmFuc2FjdGlvbk1hbmFnZXIiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgbG9nLmRlYnVnKCJSZS11c2UgcHJldmlvdXNseSBKTkRJIGxvb2t1cCBUcmFuc2FjdGlvbk1hbmFnZXIiKTsKLSAgICAgICAgfQotICAgICAgICB0cnl7Ci0gICAgICAgICAgICB0cmFuc2FjdGlvbk1hbmFnZXIuc2V0VHJhbnNhY3Rpb25UaW1lb3V0KHRyYW5zYWN0aW9uVGltZW91dCk7Ci0gICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGlnbm9yZSkge30KLQotICAgICAgICByZXR1cm4gdHJhbnNhY3Rpb25NYW5hZ2VyOwotICAgIH0KLQotICAgIHByaXZhdGUgc3luY2hyb25pemVkIFRyYW5zYWN0aW9uTWFuYWdlciBsb29rdXBUcmFuc2FjdGlvbk1hbmFnZXIoKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLQotICAgICAgICB0cnkgewotCi0gICAgICAgICAgICBDb250ZXh0IGNvbnRleHQgPSBuZXcgSW5pdGlhbENvbnRleHQoam5kaVByb3BlcnRpZXMpOwotICAgICAgICAgICAgT2JqZWN0IHRyYW5zYWN0aW9uTWFuYWdlciA9IGNvbnRleHQubG9va3VwKCB0cmFuc2FjdGlvbk1hbmFnZXJKTkRJTmFtZSApOwotICAgICAgICAgICAgaWYgKHRyYW5zYWN0aW9uTWFuYWdlciAhPSBudWxsICYmIHRyYW5zYWN0aW9uTWFuYWdlciBpbnN0YW5jZW9mIFRyYW5zYWN0aW9uTWFuYWdlcikgewotICAgICAgICAgICAgICAgIHJldHVybiAoVHJhbnNhY3Rpb25NYW5hZ2VyKSB0cmFuc2FjdGlvbk1hbmFnZXI7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiVHJhbnNhY3Rpb25NYW5hZ2VyIDogIiArIHRyYW5zYWN0aW9uTWFuYWdlckpORElOYW1lICsgIiBub3QgZm91bmQgd2hlbiBsb29raW5nIHVwIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiIHVzaW5nIEpOREkgcHJvcGVydGllcyA6ICIgKyBjb250ZXh0LmdldEVudmlyb25tZW50KCkpOwotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoIlRyYW5zYWN0aW9uTWFuYWdlciA6ICIgKyB0cmFuc2FjdGlvbk1hbmFnZXJKTkRJTmFtZSArICIgbm90IGZvdW5kIHdoZW4gbG9va2luZyB1cCIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIiB1c2luZyBKTkRJIHByb3BlcnRpZXMgOiAiICsgY29udGV4dC5nZXRFbnZpcm9ubWVudCgpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IGNhdGNoIChOYW1pbmdFeGNlcHRpb24gZSkgewotCi0gICAgICAgICAgICBsb2cuZXJyb3IobmV3IFN0cmluZ0J1aWxkZXIoKS5hcHBlbmQoIkVycm9yIGxvb2tpbmcgdXAgVHJhbnNhY3Rpb25NYW5hZ2VyICIpCi0gICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoIiB1c2luZyBKTkRJIHByb3BlcnRpZXMgOiAiKS5hcHBlbmQoam5kaVByb3BlcnRpZXMpKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoIlRyYW5zYWN0aW9uTWFuYWdlciBub3QgZm91bmQgd2hlbiBsb29raW5nIHVwIiArCi0gICAgICAgICAgICAgICAgICAgICIgdXNpbmcgSk5ESSBwcm9wZXJ0aWVzIDogIiArIGpuZGlQcm9wZXJ0aWVzKTsKLSAgICAgICAgfQotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L01lc3NhZ2VGb3JtYXR0ZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvTWVzc2FnZUZvcm1hdHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODYzMjI3Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvTWVzc2FnZUZvcm1hdHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01PdXRwdXRGb3JtYXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotCi1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi0vKioKLSAqIDxwLz4KLSAqIE1lc3NhZ2VGb3JtYXR0ZXIgaW1wbGVtZW50YXRpb25zIGFyZSB1c2VkIGJ5IEF4aXMyIHRvIHN1cHBvcnQgc2VyaWFsaXphdGlvbgotICogb2YgbWVzc2FnZXMgdG8gZGlmZmVyZW50IG1lc3NhZ2UgZm9ybWF0cy4gKEVnOiBKU09OKS4gVXNlcnMgY2FuIHJlZ2lzdGVyCi0gKiBNZXNzYWdlRm9ybWF0dGVyIGltcGxlbWVudGF0aW9ucyBhZ2FpbnN0IGEgbWVzc2FnZSB0eXBlIHVzaW5nIHRoZSBheGlzMi54bWwuCi0gKiBNZXNzYWdlIHR5cGUgZm9yIGEgbWVzc2FnZSBjYW4gYmUgc3BlY2lmaWVkIGJ5IHNldHRpbmcgdGhlICJtZXNzYWdlVHlwZSIKLSAqIHByb3BlcnR5IGluIHRoZSBNZXNzYWdlQ29udGV4dC4gVGhpcyBjYW4gYWxzbyBiZSBnaXZlbiBhcyBhIHBhcmFtZXRlciBpbiB0aGUKLSAqIHNlcnZpY2UueG1sL2F4aXMyLnhtbCBmb3IgYSBwZXIgc2VydmljZSBiYXNlZC9lbmdpbmUgd2lkZSBjb25maWd1cmF0aW9uLgotICogPC9wPgotICogPHAvPgotICogPG1lc3NhZ2VGb3JtYXR0ZXJzPgotICogPG1lc3NhZ2VGb3JtYXR0ZXIgY29udGVudFR5cGU9ImFwcGxpY2F0aW9uL3NvYXAreG1sIgotICogY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuU09BUE1lc3NhZ2VGb3JtYXR0ZXIiLz4KLSAqIDwvbWVzc2FnZUZvcm1hdHRlcnM+Ci0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWVzc2FnZUZvcm1hdHRlciB7Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIGEgYnl0ZSBhcnJheSBvZiB0aGUgbWVzc2FnZSBmb3JtYXR0ZWQgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbgotICAgICAqICAgICAgICAgbWVzc2FnZSBmb3JtYXQuCi0gICAgICovCi0gICAgcHVibGljIGJ5dGVbXSBnZXRCeXRlcyhNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCwgT01PdXRwdXRGb3JtYXQgZm9ybWF0KQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdDsKLQotICAgIC8qKgotICAgICAqIFRvIHN1cHBvcnQgZGVmZmVyZWQgd3JpdGluZyB0cmFuc3BvcnRzIGFzIGluIGh0dHAgY2h1bmtpbmcuLiBBeGlzMiB3YXMKLSAgICAgKiBkb2luZyB0aGlzIGZvciBzb21lIHRpbWUuLgotICAgICAqIDxwLz4KLSAgICAgKiBQcmVzZXJ2ZSBmbGFnIGNhbiBiZSB1c2VkIHRvIHByZXNlcnZlIHRoZSBlbnZlbG9wZSBmb3IgbGF0ZXIgdXNlLiBUaGlzIGlzCi0gICAgICogdXNlZnVsbCB3aGVuIGltcGxlbWVudGluZyBhdXRoZW50aWNhdGlvbiBtYWNobmlzbXMgbGlrZSBOVExNLgotICAgICAqCi0gICAgICogQHBhcmFtIG91dHB1dFN0cmVhbQotICAgICAqIEBwYXJhbSBwcmVzZXJ2ZSAgICAgOgotICAgICAqICAgICAgICAgICAgICAgICAgICAgZG8gbm90IGNvbnN1bWUgdGhlIE9NIHdoZW4gdGhpcyBpcyBzZXQuLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQsIE9NT3V0cHV0Rm9ybWF0IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0sIGJvb2xlYW4gcHJlc2VydmUpIHRocm93cyBBeGlzRmF1bHQ7Ci0KLSAgICAvKioKLSAgICAgKiBEaWZmZXJlbnQgbWVzc2FnZSBmb3JtYXRzIGNhbiBzZXQgdGhlaXIgb3duIGNvbnRlbnQgdHlwZXMKLSAgICAgKiBFZzogSlNPTkZvcm1hdHRlciBjYW4gc2V0IHRoZSBjb250ZW50IHR5cGUgYXMgYXBwbGljYXRpb24vanNvbgotICAgICAqCi0gICAgICogQHBhcmFtIG1lc3NhZ2VDb250ZXh0Ci0gICAgICogQHBhcmFtIGZvcm1hdAotICAgICAqIEBwYXJhbSBzb2FwQWN0aW9uCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRDb250ZW50VHlwZShNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCwgT01PdXRwdXRGb3JtYXQgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNvYXBBY3Rpb24pOwotCi0gICAgLyoqCi0gICAgICogU29tZSBtZXNzYWdlIGZvcm1hdHMgbWF5IHdhbnQgdG8gYWx0ZXIgdGhlIHRhcmdldCB1cmwuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSB0YXJnZXQgVVJMCi0gICAgICovCi0gICAgcHVibGljIFVSTCBnZXRUYXJnZXRBZGRyZXNzKE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0LCBPTU91dHB1dEZvcm1hdCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTCB0YXJnZXRVUkwpIHRocm93cyBBeGlzRmF1bHQ7Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoaXMgb25seSBpZiB5b3Ugd2FudCBzZXQgYSB0cmFuc3BvcnQgaGVhZGVyIGZvciBTT0FQIEFjdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZm9ybWF0U09BUEFjdGlvbihNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCwgT01PdXRwdXRGb3JtYXQgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc29hcEFjdGlvbik7Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L091dFRyYW5zcG9ydEluZm8uamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvT3V0VHJhbnNwb3J0SW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmQ4ZWM5Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvT3V0VHJhbnNwb3J0SW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0OwotCi1wdWJsaWMgaW50ZXJmYWNlIE91dFRyYW5zcG9ydEluZm8gewotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldENvbnRlbnRUeXBlKFN0cmluZyBjb250ZW50VHlwZSk7Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L1JlcXVlc3RSZXNwb25zZVRyYW5zcG9ydC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9SZXF1ZXN0UmVzcG9uc2VUcmFuc3BvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZmNTRlMy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L1JlcXVlc3RSZXNwb25zZVRyYW5zcG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgcmVwcmVzZW50cyBhIGNvbnRyb2wgb2JqZWN0IGZvciBhIFJlcXVlc3QvUmVzcG9uc2UgdHJhbnNwb3J0LgotICogVGhlIG5vcm1hbCBmbG93IG9mIEF4aXMyIGlzIHJvb3RlZCBhdCB0aGUgdHJhbnNwb3J0IC0tIHRoaXMgZG9lcyBub3QKLSAqIGFsbG93IGZvciBhbiBhY2tub3dsZWRnZW1lbnQgdG8gYmUgdHJhbnNtaXR0ZWQgYmVmb3JlIHByb2Nlc3NpbmcgaGFzCi0gKiBjb21wbGV0ZWQsIG5vciBkb2VzIGl0IGFsbG93IGZvciBwcm9jZXNzaW5nIHRvIGJlIHBhdXNlZCBhbmQgcmVzdW1lZAotICogb24gYSBzZXBhcmF0ZSB0aHJlYWQgd2l0aG91dCBoYXZpbmcgYSByZXNwb25zZSBiZSBzZW50IGJhY2suICBUaGlzIGludGVyZmFjZQotICogZW5hYmxlcyBib3RoIG9mIHRob3NlIHNjZW5hcmlvcyBieSBhbGxvd2luZyB0aGUgdHJhbnNwb3J0IHRvIGV4cG9zZQotICogY29udHJvbHMgdG8gdGhlIHJlc3Qgb2YgdGhlIGVuZ2luZSB2aWEgYSBjYWxsYmFjay4KLSAqLwotcHVibGljIGludGVyZmFjZSBSZXF1ZXN0UmVzcG9uc2VUcmFuc3BvcnQgewotCi0gICAgLypUaGlzIGlzIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0aGF0IGlzIHRvIGJlIHN0b3JlZCBvbiB0aGUKLSAgICBNZXNzYWdlQ29udGV4dCovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJBTlNQT1JUX0NPTlRST0wKLSAgICAgICAgICAgID0gIlJlcXVlc3RSZXNwb25zZVRyYW5zcG9ydENvbnRyb2wiOwotCi0gICAgLyoqCi0gICAgICogSWYgdGhpcyBwcm9wZXJ0eSBpcyBzZXQgdG8gdHJ1ZSBpbiBhIG1lc3NhZ2UgdHJhbnNwb3J0IHdpbGwgY2FsbCB0aGUgYXdhaXRSZXNwb25zZSBtZXRob2QKLSAgICAgKiBvZiB0aGUgUmVxdWVzdFJlc3BvbnNlVHJhbnNwb3J0IGluc3RlYWQgb2YgcmV0dXJuaW5nLiBUaGUgdmFsdWUgc2hvdWxkIGJlIGEgQm9vbGVhbiBvYmplY3QuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSE9MRF9SRVNQT05TRSA9ICJIb2xkUmVzcG9uc2UiOwotCi0gICAgLyoqCi0gICAgICogTm90aWZ5IHRoZSB0cmFuc3BvcnQgdGhhdCBhIG1lc3NhZ2Ugc2hvdWxkIGJlIGFja25vd2xlZGdlZCBhdCB0aGlzIHRpbWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbXNnQ29udGV4dAotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWNrbm93bGVkZ2VNZXNzYWdlKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHRocm93cyBBeGlzRmF1bHQ7Ci0KLSAgICAvKioKLSAgICAgKiBQYXVzZSBleGVjdXRpb24gYW5kIHdhaXQgZm9yIGEgcmVzcG9uc2UgbWVzc2FnZSB0byBiZSByZWFkeS4gIFRoaXMgd2lsbAotICAgICAqIHR5cGljYWxseSBiZSBjYWxsZWQgYnkgdGhlIHRyYW5zcG9ydCBhZnRlciBhIG1lc3NhZ2UgaGFzIGJlZW4gcGF1c2VkIGFuZAotICAgICAqIHdpbGwgY2F1c2UgdGhlIHRyYW5zcG9ydCB0byBibG9jayB1bnRpbCBhIHJlc3BvbnNlIG1lc3NhZ2UgaXMgcmVhZHkgdG8gYmUKLSAgICAgKiByZXR1cm5lZC4gIFRoaXMgaXMgcmVxdWlyZWQgdG8gZW5hYmxlIFJNIGZvciBpbi1vdXQgTUVQcyBvdmVyIGEKLSAgICAgKiByZXF1ZXN0L3Jlc3BvbnNlIHRyYW5zcG9ydDsgd2l0aG91dCBpdCB0aGUgbWVzc2FnZSB3b3VsZCBiZSBwYXVzZWQgYW5kIHRoZQotICAgICAqIHRyYW5zcG9ydCB3b3VsZCBzaW1wbHkgYWNrIHRoZSByZXF1ZXN0LgotICAgICAqCi0gICAgICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGF3YWl0UmVzcG9uc2UoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24sIEF4aXNGYXVsdDsKLQotICAgIC8qKgotICAgICAqIFNpZ25hbCB0aGF0IGEgcmVzcG9uc2UgaGFzIGJlIGNyZWF0ZWQgYW5kIGlzIHJlYWR5IGZvciB0cmFuc21pc3Npb24uICBUaGlzCi0gICAgICogc2hvdWxkIHJlbGVhc2UgYW55b25lIHdobyBpcyBibG9ja2VkIG9uIGEgYXdhaXRSZXNwb25zZSgpLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNpZ25hbFJlc3BvbnNlUmVhZHkoKTsKLQotICAgIC8qKgotICAgICAqIFRoaXMgd2lsbCB0ZWxsIHRoZSB0cmFuc3BvcnQgdG8gZW5kIGEgY3VycmVudCB3YWl0IGJ5IHJhaXNpbmcgdGhlIGdpdmVuIGZhdWx0LgotICAgICAqIEBwYXJhbSBmYXVsdCBUaGUgZmF1bHQgdG8gYmUgcmFpc2VkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNpZ25hbEZhdWx0UmVhZHkoQXhpc0ZhdWx0IGZhdWx0KTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGlzIGdpdmVzIHRoZSBjdXJyZW50IHN0YXR1cyBvZiBhbiBSZXF1ZXN0UmVzcG9uc2VUcmFuc3BvcnQgb2JqZWN0LgotICAgICAqCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBSZXF1ZXN0UmVzcG9uc2VUcmFuc3BvcnRTdGF0dXMgZ2V0U3RhdHVzKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhpcyB3aWxsIGluZGljYXRlIHdoZXRoZXIgb3Igbm90IHRoZSByZXNwb25zZSBoYXMgYWxyZWFkeSBiZWVuIHdyaXR0ZW4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Jlc3BvbnNlV3JpdHRlbigpOwotICAgIAotICAgIC8qKgotICAgICAqIFRoaXMgaXMgdXNlZCB0byBzZXQgdGhlIHJlc3BvbnNlIHdyaXR0ZW4gZmxhZyBvbiB0aGUgUmVxdWVzdFJlc3BvbnNlVHJhbnNwb3J0IAotICAgICAqIGluc3RhbmNlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UmVzcG9uc2VXcml0dGVuKGJvb2xlYW4gcmVzcG9uc2VXcml0dGVuKTsKLSAgICAKLQotICAgIC8qKgotICAgICAqIFVzZWQgdG8gZ2l2ZSB0aGUgY3VycmVudCBzdGF0dXMgb2YgdGhlIFJlcXVlc3RSZXNwb25zZVRyYW5zcG9ydCBvYmplY3QuCi0gICAgICovCi0gICAgcHVibGljIGNsYXNzIFJlcXVlc3RSZXNwb25zZVRyYW5zcG9ydFN0YXR1cyB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBUcmFuc3BvcnQgaXMgaW4gaXRzIGluaXRpYWwgc3RhZ2UuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFJlcXVlc3RSZXNwb25zZVRyYW5zcG9ydFN0YXR1cyBJTklUSUFMID0KLSAgICAgICAgICAgICAgICBuZXcgUmVxdWVzdFJlc3BvbnNlVHJhbnNwb3J0U3RhdHVzKDEpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBhd2FpdFJlc3BvbnNlIGhhcyBiZWVuIGNhbGxlZC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgUmVxdWVzdFJlc3BvbnNlVHJhbnNwb3J0U3RhdHVzIFdBSVRJTkcgPQotICAgICAgICAgICAgICAgIG5ldyBSZXF1ZXN0UmVzcG9uc2VUcmFuc3BvcnRTdGF0dXMoMik7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIGFja25vd2xlZGdlTWVzc2FnZSBoYXMgYmVlbiBjYWxsZWQuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFJlcXVlc3RSZXNwb25zZVRyYW5zcG9ydFN0YXR1cyBBQ0tFRCA9IAotICAgICAgICAgICAgICAgIG5ldyBSZXF1ZXN0UmVzcG9uc2VUcmFuc3BvcnRTdGF0dXMgKDMpOwotICAgICAgICAvKioKLSAgICAgICAgICogJ3NpZ25hbFJlc3BvbnNlUmVhZHknIGhhcyBiZWVuIGNhbGxlZC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgUmVxdWVzdFJlc3BvbnNlVHJhbnNwb3J0U3RhdHVzIFNJR05BTExFRCA9Ci0gICAgICAgICAgICAgICAgbmV3IFJlcXVlc3RSZXNwb25zZVRyYW5zcG9ydFN0YXR1cyg0KTsKLQotICAgICAgICBwcml2YXRlIGludCB2YWx1ZTsKLQotICAgICAgICBwcml2YXRlIFJlcXVlc3RSZXNwb25zZVRyYW5zcG9ydFN0YXR1cyhpbnQgdmFsdWUpIHsKLSAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotICAgICAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgUmVxdWVzdFJlc3BvbnNlVHJhbnNwb3J0U3RhdHVzKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsIFJlcXVlc3RSZXNwb25zZVRyYW5zcG9ydFN0YXR1cyBpbnN0YW5jZSA9IChSZXF1ZXN0UmVzcG9uc2VUcmFuc3BvcnRTdGF0dXMpIG9iajsKLSAgICAgICAgICAgIHJldHVybiAodmFsdWUgPT0gaW5zdGFuY2UudmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgICAgIHJldHVybiBJbnRlZ2VyLnRvU3RyaW5nKHZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L1NpbXBsZUF4aXMyU2VydmVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L1NpbXBsZUF4aXMyU2VydmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAzYzU1MDAuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9TaW1wbGVBeGlzMlNlcnZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLkNvbW1hbmRMaW5lT3B0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5Db21tYW5kTGluZU9wdGlvblBhcnNlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuT3B0aW9uc1ZhbGlkYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1wdWJsaWMgY2xhc3MgU2ltcGxlQXhpczJTZXJ2ZXIgZXh0ZW5kcyBBeGlzU2VydmVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhTaW1wbGVBeGlzMlNlcnZlci5jbGFzcyk7Ci0KLSAgICBpbnQgcG9ydCA9IC0xOwotCi0gICAgcHVibGljIHN0YXRpYyBpbnQgREVGQVVMVF9QT1JUID0gODA4MDsKLQotCi0gICAgcHVibGljIFNpbXBsZUF4aXMyU2VydmVyICgKLSAgICAgICAgICAgIFN0cmluZyByZXBvTG9jYXRpb24sCi0gICAgICAgICAgICBTdHJpbmcgY29uZkxvY2F0aW9uKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIoZmFsc2UpOwotICAgICAgICBjb25maWdDb250ZXh0ID0gQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5Ci0gICAgICAgICAgICAgICAgLmNyZWF0ZUNvbmZpZ3VyYXRpb25Db250ZXh0RnJvbUZpbGVTeXN0ZW0ocmVwb0xvY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uZkxvY2F0aW9uKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBhcmdzCi0gICAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHJlcG9Mb2NhdGlvbiA9IG51bGw7Ci0gICAgICAgIFN0cmluZyBjb25mTG9jYXRpb24gPSBudWxsOwotCi0gICAgICAgIENvbW1hbmRMaW5lT3B0aW9uUGFyc2VyIG9wdGlvbnNQYXJzZXIgPSBuZXcgQ29tbWFuZExpbmVPcHRpb25QYXJzZXIoYXJncyk7Ci0gICAgICAgIExpc3QgaW52YWxpZE9wdGlvbnNMaXN0ID0gb3B0aW9uc1BhcnNlci5nZXRJbnZhbGlkT3B0aW9ucyhuZXcgT3B0aW9uc1ZhbGlkYXRvcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzSW52YWxpZChDb21tYW5kTGluZU9wdGlvbiBvcHRpb24pIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgb3B0aW9uVHlwZSA9IG9wdGlvbi5nZXRPcHRpb25UeXBlKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICEoInJlcG8iLmVxdWFsc0lnbm9yZUNhc2Uob3B0aW9uVHlwZSkgfHwgImNvbmYiCi0gICAgICAgICAgICAgICAgICAgICAgICAuZXF1YWxzSWdub3JlQ2FzZShvcHRpb25UeXBlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIGlmICgoaW52YWxpZE9wdGlvbnNMaXN0LnNpemUoKSA+IDApIHx8IChhcmdzLmxlbmd0aCA+IDQpKSB7Ci0gICAgICAgICAgICBwcmludFVzYWdlKCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBNYXAgb3B0aW9uc01hcCA9IG9wdGlvbnNQYXJzZXIuZ2V0QWxsT3B0aW9ucygpOwotCi0gICAgICAgIENvbW1hbmRMaW5lT3B0aW9uIHJlcG9PcHRpb24gPSAoQ29tbWFuZExpbmVPcHRpb24pIG9wdGlvbnNNYXAKLSAgICAgICAgICAgICAgICAuZ2V0KCJyZXBvIik7Ci0gICAgICAgIENvbW1hbmRMaW5lT3B0aW9uIGNvbmZPcHRpb24gPSAoQ29tbWFuZExpbmVPcHRpb24pIG9wdGlvbnNNYXAKLSAgICAgICAgICAgICAgICAuZ2V0KCJjb25mIik7Ci0KLSAgICAgICAgbG9nLmluZm8oIltTaW1wbGVBeGlzU2VydmVyXSBTdGFydGluZyIpOwotICAgICAgICBpZiAocmVwb09wdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXBvTG9jYXRpb24gPSByZXBvT3B0aW9uLmdldE9wdGlvblZhbHVlKCk7Ci0gICAgICAgICAgICBsb2cuaW5mbygiW1NpbXBsZUF4aXNTZXJ2ZXJdIFVzaW5nIHRoZSBBeGlzMiBSZXBvc2l0b3J5IgotICAgICAgICAgICAgICAgICAgICArIG5ldyBGaWxlKHJlcG9Mb2NhdGlvbikuZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJbU2ltcGxlQXhpc1NlcnZlcl0gVXNpbmcgdGhlIEF4aXMyIFJlcG9zaXRvcnkiCi0gICAgICAgICAgICAgICAgICAgICsgbmV3IEZpbGUocmVwb0xvY2F0aW9uKS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNvbmZPcHRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgY29uZkxvY2F0aW9uID0gY29uZk9wdGlvbi5nZXRPcHRpb25WYWx1ZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dAotICAgICAgICAgICAgICAgICAgICAucHJpbnRsbigiW1NpbXBsZUF4aXNTZXJ2ZXJdIFVzaW5nIHRoZSBBeGlzMiBDb25maWd1cmF0aW9uIEZpbGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBuZXcgRmlsZShjb25mTG9jYXRpb24pLmdldEFic29sdXRlUGF0aCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTaW1wbGVBeGlzMlNlcnZlciBzZXJ2ZXIgPSBuZXcgU2ltcGxlQXhpczJTZXJ2ZXIocmVwb0xvY2F0aW9uLCBjb25mTG9jYXRpb24pOwotICAgICAgICAgICAgc2VydmVyLnN0YXJ0KCk7Ci0gICAgICAgICAgICBsb2cuaW5mbygiW1NpbXBsZUF4aXNTZXJ2ZXJdIFN0YXJ0ZWQiKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiW1NpbXBsZUF4aXNTZXJ2ZXJdIFN0YXJ0ZWQiKTsKLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgICAgIGxvZy5mYXRhbCgiW1NpbXBsZUF4aXNTZXJ2ZXJdIFNodXR0aW5nIGRvd24uIEVycm9yIHN0YXJ0aW5nIFNpbXBsZUF4aXNTZXJ2ZXIiLCB0KTsKLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiW1NpbXBsZUF4aXNTZXJ2ZXJdIFNodXR0aW5nIGRvd24uIEVycm9yIHN0YXJ0aW5nIFNpbXBsZUF4aXNTZXJ2ZXIiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwcmludFVzYWdlKCkgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oCi0gICAgICAgICAgICAgICAgIlVzYWdlOiBTaW1wbGVBeGlzU2VydmVyIC1yZXBvIDxyZXBvc2l0b3J5PiAgLWNvbmYgPGF4aXMyIGNvbmZpZ3VyYXRpb24gZmlsZT4iKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCk7Ci0gICAgICAgIFN5c3RlbS5leGl0KDEpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvVHJhbnNwb3J0TGlzdGVuZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvVHJhbnNwb3J0TGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkwZDcwZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L1RyYW5zcG9ydExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuU2Vzc2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5UcmFuc3BvcnRJbkRlc2NyaXB0aW9uOwotCi0vKioKLSAqIENsYXNzIFRyYW5zcG9ydExpc3RlbmVyCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVHJhbnNwb3J0TGlzdGVuZXIgewotCi0gICAgU3RyaW5nIFBBUkFNX1BPUlQgPSAicG9ydCI7Ci0gICAgU3RyaW5nIEhPU1RfQUREUkVTUyA9ICJob3N0bmFtZSI7Ci0KLSAgICB2b2lkIGluaXQoQ29uZmlndXJhdGlvbkNvbnRleHQgYXhpc0NvbmYsIFRyYW5zcG9ydEluRGVzY3JpcHRpb24gdHJhbnNwcnRJbikKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQ7Ci0KLSAgICB2b2lkIHN0YXJ0KCkgdGhyb3dzIEF4aXNGYXVsdDsKLQotICAgIHZvaWQgc3RvcCgpIHRocm93cyBBeGlzRmF1bHQ7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gc2VydmljZU5hbWUKLSAgICAgKiBAcGFyYW0gaXAKLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdAotICAgICAqIEBkZXByZWNhdGVkIFRyYW5zcG9ydCBsaXN0ZW5lciBjYW4gZXhwb3NlIG1vcmUgdGhhbiBFUFJzLiBTbyB0aGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuIGFuIGFycmF5IG9mIEVQUnMuCi0gICAgICogICAgICAgICAgICAgRGVwcmVjYXRpbmcgdGhpcyBtZXRob2QgZm9yIG5vdyBhbmQgcGxlYXNlIHVzZSBnZXRFUFJzRm9yU2VydmljZXMgaW5zdGVhZC4KLSAgICAgKi8KLSAgICBFbmRwb2ludFJlZmVyZW5jZSBnZXRFUFJGb3JTZXJ2aWNlKFN0cmluZyBzZXJ2aWNlTmFtZSwgU3RyaW5nIGlwKSB0aHJvd3MgQXhpc0ZhdWx0OwotCi0gICAgRW5kcG9pbnRSZWZlcmVuY2VbXSBnZXRFUFJzRm9yU2VydmljZShTdHJpbmcgc2VydmljZU5hbWUsIFN0cmluZyBpcCkgdGhyb3dzIEF4aXNGYXVsdDsKLQotICAgIC8qKgotICAgICAqIFRvIGdldCB0aGUgc2Vzc2lvbkNvbnRleHQgdHJhbnNwb3J0IGRlcGVuZGVudCBtYW5uZXIuIFNvIHRoYXQgdHJhbnNwb3J0IGxpc3RlbmVyCi0gICAgICogY2FuIHJldHVybiBpdHMgb3duIGltcGxlbWVudGF0aW9uIG9mIHNlc3Npb24gbWFuYWdtZW50Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVzc2FnZUNvbnRleHQgOiBNZXNzYWdlQ29udGV4dCB3aGljaCBoYXMgYWxsIHRoZSByZWxhdmVudCBkYXRhCi0gICAgICogQHJldHVybiBTZXNzaW9uQ29udGV4dAotICAgICAqLwotICAgIFNlc3Npb25Db250ZXh0IGdldFNlc3Npb25Db250ZXh0KE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0KTsKLSAgICAKLSAgICB2b2lkIGRlc3Ryb3koKTsKLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvVHJhbnNwb3J0U2VuZGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L1RyYW5zcG9ydFNlbmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWY5MTk5Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvVHJhbnNwb3J0U2VuZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uVHJhbnNwb3J0T3V0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuSGFuZGxlcjsKLQotLyoqCi0gKiBUcmFuc3BvcnRTZW5kZXIgc2VuZHMgdGhlIFNPQVAgTWVzc2FnZSB0byBvdGhlciBTT0FQIG5vZGVzLiBBIFRyYW5zcG9ydFNlbmRlciBpcyByZXNwb25zaWJsZSBmb3IKLSAqIHdyaXRpbmcgdGhlIFNPQVAgTWVzc2FnZSB0byB0aGUgd2lyZS4gT3V0IGZsb3cgbXVzdCBiZSB0ZXJtaW5hdGVkIGVuZCB3aXRoIGEgVHJhbnNwb3J0U2VuZGVyCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVHJhbnNwb3J0U2VuZGVyIGV4dGVuZHMgSGFuZGxlciB7Ci0KLSAgICAvKioKLSAgICAgKiBDbGVhbiB1cAotICAgICAqCi0gICAgICogQHBhcmFtIG1zZ0NvbnRleHQKLSAgICAgKiBAdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgY2xlYW51cChNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB0aHJvd3MgQXhpc0ZhdWx0OwotCi0gICAgLyoqCi0gICAgICogSW5pdGlhbGl6ZQotICAgICAqCi0gICAgICogQHBhcmFtIGNvbmZDb250ZXh0Ci0gICAgICogQHBhcmFtIHRyYW5zcG9ydE91dAotICAgICAqIEB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbml0KENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZDb250ZXh0LCBUcmFuc3BvcnRPdXREZXNjcmlwdGlvbiB0cmFuc3BvcnRPdXQpCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0OwotCi0gICAgcHVibGljIHZvaWQgc3RvcCgpOwotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9UcmFuc3BvcnRVdGlscy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9UcmFuc3BvcnRVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTQzZDMyLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvVHJhbnNwb3J0VXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLmF0dGFjaG1lbnRzLkF0dGFjaG1lbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uYXR0YWNobWVudHMuQ2FjaGVkRmlsZURhdGFTb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5hdHRhY2htZW50cy5saWZlY3ljbGUuTGlmZWN5Y2xlTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01PdXRwdXRGb3JtYXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmJ1aWxkZXIuU3RBWEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS51dGlsLkRldGFjaGFibGVJbnB1dFN0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUDExQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQMTJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLmltcGwubGxvbS5zb2FwMTEuU09BUDExRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmJ1aWxkZXIuQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmJ1aWxkZXIuQnVpbGRlclV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5PcGVyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC5EZXBsb3ltZW50Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaTE4bi5NZXNzYWdlczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkFwcGxpY2F0aW9uWE1MRm9ybWF0dGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuSFRUUENvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLlNPQVBNZXNzYWdlRm9ybWF0dGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuWEZvcm1VUkxFbmNvZGVkRm9ybWF0dGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5KYXZhVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC5hY3RpdmF0aW9uLkRhdGFTb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvcjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGNsYXNzIFRyYW5zcG9ydFV0aWxzIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhUcmFuc3BvcnRVdGlscy5jbGFzcyk7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFNPQVBFbnZlbG9wZSBjcmVhdGVTT0FQTWVzc2FnZShNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZVNPQVBNZXNzYWdlKG1zZ0NvbnRleHQsIGZhbHNlKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2Qgd2lsbCBjcmVhdGUgYSBTT0FQRW52ZWxvcGUgYmFzZWQgb24gdGhlIElucHV0U3RyZWFtIHN0b3JlZCBvbgotICAgICAqIHRoZSBNZXNzYWdlQ29udGV4dC4gVGhlICdkZXRhY2gnIHBhcmFtZXRlciBjb250cm9scyB3aGV0aGVyIG9yIG5vdCB0aGUgCi0gICAgICogdW5kZXJseWluZyBEZXRhY2hhYmxlSW5wdXRTdHJlYW0gaXMgZGV0YWNoZWQgYXQgdGhlIGVuZCBvZiB0aGUgbWV0aG9kLiBOb3RlLAotICAgICAqIGRldGFjaGluZyB0aGUgRGV0YWNoYWJsZUlucHV0U3RyZWFtIGNsb3NlcyB0aGUgdW5kZXJseWluZyBJbnB1dFN0cmVhbSB0aGF0Ci0gICAgICogaXMgc3RvcmVkIG9uIHRoZSBNZXNzYWdlQ29udGV4dC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFNPQVBFbnZlbG9wZSBjcmVhdGVTT0FQTWVzc2FnZShNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZGV0YWNoKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLS8vICAgICAgICBmaW5hbCBTT0FQRW52ZWxvcGUgZW52ZWxvcGUgPSBtc2dDb250ZXh0LmdldEVudmVsb3BlKCk7Ci0vLyAgICAgICAgaWYgKGVudmVsb3BlICE9IG51bGwpIHsKLS8vICAgICAgICAgICAgaWYgKGVudmVsb3BlLmlzQ29tcGxldGUoKSkKLS8vICAgICAgICAgICAgICAgIHJldHVybiBlbnZlbG9wZTsKLS8vICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJbnB1dFN0cmVhbSBpblN0cmVhbSA9IChJbnB1dFN0cmVhbSkgbXNnQ29udGV4dAotICAgICAgICAgICAgICAgICAgICAuZ2V0UHJvcGVydHkoTWVzc2FnZUNvbnRleHQuVFJBTlNQT1JUX0lOKTsKLSAgICAgICAgICAgIG1zZ0NvbnRleHQuc2V0UHJvcGVydHkoTWVzc2FnZUNvbnRleHQuVFJBTlNQT1JUX0lOLCBudWxsKTsKLQotICAgICAgICAgICAgLy8gdGhpcyBpbnB1dHN0cmFtIGlzIHNldCBieSB0aGUgVHJhbnNwb3J0U2VuZGVyIHJlcHJlc2VudHMgYSB0d28KLSAgICAgICAgICAgIC8vIHdheSB0cmFuc3BvcnQgb3IgYSBUcmFuc3BvcnQgUmVjZXZpZXIKLSAgICAgICAgICAgIGlmIChpblN0cmVhbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdChNZXNzYWdlcy5nZXRNZXNzYWdlKCJpbnB1dHN0cmVhbU51bGwiKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0cmluZyBjb250ZW50VHlwZSA9IChTdHJpbmcpIG1zZ0NvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KENvbnN0YW50cy5Db25maWd1cmF0aW9uLkNPTlRFTlRfVFlQRSk7Ci0KLSAgICAgICAgICAgIC8vIGdldCB0aGUgdHlwZSBvZiBjaGFyIGVuY29kaW5nCi0gICAgICAgICAgICBTdHJpbmcgY2hhclNldEVuYyA9IChTdHJpbmcpIG1zZ0NvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KENvbnN0YW50cy5Db25maWd1cmF0aW9uLkNIQVJBQ1RFUl9TRVRfRU5DT0RJTkcpOwotICAgICAgICAgICAgaWYgKGNoYXJTZXRFbmMgPT0gbnVsbCAmJiBjb250ZW50VHlwZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY2hhclNldEVuYyA9IEJ1aWxkZXJVdGlsLmdldENoYXJTZXRFbmNvZGluZyhjb250ZW50VHlwZSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGNoYXJTZXRFbmMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNoYXJTZXRFbmMgPSBNZXNzYWdlQ29udGV4dC5ERUZBVUxUX0NIQVJfU0VUX0VOQ09ESU5HOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbXNnQ29udGV4dC5zZXRQcm9wZXJ0eShDb25zdGFudHMuQ29uZmlndXJhdGlvbi5DSEFSQUNURVJfU0VUX0VOQ09ESU5HLCBjaGFyU2V0RW5jKTsKLQotICAgICAgICAgICAgU09BUEVudmVsb3BlIGVudiA9IGNyZWF0ZVNPQVBNZXNzYWdlKG1zZ0NvbnRleHQsIGluU3RyZWFtLCBjb250ZW50VHlwZSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIGlmIHdlIHdlcmUgdG9sZCB0byBkZXRhY2gsIHdlIHdpbGwgbWFrZSB0aGUgY2FsbCBoZXJlLCB0aGlzIGlzIG9ubHkgYXBwbGljYWJsZQotICAgICAgICAgICAgLy8gaWYgYSBEZXRhY2hhYmxlSW5wdXRTdHJlYW0gaW5zdGFuY2UgaXMgZm91bmQgb24gdGhlIE1lc3NhZ2VDb250ZXh0Ci0gICAgICAgICAgICBpZihkZXRhY2gpIHsKLSAgICAgICAgICAgICAgICBEZXRhY2hhYmxlSW5wdXRTdHJlYW0gZGlzID0gKERldGFjaGFibGVJbnB1dFN0cmVhbSkgbXNnQ29udGV4dC5nZXRQcm9wZXJ0eShDb25zdGFudHMuREVUQUNIQUJMRV9JTlBVVF9TVFJFQU0pOwotICAgICAgICAgICAgICAgIGlmKGRpcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkRldGFjaGluZyBpbnB1dCBzdHJlYW0gYWZ0ZXIgU09BUEVudmVsb3BlIGNvbnN0cnVjdGlvbiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGRpcy5kZXRhY2goKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZW52OwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIE9iamVjdGl2ZSBvZiB0aGlzIG1ldGhvZCBpcyB0byBjYXB0dXJlIHRoZSBTT0FQRW52ZWxvcGUgY3JlYXRpb24gbG9naWMKLSAgICAgKiBhbmQgbWFrZSBpdCBhIGNvbW1vbiBmb3IgYWxsIHRoZSB0cmFuc3BvcnRzIGFuZCB0byBpbi9vdXQgZmxvd3MuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbXNnQ29udGV4dAotICAgICAqIEBwYXJhbSBpblN0cmVhbQotICAgICAqIEBwYXJhbSBjb250ZW50VHlwZQotICAgICAqIEByZXR1cm4gdGhlIFNPQVBFbnZlbG9wZQotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0Ci0gICAgICogQHRocm93cyBPTUV4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBGYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTT0FQRW52ZWxvcGUgY3JlYXRlU09BUE1lc3NhZ2UoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBpblN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY29udGVudFR5cGUpCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0LCBPTUV4Y2VwdGlvbiwgWE1MU3RyZWFtRXhjZXB0aW9uLAotICAgICAgICAgICAgRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvciB7Ci0gICAgICAgIE9NRWxlbWVudCBkb2N1bWVudEVsZW1lbnQgPSBjcmVhdGVEb2N1bWVudEVsZW1lbnQoY29udGVudFR5cGUsIG1zZ0NvbnRleHQsIGluU3RyZWFtKTsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZVNPQVBFbnZlbG9wZShkb2N1bWVudEVsZW1lbnQpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU09BUEVudmVsb3BlIGNyZWF0ZVNPQVBFbnZlbG9wZShPTUVsZW1lbnQgZG9jdW1lbnRFbGVtZW50KSB7Ci0gICAgICAgIFNPQVBFbnZlbG9wZSBlbnZlbG9wZTsKLSAgICAgICAgLy8gQ2hlY2sgd2hldGhlciB3ZSBoYXZlIHJlY2VpdmVkIGEgU09BUEVudmVsb3BlIG9yIG5vdAotICAgICAgICBpZiAoZG9jdW1lbnRFbGVtZW50IGluc3RhbmNlb2YgU09BUEVudmVsb3BlKSB7Ci0gICAgICAgICAgICBlbnZlbG9wZSA9IChTT0FQRW52ZWxvcGUpIGRvY3VtZW50RWxlbWVudDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIElmIGl0IGlzIG5vdCBhIFNPQVBFbnZlbG9wZSB3ZSB3cmFwIHRoYXQgd2l0aCBhIGZha2UKLSAgICAgICAgICAgIC8vIFNPQVBFbnZlbG9wZS4KLSAgICAgICAgICAgIFNPQVBGYWN0b3J5IHNvYXBGYWN0b3J5ID0gbmV3IFNPQVAxMUZhY3RvcnkoKTsKLSAgICAgICAgICAgIGVudmVsb3BlID0gc29hcEZhY3RvcnkuZ2V0RGVmYXVsdEVudmVsb3BlKCk7Ci0gICAgICAgICAgICBlbnZlbG9wZS5nZXRCb2R5KCkuYWRkQ2hpbGQoZG9jdW1lbnRFbGVtZW50KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZW52ZWxvcGU7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPTUVsZW1lbnQgY3JlYXRlRG9jdW1lbnRFbGVtZW50KFN0cmluZyBjb250ZW50VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gaW5TdHJlYW0pIHRocm93cyBBeGlzRmF1bHQsIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIE9NRWxlbWVudCBkb2N1bWVudEVsZW1lbnQgPSBudWxsOwotICAgICAgICBTdHJpbmcgdHlwZSA9IG51bGw7Ci0gICAgICAgIGlmIChjb250ZW50VHlwZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnQgaW5kZXggPSBjb250ZW50VHlwZS5pbmRleE9mKCc7Jyk7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPiAwKSB7Ci0gICAgICAgICAgICAgICAgdHlwZSA9IGNvbnRlbnRUeXBlLnN1YnN0cmluZygwLCBpbmRleCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHR5cGUgPSBjb250ZW50VHlwZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIFNvbWUgc2VydmljZXMgc2VuZCBSRVNUIHJlc3BvbmNlcyBhcyB0ZXh0L3htbC4gV2Ugc2hvdWxkIGNvbnZlcnQgaXQgdG8KLSAgICAgICAgICAgIC8vIGFwcGxpY2F0aW9uL3htbCBpZiBpdHMgYSBSRVNUIHJlc3BvbnNlLCBpZiBub3QgaXQgd2lsbCB0cnkgdG8gdXNlIHRoZSBTT0FQTWVzc2FnZUJ1aWxkZXIuCi0gICAgICAgICAgICAvLyBpc0RvaW5nUkVTVCBzaG91bGQgYWxyZWFkeSBiZSBwcm9wZXJseSBzZXQgYnkgSFRUUFRyYW5zcG9ydFV0aWxzLmluaXRpYWxpemVNZXNzYWdlQ29udGV4dAotICAgICAgICAgICAgaWYgKG1zZ0NvbnRleHQuaXNEb2luZ1JFU1QoKSAmJiBIVFRQQ29uc3RhbnRzLk1FRElBX1RZUEVfVEVYVF9YTUwuZXF1YWxzKHR5cGUpKSB7Ci0vLyAgICAgICAgICAgIGlmIChIVFRQQ29uc3RhbnRzLk1FRElBX1RZUEVfVEVYVF9YTUwuZXF1YWxzKHR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1zZ0NvbnRleHQuaXNTZXJ2ZXJTaWRlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1zZ0NvbnRleHQuZ2V0U29hcEFjdGlvbigpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBIVFRQQ29uc3RhbnRzLk1FRElBX1RZUEVfQVBQTElDQVRJT05fWE1MOwotICAgICAgICAgICAgICAgICAgICB9Ci0vLyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1zZ0NvbnRleHQuaXNEb2luZ1JFU1QoKSAmJgotLy8gICAgICAgICAgICAgICAgICAgICAgICAhbXNnQ29udGV4dC5pc1Byb3BlcnR5VHJ1ZShDb25zdGFudHMuQ29uZmlndXJhdGlvbi5TT0FQX1JFU1BPTlNFX01FUCkpIHsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFtc2dDb250ZXh0LmlzUHJvcGVydHlUcnVlKENvbnN0YW50cy5Db25maWd1cmF0aW9uLlNPQVBfUkVTUE9OU0VfTUVQKSkgewotICAgICAgICAgICAgICAgICAgICB0eXBlID0gSFRUUENvbnN0YW50cy5NRURJQV9UWVBFX0FQUExJQ0FUSU9OX1hNTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBCdWlsZGVyIGJ1aWxkZXIgPSBCdWlsZGVyVXRpbC5nZXRCdWlsZGVyRnJvbVNlbGVjdG9yKHR5cGUsIG1zZ0NvbnRleHQpOwotICAgICAgICAgICAgaWYgKGJ1aWxkZXIgIT0gbnVsbCkgewotCSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotCSAgICAgICAgICAgICAgICBsb2cuZGVidWcoImNyZWF0ZVNPQVBFbnZlbG9wZSB1c2luZyBCdWlsZGVyICgiICsgCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmdldENsYXNzKCkgKyAiKSBzZWxlY3RlZCBmcm9tIHR5cGUgKCIgKyB0eXBlICsiKSIpOwotCSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkb2N1bWVudEVsZW1lbnQgPSBidWlsZGVyLnByb2Nlc3NEb2N1bWVudChpblN0cmVhbSwgY29udGVudFR5cGUsIG1zZ0NvbnRleHQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChkb2N1bWVudEVsZW1lbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKG1zZ0NvbnRleHQuaXNEb2luZ1JFU1QoKSkgewotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkNvdWxkIG5vdCBmaW5kIGEgQnVpbGRlciBmb3IgdHlwZSAoIiArIHR5cGUgKyAiKS4gIFVzaW5nIFJFU1QuIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFN0QVhCdWlsZGVyIGJ1aWxkZXIgPSBCdWlsZGVyVXRpbC5nZXRQT1hCdWlsZGVyKGluU3RyZWFtLCBudWxsKTsKLSAgICAgICAgICAgICAgICBkb2N1bWVudEVsZW1lbnQgPSBidWlsZGVyLmdldERvY3VtZW50RWxlbWVudCgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBGSVhNRSBtYWtpbmcgc29hcCBkZWZ1YWx0IGZvciB0aGUgbW9tZW50Li5taWdodCBlZmZlY3QgdGhlCi0gICAgICAgICAgICAgICAgLy8gcGVyZm9ybWFuY2UKLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJDb3VsZCBub3QgZmluZCBhIEJ1aWxkZXIgZm9yIHR5cGUgKCIgKyB0eXBlICsgIikuICBVc2luZyBTT0FQLiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBTdHJpbmcgY2hhclNldEVuYyA9IChTdHJpbmcpIG1zZ0NvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eShDb25zdGFudHMuQ29uZmlndXJhdGlvbi5DSEFSQUNURVJfU0VUX0VOQ09ESU5HKTsKLSAgICAgICAgICAgICAgICBTdEFYQnVpbGRlciBidWlsZGVyID0gQnVpbGRlclV0aWwuZ2V0U09BUEJ1aWxkZXIoaW5TdHJlYW0sIGNoYXJTZXRFbmMpOwotICAgICAgICAgICAgICAgIGRvY3VtZW50RWxlbWVudCA9IGJ1aWxkZXIuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGRvY3VtZW50RWxlbWVudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFeHRyYWN0cyBhbmQgcmV0dXJucyB0aGUgY2hhcmFjdGVyIHNldCBlbmNvZGluZyBmcm9tIHRoZQotICAgICAqIENvbnRlbnQtdHlwZSBoZWFkZXIKLSAgICAgKiBFeGFtcGxlOgotICAgICAqIENvbnRlbnQtVHlwZTogdGV4dC94bWw7IGNoYXJzZXQ9dXRmLTgKLSAgICAgKgotICAgICAqIEBwYXJhbSBjb250ZW50VHlwZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldENoYXJTZXRFbmNvZGluZyhTdHJpbmcgY29udGVudFR5cGUpIHsKLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIklucHV0IGNvbnRlbnRUeXBlICgiICsgY29udGVudFR5cGUgKyAiKSIpOwotICAgICAgICB9Ci0gICAgICAgIGludCBpbmRleCA9IGNvbnRlbnRUeXBlLmluZGV4T2YoSFRUUENvbnN0YW50cy5DSEFSX1NFVF9FTkNPRElORyk7Ci0KLSAgICAgICAgaWYgKGluZGV4ID09IC0xKSB7ICAgIC8vIENoYXJzZXQgZW5jb2Rpbmcgbm90IGZvdW5kIGluIHRoZSBjb250ZW50LXR5cGUgaGVhZGVyCi0gICAgICAgICAgICAvLyBVc2luZyB0aGUgZGVmYXVsdCBVVEYtOAotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJDaGFyU2V0RW5jb2RpbmcgZGVmYXVsdGVkICgiICsgTWVzc2FnZUNvbnRleHQuREVGQVVMVF9DSEFSX1NFVF9FTkNPRElORyArICIpIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gTWVzc2FnZUNvbnRleHQuREVGQVVMVF9DSEFSX1NFVF9FTkNPRElORzsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIElmIHRoZXJlIGFyZSBzcGFjZXMgYXJvdW5kIHRoZSAnPScgc2lnbgotICAgICAgICBpbnQgaW5kZXhPZkVxID0gY29udGVudFR5cGUuaW5kZXhPZigiPSIsIGluZGV4KTsKLQotICAgICAgICAvLyBUaGVyZSBjYW4gYmUgc2l0dWF0aW9ucyB3aGVyZSAiY2hhcnNldCIgaXMgbm90IHRoZSBsYXN0IHBhcmFtZXRlciBvZiB0aGUgQ29udGVudC1UeXBlIGhlYWRlcgotICAgICAgICBpbnQgaW5kZXhPZlNlbWlDb2xvbiA9IGNvbnRlbnRUeXBlLmluZGV4T2YoIjsiLCBpbmRleE9mRXEpOwotICAgICAgICBTdHJpbmcgdmFsdWU7Ci0KLSAgICAgICAgaWYgKGluZGV4T2ZTZW1pQ29sb24gPiAwKSB7Ci0gICAgICAgICAgICB2YWx1ZSA9IChjb250ZW50VHlwZS5zdWJzdHJpbmcoaW5kZXhPZkVxICsgMSwgaW5kZXhPZlNlbWlDb2xvbikpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdmFsdWUgPSAoY29udGVudFR5cGUuc3Vic3RyaW5nKGluZGV4T2ZFcSArIDEsIGNvbnRlbnRUeXBlLmxlbmd0aCgpKSkudHJpbSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVGhlcmUgbWlnaHQgYmUgIiIgYXJvdW5kIHRoZSB2YWx1ZSAtIGlmIHNvIHJlbW92ZSB0aGVtCi0gICAgICAgIGlmICh2YWx1ZS5pbmRleE9mKCdcIicpICE9IC0xKSB7Ci0gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2VBbGwoIlwiIiwgIiIpOwotICAgICAgICB9Ci0gICAgICAgIHZhbHVlID0gdmFsdWUudHJpbSgpOwotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ2hhclNldEVuY29kaW5nIGZyb20gY29udGVudC10eXBlICgiICsgdmFsdWUgKyAiKSIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVNZXNzYWdlKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQsIE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBTT0FQRW52ZWxvcGUgZW52ZWxvcGUgPSBtc2dDb250ZXh0LmdldEVudmVsb3BlKCk7Ci0gICAgICAgIE9NRWxlbWVudCBvdXRwdXRNZXNzYWdlID0gZW52ZWxvcGU7Ci0KLSAgICAgICAgaWYgKChlbnZlbG9wZSAhPSBudWxsKSAmJiBtc2dDb250ZXh0LmlzRG9pbmdSRVNUKCkpIHsKLSAgICAgICAgICAgIG91dHB1dE1lc3NhZ2UgPSBlbnZlbG9wZS5nZXRCb2R5KCkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAob3V0cHV0TWVzc2FnZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIE9NT3V0cHV0Rm9ybWF0IGZvcm1hdCA9IG5ldyBPTU91dHB1dEZvcm1hdCgpOwotCi0gICAgICAgICAgICAgICAgLy8gUGljayB0aGUgY2hhciBzZXQgZW5jb2RpbmcgZnJvbSB0aGUgbXNnQ29udGV4dAotICAgICAgICAgICAgICAgIFN0cmluZyBjaGFyU2V0RW5jID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChTdHJpbmcpIG1zZ0NvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KENvbnN0YW50cy5Db25maWd1cmF0aW9uLkNIQVJBQ1RFUl9TRVRfRU5DT0RJTkcpOwotCi0gICAgICAgICAgICAgICAgZm9ybWF0LnNldERvT3B0aW1pemUoZmFsc2UpOwotICAgICAgICAgICAgICAgIGZvcm1hdC5zZXREb2luZ1NXQShmYWxzZSk7Ci0gICAgICAgICAgICAgICAgZm9ybWF0LnNldENoYXJTZXRFbmNvZGluZyhjaGFyU2V0RW5jKTsKLSAgICAgICAgICAgICAgICBvdXRwdXRNZXNzYWdlLnNlcmlhbGl6ZUFuZENvbnN1bWUob3V0LCBmb3JtYXQpOwotICAgICAgICAgICAgICAgIG91dC5mbHVzaCgpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBBeGlzRmF1bHQubWFrZUZhdWx0KGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdChNZXNzYWdlcy5nZXRNZXNzYWdlKCJvdXRNZXNzYWdlTnVsbCIpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluaXRpYWwgd29yayBmb3IgYSBidWlsZGVyIHNlbGVjdG9yIHdoaWNoIHNlbGVjdHMgdGhlIGJ1aWxkZXIgZm9yIGEgZ2l2ZW4gbWVzc2FnZSBmb3JtYXQgYmFzZWQgb24gdGhlIHRoZSBjb250ZW50IHR5cGUgb2YgdGhlIHJlY2lldmVkIG1lc3NhZ2UuCi0gICAgICogY29udGVudC10eXBlIHRvIGJ1aWxkZXIgbWFwcGluZyBjYW4gYmUgc3BlY2lmaWVkIHRocm91Z2ggdGhlIEF4aXMyLnhtbC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtc2dDb250ZXh0Ci0gICAgICogQHJldHVybiB0aGUgYnVpbGRlciByZWdpc3RlcmVkIGFnYWluc3QgdGhlIGdpdmVuIGNvbnRlbnQtdHlwZQotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBNZXNzYWdlRm9ybWF0dGVyIGdldE1lc3NhZ2VGb3JtYXR0ZXIoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBNZXNzYWdlRm9ybWF0dGVyIG1lc3NhZ2VGb3JtYXR0ZXIgPSBudWxsOwotICAgICAgICBTdHJpbmcgbWVzc2FnZUZvcm1hdFN0cmluZyA9IGdldE1lc3NhZ2VGb3JtYXR0ZXJQcm9wZXJ0eShtc2dDb250ZXh0KTsKLSAgICAgICAgaWYgKG1lc3NhZ2VGb3JtYXRTdHJpbmcgIT0gbnVsbCkgewotICAgICAgICAgICAgbWVzc2FnZUZvcm1hdHRlciA9IG1zZ0NvbnRleHQuZ2V0Q29uZmlndXJhdGlvbkNvbnRleHQoKQotICAgICAgICAgICAgICAgICAgICAuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5nZXRNZXNzYWdlRm9ybWF0dGVyKG1lc3NhZ2VGb3JtYXRTdHJpbmcpOwotCi0gICAgICAgIH0KLSAgICAgICAgaWYgKG1lc3NhZ2VGb3JtYXR0ZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgbWVzc2FnZUZvcm1hdHRlciA9IChNZXNzYWdlRm9ybWF0dGVyKSBtc2dDb250ZXh0LmdldFByb3BlcnR5KENvbnN0YW50cy5Db25maWd1cmF0aW9uLk1FU1NBR0VfRk9STUFUVEVSKTsKLSAgICAgICAgICAgIGlmKG1lc3NhZ2VGb3JtYXR0ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBtZXNzYWdlRm9ybWF0dGVyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChtZXNzYWdlRm9ybWF0dGVyID09IG51bGwpIHsKLQotICAgICAgICAgICAgLy8gSWYgd2UgYXJlIGRvaW5nIHJlc3QgYmV0dGVyIGRlZmF1bHQgdG8gQXBwbGljYXRpb24veG1sIGZvcm1hdHRlcgotICAgICAgICAgICAgaWYgKG1zZ0NvbnRleHQuaXNEb2luZ1JFU1QoKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBodHRwTWV0aG9kID0gKFN0cmluZykgbXNnQ29udGV4dC5nZXRQcm9wZXJ0eShDb25zdGFudHMuQ29uZmlndXJhdGlvbi5IVFRQX01FVEhPRCk7Ci0gICAgICAgICAgICAgICAgaWYgKENvbnN0YW50cy5Db25maWd1cmF0aW9uLkhUVFBfTUVUSE9EX0dFVC5lcXVhbHMoaHR0cE1ldGhvZCkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5Db25maWd1cmF0aW9uLkhUVFBfTUVUSE9EX0RFTEVURS5lcXVhbHMoaHR0cE1ldGhvZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYRm9ybVVSTEVuY29kZWRGb3JtYXR0ZXIoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBcHBsaWNhdGlvblhNTEZvcm1hdHRlcigpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBMZXRzIGRlZmF1bHQgdG8gU09BUCBmb3JtYXR0ZXIKLSAgICAgICAgICAgICAgICAvL1RPRE8gbmVlZCB0byBpbXByb3ZlIHRoaXMgdG8gdXNlIHRoZSBzdGF0ZWxlc3MgbmF0dXJlCi0gICAgICAgICAgICAgICAgbWVzc2FnZUZvcm1hdHRlciA9IG5ldyBTT0FQTWVzc2FnZUZvcm1hdHRlcigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtZXNzYWdlRm9ybWF0dGVyOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGNvbnRlbnRUeXBlICAgICAgICAgIFRoZSBjb250ZW50VHlwZSBvZiB0aGUgaW5jb21pbmcgbWVzc2FnZS4gIEl0IG1heSBiZSBudWxsCi0gICAgICogQHBhcmFtIGRlZmF1bHRTT0FQTmFtZXNwYWNlIFVzdWFsbHkgc2V0IHRoZSB2ZXJzaW9uIHRoYXQgaXMgZXhwZWN0ZWQuICBUaGlzIGEgZmFsbGJhY2sgaWYgdGhlIGNvbnRlbnRUeXBlIGlzIHVuYXZhaWxhYmxlIG9yCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvZXMgbm90IG1hdGNoIG91ciBleHBlY3RhdGlvbnMKLSAgICAgKiBAcmV0dXJuIG51bGwgb3IgdGhlIHNvYXAgbmFtZXNwYWNlLiAgQSBudWxsIGluZGljYXRlcyB0aGF0IHRoZSBtZXNzYWdlIHdpbGwgYmUgaW50ZXJwcmV0dGVkIGFzIGEgbm9uLVNPQVAgKGkuZS4gUkVTVCkgbWVzc2FnZQotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRTT0FQTmFtZXNwYWNlRnJvbUNvbnRlbnRUeXBlKFN0cmluZyBjb250ZW50VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZGVmYXVsdFNPQVBOYW1lc3BhY2UpIHsKLQotICAgICAgICBTdHJpbmcgcmV0dXJuTlMgPSBkZWZhdWx0U09BUE5hbWVzcGFjZTsKLSAgICAgICAgLy8gRGlzY3JpbWluYXRlIHVzaW5nIHRoZSBjb250ZW50IFR5cGUKLSAgICAgICAgaWYgKGNvbnRlbnRUeXBlICE9IG51bGwpIHsKLQotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICogU09BUDExIGNvbnRlbnQtdHlwZSBpcyAidGV4dC94bWwiCi0gICAgICAgICAgICAqIFNPQVAxMiBjb250ZW50LXR5cGUgaXMgImFwcGxpY2F0aW9uL3NvYXAreG1sIgotICAgICAgICAgICAgKgotICAgICAgICAgICAgKiBXaGF0IGFib3V0IG90aGVyIGNvbnRlbnQtdHlwZXM/Ci0gICAgICAgICAgICAqCi0gICAgICAgICAgICAqIFRPRE86IEknbSBub3QgZnVsbHkgY29udmluY2VkIHRoaXMgbWV0aG9kIGlzIGNvbXBsZXRlLCBnaXZlbiB0aGUgbWVkaWEgdHlwZXMKLSAgICAgICAgICAgICogbGlzdGVkIGluIEhUVFBDb25zdGFudHMuICBTaG91bGQgd2UgYXNzdW1lIGFsbCBhcHBsaWNhdGlvbi8qIGlzIFNPQVAxMj8KLSAgICAgICAgICAgICogU2hvdWxkIHdlIGFzc3VtZSBhbGwgdGV4dC8qIGlzIFNPQVAxMT8KLSAgICAgICAgICAgICoKLSAgICAgICAgICAgICogU28sIHdlJ2xsIGZvbGxvdyB0aGlzIHBhdHRlcm46Ci0gICAgICAgICAgICAqIDEpICBmaW5kIHRoZSBjb250ZW50LXR5cGUgbWFpbiBzZXR0aW5nCi0gICAgICAgICAgICAqIDIpICBpZiAoMSkgbm90IHVuZGVyc3Rvb2QsIGZpbmQgdGhlICJ0eXBlPSIgcGFyYW0KLSAgICAgICAgICAgICogVGhpbGluYTogSSBtZXJnZWQgKDEpICYgKDIpCi0gICAgICAgICAgICAqLwotCi0gICAgICAgICAgICBpZiAoSmF2YVV0aWxzLmluZGV4T2ZJZ25vcmVDYXNlKGNvbnRlbnRUeXBlLCBTT0FQMTJDb25zdGFudHMuU09BUF8xMl9DT05URU5UX1RZUEUpID4gLTEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuTlMgPSBTT0FQMTJDb25zdGFudHMuU09BUF9FTlZFTE9QRV9OQU1FU1BBQ0VfVVJJOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gc2VhcmNoIGZvciAidHlwZT10ZXh0L3htbCIKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGlmIChKYXZhVXRpbHMuaW5kZXhPZklnbm9yZUNhc2UoY29udGVudFR5cGUsIFNPQVAxMUNvbnN0YW50cy5TT0FQXzExX0NPTlRFTlRfVFlQRSkgPiAtMSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm5OUyA9IFNPQVAxMUNvbnN0YW50cy5TT0FQX0VOVkVMT1BFX05BTUVTUEFDRV9VUkk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocmV0dXJuTlMgPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJObyBjb250ZW50LXR5cGUgb3IgXCJ0eXBlPVwiIHBhcmFtZXRlciB3YXMgZm91bmQgaW4gdGhlIGNvbnRlbnQtdHlwZSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJoZWFkZXIgYW5kIG5vIGRlZmF1bHQgd2FzIHNwZWNpZmllZCwgdGh1cyBkZWZhdWx0aW5nIHRvIFNPQVAgMS4xLiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuTlMgPSBTT0FQMTFDb25zdGFudHMuU09BUF9FTlZFTE9QRV9OQU1FU1BBQ0VfVVJJOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoImNvbnRlbnQtdHlwZTogIiArIGNvbnRlbnRUeXBlKTsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiZGVmYXVsdFNPQVBOYW1lc3BhY2U6ICIgKyBkZWZhdWx0U09BUE5hbWVzcGFjZSk7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIlJldHVybmVkIG5hbWVzcGFjZTogIiArIHJldHVybk5TKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0dXJuTlM7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcHJvY2Vzc0NvbnRlbnRUeXBlRm9yQWN0aW9uKFN0cmluZyBjb250ZW50VHlwZSwgTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgewotICAgICAgICAvL0NoZWNrIGZvciBhY3Rpb24gaGVhZGVyIGFuZCBzZXQgaXQgaW4gYXMgc29hcEFjdGlvbiBpbiBNZXNzYWdlQ29udGV4dAotICAgICAgICBpbnQgaW5kZXggPSBjb250ZW50VHlwZS5pbmRleE9mKCJhY3Rpb24iKTsKLSAgICAgICAgaWYgKGluZGV4ID4gLTEpIHsKLSAgICAgICAgICAgIFN0cmluZyB0cmFuc2llbnRTdHJpbmcgPSBjb250ZW50VHlwZS5zdWJzdHJpbmcoaW5kZXgsIGNvbnRlbnRUeXBlLmxlbmd0aCgpKTsKLSAgICAgICAgICAgIGludCBlcXVhbCA9IHRyYW5zaWVudFN0cmluZy5pbmRleE9mKCI9Iik7Ci0gICAgICAgICAgICBpbnQgZmlyc3RTZW1pQ29sb24gPSB0cmFuc2llbnRTdHJpbmcuaW5kZXhPZigiOyIpOwotICAgICAgICAgICAgU3RyaW5nIHNvYXBBY3Rpb247IC8vIFRoaXMgd2lsbCBjb250YWluICIiIGluIHRoZSBzdHJpbmcKLSAgICAgICAgICAgIGlmIChmaXJzdFNlbWlDb2xvbiA+IC0xKSB7Ci0gICAgICAgICAgICAgICAgc29hcEFjdGlvbiA9IHRyYW5zaWVudFN0cmluZy5zdWJzdHJpbmcoZXF1YWwgKyAxLCBmaXJzdFNlbWlDb2xvbik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNvYXBBY3Rpb24gPSB0cmFuc2llbnRTdHJpbmcuc3Vic3RyaW5nKGVxdWFsICsgMSwgdHJhbnNpZW50U3RyaW5nLmxlbmd0aCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICgoc29hcEFjdGlvbiAhPSBudWxsKSAmJiBzb2FwQWN0aW9uLnN0YXJ0c1dpdGgoIlwiIikKLSAgICAgICAgICAgICAgICAgICAgJiYgc29hcEFjdGlvbi5lbmRzV2l0aCgiXCIiKSkgewotICAgICAgICAgICAgICAgIHNvYXBBY3Rpb24gPSBzb2FwQWN0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAuc3Vic3RyaW5nKDEsIHNvYXBBY3Rpb24ubGVuZ3RoKCkgLSAxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1zZ0NvbnRleHQuc2V0U29hcEFjdGlvbihzb2FwQWN0aW9uKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2VGb3JtYXR0ZXJQcm9wZXJ0eShNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB7Ci0gICAgICAgIFN0cmluZyBtZXNzYWdlRm9ybWF0dGVyUHJvcGVydHkgPSBudWxsOwotICAgICAgICBPYmplY3QgcHJvcGVydHkgPSBtc2dDb250ZXh0Ci0gICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KENvbnN0YW50cy5Db25maWd1cmF0aW9uLk1FU1NBR0VfVFlQRSk7Ci0gICAgICAgIGlmIChwcm9wZXJ0eSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtZXNzYWdlRm9ybWF0dGVyUHJvcGVydHkgPSAoU3RyaW5nKSBwcm9wZXJ0eTsKLSAgICAgICAgfQotICAgICAgICBpZiAobWVzc2FnZUZvcm1hdHRlclByb3BlcnR5ID09IG51bGwpIHsKLSAgICAgICAgICAgIFBhcmFtZXRlciBwYXJhbWV0ZXIgPSBtc2dDb250ZXh0Ci0gICAgICAgICAgICAgICAgICAgIC5nZXRQYXJhbWV0ZXIoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uTUVTU0FHRV9UWVBFKTsKLSAgICAgICAgICAgIGlmIChwYXJhbWV0ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1lc3NhZ2VGb3JtYXR0ZXJQcm9wZXJ0eSA9IChTdHJpbmcpIHBhcmFtZXRlci5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtZXNzYWdlRm9ybWF0dGVyUHJvcGVydHk7Ci0gICAgfQotICAgIAotICAgIAotICAgICAgICAvKioKLSAgICAgICAgICogVGhpcyBpcyBhIGhlbHBlciBtZXRob2QgdG8gZ2V0IHRoZSByZXNwb25zZSB3cml0dGVuIGZsYWcgZnJvbSB0aGUgUmVxdWVzdFJlc3BvbnNlVHJhbnNwb3J0Ci0gICAgICAgICAqIGluc3RhbmNlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVzcG9uc2VXcml0dGVuKE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0KSB7Ci0gICAgICAgICAgICBSZXF1ZXN0UmVzcG9uc2VUcmFuc3BvcnQgcmVxUmVzVHJhbnNwb3J0ID0gZ2V0UmVxdWVzdFJlc3BvbnNlVHJhbnNwb3J0KG1lc3NhZ2VDb250ZXh0KTsKLSAgICAgICAgICAgIGlmIChyZXFSZXNUcmFuc3BvcnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkZvdW5kIFJlcXVlc3RSZXNwb25zZVRyYW5zcG9ydCByZXR1cm5pbmcgaXNSZXNwb25zZVdyaXR0ZW4oKSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gcmVxUmVzVHJhbnNwb3J0LmlzUmVzcG9uc2VXcml0dGVuKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkRpZCBub3QgZmluZCBSZXF1ZXN0UmVzcG9uc2VUcmFuc3BvcnQgcmV0dXJuaW5nIGZhbHNlIGZyb20gZ2V0IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlJlc3BvbnNlV3JpdHRlbigpIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIAotICAgICAgIC8qKgotICAgICAgICAgKiBUaGlzIGlzIGEgaGVscGVyIG1ldGhvZCB0byBzZXQgdGhlIHJlc3BvbnNlIHdyaXR0ZW4gZmxhZyBvbiB0aGUgUmVxdWVzdFJlc3BvbnNlVHJhbnNwb3J0Ci0gICAgICAgICAqIGluc3RhbmNlLgotICAgICAgICAqLwotICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRSZXNwb25zZVdyaXR0ZW4oTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQsIGJvb2xlYW4gcmVzcG9uc2VXcml0dGVuKSB7Ci0gICAgICAgICAgICBSZXF1ZXN0UmVzcG9uc2VUcmFuc3BvcnQgcmVxUmVzVHJhbnNwb3J0ID0gZ2V0UmVxdWVzdFJlc3BvbnNlVHJhbnNwb3J0KG1lc3NhZ2VDb250ZXh0KTsKLSAgICAgICAgICAgIGlmIChyZXFSZXNUcmFuc3BvcnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkZvdW5kIFJlcXVlc3RSZXNwb25zZVRyYW5zcG9ydCBzZXR0aW5nIHJlc3BvbnNlIHdyaXR0ZW4iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmVxUmVzVHJhbnNwb3J0LnNldFJlc3BvbnNlV3JpdHRlbihyZXNwb25zZVdyaXR0ZW4pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkRpZCBub3QgZmluZCBSZXF1ZXN0UmVzcG9uc2VUcmFuc3BvcnQgY2Fubm90IHNldCByZXNwb25zZSB3cml0dGVuIik7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgIH0KLSAgICAgICB9Ci0gICAKLSAgICAgICAvKioKLSAgICAgICAgKiBUaGlzIGlzIGFuIGludGVybmFsIGhlbHBlciBtZXRob2QgdG8gcmV0cmlldmUgdGhlIFJlcXVlc3RSZXNwb25zZVRyYW5zcG9ydCBpbnN0YW5jZQotICAgICAgICAqIGZyb20gdGhlIE1lc3NhZ2VDb250ZXh0IG9iamVjdC4gVGhlIE1lc3NhZ2VDb250ZXh0IG1heSBiZSB0aGUgcmVzcG9uc2UgTWVzc2FnZUNvbnRleHQgc28KLSAgICAgICAgKiBpbiB0aGF0IGNhc2Ugd2Ugd2lsbCBoYXZlIHRvIHJldHJpZXZlIHRoZSByZXF1ZXN0IE1lc3NhZ2VDb250ZXh0IGZyb20gdGhlIE9wZXJhdGlvbkNvbnRleHQuCi0gICAgICAgICovCi0gICAgICAgcHJpdmF0ZSBzdGF0aWMgUmVxdWVzdFJlc3BvbnNlVHJhbnNwb3J0IGdldFJlcXVlc3RSZXNwb25zZVRyYW5zcG9ydChNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCkgewotICAgIAkgICB0cnkgewotICAgIAkJICAgLy8gSWYgdGhpcyBpcyB0aGUgcmVxdWVzdCBNZXNzYWdlQ29udGV4dCB3ZSBzaG91bGQgZmluZCBpdCBkaXJlY3RseSBieSB0aGUgZ2V0UHJvcGVydHkoKQotICAgICAgICAgICAgICAgLy8gbWV0aG9kCi0gICAgICAgICAgICAgICBpZiAobWVzc2FnZUNvbnRleHQuZ2V0UHJvcGVydHkoUmVxdWVzdFJlc3BvbnNlVHJhbnNwb3J0LlRSQU5TUE9SVF9DT05UUk9MKSAKLSAgICAgICAgICAgIAkJICAgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgIHJldHVybiAoUmVxdWVzdFJlc3BvbnNlVHJhbnNwb3J0KSBtZXNzYWdlQ29udGV4dC5nZXRQcm9wZXJ0eSgKLSAgICAgICAgICAgICAgICAJCSAgIFJlcXVlc3RSZXNwb25zZVRyYW5zcG9ydC5UUkFOU1BPUlRfQ09OVFJPTCk7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBpcyB0aGUgcmVzcG9uc2UgTWVzc2FnZUNvbnRleHQgd2UgbmVlZCB0byBsb29rIGZvciB0aGUgcmVxdWVzdCBNZXNzYWdlQ29udGV4dAotICAgICAgICAJCWVsc2UgaWYgKG1lc3NhZ2VDb250ZXh0LmdldE9wZXJhdGlvbkNvbnRleHQoKSAhPSBudWxsCi0gICAgICAgIAkJCQkmJiBtZXNzYWdlQ29udGV4dC5nZXRPcGVyYXRpb25Db250ZXh0KCkKLSAgICAgICAgICAgICAgICAgICAgICAJCS5nZXRNZXNzYWdlQ29udGV4dChXU0RMQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfSU5fVkFMVUUpICE9IG51bGwpIHsKLSAgICAgICAgCQkJCQkJcmV0dXJuIChSZXF1ZXN0UmVzcG9uc2VUcmFuc3BvcnQpIG1lc3NhZ2VDb250ZXh0LgotICAgICAgICAJCQkJCQlnZXRPcGVyYXRpb25Db250ZXh0KCkuZ2V0TWVzc2FnZUNvbnRleHQoCi0gICAgICAgIAkJCQkJCQkJV1NETENvbnN0YW50cy5NRVNTQUdFX0xBQkVMX0lOX1ZBTFVFKS5nZXRQcm9wZXJ0eSgKLSAgICAgICAgCQkJCQkJCQkJCVJlcXVlc3RSZXNwb25zZVRyYW5zcG9ydC5UUkFOU1BPUlRfQ09OVFJPTCk7Ci0gICAgICAgIAkJfSAKLSAgICAgICAgCQllbHNlIHsKLSAgICAgICAgCQkJcmV0dXJuIG51bGw7Ci0gICAgICAgIAkJfSAKLSAgICAJICAgfQotICAgICAgICAgICBjYXRjaChBeGlzRmF1bHQgYWYpIHsKLSAgICAgICAgICAgCS8vIHByb2JhYmx5IHNob3VsZCBub3QgYmUgZmF0YWwsIHNvIGp1c3QgbG9nIHRoZSBtZXNzYWdlCi0gICAgICAgICAgIAlTdHJpbmcgbXNnID0gTWVzc2FnZXMuZ2V0TWVzc2FnZSgiZ2V0TWVzc2FnZUNvbnRleHRFcnJvciIsIGFmLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAJbG9nLmRlYnVnKG1zZyk7Ci0gICAgICAgICAgIAlyZXR1cm4gbnVsbDsKLSAgICAgICAgICAgfQotICAgIH0KLSAgICAgICAKLSAgICAgICAvKioKLSAgICAgICAgKiBDbGVhbiB1cCBjYWNoZWQgYXR0YWNobWVudCBmaWxlIAotICAgICAgICAqIEBwYXJhbSBtc2dDb250ZXh0Ci0gICAgICAgICovCi0gICAgICAgcHVibGljIHN0YXRpYyB2b2lkIGRlbGV0ZUF0dGFjaG1lbnRzKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHsKLSAgICAgICAJaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICBsb2cuZGVidWcoIkVudGVyaW5nIGRlbGV0ZUF0dGFjaG1lbnRzKCkiKTsKLSAgICAgICAgICAgfQotICAgICAgICAgICAKLSAgICAgICAJQXR0YWNobWVudHMgYXR0YWNobWVudHMgPSBtc2dDb250ZXh0LmdldEF0dGFjaG1lbnRNYXAoKTsKLSAgICAgICAJTGlmZWN5Y2xlTWFuYWdlciBsY20gPSAoTGlmZWN5Y2xlTWFuYWdlciltc2dDb250ZXh0LmdldFJvb3RDb250ZXh0KCkuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5nZXRQYXJhbWV0ZXJWYWx1ZShEZXBsb3ltZW50Q29uc3RhbnRzLkFUVEFDSE1FTlRTX0xJRkVDWUNMRV9NQU5BR0VSKTsKLSAgICAgICAgICAgaWYgKGF0dGFjaG1lbnRzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgIC8vIEdldCB0aGUgbGlzdCBvZiBDb250ZW50IElEcyBmb3IgdGhlIGF0dGFjaG1lbnRzLi4uYnV0IGRvZXMgbm90IHRyeSB0byBwdWxsIHRoZSBzdHJlYW0gZm9yIG5ldyBhdHRhY2htZW50cy4KLSAgICAgICAgICAgICAgIC8vIChQdWxsaW5nIHRoZSBzdHJlYW0gZm9yIG5ldyBhdHRhY2htZW50cyB3aWxsIHByb2JhYmx5IGZhaWwuLi50aGUgc3RyZWFtIGlzIHByb2JhYmx5IGNsb3NlZCkKLSAgICAgICAgICAgICAgIExpc3Qga2V5cyA9IGF0dGFjaG1lbnRzLmdldENvbnRlbnRJRExpc3QoKTsKLSAgICAgICAgICAgICAgIGlmIChrZXlzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgIAlTdHJpbmcga2V5ID0gbnVsbDsKLSAgICAgICAgICAgICAgIAlGaWxlIGZpbGUgPSBudWxsOwotICAgICAgICAgICAgICAgCURhdGFTb3VyY2UgZGF0YVNvdXJjZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrZXlzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSAoU3RyaW5nKSBrZXlzLmdldChpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTb3VyY2UgPSBhdHRhY2htZW50cy5nZXREYXRhSGFuZGxlcihrZXkpLmdldERhdGFTb3VyY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGRhdGFTb3VyY2UgaW5zdGFuY2VvZiBDYWNoZWRGaWxlRGF0YVNvdXJjZSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAJZmlsZSA9ICgoQ2FjaGVkRmlsZURhdGFTb3VyY2UpZGF0YVNvdXJjZSkuZ2V0RmlsZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgCWlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkRlbGV0ZSBjYWNoZSBhdHRhY2htZW50IGZpbGU6ICIrZmlsZS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIAlpZihsY20hPW51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoImRlbGV0aW5nIGZpbGUgdXNpbmcgbGlmZWN5Y2xlbWFuYWdlciIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxjbS5kZWxldGUoZmlsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUuZGVsZXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAJICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJEZWxldGUgY2FjaGUgYXR0YWNobWVudCBmaWxlIGZhaWxlZCIrIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGxjbSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeXsgICAgICAgICAgICAgICAgICAgICAgICAJCQkgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxjbS5kZWxldGVPbkV4aXQoZmlsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1jYXRjaChFeGNlcHRpb24gZXgpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZS5kZWxldGVPbkV4aXQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLmRlbGV0ZU9uRXhpdCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgfQotICAgICAgICAgICAKLSAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICBsb2cuZGVidWcoIkV4aXRpbmcgZGVsZXRlQXR0YWNobWVudHMoKSIpOwotICAgICAgICAgICB9Ci0gICAgICAgfQotICAgICAgIAotICAgICAgIC8qKgotICAgICAgICAqIFRoaXMgbWV0aG9kIGNhbiBiZSBjYWxsZWQgYnkgY29tcG9uZW50cyB3aXNoaW5nIHRvIGRldGFjaCB0aGUgRGV0YWNoYWJsZUlucHV0U3RyZWFtCi0gICAgICAgICogb2JqZWN0IHRoYXQgaXMgcHJlc2VudCBvbiB0aGUgTWVzc2FnZUNvbnRleHQuIFRoaXMgaXMgbWVhbnQgdG8gc2hpZWxkIGNvbXBvbmVudHMKLSAgICAgICAgKiBmcm9tIGFueSBsb2dpYyB0aGF0IG5lZWRzIHRvIGJlIGV4ZWN1dGVkIG9uIHRoZSBEZXRhY2hhYmxlSW5wdXRTdHJlYW0gaW4gb3JkZXIgdG8gCi0gICAgICAgICogaGF2ZSBpdCBlZmZlY3RpdmVseSBkZXRhY2hlZC4gSWYgdGhlIERldGFjaGFibGVJbnB1dFN0cmVhbSBpcyBub3QgcHJlc2VudCwgb3IgaWYKLSAgICAgICAgKiB0aGUgc3VwcGxpZWQgTWVzc2FnZUNvbnRleHQgaXMgbnVsbCwgbm8gYWN0aW9uIHdpbGwgYmUgdGFrZW4uCi0gICAgICAgICovCi0gICAgICAgcHVibGljIHN0YXRpYyB2b2lkIGRldGFjaElucHV0U3RyZWFtKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgaWYobXNnQ29udGV4dCAhPSBudWxsCi0gICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgICAgICAgICAgIG1zZ0NvbnRleHQuZ2V0UHJvcGVydHkoQ29uc3RhbnRzLkRFVEFDSEFCTEVfSU5QVVRfU1RSRUFNKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgRGV0YWNoYWJsZUlucHV0U3RyZWFtIGRpcyA9IChEZXRhY2hhYmxlSW5wdXRTdHJlYW0pIG1zZ0NvbnRleHQuZ2V0UHJvcGVydHkoQ29uc3RhbnRzLkRFVEFDSEFCTEVfSU5QVVRfU1RSRUFNKTsKLSAgICAgICAgICAgICAgICAgICBpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkRldGFjaGluZyBEZXRhY2hhYmxlSW5wdXRTdHJlYW06ICIgKyBkaXMpOwotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICBkaXMuZGV0YWNoKCk7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICBpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkRldGFjaCBub3QgcGVyZm9ybWVkIGZvciBNZXNzYWdlQ29udGV4dDogIiArIG1zZ0NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH0gIAotICAgICAgICAgICB9Ci0gICAgICAgICAgIGNhdGNoKFRocm93YWJsZSB0KSB7Ci0gICAgICAgICAgICAgICB0aHJvdyBBeGlzRmF1bHQubWFrZUZhdWx0KHQpOwotICAgICAgICAgICB9Ci0gICAgICAgfQotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogQ2hlY2tzIHdoZXRoZXIgTVRPTSBuZWVkcyB0byBiZSBlbmFibGVkIGZvciB0aGUgbWVzc2FnZSByZXByZXNlbnRlZCBieQotICAgICAqIHRoZSBtc2dDb250ZXh0LiBXZSBjaGVjayB2YWx1ZSBhc3NpZ25lZCB0byB0aGUgImVuYWJsZU1UT00iIHByb3BlcnR5Ci0gICAgICogZWl0aGVyIHVzaW5nIHRoZSBjb25maWcgZmlsZXMgKGF4aXMyLnhtbCwgc2VydmljZXMueG1sKSBvcgotICAgICAqIHByb2dyYW1hdGljYWxseS4gUHJvZ3JhbWF0aWMgY29uZmlndXJhdGlvbiBpcyBnaXZlbiBwcmlvcml0eS4gSWYgdGhlCi0gICAgICogZ2l2ZW4gdmFsdWUgaXMgIm9wdGlvbmFsIiwgTVRPTSB3aWxsIGJlIGVuYWJsZWQgb25seSBpZiB0aGUgaW5jb21pbmcKLSAgICAgKiBtZXNzYWdlIHdhcyBhbiBNVE9NIG1lc3NhZ2UuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIG1zZ0NvbnRleHQgdGhlIGFjdGl2ZSBNZXNzYWdlQ29udGV4dAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBTd0EgbmVlZHMgdG8gYmUgZW5hYmxlZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBkb1dyaXRlTVRPTShNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB7Ci0gICAgICAgIGJvb2xlYW4gZW5hYmxlTVRPTTsKLSAgICAgICAgT2JqZWN0IGVuYWJsZU1UT01PYmplY3QgPSBudWxsOwotICAgICAgICAvLyBGaXJzdCBjaGVjayB0aGUgd2hldGhlciBNVE9NIGlzIGVuYWJsZWQgYnkgdGhlIGNvbmZpZ3VyYXRpb24KLSAgICAgICAgLy8gKEVnOkF4aXMyLnhtbCwgc2VydmljZXMueG1sKQotICAgICAgICBQYXJhbWV0ZXIgcGFyYW1ldGVyID0gbXNnQ29udGV4dC5nZXRQYXJhbWV0ZXIoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uRU5BQkxFX01UT00pOwotICAgICAgICBpZiAocGFyYW1ldGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGVuYWJsZU1UT01PYmplY3QgPSBwYXJhbWV0ZXIuZ2V0VmFsdWUoKTsKLSAgICAgICAgfQotICAgICAgICAvLyBDaGVjayB3aGV0aGVyIHRoZSBjb25maWd1cmF0aW9uIGlzIG92ZXJyaWRkZW4gcHJvZ3JhbWF0aWNhbGx5Li4KLSAgICAgICAgLy8gUHJpb3JpdHkgZ2l2ZW4gdG8gcHJvZ3JhbWF0aWNhbGx5IHNldHRpbmcgb2YgdGhlIHZhbHVlCi0gICAgICAgIE9iamVjdCBwcm9wZXJ0eSA9IG1zZ0NvbnRleHQuZ2V0UHJvcGVydHkoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uRU5BQkxFX01UT00pOwotICAgICAgICBpZiAocHJvcGVydHkgIT0gbnVsbCkgewotICAgICAgICAgICAgZW5hYmxlTVRPTU9iamVjdCA9IHByb3BlcnR5OwotICAgICAgICB9Ci0gICAgICAgIGVuYWJsZU1UT00gPSBKYXZhVXRpbHMuaXNUcnVlRXhwbGljaXRseShlbmFibGVNVE9NT2JqZWN0KTsKLSAgICAgICAgLy8gSGFuZGxlIHRoZSBvcHRpb25hbCB2YWx1ZSBmb3IgZW5hYmxlTVRPTQotICAgICAgICAvLyBJZiB0aGUgdmFsdWUgZm9yICdlbmFibGVNVE9NJyBpcyBnaXZlbiBhcyBvcHRpb25hbCBhbmQgaWYgdGhlIHJlcXVlc3QKLSAgICAgICAgLy8gbWVzc2FnZSB3YXMgYSBNVE9NIG1lc3NhZ2Ugd2Ugc2VudCBvdXQgTVRPTQotICAgICAgICBpZiAoIWVuYWJsZU1UT00gJiYgbXNnQ29udGV4dC5pc0RvaW5nTVRPTSgpICYmIChlbmFibGVNVE9NT2JqZWN0IGluc3RhbmNlb2YgU3RyaW5nKSkgewotICAgICAgICAgICAgaWYgKCgoU3RyaW5nKSBlbmFibGVNVE9NT2JqZWN0KS5lcXVhbHNJZ25vcmVDYXNlKENvbnN0YW50cy5WQUxVRV9PUFRJT05BTCkpIHsKLSAgICAgICAgICAgICAgICAvL0luIHNlcnZlciBzaWRlLCB3ZSBjaGVjayB3aGV0aGVyIHJlcXVlc3Qgd2FzIE1UT00KLSAgICAgICAgICAgICAgICBpZiAobXNnQ29udGV4dC5pc1NlcnZlclNpZGUoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAobXNnQ29udGV4dC5pc0RvaW5nTVRPTSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVNVE9NID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfSAKLSAgICAgICAgICAgICAgICAgICAgLy8gaW4gdGhlIGNsaWVudCBzaWRlLCB3ZSBlbmFibGUgTVRPTSBpZiBpdCBpcyBvcHRpb25hbCAgICAKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBlbmFibGVNVE9NID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVuYWJsZU1UT007Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogQ2hlY2tzIHdoZXRoZXIgU09BUCBXaXRoIEF0dGFjaG1lbnRzIChTd0EpIG5lZWRzIHRvIGJlIGVuYWJsZWQgZm9yIHRoZQotICAgICAqIG1lc3NhZ2UgcmVwcmVzZW50ZWQgYnkgdGhlIG1zZ0NvbnRleHQuIFdlIGNoZWNrIHZhbHVlIGFzc2lnbmVkIHRvIHRoZQotICAgICAqICJlbmFibGVTd0EiIHByb3BlcnR5IGVpdGhlciB1c2luZyB0aGUgY29uZmlnIGZpbGVzIChheGlzMi54bWwsCi0gICAgICogc2VydmljZXMueG1sKSBvciBwcm9ncmFtYXRpY2FsbHkuIFByb2dyYW1hdGljIGNvbmZpZ3VyYXRpb24gaXMgZ2l2ZW4KLSAgICAgKiBwcmlvcml0eS4gSWYgdGhlIGdpdmVuIHZhbHVlIGlzICJvcHRpb25hbCIsIFN3QSB3aWxsIGJlIGVuYWJsZWQgb25seSBpZgotICAgICAqIHRoZSBpbmNvbWluZyBtZXNzYWdlIHdhcyBTd0EgdHlwZS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbXNnQ29udGV4dCB0aGUgYWN0aXZlIE1lc3NhZ2VDb250ZXh0Ci0gICAgICogQHJldHVybiB0cnVlIGlmIFN3QSBuZWVkcyB0byBiZSBlbmFibGVkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGRvV3JpdGVTd0EoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgewotICAgICAgICBib29sZWFuIGVuYWJsZVN3QTsKLSAgICAgICAgT2JqZWN0IGVuYWJsZVN3QU9iamVjdCA9IG51bGw7Ci0gICAgICAgIC8vIEZpcnN0IGNoZWNrIHRoZSB3aGV0aGVyIFN3QSBpcyBlbmFibGVkIGJ5IHRoZSBjb25maWd1cmF0aW9uCi0gICAgICAgIC8vIChFZzpBeGlzMi54bWwsIHNlcnZpY2VzLnhtbCkKLSAgICAgICAgUGFyYW1ldGVyIHBhcmFtZXRlciA9IG1zZ0NvbnRleHQuZ2V0UGFyYW1ldGVyKENvbnN0YW50cy5Db25maWd1cmF0aW9uLkVOQUJMRV9TV0EpOwotICAgICAgICBpZiAocGFyYW1ldGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGVuYWJsZVN3QU9iamVjdCA9IHBhcmFtZXRlci5nZXRWYWx1ZSgpOwotICAgICAgICB9Ci0gICAgICAgIC8vIENoZWNrIHdoZXRoZXIgdGhlIGNvbmZpZ3VyYXRpb24gaXMgb3ZlcnJpZGRlbiBwcm9ncmFtYXRpY2FsbHkuLgotICAgICAgICAvLyBQcmlvcml0eSBnaXZlbiB0byBwcm9ncmFtYXRpY2FsbHkgc2V0dGluZyBvZiB0aGUgdmFsdWUKLSAgICAgICAgT2JqZWN0IHByb3BlcnR5ID0gbXNnQ29udGV4dC5nZXRQcm9wZXJ0eShDb25zdGFudHMuQ29uZmlndXJhdGlvbi5FTkFCTEVfU1dBKTsKLSAgICAgICAgaWYgKHByb3BlcnR5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGVuYWJsZVN3QU9iamVjdCA9IHByb3BlcnR5OwotICAgICAgICB9Ci0gICAgICAgIGVuYWJsZVN3QSA9IEphdmFVdGlscy5pc1RydWVFeHBsaWNpdGx5KGVuYWJsZVN3QU9iamVjdCk7Ci0gICAgICAgIC8vIEhhbmRsZSB0aGUgb3B0aW9uYWwgdmFsdWUgZm9yIGVuYWJsZVN3QQotICAgICAgICAvLyBJZiB0aGUgdmFsdWUgZm9yICdlbmFibGVTd0EnIGlzIGdpdmVuIGFzIG9wdGlvbmFsIGFuZCBpZiB0aGUgcmVxdWVzdAotICAgICAgICAvLyBtZXNzYWdlIHdhcyBhIFN3QSBtZXNzYWdlIHdlIHNlbnQgb3V0IFN3QQotICAgICAgICBpZiAoIWVuYWJsZVN3QSAmJiBtc2dDb250ZXh0LmlzRG9pbmdTd0EoKSAmJiAoZW5hYmxlU3dBT2JqZWN0IGluc3RhbmNlb2YgU3RyaW5nKSkgewotICAgICAgICAgICAgaWYgKCgoU3RyaW5nKSBlbmFibGVTd0FPYmplY3QpLmVxdWFsc0lnbm9yZUNhc2UoQ29uc3RhbnRzLlZBTFVFX09QVElPTkFMKSkgewotICAgICAgICAgICAgICAgIGVuYWJsZVN3QSA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVuYWJsZVN3QTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNEb2luZ1JFU1QoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgewotICAgICAgICBib29sZWFuIGVuYWJsZVJFU1QgPSBmYWxzZTsKLQotICAgICAgICAvLyBjaGVjayB3aGV0aGVyIGlzRG9pbmdSZXN0IGlzIGFscmVhZHkgdHJ1ZSBpbiB0aGUgbWVzc2FnZSBjb250ZXh0Ci0gICAgICAgIGlmIChtc2dDb250ZXh0LmlzRG9pbmdSRVNUKCkpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBPYmplY3QgZW5hYmxlUkVTVFByb3BlcnR5ID0gbXNnQ29udGV4dC5nZXRQcm9wZXJ0eShDb25zdGFudHMuQ29uZmlndXJhdGlvbi5FTkFCTEVfUkVTVCk7Ci0gICAgICAgIGlmIChlbmFibGVSRVNUUHJvcGVydHkgIT0gbnVsbCkgewotICAgICAgICAgICAgZW5hYmxlUkVTVCA9IEphdmFVdGlscy5pc1RydWVFeHBsaWNpdGx5KGVuYWJsZVJFU1RQcm9wZXJ0eSk7Ci0gICAgICAgIH0KLQotICAgICAgICBtc2dDb250ZXh0LnNldERvaW5nUkVTVChlbmFibGVSRVNUKTsKLQotICAgICAgICByZXR1cm4gZW5hYmxlUkVTVDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVdGlsaXR5IG1ldGhvZCB0byBxdWVyeSBDaGFyU2V0RW5jb2RpbmcuIEZpcnN0IGxvb2sgaW4gdGhlCi0gICAgICogTWVzc2FnZUNvbnRleHQuIElmIGl0J3Mgbm90IHRoZXJlIGxvb2sgaW4gdGhlIE9wQ29udGV4dC4gVXNlIHRoZSBkZWZ1YWx0LAotICAgICAqIGlmIGl0J3Mgbm90IGdpdmVuIGluIGVpdGhlciBjb250ZXh0cy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtc2dDb250ZXh0IHRoZSBhY3RpdmUgTWVzc2FnZUNvbnRleHQKLSAgICAgKiBAcmV0dXJuIFN0cmluZyB0aGUgQ2hhclNldEVuY29kaW5nCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q2hhclNldEVuY29kaW5nKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHsKLSAgICAgICAgU3RyaW5nIGNoYXJTZXRFbmMgPSAoU3RyaW5nKSBtc2dDb250ZXh0Ci0gICAgICAgICAgICAuZ2V0UHJvcGVydHkoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uQ0hBUkFDVEVSX1NFVF9FTkNPRElORyk7Ci0KLSAgICAgICAgaWYgKGNoYXJTZXRFbmMgPT0gbnVsbCkgewotICAgICAgICAgICAgT3BlcmF0aW9uQ29udGV4dCBvcGN0eCA9IG1zZ0NvbnRleHQuZ2V0T3BlcmF0aW9uQ29udGV4dCgpOwotICAgICAgICAgICAgaWYgKG9wY3R4ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjaGFyU2V0RW5jID0gKFN0cmluZykgb3BjdHgKLSAgICAgICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KENvbnN0YW50cy5Db25maWd1cmF0aW9uLkNIQVJBQ1RFUl9TRVRfRU5DT0RJTkcpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBJZiB0aGUgY2hhciBzZXQgZW5jIGlzIHN0aWxsIG5vdCBmb3VuZCB1c2UgdGhlIGRlZmF1bHQKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKGNoYXJTZXRFbmMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNoYXJTZXRFbmMgPSBNZXNzYWdlQ29udGV4dC5ERUZBVUxUX0NIQVJfU0VUX0VOQ09ESU5HOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjaGFyU2V0RW5jOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL0FwcGxpY2F0aW9uWE1MRm9ybWF0dGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvQXBwbGljYXRpb25YTUxGb3JtYXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTExMmVhZi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvQXBwbGljYXRpb25YTUxGb3JtYXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NT3V0cHV0Rm9ybWF0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQMTFDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVAxMkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmF1bHREZXRhaWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lk1lc3NhZ2VGb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC51dGlsLlVSTFRlbXBsYXRpbmdVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5KYXZhVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotLyoqCi0gKiBGb3JtYXRlcyB0aGUgcmVxdWVzdCBtZXNzYWdlIGFzIGFwcGxpY2F0aW9uL3htbAotICovCi1wdWJsaWMgY2xhc3MgQXBwbGljYXRpb25YTUxGb3JtYXR0ZXIgaW1wbGVtZW50cyBNZXNzYWdlRm9ybWF0dGVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhBcHBsaWNhdGlvblhNTEZvcm1hdHRlci5jbGFzcyk7Ci0gICAgcHVibGljIGJ5dGVbXSBnZXRCeXRlcyhNZXNzYWdlQ29udGV4dCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VDb250ZXh0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NT3V0cHV0Rm9ybWF0IGZvcm1hdCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIHJldHVybiBnZXRCeXRlcyhtZXNzYWdlQ29udGV4dCwgZm9ybWF0LCBmYWxzZSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEdldCB0aGUgYnl0ZXMgZm9yIHRoaXMgbWVzc2FnZQotICAgICAqIEBwYXJhbSBtZXNzYWdlQ29udGV4dAotICAgICAqIEBwYXJhbSBmb3JtYXQKLSAgICAgKiBAcGFyYW0gcHJlc2VydmUgKGluZGljYXRlcyBpZiB0aGUgT00gc2hvdWxkIGJlIHByZXNlcnZlZCBvciBjb25zdW1lZCkKLSAgICAgKiBAcmV0dXJuCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQKLSAgICAgKi8KLSAgICBwdWJsaWMgYnl0ZVtdIGdldEJ5dGVzKE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NT3V0cHV0Rm9ybWF0IGZvcm1hdCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHByZXNlcnZlKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1Zygic3RhcnQgZ2V0Qnl0ZXMoKSIpOwotICAgICAgICAgICAgbG9nLmRlYnVnKCIgIGZhdWx0IGZsb3c9IiArIAotICAgICAgICAgICAgICAgICAgICAgIChtZXNzYWdlQ29udGV4dC5nZXRGTE9XKCkgPT0gTWVzc2FnZUNvbnRleHQuT1VUX0ZBVUxUX0ZMT1cpKTsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudDsKLQotICAgICAgICAgICAgLy8gRmluZCB0aGUgY29ycmVjdCBlbGVtZW50IHRvIHNlcmlhbGl6ZS4gIE5vcm1hbGx5IGl0IGlzIHRoZSBmaXJzdCBlbGVtZW50Ci0gICAgICAgICAgICAvLyBpbiB0aGUgYm9keS4gIEJ1dCBpZiB0aGlzIGlzIGEgZmF1bHQsIHVzZSB0aGUgZGV0YWlsIGVudHJ5IGVsZW1lbnQgb3IgdGhlIAotICAgICAgICAgICAgLy8gZmF1bHQgcmVhc29uLgotICAgICAgICAgICAgaWYgKG1lc3NhZ2VDb250ZXh0LmdldEZMT1coKSA9PSBNZXNzYWdlQ29udGV4dC5PVVRfRkFVTFRfRkxPVykgewotICAgICAgICAgICAgICAgIFNPQVBGYXVsdCBmYXVsdCA9IG1lc3NhZ2VDb250ZXh0LmdldEVudmVsb3BlKCkuZ2V0Qm9keSgpLmdldEZhdWx0KCk7Ci0gICAgICAgICAgICAgICAgU09BUEZhdWx0RGV0YWlsIHNvYXBGYXVsdERldGFpbCA9IGZhdWx0LmdldERldGFpbCgpOwotICAgICAgICAgICAgICAgIG9tRWxlbWVudCA9IHNvYXBGYXVsdERldGFpbC5nZXRGaXJzdEVsZW1lbnQoKTsKLQotICAgICAgICAgICAgICAgIGlmIChvbUVsZW1lbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBvbUVsZW1lbnQgPSBmYXVsdC5nZXRSZWFzb24oKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gTm9ybWFsIGNhc2U6IFRoZSB4bWwgcGF5bG9hZCBpcyB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgYm9keS4KLSAgICAgICAgICAgICAgICBvbUVsZW1lbnQgPSBtZXNzYWdlQ29udGV4dC5nZXRFbnZlbG9wZSgpLmdldEJvZHkoKS5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBieXRlc091dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQotICAgICAgICAgICAgaWYgKG9tRWxlbWVudCAhPSBudWxsKSB7Ci0KLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBpZiAocHJlc2VydmUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9tRWxlbWVudC5zZXJpYWxpemUoYnl0ZXNPdXQsIGZvcm1hdCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvbUVsZW1lbnQuc2VyaWFsaXplQW5kQ29uc3VtZShieXRlc091dCwgZm9ybWF0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IEF4aXNGYXVsdC5tYWtlRmF1bHQoZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIGJ5dGVzT3V0LnRvQnl0ZUFycmF5KCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBuZXcgYnl0ZVswXTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiZW5kIGdldEJ5dGVzKCkiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQsIE9NT3V0cHV0Rm9ybWF0IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0sIGJvb2xlYW4gcHJlc2VydmUpIHRocm93cyBBeGlzRmF1bHQgewotCi0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJzdGFydCB3cml0ZVRvKCkiKTsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IG51bGw7Ci0KLSAgICAgICAgICAgIGlmIChtZXNzYWdlQ29udGV4dC5nZXRGTE9XKCkgPT0gTWVzc2FnZUNvbnRleHQuT1VUX0ZBVUxUX0ZMT1cpIHsKLSAgICAgICAgICAgICAgICBTT0FQRmF1bHQgZmF1bHQgPSBtZXNzYWdlQ29udGV4dC5nZXRFbnZlbG9wZSgpLmdldEJvZHkoKS5nZXRGYXVsdCgpOwotICAgICAgICAgICAgICAgIFNPQVBGYXVsdERldGFpbCBzb2FwRmF1bHREZXRhaWwgPSBmYXVsdC5nZXREZXRhaWwoKTsKLSAgICAgICAgICAgICAgICBpZiAoc29hcEZhdWx0RGV0YWlsICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgb21FbGVtZW50ID0gc29hcEZhdWx0RGV0YWlsLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAob21FbGVtZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgb21FbGVtZW50ID0gZmF1bHQuZ2V0UmVhc29uKCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG9tRWxlbWVudCA9IG1lc3NhZ2VDb250ZXh0LmdldEVudmVsb3BlKCkuZ2V0Qm9keSgpLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG9tRWxlbWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHByZXNlcnZlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvbUVsZW1lbnQuc2VyaWFsaXplKG91dHB1dFN0cmVhbSwgZm9ybWF0KTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9tRWxlbWVudC5zZXJpYWxpemVBbmRDb25zdW1lKG91dHB1dFN0cmVhbSwgZm9ybWF0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IEF4aXNGYXVsdC5tYWtlRmF1bHQoZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBvdXRwdXRTdHJlYW0uZmx1c2goKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBBeGlzRmF1bHQubWFrZUZhdWx0KGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJlbmQgd3JpdGVUbygpIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRUeXBlKE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0LCBPTU91dHB1dEZvcm1hdCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc29hcEFjdGlvbikgewotCi0gICAgICAgIFN0cmluZyBlbmNvZGluZyA9IGZvcm1hdC5nZXRDaGFyU2V0RW5jb2RpbmcoKTsKLSAgICAgICAgU3RyaW5nIGNvbnRlbnRUeXBlOwotICAgICAgICBjb250ZW50VHlwZSA9IChTdHJpbmcpIG1lc3NhZ2VDb250ZXh0LmdldFByb3BlcnR5KENvbnN0YW50cy5Db25maWd1cmF0aW9uLkNPTlRFTlRfVFlQRSk7Ci0KLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoImNvbnRlbnRUeXBlIHNldCBmcm9tIG1lc3NhZ2VDb250ZXh0ID0iICsgY29udGVudFR5cGUpOwotICAgICAgICAgICAgbG9nLmRlYnVnKCIoTk9URSkgY29udGVudFR5cGUgZnJvbSBmb3JtYXQgaXM9IiArIGZvcm1hdC5nZXRDb250ZW50VHlwZSgpKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKGNvbnRlbnRUeXBlID09IG51bGwpIHsKLSAgICAgICAgICAgIGNvbnRlbnRUeXBlID0gSFRUUENvbnN0YW50cy5NRURJQV9UWVBFX0FQUExJQ0FUSU9OX1hNTDsKLSAgICAgICAgfSBlbHNlIGlmIChpc1NPQVBDb250ZW50VHlwZShjb250ZW50VHlwZSkpIHsKLSAgICAgICAgICAgIGNvbnRlbnRUeXBlID0gSFRUUENvbnN0YW50cy5NRURJQV9UWVBFX0FQUExJQ0FUSU9OX1hNTDsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiY29udGVudFR5cGUgaXMgc2V0IGluY29ycmVjdGx5IGZvciBBcHBsaWNhdGlvbiBYTUwuIik7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJJdCBpcyBjaGFuZ2VkIHRvICIgKyBjb250ZW50VHlwZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZW5jb2RpbmcgIT0gbnVsbCkgewotICAgICAgICAgICAgY29udGVudFR5cGUgKz0gIjsgY2hhcnNldD0iICsgZW5jb2Rpbmc7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiY29udGVudFR5cGUgcmV0dXJuZWQgPSIgKyBjb250ZW50VHlwZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNvbnRlbnRUeXBlOwotICAgIH0KLQotICAgIHB1YmxpYyBVUkwgZ2V0VGFyZ2V0QWRkcmVzcyhNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NT3V0cHV0Rm9ybWF0IGZvcm1hdCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTCB0YXJnZXRVUkwpCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLQotICAgICAgICAvLyBDaGVjayB3aGV0aGVyIHRoZXJlIGlzIGEgdGVtcGxhdGUgaW4gdGhlIFVSTCwgaWYgc28gd2UgaGF2ZSB0byByZXBsYWNlIHRoZW4gd2l0aCBkYXRhCi0gICAgICAgIC8vIHZhbHVlcyBhbmQgY3JlYXRlIGEgbmV3IHRhcmdldCBVUkwuCi0gICAgICAgIHRhcmdldFVSTCA9IFVSTFRlbXBsYXRpbmdVdGlsLmdldFRlbXBsYXRlZFVSTCh0YXJnZXRVUkwsIG1lc3NhZ2VDb250ZXh0LCBmYWxzZSk7Ci0KLSAgICAgICAgcmV0dXJuIHRhcmdldFVSTDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGZvcm1hdFNPQVBBY3Rpb24oTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQsIE9NT3V0cHV0Rm9ybWF0IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNvYXBBY3Rpb24pIHsKLSAgICAgICAgcmV0dXJuIHNvYXBBY3Rpb247Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgYm9vbGVhbiBpc1NPQVBDb250ZW50VHlwZShTdHJpbmcgY29udGVudFR5cGUpIHsKLSAgICAgICAgaWYgKEphdmFVdGlscy5pbmRleE9mSWdub3JlQ2FzZShjb250ZW50VHlwZSwgU09BUDEyQ29uc3RhbnRzLlNPQVBfMTJfQ09OVEVOVF9UWVBFKSA+IC0xKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICAvLyBzZWFyY2ggZm9yICJ0eXBlPXRleHQveG1sIgotICAgICAgICBlbHNlIGlmIChKYXZhVXRpbHMuaW5kZXhPZklnbm9yZUNhc2UoY29udGVudFR5cGUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09BUDExQ29uc3RhbnRzLlNPQVBfMTFfQ09OVEVOVF9UWVBFKSA+IC0xKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL0hUVFBDb25zdGFudHMuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9IVFRQQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4NmQ5YjYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL0hUVFBDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cDsKLQotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLQotLyoqCi0gKiBIVFRQIHByb3RvY29sIGFuZCBtZXNzYWdlIGNvbnRleHQgY29uc3RhbnRzLgotICovCi1wdWJsaWMgY2xhc3MgSFRUUENvbnN0YW50cyB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQX0NPTlRFTlRfVFlQRSA9ICJIVFRQX0NPTlRFTlRfVFlQRSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPVE9DT0xfVkVSU0lPTiA9ICJQUk9UT0NPTCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVESUFfVFlQRV9YX1dXV19GT1JNID0KLSAgICAgICAgICAgICJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FRElBX1RZUEVfVEVYVF9YTUwgPSAidGV4dC94bWwiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FRElBX1RZUEVfTVVMVElQQVJUX1JFTEFURUQgPSAibXVsdGlwYXJ0L3JlbGF0ZWQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FRElBX1RZUEVfTVVMVElQQVJUX0ZPUk1fREFUQSA9ICJtdWx0aXBhcnQvZm9ybS1kYXRhIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRURJQV9UWVBFX0FQUExJQ0FUSU9OX1hNTCA9ICJhcHBsaWNhdGlvbi94bWwiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FRElBX1RZUEVfQVBQTElDQVRJT05fU09BUF9YTUwgPSAiYXBwbGljYXRpb24vc29hcCt4bWwiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FRElBX1RZUEVfQVBQTElDQVRJT05fRUNIT19YTUwgPSAiYXBwbGljYXRpb24vZWNobyt4bWwiOwotCi0gICAgLyoqCi0gICAgICogRmllbGQgUkVRVUVTVF9VUkkKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVFVRVNUX1VSSSA9ICJSRVFVRVNUX1VSSSI7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBSRVNQT05TRV9DT0RFCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTUE9OU0VfQ09ERSA9ICJSRVNQT05TRV9DT0RFIjsKLQotICAgIC8qKgotICAgICAqIEZpZWxkIFJFU1BPTlNFX1dPUkQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNQT05TRV9XT1JEID0gIlJFU1BPTlNFX1dPUkQiOwotCi0gICAgLyoqCi0gICAgICogRmllbGQgUkVTUE9OU0VfQUNLX0NPREVfVkFMCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTUE9OU0VfQUNLX0NPREVfVkFMID0gIjIwMiI7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBTT0NLRVQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTT0NLRVQgPSAiU09DS0VUIjsKLQotICAgIC8qKgotICAgICAqIEZpZWxkIFJFU1BPTlNFX0hFQURFUlMKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNQT05TRV9IRUFERVJTID0gIkhUVFAtUmVzcG9uc2UtSGVhZGVycyI7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBSRVFVRVNUX0hFQURFUlMKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVFVRVNUX0hFQURFUlMgPSAiSFRUUC1SZXF1ZXN0LUhlYWRlcnMiOwotCi0gICAgLyoqCi0gICAgICogRmllbGQgUExVR0lOX1dSSVRFUgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9XUklURVIgPSAidHJhbnNwb3J0Lmh0dHAucGx1Z2luLndyaXRlciI7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBQTFVHSU5fU0VSVklDRV9OQU1FCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX1NFUlZJQ0VfTkFNRSA9ICJ0cmFuc3BvcnQuaHR0cC5wbHVnaW4uc2VydmljZU5hbWUiOwotCi0gICAgLyoqCi0gICAgICogQVhJUyBzZXJ2bGV0IHBsdWdpbiBwYXJhbWV0ZXIgbmFtZXMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX05BTUUgPSAidHJhbnNwb3J0Lmh0dHAucGx1Z2luLnBsdWdpbk5hbWUiOwotCi0gICAgLyoqCi0gICAgICogRmllbGQgUExVR0lOX0xPRwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9MT0cgPSAidHJhbnNwb3J0Lmh0dHAucGx1Z2luLmxvZyI7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBQTFVHSU5fSVNfREVWRUxPUE1FTlQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSVNfREVWRUxPUE1FTlQgPSAidHJhbnNwb3J0Lmh0dHAucGx1Z2luLmlzRGV2ZWxvcG1lbnQiOwotCi0gICAgLyoqCi0gICAgICogRmllbGQgUExVR0lOX0VYQ0VQVElPTl9MT0cKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fRVhDRVBUSU9OX0xPRyA9ICJ0cmFuc3BvcnQuaHR0cC5wbHVnaW4uZXhjZXB0aW9uTG9nIjsKLQotICAgIC8qKgotICAgICAqIEZpZWxkIFBMVUdJTl9FTkdJTkUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fRU5HSU5FID0gInRyYW5zcG9ydC5odHRwLnBsdWdpbi5lbmdpbmUiOwotCi0gICAgLyoqCi0gICAgICogRmllbGQgUExVR0lOX0VOQUJMRV9MSVNUCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0VOQUJMRV9MSVNUID0gInRyYW5zcG9ydC5odHRwLnBsdWdpbi5lbmFibGVMaXN0IjsKLQotICAgIC8qKgotICAgICAqIEZpZWxkIE9LW10KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgT0tbXSA9ICgiMjAwIE9LIikudG9DaGFyQXJyYXkoKTsKLQotICAgIC8qKgotICAgICAqIEZpZWxkIE5PQ09OVEVOVFtdCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE5PQ09OVEVOVFtdID0gKCIyMDIgT0tcblxuIikuZ2V0Qnl0ZXMoKTsKLQotICAgIC8qKgotICAgICAqIEZpZWxkIE1DX0hUVFBfU1RBVFVTX01FU1NBR0UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBNQ19IVFRQX1NUQVRVU19NRVNTQUdFID0gInRyYW5zcG9ydC5odHRwLnN0YXR1c01lc3NhZ2UiOwotCi0gICAgLyoqCi0gICAgICogRmllbGQgTUNfSFRUUF9TVEFUVVNfQ09ERQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE1DX0hUVFBfU1RBVFVTX0NPREUgPSAidHJhbnNwb3J0Lmh0dHAuc3RhdHVzQ29kZSI7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBNQ19IVFRQX1NFUlZMRVRSRVNQT05TRQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE1DX0hUVFBfU0VSVkxFVFJFU1BPTlNFID0gInRyYW5zcG9ydC5odHRwLnNlcnZsZXRSZXNwb25zZSI7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBNQ19IVFRQX1NFUlZMRVRSRVFVRVNUCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgTUNfSFRUUF9TRVJWTEVUUkVRVUVTVCA9ICJ0cmFuc3BvcnQuaHR0cC5zZXJ2bGV0UmVxdWVzdCI7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBNQ19IVFRQX1NFUlZMRVRQQVRISU5GTwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE1DX0hUVFBfU0VSVkxFVFBBVEhJTkZPID0gInRyYW5zcG9ydC5odHRwLnNlcnZsZXRQYXRoSW5mbyI7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBNQ19IVFRQX1NFUlZMRVRMT0NBVElPTgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE1DX0hUVFBfU0VSVkxFVExPQ0FUSU9OID0gInRyYW5zcG9ydC5odHRwLnNlcnZsZXRMb2NhdGlvbiI7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBNQ19IVFRQX1NFUlZMRVQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBNQ19IVFRQX1NFUlZMRVQgPSAidHJhbnNwb3J0Lmh0dHAuc2VydmxldCI7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBNQ19IVFRQX1NFUlZMRVRDT05URVhUCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgTUNfSFRUUF9TRVJWTEVUQ09OVEVYVCA9ICJ0cmFuc3BvcnQuaHR0cC5zZXJ2bGV0Q29udGV4dCI7Ci0KLSAgICAvKioKLSAgICAgKiB0cmFuc3BvcnQuaHR0cC5zZXJ2bGV0Q29uZmlnCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSFRUUF9TRVJWTEVUQ09ORklHID0gInRyYW5zcG9ydC5odHRwLnNlcnZsZXRDb25maWciOwotCi0gICAgLyoqCi0gICAgICogRmllbGQgSEVBREVSX1VTRVJfQUdFTlQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfVVNFUl9BR0VOVCA9ICJVc2VyLUFnZW50IjsKLQotICAgIC8qKgotICAgICAqIEZpZWxkIEhFQURFUl9UUkFOU0ZFUl9FTkNPRElOR19DSFVOS0VECi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX1RSQU5TRkVSX0VOQ09ESU5HX0NIVU5LRUQgPSAiY2h1bmtlZCIuaW50ZXJuKCk7Ci0KLSAgICAvKiBodHRwIDEuMSAqLwotCi0gICAgLyoqCi0gICAgICogRmllbGQgSEVBREVSX1RSQU5TRkVSX0VOQ09ESU5HCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX1RSQU5TRkVSX0VOQ09ESU5HID0gIlRyYW5zZmVyLUVuY29kaW5nIi5pbnRlcm4oKTsKLQotICAgIC8qKgotICAgICAqIEZpZWxkIEhFQURFUl9TT0FQX0FDVElPTgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9TT0FQX0FDVElPTiA9ICJTT0FQQWN0aW9uIjsKLQotICAgIC8qKgotICAgICAqIEZpZWxkIEhFQURFUl9TRVRfQ09PS0lFMgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9TRVRfQ09PS0lFMiA9ICJTZXQtQ29va2llMiI7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBIRUFERVJfU0VUX0NPT0tJRQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9TRVRfQ09PS0lFID0gIlNldC1Db29raWUiOwotCi0gICAgLyoqCi0gICAgICogRmllbGQgSEVBREVSX1BST1hZX0FVVEhPUklaQVRJT04KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfUFJPWFlfQVVUSE9SSVpBVElPTiA9ICJQcm94eS1BdXRob3JpemF0aW9uIjsKLQotICAgIC8qKgotICAgICAqIEZpZWxkIEhFQURFUl9QUk9UT0NPTF9WMTEKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfUFJPVE9DT0xfVjExID0gIjEuMSIuaW50ZXJuKCk7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBIRUFERVJfUFJPVE9DT0xfVjEwCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX1BST1RPQ09MX1YxMCA9ICIxLjAiLmludGVybigpOwotCi0gICAgLyoqCi0gICAgICogRmllbGQgSEVBREVSX1BST1RPQ09MXzExCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX1BST1RPQ09MXzExID0gIkhUVFAvMS4xIjsKLQotICAgIC8qKgotICAgICAqIEZpZWxkIEhFQURFUl9QUk9UT0NPTF8xMAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9QUk9UT0NPTF8xMCA9ICJIVFRQLzEuMCI7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBIRUFERVJfUFJBR01BCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX1BSQUdNQSA9ICJQcmFnbWEiOwotCi0gICAgLyoqCi0gICAgICogRmllbGQgSEVBREVSX1BPU1QKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfUE9TVCA9ICJQT1NUIjsKLQotICAgIC8qKgotICAgICAqIEZpZWxkIEhFQURFUl9QVVQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfUFVUID0gIlBVVCI7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBIRUFERVJfTE9DQVRJT04KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfTE9DQVRJT04gPSAiTG9jYXRpb24iOwotCi0gICAgLyoqCi0gICAgICogRmllbGQgSEVBREVSX0hPU1QKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfSE9TVCA9ICJIb3N0IjsKLQotICAgIC8qKgotICAgICAqIEZpZWxkIEhFQURFUl9HRVQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfR0VUID0gIkdFVCI7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBIRUFERVJfREVMRVRFCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX0RFTEVURSA9ICJERUxFVEUiOwotCi0gICAgLyoqCi0gICAgICogRmllbGQgSEVBREVSX0VYUEVDVF8xMDBfQ29udGludWUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfRVhQRUNUXzEwMF9Db250aW51ZSA9ICIxMDAtY29udGludWUiOwotCi0gICAgLyoqCi0gICAgICogRmllbGQgSEVBREVSX0VYUEVDVAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9FWFBFQ1QgPSAiRXhwZWN0IjsKLQotICAgIC8qKgotICAgICAqIEZpZWxkIEhFQURFUl9ERUZBVUxUX0NIQVJfRU5DT0RJTkcKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfREVGQVVMVF9DSEFSX0VOQ09ESU5HID0gImlzby04ODU5LTEiOwotCi0gICAgLyoqCi0gICAgICogRmllbGQgSEVBREVSX0NPT0tJRTIKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfQ09PS0lFMiA9ICJDb29raWUyIjsKLQotICAgIC8qKgotICAgICAqIEZpZWxkIEhFQURFUl9DT09LSUUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfQ09PS0lFID0gIkNvb2tpZSI7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBIRUFERVJfQ09OVEVOVF9UWVBFCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX0NPTlRFTlRfVFlQRSA9ICJDb250ZW50LVR5cGUiOwotCi0gICAgLyoqCi0gICAgICogRmllbGQgSEVBREVSX0NPTlRFTlRfVFJBTlNGRVJfRU5DT0RJTkcKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfQ09OVEVOVF9UUkFOU0ZFUl9FTkNPRElORyA9ICJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nIjsKLQotICAgIC8qKgotICAgICAqIEZpZWxkIEhFQURFUl9DT05URU5UX0xPQ0FUSU9OCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX0NPTlRFTlRfTE9DQVRJT04gPSAiQ29udGVudC1Mb2NhdGlvbiI7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBIRUFERVJfQ09OVEVOVF9MRU5HVEgKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfQ09OVEVOVF9MRU5HVEggPSAiQ29udGVudC1MZW5ndGgiOwotCi0gICAgLyoqCi0gICAgICogRmllbGQgSEVBREVSX0NPTlRFTlRfSUQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfQ09OVEVOVF9JRCA9ICJDb250ZW50LUlkIjsKLQotICAgIC8qKgotICAgICAqIEZpZWxkIEhFQURFUl9DT05URU5UX0RFU0NSSVBUSU9OCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX0NPTlRFTlRfREVTQ1JJUFRJT04gPSAiQ29udGVudC1EZXNjcmlwdGlvbiI7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBIRUFERVJfQ09OTkVDVElPTl9LRUVQQUxJVkUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfQ09OTkVDVElPTl9LRUVQQUxJVkUgPSAiS2VlcC1BbGl2ZSIuaW50ZXJuKCk7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBIRUFERVJfQ09OTkVDVElPTl9DTE9TRQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9DT05ORUNUSU9OX0NMT1NFID0gImNsb3NlIi5pbnRlcm4oKTsKLQotICAgIC8qKgotICAgICAqIEZpZWxkIEhFQURFUl9DT05ORUNUSU9OCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX0NPTk5FQ1RJT04gPSAiQ29ubmVjdGlvbiI7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBIRUFERVJfQ0FDSEVfQ09OVFJPTF9OT0NBQ0hFCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX0NBQ0hFX0NPTlRST0xfTk9DQUNIRSA9ICJuby1jYWNoZSI7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBIRUFERVJfQ0FDSEVfQ09OVFJPTAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9DQUNIRV9DT05UUk9MID0gIkNhY2hlLUNvbnRyb2wiOwotCi0gICAgLyoqCi0gICAgICogRmllbGQgSEVBREVSX0FVVEhPUklaQVRJT04KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfQVVUSE9SSVpBVElPTiA9ICJBdXRob3JpemF0aW9uIjsKLQotICAgIC8qKgotICAgICAqIEZpZWxkIEhFQURFUl9BQ0NFUFRfVEVYVF9BTEwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfQUNDRVBUX1RFWFRfQUxMID0gInRleHQvKiI7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBIRUFERVJfQUNDRVBUX01VTFRJUEFSVF9SRUxBVEVECi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX0FDQ0VQVF9NVUxUSVBBUlRfUkVMQVRFRCA9ICJtdWx0aXBhcnQvcmVsYXRlZCI7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBIRUFERVJfQUNDRVBUX0FQUExfU09BUAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9BQ0NFUFRfQVBQTF9TT0FQID0gImFwcGxpY2F0aW9uL3NvYXAreG1sIjsKLQotICAgIC8qKgotICAgICAqIEZpZWxkIEhFQURFUl9BQ0NFUFRfQVBQTElDQVRJT05fRElNRQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9BQ0NFUFRfQVBQTElDQVRJT05fRElNRSA9ICJhcHBsaWNhdGlvbi9kaW1lIjsKLQotICAgIC8qKgotICAgICAqIEZpZWxkIEhFQURFUl9BQ0NFUFQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfQUNDRVBUID0gIkFjY2VwdCI7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBDSEFSX1NFVF9FTkNPRElORwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENIQVJfU0VUX0VOQ09ESU5HID0gImNoYXJzZXQiOwotCi0gICAgLyoqCi0gICAgICogRmllbGQgVU5BVVRIW10KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgVU5BVVRIW10gPSAoIjQwMSBVbmF1dGhvcml6ZWQiKS5nZXRCeXRlcygpOwotCi0gICAgLyoqCi0gICAgICogRmllbGQgU09fVElNRU9VVAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNPX1RJTUVPVVQgPSAiU09fVElNRU9VVCI7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBTRU5ERVJbXQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBTRU5ERVJbXSA9ICI0MDAiLmdldEJ5dGVzKCk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPWFkgPSAiUFJPWFkiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFVVEhFTlRJQ0FURSA9ICJfTlRMTV9ESUdFU1RfQkFTSUNfQVVUSEVOVElDQVRJT05fIjsKLQotICAgIC8qKgotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVRPTV9SRUNFSVZFRF9DT05URU5UX1RZUEUgPSAiTVRPTV9SRUNFSVZFRCI7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBJU0VbXQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBJU0VbXSA9ICgiNTAwIEludGVybmFsIHNlcnZlciBlcnJvciIpLmdldEJ5dGVzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBIVFRQX1JFUV9UWVBFCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRUUF9SRVFfVFlQRSA9ICJIVFRQX1JFUV9UWVBFIjsKLQotICAgIC8qKgotICAgICAqIERlZmF1bHQgY29udGVudCBlbmNvZGluZyBjaGF0c2V0Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRUUF9FTEVNRU5UX0NIQVJTRVQgPSAiVVMtQVNDSUkiOwotCi0gICAgLyoqCi0gICAgICogRmllbGQgSFRUUFtdCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjaGFyIEhUVFBbXSA9ICJIVFRQLzEuMCAiLnRvQ2hhckFycmF5KCk7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBERUZBVUxUX1NPX1RJTUVPVVQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1NPX1RJTUVPVVQgPSA2MDAwMDsKLQotICAgIC8qKgotICAgICAqIEZpZWxkIERFRkFVTFRfQ09OTkVDVElPTl9USU1FT1VUCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9DT05ORUNUSU9OX1RJTUVPVVQgPSA2MDAwMDsKLQotICAgIC8qKgotICAgICAqIEZpZWxkIENPTk5FQ1RJT05fVElNRU9VVAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTk5FQ1RJT05fVElNRU9VVCA9ICJDT05ORUNUSU9OX1RJTUVPVVQiOwotCi0gICAgLyoqCi0gICAgICogRmllbGQgQ0FDSEVEX0hUVFBfQ0xJRU5UCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FDSEVEX0hUVFBfQ0xJRU5UID0gIkNBQ0hFRF9IVFRQX0NMSUVOVCI7Ci0KLSAgICAvKioKLSAgICAgKiBAZGVwcmVjYXRlZCBwbGVhc2UgdXNlIE1VTFRJVEhSRUFEX0hUVFBfQ09OTkVDVElPTl9NQU5BR0VSCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVVUVElUSFJFQURfSFRUUF9DT05ORUNUSU9OX01BTkFHRVIgPSAiTVVUVElUSFJFQURfSFRUUF9DT05ORUNUSU9OX01BTkFHRVIiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVVMVElUSFJFQURfSFRUUF9DT05ORUNUSU9OX01BTkFHRVIgPSAiTVVMVElUSFJFQURfSFRUUF9DT05ORUNUSU9OX01BTkFHRVIiOwotCi0gICAgLyoqCi0gICAgICogRmllbGQgQ0FDSEVEX0hUVFBfQ0xJRU5UCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVVU0VfSFRUUF9DTElFTlQgPSAiUkVVU0VfSFRUUF9DTElFTlQiOwotCi0gICAgLyoqCi0gICAgICogRmllbGQgSFRUUF9NRVRIT0QKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQX01FVEhPRCA9ICJIVFRQX01FVEhPRF9PQkpFQ1QiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX0FDQ0VQVF9FTkNPRElORyA9ICJBY2NlcHQtRW5jb2RpbmciOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9DT05URU5UX0VOQ09ESU5HID0gIkNvbnRlbnQtRW5jb2RpbmciOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9DT05URU5UX0VOQ09ESU5HX0xPV0VSQ0FTRSA9Ci0gICAgICAgICAgICBIRUFERVJfQ09OVEVOVF9FTkNPRElORy50b0xvd2VyQ2FzZSgpOwotCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QUkVTU0lPTl9HWklQID0gImd6aXAiOwotCi0gICAgLyoqCi0gICAgICogRmllbGQgdG8gc2V0IHRoZSBjb29ja2llIHBvbGljeSBvZiBjb21tb25zIGh0dHAgY2xpZW50Ci0gICAgICogaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9odHRwY29tcG9uZW50cy9odHRwY2xpZW50LTMueC9jb29raWVzLmh0bWwKLSAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09PS0lFX1BPTElDWSA9ICJDT09LSUVfUE9MSUNZIjsKLQotICAgIC8qKgotICAgICAqIElmIHlvdSB3YW50IHRoZSBIVFRQIHNlbmRlciB0byBpbmRpY2F0ZSB0aGF0IGl0IGNhbiBhY2NlcHQgYSBnemlwZWQKLSAgICAgKiByZXNwb25zZSwgc2V0IHRoaXMgbWVzc2FnZSBjb250ZXh0IHByb3BlcnR5IHRvIHRydWUuIFRoZSBzZW5kZXIgd2lsbAotICAgICAqIGF1dG9tYXRpY2FsbHkgdW56aXAgdGhlIHJlc3BvbnNlIGlmIGl0cyBnemlwcGVkLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1DX0FDQ0VQVF9HWklQID0gInRyYW5zcG9ydC5odHRwLmFjY2VwdEd6aXAiOwotCi0gICAgLyoqCi0gICAgICogYnkgZGVmYXVsdCB0aGUgSFRUUCByZXF1ZXN0IGJvZHkgaXMgbm90IGNvbXByZXNzZWQuIHNldCB0aGlzIG1lc3NhZ2UKLSAgICAgKiBjb250ZXh0IHByb3BlcnR5IHRvIHRydWUgdG8gaGF2ZSB0aGUgcmVxdWVzdCBib2R5IGd6aXAgY29tcHJlc3NlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQ19HWklQX1JFUVVFU1QgPSAidHJhbnNwb3J0Lmh0dHAuZ3ppcFJlcXVlc3QiOwotCi0gICAgLyogYnkgZGVmYXVsdCB0aGUgSFRUUCByZXNwb25zZSBib2R5IGlzIG5vdCBjb21wcmVzc2VkLiBzZXQgdGhpcyBtZXNzYWdlCi0gICAgKiBjb250ZXh0IHByb3BlcnR5IHRvIHRydWUgdG8gaGF2ZSB0aGUgcmVzcG9uc2UgYm9keSBnemlwIGNvbXByZXNzZWQuCi0gICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQ19HWklQX1JFU1BPTlNFID0gImd6aXBSZXNwb25zZSI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHdpbGwgYWxsb3cgdXNlcnMgdG8gc2V0IGFueSBjdXN0b20gaGVhZGVycyB0byB0aGUgbWVzc2FnZSBjb250ZXh0LCB3aGljaCB3aWxsIGJlIHBpY2tlZAotICAgICAqIHVwIGJ5IHRoZSBzZW5kZXIgd2hpbGUgc2VuZGluZyB0aGUgcmVxdWVzdAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhUVFBfSEVBREVSUyA9ICJIVFRQX0hFQURFUlMiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENIVU5LRUQgPSAiX19DSFVOS0VEX18iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhUVFBfUFJPVE9DT0xfVkVSU0lPTiA9ICJfX0hUVFBfUFJPVE9DT0xfVkVSU0lPTl9fIjsKLSAgICAvL3RvIHNldCBhbmQgZ2V0IHRoZSBwcm9wZXJ0eSBmcm9tIHNlcnZpY2UgY29udGV4dAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPT0tJRV9TVFJJTkcgPSAiQ29va2llIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQX01FVEhPRF9HRVQgPSAiR0VUIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQX01FVEhPRF9QT1NUID0gIlBPU1QiOwotCi0gICAgLyoqCi0gICAgICogQGRlcHJlY2F0ZWQgUGxlYXNlIHVzZSBDb25zdGFudHMuQ29uZmlndXJhdGlvbi5DT05URU5UX1RZUEUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX1RZUEUgPSAiQ29udGVudC1UeXBlIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9NSVRfU09BUF8xMl9BQ1RJT04gPSAiT21pdFNPQVAxMkFjdGlvbiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX1BST1RPQ09MX0hBTkRMRVIgPSAiQ1VTVE9NX1BST1RPQ09MX0hBTkRMRVIiOwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhUVFBfTUVUSE9EX1BBUkFNUyA9ICJIVFRQX01FVEhPRF9QQVJBTVMiOwotCi0gICAgLyoKLSAgICAgKiBBdXRvbWF0aWNhbGx5IHJlbGVhc2UgY29ubmVjdGlvbnMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVVUT19SRUxFQVNFX0NPTk5FQ1RJT04gPSAiQXV0b1JlbGVhc2VDb25uZWN0aW9uIiA7Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgZ2V0Qnl0ZXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZGF0YQotICAgICAqIEByZXR1cm4gUmV0dXJucyBieXRlW10uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBieXRlW10gZ2V0Qnl0ZXMoZmluYWwgU3RyaW5nIGRhdGEpIHsKLSAgICAgICAgaWYgKGRhdGEgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUGFyYW1ldGVyIG1heSBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBkYXRhLmdldEJ5dGVzKEhUVFBfRUxFTUVOVF9DSEFSU0VUKTsKLSAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZGF0YS5nZXRCeXRlcygpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRVJfQUdFTlQgPSAidXNlckFnZW50IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWRVIgPSAic2VydmVyIjsKLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9NdWx0aXBhcnRGb3JtRGF0YUZvcm1hdHRlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL011bHRpcGFydEZvcm1EYXRhRm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxZGExZDQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL011bHRpcGFydEZvcm1EYXRhRm9ybWF0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NT3V0cHV0Rm9ybWF0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5NZXNzYWdlRm9ybWF0dGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAudXRpbC5Db21wbGV4UGFydDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLnV0aWwuVVJMVGVtcGxhdGluZ1V0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQubWV0aG9kcy5tdWx0aXBhcnQuUGFydDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5tZXRob2RzLm11bHRpcGFydC5TdHJpbmdQYXJ0OwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLS8qKgotICogRm9ybWF0ZXMgdGhlIHJlcXVlc3QgbWVzc2FnZSBhcyBtdWx0aXBhcnQvZm9ybS1kYXRhLiBBbiBleGFtcGxlIG9mIHRoaXMgc2VyaWFsaXphdGlvbiBpcyBzaG93bgotICogYmVsb3cgd2hpY2ggd2FzIGV4dHJhY3RlZCBmcm9tIHRoZSBXZWIgU2VydmljZXMgRGVzY3JpcHRpb24gTGFuZ3VhZ2UgKFdTREwpIFZlcnNpb24gMi4wIFBhcnQgMjogQWRqdW5jdHMKLSAqIDxwLz4KLSAqIFRoZSBmb2xsb3dpbmcgaW5zdGFuY2UgZGF0YSBvZiBhbiBpbnB1dCBtZXNzYWdlOgotICogPHAvPgotICogPGRhdGE+Ci0gKiA8dG93bj4KLSAqIDxuYW1lPkZyw6lqdXM8L25hbWU+Ci0gKiA8Y291bnRyeT5GcmFuY2U8L2NvdW50cnk+Ci0gKiA8L3Rvd24+Ci0gKiA8ZGF0ZT5AQEBALUBALUBAPC9kYXRlPgotICogPC9kYXRhPgotICogPHAvPgotICogd2l0aCB0aGUgZm9sbG93aW5nIG9wZXJhdGlvbiBlbGVtZW50Ci0gKiA8cC8+Ci0gKiA8b3BlcmF0aW9uIHJlZj0ndDpkYXRhJwotICogd2h0dHA6bG9jYXRpb249J3RlbXBlcmF0dXJlJwotICogd2h0dHA6bWV0aG9kPSdQT1NUJwotICogd2h0dHA6aW5wdXRTZXJpYWxpemF0aW9uPSdtdWx0aXBhcnQvZm9ybS1kYXRhJy8+Ci0gKiA8cC8+Ci0gKiB3aWxsIHNlcmlhbGl6ZSB0aGUgbWVzc2FnZSBhcyBmb2xsb3c6Ci0gKiA8cC8+Ci0gKiBDb250ZW50LVR5cGU6IG11bHRpcGFydC9mb3JtLWRhdGE7IGJvdW5kYXJ5PUFhQjAzeAotICogQ29udGVudC1MZW5ndGg6IHh4eAotICogPHAvPgotICogLS1BYUIwM3gKLSAqIENvbnRlbnQtRGlzcG9zaXRpb246IGZvcm0tZGF0YTsgbmFtZT0idG93biIKLSAqIENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24veG1sCi0gKiA8cC8+Ci0gKiA8dG93bj4KLSAqIDxuYW1lPkZyw6lqdXM8L25hbWU+Ci0gKiA8Y291bnRyeT5GcmFuY2U8L2NvdW50cnk+Ci0gKiA8L3Rvd24+Ci0gKiAtLUFhQjAzeAotICogQ29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1kYXRhOyBuYW1lPSJkYXRlIgotICogQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04Ci0gKgotICogQEBAQC1AQC1AQCAtLUFhQjAzeC0tCi0gKi8KLXB1YmxpYyBjbGFzcyBNdWx0aXBhcnRGb3JtRGF0YUZvcm1hdHRlciBpbXBsZW1lbnRzIE1lc3NhZ2VGb3JtYXR0ZXIgewotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBhIGJ5dGUgYXJyYXkgb2YgdGhlIG1lc3NhZ2UgZm9ybWF0dGVkIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4KLSAgICAgKiAgICAgICAgIG1lc3NhZ2UgZm9ybWF0LgotICAgICAqLwotICAgIHB1YmxpYyBieXRlW10gZ2V0Qnl0ZXMoTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQsIE9NT3V0cHV0Rm9ybWF0IGZvcm1hdCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0KLSAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IG1lc3NhZ2VDb250ZXh0LmdldEVudmVsb3BlKCkuZ2V0Qm9keSgpLmdldEZpcnN0RWxlbWVudCgpOwotCi0gICAgICAgIFBhcnRbXSBwYXJ0cyA9IGNyZWF0ZU11bHRpcGF0Rm9ybURhdGFSZXF1ZXN0KG9tRWxlbWVudCk7Ci0gICAgICAgIGlmIChwYXJ0cy5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYnl0ZXNPdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICB0cnkgewotCi0gICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhY2Nlc3NpbmcgYSBjbGFzcyBvZiBDb21tb25zLUZsaWVVcGxvYWQKLSAgICAgICAgICAgICAgICBQYXJ0LnNlbmRQYXJ0cyhieXRlc091dCwgcGFydHMsIGZvcm1hdC5nZXRNaW1lQm91bmRhcnkoKS5nZXRCeXRlcygpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBBeGlzRmF1bHQubWFrZUZhdWx0KGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGJ5dGVzT3V0LnRvQnl0ZUFycmF5KCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbmV3IGJ5dGVbMF07ICAvL1RvIGNoYW5nZSBib2R5IG9mIGltcGxlbWVudGVkIG1ldGhvZHMgdXNlIEZpbGUgfCBTZXR0aW5ncyB8IEZpbGUgVGVtcGxhdGVzLgotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRvIHN1cHBvcnQgZGVmZmVyZWQgd3JpdGluZyB0cmFuc3BvcnRzIGFzIGluIGh0dHAgY2h1bmtpbmcuLiBBeGlzMiB3YXMKLSAgICAgKiBkb2luZyB0aGlzIGZvciBzb21lIHRpbWUuLgotICAgICAqIDxwLz4KLSAgICAgKiBQcmVzZXJ2ZSBmbGFnIGNhbiBiZSB1c2VkIHRvIHByZXNlcnZlIHRoZSBlbnZlbG9wZSBmb3IgbGF0ZXIgdXNlLiBUaGlzIGlzCi0gICAgICogdXNlZnVsbCB3aGVuIGltcGxlbWVudGluZyBhdXRoZW50aWNhdGlvbiBtYWNobmlzbXMgbGlrZSBOVExNLgotICAgICAqCi0gICAgICogQHBhcmFtIG91dHB1dFN0cmVhbQotICAgICAqIEBwYXJhbSBwcmVzZXJ2ZSAgICAgOgotICAgICAqICAgICAgICAgICAgICAgICAgICAgZG8gbm90IGNvbnN1bWUgdGhlIE9NIHdoZW4gdGhpcyBpcyBzZXQuLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQsIE9NT3V0cHV0Rm9ybWF0IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0sIGJvb2xlYW4gcHJlc2VydmUpIHRocm93cyBBeGlzRmF1bHQgewotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBieXRlW10gYiA9IGdldEJ5dGVzKG1lc3NhZ2VDb250ZXh0LCBmb3JtYXQpOwotCi0gICAgICAgICAgICBpZiAoYiAhPSBudWxsICYmIGIubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgICAgIG91dHB1dFN0cmVhbS53cml0ZShiKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtLmZsdXNoKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoIkFuIGVycm9yIG9jY3VyZWQgd2hpbGUgd3JpdGluZyB0aGUgcmVxdWVzdCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGlmZmVyZW50IG1lc3NhZ2UgZm9ybWF0cyBjYW4gc2V0IHRoZWlyIG93biBjb250ZW50IHR5cGVzCi0gICAgICogRWc6IEpTT05Gb3JtYXR0ZXIgY2FuIHNldCB0aGUgY29udGVudCB0eXBlIGFzIGFwcGxpY2F0aW9uL2pzb24KLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXNzYWdlQ29udGV4dAotICAgICAqIEBwYXJhbSBmb3JtYXQKLSAgICAgKiBAcGFyYW0gc29hcEFjdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudFR5cGUoTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQsIE9NT3V0cHV0Rm9ybWF0IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzb2FwQWN0aW9uKSB7Ci0KLSAgICAgICAgU3RyaW5nIGNvbnRlbnRUeXBlID0gSFRUUENvbnN0YW50cy5NRURJQV9UWVBFX01VTFRJUEFSVF9GT1JNX0RBVEE7Ci0gICAgICAgIFN0cmluZyBlbmNvZGluZyA9IGZvcm1hdC5nZXRDaGFyU2V0RW5jb2RpbmcoKTsKLSAgICAgICAgaWYgKGVuY29kaW5nICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNvbnRlbnRUeXBlICs9ICI7IGNoYXJzZXQ9IiArIGVuY29kaW5nOwotICAgICAgICB9Ci0gICAgICAgIGNvbnRlbnRUeXBlID0gY29udGVudFR5cGUgKyAiOyAiICsgImJvdW5kYXJ5PSIgKyBmb3JtYXQuZ2V0TWltZUJvdW5kYXJ5KCk7Ci0gICAgICAgIHJldHVybiBjb250ZW50VHlwZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTb21lIG1lc3NhZ2UgZm9ybWF0cyBtYXkgd2FudCB0byBhbHRlciB0aGUgdGFyZ2V0IHVybC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHRhcmdldCBVUkwKLSAgICAgKi8KLSAgICBwdWJsaWMgVVJMIGdldFRhcmdldEFkZHJlc3MoTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQsIE9NT3V0cHV0Rm9ybWF0IGZvcm1hdCwgVVJMIHRhcmdldFVSTCkKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICAvLyBDaGVjayB3aGV0aGVyIHRoZXJlIGlzIGEgdGVtcGxhdGUgaW4gdGhlIFVSTCwgaWYgc28gd2UgaGF2ZSB0byByZXBsYWNlIHRoZW4gd2l0aCBkYXRhCi0gICAgICAgIC8vIHZhbHVlcyBhbmQgY3JlYXRlIGEgbmV3IHRhcmdldCBVUkwuCi0gICAgICAgIHRhcmdldFVSTCA9IFVSTFRlbXBsYXRpbmdVdGlsLmdldFRlbXBsYXRlZFVSTCh0YXJnZXRVUkwsIG1lc3NhZ2VDb250ZXh0LCBmYWxzZSk7Ci0KLSAgICAgICAgcmV0dXJuIHRhcmdldFVSTDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoaXMgb25seSBpZiB5b3Ugd2FudCBzZXQgYSB0cmFuc3BvcnQgaGVhZGVyIGZvciBTT0FQIEFjdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZm9ybWF0U09BUEFjdGlvbihNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCwgT01PdXRwdXRGb3JtYXQgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc29hcEFjdGlvbikgewotICAgICAgICByZXR1cm4gc29hcEFjdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gZGF0YU91dAotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwcml2YXRlIFBhcnRbXSBjcmVhdGVNdWx0aXBhdEZvcm1EYXRhUmVxdWVzdChPTUVsZW1lbnQgZGF0YU91dCkgewotICAgICAgICBBcnJheUxpc3QgcGFydHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGlmIChkYXRhT3V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIEl0ZXJhdG9yIGl0ZXIxID0gZGF0YU91dC5nZXRDaGlsZEVsZW1lbnRzKCk7Ci0gICAgICAgICAgICBPTUZhY3Rvcnkgb21GYWN0b3J5ID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCk7Ci0gICAgICAgICAgICB3aGlsZSAoaXRlcjEuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgT01FbGVtZW50IGVsZSA9IChPTUVsZW1lbnQpIGl0ZXIxLm5leHQoKTsKLSAgICAgICAgICAgICAgICBJdGVyYXRvciBpdGVyMiA9IGVsZS5nZXRDaGlsZEVsZW1lbnRzKCk7Ci0gICAgICAgICAgICAgICAgLy8gY2hlY2sgd2hldGhlciB0aGUgZWxlbWVudCBpcyBhIGNvbXBsZXggdHlwZQotICAgICAgICAgICAgICAgIGlmIChpdGVyMi5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb21GYWN0b3J5LmNyZWF0ZU9NRWxlbWVudChlbGUuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKSwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgIG9tRWxlbWVudC5hZGRDaGlsZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzQ29tcGxleFR5cGUob21FbGVtZW50LCBlbGUuZ2V0Q2hpbGRFbGVtZW50cygpLCBvbUZhY3RvcnkpKTsKLSAgICAgICAgICAgICAgICAgICAgcGFydHMuYWRkKG5ldyBDb21wbGV4UGFydChlbGUuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKSwgb21FbGVtZW50LnRvU3RyaW5nKCkpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBwYXJ0cy5hZGQobmV3IFN0cmluZ1BhcnQoZWxlLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCksIGVsZS5nZXRUZXh0KCkpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgUGFydFtdIHBhcnRzQXJyYXkgPSBuZXcgUGFydFtwYXJ0cy5zaXplKCldOwotICAgICAgICByZXR1cm4gKFBhcnRbXSkgcGFydHMudG9BcnJheShwYXJ0c0FycmF5KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gcGFyZW50Ci0gICAgICogQHBhcmFtIGl0ZXIKLSAgICAgKiBAcGFyYW0gb21GYWN0b3J5Ci0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHByaXZhdGUgT01FbGVtZW50IHByb2Nlc3NDb21wbGV4VHlwZShPTUVsZW1lbnQgcGFyZW50LCBJdGVyYXRvciBpdGVyLCBPTUZhY3Rvcnkgb21GYWN0b3J5KSB7Ci0KLSAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IG51bGw7Ci0gICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgT01FbGVtZW50IGVsZSA9IChPTUVsZW1lbnQpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgb21FbGVtZW50ID0gb21GYWN0b3J5LmNyZWF0ZU9NRWxlbWVudChlbGUuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKSwgbnVsbCk7Ci0gICAgICAgICAgICBJdGVyYXRvciBpdGVyMiA9IGVsZS5nZXRDaGlsZEVsZW1lbnRzKCk7Ci0gICAgICAgICAgICBpZiAoaXRlcjIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgcGFyZW50LmFkZENoaWxkKHByb2Nlc3NDb21wbGV4VHlwZShvbUVsZW1lbnQsIGVsZS5nZXRDaGlsZEVsZW1lbnRzKCksIG9tRmFjdG9yeSkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBvbUVsZW1lbnQgPSBvbUZhY3RvcnkuY3JlYXRlT01FbGVtZW50KGVsZS5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpLCBudWxsKTsKLSAgICAgICAgICAgICAgICBvbUVsZW1lbnQuc2V0VGV4dChlbGUuZ2V0VGV4dCgpKTsKLSAgICAgICAgICAgICAgICBwYXJlbnQuYWRkQ2hpbGQob21FbGVtZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gb21FbGVtZW50OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9TT0FQTWVzc2FnZUZvcm1hdHRlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL1NPQVBNZXNzYWdlRm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjZjhkZTguLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL1NPQVBNZXNzYWdlRm9ybWF0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU91dHB1dEZvcm1hdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuTUlNRU91dHB1dFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5VVUlER2VuZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5NZXNzYWdlRm9ybWF0dGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAudXRpbC5VUkxUZW1wbGF0aW5nVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuSmF2YVV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvcjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLXB1YmxpYyBjbGFzcyBTT0FQTWVzc2FnZUZvcm1hdHRlciBpbXBsZW1lbnRzIE1lc3NhZ2VGb3JtYXR0ZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFNPQVBNZXNzYWdlRm9ybWF0dGVyLmNsYXNzKTsKLSAgICAKLSAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKE1lc3NhZ2VDb250ZXh0IG1zZ0N0eHQsIE9NT3V0cHV0Rm9ybWF0IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbSBvdXQsIGJvb2xlYW4gcHJlc2VydmUpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1Zygic3RhcnQgd3JpdGVUbygpIik7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIiAgcHJlc2VydmU9IiArIHByZXNlcnZlKTsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiICBpc09wdGltaXplZD0iICsgZm9ybWF0LmlzT3B0aW1pemVkKCkpOwotICAgICAgICAgICAgbG9nLmRlYnVnKCIgIGlzRG9pbmdTV0E9IiArIGZvcm1hdC5pc0RvaW5nU1dBKCkpOwotICAgICAgICB9Ci0gICAgICAgIE9NRWxlbWVudCBlbGVtZW50ID0gbXNnQ3R4dC5nZXRFbnZlbG9wZSgpOwotICAgICAgICAKLSAgICAgICAgaW50IG9wdGltaXplZFRocmVzaG9sZCA9IFV0aWxzLmdldE10b21UaHJlc2hvbGQobXNnQ3R4dCk7ICAgICAgIAotICAgICAgICBpZihvcHRpbWl6ZWRUaHJlc2hvbGQgPiAwKXsKLSAgICAgICAgCWlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKXsKLSAgICAgICAgCQlsb2cuZGVidWcoIlNldHRpbmcgTVRPTSBvcHRpbWl6ZWQgVGhyZXNob2xkIFZhbHVlIG9uIE9NT3V0cHV0Rm9ybWF0Iik7Ci0gICAgICAgIAl9Ci0gICAgICAgIAlmb3JtYXQuc2V0T3B0aW1pemVkVGhyZXNob2xkKG9wdGltaXplZFRocmVzaG9sZCk7Ci0gICAgICAgIH0JICAgICAgICAKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKCEoZm9ybWF0LmlzT3B0aW1pemVkKCkpICYgZm9ybWF0LmlzRG9pbmdTV0EoKSkgewotICAgICAgICAgICAgICAgIFN0cmluZ1dyaXRlciBidWZmZXJlZFNPQVBCb2R5ID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgICAgICAgICAgICAgIGlmIChwcmVzZXJ2ZSkgewotICAgICAgICAgICAgICAgICAgICBlbGVtZW50LnNlcmlhbGl6ZShidWZmZXJlZFNPQVBCb2R5LCBmb3JtYXQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuc2VyaWFsaXplQW5kQ29uc3VtZShidWZmZXJlZFNPQVBCb2R5LCBmb3JtYXQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB3cml0ZVN3QU1lc3NhZ2UobXNnQ3R4dCwgYnVmZmVyZWRTT0FQQm9keSwgb3V0LCBmb3JtYXQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAocHJlc2VydmUpIHsKLSAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5zZXJpYWxpemUob3V0LCBmb3JtYXQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuc2VyaWFsaXplQW5kQ29uc3VtZShvdXQsIGZvcm1hdCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiZW5kIHdyaXRlVG8oKSIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJ5dGVbXSBnZXRCeXRlcyhNZXNzYWdlQ29udGV4dCBtc2dDdHh0LCBPTU91dHB1dEZvcm1hdCBmb3JtYXQpCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoInN0YXJ0IGdldEJ5dGVzKCkiKTsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiICBpc09wdGltaXplZD0iICsgZm9ybWF0LmlzT3B0aW1pemVkKCkpOwotICAgICAgICAgICAgbG9nLmRlYnVnKCIgIGlzRG9pbmdTV0E9IiArIGZvcm1hdC5pc0RvaW5nU1dBKCkpOwotICAgICAgICB9Ci0gICAgICAgIE9NRWxlbWVudCBlbGVtZW50ID0gbXNnQ3R4dC5nZXRFbnZlbG9wZSgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJ5dGVzT3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICAgICAgaWYgKCFmb3JtYXQuaXNPcHRpbWl6ZWQoKSkgewotICAgICAgICAgICAgICAgIGlmIChmb3JtYXQuaXNEb2luZ1NXQSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFdoeSBhcmUgd2UgY3JlYXRpbmcgYSBuZXcgT01PdXRwdXRGb3JtYXQKLSAgICAgICAgICAgICAgICAgICAgT01PdXRwdXRGb3JtYXQgZm9ybWF0MiA9IG5ldyBPTU91dHB1dEZvcm1hdCgpOwotICAgICAgICAgICAgICAgICAgICBmb3JtYXQyLnNldENoYXJTZXRFbmNvZGluZyhmb3JtYXQuZ2V0Q2hhclNldEVuY29kaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmdXcml0ZXIgYnVmZmVyZWRTT0FQQm9keSA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5zZXJpYWxpemVBbmRDb25zdW1lKGJ1ZmZlcmVkU09BUEJvZHksIGZvcm1hdDIpOwotICAgICAgICAgICAgICAgICAgICB3cml0ZVN3QU1lc3NhZ2UobXNnQ3R4dCwgYnVmZmVyZWRTT0FQQm9keSwgYnl0ZXNPdXQsIGZvcm1hdCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5zZXJpYWxpemVBbmRDb25zdW1lKGJ5dGVzT3V0LCBmb3JtYXQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gYnl0ZXNPdXQudG9CeXRlQXJyYXkoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZWxlbWVudC5zZXJpYWxpemVBbmRDb25zdW1lKGJ5dGVzT3V0LCBmb3JtYXQpOwotICAgICAgICAgICAgICAgIHJldHVybiBieXRlc091dC50b0J5dGVBcnJheSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKTsKLSAgICAgICAgfSBjYXRjaCAoRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvciBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBBeGlzRmF1bHQubWFrZUZhdWx0KGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJlbmQgZ2V0Qnl0ZXMoKSIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRDb250ZW50VHlwZShNZXNzYWdlQ29udGV4dCBtc2dDdHh0LCBPTU91dHB1dEZvcm1hdCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc29hcEFjdGlvblN0cmluZykgewotICAgICAgICBTdHJpbmcgZW5jb2RpbmcgPSBmb3JtYXQuZ2V0Q2hhclNldEVuY29kaW5nKCk7Ci0gICAgICAgIFN0cmluZyBjb250ZW50VHlwZSA9IGZvcm1hdC5nZXRDb250ZW50VHlwZSgpOwotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiY29udGVudFR5cGUgZnJvbSB0aGUgT01PdXRwdXRGb3JtYXQgPSIgKyBjb250ZW50VHlwZSk7Ci0gICAgICAgIH0KLSAgICAgICAgIGlmIChlbmNvZGluZyAhPSBudWxsICYmIGNvbnRlbnRUeXBlICE9IG51bGwgJiYKLSAgICAgICAgCQljb250ZW50VHlwZS5pbmRleE9mKEhUVFBDb25zdGFudHMuTUVESUFfVFlQRV9NVUxUSVBBUlRfUkVMQVRFRCk9PS0xKSB7Ci0gICAgICAgICAgICAgY29udGVudFR5cGUgKz0gIjsgY2hhcnNldD0iICsgZW5jb2Rpbmc7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgLy8gYWN0aW9uIGhlYWRlciBpcyBub3QgbWFuZGF0ZWQgaW4gU09BUCAxLjIuIFNvIHB1dHRpbmcgaXQsIGlmCi0gICAgICAgIC8vIGF2YWlsYWJsZQotICAgICAgICBpZiAoIW1zZ0N0eHQuaXNTT0FQMTEoKSAmJiAoc29hcEFjdGlvblN0cmluZyAhPSBudWxsKQotICAgICAgICAgICAgICAgICYmICEiIi5lcXVhbHMoc29hcEFjdGlvblN0cmluZy50cmltKCkpCi0gICAgICAgICAgICAgICAgJiYgISJcIlwiIi5lcXVhbHMoc29hcEFjdGlvblN0cmluZy50cmltKCkpKSB7Ci0gICAgICAgICAgICBjb250ZW50VHlwZSA9IGNvbnRlbnRUeXBlICsgIjsgYWN0aW9uPVwiIiArIHNvYXBBY3Rpb25TdHJpbmcrICJcIiI7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIFRoaXMgaXMgYSBxdWljayBzYWZldHkgY2F0Y2guICBQcmlvciB2ZXJzaW9ucyBvZiBTT0FQRm9ybWF0dGVyCi0gICAgICAgIC8vIHBsYWNlZCBhICc7JyBhdCB0aGUgZW5kIG9mIHRoZSBjb250ZW50LXR5cGUuICBNYW55IHZlbmRvcnMgaWdub3JlIHRoaXMKLSAgICAgICAgLy8gbGFzdCAnOycuICBIb3dldmVyIGl0IGlzIG5vdCBsZWdhbCBhbmQgc29tZSB2ZW5kb3JzIHJlcG9ydCBhbiBlcnJvci4KLSAgICAgICAgLy8gVG8gaW5jcmVhc2UgaW50ZXJvcGVyYWJpbGl0eSwgdGhlICc7JyBpcyBzdHJpcHBlZCBvZmYuCi0gICAgICAgIGNvbnRlbnRUeXBlID0gY29udGVudFR5cGUudHJpbSgpOwotICAgICAgICBpZiAoY29udGVudFR5cGUubGFzdEluZGV4T2YoIjsiKSA9PSAoY29udGVudFR5cGUubGVuZ3RoKCktMSkpIHsKLSAgICAgICAgICAgIGNvbnRlbnRUeXBlID0gY29udGVudFR5cGUuc3Vic3RyaW5nKDAsIGNvbnRlbnRUeXBlLmxlbmd0aCgpLTEpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiY29udGVudFR5cGUgcmV0dXJuZWQgPSIgKyBjb250ZW50VHlwZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNvbnRlbnRUeXBlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZm9ybWF0U09BUEFjdGlvbihNZXNzYWdlQ29udGV4dCBtc2dDdHh0LCBPTU91dHB1dEZvcm1hdCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzb2FwQWN0aW9uU3RyaW5nKSB7Ci0gICAgICAgIC8vIGlmIFNPQVAgMS4yIHdlIGF0dGFjaCB0aGUgc29hcCBhY3Rpb24gdG8gdGhlIGNvbnRlbnQtdHlwZQotICAgICAgICAvLyBObyBuZWVkIHRvIHNldCBpdCBhcyBhIGhlYWRlci4KLSAgICAgICAgaWYgKG1zZ0N0eHQuaXNTT0FQMTEoKSkgewotICAgICAgICAgICAgaWYgKCIiLmVxdWFscyhzb2FwQWN0aW9uU3RyaW5nKSkgewotICAgICAgICAgICAgICAgIHJldHVybiAiXCJcIiI7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChzb2FwQWN0aW9uU3RyaW5nICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgICAgICYmICFzb2FwQWN0aW9uU3RyaW5nLnN0YXJ0c1dpdGgoIlwiIikpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gU09BUEFjdGlvbiBzdHJpbmcgbXVzdCBiZSBhIHF1b3RlZCBzdHJpbmcKLSAgICAgICAgICAgICAgICAgICAgc29hcEFjdGlvblN0cmluZyA9ICJcIiIgKyBzb2FwQWN0aW9uU3RyaW5nICsgIlwiIjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHNvYXBBY3Rpb25TdHJpbmc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIFVSTCBnZXRUYXJnZXRBZGRyZXNzKE1lc3NhZ2VDb250ZXh0IG1zZ0N0eHQsIE9NT3V0cHV0Rm9ybWF0IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMIHRhcmdldFVSTCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0KLSAgICAgICAgLy8gQ2hlY2sgd2hldGhlciB0aGVyZSBpcyBhIHRlbXBsYXRlIGluIHRoZSBVUkwsIGlmIHNvIHdlIGhhdmUgdG8gcmVwbGFjZSB0aGVuIHdpdGggZGF0YQotICAgICAgICAvLyB2YWx1ZXMgYW5kIGNyZWF0ZSBhIG5ldyB0YXJnZXQgVVJMLgotICAgICAgICB0YXJnZXRVUkwgPSBVUkxUZW1wbGF0aW5nVXRpbC5nZXRUZW1wbGF0ZWRVUkwodGFyZ2V0VVJMLCBtc2dDdHh0LCBmYWxzZSk7Ci0gICAgICAgIHJldHVybiB0YXJnZXRVUkw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHdyaXRlU3dBTWVzc2FnZShNZXNzYWdlQ29udGV4dCBtc2dDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nV3JpdGVyIGJ1ZmZlcmVkU09BUEJvZHksIE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTU91dHB1dEZvcm1hdCBmb3JtYXQpIHsKLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoInN0YXJ0IHdyaXRlU3dBTWVzc2FnZSgpIik7Ci0gICAgICAgIH0KLSAgICAgICAgT2JqZWN0IHByb3BlcnR5ID0gbXNnQ3R4dAotICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eShDb25zdGFudHMuQ29uZmlndXJhdGlvbi5NTTdfQ09NUEFUSUJMRSk7Ci0gICAgICAgIGJvb2xlYW4gTU03Q29tcGF0TW9kZSA9IGZhbHNlOwotICAgICAgICBpZiAocHJvcGVydHkgIT0gbnVsbCkgewotICAgICAgICAgICAgTU03Q29tcGF0TW9kZSA9IEphdmFVdGlscy5pc1RydWVFeHBsaWNpdGx5KHByb3BlcnR5KTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIU1NN0NvbXBhdE1vZGUpIHsKLSAgICAgICAgICAgIE1JTUVPdXRwdXRVdGlscy53cml0ZVNPQVBXaXRoQXR0YWNobWVudHNNZXNzYWdlKGJ1ZmZlcmVkU09BUEJvZHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2dDdHh0LmdldEF0dGFjaG1lbnRNYXAoKSwgZm9ybWF0KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFN0cmluZyBpbm5lckJvdW5kYXJ5OwotICAgICAgICAgICAgU3RyaW5nIHBhcnRDSUQ7Ci0gICAgICAgICAgICBPYmplY3QgaW5uZXJCb3VuZGFyeVByb3BlcnR5ID0gbXNnQ3R4dAotICAgICAgICAgICAgICAgICAgICAuZ2V0UHJvcGVydHkoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uTU03X0lOTkVSX0JPVU5EQVJZKTsKLSAgICAgICAgICAgIGlmIChpbm5lckJvdW5kYXJ5UHJvcGVydHkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlubmVyQm91bmRhcnkgPSAoU3RyaW5nKSBpbm5lckJvdW5kYXJ5UHJvcGVydHk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlubmVyQm91bmRhcnkgPSAiaW5uZXJCb3VuZGFyeSIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgVVVJREdlbmVyYXRvci5nZXRVVUlEKCkucmVwbGFjZSgnOicsICdfJyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBPYmplY3QgcGFydENJRFByb3BlcnR5ID0gbXNnQ3R4dAotICAgICAgICAgICAgICAgICAgICAuZ2V0UHJvcGVydHkoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uTU03X1BBUlRfQ0lEKTsKLSAgICAgICAgICAgIGlmIChwYXJ0Q0lEUHJvcGVydHkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHBhcnRDSUQgPSAoU3RyaW5nKSBwYXJ0Q0lEUHJvcGVydHk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHBhcnRDSUQgPSAiaW5uZXJDSUQiCi0gICAgICAgICAgICAgICAgICAgICAgICArIFVVSURHZW5lcmF0b3IuZ2V0VVVJRCgpLnJlcGxhY2UoJzonLCAnXycpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTUlNRU91dHB1dFV0aWxzLndyaXRlTU03TWVzc2FnZShidWZmZXJlZFNPQVBCb2R5LCBvdXRwdXRTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZ0N0eHQuZ2V0QXR0YWNobWVudE1hcCgpLCBmb3JtYXQsIHBhcnRDSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlubmVyQm91bmRhcnkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJlbmQgd3JpdGVTd0FNZXNzYWdlKCkiKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL1hGb3JtVVJMRW5jb2RlZEZvcm1hdHRlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL1hGb3JtVVJMRW5jb2RlZEZvcm1hdHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDk2ZjkxLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9YRm9ybVVSTEVuY29kZWRGb3JtYXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NT3V0cHV0Rm9ybWF0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLldTREwyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lk1lc3NhZ2VGb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC51dGlsLlVSTFRlbXBsYXRpbmdVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5KYXZhVXRpbHM7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLS8qKgotICogRm9ybWF0ZXMgdGhlIHJlcXVlc3QgbWVzc2FnZSBhcyBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQKLSAqLwotcHVibGljIGNsYXNzIFhGb3JtVVJMRW5jb2RlZEZvcm1hdHRlciBpbXBsZW1lbnRzIE1lc3NhZ2VGb3JtYXR0ZXIgewotCi0gICAgcHVibGljIGJ5dGVbXSBnZXRCeXRlcyhNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCwgT01PdXRwdXRGb3JtYXQgZm9ybWF0KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLQotICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gbWVzc2FnZUNvbnRleHQuZ2V0RW52ZWxvcGUoKS5nZXRCb2R5KCkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0KLSAgICAgICAgaWYgKG9tRWxlbWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBJdGVyYXRvciBpdCA9IG9tRWxlbWVudC5nZXRDaGlsZEVsZW1lbnRzKCk7Ci0gICAgICAgICAgICBTdHJpbmcgcGFyYVN0cmluZyA9ICIiOwotCi0gICAgICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgT01FbGVtZW50IGVsZTEgPSAoT01FbGVtZW50KSBpdC5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHBhcmFtZXRlcjsKLQotICAgICAgICAgICAgICAgIHBhcmFtZXRlciA9IGVsZTEuZ2V0TG9jYWxOYW1lKCkgKyAiPSIgKyBlbGUxLmdldFRleHQoKTsKLSAgICAgICAgICAgICAgICBwYXJhU3RyaW5nID0gIiIuZXF1YWxzKHBhcmFTdHJpbmcpID8gcGFyYW1ldGVyIDogKHBhcmFTdHJpbmcgKyAiJiIgKyBwYXJhbWV0ZXIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gcGFyYVN0cmluZy5nZXRCeXRlcygpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBieXRlWzBdOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQsIE9NT3V0cHV0Rm9ybWF0IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0sIGJvb2xlYW4gcHJlc2VydmUpIHRocm93cyBBeGlzRmF1bHQgewotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBvdXRwdXRTdHJlYW0ud3JpdGUoZ2V0Qnl0ZXMobWVzc2FnZUNvbnRleHQsIGZvcm1hdCkpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJBbiBlcnJvciBvY2N1cmVkIHdoaWxlIHdyaXRpbmcgdGhlIHJlcXVlc3QiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudFR5cGUoTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQsIE9NT3V0cHV0Rm9ybWF0IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzb2FwQWN0aW9uKSB7Ci0KLSAgICAgICAgU3RyaW5nIGVuY29kaW5nID0gZm9ybWF0LmdldENoYXJTZXRFbmNvZGluZygpOwotICAgICAgICBTdHJpbmcgY29udGVudFR5cGUgPSBIVFRQQ29uc3RhbnRzLk1FRElBX1RZUEVfWF9XV1dfRk9STTsKLQotICAgICAgICBpZiAoZW5jb2RpbmcgIT0gbnVsbCkgewotICAgICAgICAgICAgY29udGVudFR5cGUgKz0gIjsgY2hhcnNldD0iICsgZW5jb2Rpbmc7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBpZiBzb2FwIGFjdGlvbiBpcyB0aGVyZSAoY2FuIGJlIHRoZXJlIGlzIHNvYXAgcmVzcG9uc2UgTUVQIGlzIHVzZWQpIGFkZCBpdC4KLSAgICAgICAgaWYgKChzb2FwQWN0aW9uICE9IG51bGwpCi0gICAgICAgICAgICAgICAgJiYgISIiLmVxdWFscyhzb2FwQWN0aW9uLnRyaW0oKSkKLSAgICAgICAgICAgICAgICAmJiAhIlwiXCIiLmVxdWFscyhzb2FwQWN0aW9uLnRyaW0oKSkpIHsKLSAgICAgICAgICAgIGNvbnRlbnRUeXBlID0gY29udGVudFR5cGUgKyAiO2FjdGlvbj1cIiIgKyBzb2FwQWN0aW9uICsgIlwiOyI7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gY29udGVudFR5cGU7Ci0gICAgfQotCi0gICAgcHVibGljIFVSTCBnZXRUYXJnZXRBZGRyZXNzKE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0LCBPTU91dHB1dEZvcm1hdCBmb3JtYXQsIFVSTCB0YXJnZXRVUkwpCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLQotICAgICAgICAvLyBDaGVjayB3aGV0aGVyIHRoZXJlIGlzIGEgdGVtcGxhdGUgaW4gdGhlIFVSTCwgaWYgc28gd2UgaGF2ZSB0byByZXBsYWNlIHRoZW4gd2l0aCBkYXRhCi0gICAgICAgIC8vIHZhbHVlcyBhbmQgY3JlYXRlIGEgbmV3IHRhcmdldCBVUkwuCi0gICAgICAgIHRhcmdldFVSTCA9IFVSTFRlbXBsYXRpbmdVdGlsLmdldFRlbXBsYXRlZFVSTCh0YXJnZXRVUkwsIG1lc3NhZ2VDb250ZXh0LCB0cnVlKTsKLSAgICAgICAgU3RyaW5nIGlnbm9yZVVuY2l0ZWQgPQotICAgICAgICAgICAgICAgIChTdHJpbmcpIG1lc3NhZ2VDb250ZXh0LmdldFByb3BlcnR5KFdTREwyQ29uc3RhbnRzLkFUVFJfV0hUVFBfSUdOT1JFX1VOQ0lURUQpOwotCi0gICAgICAgIC8vIE5lZWQgdG8gaGF2ZSB0aGlzIGNoZWNrIGhlcmUgY2F1c2UgICAgICAgICAKLSAgICAgICAgaWYgKGlnbm9yZVVuY2l0ZWQgPT0gbnVsbCB8fCAhSmF2YVV0aWxzLmlzVHJ1ZUV4cGxpY2l0bHkoaWdub3JlVW5jaXRlZCkpIHsKLSAgICAgICAgICAgIFN0cmluZyBodHRwTWV0aG9kID0gKFN0cmluZykgbWVzc2FnZUNvbnRleHQuZ2V0UHJvcGVydHkoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uSFRUUF9NRVRIT0QpOwotICAgICAgICAgICAgaWYgKENvbnN0YW50cy5Db25maWd1cmF0aW9uLkhUVFBfTUVUSE9EX0dFVC5lcXVhbHMoaHR0cE1ldGhvZCkgfHwgQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uSFRUUF9NRVRIT0RfREVMRVRFLmVxdWFscyhodHRwTWV0aG9kKSkgewotICAgICAgICAgICAgdGFyZ2V0VVJMID0gVVJMVGVtcGxhdGluZ1V0aWwuYXBwZW5kUXVlcnlQYXJhbWV0ZXJzKG1lc3NhZ2VDb250ZXh0LCB0YXJnZXRVUkwpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbWVzc2FnZUNvbnRleHQuZ2V0RW52ZWxvcGUoKS5nZXRCb2R5KCkuZ2V0Rmlyc3RFbGVtZW50KCkuZGV0YWNoKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdGFyZ2V0VVJMOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZm9ybWF0U09BUEFjdGlvbihNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCwgT01PdXRwdXRGb3JtYXQgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc29hcEFjdGlvbikgewotICAgICAgICByZXR1cm4gc29hcEFjdGlvbjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvdXRpbC9Db21wbGV4UGFydC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL3V0aWwvQ29tcGxleFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM0ZWQzYi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvdXRpbC9Db21wbGV4UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAudXRpbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQubWV0aG9kcy5tdWx0aXBhcnQuUGFydEJhc2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50LnV0aWwuRW5jb2RpbmdVdGlsOw0KLQ0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsNCi0NCi1wdWJsaWMgY2xhc3MgQ29tcGxleFBhcnQgZXh0ZW5kcyBQYXJ0QmFzZSB7DQotDQotICAgIC8qKg0KLSAgICAgKiBEZWZhdWx0IGNvbnRlbnQgZW5jb2Rpbmcgb2Ygc3RyaW5nIHBhcmFtZXRlcnMuDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0NPTlRFTlRfVFlQRSA9ICJhcHBsaWNhdGlvbi94bWwiOw0KLQ0KLSAgICAvKioNCi0gICAgICogRGVmYXVsdCBjaGFyc2V0IG9mIHN0cmluZyBwYXJhbWV0ZXJzDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0NIQVJTRVQgPSAiVVMtQVNDSUkiOw0KLQ0KLSAgICAvKioNCi0gICAgICogRGVmYXVsdCB0cmFuc2ZlciBlbmNvZGluZyBvZiBzdHJpbmcgcGFyYW1ldGVycw0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9UUkFOU0ZFUl9FTkNPRElORyA9ICI4Yml0IjsNCi0NCi0gICAgLyoqDQotICAgICAqIENvbnRlbnRzIG9mIHRoaXMgU3RyaW5nUGFydC4NCi0gICAgICovDQotICAgIHByaXZhdGUgYnl0ZVtdIGNvbnRlbnQ7DQotDQotICAgIC8qKg0KLSAgICAgKiBUaGUgU3RyaW5nIHZhbHVlIG9mIHRoaXMgcGFydC4NCi0gICAgICovDQotICAgIHByaXZhdGUgU3RyaW5nIHZhbHVlOw0KLQ0KLSAgICAvKioNCi0gICAgICogQ29uc3RydWN0b3IuDQotICAgICAqDQotICAgICAqIEBwYXJhbSBuYW1lICAgIFRoZSBuYW1lIG9mIHRoZSBwYXJ0DQotICAgICAqIEBwYXJhbSB2YWx1ZSAgIHRoZSBzdHJpbmcgdG8gcG9zdA0KLSAgICAgKiBAcGFyYW0gY2hhcnNldCB0aGUgY2hhcnNldCB0byBiZSB1c2VkIHRvIGVuY29kZSB0aGUgc3RyaW5nLCBpZiA8Y29kZT5udWxsPC9jb2RlPg0KLSAgICAgKiAgICAgICAgICAgICAgICB0aGUge0BsaW5rICNERUZBVUxUX0NIQVJTRVQgZGVmYXVsdH0gaXMgdXNlZA0KLSAgICAgKi8NCi0gICAgcHVibGljIENvbXBsZXhQYXJ0KFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUsIFN0cmluZyBjaGFyc2V0KSB7DQotDQotICAgICAgICBzdXBlcigNCi0gICAgICAgICAgICAgICAgbmFtZSwNCi0gICAgICAgICAgICAgICAgREVGQVVMVF9DT05URU5UX1RZUEUsDQotICAgICAgICAgICAgICAgIGNoYXJzZXQgPT0gbnVsbCA/IERFRkFVTFRfQ0hBUlNFVCA6IGNoYXJzZXQsDQotICAgICAgICAgICAgICAgIERFRkFVTFRfVFJBTlNGRVJfRU5DT0RJTkcNCi0gICAgICAgICk7DQotICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlZhbHVlIG1heSBub3QgYmUgbnVsbCIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHZhbHVlLmluZGV4T2YoMCkgIT0gLTEpIHsNCi0gICAgICAgICAgICAvLyBTZWUgUkZDIDIwNDgsIDIuOC4gIjhiaXQgRGF0YSINCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJOVUxzIG1heSBub3QgYmUgcHJlc2VudCBpbiBzdHJpbmcgcGFydHMiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogQ29uc3RydWN0b3IuDQotICAgICAqDQotICAgICAqIEBwYXJhbSBuYW1lICBUaGUgbmFtZSBvZiB0aGUgcGFydA0KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIHN0cmluZyB0byBwb3N0DQotICAgICAqLw0KLSAgICBwdWJsaWMgQ29tcGxleFBhcnQoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgew0KLSAgICAgICAgdGhpcyhuYW1lLCB2YWx1ZSwgbnVsbCk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIEdldHMgdGhlIGNvbnRlbnQgaW4gYnl0ZXMuICBCeXRlcyBhcmUgbGF6aWx5IGNyZWF0ZWQgdG8gYWxsb3cgdGhlIGNoYXJzZXQgdG8gYmUgY2hhbmdlZA0KLSAgICAgKiBhZnRlciB0aGUgcGFydCBpcyBjcmVhdGVkLg0KLSAgICAgKg0KLSAgICAgKiBAcmV0dXJuIHRoZSBjb250ZW50IGluIGJ5dGVzDQotICAgICAqLw0KLSAgICBwcml2YXRlIGJ5dGVbXSBnZXRDb250ZW50KCkgew0KLSAgICAgICAgaWYgKGNvbnRlbnQgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIGNvbnRlbnQgPSBFbmNvZGluZ1V0aWwuZ2V0Qnl0ZXModmFsdWUsIGdldENoYXJTZXQoKSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gY29udGVudDsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogV3JpdGVzIHRoZSBkYXRhIHRvIHRoZSBnaXZlbiBPdXRwdXRTdHJlYW0uDQotICAgICAqDQotICAgICAqIEBwYXJhbSBvdXQgdGhlIE91dHB1dFN0cmVhbSB0byB3cml0ZSB0bw0KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgd3JpdGUgZXJyb3INCi0gICAgICovDQotICAgIHByb3RlY3RlZCB2b2lkIHNlbmREYXRhKE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICBvdXQud3JpdGUoZ2V0Q29udGVudCgpKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogUmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIGRhdGEuDQotICAgICAqDQotICAgICAqIEByZXR1cm4gVGhlIGxlbmd0aCBvZiB0aGUgZGF0YS4NCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBJZiBhbiBJTyBwcm9ibGVtIG9jY3Vycw0KLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50Lm1ldGhvZHMubXVsdGlwYXJ0LlBhcnQjbGVuZ3RoT2ZEYXRhKCkNCi0gICAgICovDQotICAgIHByb3RlY3RlZCBsb25nIGxlbmd0aE9mRGF0YSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICByZXR1cm4gZ2V0Q29udGVudCgpLmxlbmd0aDsNCi0gICAgfQ0KLQ0KLSAgICAvKiAobm9uLUphdmFkb2MpDQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQubWV0aG9kcy5tdWx0aXBhcnQuQmFzZVBhcnQjc2V0Q2hhclNldChqYXZhLmxhbmcuU3RyaW5nKQ0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgc2V0Q2hhclNldChTdHJpbmcgY2hhclNldCkgew0KLSAgICAgICAgc3VwZXIuc2V0Q2hhclNldChjaGFyU2V0KTsNCi0gICAgICAgIHRoaXMuY29udGVudCA9IG51bGw7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL3V0aWwvUXVlcnlTdHJpbmdQYXJzZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC91dGlsL1F1ZXJ5U3RyaW5nUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzMTUyYjQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL3V0aWwvUXVlcnlTdHJpbmdQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLS8qKgotICogUGFyc2VyIGZvciBVUkwgcXVlcnkgc3RyaW5ncy4KLSAqLwotcHVibGljIGNsYXNzIFF1ZXJ5U3RyaW5nUGFyc2VyIHsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBxdWVyeVN0cmluZzsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGUgcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgcGFyYW1ldGVyLgotICAgICAqLwotICAgIHByaXZhdGUgaW50IHBhcmFtQmVnaW47Ci0gICAgcHJpdmF0ZSBpbnQgcGFyYW1FbmQ7Ci0gICAgcHJpdmF0ZSBpbnQgcGFyYW1OYW1lRW5kOwotICAgIHByaXZhdGUgU3RyaW5nIHBhcmFtTmFtZTsKLSAgICBwcml2YXRlIFN0cmluZyBwYXJhbVZhbHVlOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0IGEgcGFyc2VyIGZyb20gdGhlIGdpdmVuIFVSTCBxdWVyeSBzdHJpbmcuCi0gICAgICogCi0gICAgICogQHBhcmFtIHF1ZXJ5U3RyaW5nIHRoZSBxdWVyeSBzdHJpbmcsIGkuZS4gdGhlIHBhcnQgb2YgdGhlIFVSTCBzdGFydGluZwotICAgICAqICAgICAgICAgICAgICAgICAgICBhZnRlciB0aGUgJz8nIGNoYXJhY3RlcgotICAgICAqLwotICAgIHB1YmxpYyBRdWVyeVN0cmluZ1BhcnNlcihTdHJpbmcgcXVlcnlTdHJpbmcpIHsKLSAgICAgICAgdGhpcy5xdWVyeVN0cmluZyA9IHF1ZXJ5U3RyaW5nOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBNb3ZlIHRvIHRoZSBuZXh0IHBhcmFtZXRlciBpbiB0aGUgcXVlcnkgc3RyaW5nLgotICAgICAqIAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYSBwYXJhbWV0ZXIgaGFzIGJlZW4gZm91bmQ7IAotICAgICAqIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGVyZSBhcmUgbm8gbW9yZSBwYXJhbWV0ZXJzCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gbmV4dCgpIHsKLSAgICAgICAgaW50IGxlbiA9IHF1ZXJ5U3RyaW5nLmxlbmd0aCgpOwotICAgICAgICBpZiAocGFyYW1FbmQgPT0gbGVuKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcGFyYW1CZWdpbiA9IHBhcmFtRW5kID09IDAgPyAwIDogcGFyYW1FbmQrMTsKLSAgICAgICAgaW50IGlkeCA9IHF1ZXJ5U3RyaW5nLmluZGV4T2YoJyYnLCBwYXJhbUJlZ2luKTsKLSAgICAgICAgcGFyYW1FbmQgPSBpZHggPT0gLTEgPyBsZW4gOiBpZHg7Ci0gICAgICAgIGlkeCA9IHF1ZXJ5U3RyaW5nLmluZGV4T2YoJz0nLCBwYXJhbUJlZ2luKTsKLSAgICAgICAgcGFyYW1OYW1lRW5kID0gaWR4ID09IC0xIHx8IGlkeCA+IHBhcmFtRW5kID8gcGFyYW1FbmQgOiBpZHg7Ci0gICAgICAgIHBhcmFtTmFtZSA9IG51bGw7Ci0gICAgICAgIHBhcmFtVmFsdWUgPSBudWxsOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2VhcmNoIGZvciBhIHBhcmFtZXRlciB3aXRoIGEgbmFtZSBpbiBhIGdpdmVuIGNvbGxlY3Rpb24uCi0gICAgICogVGhpcyBtZXRob2QgaXRlcmF0ZXMgb3ZlciB0aGUgcGFyYW1ldGVycyB1bnRpbCBhIHBhcmFtZXRlciB3aXRoCi0gICAgICogYSBtYXRjaGluZyBuYW1lIGhhcyBiZWVuIGZvdW5kLiBOb3RlIHRoYXQgdGhlIGN1cnJlbnQgcGFyYW1ldGVyIGlzIG5vdAotICAgICAqIGNvbnNpZGVyZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIG5hbWVzCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHNlYXJjaChDb2xsZWN0aW9uPFN0cmluZz4gbmFtZXMpIHsKLSAgICAgICAgd2hpbGUgKG5leHQoKSkgewotICAgICAgICAgICAgaWYgKG5hbWVzLmNvbnRhaW5zKGdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEdldCB0aGUgbmFtZSBvZiB0aGUgY3VycmVudCBwYXJhbWV0ZXIuCi0gICAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCBpcyBvbmx5IGFsbG93ZWQgaWYge0BsaW5rICNuZXh0KCl9IGhhcyBiZWVuIGNhbGxlZAotICAgICAqIHByZXZpb3VzbHkgYW5kIHRoZSByZXN1bHQgb2YgdGhpcyBjYWxsIHdhcyA8Y29kZT50cnVlPC9jb2RlPi4gT3RoZXJ3aXNlIHRoZQotICAgICAqIHJlc3VsdCBvZiB0aGlzIG1ldGhvZCBpcyB1bmRlZmluZWQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgY3VycmVudCBwYXJhbWV0ZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIGlmIChwYXJhbU5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgcGFyYW1OYW1lID0gcXVlcnlTdHJpbmcuc3Vic3RyaW5nKHBhcmFtQmVnaW4sIHBhcmFtTmFtZUVuZCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHBhcmFtTmFtZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSB2YWx1ZSBvZiB0aGUgY3VycmVudCBwYXJhbWV0ZXIuCi0gICAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCBpcyBvbmx5IGFsbG93ZWQgaWYge0BsaW5rICNuZXh0KCl9IGhhcyBiZWVuIGNhbGxlZAotICAgICAqIHByZXZpb3VzbHkgYW5kIHRoZSByZXN1bHQgb2YgdGhpcyBjYWxsIHdhcyA8Y29kZT50cnVlPC9jb2RlPi4gT3RoZXJ3aXNlIHRoZQotICAgICAqIHJlc3VsdCBvZiB0aGlzIG1ldGhvZCBpcyB1bmRlZmluZWQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgZGVjb2RlZCB2YWx1ZSBvZiB0aGUgY3VycmVudCBwYXJhbWV0ZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotICAgICAgICBpZiAocGFyYW1WYWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAocGFyYW1OYW1lRW5kID09IHBhcmFtRW5kKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHBhcmFtVmFsdWUgPSBVUklFbmNvZGVyRGVjb2Rlci5kZWNvZGUocXVlcnlTdHJpbmcuc3Vic3RyaW5nKHBhcmFtTmFtZUVuZCsxLCBwYXJhbUVuZCkpOwotICAgICAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgIC8vIFRPRE86IFVSSUVuY29kZXJEZWNvZGVyLmRlY29kZSBzaG91bGQgYmUgY2hhbmdlZCB0byBub3QgdGhyb3cKLSAgICAgICAgICAgICAgICAvLyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHNpbmNlIHRoaXMgYWN0dWFsbHkgbmV2ZXIgaGFwcGVucyAodGhlIGNoYXJzZXQKLSAgICAgICAgICAgICAgICAvLyBiZWluZyBsb29rZWQgdXAgaXMgVVRGLTggd2hpY2ggYWx3YXlzIGV4aXN0cykuCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGV4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcGFyYW1WYWx1ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvdXRpbC9VUklFbmNvZGVyRGVjb2Rlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL3V0aWwvVVJJRW5jb2RlckRlY29kZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRmYzViNS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvdXRpbC9VUklFbmNvZGVyRGVjb2Rlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAudXRpbDsNCi0NCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07DQotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOw0KLQ0KLXB1YmxpYyBjbGFzcyBVUklFbmNvZGVyRGVjb2RlciB7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGlnaXRzID0gIjAxMjM0NTY3ODlBQkNERUYiOyAvLyROT04tTkxTLTEkDQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgZW5jb2RpbmcgPSAiVVRGOCI7IC8vJE5PTi1OTFMtMSQNCi0NCi0gICAgLyoqDQotICAgICAqIFZhbGlkYXRlIGEgc3RyaW5nIGJ5IGNoZWNraW5nIGlmIGl0IGNvbnRhaW5zIGFueSBjaGFyYWN0ZXJzIG90aGVyIHRoYW46DQotICAgICAqIDxwLz4NCi0gICAgICogMS4gbGV0dGVycyAoJ2EnLi4neicsICdBJy4uJ1onKSAyLiBudW1iZXJzICgnMCcuLic5JykgMy4gY2hhcmFjdGVycyBpbg0KLSAgICAgKiB0aGUgbGVnYWxzZXQgcGFyYW1ldGVyIDQuIG90aGVycyAoVW5pY29kZSBjaGFyYWN0ZXJzIHRoYXQgYXJlIG5vdCBpbg0KLSAgICAgKiBVUy1BU0NJSSBzZXQsIGFuZCBhcmUgbm90IElTTyBDb250cm9sIG9yIGFyZSBub3QgSVNPIFNwYWNlIGNoYXJhY3RlcnMpDQotICAgICAqIDxwLz4NCi0gICAgICogY2FsbGVkIGZyb20gVVJJLkhlbHBlci5wYXJzZVVSSSgpIHRvIHZhbGlkYXRlIGVhY2ggY29tcG9uZW50DQotICAgICAqIDxwLz4NCi0gICAgICoNCi0gICAgICogQHBhcmFtIHMgICAgIGphdmEubGFuZy5TdHJpbmcgdGhlIHN0cmluZyB0byBiZSB2YWxpZGF0ZWQNCi0gICAgICogQHBhcmFtIGxlZ2FsIGphdmEubGFuZy5TdHJpbmcgdGhlIGNoYXJhY3RlcnMgYWxsb3dlZCBpbiB0aGUgU3RyaW5nIHMNCi0gICAgICovDQotICAgIHN0YXRpYyB2b2lkIHZhbGlkYXRlKFN0cmluZyBzLCBTdHJpbmcgbGVnYWwpIHRocm93cyBVUklTeW50YXhFeGNlcHRpb24gew0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzLmxlbmd0aCgpOykgew0KLSAgICAgICAgICAgIGNoYXIgY2ggPSBzLmNoYXJBdChpKTsNCi0gICAgICAgICAgICBpZiAoY2ggPT0gJyUnKSB7DQotICAgICAgICAgICAgICAgIGRvIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChpICsgMiA+PSBzLmxlbmd0aCgpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVSSVN5bnRheEV4Y2VwdGlvbihzLCAiSW5jb21wbGV0ZSAlIHNlcXVlbmNlIik7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBpbnQgZDEgPSBDaGFyYWN0ZXIuZGlnaXQocy5jaGFyQXQoaSArIDEpLCAxNik7DQotICAgICAgICAgICAgICAgICAgICBpbnQgZDIgPSBDaGFyYWN0ZXIuZGlnaXQocy5jaGFyQXQoaSArIDIpLCAxNik7DQotICAgICAgICAgICAgICAgICAgICBpZiAoZDEgPT0gLTEgfHwgZDIgPT0gLTEpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVVJJU3ludGF4RXhjZXB0aW9uKHMsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCAlIHNlcXVlbmNlICIgKyBzLnN1YnN0cmluZyhpLCBpICsgMykNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgaSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgICAgICBpICs9IDM7DQotICAgICAgICAgICAgICAgIH0gd2hpbGUgKGkgPCBzLmxlbmd0aCgpICYmIHMuY2hhckF0KGkpID09ICclJyk7DQotDQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZiAoISgoY2ggPj0gJ2EnICYmIGNoIDw9ICd6JykgfHwgKGNoID49ICdBJyAmJiBjaCA8PSAnWicpDQotICAgICAgICAgICAgICAgICAgICB8fCAoY2ggPj0gJzAnICYmIGNoIDw9ICc5JykgfHwgbGVnYWwuaW5kZXhPZihjaCkgPiAtMSB8fCAoY2ggPiAxMjcNCi0gICAgICAgICAgICAgICAgICAgICYmICFDaGFyYWN0ZXIuaXNTcGFjZUNoYXIoY2gpICYmICFDaGFyYWN0ZXINCi0gICAgICAgICAgICAgICAgICAgIC5pc0lTT0NvbnRyb2woY2gpKSkpIHsNCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVSSVN5bnRheEV4Y2VwdGlvbihzLCAiSWxsZWdhbCBjaGFyYWN0ZXIiLCBpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaSsrOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHN0YXRpYyB2b2lkIHZhbGlkYXRlU2ltcGxlKFN0cmluZyBzLCBTdHJpbmcgbGVnYWwpDQotICAgICAgICAgICAgdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiB7DQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHMubGVuZ3RoKCk7KSB7DQotICAgICAgICAgICAgY2hhciBjaCA9IHMuY2hhckF0KGkpOw0KLSAgICAgICAgICAgIGlmICghKChjaCA+PSAnYScgJiYgY2ggPD0gJ3onKSB8fCAoY2ggPj0gJ0EnICYmIGNoIDw9ICdaJykNCi0gICAgICAgICAgICAgICAgICAgIHx8IChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKSB8fCBsZWdhbC5pbmRleE9mKGNoKSA+IC0xKSkgew0KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVVJJU3ludGF4RXhjZXB0aW9uKHMsICJJbGxlZ2FsIGNoYXJhY3RlciIsIGkpOyAvLyROT04tTkxTLTEkDQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGkrKzsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogQWxsIGNoYXJhY3RlcnMgZXhjZXB0IGxldHRlcnMgKCdhJy4uJ3onLCAnQScuLidaJykgYW5kIG51bWJlcnMgKCcwJy4uJzknKQ0KLSAgICAgKiBhbmQgbGVnYWwgY2hhcmFjdGVycyBhcmUgY29udmVydGVkIGludG8gdGhlaXIgaGV4aWRlY2ltYWwgdmFsdWUgcHJlcGVuZGVkDQotICAgICAqIGJ5ICclJy4NCi0gICAgICogPHAvPg0KLSAgICAgKiBGb3IgZXhhbXBsZTogJyMnIC0+ICUyMw0KLSAgICAgKiA8cC8+DQotICAgICAqIE90aGVyIGNoYXJhY3RlcnMsIHdoaWNoIGFyZSBVbmljb2RlIGNoYXJzIHRoYXQgYXJlIG5vdCBVUy1BU0NJSSwgYW5kIGFyZQ0KLSAgICAgKiBub3QgSVNPIENvbnRyb2wgb3IgYXJlIG5vdCBJU08gU3BhY2UgY2hhcnMsIGFyZSBwcmVzZXJ2ZWQuDQotICAgICAqIDxwLz4NCi0gICAgICogQ2FsbGVkIGZyb20gVVJJLnF1b3RlQ29tcG9uZW50KCkgKGZvciBtdWx0aXBsZSBhcmd1bWVudCBjb25zdHJ1Y3RvcnMpDQotICAgICAqIDxwLz4NCi0gICAgICoNCi0gICAgICogQHBhcmFtIHMgICAgIGphdmEubGFuZy5TdHJpbmcgdGhlIHN0cmluZyB0byBiZSBjb252ZXJ0ZWQNCi0gICAgICogQHBhcmFtIGxlZ2FsIGphdmEubGFuZy5TdHJpbmcgdGhlIGNoYXJhY3RlcnMgYWxsb3dlZCB0byBiZSBwcmVzZXJ2ZWQgaW4gdGhlDQotICAgICAqICAgICAgICAgICAgICBzdHJpbmcgcw0KLSAgICAgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcgdGhlIGNvbnZlcnRlZCBzdHJpbmcNCi0gICAgICovDQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHF1b3RlSWxsZWdhbChTdHJpbmcgcywgU3RyaW5nIGxlZ2FsKQ0KLSAgICAgICAgICAgIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsNCi0gICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7DQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHMubGVuZ3RoKCk7IGkrKykgew0KLSAgICAgICAgICAgIGNoYXIgY2ggPSBzLmNoYXJBdChpKTsNCi0gICAgICAgICAgICBpZiAoKGNoID49ICdhJyAmJiBjaCA8PSAneicpDQotICAgICAgICAgICAgICAgICAgICB8fCAoY2ggPj0gJ0EnICYmIGNoIDw9ICdaJykNCi0gICAgICAgICAgICAgICAgICAgIHx8IChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKQ0KLSAgICAgICAgICAgICAgICAgICAgfHwgbGVnYWwuaW5kZXhPZihjaCkgPiAtMSkgew0KLSAgICAgICAgICAgICAgICBidWYuYXBwZW5kKGNoKTsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBieXRlW10gYnl0ZXMgPSBuZXcgU3RyaW5nKG5ldyBjaGFyW117Y2h9KS5nZXRCeXRlcyhlbmNvZGluZyk7DQotICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgYnl0ZXMubGVuZ3RoOyBqKyspIHsNCi0gICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoJyUnKTsNCi0gICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoZGlnaXRzLmNoYXJBdCgoYnl0ZXNbal0gJiAweGYwKSA+PiA0KSk7DQotICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKGRpZ2l0cy5jaGFyQXQoYnl0ZXNbal0gJiAweGYpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogT3RoZXIgY2hhcmFjdGVycywgd2hpY2ggYXJlIFVuaWNvZGUgY2hhcnMgdGhhdCBhcmUgbm90IFVTLUFTQ0lJLCBhbmQgYXJlDQotICAgICAqIG5vdCBJU08gQ29udHJvbCBvciBhcmUgbm90IElTTyBTcGFjZSBjaGFycyBhcmUgbm90IHByZXNlcnZlZC4gVGhleSBhcmUNCi0gICAgICogY29udmVydGVkIGludG8gdGhlaXIgaGV4aWRlY2ltYWwgdmFsdWUgcHJlcGVuZGVkIGJ5ICclJy4NCi0gICAgICogPHAvPg0KLSAgICAgKiBGb3IgZXhhbXBsZTogRXVybyBjdXJyZW5jeSBzeW1ib2wgLT4gIiVFMiU4MiVBQyIuDQotICAgICAqIDxwLz4NCi0gICAgICogQ2FsbGVkIGZyb20gVVJJLnRvQVNDSUlTdHJpbmcoKQ0KLSAgICAgKiA8cC8+DQotICAgICAqDQotICAgICAqIEBwYXJhbSBzIGphdmEubGFuZy5TdHJpbmcgdGhlIHN0cmluZyB0byBiZSBjb252ZXJ0ZWQNCi0gICAgICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nIHRoZSBjb252ZXJ0ZWQgc3RyaW5nDQotICAgICAqLw0KLSAgICBzdGF0aWMgU3RyaW5nIGVuY29kZU90aGVycyhTdHJpbmcgcykgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gew0KLSAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsNCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcy5sZW5ndGgoKTsgaSsrKSB7DQotICAgICAgICAgICAgY2hhciBjaCA9IHMuY2hhckF0KGkpOw0KLSAgICAgICAgICAgIGlmIChjaCA8PSAxMjcpIHsNCi0gICAgICAgICAgICAgICAgYnVmLmFwcGVuZChjaCk7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgYnl0ZVtdIGJ5dGVzID0gbmV3IFN0cmluZyhuZXcgY2hhcltde2NofSkuZ2V0Qnl0ZXMoZW5jb2RpbmcpOw0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGJ5dGVzLmxlbmd0aDsgaisrKSB7DQotICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCclJyk7DQotICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKGRpZ2l0cy5jaGFyQXQoKGJ5dGVzW2pdICYgMHhmMCkgPj4gNCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZChkaWdpdHMuY2hhckF0KGJ5dGVzW2pdICYgMHhmKSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIERlY29kZXMgdGhlIHN0cmluZyBhcmd1bWVudCB3aGljaCBpcyBhc3N1bWVkIHRvIGJlIGVuY29kZWQgaW4gdGhlDQotICAgICAqIDxjb2RlPngtd3d3LWZvcm0tdXJsZW5jb2RlZDwvY29kZT4gTUlNRSBjb250ZW50IHR5cGUgdXNpbmcgdGhlIFVURi04DQotICAgICAqIGVuY29kaW5nIHNjaGVtZS4NCi0gICAgICogPHAvPg0KLSAgICAgKiAnJScgYW5kIHR3byBmb2xsb3dpbmcgaGV4IGRpZ2l0IGNoYXJhY3RlcnMgYXJlIGNvbnZlcnRlZCB0byB0aGUNCi0gICAgICogZXF1aXZhbGVudCBieXRlIHZhbHVlLiBBbGwgb3RoZXIgY2hhcmFjdGVycyBhcmUgcGFzc2VkIHRocm91Z2gNCi0gICAgICogdW5tb2RpZmllZC4NCi0gICAgICogPHAvPg0KLSAgICAgKiA8cC8+DQotICAgICAqIGUuZy4gIkElMjBCJTIwQyAlMjQlMjUiIC0+ICJBIEIgQyAkJSINCi0gICAgICogPHAvPg0KLSAgICAgKiBDYWxsZWQgZnJvbSBVUkkuZ2V0WFlaKCkgbWV0aG9kcw0KLSAgICAgKiA8cC8+DQotICAgICAqDQotICAgICAqIEBwYXJhbSBzIGphdmEubGFuZy5TdHJpbmcgVGhlIGVuY29kZWQgc3RyaW5nLg0KLSAgICAgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcgVGhlIGRlY29kZWQgdmVyc2lvbi4NCi0gICAgICovDQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlY29kZShTdHJpbmcgcykgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gew0KLQ0KLSAgICAgICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsNCi0gICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7DQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHMubGVuZ3RoKCk7KSB7DQotICAgICAgICAgICAgY2hhciBjID0gcy5jaGFyQXQoaSk7DQotICAgICAgICAgICAgaWYgKGMgPT0gJyUnKSB7DQotICAgICAgICAgICAgICAgIG91dC5yZXNldCgpOw0KLSAgICAgICAgICAgICAgICBkbyB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoaSArIDIgPj0gcy5sZW5ndGgoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkluY29tcGxldGUgJSBzZXF1ZW5jZSBhdCAiICsgaSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBpbnQgZDEgPSBDaGFyYWN0ZXIuZGlnaXQocy5jaGFyQXQoaSArIDEpLCAxNik7DQotICAgICAgICAgICAgICAgICAgICBpbnQgZDIgPSBDaGFyYWN0ZXIuZGlnaXQocy5jaGFyQXQoaSArIDIpLCAxNik7DQotICAgICAgICAgICAgICAgICAgICBpZiAoZDEgPT0gLTEgfHwgZDIgPT0gLTEpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgJSBzZXF1ZW5jZSIgKyBzLnN1YnN0cmluZyhpLCBpICsgMykgKyAiYXQgIiArDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKGkpKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIG91dC53cml0ZSgoYnl0ZSkgKChkMSA8PCA0KSArIGQyKSk7DQotICAgICAgICAgICAgICAgICAgICBpICs9IDM7DQotICAgICAgICAgICAgICAgIH0gd2hpbGUgKGkgPCBzLmxlbmd0aCgpICYmIHMuY2hhckF0KGkpID09ICclJyk7DQotICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQob3V0LnRvU3RyaW5nKGVuY29kaW5nKSk7DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKGMpOw0KLSAgICAgICAgICAgIGkrKzsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsNCi0gICAgfQ0KLQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvdXRpbC9VUkxUZW1wbGF0aW5nVXRpbC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL3V0aWwvVVJMVGVtcGxhdGluZ1V0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMTUzOS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvdXRpbC9VUkxUZW1wbGF0aW5nVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAudXRpbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uV1NETDIwRGVmYXVsdFZhbHVlSG9sZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLldTREwyQ29uc3RhbnRzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuV1NETDIwVXRpbDsNCi0NCi1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247DQotaW1wb3J0IGphdmEubmV0LlVSSTsNCi1pbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLm5ldC5VUkw7DQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCi0NCi0NCi0vKioNCi0gKiBUaGlzIHV0aWwgaXMgdXNlZCBvbiB0aGUgY2xpZW50IHNpZGUgZm9yIGNyZWF0aW5nIHRoZSBVUkwncyBmb3IgYWxsIHJlcXVlc3QgKFdTREwgMi4wIGFsbHdzIHRvDQotICogY2hhbmdlIHRoZSBVUkwncyBvZiBTT0FQIG1lc3NhZ2VzIHRvbykuIEl0IHJlc29sdmVzIFdTREwgMi4wIGh0dHBsb2NhdGlvbiBwcm9wZXJ0eSBhbmQgYWxzbw0KLSAqIGFwcGVuZCBwYXJhbWV0ZXJzIHRvIFVSTCdzIHdoZW4gbmVlZGVkLg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBVUkxUZW1wbGF0aW5nVXRpbCB7DQotDQotICAgIC8qKg0KLSAgICAgKiBBcHBlbmRzIFF1ZXJ5IHBhcmFtZXRlcnMgdG8gdGhlIFVSTA0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gbWVzc2FnZUNvbnRleHQgLSBUaGUgTWVzc2FnZUNvbnRleHQgb2YgdGhlIHJlcXVlc3QNCi0gICAgICogQHBhcmFtIHVybCAgICAgICAgICAgIC0gT3JpZ2luYWwgdXJsIHN0cmluZw0KLSAgICAgKiBAcmV0dXJuIFN0cmluZyBjb250YWluaW5nIHRoZSBhcHBlbmRlZCBxdWVyeSBwYXJhbWV0ZXJzDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIFVSTCBhcHBlbmRRdWVyeVBhcmFtZXRlcnMoTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQsIFVSTCB1cmwpIHRocm93cyBBeGlzRmF1bHQgew0KLQ0KLSAgICAgICAgU3RyaW5nIHVybFN0cmluZyA9IHVybC50b1N0cmluZygpOw0KLSAgICAgICAgT01FbGVtZW50IGZpcnN0RWxlbWVudDsNCi0gICAgICAgIFN0cmluZyBxdWVyeVBhcmFtZXRlclNlcGFyYXRvciA9IChTdHJpbmcpIG1lc3NhZ2VDb250ZXh0DQotICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eShXU0RMMkNvbnN0YW50cy5BVFRSX1dIVFRQX1FVRVJZX1BBUkFNRVRFUl9TRVBBUkFUT1IpOw0KLSAgICAgICAgLy8gSW4gY2FzZSBxdWVyeVBhcmFtZXRlclNlcGFyYXRvciBpcyBudWxsIHdlIGJldHRlciB1c2UgdGhlIGRlZmF1bHQgdmFsdWUNCi0NCi0gICAgICAgIGlmIChxdWVyeVBhcmFtZXRlclNlcGFyYXRvciA9PSBudWxsKSB7DQotICAgICAgICAgICAgcXVlcnlQYXJhbWV0ZXJTZXBhcmF0b3IgPSBXU0RMMjBEZWZhdWx0VmFsdWVIb2xkZXINCi0gICAgICAgICAgICAgICAgICAgIC5nZXREZWZhdWx0VmFsdWUoV1NETDJDb25zdGFudHMuQVRUUl9XSFRUUF9RVUVSWV9QQVJBTUVURVJfU0VQQVJBVE9SKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGZpcnN0RWxlbWVudCA9IG1lc3NhZ2VDb250ZXh0LmdldEVudmVsb3BlKCkuZ2V0Qm9keSgpLmdldEZpcnN0RWxlbWVudCgpOw0KLSAgICAgICAgU3RyaW5nIHBhcmFtcyA9ICIiOw0KLQ0KLSAgICAgICAgaWYgKGZpcnN0RWxlbWVudCAhPSBudWxsKSB7DQotICAgICAgICAgICAgSXRlcmF0b3IgaXRlciA9IGZpcnN0RWxlbWVudC5nZXRDaGlsZEVsZW1lbnRzKCk7DQotDQotICAgICAgICAgICAgU3RyaW5nIGxlZ2FsQ2hhcmFjdGVycyA9IFdTREwyQ29uc3RhbnRzLkxFR0FMX0NIQVJBQ1RFUlNfSU5fUVVFUlkucmVwbGFjZUFsbChxdWVyeVBhcmFtZXRlclNlcGFyYXRvciwgIiIpOw0KLQ0KLSAgICAgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgew0KLSAgICAgICAgICAgICAgICBPTUVsZW1lbnQgZWxlbWVudCA9IChPTUVsZW1lbnQpIGl0ZXIubmV4dCgpOw0KLSAgICAgICAgICAgICAgICB0cnkgew0KLSAgICAgICAgICAgICAgICAgICAgcGFyYW1zID0gcGFyYW1zICsgVVJJRW5jb2RlckRlY29kZXIucXVvdGVJbGxlZ2FsKGVsZW1lbnQuZ2V0TG9jYWxOYW1lKCksIGxlZ2FsQ2hhcmFjdGVycykgKyAiPSIgKyBVUklFbmNvZGVyRGVjb2Rlci5xdW90ZUlsbGVnYWwoZWxlbWVudC5nZXRUZXh0KCksIGxlZ2FsQ2hhcmFjdGVycykgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVBhcmFtZXRlclNlcGFyYXRvcjsNCi0gICAgICAgICAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBBeGlzRmF1bHQubWFrZUZhdWx0KGUpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKCEiIi5lcXVhbHMocGFyYW1zKSkgew0KLSAgICAgICAgICAgIGludCBpbmRleCA9IHVybFN0cmluZy5pbmRleE9mKCI/Iik7DQotICAgICAgICAgICAgaWYgKGluZGV4ID09IC0xKSB7DQotICAgICAgICAgICAgICAgIHVybFN0cmluZyA9IHVybFN0cmluZyArICI/IiArIHBhcmFtcy5zdWJzdHJpbmcoMCwgcGFyYW1zLmxlbmd0aCgpIC0gMSk7DQotICAgICAgICAgICAgfSBlbHNlIGlmIChpbmRleCA9PSB1cmxTdHJpbmcubGVuZ3RoKCkgLSAxKSB7DQotICAgICAgICAgICAgICAgIHVybFN0cmluZyA9IHVybFN0cmluZyArIHBhcmFtcy5zdWJzdHJpbmcoMCwgcGFyYW1zLmxlbmd0aCgpIC0gMSk7DQotDQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgdXJsU3RyaW5nID0gdXJsU3RyaW5nICsgcXVlcnlQYXJhbWV0ZXJTZXBhcmF0b3IgKyBwYXJhbXMuc3Vic3RyaW5nKDAsIHBhcmFtcy5sZW5ndGgoKSAtIDEpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICB0cnkgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFVSTCh1cmxTdHJpbmcpOw0KLSAgICAgICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgICAgIHRocm93IEF4aXNGYXVsdC5tYWtlRmF1bHQoZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHVybDsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogUmV0dXJucyB0aGUgdGVtcGxhdGVkIFVSTCBnaXZlbiB0aGUgb3JpZ2luYWwgVVJMDQotICAgICAqDQotICAgICAqIEBwYXJhbSB0YXJnZXRVUkwgICAgICAtIFRoZSBvcmlnaW5hbCBVUkwNCi0gICAgICogQHBhcmFtIG1lc3NhZ2VDb250ZXh0IC0gVGhlIE1lc3NhZ2VDb250ZXh0IG9mIHRoZSByZXF1ZXN0DQotICAgICAqIEBwYXJhbSBkZXRhY2ggICAgICAgICAtIEJvb2xlYW4gdmFsdWUgc3BlY2lmeWluZyB3aGV0aGVyIHRoZSBlbGVtZW50IHNob3VsZCBiZSBkZXRhY2hlZCBmcm9tIHRoZQ0KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgZW52ZWxvcC4gV2hlbiBzZXJpYWxpemluZyBkYXRhIGFzIGFwcGxpY2F0aW9uL3gtZm9ybS11cmxlbmNvZGVkIHdoYXQgZ29lcyBpbiB0aGUgYm9keSBpcyB0aGUNCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbmRlciBhbmQgdGhlcmVmb3JlIHdlIHNob3VsZCBkZXRhY2ggdGhlIGVsZW1lbnQgZnJvbSB0aGUgZW52ZWxvcC4NCi0gICAgICogQHJldHVybiBUaGUgdGVtcGxhdGVkIFVSTA0KLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdCAtIFRocm93biBpbiBjYXNlIGFuIGV4Y2VwdGlvbiBvY2N1cnMNCi0gICAgICovDQotICAgIHB1YmxpYyBzdGF0aWMgVVJMIGdldFRlbXBsYXRlZFVSTChVUkwgdGFyZ2V0VVJMLCBNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCwgYm9vbGVhbiBkZXRhY2gpDQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7DQotDQotICAgICAgICBTdHJpbmcgaHR0cExvY2F0aW9uID0gKFN0cmluZykgbWVzc2FnZUNvbnRleHQuZ2V0UHJvcGVydHkoV1NETDJDb25zdGFudHMuQVRUUl9XSFRUUF9MT0NBVElPTik7DQotDQotLy8gICAgICAgIFN0cmluZyB1cmxTdHJpbmcgPSB0YXJnZXRVUkwudG9TdHJpbmcoKTsNCi0gICAgICAgIGlmIChodHRwTG9jYXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgU3RyaW5nIHJlcGxhY2VkUXVlcnkgPSBodHRwTG9jYXRpb247DQotICAgICAgICBpbnQgc2VwYXJhdG9yID0gaHR0cExvY2F0aW9uLmluZGV4T2YoJ3snKTsNCi0gICAgICAgICAgICB0cnkgew0KLQ0KLSAgICAgICAgaWYgKHNlcGFyYXRvciA+IC0xKSB7DQotICAgICAgICAgICAgcmVwbGFjZWRRdWVyeSA9IFVSSUVuY29kZXJEZWNvZGVyLnF1b3RlSWxsZWdhbCgNCi0gICAgICAgICAgICAgICAgICAgIFdTREwyMFV0aWwuYXBwbHlVUklUZW1wbGF0aW5nKG1lc3NhZ2VDb250ZXh0LCBodHRwTG9jYXRpb24sIGRldGFjaCksDQotICAgICAgICAgICAgICAgICAgICBXU0RMMkNvbnN0YW50cy5MRUdBTF9DSEFSQUNURVJTX0lOX1VSTCk7DQotDQotICAgICAgICB9DQotICAgICAgICAgICAgICAgIFVSSSB0YXJnZXRVUkk7DQotICAgICAgICAgICAgICAgIFVSSSBhcHBlbmRlZFVSSTsNCi0gICAgICAgICAgICAgICAgaWYgKHJlcGxhY2VkUXVlcnkuY2hhckF0KDApID09ICc/Jykgew0KLSAgICAgICAgICAgICAgICAgICAgYXBwZW5kZWRVUkkgPSBuZXcgVVJJKHRhcmdldFVSTC50b1N0cmluZyAoKSArIHJlcGxhY2VkUXVlcnkpOw0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB1cmlTdHJpbmcgPSB0YXJnZXRVUkwudG9TdHJpbmcoKTsNCi0gICAgICAgICAgICAgICAgICAgIGlmICghdXJpU3RyaW5nLmVuZHNXaXRoKCIvIikpIHsNCi0gICAgICAgICAgICAgICAgICAgIHRhcmdldFVSSSA9IG5ldyBVUkkodXJpU3RyaW5nICsgIi8iKTsNCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0VVJJID0gbmV3IFVSSSh1cmlTdHJpbmcpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgYXBwZW5kZWRVUkkgPSB0YXJnZXRVUkkucmVzb2x2ZShyZXBsYWNlZFF1ZXJ5KTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgdGFyZ2V0VVJMID0gYXBwZW5kZWRVUkkudG9VUkwoKTsNCi0NCi0gICAgICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJBbiBlcnJvciBvY2N1cmVkIHdoaWxlIHRyeWluZyB0byBjcmVhdGUgcmVxdWVzdCBVUkwiKTsNCi0gICAgICAgICAgICB9IGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJBbiBlcnJvciBvY2N1cmVkIHdoaWxlIHRyeWluZyB0byBjcmVhdGUgcmVxdWVzdCBVUkwiKTsNCi0gICAgICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiQW4gZXJyb3Igb2NjdXJlZCB3aGlsZSB0cnlpbmcgdG8gY3JlYXRlIHJlcXVlc3QgVVJMIik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHRhcmdldFVSTDsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdXRpbC9BeGlzUG9saWN5TG9jYXRvci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvQXhpc1BvbGljeUxvY2F0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM3YzNkZC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdXRpbC9BeGlzUG9saWN5TG9jYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi51dGlsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzQmluZGluZzsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNCaW5kaW5nTWVzc2FnZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNCaW5kaW5nT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc0Rlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc0VuZHBvaW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc01lc3NhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZUdyb3VwOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUG9saWN5SW5jbHVkZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlBvbGljeVN1YmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0NvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5uZWV0aGkuUG9saWN5OwotaW1wb3J0IG9yZy5hcGFjaGUubmVldGhpLlBvbGljeUNvbXBvbmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLm5lZXRoaS5Qb2xpY3lSZWdpc3RyeTsKLQotcHVibGljIGNsYXNzIEF4aXNQb2xpY3lMb2NhdG9yIGltcGxlbWVudHMgUG9saWN5UmVnaXN0cnkgewotCi0gICAgQXhpc0Rlc2NyaXB0aW9uIHN1YmplY3QgPSBudWxsOwotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIHNob3J0IEFYSVNfQklORElOR19NRVNTQUdFID0gMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBzaG9ydCBBWElTX01FU1NBR0UgPSAyOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIHNob3J0IEFYSVNfQklORElOR19PUEVSQVRJT04gPSAzOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIHNob3J0IEFYSVNfT1BFUkFUSU9OID0gNDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBzaG9ydCBBWElTX0JJTkRJTkcgPSA1OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIHNob3J0IEFYSVNfRU5EUE9JTlQgPSA2OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIHNob3J0IEFYSVNfU0VSVklDRSA9IDc7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgc2hvcnQgQVhJU19TRVJWSUNFX0dST1VQID0gODsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBzaG9ydCBBWElTX0NPTkZJR1VSQVRJT04gPSA5OwotICAgIAotICAgIAotICAgIAotICAgIHB1YmxpYyBBeGlzUG9saWN5TG9jYXRvcihBeGlzRGVzY3JpcHRpb24gc3ViamVjdCkgewotICAgICAgICB0aGlzLnN1YmplY3QgPSBzdWJqZWN0OwotICAgIH0KLQotICAgIHB1YmxpYyBQb2xpY3kgbG9va3VwKFN0cmluZyBrZXkpIHsKLSAgICAgICAgaWYgKHN1YmplY3QgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIFBvbGljeSBwb2xpY3kgPSBudWxsOwotICAgICAgICAKLSAgICAgICAgUG9saWN5U3ViamVjdCBwb2xpY3lTdWJqZWN0ID0gc3ViamVjdC5nZXRQb2xpY3lTdWJqZWN0KCk7Ci0JCVBvbGljeUNvbXBvbmVudCBhdHRhY2hlZFBvbGljeUNvbXBvbmVudCA9IHBvbGljeVN1YmplY3QKLQkJCQkuZ2V0QXR0YWNoZWRQb2xpY3lDb21wb25lbnQoa2V5KTsKLQotCQlpZiAoYXR0YWNoZWRQb2xpY3lDb21wb25lbnQgIT0gbnVsbAotCQkJCSYmIGF0dGFjaGVkUG9saWN5Q29tcG9uZW50IGluc3RhbmNlb2YgUG9saWN5KSB7Ci0JCQlwb2xpY3kgPSAoUG9saWN5KSBhdHRhY2hlZFBvbGljeUNvbXBvbmVudDsKLQkJCWlmIChwb2xpY3kgIT0gbnVsbCkgewotCQkJCXJldHVybiBwb2xpY3k7Ci0JCQl9Ci0JCX0KLQkJCi0gICAgICAgIAotCQlpZiAoc3ViamVjdCBpbnN0YW5jZW9mIEF4aXNTZXJ2aWNlKSB7Ci0JCQlwb2xpY3kgPSAoKEF4aXNTZXJ2aWNlKSBzdWJqZWN0KS5sb29rdXBQb2xpY3koa2V5KTsKLQkJCWlmIChwb2xpY3kgIT0gbnVsbCkgewotCQkJCXJldHVybiBwb2xpY3k7Ci0JCQl9Ci0JCX0KLQkJCi0gICAgICAgIAotICAgICAgICBzaG9ydCB0eXBlID0gZ2V0VHlwZShzdWJqZWN0KTsKLSAgICAgICAgCi0gICAgICAgIC8qCi0gICAgICAgICAqIHByb2Nlc3NpbmcgdGhlIHBhcmFsbGVsIGxldmVsCi0gICAgICAgICAqLwotICAgICAgICBBeGlzRGVzY3JpcHRpb24gcGFyYWxsZWxMZXZlbCA9IG51bGw7Ci0gICAgICAgIAotICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICAgICAgY2FzZSBBWElTX0JJTkRJTkdfTUVTU0FHRToKLSAgICAgICAgICAgIHBhcmFsbGVsTGV2ZWwgPSAoKEF4aXNCaW5kaW5nTWVzc2FnZSkgc3ViamVjdCkuZ2V0QXhpc01lc3NhZ2UoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEFYSVNfQklORElOR19PUEVSQVRJT046Ci0gICAgICAgICAgICBwYXJhbGxlbExldmVsID0gKChBeGlzQmluZGluZ09wZXJhdGlvbikgc3ViamVjdCkuZ2V0QXhpc09wZXJhdGlvbigpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKHBhcmFsbGVsTGV2ZWwgIT0gbnVsbCkgewotICAgICAgICAgICAgcG9saWN5ID0gKG5ldyBBeGlzUG9saWN5TG9jYXRvcihwYXJhbGxlbExldmVsKSkubG9va3VwKGtleSk7Ci0gICAgICAgICAgICBpZiAocG9saWN5ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcG9saWN5OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBBeGlzRGVzY3JpcHRpb24gdXBwZXJMZXZlbCA9IGdldFVwcGVyTGV2ZWwodHlwZSwgc3ViamVjdCk7Ci0gICAgICAgIGlmICh1cHBlckxldmVsICE9IG51bGwpIHsKLSAgICAgICAgICAgIHBvbGljeSA9IChuZXcgQXhpc1BvbGljeUxvY2F0b3IodXBwZXJMZXZlbCkpLmxvb2t1cChrZXkpOwotICAgICAgICAgICAgcmV0dXJuIHBvbGljeTsKLSAgICAgICAgfSAgICAgICAgICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCByZWdpc3RlcihTdHJpbmcga2V5LCBQb2xpY3kgcG9saWN5KSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZShTdHJpbmcga2V5KSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KLSAgICAKLSAgICAKLSAgICAKLSAgICBwcml2YXRlIEF4aXNEZXNjcmlwdGlvbiBnZXRVcHBlckxldmVsKHNob3J0IHR5cGUsIEF4aXNEZXNjcmlwdGlvbiB0aGlzTGV2ZWwpIHsKLSAgICAgICAgCi0gICAgICAgIHN3aXRjaCAodHlwZSkgewotICAgICAgICBjYXNlIEFYSVNfQklORElOR19NRVNTQUdFOgotICAgICAgICAgICAgcmV0dXJuICgoQXhpc0JpbmRpbmdNZXNzYWdlKSB0aGlzTGV2ZWwpLmdldEF4aXNCaW5kaW5nT3BlcmF0aW9uKCk7Ci0gICAgICAgIGNhc2UgQVhJU19CSU5ESU5HX09QRVJBVElPTjoKLSAgICAgICAgICAgIHJldHVybiAoKEF4aXNCaW5kaW5nT3BlcmF0aW9uKSB0aGlzTGV2ZWwpLmdldEF4aXNCaW5kaW5nKCk7Ci0gICAgICAgIGNhc2UgQVhJU19CSU5ESU5HOgotICAgICAgICAgICAgcmV0dXJuICgoQXhpc0JpbmRpbmcpIHRoaXNMZXZlbCkuZ2V0QXhpc0VuZHBvaW50KCk7Ci0gICAgICAgIGNhc2UgQVhJU19FTkRQT0lOVDoKLSAgICAgICAgICAgIHJldHVybiAoKEF4aXNFbmRwb2ludCkgdGhpc0xldmVsKS5nZXRBeGlzU2VydmljZSgpOwotICAgICAgICBjYXNlIEFYSVNfTUVTU0FHRToKLSAgICAgICAgCXJldHVybiAoKEF4aXNNZXNzYWdlKSB0aGlzTGV2ZWwpLmdldEF4aXNPcGVyYXRpb24oKTsKLSAgICAgICAgY2FzZSBBWElTX09QRVJBVElPTjoKLSAgICAgICAgCXJldHVybiAoKEF4aXNPcGVyYXRpb24pIHRoaXNMZXZlbCkuZ2V0QXhpc1NlcnZpY2UoKTsKLSAgICAgICAgY2FzZSBBWElTX1NFUlZJQ0U6Ci0gICAgICAgICAgICByZXR1cm4gKChBeGlzU2VydmljZSkgdGhpc0xldmVsKS5nZXRBeGlzU2VydmljZUdyb3VwKCk7Ci0gICAgICAgIGNhc2UgQVhJU19TRVJWSUNFX0dST1VQOgotICAgICAgICAgICAgcmV0dXJuICgoQXhpc1NlcnZpY2VHcm91cCkgdGhpc0xldmVsKS5nZXRBeGlzQ29uZmlndXJhdGlvbigpOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzaG9ydCBnZXRUeXBlKEF4aXNEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgewotICAgICAgICAKLSAgICAgICAgaWYgKGRlc2NyaXB0aW9uIGluc3RhbmNlb2YgQXhpc0JpbmRpbmdNZXNzYWdlKSB7Ci0gICAgICAgICAgICByZXR1cm4gQVhJU19CSU5ESU5HX01FU1NBR0U7Ci0gICAgICAgIH0gZWxzZSBpZiAoZGVzY3JpcHRpb24gaW5zdGFuY2VvZiBBeGlzTWVzc2FnZSkgewotICAgICAgICAgICAgcmV0dXJuIEFYSVNfTUVTU0FHRTsKLSAgICAgICAgfSBlbHNlIGlmIChkZXNjcmlwdGlvbiBpbnN0YW5jZW9mIEF4aXNCaW5kaW5nT3BlcmF0aW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gQVhJU19CSU5ESU5HX09QRVJBVElPTjsKLSAgICAgICAgfSBlbHNlIGlmIChkZXNjcmlwdGlvbiBpbnN0YW5jZW9mIEF4aXNPcGVyYXRpb24pIHsKLSAgICAgICAgICAgIHJldHVybiBBWElTX09QRVJBVElPTjsKLSAgICAgICAgfSBlbHNlIGlmIChkZXNjcmlwdGlvbiBpbnN0YW5jZW9mIEF4aXNCaW5kaW5nKSB7Ci0gICAgICAgICAgICByZXR1cm4gQVhJU19CSU5ESU5HOwotICAgICAgICB9IGVsc2UgaWYgKGRlc2NyaXB0aW9uIGluc3RhbmNlb2YgQXhpc0VuZHBvaW50KSB7Ci0gICAgICAgICAgICByZXR1cm4gQVhJU19FTkRQT0lOVDsKLSAgICAgICAgfSBlbHNlIGlmIChkZXNjcmlwdGlvbiBpbnN0YW5jZW9mIEF4aXNTZXJ2aWNlKSB7Ci0gICAgICAgICAgICByZXR1cm4gQVhJU19TRVJWSUNFOwotICAgICAgICB9IGVsc2UgaWYgKGRlc2NyaXB0aW9uIGluc3RhbmNlb2YgQXhpc1NlcnZpY2VHcm91cCkgewotICAgICAgICAgICAgcmV0dXJuIEFYSVNfU0VSVklDRV9HUk9VUDsKLSAgICAgICAgfSBlbHNlIGlmIChkZXNjcmlwdGlvbiBpbnN0YW5jZW9mIEF4aXNDb25maWd1cmF0aW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gQVhJU19DT05GSUdVUkFUSU9OOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIAotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi91dGlsL0Jhc2U2NC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvQmFzZTY0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkMjMwMDIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvQmFzZTY0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudXRpbDsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQmFzZTY0IGV4dGVuZHMgb3JnLmFwYWNoZS5heGlvbS5vbS51dGlsLkJhc2U2NCB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvQ2FsbGJhY2tSZWNlaXZlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvQ2FsbGJhY2tSZWNlaXZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjAxZmJiLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi91dGlsL0NhbGxiYWNrUmVjZWl2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudXRpbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLlJlbGF0ZXNUbzsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5hc3luYy5Bc3luY1Jlc3VsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5hc3luYy5BeGlzQ2FsbGJhY2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuYXN5bmMuQ2FsbGJhY2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5PcGVyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLk1lc3NhZ2VSZWNlaXZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudEhhc2hNYXA7Ci0KLS8qKgotICogVGhpcyBpcyBhIE1lc3NhZ2VSZWNlaXZlciB3aGljaCBpcyB1c2VkIG9uIHRoZSBjbGllbnQgc2lkZSB0byBhY2NlcHQgdGhlCi0gKiBtZXNzYWdlcyAocmVzcG9uc2UpIHRoYXQgY29tZSB0byB0aGUgY2xpZW50LiBUaGlzIGNvcnJlbGF0ZXMgdGhlIGluY29taW5nIG1lc3NhZ2UgdG8KLSAqIHRoZSByZWxhdGVkIG1lc3NhZ2VzIGFuZCBtYWtlcyBhIGNhbGwgdG8gdGhlIGFwcHJvcHJpYXRlIGNhbGxiYWNrLgotICovCi1wdWJsaWMgY2xhc3MgQ2FsbGJhY2tSZWNlaXZlciBpbXBsZW1lbnRzIE1lc3NhZ2VSZWNlaXZlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coQ2FsbGJhY2tSZWNlaXZlci5jbGFzcyk7Ci0JCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgU0VSVklDRV9OQU1FID0gIkNsaWVudFNlcnZpY2UiOwotICAgIHByaXZhdGUgQ29uY3VycmVudEhhc2hNYXAgY2FsbGJhY2tTdG9yZTsKLQotICAgIHB1YmxpYyBDYWxsYmFja1JlY2VpdmVyKCkgewotICAgICAgICBjYWxsYmFja1N0b3JlID0gbmV3IENvbmN1cnJlbnRIYXNoTWFwKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkQ2FsbGJhY2soU3RyaW5nIG1zZ0lELCBDYWxsYmFjayBjYWxsYmFjaykgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgCXB1dElmQWJzZW50KG1zZ0lELCBjYWxsYmFjayk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkQ2FsbGJhY2soU3RyaW5nIG1zZ0lELCBBeGlzQ2FsbGJhY2sgY2FsbGJhY2spIHRocm93cyBBeGlzRmF1bHQgewotICAgIAlwdXRJZkFic2VudChtc2dJRCwgY2FsbGJhY2spOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBJbnNlcnRzIHRoZSBzcGVjaWZpZWQga2V5LCB2YWx1ZSBpbnRvIHRoZSBjYWxsYmFjayBtYXAuIEl0IHRocm93cyBhbgotICAgICAqIGV4Y2VwdGlvbiBpZiB0aGUgbWVzc2FnZSBpZCB3YXMgYSBkdXBsaWNhdGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1zZ0lEIFRoZSBtZXNzYWdlIGlkLgotICAgICAqIEBwYXJhbSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgb2JqZWN0LgotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0IElmIHRoZSBtZXNzYWdlIGlkIHdhcyBhIGR1cGxpY2F0ZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcHV0SWZBYnNlbnQoU3RyaW5nIG1zZ0lELCBPYmplY3QgY2FsbGJhY2spIHRocm93cyBBeGlzRmF1bHQgewotICAgIAlpZiAoY2FsbGJhY2tTdG9yZS5wdXRJZkFic2VudChtc2dJRCwgY2FsbGJhY2spID09IG51bGwpIHsKLSAgICAJCWlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ2FsbGJhY2tSZWNlaXZlcjogYWRkIGNhbGxiYWNrICIgKyBtc2dJRCArICIsICIgKyBjYWxsYmFjayArICIgLCIgKyB0aGlzKTsKLSAgICAgICAgICAgIH0KLSAgICAJfSBlbHNlIHsKLSAgICAJCXRocm93IG5ldyBBeGlzRmF1bHQoIlRoZSBDYWxsYmFjayBmb3IgTWVzc2FnZUlEICIgKyBtc2dJRCArICIgaXMgYSBkdXBsaWNhdGUiKTsKLSAgICAJfQotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgbG9va3VwQ2FsbGJhY2soU3RyaW5nIG1zZ0lEKSB7Ci0JCU9iamVjdCBvID0gY2FsbGJhY2tTdG9yZS5yZW1vdmUobXNnSUQpOwotCQlpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIGxvZy5kZWJ1ZygiQ2FsbGJhY2tSZWNlaXZlcjogbG9va3VwIGNhbGxiYWNrICIgKyBtc2dJRCArICIsICIgKyBvICsgIiAsIiArIHRoaXMpOwotICAgICAgICByZXR1cm4gbzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZWNlaXZlKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBSZWxhdGVzVG8gcmVsYXRlc1RPID0gbXNnQ29udGV4dC5nZXRPcHRpb25zKCkuZ2V0UmVsYXRlc1RvKCk7Ci0gICAgICAgIGlmIChyZWxhdGVzVE8gPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiQ2Fubm90IGlkZW50aWZ5IGNvcnJlY3QgQ2FsbGJhY2sgb2JqZWN0LiBSZWxhdGVzVG8gaXMgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZyBtZXNzYWdlSUQgPSByZWxhdGVzVE8uZ2V0VmFsdWUoKTsKLQotICAgICAgICBPYmplY3QgY2FsbGJhY2tPYmogPSBjYWxsYmFja1N0b3JlLnJlbW92ZShtZXNzYWdlSUQpOwotCQlpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIGxvZy5kZWJ1ZygiQ2FsbGJhY2tSZWNlaXZlcjogcmVjZWl2ZSBmb3VuZCBjYWxsYmFjayAiICsgY2FsbGJhY2tPYmogKyAiLCAiICsgbWVzc2FnZUlEICsgIiwgIiArIHRoaXMgKyAiLCAiICsgbXNnQ29udGV4dC5nZXRBeGlzT3BlcmF0aW9uKCkpOwotCi0gICAgICAgIGlmIChjYWxsYmFja09iaiA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJUaGUgQ2FsbGJhY2sgZm9yIE1lc3NhZ2VJRCAiICsgbWVzc2FnZUlEICsgIiB3YXMgbm90IGZvdW5kIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY2FsbGJhY2tPYmogaW5zdGFuY2VvZiBBeGlzQ2FsbGJhY2spIHsKLSAgICAgICAgICAgIEF4aXNDYWxsYmFjayBheGlzQ2FsbGJhY2sgPSAoQXhpc0NhbGxiYWNrKWNhbGxiYWNrT2JqOwotICAgICAgICAgICAgaWYgKG1zZ0NvbnRleHQuaXNGYXVsdCgpKSB7Ci0gICAgICAgICAgICAgICAgYXhpc0NhbGxiYWNrLm9uRmF1bHQobXNnQ29udGV4dCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGF4aXNDYWxsYmFjay5vbk1lc3NhZ2UobXNnQ29udGV4dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBFaXRoZXIgd2F5IHdlJ3JlIGRvbmUuCi0gICAgICAgICAgICBheGlzQ2FsbGJhY2sub25Db21wbGV0ZSgpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVEhJUyBORVhUIFBBUlQgV0lMTCBFVkVOVFVBTExZIEdPIEFXQVkgV0hFTiBDYWxsYmFjayBET0VTCi0KLSAgICAgICAgLy8gT0ssIHRoaXMgbXVzdCBiZSBhbiBvbGQtc3R5bGUgQ2FsbGJhY2sKLSAgICAgICAgQ2FsbGJhY2sgY2FsbGJhY2sgPSAoQ2FsbGJhY2spY2FsbGJhY2tPYmo7Ci0gICAgICAgIEFzeW5jUmVzdWx0IHJlc3VsdCA9IG5ldyBBc3luY1Jlc3VsdChtc2dDb250ZXh0KTsKLQotICAgICAgICAvLyBjaGVjayB3aGV0aGVyIHRoZSByZXN1bHQgaXMgYSBmYXVsdC4KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNPQVBFbnZlbG9wZSBlbnZlbG9wZSA9IHJlc3VsdC5nZXRSZXNwb25zZUVudmVsb3BlKCk7Ci0KLSAgICAgICAgICAgIE9wZXJhdGlvbkNvbnRleHQgb3BDb250ZXh0ID0gbXNnQ29udGV4dC5nZXRPcGVyYXRpb25Db250ZXh0KCk7Ci0gICAgICAgICAgICBpZiAob3BDb250ZXh0ICE9IG51bGwgJiYgIW9wQ29udGV4dC5pc0NvbXBsZXRlKCkpIHsKLSAgICAgICAgICAgICAgICBvcENvbnRleHQuYWRkTWVzc2FnZUNvbnRleHQobXNnQ29udGV4dCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChlbnZlbG9wZS5oYXNGYXVsdCgpKSB7Ci0gICAgICAgICAgICAgICAgQXhpc0ZhdWx0IGF4aXNGYXVsdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBVdGlscy5nZXRJbmJvdW5kRmF1bHRGcm9tTWVzc2FnZUNvbnRleHQobXNnQ29udGV4dCk7Ci0gICAgICAgICAgICAgICAgY2FsbGJhY2sub25FcnJvcihheGlzRmF1bHQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBjYWxsYmFjay5vbkNvbXBsZXRlKHJlc3VsdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBjYWxsYmFjay5vbkVycm9yKGUpOwotICAgICAgICB9ICBmaW5hbGx5IHsKLSAgICAgICAgICAgIGNhbGxiYWNrLnNldENvbXBsZXRlKHRydWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy90byBnZXQgdGhlIHBlbmRpbmcgcmVxdWVzdAotICAgIHB1YmxpYyBNYXAgZ2V0Q2FsbGJhY2tTdG9yZSgpIHsKLSAgICAgICAgcmV0dXJuIGNhbGxiYWNrU3RvcmU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvQ29tbWFuZExpbmVPcHRpb24uamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi91dGlsL0NvbW1hbmRMaW5lT3B0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmNTBkYjguLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvQ29tbWFuZExpbmVPcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotcHVibGljIGNsYXNzIENvbW1hbmRMaW5lT3B0aW9uIGltcGxlbWVudHMgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMgewotCi0gICAgcHJpdmF0ZSBTdHJpbmcgdHlwZTsKLSAgICBwcml2YXRlIEFycmF5TGlzdCBvcHRpb25WYWx1ZXM7Ci0KLSAgICBwdWJsaWMgQ29tbWFuZExpbmVPcHRpb24oU3RyaW5nIHR5cGUsIFN0cmluZ1tdIHZhbHVlcykgewotICAgICAgICBzZXRPcHRpb25UeXBlKHR5cGUpOwotICAgICAgICBBcnJheUxpc3QgYXJyYXlMaXN0ID0gbmV3IEFycmF5TGlzdCh2YWx1ZXMubGVuZ3RoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGFycmF5TGlzdC5hZGQodmFsdWVzW2ldKTsKLSAgICAgICAgfQotICAgICAgICB0aGlzLm9wdGlvblZhbHVlcyA9IGFycmF5TGlzdDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2V0T3B0aW9uVHlwZShTdHJpbmcgdHlwZSkgewotICAgICAgICAvL2NhdGVyIGZvciB0aGUgbG9uZyBvcHRpb25zIGZpcnN0Ci0gICAgICAgIGlmICh0eXBlLnN0YXJ0c1dpdGgoIi0tIikpIHsKLSAgICAgICAgICAgIHR5cGUgPSB0eXBlLnJlcGxhY2VGaXJzdCgiLS0iLCAiIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHR5cGUuc3RhcnRzV2l0aCgiLSIpKSB7Ci0gICAgICAgICAgICB0eXBlID0gdHlwZS5yZXBsYWNlRmlyc3QoIi0iLCAiIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvL3dlIGRvIG5vdCBjaGFuZ2UgdGhlIGNhc2Ugb2YgdGhlIG9wdGlvbiEKLQotICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSB0eXBlCi0gICAgICovCi0gICAgcHVibGljIENvbW1hbmRMaW5lT3B0aW9uKFN0cmluZyB0eXBlLCBBcnJheUxpc3QgdmFsdWVzKSB7Ci0gICAgICAgIHNldE9wdGlvblR5cGUodHlwZSk7Ci0KLSAgICAgICAgaWYgKG51bGwgIT0gdmFsdWVzKSB7Ci0gICAgICAgICAgICB0aGlzLm9wdGlvblZhbHVlcyA9IHZhbHVlczsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBSZXR1cm5zIHRoZSB0eXBlLgotICAgICAqIEBzZWUgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE9wdGlvblR5cGUoKSB7Ci0gICAgICAgIHJldHVybiB0eXBlOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBvcHRpb25WYWx1ZXMuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRPcHRpb25WYWx1ZSgpIHsKLSAgICAgICAgaWYgKChvcHRpb25WYWx1ZXMgIT0gbnVsbCkgJiYgKG9wdGlvblZhbHVlcy5zaXplKCkgPiAwKSkgewotICAgICAgICAgICAgcmV0dXJuIChTdHJpbmcpIG9wdGlvblZhbHVlcy5nZXQoMCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBvcHRpb25WYWx1ZXMuCi0gICAgICovCi0gICAgcHVibGljIEFycmF5TGlzdCBnZXRPcHRpb25WYWx1ZXMoKSB7Ci0gICAgICAgIHJldHVybiBvcHRpb25WYWx1ZXM7Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi91dGlsL0NvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdXRpbC9Db21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODZjNmNmLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi91dGlsL0NvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnV0aWw7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMgewotCi0gICAgaW50ZXJmYWNlIFdTREwySmF2YUNvbnN0YW50cyB7Ci0gICAgICAgIFN0cmluZyBBbGxfUE9SVFNfT1BUSU9OID0gImFwIjsKLSAgICAgICAgU3RyaW5nIEFsbF9QT1JUU19PUFRJT05fTE9ORyA9ICJhbGwtcG9ydHMiOwotICAgICAgICBTdHJpbmcgQkFDS1dPUkRfQ09NUEFUSUJJTElUWV9PUFRJT04gPSAiYiI7Ci0gICAgICAgIFN0cmluZyBCQUNLV09SRF9DT01QQVRJQklMSVRZX09QVElPTl9MT05HID0gImJhY2t3b3JkLWNvbXBhdGlibGUiOwotICAgICAgICBTdHJpbmcgQ09ERUdFTl9BU1lOQ19PTkxZX09QVElPTiA9ICJhIjsKLSAgICAgICAgU3RyaW5nIENPREVHRU5fQVNZTkNfT05MWV9PUFRJT05fTE9ORyA9ICJhc3luYyI7Ci0gICAgICAgIFN0cmluZyBDT0RFR0VOX1NZTkNfT05MWV9PUFRJT04gPSAicyI7Ci0gICAgICAgIFN0cmluZyBDT0RFR0VOX1NZTkNfT05MWV9PUFRJT05fTE9ORyA9ICJzeW5jIjsKLSAgICAgICAgU3RyaW5nIERBVEFfQklORElOR19UWVBFX09QVElPTiA9ICJkIjsKLSAgICAgICAgU3RyaW5nIERBVEFfQklORElOR19UWVBFX09QVElPTl9MT05HID0gImRhdGFiaW5kaW5nLW1ldGhvZCI7Ci0gICAgICAgIFN0cmluZyBFWFRFUk5BTF9NQVBQSU5HX09QVElPTiA9ICJlbSI7Ci0gICAgICAgIFN0cmluZyBFWFRFUk5BTF9NQVBQSU5HX09QVElPTl9MT05HID0gImV4dGVybmFsLW1hcHBpbmciOwotICAgICAgICBTdHJpbmcgRkxBVFRFTl9GSUxFU19PUFRJT04gPSAiZiI7Ci0gICAgICAgIFN0cmluZyBGTEFUVEVOX0ZJTEVTX09QVElPTl9MT05HID0gImZsYXR0ZW4tZmlsZXMiOwotICAgICAgICBTdHJpbmcgR0VORVJBVEVfQUxMX09QVElPTiA9ICJnIjsKLSAgICAgICAgU3RyaW5nIEdFTkVSQVRFX0FMTF9PUFRJT05fTE9ORyA9ICJnZW5lcmF0ZS1hbGwiOwotICAgICAgICBTdHJpbmcgR0VORVJBVEVfU0VSVklDRV9ERVNDUklQVElPTl9PUFRJT04gPSAic2QiOwotICAgICAgICBTdHJpbmcgR0VORVJBVEVfU0VSVklDRV9ERVNDUklQVElPTl9PUFRJT05fTE9ORyA9ICJzZXJ2aWNlLWRlc2NyaXB0aW9uIjsKLSAgICAgICAgU3RyaW5nIEdFTkVSQVRFX1RFU1RfQ0FTRV9PUFRJT04gPSAidCI7Ci0gICAgICAgIFN0cmluZyBHRU5FUkFURV9URVNUX0NBU0VfT1BUSU9OX0xPTkcgPSAidGVzdC1jYXNlIjsKLSAgICAgICAgU3RyaW5nIE5BTUVfU1BBQ0VfVE9fUEFDS0FHRV9PUFRJT04gPSAibnMycCI7Ci0gICAgICAgIFN0cmluZyBOQU1FX1NQQUNFX1RPX1BBQ0tBR0VfT1BUSU9OX0xPTkcgPSAibmFtZXNwYWNlMnBhY2thZ2UiOwotICAgICAgICBTdHJpbmcgTk9fQlVJTERfWE1MX09QVElPTl9MT05HID0gIm5vQnVpbGRYTUwiOwotICAgICAgICBTdHJpbmcgTk9fTUVTU0FHRV9SRUNFSVZFUl9PUFRJT05fTE9ORyA9ICJub01lc3NhZ2VSZWNlaXZlciI7Ci0gICAgICAgIFN0cmluZyBOT19XU0RMU19PUFRJT05fTE9ORyA9ICJub1dTREwiOwotICAgICAgICBTdHJpbmcgT1VUUFVUX0xPQ0FUSU9OX09QVElPTiA9ICJvIjsKLSAgICAgICAgU3RyaW5nIE9VVFBVVF9MT0NBVElPTl9PUFRJT05fTE9ORyA9ICJvdXRwdXQiOwotICAgICAgICBTdHJpbmcgT1ZFUlJJREVfT1BUSU9OID0gIm9yIjsKLSAgICAgICAgU3RyaW5nIE9WRVJSSURFX09QVElPTl9MT05HID0gIm92ZXItcmlkZSI7Ci0gICAgICAgIFN0cmluZyBFWENFUFRJT05fQkFTRV9DTEFTU19PUFRJT04gPSAiZWJjIjsKLSAgICAgICAgU3RyaW5nIEVYQ0VQVElPTl9CQVNFX0NMQVNTX09QVElPTl9MT05HID0gImV4Y2VwdGlvbi1iYXNlLWNsYXNzIjsKLSAgICAgICAgU3RyaW5nIE9WRVJSSURFX0FCU09MVVRFX0FERFJFU1NfT1BUSU9OID0gIm9hYSI7Ci0gICAgICAgIFN0cmluZyBPVkVSUklERV9BQlNPTFVURV9BRERSRVNTX09QVElPTl9MT05HID0gIm92ZXJyaWRlLWFic29sdXRlLWFkZHJlc3MiOwotICAgICAgICBTdHJpbmcgUEFDS0FHRV9PUFRJT04gPSAicCI7Ci0gICAgICAgIFN0cmluZyBQQUNLQUdFX09QVElPTl9MT05HID0gInBhY2thZ2UiOwotICAgICAgICBTdHJpbmcgUE9SVF9OQU1FX09QVElPTiA9ICJwbiI7Ci0gICAgICAgIFN0cmluZyBQT1JUX05BTUVfT1BUSU9OX0xPTkcgPSAicG9ydC1uYW1lIjsKLSAgICAgICAgU3RyaW5nIFJFUE9TSVRPUllfUEFUSF9PUFRJT04gPSAiciI7Ci0gICAgICAgIFN0cmluZyBSRVBPU0lUT1JZX1BBVEhfT1BUSU9OX0xPTkcgPSAicmVwb3NpdG9yeS1wYXRoIjsKLSAgICAgICAgU3RyaW5nIFJFU09VUkNFX0ZPTERFUl9PUFRJT04gPSAiUiI7Ci0gICAgICAgIFN0cmluZyBSRVNPVVJDRV9GT0xERVJfT1BUSU9OX0xPTkcgPSAicmVzb3VyY2UtZm9sZGVyIjsKLSAgICAgICAgU3RyaW5nIFNFUlZFUl9TSURFX0NPREVfT1BUSU9OID0gInNzIjsKLSAgICAgICAgU3RyaW5nIFNFUlZFUl9TSURFX0NPREVfT1BUSU9OX0xPTkcgPSAic2VydmVyLXNpZGUiOwotICAgICAgICBTdHJpbmcgU0VSVkVSX1NJREVfSU5URVJGQUNFX09QVElPTiA9ICJzc2kiOwotICAgICAgICBTdHJpbmcgU0VSVkVSX1NJREVfSU5URVJGQUNFX09QVElPTl9MT05HID0gInNlcnZlcnNpZGUtaW50ZXJmYWNlIjsKLSAgICAgICAgU3RyaW5nIFNFUlZJQ0VfTkFNRV9PUFRJT04gPSAic24iOwotICAgICAgICBTdHJpbmcgU0VSVklDRV9OQU1FX09QVElPTl9MT05HID0gInNlcnZpY2UtbmFtZSI7Ci0gICAgICAgIFN0cmluZyBTT1VSQ0VfRk9MREVSX05BTUVfT1BUSU9OID0gIlMiOwotICAgICAgICBTdHJpbmcgU09VUkNFX0ZPTERFUl9OQU1FX09QVElPTl9MT05HID0gInNvdXJjZS1mb2xkZXIiOwotICAgICAgICBTdHJpbmcgU1RVQl9MQU5HVUFHRV9PUFRJT04gPSAibCI7Ci0gICAgICAgIFN0cmluZyBTVFVCX0xBTkdVQUdFX09QVElPTl9MT05HID0gImxhbmd1YWdlIjsKLSAgICAgICAgU3RyaW5nIFNVUFBSRVNTX1BSRUZJWEVTX09QVElPTiA9ICJzcCI7Ci0gICAgICAgIFN0cmluZyBTVVBQUkVTU19QUkVGSVhFU19PUFRJT05fTE9ORyA9ICJzdXBwcmVzcy1wcmVmaXhlcyI7Ci0gICAgICAgIFN0cmluZyBVTlBBQ0tfQ0xBU1NFU19PUFRJT04gPSAidSI7Ci0gICAgICAgIFN0cmluZyBVTlBBQ0tfQ0xBU1NFU19PUFRJT05fTE9ORyA9ICJ1bnBhY2stY2xhc3NlcyI7Ci0gICAgICAgIFN0cmluZyBVTldSQVBfUEFSQU1FVEVSUyA9ICJ1dyI7Ci0gICAgICAgIFN0cmluZyBVTldSQVBfUEFSQU1FVEVSU19MT05HID0gInVud3JhcC1wYXJhbXMiOwotICAgICAgICBTdHJpbmcgV1NETF9MT0NBVElPTl9VUklfT1BUSU9OID0gInVyaSI7Ci0gICAgICAgIFN0cmluZyBXU0RMX1ZFUlNJT05fT1BUSU9OID0gInd2IjsKLSAgICAgICAgU3RyaW5nIFdTRExfVkVSU0lPTl9PUFRJT05fTE9ORyA9ICJ3c2RsLXZlcnNpb24iOwotICAgICAgICBTdHJpbmcgSFRUUF9QUk9YWV9IT1NUX09QVElPTl9MT05HID0gImh0dHAtcHJveHktaG9zdCI7Ci0gICAgICAgIFN0cmluZyBIVFRQX1BST1hZX1BPUlRfT1BUSU9OX0xPTkcgPSAiaHR0cC1wcm94eS1wb3J0IjsKLSAgICAgICAgU3RyaW5nIEVYQ0xVREVfUEFLQUdFU19PUFRJT04gPSAiZXAiOwotICAgICAgICBTdHJpbmcgRVhDTFVERV9QQUtBR0VTX09QVElPTl9MT05HID0gImV4Y2x1ZGUtcGFja2FnZXMiOwotICAgICAgICBTdHJpbmcgU0tFTFRPTl9JTlRFUkZBQ0VfTkFNRV9PUFRJT04gPSAic2luIjsKLSAgICAgICAgU3RyaW5nIFNLRUxUT05fSU5URVJGQUNFX05BTUVfT1BUSU9OX0xPTkcgPSAic2tlbHRvbi1pbnRlcmZhY2UtbmFtZSI7Ci0gICAgICAgIFN0cmluZyBVU0VfT1BFUkFUSU9OX05BTUUgPSAidW9uIjsKLSAgICAgICAgU3RyaW5nIFVTRV9PUEVSQVRJT05fTkFNRV9MT05HID0gInVzZS1vcGVyYXRpb24tbmFtZSI7Ci0gICAgICAgIFN0cmluZyBTS0VMVE9OX0NMQVNTX05BTUVfT1BUSU9OID0gInNjbiI7Ci0gICAgICAgIFN0cmluZyBTS0VMVE9OX0NMQVNTX05BTUVfT1BUSU9OX0xPTkcgPSAic2tlbHRvbi1jbGFzcy1uYW1lIjsKLQotICAgICAgICBTdHJpbmcgSU5WQUxJRF9PUFRJT04gPSAiSU5WQUxJRF9PUFRJT04iOwotICAgICAgICBTdHJpbmcgRVhUUkFfT1BUSU9OVFlQRV9QUkVGSVggPSAiRSI7Ci0KLSAgICAgICAgU3RyaW5nIFdTRExfVkVSU0lPTl8yID0gIjIuMCI7Ci0gICAgICAgIFN0cmluZyBXU0RMX1ZFUlNJT05fMl9PUFRJT05BTCA9ICIyIjsKLSAgICAgICAgU3RyaW5nIFdTRExfVkVSU0lPTl8xID0gIjEuMSI7Ci0gICAgfQotCi0gICAgaW50ZXJmYWNlIEV4dGVuc2lvbkFyZ3VtZW50cyB7Ci0gICAgICAgIFN0cmluZyBXSVRIT1VUX0RBVEFCSU5EX0NPREUgPSAid2RjIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTT0xFX0lOUFVUID0gIlNPTEVfSU5QVVQiOwotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvQ29tbWFuZExpbmVPcHRpb25QYXJzZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi91dGlsL0NvbW1hbmRMaW5lT3B0aW9uUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhOTVhYzMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvQ29tbWFuZExpbmVPcHRpb25QYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLXB1YmxpYyBjbGFzcyBDb21tYW5kTGluZU9wdGlvblBhcnNlciBpbXBsZW1lbnRzIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzIHsKLQotICAgIC8vc3RhdGVzCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IFNUQVJURUQgPSAwOwotICAgIHByaXZhdGUgc3RhdGljIGludCBORVdfT1BUSU9OID0gMTsKLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgU1VCX1BBUkFNX09GX09QVElPTiA9IDI7Ci0KLSAgICBwcml2YXRlIE1hcCBjb21tYW5kTGluZU9wdGlvbnM7Ci0KLSAgICBwdWJsaWMgQ29tbWFuZExpbmVPcHRpb25QYXJzZXIoTWFwIGNvbW1hbmRMaW5lT3B0aW9ucykgewotICAgICAgICB0aGlzLmNvbW1hbmRMaW5lT3B0aW9ucyA9IGNvbW1hbmRMaW5lT3B0aW9uczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29tbWFuZExpbmVPcHRpb25QYXJzZXIoU3RyaW5nW10gYXJncykgewotICAgICAgICB0aGlzLmNvbW1hbmRMaW5lT3B0aW9ucyA9IHRoaXMucGFyc2UoYXJncyk7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gYSBsaXN0IHdpdGggPGNvZGU+Q29tbWFuZExpbmVPcHRpb248L2NvZGU+IG9iamVjdHMKLSAgICAgKgotICAgICAqIEBwYXJhbSBhcmdzCi0gICAgICogQHJldHVybiBDb21tYW5kTGluZU9wdGlvbiBMaXN0Ci0gICAgICovCi0gICAgcHJpdmF0ZSBNYXAgcGFyc2UoU3RyaW5nW10gYXJncykgewotICAgICAgICBNYXAgY29tbWFuZExpbmVPcHRpb25zID0gbmV3IEhhc2hNYXAoKTsKLQotICAgICAgICBpZiAoMCA9PSBhcmdzLmxlbmd0aCkgewotICAgICAgICAgICAgcmV0dXJuIGNvbW1hbmRMaW5lT3B0aW9uczsKLSAgICAgICAgfQotCi0gICAgICAgIC8vU3RhdGUgMCBtZWFucyBzdGFydGVkCi0gICAgICAgIC8vU3RhdGUgMSBtZWFucyBlYXJsaWVyIG9uZSB3YXMgYSBuZXcgLW9wdGlvbgotICAgICAgICAvL1N0YXRlIDIgbWVhbnMgZWFybGllciBvbmUgd2FzIGEgc3ViIHBhcmFtIG9mIGEgLW9wdGlvbgotCi0gICAgICAgIGludCBzdGF0ZSA9IFNUQVJURUQ7Ci0gICAgICAgIEFycmF5TGlzdCBvcHRpb25CdW5kbGUgPSBudWxsOwotICAgICAgICBTdHJpbmcgb3B0aW9uVHlwZSA9IG51bGw7Ci0gICAgICAgIENvbW1hbmRMaW5lT3B0aW9uIGNvbW1hbmRMaW5lT3B0aW9uOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgewotCi0gICAgICAgICAgICBpZiAoYXJnc1tpXS5zdGFydHNXaXRoKCItIikpIHsKLSAgICAgICAgICAgICAgICBpZiAoU1RBUlRFRCA9PSBzdGF0ZSkgewotICAgICAgICAgICAgICAgICAgICAvLyBmcmVzaCBvbmUKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBORVdfT1BUSU9OOwotICAgICAgICAgICAgICAgICAgICBvcHRpb25UeXBlID0gYXJnc1tpXTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFNVQl9QQVJBTV9PRl9PUFRJT04gPT0gc3RhdGUgfHwgTkVXX09QVElPTiA9PSBzdGF0ZSkgewotICAgICAgICAgICAgICAgICAgICAvLyBuZXcgb25lIGJ1dCBvbGQgb25lIHNob3VsZCBiZSBzYXZlZAotICAgICAgICAgICAgICAgICAgICBjb21tYW5kTGluZU9wdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENvbW1hbmRMaW5lT3B0aW9uKG9wdGlvblR5cGUsIG9wdGlvbkJ1bmRsZSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbW1hbmRMaW5lT3B0aW9ucy5wdXQoY29tbWFuZExpbmVPcHRpb24uZ2V0T3B0aW9uVHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRMaW5lT3B0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBORVdfT1BUSU9OOwotICAgICAgICAgICAgICAgICAgICBvcHRpb25UeXBlID0gYXJnc1tpXTsKLSAgICAgICAgICAgICAgICAgICAgb3B0aW9uQnVuZGxlID0gbnVsbDsKLQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKFNUQVJURUQgPT0gc3RhdGUpIHsKLSAgICAgICAgICAgICAgICAgICAgY29tbWFuZExpbmVPcHRpb24gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDb21tYW5kTGluZU9wdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLlNPTEVfSU5QVVQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzKTsKLSAgICAgICAgICAgICAgICAgICAgY29tbWFuZExpbmVPcHRpb25zLnB1dChjb21tYW5kTGluZU9wdGlvbi5nZXRPcHRpb25UeXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZExpbmVPcHRpb24pOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29tbWFuZExpbmVPcHRpb25zOwotCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChORVdfT1BUSU9OID09IHN0YXRlKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9wdGlvbkJ1bmRsZSA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICAgICAgb3B0aW9uQnVuZGxlLmFkZChhcmdzW2ldKTsKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBTVUJfUEFSQU1fT0ZfT1BUSU9OOwotCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChTVUJfUEFSQU1fT0ZfT1BUSU9OID09IHN0YXRlKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9wdGlvbkJ1bmRsZS5hZGQoYXJnc1tpXSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9Ci0KLQotICAgICAgICB9Ci0KLSAgICAgICAgY29tbWFuZExpbmVPcHRpb24gPSBuZXcgQ29tbWFuZExpbmVPcHRpb24ob3B0aW9uVHlwZSwgb3B0aW9uQnVuZGxlKTsKLSAgICAgICAgY29tbWFuZExpbmVPcHRpb25zLnB1dChjb21tYW5kTGluZU9wdGlvbi5nZXRPcHRpb25UeXBlKCksIGNvbW1hbmRMaW5lT3B0aW9uKTsKLSAgICAgICAgcmV0dXJuIGNvbW1hbmRMaW5lT3B0aW9uczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWFwIGdldEFsbE9wdGlvbnMoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmNvbW1hbmRMaW5lT3B0aW9uczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdCBnZXRJbnZhbGlkT3B0aW9ucyhPcHRpb25zVmFsaWRhdG9yIHZhbGlkYXRvcikgewotICAgICAgICBMaXN0IGZhdWx0TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgSXRlcmF0b3IgaXRlcmF0b3IgPSB0aGlzLmNvbW1hbmRMaW5lT3B0aW9ucy52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbiBjb21tYW5kTGluZU9wdGlvbiA9ICgoQ29tbWFuZExpbmVPcHRpb24pIChpdGVyYXRvci5uZXh0KCkpKTsKLSAgICAgICAgICAgIGlmICh2YWxpZGF0b3IuaXNJbnZhbGlkKGNvbW1hbmRMaW5lT3B0aW9uKSkgewotICAgICAgICAgICAgICAgIGZhdWx0TGlzdC5hZGQoY29tbWFuZExpbmVPcHRpb24pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhdWx0TGlzdDsKLSAgICB9Ci0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi91dGlsL0NvdW50ZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi91dGlsL0NvdW50ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIwYTAyMi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdXRpbC9Db3VudGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudXRpbDsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgYSBzaW1wbGUgemVyby1iYXNlZCBjb3VudGVyIHdpdGggc3luY2hyb25pemVkIGFjY2Vzcy4KLSAqLwotcHVibGljIGNsYXNzIENvdW50ZXIgewotCi0gICAgcHJpdmF0ZSBsb25nIHZhbHVlID0gMEw7Ci0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGxvbmcgaW5jcmVtZW50QW5kR2V0KCkgewotICAgICAgICByZXR1cm4gKyt2YWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGxvbmcgZGVjcmVtZW50QW5kR2V0KCkgewotICAgICAgICBpZiAodmFsdWUgPiAwTCkgewotICAgICAgICAgICAgcmV0dXJuIC0tdmFsdWU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVzZXQoKSB7Ci0gICAgICAgIHZhbHVlID0gMEw7Ci0gICAgfQotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBsb25nIGdldCgpIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvRGVmYXVsdEVudGl0eVJlc29sdmVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdXRpbC9EZWZhdWx0RW50aXR5UmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZhM2FhNi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdXRpbC9EZWZhdWx0RW50aXR5UmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi51dGlsOwotCi1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0RW50aXR5UmVzb2x2ZXIgaW1wbGVtZW50cyBvcmcueG1sLnNheC5FbnRpdHlSZXNvbHZlciB7Ci0gICAgcHVibGljIERlZmF1bHRFbnRpdHlSZXNvbHZlcigpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSW5wdXRTb3VyY2UgcmVzb2x2ZUVudGl0eShTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkgewotICAgICAgICByZXR1cm4gWE1MVXRpbHMuZ2V0RW1wdHlJbnB1dFNvdXJjZSgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi91dGlsL0V4dGVybmFsUG9saWN5U2VyaWFsaXplci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvRXh0ZXJuYWxQb2xpY3lTZXJpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljY2UyOGIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvRXh0ZXJuYWxQb2xpY3lTZXJpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnV0aWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm5lZXRoaS5Bc3NlcnRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5uZWV0aGkuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUubmVldGhpLlBvbGljeTsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxPdXRwdXRGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1wdWJsaWMgY2xhc3MgRXh0ZXJuYWxQb2xpY3lTZXJpYWxpemVyIHsKLQotICAgIHByaXZhdGUgTGlzdCBhc3NlcnRpb25zMkZpbHRlciA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgIHB1YmxpYyB2b2lkIGFkZEFzc2VydGlvblRvRmlsdGVyKFFOYW1lIG5hbWUpIHsKLSAgICAgICAgYXNzZXJ0aW9uczJGaWx0ZXIuYWRkKG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEFzc2VydGlvbnNUb0ZpbHRlcihMaXN0IGFzc2VydGlvbnMyRmlsdGVyKSB7Ci0gICAgICAgIHRoaXMuYXNzZXJ0aW9uczJGaWx0ZXIgPSBhc3NlcnRpb25zMkZpbHRlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdCBnZXRBc3NlcnRpb25zVG9GaWx0ZXIoKSB7Ci0gICAgICAgIHJldHVybiBhc3NlcnRpb25zMkZpbHRlcjsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShQb2xpY3kgcG9saWN5LCBPdXRwdXRTdHJlYW0gb3MpIHsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgWE1MU3RyZWFtV3JpdGVyIHdyaXRlciA9IFhNTE91dHB1dEZhY3RvcnkubmV3SW5zdGFuY2UoKQotICAgICAgICAgICAgICAgICAgICAuY3JlYXRlWE1MU3RyZWFtV3JpdGVyKG9zKTsKLSAgICAgICAgICAgIHBvbGljeSA9IChQb2xpY3kpIHBvbGljeS5ub3JtYWxpemUoZmFsc2UpOwotCi0gICAgICAgICAgICBTdHJpbmcgd3NwUHJlZml4ID0gd3JpdGVyLmdldFByZWZpeChDb25zdGFudHMuVVJJX1BPTElDWV9OUyk7Ci0KLQkJCWlmICh3c3BQcmVmaXggPT0gbnVsbCkgewotCQkJCXdzcFByZWZpeCA9IENvbnN0YW50cy5BVFRSX1dTUDsKLQkJCQl3cml0ZXIuc2V0UHJlZml4KHdzcFByZWZpeCwgQ29uc3RhbnRzLlVSSV9QT0xJQ1lfTlMpOwotCQkJfQotCi0JCQlTdHJpbmcgd3N1UHJlZml4ID0gd3JpdGVyLmdldFByZWZpeChDb25zdGFudHMuVVJJX1dTVV9OUyk7Ci0JCQlpZiAod3N1UHJlZml4ID09IG51bGwpIHsKLQkJCQl3c3VQcmVmaXggPSBDb25zdGFudHMuQVRUUl9XU1U7Ci0JCQkJd3JpdGVyLnNldFByZWZpeCh3c3VQcmVmaXgsIENvbnN0YW50cy5VUklfV1NVX05TKTsKLQkJCX0KLQotCQkJd3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHdzcFByZWZpeCwgQ29uc3RhbnRzLkVMRU1fUE9MSUNZLAotCQkJCQlDb25zdGFudHMuVVJJX1BPTElDWV9OUyk7Ci0KLQkJCVFOYW1lIGtleTsKLQotCQkJU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0JCQlTdHJpbmcgbmFtZXNwYWNlVVJJID0gbnVsbDsKLQkJCVN0cmluZyBsb2NhbE5hbWUgPSBudWxsOwotCi0JCQlIYXNoTWFwIHByZWZpeDJucyA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBwb2xpY3kuZ2V0QXR0cmlidXRlcygpLmtleVNldCgpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0KLQkJCQlrZXkgPSAoUU5hbWUpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlsb2NhbE5hbWUgPSBrZXkuZ2V0TG9jYWxQYXJ0KCk7Ci0KLQkJCQluYW1lc3BhY2VVUkkgPSBrZXkuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0JCQkJbmFtZXNwYWNlVVJJID0gKG5hbWVzcGFjZVVSSSA9PSBudWxsIHx8IG5hbWVzcGFjZVVSSS5sZW5ndGgoKSA9PSAwKSA/IG51bGwKLQkJCQkJCTogbmFtZXNwYWNlVVJJOwotCi0JCQkJaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0KLQkJCQkJU3RyaW5nIHdyaXRlclByZWZpeCA9IHdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLQkJCQkJd3JpdGVyUHJlZml4ID0gKHdyaXRlclByZWZpeCA9PSBudWxsIHx8IHdyaXRlclByZWZpeAotCQkJCQkJCS5sZW5ndGgoKSA9PSAwKSA/IG51bGwgOiB3cml0ZXJQcmVmaXg7Ci0KLQkJCQkJaWYgKHdyaXRlclByZWZpeCA9PSBudWxsKSB7Ci0JCQkJCQlwcmVmaXggPSBrZXkuZ2V0UHJlZml4KCk7Ci0JCQkJCQlwcmVmaXggPSAocHJlZml4ID09IG51bGwgfHwgcHJlZml4Lmxlbmd0aCgpID09IDApID8gbnVsbAotCQkJCQkJCQk6IHByZWZpeDsKLQotCQkJCQl9IGVsc2UgewotCQkJCQkJcHJlZml4ID0gd3JpdGVyUHJlZml4OwotCQkJCQl9Ci0KLQkJCQkJaWYgKHByZWZpeCAhPSBudWxsKSB7Ci0JCQkJCQl3cml0ZXIud3JpdGVBdHRyaWJ1dGUocHJlZml4LCBuYW1lc3BhY2VVUkksIGxvY2FsTmFtZSwKLQkJCQkJCQkJcG9saWN5LmdldEF0dHJpYnV0ZShrZXkpKTsKLQkJCQkJCXByZWZpeDJucy5wdXQocHJlZml4LCBrZXkuZ2V0TmFtZXNwYWNlVVJJKCkpOwotCi0JCQkJCX0gZWxzZSB7Ci0JCQkJCQl3cml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlVVJJLCBsb2NhbE5hbWUsIHBvbGljeQotCQkJCQkJCQkuZ2V0QXR0cmlidXRlKGtleSkpOwotCQkJCQl9Ci0KLQkJCQl9IGVsc2UgewotCQkJCQl3cml0ZXIud3JpdGVBdHRyaWJ1dGUobG9jYWxOYW1lLCBwb2xpY3kuZ2V0QXR0cmlidXRlKGtleSkpOwotCQkJCX0KLQotCQkJfQotCi0JCQkvLyB3cml0ZXMgeG1sbnM6d3NwPSIuLiIKLQkJCXdyaXRlci53cml0ZU5hbWVzcGFjZSh3c3BQcmVmaXgsIENvbnN0YW50cy5VUklfUE9MSUNZX05TKTsKLQotCQkJU3RyaW5nIHByZWZpWDsKLQotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHByZWZpeDJucy5rZXlTZXQoKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCXByZWZpWCA9IChTdHJpbmcpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQl3cml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZmlYLCAoU3RyaW5nKSBwcmVmaXgybnMuZ2V0KHByZWZpWCkpOwotCQkJfQotCi0gICAgICAgICAgICB3cml0ZXIud3JpdGVTdGFydEVsZW1lbnQoQ29uc3RhbnRzLkFUVFJfV1NQLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5FTEVNX0VYQUNUTFlPTkUsIENvbnN0YW50cy5VUklfUE9MSUNZX05TKTsKLSAgICAgICAgICAgIC8vIHdyaXRlIDx3c3A6RXhhY3RseU9uZT4KLQotICAgICAgICAgICAgTGlzdCBhc3NlcnRpb25MaXN0OwotCi0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gcG9saWN5LmdldEFsdGVybmF0aXZlcygpOyBpdGVyYXRvcgotICAgICAgICAgICAgICAgICAgICAuaGFzTmV4dCgpOykgewotCi0gICAgICAgICAgICAgICAgYXNzZXJ0aW9uTGlzdCA9IChMaXN0KSBpdGVyYXRvci5uZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICAvLyB3cml0ZSA8d3NwOkFsbD4KLSAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVTdGFydEVsZW1lbnQoQ29uc3RhbnRzLkFUVFJfV1NQLCBDb25zdGFudHMuRUxFTV9BTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5VUklfUE9MSUNZX05TKTsKLQotICAgICAgICAgICAgICAgIEFzc2VydGlvbiBhc3NlcnRpb247Ci0KLSAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGFzc2VydGlvbnMgPSBhc3NlcnRpb25MaXN0Lml0ZXJhdG9yKCk7IGFzc2VydGlvbnMKLSAgICAgICAgICAgICAgICAgICAgICAgIC5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydGlvbiA9IChBc3NlcnRpb24pIGFzc2VydGlvbnMubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoYXNzZXJ0aW9uczJGaWx0ZXIuY29udGFpbnMoYXNzZXJ0aW9uLmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNpbmNlIHRoaXMgaXMgYW4gYXNzZXJ0aW9uIHRvIGZpbHRlciwgd2Ugd2lsbCBub3Qgc2VyaWFsaXplIHRoaXMKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydGlvbi5zZXJpYWxpemUod3JpdGVyKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyB3cml0ZSA8L3dzcDpBbGw+Ci0gICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyB3cml0ZSA8L3dzcDpFeGFjdGx5T25lPgotICAgICAgICAgICAgd3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICAgICAgLy8gd3JpdGUgPC93c3A6UG9saWN5PgotICAgICAgICAgICAgd3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotCi0gICAgICAgICAgICB3cml0ZXIuZmx1c2goKTsKLQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotCi0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdXRpbC9GaWxlV3JpdGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdXRpbC9GaWxlV3JpdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmMzk2YTcuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvRmlsZVdyaXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnV0aWw7Ci0KLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgRmlsZVdyaXRlciB7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzLyByZXR1cm5zIGEgZmlsZSBvYmplY3QKLSAgICAgKgotICAgICAqIEBwYXJhbSByb290TG9jYXRpb24gLSBMb2NhdGlvbiB0byBiZSB3cml0dGVuCi0gICAgICogQHBhcmFtIHBhY2thZ2VOYW1lICAtIHBhY2thZ2UsIGNhbiBiZSAnLicgc2VwYXJhdGVkCi0gICAgICogQHBhcmFtIGZpbGVOYW1lICAgICBuYW1lIG9mIHRoZSBmaWxlCi0gICAgICogQHBhcmFtIGV4dGVuc2lvbiAgICB0eXBlIG9mIHRoZSBmaWxlLCBqYXZhLCBjcHAgZXRjCi0gICAgICogQHJldHVybiB0aGUgRmlsZSB0aGF0IHdhcyBjcmVhdGVkCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBGaWxlIGNyZWF0ZUNsYXNzRmlsZShGaWxlIHJvb3RMb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBmaWxlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBleHRlbnNpb24pIHRocm93cyBJT0V4Y2VwdGlvbiwKLSAgICAgICAgICAgIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEZpbGUgcmV0dXJuRmlsZSA9IG51bGw7Ci0gICAgICAgIEZpbGUgcm9vdCA9IHJvb3RMb2NhdGlvbjsKLQotICAgICAgICBpZiAocGFja2FnZU5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIGRpcmVjdG9yeU5hbWVzW10gPSBwYWNrYWdlTmFtZS5zcGxpdCgiXFwuIik7Ci0gICAgICAgICAgICBGaWxlIHRlbXBGaWxlID0gbnVsbDsKLSAgICAgICAgICAgIGludCBsZW5ndGggPSBkaXJlY3RvcnlOYW1lcy5sZW5ndGg7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgdGVtcEZpbGUgPSBuZXcgRmlsZShyb290LCBkaXJlY3RvcnlOYW1lc1tpXSk7Ci0gICAgICAgICAgICAgICAgcm9vdCA9IHRlbXBGaWxlOwotICAgICAgICAgICAgICAgIGlmICghdGVtcEZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgdGVtcEZpbGUubWtkaXIoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoKGV4dGVuc2lvbiAhPSBudWxsKSAmJiAhZmlsZU5hbWUuZW5kc1dpdGgoZXh0ZW5zaW9uKSkgewotICAgICAgICAgICAgZmlsZU5hbWUgPSBmaWxlTmFtZSArIGV4dGVuc2lvbjsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybkZpbGUgPSBuZXcgRmlsZShyb290LCBmaWxlTmFtZSk7Ci0KLSAgICAgICAgaWYgKCFyZXR1cm5GaWxlLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAvLyByZXR1cm5GaWxlLmNyZWF0ZU5ld0ZpbGUoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0dXJuRmlsZTsKLSAgICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvSG9zdENvbmZpZ3VyYXRpb24uamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi91dGlsL0hvc3RDb25maWd1cmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmMmQxY2MuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvSG9zdENvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi51dGlsOwotCi0vL3RvIGtlZXAgaW5mb3IgZ2V0dGluZyBmcm9tIGF4aXMyLnhtbAotCi1wdWJsaWMgY2xhc3MgSG9zdENvbmZpZ3VyYXRpb24gewotICAgIHByaXZhdGUgU3RyaW5nIGlwOwotICAgIHByaXZhdGUgaW50IHBvcnQ7Ci0KLSAgICBwdWJsaWMgSG9zdENvbmZpZ3VyYXRpb24oU3RyaW5nIGlwLCBpbnQgcG9ydCkgewotICAgICAgICB0aGlzLmlwID0gaXA7Ci0gICAgICAgIHRoaXMucG9ydCA9IHBvcnQ7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRJcCgpIHsKLSAgICAgICAgcmV0dXJuIGlwOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0UG9ydCgpIHsKLSAgICAgICAgcmV0dXJuIHBvcnQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvSU9VdGlscy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvSU9VdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTljYzA3Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi91dGlsL0lPVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi51dGlsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotCi1wdWJsaWMgY2xhc3MgSU9VdGlscyB7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ29waWVzIHRoZSBpbnB1dCBzdHJlYW0gdG8gdGhlIG91dHB1dCBzdHJlYW0KLSAgICAgKgotICAgICAqIEBwYXJhbSBpbiAgdGhlIDxjb2RlPklucHV0U3RyZWFtPC9jb2RlPgotICAgICAqIEBwYXJhbSBvdXQgdGhlIDxjb2RlPk91dHB1dFN0cmVhbTwvY29kZT4KLSAgICAgKiBAcGFyYW0gY2xvc2UgY2xvc2UgaW5wdXQgYW5kIG91dHB1dCBzdHJlYW0KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY29weShJbnB1dFN0cmVhbSBpbiwgT3V0cHV0U3RyZWFtIG91dCwgYm9vbGVhbiBjbG9zZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlWzQwOTZdOwotICAgICAgICBpbnQgY291bnQ7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB3aGlsZSAoKGNvdW50ID0gaW4ucmVhZChidWZmZXIpKSA+IDApIHsKLSAgICAgICAgICAgICAgICBvdXQud3JpdGUoYnVmZmVyLCAwLCBjb3VudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoY2xvc2UpIHsKLSAgICAgICAgICAgICAgICB0cnkgeyBpbi5jbG9zZSgpOyB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7fQotICAgICAgICAgICAgICAgIHRyeSB7IG91dC5jbG9zZSgpOyB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7fQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvSmF2YVV0aWxzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdXRpbC9KYXZhVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGUwNmJhZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdXRpbC9KYXZhVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudXRpbDsKLQotaW1wb3J0IGphdmEudGV4dC5Db2xsYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotLyoqCi0gKiBKYXZhVXRpbHMKLSAqLwotcHVibGljIGNsYXNzIEphdmFVdGlscyB7Ci0gICAgLyoqCi0gICAgICogVGhlc2UgYXJlIGphdmEga2V5d29yZHMgYXMgc3BlY2lmaWVkIGF0IHRoZSBmb2xsb3dpbmcgVVJMIChzb3J0ZWQgYWxwaGFiZXRpY2FsbHkpLgotICAgICAqIGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9sZXhpY2FsLmRvYy5odG1sIzIyOTMwOAotICAgICAqIE5vdGUgdGhhdCBmYWxzZSwgdHJ1ZSwgYW5kIG51bGwgYXJlIG5vdCBzdHJpY3RseSBrZXl3b3JkczsgdGhleSBhcmUgbGl0ZXJhbCB2YWx1ZXMsCi0gICAgICogYnV0IGZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBhcnJheSwgdGhleSBjYW4gYmUgdHJlYXRlZCBhcyBsaXRlcmFscy4KLSAgICAgKiAqKioqKiogUExFQVNFIEtFRVAgVEhJUyBMSVNUIFNPUlRFRCBJTiBBU0NFTkRJTkcgT1JERVIgKioqKioqCi0gICAgICovCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBrZXl3b3Jkc1tdID0KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgImFic3RyYWN0IiwgImFzc2VydCIsICJib29sZWFuIiwgImJyZWFrIiwgImJ5dGUiLCAiY2FzZSIsCi0gICAgICAgICAgICAgICAgICAgICJjYXRjaCIsICJjaGFyIiwgImNsYXNzIiwgImNvbnN0IiwgImNvbnRpbnVlIiwKLSAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiLCAiZG8iLCAiZG91YmxlIiwgImVsc2UiLCAiZXh0ZW5kcyIsCi0gICAgICAgICAgICAgICAgICAgICJmYWxzZSIsICJmaW5hbCIsICJmaW5hbGx5IiwgImZsb2F0IiwgImZvciIsCi0gICAgICAgICAgICAgICAgICAgICJnb3RvIiwgImlmIiwgImltcGxlbWVudHMiLCAiaW1wb3J0IiwgImluc3RhbmNlb2YiLAotICAgICAgICAgICAgICAgICAgICAiaW50IiwgImludGVyZmFjZSIsICJsb25nIiwgIm5hdGl2ZSIsICJuZXciLAotICAgICAgICAgICAgICAgICAgICAibnVsbCIsICJwYWNrYWdlIiwgInByaXZhdGUiLCAicHJvdGVjdGVkIiwgInB1YmxpYyIsCi0gICAgICAgICAgICAgICAgICAgICJyZXR1cm4iLCAic2hvcnQiLCAic3RhdGljIiwgInN0cmljdGZwIiwgInN1cGVyIiwKLSAgICAgICAgICAgICAgICAgICAgInN3aXRjaCIsICJzeW5jaHJvbml6ZWQiLCAidGhpcyIsICJ0aHJvdyIsICJ0aHJvd3MiLAotICAgICAgICAgICAgICAgICAgICAidHJhbnNpZW50IiwgInRydWUiLCAidHJ5IiwgInZvaWQiLCAidm9sYXRpbGUiLAotICAgICAgICAgICAgICAgICAgICAid2hpbGUiCi0gICAgICAgICAgICB9OwotCi0gICAgLyoqCi0gICAgICogQ29sbGF0b3IgZm9yIGNvbXBhcmluZyB0aGUgc3RyaW5ncwotICAgICAqLwotICAgIHN0YXRpYyBmaW5hbCBDb2xsYXRvciBlbmdsaXNoQ29sbGF0b3IgPSBDb2xsYXRvci5nZXRJbnN0YW5jZShMb2NhbGUuRU5HTElTSCk7Ci0KLSAgICAvKioKLSAgICAgKiBVc2UgdGhpcyBjaGFyYWN0ZXIgYXMgc3VmZml4Ci0gICAgICovCi0gICAgc3RhdGljIGZpbmFsIGNoYXIga2V5d29yZFByZWZpeCA9ICdfJzsKLQotICAgIC8qKgotICAgICAqIElzIHRoaXMgYW4gWE1MIHB1bmN0dWF0aW9uIGNoYXJhY3Rlcj8KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzUHVuY3R1YXRpb24oY2hhciBjKSB7Ci0gICAgICAgIHJldHVybiAnLScgPT0gYwotICAgICAgICAgICAgICAgIHx8ICcuJyA9PSBjCi0gICAgICAgICAgICAgICAgfHwgJzonID09IGMKLSAgICAgICAgICAgICAgICB8fCAnXHUwMEI3JyA9PSBjCi0gICAgICAgICAgICAgICAgfHwgJ1x1MDM4NycgPT0gYwotICAgICAgICAgICAgICAgIHx8ICctJyA9PSBjCi0gICAgICAgICAgICAgICAgfHwgJ1x1MDZERCcgPT0gYwotICAgICAgICAgICAgICAgIHx8ICdcdTA2REUnID09IGM7Ci0gICAgfSAvLyBpc1B1bmN0dWF0aW9uCi0KLSAgICAvKioKLSAgICAgKiBDaGVja3MgaWYgdGhlIGlucHV0IHN0cmluZyBpcyBhIHZhbGlkIGphdmEga2V5d29yZC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gUmV0dXJucyBib29sZWFuLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0phdmFLZXl3b3JkKFN0cmluZyBrZXl3b3JkKSB7Ci0gICAgICAgIC8vIE5vbmUgb2YgdGhlIGphdmEga2V5d29yZHMgaGF2ZSB1cHBlcmNhc2UgY2hhcmFjdGVycwotICAgICAgICBpZiAoaGFzVXBwZXJDYXNlKGtleXdvcmQpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIChBcnJheXMuYmluYXJ5U2VhcmNoKGtleXdvcmRzLCBrZXl3b3JkLCBlbmdsaXNoQ29sbGF0b3IpID49IDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrIGlmIHRoZSB3b3JkIGhhcyBhbnkgdXBwZXJjYXNlIGxldHRlcnMKLSAgICAgKgotICAgICAqIEBwYXJhbSB3b3JkCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNVcHBlckNhc2UoU3RyaW5nIHdvcmQpIHsKLSAgICAgICAgaWYgKHdvcmQgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGludCBsZW4gPSB3b3JkLmxlbmd0aCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKHdvcmQuY2hhckF0KGkpKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUdXJucyBhIGphdmEga2V5d29yZCBzdHJpbmcgaW50byBhIG5vbi1KYXZhIGtleXdvcmQgc3RyaW5nLiAgKFJpZ2h0IG5vdwotICAgICAqIHRoaXMgc2ltcGx5IG1lYW5zIGFwcGVuZGluZyBhbiB1bmRlcnNjb3JlLikKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBtYWtlTm9uSmF2YUtleXdvcmQoU3RyaW5nIGtleXdvcmQpIHsKLSAgICAgICAgcmV0dXJuIGtleXdvcmRQcmVmaXggKyBrZXl3b3JkOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHhtbE5hbWVUb0phdmEoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgLy8gcHJvdGVjdCBvdXJzZWx2ZXMgZnJvbSBnYXJiYWdlCi0gICAgICAgIGlmIChuYW1lID09IG51bGwgfHwgbmFtZS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmFtZTsKLSAgICAgICAgfQotCi0gICAgICAgIGNoYXJbXSBuYW1lQXJyYXkgPSBuYW1lLnRvQ2hhckFycmF5KCk7Ci0gICAgICAgIGludCBuYW1lTGVuID0gbmFtZS5sZW5ndGgoKTsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIobmFtZUxlbik7Ci0gICAgICAgIGJvb2xlYW4gd29yZFN0YXJ0ID0gZmFsc2U7Ci0KLSAgICAgICAgLy8gVGhlIG1hcHBpbmcgaW5kaWNhdGVzIHRvIGNvbnZlcnQgZmlyc3QgY2hhcmFjdGVyLgotICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgIHdoaWxlIChpIDwgbmFtZUxlbgotICAgICAgICAgICAgICAgICYmIChpc1B1bmN0dWF0aW9uKG5hbWVBcnJheVtpXSkKLSAgICAgICAgICAgICAgICB8fCAhQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJTdGFydChuYW1lQXJyYXlbaV0pKSkgewotICAgICAgICAgICAgaSsrOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpIDwgbmFtZUxlbikgewotICAgICAgICAgICAgLy8gRGVjYXBpdGFsaXphdGlvbiBjb2RlIHVzZWQgdG8gYmUgaGVyZSwgYnV0IHdlIHVzZSB0aGUKLSAgICAgICAgICAgIC8vIEludHJvc3BlY3RvciBmdW5jdGlvbiBub3cgYWZ0ZXIgd2UgZmlsdGVyIG91dCBhbGwgYmFkIGNoYXJzLgotCi0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKG5hbWVBcnJheVtpXSk7Ci0gICAgICAgICAgICAvL3dvcmRTdGFydCA9ICFDaGFyYWN0ZXIuaXNMZXR0ZXIobmFtZUFycmF5W2ldKTsKLSAgICAgICAgICAgIHdvcmRTdGFydCA9ICFDaGFyYWN0ZXIuaXNMZXR0ZXIobmFtZUFycmF5W2ldKSAmJiBuYW1lQXJyYXlbaV0gIT0gIl8iLmNoYXJBdCgwKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFRoZSBpZGVudGlmaWVyIGNhbm5vdCBiZSBtYXBwZWQgc3RyaWN0bHkgYWNjb3JkaW5nIHRvCi0gICAgICAgICAgICAvLyBKU1IgMTAxCi0gICAgICAgICAgICBpZiAoQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJQYXJ0KG5hbWVBcnJheVswXSkpIHsKLSAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCJfIikuYXBwZW5kKG5hbWVBcnJheVswXSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIFRoZSBYTUwgaWRlbnRpZmllciBkb2VzIG5vdCBjb250YWluIGFueSBjaGFyYWN0ZXJzCi0gICAgICAgICAgICAgICAgLy8gd2UgY2FuIG1hcCB0byBKYXZhLiAgVXNpbmcgdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nCi0gICAgICAgICAgICAgICAgLy8gd2lsbCBtYWtlIGl0IHNvbWV3aGF0IHVuaXF1ZS4KLSAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCJfIikuYXBwZW5kKG5hbWVBcnJheS5sZW5ndGgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVGhlIG1hcHBpbmcgaW5kaWNhdGVzIHRvIHNraXAgb3ZlcgotICAgICAgICAvLyBhbGwgY2hhcmFjdGVycyB0aGF0IGFyZSBub3QgbGV0dGVycyBvcgotICAgICAgICAvLyBkaWdpdHMuICBUaGUgZmlyc3QgbGV0dGVyL2RpZ2l0Ci0gICAgICAgIC8vIGZvbGxvd2luZyBhIHNraXBwZWQgY2hhcmFjdGVyIGlzCi0gICAgICAgIC8vIHVwcGVyLWNhc2VkLgotICAgICAgICBmb3IgKCsraTsgaSA8IG5hbWVMZW47ICsraSkgewotICAgICAgICAgICAgY2hhciBjID0gbmFtZUFycmF5W2ldOwotCi0gICAgICAgICAgICAvLyBpZiB0aGlzIGlzIGEgYmFkIGNoYXIsIHNraXAgaXQgYW5kIHJlbWVtYmVyIHRvIGNhcGl0YWxpemUgbmV4dAotICAgICAgICAgICAgLy8gZ29vZCBjaGFyYWN0ZXIgd2UgZW5jb3VudGVyCi0gICAgICAgICAgICBpZiAoaXNQdW5jdHVhdGlvbihjKSB8fCAhQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJQYXJ0KGMpKSB7Ci0gICAgICAgICAgICAgICAgd29yZFN0YXJ0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh3b3JkU3RhcnQgJiYgQ2hhcmFjdGVyLmlzTG93ZXJDYXNlKGMpKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChDaGFyYWN0ZXIudG9VcHBlckNhc2UoYykpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSWYgYyBpcyBub3QgYSBjaGFyYWN0ZXIsIGJ1dCBpcyBhIGxlZ2FsIEphdmEKLSAgICAgICAgICAgIC8vIGlkZW50aWZpZXIgY2hhcmFjdGVyLCBjYXBpdGFsaXplIHRoZSBuZXh0IGNoYXJhY3Rlci4KLSAgICAgICAgICAgIC8vIEZvciBleGFtcGxlOiAgIjIyaGkiIGJlY29tZXMgIjIySGkiCi0gICAgICAgICAgICAvL3dvcmRTdGFydCA9ICFDaGFyYWN0ZXIuaXNMZXR0ZXIoYyk7Ci0gICAgICAgICAgICB3b3JkU3RhcnQgPSAhQ2hhcmFjdGVyLmlzTGV0dGVyKGMpICYmIGMgIT0gIl8iLmNoYXJBdCgwKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNvdmVydCBiYWNrIHRvIGEgU3RyaW5nCi0gICAgICAgIFN0cmluZyBuZXdOYW1lID0gcmVzdWx0LnRvU3RyaW5nKCk7Ci0KLSAgICAgICAgLy8gY2hlY2sgZm9yIEphdmEga2V5d29yZHMKLSAgICAgICAgaWYgKGlzSmF2YUtleXdvcmQobmV3TmFtZSkpIHsKLSAgICAgICAgICAgIG5ld05hbWUgPSBtYWtlTm9uSmF2YUtleXdvcmQobmV3TmFtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbmV3TmFtZTsKLSAgICB9IC8vIHhtbE5hbWVUb0phdmEKLQotICAgIC8qKgotICAgICAqIENhcGl0YWxpemVzIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIG5hbWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZQotICAgICAqIEByZXR1cm4gUmV0dXJucyBTdHJpbmcuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY2FwaXRhbGl6ZUZpcnN0Q2hhcihTdHJpbmcgbmFtZSkgewotCi0gICAgICAgIGlmICgobmFtZSA9PSBudWxsKSB8fCBuYW1lLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiBuYW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgY2hhciBzdGFydCA9IG5hbWUuY2hhckF0KDApOwotCi0gICAgICAgIGlmIChDaGFyYWN0ZXIuaXNMb3dlckNhc2Uoc3RhcnQpKSB7Ci0gICAgICAgICAgICBzdGFydCA9IENoYXJhY3Rlci50b1VwcGVyQ2FzZShzdGFydCk7Ci0KLSAgICAgICAgICAgIHJldHVybiBzdGFydCArIG5hbWUuc3Vic3RyaW5nKDEpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfSAgICAvLyBjYXBpdGFsaXplRmlyc3RDaGFyCi0KLSAgICAvKioKLSAgICAgKiBjb252ZXJ0cyBhbiB4bWwgbmFtZSB0byBhIGphdmEgaWRlbnRpZmllcgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUKLSAgICAgKiBAcmV0dXJuIGphdmEgaWRlbnRpZmllcgotICAgICAqLwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgeG1sTmFtZVRvSmF2YUlkZW50aWZpZXIoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgU3RyaW5nIGphdmFOYW1lID0geG1sTmFtZVRvSmF2YShuYW1lKTsKLSAgICAgICAgLy8gY29udmVydCB0aGUgZmlyc3QgbGV0dGVyIHRvIGxvd2VyY2FzZQotICAgICAgICBpZiAoKGphdmFOYW1lICE9IG51bGwpICYmIChqYXZhTmFtZS5sZW5ndGgoKSA+IDApKSB7Ci0gICAgICAgICAgICBqYXZhTmFtZSA9IGphdmFOYW1lLnN1YnN0cmluZygwLCAxKS50b0xvd2VyQ2FzZSgpICsgamF2YU5hbWUuc3Vic3RyaW5nKDEpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGphdmFOYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHRoZSBTdHJpbmcgJ3ZhbHVlJzoKLSAgICAgKiByZXR1cm4gJ2ZhbHNlJyBpZiBpdHMgJ2ZhbHNlJywgJzAnLCBvciAnbm8nIC0gZWxzZSAndHJ1ZScKLSAgICAgKiA8cC8+Ci0gICAgICogRm9sbG93IGluICdDJyB0cmFkaXRpb24gb2YgYm9vbGVhbiB2YWx1ZXM6Ci0gICAgICogZmFsc2UgaXMgc3BlY2lmaWMgKDApLCBldmVyeXRoaW5nIGVsc2UgaXMgdHJ1ZTsKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNUcnVlKFN0cmluZyB2YWx1ZSkgewotICAgICAgICByZXR1cm4gIWlzRmFsc2VFeHBsaWNpdGx5KHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyB0aGUgU3RyaW5nICd2YWx1ZSc6Ci0gICAgICogcmV0dXJuICd0cnVlJyBpZiBpdHMgJ3RydWUnLCAnMScsIG9yICd5ZXMnIC0gZWxzZSAnZmFsc2UnCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVHJ1ZUV4cGxpY2l0bHkoU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiB2YWx1ZSAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgKHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUuZXF1YWxzKCIxIikgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoInllcyIpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyB0aGUgT2JqZWN0ICd2YWx1ZSc6Ci0gICAgICogaWYgaXRzIG51bGwsIHJldHVybiBkZWZhdWx0LgotICAgICAqIGlmIGl0cyBhIEJvb2xlYW4sIHJldHVybiBib29sZWFuVmFsdWUoKQotICAgICAqIGlmIGl0cyBhbiBJbnRlZ2VyLCAgcmV0dXJuICdmYWxzZScgaWYgaXRzICcwJyBlbHNlICd0cnVlJwotICAgICAqIGlmIGl0cyBhIFN0cmluZywgcmV0dXJuIGlzVHJ1ZUV4cGxpY2l0bHkoKFN0cmluZyl2YWx1ZSkuCi0gICAgICogQWxsIG90aGVyIHR5cGVzIHJldHVybiAndHJ1ZScKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNUcnVlRXhwbGljaXRseShPYmplY3QgdmFsdWUsIGJvb2xlYW4gZGVmYXVsdFZhbCkgewotICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgQm9vbGVhbikgewotICAgICAgICAgICAgcmV0dXJuICgoQm9vbGVhbikgdmFsdWUpLmJvb2xlYW5WYWx1ZSgpOwotICAgICAgICB9Ci0gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEludGVnZXIpIHsKLSAgICAgICAgICAgIHJldHVybiAoKEludGVnZXIpIHZhbHVlKS5pbnRWYWx1ZSgpICE9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0gICAgICAgICAgICByZXR1cm4gaXNUcnVlRXhwbGljaXRseSgoU3RyaW5nKSB2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWw7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVHJ1ZUV4cGxpY2l0bHkoT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBpc1RydWVFeHBsaWNpdGx5KHZhbHVlLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgdGhlIE9iamVjdCAndmFsdWUnOgotICAgICAqIGlmIGl0cyBudWxsLCByZXR1cm4gZGVmYXVsdC4KLSAgICAgKiBpZiBpdHMgYSBCb29sZWFuLCByZXR1cm4gYm9vbGVhblZhbHVlKCkKLSAgICAgKiBpZiBpdHMgYW4gSW50ZWdlciwgIHJldHVybiAnZmFsc2UnIGlmIGl0cyAnMCcgZWxzZSAndHJ1ZScKLSAgICAgKiBpZiBpdHMgYSBTdHJpbmcsIHJldHVybiAnZmFsc2UnIGlmIGl0cyAnZmFsc2UnLCAnbm8nLCBvciAnMCcgLSBlbHNlICd0cnVlJwotICAgICAqIEFsbCBvdGhlciB0eXBlcyByZXR1cm4gJ3RydWUnCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVHJ1ZShPYmplY3QgdmFsdWUsIGJvb2xlYW4gZGVmYXVsdFZhbCkgewotICAgICAgICByZXR1cm4gIWlzRmFsc2VFeHBsaWNpdGx5KHZhbHVlLCAhZGVmYXVsdFZhbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVHJ1ZShPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIGlzVHJ1ZSh2YWx1ZSwgZmFsc2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHRoZSBTdHJpbmcgJ3ZhbHVlJzoKLSAgICAgKiByZXR1cm4gJ3RydWUnIGlmIGl0cyAnZmFsc2UnLCAnMCcsIG9yICdubycgLSBlbHNlICdmYWxzZScKLSAgICAgKiA8cC8+Ci0gICAgICogRm9sbG93IGluICdDJyB0cmFkaXRpb24gb2YgYm9vbGVhbiB2YWx1ZXM6Ci0gICAgICogZmFsc2UgaXMgc3BlY2lmaWMgKDApLCBldmVyeXRoaW5nIGVsc2UgaXMgdHJ1ZTsKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNGYWxzZShTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIGlzRmFsc2VFeHBsaWNpdGx5KHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyB0aGUgU3RyaW5nICd2YWx1ZSc6Ci0gICAgICogcmV0dXJuICd0cnVlJyBpZiBpdHMgbnVsbCwgJ2ZhbHNlJywgJzAnLCBvciAnbm8nIC0gZWxzZSAnZmFsc2UnCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzRmFsc2VFeHBsaWNpdGx5KFN0cmluZyB2YWx1ZSkgewotICAgICAgICByZXR1cm4gdmFsdWUgPT0gbnVsbCB8fAotICAgICAgICAgICAgICAgIHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoImZhbHNlIikgfHwKLSAgICAgICAgICAgICAgICB2YWx1ZS5lcXVhbHMoIjAiKSB8fAotICAgICAgICAgICAgICAgIHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoIm5vIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgdGhlIE9iamVjdCAndmFsdWUnOgotICAgICAqIGlmIGl0cyBudWxsLCByZXR1cm4gZGVmYXVsdC4KLSAgICAgKiBpZiBpdHMgYSBCb29sZWFuLCByZXR1cm4gIWJvb2xlYW5WYWx1ZSgpCi0gICAgICogaWYgaXRzIGFuIEludGVnZXIsICByZXR1cm4gJ3RydWUnIGlmIGl0cyAnMCcgZWxzZSAnZmFsc2UnCi0gICAgICogaWYgaXRzIGEgU3RyaW5nLCByZXR1cm4gaXNGYWxzZUV4cGxpY2l0bHkoKFN0cmluZyl2YWx1ZSkuCi0gICAgICogQWxsIG90aGVyIHR5cGVzIHJldHVybiAnZmFsc2UnCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzRmFsc2VFeHBsaWNpdGx5KE9iamVjdCB2YWx1ZSwgYm9vbGVhbiBkZWZhdWx0VmFsKSB7Ci0gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbDsKLSAgICAgICAgfQotICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBCb29sZWFuKSB7Ci0gICAgICAgICAgICByZXR1cm4gISgoQm9vbGVhbikgdmFsdWUpLmJvb2xlYW5WYWx1ZSgpOwotICAgICAgICB9Ci0gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEludGVnZXIpIHsKLSAgICAgICAgICAgIHJldHVybiAoKEludGVnZXIpIHZhbHVlKS5pbnRWYWx1ZSgpID09IDA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0gICAgICAgICAgICByZXR1cm4gaXNGYWxzZUV4cGxpY2l0bHkoKFN0cmluZykgdmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNGYWxzZUV4cGxpY2l0bHkoT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBpc0ZhbHNlRXhwbGljaXRseSh2YWx1ZSwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgdGhlIE9iamVjdCAndmFsdWUnOgotICAgICAqIGlmIGl0cyBudWxsLCByZXR1cm4gZGVmYXVsdC4KLSAgICAgKiBpZiBpdHMgYSBCb29sZWFuLCByZXR1cm4gYm9vbGVhblZhbHVlKCkKLSAgICAgKiBpZiBpdHMgYW4gSW50ZWdlciwgIHJldHVybiAnZmFsc2UnIGlmIGl0cyAnMCcgZWxzZSAndHJ1ZScKLSAgICAgKiBpZiBpdHMgYSBTdHJpbmcsIHJldHVybiAnZmFsc2UnIGlmIGl0cyAnZmFsc2UnLCAnbm8nLCBvciAnMCcgLSBlbHNlICd0cnVlJwotICAgICAqIEFsbCBvdGhlciB0eXBlcyByZXR1cm4gJ3RydWUnCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzRmFsc2UoT2JqZWN0IHZhbHVlLCBib29sZWFuIGRlZmF1bHRWYWwpIHsKLSAgICAgICAgcmV0dXJuIGlzRmFsc2VFeHBsaWNpdGx5KHZhbHVlLCBkZWZhdWx0VmFsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNGYWxzZShPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIGlzRmFsc2UodmFsdWUsIHRydWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0phdmFJZChTdHJpbmcgaWQpIHsKLSAgICAgICAgaWYgKGlkID09IG51bGwgfHwgaWQubGVuZ3RoKCkgPT0gMCB8fCBpc0phdmFLZXl3b3JkKGlkKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGlmICghQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJTdGFydChpZC5jaGFyQXQoMCkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBpZC5sZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoIUNoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyUGFydChpZC5jaGFyQXQoaSkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFuIGVtcHR5IGltbXV0YWJsZSA8Y29kZT5TdHJpbmc8L2NvZGU+IGFycmF5LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gRU1QVFlfU1RSSU5HX0FSUkFZID0gbmV3IFN0cmluZ1swXTsKLQotICAgIC8qKgotICAgICAqIDxwPlNwbGl0cyB0aGUgcHJvdmlkZWQgdGV4dCBpbnRvIGFuIGFycmF5LCBzZXBhcmF0b3Igc3BlY2lmaWVkLgotICAgICAqIFRoaXMgaXMgYW4gYWx0ZXJuYXRpdmUgdG8gdXNpbmcgU3RyaW5nVG9rZW5pemVyLjwvcD4KLSAgICAgKiA8cC8+Ci0gICAgICogPHA+VGhlIHNlcGFyYXRvciBpcyBub3QgaW5jbHVkZWQgaW4gdGhlIHJldHVybmVkIFN0cmluZyBhcnJheS4KLSAgICAgKiBBZGphY2VudCBzZXBhcmF0b3JzIGFyZSB0cmVhdGVkIGFzIG9uZSBzZXBhcmF0b3IuPC9wPgotICAgICAqIDxwLz4KLSAgICAgKiA8cD5BIDxjb2RlPm51bGw8L2NvZGU+IGlucHV0IFN0cmluZyByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+LjwvcD4KLSAgICAgKiA8cC8+Ci0gICAgICogPHByZT4KLSAgICAgKiBTdHJpbmdVdGlscy5zcGxpdChudWxsLCAqKSAgICAgICAgID0gbnVsbAotICAgICAqIFN0cmluZ1V0aWxzLnNwbGl0KCIiLCAqKSAgICAgICAgICAgPSBbXQotICAgICAqIFN0cmluZ1V0aWxzLnNwbGl0KCJhLmIuYyIsICcuJykgICAgPSBbImEiLCAiYiIsICJjIl0KLSAgICAgKiBTdHJpbmdVdGlscy5zcGxpdCgiYS4uYi5jIiwgJy4nKSAgID0gWyJhIiwgImIiLCAiYyJdCi0gICAgICogU3RyaW5nVXRpbHMuc3BsaXQoImE6YjpjIiwgJy4nKSAgICA9IFsiYTpiOmMiXQotICAgICAqIFN0cmluZ1V0aWxzLnNwbGl0KCJhXHRiXG5jIiwgbnVsbCkgPSBbImEiLCAiYiIsICJjIl0KLSAgICAgKiBTdHJpbmdVdGlscy5zcGxpdCgiYSBiIGMiLCAnICcpICAgID0gWyJhIiwgImIiLCAiYyJdCi0gICAgICogPC9wcmU+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gc3RyICAgICAgICAgICB0aGUgU3RyaW5nIHRvIHBhcnNlLCBtYXkgYmUgbnVsbAotICAgICAqIEBwYXJhbSBzZXBhcmF0b3JDaGFyIHRoZSBjaGFyYWN0ZXIgdXNlZCBhcyB0aGUgZGVsaW1pdGVyLAotICAgICAqICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IHNwbGl0cyBvbiB3aGl0ZXNwYWNlCi0gICAgICogQHJldHVybiBhbiBhcnJheSBvZiBwYXJzZWQgU3RyaW5ncywgPGNvZGU+bnVsbDwvY29kZT4gaWYgbnVsbCBTdHJpbmcgaW5wdXQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZ1tdIHNwbGl0KFN0cmluZyBzdHIsIGNoYXIgc2VwYXJhdG9yQ2hhcikgewotICAgICAgICBpZiAoc3RyID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGludCBsZW4gPSBzdHIubGVuZ3RoKCk7Ci0gICAgICAgIGlmIChsZW4gPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIEVNUFRZX1NUUklOR19BUlJBWTsKLSAgICAgICAgfQotICAgICAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGludCBpID0gMCwgc3RhcnQgPSAwOwotICAgICAgICBib29sZWFuIG1hdGNoID0gZmFsc2U7Ci0gICAgICAgIHdoaWxlIChpIDwgbGVuKSB7Ci0gICAgICAgICAgICBpZiAoc3RyLmNoYXJBdChpKSA9PSBzZXBhcmF0b3JDaGFyKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1hdGNoKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxpc3QuYWRkKHN0ci5zdWJzdHJpbmcoc3RhcnQsIGkpKTsKLSAgICAgICAgICAgICAgICAgICAgbWF0Y2ggPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc3RhcnQgPSArK2k7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaCA9IHRydWU7Ci0gICAgICAgICAgICBpKys7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1hdGNoKSB7Ci0gICAgICAgICAgICBsaXN0LmFkZChzdHIuc3Vic3RyaW5nKHN0YXJ0LCBpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIChTdHJpbmdbXSkgbGlzdC50b0FycmF5KG5ldyBTdHJpbmdbbGlzdC5zaXplKCldKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIENsYXNzIGdldFdyYXBwZXJDbGFzcyhDbGFzcyBwcmltaXRpdmUpIHsKLSAgICAgICAgaWYgKHByaW1pdGl2ZSA9PSBpbnQuY2xhc3MpIHsKLSAgICAgICAgICAgIHJldHVybiBqYXZhLmxhbmcuSW50ZWdlci5jbGFzczsKLSAgICAgICAgfSBlbHNlIGlmIChwcmltaXRpdmUgPT0gc2hvcnQuY2xhc3MpIHsKLSAgICAgICAgICAgIHJldHVybiBqYXZhLmxhbmcuU2hvcnQuY2xhc3M7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJpbWl0aXZlID09IGJvb2xlYW4uY2xhc3MpIHsKLSAgICAgICAgICAgIHJldHVybiBqYXZhLmxhbmcuQm9vbGVhbi5jbGFzczsKLSAgICAgICAgfSBlbHNlIGlmIChwcmltaXRpdmUgPT0gYnl0ZS5jbGFzcykgewotICAgICAgICAgICAgcmV0dXJuIGphdmEubGFuZy5CeXRlLmNsYXNzOwotICAgICAgICB9IGVsc2UgaWYgKHByaW1pdGl2ZSA9PSBsb25nLmNsYXNzKSB7Ci0gICAgICAgICAgICByZXR1cm4gamF2YS5sYW5nLkxvbmcuY2xhc3M7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJpbWl0aXZlID09IGRvdWJsZS5jbGFzcykgewotICAgICAgICAgICAgcmV0dXJuIGphdmEubGFuZy5Eb3VibGUuY2xhc3M7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJpbWl0aXZlID09IGZsb2F0LmNsYXNzKSB7Ci0gICAgICAgICAgICByZXR1cm4gamF2YS5sYW5nLkZsb2F0LmNsYXNzOwotICAgICAgICB9IGVsc2UgaWYgKHByaW1pdGl2ZSA9PSBjaGFyLmNsYXNzKSB7Ci0gICAgICAgICAgICByZXR1cm4gamF2YS5sYW5nLkNoYXJhY3Rlci5jbGFzczsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQ2xhc3MgZ2V0V3JhcHBlckNsYXNzKFN0cmluZyBwcmltaXRpdmUpIHsKLSAgICAgICAgaWYgKHByaW1pdGl2ZS5lcXVhbHMoImludCIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gamF2YS5sYW5nLkludGVnZXIuY2xhc3M7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJpbWl0aXZlLmVxdWFscygic2hvcnQiKSkgewotICAgICAgICAgICAgcmV0dXJuIGphdmEubGFuZy5TaG9ydC5jbGFzczsKLSAgICAgICAgfSBlbHNlIGlmIChwcmltaXRpdmUuZXF1YWxzKCJib29sZWFuIikpIHsKLSAgICAgICAgICAgIHJldHVybiBqYXZhLmxhbmcuQm9vbGVhbi5jbGFzczsKLSAgICAgICAgfSBlbHNlIGlmIChwcmltaXRpdmUuZXF1YWxzKCJieXRlIikpIHsKLSAgICAgICAgICAgIHJldHVybiBqYXZhLmxhbmcuQnl0ZS5jbGFzczsKLSAgICAgICAgfSBlbHNlIGlmIChwcmltaXRpdmUuZXF1YWxzKCJsb25nIikpIHsKLSAgICAgICAgICAgIHJldHVybiBqYXZhLmxhbmcuTG9uZy5jbGFzczsKLSAgICAgICAgfSBlbHNlIGlmIChwcmltaXRpdmUuZXF1YWxzKCJkb3VibGUiKSkgewotICAgICAgICAgICAgcmV0dXJuIGphdmEubGFuZy5Eb3VibGUuY2xhc3M7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJpbWl0aXZlLmVxdWFscygiZmxvYXQiKSkgewotICAgICAgICAgICAgcmV0dXJuIGphdmEubGFuZy5GbG9hdC5jbGFzczsKLSAgICAgICAgfSBlbHNlIGlmIChwcmltaXRpdmUuZXF1YWxzKCJjaGFyIikpIHsKLSAgICAgICAgICAgIHJldHVybiBqYXZhLmxhbmcuQ2hhcmFjdGVyLmNsYXNzOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2NhbnMgdGhlIHBhcmFtZXRlciBzdHJpbmcgZm9yIHRoZSBwYXJhbWV0ZXIgc2VhcmNoIGlnbm9yaW5nIGNhc2Ugd2hlbgotICAgICAqIGNvbXBhcmluZyBjaGFyYWN0ZXJzLgotICAgICAqCi0gICAgICogQHBhcmFtIHN0cmluZwotICAgICAqIEBwYXJhbSBzZWFyY2ggSWYgdGVzdCBpcyBlbXB0eSAtMSBpcyBhbHdheXMgcmV0dXJuZWQuCi0gICAgICogQHJldHVybiAtMSBpZiB0aGUgc3RyaW5nIHdhcyBub3QgZm91bmQgb3IgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBtYXRjaGluZwotICAgICAqICAgICAgICAgY2hhcmFjdGVyCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBpbnQgaW5kZXhPZklnbm9yZUNhc2UoZmluYWwgU3RyaW5nIHN0cmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgc2VhcmNoKSB7Ci0gICAgICAgIGludCBpbmRleCA9IC0xOwotICAgICAgICBmaW5hbCBpbnQgc3RyaW5nTGVuZ3RoID0gc3RyaW5nLmxlbmd0aCgpOwotICAgICAgICBmaW5hbCBpbnQgdGVzdExlbmd0aCA9IHNlYXJjaC5sZW5ndGgoKTsKLSAgICAgICAgaWYgKHN0cmluZ0xlbmd0aCA+IDEgfHwgdGVzdExlbmd0aCA+IDEpIHsKLSAgICAgICAgICAgIGZpbmFsIGNoYXIgZmlyc3RDaGFyT2ZUZXN0ID0gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKHNlYXJjaC5jaGFyQXQoMCkpOwotICAgICAgICAgICAgZmluYWwgaW50IGxhc3RTdHJpbmdDaGFyYWN0ZXJUb0NoZWNrID0gc3RyaW5nTGVuZ3RoIC0gdGVzdExlbmd0aCArIDE7Ci0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGFzdFN0cmluZ0NoYXJhY3RlclRvQ2hlY2s7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChmaXJzdENoYXJPZlRlc3QgPT0gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKHN0cmluZy5jaGFyQXQoaSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGluZGV4ID0gaTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDE7IGogPCB0ZXN0TGVuZ3RoOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGNoYXIgYyA9IHN0cmluZy5jaGFyQXQoaSArIGopOwotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgY2hhciBvdGhlckNoYXIgPSBzZWFyY2guY2hhckF0KGopOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENoYXJhY3Rlci50b0xvd2VyQ2FzZShjKSAhPSBDaGFyYWN0ZXIudG9Mb3dlckNhc2Uob3RoZXJDaGFyKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKC0xICE9IGluZGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaW5kZXg7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIHJlcGxhY2U6IExpa2UgU3RyaW5nLnJlcGxhY2UgZXhjZXB0IHRoYXQgdGhlIG9sZCBuZXcgaXRlbXMgYXJlIHN0cmluZ3MuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSBzdHJpbmcKLSAgICAgKiBAcGFyYW0gb2xkVCBvbGQgdGV4dCB0byByZXBsYWNlCi0gICAgICogQHBhcmFtIG5ld1QgbmV3IHRleHQgdG8gdXNlCi0gICAgICogQHJldHVybiByZXBsYWNlbWVudCBzdHJpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyByZXBsYWNlKFN0cmluZyBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG9sZFQsIFN0cmluZyBuZXdUKSB7Ci0KLSAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkgcmV0dXJuICIiOwotCi0gICAgICAgIC8vIENyZWF0ZSBhIHN0cmluZyBidWZmZXIgdGhhdCBpcyB0d2ljZSBpbml0aWFsIGxlbmd0aC4KLSAgICAgICAgLy8gVGhpcyBpcyBhIGdvb2Qgc3RhcnRpbmcgcG9pbnQuCi0gICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIobmFtZS5sZW5ndGgoKSAqIDIpOwotCi0gICAgICAgIGludCBsZW4gPSBvbGRULmxlbmd0aCgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaW50IHN0YXJ0ID0gMDsKLSAgICAgICAgICAgIGludCBpID0gbmFtZS5pbmRleE9mKG9sZFQsIHN0YXJ0KTsKLQotICAgICAgICAgICAgd2hpbGUgKGkgPj0gMCkgewotICAgICAgICAgICAgICAgIHNiLmFwcGVuZChuYW1lLnN1YnN0cmluZyhzdGFydCwgaSkpOwotICAgICAgICAgICAgICAgIHNiLmFwcGVuZChuZXdUKTsKLSAgICAgICAgICAgICAgICBzdGFydCA9IGkgKyBsZW47Ci0gICAgICAgICAgICAgICAgaSA9IG5hbWUuaW5kZXhPZihvbGRULCBzdGFydCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc3RhcnQgPCBuYW1lLmxlbmd0aCgpKQotICAgICAgICAgICAgICAgIHNiLmFwcGVuZChuYW1lLnN1YnN0cmluZyhzdGFydCkpOwotICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBObyBGRkRDIGNvZGUgbmVlZGVkCi0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhzYik7Ci0gICAgfQotICAgIC8qKgotICAgICAqIEdldCBhIHN0cmluZyBjb250YWluaW5nIHRoZSBzdGFjayBvZiB0aGUgY3VycmVudCBsb2NhdGlvbi4KLSAgICAgKiBOb3RlIFRoaXMgdXRpbGl0eSBpcyB1c2VmdWwgaW4gZGVidWcgc2NlbmFyaW9zIHRvIGR1bXAgb3V0IAotICAgICAqIHRoZSBjYWxsIHN0YWNrLgotICAgICAqCi0gICAgICogQHJldHVybiBTdHJpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjYWxsU3RhY2tUb1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIHN0YWNrVG9TdHJpbmcobmV3IFJ1bnRpbWVFeGNlcHRpb24oKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHN0YWNrIG9mIHRoZSBzcGVjaWZpZWQgZXhjZXB0aW9uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZQotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBzdGFja1RvU3RyaW5nKFRocm93YWJsZSBlKSB7Ci0gICAgICAgIGphdmEuaW8uU3RyaW5nV3JpdGVyIHN3ID0gbmV3IGphdmEuaW8uU3RyaW5nV3JpdGVyKCk7Ci0gICAgICAgIGphdmEuaW8uQnVmZmVyZWRXcml0ZXIgYncgPSBuZXcgamF2YS5pby5CdWZmZXJlZFdyaXRlcihzdyk7Ci0gICAgICAgIGphdmEuaW8uUHJpbnRXcml0ZXIgcHcgPSBuZXcgamF2YS5pby5QcmludFdyaXRlcihidyk7Ci0gICAgICAgIGUucHJpbnRTdGFja1RyYWNlKHB3KTsKLSAgICAgICAgcHcuY2xvc2UoKTsKLSAgICAgICAgU3RyaW5nIHRleHQgPSBzdy5nZXRCdWZmZXIoKS50b1N0cmluZygpOwotICAgICAgICAvLyBKdW1wIHBhc3QgdGhlIHRocm93YWJsZQotICAgICAgICB0ZXh0ID0gdGV4dC5zdWJzdHJpbmcodGV4dC5pbmRleE9mKCJhdCIpKTsKLSAgICAgICAgdGV4dCA9IHJlcGxhY2UodGV4dCwgImF0ICIsICJERUJVR19GUkFNRSA9ICIpOwotICAgICAgICByZXR1cm4gdGV4dDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdXRpbC9Mb2FkZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi91dGlsL0xvYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTNiMjhmLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi91dGlsL0xvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi51dGlsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbjsKLQotLyoqCi0gKiBMb2FkcyByZXNvdXJjZXMgKG9yIGltYWdlcykgZnJvbSB2YXJpb3VzIHNvdXJjZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2FkZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhMb2FkZXIuY2xhc3MpOwotCi0gICAgLyoqCi0gICAgICogU2VhcmNoZXMgZm9yIDxjb2RlPnJlc291cmNlPC9jb2RlPiBpbiBkaWZmZXJlbnQKLSAgICAgKiBwbGFjZXMuIFRoZSBzZWFyY2ggb3JkZXIgaXMgYXMgZm9sbG93czoKLSAgICAgKiA8b2w+Ci0gICAgICogPHA+PGxpPlNlYXJjaCBmb3IgPGNvZGU+cmVzb3VyY2U8L2NvZGU+IHVzaW5nIHRoZSB0aHJlYWQgY29udGV4dAotICAgICAqIGNsYXNzIGxvYWRlciB1bmRlciBKYXZhMi4gSWYgdGhhdCBmYWlscywgc2VhcmNoIGZvcgotICAgICAqIDxjb2RlPnJlc291cmNlPC9jb2RlPiB1c2luZyB0aGUgY2xhc3MgbG9hZGVyIHRoYXQgbG9hZGVkIHRoaXMKLSAgICAgKiBjbGFzcyAoPGNvZGU+TG9hZGVyPC9jb2RlPikuCi0gICAgICogPHA+PGxpPlRyeSBvbmUgbGFzdCB0aW1lIHdpdGgKLSAgICAgKiA8Y29kZT5DbGFzc0xvYWRlci5nZXRTeXN0ZW1SZXNvdXJjZShyZXNvdXJjZSk8L2NvZGU+LCB0aGF0IGlzIGlzCi0gICAgICogdXNpbmcgdGhlIHN5c3RlbSBjbGFzcyBsb2FkZXIgaW4gSkRLIDEuMiBhbmQgdmlydHVhbCBtYWNoaW5lJ3MKLSAgICAgKiBidWlsdC1pbiBjbGFzcyBsb2FkZXIgaW4gSkRLIDEuMS4KLSAgICAgKiA8L29sPgotICAgICAqIDxwLz4KLSAgICAgKgotICAgICAqIEBwYXJhbSByZXNvdXJjZQotICAgICAqIEByZXR1cm4gUmV0dXJucyBVUkwKLSAgICAgKi8KLSAgICBzdGF0aWMgcHVibGljIFVSTCBnZXRSZXNvdXJjZShTdHJpbmcgcmVzb3VyY2UpIHsKLSAgICAgICAgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIgPSBudWxsOwotICAgICAgICBVUkwgdXJsID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIFdlIGNvdWxkIG5vdCBmaW5kIHJlc291cmNlLiBMZXIgdXMgbm93IHRyeSB3aXRoIHRoZQotICAgICAgICAgICAgLy8gY2xhc3Nsb2FkZXIgdGhhdCBsb2FkZWQgdGhpcyBjbGFzcy4KLSAgICAgICAgICAgIGNsYXNzTG9hZGVyID0gZ2V0VENMKCk7Ci0gICAgICAgICAgICBpZiAoY2xhc3NMb2FkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiVHJ5aW5nIHRvIGZpbmQgWyIgKyByZXNvdXJjZSArICJdIHVzaW5nICIgKyBjbGFzc0xvYWRlciArCi0gICAgICAgICAgICAgICAgICAgICAgICAiIGNsYXNzIGxvYWRlci4iKTsKLSAgICAgICAgICAgICAgICB1cmwgPSBjbGFzc0xvYWRlci5nZXRSZXNvdXJjZShyZXNvdXJjZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHVybCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB1cmw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgewotICAgICAgICAgICAgbG9nLndhcm4oIkNhdWdodCBFeGNlcHRpb24gd2hpbGUgaW4gTG9hZGVyLmdldFJlc291cmNlLiBUaGlzIG1heSBiZSBpbm5vY3VvdXMuIiwgdCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBMYXN0IGRpdGNoIGF0dGVtcHQ6IGdldCB0aGUgcmVzb3VyY2UgZnJvbSB0aGUgY2xhc3MgcGF0aC4gSXQKLSAgICAgICAgLy8gbWF5IGJlIHRoZSBjYXNlIHRoYXQgY2xhenogd2FzIGxvYWRlZCBieSB0aGUgRXh0ZW50c2lvbiBjbGFzcwotICAgICAgICAvLyBsb2FkZXIgd2hpY2ggdGhlIHBhcmVudCBvZiB0aGUgc3lzdGVtIGNsYXNzIGxvYWRlci4gSGVuY2UgdGhlCi0gICAgICAgIC8vIGNvZGUgYmVsb3cuCi0gICAgICAgIGxvZy5kZWJ1ZygiVHJ5aW5nIHRvIGZpbmQgWyIgKyByZXNvdXJjZSArICJdIHVzaW5nIENsYXNzTG9hZGVyLmdldFN5c3RlbVJlc291cmNlKCkuIik7Ci0gICAgICAgIHJldHVybiBDbGFzc0xvYWRlci5nZXRTeXN0ZW1SZXNvdXJjZShyZXNvdXJjZSk7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSByZXNvdXJjZSB3aXRoIHRoZSBzcGVjaWZpZWQgY2xhc3MgbG9hZGVyLgotICAgICAqCi0gICAgICogQHBhcmFtIGxvYWRlcgotICAgICAqIEBwYXJhbSByZXNvdXJjZQotICAgICAqIEByZXR1cm4gUmV0dXJucyBVUkwuCi0gICAgICogQHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uCi0gICAgICovCi0gICAgc3RhdGljIHB1YmxpYyBVUkwgZ2V0UmVzb3VyY2UoQ2xhc3NMb2FkZXIgbG9hZGVyLCBTdHJpbmcgcmVzb3VyY2UpCi0gICAgICAgICAgICB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIFVSTCB1cmwgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKGxvYWRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJUcnlpbmcgdG8gZmluZCBbIiArIHJlc291cmNlICsgIl0gdXNpbmcgIiArIGxvYWRlciArICIgY2xhc3MgbG9hZGVyLiIpOwotICAgICAgICAgICAgICAgIHVybCA9IGxvYWRlci5nZXRSZXNvdXJjZShyZXNvdXJjZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHVybCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB1cmw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgewotICAgICAgICAgICAgbG9nLndhcm4oIkNhdWdodCBFeGNlcHRpb24gd2hpbGUgaW4gTG9hZGVyLmdldFJlc291cmNlLiBUaGlzIG1heSBiZSBpbm5vY3VvdXMuIiwgdCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGdldFJlc291cmNlKHJlc291cmNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZWFyY2hlcyBmb3IgPGNvZGU+cmVzb3VyY2U8L2NvZGU+IGluIGRpZmZlcmVudAotICAgICAqIHBsYWNlcy4gVGhlIHNlYXJjaCBvcmRlciBpcyBhcyBmb2xsb3dzOgotICAgICAqIDxvbD4KLSAgICAgKiA8cD48bGk+U2VhcmNoIGZvciA8Y29kZT5yZXNvdXJjZTwvY29kZT4gdXNpbmcgdGhlIHRocmVhZCBjb250ZXh0Ci0gICAgICogY2xhc3MgbG9hZGVyIHVuZGVyIEphdmEyLiBJZiB0aGF0IGZhaWxzLCBzZWFyY2ggZm9yCi0gICAgICogPGNvZGU+cmVzb3VyY2U8L2NvZGU+IHVzaW5nIHRoZSBjbGFzcyBsb2FkZXIgdGhhdCBsb2FkZWQgdGhpcwotICAgICAqIGNsYXNzICg8Y29kZT5Mb2FkZXI8L2NvZGU+KS4KLSAgICAgKiA8cD48bGk+VHJ5IG9uZSBsYXN0IHRpbWUgd2l0aAotICAgICAqIDxjb2RlPkNsYXNzTG9hZGVyLmdldFN5c3RlbVJlc291cmNlQXNTdHJlYW0ocmVzb3VyY2UpPC9jb2RlPiwgdGhhdCBpcyBpcwotICAgICAqIHVzaW5nIHRoZSBzeXN0ZW0gY2xhc3MgbG9hZGVyIGluIEpESyAxLjIgYW5kIHZpcnR1YWwgbWFjaGluZSdzCi0gICAgICogYnVpbHQtaW4gY2xhc3MgbG9hZGVyIGluIEpESyAxLjEuCi0gICAgICogPC9vbD4KLSAgICAgKiA8cC8+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVzb3VyY2UKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgVVJMCi0gICAgICovCi0gICAgc3RhdGljIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRSZXNvdXJjZUFzU3RyZWFtKFN0cmluZyByZXNvdXJjZSkgewotICAgICAgICBDbGFzc0xvYWRlciBjbGFzc0xvYWRlciA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBMZXQncyB0cnkgdGhlIFRocmVhZCBDb250ZXh0IENsYXNzIExvYWRlcgotICAgICAgICAgICAgY2xhc3NMb2FkZXIgPSBnZXRUQ0woKTsKLSAgICAgICAgICAgIGlmIChjbGFzc0xvYWRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJUcnlpbmcgdG8gZmluZCBbIiArIHJlc291cmNlICsgIl0gdXNpbmcgIiArIGNsYXNzTG9hZGVyICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIgY2xhc3MgbG9hZGVyLiIpOwotICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGlzID0gY2xhc3NMb2FkZXIuZ2V0UmVzb3VyY2VBc1N0cmVhbShyZXNvdXJjZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGlzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgICAgIGxvZy53YXJuKCJDYXVnaHQgRXhjZXB0aW9uIHdoaWxlIGluIExvYWRlci5nZXRSZXNvdXJjZUFzU3RyZWFtLiBUaGlzIG1heSBiZSBpbm5vY3VvdXMuIiwgdCk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gV2UgY291bGQgbm90IGZpbmQgcmVzb3VyY2UuIExlciB1cyBub3cgdHJ5IHdpdGggdGhlCi0gICAgICAgICAgICAvLyBjbGFzc2xvYWRlciB0aGF0IGxvYWRlZCB0aGlzIGNsYXNzLgotICAgICAgICAgICAgY2xhc3NMb2FkZXIgPSBMb2FkZXIuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKTsKLSAgICAgICAgICAgIGlmIChjbGFzc0xvYWRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJUcnlpbmcgdG8gZmluZCBbIiArIHJlc291cmNlICsgIl0gdXNpbmcgIiArIGNsYXNzTG9hZGVyICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIgY2xhc3MgbG9hZGVyLiIpOwotICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGlzID0gY2xhc3NMb2FkZXIuZ2V0UmVzb3VyY2VBc1N0cmVhbShyZXNvdXJjZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGlzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgICAgIGxvZy53YXJuKCJDYXVnaHQgRXhjZXB0aW9uIHdoaWxlIGluIExvYWRlci5nZXRSZXNvdXJjZUFzU3RyZWFtLiBUaGlzIG1heSBiZSBpbm5vY3VvdXMuIiwgdCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBMYXN0IGRpdGNoIGF0dGVtcHQ6IGdldCB0aGUgcmVzb3VyY2UgZnJvbSB0aGUgY2xhc3MgcGF0aC4gSXQKLSAgICAgICAgLy8gbWF5IGJlIHRoZSBjYXNlIHRoYXQgY2xhenogd2FzIGxvYWRlZCBieSB0aGUgRXh0ZW50c2lvbiBjbGFzcwotICAgICAgICAvLyBsb2FkZXIgd2hpY2ggdGhlIHBhcmVudCBvZiB0aGUgc3lzdGVtIGNsYXNzIGxvYWRlci4gSGVuY2UgdGhlCi0gICAgICAgIC8vIGNvZGUgYmVsb3cuCi0gICAgICAgIGxvZy5kZWJ1ZygiVHJ5aW5nIHRvIGZpbmQgWyIgKyByZXNvdXJjZSArICJdIHVzaW5nIENsYXNzTG9hZGVyLmdldFN5c3RlbVJlc291cmNlQXNTdHJlYW0oKS4iKTsKLSAgICAgICAgcmV0dXJuIENsYXNzTG9hZGVyLmdldFN5c3RlbVJlc291cmNlQXNTdHJlYW0ocmVzb3VyY2UpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgcmVzb3VyY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIGNsYXNzIGxvYWRlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBsb2FkZXIKLSAgICAgKiBAcGFyYW0gcmVzb3VyY2UKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgVVJMLgotICAgICAqIEB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbgotICAgICAqLwotICAgIHN0YXRpYyBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0UmVzb3VyY2VBc1N0cmVhbShDbGFzc0xvYWRlciBsb2FkZXIsIFN0cmluZyByZXNvdXJjZSkKLSAgICAgICAgICAgIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChsb2FkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiVHJ5aW5nIHRvIGZpbmQgWyIgKyByZXNvdXJjZSArICJdIHVzaW5nICIgKyBsb2FkZXIgKyAiIGNsYXNzIGxvYWRlci4iKTsKLSAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IGxvYWRlci5nZXRSZXNvdXJjZUFzU3RyZWFtKHJlc291cmNlKTsKLSAgICAgICAgICAgICAgICBpZiAoaXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgewotICAgICAgICAgICAgbG9nLndhcm4oIkNhdWdodCBFeGNlcHRpb24gd2hpbGUgaW4gTG9hZGVyLmdldFJlc291cmNlLiBUaGlzIG1heSBiZSBpbm5vY3VvdXMuIiwgdCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGdldFJlc291cmNlQXNTdHJlYW0ocmVzb3VyY2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHRocmVhZCBjb250ZXh0IGNsYXNzIGxvYWRlci4KLSAgICAgKgotICAgICAqIEByZXR1cm4gUmV0dXJucyBDbGFzc0xvYWRlci4KLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24KLSAgICAgKi8KLSAgICBzdGF0aWMgcHJpdmF0ZSBDbGFzc0xvYWRlciBnZXRUQ0woKSB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiAoQ2xhc3NMb2FkZXIpIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkQWN0aW9uPENsYXNzTG9hZGVyPigpIHsKLSAgICAgICAgICAgIHB1YmxpYyBDbGFzc0xvYWRlciBydW4oKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIExvYWRzIHRoZSBzcGVjaWZpZWQgY2xhc3Nsb2FkZXIgYW5kIHRoZW4gZmFsbHMgYmFjayB0byB0aGUgbG9hZENsYXNzLgotICAgICAqCi0gICAgICogQHBhcmFtIGxvYWRlcgotICAgICAqIEBwYXJhbSBjbGF6egotICAgICAqIEByZXR1cm4gUmV0dXJucyBDbGFzcy4KLSAgICAgKiBAdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24KLSAgICAgKi8KLSAgICBzdGF0aWMgcHVibGljIENsYXNzIGxvYWRDbGFzcyhDbGFzc0xvYWRlciBsb2FkZXIsIFN0cmluZyBjbGF6eikgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKGxvYWRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgQ2xhc3MgYyA9IGxvYWRlci5sb2FkQ2xhc3MoY2xhenopOwotICAgICAgICAgICAgICAgIGlmIChjICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZENsYXNzVmVyc2lvbkVycm9yIGUpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhlKTsKLSAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGxvYWRDbGFzcyhjbGF6eik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSWYgcnVubmluZyB1bmRlciBKREsgMS4yLCBsb2FkcyB0aGUgc3BlY2lmaWVkIGNsYXNzIHVzaW5nIHRoZQotICAgICAqIDxjb2RlPlRocmVhZDwvY29kZT4gPGNvZGU+Y29udGV4dENsYXNzTG9hZGVyPC9jb2RlPiAuIElmIHRoYXQKLSAgICAgKiBmYWlscywgdHJ5IENsYXNzLmZvcm5hbWUuCi0gICAgICogPHAvPgotICAgICAqCi0gICAgICogQHBhcmFtIGNsYXp6Ci0gICAgICogQHJldHVybiBSZXR1cm5zIENsYXNzLgotICAgICAqIEB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbgotICAgICAqLwotICAgIHN0YXRpYyBwdWJsaWMgQ2xhc3MgbG9hZENsYXNzKFN0cmluZyBjbGF6eikgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgQ2xhc3NMb2FkZXIgdGNsID0gZ2V0VENMKCk7Ci0KLSAgICAgICAgICAgIGlmICh0Y2wgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIENsYXNzIGMgPSB0Y2wubG9hZENsYXNzKGNsYXp6KTsKLSAgICAgICAgICAgICAgICBpZiAoYyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBjOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRDbGFzc1ZlcnNpb25FcnJvciBlKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoZSk7Ci0gICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKGUpOwotICAgICAgICB9Ci0gICAgICAgIC8vIHdlIHJlYWNoZWQgaGVyZSBiZWNhdXNlIHRjbCB3YXMgbnVsbCBvciBiZWNhdXNlIG9mIGEKLSAgICAgICAgLy8gc2VjdXJpdHkgZXhjZXB0aW9uLCBvciBiZWNhdXNlIGNsYXp6IGNvdWxkIG5vdCBiZSBsb2FkZWQuLi4KLSAgICAgICAgLy8gSW4gYW55IGNhc2Ugd2Ugbm93IHRyeSBvbmUgbW9yZSB0aW1lCi0gICAgICAgIHJldHVybiBDbGFzcy5mb3JOYW1lKGNsYXp6KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdXRpbC9Mb2dnaW5nQ29udHJvbC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvTG9nZ2luZ0NvbnRyb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk3ODEwNi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdXRpbC9Mb2dnaW5nQ29udHJvbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIGEgbW9yZSBlZmZpY2llbnQgbWVhbnMgb2YgY29udHJvbCBvdmVyIGxvZ2dpbmcgdGhhbgotICogZG8gbW9zdCBwcm92aWRlcnMgb2YgdGhlIENvbW1vbidzIGxvZ2dpbmcgQVBJIGF0IHRoZSBjb3N0IG9mIHJ1bnRpbWUKLSAqIGZsZXhpYmlsaXR5LgotICovCi1wdWJsaWMgY2xhc3MgTG9nZ2luZ0NvbnRyb2wgewotICAgIC8qKgotICAgICAqIElmIHRoaXMgZmxhZyBpcyBzZXQgdG8gZmFsc2UgdGhlbiBkZWJ1ZyBtZXNzYWdlcyB3aWxsIG5vdCBiZSBsb2dnZWQsCi0gICAgICogaXJyZXNwZWN0aXZlIG9mIHRoZSBsZXZlbCBzZXQgZm9yIHRoZSBsb2dnZXIgaXRzZWxmLiAgVGhpcyBjYW4gb25seQotICAgICAqIGJlIGNoYW5nZWQgYXMgdGhlIHJlc3VsdCBvZiBhIEpWTSByZXN0YXJ0IG9yIGEgcHVyZ2UgYW5kIHJlbG9hZGluZwotICAgICAqIG9mIHRoaXMgY2xhc3MuCi0gICAgICogPHAvPgotICAgICAqIFVzYWdlOiBpZiAoTG9nZ2luZ0NvbnRyb2wuZGVidWdMb2dnaW5nQWxsb3dlZCAmJiBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkuLi4KLSAgICAgKiBvcgotICAgICAqIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkICYmIGxvZy5pc1RyYWNlRW5hYmxlZCgpKS4uLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBkZWJ1Z0xvZ2dpbmdBbGxvd2VkOwotCi0gICAgc3RhdGljIHsKLSAgICAgICAgU3RyaW5nIHByb3AgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gbmVlZCBkb1ByaXYgdG8gZ2V0IHN5c3RlbSBwcm9wIHdpdGggSjJTIGVuYWJsZWQKLSAgICAgICAgICAgIHByb3AgPSAoU3RyaW5nKSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEFjdGlvbjxTdHJpbmc+KCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gU3lzdGVtLmdldFByb3BlcnR5KCJBeGlzMi5wcm9oaWJpdERlYnVnTG9nZ2luZyIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBTRSkgewotICAgICAgICAgICAgLy9kbyBub3RoaW5nCi0gICAgICAgIH0KLSAgICAgICAgZGVidWdMb2dnaW5nQWxsb3dlZCA9IHByb3AgPT0gbnVsbDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdXRpbC9NZXNzYWdlQ29udGV4dEJ1aWxkZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi91dGlsL01lc3NhZ2VDb250ZXh0QnVpbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjJmYjAwLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi91dGlsL01lc3NhZ2VDb250ZXh0QnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi51dGlsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5VVUlER2VuZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQMTFDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVAxMkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUENvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmF1bHRDb2RlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmF1bHREZXRhaWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYXVsdFJlYXNvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhdWx0U3ViQ29kZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhdWx0VmFsdWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBIZWFkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBIZWFkZXJCbG9jazsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUFByb2Nlc3NpbmdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYXVsdE5vZGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkFkZHJlc3NpbmdDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkFkZHJlc3NpbmdDb25zdGFudHMuRmluYWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkFkZHJlc3NpbmdIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5SZWxhdGVzVG87Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuT3BlcmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pMThuLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuSFRUUENvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuV1NETENvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBNZXNzYWdlQ29udGV4dEJ1aWxkZXIgewotCQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKE1lc3NhZ2VDb250ZXh0QnVpbGRlci5jbGFzcyk7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3ICdyZXNwb25zZScgbWVzc2FnZSBjb250ZXh0IGJhc2VkIG9uIGEgJ3JlcXVlc3QnIG1lc3NhZ2UgY29udGV4dAotICAgICAqIE9ubHkgZGVhbHMgd2l0aCBwcm9wZXJ0aWVzL2ZpZWxkcyB0aGF0IGFyZSB0aGUgc2FtZSBmb3IgYm90aCAnbm9ybWFsJyBhbmQgZmF1bHQgcmVzcG9uc2VzLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIE1lc3NhZ2VDb250ZXh0IGNyZWF0ZVJlc3BvbnNlTWVzc2FnZUNvbnRleHQoTWVzc2FnZUNvbnRleHQgaW5NZXNzYWdlQ29udGV4dCkKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBNZXNzYWdlQ29udGV4dCBuZXdtc2dDdHggPQotICAgICAgICAgICAgICAgIGluTWVzc2FnZUNvbnRleHQuZ2V0Q29uZmlndXJhdGlvbkNvbnRleHQoKS5jcmVhdGVNZXNzYWdlQ29udGV4dCgpOwotCi0gICAgICAgIG5ld21zZ0N0eC5zZXRTZXNzaW9uQ29udGV4dChpbk1lc3NhZ2VDb250ZXh0LmdldFNlc3Npb25Db250ZXh0KCkpOwotICAgICAgICBuZXdtc2dDdHguc2V0VHJhbnNwb3J0SW4oaW5NZXNzYWdlQ29udGV4dC5nZXRUcmFuc3BvcnRJbigpKTsKLSAgICAgICAgbmV3bXNnQ3R4LnNldFRyYW5zcG9ydE91dChpbk1lc3NhZ2VDb250ZXh0LmdldFRyYW5zcG9ydE91dCgpKTsKLSAgICAgICAgbmV3bXNnQ3R4LnNldFNlcnZlclNpZGUoaW5NZXNzYWdlQ29udGV4dC5pc1NlcnZlclNpZGUoKSk7Ci0KLSAgICAgICAgLy8gVE9ETzogU2hvdWxkIHRoaXMgYmUgc3BlY2lmeWluZyAob3IgZGVmYXVsdGluZyB0bykgdGhlICJyZXNwb25zZSIgcmVsYXRpb25zaGlwVHlwZT8/Ci0gICAgICAgIG5ld21zZ0N0eC5hZGRSZWxhdGVzVG8obmV3IFJlbGF0ZXNUbyhpbk1lc3NhZ2VDb250ZXh0LmdldE9wdGlvbnMoKS5nZXRNZXNzYWdlSWQoKSkpOwotCi0gICAgICAgIG5ld21zZ0N0eC5zZXRQcm9wZXJ0eShBZGRyZXNzaW5nQ29uc3RhbnRzLldTX0FERFJFU1NJTkdfVkVSU0lPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluTWVzc2FnZUNvbnRleHQuZ2V0UHJvcGVydHkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3NpbmdDb25zdGFudHMuV1NfQUREUkVTU0lOR19WRVJTSU9OKSk7Ci0gICAgICAgIG5ld21zZ0N0eC5zZXRQcm9wZXJ0eShBZGRyZXNzaW5nQ29uc3RhbnRzLkRJU0FCTEVfQUREUkVTU0lOR19GT1JfT1VUX01FU1NBR0VTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5NZXNzYWdlQ29udGV4dC5nZXRQcm9wZXJ0eSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzc2luZ0NvbnN0YW50cy5ESVNBQkxFX0FERFJFU1NJTkdfRk9SX09VVF9NRVNTQUdFUykpOwotCi0gICAgICAgIG5ld21zZ0N0eC5zZXRQcm9wZXJ0eShXU0RMMkNvbnN0YW50cy5FTkRQT0lOVF9MT0NBTF9OQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5NZXNzYWdlQ29udGV4dC5nZXRQcm9wZXJ0eShXU0RMMkNvbnN0YW50cy5FTkRQT0lOVF9MT0NBTF9OQU1FKSk7Ci0gICAgICAgIG5ld21zZ0N0eC5zZXRQcm9wZXJ0eShDb25zdGFudHMuQVhJU19CSU5ESU5HX09QRVJBVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluTWVzc2FnZUNvbnRleHQuZ2V0UHJvcGVydHkoQ29uc3RhbnRzLkFYSVNfQklORElOR19PUEVSQVRJT04pKTsKLQotICAgICAgICAvLyBTZXR0aW5nIHRoZSBjaGFyYXRlciBzZXQgZW5jb2RpbmcKLSAgICAgICAgbmV3bXNnQ3R4LnNldFByb3BlcnR5KENvbnN0YW50cy5Db25maWd1cmF0aW9uLkNIQVJBQ1RFUl9TRVRfRU5DT0RJTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbk1lc3NhZ2VDb250ZXh0LmdldFByb3BlcnR5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuQ29uZmlndXJhdGlvbi5DSEFSQUNURVJfU0VUX0VOQ09ESU5HKSk7Ci0gICAgICAgIC8vU2V0dGluZyB0aGUgbWVzc2FnZSB0eXBlIHByb3BlcnR5Ci0gICAgICAgIG5ld21zZ0N0eC5zZXRQcm9wZXJ0eShDb25zdGFudHMuQ29uZmlndXJhdGlvbi5NRVNTQUdFX1RZUEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbk1lc3NhZ2VDb250ZXh0LmdldFByb3BlcnR5KENvbnN0YW50cy5Db25maWd1cmF0aW9uLk1FU1NBR0VfVFlQRSkpOwotICAgICAgICBuZXdtc2dDdHguc2V0RG9pbmdSRVNUKGluTWVzc2FnZUNvbnRleHQuaXNEb2luZ1JFU1QoKSk7Ci0KLSAgICAgICAgbmV3bXNnQ3R4LnNldE9wZXJhdGlvbkNvbnRleHQoaW5NZXNzYWdlQ29udGV4dC5nZXRPcGVyYXRpb25Db250ZXh0KCkpOwotCi0gICAgICAgIG5ld21zZ0N0eC5zZXRQcm9wZXJ0eShNZXNzYWdlQ29udGV4dC5UUkFOU1BPUlRfT1VULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5NZXNzYWdlQ29udGV4dC5nZXRQcm9wZXJ0eShNZXNzYWdlQ29udGV4dC5UUkFOU1BPUlRfT1VUKSk7Ci0gICAgICAgIG5ld21zZ0N0eC5zZXRQcm9wZXJ0eShDb25zdGFudHMuT1VUX1RSQU5TUE9SVF9JTkZPLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5NZXNzYWdlQ29udGV4dC5nZXRQcm9wZXJ0eShDb25zdGFudHMuT1VUX1RSQU5TUE9SVF9JTkZPKSk7Ci0KLSAgICAgICAgaGFuZGxlQ29ycmVsYXRpb25JRChpbk1lc3NhZ2VDb250ZXh0LG5ld21zZ0N0eCk7Ci0gICAgICAgIHJldHVybiBuZXdtc2dDdHg7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIE1lc3NhZ2VDb250ZXh0IGZvciB1c2Ugd2l0aCBhIG5vbi1mYXVsdCByZXNwb25zZSBiYXNlZCBvbiBhbiByZXF1ZXN0IE1lc3NhZ2VDb250ZXh0Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBNZXNzYWdlQ29udGV4dCBjcmVhdGVPdXRNZXNzYWdlQ29udGV4dChNZXNzYWdlQ29udGV4dCBpbk1lc3NhZ2VDb250ZXh0KQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0KLSAgICAgICAgLy8gQ3JlYXRlIGEgYmFzaWMgcmVzcG9uc2UgTWVzc2FnZUNvbnRleHQgd2l0aCBiYXNpYyBmaWVsZHMgY29waWVkCi0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG5ld21zZ0N0eCA9IGNyZWF0ZVJlc3BvbnNlTWVzc2FnZUNvbnRleHQoaW5NZXNzYWdlQ29udGV4dCk7Ci0KLSAgICAgICAgLy8gU2ltcGxlIHJlc3BvbnNlIHNvIHNldCBUbyB0byB2YWx1ZSBvZiBpbmJvdW5kIFJlcGx5VG8KLSAgICAgICAgbmV3bXNnQ3R4LnNldFRvKGluTWVzc2FnZUNvbnRleHQuZ2V0UmVwbHlUbygpKTsKLSAgICAgICAgaWYgKG5ld21zZ0N0eC5nZXRUbygpID09IG51bGwpIHsKLSAgICAgICAgICAgIG5ld21zZ0N0eC5zZXRUbyhuZXcgRW5kcG9pbnRSZWZlcmVuY2UoQWRkcmVzc2luZ0NvbnN0YW50cy5GaW5hbC5XU0FfQU5PTllNT1VTX1VSTCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZG8gVGFyZ2V0IFJlc29sdXRpb24KLSAgICAgICAgVGFyZ2V0UmVzb2x2ZXIgdGFyZ2V0UmVzb2x2ZXIgPQotICAgICAgICAgICAgICAgIG5ld21zZ0N0eC5nZXRDb25maWd1cmF0aW9uQ29udGV4dCgpLmdldEF4aXNDb25maWd1cmF0aW9uKCkuZ2V0VGFyZ2V0UmVzb2x2ZXJDaGFpbigpOwotICAgICAgICBpZiAodGFyZ2V0UmVzb2x2ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdGFyZ2V0UmVzb2x2ZXIucmVzb2x2ZVRhcmdldChuZXdtc2dDdHgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gRGV0ZXJtaW5lIFJlcGx5VG8gZm9yIHJlc3BvbnNlIG1lc3NhZ2UuCi0gICAgICAgIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlID0gaW5NZXNzYWdlQ29udGV4dC5nZXRBeGlzU2VydmljZSgpOwotICAgICAgICBpZiAoYXhpc1NlcnZpY2UgIT0gbnVsbCAmJiBDb25zdGFudHMuU0NPUEVfU09BUF9TRVNTSU9OLmVxdWFscyhheGlzU2VydmljZS5nZXRTY29wZSgpKSkgewotICAgICAgICAgICAgLy9JZiB0aGUgd3NhIDIwMDQvMDggKHN1Ym1pc3Npb24pIHNwZWMgaXMgaW4gZWZmZWN0IHVzZSB0aGUgd3NhIGFub255bW91cyBVUkkgYXMgdGhlIGRlZmF1bHQgcmVwbHlUbyB2YWx1ZS4KLSAgICAgICAgICAgIC8vVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSB0aGUgd3NhIG5vbmUgVVJJIGlzIG5vdCBhdmFpbGFibGUgaW4gdGhhdCBzcGVjLgotICAgICAgICAgICAgT2JqZWN0IHZlcnNpb24gPSBpbk1lc3NhZ2VDb250ZXh0LmdldFByb3BlcnR5KEFkZHJlc3NpbmdDb25zdGFudHMuV1NfQUREUkVTU0lOR19WRVJTSU9OKTsKLSAgICAgICAgICAgIGlmIChBZGRyZXNzaW5nQ29uc3RhbnRzLlN1Ym1pc3Npb24uV1NBX05BTUVTUEFDRS5lcXVhbHModmVyc2lvbikpIHsKLSAgICAgICAgICAgICAgICBuZXdtc2dDdHguc2V0UmVwbHlUbygKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBFbmRwb2ludFJlZmVyZW5jZShBZGRyZXNzaW5nQ29uc3RhbnRzLlN1Ym1pc3Npb24uV1NBX0FOT05ZTU9VU19VUkwpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbmV3bXNnQ3R4LnNldFJlcGx5VG8obmV3IEVuZHBvaW50UmVmZXJlbmNlKEFkZHJlc3NpbmdDb25zdGFudHMuRmluYWwuV1NBX05PTkVfVVJJKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG5ld21zZ0N0eC5zZXRNZXNzYWdlSUQoVVVJREdlbmVyYXRvci5nZXRVVUlEKCkpOwotCi0gICAgICAgICAgICAvLyBhZGQgdGhlIHNlcnZpY2UgZ3JvdXAgaWQgYXMgYSByZWZlcmVuY2UgcGFyYW1ldGVyCi0gICAgICAgICAgICBTdHJpbmcgc2VydmljZUdyb3VwQ29udGV4dElkID0gaW5NZXNzYWdlQ29udGV4dC5nZXRTZXJ2aWNlR3JvdXBDb250ZXh0SWQoKTsKLSAgICAgICAgICAgIGlmIChzZXJ2aWNlR3JvdXBDb250ZXh0SWQgIT0gbnVsbCAmJiAhIiIuZXF1YWxzKHNlcnZpY2VHcm91cENvbnRleHRJZCkpIHsKLSAgICAgICAgICAgICAgICBFbmRwb2ludFJlZmVyZW5jZSByZXBseVRvRVBSID0gbmV3bXNnQ3R4LmdldFJlcGx5VG8oKTsKLSAgICAgICAgICAgICAgICByZXBseVRvRVBSLmFkZFJlZmVyZW5jZVBhcmFtZXRlcihuZXcgUU5hbWUoQ29uc3RhbnRzLkFYSVMyX05BTUVTUEFDRV9VUkksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5TRVJWSUNFX0dST1VQX0lELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuQVhJUzJfTkFNRVNQQUNFX1BSRUZJWCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZUdyb3VwQ29udGV4dElkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEVuZHBvaW50UmVmZXJlbmNlIG91dGJvdW5kVG9FUFIgPSBuZXdtc2dDdHguZ2V0VG8oKTsKLSAgICAgICAgICAgIE9iamVjdCB2ZXJzaW9uID0gbmV3bXNnQ3R4LmdldFByb3BlcnR5KEFkZHJlc3NpbmdDb25zdGFudHMuV1NfQUREUkVTU0lOR19WRVJTSU9OKTsKLSAgICAgICAgICAgIGlmIChBZGRyZXNzaW5nQ29uc3RhbnRzLlN1Ym1pc3Npb24uV1NBX05BTUVTUEFDRS5lcXVhbHModmVyc2lvbikgfHwKLSAgICAgICAgICAgICAgICAob3V0Ym91bmRUb0VQUiAhPSBudWxsICYmICFvdXRib3VuZFRvRVBSLmhhc0Fub255bW91c0FkZHJlc3MoKSkpIHsKLSAgICAgICAgICAgICAgICBuZXdtc2dDdHguc2V0TWVzc2FnZUlEKFVVSURHZW5lcmF0b3IuZ2V0VVVJRCgpKTsKLSAgICAgICAgICAgICAgICBuZXdtc2dDdHguc2V0UmVwbHlUbyhuZXcgRW5kcG9pbnRSZWZlcmVuY2UoQWRkcmVzc2luZ0NvbnN0YW50cy5GaW5hbC5XU0FfTk9ORV9VUkkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIFNldCB3c2E6QWN0aW9uIGZvciByZXNwb25zZSBtZXNzYWdlCi0gICAgICAgIC8vIFVzZSBzcGVjaWZpZWQgdmFsdWUgaWYgYXZhaWxhYmxlCi0gICAgICAgIEF4aXNPcGVyYXRpb24gYW8gPSBpbk1lc3NhZ2VDb250ZXh0LmdldEF4aXNPcGVyYXRpb24oKTsKLSAgICAgICAgaWYgKChhbyAhPSBudWxsKSAmJiAoYW8uZ2V0T3V0cHV0QWN0aW9uKCkgIT0gbnVsbCkpIHsKLSAgICAgICAgICAgIG5ld21zZ0N0eC5zZXRXU0FBY3Rpb24oYW8uZ2V0T3V0cHV0QWN0aW9uKCkpOwotICAgICAgICB9IGVsc2UgeyAvLyBJZiBub3QsIHNpbXBseSBjb3B5IHRoZSByZXF1ZXN0IHZhbHVlLiBBbG1vc3QgYWx3YXlzIGludmFsaWQuCi0gICAgICAgICAgICBuZXdtc2dDdHguc2V0V1NBQWN0aW9uKGluTWVzc2FnZUNvbnRleHQuZ2V0V1NBQWN0aW9uKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGFvICE9IG51bGwpewotICAgICAgICAgICBuZXdtc2dDdHguc2V0QXhpc01lc3NhZ2UoYW8uZ2V0TWVzc2FnZShXU0RMQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfT1VUX1ZBTFVFKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBzZXR0aW5nIHRoZSBvdXQgYm91bmQgYmluZGluZyBtZXNzYWdlCi0gICAgICAgIEF4aXNCaW5kaW5nTWVzc2FnZSBpbmJvdW5kQXhpc0JpbmRpbmdNZXNzYWdlCi0gICAgICAgICAgICAgICAgPSAoQXhpc0JpbmRpbmdNZXNzYWdlKWluTWVzc2FnZUNvbnRleHQuZ2V0UHJvcGVydHkoQ29uc3RhbnRzLkFYSVNfQklORElOR19NRVNTQUdFKTsKLSAgICAgICAgaWYgKGluYm91bmRBeGlzQmluZGluZ01lc3NhZ2UgIT0gbnVsbCl7Ci0gICAgICAgICAgICBBeGlzQmluZGluZ09wZXJhdGlvbiBheGlzQmluZGluZ09wZXJhdGlvbiA9IGluYm91bmRBeGlzQmluZGluZ01lc3NhZ2UuZ2V0QXhpc0JpbmRpbmdPcGVyYXRpb24oKTsKLSAgICAgICAgICAgIG5ld21zZ0N0eC5zZXRQcm9wZXJ0eShDb25zdGFudHMuQVhJU19CSU5ESU5HX01FU1NBR0UsCi0gICAgICAgICAgICAgICAgICAgIGF4aXNCaW5kaW5nT3BlcmF0aW9uLmdldENoaWxkKFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9PVVRfVkFMVUUpKTsKLSAgICAgICAgfQotCi0gICAgICAgIG5ld21zZ0N0eC5zZXREb2luZ01UT00oaW5NZXNzYWdlQ29udGV4dC5pc0RvaW5nTVRPTSgpKTsKLSAgICAgICAgbmV3bXNnQ3R4LnNldERvaW5nU3dBKGluTWVzc2FnZUNvbnRleHQuaXNEb2luZ1N3QSgpKTsKLSAgICAgICAgbmV3bXNnQ3R4LnNldFNlcnZpY2VHcm91cENvbnRleHRJZChpbk1lc3NhZ2VDb250ZXh0LmdldFNlcnZpY2VHcm91cENvbnRleHRJZCgpKTsKLQotCi0KLSAgICAgICAgLy8gRW5zdXJlIHRyYW5zcG9ydCBzZXR0aW5ncyBtYXRjaCB0aGUgc2NoZW1lIGZvciB0aGUgVG8gRVBSCi0gICAgICAgIHNldHVwQ29ycmVjdFRyYW5zcG9ydE91dChuZXdtc2dDdHgpOwotICAgICAgICByZXR1cm4gbmV3bXNnQ3R4OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvcGllcyB0aGUgY29ycmVsYXRpb24gaWQgKGptcykgZnJvbSB0aGUgaW4gbWVzc2FnZSBjdHgKLSAgICAgKiB0byB0aGUgb3V0IG1lc3NhZ2UgY3R4LiBDdXJyZW50bHkgdGhpcyBjaGVjayBpcyBmb3Igam1zIAotICAgICAqIG9ubHksIGJ1dCBjYW4gYmUgZXhwYW5kZWQgdG8gb3RoZXIgdHJhbnNwb3J0cyBpZiB0aGUgbmVlZAotICAgICAqIGFyaXNlcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGhhbmRsZUNvcnJlbGF0aW9uSUQoTWVzc2FnZUNvbnRleHQgaW5NZXNzYWdlQ29udGV4dCxNZXNzYWdlQ29udGV4dCBvdXRNZXNzYWdlQ29udGV4dCkgICAgCi0gICAgewotICAgIAlpZiAoaW5NZXNzYWdlQ29udGV4dC5nZXRJbmNvbWluZ1RyYW5zcG9ydE5hbWUoKSE9IG51bGwgJiYKLSAgICAJICAgIGluTWVzc2FnZUNvbnRleHQuZ2V0SW5jb21pbmdUcmFuc3BvcnROYW1lKCkuZXF1YWxzKENvbnN0YW50cy5UUkFOU1BPUlRfSk1TKSkKLSAgICAJewotICAgIAkJbG9nLmRlYnVnKCJJbmNvbWluZyBUcmFuc3BvcnQgaXMgSk1TLCBsZXRzIGNoZWNrIGZvciBKTVMgY29ycmVsYXRpb24gaWQiKTsKLSAgICAJCQotCSAgICAJU3RyaW5nIGNvcnJlbGF0aW9uSWQgPQotCSAgICAgICAgICAgIChTdHJpbmcpIGluTWVzc2FnZUNvbnRleHQuZ2V0UHJvcGVydHkoQ29uc3RhbnRzLkpNU19DT09SRUxBVElPTl9JRCk7Ci0JICAgIAlsb2cuZGVidWcoIkNvcnJlbGF0aW9uIGlkIGlzICIgKyBjb3JyZWxhdGlvbklkKTsKLQkgICAgICAgIGlmIChjb3JyZWxhdGlvbklkICE9IG51bGwgJiYgY29ycmVsYXRpb25JZC5sZW5ndGgoKSA+IDApIHsKLQkgICAgICAgIAlvdXRNZXNzYWdlQ29udGV4dC5zZXRQcm9wZXJ0eShDb25zdGFudHMuSk1TX0NPT1JFTEFUSU9OX0lELCBjb3JyZWxhdGlvbklkKTsKLQkgICAgICAgIH0KLSAgICAJfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB0byBoYW5kbGUgYW55IGVycm9yIHRoYXQgb2NjdXJzIGF0IGluZmxvdyBvciBvdXRmbG93LiBCdXQgaWYgdGhlCi0gICAgICogbWV0aG9kIGlzIGNhbGxlZCB0d2ljZSwgaXQgaW1wbGllcyB0aGF0IHNlbmRpbmcgdGhlIGVycm9yIGhhbmRsaW5nIGhhcyBmYWlsZWQsIGluIHdoaWNoIGNhc2UKLSAgICAgKiB0aGUgbWV0aG9kIGxvZ3MgdGhlIGVycm9yIGFuZCBleGl0cy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE1lc3NhZ2VDb250ZXh0IGNyZWF0ZUZhdWx0TWVzc2FnZUNvbnRleHQoTWVzc2FnZUNvbnRleHQgcHJvY2Vzc2luZ0NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocm93YWJsZSBlKQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIGlmIChwcm9jZXNzaW5nQ29udGV4dC5pc1Byb2Nlc3NpbmdGYXVsdCgpKSB7Ci0gICAgICAgICAgICAvLyBXZSBnZXQgdGhlIGVycm9yIGZpbGUgcHJvY2Vzc2luZyB0aGUgZmF1bHQuIG5vdGhpbmcgd2UgY2FuIGRvCi0gICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KE1lc3NhZ2VzLmdldE1lc3NhZ2UoImVycm9yd2hpbGVQcm9jZXNzaW5nRmF1bHQiKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTZWUgaWYgdGhlIHRocm93YWJsZSBpcyBhbiBBeGlzRmF1bHQgYW5kIGlmIGl0IGFscmVhZHkgY29udGFpbnMgdGhlCi0gICAgICAgIC8vIGZhdWx0IE1lc3NhZ2VDb250ZXh0Ci0gICAgICAgIGlmIChlIGluc3RhbmNlb2YgQXhpc0ZhdWx0KSB7Ci0gICAgICAgICAgICBNZXNzYWdlQ29udGV4dCBmYXVsdE1lc3NhZ2VDb250ZXh0ID0gKChBeGlzRmF1bHQpIGUpLmdldEZhdWx0TWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgICAgIGlmIChmYXVsdE1lc3NhZ2VDb250ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBUaGVzZSBtYXkgbm90IGhhdmUgYmVlbiBzZXQgY29ycmVjdGx5IHdoZW4gdGhlIG9yaWdpbmFsIGNvbnRleHQKLSAgICAgICAgICAgICAgICAvLyB3YXMgY3JlYXRlZCAtLSBhbiBleGFtcGxlIG9mIHRoaXMgaXMgd2l0aCB0aGUgU2ltcGxlSFRUUFNlcnZlci4KLSAgICAgICAgICAgICAgICAvLyBJJ20gbm90IHN1cmUgaWYgdGhpcyBpcyB0aGUgY29ycmVjdCB0aGluZyB0byBkbywgb3IgaWYgdGhlCi0gICAgICAgICAgICAgICAgLy8gY29kZSB0aGF0IGNyZWF0ZWQgdGhpcyBjb250ZXh0IGluIHRoZSBmaXJzdCBwbGFjZSBzaG91bGQKLSAgICAgICAgICAgICAgICAvLyBleHBlY3QgdGhhdCB0aGUgdHJhbnNwb3J0IG91dCBpbmZvIHdhcyBzZXQgY29ycmVjdGx5LCBhcwotICAgICAgICAgICAgICAgIC8vIGl0IG1heSBuZWVkIHRvIHVzZSB0aGF0IGluZm8gYXQgc29tZSBwb2ludCBiZWZvcmUgd2UgZ2V0IHRvCi0gICAgICAgICAgICAgICAgLy8gdGhpcyBjb2RlLgotICAgICAgICAgICAgICAgIGZhdWx0TWVzc2FnZUNvbnRleHQuc2V0UHJvcGVydHkoTWVzc2FnZUNvbnRleHQuVFJBTlNQT1JUX09VVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NpbmdDb250ZXh0LmdldFByb3BlcnR5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlQ29udGV4dC5UUkFOU1BPUlRfT1VUKSk7Ci0gICAgICAgICAgICAgICAgZmF1bHRNZXNzYWdlQ29udGV4dC5zZXRQcm9wZXJ0eShDb25zdGFudHMuT1VUX1RSQU5TUE9SVF9JTkZPLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2luZ0NvbnRleHQuZ2V0UHJvcGVydHkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5PVVRfVFJBTlNQT1JUX0lORk8pKTsKLSAgICAgICAgICAgICAgICBmYXVsdE1lc3NhZ2VDb250ZXh0LnNldFByb2Nlc3NpbmdGYXVsdCh0cnVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmF1bHRNZXNzYWdlQ29udGV4dDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIENyZWF0ZSBhIGJhc2ljIHJlc3BvbnNlIE1lc3NhZ2VDb250ZXh0IHdpdGggYmFzaWMgZmllbGRzIGNvcGllZAotICAgICAgICBNZXNzYWdlQ29udGV4dCBmYXVsdENvbnRleHQgPSBjcmVhdGVSZXNwb25zZU1lc3NhZ2VDb250ZXh0KHByb2Nlc3NpbmdDb250ZXh0KTsKLQotICAgICAgICAvLyBSZWdpc3RlciB0aGUgZmF1bHQgbWVzc2FnZSBjb250ZXh0Ci0gICAgICAgIE9wZXJhdGlvbkNvbnRleHQgb3BlcmF0aW9uQ29udGV4dCA9IHByb2Nlc3NpbmdDb250ZXh0LmdldE9wZXJhdGlvbkNvbnRleHQoKTsKLSAgICAgICAgaWYgKG9wZXJhdGlvbkNvbnRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgcHJvY2Vzc2luZ0NvbnRleHQuZ2V0QXhpc09wZXJhdGlvbigpLmFkZEZhdWx0TWVzc2FnZUNvbnRleHQoZmF1bHRDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uQ29udGV4dCk7Ci0gICAgICAgIH0KLQotICAgICAgICBmYXVsdENvbnRleHQuc2V0UHJvY2Vzc2luZ0ZhdWx0KHRydWUpOwotCi0gICAgICAgIC8vIFNldCB3c2E6QWN0aW9uIGZvciByZXNwb25zZSBtZXNzYWdlCi0gICAgICAgIAotICAgICAgICAvLyBVc2Ugc3BlY2lmaWVkIHZhbHVlIGlmIGF2YWlsYWJsZQotCi0gICAgICAgIFN0cmluZyBmYXVsdEFjdGlvbiA9IChlIGluc3RhbmNlb2YgQXhpc0ZhdWx0KSA/ICgoQXhpc0ZhdWx0KWUpLmdldEZhdWx0QWN0aW9uKCkgOiBudWxsOwotCi0gICAgICAgIGlmIChmYXVsdEFjdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICBBeGlzT3BlcmF0aW9uIG9wID0gcHJvY2Vzc2luZ0NvbnRleHQuZ2V0QXhpc09wZXJhdGlvbigpOwotICAgICAgICAgICAgaWYgKG9wICE9IG51bGwgJiYgb3AuZ2V0RmF1bHRBY3Rpb24oKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETzogU2hvdWxkIHRoZSBvcCBiZSBhYmxlIHRvIHBpY2sgYSBmYXVsdCBhY3Rpb24gYmFzZWQgb24gdGhlIGZhdWx0PwotICAgICAgICAgICAgICAgIGZhdWx0QWN0aW9uID0gb3AuZ2V0RmF1bHRBY3Rpb24oKTsKLSAgICAgICAgICAgIH0gZWxzZSB7IC8vSWYsIGZvciBzb21lIHJlYXNvbiB0aGVyZSBpcyBubyB2YWx1ZSBzZXQsIHNob3VsZCB1c2UgYSBzZW5zaWJsZSBhY3Rpb24uCi0gICAgICAgICAgICAgICAgZmF1bHRBY3Rpb24gPSBGaW5hbC5XU0FfU09BUF9GQVVMVF9BQ1RJT047Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBmYXVsdENvbnRleHQuc2V0V1NBQWN0aW9uKGZhdWx0QWN0aW9uKTsKLQotICAgICAgICAvLyB0aGVyZSBhcmUgc29tZSBpbmZvcm1hdGlvbiAgdGhhdCB0aGUgZmF1bHQgdGhyb3dlciB3YW50cyB0byBwYXNzIHRvIHRoZSBmYXVsdCBwYXRoLgotICAgICAgICAvLyBNZWFucyB0aGF0IHRoZSBmYXVsdCBpcyBhIHdzLWFkZHJlc3Npbmcgb25lIGhlbmNlIHVzZSB0aGUgd3MtYWRkcmVzc2luZyBmYXVsdCBhY3Rpb24uCi0gICAgICAgIE9iamVjdCBmYXVsdEluZm9Gb3JIZWFkZXJzID0KLSAgICAgICAgICAgICAgICBwcm9jZXNzaW5nQ29udGV4dC5nZXRMb2NhbFByb3BlcnR5KENvbnN0YW50cy5GQVVMVF9JTkZPUk1BVElPTl9GT1JfSEVBREVSUyk7Ci0gICAgICAgIGlmIChmYXVsdEluZm9Gb3JIZWFkZXJzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZhdWx0Q29udGV4dC5zZXRQcm9wZXJ0eShDb25zdGFudHMuRkFVTFRfSU5GT1JNQVRJT05fRk9SX0hFQURFUlMsIGZhdWx0SW5mb0ZvckhlYWRlcnMpOwotCi0gICAgICAgICAgICAvLyBOb3RlIHRoYXQgdGhpcyBvdmVycmlkZXMgYW55IGFjdGlvbiBzZXQgYWJvdmUKLSAgICAgICAgICAgIGZhdWx0Q29udGV4dC5zZXRXU0FBY3Rpb24oRmluYWwuV1NBX0ZBVUxUX0FDVElPTik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBpZiB0aGUgZXhjZXB0aW9uIGlzIGR1ZSB0byBhIHByb2JsZW0gaW4gdGhlIGZhdWx0VG8gaGVhZGVyIGl0c2VsZiwgd2UgY2FuIG5vdCB1c2UgdGhhdAotICAgICAgICAvLyBmYXVsdCBpbmZvcm1hdGlvbiB0byBzZW5kIHRoZSBlcnJvci4gVHJ5IHRvIHNlbmQgdXNpbmcgcmVwbHlUbywgZWxzZSBsZWF2ZSBpdCB0byB0cmFuc3BvcnQKLSAgICAgICAgYm9vbGVhbiBzaG91bGRTZW5kRmF1bHRUb0ZhdWx0VG8gPQotICAgICAgICAgICAgICAgIEFkZHJlc3NpbmdIZWxwZXIuc2hvdWxkU2VuZEZhdWx0VG9GYXVsdFRvKHByb2Nlc3NpbmdDb250ZXh0KTsKLSAgICAgICAgRW5kcG9pbnRSZWZlcmVuY2UgZmF1bHRUbyA9IHByb2Nlc3NpbmdDb250ZXh0LmdldEZhdWx0VG8oKTsKLSAgICAgICAgaWYgKGZhdWx0VG8gIT0gbnVsbCAmJiBzaG91bGRTZW5kRmF1bHRUb0ZhdWx0VG8pIHsKLSAgICAgICAgICAgIGZhdWx0Q29udGV4dC5zZXRUbyhmYXVsdFRvKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZhdWx0Q29udGV4dC5zZXRUbyhwcm9jZXNzaW5nQ29udGV4dC5nZXRSZXBseVRvKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGZhdWx0Q29udGV4dC5nZXRUbygpID09IG51bGwpIHsKLSAgICAgICAgICAgIGZhdWx0Q29udGV4dC5zZXRUbyhuZXcgRW5kcG9pbnRSZWZlcmVuY2UoQWRkcmVzc2luZ0NvbnN0YW50cy5GaW5hbC5XU0FfQU5PTllNT1VTX1VSTCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTm90IHdvcnRoIHNldHRpbmcgdXAgdGhlIHNlc3Npb24gaW5mb3JtYXRpb24gb24gYSBmYXVsdCBmbG93Ci0gICAgICAgIEVuZHBvaW50UmVmZXJlbmNlIG91dGJvdW5kVG9FUFIgPSBmYXVsdENvbnRleHQuZ2V0VG8oKTsKLSAgICAgICAgT2JqZWN0IHZlcnNpb24gPSBmYXVsdENvbnRleHQuZ2V0UHJvcGVydHkoQWRkcmVzc2luZ0NvbnN0YW50cy5XU19BRERSRVNTSU5HX1ZFUlNJT04pOwotICAgICAgICBpZiAoQWRkcmVzc2luZ0NvbnN0YW50cy5TdWJtaXNzaW9uLldTQV9OQU1FU1BBQ0UuZXF1YWxzKHZlcnNpb24pIHx8Ci0gICAgICAgICAgICAob3V0Ym91bmRUb0VQUiAhPSBudWxsICYmICFvdXRib3VuZFRvRVBSLmhhc0Fub255bW91c0FkZHJlc3MoKSkpIHsKLSAgICAgICAgICAgIGZhdWx0Q29udGV4dC5zZXRNZXNzYWdlSUQoVVVJREdlbmVyYXRvci5nZXRVVUlEKCkpOwotICAgICAgICAgICAgZmF1bHRDb250ZXh0LnNldFJlcGx5VG8obmV3IEVuZHBvaW50UmVmZXJlbmNlKEFkZHJlc3NpbmdDb25zdGFudHMuRmluYWwuV1NBX05PTkVfVVJJKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBkbyBUYXJnZXQgUmVzb2x1dGlvbgotICAgICAgICBUYXJnZXRSZXNvbHZlciB0YXJnZXRSZXNvbHZlciA9IGZhdWx0Q29udGV4dC5nZXRDb25maWd1cmF0aW9uQ29udGV4dCgpCi0gICAgICAgICAgICAgICAgLmdldEF4aXNDb25maWd1cmF0aW9uKCkuZ2V0VGFyZ2V0UmVzb2x2ZXJDaGFpbigpOwotICAgICAgICBpZiAodGFyZ2V0UmVzb2x2ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdGFyZ2V0UmVzb2x2ZXIucmVzb2x2ZVRhcmdldChmYXVsdENvbnRleHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gRW5zdXJlIHRyYW5zcG9ydCBzZXR0aW5ncyBtYXRjaCB0aGUgc2NoZW1lIGZvciB0aGUgVG8gRVBSCi0gICAgICAgIHNldHVwQ29ycmVjdFRyYW5zcG9ydE91dChmYXVsdENvbnRleHQpOwotCi0gICAgICAgIFNPQVBFbnZlbG9wZSBlbnZlbG9wZSA9IGNyZWF0ZUZhdWx0RW52ZWxvcGUocHJvY2Vzc2luZ0NvbnRleHQsIGUpOwotICAgICAgICBmYXVsdENvbnRleHQuc2V0RW52ZWxvcGUoZW52ZWxvcGUpOwotCi0gICAgICAgIC8vZ2V0IHRoZSBTT0FQIGhlYWRlcnMsIHVzZXIgaXMgdHJ5aW5nIHRvIHNlbmQgaW4gdGhlIGZhdWx0Ci0gICAgICAgIC8vIFRPRE86IFJhdGlvbmFsaXplIHRoaXMgbWVjaGFuaXNtIGEgYml0IC0gbWF5YmUgaGVhZGVycyBzaG91bGQgbGl2ZSBpbiB0aGUgZmF1bHQ/Ci0gICAgICAgIExpc3Qgc29hcEhlYWRlcnNMaXN0ID0KLSAgICAgICAgICAgICAgICAoTGlzdCkgcHJvY2Vzc2luZ0NvbnRleHQuZ2V0UHJvcGVydHkoU09BUENvbnN0YW50cy5IRUFERVJfTE9DQUxfTkFNRSk7Ci0gICAgICAgIGlmIChzb2FwSGVhZGVyc0xpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgU09BUEhlYWRlciBzb2FwSGVhZGVyRWxlbWVudCA9IGVudmVsb3BlLmdldEhlYWRlcigpOwotICAgICAgICAgICAgZm9yIChPYmplY3QgYVNvYXBIZWFkZXJzTGlzdCA6IHNvYXBIZWFkZXJzTGlzdCkgewotICAgICAgICAgICAgICAgIE9NRWxlbWVudCBzb2FwSGVhZGVyQmxvY2sgPSAoT01FbGVtZW50KWFTb2FwSGVhZGVyc0xpc3Q7Ci0gICAgICAgICAgICAgICAgc29hcEhlYWRlckVsZW1lbnQuYWRkQ2hpbGQoc29hcEhlYWRlckJsb2NrKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIFRPRE86IFRyYW5zcG9ydC1zcGVjaWZpYyBzdHVmZiBpbiBoZXJlPyAgV2h5PyAgSXMgdGhlcmUgYSBiZXR0ZXIgd2F5PwotICAgICAgICAvLyBub3cgYWRkIEhUVFAgSGVhZGVycwotICAgICAgICBmYXVsdENvbnRleHQuc2V0UHJvcGVydHkoSFRUUENvbnN0YW50cy5IVFRQX0hFQURFUlMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzaW5nQ29udGV4dC5nZXRQcm9wZXJ0eShIVFRQQ29uc3RhbnRzLkhUVFBfSEVBREVSUykpOwotCi0gICAgICAgIHJldHVybiBmYXVsdENvbnRleHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRW5zdXJlIHRoYXQgaWYgdGhlIHNjaGVtZSBvZiB0aGUgVG8gRVBSIGZvciB0aGUgcmVzcG9uc2UgaXMgZGlmZmVyZW50IHRoYW4gdGhlCi0gICAgICogdHJhbnNwb3J0IHVzZWQgZm9yIHRoZSByZXF1ZXN0IHRoYXQgdGhlIGNvcnJlY3QgVHJhbnNwb3J0T3V0IGlzIGF2YWlsYWJsZQotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgc2V0dXBDb3JyZWN0VHJhbnNwb3J0T3V0KE1lc3NhZ2VDb250ZXh0IGNvbnRleHQpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICAvLyBEZXRlcm1pbmUgdGhhdCB3ZSBoYXZlIHRoZSBjb3JyZWN0IHRyYW5zcG9ydCBhdmFpbGFibGUuCi0gICAgICAgIFRyYW5zcG9ydE91dERlc2NyaXB0aW9uIHRyYW5zcG9ydE91dCA9IGNvbnRleHQuZ2V0VHJhbnNwb3J0T3V0KCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEVuZHBvaW50UmVmZXJlbmNlIHJlc3BvbnNlRVBSID0gY29udGV4dC5nZXRUbygpOwotICAgICAgICAgICAgaWYgKGNvbnRleHQuaXNTZXJ2ZXJTaWRlKCkgJiYgcmVzcG9uc2VFUFIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmICghcmVzcG9uc2VFUFIuaGFzQW5vbnltb3VzQWRkcmVzcygpICYmICFyZXNwb25zZUVQUi5oYXNOb25lQWRkcmVzcygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFVSSSB1cmkgPSBuZXcgVVJJKHJlc3BvbnNlRVBSLmdldEFkZHJlc3MoKSk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBzY2hlbWUgPSB1cmkuZ2V0U2NoZW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgodHJhbnNwb3J0T3V0ID09IG51bGwpIHx8ICF0cmFuc3BvcnRPdXQuZ2V0TmFtZSgpLmVxdWFscyhzY2hlbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWd1cmF0aW9uQ29udGV4dCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0Q29uZmlndXJhdGlvbkNvbnRleHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydE91dCA9IGNvbmZpZ3VyYXRpb25Db250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFRyYW5zcG9ydE91dChzY2hlbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRyYW5zcG9ydE91dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiQ2FuIG5vdCBmaW5kIHRoZSB0cmFuc3BvcnQgc2VuZGVyIDogIiArIHNjaGVtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnNldFRyYW5zcG9ydE91dCh0cmFuc3BvcnRPdXQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb250ZXh0LmdldE9wZXJhdGlvbkNvbnRleHQoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmdldE9wZXJhdGlvbkNvbnRleHQoKS5zZXRQcm9wZXJ0eSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLkRJRkZFUkVOVF9FUFIsIENvbnN0YW50cy5WQUxVRV9UUlVFKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIHVyaXNlKSB7Ci0gICAgICAgICAgICB0aHJvdyBBeGlzRmF1bHQubWFrZUZhdWx0KHVyaXNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluZm9ybWF0aW9uIHRvIGNyZWF0ZSB0aGUgU09BUEZhdWx0IGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBkaWZmZXJlbnQgcGxhY2VzLgotICAgICAqIDEuIFRob3NlIGluZm9ybWF0aW9uIG1heSBoYXZlIGJlZW4gcHV0IGluIHRvIHRoZSBtZXNzYWdlIGNvbnRleHQgYnkgc29tZSBoYW5kbGVyLiBXaGVuIHNvbWVvbmUKLSAgICAgKiBpcyBwdXR0aW5nIGxpa2UgdGhhdCwgaGUgbXVzdCBtYWtlIHN1cmUgdGhlIFNPQVBFbGVtZW50cyBoZSBpcyBwdXR0aW5nIG11c3QgYmUgZnJvbSB0aGUKLSAgICAgKiBjb3JyZWN0IFNPQVAgVmVyc2lvbi4KLSAgICAgKiAyLiBTT0FQUHJvY2Vzc2luZ0V4Y2VwdGlvbiBpcyBmbGV4aWJsZSBlbm91Z2ggdG8gY2FycnkgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGZhdWx0LiBGb3IgZXhhbXBsZQotICAgICAqIGl0IGhhcyBhbiBhdHRyaWJ1dGUgdG8gc3RvcmUgdGhlIGZhdWx0IGNvZGUuIFRoZSBmYXVsdCByZWFzb24gY2FuIGJlIGV4dHJhY3RlZCBmcm9tIHRoZQotICAgICAqIG1lc3NhZ2Ugb2YgdGhlIGV4Y2VwdGlvbi4gSSBvcHRlZCB0byBwdXQgdGhlIHN0YWNrdHJhY2UgdW5kZXIgdGhlIGRldGFpbCBlbGVtZW50LgotICAgICAqIGVnIDogPERldGFpbD4KLSAgICAgKiA8RXhjZXB0aW9uPiBzdGFjayB0cmFjZSBnb2VzIGhlcmUgPC9FeGNlcHRpb24+Ci0gICAgICogPERldGFpbD4KLSAgICAgKiA8cC8+Ci0gICAgICogSWYgdGhvc2UgaW5mb3JtYXRpb24gY2FuIG5vdCBiZSBleHRyYWN0ZWQgZnJvbSBhbnkgb2YgdGhlIGFib3ZlIHBsYWNlcywgSSBkZWZhdWx0IHRoZSBzb2FwCi0gICAgICogZmF1bHQgdmFsdWVzIHRvIGZvbGxvd2luZy4KLSAgICAgKiA8RmF1bHQ+Ci0gICAgICogPENvZGU+Ci0gICAgICogPFZhbHVlPmVudjpSZWNlaXZlcjwvVmFsdWU+Ci0gICAgICogPC9Db2RlPgotICAgICAqIDxSZWFzb24+Ci0gICAgICogPFRleHQ+dW5rbm93bjwvVGV4dD4KLSAgICAgKiA8L1JlYXNvbj4KLSAgICAgKiA8Um9sZS8+Ci0gICAgICogPE5vZGUvPgotICAgICAqIDxEZXRhaWwvPgotICAgICAqIDwvRmF1bHQ+Ci0gICAgICogPHAvPgotICAgICAqIC0tIEVDCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29udGV4dAotICAgICAqIEBwYXJhbSBlCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgU09BUEVudmVsb3BlIGNyZWF0ZUZhdWx0RW52ZWxvcGUoTWVzc2FnZUNvbnRleHQgY29udGV4dCwgVGhyb3dhYmxlIGUpIHsKLSAgICAgICAgU09BUEVudmVsb3BlIGVudmVsb3BlOwotCi0gICAgICAgIGlmIChjb250ZXh0LmlzU09BUDExKCkpIHsKLSAgICAgICAgICAgIGVudmVsb3BlID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDExRmFjdG9yeSgpLmdldERlZmF1bHRGYXVsdEVudmVsb3BlKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBGb2xsb3dpbmcgd2lsbCBtYWtlIFNPQVAgMS4yIGFzIHRoZSBkZWZhdWx0LCB0b28uCi0gICAgICAgICAgICBlbnZlbG9wZSA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMkZhY3RvcnkoKS5nZXREZWZhdWx0RmF1bHRFbnZlbG9wZSgpOwotICAgICAgICB9Ci0gICAgICAgIFNPQVBGYXVsdCBmYXVsdCA9IGVudmVsb3BlLmdldEJvZHkoKS5nZXRGYXVsdCgpOwotCi0gICAgICAgIFNPQVBQcm9jZXNzaW5nRXhjZXB0aW9uIHNvYXBFeGNlcHRpb24gPSBudWxsOwotICAgICAgICBBeGlzRmF1bHQgYXhpc0ZhdWx0ID0gbnVsbDsKLQotICAgICAgICBpZiAoZSA9PSBudWxsKSByZXR1cm4gZW52ZWxvcGU7Ci0KLSAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBBeGlzRmF1bHQpIHsKLSAgICAgICAgICAgIGF4aXNGYXVsdCA9IChBeGlzRmF1bHQpIGU7Ci0gICAgICAgIH0gZWxzZSBpZiAoZS5nZXRDYXVzZSgpIGluc3RhbmNlb2YgQXhpc0ZhdWx0KSB7Ci0gICAgICAgICAgICBheGlzRmF1bHQgPSAoQXhpc0ZhdWx0KSBlLmdldENhdXNlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYXhpc0ZhdWx0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSBheGlzRmF1bHQuaGVhZGVySXRlcmF0b3IoKTsKLSAgICAgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIFNPQVBIZWFkZXJCbG9jayBoZWFkZXIgPSAoU09BUEhlYWRlckJsb2NrKSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBlbnZlbG9wZS5nZXRIZWFkZXIoKS5hZGRDaGlsZChoZWFkZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBTT0FQUHJvY2Vzc2luZ0V4Y2VwdGlvbikgewotICAgICAgICAgICAgc29hcEV4Y2VwdGlvbiA9IChTT0FQUHJvY2Vzc2luZ0V4Y2VwdGlvbikgZTsKLSAgICAgICAgfSBlbHNlIGlmIChheGlzRmF1bHQgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGF4aXNGYXVsdC5nZXRDYXVzZSgpIGluc3RhbmNlb2YgU09BUFByb2Nlc3NpbmdFeGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICBzb2FwRXhjZXB0aW9uID0gKFNPQVBQcm9jZXNzaW5nRXhjZXB0aW9uKSBheGlzRmF1bHQuZ2V0Q2F1c2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIHVzZXIgY2FuIHNldCB0aGUgZmF1bHQgaW5mb3JtYXRpb24gdG8gdGhlIG1lc3NhZ2UgY29udGV4dCBvciB0byB0aGUgQXhpc0ZhdWx0IGl0c2VsZi4KLSAgICAgICAgLy8gd2hhdGV2ZXIgdXNlciBzZXRzIHRvIHRoZSBtZXNzYWdlIGNvbnRleHQsIHN1cGVyY2VkZXMgZWVyeXRoaW5nLgotICAgICAgICAKLSAgICAgICAgT2JqZWN0IGZhdWx0Q29kZSA9IGNvbnRleHQuZ2V0UHJvcGVydHkoU09BUDEyQ29uc3RhbnRzLlNPQVBfRkFVTFRfQ09ERV9MT0NBTF9OQU1FKTsKLSAgICAgICAgU3RyaW5nIHNvYXBGYXVsdENvZGUgPSAiIjsKLQotICAgICAgICBpZiAoZmF1bHRDb2RlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZhdWx0LnNldENvZGUoKFNPQVBGYXVsdENvZGUpIGZhdWx0Q29kZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc29hcEV4Y2VwdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzb2FwRmF1bHRDb2RlID0gc29hcEV4Y2VwdGlvbi5nZXRGYXVsdENvZGUoKTsKLSAgICAgICAgfSBlbHNlIGlmIChheGlzRmF1bHQgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGF4aXNGYXVsdC5nZXRGYXVsdENvZGVFbGVtZW50KCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZhdWx0LnNldENvZGUoYXhpc0ZhdWx0LmdldEZhdWx0Q29kZUVsZW1lbnQoKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFFOYW1lIGZhdWx0Q29kZVFOYW1lID0gYXhpc0ZhdWx0LmdldEZhdWx0Q29kZSgpOwotICAgICAgICAgICAgICAgIGlmIChmYXVsdENvZGVRTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmYXVsdENvZGVRTmFtZS5nZXRMb2NhbFBhcnQoKS5pbmRleE9mKCI6IikgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSBmYXVsdENvZGVRTmFtZS5nZXRQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB1cmkgPSBmYXVsdENvZGVRTmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgc3BlY2lmaWVkIHByZWZpeCBhbmQgdXJpCi0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBwcmVmaXggPT0gbnVsbCA/ICIiIDogcHJlZml4OwotICAgICAgICAgICAgICAgICAgICAgICAgdXJpID0gdXJpID09IG51bGwgfHwgIiIgLmVxdWFscyh1cmkpID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmF1bHQuZ2V0TmFtZXNwYWNlKCkuZ2V0TmFtZXNwYWNlVVJJKCkgOiB1cmk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIHByZWZpeCBhbmQgdXJpIGFyZSBkZWNsYXJlZCBvbiB0aGUgZmF1bHQsIGFuZCAKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgcmVzdWx0aW5nIHByZWZpeC4KLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGZhdWx0LmRlY2xhcmVOYW1lc3BhY2UodXJpLCBwcmVmaXgpLmdldFByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgc29hcEZhdWx0Q29kZSA9IHByZWZpeCArICI6IiArIGZhdWx0Q29kZVFOYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc29hcEZhdWx0Q29kZSA9IGZhdWx0Q29kZVFOYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZGVmYXVsdGluZyB0byBmYXVsdCBjb2RlIFJlY2VpdmVyLCBpZiBubyBtZXNzYWdlIGlzIGF2YWlsYWJsZQotICAgICAgICBpZiAoZmF1bHRDb2RlID09IG51bGwgJiYgY29udGV4dC5nZXRFbnZlbG9wZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNvYXBGYXVsdENvZGUgPSAoIiIuZXF1YWxzKHNvYXBGYXVsdENvZGUpIHx8IChzb2FwRmF1bHRDb2RlID09IG51bGwpKQotICAgICAgICAgICAgICAgICAgICA/IFNPQVAxMkNvbnN0YW50cy5TT0FQX0RFRkFVTFRfTkFNRVNQQUNFX1BSRUZJWCArICI6IiArCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmdldEVudmVsb3BlKCkuZ2V0VmVyc2lvbigpLmdldFJlY2VpdmVyRmF1bHRDb2RlKCkuZ2V0TG9jYWxQYXJ0KCkKLSAgICAgICAgICAgICAgICAgICAgOiBzb2FwRmF1bHRDb2RlOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAoZmF1bHRDb2RlID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChjb250ZXh0LmlzU09BUDExKCkpIHsKLSAgICAgICAgICAgICAgICBmYXVsdC5nZXRDb2RlKCkuc2V0VGV4dChzb2FwRmF1bHRDb2RlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZmF1bHQuZ2V0Q29kZSgpLmdldFZhbHVlKCkuc2V0VGV4dChzb2FwRmF1bHRDb2RlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKGF4aXNGYXVsdCAhPSBudWxsICYmICFjb250ZXh0LmlzU09BUDExKCkpIHsKLSAgICAgICAgICAgIGlmIChheGlzRmF1bHQuZ2V0RmF1bHRTdWJDb2RlcygpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBMaXN0IGZhdWx0U3ViQ29kZXMgPSBheGlzRmF1bHQuZ2V0RmF1bHRTdWJDb2RlcygpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFFOYW1lIGZhdWx0U3ViQ29kZVFOYW1lOwotCi0gICAgICAgICAgICAgICAgZm9yIChPYmplY3QgZmF1bHRTdWJDb2RlIDogZmF1bHRTdWJDb2RlcykgewotCi0gICAgICAgICAgICAgICAgICAgIGZhdWx0U3ViQ29kZVFOYW1lID0gKFFOYW1lKWZhdWx0U3ViQ29kZTsKLQotICAgICAgICAgICAgICAgICAgICBTT0FQRmFjdG9yeSBzZiA9IChTT0FQRmFjdG9yeSllbnZlbG9wZS5nZXRPTUZhY3RvcnkoKTsKLSAgICAgICAgICAgICAgICAgICAgU09BUEZhdWx0U3ViQ29kZSBzb2FwRmF1bHRTdWJDb2RlID0gc2YuY3JlYXRlU09BUEZhdWx0U3ViQ29kZShmYXVsdC5nZXRDb2RlKCkpOwotICAgICAgICAgICAgICAgICAgICBTT0FQRmF1bHRWYWx1ZSBzYW9wRmF1bHRWYWx1ZSA9IHNmLmNyZWF0ZVNPQVBGYXVsdFZhbHVlKGZhdWx0LmdldENvZGUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHNhb3BGYXVsdFZhbHVlLnNldFRleHQoZmF1bHRTdWJDb2RlUU5hbWUpOwotICAgICAgICAgICAgICAgICAgICBzb2FwRmF1bHRTdWJDb2RlLnNldFZhbHVlKHNhb3BGYXVsdFZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgZmF1bHQuZ2V0Q29kZSgpLnNldFN1YkNvZGUoc29hcEZhdWx0U3ViQ29kZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgfSAKLSAgICAgICAgfQotCi0gICAgICAgIFNPQVBGYXVsdFJlYXNvbiBmYXVsdFJlYXNvbiA9IChTT0FQRmF1bHRSZWFzb24pY29udGV4dC5nZXRQcm9wZXJ0eSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09BUDEyQ29uc3RhbnRzLlNPQVBfRkFVTFRfUkVBU09OX0xPQ0FMX05BTUUpOwotCi0gICAgICAgIGlmIChmYXVsdFJlYXNvbiA9PSBudWxsICYmIGF4aXNGYXVsdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmYXVsdFJlYXNvbiA9IGF4aXNGYXVsdC5nZXRGYXVsdFJlYXNvbkVsZW1lbnQoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZmF1bHRSZWFzb24gIT0gbnVsbCkgewotICAgICAgICAgICAgZmF1bHQuc2V0UmVhc29uKGZhdWx0UmVhc29uKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gIiI7Ci0gICAgICAgICAgICBpZiAoc29hcEV4Y2VwdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbWVzc2FnZSA9IHNvYXBFeGNlcHRpb24uZ2V0TWVzc2FnZSgpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChheGlzRmF1bHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIENvdWxkbid0IGZpbmQgRmF1bHRSZWFzb25FbGVtZW50LCB0cnkgcmVhc29uIHN0cmluZwotICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBheGlzRmF1bHQuZ2V0UmVhc29uKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtZXNzYWdlID09IG51bGwgfHwgIiIuZXF1YWxzKG1lc3NhZ2UpKSB7Ci0gICAgICAgICAgICAgICAgbWVzc2FnZSA9IGdldEZhdWx0UmVhc29uRnJvbUV4Y2VwdGlvbihlLCBjb250ZXh0KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1lc3NhZ2UgPT0gbnVsbCB8fCAiIi5lcXVhbHMobWVzc2FnZSkpIG1lc3NhZ2UgPSAidW5rbm93biI7Ci0KLSAgICAgICAgICAgIGlmIChjb250ZXh0LmlzU09BUDExKCkpIHsKLSAgICAgICAgICAgICAgICBmYXVsdC5nZXRSZWFzb24oKS5zZXRUZXh0KG1lc3NhZ2UpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmYXVsdC5nZXRSZWFzb24oKS5nZXRGaXJzdFNPQVBUZXh0KCkuc2V0TGFuZygiZW4tVVMiKTsKLSAgICAgICAgICAgICAgICBmYXVsdC5nZXRSZWFzb24oKS5nZXRGaXJzdFNPQVBUZXh0KCkuc2V0VGV4dChtZXNzYWdlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIE9iamVjdCBmYXVsdFJvbGUgPSBjb250ZXh0LmdldFByb3BlcnR5KFNPQVAxMkNvbnN0YW50cy5TT0FQX0ZBVUxUX1JPTEVfTE9DQUxfTkFNRSk7Ci0gICAgICAgIGlmIChmYXVsdFJvbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgZmF1bHQuZ2V0Um9sZSgpLnNldFRleHQoKFN0cmluZykgZmF1bHRSb2xlKTsKLSAgICAgICAgfSBlbHNlIGlmIChheGlzRmF1bHQgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGF4aXNGYXVsdC5nZXRGYXVsdFJvbGVFbGVtZW50KCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZhdWx0LnNldFJvbGUoYXhpc0ZhdWx0LmdldEZhdWx0Um9sZUVsZW1lbnQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBPYmplY3QgZmF1bHROb2RlID0gY29udGV4dC5nZXRQcm9wZXJ0eShTT0FQMTJDb25zdGFudHMuU09BUF9GQVVMVF9OT0RFX0xPQ0FMX05BTUUpOwotICAgICAgICBpZiAoZmF1bHROb2RlICE9IG51bGwpIHsKLSAgICAgICAgICAgIFNPQVBGYXVsdE5vZGUgc29hcEZhdWx0Tm9kZSA9IGZhdWx0LmdldE5vZGUoKTsKLSAgICAgICAgICAgIGlmKHNvYXBGYXVsdE5vZGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHNvYXBGYXVsdE5vZGUuc2V0VGV4dCgoU3RyaW5nKSBmYXVsdE5vZGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGF4aXNGYXVsdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoYXhpc0ZhdWx0LmdldEZhdWx0Tm9kZUVsZW1lbnQoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZmF1bHQuc2V0Tm9kZShheGlzRmF1bHQuZ2V0RmF1bHROb2RlRWxlbWVudCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIEFsbG93IGhhbmRsZXJzIHRvIG92ZXJyaWRlIHRoZSBzZW5kU3RhY2t0cmFjZURldGFpbHNXaXRoRmF1bHRzIHNldHRpbmcgZnJvbSB0aGUgQ29uZmlndXJhdGlvbiB0byBhbGxvdwotICAgICAgICAvLyBXUy0qIHByb3RvY29sIGZhdWx0cyB0byBub3QgaW5jbHVkZSB0aGUgZXhjZXB0aW9uLgotICAgICAgICBib29sZWFuIHNlbmRTdGFja3RyYWNlRGV0YWlsc1dpdGhGYXVsdHMgPSBmYWxzZTsKLSAgICAgICAgT3BlcmF0aW9uQ29udGV4dCBvYyA9IGNvbnRleHQuZ2V0T3BlcmF0aW9uQ29udGV4dCgpOwotICAgICAgICBPYmplY3QgZmxhZ0Zyb21Db250ZXh0ID0gbnVsbDsKLSAgICAgICAgaWYgKG9jICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZsYWdGcm9tQ29udGV4dCA9IGNvbnRleHQuZ2V0T3BlcmF0aW9uQ29udGV4dCgpCi0gICAgICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eShDb25zdGFudHMuQ29uZmlndXJhdGlvbi5TRU5EX1NUQUNLVFJBQ0VfREVUQUlMU19XSVRIX0ZBVUxUUyk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGZsYWdGcm9tQ29udGV4dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzZW5kU3RhY2t0cmFjZURldGFpbHNXaXRoRmF1bHRzID0gSmF2YVV0aWxzLmlzVHJ1ZShmbGFnRnJvbUNvbnRleHQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgUGFyYW1ldGVyIHBhcmFtID0gY29udGV4dC5nZXRQYXJhbWV0ZXIoCi0gICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5Db25maWd1cmF0aW9uLlNFTkRfU1RBQ0tUUkFDRV9ERVRBSUxTX1dJVEhfRkFVTFRTKTsKLSAgICAgICAgICAgIGlmIChwYXJhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc2VuZFN0YWNrdHJhY2VEZXRhaWxzV2l0aEZhdWx0cyA9IEphdmFVdGlscy5pc1RydWUocGFyYW0uZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBPYmplY3QgZmF1bHREZXRhaWwgPSBjb250ZXh0LmdldFByb3BlcnR5KFNPQVAxMkNvbnN0YW50cy5TT0FQX0ZBVUxUX0RFVEFJTF9MT0NBTF9OQU1FKTsKLSAgICAgICAgaWYgKGZhdWx0RGV0YWlsICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZhdWx0LnNldERldGFpbCgoU09BUEZhdWx0RGV0YWlsKSBmYXVsdERldGFpbCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoYXhpc0ZhdWx0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChheGlzRmF1bHQuZ2V0RmF1bHREZXRhaWxFbGVtZW50KCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZhdWx0LnNldERldGFpbChheGlzRmF1bHQuZ2V0RmF1bHREZXRhaWxFbGVtZW50KCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBPTUVsZW1lbnQgZGV0YWlsID0gYXhpc0ZhdWx0LmdldERldGFpbCgpOwotICAgICAgICAgICAgICAgIGlmIChkZXRhaWwgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBmYXVsdC5nZXREZXRhaWwoKS5hZGREZXRhaWxFbnRyeShkZXRhaWwpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VuZFN0YWNrdHJhY2VEZXRhaWxzV2l0aEZhdWx0cykgewotICAgICAgICAgICAgICAgICAgICBmYXVsdC5zZXRFeGNlcHRpb24oYXhpc0ZhdWx0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoZmF1bHQuZ2V0RXhjZXB0aW9uKCkgPT0gbnVsbCAmJiBzZW5kU3RhY2t0cmFjZURldGFpbHNXaXRoRmF1bHRzKSB7Ci0gICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIEV4Y2VwdGlvbikgewotICAgICAgICAgICAgICAgIGZhdWx0LnNldEV4Y2VwdGlvbigoRXhjZXB0aW9uKSBlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZmF1bHQuc2V0RXhjZXB0aW9uKG5ldyBFeGNlcHRpb24oZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGVudmVsb3BlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEJ5IHRoZSB0aW1lIHRoZSBleGNlcHRpb24gY29tZXMgaGVyZSBpdCBjYW4gYmUgd3JhcHBlZCBieSBzbyBtYW55IGxldmVscy4gVGhpcyB3aWxsIGNyaXAgZG93bgotICAgICAqIHRvIHRoZSByb290IGNhdXNlIGFuZCBnZXQgdGhlIGluaXRpYWwgZXJyb3IgZGVwZW5kaW5nIG9uIHRoZSBwcm9wZXJ0eQotICAgICAqCi0gICAgICogQHBhcmFtIGUKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0RmF1bHRSZWFzb25Gcm9tRXhjZXB0aW9uKFRocm93YWJsZSBlLCBNZXNzYWdlQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIFRocm93YWJsZSB0aHJvd2FibGUgPSBlOwotICAgICAgICBQYXJhbWV0ZXIgcGFyYW0gPSBjb250ZXh0LmdldFBhcmFtZXRlcigKLSAgICAgICAgICAgICAgICBDb25zdGFudHMuQ29uZmlndXJhdGlvbi5EUklMTF9ET1dOX1RPX1JPT1RfQ0FVU0VfRk9SX0ZBVUxUX1JFQVNPTik7Ci0gICAgICAgIGJvb2xlYW4gZHJpbGxEb3duVG9Sb290Q2F1c2VGb3JGYXVsdFJlYXNvbiA9Ci0gICAgICAgICAgICAgICAgcGFyYW0gIT0gbnVsbCAmJiAoKFN0cmluZykgcGFyYW0uZ2V0VmFsdWUoKSkuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpOwotICAgICAgICBpZiAoZHJpbGxEb3duVG9Sb290Q2F1c2VGb3JGYXVsdFJlYXNvbikgewotICAgICAgICAgICAgd2hpbGUgKHRocm93YWJsZS5nZXRDYXVzZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvd2FibGUgPSB0aHJvd2FibGUuZ2V0Q2F1c2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhyb3dhYmxlLmdldE1lc3NhZ2UoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0U2VuZGVyRmF1bHRDb2RlKE9NTmFtZXNwYWNlIHNvYXBOYW1lc3BhY2UpIHsKLSAgICAgICAgcmV0dXJuIFNPQVAxMkNvbnN0YW50cy5TT0FQX0VOVkVMT1BFX05BTUVTUEFDRV9VUkkuZXF1YWxzKHNvYXBOYW1lc3BhY2UuZ2V0TmFtZXNwYWNlVVJJKCkpCi0gICAgICAgICAgICAgICAgPyBTT0FQMTJDb25zdGFudHMuU09BUF9ERUZBVUxUX05BTUVTUEFDRV9QUkVGSVggKyAiOiIKLSAgICAgICAgICAgICAgICArIFNPQVAxMkNvbnN0YW50cy5GQVVMVF9DT0RFX1NFTkRFUgotICAgICAgICAgICAgICAgIDogU09BUDEyQ29uc3RhbnRzLlNPQVBfREVGQVVMVF9OQU1FU1BBQ0VfUFJFRklYICsgIjoiCi0gICAgICAgICAgICAgICAgKyBTT0FQMTFDb25zdGFudHMuRkFVTFRfQ09ERV9TRU5ERVI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvTWV0YURhdGFFbnRyeS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvTWV0YURhdGFFbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2N2IxNTdlLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi91dGlsL01ldGFEYXRhRW50cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudXRpbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5leHRlcm5hbGl6ZS5TYWZlT2JqZWN0SW5wdXRTdHJlYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LmV4dGVybmFsaXplLlNhZmVPYmplY3RPdXRwdXRTdHJlYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LmV4dGVybmFsaXplLlNhZmVTZXJpYWxpemFibGU7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEuaW8uRXh0ZXJuYWxpemFibGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0OwotaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLQotLyoqCi0gKiBBbiBpbnRlcm5hbCBjbGFzcyBmb3IgaG9sZGluZyBhIHNldCBvZiBpbmZvcm1hdGlvbgotICogYWJvdXQgYW4gb2JqZWN0LgotICovCi1wdWJsaWMgY2xhc3MgTWV0YURhdGFFbnRyeSBpbXBsZW1lbnRzIEV4dGVybmFsaXphYmxlLCBTYWZlU2VyaWFsaXphYmxlIHsKLSAgICAvLyBzZXJpYWxpemF0aW9uIGlkZW50aWZpZXIKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA4OTc4MzYxMDY5NTI2Mjk5ODc1TDsKLQotICAgIC8vIHN1cHBvcnRlZCByZXZpc2lvbiBsZXZlbHMsIGFkZCBhIG5ldyBsZXZlbCB0byBtYW5hZ2UgY29tcGF0aWJsZSBjaGFuZ2VzCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFVklTSU9OXzIgPSAyOwotICAgIC8vIGN1cnJlbnQgcmV2aXNpb24gbGV2ZWwgb2YgdGhpcyBvYmplY3QKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgcmV2aXNpb25JRCA9IFJFVklTSU9OXzI7Ci0KLSAgICAvLyBkYXRhIHRvIGtlZXAgb24gYW4gb2JqZWN0Ci0KLSAgICBwcml2YXRlIFN0cmluZyBjbGFzc05hbWUgPSBudWxsOwotICAgIHByaXZhdGUgU3RyaW5nIHFuYW1lQXNTdHJpbmcgPSBudWxsOwotICAgIHByaXZhdGUgU3RyaW5nIGV4dHJhTmFtZSA9IG51bGw7Ci0KLSAgICAvLyBsaXN0IG9mIE1ldGFEYXRhRW50cnkgb2JqZWN0cyB0aGF0IGFyZSBvd25lZCBieSB0aGUKLSAgICAvLyBvcmlnaW5hbCBvYmplY3QgcmVmZXJyZWQgdG8gYnkgdGhpcyBNZXRhRGF0YUVudHJ5Ci0gICAgcHJpdmF0ZSBBcnJheUxpc3QgY2hpbGRyZW4gPSBudWxsOwotCi0gICAgLy8gbWFya2VyIHRvIGluZGljYXRlIGVuZC1vZi1saXN0Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgRU5EX09GX0xJU1QgPSAiTEFTVF9FTlRSWSI7Ci0KLSAgICAvKioKLSAgICAgKiBTaW1wbGUgY29uc3RydWN0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgTWV0YURhdGFFbnRyeSgpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvcgotICAgICAqIEBwYXJhbSBjbGFzc05hbWUgbmFtZSBvZiB0aGUgb2JqZWN0IGNsYXNzCi0gICAgICogQHBhcmFtIHFuYW1lQXNTdHJpbmcgYW4gZXhwYW5kZWQgdmVyc2lvbiBvZiB0aGUgUU5hbWUgb2YgdGhpcyBvYmplY3QKLSAgICAgKi8KLSAgICBwdWJsaWMgTWV0YURhdGFFbnRyeShTdHJpbmcgY2xhc3NOYW1lLCBTdHJpbmcgcW5hbWVBc1N0cmluZykgewotICAgICAgICB0aGlzLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTsKLSAgICAgICAgdGhpcy5xbmFtZUFzU3RyaW5nID0gcW5hbWVBc1N0cmluZzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvcgotICAgICAqIEBwYXJhbSBjbGFzc05hbWUgbmFtZSBvZiB0aGUgb2JqZWN0IGNsYXNzCi0gICAgICogQHBhcmFtIHFuYW1lQXNTdHJpbmcgYW4gZXhwYW5kZWQgdmVyc2lvbiBvZiB0aGUgUU5hbWUgb2YgdGhpcyBvYmplY3QKLSAgICAgKiBAcGFyYW0gZXh0cmFOYW1lIGFuIGFkZGl0aW9uYWwgbmFtZSBhc3NvY2lhdGVkIHdpdGhlIHRoZSBvYmplY3QKLSAgICAgKi8KLSAgICBwdWJsaWMgTWV0YURhdGFFbnRyeShTdHJpbmcgY2xhc3NOYW1lLCBTdHJpbmcgcW5hbWVBc1N0cmluZywgU3RyaW5nIGV4dHJhTmFtZSkgewotICAgICAgICB0aGlzLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTsKLSAgICAgICAgdGhpcy5xbmFtZUFzU3RyaW5nID0gcW5hbWVBc1N0cmluZzsKLSAgICAgICAgdGhpcy5leHRyYU5hbWUgPSBleHRyYU5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IKLSAgICAgKiBAcGFyYW0gY2xhc3NOYW1lIG5hbWUgb2YgdGhlIG9iamVjdCBjbGFzcwotICAgICAqIEBwYXJhbSBxbmFtZUFzU3RyaW5nIGFuIGV4cGFuZGVkIHZlcnNpb24gb2YgdGhlIFFOYW1lIG9mIHRoaXMgb2JqZWN0Ci0gICAgICogQHBhcmFtIGNoaWxkcmVuIGFuIEFycmF5TGlzdCBjb250YWluaW5nIE1ldGFEYXRhRW50cmllcyBmb3Igb3duZWQgb2JqZWN0cwotICAgICAqLwotICAgIHB1YmxpYyBNZXRhRGF0YUVudHJ5KFN0cmluZyBjbGFzc05hbWUsIFN0cmluZyBxbmFtZUFzU3RyaW5nLCBBcnJheUxpc3QgY2hpbGRyZW4pIHsKLSAgICAgICAgdGhpcy5jbGFzc05hbWUgPSBjbGFzc05hbWU7Ci0gICAgICAgIHRoaXMucW5hbWVBc1N0cmluZyA9IHFuYW1lQXNTdHJpbmc7Ci0gICAgICAgIHRoaXMuY2hpbGRyZW4gPSBjaGlsZHJlbjsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgY2xhc3MgbmFtZQotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgY2xhc3MgbmFtZSBzdHJpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGNsYXNzTmFtZTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgY2xhc3MgbmFtZQotICAgICAqCi0gICAgICogQHBhcmFtIGMgdGhlIGNsYXNzIG5hbWUgc3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q2xhc3NOYW1lKFN0cmluZyBjKSB7Ci0gICAgICAgIGNsYXNzTmFtZSA9IGM7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIFFOYW1lCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBRTmFtZSBiYXNlZCBvbiB0aGUgcW5hbWVBc1N0cmluZyB2YWx1ZQotICAgICAqLwotICAgIHB1YmxpYyBRTmFtZSBnZXRRTmFtZSgpIHsKLSAgICAgICAgaWYgKHFuYW1lQXNTdHJpbmcgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIFFOYW1lLnZhbHVlT2YocW5hbWVBc1N0cmluZyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBRTmFtZQotICAgICAqCi0gICAgICogQHBhcmFtIHEgdGhlIFFOYW1lCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UU5hbWUoUU5hbWUgcSkgewotICAgICAgICBpZiAocSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBxbmFtZUFzU3RyaW5nID0gcS50b1N0cmluZygpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcW5hbWVBc1N0cmluZyA9IG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIFFOYW1lCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbiB0aGUgUU5hbWUgYXMgYSBzdHJpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRRTmFtZShTdHJpbmcgbikgewotICAgICAgICBxbmFtZUFzU3RyaW5nID0gbjsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgUU5hbWUgYXMgYSBzdHJpbmcKLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIFFOYW1lIGFzIGEgc3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRRTmFtZUFzU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gcW5hbWVBc1N0cmluZzsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QuCi0gICAgICogUmV0dXJucyB0aGUgc3RyaW5nIHRoYXQgaXMgdXNlZCBhcyBhIG5hbWUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBuYW1lCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gcW5hbWVBc1N0cmluZzsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgYWRkaXRpb25hbCBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGUgb2JqZWN0Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBhZGRpdGlvbmFsIG5hbWUgc3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRFeHRyYU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBleHRyYU5hbWU7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGFkZGl0aW9uYWwgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhlIG9iamVjdAotICAgICAqCi0gICAgICogQHBhcmFtIGUgdGhlIGV4dHJhIG5hbWUgc3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RXh0cmFOYW1lKFN0cmluZyBlKSB7Ci0gICAgICAgIGV4dHJhTmFtZSA9IGU7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgbGlzdCBpcyBlbXB0eSBvciBub3QKLSAgICAgKgotICAgICAqIEByZXR1cm4gZmFsc2UgZm9yIGEgbm9uLWVtcHR5IGxpc3QsIHRydWUgZm9yIGFuIGVtcHR5IGxpc3QKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0xpc3RFbXB0eSgpIHsKLSAgICAgICAgcmV0dXJuIGNoaWxkcmVuID09IG51bGwgfHwgY2hpbGRyZW4uaXNFbXB0eSgpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBsaXN0Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBhcnJheSBsaXN0Ci0gICAgICovCi0gICAgcHVibGljIEFycmF5TGlzdCBnZXRDaGlsZHJlbigpIHsKLSAgICAgICAgcmV0dXJuIGNoaWxkcmVuOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBsaXN0Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gTCB0aGUgQXJyYXlMaXN0IG9mIE1ldGFEYXRhRW50cnkgb2JqZWN0cwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENoaWxkcmVuKEFycmF5TGlzdCBMKSB7Ci0gICAgICAgIGNoaWxkcmVuID0gTDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgdG8gdGhlIGxpc3QKLSAgICAgKgotICAgICAqIEBwYXJhbSBlIHRoZSBNZXRhRGF0YUVudHJ5IG9iamVjdCB0byBhZGQgdG8gdGhlIGxpc3QKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRUb0xpc3QoTWV0YURhdGFFbnRyeSBlKSB7Ci0gICAgICAgIGlmIChjaGlsZHJlbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgfQotICAgICAgICBjaGlsZHJlbi5hZGQoZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlIHRoZSBsaXN0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlTGlzdCgpIHsKLSAgICAgICAgY2hpbGRyZW4gPSBudWxsOwotICAgIH0KLQotCi0gICAgLy8gbWVzc2FnZSBzdHJpbmdzCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVOU1VQUE9SVEVEX1NVSUQgPSAiU2VyaWFsaXphdGlvbiB2ZXJzaW9uIElEIGlzIG5vdCBzdXBwb3J0ZWQuIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU5TVVBQT1JURURfUkVWSUQgPSAiUmV2aXNpb24gSUQgaXMgbm90IHN1cHBvcnRlZC4iOwotCi0KLSAgICAvKioKLSAgICAgKiBTYXZlIHRoZSBjb250ZW50cyBvZiB0aGlzIG9iamVjdAotICAgICAqCi0gICAgICogQHBhcmFtIG91dCBUaGUgc3RyZWFtIHRvIHdyaXRlIHRoZSBvYmplY3QgY29udGVudHMgdG8KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgd3JpdGVFeHRlcm5hbChPYmplY3RPdXRwdXQgbykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgU2FmZU9iamVjdE91dHB1dFN0cmVhbSBvdXQgPSBTYWZlT2JqZWN0T3V0cHV0U3RyZWFtLmluc3RhbGwobyk7Ci0gICAgICAgIC8vIHdyaXRlIG91dCBjb250ZW50cyBvZiB0aGlzIG9iamVjdAotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIGluIG9yZGVyIHRvIGhhbmRsZSBmdXR1cmUgY2hhbmdlcyB0byB0aGUgbWVzc2FnZSAKLSAgICAgICAgLy8gY29udGV4dCBkZWZpbml0aW9uLCBiZSBzdXJlIHRvIG1haW50YWluIHRoZSAKLSAgICAgICAgLy8gb2JqZWN0IGxldmVsIGlkZW50aWZpZXJzCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIHNlcmlhbGl6YXRpb24gdmVyc2lvbiBJRAotICAgICAgICBvdXQud3JpdGVMb25nKHNlcmlhbFZlcnNpb25VSUQpOwotCi0gICAgICAgIC8vIHJldmlzaW9uIElECi0gICAgICAgIG91dC53cml0ZUludChyZXZpc2lvbklEKTsKLQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyB2YXJpb3VzIHNpbXBsZSBmaWVsZHMKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgb3V0LndyaXRlT2JqZWN0KGNsYXNzTmFtZSk7Ci0gICAgICAgIG91dC53cml0ZU9iamVjdChxbmFtZUFzU3RyaW5nKTsKLSAgICAgICAgb3V0LndyaXRlT2JqZWN0KGV4dHJhTmFtZSk7Ci0gICAgICAgIG91dC53cml0ZUxpc3QoY2hpbGRyZW4pOwotCi0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBSZXN0b3JlIHRoZSBjb250ZW50cyBvZiB0aGUgb2JqZWN0IHRoYXQgd2FzCi0gICAgICogcHJldmlvdXNseSBzYXZlZC4KLSAgICAgKiA8cC8+Ci0gICAgICogTk9URTogVGhlIGZpZWxkIGRhdGEgbXVzdCByZWFkIGJhY2sgaW4gdGhlIHNhbWUgb3JkZXIgYW5kIHR5cGUKLSAgICAgKiBhcyBpdCB3YXMgd3JpdHRlbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpbiBUaGUgc3RyZWFtIHRvIHJlYWQgdGhlIG9iamVjdCBjb250ZW50cyBmcm9tCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlYWRFeHRlcm5hbChPYmplY3RJbnB1dCBpbk9iamVjdCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgU2FmZU9iamVjdElucHV0U3RyZWFtIGluID0gU2FmZU9iamVjdElucHV0U3RyZWFtLmluc3RhbGwoaW5PYmplY3QpOwotCi0gICAgICAgIC8vIHNlcmlhbGl6YXRpb24gdmVyc2lvbiBJRAotICAgICAgICBsb25nIHN1aWQgPSBpbi5yZWFkTG9uZygpOwotCi0gICAgICAgIC8vIHJldmlzaW9uIElECi0gICAgICAgIGludCByZXZJRCA9IGluLnJlYWRJbnQoKTsKLQotICAgICAgICAvLyBtYWtlIHN1cmUgdGhlIG9iamVjdCBkYXRhIGlzIGluIGEgdmVyc2lvbiB3ZSBjYW4gaGFuZGxlCi0gICAgICAgIGlmIChzdWlkICE9IHNlcmlhbFZlcnNpb25VSUQpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uKFVOU1VQUE9SVEVEX1NVSUQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gbWFrZSBzdXJlIHRoZSBvYmplY3QgZGF0YSBpcyBpbiBhIHJldmlzaW9uIGxldmVsIHdlIGNhbiBoYW5kbGUKLSAgICAgICAgaWYgKHJldklEICE9IFJFVklTSU9OXzIpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uKFVOU1VQUE9SVEVEX1JFVklEKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIHZhcmlvdXMgc2ltcGxlIGZpZWxkcwotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgIGNsYXNzTmFtZSA9IChTdHJpbmcpIGluLnJlYWRPYmplY3QoKTsKLSAgICAgICAgcW5hbWVBc1N0cmluZyA9IChTdHJpbmcpIGluLnJlYWRPYmplY3QoKTsKLSAgICAgICAgZXh0cmFOYW1lID0gKFN0cmluZykgaW4ucmVhZE9iamVjdCgpOwotICAgICAgICBjaGlsZHJlbiA9IGluLnJlYWRBcnJheUxpc3QoKTsKLQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvTXVsdGlwbGVFbnRyeUhhc2hNYXAuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi91dGlsL011bHRpcGxlRW50cnlIYXNoTWFwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2ZmU3OGYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvTXVsdGlwbGVFbnRyeUhhc2hNYXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiBUaGlzIHdpbGwgbWFrZSBhIGhhc2ggbWFwIHdoaWNoIGNhbiBjb250YWluIG11bHRpcGxlIGVudHJpZXMgZm9yIHRoZSBzYW1lIGhhc2ggdmFsdWUuCi0gKi8KLXB1YmxpYyBjbGFzcyBNdWx0aXBsZUVudHJ5SGFzaE1hcCB7Ci0KLSAgICBwcml2YXRlIE1hcCB0YWJsZTsKLQotICAgIHB1YmxpYyBNdWx0aXBsZUVudHJ5SGFzaE1hcCgpIHsKLSAgICAgICAgdGhpcy50YWJsZSA9IG5ldyBIYXNodGFibGUoMSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSWYgeW91IGNhbGwgZ2V0IG9uY2UgaW4gdGhpcywgaXQgd2lsbCByZW1vdmUgdGhhdCBpdGVtIGZyb20gdGhlIG1hcAotICAgICAqCi0gICAgICogQHBhcmFtIGtleQotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldChPYmplY3Qga2V5KSB7Ci0gICAgICAgIEFycmF5TGlzdCBsaXN0ID0gKEFycmF5TGlzdCkgdGFibGUuZ2V0KGtleSk7Ci0gICAgICAgIGlmIChsaXN0ICE9IG51bGwgJiYgbGlzdC5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBPYmplY3QgbyA9IGxpc3QuZ2V0KDApOwotICAgICAgICAgICAgbGlzdC5yZW1vdmUoMCk7Ci0vLyAgICAgICAgICAgIGlmIChsaXN0LnNpemUoKSA9PSAwKSB7Ci0vLyAgICAgICAgICAgICAgICB0YWJsZS5yZW1vdmUoa2V5KTsKLS8vICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG87Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgcHV0KE9iamVjdCBrZXksIE9iamVjdCB2YWx1ZSkgewotICAgICAgICBBcnJheUxpc3QgbGlzdCA9IChBcnJheUxpc3QpIHRhYmxlLmdldChrZXkpOwotICAgICAgICBpZiAobGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBBcnJheUxpc3QgbGlzdFRvQmVBZGRlZCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgIHRhYmxlLnB1dChrZXksIGxpc3RUb0JlQWRkZWQpOwotICAgICAgICAgICAgbGlzdFRvQmVBZGRlZC5hZGQodmFsdWUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbGlzdC5hZGQodmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyBTZXQga2V5U2V0KCkgewotCi0gICAgICAgIHJldHVybiB0YWJsZS5rZXlTZXQoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdXRpbC9PYmplY3RTdGF0ZVV0aWxzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdXRpbC9PYmplY3RTdGF0ZVV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4MWM2NjMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvT2JqZWN0U3RhdGVVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzc1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi51dGlsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LmV4dGVybmFsaXplLkFjdGl2YXRlVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LmV4dGVybmFsaXplLkV4dGVybmFsaXplQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5leHRlcm5hbGl6ZS5TYWZlT2JqZWN0SW5wdXRTdHJlYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LmV4dGVybmFsaXplLlNhZmVPYmplY3RPdXRwdXRTdHJlYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzTWVzc2FnZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlR3JvdXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0NvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuVHJhbnNwb3J0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dDsKLWltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogVXRpbGl0eSB0byB3cml0ZSwgcmVhZCBhbmQgYWN0aXZhdGUgZXh0ZXJuYWxpemVkIE9iamVjdHMKLSAqLwotcHVibGljIGNsYXNzIE9iamVjdFN0YXRlVXRpbHMgaW1wbGVtZW50cyBFeHRlcm5hbGl6ZUNvbnN0YW50cyB7Ci0gICAgLyoKLSAgICAgKiBzZXR1cCBmb3IgbG9nZ2luZwotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhPYmplY3RTdGF0ZVV0aWxzLmNsYXNzKTsKLQotICAgIC8vIHVzZWQgdG8gaW5kaWNhdGUgYW4gdmFsaWQgIm51bGwiIG9iamVjdCwKLSAgICAvLyB0eXBpY2FsbHkgdXNlZCBpbiBrZXktdmFsdWUgcGFpcnMgd2hlcmUgYSBub24tbnVsbCBrZXkgcmVmZXJzIHRvIGEgbnVsbAotICAgIC8vIHZhbHVlCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgTlVMTF9PQkpFQ1QgPSAiTlVMTF9PQkoiOwotCi0gICAgLy8gbWVzc2FnZS90cmFjZS9sb2dnaW5nIHN0cmluZ3MKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVTlNVUFBPUlRFRF9TVUlEID0gIlNlcmlhbGl6YXRpb24gdmVyc2lvbiBJRCBpcyBub3Qgc3VwcG9ydGVkLiI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVTlNVUFBPUlRFRF9SRVZJRCA9ICJSZXZpc2lvbiBJRCBpcyBub3Qgc3VwcG9ydGVkLiI7Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIFNhdmUvUmVzdG9yZSBtZXRob2RzCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKgotICAgICAqIFdyaXRlIGEgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgb3V0cHV0IHN0cmVhbS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbyBUaGUgb3V0cHV0IHN0cmVhbQotICAgICAqIEBwYXJhbSBzdHIgVGhlIHN0cmluZyB0byB3cml0ZQotICAgICAqIEBwYXJhbSBkZXNjIEEgdGV4dCBkZXNjcmlwdGlvbiB0byB1c2UgZm9yIGxvZ2dpbmcKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZVN0cmluZyhPYmplY3RPdXRwdXQgbywgU3RyaW5nIHN0ciwgU3RyaW5nIGRlc2MpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIFNhZmVPYmplY3RPdXRwdXRTdHJlYW0gb3V0ID0gU2FmZU9iamVjdE91dHB1dFN0cmVhbS5pbnN0YWxsKG8pOwotICAgICAgICBvdXQud3JpdGVVVEYoZGVzYyk7Ci0gICAgICAgIG91dC53cml0ZU9iamVjdChzdHIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlYWQgYSBzdHJpbmcgZnJvbSB0aGUgc3BlY2lmaWVkIGlucHV0IHN0cmVhbS4gUmV0dXJucyBudWxsIGlmIG5vIHN0cmluZyBpcyBhdmFpbGFibGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIGkgVGhlIGlucHV0IHN0cmVhbQotICAgICAqIEBwYXJhbSBkZXNjIEEgdGV4dCBkZXNjcmlwdGlvbiB0byB1c2UgZm9yIGxvZ2dpbmcKLSAgICAgKiBAcmV0dXJuIFRoZSBzdHJpbmcgb3IgbnVsbCwgaWYgbm90IGF2YWlsYWJsZQotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyByZWFkU3RyaW5nKE9iamVjdElucHV0IGksIFN0cmluZyBkZXNjKSB0aHJvd3MgSU9FeGNlcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgU2FmZU9iamVjdElucHV0U3RyZWFtIGluID0gU2FmZU9iamVjdElucHV0U3RyZWFtLmluc3RhbGwoaSk7Ci0KLSAgICAgICAgLy8gR2V0IHRoZSBtYXJrZXIKLSAgICAgICAgaW4ucmVhZFVURigpOwotCi0gICAgICAgIC8vIEdldCB0aGUgb2JqZWN0Ci0gICAgICAgIHJldHVybiAoU3RyaW5nKSBpbi5yZWFkT2JqZWN0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV3JpdGUgYW4gb2JqZWN0IHRvIHRoZSBzcGVjaWZpZWQgb3V0cHV0IHN0cmVhbS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbyBUaGUgb3V0cHV0IHN0cmVhbQotICAgICAqIEBwYXJhbSBvYmogVGhlIG9iamVjdCB0byB3cml0ZQotICAgICAqIEBwYXJhbSBkZXNjIEEgdGV4dCBkZXNjcmlwdGlvbiB0byB1c2UgZm9yIGxvZ2dpbmcKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZU9iamVjdChPYmplY3RPdXRwdXQgbywgT2JqZWN0IG9iaiwgU3RyaW5nIGRlc2MpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIFNhZmVPYmplY3RPdXRwdXRTdHJlYW0gb3V0ID0gU2FmZU9iamVjdE91dHB1dFN0cmVhbS5pbnN0YWxsKG8pOwotICAgICAgICBvdXQud3JpdGVVVEYoZGVzYyk7Ci0gICAgICAgIG91dC53cml0ZU9iamVjdChvYmopOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlYWQgYW4gb2JqZWN0IGZyb20gdGhlIHNwZWNpZmllZCBpbnB1dCBzdHJlYW0uIFJldHVybnMgbnVsbCBpZiBubyBvYmplY3QgaXMgYXZhaWxhYmxlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBpIFRoZSBpbnB1dCBzdHJlYW0KLSAgICAgKiBAcGFyYW0gZGVzYyBBIHRleHQgZGVzY3JpcHRpb24gdG8gdXNlIGZvciBsb2dnaW5nCi0gICAgICogQHJldHVybiBUaGUgb2JqZWN0IG9yIG51bGwsIGlmIG5vdCBhdmFpbGFibGUKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgcmVhZE9iamVjdChPYmplY3RJbnB1dCBpLCBTdHJpbmcgZGVzYykgdGhyb3dzIElPRXhjZXB0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIFNhZmVPYmplY3RJbnB1dFN0cmVhbSBpbiA9IFNhZmVPYmplY3RJbnB1dFN0cmVhbS5pbnN0YWxsKGkpOwotICAgICAgICBpbi5yZWFkVVRGKCk7IC8vIFJlYWQgTWFya2VyCi0gICAgICAgIHJldHVybiBpbi5yZWFkT2JqZWN0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV3JpdGUgYW4gYXJyYXkgb2Ygb2JqZWN0cyB0byB0aGUgc3BlY2lmaWVkIG91dHB1dCBzdHJlYW0uIE5PVEU6IGVhY2ggb2JqZWN0IGluIHRoZSBhcnJheQotICAgICAqIHNob3VsZCBpbXBsZW1lbnQgZWl0aGVyIGphdmEuaW8uU2VyaWFsaXphYmxlIG9yIGphdmEuaW8uRXh0ZXJuYWxpemFibGUgaW4gb3JkZXIgdG8gYmUgc2F2ZWQKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbyBUaGUgb3V0cHV0IHN0cmVhbQotICAgICAqIEBwYXJhbSBhbCBUaGUgQXJyYXlMaXN0IHRvIHdyaXRlCi0gICAgICogQHBhcmFtIGRlc2MgQSB0ZXh0IGRlc2NyaXB0aW9uIHRvIHVzZSBmb3IgbG9nZ2luZwotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlQXJyYXlMaXN0KE9iamVjdE91dHB1dCBvLCBBcnJheUxpc3QgYWwsIFN0cmluZyBkZXNjKSAKLSAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIFNhZmVPYmplY3RPdXRwdXRTdHJlYW0gb3V0ID0gU2FmZU9iamVjdE91dHB1dFN0cmVhbS5pbnN0YWxsKG8pOwotICAgICAgICBvdXQud3JpdGVVVEYoZGVzYyk7Ci0gICAgICAgIG91dC53cml0ZUxpc3QoYWwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlYWRzIGFuIGFycmF5IG9mIG9iamVjdHMgZnJvbSB0aGUgc3BlY2lmaWVkIGlucHV0IHN0cmVhbS4gUmV0dXJucyBudWxsIGlmIG5vIGFycmF5IGlzCi0gICAgICogYXZhaWxhYmxlLiBOT1RFOiBlYWNoIG9iamVjdCBpbiB0aGUgYXJyYXkgc2hvdWxkIGltcGxlbWVudCBlaXRoZXIgamF2YS5pby5TZXJpYWxpemFibGUgb3IKLSAgICAgKiBqYXZhLmlvLkV4dGVybmFsaXphYmxlIGluIG9yZGVyIHRvIGJlIHNhdmVkCi0gICAgICogCi0gICAgICogQHBhcmFtIGkgVGhlIGlucHV0IHN0cmVhbQotICAgICAqIEBwYXJhbSBkZXNjIEEgdGV4dCBkZXNjcmlwdGlvbiB0byB1c2UgZm9yIGxvZ2dpbmcKLSAgICAgKiBAcmV0dXJuIFRoZSBBcnJheUxpc3Qgb3IgbnVsbCwgaWYgbm90IGF2YWlsYWJsZQotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEFycmF5TGlzdCByZWFkQXJyYXlMaXN0KE9iamVjdElucHV0IGksIFN0cmluZyBkZXNjKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBTYWZlT2JqZWN0SW5wdXRTdHJlYW0gaW4gPSBTYWZlT2JqZWN0SW5wdXRTdHJlYW0uaW5zdGFsbChpKTsKLSAgICAgICAgaW4ucmVhZFVURigpOwotICAgICAgICByZXR1cm4gaW4ucmVhZEFycmF5TGlzdCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdyaXRlIGEgaGFzaG1hcCBvZiBvYmplY3RzIHRvIHRoZSBzcGVjaWZpZWQgb3V0cHV0IHN0cmVhbS4gTk9URTogZWFjaCBvYmplY3QgaW4gdGhlIG1hcAotICAgICAqIHNob3VsZCBpbXBsZW1lbnQgZWl0aGVyIGphdmEuaW8uU2VyaWFsaXphYmxlIG9yIGphdmEuaW8uRXh0ZXJuYWxpemFibGUgaW4gb3JkZXIgdG8gYmUgc2F2ZWQKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbyBUaGUgb3V0cHV0IHN0cmVhbQotICAgICAqIEBwYXJhbSBtYXAgVGhlIEhhc2hNYXAgdG8gd3JpdGUKLSAgICAgKiBAcGFyYW0gZGVzYyBBIHRleHQgZGVzY3JpcHRpb24gdG8gdXNlIGZvciBsb2dnaW5nCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVIYXNoTWFwKE9iamVjdE91dHB1dCBvLCBIYXNoTWFwIG1hcCwgU3RyaW5nIGRlc2MpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIFNhZmVPYmplY3RPdXRwdXRTdHJlYW0gb3V0ID0gU2FmZU9iamVjdE91dHB1dFN0cmVhbS5pbnN0YWxsKG8pOwotICAgICAgICBvdXQud3JpdGVVVEYoZGVzYyk7Ci0gICAgICAgIG91dC53cml0ZU1hcChtYXApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlYWQgYSBoYXNobWFwIG9mIG9iamVjdHMgZnJvbSB0aGUgc3BlY2lmaWVkIGlucHV0IHN0cmVhbS4gUmV0dXJucyBudWxsIGlmIG5vIGhhc2htYXAgaXMKLSAgICAgKiBhdmFpbGFibGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIGluIFRoZSBpbnB1dCBzdHJlYW0KLSAgICAgKiBAcGFyYW0gZGVzYyBBIHRleHQgZGVzY3JpcHRpb24gdG8gdXNlIGZvciBsb2dnaW5nCi0gICAgICogQHJldHVybiBUaGUgSGFzaE1hcCBvciBudWxsLCBpZiBub3QgYXZhaWxhYmxlCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSGFzaE1hcCByZWFkSGFzaE1hcChPYmplY3RJbnB1dCBpLCBTdHJpbmcgZGVzYykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgU2FmZU9iamVjdElucHV0U3RyZWFtIGluID0gU2FmZU9iamVjdElucHV0U3RyZWFtLmluc3RhbGwoaSk7Ci0gICAgICAgIGluLnJlYWRVVEYoKTsKLSAgICAgICAgcmV0dXJuIGluLnJlYWRIYXNoTWFwKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV3JpdGUgYSBsaW5rZWQgbGlzdCBvZiBvYmplY3RzIHRvIHRoZSBzcGVjaWZpZWQgb3V0cHV0IHN0cmVhbS4gPE5PVEU6IGVhY2ggb2JqZWN0IGluIHRoZQotICAgICAqIGFycmF5IHNob3VsZCBpbXBsZW1lbnQgZWl0aGVyIGphdmEuaW8uU2VyaWFsaXphYmxlIG9yIGphdmEuaW8uRXh0ZXJuYWxpemFibGUgaW4gb3JkZXIgdG8gYmUKLSAgICAgKiBzYXZlZAotICAgICAqIAotICAgICAqIEBwYXJhbSBvIFRoZSBvdXRwdXQgc3RyZWFtCi0gICAgICogQHBhcmFtIGxpc3QgVGhlIExpbmtlZExpc3QgdG8gd3JpdGUKLSAgICAgKiBAcGFyYW0gZGVzYyBBIHRleHQgZGVzY3JpcHRpb24gdG8gdXNlIGZvciBsb2dnaW5nCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVMaW5rZWRMaXN0KE9iamVjdE91dHB1dCBvLCBMaW5rZWRMaXN0IG9iamxpc3QsIFN0cmluZyBkZXNjKQotICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgU2FmZU9iamVjdE91dHB1dFN0cmVhbSBvdXQgPSBTYWZlT2JqZWN0T3V0cHV0U3RyZWFtLmluc3RhbGwobyk7Ci0gICAgICAgIG91dC53cml0ZVVURihkZXNjKTsKLSAgICAgICAgb3V0LndyaXRlTGlzdChvYmpsaXN0KTsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlYWRzIGEgbGlua2VkIGxpc3Qgb2Ygb2JqZWN0cyBmcm9tIHRoZSBzcGVjaWZpZWQgaW5wdXQgc3RyZWFtLiBSZXR1cm5zIG51bGwgaWYgbm8gYXJyYXkgaXMKLSAgICAgKiBhdmFpbGFibGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIGluIFRoZSBpbnB1dCBzdHJlYW0KLSAgICAgKiBAcGFyYW0gZGVzYyBBIHRleHQgZGVzY3JpcHRpb24gdG8gdXNlIGZvciBsb2dnaW5nCi0gICAgICogQHJldHVybiBUaGUgbGlua2VkIGxpc3Qgb3IgbnVsbCwgaWYgbm90IGF2YWlsYWJsZQotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIExpbmtlZExpc3QgcmVhZExpbmtlZExpc3QoT2JqZWN0SW5wdXQgaSwgU3RyaW5nIGRlc2MpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIFNhZmVPYmplY3RJbnB1dFN0cmVhbSBpbiA9IFNhZmVPYmplY3RJbnB1dFN0cmVhbS5pbnN0YWxsKGkpOwotICAgICAgICBpbi5yZWFkVVRGKCk7Ci0gICAgICAgIHJldHVybiBpbi5yZWFkTGlua2VkTGlzdCgpOwotICAgIH0KLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gRmluZGVyIG1ldGhvZHMKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLyoqCi0gICAgICogRmluZCB0aGUgQXhpc09wZXJhdGlvbiBvYmplY3QgdGhhdCBtYXRjaGVzIHRoZSBjcml0ZXJpYQotICAgICAqIAotICAgICAqIEBwYXJhbSBheGlzQ29uZmlnIFRoZSBBeGlzQ29uZmlndXJhdGlvbiBvYmplY3QKLSAgICAgKiBAcGFyYW0gb3BDbGFzc05hbWUgdGhlIGNsYXNzIG5hbWUgc3RyaW5nIGZvciB0aGUgdGFyZ2V0IG9iamVjdCAoY291bGQgYmUgYSBkZXJpdmVkIGNsYXNzKQotICAgICAqIEBwYXJhbSBvcFFOYW1lIHRoZSBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGUgb3BlcmF0aW9uCi0gICAgICogQHJldHVybiB0aGUgQXhpc09wZXJhdGlvbiBvYmplY3QgdGhhdCBtYXRjaGVzIHRoZSBnaXZlbiBjcml0ZXJpYQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQXhpc09wZXJhdGlvbiBmaW5kT3BlcmF0aW9uKEF4aXNDb25maWd1cmF0aW9uIGF4aXNDb25maWcsIFN0cmluZyBvcENsYXNzTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRTmFtZSBvcFFOYW1lKSB7Ci0gICAgICAgIHJldHVybiBBY3RpdmF0ZVV0aWxzLmZpbmRPcGVyYXRpb24oYXhpc0NvbmZpZywgb3BDbGFzc05hbWUsIG9wUU5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZpbmQgdGhlIEF4aXNPcGVyYXRpb24gb2JqZWN0IHRoYXQgbWF0Y2hlcyB0aGUgY3JpdGVyaWEKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc2VydmljZSBUaGUgQXhpc1NlcnZpY2Ugb2JqZWN0Ci0gICAgICogQHBhcmFtIG9wQ2xhc3NOYW1lIFRoZSBjbGFzcyBuYW1lIHN0cmluZyBmb3IgdGhlIHRhcmdldCBvYmplY3QgKGNvdWxkIGJlIGEgZGVyaXZlZCBjbGFzcykKLSAgICAgKiBAcGFyYW0gb3BRTmFtZSB0aGUgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhlIG9wZXJhdGlvbgotICAgICAqIEByZXR1cm4gdGhlIEF4aXNPcGVyYXRpb24gb2JqZWN0IHRoYXQgbWF0Y2hlcyB0aGUgZ2l2ZW4gY3JpdGVyaWEKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEF4aXNPcGVyYXRpb24gZmluZE9wZXJhdGlvbihBeGlzU2VydmljZSBzZXJ2aWNlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgb3BDbGFzc05hbWUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFOYW1lIG9wUU5hbWUpIHsKLSAgICAgICAgcmV0dXJuIEFjdGl2YXRlVXRpbHMuZmluZE9wZXJhdGlvbihzZXJ2aWNlLCBvcENsYXNzTmFtZSwgb3BRTmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmluZCB0aGUgQXhpc1NlcnZpY2Ugb2JqZWN0IHRoYXQgbWF0Y2hlcyB0aGUgY3JpdGVyaWEKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYXhpc0NvbmZpZyBUaGUgQXhpc0NvbmZpZ3VyYXRpb24gb2JqZWN0Ci0gICAgICogQHBhcmFtIHNlcnZpY2VDbGFzc05hbWUgdGhlIGNsYXNzIG5hbWUgc3RyaW5nIGZvciB0aGUgdGFyZ2V0IG9iamVjdCAoY291bGQgYmUgYSBkZXJpdmVkCi0gICAgICogY2xhc3MpCi0gICAgICogQHBhcmFtIHNlcnZpY2VOYW1lIHRoZSBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2VydmljZQotICAgICAqIEByZXR1cm4gdGhlIEF4aXNTZXJ2aWNlIG9iamVjdCB0aGF0IG1hdGNoZXMgdGhlIGNyaXRlcmlhCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBBeGlzU2VydmljZSBmaW5kU2VydmljZShBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlnLCBTdHJpbmcgc2VydmljZUNsYXNzTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZXJ2aWNlTmFtZSkgewotICAgICAgICByZXR1cm4gQWN0aXZhdGVVdGlscy5maW5kU2VydmljZShheGlzQ29uZmlnLCBzZXJ2aWNlQ2xhc3NOYW1lLCBzZXJ2aWNlTmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmluZCB0aGUgQXhpc1NlcnZpY2VHcm91cCBvYmplY3QgdGhhdCBtYXRjaGVzIHRoZSBjcml0ZXJpYSA8cC8+IDxCPk5vdGU8Qj4gdGhlIHNhdmVkIAotICAgICAqIHNlcnZpY2UgZ3JvdXAgbWV0YSBpbmZvcm1hdGlvbiBtYXkgbm90IG1hdGNoIHVwIHdpdGggYW55IG9mIHRoZSBzZXJ2aWNlR3JvdXBzIHRoYXQgCi0gICAgICogYXJlIGluIHRoZSBjdXJyZW50IEF4aXNDb25maWd1cmF0aW9uIG9iamVjdC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYXhpc0NvbmZpZyBUaGUgQXhpc0NvbmZpZ3VyYXRpb24gb2JqZWN0Ci0gICAgICogQHBhcmFtIHNlcnZpY2VHcnBDbGFzc05hbWUgdGhlIGNsYXNzIG5hbWUgc3RyaW5nIGZvciB0aGUgdGFyZ2V0IG9iamVjdCAoY291bGQgYmUgYSBkZXJpdmVkCi0gICAgICogY2xhc3MpCi0gICAgICogQHBhcmFtIHNlcnZpY2VHcnBOYW1lIHRoZSBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2VydmljZSBncm91cAotICAgICAqIEByZXR1cm4gdGhlIEF4aXNTZXJ2aWNlR3JvdXAgb2JqZWN0IHRoYXQgbWF0Y2hlcyB0aGUgY3JpdGVyaWEKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEF4aXNTZXJ2aWNlR3JvdXAgZmluZFNlcnZpY2VHcm91cChBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZXJ2aWNlR3JwQ2xhc3NOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZXJ2aWNlR3JwTmFtZSkgewotICAgICAgICByZXR1cm4gQWN0aXZhdGVVdGlscy5maW5kU2VydmljZUdyb3VwKGF4aXNDb25maWcsIHNlcnZpY2VHcnBDbGFzc05hbWUsIHNlcnZpY2VHcnBOYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGaW5kIHRoZSBBeGlzTWVzc2FnZSBvYmplY3QgdGhhdCBtYXRjaGVzIHRoZSBjcml0ZXJpYQotICAgICAqIAotICAgICAqIEBwYXJhbSBvcCBUaGUgQXhpc09wZXJhdGlvbiBvYmplY3QKLSAgICAgKiBAcGFyYW0gbXNnTmFtZSBUaGUgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhlIG1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gbXNnRWxlbWVudE5hbWUgVGhlIG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBtZXNzYWdlIGVsZW1lbnQKLSAgICAgKiBAcmV0dXJuIHRoZSBBeGlzTWVzc2FnZSBvYmplY3QgdGhhdCBtYXRjaGVzIHRoZSBnaXZlbiBjcml0ZXJpYQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQXhpc01lc3NhZ2UgZmluZE1lc3NhZ2UoQXhpc09wZXJhdGlvbiBvcCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbXNnTmFtZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbXNnRWxlbWVudE5hbWUpIHsKLSAgICAgICAgcmV0dXJuIEFjdGl2YXRlVXRpbHMuZmluZE1lc3NhZ2Uob3AsIG1zZ05hbWUsIG1zZ0VsZW1lbnROYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGaW5kIHRoZSBIYW5kbGVyIG9iamVjdCB0aGF0IG1hdGNoZXMgdGhlIGNyaXRlcmlhCi0gICAgICogCi0gICAgICogQHBhcmFtIGV4aXN0aW5nSGFuZGxlcnMgVGhlIGxpc3Qgb2YgZXhpc3RpbmcgaGFuZGxlcnMgYW5kIHBoYXNlcwotICAgICAqIEBwYXJhbSBoYW5kbGVyQ2xhc3NOYW1lIHRoZSBjbGFzcyBuYW1lIHN0cmluZyBmb3IgdGhlIHRhcmdldCBvYmplY3QgKGNvdWxkIGJlIGEgZGVyaXZlZAotICAgICAqIGNsYXNzKQotICAgICAqIEByZXR1cm4gdGhlIEhhbmRsZXIgb2JqZWN0IHRoYXQgbWF0Y2hlcyB0aGUgY3JpdGVyaWEKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBmaW5kSGFuZGxlcihBcnJheUxpc3QgZXhpc3RpbmdIYW5kbGVycywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KSAKLSAgICB7Ci0gICAgICAgIHJldHVybiBBY3RpdmF0ZVV0aWxzLmZpbmRIYW5kbGVyKGV4aXN0aW5nSGFuZGxlcnMsIG1ldGFEYXRhRW50cnkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZpbmQgdGhlIFRyYW5zcG9ydExpc3RlbmVyIG9iamVjdCB0aGF0IG1hdGNoZXMgdGhlIGNyaXRlcmlhIDxwLz4gPEI+Tm90ZTxCPiB0aGUgc2F2ZWQgbWV0YQotICAgICAqIGluZm9ybWF0aW9uIG1heSBub3QgbWF0Y2ggdXAgd2l0aCBhbnkgb2YgdGhlIG9iamVjdHMgdGhhdCBhcmUgaW4gdGhlIGN1cnJlbnQKLSAgICAgKiBBeGlzQ29uZmlndXJhdGlvbiBvYmplY3QuCi0gICAgICogCi0gICAgICogQHBhcmFtIGF4aXNDb25maWcgVGhlIEF4aXNDb25maWd1cmF0aW9uIG9iamVjdAotICAgICAqIEBwYXJhbSBsaXN0ZW5lckNsYXNzTmFtZSB0aGUgY2xhc3MgbmFtZSBzdHJpbmcgZm9yIHRoZSB0YXJnZXQgb2JqZWN0IChjb3VsZCBiZSBhIGRlcml2ZWQKLSAgICAgKiBjbGFzcykKLSAgICAgKiBAcmV0dXJuIHRoZSBUcmFuc3BvcnRMaXN0ZW5lciBvYmplY3QgdGhhdCBtYXRjaGVzIHRoZSBjcml0ZXJpYQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgVHJhbnNwb3J0TGlzdGVuZXIgZmluZFRyYW5zcG9ydExpc3RlbmVyKEF4aXNDb25maWd1cmF0aW9uIGF4aXNDb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxpc3RlbmVyQ2xhc3NOYW1lKSB7Ci0gICAgICAgIHJldHVybiBBY3RpdmF0ZVV0aWxzLmZpbmRUcmFuc3BvcnRMaXN0ZW5lcihheGlzQ29uZmlnLCBsaXN0ZW5lckNsYXNzTmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29tcGFyZXMgdGhlIHR3byBjb2xsZWN0aW9ucyB0byBzZWUgaWYgdGhleSBhcmUgZXF1aXZhbGVudC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYTEgVGhlIGZpcnN0IGNvbGxlY3Rpb24KLSAgICAgKiBAcGFyYW0gYTIgVGhlIHNlY29uZCBjb2xsZWN0aW9uCi0gICAgICogQHBhcmFtIHN0cmljdCBJbmRpY2F0ZXMgd2hldGhlciBzdHJpY3QgY2hlY2tpbmcgaXMgcmVxdWlyZWQuIFN0cmljdCBjaGVja2luZyBtZWFucyB0aGF0IHRoZQotICAgICAqIHR3byBjb2xsZWN0aW9ucyBtdXN0IGhhdmUgdGhlIHNhbWUgZWxlbWVudHMgaW4gdGhlIHNhbWUgb3JkZXIuIAotICAgICAqIE5vbi1zdHJpY3QgY2hlY2tpbmcgbWVhbnMgdGhhdCB0aGUgdHdvIGNvbGxlY3Rpb25zIG11c3QgaGF2ZSB0aGUgc2FtZSBlbGVtZW50cywgCi0gICAgICogYnV0IHRoZSBvcmRlciBpcyBub3Qgc2lnbmlmaWNhbnQuCi0gICAgICogQHJldHVybiBUUlVFIGlmIHRoZSB0d28gY29sbGVjdGlvbnMgYXJlIGVxdWl2YWxlbnQgRkFMU0UsIG90aGVyd2lzZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0VxdWl2YWxlbnQoQXJyYXlMaXN0IGExLCBBcnJheUxpc3QgYTIsIGJvb2xlYW4gc3RyaWN0KSB7Ci0gICAgICAgIHJldHVybiBBY3RpdmF0ZVV0aWxzLmlzRXF1aXZhbGVudChhMSwgYTIsIHN0cmljdCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29tcGFyZXMgdGhlIHR3byBjb2xsZWN0aW9ucyB0byBzZWUgaWYgdGhleSBhcmUgZXF1aXZhbGVudC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbTEgVGhlIGZpcnN0IGNvbGxlY3Rpb24KLSAgICAgKiBAcGFyYW0gbTIgVGhlIHNlY29uZCBjb2xsZWN0aW9uCi0gICAgICogQHBhcmFtIHN0cmljdCBJbmRpY2F0ZXMgd2hldGhlciBzdHJpY3QgY2hlY2tpbmcgaXMgcmVxdWlyZWQuIFN0cmljdCBjaGVja2luZyBtZWFucyB0aGF0IHRoZQotICAgICAqIHR3byBjb2xsZWN0aW9ucyBtdXN0IGhhdmUgdGhlIHNhbWUgbWFwcGluZ3MuIE5vbi1zdHJpY3QgY2hlY2tpbmcgbWVhbnMgdGhhdCB0aGUgdHdvCi0gICAgICogY29sbGVjdGlvbnMgbXVzdCBoYXZlIHRoZSBzYW1lIGtleXMuIEluIGJvdGggY2FzZXMsIHRoZSBvcmRlciBpcyBub3Qgc2lnbmlmaWNhbnQuCi0gICAgICogQHJldHVybiBUUlVFIGlmIHRoZSB0d28gY29sbGVjdGlvbnMgYXJlIGVxdWl2YWxlbnQgRkFMU0UsIG90aGVyd2lzZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0VxdWl2YWxlbnQoTWFwIG0xLCBNYXAgbTIsIGJvb2xlYW4gc3RyaWN0KSB7Ci0gICAgICAgIHJldHVybiBBY3RpdmF0ZVV0aWxzLmlzRXF1aXZhbGVudChtMSwgbTIsIHN0cmljdCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29tcGFyZXMgdGhlIHR3byBjb2xsZWN0aW9ucyB0byBzZWUgaWYgdGhleSBhcmUgZXF1aXZhbGVudC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbDEKLSAgICAgKiAgICAgICAgICAgIFRoZSBmaXJzdCBjb2xsZWN0aW9uCi0gICAgICogQHBhcmFtIGwyCi0gICAgICogICAgICAgICAgICBUaGUgc2Vjb25kIGNvbGxlY3Rpb24KLSAgICAgKiBAcmV0dXJuIFRSVUUgaWYgdGhlIHR3byBjb2xsZWN0aW9ucyBhcmUgZXF1aXZhbGVudCBGQUxTRSwgb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzRXF1aXZhbGVudChMaW5rZWRMaXN0IGwxLCBMaW5rZWRMaXN0IGwyKSB7Ci0gICAgICAgIHJldHVybiBBY3RpdmF0ZVV0aWxzLmlzRXF1aXZhbGVudChsMSwgbDIpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi91dGlsL09wdGlvbnNQYXJzZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi91dGlsL09wdGlvbnNQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZiMDYzMC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdXRpbC9PcHRpb25zUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudXRpbDsKLQotLyoqCi0gKiBHZW5lcmFsIHB1cnBvc2UgY29tbWFuZCBsaW5lIG9wdGlvbnMgcGFyc2VyLgotICogSWYgdGhpcyBpcyB1c2VkIG91dHNpZGUgb2YgQXhpcyBqdXN0IHJlbW92ZSB0aGUgQXhpcyBzcGVjaWZpYyBzZWN0aW9ucy4KLSAqLwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1wdWJsaWMgY2xhc3MgT3B0aW9uc1BhcnNlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKE9wdGlvbnNQYXJzZXIuY2xhc3MpOwotICAgIFN0cmluZyBhcmdzW10gPSBudWxsOwotICAgIFZlY3RvciB1c2VkQXJncyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciAtIGp1c3QgcGFzcyBpbiB0aGUgPGI+YXJnczwvYj4gZnJvbSB0aGUgY29tbWFuZCBsaW5lLgotICAgICAqLwotICAgIHB1YmxpYyBPcHRpb25zUGFyc2VyKFN0cmluZyBfYXJnc1tdKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKF9hcmdzID09IG51bGwpIHsKLSAgICAgICAgICAgIF9hcmdzID0gbmV3IFN0cmluZ1tde307Ci0gICAgICAgIH0KLQotICAgICAgICBhcmdzID0gX2FyZ3M7Ci0gICAgICAgIHVzZWRBcmdzID0gbnVsbDsKLSAgICAgICAgZ2V0VXNlcigpOwotICAgICAgICBnZXRQYXNzd29yZCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFzc3dvcmQoKSB7Ci0gICAgICAgIHJldHVybiAoaXNWYWx1ZVNldCgndycpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHJldHVybnMgYW4gYXJyYXkgb2YgdW51c2VkIGFyZ3MgLSB0aGVzZSBhcmUgdGhlIG5vbi1vcHRpb24KLSAgICAgKiBhcmdzIGZyb20gdGhlIGNvbW1hbmQgbGluZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0UmVtYWluaW5nQXJncygpIHsKLSAgICAgICAgQXJyYXlMaXN0IGFsID0gbnVsbDsKLSAgICAgICAgaW50IGxvb3A7Ci0KLSAgICAgICAgZm9yIChsb29wID0gMDsgbG9vcCA8IGFyZ3MubGVuZ3RoOyBsb29wKyspIHsKLSAgICAgICAgICAgIGlmICgoYXJnc1tsb29wXSA9PSBudWxsKSB8fCAoYXJnc1tsb29wXS5sZW5ndGgoKSA9PSAwKSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoYXJnc1tsb29wXS5jaGFyQXQoMCkgPT0gJy0nKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChhbCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYWwgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGFsLmFkZChhcmdzW2xvb3BdKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChhbCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gKG51bGwpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGFbXSA9IG5ldyBTdHJpbmdbYWwuc2l6ZSgpXTsKLQotICAgICAgICBmb3IgKGxvb3AgPSAwOyBsb29wIDwgYWwuc2l6ZSgpOyBsb29wKyspIHsKLSAgICAgICAgICAgIGFbbG9vcF0gPSAoU3RyaW5nKSBhbC5nZXQobG9vcCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gKGEpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMganVzdCByZXR1cm5zIGEgc3RyaW5nIHdpdGggdGhlIHVucHJvY2Vzc2VkIGZsYWdzIC0gbWFpbmx5Ci0gICAgICogZm9yIGVycm9yIHJlcG9ydGluZyAtIHNvIHlvdSBjYW4gcmVwb3J0IHRoZSB1bmtub3duIGZsYWdzLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVtYWluaW5nRmxhZ3MoKSB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG51bGw7Ci0gICAgICAgIGludCBsb29wOwotCi0gICAgICAgIGZvciAobG9vcCA9IDA7IGxvb3AgPCBhcmdzLmxlbmd0aDsgbG9vcCsrKSB7Ci0gICAgICAgICAgICBpZiAoKGFyZ3NbbG9vcF0gPT0gbnVsbCkgfHwgKGFyZ3NbbG9vcF0ubGVuZ3RoKCkgPT0gMCkpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGFyZ3NbbG9vcF0uY2hhckF0KDApICE9ICctJykgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoc2IgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzYi5hcHBlbmQoYXJnc1tsb29wXS5zdWJzdHJpbmcoMSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuICgoc2IgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICA/IG51bGwKLSAgICAgICAgICAgICAgICA6IHNiLnRvU3RyaW5nKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXNlcigpIHsKLSAgICAgICAgcmV0dXJuIChpc1ZhbHVlU2V0KCd1JykpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gaW50IHNwZWNpZnlpbmcgdGhlIG51bWJlciBvZiB0aW1lcyB0aGF0IHRoZSBmbGFnIHdhcwotICAgICAqIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lLiAgT25jZSB0aGlzIGZsYWcgaXMgbG9va2VkIGZvciB5b3UKLSAgICAgKiBtdXN0IHNhdmUgdGhlIHJlc3VsdCBiZWNhdXNlIGlmIHlvdSBjYWxsIGl0IGFnYWluIGZvciB0aGUgc2FtZQotICAgICAqIGZsYWcgeW91J2xsIGdldCB6ZXJvLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgaXNGbGFnU2V0KGNoYXIgb3B0Q2hhcikgewotICAgICAgICBpbnQgdmFsdWUgPSAwOwotICAgICAgICBpbnQgbG9vcDsKLSAgICAgICAgaW50IGk7Ci0KLSAgICAgICAgZm9yIChsb29wID0gMDsgKHVzZWRBcmdzICE9IG51bGwpICYmIChsb29wIDwgdXNlZEFyZ3Muc2l6ZSgpKTsgbG9vcCsrKSB7Ci0gICAgICAgICAgICBTdHJpbmcgYXJnID0gKFN0cmluZykgdXNlZEFyZ3MuZWxlbWVudEF0KGxvb3ApOwotCi0gICAgICAgICAgICBpZiAoYXJnLmNoYXJBdCgwKSAhPSAnLScpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGFyZy5sZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGFyZy5jaGFyQXQoaSkgPT0gb3B0Q2hhcikgewotICAgICAgICAgICAgICAgICAgICB2YWx1ZSsrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGZvciAobG9vcCA9IDA7IGxvb3AgPCBhcmdzLmxlbmd0aDsgbG9vcCsrKSB7Ci0gICAgICAgICAgICBpZiAoKGFyZ3NbbG9vcF0gPT0gbnVsbCkgfHwgKGFyZ3NbbG9vcF0ubGVuZ3RoKCkgPT0gMCkpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGFyZ3NbbG9vcF0uY2hhckF0KDApICE9ICctJykgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB3aGlsZSAoKGFyZ3NbbG9vcF0gIT0gbnVsbCkgJiYgKGkgPSBhcmdzW2xvb3BdLmluZGV4T2Yob3B0Q2hhcikpICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgYXJnc1tsb29wXSA9IGFyZ3NbbG9vcF0uc3Vic3RyaW5nKDAsIGkpICsgYXJnc1tsb29wXS5zdWJzdHJpbmcoaSArIDEpOwotCi0gICAgICAgICAgICAgICAgaWYgKGFyZ3NbbG9vcF0ubGVuZ3RoKCkgPT0gMSkgewotICAgICAgICAgICAgICAgICAgICBhcmdzW2xvb3BdID0gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB2YWx1ZSsrOwotCi0gICAgICAgICAgICAgICAgaWYgKHVzZWRBcmdzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdXNlZEFyZ3MgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgdXNlZEFyZ3MuYWRkKCItIiArIG9wdENoYXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuICh2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIHN0cmluZyAob3IgbnVsbCkgc3BlY2lmeWluZyB0aGUgdmFsdWUgZm9yIHRoZSBwYXNzZWQKLSAgICAgKiBvcHRpb24uICBJZiB0aGUgb3B0aW9uIGlzbid0IHRoZXJlIHRoZW4gbnVsbCBpcyByZXR1cm5lZC4gIFRoZQotICAgICAqIG9wdGlvbidzIHZhbHVlIGNhbiBiZSBzcGVjaWZpZWQgb25lIG9mIHR3byB3YXlzOgotICAgICAqIC14IHZhbHVlCi0gICAgICogLXh2YWx1ZQotICAgICAqIE5vdGUgdGhhdDogIC1heCB2YWx1ZQotICAgICAqIGlzIG5vdCB2YWx1ZSAobWVhbmluZyBmbGFnICdhJyBmb2xsb3dlZCBieSBvcHRpb24gJ3gnLgotICAgICAqIE9wdGlvbnMgd2l0aCB2YWx1ZXMgbXVzdCBiZSB0aGUgZmlyc3QgY2hhciBhZnRlciB0aGUgJy0nLgotICAgICAqIElmIHRoZSBvcHRpb24gaXMgc3BlY2lmaWVkIG1vcmUgdGhhbiBvbmNlIHRoZW4gdGhlIGxhc3Qgb25lIHdpbnMuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBpc1ZhbHVlU2V0KGNoYXIgb3B0Q2hhcikgewotICAgICAgICBTdHJpbmcgdmFsdWUgPSBudWxsOwotICAgICAgICBpbnQgbG9vcDsKLSAgICAgICAgaW50IGk7Ci0KLSAgICAgICAgZm9yIChsb29wID0gMDsgKHVzZWRBcmdzICE9IG51bGwpICYmIChsb29wIDwgdXNlZEFyZ3Muc2l6ZSgpKTsgbG9vcCsrKSB7Ci0gICAgICAgICAgICBTdHJpbmcgYXJnID0gKFN0cmluZykgdXNlZEFyZ3MuZWxlbWVudEF0KGxvb3ApOwotCi0gICAgICAgICAgICBpZiAoKGFyZy5jaGFyQXQoMCkgIT0gJy0nKSB8fCAoYXJnLmNoYXJBdCgxKSAhPSBvcHRDaGFyKSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB2YWx1ZSA9IGFyZy5zdWJzdHJpbmcoMik7Ci0KLSAgICAgICAgICAgIGlmIChsb29wICsgMSA8IHVzZWRBcmdzLnNpemUoKSkgewotICAgICAgICAgICAgICAgIHZhbHVlID0gKFN0cmluZykgdXNlZEFyZ3MuZWxlbWVudEF0KCsrbG9vcCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGxvb3AgPSAwOyBsb29wIDwgYXJncy5sZW5ndGg7IGxvb3ArKykgewotICAgICAgICAgICAgaWYgKChhcmdzW2xvb3BdID09IG51bGwpIHx8IChhcmdzW2xvb3BdLmxlbmd0aCgpID09IDApKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChhcmdzW2xvb3BdLmNoYXJBdCgwKSAhPSAnLScpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaSA9IGFyZ3NbbG9vcF0uaW5kZXhPZihvcHRDaGFyKTsKLQotICAgICAgICAgICAgaWYgKGkgIT0gMSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoaSAhPSBhcmdzW2xvb3BdLmxlbmd0aCgpIC0gMSkgewotCi0gICAgICAgICAgICAgICAgLy8gTm90IGF0IGVuZCBvZiBhcmcsIHNvIHVzZSByZXN0IG9mIGFyZyBhcyB2YWx1ZQotICAgICAgICAgICAgICAgIHZhbHVlID0gYXJnc1tsb29wXS5zdWJzdHJpbmcoaSArIDEpOwotICAgICAgICAgICAgICAgIGFyZ3NbbG9vcF0gPSBhcmdzW2xvb3BdLnN1YnN0cmluZygwLCBpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0KLSAgICAgICAgICAgICAgICAvLyBSZW1vdmUgdGhlIGNoYXIgZnJvbSB0aGUgY3VycmVudCBhcmcKLSAgICAgICAgICAgICAgICBhcmdzW2xvb3BdID0gYXJnc1tsb29wXS5zdWJzdHJpbmcoMCwgaSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBOb3RoaW5nIGFmdGVyIGNoYXIgc28gdXNlIG5leHQgYXJnCi0gICAgICAgICAgICAgICAgaWYgKChsb29wICsgMSA8IGFyZ3MubGVuZ3RoKSAmJiAoYXJnc1tsb29wICsgMV0gIT0gbnVsbCkpIHsKLQotICAgICAgICAgICAgICAgICAgICAvLyBOZXh0IGFyZyBpcyB0aGVyZSBhbmQgbm9uLW51bGwKLSAgICAgICAgICAgICAgICAgICAgaWYgKGFyZ3NbbG9vcCArIDFdLmNoYXJBdCgwKSAhPSAnLScpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gYXJnc1tsb29wICsgMV07Ci0gICAgICAgICAgICAgICAgICAgICAgICBhcmdzW2xvb3AgKyAxXSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotCi0gICAgICAgICAgICAgICAgICAgIC8vIE5leHQgaXMgbnVsbCBvciBub3QgdGhlcmUgLSBkbyBub3RoaW5nCi0gICAgICAgICAgICAgICAgICAgIC8vIHZhbHVlID0gbnVsbCA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoYXJnc1tsb29wXS5sZW5ndGgoKSA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgYXJnc1tsb29wXSA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEZvciBub3csIGtlZXAgbG9vcGluZyB0byBnZXQgdGhhdCBsYXN0IG9uIHRoZXJlCi0gICAgICAgICAgICAvLyBicmVhayA7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKHVzZWRBcmdzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB1c2VkQXJncyA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdXNlZEFyZ3MuYWRkKCItIiArIG9wdENoYXIpOwotCi0gICAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgdXNlZEFyZ3MuYWRkKHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAodmFsdWUpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi91dGlsL09wdGlvbnNWYWxpZGF0b3IuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi91dGlsL09wdGlvbnNWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JlNjcwNi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdXRpbC9PcHRpb25zVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudXRpbDsKLQotLyoqCi0gKiBBbiBpbnRlcmZhY2UgZm9yIHRoZSBvcHRpb25zIHZhbGlkYXRvci4gVGhpcyBhY3RzIGFzIHRoZSBpbnB1dCBmb3IgdGhlIGNvbW1hbmRsaW5lT3B0aW9ucyBwYXJzZXIKLSAqLwotcHVibGljIGludGVyZmFjZSBPcHRpb25zVmFsaWRhdG9yIHsKLQotICAgIHB1YmxpYyBib29sZWFuIGlzSW52YWxpZChDb21tYW5kTGluZU9wdGlvbiBvcHRpb24pOwotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvUG9saWN5TG9jYXRvci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvUG9saWN5TG9jYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTY5N2Y2Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi91dGlsL1BvbGljeUxvY2F0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudXRpbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YXJldHJpZXZhbC5EUkNvbnN0YW50czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhcmV0cmlldmFsLkRhdGE7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YXJldHJpZXZhbC5EYXRhUmV0cmlldmFsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFyZXRyaWV2YWwuRGF0YVJldHJpZXZhbFJlcXVlc3Q7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5uZWV0aGkuUG9saWN5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm5lZXRoaS5Qb2xpY3lFbmdpbmU7DQotaW1wb3J0IG9yZy5hcGFjaGUubmVldGhpLlBvbGljeVJlZ2lzdHJ5Ow0KLQ0KLXB1YmxpYyBjbGFzcyBQb2xpY3lMb2NhdG9yIGltcGxlbWVudHMgUG9saWN5UmVnaXN0cnkgew0KLQ0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coUG9saWN5TG9jYXRvci5jbGFzcyk7DQotDQotCXByaXZhdGUgQXhpc1NlcnZpY2Ugc2VydmljZTsNCi0NCi0JcHVibGljIFBvbGljeUxvY2F0b3IoQXhpc1NlcnZpY2Ugc2VydmljZSkgew0KLQkJdGhpcy5zZXJ2aWNlID0gc2VydmljZTsNCi0JfQ0KLQ0KLQlwdWJsaWMgUG9saWN5IGxvb2t1cChTdHJpbmcgaWRlbnRpZmllcikgew0KLQkJUG9saWN5IHBvbGljeSA9IHNlcnZpY2UubG9va3VwUG9saWN5KGlkZW50aWZpZXIpOw0KLQkJaWYgKHBvbGljeSA9PSBudWxsKSB7DQotCQkJdHJ5IHsNCi0JCQkJTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOw0KLQkJCQltc2dDb250ZXh0LnNldEF4aXNTZXJ2aWNlKHNlcnZpY2UpOw0KLQ0KLQkJCQlEYXRhUmV0cmlldmFsUmVxdWVzdCByZXF1ZXN0ID0gbmV3IERhdGFSZXRyaWV2YWxSZXF1ZXN0KCk7DQotCQkJCXJlcXVlc3QucHV0RGlhbGVjdChEUkNvbnN0YW50cy5TUEVDLkRJQUxFQ1RfVFlQRV9QT0xJQ1kpOw0KLQkJCQlyZXF1ZXN0LnB1dElkZW50aWZpZXIoaWRlbnRpZmllcik7DQotDQotCQkJCURhdGFbXSBkYXRhID0gc2VydmljZS5nZXREYXRhKHJlcXVlc3QsIG1zZ0NvbnRleHQpOw0KLQkJCQlpZiAoZGF0YS5sZW5ndGggIT0gMCkgew0KLQkJCQkJT01FbGVtZW50IGVsZW1lbnQgPSAoT01FbGVtZW50KSBkYXRhWzBdLmdldERhdGEoKTsNCi0JCQkJCQ0KLQkJCQkJaWYgKGVsZW1lbnQgIT0gbnVsbCkgew0KLQkJCQkJCXJldHVybiBQb2xpY3lFbmdpbmUuZ2V0UG9saWN5KGVsZW1lbnQpOw0KLQkJCQkJfQ0KLQkJCQl9DQotCQkJCQ0KLQkJCX0gY2F0Y2ggKERhdGFSZXRyaWV2YWxFeGNlcHRpb24gZXgpIHsNCi0JCQkJbG9nZ2VyLmVycm9yKCIiICsgZXgpOw0KLQkJCX0gY2F0Y2ggKEF4aXNGYXVsdCBleCkgew0KLQkJCQlsb2dnZXIuZXJyb3IoIiIgKyBleCk7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuIHBvbGljeTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCByZWdpc3RlcihTdHJpbmcgaWRlbnRpZmllciwgUG9saWN5IHBvbGljeSkgew0KLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7DQotDQotCX0NCi0NCi0JcHVibGljIHZvaWQgcmVtb3ZlKFN0cmluZyBpZGVudGlmaWVyKSB7DQotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsNCi0NCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdXRpbC9Qb2xpY3lVdGlsLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdXRpbC9Qb2xpY3lVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMjIzZmYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvUG9saWN5VXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi51dGlsOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5GYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MT3V0cHV0RmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLnV0aWwuVVVJREdlbmVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNNZXNzYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUG9saWN5SW5jbHVkZTsKLWltcG9ydCBvcmcuYXBhY2hlLm5lZXRoaS5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5uZWV0aGkuUG9saWN5OwotaW1wb3J0IG9yZy5hcGFjaGUubmVldGhpLlBvbGljeUNvbXBvbmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLm5lZXRoaS5Qb2xpY3lFbmdpbmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5uZWV0aGkuUG9saWN5UmVmZXJlbmNlOwotCi1pbXBvcnQgY29tLmlibS53c2RsLnV0aWwueG1sLkRPTTJXcml0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBQb2xpY3lVdGlsIHsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFNhZmVTdHJpbmcoU3RyaW5nIHVuc2FmZVN0cmluZykgewotCQlTdHJpbmdCdWZmZXIgc2J1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCQljaGFyW10gY2hhcnMgPSB1bnNhZmVTdHJpbmcudG9DaGFyQXJyYXkoKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoYXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQljaGFyIGMgPSBjaGFyc1tpXTsKLQotCQkJc3dpdGNoIChjKSB7Ci0JCQljYXNlICdcXCc6Ci0JCQkJc2J1Zi5hcHBlbmQoJ1xcJyk7Ci0JCQkJc2J1Zi5hcHBlbmQoJ1xcJyk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICciJzoKLQkJCQlzYnVmLmFwcGVuZCgnXFwnKTsKLQkJCQlzYnVmLmFwcGVuZCgnIicpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAnXG4nOgotCQkJCXNidWYuYXBwZW5kKCdcXCcpOwotCQkJCXNidWYuYXBwZW5kKCduJyk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICdccic6Ci0JCQkJc2J1Zi5hcHBlbmQoJ1xcJyk7Ci0JCQkJc2J1Zi5hcHBlbmQoJ3InKTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJc2J1Zi5hcHBlbmQoYyk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gc2J1Zi50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgUG9saWN5UmVmZXJlbmNlIGNyZWF0ZVBvbGljeVJlZmVyZW5jZShQb2xpY3kgcG9saWN5KSB7Ci0JCVBvbGljeVJlZmVyZW5jZSBwb2xpY3lSZWZlcmVuY2UgPSBuZXcgUG9saWN5UmVmZXJlbmNlKCk7Ci0JCVN0cmluZyBrZXkgPSBwb2xpY3kuZ2V0TmFtZSgpOwotCQlpZiAoa2V5ID09IG51bGwpIHsKLQkJCWtleSA9IHBvbGljeS5nZXRJZCgpOwotCQkJaWYgKGtleSA9PSBudWxsKSB7Ci0JCQkJa2V5ID0gVVVJREdlbmVyYXRvci5nZXRVVUlEKCk7Ci0JCQkJcG9saWN5LnNldElkKGtleSk7Ci0JCQl9Ci0JCQlwb2xpY3lSZWZlcmVuY2Uuc2V0VVJJKCIjIiArIGtleSk7Ci0JCX0gZWxzZSB7Ci0JCQlwb2xpY3lSZWZlcmVuY2Uuc2V0VVJJKGtleSk7Ci0JCX0KLQkJcmV0dXJuIHBvbGljeVJlZmVyZW5jZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIE9NRWxlbWVudCBnZXRQb2xpY3lDb21wb25lbnRBc09NRWxlbWVudCgKLQkJCVBvbGljeUNvbXBvbmVudCBwb2xpY3lDb21wb25lbnQsCi0JCQlFeHRlcm5hbFBvbGljeVNlcmlhbGl6ZXIgZXh0ZXJuYWxQb2xpY3lTZXJpYWxpemVyKQotCQkJdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvciB7Ci0KLQkJaWYgKHBvbGljeUNvbXBvbmVudCBpbnN0YW5jZW9mIFBvbGljeSkgewotCQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCQlleHRlcm5hbFBvbGljeVNlcmlhbGl6ZXIuc2VyaWFsaXplKChQb2xpY3kpIHBvbGljeUNvbXBvbmVudCwgYmFvcyk7Ci0JCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSBiYWlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MKLQkJCQkJLnRvQnl0ZUFycmF5KCkpOwotCQkJcmV0dXJuIChPTUVsZW1lbnQpIFhNTFV0aWxzLnRvT00oYmFpcyk7Ci0KLQkJfSBlbHNlIHsKLQkJCU9NRmFjdG9yeSBmYWMgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKTsKLQkJCU9NRWxlbWVudCBlbGVtID0gZmFjLmNyZWF0ZU9NRWxlbWVudChDb25zdGFudHMuRUxFTV9QT0xJQ1lfUkVGLAotCQkJCQlDb25zdGFudHMuVVJJX1BPTElDWV9OUywgQ29uc3RhbnRzLkFUVFJfV1NQKTsKLQkJCWVsZW0uYWRkQXR0cmlidXRlKENvbnN0YW50cy5BVFRSX1VSSSwKLQkJCQkJKChQb2xpY3lSZWZlcmVuY2UpIHBvbGljeUNvbXBvbmVudCkuZ2V0VVJJKCksIG51bGwpOwotCQkJcmV0dXJuIGVsZW07Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIE9NRWxlbWVudCBnZXRQb2xpY3lDb21wb25lbnRBc09NRWxlbWVudCgKLQkJCVBvbGljeUNvbXBvbmVudCBjb21wb25lbnQpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sCi0JCQlGYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yIHsKLQotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJWE1MU3RyZWFtV3JpdGVyIHdyaXRlciA9IFhNTE91dHB1dEZhY3RvcnkubmV3SW5zdGFuY2UoKQotCQkJCS5jcmVhdGVYTUxTdHJlYW1Xcml0ZXIoYmFvcyk7Ci0KLQkJY29tcG9uZW50LnNlcmlhbGl6ZSh3cml0ZXIpOwotCQl3cml0ZXIuZmx1c2goKTsKLQotCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSBiYWlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSk7Ci0JCXJldHVybiAoT01FbGVtZW50KSBYTUxVdGlscy50b09NKGJhaXMpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgUG9saWN5Q29tcG9uZW50IGdldFBvbGljeUNvbXBvbmVudEZyb21PTUVsZW1lbnQoCi0JCQlPTUVsZW1lbnQgcG9saWN5Q29tcG9uZW50KSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLQotCQlpZiAoQ29uc3RhbnRzLlFfRUxFTV9QT0xJQ1kuZXF1YWxzKHBvbGljeUNvbXBvbmVudC5nZXRRTmFtZSgpKSkgewotCQkJcmV0dXJuIFBvbGljeUVuZ2luZS5nZXRQb2xpY3kocG9saWN5Q29tcG9uZW50KTsKLQotCQl9IGVsc2UgaWYgKHBvbGljeUNvbXBvbmVudC5nZXRRTmFtZSgpLmVxdWFscygKLQkJCQluZXcgUU5hbWUoQ29uc3RhbnRzLlVSSV9QT0xJQ1lfTlMsIENvbnN0YW50cy5FTEVNX1BPTElDWV9SRUYpKSkgewotCQkJcmV0dXJuIFBvbGljeUVuZ2luZS5nZXRQb2xpY3lSZWZlcmVuY2UocG9saWN5Q29tcG9uZW50KTsKLQotCQl9IGVsc2UgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLQkJCQkJIkFncnVtZW50IGlzIG5laXRoZXIgYSA8d3NwOlBvbGljeT4gbm9yIGEgPHdzcDpQb2xpY3lSZWZlcmVuY2U+IGVsZW1lbnQiKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgUG9saWN5IGdldFBvbGljeUZyb21PTUVsZW1lbnQoT01FbGVtZW50IHBvbGljeUVsZW1lbnQpIHsKLQkJaWYgKENvbnN0YW50cy5RX0VMRU1fUE9MSUNZLmVxdWFscyhwb2xpY3lFbGVtZW50LmdldFFOYW1lKCkpKSB7Ci0JCQlyZXR1cm4gUG9saWN5RW5naW5lLmdldFBvbGljeShwb2xpY3lFbGVtZW50KTsKLQkJfSBlbHNlIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0JCQkJCSJhcmd1bWVudCBpcyBub3QgYSA8d3NwOlBvbGljeSAuLj4gZWxlbWVudCIpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBQb2xpY3lSZWZlcmVuY2UgZ2V0UG9saWN5UmVmZXJlbmNlRnJvbU9NRWxlbWVudCgKLQkJCU9NRWxlbWVudCBwb2xpY3lSZWZFbGVtZW50KSB7Ci0JCWlmIChDb25zdGFudHMuVVJJX1BPTElDWV9OUy5lcXVhbHMocG9saWN5UmVmRWxlbWVudC5nZXROYW1lc3BhY2UoKQotCQkJCS5nZXROYW1lc3BhY2VVUkkoKSkKLQkJCQkmJiBDb25zdGFudHMuRUxFTV9QT0xJQ1lfUkVGLmVxdWFscyhwb2xpY3lSZWZFbGVtZW50Ci0JCQkJCQkuZ2V0TG9jYWxOYW1lKCkpKSB7Ci0JCQlyZXR1cm4gUG9saWN5RW5naW5lLmdldFBvbGljeVJlZmVyZW5jZShwb2xpY3lSZWZFbGVtZW50KTsKLQkJfSBlbHNlIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0JCQkJCSJhcmd1bWVudCBpcyBub3QgYSA8d3NwOlBvbGljeVJlZmVyZW5jZT4gZWxlbWVudCIpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBQb2xpY3lDb21wb25lbnQgZ2V0UG9saWN5Q29tcG9uZW50KG9yZy53M2MuZG9tLkVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoQ29uc3RhbnRzLlVSSV9QT0xJQ1lfTlMuZXF1YWxzKGVsZW1lbnQuZ2V0TmFtZXNwYWNlVVJJKCkpKSB7Ci0KLQkJCWlmIChDb25zdGFudHMuRUxFTV9QT0xJQ1kuZXF1YWxzKGVsZW1lbnQuZ2V0TG9jYWxOYW1lKCkpKSB7Ci0JCQkJcmV0dXJuIFBvbGljeUVuZ2luZS5nZXRQb2xpY3kobm9kZVRvU3RyZWFtKGVsZW1lbnQpKTsKLQotCQkJfSBlbHNlIGlmIChDb25zdGFudHMuRUxFTV9QT0xJQ1lfUkVGLmVxdWFscyhlbGVtZW50LmdldExvY2FsTmFtZSgpKSkgewotCQkJCXJldHVybiBQb2xpY3lFbmdpbmUuZ2V0UG9saWN5UmVmZXJlbmUobm9kZVRvU3RyZWFtKGVsZW1lbnQpKTsKLQkJCX0KLQkJfQotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotCQkJCSJBZ3J1bWVudCBpcyBuZWl0aGVyIGEgPHdzcDpQb2xpY3k+IG5vciBhIDx3c3A6UG9saWN5UmVmZXJlbmNlPiBlbGVtZW50Iik7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSW5wdXRTdHJlYW0gbm9kZVRvU3RyZWFtKG9yZy53M2MuZG9tLkVsZW1lbnQgZWxlbWVudCkgewotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJVHJhbnNmb3JtZXIgdGY7Ci0JCXRyeSB7Ci0JCQkvLyB0ZiA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1RyYW5zZm9ybWVyKCk7Ci0JCQkvLyB0Zi50cmFuc2Zvcm0obmV3IERPTVNvdXJjZShlbGVtZW50KSwgbmV3IFN0cmVhbVJlc3VsdChiYW9zKSk7Ci0JCQlTdHJpbmcgbm9kZVN0cmluZyA9IERPTTJXcml0ZXIubm9kZVRvU3RyaW5nKGVsZW1lbnQpOwotCQkJcmV0dXJuIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShub2RlU3RyaW5nLmdldEJ5dGVzKCkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlVuYWJsZSB0byBwcm9jZXNzIHBvbGljeSIpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcG9saWN5Q29tcG9uZW50VG9TdHJpbmcoUG9saWN5Q29tcG9uZW50IHBvbGljeUNvbXBvbmVudCkKLQkJCXRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sIEZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3IgewotCi0JCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQlYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyID0gWE1MT3V0cHV0RmFjdG9yeS5uZXdJbnN0YW5jZSgpCi0JCQkJLmNyZWF0ZVhNTFN0cmVhbVdyaXRlcihiYW9zKTsKLQotCQlwb2xpY3lDb21wb25lbnQuc2VyaWFsaXplKHdyaXRlcik7Ci0JCXdyaXRlci5mbHVzaCgpOwotCi0JCXJldHVybiBiYW9zLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2VuZXJhdGVJZChBeGlzRGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHsKLQkJUG9saWN5SW5jbHVkZSBwb2xpY3lJbmNsdWRlID0gZGVzY3JpcHRpb24uZ2V0UG9saWN5SW5jbHVkZSgpOwotCQlTdHJpbmcgaWRlbnRpZmllciA9ICItcG9saWN5LTEiOwotCi0JCWlmIChkZXNjcmlwdGlvbiBpbnN0YW5jZW9mIEF4aXNNZXNzYWdlKSB7Ci0JCQlpZGVudGlmaWVyID0gIm1zZy0iICsgKChBeGlzTWVzc2FnZSkgZGVzY3JpcHRpb24pLmdldE5hbWUoKQotCQkJCQkrIGlkZW50aWZpZXI7Ci0JCQlkZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uLmdldFBhcmVudCgpOwotCQl9Ci0KLQkJaWYgKGRlc2NyaXB0aW9uIGluc3RhbmNlb2YgQXhpc09wZXJhdGlvbikgewotCQkJaWRlbnRpZmllciA9ICJvcC0iICsgKChBeGlzT3BlcmF0aW9uKSBkZXNjcmlwdGlvbikuZ2V0TmFtZSgpCi0JCQkJCSsgaWRlbnRpZmllcjsKLQkJCWRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb24uZ2V0UGFyZW50KCk7Ci0JCX0KLQotCQlpZiAoZGVzY3JpcHRpb24gaW5zdGFuY2VvZiBBeGlzU2VydmljZSkgewotCQkJaWRlbnRpZmllciA9ICJzZXJ2aWNlLSIgKyAoKEF4aXNTZXJ2aWNlKSBkZXNjcmlwdGlvbikuZ2V0TmFtZSgpCi0JCQkJCSsgaWRlbnRpZmllcjsKLQkJfQotCi0JCS8qCi0JCSAqIEludCA0OSBpcyB0aGUgdmFsdWUgb2YgdGhlIENoYXJhY3RlciAnMScuIEhlcmUgd2Ugd2FudCB0byBjaGFuZ2UgJzEnCi0JCSAqIHRvICcyJyBvciAnMicgdG8gJzMnIC4uIGV0Yy4gdG8gY29uc3RydWN0IGEgdW5pcXVlIGlkZW50aWZpZXIuCi0JCSAqLwotCQlmb3IgKGludCBpbmRleCA9IDQ5OyBwb2xpY3lJbmNsdWRlLmdldFBvbGljeShpZGVudGlmaWVyKSAhPSBudWxsOyBpbmRleCsrKSB7Ci0JCQlpZGVudGlmaWVyID0gaWRlbnRpZmllci5yZXBsYWNlKChjaGFyKSBpbmRleCwgKGNoYXIpIChpbmRleCArIDEpKTsKLQkJfQotCi0JCXJldHVybiBpZGVudGlmaWVyOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgUG9saWN5IGdldE1lcmdlZFBvbGljeShMaXN0IHBvbGljaWVzLAotCQkJQXhpc0Rlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB7Ci0KLQkJUG9saWN5IHBvbGljeSA9IG51bGw7Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHBvbGljaWVzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBwb2xpY3lFbGVtZW50ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKHBvbGljeUVsZW1lbnQgaW5zdGFuY2VvZiBQb2xpY3kpIHsKLQkJCQlwb2xpY3kgPSAocG9saWN5ID09IG51bGwpID8gKFBvbGljeSkgcG9saWN5RWxlbWVudAotCQkJCQkJOiAoUG9saWN5KSBwb2xpY3kubWVyZ2UoKFBvbGljeSkgcG9saWN5RWxlbWVudCk7Ci0KLQkJCX0gZWxzZSB7Ci0JCQkJUG9saWN5UmVmZXJlbmNlIHBvbGljeVJlZmVyZW5jZSA9IChQb2xpY3lSZWZlcmVuY2UpIHBvbGljeUVsZW1lbnQ7Ci0JCQkJUG9saWN5IHBvbGljeTIgPSAoUG9saWN5KSBwb2xpY3lSZWZlcmVuY2Uubm9ybWFsaXplKAotCQkJCQkJbmV3IEF4aXNQb2xpY3lMb2NhdG9yKGRlc2NyaXB0aW9uKSwgZmFsc2UpOwotCQkJCXBvbGljeSA9IChwb2xpY3kgPT0gbnVsbCkgPyBwb2xpY3kyIDogKFBvbGljeSkgcG9saWN5Ci0JCQkJCQkubWVyZ2UocG9saWN5Mik7Ci0JCQl9Ci0JCX0KLQotCQlpZiAocG9saWN5ICE9IG51bGwpIHsKLQkJCXBvbGljeSA9IChQb2xpY3kpIHBvbGljeS5ub3JtYWxpemUobmV3IEF4aXNQb2xpY3lMb2NhdG9yKAotCQkJCQlkZXNjcmlwdGlvbiksIGZhbHNlKTsKLQkJfQotCi0JCXJldHVybiBwb2xpY3k7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBQb2xpY3kgZ2V0TWVyZ2VkUG9saWN5KExpc3QgcG9saWNpZXMsIEF4aXNTZXJ2aWNlIHNlcnZpY2UpIHsKLQotCQlQb2xpY3kgcG9saWN5ID0gbnVsbDsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gcG9saWNpZXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IHBvbGljeUVsZW1lbnQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAocG9saWN5RWxlbWVudCBpbnN0YW5jZW9mIFBvbGljeSkgewotCQkJCXBvbGljeSA9IChwb2xpY3kgPT0gbnVsbCkgPyAoUG9saWN5KSBwb2xpY3lFbGVtZW50Ci0JCQkJCQk6IChQb2xpY3kpIHBvbGljeS5tZXJnZSgoUG9saWN5KSBwb2xpY3lFbGVtZW50KTsKLQotCQkJfSBlbHNlIHsKLQkJCQlQb2xpY3lSZWZlcmVuY2UgcG9saWN5UmVmZXJlbmNlID0gKFBvbGljeVJlZmVyZW5jZSkgcG9saWN5RWxlbWVudDsKLQkJCQlQb2xpY3kgcG9saWN5MiA9IChQb2xpY3kpIHBvbGljeVJlZmVyZW5jZS5ub3JtYWxpemUoCi0JCQkJCQluZXcgUG9saWN5TG9jYXRvcihzZXJ2aWNlKSwgZmFsc2UpOwotCQkJCXBvbGljeSA9IChwb2xpY3kgPT0gbnVsbCkgPyBwb2xpY3kyIDogKFBvbGljeSkgcG9saWN5Ci0JCQkJCQkubWVyZ2UocG9saWN5Mik7Ci0JCQl9Ci0JCX0KLQotCQlpZiAocG9saWN5ICE9IG51bGwpIHsKLQkJCXBvbGljeSA9IChQb2xpY3kpIHBvbGljeS5ub3JtYWxpemUobmV3IFBvbGljeUxvY2F0b3Ioc2VydmljZSksCi0JCQkJCWZhbHNlKTsKLQkJfQotCi0JCXJldHVybiBwb2xpY3k7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvUHJldHR5UHJpbnRlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvUHJldHR5UHJpbnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDBlMDAwLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi91dGlsL1ByZXR0eVByaW50ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudXRpbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotCi0vKioKLSAqIFRpZGllcyB1cCB0aGUgamF2YSBzb3VyY2UgY29kZSB1c2luZyBKYWxvcHkuCi0gKiBUaGlzIGlzIHVzZWQgYnkgYm90aCBBREIgYW5kIENvZGVnZW4gaGVuY2UgbmVlZHMgdG8gYmUgaW4gdGhlCi0gKiBjb21tb25zIHJhdGhlciB0aGFuIGEgc3BlY2lmaWMgbW9kdWxlCi0gKi8KLXB1YmxpYyBjbGFzcyBQcmV0dHlQcmludGVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coUHJldHR5UHJpbnRlci5jbGFzcyk7Ci0KLQotICAgIC8qKgotICAgICAqIFByZXR0eSBwcmludHMgY29udGVudHMgb2YgdGhlIGphdmEgc291cmNlIGZpbGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZmlsZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwcmV0dGlmeShGaWxlIGZpbGUpIHsKLSAgICAgICAgLy8gSWYgdGhlIHVzZXIgaGFzIHNldCAiYXhpczIuamFsb3B5PWZhbHNlIiBvbiB0aGUgc3lzdGVtIHByb3BlcnR5LAotICAgICAgICAvLyB0aGVuIGp1c3QgcmV0dXJuIGJhY2sgdG8gY2FsbGVyCi0gICAgICAgIFN0cmluZyBwcm9wZXJ0eSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiYXhpczIuamFsb3B5Iik7Ci0gICAgICAgIGlmKChwcm9wZXJ0eSA9PSBudWxsKSB8fCAhSmF2YVV0aWxzLmlzVHJ1ZUV4cGxpY2l0bHkocHJvcGVydHkpKXsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBQcmludFN0cmVhbSBiYWNrdXBPdXRwdXRTdHJlYW0gPSBTeXN0ZW0ub3V0OwotICAgICAgICBQcmludFN0cmVhbSBiYWNrdXBFcnJvclN0cmVhbSA9IFN5c3RlbS5lcnI7Ci0gICAgICAgIFN5c3RlbS5zZXRPdXQobmV3IFByaW50U3RyZWFtKG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKSkpOwotICAgICAgICBTeXN0ZW0uc2V0RXJyKG5ldyBQcmludFN0cmVhbShuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCkpKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIENsYXNzIGNsYXp6Q29uZmlndXJhdG9yID0gTG9hZGVyLmxvYWRDbGFzcygib3JnLmFwYWNoZS5sb2c0ai5Qcm9wZXJ0eUNvbmZpZ3VyYXRvciIpOwotICAgICAgICAgICAgTWV0aG9kIGNvbmZpZ3VyZSA9IGNsYXp6Q29uZmlndXJhdG9yLmdldE1ldGhvZCgiY29uZmlndXJlIiwgbmV3IENsYXNzW117UHJvcGVydGllcy5jbGFzc30pOwotICAgICAgICAgICAgUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXMoKTsKLSAgICAgICAgICAgIHByb3BlcnRpZXMuc2V0UHJvcGVydHkoImxvZzRqLmxvZ2dlci5kZS5odW5zaWNrZXIuamFsb3B5LmlvIiwKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmdldFByb3BlcnR5KCJsb2c0ai5sb2dnZXIuZGUuaHVuc2lja2VyLmphbG9weS5pbyIsICJGQVRBTCIpKTsKLSAgICAgICAgICAgIGNvbmZpZ3VyZS5pbnZva2UobnVsbCwgbmV3IE9iamVjdFtde3Byb3BlcnRpZXN9KTsKLQotICAgICAgICAgICAgLy8gQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBKYWxvcHkgYmVhbgotICAgICAgICAgICAgQ2xhc3MgY2xhenogPSBMb2FkZXIubG9hZENsYXNzKCJkZS5odW5zaWNrZXIuamFsb3B5LkphbG9weSIpOwotICAgICAgICAgICAgT2JqZWN0IHByZXR0aWZpZXIgPSBjbGF6ei5uZXdJbnN0YW5jZSgpOwotCi0gICAgICAgICAgICAvLyBTZXQgdGhlIGlucHV0IGZpbGUKLSAgICAgICAgICAgIE1ldGhvZCBpbnB1dCA9IGNsYXp6LmdldE1ldGhvZCgic2V0SW5wdXQiLCBuZXcgQ2xhc3NbXXtGaWxlLmNsYXNzfSk7Ci0gICAgICAgICAgICBpbnB1dC5pbnZva2UocHJldHRpZmllciwgbmV3IE9iamVjdFtde2ZpbGV9KTsKLQotICAgICAgICAgICAgLy8gU2V0IHRoZSBvdXRwdXQgZmlsZQotICAgICAgICAgICAgTWV0aG9kIG91dHB1dCA9IGNsYXp6LmdldE1ldGhvZCgic2V0T3V0cHV0IiwgbmV3IENsYXNzW117RmlsZS5jbGFzc30pOwotICAgICAgICAgICAgb3V0cHV0Lmludm9rZShwcmV0dGlmaWVyLCBuZXcgT2JqZWN0W117ZmlsZX0pOwotCi0gICAgICAgICAgICBDbGFzcyBjbGF6ejIgPSBMb2FkZXIubG9hZENsYXNzKCJkZS5odW5zaWNrZXIuamFsb3B5LnN0b3JhZ2UuQ29udmVudGlvbiIpOwotICAgICAgICAgICAgTWV0aG9kIGluc3RhbmNlID0gY2xhenoyLmdldE1ldGhvZCgiZ2V0SW5zdGFuY2UiLCBuZXcgQ2xhc3NbXXt9KTsKLSAgICAgICAgICAgIE9iamVjdCBzZXR0aW5ncyA9IGluc3RhbmNlLmludm9rZShudWxsLCBuZXcgT2JqZWN0W117fSk7Ci0KLSAgICAgICAgICAgIENsYXNzIGNsYXp6MyA9IExvYWRlci5sb2FkQ2xhc3MoImRlLmh1bnNpY2tlci5qYWxvcHkuc3RvcmFnZS5Db252ZW50aW9uS2V5cyIpOwotICAgICAgICAgICAgRmllbGQgZmllbGQgPSBjbGF6ejMuZ2V0RmllbGQoIkNPTU1FTlRfRk9STUFUX01VTFRJX0xJTkUiKTsKLSAgICAgICAgICAgIE9iamVjdCBrZXkgPSBmaWVsZC5nZXQobnVsbCk7Ci0gICAgICAgICAgICBNZXRob2QgcHV0ID0gY2xhenoyLmdldE1ldGhvZCgicHV0IiwgbmV3IENsYXNzW117a2V5LmdldENsYXNzKCksIFN0cmluZy5jbGFzc30pOwotICAgICAgICAgICAgcHV0Lmludm9rZShzZXR0aW5ncywgbmV3IE9iamVjdFtde2tleSwgInRydWUifSk7Ci0KLSAgICAgICAgICAgIC8vIGZvcm1hdCBhbmQgb3ZlcndyaXRlIHRoZSBnaXZlbiBpbnB1dCBmaWxlCi0gICAgICAgICAgICBNZXRob2QgZm9ybWF0ID0gY2xhenouZ2V0TWV0aG9kKCJmb3JtYXQiLCBuZXcgQ2xhc3NbXXt9KTsKLSAgICAgICAgICAgIGZvcm1hdC5pbnZva2UocHJldHRpZmllciwgbmV3IE9iamVjdFtde30pOwotICAgICAgICAgICAgbG9nLmRlYnVnKCJQcmV0dHkgcHJpbnRlZCBmaWxlIDogIiArIGZpbGUpOwotICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiSmFsb3B5L0xvZzRqIG5vdCBmb3VuZCAtIHVuYWJsZSB0byBwcmV0dHkgcHJpbnQgIiArIGZpbGUpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbG9nLndhcm4oIkV4Y2VwdGlvbiBvY2N1cnJlZCB3aGlsZSB0cnlpbmcgdG8gcHJldHR5IHByaW50IGZpbGUgIiArIGZpbGUsIGUpOwotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJFeGNlcHRpb24gb2NjdXJyZWQgd2hpbGUgdHJ5aW5nIHRvIHByZXR0eSBwcmludCBmaWxlICIgKyBmaWxlLCB0KTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIFN5c3RlbS5zZXRPdXQoYmFja3VwT3V0cHV0U3RyZWFtKTsKLSAgICAgICAgICAgIFN5c3RlbS5zZXRFcnIoYmFja3VwRXJyb3JTdHJlYW0pOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvU2NoZW1hVXRpbC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvU2NoZW1hVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjZkMGNkLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi91dGlsL1NjaGVtYVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi51dGlsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWE7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFJbXBvcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFJbmNsdWRlOwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hT2JqZWN0Q29sbGVjdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFNjaGVtYVV0aWwgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhTY2hlbWFVdGlsLmNsYXNzKTsKLQotCi0gICAgcHVibGljIHN0YXRpYyBYbWxTY2hlbWFbXSBnZXRBbGxTY2hlbWFzKFhtbFNjaGVtYSBzY2hlbWEpIHsKLSAgICAgICAgSGFzaE1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICB0cmF2ZXJzZVNjaGVtYXMoc2NoZW1hLCBtYXApOwotICAgICAgICByZXR1cm4gKFhtbFNjaGVtYVtdKSBtYXAudmFsdWVzKCkudG9BcnJheShuZXcgWG1sU2NoZW1hW21hcC52YWx1ZXMoKS5zaXplKCldKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHRyYXZlcnNlU2NoZW1hcyhYbWxTY2hlbWEgc2NoZW1hLCBIYXNoTWFwIG1hcCkgewotICAgICAgICBTdHJpbmcga2V5ID0gc2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpICsgIjoiICsgc2NoZW1hLmdldFNvdXJjZVVSSSgpOwotICAgICAgICBpZiAobWFwLmNvbnRhaW5zS2V5KGtleSkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBtYXAucHV0KGtleSwgc2NoZW1hKTsKLQotICAgICAgICBYbWxTY2hlbWFPYmplY3RDb2xsZWN0aW9uIGluY2x1ZGVzID0gc2NoZW1hLmdldEluY2x1ZGVzKCk7Ci0gICAgICAgIGlmIChpbmNsdWRlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBJdGVyYXRvciB0ZW1wSXRlcmF0b3IgPSBpbmNsdWRlcy5nZXRJdGVyYXRvcigpOwotICAgICAgICAgICAgd2hpbGUgKHRlbXBJdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBPYmplY3QgbyA9IHRlbXBJdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBYbWxTY2hlbWFJbXBvcnQpIHsKLSAgICAgICAgICAgICAgICAgICAgWG1sU2NoZW1hIHNjaGVtYTEgPSAoKFhtbFNjaGVtYUltcG9ydCkgbykuZ2V0U2NoZW1hKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzY2hlbWExICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyYXZlcnNlU2NoZW1hcyhzY2hlbWExLCBtYXApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChvIGluc3RhbmNlb2YgWG1sU2NoZW1hSW5jbHVkZSkgewotICAgICAgICAgICAgICAgICAgICBYbWxTY2hlbWEgc2NoZW1hMSA9ICgoWG1sU2NoZW1hSW5jbHVkZSkgbykuZ2V0U2NoZW1hKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzY2hlbWExICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyYXZlcnNlU2NoZW1hcyhzY2hlbWExLCBtYXApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvU2VsZk1hbmFnZWREYXRhSG9sZGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdXRpbC9TZWxmTWFuYWdlZERhdGFIb2xkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWRlNDI0ZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdXRpbC9TZWxmTWFuYWdlZERhdGFIb2xkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi51dGlsOwotCi1pbXBvcnQgamF2YS5pby5FeHRlcm5hbGl6YWJsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT2JqZWN0SW5wdXQ7Ci1pbXBvcnQgamF2YS5pby5PYmplY3RPdXRwdXQ7Ci0KLXB1YmxpYyBjbGFzcyBTZWxmTWFuYWdlZERhdGFIb2xkZXIgaW1wbGVtZW50cyBFeHRlcm5hbGl6YWJsZSB7Ci0KLSAgICBwcml2YXRlIHRyYW5zaWVudCBTdHJpbmcgY2xhc3NuYW1lOwotICAgIHByaXZhdGUgdHJhbnNpZW50IFN0cmluZyBpZDsKLSAgICBwcml2YXRlIHRyYW5zaWVudCBieXRlW10gZGF0YTsKLQotICAgIHB1YmxpYyBTZWxmTWFuYWdlZERhdGFIb2xkZXIoKSB7Ci0gICAgICAgIC8vIHNob3VsZCBvbmx5IGJlIHVzZWQgYnkgdGhlIE9iamVjdFN0YXRlVXRpbHMKLSAgICB9Ci0KLSAgICAvLyBUT0RPIGJldHRlciBleGNlcHRpb24KLSAgICBwdWJsaWMgU2VsZk1hbmFnZWREYXRhSG9sZGVyKFN0cmluZyBjbGFzc25hbWUsIFN0cmluZyBpZCwgYnl0ZVtdIGRhdGEpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoKGNsYXNzbmFtZSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHx8IChpZCA9PSBudWxsKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIkFyZ3VtZW50IGNhbm5vdCBiZSBudWxsOiBjbGFzc25hbWUgPSAiICsgY2xhc3NuYW1lICsgIiwgaWQgPSAiICsgaWQpOwotICAgICAgICB9Ci0gICAgICAgIHRoaXMuY2xhc3NuYW1lID0gY2xhc3NuYW1lOwotICAgICAgICB0aGlzLmlkID0gaWQ7Ci0KLSAgICAgICAgLy8gVE9ETyBkZWVwIGNvcHkgbmVjZXNzYXJ5PwotICAgICAgICB0aGlzLmRhdGEgPSBuZXcgYnl0ZVtkYXRhLmxlbmd0aF07Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgdGhpcy5kYXRhW2ldID0gZGF0YVtpXTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgcmVhZEV4dGVybmFsKE9iamVjdElucHV0IGluKSB0aHJvd3MgSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICBjbGFzc25hbWUgPSAoU3RyaW5nKSBpbi5yZWFkVVRGKCk7Ci0gICAgICAgIGlkID0gKFN0cmluZykgaW4ucmVhZFVURigpOwotICAgICAgICBpbnQgZGF0YWxlbmd0aCA9IGluLnJlYWRJbnQoKTsKLSAgICAgICAgZGF0YSA9IG5ldyBieXRlW2RhdGFsZW5ndGhdOwotICAgICAgICBpbi5yZWFkKGRhdGEpOwotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGVFeHRlcm5hbChPYmplY3RPdXRwdXQgb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBvdXQud3JpdGVVVEYoY2xhc3NuYW1lKTsKLSAgICAgICAgb3V0LndyaXRlVVRGKGlkKTsKLSAgICAgICAgb3V0LndyaXRlSW50KGRhdGEubGVuZ3RoKTsKLSAgICAgICAgb3V0LndyaXRlKGRhdGEpOwotICAgIH0KLQotCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGFzc25hbWUoKSB7Ci0gICAgICAgIHJldHVybiBjbGFzc25hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIGJ5dGVbXSBnZXREYXRhKCkgewotICAgICAgICByZXR1cm4gZGF0YTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldElkKCkgewotICAgICAgICByZXR1cm4gaWQ7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdXRpbC9TZXNzaW9uVXRpbHMuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi91dGlsL1Nlc3Npb25VdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjZjMzU4Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi91dGlsL1Nlc3Npb25VdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnV0aWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2VHcm91cDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIFNlc3Npb25VdGlscyB7Ci0KLSAgICAvKioKLSAgICAgKiBXYWxrIHRocm91Z2ggdGhlIGxpc3Qgb2Ygc2VydmljZXMgYW5kIHVzZSB0aGUgbWluaW11bSBvZiB0aGUgc2NvcGVzIGFzIHRoZSBzY29wZSBmb3IgdGhlIHdob2xlIHNlcnZpY2UgZ3JvdXAKLSAgICAgKgotICAgICAqIEBwYXJhbSBheGlzU2VydmljZUdyb3VwCi0gICAgICogQHJldHVybiBzY29wZSBmb3IgdGhlIHNlcnZpY2UgZ3JvdXAKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjYWxjdWxhdGVNYXhTY29wZUZvclNlcnZpY2VHcm91cChBeGlzU2VydmljZUdyb3VwIGF4aXNTZXJ2aWNlR3JvdXApIHsKLSAgICAgICAgSXRlcmF0b3I8QXhpc1NlcnZpY2U+IHNlcnZpY3MgPSBheGlzU2VydmljZUdyb3VwLmdldFNlcnZpY2VzKCk7Ci0gICAgICAgIGludCBtYXhTY29wZSA9IDE7Ci0gICAgICAgIHdoaWxlIChzZXJ2aWNzLmhhc05leHQoKSkgewotICAgICAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UgPSAoQXhpc1NlcnZpY2UpIHNlcnZpY3MubmV4dCgpOwotICAgICAgICAgICAgaW50IHNjb3BlSW50VmFsdWUgPSBnZXRTY29wZUludFZhbHVlKGF4aXNTZXJ2aWNlLmdldFNjb3BlKCkpOwotICAgICAgICAgICAgaWYgKG1heFNjb3BlIDwgc2NvcGVJbnRWYWx1ZSkgewotICAgICAgICAgICAgICAgIG1heFNjb3BlID0gc2NvcGVJbnRWYWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZ2V0U2NvcGVTdHJpbmcobWF4U2NvcGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGNvbnZlcnQgc2NvcGUgaW50byBhIG51bWVyaWNhbCB2YWx1ZQotICAgICAqCi0gICAgICogQHBhcmFtIHNjb3BlCi0gICAgICogQHJldHVybiBpbnRlZ2VyCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IGdldFNjb3BlSW50VmFsdWUoU3RyaW5nIHNjb3BlKSB7Ci0gICAgICAgIGlmIChDb25zdGFudHMuU0NPUEVfUkVRVUVTVC5lcXVhbHMoc2NvcGUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfSBlbHNlIGlmIChDb25zdGFudHMuU0NPUEVfVFJBTlNQT1JUX1NFU1NJT04uZXF1YWxzKHNjb3BlKSkgewotICAgICAgICAgICAgcmV0dXJuIDI7Ci0gICAgICAgIH0gZWxzZSBpZiAoQ29uc3RhbnRzLlNDT1BFX1NPQVBfU0VTU0lPTi5lcXVhbHMoc2NvcGUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gMzsKLSAgICAgICAgfSBlbHNlIGlmIChDb25zdGFudHMuU0NPUEVfQVBQTElDQVRJT04uZXF1YWxzKHNjb3BlKSkgewotICAgICAgICAgICAgcmV0dXJuIDQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gMjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgYWN0dWFsIHNjb3BlIHN0cmluZyBnaXZlbiB0aGUgbnVtZXJpY2FsIHZhbHVlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2NvcGUKLSAgICAgKiBAcmV0dXJuIHN0cmluZwotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRTY29wZVN0cmluZyhpbnQgc2NvcGUpIHsKLSAgICAgICAgc3dpdGNoIChzY29wZSkgewotICAgICAgICAgICAgY2FzZSAxIDogewotICAgICAgICAgICAgICAgIHJldHVybiBDb25zdGFudHMuU0NPUEVfUkVRVUVTVDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgMiA6IHsKLSAgICAgICAgICAgICAgICByZXR1cm4gQ29uc3RhbnRzLlNDT1BFX1RSQU5TUE9SVF9TRVNTSU9OOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSAzIDogewotICAgICAgICAgICAgICAgIHJldHVybiBDb25zdGFudHMuU0NPUEVfU09BUF9TRVNTSU9OOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSA0IDogewotICAgICAgICAgICAgICAgIHJldHVybiBDb25zdGFudHMuU0NPUEVfQVBQTElDQVRJT047Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZWZhdWx0IDogewotICAgICAgICAgICAgICAgIHJldHVybiBDb25zdGFudHMuU0NPUEVfVFJBTlNQT1JUX1NFU1NJT047Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdXRpbC9TdHJlYW1XcmFwcGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdXRpbC9TdHJlYW1XcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0YmRmODkuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvU3RyZWFtV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnV0aWw7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLk5hbWVzcGFjZUNvbnRleHQ7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLkxvY2F0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotCi1wdWJsaWMgY2xhc3MgU3RyZWFtV3JhcHBlciBpbXBsZW1lbnRzIFhNTFN0cmVhbVJlYWRlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX1NXSVRDSEVEID0gMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfSU5JVCA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX1NXSVRDSF9BVF9ORVhUID0gMjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfQ09NUExFVEVfQVRfTkVYVCA9IDM7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0NPTVBMRVRFRCA9IDQ7Ci0gICAgcHJpdmF0ZSBYTUxTdHJlYW1SZWFkZXIgcmVhbFJlYWRlciA9IG51bGw7Ci0gICAgcHJpdmF0ZSBpbnQgc3RhdGUgPSBTVEFURV9JTklUOwotICAgIHByaXZhdGUgaW50IHByZXZTdGF0ZSA9IHN0YXRlOwotCi0KLSAgICBwdWJsaWMgU3RyZWFtV3JhcHBlcihYTUxTdHJlYW1SZWFkZXIgcmVhbFJlYWRlcikgewotICAgICAgICBpZiAocmVhbFJlYWRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlJlYWRlciBjYW5ub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy5yZWFsUmVhZGVyID0gcmVhbFJlYWRlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBpZiAoc3RhdGUgIT0gU1RBVEVfSU5JVCkgewotICAgICAgICAgICAgcmVhbFJlYWRlci5jbG9zZSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IFhNTFN0cmVhbUV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGludCBuZXh0KCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIHByZXZTdGF0ZSA9IHN0YXRlOwotICAgICAgICBpbnQgcmV0dXJuRXZlbnQgPSAtMTsKLQotICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7Ci0gICAgICAgICAgICBjYXNlIFNUQVRFX0lOSVQ6Ci0gICAgICAgICAgICAgICAgaWYgKHJlYWxSZWFkZXIuZ2V0RXZlbnRUeXBlKCkgPT0gU1RBUlRfRE9DVU1FTlQpIHsKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBTVEFURV9TV0lUQ0hFRDsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuRXZlbnQgPSByZWFsUmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IFNUQVRFX1NXSVRDSEVEOwotICAgICAgICAgICAgICAgICAgICByZXR1cm5FdmVudCA9IHJlYWxSZWFkZXIuZ2V0RXZlbnRUeXBlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBTVEFURV9TV0lUQ0hFRDoKLSAgICAgICAgICAgICAgICByZXR1cm5FdmVudCA9IHJlYWxSZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgIGlmIChyZXR1cm5FdmVudCA9PSBFTkRfRE9DVU1FTlQpIHsKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBTVEFURV9DT01QTEVURUQ7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghcmVhbFJlYWRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBTVEFURV9DT01QTEVURV9BVF9ORVhUOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLS8vICAgICAgICAgICAgY2FzZSBTVEFURV9TV0lUQ0hfQVRfTkVYVDoKLS8vICAgICAgICAgICAgICAgIHN0YXRlID0gU1RBVEVfU1dJVENIRUQ7Ci0vLyAgICAgICAgICAgICAgICByZXR1cm5FdmVudCA9IHJlYWxSZWFkZXIuZ2V0RXZlbnRUeXBlKCk7Ci0vLyAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgU1RBVEVfQ09NUExFVEVfQVRfTkVYVDoKLSAgICAgICAgICAgICAgICBzdGF0ZSA9IFNUQVRFX0NPTVBMRVRFRDsKLSAgICAgICAgICAgICAgICByZXR1cm5FdmVudCA9IEVORF9ET0NVTUVOVDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgU1RBVEVfQ09NUExFVEVEOgotICAgICAgICAgICAgICAgIC8vb29wcyAtIG5vIHdheSB3ZSBjYW4gZ28gYmV5b25kIHRoaXMKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWE1MU3RyZWFtRXhjZXB0aW9uKCJlbmQgcmVhY2hlZCEiKTsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmV0dXJuRXZlbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBuZXh0VGFnKCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChwcmV2U3RhdGUgIT0gU1RBVEVfSU5JVCkgewotICAgICAgICAgICAgcmV0dXJuIHJlYWxSZWFkZXIubmV4dFRhZygpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IFhNTFN0cmVhbUV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVxdWlyZShpbnQgaSwgU3RyaW5nIHMsIFN0cmluZyBzMSkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChzdGF0ZSAhPSBTVEFURV9JTklUKSB7Ci0gICAgICAgICAgICByZWFsUmVhZGVyLnJlcXVpcmUoaSwgcywgczEpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gc3RhbmRhbG9uZVNldCgpIHsKLSAgICAgICAgaWYgKHN0YXRlICE9IFNUQVRFX0lOSVQpIHsKLSAgICAgICAgICAgIHJldHVybiByZWFsUmVhZGVyLnN0YW5kYWxvbmVTZXQoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0QXR0cmlidXRlQ291bnQoKSB7Ci0gICAgICAgIGlmIChzdGF0ZSAhPSBTVEFURV9JTklUKSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVhbFJlYWRlci5nZXRBdHRyaWJ1dGVDb3VudCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZUxvY2FsTmFtZShpbnQgaSkgewotICAgICAgICBpZiAoc3RhdGUgIT0gU1RBVEVfSU5JVCkgewotICAgICAgICAgICAgcmV0dXJuIHJlYWxSZWFkZXIuZ2V0QXR0cmlidXRlTG9jYWxOYW1lKGkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgUU5hbWUgZ2V0QXR0cmlidXRlTmFtZShpbnQgaSkgewotICAgICAgICBpZiAoc3RhdGUgIT0gU1RBVEVfSU5JVCkgewotICAgICAgICAgICAgcmV0dXJuIHJlYWxSZWFkZXIuZ2V0QXR0cmlidXRlTmFtZShpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVOYW1lc3BhY2UoaW50IGkpIHsKLSAgICAgICAgaWYgKHN0YXRlICE9IFNUQVRFX0lOSVQpIHsKLSAgICAgICAgICAgIHJldHVybiByZWFsUmVhZGVyLmdldEF0dHJpYnV0ZU5hbWVzcGFjZShpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVQcmVmaXgoaW50IGkpIHsKLSAgICAgICAgaWYgKHN0YXRlICE9IFNUQVRFX0lOSVQpIHsKLSAgICAgICAgICAgIHJldHVybiByZWFsUmVhZGVyLmdldEF0dHJpYnV0ZVByZWZpeChpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVUeXBlKGludCBpKSB7Ci0gICAgICAgIGlmIChzdGF0ZSAhPSBTVEFURV9JTklUKSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVhbFJlYWRlci5nZXRBdHRyaWJ1dGVUeXBlKGkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZVZhbHVlKGludCBpKSB7Ci0gICAgICAgIGlmIChzdGF0ZSAhPSBTVEFURV9JTklUKSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVhbFJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZShpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVWYWx1ZShTdHJpbmcgcywgU3RyaW5nIHMxKSB7Ci0gICAgICAgIGlmIChzdGF0ZSAhPSBTVEFURV9JTklUKSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVhbFJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZShzLCBzMSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2hhcmFjdGVyRW5jb2RpbmdTY2hlbWUoKSB7Ci0gICAgICAgIGlmIChzdGF0ZSAhPSBTVEFURV9JTklUKSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVhbFJlYWRlci5nZXRDaGFyYWN0ZXJFbmNvZGluZ1NjaGVtZSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnRUZXh0KCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChzdGF0ZSAhPSBTVEFURV9JTklUKSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVhbFJlYWRlci5nZXRFbGVtZW50VGV4dCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IFhNTFN0cmVhbUV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRFbmNvZGluZygpIHsKLSAgICAgICAgaWYgKHN0YXRlICE9IFNUQVRFX0lOSVQpIHsKLSAgICAgICAgICAgIHJldHVybiByZWFsUmVhZGVyLmdldEVuY29kaW5nKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0RXZlbnRUeXBlKCkgewotICAgICAgICBpZiAoc3RhdGUgPT0gU1RBVEVfSU5JVCkgewotICAgICAgICAgICAgcmV0dXJuIFNUQVJUX0RPQ1VNRU5UOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIHJlYWxSZWFkZXIuZ2V0RXZlbnRUeXBlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldExvY2FsTmFtZSgpIHsKLSAgICAgICAgaWYgKHN0YXRlICE9IFNUQVRFX0lOSVQpIHsKLSAgICAgICAgICAgIHJldHVybiByZWFsUmVhZGVyLmdldExvY2FsTmFtZSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgTG9jYXRpb24gZ2V0TG9jYXRpb24oKSB7Ci0gICAgICAgIGlmIChzdGF0ZSAhPSBTVEFURV9JTklUKSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVhbFJlYWRlci5nZXRMb2NhdGlvbigpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgUU5hbWUgZ2V0TmFtZSgpIHsKLSAgICAgICAgaWYgKHN0YXRlICE9IFNUQVRFX0lOSVQpIHsKLSAgICAgICAgICAgIHJldHVybiByZWFsUmVhZGVyLmdldE5hbWUoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIE5hbWVzcGFjZUNvbnRleHQgZ2V0TmFtZXNwYWNlQ29udGV4dCgpIHsKLSAgICAgICAgaWYgKHN0YXRlICE9IFNUQVRFX0lOSVQpIHsKLSAgICAgICAgICAgIHJldHVybiByZWFsUmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXROYW1lc3BhY2VDb3VudCgpIHsKLSAgICAgICAgaWYgKHN0YXRlICE9IFNUQVRFX0lOSVQpIHsKLSAgICAgICAgICAgIHJldHVybiByZWFsUmVhZGVyLmdldE5hbWVzcGFjZUNvdW50KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlUHJlZml4KGludCBpKSB7Ci0gICAgICAgIGlmIChzdGF0ZSAhPSBTVEFURV9JTklUKSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVhbFJlYWRlci5nZXROYW1lc3BhY2VQcmVmaXgoaSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKCkgewotICAgICAgICBpZiAoc3RhdGUgIT0gU1RBVEVfSU5JVCkgewotICAgICAgICAgICAgcmV0dXJuIHJlYWxSZWFkZXIuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKGludCBpKSB7Ci0gICAgICAgIGlmIChzdGF0ZSAhPSBTVEFURV9JTklUKSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVhbFJlYWRlci5nZXROYW1lc3BhY2VVUkkoaSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKFN0cmluZyBzKSB7Ci0gICAgICAgIGlmIChzdGF0ZSAhPSBTVEFURV9JTklUKSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVhbFJlYWRlci5nZXROYW1lc3BhY2VVUkkocyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UElEYXRhKCkgewotICAgICAgICBpZiAoc3RhdGUgIT0gU1RBVEVfSU5JVCkgewotICAgICAgICAgICAgcmV0dXJuIHJlYWxSZWFkZXIuZ2V0UElEYXRhKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UElUYXJnZXQoKSB7Ci0gICAgICAgIGlmIChzdGF0ZSAhPSBTVEFURV9JTklUKSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVhbFJlYWRlci5nZXRQSVRhcmdldCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByZWZpeCgpIHsKLSAgICAgICAgaWYgKHN0YXRlICE9IFNUQVRFX0lOSVQpIHsKLSAgICAgICAgICAgIHJldHVybiByZWFsUmVhZGVyLmdldFByZWZpeCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBzKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHN0YXRlICE9IFNUQVRFX0lOSVQpIHsKLSAgICAgICAgICAgIHJldHVybiByZWFsUmVhZGVyLmdldFByb3BlcnR5KHMpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotICAgICAgICBpZiAoc3RhdGUgIT0gU1RBVEVfSU5JVCkgewotICAgICAgICAgICAgcmV0dXJuIHJlYWxSZWFkZXIuZ2V0VGV4dCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgY2hhcltdIGdldFRleHRDaGFyYWN0ZXJzKCkgewotICAgICAgICBpZiAoc3RhdGUgIT0gU1RBVEVfSU5JVCkgewotICAgICAgICAgICAgcmV0dXJuIHJlYWxSZWFkZXIuZ2V0VGV4dENoYXJhY3RlcnMoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgY2hhclswXTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0VGV4dENoYXJhY3RlcnMoaW50IGksIGNoYXJbXSBjaGFycywgaW50IGkxLCBpbnQgaTIpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBpZiAoc3RhdGUgIT0gU1RBVEVfSU5JVCkgewotICAgICAgICAgICAgcmV0dXJuIHJlYWxSZWFkZXIuZ2V0VGV4dENoYXJhY3RlcnMoaSwgY2hhcnMsIGkxLCBpMik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0VGV4dExlbmd0aCgpIHsKLSAgICAgICAgaWYgKHN0YXRlICE9IFNUQVRFX0lOSVQpIHsKLSAgICAgICAgICAgIHJldHVybiByZWFsUmVhZGVyLmdldFRleHRMZW5ndGgoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRUZXh0U3RhcnQoKSB7Ci0gICAgICAgIGlmIChzdGF0ZSAhPSBTVEFURV9JTklUKSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVhbFJlYWRlci5nZXRUZXh0U3RhcnQoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRWZXJzaW9uKCkgewotICAgICAgICBpZiAoc3RhdGUgIT0gU1RBVEVfSU5JVCkgewotICAgICAgICAgICAgcmV0dXJuIHJlYWxSZWFkZXIuZ2V0VmVyc2lvbigpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNOYW1lKCkgewotICAgICAgICBpZiAoc3RhdGUgIT0gU1RBVEVfSU5JVCkgewotICAgICAgICAgICAgcmV0dXJuIHJlYWxSZWFkZXIuaGFzTmFtZSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBpZiAoc3RhdGUgPT0gU1RBVEVfQ09NUExFVEVfQVRfTkVYVCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT0gU1RBVEVfQ09NUExFVEVEKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RhdGUgIT0gU1RBVEVfSU5JVCkgewotICAgICAgICAgICAgcmV0dXJuIHJlYWxSZWFkZXIuaGFzTmV4dCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNUZXh0KCkgewotICAgICAgICBpZiAoc3RhdGUgIT0gU1RBVEVfSU5JVCkgewotICAgICAgICAgICAgcmV0dXJuIHJlYWxSZWFkZXIuaGFzVGV4dCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNBdHRyaWJ1dGVTcGVjaWZpZWQoaW50IGkpIHsKLSAgICAgICAgaWYgKHN0YXRlICE9IFNUQVRFX0lOSVQpIHsKLSAgICAgICAgICAgIHJldHVybiByZWFsUmVhZGVyLmlzQXR0cmlidXRlU3BlY2lmaWVkKGkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNDaGFyYWN0ZXJzKCkgewotICAgICAgICBpZiAoc3RhdGUgIT0gU1RBVEVfSU5JVCkgewotICAgICAgICAgICAgcmV0dXJuIHJlYWxSZWFkZXIuaXNDaGFyYWN0ZXJzKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VuZEVsZW1lbnQoKSB7Ci0gICAgICAgIGlmIChzdGF0ZSAhPSBTVEFURV9JTklUKSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVhbFJlYWRlci5pc0VuZEVsZW1lbnQoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzU3RhbmRhbG9uZSgpIHsKLSAgICAgICAgaWYgKHN0YXRlICE9IFNUQVRFX0lOSVQpIHsKLSAgICAgICAgICAgIHJldHVybiByZWFsUmVhZGVyLmlzU3RhbmRhbG9uZSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNTdGFydEVsZW1lbnQoKSB7Ci0gICAgICAgIGlmIChzdGF0ZSAhPSBTVEFURV9JTklUKSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVhbFJlYWRlci5pc1N0YXJ0RWxlbWVudCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNXaGl0ZVNwYWNlKCkgewotICAgICAgICBpZiAoc3RhdGUgIT0gU1RBVEVfSU5JVCkgewotICAgICAgICAgICAgcmV0dXJuIHJlYWxSZWFkZXIuaXNXaGl0ZVNwYWNlKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdXRpbC9UYXJnZXRSZXNvbHZlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvVGFyZ2V0UmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTcxZjdlNS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdXRpbC9UYXJnZXRSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnV0aWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci0KLS8qKgotICogVGFyZ2V0UmVzb2x2ZXIKLSAqIDxwLz4KLSAqIEludGVyZmFjZSB0byBiZSBpbXBsZW1lbnRlZCBieSBjb2RlIHRvIHVwZGF0ZSB0aGUgaW52b2NhdGlvbiB0YXJnZXQgVVJMCi0gKiBiZWZvcmUgdGhlIHRyYW5zcG9ydCBpcyBzZWxlY3RlZCBhbmQgdGhlIGVuZ2luZSBpbnZva2VkLgotICogPHAvPgotICogRXhhbXBsZXMgb2YgdXNlOgotICogMS4gd3NhOlRvIHNldCB0byBhIFVSTiB2YWx1ZSB3aGljaCBuZWVkcyB0cmFuc2xhdGVkIHRvIGEgdGFyZ2V0YWJsZSBVUkwKLSAqIDIuIHN1cHBvcnQgY2x1c3RlcmluZyB3aGVyZSBhIHNpbmdsZSBVUkkgbWF5IHJlcGVzZW50IG11bHRpcGxlIHNlcnZlcnMgYW5kIG9uZSBtdXN0IGJlIHNlbGVjdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVGFyZ2V0UmVzb2x2ZXIgewotICAgIC8qKgotICAgICAqIHJlc29sdmVUYXJnZXQgZXhhbWluZXMgdGhlIE1lc3NhZ2VDb250ZXh0IGFuZCB1cGRhdGVzIHRoZSBNZXNzYWdlQ29udGV4dAotICAgICAqIGluIG9yZGVyIHRvIHJlc29sdmUgdGhlIHRhcmdldC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZXNvbHZlVGFyZ2V0KE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0KTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdXRpbC9UaHJlYWRDb250ZXh0TWlncmF0b3IuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi91dGlsL1RocmVhZENvbnRleHRNaWdyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YWM2YzBkLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi91dGlsL1RocmVhZENvbnRleHRNaWdyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi51dGlsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGludGVyZmFjZSBmb3IgYSBwaWVjZSBvZiBjb2RlIHRoYXQgd2lsbCBwbHVnIGludG8gdGhlIHVzZXIKLSAqIHByb2dyYW1taW5nIG1vZGVsIGltcGwgKGUuZy4gSkFYLVdTIGltcGwpIGFuZCB3aWxsIGJlIGludm9rZWQgd2hpbGUgb24gdGhlCi0gKiB1bHRpbWF0ZSB0aHJlYWQgb2YgZXhlY3V0aW9uLiAgSXQgaXMgaW50ZW5kZWQgdG8gcHJvdmlkZSBhIG1lY2hhbmlzbSB0bwotICogYWxsb3cgaW5mb3JtYXRpb24gdG8gYmUgbWlncmF0ZWQgYmV0d2VlbiB0aGUgQXhpczIgY29udGV4dHMgYW5kIHRocmVhZAotICogbG9jYWwgc3RvcmFnZS4KLSAqIDxwLz4KLSAqIE5vdGU6IEl0IGlzIHVwIHRvIGVhY2ggcGFydGljdWxhciBwcm9ncmFtbWluZyBtb2RlbCBpbXBsIHRvIGRlY2lkZSB3aGV0aGVyCi0gKiBvciBub3QgdGhleSB3aXNoIHRvIG1ha2UgdXNlIG9mIHRoZSBUaHJlYWRDb250ZXh0TWlncmF0b3JzLgotICogPHAvPgotICogRm9yIGVhY2ggZ2VuZXJhbCBNRVAsIGhlcmUgaXMgdGhlIGludm9jYXRpb24gcGF0dGVybjoKLSAqIDxwLz4KLSAqIFtvbmUtd2F5IGluYm91bmRdCi0gKiBtaWdyYXRlQ29udGV4dFRvVGhyZWFkKHJlcSkKLSAqIGNsZWFudXBUaHJlYWQocmVxKQotICogPHAvPgotICogW3JlcS9yc3AgaW5ib3VuZF0KLSAqIG1pZ3JhdGVDb250ZXh0VG9UaHJlYWQocmVxKQotICogbWlncmF0ZVRocmVhZFRvQ29udGV4dChyc3ApCi0gKiBjbGVhbnVwQ29udGV4dChyc3ApCi0gKiBjbGVhbnVwVGhyZWFkKHJlcSkKLSAqIDxwLz4KLSAqIFtvbmUtd2F5IG91dGJvdW5kXQotICogbWlncmF0ZVRocmVhZFRvQ29udGV4dChyZXEpCi0gKiBjbGVhbnVwQ29udGV4dChyZXEpCi0gKiA8cC8+Ci0gKiBbcmVxL3JzcCBvdXRib3VuZCAoYm90aCBzeW5jIGFuZCBhc3luYyldCi0gKiBtaWdyYXRlVGhyZWFkVG9Db250ZXh0KHJlcSkKLSAqIGNsZWFudXBDb250ZXh0KHJlcSkKLSAqIG1pZ3JhdGVDb250ZXh0VG9UaHJlYWQocnNwKQotICogTm90ZTogdGhlcmUgaXMgbm8gY29ycmVzcG9uZGluZyBjbGVhbnVwVGhyZWFkKHJzcCk7IG9uZSBvZiB0aGUgaW5ib3VuZAotICogY2FzZXMgd291bGQgbmVlZCB0byBoYW5kbGUgdGhpcwotICogPHAvPgotICogSWYgYSBmYXVsdCBvY2N1cnMgZHVyaW5nIGV4ZWN1dGlvbiBvZiBvbmUgb2YgdGhlIG1pZ3JhdG9ycywgaXQgd2lsbCBiZQotICogdHJlYXRlZCBsaWtlIGFueSBvdGhlciBzZXJ2aWNlIGZhdWx0IChpLmUuIGxpa2Ugd2hhdCB3aWxsIGhhcHBlbiBpZiB3ZSBjYW4ndAotICogZGVsaXZlciB0aGUgbWVzc2FnZSB0byBhIHNlcnZpY2Ugb3IgaWYgYSBoYW5kbGVyIGZhaWxzLgotICogPHAvPgotICogVGhlIGNsZWFudXAqIG1ldGhvZHMgY2FuIGJlIGV4cGVjdGVkIHRvIGJlIGludm9rZWQgYWZ0ZXIgYW55IGV4ZWNlcHRpb24KLSAqIHRoYXQgb2NjdXJzIHdpdGhpbiB0aGUgc2NvcGUgb2YgdGhlIG1pZ3JhdGlvbiB0aGF0IHdvdWxkIGNhdXNlIHRoYXQgc2NvcGUKLSAqIHRvIGJlIGxlZnQgc28gdGhhdCB0aGUgdGhyZWFkIGFuZC9vciBjb250ZXh0IG1heSBiZSBjbGVhbmVkIHVwIHByb3Blcmx5LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRocmVhZENvbnRleHRNaWdyYXRvciB7Ci0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2Qgd2lsbCBiZSBpbnZva2VkIHdoZW4gdGhlIHByb2Nlc3Npbmcgb2YgdGhlIG1lc3NhZ2UgaXMKLSAgICAgKiBndWFyYW50ZWVkIHRvIGJlIG9uIHRoZSB0aHJlYWQgb2YgZXhlY3V0aW9uIHRoYXQgd2lsbCBiZSB1c2VkIGluCi0gICAgICogdXNlciBzcGFjZS4gIEl0IHdpbGwgYmUgaW52b2tlZCBmb3IgaW5jb21pbmcgbWVzc2FnZXMuCi0gICAgICogSW1wbGVtZW50YXRpb25zIG9mIHRoaXMgaW50ZXJmYWNlIGNhbiB1c2UgdGhlIGluZm9ybWF0aW9uIGZvdW5kIGluIHRoZQotICAgICAqIE1lc3NhZ2VDb250ZXh0IHRvIGRldGVybWluZSB3aGV0aGVyIGEgcmVxdWVzdCBvciByZXNwb25zZSBpcyBiZWluZwotICAgICAqIHByb2Nlc3NlZC4KLSAgICAgKiAoZS5nLiBNZXNzYWdlQ29udGV4dC5nZXRBeGlzT3BlcmF0aW9uKCkuZ2V0TWVzc2FnZUV4Y2hhbmdlUGF0dGVybigpKQotICAgICAqCi0gICAgICogQHBhcmFtIG1lc3NhZ2VDb250ZXh0Ci0gICAgICogQHRocm93cyBBeGlzRmF1bHQKLSAgICAgKi8KLSAgICB2b2lkIG1pZ3JhdGVDb250ZXh0VG9UaHJlYWQoTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQpIHRocm93cyBBeGlzRmF1bHQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIGludm9rZWQgd2hlbiB0aGUgcHJvY2Vzc2luZyBvZiB0aGUgbWVzc2FnZSBpcwotICAgICAqIGd1YXJhbnRlZWQgdG8gc3RpbGwgYmUgb24gdGhlIHRocmVhZCBvZiBleGVjdXRpb24gdGhhdCB3YXMgdXNlZCBpbiB1c2VyCi0gICAgICogc3BhY2UsIGFmdGVyIGFsbCBwcm9jZXNzaW5nIGhhcyBjb21wbGV0ZWQgKGkuZS4gd2hlbiB0aGUgcGFydGljdWxhcgotICAgICAqIHByb2Nlc3Npbmcgb2YgYSBtZXNzYWdlIGlzIHVud2luZGluZy4pICBJdCBwcm92aWRlcyBhIG1lY2hhbmlzbSB3aGljaCBjYW4KLSAgICAgKiBiZSB1c2VkIHRvIGNsZWFuIHVwIHRoZSBUTFMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVzc2FnZUNvbnRleHQKLSAgICAgKi8KLSAgICB2b2lkIGNsZWFudXBUaHJlYWQoTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQpOwotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2Qgd2lsbCBiZSBpbnZva2VkIHdoZW4gdGhlIHByb2Nlc3Npbmcgb2YgdGhlIG1lc3NhZ2UgaXMKLSAgICAgKiBndWFyYW50ZWVkIHRvIHN0aWxsIGJlIG9uIHRoZSB0aHJlYWQgb2YgZXhlY3V0aW9uIHRoYXQgd2FzIHVzZWQgaW4KLSAgICAgKiB1c2VyIHNwYWNlLiAgSXQgd2lsbCBiZSBpbnZva2VkIGZvciBib3RoIG91dGdvaW5nIG1lc3NhZ2VzLgotICAgICAqIEltcGxlbWVudGF0aW9ucyBvZiB0aGlzIGludGVyZmFjZSBjYW4gdXNlIHRoZSBpbmZvcm1hdGlvbiBmb3VuZCBpbiB0aGUKLSAgICAgKiBNZXNzYWdlQ29udGV4dCB0byBkZXRlcm1pbmUgd2hldGhlciBhIHJlcXVlc3Qgb3IgcmVzcG9uc2UgaXMgYmVpbmcKLSAgICAgKiBwcm9jZXNzZWQuCi0gICAgICogKGUuZy4gTWVzc2FnZUNvbnRleHQuZ2V0QXhpc09wZXJhdGlvbigpLmdldE1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4oKSkKLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXNzYWdlQ29udGV4dAotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0Ci0gICAgICovCi0gICAgdm9pZCBtaWdyYXRlVGhyZWFkVG9Db250ZXh0KE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0KSB0aHJvd3MgQXhpc0ZhdWx0OwotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2Qgd2lsbCBiZSBpbnZva2VkIHdoZW4gdGhlIHByb2Nlc3Npbmcgb2YgdGhlIG1lc3NhZ2UgaXMKLSAgICAgKiBndWFyYW50ZWVkIHRvIGJlIG9uIHRoZSB0aHJlYWQgb2YgZXhlY3V0aW9uIHRoYXQgd2lsbCBiZSB1c2VkIGluIHVzZXIKLSAgICAgKiBzcGFjZSwgYWZ0ZXIgYWxsIHByb2Nlc3NpbmcgaGFzIGNvbXBsZXRlZCAoaS5lLiB3aGVuIHRoZSBwYXJ0aWN1bGFyCi0gICAgICogcHJvY2Vzc2luZyBvZiBhIG1lc3NhZ2UgaXMgdW53aW5kaW5nLikgIEl0IHByb3ZpZGVzIGEgbWVjaGFuaXNtIHdoaWNoIGNhbgotICAgICAqIGJlIHVzZWQgdG8gY2xlYW4gdXAgdGhlIE1lc3NhZ2VDb250ZXh0IG9yIHJlc3RvcmUgVExTLgotICAgICAqCi0gICAgICogQHBhcmFtIG1lc3NhZ2VDb250ZXh0Ci0gICAgICovCi0gICAgdm9pZCBjbGVhbnVwQ29udGV4dChNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCk7Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdXRpbC9UaHJlYWRDb250ZXh0TWlncmF0b3JVdGlsLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdXRpbC9UaHJlYWRDb250ZXh0TWlncmF0b3JVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmNGJjYjkuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvVGhyZWFkQ29udGV4dE1pZ3JhdG9yVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi51dGlsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzQ29uZmlndXJhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLS8qKgotICogVGhpcyBpcyBhIHV0aWxpdHkgY2xhc3MgdG8gbWFrZSBpdCBlYXNpZXIvY2xlYW5lciBmb3IgdXNlciBwcm9ncmFtbWluZwotICogbW9kZWwtbGV2ZWwgaW1wbGVtZW50YXRpb25zIChlLmcuIHRoZSBBeGlzMiBKQVgtV1MgY29kZSkgdG8gaW52b2tlIHRoZQotICogVGhyZWFkQ29udGV4dE1pZ3JhdG9ycy4KLSAqLwotcHVibGljIGNsYXNzIFRocmVhZENvbnRleHRNaWdyYXRvclV0aWwgewotICAgIC8qKgotICAgICAqIFJlZ2lzdGVyIGEgbmV3IFRocmVhZENvbnRleHRNaWdyYXRvci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb25maWd1cmF0aW9uQ29udGV4dAotICAgICAqIEBwYXJhbSB0aHJlYWRDb250ZXh0TWlncmF0b3JMaXN0SUQgVGhlIG5hbWUgb2YgdGhlIHBhcmFtZXRlciBpbiB0aGUKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF4aXNDb25maWd1cmF0aW9uIHRoYXQgY29udGFpbnMKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBsaXN0IG9mIG1pZ3JhdG9ycy4KLSAgICAgKiBAcGFyYW0gbWlncmF0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkVGhyZWFkQ29udGV4dE1pZ3JhdG9yKENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ3VyYXRpb25Db250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRocmVhZENvbnRleHRNaWdyYXRvckxpc3RJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZENvbnRleHRNaWdyYXRvciBtaWdyYXRvcikKLSAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpOwotICAgICAgICBhZGRUaHJlYWRDb250ZXh0TWlncmF0b3IoYXhpc0NvbmZpZ3VyYXRpb24sIHRocmVhZENvbnRleHRNaWdyYXRvckxpc3RJRCwgbWlncmF0b3IpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlZ2lzdGVyIGEgbmV3IFRocmVhZENvbnRleHRNaWdyYXRvci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBheGlzQ29uZmlndXJhdGlvbgotICAgICAqIEBwYXJhbSB0aHJlYWRDb250ZXh0TWlncmF0b3JMaXN0SUQgVGhlIG5hbWUgb2YgdGhlIHBhcmFtZXRlciBpbiB0aGUKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF4aXNDb25maWd1cmF0aW9uIHRoYXQgY29udGFpbnMKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBsaXN0IG9mIG1pZ3JhdG9ycy4KLSAgICAgKiBAcGFyYW0gbWlncmF0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkVGhyZWFkQ29udGV4dE1pZ3JhdG9yKEF4aXNDb25maWd1cmF0aW9uIGF4aXNDb25maWd1cmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRocmVhZENvbnRleHRNaWdyYXRvckxpc3RJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZENvbnRleHRNaWdyYXRvciBtaWdyYXRvcikKLSAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgUGFyYW1ldGVyIHBhcmFtID0gYXhpc0NvbmZpZ3VyYXRpb24uZ2V0UGFyYW1ldGVyKHRocmVhZENvbnRleHRNaWdyYXRvckxpc3RJRCk7Ci0gICAgICAgIAotICAgICAgICBpZiAocGFyYW0gPT0gbnVsbCkgewotICAgICAgICAgICAgcGFyYW0gPSBuZXcgUGFyYW1ldGVyKHRocmVhZENvbnRleHRNaWdyYXRvckxpc3RJRCwgbmV3IExpbmtlZExpc3QoKSk7Ci0gICAgICAgICAgICBheGlzQ29uZmlndXJhdGlvbi5hZGRQYXJhbWV0ZXIocGFyYW0pOwotICAgICAgICB9Ci0KLSAgICAgICAgTGlzdCBtaWdyYXRvckxpc3QgPSAoTGlzdCkgcGFyYW0uZ2V0VmFsdWUoKTsKLSAgICAgICAgbWlncmF0b3JMaXN0LmFkZChtaWdyYXRvcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWN0aXZhdGUgYW55IHJlZ2lzdGVyZWQgVGhyZWFkQ29udGV4dE1pZ3JhdG9ycyB0byBtb3ZlIGNvbnRleHQgaW5mbwotICAgICAqIHRvIHRoZSB0aHJlYWQgb2YgZXhlY3V0aW9uLgotICAgICAqCi0gICAgICogQHBhcmFtIHRocmVhZENvbnRleHRNaWdyYXRvckxpc3RJRCBUaGUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyIGluIHRoZQotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXhpc0NvbmZpZ3VyYXRpb24gdGhhdCBjb250YWlucwotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGxpc3Qgb2YgbWlncmF0b3JzLgotICAgICAqIEBwYXJhbSBtc2dDb250ZXh0Ci0gICAgICogQHRocm93cyBBeGlzRmF1bHQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcGVyZm9ybU1pZ3JhdGlvblRvVGhyZWFkKFN0cmluZyB0aHJlYWRDb250ZXh0TWlncmF0b3JMaXN0SUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KQotICAgIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBpZiAobXNnQ29udGV4dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlndXJhdGlvbiA9IAotICAgICAgICAgICAgbXNnQ29udGV4dC5nZXRDb25maWd1cmF0aW9uQ29udGV4dCgpLmdldEF4aXNDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgIFBhcmFtZXRlciBwYXJhbSA9IGF4aXNDb25maWd1cmF0aW9uLmdldFBhcmFtZXRlcih0aHJlYWRDb250ZXh0TWlncmF0b3JMaXN0SUQpOwotCi0gICAgICAgIGlmIChwYXJhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBMaXN0IG1pZ3JhdG9yTGlzdCA9IChMaXN0KSBwYXJhbS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgTGlzdEl0ZXJhdG9yIHRocmVhZENvbnRleHRNaWdyYXRvcnMgPSBtaWdyYXRvckxpc3QubGlzdEl0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB3aGlsZSAodGhyZWFkQ29udGV4dE1pZ3JhdG9ycy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAoKFRocmVhZENvbnRleHRNaWdyYXRvcikgdGhyZWFkQ29udGV4dE1pZ3JhdG9ycy5uZXh0KCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAubWlncmF0ZUNvbnRleHRUb1RocmVhZChtc2dDb250ZXh0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFjdGl2YXRlIGFueSByZWdpc3RlcmVkIFRocmVhZENvbnRleHRNaWdyYXRvcnMgdG8gcmVtb3ZlIGluZm9ybWF0aW9uCi0gICAgICogZnJvbSB0aGUgdGhyZWFkIG9mIGV4ZWN1dGlvbiBpZiBuZWNlc3NhcnkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdGhyZWFkQ29udGV4dE1pZ3JhdG9yTGlzdElEIFRoZSBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIgaW4gdGhlCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBeGlzQ29uZmlndXJhdGlvbiB0aGF0IGNvbnRhaW5zCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbGlzdCBvZiBtaWdyYXRvcnMuCi0gICAgICogQHBhcmFtIG1zZ0NvbnRleHQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcGVyZm9ybVRocmVhZENsZWFudXAoU3RyaW5nIHRocmVhZENvbnRleHRNaWdyYXRvckxpc3RJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgewotICAgICAgICBpZiAobXNnQ29udGV4dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlndXJhdGlvbiA9IAotICAgICAgICAgICAgbXNnQ29udGV4dC5nZXRDb25maWd1cmF0aW9uQ29udGV4dCgpLmdldEF4aXNDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgIFBhcmFtZXRlciBwYXJhbSA9IGF4aXNDb25maWd1cmF0aW9uLmdldFBhcmFtZXRlcih0aHJlYWRDb250ZXh0TWlncmF0b3JMaXN0SUQpOwotCi0gICAgICAgIGlmIChwYXJhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBMaXN0IG1pZ3JhdG9yTGlzdCA9IChMaXN0KSBwYXJhbS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgTGlzdEl0ZXJhdG9yIHRocmVhZENvbnRleHRNaWdyYXRvcnMgPSBtaWdyYXRvckxpc3QubGlzdEl0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB3aGlsZSAodGhyZWFkQ29udGV4dE1pZ3JhdG9ycy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAoKFRocmVhZENvbnRleHRNaWdyYXRvcikgdGhyZWFkQ29udGV4dE1pZ3JhdG9ycy5uZXh0KCkpLmNsZWFudXBUaHJlYWQobXNnQ29udGV4dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBY3RpdmF0ZSBhbnkgcmVnaXN0ZXJlZCBUaHJlYWRDb250ZXh0TWlncmF0b3JzIHRvIG1vdmUgaW5mbyBmcm9tIHRoZQotICAgICAqIHRocmVhZCBvZiBleGVjdXRpb24gaW50byB0aGUgY29udGV4dC4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0aHJlYWRDb250ZXh0TWlncmF0b3JMaXN0SUQgVGhlIG5hbWUgb2YgdGhlIHBhcmFtZXRlciBpbiB0aGUKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF4aXNDb25maWd1cmF0aW9uIHRoYXQgY29udGFpbnMKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBsaXN0IG9mIG1pZ3JhdG9ycy4KLSAgICAgKiBAcGFyYW0gbXNnQ29udGV4dAotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHBlcmZvcm1NaWdyYXRpb25Ub0NvbnRleHQoU3RyaW5nIHRocmVhZENvbnRleHRNaWdyYXRvckxpc3RJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KQotICAgIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBpZiAobXNnQ29udGV4dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlndXJhdGlvbiA9IAotICAgICAgICAgICAgbXNnQ29udGV4dC5nZXRDb25maWd1cmF0aW9uQ29udGV4dCgpLmdldEF4aXNDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgIFBhcmFtZXRlciBwYXJhbSA9IGF4aXNDb25maWd1cmF0aW9uLmdldFBhcmFtZXRlcih0aHJlYWRDb250ZXh0TWlncmF0b3JMaXN0SUQpOwotCi0gICAgICAgIGlmIChwYXJhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBMaXN0IG1pZ3JhdG9yTGlzdCA9IChMaXN0KSBwYXJhbS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgTGlzdEl0ZXJhdG9yIHRocmVhZENvbnRleHRNaWdyYXRvcnMgPSBtaWdyYXRvckxpc3QubGlzdEl0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB3aGlsZSAodGhyZWFkQ29udGV4dE1pZ3JhdG9ycy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAoKFRocmVhZENvbnRleHRNaWdyYXRvcikgdGhyZWFkQ29udGV4dE1pZ3JhdG9ycy5uZXh0KCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAubWlncmF0ZVRocmVhZFRvQ29udGV4dChtc2dDb250ZXh0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFjdGl2YXRlIGFueSByZWdpc3RlcmVkIFRocmVhZENvbnRleHRNaWdyYXRvcnMgdG8gcmVtb3ZlIGluZm9ybWF0aW9uIGZyb20KLSAgICAgKiB0aGUgY29udGV4dCBpZiBuZWNlc3NhcnkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdGhyZWFkQ29udGV4dE1pZ3JhdG9yTGlzdElEIFRoZSBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIgaW4gdGhlCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBeGlzQ29uZmlndXJhdGlvbiB0aGF0IGNvbnRhaW5zCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbGlzdCBvZiBtaWdyYXRvcnMuCi0gICAgICogQHBhcmFtIG1zZ0NvbnRleHQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcGVyZm9ybUNvbnRleHRDbGVhbnVwKFN0cmluZyB0aHJlYWRDb250ZXh0TWlncmF0b3JMaXN0SUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB7Ci0gICAgICAgIGlmIChtc2dDb250ZXh0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIEF4aXNDb25maWd1cmF0aW9uIGF4aXNDb25maWd1cmF0aW9uID0gCi0gICAgICAgICAgICBtc2dDb250ZXh0LmdldENvbmZpZ3VyYXRpb25Db250ZXh0KCkuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKTsKLSAgICAgICAgUGFyYW1ldGVyIHBhcmFtID0gYXhpc0NvbmZpZ3VyYXRpb24uZ2V0UGFyYW1ldGVyKHRocmVhZENvbnRleHRNaWdyYXRvckxpc3RJRCk7Ci0KLSAgICAgICAgaWYgKHBhcmFtICE9IG51bGwpIHsKLSAgICAgICAgICAgIExpc3QgbWlncmF0b3JMaXN0ID0gKExpc3QpIHBhcmFtLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICBMaXN0SXRlcmF0b3IgdGhyZWFkQ29udGV4dE1pZ3JhdG9ycyA9IG1pZ3JhdG9yTGlzdC5saXN0SXRlcmF0b3IoKTsKLSAgICAgICAgICAgIHdoaWxlICh0aHJlYWRDb250ZXh0TWlncmF0b3JzLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICgoVGhyZWFkQ29udGV4dE1pZ3JhdG9yKSB0aHJlYWRDb250ZXh0TWlncmF0b3JzLm5leHQoKSkuY2xlYW51cENvbnRleHQobXNnQ29udGV4dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvVVJMLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdXRpbC9VUkwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU1YWIyZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdXRpbC9VUkwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnV0aWw7Ci0KLXB1YmxpYyBjbGFzcyBVUkwgewotICAgIHByaXZhdGUgaW50IHBvcnQgPSAtMTsKLSAgICBwcml2YXRlIFN0cmluZyBmaWxlTmFtZTsKLSAgICBwcml2YXRlIFN0cmluZyBob3N0OwotICAgIHByaXZhdGUgU3RyaW5nIHByb3RvY29sOwotCi0gICAgcHVibGljIFVSTChTdHJpbmcgdXJsKSB7Ci0gICAgICAgIGludCBzdGFydCA9IDA7Ci0gICAgICAgIGludCBlbmQgPSAwOwotCi0gICAgICAgIGVuZCA9IHVybC5pbmRleE9mKCI6Ly8iKTsKLQotICAgICAgICBpZiAoZW5kID4gMCkgewotICAgICAgICAgICAgcHJvdG9jb2wgPSB1cmwuc3Vic3RyaW5nKDAsIGVuZCk7Ci0gICAgICAgICAgICBzdGFydCA9IGVuZCArIDM7Ci0gICAgICAgIH0KLQotICAgICAgICBlbmQgPSB1cmwuaW5kZXhPZignLycsIHN0YXJ0KTsKLQotICAgICAgICBpZiAoZW5kID4gMCkgewotICAgICAgICAgICAgU3RyaW5nIGhvc3RBbmRQb3J0ID0gdXJsLnN1YnN0cmluZyhzdGFydCwgZW5kKTsKLQotICAgICAgICAgICAgZmlsZU5hbWUgPSB1cmwuc3Vic3RyaW5nKGVuZCk7Ci0KLSAgICAgICAgICAgIGludCBpbmRleCA9IGhvc3RBbmRQb3J0LmluZGV4T2YoJzonKTsKLQotICAgICAgICAgICAgaWYgKGluZGV4ID4gMCkgewotICAgICAgICAgICAgICAgIGhvc3QgPSBob3N0QW5kUG9ydC5zdWJzdHJpbmcoMCwgaW5kZXgpOwotICAgICAgICAgICAgICAgIHBvcnQgPSBJbnRlZ2VyLnBhcnNlSW50KGhvc3RBbmRQb3J0LnN1YnN0cmluZyhpbmRleCArIDEpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaG9zdCA9IGhvc3RBbmRQb3J0OwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaG9zdCA9IHVybDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gUmV0dXJucyBTdHJpbmcuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRGaWxlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGZpbGVOYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gUmV0dXJucyBTdHJpbmcuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRIb3N0KCkgewotICAgICAgICByZXR1cm4gaG9zdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgaW50LgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0UG9ydCgpIHsKLSAgICAgICAgcmV0dXJuIHBvcnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBSZXR1cm5zIFN0cmluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb3RvY29sKCkgewotICAgICAgICByZXR1cm4gcHJvdG9jb2w7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvVVJMUHJvY2Vzc29yLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdXRpbC9VUkxQcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTE4YzI4Zi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdXRpbC9VUkxQcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudXRpbDsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1wdWJsaWMgY2xhc3MgVVJMUHJvY2Vzc29yIHsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1BBQ0tBR0UgPSAib3JnLmFwYWNoZS5heGlzMiI7Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgbWFrZVBhY2thZ2VOYW1lLgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWVzcGFjZQotICAgICAqIEByZXR1cm4gUmV0dXJucyBTdHJpbmcuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgbWFrZVBhY2thZ2VOYW1lKFN0cmluZyBuYW1lc3BhY2UpIHsKLQotICAgICAgICBTdHJpbmcgaG9zdG5hbWUgPSBudWxsOwotICAgICAgICBTdHJpbmcgcGF0aCA9ICIiOwotCi0gICAgICAgIC8vIGdldCB0aGUgdGFyZ2V0IG5hbWVzcGFjZSBvZiB0aGUgZG9jdW1lbnQKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGphdmEubmV0LlVSTCB1ID0gbmV3IGphdmEubmV0LlVSTChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICBob3N0bmFtZSA9IHUuZ2V0SG9zdCgpOwotICAgICAgICAgICAgcGF0aCA9IHUuZ2V0UGF0aCgpOwotICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5pbmRleE9mKCI6IikgPiAtMSkgewotICAgICAgICAgICAgICAgIGhvc3RuYW1lID0gbmFtZXNwYWNlLnN1YnN0cmluZyhuYW1lc3BhY2UuaW5kZXhPZigiOiIpICsgMSk7Ci0KLSAgICAgICAgICAgICAgICAvLyByZW1vdmUgdGhlIGxlYWRpbmcgLwotICAgICAgICAgICAgICAgIHdoaWxlIChob3N0bmFtZS5zdGFydHNXaXRoKCIvIikpIHsKLSAgICAgICAgICAgICAgICAgICAgaG9zdG5hbWUgPSBob3N0bmFtZS5zdWJzdHJpbmcoMSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGhvc3RuYW1lLmluZGV4T2YoIi8iKSA+IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgIGhvc3RuYW1lID0gaG9zdG5hbWUuc3Vic3RyaW5nKDAsIGhvc3RuYW1lLmluZGV4T2YoIi8iKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBob3N0bmFtZSA9IG5hbWVzcGFjZS5yZXBsYWNlKCcvJywnLicpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gaWYgd2UgZGlkbid0IGZpbGUgYSBob3N0bmFtZSwgYmFpbAotICAgICAgICBpZiAoaG9zdG5hbWUgPT0gbnVsbCB8fCBob3N0bmFtZS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNvbnZlcnQgaWxsZWdhbCBqYXZhIGlkZW50aWZpZXIKLSAgICAgICAgaG9zdG5hbWUgPSBob3N0bmFtZS5yZXBsYWNlKCctJywgJ18nKTsKLSAgICAgICAgcGF0aCA9IHBhdGgucmVwbGFjZSgnLScsICdfJyk7Ci0KLSAgICAgICAgcGF0aCA9IHBhdGgucmVwbGFjZSgnOicsICdfJyk7Ci0KLSAgICAgICAgLy8gY2hvbXAgb2ZmIGxhc3QgZm9yd2FyZCBzbGFzaCBpbiBwYXRoLCBpZiBuZWNlc3NhcnkKLSAgICAgICAgaWYgKChwYXRoLmxlbmd0aCgpID4gMCkgJiYgKHBhdGguY2hhckF0KHBhdGgubGVuZ3RoKCkgLSAxKSA9PSAnLycpKSB7Ci0gICAgICAgICAgICBwYXRoID0gcGF0aC5zdWJzdHJpbmcoMCwgcGF0aC5sZW5ndGgoKSAtIDEpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gdG9rZW5pemUgdGhlIGhvc3RuYW1lIGFuZCByZXZlcnNlIGl0Ci0gICAgICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoaG9zdG5hbWUsICIuOiIpOwotICAgICAgICBTdHJpbmdbXSB3b3JkcyA9IG5ldyBTdHJpbmdbc3QuY291bnRUb2tlbnMoKV07Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB3b3Jkcy5sZW5ndGg7ICsraSkgewotICAgICAgICAgICAgd29yZHNbaV0gPSBzdC5uZXh0VG9rZW4oKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIobmFtZXNwYWNlLmxlbmd0aCgpKTsKLQotICAgICAgICBmb3IgKGludCBpID0gd29yZHMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHsKLSAgICAgICAgICAgIGFkZFdvcmRUb1BhY2thZ2VCdWZmZXIoc2IsIHdvcmRzW2ldLCAoaSA9PSB3b3Jkcy5sZW5ndGggLSAxKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyB0b2tlbml6ZSB0aGUgcGF0aAotICAgICAgICBTdHJpbmdUb2tlbml6ZXIgc3QyID0gbmV3IFN0cmluZ1Rva2VuaXplcihwYXRoLCAiLyIpOwotCi0gICAgICAgIHdoaWxlIChzdDIuaGFzTW9yZVRva2VucygpKSB7Ci0gICAgICAgICAgICBhZGRXb3JkVG9QYWNrYWdlQnVmZmVyKHNiLCBzdDIubmV4dFRva2VuKCksIGZhbHNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzYi50b1N0cmluZygpLnRvTG93ZXJDYXNlKCk7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBNYXNzYWdlcyA8dHQ+d29yZDwvdHQ+IGludG8gYSBmb3JtIHN1aXRhYmxlIGZvciB1c2UgaW4gYSBKYXZhIHBhY2thZ2UgbmFtZS4KLSAgICAgKiBBcHBlbmRzIGl0IHRvIHRoZSB0YXJnZXQgc3RyaW5nIGJ1ZmZlciB3aXRoIGEgPHR0Pi48L3R0PiBkZWxpbWl0ZXIgaWYKLSAgICAgKiA8dHQ+d29yZDwvdHQ+IGlzIG5vdCB0aGUgZmlyc3Qgd29yZCBpbiB0aGUgcGFja2FnZSBuYW1lLgotICAgICAqCi0gICAgICogQHBhcmFtIHNiICAgICAgICB0aGUgYnVmZmVyIHRvIGFwcGVuZCB0bwotICAgICAqIEBwYXJhbSB3b3JkICAgICAgdGhlIHdvcmQgdG8gYXBwZW5kCi0gICAgICogQHBhcmFtIGZpcnN0V29yZCBhIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRoaXMgaXMgdGhlIGZpcnN0IHdvcmQKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFkZFdvcmRUb1BhY2thZ2VCdWZmZXIoU3RyaW5nQnVmZmVyIHNiLCBTdHJpbmcgd29yZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBmaXJzdFdvcmQpIHsKLQotICAgICAgICBpZiAoSmF2YVV0aWxzLmlzSmF2YUtleXdvcmQod29yZCkpIHsKLSAgICAgICAgICAgIHdvcmQgPSBKYXZhVXRpbHMubWFrZU5vbkphdmFLZXl3b3JkKHdvcmQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gc2VwYXJhdGUgd2l0aCBkb3QgYWZ0ZXIgdGhlIGZpcnN0IHdvcmQKLSAgICAgICAgaWYgKCFmaXJzdFdvcmQpIHsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgnLicpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gcHJlZml4IGRpZ2l0cyB3aXRoIHVuZGVyc2NvcmVzCi0gICAgICAgIGlmIChDaGFyYWN0ZXIuaXNEaWdpdCh3b3JkLmNoYXJBdCgwKSkpIHsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgnXycpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gcmVwbGFjZSBwZXJpb2RzIHdpdGggdW5kZXJzY29yZXMKLSAgICAgICAgaWYgKHdvcmQuaW5kZXhPZignLicpICE9IC0xKSB7Ci0gICAgICAgICAgICBjaGFyW10gYnVmID0gd29yZC50b0NoYXJBcnJheSgpOwotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHdvcmQubGVuZ3RoKCk7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChidWZbaV0gPT0gJy4nKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1ZltpXSA9ICdfJzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHdvcmQgPSBuZXcgU3RyaW5nKGJ1Zik7Ci0gICAgICAgIH0KLQotICAgICAgICBzYi5hcHBlbmQod29yZCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvVVVJREdlbmVyYXRvci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvVVVJREdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTA1MThhLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi91dGlsL1VVSURHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi51dGlsOwotCi0vKioKLSAqIEBkZXByZWNhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBVVUlER2VuZXJhdG9yIGV4dGVuZHMgb3JnLmFwYWNoZS5heGlvbS5vbS51dGlsLlVVSURHZW5lcmF0b3IgewotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvVXRpbHMuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi91dGlsL1V0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyYjE0MWIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi51dGlsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS51dGlsLlVVSURHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBCb2R5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5UcmFuc3BvcnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LlNlcnZpY2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5TZXJ2aWNlR3JvdXBDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc01vZHVsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkZsb3c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5IYW5kbGVyRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5Jbk9ubHlBeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uSW5PdXRBeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uT3V0SW5BeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGhhc2VSdWxlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uVmVyc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLldTREwyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNFcnJvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5IYW5kbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLk1lc3NhZ2VSZWNlaXZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmkxOG4uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuUmF3WE1MSU5PdXRNZXNzYWdlUmVjZWl2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uOwotaW1wb3J0IGphdmEudGV4dC5QYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS5uZXQuU29ja2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0Lk5ldHdvcmtJbnRlcmZhY2U7Ci1pbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7Ci0KLXB1YmxpYyBjbGFzcyBVdGlscyB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFV0aWxzLmNsYXNzKTsKLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRIYW5kbGVyKEZsb3cgZmxvdywgSGFuZGxlciBoYW5kbGVyLCBTdHJpbmcgcGhhc2VOYW1lKSB7Ci0gICAgICAgIEhhbmRsZXJEZXNjcmlwdGlvbiBoYW5kbGVyRGVzYyA9IG5ldyBIYW5kbGVyRGVzY3JpcHRpb24oaGFuZGxlci5nZXROYW1lKCkpOwotICAgICAgICBQaGFzZVJ1bGUgcnVsZSA9IG5ldyBQaGFzZVJ1bGUocGhhc2VOYW1lKTsKLQotICAgICAgICBoYW5kbGVyRGVzYy5zZXRSdWxlcyhydWxlKTsKLSAgICAgICAgaGFuZGxlci5pbml0KGhhbmRsZXJEZXNjKTsKLSAgICAgICAgaGFuZGxlckRlc2Muc2V0SGFuZGxlcihoYW5kbGVyKTsKLSAgICAgICAgZmxvdy5hZGRIYW5kbGVyKGhhbmRsZXJEZXNjKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIudXRpbC5NZXNzYWdlQ29udGV4dEJ1aWxkZXI6Y3JlYXRlT3V0TWVzc2FnZUNvbnRleHQoKQotICAgICAqIEBkZXByZWNhdGVkIChwb3N0MS4xYnJhbmNoKQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTWVzc2FnZUNvbnRleHQgY3JlYXRlT3V0TWVzc2FnZUNvbnRleHQoTWVzc2FnZUNvbnRleHQgaW5NZXNzYWdlQ29udGV4dCkKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICByZXR1cm4gTWVzc2FnZUNvbnRleHRCdWlsZGVyLmNyZWF0ZU91dE1lc3NhZ2VDb250ZXh0KGluTWVzc2FnZUNvbnRleHQpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQXhpc1NlcnZpY2UgY3JlYXRlU2ltcGxlU2VydmljZShRTmFtZSBzZXJ2aWNlTmFtZSwgU3RyaW5nIGNsYXNzTmFtZSwgUU5hbWUgb3BOYW1lKQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVTaW1wbGVTZXJ2aWNlKHNlcnZpY2VOYW1lLCBuZXcgUmF3WE1MSU5PdXRNZXNzYWdlUmVjZWl2ZXIoKSwgY2xhc3NOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcE5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQXhpc1NlcnZpY2UgY3JlYXRlU2ltcGxlU2VydmljZWZvckNsaWVudChRTmFtZSBzZXJ2aWNlTmFtZSwgU3RyaW5nIGNsYXNzTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUU5hbWUgb3BOYW1lKQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVTaW1wbGVTZXJ2aWNlZm9yQ2xpZW50KHNlcnZpY2VOYW1lLCBuZXcgUmF3WE1MSU5PdXRNZXNzYWdlUmVjZWl2ZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcE5hbWUpOwotICAgIH0KLQotCi0gICAgcHVibGljIHN0YXRpYyBBeGlzU2VydmljZSBjcmVhdGVTaW1wbGVJbk9ubHlTZXJ2aWNlKFFOYW1lIHNlcnZpY2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlUmVjZWl2ZXIgbWVzc2FnZVJlY2VpdmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRTmFtZSBvcE5hbWUpCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSA9IG5ldyBBeGlzU2VydmljZShzZXJ2aWNlTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgIHNlcnZpY2Uuc2V0Q2xhc3NMb2FkZXIoZ2V0Q29udGV4dENsYXNzTG9hZGVyX0RvUHJpdigpKTsKLQotICAgICAgICBBeGlzT3BlcmF0aW9uIGF4aXNPcCA9IG5ldyBJbk9ubHlBeGlzT3BlcmF0aW9uKG9wTmFtZSk7Ci0KLSAgICAgICAgYXhpc09wLnNldE1lc3NhZ2VSZWNlaXZlcihtZXNzYWdlUmVjZWl2ZXIpOwotICAgICAgICBheGlzT3Auc2V0U3R5bGUoV1NETENvbnN0YW50cy5TVFlMRV9SUEMpOwotICAgICAgICBzZXJ2aWNlLmFkZE9wZXJhdGlvbihheGlzT3ApOwotICAgICAgICBzZXJ2aWNlLm1hcEFjdGlvblRvT3BlcmF0aW9uKENvbnN0YW50cy5BWElTMl9OQU1FU1BBQ0VfVVJJICsgIi8iICsgb3BOYW1lLmdldExvY2FsUGFydCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNPcCk7Ci0KLSAgICAgICAgcmV0dXJuIHNlcnZpY2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3NMb2FkZXIgZ2V0Q29udGV4dENsYXNzTG9hZGVyX0RvUHJpdigpIHsKLSAgICAgICAgcmV0dXJuIChDbGFzc0xvYWRlcikgb3JnLmFwYWNoZS5heGlzMi5qYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAotICAgICAgICAgICAgICAgIG5ldyBQcml2aWxlZ2VkQWN0aW9uPENsYXNzTG9hZGVyPigpIHsKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIENsYXNzTG9hZGVyIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICApOwotICAgIH0KLQotCi0gICAgcHVibGljIHN0YXRpYyBBeGlzU2VydmljZSBjcmVhdGVTaW1wbGVTZXJ2aWNlKFFOYW1lIHNlcnZpY2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlUmVjZWl2ZXIgbWVzc2FnZVJlY2VpdmVyLCBTdHJpbmcgY2xhc3NOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRTmFtZSBvcE5hbWUpCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSA9IG5ldyBBeGlzU2VydmljZShzZXJ2aWNlTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0KLSAgICAgICAgc2VydmljZS5zZXRDbGFzc0xvYWRlcihnZXRDb250ZXh0Q2xhc3NMb2FkZXJfRG9Qcml2KCkpOwotICAgICAgICBzZXJ2aWNlLmFkZFBhcmFtZXRlcihuZXcgUGFyYW1ldGVyKENvbnN0YW50cy5TRVJWSUNFX0NMQVNTLCBjbGFzc05hbWUpKTsKLQotICAgICAgICBBeGlzT3BlcmF0aW9uIGF4aXNPcCA9IG5ldyBJbk91dEF4aXNPcGVyYXRpb24ob3BOYW1lKTsKLQotICAgICAgICBheGlzT3Auc2V0TWVzc2FnZVJlY2VpdmVyKG1lc3NhZ2VSZWNlaXZlcik7Ci0gICAgICAgIGF4aXNPcC5zZXRTdHlsZShXU0RMQ29uc3RhbnRzLlNUWUxFX1JQQyk7Ci0gICAgICAgIHNlcnZpY2UuYWRkT3BlcmF0aW9uKGF4aXNPcCk7Ci0gICAgICAgIHNlcnZpY2UubWFwQWN0aW9uVG9PcGVyYXRpb24oQ29uc3RhbnRzLkFYSVMyX05BTUVTUEFDRV9VUkkgKyAiLyIgKyBvcE5hbWUuZ2V0TG9jYWxQYXJ0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpc09wKTsKLQotICAgICAgICByZXR1cm4gc2VydmljZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEF4aXNTZXJ2aWNlIGNyZWF0ZVNpbXBsZVNlcnZpY2Vmb3JDbGllbnQoUU5hbWUgc2VydmljZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VSZWNlaXZlciBtZXNzYWdlUmVjZWl2ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFOYW1lIG9wTmFtZSkKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBBeGlzU2VydmljZSBzZXJ2aWNlID0gbmV3IEF4aXNTZXJ2aWNlKHNlcnZpY2VOYW1lLmdldExvY2FsUGFydCgpKTsKLQotICAgICAgICBzZXJ2aWNlLnNldENsYXNzTG9hZGVyKGdldENvbnRleHRDbGFzc0xvYWRlcl9Eb1ByaXYoKSk7Ci0gICAgICAgIHNlcnZpY2UuYWRkUGFyYW1ldGVyKG5ldyBQYXJhbWV0ZXIoQ29uc3RhbnRzLlNFUlZJQ0VfQ0xBU1MsIGNsYXNzTmFtZSkpOwotCi0gICAgICAgIEF4aXNPcGVyYXRpb24gYXhpc09wID0gbmV3IE91dEluQXhpc09wZXJhdGlvbihvcE5hbWUpOwotCi0gICAgICAgIGF4aXNPcC5zZXRNZXNzYWdlUmVjZWl2ZXIobWVzc2FnZVJlY2VpdmVyKTsKLSAgICAgICAgYXhpc09wLnNldFN0eWxlKFdTRExDb25zdGFudHMuU1RZTEVfUlBDKTsKLSAgICAgICAgc2VydmljZS5hZGRPcGVyYXRpb24oYXhpc09wKTsKLQotICAgICAgICByZXR1cm4gc2VydmljZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFNlcnZpY2VDb250ZXh0IGZpbGxDb250ZXh0SW5mb3JtYXRpb24oQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ3VyYXRpb25Db250ZXh0KQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0KLSAgICAgICAgLy8gMi4gaWYgbnVsbCwgY3JlYXRlIG5ldyBvcEN0eHQKLSAgICAgICAgLy8gZmlsbCB0aGUgc2VydmljZSBncm91cCBjb250ZXh0IGFuZCBzZXJ2aWNlIGNvbnRleHQgaW5mbwotICAgICAgICByZXR1cm4gZmlsbFNlcnZpY2VDb250ZXh0QW5kU2VydmljZUdyb3VwQ29udGV4dChheGlzU2VydmljZSwgY29uZmlndXJhdGlvbkNvbnRleHQpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFNlcnZpY2VDb250ZXh0IGZpbGxTZXJ2aWNlQ29udGV4dEFuZFNlcnZpY2VHcm91cENvbnRleHQoQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWd1cmF0aW9uQ29udGV4dCkKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBTdHJpbmcgc2VydmljZUdyb3VwQ29udGV4dElkID0gVVVJREdlbmVyYXRvci5nZXRVVUlEKCk7Ci0gICAgICAgIFNlcnZpY2VHcm91cENvbnRleHQgc2VydmljZUdyb3VwQ29udGV4dCA9Ci0gICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbkNvbnRleHQuY3JlYXRlU2VydmljZUdyb3VwQ29udGV4dChheGlzU2VydmljZS5nZXRBeGlzU2VydmljZUdyb3VwKCkpOwotCi0gICAgICAgIHNlcnZpY2VHcm91cENvbnRleHQuc2V0SWQoc2VydmljZUdyb3VwQ29udGV4dElkKTsKLSAgICAgICAgY29uZmlndXJhdGlvbkNvbnRleHQuYWRkU2VydmljZUdyb3VwQ29udGV4dEludG9Tb2FwU2Vzc2lvblRhYmxlKHNlcnZpY2VHcm91cENvbnRleHQpOwotICAgICAgICByZXR1cm4gc2VydmljZUdyb3VwQ29udGV4dC5nZXRTZXJ2aWNlQ29udGV4dChheGlzU2VydmljZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQnJlYWsgYSBmdWxsIHBhdGggaW50byBwaWVjZXMKLSAgICAgKgotICAgICAqIEByZXR1cm4gYW4gYXJyYXkgd2hlcmUgZWxlbWVudCBbMF0gYWx3YXlzIGNvbnRhaW5zIHRoZSBzZXJ2aWNlLCBhbmQgZWxlbWVudCAxLCBpZiBub3QgbnVsbCwgY29udGFpbnMKLSAgICAgKiAgICAgICAgIHRoZSBwYXRoIGFmdGVyIHRoZSBmaXJzdCBlbGVtZW50LiBhbGwgPyBwYXJhbWV0ZXJzIGFyZSBkaXNjYXJkZWQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmdbXSBwYXJzZVJlcXVlc3RVUkxGb3JTZXJ2aWNlQW5kT3BlcmF0aW9uKFN0cmluZyBwYXRoLCBTdHJpbmcgc2VydmljZVBhdGgpIHsKLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoInBhcnNlUmVxdWVzdFVSTEZvclNlcnZpY2VBbmRPcGVyYXRpb24gOiBbIiArIHBhdGggKyAiXVsiICsgc2VydmljZVBhdGggKyAiXSIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwYXRoID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZ1tdIHZhbHVlcyA9IG5ldyBTdHJpbmdbMl07Ci0KLSAgICAgICAgLy8gVE9ETy4gVGhpcyBpcyBraW5kIG9mIGJyaXR0bGUuIEFueSBzZXJ2aWNlIHdpdGggdGhlIG5hbWUgL3NlcnZpY2VzIHdvdWxkIGNhdXNlIGZ1bi4KLSAgICAgICAgaW50IGluZGV4ID0gcGF0aC5sYXN0SW5kZXhPZihzZXJ2aWNlUGF0aCk7Ci0gICAgICAgIFN0cmluZyBzZXJ2aWNlOwotCi0gICAgICAgIGlmICgtMSAhPSBpbmRleCkgewotICAgICAgICAgICAgaW50IHNlcnZpY2VTdGFydCA9IGluZGV4ICsgc2VydmljZVBhdGgubGVuZ3RoKCk7Ci0KLSAgICAgICAgICAgIGlmIChwYXRoLmxlbmd0aCgpID4gc2VydmljZVN0YXJ0ICsgMSkgewotICAgICAgICAgICAgICAgIHNlcnZpY2UgPSBwYXRoLnN1YnN0cmluZyhzZXJ2aWNlU3RhcnQgKyAxKTsKLQotICAgICAgICAgICAgICAgIGludCBxdWVyeUluZGV4ID0gc2VydmljZS5pbmRleE9mKCc/Jyk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocXVlcnlJbmRleCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgc2VydmljZSA9IHNlcnZpY2Uuc3Vic3RyaW5nKDAsIHF1ZXJ5SW5kZXgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGludCBvcGVyYXRpb25JbmRleCA9IHNlcnZpY2UuaW5kZXhPZignLycpOwotCi0gICAgICAgICAgICAgICAgaWYgKG9wZXJhdGlvbkluZGV4ID4gMCkgewotICAgICAgICAgICAgICAgICAgICB2YWx1ZXNbMF0gPSBzZXJ2aWNlLnN1YnN0cmluZygwLCBvcGVyYXRpb25JbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlc1sxXSA9IHNlcnZpY2Uuc3Vic3RyaW5nKG9wZXJhdGlvbkluZGV4ICsgMSk7Ci0gICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbkluZGV4ID0gdmFsdWVzWzFdLmxhc3RJbmRleE9mKCcvJyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvcGVyYXRpb25JbmRleCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlc1sxXSA9IHZhbHVlc1sxXS5zdWJzdHJpbmcob3BlcmF0aW9uSW5kZXggKyAxKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlc1swXSA9IHNlcnZpY2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJVbmFibGUgdG8gcGFyc2UgcmVxdWVzdCBVUkwgWyIgKyBwYXRoICsgIl1bIiArIHNlcnZpY2VQYXRoICsgIl0iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB2YWx1ZXM7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBDb25maWd1cmF0aW9uQ29udGV4dCBnZXROZXdDb25maWd1cmF0aW9uQ29udGV4dChTdHJpbmcgcmVwb3NpdHJ5KQotICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIEZpbGUgZmlsZSA9IG5ldyBGaWxlKHJlcG9zaXRyeSk7Ci0gICAgICAgIGJvb2xlYW4gZXhpc3RzID0gZXhpc3RzKGZpbGUpOwotICAgICAgICBpZiAoIWV4aXN0cykgewotICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigicmVwb3NpdG9yeSBkaXJlY3RvcnkgIiArIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRvZXMgbm90IGV4aXN0cyIpOwotICAgICAgICB9Ci0gICAgICAgIEZpbGUgYXhpczJ4bWwgPSBuZXcgRmlsZShmaWxlLCAiYXhpcy54bWwiKTsKLSAgICAgICAgU3RyaW5nIGF4aXMyeG1sU3RyaW5nID0gbnVsbDsKLSAgICAgICAgaWYgKGV4aXN0cyhheGlzMnhtbCkpIHsKLSAgICAgICAgICAgIGF4aXMyeG1sU3RyaW5nID0gYXhpczJ4bWwuZ2V0TmFtZSgpOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZyBwYXRoID0gKFN0cmluZykgb3JnLmFwYWNoZS5heGlzMi5qYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAotICAgICAgICAgICAgICAgIG5ldyBQcml2aWxlZ2VkQWN0aW9uPFN0cmluZz4oKSB7Ci0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICk7Ci0gICAgICAgIHJldHVybiBDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkKLSAgICAgICAgICAgICAgICAuY3JlYXRlQ29uZmlndXJhdGlvbkNvbnRleHRGcm9tRmlsZVN5c3RlbShwYXRoLCBheGlzMnhtbFN0cmluZyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBleGlzdHMoZmluYWwgRmlsZSBmaWxlKSB7Ci0gICAgICAgIEJvb2xlYW4gZXhpc3RzID0gKEJvb2xlYW4pIG9yZy5hcGFjaGUuYXhpczIuamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgKLSAgICAgICAgICAgICAgICBuZXcgUHJpdmlsZWdlZEFjdGlvbjxCb29sZWFuPigpIHsKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIEJvb2xlYW4gcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCb29sZWFuKGZpbGUuZXhpc3RzKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICApOwotICAgICAgICByZXR1cm4gZXhpc3RzLmJvb2xlYW5WYWx1ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFBhcmFtZXRlclZhbHVlKFBhcmFtZXRlciBwYXJhbSkgewotICAgICAgICBpZiAocGFyYW0gPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gKFN0cmluZykgcGFyYW0uZ2V0VmFsdWUoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1vZHVsZU5hbWUoU3RyaW5nIG1vZHVsZU5hbWUsIFN0cmluZyBtb2R1bGVWZXJzaW9uKSB7Ci0gICAgICAgIGlmIChtb2R1bGVWZXJzaW9uICE9IG51bGwgJiYgbW9kdWxlVmVyc2lvbi5sZW5ndGgoKSAhPSAwKSB7Ci0gICAgICAgICAgICBtb2R1bGVOYW1lID0gbW9kdWxlTmFtZSArICItIiArIG1vZHVsZVZlcnNpb247Ci0gICAgICAgIH0gCi0gICAgICAgIHJldHVybiBtb2R1bGVOYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIC0gaWYgaGUgdHJ5aW5nIHRvIGVuZ2FnZSB0aGUgc2FtZSBtb2R1bGUgdGhlbiBtZXRob2Qgd2lsbCByZXR1cmVuIGZhbHNlCi0gICAgICogLSBlbHNlIGl0IHdpbGwgcmV0dXJuIHRydWUKLSAgICAgKgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjaGVja1ZlcnNpb24oVmVyc2lvbiBtb2R1bGUxdmVyc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gbW9kdWxlMnZlcnNpb24pIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBpZiAoKG1vZHVsZTF2ZXJzaW9uICE9bnVsbCAmJiAhbW9kdWxlMXZlcnNpb24uZXF1YWxzKG1vZHVsZTJ2ZXJzaW9uKSkgfHwKLSAgICAgICAgICAgICAgICBtb2R1bGUydmVyc2lvbiAhPW51bGwgJiYgIW1vZHVsZTJ2ZXJzaW9uLmVxdWFscyhtb2R1bGUxdmVyc2lvbikpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoInRyeWluZyB0byBlbmdhZ2UgdHdvIGRpZmZlcmVudCBtb2R1bGUgdmVyc2lvbnMgIiArCi0gICAgICAgICAgICAgICAgICAgIG1vZHVsZTF2ZXJzaW9uICsgIiA6ICIgKyBtb2R1bGUydmVyc2lvbik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGNhbGN1bGF0ZURlZmF1bHRNb2R1bGVWZXJzaW9uKEhhc2hNYXAgbW9kdWxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZykgewotICAgICAgICBJdGVyYXRvciBhbGxNb2R1bGVzID0gbW9kdWxlcy52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgICAgICBNYXA8U3RyaW5nLFZlcnNpb24+IGRlZmF1bHRNb2R1bGVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLFZlcnNpb24+KCk7Ci0gICAgICAgIHdoaWxlIChhbGxNb2R1bGVzLmhhc05leHQoKSkgewotICAgICAgICAgICAgQXhpc01vZHVsZSBheGlzTW9kdWxlID0gKEF4aXNNb2R1bGUpIGFsbE1vZHVsZXMubmV4dCgpOwotICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBheGlzTW9kdWxlLmdldE5hbWUoKTsKLSAgICAgICAgICAgIFZlcnNpb24gY3VycmVudERlZmF1bHRWZXJzaW9uID0gZGVmYXVsdE1vZHVsZXMuZ2V0KG5hbWUpOwotICAgICAgICAgICAgVmVyc2lvbiB2ZXJzaW9uID0gYXhpc01vZHVsZS5nZXRWZXJzaW9uKCk7Ci0gICAgICAgICAgICBpZiAoY3VycmVudERlZmF1bHRWZXJzaW9uID09IG51bGwgfHwKLSAgICAgICAgICAgICAgICAgICAgKHZlcnNpb24gIT0gbnVsbCAmJiB2ZXJzaW9uLmNvbXBhcmVUbyhjdXJyZW50RGVmYXVsdFZlcnNpb24pID4gMCkpIHsKLSAgICAgICAgICAgICAgICBkZWZhdWx0TW9kdWxlcy5wdXQobmFtZSwgdmVyc2lvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgSXRlcmF0b3IgZGVmX21vZF9pdHIgPSBkZWZhdWx0TW9kdWxlcy5rZXlTZXQoKS5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoZGVmX21vZF9pdHIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbW9kdWxlTmFtZSA9IChTdHJpbmcpIGRlZl9tb2RfaXRyLm5leHQoKTsKLSAgICAgICAgICAgIFZlcnNpb24gdmVyc2lvbiA9IGRlZmF1bHRNb2R1bGVzLmdldChtb2R1bGVOYW1lKTsKLSAgICAgICAgICAgIGF4aXNDb25maWcuYWRkRGVmYXVsdE1vZHVsZVZlcnNpb24obW9kdWxlTmFtZSwgdmVyc2lvbiA9PSBudWxsID8gbnVsbCA6IHZlcnNpb24udG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVjayBpZiBhIE1lc3NhZ2VDb250ZXh0IHByb3BlcnR5IGlzIHRydWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVzc2FnZUNvbnRleHQgdGhlIE1lc3NhZ2VDb250ZXh0Ci0gICAgICogQHBhcmFtIHByb3BlcnR5TmFtZSAgIHRoZSBwcm9wZXJ0eSBuYW1lCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBwcm9wZXJ0eSBpcyBCb29sZWFuLlRSVUUsICJ0cnVlIiwgMSwgZXRjLiBvciBmYWxzZSBvdGhlcndpc2UKLSAgICAgKiBAZGVwcmVjYXRlZCBwbGVhc2UgdXNlIE1lc3NhZ2VDb250ZXh0LmlzVHJ1ZShwcm9wZXJ0eU5hbWUpIGluc3RlYWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNFeHBsaWNpdGx5VHJ1ZShNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCwgU3RyaW5nIHByb3BlcnR5TmFtZSkgewotICAgICAgICBPYmplY3QgZmxhZyA9IG1lc3NhZ2VDb250ZXh0LmdldFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0gICAgICAgIHJldHVybiBKYXZhVXRpbHMuaXNUcnVlRXhwbGljaXRseShmbGFnKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNYXBzIHRoZSBTdHJpbmcgVVJJIG9mIHRoZSBNZXNzYWdlIGV4Y2hhbmdlIHBhdHRlcm4gdG8gYSBpbnRlZ2VyLgotICAgICAqIEZ1cnRoZXIsIGluIHRoZSBmaXJzdCBsb29rdXAsIGl0IHdpbGwgY2FjaGUgdGhlIGxvb2tlZAotICAgICAqIHVwIHZhbHVlIHNvIHRoYXQgdGhlIHN1YnNlcXVlbnQgbWV0aG9kIGNhbGxzIGFyZSBleHRyZW1lbHkgZWZmaWNpZW50LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldEF4aXNTcGVjaWZNRVBDb25zdGFudChTdHJpbmcgbWVzc2FnZUV4Y2hhbmdlUGF0dGVybikgewotCi0KLSAgICAgICAgaW50IG1lcENvbnN0YW50ID0gV1NETENvbnN0YW50cy5NRVBfQ09OU1RBTlRfSU5WQUxJRDsKLQotICAgICAgICBpZiAoV1NETDJDb25zdGFudHMuTUVQX1VSSV9JTl9PVVQuZXF1YWxzKG1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4pIHx8Ci0gICAgICAgICAgICBXU0RMQ29uc3RhbnRzLldTREwyMF8yMDA2Q29uc3RhbnRzLk1FUF9VUklfSU5fT1VULmVxdWFscyhtZXNzYWdlRXhjaGFuZ2VQYXR0ZXJuKSB8fAotICAgICAgICAgICAgV1NETENvbnN0YW50cy5XU0RMMjBfMjAwNF9Db25zdGFudHMuTUVQX1VSSV9JTl9PVVQuZXF1YWxzKG1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4pKSB7Ci0gICAgICAgICAgICBtZXBDb25zdGFudCA9IFdTRExDb25zdGFudHMuTUVQX0NPTlNUQU5UX0lOX09VVDsKLSAgICAgICAgfSBlbHNlIGlmICgKLSAgICAgICAgICAgICAgICBXU0RMMkNvbnN0YW50cy5NRVBfVVJJX0lOX09OTFkuZXF1YWxzKG1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4pIHx8Ci0gICAgICAgICAgICAgICAgV1NETENvbnN0YW50cy5XU0RMMjBfMjAwNkNvbnN0YW50cy5NRVBfVVJJX0lOX09OTFkuZXF1YWxzKG1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4pIHx8Ci0gICAgICAgICAgICAgICAgV1NETENvbnN0YW50cy5XU0RMMjBfMjAwNF9Db25zdGFudHMuTUVQX1VSSV9JTl9PTkxZCi0gICAgICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKG1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4pKSB7Ci0gICAgICAgICAgICBtZXBDb25zdGFudCA9IFdTRExDb25zdGFudHMuTUVQX0NPTlNUQU5UX0lOX09OTFk7Ci0gICAgICAgIH0gZWxzZSBpZiAoV1NETDJDb25zdGFudHMuTUVQX1VSSV9JTl9PUFRJT05BTF9PVVQKLSAgICAgICAgICAgICAgICAuZXF1YWxzKG1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4pIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU0RMQ29uc3RhbnRzLldTREwyMF8yMDA2Q29uc3RhbnRzLk1FUF9VUklfSU5fT1BUSU9OQUxfT1VUCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5lcXVhbHMobWVzc2FnZUV4Y2hhbmdlUGF0dGVybikgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU0RMQ29uc3RhbnRzLldTREwyMF8yMDA0X0NvbnN0YW50cy5NRVBfVVJJX0lOX09QVElPTkFMX09VVAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmVxdWFscyhtZXNzYWdlRXhjaGFuZ2VQYXR0ZXJuKSkgewotICAgICAgICAgICAgbWVwQ29uc3RhbnQgPSBXU0RMQ29uc3RhbnRzLk1FUF9DT05TVEFOVF9JTl9PUFRJT05BTF9PVVQ7Ci0gICAgICAgIH0gZWxzZSBpZiAoV1NETDJDb25zdGFudHMuTUVQX1VSSV9PVVRfSU4uZXF1YWxzKG1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4pIHx8Ci0gICAgICAgICAgICAgICAgICAgV1NETENvbnN0YW50cy5XU0RMMjBfMjAwNkNvbnN0YW50cy5NRVBfVVJJX09VVF9JTi5lcXVhbHMobWVzc2FnZUV4Y2hhbmdlUGF0dGVybikgfHwKLSAgICAgICAgICAgICAgICAgICBXU0RMQ29uc3RhbnRzLldTREwyMF8yMDA0X0NvbnN0YW50cy5NRVBfVVJJX09VVF9JTgotICAgICAgICAgICAgICAgICAgICAgICAgICAgLmVxdWFscyhtZXNzYWdlRXhjaGFuZ2VQYXR0ZXJuKSkgewotICAgICAgICAgICAgbWVwQ29uc3RhbnQgPSBXU0RMQ29uc3RhbnRzLk1FUF9DT05TVEFOVF9PVVRfSU47Ci0gICAgICAgIH0gZWxzZSBpZiAoV1NETDJDb25zdGFudHMuTUVQX1VSSV9PVVRfT05MWS5lcXVhbHMobWVzc2FnZUV4Y2hhbmdlUGF0dGVybikgfHwKLSAgICAgICAgICAgICAgICAgICBXU0RMQ29uc3RhbnRzLldTREwyMF8yMDA2Q29uc3RhbnRzLk1FUF9VUklfT1VUX09OTFkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC5lcXVhbHMobWVzc2FnZUV4Y2hhbmdlUGF0dGVybikgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NETENvbnN0YW50cy5XU0RMMjBfMjAwNF9Db25zdGFudHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuTUVQX1VSSV9PVVRfT05MWS5lcXVhbHMobWVzc2FnZUV4Y2hhbmdlUGF0dGVybikpIHsKLSAgICAgICAgICAgIG1lcENvbnN0YW50ID0gV1NETENvbnN0YW50cy5NRVBfQ09OU1RBTlRfT1VUX09OTFk7Ci0gICAgICAgIH0gZWxzZSBpZiAoV1NETDJDb25zdGFudHMuTUVQX1VSSV9PVVRfT1BUSU9OQUxfSU4uZXF1YWxzKG1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4pIHx8Ci0gICAgICAgICAgICAgICAgICAgV1NETENvbnN0YW50cy5XU0RMMjBfMjAwNkNvbnN0YW50cy5NRVBfVVJJX09VVF9PUFRJT05BTF9JTgotICAgICAgICAgICAgICAgICAgICAgICAgICAgLmVxdWFscyhtZXNzYWdlRXhjaGFuZ2VQYXR0ZXJuKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU0RMQ29uc3RhbnRzLldTREwyMF8yMDA0X0NvbnN0YW50cy5NRVBfVVJJX09VVF9PUFRJT05BTF9JTgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5lcXVhbHMobWVzc2FnZUV4Y2hhbmdlUGF0dGVybikpIHsKLSAgICAgICAgICAgIG1lcENvbnN0YW50ID0gV1NETENvbnN0YW50cy5NRVBfQ09OU1RBTlRfT1VUX09QVElPTkFMX0lOOwotICAgICAgICB9IGVsc2UgaWYgKFdTREwyQ29uc3RhbnRzLk1FUF9VUklfUk9CVVNUX0lOX09OTFkuZXF1YWxzKG1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4pIHx8Ci0gICAgICAgICAgICAgICAgICAgV1NETENvbnN0YW50cy5XU0RMMjBfMjAwNkNvbnN0YW50cy5NRVBfVVJJX1JPQlVTVF9JTl9PTkxZCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKG1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4pIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdTRExDb25zdGFudHMuV1NETDIwXzIwMDRfQ29uc3RhbnRzLk1FUF9VUklfUk9CVVNUX0lOX09OTFkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKG1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4pKSB7Ci0gICAgICAgICAgICBtZXBDb25zdGFudCA9IFdTRExDb25zdGFudHMuTUVQX0NPTlNUQU5UX1JPQlVTVF9JTl9PTkxZOwotICAgICAgICB9IGVsc2UgaWYgKFdTREwyQ29uc3RhbnRzLk1FUF9VUklfUk9CVVNUX09VVF9PTkxZLmVxdWFscyhtZXNzYWdlRXhjaGFuZ2VQYXR0ZXJuKSB8fAotICAgICAgICAgICAgICAgICAgIFdTRExDb25zdGFudHMuV1NETDIwXzIwMDZDb25zdGFudHMuTUVQX1VSSV9ST0JVU1RfT1VUX09OTFkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC5lcXVhbHMobWVzc2FnZUV4Y2hhbmdlUGF0dGVybikgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NETENvbnN0YW50cy5XU0RMMjBfMjAwNF9Db25zdGFudHMuTUVQX1VSSV9ST0JVU1RfT1VUX09OTFkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKG1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4pKSB7Ci0gICAgICAgICAgICBtZXBDb25zdGFudCA9IFdTRExDb25zdGFudHMuTUVQX0NPTlNUQU5UX1JPQlVTVF9PVVRfT05MWTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtZXBDb25zdGFudCA9PSBXU0RMQ29uc3RhbnRzLk1FUF9DT05TVEFOVF9JTlZBTElEKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0Vycm9yKE1lc3NhZ2VzLmdldE1lc3NhZ2UoIm1lcG1hcHBpbmdlcnJvciIpKTsKLSAgICAgICAgfQotCi0KLSAgICAgICAgcmV0dXJuIG1lcENvbnN0YW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBhbiBBeGlzRmF1bHQgb2JqZWN0IHRvIHJlcHJlc2VudCB0aGUgU09BUEZhdWx0IGluIHRoZSBTT0FQRW52ZWxvcGUgYXR0YWNoZWQKLSAgICAgKiB0byB0aGUgcHJvdmlkZWQgTWVzc2FnZUNvbnRleHQuIFRoaXMgZmlyc3QgY2hlY2sgZm9yIGFuIGFscmVhZHkgZXh0cmFjdGVkIEF4aXNGYXVsdAotICAgICAqIGFuZCBvdGhlcndpc2UgZG9lcyBhIHNpbXBsZSBleHRyYWN0LgotICAgICAqIDxwLz4KLSAgICAgKiBNVVNUIE5PVCBiZSBwYXNzZWQgYSBNZXNzYWdlQ29udGV4dCB3aGljaCBkb2VzIG5vdCBjb250YWluIGEgU09BUEZhdWx0Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVzc2FnZUNvbnRleHQKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBBeGlzRmF1bHQgZ2V0SW5ib3VuZEZhdWx0RnJvbU1lc3NhZ2VDb250ZXh0KE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0KSB7Ci0gICAgICAgIC8vIEdldCB0aGUgZmF1bHQgaWYgaXQncyBhbHJlYWR5IGJlZW4gZXh0cmFjdGVkIGJ5IGEgaGFuZGxlcgotICAgICAgICBBeGlzRmF1bHQgcmVzdWx0ID0gKEF4aXNGYXVsdCkgbWVzc2FnZUNvbnRleHQuZ2V0UHJvcGVydHkoQ29uc3RhbnRzLklOQk9VTkRfRkFVTFRfT1ZFUlJJREUpOwotICAgICAgICAvLyBFbHNlLCBleHRyYWN0IGl0IGZyb20gdGhlIFNPQVBCb2R5Ci0gICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgewotICAgICAgICAgICAgU09BUEVudmVsb3BlIGVudmVsb3BlID0gbWVzc2FnZUNvbnRleHQuZ2V0RW52ZWxvcGUoKTsKLSAgICAgICAgICAgIFNPQVBGYXVsdCBzb2FwRmF1bHQ7Ci0gICAgICAgICAgICBTT0FQQm9keSBzb2FwQm9keTsKLSAgICAgICAgICAgIGlmIChlbnZlbG9wZSAhPSBudWxsICYmIChzb2FwQm9keSA9IGVudmVsb3BlLmdldEJvZHkoKSkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmICgoc29hcEZhdWx0ID0gc29hcEJvZHkuZ2V0RmF1bHQoKSkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEF4aXNGYXVsdChzb2FwRmF1bHQsIG1lc3NhZ2VDb250ZXh0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gSWYgaXRzIGEgUkVTVCByZXNwb25zZSB0aGUgY29udGVudCBpcyBub3QgYSBTT0FQIGVudmVsb3AgYW5kIGhlbmNlIHdlIHdpbGwKLSAgICAgICAgICAgICAgICAvLyBIYXZlIHVzZSB0aGUgc29hcCBib2R5IGFzIHRoZSBleGNlcHRpb24KLSAgICAgICAgICAgICAgICBpZiAobWVzc2FnZUNvbnRleHQuaXNEb2luZ1JFU1QoKSAmJiBzb2FwQm9keS5nZXRGaXJzdEVsZW1lbnQoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQXhpc0ZhdWx0KHNvYXBCb2R5LmdldEZpcnN0RWxlbWVudCgpLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIE5vdCBnb2luZyB0byBiZSBhYmxlIHRvCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiVGhlIE1lc3NhZ2VDb250ZXh0IGRvZXMgbm90IGhhdmUgYW4gYXNzb2NpYXRlZCBTT0FQRmF1bHQuIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2Qgd2lsbCBwcm92aWRlIHRoZSBsb2dpYyBuZWVkZWQgdG8gcmV0cmlldmUgYW4gT2JqZWN0J3MgY2xhc3Nsb2FkZXIKLSAgICAgKiBpbiBhIEphdmEgMiBTZWN1cml0eSBjb21wbGlhbnQgbWFubmVyLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQ2xhc3NMb2FkZXIgZ2V0T2JqZWN0Q2xhc3NMb2FkZXIoZmluYWwgT2JqZWN0IG9iamVjdCkgewotICAgICAgICBpZihvYmplY3QgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gKENsYXNzTG9hZGVyKSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEFjdGlvbigpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9iamVjdC5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0TXRvbVRocmVzaG9sZChNZXNzYWdlQ29udGV4dCBtc2dDdHh0KXsKLSAgICAJSW50ZWdlciB2YWx1ZSA9IG51bGw7ICAgICAgICAgCi0gICAgICAgIGlmKCFtc2dDdHh0LmlzU2VydmVyU2lkZSgpKXsgICAgICAgICAgICAgICAgCi0JICAgICAgICB2YWx1ZSA9IChJbnRlZ2VyKW1zZ0N0eHQuZ2V0UHJvcGVydHkoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uTVRPTV9USFJFU0hPTEQpOwkgICAgICAgIAotICAgICAgICB9ZWxzZXsKLSAgICAgICAgCVBhcmFtZXRlciBwYXJhbSA9IG1zZ0N0eHQuZ2V0UGFyYW1ldGVyKENvbnN0YW50cy5Db25maWd1cmF0aW9uLk1UT01fVEhSRVNIT0xEKTsKLSAgICAgICAgCWlmKHBhcmFtIT1udWxsKXsKLSAgICAgICAgCQl2YWx1ZSA9IChJbnRlZ2VyKXBhcmFtLmdldFZhbHVlKCk7ICAgICAgIAkJICAgICAgICAJCQotICAgICAgICAJfSAgICAgICAgCSAgICAgICAgCQotICAgICAgICB9Ci0gICAgICAgIGludCB0aHJlc2hvbGQgPSAodmFsdWUhPW51bGwpP3ZhbHVlLmludFZhbHVlKCk6MDsKLSAgICAgICAgaWYobG9nLmlzRGVidWdFbmFibGVkKCkpewotICAgICAgICAJbG9nLmRlYnVnKCJNVE9NIG9wdGltaXplZCBUaHJlc2hvbGQgdmFsdWUgPSIrdGhyZXNob2xkKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhyZXNob2xkOwotICAgIH0KLSAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgaXAgYWRkcmVzcyB0byBiZSB1c2VkIGZvciB0aGUgcmVwbHl0byBlcHIKLSAgICAgKiBDQVVUSU9OOgotICAgICAqIFRoaXMgd2lsbCBnbyB0aHJvdWdoIGFsbCB0aGUgYXZhaWxhYmxlIG5ldHdvcmsgaW50ZXJmYWNlcyBhbmQgd2lsbCB0cnkgdG8gcmV0dXJuIGFuIGlwIGFkZHJlc3MuCi0gICAgICogRmlyc3QgdGhpcyB3aWxsIHRyeSB0byBnZXQgdGhlIGZpcnN0IElQIHdoaWNoIGlzIG5vdCBsb29wYmFjayBhZGRyZXNzICgxMjcuMC4wLjEpLiBJZiBub25lIGlzIGZvdW5kCi0gICAgICogdGhlbiB0aGlzIHdpbGwgcmV0dXJuIHRoaXMgd2lsbCByZXR1cm4gMTI3LjAuMC4xLgotICAgICAqIFRoaXMgd2lsbCA8Yj5ub3Q8Yj4gY29uc2lkZXIgSVB2NiBhZGRyZXNzZXMuCi0gICAgICogPHAvPgotICAgICAqIFRPRE86Ci0gICAgICogLSBJbXByb3ZlIHRoaXMgbG9naWMgdG8gZ2VuYXJhbGl6ZSBpdCBhIGJpdCBtb3JlCi0gICAgICogLSBPYnRhaW4gdGhlIGlwIHRvIGJlIHVzZWQgaGVyZSBmcm9tIHRoZSBDYWxsIEFQSQotICAgICAqCi0gICAgICogQHJldHVybiBSZXR1cm5zIFN0cmluZy4KLSAgICAgKiBAdGhyb3dzIGphdmEubmV0LlNvY2tldEV4Y2VwdGlvbgotICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRJcEFkZHJlc3MoKSB0aHJvd3MgU29ja2V0RXhjZXB0aW9uIHsKLSAgICAgICAgRW51bWVyYXRpb24gZSA9IE5ldHdvcmtJbnRlcmZhY2UuZ2V0TmV0d29ya0ludGVyZmFjZXMoKTsKLSAgICAgICAgU3RyaW5nIGFkZHJlc3MgPSAiMTI3LjAuMC4xIjsKLQotICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgTmV0d29ya0ludGVyZmFjZSBuZXRmYWNlID0gKE5ldHdvcmtJbnRlcmZhY2UpIGUubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgIEVudW1lcmF0aW9uIGFkZHJlc3NlcyA9IG5ldGZhY2UuZ2V0SW5ldEFkZHJlc3NlcygpOwotCi0gICAgICAgICAgICB3aGlsZSAoYWRkcmVzc2VzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICAgICAgSW5ldEFkZHJlc3MgaXAgPSAoSW5ldEFkZHJlc3MpIGFkZHJlc3Nlcy5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgICAgIGlmICghaXAuaXNMb29wYmFja0FkZHJlc3MoKSAmJiBpc0lQKGlwLmdldEhvc3RBZGRyZXNzKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBpcC5nZXRIb3N0QWRkcmVzcygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBhZGRyZXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZpcnN0IGNoZWNrIHdoZXRoZXIgdGhlIGhvc3RuYW1lIHBhcmFtZXRlciBpcyB0aGVyZSBpbiBBeGlzQ29uZmlndXJhdGlvbiAoYXhpczIueG1sKSAsCi0gICAgICogaWYgaXQgaXMgdGhlcmUgdGhlbiB0aGlzIHdpbGwgcmV0dW4gdGhhdCBhcyB0aGUgaG9zdCBuYW1lICwgby53IHdpbGwgcmV0dXJuIHRoZSBJUCBhZGRyZXNzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldElwQWRkcmVzcyhBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlndXJhdGlvbikgdGhyb3dzIFNvY2tldEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmKGF4aXNDb25maWd1cmF0aW9uIT1udWxsKXsKLSAgICAgICAgICAgIFBhcmFtZXRlciBwYXJhbSA9IGF4aXNDb25maWd1cmF0aW9uLmdldFBhcmFtZXRlcihUcmFuc3BvcnRMaXN0ZW5lci5IT1NUX0FERFJFU1MpOwotICAgICAgICAgICAgaWYgKHBhcmFtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgIGhvc3RBZGRyZXNzID0gKChTdHJpbmcpIHBhcmFtLmdldFZhbHVlKCkpLnRyaW0oKTsKLSAgICAgICAgICAgICAgICBpZihob3N0QWRkcmVzcyE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBob3N0QWRkcmVzczsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGdldElwQWRkcmVzcygpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBGaXJzdCBjaGVjayB3aGV0aGVyIHRoZSBob3N0bmFtZSBwYXJhbWV0ZXIgaXMgdGhlcmUgaW4gQXhpc0NvbmZpZ3VyYXRpb24gKGF4aXMyLnhtbCkgLAotICAgICAqIGlmIGl0IGlzIHRoZXJlIHRoZW4gdGhpcyB3aWxsIHJldHVybiB0aGF0IGFzIHRoZSBob3N0IG5hbWUgLCBvLncgd2lsbCByZXR1cm4gdGhlIElQIGFkZHJlc3MuCi0gICAgICogQHBhcmFtIGF4aXNDb25maWd1cmF0aW9uCi0gICAgICogQHJldHVybiBob3N0bmFtZSAKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRIb3N0bmFtZShBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlndXJhdGlvbikgewotICAgICAgICBpZihheGlzQ29uZmlndXJhdGlvbiE9bnVsbCl7Ci0gICAgICAgICAgICBQYXJhbWV0ZXIgcGFyYW0gPSBheGlzQ29uZmlndXJhdGlvbi5nZXRQYXJhbWV0ZXIoVHJhbnNwb3J0TGlzdGVuZXIuSE9TVF9BRERSRVNTKTsKLSAgICAgICAgICAgIGlmIChwYXJhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nICBob3N0QWRkcmVzcyA9ICgoU3RyaW5nKSBwYXJhbS5nZXRWYWx1ZSgpKS50cmltKCk7Ci0gICAgICAgICAgICAgICAgaWYoaG9zdEFkZHJlc3MhPW51bGwpewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gaG9zdEFkZHJlc3M7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9ICAgICAgCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJUChTdHJpbmcgaG9zdEFkZHJlc3MpIHsKLSAgICAgICAgcmV0dXJuIGhvc3RBZGRyZXNzLnNwbGl0KCJbLl0iKS5sZW5ndGggPT0gNDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdXRpbC9XU0RMMjBVdGlsLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdXRpbC9XU0RMMjBVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5MmE5YmEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvV1NETDIwVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi51dGlsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5XU0RMMjBEZWZhdWx0VmFsdWVIb2xkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5XU0RMMkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLnV0aWwuVVJJRW5jb2RlckRlY29kZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS53b2Rlbi53c2RsMjAuZXh0ZW5zaW9ucy5odHRwLkhUVFBMb2NhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLndvZGVuLndzZGwyMC5leHRlbnNpb25zLmh0dHAuSFRUUExvY2F0aW9uVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS53b2Rlbi53c2RsMjAuZXh0ZW5zaW9ucy5zb2FwLlNPQVBGYXVsdENvZGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS53b2Rlbi53c2RsMjAuZXh0ZW5zaW9ucy5zb2FwLlNPQVBGYXVsdFN1YmNvZGVzOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLXB1YmxpYyBjbGFzcyBXU0RMMjBVdGlsIHsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZXh0cmFjdFdTREwyMFNvYXBGYXVsdEluZm8oTWFwIG9wdGlvbnMsIE9NRWxlbWVudCBiaW5kaW5nTWVzc2FnZUVsZW1lbnQsIE9NRmFjdG9yeSBvbUZhY3RvcnksIE9NTmFtZXNwYWNlIHdzb2FwKSB7Ci0gICAgICAgIC8vIEZhdWx0IHNwZWNpZmljIHByb3BlcnRpZXMKLSAgICAgICAgU09BUEZhdWx0Q29kZSBmYXVsdENvZGUgPSAoU09BUEZhdWx0Q29kZSkgb3B0aW9ucwotICAgICAgICAgICAgICAgIC5nZXQoV1NETDJDb25zdGFudHMuQVRUUl9XU09BUF9DT0RFKTsKLSAgICAgICAgaWYgKGZhdWx0Q29kZSAhPSBudWxsICYmIGZhdWx0Q29kZS5nZXRRTmFtZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIGJpbmRpbmdNZXNzYWdlRWxlbWVudC5hZGRBdHRyaWJ1dGUob21GYWN0b3J5LmNyZWF0ZU9NQXR0cmlidXRlKAotICAgICAgICAgICAgICAgICAgICBXU0RMMkNvbnN0YW50cy5BVFRSSUJVVEVfQ09ERSwgd3NvYXAsIGZhdWx0Q29kZS5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgU09BUEZhdWx0U3ViY29kZXMgc29hcEZhdWx0U3ViY29kZXMgPSAoU09BUEZhdWx0U3ViY29kZXMpIG9wdGlvbnMKLSAgICAgICAgICAgICAgICAuZ2V0KFdTREwyQ29uc3RhbnRzLkFUVFJfV1NPQVBfU1VCQ09ERVMpOwotICAgICAgICBRTmFtZSBmYXVsdENvZGVzW107Ci0gICAgICAgIGlmIChzb2FwRmF1bHRTdWJjb2RlcyAhPSBudWxsICYmIChmYXVsdENvZGVzID0gc29hcEZhdWx0U3ViY29kZXMuZ2V0UU5hbWVzKCkpICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmF1bHRDb2Rlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGJpbmRpbmdNZXNzYWdlRWxlbWVudC5hZGRBdHRyaWJ1dGUob21GYWN0b3J5LmNyZWF0ZU9NQXR0cmlidXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgV1NETDJDb25zdGFudHMuQVRUUklCVVRFX1NVQkNPREVTLCB3c29hcCwgZmF1bHRDb2Rlc1swXS5nZXRMb2NhbFBhcnQoKSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgaXMgdXNlZCB0byByZXNvbHZlIGh0dHBsb2NhdGlvbiBwcm9wZXJ0eS4gSXQgY2hhbmdlcyB0aGUgVVJMIGFzIHN0aXB1bGF0ZWQgYnkKLSAgICAgKiB0aGUgaHR0cGxvY2F0aW9uIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHBhcmFtIG1lc3NhZ2VDb250ZXh0IC0gVGhlIE1lc3NhZ2VDb250ZXh0IG9mIHRoZSByZXF1ZXN0Ci0gICAgICogQHBhcmFtIHJhd1VSTFN0cmluZyAgIC0gVGhlIHJhdyBVUkwgY29udGFpbmluZyBodHRwbG9jYXRpb24gdGVtcGxhdGVzCi0gICAgICogQHBhcmFtIGRldGFjaCAgICAgICAgIC0gQm9vbGVhbiB2YWx1ZSBzcGVjaWZ5aW5nIHdoZXRoZXIgdGhlIGVsZW1lbnQgc2hvdWxkIGJlIGRldGFjaGVkIGZyb20gdGhlCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgIGVudmVsb3AuIFdoZW4gc2VyaWFsaXppbmcgZGF0YSBhcyBhcHBsaWNhdGlvbi94LWZvcm0tdXJsZW5jb2RlZCB3aGF0IGdvZXMgaW4gdGhlIGJvZHkgaXMgdGhlCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbmRlciBhbmQgdGhlcmVmb3JlIHdlIHNob3VsZCBkZXRhY2ggdGhlIGVsZW1lbnQgZnJvbSB0aGUgZW52ZWxvcC4KLSAgICAgKiBAcmV0dXJuIC0gU3RyaW5nIHdpdGggdGVtcGxhdGVkIHZhbHVlcyByZXBsYWNlZAotICAgICAqIEB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQgLSBUaHJvd24gaW4gY2FzZSBhbiBleGNlcHRpb24gb2NjdXJzCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgYXBwbHlVUklUZW1wbGF0aW5nKE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0LCBTdHJpbmcgcmF3VVJMU3RyaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBkZXRhY2gpIHRocm93cyBBeGlzRmF1bHQgewotCi0gICAgICAgIE9NRWxlbWVudCBmaXJzdEVsZW1lbnQ7Ci0gICAgICAgIGlmIChkZXRhY2gpIHsKLSAgICAgICAgICAgIGZpcnN0RWxlbWVudCA9IG1lc3NhZ2VDb250ZXh0LmdldEVudmVsb3BlKCkuZ2V0Qm9keSgpLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZmlyc3RFbGVtZW50ID0KLSAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUNvbnRleHQuZ2V0RW52ZWxvcGUoKS5nZXRCb2R5KCkuZ2V0Rmlyc3RFbGVtZW50KCkuY2xvbmVPTUVsZW1lbnQoKTsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgcXVlcnlQYXJhbWV0ZXJTZXBhcmF0b3IgPSAoU3RyaW5nKSBtZXNzYWdlQ29udGV4dC5nZXRQcm9wZXJ0eShXU0RMMkNvbnN0YW50cy5BVFRSX1dIVFRQX1FVRVJZX1BBUkFNRVRFUl9TRVBBUkFUT1IpOwotICAgICAgICBpZiAocXVlcnlQYXJhbWV0ZXJTZXBhcmF0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgcXVlcnlQYXJhbWV0ZXJTZXBhcmF0b3IgPSBXU0RMMjBEZWZhdWx0VmFsdWVIb2xkZXIuQVRUUl9XSFRUUF9RVUVSWV9QQVJBTUVURVJfU0VQQVJBVE9SX0RFRkFVTFQ7Ci0gICAgICAgIH0KLSAgICAgICAgSFRUUExvY2F0aW9uIGh0dHBMb2NhdGlvbiA9IG5ldyBIVFRQTG9jYXRpb24ocmF3VVJMU3RyaW5nKTsKLSAgICAgICAgSFRUUExvY2F0aW9uVGVtcGxhdGVbXSB0ZW1wbGF0ZXMgPSBodHRwTG9jYXRpb24uZ2V0VGVtcGxhdGVzKCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0ZW1wbGF0ZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIEhUVFBMb2NhdGlvblRlbXBsYXRlIHRlbXBsYXRlID0gdGVtcGxhdGVzW2ldOwotICAgICAgICAgICAgU3RyaW5nIGxvY2FsTmFtZSA9IHRlbXBsYXRlLmdldE5hbWUoKTsKLSAgICAgICAgICAgIFN0cmluZyBlbGVtZW50VmFsdWUgPSBnZXRPTUVsZW1lbnRWYWx1ZShsb2NhbE5hbWUsIGZpcnN0RWxlbWVudCk7Ci0gICAgICAgICAgICBpZiAodGVtcGxhdGUuaXNFbmNvZGVkKCkpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotCi0gICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wbGF0ZS5pc1F1ZXJ5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlLnNldFZhbHVlKFVSSUVuY29kZXJEZWNvZGVyLnF1b3RlSWxsZWdhbCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU0RMMkNvbnN0YW50cy5MRUdBTF9DSEFSQUNURVJTX0lOX1FVRVJZLnJlcGxhY2VBbGwocXVlcnlQYXJhbWV0ZXJTZXBhcmF0b3IsICIiKSkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUuc2V0VmFsdWUoVVJJRW5jb2RlckRlY29kZXIucXVvdGVJbGxlZ2FsKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50VmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdTREwyQ29uc3RhbnRzLkxFR0FMX0NIQVJBQ1RFUlNfSU5fUEFUSCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoIlVuYWJsZSB0byBlbmNvZGUgUXVlcnkgU3RyaW5nIik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRlbXBsYXRlLnNldFZhbHVlKGVsZW1lbnRWYWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gaHR0cExvY2F0aW9uLmdldEZvcm1hdHRlZExvY2F0aW9uKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgaXMgdXNlZCB0byByZXRyaXZlIGVsZW1lbnRzIGZyb20gdGhlIHNvYXAgZW52ZWxvcAotICAgICAqCi0gICAgICogQHBhcmFtIGVsZW1lbnROYW1lICAgLSBUaGUgbmFtZSBvZiB0aGUgcmVxdWlyZWQgZWxlbWVudAotICAgICAqIEBwYXJhbSBwYXJlbnRFbGVtZW50IC0gVGhlIHBhcmVudCBlbGVtZW50IHRoYXQgdGhlIHJlcXVpcmVkIGVsZW1lbnQgc2hvdWxkIGJlIHJldHJpdmVkIGZyb20KLSAgICAgKiBAcmV0dXJuIC0gVGhlIHZhbHVlIG9mIHRoZSBlbGVtZW50IGFzIGEgc3RyaW5nCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldE9NRWxlbWVudFZhbHVlKFN0cmluZyBlbGVtZW50TmFtZSwgT01FbGVtZW50IHBhcmVudEVsZW1lbnQpIHsKLQotICAgICAgICBPTUVsZW1lbnQgaHR0cFVSTFBhcmFtID0gbnVsbDsKLSAgICAgICAgSXRlcmF0b3IgY2hpbGRyZW4gPSBwYXJlbnRFbGVtZW50LmdldENoaWxkRWxlbWVudHMoKTsKLQotICAgICAgICB3aGlsZSAoY2hpbGRyZW4uaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgY2hpbGQgPSAoT01FbGVtZW50KSBjaGlsZHJlbi5uZXh0KCk7Ci0gICAgICAgICAgICBRTmFtZSBxTmFtZSA9IGNoaWxkLmdldFFOYW1lKCk7Ci0gICAgICAgICAgICBpZiAoZWxlbWVudE5hbWUuZXF1YWxzKHFOYW1lLmdldExvY2FsUGFydCgpKSkgewotICAgICAgICAgICAgICAgIGh0dHBVUkxQYXJhbSA9IGNoaWxkOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGh0dHBVUkxQYXJhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBodHRwVVJMUGFyYW0uZGV0YWNoKCk7Ci0KLSAgICAgICAgICAgIGlmIChwYXJlbnRFbGVtZW50LmdldEZpcnN0T01DaGlsZCgpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBwYXJlbnRFbGVtZW50LmRldGFjaCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGh0dHBVUkxQYXJhbS5nZXRUZXh0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuICIiOwotCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdXRpbC9XU0RMU2VyaWFsaXphdGlvblV0aWwuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi91dGlsL1dTRExTZXJpYWxpemF0aW9uVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTFlNTQ5Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi91dGlsL1dTRExTZXJpYWxpemF0aW9uVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTk1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01OYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5vZGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkFkZHJlc3NpbmdDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzTWVzc2FnZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlBvbGljeVN1YmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5XU0RMMkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLmphdmEyd3NkbC5KYXZhMldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0NvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5uYW1lc3BhY2UuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5IVFRQSGVhZGVyTWVzc2FnZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuU09BUEhlYWRlck1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLlNPQVBNb2R1bGVNZXNzYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUubmVldGhpLlBvbGljeTsKLWltcG9ydCBvcmcuYXBhY2hlLm5lZXRoaS5Qb2xpY3lSZWZlcmVuY2U7Ci0KLS8qKgotICogSGVscHMgdGhlIEF4aXNTZXJ2aWNlIHRvIFdTREwgcHJvY2VzcwotICovCi1wdWJsaWMgY2xhc3MgV1NETFNlcmlhbGl6YXRpb25VdGlsIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENEQVRBX1NUQVJUID0gIjwhW0NEQVRBWyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0RBVEFfU1RBUlRfUkVHRVggPSAiPCFcXFtDREFUQVxcWyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0RBVEFfRU5EID0gIl1dPiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0RBVEFfRU5EX1JFR0VYID0gIlxcXVxcXT4iOwotCi0gICAgLyoqCi0gICAgICogR2l2ZW4gYSBuYW1lc3BhY2UgaXQgcmV0dXJucyB0aGUgcHJlZml4IGZvciB0aGF0IG5hbWVzcGFjZQotICAgICAqIEBwYXJhbSBuYW1lc3BhY2UgLSBUaGUgbmFtZXNwYWNlIHRoYXQgdGhlIHByZWZpeCBpcyBuZWVkZWQgZm9yCi0gICAgICogQHBhcmFtIG5hbWVTcGFjZU1hcCAtIFRoZSBuYW1lc3BhY2VNYXAKLSAgICAgKiBAcmV0dXJuIC0gVGhlIHByZWZpeCBvZiB0aGUgbmFtZXNwYWNlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UHJlZml4KFN0cmluZyBuYW1lc3BhY2UsIE1hcDxTdHJpbmcsIFN0cmluZz4gbmFtZVNwYWNlTWFwKSB7Ci0gICAgICAgIFNldDxTdHJpbmc+IGtleVNldDsKLSAgICAgICAgaWYgKG5hbWVTcGFjZU1hcCAhPSBudWxsICYmIChrZXlTZXQgPSBuYW1lU3BhY2VNYXAua2V5U2V0KCkpICE9IG51bGwpIHsKLSAgICAgICAgICAgIEl0ZXJhdG9yPFN0cmluZz4ga2V5cyA9IGtleVNldC5pdGVyYXRvcigpOwotICAgICAgICAgICAgd2hpbGUgKGtleXMuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9IChTdHJpbmcpIGtleXMubmV4dCgpOwotICAgICAgICAgICAgICAgIGlmIChuYW1lU3BhY2VNYXAuZ2V0KGtleSkuZXF1YWxzKG5hbWVzcGFjZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGtleTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgY29ycmVjdCBlbGVtZW50IG5hbWUgZm9yIGEgZ2l2ZW4gbWVzc2FnZQotICAgICAqIEBwYXJhbSBheGlzTWVzc2FnZSAtIFRoZSBheGlzTWVzc2FnZQotICAgICAqIEBwYXJhbSBuYW1lU3BhY2VNYXAgLSBUaGUgbmFtZXNwYWNlTWFwCi0gICAgICogQHJldHVybiAtIFRoZSBlbGVtZW50IG5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRFbGVtZW50TmFtZShBeGlzTWVzc2FnZSBheGlzTWVzc2FnZSwgTWFwIG5hbWVTcGFjZU1hcCkgewotICAgICAgICBRTmFtZSBlbGVtZW50UU5hbWUgPSBheGlzTWVzc2FnZS5nZXRFbGVtZW50UU5hbWUoKTsKLSAgICAgICAgaWYgKGVsZW1lbnRRTmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gV1NETDJDb25zdGFudHMuTk1UT0tFTl9OT05FOwotICAgICAgICB9IGVsc2UgaWYgKENvbnN0YW50cy5YU0RfQU5ZLmVxdWFscyhlbGVtZW50UU5hbWUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gV1NETDJDb25zdGFudHMuTk1UT0tFTl9BTlk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0KLSAgICAgICAgICAgICAgICAgICAgV1NETFNlcmlhbGl6YXRpb25VdGlsLmdldFByZWZpeChlbGVtZW50UU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCksIG5hbWVTcGFjZU1hcCk7Ci0gICAgICAgICAgICByZXR1cm4gcHJlZml4ICsgIjoiICsgZWxlbWVudFFOYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIHNvYXAgaGVhZGVyIGVsZW1lbnQgdG8gYSBnaXZlbiBPTUVsZW1lbnQKLSAgICAgKiBAcGFyYW0gb21GYWN0b3J5IC0gQW4gT01GYWN0b3J5Ci0gICAgICogQHBhcmFtIGxpc3QgLSBUaGUgYXJyYXlsaXN0IG9mIHNvYXBIZWFkZXJNZXNzYWdlcwotICAgICAqIEBwYXJhbSB3c29hcCAtIFRoZSBXU0RMIDIuMCBTT0FQIG5hbWVzcGFjZQotICAgICAqIEBwYXJhbSBlbGVtZW50IC0gVGhlIGVsZW1lbnQgdGhhdCB0aGUgaGVhZGVyIHNob3VsZCBiZSBhZGRlZCB0bwotICAgICAqIEBwYXJhbSBuYW1lU3BhY2VNYXAgLSBUaGUgbmFtZXNwYWNlTWFwCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZFNPQVBIZWFkZXJFbGVtZW50cyhPTUZhY3Rvcnkgb21GYWN0b3J5LCBBcnJheUxpc3QgbGlzdCwgT01OYW1lc3BhY2Ugd3NvYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTUVsZW1lbnQgZWxlbWVudCwgTWFwIG5hbWVTcGFjZU1hcCkgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIFNPQVBIZWFkZXJNZXNzYWdlIHNvYXBIZWFkZXJNZXNzYWdlID0gKFNPQVBIZWFkZXJNZXNzYWdlKSBsaXN0LmdldChpKTsKLSAgICAgICAgICAgIE9NRWxlbWVudCBzb2FwSGVhZGVyRWxlbWVudCA9Ci0gICAgICAgICAgICAgICAgICAgIG9tRmFjdG9yeS5jcmVhdGVPTUVsZW1lbnQoV1NETDJDb25zdGFudHMuQVRUUklCVVRFX0hFQURFUiwgd3NvYXApOwotICAgICAgICAgICAgUU5hbWUgcU5hbWUgPSBzb2FwSGVhZGVyTWVzc2FnZS5nZXRFbGVtZW50KCk7Ci0gICAgICAgICAgICBzb2FwSGVhZGVyRWxlbWVudC5hZGRBdHRyaWJ1dGUob21GYWN0b3J5LmNyZWF0ZU9NQXR0cmlidXRlKAotICAgICAgICAgICAgICAgICAgICBXU0RMMkNvbnN0YW50cy5BVFRSSUJVVEVfRUxFTUVOVCwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgZ2V0UHJlZml4KHFOYW1lLmdldE5hbWVzcGFjZVVSSSgpLCBuYW1lU3BhY2VNYXApICsgIjoiICsgcU5hbWUuZ2V0TG9jYWxQYXJ0KCkpKTsKLSAgICAgICAgICAgIHNvYXBIZWFkZXJFbGVtZW50LmFkZEF0dHJpYnV0ZShvbUZhY3RvcnkuY3JlYXRlT01BdHRyaWJ1dGUoCi0gICAgICAgICAgICAgICAgICAgIFdTREwyQ29uc3RhbnRzLkFUVFJJQlVURV9NVVNUX1VOREVSU1RBTkQsIG51bGwsCi0gICAgICAgICAgICAgICAgICAgIEJvb2xlYW4udG9TdHJpbmcoc29hcEhlYWRlck1lc3NhZ2UuaXNNdXN0VW5kZXJzdGFuZCgpKSkpOwotICAgICAgICAgICAgc29hcEhlYWRlckVsZW1lbnQuYWRkQXR0cmlidXRlKG9tRmFjdG9yeS5jcmVhdGVPTUF0dHJpYnV0ZSgKLSAgICAgICAgICAgICAgICAgICAgV1NETDJDb25zdGFudHMuQVRUUklCVVRFX1JFUVVJUkVELCBudWxsLAotICAgICAgICAgICAgICAgICAgICBCb29sZWFuLnRvU3RyaW5nKHNvYXBIZWFkZXJNZXNzYWdlLmlzUmVxdWlyZWQoKSkpKTsKLSAgICAgICAgICAgIGVsZW1lbnQuYWRkQ2hpbGQoc29hcEhlYWRlckVsZW1lbnQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIHNvYXAgbW9kdWxlIGVsZW1lbnQgdG8gYSBnaXZlbiBPTUVsZW1lbnQKLSAgICAgKiBAcGFyYW0gb21GYWN0b3J5IC0gQW4gT01GYWN0b3J5Ci0gICAgICogQHBhcmFtIGxpc3QgLSBUaGUgYXJyYXlsaXN0IG9mIHNvYXBNb2R1bGVNZXNzYWdlcwotICAgICAqIEBwYXJhbSB3c29hcCAtIFRoZSBXU0RMIDIuMCBTT0FQIG5hbWVzcGFjZQotICAgICAqIEBwYXJhbSBlbGVtZW50IC0gVGhlIGVsZW1lbnQgdGhhdCB0aGUgaGVhZGVyIHNob3VsZCBiZSBhZGRlZCB0bwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRTT0FQTW9kdWxlRWxlbWVudHMoT01GYWN0b3J5IG9tRmFjdG9yeSwgQXJyYXlMaXN0IGxpc3QsIE9NTmFtZXNwYWNlIHdzb2FwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01FbGVtZW50IGVsZW1lbnQpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBTT0FQTW9kdWxlTWVzc2FnZSBzb2FwTW9kdWxlTWVzc2FnZSA9IChTT0FQTW9kdWxlTWVzc2FnZSkgbGlzdC5nZXQoaSk7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgc29hcE1vZHVsZUVsZW1lbnQgPQotICAgICAgICAgICAgICAgICAgICBvbUZhY3RvcnkuY3JlYXRlT01FbGVtZW50KFdTREwyQ29uc3RhbnRzLkFUVFJJQlVURV9NT0RVTEUsIHdzb2FwKTsKLSAgICAgICAgICAgIHNvYXBNb2R1bGVFbGVtZW50LmFkZEF0dHJpYnV0ZShvbUZhY3RvcnkuY3JlYXRlT01BdHRyaWJ1dGUoCi0gICAgICAgICAgICAgICAgICAgIFdTREwyQ29uc3RhbnRzLkFUVFJJQlVURV9SRUYsIG51bGwsIHNvYXBNb2R1bGVNZXNzYWdlLmdldFVyaSgpKSk7Ci0gICAgICAgICAgICBlbGVtZW50LmFkZENoaWxkKHNvYXBNb2R1bGVFbGVtZW50KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSBIVFRQIGhlYWRlciBlbGVtZW50IHRvIGEgZ2l2ZW4gT01FbGVtZW50Ci0gICAgICogQHBhcmFtIG9tRmFjdG9yeSAtIEFuIE9NRmFjdG9yeQotICAgICAqIEBwYXJhbSBsaXN0IC0gVGhlIGFycmF5bGlzdCBvZiBIVFRQSGVhZGVyTWVzc2FnZXMKLSAgICAgKiBAcGFyYW0gd2h0dHAgLSBUaGUgV1NETCAyLjAgSFRUUCBuYW1lc3BhY2UKLSAgICAgKiBAcGFyYW0gZWxlbWVudCAtIFRoZSBlbGVtZW50IHRoYXQgdGhlIGhlYWRlciBzaG91bGQgYmUgYWRkZWQgdG8KLSAgICAgKiBAcGFyYW0gbmFtZVNwYWNlTWFwIC0gVGhlIG5hbWVzcGFjZU1hcAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRIVFRQSGVhZGVyRWxlbWVudHMoT01GYWN0b3J5IG9tRmFjdG9yeSwgQXJyYXlMaXN0IGxpc3QsIE9NTmFtZXNwYWNlIHdodHRwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01FbGVtZW50IGVsZW1lbnQsIE1hcCBuYW1lU3BhY2VNYXApIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBIVFRQSGVhZGVyTWVzc2FnZSBodHRwSGVhZGVyTWVzc2FnZSA9IChIVFRQSGVhZGVyTWVzc2FnZSkgbGlzdC5nZXQoaSk7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgaHR0cEhlYWRlckVsZW1lbnQgPQotICAgICAgICAgICAgICAgICAgICBvbUZhY3RvcnkuY3JlYXRlT01FbGVtZW50KFdTREwyQ29uc3RhbnRzLkFUVFJJQlVURV9IRUFERVIsIHdodHRwKTsKLSAgICAgICAgICAgIGh0dHBIZWFkZXJFbGVtZW50LmFkZEF0dHJpYnV0ZShvbUZhY3RvcnkuY3JlYXRlT01BdHRyaWJ1dGUoCi0gICAgICAgICAgICAgICAgICAgIFdTREwyQ29uc3RhbnRzLkFUVFJJQlVURV9OQU1FLCBudWxsLCBodHRwSGVhZGVyTWVzc2FnZS5nZXROYW1lKCkpKTsKLSAgICAgICAgICAgIFFOYW1lIHFOYW1lID0gaHR0cEhlYWRlck1lc3NhZ2UuZ2V0cU5hbWUoKTsKLSAgICAgICAgICAgIGh0dHBIZWFkZXJFbGVtZW50LmFkZEF0dHJpYnV0ZShvbUZhY3RvcnkuY3JlYXRlT01BdHRyaWJ1dGUoCi0gICAgICAgICAgICAgICAgICAgIFdTREwyQ29uc3RhbnRzLkFUVFJJQlVURV9UWVBFLCBudWxsLAotICAgICAgICAgICAgICAgICAgICBnZXRQcmVmaXgocU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCksIG5hbWVTcGFjZU1hcCkgKyAiOiIgKyBxTmFtZS5nZXRMb2NhbFBhcnQoKSkpOwotICAgICAgICAgICAgaHR0cEhlYWRlckVsZW1lbnQuYWRkQXR0cmlidXRlKG9tRmFjdG9yeS5jcmVhdGVPTUF0dHJpYnV0ZSgKLSAgICAgICAgICAgICAgICAgICAgV1NETDJDb25zdGFudHMuQVRUUklCVVRFX1JFUVVJUkVELCBudWxsLAotICAgICAgICAgICAgICAgICAgICBCb29sZWFuLnZhbHVlT2YoaHR0cEhlYWRlck1lc3NhZ2UuaXNSZXF1aXJlZCgpKS50b1N0cmluZygpKSk7Ci0gICAgICAgICAgICBlbGVtZW50LmFkZENoaWxkKGh0dHBIZWFkZXJFbGVtZW50KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdlbmVyYXRlcyBhIGRlZmF1bHQgU09BUCAxMSBCaW5kaW5nIGZvciBhIGdpdmVuIEF4aXNTZXJ2aWNlCi0gICAgICogQHBhcmFtIGZhYyAtIFRoZSBPTUZhY3RvcnkKLSAgICAgKiBAcGFyYW0gYXhpc1NlcnZpY2UgLSBUaGUgQXhpc1NlcnZpY2UKLSAgICAgKiBAcGFyYW0gd3NkbCB0aGUgV1NETCBuYW1lc3BhY2UKLSAgICAgKiBAcGFyYW0gd3NvYXAgLSBUaGUgV1NETCAyLjAgU09BUCBuYW1lc3BhY2UKLSAgICAgKiBAcGFyYW0gdG5zIC0gVGhlIHRhcmdldCBuYW1lc3BhY2UKLSAgICAgKiBAcmV0dXJuIC0gVGhlIGdlbmVyYXRlZCBTT0FQMTFCaW5kaW5nIGVsZW1lbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE9NRWxlbWVudCBnZW5lcmF0ZVNPQVAxMUJpbmRpbmcoT01GYWN0b3J5IGZhYywgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NTmFtZXNwYWNlIHdzZGwsIE9NTmFtZXNwYWNlIHdzb2FwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTU5hbWVzcGFjZSB0bnMsIFN0cmluZyBzZXJ2aWNlTmFtZSkgewotICAgICAgICBPTUVsZW1lbnQgYmluZGluZyA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoV1NETDJDb25zdGFudHMuQklORElOR19MT0NBTF9OQU1FLCB3c2RsKTsKLSAgICAgICAgYmluZGluZy5hZGRBdHRyaWJ1dGUoCi0gICAgICAgICAgICAgICAgZmFjLmNyZWF0ZU9NQXR0cmlidXRlKFdTREwyQ29uc3RhbnRzLkFUVFJJQlVURV9OQU1FLCBudWxsLCBzZXJ2aWNlTmFtZSArCi0gICAgICAgICAgICAgICAgICAgICAgICBKYXZhMldTRExDb25zdGFudHMuQklORElOR19OQU1FX1NVRkZJWCkpOwotICAgICAgICBiaW5kaW5nLmFkZEF0dHJpYnV0ZShmYWMuY3JlYXRlT01BdHRyaWJ1dGUoV1NETDJDb25zdGFudHMuSU5URVJGQUNFX0xPQ0FMX05BTUUsIG51bGwsIHRucwotICAgICAgICAgICAgICAgIC5nZXRQcmVmaXgoKSArICI6IiArIFdTREwyQ29uc3RhbnRzLkRFRkFVTFRfSU5URVJGQUNFX05BTUUpKTsKLQotICAgICAgICBiaW5kaW5nLmFkZEF0dHJpYnV0ZShmYWMuY3JlYXRlT01BdHRyaWJ1dGUoV1NETDJDb25zdGFudHMuQVRUUklCVVRFX1RZUEUsIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU0RMMkNvbnN0YW50cy5VUklfV1NETDJfU09BUCkpOwotICAgICAgICBiaW5kaW5nLmFkZEF0dHJpYnV0ZShmYWMuY3JlYXRlT01BdHRyaWJ1dGUoV1NETDJDb25zdGFudHMuQVRUUklCVVRFX1ZFUlNJT04sIHdzb2FwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NETDJDb25zdGFudHMuU09BUF9WRVJTSU9OXzFfMSkpOwotICAgICAgICBiaW5kaW5nLmFkZEF0dHJpYnV0ZShmYWMuY3JlYXRlT01BdHRyaWJ1dGUoV1NETDJDb25zdGFudHMuQVRUUklCVVRFX1BST1RPQ09MLCB3c29hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NETDJDb25zdGFudHMuSFRUUF9QUk9UT0NBTCkpOwotICAgICAgICBnZW5lcmF0ZURlZmF1bHRTT0FQQmluZGluZ09wZXJhdGlvbnMoYXhpc1NlcnZpY2UsIGZhYywgYmluZGluZywgd3NkbCwgdG5zLCB3c29hcCk7Ci0gICAgICAgIHJldHVybiBiaW5kaW5nOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdlbmVyYXRlcyBhIGRlZmF1bHQgU09BUCAxMiBCaW5kaW5nIGZvciBhIGdpdmVuIEF4aXNTZXJ2aWNlCi0gICAgICogQHBhcmFtIGZhYyAtIFRoZSBPTUZhY3RvcnkKLSAgICAgKiBAcGFyYW0gYXhpc1NlcnZpY2UgLSBUaGUgQXhpc1NlcnZpY2UKLSAgICAgKiBAcGFyYW0gd3NkbCB0aGUgV1NETCBuYW1lc3BhY2UKLSAgICAgKiBAcGFyYW0gd3NvYXAgLSBUaGUgV1NETCAyLjAgU09BUCBuYW1lc3BhY2UKLSAgICAgKiBAcGFyYW0gdG5zIC0gVGhlIHRhcmdldCBuYW1lc3BhY2UKLSAgICAgKiBAcmV0dXJuIC0gVGhlIGdlbmVyYXRlZCBTT0FQMTJCaW5kaW5nIGVsZW1lbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE9NRWxlbWVudCBnZW5lcmF0ZVNPQVAxMkJpbmRpbmcoT01GYWN0b3J5IGZhYywgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NTmFtZXNwYWNlIHdzZGwsIE9NTmFtZXNwYWNlIHdzb2FwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTU5hbWVzcGFjZSB0bnMsIFN0cmluZyBzZXJ2aWNlTmFtZSkgewotICAgICAgICBPTUVsZW1lbnQgYmluZGluZyA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoV1NETDJDb25zdGFudHMuQklORElOR19MT0NBTF9OQU1FLCB3c2RsKTsKLSAgICAgICAgYmluZGluZy5hZGRBdHRyaWJ1dGUoCi0gICAgICAgICAgICAgICAgZmFjLmNyZWF0ZU9NQXR0cmlidXRlKFdTREwyQ29uc3RhbnRzLkFUVFJJQlVURV9OQU1FLCBudWxsLCBzZXJ2aWNlTmFtZSArCi0gICAgICAgICAgICAgICAgICAgICAgICBKYXZhMldTRExDb25zdGFudHMuU09BUDEyQklORElOR19OQU1FX1NVRkZJWCkpOwotICAgICAgICBiaW5kaW5nLmFkZEF0dHJpYnV0ZShmYWMuY3JlYXRlT01BdHRyaWJ1dGUoV1NETDJDb25zdGFudHMuSU5URVJGQUNFX0xPQ0FMX05BTUUsIG51bGwsIHRucwotICAgICAgICAgICAgICAgIC5nZXRQcmVmaXgoKSArICI6IiArIFdTREwyQ29uc3RhbnRzLkRFRkFVTFRfSU5URVJGQUNFX05BTUUpKTsKLQotICAgICAgICBiaW5kaW5nLmFkZEF0dHJpYnV0ZShmYWMuY3JlYXRlT01BdHRyaWJ1dGUoV1NETDJDb25zdGFudHMuQVRUUklCVVRFX1RZUEUsIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU0RMMkNvbnN0YW50cy5VUklfV1NETDJfU09BUCkpOwotICAgICAgICBiaW5kaW5nLmFkZEF0dHJpYnV0ZShmYWMuY3JlYXRlT01BdHRyaWJ1dGUoV1NETDJDb25zdGFudHMuQVRUUklCVVRFX1ZFUlNJT04sIHdzb2FwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NETDJDb25zdGFudHMuU09BUF9WRVJTSU9OXzFfMikpOwotICAgICAgICBiaW5kaW5nLmFkZEF0dHJpYnV0ZShmYWMuY3JlYXRlT01BdHRyaWJ1dGUoV1NETDJDb25zdGFudHMuQVRUUklCVVRFX1BST1RPQ09MLCB3c29hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NETDJDb25zdGFudHMuSFRUUF9QUk9UT0NBTCkpOwotICAgICAgICBnZW5lcmF0ZURlZmF1bHRTT0FQQmluZGluZ09wZXJhdGlvbnMoYXhpc1NlcnZpY2UsIGZhYywgYmluZGluZywgd3NkbCwgdG5zLCB3c29hcCk7Ci0gICAgICAgIHJldHVybiBiaW5kaW5nOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdlbmVyYXRlcyBhIGRlZmF1bHQgSFRUUCBCaW5kaW5nIGZvciBhIGdpdmVuIEF4aXNTZXJ2aWNlCi0gICAgICogQHBhcmFtIGZhYyAtIFRoZSBPTUZhY3RvcnkKLSAgICAgKiBAcGFyYW0gYXhpc1NlcnZpY2UgLSBUaGUgQXhpc1NlcnZpY2UKLSAgICAgKiBAcGFyYW0gd3NkbCB0aGUgV1NETCBuYW1lc3BhY2UKLSAgICAgKiBAcGFyYW0gd2h0dHAgLSBUaGUgV1NETCAyLjAgSFRUUCBuYW1lc3BhY2UKLSAgICAgKiBAcGFyYW0gdG5zIC0gVGhlIHRhcmdldCBuYW1lc3BhY2UKLSAgICAgKiBAcmV0dXJuIC0gVGhlIGdlbmVyYXRlZCBIVFRQQmluZGluZyBlbGVtZW50Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBPTUVsZW1lbnQgZ2VuZXJhdGVIVFRQQmluZGluZyhPTUZhY3RvcnkgZmFjLCBBeGlzU2VydmljZSBheGlzU2VydmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NTmFtZXNwYWNlIHdzZGwsIE9NTmFtZXNwYWNlIHdodHRwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01OYW1lc3BhY2UgdG5zLCBTdHJpbmcgc2VydmljZU5hbWUpIHsKLSAgICAgICAgT01FbGVtZW50IGJpbmRpbmcgPSBmYWMuY3JlYXRlT01FbGVtZW50KFdTREwyQ29uc3RhbnRzLkJJTkRJTkdfTE9DQUxfTkFNRSwgd3NkbCk7Ci0gICAgICAgIGJpbmRpbmcuYWRkQXR0cmlidXRlKAotICAgICAgICAgICAgICAgIGZhYy5jcmVhdGVPTUF0dHJpYnV0ZShXU0RMMkNvbnN0YW50cy5BVFRSSUJVVEVfTkFNRSwgbnVsbCwgc2VydmljZU5hbWUgKwotICAgICAgICAgICAgICAgICAgICAgICAgSmF2YTJXU0RMQ29uc3RhbnRzLkhUVFBfQklORElORykpOwotICAgICAgICBiaW5kaW5nLmFkZEF0dHJpYnV0ZShmYWMuY3JlYXRlT01BdHRyaWJ1dGUoV1NETDJDb25zdGFudHMuSU5URVJGQUNFX0xPQ0FMX05BTUUsIG51bGwsIHRucwotICAgICAgICAgICAgICAgIC5nZXRQcmVmaXgoKSArICI6IiArIFdTREwyQ29uc3RhbnRzLkRFRkFVTFRfSU5URVJGQUNFX05BTUUpKTsKLQotICAgICAgICBiaW5kaW5nLmFkZEF0dHJpYnV0ZShmYWMuY3JlYXRlT01BdHRyaWJ1dGUoV1NETDJDb25zdGFudHMuQVRUUklCVVRFX1RZUEUsIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU0RMMkNvbnN0YW50cy5VUklfV1NETDJfSFRUUCkpOwotICAgICAgICBJdGVyYXRvciBpdGVyYXRvciA9IGF4aXNTZXJ2aWNlLmdldENoaWxkcmVuKCk7Ci0gICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIEF4aXNPcGVyYXRpb24gYXhpc09wZXJhdGlvbiA9IChBeGlzT3BlcmF0aW9uKSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgb3BFbGVtZW50ID0gZmFjLmNyZWF0ZU9NRWxlbWVudChXU0RMMkNvbnN0YW50cy5PUEVSQVRJT05fTE9DQUxfTkFNRSwgd3NkbCk7Ci0gICAgICAgICAgICBiaW5kaW5nLmFkZENoaWxkKG9wRWxlbWVudCk7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGF4aXNPcGVyYXRpb24uZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgb3BFbGVtZW50LmFkZEF0dHJpYnV0ZShmYWMuY3JlYXRlT01BdHRyaWJ1dGUoV1NETDJDb25zdGFudHMuQVRUUklCVVRFX1JFRiwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRucy5nZXRQcmVmaXgoKSArICI6IiArIG5hbWUpKTsKLSAgICAgICAgICAgIG9wRWxlbWVudC5hZGRBdHRyaWJ1dGUoZmFjLmNyZWF0ZU9NQXR0cmlidXRlKFdTREwyQ29uc3RhbnRzLkFUVFJJQlVURV9MT0NBVElPTiwgd2h0dHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJpbmRpbmc7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBnZW5lcmF0ZURlZmF1bHRTT0FQQmluZGluZ09wZXJhdGlvbnMoQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01GYWN0b3J5IG9tRmFjdG9yeSwgT01FbGVtZW50IGJpbmRpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01OYW1lc3BhY2Ugd3NkbCwgT01OYW1lc3BhY2UgdG5zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NTmFtZXNwYWNlIHdzb2FwKSB7Ci0gICAgICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gYXhpc1NlcnZpY2UuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uID0gKEF4aXNPcGVyYXRpb24pIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgIGlmIChheGlzT3BlcmF0aW9uLmlzQ29udHJvbE9wZXJhdGlvbigpKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBPTUVsZW1lbnQgb3BFbGVtZW50ID0gb21GYWN0b3J5LmNyZWF0ZU9NRWxlbWVudChXU0RMMkNvbnN0YW50cy5PUEVSQVRJT05fTE9DQUxfTkFNRSwgd3NkbCk7Ci0gICAgICAgICAgICBiaW5kaW5nLmFkZENoaWxkKG9wRWxlbWVudCk7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGF4aXNPcGVyYXRpb24uZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgb3BFbGVtZW50LmFkZEF0dHJpYnV0ZShvbUZhY3RvcnkuY3JlYXRlT01BdHRyaWJ1dGUoV1NETDJDb25zdGFudHMuQVRUUklCVVRFX1JFRiwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRucy5nZXRQcmVmaXgoKSArICI6IiArIG5hbWUpKTsKLSAgICAgICAgICAgIFN0cmluZyBzb2FwQWN0aW9uID0gYXhpc09wZXJhdGlvbi5nZXRTb2FwQWN0aW9uKCk7Ci0gICAgICAgICAgICBpZiAoc29hcEFjdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgb3BFbGVtZW50LmFkZEF0dHJpYnV0ZShvbUZhY3RvcnkuY3JlYXRlT01BdHRyaWJ1dGUoV1NETDJDb25zdGFudHMuQVRUUklCVVRFX0FDVElPTiwgd3NvYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICBzb2FwQWN0aW9uKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZW5lcmF0ZXMgYSBkZWZhdWx0IHNlcnZpY2UgZWxlbWVudAotICAgICAqIEBwYXJhbSBvbUZhY3RvcnkgLSBUaGUgT01GYWN0b3J5Ci0gICAgICogQHBhcmFtIHdzZGwgdGhlIFdTREwgbmFtZXNwYWNlCi0gICAgICogQHBhcmFtIHRucyAtIFRoZSB0YXJnZXRuYW1lc3BhY2UKLSAgICAgKiBAcGFyYW0gYXhpc1NlcnZpY2UgLSBUaGUgQXhpc1NlcnZpY2UKLSAgICAgKiBAcGFyYW0gZGlzYWJsZVJFU1Qgb25seSBnZW5lcmF0ZSBSRVNUIGVuZHBvaW50IGlmIHRoaXMgaXMgZmFsc2UKLSAgICAgKiBAcGFyYW0gZGlzYWJsZVNPQVAxMiBvbmx5IGdlbmVyYXRlIFNPQVAgMS4yIGVuZHBvaW50IGlmIHRoaXMgaXMgZmFsc2UKLSAgICAgKiBAcmV0dXJuIC0gVGhlIGdlbmVyYXRlZCBzZXJ2aWNlIGVsZW1lbnQKLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdCAtIFRocm93biBpbiBjYXNlIGFuIGV4Y2VwdGlvbiBvY2N1cnMKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE9NRWxlbWVudCBnZW5lcmF0ZVNlcnZpY2VFbGVtZW50KE9NRmFjdG9yeSBvbUZhY3RvcnksIE9NTmFtZXNwYWNlIHdzZGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTU5hbWVzcGFjZSB0bnMsIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBkaXNhYmxlUkVTVCwgYm9vbGVhbiBkaXNhYmxlU09BUDEyLCAgYm9vbGVhbiBkaXNhYmxlU09BUDExLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNlcnZpY2VOYW1lKQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIHJldHVybiBnZW5lcmF0ZVNlcnZpY2VFbGVtZW50KG9tRmFjdG9yeSwgd3NkbCwgdG5zLCBheGlzU2VydmljZSwgZGlzYWJsZVJFU1QsIGRpc2FibGVTT0FQMTIsZGlzYWJsZVNPQVAxMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgc2VydmljZU5hbWUpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBHZW5lcmF0ZXMgYSBkZWZhdWx0IHNlcnZpY2UgZWxlbWVudAotICAgICAqIEBwYXJhbSBvbUZhY3RvcnkgLSBUaGUgT01GYWN0b3J5Ci0gICAgICogQHBhcmFtIHdzZGwgdGhlIFdTREwgbmFtZXNwYWNlCi0gICAgICogQHBhcmFtIHRucyAtIFRoZSB0YXJnZXRuYW1lc3BhY2UKLSAgICAgKiBAcGFyYW0gYXhpc1NlcnZpY2UgLSBUaGUgQXhpc1NlcnZpY2UKLSAgICAgKiBAcGFyYW0gZGlzYWJsZVJFU1Qgb25seSBnZW5lcmF0ZSBSRVNUIGVuZHBvaW50IGlmIHRoaXMgaXMgZmFsc2UKLSAgICAgKiBAcGFyYW0gZGlzYWJsZVNPQVAxMiBvbmx5IGdlbmVyYXRlIFNPQVAgMS4yIGVuZHBvaW50IGlmIHRoaXMgaXMgZmFsc2UKLSAgICAgKiBAcmV0dXJuIC0gVGhlIGdlbmVyYXRlZCBzZXJ2aWNlIGVsZW1lbnQKLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdCAtIFRocm93biBpbiBjYXNlIGFuIGV4Y2VwdGlvbiBvY2N1cnMKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE9NRWxlbWVudCBnZW5lcmF0ZVNlcnZpY2VFbGVtZW50KE9NRmFjdG9yeSBvbUZhY3RvcnksIE9NTmFtZXNwYWNlIHdzZGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTU5hbWVzcGFjZSB0bnMsIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBkaXNhYmxlUkVTVCwgYm9vbGVhbiBkaXNhYmxlU09BUDEyLCBib29sZWFuIGRpc2FibGVTT0FQMTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSBlcHJzLCBTdHJpbmcgc2VydmljZU5hbWUpCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgaWYoZXBycyA9PSBudWxsKXsKLSAgICAgICAgICAgIGVwcnMgPSBheGlzU2VydmljZS5nZXRFUFJzKCk7Ci0gICAgICAgICAgICBpZiAoZXBycyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZXBycyA9IG5ldyBTdHJpbmdbXXtzZXJ2aWNlTmFtZX07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgT01FbGVtZW50IHNlcnZpY2VFbGVtZW50OwotICAgICAgICBzZXJ2aWNlRWxlbWVudCA9IG9tRmFjdG9yeS5jcmVhdGVPTUVsZW1lbnQoV1NETDJDb25zdGFudHMuU0VSVklDRV9MT0NBTF9OQU1FLCB3c2RsKTsKLSAgICAgICAgICAgICAgICAgICAgc2VydmljZUVsZW1lbnQuYWRkQXR0cmlidXRlKG9tRmFjdG9yeS5jcmVhdGVPTUF0dHJpYnV0ZShXU0RMMkNvbnN0YW50cy5BVFRSSUJVVEVfTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBzZXJ2aWNlTmFtZSkpOwotICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlRWxlbWVudC5hZGRBdHRyaWJ1dGUob21GYWN0b3J5LmNyZWF0ZU9NQXR0cmlidXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdTREwyQ29uc3RhbnRzLklOVEVSRkFDRV9MT0NBTF9OQU1FLCBudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRucy5nZXRQcmVmaXgoKSArICI6IiArIFdTREwyQ29uc3RhbnRzLkRFRkFVTFRfSU5URVJGQUNFX05BTUUpKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlcHJzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9ICIiOwotICAgICAgICAgICAgU3RyaW5nIGVwciA9IGVwcnNbaV07Ci0gICAgICAgICAgICBpZiAoZXByLnN0YXJ0c1dpdGgoImh0dHBzOi8vIikpIHsKLSAgICAgICAgICAgICAgICBuYW1lID0gV1NETDJDb25zdGFudHMuREVGQVVMVF9IVFRQU19QUkVGSVg7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIE9NRWxlbWVudCBzb2FwMTFFbmRwb2ludEVsZW1lbnQgPQotICAgICAgICAgICAgICAgICAgICBudWxsOwotICAgICAgICAgICAgaWYgKCFkaXNhYmxlU09BUDExKSB7Ci0gICAgICAgICAgICAgICAgc29hcDExRW5kcG9pbnRFbGVtZW50ID0gb21GYWN0b3J5LmNyZWF0ZU9NRWxlbWVudChXU0RMMkNvbnN0YW50cy5FTkRQT0lOVF9MT0NBTF9OQU1FLCB3c2RsKTsKLSAgICAgICAgICAgICAgICBzb2FwMTFFbmRwb2ludEVsZW1lbnQuYWRkQXR0cmlidXRlKG9tRmFjdG9yeS5jcmVhdGVPTUF0dHJpYnV0ZSgKLSAgICAgICAgICAgICAgICAgICAgV1NETDJDb25zdGFudHMuQVRUUklCVVRFX05BTUUsIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lICsgV1NETDJDb25zdGFudHMuREVGQVVMVF9TT0FQMTFfRU5EUE9JTlRfTkFNRSkpOwotICAgICAgICAgICAgICAgIHNvYXAxMUVuZHBvaW50RWxlbWVudC5hZGRBdHRyaWJ1dGUob21GYWN0b3J5LmNyZWF0ZU9NQXR0cmlidXRlKAotICAgICAgICAgICAgICAgICAgICBXU0RMMkNvbnN0YW50cy5CSU5ESU5HX0xPQ0FMX05BTUUsIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICB0bnMuZ2V0UHJlZml4KCkgKyAiOiIgKyBzZXJ2aWNlTmFtZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEphdmEyV1NETENvbnN0YW50cy5CSU5ESU5HX05BTUVfU1VGRklYKSk7Ci0gICAgICAgICAgICAgICAgc29hcDExRW5kcG9pbnRFbGVtZW50LmFkZEF0dHJpYnV0ZSgKLSAgICAgICAgICAgICAgICAgICAgb21GYWN0b3J5LmNyZWF0ZU9NQXR0cmlidXRlKFdTREwyQ29uc3RhbnRzLkFUVFJJQlVURV9BRERSRVNTLCBudWxsLCBlcHIpKTsKLSAgICAgICAgICAgICAgICBzZXJ2aWNlRWxlbWVudC5hZGRDaGlsZChzb2FwMTFFbmRwb2ludEVsZW1lbnQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBPTUVsZW1lbnQgc29hcDEyRW5kcG9pbnRFbGVtZW50ID0gbnVsbDsKLSAgICAgICAgICAgIGlmICghZGlzYWJsZVNPQVAxMikgewotICAgICAgICAgICAgICAgIHNvYXAxMkVuZHBvaW50RWxlbWVudCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBvbUZhY3RvcnkuY3JlYXRlT01FbGVtZW50KFdTREwyQ29uc3RhbnRzLkVORFBPSU5UX0xPQ0FMX05BTUUsIHdzZGwpOwotICAgICAgICAgICAgICAgIHNvYXAxMkVuZHBvaW50RWxlbWVudC5hZGRBdHRyaWJ1dGUob21GYWN0b3J5LmNyZWF0ZU9NQXR0cmlidXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgV1NETDJDb25zdGFudHMuQVRUUklCVVRFX05BTUUsIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lICsgV1NETDJDb25zdGFudHMuREVGQVVMVF9TT0FQMTJfRU5EUE9JTlRfTkFNRSkpOwotICAgICAgICAgICAgICAgIHNvYXAxMkVuZHBvaW50RWxlbWVudC5hZGRBdHRyaWJ1dGUob21GYWN0b3J5LmNyZWF0ZU9NQXR0cmlidXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgV1NETDJDb25zdGFudHMuQklORElOR19MT0NBTF9OQU1FLCBudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgdG5zLmdldFByZWZpeCgpICsgIjoiICsgc2VydmljZU5hbWUgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKYXZhMldTRExDb25zdGFudHMuU09BUDEyQklORElOR19OQU1FX1NVRkZJWCkpOwotICAgICAgICAgICAgICAgIHNvYXAxMkVuZHBvaW50RWxlbWVudC5hZGRBdHRyaWJ1dGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBvbUZhY3RvcnkuY3JlYXRlT01BdHRyaWJ1dGUoV1NETDJDb25zdGFudHMuQVRUUklCVVRFX0FERFJFU1MsIG51bGwsIGVwcikpOwotICAgICAgICAgICAgICAgIHNlcnZpY2VFbGVtZW50LmFkZENoaWxkKHNvYXAxMkVuZHBvaW50RWxlbWVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIE9NRWxlbWVudCBodHRwRW5kcG9pbnRFbGVtZW50ID0gbnVsbDsKLSAgICAgICAgICAgIGlmICghZGlzYWJsZVJFU1QpIHsKLSAgICAgICAgICAgICAgICBodHRwRW5kcG9pbnRFbGVtZW50ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIG9tRmFjdG9yeS5jcmVhdGVPTUVsZW1lbnQoV1NETDJDb25zdGFudHMuRU5EUE9JTlRfTE9DQUxfTkFNRSwgd3NkbCk7Ci0gICAgICAgICAgICAgICAgaHR0cEVuZHBvaW50RWxlbWVudC5hZGRBdHRyaWJ1dGUob21GYWN0b3J5LmNyZWF0ZU9NQXR0cmlidXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgV1NETDJDb25zdGFudHMuQVRUUklCVVRFX05BTUUsIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lICsgV1NETDJDb25zdGFudHMuREVGQVVMVF9IVFRQX0VORFBPSU5UX05BTUUpKTsKLSAgICAgICAgICAgICAgICBodHRwRW5kcG9pbnRFbGVtZW50LmFkZEF0dHJpYnV0ZShvbUZhY3RvcnkuY3JlYXRlT01BdHRyaWJ1dGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBXU0RMMkNvbnN0YW50cy5CSU5ESU5HX0xPQ0FMX05BTUUsIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICB0bnMuZ2V0UHJlZml4KCkgKyAiOiIgKyBzZXJ2aWNlTmFtZSArIEphdmEyV1NETENvbnN0YW50cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuSFRUUF9CSU5ESU5HKSk7Ci0gICAgICAgICAgICAgICAgaHR0cEVuZHBvaW50RWxlbWVudC5hZGRBdHRyaWJ1dGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBvbUZhY3RvcnkuY3JlYXRlT01BdHRyaWJ1dGUoV1NETDJDb25zdGFudHMuQVRUUklCVVRFX0FERFJFU1MsIG51bGwsIGVwcikpOwotICAgICAgICAgICAgICAgIHNlcnZpY2VFbGVtZW50LmFkZENoaWxkKGh0dHBFbmRwb2ludEVsZW1lbnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoZXByLnN0YXJ0c1dpdGgoImh0dHBzOi8vIikpIHsKLSAgICAgICAgICAgICAgICBpZiAoIWRpc2FibGVTT0FQMTEpIHsKLSAgICAgICAgICAgICAgICAgICAgT01FbGVtZW50IHNvYXAxMURvY3VtZW50YXRpb24gPSBvbUZhY3RvcnkuY3JlYXRlT01FbGVtZW50KFdTREwyQ29uc3RhbnRzLkRPQ1VNRU5UQVRJT04sIHdzZGwpOwotICAgICAgICAgICAgICAgICAgICBzb2FwMTFEb2N1bWVudGF0aW9uLnNldFRleHQoIlRoaXMgZW5kcG9pbnQgZXhwb3NlcyBhIFNPQVAgMTEgYmluZGluZyBvdmVyIGEgSFRUUFMiKTsKLSAgICAgICAgICAgICAgICAgICAgc29hcDExRW5kcG9pbnRFbGVtZW50LmFkZENoaWxkKHNvYXAxMURvY3VtZW50YXRpb24pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoIWRpc2FibGVTT0FQMTIpIHsKLSAgICAgICAgICAgICAgICAgICAgT01FbGVtZW50IHNvYXAxMkRvY3VtZW50YXRpb24gPSBvbUZhY3RvcnkuY3JlYXRlT01FbGVtZW50KFdTREwyQ29uc3RhbnRzLkRPQ1VNRU5UQVRJT04sIHdzZGwpOwotICAgICAgICAgICAgICAgICAgICBzb2FwMTJEb2N1bWVudGF0aW9uLnNldFRleHQoIlRoaXMgZW5kcG9pbnQgZXhwb3NlcyBhIFNPQVAgMTIgYmluZGluZyBvdmVyIGEgSFRUUFMiKTsKLSAgICAgICAgICAgICAgICAgICAgc29hcDEyRW5kcG9pbnRFbGVtZW50LmFkZENoaWxkKHNvYXAxMkRvY3VtZW50YXRpb24pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoIWRpc2FibGVSRVNUKSB7Ci0gICAgICAgICAgICAgICAgICAgIE9NRWxlbWVudCBodHRwRG9jdW1lbnRhdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb21GYWN0b3J5LmNyZWF0ZU9NRWxlbWVudChXU0RMMkNvbnN0YW50cy5ET0NVTUVOVEFUSU9OLCB3c2RsKTsKLSAgICAgICAgICAgICAgICAgICAgaHR0cERvY3VtZW50YXRpb24uc2V0VGV4dCgiVGhpcyBlbmRwb2ludCBleHBvc2VzIGEgSFRUUCBiaW5kaW5nIG92ZXIgYSBIVFRQUyIpOwotICAgICAgICAgICAgICAgICAgICBodHRwRW5kcG9pbnRFbGVtZW50LmFkZENoaWxkKGh0dHBEb2N1bWVudGF0aW9uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGVwci5zdGFydHNXaXRoKCJodHRwOi8vIikpIHsKLSAgICAgICAgICAgICAgICBpZiAoIWRpc2FibGVTT0FQMTEpIHsKLSAgICAgICAgICAgICAgICAgICAgT01FbGVtZW50IHNvYXAxMURvY3VtZW50YXRpb24gPSBvbUZhY3RvcnkuY3JlYXRlT01FbGVtZW50KFdTREwyQ29uc3RhbnRzLkRPQ1VNRU5UQVRJT04sIHdzZGwpOwotICAgICAgICAgICAgICAgICAgICBzb2FwMTFEb2N1bWVudGF0aW9uLnNldFRleHQoIlRoaXMgZW5kcG9pbnQgZXhwb3NlcyBhIFNPQVAgMTEgYmluZGluZyBvdmVyIGEgSFRUUCIpOwotICAgICAgICAgICAgICAgICAgICBzb2FwMTFFbmRwb2ludEVsZW1lbnQuYWRkQ2hpbGQoc29hcDExRG9jdW1lbnRhdGlvbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICghZGlzYWJsZVNPQVAxMikgewotICAgICAgICAgICAgICAgICAgICBPTUVsZW1lbnQgc29hcDEyRG9jdW1lbnRhdGlvbiA9IG9tRmFjdG9yeS5jcmVhdGVPTUVsZW1lbnQoV1NETDJDb25zdGFudHMuRE9DVU1FTlRBVElPTiwgd3NkbCk7Ci0gICAgICAgICAgICAgICAgICAgIHNvYXAxMkRvY3VtZW50YXRpb24uc2V0VGV4dCgiVGhpcyBlbmRwb2ludCBleHBvc2VzIGEgU09BUCAxMiBiaW5kaW5nIG92ZXIgYSBIVFRQIik7Ci0gICAgICAgICAgICAgICAgICAgIHNvYXAxMkVuZHBvaW50RWxlbWVudC5hZGRDaGlsZChzb2FwMTJEb2N1bWVudGF0aW9uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCFkaXNhYmxlUkVTVCkgewotICAgICAgICAgICAgICAgICAgICBPTUVsZW1lbnQgaHR0cERvY3VtZW50YXRpb24gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9tRmFjdG9yeS5jcmVhdGVPTUVsZW1lbnQoV1NETDJDb25zdGFudHMuRE9DVU1FTlRBVElPTiwgd3NkbCk7Ci0gICAgICAgICAgICAgICAgICAgIGh0dHBEb2N1bWVudGF0aW9uLnNldFRleHQoIlRoaXMgZW5kcG9pbnQgZXhwb3NlcyBhIEhUVFAgYmluZGluZyBvdmVyIGEgSFRUUCIpOwotICAgICAgICAgICAgICAgICAgICBodHRwRW5kcG9pbnRFbGVtZW50LmFkZENoaWxkKGh0dHBEb2N1bWVudGF0aW9uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNlcnZpY2VFbGVtZW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgdGhlIG5hbWVzcGFjZXMgdG8gdGhlIGdpdmVuIE9NRWxlbWVudAotICAgICAqCi0gICAgICogQHBhcmFtIGRlc2NyaXB0aW9uRWxlbWVudCAtIFRoZSBPTUVsZW1lbnQgdGhhdCB0aGUgbmFtZXNwYWNlcyBzaG91bGQgYmUgYWRkZWQgdG8KLSAgICAgKiBAcGFyYW0gbmFtZVNwYWNlTWFwIC0gVGhlIG5hbWVzcGFjZU1hcAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwb3B1bGF0ZU5hbWVzcGFjZXMoT01FbGVtZW50IGRlc2NyaXB0aW9uRWxlbWVudCwgTWFwIG5hbWVTcGFjZU1hcCkgewotICAgICAgICBpZiAobmFtZVNwYWNlTWFwICE9IG51bGwpIHsKLSAgICAgICAgSXRlcmF0b3Iga2V5cyA9IG5hbWVTcGFjZU1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoa2V5cy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIFN0cmluZyBrZXkgPSAoU3RyaW5nKSBrZXlzLm5leHQoKTsKLSAgICAgICAgICAgIGlmICgiIi5lcXVhbHMoa2V5KSkgewotICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uRWxlbWVudC5kZWNsYXJlRGVmYXVsdE5hbWVzcGFjZSgoU3RyaW5nKSBuYW1lU3BhY2VNYXAuZ2V0KGtleSkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbkVsZW1lbnQuZGVjbGFyZU5hbWVzcGFjZSgoU3RyaW5nKSBuYW1lU3BhY2VNYXAuZ2V0KGtleSksIGtleSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkV1NBV0FjdGlvbkF0dHJpYnV0ZShPTUVsZW1lbnQgZWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYWN0aW9uICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTU5hbWVzcGFjZSB3c2F3KSB7Ci0gICAgICAgIGlmIChhY3Rpb24gPT0gbnVsbCB8fCBhY3Rpb24ubGVuZ3RoKCkgPT0gMCB8fCAiXFxcIlxcXCIiLmVxdWFscyhhY3Rpb24pKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgZWxlbWVudC5hZGRBdHRyaWJ1dGUoIkFjdGlvbiIsIGFjdGlvbiwgd3Nhdyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZEV4dGVuc2lvbkVsZW1lbnQoT01GYWN0b3J5IGZhYywgT01FbGVtZW50IGVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUsIFN0cmluZyBhdHQxTmFtZSwgU3RyaW5nIGF0dDFWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTU5hbWVzcGFjZSBzb2FwTmFtZVNwYWNlKSB7Ci0gICAgICAgIE9NRWxlbWVudCBleHRFbGVtZW50ID0gZmFjLmNyZWF0ZU9NRWxlbWVudChuYW1lLCBzb2FwTmFtZVNwYWNlKTsKLSAgICAgICAgZWxlbWVudC5hZGRDaGlsZChleHRFbGVtZW50KTsKLSAgICAgICAgZXh0RWxlbWVudC5hZGRBdHRyaWJ1dGUoYXR0MU5hbWUsIGF0dDFWYWx1ZSwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZFdTQWRkcmVzc2luZ1RvQmluZGluZyhTdHJpbmcgYWRkcmVzc2luZ0ZsYWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTUZhY3Rvcnkgb21GYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01FbGVtZW50IGJpbmRpbmdFbGVtZW50ICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NTmFtZXNwYWNlIHdzYXcpIHsKLSAgICAgICAgLy8gQWRkIFdTLUFkZHJlc3NpbmcgVXNpbmdBZGRyZXNzaW5nIGVsZW1lbnQgaWYgYXBwcm9wcmlhdGUKLSAgICAgICAgLy8gU0hPVUxEIGJlIG9uIHRoZSBiaW5kaW5nIGVsZW1lbnQgcGVyIHRoZSBzcGVjaWZpY2F0aW9uCi0gICAgICAgIGlmIChhZGRyZXNzaW5nRmxhZy5lcXVhbHMoQWRkcmVzc2luZ0NvbnN0YW50cy5BRERSRVNTSU5HX09QVElPTkFMKSkgewotICAgICAgICAgICAgV1NETFNlcmlhbGl6YXRpb25VdGlsLmFkZEV4dGVuc2lvbkVsZW1lbnQob21GYWN0b3J5LCBiaW5kaW5nRWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzc2luZ0NvbnN0YW50cy5VU0lOR19BRERSRVNTSU5HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVxdWlyZWQiLCAidHJ1ZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzYXcpOwotICAgICAgICB9IGVsc2UgaWYgKGFkZHJlc3NpbmdGbGFnLmVxdWFscyhBZGRyZXNzaW5nQ29uc3RhbnRzLkFERFJFU1NJTkdfUkVRVUlSRUQpKSB7Ci0gICAgICAgICAgICBXU0RMU2VyaWFsaXphdGlvblV0aWwuYWRkRXh0ZW5zaW9uRWxlbWVudChvbUZhY3RvcnksIGJpbmRpbmdFbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzaW5nQ29uc3RhbnRzLlVTSU5HX0FERFJFU1NJTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXF1aXJlZCIsICJ0cnVlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3Nhdyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkV1NETERvY3VtZW50YXRpb25FbGVtZW50KEF4aXNEZXNjcmlwdGlvbiBheGlzRGVzY3JpcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50LCBPTUZhY3Rvcnkgb21GYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01OYW1lc3BhY2Ugd3NkbCkgewotICAgICAgICBPTU5vZGUgZG9jdW1lbnRhdGlvbk5vZGUgPSBheGlzRGVzY3JpcHRpb24uZ2V0RG9jdW1lbnRhdGlvbk5vZGUoKTsKLSAgICAgICAgT01FbGVtZW50IGRvY3VtZW50YXRpb247Ci0gICAgICAgIGlmIChkb2N1bWVudGF0aW9uTm9kZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBkb2N1bWVudGF0aW9uID0gb21GYWN0b3J5LmNyZWF0ZU9NRWxlbWVudChXU0RMMkNvbnN0YW50cy5ET0NVTUVOVEFUSU9OLCB3c2RsKTsKLSAgICAgICAgICAgIGRvY3VtZW50YXRpb24uYWRkQ2hpbGQoZG9jdW1lbnRhdGlvbk5vZGUpOwotICAgICAgICAgICAgb21FbGVtZW50LmFkZENoaWxkKGRvY3VtZW50YXRpb24pOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRQb2xpY2llc0FzRXh0ZW5zaWJsZUVsZW1lbnQoCi0JCQlBeGlzRGVzY3JpcHRpb24gZGVzY3JpcHRpb24sIE9NRWxlbWVudCBkZXNjcmlwdGlvbkVsZW1lbnQpIHsKLQkJUG9saWN5U3ViamVjdCBwb2xpY3lTdWJqZWN0ID0gZGVzY3JpcHRpb24uZ2V0UG9saWN5U3ViamVjdCgpOwotCQlDb2xsZWN0aW9uIGF0dGFjaFBvbGljeUNvbXBvbmVudHMgPSBwb2xpY3lTdWJqZWN0Ci0JCQkJLmdldEF0dGFjaGVkUG9saWN5Q29tcG9uZW50cygpOwotCQlBcnJheUxpc3QgcG9saWNpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGF0dGFjaFBvbGljeUNvbXBvbmVudHMuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IHBvbGljeUVsZW1lbnQgPSBpdGVyYXRvci5uZXh0KCk7Ci0KLQkJCWlmIChwb2xpY3lFbGVtZW50IGluc3RhbmNlb2YgUG9saWN5KSB7Ci0JCQkJcG9saWNpZXMuYWRkKHBvbGljeUVsZW1lbnQpOwotCi0JCQl9IGVsc2UgaWYgKHBvbGljeUVsZW1lbnQgaW5zdGFuY2VvZiBQb2xpY3lSZWZlcmVuY2UpIHsKLQkJCQlTdHJpbmcga2V5ID0gKChQb2xpY3lSZWZlcmVuY2UpIHBvbGljeUVsZW1lbnQpLmdldFVSSSgpOwotCi0JCQkJaWYgKGtleS5zdGFydHNXaXRoKCIjIikpIHsKLQkJCQkJa2V5ID0ga2V5LnN1YnN0cmluZyhrZXkuaW5kZXhPZigiIyIpICsgMSk7Ci0JCQkJfQotICAgICAgICAgICAgICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2UgPSBnZXRBeGlzU2VydmljZShkZXNjcmlwdGlvbik7Ci0JCQkJUG9saWN5TG9jYXRvciBsb2NhdG9yID0gbmV3IFBvbGljeUxvY2F0b3Ioc2VydmljZSk7Ci0JCQkJUG9saWN5IHAgPSBsb2NhdG9yLmxvb2t1cChrZXkpOwotCi0JCQkJaWYgKHAgPT0gbnVsbCkgewotCQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiUG9saWN5IG5vdCBmb3VuZCBmb3IgdXJpIDogIgotCQkJCQkJCSsga2V5KTsKLQkJCQl9Ci0JCQkJcG9saWNpZXMuYWRkKHApOwotCQkJfQotCQl9Ci0KLQkJRXh0ZXJuYWxQb2xpY3lTZXJpYWxpemVyIGZpbHRlciA9IG51bGw7Ci0JCWlmICghcG9saWNpZXMuaXNFbXB0eSgpKSB7Ci0JCQlmaWx0ZXIgPSBuZXcgRXh0ZXJuYWxQb2xpY3lTZXJpYWxpemVyKCk7Ci0JCQlBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlndXJhdGlvbiA9IGRlc2NyaXB0aW9uCi0JCQkJCS5nZXRBeGlzQ29uZmlndXJhdGlvbigpOwotCQkJaWYgKGF4aXNDb25maWd1cmF0aW9uICE9IG51bGwpIHsKLQkJCQlmaWx0ZXIuc2V0QXNzZXJ0aW9uc1RvRmlsdGVyKGF4aXNDb25maWd1cmF0aW9uCi0JCQkJCQkuZ2V0TG9jYWxQb2xpY3lBc3NlcnRpb25zKCkpOwotCQkJfQotCQl9Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHBvbGljaWVzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCVBvbGljeSBwb2xpY3kgPSAoUG9saWN5KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlPTUVsZW1lbnQgcG9saWN5RWxlbWVudDsKLQkJCXRyeSB7Ci0JCQkJcG9saWN5RWxlbWVudCA9IFBvbGljeVV0aWwuZ2V0UG9saWN5Q29tcG9uZW50QXNPTUVsZW1lbnQoCi0JCQkJCQlwb2xpY3ksIGZpbHRlcik7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7Ci0JCQl9Ci0JCQlPTU5vZGUgZmlyc3RDaGlsZCA9IGRlc2NyaXB0aW9uRWxlbWVudC5nZXRGaXJzdE9NQ2hpbGQoKTsKLQkJCWlmIChmaXJzdENoaWxkICE9IG51bGwpIHsKLQkJCQlmaXJzdENoaWxkLmluc2VydFNpYmxpbmdCZWZvcmUocG9saWN5RWxlbWVudCk7Ci0JCQl9IGVsc2UgewotCQkJCWRlc2NyaXB0aW9uRWxlbWVudC5hZGRDaGlsZChwb2xpY3lFbGVtZW50KTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIEF4aXNTZXJ2aWNlIGdldEF4aXNTZXJ2aWNlKEF4aXNEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgewotCQlpZiAoZGVzY3JpcHRpb24gPT0gbnVsbCB8fCBkZXNjcmlwdGlvbiBpbnN0YW5jZW9mIEF4aXNTZXJ2aWNlKSB7Ci0JCQlyZXR1cm4gKEF4aXNTZXJ2aWNlKSBkZXNjcmlwdGlvbjsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBnZXRBeGlzU2VydmljZShkZXNjcmlwdGlvbi5nZXRQYXJlbnQoKSk7Ci0JCX0KLQl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4dHJhY3RIb3N0SVAoU3RyaW5nIHNlcnZpY2VVUkwpewotICAgICAgICAgICAgCi0gICAgICAgICAgICBTdHJpbmcgaXAgPSBudWxsOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoc2VydmljZVVSTCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpbnQgaXBpbmRleCA9IHNlcnZpY2VVUkwuaW5kZXhPZigiLy8iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChpcGluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaXAgPSBzZXJ2aWNlVVJMLnN1YnN0cmluZyhpcGluZGV4ICsgMiwgc2VydmljZVVSTC5sZW5ndGgoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGludCBzZXBlcmF0b3JJbmRleCA9IGlwLmluZGV4T2YoIjoiKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IHNsYXNoSW5kZXggPSBpcC5pbmRleE9mKCIvIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNlcGVyYXRvckluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlwID0gaXAuc3Vic3RyaW5nKDAsIHNlcGVyYXRvckluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlwID0gaXAuc3Vic3RyaW5nKDAsIHNsYXNoSW5kZXgpOwotICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIGlwOyAgICAgIAotICAgICAgICB9ICAgICAgCi0KLQkKLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi91dGlsL1hNTENoYXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi91dGlsL1hNTENoYXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzEzMGNjMC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdXRpbC9YTUxDaGFyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NjMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnV0aWw7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBkZWZpbmVzIHRoZSBiYXNpYyBYTUwgY2hhcmFjdGVyIHByb3BlcnRpZXMuIFRoZSBkYXRhCi0gKiBpbiB0aGlzIGNsYXNzIGNhbiBiZSB1c2VkIHRvIHZlcmlmeSB0aGF0IGEgY2hhcmFjdGVyIGlzIGEgdmFsaWQKLSAqIFhNTCBjaGFyYWN0ZXIgb3IgaWYgdGhlIGNoYXJhY3RlciBpcyBhIHNwYWNlLCBuYW1lIHN0YXJ0LCBvciBuYW1lCi0gKiBjaGFyYWN0ZXIuCi0gKiA8cC8+Ci0gKiBBIHNlcmllcyBvZiBjb252ZW5pZW5jZSBtZXRob2RzIGFyZSBzdXBwbGllZCB0byBlYXNlIHRoZSBidXJkZW4KLSAqIG9mIHRoZSBkZXZlbG9wZXIuIEJlY2F1c2UgaW5saW5pbmcgdGhlIGNoZWNrcyBjYW4gaW1wcm92ZSBwZXIKLSAqIGNoYXJhY3RlciBwZXJmb3JtYW5jZSwgdGhlIHRhYmxlcyBvZiBjaGFyYWN0ZXIgcHJvcGVydGllcyBhcmUKLSAqIHB1YmxpYy4gVXNpbmcgdGhlIGNoYXJhY3RlciBhcyBhbiBpbmRleCBpbnRvIHRoZSA8Y29kZT5DSEFSUzwvY29kZT4KLSAqIGFycmF5IGFuZCBhcHBseWluZyB0aGUgYXBwcm9wcmlhdGUgbWFzayBmbGFnIChlLmcuCi0gKiA8Y29kZT5NQVNLX1ZBTElEPC9jb2RlPiksIHlpZWxkcyB0aGUgc2FtZSByZXN1bHRzIGFzIGNhbGxpbmcgdGhlCi0gKiBjb252ZW5pZW5jZSBtZXRob2RzLiBUaGVyZSBpcyBvbmUgZXhjZXB0aW9uOiBjaGVjayB0aGUgY29tbWVudHMKLSAqIGZvciB0aGUgPGNvZGU+aXNWYWxpZDwvY29kZT4gbWV0aG9kIGZvciBkZXRhaWxzLgotICovCi1wdWJsaWMgY2xhc3MgWE1MQ2hhciB7Ci0KLSAgICAvLwotICAgIC8vIENvbnN0YW50cwotICAgIC8vCi0KLSAgICAvKioKLSAgICAgKiBDaGFyYWN0ZXIgZmxhZ3MuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIENIQVJTID0gbmV3IGJ5dGVbMSA8PCAxNl07Ci0KLSAgICAvKioKLSAgICAgKiBWYWxpZCBjaGFyYWN0ZXIgbWFzay4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVNLX1ZBTElEID0gMHgwMTsKLQotICAgIC8qKgotICAgICAqIFNwYWNlIGNoYXJhY3RlciBtYXNrLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BU0tfU1BBQ0UgPSAweDAyOwotCi0gICAgLyoqCi0gICAgICogTmFtZSBzdGFydCBjaGFyYWN0ZXIgbWFzay4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVNLX05BTUVfU1RBUlQgPSAweDA0OwotCi0gICAgLyoqCi0gICAgICogTmFtZSBjaGFyYWN0ZXIgbWFzay4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVNLX05BTUUgPSAweDA4OwotCi0gICAgLyoqCi0gICAgICogUHViaWQgY2hhcmFjdGVyIG1hc2suCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFTS19QVUJJRCA9IDB4MTA7Ci0KLSAgICAvKioKLSAgICAgKiBDb250ZW50IGNoYXJhY3RlciBtYXNrLiBTcGVjaWFsIGNoYXJhY3RlcnMgYXJlIHRob3NlIHRoYXQgY2FuCi0gICAgICogYmUgY29uc2lkZXJlZCB0aGUgc3RhcnQgb2YgbWFya3VwLCBzdWNoIGFzICcmbHQ7JyBhbmQgJyZhbXA7Jy4KLSAgICAgKiBUaGUgdmFyaW91cyBuZXdsaW5lIGNoYXJhY3RlcnMgYXJlIGNvbnNpZGVyZWQgc3BlY2lhbCBhcyB3ZWxsLgotICAgICAqIEFsbCBvdGhlciB2YWxpZCBYTUwgY2hhcmFjdGVycyBjYW4gYmUgY29uc2lkZXJlZCBjb250ZW50LgotICAgICAqIDxwLz4KLSAgICAgKiBUaGlzIGlzIGFuIG9wdGltaXphdGlvbiBmb3IgdGhlIGlubmVyIGxvb3Agb2YgY2hhcmFjdGVyIHNjYW5uaW5nLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BU0tfQ09OVEVOVCA9IDB4MjA7Ci0KLSAgICAvKioKLSAgICAgKiBOQ05hbWUgc3RhcnQgY2hhcmFjdGVyIG1hc2suCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFTS19OQ05BTUVfU1RBUlQgPSAweDQwOwotCi0gICAgLyoqCi0gICAgICogTkNOYW1lIGNoYXJhY3RlciBtYXNrLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BU0tfTkNOQU1FID0gMHg4MDsKLQotICAgIC8vCi0gICAgLy8gU3RhdGljIGluaXRpYWxpemF0aW9uCi0gICAgLy8KLQotICAgIHN0YXRpYyB7Ci0KLSAgICAgICAgLy8KLSAgICAgICAgLy8gWzJdIENoYXIgOjo9ICN4OSB8ICN4QSB8ICN4RCB8IFsjeDIwLSN4RDdGRl0gfAotICAgICAgICAvLyAgICAgICAgICAgICAgWyN4RTAwMC0jeEZGRkRdIHwgWyN4MTAwMDAtI3gxMEZGRkZdCi0gICAgICAgIC8vCi0KLSAgICAgICAgaW50IGNoYXJSYW5nZVtdID0gewotICAgICAgICAgICAgICAgIDB4MDAwOSwgMHgwMDBBLCAweDAwMEQsIDB4MDAwRCwgMHgwMDIwLCAweEQ3RkYsIDB4RTAwMCwgMHhGRkZELAotICAgICAgICB9OwotCi0gICAgICAgIC8vCi0gICAgICAgIC8vIFszXSBTIDo6PSAoI3gyMCB8ICN4OSB8ICN4RCB8ICN4QSkrCi0gICAgICAgIC8vCi0KLSAgICAgICAgaW50IHNwYWNlQ2hhcltdID0gewotICAgICAgICAgICAgICAgIDB4MDAyMCwgMHgwMDA5LCAweDAwMEQsIDB4MDAwQSwKLSAgICAgICAgfTsKLQotICAgICAgICAvLwotICAgICAgICAvLyBbNF0gTmFtZUNoYXIgOjo9IExldHRlciB8IERpZ2l0IHwgJy4nIHwgJy0nIHwgJ18nIHwgJzonIHwKLSAgICAgICAgLy8gICAgICAgICAgICAgICAgICBDb21iaW5pbmdDaGFyIHwgRXh0ZW5kZXIKLSAgICAgICAgLy8KLQotICAgICAgICBpbnQgbmFtZUNoYXJbXSA9IHsKLSAgICAgICAgICAgICAgICAweDAwMkQsIDB4MDAyRSwgLy8gJy0nIGFuZCAnLicKLSAgICAgICAgfTsKLQotICAgICAgICAvLwotICAgICAgICAvLyBbNV0gTmFtZSA6Oj0gKExldHRlciB8ICdfJyB8ICc6JykgKE5hbWVDaGFyKSoKLSAgICAgICAgLy8KLQotICAgICAgICBpbnQgbmFtZVN0YXJ0Q2hhcltdID0gewotICAgICAgICAgICAgICAgIDB4MDAzQSwgMHgwMDVGLCAvLyAnOicgYW5kICdfJwotICAgICAgICB9OwotCi0gICAgICAgIC8vCi0gICAgICAgIC8vIFsxM10gUHViaWRDaGFyIDo6PSAjeDIwIHwgMHhEIHwgMHhBIHwgW2EtekEtWjAtOV0gfCBbLScoKSssLi86PT87ISojQCRfJV0KLSAgICAgICAgLy8KLQotICAgICAgICBpbnQgcHViaWRDaGFyW10gPSB7Ci0gICAgICAgICAgICAgICAgMHgwMDBBLCAweDAwMEQsIDB4MDAyMCwgMHgwMDIxLCAweDAwMjMsIDB4MDAyNCwgMHgwMDI1LCAweDAwM0QsCi0gICAgICAgICAgICAgICAgMHgwMDVGCi0gICAgICAgIH07Ci0KLSAgICAgICAgaW50IHB1YmlkUmFuZ2VbXSA9IHsKLSAgICAgICAgICAgICAgICAweDAwMjcsIDB4MDAzQiwgMHgwMDNGLCAweDAwNUEsIDB4MDA2MSwgMHgwMDdBCi0gICAgICAgIH07Ci0KLSAgICAgICAgLy8KLSAgICAgICAgLy8gWzg0XSBMZXR0ZXIgOjo9IEJhc2VDaGFyIHwgSWRlb2dyYXBoaWMKLSAgICAgICAgLy8KLQotICAgICAgICBpbnQgbGV0dGVyUmFuZ2VbXSA9IHsKLSAgICAgICAgICAgICAgICAvLyBCYXNlQ2hhcgotICAgICAgICAgICAgICAgIDB4MDA0MSwgMHgwMDVBLCAweDAwNjEsIDB4MDA3QSwgMHgwMEMwLCAweDAwRDYsIDB4MDBEOCwgMHgwMEY2LAotICAgICAgICAgICAgICAgIDB4MDBGOCwgMHgwMTMxLCAweDAxMzQsIDB4MDEzRSwgMHgwMTQxLCAweDAxNDgsIDB4MDE0QSwgMHgwMTdFLAotICAgICAgICAgICAgICAgIDB4MDE4MCwgMHgwMUMzLCAweDAxQ0QsIDB4MDFGMCwgMHgwMUY0LCAweDAxRjUsIDB4MDFGQSwgMHgwMjE3LAotICAgICAgICAgICAgICAgIDB4MDI1MCwgMHgwMkE4LCAweDAyQkIsIDB4MDJDMSwgMHgwMzg4LCAweDAzOEEsIDB4MDM4RSwgMHgwM0ExLAotICAgICAgICAgICAgICAgIDB4MDNBMywgMHgwM0NFLCAweDAzRDAsIDB4MDNENiwgMHgwM0UyLCAweDAzRjMsIDB4MDQwMSwgMHgwNDBDLAotICAgICAgICAgICAgICAgIDB4MDQwRSwgMHgwNDRGLCAweDA0NTEsIDB4MDQ1QywgMHgwNDVFLCAweDA0ODEsIDB4MDQ5MCwgMHgwNEM0LAotICAgICAgICAgICAgICAgIDB4MDRDNywgMHgwNEM4LCAweDA0Q0IsIDB4MDRDQywgMHgwNEQwLCAweDA0RUIsIDB4MDRFRSwgMHgwNEY1LAotICAgICAgICAgICAgICAgIDB4MDRGOCwgMHgwNEY5LCAweDA1MzEsIDB4MDU1NiwgMHgwNTYxLCAweDA1ODYsIDB4MDVEMCwgMHgwNUVBLAotICAgICAgICAgICAgICAgIDB4MDVGMCwgMHgwNUYyLCAweDA2MjEsIDB4MDYzQSwgMHgwNjQxLCAweDA2NEEsIDB4MDY3MSwgMHgwNkI3LAotICAgICAgICAgICAgICAgIDB4MDZCQSwgMHgwNkJFLCAweDA2QzAsIDB4MDZDRSwgMHgwNkQwLCAweDA2RDMsIDB4MDZFNSwgMHgwNkU2LAotICAgICAgICAgICAgICAgIDB4MDkwNSwgMHgwOTM5LCAweDA5NTgsIDB4MDk2MSwgMHgwOTg1LCAweDA5OEMsIDB4MDk4RiwgMHgwOTkwLAotICAgICAgICAgICAgICAgIDB4MDk5MywgMHgwOUE4LCAweDA5QUEsIDB4MDlCMCwgMHgwOUI2LCAweDA5QjksIDB4MDlEQywgMHgwOURELAotICAgICAgICAgICAgICAgIDB4MDlERiwgMHgwOUUxLCAweDA5RjAsIDB4MDlGMSwgMHgwQTA1LCAweDBBMEEsIDB4MEEwRiwgMHgwQTEwLAotICAgICAgICAgICAgICAgIDB4MEExMywgMHgwQTI4LCAweDBBMkEsIDB4MEEzMCwgMHgwQTMyLCAweDBBMzMsIDB4MEEzNSwgMHgwQTM2LAotICAgICAgICAgICAgICAgIDB4MEEzOCwgMHgwQTM5LCAweDBBNTksIDB4MEE1QywgMHgwQTcyLCAweDBBNzQsIDB4MEE4NSwgMHgwQThCLAotICAgICAgICAgICAgICAgIDB4MEE4RiwgMHgwQTkxLCAweDBBOTMsIDB4MEFBOCwgMHgwQUFBLCAweDBBQjAsIDB4MEFCMiwgMHgwQUIzLAotICAgICAgICAgICAgICAgIDB4MEFCNSwgMHgwQUI5LCAweDBCMDUsIDB4MEIwQywgMHgwQjBGLCAweDBCMTAsIDB4MEIxMywgMHgwQjI4LAotICAgICAgICAgICAgICAgIDB4MEIyQSwgMHgwQjMwLCAweDBCMzIsIDB4MEIzMywgMHgwQjM2LCAweDBCMzksIDB4MEI1QywgMHgwQjVELAotICAgICAgICAgICAgICAgIDB4MEI1RiwgMHgwQjYxLCAweDBCODUsIDB4MEI4QSwgMHgwQjhFLCAweDBCOTAsIDB4MEI5MiwgMHgwQjk1LAotICAgICAgICAgICAgICAgIDB4MEI5OSwgMHgwQjlBLCAweDBCOUUsIDB4MEI5RiwgMHgwQkEzLCAweDBCQTQsIDB4MEJBOCwgMHgwQkFBLAotICAgICAgICAgICAgICAgIDB4MEJBRSwgMHgwQkI1LCAweDBCQjcsIDB4MEJCOSwgMHgwQzA1LCAweDBDMEMsIDB4MEMwRSwgMHgwQzEwLAotICAgICAgICAgICAgICAgIDB4MEMxMiwgMHgwQzI4LCAweDBDMkEsIDB4MEMzMywgMHgwQzM1LCAweDBDMzksIDB4MEM2MCwgMHgwQzYxLAotICAgICAgICAgICAgICAgIDB4MEM4NSwgMHgwQzhDLCAweDBDOEUsIDB4MEM5MCwgMHgwQzkyLCAweDBDQTgsIDB4MENBQSwgMHgwQ0IzLAotICAgICAgICAgICAgICAgIDB4MENCNSwgMHgwQ0I5LCAweDBDRTAsIDB4MENFMSwgMHgwRDA1LCAweDBEMEMsIDB4MEQwRSwgMHgwRDEwLAotICAgICAgICAgICAgICAgIDB4MEQxMiwgMHgwRDI4LCAweDBEMkEsIDB4MEQzOSwgMHgwRDYwLCAweDBENjEsIDB4MEUwMSwgMHgwRTJFLAotICAgICAgICAgICAgICAgIDB4MEUzMiwgMHgwRTMzLCAweDBFNDAsIDB4MEU0NSwgMHgwRTgxLCAweDBFODIsIDB4MEU4NywgMHgwRTg4LAotICAgICAgICAgICAgICAgIDB4MEU5NCwgMHgwRTk3LCAweDBFOTksIDB4MEU5RiwgMHgwRUExLCAweDBFQTMsIDB4MEVBQSwgMHgwRUFCLAotICAgICAgICAgICAgICAgIDB4MEVBRCwgMHgwRUFFLCAweDBFQjIsIDB4MEVCMywgMHgwRUMwLCAweDBFQzQsIDB4MEY0MCwgMHgwRjQ3LAotICAgICAgICAgICAgICAgIDB4MEY0OSwgMHgwRjY5LCAweDEwQTAsIDB4MTBDNSwgMHgxMEQwLCAweDEwRjYsIDB4MTEwMiwgMHgxMTAzLAotICAgICAgICAgICAgICAgIDB4MTEwNSwgMHgxMTA3LCAweDExMEIsIDB4MTEwQywgMHgxMTBFLCAweDExMTIsIDB4MTE1NCwgMHgxMTU1LAotICAgICAgICAgICAgICAgIDB4MTE1RiwgMHgxMTYxLCAweDExNkQsIDB4MTE2RSwgMHgxMTcyLCAweDExNzMsIDB4MTFBRSwgMHgxMUFGLAotICAgICAgICAgICAgICAgIDB4MTFCNywgMHgxMUI4LCAweDExQkMsIDB4MTFDMiwgMHgxRTAwLCAweDFFOUIsIDB4MUVBMCwgMHgxRUY5LAotICAgICAgICAgICAgICAgIDB4MUYwMCwgMHgxRjE1LCAweDFGMTgsIDB4MUYxRCwgMHgxRjIwLCAweDFGNDUsIDB4MUY0OCwgMHgxRjRELAotICAgICAgICAgICAgICAgIDB4MUY1MCwgMHgxRjU3LCAweDFGNUYsIDB4MUY3RCwgMHgxRjgwLCAweDFGQjQsIDB4MUZCNiwgMHgxRkJDLAotICAgICAgICAgICAgICAgIDB4MUZDMiwgMHgxRkM0LCAweDFGQzYsIDB4MUZDQywgMHgxRkQwLCAweDFGRDMsIDB4MUZENiwgMHgxRkRCLAotICAgICAgICAgICAgICAgIDB4MUZFMCwgMHgxRkVDLCAweDFGRjIsIDB4MUZGNCwgMHgxRkY2LCAweDFGRkMsIDB4MjEyQSwgMHgyMTJCLAotICAgICAgICAgICAgICAgIDB4MjE4MCwgMHgyMTgyLCAweDMwNDEsIDB4MzA5NCwgMHgzMEExLCAweDMwRkEsIDB4MzEwNSwgMHgzMTJDLAotICAgICAgICAgICAgICAgIDB4QUMwMCwgMHhEN0EzLAotICAgICAgICAgICAgICAgIC8vIElkZW9ncmFwaGljCi0gICAgICAgICAgICAgICAgMHgzMDIxLCAweDMwMjksIDB4NEUwMCwgMHg5RkE1LAotICAgICAgICB9OwotICAgICAgICBpbnQgbGV0dGVyQ2hhcltdID0gewotICAgICAgICAgICAgICAgIC8vIEJhc2VDaGFyCi0gICAgICAgICAgICAgICAgMHgwMzg2LCAweDAzOEMsIDB4MDNEQSwgMHgwM0RDLCAweDAzREUsIDB4MDNFMCwgMHgwNTU5LCAweDA2RDUsCi0gICAgICAgICAgICAgICAgMHgwOTNELCAweDA5QjIsIDB4MEE1RSwgMHgwQThELCAweDBBQkQsIDB4MEFFMCwgMHgwQjNELCAweDBCOUMsCi0gICAgICAgICAgICAgICAgMHgwQ0RFLCAweDBFMzAsIDB4MEU4NCwgMHgwRThBLCAweDBFOEQsIDB4MEVBNSwgMHgwRUE3LCAweDBFQjAsCi0gICAgICAgICAgICAgICAgMHgwRUJELCAweDExMDAsIDB4MTEwOSwgMHgxMTNDLCAweDExM0UsIDB4MTE0MCwgMHgxMTRDLCAweDExNEUsCi0gICAgICAgICAgICAgICAgMHgxMTUwLCAweDExNTksIDB4MTE2MywgMHgxMTY1LCAweDExNjcsIDB4MTE2OSwgMHgxMTc1LCAweDExOUUsCi0gICAgICAgICAgICAgICAgMHgxMUE4LCAweDExQUIsIDB4MTFCQSwgMHgxMUVCLCAweDExRjAsIDB4MTFGOSwgMHgxRjU5LCAweDFGNUIsCi0gICAgICAgICAgICAgICAgMHgxRjVELCAweDFGQkUsIDB4MjEyNiwgMHgyMTJFLAotICAgICAgICAgICAgICAgIC8vIElkZW9ncmFwaGljCi0gICAgICAgICAgICAgICAgMHgzMDA3LAotICAgICAgICB9OwotCi0gICAgICAgIC8vCi0gICAgICAgIC8vIFs4N10gQ29tYmluaW5nQ2hhciA6Oj0gLi4uCi0gICAgICAgIC8vCi0KLSAgICAgICAgaW50IGNvbWJpbmluZ0NoYXJSYW5nZVtdID0gewotICAgICAgICAgICAgICAgIDB4MDMwMCwgMHgwMzQ1LCAweDAzNjAsIDB4MDM2MSwgMHgwNDgzLCAweDA0ODYsIDB4MDU5MSwgMHgwNUExLAotICAgICAgICAgICAgICAgIDB4MDVBMywgMHgwNUI5LCAweDA1QkIsIDB4MDVCRCwgMHgwNUMxLCAweDA1QzIsIDB4MDY0QiwgMHgwNjUyLAotICAgICAgICAgICAgICAgIDB4MDZENiwgMHgwNkRDLCAweDA2REQsIDB4MDZERiwgMHgwNkUwLCAweDA2RTQsIDB4MDZFNywgMHgwNkU4LAotICAgICAgICAgICAgICAgIDB4MDZFQSwgMHgwNkVELCAweDA5MDEsIDB4MDkwMywgMHgwOTNFLCAweDA5NEMsIDB4MDk1MSwgMHgwOTU0LAotICAgICAgICAgICAgICAgIDB4MDk2MiwgMHgwOTYzLCAweDA5ODEsIDB4MDk4MywgMHgwOUMwLCAweDA5QzQsIDB4MDlDNywgMHgwOUM4LAotICAgICAgICAgICAgICAgIDB4MDlDQiwgMHgwOUNELCAweDA5RTIsIDB4MDlFMywgMHgwQTQwLCAweDBBNDIsIDB4MEE0NywgMHgwQTQ4LAotICAgICAgICAgICAgICAgIDB4MEE0QiwgMHgwQTRELCAweDBBNzAsIDB4MEE3MSwgMHgwQTgxLCAweDBBODMsIDB4MEFCRSwgMHgwQUM1LAotICAgICAgICAgICAgICAgIDB4MEFDNywgMHgwQUM5LCAweDBBQ0IsIDB4MEFDRCwgMHgwQjAxLCAweDBCMDMsIDB4MEIzRSwgMHgwQjQzLAotICAgICAgICAgICAgICAgIDB4MEI0NywgMHgwQjQ4LCAweDBCNEIsIDB4MEI0RCwgMHgwQjU2LCAweDBCNTcsIDB4MEI4MiwgMHgwQjgzLAotICAgICAgICAgICAgICAgIDB4MEJCRSwgMHgwQkMyLCAweDBCQzYsIDB4MEJDOCwgMHgwQkNBLCAweDBCQ0QsIDB4MEMwMSwgMHgwQzAzLAotICAgICAgICAgICAgICAgIDB4MEMzRSwgMHgwQzQ0LCAweDBDNDYsIDB4MEM0OCwgMHgwQzRBLCAweDBDNEQsIDB4MEM1NSwgMHgwQzU2LAotICAgICAgICAgICAgICAgIDB4MEM4MiwgMHgwQzgzLCAweDBDQkUsIDB4MENDNCwgMHgwQ0M2LCAweDBDQzgsIDB4MENDQSwgMHgwQ0NELAotICAgICAgICAgICAgICAgIDB4MENENSwgMHgwQ0Q2LCAweDBEMDIsIDB4MEQwMywgMHgwRDNFLCAweDBENDMsIDB4MEQ0NiwgMHgwRDQ4LAotICAgICAgICAgICAgICAgIDB4MEQ0QSwgMHgwRDRELCAweDBFMzQsIDB4MEUzQSwgMHgwRTQ3LCAweDBFNEUsIDB4MEVCNCwgMHgwRUI5LAotICAgICAgICAgICAgICAgIDB4MEVCQiwgMHgwRUJDLCAweDBFQzgsIDB4MEVDRCwgMHgwRjE4LCAweDBGMTksIDB4MEY3MSwgMHgwRjg0LAotICAgICAgICAgICAgICAgIDB4MEY4NiwgMHgwRjhCLCAweDBGOTAsIDB4MEY5NSwgMHgwRjk5LCAweDBGQUQsIDB4MEZCMSwgMHgwRkI3LAotICAgICAgICAgICAgICAgIDB4MjBEMCwgMHgyMERDLCAweDMwMkEsIDB4MzAyRiwKLSAgICAgICAgfTsKLQotICAgICAgICBpbnQgY29tYmluaW5nQ2hhckNoYXJbXSA9IHsKLSAgICAgICAgICAgICAgICAweDA1QkYsIDB4MDVDNCwgMHgwNjcwLCAweDA5M0MsIDB4MDk0RCwgMHgwOUJDLCAweDA5QkUsIDB4MDlCRiwKLSAgICAgICAgICAgICAgICAweDA5RDcsIDB4MEEwMiwgMHgwQTNDLCAweDBBM0UsIDB4MEEzRiwgMHgwQUJDLCAweDBCM0MsIDB4MEJENywKLSAgICAgICAgICAgICAgICAweDBENTcsIDB4MEUzMSwgMHgwRUIxLCAweDBGMzUsIDB4MEYzNywgMHgwRjM5LCAweDBGM0UsIDB4MEYzRiwKLSAgICAgICAgICAgICAgICAweDBGOTcsIDB4MEZCOSwgMHgyMEUxLCAweDMwOTksIDB4MzA5QSwKLSAgICAgICAgfTsKLQotICAgICAgICAvLwotICAgICAgICAvLyBbODhdIERpZ2l0IDo6PSAuLi4KLSAgICAgICAgLy8KLQotICAgICAgICBpbnQgZGlnaXRSYW5nZVtdID0gewotICAgICAgICAgICAgICAgIDB4MDAzMCwgMHgwMDM5LCAweDA2NjAsIDB4MDY2OSwgMHgwNkYwLCAweDA2RjksIDB4MDk2NiwgMHgwOTZGLAotICAgICAgICAgICAgICAgIDB4MDlFNiwgMHgwOUVGLCAweDBBNjYsIDB4MEE2RiwgMHgwQUU2LCAweDBBRUYsIDB4MEI2NiwgMHgwQjZGLAotICAgICAgICAgICAgICAgIDB4MEJFNywgMHgwQkVGLCAweDBDNjYsIDB4MEM2RiwgMHgwQ0U2LCAweDBDRUYsIDB4MEQ2NiwgMHgwRDZGLAotICAgICAgICAgICAgICAgIDB4MEU1MCwgMHgwRTU5LCAweDBFRDAsIDB4MEVEOSwgMHgwRjIwLCAweDBGMjksCi0gICAgICAgIH07Ci0KLSAgICAgICAgLy8KLSAgICAgICAgLy8gWzg5XSBFeHRlbmRlciA6Oj0gLi4uCi0gICAgICAgIC8vCi0KLSAgICAgICAgaW50IGV4dGVuZGVyUmFuZ2VbXSA9IHsKLSAgICAgICAgICAgICAgICAweDMwMzEsIDB4MzAzNSwgMHgzMDlELCAweDMwOUUsIDB4MzBGQywgMHgzMEZFLAotICAgICAgICB9OwotCi0gICAgICAgIGludCBleHRlbmRlckNoYXJbXSA9IHsKLSAgICAgICAgICAgICAgICAweDAwQjcsIDB4MDJEMCwgMHgwMkQxLCAweDAzODcsIDB4MDY0MCwgMHgwRTQ2LCAweDBFQzYsIDB4MzAwNSwKLSAgICAgICAgfTsKLQotICAgICAgICAvLwotICAgICAgICAvLyBTcGVjaWFsQ2hhciA6Oj0gJzwnLCAnJicsICdcbicsICdccicsICddJwotICAgICAgICAvLwotCi0gICAgICAgIGludCBzcGVjaWFsQ2hhcltdID0gewotICAgICAgICAgICAgICAgICc8JywgJyYnLCAnXG4nLCAnXHInLCAnXScsCi0gICAgICAgIH07Ci0KLSAgICAgICAgLy8KLSAgICAgICAgLy8gSW5pdGlhbGl6ZQotICAgICAgICAvLwotCi0gICAgICAgIC8vIHNldCB2YWxpZCBjaGFyYWN0ZXJzCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hhclJhbmdlLmxlbmd0aDsgaSArPSAyKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gY2hhclJhbmdlW2ldOyBqIDw9IGNoYXJSYW5nZVtpICsgMV07IGorKykgewotICAgICAgICAgICAgICAgIENIQVJTW2pdIHw9IE1BU0tfVkFMSUQgfCBNQVNLX0NPTlRFTlQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyByZW1vdmUgc3BlY2lhbCBjaGFyYWN0ZXJzCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3BlY2lhbENoYXIubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIENIQVJTW3NwZWNpYWxDaGFyW2ldXSA9IChieXRlKSAoQ0hBUlNbc3BlY2lhbENoYXJbaV1dICYgfk1BU0tfQ09OVEVOVCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBzZXQgc3BhY2UgY2hhcmFjdGVycwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNwYWNlQ2hhci5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgQ0hBUlNbc3BhY2VDaGFyW2ldXSB8PSBNQVNLX1NQQUNFOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gc2V0IG5hbWUgc3RhcnQgY2hhcmFjdGVycwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5hbWVTdGFydENoYXIubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIENIQVJTW25hbWVTdGFydENoYXJbaV1dIHw9IE1BU0tfTkFNRV9TVEFSVCB8IE1BU0tfTkFNRSB8Ci0gICAgICAgICAgICAgICAgICAgIE1BU0tfTkNOQU1FX1NUQVJUIHwgTUFTS19OQ05BTUU7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZXR0ZXJSYW5nZS5sZW5ndGg7IGkgKz0gMikgewotICAgICAgICAgICAgZm9yIChpbnQgaiA9IGxldHRlclJhbmdlW2ldOyBqIDw9IGxldHRlclJhbmdlW2kgKyAxXTsgaisrKSB7Ci0gICAgICAgICAgICAgICAgQ0hBUlNbal0gfD0gTUFTS19OQU1FX1NUQVJUIHwgTUFTS19OQU1FIHwKLSAgICAgICAgICAgICAgICAgICAgICAgIE1BU0tfTkNOQU1FX1NUQVJUIHwgTUFTS19OQ05BTUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZXR0ZXJDaGFyLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBDSEFSU1tsZXR0ZXJDaGFyW2ldXSB8PSBNQVNLX05BTUVfU1RBUlQgfCBNQVNLX05BTUUgfAotICAgICAgICAgICAgICAgICAgICBNQVNLX05DTkFNRV9TVEFSVCB8IE1BU0tfTkNOQU1FOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gc2V0IG5hbWUgY2hhcmFjdGVycwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5hbWVDaGFyLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBDSEFSU1tuYW1lQ2hhcltpXV0gfD0gTUFTS19OQU1FIHwgTUFTS19OQ05BTUU7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkaWdpdFJhbmdlLmxlbmd0aDsgaSArPSAyKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gZGlnaXRSYW5nZVtpXTsgaiA8PSBkaWdpdFJhbmdlW2kgKyAxXTsgaisrKSB7Ci0gICAgICAgICAgICAgICAgQ0hBUlNbal0gfD0gTUFTS19OQU1FIHwgTUFTS19OQ05BTUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb21iaW5pbmdDaGFyUmFuZ2UubGVuZ3RoOyBpICs9IDIpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSBjb21iaW5pbmdDaGFyUmFuZ2VbaV07IGogPD0gY29tYmluaW5nQ2hhclJhbmdlW2kgKyAxXTsgaisrKSB7Ci0gICAgICAgICAgICAgICAgQ0hBUlNbal0gfD0gTUFTS19OQU1FIHwgTUFTS19OQ05BTUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb21iaW5pbmdDaGFyQ2hhci5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgQ0hBUlNbY29tYmluaW5nQ2hhckNoYXJbaV1dIHw9IE1BU0tfTkFNRSB8IE1BU0tfTkNOQU1FOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5kZXJSYW5nZS5sZW5ndGg7IGkgKz0gMikgewotICAgICAgICAgICAgZm9yIChpbnQgaiA9IGV4dGVuZGVyUmFuZ2VbaV07IGogPD0gZXh0ZW5kZXJSYW5nZVtpICsgMV07IGorKykgewotICAgICAgICAgICAgICAgIENIQVJTW2pdIHw9IE1BU0tfTkFNRSB8IE1BU0tfTkNOQU1FOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5kZXJDaGFyLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBDSEFSU1tleHRlbmRlckNoYXJbaV1dIHw9IE1BU0tfTkFNRSB8IE1BU0tfTkNOQU1FOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gcmVtb3ZlICc6JyBmcm9tIGFsbG93YWJsZSBNQVNLX05DTkFNRV9TVEFSVCBhbmQgTUFTS19OQ05BTUUgY2hhcnMKLSAgICAgICAgQ0hBUlNbJzonXSAmPSB+KE1BU0tfTkNOQU1FX1NUQVJUIHwgTUFTS19OQ05BTUUpOwotCi0gICAgICAgIC8vIHNldCBQdWJpZCBjaGFyYWN0ZXJzCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHViaWRDaGFyLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBDSEFSU1twdWJpZENoYXJbaV1dIHw9IE1BU0tfUFVCSUQ7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwdWJpZFJhbmdlLmxlbmd0aDsgaSArPSAyKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gcHViaWRSYW5nZVtpXTsgaiA8PSBwdWJpZFJhbmdlW2kgKyAxXTsgaisrKSB7Ci0gICAgICAgICAgICAgICAgQ0hBUlNbal0gfD0gTUFTS19QVUJJRDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgfSAvLyA8Y2xpbml0PigpCi0KLSAgICAvLwotICAgIC8vIFB1YmxpYyBzdGF0aWMgbWV0aG9kcwotICAgIC8vCi0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgaXMgYSBzdXBwbGVtZW50YWwgY2hhcmFjdGVyLgotICAgICAqCi0gICAgICogQHBhcmFtIGMgVGhlIGNoYXJhY3RlciB0byBjaGVjay4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTdXBwbGVtZW50YWwoaW50IGMpIHsKLSAgICAgICAgcmV0dXJuIChjID49IDB4MTAwMDAgJiYgYyA8PSAweDEwRkZGRik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIHRoZSBzdXBwbGVtZW50YWwgY2hhcmFjdGVyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuCi0gICAgICogc3Vycm9nYXRlcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBoIFRoZSBoaWdoIHN1cnJvZ2F0ZS4KLSAgICAgKiBAcGFyYW0gbCBUaGUgbG93IHN1cnJvZ2F0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGludCBzdXBwbGVtZW50YWwoY2hhciBoLCBjaGFyIGwpIHsKLSAgICAgICAgcmV0dXJuIChoIC0gMHhEODAwKSAqIDB4NDAwICsgKGwgLSAweERDMDApICsgMHgxMDAwMDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBoaWdoIHN1cnJvZ2F0ZSBvZiBhIHN1cHBsZW1lbnRhbCBjaGFyYWN0ZXIKLSAgICAgKgotICAgICAqIEBwYXJhbSBjIFRoZSBzdXBwbGVtZW50YWwgY2hhcmFjdGVyIHRvICJzcGxpdCIuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjaGFyIGhpZ2hTdXJyb2dhdGUoaW50IGMpIHsKLSAgICAgICAgcmV0dXJuIChjaGFyKSAoKChjIC0gMHgwMDAxMDAwMCkgPj4gMTApICsgMHhEODAwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBsb3cgc3Vycm9nYXRlIG9mIGEgc3VwcGxlbWVudGFsIGNoYXJhY3RlcgotICAgICAqCi0gICAgICogQHBhcmFtIGMgVGhlIHN1cHBsZW1lbnRhbCBjaGFyYWN0ZXIgdG8gInNwbGl0Ii4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNoYXIgbG93U3Vycm9nYXRlKGludCBjKSB7Ci0gICAgICAgIHJldHVybiAoY2hhcikgKCgoYyAtIDB4MDAwMTAwMDApICYgMHgzRkYpICsgMHhEQzAwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIGNoYXJhY3RlciBpcyBhIGhpZ2ggc3Vycm9nYXRlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYyBUaGUgY2hhcmFjdGVyIHRvIGNoZWNrLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0hpZ2hTdXJyb2dhdGUoaW50IGMpIHsKLSAgICAgICAgcmV0dXJuICgweEQ4MDAgPD0gYyAmJiBjIDw9IDB4REJGRik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBjaGFyYWN0ZXIgaXMgYSBsb3cgc3Vycm9nYXRlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYyBUaGUgY2hhcmFjdGVyIHRvIGNoZWNrLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0xvd1N1cnJvZ2F0ZShpbnQgYykgewotICAgICAgICByZXR1cm4gKDB4REMwMCA8PSBjICYmIGMgPD0gMHhERkZGKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciBpcyB2YWxpZC4gVGhpcyBtZXRob2QKLSAgICAgKiBhbHNvIGNoZWNrcyB0aGUgc3Vycm9nYXRlIGNoYXJhY3RlciByYW5nZSBmcm9tIDB4MTAwMDAgdG8gMHgxMEZGRkYuCi0gICAgICogPHAvPgotICAgICAqIElmIHRoZSBwcm9ncmFtIGNob29zZXMgdG8gYXBwbHkgdGhlIG1hc2sgZGlyZWN0bHkgdG8gdGhlCi0gICAgICogPGNvZGU+Q0hBUlM8L2NvZGU+IGFycmF5LCB0aGVuIHRoZXkgYXJlIHJlc3BvbnNpYmxlIGZvciBjaGVja2luZwotICAgICAqIHRoZSBzdXJyb2dhdGUgY2hhcmFjdGVyIHJhbmdlLgotICAgICAqCi0gICAgICogQHBhcmFtIGMgVGhlIGNoYXJhY3RlciB0byBjaGVjay4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZChpbnQgYykgewotICAgICAgICByZXR1cm4gKGMgPCAweDEwMDAwICYmIChDSEFSU1tjXSAmIE1BU0tfVkFMSUQpICE9IDApIHx8Ci0gICAgICAgICAgICAgICAgKDB4MTAwMDAgPD0gYyAmJiBjIDw9IDB4MTBGRkZGKTsKLSAgICB9IC8vIGlzVmFsaWQoaW50KTpib29sZWFuCi0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgaXMgaW52YWxpZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjIFRoZSBjaGFyYWN0ZXIgdG8gY2hlY2suCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzSW52YWxpZChpbnQgYykgewotICAgICAgICByZXR1cm4gIWlzVmFsaWQoYyk7Ci0gICAgfSAvLyBpc0ludmFsaWQoaW50KTpib29sZWFuCi0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgY2FuIGJlIGNvbnNpZGVyZWQgY29udGVudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjIFRoZSBjaGFyYWN0ZXIgdG8gY2hlY2suCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQ29udGVudChpbnQgYykgewotICAgICAgICByZXR1cm4gKGMgPCAweDEwMDAwICYmIChDSEFSU1tjXSAmIE1BU0tfQ09OVEVOVCkgIT0gMCkgfHwKLSAgICAgICAgICAgICAgICAoMHgxMDAwMCA8PSBjICYmIGMgPD0gMHgxMEZGRkYpOwotICAgIH0gLy8gaXNDb250ZW50KGludCk6Ym9vbGVhbgotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIGNhbiBiZSBjb25zaWRlcmVkIG1hcmt1cC4KLSAgICAgKiBNYXJrdXAgY2hhcmFjdGVycyBpbmNsdWRlICcmbHQ7JywgJyZhbXA7JywgYW5kICclJy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjIFRoZSBjaGFyYWN0ZXIgdG8gY2hlY2suCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzTWFya3VwKGludCBjKSB7Ci0gICAgICAgIHJldHVybiBjID09ICc8JyB8fCBjID09ICcmJyB8fCBjID09ICclJzsKLSAgICB9IC8vIGlzTWFya3VwKGludCk6Ym9vbGVhbgotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIGlzIGEgc3BhY2UgY2hhcmFjdGVyCi0gICAgICogYXMgZGVmaW5lZCBieSBwcm9kdWN0aW9uIFszXSBpbiB0aGUgWE1MIDEuMCBzcGVjaWZpY2F0aW9uLgotICAgICAqCi0gICAgICogQHBhcmFtIGMgVGhlIGNoYXJhY3RlciB0byBjaGVjay4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTcGFjZShpbnQgYykgewotICAgICAgICByZXR1cm4gYyA8IDB4MTAwMDAgJiYgKENIQVJTW2NdICYgTUFTS19TUEFDRSkgIT0gMDsKLSAgICB9IC8vIGlzU3BhY2UoaW50KTpib29sZWFuCi0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgaXMgYSBzcGFjZSBjaGFyYWN0ZXIKLSAgICAgKiBhcyBhbWRlbmRlZCBpbiB0aGUgWE1MIDEuMSBzcGVjaWZpY2F0aW9uLgotICAgICAqCi0gICAgICogQHBhcmFtIGMgVGhlIGNoYXJhY3RlciB0byBjaGVjay4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNYTUwxMVNwYWNlKGludCBjKSB7Ci0gICAgICAgIHJldHVybiAoYyA8IDB4MTAwMDAgJiYgKENIQVJTW2NdICYgTUFTS19TUEFDRSkgIT0gMCkgfHwKLSAgICAgICAgICAgICAgICBjID09IDB4ODUgfHwgYyA9PSAweDIwMjg7Ci0gICAgfSAvLyBpc1hNTDExU3BhY2UoaW50KTpib29sZWFuCi0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgaXMgYSB2YWxpZCBuYW1lIHN0YXJ0Ci0gICAgICogY2hhcmFjdGVyIGFzIGRlZmluZWQgYnkgcHJvZHVjdGlvbiBbNV0gaW4gdGhlIFhNTCAxLjAKLSAgICAgKiBzcGVjaWZpY2F0aW9uLgotICAgICAqCi0gICAgICogQHBhcmFtIGMgVGhlIGNoYXJhY3RlciB0byBjaGVjay4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNOYW1lU3RhcnQoaW50IGMpIHsKLSAgICAgICAgcmV0dXJuIGMgPCAweDEwMDAwICYmIChDSEFSU1tjXSAmIE1BU0tfTkFNRV9TVEFSVCkgIT0gMDsKLSAgICB9IC8vIGlzTmFtZVN0YXJ0KGludCk6Ym9vbGVhbgotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIGlzIGEgdmFsaWQgbmFtZQotICAgICAqIGNoYXJhY3RlciBhcyBkZWZpbmVkIGJ5IHByb2R1Y3Rpb24gWzRdIGluIHRoZSBYTUwgMS4wCi0gICAgICogc3BlY2lmaWNhdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjIFRoZSBjaGFyYWN0ZXIgdG8gY2hlY2suCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzTmFtZShpbnQgYykgewotICAgICAgICByZXR1cm4gYyA8IDB4MTAwMDAgJiYgKENIQVJTW2NdICYgTUFTS19OQU1FKSAhPSAwOwotICAgIH0gLy8gaXNOYW1lKGludCk6Ym9vbGVhbgotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIGlzIGEgdmFsaWQgTkNOYW1lIHN0YXJ0Ci0gICAgICogY2hhcmFjdGVyIGFzIGRlZmluZWQgYnkgcHJvZHVjdGlvbiBbNF0gaW4gTmFtZXNwYWNlcyBpbiBYTUwKLSAgICAgKiByZWNvbW1lbmRhdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjIFRoZSBjaGFyYWN0ZXIgdG8gY2hlY2suCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzTkNOYW1lU3RhcnQoaW50IGMpIHsKLSAgICAgICAgcmV0dXJuIGMgPCAweDEwMDAwICYmIChDSEFSU1tjXSAmIE1BU0tfTkNOQU1FX1NUQVJUKSAhPSAwOwotICAgIH0gLy8gaXNOQ05hbWVTdGFydChpbnQpOmJvb2xlYW4KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciBpcyBhIHZhbGlkIE5DTmFtZQotICAgICAqIGNoYXJhY3RlciBhcyBkZWZpbmVkIGJ5IHByb2R1Y3Rpb24gWzVdIGluIE5hbWVzcGFjZXMgaW4gWE1MCi0gICAgICogcmVjb21tZW5kYXRpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYyBUaGUgY2hhcmFjdGVyIHRvIGNoZWNrLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc05DTmFtZShpbnQgYykgewotICAgICAgICByZXR1cm4gYyA8IDB4MTAwMDAgJiYgKENIQVJTW2NdICYgTUFTS19OQ05BTUUpICE9IDA7Ci0gICAgfSAvLyBpc05DTmFtZShpbnQpOmJvb2xlYW4KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciBpcyBhIHZhbGlkIFB1YmlkCi0gICAgICogY2hhcmFjdGVyIGFzIGRlZmluZWQgYnkgcHJvZHVjdGlvbiBbMTNdIGluIHRoZSBYTUwgMS4wCi0gICAgICogc3BlY2lmaWNhdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjIFRoZSBjaGFyYWN0ZXIgdG8gY2hlY2suCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUHViaWQoaW50IGMpIHsKLSAgICAgICAgcmV0dXJuIGMgPCAweDEwMDAwICYmIChDSEFSU1tjXSAmIE1BU0tfUFVCSUQpICE9IDA7Ci0gICAgfSAvLyBpc1B1YmlkKGludCk6Ym9vbGVhbgotCi0gICAgLyoKLSAgICAgKiBbNV0gTmFtZSA6Oj0gKExldHRlciB8ICdfJyB8ICc6JykgKE5hbWVDaGFyKSoKLSAgICAgKi8KLSAgICAvKioKLSAgICAgKiBDaGVjayB0byBzZWUgaWYgYSBzdHJpbmcgaXMgYSB2YWxpZCBOYW1lIGFjY29yZGluZyB0byBbNV0KLSAgICAgKiBpbiB0aGUgWE1MIDEuMCBSZWNvbW1lbmRhdGlvbgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgc3RyaW5nIHRvIGNoZWNrCi0gICAgICogQHJldHVybiB0cnVlIGlmIG5hbWUgaXMgYSB2YWxpZCBOYW1lCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWROYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIGlmIChuYW1lLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBjaGFyIGNoID0gbmFtZS5jaGFyQXQoMCk7Ci0gICAgICAgIGlmICghaXNOYW1lU3RhcnQoY2gpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBuYW1lLmxlbmd0aCgpOyBpKyspIHsKLSAgICAgICAgICAgIGNoID0gbmFtZS5jaGFyQXQoaSk7Ci0gICAgICAgICAgICBpZiAoIWlzTmFtZShjaCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfSAvLyBpc1ZhbGlkTmFtZShTdHJpbmcpOmJvb2xlYW4KLQotCi0gICAgLyoKLSAgICAgKiBmcm9tIHRoZSBuYW1lc3BhY2UgcmVjCi0gICAgICogWzRdIE5DTmFtZSA6Oj0gKExldHRlciB8ICdfJykgKE5DTmFtZUNoYXIpKgotICAgICAqLwotICAgIC8qKgotICAgICAqIENoZWNrIHRvIHNlZSBpZiBhIHN0cmluZyBpcyBhIHZhbGlkIE5DTmFtZSBhY2NvcmRpbmcgdG8gWzRdCi0gICAgICogZnJvbSB0aGUgWE1MIE5hbWVzcGFjZXMgMS4wIFJlY29tbWVuZGF0aW9uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmNOYW1lIHN0cmluZyB0byBjaGVjawotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBuYW1lIGlzIGEgdmFsaWQgTkNOYW1lCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWROQ05hbWUoU3RyaW5nIG5jTmFtZSkgewotICAgICAgICBpZiAobmNOYW1lLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBjaGFyIGNoID0gbmNOYW1lLmNoYXJBdCgwKTsKLSAgICAgICAgaWYgKCFpc05DTmFtZVN0YXJ0KGNoKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgbmNOYW1lLmxlbmd0aCgpOyBpKyspIHsKLSAgICAgICAgICAgIGNoID0gbmNOYW1lLmNoYXJBdChpKTsKLSAgICAgICAgICAgIGlmICghaXNOQ05hbWUoY2gpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0gLy8gaXNWYWxpZE5DTmFtZShTdHJpbmcpOmJvb2xlYW4KLQotICAgIC8qCi0gICAgICogWzddIE5tdG9rZW4gOjo9IChOYW1lQ2hhcikrCi0gICAgICovCi0gICAgLyoqCi0gICAgICogQ2hlY2sgdG8gc2VlIGlmIGEgc3RyaW5nIGlzIGEgdmFsaWQgTm10b2tlbiBhY2NvcmRpbmcgdG8gWzddCi0gICAgICogaW4gdGhlIFhNTCAxLjAgUmVjb21tZW5kYXRpb24KLSAgICAgKgotICAgICAqIEBwYXJhbSBubXRva2VuIHN0cmluZyB0byBjaGVjawotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBubXRva2VuIGlzIGEgdmFsaWQgTm10b2tlbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkTm10b2tlbihTdHJpbmcgbm10b2tlbikgewotICAgICAgICBpZiAobm10b2tlbi5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBubXRva2VuLmxlbmd0aCgpOyBpKyspIHsKLSAgICAgICAgICAgIGNoYXIgY2ggPSBubXRva2VuLmNoYXJBdChpKTsKLSAgICAgICAgICAgIGlmICghIGlzTmFtZShjaCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfSAvLyBpc1ZhbGlkTmFtZShTdHJpbmcpOmJvb2xlYW4KLQotICAgIC8vIGVuY29kaW5ncwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBlbmNvZGluZyBuYW1lIGlzIGEgdmFsaWQgSUFOQSBlbmNvZGluZy4KLSAgICAgKiBUaGlzIG1ldGhvZCBkb2VzIG5vdCB2ZXJpZnkgdGhhdCB0aGVyZSBpcyBhIGRlY29kZXIgYXZhaWxhYmxlCi0gICAgICogZm9yIHRoaXMgZW5jb2RpbmcsIG9ubHkgdGhhdCB0aGUgY2hhcmFjdGVycyBhcmUgdmFsaWQgZm9yIGFuCi0gICAgICogSUFOQSBlbmNvZGluZyBuYW1lLgotICAgICAqCi0gICAgICogQHBhcmFtIGlhbmFFbmNvZGluZyBUaGUgSUFOQSBlbmNvZGluZyBuYW1lLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkSUFOQUVuY29kaW5nKFN0cmluZyBpYW5hRW5jb2RpbmcpIHsKLSAgICAgICAgaWYgKGlhbmFFbmNvZGluZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnQgbGVuZ3RoID0gaWFuYUVuY29kaW5nLmxlbmd0aCgpOwotICAgICAgICAgICAgaWYgKGxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgICAgICBjaGFyIGMgPSBpYW5hRW5jb2RpbmcuY2hhckF0KDApOwotICAgICAgICAgICAgICAgIGlmICgoYyA+PSAnQScgJiYgYyA8PSAnWicpIHx8IChjID49ICdhJyAmJiBjIDw9ICd6JykpIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBsZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgYyA9IGlhbmFFbmNvZGluZy5jaGFyQXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGMgPCAnQScgfHwgYyA+ICdaJykgJiYgKGMgPCAnYScgfHwgYyA+ICd6JykgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGMgPCAnMCcgfHwgYyA+ICc5JykgJiYgYyAhPSAnLicgJiYgYyAhPSAnXycgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyAhPSAnLScpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9IC8vIGlzVmFsaWRJQU5BRW5jb2RpbmcoU3RyaW5nKTpib29sZWFuCi0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGVuY29kaW5nIG5hbWUgaXMgYSB2YWxpZCBKYXZhIGVuY29kaW5nLgotICAgICAqIFRoaXMgbWV0aG9kIGRvZXMgbm90IHZlcmlmeSB0aGF0IHRoZXJlIGlzIGEgZGVjb2RlciBhdmFpbGFibGUKLSAgICAgKiBmb3IgdGhpcyBlbmNvZGluZywgb25seSB0aGF0IHRoZSBjaGFyYWN0ZXJzIGFyZSB2YWxpZCBmb3IgYW4KLSAgICAgKiBKYXZhIGVuY29kaW5nIG5hbWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gamF2YUVuY29kaW5nIFRoZSBKYXZhIGVuY29kaW5nIG5hbWUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRKYXZhRW5jb2RpbmcoU3RyaW5nIGphdmFFbmNvZGluZykgewotICAgICAgICBpZiAoamF2YUVuY29kaW5nICE9IG51bGwpIHsKLSAgICAgICAgICAgIGludCBsZW5ndGggPSBqYXZhRW5jb2RpbmcubGVuZ3RoKCk7Ci0gICAgICAgICAgICBpZiAobGVuZ3RoID4gMCkgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgbGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgY2hhciBjID0gamF2YUVuY29kaW5nLmNoYXJBdChpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChjIDwgJ0EnIHx8IGMgPiAnWicpICYmIChjIDwgJ2EnIHx8IGMgPiAneicpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGMgPCAnMCcgfHwgYyA+ICc5JykgJiYgYyAhPSAnLicgJiYgYyAhPSAnXycgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjICE9ICctJykgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9IC8vIGlzVmFsaWRJQU5BRW5jb2RpbmcoU3RyaW5nKTpib29sZWFuCi0KLX0gLy8gY2xhc3MgWE1MQ2hhcgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvWE1MUHJldHR5UHJpbnRlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvWE1MUHJldHR5UHJpbnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjM5MTAxLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi91dGlsL1hNTFByZXR0eVByaW50ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudXRpbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uYXR0YWNobWVudHMudXRpbHMuSU9VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uRXJyb3JMaXN0ZW5lcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRlbXBsYXRlczsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVNvdXJjZTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotCi0vKioKLSAqIEFuIFhNTCBwcmV0dHkgcHJpbnRlciBiYXNlZCBvbiB4c2wgc3R5bGVzaGVldHMKLSAqLwotcHVibGljIGNsYXNzIFhNTFByZXR0eVByaW50ZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFhNTFByZXR0eVByaW50ZXIuY2xhc3MpOwotCi0gICAgLyoqCi0gICAgICogUHJldHR5IHByaW50cyBjb250ZW50cyBvZiB0aGUgeG1sIGZpbGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZmlsZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwcmV0dGlmeShmaW5hbCBGaWxlIGZpbGUpIHsKLSAgICAgICAgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBudWxsOwotICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSA9IG51bGw7Ci0gICAgICAgIGJ5dGVbXSBieXRlQXJyYXkgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnl0ZUFycmF5ID0gSU9VdGlscy5nZXRTdHJlYW1Bc0J5dGVBcnJheShuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpKTsKLSAgICAgICAgICAgIGlucHV0U3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVBcnJheSk7Ci0gICAgICAgICAgICBvdXRwdXRTdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlKTsKLQotICAgICAgICAgICAgU291cmNlIHN0eWxlc2hlZXRTb3VyY2UgPSBuZXcgU3RyZWFtU291cmNlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShwcmV0dHlQcmludFN0eWxlc2hlZXQuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgU291cmNlIHhtbFNvdXJjZSA9IG5ldyBTdHJlYW1Tb3VyY2UoaW5wdXRTdHJlYW0pOwotCi0gICAgICAgICAgICBUcmFuc2Zvcm1lckZhY3RvcnkgdGYgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIFRlbXBsYXRlcyB0ZW1wbGF0ZXMgPSB0Zi5uZXdUZW1wbGF0ZXMoc3R5bGVzaGVldFNvdXJjZSk7Ci0gICAgICAgICAgICBUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IHRlbXBsYXRlcy5uZXdUcmFuc2Zvcm1lcigpOwotICAgICAgICAgICAgdHJhbnNmb3JtZXIuc2V0RXJyb3JMaXN0ZW5lcihuZXcgRXJyb3JMaXN0ZW5lcigpewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdhcm5pbmcoVHJhbnNmb3JtZXJFeGNlcHRpb24gZXhjZXB0aW9uKSB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICBsb2cud2FybigiRXhjZXB0aW9uIG9jY3VycmVkIHdoaWxlIHRyeWluZyB0byBwcmV0dHkgcHJpbnQgZmlsZSAiICsgZmlsZSwgZXhjZXB0aW9uKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBlcnJvcihUcmFuc2Zvcm1lckV4Y2VwdGlvbiBleGNlcHRpb24pIHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiRXhjZXB0aW9uIG9jY3VycmVkIHdoaWxlIHRyeWluZyB0byBwcmV0dHkgcHJpbnQgZmlsZSAiICsgZmlsZSwgZXhjZXB0aW9uKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBmYXRhbEVycm9yKFRyYW5zZm9ybWVyRXhjZXB0aW9uIGV4Y2VwdGlvbikgdGhyb3dzIFRyYW5zZm9ybWVyRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKCJFeGNlcHRpb24gb2NjdXJyZWQgd2hpbGUgdHJ5aW5nIHRvIHByZXR0eSBwcmludCBmaWxlICIgKyBmaWxlLCBleGNlcHRpb24pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKHhtbFNvdXJjZSwgbmV3IFN0cmVhbVJlc3VsdChvdXRwdXRTdHJlYW0pKTsKLQotICAgICAgICAgICAgaW5wdXRTdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgIG91dHB1dFN0cmVhbS5jbG9zZSgpOwotICAgICAgICAgICAgbG9nLmRlYnVnKCJQcmV0dHkgcHJpbnRlZCBmaWxlIDogIiArIGZpbGUpOwotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJFeGNlcHRpb24gb2NjdXJyZWQgd2hpbGUgdHJ5aW5nIHRvIHByZXR0eSBwcmludCBmaWxlICIgKyBmaWxlLCB0KTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaWYgKGJ5dGVBcnJheSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG91dHB1dFN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUpOwotICAgICAgICAgICAgICAgICAgICBvdXRwdXRTdHJlYW0ud3JpdGUoYnl0ZUFycmF5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChpbnB1dFN0cmVhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgaW5wdXRTdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG91dHB1dFN0cmVhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHByZXR0eVByaW50U3R5bGVzaGVldCA9Ci0gICAgICAgICAgICAgICAgICAgICAiPHhzbDpzdHlsZXNoZWV0IHhtbG5zOnhzbD0naHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtJyB2ZXJzaW9uPScxLjAnICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHhtbG5zOnhhbGFuPSdodHRwOi8veG1sLmFwYWNoZS5vcmcveHNsdCcgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZXhjbHVkZS1yZXN1bHQtcHJlZml4ZXM9J3hhbGFuJz4iICsKLSAgICAgICAgICAgICAgICAgICAgICIgIDx4c2w6b3V0cHV0IG1ldGhvZD0neG1sJyBpbmRlbnQ9J3llcycgeGFsYW46aW5kZW50LWFtb3VudD0nNCcvPiIgKwotICAgICAgICAgICAgICAgICAgICAgIiAgPHhzbDpzdHJpcC1zcGFjZSBlbGVtZW50cz0nKicvPiIgKwotICAgICAgICAgICAgICAgICAgICAgIiAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0nLyc+IiArCi0gICAgICAgICAgICAgICAgICAgICAiICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4iICsKLSAgICAgICAgICAgICAgICAgICAgICIgIDwveHNsOnRlbXBsYXRlPiIgKwotICAgICAgICAgICAgICAgICAgICAgIiAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0nbm9kZSgpIHwgQConPiIgKwotICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgPHhzbDpjb3B5PiIgKwotICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9J25vZGUoKSB8IEAqJy8+IiArCi0gICAgICAgICAgICAgICAgICAgICAiICAgICAgICA8L3hzbDpjb3B5PiIgKwotICAgICAgICAgICAgICAgICAgICAgIiAgPC94c2w6dGVtcGxhdGU+IiArCi0gICAgICAgICAgICAgICAgICAgICAiPC94c2w6c3R5bGVzaGVldD4iOwotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHByZXR0aWZ5KE9NRWxlbWVudCB3c2RsRWxlbWVudCwgT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICB3c2RsRWxlbWVudC5zZXJpYWxpemUoYmFvcyk7Ci0KLSAgICAgICAgU291cmNlIHN0eWxlc2hlZXRTb3VyY2UgPSBuZXcgU3RyZWFtU291cmNlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShwcmV0dHlQcmludFN0eWxlc2hlZXQuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICBTb3VyY2UgeG1sU291cmNlID0gbmV3IFN0cmVhbVNvdXJjZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7Ci0KLSAgICAgICAgVHJhbnNmb3JtZXJGYWN0b3J5IHRmID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIFRlbXBsYXRlcyB0ZW1wbGF0ZXMgPSB0Zi5uZXdUZW1wbGF0ZXMoc3R5bGVzaGVldFNvdXJjZSk7Ci0gICAgICAgIFRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gdGVtcGxhdGVzLm5ld1RyYW5zZm9ybWVyKCk7Ci0gICAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybSh4bWxTb3VyY2UsIG5ldyBTdHJlYW1SZXN1bHQob3V0KSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvWE1MVXRpbHMuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi91dGlsL1hNTFV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjODU2ZjAuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvWE1MVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudXRpbDsKLQotaW1wb3J0IGNvbS5pYm0ud3NkbC5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTm9kZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuYnVpbGRlci5TdEFYT01CdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5CYXNlNjQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS51dGlsLlN0QVhVdGlsczsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkNoYXJhY3RlckRhdGE7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcueG1sLnNheC5FcnJvckhhbmRsZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlhNTFJlYWRlcjsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlJlc3VsdDsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0Lkh0dHBVUkxDb25uZWN0aW9uOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5Qcm90b2NvbEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uZXQuVVJMQ29ubmVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci0KLQotcHVibGljIGNsYXNzIFhNTFV0aWxzIHsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjaGFyRW5jb2RpbmcgPSAiSVNPLTg4NTktMSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHNheFBhcnNlckZhY3RvcnlQcm9wZXJ0eSA9Ci0gICAgICAgICAgICAiamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeSI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGRiZiA9IGdldERPTUZhY3RvcnkoKTsKLSAgICBwcml2YXRlIHN0YXRpYyBTQVhQYXJzZXJGYWN0b3J5IHNheEZhY3Rvcnk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgU3RhY2sgc2F4UGFyc2VycyA9IG5ldyBTdGFjaygpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGVtcHR5ID0gIiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmFpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShlbXB0eS5nZXRCeXRlcygpKTsKLQotICAgIHN0YXRpYyB7Ci0gICAgICAgIC8vIEluaXRpYWxpemUgU0FYIFBhcnNlciBmYWN0b3J5IGRlZmF1bHRzCi0gICAgICAgIGluaXRTQVhGYWN0b3J5KG51bGwsIHRydWUsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbml0aWFsaXplcyB0aGUgU0FYIHBhcnNlciBmYWN0b3J5LgotICAgICAqCi0gICAgICogQHBhcmFtIGZhY3RvcnlDbGFzc05hbWUgVGhlIChvcHRpb25hbCkgY2xhc3MgbmFtZSBvZiB0aGUgZGVzaXJlZAotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIFNBWFBhcnNlckZhY3RvcnkgaW1wbGVtZW50YXRpb24uIFdpbGwgYmUKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBhc3NpZ25lZCB0byB0aGUgc3lzdGVtIHByb3BlcnR5Ci0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgPGI+amF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeTwvYj4KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICB1bmxlc3MgdGhpcyBwcm9wZXJ0eSBpcyBhbHJlYWR5IHNldC4KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBJZiA8Y29kZT5udWxsPC9jb2RlPiwgbGVhdmVzIGN1cnJlbnQgc2V0dGluZwotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIGFsb25lLgotICAgICAqIEBwYXJhbSBuYW1lc3BhY2VBd2FyZSAgIHRydWUgaWYgd2Ugd2FudCBhIG5hbWVzcGFjZS1hd2FyZSBwYXJzZXIKLSAgICAgKiBAcGFyYW0gdmFsaWRhdGluZyAgICAgICB0cnVlIGlmIHdlIHdhbnQgYSB2YWxpZGF0aW5nIHBhcnNlcgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBpbml0U0FYRmFjdG9yeShTdHJpbmcgZmFjdG9yeUNsYXNzTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBuYW1lc3BhY2VBd2FyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiB2YWxpZGF0aW5nKSB7Ci0gICAgICAgIGlmIChmYWN0b3J5Q2xhc3NOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgc2F4RmFjdG9yeSA9IChTQVhQYXJzZXJGYWN0b3J5KSBMb2FkZXIubG9hZENsYXNzKGZhY3RvcnlDbGFzc05hbWUpLgotICAgICAgICAgICAgICAgICAgICAgICAgbmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAqIFNldCB0aGUgc3lzdGVtIHByb3BlcnR5IG9ubHkgaWYgaXQgaXMgbm90IGFscmVhZHkgc2V0IHRvCi0gICAgICAgICAgICAgICAgICogYXZvaWQgY29ycnVwdGluZyBlbnZpcm9ubWVudHMgaW4gd2hpY2ggQXhpcyBpcyBlbWJlZGRlZC4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBpZiAoU3lzdGVtLmdldFByb3BlcnR5KHNheFBhcnNlckZhY3RvcnlQcm9wZXJ0eSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoc2F4UGFyc2VyRmFjdG9yeVByb3BlcnR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yeUNsYXNzTmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBzYXhGYWN0b3J5ID0gU0FYUGFyc2VyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc2F4RmFjdG9yeSA9IFNBWFBhcnNlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgfQotICAgICAgICBzYXhGYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKG5hbWVzcGFjZUF3YXJlKTsKLSAgICAgICAgc2F4RmFjdG9yeS5zZXRWYWxpZGF0aW5nKHZhbGlkYXRpbmcpOwotCi0gICAgICAgIC8vIERpc2NhcmQgZXhpc3RpbmcgcGFyc2VycwotICAgICAgICBzYXhQYXJzZXJzLmNsZWFyKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBnZXRET01GYWN0b3J5KCkgewotICAgICAgICBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGRiZjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGRiZiA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIGRiZi5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vbG9nLmVycm9yKE1lc3NhZ2VzLmdldE1lc3NhZ2UoImV4Y2VwdGlvbjAwIiksIGUgKTsKLSAgICAgICAgICAgIGRiZiA9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIChkYmYpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gdHJ5UmVzZXQgPSB0cnVlOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIFNBWCBwYXJzZXIgZm9yIHJldXNlLgotICAgICAqCi0gICAgICogQHBhcmFtIHBhcnNlciBBIFNBWCBwYXJzZXIgdGhhdCBpcyBhdmFpbGFibGUgZm9yIHJldXNlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlbGVhc2VTQVhQYXJzZXIoU0FYUGFyc2VyIHBhcnNlcikgewotICAgICAgICBpZiAoIXRyeVJlc2V0KSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvL0ZyZWUgdXAgcG9zc2libGUgcmVmLiBoZWxkIGJ5IHBhc3QgY29udGVudGhhbmRsZXIuCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBYTUxSZWFkZXIgeG1sUmVhZGVyID0gcGFyc2VyLmdldFhNTFJlYWRlcigpOwotICAgICAgICAgICAgaWYgKG51bGwgIT0geG1sUmVhZGVyKSB7Ci0gICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChYTUxVdGlscy5jbGFzcykgewotICAgICAgICAgICAgICAgICAgICBzYXhQYXJzZXJzLnB1c2gocGFyc2VyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRyeVJlc2V0ID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0cnlSZXNldCA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhbiBlbXB0eSBuZXcgRG9jdW1lbnQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgRG9jdW1lbnQuCi0gICAgICogQHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGlmIGNvbnN0cnVjdGlvbiBwcm9ibGVtcyBvY2N1cgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgRG9jdW1lbnQgbmV3RG9jdW1lbnQoKQotICAgICAgICAgICAgdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gewotICAgICAgICBzeW5jaHJvbml6ZWQgKGRiZikgewotICAgICAgICAgICAgcmV0dXJuIGRiZi5uZXdEb2N1bWVudEJ1aWxkZXIoKS5uZXdEb2N1bWVudCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhIG5ldyBEb2N1bWVudCByZWFkIGZyb20gdGhlIGlucHV0IHNvdXJjZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gUmV0dXJucyBEb2N1bWVudC4KLSAgICAgKiBAdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gaWYgY29uc3RydWN0aW9uIHByb2JsZW1zIG9jY3VyCi0gICAgICogQHRocm93cyBTQVhFeGNlcHRpb24gICAgICAgICAgICAgICAgIGlmIHRoZSBkb2N1bWVudCBoYXMgeG1sIHNheCBwcm9ibGVtcwotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gICAgICAgICAgICAgICAgICBpZiBpL28gZXhjZXB0aW9ucyBvY2N1cgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgRG9jdW1lbnQgbmV3RG9jdW1lbnQoSW5wdXRTb3VyY2UgaW5wKQotICAgICAgICAgICAgdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotICAgICAgICBEb2N1bWVudEJ1aWxkZXIgZGI7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoZGJmKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGRiID0gZGJmLm5ld0RvY3VtZW50QnVpbGRlcigpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpewotICAgICAgICAgICAgICAgIC8vIFVuZGVyIHNvbWUgcGVjdWxpYXIgY29uZGl0aW9ucyAoY2xhc3Nsb2FkZXIgaXNzdWVzKSwganVzdCBzY3JhcCB0aGUgb2xkIGRiZiwgY3JlYXRlIGEgbmV3IG9uZSBhbmQgdHJ5IGFnYWluLgotICAgICAgICAgICAgICAgIGRiZiA9IGdldERPTUZhY3RvcnkoKTsKLSAgICAgICAgICAgICAgICBkYiA9IGRiZi5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBkYi5zZXRFbnRpdHlSZXNvbHZlcihuZXcgRGVmYXVsdEVudGl0eVJlc29sdmVyKCkpOwotICAgICAgICBkYi5zZXRFcnJvckhhbmRsZXIobmV3IFBhcnNlckVycm9ySGFuZGxlcigpKTsKLSAgICAgICAgcmV0dXJuIChkYi5wYXJzZShpbnApKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGEgbmV3IERvY3VtZW50IHJlYWQgZnJvbSB0aGUgaW5wdXQgc3RyZWFtCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgRG9jdW1lbnQuCi0gICAgICogQHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGlmIGNvbnN0cnVjdGlvbiBwcm9ibGVtcyBvY2N1cgotICAgICAqIEB0aHJvd3MgU0FYRXhjZXB0aW9uICAgICAgICAgICAgICAgICBpZiB0aGUgZG9jdW1lbnQgaGFzIHhtbCBzYXggcHJvYmxlbXMKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uICAgICAgICAgICAgICAgICAgaWYgaS9vIGV4Y2VwdGlvbnMgb2NjdXIKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIERvY3VtZW50IG5ld0RvY3VtZW50KElucHV0U3RyZWFtIGlucCkKLSAgICAgICAgICAgIHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIFhNTFV0aWxzLm5ld0RvY3VtZW50KG5ldyBJbnB1dFNvdXJjZShpbnApKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGEgbmV3IERvY3VtZW50IHJlYWQgZnJvbSB0aGUgaW5kaWNhdGVkIHVyaQotICAgICAqCi0gICAgICogQHJldHVybiBSZXR1cm5zIERvY3VtZW50LgotICAgICAqIEB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBpZiBjb25zdHJ1Y3Rpb24gcHJvYmxlbXMgb2NjdXIKLSAgICAgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbiAgICAgICAgICAgICAgICAgaWYgdGhlIGRvY3VtZW50IGhhcyB4bWwgc2F4IHByb2JsZW1zCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiAgICAgICAgICAgICAgICAgIGlmIGkvbyBleGNlcHRpb25zIG9jY3VyCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBEb2N1bWVudCBuZXdEb2N1bWVudChTdHJpbmcgdXJpKQotICAgICAgICAgICAgdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotICAgICAgICAvLyBjYWxsIHRoZSBhdXRoZW50aWNhdGVkIHZlcnNpb24gYXMgdGhlcmUgbWlnaHQgYmUgCi0gICAgICAgIC8vIHVzZXJuYW1lL3Bhc3N3b3JkIGluZm8gZW1iZWRlZCBpbiB0aGUgdXJpLgotICAgICAgICByZXR1cm4gWE1MVXRpbHMubmV3RG9jdW1lbnQodXJpLCBudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGRvY3VtZW50IGZyb20gdGhlIGdpdmVuIFVSSS4gVXNlcyB0aGUgdXNlcm5hbWUgYW5kIHBhc3N3b3JkCi0gICAgICogaWYgdGhlIFVSSSByZXF1aXJlcyBhdXRoZW50aWNhdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSB1cmkgICAgICB0aGUgcmVzb3VyY2UgdG8gZ2V0Ci0gICAgICogQHBhcmFtIHVzZXJuYW1lIGJhc2ljIGF1dGggdXNlcm5hbWUKLSAgICAgKiBAcGFyYW0gcGFzc3dvcmQgYmFzaWMgYXV0aCBwYXNzd29yZAotICAgICAqIEB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBpZiBjb25zdHJ1Y3Rpb24gcHJvYmxlbXMgb2NjdXIKLSAgICAgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbiAgICAgICAgICAgICAgICAgaWYgdGhlIGRvY3VtZW50IGhhcyB4bWwgc2F4IHByb2JsZW1zCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiAgICAgICAgICAgICAgICAgIGlmIGkvbyBleGNlcHRpb25zIG9jY3VyCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBEb2N1bWVudCBuZXdEb2N1bWVudChTdHJpbmcgdXJpLCBTdHJpbmcgdXNlcm5hbWUsIFN0cmluZyBwYXNzd29yZCkKLSAgICAgICAgICAgIHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAgICAgSW5wdXRTb3VyY2UgaW5zID0gWE1MVXRpbHMuZ2V0SW5wdXRTb3VyY2VGcm9tVVJJKHVyaSwgdXNlcm5hbWUsIHBhc3N3b3JkKTsKLSAgICAgICAgRG9jdW1lbnQgZG9jID0gWE1MVXRpbHMubmV3RG9jdW1lbnQoaW5zKTsKLSAgICAgICAgLy8gQ2xvc2UgdGhlIFN0cmVhbQotICAgICAgICBpZiAoaW5zLmdldEJ5dGVTdHJlYW0oKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnMuZ2V0Qnl0ZVN0cmVhbSgpLmNsb3NlKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoaW5zLmdldENoYXJhY3RlclN0cmVhbSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlucy5nZXRDaGFyYWN0ZXJTdHJlYW0oKS5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBkb2M7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQcmVmaXgoU3RyaW5nIHVyaSwgTm9kZSBlKSB7Ci0gICAgICAgIHdoaWxlIChlICE9IG51bGwgJiYgKGUuZ2V0Tm9kZVR5cGUoKSA9PSBFbGVtZW50LkVMRU1FTlRfTk9ERSkpIHsKLSAgICAgICAgICAgIE5hbWVkTm9kZU1hcCBhdHRycyA9IGUuZ2V0QXR0cmlidXRlcygpOwotICAgICAgICAgICAgZm9yIChpbnQgbiA9IDA7IG4gPCBhdHRycy5nZXRMZW5ndGgoKTsgbisrKSB7Ci0gICAgICAgICAgICAgICAgQXR0ciBhID0gKEF0dHIpIGF0dHJzLml0ZW0obik7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG5hbWU7Ci0gICAgICAgICAgICAgICAgaWYgKChuYW1lID0gYS5nZXROYW1lKCkpLnN0YXJ0c1dpdGgoInhtbG5zOiIpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBhLmdldE5vZGVWYWx1ZSgpLmVxdWFscyh1cmkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuYW1lLnN1YnN0cmluZyg2KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlID0gZS5nZXRQYXJlbnROb2RlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlKFN0cmluZyBwcmVmaXgsIE5vZGUgZSkgewotICAgICAgICB3aGlsZSAoZSAhPSBudWxsICYmIChlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpKSB7Ci0gICAgICAgICAgICBBdHRyIGF0dHIgPQotICAgICAgICAgICAgICAgICAgICAoKEVsZW1lbnQpIGUpLmdldEF0dHJpYnV0ZU5vZGVOUyhDb25zdGFudHMuTlNfVVJJX1hNTE5TLCBwcmVmaXgpOwotICAgICAgICAgICAgaWYgKGF0dHIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBhdHRyLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlID0gZS5nZXRQYXJlbnROb2RlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIFFOYW1lIHdoZW4gcGFzc2VkIGEgc3RyaW5nIGxpa2UgImZvbzpiYXIiIGJ5IG1hcHBpbmcKLSAgICAgKiB0aGUgImZvbyIgcHJlZml4IHRvIGEgbmFtZXNwYWNlIGluIHRoZSBjb250ZXh0IG9mIHRoZSBnaXZlbiBOb2RlLgotICAgICAqCi0gICAgICogQHJldHVybiBSZXR1cm5zIGEgUU5hbWUgZ2VuZXJhdGVkIGZyb20gdGhlIGdpdmVuIHN0cmluZyByZXByZXNlbnRhdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFFOYW1lIGdldFFOYW1lRnJvbVN0cmluZyhTdHJpbmcgc3RyLCBOb2RlIGUpIHsKLSAgICAgICAgaWYgKHN0ciA9PSBudWxsIHx8IGUgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgaWR4ID0gc3RyLmluZGV4T2YoJzonKTsKLSAgICAgICAgaWYgKGlkeCA+IC0xKSB7Ci0gICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gc3RyLnN1YnN0cmluZygwLCBpZHgpOwotICAgICAgICAgICAgU3RyaW5nIG5zID0gZ2V0TmFtZXNwYWNlKHByZWZpeCwgZSk7Ci0gICAgICAgICAgICBpZiAobnMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG5ldyBRTmFtZShucywgc3RyLnN1YnN0cmluZyhpZHggKyAxKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFFOYW1lKCIiLCBzdHIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIHN0cmluZyBmb3IgYSBwYXJ0aWN1bGFyIFFOYW1lLCBtYXBwaW5nIGEgbmV3IHByZWZpeAotICAgICAqIGlmIG5lY2Vzc2FyeS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmdGb3JRTmFtZShRTmFtZSBxbmFtZSwgRWxlbWVudCBlKSB7Ci0gICAgICAgIFN0cmluZyB1cmkgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgU3RyaW5nIHByZWZpeCA9IGdldFByZWZpeCh1cmksIGUpOwotICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgIGludCBpID0gMTsKLSAgICAgICAgICAgIHByZWZpeCA9ICJucyIgKyBpOwotICAgICAgICAgICAgd2hpbGUgKGdldE5hbWVzcGFjZShwcmVmaXgsIGUpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICAgICAgcHJlZml4ID0gIm5zIiArIGk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlLnNldEF0dHJpYnV0ZU5TKENvbnN0YW50cy5OU19VUklfWE1MTlMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ4bWxuczoiICsgcHJlZml4LCB1cmkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwcmVmaXggKyAiOiIgKyBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25jYXRpbmF0ZXMgYWxsIHRoZSB0ZXh0IGFuZCBjZGF0YSBub2RlIGNoaWxkcmVuIG9mIHRoaXMgZWxlbSBhbmQgcmV0dXJucwotICAgICAqIHRoZSByZXN1bHRpbmcgdGV4dC4KLSAgICAgKiAoYnkgTWF0dCBEdWZ0bGVyKQotICAgICAqCi0gICAgICogQHBhcmFtIHBhcmVudEVsIHRoZSBlbGVtZW50IHdob3NlIGNkYXRhL3RleHQgbm9kZSB2YWx1ZXMgYXJlIHRvCi0gICAgICogICAgICAgICAgICAgICAgIGJlIGNvbWJpbmVkLgotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgY29uY2F0aW5hdGVkIHN0cmluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDaGlsZENoYXJhY3RlckRhdGEoRWxlbWVudCBwYXJlbnRFbCkgewotICAgICAgICBpZiAocGFyZW50RWwgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgTm9kZSB0ZW1wTm9kZSA9IHBhcmVudEVsLmdldEZpcnN0Q2hpbGQoKTsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHN0ckJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgQ2hhcmFjdGVyRGF0YSBjaGFyRGF0YTsKLQotICAgICAgICB3aGlsZSAodGVtcE5vZGUgIT0gbnVsbCkgewotICAgICAgICAgICAgc3dpdGNoICh0ZW1wTm9kZS5nZXROb2RlVHlwZSgpKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBOb2RlLlRFWFRfTk9ERSA6Ci0gICAgICAgICAgICAgICAgY2FzZSBOb2RlLkNEQVRBX1NFQ1RJT05fTk9ERToKLSAgICAgICAgICAgICAgICAgICAgY2hhckRhdGEgPSAoQ2hhcmFjdGVyRGF0YSkgdGVtcE5vZGU7Ci0gICAgICAgICAgICAgICAgICAgIHN0ckJ1Zi5hcHBlbmQoY2hhckRhdGEuZ2V0RGF0YSgpKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0ZW1wTm9kZSA9IHRlbXBOb2RlLmdldE5leHRTaWJsaW5nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0ckJ1Zi50b1N0cmluZygpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUGFyc2VyRXJyb3JIYW5kbGVyIGltcGxlbWVudHMgRXJyb3JIYW5kbGVyIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgYSBzdHJpbmcgZGVzY3JpYmluZyBwYXJzZSBleGNlcHRpb24gZGV0YWlscwotICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0UGFyc2VFeGNlcHRpb25JbmZvKFNBWFBhcnNlRXhjZXB0aW9uIHNwZSkgewotICAgICAgICAgICAgU3RyaW5nIHN5c3RlbUlkID0gc3BlLmdldFN5c3RlbUlkKCk7Ci0gICAgICAgICAgICBpZiAoc3lzdGVtSWQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHN5c3RlbUlkID0gIm51bGwiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuICJVUkk9IiArIHN5c3RlbUlkICsKLSAgICAgICAgICAgICAgICAgICAgIiBMaW5lPSIgKyBzcGUuZ2V0TGluZU51bWJlcigpICsKLSAgICAgICAgICAgICAgICAgICAgIjogIiArIHNwZS5nZXRNZXNzYWdlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBUaGUgZm9sbG93aW5nIG1ldGhvZHMgYXJlIHN0YW5kYXJkIFNBWCBFcnJvckhhbmRsZXIgbWV0aG9kcy4KLSAgICAgICAgLy8gU2VlIFNBWCBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGluZm8uCi0KLSAgICAgICAgcHVibGljIHZvaWQgd2FybmluZyhTQVhQYXJzZUV4Y2VwdGlvbiBzcGUpIHRocm93cyBTQVhFeGNlcHRpb24gewotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgZXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gc3BlKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gIkVycm9yOiAiICsgZ2V0UGFyc2VFeGNlcHRpb25JbmZvKHNwZSk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU0FYRXhjZXB0aW9uKG1lc3NhZ2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgZmF0YWxFcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBzcGUpIHRocm93cyBTQVhFeGNlcHRpb24gewotICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAiRmF0YWwgRXJyb3I6ICIgKyBnZXRQYXJzZUV4Y2VwdGlvbkluZm8oc3BlKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBTQVhFeGNlcHRpb24obWVzc2FnZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFV0aWxpdHkgdG8gZ2V0IHRoZSBieXRlcyB1cmkuCi0gICAgICogRG9lcyBOT1QgaGFuZGxlIGF1dGhlbnRpY2F0ZWQgVVJMcywKLSAgICAgKiB1c2UgZ2V0SW5wdXRTb3VyY2VGcm9tVVJJKHVyaSwgdXNlcm5hbWUsIHBhc3N3b3JkKQotICAgICAqCi0gICAgICogQHBhcmFtIHVyaSB0aGUgcmVzb3VyY2UgdG8gZ2V0Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBJbnB1dFNvdXJjZSBnZXRJbnB1dFNvdXJjZUZyb21VUkkoU3RyaW5nIHVyaSkgewotICAgICAgICByZXR1cm4gbmV3IElucHV0U291cmNlKHVyaSk7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBVdGlsaXR5IHRvIGdldCB0aGUgYnl0ZXMgYXQgYSBwcm90ZWN0ZWQgdXJpCi0gICAgICogPHAvPgotICAgICAqIFJldHJpZXZlcyB0aGUgVVJMIGlmIGEgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIGFyZSBwcm92aWRlZC4KLSAgICAgKiBUaGUgamF2YS5uZXQuVVJMIGNsYXNzIGRvZXMgbm90IGRvIEJhc2ljIEF1dGhlbnRpY2F0aW9uLCBzbyB3ZSBoYXZlIHRvCi0gICAgICogZG8gaXQgbWFudWFsbHkgaW4gdGhpcyByb3V0aW5lLgotICAgICAqIDxwLz4KLSAgICAgKiBJZiBubyB1c2VybmFtZSBpcyBwcm92aWRlZCwgY3JlYXRlcyBhbiBJbnB1dFNvdXJjZSBmcm9tIHRoZSB1cmkKLSAgICAgKiBhbmQgbGV0cyB0aGUgSW5wdXRTb3VyY2UgZ28gZmV0Y2ggdGhlIGNvbnRlbnRzLgotICAgICAqCi0gICAgICogQHBhcmFtIHVyaSAgICAgIHRoZSByZXNvdXJjZSB0byBnZXQKLSAgICAgKiBAcGFyYW0gdXNlcm5hbWUgYmFzaWMgYXV0aCB1c2VybmFtZQotICAgICAqIEBwYXJhbSBwYXNzd29yZCBiYXNpYyBhdXRoIHBhc3N3b3JkCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgSW5wdXRTb3VyY2UgZ2V0SW5wdXRTb3VyY2VGcm9tVVJJKFN0cmluZyB1cmksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB1c2VybmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhc3N3b3JkKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBQcm90b2NvbEV4Y2VwdGlvbiwgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIFVSTCB3c2RsdXJsID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHdzZGx1cmwgPSBuZXcgVVJMKHVyaSk7Ci0gICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyB3ZSBjYW4ndCBwcm9jZXNzIGl0LCBpdCBtaWdodCBiZSBhICdzaW1wbGUnIGZvby53c2RsCi0gICAgICAgICAgICAvLyBsZXQgSW5wdXRTb3VyY2UgZGVhbCB3aXRoIGl0Ci0gICAgICAgICAgICByZXR1cm4gbmV3IElucHV0U291cmNlKHVyaSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBpZiBubyBhdXRoZW50aWNhdGlvbiwganVzdCBsZXQgSW5wdXRTb3VyY2UgZGVhbCB3aXRoIGl0Ci0gICAgICAgIGlmICh1c2VybmFtZSA9PSBudWxsICYmIHdzZGx1cmwuZ2V0VXNlckluZm8oKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IElucHV0U291cmNlKHVyaSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBpZiB0aGlzIGlzIG5vdCBhbiBIVFRQe1N9IHVybCwgbGV0IElucHV0U291cmNlIGRlYWwgd2l0aCBpdAotICAgICAgICBpZiAoIXdzZGx1cmwuZ2V0UHJvdG9jb2woKS5zdGFydHNXaXRoKCJodHRwIikpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgSW5wdXRTb3VyY2UodXJpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFVSTENvbm5lY3Rpb24gY29ubmVjdGlvbiA9IHdzZGx1cmwub3BlbkNvbm5lY3Rpb24oKTsKLSAgICAgICAgLy8gRG9lcyB0aGlzIHdvcmsgZm9yIGh0dHBzPz8/Ci0gICAgICAgIGlmICghKGNvbm5lY3Rpb24gaW5zdGFuY2VvZiBIdHRwVVJMQ29ubmVjdGlvbikpIHsKLSAgICAgICAgICAgIC8vIGNhbid0IGRvIGh0dHAgd2l0aCB0aGlzIFVSTCwgbGV0IElucHV0U291cmNlIGRlYWwgd2l0aCBpdAotICAgICAgICAgICAgcmV0dXJuIG5ldyBJbnB1dFNvdXJjZSh1cmkpOwotICAgICAgICB9Ci0gICAgICAgIEh0dHBVUkxDb25uZWN0aW9uIHVjb25uID0gKEh0dHBVUkxDb25uZWN0aW9uKSBjb25uZWN0aW9uOwotICAgICAgICBTdHJpbmcgdXNlcmluZm8gPSB3c2RsdXJsLmdldFVzZXJJbmZvKCk7Ci0gICAgICAgIHVjb25uLnNldFJlcXVlc3RNZXRob2QoIkdFVCIpOwotICAgICAgICB1Y29ubi5zZXRBbGxvd1VzZXJJbnRlcmFjdGlvbihmYWxzZSk7Ci0gICAgICAgIHVjb25uLnNldERlZmF1bHRVc2VDYWNoZXMoZmFsc2UpOwotICAgICAgICB1Y29ubi5zZXREb0lucHV0KHRydWUpOwotICAgICAgICB1Y29ubi5zZXREb091dHB1dChmYWxzZSk7Ci0gICAgICAgIHVjb25uLnNldEluc3RhbmNlRm9sbG93UmVkaXJlY3RzKHRydWUpOwotICAgICAgICB1Y29ubi5zZXRVc2VDYWNoZXMoZmFsc2UpOwotCi0gICAgICAgIC8vIHVzZXJuYW1lL3Bhc3N3b3JkIGluZm8gaW4gdGhlIFVSTCBvdmVycmlkZXMgcGFzc2VkIGluIHZhbHVlcyAKLSAgICAgICAgU3RyaW5nIGF1dGggPSBudWxsOwotICAgICAgICBpZiAodXNlcmluZm8gIT0gbnVsbCkgewotICAgICAgICAgICAgYXV0aCA9IHVzZXJpbmZvOwotICAgICAgICB9IGVsc2UgaWYgKHVzZXJuYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIGF1dGggPSAocGFzc3dvcmQgPT0gbnVsbCkgPyB1c2VybmFtZSA6IHVzZXJuYW1lICsgIjoiICsgcGFzc3dvcmQ7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYXV0aCAhPSBudWxsKSB7Ci0gICAgICAgICAgICB1Y29ubi5zZXRSZXF1ZXN0UHJvcGVydHkoIkF1dGhvcml6YXRpb24iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCYXNpYyAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U2NGVuY29kZShhdXRoLmdldEJ5dGVzKGNoYXJFbmNvZGluZykpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHVjb25uLmNvbm5lY3QoKTsKLQotICAgICAgICByZXR1cm4gbmV3IElucHV0U291cmNlKHVjb25uLmdldElucHV0U3RyZWFtKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGJhc2U2NGVuY29kZShieXRlW10gYnl0ZXMpIHsKLSAgICAgICAgcmV0dXJuIEJhc2U2NC5lbmNvZGUoYnl0ZXMpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgSW5wdXRTb3VyY2UgZ2V0RW1wdHlJbnB1dFNvdXJjZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBJbnB1dFNvdXJjZShiYWlzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGaW5kcyBhIE5vZGUgd2l0aCBhIGdpdmVuIFFOYW1lYi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBub2RlIHBhcmVudCBub2RlCi0gICAgICogQHBhcmFtIG5hbWUgUU5hbWUgb2YgdGhlIGNoaWxkIHdlIG5lZWQgdG8gZmluZAotICAgICAqIEByZXR1cm4gUmV0dXJucyBjaGlsZCBub2RlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTm9kZSBmaW5kTm9kZShOb2RlIG5vZGUsIFFOYW1lIG5hbWUpIHsKLSAgICAgICAgaWYgKG5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkuZXF1YWxzKG5vZGUuZ2V0TmFtZXNwYWNlVVJJKCkpICYmCi0gICAgICAgICAgICAgICAgbmFtZS5nZXRMb2NhbFBhcnQoKS5lcXVhbHMobm9kZS5nZXRMb2NhbE5hbWUoKSkpIHsKLSAgICAgICAgICAgIHJldHVybiBub2RlOwotICAgICAgICB9Ci0gICAgICAgIE5vZGVMaXN0IGNoaWxkcmVuID0gbm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGkrKykgewotICAgICAgICAgICAgTm9kZSByZXQgPSBmaW5kTm9kZShjaGlsZHJlbi5pdGVtKGkpLCBuYW1lKTsKLSAgICAgICAgICAgIGlmIChyZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydCBET00gRWxlbWVudCBpbnRvIGEgZnVsbHkgYnVpbHQgT01FbGVtZW50Ci0gICAgICogQHBhcmFtIGVsZW1lbnQgZG9tIEVsZW1lbnQKLSAgICAgKiBAcmV0dXJuIE9NRWxlbWVudAotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBPTUVsZW1lbnQgdG9PTShFbGVtZW50IGVsZW1lbnQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gdG9PTShlbGVtZW50LCB0cnVlKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ29udmVydCBET00gRWxlbWVudCBpbnRvIGEgZnVsbHkgYnVpbHQgT01FbGVtZW50Ci0gICAgICogQHBhcmFtIGVsZW1lbnQKLSAgICAgKiBAcGFyYW0gYnVpbGRBbGwgaWYgdHJ1ZSwgZnVsbCBPTSB0cmVlIGlzIGltbWVkaWF0ZWx5IGJ1aWx0LiBpZiBmYWxzZSwgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIAotICAgICAqIGZvciBidWlsZGluZyB0aGUgdHJlZSBhbmQgY2xvc2luZyB0aGUgcGFyc2VyLgotICAgICAqIEByZXR1cm4KLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgT01FbGVtZW50IHRvT00oRWxlbWVudCBlbGVtZW50LCBib29sZWFuIGJ1aWxkQWxsKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICBTb3VyY2Ugc291cmNlID0gbmV3IERPTVNvdXJjZShlbGVtZW50KTsKLQotICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgUmVzdWx0IHJlc3VsdCA9IG5ldyBTdHJlYW1SZXN1bHQoYmFvcyk7Ci0KLSAgICAgICAgVHJhbnNmb3JtZXIgeGZvcm1lciA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1RyYW5zZm9ybWVyKCk7Ci0gICAgICAgIHhmb3JtZXIudHJhbnNmb3JtKHNvdXJjZSwgcmVzdWx0KTsKLQotICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpOwotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyID0gU3RBWFV0aWxzCi0gICAgICAgICAgICAgICAgLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihpcyk7Ci0KLSAgICAgICAgU3RBWE9NQnVpbGRlciBidWlsZGVyID0gbmV3IFN0QVhPTUJ1aWxkZXIocmVhZGVyKTsKLSAgICAgICAgYnVpbGRlci5zZXRDYWNoZSh0cnVlKTsKLSAgICAgICAgYnVpbGRlci5yZWxlYXNlUGFyc2VyT25DbG9zZSh0cnVlKTsKLQotICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gYnVpbGRlci5nZXREb2N1bWVudEVsZW1lbnQoKTsKLSAgICAgICAgaWYgKGJ1aWxkQWxsKSB7Ci0gICAgICAgICAgICBvbUVsZW1lbnQuYnVpbGQoKTsKLSAgICAgICAgICAgIGJ1aWxkZXIuY2xvc2UoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gb21FbGVtZW50OwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgYSBnaXZlbiBPTUVsZW1lbnQgdG8gYSBET00gRWxlbWVudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBlbGVtZW50Ci0gICAgICogQHJldHVybiBSZXR1cm5zIEVsZW1lbnQuCi0gICAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgdG9ET00oT01FbGVtZW50IGVsZW1lbnQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgZWxlbWVudC5zZXJpYWxpemUoYmFvcyk7Ci0gICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGJhaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKTsKLQotICAgICAgICBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGZhY3RvcnkgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIGZhY3Rvcnkuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7Ci0gICAgICAgIHJldHVybiBmYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpLnBhcnNlKGJhaXMpLmdldERvY3VtZW50RWxlbWVudCgpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgYSBnaXZlbiBpbnB1dHN0cmVhbSB0byBhbiBPTU5vZGUKLSAgICAgKiBUaGUgcmV1cm5lZCBPTU5vZGUgaXMgZnVsbHkgYnVpbHQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaW5wdXRTdHJlYW0KLSAgICAgKiBAcmV0dXJuIE9NTm9kZQotICAgICAqIEB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24KLSAgICAgKgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgT01Ob2RlIHRvT00oSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gdG9PTShpbnB1dFN0cmVhbSwgdHJ1ZSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENvbnZlcnRzIGEgZ2l2ZW4gaW5wdXRzdHJlYW0gdG8gYW4gT01Ob2RlCi0gICAgICogVGhlIHJldXJuZWQgT01Ob2RlIGlzIGZ1bGx5IGJ1aWx0IGlmIGJ1aWxkQWxsIGlzIHRydWUuCi0gICAgICogSWYgYnVpbGRBbGwgaXMgZmFsc2UsIHRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGNsb3NpbmcgdGhlIHBhcnNlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpbnB1dFN0cmVhbQotICAgICAqIEBwYXJhbSBidWlsZEFsbAotICAgICAqIEByZXR1cm4gT01Ob2RlCi0gICAgICogQHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbgotICAgICAqCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBPTU5vZGUgdG9PTShJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgYm9vbGVhbiBidWlsZEFsbCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPSBTdEFYVXRpbHMKLSAgICAgICAgICAgICAgICAuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKGlucHV0U3RyZWFtKTsKLSAgICAgICAgT01GYWN0b3J5IGZhYyA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpOwotICAgICAgICBTdEFYT01CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RBWE9NQnVpbGRlcihmYWMsIHhtbFJlYWRlcik7Ci0gICAgICAgIGJ1aWxkZXIuc2V0Q2FjaGUodHJ1ZSk7Ci0gICAgICAgIGJ1aWxkZXIucmVsZWFzZVBhcnNlck9uQ2xvc2UodHJ1ZSk7Ci0gICAgICAgIE9NTm9kZSBvbU5vZGUgPSBidWlsZGVyLmdldERvY3VtZW50RWxlbWVudCgpOwotICAgICAgICAKLSAgICAgICAgaWYgKGJ1aWxkQWxsKSB7Ci0gICAgICAgICAgICBvbU5vZGUuYnVpbGQoKTsKLSAgICAgICAgICAgIGJ1aWxkZXIuY2xvc2UoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIG9tTm9kZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyBhIGdpdmVuIFJlYWRlciB0byBhbiBPTU5vZGUuCi0gICAgICogVGhlIHJldXJuZWQgT01Ob2RlIGlzIGZ1bGx5IGJ1aWx0LgotICAgICAqCi0gICAgICogQHBhcmFtIHJlYWRlcgotICAgICAqIEByZXR1cm4KLSAgICAgKiBAdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgT01Ob2RlIHRvT00oUmVhZGVyIHJlYWRlcikgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiB0b09NKHJlYWRlciwgdHJ1ZSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENvbnZlcnRzIGEgZ2l2ZW4gUmVhZGVyIHRvIGFuIE9NTm9kZS4KLSAgICAgKiBUaGUgcmV1cm5lZCBPTU5vZGUgaXMgZnVsbHkgYnVpbHQgaWYgYnVpbGRBbGwgaXMgdHJ1ZS4KLSAgICAgKiBJZiBidWlsZEFsbCBpcyBmYWxzZSwgdGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgY2xvc2luZyB0aGUgcGFyc2VyLgotICAgICAqCi0gICAgICogQHBhcmFtIHJlYWRlcgotICAgICAqIEBwYXJhbSBidWlsZEFsbAotICAgICAqIEByZXR1cm4gT01Ob2RlCi0gICAgICogQHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE9NTm9kZSB0b09NKFJlYWRlciByZWFkZXIsIGJvb2xlYW4gYnVpbGRBbGwpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzCi0gICAgICAgICAgICAgICAgLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihyZWFkZXIpOwotICAgICAgICBPTUZhY3RvcnkgZmFjID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCk7Ci0gICAgICAgIFN0QVhPTUJ1aWxkZXIgYnVpbGRlciA9IG5ldyBTdEFYT01CdWlsZGVyKGZhYywgeG1sUmVhZGVyKTsKLSAgICAgICAgYnVpbGRlci5zZXRDYWNoZSh0cnVlKTsKLSAgICAgICAgYnVpbGRlci5yZWxlYXNlUGFyc2VyT25DbG9zZSh0cnVlKTsKLSAgICAgICAgT01Ob2RlIG9tTm9kZSA9IGJ1aWxkZXIuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0gICAgICAgIAotICAgICAgICBpZiAoYnVpbGRBbGwpIHsKLSAgICAgICAgICAgIG9tTm9kZS5idWlsZCgpOwotICAgICAgICAgICAgYnVpbGRlci5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gb21Ob2RlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi91dGlsL1hTTFRUZW1wbGF0ZVByb2Nlc3Nvci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvWFNMVFRlbXBsYXRlUHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyMWFhYjcuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvWFNMVFRlbXBsYXRlUHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnV0aWw7Ci0KLQotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5SZXN1bHQ7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVVJJUmVzb2x2ZXI7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5kb20uRE9NU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdDsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1Tb3VyY2U7Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLQotCi1wdWJsaWMgY2xhc3MgWFNMVFRlbXBsYXRlUHJvY2Vzc29yIHsKLQotICAgIC8qKgotICAgICAqIFBhcnNlcyBhbiBYTUwgc3RyZWFtIHdpdGggYW4gWFNMIHN0cmVhbQotICAgICAqCi0gICAgICogQHBhcmFtIG91dCAgICAgICAgU3RyZWFtIHRvIHdyaXRlIHRoZSBvdXRwdXQKLSAgICAgKiBAcGFyYW0geG1sU3RyZWFtICBTb3VyY2UgWE1MIHN0cmVhbQotICAgICAqIEBwYXJhbSB4c2x0U3RyZWFtIFNvdXJjZSBYU0wgc3RyZWFtCi0gICAgICogQHRocm93cyBUcmFuc2Zvcm1lckZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3IKLSAgICAgKgotICAgICAqIEB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcGFyc2UoT3V0cHV0U3RyZWFtIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0geG1sU3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSB4c2x0U3RyZWFtKQotICAgICAgICAgICAgdGhyb3dzIFRyYW5zZm9ybWVyRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvciwgVHJhbnNmb3JtZXJFeGNlcHRpb24gewotICAgICAgICBTb3VyY2UgeG1sU291cmNlID0gbmV3IFN0cmVhbVNvdXJjZSh4bWxTdHJlYW0pOwotICAgICAgICBTb3VyY2UgeHNsdFNvdXJjZSA9IG5ldyBTdHJlYW1Tb3VyY2UoeHNsdFN0cmVhbSk7Ci0gICAgICAgIFJlc3VsdCByZXN1bHQgPSBuZXcgU3RyZWFtUmVzdWx0KG91dCk7Ci0gICAgICAgIFRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkKLSAgICAgICAgICAgICAgICAubmV3VHJhbnNmb3JtZXIoeHNsdFNvdXJjZSk7Ci0gICAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybSh4bWxTb3VyY2UsIHJlc3VsdCk7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQYXJzZXMgYW4gWE1MIHN0cmVhbSB3aXRoIGFuIFhTTCBzdHJlYW0KLSAgICAgKgotICAgICAqIEBwYXJhbSBvdXQgICAgICAgICBTdHJlYW0gdG8gd3JpdGUgdGhlIG91dHB1dAotICAgICAqIEBwYXJhbSBkb2MKLSAgICAgKiBAcGFyYW0gdHJhbnNmb3JtZXIKLSAgICAgKiBAdGhyb3dzIFRyYW5zZm9ybWVyRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvcgotICAgICAqCi0gICAgICogQHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwYXJzZShPdXRwdXRTdHJlYW0gb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEb2N1bWVudCBkb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyKQotICAgICAgICAgICAgdGhyb3dzIFRyYW5zZm9ybWVyRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvciwgVHJhbnNmb3JtZXJFeGNlcHRpb24gewotICAgICAgICBTb3VyY2UgeG1sU291cmNlID0gbmV3IERPTVNvdXJjZShkb2MpOwotICAgICAgICBSZXN1bHQgcmVzdWx0ID0gbmV3IFN0cmVhbVJlc3VsdChvdXQpOwotICAgICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0oeG1sU291cmNlLCByZXN1bHQpOwotCi0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gb3V0Ci0gICAgICogQHBhcmFtIGRvY3VtZW50Ci0gICAgICogQHBhcmFtIHhzbHRTdHJlYW0KLSAgICAgKiBAdGhyb3dzIFRyYW5zZm9ybWVyRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvcgotICAgICAqCi0gICAgICogQHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwYXJzZShPdXRwdXRTdHJlYW0gb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEb2N1bWVudCBkb2N1bWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0geHNsdFN0cmVhbSkKLSAgICAgICAgICAgIHRocm93cyBUcmFuc2Zvcm1lckZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3IsIFRyYW5zZm9ybWVyRXhjZXB0aW9uIHsKLSAgICAgICAgU291cmNlIHhzbHRTb3VyY2UgPSBuZXcgU3RyZWFtU291cmNlKHhzbHRTdHJlYW0pOwotICAgICAgICBUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpCi0gICAgICAgICAgICAgICAgLm5ld1RyYW5zZm9ybWVyKHhzbHRTb3VyY2UpOwotICAgICAgICBwYXJzZShvdXQsIGRvY3VtZW50LCB0cmFuc2Zvcm1lcik7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gb3V0Ci0gICAgICogQHBhcmFtIGRvY3VtZW50Ci0gICAgICogQHBhcmFtIHhzbHRTdHJlYW0KLSAgICAgKiBAdGhyb3dzIFRyYW5zZm9ybWVyRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvcgotICAgICAqCi0gICAgICogQHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwYXJzZShPdXRwdXRTdHJlYW0gb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEb2N1bWVudCBkb2N1bWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0geHNsdFN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJJUmVzb2x2ZXIgY3VzdG9tUmVzb2x2ZXIpCi0gICAgICAgICAgICB0aHJvd3MgVHJhbnNmb3JtZXJGYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yLCBUcmFuc2Zvcm1lckV4Y2VwdGlvbiB7Ci0gICAgICAgIHBhcnNlKG91dCwgZG9jdW1lbnQsIHhzbHRTdHJlYW0sIGN1c3RvbVJlc29sdmVyLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIG91dAotICAgICAqIEBwYXJhbSBkb2N1bWVudAotICAgICAqIEBwYXJhbSB4c2x0U3RyZWFtCi0gICAgICogQHRocm93cyBUcmFuc2Zvcm1lckZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3IKLSAgICAgKgotICAgICAqIEB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcGFyc2UoT3V0cHV0U3RyZWFtIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIHhzbHRTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSSVJlc29sdmVyIGN1c3RvbVJlc29sdmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHByZXR0eSkKLSAgICAgICAgICAgIHRocm93cyBUcmFuc2Zvcm1lckZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3IsIFRyYW5zZm9ybWVyRXhjZXB0aW9uIHsKLSAgICAgICAgU291cmNlIHhzbHRTb3VyY2UgPSBuZXcgU3RyZWFtU291cmNlKHhzbHRTdHJlYW0pOwotICAgICAgICBUcmFuc2Zvcm1lckZhY3RvcnkgdHJhbnNmb3JtZXJGYWN0b3J5ID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIGlmIChwcmV0dHkpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgdHJhbnNmb3JtZXJGYWN0b3J5LnNldEF0dHJpYnV0ZSgiaW5kZW50LW51bWJlciIsIG5ldyBJbnRlZ2VyKDIpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGN1c3RvbVJlc29sdmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyYW5zZm9ybWVyRmFjdG9yeS5zZXRVUklSZXNvbHZlcihjdXN0b21SZXNvbHZlcik7Ci0gICAgICAgIH0KLQotICAgICAgICBUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVyRmFjdG9yeQotICAgICAgICAgICAgICAgIC5uZXdUcmFuc2Zvcm1lcih4c2x0U291cmNlKTsKLSAgICAgICAgaWYgKHByZXR0eSkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICB0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eSgie2h0dHA6Ly94bWwuYXBhY2hlLm9yZy94YWxhbn1pbmRlbnQtYW1vdW50IiwgIjIiKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwYXJzZShvdXQsIGRvY3VtZW50LCB0cmFuc2Zvcm1lcik7Ci0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdXRpbC9YU0xUVXRpbHMuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi91dGlsL1hTTFRVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2ZlN2UzLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi91dGlsL1hTTFRVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnV0aWw7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIFhTTFRVdGlscyB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIERvY3VtZW50IGdldERvY3VtZW50KCkgdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gewotICAgICAgICBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGRvY3VtZW50QnVpbGRlckZhY3RvcnkgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIGRvY3VtZW50QnVpbGRlckZhY3Rvcnkuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7Ci0gICAgICAgIHJldHVybiBkb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpLm5ld0RvY3VtZW50KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXRpbGl0eSBtZXRob2QgdG8gYWRkIGFuIGF0dHJpYnV0ZSB0byBhIGdpdmVuIGVsZW1lbnQKLSAgICAgKgotICAgICAqIEBwYXJhbSBkb2N1bWVudAotICAgICAqIEBwYXJhbSBBdHRyaWJOYW1lCi0gICAgICogQHBhcmFtIGF0dHJpYlZhbHVlCi0gICAgICogQHBhcmFtIGVsZW1lbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkQXR0cmlidXRlKERvY3VtZW50IGRvY3VtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIEF0dHJpYk5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYXR0cmliVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50IGVsZW1lbnQpIHsKLSAgICAgICAgQXR0ciBhdHRyaWJ1dGUgPSBkb2N1bWVudC5jcmVhdGVBdHRyaWJ1dGUoQXR0cmliTmFtZSk7Ci0gICAgICAgIGF0dHJpYnV0ZS5zZXRWYWx1ZShhdHRyaWJWYWx1ZSk7Ci0gICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlTm9kZShhdHRyaWJ1dGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBnZXRFbGVtZW50KERvY3VtZW50IGRvY3VtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBlbGVtZW50TmFtZSkgewotICAgICAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChlbGVtZW50TmFtZSk7Ci0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFV0aWxpdHkgbWV0aG9kIHRvIGFkZCBhbiBhdHRyaWJ1dGUgdG8gYSBnaXZlbiBlbGVtZW50Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gZG9jdW1lbnQKLSAgICAgKiBAcGFyYW0gZWxlbWVudE5hbWUKLSAgICAgKiBAcGFyYW0gcGFyZW50Tm9kZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBhZGRDaGlsZEVsZW1lbnQoRG9jdW1lbnQgZG9jdW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZWxlbWVudE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb2RlIHBhcmVudE5vZGUpIHsKLSAgICAgICAgRWxlbWVudCBlbHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGVsZW1lbnROYW1lKTsKLSAgICAgICAgcGFyZW50Tm9kZS5hcHBlbmRDaGlsZChlbHQpOwotICAgICAgICByZXR1cm4gZWx0OwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvdGhyZWFkcG9vbC9EZWZhdWx0VGhyZWFkRmFjdG9yeS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvdGhyZWFkcG9vbC9EZWZhdWx0VGhyZWFkRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzZiOTczLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi91dGlsL3RocmVhZHBvb2wvRGVmYXVsdFRocmVhZEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi51dGlsLnRocmVhZHBvb2w7Ci0KLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRGYWN0b3J5OwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNJbnRlZ2VyOwotCi0vKioKLSAqIFRoaXMgaXMgYSBzaW1wbGUgVGhyZWFkRmFjdG9yeSBpbXBsZW1lbnRhdGlvbiB1c2luZyBqYXZhLnV0aWwuY29uY3VycmVudAotICogQ3JlYXRlcyB0aHJlYWRzIHdpdGggdGhlIGdpdmVuIG5hbWUgcHJlZml4Ci0gKi8KLXB1YmxpYyBjbGFzcyBEZWZhdWx0VGhyZWFkRmFjdG9yeSBpbXBsZW1lbnRzIFRocmVhZEZhY3RvcnkgewotCi0gICAgZmluYWwgVGhyZWFkR3JvdXAgZ3JvdXA7Ci0gICAgZmluYWwgQXRvbWljSW50ZWdlciBjb3VudDsKLSAgICBmaW5hbCBTdHJpbmcgbmFtZVByZWZpeDsKLQotICAgIHB1YmxpYyBEZWZhdWx0VGhyZWFkRmFjdG9yeShmaW5hbCBUaHJlYWRHcm91cCBncm91cCwgZmluYWwgU3RyaW5nIG5hbWVQcmVmaXgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgdGhpcy5jb3VudCA9IG5ldyBBdG9taWNJbnRlZ2VyKDEpOwotICAgICAgICB0aGlzLmdyb3VwID0gZ3JvdXA7Ci0gICAgICAgIHRoaXMubmFtZVByZWZpeCA9IG5hbWVQcmVmaXg7Ci0gICAgfQotCi0gICAgcHVibGljIFRocmVhZCBuZXdUaHJlYWQoZmluYWwgUnVubmFibGUgcnVubmFibGUpIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgYnVmZmVyLmFwcGVuZCh0aGlzLm5hbWVQcmVmaXgpOwotICAgICAgICBidWZmZXIuYXBwZW5kKCctJyk7Ci0gICAgICAgIGJ1ZmZlci5hcHBlbmQodGhpcy5jb3VudC5nZXRBbmRJbmNyZW1lbnQoKSk7Ci0gICAgICAgIFRocmVhZCB0ID0gbmV3IFRocmVhZChncm91cCwgcnVubmFibGUsIGJ1ZmZlci50b1N0cmluZygpLCAwKTsKLSAgICAgICAgdC5zZXREYWVtb24oZmFsc2UpOwotICAgICAgICB0LnNldFByaW9yaXR5KFRocmVhZC5OT1JNX1BSSU9SSVRZKTsKLSAgICAgICAgcmV0dXJuIHQ7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdXRpbC90aHJlYWRwb29sL1RocmVhZEZhY3RvcnkuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi91dGlsL3RocmVhZHBvb2wvVGhyZWFkRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTBmZWNlLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi91dGlsL3RocmVhZHBvb2wvVGhyZWFkRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnV0aWwudGhyZWFkcG9vbDsKLQotcHVibGljIGludGVyZmFjZSBUaHJlYWRGYWN0b3J5IHsKLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKGphdmEubGFuZy5SdW5uYWJsZSBydW5uYWJsZSk7Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdXRpbC90aHJlYWRwb29sL1RocmVhZFBvb2wuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi91dGlsL3RocmVhZHBvb2wvVGhyZWFkUG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTZmYzk5Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi91dGlsL3RocmVhZHBvb2wvVGhyZWFkUG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnV0aWwudGhyZWFkcG9vbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaTE4bi5NZXNzYWdlczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3I7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuTGlua2VkQmxvY2tpbmdRdWV1ZTsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5TeW5jaHJvbm91c1F1ZXVlOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKLQotLyoqCi0gKiBUaGlzIHRoZSB0aHJlYWQgcG9vbCBmb3IgYXhpczIuIFRoaXMgY2xhc3Mgd2lsbCBiZSB1c2VkIGEgc2luZ2xldG9uCi0gKiBhY3Jvc3MgYXhpczIgZW5naW5lLiA8Y29kZT5UaHJlYWRQb29sPC9jb2RlPiBpcyBhY2NlcHRzIDxjb2RlPkF4aXNXb3JrZXJzPC9jb2RlPiB3aGljaCBoYXMKLSAqIHJ1biBtZXRob2Qgb24gdGhlbSBhbmQgZXhlY3V0ZSB0aGlzIG1ldGhvZCwgdXNpbmcgb25lIG9mIHRoZSB0aHJlYWRzCi0gKiBpbiB0aGUgdGhyZWFkIHBvb2wuCi0gKi8KLXB1YmxpYyBjbGFzcyBUaHJlYWRQb29sIGltcGxlbWVudHMgVGhyZWFkRmFjdG9yeSB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFRocmVhZFBvb2wuY2xhc3MpOwotICAgIHByb3RlY3RlZCBzdGF0aWMgbG9uZyBTTEVFUF9JTlRFUlZBTCA9IDEwMDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBzaHV0RG93bjsKLSAgICBwcm90ZWN0ZWQgVGhyZWFkUG9vbEV4ZWN1dG9yIGV4ZWN1dG9yOwotCi0gICAgLy9pbnRlZ2VycyB0aGF0IGRlZmluZSB0aGUgcG9vbCBzaXplLCB3aXRoIHRoZSBkZWZhdWx0IHZhbHVlcyBzZXQuCi0gICAgcHJpdmF0ZSBpbnQgY29yZVBvb2xTaXplID0gNTsKLSAgICBwcml2YXRlIGludCBtYXhQb29sU2l6ZSA9IEludGVnZXIuTUFYX1ZBTFVFOwotCi0gICAgcHVibGljIFRocmVhZFBvb2woKSB7Ci0gICAgICAgIHNldEV4ZWN1dG9yKGNyZWF0ZURlZmF1bHRFeGVjdXRvcigiQXhpczIgVGFzayIsIFRocmVhZC5OT1JNX1BSSU9SSVRZLCB0cnVlKSk7Ci0gICAgfQotCi0gICAgcHVibGljIFRocmVhZFBvb2woaW50IGNvcmVQb29sU2l6ZSwgaW50IG1heFBvb2xTaXplKSB7Ci0gICAgICAgIHRoaXMuY29yZVBvb2xTaXplID0gY29yZVBvb2xTaXplOwotICAgICAgICB0aGlzLm1heFBvb2xTaXplID0gbWF4UG9vbFNpemU7Ci0gICAgICAgIHNldEV4ZWN1dG9yKGNyZWF0ZURlZmF1bHRFeGVjdXRvcigiQXhpczIgVGFzayIsIFRocmVhZC5OT1JNX1BSSU9SSVRZLCB0cnVlKSk7Ci0gICAgfQotCi0gICAgcHVibGljIEV4ZWN1dG9yIGdldEV4ZWN1dG9yKCkgewotICAgICAgICByZXR1cm4gZXhlY3V0b3I7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RXhlY3V0b3IoVGhyZWFkUG9vbEV4ZWN1dG9yIGV4ZWN1dG9yKSB7Ci0gICAgICAgIHRoaXMuZXhlY3V0b3IgPSBleGVjdXRvcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKFJ1bm5hYmxlIHdvcmtlcikgewotICAgICAgICBpZiAoc2h1dERvd24pIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoInRocmVhZHBvb2xzaHV0ZG93biIpKTsKLSAgICAgICAgfQotICAgICAgICBleGVjdXRvci5leGVjdXRlKHdvcmtlcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQSBmb3JjZWZ1bCBzaHV0ZG93biBtZWNoYW5pc20gZm9yIHRocmVhZCBwb29sLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGZvcmNlU2h1dERvd24oKSB7Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJmb3JjZVNodXREb3duIGNhbGxlZC4gVGhyZWFkIHdvcmtlcnMgd2lsbCBiZSBzdG9wcGVkIik7Ci0gICAgICAgIH0KLSAgICAgICAgZXhlY3V0b3Iuc2h1dGRvd25Ob3coKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIGlzIHRoZSByZWNvbW1lbmRlZCBzaHV0ZG93biBtZXRob2QgZm9yIHRoZSB0aHJlYWQgcG9vbAotICAgICAqIFRoaXMgd2lsbCB3YWl0IHRpbGwgYWxsIHRoZSB3b3JrZXJzIHRoYXQgYXJlIGFscmVhZHkgaGFuZGVkIG92ZXIgdG8gdGhlCi0gICAgICogdGhyZWFkIHBvb2wgZ2V0IGV4ZWN1dGVkLgotICAgICAqCi0gICAgICogQHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNhZmVTaHV0RG93bigpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgICAgICAgIHNodXREb3duID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGV4ZWN1dG9yLnNodXRkb3duKCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFRocmVhZFBvb2xFeGVjdXRvciBjcmVhdGVEZWZhdWx0RXhlY3V0b3IoZmluYWwgU3RyaW5nIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHByaW9yaXR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gZGFlbW9uKSB7Ci0gICAgICAgIFRocmVhZFBvb2xFeGVjdXRvciByYzsKLSAgICAgICAgaWYgKG1heFBvb2xTaXplID09IEludGVnZXIuTUFYX1ZBTFVFKSB7Ci0gICAgICAgICAgICByYyA9IG5ldyBUaHJlYWRQb29sRXhlY3V0b3IoY29yZVBvb2xTaXplLCBtYXhQb29sU2l6ZSwgMTAsCi0gICAgICAgICAgICAgICAgICAgIFRpbWVVbml0LlNFQ09ORFMsIG5ldyBTeW5jaHJvbm91c1F1ZXVlKCksCi0gICAgICAgICAgICAgICAgICAgIG5ldyBEZWZhdWx0VGhyZWFkRmFjdG9yeShuYW1lLCBkYWVtb24sIHByaW9yaXR5KSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByYyA9IG5ldyBUaHJlYWRQb29sRXhlY3V0b3IoY29yZVBvb2xTaXplLCBtYXhQb29sU2l6ZSwgMTAsCi0gICAgICAgICAgICAgICAgICAgIFRpbWVVbml0LlNFQ09ORFMsIG5ldyBMaW5rZWRCbG9ja2luZ1F1ZXVlKCksCi0gICAgICAgICAgICAgICAgICAgIG5ldyBEZWZhdWx0VGhyZWFkRmFjdG9yeShuYW1lLCBkYWVtb24sIHByaW9yaXR5KSk7Ci0gICAgICAgIH0KLS8vIEZJWE1FOiBUaGlzIEFQSSBpcyBvbmx5IGluIEpESyAxLjYgLSBVc2UgcmVmbGVjdGlvbj8gICAgICAgIAotLy8gICAgICAgIHJjLmFsbG93Q29yZVRocmVhZFRpbWVPdXQodHJ1ZSk7Ci0gICAgICAgIHJldHVybiByYzsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBEZWZhdWx0VGhyZWFkRmFjdG9yeSBpbXBsZW1lbnRzIGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZEZhY3RvcnkgewotICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOwotICAgICAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gZGFlbW9uOwotICAgICAgICBwcml2YXRlIGZpbmFsIGludCBwcmlvcml0eTsKLQotICAgICAgICBwdWJsaWMgRGVmYXVsdFRocmVhZEZhY3RvcnkoU3RyaW5nIG5hbWUsIGJvb2xlYW4gZGFlbW9uLCBpbnQgcHJpb3JpdHkpIHsKLSAgICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgICAgICAgICB0aGlzLmRhZW1vbiA9IGRhZW1vbjsKLSAgICAgICAgICAgIHRoaXMucHJpb3JpdHkgPSBwcmlvcml0eTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBUaHJlYWQgbmV3VGhyZWFkKAotICAgICAgICAgICAgICAgIGZpbmFsIFJ1bm5hYmxlIHJ1bm5hYmxlKSB7Ci0gICAgICAgICAgICAvLyBkbyB0aGUgZm9sbG93aW5nIHNlY3Rpb24gYXMgcHJpdmlsZWdlZAotICAgICAgICAgICAgLy8gc28gdGhhdCBpdCB3aWxsIHdvcmsgZXZlbiB3aGVuIGphdmEyIHNlY3VyaXR5Ci0gICAgICAgICAgICAvLyBoYXMgYmVlbiBlbmFibGVkCi0gICAgICAgICAgICBUaHJlYWQgcmV0dXJuVGhyZWFkID0gbnVsbDsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuVGhyZWFkID0gKFRocmVhZCkKLSAgICAgICAgICAgICAgICAgICAgICAgIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uPFRocmVhZD4oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIFRocmVhZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZCBuZXdUaHJlYWQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUaHJlYWQocnVubmFibGUsIG5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdUaHJlYWQuc2V0RGFlbW9uKGRhZW1vbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1RocmVhZC5zZXRQcmlvcml0eShwcmlvcml0eSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXdUaHJlYWQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBub3RlOiBpbm5lciBjbGFzcyBjYW4ndCBoYXZlIGl0cyBvd24gc3RhdGljIGxvZyB2YXJpYWJsZQotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlRocmVhZFBvb2xFeGVjdXRvci5uZXdUaHJlYWQoKTogICBFeGNlcHRpb24gZnJvbSBBY2Nlc3NDb250cm9sbGVyIFsiICsgZS5nZXRDbGFzcygpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldE5hbWUoKSArICJdICBmb3IgWyIgKyBlLmdldE1lc3NhZ2UoKSArICJdIiwgZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHJldHVyblRocmVhZDsKLQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvSFRUUEhlYWRlck1lc3NhZ2UuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL0hUVFBIZWFkZXJNZXNzYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3MzRmOWQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvSFRUUEhlYWRlck1lc3NhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi53c2RsOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotcHVibGljIGNsYXNzIEhUVFBIZWFkZXJNZXNzYWdlIHsKLQotICAgIC8vIEhvbGRzIHRoZSBRTmFtZSBvZiB0aGUgdHlwZSBhdHRyaWJ1dGUKLSAgICBwcml2YXRlIFFOYW1lIHFOYW1lOwotCi0gICAgLy8gSG9sZHMgdGhlIHZhbHVlIG9mIHRoZSBuYW1lIGF0dHJpYnV0ZQotICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gcmVxdWlyZWQ7Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1JlcXVpcmVkKCkgewotICAgICAgICByZXR1cm4gcmVxdWlyZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UmVxdWlyZWQoYm9vbGVhbiByZXF1aXJlZCkgewotICAgICAgICB0aGlzLnJlcXVpcmVkID0gcmVxdWlyZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIFFOYW1lIGdldHFOYW1lKCkgewotICAgICAgICByZXR1cm4gcU5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0cU5hbWUoUU5hbWUgcU5hbWUpIHsKLSAgICAgICAgdGhpcy5xTmFtZSA9IHFOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL1NPQVBIZWFkZXJNZXNzYWdlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9TT0FQSGVhZGVyTWVzc2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmQ2NTk4Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL1NPQVBIZWFkZXJNZXNzYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLndzZGw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLm5hbWVzcGFjZS5Db25zdGFudHM7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1wdWJsaWMgY2xhc3MgU09BUEhlYWRlck1lc3NhZ2UgewotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBTT0FQXzExX0hFQURFUiA9IG5ldyBRTmFtZSgKLSAgICAgICAgICAgIENvbnN0YW50cy5VUklfV1NETDExX1NPQVAsICJoZWFkZXIiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFNPQVBfMTJfSEVBREVSID0gbmV3IFFOYW1lKAotICAgICAgICAgICAgQ29uc3RhbnRzLlVSSV9XU0RMMTJfU09BUCwgImhlYWRlciIpOwotCi0gICAgcHJpdmF0ZSBRTmFtZSBtZXNzYWdlTmFtZSA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgcGFydCA9IG51bGw7Ci0gICAgcHJpdmF0ZSBRTmFtZSBlbGVtZW50ID0gbnVsbDsKLSAgICBwcml2YXRlIFFOYW1lIHR5cGU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgdXNlOwotICAgIHByaXZhdGUgU3RyaW5nIG5hbWVzcGFjZVVSSTsKLSAgICBwcml2YXRlIGJvb2xlYW4gcmVxdWlyZWQ7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG11c3RVbmRlcnN0YW5kOwotCi0KLSAgICBwdWJsaWMgU09BUEhlYWRlck1lc3NhZ2UoKSB7Ci0gICAgICAgIHRoaXMudHlwZSA9IFNPQVBfMTFfSEVBREVSOwotICAgIH0KLQotICAgIHB1YmxpYyBTT0FQSGVhZGVyTWVzc2FnZShRTmFtZSB0eXBlKSB7Ci0gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7Ci0gICAgfQotCi0gICAgcHVibGljIFFOYW1lIGdldE1lc3NhZ2UoKSB7Ci0gICAgICAgIHJldHVybiBtZXNzYWdlTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXNzYWdlKFFOYW1lIG1lc3NhZ2UpIHsKLSAgICAgICAgdGhpcy5tZXNzYWdlTmFtZSA9IG1lc3NhZ2U7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBwYXJ0KCkgewotICAgICAgICByZXR1cm4gcGFydDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJ0KFN0cmluZyBwYXJ0KSB7Ci0gICAgICAgIHRoaXMucGFydCA9IHBhcnQ7Ci0gICAgfQotCi0gICAgcHVibGljIFFOYW1lIGdldEVsZW1lbnQoKSB7Ci0gICAgICAgIHJldHVybiBlbGVtZW50OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEVsZW1lbnQoUU5hbWUgZWxlbWVudCkgewotICAgICAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXNlKCkgewotICAgICAgICByZXR1cm4gdXNlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFVzZShTdHJpbmcgdXNlKSB7Ci0gICAgICAgIHRoaXMudXNlID0gdXNlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKCkgewotICAgICAgICByZXR1cm4gbmFtZXNwYWNlVVJJOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE5hbWVzcGFjZVVSSShTdHJpbmcgbmFtZXNwYWNlVVJJKSB7Ci0gICAgICAgIHRoaXMubmFtZXNwYWNlVVJJID0gbmFtZXNwYWNlVVJJOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzUmVxdWlyZWQoKSB7Ci0gICAgICAgIHJldHVybiByZXF1aXJlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRSZXF1aXJlZChib29sZWFuIHJlcXVpcmVkKSB7Ci0gICAgICAgIHRoaXMucmVxdWlyZWQgPSByZXF1aXJlZDsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzTXVzdFVuZGVyc3RhbmQoKSB7Ci0gICAgICAgIHJldHVybiBtdXN0VW5kZXJzdGFuZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRNdXN0VW5kZXJzdGFuZChib29sZWFuIG11c3RVbmRlcnN0YW5kKSB7Ci0gICAgICAgIHRoaXMubXVzdFVuZGVyc3RhbmQgPSBtdXN0VW5kZXJzdGFuZDsKLSAgICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvU09BUE1vZHVsZU1lc3NhZ2UuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL1NPQVBNb2R1bGVNZXNzYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjOGZkZjQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvU09BUE1vZHVsZU1lc3NhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi53c2RsOwotCi1wdWJsaWMgY2xhc3MgU09BUE1vZHVsZU1lc3NhZ2UgewotCi0gICAgcHJpdmF0ZSBTdHJpbmcgdXJpOwotCi0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFVyaSgpIHsKLSAgICAgICAgcmV0dXJuIHVyaTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRVcmkoU3RyaW5nIHVyaSkgewotICAgICAgICB0aGlzLnVyaSA9IHVyaTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9XU0RMQ29uc3RhbnRzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9XU0RMQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjNzM3NzYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvV1NETENvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi53c2RsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5uYW1lc3BhY2UuQ29uc3RhbnRzOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotcHVibGljIGludGVyZmFjZSBXU0RMQ29uc3RhbnRzIHsKLQotICAgIFN0cmluZyBXU0RMXzFfMV9TVFlMRSA9ICJzdHlsZSI7Ci0KLSAgICBTdHJpbmcgU1RZTEVfUlBDID0gInJwYyI7Ci0gICAgU3RyaW5nIFNUWUxFX0RPQyA9ICJkb2N1bWVudCI7Ci0gICAgU3RyaW5nIFNUWUxFX01TRyA9ICJtc2ciOwotCi0gICAgU3RyaW5nIFdTRExfNF9KX0RFRklOSVRJT04gPSAid3NkbDRqRGVmaW5pdGlvbiI7Ci0gICAgU3RyaW5nIFdTRExfMjBfREVTQ1JJUFRJT04gPSAiV1NETDIwRGVzY3JpcHRpb24iOwotICAgIC8qKgotICAgICAqIEZpZWxkIFdTREwyXzBfTkFNRVNQQUNFCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NETDJfMF9OQU1FU1BBQ0UgPSBDb25zdGFudHMuTlNfVVJJX1dTREwyMDsKLQotICAgIC8qKgotICAgICAqIEZpZWxkIFdTREwxXzFfTkFNRVNQQUNFCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NETDFfMV9OQU1FU1BBQ0UgPSBDb25zdGFudHMuTlNfVVJJX1dTREwxMTsKLQotCi0gICAgLyoqCi0gICAgICogRmllbGQgV1NETF9NRVNTQUdFX0RJUkVDVElPTl9JTgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdTRExfTUVTU0FHRV9ESVJFQ1RJT05fSU4gPSAiaW4iOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NETF9NRVNTQUdFX0lOX01FU1NBR0UgPSAiaW5NZXNzYWdlIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdTRExfTUVTU0FHRV9PVVRfTUVTU0FHRSA9ICJvdXRNZXNzYWdlIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNPQVBfSEVBREVSID0gInNvYXBfaGVhZGVyIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhUVFBfSEVBREVSID0gImh0dHBfaGVhZGVyIjsKLQotCi0gICAgLyoqCi0gICAgICogRmllbGQgV1NETF9NRVNTQUdFX0RJUkVDVElPTl9PVVQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXU0RMX01FU1NBR0VfRElSRUNUSU9OX09VVCA9ICJvdXQiOwotCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAvLy8vLy8vLy8vLy8vLy8vIE1lc3NhZ2UgTGFiZWxzLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSAgICAvKioKLSAgICAgKiBDb25zdGFudCB0byByZXByZXNlbnQgdGhlIG1lc3NhZ2UgbGFiZWwgIkluIiB3aGljaCBpcyB1c2VkIGJ5IHRoZQotICAgICAqIGZvbGxvd2luZyBXU0RMIDIuMCBkZWZpbmVkIE1FUHM6IEluLU9ubHksIFJvYnVzdCBJbi1Pbmx5LCBJbi1PdXQsCi0gICAgICogSW4tT3B0aW9uYWwtT3V0LCBPdXQtSW4sIE91dC1PcHRpb25hbC1Jbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgTUVTU0FHRV9MQUJFTF9JTiA9IDA7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVNTQUdFX0xBQkVMX0lOX1ZBTFVFID0gIkluIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVNTQUdFX0xBQkVMX0ZBVUxUX1ZBTFVFID0gIkZhdWx0IjsKLQotICAgIC8qKgotICAgICAqIENvbnN0YW50IHRvIHJlcHJlc2VudCB0aGUgbWVzc2FnZSBsYWJlbCAiT3V0IiB3aGljaCBpcyB1c2VkIGJ5IHRoZQotICAgICAqIGZvbGxvd2luZyBXU0RMIDIuMCBkZWZpbmVkIE1FUHM6IEluLU91dCwgSW4tT3B0aW9uYWwtT3V0LCBPdXQtT25seSwKLSAgICAgKiBSb2J1c3QgT3V0LU9ubHksIE91dC1JbiwgT3V0LU9wdGlvbmFsLUluLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FU1NBR0VfTEFCRUxfT1VUID0gMTsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FU1NBR0VfTEFCRUxfT1VUX1ZBTFVFID0gIk91dCI7Ci0KLSAgICAvKioKLSAgICAgKgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdTRExfVVNFX0xJVEVSQUwgPSAibGl0ZXJhbCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NETF9VU0VfRU5DT0RFRCA9ICJlbmNvZGVkIjsKLQotCi0gICAgaW50IFdTRExfMV8xID0gMTsKLSAgICBpbnQgV1NETF8yXzAgPSAyOwotICAgIFN0cmluZyBJTlBVVF9QQVJUX1FOQU1FX1NVRkZJWCA9ICJfaW5wdXQiOwotICAgIFN0cmluZyBPVVRQVVRfUEFSVF9RTkFNRV9TVUZGSVggPSAiX291dHB1dCI7Ci0KLQotICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIFdTREwxMUNvbnN0YW50cyB7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBUeXBlIG5hbWUgZm9yIHRoZSBTT0FQIEFkZHJlc3MgZGVmaW5lZCBpbiB0aGUgUG9ydC9FbmRwb2ludAotICAgICAgICAgKi8KLSAgICAgICAgUU5hbWUgU09BUF8xMV9BRERSRVNTID0gbmV3IFFOYW1lKAotICAgICAgICAgICAgICAgIENvbnN0YW50cy5VUklfV1NETDExX1NPQVAsICJhZGRyZXNzIik7Ci0gICAgICAgIFFOYW1lIFNPQVBfMTJfQUREUkVTUyA9IG5ldyBRTmFtZSgKLSAgICAgICAgICAgICAgICBDb25zdGFudHMuVVJJX1dTREwxMl9TT0FQLCAiYWRkcmVzcyIpOwotICAgICAgICBRTmFtZSBTT0FQXzExX09QRVJBVElPTiA9IG5ldyBRTmFtZSgKLSAgICAgICAgICAgICAgICBDb25zdGFudHMuVVJJX1dTREwxMV9TT0FQLCAib3BlcmF0aW9uIik7Ci0gICAgICAgIFFOYW1lIFNPQVBfMTJfT1BFUkFUSU9OID0gbmV3IFFOYW1lKAotICAgICAgICAgICAgICAgIENvbnN0YW50cy5VUklfV1NETDEyX1NPQVAsICJvcGVyYXRpb24iKTsKLSAgICAgICAgUU5hbWUgU0NIRU1BID0gbmV3IFFOYW1lKAotICAgICAgICAgICAgICAgIENvbnN0YW50cy5VUklfMjAwMV9TQ0hFTUFfWFNELCAic2NoZW1hIik7Ci0gICAgICAgIFFOYW1lIFNPQVBfMTFfQk9EWSA9IG5ldyBRTmFtZSgKLSAgICAgICAgICAgICAgICBDb25zdGFudHMuVVJJX1dTREwxMV9TT0FQLCAiYm9keSIpOwotICAgICAgICBRTmFtZSBTT0FQXzEyX0JPRFkgPSBuZXcgUU5hbWUoCi0gICAgICAgICAgICAgICAgQ29uc3RhbnRzLlVSSV9XU0RMMTJfU09BUCwgImJvZHkiKTsKLSAgICAgICAgUU5hbWUgU09BUF8xMV9IRUFERVIgPSBuZXcgUU5hbWUoCi0gICAgICAgICAgICAgICAgQ29uc3RhbnRzLlVSSV9XU0RMMTFfU09BUCwgImhlYWRlciIpOwotICAgICAgICBRTmFtZSBTT0FQXzEyX0hFQURFUiA9IG5ldyBRTmFtZSgKLSAgICAgICAgICAgICAgICBDb25zdGFudHMuVVJJX1dTREwxMl9TT0FQLCAiaGVhZGVyIik7Ci0gICAgICAgIFFOYW1lIFNPQVBfMTFfQklORElORyA9IG5ldyBRTmFtZSgKLSAgICAgICAgICAgICAgICBDb25zdGFudHMuVVJJX1dTREwxMV9TT0FQLCAiYmluZGluZyIpOwotICAgICAgICBRTmFtZSBTT0FQXzEyX0JJTkRJTkcgPSBuZXcgUU5hbWUoCi0gICAgICAgICAgICAgICAgQ29uc3RhbnRzLlVSSV9XU0RMMTJfU09BUCwgImJpbmRpbmciKTsKLSAgICAgICAgUU5hbWUgUE9MSUNZID0gbmV3IFFOYW1lKAotICAgICAgICAgICAgICAgIENvbnN0YW50cy5VUklfUE9MSUNZLCAiUG9saWN5Iik7Ci0gICAgICAgIFFOYW1lIFBPTElDWV9SRUZFUkVOQ0UgPSBuZXcgUU5hbWUoCi0gICAgICAgICAgICAgICAgQ29uc3RhbnRzLlVSSV9QT0xJQ1ksICJQb2xpY3lSZWZlcmVuY2UiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNRVBfQ09OU1RBTlRfT1VUX0lOID0gMTY7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUVQX0NPTlNUQU5UX09VVF9PTkxZID0gMTQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUVQX0NPTlNUQU5UX0lOX09OTFkgPSAxMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNRVBfQ09OU1RBTlRfUk9CVVNUX0lOX09OTFkgPSAxMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNRVBfQ09OU1RBTlRfSU5fT1VUID0gMTI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUVQX0NPTlNUQU5UX0lOX09QVElPTkFMX09VVCA9IDEzOwotICAgIGludCBNRVBfQ09OU1RBTlRfT1VUX09QVElPTkFMX0lOID0gMTc7Ci0gICAgaW50IE1FUF9DT05TVEFOVF9JTlZBTElEID0gLTE7Ci0gICAgaW50IE1FUF9DT05TVEFOVF9ST0JVU1RfT1VUX09OTFkgPSAxNTsKLQotCi0gICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgV1NETDIwXzIwMDZDb25zdGFudHMgewotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDA2L0NSLXdzZGwyMC1hZGp1bmN0cy0yMDA2MDMyNy8jaW4tb25seQotICAgICAgICAgKiBAZGVwcmVjYXRlZCBQbGVhc2UgdXNlIG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uV1NETDJDb25zdGFudHMuTUVQX1VSSV9JTl9PTkxZCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgU3RyaW5nIE1FUF9VUklfSU5fT05MWSA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDA2LzAxL3dzZGwvaW4tb25seSI7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDA2L0NSLXdzZGwyMC1hZGp1bmN0cy0yMDA2MDMyNy8jcm9idXN0LWluLW9ubHkKLSAgICAgICAgICogQGRlcHJlY2F0ZWQgUGxlYXNlIHVzZSBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLldTREwyQ29uc3RhbnRzLk1FUF9VUklfUk9CVVNUX0lOX09OTFkKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgTUVQX1VSSV9ST0JVU1RfSU5fT05MWSA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDA2LzAxL3dzZGwvcm9idXN0LWluLW9ubHkiOwotICAgICAgICAvKioKLSAgICAgICAgICogaHR0cDovL3d3dy53My5vcmcvVFIvMjAwNi9DUi13c2RsMjAtYWRqdW5jdHMtMjAwNjAzMjcvI2luLW91dAotICAgICAgICAgKiBAZGVwcmVjYXRlZCBQbGVhc2UgdXNlIG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uV1NETDJDb25zdGFudHMuTUVQX1VSSV9JTl9PVVQKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgTUVQX1VSSV9JTl9PVVQgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwNi8wMS93c2RsL2luLW91dCI7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDA2L0NSLXdzZGwyMC1hZGp1bmN0cy0yMDA2MDMyNy8jaW4tb3B0LW91dAotICAgICAgICAgKiBAZGVwcmVjYXRlZCBQbGVhc2UgdXNlIG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uV1NETDJDb25zdGFudHMuTUVQX1VSSV9JTl9PUFRJT05BTF9PVVQKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgTUVQX1VSSV9JTl9PUFRJT05BTF9PVVQgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwNi8wMS93c2RsL2luLW9wdC1vdXQiOwotICAgICAgICAvKioKLSAgICAgICAgICogaHR0cDovL3d3dy53My5vcmcvVFIvMjAwNi9DUi13c2RsMjAtYWRqdW5jdHMtMjAwNjAzMjcvI291dC1vbmx5Ci0gICAgICAgICAqIEBkZXByZWNhdGVkIFBsZWFzZSB1c2Ugb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5XU0RMMkNvbnN0YW50cy5NRVBfVVJJX09VVF9PTkxZCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgU3RyaW5nIE1FUF9VUklfT1VUX09OTFkgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwNi8wMS93c2RsL291dC1vbmx5IjsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDYvQ1Itd3NkbDIwLWFkanVuY3RzLTIwMDYwMzI3LyNyb2J1c3Qtb3V0LW9ubHkKLSAgICAgICAgICogQGRlcHJlY2F0ZWQgUGxlYXNlIHVzZSBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLldTREwyQ29uc3RhbnRzLk1FUF9VUklfUk9CVVNUX09VVF9PTkxZCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgU3RyaW5nIE1FUF9VUklfUk9CVVNUX09VVF9PTkxZID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDYvMDEvd3NkbC9yb2J1c3Qtb3V0LW9ubHkiOwotICAgICAgICAvKioKLSAgICAgICAgICogaHR0cDovL3d3dy53My5vcmcvVFIvMjAwNi9DUi13c2RsMjAtYWRqdW5jdHMtMjAwNjAzMjcvI291dC1pbgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBQbGVhc2UgdXNlIG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uV1NETDJDb25zdGFudHMuTUVQX1VSSV9PVVRfSU4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgTUVQX1VSSV9PVVRfSU4gPSAiaHR0cDovL3d3dy53My5vcmcvMjAwNi8wMS93c2RsL291dC1pbiI7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDA2L0NSLXdzZGwyMC1hZGp1bmN0cy0yMDA2MDMyNy8jb3V0LW9wdC1pbgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBQbGVhc2UgdXNlIG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uV1NETDJDb25zdGFudHMuTUVQX1VSSV9PVVRfT1BUSU9OQUxfSU4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgTUVQX1VSSV9PVVRfT1BUSU9OQUxfSU4gPSAiaHR0cDovL3d3dy53My5vcmcvMjAwNi8wMS93c2RsL291dC1vcHQtaW4iOwotCi0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgV1NETDIwXzIwMDRfQ29uc3RhbnRzIHsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQGRlcHJlY2F0ZWQgUGxlYXNlIHVzZSBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLldTREwyQ29uc3RhbnRzLk1FUF9VUklfSU5fT05MWQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFN0cmluZyBNRVBfVVJJX0lOX09OTFkgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC93c2RsL2luLW9ubHkiOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBQbGVhc2UgdXNlIG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uV1NETDJDb25zdGFudHMuTUVQX1VSSV9ST0JVU1RfSU5fT05MWQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFN0cmluZyBNRVBfVVJJX1JPQlVTVF9JTl9PTkxZID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgvd3NkbC9yb2J1c3QtaW4tb25seSI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFBsZWFzZSB1c2Ugb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5XU0RMMkNvbnN0YW50cy5NRVBfVVJJX0lOX09VVAotICAgICAgICAgKi8KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIE1FUF9VUklfSU5fT1VUID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgvd3NkbC9pbi1vdXQiOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBQbGVhc2UgdXNlIG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uV1NETDJDb25zdGFudHMuTUVQX1VSSV9JTl9PUFRJT05BTF9PVVQKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgTUVQX1VSSV9JTl9PUFRJT05BTF9PVVQgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC93c2RsL2luLW9wdC1vdXQiOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBQbGVhc2UgdXNlIG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uV1NETDJDb25zdGFudHMuTUVQX1VSSV9PVVRfT05MWQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFN0cmluZyBNRVBfVVJJX09VVF9PTkxZID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgvd3NkbC9vdXQtb25seSI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFBsZWFzZSB1c2Ugb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5XU0RMMkNvbnN0YW50cy5NRVBfVVJJX1JPQlVTVF9PVVRfT05MWQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFN0cmluZyBNRVBfVVJJX1JPQlVTVF9PVVRfT05MWSA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvcm9idXN0LW91dC1vbmx5IjsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQGRlcHJlY2F0ZWQgUGxlYXNlIHVzZSBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLldTREwyQ29uc3RhbnRzLk1FUF9VUklfT1VUX0lOCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgU3RyaW5nIE1FUF9VUklfT1VUX0lOID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgvd3NkbC9vdXQtaW4iOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBQbGVhc2UgdXNlIG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uV1NETDJDb25zdGFudHMuTUVQX1VSSV9PVVRfT1BUSU9OQUxfSU4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgTUVQX1VSSV9PVVRfT1BUSU9OQUxfSU4gPSAiaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC93c2RsL291dC1vcHQtaW4iOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL1dTRExVdGlsLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9XU0RMVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMmUxMzI0Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL1dTRExVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIud3NkbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uV1NETDJDb25zdGFudHM7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi0vKioKLSAqIFNvbWUgdXRpbGl0eSBtZXRob2RzIGZvciB0aGUgV1NETCB1c2VycwotICovCi1wdWJsaWMgY2xhc3MgV1NETFV0aWwgewotCi0gICAgLyoqCi0gICAgICogcmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBtZXAgdXJpIGlzIG9uZSBvZiB0aGUKLSAgICAgKiBpbnB1dCBtZXBzCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVwCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzSW5wdXRQcmVzZW50Rm9yTUVQKFN0cmluZyBtZXApIHsKLSAgICAgICAgcmV0dXJuIFdTRExDb25zdGFudHMuV1NETDIwXzIwMDZDb25zdGFudHMuTUVQX1VSSV9JTl9PUFRJT05BTF9PVVQuZXF1YWxzKG1lcCkgfHwKLSAgICAgICAgICAgICAgICBXU0RMMkNvbnN0YW50cy5NRVBfVVJJX0lOX09OTFkuZXF1YWxzKG1lcCkgfHwKLSAgICAgICAgICAgICAgICBXU0RMMkNvbnN0YW50cy5NRVBfVVJJX0lOX09VVC5lcXVhbHMobWVwKSB8fAotICAgICAgICAgICAgICAgIFdTREwyQ29uc3RhbnRzLk1FUF9VUklfT1VUX0lOLmVxdWFscyhtZXApIHx8Ci0gICAgICAgICAgICAgICAgV1NETDJDb25zdGFudHMuTUVQX1VSSV9PVVRfT1BUSU9OQUxfSU4uZXF1YWxzKG1lcCkgfHwKLSAgICAgICAgICAgICAgICBXU0RMMkNvbnN0YW50cy5NRVBfVVJJX1JPQlVTVF9JTl9PTkxZLmVxdWFscyhtZXApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gbWVwIFVSSSBpcyBvbmUgb2YgdGhlIG91dHB1dCBtZXBzCi0gICAgICoKLSAgICAgKiBAcGFyYW0gTUVQCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzT3V0cHV0UHJlc2VudEZvck1FUChTdHJpbmcgTUVQKSB7Ci0gICAgICAgIHJldHVybiBXU0RMMkNvbnN0YW50cy5NRVBfVVJJX0lOX09QVElPTkFMX09VVC5lcXVhbHMoTUVQKSB8fAotICAgICAgICAgICAgICAgIFdTREwyQ29uc3RhbnRzLk1FUF9VUklfSU5fT1VULmVxdWFscyhNRVApIHx8Ci0gICAgICAgICAgICAgICAgV1NETDJDb25zdGFudHMuTUVQX1VSSV9PVVRfSU4uZXF1YWxzKE1FUCkgfHwKLSAgICAgICAgICAgICAgICBXU0RMMkNvbnN0YW50cy5NRVBfVVJJX09VVF9PTkxZLmVxdWFscyhNRVApIHx8Ci0gICAgICAgICAgICAgICAgV1NETDJDb25zdGFudHMuTUVQX1VSSV9PVVRfT1BUSU9OQUxfSU4uZXF1YWxzKE1FUCkgfHwKLSAgICAgICAgICAgICAgICBXU0RMMkNvbnN0YW50cy5NRVBfVVJJX1JPQlVTVF9PVVRfT05MWS5lcXVhbHMoTUVQKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBwYXJ0IG5hbWVzIGFyZSBub3QgdW5pcXVlIGFjcm9zcyBtZXNzYWdlcy4gSGVuY2UKLSAgICAgKiB3ZSBuZWVkIHNvbWUgd2F5IG9mIG1ha2luZyB0aGUgcGFydCBuYW1lIGEgdW5pcXVlCi0gICAgICogb25lIChkdWUgdG8gdGhlIGZhY3QgdGhhdCB0aGUgdHlwZSBtYXBwZXIKLSAgICAgKiBpcyBhIGdsb2JhbCBsaXN0IG9mIHR5cGVzKS4KLSAgICAgKiBUaGUgc2VlbWluZ2x5IGJlc3Qgd2F5IHRvIGRvIHRoYXQgaXMgdG8KLSAgICAgKiBzcGVjaWZ5IGEgbmFtZXNwYWNlIGZvciB0aGUgcGFydCBRTmFtZSByZWZlcmVuY2Ugd2hpY2gKLSAgICAgKiBpcyBzdG9yZWQgaW4gdGhlICBsaXN0LiBUaGlzIHBhcnQgcW5hbWUgaXMKLSAgICAgKiB0ZW1wb3JhcnkgYW5kIHNob3VsZCBub3QgYmUgdXNlZCB3aXRoIGl0J3MKLSAgICAgKiBuYW1lc3BhY2UgVVJJICh3aGljaCBoYXBwZW5lZCB0byBiZSB0aGUgb3BlcmF0aW9uIG5hbWUpCi0gICAgICogd2l0aCBfaW5wdXQgKG9yIGEgc2ltaWxhciBzdWZmaXgpIGF0dGFjaGVkIHRvIGl0Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gb3BOYW1lCi0gICAgICogQHBhcmFtIHN1ZmZpeAotICAgICAqIEBwYXJhbSBwYXJ0TmFtZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgUU5hbWUgZ2V0UGFydFFOYW1lKFN0cmluZyBvcE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHN1ZmZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGFydE5hbWUpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBRTmFtZShvcE5hbWUgKyBzdWZmaXgsIHBhcnROYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDb25zdGFudEZyb21IVFRQTG9jYXRpb24oU3RyaW5nIGh0dHBMb2NhdGlvbiwgU3RyaW5nIGh0dHBNZXRob2QpIHsKLSAgICAgICAgaWYgKGh0dHBMb2NhdGlvbi5jaGFyQXQoMCkgIT0gJz8nKSB7Ci0gICAgICAgICAgICBodHRwTG9jYXRpb24gPSAiLyIgKyBodHRwTG9jYXRpb247Ci0gICAgICAgIH0KLSAgICAgICAgaW50IGluZGV4ID0gaHR0cExvY2F0aW9uLmluZGV4T2YoInsiKTsKLSAgICAgICAgaWYgKGluZGV4ID4gLTEpIHsKLSAgICAgICAgICAgIGh0dHBMb2NhdGlvbiA9IGh0dHBMb2NhdGlvbi5zdWJzdHJpbmcoMCwgaW5kZXgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBodHRwTWV0aG9kICsgaHR0cExvY2F0aW9uOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdXRpbC9XU0RMNEpJbXBvcnRlZFdTRExIZWxwZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL3V0aWwvV1NETDRKSW1wb3J0ZWRXU0RMSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyNmMxZmUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdXRpbC9XU0RMNEpJbXBvcnRlZFdTRExIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIud3NkbC51dGlsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5JbXBvcnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5UeXBlczsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIHN1cHBvcnQgZm9yIHByb2Nlc3NpbmcgYSBXU0RMNEogZGVmaW50aW9uIHdoaWNoIGluY2x1ZGVzIGltcG9ydHMuCi0gKiBJdCBhbGxvd3MgdGhlIGltcG9ydHMgdG8gYmUgcHJvY2Vzc2VkIGludG8gYSBzaW5nbGUgV1NETDRKIERlZmluaXRpb24gb2JqZWN0Ci0gKi8KLXB1YmxpYyBjbGFzcyBXU0RMNEpJbXBvcnRlZFdTRExIZWxwZXIgewotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coV1NETDRKSW1wb3J0ZWRXU0RMSGVscGVyLmNsYXNzKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzVHJhY2VFbmFibGVkID0gbG9nLmlzVHJhY2VFbmFibGVkKCk7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgaW50ZW50aW9uIG9mIHRoaXMgcHJvY2VkdXJlIGlzIHRvIHByb2Nlc3MgdGhlIGltcG9ydHMuIFdoZW4KLSAgICAgKiBwcm9jZXNzaW5nIHRoZSBpbXBvcnRzIHRoZSBpbXBvcnRlZCBkb2N1bWVudHMgd2lsbCBiZSBwb3B1bGF0aW5nIHRoZQotICAgICAqIGl0ZW1zIGluIHRoZSBtYWluIGRvY3VtZW50IHJlY3Vyc2l2bGV5Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gd3NkbDRKRGVmaW5pdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwcm9jZXNzSW1wb3J0cyhEZWZpbml0aW9uIHdzZGw0SkRlZmluaXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0IHByb2Nlc3NlZERvY3VtZW50cykgewotCi0gICAgICAgICAgICBNYXAgd3NkbEltcG9ydHMgPSB3c2RsNEpEZWZpbml0aW9uLmdldEltcG9ydHMoKTsKLQotICAgICAgICAgICAgaWYgKG51bGwgIT0gd3NkbEltcG9ydHMgJiYgIXdzZGxJbXBvcnRzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIENvbGxlY3Rpb24gaW1wb3J0c0NvbGxlY3Rpb24gPSB3c2RsSW1wb3J0cy52YWx1ZXMoKTsKLSAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gaW1wb3J0c0NvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlcmF0b3IKLSAgICAgICAgICAgICAgICAgICAgICAgIC5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgICAgIFZlY3RvciB2YWx1ZXMgPSAoVmVjdG9yKSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBJbXBvcnQgd3NkbEltcG9ydCA9IChJbXBvcnQpIHZhbHVlcy5lbGVtZW50QXQoaSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3c2RsSW1wb3J0LmdldERlZmluaXRpb24oKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmaW5pdGlvbiBpbXBvcnRlZERlZiA9IHdzZGxJbXBvcnQuZ2V0RGVmaW5pdGlvbigpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGltcG9ydGVkRGVmICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9IGltcG9ydGVkRGVmLmdldERvY3VtZW50QmFzZVVSSSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoa2V5ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9IGltcG9ydGVkRGVmLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0b3AgcmVjdXJzaXZlIGltcG9ydHMhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9jZXNzZWREb2N1bWVudHMuY29udGFpbnMoa2V5KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZERvY3VtZW50cy5hZGQoa2V5KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzSW1wb3J0cyhpbXBvcnRlZERlZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzZWREb2N1bWVudHMpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvcHkgbnMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwIG5hbWVzcGFjZXMgPSBpbXBvcnRlZERlZi5nZXROYW1lc3BhY2VzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGtleXMgPSBuYW1lc3BhY2VzLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChrZXlzLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGtleTIgPSBrZXlzLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghd3NkbDRKRGVmaW5pdGlvbi5nZXROYW1lc3BhY2VzKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbnRhaW5zVmFsdWUobmFtZXNwYWNlcy5nZXQoa2V5MikpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NkbDRKRGVmaW5pdGlvbi5nZXROYW1lc3BhY2VzKCkucHV0KGtleTIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VzLmdldChrZXkyKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c2RsNEpEZWZpbml0aW9uLmdldE5hbWVzcGFjZXMoKS5wdXRBbGwobmFtZXNwYWNlcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvcHkgdHlwZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZXMgdCA9IGltcG9ydGVkRGVmLmdldFR5cGVzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3QgdHlwZXNMaXN0ID0gdC5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgdHlwZXNMaXN0LnNpemUoKTsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZXMgdHlwZXMgPSB3c2RsNEpEZWZpbml0aW9uLmdldFR5cGVzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZXMgPSB3c2RsNEpEZWZpbml0aW9uLmNyZWF0ZVR5cGVzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzZGw0SkRlZmluaXRpb24uc2V0VHlwZXModHlwZXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlcy5hZGRFeHRlbnNpYmlsaXR5RWxlbWVudCgoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpIHR5cGVzTGlzdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0KGopKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRkIG1lc3NhZ2VzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcCBtZXNzYWdlc01hcCA9IGltcG9ydGVkRGVmLmdldE1lc3NhZ2VzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzZGw0SkRlZmluaXRpb24uZ2V0TWVzc2FnZXMoKS5wdXRBbGwobWVzc2FnZXNNYXApOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkZCBwb3J0eXBlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXAgcG9ydHR5cGVNYXAgPSBpbXBvcnRlZERlZi5nZXRQb3J0VHlwZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NkbDRKRGVmaW5pdGlvbi5nZXRQb3J0VHlwZXMoKS5wdXRBbGwocG9ydHR5cGVNYXApOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkZCBiaW5kaW5ncwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXAgYmluZGluZ01hcCA9IGltcG9ydGVkRGVmLmdldEJpbmRpbmdzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzZGw0SkRlZmluaXRpb24uZ2V0QmluZGluZ3MoKS5wdXRBbGwoYmluZGluZ01hcCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRkIHNlcnZpY2VzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcCBzZXJ2aWNlTWFwID0gaW1wb3J0ZWREZWYuZ2V0U2VydmljZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NkbDRKRGVmaW5pdGlvbi5nZXRTZXJ2aWNlcygpLnB1dEFsbChzZXJ2aWNlTWFwKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0IGV4dEVsZW1lbnRMaXN0ID0gaW1wb3J0ZWREZWYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzZGw0SkRlZmluaXRpb24uZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuYWRkQWxsKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dEVsZW1lbnRMaXN0KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL3V0aWwvV1NETERlZmluaXRpb25XcmFwcGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC91dGlsL1dTRExEZWZpbml0aW9uV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2NiYjczLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL3V0aWwvV1NETERlZmluaXRpb25XcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ODIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi53c2RsLnV0aWw7DQotDQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0NvbmZpZ3VyYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nOw0KLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdGYXVsdDsNCi1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nSW5wdXQ7DQotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ09wZXJhdGlvbjsNCi1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nT3V0cHV0Ow0KLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247DQotaW1wb3J0IGphdmF4LndzZGwuRmF1bHQ7DQotaW1wb3J0IGphdmF4LndzZGwuSW1wb3J0Ow0KLWltcG9ydCBqYXZheC53c2RsLklucHV0Ow0KLWltcG9ydCBqYXZheC53c2RsLk1lc3NhZ2U7DQotaW1wb3J0IGphdmF4LndzZGwuT3BlcmF0aW9uOw0KLWltcG9ydCBqYXZheC53c2RsLk91dHB1dDsNCi1pbXBvcnQgamF2YXgud3NkbC5QYXJ0Ow0KLWltcG9ydCBqYXZheC53c2RsLlBvcnQ7DQotaW1wb3J0IGphdmF4LndzZGwuUG9ydFR5cGU7DQotaW1wb3J0IGphdmF4LndzZGwuU2VydmljZTsNCi1pbXBvcnQgamF2YXgud3NkbC5UeXBlczsNCi1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50Ow0KLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaW9uUmVnaXN0cnk7DQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotaW1wb3J0IGphdmEubmV0LlVSTDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotDQotLyoqDQotICogVGhlcmUgYXJlIGNhc2VzIHdoZXJlIGEgV1NETCBkZWZpbml0aW9uIGlzIGtlcHQgaW4gbWVtb3J5DQotICogaW4gY2FzZSBpdCBuZWVkcyB0byBiZSBhY2Nlc3NlZCBkdXJpbmcgcnVudGltZS4gIEluIHNpdHVhdGlvbnMgd2hlcmUgDQotICogdGhlcmUgYXJlIGxvdHMgb2YgV1NETCBkZWZpbml0aW9ucyBvciBiaWcgV1NETHMsIHRoZSBtZW1vcnkgZm9vdHByaW50IGNhbiBiZSANCi0gKiBodWdlLg0KLSAqDQotICogVGhpcyBjbGFzcyBwcm92aWRlcyBzdXBwb3J0IGZvciBwcm9jZXNzaW5nIGEgV1NETDRKIGRlZmluaXRpb24NCi0gKiB3aXRoIGEgbG93ZXIgbWVtb3J5IGZvb3RwcmludC4gIFRoaXMgaXMgdXNlZnVsIGZvciBjZXJ0YWluDQotICogZW52aXJvbm1lbnRzLg0KLSAqDQotICogVGhpcyBjbGFzcyBtYWtlcyB0aGUgZGVjaXNpb24gb24gd2hpY2ggaW1wbGVtZW50YXRpb24gdG8gdXNlDQotICogdG8gcmVkdWNlIG1lbW9yeSBmb290cHJpbnQuICBUaGlzIGFsbG93cyBvdGhlciBpbXBsZW1lbnRhdGlvbnMNCi0gKiB0byBiZSB1c2VkIGZvciBzcGVjaWZpYyBlbnZpcm9ubWVudHMgd2l0aG91dCBhZGRpbmcgbG90cyBvZiBleHRyYQ0KLSAqIG92ZXJoZWFkIHRvIGV2ZXJ5IGVudmlyb25tZW50Lg0KLSAqDQotICovDQotcHVibGljIGNsYXNzIFdTRExEZWZpbml0aW9uV3JhcHBlciBpbXBsZW1lbnRzIERlZmluaXRpb24gew0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coV1NETERlZmluaXRpb25XcmFwcGVyLmNsYXNzKTsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc0RlYnVnRW5hYmxlZCA9IGxvZy5pc0RlYnVnRW5hYmxlZCgpOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgbXlDbGFzc05hbWUgPSAiV1NETERlZmluaXRpb25XcmFwcGVyIjsNCi0NCi0gICAgLy8gamF2YXgud3NkbC5EZWZpbml0aW9uIGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUNCi0gICAgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0yNzg4ODA3Mzc1ODE0MDk3NDA5TDsNCi0NCi0NCi0gICAgLy8gdGhlIHNldHRpbmcgdXNlZCB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZSBpbi1tZW1vcnkgY29weSBvZiB0aGUgDQotICAgIC8vIFdTREwgZGVmaW5pdGlvbiBzaG91bGQgYmUgbWFuaXB1bGF0ZWQgdG8gcmVkdWNlIG1lbW9yeSBmb290cHJpbnQNCi0gICAgcHJpdmF0ZSBib29sZWFuIHJlZHVjZVdTRExNZW1vcnlDYWNoZSA9IGZhbHNlOw0KLQ0KLSAgICAvLyB0aGUgb3B0aW9uYWwgc2V0dGluZyB1c2VkIHRvIHNwZWNpZnkgd2hpY2ggdHlwZSBvZiByZWR1Y3Rpb24gdG8gdXNlDQotICAgIHByaXZhdGUgaW50IHJlZHVjZVdTRExNZW1vcnlUeXBlID0gMDsNCi0NCi0gICAgLy8gdGhlIHdyYXBwZXIgaW1wbGVtZW50YXRpb24gdG8gdXNlIA0KLSAgICBwcml2YXRlIFdTRExXcmFwcGVySW1wbCB3cmFwcGVySW1wbCA9IG51bGw7DQotDQotDQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSAgICAvLyBjb25zdHJ1Y3RvcnMNCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotDQotICAgIC8qKg0KLSAgICAgKiBDb25zdHJ1Y3Rvcg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGRlZiAgICBUaGUgV1NETCBEZWZpbml0aW9uDQotICAgICAqIEBkZXByZWNhdGVkIGJlY2F1c2UgdGhpcyBjb25zdHJ1Y3RvciBkb2VzIG5vdCBwcm92aWRlIGFueSBndWlkYW5jZSBmb3IgDQotICAgICAqIG1lbW9yeSB1c2FnZQ0KLSAgICAgKi8NCi0gICAgcHVibGljIFdTRExEZWZpbml0aW9uV3JhcHBlcihEZWZpbml0aW9uIGRlZikgew0KLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpICkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiV1NETERlZmluaXRpb25XcmFwcGVyKERlZmluaXRpb24pIGVudHJ5Iik7DQotICAgICAgICB9DQotICAgICAgICBwcmVwYXJlKGRlZiwgbnVsbCk7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBAcGFyYW0gZGVmDQotICAgICAqIEBwYXJhbSBsaW1pdE1lbW9yeSB0cnVlIGlmIHlvdSB3YW50IHRvIHVzZSBhIG1lbW9yeSBzZW5zaXRpdmUgd3JhcHBlcg0KLSAgICAgKi8NCi0gICAgcHVibGljIFdTRExEZWZpbml0aW9uV3JhcHBlcihEZWZpbml0aW9uIGRlZiwgYm9vbGVhbiBsaW1pdE1lbW9yeSwgaW50IG1lbW9yeVR5cGUpIHsNCi0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSApIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcoIldTRExEZWZpbml0aW9uV3JhcHBlcihEZWZpbml0aW9uLCBib29sZWFuKSBlbnRyeSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmVkdWNlV1NETE1lbW9yeUNhY2hlICA9IGxpbWl0TWVtb3J5Ow0KLSAgICAgICAgcmVkdWNlV1NETE1lbW9yeVR5cGUgPSBtZW1vcnlUeXBlOw0KLSAgICAgICAgcHJlcGFyZShkZWYsIG51bGwpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBAcGFyYW0gZGVmIFdEREwgRGVmaW5pdGlvbg0KLSAgICAgKiBAcGFyYW0gYXhpc0NvbmZpZyBBeGlzIENvbmZpZ3VyYXRpb24NCi0gICAgICovDQotICAgIHB1YmxpYyBXU0RMRGVmaW5pdGlvbldyYXBwZXIoRGVmaW5pdGlvbiBkZWYsQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZyApIHsNCi0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSApIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcoIldTRExEZWZpbml0aW9uV3JhcHBlcihEZWZpbml0aW9uLEF4aXNDb25maWd1cmF0aW9uKSBlbnRyeSAiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHNldHVwTWVtb3J5UGFybXMoYXhpc0NvbmZpZyk7DQotICAgICAgICBwcmVwYXJlKGRlZiwgbnVsbCk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIENvbnN0cnVjdG9yDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gZGVmICAgIFRoZSBXU0RMIERlZmluaXRpb24NCi0gICAgICogQHBhcmFtIHdVUkwgICBUaGUgVVJMIGZvciB0aGUgd3NkbA0KLSAgICAgKiBAZGVwcmVjYXRlZCB1c2UgYSBjb25zdHJ1Y3RvciB3aXRoIGEgQXhpc0NvbmZpZ3VyYXRpb24gb3IgbWVtb3J5IGxpbWl0IHBhcmFtZXRlcg0KLSAgICAgKi8NCi0gICAgcHVibGljIFdTRExEZWZpbml0aW9uV3JhcHBlcihEZWZpbml0aW9uIGRlZiwgVVJMIHdVUkwpIHsNCi0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSApIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcoIldTRExEZWZpbml0aW9uV3JhcHBlcihEZWZpbml0aW9uLFVSTCkgZW50cnkiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHByZXBhcmUoZGVmLCB3VVJMKTsNCi0gICAgfQ0KLQ0KLQ0KLSAgICAvKioNCi0gICAgICogQ29uc3RydWN0b3INCi0gICAgICogDQotICAgICAqIEBwYXJhbSBkZWYgICAgVGhlIFdTREwgRGVmaW5pdGlvbg0KLSAgICAgKiBAcGFyYW0gd1VSTCAgIFRoZSBVUkwgZm9yIHRoZSB3c2RsDQotICAgICAqIEBwYXJhbSBsaW1pdEluTWVtb3J5ICBUaGUgc2V0dGluZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGluLW1lbW9yeSBXU0RMIGNvcHkNCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgIHNob3VsZCBiZSBtYW5pcHVsYXRlZCB0byByZWR1Y2UgbWVtb3J5IGZvb3RwcmludA0KLSAgICAgKi8NCi0gICAgcHVibGljIFdTRExEZWZpbml0aW9uV3JhcHBlcihEZWZpbml0aW9uIGRlZiwgVVJMIHdVUkwsIGJvb2xlYW4gbGltaXRJbk1lbW9yeSkgew0KLSAgICAgICAgcmVkdWNlV1NETE1lbW9yeUNhY2hlID0gbGltaXRJbk1lbW9yeTsNCi0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSApIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcoIldTRExEZWZpbml0aW9uV3JhcHBlcihEZWZpbml0aW9uLFVSTCxib29sZWFuKSBlbnRyeSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcHJlcGFyZShkZWYsIHdVUkwpOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogQ29uc3RydWN0b3INCi0gICAgICogDQotICAgICAqIEBwYXJhbSBkZWYgICAgVGhlIFdTREwgRGVmaW5pdGlvbg0KLSAgICAgKiBAcGFyYW0gd1VSTCAgIFRoZSBVUkwgZm9yIHRoZSB3c2RsDQotICAgICAqIEBwYXJhbSBsaW1pdEluTWVtb3J5ICBUaGUgc2V0dGluZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGluLW1lbW9yeSBXU0RMIGNvcHkNCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgIHNob3VsZCBiZSBtYW5pcHVsYXRlZCB0byByZWR1Y2UgbWVtb3J5IGZvb3RwcmludA0KLSAgICAgKiBAcGFyYW0gbWVtb3J5VHlwZQ0KLSAgICAgKi8NCi0gICAgcHVibGljIFdTRExEZWZpbml0aW9uV3JhcHBlcihEZWZpbml0aW9uIGRlZiwgVVJMIHdVUkwsIGJvb2xlYW4gbGltaXRJbk1lbW9yeSwgaW50IG1lbW9yeVR5cGUpIHsNCi0gICAgICAgIHJlZHVjZVdTRExNZW1vcnlDYWNoZSA9IGxpbWl0SW5NZW1vcnk7DQotICAgICAgICB0aGlzLnJlZHVjZVdTRExNZW1vcnlUeXBlID0gbWVtb3J5VHlwZTsNCi0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSApIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcoIldTRExEZWZpbml0aW9uV3JhcHBlcihEZWZpbml0aW9uLFVSTCxib29sZWFuKSBlbnRyeSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcHJlcGFyZShkZWYsIHdVUkwpOw0KLSAgICB9DQotDQotDQotICAgIC8qKg0KLSAgICAgKiBDb25zdHJ1Y3Rvcg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGRlZiAgICBUaGUgV1NETCBEZWZpbml0aW9uDQotICAgICAqIEBwYXJhbSB3VVJMICAgVGhlIFVSTCBmb3IgdGhlIHdzZGwNCi0gICAgICogQHBhcmFtIGxpbWl0VHlwZSAgVGhlIHNldHRpbmcgaW5kaWNhdGluZyB3aGljaCByZWR1Y3Rpb24gdGVjaG5pcXVlDQotICAgICAqICAgICAgICAgICAgICAgICAgIHRvIHVzZSANCi0gICAgICovDQotICAgIHB1YmxpYyBXU0RMRGVmaW5pdGlvbldyYXBwZXIoRGVmaW5pdGlvbiBkZWYsIFVSTCB3VVJMLCBpbnQgbGltaXRUeXBlKSB7DQotICAgICAgICByZWR1Y2VXU0RMTWVtb3J5Q2FjaGUgPSB0cnVlOw0KLSAgICAgICAgcmVkdWNlV1NETE1lbW9yeVR5cGUgPSBsaW1pdFR5cGU7DQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkgKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKCJXU0RMRGVmaW5pdGlvbldyYXBwZXIoRGVmaW5pdGlvbixVUkwsaW50KSBlbnRyeSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcHJlcGFyZShkZWYsIHdVUkwpOw0KLSAgICB9DQotDQotDQotICAgIC8qKg0KLSAgICAgKiBDb25zdHJ1Y3Rvcg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGRlZiAgICBUaGUgV1NETCBEZWZpbml0aW9uDQotICAgICAqIEBwYXJhbSB3VVJMICAgVGhlIFVSTCBmb3IgdGhlIHdzZGwNCi0gICAgICogQHBhcmFtIGF4aXNDZmcgIFRoZSBBeGlzQ29uZmlndXJhdGlvbiBvYmplY3QsIHRvIGJlIHVzZWQgdG8gZ2V0IGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MgIA0KLSAgICAgKi8NCi0gICAgcHVibGljIFdTRExEZWZpbml0aW9uV3JhcHBlcihEZWZpbml0aW9uIGRlZiwgVVJMIHdVUkwsIEF4aXNDb25maWd1cmF0aW9uIGF4aXNDZmcpIHsNCi0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSApIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcoIldTRExEZWZpbml0aW9uV3JhcHBlcihEZWZpbml0aW9uLFVSTCxBeGlzQ29uZmlndXJhdGlvbikgZW50cnkiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vIGRldGVybWluZSB3aGF0IHRoZSBzZXR0aW5nIGZvciB0aGUgbWVtb3J5IG9wdGltaXphdGlvbiBpcw0KLSAgICAgICAgc2V0dXBNZW1vcnlQYXJtcyhheGlzQ2ZnKTsNCi0gICAgICAgIHByZXBhcmUoZGVmLCB3VVJMKTsNCi0gICAgfQ0KLQ0KLQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgc2V0dXBNZW1vcnlQYXJtcyggQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NmZykgew0KLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpICkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1Zygic2V0dXBNZW1vcnlQYXJtcyhBeGlzQ29uZmlndXJhdGlvbikgZW50cnkiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vIGRldGVybWluZSB3aGF0IHRoZSBzZXR0aW5nIGZvciB0aGUgbWVtb3J5IG9wdGltaXphdGlvbiBpcw0KLSAgICAgICAgaWYgKGF4aXNDZmcgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIFBhcmFtZXRlciBwYXJhbSA9IGF4aXNDZmcuZ2V0UGFyYW1ldGVyKENvbnN0YW50cy5Db25maWd1cmF0aW9uLlJFRFVDRV9XU0RMX01FTU9SWV9DQUNIRSk7DQotICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgIHJlZHVjZVdTRExNZW1vcnlDYWNoZSA9IA0KLSAgICAgICAgICAgICAgICBwYXJhbSAhPSBudWxsICYmICgoU3RyaW5nKSBwYXJhbS5nZXRWYWx1ZSgpKS5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIik7DQotDQotDQotICAgICAgICAgICAgcGFyYW0gPSBheGlzQ2ZnLmdldFBhcmFtZXRlcihDb25zdGFudHMuQ29uZmlndXJhdGlvbi5SRURVQ0VfV1NETF9NRU1PUllfVFlQRSk7DQotICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgIGlmIChwYXJhbSAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IChTdHJpbmcpIHBhcmFtLmdldFZhbHVlKCk7DQotDQotICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyIGkgPSBuZXcgSW50ZWdlcih2YWx1ZSk7DQotICAgICAgICAgICAgICAgICAgICByZWR1Y2VXU0RMTWVtb3J5VHlwZSA9IGkuaW50VmFsdWUoKTsgDQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpICkgew0KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoInJlZHVjZVdTRExNZW1vcnlDYWNoZToiKyByZWR1Y2VXU0RMTWVtb3J5Q2FjaGUgKyAiLCByZWR1Y2VXU0RMTWVtb3J5VHlwZToiICsgcmVkdWNlV1NETE1lbW9yeVR5cGUgKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSApIHsNCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJBeGlzQ29uZmlndXJhdGlvbiBpcyBudWxsLiAgVGhpcyBpcyB1bmV4cGVjdGVkIiApOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICB9DQotDQotDQotICAgIC8qKg0KLSAgICAgKiBJbml0aWFsaXplIHRoZSB3c2RsIGRlZmluaXRpb24gd3JhcHBlcg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGRlZiAgICBUaGUgV1NETDRKIGRlZmluaXRpb24NCi0gICAgICogQHBhcmFtIHdVUkwgICBUaGUgVVJMIHdoZXJlIHRoZSBXU0RMIGlzIG9idGFpbmVkDQotICAgICAqLw0KLSAgICBwcml2YXRlIHZvaWQgcHJlcGFyZShEZWZpbml0aW9uIGRlZiwgVVJMIHdVUkwpIHsNCi0gICAgICAgIA0KLSAgICAgICAgaWYgKHJlZHVjZVdTRExNZW1vcnlDYWNoZSkgew0KLQ0KLSAgICAgICAgICAgIC8vIGlmIHRoZSB0eXBlIGlzIHNwZWNpZmllZCwgdGhlbiB1c2UgaXQNCi0gICAgICAgICAgICAvLyBvdGhlcndpc2UsIGRlZmF1bHQgdG8gdGhlIHNlcmlhbGl6YXRpb24gdGVjaG5pcXVlDQotDQotICAgICAgICAgICAgaWYgKHJlZHVjZVdTRExNZW1vcnlUeXBlID09IDIpIHsNCi0gICAgICAgICAgICAgICAgLy8gYSB3cmFwcGVyIGltcGxlbWVudGF0aW9uIHRoYXQgdXNlcyByZWxlYXNlICYgcmVsb2FkIG9uIHRoZSANCi0gICAgICAgICAgICAgICAgLy8gdW5kZXJseWluZyBXU0RMNEogb2JqZWN0DQotICAgICAgICAgICAgICAgIC8vIHRoaXMgd291bGQgYmUgZGVzaXJhYmxlIGZvciB0aG9zZSBlbnZpcm9ubWVudHMgd2hlcmUgDQotICAgICAgICAgICAgICAgIC8vIG1hbnkgb2YgdGhlIFdTREwgZGVmaW5pdGlvbnMgYXJlIG5vdCBzZXJpYWxpemFibGUgDQotICAgICAgICAgICAgICAgIHdyYXBwZXJJbXBsID0gbmV3IFdTRExXcmFwcGVyUmVsb2FkSW1wbChkZWYsIHdVUkwpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlIHsNCi0gICAgICAgICAgICAgICAgLy8gYSB3cmFwcGVyIGltcGxlbWVudGF0aW9uIHRoYXQgdXNlcyBzZXJpYWxpemF0aW9uIHRvIHNhdmUgdGhlICANCi0gICAgICAgICAgICAgICAgLy8gdW5kZXJseWluZyBXU0RMNEogb2JqZWN0DQotICAgICAgICAgICAgICAgIHdyYXBwZXJJbXBsID0gbmV3IFdTRExXcmFwcGVyU2F2ZUltcGwoZGVmLCB3VVJMKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBlbHNlIHsNCi0gICAgICAgICAgICAvLyBhIHdyYXBwZXIgaW1wbGVtZW50YXRpb24gdGhhdCBpcyBqdXN0IGEgcGFzc3Rocm91Z2ggdG8gdGhlIA0KLSAgICAgICAgICAgIC8vIHVuZGVybHlpbmcgV1NETDRKIG9iamVjdA0KLSAgICAgICAgICAgIHdyYXBwZXJJbXBsID0gbmV3IFdTRExXcmFwcGVyQmFzaWNJbXBsKGRlZiwgd1VSTCk7DQotICAgICAgICB9DQotDQotICAgICAgICB3cmFwcGVySW1wbC5yZWxlYXNlUmVzb3VyY2VzKCk7DQotICAgIH0NCi0NCi0NCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotICAgIC8vIHB1YmxpYyBXU0RMRGVmaW5pdGlvbldyYXBwZXIgbWV0aG9kcw0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0NCi0gICAgLyoNCi0gICAgICogUmV0dXJucyB0aGUgV1NETDRKIERlZmluaXRpb24gb2JqZWN0IHRoYXQgaXMgYmVpbmcgd3JhcHBlZA0KLSAgICAgKi8NCi0gICAgcHVibGljIERlZmluaXRpb24gZ2V0VW53cmFwcGVkRGVmaW5pdGlvbigpIHsNCi0NCi0gICAgICAgIHJldHVybiB3cmFwcGVySW1wbC5nZXRVbndyYXBwZWREZWZpbml0aW9uKCk7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyBpbnQgZ2V0TWVtb3J5TGltaXRUeXBlKCkgew0KLSAgICAgICAgcmV0dXJuIHRoaXMucmVkdWNlV1NETE1lbW9yeVR5cGU7DQotICAgIH0NCi0NCi0NCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotICAgIC8vIGphdmF4LndzZGwuRGVmaW50aW9uIGludGVyZmFjZSBtZXRob2RzDQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXREb2N1bWVudEJhc2VVUkkoU3RyaW5nIGQpIHsNCi0gICAgICAgIC8vIFNldCB0aGUgVVJJIG9mIHRoZSBiYXNlIGRvY3VtZW50IGZvciB0aGUgRGVmaW5pdGlvbi4NCi0gICAgICAgIC8vIFRoaXMgaWRlbnRpZmllcyB0aGUgb3JpZ2luIG9mIHRoZSBEZWZpbml0aW9uLg0KLSAgICAgICAgLy8gTm90ZSB0aGF0IHRoaXMgaXMgdGhlIFVSSSBvZiB0aGUgYmFzZSBkb2N1bWVudCwgbm90IHRoZSBpbXBvcnRzLg0KLQ0KLSAgICAgICAgd3JhcHBlckltcGwuc2V0RG9jdW1lbnRCYXNlVVJJKGQpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RG9jdW1lbnRCYXNlVVJJKCkgew0KLSAgICAgICAgLy8gR2V0IHRoZSBVUkkgb2YgdGhlIGJhc2UgZG9jdW1lbnQgZm9yIHRoZSBEZWZpbml0aW9uLg0KLSAgICAgICAgLy8gVGhpcyBpZGVudGlmaWVzIHRoZSBvcmlnaW4gb2YgdGhlIERlZmluaXRpb24uDQotICAgICAgICAvLyBOb3RlIHRoYXQgdGhpcyBpcyB0aGUgVVJJIG9mIHRoZSBiYXNlIGRvY3VtZW50LCBub3QgdGhlIGltcG9ydHMuDQotDQotICAgICAgICByZXR1cm4gd3JhcHBlckltcGwuZ2V0RG9jdW1lbnRCYXNlVVJJKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0UU5hbWUoUU5hbWUgbikgew0KLSAgICAgICAgd3JhcHBlckltcGwuc2V0UU5hbWUobik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFFOYW1lIGdldFFOYW1lKCkgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZXJJbXBsLmdldFFOYW1lKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0VGFyZ2V0TmFtZXNwYWNlKFN0cmluZyB0KSB7DQotICAgICAgICB3cmFwcGVySW1wbC5zZXRUYXJnZXROYW1lc3BhY2UodCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRUYXJnZXROYW1lc3BhY2UoKSB7DQotICAgICAgICByZXR1cm4gd3JhcHBlckltcGwuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgYWRkTmFtZXNwYWNlKFN0cmluZyBwcmVmaXgsIFN0cmluZyBuYW1lc3BhY2VVUkkpIHsNCi0gICAgICAgIHdyYXBwZXJJbXBsLmFkZE5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyByZW1vdmVOYW1lc3BhY2UoU3RyaW5nIHByZWZpeCkgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZXJJbXBsLnJlbW92ZU5hbWVzcGFjZShwcmVmaXgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlKFN0cmluZyBwcmVmaXgpIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVySW1wbC5nZXROYW1lc3BhY2UocHJlZml4KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByZWZpeChTdHJpbmcgbmFtZXNwYWNlVVJJKSB7DQotICAgICAgICByZXR1cm4gd3JhcHBlckltcGwuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE1hcCBnZXROYW1lc3BhY2VzKCkgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZXJJbXBsLmdldE5hbWVzcGFjZXMoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTGlzdCBnZXROYXRpdmVBdHRyaWJ1dGVOYW1lcygpIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVySW1wbC5nZXROYXRpdmVBdHRyaWJ1dGVOYW1lcygpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFR5cGVzKFR5cGVzIHR5cGVzKSB7DQotICAgICAgICB3cmFwcGVySW1wbC5zZXRUeXBlcyh0eXBlcyk7DQotICAgIH0NCi0NCi0NCi0gICAgcHVibGljIFR5cGVzIGdldFR5cGVzKCkgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZXJJbXBsLmdldFR5cGVzKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgYWRkSW1wb3J0KEltcG9ydCBpbXBvcnREZWYpIHsNCi0gICAgICAgIHdyYXBwZXJJbXBsLmFkZEltcG9ydChpbXBvcnREZWYpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBJbXBvcnQgcmVtb3ZlSW1wb3J0KEltcG9ydCBpbXBvcnREZWYpIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVySW1wbC5yZW1vdmVJbXBvcnQoaW1wb3J0RGVmKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTGlzdCBnZXRJbXBvcnRzKFN0cmluZyBuYW1lc3BhY2VVUkkpIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVySW1wbC5nZXRJbXBvcnRzKG5hbWVzcGFjZVVSSSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE1hcCBnZXRJbXBvcnRzKCkgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZXJJbXBsLmdldEltcG9ydHMoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZGRNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgew0KLSAgICAgICAgd3JhcHBlckltcGwuYWRkTWVzc2FnZShtZXNzYWdlKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTWVzc2FnZSBnZXRNZXNzYWdlKFFOYW1lIG5hbWUpIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVySW1wbC5nZXRNZXNzYWdlKG5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBNZXNzYWdlIHJlbW92ZU1lc3NhZ2UoUU5hbWUgbmFtZSkgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZXJJbXBsLnJlbW92ZU1lc3NhZ2UobmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE1hcCBnZXRNZXNzYWdlcygpIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVySW1wbC5nZXRNZXNzYWdlcygpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGFkZEJpbmRpbmcoQmluZGluZyBiaW5kaW5nKSB7DQotICAgICAgICB3cmFwcGVySW1wbC5hZGRCaW5kaW5nKGJpbmRpbmcpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBCaW5kaW5nIGdldEJpbmRpbmcoUU5hbWUgbmFtZSkgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZXJJbXBsLmdldEJpbmRpbmcobmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEJpbmRpbmcgcmVtb3ZlQmluZGluZyhRTmFtZSBuYW1lKSB7DQotICAgICAgICByZXR1cm4gd3JhcHBlckltcGwucmVtb3ZlQmluZGluZyhuYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTWFwIGdldEJpbmRpbmdzKCkgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZXJJbXBsLmdldEJpbmRpbmdzKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE1hcCBnZXRBbGxCaW5kaW5ncygpIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVySW1wbC5nZXRBbGxCaW5kaW5ncygpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGFkZFBvcnRUeXBlKFBvcnRUeXBlIHBvcnRUeXBlKSB7DQotICAgICAgICB3cmFwcGVySW1wbC5hZGRQb3J0VHlwZShwb3J0VHlwZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFBvcnRUeXBlIGdldFBvcnRUeXBlKFFOYW1lIG5hbWUpIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVySW1wbC5nZXRQb3J0VHlwZShuYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUG9ydFR5cGUgcmVtb3ZlUG9ydFR5cGUoUU5hbWUgbmFtZSkgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZXJJbXBsLnJlbW92ZVBvcnRUeXBlKG5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBNYXAgZ2V0UG9ydFR5cGVzKCkgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZXJJbXBsLmdldFBvcnRUeXBlcygpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBNYXAgZ2V0QWxsUG9ydFR5cGVzKCkgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZXJJbXBsLmdldEFsbFBvcnRUeXBlcygpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGFkZFNlcnZpY2UoU2VydmljZSBzZXJ2aWNlKSB7DQotICAgICAgICB3cmFwcGVySW1wbC5hZGRTZXJ2aWNlKHNlcnZpY2UpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTZXJ2aWNlIGdldFNlcnZpY2UoUU5hbWUgbmFtZSkgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZXJJbXBsLmdldFNlcnZpY2UobmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFNlcnZpY2UgcmVtb3ZlU2VydmljZShRTmFtZSBuYW1lKSB7DQotICAgICAgICByZXR1cm4gd3JhcHBlckltcGwucmVtb3ZlU2VydmljZShuYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTWFwIGdldFNlcnZpY2VzKCkgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZXJJbXBsLmdldFNlcnZpY2VzKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE1hcCBnZXRBbGxTZXJ2aWNlcygpIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVySW1wbC5nZXRBbGxTZXJ2aWNlcygpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldERvY3VtZW50YXRpb25FbGVtZW50KG9yZy53M2MuZG9tLkVsZW1lbnQgZG9jRWwpIHsNCi0gICAgICAgIHdyYXBwZXJJbXBsLnNldERvY3VtZW50YXRpb25FbGVtZW50KGRvY0VsKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgb3JnLnczYy5kb20uRWxlbWVudCBnZXREb2N1bWVudGF0aW9uRWxlbWVudCgpIHsNCi0gICAgICAgIHJldHVybiAgd3JhcHBlckltcGwuZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZGRFeHRlbnNpYmlsaXR5RWxlbWVudChFeHRlbnNpYmlsaXR5RWxlbWVudCBleHRFbGVtZW50KSB7DQotICAgICAgICB3cmFwcGVySW1wbC5hZGRFeHRlbnNpYmlsaXR5RWxlbWVudChleHRFbGVtZW50KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTGlzdCBnZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSB7DQotICAgICAgICByZXR1cm4gd3JhcHBlckltcGwuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEJpbmRpbmcgY3JlYXRlQmluZGluZygpIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVySW1wbC5jcmVhdGVCaW5kaW5nKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEJpbmRpbmdGYXVsdCBjcmVhdGVCaW5kaW5nRmF1bHQoKSB7DQotICAgICAgICByZXR1cm4gd3JhcHBlckltcGwuY3JlYXRlQmluZGluZ0ZhdWx0KCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEJpbmRpbmdJbnB1dCBjcmVhdGVCaW5kaW5nSW5wdXQoKSB7DQotICAgICAgICByZXR1cm4gd3JhcHBlckltcGwuY3JlYXRlQmluZGluZ0lucHV0KCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEJpbmRpbmdPcGVyYXRpb24gY3JlYXRlQmluZGluZ09wZXJhdGlvbigpIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVySW1wbC5jcmVhdGVCaW5kaW5nT3BlcmF0aW9uKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEJpbmRpbmdPdXRwdXQgY3JlYXRlQmluZGluZ091dHB1dCgpIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVySW1wbC5jcmVhdGVCaW5kaW5nT3V0cHV0KCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEZhdWx0IGNyZWF0ZUZhdWx0KCkgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZXJJbXBsLmNyZWF0ZUZhdWx0KCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEltcG9ydCBjcmVhdGVJbXBvcnQoKSB7DQotICAgICAgICByZXR1cm4gd3JhcHBlckltcGwuY3JlYXRlSW1wb3J0KCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIElucHV0IGNyZWF0ZUlucHV0KCkgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZXJJbXBsLmNyZWF0ZUlucHV0KCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE1lc3NhZ2UgY3JlYXRlTWVzc2FnZSgpIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVySW1wbC5jcmVhdGVNZXNzYWdlKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE9wZXJhdGlvbiBjcmVhdGVPcGVyYXRpb24oKSB7DQotICAgICAgICByZXR1cm4gd3JhcHBlckltcGwuY3JlYXRlT3BlcmF0aW9uKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE91dHB1dCBjcmVhdGVPdXRwdXQoKSB7DQotICAgICAgICByZXR1cm4gd3JhcHBlckltcGwuY3JlYXRlT3V0cHV0KCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFBhcnQgY3JlYXRlUGFydCgpIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVySW1wbC5jcmVhdGVQYXJ0KCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFBvcnQgY3JlYXRlUG9ydCgpIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVySW1wbC5jcmVhdGVQb3J0KCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFBvcnRUeXBlIGNyZWF0ZVBvcnRUeXBlKCkgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZXJJbXBsLmNyZWF0ZVBvcnRUeXBlKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFNlcnZpY2UgY3JlYXRlU2VydmljZSgpIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVySW1wbC5jcmVhdGVTZXJ2aWNlKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFR5cGVzIGNyZWF0ZVR5cGVzKCkgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZXJJbXBsLmNyZWF0ZVR5cGVzKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RXh0ZW5zaW9uUmVnaXN0cnkoRXh0ZW5zaW9uUmVnaXN0cnkgZXh0UmVnKSB7DQotICAgICAgICB3cmFwcGVySW1wbC5zZXRFeHRlbnNpb25SZWdpc3RyeShleHRSZWcpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBFeHRlbnNpb25SZWdpc3RyeSBnZXRFeHRlbnNpb25SZWdpc3RyeSgpIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVySW1wbC5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQotICAgICAgICByZXR1cm4gd3JhcHBlckltcGwudG9TdHJpbmcoKTsNCi0gICAgfQ0KLQ0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0gICAgLy8gb3RoZXIgQWJzdHJhY3RXU0RMRWxlbWVudCBtZXRob2RzDQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQ0KLSAgICBwdWJsaWMgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgcmVtb3ZlRXh0ZW5zaWJpbGl0eUVsZW1lbnQoRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZXh0RWxlbWVudCkgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZXJJbXBsLnJlbW92ZUV4dGVuc2liaWxpdHlFbGVtZW50KGV4dEVsZW1lbnQpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGdldEV4dGVuc2lvbkF0dHJpYnV0ZShRTmFtZSBuYW1lKSB7DQotICAgICAgICByZXR1cm4gd3JhcHBlckltcGwuZ2V0RXh0ZW5zaW9uQXR0cmlidXRlKG5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBNYXAgZ2V0RXh0ZW5zaW9uQXR0cmlidXRlcygpIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVySW1wbC5nZXRFeHRlbnNpb25BdHRyaWJ1dGVzKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RXh0ZW5zaW9uQXR0cmlidXRlKFFOYW1lIG5hbWUsIGphdmEubGFuZy5PYmplY3QgdmFsdWUpIHsNCi0gICAgICAgIHdyYXBwZXJJbXBsLnNldEV4dGVuc2lvbkF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdXRpbC9XU0RMV3JhcHBlckJhc2ljSW1wbC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdXRpbC9XU0RMV3JhcHBlckJhc2ljSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjlhYzMwLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL3V0aWwvV1NETFdyYXBwZXJCYXNpY0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLndzZGwudXRpbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLkphdmFVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmc7DQotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ0ZhdWx0Ow0KLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdJbnB1dDsNCi1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nT3BlcmF0aW9uOw0KLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdPdXRwdXQ7DQotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsNCi1pbXBvcnQgamF2YXgud3NkbC5GYXVsdDsNCi1pbXBvcnQgamF2YXgud3NkbC5JbXBvcnQ7DQotaW1wb3J0IGphdmF4LndzZGwuSW5wdXQ7DQotaW1wb3J0IGphdmF4LndzZGwuTWVzc2FnZTsNCi1pbXBvcnQgamF2YXgud3NkbC5PcGVyYXRpb247DQotaW1wb3J0IGphdmF4LndzZGwuT3V0cHV0Ow0KLWltcG9ydCBqYXZheC53c2RsLlBhcnQ7DQotaW1wb3J0IGphdmF4LndzZGwuUG9ydDsNCi1pbXBvcnQgamF2YXgud3NkbC5Qb3J0VHlwZTsNCi1pbXBvcnQgamF2YXgud3NkbC5TZXJ2aWNlOw0KLWltcG9ydCBqYXZheC53c2RsLlR5cGVzOw0KLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7DQotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpb25SZWdpc3RyeTsNCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0NCi0vKioNCi0gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIHN1cHBvcnQgZm9yIHByb2Nlc3NpbmcgYSBXU0RMNEogZGVmaW5pdGlvbg0KLSAqIHdpdGggYSBsb3dlciBtZW1vcnkgZm9vdHByaW50LiAgVGhpcyBpcyB1c2VmdWwgZm9yIGNlcnRhaW4NCi0gKiBlbnZpcm9ubWVudHMuDQotICovDQotcHVibGljIGNsYXNzIFdTRExXcmFwcGVyQmFzaWNJbXBsIGltcGxlbWVudHMgV1NETFdyYXBwZXJJbXBsIHsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFdTRExXcmFwcGVyQmFzaWNJbXBsLmNsYXNzKTsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc0RlYnVnRW5hYmxlZCA9IGxvZy5pc0RlYnVnRW5hYmxlZCgpOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgbXlDbGFzc05hbWUgPSAiV1NETFdyYXBwZXJCYXNpY0ltcGwiOw0KLQ0KLSAgICAvLyBqYXZheC53c2RsLkRlZmluaXRpb24gaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZQ0KLSAgICBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTI3ODg4MDczNzU4MTQwOTc0MDlMOw0KLQ0KLSAgICAvLyB0aGUgd3NkbDRqIHdzZGwgZGVmaW5pdGlvbiBvYmplY3QgdGhhdCBpcyBiZWluZyB3cmFwcGVkDQotICAgIHByaXZhdGUgRGVmaW5pdGlvbiB3c2RsRGVmaW5pdGlvbiA9IG51bGw7DQotDQotICAgIC8vIHRoZSBsb2NhdGlvbiBvZiB0aGUgYmFzZSBkb2N1bWVudCB1c2VkIGluIHRoZSB3c2RsNGogZGVmaW5pdGlvbg0KLSAgICBwcml2YXRlIFVSTCB3c2RsVVJMID0gbnVsbDsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgd3NkbEV4cGxpY2l0VVJJID0gbnVsbDsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgd3NkbERvY3VtZW50QmFzZVVSSSA9IG51bGw7DQotDQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSAgICAvLyBjb25zdHJ1Y3RvcnMNCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotDQotICAgIC8qKg0KLSAgICAgKiBDb25zdHJ1Y3Rvcg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGRlZiAgICBUaGUgV1NETCBEZWZpbml0aW9uDQotICAgICAqLw0KLSAgICBwdWJsaWMgV1NETFdyYXBwZXJCYXNpY0ltcGwoRGVmaW5pdGlvbiBkZWYpIHsNCi0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiV1NETFdyYXBwZXJCYXNpY0ltcGwoRGVmaW5pdGlvbiBkZWYpIGNhbGxlZCIpOw0KLSAgICAgICAgICAgIGxvZy50cmFjZShKYXZhVXRpbHMuY2FsbFN0YWNrVG9TdHJpbmcoKSk7DQotICAgICAgICB9DQotICAgICAgICBwcmVwYXJlKGRlZiwgbnVsbCk7DQotICAgIH0NCi0NCi0NCi0gICAgLyoqDQotICAgICAqIENvbnN0cnVjdG9yDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gZGVmICAgIFRoZSBXU0RMIERlZmluaXRpb24NCi0gICAgICogQHBhcmFtIHdVUkwgICBUaGUgVVJMIGZvciB0aGUgd3NkbA0KLSAgICAgKi8NCi0gICAgcHVibGljIFdTRExXcmFwcGVyQmFzaWNJbXBsKERlZmluaXRpb24gZGVmLCBVUkwgd1VSTCkgew0KLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKCJXU0RMV3JhcHBlckJhc2ljSW1wbChEZWZpbml0aW9uIGRlZiwgVVJMIHdVUkwpIGNhbGxlZCIpOw0KLSAgICAgICAgICAgIGxvZy50cmFjZShKYXZhVXRpbHMuY2FsbFN0YWNrVG9TdHJpbmcoKSk7DQotICAgICAgICB9DQotICAgICAgICBwcmVwYXJlKGRlZiwgd1VSTCk7DQotICAgIH0NCi0NCi0NCi0gICAgLyoqDQotICAgICAqIEluaXRpYWxpemUgdGhlIHdzZGwgZGVmaW5pdGlvbiB3cmFwcGVyDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gZGVmICAgIFRoZSBXU0RMNEogZGVmaW5pdGlvbg0KLSAgICAgKiBAcGFyYW0gd1VSTCAgIFRoZSBVUkwgd2hlcmUgdGhlIFdTREwgaXMgb2J0YWluZWQNCi0gICAgICovDQotICAgIHByaXZhdGUgdm9pZCBwcmVwYXJlKERlZmluaXRpb24gZGVmLCBVUkwgd1VSTCkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5wcmVwYXJlKCkiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgd3NkbERlZmluaXRpb24gPSBkZWY7DQotICAgICAgICB3c2RsVVJMID0gd1VSTDsNCi0gICAgfQ0KLQ0KLQ0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0gICAgLy8gcHVibGljIFdTRExXcmFwcGVySW1wbCBtZXRob2RzDQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQ0KLSAgICAvKg0KLSAgICAgKiBSZWxlYXNlcyBvYmplY3RzIHRvIHJlZHVjZSBtZW1vcnkgZm9vdHByaW50Lg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgcmVsZWFzZVJlc291cmNlcygpIHsNCi0gICAgICAgIC8vIHBsYWNlaG9sZGVyDQotICAgIH0NCi0NCi0NCi0gICAgLyoNCi0gICAgICogUmV0dXJucyB0aGUgV1NETDRKIERlZmluaXRpb24gb2JqZWN0IHRoYXQgaXMgYmVpbmcgd3JhcHBlZA0KLSAgICAgKi8NCi0gICAgcHVibGljIERlZmluaXRpb24gZ2V0VW53cmFwcGVkRGVmaW5pdGlvbigpIHsNCi0gICAgICAgIERlZmluaXRpb24gZGVmOw0KLQ0KLSAgICAgICAgaWYgKCh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSAmJg0KLSAgICAgICAgICAgICh3c2RsRGVmaW5pdGlvbiBpbnN0YW5jZW9mIFdTRExEZWZpbml0aW9uV3JhcHBlcikpIHsNCi0gICAgICAgICAgICBkZWYgPSAoKFdTRExEZWZpbml0aW9uV3JhcHBlcikgd3NkbERlZmluaXRpb24pLmdldFVud3JhcHBlZERlZmluaXRpb24oKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgZGVmID0gd3NkbERlZmluaXRpb247DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gZGVmOw0KLSAgICB9DQotDQotDQotICAgIC8qKg0KLSAgICAgKiBTZXRzIHRoZSBXU0RMNEogRGVmaW5pdGlvbiBvYmplY3QgdGhhdCBpcyBiZWluZyB3cmFwcGVkDQotICAgICAqDQotICAgICAqIEBwYXJhbSBkICB0aGUgV1NETDRKIERlZmluaXRpb24gb2JqZWN0DQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBzZXREZWZpbml0aW9uVG9XcmFwKERlZmluaXRpb24gZCkgew0KLSAgICAgICAgd3NkbERlZmluaXRpb24gPSBkOw0KLSAgICB9DQotDQotDQotICAgIC8qKg0KLSAgICAgKiBTZXRzIHRoZSBsb2NhdGlvbiBmb3IgdGhlIFdTREw0SiBEZWZpbml0aW9uIG9iamVjdCB0aGF0IGlzIGJlaW5nIHdyYXBwZWQNCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHNldFdTRExMb2NhdGlvbihTdHJpbmcgdXJpTG9jYXRpb24pIHsNCi0gICAgICAgIGlmICh1cmlMb2NhdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICAgICAgd3NkbFVSTCA9IG5ldyBVUkwodXJpTG9jYXRpb24pOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICAgICAgLy8gdG9kbw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLQ0KLSAgICAvKioNCi0gICAgICogR2V0cyB0aGUgbG9jYXRpb24gZm9yIHRoZSBXU0RMNEogRGVmaW5pdGlvbiBvYmplY3QgdGhhdCBpcyBiZWluZyB3cmFwcGVkDQotICAgICAqLw0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFdTRExMb2NhdGlvbigpIHsNCi0gICAgICAgIGlmICh3c2RsVVJMICE9IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gd3NkbFVSTC50b1N0cmluZygpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0NCi0gICAgLyoqDQotICAgICAqIENsb3NlcyB0aGUgdXNlIG9mIHRoZSB3cmFwcGVyIGltcGxlbWVudGF0aW9uIGFuZCBhbGxvd3MgDQotICAgICAqIGludGVybmFsIHJlc291cmNlcyB0byBiZSByZWxlYXNlZC4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgew0KLSAgICAgICAgLy8gbm90aGluZyB0byBkbyBmb3IgdGhpcyBpbXBsZW1lbnRhdGlvbg0KLSAgICB9DQotDQotDQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSAgICAvLyBqYXZheC53c2RsLkRlZmludGlvbiBpbnRlcmZhY2UgbWV0aG9kcw0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RG9jdW1lbnRCYXNlVVJJKFN0cmluZyBkKSB7DQotDQotICAgICAgICAvLyBTZXQgdGhlIFVSSSBvZiB0aGUgYmFzZSBkb2N1bWVudCBmb3IgdGhlIERlZmluaXRpb24uDQotICAgICAgICAvLyBUaGlzIGlkZW50aWZpZXMgdGhlIG9yaWdpbiBvZiB0aGUgRGVmaW5pdGlvbi4NCi0gICAgICAgIC8vIE5vdGUgdGhhdCB0aGlzIGlzIHRoZSBVUkkgb2YgdGhlIGJhc2UgZG9jdW1lbnQsIG5vdCB0aGUgaW1wb3J0cy4NCi0NCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuc2V0RG9jdW1lbnRCYXNlVVJJKCIgKyBkICsgIikiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgd3NkbERlZmluaXRpb24uc2V0RG9jdW1lbnRCYXNlVVJJKGQpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RG9jdW1lbnRCYXNlVVJJKCkgew0KLQ0KLSAgICAgICAgLy8gR2V0IHRoZSBVUkkgb2YgdGhlIGJhc2UgZG9jdW1lbnQgZm9yIHRoZSBEZWZpbml0aW9uLg0KLSAgICAgICAgLy8gVGhpcyBpZGVudGlmaWVzIHRoZSBvcmlnaW4gb2YgdGhlIERlZmluaXRpb24uDQotICAgICAgICAvLyBOb3RlIHRoYXQgdGhpcyBpcyB0aGUgVVJJIG9mIHRoZSBiYXNlIGRvY3VtZW50LCBub3QgdGhlIGltcG9ydHMuDQotDQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmdldERvY3VtZW50QmFzZVVSSSgpIik7DQotICAgICAgICB9DQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiB3c2RsRGVmaW5pdGlvbi5nZXREb2N1bWVudEJhc2VVUkkoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFFOYW1lKFFOYW1lIG4pIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuc2V0UU5hbWUoIiArIG4gKyAiKSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICB3c2RsRGVmaW5pdGlvbi5zZXRRTmFtZShuKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUU5hbWUgZ2V0UU5hbWUoKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmdldFFOYW1lKCkiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuIHdzZGxEZWZpbml0aW9uLmdldFFOYW1lKCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRUYXJnZXROYW1lc3BhY2UoU3RyaW5nIHQpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuc2V0VGFyZ2V0TmFtZXNwYWNlKCIgKyB0ICsgIikiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgd3NkbERlZmluaXRpb24uc2V0VGFyZ2V0TmFtZXNwYWNlKHQpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0TmFtZXNwYWNlKCkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5nZXRUYXJnZXROYW1lc3BhY2UoKSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gd3NkbERlZmluaXRpb24uZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZGROYW1lc3BhY2UoU3RyaW5nIHByZWZpeCwgU3RyaW5nIG5hbWVzcGFjZVVSSSkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5hZGROYW1lc3BhY2UoIiArIHByZWZpeCArICIsICIgKyBuYW1lc3BhY2VVUkkgKyAiKSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICB3c2RsRGVmaW5pdGlvbi5hZGROYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgcmVtb3ZlTmFtZXNwYWNlKFN0cmluZyBwcmVmaXgpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIucmVtb3ZlTmFtZXNwYWNlKCIgKyBwcmVmaXggKyAiKSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gd3NkbERlZmluaXRpb24ucmVtb3ZlTmFtZXNwYWNlKHByZWZpeCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZShTdHJpbmcgcHJlZml4KSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmdldE5hbWVzcGFjZSgiICsgcHJlZml4ICsgIikiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuIHdzZGxEZWZpbml0aW9uLmdldE5hbWVzcGFjZShwcmVmaXgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRQcmVmaXgoU3RyaW5nIG5hbWVzcGFjZVVSSSkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5nZXRQcmVmaXgoIiArIG5hbWVzcGFjZVVSSSArICIpIik7DQotICAgICAgICB9DQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiB3c2RsRGVmaW5pdGlvbi5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBNYXAgZ2V0TmFtZXNwYWNlcygpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuZ2V0TmFtZXNwYWNlcygpIik7DQotICAgICAgICB9DQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiB3c2RsRGVmaW5pdGlvbi5nZXROYW1lc3BhY2VzKCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTGlzdCBnZXROYXRpdmVBdHRyaWJ1dGVOYW1lcygpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuZ2V0TmF0aXZlQXR0cmlidXRlTmFtZXMoKSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gd3NkbERlZmluaXRpb24uZ2V0TmF0aXZlQXR0cmlidXRlTmFtZXMoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFR5cGVzKFR5cGVzIHR5cGVzKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLnNldFR5cGVzKCkiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgd3NkbERlZmluaXRpb24uc2V0VHlwZXModHlwZXMpOw0KLSAgICAgICAgfSANCi0gICAgfQ0KLQ0KLQ0KLSAgICBwdWJsaWMgVHlwZXMgZ2V0VHlwZXMoKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmdldFR5cGVzKCkiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuIHdzZGxEZWZpbml0aW9uLmdldFR5cGVzKCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZGRJbXBvcnQoSW1wb3J0IGltcG9ydERlZikgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5hZGRJbXBvcnQoIiArIGltcG9ydERlZiArICIpIik7DQotICAgICAgICB9DQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHdzZGxEZWZpbml0aW9uLmFkZEltcG9ydChpbXBvcnREZWYpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBJbXBvcnQgcmVtb3ZlSW1wb3J0KEltcG9ydCBpbXBvcnREZWYpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIucmVtb3ZlSW1wb3J0KCIgKyBpbXBvcnREZWYgKyAiKSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gd3NkbERlZmluaXRpb24ucmVtb3ZlSW1wb3J0KGltcG9ydERlZik7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTGlzdCBnZXRJbXBvcnRzKFN0cmluZyBuYW1lc3BhY2VVUkkpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuZ2V0SW1wb3J0cygiICsgbmFtZXNwYWNlVVJJICsgIikiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuIHdzZGxEZWZpbml0aW9uLmdldEltcG9ydHMobmFtZXNwYWNlVVJJKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBNYXAgZ2V0SW1wb3J0cygpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuZ2V0SW1wb3J0cygpIik7DQotICAgICAgICB9DQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiB3c2RsRGVmaW5pdGlvbi5nZXRJbXBvcnRzKCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZGRNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5hZGRNZXNzYWdlKCIgKyBtZXNzYWdlICsgIikiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgd3NkbERlZmluaXRpb24uYWRkTWVzc2FnZShtZXNzYWdlKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTWVzc2FnZSBnZXRNZXNzYWdlKFFOYW1lIG5hbWUpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuZ2V0TWVzc2FnZSgiICsgbmFtZSArICIpIik7DQotICAgICAgICB9DQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiB3c2RsRGVmaW5pdGlvbi5nZXRNZXNzYWdlKG5hbWUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE1lc3NhZ2UgcmVtb3ZlTWVzc2FnZShRTmFtZSBuYW1lKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLnJlbW92ZU1lc3NhZ2UoIiArIG5hbWUgKyAiKSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gd3NkbERlZmluaXRpb24ucmVtb3ZlTWVzc2FnZShuYW1lKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBNYXAgZ2V0TWVzc2FnZXMoKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmdldE1lc3NhZ2VzKCkiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuIHdzZGxEZWZpbml0aW9uLmdldE1lc3NhZ2VzKCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZGRCaW5kaW5nKEJpbmRpbmcgYmluZGluZykgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5hZGRCaW5kaW5nKCIgKyBiaW5kaW5nICsgIikiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgd3NkbERlZmluaXRpb24uYWRkQmluZGluZyhiaW5kaW5nKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQmluZGluZyBnZXRCaW5kaW5nKFFOYW1lIG5hbWUpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuZ2V0QmluZGluZygiICsgbmFtZSArICIpIik7DQotICAgICAgICB9DQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiB3c2RsRGVmaW5pdGlvbi5nZXRCaW5kaW5nKG5hbWUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEJpbmRpbmcgcmVtb3ZlQmluZGluZyhRTmFtZSBuYW1lKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLnJlbW92ZUJpbmRpbmcoIiArIG5hbWUgKyAiKSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gd3NkbERlZmluaXRpb24ucmVtb3ZlQmluZGluZyhuYW1lKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBNYXAgZ2V0QmluZGluZ3MoKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmdldEJpbmRpbmdzKCkiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuIHdzZGxEZWZpbml0aW9uLmdldEJpbmRpbmdzKCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTWFwIGdldEFsbEJpbmRpbmdzKCkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5nZXRBbGxCaW5kaW5ncygpIik7DQotICAgICAgICB9DQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiB3c2RsRGVmaW5pdGlvbi5nZXRBbGxCaW5kaW5ncygpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgYWRkUG9ydFR5cGUoUG9ydFR5cGUgcG9ydFR5cGUpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuYWRkUG9ydFR5cGUoIiArIHBvcnRUeXBlICsgIikiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgd3NkbERlZmluaXRpb24uYWRkUG9ydFR5cGUocG9ydFR5cGUpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBQb3J0VHlwZSBnZXRQb3J0VHlwZShRTmFtZSBuYW1lKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmdldFBvcnRUeXBlKCIgKyBuYW1lICsgIikiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuIHdzZGxEZWZpbml0aW9uLmdldFBvcnRUeXBlKG5hbWUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFBvcnRUeXBlIHJlbW92ZVBvcnRUeXBlKFFOYW1lIG5hbWUpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIucmVtb3ZlUG9ydFR5cGUoIiArIG5hbWUgKyAiKSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gd3NkbERlZmluaXRpb24ucmVtb3ZlUG9ydFR5cGUobmFtZSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTWFwIGdldFBvcnRUeXBlcygpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuZ2V0UG9ydFR5cGVzKCkiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuIHdzZGxEZWZpbml0aW9uLmdldFBvcnRUeXBlcygpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE1hcCBnZXRBbGxQb3J0VHlwZXMoKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmdldEFsbFBvcnRUeXBlcygpIik7DQotICAgICAgICB9DQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiB3c2RsRGVmaW5pdGlvbi5nZXRBbGxQb3J0VHlwZXMoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGFkZFNlcnZpY2UoU2VydmljZSBzZXJ2aWNlKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmFkZFNlcnZpY2UoIiArIHNlcnZpY2UgKyAiKSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICB3c2RsRGVmaW5pdGlvbi5hZGRTZXJ2aWNlKHNlcnZpY2UpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTZXJ2aWNlIGdldFNlcnZpY2UoUU5hbWUgbmFtZSkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5nZXRTZXJ2aWNlKCIgKyBuYW1lICsgIikiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuIHdzZGxEZWZpbml0aW9uLmdldFNlcnZpY2UobmFtZSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU2VydmljZSByZW1vdmVTZXJ2aWNlKFFOYW1lIG5hbWUpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIucmVtb3ZlU2VydmljZSgiICsgbmFtZSArICIpIik7DQotICAgICAgICB9DQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiB3c2RsRGVmaW5pdGlvbi5yZW1vdmVTZXJ2aWNlKG5hbWUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE1hcCBnZXRTZXJ2aWNlcygpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuZ2V0U2VydmljZXMoKSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gd3NkbERlZmluaXRpb24uZ2V0U2VydmljZXMoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBNYXAgZ2V0QWxsU2VydmljZXMoKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmdldEFsbFNlcnZpY2VzKCkiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuIHdzZGxEZWZpbml0aW9uLmdldEFsbFNlcnZpY2VzKCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXREb2N1bWVudGF0aW9uRWxlbWVudChvcmcudzNjLmRvbS5FbGVtZW50IGRvY0VsKSB7DQotDQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLnNldERvY3VtZW50YXRpb25FbGVtZW50KCkiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgd3NkbERlZmluaXRpb24uc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoZG9jRWwpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBvcmcudzNjLmRvbS5FbGVtZW50IGdldERvY3VtZW50YXRpb25FbGVtZW50KCkgew0KLQ0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpIik7DQotICAgICAgICB9DQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiAgd3NkbERlZmluaXRpb24uZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGFkZEV4dGVuc2liaWxpdHlFbGVtZW50KEV4dGVuc2liaWxpdHlFbGVtZW50IGV4dEVsZW1lbnQpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuYWRkRXh0ZW5zaWJpbGl0eUVsZW1lbnQoIiArIGV4dEVsZW1lbnQgKyAiKSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICB3c2RsRGVmaW5pdGlvbi5hZGRFeHRlbnNpYmlsaXR5RWxlbWVudChleHRFbGVtZW50KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTGlzdCBnZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpIik7DQotICAgICAgICB9DQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiB3c2RsRGVmaW5pdGlvbi5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBCaW5kaW5nIGNyZWF0ZUJpbmRpbmcoKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmNyZWF0ZUJpbmRpbmcoKSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gd3NkbERlZmluaXRpb24uY3JlYXRlQmluZGluZygpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEJpbmRpbmdGYXVsdCBjcmVhdGVCaW5kaW5nRmF1bHQoKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmNyZWF0ZUJpbmRpbmdGYXVsdCgpIik7DQotICAgICAgICB9DQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiB3c2RsRGVmaW5pdGlvbi5jcmVhdGVCaW5kaW5nRmF1bHQoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBCaW5kaW5nSW5wdXQgY3JlYXRlQmluZGluZ0lucHV0KCkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5jcmVhdGVCaW5kaW5nSW5wdXQoKSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gd3NkbERlZmluaXRpb24uY3JlYXRlQmluZGluZ0lucHV0KCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQmluZGluZ09wZXJhdGlvbiBjcmVhdGVCaW5kaW5nT3BlcmF0aW9uKCkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5jcmVhdGVCaW5kaW5nT3BlcmF0aW9uKCkiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuIHdzZGxEZWZpbml0aW9uLmNyZWF0ZUJpbmRpbmdPcGVyYXRpb24oKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBCaW5kaW5nT3V0cHV0IGNyZWF0ZUJpbmRpbmdPdXRwdXQoKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmNyZWF0ZUJpbmRpbmdPdXRwdXQoKSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gd3NkbERlZmluaXRpb24uY3JlYXRlQmluZGluZ091dHB1dCgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEZhdWx0IGNyZWF0ZUZhdWx0KCkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5jcmVhdGVGYXVsdCgpIik7DQotICAgICAgICB9DQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiB3c2RsRGVmaW5pdGlvbi5jcmVhdGVGYXVsdCgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEltcG9ydCBjcmVhdGVJbXBvcnQoKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmNyZWF0ZUltcG9ydCgpIik7DQotICAgICAgICB9DQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiB3c2RsRGVmaW5pdGlvbi5jcmVhdGVJbXBvcnQoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBJbnB1dCBjcmVhdGVJbnB1dCgpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuY3JlYXRlSW5wdXQoKSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gd3NkbERlZmluaXRpb24uY3JlYXRlSW5wdXQoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBNZXNzYWdlIGNyZWF0ZU1lc3NhZ2UoKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmNyZWF0ZU1lc3NhZ2UoKSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gd3NkbERlZmluaXRpb24uY3JlYXRlTWVzc2FnZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE9wZXJhdGlvbiBjcmVhdGVPcGVyYXRpb24oKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmNyZWF0ZU9wZXJhdGlvbigpIik7DQotICAgICAgICB9DQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiB3c2RsRGVmaW5pdGlvbi5jcmVhdGVPcGVyYXRpb24oKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBPdXRwdXQgY3JlYXRlT3V0cHV0KCkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5jcmVhdGVPdXRwdXQoKSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gd3NkbERlZmluaXRpb24uY3JlYXRlT3V0cHV0KCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUGFydCBjcmVhdGVQYXJ0KCkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5jcmVhdGVQYXJ0KCkiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuIHdzZGxEZWZpbml0aW9uLmNyZWF0ZVBhcnQoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBQb3J0IGNyZWF0ZVBvcnQoKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmNyZWF0ZVBvcnQoKSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gd3NkbERlZmluaXRpb24uY3JlYXRlUG9ydCgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFBvcnRUeXBlIGNyZWF0ZVBvcnRUeXBlKCkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5jcmVhdGVQb3J0VHlwZSgpIik7DQotICAgICAgICB9DQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiB3c2RsRGVmaW5pdGlvbi5jcmVhdGVQb3J0VHlwZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFNlcnZpY2UgY3JlYXRlU2VydmljZSgpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuY3JlYXRlU2VydmljZSgpIik7DQotICAgICAgICB9DQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiB3c2RsRGVmaW5pdGlvbi5jcmVhdGVTZXJ2aWNlKCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgVHlwZXMgY3JlYXRlVHlwZXMoKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmNyZWF0ZVR5cGVzKCkiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuIHdzZGxEZWZpbml0aW9uLmNyZWF0ZVR5cGVzKCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRFeHRlbnNpb25SZWdpc3RyeShFeHRlbnNpb25SZWdpc3RyeSBleHRSZWcpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuc2V0RXh0ZW5zaW9uUmVnaXN0cnkoIiArIGV4dFJlZyArICIpIik7DQotICAgICAgICB9DQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHdzZGxEZWZpbml0aW9uLnNldEV4dGVuc2lvblJlZ2lzdHJ5KGV4dFJlZyk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIEV4dGVuc2lvblJlZ2lzdHJ5IGdldEV4dGVuc2lvblJlZ2lzdHJ5KCkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5nZXRFeHRlbnNpb25SZWdpc3RyeSgpIik7DQotICAgICAgICB9DQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiB3c2RsRGVmaW5pdGlvbi5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuIHdzZGxEZWZpbml0aW9uLnRvU3RyaW5nKCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gIiI7DQotICAgIH0NCi0NCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotICAgIC8vIG90aGVyIEFic3RyYWN0V1NETEVsZW1lbnQgbWV0aG9kcw0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0NCi0gICAgcHVibGljIEV4dGVuc2liaWxpdHlFbGVtZW50IHJlbW92ZUV4dGVuc2liaWxpdHlFbGVtZW50KEV4dGVuc2liaWxpdHlFbGVtZW50IGV4dEVsZW1lbnQpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIucmVtb3ZlRXh0ZW5zaWJpbGl0eUVsZW1lbnQoIiArIGV4dEVsZW1lbnQgKyAiKSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gd3NkbERlZmluaXRpb24ucmVtb3ZlRXh0ZW5zaWJpbGl0eUVsZW1lbnQoZXh0RWxlbWVudCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgamF2YS5sYW5nLk9iamVjdCBnZXRFeHRlbnNpb25BdHRyaWJ1dGUoUU5hbWUgbmFtZSkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5nZXRFeHRlbnNpb25BdHRyaWJ1dGUoIiArIG5hbWUgKyAiKSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gd3NkbERlZmluaXRpb24uZ2V0RXh0ZW5zaW9uQXR0cmlidXRlKG5hbWUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE1hcCBnZXRFeHRlbnNpb25BdHRyaWJ1dGVzKCkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5nZXRFeHRlbnNpb25BdHRyaWJ1dGVzKCkiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuIHdzZGxEZWZpbml0aW9uLmdldEV4dGVuc2lvbkF0dHJpYnV0ZXMoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldEV4dGVuc2lvbkF0dHJpYnV0ZShRTmFtZSBuYW1lLCBqYXZhLmxhbmcuT2JqZWN0IHZhbHVlKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLnNldEV4dGVuc2lvbkF0dHJpYnV0ZSgiICsgbmFtZSArICIsICAiICsgdmFsdWUgKyAiKSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICB3c2RsRGVmaW5pdGlvbi5zZXRFeHRlbnNpb25BdHRyaWJ1dGUobmFtZSwgdmFsdWUpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotDQotDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL3V0aWwvV1NETFdyYXBwZXJJbXBsLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC91dGlsL1dTRExXcmFwcGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGZiMjJjLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL3V0aWwvV1NETFdyYXBwZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLndzZGwudXRpbDsNCi0NCi0NCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOw0KLQ0KLQ0KLS8qKg0KLSAqIFRoaXMgaW50ZXJmYWNlIHByb3ZpZGVzIHN1cHBvcnQgZm9yIHByb2Nlc3NpbmcgYSBXU0RMNEogZGVmaW5pdGlvbg0KLSAqIHdpdGggYSBsb3dlciBtZW1vcnkgZm9vdHByaW50LiAgVGhpcyBpcyB1c2VmdWwgZm9yIGNlcnRhaW4NCi0gKiBlbnZpcm9ubWVudHMuDQotICovDQotcHVibGljIGludGVyZmFjZSBXU0RMV3JhcHBlckltcGwgZXh0ZW5kcyBEZWZpbml0aW9uIHsNCi0NCi0gICAgLyoqDQotICAgICAqIFJldHVybnMgdGhlIFdTREw0SiBEZWZpbml0aW9uIG9iamVjdCB0aGF0IGlzIGJlaW5nIHdyYXBwZWQNCi0gICAgICovDQotICAgIHB1YmxpYyBEZWZpbml0aW9uIGdldFVud3JhcHBlZERlZmluaXRpb24oKTsNCi0NCi0NCi0gICAgLyoqDQotICAgICAqIFNldHMgdGhlIFdTREw0SiBEZWZpbml0aW9uIG9iamVjdCB0aGF0IGlzIGJlaW5nIHdyYXBwZWQNCi0gICAgICoNCi0gICAgICogQHBhcmFtIGQgIHRoZSBXU0RMNEogRGVmaW5pdGlvbiBvYmplY3QNCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHNldERlZmluaXRpb25Ub1dyYXAoRGVmaW5pdGlvbiBkKTsNCi0NCi0NCi0gICAgLyoqDQotICAgICAqIFNldHMgdGhlIGxvY2F0aW9uIGZvciB0aGUgV1NETDRKIERlZmluaXRpb24gb2JqZWN0IHRoYXQgaXMgYmVpbmcgd3JhcHBlZA0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgc2V0V1NETExvY2F0aW9uKFN0cmluZyB1cmlMb2NhdGlvbik7DQotDQotDQotICAgIC8qKg0KLSAgICAgKiBHZXRzIHRoZSBsb2NhdGlvbiBmb3IgdGhlIFdTREw0SiBEZWZpbml0aW9uIG9iamVjdCB0aGF0IGlzIGJlaW5nIHdyYXBwZWQNCi0gICAgICovDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0V1NETExvY2F0aW9uKCk7DQotDQotDQotICAgIC8qDQotICAgICAqIFJlbGVhc2UgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgV1NETDRKIERlZmluaXRpb24gb2JqZWN0IHRoYXQgaXMNCi0gICAgICogYmVpbmcgd3JhcHBlZC4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHJlbGVhc2VSZXNvdXJjZXMoKTsNCi0NCi0NCi0gICAgLyoqDQotICAgICAqIENsb3NlcyB0aGUgdXNlIG9mIHRoZSB3cmFwcGVyIGltcGxlbWVudGF0aW9uIGFuZCBhbGxvd3MgDQotICAgICAqIGludGVybmFsIHJlc291cmNlcyB0byBiZSByZWxlYXNlZC4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIGNsb3NlKCk7DQotDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL3V0aWwvV1NETFdyYXBwZXJSZWxvYWRJbXBsLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC91dGlsL1dTRExXcmFwcGVyUmVsb2FkSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWRhMzc5Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL3V0aWwvV1NETFdyYXBwZXJSZWxvYWRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIud3NkbC51dGlsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLkphdmFVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50Ow0KLQ0KLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmc7DQotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ0ZhdWx0Ow0KLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdJbnB1dDsNCi1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nT3BlcmF0aW9uOw0KLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdPdXRwdXQ7DQotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsNCi1pbXBvcnQgamF2YXgud3NkbC5GYXVsdDsNCi1pbXBvcnQgamF2YXgud3NkbC5JbXBvcnQ7DQotaW1wb3J0IGphdmF4LndzZGwuSW5wdXQ7DQotaW1wb3J0IGphdmF4LndzZGwuTWVzc2FnZTsNCi1pbXBvcnQgamF2YXgud3NkbC5PcGVyYXRpb247DQotaW1wb3J0IGphdmF4LndzZGwuT3V0cHV0Ow0KLWltcG9ydCBqYXZheC53c2RsLlBhcnQ7DQotaW1wb3J0IGphdmF4LndzZGwuUG9ydDsNCi1pbXBvcnQgamF2YXgud3NkbC5Qb3J0VHlwZTsNCi1pbXBvcnQgamF2YXgud3NkbC5TZXJ2aWNlOw0KLWltcG9ydCBqYXZheC53c2RsLlR5cGVzOw0KLWltcG9ydCBqYXZheC53c2RsLldTRExFeGNlcHRpb247DQotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpYmlsaXR5RWxlbWVudDsNCi1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2lvblJlZ2lzdHJ5Ow0KLWltcG9ydCBqYXZheC53c2RsLmZhY3RvcnkuV1NETEZhY3Rvcnk7DQotaW1wb3J0IGphdmF4LndzZGwueG1sLldTRExSZWFkZXI7DQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotaW1wb3J0IGphdmEuaW8uRmlsZTsNCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZi5Tb2Z0UmVmZXJlbmNlOw0KLWltcG9ydCBqYXZhLm5ldC5VUkk7DQotaW1wb3J0IGphdmEubmV0LlVSTDsNCi1pbXBvcnQgamF2YS5uZXQuVVJMQ2xhc3NMb2FkZXI7DQotaW1wb3J0IGphdmEubmV0LlVSTENvbm5lY3Rpb247DQotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbjsNCi1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb247DQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5qYXIuSmFyRW50cnk7DQotaW1wb3J0IGphdmEudXRpbC5qYXIuSmFyRmlsZTsNCi0NCi0NCi0vKioNCi0gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIHN1cHBvcnQgZm9yIHByb2Nlc3NpbmcgYSBXU0RMNEogZGVmaW5pdGlvbg0KLSAqIHdpdGggYSBsb3dlciBtZW1vcnkgZm9vdHByaW50LiAgVGhpcyBpcyB1c2VmdWwgZm9yIGNlcnRhaW4NCi0gKiBlbnZpcm9ubWVudHMuDQotICogDQotICogVGhlIFR5cGUgYW5kIERvY3VtZW50YXRpb24gb2JqZWN0cyBjb25zdW1lIHRoZSBtb3N0IHNwYWNlDQotICogaW4gbWFueSBzY2VuYXJpb3MuICBUaGlzIGltcGxlbWVudGF0aW9uIHJlbG9hZHMgdGhlc2Ugb2JqZWN0cw0KLSAqIHdoZW4gdGhlbiB0aGV5IGFyZSByZXF1ZXN0ZWQuDQotICovDQotcHVibGljIGNsYXNzIFdTRExXcmFwcGVyUmVsb2FkSW1wbCBpbXBsZW1lbnRzIFdTRExXcmFwcGVySW1wbCB7DQotDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhXU0RMV3JhcHBlclJlbG9hZEltcGwuY2xhc3MpOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzRGVidWdFbmFibGVkID0gbG9nLmlzRGVidWdFbmFibGVkKCk7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBteUNsYXNzTmFtZSA9ICJXU0RMV3JhcHBlclJlbG9hZEltcGwiOw0KLQ0KLSAgICAvLyBqYXZheC53c2RsLkRlZmluaXRpb24gaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZQ0KLSAgICBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTI3ODg4MDczNzU4MTQwOTc0MDlMOw0KLQ0KLSAgICAvLyB0aGUgd3NkbDRqIHdzZGwgZGVmaW5pdGlvbiBvYmplY3QgdGhhdCBpcyBiZWluZyB3cmFwcGVkDQotICAgIHByaXZhdGUgRGVmaW5pdGlvbiB3c2RsRGVmaW5pdGlvbiA9IG51bGw7DQotDQotICAgIC8vIHRoZSBsb2NhdGlvbiBvZiB0aGUgYmFzZSBkb2N1bWVudCB1c2VkIGluIHRoZSB3c2RsNGogZGVmaW5pdGlvbg0KLSAgICBwcml2YXRlIFVSTCB3c2RsVVJMID0gbnVsbDsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgd3NkbEV4cGxpY2l0VVJJID0gbnVsbDsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgd3NkbERvY3VtZW50QmFzZVVSSSA9IG51bGw7DQotICAgIA0KLSAgICANCi0gICAgLy8gVGhlIHdzZGxEZWZpbml0aW9uIGFsd2F5cyBoYXMgdGhlIFR5cGVzIGFuZCBEb2N1bWVudEVsZW1lbnQNCi0gICAgLy8gcHVyZ2VkIGZyb20gaXQuDQotICAgIC8vIElmIFVTRV9TT0ZUX1JFRkVSRU5DRVMgaXMgdHJ1ZSwgdGhlbiB3ZSBrZWVwIGEgU09GVCByZWZlcmVuY2UNCi0gICAgLy8gdG8gdGhlc2Ugb2JqZWN0cy4NCi0gICAgLy8gSWYgVVNFX1NPRlRfUkVGRVJFTkNFUyBpcyBmYWxzZSwgdGhlbiBhIGxvYWREZWZpbml0aW9uIGlzIGFsd2F5cw0KLSAgICAvLyBwZXJmb3JtZWQgdG8gZ2V0IHRoZSBUeXBlIG9yIERvY3VtZW50YXRpb25FbGVtZW50DQotICAgIA0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIFVTRV9TT0ZUX1JFRkVSRU5DRVMgPSB0cnVlOw0KLSAgICBwcml2YXRlIHRyYW5zaWVudCBTb2Z0UmVmZXJlbmNlIHNvZnRUeXBlcyA9IG51bGw7DQotICAgIHByaXZhdGUgdHJhbnNpZW50IFNvZnRSZWZlcmVuY2Ugc29mdERvY0VsZW1lbnQgPSBudWxsOw0KLQ0KLSAgICAvKioNCi0gICAgICogQ29uc3RydWN0b3INCi0gICAgICogVGhlIFdTREwgRGVmaW50aW9uIG9iamVjdCBpcyBvd25lZCBieSB0aGUgV1NETFdyYXBwZXJSZWxvYWRJbXBsIG9iamVjdC4NCi0gICAgICogDQotICAgICAqIEBwYXJhbSBkZWYgICAgVGhlIFdTREwgRGVmaW5pdGlvbg0KLSAgICAgKi8NCi0gICAgcHVibGljIFdTRExXcmFwcGVyUmVsb2FkSW1wbChEZWZpbml0aW9uIGRlZikgew0KLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKCJXU0RMV3JhcHBlclJlbG9hZEltcGwoRGVmaW5pdGlvbiBkZWYpIGNhbGxlZCIpOw0KLSAgICAgICAgICAgIGxvZy50cmFjZShKYXZhVXRpbHMuY2FsbFN0YWNrVG9TdHJpbmcoKSk7DQotICAgICAgICB9DQotICAgICAgICBwcmVwYXJlKGRlZiwgbnVsbCk7DQotICAgIH0NCi0NCi0NCi0gICAgLyoqDQotICAgICAqIENvbnN0cnVjdG9yDQotICAgICAqIFRoZSBXU0RMIERlZmludGlvbiBvYmplY3QgaXMgb3duZWQgYnkgdGhlIFdTRExXcmFwcGVyUmVsb2FkSW1wbCBvYmplY3QuDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gZGVmICAgIFRoZSBXU0RMIERlZmluaXRpb24NCi0gICAgICogQHBhcmFtIHdVUkwgICBUaGUgVVJMIGZvciB0aGUgd3NkbA0KLSAgICAgKi8NCi0gICAgcHVibGljIFdTRExXcmFwcGVyUmVsb2FkSW1wbChEZWZpbml0aW9uIGRlZiwgVVJMIHdVUkwpIHsNCi0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiV1NETFdyYXBwZXJSZWxvYWRJbXBsKERlZmluaXRpb24gZGVmLCBVUkwgd1VSTCkgY2FsbGVkIik7DQotICAgICAgICAgICAgbG9nLnRyYWNlKEphdmFVdGlscy5jYWxsU3RhY2tUb1N0cmluZygpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHByZXBhcmUoZGVmLCB3VVJMKTsNCi0gICAgfQ0KLQ0KLQ0KLSAgICAvKioNCi0gICAgICogSW5pdGlhbGl6ZSB0aGUgd3NkbCBkZWZpbml0aW9uIHdyYXBwZXINCi0gICAgICogDQotICAgICAqIEBwYXJhbSBkZWYgICAgVGhlIFdTREw0SiBkZWZpbml0aW9uDQotICAgICAqIEBwYXJhbSB3VVJMICAgVGhlIFVSTCB3aGVyZSB0aGUgV1NETCBpcyBvYnRhaW5lZA0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSB2b2lkIHByZXBhcmUoRGVmaW5pdGlvbiBkZWYsIFVSTCB3VVJMKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLnByZXBhcmUoKSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgd3NkbERlZmluaXRpb24gPSBkZWY7DQotICAgICAgICB3c2RsVVJMID0gd1VSTDsNCi0NCi0gICAgICAgIGlmIChkZWYgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgIHdzZGxEb2N1bWVudEJhc2VVUkkgPSBkZWYuZ2V0RG9jdW1lbnRCYXNlVVJJKCk7DQotDQotICAgICAgICAgICAgICAgIC8vIGJ1aWxkIHVwIHRoZSB3c2RsVVJMIGlmIHBvc3NpYmxlDQotICAgICAgICAgICAgICAgIGlmICgod3NkbFVSTCA9PSBudWxsKSAmJiAod3NkbERvY3VtZW50QmFzZVVSSSAhPSBudWxsKSkgew0KLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBVUkwgbG9jVVJMID0gbmV3IFVSTCh3c2RsRG9jdW1lbnRCYXNlVVJJKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB3c2RsVVJMID0gbG9jVVJMOw0KLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIHVleCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGtlZXAgZ29pbmcNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIGV4cGxpY2l0IGxvY2F0aW9uIG9mIHRoZSB3c2RsIGlmIHBvc3NpYmxlDQotICAgICAgICAgICAgICAgIGlmICh3c2RsVVJMICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgICAgIHdzZGxFeHBsaWNpdFVSSSA9IGdldEV4cGxpY2l0VVJJKHdzZGxVUkwpOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIC8vIFJlbGVhc2UgdGhlIFR5cGVzIGFuZCBEb2N1bWVudGF0aW9uRWxlbWVudCBSZXNvdXJjZXMNCi0gICAgICAgICAgICAgICAgcmVsZWFzZVJlc291cmNlcygpOw0KLQ0KLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5wcmVwYXJlKCk6ICBDYXVnaHQgZXhjZXB0aW9uIFsiDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZS5nZXRDbGFzcygpLmdldE5hbWUoKSArICJdICBlcnJvciBbIiArIGUuZ2V0TWVzc2FnZSgpICsgIl0iLCBlKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIucHJlcGFyZSgpOiAgIHdzZGxEb2N1bWVudEJhc2VVUkkgWyIgKyB3c2RsRG9jdW1lbnRCYXNlVVJJDQotICAgICAgICAgICAgICAgICAgICArICJdICAgICB3c2RsRXhwbGljaXRVUkkgWyIgKyB3c2RsRXhwbGljaXRVUkkgKyAiXSAgIHdzZGxVUkwgWyIgKyB3c2RsVVJMICsgIl0iKTsNCi0gICAgICAgIH0NCi0NCi0gICAgfQ0KLQ0KLQ0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0gICAgLy8gcHVibGljIFdTRExXcmFwcGVySW1wbCBtZXRob2RzDQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQ0KLSAgICAvKg0KLSAgICAgKiBSZWxlYXNlcyBUeXBlIGFuZCBEb2N1bWVudEVsZW1lbnQgUmVzb3VyY2VzDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCByZWxlYXNlUmVzb3VyY2VzKCkgew0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICBUeXBlcyB0eXBlcyA9IHdzZGxEZWZpbml0aW9uLmdldFR5cGVzKCk7DQotICAgICAgICAgICAgaWYgKHR5cGVzICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgd3NkbERlZmluaXRpb24uc2V0VHlwZXMobnVsbCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHRoaXMuc2V0Q2FjaGVkVHlwZXModHlwZXMpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIEVsZW1lbnQgZWxlbWVudCA9IHdzZGxEZWZpbml0aW9uLmdldERvY3VtZW50YXRpb25FbGVtZW50KCk7DQotICAgICAgICAgICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICB3c2RsRGVmaW5pdGlvbi5zZXREb2N1bWVudGF0aW9uRWxlbWVudChudWxsKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgdGhpcy5zZXRDYWNoZWREb2NFbGVtZW50KGVsZW1lbnQpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogU3RvcmUgdGhlIGNhY2hlZCB0eXBlLiAgU2luY2UgdGhpcyBpcyBhIFNPRlQgcmVmZXJlbmNlLA0KLSAgICAgKiB0aGUgZ2MgbWF5IHJlbW92ZSBpdC4NCi0gICAgICogQHBhcmFtIHR5cGVzDQotICAgICAqLw0KLSAgICBwcml2YXRlIHZvaWQgc2V0Q2FjaGVkVHlwZXMoVHlwZXMgdHlwZXMpIHsNCi0gICAgICAgIGlmIChVU0VfU09GVF9SRUZFUkVOQ0VTKSB7DQotICAgICAgICAgICAgaWYgKHNvZnRUeXBlcyA9PSBudWxsIHx8IHNvZnRUeXBlcy5nZXQoKSA9PSBudWxsKSB7DQotICAgICAgICAgICAgICAgIGlmICh0eXBlcyAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICBzb2Z0VHlwZXMgPSBuZXcgU29mdFJlZmVyZW5jZSh0eXBlcyk7DQotICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAvLyBUaGUgd3NkbCBoYXMgbm8gdHlwZXMNCi0gICAgICAgICAgICAgICAgICAgIHNvZnRUeXBlcyA9IG5ldyBTb2Z0UmVmZXJlbmNlKEJvb2xlYW4uRkFMU0UpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogR2V0IHRoZSBjYWNoZWQgdHlwZS4gIFNpbmNlIHRoaXMgaXMgYSBTT0ZUIHJlZmVyZW5jZSwNCi0gICAgICogdGhlIGdjIG1heSByZW1vdmUgaXQuDQotICAgICAqIEByZXR1cm4gdHlwZXMNCi0gICAgICovDQotICAgIHByaXZhdGUgVHlwZXMgZ2V0Q2FjaGVkVHlwZXMoKSB7DQotICAgICAgICBpZiAoVVNFX1NPRlRfUkVGRVJFTkNFUykgew0KLSAgICAgICAgICAgIGlmIChzb2Z0VHlwZXMgPT0gbnVsbCB8fCBzb2Z0VHlwZXMuZ2V0KCkgPT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgICAgICB9IGVsc2UgaWYgKHNvZnRUeXBlcy5nZXQoKS5lcXVhbHMoQm9vbGVhbi5GQUxTRSkpIHsNCi0gICAgICAgICAgICAgICAgLy8gVGhlIHdzZGwgaGFzIG5vIHR5cGVzDQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIHJldHVybiAoVHlwZXMpIHNvZnRUeXBlcy5nZXQoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICBwcml2YXRlIGJvb2xlYW4gaGFzQ2FjaGVkVHlwZXMoKSB7DQotICAgICAgICBpZiAoVVNFX1NPRlRfUkVGRVJFTkNFUykgew0KLSAgICAgICAgICAgIHJldHVybiAoc29mdFR5cGVzICE9IG51bGwgJiYgc29mdFR5cGVzLmdldCgpICE9IG51bGwpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBTdG9yZSB0aGUgY2FjaGVkIGRvY3VtZW50IGVsZW1lbnQuICBTaW5jZSB0aGlzIGlzIGEgU09GVCByZWZlcmVuY2UsDQotICAgICAqIHRoZSBnYyBtYXkgcmVtb3ZlIGl0Lg0KLSAgICAgKiBAcGFyYW0gZSBFbGVtZW50DQotICAgICAqLw0KLSAgICBwcml2YXRlIHZvaWQgc2V0Q2FjaGVkRG9jRWxlbWVudChFbGVtZW50IGUpIHsNCi0gICAgICAgIGlmIChVU0VfU09GVF9SRUZFUkVOQ0VTKSB7DQotICAgICAgICAgICAgaWYgKHNvZnREb2NFbGVtZW50ID09IG51bGwgfHwgc29mdERvY0VsZW1lbnQuZ2V0KCkgPT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICBpZiAoZSAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICBzb2Z0RG9jRWxlbWVudCA9IG5ldyBTb2Z0UmVmZXJlbmNlKGUpOw0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHdzZGwgaGFzIG5vIGRvY3VtZW50IGVsZW1lbnQNCi0gICAgICAgICAgICAgICAgICAgIHNvZnREb2NFbGVtZW50ID0gbmV3IFNvZnRSZWZlcmVuY2UoQm9vbGVhbi5GQUxTRSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBHZXQgdGhlIGNhY2hlZCB0eXBlLiAgU2luY2UgdGhpcyBpcyBhIFNPRlQgcmVmZXJlbmNlLA0KLSAgICAgKiB0aGUgZ2MgbWF5IHJlbW92ZSBpdC4NCi0gICAgICogQHJldHVybiB0eXBlcw0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBFbGVtZW50IGdldENhY2hlZERvY0VsZW1lbnQoKSB7DQotICAgICAgICBpZiAoVVNFX1NPRlRfUkVGRVJFTkNFUykgew0KLSAgICAgICAgICAgIGlmIChzb2Z0RG9jRWxlbWVudCA9PSBudWxsIHx8IHNvZnREb2NFbGVtZW50LmdldCgpID09IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICAgICAgfSBlbHNlIGlmIChzb2Z0RG9jRWxlbWVudC5nZXQoKS5lcXVhbHMoQm9vbGVhbi5GQUxTRSkpIHsNCi0gICAgICAgICAgICAgICAgLy8gVGhlIHdzZGwgaGFzIG5vIGRvY3VtZW50IGVsZW1lbnQNCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIChFbGVtZW50KSBzb2Z0RG9jRWxlbWVudC5nZXQoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICBwcml2YXRlIGJvb2xlYW4gaGFzQ2FjaGVkRG9jRWxlbWVudCgpIHsNCi0gICAgICAgIGlmIChVU0VfU09GVF9SRUZFUkVOQ0VTKSB7DQotICAgICAgICAgICAgcmV0dXJuIChzb2Z0RG9jRWxlbWVudCAhPSBudWxsICYmIHNvZnREb2NFbGVtZW50LmdldCgpICE9IG51bGwpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0NCi0gICAgLyoNCi0gICAgICogUmV0dXJucyBhIGZ1bGwsIHJlbG9hZGVkLFdTREw0SiBEZWZpbml0aW9uIG9iamVjdC4NCi0gICAgICogVGhpcyBhdm9pZHMgdGhlIG1lbW9yeSBzYXZpbmcgY2FwYWJpbGl0aWVzIG9mIHRoaXMgd3JhcHBlci4NCi0gICAgICogVGhlIGNhbGxlciBtdXN0IG5vdCBzYXZlIHRoZSByZXR1cm5lZCBkZWZpbnRpb24uDQotICAgICAqIEByZXR1cm4gRGVmaW50aW9uDQotICAgICAqLw0KLSAgICBwdWJsaWMgRGVmaW5pdGlvbiBnZXRVbndyYXBwZWREZWZpbml0aW9uKCkgew0KLSAgICAgICAgRGVmaW5pdGlvbiBkZWY7DQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gPT0gbnVsbCkgew0KLSAgICAgICAgICAgIC8vIElmIG5vIGRlZmluaW90biwgbG9hZCBvbmUNCi0gICAgICAgICAgICB0cnkgew0KLSAgICAgICAgICAgICAgICBkZWYgPSBsb2FkRGVmaW5pdGlvbigpOw0KLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgICAgIC8vIHVuYWJsZSB0byBsb2FkIHRoZSBkZWZpbml0aW9uDQotICAgICAgICAgICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIi5nZXRVbndyYXBwZWREZWZpbml0aW9uKCk6IGVycm9yIHRyeWluZyB0byBsb2FkIERlZmluaXRpb24gICAgWyINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIl0gIGVycm9yIFsiICsgZS5nZXRNZXNzYWdlKCkgKyAiXSAiLCBlKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBkZWYgPSBudWxsOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0gZWxzZSBpZiAod3NkbERlZmluaXRpb24gaW5zdGFuY2VvZiBXU0RMV3JhcHBlckJhc2ljSW1wbCkgew0KLSAgICAgICAgICAgIC8vIElmIHdyYXBwaW5nIGFub3RoZXIgd3JhcHBlciwgdGhlbiBkZWxlZ2F0ZQ0KLSAgICAgICAgICAgIGRlZiA9ICgoV1NETFdyYXBwZXJCYXNpY0ltcGwpIHdzZGxEZWZpbml0aW9uKS5nZXRVbndyYXBwZWREZWZpbml0aW9uKCk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIC8vIFRoZSBxdWVzdGlvbiBpcyB3aGV0aGVyIGEgbmV3IFdTRExEZWZpbml0aW9uIHNob3VsZCBiZSBsb2FkZWQgYW5kIA0KLSAgICAgICAgICAgIC8vIHJldHVybmVkIG9yIHdoZXRoZXIgdGhlIGV4aXN0aW5nIGRlZmluaXRpb24gKHcvbyB0aGUgVHlwZSANCi0gICAgICAgICAgICAvLyBhbmQgRG9jdW1lbnRFbGVtZW50KSBzaG91bGQgYmUgcmV0dXJuZWQuDQotICAgICAgICAgICAgLy8gDQotICAgICAgICAgICAgLy8gVGhlIGFuc3dlciBpcyB0byByZWxvYWQgdGhlIFdTRExEZWZpbml0aW9uIGFuZCBwcm92aWRlIHRoZSBuZXcNCi0gICAgICAgICAgICAvLyBvbmUgd2l0aG91dCBhZmZlY3RpbmcgdGhlIGV4aXN0aW5nIFdTRExEZWZpbnRpb24gdGhhdCBpcyBzdG9yZWQuDQotICAgICAgICAgICAgLy8gVGhlIG9udXMgaXMgb24gdGhlIGNhbGxlciB0byBmcmVlIHRoaXMgbmV3IFdTRExEZWZpbml0aW9uIGFuZCANCi0gICAgICAgICAgICAvLyBub3QgaG9sZCBvbnRvIGl0LiAgSWYgdGhlIGNhbGxsZXIgd2FudHMgbWVtb3J5IHNhdmluZyANCi0gICAgICAgICAgICAvLyBjYXBhYmlsaXRpZXMsIHRoZW4gdGhlIGNhbGxlciBzaG91bGQgYmUgdXNpbmcgdGhpcyB3cmFwcGVyIGRpcmVjdGx5Lg0KLSAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgIGRlZiA9IGxvYWREZWZpbml0aW9uKCk7DQotICAgICAgICAgICAgICAgIGlmKGRlZiA9PSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICBkZWYgPSB3c2RsRGVmaW5pdGlvbjsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICAgICAgLy8gdW5hYmxlIHRvIGxvYWQgdGhlIGRlZmluaXRpb24NCi0gICAgICAgICAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIuZ2V0VW53cmFwcGVkRGVmaW5pdGlvbigpOiBlcnJvciB0cnlpbmcgdG8gbG9hZCBEZWZpbml0aW9uICAgIFsiDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIl0gIGVycm9yIFsiICsgZS5nZXRNZXNzYWdlKCkgKyAiXSAiLCBlKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBkZWYgPSB3c2RsRGVmaW5pdGlvbjsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gZGVmOw0KLSAgICB9DQotDQotDQotDQotICAgIC8qKg0KLSAgICAgKiBTZXRzIHRoZSBXU0RMNEogRGVmaW5pdGlvbiBvYmplY3QgdGhhdCBpcyBiZWluZyB3cmFwcGVkDQotICAgICAqDQotICAgICAqIEBwYXJhbSBkICB0aGUgV1NETDRKIERlZmluaXRpb24gb2JqZWN0DQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBzZXREZWZpbml0aW9uVG9XcmFwKERlZmluaXRpb24gZCkgew0KLSAgICAgICAgd3NkbERlZmluaXRpb24gPSBkOw0KLSAgICB9DQotDQotDQotICAgIC8qKg0KLSAgICAgKiBTZXRzIHRoZSBsb2NhdGlvbiBmb3IgdGhlIFdTREw0SiBEZWZpbml0aW9uIG9iamVjdCB0aGF0IGlzIGJlaW5nIHdyYXBwZWQNCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHNldFdTRExMb2NhdGlvbihTdHJpbmcgdXJpTG9jYXRpb24pIHsNCi0gICAgICAgIGlmICh1cmlMb2NhdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICAgICAgd3NkbFVSTCA9IG5ldyBVUkwodXJpTG9jYXRpb24pOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICAgICAgLy8gdG9kbw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLQ0KLSAgICAvKioNCi0gICAgICogR2V0cyB0aGUgbG9jYXRpb24gZm9yIHRoZSBXU0RMNEogRGVmaW5pdGlvbiBvYmplY3QgdGhhdCBpcyBiZWluZyB3cmFwcGVkDQotICAgICAqLw0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFdTRExMb2NhdGlvbigpIHsNCi0gICAgICAgIGlmICh3c2RsVVJMICE9IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gd3NkbFVSTC50b1N0cmluZygpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0NCi0gICAgLyoqDQotICAgICAqIENsb3NlcyB0aGUgdXNlIG9mIHRoZSB3cmFwcGVyIGltcGxlbWVudGF0aW9uIGFuZCBhbGxvd3MgDQotICAgICAqIGludGVybmFsIHJlc291cmNlcyB0byBiZSByZWxlYXNlZC4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgew0KLSAgICAgICAgLy8gbm90aGluZyB0byBkbyBmb3IgdGhpcyBpbXBsZW1lbnRhdGlvbg0KLSAgICB9DQotDQotDQotDQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSAgICAvLyBqYXZheC53c2RsLkRlZmludGlvbiBpbnRlcmZhY2UgbWV0aG9kcw0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RG9jdW1lbnRCYXNlVVJJKFN0cmluZyBkKSB7DQotDQotICAgICAgICAvLyBTZXQgdGhlIFVSSSBvZiB0aGUgYmFzZSBkb2N1bWVudCBmb3IgdGhlIERlZmluaXRpb24uDQotICAgICAgICAvLyBUaGlzIGlkZW50aWZpZXMgdGhlIG9yaWdpbiBvZiB0aGUgRGVmaW5pdGlvbiBhbmQNCi0gICAgICAgIC8vIGFsbG93cyB0aGUgRGVmaW5pdGlvbiB0byBiZSByZWxvYWRlZC4NCi0gICAgICAgIC8vIE5vdGUgdGhhdCB0aGlzIGlzIHRoZSBVUkkgb2YgdGhlIGJhc2UgZG9jdW1lbnQsIG5vdCB0aGUgaW1wb3J0cy4NCi0NCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuc2V0RG9jdW1lbnRCYXNlVVJJKCIgKyBkICsgIikiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgd3NkbERlZmluaXRpb24uc2V0RG9jdW1lbnRCYXNlVVJJKGQpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RG9jdW1lbnRCYXNlVVJJKCkgew0KLQ0KLSAgICAgICAgLy8gR2V0IHRoZSBVUkkgb2YgdGhlIGJhc2UgZG9jdW1lbnQgZm9yIHRoZSBEZWZpbml0aW9uLg0KLSAgICAgICAgLy8gVGhpcyBpZGVudGlmaWVzIHRoZSBvcmlnaW4gb2YgdGhlIERlZmluaXRpb24gYW5kDQotICAgICAgICAvLyBhbGxvd3MgdGhlIERlZmluaXRpb24gdG8gYmUgcmVsb2FkZWQuDQotICAgICAgICAvLyBOb3RlIHRoYXQgdGhpcyBpcyB0aGUgVVJJIG9mIHRoZSBiYXNlIGRvY3VtZW50LCBub3QgdGhlIGltcG9ydHMuDQotDQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmdldERvY3VtZW50QmFzZVVSSSgpIik7DQotICAgICAgICB9DQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiB3c2RsRGVmaW5pdGlvbi5nZXREb2N1bWVudEJhc2VVUkkoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFFOYW1lKFFOYW1lIG4pIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuc2V0UU5hbWUoIiArIG4gKyAiKSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICB3c2RsRGVmaW5pdGlvbi5zZXRRTmFtZShuKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUU5hbWUgZ2V0UU5hbWUoKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmdldFFOYW1lKCkiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuIHdzZGxEZWZpbml0aW9uLmdldFFOYW1lKCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRUYXJnZXROYW1lc3BhY2UoU3RyaW5nIHQpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuc2V0VGFyZ2V0TmFtZXNwYWNlKCIgKyB0ICsgIikiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgd3NkbERlZmluaXRpb24uc2V0VGFyZ2V0TmFtZXNwYWNlKHQpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0TmFtZXNwYWNlKCkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5nZXRUYXJnZXROYW1lc3BhY2UoKSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gd3NkbERlZmluaXRpb24uZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZGROYW1lc3BhY2UoU3RyaW5nIHByZWZpeCwgU3RyaW5nIG5hbWVzcGFjZVVSSSkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5hZGROYW1lc3BhY2UoIiArIHByZWZpeCArICIsICIgKyBuYW1lc3BhY2VVUkkgKyAiKSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICB3c2RsRGVmaW5pdGlvbi5hZGROYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgcmVtb3ZlTmFtZXNwYWNlKFN0cmluZyBwcmVmaXgpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIucmVtb3ZlTmFtZXNwYWNlKCIgKyBwcmVmaXggKyAiKSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gd3NkbERlZmluaXRpb24ucmVtb3ZlTmFtZXNwYWNlKHByZWZpeCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZShTdHJpbmcgcHJlZml4KSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmdldE5hbWVzcGFjZSgiICsgcHJlZml4ICsgIikiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuIHdzZGxEZWZpbml0aW9uLmdldE5hbWVzcGFjZShwcmVmaXgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRQcmVmaXgoU3RyaW5nIG5hbWVzcGFjZVVSSSkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5nZXRQcmVmaXgoIiArIG5hbWVzcGFjZVVSSSArICIpIik7DQotICAgICAgICB9DQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiB3c2RsRGVmaW5pdGlvbi5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBNYXAgZ2V0TmFtZXNwYWNlcygpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuZ2V0TmFtZXNwYWNlcygpIik7DQotICAgICAgICB9DQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiB3c2RsRGVmaW5pdGlvbi5nZXROYW1lc3BhY2VzKCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTGlzdCBnZXROYXRpdmVBdHRyaWJ1dGVOYW1lcygpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuZ2V0TmF0aXZlQXR0cmlidXRlTmFtZXMoKSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gd3NkbERlZmluaXRpb24uZ2V0TmF0aXZlQXR0cmlidXRlTmFtZXMoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFR5cGVzKFR5cGVzIHR5cGVzKSB7DQotDQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIC8vIG5vdGU6IHRoZSB3c2RsIGRlZmluaXRpb24gaW1wbGVtZW50YXRpb24gY2FuJ3QgcmUtY3JlYXRlIHRoZSB0eXBlcyANCi0gICAgICAgICAgICAvLyAgICAgICBhZnRlciB0aGUgdHlwZXMgZ290IHNldCB0byBudWxsIHNvIHRoZSB3c2RsIGRlZmluaXRpb24gd291bGQNCi0gICAgICAgICAgICAvLyAgICAgICBuZWVkIHRvIGJlIHJlbG9hZGVkDQotICAgICAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuc2V0VHlwZXMoKSBmcm9tIHdzZGwgRGVmaW5pdGlvbiIpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICB3c2RsRGVmaW5pdGlvbi5zZXRUeXBlcyh0eXBlcyk7DQotDQotICAgICAgICAgICAgLy8gVE9ETzogc2hvdWxkIHdlIGtlZXAgdGhlIHR5cGVzIG9iamVjdCBpZiBpdCBnZXRzIHNldD8NCi0gICAgICAgICAgICB3c2RsRGVmaW5pdGlvbi5zZXRUeXBlcyhudWxsKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgLyoNCi0gICAgICAgICAgICAgLy8gcmVsb2FkIHRoZSB3c2RsIGRlZmluaXRpb24gb2JqZWN0DQotICAgICAgICAgICAgIC8vIFRPRE86IHdoYXQgYWJvdXQgYW55IG9ubGluZSBjaGFuZ2VzIHRoYXQgaGF2ZSBiZWVuIG1hZGUgdG8gdGhlIGRlZmluaXRpb24/DQotDQotICAgICAgICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lKyIuc2V0VHlwZXMoKSBmcm9tIHJlbG9hZGVkIHdzZGwgRGVmaW5pdGlvbiIpOw0KLSAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgIERlZmluaXRpb24gZGVmID0gbnVsbDsNCi0gICAgICAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICAgICAgIGRlZiA9IGxvYWREZWZpbml0aW9uKCk7DQotICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUrIi5zZXRUeXBlcygpOiBlcnJvciB0cnlpbmcgdG8gbG9hZCBEZWZpbml0aW9uICAgIFsiK2UuZ2V0Q2xhc3MoKS5nZXROYW1lKCkrIl0gIGVycm9yIFsiK2UuZ2V0TWVzc2FnZSgpKyJdICIsIGUpOw0KLSAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgIGlmIChkZWYgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICAgZGVmLnNldFR5cGVzKHR5cGVzKTsNCi0gICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICBlbHNlIHsNCi0gICAgICAgICAgICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSsiLnNldFR5cGVzKCk6IG5vdGhpbmcgdG8gc2V0Iik7DQotICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgKi8NCi0gICAgICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5zZXRUeXBlcygpOiBub3RoaW5nIHRvIHNldCIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLQ0KLSAgICBwdWJsaWMgVHlwZXMgZ2V0VHlwZXMoKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cudHJhY2UobXlDbGFzc05hbWUgKyAiLmdldFR5cGVzKCkgY2FsbCBzdGFjayA9IiArIEphdmFVdGlscy5jYWxsU3RhY2tUb1N0cmluZygpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIC8vIFNlZSBpZiB3ZSBoYXZlIGEgc29mdCByZWZlcmVuY2UgdG8gdGhlIFR5cGUNCi0gICAgICAgIA0KLSAgICAgICAgaWYgKGhhc0NhY2hlZFR5cGVzKCkpIHsNCi0gICAgICAgICAgICBUeXBlcyB0ID0gZ2V0Q2FjaGVkVHlwZXMoKTsNCi0gICAgICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5nZXRUeXBlcygpIGZyb20gc29mdCByZWZlcmVuY2UgWyIgKyB0DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIl0iKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIHQ7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIA0KLSAgICAgICAgLy8gcmVsb2FkIHRoZSB3c2RsIGRlZmluaXRpb24gb2JqZWN0DQotICAgICAgICAvLyBUT0RPOiB3aGF0IGFib3V0IGFueSBjaGFuZ2VzIHRoYXQgaGF2ZSBiZWVuIG1hZGUgdG8gdGhlIGRlZmluaXRpb24/DQotDQotICAgICAgICBEZWZpbml0aW9uIGRlZiA9IG51bGw7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIGRlZiA9IGxvYWREZWZpbml0aW9uKCk7DQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmdldFR5cGVzKCk6IGVycm9yIHRyeWluZyB0byBsb2FkIERlZmluaXRpb24gICAgWyINCi0gICAgICAgICAgICAgICAgICAgICAgICArIGUuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiXSAgZXJyb3IgWyIgKyBlLmdldE1lc3NhZ2UoKSArICJdICIsIGUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChkZWYgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIFR5cGVzIHQgPSBkZWYuZ2V0VHlwZXMoKTsNCi0gICAgICAgICAgICBzZXRDYWNoZWRUeXBlcyh0KTsNCi0gICAgICAgICAgICBzZXRDYWNoZWREb2NFbGVtZW50KGRlZi5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpKTsNCi0NCi0gICAgICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5nZXRUeXBlcygpIGZyb20gcmVsb2FkZWQgd3NkbCBEZWZpbml0aW9uIHJldHVybmluZyBbIiArIHQNCi0gICAgICAgICAgICAgICAgICAgICAgICArICJdIik7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHJldHVybiB0Ow0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5nZXRUeXBlcygpIHJldHVybmluZyBOVUxMIik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGFkZEltcG9ydChJbXBvcnQgaW1wb3J0RGVmKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmFkZEltcG9ydCgiICsgaW1wb3J0RGVmICsgIikiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgd3NkbERlZmluaXRpb24uYWRkSW1wb3J0KGltcG9ydERlZik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIEltcG9ydCByZW1vdmVJbXBvcnQoSW1wb3J0IGltcG9ydERlZikgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5yZW1vdmVJbXBvcnQoIiArIGltcG9ydERlZiArICIpIik7DQotICAgICAgICB9DQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiB3c2RsRGVmaW5pdGlvbi5yZW1vdmVJbXBvcnQoaW1wb3J0RGVmKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBMaXN0IGdldEltcG9ydHMoU3RyaW5nIG5hbWVzcGFjZVVSSSkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5nZXRJbXBvcnRzKCIgKyBuYW1lc3BhY2VVUkkgKyAiKSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gd3NkbERlZmluaXRpb24uZ2V0SW1wb3J0cyhuYW1lc3BhY2VVUkkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE1hcCBnZXRJbXBvcnRzKCkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5nZXRJbXBvcnRzKCkiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuIHdzZGxEZWZpbml0aW9uLmdldEltcG9ydHMoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGFkZE1lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmFkZE1lc3NhZ2UoIiArIG1lc3NhZ2UgKyAiKSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICB3c2RsRGVmaW5pdGlvbi5hZGRNZXNzYWdlKG1lc3NhZ2UpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBNZXNzYWdlIGdldE1lc3NhZ2UoUU5hbWUgbmFtZSkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5nZXRNZXNzYWdlKCIgKyBuYW1lICsgIikiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuIHdzZGxEZWZpbml0aW9uLmdldE1lc3NhZ2UobmFtZSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTWVzc2FnZSByZW1vdmVNZXNzYWdlKFFOYW1lIG5hbWUpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIucmVtb3ZlTWVzc2FnZSgiICsgbmFtZSArICIpIik7DQotICAgICAgICB9DQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiB3c2RsRGVmaW5pdGlvbi5yZW1vdmVNZXNzYWdlKG5hbWUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE1hcCBnZXRNZXNzYWdlcygpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuZ2V0TWVzc2FnZXMoKSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gd3NkbERlZmluaXRpb24uZ2V0TWVzc2FnZXMoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGFkZEJpbmRpbmcoQmluZGluZyBiaW5kaW5nKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmFkZEJpbmRpbmcoIiArIGJpbmRpbmcgKyAiKSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICB3c2RsRGVmaW5pdGlvbi5hZGRCaW5kaW5nKGJpbmRpbmcpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBCaW5kaW5nIGdldEJpbmRpbmcoUU5hbWUgbmFtZSkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5nZXRCaW5kaW5nKCIgKyBuYW1lICsgIikiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuIHdzZGxEZWZpbml0aW9uLmdldEJpbmRpbmcobmFtZSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQmluZGluZyByZW1vdmVCaW5kaW5nKFFOYW1lIG5hbWUpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIucmVtb3ZlQmluZGluZygiICsgbmFtZSArICIpIik7DQotICAgICAgICB9DQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiB3c2RsRGVmaW5pdGlvbi5yZW1vdmVCaW5kaW5nKG5hbWUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE1hcCBnZXRCaW5kaW5ncygpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuZ2V0QmluZGluZ3MoKSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gd3NkbERlZmluaXRpb24uZ2V0QmluZGluZ3MoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBNYXAgZ2V0QWxsQmluZGluZ3MoKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmdldEFsbEJpbmRpbmdzKCkiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuIHdzZGxEZWZpbml0aW9uLmdldEFsbEJpbmRpbmdzKCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZGRQb3J0VHlwZShQb3J0VHlwZSBwb3J0VHlwZSkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5hZGRQb3J0VHlwZSgiICsgcG9ydFR5cGUgKyAiKSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICB3c2RsRGVmaW5pdGlvbi5hZGRQb3J0VHlwZShwb3J0VHlwZSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIFBvcnRUeXBlIGdldFBvcnRUeXBlKFFOYW1lIG5hbWUpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuZ2V0UG9ydFR5cGUoIiArIG5hbWUgKyAiKSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gd3NkbERlZmluaXRpb24uZ2V0UG9ydFR5cGUobmFtZSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUG9ydFR5cGUgcmVtb3ZlUG9ydFR5cGUoUU5hbWUgbmFtZSkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5yZW1vdmVQb3J0VHlwZSgiICsgbmFtZSArICIpIik7DQotICAgICAgICB9DQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiB3c2RsRGVmaW5pdGlvbi5yZW1vdmVQb3J0VHlwZShuYW1lKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBNYXAgZ2V0UG9ydFR5cGVzKCkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5nZXRQb3J0VHlwZXMoKSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gd3NkbERlZmluaXRpb24uZ2V0UG9ydFR5cGVzKCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTWFwIGdldEFsbFBvcnRUeXBlcygpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuZ2V0QWxsUG9ydFR5cGVzKCkiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuIHdzZGxEZWZpbml0aW9uLmdldEFsbFBvcnRUeXBlcygpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgYWRkU2VydmljZShTZXJ2aWNlIHNlcnZpY2UpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuYWRkU2VydmljZSgiICsgc2VydmljZSArICIpIik7DQotICAgICAgICB9DQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHdzZGxEZWZpbml0aW9uLmFkZFNlcnZpY2Uoc2VydmljZSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIFNlcnZpY2UgZ2V0U2VydmljZShRTmFtZSBuYW1lKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmdldFNlcnZpY2UoIiArIG5hbWUgKyAiKSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gd3NkbERlZmluaXRpb24uZ2V0U2VydmljZShuYW1lKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTZXJ2aWNlIHJlbW92ZVNlcnZpY2UoUU5hbWUgbmFtZSkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5yZW1vdmVTZXJ2aWNlKCIgKyBuYW1lICsgIikiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuIHdzZGxEZWZpbml0aW9uLnJlbW92ZVNlcnZpY2UobmFtZSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTWFwIGdldFNlcnZpY2VzKCkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5nZXRTZXJ2aWNlcygpIik7DQotICAgICAgICB9DQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiB3c2RsRGVmaW5pdGlvbi5nZXRTZXJ2aWNlcygpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE1hcCBnZXRBbGxTZXJ2aWNlcygpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuZ2V0QWxsU2VydmljZXMoKSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gd3NkbERlZmluaXRpb24uZ2V0QWxsU2VydmljZXMoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldERvY3VtZW50YXRpb25FbGVtZW50KG9yZy53M2MuZG9tLkVsZW1lbnQgZG9jRWwpIHsNCi0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoZG9jRWwpIGZyb20gd3NkbCBEZWZpbml0aW9uIik7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIC8vIHNldCB0aGUgZWxlbWVudCBpbiB0aGUgZGVmaW5pdGlvbg0KLSAgICAgICAgICAgIC8vIGRvbid0IG1ha2UgYXNzdW1wdGlvbnMgYWJvdXQgd2hhdCB0aGUgaW1wbGVtZW50YXRpb24gZG9lcw0KLSAgICAgICAgICAgIHdzZGxEZWZpbml0aW9uLnNldERvY3VtZW50YXRpb25FbGVtZW50KGRvY0VsKTsNCi0gICAgICAgICAgICAvLyByZXNldCB0aGUgZWxlbWVudA0KLSAgICAgICAgICAgIHdzZGxEZWZpbml0aW9uLnNldERvY3VtZW50YXRpb25FbGVtZW50KG51bGwpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAvKg0KLSAgICAgICAgICAgICAvLyByZWxvYWQgdGhlIHdzZGwgZGVmaW5pdGlvbiBvYmplY3QNCi0gICAgICAgICAgICAgLy8gVE9ETzogd2hhdCBhYm91dCBhbnkgb25saW5lIGNoYW5nZXMgdGhhdCBoYXZlIGJlZW4gbWFkZSB0byB0aGUgZGVmaW5pdGlvbg0KLQ0KLSAgICAgICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSsiLnNldERvY3VtZW50YXRpb25FbGVtZW50KGRvY0VsKSBmcm9tIHJlbG9hZGVkIHdzZGwgRGVmaW5pdGlvbiIpOw0KLSAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgIERlZmluaXRpb24gZGVmID0gbnVsbDsNCi0gICAgICAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICAgICAgIGRlZiA9IGxvYWREZWZpbml0aW9uKCk7DQotICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUrIi5zZXREb2N1bWVudGF0aW9uRWxlbWVudChkb2NFbCk6IGVycm9yIHRyeWluZyB0byBsb2FkIERlZmluaXRpb24gICAgWyIrZS5nZXRDbGFzcygpLmdldE5hbWUoKSsiXSAgZXJyb3IgWyIrZS5nZXRNZXNzYWdlKCkrIl0gIiwgZSk7DQotICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgaWYgKGRlZiAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgICBkZWYuc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoZG9jRWwpOw0KLSAgICAgICAgICAgICB9DQotICAgICAgICAgICAgIGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lKyIuc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoZG9jRWwpOiBub3RoaW5nIHRvIHNldCIpOw0KLSAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICovDQotICAgICAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoZG9jRWwpOiBub3RoaW5nIHRvIHNldCIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgb3JnLnczYy5kb20uRWxlbWVudCBnZXREb2N1bWVudGF0aW9uRWxlbWVudCgpIHsNCi0NCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy50cmFjZShteUNsYXNzTmFtZSArICIuZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSBjYWxsIHN0YWNrID0iICsNCi0gICAgICAgICAgICAgICAgICAgICAgSmF2YVV0aWxzLmNhbGxTdGFja1RvU3RyaW5nKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICAvLyBTZWUgaWYgd2UgaGF2ZSBhIHNvZnQgcmVmZXJlbmNlIHRvIHRoZSBEb2N1bWVudEVsZW1lbnQNCi0gICAgICAgIGlmIChoYXNDYWNoZWREb2NFbGVtZW50KCkpIHsNCi0gICAgICAgICAgICBFbGVtZW50IGUgPSBnZXRDYWNoZWREb2NFbGVtZW50KCk7DQotDQotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLmdldERvY3VtZW50YXRpb25FbGVtZW50KCkgZnJvbSBzb2Z0IHJlZmVyZW5jZSAiKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIGU7DQotICAgICAgICB9ICAgIA0KLSAgICAgICAgDQotICAgICAgICAvLyByZWxvYWQgdGhlIHdzZGwgZGVmaW5pdGlvbiBvYmplY3QNCi0gICAgICAgIC8vIFRPRE86IHdoYXQgYWJvdXQgYW55IG9ubGluZSBjaGFuZ2VzIHRoYXQgaGF2ZSBiZWVuIG1hZGUgdG8gdGhlIGRlZmluaXRpb24/DQotDQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmdldERvY3VtZW50YXRpb25FbGVtZW50KCkgZnJvbSByZWxvYWRlZCB3c2RsIERlZmluaXRpb24iKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIERlZmluaXRpb24gZGVmID0gbnVsbDsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgZGVmID0gbG9hZERlZmluaXRpb24oKTsNCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICsgIi5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpOiBlcnJvciB0cnlpbmcgdG8gbG9hZCBEZWZpbml0aW9uICAgIFsiDQotICAgICAgICAgICAgICAgICAgICAgICAgKyBlLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIl0gIGVycm9yIFsiICsgZS5nZXRNZXNzYWdlKCkgKyAiXSAiLCBlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoZGVmICE9IG51bGwpIHsNCi0gICAgICAgICAgICBvcmcudzNjLmRvbS5FbGVtZW50IGRvY0VsZW1lbnQgPSBkZWYuZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKTsNCi0gICAgICAgICAgICBzZXRDYWNoZWREb2NFbGVtZW50KGRvY0VsZW1lbnQpOw0KLSAgICAgICAgICAgIHNldENhY2hlZFR5cGVzKGRlZi5nZXRUeXBlcygpKTsNCi0NCi0gICAgICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICAgICAgaWYgKGRvY0VsZW1lbnQgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIi5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpIGZyb20gcmVsb2FkZWQgd3NkbCBEZWZpbml0aW9uIHJldHVybmluZyAgTk9OLU5VTEwgb3JnLnczYy5kb20uRWxlbWVudCIpOw0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIi5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpIGZyb20gcmVsb2FkZWQgd3NkbCBEZWZpbml0aW9uIHJldHVybmluZyAgTlVMTCBvcmcudzNjLmRvbS5FbGVtZW50Iik7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIGRvY0VsZW1lbnQ7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmdldERvY3VtZW50YXRpb25FbGVtZW50KCkgcmV0dXJuaW5nIE5VTEwiKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgYWRkRXh0ZW5zaWJpbGl0eUVsZW1lbnQoRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZXh0RWxlbWVudCkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5hZGRFeHRlbnNpYmlsaXR5RWxlbWVudCgiICsgZXh0RWxlbWVudCArICIpIik7DQotICAgICAgICB9DQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHdzZGxEZWZpbml0aW9uLmFkZEV4dGVuc2liaWxpdHlFbGVtZW50KGV4dEVsZW1lbnQpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBMaXN0IGdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuIHdzZGxEZWZpbml0aW9uLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEJpbmRpbmcgY3JlYXRlQmluZGluZygpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuY3JlYXRlQmluZGluZygpIik7DQotICAgICAgICB9DQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiB3c2RsRGVmaW5pdGlvbi5jcmVhdGVCaW5kaW5nKCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQmluZGluZ0ZhdWx0IGNyZWF0ZUJpbmRpbmdGYXVsdCgpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuY3JlYXRlQmluZGluZ0ZhdWx0KCkiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuIHdzZGxEZWZpbml0aW9uLmNyZWF0ZUJpbmRpbmdGYXVsdCgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEJpbmRpbmdJbnB1dCBjcmVhdGVCaW5kaW5nSW5wdXQoKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmNyZWF0ZUJpbmRpbmdJbnB1dCgpIik7DQotICAgICAgICB9DQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiB3c2RsRGVmaW5pdGlvbi5jcmVhdGVCaW5kaW5nSW5wdXQoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBCaW5kaW5nT3BlcmF0aW9uIGNyZWF0ZUJpbmRpbmdPcGVyYXRpb24oKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmNyZWF0ZUJpbmRpbmdPcGVyYXRpb24oKSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gd3NkbERlZmluaXRpb24uY3JlYXRlQmluZGluZ09wZXJhdGlvbigpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEJpbmRpbmdPdXRwdXQgY3JlYXRlQmluZGluZ091dHB1dCgpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuY3JlYXRlQmluZGluZ091dHB1dCgpIik7DQotICAgICAgICB9DQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiB3c2RsRGVmaW5pdGlvbi5jcmVhdGVCaW5kaW5nT3V0cHV0KCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgRmF1bHQgY3JlYXRlRmF1bHQoKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmNyZWF0ZUZhdWx0KCkiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuIHdzZGxEZWZpbml0aW9uLmNyZWF0ZUZhdWx0KCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgSW1wb3J0IGNyZWF0ZUltcG9ydCgpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuY3JlYXRlSW1wb3J0KCkiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuIHdzZGxEZWZpbml0aW9uLmNyZWF0ZUltcG9ydCgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIElucHV0IGNyZWF0ZUlucHV0KCkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5jcmVhdGVJbnB1dCgpIik7DQotICAgICAgICB9DQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiB3c2RsRGVmaW5pdGlvbi5jcmVhdGVJbnB1dCgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE1lc3NhZ2UgY3JlYXRlTWVzc2FnZSgpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuY3JlYXRlTWVzc2FnZSgpIik7DQotICAgICAgICB9DQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiB3c2RsRGVmaW5pdGlvbi5jcmVhdGVNZXNzYWdlKCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgT3BlcmF0aW9uIGNyZWF0ZU9wZXJhdGlvbigpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuY3JlYXRlT3BlcmF0aW9uKCkiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuIHdzZGxEZWZpbml0aW9uLmNyZWF0ZU9wZXJhdGlvbigpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE91dHB1dCBjcmVhdGVPdXRwdXQoKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmNyZWF0ZU91dHB1dCgpIik7DQotICAgICAgICB9DQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiB3c2RsRGVmaW5pdGlvbi5jcmVhdGVPdXRwdXQoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBQYXJ0IGNyZWF0ZVBhcnQoKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmNyZWF0ZVBhcnQoKSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gd3NkbERlZmluaXRpb24uY3JlYXRlUGFydCgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFBvcnQgY3JlYXRlUG9ydCgpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuY3JlYXRlUG9ydCgpIik7DQotICAgICAgICB9DQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiB3c2RsRGVmaW5pdGlvbi5jcmVhdGVQb3J0KCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUG9ydFR5cGUgY3JlYXRlUG9ydFR5cGUoKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmNyZWF0ZVBvcnRUeXBlKCkiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuIHdzZGxEZWZpbml0aW9uLmNyZWF0ZVBvcnRUeXBlKCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU2VydmljZSBjcmVhdGVTZXJ2aWNlKCkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5jcmVhdGVTZXJ2aWNlKCkiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuIHdzZGxEZWZpbml0aW9uLmNyZWF0ZVNlcnZpY2UoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBUeXBlcyBjcmVhdGVUeXBlcygpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuY3JlYXRlVHlwZXMoKSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gd3NkbERlZmluaXRpb24uY3JlYXRlVHlwZXMoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldEV4dGVuc2lvblJlZ2lzdHJ5KEV4dGVuc2lvblJlZ2lzdHJ5IGV4dFJlZykgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5zZXRFeHRlbnNpb25SZWdpc3RyeSgiICsgZXh0UmVnICsgIikiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgd3NkbERlZmluaXRpb24uc2V0RXh0ZW5zaW9uUmVnaXN0cnkoZXh0UmVnKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgRXh0ZW5zaW9uUmVnaXN0cnkgZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuIHdzZGxEZWZpbml0aW9uLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSArICJcbiIgKyB3c2RsRGVmaW5pdGlvbi50b1N0cmluZygpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7DQotICAgIH0NCi0NCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotICAgIC8vIG90aGVyIEFic3RyYWN0V1NETEVsZW1lbnQgbWV0aG9kcw0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0NCi0gICAgcHVibGljIEV4dGVuc2liaWxpdHlFbGVtZW50IHJlbW92ZUV4dGVuc2liaWxpdHlFbGVtZW50KEV4dGVuc2liaWxpdHlFbGVtZW50IGV4dEVsZW1lbnQpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIucmVtb3ZlRXh0ZW5zaWJpbGl0eUVsZW1lbnQoIiArIGV4dEVsZW1lbnQgKyAiKSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gd3NkbERlZmluaXRpb24ucmVtb3ZlRXh0ZW5zaWJpbGl0eUVsZW1lbnQoZXh0RWxlbWVudCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgamF2YS5sYW5nLk9iamVjdCBnZXRFeHRlbnNpb25BdHRyaWJ1dGUoUU5hbWUgbmFtZSkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5nZXRFeHRlbnNpb25BdHRyaWJ1dGUoIiArIG5hbWUgKyAiKSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gd3NkbERlZmluaXRpb24uZ2V0RXh0ZW5zaW9uQXR0cmlidXRlKG5hbWUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE1hcCBnZXRFeHRlbnNpb25BdHRyaWJ1dGVzKCkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5nZXRFeHRlbnNpb25BdHRyaWJ1dGVzKCkiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuIHdzZGxEZWZpbml0aW9uLmdldEV4dGVuc2lvbkF0dHJpYnV0ZXMoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldEV4dGVuc2lvbkF0dHJpYnV0ZShRTmFtZSBuYW1lLCBqYXZhLmxhbmcuT2JqZWN0IHZhbHVlKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLnNldEV4dGVuc2lvbkF0dHJpYnV0ZSgiICsgbmFtZSArICIsICAiICsgdmFsdWUgKyAiKSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICB3c2RsRGVmaW5pdGlvbi5zZXRFeHRlbnNpb25BdHRyaWJ1dGUobmFtZSwgdmFsdWUpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotDQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSAgICAvLyBwcml2YXRlIG1ldGhvZHMNCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotDQotDQotICAgIHByaXZhdGUgU3RyaW5nIGdldEV4cGxpY2l0VVJJKFVSTCB3c2RsVVJMKSB0aHJvd3MgV1NETEV4Y2VwdGlvbiB7DQotDQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmdldEV4cGxpY2l0VVJJKCIgKyB3c2RsVVJMICsgIikgIik7DQotICAgICAgICB9DQotDQotICAgICAgICBTdHJpbmcgZXhwbGljaXRVUkkgPSBudWxsOw0KLQ0KLSAgICAgICAgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIgPQ0KLSAgICAgICAgICAgICAgICAoQ2xhc3NMb2FkZXIpIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkQWN0aW9uKCkgew0KLSAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0pOw0KLQ0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBVUkwgdXJsID0gd3NkbFVSTDsNCi0gICAgICAgICAgICBTdHJpbmcgZmlsZVBhdGggPSBudWxsOw0KLSAgICAgICAgICAgIGJvb2xlYW4gaXNGaWxlUHJvdG9jb2wgPQ0KLSAgICAgICAgICAgICAgICAgICAgKHVybCAhPSBudWxsICYmICJmaWxlIi5lcXVhbHModXJsLmdldFByb3RvY29sKCkpKSA/IHRydWUgOiBmYWxzZTsNCi0NCi0gICAgICAgICAgICBpZiAoaXNGaWxlUHJvdG9jb2wpIHsNCi0gICAgICAgICAgICAgICAgZmlsZVBhdGggPSAodXJsICE9IG51bGwpID8gdXJsLmdldFBhdGgoKSA6IG51bGw7DQotDQotICAgICAgICAgICAgICAgIFVSSSB1cmkgPSBudWxsOw0KLSAgICAgICAgICAgICAgICBpZiAodXJsICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgICAgIHVyaSA9IG5ldyBVUkkodXJsLnRvU3RyaW5nKCkpOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSB1cmkgaGFzIHJlbGF0aXZlIHBhdGggDQotICAgICAgICAgICAgICAgIC8vIGllIHBhdGggaXMgbm90IGFic29sdXRlIGFuZCBpcyBub3Qgc3RhcnRpbmcgd2l0aCBhICIvIiANCi0gICAgICAgICAgICAgICAgYm9vbGVhbiBpc1JlbGF0aXZlUGF0aCA9DQotICAgICAgICAgICAgICAgICAgICAgICAgKGZpbGVQYXRoICE9IG51bGwgJiYgIW5ldyBGaWxlKGZpbGVQYXRoKS5pc0Fic29sdXRlKCkpID8gdHJ1ZSA6IGZhbHNlOw0KLQ0KLSAgICAgICAgICAgICAgICBpZiAoaXNSZWxhdGl2ZVBhdGgpIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuZ2V0RXhwbGljaXRVUkkoIiArIHdzZGxVUkwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIik6IFdTREwgVVJMIGhhcyBhIHJlbGF0aXZlIHBhdGgiKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgIC8vIExldHMgcmVhZCB0aGUgY29tcGxldGUgV1NETCBVUkwgZm9yIHJlbGF0aXZlIHBhdGggZnJvbSBjbGFzcyBsb2FkZXINCi0gICAgICAgICAgICAgICAgICAgIC8vIFVzZSByZWxhdGl2ZSBwYXRoIG9mIHVybCB0byBmZXRjaCBjb21wbGV0ZSBVUkwuICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgICAgIHVybCA9IGdldEFic29sdXRlVVJMKGNsYXNzTG9hZGVyLCBmaWxlUGF0aCk7DQotDQotICAgICAgICAgICAgICAgICAgICBpZiAodXJsID09IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5nZXRFeHBsaWNpdFVSSSgiICsgd3NkbFVSTCArICIpOiAiDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiV1NETCBVUkwgZm9yIHJlbGF0aXZlIHBhdGggbm90IGZvdW5kIGluIENsYXNzTG9hZGVyIik7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIi5nZXRFeHBsaWNpdFVSSSgiDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB3c2RsVVJMDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiKTogIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlVuYWJsZSB0byByZWFkIFdTREwgZnJvbSByZWxhdGl2ZSBwYXRoLCBjaGVjayB0aGUgcmVsYXRpdmUgcGF0aCIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmdldEV4cGxpY2l0VVJJKCIgKyB3c2RsVVJMICsgIik6ICINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJSZWxhdGl2ZSBwYXRoIGV4YW1wbGU6IGZpbGU6L1dFQi1JTkYvd3NkbC88d3NkbGZpbGVuYW1lPiIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIuZ2V0RXhwbGljaXRVUkkoIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgd3NkbFVSTA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIik6ICINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJVc2luZyByZWxhdGl2ZSBwYXRoIGFzIGRlZmF1bHQgd3NkbCBVUkwgdG8gbG9hZCB3c2RsIERlZmluaXRpb24uIik7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHVybCA9IHdzZGxVUkw7DQotICAgICAgICAgICAgICAgICAgICB9IA0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuZ2V0RXhwbGljaXRVUkkoIiArIHdzZGxVUkwgKyAiKTogIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIldTREwgVVJMIGZvdW5kIGZvciByZWxhdGl2ZSBwYXRoOiAiICsgZmlsZVBhdGggKyAiIHNjaGVtZTogIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdXJpLmdldFNjaGVtZSgpKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgVVJMQ29ubmVjdGlvbiB1cmxDb24gPSB1cmwub3BlbkNvbm5lY3Rpb24oKTsNCi0gICAgICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IG51bGw7DQotICAgICAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICAJaXMgPSBnZXRJbnB1dFN0cmVhbSh1cmxDb24pOw0KLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmdldEV4cGxpY2l0VVJJKCIgKyB3c2RsVVJMICsgIik6ICINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiQ291bGQgbm90IG9wZW4gdXJsIGNvbm5lY3Rpb24uIFRyeWluZyB0byB1c2UgIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJjbGFzc2xvYWRlciB0byBnZXQgYW5vdGhlciBVUkwuIik7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgaWYgKGZpbGVQYXRoICE9IG51bGwpIHsNCi0NCi0gICAgICAgICAgICAgICAgICAgIHVybCA9IGdldEFic29sdXRlVVJMKGNsYXNzTG9hZGVyLCBmaWxlUGF0aCk7DQotICAgICAgICAgICAgICAgICAgICBpZiAodXJsID09IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJDb3VsZCBub3QgbG9jYXRlIFVSTCBmb3Igd3NkbC4gUmVwb3J0aW5nIGVycm9yIik7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBXU0RMRXhjZXB0aW9uKCJXU0RMNEpXcmFwcGVyIDogIiwgZS5nZXRNZXNzYWdlKCksIGUpOw0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICB1cmxDb24gPSB1cmwub3BlbkNvbm5lY3Rpb24oKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJGb3VuZCBVUkwgZm9yIFdTREwgZnJvbSBqYXIiKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmdldEV4cGxpY2l0VVJJKCIgKyB3c2RsVVJMICsgIik6ICINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIkNvdWxkIG5vdCBnZXQgVVJMIGZyb20gY2xhc3Nsb2FkZXIuIFJlcG9ydGluZyAiDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJlcnJvciBkdWUgdG8gbm8gZmlsZSBwYXRoLiIpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFdTRExFeGNlcHRpb24oIldTRExXcmFwcGVyUmVsb2FkSW1wbCA6ICIsIGUuZ2V0TWVzc2FnZSgpLCBlKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZiAoaXMgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICBpcy5jbG9zZSgpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBleHBsaWNpdFVSSSA9IHVybENvbi5nZXRVUkwoKS50b1N0cmluZygpOw0KLQ0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IFdTRExFeGNlcHRpb24oIldTRExXcmFwcGVyUmVsb2FkSW1wbCA6ICIsIGV4LmdldE1lc3NhZ2UoKSwgZXgpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGV4cGxpY2l0VVJJOw0KLSAgICB9DQotDQotDQotICAgIHByaXZhdGUgVVJMIGdldEFic29sdXRlVVJMKGZpbmFsIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyLCBmaW5hbCBTdHJpbmcgZmlsZVBhdGgpIHRocm93cyBXU0RMRXhjZXB0aW9uIHsNCi0gICAgICAgIFVSTCB1cmwgPSAoVVJMKSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgNCi0gICAgICAgICAgICAgICAgbmV3IFByaXZpbGVnZWRBY3Rpb24oKSB7DQotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2xhc3NMb2FkZXIuZ2V0UmVzb3VyY2UoZmlsZVBhdGgpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICApOw0KLSAgICAgICAgaWYgKHVybCA9PSBudWxsKSB7DQotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ291bGQgbm90IGdldCBVUkwgZnJvbSBjbGFzc2xvYWRlci4gTG9va2luZyBpbiBhIGphci4iKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYgKGNsYXNzTG9hZGVyIGluc3RhbmNlb2YgVVJMQ2xhc3NMb2FkZXIpIHsNCi0gICAgICAgICAgICAgICAgVVJMQ2xhc3NMb2FkZXIgdXJsTG9hZGVyID0gKFVSTENsYXNzTG9hZGVyKSBjbGFzc0xvYWRlcjsNCi0gICAgICAgICAgICAgICAgdXJsID0gZ2V0VVJMRnJvbUpBUih1cmxMb2FkZXIsIHdzZGxVUkwpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB1cmw7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIExvYWQgYW5kIFJldHVybiBhIERlZmluaXRpb24gb2JqZWN0Lg0KLSAgICAgKiAoVGhlIGNhbGxlciB3aWxsIGRldGVybWluZSBpZiB0aGUgRGVmaW5pdGlvbiBvYmplY3Qgc2hvdWxkIGhhdmUgDQotICAgICAqIGl0cyByZXNvdXJjZXMgZnJlZWQgb3Igbm90KQ0KLSAgICAgKiBAcmV0dXJuIERlZmluaXRpb24NCi0gICAgICogQHRocm93cyBXU0RMRXhjZXB0aW9uDQotICAgICAqLw0KLSAgICBwcml2YXRlIERlZmluaXRpb24gbG9hZERlZmluaXRpb24oKSB0aHJvd3MgV1NETEV4Y2VwdGlvbiB7DQotDQotICAgICAgICBEZWZpbml0aW9uIGRlZiA9IG51bGw7DQotDQotICAgICAgICBpZiAod3NkbEV4cGxpY2l0VVJJICE9IG51bGwpIHsNCi0gICAgICAgICAgICB0cnkgew0KLSAgICAgICAgICAgICAgICBkZWYgPSAoRGVmaW5pdGlvbikgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24oKSB7DQotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHRocm93cyBXU0RMRXhjZXB0aW9uIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBXU0RMUmVhZGVyIHJlYWRlciA9IGdldFdTRExSZWFkZXIoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVhZGVyLnJlYWRXU0RMKHdzZGxFeHBsaWNpdFVSSSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0pOw0KLSAgICAgICAgICAgIH0gY2F0Y2ggKFByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIubG9hZERlZmluaXRpb24oKTogIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJFeGNlcHRpb24gdGhyb3duIGZyb20gQWNjZXNzQ29udHJvbGxlcjogIiArIGUpOw0KLSAgICAgICAgICAgICAgICAgICAgbG9nLnRyYWNlKCJDYWxsIFN0YWNrID0gIiArIEphdmFVdGlscy5jYWxsU3RhY2tUb1N0cmluZygpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBXU0RMRXhjZXB0aW9uIHdlID0gbmV3IFdTRExFeGNlcHRpb24oIldTRExXcmFwcGVyUmVsb2FkSW1wbCA6ICIsIGUuZ2V0TWVzc2FnZSgpLCBlKTsNCi0gICAgICAgICAgICAgICAgdGhyb3cgd2U7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy8gTG9hZGluZyB0aGUgd3NkbCBpcyBleHBlbnNpdmUuICBEdW1wIHRoZSBjYWxsc3RhY2suLiBzbyB0aGF0IHdlIA0KLSAgICAgICAgLy8gc3VwcG9ydCBjYW4gbG9vayBhdCB0aGUgdHJhY2UgYW5kIGRldGVybWluZSBpZiB0aGlzIGNsYXNzIGlzIGJlaW5nIHVzZWQgaW5jb3JyZWN0bHkuDQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmxvYWREZWZpbml0aW9uKCk6ICByZXR1cm5pbmcgRGVmaW5pdGlvbiBbIiArIGRlZiArICJdIik7DQotICAgICAgICAgICAgbG9nLnRyYWNlKCJDYWxsIFN0YWNrID0gIiArIEphdmFVdGlscy5jYWxsU3RhY2tUb1N0cmluZygpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBkZWY7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBVUkwgZ2V0VVJMRnJvbUpBUihVUkxDbGFzc0xvYWRlciB1cmxMb2FkZXIsIFVSTCByZWxhdGl2ZVVSTCkgdGhyb3dzIFdTRExFeGNlcHRpb24gew0KLQ0KLSAgICAgICAgVVJMW10gdXJsTGlzdCA9IHVybExvYWRlci5nZXRVUkxzKCk7DQotDQotICAgICAgICBpZiAodXJsTGlzdCA9PSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotDQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHVybExpc3QubGVuZ3RoOyBpKyspIHsNCi0gICAgICAgICAgICBVUkwgdXJsID0gdXJsTGlzdFtpXTsNCi0NCi0gICAgICAgICAgICBpZiAodXJsID09IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGlmICgiZmlsZSIuZXF1YWxzKHVybC5nZXRQcm90b2NvbCgpKSkgew0KLQ0KLSAgICAgICAgICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZSh1cmwuZ2V0UGF0aCgpKTsNCi0NCi0gICAgICAgICAgICAgICAgLy9JZiBmaWxlIGlzIG5vdCBvZiB0eXBlIGRpcmVjdG9yeSB0aGVuIGl0cyBhIGphciBmaWxlDQotICAgICAgICAgICAgICAgIGlmIChmLmV4aXN0cygpICYmICFmLmlzRGlyZWN0b3J5KCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgSmFyRmlsZSBqZiA9IG5ldyBKYXJGaWxlKGYpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIEVudW1lcmF0aW9uIGVudHJpZXMgPSBqZi5lbnRyaWVzKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVhZCBhbGwgZW50cmllcyBpbiBqYXIgZmlsZSBhbmQgcmV0dXJuIHRoZSBmaXJzdCANCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyB3c2RsIGZpbGUgdGhhdCBtYXRjaGVzIHRoZSByZWxhdGl2ZSBwYXRoDQotICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGVudHJpZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSmFyRW50cnkgamUgPSAoSmFyRW50cnkpIGVudHJpZXMubmV4dEVsZW1lbnQoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBqZS5nZXROYW1lKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lLmVuZHNXaXRoKCIud3NkbCIpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmVsYXRpdmVQYXRoID0gcmVsYXRpdmVVUkwuZ2V0UGF0aCgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlbGF0aXZlUGF0aC5lbmRzV2l0aChuYW1lKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXRoID0gZi5nZXRBYnNvbHV0ZVBhdGgoKTsNCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGNoZWNrIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIFVuaXgvTGludXggZmlsZSBwYXRocyBiZWdpbg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpdGggYSAnLycuIFdoZW4gYWRkaW5nIHRoZSBwcmVmaXggJ2phcjpmaWxlOi8nIHdlIG1heSBlbmQNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1cCB3aXRoICcvLycgYWZ0ZXIgdGhlICdmaWxlOicgcGFydC4gVGhpcyBjYXVzZXMgdGhlIFVSTCANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvYmplY3QgdG8gdHJlYXQgdGhpcyBsaWtlIGEgcmVtb3RlIHJlc291cmNlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGggIT0gbnVsbCAmJiBwYXRoLmluZGV4T2YoIi8iKSA9PSAwKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGggPSBwYXRoLnN1YnN0cmluZygxLCBwYXRoLmxlbmd0aCgpKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMIGFic29sdXRlVXJsID0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBVUkwoImphcjpmaWxlOi8iICsgcGF0aCArICIhLyIgKyBqZS5nZXROYW1lKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhYnNvbHV0ZVVybDsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgV1NETEV4Y2VwdGlvbiB3ZSA9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgV1NETEV4Y2VwdGlvbigiV1NETFdyYXBwZXJSZWxvYWRJbXBsIDogIiwgZS5nZXRNZXNzYWdlKCksIGUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHdlOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0NCi0gICAgLyoqDQotICAgICAqIFJldHVybnMgYSB3c2RsIHJlYWRlciBmb3IgdGhlIHdzZGwNCi0gICAgICogDQotICAgICAqIEByZXR1cm4gV1NETFJlYWRlcg0KLSAgICAgKiBAZXhjZXB0aW9uIFdTRExFeGNlcHRpb24NCi0gICAgICovDQotICAgIHByaXZhdGUgV1NETFJlYWRlciBnZXRXU0RMUmVhZGVyKCkgdGhyb3dzIFdTRExFeGNlcHRpb24gew0KLSAgICAgICAgV1NETFJlYWRlciByZWFkZXI7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIHJlYWRlciA9IChXU0RMUmVhZGVyKSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbigpIHsNCi0gICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB0aHJvd3MgV1NETEV4Y2VwdGlvbiB7DQotICAgICAgICAgICAgICAgICAgICBXU0RMRmFjdG9yeSBmYWN0b3J5ID0gV1NETEZhY3RvcnkubmV3SW5zdGFuY2UoKTsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWN0b3J5Lm5ld1dTRExSZWFkZXIoKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0pOw0KLSAgICAgICAgfSBjYXRjaCAoUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgdGhyb3cgKFdTRExFeGNlcHRpb24pIGUuZ2V0RXhjZXB0aW9uKCk7DQotICAgICAgICB9DQotCS8vIHByZXZlbnQgc3lzdGVtIG91dCBmcm9tIG9jY3VycmluZw0KLSAgICAgICAgcmVhZGVyLnNldEZlYXR1cmUoY29tLmlibS53c2RsLkNvbnN0YW50cy5GRUFUVVJFX1ZFUkJPU0UsIGZhbHNlKTsNCi0gICAgICAgIHJldHVybiByZWFkZXI7DQotICAgIH0NCi0NCi0NCi0gICAgLyoqDQotICAgICAqIFRoaXMgbWV0aG9kIHByb3ZpZGVzIGEgSmF2YTIgU2VjdXJpdHkgY29tcGxpYW50IHdheSB0byBvYnRhaW4gdGhlIElucHV0U3RyZWFtDQotICAgICAqIGZvciBhIGdpdmVuIFVSTENvbm5lY3Rpb24gb2JqZWN0LiBUaGlzIGlzIG5lZWRlZCBhcyBhIGdpdmVuIFVSTENvbm5lY3Rpb24gb2JqZWN0DQotICAgICAqIG1heSBiZSBhbiBpbnN0YW5jZSBvZiBhIEZpbGVVUkxDb25uZWN0aW9uIG9iamVjdCB3aGljaCB3b3VsZCByZXF1aXJlIGFjY2VzcyANCi0gICAgICogcGVybWlzc2lvbnMgaWYgSmF2YTIgU2VjdXJpdHkgd2FzIGVuYWJsZWQuDQotICAgICAqLw0KLSAgICBwcml2YXRlIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKFVSTENvbm5lY3Rpb24gdXJsQ29uKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgCWZpbmFsIFVSTENvbm5lY3Rpb24gZmluYWxVUkxDb24gPSB1cmxDb247DQotICAgIAlJbnB1dFN0cmVhbSBpcyA9IG51bGw7DQotICAgIAl0cnkgew0KLSAgICAJCWlzID0gKElucHV0U3RyZWFtKSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgNCi0gICAgICAgIAkJCW5ldyBQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uKCkgew0KLSAgICAJCQkJCXB1YmxpYyBPYmplY3QgcnVuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgCQkJCQkJcmV0dXJuIGZpbmFsVVJMQ29uLmdldElucHV0U3RyZWFtKCk7DQotICAgIAkJCQkJfQ0KLSAgICAgICAgCQkJfSk7DQotICAgIAl9DQotICAgIAljYXRjaChQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uIGUpIHsNCi0gICAgCQl0aHJvdyBlLmdldEV4Y2VwdGlvbigpOw0KLSAgICAJfQ0KLSAgICAJcmV0dXJuIGlzOw0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL3V0aWwvV1NETFdyYXBwZXJTYXZlSW1wbC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdXRpbC9XU0RMV3JhcHBlclNhdmVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyMmMzNmMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdXRpbC9XU0RMV3JhcHBlclNhdmVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjM1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIud3NkbC51dGlsOw0KLQ0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuQ291bnRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLkphdmFVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmc7DQotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ0ZhdWx0Ow0KLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdJbnB1dDsNCi1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nT3BlcmF0aW9uOw0KLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdPdXRwdXQ7DQotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsNCi1pbXBvcnQgamF2YXgud3NkbC5GYXVsdDsNCi1pbXBvcnQgamF2YXgud3NkbC5JbXBvcnQ7DQotaW1wb3J0IGphdmF4LndzZGwuSW5wdXQ7DQotaW1wb3J0IGphdmF4LndzZGwuTWVzc2FnZTsNCi1pbXBvcnQgamF2YXgud3NkbC5PcGVyYXRpb247DQotaW1wb3J0IGphdmF4LndzZGwuT3V0cHV0Ow0KLWltcG9ydCBqYXZheC53c2RsLlBhcnQ7DQotaW1wb3J0IGphdmF4LndzZGwuUG9ydDsNCi1pbXBvcnQgamF2YXgud3NkbC5Qb3J0VHlwZTsNCi1pbXBvcnQgamF2YXgud3NkbC5TZXJ2aWNlOw0KLWltcG9ydCBqYXZheC53c2RsLlR5cGVzOw0KLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7DQotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpb25SZWdpc3RyeTsNCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi1pbXBvcnQgamF2YS5pby5GaWxlOw0KLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0NCi0vKioNCi0gKiBUaGVyZSBhcmUgY2FzZXMgd2hlcmUgYSBXU0RMIGRlZmluaXRpb24gaXMga2VwdCBpbiBtZW1vcnkNCi0gKiBpbiBjYXNlIGl0IG5lZWRzIHRvIGJlIGFjY2Vzc2VkIGR1cmluZyBydW50aW1lLiAgSW4gc2l0dWF0aW9ucyB3aGVyZSANCi0gKiB0aGVyZSBhcmUgbG90cyBvZiBXU0RMIGRlZmluaXRpb25zIG9yIGJpZyBXU0RMcywgdGhlIG1lbW9yeSBmb290cHJpbnQgY2FuIGJlIA0KLSAqIGh1Z2UuDQotICoNCi0gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIHN1cHBvcnQgZm9yIHByb2Nlc3NpbmcgYSBXU0RMNEogZGVmaW5pdGlvbg0KLSAqIHdpdGggYSBsb3dlciBtZW1vcnkgZm9vdHByaW50LiAgVGhpcyBpcyB1c2VmdWwgZm9yIGNlcnRhaW4NCi0gKiBlbnZpcm9ubWVudHMuDQotICoNCi0gKi8NCi1wdWJsaWMgY2xhc3MgV1NETFdyYXBwZXJTYXZlSW1wbCBpbXBsZW1lbnRzIFdTRExXcmFwcGVySW1wbCB7DQotDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhXU0RMV3JhcHBlclNhdmVJbXBsLmNsYXNzKTsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc0RlYnVnRW5hYmxlZCA9IGxvZy5pc0RlYnVnRW5hYmxlZCgpOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgbXlDbGFzc05hbWUgPSAiV1NETFdyYXBwZXJTYXZlSW1wbCI7DQotDQotICAgIC8vIGphdmF4LndzZGwuRGVmaW5pdGlvbiBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlDQotICAgIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMjc4ODgwNzM3NTgxNDA5NzQwOUw7DQotDQotICAgIC8vIHRoZSB3c2RsNGogd3NkbCBkZWZpbml0aW9uIG9iamVjdCB0aGF0IGlzIGJlaW5nIHdyYXBwZWQNCi0gICAgcHJpdmF0ZSBEZWZpbml0aW9uIHdzZGxEZWZpbml0aW9uID0gbnVsbDsNCi0NCi0gICAgLy8gdGhlIGxvY2F0aW9uIG9mIHRoZSBiYXNlIGRvY3VtZW50IHVzZWQgaW4gdGhlIHdzZGw0aiBkZWZpbml0aW9uDQotICAgIHByaXZhdGUgVVJMIHdzZGxVUkwgPSBudWxsOw0KLSAgICBwcml2YXRlIFN0cmluZyB3c2RsRXhwbGljaXRVUkkgPSBudWxsOw0KLSAgICBwcml2YXRlIFN0cmluZyB3c2RsRG9jdW1lbnRCYXNlVVJJID0gbnVsbDsNCi0NCi0gICAgLy8gYW4gb2JqZWN0IHRoYXQgbWFpbnRhaW5zIGEgc3luY2hyb25pemVkIGNvdW50ZXINCi0gICAgcHJpdmF0ZSBDb3VudGVyIGFjY2Vzc0NvdW50ID0gbnVsbDsNCi0NCi0gICAgLy8gc2VyaWFsaXphdGlvbi1yZWxhdGVkIGluZm9ybWF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSAgICAvLw0KLSAgICAvLyAgICdzYWZlVG9TZXJpYWxpemUnIGluZGljYXRlcyB3aGV0aGVyIHRoZSB3cmFwcGVkIFdTREwgZGVmaW5pdGlvbiBvYmplY3QgaXMNCi0gICAgLy8gICAgICAgICAgICAgICAgICAgICBzYWZlIHRvIHNlcmlhbGl6ZS4gIFRoaXMgaXMgc2V0IHRvIGZhbHNlIGlmIHRoZSB1bmRlcmx5aW5nDQotICAgIC8vICAgICAgICAgICAgICAgICAgICAgV1NETDRKJ3MgV1NETCBkZWZpbml0aW9uIGhhZCBhbiBlcnJvciB3aGVuIHdlIHRyaWVkIHRvIA0KLSAgICAvLyAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZSBpdC4NCi0gICAgLy8gDQotICAgIC8vICAgJ2hhc0JlZW5TYXZlZCcgICAgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIHdyYXBwZWQgV1NETCBkZWZpbml0aW9uIG9iamVjdA0KLSAgICAvLyAgICAgICAgICAgICAgICAgICAgIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBzYXZlZA0KLSAgICAvLyANCi0gICAgLy8gICAnaGFzQmVlblVwZGF0ZWRTaW5jZVNhdmluZycgIGluZGljYXRlcyB3aGV0aGVyIHRoZSB3cmFwcGVkIFdTREwgZGVmaW5pdGlvbg0KLSAgICAvLyAgICAgICAgICAgICAgICAgICAgIG9iamVjdCBoYXMgYmVlbiB1cGRhdGVkIHNpbmNlIHRoZSBsYXN0IHNhdmVkL3NlcmlhbHppYXRpb24NCi0gICAgLy8gDQotICAgIC8vIA0KLSAgICBwcml2YXRlIGJvb2xlYW4gc2FmZVRvU2VyaWFsaXplID0gdHJ1ZTsNCi0gICAgcHJpdmF0ZSBib29sZWFuIGhhc0JlZW5TYXZlZCA9IGZhbHNlOw0KLSAgICBwcml2YXRlIGJvb2xlYW4gaGFzQmVlblVwZGF0ZWRTaW5jZVNhdmluZyA9IGZhbHNlOw0KLQ0KLSAgICBwcml2YXRlIEZpbGUgc2F2ZWREZWZpbml0aW9uRmlsZSA9IG51bGw7DQotICAgIHByaXZhdGUgU3RyaW5nIHNhdmVkRmlsZW5hbWUgPSBudWxsOw0KLQ0KLQ0KLSAgICAvKioNCi0gICAgICogQ29uc3RydWN0b3INCi0gICAgICogDQotICAgICAqIEBwYXJhbSBkZWYgICAgVGhlIFdTREwgRGVmaW5pdGlvbg0KLSAgICAgKi8NCi0gICAgcHVibGljIFdTRExXcmFwcGVyU2F2ZUltcGwoRGVmaW5pdGlvbiBkZWYpIHsNCi0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiV1NETFdyYXBwZXJTYXZlSW1wbChEZWZpbml0aW9uIGRlZikgY2FsbGVkIik7DQotICAgICAgICAgICAgbG9nLnRyYWNlKEphdmFVdGlscy5jYWxsU3RhY2tUb1N0cmluZygpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHByZXBhcmUoZGVmLCBudWxsKTsNCi0gICAgfQ0KLQ0KLQ0KLSAgICAvKioNCi0gICAgICogQ29uc3RydWN0b3INCi0gICAgICogDQotICAgICAqIEBwYXJhbSBkZWYgICAgVGhlIFdTREwgRGVmaW5pdGlvbg0KLSAgICAgKiBAcGFyYW0gd1VSTCAgIFRoZSBVUkwgZm9yIHRoZSB3c2RsDQotICAgICAqLw0KLSAgICBwdWJsaWMgV1NETFdyYXBwZXJTYXZlSW1wbChEZWZpbml0aW9uIGRlZiwgVVJMIHdVUkwpIHsNCi0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiV1NETFdyYXBwZXJTYXZlSW1wbChEZWZpbml0aW9uIGRlZiwgVVJMIHdVUkwpIGNhbGxlZCIpOw0KLSAgICAgICAgICAgIGxvZy50cmFjZShKYXZhVXRpbHMuY2FsbFN0YWNrVG9TdHJpbmcoKSk7DQotICAgICAgICB9DQotICAgICAgICBwcmVwYXJlKGRlZiwgd1VSTCk7DQotICAgIH0NCi0NCi0NCi0NCi0gICAgLyoqDQotICAgICAqIEluaXRpYWxpemUgdGhlIHdzZGwgZGVmaW5pdGlvbiB3cmFwcGVyDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gZGVmICAgIFRoZSBXU0RMNEogZGVmaW5pdGlvbg0KLSAgICAgKiBAcGFyYW0gd1VSTCAgIFRoZSBVUkwgd2hlcmUgdGhlIFdTREwgaXMgb2J0YWluZWQNCi0gICAgICovDQotICAgIHByaXZhdGUgdm9pZCBwcmVwYXJlKERlZmluaXRpb24gZGVmLCBVUkwgd1VSTCkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5wcmVwYXJlKCkiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgd3NkbERlZmluaXRpb24gPSBkZWY7DQotICAgICAgICB3c2RsVVJMID0gd1VSTDsNCi0NCi0gICAgICAgIGFjY2Vzc0NvdW50ID0gbmV3IENvdW50ZXIoKTsNCi0NCi0gICAgICAgIHJlbGVhc2VSZXNvdXJjZXMoKTsNCi0gICAgfQ0KLQ0KLQ0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0gICAgLy8gcHVibGljIFdTRExEZWZpbml0aW9uV3JhcHBlciBtZXRob2RzDQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQ0KLSAgICAvKg0KLSAgICAgKiBSZXR1cm5zIHRoZSBXU0RMNEogRGVmaW5pdGlvbiBvYmplY3QgdGhhdCBpcyBiZWluZyB3cmFwcGVkDQotICAgICAqLw0KLSAgICBwdWJsaWMgRGVmaW5pdGlvbiBnZXRVbndyYXBwZWREZWZpbml0aW9uKCkgew0KLQ0KLSAgICAgICAgZ2V0V3JhcHBlZERlZmluaXRpb25Gb3JVc2UoKTsNCi0NCi0gICAgICAgIERlZmluaXRpb24gZGVmOw0KLQ0KLSAgICAgICAgaWYgKCh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSAmJg0KLSAgICAgICAgICAgICh3c2RsRGVmaW5pdGlvbiBpbnN0YW5jZW9mIFdTRExEZWZpbml0aW9uV3JhcHBlcikpIHsNCi0gICAgICAgICAgICBkZWYgPSAoKFdTRExEZWZpbml0aW9uV3JhcHBlcikgd3NkbERlZmluaXRpb24pLmdldFVud3JhcHBlZERlZmluaXRpb24oKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgZGVmID0gd3NkbERlZmluaXRpb247DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gZGVmOw0KLSAgICB9DQotDQotDQotDQotICAgIC8qKg0KLSAgICAgKiBTZXRzIHRoZSBXU0RMNEogRGVmaW5pdGlvbiBvYmplY3QgdGhhdCBpcyBiZWluZyB3cmFwcGVkDQotICAgICAqDQotICAgICAqIEBwYXJhbSBkICB0aGUgV1NETDRKIERlZmluaXRpb24gb2JqZWN0DQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBzZXREZWZpbml0aW9uVG9XcmFwKERlZmluaXRpb24gZCkgew0KLSAgICAgICAgd3NkbERlZmluaXRpb24gPSBkOw0KLSAgICB9DQotDQotDQotICAgIC8qKg0KLSAgICAgKiBTZXRzIHRoZSBsb2NhdGlvbiBmb3IgdGhlIFdTREw0SiBEZWZpbml0aW9uIG9iamVjdCB0aGF0IGlzIGJlaW5nIHdyYXBwZWQNCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHNldFdTRExMb2NhdGlvbihTdHJpbmcgdXJpTG9jYXRpb24pIHsNCi0gICAgICAgIGlmICh1cmlMb2NhdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICAgICAgd3NkbFVSTCA9IG5ldyBVUkwodXJpTG9jYXRpb24pOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICAgICAgLy8gdG9kbw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLQ0KLSAgICAvKioNCi0gICAgICogR2V0cyB0aGUgbG9jYXRpb24gZm9yIHRoZSBXU0RMNEogRGVmaW5pdGlvbiBvYmplY3QgdGhhdCBpcyBiZWluZyB3cmFwcGVkDQotICAgICAqLw0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFdTRExMb2NhdGlvbigpIHsNCi0gICAgICAgIGlmICh3c2RsVVJMICE9IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gd3NkbFVSTC50b1N0cmluZygpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0NCi0gICAgLyoqDQotICAgICAqIENsb3NlcyB0aGUgdXNlIG9mIHRoZSB3cmFwcGVyIGltcGxlbWVudGF0aW9uIGFuZCBhbGxvd3MgDQotICAgICAqIGludGVybmFsIHJlc291cmNlcyB0byBiZSByZWxlYXNlZC4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgew0KLSAgICAgICAgLy8gVE9ETyByZWxlYXNlIHRlbXBvcmFyeSBmaWxlcw0KLSAgICB9DQotDQotDQotDQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSAgICAvLyBqYXZheC53c2RsLkRlZmludGlvbiBpbnRlcmZhY2UgbWV0aG9kcw0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RG9jdW1lbnRCYXNlVVJJKFN0cmluZyBkKSB7DQotDQotICAgICAgICAvLyBTZXQgdGhlIFVSSSBvZiB0aGUgYmFzZSBkb2N1bWVudCBmb3IgdGhlIERlZmluaXRpb24uDQotICAgICAgICAvLyBUaGlzIGlkZW50aWZpZXMgdGhlIG9yaWdpbiBvZiB0aGUgRGVmaW5pdGlvbi4NCi0gICAgICAgIC8vIE5vdGUgdGhhdCB0aGlzIGlzIHRoZSBVUkkgb2YgdGhlIGJhc2UgZG9jdW1lbnQsIG5vdCB0aGUgaW1wb3J0cy4NCi0NCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuc2V0RG9jdW1lbnRCYXNlVVJJKCIgKyBkICsgIikiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGdldFdyYXBwZWREZWZpbml0aW9uRm9yVXNlKCk7DQotDQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIGlmIChoYXNCZWVuU2F2ZWQpIHsNCi0gICAgICAgICAgICAgICAgaGFzQmVlblVwZGF0ZWRTaW5jZVNhdmluZyA9IHRydWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHdzZGxEZWZpbml0aW9uLnNldERvY3VtZW50QmFzZVVSSShkKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGRvbmVVc2luZ1dyYXBwZWREZWZpbml0aW9uKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXREb2N1bWVudEJhc2VVUkkoKSB7DQotDQotICAgICAgICAvLyBHZXQgdGhlIFVSSSBvZiB0aGUgYmFzZSBkb2N1bWVudCBmb3IgdGhlIERlZmluaXRpb24uDQotICAgICAgICAvLyBUaGlzIGlkZW50aWZpZXMgdGhlIG9yaWdpbiBvZiB0aGUgRGVmaW5pdGlvbi4NCi0gICAgICAgIC8vIE5vdGUgdGhhdCB0aGlzIGlzIHRoZSBVUkkgb2YgdGhlIGJhc2UgZG9jdW1lbnQsIG5vdCB0aGUgaW1wb3J0cy4NCi0NCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuZ2V0RG9jdW1lbnRCYXNlVVJJKCkiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGdldFdyYXBwZWREZWZpbml0aW9uRm9yVXNlKCk7DQotDQotICAgICAgICBTdHJpbmcgcmVzdWx0cyA9IG51bGw7DQotDQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJlc3VsdHMgPSB3c2RsRGVmaW5pdGlvbi5nZXREb2N1bWVudEJhc2VVUkkoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGRvbmVVc2luZ1dyYXBwZWREZWZpbml0aW9uKCk7DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0czsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRRTmFtZShRTmFtZSBuKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLnNldFFOYW1lKCIgKyBuICsgIikiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGdldFdyYXBwZWREZWZpbml0aW9uRm9yVXNlKCk7DQotDQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIGlmIChoYXNCZWVuU2F2ZWQpIHsNCi0gICAgICAgICAgICAgICAgaGFzQmVlblVwZGF0ZWRTaW5jZVNhdmluZyA9IHRydWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHdzZGxEZWZpbml0aW9uLnNldFFOYW1lKG4pOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZG9uZVVzaW5nV3JhcHBlZERlZmluaXRpb24oKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUU5hbWUgZ2V0UU5hbWUoKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmdldFFOYW1lKCkiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGdldFdyYXBwZWREZWZpbml0aW9uRm9yVXNlKCk7DQotDQotICAgICAgICBRTmFtZSByZXN1bHRzID0gbnVsbDsNCi0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgcmVzdWx0cyA9IHdzZGxEZWZpbml0aW9uLmdldFFOYW1lKCk7DQotICAgICAgICB9DQotDQotICAgICAgICBkb25lVXNpbmdXcmFwcGVkRGVmaW5pdGlvbigpOw0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0VGFyZ2V0TmFtZXNwYWNlKFN0cmluZyB0KSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLnNldFRhcmdldE5hbWVzcGFjZSgiICsgdCArICIpIik7DQotICAgICAgICB9DQotDQotICAgICAgICBnZXRXcmFwcGVkRGVmaW5pdGlvbkZvclVzZSgpOw0KLQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICBpZiAoaGFzQmVlblNhdmVkKSB7DQotICAgICAgICAgICAgICAgIGhhc0JlZW5VcGRhdGVkU2luY2VTYXZpbmcgPSB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB3c2RsRGVmaW5pdGlvbi5zZXRUYXJnZXROYW1lc3BhY2UodCk7DQotICAgICAgICB9DQotDQotICAgICAgICBkb25lVXNpbmdXcmFwcGVkRGVmaW5pdGlvbigpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0TmFtZXNwYWNlKCkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5nZXRUYXJnZXROYW1lc3BhY2UoKSIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZ2V0V3JhcHBlZERlZmluaXRpb25Gb3JVc2UoKTsNCi0NCi0gICAgICAgIFN0cmluZyByZXN1bHRzID0gbnVsbDsNCi0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgcmVzdWx0cyA9IHdzZGxEZWZpbml0aW9uLmdldFRhcmdldE5hbWVzcGFjZSgpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZG9uZVVzaW5nV3JhcHBlZERlZmluaXRpb24oKTsNCi0NCi0gICAgICAgIHJldHVybiByZXN1bHRzOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGFkZE5hbWVzcGFjZShTdHJpbmcgcHJlZml4LCBTdHJpbmcgbmFtZXNwYWNlVVJJKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmFkZE5hbWVzcGFjZSgiICsgcHJlZml4ICsgIiwgIiArIG5hbWVzcGFjZVVSSSArICIpIik7DQotICAgICAgICB9DQotDQotICAgICAgICBnZXRXcmFwcGVkRGVmaW5pdGlvbkZvclVzZSgpOw0KLQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICBpZiAoaGFzQmVlblNhdmVkKSB7DQotICAgICAgICAgICAgICAgIGhhc0JlZW5VcGRhdGVkU2luY2VTYXZpbmcgPSB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB3c2RsRGVmaW5pdGlvbi5hZGROYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZG9uZVVzaW5nV3JhcHBlZERlZmluaXRpb24oKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIHJlbW92ZU5hbWVzcGFjZShTdHJpbmcgcHJlZml4KSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLnJlbW92ZU5hbWVzcGFjZSgiICsgcHJlZml4ICsgIikiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGdldFdyYXBwZWREZWZpbml0aW9uRm9yVXNlKCk7DQotDQotICAgICAgICBTdHJpbmcgcmVzdWx0cyA9IG51bGw7DQotDQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIGlmIChoYXNCZWVuU2F2ZWQpIHsNCi0gICAgICAgICAgICAgICAgaGFzQmVlblVwZGF0ZWRTaW5jZVNhdmluZyA9IHRydWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJlc3VsdHMgPSB3c2RsRGVmaW5pdGlvbi5yZW1vdmVOYW1lc3BhY2UocHJlZml4KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGRvbmVVc2luZ1dyYXBwZWREZWZpbml0aW9uKCk7DQotICAgICAgICByZXR1cm4gcmVzdWx0czsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZShTdHJpbmcgcHJlZml4KSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmdldE5hbWVzcGFjZSgiICsgcHJlZml4ICsgIikiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGdldFdyYXBwZWREZWZpbml0aW9uRm9yVXNlKCk7DQotDQotICAgICAgICBTdHJpbmcgcmVzdWx0cyA9IG51bGw7DQotDQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJlc3VsdHMgPSB3c2RsRGVmaW5pdGlvbi5nZXROYW1lc3BhY2UocHJlZml4KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGRvbmVVc2luZ1dyYXBwZWREZWZpbml0aW9uKCk7DQotICAgICAgICByZXR1cm4gcmVzdWx0czsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByZWZpeChTdHJpbmcgbmFtZXNwYWNlVVJJKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmdldFByZWZpeCgiICsgbmFtZXNwYWNlVVJJICsgIikiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGdldFdyYXBwZWREZWZpbml0aW9uRm9yVXNlKCk7DQotDQotICAgICAgICBTdHJpbmcgcmVzdWx0cyA9IG51bGw7DQotDQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJlc3VsdHMgPSB3c2RsRGVmaW5pdGlvbi5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGRvbmVVc2luZ1dyYXBwZWREZWZpbml0aW9uKCk7DQotICAgICAgICByZXR1cm4gcmVzdWx0czsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTWFwIGdldE5hbWVzcGFjZXMoKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmdldE5hbWVzcGFjZXMoKSIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZ2V0V3JhcHBlZERlZmluaXRpb25Gb3JVc2UoKTsNCi0NCi0gICAgICAgIE1hcCByZXN1bHRzID0gbnVsbDsNCi0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgcmVzdWx0cyA9IHdzZGxEZWZpbml0aW9uLmdldE5hbWVzcGFjZXMoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGRvbmVVc2luZ1dyYXBwZWREZWZpbml0aW9uKCk7DQotICAgICAgICByZXR1cm4gcmVzdWx0czsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTGlzdCBnZXROYXRpdmVBdHRyaWJ1dGVOYW1lcygpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuZ2V0TmF0aXZlQXR0cmlidXRlTmFtZXMoKSIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZ2V0V3JhcHBlZERlZmluaXRpb25Gb3JVc2UoKTsNCi0NCi0gICAgICAgIExpc3QgcmVzdWx0cyA9IG51bGw7DQotDQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJlc3VsdHMgPSB3c2RsRGVmaW5pdGlvbi5nZXROYXRpdmVBdHRyaWJ1dGVOYW1lcygpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZG9uZVVzaW5nV3JhcHBlZERlZmluaXRpb24oKTsNCi0gICAgICAgIHJldHVybiByZXN1bHRzOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFR5cGVzKFR5cGVzIHR5cGVzKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLnNldFR5cGVzKCkiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGdldFdyYXBwZWREZWZpbml0aW9uRm9yVXNlKCk7DQotDQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIGlmIChoYXNCZWVuU2F2ZWQpIHsNCi0gICAgICAgICAgICAgICAgaGFzQmVlblVwZGF0ZWRTaW5jZVNhdmluZyA9IHRydWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHdzZGxEZWZpbml0aW9uLnNldFR5cGVzKHR5cGVzKTsNCi0gICAgICAgIH0gDQotICAgICAgICBkb25lVXNpbmdXcmFwcGVkRGVmaW5pdGlvbigpOw0KLSAgICB9DQotDQotDQotICAgIHB1YmxpYyBUeXBlcyBnZXRUeXBlcygpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuZ2V0VHlwZXMoKSIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZ2V0V3JhcHBlZERlZmluaXRpb25Gb3JVc2UoKTsNCi0NCi0gICAgICAgIFR5cGVzIHJlc3VsdHMgPSBudWxsOw0KLQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICByZXN1bHRzID0gd3NkbERlZmluaXRpb24uZ2V0VHlwZXMoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGRvbmVVc2luZ1dyYXBwZWREZWZpbml0aW9uKCk7DQotICAgICAgICByZXR1cm4gcmVzdWx0czsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZGRJbXBvcnQoSW1wb3J0IGltcG9ydERlZikgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5hZGRJbXBvcnQoIiArIGltcG9ydERlZiArICIpIik7DQotICAgICAgICB9DQotDQotICAgICAgICBnZXRXcmFwcGVkRGVmaW5pdGlvbkZvclVzZSgpOw0KLQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICBpZiAoaGFzQmVlblNhdmVkKSB7DQotICAgICAgICAgICAgICAgIGhhc0JlZW5VcGRhdGVkU2luY2VTYXZpbmcgPSB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB3c2RsRGVmaW5pdGlvbi5hZGRJbXBvcnQoaW1wb3J0RGVmKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGRvbmVVc2luZ1dyYXBwZWREZWZpbml0aW9uKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEltcG9ydCByZW1vdmVJbXBvcnQoSW1wb3J0IGltcG9ydERlZikgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5yZW1vdmVJbXBvcnQoIiArIGltcG9ydERlZiArICIpIik7DQotICAgICAgICB9DQotDQotICAgICAgICBnZXRXcmFwcGVkRGVmaW5pdGlvbkZvclVzZSgpOw0KLQ0KLSAgICAgICAgSW1wb3J0IHJlc3VsdHMgPSBudWxsOw0KLQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICBpZiAoaGFzQmVlblNhdmVkKSB7DQotICAgICAgICAgICAgICAgIGhhc0JlZW5VcGRhdGVkU2luY2VTYXZpbmcgPSB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXN1bHRzID0gd3NkbERlZmluaXRpb24ucmVtb3ZlSW1wb3J0KGltcG9ydERlZik7DQotICAgICAgICB9DQotICAgICAgICBkb25lVXNpbmdXcmFwcGVkRGVmaW5pdGlvbigpOw0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotICAgIH0NCi0NCi0gICAgcHVibGljIExpc3QgZ2V0SW1wb3J0cyhTdHJpbmcgbmFtZXNwYWNlVVJJKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmdldEltcG9ydHMoIiArIG5hbWVzcGFjZVVSSSArICIpIik7DQotICAgICAgICB9DQotDQotICAgICAgICBnZXRXcmFwcGVkRGVmaW5pdGlvbkZvclVzZSgpOw0KLQ0KLSAgICAgICAgTGlzdCByZXN1bHRzID0gbnVsbDsNCi0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgcmVzdWx0cyA9IHdzZGxEZWZpbml0aW9uLmdldEltcG9ydHMobmFtZXNwYWNlVVJJKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGRvbmVVc2luZ1dyYXBwZWREZWZpbml0aW9uKCk7DQotICAgICAgICByZXR1cm4gcmVzdWx0czsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTWFwIGdldEltcG9ydHMoKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmdldEltcG9ydHMoKSIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZ2V0V3JhcHBlZERlZmluaXRpb25Gb3JVc2UoKTsNCi0NCi0gICAgICAgIE1hcCByZXN1bHRzID0gbnVsbDsNCi0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgcmVzdWx0cyA9IHdzZGxEZWZpbml0aW9uLmdldEltcG9ydHMoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGRvbmVVc2luZ1dyYXBwZWREZWZpbml0aW9uKCk7DQotICAgICAgICByZXR1cm4gcmVzdWx0czsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZGRNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5hZGRNZXNzYWdlKCIgKyBtZXNzYWdlICsgIikiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGdldFdyYXBwZWREZWZpbml0aW9uRm9yVXNlKCk7DQotDQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIGlmIChoYXNCZWVuU2F2ZWQpIHsNCi0gICAgICAgICAgICAgICAgaGFzQmVlblVwZGF0ZWRTaW5jZVNhdmluZyA9IHRydWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHdzZGxEZWZpbml0aW9uLmFkZE1lc3NhZ2UobWVzc2FnZSk7DQotICAgICAgICB9DQotICAgICAgICBkb25lVXNpbmdXcmFwcGVkRGVmaW5pdGlvbigpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBNZXNzYWdlIGdldE1lc3NhZ2UoUU5hbWUgbmFtZSkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5nZXRNZXNzYWdlKCIgKyBuYW1lICsgIikiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGdldFdyYXBwZWREZWZpbml0aW9uRm9yVXNlKCk7DQotDQotICAgICAgICBNZXNzYWdlIHJlc3VsdHMgPSBudWxsOw0KLQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICByZXN1bHRzID0gd3NkbERlZmluaXRpb24uZ2V0TWVzc2FnZShuYW1lKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGRvbmVVc2luZ1dyYXBwZWREZWZpbml0aW9uKCk7DQotICAgICAgICByZXR1cm4gcmVzdWx0czsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTWVzc2FnZSByZW1vdmVNZXNzYWdlKFFOYW1lIG5hbWUpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIucmVtb3ZlTWVzc2FnZSgiICsgbmFtZSArICIpIik7DQotICAgICAgICB9DQotDQotICAgICAgICBnZXRXcmFwcGVkRGVmaW5pdGlvbkZvclVzZSgpOw0KLQ0KLSAgICAgICAgTWVzc2FnZSByZXN1bHRzID0gbnVsbDsNCi0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgaWYgKGhhc0JlZW5TYXZlZCkgew0KLSAgICAgICAgICAgICAgICBoYXNCZWVuVXBkYXRlZFNpbmNlU2F2aW5nID0gdHJ1ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmVzdWx0cyA9IHdzZGxEZWZpbml0aW9uLnJlbW92ZU1lc3NhZ2UobmFtZSk7DQotICAgICAgICB9DQotICAgICAgICBkb25lVXNpbmdXcmFwcGVkRGVmaW5pdGlvbigpOw0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE1hcCBnZXRNZXNzYWdlcygpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuZ2V0TWVzc2FnZXMoKSIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZ2V0V3JhcHBlZERlZmluaXRpb25Gb3JVc2UoKTsNCi0NCi0gICAgICAgIE1hcCByZXN1bHRzID0gbnVsbDsNCi0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgcmVzdWx0cyA9IHdzZGxEZWZpbml0aW9uLmdldE1lc3NhZ2VzKCk7DQotICAgICAgICB9DQotICAgICAgICBkb25lVXNpbmdXcmFwcGVkRGVmaW5pdGlvbigpOw0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgYWRkQmluZGluZyhCaW5kaW5nIGJpbmRpbmcpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuYWRkQmluZGluZygiICsgYmluZGluZyArICIpIik7DQotICAgICAgICB9DQotDQotICAgICAgICBnZXRXcmFwcGVkRGVmaW5pdGlvbkZvclVzZSgpOw0KLQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICBpZiAoaGFzQmVlblNhdmVkKSB7DQotICAgICAgICAgICAgICAgIGhhc0JlZW5VcGRhdGVkU2luY2VTYXZpbmcgPSB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB3c2RsRGVmaW5pdGlvbi5hZGRCaW5kaW5nKGJpbmRpbmcpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZG9uZVVzaW5nV3JhcHBlZERlZmluaXRpb24oKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQmluZGluZyBnZXRCaW5kaW5nKFFOYW1lIG5hbWUpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuZ2V0QmluZGluZygiICsgbmFtZSArICIpIik7DQotICAgICAgICB9DQotDQotICAgICAgICBnZXRXcmFwcGVkRGVmaW5pdGlvbkZvclVzZSgpOw0KLQ0KLSAgICAgICAgQmluZGluZyByZXN1bHRzID0gbnVsbDsNCi0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgcmVzdWx0cyA9IHdzZGxEZWZpbml0aW9uLmdldEJpbmRpbmcobmFtZSk7DQotICAgICAgICB9DQotICAgICAgICBkb25lVXNpbmdXcmFwcGVkRGVmaW5pdGlvbigpOw0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEJpbmRpbmcgcmVtb3ZlQmluZGluZyhRTmFtZSBuYW1lKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLnJlbW92ZUJpbmRpbmcoIiArIG5hbWUgKyAiKSIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZ2V0V3JhcHBlZERlZmluaXRpb25Gb3JVc2UoKTsNCi0NCi0gICAgICAgIEJpbmRpbmcgcmVzdWx0cyA9IG51bGw7DQotDQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIGlmIChoYXNCZWVuU2F2ZWQpIHsNCi0gICAgICAgICAgICAgICAgaGFzQmVlblVwZGF0ZWRTaW5jZVNhdmluZyA9IHRydWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJlc3VsdHMgPSB3c2RsRGVmaW5pdGlvbi5yZW1vdmVCaW5kaW5nKG5hbWUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZG9uZVVzaW5nV3JhcHBlZERlZmluaXRpb24oKTsNCi0gICAgICAgIHJldHVybiByZXN1bHRzOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBNYXAgZ2V0QmluZGluZ3MoKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmdldEJpbmRpbmdzKCkiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGdldFdyYXBwZWREZWZpbml0aW9uRm9yVXNlKCk7DQotDQotICAgICAgICBNYXAgcmVzdWx0cyA9IG51bGw7DQotDQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJlc3VsdHMgPSB3c2RsRGVmaW5pdGlvbi5nZXRCaW5kaW5ncygpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZG9uZVVzaW5nV3JhcHBlZERlZmluaXRpb24oKTsNCi0gICAgICAgIHJldHVybiByZXN1bHRzOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBNYXAgZ2V0QWxsQmluZGluZ3MoKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmdldEFsbEJpbmRpbmdzKCkiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGdldFdyYXBwZWREZWZpbml0aW9uRm9yVXNlKCk7DQotDQotICAgICAgICBNYXAgcmVzdWx0cyA9IG51bGw7DQotDQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJlc3VsdHMgPSB3c2RsRGVmaW5pdGlvbi5nZXRBbGxCaW5kaW5ncygpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZG9uZVVzaW5nV3JhcHBlZERlZmluaXRpb24oKTsNCi0gICAgICAgIHJldHVybiByZXN1bHRzOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGFkZFBvcnRUeXBlKFBvcnRUeXBlIHBvcnRUeXBlKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmFkZFBvcnRUeXBlKCIgKyBwb3J0VHlwZSArICIpIik7DQotICAgICAgICB9DQotDQotICAgICAgICBnZXRXcmFwcGVkRGVmaW5pdGlvbkZvclVzZSgpOw0KLQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICBpZiAoaGFzQmVlblNhdmVkKSB7DQotICAgICAgICAgICAgICAgIGhhc0JlZW5VcGRhdGVkU2luY2VTYXZpbmcgPSB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB3c2RsRGVmaW5pdGlvbi5hZGRQb3J0VHlwZShwb3J0VHlwZSk7DQotICAgICAgICB9DQotICAgICAgICBkb25lVXNpbmdXcmFwcGVkRGVmaW5pdGlvbigpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBQb3J0VHlwZSBnZXRQb3J0VHlwZShRTmFtZSBuYW1lKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmdldFBvcnRUeXBlKCIgKyBuYW1lICsgIikiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGdldFdyYXBwZWREZWZpbml0aW9uRm9yVXNlKCk7DQotDQotICAgICAgICBQb3J0VHlwZSByZXN1bHRzID0gbnVsbDsNCi0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgcmVzdWx0cyA9IHdzZGxEZWZpbml0aW9uLmdldFBvcnRUeXBlKG5hbWUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZG9uZVVzaW5nV3JhcHBlZERlZmluaXRpb24oKTsNCi0gICAgICAgIHJldHVybiByZXN1bHRzOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBQb3J0VHlwZSByZW1vdmVQb3J0VHlwZShRTmFtZSBuYW1lKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLnJlbW92ZVBvcnRUeXBlKCIgKyBuYW1lICsgIikiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGdldFdyYXBwZWREZWZpbml0aW9uRm9yVXNlKCk7DQotDQotICAgICAgICBQb3J0VHlwZSByZXN1bHRzID0gbnVsbDsNCi0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgaWYgKGhhc0JlZW5TYXZlZCkgew0KLSAgICAgICAgICAgICAgICBoYXNCZWVuVXBkYXRlZFNpbmNlU2F2aW5nID0gdHJ1ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmVzdWx0cyA9IHdzZGxEZWZpbml0aW9uLnJlbW92ZVBvcnRUeXBlKG5hbWUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZG9uZVVzaW5nV3JhcHBlZERlZmluaXRpb24oKTsNCi0gICAgICAgIHJldHVybiByZXN1bHRzOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBNYXAgZ2V0UG9ydFR5cGVzKCkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5nZXRQb3J0VHlwZXMoKSIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZ2V0V3JhcHBlZERlZmluaXRpb25Gb3JVc2UoKTsNCi0NCi0gICAgICAgIE1hcCByZXN1bHRzID0gbnVsbDsNCi0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgcmVzdWx0cyA9IHdzZGxEZWZpbml0aW9uLmdldFBvcnRUeXBlcygpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZG9uZVVzaW5nV3JhcHBlZERlZmluaXRpb24oKTsNCi0gICAgICAgIHJldHVybiByZXN1bHRzOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBNYXAgZ2V0QWxsUG9ydFR5cGVzKCkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5nZXRBbGxQb3J0VHlwZXMoKSIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZ2V0V3JhcHBlZERlZmluaXRpb25Gb3JVc2UoKTsNCi0NCi0gICAgICAgIE1hcCByZXN1bHRzID0gbnVsbDsNCi0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgcmVzdWx0cyA9IHdzZGxEZWZpbml0aW9uLmdldEFsbFBvcnRUeXBlcygpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZG9uZVVzaW5nV3JhcHBlZERlZmluaXRpb24oKTsNCi0gICAgICAgIHJldHVybiByZXN1bHRzOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGFkZFNlcnZpY2UoU2VydmljZSBzZXJ2aWNlKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmFkZFNlcnZpY2UoIiArIHNlcnZpY2UgKyAiKSIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZ2V0V3JhcHBlZERlZmluaXRpb25Gb3JVc2UoKTsNCi0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgaWYgKGhhc0JlZW5TYXZlZCkgew0KLSAgICAgICAgICAgICAgICBoYXNCZWVuVXBkYXRlZFNpbmNlU2F2aW5nID0gdHJ1ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgd3NkbERlZmluaXRpb24uYWRkU2VydmljZShzZXJ2aWNlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGRvbmVVc2luZ1dyYXBwZWREZWZpbml0aW9uKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFNlcnZpY2UgZ2V0U2VydmljZShRTmFtZSBuYW1lKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmdldFNlcnZpY2UoIiArIG5hbWUgKyAiKSIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZ2V0V3JhcHBlZERlZmluaXRpb25Gb3JVc2UoKTsNCi0NCi0gICAgICAgIFNlcnZpY2UgcmVzdWx0cyA9IG51bGw7DQotDQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJlc3VsdHMgPSB3c2RsRGVmaW5pdGlvbi5nZXRTZXJ2aWNlKG5hbWUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZG9uZVVzaW5nV3JhcHBlZERlZmluaXRpb24oKTsNCi0gICAgICAgIHJldHVybiByZXN1bHRzOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTZXJ2aWNlIHJlbW92ZVNlcnZpY2UoUU5hbWUgbmFtZSkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5yZW1vdmVTZXJ2aWNlKCIgKyBuYW1lICsgIikiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGdldFdyYXBwZWREZWZpbml0aW9uRm9yVXNlKCk7DQotDQotICAgICAgICBTZXJ2aWNlIHJlc3VsdHMgPSBudWxsOw0KLQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICBpZiAoaGFzQmVlblNhdmVkKSB7DQotICAgICAgICAgICAgICAgIGhhc0JlZW5VcGRhdGVkU2luY2VTYXZpbmcgPSB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXN1bHRzID0gd3NkbERlZmluaXRpb24ucmVtb3ZlU2VydmljZShuYW1lKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGRvbmVVc2luZ1dyYXBwZWREZWZpbml0aW9uKCk7DQotICAgICAgICByZXR1cm4gcmVzdWx0czsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTWFwIGdldFNlcnZpY2VzKCkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5nZXRTZXJ2aWNlcygpIik7DQotICAgICAgICB9DQotDQotICAgICAgICBnZXRXcmFwcGVkRGVmaW5pdGlvbkZvclVzZSgpOw0KLQ0KLSAgICAgICAgTWFwIHJlc3VsdHMgPSBudWxsOw0KLQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICByZXN1bHRzID0gd3NkbERlZmluaXRpb24uZ2V0U2VydmljZXMoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGRvbmVVc2luZ1dyYXBwZWREZWZpbml0aW9uKCk7DQotICAgICAgICByZXR1cm4gcmVzdWx0czsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTWFwIGdldEFsbFNlcnZpY2VzKCkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5nZXRBbGxTZXJ2aWNlcygpIik7DQotICAgICAgICB9DQotDQotICAgICAgICBnZXRXcmFwcGVkRGVmaW5pdGlvbkZvclVzZSgpOw0KLQ0KLSAgICAgICAgTWFwIHJlc3VsdHMgPSBudWxsOw0KLQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICByZXN1bHRzID0gd3NkbERlZmluaXRpb24uZ2V0QWxsU2VydmljZXMoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGRvbmVVc2luZ1dyYXBwZWREZWZpbml0aW9uKCk7DQotICAgICAgICByZXR1cm4gcmVzdWx0czsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXREb2N1bWVudGF0aW9uRWxlbWVudChvcmcudzNjLmRvbS5FbGVtZW50IGRvY0VsKSB7DQotDQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLnNldERvY3VtZW50YXRpb25FbGVtZW50KCkiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGdldFdyYXBwZWREZWZpbml0aW9uRm9yVXNlKCk7DQotDQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIGlmIChoYXNCZWVuU2F2ZWQpIHsNCi0gICAgICAgICAgICAgICAgaGFzQmVlblVwZGF0ZWRTaW5jZVNhdmluZyA9IHRydWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHdzZGxEZWZpbml0aW9uLnNldERvY3VtZW50YXRpb25FbGVtZW50KGRvY0VsKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGRvbmVVc2luZ1dyYXBwZWREZWZpbml0aW9uKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIG9yZy53M2MuZG9tLkVsZW1lbnQgZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSB7DQotDQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmdldERvY3VtZW50YXRpb25FbGVtZW50KCkiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGdldFdyYXBwZWREZWZpbml0aW9uRm9yVXNlKCk7DQotDQotICAgICAgICBvcmcudzNjLmRvbS5FbGVtZW50IHJlc3VsdHMgPSBudWxsOw0KLQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gIHdzZGxEZWZpbml0aW9uLmdldERvY3VtZW50YXRpb25FbGVtZW50KCk7DQotICAgICAgICB9DQotICAgICAgICBkb25lVXNpbmdXcmFwcGVkRGVmaW5pdGlvbigpOw0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgYWRkRXh0ZW5zaWJpbGl0eUVsZW1lbnQoRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZXh0RWxlbWVudCkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5hZGRFeHRlbnNpYmlsaXR5RWxlbWVudCgiICsgZXh0RWxlbWVudCArICIpIik7DQotICAgICAgICB9DQotDQotICAgICAgICBnZXRXcmFwcGVkRGVmaW5pdGlvbkZvclVzZSgpOw0KLQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICBpZiAoaGFzQmVlblNhdmVkKSB7DQotICAgICAgICAgICAgICAgIGhhc0JlZW5VcGRhdGVkU2luY2VTYXZpbmcgPSB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB3c2RsRGVmaW5pdGlvbi5hZGRFeHRlbnNpYmlsaXR5RWxlbWVudChleHRFbGVtZW50KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGRvbmVVc2luZ1dyYXBwZWREZWZpbml0aW9uKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIExpc3QgZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZ2V0V3JhcHBlZERlZmluaXRpb25Gb3JVc2UoKTsNCi0NCi0gICAgICAgIExpc3QgcmVzdWx0cyA9IG51bGw7DQotDQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJlc3VsdHMgPSB3c2RsRGVmaW5pdGlvbi5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGRvbmVVc2luZ1dyYXBwZWREZWZpbml0aW9uKCk7DQotICAgICAgICByZXR1cm4gcmVzdWx0czsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQmluZGluZyBjcmVhdGVCaW5kaW5nKCkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5jcmVhdGVCaW5kaW5nKCkiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGdldFdyYXBwZWREZWZpbml0aW9uRm9yVXNlKCk7DQotDQotICAgICAgICBCaW5kaW5nIHJlc3VsdHMgPSBudWxsOw0KLQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICBpZiAoaGFzQmVlblNhdmVkKSB7DQotICAgICAgICAgICAgICAgIGhhc0JlZW5VcGRhdGVkU2luY2VTYXZpbmcgPSB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXN1bHRzID0gd3NkbERlZmluaXRpb24uY3JlYXRlQmluZGluZygpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZG9uZVVzaW5nV3JhcHBlZERlZmluaXRpb24oKTsNCi0gICAgICAgIHJldHVybiByZXN1bHRzOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBCaW5kaW5nRmF1bHQgY3JlYXRlQmluZGluZ0ZhdWx0KCkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5jcmVhdGVCaW5kaW5nRmF1bHQoKSIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZ2V0V3JhcHBlZERlZmluaXRpb25Gb3JVc2UoKTsNCi0NCi0gICAgICAgIEJpbmRpbmdGYXVsdCByZXN1bHRzID0gbnVsbDsNCi0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgaWYgKGhhc0JlZW5TYXZlZCkgew0KLSAgICAgICAgICAgICAgICBoYXNCZWVuVXBkYXRlZFNpbmNlU2F2aW5nID0gdHJ1ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmVzdWx0cyA9IHdzZGxEZWZpbml0aW9uLmNyZWF0ZUJpbmRpbmdGYXVsdCgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZG9uZVVzaW5nV3JhcHBlZERlZmluaXRpb24oKTsNCi0gICAgICAgIHJldHVybiByZXN1bHRzOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBCaW5kaW5nSW5wdXQgY3JlYXRlQmluZGluZ0lucHV0KCkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5jcmVhdGVCaW5kaW5nSW5wdXQoKSIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZ2V0V3JhcHBlZERlZmluaXRpb25Gb3JVc2UoKTsNCi0NCi0gICAgICAgIEJpbmRpbmdJbnB1dCByZXN1bHRzID0gbnVsbDsNCi0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgaWYgKGhhc0JlZW5TYXZlZCkgew0KLSAgICAgICAgICAgICAgICBoYXNCZWVuVXBkYXRlZFNpbmNlU2F2aW5nID0gdHJ1ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmVzdWx0cyA9IHdzZGxEZWZpbml0aW9uLmNyZWF0ZUJpbmRpbmdJbnB1dCgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZG9uZVVzaW5nV3JhcHBlZERlZmluaXRpb24oKTsNCi0gICAgICAgIHJldHVybiByZXN1bHRzOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBCaW5kaW5nT3BlcmF0aW9uIGNyZWF0ZUJpbmRpbmdPcGVyYXRpb24oKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmNyZWF0ZUJpbmRpbmdPcGVyYXRpb24oKSIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZ2V0V3JhcHBlZERlZmluaXRpb25Gb3JVc2UoKTsNCi0NCi0gICAgICAgIEJpbmRpbmdPcGVyYXRpb24gcmVzdWx0cyA9IG51bGw7DQotDQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIGlmIChoYXNCZWVuU2F2ZWQpIHsNCi0gICAgICAgICAgICAgICAgaGFzQmVlblVwZGF0ZWRTaW5jZVNhdmluZyA9IHRydWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJlc3VsdHMgPSB3c2RsRGVmaW5pdGlvbi5jcmVhdGVCaW5kaW5nT3BlcmF0aW9uKCk7DQotICAgICAgICB9DQotICAgICAgICBkb25lVXNpbmdXcmFwcGVkRGVmaW5pdGlvbigpOw0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEJpbmRpbmdPdXRwdXQgY3JlYXRlQmluZGluZ091dHB1dCgpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuY3JlYXRlQmluZGluZ091dHB1dCgpIik7DQotICAgICAgICB9DQotDQotICAgICAgICBnZXRXcmFwcGVkRGVmaW5pdGlvbkZvclVzZSgpOw0KLQ0KLSAgICAgICAgQmluZGluZ091dHB1dCByZXN1bHRzID0gbnVsbDsNCi0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgaWYgKGhhc0JlZW5TYXZlZCkgew0KLSAgICAgICAgICAgICAgICBoYXNCZWVuVXBkYXRlZFNpbmNlU2F2aW5nID0gdHJ1ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmVzdWx0cyA9IHdzZGxEZWZpbml0aW9uLmNyZWF0ZUJpbmRpbmdPdXRwdXQoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGRvbmVVc2luZ1dyYXBwZWREZWZpbml0aW9uKCk7DQotICAgICAgICByZXR1cm4gcmVzdWx0czsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgRmF1bHQgY3JlYXRlRmF1bHQoKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmNyZWF0ZUZhdWx0KCkiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGdldFdyYXBwZWREZWZpbml0aW9uRm9yVXNlKCk7DQotDQotICAgICAgICBGYXVsdCByZXN1bHRzID0gbnVsbDsNCi0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgaWYgKGhhc0JlZW5TYXZlZCkgew0KLSAgICAgICAgICAgICAgICBoYXNCZWVuVXBkYXRlZFNpbmNlU2F2aW5nID0gdHJ1ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmVzdWx0cyA9IHdzZGxEZWZpbml0aW9uLmNyZWF0ZUZhdWx0KCk7DQotICAgICAgICB9DQotICAgICAgICBkb25lVXNpbmdXcmFwcGVkRGVmaW5pdGlvbigpOw0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEltcG9ydCBjcmVhdGVJbXBvcnQoKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmNyZWF0ZUltcG9ydCgpIik7DQotICAgICAgICB9DQotDQotICAgICAgICBnZXRXcmFwcGVkRGVmaW5pdGlvbkZvclVzZSgpOw0KLQ0KLSAgICAgICAgSW1wb3J0IHJlc3VsdHMgPSBudWxsOw0KLQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICBpZiAoaGFzQmVlblNhdmVkKSB7DQotICAgICAgICAgICAgICAgIGhhc0JlZW5VcGRhdGVkU2luY2VTYXZpbmcgPSB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXN1bHRzID0gd3NkbERlZmluaXRpb24uY3JlYXRlSW1wb3J0KCk7DQotICAgICAgICB9DQotICAgICAgICBkb25lVXNpbmdXcmFwcGVkRGVmaW5pdGlvbigpOw0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotICAgIH0NCi0NCi0gICAgcHVibGljIElucHV0IGNyZWF0ZUlucHV0KCkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5jcmVhdGVJbnB1dCgpIik7DQotICAgICAgICB9DQotDQotICAgICAgICBnZXRXcmFwcGVkRGVmaW5pdGlvbkZvclVzZSgpOw0KLQ0KLSAgICAgICAgSW5wdXQgcmVzdWx0cyA9IG51bGw7DQotDQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIGlmIChoYXNCZWVuU2F2ZWQpIHsNCi0gICAgICAgICAgICAgICAgaGFzQmVlblVwZGF0ZWRTaW5jZVNhdmluZyA9IHRydWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJlc3VsdHMgPSB3c2RsRGVmaW5pdGlvbi5jcmVhdGVJbnB1dCgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZG9uZVVzaW5nV3JhcHBlZERlZmluaXRpb24oKTsNCi0gICAgICAgIHJldHVybiByZXN1bHRzOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBNZXNzYWdlIGNyZWF0ZU1lc3NhZ2UoKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmNyZWF0ZU1lc3NhZ2UoKSIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZ2V0V3JhcHBlZERlZmluaXRpb25Gb3JVc2UoKTsNCi0NCi0gICAgICAgIE1lc3NhZ2UgcmVzdWx0cyA9IG51bGw7DQotDQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIGlmIChoYXNCZWVuU2F2ZWQpIHsNCi0gICAgICAgICAgICAgICAgaGFzQmVlblVwZGF0ZWRTaW5jZVNhdmluZyA9IHRydWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJlc3VsdHMgPSB3c2RsRGVmaW5pdGlvbi5jcmVhdGVNZXNzYWdlKCk7DQotICAgICAgICB9DQotICAgICAgICBkb25lVXNpbmdXcmFwcGVkRGVmaW5pdGlvbigpOw0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE9wZXJhdGlvbiBjcmVhdGVPcGVyYXRpb24oKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmNyZWF0ZU9wZXJhdGlvbigpIik7DQotICAgICAgICB9DQotDQotICAgICAgICBnZXRXcmFwcGVkRGVmaW5pdGlvbkZvclVzZSgpOw0KLQ0KLSAgICAgICAgT3BlcmF0aW9uIHJlc3VsdHMgPSBudWxsOw0KLQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICBpZiAoaGFzQmVlblNhdmVkKSB7DQotICAgICAgICAgICAgICAgIGhhc0JlZW5VcGRhdGVkU2luY2VTYXZpbmcgPSB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXN1bHRzID0gd3NkbERlZmluaXRpb24uY3JlYXRlT3BlcmF0aW9uKCk7DQotICAgICAgICB9DQotICAgICAgICBkb25lVXNpbmdXcmFwcGVkRGVmaW5pdGlvbigpOw0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE91dHB1dCBjcmVhdGVPdXRwdXQoKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmNyZWF0ZU91dHB1dCgpIik7DQotICAgICAgICB9DQotDQotICAgICAgICBnZXRXcmFwcGVkRGVmaW5pdGlvbkZvclVzZSgpOw0KLQ0KLSAgICAgICAgT3V0cHV0IHJlc3VsdHMgPSBudWxsOw0KLQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICBpZiAoaGFzQmVlblNhdmVkKSB7DQotICAgICAgICAgICAgICAgIGhhc0JlZW5VcGRhdGVkU2luY2VTYXZpbmcgPSB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXN1bHRzID0gd3NkbERlZmluaXRpb24uY3JlYXRlT3V0cHV0KCk7DQotICAgICAgICB9DQotICAgICAgICBkb25lVXNpbmdXcmFwcGVkRGVmaW5pdGlvbigpOw0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFBhcnQgY3JlYXRlUGFydCgpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuY3JlYXRlUGFydCgpIik7DQotICAgICAgICB9DQotDQotICAgICAgICBnZXRXcmFwcGVkRGVmaW5pdGlvbkZvclVzZSgpOw0KLQ0KLSAgICAgICAgUGFydCByZXN1bHRzID0gbnVsbDsNCi0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgaWYgKGhhc0JlZW5TYXZlZCkgew0KLSAgICAgICAgICAgICAgICBoYXNCZWVuVXBkYXRlZFNpbmNlU2F2aW5nID0gdHJ1ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmVzdWx0cyA9IHdzZGxEZWZpbml0aW9uLmNyZWF0ZVBhcnQoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGRvbmVVc2luZ1dyYXBwZWREZWZpbml0aW9uKCk7DQotICAgICAgICByZXR1cm4gcmVzdWx0czsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUG9ydCBjcmVhdGVQb3J0KCkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5jcmVhdGVQb3J0KCkiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGdldFdyYXBwZWREZWZpbml0aW9uRm9yVXNlKCk7DQotDQotICAgICAgICBQb3J0IHJlc3VsdHMgPSBudWxsOw0KLQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICBpZiAoaGFzQmVlblNhdmVkKSB7DQotICAgICAgICAgICAgICAgIGhhc0JlZW5VcGRhdGVkU2luY2VTYXZpbmcgPSB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXN1bHRzID0gd3NkbERlZmluaXRpb24uY3JlYXRlUG9ydCgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZG9uZVVzaW5nV3JhcHBlZERlZmluaXRpb24oKTsNCi0gICAgICAgIHJldHVybiByZXN1bHRzOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBQb3J0VHlwZSBjcmVhdGVQb3J0VHlwZSgpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuY3JlYXRlUG9ydFR5cGUoKSIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZ2V0V3JhcHBlZERlZmluaXRpb25Gb3JVc2UoKTsNCi0NCi0gICAgICAgIFBvcnRUeXBlIHJlc3VsdHMgPSBudWxsOw0KLQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICBpZiAoaGFzQmVlblNhdmVkKSB7DQotICAgICAgICAgICAgICAgIGhhc0JlZW5VcGRhdGVkU2luY2VTYXZpbmcgPSB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXN1bHRzID0gd3NkbERlZmluaXRpb24uY3JlYXRlUG9ydFR5cGUoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGRvbmVVc2luZ1dyYXBwZWREZWZpbml0aW9uKCk7DQotICAgICAgICByZXR1cm4gcmVzdWx0czsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU2VydmljZSBjcmVhdGVTZXJ2aWNlKCkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5jcmVhdGVTZXJ2aWNlKCkiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGdldFdyYXBwZWREZWZpbml0aW9uRm9yVXNlKCk7DQotDQotICAgICAgICBTZXJ2aWNlIHJlc3VsdHMgPSBudWxsOw0KLQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICBpZiAoaGFzQmVlblNhdmVkKSB7DQotICAgICAgICAgICAgICAgIGhhc0JlZW5VcGRhdGVkU2luY2VTYXZpbmcgPSB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXN1bHRzID0gd3NkbERlZmluaXRpb24uY3JlYXRlU2VydmljZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZG9uZVVzaW5nV3JhcHBlZERlZmluaXRpb24oKTsNCi0gICAgICAgIHJldHVybiByZXN1bHRzOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBUeXBlcyBjcmVhdGVUeXBlcygpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuY3JlYXRlVHlwZXMoKSIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZ2V0V3JhcHBlZERlZmluaXRpb25Gb3JVc2UoKTsNCi0NCi0gICAgICAgIFR5cGVzIHJlc3VsdHMgPSBudWxsOw0KLQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICBpZiAoaGFzQmVlblNhdmVkKSB7DQotICAgICAgICAgICAgICAgIGhhc0JlZW5VcGRhdGVkU2luY2VTYXZpbmcgPSB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXN1bHRzID0gd3NkbERlZmluaXRpb24uY3JlYXRlVHlwZXMoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGRvbmVVc2luZ1dyYXBwZWREZWZpbml0aW9uKCk7DQotICAgICAgICByZXR1cm4gcmVzdWx0czsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRFeHRlbnNpb25SZWdpc3RyeShFeHRlbnNpb25SZWdpc3RyeSBleHRSZWcpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuc2V0RXh0ZW5zaW9uUmVnaXN0cnkoIiArIGV4dFJlZyArICIpIik7DQotICAgICAgICB9DQotDQotICAgICAgICBnZXRXcmFwcGVkRGVmaW5pdGlvbkZvclVzZSgpOw0KLQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICBpZiAoaGFzQmVlblNhdmVkKSB7DQotICAgICAgICAgICAgICAgIGhhc0JlZW5VcGRhdGVkU2luY2VTYXZpbmcgPSB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB3c2RsRGVmaW5pdGlvbi5zZXRFeHRlbnNpb25SZWdpc3RyeShleHRSZWcpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZG9uZVVzaW5nV3JhcHBlZERlZmluaXRpb24oKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgRXh0ZW5zaW9uUmVnaXN0cnkgZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGdldFdyYXBwZWREZWZpbml0aW9uRm9yVXNlKCk7DQotDQotICAgICAgICBFeHRlbnNpb25SZWdpc3RyeSByZXN1bHRzID0gbnVsbDsNCi0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgcmVzdWx0cyA9IHdzZGxEZWZpbml0aW9uLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7DQotICAgICAgICB9DQotICAgICAgICBkb25lVXNpbmdXcmFwcGVkRGVmaW5pdGlvbigpOw0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCi0gICAgICAgIGdldFdyYXBwZWREZWZpbml0aW9uRm9yVXNlKCk7DQotICAgICAgICBTdHJpbmcgcmVzdWx0cyA9ICIiOw0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICByZXN1bHRzID0gd3NkbERlZmluaXRpb24udG9TdHJpbmcoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGRvbmVVc2luZ1dyYXBwZWREZWZpbml0aW9uKCk7DQotICAgICAgICByZXR1cm4gcmVzdWx0czsNCi0gICAgfQ0KLQ0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0gICAgLy8gb3RoZXIgQWJzdHJhY3RXU0RMRWxlbWVudCBtZXRob2RzDQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQ0KLSAgICBwdWJsaWMgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgcmVtb3ZlRXh0ZW5zaWJpbGl0eUVsZW1lbnQoRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZXh0RWxlbWVudCkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5yZW1vdmVFeHRlbnNpYmlsaXR5RWxlbWVudCgiICsgZXh0RWxlbWVudCArICIpIik7DQotICAgICAgICB9DQotDQotICAgICAgICBnZXRXcmFwcGVkRGVmaW5pdGlvbkZvclVzZSgpOw0KLQ0KLSAgICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgcmVzdWx0cyA9IG51bGw7DQotDQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIGlmIChoYXNCZWVuU2F2ZWQpIHsNCi0gICAgICAgICAgICAgICAgaGFzQmVlblVwZGF0ZWRTaW5jZVNhdmluZyA9IHRydWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJlc3VsdHMgPSB3c2RsRGVmaW5pdGlvbi5yZW1vdmVFeHRlbnNpYmlsaXR5RWxlbWVudChleHRFbGVtZW50KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGRvbmVVc2luZ1dyYXBwZWREZWZpbml0aW9uKCk7DQotICAgICAgICByZXR1cm4gcmVzdWx0czsNCi0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgamF2YS5sYW5nLk9iamVjdCBnZXRFeHRlbnNpb25BdHRyaWJ1dGUoUU5hbWUgbmFtZSkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5nZXRFeHRlbnNpb25BdHRyaWJ1dGUoIiArIG5hbWUgKyAiKSIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZ2V0V3JhcHBlZERlZmluaXRpb25Gb3JVc2UoKTsNCi0NCi0gICAgICAgIGphdmEubGFuZy5PYmplY3QgcmVzdWx0cyA9IG51bGw7DQotDQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJlc3VsdHMgPSB3c2RsRGVmaW5pdGlvbi5nZXRFeHRlbnNpb25BdHRyaWJ1dGUobmFtZSk7DQotICAgICAgICB9DQotICAgICAgICBkb25lVXNpbmdXcmFwcGVkRGVmaW5pdGlvbigpOw0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE1hcCBnZXRFeHRlbnNpb25BdHRyaWJ1dGVzKCkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5nZXRFeHRlbnNpb25BdHRyaWJ1dGVzKCkiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGdldFdyYXBwZWREZWZpbml0aW9uRm9yVXNlKCk7DQotDQotICAgICAgICBNYXAgcmVzdWx0cyA9IG51bGw7DQotDQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJlc3VsdHMgPSB3c2RsRGVmaW5pdGlvbi5nZXRFeHRlbnNpb25BdHRyaWJ1dGVzKCk7DQotICAgICAgICB9DQotICAgICAgICBkb25lVXNpbmdXcmFwcGVkRGVmaW5pdGlvbigpOw0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RXh0ZW5zaW9uQXR0cmlidXRlKFFOYW1lIG5hbWUsIGphdmEubGFuZy5PYmplY3QgdmFsdWUpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuc2V0RXh0ZW5zaW9uQXR0cmlidXRlKCIgKyBuYW1lICsgIiwgICIgKyB2YWx1ZSArICIpIik7DQotICAgICAgICB9DQotDQotICAgICAgICBnZXRXcmFwcGVkRGVmaW5pdGlvbkZvclVzZSgpOw0KLQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICBpZiAoaGFzQmVlblNhdmVkKSB7DQotICAgICAgICAgICAgICAgIGhhc0JlZW5VcGRhdGVkU2luY2VTYXZpbmcgPSB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB3c2RsRGVmaW5pdGlvbi5zZXRFeHRlbnNpb25BdHRyaWJ1dGUobmFtZSwgdmFsdWUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZG9uZVVzaW5nV3JhcHBlZERlZmluaXRpb24oKTsNCi0gICAgfQ0KLQ0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0gICAgLy8gcHJpdmF0ZSB1dGlsaXR5IG1ldGhvZHMNCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotDQotDQotICAgIC8qKg0KLSAgICAgKiBUaGlzIGlzIGFuIGludGVybmFsIHV0aWxpdHkgdG8gZW5zdXJlIHRoYXQgdGhlDQotICAgICAqIFdTREwgZGVmaW5pdGlvbiBiZWluZyB3cmFwcGVkIGlzIGF2YWlsYWJsZSBmb3IgDQotICAgICAqIHVzZS4gIA0KLSAgICAgKiA8UD4NCi0gICAgICogRm9yIGV4YW1wbGUsIGlmIHRoZSBXU0RMNEogV1NETCBkZWZpbml0aW9uIG9iamVjdA0KLSAgICAgKiBoYWQgYmVlbiBzYXZlZCwgdGhpcyB3aWxsIHJlbG9hZCBpdC4NCi0gICAgICovDQotICAgIHByaXZhdGUgdm9pZCBnZXRXcmFwcGVkRGVmaW5pdGlvbkZvclVzZSgpIHsNCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiA9PSBudWxsKSB7DQotICAgICAgICAgICAgbG9hZFJlc291cmNlcygpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICBhY2Nlc3NDb3VudC5pbmNyZW1lbnRBbmRHZXQoKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLQ0KLSAgICAvKioNCi0gICAgICogVGhpcyBpcyBhbiBpbnRlcm5hbCB1dGlsaXR5IHRvIGluZGljYXRlIHRoYXQgdGhlDQotICAgICAqIHVzZSBvZiBXU0RMIGRlZmluaXRpb24gaGFzIGNvbXBsZXRlZC4gDQotICAgICAqLw0KLSAgICBwcml2YXRlIHZvaWQgZG9uZVVzaW5nV3JhcHBlZERlZmluaXRpb24oKSB7DQotDQotICAgICAgICBsb25nIGFzc2Vzc29ycyA9IGFjY2Vzc0NvdW50LmRlY3JlbWVudEFuZEdldCgpOw0KLQ0KLSAgICAgICAgaWYgKGFzc2Vzc29ycyA9PSAwKSB7DQotICAgICAgICAgICAgcmVsZWFzZVJlc291cmNlcygpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotDQotICAgIC8qDQotICAgICAqIFJlZHVjZXMgbWVtb3J5IGZvb3RwcmludCBvZiB0aGUgaW4tbWVtb3J5IGNhY2hpbmcgb2YgdGhlIFdTREwgZGVmaW5pdGlvbg0KLSAgICAgKiBiYXNlZCBvbiB0aGUgY29uZmlndXJhdGlvbiBzZXR0aW5ncw0KLSAgICAgKg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgcmVsZWFzZVJlc291cmNlcygpIHsNCi0NCi0gICAgICAgIGJvb2xlYW4gc2F2ZWQgPSBzYXZlKCk7DQotDQotICAgICAgICBpZiAoc2F2ZWQpIHsNCi0gICAgICAgICAgICAvLyByZWxlYXNlIHRoZSBpbi1tZW1vcnkgY29weSBvZiB0aGUgV1NETDRKIA0KLSAgICAgICAgICAgIHdzZGxEZWZpbml0aW9uID0gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiBMb2FkcyB0aGUgdGhlIFdTREwgZGVmaW5pdGlvbiBiYWNrIGludG8gbWVtb3J5DQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBsb2FkUmVzb3VyY2VzKCkgew0KLQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uID09IG51bGwpIHsNCi0gICAgICAgICAgICB3c2RsRGVmaW5pdGlvbiA9IHJlc3RvcmUoKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLQ0KLSAgICAvKioNCi0gICAgICogU2F2ZXMgdGhlIGN1cnJlbnQgV1NETCBkZWZpbml0aW9uIG9iamVjdCB0aGF0IHRoaXMgd3JhcHBlciBjb250YWlucy4NCi0gICAgICogVGhpcyBtZXRob2QgaGFzIGEgbnVtYmVyIG9mIGNoZWNrcyB0byBkZXRlcm1pbmUgaG93IHRvIHByb2NlZWQgd2l0aA0KLSAgICAgKiB0aGUgc2F2aW5nIG9mIHRoZSBXU0RMIGRlZmluaXRpb24gb2JqZWN0LCBzbyB0aGUgY2FsbGVyIHNob3VsZCBub3QNCi0gICAgICogbmVlZCB0byBtYWtlIGNoZWNrcyBvbiB3aGV0aGVyIHRvIHNhdmUgb3Igbm90Lg0KLSAgICAgKiA8UD4NCi0gICAgICogVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgaGFuZGxpbmcgdGhlIHdyYXBwZWQgV1NETA0KLSAgICAgKiBkZWZpbml0aW9uIG9iamVjdCwgZm9yIGV4YW1wbGUsIGRlY2lkaW5nIHdoZW4gdG8gcmVsZWFzZQ0KLSAgICAgKiBpdCBvciByZWxvYWQgaXQuDQotICAgICAqIA0KLSAgICAgKiBAcmV0dXJuIFRydWUgLSBpZiB0aGUgc2F2ZSBzdWNjZWVkZWQNCi0gICAgICogICAgICAgICBGYWxzZSAtIGlmIHRoZSBzYXZlIGZhaWxlZA0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBib29sZWFuIHNhdmUoKSB7DQotDQotICAgICAgICAvLyBpZiB0aGUgd3NkbCBkZWZpbml0b24gZmFpbGVkIHRvIHNlcmlhbGl6ZSBmcm9tIGEgcHJldmlvdXMgYXR0ZW1wdA0KLSAgICAgICAgLy8gdG8gc2F2ZSBpdCwgdGhlbiBkb24ndCB0cnkgdG8gc2F2ZSBpdA0KLSAgICAgICAgaWYgKHNhZmVUb1NlcmlhbGl6ZSA9PSBmYWxzZSkgew0KLSAgICAgICAgICAgIC8vIGV4aXQgcXVpY2tseQ0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vIGF0IHRoaXMgcG9pbnQsIHdlIHRoaW5rIGl0IGlzIHNhZmUgdG8gcHJvY2VlZCB3aXRoIHNhdmluZyB0aGUgDQotICAgICAgICAvLyB3c2RsIGRlZmluaXRpb24NCi0NCi0gICAgICAgIC8vIG1ha2Ugc3VyZSB0aGVyZSBpcyBhIGZpbGUgdG8gdXNlIGZvciBzYXZpbmcgdGhlIHdzZGwgZGVmaW5pdGlvbg0KLSAgICAgICAgaWYgKHNhdmVkRGVmaW5pdGlvbkZpbGUgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgIHNhdmVkRGVmaW5pdGlvbkZpbGUgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJ3c2RsRGVmXyIsIG51bGwpOw0KLSAgICAgICAgICAgICAgICBzYXZlZEZpbGVuYW1lID0gc2F2ZWREZWZpbml0aW9uRmlsZS5nZXROYW1lKCk7DQotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuc2F2ZSgpOiB0ZW1wIGZpbGUgPSBbIiArIHNhdmVkRmlsZW5hbWUgKyAiXSIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7DQotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuc2F2ZSgpOiBlcnJvciBjcmVhdGluZyB0ZW1wIGZpbGUgPSBbIiArIGV4LmdldE1lc3NhZ2UoKSArICJdIik7DQotICAgICAgICAgICAgICAgIHNhdmVkRGVmaW5pdGlvbkZpbGUgPSBudWxsOw0KLSAgICAgICAgICAgICAgICBzYXZlZEZpbGVuYW1lID0gbnVsbDsNCi0NCi0gICAgICAgICAgICAgICAgLy8gY2FuJ3Qgc2F2ZSB0aGUgd3NkbCBkZWZpbml0aW9uIGF0IHRoaXMgdGltZQ0KLSAgICAgICAgICAgICAgICAvLyBtaWdodCBiZSBhYmxlIHRvIGRvIHNvIGxhdGVyDQotICAgICAgICAgICAgICAgIGhhc0JlZW5TYXZlZCA9IGZhbHNlOw0KLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKHNhdmVkRGVmaW5pdGlvbkZpbGUgIT0gbnVsbCkgew0KLQ0KLSAgICAgICAgICAgIC8vIHRoZSBGaWxlIG9iamVjdCBleGlzdHMsIGNoZWNrIHRvIHNlZSBpZiB0aGUgd3NkbCBkZWZpbml0aW9uIGhhcw0KLSAgICAgICAgICAgIC8vIGJlZW4gcHJldmlvdXNseSBzYXZlZA0KLQ0KLSAgICAgICAgICAgIGlmIChoYXNCZWVuU2F2ZWQgJiYgIWhhc0JlZW5VcGRhdGVkU2luY2VTYXZpbmcpIHsNCi0gICAgICAgICAgICAgICAgLy8gbm8gbmVlZCB0byBzYXZlIGJlY2F1c2Ugd2Ugc2F2ZWQgaXQgYWxyZWFkeQ0KLSAgICAgICAgICAgICAgICAvLyBhbmQgdGhlcmUgd2VyZSBubyB1cGRhdGVzIHRvIHRoZSB3c2RsIGRlZmluaXRpb24gb2JqZWN0DQotICAgICAgICAgICAgICAgIC8vIHNpbmNlIHRoZSBwcmV2aW91cyBzYXZlDQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0NCi0NCi0gICAgICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0gICAgICAgICAgICAvLyBzYXZlIHRvIHRoZSBmaWxlDQotICAgICAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotICAgICAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBvdXRTdHJlYW0gPSBudWxsOw0KLSAgICAgICAgICAgIE9iamVjdE91dHB1dFN0cmVhbSBvdXRPYmpTdHJlYW0gPSBudWxsOw0KLQ0KLSAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgIC8vIHNldHVwIGFuIG91dHB1dCBzdHJlYW0gdG8gYSBwaHlzaWNhbCBmaWxlDQotICAgICAgICAgICAgICAgIG91dFN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHNhdmVkRGVmaW5pdGlvbkZpbGUpOw0KLQ0KLSAgICAgICAgICAgICAgICAvLyBhdHRhY2ggYSBzdHJlYW0gY2FwYWJsZSBvZiB3cml0aW5nIG9iamVjdHMgdG8gdGhlIA0KLSAgICAgICAgICAgICAgICAvLyBzdHJlYW0gY29ubmVjdGVkIHRvIHRoZSBmaWxlDQotICAgICAgICAgICAgICAgIG91dE9ialN0cmVhbSA9IG5ldyBPYmplY3RPdXRwdXRTdHJlYW0ob3V0U3RyZWFtKTsNCi0NCi0gICAgICAgICAgICAgICAgLy8gdHJ5IHRvIHNhdmUgdGhlIHdzZGwgb2JqZWN0DQotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuc2F2ZSgpOiBzYXZpbmcgdGhlIHdzZGwgZGVmaW5pdGlvbi4uLi4uIik7DQotICAgICAgICAgICAgICAgIG91dE9ialN0cmVhbS53cml0ZU9iamVjdCh3c2RsRGVmaW5pdGlvbik7DQotDQotICAgICAgICAgICAgICAgIC8vIGNsb3NlIG91dCB0aGUgc3RyZWFtcw0KLSAgICAgICAgICAgICAgICBvdXRPYmpTdHJlYW0uZmx1c2goKTsNCi0gICAgICAgICAgICAgICAgb3V0T2JqU3RyZWFtLmNsb3NlKCk7DQotICAgICAgICAgICAgICAgIG91dFN0cmVhbS5mbHVzaCgpOw0KLSAgICAgICAgICAgICAgICBvdXRTdHJlYW0uY2xvc2UoKTsNCi0NCi0gICAgICAgICAgICAgICAgaGFzQmVlblNhdmVkID0gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgaGFzQmVlblVwZGF0ZWRTaW5jZVNhdmluZyA9IGZhbHNlOw0KLQ0KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLnNhdmUoKTogLi4uLnNhdmVkIHRoZSB3c2RsIGRlZmluaXRpb24uLi4uLiIpOw0KLQ0KLSAgICAgICAgICAgICAgICBsb25nIGZpbGVzaXplID0gc2F2ZWREZWZpbml0aW9uRmlsZS5sZW5ndGgoKTsNCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5zYXZlKCk6IGZpbGUgc2l6ZSBhZnRlciBzYXZlIFsiICsgZmlsZXNpemUgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICJdICAgdGVtcCBmaWxlID0gWyIgKyBzYXZlZEZpbGVuYW1lICsgIl0iKTsNCi0NCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5zYXZlKCk6IGVuZCAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIik7DQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4Mikgew0KLSAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgLy8gZGlzYWJsZSBmdXR1cmUgdHJpZXMgYXQgc2F2aW5nIHRoaXMgV1NETCBkZWZpbml0aW9uIG9iamVjdA0KLSAgICAgICAgICAgICAgICBzYWZlVG9TZXJpYWxpemUgPSBmYWxzZTsNCi0NCi0gICAgICAgICAgICAgICAgLy8gaW5kaWNhdGUgdGhhdCB0aGUgZmlsZSBjYW5ub3QgYmUgdXNlZCB0byByZXN0b3JlIGZyb20NCi0gICAgICAgICAgICAgICAgaGFzQmVlblNhdmVkID0gZmFsc2U7DQotDQotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuc2F2ZSgpOiBlcnJvciB3aXRoIHNhdmluZyB0aGUgd3NkbCBkZWZpbml0aW9uID0gWyIgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGV4Mi5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgOiAiICsgZXgyLmdldE1lc3NhZ2UoKSArICJdIiwgZXgyKTsNCi0NCi0NCi0gICAgICAgICAgICAgICAgaWYgKHNhdmVkRGVmaW5pdGlvbkZpbGUgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBzYXZlZERlZmluaXRpb25GaWxlLmRlbGV0ZSgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVkRGVmaW5pdGlvbkZpbGUgPSBudWxsOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVkRmlsZW5hbWUgPSBudWxsOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgLy8ganVzdCBhYnNvcmIgaXQNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBpZiAob3V0T2JqU3RyZWFtICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgb3V0T2JqU3RyZWFtLmNsb3NlKCk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBqdXN0IGFic29yYiBpdA0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIGlmIChvdXRTdHJlYW0gIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBvdXRTdHJlYW0uY2xvc2UoKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGp1c3QgYWJzb3JiIGl0DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5zYXZlKCk6IGVycm9yIGV4aXQgLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSIpOw0KLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBSZXN0b3JlcyB0aGUgV1NETCBkZWZpbml0aW9uIGZyb20gYSBwcmV2aW91c2x5IHNhdmVkIGNvcHkuDQotICAgICAqIDxQPg0KLSAgICAgKiBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBoYW5kbGluZyB0aGUgd3JhcHBlZCBXU0RMDQotICAgICAqIGRlZmluaXRpb24gb2JqZWN0LCBmb3IgZXhhbXBsZSwgZGVjaWRpbmcgd2hlbiB0byByZWxlYXNlDQotICAgICAqIGl0IG9yIHJlbG9hZCBpdC4NCi0gICAgICogDQotICAgICAqIEByZXR1cm4gVGhlIHJlc3RvcmVkIFdTREwgZGVmaW5pdGlvbiBvYmplY3QsIG9yIE5VTEwNCi0gICAgICovDQotICAgIHByaXZhdGUgRGVmaW5pdGlvbiByZXN0b3JlKCkgew0KLQ0KLSAgICAgICAgaWYgKCFoYXNCZWVuU2F2ZWQpIHsNCi0gICAgICAgICAgICAvLyB0aGUgd3NkbCBkZWZpbnRpb24gaGFzIG5vdCBiZWVuIHNhdmVkLCBvciB0aGUgcHJldmlvdXMgc2F2ZWQgdmVyc2lvbg0KLSAgICAgICAgICAgIC8vIHNob3VsZCBub3QgYmUgdXNlZCBmb3Igc29tZSByZWFzb24NCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChzYXZlZERlZmluaXRpb25GaWxlID09IG51bGwpIHsNCi0gICAgICAgICAgICAvLyBubyBmaWxlIHRvIHJlc3RvcmUgZnJvbQ0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotICAgICAgICAvLyByZXN0b3JlIGZyb20gdGhlIHRlbXBvcmFyeSBmaWxlDQotICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0gICAgICAgIERlZmluaXRpb24gcmVzdG9yZWREZWZpbml0aW9uID0gbnVsbDsNCi0gICAgICAgIEZpbGVJbnB1dFN0cmVhbSBpblN0cmVhbSA9IG51bGw7DQotICAgICAgICBPYmplY3RJbnB1dFN0cmVhbSBpbk9ialN0cmVhbSA9IG51bGw7DQotDQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIC8vIHNldHVwIGFuIGlucHV0IHN0cmVhbSB0byB0aGUgZmlsZQ0KLSAgICAgICAgICAgIGluU3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShzYXZlZERlZmluaXRpb25GaWxlKTsNCi0NCi0gICAgICAgICAgICAvLyBhdHRhY2ggYSBzdHJlYW0gY2FwYWJsZSBvZiByZWFkaW5nIG9iamVjdHMgZnJvbSB0aGUgDQotICAgICAgICAgICAgLy8gc3RyZWFtIGNvbm5lY3RlZCB0byB0aGUgZmlsZQ0KLSAgICAgICAgICAgIGluT2JqU3RyZWFtID0gbmV3IE9iamVjdElucHV0U3RyZWFtKGluU3RyZWFtKTsNCi0NCi0gICAgICAgICAgICAvLyB0cnkgdG8gcmVzdG9yZSB0aGUgd3JhcHBlZCB3c2RsIGRlZmluaXRpb24NCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLnJlc3RvcmUoKTogcmVzdG9yaW5nIHRoZSBXU0RMIGRlZmluaXRpb24gLi4uLi4iKTsNCi0NCi0gICAgICAgICAgICByZXN0b3JlZERlZmluaXRpb24gPSAoRGVmaW5pdGlvbikgaW5PYmpTdHJlYW0ucmVhZE9iamVjdCgpOw0KLSAgICAgICAgICAgIGluT2JqU3RyZWFtLmNsb3NlKCk7DQotICAgICAgICAgICAgaW5TdHJlYW0uY2xvc2UoKTsNCi0NCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLnJlc3RvcmUoKTogLi4uLnJlc3RvcmVkIHRoZSBXU0RMIGRlZmluaXRpb24gLi4uLi4iKTsNCi0NCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgyKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5yZXN0b3JlKCk6IGVycm9yIHdpdGggcmVzdG9yaW5nIHRoZSBXU0RMIGRlZmluaXRpb24gPSBbIiArDQotICAgICAgICAgICAgICAgICAgICBleDIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIDogIiArIGV4Mi5nZXRNZXNzYWdlKCkgKyAiXSIsIGV4Mik7DQotDQotICAgICAgICAgICAgaWYgKGluT2JqU3RyZWFtICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICAgICAgICAgIGluT2JqU3RyZWFtLmNsb3NlKCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgICAgICAgICAvLyBqdXN0IGFic29yYiBpdA0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGlmIChpblN0cmVhbSAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgICAgICBpblN0cmVhbS5jbG9zZSgpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgICAgICAgICAgLy8ganVzdCBhYnNvcmIgaXQNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0NCi0gICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIucmVzdG9yZSgpOiBlbmQgLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSIpOw0KLSAgICAgICAgcmV0dXJuIHJlc3RvcmVkRGVmaW5pdGlvbjsNCi0NCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvT3V0SGFuZGxlclRlc3QueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL091dEhhbmRsZXJUZXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I2NmQ2My4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvT3V0SGFuZGxlclRlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08c29hcGVudjpFbnZlbG9wZSB4bWxuczpzb2FwZW52PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyI+Ci0gICAgPHNvYXBlbnY6SGVhZGVyIHhtbG5zOndzYT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOC9hZGRyZXNzaW5nIiB4bWxuczpteVJlZj0iaHR0cDovL3JlZmVyZW5jZS5vcmciPgotICAgICAgICA8d3NhOkZyb20+Ci0gICAgICAgICAgICA8d3NhOkFkZHJlc3M+aHR0cDovL3d3dy5mcm9tLm9yZy9zZXJ2aWNlLzwvd3NhOkFkZHJlc3M+Ci0gICAgICAgICAgICA8d3NhOlJlZmVyZW5jZVBhcmFtZXRlcnM+Ci0gICAgICAgICAgICAgICAgPFJlZmVyZW5jZTI+VmFsdWUgMjAwPC9SZWZlcmVuY2UyPgotICAgICAgICAgICAgPC93c2E6UmVmZXJlbmNlUGFyYW1ldGVycz4KLSAgICAgICAgPC93c2E6RnJvbT4KLSAgICAgICAgPHdzYTpUbz5odHRwOi8vd3d3LnRvLm9yZy9zZXJ2aWNlLzwvd3NhOlRvPgotICAgICAgICA8d3NhOk1lc3NhZ2VJRD4xMjM0NTYtNzg5MDwvd3NhOk1lc3NhZ2VJRD4KLSAgICAgICAgPG15UmVmOlJlZmVyZW5jZTQ+VmFsdWUgNDAwPC9teVJlZjpSZWZlcmVuY2U0PgotICAgICAgICA8bXlSZWY6UmVmZXJlbmNlMz5WYWx1ZSAzMDA8L215UmVmOlJlZmVyZW5jZTM+Ci0gICAgICAgIDx3c2E6U2VydmljZU5hbWUgd3NhOlBvcnROYW1lPSJwb3J0Ij5zZXJ2aWNlTlM6U2VydmljZTwvd3NhOlNlcnZpY2VOYW1lPgotICAgICAgICA8d3NhOlBvcnRUeXBlPnBvcnROUzpQb3J0PC93c2E6UG9ydFR5cGU+Ci0gICAgICAgIDx3c2E6QWN0aW9uPmh0dHA6Ly93d3cuYWN0aW9ucy5vcmcvYWN0aW9uPC93c2E6QWN0aW9uPgotICAgICAgICA8d3NhOlJlcGx5VG8+Ci0gICAgICAgICAgICA8d3NhOkFkZHJlc3M+aHR0cDovL3d3dy5yZXBseVRvLm9yZy9zZXJ2aWNlLzwvd3NhOkFkZHJlc3M+Ci0gICAgICAgIDwvd3NhOlJlcGx5VG8+Ci0gICAgICAgIDx3c2E6UmVsYXRlc1RvIHdzYTpSZWxhdGlvbnNoaXBUeXBlPSJUZXN0UmVsYXRpb24iPmh0dHA6Ly93d3cucmVsYXRlc1RvLm9yZy9zZXJ2aWNlLzwvd3NhOlJlbGF0ZXNUbz4KLSAgICA8L3NvYXBlbnY6SGVhZGVyPgotICAgIDxzb2FwZW52OkJvZHk+PC9zb2FwZW52OkJvZHk+Ci08L3NvYXBlbnY6RW52ZWxvcGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL1BpbmdTZXJ2aWNlLndzZGwgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvUGluZ1NlcnZpY2Uud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk2NmJmMS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvUGluZ1NlcnZpY2Uud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPCEtLSBXU0RMIGRlc2NyaXB0aW9uIG9mIHRoZSBXU1MgUGluZyBpbnRlcm9wIHNjZW5hcmlvcyAtLT4KLQotPGRlZmluaXRpb25zIG5hbWU9IlBpbmciCi0gICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8veG1sc29hcC5vcmcvUGluZyIKLSAgICB4bWxuczp0bnM9Imh0dHA6Ly94bWxzb2FwLm9yZy9QaW5nIgotICAgIHhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIKLSAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iPgotICA8dHlwZXM+Ci0gICAgPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly94bWxzb2FwLm9yZy9QaW5nIgotICAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4KLSAgICAgIDxjb21wbGV4VHlwZSBuYW1lPSJwaW5nIj4KLSAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgIDxlbGVtZW50IG5hbWU9InRleHQiIHR5cGU9InhzZDpzdHJpbmciIG5pbGxhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9InBpbmdSZXNwb25zZSI+Ci0gICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ0ZXh0IiB0eXBlPSJ4c2Q6c3RyaW5nIiBuaWxsYWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICAgIDxlbGVtZW50IG5hbWU9IlBpbmciIHR5cGU9InRuczpwaW5nIi8+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJQaW5nUmVzcG9uc2UiIHR5cGU9InRuczpwaW5nUmVzcG9uc2UiLz4KLSAgICA8L3NjaGVtYT4KLSAgPC90eXBlcz4KLQotICA8bWVzc2FnZSBuYW1lPSJQaW5nUmVxdWVzdCI+Ci0gICAgPHBhcnQgbmFtZT0icGluZyIgZWxlbWVudD0idG5zOlBpbmciLz4KLSAgPC9tZXNzYWdlPgotCi0gIDxtZXNzYWdlIG5hbWU9IlBpbmdSZXNwb25zZSI+Ci0gICAgPHBhcnQgbmFtZT0icGluZ1Jlc3BvbnNlIiBlbGVtZW50PSJ0bnM6UGluZ1Jlc3BvbnNlIi8+Ci0gIDwvbWVzc2FnZT4KLQotICA8cG9ydFR5cGUgbmFtZT0iUGluZ1BvcnQiPgotICAgIDxvcGVyYXRpb24gbmFtZT0iUGluZyI+Ci0gICAgICA8aW5wdXQgIG1lc3NhZ2U9InRuczpQaW5nUmVxdWVzdCIvPgotICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6UGluZ1Jlc3BvbnNlIi8+Ci0gICAgPC9vcGVyYXRpb24+Ci0gIDwvcG9ydFR5cGU+Ci0KLSAgPGJpbmRpbmcgbmFtZT0iUGluZ0JpbmRpbmciIHR5cGU9InRuczpQaW5nUG9ydCI+Ci0gICAgPHNvYXA6YmluZGluZyB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIKLXN0eWxlPSJkb2N1bWVudCIvPgotICAgIDxvcGVyYXRpb24gbmFtZT0iUGluZyI+Ci0gICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+Ci0gICAgICA8aW5wdXQ+IDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+PC9pbnB1dD4KLSAgICAgIDxvdXRwdXQ+PHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz48L291dHB1dD4KLSAgICA8L29wZXJhdGlvbj4KLSAgIDwvYmluZGluZz4KLQotICA8c2VydmljZSBuYW1lPSJQaW5nU2VydmljZSI+Ci0gICAgPHBvcnQgbmFtZT0iUGluZ1BvcnQiIGJpbmRpbmc9InRuczpQaW5nQmluZGluZyI+Ci0gICAgPHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo4MDgwL2F4aXMyL3NlcnZpY2VzL1BpbmdTZXJ2aWNlIi8+Ci0gICAgPC9wb3J0PgotICA8L3NlcnZpY2U+Ci0KLTwvZGVmaW5pdGlvbnM+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9BeGlzTWVzc2FnZVRlc3RSZXBvL2F4aXMyLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L0F4aXNNZXNzYWdlVGVzdFJlcG8vYXhpczIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmJmOTBkLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L0F4aXNNZXNzYWdlVGVzdFJlcG8vYXhpczIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGF4aXNjb25maWcgbmFtZT0iQXhpc0phdmEyLjAiPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIFBhcmFtZXRlcnMgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iaG90ZGVwbG95bWVudCI+dHJ1ZTwvcGFyYW1ldGVyPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iaG90dXBkYXRlIj5mYWxzZTwvcGFyYW1ldGVyPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iZW5hYmxlTVRPTSI+dHJ1ZTwvcGFyYW1ldGVyPgotCi0gICAgPHBhcmFtZXRlciBuYW1lPSJ1c2VyTmFtZSI+YWRtaW48L3BhcmFtZXRlcj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9InBhc3N3b3JkIj5heGlzMjwvcGFyYW1ldGVyPgotCi0gICAgPHBhcmFtZXRlciBuYW1lPSJzZXJhbGl6ZUxvY2F0aW9uIj4uPC9wYXJhbWV0ZXI+Ci0gICAgPGhvc3RDb25maWd1cmF0aW9uPgotICAgICAgICA8aXA+MTI3LjAuMC4xPC9pcD4KLSAgICAgICAgPHBvcnQ+NTU1NTwvcG9ydD4KLSAgICA8L2hvc3RDb25maWd1cmF0aW9uPgotCi0gICAgPCEtLSBUaGlzIGlzIHRoZSBEZWFmdWx0IE1lc3NhZ2UgUmVjZWl2ZXIgZm9yIHRoZSBSZXF1ZXN0IFJlc3BvbnNlIHN0eWxlIE9wZXJhdGlvbnMgLS0+Ci0gICAgPG1lc3NhZ2VSZWNlaXZlciBtZXA9IklOT1VUIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuUmF3WE1MSU5PdXRNZXNzYWdlUmVjZWl2ZXIiLz4KLQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIFRyYW5zcG9ydCBJbnMgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi0KLQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIFRyYW5zcG9ydCBPdXRzIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotCi0gICAgPHBoYXNlT3JkZXIgdHlwZT0iSW5GbG93Ij4KLSAgICAgICAgPCEtLSAgU3lzdGVtIHByZSBkZWZpbmVkIHBoYXNlcyAgICAgICAtLT4KLSAgICAgICAgIDxwaGFzZSBuYW1lPSJUcmFuc3BvcnQiPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiLz4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIi8+Ci0gICAgICAgIDwvcGhhc2U+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJTZWN1cml0eSIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iUHJlRGlzcGF0Y2giLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9IkRpc3BhdGNoIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuRGlzcGF0Y2hQaGFzZSI+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJBZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciIvPgotCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiLz4KLSAgICAgICAgPC9waGFzZT4KLSAgICAgICAgPCEtLSAgU3lzdGVtIHByZSBkZWZpbmVkIHBoYXNlcyAgICAgICAtLT4KLSAgICAgICAgPCEtLSAgIEFmdGVyIFBvc3RkaXNwYXRjaCBwaGFzZSBtb2R1bGUgYXV0aG9yIG9yIG9yIHNlcnZpY2UgYXV0aG9yIGNhbiBhZGQgYW55IHBoYXNlIGhlIHdhbnQgICAgICAtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik9wZXJhdGlvbkluUGhhc2UiLz4KLSAgICA8L3BoYXNlT3JkZXI+Ci0gICAgPHBoYXNlT3JkZXIgdHlwZT0iT3V0RmxvdyI+Ci0gICAgICAgIDwhLS0gICAgICB1c2VyIGNhbiBhZGQgaGlzIG93biBwaGFzZXMgdG8gdGhpcyBhcmVhICAtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik9wZXJhdGlvbk91dFBoYXNlIi8+Ci0gICAgICAgIDwhLS1zeXN0ZW0gcHJlZGVmaW5lZCBwaGFzZS0tPgotICAgICAgICA8IS0tdGhlc2UgcGhhc2Ugd2lsbCBydW4gaXJyZXNwZWN0aXZlIG9mIHRoZSBzZXJ2aWNlLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJQb2xpY3lEZXRlcm1pbmF0aW9uIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJNZXNzYWdlT3V0Ii8+Ci0gICAgPC9waGFzZU9yZGVyPgotICAgIDxwaGFzZU9yZGVyIHR5cGU9IkluRmF1bHRGbG93Ij4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlByZURpc3BhdGNoIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJEaXNwYXRjaCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkRpc3BhdGNoUGhhc2UiPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiLz4KLQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiLz4KLQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiLz4KLQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIi8+Ci0gICAgICAgIDwvcGhhc2U+Ci0gICAgICAgIDwhLS0gICAgICB1c2VyIGNhbiBhZGQgaGlzIG93biBwaGFzZXMgdG8gdGhpcyBhcmVhICAtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik9wZXJhdGlvbkluRmF1bHRQaGFzZSIvPgotICAgIDwvcGhhc2VPcmRlcj4KLSAgICA8cGhhc2VPcmRlciB0eXBlPSJPdXRGYXVsdEZsb3ciPgotICAgICAgICA8IS0tICAgICAgdXNlciBjYW4gYWRkIGhpcyBvd24gcGhhc2VzIHRvIHRoaXMgYXJlYSAgLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJPcGVyYXRpb25PdXRGYXVsdFBoYXNlIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJQb2xpY3lEZXRlcm1pbmF0aW9uIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJNZXNzYWdlT3V0Ii8+Ci0gICAgPC9waGFzZU9yZGVyPgotPC9heGlzY29uZmlnPgotCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9BeGlzTWVzc2FnZVRlc3RSZXBvL21vZHVsZXMvbW9kdWxlMS9NRVRBLUlORi9tb2R1bGUueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvQXhpc01lc3NhZ2VUZXN0UmVwby9tb2R1bGVzL21vZHVsZTEvTUVUQS1JTkYvbW9kdWxlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY2Y2ZmZC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9BeGlzTWVzc2FnZVRlc3RSZXBvL21vZHVsZXMvbW9kdWxlMS9NRVRBLUlORi9tb2R1bGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotPG1vZHVsZSBuYW1lPSJtb2R1bGUxIj4KLSAgICA8SW5GbG93PgotICAgICAgICA8aGFuZGxlciBuYW1lPSJoMSIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIucmVnaXN0cnkuSGFuZGxlcjMiPgotICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJPcGVyYXRpb25JblBoYXNlIi8+Ci0gICAgICAgIDwvaGFuZGxlcj4KLSAgICAgICAgPGhhbmRsZXIgbmFtZT0iaDIiIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJlZ2lzdHJ5LkhhbmRsZXIzIj4KLSAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iT3BlcmF0aW9uSW5QaGFzZSIvPgotICAgICAgICA8L2hhbmRsZXI+Ci0gICAgPC9JbkZsb3c+Ci0KLSAgICA8T3V0Rmxvdz4KLSAgICAgICAgPGhhbmRsZXIgbmFtZT0iaDMiIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJlZ2lzdHJ5LkhhbmRsZXIzIj4KLSAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iT3BlcmF0aW9uT3V0UGhhc2UiLz4KLSAgICAgICAgPC9oYW5kbGVyPgotICAgIDwvT3V0Rmxvdz4KLQotICAgIDxPdXRGYXVsdEZsb3c+Ci0gICAgICAgIDxoYW5kbGVyIG5hbWU9Img0IiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5yZWdpc3RyeS5IYW5kbGVyMyI+Ci0gICAgICAgICAgICA8b3JkZXIgcGhhc2U9Ik9wZXJhdGlvbk91dEZhdWx0UGhhc2UiLz4KLSAgICAgICAgPC9oYW5kbGVyPgotICAgIDwvT3V0RmF1bHRGbG93PgotCi0gICAgPEluRmF1bHRGbG93PgotICAgICAgICA8aGFuZGxlciBuYW1lPSJoNSIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIucmVnaXN0cnkuSGFuZGxlcjMiPgotICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJPcGVyYXRpb25JbkZhdWx0UGhhc2UiLz4KLSAgICAgICAgPC9oYW5kbGVyPgotICAgIDwvSW5GYXVsdEZsb3c+Ci0KLSAgICA8b3BlcmF0aW9uIG5hbWU9ImNyZWF0U2VxIiBtZXA9Imh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgvd3NkbC9pbi1vdXQiPgotICAgICAgICA8bWVzc2FnZVJlY2VpdmVyIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5SYXdYTUxJTk91dE1lc3NhZ2VSZWNlaXZlciIvPgotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9InBhcmExIiBsb2NrZWQ9InhzZDp0cnVlIj4xMDwvcGFyYW1ldGVyPgotICAgIDwvb3BlcmF0aW9uPgotPC9tb2R1bGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvQXhpc01lc3NhZ2VUZXN0UmVwby9zZXJ2aWNlcy9NZXNzYWdldGVzdFNlcnZpY2UvTUVUQS1JTkYvc2VydmljZXMueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvQXhpc01lc3NhZ2VUZXN0UmVwby9zZXJ2aWNlcy9NZXNzYWdldGVzdFNlcnZpY2UvTUVUQS1JTkYvc2VydmljZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMThhODZjLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L0F4aXNNZXNzYWdlVGVzdFJlcG8vc2VydmljZXMvTWVzc2FnZXRlc3RTZXJ2aWNlL01FVEEtSU5GL3NlcnZpY2VzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLTxzZXJ2aWNlIG5hbWU9IiI+Ci0KLSAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgIFRoaXMgaXMgYSB0ZXN0aW5nIHNlcnZpY2UgLCB0byB0ZXN0IHRoZSBzeXN0ZW0gaXMgd29ya2luZyBvciBub3QKLSAgICA8L2Rlc2NyaXB0aW9uPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iU2VydmljZUNsYXNzIj5vcmcuYXBhY2hlLmF4aXMyLnNhbXBsZS5lY2hvLkVjaG9JbXBsPC9wYXJhbWV0ZXI+Ci0gICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvU3RyaW5nIj4KLSAgICAgICAgPG1vZHVsZSByZWY9Im1vZHVsZTEiLz4KLSAgICAgICAgPG1lc3NhZ2UgbGFiZWw9IkluIj4KLSAgICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0ibWVzc2FnZUlOIj5tZXNzYWdlSU48L3BhcmFtZXRlcj4KLSAgICAgICAgPC9tZXNzYWdlPgotICAgIDwvb3BlcmF0aW9uPgotICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob1N0cmluZ0FycmF5Ij4KLSAgICAgICAgPG1lc3NhZ2UgbGFiZWw9IkluIj4KLSAgICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0ibWVzc2FnZUlOIj5tZXNzYWdlSU48L3BhcmFtZXRlcj4KLSAgICAgICAgPC9tZXNzYWdlPgotICAgICAgICA8bWVzc2FnZSBsYWJlbD0iT3V0Ij4KLSAgICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0ibWVzc2FnZU91dCI+bWVzc2FnZU91dDwvcGFyYW1ldGVyPgotICAgICAgICA8L21lc3NhZ2U+Ci0gICAgPC9vcGVyYXRpb24+Ci08L3NlcnZpY2U+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvQmFkQ29uZmlnT3JkZXJDaGFuZ2UvYXhpczIueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvQmFkQ29uZmlnT3JkZXJDaGFuZ2UvYXhpczIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTRhMjMyLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L0JhZENvbmZpZ09yZGVyQ2hhbmdlL2F4aXMyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGF4aXNjb25maWcgbmFtZT0iQXhpc0phdmEyLjAiPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iaG90ZGVwbG95bWVudCI+dHJ1ZTwvcGFyYW1ldGVyPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iaG90dXBkYXRlIj50cnVlPC9wYXJhbWV0ZXI+Ci0KLSAgICA8bWVzc2FnZVJlY2VpdmVyIG1lcD0iSU5PVVQiIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5SYXdYTUxJTk91dE1lc3NhZ2VSZWNlaXZlciIvPgotCi0gICAgIDx0cmFuc3BvcnRTZW5kZXIgbmFtZT0iaHR0cCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuQ29tbW9uc0hUVFBUcmFuc3BvcnRTZW5kZXIiPgotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9IlBST1RPQ09MIj5IVFRQLzEuMDwvcGFyYW1ldGVyPgotICAgIDwvdHJhbnNwb3J0U2VuZGVyPgotCi0KLSAgICA8cGhhc2VPcmRlciB0eXBlPSJJbkZsb3ciPgotICAgICAgICA8IS0tICBTeXN0ZW0gcHJlIGRlZmluZWQgcGhhc2VzICAgICAgIC0tPgotICAgICAgICAKLSAgICAgICAgPHBoYXNlIG5hbWU9IlBvc3REaXNwYXRjaCIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iVHJhbnNwb3J0SW4iLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlByZURpc3BhdGNoIi8+Ci0gICAgICAgIDwhLS0gIFN5c3RlbSBwcmUgZGVmaW5lZCBwaGFzZXMgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gICBBZnRlciBQb3N0ZGlzcGF0Y2ggcGhhc2UgbW9kdWxlIGF1dGhvciBvciBvciBzZXJ2aWNlIGF1dGhvciBjYW4gYWRkIGFueSBwaGFzZSBoZSB3YW50ICAgICAgLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJ1c2VycGhhc2UxIi8+Ci0gICAgPC9waGFzZU9yZGVyPgotICAgIDxwaGFzZU9yZGVyIHR5cGU9Ik91dEZsb3ciPgotICAgICAgICA8IS0tICAgICAgdXNlciBjYW4gYWRkIGhpcyBvd24gcGhhc2VzIHRvIHRoaXMgYXJlYSAgLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJ1c2VycGhhc2UxIi8+Ci0gICAgPC9waGFzZU9yZGVyPgotICAgIDxwaGFzZU9yZGVyIHR5cGU9IkluRmF1bHRGbG93Ij4KLSAgICAgICAgPCEtLSAgICAgIHVzZXIgY2FuIGFkZCBoaXMgb3duIHBoYXNlcyB0byB0aGlzIGFyZWEgIC0tPgotICAgICAgICA8cGhhc2UgbmFtZT0idXNlcnBoYXNlMSIvPgotICAgIDwvcGhhc2VPcmRlcj4KLSAgICA8cGhhc2VPcmRlciB0eXBlPSJPdXRGYXVsdEZsb3ciPgotICAgICAgICA8IS0tICAgICAgdXNlciBjYW4gYWRkIGhpcyBvd24gcGhhc2VzIHRvIHRoaXMgYXJlYSAgLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJ1c2VycGhhc2UxIi8+Ci0gICAgPC9waGFzZU9yZGVyPgotPC9heGlzY29uZmlnPgotCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9CYWRTZXJ2ZXIueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvQmFkU2VydmVyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg4OWRhZC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9CYWRTZXJ2ZXIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08YXhpc2NvbmZpZyBuYW1lPSJBeGlzSmF2YTIuMCI+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJwYXJhMSIgbG9ja2VkPSJ4c2Q6dHJ1ZSI+MTA8L3BhcmFtZXRlcj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9InBhcmEyIj5Db2xvbWJvPC9wYXJhbWV0ZXI+Ci0gICAgPGhhbmRsZXIgbmFtZT0iaDEiIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5yZWdpc3RyeS5TcGVha2luZ0hhbmRsZXIiPgotICAgICAgICA8b3JkZXIgcGhhc2U9InAxIiBwaGFzZUZpcnN0PSJ0cnVlIi8+Ci0gICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFyYTgiIGxvY2tlZD0ieHNkOnRydWUiPjEyMzwvcGFyYW1ldGVyPgotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9InBhcmE5IiBsb2NrZWQ9InhzZDp0cnVlIj40NTY8L3BhcmFtZXRlcj4KLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJwYXJhMTAiIGxvY2tlZD0ieHNkOnRydWUiPjc4OTwvcGFyYW1ldGVyPgotICAgIDwvaGFuZGxlcj4KLSAgICA8aGFuZGxlciBuYW1lPSJoMiIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZW5naW5lLnJlZ2lzdHJ5LlNwZWFraW5nSGFuZGxlciIvPgotICAgIDxtb2R1bGUgcmVmPSJtb2R1bGUxIj4gPC9tb2R1bGU+Ci0gICAgPCEtLQotICAgICAgPG1vZHVsZSByZWY9InVyaSI+Ci0gICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJwYXJhMyIgbG9ja2VkPSJ4c2Q6dHJ1ZSI+MTA8L3BhcmFtZXRlcj4KLSAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9InBhcmE0Ij5MU0Y8L3BhcmFtZXRlcj4KLSAgICAgIDwvbW9kdWxlPgotICAgICAtLT4KLSAgICA8cGhhc2VPcmRlcj4KLSAgICAgICAgPHBoYXNlIG5hbWU9Imdsb2JhbCIvPgotICAgICAgICA8cGhhc2UgbmFtZT0idHJhbnNwb3J0Ii8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJtb2R1bGUiLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9InNlcnZpY2UiLz4KLSAgICA8L3BoYXNlT3JkZXI+Ci0gICAgPGdvb2w+Ci0gICAgICAgIG5vdCBnb29kCi0gICAgPC9nb29sPgotPC9heGlzY29uZmlnPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L0JhZG1vZHVsZS54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9CYWRtb2R1bGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmFiMWFkLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L0JhZG1vZHVsZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxtb2R1bGUgbmFtZT0ibW9kdWxlMSIgY2xhc3M9Im1vZHVsZTEuamF2YSI+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJwYXJhMTIzIiBsb2NrZWQ9InhzZDp0cnVlIj4xMDwvcGFyYW1ldGVyPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFyYTI0NSI+Q29sb21ibzwvcGFyYW1ldGVyPgotICAgIDwhLS0gIE1vZHVsZSBUeXBlTWFwcGluZyAtLT4KLSAgICA8dHlwZU1hcHBpbmc+VHlwZSBtYXBwcGluZyBzaG91bGQgY29tZSBoZXJlPC90eXBlTWFwcGluZz4KLSAgICA8SW5GbG93PgotICAgICAgICA8aGFuZGxlciBuYW1lPSJoMSIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZW5naW5lLnJlZ2lzdHJ5LlNwZWFraW5nSGFuZGxlciI+Ci0gICAgICAgICAgICA8b3JkZXIgcGhhc2U9InAxIiBwaGFzZUZpcnN0PSJ0cnVlIi8+Ci0gICAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9InBhcmE4IiBsb2NrZWQ9InhzZDp0cnVlIj4xMjM8L3BhcmFtZXRlcj4KLSAgICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFyYTkiIGxvY2tlZD0ieHNkOnRydWUiPjQ1NjwvcGFyYW1ldGVyPgotICAgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJwYXJhMTAiIGxvY2tlZD0ieHNkOnRydWUiPjc4OTwvcGFyYW1ldGVyPgotICAgICAgICA8L2hhbmRsZXI+Ci0gICAgICAgIDxoYW5kbGVyIG5hbWU9ImgyIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5lbmdpbmUucmVnaXN0cnkuU3BlYWtpbmdIYW5kbGVyIi8+Ci0gICAgPC9JbkZsb3c+Ci0KLSAgICA8T3V0Rmxvdz4KLSAgICAgICAgPGhhbmRsZXIgbmFtZT0iaDMiIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5yZWdpc3RyeS5TcGVha2luZ0hhbmRsZXIiPgotICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJwMiIvPgotICAgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJwYXJhOCIgbG9ja2VkPSJ4c2Q6dHJ1ZSI+MTIzPC9wYXJhbWV0ZXI+Ci0gICAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9InBhcmE5IiBsb2NrZWQ9InhzZDp0cnVlIj40NTY8L3BhcmFtZXRlcj4KLSAgICAgICAgPC9oYW5kbGVyPgotICAgIDwvT3V0Rmxvdz4KLQotICAgIDxGYXVsdEZsb3c+Ci0gICAgICAgIDxoYW5kbGVyIG5hbWU9Img0IiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5lbmdpbmUucmVnaXN0cnkuU3BlYWtpbmdIYW5kbGVyIj4KLSAgICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFyYTgiIGxvY2tlZD0ieHNkOnRydWUiPjEyMzwvcGFyYW1ldGVyPgotICAgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJwYXJhOSIgbG9ja2VkPSJ4c2Q6dHJ1ZSI+NDU2PC9wYXJhbWV0ZXI+Ci0gICAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9InBhcmExMCIgbG9ja2VkPSJ4c2Q6dHJ1ZSI+Nzg5PC9wYXJhbWV0ZXI+Ci0gICAgICAgIDwvaGFuZGxlcj4KLQotICAgICAgICA8aGFuZGxlciBuYW1lPSJoNSIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZW5naW5lLnJlZ2lzdHJ5LlNwZWFraW5nSGFuZGxlciI+Ci0gICAgICAgICAgICA8b3JkZXIgcGhhc2U9InAxIi8+Ci0gICAgICAgIDwvaGFuZGxlcj4KLQotICAgICAgICA8aGFuZGxlciBuYW1lPSJoNiIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZW5naW5lLnJlZ2lzdHJ5LlNwZWFraW5nSGFuZGxlciI+Ci0gICAgICAgICAgICA8b3JkZXIgcGhhc2U9ImFueWhhc2UiIHBoYXNlRmlyc3Q9InRydWUiIHBoYXNlTGFzdD0iZmFsc2UiLz4KLSAgICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFyYTgiIGxvY2tlZD0ieHNkOnRydWUiPjEyMzwvcGFyYW1ldGVyPgotICAgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJwYXJhOSIgbG9ja2VkPSJ4c2Q6dHJ1ZSI+NDU2PC9wYXJhbWV0ZXI+Ci0gICAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9InBhcmExMCIgbG9ja2VkPSJ4c2Q6dHJ1ZSI+Nzg5PC9wYXJhbWV0ZXI+Ci0gICAgICAgIDwvaGFuZGxlcj4KLSAgICA8L0ZhdWx0Rmxvdz4KLQotCi08L21vZHVsZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9DbGFzc3BhdGhNb2R1bGUvTUVUQS1JTkYvbW9kdWxlLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L0NsYXNzcGF0aE1vZHVsZS9NRVRBLUlORi9tb2R1bGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjU1OGNiLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L0NsYXNzcGF0aE1vZHVsZS9NRVRBLUlORi9tb2R1bGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08bW9kdWxlIG5hbWU9ImNsYXNzcGF0aE1vZHVsZSI+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJjb2xvciI+Ymx1ZTwvcGFyYW1ldGVyPgotPC9tb2R1bGU+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9Db25maWdXaXRoT2JzZXJ2ZXJzL2F4aXMyLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L0NvbmZpZ1dpdGhPYnNlcnZlcnMvYXhpczIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjQzN2I4Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L0NvbmZpZ1dpdGhPYnNlcnZlcnMvYXhpczIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGF4aXNjb25maWcgbmFtZT0iQXhpc0phdmEyLjAiPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIFBhcmFtZXRlcnMgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iaG90ZGVwbG95bWVudCI+dHJ1ZTwvcGFyYW1ldGVyPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iaG90dXBkYXRlIj5mYWxzZTwvcGFyYW1ldGVyPgotCi0gICAgPHBhcmFtZXRlciBuYW1lPSJ1c2VyTmFtZSI+YWRtaW48L3BhcmFtZXRlcj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9InBhc3N3b3JkIj5heGlzMjwvcGFyYW1ldGVyPgotCi0gICAgPCEtLSAgICBUaGUgd2F5IG9mIGFkZGluZyBsaXN0ZW5lciB0byB0aGUgc3lzdGVtLS0+Ci0gICAgPGxpc3RlbmVyIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQuQXhpc09ic2VydmVySW1wbCI+Ci0gICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iUlNTX1VSTCI+aHR0cDovLzEyNy4wLjAuMS9yc3M8L3BhcmFtZXRlcj4KLSAgICA8L2xpc3RlbmVyPgotCi0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBNZXNzYWdlIFJlY2VpdmVycyAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBUaGlzIGlzIHRoZSBEZWFmdWx0IE1lc3NhZ2UgUmVjZWl2ZXIgZm9yIHRoZSBSZXF1ZXN0IFJlc3BvbnNlIHN0eWxlIE9wZXJhdGlvbnMgLS0+Ci0gICAgPG1lc3NhZ2VSZWNlaXZlciBtZXA9IklOT1VUIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuUmF3WE1MSU5PdXRNZXNzYWdlUmVjZWl2ZXIiLz4KLQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIFRyYW5zcG9ydCBJbnMgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gVHJhbnNwb3J0IE91dHMgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi0KLSAgICAKLQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIEdsb2JhbCBNb2R1bGVzICAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBVbmNvbW1lbnQgdGhpcyB0byBlbmFibGUgQWRkcmVzc2luZwotICAgIDxtb2R1bGUgcmVmPSJhZGRyZXNzaW5nIi8+IC0tPgotCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gUGhhc2VzICAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPHBoYXNlT3JkZXIgdHlwZT0iSW5GbG93Ij4KLSAgICAgICAgPCEtLSAgU3lzdGVtIHByZSBkZWZpbmVkIHBoYXNlcyAgICAgICAtLT4KLSAgICAgICAgIDxwaGFzZSBuYW1lPSJUcmFuc3BvcnQiPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiLz4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIi8+Ci0gICAgICAgIDwvcGhhc2U+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJTZWN1cml0eSIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iUHJlRGlzcGF0Y2giLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9IkRpc3BhdGNoIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuRGlzcGF0Y2hQaGFzZSI+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJBZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciIvPgotCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiLz4KLSAgICAgICAgPC9waGFzZT4KLSAgICAgICAgPCEtLSAgU3lzdGVtIHByZSBkZWZpbmVkIHBoYXNlcyAgICAgICAtLT4KLSAgICAgICAgPCEtLSAgIEFmdGVyIFBvc3RkaXNwYXRjaCBwaGFzZSBtb2R1bGUgYXV0aG9yIG9yIG9yIHNlcnZpY2UgYXV0aG9yIGNhbiBhZGQgYW55IHBoYXNlIGhlIHdhbnQgICAgICAtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik9wZXJhdGlvbkluUGhhc2UiLz4KLSAgICA8L3BoYXNlT3JkZXI+Ci0gICAgPHBoYXNlT3JkZXIgdHlwZT0iT3V0RmxvdyI+Ci0gICAgICAgIDwhLS0gICAgICB1c2VyIGNhbiBhZGQgaGlzIG93biBwaGFzZXMgdG8gdGhpcyBhcmVhICAtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik9wZXJhdGlvbk91dFBoYXNlIi8+Ci0gICAgICAgIDwhLS1zeXN0ZW0gcHJlZGVmaW5lZCBwaGFzZS0tPgotICAgICAgICA8IS0tdGhlc2UgcGhhc2Ugd2lsbCBydW4gaXJyZXNwZWN0aXZlIG9mIHRoZSBzZXJ2aWNlLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJQb2xpY3lEZXRlcm1pbmF0aW9uIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJNZXNzYWdlT3V0Ii8+Ci0gICAgPC9waGFzZU9yZGVyPgotICAgIDxwaGFzZU9yZGVyIHR5cGU9IkluRmF1bHRGbG93Ij4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlByZURpc3BhdGNoIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJEaXNwYXRjaCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkRpc3BhdGNoUGhhc2UiPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiLz4KLQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiLz4KLQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiLz4KLQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIi8+Ci0gICAgICAgIDwvcGhhc2U+Ci0gICAgICAgIDwhLS0gICAgICB1c2VyIGNhbiBhZGQgaGlzIG93biBwaGFzZXMgdG8gdGhpcyBhcmVhICAtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik9wZXJhdGlvbkluRmF1bHRQaGFzZSIvPgotICAgIDwvcGhhc2VPcmRlcj4KLSAgICA8cGhhc2VPcmRlciB0eXBlPSJPdXRGYXVsdEZsb3ciPgotICAgICAgICA8IS0tICAgICAgdXNlciBjYW4gYWRkIGhpcyBvd24gcGhhc2VzIHRvIHRoaXMgYXJlYSAgLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJPcGVyYXRpb25PdXRGYXVsdFBoYXNlIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJQb2xpY3lEZXRlcm1pbmF0aW9uIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJNZXNzYWdlT3V0Ii8+Ci0gICAgPC9waGFzZU9yZGVyPgotPC9heGlzY29uZmlnPgotCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9DdXN0b21EZXBsb3llclJlcG8vYXhpczIueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvQ3VzdG9tRGVwbG95ZXJSZXBvL2F4aXMyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY1NWFlYi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9DdXN0b21EZXBsb3llclJlcG8vYXhpczIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjI1ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGF4aXNjb25maWcgbmFtZT0iQXhpc0phdmEyLjAiPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIFBhcmFtZXRlcnMgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iaG90ZGVwbG95bWVudCI+dHJ1ZTwvcGFyYW1ldGVyPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iaG90dXBkYXRlIj5mYWxzZTwvcGFyYW1ldGVyPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iZW5hYmxlTVRPTSI+ZmFsc2U8L3BhcmFtZXRlcj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImVuYWJsZVN3QSI+ZmFsc2U8L3BhcmFtZXRlcj4KLQotICAgIDwhLS1VbmNvbW1lbnQgaWYgeW91IHdhbnQgdG8gZW5hYmxlIGZpbGUgY2FjaGluZyBmb3IgYXR0YWNobWVudHMgLS0+Ci0gICAgPCEtLXBhcmFtZXRlciBuYW1lPSJjYWNoZUF0dGFjaG1lbnRzIj50cnVlPC9wYXJhbWV0ZXI+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJhdHRhY2htZW50RElSIj48L3BhcmFtZXRlcj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9InNpemVUaHJlc2hvbGQiPjQwMDA8L3BhcmFtZXRlci0tPgotCi0gICAgPCEtLVRoaXMgd2lsbCBnaXZlIG91dCB0aGUgdGltb3V0IG9mIHRoZSBjb25maWd1cmF0aW9uIGNvbnRleHRzLCBpbiBtaWxsaXNlY29uZHMtLT4KLSAgICA8cGFyYW1ldGVyIG5hbWU9IkNvbmZpZ0NvbnRleHRUaW1lb3V0SW50ZXJ2YWwiPjMwMDAwPC9wYXJhbWV0ZXI+Ci0KLSAgICA8IS0tRHVyaW5nIGEgZmF1bHQsIHN0YWNrdHJhY2UgY2FuIGJlIHNlbnQgd2l0aCB0aGUgZmF1bHQgbWVzc2FnZS4gVGhlIGZvbGxvd2luZyBmbGFnIHdpbGwgY29udHJvbCAtLT4KLSAgICA8IS0tdGhhdCBiZWhhdmlvdXIuLS0+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJzZW5kU3RhY2t0cmFjZURldGFpbHNXaXRoRmF1bHRzIj5mYWxzZTwvcGFyYW1ldGVyPgotCi0gICAgPCEtLUlmIHRoZXJlIGFyZW4ndCBhbnkgaW5mb3JtYXRpb24gYXZhaWxhYmxlIHRvIGZpbmQgb3V0IHRoZSBmYXVsdCByZWFzb24sIHdlIHNldCB0aGUgbWVzc2FnZSBvZiB0aGUgZXhwY2V0aW9uLS0+Ci0gICAgPCEtLWFzIHRoZSBmYXVsdHJlYXNvbi9SZWFzb24uIEJ1dCB3aGVuIGEgZmF1bHQgaXMgdGhyb3duIGZyb20gYSBzZXJ2aWNlIG9yIHNvbWUgd2hlcmUsIGl0IHdpbGwgYmUgLS0+Ci0gICAgPCEtLXdyYXBwZWQgYnkgZGlmZmVyZW50IGxldmVscy4gRHVlIHRvIHRoaXMgdGhlIGluaXRpYWwgZXhjZXB0aW9uIG1lc3NhZ2UgY2FuIGJlIGxvc3QuIElmIHRoaXMgZmxhZy0tPgotICAgIDwhLS1pcyBzZXQgdGhlbiwgQXhpczIgdHJpZXMgdG8gZ2V0IHRoZSBmaXJzdCBleGNlcHRpb24gYW5kIHNldCBpdHMgbWVzc2FnZSBhcyB0aGUgZmF1bHRyZWFzb24vUmVhc29uLi0tPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iRHJpbGxEb3duVG9Sb290Q2F1c2VGb3JGYXVsdFJlYXNvbiI+ZmFsc2U8L3BhcmFtZXRlcj4KLQotICAgIDxwYXJhbWV0ZXIgbmFtZT0idXNlck5hbWUiPmFkbWluPC9wYXJhbWV0ZXI+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJwYXNzd29yZCI+YXhpczI8L3BhcmFtZXRlcj4KLQotICAgIDwhLS1UbyBvdmVycmlkZSByZXBvc2l0b3J5L3NlcnZpY2VzIHlvdSBuZWVkIHRvIHVuY29tbWVudCBmb2xsb3dpbmcgcGFyYW1ldGVyIGFuZCB2YWx1ZSBTSE9VTEQgYmUgYWJzb2x1dGUgZmlsZSBwYXRoLi0tPgotICAgIDwhLS08cGFyYW1ldGVyIG5hbWU9IlNlcnZpY2VzRGlyZWN0b3J5Ij5zZXJ2aWNlPC9wYXJhbWV0ZXI+LS0+Ci0gICAgPCEtLVRvIG92ZXJyaWRlIHJlcG9zaXRvcnkvbW9kdWxlcyB5b3UgbmVlZCB0byB1bmNvbW1lbnQgZm9sbG93aW5nIHBhcmFtZXRlciBhbmQgdmFsdWUgU0hPVUxEIGJlIGFic29sdXRlIGZpbGUgcGF0aC0tPgotICAgIDwhLS08cGFyYW1ldGVyIG5hbWU9Ik1vZHVsZXNEaXJlY3RvcnkiPm1vZHVsZXM8L3BhcmFtZXRlcj4tLT4KLQotCi0KLSAgICA8IS0tRm9sbG93aW5nIHBhcmFtcyB3aWxsIHNldCB0aGUgcHJvcGVyIGNvbnRleHQgcGF0aHMgZm9yIGludm9jYXRpb25zLiBBbGwgdGhlIGVuZHBvaW50cyB3aWxsIGhhdmUgYSBjb21tb25zIGNvbnRleHQtLT4KLSAgICA8IS0tcm9vdCB3aGljaCBjYW4gY29uZmlndXJlZCB1c2luZyB0aGUgZm9sbG93aW5nIGNvbnRleHRSb290IHBhcmFtZXRlci0tPgotICAgIDwhLS08cGFyYW1ldGVyIG5hbWU9ImNvbnRleHRSb290Ij5heGlzMjwvcGFyYW1ldGVyPi0tPgotCi0gICAgPCEtLU91ciBIVFRQIGVuZHBvaW50cyBjYW4gaGFuZGxlIGJvdGggUkVTVCBhbmQgU09BUC4gRm9sbG93aW5nIHBhcmFtZXRlcnMgY2FuIGJlIHVzZWQgdG8gZGlzdGluZ2l1c2ggdGhvc2UgZW5kcG9pbnRzLS0+Ci0gICAgPCEtLUluIGNhc2Ugb2YgYSBzZXJ2bGV0LCBpZiB5b3UgY2hhbmdlIHRoaXMgeW91IGhhdmUgdG8gbWFudWFsbHkgY2hhbmdlIHRoZSBzZXR0aW5ncyBvZiB5b3VyIHNlcnZsZXQgY29udGFpbmVyIHRvIG1hcCB0aGlzIC0tPgotICAgIDwhLS1jb250ZXh0IHBhdGggdG8gcHJvcGVyIEF4aXMyIHNlcnZsZXRzLS0+Ci0gICAgPCEtLTxwYXJhbWV0ZXIgbmFtZT0ic2VydmljZVBhdGgiPnNlcnZpY2VzPC9wYXJhbWV0ZXI+LS0+Ci0gICAgPCEtLTxwYXJhbWV0ZXIgbmFtZT0icmVzdFBhdGgiPnJlc3Q8L3BhcmFtZXRlcj4tLT4KLQotICAgIDwhLS0gRm9sbG93aW5nIHBhcmFtZXRlciB3aWxsIGNvbXBsZXRlbHkgZGlzYWJsZSBSRVNUIGhhbmRsaW5nIGluIEF4aXMyLS0+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJkaXNhYmxlUkVTVCIgbG9ja2VkPSJ0cnVlIj5mYWxzZTwvcGFyYW1ldGVyPgotCi0gICAgPCEtLSBJZiB5b3UgaGF2ZSBhIGZyb250ZW5kIGhvc3Qgd2hpY2ggZXhwb3NlcyB0aGlzIHdlYnNlcnZpY2UgdXNpbmcgYSBkaWZmZXJlbnQgcHVibGljIFVSTCAgLS0+Ci0gICAgPCEtLSB1c2UgdGhpcyBwYXJhbWV0ZXIgdG8gb3ZlcnJpZGUgYXV0b2RldGVjdGVkIHVybCAtLT4KLSAgICA8IS0tPHBhcmFtZXRlciBuYW1lPSJodHRwRnJvbnRlbmRIb3N0VXJsIj5odHRwczovL3NvbWVvdGhlcmhvc3QvY29udGV4dDwvcGFyYW1ldGVyPi0tPgotCi0KLSAgICA8IS0tICAgIFRoZSB3YXkgb2YgYWRkaW5nIGxpc3RlbmVyIHRvIHRoZSBzeXN0ZW0tLT4KLSAgICA8IS0tICAgIDxsaXN0ZW5lciBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5PYnNlcnZlcklNUEwiPi0tPgotICAgIDwhLS0gICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iUlNTX1VSTCI+aHR0cDovLzEyNy4wLjAuMS9yc3M8L3BhcmFtZXRlcj4tLT4KLSAgICA8IS0tICAgIDwvbGlzdGVuZXI+LS0+Ci0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBNZXNzYWdlIFJlY2VpdmVycyAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLVRoaXMgaXMgdGhlIERlYWZ1bHQgTWVzc2FnZSBSZWNlaXZlciBmb3IgdGhlIHN5c3RlbSAsIGlmIHlvdSB3YW50IHRvIGhhdmUgTWVzc2FnZVJlY2VpdmVycyBmb3IgLS0+Ci0gICAgPCEtLWFsbCB0aGUgb3RoZXIgTUVQIGltcGxlbWVudCBpdCBhbmQgYWRkIHRoZSBjb3JyZWN0IGVudHJ5IHRvIGhlcmUgLCBzbyB0aGF0IHlvdSBjYW4gcmVmZXIgZnJvbS0tPgotICAgIDwhLS1hbnkgb3BlcmF0aW9uIC0tPgotICAgIDwhLS1Ob3RlIDogWW91IGNhbiBvdnJpZGUgdGhpcyBmb3IgcGFydGljdWxhciBzZXJ2aWNlIGJ5IGFkZGluZyB0aGUgc2FtZSBlbGVtZW50IHdpdGggeW91ciByZXF1aXJlbWVudC0tPgotICAgICA8bWVzc2FnZVJlY2VpdmVycz4KLSAgICAgICAgPG1lc3NhZ2VSZWNlaXZlciBtZXA9Imh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgvd3NkbC9pbi1vbmx5IgotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5SYXdYTUxJTk9ubHlNZXNzYWdlUmVjZWl2ZXIiLz4KLSAgICAgICAgPG1lc3NhZ2VSZWNlaXZlciBtZXA9Imh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgvd3NkbC9pbi1vdXQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLlJhd1hNTElOT3V0TWVzc2FnZVJlY2VpdmVyIi8+Ci0gICAgICAgIDxtZXNzYWdlUmVjZWl2ZXIgbWVwPSJodHRwOi8vd3d3LnczLm9yZy8yMDA2LzAxL3dzZGwvaW4tb25seSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuUmF3WE1MSU5Pbmx5TWVzc2FnZVJlY2VpdmVyIi8+Ci0gICAgICAgIDxtZXNzYWdlUmVjZWl2ZXIgbWVwPSJodHRwOi8vd3d3LnczLm9yZy8yMDA2LzAxL3dzZGwvaW4tb3V0IgotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5SYXdYTUxJTk91dE1lc3NhZ2VSZWNlaXZlciIvPgotICAgIDwvbWVzc2FnZVJlY2VpdmVycz4KLQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIE1lc3NhZ2UgRm9ybWF0dGVyIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tRm9sbG93aW5nIGNvbnRlbnQgdHlwZSB0byBtZXNzYWdlIGZvcm1hdHRlciBtYXBwaW5nIGNhbiBiZSB1c2VkIHRvIGltcGxlbWVudCBzdXBwb3J0IGZvciBkaWZmZXJlbnQgbWVzc2FnZSAtLT4KLSAgICA8IS0tZm9ybWF0ICBzZXJpYWxpemF0aW9uIGluIEF4aXMyLiBUaGVzZSBtZXNzYWdlIGZvcm1hdHMgYXJlIGV4cGVjdGVkIHRvIGJlIHJlc29sdmVkIGJhc2VkIG9uIHRoZSBjb250ZW50IHR5cGUuIC0tPgotICAgIDxtZXNzYWdlRm9ybWF0dGVycz4KLSAgICAgICAgPG1lc3NhZ2VGb3JtYXR0ZXIgY29udGVudFR5cGU9ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5YRm9ybVVSTEVuY29kZWRGb3JtYXR0ZXIiLz4KLSAgICAgICAgPG1lc3NhZ2VGb3JtYXR0ZXIgY29udGVudFR5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuTXVsdGlwYXJ0Rm9ybURhdGFGb3JtYXR0ZXIiLz4KLSAgICAgICAgPG1lc3NhZ2VGb3JtYXR0ZXIgY29udGVudFR5cGU9ImFwcGxpY2F0aW9uL3htbCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5BcHBsaWNhdGlvblhNTEZvcm1hdHRlciIvPgotICAgIDwvbWVzc2FnZUZvcm1hdHRlcnM+Ci0KLSAgICA8IS0tIFRlc3QgY3VzdG9tIGRlcGxveW1lbnQgYnkgcmVnaXN0ZXJpbmcgZm9yICJzdmMiIGZpbGVzLCBhbmQgdGhlICJ3aWRnZXRzIiBkaXIgLS0+Ci0gICAgPGRlcGxveWVyIGV4dGVuc2lvbj0iLnN2YyIgZGlyZWN0b3J5PSJ3aWRnZXRzIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC5kZXBsb3llcnMuQ3VzdG9tRGVwbG95ZXIiLz4KLQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIE1lc3NhZ2UgQnVpbGRlcnMgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS1Gb2xsb3dpbmcgY29udGVudCB0eXBlIHRvIGJ1aWxkZXIgbWFwcGluZyBjYW4gYmUgdXNlZCB0byBpbXBsZW1lbnQgc3VwcG9ydCBmb3IgZGlmZmVyZW50IG1lc3NhZ2UgLS0+Ci0gICAgPCEtLWZvcm1hdHMgaW4gQXhpczIuIFRoZXNlIG1lc3NhZ2UgZm9ybWF0cyBhcmUgZXhwZWN0ZWQgdG8gYmUgcmVzb2x2ZWQgYmFzZWQgb24gdGhlIGNvbnRlbnQgdHlwZS4gLS0+Ci0gICAgPG1lc3NhZ2VCdWlsZGVycz4KLSAgICAgICAgPG1lc3NhZ2VCdWlsZGVyIGNvbnRlbnRUeXBlPSJhcHBsaWNhdGlvbi94bWwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuYnVpbGRlci5BcHBsaWNhdGlvblhNTEJ1aWxkZXIiLz4KLSAgICAgICAgPG1lc3NhZ2VCdWlsZGVyIGNvbnRlbnRUeXBlPSJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuYnVpbGRlci5YRm9ybVVSTEVuY29kZWRCdWlsZGVyIi8+Ci0gICAgICAgIDxtZXNzYWdlQnVpbGRlciBjb250ZW50VHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5idWlsZGVyLk11bHRpcGFydEZvcm1EYXRhQnVpbGRlciIvPgotICAgIDwvbWVzc2FnZUJ1aWxkZXJzPgotCi0gIAotCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gR2xvYmFsIE1vZHVsZXMgIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIENvbW1lbnQgdGhpcyB0byBkaXNhYmxlIEFkZHJlc3NpbmcgLS0+Ci0gICAgPCEtLTxtb2R1bGUgcmVmPSJhZGRyZXNzaW5nIi8+LS0+Ci0KLSAgICA8IS0tQ29uZmlndXJpbmcgbW9kdWxlICwgcHJvdmlkaW5nIHBhcmFtZXRlcnMgZm9yIG1vZHVsZXMgd2hldGhlciB0aGV5IHJlZmVyIG9yIG5vdC0tPgotICAgIDwhLS08bW9kdWxlQ29uZmlnIG5hbWU9ImFkZHJlc3NpbmciPi0tPgotICAgIDwhLS08cGFyYW1ldGVyIG5hbWU9ImFkZHJlc3NpbmdQYXJhIj5OL0E8L3BhcmFtZXRlcj4tLT4KLSAgICA8IS0tPC9tb2R1bGVDb25maWc+LS0+Ci0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBDbHVzdGVyaW5nICAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBDb25maWd1cmUgYW5kIHVuY29tbWVudCBmb2xsb3dpbmcgZm9yIHByZXBhcmluZyBBeGlzMiB0byBhIGNsdXN0ZXJlZCBlbnZpcm9ubWVudCAtLT4KLSAgICA8IS0tCi0gICAgPGNsdXN0ZXIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuY2x1c3Rlci50cmliZXMuVHJpYmVzQ2x1c3Rlck1hbmFnZXIiPgotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9InBhcmFtMSI+dmFsdWUxPC9wYXJhbWV0ZXI+Ci0gICAgCTxjb25maWd1cmF0aW9uTWFuYWdlciBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyLmNvbmZpZ3VyYXRpb24uVHJpYmVzQ29uZmlndXJhdGlvbk1hbmFnZXIiPgotICAgIAkgICAgPGxpc3RlbmVyIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXIuY29uZmlndXJhdGlvbi5EZWZhdWx0Q29uZmlndXJhdGlvbk1hbmFnZXJMaXN0ZW5lciIvPgotICAgIAk8L2NvbmZpZ3VyYXRpb25NYW5hZ2VyPgotICAgIAk8Y29udGV4dE1hbmFnZXIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuY2x1c3Rlci5jb250ZXh0LlRyaWJlc0NvbnRleHRNYW5hZ2VyIj4KLSAgICAJICAgIDxsaXN0ZW5lciBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyLmNvbnRleHQuRGVmYXVsdENvbnRleHRNYW5hZ2VyTGlzdGVuZXIiLz4KLSAgICAJPC9jb250ZXh0TWFuYWdlcj4KLSAgICA8L2NsdXN0ZXI+Ci0gICAgLS0+Ci0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBQaGFzZXMgIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8cGhhc2VPcmRlciB0eXBlPSJJbkZsb3ciPgotICAgICAgICA8IS0tICBTeXN0ZW0gcHJlIGRlZmluZWQgcGhhc2VzICAgICAgIC0tPgotICAgICAgICA8cGhhc2UgbmFtZT0iVHJhbnNwb3J0Ij4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5SZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIi8+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciIvPgotICAgICAgICA8L3BoYXNlPgotICAgICAgICA8cGhhc2UgbmFtZT0iU2VjdXJpdHkiLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlByZURpc3BhdGNoIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJEaXNwYXRjaCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkRpc3BhdGNoUGhhc2UiPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiLz4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlJlcXVlc3RVUklPcGVyYXRpb25EaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSU9wZXJhdGlvbkRpc3BhdGNoZXIiLz4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciIvPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iSFRUUExvY2F0aW9uQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuSFRUUExvY2F0aW9uQmFzZWREaXNwYXRjaGVyIi8+Ci0gICAgICAgIDwvcGhhc2U+Ci0gICAgICAgIDwhLS0gIFN5c3RlbSBwcmUgZGVmaW5lZCBwaGFzZXMgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gICBBZnRlciBQb3N0ZGlzcGF0Y2ggcGhhc2UgbW9kdWxlIGF1dGhvciBvciBvciBzZXJ2aWNlIGF1dGhvciBjYW4gYWRkIGFueSBwaGFzZSBoZSB3YW50ICAgICAgLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJPcGVyYXRpb25JblBoYXNlIi8+Ci0JPHBoYXNlIG5hbWU9InNvYXBtb25pdG9yUGhhc2UiLz4KLSAgICA8L3BoYXNlT3JkZXI+Ci0gICAgPHBoYXNlT3JkZXIgdHlwZT0iT3V0RmxvdyI+Ci0gICAgICAgIDwhLS0gICAgICB1c2VyIGNhbiBhZGQgaGlzIG93biBwaGFzZXMgdG8gdGhpcyBhcmVhICAtLT4KLQk8cGhhc2UgbmFtZT0ic29hcG1vbml0b3JQaGFzZSIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iT3BlcmF0aW9uT3V0UGhhc2UiLz4KLSAgICAgICAgPCEtLXN5c3RlbSBwcmVkZWZpbmVkIHBoYXNlLS0+Ci0gICAgICAgIDwhLS10aGVzZSBwaGFzZSB3aWxsIHJ1biBpcnJlc3BlY3RpdmUgb2YgdGhlIHNlcnZpY2UtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlBvbGljeURldGVybWluYXRpb24iLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik1lc3NhZ2VPdXQiLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlNlY3VyaXR5Ii8+Ci0gICAgPC9waGFzZU9yZGVyPgotICAgIDxwaGFzZU9yZGVyIHR5cGU9IkluRmF1bHRGbG93Ij4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlByZURpc3BhdGNoIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJEaXNwYXRjaCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkRpc3BhdGNoUGhhc2UiPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiLz4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIi8+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJBZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciIvPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iUmVxdWVzdFVSSU9wZXJhdGlvbkRpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5SZXF1ZXN0VVJJT3BlcmF0aW9uRGlzcGF0Y2hlciIvPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIi8+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJIVFRQTG9jYXRpb25CYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5IVFRQTG9jYXRpb25CYXNlZERpc3BhdGNoZXIiLz4KLSAgICAgICAgPC9waGFzZT4KLSAgICAgICAgPCEtLSAgICAgIHVzZXIgY2FuIGFkZCBoaXMgb3duIHBoYXNlcyB0byB0aGlzIGFyZWEgIC0tPgotICAgICAgICA8cGhhc2UgbmFtZT0iT3BlcmF0aW9uSW5GYXVsdFBoYXNlIi8+Ci0JPHBoYXNlIG5hbWU9InNvYXBtb25pdG9yUGhhc2UiLz4KLSAgICA8L3BoYXNlT3JkZXI+Ci0gICAgPHBoYXNlT3JkZXIgdHlwZT0iT3V0RmF1bHRGbG93Ij4KLSAgICAgICAgPCEtLSAgICAgIHVzZXIgY2FuIGFkZCBoaXMgb3duIHBoYXNlcyB0byB0aGlzIGFyZWEgIC0tPgotCTxwaGFzZSBuYW1lPSJzb2FwbW9uaXRvclBoYXNlIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJPcGVyYXRpb25PdXRGYXVsdFBoYXNlIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJQb2xpY3lEZXRlcm1pbmF0aW9uIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJNZXNzYWdlT3V0Ii8+Ci0gICAgPC9waGFzZU9yZGVyPgotPC9heGlzY29uZmlnPgotCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9DdXN0b21EZXBsb3llclJlcG8vc2VydmljZXMvZ2VvcmdlLnN2YyBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L0N1c3RvbURlcGxveWVyUmVwby9zZXJ2aWNlcy9nZW9yZ2Uuc3ZjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmU0MTU4Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L0N1c3RvbURlcGxveWVyUmVwby9zZXJ2aWNlcy9nZW9yZ2Uuc3ZjCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotVGhpcyBpcyBhIGN1c3RvbSBzZXJ2aWNlIGRlcGxveW1lbnQgaW4gdGhlIHNlcnZpY2VzLyBkaXJlY3RvcnkuICBJdHMgbmFtZSBpcyBHZW9yZ2UuDQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvQ3VzdG9tRGVwbG95ZXJSZXBvL3dpZGdldHMvbWFyeS5zdmMgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9DdXN0b21EZXBsb3llclJlcG8vd2lkZ2V0cy9tYXJ5LnN2YwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzViMGYwOC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9DdXN0b21EZXBsb3llclJlcG8vd2lkZ2V0cy9tYXJ5LnN2YworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLVRoaXMgaXMgYSBjdXN0b20gc2VydmljZSBkZXBsb3ltZW50IGluIHRoZSB3aWRnZXRzLyBkaXJlY3RvcnkuICBJdHMgbmFtZSBpcyBNYXJ5Lg0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L1BhcmFMb2NrZWRSZXBvL09wX292ZXJpZGVfU2VydmljZV9wYXJhLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L1BhcmFMb2NrZWRSZXBvL09wX292ZXJpZGVfU2VydmljZV9wYXJhLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjEzY2M3Yi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9QYXJhTG9ja2VkUmVwby9PcF9vdmVyaWRlX1NlcnZpY2VfcGFyYS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzZXJ2aWNlIG5hbWU9IlNlcnZpY2UxIj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9IlNlcnZpY2VwIiBsb2NrZWQ9InRydWUiPm9yZy5hcGFjaGUuYXhpczIuc2FtcGxlLmVjaG8uRWNob0ltcGw8L3BhcmFtZXRlcj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9IlNlcnZpY2VQYXJhMiIgbG9ja2VkPSJ0cnVlIj5vcmcuYXBhY2hlLmF4aXMyLnNhbXBsZS5lY2hvLkVjaG9JbXBsPC9wYXJhbWV0ZXI+Ci0gICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvU3RyaW5nIj4KLSAgICAgICA8cGFyYW1ldGVyIG5hbWU9IlNlcnZpY2VwIiBsb2NrZWQ9InRydWUiPnZhbHVlPC9wYXJhbWV0ZXI+Ci0gICAgPC9vcGVyYXRpb24+Ci08L3NlcnZpY2U+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvUGFyYUxvY2tlZFJlcG8vYXhpczIueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvUGFyYUxvY2tlZFJlcG8vYXhpczIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzE5MTRmLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L1BhcmFMb2NrZWRSZXBvL2F4aXMyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGF4aXNjb25maWcgbmFtZT0iQXhpc0phdmEyLjAiPgotCi0gICAgPG1lc3NhZ2VSZWNlaXZlciBtZXA9IklOT1VUIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuUmF3WE1MSU5PdXRNZXNzYWdlUmVjZWl2ZXIiLz4KLQotICAgIDxwYXJhbWV0ZXIgbmFtZT0iU2VydmljZVBhcmExIj50cnVlPC9wYXJhbWV0ZXI+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJTZXJ2aWNlUGFyYTIiIGxvY2tlZD0idHJ1ZSI+dHJ1ZTwvcGFyYW1ldGVyPgotCi0gICAgPHBhcmFtZXRlciBuYW1lPSJtb2R1bGVQYXJhMSI+dHJ1ZTwvcGFyYW1ldGVyPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0ibW9kdWxlUGFyYTIiIGxvY2tlZD0idHJ1ZSI+dHJ1ZTwvcGFyYW1ldGVyPgotCi0gIDxwaGFzZU9yZGVyIHR5cGU9IkluRmxvdyI+Ci0gICAgICAgIDwhLS0gIFN5c3RlbSBwcmUgZGVmaW5lZCBwaGFzZXMgICAgICAgLS0+Ci0gICAgICAgICA8cGhhc2UgbmFtZT0iVHJhbnNwb3J0Ij4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5SZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIi8+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciIvPgotICAgICAgICA8L3BoYXNlPgotICAgICAgICA8cGhhc2UgbmFtZT0iU2VjdXJpdHkiLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlByZURpc3BhdGNoIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJEaXNwYXRjaCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkRpc3BhdGNoUGhhc2UiPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiLz4KLQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIi8+Ci0gICAgICAgIDwvcGhhc2U+Ci0gICAgICAgIDwhLS0gIFN5c3RlbSBwcmUgZGVmaW5lZCBwaGFzZXMgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gICBBZnRlciBQb3N0ZGlzcGF0Y2ggcGhhc2UgbW9kdWxlIGF1dGhvciBvciBvciBzZXJ2aWNlIGF1dGhvciBjYW4gYWRkIGFueSBwaGFzZSBoZSB3YW50ICAgICAgLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJPcGVyYXRpb25JblBoYXNlIi8+Ci0gICAgPC9waGFzZU9yZGVyPgotICAgIDxwaGFzZU9yZGVyIHR5cGU9Ik91dEZsb3ciPgotICAgICAgICA8IS0tICAgICAgdXNlciBjYW4gYWRkIGhpcyBvd24gcGhhc2VzIHRvIHRoaXMgYXJlYSAgLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJPcGVyYXRpb25PdXRQaGFzZSIvPgotICAgICAgICA8IS0tc3lzdGVtIHByZWRlZmluZWQgcGhhc2UtLT4KLSAgICAgICAgPCEtLXRoZXNlIHBoYXNlIHdpbGwgcnVuIGlycmVzcGVjdGl2ZSBvZiB0aGUgc2VydmljZS0tPgotICAgICAgICA8cGhhc2UgbmFtZT0iUG9saWN5RGV0ZXJtaW5hdGlvbiIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iTWVzc2FnZU91dCIvPgotICAgIDwvcGhhc2VPcmRlcj4KLSAgICA8cGhhc2VPcmRlciB0eXBlPSJJbkZhdWx0RmxvdyI+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJQcmVEaXNwYXRjaCIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iRGlzcGF0Y2giIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5EaXNwYXRjaFBoYXNlIj4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5SZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIi8+Ci0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIi8+Ci0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5BZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIi8+Ci0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciIvPgotICAgICAgICA8L3BoYXNlPgotICAgICAgICA8IS0tICAgICAgdXNlciBjYW4gYWRkIGhpcyBvd24gcGhhc2VzIHRvIHRoaXMgYXJlYSAgLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJPcGVyYXRpb25JbkZhdWx0UGhhc2UiLz4KLSAgICA8L3BoYXNlT3JkZXI+Ci0gICAgPHBoYXNlT3JkZXIgdHlwZT0iT3V0RmF1bHRGbG93Ij4KLSAgICAgICAgPCEtLSAgICAgIHVzZXIgY2FuIGFkZCBoaXMgb3duIHBoYXNlcyB0byB0aGlzIGFyZWEgIC0tPgotICAgICAgICA8cGhhc2UgbmFtZT0iT3BlcmF0aW9uT3V0RmF1bHRQaGFzZSIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iUG9saWN5RGV0ZXJtaW5hdGlvbiIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iTWVzc2FnZU91dCIvPgotICAgIDwvcGhhc2VPcmRlcj4KLTwvYXhpc2NvbmZpZz4KLQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvUGFyYUxvY2tlZFJlcG8vbW9kdWxlX292ZXJpZGVfZ2xvYmFsX25vbl9sb2NrZWRfcGFyYS54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9QYXJhTG9ja2VkUmVwby9tb2R1bGVfb3ZlcmlkZV9nbG9iYWxfbm9uX2xvY2tlZF9wYXJhLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTgxNWQzNC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9QYXJhTG9ja2VkUmVwby9tb2R1bGVfb3ZlcmlkZV9nbG9iYWxfbm9uX2xvY2tlZF9wYXJhLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPG1vZHVsZSBuYW1lPSJtb2R1bGUxIiBjbGFzcz0ib3JnLmFwYWNoZS5tb2R1bGUuTW9kdWxlMUltcGwiPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0ibW9kdWxlUGFyYTEiIGxvY2tlZD0idHJ1ZSI+b3JnLmFwYWNoZS5heGlzMi5zYW1wbGUuZWNoby5FY2hvSW1wbDwvcGFyYW1ldGVyPgotPC9tb2R1bGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvUGFyYUxvY2tlZFJlcG8vbW9kdWxlX292ZXJpZGVfbG9ja2VkX3BhcmEueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvUGFyYUxvY2tlZFJlcG8vbW9kdWxlX292ZXJpZGVfbG9ja2VkX3BhcmEueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWZkZmY2Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L1BhcmFMb2NrZWRSZXBvL21vZHVsZV9vdmVyaWRlX2xvY2tlZF9wYXJhLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPG1vZHVsZSBuYW1lPSJtb2R1bGUxIiBjbGFzcz0ib3JnLmFwYWNoZS5tb2R1bGUuTW9kdWxlMUltcGwiPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0ibW9kdWxlUGFyYTIiIGxvY2tlZD0idHJ1ZSI+b3JnLmFwYWNoZS5heGlzMi5zYW1wbGUuZWNoby5FY2hvSW1wbDwvcGFyYW1ldGVyPgotPC9tb2R1bGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvUGFyYUxvY2tlZFJlcG8vb3Bfb3ZlcmlkZV9nbG9iYWxfcGFyYS54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9QYXJhTG9ja2VkUmVwby9vcF9vdmVyaWRlX2dsb2JhbF9wYXJhLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBmYTIxYi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9QYXJhTG9ja2VkUmVwby9vcF9vdmVyaWRlX2dsb2JhbF9wYXJhLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHNlcnZpY2UgbmFtZT0iU2VydmljZTEiPgotICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgVGhpcyBpcyBhIHRlc3Rpbmcgc2VydmljZSAsIHRvIHRlc3QgdGhlIHN5c3RlbSBpcyB3b3JraW5nIG9yIG5vdAotICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJTZXJ2aWNlUGFyYTIiIGxvY2tlZD0idHJ1ZSI+b3JnLmFwYWNoZS5heGlzMi5zYW1wbGUuZWNoby5FY2hvSW1wbDwvcGFyYW1ldGVyPgotICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob1N0cmluZyI+Ci0gICAgICAgPHBhcmFtZXRlciBuYW1lPSJTZXJ2aWNlUGFyYTIiIGxvY2tlZD0idHJ1ZSI+b3JnLmFwYWNoZS5heGlzMi5zYW1wbGUuZWNoby5FY2hvSW1wbDwvcGFyYW1ldGVyPgotICAgIDwvb3BlcmF0aW9uPgotPC9zZXJ2aWNlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L1BhcmFMb2NrZWRSZXBvL3NlcnZpY2Vfb3ZlcmlkZV9sb2NrZWRfcGFyYS54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9QYXJhTG9ja2VkUmVwby9zZXJ2aWNlX292ZXJpZGVfbG9ja2VkX3BhcmEueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDliYTg5Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L1BhcmFMb2NrZWRSZXBvL3NlcnZpY2Vfb3ZlcmlkZV9sb2NrZWRfcGFyYS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzZXJ2aWNlIG5hbWU9IlNlcnZpY2UxIj4KLSAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgIFRoaXMgaXMgYSB0ZXN0aW5nIHNlcnZpY2UgLCB0byB0ZXN0IHRoZSBzeXN0ZW0gaXMgd29ya2luZyBvciBub3QKLSAgICA8L2Rlc2NyaXB0aW9uPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iU2VydmljZVBhcmEyIiBsb2NrZWQ9InRydWUiPm9yZy5hcGFjaGUuYXhpczIuc2FtcGxlLmVjaG8uRWNob0ltcGw8L3BhcmFtZXRlcj4KLTwvc2VydmljZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9QYXJhTG9ja2VkUmVwby9zZXJ2aWNlX292ZXJpZGVfbm9uX2xvY2tlZF9wYXJhLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L1BhcmFMb2NrZWRSZXBvL3NlcnZpY2Vfb3ZlcmlkZV9ub25fbG9ja2VkX3BhcmEueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjJkZDdhLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L1BhcmFMb2NrZWRSZXBvL3NlcnZpY2Vfb3ZlcmlkZV9ub25fbG9ja2VkX3BhcmEueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08c2VydmljZSBuYW1lPSJTZXJ2aWNlMSI+Ci0gICAgPGRlc2NyaXB0aW9uPgotICAgICAgICBUaGlzIGlzIGEgdGVzdGluZyBzZXJ2aWNlICwgdG8gdGVzdCB0aGUgc3lzdGVtIGlzIHdvcmtpbmcgb3Igbm90Ci0gICAgPC9kZXNjcmlwdGlvbj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9IlNlcnZpY2VQYXJhMSIgbG9ja2VkPSJ0cnVlIj5vcmcuYXBhY2hlLmF4aXMyLnNhbXBsZS5lY2hvLkVjaG9JbXBsPC9wYXJhbWV0ZXI+Ci08L3NlcnZpY2U+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvU3lzdGVtUGhhc2VSZW1vdmUvYXhpczIueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvU3lzdGVtUGhhc2VSZW1vdmUvYXhpczIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTZjYjg2Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L1N5c3RlbVBoYXNlUmVtb3ZlL2F4aXMyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGF4aXNjb25maWcgbmFtZT0iQXhpc0phdmEyLjAiPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iaG90ZGVwbG95bWVudCI+dHJ1ZTwvcGFyYW1ldGVyPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iaG90dXBkYXRlIj50cnVlPC9wYXJhbWV0ZXI+Ci0KLSAgICA8bWVzc2FnZVJlY2VpdmVyIG1lcD0iSU5PVVQiIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5SYXdYTUxJTk91dE1lc3NhZ2VSZWNlaXZlciIvPgotCi0gIAotICAgICA8dHJhbnNwb3J0U2VuZGVyIG5hbWU9Imh0dHAiIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkNvbW1vbnNIVFRQVHJhbnNwb3J0U2VuZGVyIj4KLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJQUk9UT0NPTCI+SFRUUC8xLjA8L3BhcmFtZXRlcj4KLSAgICA8L3RyYW5zcG9ydFNlbmRlcj4KLQotICAgIDxwaGFzZU9yZGVyIHR5cGU9IkluRmxvdyI+Ci0gICAgICAgIDwhLS0gIFN5c3RlbSBwcmUgZGVmaW5lZCBwaGFzZXMgICAgICAgLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJUcmFuc3BvcnRJbiIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iUHJlRGlzcGF0Y2giLz4KLSAgICAgICAgPCEtLSAgU3lzdGVtIHByZSBkZWZpbmVkIHBoYXNlcyAgICAgICAtLT4KLSAgICAgICAgPCEtLSAgIEFmdGVyIFBvc3RkaXNwYXRjaCBwaGFzZSBtb2R1bGUgYXV0aG9yIG9yIG9yIHNlcnZpY2UgYXV0aG9yIGNhbiBhZGQgYW55IHBoYXNlIGhlIHdhbnQgICAgICAtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9InVzZXJwaGFzZTEiLz4KLSAgICA8L3BoYXNlT3JkZXI+Ci0gICAgPHBoYXNlT3JkZXIgdHlwZT0iT3V0RmxvdyI+Ci0gICAgICAgIDwhLS0gICAgICB1c2VyIGNhbiBhZGQgaGlzIG93biBwaGFzZXMgdG8gdGhpcyBhcmVhICAtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9InVzZXJwaGFzZTEiLz4KLSAgICA8L3BoYXNlT3JkZXI+Ci0gICAgPHBoYXNlT3JkZXIgdHlwZT0iSW5GYXVsdEZsb3ciPgotICAgICAgICA8IS0tICAgICAgdXNlciBjYW4gYWRkIGhpcyBvd24gcGhhc2VzIHRvIHRoaXMgYXJlYSAgLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJ1c2VycGhhc2UxIi8+Ci0gICAgPC9waGFzZU9yZGVyPgotICAgIDxwaGFzZU9yZGVyIHR5cGU9Ik91dEZhdWx0RmxvdyI+Ci0gICAgICAgIDwhLS0gICAgICB1c2VyIGNhbiBhZGQgaGlzIG93biBwaGFzZXMgdG8gdGhpcyBhcmVhICAtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9InVzZXJwaGFzZTEiLz4KLSAgICA8L3BoYXNlT3JkZXI+Ci08L2F4aXNjb25maWc+Ci0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L2F4aXMyLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L2F4aXMyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYxYmYyYi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9heGlzMi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxheGlzY29uZmlnIG5hbWU9IkF4aXNKYXZhMi4wIj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImhvdGRlcGxveW1lbnQiPnRydWU8L3BhcmFtZXRlcj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImhvdHVwZGF0ZSI+dHJ1ZTwvcGFyYW1ldGVyPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iRmF2b3JpdGVDb2xvciI+cHVycGxlPC9wYXJhbWV0ZXI+Ci0KLSAgICA8bWVzc2FnZVJlY2VpdmVyIG1lcD0iSU5PVVQiIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5SYXdYTUxJTk91dE1lc3NhZ2VSZWNlaXZlciIvPgotCi0gICAgCi0gICAgPHBoYXNlT3JkZXIgdHlwZT0iSW5GbG93Ij4KLSAgICAgICAgPCEtLSAgU3lzdGVtIHByZSBkZWZpbmVkIHBoYXNlcyAgICAgICAtLT4KLSAgICAgICAgIDxwaGFzZSBuYW1lPSJUcmFuc3BvcnQiPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiLz4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIi8+Ci0gICAgICAgIDwvcGhhc2U+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJTZWN1cml0eSIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iUHJlRGlzcGF0Y2giLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9IkRpc3BhdGNoIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuRGlzcGF0Y2hQaGFzZSI+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJBZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciIvPgotCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiLz4KLSAgICAgICAgPC9waGFzZT4KLSAgICAgICAgPCEtLSAgU3lzdGVtIHByZSBkZWZpbmVkIHBoYXNlcyAgICAgICAtLT4KLSAgICAgICAgPCEtLSAgIEFmdGVyIFBvc3RkaXNwYXRjaCBwaGFzZSBtb2R1bGUgYXV0aG9yIG9yIG9yIHNlcnZpY2UgYXV0aG9yIGNhbiBhZGQgYW55IHBoYXNlIGhlIHdhbnQgICAgICAtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik9wZXJhdGlvbkluUGhhc2UiLz4KLSAgICA8L3BoYXNlT3JkZXI+Ci0gICAgPHBoYXNlT3JkZXIgdHlwZT0iT3V0RmxvdyI+Ci0gICAgICAgIDwhLS0gICAgICB1c2VyIGNhbiBhZGQgaGlzIG93biBwaGFzZXMgdG8gdGhpcyBhcmVhICAtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik9wZXJhdGlvbk91dFBoYXNlIi8+Ci0gICAgICAgIDwhLS1zeXN0ZW0gcHJlZGVmaW5lZCBwaGFzZS0tPgotICAgICAgICA8IS0tdGhlc2UgcGhhc2Ugd2lsbCBydW4gaXJyZXNwZWN0aXZlIG9mIHRoZSBzZXJ2aWNlLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJQb2xpY3lEZXRlcm1pbmF0aW9uIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJNZXNzYWdlT3V0Ii8+Ci0gICAgPC9waGFzZU9yZGVyPgotICAgIDxwaGFzZU9yZGVyIHR5cGU9IkluRmF1bHRGbG93Ij4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlByZURpc3BhdGNoIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJEaXNwYXRjaCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkRpc3BhdGNoUGhhc2UiPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiLz4KLQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiLz4KLQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiLz4KLQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIi8+Ci0gICAgICAgIDwvcGhhc2U+Ci0gICAgICAgIDwhLS0gICAgICB1c2VyIGNhbiBhZGQgaGlzIG93biBwaGFzZXMgdG8gdGhpcyBhcmVhICAtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik9wZXJhdGlvbkluRmF1bHRQaGFzZSIvPgotICAgIDwvcGhhc2VPcmRlcj4KLSAgICA8cGhhc2VPcmRlciB0eXBlPSJPdXRGYXVsdEZsb3ciPgotICAgICAgICA8IS0tICAgICAgdXNlciBjYW4gYWRkIGhpcyBvd24gcGhhc2VzIHRvIHRoaXMgYXJlYSAgLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJPcGVyYXRpb25PdXRGYXVsdFBoYXNlIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJQb2xpY3lEZXRlcm1pbmF0aW9uIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJNZXNzYWdlT3V0Ii8+Ci0gICAgPC9waGFzZU9yZGVyPgotCi08L2F4aXNjb25maWc+Ci0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L2F4aXMyX2EueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvYXhpczJfYS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmNzVlYWIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvYXhpczJfYS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxODQgKzAsMCBAQAotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPGF4aXNjb25maWcgbmFtZT0iQXhpc0phdmEyLjAiPg0KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImhvdGRlcGxveW1lbnQiPnRydWU8L3BhcmFtZXRlcj4NCi0gICAgPHBhcmFtZXRlciBuYW1lPSJob3R1cGRhdGUiPmZhbHNlPC9wYXJhbWV0ZXI+DQotICAgIDxwYXJhbWV0ZXIgbmFtZT0iZW5hYmxlTVRPTSI+ZmFsc2U8L3BhcmFtZXRlcj4NCi0gICAgPHBhcmFtZXRlciBuYW1lPSJlbmFibGVTd0EiPmZhbHNlPC9wYXJhbWV0ZXI+DQotDQotICAgIDwhLS1VbmNvbW1lbnQgaWYgeW91IHdhbnQgdG8gZW5hYmxlIHRoZSByZWR1Y3Rpb24gb2YgdGhlIGluLW1lbW9yeSBjYWNoZSBvZiBXU0RMIGRlZmluaXRpb25zIC0tPg0KLSAgICA8IS0tSW4gc29tZSBzZXJ2ZXIgZW52aXJvbm1lbnRzLCB0aGUgYXZhaWxhYmxlIG1lbW9yeSBoZWFwIGlzIGxpbWl0ZWQgYW5kIGNhbiBmaWxsIHVwIHVuZGVyIGxvYWQgLS0+DQotICAgIDwhLS1TaW5jZSBpbi1tZW1vcnkgY29waWVzIG9mIFdTREwgZGVmaW5pdGlvbnMgY2FuIGJlIGxhcmdlLCBzb21lIHN0ZXBzIGNhbiBiZSB0YWtlbi0tPg0KLSAgICA8IS0tdG8gcmVkdWNlIHRoZSBtZW1vcnkgbmVlZGVkIGZvciB0aGUgY2FjaGVkIFdTREwgZGVmaW5pdGlvbnMuIC0tPg0KLSAgICA8cGFyYW1ldGVyIG5hbWU9InJlZHVjZVdTRExNZW1vcnlDYWNoZSI+dHJ1ZTwvcGFyYW1ldGVyPg0KLSAgICA8cGFyYW1ldGVyIG5hbWU9InJlZHVjZVdTRExNZW1vcnlUeXBlIj4xPC9wYXJhbWV0ZXI+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICA8IS0tVGhpcyB3aWxsIGdpdmUgb3V0IHRoZSB0aW1vdXQgb2YgdGhlIGNvbmZpZ3VyYXRpb24gY29udGV4dHMsIGluIG1pbGxpc2Vjb25kcy0tPg0KLSAgICA8cGFyYW1ldGVyIG5hbWU9IkNvbmZpZ0NvbnRleHRUaW1lb3V0SW50ZXJ2YWwiPjMwMDAwPC9wYXJhbWV0ZXI+DQotDQotICAgIDwhLS1EdXJpbmcgYSBmYXVsdCwgc3RhY2sgdHJhY2UgY2FuIGJlIHNlbnQgd2l0aCB0aGUgZmF1bHQgbWVzc2FnZS4gVGhlIGZvbGxvd2luZyBmbGFnIHdpbGwgY29udHJvbCAtLT4NCi0gICAgPCEtLXRoYXQgYmVoYXZpb3IuLS0+DQotICAgIDxwYXJhbWV0ZXIgbmFtZT0ic2VuZFN0YWNrdHJhY2VEZXRhaWxzV2l0aEZhdWx0cyI+ZmFsc2U8L3BhcmFtZXRlcj4NCi0NCi0gICAgPCEtLUlmIHRoZXJlIGFyZW4ndCBhbnkgaW5mb3JtYXRpb24gYXZhaWxhYmxlIHRvIGZpbmQgb3V0IHRoZSBmYXVsdCByZWFzb24sIHdlIHNldCB0aGUgbWVzc2FnZSBvZiB0aGUgZXhjZXB0aW9uLS0+DQotICAgIDwhLS1hcyB0aGUgZmF1bHRyZWFzb24vUmVhc29uLiBCdXQgd2hlbiBhIGZhdWx0IGlzIHRocm93biBmcm9tIGEgc2VydmljZSBvciBzb21lIHdoZXJlLCBpdCB3aWxsIGJlIC0tPg0KLSAgICA8IS0td3JhcHBlZCBieSBkaWZmZXJlbnQgbGV2ZWxzLiBEdWUgdG8gdGhpcyB0aGUgaW5pdGlhbCBleGNlcHRpb24gbWVzc2FnZSBjYW4gYmUgbG9zdC4gSWYgdGhpcyBmbGFnLS0+DQotICAgIDwhLS1pcyBzZXQsIHRoZW4gQXhpczIgdHJpZXMgdG8gZ2V0IHRoZSBmaXJzdCBleGNlcHRpb24gYW5kIHNldCBpdHMgbWVzc2FnZSBhcyB0aGUgZmF1bHRyZWFzb24vUmVhc29uLi0tPg0KLSAgICA8cGFyYW1ldGVyIG5hbWU9IkRyaWxsRG93blRvUm9vdENhdXNlRm9yRmF1bHRSZWFzb24iPmZhbHNlPC9wYXJhbWV0ZXI+DQotDQotICAgIDxwYXJhbWV0ZXIgbmFtZT0idXNlck5hbWUiPmFkbWluPC9wYXJhbWV0ZXI+DQotICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFzc3dvcmQiPmF4aXMyPC9wYXJhbWV0ZXI+DQotDQotICAgIDwhLS0gRm9sbG93aW5nIHBhcmFtZXRlciB3aWxsIGNvbXBsZXRlbHkgZGlzYWJsZSBSRVNUIGhhbmRsaW5nIGluIEF4aXMyLS0+DQotICAgIDxwYXJhbWV0ZXIgbmFtZT0iZGlzYWJsZVJFU1QiIGxvY2tlZD0idHJ1ZSI+ZmFsc2U8L3BhcmFtZXRlcj4NCi0NCi0gICAgPCEtLVBPSk8gZGVwbG95ZXIgLCB0aGlzIHdpbGwgYWxvdyB1c2VycyB0byBkcm9wIC5jbGFzcyBmaWxlIGFuZCBtYWtlIHRoYXQgaW50byBhIHNlcnZpY2UtLT4NCi0gICAgPGRlcGxveWVyIGV4dGVuc2lvbj0iLmNsYXNzIiBkaXJlY3Rvcnk9InBvam8iIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQuUE9KT0RlcGxveWVyIi8+DQotICAgIDxkZXBsb3llciBleHRlbnNpb249Ii5qc2EiIGRpcmVjdG9yeT0icm1pc2VydmljZXMiIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJtaS5kZXBsb3kuUk1JU2VydmljZURlcGxveWVyIi8+DQotICAgIA0KLQ0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+DQotICAgIDwhLS0gTWVzc2FnZSBSZWNlaXZlcnMgLS0+DQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4NCi0gICAgPCEtLVRoaXMgaXMgdGhlIGRlYWZ1bHQgTWVzc2FnZVJlY2VpdmVyIGZvciB0aGUgc3lzdGVtICwgaWYgeW91IHdhbnQgdG8gaGF2ZSBNZXNzYWdlUmVjZWl2ZXJzIGZvciAtLT4NCi0gICAgPCEtLWFsbCB0aGUgb3RoZXIgTUVQIGltcGxlbWVudCBpdCBhbmQgYWRkIHRoZSBjb3JyZWN0IGVudHJ5IHRvIGhlcmUgLCBzbyB0aGF0IHlvdSBjYW4gcmVmZXIgZnJvbS0tPg0KLSAgICA8IS0tYW55IG9wZXJhdGlvbiAtLT4NCi0gICAgPCEtLU5vdGUgOiBZb3UgY2FuIG92cnJpZGUgdGhpcyBmb3IgYSBwYXJ0aWN1bGFyIHNlcnZpY2UgYnkgYWRkaW5nIHRoZSBzYW1lIGVsZW1lbnQgd2l0aCB5b3VyIHJlcXVpcmVtZW50LS0+DQotICAgICA8bWVzc2FnZVJlY2VpdmVycz4NCi0gICAgICAgIDxtZXNzYWdlUmVjZWl2ZXIgbWVwPSJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaW4tb25seSINCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLlJhd1hNTElOT25seU1lc3NhZ2VSZWNlaXZlciIvPg0KLSAgICAgICAgPG1lc3NhZ2VSZWNlaXZlciBtZXA9Imh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgvd3NkbC9pbi1vdXQiDQotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5SYXdYTUxJTk91dE1lc3NhZ2VSZWNlaXZlciIvPg0KLSAgICAgICAgPG1lc3NhZ2VSZWNlaXZlciBtZXA9Imh0dHA6Ly93d3cudzMub3JnLzIwMDYvMDEvd3NkbC9pbi1vbmx5Ig0KLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuUmF3WE1MSU5Pbmx5TWVzc2FnZVJlY2VpdmVyIi8+DQotICAgICAgICA8bWVzc2FnZVJlY2VpdmVyIG1lcD0iaHR0cDovL3d3dy53My5vcmcvMjAwNi8wMS93c2RsL2luLW91dCINCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLlJhd1hNTElOT3V0TWVzc2FnZVJlY2VpdmVyIi8+DQotICAgIDwvbWVzc2FnZVJlY2VpdmVycz4NCi0NCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPg0KLSAgICA8IS0tIE1lc3NhZ2UgRm9ybWF0dGVyIC0tPg0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+DQotICAgIDwhLS1Gb2xsb3dpbmcgY29udGVudCB0eXBlIHRvIG1lc3NhZ2UgZm9ybWF0dGVyIG1hcHBpbmcgY2FuIGJlIHVzZWQgdG8gaW1wbGVtZW50IHN1cHBvcnQgZm9yIGRpZmZlcmVudCBtZXNzYWdlIC0tPg0KLSAgICA8IS0tZm9ybWF0ICBzZXJpYWxpemF0aW9uIGluIEF4aXMyLiBUaGVzZSBtZXNzYWdlIGZvcm1hdHMgYXJlIGV4cGVjdGVkIHRvIGJlIHJlc29sdmVkIGJhc2VkIG9uIHRoZSBjb250ZW50IHR5cGUuIC0tPg0KLSAgICA8bWVzc2FnZUZvcm1hdHRlcnM+DQotICAgICAgICA8bWVzc2FnZUZvcm1hdHRlciBjb250ZW50VHlwZT0iYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5YRm9ybVVSTEVuY29kZWRGb3JtYXR0ZXIiLz4NCi0gICAgICAgIDxtZXNzYWdlRm9ybWF0dGVyIGNvbnRlbnRUeXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5NdWx0aXBhcnRGb3JtRGF0YUZvcm1hdHRlciIvPg0KLSAgICAgICAgPG1lc3NhZ2VGb3JtYXR0ZXIgY29udGVudFR5cGU9ImFwcGxpY2F0aW9uL3htbCINCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuQXBwbGljYXRpb25YTUxGb3JtYXR0ZXIiLz4NCi0gICAgPC9tZXNzYWdlRm9ybWF0dGVycz4NCi0NCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPg0KLSAgICA8IS0tIE1lc3NhZ2UgQnVpbGRlcnMgLS0+DQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4NCi0gICAgPCEtLUZvbGxvd2luZyBjb250ZW50IHR5cGUgdG8gYnVpbGRlciBtYXBwaW5nIGNhbiBiZSB1c2VkIHRvIGltcGxlbWVudCBzdXBwb3J0IGZvciBkaWZmZXJlbnQgbWVzc2FnZSAtLT4NCi0gICAgPCEtLWZvcm1hdHMgaW4gQXhpczIuIFRoZXNlIG1lc3NhZ2UgZm9ybWF0cyBhcmUgZXhwZWN0ZWQgdG8gYmUgcmVzb2x2ZWQgYmFzZWQgb24gdGhlIGNvbnRlbnQgdHlwZS4gLS0+DQotICAgIDxtZXNzYWdlQnVpbGRlcnM+DQotICAgICAgICA8bWVzc2FnZUJ1aWxkZXIgY29udGVudFR5cGU9ImFwcGxpY2F0aW9uL3htbCINCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuYnVpbGRlci5BcHBsaWNhdGlvblhNTEJ1aWxkZXIiLz4NCi0gICAgICAgIDxtZXNzYWdlQnVpbGRlciBjb250ZW50VHlwZT0iYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5idWlsZGVyLlhGb3JtVVJMRW5jb2RlZEJ1aWxkZXIiLz4NCi0gICAgICAgIDxtZXNzYWdlQnVpbGRlciBjb250ZW50VHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSINCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuYnVpbGRlci5NdWx0aXBhcnRGb3JtRGF0YUJ1aWxkZXIiLz4NCi0gICAgPC9tZXNzYWdlQnVpbGRlcnM+DQotDQotDQotDQotDQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4NCi0gICAgPCEtLSBQaGFzZXMgIC0tPg0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+DQotICAgIDxwaGFzZU9yZGVyIHR5cGU9IkluRmxvdyI+DQotICAgICAgICA8IS0tICBTeXN0ZW0gcHJlZGVmaW5lZCBwaGFzZXMgICAgICAgLS0+DQotICAgICAgICA8cGhhc2UgbmFtZT0iVHJhbnNwb3J0Ij4NCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJSZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiPg0KLSAgICAgICAgICAgICAgICA8b3JkZXIgcGhhc2U9IlRyYW5zcG9ydCIvPg0KLSAgICAgICAgICAgIDwvaGFuZGxlcj4NCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiPg0KLSAgICAgICAgICAgICAgICA8b3JkZXIgcGhhc2U9IlRyYW5zcG9ydCIvPg0KLSAgICAgICAgICAgIDwvaGFuZGxlcj4NCi0gICAgICAgIDwvcGhhc2U+DQotICAgICAgICA8cGhhc2UgbmFtZT0iU2VjdXJpdHkiLz4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJQcmVEaXNwYXRjaCIvPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9IkRpc3BhdGNoIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuRGlzcGF0Y2hQaGFzZSI+DQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5SZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIi8+DQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIi8+DQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iUmVxdWVzdFVSSU9wZXJhdGlvbkRpc3BhdGNoZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSU9wZXJhdGlvbkRpc3BhdGNoZXIiLz4NCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIi8+DQotDQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iSFRUUExvY2F0aW9uQmFzZWREaXNwYXRjaGVyIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLkhUVFBMb2NhdGlvbkJhc2VkRGlzcGF0Y2hlciIvPg0KLSAgICAgICAgPC9waGFzZT4NCi0gICAgICAgIDwhLS0gIFN5c3RlbSBwcmVkZWZpbmVkIHBoYXNlcyAgICAgICAtLT4NCi0gICAgICAgIDwhLS0gICBBZnRlciBQb3N0ZGlzcGF0Y2ggcGhhc2UgbW9kdWxlIGF1dGhvciBvciBzZXJ2aWNlIGF1dGhvciBjYW4gYWRkIGFueSBwaGFzZSBoZSB3YW50ICAgICAgLS0+DQotICAgICAgICA8cGhhc2UgbmFtZT0iT3BlcmF0aW9uSW5QaGFzZSIvPg0KLSAgICA8L3BoYXNlT3JkZXI+DQotICAgIDxwaGFzZU9yZGVyIHR5cGU9Ik91dEZsb3ciPg0KLSAgICAgICAgPCEtLSAgICAgIHVzZXIgY2FuIGFkZCBoaXMgb3duIHBoYXNlcyB0byB0aGlzIGFyZWEgIC0tPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik9wZXJhdGlvbk91dFBoYXNlIi8+DQotICAgICAgICA8IS0tc3lzdGVtIHByZWRlZmluZWQgcGhhc2UtLT4NCi0gICAgICAgIDwhLS10aGVzZSBwaGFzZSB3aWxsIHJ1biBpcnJlc3BlY3RpdmUgb2YgdGhlIHNlcnZpY2UtLT4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJQb2xpY3lEZXRlcm1pbmF0aW9uIi8+DQotICAgICAgICA8cGhhc2UgbmFtZT0iTWVzc2FnZU91dCIvPg0KLSAgICA8L3BoYXNlT3JkZXI+DQotICAgIDxwaGFzZU9yZGVyIHR5cGU9IkluRmF1bHRGbG93Ij4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJBZGRyZXNzaW5nIj4NCi0gICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5BZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIj4NCi0gICAgICAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iQWRkcmVzc2luZyIvPg0KLSAgICAgICAgICAgIDwvaGFuZGxlcj4NCi0gICAgICAgIDwvcGhhc2U+DQotICAgICAgICA8cGhhc2UgbmFtZT0iU2VjdXJpdHkiLz4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJQcmVEaXNwYXRjaCIvPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9IkRpc3BhdGNoIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuRGlzcGF0Y2hQaGFzZSI+DQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5SZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIi8+DQotDQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIi8+DQotDQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iUmVxdWVzdFVSSU9wZXJhdGlvbkRpc3BhdGNoZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSU9wZXJhdGlvbkRpc3BhdGNoZXIiLz4NCi0NCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIi8+DQotDQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iSFRUUExvY2F0aW9uQmFzZWREaXNwYXRjaGVyIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLkhUVFBMb2NhdGlvbkJhc2VkRGlzcGF0Y2hlciIvPg0KLSAgICAgICAgPC9waGFzZT4NCi0gICAgICAgIDwhLS0gICAgICB1c2VyIGNhbiBhZGQgaGlzIG93biBwaGFzZXMgdG8gdGhpcyBhcmVhICAtLT4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJPcGVyYXRpb25JbkZhdWx0UGhhc2UiLz4NCi0gICAgPC9waGFzZU9yZGVyPg0KLSAgICA8cGhhc2VPcmRlciB0eXBlPSJPdXRGYXVsdEZsb3ciPg0KLSAgICAgICAgPCEtLSAgICAgIHVzZXIgY2FuIGFkZCBoaXMgb3duIHBoYXNlcyB0byB0aGlzIGFyZWEgIC0tPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik9wZXJhdGlvbk91dEZhdWx0UGhhc2UiLz4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJQb2xpY3lEZXRlcm1pbmF0aW9uIi8+DQotICAgICAgICA8cGhhc2UgbmFtZT0iTWVzc2FnZU91dCIvPg0KLSAgICA8L3BoYXNlT3JkZXI+DQotDQotPC9heGlzY29uZmlnPg0KLQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L2J1aWxkZXJTZWxlY3RvclRlc3QvYXhpczIueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvYnVpbGRlclNlbGVjdG9yVGVzdC9heGlzMi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4ZDgwNDYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvYnVpbGRlclNlbGVjdG9yVGVzdC9heGlzMi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNTggKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotIAotPGF4aXNjb25maWcgbmFtZT0iQXhpc0phdmEyLjAiPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIFBhcmFtZXRlcnMgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iaG90ZGVwbG95bWVudCI+dHJ1ZTwvcGFyYW1ldGVyPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iaG90dXBkYXRlIj5mYWxzZTwvcGFyYW1ldGVyPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iZW5hYmxlTVRPTSI+ZmFsc2U8L3BhcmFtZXRlcj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImVuYWJsZVN3QSI+ZmFsc2U8L3BhcmFtZXRlcj4KLQotICAgIDwhLS1VbmNvbW1lbnQgaWYgeW91IHdhbnQgdG8gZW5hYmxlIGZpbGUgY2FjaGluZyBmb3IgYXR0YWNobWVudHMgLS0+Ci0gICAgPCEtLXBhcmFtZXRlciBuYW1lPSJjYWNoZUF0dGFjaG1lbnRzIj50cnVlPC9wYXJhbWV0ZXI+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJhdHRhY2htZW50RElSIj48L3BhcmFtZXRlcj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9InNpemVUaHJlc2hvbGQiPjQwMDA8L3BhcmFtZXRlci0tPgotCi0gICAgPCEtLVRoaXMgd2lsbCBnaXZlIG91dCB0aGUgdGltb3V0IG9mIHRoZSBjb25maWd1cmF0aW9uIGNvbnRleHRzLCBpbiBzZWNvbmRzLS0+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJDb25maWdDb250ZXh0VGltZW91dEludGVydmFsIj4zMDwvcGFyYW1ldGVyPgotCi0gICAgPCEtLUR1cmluZyBhIGZhdWx0LCBzdGFja3RyYWNlIGNhbiBiZSBzZW50IHdpdGggdGhlIGZhdWx0IG1lc3NhZ2UuIFRoZSBmb2xsb3dpbmcgZmxhZyB3aWxsIGNvbnRyb2wgLS0+Ci0gICAgPCEtLXRoYXQgYmVoYXZpb3VyLi0tPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0ic2VuZFN0YWNrdHJhY2VEZXRhaWxzV2l0aEZhdWx0cyI+ZmFsc2U8L3BhcmFtZXRlcj4KLQotICAgIDwhLS1JZiB0aGVyZSBhcmVuJ3QgYW55IGluZm9ybWF0aW9uIGF2YWlsYWJsZSB0byBmaW5kIG91dCB0aGUgZmF1bHQgcmVhc29uLCB3ZSBzZXQgdGhlIG1lc3NhZ2Ugb2YgdGhlIGV4cGNldGlvbi0tPgotICAgIDwhLS1hcyB0aGUgZmF1bHRyZWFzb24vUmVhc29uLiBCdXQgd2hlbiBhIGZhdWx0IGlzIHRocm93biBmcm9tIGEgc2VydmljZSBvciBzb21lIHdoZXJlLCBpdCB3aWxsIGJlIC0tPgotICAgIDwhLS13cmFwcGVkIGJ5IGRpZmZlcmVudCBsZXZlbHMuIER1ZSB0byB0aGlzIHRoZSBpbml0aWFsIGV4Y2VwdGlvbiBtZXNzYWdlIGNhbiBiZSBsb3N0LiBJZiB0aGlzIGZsYWctLT4KLSAgICA8IS0taXMgc2V0IHRoZW4sIEF4aXMyIHRyaWVzIHRvIGdldCB0aGUgZmlyc3QgZXhjZXB0aW9uIGFuZCBzZXQgaXRzIG1lc3NhZ2UgYXMgdGhlIGZhdWx0cmVhc29uL1JlYXNvbi4tLT4KLSAgICA8cGFyYW1ldGVyIG5hbWU9IkRyaWxsRG93blRvUm9vdENhdXNlRm9yRmF1bHRSZWFzb24iPmZhbHNlPC9wYXJhbWV0ZXI+Ci0KLSAgICA8cGFyYW1ldGVyIG5hbWU9InVzZXJOYW1lIj5hZG1pbjwvcGFyYW1ldGVyPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFzc3dvcmQiPmF4aXMyPC9wYXJhbWV0ZXI+Ci0KLSAgICA8IS0tVG8gb3ZlcnJpZGUgcmVwb3NpdG9yeS9zZXJ2aWNlcyB5b3UgbmVlZCB0byB1bmNvbW1lbnQgZm9sbG93aW5nIHBhcmFtZXRlciBhbmQgdmFsdWUgU0hPVUxEIGJlIGFic29sdXRlIGZpbGUgcGF0aC4tLT4KLSAgICA8IS0tPHBhcmFtZXRlciBuYW1lPSJTZXJ2aWNlc0RpcmVjdG9yeSI+c2VydmljZTwvcGFyYW1ldGVyPi0tPgotICAgIDwhLS1UbyBvdmVycmlkZSByZXBvc2l0b3J5L21vZHVsZXMgeW91IG5lZWQgdG8gdW5jb21tZW50IGZvbGxvd2luZyBwYXJhbWV0ZXIgYW5kIHZhbHVlIFNIT1VMRCBiZSBhYnNvbHV0ZSBmaWxlIHBhdGgtLT4KLSAgICA8IS0tPHBhcmFtZXRlciBuYW1lPSJNb2R1bGVzRGlyZWN0b3J5Ij5tb2R1bGVzPC9wYXJhbWV0ZXI+LS0+Ci0KLQotCi0gICAgPCEtLUZvbGxvd2luZyBwYXJhbXMgd2lsbCBzZXQgdGhlIHByb3BlciBjb250ZXh0IHBhdGhzIGZvciBpbnZvY2F0aW9ucy4gQWxsIHRoZSBlbmRwb2ludHMgd2lsbCBoYXZlIGEgY29tbW9ucyBjb250ZXh0LS0+Ci0gICAgPCEtLXJvb3Qgd2hpY2ggY2FuIGNvbmZpZ3VyZWQgdXNpbmcgdGhlIGZvbGxvd2luZyBjb250ZXh0Um9vdCBwYXJhbWV0ZXItLT4KLSAgICA8IS0tPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0Um9vdCI+YXhpczI8L3BhcmFtZXRlcj4tLT4KLQotICAgIDwhLS1PdXIgSFRUUCBlbmRwb2ludHMgY2FuIGhhbmRsZSBib3RoIFJFU1QgYW5kIFNPQVAuIEZvbGxvd2luZyBwYXJhbWV0ZXJzIGNhbiBiZSB1c2VkIHRvIGRpc3RpbmdpdXNoIHRob3NlIGVuZHBvaW50cy0tPgotICAgIDwhLS1JbiBjYXNlIG9mIGEgc2VydmxldCwgaWYgeW91IGNoYW5nZSB0aGlzIHlvdSBoYXZlIHRvIG1hbnVhbGx5IGNoYW5nZSB0aGUgc2V0dGluZ3Mgb2YgeW91ciBzZXJ2bGV0IGNvbnRhaW5lciB0byBtYXAgdGhpcyAtLT4KLSAgICA8IS0tY29udGV4dCBwYXRoIHRvIHByb3BlciBBeGlzMiBzZXJ2bGV0cy0tPgotICAgIDwhLS08cGFyYW1ldGVyIG5hbWU9InNlcnZpY2VQYXRoIj5zZXJ2aWNlczwvcGFyYW1ldGVyPi0tPgotICAgIDwhLS08cGFyYW1ldGVyIG5hbWU9InJlc3RQYXRoIj5yZXN0PC9wYXJhbWV0ZXI+LS0+Ci0KLQotICAgIDwhLS1TZXQgdGhlIGZsYWcgdG8gdHJ1ZSBpZiB5b3Ugd2FudCB0byBlbmFibGUgdHJhbnNwb3J0IGxldmVsIHNlc3Npb24gbWFuZ21lbnQtLT4KLSAgICA8cGFyYW1ldGVyIG5hbWU9Im1hbmFnZVRyYW5zcG9ydFNlc3Npb24iPmZhbHNlPC9wYXJhbWV0ZXI+Ci0KLSAgICA8IS0tRm9sbG93aW5nIHR3byBwYXJhbWV0ZXJzIHdpbGwgYmUgdXNlZCB0byBoYW5kbGUgUkVTVCBpbiBBeGlzMi4gVGhlIGRlZmF1bHQgc2V0dGluZ3Mgd2lsbCBtYWtlIEF4aXMyIHRvIGhhdmUgdHdvLS0+Ci0gICAgPCEtLWRpZmZlcmVudCBlbmRwb2ludHMsIG9uZSBmb3IgUkVTVCAoQXhpc1JFU1RTZXJ2bGV0KSBvbmUgZm9yIFNPQVAgbWVzc2FnZSBoYW5kbGluZyAoQXhpc1NlcnZsZXQpLiBCdXQgZm9sbG93aW5nLS0+Ci0gICAgPCEtLXBhcmFtZXRlcnMgaGVscCB0byB0d2VhayB0aGUgbWVzc2FnZSBoYW5kbGluZyBvZiB0d28gbWFpbiBzZXJ2bGV0cy4gLS0+Ci0KLSAgICA8IS0tIElmIHRoZSBlbmFibGVSRVNUSW5BeGlzMk1haW5TZXJ2bGV0IGlzIHRydWUsIHRoZW4gQXhpczJNYWluU2VydmxldCB3aWxsIGhhbmRsZSBib3RoIFNPQVAgYW5kIFJFU1QgbWVzc2FnZXMgLS0+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJlbmFibGVSRVNUSW5BeGlzMk1haW5TZXJ2bGV0IiBsb2NrZWQ9InRydWUiPmZhbHNlPC9wYXJhbWV0ZXI+Ci0KLSAgICA8IS0tIEZvbGxvd2luZyBwYXJhbWV0ZXIgd2lsbCBjb21wbGV0ZWx5IGRpc2FibGUgUkVTVCBoYW5kbGluZyBpbiBib3RoIHRoZSBzZXJ2bGV0cy0tPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iZGlzYWJsZVJFU1QiIGxvY2tlZD0idHJ1ZSI+ZmFsc2U8L3BhcmFtZXRlcj4KLQotICAgIDwhLS0gVGhpcyB3aWxsIGRpc2FibGUgdGhlIHNlcGFyYXRlIHNlcnZsZXQgd2UgaGF2ZSBmb3IgUkVTVCBoYW5kbGluZy4gLS0+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJkaXNhYmxlU2VwYXJhdGVFbmRwb2ludEZvclJFU1QiIGxvY2tlZD0idHJ1ZSI+ZmFsc2U8L3BhcmFtZXRlcj4KLQotICAgIDwhLS0gSWYgeW91IGhhdmUgYSBmcm9udGVuZCBob3N0IHdoaWNoIGV4cG9zZXMgdGhpcyB3ZWJzZXJ2aWNlIHVzaW5nIGEgZGlmZmVyZW50IHB1YmxpYyBVUkwgIC0tPgotICAgIDwhLS0gdXNlIHRoaXMgcGFyYW1ldGVyIHRvIG92ZXJyaWRlIGF1dG9kZXRlY3RlZCB1cmwgLS0+Ci0gICAgPCEtLTxwYXJhbWV0ZXIgbmFtZT0iaHR0cEZyb250ZW5kSG9zdFVybCI+aHR0cHM6Ly9zb21lb3RoZXJob3N0L2NvbnRleHQ8L3BhcmFtZXRlcj4tLT4KLQotCi0gICAgPCEtLSAgICBUaGUgd2F5IG9mIGFkZGluZyBsaXN0ZW5lciB0byB0aGUgc3lzdGVtLS0+Ci0gICAgPCEtLSAgICA8bGlzdGVuZXIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuT2JzZXJ2ZXJJTVBMIj4tLT4KLSAgICA8IS0tICAgICAgICA8cGFyYW1ldGVyIG5hbWU9IlJTU19VUkwiPmh0dHA6Ly8xMjcuMC4wLjEvcnNzPC9wYXJhbWV0ZXI+LS0+Ci0gICAgPCEtLSAgICA8L2xpc3RlbmVyPi0tPgotCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gTWVzc2FnZSBSZWNlaXZlcnMgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS1UaGlzIGlzIHRoZSBEZWFmdWx0IE1lc3NhZ2UgUmVjZWl2ZXIgZm9yIHRoZSBzeXN0ZW0gLCBpZiB5b3Ugd2FudCB0byBoYXZlIE1lc3NhZ2VSZWNlaXZlcnMgZm9yIC0tPgotICAgIDwhLS1hbGwgdGhlIG90aGVyIE1FUCBpbXBsZW1lbnQgaXQgYW5kIGFkZCB0aGUgY29ycmVjdCBlbnRyeSB0byBoZXJlICwgc28gdGhhdCB5b3UgY2FuIHJlZmVyIGZyb20tLT4KLSAgICA8IS0tYW55IG9wZXJhdGlvbiAtLT4KLSAgICA8IS0tTm90ZSA6IFlvdSBjYW4gb3ZyaWRlIHRoaXMgZm9yIHBhcnRpY3VsYXIgc2VydmljZSBieSBhZGRpbmcgdGhlIHNhbWUgZWxlbWVudCB3aXRoIHlvdXIgcmVxdWlyZW1lbnQtLT4KLSAgICA8bWVzc2FnZVJlY2VpdmVycz4KLSAgICAgICAgPG1lc3NhZ2VSZWNlaXZlciBtZXA9Imh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgvd3NkbC9pbi1vbmx5IgotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5SYXdYTUxJTk9ubHlNZXNzYWdlUmVjZWl2ZXIiLz4KLSAgICAgICAgPG1lc3NhZ2VSZWNlaXZlciBtZXA9Imh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgvd3NkbC9pbi1vdXQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLlJhd1hNTElOT3V0TWVzc2FnZVJlY2VpdmVyIi8+Ci0gICAgPC9tZXNzYWdlUmVjZWl2ZXJzPgotICAgIAotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIE1lc3NhZ2UgQnVpbGRlcnMgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS1Gb2xsb3dpbmcgY29udGVudCB0eXBlIHRvIGJ1aWxkZXIgbWFwcGluZyBjYW4gYmUgdXNlZCB0byBpbXBsZW1lbnQgc3VwcG9ydCBmb3IgZGlmZmVyZW50IG1lc3NhZ2UgLS0+Ci0gICAgPCEtLWZvcm1hdHMgaW4gQXhpczIuIFRoZXNlIG1lc3NhZ2UgZm9ybWF0cyBhcmUgZXhwZWN0ZWQgdG8gYmUgcmVzb2x2ZWQgYmFzZWQgb24gdGhlIGNvbnRlbnQgdHlwZS4gLS0+Ci0gICAgPG1lc3NhZ2VCdWlsZGVycz4KLSAgICAgICAgPG1lc3NhZ2VCdWlsZGVyIGNvbnRlbnRUeXBlPSJ0ZXh0L3htbCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmJ1aWxkZXIuU3RBWE9NQnVpbGRlciIvPgotICAgICAgICA8bWVzc2FnZUJ1aWxkZXIgY29udGVudFR5cGU9ImFwcGxpY2F0aW9uL3NvYXAreG1sIgotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aW9tLnNvYXAuaW1wbC5idWlsZGVyLlN0QVhTT0FQTW9kZWxCdWlsZGVyIi8+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+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJQcmVEaXNwYXRjaCIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iRGlzcGF0Y2giIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5EaXNwYXRjaFBoYXNlIj4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5BZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIi8+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJSZXF1ZXN0VVJJT3BlcmF0aW9uRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklPcGVyYXRpb25EaXNwYXRjaGVyIi8+Ci0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciIvPgotICAgICAgICA8L3BoYXNlPgotICAgICAgICA8IS0tICBTeXN0ZW0gcHJlIGRlZmluZWQgcGhhc2VzICAgICAgIC0tPgotICAgICAgICA8IS0tICAgQWZ0ZXIgUG9zdGRpc3BhdGNoIHBoYXNlIG1vZHVsZSBhdXRob3Igb3Igb3Igc2VydmljZSBhdXRob3IgY2FuIGFkZCBhbnkgcGhhc2UgaGUgd2FudCAgICAgIC0tPgotICAgICAgICA8cGhhc2UgbmFtZT0iT3BlcmF0aW9uSW5QaGFzZSIvPgotCTxwaGFzZSBuYW1lPSJzb2FwbW9uaXRvclBoYXNlIi8+Ci0gICAgPC9waGFzZU9yZGVyPgotICAgIDxwaGFzZU9yZGVyIHR5cGU9Ik91dEZsb3ciPgotICAgICAgICA8IS0tICAgICAgdXNlciBjYW4gYWRkIGhpcyBvd24gcGhhc2VzIHRvIHRoaXMgYXJlYSAgLS0+Ci0JPHBoYXNlIG5hbWU9InNvYXBtb25pdG9yUGhhc2UiLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik9wZXJhdGlvbk91dFBoYXNlIi8+Ci0gICAgICAgIDwhLS1zeXN0ZW0gcHJlZGVmaW5lZCBwaGFzZS0tPgotICAgICAgICA8IS0tdGhlc2UgcGhhc2Ugd2lsbCBydW4gaXJyZXNwZWN0aXZlIG9mIHRoZSBzZXJ2aWNlLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJQb2xpY3lEZXRlcm1pbmF0aW9uIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJNZXNzYWdlT3V0Ii8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJTZWN1cml0eSIvPgotICAgIDwvcGhhc2VPcmRlcj4KLSAgICA8cGhhc2VPcmRlciB0eXBlPSJJbkZhdWx0RmxvdyI+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJQcmVEaXNwYXRjaCIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iRGlzcGF0Y2giIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5EaXNwYXRjaFBoYXNlIj4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5SZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIi8+Ci0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIi8+Ci0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5BZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIi8+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJSZXF1ZXN0VVJJT3BlcmF0aW9uRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklPcGVyYXRpb25EaXNwYXRjaGVyIi8+Ci0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciIvPgotICAgICAgICA8L3BoYXNlPgotICAgICAgICA8IS0tICAgICAgdXNlciBjYW4gYWRkIGhpcyBvd24gcGhhc2VzIHRvIHRoaXMgYXJlYSAgLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJPcGVyYXRpb25JbkZhdWx0UGhhc2UiLz4KLQk8cGhhc2UgbmFtZT0ic29hcG1vbml0b3JQaGFzZSIvPgotICAgIDwvcGhhc2VPcmRlcj4KLSAgICA8cGhhc2VPcmRlciB0eXBlPSJPdXRGYXVsdEZsb3ciPgotICAgICAgICA8IS0tICAgICAgdXNlciBjYW4gYWRkIGhpcyBvd24gcGhhc2VzIHRvIHRoaXMgYXJlYSAgLS0+Ci0JPHBoYXNlIG5hbWU9InNvYXBtb25pdG9yUGhhc2UiLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik9wZXJhdGlvbk91dEZhdWx0UGhhc2UiLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlBvbGljeURldGVybWluYXRpb24iLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik1lc3NhZ2VPdXQiLz4KLSAgICA8L3BoYXNlT3JkZXI+Ci08L2F4aXNjb25maWc+Ci0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L2J1aWxkZXJTZWxlY3RvclRlc3QvYmFkLWF4aXMyLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L2J1aWxkZXJTZWxlY3RvclRlc3QvYmFkLWF4aXMyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI5MzRhZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9idWlsZGVyU2VsZWN0b3JUZXN0L2JhZC1heGlzMi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNzIgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotIAotPGF4aXNjb25maWcgbmFtZT0iQXhpc0phdmEyLjAiPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIFBhcmFtZXRlcnMgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iaG90ZGVwbG95bWVudCI+dHJ1ZTwvcGFyYW1ldGVyPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iaG90dXBkYXRlIj5mYWxzZTwvcGFyYW1ldGVyPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iZW5hYmxlTVRPTSI+ZmFsc2U8L3BhcmFtZXRlcj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImVuYWJsZVN3QSI+ZmFsc2U8L3BhcmFtZXRlcj4KLQotICAgIDwhLS1VbmNvbW1lbnQgaWYgeW91IHdhbnQgdG8gZW5hYmxlIGZpbGUgY2FjaGluZyBmb3IgYXR0YWNobWVudHMgLS0+Ci0gICAgPCEtLXBhcmFtZXRlciBuYW1lPSJjYWNoZUF0dGFjaG1lbnRzIj50cnVlPC9wYXJhbWV0ZXI+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJhdHRhY2htZW50RElSIj48L3BhcmFtZXRlcj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9InNpemVUaHJlc2hvbGQiPjQwMDA8L3BhcmFtZXRlci0tPgotCi0gICAgPCEtLVRoaXMgd2lsbCBnaXZlIG91dCB0aGUgdGltb3V0IG9mIHRoZSBjb25maWd1cmF0aW9uIGNvbnRleHRzLCBpbiBzZWNvbmRzLS0+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJDb25maWdDb250ZXh0VGltZW91dEludGVydmFsIj4zMDwvcGFyYW1ldGVyPgotCi0gICAgPCEtLUR1cmluZyBhIGZhdWx0LCBzdGFja3RyYWNlIGNhbiBiZSBzZW50IHdpdGggdGhlIGZhdWx0IG1lc3NhZ2UuIFRoZSBmb2xsb3dpbmcgZmxhZyB3aWxsIGNvbnRyb2wgLS0+Ci0gICAgPCEtLXRoYXQgYmVoYXZpb3VyLi0tPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0ic2VuZFN0YWNrdHJhY2VEZXRhaWxzV2l0aEZhdWx0cyI+ZmFsc2U8L3BhcmFtZXRlcj4KLQotICAgIDwhLS1JZiB0aGVyZSBhcmVuJ3QgYW55IGluZm9ybWF0aW9uIGF2YWlsYWJsZSB0byBmaW5kIG91dCB0aGUgZmF1bHQgcmVhc29uLCB3ZSBzZXQgdGhlIG1lc3NhZ2Ugb2YgdGhlIGV4cGNldGlvbi0tPgotICAgIDwhLS1hcyB0aGUgZmF1bHRyZWFzb24vUmVhc29uLiBCdXQgd2hlbiBhIGZhdWx0IGlzIHRocm93biBmcm9tIGEgc2VydmljZSBvciBzb21lIHdoZXJlLCBpdCB3aWxsIGJlIC0tPgotICAgIDwhLS13cmFwcGVkIGJ5IGRpZmZlcmVudCBsZXZlbHMuIER1ZSB0byB0aGlzIHRoZSBpbml0aWFsIGV4Y2VwdGlvbiBtZXNzYWdlIGNhbiBiZSBsb3N0LiBJZiB0aGlzIGZsYWctLT4KLSAgICA8IS0taXMgc2V0IHRoZW4sIEF4aXMyIHRyaWVzIHRvIGdldCB0aGUgZmlyc3QgZXhjZXB0aW9uIGFuZCBzZXQgaXRzIG1lc3NhZ2UgYXMgdGhlIGZhdWx0cmVhc29uL1JlYXNvbi4tLT4KLSAgICA8cGFyYW1ldGVyIG5hbWU9IkRyaWxsRG93blRvUm9vdENhdXNlRm9yRmF1bHRSZWFzb24iPmZhbHNlPC9wYXJhbWV0ZXI+Ci0KLSAgICA8cGFyYW1ldGVyIG5hbWU9InVzZXJOYW1lIj5hZG1pbjwvcGFyYW1ldGVyPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFzc3dvcmQiPmF4aXMyPC9wYXJhbWV0ZXI+Ci0KLSAgICA8IS0tVG8gb3ZlcnJpZGUgcmVwb3NpdG9yeS9zZXJ2aWNlcyB5b3UgbmVlZCB0byB1bmNvbW1lbnQgZm9sbG93aW5nIHBhcmFtZXRlciBhbmQgdmFsdWUgU0hPVUxEIGJlIGFic29sdXRlIGZpbGUgcGF0aC4tLT4KLSAgICA8IS0tPHBhcmFtZXRlciBuYW1lPSJTZXJ2aWNlc0RpcmVjdG9yeSI+c2VydmljZTwvcGFyYW1ldGVyPi0tPgotICAgIDwhLS1UbyBvdmVycmlkZSByZXBvc2l0b3J5L21vZHVsZXMgeW91IG5lZWQgdG8gdW5jb21tZW50IGZvbGxvd2luZyBwYXJhbWV0ZXIgYW5kIHZhbHVlIFNIT1VMRCBiZSBhYnNvbHV0ZSBmaWxlIHBhdGgtLT4KLSAgICA8IS0tPHBhcmFtZXRlciBuYW1lPSJNb2R1bGVzRGlyZWN0b3J5Ij5tb2R1bGVzPC9wYXJhbWV0ZXI+LS0+Ci0KLQotCi0gICAgPCEtLUZvbGxvd2luZyBwYXJhbXMgd2lsbCBzZXQgdGhlIHByb3BlciBjb250ZXh0IHBhdGhzIGZvciBpbnZvY2F0aW9ucy4gQWxsIHRoZSBlbmRwb2ludHMgd2lsbCBoYXZlIGEgY29tbW9ucyBjb250ZXh0LS0+Ci0gICAgPCEtLXJvb3Qgd2hpY2ggY2FuIGNvbmZpZ3VyZWQgdXNpbmcgdGhlIGZvbGxvd2luZyBjb250ZXh0Um9vdCBwYXJhbWV0ZXItLT4KLSAgICA8IS0tPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0Um9vdCI+YXhpczI8L3BhcmFtZXRlcj4tLT4KLQotICAgIDwhLS1PdXIgSFRUUCBlbmRwb2ludHMgY2FuIGhhbmRsZSBib3RoIFJFU1QgYW5kIFNPQVAuIEZvbGxvd2luZyBwYXJhbWV0ZXJzIGNhbiBiZSB1c2VkIHRvIGRpc3RpbmdpdXNoIHRob3NlIGVuZHBvaW50cy0tPgotICAgIDwhLS1JbiBjYXNlIG9mIGEgc2VydmxldCwgaWYgeW91IGNoYW5nZSB0aGlzIHlvdSBoYXZlIHRvIG1hbnVhbGx5IGNoYW5nZSB0aGUgc2V0dGluZ3Mgb2YgeW91ciBzZXJ2bGV0IGNvbnRhaW5lciB0byBtYXAgdGhpcyAtLT4KLSAgICA8IS0tY29udGV4dCBwYXRoIHRvIHByb3BlciBBeGlzMiBzZXJ2bGV0cy0tPgotICAgIDwhLS08cGFyYW1ldGVyIG5hbWU9InNlcnZpY2VQYXRoIj5zZXJ2aWNlczwvcGFyYW1ldGVyPi0tPgotICAgIDwhLS08cGFyYW1ldGVyIG5hbWU9InJlc3RQYXRoIj5yZXN0PC9wYXJhbWV0ZXI+LS0+Ci0KLQotICAgIDwhLS1TZXQgdGhlIGZsYWcgdG8gdHJ1ZSBpZiB5b3Ugd2FudCB0byBlbmFibGUgdHJhbnNwb3J0IGxldmVsIHNlc3Npb24gbWFuZ21lbnQtLT4KLSAgICA8cGFyYW1ldGVyIG5hbWU9Im1hbmFnZVRyYW5zcG9ydFNlc3Npb24iPmZhbHNlPC9wYXJhbWV0ZXI+Ci0KLSAgICA8IS0tRm9sbG93aW5nIHR3byBwYXJhbWV0ZXJzIHdpbGwgYmUgdXNlZCB0byBoYW5kbGUgUkVTVCBpbiBBeGlzMi4gVGhlIGRlZmF1bHQgc2V0dGluZ3Mgd2lsbCBtYWtlIEF4aXMyIHRvIGhhdmUgdHdvLS0+Ci0gICAgPCEtLWRpZmZlcmVudCBlbmRwb2ludHMsIG9uZSBmb3IgUkVTVCAoQXhpc1JFU1RTZXJ2bGV0KSBvbmUgZm9yIFNPQVAgbWVzc2FnZSBoYW5kbGluZyAoQXhpc1NlcnZsZXQpLiBCdXQgZm9sbG93aW5nLS0+Ci0gICAgPCEtLXBhcmFtZXRlcnMgaGVscCB0byB0d2VhayB0aGUgbWVzc2FnZSBoYW5kbGluZyBvZiB0d28gbWFpbiBzZXJ2bGV0cy4gLS0+Ci0KLSAgICA8IS0tIElmIHRoZSBlbmFibGVSRVNUSW5BeGlzMk1haW5TZXJ2bGV0IGlzIHRydWUsIHRoZW4gQXhpczJNYWluU2VydmxldCB3aWxsIGhhbmRsZSBib3RoIFNPQVAgYW5kIFJFU1QgbWVzc2FnZXMgLS0+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJlbmFibGVSRVNUSW5BeGlzMk1haW5TZXJ2bGV0IiBsb2NrZWQ9InRydWUiPmZhbHNlPC9wYXJhbWV0ZXI+Ci0KLSAgICA8IS0tIEZvbGxvd2luZyBwYXJhbWV0ZXIgd2lsbCBjb21wbGV0ZWx5IGRpc2FibGUgUkVTVCBoYW5kbGluZyBpbiBib3RoIHRoZSBzZXJ2bGV0cy0tPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iZGlzYWJsZVJFU1QiIGxvY2tlZD0idHJ1ZSI+ZmFsc2U8L3BhcmFtZXRlcj4KLQotICAgIDwhLS0gVGhpcyB3aWxsIGRpc2FibGUgdGhlIHNlcGFyYXRlIHNlcnZsZXQgd2UgaGF2ZSBmb3IgUkVTVCBoYW5kbGluZy4gLS0+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJkaXNhYmxlU2VwYXJhdGVFbmRwb2ludEZvclJFU1QiIGxvY2tlZD0idHJ1ZSI+ZmFsc2U8L3BhcmFtZXRlcj4KLQotICAgIDwhLS0gSWYgeW91IGhhdmUgYSBmcm9udGVuZCBob3N0IHdoaWNoIGV4cG9zZXMgdGhpcyB3ZWJzZXJ2aWNlIHVzaW5nIGEgZGlmZmVyZW50IHB1YmxpYyBVUkwgIC0tPgotICAgIDwhLS0gdXNlIHRoaXMgcGFyYW1ldGVyIHRvIG92ZXJyaWRlIGF1dG9kZXRlY3RlZCB1cmwgLS0+Ci0gICAgPCEtLTxwYXJhbWV0ZXIgbmFtZT0iaHR0cEZyb250ZW5kSG9zdFVybCI+aHR0cHM6Ly9zb21lb3RoZXJob3N0L2NvbnRleHQ8L3BhcmFtZXRlcj4tLT4KLQotCi0gICAgPCEtLSAgICBUaGUgd2F5IG9mIGFkZGluZyBsaXN0ZW5lciB0byB0aGUgc3lzdGVtLS0+Ci0gICAgPCEtLSAgICA8bGlzdGVuZXIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuT2JzZXJ2ZXJJTVBMIj4tLT4KLSAgICA8IS0tICAgICAgICA8cGFyYW1ldGVyIG5hbWU9IlJTU19VUkwiPmh0dHA6Ly8xMjcuMC4wLjEvcnNzPC9wYXJhbWV0ZXI+LS0+Ci0gICAgPCEtLSAgICA8L2xpc3RlbmVyPi0tPgotCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gTWVzc2FnZSBSZWNlaXZlcnMgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS1UaGlzIGlzIHRoZSBEZWFmdWx0IE1lc3NhZ2UgUmVjZWl2ZXIgZm9yIHRoZSBzeXN0ZW0gLCBpZiB5b3Ugd2FudCB0byBoYXZlIE1lc3NhZ2VSZWNlaXZlcnMgZm9yIC0tPgotICAgIDwhLS1hbGwgdGhlIG90aGVyIE1FUCBpbXBsZW1lbnQgaXQgYW5kIGFkZCB0aGUgY29ycmVjdCBlbnRyeSB0byBoZXJlICwgc28gdGhhdCB5b3UgY2FuIHJlZmVyIGZyb20tLT4KLSAgICA8IS0tYW55IG9wZXJhdGlvbiAtLT4KLSAgICA8IS0tTm90ZSA6IFlvdSBjYW4gb3ZyaWRlIHRoaXMgZm9yIHBhcnRpY3VsYXIgc2VydmljZSBieSBhZGRpbmcgdGhlIHNhbWUgZWxlbWVudCB3aXRoIHlvdXIgcmVxdWlyZW1lbnQtLT4KLSAgICA8bWVzc2FnZVJlY2VpdmVycz4KLSAgICAgICAgPG1lc3NhZ2VSZWNlaXZlciBtZXA9Imh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgvd3NkbC9pbi1vbmx5IgotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5SYXdYTUxJTk9ubHlNZXNzYWdlUmVjZWl2ZXIiLz4KLSAgICAgICAgPG1lc3NhZ2VSZWNlaXZlciBtZXA9Imh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgvd3NkbC9pbi1vdXQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLlJhd1hNTElOT3V0TWVzc2FnZVJlY2VpdmVyIi8+Ci0gICAgPC9tZXNzYWdlUmVjZWl2ZXJzPgotICAgIAotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIE1lc3NhZ2UgQnVpbGRlcnMgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS1Gb2xsb3dpbmcgY29udGVudCB0eXBlIHRvIGJ1aWxkZXIgbWFwcGluZyBjYW4gYmUgdXNlZCB0byBpbXBsZW1lbnQgc3VwcG9ydCBmb3IgZGlmZmVyZW50IG1lc3NhZ2UgLS0+Ci0gICAgPCEtLWZvcm1hdHMgaW4gQXhpczIuIFRoZXNlIG1lc3NhZ2UgZm9ybWF0cyBhcmUgZXhwZWN0ZWQgdG8gYmUgcmVzb2x2ZWQgYmFzZWQgb24gdGhlIGNvbnRlbnQgdHlwZS4gLS0+Ci0gICAgPG1lc3NhZ2VCdWlsZGVycz4KLSAgICAgICAgPG1lc3NhZ2VCdWlsZGVyIGNvbnRlbnRUeXBlPSJhcHBsaWNhdGlvbi9qc29uIgotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLkZvb0J1aWxkZXIiLz4KLSAgICA8L21lc3NhZ2VCdWlsZGVycz4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+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+Ci0gICAgICAgIDwhLS0gICAgICB1c2VyIGNhbiBhZGQgaGlzIG93biBwaGFzZXMgdG8gdGhpcyBhcmVhICAtLT4KLQk8cGhhc2UgbmFtZT0ic29hcG1vbml0b3JQaGFzZSIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iT3BlcmF0aW9uT3V0RmF1bHRQaGFzZSIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iUG9saWN5RGV0ZXJtaW5hdGlvbiIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iTWVzc2FnZU91dCIvPgotICAgIDwvcGhhc2VPcmRlcj4KLTwvYXhpc2NvbmZpZz4KLQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvZWNoby9NRVRBLUlORi9zZXJ2aWNlcy54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9lY2hvL01FVEEtSU5GL3NlcnZpY2VzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZmZDMwZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9lY2hvL01FVEEtSU5GL3NlcnZpY2VzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHNlcnZpY2UgbmFtZT0iYXhpc3ZlcnNpb24iPgotICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgVGhpcyBzZXJ2aWNlIGVjaG8gdGhlIGdpdmVuIGlucHV0ICwgYW5kIHRoaXMgd2FzIGRldmVsb3BlZCB0byB0ZXh0IHRoZSBheGlzIHN5c3RlbSB3b3JraW5nCi0gICAgICAgICAgICBjb3JyZWN0bHkKLSAgICA8L2Rlc2NyaXB0aW9uPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iU2VydmljZUNsYXNzIj5vcmcuYXBhY2hlLmF4aXMyLmVjaG8uRWNobzwvcGFyYW1ldGVyPgotICAgIDxvcGVyYXRpb24gbmFtZT0idmlld1ZlcnNpb24iLz4KLTwvc2VydmljZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9lY2hvL2J1aWxkLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L2VjaG8vYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTJlZmYwLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L2VjaG8vYnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHByb2plY3QgYmFzZWRpcj0iLiIgZGVmYXVsdD0iamFyIj4KLSAgICA8cHJvcGVydHkgbmFtZT0ic3JjIiBsb2NhdGlvbj0iLiIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZCIgbG9jYXRpb249ImJ1aWxkIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmNsYXNzZXMiIGxvY2F0aW9uPSIke2J1aWxkfS9jbGFzc2VzIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmxpYiIgbG9jYXRpb249IiR7YnVpbGR9L2xpYiIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJsaWIiIGxvY2F0aW9uPSJsaWIiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0icm9vdCIgbG9jYXRpb249Ii4uLy4uLy4uLyIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJqYXIuZGlyIiBsb2NhdGlvbj0iJHtyb290fS90YXJnZXQvZWNobyIvPgotCi0gICAgPHBhdGggaWQ9ImF4aXMudGVzdC5jbGFzc3BhdGgiPgotICAgICAgICA8cGF0aCByZWZpZD0ibWF2ZW4uZGVwZW5kZW5jeS5jbGFzc3BhdGgiPjwvcGF0aD4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIuLi8uLi8uLi90YXJnZXQvY2xhc3NlcyIvPgotICAgIDwvcGF0aD4KLQotICAgIDx0YXJnZXQgbmFtZT0iY29tcGlsZSIgZGVwZW5kcz0iaW5pdCIgdW5sZXNzPSJqYXJzLnVwdG9kYXRlIj4KLSAgICAgICAgPG1rZGlyIGRpcj0iJHtidWlsZC5jbGFzc2VzfSIvPgotICAgICAgICA8bWtkaXIgZGlyPSIke2J1aWxkLmxpYn0iLz4KLSAgICAgICAgPGphdmFjIGRlc3RkaXI9IiR7YnVpbGQuY2xhc3Nlc30iIGRlYnVnPSJvbiI+Ci0gICAgICAgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJheGlzLnRlc3QuY2xhc3NwYXRoIi8+Ci0gICAgICAgICAgICA8c3JjIHBhdGg9IiR7c3JjfSIvPgotICAgICAgICA8L2phdmFjPgotICAgIDwvdGFyZ2V0PgotCi0gICAgPHRhcmdldCBuYW1lPSJqYXIiIGRlcGVuZHM9ImNvbXBpbGUiIHVubGVzcz0iamFycy51cHRvZGF0ZSI+Ci0gICAgICAgIDxjb3B5IHRvZGlyPSIke2J1aWxkLmNsYXNzZXN9L01FVEEtSU5GIj4KLSAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtiYXNlZGlyfS9NRVRBLUlORi8iPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoueG1sIi8+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iYnVpbGQueG1sIi8+Ci0gICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgIDwvY29weT4KLQotICAgICAgICA8bWtkaXIgZGlyPSIke2phci5kaXJ9Ii8+Ci0gICAgICAgIDxqYXIgamFyZmlsZT0iJHtqYXIuZGlyfS9lY2hvLmFhciIgYmFzZWRpcj0iJHtidWlsZC5jbGFzc2VzfSI+Ci0gICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKiIvPgotICAgICAgICA8L2phcj4KLSAgICAgICAgPGRlbGV0ZSBkaXI9IiR7YnVpbGR9Ii8+Ci0gICAgPC90YXJnZXQ+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9ImluaXQiPgotICAgICAgICA8dXB0b2RhdGUgcHJvcGVydHk9ImphcnMudXB0b2RhdGUiIHRhcmdldGZpbGU9IiR7amFyLmRpcn0vZWNoby5hYXIiPgotICAgICAgICAgICAgPHNyY2ZpbGVzIGRpcj0iJHtzcmN9Ij4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLmphdmEiLz4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLnhtbCIvPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoud3NkbCIvPgotICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9IiR7YnVpbGR9LyoqIi8+Ci0gICAgICAgICAgICA8L3NyY2ZpbGVzPgotICAgICAgICA8L3VwdG9kYXRlPgotICAgICAgICA8ZWNobyBtZXNzYWdlPSJ0aGUgZmlsZXMgYXJlIHVwIHRvIGRhdGUgPSAke2phcnMudXB0b2RhdGV9Ij48L2VjaG8+Ci0gICAgPC90YXJnZXQ+Ci0KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L2V4Y3VsZVJlcG8vYXhpczIueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvZXhjdWxlUmVwby9heGlzMi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5ODk3NWMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvZXhjdWxlUmVwby9heGlzMi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNDQgKzAsMCBAQAotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+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+DQotPC9heGlzY29uZmlnPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L2V4Y3VsZVJlcG8vc2VydmljZXMvZXhjbHVkZVNlcnZpY2UvTUVUQS1JTkYvc2VydmljZXMueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvZXhjdWxlUmVwby9zZXJ2aWNlcy9leGNsdWRlU2VydmljZS9NRVRBLUlORi9zZXJ2aWNlcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1MGE3ZmQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvZXhjdWxlUmVwby9zZXJ2aWNlcy9leGNsdWRlU2VydmljZS9NRVRBLUlORi9zZXJ2aWNlcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci08c2VydmljZT4KLSAgICA8cGFyYW1ldGVyIG5hbWU9IlNlcnZpY2VDbGFzcyI+b3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LkV4Y2x1ZGVTZXJ2aWNlPC9wYXJhbWV0ZXI+Ci0gICAgPGV4Y2x1ZGVPcGVyYXRpb25zPgotICAgICAgICA8b3BlcmF0aW9uPmFkZDwvb3BlcmF0aW9uPgotICAgIDwvZXhjbHVkZU9wZXJhdGlvbnM+Ci08L3NlcnZpY2U+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvaG9zdENvbmZpZ3JlcG8vYXhpczIueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvaG9zdENvbmZpZ3JlcG8vYXhpczIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTRiZjRkLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L2hvc3RDb25maWdyZXBvL2F4aXMyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxheGlzY29uZmlnIG5hbWU9IkF4aXNKYXZhMi4wIj4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBQYXJhbWV0ZXJzIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImhvdGRlcGxveW1lbnQiPnRydWU8L3BhcmFtZXRlcj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImhvdHVwZGF0ZSI+ZmFsc2U8L3BhcmFtZXRlcj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImVuYWJsZU1UT00iPnRydWU8L3BhcmFtZXRlcj4KLQotICAgIDxwYXJhbWV0ZXIgbmFtZT0idXNlck5hbWUiPmFkbWluPC9wYXJhbWV0ZXI+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJwYXNzd29yZCI+YXhpczI8L3BhcmFtZXRlcj4KLQotICAgIDxwYXJhbWV0ZXIgbmFtZT0ic2VyYWxpemVMb2NhdGlvbiI+LjwvcGFyYW1ldGVyPgotICAgIDxob3N0Q29uZmlndXJhdGlvbj4KLSAgICAgICAgPGlwPjEyNy4wLjAuMTwvaXA+Ci0gICAgICAgIDxwb3J0PjU1NTU8L3BvcnQ+Ci0gICAgPC9ob3N0Q29uZmlndXJhdGlvbj4KLQotCi0gICAgPCEtLWlmIHlvdSB3YW50IHRvIGV4dHJhY3QgdGhlIHNlcnZpY2UgYXJjaGl2ZSBmaWxlIGFuZCB3b3JrIHdpdGggdGhhdCBwbGVhc2UgdW5jb21tZW50IHRoaXMtLT4KLSAgICA8IS0tZWxzZSAsIGl0IHdvbnQgZXh0cmFjdCBhcmNoaXZlIGZpbGUgb3IgZG9lcyBub3QgdGFrZSBpbnRvIGNvbnNpZGVyYXRpb24gaWYgc29tZW9uZSBkcm9wLS0+Ci0gICAgPCEtLWV4cGxvZGVkIGRpcmVjdG9yeSBpbnRvIC9zZXJ2aWNlIGRpcmVjdG9yeS0tPgotICAgIDwhLS08cGFyYW1ldGVyIG5hbWU9ImV4dHJhY3RTZXJ2aWNlQXJjaGl2ZSI+dHJ1ZTwvcGFyYW1ldGVyPi0tPgotCi0KLSAgICA8IS0tICAgIFRoZSB3YXkgb2YgYWRkaW5nIGxpc3RlbmVyIHRvIHRoZSBzeXN0ZW0tLT4KLSAgICA8IS0tICAgIDxsaXN0ZW5lciBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5PYnNlcnZlcklNUEwiPi0tPgotICAgIDwhLS0gICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iUlNTX1VSTCI+aHR0cDovLzEyNy4wLjAuMS9yc3M8L3BhcmFtZXRlcj4tLT4KLSAgICA8IS0tICAgIDwvbGlzdGVuZXI+LS0+Ci0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBNZXNzYWdlIFJlY2VpdmVycyAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBUaGlzIGlzIHRoZSBEZWFmdWx0IE1lc3NhZ2UgUmVjZWl2ZXIgZm9yIHRoZSBSZXF1ZXN0IFJlc3BvbnNlIHN0eWxlIE9wZXJhdGlvbnMgLS0+Ci0gICAgPG1lc3NhZ2VSZWNlaXZlciBtZXA9IklOT1VUIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuUmF3WE1MSU5PdXRNZXNzYWdlUmVjZWl2ZXIiLz4KLQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIFRyYW5zcG9ydCBJbnMgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDx0cmFuc3BvcnRSZWNlaXZlciBuYW1lPSJodHRwIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5TaW1wbGVIVFRQU2VydmVyIj4KLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJwb3J0Ij42MDYwPC9wYXJhbWV0ZXI+Ci0gICAgPC90cmFuc3BvcnRSZWNlaXZlcj4KLQotICAgIDx0cmFuc3BvcnRSZWNlaXZlciBuYW1lPSJ0Y3AiIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC50Y3AuVENQU2VydmVyIj4KLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJwb3J0Ij42MDYwPC9wYXJhbWV0ZXI+Ci0gICAgPC90cmFuc3BvcnRSZWNlaXZlcj4KLQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIFRyYW5zcG9ydCBPdXRzIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotICAgIDx0cmFuc3BvcnRTZW5kZXIgbmFtZT0idGNwIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQudGNwLlRDUFRyYW5zcG9ydFNlbmRlciIvPgotICAgIDx0cmFuc3BvcnRTZW5kZXIgbmFtZT0ibG9jYWwiIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5sb2NhbC5Mb2NhbFRyYW5zcG9ydFNlbmRlciIvPgotICAgIDx0cmFuc3BvcnRTZW5kZXIgbmFtZT0iaHR0cCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuQ29tbW9uc0hUVFBUcmFuc3BvcnRTZW5kZXIiPgotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9IlBST1RPQ09MIj5IVFRQLzEuMTwvcGFyYW1ldGVyPgotICAgIDwvdHJhbnNwb3J0U2VuZGVyPgotICAgIDx0cmFuc3BvcnRTZW5kZXIgbmFtZT0iaHR0cHMiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5Db21tb25zSFRUUFRyYW5zcG9ydFNlbmRlciI+Ci0gICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iUFJPVE9DT0wiPkhUVFAvMS4xPC9wYXJhbWV0ZXI+Ci0gICAgPC90cmFuc3BvcnRTZW5kZXI+Ci0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBHbG9iYWwgTW9kdWxlcyAgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi0KLSAgICA8IS0tQ29uZmlndXJpbmcgbW9kdWxlICwgcHJvdmlkaW5nIHBhcmFtZXRlcnMgZm9yIG1vZHVsZXMgd2hldGhlciB0aGV5IHJlZmVyIG9yIG5vdC0tPgotICAgIDwhLS08bW9kdWxlQ29uZmlnIG5hbWU9ImFkZHJlc3NpbmciPi0tPgotICAgIDwhLS08cGFyYW1ldGVyIG5hbWU9ImFkZHJlc3NpbmdQYXJhIj5OL0E8L3BhcmFtZXRlcj4tLT4KLSAgICA8IS0tPC9tb2R1bGVDb25maWc+LS0+Ci0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBQaGFzZXMgIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgIDxwaGFzZU9yZGVyIHR5cGU9IkluRmxvdyI+Ci0gICAgICAgIDwhLS0gIFN5c3RlbSBwcmUgZGVmaW5lZCBwaGFzZXMgICAgICAgLS0+Ci0gICAgICAgICA8cGhhc2UgbmFtZT0iVHJhbnNwb3J0Ij4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5SZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIi8+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciIvPgotICAgICAgICA8L3BoYXNlPgotICAgICAgICA8cGhhc2UgbmFtZT0iU2VjdXJpdHkiLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlByZURpc3BhdGNoIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJEaXNwYXRjaCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkRpc3BhdGNoUGhhc2UiPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiLz4KLQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIi8+Ci0gICAgICAgIDwvcGhhc2U+Ci0gICAgICAgIDwhLS0gIFN5c3RlbSBwcmUgZGVmaW5lZCBwaGFzZXMgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gICBBZnRlciBQb3N0ZGlzcGF0Y2ggcGhhc2UgbW9kdWxlIGF1dGhvciBvciBvciBzZXJ2aWNlIGF1dGhvciBjYW4gYWRkIGFueSBwaGFzZSBoZSB3YW50ICAgICAgLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJPcGVyYXRpb25JblBoYXNlIi8+Ci0gICAgPC9waGFzZU9yZGVyPgotICAgIDxwaGFzZU9yZGVyIHR5cGU9Ik91dEZsb3ciPgotICAgICAgICA8IS0tICAgICAgdXNlciBjYW4gYWRkIGhpcyBvd24gcGhhc2VzIHRvIHRoaXMgYXJlYSAgLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJPcGVyYXRpb25PdXRQaGFzZSIvPgotICAgICAgICA8IS0tc3lzdGVtIHByZWRlZmluZWQgcGhhc2UtLT4KLSAgICAgICAgPCEtLXRoZXNlIHBoYXNlIHdpbGwgcnVuIGlycmVzcGVjdGl2ZSBvZiB0aGUgc2VydmljZS0tPgotICAgICAgICA8cGhhc2UgbmFtZT0iUG9saWN5RGV0ZXJtaW5hdGlvbiIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iTWVzc2FnZU91dCIvPgotICAgIDwvcGhhc2VPcmRlcj4KLSAgICA8cGhhc2VPcmRlciB0eXBlPSJJbkZhdWx0RmxvdyI+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJQcmVEaXNwYXRjaCIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iRGlzcGF0Y2giIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5EaXNwYXRjaFBoYXNlIj4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5SZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIi8+Ci0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIi8+Ci0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5BZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIi8+Ci0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciIvPgotICAgICAgICA8L3BoYXNlPgotICAgICAgICA8IS0tICAgICAgdXNlciBjYW4gYWRkIGhpcyBvd24gcGhhc2VzIHRvIHRoaXMgYXJlYSAgLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJPcGVyYXRpb25JbkZhdWx0UGhhc2UiLz4KLSAgICA8L3BoYXNlT3JkZXI+Ci0gICAgPHBoYXNlT3JkZXIgdHlwZT0iT3V0RmF1bHRGbG93Ij4KLSAgICAgICAgPCEtLSAgICAgIHVzZXIgY2FuIGFkZCBoaXMgb3duIHBoYXNlcyB0byB0aGlzIGFyZWEgIC0tPgotICAgICAgICA8cGhhc2UgbmFtZT0iT3BlcmF0aW9uT3V0RmF1bHRQaGFzZSIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iUG9saWN5RGV0ZXJtaW5hdGlvbiIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iTWVzc2FnZU91dCIvPgotICAgIDwvcGhhc2VPcmRlcj4KLTwvYXhpc2NvbmZpZz4KLQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvaW52YWxpZHNlcnZpY2UvTUVUQS1JTkYvc2VydmljZXMueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvaW52YWxpZHNlcnZpY2UvTUVUQS1JTkYvc2VydmljZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmU1MjJhLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L2ludmFsaWRzZXJ2aWNlL01FVEEtSU5GL3NlcnZpY2VzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHNlcnZpY2UgbmFtZT0iIj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9IlNlcnZpY2VDbGFzcyI+b3JnLmFwYWNoZS5heGlzMi5JbnZhbGlkU2VydmljZTwvcGFyYW1ldGVyPgotICAgIDxtb2R1bGUgcmVmPSJzZXJ2aWNlTW9kdWxlIi8+Ci0gICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvIi8+Ci08L3NlcnZpY2U+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvaW52YWxpZHNlcnZpY2UvYnVpbGQueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvaW52YWxpZHNlcnZpY2UvYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2N2QxMjBjLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L2ludmFsaWRzZXJ2aWNlL2J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxwcm9qZWN0IGJhc2VkaXI9Ii4iIGRlZmF1bHQ9ImphciI+Ci0gICAgPHByb3BlcnR5IG5hbWU9InNyYyIgbG9jYXRpb249Ii4iLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iYnVpbGQiIGxvY2F0aW9uPSJidWlsZCIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC5jbGFzc2VzIiBsb2NhdGlvbj0iJHtidWlsZH0vY2xhc3NlcyIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC5saWIiIGxvY2F0aW9uPSIke2J1aWxkfS9saWIiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0ibGliIiBsb2NhdGlvbj0ibGliIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9InJvb3QiIGxvY2F0aW9uPSIuLi8uLi8uLi8iLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iamFyLmRpciIgbG9jYXRpb249IiR7cm9vdH0vdGFyZ2V0L3Rlc3QtcmVzb3VyY2VzL0ludmFsaWREZXBsb3ltZW50L3NlcnZpY2VzLyIvPgotCi0gICAgPHBhdGggaWQ9ImF4aXMudGVzdC5jbGFzc3BhdGgiPgotICAgICAgICA8cGF0aCByZWZpZD0ibWF2ZW4uZGVwZW5kZW5jeS5jbGFzc3BhdGgiPjwvcGF0aD4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIuLi8uLi8uLi90YXJnZXQvY2xhc3NlcyIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249Ii4uLy4uLy4uL3RhcmdldC90ZXN0LWNsYXNzZXMiLz4KLSAgICA8L3BhdGg+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUiIGRlcGVuZHM9ImluaXQiIHVubGVzcz0iamFycy51cHRvZGF0ZSI+Ci0gICAgICAgIDxta2RpciBkaXI9IiR7YnVpbGQuY2xhc3Nlc30iLz4KLSAgICAgICAgPG1rZGlyIGRpcj0iJHtidWlsZC5saWJ9Ii8+Ci0gICAgICAgIDxqYXZhYyBkZXN0ZGlyPSIke2J1aWxkLmNsYXNzZXN9IiBkZWJ1Zz0ib24iPgotICAgICAgICAgICAgPGNsYXNzcGF0aCByZWZpZD0iYXhpcy50ZXN0LmNsYXNzcGF0aCIvPgotICAgICAgICAgICAgPHNyYyBwYXRoPSIke3NyY30iLz4KLSAgICAgICAgPC9qYXZhYz4KLSAgICA8L3RhcmdldD4KLQotICAgIDx0YXJnZXQgbmFtZT0iamFyIiBkZXBlbmRzPSJjb21waWxlIiB1bmxlc3M9ImphcnMudXB0b2RhdGUiPgotICAgICAgICA8Y29weSB0b2Rpcj0iJHtidWlsZC5jbGFzc2VzfS9NRVRBLUlORiI+Ci0gICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7YmFzZWRpcn0vTUVUQS1JTkYvIj4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLnhtbCIvPgotICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9ImJ1aWxkLnhtbCIvPgotICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICA8L2NvcHk+Ci0KLSAgICAgICAgPG1rZGlyIGRpcj0iJHtqYXIuZGlyfSIvPgotICAgICAgICA8amFyIGphcmZpbGU9IiR7amFyLmRpcn0vaW52YWxpZFNlcnZpY2UuamFyIiBiYXNlZGlyPSIke2J1aWxkLmNsYXNzZXN9Ij4KLSAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqIi8+Ci0gICAgICAgIDwvamFyPgotICAgICAgICA8ZGVsZXRlIGRpcj0iJHtidWlsZH0iLz4KLSAgICA8L3RhcmdldD4KLQotICAgIDx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0gICAgICAgIDx1cHRvZGF0ZSBwcm9wZXJ0eT0iamFycy51cHRvZGF0ZSIgdGFyZ2V0ZmlsZT0iJHtqYXIuZGlyfS9pbnZhbGlkU2VydmljZS5qYXIiPgotICAgICAgICAgICAgPHNyY2ZpbGVzIGRpcj0iJHtzcmN9Ij4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLmphdmEiLz4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLnhtbCIvPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoud3NkbCIvPgotICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9IiR7YnVpbGR9LyoqIi8+Ci0gICAgICAgICAgICA8L3NyY2ZpbGVzPgotICAgICAgICA8L3VwdG9kYXRlPgotICAgICAgICA8ZWNobyBtZXNzYWdlPSJ0aGUgZmlsZXMgYXJlIHVwIHRvIGRhdGUgPSAke2phcnMudXB0b2RhdGV9Ij48L2VjaG8+Ci0gICAgPC90YXJnZXQ+Ci0KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L21lc3NhZ2VGb3JtYXR0ZXJUZXN0L2F4aXMyLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L21lc3NhZ2VGb3JtYXR0ZXJUZXN0L2F4aXMyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFmNDA4MS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9tZXNzYWdlRm9ybWF0dGVyVGVzdC9heGlzMi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMTggKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotIAotPGF4aXNjb25maWcgbmFtZT0iQXhpc0phdmEyLjAiPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIFBhcmFtZXRlcnMgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iaG90ZGVwbG95bWVudCI+dHJ1ZTwvcGFyYW1ldGVyPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iaG90dXBkYXRlIj5mYWxzZTwvcGFyYW1ldGVyPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iZW5hYmxlTVRPTSI+ZmFsc2U8L3BhcmFtZXRlcj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImVuYWJsZVN3QSI+ZmFsc2U8L3BhcmFtZXRlcj4KLQotICAgIDwhLS1VbmNvbW1lbnQgaWYgeW91IHdhbnQgdG8gZW5hYmxlIGZpbGUgY2FjaGluZyBmb3IgYXR0YWNobWVudHMgLS0+Ci0gICAgPCEtLXBhcmFtZXRlciBuYW1lPSJjYWNoZUF0dGFjaG1lbnRzIj50cnVlPC9wYXJhbWV0ZXI+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJhdHRhY2htZW50RElSIj48L3BhcmFtZXRlcj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9InNpemVUaHJlc2hvbGQiPjQwMDA8L3BhcmFtZXRlci0tPgotCi0gICAgPCEtLVRoaXMgd2lsbCBnaXZlIG91dCB0aGUgdGltb3V0IG9mIHRoZSBjb25maWd1cmF0aW9uIGNvbnRleHRzLCBpbiBzZWNvbmRzLS0+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJDb25maWdDb250ZXh0VGltZW91dEludGVydmFsIj4zMDwvcGFyYW1ldGVyPgotCi0gICAgPCEtLUR1cmluZyBhIGZhdWx0LCBzdGFja3RyYWNlIGNhbiBiZSBzZW50IHdpdGggdGhlIGZhdWx0IG1lc3NhZ2UuIFRoZSBmb2xsb3dpbmcgZmxhZyB3aWxsIGNvbnRyb2wgLS0+Ci0gICAgPCEtLXRoYXQgYmVoYXZpb3VyLi0tPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0ic2VuZFN0YWNrdHJhY2VEZXRhaWxzV2l0aEZhdWx0cyI+ZmFsc2U8L3BhcmFtZXRlcj4KLQotICAgIDwhLS1JZiB0aGVyZSBhcmVuJ3QgYW55IGluZm9ybWF0aW9uIGF2YWlsYWJsZSB0byBmaW5kIG91dCB0aGUgZmF1bHQgcmVhc29uLCB3ZSBzZXQgdGhlIG1lc3NhZ2Ugb2YgdGhlIGV4cGNldGlvbi0tPgotICAgIDwhLS1hcyB0aGUgZmF1bHRyZWFzb24vUmVhc29uLiBCdXQgd2hlbiBhIGZhdWx0IGlzIHRocm93biBmcm9tIGEgc2VydmljZSBvciBzb21lIHdoZXJlLCBpdCB3aWxsIGJlIC0tPgotICAgIDwhLS13cmFwcGVkIGJ5IGRpZmZlcmVudCBsZXZlbHMuIER1ZSB0byB0aGlzIHRoZSBpbml0aWFsIGV4Y2VwdGlvbiBtZXNzYWdlIGNhbiBiZSBsb3N0LiBJZiB0aGlzIGZsYWctLT4KLSAgICA8IS0taXMgc2V0IHRoZW4sIEF4aXMyIHRyaWVzIHRvIGdldCB0aGUgZmlyc3QgZXhjZXB0aW9uIGFuZCBzZXQgaXRzIG1lc3NhZ2UgYXMgdGhlIGZhdWx0cmVhc29uL1JlYXNvbi4tLT4KLSAgICA8cGFyYW1ldGVyIG5hbWU9IkRyaWxsRG93blRvUm9vdENhdXNlRm9yRmF1bHRSZWFzb24iPmZhbHNlPC9wYXJhbWV0ZXI+Ci0KLSAgICA8cGFyYW1ldGVyIG5hbWU9InVzZXJOYW1lIj5hZG1pbjwvcGFyYW1ldGVyPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFzc3dvcmQiPmF4aXMyPC9wYXJhbWV0ZXI+Ci0KLSAgICA8IS0tVG8gb3ZlcnJpZGUgcmVwb3NpdG9yeS9zZXJ2aWNlcyB5b3UgbmVlZCB0byB1bmNvbW1lbnQgZm9sbG93aW5nIHBhcmFtZXRlciBhbmQgdmFsdWUgU0hPVUxEIGJlIGFic29sdXRlIGZpbGUgcGF0aC4tLT4KLSAgICA8IS0tPHBhcmFtZXRlciBuYW1lPSJTZXJ2aWNlc0RpcmVjdG9yeSI+c2VydmljZTwvcGFyYW1ldGVyPi0tPgotICAgIDwhLS1UbyBvdmVycmlkZSByZXBvc2l0b3J5L21vZHVsZXMgeW91IG5lZWQgdG8gdW5jb21tZW50IGZvbGxvd2luZyBwYXJhbWV0ZXIgYW5kIHZhbHVlIFNIT1VMRCBiZSBhYnNvbHV0ZSBmaWxlIHBhdGgtLT4KLSAgICA8IS0tPHBhcmFtZXRlciBuYW1lPSJNb2R1bGVzRGlyZWN0b3J5Ij5tb2R1bGVzPC9wYXJhbWV0ZXI+LS0+Ci0KLQotCi0gICAgPCEtLUZvbGxvd2luZyBwYXJhbXMgd2lsbCBzZXQgdGhlIHByb3BlciBjb250ZXh0IHBhdGhzIGZvciBpbnZvY2F0aW9ucy4gQWxsIHRoZSBlbmRwb2ludHMgd2lsbCBoYXZlIGEgY29tbW9ucyBjb250ZXh0LS0+Ci0gICAgPCEtLXJvb3Qgd2hpY2ggY2FuIGNvbmZpZ3VyZWQgdXNpbmcgdGhlIGZvbGxvd2luZyBjb250ZXh0Um9vdCBwYXJhbWV0ZXItLT4KLSAgICA8IS0tPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0Um9vdCI+YXhpczI8L3BhcmFtZXRlcj4tLT4KLQotICAgIDwhLS1PdXIgSFRUUCBlbmRwb2ludHMgY2FuIGhhbmRsZSBib3RoIFJFU1QgYW5kIFNPQVAuIEZvbGxvd2luZyBwYXJhbWV0ZXJzIGNhbiBiZSB1c2VkIHRvIGRpc3RpbmdpdXNoIHRob3NlIGVuZHBvaW50cy0tPgotICAgIDwhLS1JbiBjYXNlIG9mIGEgc2VydmxldCwgaWYgeW91IGNoYW5nZSB0aGlzIHlvdSBoYXZlIHRvIG1hbnVhbGx5IGNoYW5nZSB0aGUgc2V0dGluZ3Mgb2YgeW91ciBzZXJ2bGV0IGNvbnRhaW5lciB0byBtYXAgdGhpcyAtLT4KLSAgICA8IS0tY29udGV4dCBwYXRoIHRvIHByb3BlciBBeGlzMiBzZXJ2bGV0cy0tPgotICAgIDwhLS08cGFyYW1ldGVyIG5hbWU9InNlcnZpY2VQYXRoIj5zZXJ2aWNlczwvcGFyYW1ldGVyPi0tPgotICAgIDwhLS08cGFyYW1ldGVyIG5hbWU9InJlc3RQYXRoIj5yZXN0PC9wYXJhbWV0ZXI+LS0+Ci0KLQotICAgIDwhLS1TZXQgdGhlIGZsYWcgdG8gdHJ1ZSBpZiB5b3Ugd2FudCB0byBlbmFibGUgdHJhbnNwb3J0IGxldmVsIHNlc3Npb24gbWFuZ21lbnQtLT4KLSAgICA8cGFyYW1ldGVyIG5hbWU9Im1hbmFnZVRyYW5zcG9ydFNlc3Npb24iPmZhbHNlPC9wYXJhbWV0ZXI+Ci0KLSAgICA8IS0tRm9sbG93aW5nIHR3byBwYXJhbWV0ZXJzIHdpbGwgYmUgdXNlZCB0byBoYW5kbGUgUkVTVCBpbiBBeGlzMi4gVGhlIGRlZmF1bHQgc2V0dGluZ3Mgd2lsbCBtYWtlIEF4aXMyIHRvIGhhdmUgdHdvLS0+Ci0gICAgPCEtLWRpZmZlcmVudCBlbmRwb2ludHMsIG9uZSBmb3IgUkVTVCAoQXhpc1JFU1RTZXJ2bGV0KSBvbmUgZm9yIFNPQVAgbWVzc2FnZSBoYW5kbGluZyAoQXhpc1NlcnZsZXQpLiBCdXQgZm9sbG93aW5nLS0+Ci0gICAgPCEtLXBhcmFtZXRlcnMgaGVscCB0byB0d2VhayB0aGUgbWVzc2FnZSBoYW5kbGluZyBvZiB0d28gbWFpbiBzZXJ2bGV0cy4gLS0+Ci0KLSAgICA8IS0tIElmIHRoZSBlbmFibGVSRVNUSW5BeGlzMk1haW5TZXJ2bGV0IGlzIHRydWUsIHRoZW4gQXhpczJNYWluU2VydmxldCB3aWxsIGhhbmRsZSBib3RoIFNPQVAgYW5kIFJFU1QgbWVzc2FnZXMgLS0+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJlbmFibGVSRVNUSW5BeGlzMk1haW5TZXJ2bGV0IiBsb2NrZWQ9InRydWUiPmZhbHNlPC9wYXJhbWV0ZXI+Ci0KLSAgICA8IS0tIEZvbGxvd2luZyBwYXJhbWV0ZXIgd2lsbCBjb21wbGV0ZWx5IGRpc2FibGUgUkVTVCBoYW5kbGluZyBpbiBib3RoIHRoZSBzZXJ2bGV0cy0tPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iZGlzYWJsZVJFU1QiIGxvY2tlZD0idHJ1ZSI+ZmFsc2U8L3BhcmFtZXRlcj4KLQotICAgIDwhLS0gVGhpcyB3aWxsIGRpc2FibGUgdGhlIHNlcGFyYXRlIHNlcnZsZXQgd2UgaGF2ZSBmb3IgUkVTVCBoYW5kbGluZy4gLS0+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJkaXNhYmxlU2VwYXJhdGVFbmRwb2ludEZvclJFU1QiIGxvY2tlZD0idHJ1ZSI+ZmFsc2U8L3BhcmFtZXRlcj4KLQotICAgIDwhLS0gSWYgeW91IGhhdmUgYSBmcm9udGVuZCBob3N0IHdoaWNoIGV4cG9zZXMgdGhpcyB3ZWJzZXJ2aWNlIHVzaW5nIGEgZGlmZmVyZW50IHB1YmxpYyBVUkwgIC0tPgotICAgIDwhLS0gdXNlIHRoaXMgcGFyYW1ldGVyIHRvIG92ZXJyaWRlIGF1dG9kZXRlY3RlZCB1cmwgLS0+Ci0gICAgPCEtLTxwYXJhbWV0ZXIgbmFtZT0iaHR0cEZyb250ZW5kSG9zdFVybCI+aHR0cHM6Ly9zb21lb3RoZXJob3N0L2NvbnRleHQ8L3BhcmFtZXRlcj4tLT4KLQotCi0gICAgPCEtLSAgICBUaGUgd2F5IG9mIGFkZGluZyBsaXN0ZW5lciB0byB0aGUgc3lzdGVtLS0+Ci0gICAgPCEtLSAgICA8bGlzdGVuZXIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuT2JzZXJ2ZXJJTVBMIj4tLT4KLSAgICA8IS0tICAgICAgICA8cGFyYW1ldGVyIG5hbWU9IlJTU19VUkwiPmh0dHA6Ly8xMjcuMC4wLjEvcnNzPC9wYXJhbWV0ZXI+LS0+Ci0gICAgPCEtLSAgICA8L2xpc3RlbmVyPi0tPgotCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gTWVzc2FnZSBSZWNlaXZlcnMgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS1UaGlzIGlzIHRoZSBEZWFmdWx0IE1lc3NhZ2UgUmVjZWl2ZXIgZm9yIHRoZSBzeXN0ZW0gLCBpZiB5b3Ugd2FudCB0byBoYXZlIE1lc3NhZ2VSZWNlaXZlcnMgZm9yIC0tPgotICAgIDwhLS1hbGwgdGhlIG90aGVyIE1FUCBpbXBsZW1lbnQgaXQgYW5kIGFkZCB0aGUgY29ycmVjdCBlbnRyeSB0byBoZXJlICwgc28gdGhhdCB5b3UgY2FuIHJlZmVyIGZyb20tLT4KLSAgICA8IS0tYW55IG9wZXJhdGlvbiAtLT4KLSAgICA8IS0tTm90ZSA6IFlvdSBjYW4gb3ZyaWRlIHRoaXMgZm9yIHBhcnRpY3VsYXIgc2VydmljZSBieSBhZGRpbmcgdGhlIHNhbWUgZWxlbWVudCB3aXRoIHlvdXIgcmVxdWlyZW1lbnQtLT4KLSAgICA8bWVzc2FnZVJlY2VpdmVycz4KLSAgICAgICAgPG1lc3NhZ2VSZWNlaXZlciBtZXA9Imh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgvd3NkbC9pbi1vbmx5IgotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5SYXdYTUxJTk9ubHlNZXNzYWdlUmVjZWl2ZXIiLz4KLSAgICAgICAgPG1lc3NhZ2VSZWNlaXZlciBtZXA9Imh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgvd3NkbC9pbi1vdXQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLlJhd1hNTElOT3V0TWVzc2FnZVJlY2VpdmVyIi8+Ci0gICAgPC9tZXNzYWdlUmVjZWl2ZXJzPgotICAgIAotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIE1lc3NhZ2UgRm9ybWF0dGVyIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tRm9sbG93aW5nIGNvbnRlbnQgdHlwZSB0byBtZXNzYWdlIGZvcm1hdHRlciBtYXBwaW5nIGNhbiBiZSB1c2VkIHRvIGltcGxlbWVudCBzdXBwb3J0IGZvciBkaWZmZXJlbnQgbWVzc2FnZSAtLT4KLSAgICA8IS0tZm9ybWF0ICBzZXJpYWxpemF0aW9uIGluIEF4aXMyLiBUaGVzZSBtZXNzYWdlIGZvcm1hdHMgYXJlIGV4cGVjdGVkIHRvIGJlIHJlc29sdmVkIGJhc2VkIG9uIHRoZSBjb250ZW50IHR5cGUuIC0tPgotICAgIDxtZXNzYWdlRm9ybWF0dGVycz4KLSAgICAgICAgPG1lc3NhZ2VGb3JtYXR0ZXIgY29udGVudFR5cGU9ImFwcGxpY2F0aW9uL3NvYXAreG1sIgotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLlNPQVBNZXNzYWdlRm9ybWF0dGVyIi8+Ci0gICAgPC9tZXNzYWdlRm9ybWF0dGVycz4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBUcmFuc3BvcnQgSW5zIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotCi0JPCEtLVVuY29tbWVudCBpZiB5b3Ugd2FudCB0byBoYXZlIFRDUCB0cmFuc3BvcnQgc3VwcG9ydC0tPgotICAgIDwhLS10cmFuc3BvcnRSZWNlaXZlciBuYW1lPSJ0Y3AiCi0gICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC50Y3AuVENQU2VydmVyIj4KLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJwb3J0Ij42MDYwPC9wYXJhbWV0ZXItLT4+Ci0gICAgICAgIDwhLS1JZiB5b3Ugd2FudCB0byBnaXZlIHlvdXIgb3duIGhvc3QgYWRkcmVzcyBmb3IgRVBSIGdlbmVyYXRpb24tLT4KLSAgICAgICAgPCEtLXVuY29tbWV0IGZvbGxvd2luZyBwYXJhbXRlciAsIGFuZCBzZXQgYXMgeW91IHJlcXVpcmVkLi0tPgotICAgICAgICA8IS0tPHBhcmFtZXRlciBuYW1lPSJob3N0bmFtZSI+dGNwOi8vbXlBcHAuY29tL3dzPC9wYXJhbWV0ZXI+LS0+Ci0gICAgPCEtLSAvdHJhbnNwb3J0UmVjZWl2ZXIgLS0+Ci0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBUcmFuc3BvcnQgT3V0cyAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0KLSAgIAotCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gR2xvYmFsIE1vZHVsZXMgIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIENvbW1lbnQgdGhpcyB0byBkaXNhYmxlIEFkZHJlc3NpbmcgLS0+Ci0gICAgPG1vZHVsZSByZWY9ImFkZHJlc3NpbmciLz4KLQotICAgIDwhLS1Db25maWd1cmluZyBtb2R1bGUgLCBwcm92aWRpbmcgcGFyYW1ldGVycyBmb3IgbW9kdWxlcyB3aGV0aGVyIHRoZXkgcmVmZXIgb3Igbm90LS0+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+Ci0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L21lc3NhZ2VGb3JtYXR0ZXJUZXN0L2JhZC1heGlzMi54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9tZXNzYWdlRm9ybWF0dGVyVGVzdC9iYWQtYXhpczIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjBiNzBhLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L21lc3NhZ2VGb3JtYXR0ZXJUZXN0L2JhZC1heGlzMi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNzMgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotIAotPGF4aXNjb25maWcgbmFtZT0iQXhpc0phdmEyLjAiPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIFBhcmFtZXRlcnMgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iaG90ZGVwbG95bWVudCI+dHJ1ZTwvcGFyYW1ldGVyPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iaG90dXBkYXRlIj5mYWxzZTwvcGFyYW1ldGVyPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iZW5hYmxlTVRPTSI+ZmFsc2U8L3BhcmFtZXRlcj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImVuYWJsZVN3QSI+ZmFsc2U8L3BhcmFtZXRlcj4KLQotICAgIDwhLS1VbmNvbW1lbnQgaWYgeW91IHdhbnQgdG8gZW5hYmxlIGZpbGUgY2FjaGluZyBmb3IgYXR0YWNobWVudHMgLS0+Ci0gICAgPCEtLXBhcmFtZXRlciBuYW1lPSJjYWNoZUF0dGFjaG1lbnRzIj50cnVlPC9wYXJhbWV0ZXI+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJhdHRhY2htZW50RElSIj48L3BhcmFtZXRlcj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9InNpemVUaHJlc2hvbGQiPjQwMDA8L3BhcmFtZXRlci0tPgotCi0gICAgPCEtLVRoaXMgd2lsbCBnaXZlIG91dCB0aGUgdGltb3V0IG9mIHRoZSBjb25maWd1cmF0aW9uIGNvbnRleHRzLCBpbiBzZWNvbmRzLS0+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJDb25maWdDb250ZXh0VGltZW91dEludGVydmFsIj4zMDwvcGFyYW1ldGVyPgotCi0gICAgPCEtLUR1cmluZyBhIGZhdWx0LCBzdGFja3RyYWNlIGNhbiBiZSBzZW50IHdpdGggdGhlIGZhdWx0IG1lc3NhZ2UuIFRoZSBmb2xsb3dpbmcgZmxhZyB3aWxsIGNvbnRyb2wgLS0+Ci0gICAgPCEtLXRoYXQgYmVoYXZpb3VyLi0tPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0ic2VuZFN0YWNrdHJhY2VEZXRhaWxzV2l0aEZhdWx0cyI+ZmFsc2U8L3BhcmFtZXRlcj4KLQotICAgIDwhLS1JZiB0aGVyZSBhcmVuJ3QgYW55IGluZm9ybWF0aW9uIGF2YWlsYWJsZSB0byBmaW5kIG91dCB0aGUgZmF1bHQgcmVhc29uLCB3ZSBzZXQgdGhlIG1lc3NhZ2Ugb2YgdGhlIGV4cGNldGlvbi0tPgotICAgIDwhLS1hcyB0aGUgZmF1bHRyZWFzb24vUmVhc29uLiBCdXQgd2hlbiBhIGZhdWx0IGlzIHRocm93biBmcm9tIGEgc2VydmljZSBvciBzb21lIHdoZXJlLCBpdCB3aWxsIGJlIC0tPgotICAgIDwhLS13cmFwcGVkIGJ5IGRpZmZlcmVudCBsZXZlbHMuIER1ZSB0byB0aGlzIHRoZSBpbml0aWFsIGV4Y2VwdGlvbiBtZXNzYWdlIGNhbiBiZSBsb3N0LiBJZiB0aGlzIGZsYWctLT4KLSAgICA8IS0taXMgc2V0IHRoZW4sIEF4aXMyIHRyaWVzIHRvIGdldCB0aGUgZmlyc3QgZXhjZXB0aW9uIGFuZCBzZXQgaXRzIG1lc3NhZ2UgYXMgdGhlIGZhdWx0cmVhc29uL1JlYXNvbi4tLT4KLSAgICA8cGFyYW1ldGVyIG5hbWU9IkRyaWxsRG93blRvUm9vdENhdXNlRm9yRmF1bHRSZWFzb24iPmZhbHNlPC9wYXJhbWV0ZXI+Ci0KLSAgICA8cGFyYW1ldGVyIG5hbWU9InVzZXJOYW1lIj5hZG1pbjwvcGFyYW1ldGVyPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFzc3dvcmQiPmF4aXMyPC9wYXJhbWV0ZXI+Ci0KLSAgICA8IS0tVG8gb3ZlcnJpZGUgcmVwb3NpdG9yeS9zZXJ2aWNlcyB5b3UgbmVlZCB0byB1bmNvbW1lbnQgZm9sbG93aW5nIHBhcmFtZXRlciBhbmQgdmFsdWUgU0hPVUxEIGJlIGFic29sdXRlIGZpbGUgcGF0aC4tLT4KLSAgICA8IS0tPHBhcmFtZXRlciBuYW1lPSJTZXJ2aWNlc0RpcmVjdG9yeSI+c2VydmljZTwvcGFyYW1ldGVyPi0tPgotICAgIDwhLS1UbyBvdmVycmlkZSByZXBvc2l0b3J5L21vZHVsZXMgeW91IG5lZWQgdG8gdW5jb21tZW50IGZvbGxvd2luZyBwYXJhbWV0ZXIgYW5kIHZhbHVlIFNIT1VMRCBiZSBhYnNvbHV0ZSBmaWxlIHBhdGgtLT4KLSAgICA8IS0tPHBhcmFtZXRlciBuYW1lPSJNb2R1bGVzRGlyZWN0b3J5Ij5tb2R1bGVzPC9wYXJhbWV0ZXI+LS0+Ci0KLQotCi0gICAgPCEtLUZvbGxvd2luZyBwYXJhbXMgd2lsbCBzZXQgdGhlIHByb3BlciBjb250ZXh0IHBhdGhzIGZvciBpbnZvY2F0aW9ucy4gQWxsIHRoZSBlbmRwb2ludHMgd2lsbCBoYXZlIGEgY29tbW9ucyBjb250ZXh0LS0+Ci0gICAgPCEtLXJvb3Qgd2hpY2ggY2FuIGNvbmZpZ3VyZWQgdXNpbmcgdGhlIGZvbGxvd2luZyBjb250ZXh0Um9vdCBwYXJhbWV0ZXItLT4KLSAgICA8IS0tPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0Um9vdCI+YXhpczI8L3BhcmFtZXRlcj4tLT4KLQotICAgIDwhLS1PdXIgSFRUUCBlbmRwb2ludHMgY2FuIGhhbmRsZSBib3RoIFJFU1QgYW5kIFNPQVAuIEZvbGxvd2luZyBwYXJhbWV0ZXJzIGNhbiBiZSB1c2VkIHRvIGRpc3RpbmdpdXNoIHRob3NlIGVuZHBvaW50cy0tPgotICAgIDwhLS1JbiBjYXNlIG9mIGEgc2VydmxldCwgaWYgeW91IGNoYW5nZSB0aGlzIHlvdSBoYXZlIHRvIG1hbnVhbGx5IGNoYW5nZSB0aGUgc2V0dGluZ3Mgb2YgeW91ciBzZXJ2bGV0IGNvbnRhaW5lciB0byBtYXAgdGhpcyAtLT4KLSAgICA8IS0tY29udGV4dCBwYXRoIHRvIHByb3BlciBBeGlzMiBzZXJ2bGV0cy0tPgotICAgIDwhLS08cGFyYW1ldGVyIG5hbWU9InNlcnZpY2VQYXRoIj5zZXJ2aWNlczwvcGFyYW1ldGVyPi0tPgotICAgIDwhLS08cGFyYW1ldGVyIG5hbWU9InJlc3RQYXRoIj5yZXN0PC9wYXJhbWV0ZXI+LS0+Ci0KLQotICAgIDwhLS1TZXQgdGhlIGZsYWcgdG8gdHJ1ZSBpZiB5b3Ugd2FudCB0byBlbmFibGUgdHJhbnNwb3J0IGxldmVsIHNlc3Npb24gbWFuZ21lbnQtLT4KLSAgICA8cGFyYW1ldGVyIG5hbWU9Im1hbmFnZVRyYW5zcG9ydFNlc3Npb24iPmZhbHNlPC9wYXJhbWV0ZXI+Ci0KLSAgICA8IS0tRm9sbG93aW5nIHR3byBwYXJhbWV0ZXJzIHdpbGwgYmUgdXNlZCB0byBoYW5kbGUgUkVTVCBpbiBBeGlzMi4gVGhlIGRlZmF1bHQgc2V0dGluZ3Mgd2lsbCBtYWtlIEF4aXMyIHRvIGhhdmUgdHdvLS0+Ci0gICAgPCEtLWRpZmZlcmVudCBlbmRwb2ludHMsIG9uZSBmb3IgUkVTVCAoQXhpc1JFU1RTZXJ2bGV0KSBvbmUgZm9yIFNPQVAgbWVzc2FnZSBoYW5kbGluZyAoQXhpc1NlcnZsZXQpLiBCdXQgZm9sbG93aW5nLS0+Ci0gICAgPCEtLXBhcmFtZXRlcnMgaGVscCB0byB0d2VhayB0aGUgbWVzc2FnZSBoYW5kbGluZyBvZiB0d28gbWFpbiBzZXJ2bGV0cy4gLS0+Ci0KLSAgICA8IS0tIElmIHRoZSBlbmFibGVSRVNUSW5BeGlzMk1haW5TZXJ2bGV0IGlzIHRydWUsIHRoZW4gQXhpczJNYWluU2VydmxldCB3aWxsIGhhbmRsZSBib3RoIFNPQVAgYW5kIFJFU1QgbWVzc2FnZXMgLS0+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJlbmFibGVSRVNUSW5BeGlzMk1haW5TZXJ2bGV0IiBsb2NrZWQ9InRydWUiPmZhbHNlPC9wYXJhbWV0ZXI+Ci0KLSAgICA8IS0tIEZvbGxvd2luZyBwYXJhbWV0ZXIgd2lsbCBjb21wbGV0ZWx5IGRpc2FibGUgUkVTVCBoYW5kbGluZyBpbiBib3RoIHRoZSBzZXJ2bGV0cy0tPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iZGlzYWJsZVJFU1QiIGxvY2tlZD0idHJ1ZSI+ZmFsc2U8L3BhcmFtZXRlcj4KLQotICAgIDwhLS0gVGhpcyB3aWxsIGRpc2FibGUgdGhlIHNlcGFyYXRlIHNlcnZsZXQgd2UgaGF2ZSBmb3IgUkVTVCBoYW5kbGluZy4gLS0+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJkaXNhYmxlU2VwYXJhdGVFbmRwb2ludEZvclJFU1QiIGxvY2tlZD0idHJ1ZSI+ZmFsc2U8L3BhcmFtZXRlcj4KLQotICAgIDwhLS0gSWYgeW91IGhhdmUgYSBmcm9udGVuZCBob3N0IHdoaWNoIGV4cG9zZXMgdGhpcyB3ZWJzZXJ2aWNlIHVzaW5nIGEgZGlmZmVyZW50IHB1YmxpYyBVUkwgIC0tPgotICAgIDwhLS0gdXNlIHRoaXMgcGFyYW1ldGVyIHRvIG92ZXJyaWRlIGF1dG9kZXRlY3RlZCB1cmwgLS0+Ci0gICAgPCEtLTxwYXJhbWV0ZXIgbmFtZT0iaHR0cEZyb250ZW5kSG9zdFVybCI+aHR0cHM6Ly9zb21lb3RoZXJob3N0L2NvbnRleHQ8L3BhcmFtZXRlcj4tLT4KLQotCi0gICAgPCEtLSAgICBUaGUgd2F5IG9mIGFkZGluZyBsaXN0ZW5lciB0byB0aGUgc3lzdGVtLS0+Ci0gICAgPCEtLSAgICA8bGlzdGVuZXIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuT2JzZXJ2ZXJJTVBMIj4tLT4KLSAgICA8IS0tICAgICAgICA8cGFyYW1ldGVyIG5hbWU9IlJTU19VUkwiPmh0dHA6Ly8xMjcuMC4wLjEvcnNzPC9wYXJhbWV0ZXI+LS0+Ci0gICAgPCEtLSAgICA8L2xpc3RlbmVyPi0tPgotCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gTWVzc2FnZSBSZWNlaXZlcnMgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS1UaGlzIGlzIHRoZSBEZWFmdWx0IE1lc3NhZ2UgUmVjZWl2ZXIgZm9yIHRoZSBzeXN0ZW0gLCBpZiB5b3Ugd2FudCB0byBoYXZlIE1lc3NhZ2VSZWNlaXZlcnMgZm9yIC0tPgotICAgIDwhLS1hbGwgdGhlIG90aGVyIE1FUCBpbXBsZW1lbnQgaXQgYW5kIGFkZCB0aGUgY29ycmVjdCBlbnRyeSB0byBoZXJlICwgc28gdGhhdCB5b3UgY2FuIHJlZmVyIGZyb20tLT4KLSAgICA8IS0tYW55IG9wZXJhdGlvbiAtLT4KLSAgICA8IS0tTm90ZSA6IFlvdSBjYW4gb3ZyaWRlIHRoaXMgZm9yIHBhcnRpY3VsYXIgc2VydmljZSBieSBhZGRpbmcgdGhlIHNhbWUgZWxlbWVudCB3aXRoIHlvdXIgcmVxdWlyZW1lbnQtLT4KLSAgICA8bWVzc2FnZVJlY2VpdmVycz4KLSAgICAgICAgPG1lc3NhZ2VSZWNlaXZlciBtZXA9Imh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgvd3NkbC9pbi1vbmx5IgotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5SYXdYTUxJTk9ubHlNZXNzYWdlUmVjZWl2ZXIiLz4KLSAgICAgICAgPG1lc3NhZ2VSZWNlaXZlciBtZXA9Imh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgvd3NkbC9pbi1vdXQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLlJhd1hNTElOT3V0TWVzc2FnZVJlY2VpdmVyIi8+Ci0gICAgPC9tZXNzYWdlUmVjZWl2ZXJzPgotICAgIAotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIE1lc3NhZ2UgRm9ybWF0dGVyIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tRm9sbG93aW5nIGNvbnRlbnQgdHlwZSB0byBtZXNzYWdlIGZvcm1hdHRlciBtYXBwaW5nIGNhbiBiZSB1c2VkIHRvIGltcGxlbWVudCBzdXBwb3J0IGZvciBkaWZmZXJlbnQgbWVzc2FnZSAtLT4KLSAgICA8IS0tZm9ybWF0cyAgc2VyaWFsaXphdGlvbiBpbiBBeGlzMi4gVGhlc2UgbWVzc2FnZSBmb3JtYXRzIGFyZSBleHBlY3RlZCB0byBiZSByZXNvbHZlZCBiYXNlZCBvbiB0aGUgY29udGVudCB0eXBlLiAtLT4KLSAgICA8bWVzc2FnZUJ1aWxkZXJzPgotICAgICAgICA8bWVzc2FnZUJ1aWxkZXIgY29udGVudFR5cGU9ImFwcGxpY2F0aW9uL3NvYXAreG1sIgotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkZhbHNlTWVzc2FnZUZvcm1hdHRlciIvPgotICAgIDwvbWVzc2FnZUJ1aWxkZXJzPgotICAgIAotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIFRyYW5zcG9ydCBJbnMgLS0+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+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJBZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciI+Ci0gICAgICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJEaXNwYXRjaCIvPgotICAgICAgICAgICAgPC9oYW5kbGVyPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iUmVxdWVzdFVSSU9wZXJhdGlvbkRpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5SZXF1ZXN0VVJJT3BlcmF0aW9uRGlzcGF0Y2hlciI+Ci0gICAgICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJEaXNwYXRjaCIvPgotICAgICAgICAgICAgPC9oYW5kbGVyPgotCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiPgotICAgICAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iRGlzcGF0Y2giLz4KLSAgICAgICAgICAgIDwvaGFuZGxlcj4KLSAgICAgICAgPC9waGFzZT4KLSAgICAgICAgPCEtLSAgU3lzdGVtIHByZSBkZWZpbmVkIHBoYXNlcyAgICAgICAtLT4KLSAgICAgICAgPCEtLSAgIEFmdGVyIFBvc3RkaXNwYXRjaCBwaGFzZSBtb2R1bGUgYXV0aG9yIG9yIG9yIHNlcnZpY2UgYXV0aG9yIGNhbiBhZGQgYW55IHBoYXNlIGhlIHdhbnQgICAgICAtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik9wZXJhdGlvbkluUGhhc2UiLz4KLQk8cGhhc2UgbmFtZT0ic29hcG1vbml0b3JQaGFzZSIvPgotICAgIDwvcGhhc2VPcmRlcj4KLSAgICA8cGhhc2VPcmRlciB0eXBlPSJPdXRGbG93Ij4KLSAgICAgICAgPCEtLSAgICAgIHVzZXIgY2FuIGFkZCBoaXMgb3duIHBoYXNlcyB0byB0aGlzIGFyZWEgIC0tPgotCTxwaGFzZSBuYW1lPSJzb2FwbW9uaXRvclBoYXNlIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJPcGVyYXRpb25PdXRQaGFzZSIvPgotICAgICAgICA8IS0tc3lzdGVtIHByZWRlZmluZWQgcGhhc2UtLT4KLSAgICAgICAgPCEtLXRoZXNlIHBoYXNlIHdpbGwgcnVuIGlycmVzcGVjdGl2ZSBvZiB0aGUgc2VydmljZS0tPgotICAgICAgICA8cGhhc2UgbmFtZT0iUG9saWN5RGV0ZXJtaW5hdGlvbiIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iTWVzc2FnZU91dCIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iU2VjdXJpdHkiLz4KLSAgICA8L3BoYXNlT3JkZXI+Ci0gICAgPHBoYXNlT3JkZXIgdHlwZT0iSW5GYXVsdEZsb3ciPgotICAgICAgICA8cGhhc2UgbmFtZT0iUHJlRGlzcGF0Y2giLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9IkRpc3BhdGNoIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuRGlzcGF0Y2hQaGFzZSI+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJSZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciI+Ci0gICAgICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJEaXNwYXRjaCIvPgotICAgICAgICAgICAgPC9oYW5kbGVyPgotCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciI+Ci0gICAgICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJEaXNwYXRjaCIvPgotICAgICAgICAgICAgPC9oYW5kbGVyPgotCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJBZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciI+Ci0gICAgICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJEaXNwYXRjaCIvPgotICAgICAgICAgICAgPC9oYW5kbGVyPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iUmVxdWVzdFVSSU9wZXJhdGlvbkRpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5SZXF1ZXN0VVJJT3BlcmF0aW9uRGlzcGF0Y2hlciI+Ci0gICAgICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJEaXNwYXRjaCIvPgotICAgICAgICAgICAgPC9oYW5kbGVyPgotCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiPgotICAgICAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iRGlzcGF0Y2giLz4KLSAgICAgICAgICAgIDwvaGFuZGxlcj4KLSAgICAgICAgPC9waGFzZT4KLSAgICAgICAgPCEtLSAgICAgIHVzZXIgY2FuIGFkZCBoaXMgb3duIHBoYXNlcyB0byB0aGlzIGFyZWEgIC0tPgotICAgICAgICA8cGhhc2UgbmFtZT0iT3BlcmF0aW9uSW5GYXVsdFBoYXNlIi8+Ci0JPHBoYXNlIG5hbWU9InNvYXBtb25pdG9yUGhhc2UiLz4KLSAgICA8L3BoYXNlT3JkZXI+Ci0gICAgPHBoYXNlT3JkZXIgdHlwZT0iT3V0RmF1bHRGbG93Ij4KLSAgICAgICAgPCEtLSAgICAgIHVzZXIgY2FuIGFkZCBoaXMgb3duIHBoYXNlcyB0byB0aGlzIGFyZWEgIC0tPgotCTxwaGFzZSBuYW1lPSJzb2FwbW9uaXRvclBoYXNlIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJPcGVyYXRpb25PdXRGYXVsdFBoYXNlIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJQb2xpY3lEZXRlcm1pbmF0aW9uIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJNZXNzYWdlT3V0Ii8+Ci0gICAgPC9waGFzZU9yZGVyPgotPC9heGlzY29uZmlnPgotCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9tb2R1bGUxL01FVEEtSU5GL01BTklGRVNULk1GIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvbW9kdWxlMS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2E1MGI4Zi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9tb2R1bGUxL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjANCi1DcmVhdGVkLUJ5OiBBbnQgMS40LjENCi0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9tb2R1bGUxL01FVEEtSU5GL21vZHVsZS54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9tb2R1bGUxL01FVEEtSU5GL21vZHVsZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxZWQ5ZjAuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvbW9kdWxlMS9NRVRBLUlORi9tb2R1bGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08bW9kdWxlIG5hbWU9Im1vZHVsZTEiPgotICAgIDxJbkZsb3c+Ci0gICAgICAgIDxoYW5kbGVyIG5hbWU9ImgxIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5yZWdpc3RyeS5IYW5kbGVyMyI+Ci0gICAgICAgICAgICA8b3JkZXIgcGhhc2U9Ik9wZXJhdGlvbkluUGhhc2UiLz4KLSAgICAgICAgPC9oYW5kbGVyPgotICAgICAgICA8aGFuZGxlciBuYW1lPSJoMiIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIucmVnaXN0cnkuSGFuZGxlcjMiPgotICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJPcGVyYXRpb25JblBoYXNlIi8+Ci0gICAgICAgIDwvaGFuZGxlcj4KLSAgICAgICAgPGhhbmRsZXIgbmFtZT0iaDYiIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJlZ2lzdHJ5LkhhbmRsZXIzIj4KLSAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iTmV3UGhhc2UiLz4KLSAgICAgICAgPC9oYW5kbGVyPgotICAgICAgICAgPGhhbmRsZXIgbmFtZT0iaDEwIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5yZWdpc3RyeS5IYW5kbGVyMyI+Ci0gICAgICAgICAgICA8b3JkZXIgcGhhc2VMYXN0PSJ0cnVlIiBwaGFzZT0iTmV3UGhhc2UiLz4KLSAgICAgICAgPC9oYW5kbGVyPgotICAgICAgICA8aGFuZGxlciBuYW1lPSJoMTEiIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJlZ2lzdHJ5LkhhbmRsZXIzIj4KLSAgICAgICAgICAgIDxvcmRlciBhZnRlcj0iaDYiIHBoYXNlPSJOZXdQaGFzZSIvPgotICAgICAgICA8L2hhbmRsZXI+Ci0gICAgPC9JbkZsb3c+Ci0gICAgPE91dEZsb3c+Ci0gICAgICAgIDxoYW5kbGVyIG5hbWU9ImgzIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5yZWdpc3RyeS5IYW5kbGVyMyI+Ci0gICAgICAgICAgICA8b3JkZXIgcGhhc2U9Ik9wZXJhdGlvbk91dFBoYXNlIi8+Ci0gICAgICAgIDwvaGFuZGxlcj4KLSAgICA8L091dEZsb3c+Ci0KLSAgICA8T3V0RmF1bHRGbG93PgotICAgICAgICA8aGFuZGxlciBuYW1lPSJoNCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIucmVnaXN0cnkuSGFuZGxlcjMiPgotICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJPcGVyYXRpb25PdXRGYXVsdFBoYXNlIi8+Ci0gICAgICAgIDwvaGFuZGxlcj4KLSAgICA8L091dEZhdWx0Rmxvdz4KLQotICAgIDxJbkZhdWx0Rmxvdz4KLSAgICAgICAgPGhhbmRsZXIgbmFtZT0iaDUiIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJlZ2lzdHJ5LkhhbmRsZXIzIj4KLSAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iT3BlcmF0aW9uSW5GYXVsdFBoYXNlIi8+Ci0gICAgICAgIDwvaGFuZGxlcj4KLSAgICA8L0luRmF1bHRGbG93PgotCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJjcmVhdFNlcSIgbWVwPSJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaW4tb3V0Ij4KLSAgICAgICAgPG1lc3NhZ2VSZWNlaXZlciBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuUmF3WE1MSU5PdXRNZXNzYWdlUmVjZWl2ZXIiLz4KLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJwYXJhMSIgbG9ja2VkPSJ4c2Q6dHJ1ZSI+MTA8L3BhcmFtZXRlcj4KLSAgICA8L29wZXJhdGlvbj4KLQotICAgIDwhLS0gVGhpcyBjaGVja3MgdGhhdCBwaGFzZXMgY2FuIGJlIGFkZGVkLCB0aGF0IGNvbW1hLXNlcGFyYXRlZCBmbG93IGxpc3RzIHdvcmssIC0tPgotICAgIDwhLS0gYW5kIHRoYXQgY2FzZS1pbnNlbnNpdGl2ZSBjb21wYXJpc29ucyBhcmUgdXNlZCBmb3IgZmxvdyBuYW1lcy4gICAgICAgICAgICAgIC0tPgotICAgIDxwaGFzZSBuYW1lPSJOZXdQaGFzZSIgYmVmb3JlPSJEaXNwYXRjaCIgYWZ0ZXI9IlNlY3VyaXR5IiBmbG93PSJJbkZsb3csb1V0RmxPdyIvPgotCi0gICAgPHBoYXNlIG5hbWU9Ik5ld1BoYXNlIiBiZWZvcmU9IkRpc3BhdGNoIiAgZmxvdz0iSW5GYXVsdEZsb3ciLz4KLSAgICA8cGhhc2UgbmFtZT0iU2VjdXJpdHkiIGZsb3c9IkluRmxvdyIvPiA8IS0tIE1ha2Ugc3VyZSBkdXBsaWNhdGVzIGFyZSBPSyAtLT4KLTwvbW9kdWxlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L21vZHVsZTEvYnVpbGQueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvbW9kdWxlMS9idWlsZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjNzVmNTEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvbW9kdWxlMS9idWlsZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08cHJvamVjdCBiYXNlZGlyPSIuIiBkZWZhdWx0PSJqYXIiPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJzcmMiIGxvY2F0aW9uPSIuIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkIiBsb2NhdGlvbj0iYnVpbGQiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iYnVpbGQuY2xhc3NlcyIgbG9jYXRpb249IiR7YnVpbGR9L2NsYXNzZXMiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iYnVpbGQubGliIiBsb2NhdGlvbj0iJHtidWlsZH0vbGliIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImxpYiIgbG9jYXRpb249ImxpYiIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJyb290IiBsb2NhdGlvbj0iLi4vLi4vLi4vIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9Imphci5kaXIiIGxvY2F0aW9uPSIke3Jvb3R9L3RhcmdldC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L21vZHVsZXMvIi8+Ci0KLSAgICA8cGF0aCBpZD0iYXhpcy50ZXN0LmNsYXNzcGF0aCI+Ci0gICAgICAgIDxwYXRoIHJlZmlkPSJtYXZlbi5kZXBlbmRlbmN5LmNsYXNzcGF0aCI+PC9wYXRoPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249Ii4uLy4uLy4uL3RhcmdldC9jbGFzc2VzIi8+Ci0gICAgPC9wYXRoPgotCi0gICAgPHRhcmdldCBuYW1lPSJjb21waWxlIiBkZXBlbmRzPSJpbml0IiB1bmxlc3M9ImphcnMudXB0b2RhdGUiPgotICAgICAgICA8bWtkaXIgZGlyPSIke2J1aWxkLmNsYXNzZXN9Ii8+Ci0gICAgICAgIDxta2RpciBkaXI9IiR7YnVpbGQubGlifSIvPgotICAgICAgICA8amF2YWMgZGVzdGRpcj0iJHtidWlsZC5jbGFzc2VzfSIgZGVidWc9Im9uIj4KLSAgICAgICAgICAgIDxjbGFzc3BhdGggcmVmaWQ9ImF4aXMudGVzdC5jbGFzc3BhdGgiLz4KLSAgICAgICAgICAgIDxzcmMgcGF0aD0iJHtzcmN9Ii8+Ci0gICAgICAgIDwvamF2YWM+Ci0gICAgPC90YXJnZXQ+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9ImphciIgZGVwZW5kcz0iY29tcGlsZSIgdW5sZXNzPSJqYXJzLnVwdG9kYXRlIj4KLSAgICAgICAgPGNvcHkgdG9kaXI9IiR7YnVpbGQuY2xhc3Nlc30vTUVUQS1JTkYiPgotICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke2Jhc2VkaXJ9L01FVEEtSU5GLyI+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi54bWwiLz4KLSAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJidWlsZC54bWwiLz4KLSAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgPC9jb3B5PgotCi0gICAgICAgIDxta2RpciBkaXI9IiR7amFyLmRpcn0iLz4KLSAgICAgICAgPGphciBqYXJmaWxlPSIke2phci5kaXJ9L21vZHVsZTEubWFyIiBiYXNlZGlyPSIke2J1aWxkLmNsYXNzZXN9Ij4KLSAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqIi8+Ci0gICAgICAgIDwvamFyPgotICAgICAgICA8ZGVsZXRlIGRpcj0iJHtidWlsZH0iLz4KLSAgICA8L3RhcmdldD4KLQotICAgIDx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0gICAgICAgIDx1cHRvZGF0ZSBwcm9wZXJ0eT0iamFycy51cHRvZGF0ZSIgdGFyZ2V0ZmlsZT0iJHtqYXIuZGlyfS9tb2R1bGUxLm1hciI+Ci0gICAgICAgICAgICA8c3JjZmlsZXMgZGlyPSIke3NyY30iPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouamF2YSIvPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoueG1sIi8+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi53c2RsIi8+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iJHtidWlsZH0vKioiLz4KLSAgICAgICAgICAgIDwvc3JjZmlsZXM+Ci0gICAgICAgIDwvdXB0b2RhdGU+Ci0gICAgICAgIDxlY2hvIG1lc3NhZ2U9InRoZSBmaWxlcyBhcmUgdXAgdG8gZGF0ZSA9ICR7amFycy51cHRvZGF0ZX0iPjwvZWNobz4KLSAgICA8L3RhcmdldD4KLQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvbW9kdWxlQ29uZmlnL2F4aXMyLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L21vZHVsZUNvbmZpZy9heGlzMi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiNTNiMTkuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvbW9kdWxlQ29uZmlnL2F4aXMyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGF4aXNjb25maWcgbmFtZT0iQXhpc0phdmEyLjAiPgotCi0KLSAgICA8bW9kdWxlQ29uZmlnIG5hbWU9InRlc3RNb2R1bGUiPgotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9InRlc3RNb2R1bGVQYXJhIj5OL0E8L3BhcmFtZXRlcj4KLSAgICA8L21vZHVsZUNvbmZpZz4KLQotICAgIDxtb2R1bGVDb25maWcgbmFtZT0idGVzdE1vZHVsZTIiPgotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9InRlc3RNb2R1bGVQYXJhMiI+Ti9BPC9wYXJhbWV0ZXI+Ci0gICAgPC9tb2R1bGVDb25maWc+Ci0KLSAgICA8cGhhc2VPcmRlciB0eXBlPSJJbkZsb3ciPgotICAgICAgICA8IS0tICBTeXN0ZW0gcHJlIGRlZmluZWQgcGhhc2VzICAgICAgIC0tPgotICAgICAgICAgPHBoYXNlIG5hbWU9IlRyYW5zcG9ydCI+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJSZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciIvPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiLz4KLSAgICAgICAgPC9waGFzZT4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlNlY3VyaXR5Ii8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJQcmVEaXNwYXRjaCIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iRGlzcGF0Y2giIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5EaXNwYXRjaFBoYXNlIj4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5BZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIi8+Ci0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciIvPgotICAgICAgICA8L3BoYXNlPgotICAgICAgICA8IS0tICBTeXN0ZW0gcHJlIGRlZmluZWQgcGhhc2VzICAgICAgIC0tPgotICAgICAgICA8IS0tICAgQWZ0ZXIgUG9zdGRpc3BhdGNoIHBoYXNlIG1vZHVsZSBhdXRob3Igb3Igb3Igc2VydmljZSBhdXRob3IgY2FuIGFkZCBhbnkgcGhhc2UgaGUgd2FudCAgICAgIC0tPgotICAgICAgICA8cGhhc2UgbmFtZT0iT3BlcmF0aW9uSW5QaGFzZSIvPgotICAgIDwvcGhhc2VPcmRlcj4KLSAgICA8cGhhc2VPcmRlciB0eXBlPSJPdXRGbG93Ij4KLSAgICAgICAgPCEtLSAgICAgIHVzZXIgY2FuIGFkZCBoaXMgb3duIHBoYXNlcyB0byB0aGlzIGFyZWEgIC0tPgotICAgICAgICA8cGhhc2UgbmFtZT0iT3BlcmF0aW9uT3V0UGhhc2UiLz4KLSAgICAgICAgPCEtLXN5c3RlbSBwcmVkZWZpbmVkIHBoYXNlLS0+Ci0gICAgICAgIDwhLS10aGVzZSBwaGFzZSB3aWxsIHJ1biBpcnJlc3BlY3RpdmUgb2YgdGhlIHNlcnZpY2UtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlBvbGljeURldGVybWluYXRpb24iLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik1lc3NhZ2VPdXQiLz4KLSAgICA8L3BoYXNlT3JkZXI+Ci0gICAgPHBoYXNlT3JkZXIgdHlwZT0iSW5GYXVsdEZsb3ciPgotICAgICAgICA8cGhhc2UgbmFtZT0iUHJlRGlzcGF0Y2giLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9IkRpc3BhdGNoIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuRGlzcGF0Y2hQaGFzZSI+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJSZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciIvPgotCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciIvPgotCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJBZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciIvPgotCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiLz4KLSAgICAgICAgPC9waGFzZT4KLSAgICAgICAgPCEtLSAgICAgIHVzZXIgY2FuIGFkZCBoaXMgb3duIHBoYXNlcyB0byB0aGlzIGFyZWEgIC0tPgotICAgICAgICA8cGhhc2UgbmFtZT0iT3BlcmF0aW9uSW5GYXVsdFBoYXNlIi8+Ci0gICAgPC9waGFzZU9yZGVyPgotICAgIDxwaGFzZU9yZGVyIHR5cGU9Ik91dEZhdWx0RmxvdyI+Ci0gICAgICAgIDwhLS0gICAgICB1c2VyIGNhbiBhZGQgaGlzIG93biBwaGFzZXMgdG8gdGhpcyBhcmVhICAtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik9wZXJhdGlvbk91dEZhdWx0UGhhc2UiLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlBvbGljeURldGVybWluYXRpb24iLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik1lc3NhZ2VPdXQiLz4KLSAgICA8L3BoYXNlT3JkZXI+Ci08L2F4aXNjb25maWc+Ci0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L21vZHVsZUNvbmZpZy9zZXJ2aWNlMS54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9tb2R1bGVDb25maWcvc2VydmljZTEueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTA3MGJiLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L21vZHVsZUNvbmZpZy9zZXJ2aWNlMS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzZXJ2aWNlIG5hbWU9IlNlcnZpY2UxIj4KLSAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgIFRoaXMgaXMgYSB0ZXN0aW5nIHNlcnZpY2UgLCB0byB0ZXN0IHRoZSBzeXN0ZW0gaXMgd29ya2luZyBvciBub3QKLSAgICA8L2Rlc2NyaXB0aW9uPgotCi0gICAgPG1vZHVsZUNvbmZpZyBuYW1lPSJTZXJ2aWVfbW9kdWxlIj4KLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJTZXJ2aWVfbW9kdWxlX3BhcmEiPk4vQTwvcGFyYW1ldGVyPgotICAgIDwvbW9kdWxlQ29uZmlnPgotICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob1N0cmluZyI+Ci0gICAgICAgIDxtb2R1bGVDb25maWcgbmFtZT0iT3BfTW9kdWxlIj4KLSAgICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iT3BfTW9kdWxlX3BhcmEiPk4vQTwvcGFyYW1ldGVyPgotICAgICAgICA8L21vZHVsZUNvbmZpZz4KLSAgICA8L29wZXJhdGlvbj4KLTwvc2VydmljZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9tb2R1bGVEaXNFbmdlZ2VSZXBvL2F4aXMyLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L21vZHVsZURpc0VuZ2VnZVJlcG8vYXhpczIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTg5NzVjLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L21vZHVsZURpc0VuZ2VnZVJlcG8vYXhpczIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjQ0ICswLDAgQEAKLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+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+DQotICAgICAgICA8cGhhc2UgbmFtZT0iUG9saWN5RGV0ZXJtaW5hdGlvbiIvPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik1lc3NhZ2VPdXQiLz4NCi0gICAgPC9waGFzZU9yZGVyPg0KLTwvYXhpc2NvbmZpZz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9tb2R1bGVEaXNFbmdlZ2VSZXBvL21vZHVsZXMvdGVzdE1vZHVsZS9NRVRBLUlORi9tb2R1bGUueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvbW9kdWxlRGlzRW5nZWdlUmVwby9tb2R1bGVzL3Rlc3RNb2R1bGUvTUVUQS1JTkYvbW9kdWxlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM0ZDk0ZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9tb2R1bGVEaXNFbmdlZ2VSZXBvL21vZHVsZXMvdGVzdE1vZHVsZS9NRVRBLUlORi9tb2R1bGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotPG1vZHVsZT4KLSAgICA8SW5GbG93PgotICAgICAgICA8aGFuZGxlciBuYW1lPSJIbmFkbGVyMSIKLSAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC5TcGVha2luZ0hhbmRsZXIiPgotICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJQcmVEaXNwYXRjaCIvPgotICAgICAgICA8L2hhbmRsZXI+Ci0gICAgICAgIDxoYW5kbGVyIG5hbWU9IkhhbmRsZXIyIgotICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LlNwZWFraW5nSGFuZGxlciI+Ci0gICAgICAgICAgICA8b3JkZXIgcGhhc2U9IlByZURpc3BhdGNoIi8+Ci0gICAgICAgIDwvaGFuZGxlcj4KLSAgICAgICAgPGhhbmRsZXIgbmFtZT0iSGFuZGxlcjMiCi0gICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQuU3BlYWtpbmdIYW5kbGVyIj4KLSAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iT3BlcmF0aW9uSW5QaGFzZSIvPgotICAgICAgICA8L2hhbmRsZXI+Ci0gICAgPC9JbkZsb3c+Ci0KLSAgICA8T3V0Rmxvdz4KLSAgICAgICAgPGhhbmRsZXIgbmFtZT0iSGFuZGxlcjQiCi0gICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQuU3BlYWtpbmdIYW5kbGVyIj4KLSAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iTWVzc2FnZU91dCIvPgotICAgICAgICA8L2hhbmRsZXI+Ci0gICAgPC9PdXRGbG93PgotPC9tb2R1bGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvbW9kdWxlVmVyc2lvbi9UZXN0MS9heGlzMi54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9tb2R1bGVWZXJzaW9uL1Rlc3QxL2F4aXMyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFhZDA4My4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9tb2R1bGVWZXJzaW9uL1Rlc3QxL2F4aXMyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxheGlzY29uZmlnIG5hbWU9IkF4aXNKYXZhMi4wIj4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBQYXJhbWV0ZXJzIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImhvdGRlcGxveW1lbnQiPnRydWU8L3BhcmFtZXRlcj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImhvdHVwZGF0ZSI+ZmFsc2U8L3BhcmFtZXRlcj4KLQotICAgIDxkZWZhdWx0TW9kdWxlVmVyc2lvbnM+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iYWJjIiB2ZXJzaW9uPSIxLjIzIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iZm9vIiB2ZXJzaW9uPSIwLjg5Ii8+Ci0gICAgPC9kZWZhdWx0TW9kdWxlVmVyc2lvbnM+Ci0KLQotICAgIDxwYXJhbWV0ZXIgbmFtZT0idXNlck5hbWUiPmFkbWluPC9wYXJhbWV0ZXI+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJwYXNzd29yZCI+YXhpczI8L3BhcmFtZXRlcj4KLQotICAgIDwhLS1Ob3RlIDogWW91IGNhbiBvdnJpZGUgdGhpcyBmb3IgcGFydGljdWxhciBzZXJ2aWNlIGJ5IGFkZGluZyB0aGUgc2FtZSBlbGVtZW50IHdpdGggeW91ciByZXF1aXJlbWVudC0tPgotICAgIDxtZXNzYWdlUmVjZWl2ZXJzPgotICAgICAgICA8bWVzc2FnZVJlY2VpdmVyIG1lcD0iaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC93c2RsL2luLW9ubHkiCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLlJhd1hNTElOT25seU1lc3NhZ2VSZWNlaXZlciIvPgotICAgICAgICA8bWVzc2FnZVJlY2VpdmVyIG1lcD0iaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC93c2RsL2luLW91dCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuUmF3WE1MSU5PdXRNZXNzYWdlUmVjZWl2ZXIiLz4KLSAgICA8L21lc3NhZ2VSZWNlaXZlcnM+Ci0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBQaGFzZXMgIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgIDxwaGFzZU9yZGVyIHR5cGU9IkluRmxvdyI+Ci0gICAgICAgIDwhLS0gIFN5c3RlbSBwcmUgZGVmaW5lZCBwaGFzZXMgICAgICAgLS0+Ci0gICAgICAgICA8cGhhc2UgbmFtZT0iVHJhbnNwb3J0Ij4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5SZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIi8+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciIvPgotICAgICAgICA8L3BoYXNlPgotICAgICAgICA8cGhhc2UgbmFtZT0iU2VjdXJpdHkiLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlByZURpc3BhdGNoIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJEaXNwYXRjaCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkRpc3BhdGNoUGhhc2UiPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiLz4KLQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIi8+Ci0gICAgICAgIDwvcGhhc2U+Ci0gICAgICAgIDwhLS0gIFN5c3RlbSBwcmUgZGVmaW5lZCBwaGFzZXMgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gICBBZnRlciBQb3N0ZGlzcGF0Y2ggcGhhc2UgbW9kdWxlIGF1dGhvciBvciBvciBzZXJ2aWNlIGF1dGhvciBjYW4gYWRkIGFueSBwaGFzZSBoZSB3YW50ICAgICAgLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJPcGVyYXRpb25JblBoYXNlIi8+Ci0gICAgPC9waGFzZU9yZGVyPgotICAgIDxwaGFzZU9yZGVyIHR5cGU9Ik91dEZsb3ciPgotICAgICAgICA8IS0tICAgICAgdXNlciBjYW4gYWRkIGhpcyBvd24gcGhhc2VzIHRvIHRoaXMgYXJlYSAgLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJPcGVyYXRpb25PdXRQaGFzZSIvPgotICAgICAgICA8IS0tc3lzdGVtIHByZWRlZmluZWQgcGhhc2UtLT4KLSAgICAgICAgPCEtLXRoZXNlIHBoYXNlIHdpbGwgcnVuIGlycmVzcGVjdGl2ZSBvZiB0aGUgc2VydmljZS0tPgotICAgICAgICA8cGhhc2UgbmFtZT0iUG9saWN5RGV0ZXJtaW5hdGlvbiIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iTWVzc2FnZU91dCIvPgotICAgIDwvcGhhc2VPcmRlcj4KLSAgICA8cGhhc2VPcmRlciB0eXBlPSJJbkZhdWx0RmxvdyI+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJQcmVEaXNwYXRjaCIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iRGlzcGF0Y2giIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5EaXNwYXRjaFBoYXNlIj4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5SZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIi8+Ci0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIi8+Ci0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5BZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIi8+Ci0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciIvPgotICAgICAgICA8L3BoYXNlPgotICAgICAgICA8IS0tICAgICAgdXNlciBjYW4gYWRkIGhpcyBvd24gcGhhc2VzIHRvIHRoaXMgYXJlYSAgLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJPcGVyYXRpb25JbkZhdWx0UGhhc2UiLz4KLSAgICA8L3BoYXNlT3JkZXI+Ci0gICAgPHBoYXNlT3JkZXIgdHlwZT0iT3V0RmF1bHRGbG93Ij4KLSAgICAgICAgPCEtLSAgICAgIHVzZXIgY2FuIGFkZCBoaXMgb3duIHBoYXNlcyB0byB0aGlzIGFyZWEgIC0tPgotICAgICAgICA8cGhhc2UgbmFtZT0iT3BlcmF0aW9uT3V0RmF1bHRQaGFzZSIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iUG9saWN5RGV0ZXJtaW5hdGlvbiIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iTWVzc2FnZU91dCIvPgotICAgIDwvcGhhc2VPcmRlcj4KLTwvYXhpc2NvbmZpZz4KLQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvcmVwb3NpdG9yaWVzL21vZHVsZUxvYWRUZXN0L2F4aXMyLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L3JlcG9zaXRvcmllcy9tb2R1bGVMb2FkVGVzdC9heGlzMi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5ODk3NWMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvcmVwb3NpdG9yaWVzL21vZHVsZUxvYWRUZXN0L2F4aXMyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI0NCArMCwwIEBACi08IS0tDQotICB+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+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvcmVwb3NpdG9yaWVzL21vZHVsZUxvYWRUZXN0L21vZHVsZXMvZXhwbG9kZWQvTUVUQS1JTkYvbW9kdWxlLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L3JlcG9zaXRvcmllcy9tb2R1bGVMb2FkVGVzdC9tb2R1bGVzL2V4cGxvZGVkL01FVEEtSU5GL21vZHVsZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1YjU1NTYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvcmVwb3NpdG9yaWVzL21vZHVsZUxvYWRUZXN0L21vZHVsZXMvZXhwbG9kZWQvTUVUQS1JTkYvbW9kdWxlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPCEtLSBuYW1lIGF0dHIgaXMgImV4cGxvZGVkTW9kdWxlIiwgYnV0IGRpcmVjdG9yeSBuYW1lIGlzICJleHBsb2RlZCIuICBBdHRyIHdpbnMuIC0tPgotPG1vZHVsZSBuYW1lPSJleHBsb2RlZE1vZHVsZSI+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJjb2xvciI+Z3JlZW48L3BhcmFtZXRlcj4KLTwvbW9kdWxlPgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvc2VydmVyMS54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9zZXJ2ZXIxLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZkOTYyNy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9zZXJ2ZXIxLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHNlcnZlciBuYW1lPSJBeGlzSmF2YTIuMCI+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJob3RkZXBsb3ltZW50Ij50cnVlPC9wYXJhbWV0ZXI+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJob3R1cGRhdGUiPnRydWU8L3BhcmFtZXRlcj4KLQotICAgIDxtZXNzYWdlUmVjZWl2ZXIgbWVwPSJJTk9VVCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLlJhd1hNTElOT3V0TWVzc2FnZVJlY2VpdmVyIi8+Ci0KLSAgICA8dHJhbnNwb3J0U2VuZGVyIG5hbWU9Imh0dHAiIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkNvbW1vbnNIVFRQVHJhbnNwb3J0U2VuZGVyIj4KLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJQUk9UT0NPTCI+SFRUUC8xLjA8L3BhcmFtZXRlcj4KLSAgICA8L3RyYW5zcG9ydFNlbmRlcj4KLSAgICA8bW9kdWxlIHJlZj0iYWRkcmVzc2luZyIvPgotCi0gICA8cGhhc2VPcmRlciB0eXBlPSJJbkZsb3ciPgotICAgICAgICA8IS0tICBTeXN0ZW0gcHJlIGRlZmluZWQgcGhhc2VzICAgICAgIC0tPgotICAgICAgICA8cGhhc2UgbmFtZT0iVHJhbnNwb3J0SW4iLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlByZURpc3BhdGNoIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJEaXNwYXRjaCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkRpc3BhdGNoUGhhc2UiPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiPgotICAgICAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iRGlzcGF0Y2giLz4KLSAgICAgICAgICAgIDwvaGFuZGxlcj4KLQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiPgotICAgICAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iRGlzcGF0Y2giLz4KLSAgICAgICAgICAgIDwvaGFuZGxlcj4KLQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiPgotICAgICAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iRGlzcGF0Y2giLz4KLSAgICAgICAgICAgIDwvaGFuZGxlcj4KLQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIj4KLSAgICAgICAgICAgICAgICA8b3JkZXIgcGhhc2U9IkRpc3BhdGNoIi8+Ci0gICAgICAgICAgICA8L2hhbmRsZXI+Ci0gICAgICAgIDwvcGhhc2U+Ci0gICAgICAgIDwhLS0gIFN5c3RlbSBwcmUgZGVmaW5lZCBwaGFzZXMgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gICBBZnRlciBQb3N0ZGlzcGF0Y2ggcGhhc2UgbW9kdWxlIGF1dGhvciBvciBvciBzZXJ2aWNlIGF1dGhvciBjYW4gYWRkIGFueSBwaGFzZSBoZSB3YW50ICAgICAgLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJ1c2VycGhhc2UxIi8+Ci0gICAgPC9waGFzZU9yZGVyPgotICAgIDxwaGFzZU9yZGVyIHR5cGU9Ik91dEZsb3ciPgotICAgICAgICA8IS0tICAgICAgdXNlciBjYW4gYWRkIGhpcyBvd24gcGhhc2VzIHRvIHRoaXMgYXJlYSAgLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJ1c2VycGhhc2UxIi8+Ci0gICAgICAgIDwhLS1zeXN0ZW0gcHJlZGVmaW5lZCBwaGFzZS0tPgotICAgICAgICA8IS0tdGhlc2UgcGhhc2Ugd2lsbCBydW4gaXJyZXNwZWN0aXZlIG9mIHRoZSBzZXJ2aWNlLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJQb2xpY3lEZXRlcm1pbmF0aW9uIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJNZXNzYWdlT3V0Ii8+Ci0gICAgPC9waGFzZU9yZGVyPgotICAgIDxwaGFzZU9yZGVyIHR5cGU9IkluRmF1bHRGbG93Ij4KLSAgICAgICAgPCEtLSAgICAgIHVzZXIgY2FuIGFkZCBoaXMgb3duIHBoYXNlcyB0byB0aGlzIGFyZWEgIC0tPgotICAgICAgICA8cGhhc2UgbmFtZT0idXNlcnBoYXNlMSIvPgotICAgIDwvcGhhc2VPcmRlcj4KLSAgICA8cGhhc2VPcmRlciB0eXBlPSJPdXRGYXVsdEZsb3ciPgotICAgICAgICA8IS0tICAgICAgdXNlciBjYW4gYWRkIGhpcyBvd24gcGhhc2VzIHRvIHRoaXMgYXJlYSAgLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJ1c2VycGhhc2UxIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJQb2xpY3lEZXRlcm1pbmF0aW9uIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJNZXNzYWdlT3V0Ii8+Ci0gICAgPC9waGFzZU9yZGVyPgotPC9zZXJ2ZXI+Ci0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L3NlcnZpY2UueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvc2VydmljZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5ZmM1ZDIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvc2VydmljZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzZXJ2aWNlIHByb3ZpZGVyPSJ4c2Q6YW55cHJvdmlkZXIiIHN0eWxlPSJycGNJIiBjb250ZXh0UGF0aD0ic2VydmljZXMiPgotICAgIDwhLS0gdGhlc2UgYXJlIFNlcnZpY2UgUGFyYW1ldGVycyAtLT4KLSAgICA8cGFyYW1ldGVyIG5hbWU9InBhcmExIiBsb2NrZWQ9InhzZDp0cnVlIj4xMDwvcGFyYW1ldGVyPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFyYTIiPkNvbG9tYm88L3BhcmFtZXRlcj4KLQotICAgIDwhLS0gIFNlcnZpY2UgVHlwZU1hcHBpbmcgLS0+Ci0gICAgPHR5cGVNYXBwaW5nPlR5cGUgbWFwcHBpbmcgc2hvdWxkIGNvbWUgaGVyZTwvdHlwZU1hcHBpbmc+Ci0gICAgPGJlYW5NYXBwaW5nPmJlYW4gbWFwcHBpbmcgc2hvdWxkIGNvbWUgaGVyZTwvYmVhbk1hcHBpbmc+Ci0KLSAgICA8IS0tCi0gICAgUGhhc2VzCi0gICAgUDEgcDIgcDMKLSAgICAtLT4KLQotICAgIDxJbkZsb3c+Ci0gICAgICAgIDxoYW5kbGVyIG5hbWU9ImgxIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5lbmdpbmUucmVnaXN0cnkuU3BlYWtpbmdIYW5kbGVyIj4KLSAgICAgICAgICAgIDxvcmRlciBwaGFzZT0icDEiIHBoYXNlRmlyc3Q9InRydWUiLz4KLSAgICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFyYTgiIGxvY2tlZD0ieHNkOnRydWUiPjEyMzwvcGFyYW1ldGVyPgotICAgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJwYXJhOSIgbG9ja2VkPSJ4c2Q6dHJ1ZSI+NDU2PC9wYXJhbWV0ZXI+Ci0gICAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9InBhcmExMCIgbG9ja2VkPSJ4c2Q6dHJ1ZSI+Nzg5PC9wYXJhbWV0ZXI+Ci0gICAgICAgIDwvaGFuZGxlcj4KLSAgICAgICAgPGhhbmRsZXIgbmFtZT0iaDIiIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5yZWdpc3RyeS5TcGVha2luZ0hhbmRsZXIiLz4KLSAgICA8L0luRmxvdz4KLQotICAgIDxPdXRGbG93PgotICAgICAgICA8aGFuZGxlciBuYW1lPSJoMyIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZW5naW5lLnJlZ2lzdHJ5LlNwZWFraW5nSGFuZGxlciI+Ci0gICAgICAgICAgICA8b3JkZXIgcGhhc2U9InAyIi8+Ci0gICAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9InBhcmE4IiBsb2NrZWQ9InhzZDp0cnVlIj4xMjM8L3BhcmFtZXRlcj4KLSAgICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFyYTkiIGxvY2tlZD0ieHNkOnRydWUiPjQ1NjwvcGFyYW1ldGVyPgotICAgICAgICA8L2hhbmRsZXI+Ci0gICAgPC9PdXRGbG93PgotCi0gICAgPEZhdWx0Rmxvdz4KLSAgICAgICAgPGhhbmRsZXIgbmFtZT0iaDQiIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5yZWdpc3RyeS5TcGVha2luZ0hhbmRsZXIiPgotICAgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJwYXJhOCIgbG9ja2VkPSJ4c2Q6dHJ1ZSI+MTIzPC9wYXJhbWV0ZXI+Ci0gICAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9InBhcmE5IiBsb2NrZWQ9InhzZDp0cnVlIj40NTY8L3BhcmFtZXRlcj4KLSAgICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFyYTEwIiBsb2NrZWQ9InhzZDp0cnVlIj43ODk8L3BhcmFtZXRlcj4KLSAgICAgICAgPC9oYW5kbGVyPgotCi0gICAgICAgIDxoYW5kbGVyIG5hbWU9Img1IiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5lbmdpbmUucmVnaXN0cnkuU3BlYWtpbmdIYW5kbGVyIj4KLSAgICAgICAgICAgIDxvcmRlciBwaGFzZT0icDEiLz4KLSAgICAgICAgPC9oYW5kbGVyPgotCi0gICAgICAgIDxoYW5kbGVyIG5hbWU9Img2IiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5lbmdpbmUucmVnaXN0cnkuU3BlYWtpbmdIYW5kbGVyIj4KLSAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iYW55aGFzZSIgcGhhc2VGaXJzdD0idHJ1ZSIgcGhhc2VMYXN0PSJmYWxzZSIvPgotICAgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJwYXJhOCIgbG9ja2VkPSJ4c2Q6dHJ1ZSI+MTIzPC9wYXJhbWV0ZXI+Ci0gICAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9InBhcmE5IiBsb2NrZWQ9InhzZDp0cnVlIj40NTY8L3BhcmFtZXRlcj4KLSAgICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFyYTEwIiBsb2NrZWQ9InhzZDp0cnVlIj43ODk8L3BhcmFtZXRlcj4KLSAgICAgICAgPC9oYW5kbGVyPgotICAgIDwvZmF1bHRmbG93PgotCi0KLSAgICA8b3BlcmF0aW9uIG5hbWU9Im9wbmFtZSIgcW5hbWU9Im9wcW5hbWUiIHN0eWxlPSJhbnlTdHlsZSIgdXNlPSJhbnlVc2UiPgotICAgICAgICA8SW5GbG93PgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iaDciIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5yZWdpc3RyeS5TcGVha2luZ0hhbmRsZXIiLz4KLSAgICAgICAgPC9JbkZsb3c+Ci0gICAgICAgIDxPdXRGbG93PgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iaDgiIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5yZWdpc3RyeS5TcGVha2luZ0hhbmRsZXIiPgotICAgICAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iYW55aGFzZSIvPgotICAgICAgICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFyYTgiIGxvY2tlZD0ieHNkOnRydWUiPjEyMzwvcGFyYW1ldGVyPgotICAgICAgICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFyYTkiIGxvY2tlZD0ieHNkOnRydWUiPjQ1NjwvcGFyYW1ldGVyPgotICAgICAgICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFyYTEwIiBsb2NrZWQ9InhzZDp0cnVlIj43ODk8L3BhcmFtZXRlcj4KLSAgICAgICAgICAgIDwvaGFuZGxlcj4KLSAgICAgICAgPC9PdXRGbG93PgotICAgICAgICA8RmF1bHRGbG93PgotICAgICAgICA8L0ZhdWx0Rmxvdz4KLSAgICA8L29wZXJhdGlvbj4KLTwvc2VydmljZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9zZXJ2aWNlMS54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9zZXJ2aWNlMS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjZDRmZDkuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvc2VydmljZTEueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08c2VydmljZSBwcm92aWRlcj0ieHNkOmFueXByb3ZpZGVyIiBzdHlsZT0ieHNkOmFueVVSSSIgY29udGV4dFBhdGg9InhzZDphbnljb250ZXh0UGF0aCI+Ci0gICAgPCEtLSB0aGVzZSBhcmUgU2VydmljZSBQYXJhbWV0ZXJzIC0tPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFyYTEiIGxvY2tlZD0ieHNkOnRydWUiPjEwPC9wYXJhbWV0ZXI+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJwYXJhMiI+Q29sb21ibzwvcGFyYW1ldGVyPgotCi0gICAgPG1vZHVsZSByZWY9Im1vZHVsZTEiPjwvbW9kdWxlPgotICAgIDxtb2R1bGUgcmVmPSJtb2R1bGUyIj48L21vZHVsZT4KLQotCi0gICAgPCEtLSAgU2VydmljZSBUeXBlTWFwcGluZyAtLT4KLSAgICA8dHlwZU1hcHBpbmc+Ci0gICAgICAgIDx0eXBlTWFwcGVyIHhzaVR5cGU9ImludCIgamF2YVR5cGU9ImphdmEubGFuZy5JbnRlZ2VyIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5ycGMuVHlwZU1hcHBlckltcGwiLz4KLSAgICA8L3R5cGVNYXBwaW5nPgotICAgIDxiZWFuTWFwcGluZz5iZWFuIG1hcHBwaW5nIHNob3VsZCBjb21lIGhlcmU8L2JlYW5NYXBwaW5nPgotCi0gICAgPCEtLQotICAgIFBoYXNlcwotICAgIFAxIHAyIHAzCi0gICAgLS0+Ci0KLSAgICA8SW5GbG93PgotICAgICAgICA8aGFuZGxlciBuYW1lPSJoMSIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZW5naW5lLnJlZ2lzdHJ5LlNwZWFraW5nSGFuZGxlciI+Ci0gICAgICAgICAgICA8b3JkZXIgcGhhc2U9InAxIiBwaGFzZUZpcnN0PSJ0cnVlIi8+Ci0gICAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9InBhcmE4IiBsb2NrZWQ9InhzZDp0cnVlIj4xMjM8L3BhcmFtZXRlcj4KLSAgICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFyYTkiIGxvY2tlZD0ieHNkOnRydWUiPjQ1NjwvcGFyYW1ldGVyPgotICAgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJwYXJhMTAiIGxvY2tlZD0ieHNkOnRydWUiPjc4OTwvcGFyYW1ldGVyPgotICAgICAgICA8L2hhbmRsZXI+Ci0gICAgICAgIDxoYW5kbGVyIG5hbWU9ImgyIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5lbmdpbmUucmVnaXN0cnkuU3BlYWtpbmdIYW5kbGVyIi8+Ci0gICAgPC9JbkZsb3c+Ci0KLSAgICA8T3V0Rmxvdz4KLSAgICAgICAgPGhhbmRsZXIgbmFtZT0iaDMiIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5yZWdpc3RyeS5TcGVha2luZ0hhbmRsZXIiPgotICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJwMiIvPgotICAgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJwYXJhOCIgbG9ja2VkPSJ4c2Q6dHJ1ZSI+MTIzPC9wYXJhbWV0ZXI+Ci0gICAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9InBhcmE5IiBsb2NrZWQ9InhzZDp0cnVlIj40NTY8L3BhcmFtZXRlcj4KLSAgICAgICAgPC9oYW5kbGVyPgotICAgIDwvT3V0Rmxvdz4KLQotICAgIDxGYXVsdEZsb3c+Ci0gICAgICAgIDxoYW5kbGVyIG5hbWU9Img0IiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5lbmdpbmUucmVnaXN0cnkuU3BlYWtpbmdIYW5kbGVyIj4KLSAgICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFyYTgiIGxvY2tlZD0ieHNkOnRydWUiPjEyMzwvcGFyYW1ldGVyPgotICAgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJwYXJhOSIgbG9ja2VkPSJ4c2Q6dHJ1ZSI+NDU2PC9wYXJhbWV0ZXI+Ci0gICAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9InBhcmExMCIgbG9ja2VkPSJ4c2Q6dHJ1ZSI+Nzg5PC9wYXJhbWV0ZXI+Ci0gICAgICAgIDwvaGFuZGxlcj4KLQotICAgICAgICA8aGFuZGxlciBuYW1lPSJoNSIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZW5naW5lLnJlZ2lzdHJ5LlNwZWFraW5nSGFuZGxlciI+Ci0gICAgICAgICAgICA8b3JkZXIgcGhhc2U9InAxIi8+Ci0gICAgICAgIDwvaGFuZGxlcj4KLQotICAgICAgICA8aGFuZGxlciBuYW1lPSJoNiIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZW5naW5lLnJlZ2lzdHJ5LlNwZWFraW5nSGFuZGxlciI+Ci0gICAgICAgICAgICA8b3JkZXIgcGhhc2U9ImFueWhhc2UiIHBoYXNlRmlyc3Q9InRydWUiIHBoYXNlTGFzdD0iZmFsc2UiLz4KLSAgICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFyYTgiIGxvY2tlZD0ieHNkOnRydWUiPjEyMzwvcGFyYW1ldGVyPgotICAgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJwYXJhOSIgbG9ja2VkPSJ4c2Q6dHJ1ZSI+NDU2PC9wYXJhbWV0ZXI+Ci0gICAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9InBhcmExMCIgbG9ja2VkPSJ4c2Q6dHJ1ZSI+Nzg5PC9wYXJhbWV0ZXI+Ci0gICAgICAgIDwvaGFuZGxlcj4KLSAgICA8L0ZhdWx0Rmxvdz4KLQotCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJvcG5hbWUiIHFuYW1lPSJvcHFuYW1lIiBzdHlsZT0iYW55U3R5bGUiIHVzZT0iYW55VXNlIj4KLSAgICAgICAgPG1vZHVsZSByZWY9InVyaSI+Ci0gICAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9InBhcmEzIiBsb2NrZWQ9InhzZDp0cnVlIj4xMDwvcGFyYW1ldGVyPgotICAgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJwYXJhNCI+TFNGPC9wYXJhbWV0ZXI+Ci0gICAgICAgIDwvbW9kdWxlPgotCi0gICAgICAgIDxJbkZsb3c+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJoNyIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZW5naW5lLnJlZ2lzdHJ5LlNwZWFraW5nSGFuZGxlciIvPgotICAgICAgICA8L0luRmxvdz4KLSAgICAgICAgPE91dEZsb3c+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJoOCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZW5naW5lLnJlZ2lzdHJ5LlNwZWFraW5nSGFuZGxlciI+Ci0gICAgICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJhbnloYXNlIi8+Ci0gICAgICAgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJwYXJhOCIgbG9ja2VkPSJ4c2Q6dHJ1ZSI+MTIzPC9wYXJhbWV0ZXI+Ci0gICAgICAgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJwYXJhOSIgbG9ja2VkPSJ4c2Q6dHJ1ZSI+NDU2PC9wYXJhbWV0ZXI+Ci0gICAgICAgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJwYXJhMTAiIGxvY2tlZD0ieHNkOnRydWUiPjc4OTwvcGFyYW1ldGVyPgotICAgICAgICAgICAgPC9oYW5kbGVyPgotICAgICAgICA8L091dEZsb3c+Ci0gICAgICAgIDxGYXVsdEZsb3c+Ci0gICAgICAgIDwvRmF1bHRGbG93PgotICAgIDwvb3BlcmF0aW9uPgotPC9zZXJ2aWNlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L3NlcnZpY2UxL01FVEEtSU5GL01BTklGRVNULk1GIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvc2VydmljZTEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhNTBiOGYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvc2VydmljZTEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMA0KLUNyZWF0ZWQtQnk6IEFudCAxLjQuMQ0KLQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L3NlcnZpY2UxL01FVEEtSU5GL3NlcnZpY2VzLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L3NlcnZpY2UxL01FVEEtSU5GL3NlcnZpY2VzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhmODg3Ni4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9zZXJ2aWNlMS9NRVRBLUlORi9zZXJ2aWNlcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzZXJ2aWNlIG5hbWU9IiI+Ci0KLSAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgIFRoaXMgaXMgYSB0ZXN0aW5nIHNlcnZpY2UgLCB0byB0ZXN0IHRoZSBzeXN0ZW0gaXMgd29ya2luZyBvciBub3QKLSAgICA8L2Rlc2NyaXB0aW9uPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iU2VydmljZUNsYXNzIj5vcmcuYXBhY2hlLmF4aXMyLnNhbXBsZS5lY2hvLkVjaG9JbXBsPC9wYXJhbWV0ZXI+Ci0gICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvU3RyaW5nIj4KLSAgICAgICAgPG1vZHVsZSByZWY9Im1vZHVsZTEiLz4KLSAgICAgICAgPG1lc3NhZ2VSZWNlaXZlciBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuUmF3WE1MSU5PdXRNZXNzYWdlUmVjZWl2ZXIiLz4KLSAgICA8L29wZXJhdGlvbj4KLSAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9TdHJpbmdBcnJheSIvPgotICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob0VjaG9TdHJ1Y3QiLz4KLSAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9FY2hvU3RydWN0QXJyYXkiLz4KLTwvc2VydmljZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9zZXJ2aWNlMS9idWlsZC54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9zZXJ2aWNlMS9idWlsZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmMTU0MWUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvc2VydmljZTEvYnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHByb2plY3QgYmFzZWRpcj0iLiIgZGVmYXVsdD0iamFyIj4KLSAgICA8cHJvcGVydHkgbmFtZT0ic3JjIiBsb2NhdGlvbj0iLiIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZCIgbG9jYXRpb249ImJ1aWxkIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmNsYXNzZXMiIGxvY2F0aW9uPSIke2J1aWxkfS9jbGFzc2VzIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmxpYiIgbG9jYXRpb249IiR7YnVpbGR9L2xpYiIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJsaWIiIGxvY2F0aW9uPSJsaWIiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0icm9vdCIgbG9jYXRpb249Ii4uLy4uLy4uLyIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJqYXIuZGlyIiBsb2NhdGlvbj0iJHtyb290fS90YXJnZXQvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9zZXJ2aWNlcy8iLz4KLQotICAgIDxwYXRoIGlkPSJheGlzLnRlc3QuY2xhc3NwYXRoIj4KLSAgICAgICAgPHBhdGggcmVmaWQ9Im1hdmVuLmRlcGVuZGVuY3kuY2xhc3NwYXRoIj48L3BhdGg+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iLi4vLi4vLi4vdGFyZ2V0L2NsYXNzZXMiLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIuLi8uLi8uLi90YXJnZXQvdGVzdC1jbGFzc2VzIi8+Ci0gICAgPC9wYXRoPgotCi0gICAgPHRhcmdldCBuYW1lPSJjb21waWxlIiBkZXBlbmRzPSJpbml0IiB1bmxlc3M9ImphcnMudXB0b2RhdGUiPgotICAgICAgICA8bWtkaXIgZGlyPSIke2J1aWxkLmNsYXNzZXN9Ii8+Ci0gICAgICAgIDxta2RpciBkaXI9IiR7YnVpbGQubGlifSIvPgotICAgICAgICA8amF2YWMgZGVzdGRpcj0iJHtidWlsZC5jbGFzc2VzfSIgZGVidWc9Im9uIj4KLSAgICAgICAgICAgIDxjbGFzc3BhdGggcmVmaWQ9ImF4aXMudGVzdC5jbGFzc3BhdGgiLz4KLSAgICAgICAgICAgIDxzcmMgcGF0aD0iJHtzcmN9Ii8+Ci0gICAgICAgIDwvamF2YWM+Ci0gICAgPC90YXJnZXQ+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9ImphciIgZGVwZW5kcz0iY29tcGlsZSIgdW5sZXNzPSJqYXJzLnVwdG9kYXRlIj4KLSAgICAgICAgPGNvcHkgdG9kaXI9IiR7YnVpbGQuY2xhc3Nlc30vTUVUQS1JTkYiPgotICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke2Jhc2VkaXJ9L01FVEEtSU5GLyI+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi54bWwiLz4KLSAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJidWlsZC54bWwiLz4KLSAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgPC9jb3B5PgotCi0gICAgICAgIDxta2RpciBkaXI9IiR7amFyLmRpcn0iLz4KLSAgICAgICAgPGphciBqYXJmaWxlPSIke2phci5kaXJ9L3NlcnZpY2UxLmphciIgYmFzZWRpcj0iJHtidWlsZC5jbGFzc2VzfSI+Ci0gICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKiIvPgotICAgICAgICA8L2phcj4KLSAgICAgICAgPGRlbGV0ZSBkaXI9IiR7YnVpbGR9Ii8+Ci0gICAgPC90YXJnZXQ+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9ImluaXQiPgotICAgICAgICA8dXB0b2RhdGUgcHJvcGVydHk9ImphcnMudXB0b2RhdGUiIHRhcmdldGZpbGU9IiR7amFyLmRpcn0vc2VydmljZTEuamFyIj4KLSAgICAgICAgICAgIDxzcmNmaWxlcyBkaXI9IiR7c3JjfSI+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5qYXZhIi8+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi54bWwiLz4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLndzZGwiLz4KLSAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSIke2J1aWxkfS8qKiIvPgotICAgICAgICAgICAgPC9zcmNmaWxlcz4KLSAgICAgICAgPC91cHRvZGF0ZT4KLSAgICAgICAgPGVjaG8gbWVzc2FnZT0idGhlIGZpbGVzIGFyZSB1cCB0byBkYXRlID0gJHtqYXJzLnVwdG9kYXRlfSI+PC9lY2hvPgotICAgIDwvdGFyZ2V0PgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9zZXJ2aWNlMi54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9zZXJ2aWNlMi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5MWUwOTguLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvc2VydmljZTIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHNlcnZpY2UgcHJvdmlkZXI9InhzZDphbnlwcm92aWRlciIgc3R5bGU9InhzZDphbnlVUkkiIGNvbnRleHRQYXRoPSJ4c2Q6YW55Y29udGV4dFBhdGgiPgotICAgIDwhLS0gdGhlc2UgYXJlIFNlcnZpY2UgUGFyYW1ldGVycyAtLT4KLSAgICA8cGFyYW1ldGVyIG5hbWU9InBhcmExIiBsb2NrZWQ9InhzZDp0cnVlIj4xMDwvcGFyYW1ldGVyPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFyYTIiPkNvbG9tYm88L3BhcmFtZXRlcj4KLQotICAgIDwhLS0gIFNlcnZpY2UgVHlwZU1hcHBpbmcgLS0+Ci0gICAgPHR5cGVNYXBwaW5nPlR5cGUgbWFwcHBpbmcgc2hvdWxkIGNvbWUgaGVyZTwvdHlwZU1hcHBpbmc+Ci0gICAgPGJlYW5NYXBwaW5nPmJlYW4gbWFwcHBpbmcgc2hvdWxkIGNvbWUgaGVyZTwvYmVhbk1hcHBpbmc+Ci0KLQotICAgIDxoYW5kbGVyIG5hbWU9ImgxIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5lbmdpbmUucmVnaXN0cnkuU3BlYWtpbmdIYW5kbGVyIj4KLSAgICAgICAgPG9yZGVyIGJlZm9yZT0iYW55QmVmaXJlVVJJIiBhZnRlcj0iYW55YWZ0ZXJVUkkiIHBoYXNlPSJhbnloYXNlIiBwaGFzZUZpcnN0PSJ0cnVlIiBwaGFzZUxhc3Q9ImZhbHNlIi8+Ci0gICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFyYTgiIGxvY2tlZD0ieHNkOnRydWUiPjEyMzwvcGFyYW1ldGVyPgotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9InBhcmE5IiBsb2NrZWQ9InhzZDp0cnVlIj40NTY8L3BhcmFtZXRlcj4KLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJwYXJhMTAiIGxvY2tlZD0ieHNkOnRydWUiPjc4OTwvcGFyYW1ldGVyPgotICAgIDwvaGFuZGxlcj4KLQotCi0gICAgPEluRmxvdz4KLSAgICAgICAgPGhhbmRsZXIgbmFtZT0iaDIiIHJlZj0iaDEiLz4KLSAgICAgICAgPGhhbmRsZXIgbmFtZT0iaDMiIHJlZj0iaDEiLz4KLSAgICA8L0luRmxvdz4KLQotICAgIDxPdXRGbG93PgotICAgICAgICA8aGFuZGxlciBuYW1lPSJoMyIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZW5naW5lLnJlZ2lzdHJ5LlNwZWFraW5nSGFuZGxlciI+Ci0gICAgICAgICAgICA8b3JkZXIgYmVmb3JlPSJhbnlCZWZpcmVVUkkiIGFmdGVyPSJhbnlhZnRlclVSSSIgcGhhc2U9ImFueWhhc2UiIHBoYXNlRmlyc3Q9InRydWUiIHBoYXNlTGFzdD0iZmFsc2UiLz4KLSAgICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFyYTgiIGxvY2tlZD0ieHNkOnRydWUiPjEyMzwvcGFyYW1ldGVyPgotICAgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJwYXJhOSIgbG9ja2VkPSJ4c2Q6dHJ1ZSI+NDU2PC9wYXJhbWV0ZXI+Ci0gICAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9InBhcmExMCIgbG9ja2VkPSJ4c2Q6dHJ1ZSI+Nzg5PC9wYXJhbWV0ZXI+Ci0gICAgICAgIDwvaGFuZGxlcj4KLSAgICA8L091dEZsb3c+Ci0KLSAgICA8SW5GYXVsdEZsb3c+Ci0gICAgICAgIDxoYW5kbGVyIG5hbWU9Img0IiBjbGFzcz0iSGFuZGVyLmNsYXNzIj4KLSAgICAgICAgICAgIDxvcmRlciBiZWZvcmU9ImFueUJlZmlyZVVSSSIgYWZ0ZXI9ImFueWFmdGVyVVJJIiBwaGFzZT0iYW55aGFzZSIgcGhhc2VGaXJzdD0idHJ1ZSIgcGhhc2VMYXN0PSJmYWxzZSIvPgotICAgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJwYXJhOCIgbG9ja2VkPSJ4c2Q6dHJ1ZSI+MTIzPC9wYXJhbWV0ZXI+Ci0gICAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9InBhcmE5IiBsb2NrZWQ9InhzZDp0cnVlIj40NTY8L3BhcmFtZXRlcj4KLSAgICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFyYTEwIiBsb2NrZWQ9InhzZDp0cnVlIj43ODk8L3BhcmFtZXRlcj4KLSAgICAgICAgPC9oYW5kbGVyPgotICAgICAgICA8aGFuZGxlciBuYW1lPSJoNSIgY2xhc3M9IkhhbmRlci5jbGFzcyI+Ci0gICAgICAgICAgICA8b3JkZXIgYmVmb3JlPSJhbnlCZWZpcmVVUkkiIGFmdGVyPSJhbnlhZnRlclVSSSIgcGhhc2U9ImFueWhhc2UiIHBoYXNlRmlyc3Q9InRydWUiIHBoYXNlTGFzdD0iZmFsc2UiLz4KLSAgICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFyYTgiIGxvY2tlZD0ieHNkOnRydWUiPjEyMzwvcGFyYW1ldGVyPgotICAgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJwYXJhOSIgbG9ja2VkPSJ4c2Q6dHJ1ZSI+NDU2PC9wYXJhbWV0ZXI+Ci0gICAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9InBhcmExMCIgbG9ja2VkPSJ4c2Q6dHJ1ZSI+Nzg5PC9wYXJhbWV0ZXI+Ci0gICAgICAgIDwvaGFuZGxlcj4KLQotICAgICAgICA8aGFuZGxlciBuYW1lPSJIYW5kZXJuYW1lIiBjbGFzcz0iSGFuZGVyLmNsYXNzIj4KLSAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iYW55aGFzZSIgcGhhc2VGaXJzdD0idHJ1ZSIgcGhhc2VMYXN0PSJmYWxzZSIvPgotICAgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJwYXJhOCIgbG9ja2VkPSJ4c2Q6dHJ1ZSI+MTIzPC9wYXJhbWV0ZXI+Ci0gICAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9InBhcmE5IiBsb2NrZWQ9InhzZDp0cnVlIj40NTY8L3BhcmFtZXRlcj4KLSAgICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFyYTEwIiBsb2NrZWQ9InhzZDp0cnVlIj43ODk8L3BhcmFtZXRlcj4KLSAgICAgICAgPC9oYW5kbGVyPgotICAgIDwvSW5GYXVsdEZsb3c+Ci0KLQotICAgIDxvcGVyYXRpb24gbmFtZT0ib3BuYW1lIiBxbmFtZT0ib3BxbmFtZSIgc3R5bGU9ImFueVN0eWxlIiB1c2U9ImFueVVzZSI+Ci0gICAgICAgIDxtb2R1bGUgcmVmPSJ1cmkiPgotICAgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJwYXJhMyIgbG9ja2VkPSJ4c2Q6dHJ1ZSI+MTA8L3BhcmFtZXRlcj4KLSAgICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFyYTQiPkxTRjwvcGFyYW1ldGVyPgotICAgICAgICA8L21vZHVsZT4KLQotICAgICAgICA8SW5GbG93PgotICAgICAgICAgICAgPGhhbmRsZXIgcmVmPSJhbnlSZWYiIG5hbWU9IkhhbmRlcm5hbWUiIGNsYXNzPSJIYW5kZXIuY2xhc3MiPgotICAgICAgICAgICAgICAgIDxvcmRlciBiZWZvcmU9ImFueUJlZmlyZVVSSSIgYWZ0ZXI9ImFueWFmdGVyVVJJIiBwaGFzZT0iYW55aGFzZSIgcGhhc2VGaXJzdD0idHJ1ZSIgcGhhc2VMYXN0PSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFyYTgiIGxvY2tlZD0ieHNkOnRydWUiPjEyMzwvcGFyYW1ldGVyPgotICAgICAgICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFyYTkiIGxvY2tlZD0ieHNkOnRydWUiPjQ1NjwvcGFyYW1ldGVyPgotICAgICAgICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFyYTEwIiBsb2NrZWQ9InhzZDp0cnVlIj43ODk8L3BhcmFtZXRlcj4KLSAgICAgICAgICAgIDwvaGFuZGxlcj4KLQotICAgICAgICAgICAgPGhhbmRsZXIgcmVmPSJhbnlSZWYiPgotICAgICAgICAgICAgICAgIDxvcmRlciBiZWZvcmU9ImFueUJlZmlyZVVSSSIgYWZ0ZXI9ImFueWFmdGVyVVJJIiBwaGFzZT0iYW55aGFzZSIgcGhhc2VGaXJzdD0idHJ1ZSIgcGhhc2VMYXN0PSJmYWxzZSIvPgotCi0gICAgICAgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJwYXJhOCIgbG9ja2VkPSJ4c2Q6dHJ1ZSI+MTIzPC9wYXJhbWV0ZXI+Ci0gICAgICAgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJwYXJhOSIgbG9ja2VkPSJ4c2Q6dHJ1ZSI+NDU2PC9wYXJhbWV0ZXI+Ci0gICAgICAgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJwYXJhMTAiIGxvY2tlZD0ieHNkOnRydWUiPjc4OTwvcGFyYW1ldGVyPgotICAgICAgICAgICAgPC9oYW5kbGVyPgotCi0gICAgICAgIDwvSW5GbG93PgotICAgICAgICA8T3V0Rmxvdz4KLSAgICAgICAgICAgIDxoYW5kbGVyIHJlZj0iYW55UmVmIiBuYW1lPSJIYW5kZXJuYW1lIiBjbGFzcz0iSGFuZGVyLmNsYXNzIj4KLSAgICAgICAgICAgICAgICA8b3JkZXIgYmVmb3JlPSJhbnlCZWZpcmVVUkkiIGFmdGVyPSJhbnlhZnRlclVSSSIgcGhhc2U9ImFueWhhc2UiIHBoYXNlRmlyc3Q9InRydWUiIHBoYXNlTGFzdD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9InBhcmE4IiBsb2NrZWQ9InhzZDp0cnVlIj4xMjM8L3BhcmFtZXRlcj4KLSAgICAgICAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9InBhcmE5IiBsb2NrZWQ9InhzZDp0cnVlIj40NTY8L3BhcmFtZXRlcj4KLSAgICAgICAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9InBhcmExMCIgbG9ja2VkPSJ4c2Q6dHJ1ZSI+Nzg5PC9wYXJhbWV0ZXI+Ci0gICAgICAgICAgICA8L2hhbmRsZXI+Ci0gICAgICAgICAgICA8aGFuZGxlciByZWY9ImFueVJlZiI+Ci0gICAgICAgICAgICAgICAgPG9yZGVyIGJlZm9yZT0iYW55QmVmaXJlVVJJIiBhZnRlcj0iYW55YWZ0ZXJVUkkiIHBoYXNlPSJhbnloYXNlIiBwaGFzZUZpcnN0PSJ0cnVlIiBwaGFzZUxhc3Q9ImZhbHNlIi8+Ci0KLSAgICAgICAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9InBhcmE4IiBsb2NrZWQ9InhzZDp0cnVlIj4xMjM8L3BhcmFtZXRlcj4KLSAgICAgICAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9InBhcmE5IiBsb2NrZWQ9InhzZDp0cnVlIj40NTY8L3BhcmFtZXRlcj4KLSAgICAgICAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9InBhcmExMCIgbG9ja2VkPSJ4c2Q6dHJ1ZSI+Nzg5PC9wYXJhbWV0ZXI+Ci0KLSAgICAgICAgICAgIDwvaGFuZGxlcj4KLSAgICAgICAgPC9PdXRGbG93PgotICAgICAgICA8SW5GYXVsdEZsb3c+Ci0gICAgICAgICAgICA8aGFuZGxlciByZWY9ImFueVJlZiIgbmFtZT0iSGFuZGVybmFtZSIgY2xhc3M9IkhhbmRlci5jbGFzcyI+Ci0gICAgICAgICAgICAgICAgPG9yZGVyIGJlZm9yZT0iYW55QmVmaXJlVVJJIiBhZnRlcj0iYW55YWZ0ZXJVUkkiIHBoYXNlPSJhbnloYXNlIiBwaGFzZUZpcnN0PSJ0cnVlIiBwaGFzZUxhc3Q9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJwYXJhOCIgbG9ja2VkPSJ4c2Q6dHJ1ZSI+MTIzPC9wYXJhbWV0ZXI+Ci0gICAgICAgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJwYXJhOSIgbG9ja2VkPSJ4c2Q6dHJ1ZSI+NDU2PC9wYXJhbWV0ZXI+Ci0gICAgICAgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJwYXJhMTAiIGxvY2tlZD0ieHNkOnRydWUiPjc4OTwvcGFyYW1ldGVyPgotICAgICAgICAgICAgPC9oYW5kbGVyPgotICAgICAgICAgICAgPGhhbmRsZXIgcmVmPSJhbnlSZWYiPgotICAgICAgICAgICAgICAgIDxvcmRlciBiZWZvcmU9ImFueUJlZmlyZVVSSSIgYWZ0ZXI9ImFueWFmdGVyVVJJIiBwaGFzZT0iYW55aGFzZSIgcGhhc2VGaXJzdD0idHJ1ZSIgcGhhc2VMYXN0PSJmYWxzZSIvPgotCi0gICAgICAgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJwYXJhOCIgbG9ja2VkPSJ4c2Q6dHJ1ZSI+MTIzPC9wYXJhbWV0ZXI+Ci0gICAgICAgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJwYXJhOSIgbG9ja2VkPSJ4c2Q6dHJ1ZSI+NDU2PC9wYXJhbWV0ZXI+Ci0gICAgICAgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJwYXJhMTAiIGxvY2tlZD0ieHNkOnRydWUiPjc4OTwvcGFyYW1ldGVyPgotCi0gICAgICAgICAgICA8L2hhbmRsZXI+Ci0gICAgICAgIDwvSW5GYXVsdEZsb3c+Ci0gICAgPC9vcGVyYXRpb24+Ci0gICAgPHNlcnZpY2UgcmVmPSJ4c2Q6YW55U2VydmljZVJlZiIvPgotPC9zZXJ2aWNlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L3NlcnZpY2UyL01FVEEtSU5GL01BTklGRVNULk1GIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvc2VydmljZTIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhNTBiOGYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvc2VydmljZTIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMA0KLUNyZWF0ZWQtQnk6IEFudCAxLjQuMQ0KLQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L3NlcnZpY2UyL01FVEEtSU5GL3NlcnZpY2VzLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L3NlcnZpY2UyL01FVEEtSU5GL3NlcnZpY2VzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI3ZmVmMi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9zZXJ2aWNlMi9NRVRBLUlORi9zZXJ2aWNlcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzZXJ2aWNlIG5hbWU9IiI+Ci0gICAgPCEtLSB0aGVzZSBhcmUgU2VydmljZSBQYXJhbWV0ZXJzIC0tPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFyYTEiIGxvY2tlZD0ieHNkOnRydWUiPjEwPC9wYXJhbWV0ZXI+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJwYXJhMiI+Q29sb21ibzwvcGFyYW1ldGVyPgotICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgVGhpcyBpcyBhIHRlc3Rpbmcgc2VydmljZSAsIHRvIHRlc3QgdGhlIHN5c3RlbSBpcyB3b3JraW5nIG9yIG5vdAotICAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgICA8b3BlcmF0aW9uIG5hbWU9Im9wbmFtZSI+Ci0gICAgPC9vcGVyYXRpb24+Ci08L3NlcnZpY2U+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvc2VydmljZTIvYnVpbGQueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvc2VydmljZTIvYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjY0MjBlLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L3NlcnZpY2UyL2J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxwcm9qZWN0IGJhc2VkaXI9Ii4iIGRlZmF1bHQ9ImphciI+Ci0gICAgPHByb3BlcnR5IG5hbWU9InNyYyIgbG9jYXRpb249Ii4iLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iYnVpbGQiIGxvY2F0aW9uPSJidWlsZCIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC5jbGFzc2VzIiBsb2NhdGlvbj0iJHtidWlsZH0vY2xhc3NlcyIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC5saWIiIGxvY2F0aW9uPSIke2J1aWxkfS9saWIiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0ibGliIiBsb2NhdGlvbj0ibGliIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9InJvb3QiIGxvY2F0aW9uPSIuLi8uLi8uLi8iLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iamFyLmRpciIgbG9jYXRpb249IiR7cm9vdH0vdGFyZ2V0L3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvc2VydmljZXMvIi8+Ci0KLSAgICA8cGF0aCBpZD0iYXhpcy50ZXN0LmNsYXNzcGF0aCI+Ci0gICAgICAgIDxwYXRoIHJlZmlkPSJtYXZlbi5kZXBlbmRlbmN5LmNsYXNzcGF0aCI+PC9wYXRoPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249Ii4uLy4uLy4uL3RhcmdldC9jbGFzc2VzIi8+Ci0gICAgPC9wYXRoPgotCi0gICAgPHRhcmdldCBuYW1lPSJjb21waWxlIiBkZXBlbmRzPSJpbml0IiB1bmxlc3M9ImphcnMudXB0b2RhdGUiPgotICAgICAgICA8bWtkaXIgZGlyPSIke2J1aWxkLmNsYXNzZXN9Ii8+Ci0gICAgICAgIDxta2RpciBkaXI9IiR7YnVpbGQubGlifSIvPgotICAgICAgICA8amF2YWMgZGVzdGRpcj0iJHtidWlsZC5jbGFzc2VzfSIgZGVidWc9Im9uIj4KLSAgICAgICAgICAgIDxjbGFzc3BhdGggcmVmaWQ9ImF4aXMudGVzdC5jbGFzc3BhdGgiLz4KLSAgICAgICAgICAgIDxzcmMgcGF0aD0iJHtzcmN9Ii8+Ci0gICAgICAgIDwvamF2YWM+Ci0gICAgPC90YXJnZXQ+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9ImphciIgZGVwZW5kcz0iY29tcGlsZSIgdW5sZXNzPSJqYXJzLnVwdG9kYXRlIj4KLSAgICAgICAgPGNvcHkgdG9kaXI9IiR7YnVpbGQuY2xhc3Nlc30vTUVUQS1JTkYiPgotICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke2Jhc2VkaXJ9L01FVEEtSU5GLyI+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi54bWwiLz4KLSAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJidWlsZC54bWwiLz4KLSAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgPC9jb3B5PgotCi0gICAgICAgIDxta2RpciBkaXI9IiR7amFyLmRpcn0iLz4KLSAgICAgICAgPGphciBqYXJmaWxlPSIke2phci5kaXJ9L3NlcnZpY2UyLmphciIgYmFzZWRpcj0iJHtidWlsZC5jbGFzc2VzfSI+Ci0gICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKiIvPgotICAgICAgICA8L2phcj4KLSAgICAgICAgPGRlbGV0ZSBkaXI9IiR7YnVpbGR9Ii8+Ci0gICAgPC90YXJnZXQ+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9ImluaXQiPgotICAgICAgICA8dXB0b2RhdGUgcHJvcGVydHk9ImphcnMudXB0b2RhdGUiIHRhcmdldGZpbGU9IiR7amFyLmRpcn0vc2VydmljZTIuamFyIj4KLSAgICAgICAgICAgIDxzcmNmaWxlcyBkaXI9IiR7c3JjfSI+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5qYXZhIi8+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi54bWwiLz4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLndzZGwiLz4KLSAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSIke2J1aWxkfS8qKiIvPgotICAgICAgICAgICAgPC9zcmNmaWxlcz4KLSAgICAgICAgPC91cHRvZGF0ZT4KLSAgICAgICAgPGVjaG8gbWVzc2FnZT0idGhlIGZpbGVzIGFyZSB1cCB0byBkYXRlID0gJHtqYXJzLnVwdG9kYXRlfSI+PC9lY2hvPgotICAgIDwvdGFyZ2V0PgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9zZXJ2aWNlR3JvdXBSZXBvL2F4aXMyLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L3NlcnZpY2VHcm91cFJlcG8vYXhpczIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjg4MTJmLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L3NlcnZpY2VHcm91cFJlcG8vYXhpczIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08YXhpc2NvbmZpZyBuYW1lPSJBeGlzSmF2YTIuMCI+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gUGFyYW1ldGVycyAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJob3RkZXBsb3ltZW50Ij50cnVlPC9wYXJhbWV0ZXI+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJob3R1cGRhdGUiPmZhbHNlPC9wYXJhbWV0ZXI+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJlbmFibGVNVE9NIj50cnVlPC9wYXJhbWV0ZXI+Ci0KLSAgICA8cGFyYW1ldGVyIG5hbWU9InVzZXJOYW1lIj5hZG1pbjwvcGFyYW1ldGVyPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFzc3dvcmQiPmF4aXMyPC9wYXJhbWV0ZXI+Ci0KLSAgICA8cGFyYW1ldGVyIG5hbWU9InNlcmFsaXplTG9jYXRpb24iPi4vdGFyZ2V0PC9wYXJhbWV0ZXI+Ci0KLQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIE1lc3NhZ2UgUmVjZWl2ZXJzIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIFRoaXMgaXMgdGhlIERlYWZ1bHQgTWVzc2FnZSBSZWNlaXZlciBmb3IgdGhlIFJlcXVlc3QgUmVzcG9uc2Ugc3R5bGUgT3BlcmF0aW9ucyAtLT4KLSAgICA8bWVzc2FnZVJlY2VpdmVyIG1lcD0iSU5PVVQiIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5SYXdYTUxJTk91dE1lc3NhZ2VSZWNlaXZlciIvPgotCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gVHJhbnNwb3J0IElucyAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0KLSAgICA8cGhhc2VPcmRlciB0eXBlPSJJbkZsb3ciPgotICAgICAgICA8IS0tICBTeXN0ZW0gcHJlIGRlZmluZWQgcGhhc2VzICAgICAgIC0tPgotICAgICAgICAgPHBoYXNlIG5hbWU9IlRyYW5zcG9ydCI+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJSZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciIvPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiLz4KLSAgICAgICAgPC9waGFzZT4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlNlY3VyaXR5Ii8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJQcmVEaXNwYXRjaCIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iRGlzcGF0Y2giIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5EaXNwYXRjaFBoYXNlIj4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5BZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIi8+Ci0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciIvPgotICAgICAgICA8L3BoYXNlPgotICAgICAgICA8IS0tICBTeXN0ZW0gcHJlIGRlZmluZWQgcGhhc2VzICAgICAgIC0tPgotICAgICAgICA8IS0tICAgQWZ0ZXIgUG9zdGRpc3BhdGNoIHBoYXNlIG1vZHVsZSBhdXRob3Igb3Igb3Igc2VydmljZSBhdXRob3IgY2FuIGFkZCBhbnkgcGhhc2UgaGUgd2FudCAgICAgIC0tPgotICAgICAgICA8cGhhc2UgbmFtZT0iT3BlcmF0aW9uSW5QaGFzZSIvPgotICAgIDwvcGhhc2VPcmRlcj4KLSAgICA8cGhhc2VPcmRlciB0eXBlPSJPdXRGbG93Ij4KLSAgICAgICAgPCEtLSAgICAgIHVzZXIgY2FuIGFkZCBoaXMgb3duIHBoYXNlcyB0byB0aGlzIGFyZWEgIC0tPgotICAgICAgICA8cGhhc2UgbmFtZT0iT3BlcmF0aW9uT3V0UGhhc2UiLz4KLSAgICAgICAgPCEtLXN5c3RlbSBwcmVkZWZpbmVkIHBoYXNlLS0+Ci0gICAgICAgIDwhLS10aGVzZSBwaGFzZSB3aWxsIHJ1biBpcnJlc3BlY3RpdmUgb2YgdGhlIHNlcnZpY2UtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlBvbGljeURldGVybWluYXRpb24iLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik1lc3NhZ2VPdXQiLz4KLSAgICA8L3BoYXNlT3JkZXI+Ci0gICAgPHBoYXNlT3JkZXIgdHlwZT0iSW5GYXVsdEZsb3ciPgotICAgICAgICA8cGhhc2UgbmFtZT0iUHJlRGlzcGF0Y2giLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9IkRpc3BhdGNoIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuRGlzcGF0Y2hQaGFzZSI+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJSZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciIvPgotCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciIvPgotCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJBZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciIvPgotCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiLz4KLSAgICAgICAgPC9waGFzZT4KLSAgICAgICAgPCEtLSAgICAgIHVzZXIgY2FuIGFkZCBoaXMgb3duIHBoYXNlcyB0byB0aGlzIGFyZWEgIC0tPgotICAgICAgICA8cGhhc2UgbmFtZT0iT3BlcmF0aW9uSW5GYXVsdFBoYXNlIi8+Ci0gICAgPC9waGFzZU9yZGVyPgotICAgIDxwaGFzZU9yZGVyIHR5cGU9Ik91dEZhdWx0RmxvdyI+Ci0gICAgICAgIDwhLS0gICAgICB1c2VyIGNhbiBhZGQgaGlzIG93biBwaGFzZXMgdG8gdGhpcyBhcmVhICAtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik9wZXJhdGlvbk91dEZhdWx0UGhhc2UiLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlBvbGljeURldGVybWluYXRpb24iLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik1lc3NhZ2VPdXQiLz4KLSAgICA8L3BoYXNlT3JkZXI+Ci08L2F4aXNjb25maWc+Ci0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L3NlcnZpY2VHcm91cFJlcG8vc2VydmljZXMvc2VydmljZUdyb3VwL01FVEEtSU5GL3NlcnZpY2VzLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L3NlcnZpY2VHcm91cFJlcG8vc2VydmljZXMvc2VydmljZUdyb3VwL01FVEEtSU5GL3NlcnZpY2VzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFhZTgzOS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9zZXJ2aWNlR3JvdXBSZXBvL3NlcnZpY2VzL3NlcnZpY2VHcm91cC9NRVRBLUlORi9zZXJ2aWNlcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci08c2VydmljZUdyb3VwPgotICAgIDxzZXJ2aWNlIG5hbWU9InNlcnZpY2UxIj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJvcDEiPgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJvcDIiPgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICA8L3NlcnZpY2U+Ci0gICAgPHNlcnZpY2UgbmFtZT0ic2VydmljZTIiPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9Im9wMSI+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9Im9wMiI+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotICAgIDwvc2VydmljZT4KLSAgICA8cGFyYW1ldGVyIG5hbWU9IlNlcnZpY2VDbGFzcyI+b3JnLmFwYWNoZS5heGlzMi5FY2hvMjwvcGFyYW1ldGVyPgotPC9zZXJ2aWNlR3JvdXA+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvc2VydmljZU1vZHVsZS9NRVRBLUlORi9tb2R1bGUueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvc2VydmljZU1vZHVsZS9NRVRBLUlORi9tb2R1bGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWU0YWZjLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L3NlcnZpY2VNb2R1bGUvTUVUQS1JTkYvbW9kdWxlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPG1vZHVsZSBuYW1lPSJzZXJ2aWNlTW9kdWxlIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5JbmF2YWxpZE1vZHVsZUltcGwiPgotICAgIDxJbkZsb3c+Ci0gICAgICAgIDxoYW5kbGVyIG5hbWU9ImgxIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5Nb2R1bGVIYW5kbGVyMSI+Ci0gICAgICAgICAgICA8b3JkZXIgcGhhc2U9IkRpc3BhdGNoIi8+Ci0gICAgICAgIDwvaGFuZGxlcj4KLSAgICAgICAgPGhhbmRsZXIgbmFtZT0iaDIiIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLk1vZHVsZUhhbmRsZXIxIj4KLSAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iVHJhbnNwb3J0SW4iLz4KLSAgICAgICAgPC9oYW5kbGVyPgotICAgIDwvSW5GbG93PgotCi0gICAgPE91dEZsb3c+Ci0gICAgICAgIDxoYW5kbGVyIG5hbWU9ImgzIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5Nb2R1bGVIYW5kbGVyMSI+Ci0gICAgICAgICAgICA8b3JkZXIgcGhhc2U9IkRpc3BhdGNoIi8+Ci0gICAgICAgIDwvaGFuZGxlcj4KLSAgICA8L091dEZsb3c+Ci0KLSAgICA8T3V0RmF1bHRGbG93PgotICAgICAgICA8aGFuZGxlciBuYW1lPSJoNCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuTW9kdWxlSGFuZGxlcjEiPgotICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJPcGVyYXRpb25PdXRGYXVsdFBoYXNlIi8+Ci0gICAgICAgIDwvaGFuZGxlcj4KLSAgICA8L091dEZhdWx0Rmxvdz4KLQotICAgIDxJbkZhdWx0Rmxvdz4KLSAgICAgICAgPGhhbmRsZXIgbmFtZT0iaDUiIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLk1vZHVsZUhhbmRsZXIxIj4KLSAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iT3BlcmF0aW9uSW5GYXVsdFBoYXNlIi8+Ci0gICAgICAgIDwvaGFuZGxlcj4KLSAgICA8L0luRmF1bHRGbG93PgotPC9tb2R1bGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvc2VydmljZU1vZHVsZS9idWlsZC54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9zZXJ2aWNlTW9kdWxlL2J1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJlMWI5Yi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9zZXJ2aWNlTW9kdWxlL2J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxwcm9qZWN0IGJhc2VkaXI9Ii4iIGRlZmF1bHQ9ImphciI+Ci0gICAgPHByb3BlcnR5IG5hbWU9InNyYyIgbG9jYXRpb249Ii4iLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iYnVpbGQiIGxvY2F0aW9uPSJidWlsZCIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC5jbGFzc2VzIiBsb2NhdGlvbj0iJHtidWlsZH0vY2xhc3NlcyIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC5saWIiIGxvY2F0aW9uPSIke2J1aWxkfS9saWIiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0ibGliIiBsb2NhdGlvbj0ibGliIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9InJvb3QiIGxvY2F0aW9uPSIuLi8uLi8uLi8iLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iamFyLmRpciIgbG9jYXRpb249IiR7cm9vdH0vdGFyZ2V0L3Rlc3QtcmVzb3VyY2VzL0ludmFsaWREZXBsb3ltZW50L21vZHVsZXMvIi8+Ci0KLSAgICA8cGF0aCBpZD0iYXhpcy50ZXN0LmNsYXNzcGF0aCI+Ci0gICAgICAgIDxwYXRoIHJlZmlkPSJtYXZlbi5kZXBlbmRlbmN5LmNsYXNzcGF0aCI+PC9wYXRoPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249Ii4uLy4uLy4uL3RhcmdldC9jbGFzc2VzIi8+Ci0gICAgPC9wYXRoPgotCi0gICAgPHRhcmdldCBuYW1lPSJjb21waWxlIiBkZXBlbmRzPSJpbml0IiB1bmxlc3M9ImphcnMudXB0b2RhdGUiPgotICAgICAgICA8bWtkaXIgZGlyPSIke2J1aWxkLmNsYXNzZXN9Ii8+Ci0gICAgICAgIDxta2RpciBkaXI9IiR7YnVpbGQubGlifSIvPgotICAgICAgICA8amF2YWMgZGVzdGRpcj0iJHtidWlsZC5jbGFzc2VzfSIgZGVidWc9Im9uIj4KLSAgICAgICAgICAgIDxjbGFzc3BhdGggcmVmaWQ9ImF4aXMudGVzdC5jbGFzc3BhdGgiLz4KLSAgICAgICAgICAgIDxzcmMgcGF0aD0iJHtzcmN9Ii8+Ci0gICAgICAgIDwvamF2YWM+Ci0gICAgPC90YXJnZXQ+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9ImphciIgZGVwZW5kcz0iY29tcGlsZSIgdW5sZXNzPSJqYXJzLnVwdG9kYXRlIj4KLSAgICAgICAgPGNvcHkgdG9kaXI9IiR7YnVpbGQuY2xhc3Nlc30vTUVUQS1JTkYiPgotICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke2Jhc2VkaXJ9L01FVEEtSU5GLyI+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi54bWwiLz4KLSAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJidWlsZC54bWwiLz4KLSAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgPC9jb3B5PgotCi0gICAgICAgIDxta2RpciBkaXI9IiR7amFyLmRpcn0iLz4KLSAgICAgICAgPGphciBqYXJmaWxlPSIke2phci5kaXJ9L3NlcnZpY2VNb2R1bGUuamFyIiBiYXNlZGlyPSIke2J1aWxkLmNsYXNzZXN9Ij4KLSAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqIi8+Ci0gICAgICAgIDwvamFyPgotICAgICAgICA8ZGVsZXRlIGRpcj0iJHtidWlsZH0iLz4KLSAgICA8L3RhcmdldD4KLQotICAgIDx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0gICAgICAgIDx1cHRvZGF0ZSBwcm9wZXJ0eT0iamFycy51cHRvZGF0ZSIgdGFyZ2V0ZmlsZT0iJHtqYXIuZGlyfS9zZXJ2aWNlTW9kdWxlLmphciI+Ci0gICAgICAgICAgICA8c3JjZmlsZXMgZGlyPSIke3NyY30iPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouamF2YSIvPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoueG1sIi8+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi53c2RsIi8+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iJHtidWlsZH0vKioiLz4KLSAgICAgICAgICAgIDwvc3JjZmlsZXM+Ci0gICAgICAgIDwvdXB0b2RhdGU+Ci0gICAgICAgIDxlY2hvIG1lc3NhZ2U9InRoZSBmaWxlcyBhcmUgdXAgdG8gZGF0ZSA9ICR7amFycy51cHRvZGF0ZX0iPjwvZWNobz4KLSAgICA8L3RhcmdldD4KLQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvc29hcHJvbGVjb25maWd1cmF0aW9uL2F4aXMyLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L3NvYXByb2xlY29uZmlndXJhdGlvbi9heGlzMi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0MWM5NWMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvc29hcHJvbGVjb25maWd1cmF0aW9uL2F4aXMyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI0NCArMCwwIEBACi08IS0tDQotICB+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+DQotDQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4NCi0gICAgPCEtLSBUcmFuc3BvcnQgT3V0cyAtLT4NCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPg0KLQ0KLSAgDQotICAgIDwhLS08dHJhbnNwb3J0U2VuZGVyIG5hbWU9ImphdmEiLS0+DQotICAgICAgICAgICAgICAgICAgICAgPCEtLWNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5qYXZhLkphdmFUcmFuc3BvcnRTZW5kZXIiLz4tLT4NCi0NCi0NCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPg0KLSAgICA8IS0tICBTT0FQIFJvbGUgQ29uZmlndXJhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+DQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4NCi0gICAgPCEtLSBVc2UgdGhlIGZvbGxvd2luZyBwYXR0ZXJuIHRvIGNvbmZpZ3VyZSB0aGlzIGF4aXMyDQotICAgICAgICAgaW5zdGFuY2UgdG8gYWN0IGluIHBhcnRpY3VsYXIgcm9sZXMuIE5vdGUgdGhhdCBpbg0KLSAgICAgICAgIHRoZSBhYnNlbmNlIG9mIGFueSBjb25maWd1cmF0aW9uLCBBeGlzMiB3aWxsIGFjdCANCi0gICAgICAgICBvbmx5IGluIHRoZSB1bHRpbWF0ZSByZWNlaXZlciByb2xlIC0tPg0KLSAgICA8U09BUFJvbGVDb25maWd1cmF0aW9uIGlzVWx0aW1hdGVSZWNlaXZlcj0iZmFsc2UiPg0KLSAgICAJPHJvbGU+aHR0cDovL215L2N1c3RvbS9yb2xlPC9yb2xlPg0KLSAgICA8L1NPQVBSb2xlQ29uZmlndXJhdGlvbj4NCi0JDQotDQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4NCi0gICAgPCEtLSBQaGFzZXMgIC0tPg0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+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+DQotPC9heGlzY29uZmlnPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9lcHJUZXN0LnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9lcHJUZXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTIxM2NjOC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZXByVGVzdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzb2FwZW52OkVudmVsb3BlIHhtbG5zOnNvYXBlbnY9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIj4KLSAgICA8c29hcGVudjpIZWFkZXIgeG1sbnM6d3NhPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA4L2FkZHJlc3NpbmciPgotICAgICAgICA8c29hcGVudjpSZWZlcmVuY2U0PlZhbHVlIDQwMDwvc29hcGVudjpSZWZlcmVuY2U0PgotICAgICAgICA8c29hcGVudjpSZWZlcmVuY2UxPlZhbHVlIDEwMDwvc29hcGVudjpSZWZlcmVuY2UxPgotICAgICAgICA8c29hcGVudjpSZWZlcmVuY2UwPlZhbHVlIDA8L3NvYXBlbnY6UmVmZXJlbmNlMD4KLSAgICAgICAgPHNvYXBlbnY6UmVmZXJlbmNlMj5WYWx1ZSAyMDA8L3NvYXBlbnY6UmVmZXJlbmNlMj4KLSAgICAgICAgPHNvYXBlbnY6UmVmZXJlbmNlMz5WYWx1ZSAzMDA8L3NvYXBlbnY6UmVmZXJlbmNlMz4KLSAgICAgICAgPHdzYTpTZXJ2aWNlTmFtZSB3c2E6UG9ydE5hbWU9InBvcnQiPnNlcnZpY2VOUzpTZXJ2aWNlPC93c2E6U2VydmljZU5hbWU+Ci0gICAgICAgIDx3c2E6UG9ydFR5cGU+cG9ydE5TOlBvcnQ8L3dzYTpQb3J0VHlwZT4KLSAgICAgICAgPHdzYTpGcm9tPgotICAgICAgICAgICAgPHdzYTpBZGRyZXNzPmh0dHA6Ly93d3cuZnJvbS5vcmcvc2VydmljZS88L3dzYTpBZGRyZXNzPgotICAgICAgICA8L3dzYTpGcm9tPgotICAgIDwvc29hcGVudjpIZWFkZXI+Ci0gICAgPHNvYXBlbnY6Qm9keT48L3NvYXBlbnY6Qm9keT4KLTwvc29hcGVudjpFbnZlbG9wZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvajJzZWNidWlsZC54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvajJzZWNidWlsZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjMmUxMWYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2oyc2VjYnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHByb2plY3QgYmFzZWRpcj0iLiIgZGVmYXVsdD0idGVzdHNldHVwIj4KLSAgIAotCTx0YXJnZXQgbmFtZT0idGVzdHNldHVwIj4KLSAgICAgICAgPG1rZGlyIGRpcj0iJHttYXZlbi5idWlsZC5kaXJ9L3Rlc3QtcmVzb3VyY2VzL2phdmEyc2VjL21vcmUiLz4gICAgICAgIAotICAgICAgICA8bWtkaXIgZGlyPSIke21hdmVuLmJ1aWxkLmRpcn0vdGVzdC1yZXNvdXJjZXMvamF2YTJzZWMvbGVzcyIvPiAgICAgICAgCi0KLSAgICAgICAgPGphciBkZXN0ZmlsZT0iJHttYXZlbi5idWlsZC5kaXJ9L3Rlc3QtcmVzb3VyY2VzL2phdmEyc2VjL21vcmUvTW9yZVBlcm1pc3Npb24uamFyIiB1cGRhdGU9InRydWUiPgotICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7bWF2ZW4uYnVpbGQuZGlyfS90ZXN0LWNsYXNzZXMiPgotICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9heGlzMi9qYXZhL3NlY3VyaXR5L2RyaXZlci8qIi8+Ci0gICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2F4aXMyL2phdmEvc2VjdXJpdHkvYWN0aW9uLyoiLz4KLSAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvYXhpczIvamF2YS9zZWN1cml0eS9pbnRlcmYvKiIvPgotICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9heGlzMi9qYXZhL3NlY3VyaXR5L21vcmUvKiIvPgotICAgICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgIDwvamFyPgotICAgICAgICAKLSAgICAgICAgPGRlbGV0ZSBkaXI9IiR7bWF2ZW4uYnVpbGQuZGlyfS90ZXN0LWNsYXNzZXMvb3JnL2FwYWNoZS9heGlzMi9qYXZhL3NlY3VyaXR5L2RyaXZlciIgLz4gICAKLSAgICAgICAgPGRlbGV0ZSBkaXI9IiR7bWF2ZW4uYnVpbGQuZGlyfS90ZXN0LWNsYXNzZXMvb3JnL2FwYWNoZS9heGlzMi9qYXZhL3NlY3VyaXR5L21vcmUiIC8+Ci0gICAgICAgIDxkZWxldGUgZGlyPSIke21hdmVuLmJ1aWxkLmRpcn0vdGVzdC1jbGFzc2VzL29yZy9hcGFjaGUvYXhpczIvamF2YS9zZWN1cml0eS9hY3Rpb24iIC8+Ci0gICAgICAgIDxkZWxldGUgZGlyPSIke21hdmVuLmJ1aWxkLmRpcn0vdGVzdC1jbGFzc2VzL29yZy9hcGFjaGUvYXhpczIvamF2YS9zZWN1cml0eS9pbnRlcmYiIC8+Ci0gICAgICAgICAKLSAgICAgICAgPGphciBkZXN0ZmlsZT0iJHttYXZlbi5idWlsZC5kaXJ9L3Rlc3QtcmVzb3VyY2VzL2phdmEyc2VjL2xlc3MvTGVzc1Blcm1pc3Npb24uamFyIiB1cGRhdGU9InRydWUiPgotICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7bWF2ZW4uYnVpbGQuZGlyfS90ZXN0LWNsYXNzZXMiPgotICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9heGlzMi9qYXZhL3NlY3VyaXR5L2xlc3MvKiIvPgotICAgICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgIDwvamFyPgotICAgICAgICAKLSAgICAgICAgPGRlbGV0ZSBkaXI9IiR7bWF2ZW4uYnVpbGQuZGlyfS90ZXN0LWNsYXNzZXMvb3JnL2FwYWNoZS9heGlzMi9qYXZhL3NlY3VyaXR5L2xlc3MiIC8+Ci0KLSAgICA8L3RhcmdldD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9qYXZhMnNlYy9wb2xpY3kvamF2YTJzZWN0ZXN0LnBvbGljeSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9qYXZhMnNlYy9wb2xpY3kvamF2YTJzZWN0ZXN0LnBvbGljeQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM1Njk0OC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvamF2YTJzZWMvcG9saWN5L2phdmEyc2VjdGVzdC5wb2xpY3kKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi1ncmFudCB7DQotICAgICAgICBwZXJtaXNzaW9uIGphdmEudXRpbC5Qcm9wZXJ0eVBlcm1pc3Npb24gImJhc2VkaXIiLCAicmVhZCI7DQotICAgICAgICBwZXJtaXNzaW9uIGphdmEudXRpbC5Qcm9wZXJ0eVBlcm1pc3Npb24gIm1hdmVuLmJ1aWxkLmRpciIsICJyZWFkIjsNCi0gICAgICAgIHBlcm1pc3Npb24gamF2YS5sYW5nLlJ1bnRpbWVQZXJtaXNzaW9uICJhY2Nlc3NEZWNsYXJlZE1lbWJlcnMiOw0KLSAgICAgICAgcGVybWlzc2lvbiBqYXZhLmxhbmcuUnVudGltZVBlcm1pc3Npb24gImV4aXRWTSI7DQotICAgICAgICBwZXJtaXNzaW9uIGphdmEubGFuZy5SdW50aW1lUGVybWlzc2lvbiAiZ2V0UHJvdGVjdGlvbkRvbWFpbiI7DQotICAgICAgICBwZXJtaXNzaW9uIGphdmEubGFuZy5SdW50aW1lUGVybWlzc2lvbiAibW9kaWZ5VGhyZWFkR3JvdXAiOw0KLSAgICAgICAgcGVybWlzc2lvbiBqYXZhLmxhbmcuUnVudGltZVBlcm1pc3Npb24gInNldENvbnRleHRDbGFzc0xvYWRlciI7DQotICAgICAgICBwZXJtaXNzaW9uIGphdmEubGFuZy5SdW50aW1lUGVybWlzc2lvbiAic2V0SU8iOyAgICAgICAgDQotICAgICAgICBwZXJtaXNzaW9uIGphdmEubGFuZy5SdW50aW1lUGVybWlzc2lvbiAic2V0U2VjdXJpdHlNYW5hZ2VyIjsNCi0gICAgICAgICAgICAgICAgDQotICAgICAgICBwZXJtaXNzaW9uIGphdmEuaW8uRmlsZVBlcm1pc3Npb24gIiR7bWF2ZW5fYnVpbGRfZGlyfS9jbGFzc2VzLyIsICJyZWFkIjsNCi0gICAgICAgIHBlcm1pc3Npb24gamF2YS5pby5GaWxlUGVybWlzc2lvbiAiJHttYXZlbl9idWlsZF9kaXJ9L2NsYXNzZXMvb3JnL2FwYWNoZS9heGlzMi9qYXZhL3NlY3VyaXR5L0FjY2Vzc0NvbnRyb2xsZXIuY2xhc3MiLCAicmVhZCI7DQotICAgICAgICBwZXJtaXNzaW9uIGphdmEuaW8uRmlsZVBlcm1pc3Npb24gIiR7bWF2ZW5fYnVpbGRfZGlyfS9jbGFzc2VzL29yZy9hcGFjaGUveGVyY2VzL2RvbS9DaGFyYWN0ZXJEYXRhSW1wbCQxLmNsYXNzIiwgInJlYWQiOyAgICAgDQotIA0KLSAgICAgICAgcGVybWlzc2lvbiBqYXZhLmlvLkZpbGVQZXJtaXNzaW9uICIke21hdmVuX2J1aWxkX2Rpcn0vdGVzdC1jbGFzc2VzLyIsICJyZWFkIjsNCi0gICAgICAgIHBlcm1pc3Npb24gamF2YS5pby5GaWxlUGVybWlzc2lvbiAiJHttYXZlbl9idWlsZF9kaXJ9L3Rlc3QtY2xhc3Nlcy9vcmcvYXBhY2hlL2F4aXMyL2phdmEvc2VjdXJpdHkvQWNjZXNzQ29udHJvbGxlci5jbGFzcyIsICJyZWFkIjsNCi0gICAgICAgIHBlcm1pc3Npb24gamF2YS5pby5GaWxlUGVybWlzc2lvbiAiJHttYXZlbl9idWlsZF9kaXJ9L3Rlc3QtY2xhc3Nlcy9vcmcvYXBhY2hlL3hlcmNlcy9kb20vQ0RBVEFTZWN0aW9uSW1wbC5jbGFzcyIsICJyZWFkIjsgIA0KLSAgICAgICAgcGVybWlzc2lvbiBqYXZhLmlvLkZpbGVQZXJtaXNzaW9uICIke21hdmVuX2J1aWxkX2Rpcn0vdGVzdC1jbGFzc2VzL29yZy9hcGFjaGUveGVyY2VzL2RvbS9DaGFyYWN0ZXJEYXRhSW1wbCQxLmNsYXNzIiwgInJlYWQiOw0KLSAgICAgICAgDQotICAgICAgICANCi0gICAgICAgIHBlcm1pc3Npb24gamF2YS5pby5GaWxlUGVybWlzc2lvbiAiJHttYXZlbl9idWlsZF9kaXJ9L3Rlc3QtcmVzb3VyY2VzL2phdmEyc2VjL2xlc3MvTGVzc1Blcm1pc3Npb24uamFyIiwgInJlYWQiOyANCi0gICAgICAgIHBlcm1pc3Npb24gamF2YS5pby5GaWxlUGVybWlzc2lvbiAiJHttYXZlbl9idWlsZF9kaXJ9L3Rlc3QtcmVzb3VyY2VzL2phdmEyc2VjL21vcmUvTW9yZVBlcm1pc3Npb24uamFyIiwgInJlYWQiOw0KLSAgICAgICAgDQotICAgICAgICBwZXJtaXNzaW9uIGphdmEuaW8uRmlsZVBlcm1pc3Npb24gIiR7bWF2ZW5fcmVwb19sb2NhbH0vLSIsICJyZWFkIjsNCi0gICAgICAgIHBlcm1pc3Npb24gamF2YS5pby5GaWxlUGVybWlzc2lvbiAiJHttYXZlbl9pbnN0YWxsZWRfcm9vdH0vbGliLy0iLCAicmVhZCI7DQotICAgICAgICANCi0gICAgICAgIHBlcm1pc3Npb24gamF2YS51dGlsLlByb3BlcnR5UGVybWlzc2lvbiAibWF2ZW5fYnVpbGRfZGlyIiwgInJlYWQiOw0KLSAgICAgICAgcGVybWlzc2lvbiBqYXZhLnV0aWwuUHJvcGVydHlQZXJtaXNzaW9uICJtYXZlbl90ZXN0X2Rlc3QiLCAicmVhZCI7ICAgICAgDQotICAgICAgICANCi19Ow0KLQ0KLQ0KLWdyYW50IGNvZGVCYXNlICJmaWxlOiR7bWF2ZW5fYnVpbGRfZGlyfS90ZXN0LXJlc291cmNlcy9qYXZhMnNlYy9tb3JlL01vcmVQZXJtaXNzaW9uLmphciIgew0KLSAgICAgICAgcGVybWlzc2lvbiBqYXZhLmlvLkZpbGVQZXJtaXNzaW9uICIke2Jhc2VfZGlyfS90ZXN0LXJlc291cmNlcy9qYXZhMnNlYy9wcml2YXRlL3ByaXZhdGUudHh0IiwgInJlYWQiOw0KLSAgICAgICAgcGVybWlzc2lvbiBqYXZhLmlvLkZpbGVQZXJtaXNzaW9uICIke2Jhc2VfZGlyfS90ZXN0LXJlc291cmNlcy9qYXZhMnNlYy9wdWJsaWMvcHVibGljLnR4dCIsICJyZWFkIjsNCi19Ow0KLQ0KLWdyYW50IGNvZGVCYXNlICJmaWxlOiR7bWF2ZW5fYnVpbGRfZGlyfS90ZXN0LXJlc291cmNlcy9qYXZhMnNlYy9sZXNzL0xlc3NQZXJtaXNzaW9uLmphciIgew0KLSAgICAgICAgcGVybWlzc2lvbiBqYXZhLmlvLkZpbGVQZXJtaXNzaW9uICIke2Jhc2VfZGlyfS90ZXN0LXJlc291cmNlcy9qYXZhMnNlYy9wdWJsaWMvcHVibGljLnR4dCIsICJyZWFkIjsNCi19Ow0KLQ0KLQ0KLWdyYW50IGNvZGVCYXNlICJmaWxlOiR7bWF2ZW5faW5zdGFsbGVkX3Jvb3R9L2xpYi8tIiB7DQotICAgICAgICBwZXJtaXNzaW9uIGphdmEuaW8uRmlsZVBlcm1pc3Npb24gIiR7YmFzZV9kaXJ9L3Rlc3QtcmVzb3VyY2VzL2phdmEyc2VjL3B1YmxpYy9wdWJsaWMudHh0IiwgInJlYWQiOw0KLSAgICAgICAgcGVybWlzc2lvbiBqYXZhLmlvLkZpbGVQZXJtaXNzaW9uICIke2Jhc2VfZGlyfS90ZXN0LXJlc291cmNlcy9qYXZhMnNlYy9wcml2YXRlL3ByaXZhdGUudHh0IiwgInJlYWQiOw0KLX07DQotDQotZ3JhbnQgY29kZUJhc2UgImZpbGU6JHttYXZlbl9idWlsZF9kaXJ9L3Rlc3QtY2xhc3Nlcy8iIHsNCi0gICAgICAgIHBlcm1pc3Npb24gamF2YS5pby5GaWxlUGVybWlzc2lvbiAiJHtiYXNlX2Rpcn0vdGVzdC1yZXNvdXJjZXMvamF2YTJzZWMvcHVibGljL3B1YmxpYy50eHQiLCAicmVhZCI7DQotfTsNCi0NCi1ncmFudCBjb2RlQmFzZSAiZmlsZToke21hdmVuX2J1aWxkX2Rpcn0vY2xhc3Nlcy8iIHsNCi0gICAgICAgIHBlcm1pc3Npb24gamF2YS5pby5GaWxlUGVybWlzc2lvbiAiJHtiYXNlX2Rpcn0vdGVzdC1yZXNvdXJjZXMvamF2YTJzZWMvcHVibGljL3B1YmxpYy50eHQiLCAicmVhZCI7DQotICAgICAgICBwZXJtaXNzaW9uIGphdmEuaW8uRmlsZVBlcm1pc3Npb24gIiR7YmFzZV9kaXJ9L3Rlc3QtcmVzb3VyY2VzL2phdmEyc2VjL3ByaXZhdGUvcHJpdmF0ZS50eHQiLCAicmVhZCI7DQotfTsNCi0NCi1ncmFudCBjb2RlQmFzZSAiZmlsZToke21hdmVuX3JlcG9fbG9jYWx9Ly0iIHsNCi0gICAgICAgIHBlcm1pc3Npb24gamF2YS5pby5GaWxlUGVybWlzc2lvbiAiJHtiYXNlX2Rpcn0vdGVzdC1yZXNvdXJjZXMvamF2YTJzZWMvcHVibGljL3B1YmxpYy50eHQiLCAicmVhZCI7DQotfTsNCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvamF2YTJzZWMvcHJpdmF0ZS9wcml2YXRlLnR4dCBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9qYXZhMnNlYy9wcml2YXRlL3ByaXZhdGUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTE3MzgxLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9qYXZhMnNlYy9wcml2YXRlL3ByaXZhdGUudHh0CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotVGhpcyBsaW5lIGlzIGZyb20gcHJpdmF0ZS50eHQuDQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2phdmEyc2VjL3B1YmxpYy9wdWJsaWMudHh0IGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2phdmEyc2VjL3B1YmxpYy9wdWJsaWMudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2U3NWIyLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9qYXZhMnNlYy9wdWJsaWMvcHVibGljLnR4dAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLVRoaXMgbGluZSBpcyBmcm9tIHB1YmxpYy50eHQuDQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL3NvYXBtZXNzYWdlLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9zb2FwbWVzc2FnZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiMjFkYmMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL3NvYXBtZXNzYWdlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHNvYXBlbnY6RW52ZWxvcGUgeG1sbnM6c29hcGVudj0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOndzYT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOC9hZGRyZXNzaW5nIj4KLSAgICA8c29hcGVudjpIZWFkZXI+Ci0gICAgICAgIDx3c2E6TWVzc2FnZUlEIHNvYXBlbnY6bXVzdFVuZGVyc3RhbmQ9IjAiPnV1aWQ6OTIwQzUxOTAtMEI4Ri0xMUQ5LThDRUQtRjIyRURFRUJGN0U1PC93c2E6TWVzc2FnZUlEPgotICAgICAgICA8d3NhOlRvIHNvYXBlbnY6bXVzdFVuZGVyc3RhbmQ9IjAiPmh0dHA6Ly9sb2NhbGhvc3Q6ODA4MS9heGlzL3NlcnZpY2VzL0JhbmtQb3J0PC93c2E6VG8+Ci0gICAgICAgIDx3c2E6RnJvbSBzb2FwZW52Om11c3RVbmRlcnN0YW5kPSIwIj4KLSAgICAgICAgICAgIDx3c2E6QWRkcmVzcz5odHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzAzL2FkZHJlc3Npbmcvcm9sZS9hbm9ueW1vdXM8L3dzYTpBZGRyZXNzPgotICAgICAgICA8L3dzYTpGcm9tPgotICAgICAgICA8d3NhOkFjdGlvbj5odHRwOi8vd3MuYXBhY2hlLm9yZy90ZXN0cy9hY3Rpb248L3dzYTpBY3Rpb24+Ci0gICAgPC9zb2FwZW52OkhlYWRlcj4KLSAgICA8c29hcGVudjpCb2R5PgotICAgICAgICA8bnMxOmdldEJhbGFuY2Ugc29hcGVudjplbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIgeG1sbnM6bnMxPSJodHRwOi8vbG9jYWxob3N0OjgwODEvYXhpcy9zZXJ2aWNlcy9CYW5rUG9ydCI+Ci0gICAgICAgICAgICA8YWNjb3VudE5vIGhyZWY9IiNpZDAiLz4KLSAgICAgICAgPC9uczE6Z2V0QmFsYW5jZT4KLSAgICAgICAgPG11bHRpUmVmIGlkPSJpZDAiIHNvYXBlbmM6cm9vdD0iMCIgc29hcGVudjplbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIgeHNpOnR5cGU9InhzZDppbnQiIHhtbG5zOnNvYXBlbmM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIj4xMDAxPC9tdWx0aVJlZj4KLSAgICA8L3NvYXBlbnY6Qm9keT4KLTwvc29hcGVudjpFbnZlbG9wZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvdGVzdC54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvdGVzdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyMTNjYzguLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL3Rlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08c29hcGVudjpFbnZlbG9wZSB4bWxuczpzb2FwZW52PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyI+Ci0gICAgPHNvYXBlbnY6SGVhZGVyIHhtbG5zOndzYT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOC9hZGRyZXNzaW5nIj4KLSAgICAgICAgPHNvYXBlbnY6UmVmZXJlbmNlND5WYWx1ZSA0MDA8L3NvYXBlbnY6UmVmZXJlbmNlND4KLSAgICAgICAgPHNvYXBlbnY6UmVmZXJlbmNlMT5WYWx1ZSAxMDA8L3NvYXBlbnY6UmVmZXJlbmNlMT4KLSAgICAgICAgPHNvYXBlbnY6UmVmZXJlbmNlMD5WYWx1ZSAwPC9zb2FwZW52OlJlZmVyZW5jZTA+Ci0gICAgICAgIDxzb2FwZW52OlJlZmVyZW5jZTI+VmFsdWUgMjAwPC9zb2FwZW52OlJlZmVyZW5jZTI+Ci0gICAgICAgIDxzb2FwZW52OlJlZmVyZW5jZTM+VmFsdWUgMzAwPC9zb2FwZW52OlJlZmVyZW5jZTM+Ci0gICAgICAgIDx3c2E6U2VydmljZU5hbWUgd3NhOlBvcnROYW1lPSJwb3J0Ij5zZXJ2aWNlTlM6U2VydmljZTwvd3NhOlNlcnZpY2VOYW1lPgotICAgICAgICA8d3NhOlBvcnRUeXBlPnBvcnROUzpQb3J0PC93c2E6UG9ydFR5cGU+Ci0gICAgICAgIDx3c2E6RnJvbT4KLSAgICAgICAgICAgIDx3c2E6QWRkcmVzcz5odHRwOi8vd3d3LmZyb20ub3JnL3NlcnZpY2UvPC93c2E6QWRkcmVzcz4KLSAgICAgICAgPC93c2E6RnJvbT4KLSAgICA8L3NvYXBlbnY6SGVhZGVyPgotICAgIDxzb2FwZW52OkJvZHk+PC9zb2FwZW52OkJvZHk+Ci08L3NvYXBlbnY6RW52ZWxvcGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL3dzZGwvU3dhVGVzdC53c2RsIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL3dzZGwvU3dhVGVzdC53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzUzYWM3Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy93c2RsL1N3YVRlc3Qud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGRlZmluaXRpb25zIG5hbWU9IlBpbmciCi0gICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8veG1sc29hcC5vcmcvUGluZyIKLSAgICB4bWxuczp0bnM9Imh0dHA6Ly94bWxzb2FwLm9yZy9QaW5nIgotICAgIHhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIKLSAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgIHhtbG5zOm1pbWU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvbWltZS8iCi0gICAgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyI+Ci0gIDx0eXBlcz4KLSAgICA8c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3htbHNvYXAub3JnL1BpbmciCi0gICAgICAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPgotICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9InBpbmciPgotICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgPGVsZW1lbnQgbmFtZT0idGV4dCIgdHlwZT0ieHNkOnN0cmluZyIgbmlsbGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgICA8Y29tcGxleFR5cGUgbmFtZT0icGluZ1Jlc3BvbnNlIj4KLSAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgIDxlbGVtZW50IG5hbWU9InRleHQiIHR5cGU9InhzZDpzdHJpbmciIG5pbGxhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgICAgPGVsZW1lbnQgbmFtZT0iUGluZyIgdHlwZT0idG5zOnBpbmciLz4KLSAgICAgIDxlbGVtZW50IG5hbWU9IlBpbmdSZXNwb25zZSIgdHlwZT0idG5zOnBpbmdSZXNwb25zZSIvPgotICAgIDwvc2NoZW1hPgotICA8L3R5cGVzPgotCi0gIDxtZXNzYWdlIG5hbWU9IlBpbmdSZXF1ZXN0Ij4KLSAgICA8cGFydCBuYW1lPSJwaW5nIiBlbGVtZW50PSJ0bnM6UGluZyIvPgotICAgIDxwYXJ0IG5hbWU9ImF0dGFjaDEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8cGFydCBuYW1lPSJhdHRhY2gyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwvbWVzc2FnZT4KLQotICA8bWVzc2FnZSBuYW1lPSJQaW5nUmVzcG9uc2UiPgotICAgIDxwYXJ0IG5hbWU9InBpbmdSZXNwb25zZSIgZWxlbWVudD0idG5zOlBpbmdSZXNwb25zZSIvPgotICA8L21lc3NhZ2U+Ci0KLSAgPHBvcnRUeXBlIG5hbWU9IlBpbmdQb3J0Ij4KLSAgICA8b3BlcmF0aW9uIG5hbWU9IlBpbmciPgotICAgICAgPGlucHV0ICBtZXNzYWdlPSJ0bnM6UGluZ1JlcXVlc3QiLz4KLSAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOlBpbmdSZXNwb25zZSIvPgotICAgIDwvb3BlcmF0aW9uPgotICA8L3BvcnRUeXBlPgotCi0gIDxiaW5kaW5nIG5hbWU9IlBpbmdCaW5kaW5nIiB0eXBlPSJ0bnM6UGluZ1BvcnQiPgotICAgIDxzb2FwOmJpbmRpbmcgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiIHN0eWxlPSJkb2N1bWVudCIvPgotICAgIDxvcGVyYXRpb24gbmFtZT0iUGluZyI+Ci0gICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+Ci0gICAgICA8aW5wdXQ+IAotICAgICAgICAgIDxtaW1lOm11bHRpcGFydFJlbGF0ZWQ+Ci0gICAgICAgICAgICA8bWltZTpwYXJ0PgotICAgICAgICAgICAgICA8c29hcDpib2R5IHBhcnRzPSJwaW5nIiB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvbWltZTpwYXJ0PgotICAgICAgICAgICAgPG1pbWU6cGFydD4KLSAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCBwYXJ0PSJhdHRhY2gxIiB0eXBlPSJ0ZXh0L3BsYWluIi8+Ci0gICAgICAgICAgICA8L21pbWU6cGFydD4KLSAgICAgICAgICAgIDxtaW1lOnBhcnQ+Ci0gICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgcGFydD0iYXR0YWNoMiIgdHlwZT0idGV4dC9wbGFpbiIvPgotICAgICAgICAgICAgPC9taW1lOnBhcnQ+Ci0gICAgICAgICAgPC9taW1lOm11bHRpcGFydFJlbGF0ZWQ+Ci0gICAgICAgIDwvaW5wdXQ+Ci0gICAgICA8b3V0cHV0PgotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgPC9vdXRwdXQ+Ci0gICAgPC9vcGVyYXRpb24+Ci0gICA8L2JpbmRpbmc+Ci0KLSAgPHNlcnZpY2UgbmFtZT0iUGluZ1NlcnZpY2UiPgotICAgIDxwb3J0IG5hbWU9IlBpbmdQb3J0IiBiaW5kaW5nPSJ0bnM6UGluZ0JpbmRpbmciPgotICAgIDxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9heGlzMi9zZXJ2aWNlcy9QaW5nU2VydmljZSIvPgotICAgIDwvcG9ydD4KLSAgPC9zZXJ2aWNlPgotCi08L2RlZmluaXRpb25zPgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL3dzZGwvYWN0aW9uVGVzdHMud3NkbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy93c2RsL2FjdGlvblRlc3RzLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1OTg3OTIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL3dzZGwvYWN0aW9uVGVzdHMud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTx3c2RsOmRlZmluaXRpb25zIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iCi0JeG1sbnM6dG5zPSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi9hY3Rpb250ZXN0LyIKLQl4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIKLQl4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJhY3Rpb25UZXN0cyIKLQl4bWxuczp3c2F3PSJodHRwOi8vd3d3LnczLm9yZy8yMDA2LzA1L2FkZHJlc3Npbmcvd3NkbCIKLQl0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL2FjdGlvbnRlc3QvIj4KLQk8d3NkbDp0eXBlcz4KLQk8L3dzZGw6dHlwZXM+Ci0JPHdzZGw6bWVzc2FnZSBuYW1lPSJlY2hvUmVzcG9uc2UiPgotCQk8d3NkbDpwYXJ0IG5hbWU9ImVjaG9SZXNwb25zZSIgdHlwZT0ieHNkOnN0cmluZyI+PC93c2RsOnBhcnQ+Ci0JPC93c2RsOm1lc3NhZ2U+Ci0JPHdzZGw6bWVzc2FnZSBuYW1lPSJlY2hvUmVxdWVzdCI+Ci0JCTx3c2RsOnBhcnQgbmFtZT0iZWNob1JlcXVlc3QiIHR5cGU9InhzZDpzdHJpbmciPjwvd3NkbDpwYXJ0PgotCTwvd3NkbDptZXNzYWdlPgotCTx3c2RsOm1lc3NhZ2UgbmFtZT0iZWNob1Jlc3BvbnNlMSI+Ci0JCTx3c2RsOnBhcnQgbmFtZT0iZWNob1Jlc3BvbnNlMSIgdHlwZT0ieHNkOnN0cmluZyI+PC93c2RsOnBhcnQ+Ci0JPC93c2RsOm1lc3NhZ2U+Ci0JPHdzZGw6bWVzc2FnZSBuYW1lPSJlY2hvUmVxdWVzdDEiPgotCQk8d3NkbDpwYXJ0IG5hbWU9ImVjaG9SZXF1ZXN0MSIgdHlwZT0ieHNkOnN0cmluZyI+PC93c2RsOnBhcnQ+Ci0JPC93c2RsOm1lc3NhZ2U+Ci0JPHdzZGw6bWVzc2FnZSBuYW1lPSJlY2hvZWNob0ZhdWx0Ij4KLQkJPHdzZGw6cGFydCBuYW1lPSJlY2hvZWNob0ZhdWx0IiB0eXBlPSJ4c2Q6c3RyaW5nIj48L3dzZGw6cGFydD4KLQk8L3dzZGw6bWVzc2FnZT4KLQk8d3NkbDptZXNzYWdlIG5hbWU9ImVjaG9lY2hvRmF1bHQxIj4KLQkJPHdzZGw6cGFydCBuYW1lPSJlY2hvZWNob0ZhdWx0MSIgdHlwZT0ieHNkOnN0cmluZyI+PC93c2RsOnBhcnQ+Ci0JPC93c2RsOm1lc3NhZ2U+Ci0JPHdzZGw6bWVzc2FnZSBuYW1lPSJlY2hvUmVzcG9uc2UyIj4KLQkJPHdzZGw6cGFydCBuYW1lPSJlY2hvUmVzcG9uc2UyIiB0eXBlPSJ4c2Q6c3RyaW5nIj48L3dzZGw6cGFydD4KLQk8L3dzZGw6bWVzc2FnZT4KLQk8d3NkbDptZXNzYWdlIG5hbWU9ImVjaG9SZXF1ZXN0MiI+Ci0JCTx3c2RsOnBhcnQgbmFtZT0iZWNob1JlcXVlc3QyIiB0eXBlPSJ4c2Q6c3RyaW5nIj48L3dzZGw6cGFydD4KLQk8L3dzZGw6bWVzc2FnZT4KLQk8d3NkbDptZXNzYWdlIG5hbWU9ImVjaG9lY2hvRmF1bHQyIj4KLQkJPHdzZGw6cGFydCBuYW1lPSJlY2hvZWNob0ZhdWx0MiIgdHlwZT0ieHNkOnN0cmluZyI+PC93c2RsOnBhcnQ+Ci0JPC93c2RsOm1lc3NhZ2U+Ci0JPHdzZGw6bWVzc2FnZSBuYW1lPSJlY2hvUmVzcG9uc2UzIj4KLQkJPHdzZGw6cGFydCBuYW1lPSJlY2hvUmVzcG9uc2UzIiB0eXBlPSJ4c2Q6c3RyaW5nIj48L3dzZGw6cGFydD4KLQk8L3dzZGw6bWVzc2FnZT4KLQk8d3NkbDptZXNzYWdlIG5hbWU9ImVjaG9SZXF1ZXN0MyI+Ci0JCTx3c2RsOnBhcnQgbmFtZT0iZWNob1JlcXVlc3QzIiB0eXBlPSJ4c2Q6c3RyaW5nIj48L3dzZGw6cGFydD4KLQk8L3dzZGw6bWVzc2FnZT4KLQk8d3NkbDptZXNzYWdlIG5hbWU9ImVjaG9lY2hvRmF1bHQzIj4KLQkJPHdzZGw6cGFydCBuYW1lPSJlY2hvZWNob0ZhdWx0MyIgdHlwZT0ieHNkOnN0cmluZyI+PC93c2RsOnBhcnQ+Ci0JPC93c2RsOm1lc3NhZ2U+Ci0JPHdzZGw6cG9ydFR5cGUgbmFtZT0id2l0aG91dFdTQVdBY3Rpb24iPgotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iZWNobyI+Ci0JCQk8d3NkbDppbnB1dCBtZXNzYWdlPSJ0bnM6ZWNob1JlcXVlc3QiIG5hbWU9Ik5hbWVkSW5wdXQiPjwvd3NkbDppbnB1dD4KLQkJCTx3c2RsOm91dHB1dCBtZXNzYWdlPSJ0bnM6ZWNob1Jlc3BvbnNlIiBuYW1lPSJOYW1lZE91dHB1dCI+PC93c2RsOm91dHB1dD4KLQkJCTx3c2RsOmZhdWx0IG5hbWU9ImVjaG9GYXVsdCIgbWVzc2FnZT0idG5zOmVjaG9lY2hvRmF1bHQiPjwvd3NkbDpmYXVsdD4KLQkJPC93c2RsOm9wZXJhdGlvbj4KLQk8L3dzZGw6cG9ydFR5cGU+Ci0JPHdzZGw6cG9ydFR5cGUgbmFtZT0id2l0aFdTQVdBY3Rpb24iPgotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iZWNobyI+Ci0JCQk8d3NkbDppbnB1dCBtZXNzYWdlPSJ0bnM6ZWNob1JlcXVlc3QxIiB3c2F3OkFjdGlvbj0iaHR0cDovL2V4YW1wbGUub3JnL2FjdGlvbi9lY2hvSW4iPjwvd3NkbDppbnB1dD4KLQkJCTx3c2RsOm91dHB1dCBtZXNzYWdlPSJ0bnM6ZWNob1Jlc3BvbnNlMSIgd3NhdzpBY3Rpb249Imh0dHA6Ly9leGFtcGxlLm9yZy9hY3Rpb24vZWNob091dCI+PC93c2RsOm91dHB1dD4KLQkJCTx3c2RsOmZhdWx0IG5hbWU9ImVjaG9GYXVsdCIgbWVzc2FnZT0idG5zOmVjaG9lY2hvRmF1bHQxIiB3c2F3OkFjdGlvbj0iaHR0cDovL2V4YW1wbGUub3JnL2FjdGlvbi9lY2hvRmF1bHQiPjwvd3NkbDpmYXVsdD4KLQkJPC93c2RsOm9wZXJhdGlvbj4KLQk8L3dzZGw6cG9ydFR5cGU+Ci0JPHdzZGw6cG9ydFR5cGUgbmFtZT0id2l0aG91dFdTQVdBY3Rpb25Ob05hbWUiPgotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iZWNobyI+Ci0JCQk8d3NkbDppbnB1dCBtZXNzYWdlPSJ0bnM6ZWNob1JlcXVlc3QyIj48L3dzZGw6aW5wdXQ+Ci0JCQk8d3NkbDpvdXRwdXQgbWVzc2FnZT0idG5zOmVjaG9SZXNwb25zZTIiPjwvd3NkbDpvdXRwdXQ+Ci0JCQk8d3NkbDpmYXVsdCBuYW1lPSJlY2hvRmF1bHQiIG1lc3NhZ2U9InRuczplY2hvZWNob0ZhdWx0MiI+PC93c2RsOmZhdWx0PgotCQk8L3dzZGw6b3BlcmF0aW9uPgotCTwvd3NkbDpwb3J0VHlwZT4KLQk8d3NkbDpwb3J0VHlwZSBuYW1lPSJ3aXRoU09BUEFjdGlvbiI+Ci0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJlY2hvIj4KLQkJCTx3c2RsOmlucHV0IG1lc3NhZ2U9InRuczplY2hvUmVxdWVzdDMiPjwvd3NkbDppbnB1dD4KLQkJCTx3c2RsOm91dHB1dCBtZXNzYWdlPSJ0bnM6ZWNob1Jlc3BvbnNlMyI+PC93c2RsOm91dHB1dD4KLQkJCTx3c2RsOmZhdWx0IG5hbWU9ImVjaG9GYXVsdCIgbWVzc2FnZT0idG5zOmVjaG9lY2hvRmF1bHQzIj48L3dzZGw6ZmF1bHQ+Ci0JCTwvd3NkbDpvcGVyYXRpb24+Ci0JPC93c2RsOnBvcnRUeXBlPgotCTx3c2RsOmJpbmRpbmcgbmFtZT0id2l0aG91dFdTQVdBY3Rpb25CaW5kaW5nIgotCQl0eXBlPSJ0bnM6d2l0aG91dFdTQVdBY3Rpb24iPgotCQk8c29hcDpiaW5kaW5nIHN0eWxlPSJkb2N1bWVudCIKLQkJCXRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIiAvPgotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iZWNobyI+Ci0JCQk8c29hcDpvcGVyYXRpb24KLQkJCQlzb2FwQWN0aW9uPSIiIC8+Ci0JCQk8d3NkbDppbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvd3NkbDppbnB1dD4KLQkJCTx3c2RsOm91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvd3NkbDpvdXRwdXQ+Ci0JCQk8d3NkbDpmYXVsdCBuYW1lPSJlY2hvRmF1bHQiPgotCQkJCTxzb2FwOmZhdWx0IG5hbWU9ImVjaG9GYXVsdCIgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC93c2RsOmZhdWx0PgotCQk8L3dzZGw6b3BlcmF0aW9uPgotCTwvd3NkbDpiaW5kaW5nPgotCTx3c2RsOmJpbmRpbmcgbmFtZT0id2l0aFdTQVdBY3Rpb25CaW5kaW5nIgotCQl0eXBlPSJ0bnM6d2l0aFdTQVdBY3Rpb24iPgotCQk8c29hcDpiaW5kaW5nIHN0eWxlPSJkb2N1bWVudCIKLQkJCXRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIiAvPgotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iZWNobyI+Ci0JCQk8c29hcDpvcGVyYXRpb24KLQkJCQlzb2FwQWN0aW9uPSIiIC8+Ci0JCQk8d3NkbDppbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvd3NkbDppbnB1dD4KLQkJCTx3c2RsOm91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvd3NkbDpvdXRwdXQ+Ci0JCQk8d3NkbDpmYXVsdCBuYW1lPSJlY2hvRmF1bHQiPgotCQkJCTxzb2FwOmZhdWx0IG5hbWU9ImVjaG9GYXVsdCIgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC93c2RsOmZhdWx0PgotCQk8L3dzZGw6b3BlcmF0aW9uPgotCTwvd3NkbDpiaW5kaW5nPgotCTx3c2RsOmJpbmRpbmcgbmFtZT0id2l0aG91dFdTQVdBY3Rpb25Ob05hbWVCaW5kaW5nIgotCQl0eXBlPSJ0bnM6d2l0aG91dFdTQVdBY3Rpb25Ob05hbWUiPgotCQk8c29hcDpiaW5kaW5nIHN0eWxlPSJkb2N1bWVudCIKLQkJCXRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIiAvPgotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iZWNobyI+Ci0JCQk8c29hcDpvcGVyYXRpb24KLQkJCQlzb2FwQWN0aW9uPSIiIC8+Ci0JCQk8d3NkbDppbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvd3NkbDppbnB1dD4KLQkJCTx3c2RsOm91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvd3NkbDpvdXRwdXQ+Ci0JCQk8d3NkbDpmYXVsdCBuYW1lPSJlY2hvRmF1bHQiPgotCQkJCTxzb2FwOmZhdWx0IG5hbWU9ImVjaG9GYXVsdCIgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC93c2RsOmZhdWx0PgotCQk8L3dzZGw6b3BlcmF0aW9uPgotCTwvd3NkbDpiaW5kaW5nPgotCTx3c2RsOmJpbmRpbmcgbmFtZT0id2l0aFNPQVBBY3Rpb25CaW5kaW5nIgotCQl0eXBlPSJ0bnM6d2l0aFNPQVBBY3Rpb24iPgotCQk8c29hcDpiaW5kaW5nIHN0eWxlPSJkb2N1bWVudCIKLQkJCXRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIiAvPgotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iZWNobyI+Ci0JCQk8c29hcDpvcGVyYXRpb24KLQkJCQlzb2FwQWN0aW9uPSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi9hY3Rpb250ZXN0L2VjaG8iIC8+Ci0JCQk8d3NkbDppbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvd3NkbDppbnB1dD4KLQkJCTx3c2RsOm91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvd3NkbDpvdXRwdXQ+Ci0JCQk8d3NkbDpmYXVsdCBuYW1lPSJlY2hvRmF1bHQiPgotCQkJCTxzb2FwOmZhdWx0IG5hbWU9ImVjaG9GYXVsdCIgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC93c2RsOmZhdWx0PgotCQk8L3dzZGw6b3BlcmF0aW9uPgotCTwvd3NkbDpiaW5kaW5nPgotCTx3c2RsOnNlcnZpY2UgbmFtZT0iYWN0aW9uVGVzdHMiPgotCQk8d3NkbDpwb3J0IGJpbmRpbmc9InRuczp3aXRoU09BUEFjdGlvbkJpbmRpbmciCi0JCQluYW1lPSJhY3Rpb25UZXN0c1NPQVAiPgotCQkJPHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL3RlbXB1cmkub3JnIiAvPgotCQk8L3dzZGw6cG9ydD4KLQk8L3dzZGw6c2VydmljZT4KLTwvd3NkbDpkZWZpbml0aW9ucz4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy93c2RsL3Rlc3QxLndzZGwgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvd3NkbC90ZXN0MS53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjFhYTg5Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy93c2RsL3Rlc3QxLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTwhLS0gV1NETCBkZXNjcmlwdGlvbiBvZiB0aGUgV1NTIFBpbmcgaW50ZXJvcCBzY2VuYXJpb3MgLS0+Ci0KLTxkZWZpbml0aW9ucyBuYW1lPSJFY2hvIgotICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvdGVzdHMiCi0gICAgeG1sbnM6d3N1PSJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c3MvMjAwNC8wMS9vYXNpcy0yMDA0MDEtd3NzLXdzc2VjdXJpdHktdXRpbGl0eS0xLjAueHNkIiAKLSAgICB4bWxuczp0bnM9Imh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL3Rlc3RzIgotICAgIHhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIKLSAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iCi0gICAgeG1sbnM6d3NwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA5L3BvbGljeSIKLSAgICB4bWxuczp3c2E9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDgvYWRkcmVzc2luZyIKLSAgICB4bWxuczppbnRmPSJodHRwOi8vd3MtcG9saWN5LnRlc3RzIj4KLSAgICAJICAKLSAgPHR5cGVzPgotICAgIDxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8veG1sc29hcC5vcmcvRWNobyIKLSAgICAgICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+Ci0gICAgICA8Y29tcGxleFR5cGUgbmFtZT0iZWNobyI+Ci0gICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ0ZXh0IiB0eXBlPSJ4c2Q6c3RyaW5nIiBuaWxsYWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICAgIDxjb21wbGV4VHlwZSBuYW1lPSJlY2hvUmVzcG9uc2UiPgotICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgPGVsZW1lbnQgbmFtZT0idGV4dCIgdHlwZT0ieHNkOnN0cmluZyIgbmlsbGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJFY2hvIiB0eXBlPSJ0bnM6ZWNobyIvPgotICAgICAgPGVsZW1lbnQgbmFtZT0iRWNob1Jlc3BvbnNlIiB0eXBlPSJ0bnM6ZWNob1Jlc3BvbnNlIi8+Ci0gICAgPC9zY2hlbWE+Ci0gIDwvdHlwZXM+Ci0KLSAgPG1lc3NhZ2UgbmFtZT0iRWNob1JlcXVlc3QiPgotICAgIDxwYXJ0IG5hbWU9ImVjaG8iIGVsZW1lbnQ9InRuczpFY2hvIi8+Ci0gIDwvbWVzc2FnZT4KLQotICA8bWVzc2FnZSBuYW1lPSJFY2hvUmVzcG9uc2UiPgotICAgIDxwYXJ0IG5hbWU9ImVjaG9SZXNwb25zZSIgZWxlbWVudD0idG5zOkVjaG9SZXNwb25zZSIvPgotICA8L21lc3NhZ2U+Ci0KLSAgPHBvcnRUeXBlIG5hbWU9IkVjaG9Qb3J0Ij4KLSAgICA8b3BlcmF0aW9uIG5hbWU9IkVjaG8iPgotICAgICAgPGlucHV0ICBtZXNzYWdlPSJ0bnM6RWNob1JlcXVlc3QiIHdzYTpBY3Rpb249Imh0dHA6Ly90ZXN0cy5vcmcvZWNoby9pbiIgLz4KLSAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOkVjaG9SZXNwb25zZSIgd3NhOkFjdGlvbj0iaHR0cDovL3Rlc3RzLm9yZy9lY2hvL291dCIgLz4KLSAgICA8L29wZXJhdGlvbj4KLSAgPC9wb3J0VHlwZT4KLQotICA8YmluZGluZyBuYW1lPSJFY2hvQmluZGluZyIgdHlwZT0idG5zOkVjaG9Qb3J0Ij4KLSAgICA8c29hcDpiaW5kaW5nIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIgotc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgPG9wZXJhdGlvbiBuYW1lPSJFY2hvIj4KLSAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi90ZXN0cy9lY2hvIi8+Ci0gICAgICA8aW5wdXQ+IAotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgPC9pbnB1dD4KLSAgICAgIDxvdXRwdXQ+Ci0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICA8L291dHB1dD4KLSAgICA8L29wZXJhdGlvbj4KLSAgPC9iaW5kaW5nPgotICAgCi0gIDxzZXJ2aWNlIG5hbWU9IkVjaG9TZXJ2aWNlIj4KLSAgICA8cG9ydCBuYW1lPSJFY2hvUG9ydCIgYmluZGluZz0idG5zOkVjaG9CaW5kaW5nIj4KLSAgICAgIDxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9heGlzMi9zZXJ2aWNlcy9FY2hvU2VydmljZSIvPgotICAgIDwvcG9ydD4KLSAgPC9zZXJ2aWNlPgotCi08L2RlZmluaXRpb25zPgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL3dzZGwvdGVzdDIud3NkbCBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy93c2RsL3Rlc3QyLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzOGQyNmUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL3dzZGwvdGVzdDIud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTwhLS0gV1NETCBkZXNjcmlwdGlvbiBvZiB0aGUgV1NTIFBpbmcgaW50ZXJvcCBzY2VuYXJpb3MgLS0+Ci0KLTxkZWZpbml0aW9ucyBuYW1lPSJFY2hvIgotICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvdGVzdHMiCi0gICAgeG1sbnM6d3N1PSJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c3MvMjAwNC8wMS9vYXNpcy0yMDA0MDEtd3NzLXdzc2VjdXJpdHktdXRpbGl0eS0xLjAueHNkIiAKLSAgICB4bWxuczp0bnM9Imh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL3Rlc3RzIgotICAgIHhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIKLSAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iCi0gICAgeG1sbnM6d3NwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA5L3BvbGljeSIKLSAgICB4bWxuczp3c2E9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDgvYWRkcmVzc2luZyIKLSAgICB4bWxuczppbnRmPSJodHRwOi8vd3MtcG9saWN5LnRlc3RzIj4KLSAgICAKLSAgPHdzcDpQb2xpY3kgd3N1OklkPSJNZXNzYWdlMS0yIj4KLSAgICA8aW50ZjpNZXNzYWdlUG9saWN5VGVzdEFzc2VydGlvbjIgbWFya2VyPSI2IiAvPgotICA8L3dzcDpQb2xpY3k+Ci0gICAgCi0gIDx3c3A6UG9saWN5IHdzdTpJZD0iT3BlcmF0aW9uMS0yIj4KLQk8aW50ZjpPcGVyYXRpb25Qb2xpY3lUZXN0QXNzZXJ0aW9uMiBtYXJrZXI9IjYiIC8+Ci0gIDwvd3NwOlBvbGljeT4KLQkKLSAgPHdzcDpQb2xpY3kgd3N1OklkPSJFbmRwb2ludDEtMiI+Ci0gICAgPGludGY6RW5kcG9pbnRQb2xpY3lUZXN0QXNzZXJ0aW9uMiBtYXJrZXI9IjciIC8+Ci0gIDwvd3NwOlBvbGljeT4KLQkgIAotICA8dHlwZXM+Ci0gICAgPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly94bWxzb2FwLm9yZy9FY2hvIgotICAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4KLSAgICAgIDxjb21wbGV4VHlwZSBuYW1lPSJlY2hvIj4KLSAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgIDxlbGVtZW50IG5hbWU9InRleHQiIHR5cGU9InhzZDpzdHJpbmciIG5pbGxhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9ImVjaG9SZXNwb25zZSI+Ci0gICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ0ZXh0IiB0eXBlPSJ4c2Q6c3RyaW5nIiBuaWxsYWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICAgIDxlbGVtZW50IG5hbWU9IkVjaG8iIHR5cGU9InRuczplY2hvIi8+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJFY2hvUmVzcG9uc2UiIHR5cGU9InRuczplY2hvUmVzcG9uc2UiLz4KLSAgICA8L3NjaGVtYT4KLSAgPC90eXBlcz4KLQotICA8bWVzc2FnZSBuYW1lPSJFY2hvUmVxdWVzdCI+Ci0gICAgPHBhcnQgbmFtZT0iZWNobyIgZWxlbWVudD0idG5zOkVjaG8iLz4KLSAgPC9tZXNzYWdlPgotCi0gIDxtZXNzYWdlIG5hbWU9IkVjaG9SZXNwb25zZSI+Ci0gICAgPHBhcnQgbmFtZT0iZWNob1Jlc3BvbnNlIiBlbGVtZW50PSJ0bnM6RWNob1Jlc3BvbnNlIi8+Ci0gIDwvbWVzc2FnZT4KLQotICA8cG9ydFR5cGUgbmFtZT0iRWNob1BvcnQiIHdzcDpQb2xpY3lVUklzPSIjRW5kcG9pbnQxLTIiPgotICAgIDxvcGVyYXRpb24gbmFtZT0iRWNobyI+Ci0gICAgICA8d3NwOlBvbGljeVJlZmVyZW5jZSBVUkk9IiNPcGVyYXRpb24xLTIiLz4KLSAgICAgIDxpbnB1dCAgbWVzc2FnZT0idG5zOkVjaG9SZXF1ZXN0IiB3c3A6UG9saWN5VVJJcz0iI01lc3NhZ2UxLTIiIHdzYTpBY3Rpb249Imh0dHA6Ly90ZXN0cy5vcmcvZWNoby9pbiIvPgotICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6RWNob1Jlc3BvbnNlIiB3c3A6UG9saWN5VVJJcz0iI01lc3NhZ2UxLTIiIHdzYTpBY3Rpb249Imh0dHA6Ly90ZXN0cy5vcmcvZWNoby9vdXQiIC8+Ci0gICAgPC9vcGVyYXRpb24+Ci0gIDwvcG9ydFR5cGU+Ci0KLSAgPGJpbmRpbmcgbmFtZT0iRWNob0JpbmRpbmciIHR5cGU9InRuczpFY2hvUG9ydCI+Ci0gICAgPHdzcDpQb2xpY3kgd3N1OklkPSJFbmRwb2ludDIiPgotCSAgPGludGY6RW5kcG9pbnRQb2xpY3lUZXN0QXNzZXJ0aW9uMSBtYXJrZXI9IjYiIC8+Ci0gICAgPC93c3A6UG9saWN5PgotICAgIDxzb2FwOmJpbmRpbmcgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiCi1zdHlsZT0iZG9jdW1lbnQiLz4KLSAgICA8b3BlcmF0aW9uIG5hbWU9IkVjaG8iPgotICAgICAgPHdzcDpQb2xpY3k+Ci0gICAgICAgIDxpbnRmOk9wZXJhdGlvblBvbGljeVRlc3RBc3NlcnRpb24yIG1hcmtlcj0iMyIgLz4KLSAgICAgIDwvd3NwOlBvbGljeT4gCi0gICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvdGVzdHMvZWNobyIvPgotICAgICAgPGlucHV0PiAKLSAgICAgICAgPHdzcDpQb2xpY3k+Ci0gICAgICAgICAgPGludGY6TWVzc2FnZVBvbGljeVRlc3RBc3NlcnRpb24xIG1hcmtlcj0iMiIgLz4KLQkJPC93c3A6UG9saWN5PgotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgPC9pbnB1dD4KLSAgICAgIDxvdXRwdXQ+Ci0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgIDx3c3A6UG9saWN5PgotICAgICAgICAgIDxpbnRmOk1lc3NhZ2VQb2xpY3lUZXN0QXNzZXJ0aW9uMSBtYXJrZXI9IjEiIC8+Ci0JCTwvd3NwOlBvbGljeT4KLSAgICAgIDwvb3V0cHV0PgotICAgIDwvb3BlcmF0aW9uPgotICA8L2JpbmRpbmc+Ci0gICAKLSAgPHNlcnZpY2UgbmFtZT0iRWNob1NlcnZpY2UiPgotICAgIDx3c3A6UG9saWN5PgotCSAgPGludGY6U2VydmljZVBvbGljeVRlc3RBc3NlcnRpb24xIG1hcmtlcj0iNSIgLz4KLQk8L3dzcDpQb2xpY3k+Ci0gICAgPHBvcnQgbmFtZT0iRWNob1BvcnQiIGJpbmRpbmc9InRuczpFY2hvQmluZGluZyI+Ci0gICAgICA8d3NwOlBvbGljeT4KLQkgICAgPGludGY6RW5kcG9pbnRQb2xpY3lUZXN0QXNzZXJ0aW9uMSBtYXJrZXI9IjQiIC8+Ci0JICA8L3dzcDpQb2xpY3k+Ci0gICAgICA8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjgwODAvYXhpczIvc2VydmljZXMvRWNob1NlcnZpY2UiLz4KLSAgICA8L3BvcnQ+Ci0gIDwvc2VydmljZT4KLQotPC9kZWZpbml0aW9ucz4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvQWJzdHJhY3RUZXN0Q2FzZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9BYnN0cmFjdFRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzOGNkMzguLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9BYnN0cmFjdFRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczI7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLS8qKgotICogQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgdGVzdCBjYXNlcy4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VGVzdENhc2UKLSAgICAgICAgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgcHJvdGVjdGVkIFN0cmluZyB0ZXN0RGlyID0gInRlc3QiICsgRmlsZS5zZXBhcmF0b3I7Ci0gICAgcHJvdGVjdGVkIFN0cmluZyBzYW1wbGVEaXIgPSAic2FtcGxlcyIgKyBGaWxlLnNlcGFyYXRvcjsKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIG91dERpciA9ICJ0YXJnZXQiICsgRmlsZS5zZXBhcmF0b3IgKyAiZ2VuZXJhdGVkIiArCi0gICAgICAgICAgICBGaWxlLnNlcGFyYXRvciArCi0gICAgICAgICAgICAic2FtcGxlcyIgKwotICAgICAgICAgICAgRmlsZS5zZXBhcmF0b3I7Ci0gICAgcHJvdGVjdGVkIFN0cmluZyB0ZW1wRGlyID0gInRhcmdldCIgKyBGaWxlLnNlcGFyYXRvciArICJnZW5lcmF0ZWQiICsKLSAgICAgICAgICAgIEZpbGUuc2VwYXJhdG9yICsKLSAgICAgICAgICAgICJ0ZW1wIjsKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHRlc3RSZXNvdXJjZURpciA9ICJ0ZXN0LXJlc291cmNlcyI7Ci0KLQotICAgIC8qKgotICAgICAqIEJhc2VkaXIgZm9yIGFsbCBmaWxlIEkvTy4gSW1wb3J0YW50IHdoZW4gcnVubmluZyB0ZXN0cyBmcm9tCi0gICAgICogdGhlIHJlYWN0b3IuICBOb3RlIHRoYXQgYW55b25lIGNhbiB1c2UgdGhpcyBzdGF0aWNhbGx5LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGJhc2VkaXI7Ci0KLSAgICBzdGF0aWMgewotICAgICAgICBiYXNlZGlyID0gU3lzdGVtLmdldFByb3BlcnR5KCJiYXNlZGlyIik7Ci0gICAgICAgIGlmIChiYXNlZGlyID09IG51bGwpIHsKLSAgICAgICAgICAgIGJhc2VkaXIgPSBuZXcgRmlsZSgiLiIpLmdldEFic29sdXRlUGF0aCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHRlc3ROYW1lCi0gICAgICovCi0gICAgcHVibGljIEFic3RyYWN0VGVzdENhc2UoU3RyaW5nIHRlc3ROYW1lKSB7Ci0gICAgICAgIHN1cGVyKHRlc3ROYW1lKTsKLSAgICAgICAgdGVzdERpciA9IG5ldyBGaWxlKGJhc2VkaXIsIHRlc3REaXIpLmdldEFic29sdXRlUGF0aCgpOwotICAgICAgICBzYW1wbGVEaXIgPSBuZXcgRmlsZShiYXNlZGlyLCBzYW1wbGVEaXIpLmdldEFic29sdXRlUGF0aCgpOwotICAgICAgICBvdXREaXIgPSBuZXcgRmlsZShiYXNlZGlyLCBvdXREaXIpLmdldEFic29sdXRlUGF0aCgpOwotICAgICAgICB0ZW1wRGlyID0gbmV3IEZpbGUoYmFzZWRpciwgdGVtcERpcikuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgRmlsZSBnZXRUZXN0UmVzb3VyY2VGaWxlKFN0cmluZyByZWxhdGl2ZVBhdGgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBGaWxlKHRlc3RSZXNvdXJjZURpciwgcmVsYXRpdmVQYXRoKTsKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvRWNobzIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvRWNobzIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTBlMDg4YS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL0VjaG8yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlOwotCi1wdWJsaWMgY2xhc3MgRWNobzIgewotICAgIHB1YmxpYyBTT0FQRW52ZWxvcGUgZWNobyhTT0FQRW52ZWxvcGUgaW4pIHsKLSAgICAgICAgcmV0dXJuIGluOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvSW5hdmFsaWRNb2R1bGVJbXBsLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL0luYXZhbGlkTW9kdWxlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2E2MWQ3Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvSW5hdmFsaWRNb2R1bGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzTW9kdWxlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIubW9kdWxlcy5Nb2R1bGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5uZWV0aGkuQXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubmVldGhpLlBvbGljeTsKLQotcHVibGljIGNsYXNzIEluYXZhbGlkTW9kdWxlSW1wbCBpbXBsZW1lbnRzIE1vZHVsZSB7Ci0gICAgLy8gaW5pdGlhbGl6ZSB0aGUgbW9kdWxlCi0gICAgcHVibGljIHZvaWQgaW5pdChDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0LCBBeGlzTW9kdWxlIG1vZHVsZSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZW5nYWdlTm90aWZ5KEF4aXNEZXNjcmlwdGlvbiBheGlzRGVzY3JpcHRpb24pIHRocm93cyBBeGlzRmF1bHQgewotICAgIH0KLQotICAgIC8vIHNodXRkb3duIHRoZSBtb2R1bGUKLSAgICBwdWJsaWMgdm9pZCBzaHV0ZG93bihDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWd1cmF0aW9uQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYXBwbHlQb2xpY3koUG9saWN5IHBvbGljeSwgQXhpc0Rlc2NyaXB0aW9uIGF4aXNEZXNjcmlwdGlvbikgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gY2FuU3VwcG9ydEFzc2VydGlvbihBc3NlcnRpb24gYXNzZXJ0aW9uKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL01vZHVsZUhhbmRsZXIxLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL01vZHVsZUhhbmRsZXIxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1MmNiMzguLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9Nb2R1bGVIYW5kbGVyMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaGFuZGxlcnMuQWJzdHJhY3RIYW5kbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgTW9kdWxlSGFuZGxlcjEgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIgIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coTW9kdWxlSGFuZGxlcjEgLmNsYXNzKTsKLSAgICBwcml2YXRlIFN0cmluZyBtZXNzYWdlOwotICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0KLSAgICBwdWJsaWMgTW9kdWxlSGFuZGxlcjEoKSB7Ci0gICAgICAgIHRoaXMubWVzc2FnZSA9ICJpbnNpZGUgaW52YWxpZCBtb2R1bGUiOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIEludm9jYXRpb25SZXNwb25zZSBpbnZva2UoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIGxvZy5pbmZvKCJJIGFtICIgKyBtZXNzYWdlICsgIiBIYW5kbGVyIFJ1bm5pbmcgOikiKTsKLSAgICAgICAgcmV0dXJuIEludm9jYXRpb25SZXNwb25zZS5DT05USU5VRTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZXZva2UoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgewotICAgICAgICBsb2cuaW5mbygiSSBhbSAiICsgbWVzc2FnZSArICIgSGFuZGxlciBSdW5uaW5nIDopIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIH0KLQotfQotCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2FkZHJlc3NpbmcvQWRkcmVzc2luZ0ZhdWx0c1Rlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvYWRkcmVzc2luZy9BZGRyZXNzaW5nRmF1bHRzVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjgyN2U0Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvYWRkcmVzc2luZy9BZGRyZXNzaW5nRmF1bHRzVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydGlvbkZhaWxlZEVycm9yOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuQWRkcmVzc2luZ0NvbnN0YW50cy5GaW5hbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuQWRkcmVzc2luZ0NvbnN0YW50cy5TdWJtaXNzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotcHVibGljIGNsYXNzIEFkZHJlc3NpbmdGYXVsdHNUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RGYXVsdENvZGUoUU5hbWUgZ2VuZXJpY0ZhdWx0Q29kZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUU5hbWUgc3BlY2lmaWNGYXVsdENvZGUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFOYW1lIGFjdHVhbEZhdWx0Q29kZSkgeyAKLSAgICAgICAgLy8gaW4gU09BUCAxLjEgZmF1bHQgY29kZSBjYW4gYmUgYSBbU3ViY29kZV0gb3IgW1N1YnN1YmNvZGVdIAotICAgICAgICAvLyBzbyBuZWVkIHRvIGNoZWNrIGZvciBib3RoCi0gICAgICAgIGlmIChzcGVjaWZpY0ZhdWx0Q29kZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygiU3BlY2lmaWMgZmF1bHQgY29kZSIsIHNwZWNpZmljRmF1bHRDb2RlLCBhY3R1YWxGYXVsdENvZGUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEFzc2VydGlvbkZhaWxlZEVycm9yIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBmYWxsIHRocnUKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJHZW5lcmljIGZhdWx0IGNvZGUiLCBnZW5lcmljRmF1bHRDb2RlLCBhY3R1YWxGYXVsdENvZGUpOyAgICAgIAotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUZXN0IG1ldGhvZCBmb3Ige0BsaW5rIEFkZHJlc3NpbmdGYXVsdHNIZWxwZXIjdHJpZ2dlckludmFsaWRDYXJkaW5hbGl0eUZhdWx0KG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dCwKLSAgICAgKiBTdHJpbmcpfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VHJpZ2dlckludmFsaWRDYXJkaW5hbGl0eUZhdWx0KCkgewotICAgICAgICAvL0ZpbmFsIG5hbWVzcGFjZQotICAgICAgICBNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBtZXNzYWdlQ29udGV4dC5zZXRQcm9wZXJ0eShBZGRyZXNzaW5nQ29uc3RhbnRzLldTX0FERFJFU1NJTkdfVkVSU0lPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzc2luZ0NvbnN0YW50cy5GaW5hbC5XU0FfTkFNRVNQQUNFKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEFkZHJlc3NpbmdGYXVsdHNIZWxwZXIudHJpZ2dlckludmFsaWRDYXJkaW5hbGl0eUZhdWx0KG1lc3NhZ2VDb250ZXh0LCAiQWN0aW9uIik7Ci0gICAgICAgICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gZXhjZXB0aW9uIik7Ci0gICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBhZikgewotICAgICAgICAgICAgLy8gRXhwZWN0ZWQKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhGaW5hbC5GQVVMVF9JTlZBTElEX0hFQURFUl9SRUFTT04sIGFmLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICB0ZXN0RmF1bHRDb2RlKG5ldyBRTmFtZShGaW5hbC5XU0FfTkFNRVNQQUNFLCBGaW5hbC5GQVVMVF9JTlZBTElEX0hFQURFUiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBRTmFtZShGaW5hbC5XU0FfTkFNRVNQQUNFLCAiSW52YWxpZENhcmRpbmFsaXR5IiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGFmLmdldEZhdWx0Q29kZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygid3NhOkFjdGlvbiIsICgoTWFwKW1lc3NhZ2VDb250ZXh0Ci0gICAgICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eShDb25zdGFudHMuRkFVTFRfSU5GT1JNQVRJT05fRk9SX0hFQURFUlMpKS5nZXQoCi0gICAgICAgICAgICAgICAgICAgIEZpbmFsLkZBVUxUX0hFQURFUl9QUk9CX0hFQURFUl9RTkFNRSkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG1lc3NhZ2VDb250ZXh0LmdldFByb3BlcnR5KAotICAgICAgICAgICAgICAgICAgICBBZGRyZXNzaW5nQ29uc3RhbnRzLkRJU0FCTEVfQUREUkVTU0lOR19GT1JfT1VUX01FU1NBR0VTKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vU3VibWlzc2lvbiBuYW1lc3BhY2UKLSAgICAgICAgbWVzc2FnZUNvbnRleHQgPSBuZXcgTWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgbWVzc2FnZUNvbnRleHQuc2V0UHJvcGVydHkoQWRkcmVzc2luZ0NvbnN0YW50cy5XU19BRERSRVNTSU5HX1ZFUlNJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3NpbmdDb25zdGFudHMuU3VibWlzc2lvbi5XU0FfTkFNRVNQQUNFKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEFkZHJlc3NpbmdGYXVsdHNIZWxwZXIudHJpZ2dlckludmFsaWRDYXJkaW5hbGl0eUZhdWx0KG1lc3NhZ2VDb250ZXh0LCAiQWN0aW9uIik7Ci0gICAgICAgICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gZXhjZXB0aW9uIik7Ci0gICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBhZikgewotICAgICAgICAgICAgLy8gRXhwZWN0ZWQKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhTdWJtaXNzaW9uLkZBVUxUX0lOVkFMSURfSEVBREVSX1JFQVNPTiwgYWYuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhuZXcgUU5hbWUoU3VibWlzc2lvbi5XU0FfTkFNRVNQQUNFLCBTdWJtaXNzaW9uLkZBVUxUX0lOVkFMSURfSEVBREVSKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBhZi5nZXRGYXVsdENvZGUoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgbWVzc2FnZUNvbnRleHQuZ2V0UHJvcGVydHkoCi0gICAgICAgICAgICAgICAgICAgIEFkZHJlc3NpbmdDb25zdGFudHMuRElTQUJMRV9BRERSRVNTSU5HX0ZPUl9PVVRfTUVTU0FHRVMpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKiBUZXN0IG1ldGhvZCBmb3Ige0BsaW5rIEFkZHJlc3NpbmdGYXVsdHNIZWxwZXIjdHJpZ2dlckFjdGlvbk1pc21hdGNoRmF1bHQob3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0KX0uICovCi0gICAgcHVibGljIHZvaWQgdGVzdFRyaWdnZXJBY3Rpb25NaXNtYXRjaEZhdWx0KCkgewotICAgICAgICAvL0ZpbmFsIG5hbWVzcGFjZQotICAgICAgICBNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBtZXNzYWdlQ29udGV4dC5zZXRQcm9wZXJ0eShBZGRyZXNzaW5nQ29uc3RhbnRzLldTX0FERFJFU1NJTkdfVkVSU0lPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzc2luZ0NvbnN0YW50cy5GaW5hbC5XU0FfTkFNRVNQQUNFKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEFkZHJlc3NpbmdGYXVsdHNIZWxwZXIudHJpZ2dlckFjdGlvbk1pc21hdGNoRmF1bHQobWVzc2FnZUNvbnRleHQsICJzb2FwQWN0aW9uIiwgIndzYUFjdGlvbiIpOwotICAgICAgICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIGV4Y2VwdGlvbiIpOwotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgYWYpIHsKLSAgICAgICAgICAgIC8vIEV4cGVjdGVkCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoRmluYWwuRkFVTFRfSU5WQUxJRF9IRUFERVJfUkVBU09OLCBhZi5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgdGVzdEZhdWx0Q29kZShuZXcgUU5hbWUoRmluYWwuV1NBX05BTUVTUEFDRSwgRmluYWwuRkFVTFRfSU5WQUxJRF9IRUFERVIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUU5hbWUoRmluYWwuV1NBX05BTUVTUEFDRSwgIkFjdGlvbk1pc21hdGNoIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGFmLmdldEZhdWx0Q29kZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygid3NhOkFjdGlvbiIsICgoTWFwKW1lc3NhZ2VDb250ZXh0Ci0gICAgICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eShDb25zdGFudHMuRkFVTFRfSU5GT1JNQVRJT05fRk9SX0hFQURFUlMpKS5nZXQoCi0gICAgICAgICAgICAgICAgICAgIEZpbmFsLkZBVUxUX0hFQURFUl9QUk9CX0hFQURFUl9RTkFNRSkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG1lc3NhZ2VDb250ZXh0LmdldFByb3BlcnR5KAotICAgICAgICAgICAgICAgICAgICBBZGRyZXNzaW5nQ29uc3RhbnRzLkRJU0FCTEVfQUREUkVTU0lOR19GT1JfT1VUX01FU1NBR0VTKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvL1N1Ym1pc3Npb24gbmFtZXNwYWNlCi0gICAgICAgIG1lc3NhZ2VDb250ZXh0ID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIG1lc3NhZ2VDb250ZXh0LnNldFByb3BlcnR5KEFkZHJlc3NpbmdDb25zdGFudHMuV1NfQUREUkVTU0lOR19WRVJTSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzaW5nQ29uc3RhbnRzLlN1Ym1pc3Npb24uV1NBX05BTUVTUEFDRSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBBZGRyZXNzaW5nRmF1bHRzSGVscGVyLnRyaWdnZXJBY3Rpb25NaXNtYXRjaEZhdWx0KG1lc3NhZ2VDb250ZXh0LCAic29hcEFjdGlvbiIsICJ3c2FBY3Rpb24iKTsKLSAgICAgICAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBleGNlcHRpb24iKTsKLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGFmKSB7Ci0gICAgICAgICAgICAvLyBFeHBlY3RlZAotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFN1Ym1pc3Npb24uRkFVTFRfSU5WQUxJRF9IRUFERVJfUkVBU09OLCBhZi5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBRTmFtZShTdWJtaXNzaW9uLldTQV9OQU1FU1BBQ0UsIFN1Ym1pc3Npb24uRkFVTFRfSU5WQUxJRF9IRUFERVIpLAotICAgICAgICAgICAgICAgICAgICAgICAgIGFmLmdldEZhdWx0Q29kZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBtZXNzYWdlQ29udGV4dC5nZXRQcm9wZXJ0eSgKLSAgICAgICAgICAgICAgICAgICAgQWRkcmVzc2luZ0NvbnN0YW50cy5ESVNBQkxFX0FERFJFU1NJTkdfRk9SX09VVF9NRVNTQUdFUykpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCBtZXRob2QgZm9yIHtAbGluayBBZGRyZXNzaW5nRmF1bHRzSGVscGVyI3RyaWdnZXJPbmx5QW5vbnltb3VzQWRkcmVzc1N1cHBvcnRlZEZhdWx0KG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dCwKLSAgICAgKiBTdHJpbmcpfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VHJpZ2dlck9ubHlBbm9ueW1vdXNBZGRyZXNzU3VwcG9ydGVkRmF1bHQoKSB7Ci0gICAgICAgIC8vRmluYWwgbmFtZXNwYWNlCi0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0ID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIG1lc3NhZ2VDb250ZXh0LnNldFByb3BlcnR5KEFkZHJlc3NpbmdDb25zdGFudHMuV1NfQUREUkVTU0lOR19WRVJTSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzaW5nQ29uc3RhbnRzLkZpbmFsLldTQV9OQU1FU1BBQ0UpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgQWRkcmVzc2luZ0ZhdWx0c0hlbHBlcgotICAgICAgICAgICAgICAgICAgICAudHJpZ2dlck9ubHlBbm9ueW1vdXNBZGRyZXNzU3VwcG9ydGVkRmF1bHQobWVzc2FnZUNvbnRleHQsICJSZXBseVRvIik7Ci0gICAgICAgICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gZXhjZXB0aW9uIik7Ci0gICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBhZikgewotICAgICAgICAgICAgLy8gRXhwZWN0ZWQKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhGaW5hbC5GQVVMVF9JTlZBTElEX0hFQURFUl9SRUFTT04sIGFmLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICB0ZXN0RmF1bHRDb2RlKG5ldyBRTmFtZShGaW5hbC5XU0FfTkFNRVNQQUNFLCBGaW5hbC5GQVVMVF9JTlZBTElEX0hFQURFUiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBRTmFtZShGaW5hbC5XU0FfTkFNRVNQQUNFLCBGaW5hbC5GQVVMVF9PTkxZX0FOT05ZTU9VU19BRERSRVNTX1NVUFBPUlRFRCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGFmLmdldEZhdWx0Q29kZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygid3NhOlJlcGx5VG8iLCAoKE1hcCltZXNzYWdlQ29udGV4dAotICAgICAgICAgICAgICAgICAgICAuZ2V0UHJvcGVydHkoQ29uc3RhbnRzLkZBVUxUX0lORk9STUFUSU9OX0ZPUl9IRUFERVJTKSkuZ2V0KAotICAgICAgICAgICAgICAgICAgICBGaW5hbC5GQVVMVF9IRUFERVJfUFJPQl9IRUFERVJfUU5BTUUpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBtZXNzYWdlQ29udGV4dC5nZXRQcm9wZXJ0eSgKLSAgICAgICAgICAgICAgICAgICAgQWRkcmVzc2luZ0NvbnN0YW50cy5ESVNBQkxFX0FERFJFU1NJTkdfRk9SX09VVF9NRVNTQUdFUykpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy9TdWJtaXNzaW9uIG5hbWVzcGFjZQotICAgICAgICBtZXNzYWdlQ29udGV4dCA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBtZXNzYWdlQ29udGV4dC5zZXRQcm9wZXJ0eShBZGRyZXNzaW5nQ29uc3RhbnRzLldTX0FERFJFU1NJTkdfVkVSU0lPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzc2luZ0NvbnN0YW50cy5TdWJtaXNzaW9uLldTQV9OQU1FU1BBQ0UpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgQWRkcmVzc2luZ0ZhdWx0c0hlbHBlcgotICAgICAgICAgICAgICAgICAgICAudHJpZ2dlck9ubHlBbm9ueW1vdXNBZGRyZXNzU3VwcG9ydGVkRmF1bHQobWVzc2FnZUNvbnRleHQsICJSZXBseVRvIik7Ci0gICAgICAgICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gZXhjZXB0aW9uIik7Ci0gICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBhZikgewotICAgICAgICAgICAgLy8gRXhwZWN0ZWQKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhTdWJtaXNzaW9uLkZBVUxUX0lOVkFMSURfSEVBREVSX1JFQVNPTiwgYWYuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhuZXcgUU5hbWUoU3VibWlzc2lvbi5XU0FfTkFNRVNQQUNFLCBTdWJtaXNzaW9uLkZBVUxUX0lOVkFMSURfSEVBREVSKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBhZi5nZXRGYXVsdENvZGUoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgbWVzc2FnZUNvbnRleHQuZ2V0UHJvcGVydHkoCi0gICAgICAgICAgICAgICAgICAgIEFkZHJlc3NpbmdDb25zdGFudHMuRElTQUJMRV9BRERSRVNTSU5HX0ZPUl9PVVRfTUVTU0FHRVMpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgbWV0aG9kIGZvciB7QGxpbmsgQWRkcmVzc2luZ0ZhdWx0c0hlbHBlciN0cmlnZ2VyT25seU5vbkFub255bW91c0FkZHJlc3NTdXBwb3J0ZWRGYXVsdChvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQsCi0gICAgICogU3RyaW5nKX0uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFRyaWdnZXJPbmx5Tm9uQW5vbnltb3VzQWRkcmVzc1N1cHBvcnRlZEZhdWx0KCkgewotICAgICAgICAvL0ZpbmFsIG5hbWVzcGFjZQotICAgICAgICBNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBtZXNzYWdlQ29udGV4dC5zZXRQcm9wZXJ0eShBZGRyZXNzaW5nQ29uc3RhbnRzLldTX0FERFJFU1NJTkdfVkVSU0lPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzc2luZ0NvbnN0YW50cy5GaW5hbC5XU0FfTkFNRVNQQUNFKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEFkZHJlc3NpbmdGYXVsdHNIZWxwZXIKLSAgICAgICAgICAgICAgICAgICAgLnRyaWdnZXJPbmx5Tm9uQW5vbnltb3VzQWRkcmVzc1N1cHBvcnRlZEZhdWx0KG1lc3NhZ2VDb250ZXh0LCAiUmVwbHlUbyIpOwotICAgICAgICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIGV4Y2VwdGlvbiIpOwotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgYWYpIHsKLSAgICAgICAgICAgIC8vIEV4cGVjdGVkCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoRmluYWwuRkFVTFRfSU5WQUxJRF9IRUFERVJfUkVBU09OLCBhZi5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgdGVzdEZhdWx0Q29kZShuZXcgUU5hbWUoRmluYWwuV1NBX05BTUVTUEFDRSwgRmluYWwuRkFVTFRfSU5WQUxJRF9IRUFERVIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUU5hbWUoRmluYWwuV1NBX05BTUVTUEFDRSwgRmluYWwuRkFVTFRfT05MWV9OT05fQU5PTllNT1VTX0FERFJFU1NfU1VQUE9SVEVEKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGFmLmdldEZhdWx0Q29kZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygid3NhOlJlcGx5VG8iLCAoKE1hcCltZXNzYWdlQ29udGV4dAotICAgICAgICAgICAgICAgICAgICAuZ2V0UHJvcGVydHkoQ29uc3RhbnRzLkZBVUxUX0lORk9STUFUSU9OX0ZPUl9IRUFERVJTKSkuZ2V0KAotICAgICAgICAgICAgICAgICAgICBGaW5hbC5GQVVMVF9IRUFERVJfUFJPQl9IRUFERVJfUU5BTUUpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBtZXNzYWdlQ29udGV4dC5nZXRQcm9wZXJ0eSgKLSAgICAgICAgICAgICAgICAgICAgQWRkcmVzc2luZ0NvbnN0YW50cy5ESVNBQkxFX0FERFJFU1NJTkdfRk9SX09VVF9NRVNTQUdFUykpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvL1N1Ym1pc3Npb24gbmFtZXNwYWNlCi0gICAgICAgIG1lc3NhZ2VDb250ZXh0ID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIG1lc3NhZ2VDb250ZXh0LnNldFByb3BlcnR5KEFkZHJlc3NpbmdDb25zdGFudHMuV1NfQUREUkVTU0lOR19WRVJTSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzaW5nQ29uc3RhbnRzLlN1Ym1pc3Npb24uV1NBX05BTUVTUEFDRSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBBZGRyZXNzaW5nRmF1bHRzSGVscGVyCi0gICAgICAgICAgICAgICAgICAgIC50cmlnZ2VyT25seU5vbkFub255bW91c0FkZHJlc3NTdXBwb3J0ZWRGYXVsdChtZXNzYWdlQ29udGV4dCwgIlJlcGx5VG8iKTsKLSAgICAgICAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBleGNlcHRpb24iKTsKLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGFmKSB7Ci0gICAgICAgICAgICAvLyBFeHBlY3RlZAotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFN1Ym1pc3Npb24uRkFVTFRfSU5WQUxJRF9IRUFERVJfUkVBU09OLCBhZi5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBRTmFtZShTdWJtaXNzaW9uLldTQV9OQU1FU1BBQ0UsIFN1Ym1pc3Npb24uRkFVTFRfSU5WQUxJRF9IRUFERVIpLAotICAgICAgICAgICAgICAgICAgICAgICAgIGFmLmdldEZhdWx0Q29kZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBtZXNzYWdlQ29udGV4dC5nZXRQcm9wZXJ0eSgKLSAgICAgICAgICAgICAgICAgICAgQWRkcmVzc2luZ0NvbnN0YW50cy5ESVNBQkxFX0FERFJFU1NJTkdfRk9SX09VVF9NRVNTQUdFUykpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCBtZXRob2QgZm9yIHtAbGluayBBZGRyZXNzaW5nRmF1bHRzSGVscGVyI3RyaWdnZXJNZXNzYWdlQWRkcmVzc2luZ1JlcXVpcmVkRmF1bHQob3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0LAotICAgICAqIFN0cmluZyl9LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RUcmlnZ2VyTWVzc2FnZUFkZHJlc3NpbmdSZXF1aXJlZEZhdWx0KCkgewotICAgICAgICAvL0ZpbmFsIG5hbWVzcGFjZQotICAgICAgICBNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBtZXNzYWdlQ29udGV4dC5zZXRQcm9wZXJ0eShBZGRyZXNzaW5nQ29uc3RhbnRzLldTX0FERFJFU1NJTkdfVkVSU0lPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzc2luZ0NvbnN0YW50cy5GaW5hbC5XU0FfTkFNRVNQQUNFKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEFkZHJlc3NpbmdGYXVsdHNIZWxwZXIudHJpZ2dlck1lc3NhZ2VBZGRyZXNzaW5nUmVxdWlyZWRGYXVsdChtZXNzYWdlQ29udGV4dCwgIkFjdGlvbiIpOwotICAgICAgICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIGV4Y2VwdGlvbiIpOwotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgYWYpIHsKLSAgICAgICAgICAgIC8vIEV4cGVjdGVkCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoRmluYWwuRkFVTFRfQUREUkVTU0lOR19IRUFERVJfUkVRVUlSRURfUkVBU09OLCBhZi5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgdGVzdEZhdWx0Q29kZShuZXcgUU5hbWUoRmluYWwuV1NBX05BTUVTUEFDRSwgRmluYWwuRkFVTFRfQUREUkVTU0lOR19IRUFERVJfUkVRVUlSRUQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYWYuZ2V0RmF1bHRDb2RlKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ3c2E6QWN0aW9uIiwgKChNYXApbWVzc2FnZUNvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KENvbnN0YW50cy5GQVVMVF9JTkZPUk1BVElPTl9GT1JfSEVBREVSUykpLmdldCgKLSAgICAgICAgICAgICAgICAgICAgRmluYWwuRkFVTFRfSEVBREVSX1BST0JfSEVBREVSX1FOQU1FKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgbWVzc2FnZUNvbnRleHQuZ2V0UHJvcGVydHkoCi0gICAgICAgICAgICAgICAgICAgIEFkZHJlc3NpbmdDb25zdGFudHMuRElTQUJMRV9BRERSRVNTSU5HX0ZPUl9PVVRfTUVTU0FHRVMpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vU3VibWlzc2lvbiBuYW1lc3BhY2UKLSAgICAgICAgbWVzc2FnZUNvbnRleHQgPSBuZXcgTWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgbWVzc2FnZUNvbnRleHQuc2V0UHJvcGVydHkoQWRkcmVzc2luZ0NvbnN0YW50cy5XU19BRERSRVNTSU5HX1ZFUlNJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3NpbmdDb25zdGFudHMuU3VibWlzc2lvbi5XU0FfTkFNRVNQQUNFKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEFkZHJlc3NpbmdGYXVsdHNIZWxwZXIudHJpZ2dlck1lc3NhZ2VBZGRyZXNzaW5nUmVxdWlyZWRGYXVsdChtZXNzYWdlQ29udGV4dCwgIkFjdGlvbiIpOwotICAgICAgICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIGV4Y2VwdGlvbiIpOwotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgYWYpIHsKLSAgICAgICAgICAgIC8vIEV4cGVjdGVkCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoU3VibWlzc2lvbi5GQVVMVF9BRERSRVNTSU5HX0hFQURFUl9SRVFVSVJFRF9SRUFTT04sIGFmLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMobmV3IFFOYW1lKFN1Ym1pc3Npb24uV1NBX05BTUVTUEFDRSwgU3VibWlzc2lvbi5GQVVMVF9BRERSRVNTSU5HX0hFQURFUl9SRVFVSVJFRCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgYWYuZ2V0RmF1bHRDb2RlKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG1lc3NhZ2VDb250ZXh0LmdldFByb3BlcnR5KAotICAgICAgICAgICAgICAgICAgICBBZGRyZXNzaW5nQ29uc3RhbnRzLkRJU0FCTEVfQUREUkVTU0lOR19GT1JfT1VUX01FU1NBR0VTKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IG1ldGhvZCBmb3Ige0BsaW5rIEFkZHJlc3NpbmdGYXVsdHNIZWxwZXIjdHJpZ2dlckFjdGlvbk5vdFN1cHBvcnRlZEZhdWx0KG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dCwKLSAgICAgKiBTdHJpbmcpfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VHJpZ2dlckFjdGlvbk5vdFN1cHBvcnRlZEZhdWx0KCkgewotICAgICAgICAvL0ZpbmFsIG5hbWVzcGFjZQotICAgICAgICBNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBtZXNzYWdlQ29udGV4dC5zZXRQcm9wZXJ0eShBZGRyZXNzaW5nQ29uc3RhbnRzLldTX0FERFJFU1NJTkdfVkVSU0lPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzc2luZ0NvbnN0YW50cy5GaW5hbC5XU0FfTkFNRVNQQUNFKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEFkZHJlc3NpbmdGYXVsdHNIZWxwZXIKLSAgICAgICAgICAgICAgICAgICAgLnRyaWdnZXJBY3Rpb25Ob3RTdXBwb3J0ZWRGYXVsdChtZXNzYWdlQ29udGV4dCwgImh0dHA6Ly9pbmNvcnJlY3QvYWN0aW9uIik7Ci0gICAgICAgICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gZXhjZXB0aW9uIik7Ci0gICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBhZikgewotICAgICAgICAgICAgLy8gRXhwZWN0ZWQKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhBZGRyZXNzaW5nQ29uc3RhbnRzLkZBVUxUX0FDVElPTl9OT1RfU1VQUE9SVEVEX1JFQVNPTiwgYWYuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIHRlc3RGYXVsdENvZGUoCi0gICAgICAgICAgICAgICAgICAgIG5ldyBRTmFtZShGaW5hbC5XU0FfTkFNRVNQQUNFLCBBZGRyZXNzaW5nQ29uc3RhbnRzLkZBVUxUX0FDVElPTl9OT1RfU1VQUE9SVEVEKSwKLSAgICAgICAgICAgICAgICAgICAgbnVsbCwgCi0gICAgICAgICAgICAgICAgICAgIGFmLmdldEZhdWx0Q29kZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiaHR0cDovL2luY29ycmVjdC9hY3Rpb24iLCAoKE1hcCltZXNzYWdlQ29udGV4dAotICAgICAgICAgICAgICAgICAgICAuZ2V0UHJvcGVydHkoQ29uc3RhbnRzLkZBVUxUX0lORk9STUFUSU9OX0ZPUl9IRUFERVJTKSkuZ2V0KAotICAgICAgICAgICAgICAgICAgICBBZGRyZXNzaW5nQ29uc3RhbnRzLkZpbmFsLkZBVUxUX1BST0JMRU1fQUNUSU9OX05BTUUpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBtZXNzYWdlQ29udGV4dC5nZXRQcm9wZXJ0eSgKLSAgICAgICAgICAgICAgICAgICAgQWRkcmVzc2luZ0NvbnN0YW50cy5ESVNBQkxFX0FERFJFU1NJTkdfRk9SX09VVF9NRVNTQUdFUykpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy9TdWJtaXNzaW9uIG5hbWVzcGFjZQotICAgICAgICBtZXNzYWdlQ29udGV4dCA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBtZXNzYWdlQ29udGV4dC5zZXRQcm9wZXJ0eShBZGRyZXNzaW5nQ29uc3RhbnRzLldTX0FERFJFU1NJTkdfVkVSU0lPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzc2luZ0NvbnN0YW50cy5TdWJtaXNzaW9uLldTQV9OQU1FU1BBQ0UpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgQWRkcmVzc2luZ0ZhdWx0c0hlbHBlcgotICAgICAgICAgICAgICAgICAgICAudHJpZ2dlckFjdGlvbk5vdFN1cHBvcnRlZEZhdWx0KG1lc3NhZ2VDb250ZXh0LCAiaHR0cDovL2luY29ycmVjdC9hY3Rpb24iKTsKLSAgICAgICAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBleGNlcHRpb24iKTsKLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGFmKSB7Ci0gICAgICAgICAgICAvLyBFeHBlY3RlZAotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEFkZHJlc3NpbmdDb25zdGFudHMuRkFVTFRfQUNUSU9OX05PVF9TVVBQT1JURURfUkVBU09OLCBhZi5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAgICAgICAgICAgICBuZXcgUU5hbWUoU3VibWlzc2lvbi5XU0FfTkFNRVNQQUNFLCBBZGRyZXNzaW5nQ29uc3RhbnRzLkZBVUxUX0FDVElPTl9OT1RfU1VQUE9SVEVEKSwKLSAgICAgICAgICAgICAgICAgICAgYWYuZ2V0RmF1bHRDb2RlKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG1lc3NhZ2VDb250ZXh0LmdldFByb3BlcnR5KAotICAgICAgICAgICAgICAgICAgICBBZGRyZXNzaW5nQ29uc3RhbnRzLkRJU0FCTEVfQUREUkVTU0lOR19GT1JfT1VUX01FU1NBR0VTKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IG1ldGhvZCBmb3Ige0BsaW5rIEFkZHJlc3NpbmdGYXVsdHNIZWxwZXIjdHJpZ2dlckRlc3RpbmF0aW9uVW5yZWFjaGFibGVGYXVsdChNZXNzYWdlQ29udGV4dCwgU3RyaW5nKX0uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFRyaWdnZXJEZXN0aW5hdGlvblVucmVhY2hhYmxlRmF1bHQoKSB7Ci0gICAgICAgIC8vRmluYWwgbmFtZXNwYWNlCi0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0ID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIG1lc3NhZ2VDb250ZXh0LnNldFByb3BlcnR5KEFkZHJlc3NpbmdDb25zdGFudHMuV1NfQUREUkVTU0lOR19WRVJTSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzaW5nQ29uc3RhbnRzLkZpbmFsLldTQV9OQU1FU1BBQ0UpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgQWRkcmVzc2luZ0ZhdWx0c0hlbHBlci50cmlnZ2VyRGVzdGluYXRpb25VbnJlYWNoYWJsZUZhdWx0KG1lc3NhZ2VDb250ZXh0LCAiaHR0cDovL3NvbWV3aGVyZS5jb20vc29tZWhvdyIpOwotICAgICAgICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIGV4Y2VwdGlvbiIpOwotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgYWYpIHsKLSAgICAgICAgICAgIC8vIEV4cGVjdGVkCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoRmluYWwuRkFVTFRfQUREUkVTU0lOR19ERVNUSU5BVElPTl9VTlJFQUNIQUJMRV9SRUFTT04sIGFmLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICB0ZXN0RmF1bHRDb2RlKAotICAgICAgICAgICAgICAgICAgICBuZXcgUU5hbWUoRmluYWwuV1NBX05BTUVTUEFDRSwgQWRkcmVzc2luZ0NvbnN0YW50cy5GQVVMVF9BRERSRVNTSU5HX0RFU1RJTkFUSU9OX1VOUkVBQ0hBQkxFKSwKLSAgICAgICAgICAgICAgICAgICAgbnVsbCwgCi0gICAgICAgICAgICAgICAgICAgIGFmLmdldEZhdWx0Q29kZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiaHR0cDovL3NvbWV3aGVyZS5jb20vc29tZWhvdyIsICgoTWFwKW1lc3NhZ2VDb250ZXh0Ci0gICAgICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eShDb25zdGFudHMuRkFVTFRfSU5GT1JNQVRJT05fRk9SX0hFQURFUlMpKS5nZXQoCi0gICAgICAgICAgICAgICAgICAgIEFkZHJlc3NpbmdDb25zdGFudHMuRmluYWwuRkFVTFRfSEVBREVSX1BST0JfSVJJKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgbWVzc2FnZUNvbnRleHQuZ2V0UHJvcGVydHkoCi0gICAgICAgICAgICAgICAgICAgIEFkZHJlc3NpbmdDb25zdGFudHMuRElTQUJMRV9BRERSRVNTSU5HX0ZPUl9PVVRfTUVTU0FHRVMpKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy9TdWJtaXNzaW9uIG5hbWVzcGFjZQotICAgICAgICBtZXNzYWdlQ29udGV4dCA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBtZXNzYWdlQ29udGV4dC5zZXRQcm9wZXJ0eShBZGRyZXNzaW5nQ29uc3RhbnRzLldTX0FERFJFU1NJTkdfVkVSU0lPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzc2luZ0NvbnN0YW50cy5TdWJtaXNzaW9uLldTQV9OQU1FU1BBQ0UpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgQWRkcmVzc2luZ0ZhdWx0c0hlbHBlci50cmlnZ2VyRGVzdGluYXRpb25VbnJlYWNoYWJsZUZhdWx0KG1lc3NhZ2VDb250ZXh0LCAiaHR0cDovL3NvbWV3aGVyZS5jb20vc29tZWhvdyIpOwotICAgICAgICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIGV4Y2VwdGlvbiIpOwotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgYWYpIHsKLSAgICAgICAgICAgIC8vIEV4cGVjdGVkCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoU3VibWlzc2lvbi5GQVVMVF9BRERSRVNTSU5HX0RFU1RJTkFUSU9OX1VOUkVBQ0hBQkxFX1JFQVNPTiwgYWYuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgICAgICAgICAgICAgbmV3IFFOYW1lKFN1Ym1pc3Npb24uV1NBX05BTUVTUEFDRSwgQWRkcmVzc2luZ0NvbnN0YW50cy5GQVVMVF9BRERSRVNTSU5HX0RFU1RJTkFUSU9OX1VOUkVBQ0hBQkxFKSwKLSAgICAgICAgICAgICAgICAgICAgYWYuZ2V0RmF1bHRDb2RlKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG1lc3NhZ2VDb250ZXh0LmdldFByb3BlcnR5KAotICAgICAgICAgICAgICAgICAgICBBZGRyZXNzaW5nQ29uc3RhbnRzLkRJU0FCTEVfQUREUkVTU0lOR19GT1JfT1VUX01FU1NBR0VTKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IG1ldGhvZCBmb3Ige0BsaW5rIEFkZHJlc3NpbmdGYXVsdHNIZWxwZXIjdHJpZ2dlckludmFsaWRFUFJGYXVsdChNZXNzYWdlQ29udGV4dCwgU3RyaW5nKX0uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFRyaWdnZXJJbnZhbGlkRVBSRmF1bHQoKSB7Ci0gICAgICAgIC8vRmluYWwgbmFtZXNwYWNlCi0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0ID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIG1lc3NhZ2VDb250ZXh0LnNldFByb3BlcnR5KEFkZHJlc3NpbmdDb25zdGFudHMuV1NfQUREUkVTU0lOR19WRVJTSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzaW5nQ29uc3RhbnRzLkZpbmFsLldTQV9OQU1FU1BBQ0UpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgQWRkcmVzc2luZ0ZhdWx0c0hlbHBlci50cmlnZ2VySW52YWxpZEVQUkZhdWx0KG1lc3NhZ2VDb250ZXh0LCAiUmVwbHlUbyIpOwotICAgICAgICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIGV4Y2VwdGlvbiIpOwotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgYWYpIHsKLSAgICAgICAgICAgIC8vIEV4cGVjdGVkCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoRmluYWwuRkFVTFRfSU5WQUxJRF9IRUFERVJfUkVBU09OLCBhZi5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgdGVzdEZhdWx0Q29kZSgKLSAgICAgICAgICAgICAgICAgICAgbmV3IFFOYW1lKEZpbmFsLldTQV9OQU1FU1BBQ0UsIEZpbmFsLkZBVUxUX0lOVkFMSURfSEVBREVSKSwKLSAgICAgICAgICAgICAgICAgICAgbmV3IFFOYW1lKEZpbmFsLldTQV9OQU1FU1BBQ0UsICJJbnZhbGlkRVBSIiksCi0gICAgICAgICAgICAgICAgICAgIGFmLmdldEZhdWx0Q29kZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygid3NhOlJlcGx5VG8iLCAoKE1hcCltZXNzYWdlQ29udGV4dAotICAgICAgICAgICAgICAgICAgICAuZ2V0UHJvcGVydHkoQ29uc3RhbnRzLkZBVUxUX0lORk9STUFUSU9OX0ZPUl9IRUFERVJTKSkuZ2V0KAotICAgICAgICAgICAgICAgICAgICBBZGRyZXNzaW5nQ29uc3RhbnRzLkZpbmFsLkZBVUxUX0hFQURFUl9QUk9CX0hFQURFUl9RTkFNRSkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG1lc3NhZ2VDb250ZXh0LmdldFByb3BlcnR5KAotICAgICAgICAgICAgICAgICAgICBBZGRyZXNzaW5nQ29uc3RhbnRzLkRJU0FCTEVfQUREUkVTU0lOR19GT1JfT1VUX01FU1NBR0VTKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvL1N1Ym1pc3Npb24gbmFtZXNwYWNlCi0gICAgICAgIG1lc3NhZ2VDb250ZXh0ID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIG1lc3NhZ2VDb250ZXh0LnNldFByb3BlcnR5KEFkZHJlc3NpbmdDb25zdGFudHMuV1NfQUREUkVTU0lOR19WRVJTSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzaW5nQ29uc3RhbnRzLlN1Ym1pc3Npb24uV1NBX05BTUVTUEFDRSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBBZGRyZXNzaW5nRmF1bHRzSGVscGVyLnRyaWdnZXJJbnZhbGlkRVBSRmF1bHQobWVzc2FnZUNvbnRleHQsICJSZXBseVRvIik7Ci0gICAgICAgICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gZXhjZXB0aW9uIik7Ci0gICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBhZikgewotICAgICAgICAgICAgLy8gRXhwZWN0ZWQKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhTdWJtaXNzaW9uLkZBVUxUX0lOVkFMSURfSEVBREVSX1JFQVNPTiwgYWYuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgICAgICAgICAgICAgbmV3IFFOYW1lKFN1Ym1pc3Npb24uV1NBX05BTUVTUEFDRSwgU3VibWlzc2lvbi5GQVVMVF9JTlZBTElEX0hFQURFUiksCi0gICAgICAgICAgICAgICAgICAgIGFmLmdldEZhdWx0Q29kZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBtZXNzYWdlQ29udGV4dC5nZXRQcm9wZXJ0eSgKLSAgICAgICAgICAgICAgICAgICAgQWRkcmVzc2luZ0NvbnN0YW50cy5ESVNBQkxFX0FERFJFU1NJTkdfRk9SX09VVF9NRVNTQUdFUykpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCBtZXRob2QgZm9yIHtAbGluayBBZGRyZXNzaW5nRmF1bHRzSGVscGVyI3RyaWdnZXJNaXNzaW5nQWRkcmVzc0luRVBSRmF1bHQoTWVzc2FnZUNvbnRleHQsIFN0cmluZyl9LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RUcmlnZ2VyTWlzc2luZ0FkZHJlc3NJbkVQUkZhdWx0KCkgewotICAgICAgICAvL0ZpbmFsIG5hbWVzcGFjZQotICAgICAgICBNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBtZXNzYWdlQ29udGV4dC5zZXRQcm9wZXJ0eShBZGRyZXNzaW5nQ29uc3RhbnRzLldTX0FERFJFU1NJTkdfVkVSU0lPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzc2luZ0NvbnN0YW50cy5GaW5hbC5XU0FfTkFNRVNQQUNFKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEFkZHJlc3NpbmdGYXVsdHNIZWxwZXIudHJpZ2dlck1pc3NpbmdBZGRyZXNzSW5FUFJGYXVsdChtZXNzYWdlQ29udGV4dCwgIlJlcGx5VG8iKTsKLSAgICAgICAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBleGNlcHRpb24iKTsKLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGFmKSB7Ci0gICAgICAgICAgICAvLyBFeHBlY3RlZAotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEZpbmFsLkZBVUxUX0lOVkFMSURfSEVBREVSX1JFQVNPTiwgYWYuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIHRlc3RGYXVsdENvZGUoCi0gICAgICAgICAgICAgICAgICAgIG5ldyBRTmFtZShGaW5hbC5XU0FfTkFNRVNQQUNFLCBGaW5hbC5GQVVMVF9JTlZBTElEX0hFQURFUiksCi0gICAgICAgICAgICAgICAgICAgIG5ldyBRTmFtZShGaW5hbC5XU0FfTkFNRVNQQUNFLCAiTWlzc2luZ0FkZHJlc3NJbkVQUiIpLAotICAgICAgICAgICAgICAgICAgICBhZi5nZXRGYXVsdENvZGUoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIndzYTpSZXBseVRvIiwgKChNYXApbWVzc2FnZUNvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KENvbnN0YW50cy5GQVVMVF9JTkZPUk1BVElPTl9GT1JfSEVBREVSUykpLmdldCgKLSAgICAgICAgICAgICAgICAgICAgQWRkcmVzc2luZ0NvbnN0YW50cy5GaW5hbC5GQVVMVF9IRUFERVJfUFJPQl9IRUFERVJfUU5BTUUpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBtZXNzYWdlQ29udGV4dC5nZXRQcm9wZXJ0eSgKLSAgICAgICAgICAgICAgICAgICAgQWRkcmVzc2luZ0NvbnN0YW50cy5ESVNBQkxFX0FERFJFU1NJTkdfRk9SX09VVF9NRVNTQUdFUykpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvL1N1Ym1pc3Npb24gbmFtZXNwYWNlCi0gICAgICAgIG1lc3NhZ2VDb250ZXh0ID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIG1lc3NhZ2VDb250ZXh0LnNldFByb3BlcnR5KEFkZHJlc3NpbmdDb25zdGFudHMuV1NfQUREUkVTU0lOR19WRVJTSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzaW5nQ29uc3RhbnRzLlN1Ym1pc3Npb24uV1NBX05BTUVTUEFDRSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBBZGRyZXNzaW5nRmF1bHRzSGVscGVyLnRyaWdnZXJNaXNzaW5nQWRkcmVzc0luRVBSRmF1bHQobWVzc2FnZUNvbnRleHQsICJSZXBseVRvIik7Ci0gICAgICAgICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gZXhjZXB0aW9uIik7Ci0gICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBhZikgewotICAgICAgICAgICAgLy8gRXhwZWN0ZWQKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhTdWJtaXNzaW9uLkZBVUxUX0lOVkFMSURfSEVBREVSX1JFQVNPTiwgYWYuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgICAgICAgICAgICAgbmV3IFFOYW1lKFN1Ym1pc3Npb24uV1NBX05BTUVTUEFDRSwgU3VibWlzc2lvbi5GQVVMVF9JTlZBTElEX0hFQURFUiksCi0gICAgICAgICAgICAgICAgICAgIGFmLmdldEZhdWx0Q29kZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygid3NhOlJlcGx5VG8iLCAoKE1hcCltZXNzYWdlQ29udGV4dAotICAgICAgICAgICAgICAgICAgICAuZ2V0UHJvcGVydHkoQ29uc3RhbnRzLkZBVUxUX0lORk9STUFUSU9OX0ZPUl9IRUFERVJTKSkuZ2V0KAotICAgICAgICAgICAgICAgICAgICBBZGRyZXNzaW5nQ29uc3RhbnRzLkZpbmFsLkZBVUxUX0hFQURFUl9QUk9CX0hFQURFUl9RTkFNRSkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG1lc3NhZ2VDb250ZXh0LmdldFByb3BlcnR5KAotICAgICAgICAgICAgICAgICAgICBBZGRyZXNzaW5nQ29uc3RhbnRzLkRJU0FCTEVfQUREUkVTU0lOR19GT1JfT1VUX01FU1NBR0VTKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvYWRkcmVzc2luZy9BZGRyZXNzaW5nSGVscGVyVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9hZGRyZXNzaW5nL0FkZHJlc3NpbmdIZWxwZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1ZTBhOTUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9hZGRyZXNzaW5nL0FkZHJlc3NpbmdIZWxwZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3Npbmc7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotCi1wdWJsaWMgY2xhc3MgQWRkcmVzc2luZ0hlbHBlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SXNSZXBseVJlZGlyZWN0ZWROb1JlcGx5VG8oKSB7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1jID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIGFzc2VydEZhbHNlKEFkZHJlc3NpbmdIZWxwZXIuaXNSZXBseVJlZGlyZWN0ZWQobWMpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SXNSZXBseVJlZGlyZWN0ZWRBbm9uUmVwbHlUbygpIHsKLSAgICAgICAgTWVzc2FnZUNvbnRleHQgbWMgPSBuZXcgTWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgbWMuc2V0UmVwbHlUbyhuZXcgRW5kcG9pbnRSZWZlcmVuY2UoQWRkcmVzc2luZ0NvbnN0YW50cy5GaW5hbC5XU0FfQU5PTllNT1VTX1VSTCkpOwotICAgICAgICBhc3NlcnRGYWxzZShBZGRyZXNzaW5nSGVscGVyLmlzUmVwbHlSZWRpcmVjdGVkKG1jKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdElzUmVwbHlSZWRpcmVjdGVkTm9uQW5vblJlcGx5VG8oKSB7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1jID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIG1jLnNldFJlcGx5VG8obmV3IEVuZHBvaW50UmVmZXJlbmNlKCJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMiIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShBZGRyZXNzaW5nSGVscGVyLmlzUmVwbHlSZWRpcmVjdGVkKG1jKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdElzUmVwbHlSZWRpcmVjdGVkTm9uZVJlcGx5VG8oKSB7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1jID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIG1jLnNldFJlcGx5VG8obmV3IEVuZHBvaW50UmVmZXJlbmNlKEFkZHJlc3NpbmdDb25zdGFudHMuRmluYWwuV1NBX05PTkVfVVJJKSk7Ci0gICAgICAgIGFzc2VydFRydWUoQWRkcmVzc2luZ0hlbHBlci5pc1JlcGx5UmVkaXJlY3RlZChtYykpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJc0ZhdWx0UmVkaXJlY3RlZE5vRmF1bHRUb09yUmVwbHlUbygpIHsKLSAgICAgICAgTWVzc2FnZUNvbnRleHQgbWMgPSBuZXcgTWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoQWRkcmVzc2luZ0hlbHBlci5pc0ZhdWx0UmVkaXJlY3RlZChtYykpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJc0ZhdWx0UmVkaXJlY3RlZE5vRmF1bHRUbygpIHsKLSAgICAgICAgTWVzc2FnZUNvbnRleHQgbWMgPSBuZXcgTWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgbWMuc2V0UmVwbHlUbyhuZXcgRW5kcG9pbnRSZWZlcmVuY2UoImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyIikpOwotICAgICAgICBhc3NlcnRUcnVlKEFkZHJlc3NpbmdIZWxwZXIuaXNGYXVsdFJlZGlyZWN0ZWQobWMpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SXNGYXVsdFJlZGlyZWN0ZWRBbm9uRmF1bHRUbygpIHsKLSAgICAgICAgTWVzc2FnZUNvbnRleHQgbWMgPSBuZXcgTWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgbWMuc2V0RmF1bHRUbyhuZXcgRW5kcG9pbnRSZWZlcmVuY2UoQWRkcmVzc2luZ0NvbnN0YW50cy5GaW5hbC5XU0FfQU5PTllNT1VTX1VSTCkpOwotICAgICAgICBhc3NlcnRGYWxzZShBZGRyZXNzaW5nSGVscGVyLmlzRmF1bHRSZWRpcmVjdGVkKG1jKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdElzRmF1bHRSZWRpcmVjdGVkTm9uQW5vbkZhdWx0VG8oKSB7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1jID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIG1jLnNldEZhdWx0VG8obmV3IEVuZHBvaW50UmVmZXJlbmNlKCJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMiIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShBZGRyZXNzaW5nSGVscGVyLmlzRmF1bHRSZWRpcmVjdGVkKG1jKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdElzRmF1bHRSZWRpcmVjdGVkTm9uZVJlcGx5VG8oKSB7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1jID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIG1jLnNldFJlcGx5VG8obmV3IEVuZHBvaW50UmVmZXJlbmNlKEFkZHJlc3NpbmdDb25zdGFudHMuRmluYWwuV1NBX05PTkVfVVJJKSk7Ci0gICAgICAgIGFzc2VydFRydWUoQWRkcmVzc2luZ0hlbHBlci5pc0ZhdWx0UmVkaXJlY3RlZChtYykpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJc1N5bmNSZXBseUFsbG93ZWROb1JlcGx5VG8oKSB7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1jID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIGFzc2VydFRydWUoQWRkcmVzc2luZ0hlbHBlci5pc1N5bmNSZXBseUFsbG93ZWQobWMpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SXNTeW5jUmVwbHlBbGxvd2VkQW5vblJlcGx5VG8oKSB7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1jID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIG1jLnNldFJlcGx5VG8obmV3IEVuZHBvaW50UmVmZXJlbmNlKEFkZHJlc3NpbmdDb25zdGFudHMuRmluYWwuV1NBX0FOT05ZTU9VU19VUkwpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShBZGRyZXNzaW5nSGVscGVyLmlzU3luY1JlcGx5QWxsb3dlZChtYykpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJc1N5bmNSZXBseUFsbG93ZWROb25Bbm9uUmVwbHlUbygpIHsKLSAgICAgICAgTWVzc2FnZUNvbnRleHQgbWMgPSBuZXcgTWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgbWMuc2V0UmVwbHlUbyhuZXcgRW5kcG9pbnRSZWZlcmVuY2UoImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyIikpOwotICAgICAgICBhc3NlcnRGYWxzZShBZGRyZXNzaW5nSGVscGVyLmlzU3luY1JlcGx5QWxsb3dlZChtYykpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJc1N5bmNSZXBseUFsbG93ZWROb25lUmVwbHlUbygpIHsKLSAgICAgICAgTWVzc2FnZUNvbnRleHQgbWMgPSBuZXcgTWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgbWMuc2V0UmVwbHlUbyhuZXcgRW5kcG9pbnRSZWZlcmVuY2UoQWRkcmVzc2luZ0NvbnN0YW50cy5GaW5hbC5XU0FfTk9ORV9VUkkpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShBZGRyZXNzaW5nSGVscGVyLmlzU3luY1JlcGx5QWxsb3dlZChtYykpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJc1N5bmNGYXVsdEFsbG93ZWROb0ZhdWx0VG9PclJlcGx5VG8oKSB7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1jID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIGFzc2VydFRydWUoQWRkcmVzc2luZ0hlbHBlci5pc1N5bmNGYXVsdEFsbG93ZWQobWMpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SXNTeW5jRmF1bHRBbGxvd2VkTm9GYXVsdFRvKCkgewotICAgICAgICBNZXNzYWdlQ29udGV4dCBtYyA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBtYy5zZXRSZXBseVRvKG5ldyBFbmRwb2ludFJlZmVyZW5jZSgiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIiKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKEFkZHJlc3NpbmdIZWxwZXIuaXNTeW5jRmF1bHRBbGxvd2VkKG1jKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdElzU3luY0ZhdWx0QWxsb3dlZEFub25GYXVsdFRvKCkgewotICAgICAgICBNZXNzYWdlQ29udGV4dCBtYyA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBtYy5zZXRGYXVsdFRvKG5ldyBFbmRwb2ludFJlZmVyZW5jZShBZGRyZXNzaW5nQ29uc3RhbnRzLkZpbmFsLldTQV9BTk9OWU1PVVNfVVJMKSk7Ci0gICAgICAgIGFzc2VydFRydWUoQWRkcmVzc2luZ0hlbHBlci5pc1N5bmNGYXVsdEFsbG93ZWQobWMpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SXNTeW5jRmF1bHRBbGxvd2VkTm9uQW5vbkZhdWx0VG8oKSB7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1jID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIG1jLnNldEZhdWx0VG8obmV3IEVuZHBvaW50UmVmZXJlbmNlKCJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMiIpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoQWRkcmVzc2luZ0hlbHBlci5pc1N5bmNGYXVsdEFsbG93ZWQobWMpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SXNTeW5jRmF1bHRBbGxvd2VkTm9uZVJlcGx5VG8oKSB7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1jID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIG1jLnNldFJlcGx5VG8obmV3IEVuZHBvaW50UmVmZXJlbmNlKEFkZHJlc3NpbmdDb25zdGFudHMuRmluYWwuV1NBX05PTkVfVVJJKSk7Ci0gICAgICAgIGFzc2VydFRydWUoQWRkcmVzc2luZ0hlbHBlci5pc1N5bmNGYXVsdEFsbG93ZWQobWMpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2FkZHJlc3NpbmcvRW5kcG9pbnRSZWZlcmVuY2VIZWxwZXJUZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2FkZHJlc3NpbmcvRW5kcG9pbnRSZWZlcmVuY2VIZWxwZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2YmNlMjEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9hZGRyZXNzaW5nL0VuZHBvaW50UmVmZXJlbmNlSGVscGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTmFtZXNwYWNlOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLXB1YmxpYyBjbGFzcyBFbmRwb2ludFJlZmVyZW5jZUhlbHBlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VG9BbmRGcm9tT01Gb3JGaW5hbFNwZWNFUFIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIGFkZHJlc3MgPSAiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIiOwotICAgICAgICBFbmRwb2ludFJlZmVyZW5jZSBlcHIgPSBuZXcgRW5kcG9pbnRSZWZlcmVuY2UoYWRkcmVzcyk7Ci0KLSAgICAgICAgT01GYWN0b3J5IG9tZiA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpOwotICAgICAgICBPTU5hbWVzcGFjZSBuczEgPSBvbWYuY3JlYXRlT01OYW1lc3BhY2UoImh0dHA6Ly91cmkxIiwgInByZWZpeDEiKTsKLSAgICAgICAgT01BdHRyaWJ1dGUgYXR0cjEgPSBvbWYuY3JlYXRlT01BdHRyaWJ1dGUoImF0dHIxIiwgbnMxLCAiYXR0cjF2YWx1ZSIpOwotICAgICAgICBPTU5hbWVzcGFjZSBuczIgPSBvbWYuY3JlYXRlT01OYW1lc3BhY2UoImh0dHA6Ly91cmkyIiwgInByZWZpeDIiKTsKLSAgICAgICAgT01BdHRyaWJ1dGUgYXR0cjIgPSBvbWYuY3JlYXRlT01BdHRyaWJ1dGUoImF0dHIyIiwgbnMyLCAiYXR0cjJ2YWx1ZSIpOwotICAgICAgICBlcHIuYWRkQXR0cmlidXRlKGF0dHIxKTsKLSAgICAgICAgZXByLmFkZEF0dHJpYnV0ZShhdHRyMik7Ci0gICAgICAgIE9NRWxlbWVudCBtZDEgPSBvbWYuY3JlYXRlT01FbGVtZW50KCJtZDEiLCAiaHR0cDovL21kdXJpMSIsICJtZDFwcmVmaXgiKTsKLSAgICAgICAgT01FbGVtZW50IG1kMiA9IG9tZi5jcmVhdGVPTUVsZW1lbnQoIm1kMiIsICJodHRwOi8vbWR1cmkyIiwgIm1kMnByZWZpeCIpOwotICAgICAgICBlcHIuYWRkTWV0YURhdGEobWQxKTsKLSAgICAgICAgZXByLmFkZE1ldGFEYXRhKG1kMik7Ci0gICAgICAgIE9NRWxlbWVudCBleHQxID0gb21mLmNyZWF0ZU9NRWxlbWVudCgiZXh0MSIsICJodHRwOi8vZXh0dXJpMSIsICJleHQxcHJlZml4Iik7Ci0gICAgICAgIE9NRWxlbWVudCBleHQyID0gb21mLmNyZWF0ZU9NRWxlbWVudCgiZXh0MiIsICJodHRwOi8vZXh0dXJpMiIsICJleHQycHJlZml4Iik7Ci0gICAgICAgIGVwci5hZGRFeHRlbnNpYmxlRWxlbWVudChleHQxKTsKLSAgICAgICAgZXByLmFkZEV4dGVuc2libGVFbGVtZW50KGV4dDIpOwotICAgICAgICBRTmFtZSBycDFRbmFtZSA9IG5ldyBRTmFtZSgiaHR0cDovL3JwMXVyaSIsICJyZWZQYXJtMSIsICJycDFwcmVmaXgiKTsKLSAgICAgICAgUU5hbWUgcnAyUW5hbWUgPSBuZXcgUU5hbWUoImh0dHA6Ly9ycDJ1cmkiLCAicmVmUGFybTIiLCAicnAycHJlZml4Iik7Ci0gICAgICAgIGVwci5hZGRSZWZlcmVuY2VQYXJhbWV0ZXIocnAxUW5hbWUsICJycDEiKTsKLSAgICAgICAgZXByLmFkZFJlZmVyZW5jZVBhcmFtZXRlcihycDJRbmFtZSwgInJwMiIpOwotCi0gICAgICAgIEFycmF5TGlzdCBhZGRyZXNzQXR0cmlidXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgYWRkcmVzc0F0dHJpYnV0ZXMuYWRkKGF0dHIxKTsKLSAgICAgICAgYWRkcmVzc0F0dHJpYnV0ZXMuYWRkKGF0dHIyKTsKLSAgICAgICAgZXByLnNldEFkZHJlc3NBdHRyaWJ1dGVzKGFkZHJlc3NBdHRyaWJ1dGVzKTsKLQotICAgICAgICBBcnJheUxpc3QgbWV0YWRhdGFBdHRyaWJ1dGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBtZXRhZGF0YUF0dHJpYnV0ZXMuYWRkKGF0dHIxKTsKLSAgICAgICAgbWV0YWRhdGFBdHRyaWJ1dGVzLmFkZChhdHRyMik7Ci0gICAgICAgIGVwci5zZXRNZXRhZGF0YUF0dHJpYnV0ZXMobWV0YWRhdGFBdHRyaWJ1dGVzKTsKLQotICAgICAgICBPTUVsZW1lbnQgb20gPSBFbmRwb2ludFJlZmVyZW5jZUhlbHBlci50b09NKG9tZiwgZXByLCBuZXcgUU5hbWUoImh0dHA6Ly9uc3VybCIsICJsb2NhbE5hbWUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInByZWZpeCIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzaW5nQ29uc3RhbnRzLkZpbmFsLldTQV9OQU1FU1BBQ0UpOwotCi0gICAgICAgIC8vVGVzdCBkZXNlcmlhbGl6ZSB1c2luZyBmcm9tT00oT01FbGVtZW50KQotICAgICAgICBFbmRwb2ludFJlZmVyZW5jZSBkZXNlciA9IEVuZHBvaW50UmVmZXJlbmNlSGVscGVyLmZyb21PTShvbSk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKGVwci5nZXRBZGRyZXNzKCksIGRlc2VyLmdldEFkZHJlc3MoKSk7Ci0gICAgICAgIEFycmF5TGlzdCBhZGRyQXR0cnMgPSBkZXNlci5nZXRBZGRyZXNzQXR0cmlidXRlcygpOwotICAgICAgICBhc3NlcnRFcXVhbHMoYXR0cjEsIGFkZHJBdHRycy5nZXQoMCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoYXR0cjIsIGFkZHJBdHRycy5nZXQoMSkpOwotCi0gICAgICAgIEFycmF5TGlzdCBhdHRycyA9IGRlc2VyLmdldEF0dHJpYnV0ZXMoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGF0dHIxLCBhdHRycy5nZXQoMCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoYXR0cjIsIGF0dHJzLmdldCgxKSk7Ci0KLSAgICAgICAgQXJyYXlMaXN0IG1ldGFkYXRhID0gZGVzZXIuZ2V0TWV0YURhdGEoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG1kMSwgbWV0YWRhdGEuZ2V0KDApKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG1kMiwgbWV0YWRhdGEuZ2V0KDEpKTsKLSAgICAgICAgQXJyYXlMaXN0IG1kQXR0cnMgPSBkZXNlci5nZXRNZXRhZGF0YUF0dHJpYnV0ZXMoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGF0dHIxLCBtZEF0dHJzLmdldCgwKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhhdHRyMiwgbWRBdHRycy5nZXQoMSkpOwotCi0gICAgICAgIEFycmF5TGlzdCBleHRlbHRzID0gZGVzZXIuZ2V0RXh0ZW5zaWJsZUVsZW1lbnRzKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhleHQxLCBleHRlbHRzLmdldCgwKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhleHQyLCBleHRlbHRzLmdldCgxKSk7Ci0KLSAgICAgICAgTWFwIG0gPSBkZXNlci5nZXRBbGxSZWZlcmVuY2VQYXJhbWV0ZXJzKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygicnAxIiwgKChPTUVsZW1lbnQpIG0uZ2V0KHJwMVFuYW1lKSkuZ2V0VGV4dCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJycDIiLCAoKE9NRWxlbWVudCkgbS5nZXQocnAyUW5hbWUpKS5nZXRUZXh0KCkpOwotCi0gICAgICAgIC8vVGVzdCBkZXNlcmlhbGl6ZSB1c2luZyBmcm9tT00oRW5kcG9pbnRSZWZlcmVuY2UsIE9NRWxlbWVudCwgU3RyaW5nKQotICAgICAgICBkZXNlciA9IG5ldyBFbmRwb2ludFJlZmVyZW5jZSgiIik7Ci0gICAgICAgIEVuZHBvaW50UmVmZXJlbmNlSGVscGVyLmZyb21PTShkZXNlciwgb20sIEFkZHJlc3NpbmdDb25zdGFudHMuRmluYWwuV1NBX05BTUVTUEFDRSk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKGVwci5nZXRBZGRyZXNzKCksIGRlc2VyLmdldEFkZHJlc3MoKSk7Ci0gICAgICAgIGFkZHJBdHRycyA9IGRlc2VyLmdldEFkZHJlc3NBdHRyaWJ1dGVzKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhhdHRyMSwgYWRkckF0dHJzLmdldCgwKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhhdHRyMiwgYWRkckF0dHJzLmdldCgxKSk7Ci0KLSAgICAgICAgYXR0cnMgPSBkZXNlci5nZXRBdHRyaWJ1dGVzKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhhdHRyMSwgYXR0cnMuZ2V0KDApKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGF0dHIyLCBhdHRycy5nZXQoMSkpOwotCi0gICAgICAgIG1ldGFkYXRhID0gZGVzZXIuZ2V0TWV0YURhdGEoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG1kMSwgbWV0YWRhdGEuZ2V0KDApKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG1kMiwgbWV0YWRhdGEuZ2V0KDEpKTsKLSAgICAgICAgbWRBdHRycyA9IGRlc2VyLmdldE1ldGFkYXRhQXR0cmlidXRlcygpOwotICAgICAgICBhc3NlcnRFcXVhbHMoYXR0cjEsIG1kQXR0cnMuZ2V0KDApKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGF0dHIyLCBtZEF0dHJzLmdldCgxKSk7Ci0KLSAgICAgICAgZXh0ZWx0cyA9IGRlc2VyLmdldEV4dGVuc2libGVFbGVtZW50cygpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZXh0MSwgZXh0ZWx0cy5nZXQoMCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZXh0MiwgZXh0ZWx0cy5nZXQoMSkpOwotCi0gICAgICAgIG0gPSBkZXNlci5nZXRBbGxSZWZlcmVuY2VQYXJhbWV0ZXJzKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygicnAxIiwgKChPTUVsZW1lbnQpIG0uZ2V0KHJwMVFuYW1lKSkuZ2V0VGV4dCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJycDIiLCAoKE9NRWxlbWVudCkgbS5nZXQocnAyUW5hbWUpKS5nZXRUZXh0KCkpOwotCi0gICAgICAgIC8vRmFpbHVyZSB0ZXN0Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBkZXNlciA9IG5ldyBFbmRwb2ludFJlZmVyZW5jZSgiIik7Ci0gICAgICAgICAgICBFbmRwb2ludFJlZmVyZW5jZUhlbHBlci5mcm9tT00oZGVzZXIsIG9tLCBBZGRyZXNzaW5nQ29uc3RhbnRzLlN1Ym1pc3Npb24uV1NBX05BTUVTUEFDRSk7Ci0gICAgICAgICAgICBmYWlsKCJBbiBleGNlcHRpb24gc2hvdWxkIGhhdmUgYmVlbiB0aHJvd24gZHVlIHRvIGZhaWx1cmUgdG8gbG9jYXRlIGEgd3NhOkFkZHJlc3MgZmllbGQuIik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvL3Bhc3MKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RUb0FuZEZyb21PTUZvclN1Ym1pc3Npb25TcGVjRVBSKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBhZGRyZXNzID0gImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyIjsKLSAgICAgICAgRW5kcG9pbnRSZWZlcmVuY2UgZXByID0gbmV3IEVuZHBvaW50UmVmZXJlbmNlKGFkZHJlc3MpOwotCi0gICAgICAgIE9NRmFjdG9yeSBvbWYgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKTsKLSAgICAgICAgT01OYW1lc3BhY2UgbnMxID0gb21mLmNyZWF0ZU9NTmFtZXNwYWNlKCJodHRwOi8vdXJpMSIsICJwcmVmaXgxIik7Ci0gICAgICAgIE9NQXR0cmlidXRlIGF0dHIxID0gb21mLmNyZWF0ZU9NQXR0cmlidXRlKCJhdHRyMSIsIG5zMSwgImF0dHIxdmFsdWUiKTsKLSAgICAgICAgT01OYW1lc3BhY2UgbnMyID0gb21mLmNyZWF0ZU9NTmFtZXNwYWNlKCJodHRwOi8vdXJpMiIsICJwcmVmaXgyIik7Ci0gICAgICAgIE9NQXR0cmlidXRlIGF0dHIyID0gb21mLmNyZWF0ZU9NQXR0cmlidXRlKCJhdHRyMiIsIG5zMiwgImF0dHIydmFsdWUiKTsKLSAgICAgICAgZXByLmFkZEF0dHJpYnV0ZShhdHRyMSk7Ci0gICAgICAgIGVwci5hZGRBdHRyaWJ1dGUoYXR0cjIpOwotICAgICAgICBPTUVsZW1lbnQgbWQxID0gb21mLmNyZWF0ZU9NRWxlbWVudCgibWQxIiwgImh0dHA6Ly9tZHVyaTEiLCAibWQxcHJlZml4Iik7Ci0gICAgICAgIE9NRWxlbWVudCBtZDIgPSBvbWYuY3JlYXRlT01FbGVtZW50KCJtZDIiLCAiaHR0cDovL21kdXJpMiIsICJtZDJwcmVmaXgiKTsKLSAgICAgICAgZXByLmFkZE1ldGFEYXRhKG1kMSk7Ci0gICAgICAgIGVwci5hZGRNZXRhRGF0YShtZDIpOwotICAgICAgICBPTUVsZW1lbnQgZXh0MSA9IG9tZi5jcmVhdGVPTUVsZW1lbnQoImV4dDEiLCAiaHR0cDovL2V4dHVyaTEiLCAiZXh0MXByZWZpeCIpOwotICAgICAgICBPTUVsZW1lbnQgZXh0MiA9IG9tZi5jcmVhdGVPTUVsZW1lbnQoImV4dDIiLCAiaHR0cDovL2V4dHVyaTIiLCAiZXh0MnByZWZpeCIpOwotICAgICAgICBlcHIuYWRkRXh0ZW5zaWJsZUVsZW1lbnQoZXh0MSk7Ci0gICAgICAgIGVwci5hZGRFeHRlbnNpYmxlRWxlbWVudChleHQyKTsKLSAgICAgICAgUU5hbWUgcnAxUW5hbWUgPSBuZXcgUU5hbWUoImh0dHA6Ly9ycDF1cmkiLCAicmVmUGFybTEiLCAicnAxcHJlZml4Iik7Ci0gICAgICAgIFFOYW1lIHJwMlFuYW1lID0gbmV3IFFOYW1lKCJodHRwOi8vcnAydXJpIiwgInJlZlBhcm0yIiwgInJwMnByZWZpeCIpOwotICAgICAgICBlcHIuYWRkUmVmZXJlbmNlUGFyYW1ldGVyKHJwMVFuYW1lLCAicnAxIik7Ci0gICAgICAgIGVwci5hZGRSZWZlcmVuY2VQYXJhbWV0ZXIocnAyUW5hbWUsICJycDIiKTsKLQotICAgICAgICBBcnJheUxpc3QgYWRkcmVzc0F0dHJpYnV0ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGFkZHJlc3NBdHRyaWJ1dGVzLmFkZChhdHRyMSk7Ci0gICAgICAgIGFkZHJlc3NBdHRyaWJ1dGVzLmFkZChhdHRyMik7Ci0gICAgICAgIGVwci5zZXRBZGRyZXNzQXR0cmlidXRlcyhhZGRyZXNzQXR0cmlidXRlcyk7Ci0KLSAgICAgICAgT01FbGVtZW50IG9tID0gRW5kcG9pbnRSZWZlcmVuY2VIZWxwZXIudG9PTShvbWYsIGVwciwgbmV3IFFOYW1lKCJodHRwOi8vbnN1cmwiLCAibG9jYWxOYW1lIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcmVmaXgiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzc2luZ0NvbnN0YW50cy5TdWJtaXNzaW9uLldTQV9OQU1FU1BBQ0UpOwotCi0gICAgICAgIC8vQWRkIHNvbWUgcmVmZXJlbmNlIHByb3BlcnRpZXMuCi0gICAgICAgIFFOYW1lIHAxUW5hbWUgPSBuZXcgUU5hbWUoImh0dHA6Ly9wMXVyaSIsICJyZWZQcm9wMSIsICJwMXByZWZpeCIpOwotICAgICAgICBRTmFtZSBwMlFuYW1lID0gbmV3IFFOYW1lKCJodHRwOi8vcDJ1cmkiLCAicmVmUHJvcDIiLCAicDJwcmVmaXgiKTsKLSAgICAgICAgUU5hbWUgcW5hbWUgPSBuZXcgUU5hbWUoQWRkcmVzc2luZ0NvbnN0YW50cy5TdWJtaXNzaW9uLldTQV9OQU1FU1BBQ0UsICJSZWZlcmVuY2VQcm9wZXJ0aWVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzc2luZ0NvbnN0YW50cy5XU0FfREVGQVVMVF9QUkVGSVgpOwotICAgICAgICBPTUVsZW1lbnQgcmVmZXJlbmNlUHJvcGVydGllcyA9IG9tZi5jcmVhdGVPTUVsZW1lbnQocW5hbWUsIG9tKTsKLSAgICAgICAgT01FbGVtZW50IHByb3AxID0gb21mLmNyZWF0ZU9NRWxlbWVudChwMVFuYW1lLCByZWZlcmVuY2VQcm9wZXJ0aWVzKTsKLSAgICAgICAgT01FbGVtZW50IHByb3AyID0gb21mLmNyZWF0ZU9NRWxlbWVudChwMlFuYW1lLCByZWZlcmVuY2VQcm9wZXJ0aWVzKTsKLSAgICAgICAgcHJvcDEuc2V0VGV4dCgicDEiKTsKLSAgICAgICAgcHJvcDIuc2V0VGV4dCgicDIiKTsKLQotICAgICAgICAvL1Rlc3QgZGVzZXJpYWxpemUgdXNpbmcgZnJvbU9NKE9NRWxlbWVudCkKLSAgICAgICAgRW5kcG9pbnRSZWZlcmVuY2UgZGVzZXIgPSBFbmRwb2ludFJlZmVyZW5jZUhlbHBlci5mcm9tT00ob20pOwotCi0gICAgICAgIGFzc2VydEVxdWFscyhlcHIuZ2V0QWRkcmVzcygpLCBkZXNlci5nZXRBZGRyZXNzKCkpOwotICAgICAgICBBcnJheUxpc3QgYWRkckF0dHJzID0gZGVzZXIuZ2V0QWRkcmVzc0F0dHJpYnV0ZXMoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGF0dHIxLCBhZGRyQXR0cnMuZ2V0KDApKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGF0dHIyLCBhZGRyQXR0cnMuZ2V0KDEpKTsKLQotICAgICAgICBBcnJheUxpc3QgYXR0cnMgPSBkZXNlci5nZXRBdHRyaWJ1dGVzKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhhdHRyMSwgYXR0cnMuZ2V0KDApKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGF0dHIyLCBhdHRycy5nZXQoMSkpOwotCi0gICAgICAgIC8vTWV0YWRhdGEgd2lsbCBiZSBsb3N0IHVubGVzcyBpdCBpcyBzYXZlZCBhcyBhbiBleHRlbnNpYmlsaXR5IGVsZW1lbnQuCi0gICAgICAgIEFycmF5TGlzdCBtZXRhZGF0YSA9IGRlc2VyLmdldE1ldGFEYXRhKCk7Ci0gICAgICAgIGFzc2VydE51bGwobWV0YWRhdGEpOwotCi0gICAgICAgIEFycmF5TGlzdCBleHRlbHRzID0gZGVzZXIuZ2V0RXh0ZW5zaWJsZUVsZW1lbnRzKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhleHQxLCBleHRlbHRzLmdldCgwKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhleHQyLCBleHRlbHRzLmdldCgxKSk7Ci0KLSAgICAgICAgLy9BbGwgcmVmZXJlbmNlIHByb3BlcnRpZXMgYXJlIHJldHVybmVkIGFzIHJlZmVyZW5jZSBwYXJhbWV0ZXJzLgotICAgICAgICBNYXAgbSA9IGRlc2VyLmdldEFsbFJlZmVyZW5jZVBhcmFtZXRlcnMoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDQsIG0uc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJycDEiLCAoKE9NRWxlbWVudCkgbS5nZXQocnAxUW5hbWUpKS5nZXRUZXh0KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInJwMiIsICgoT01FbGVtZW50KSBtLmdldChycDJRbmFtZSkpLmdldFRleHQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygicDEiLCAoKE9NRWxlbWVudCkgbS5nZXQocDFRbmFtZSkpLmdldFRleHQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygicDIiLCAoKE9NRWxlbWVudCkgbS5nZXQocDJRbmFtZSkpLmdldFRleHQoKSk7Ci0KLSAgICAgICAgLy9UZXN0IGRlc2VyaWFsaXplIHVzaW5nIGZyb21PTShFbmRwb2ludFJlZmVyZW5jZSwgT01FbGVtZW50LCBTdHJpbmcpCi0gICAgICAgIGRlc2VyID0gbmV3IEVuZHBvaW50UmVmZXJlbmNlKCIiKTsKLSAgICAgICAgRW5kcG9pbnRSZWZlcmVuY2VIZWxwZXIuZnJvbU9NKGRlc2VyLCBvbSwgQWRkcmVzc2luZ0NvbnN0YW50cy5TdWJtaXNzaW9uLldTQV9OQU1FU1BBQ0UpOwotCi0gICAgICAgIGFzc2VydEVxdWFscyhlcHIuZ2V0QWRkcmVzcygpLCBkZXNlci5nZXRBZGRyZXNzKCkpOwotICAgICAgICBhZGRyQXR0cnMgPSBkZXNlci5nZXRBZGRyZXNzQXR0cmlidXRlcygpOwotICAgICAgICBhc3NlcnRFcXVhbHMoYXR0cjEsIGFkZHJBdHRycy5nZXQoMCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoYXR0cjIsIGFkZHJBdHRycy5nZXQoMSkpOwotCi0gICAgICAgIGF0dHJzID0gZGVzZXIuZ2V0QXR0cmlidXRlcygpOwotICAgICAgICBhc3NlcnRFcXVhbHMoYXR0cjEsIGF0dHJzLmdldCgwKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhhdHRyMiwgYXR0cnMuZ2V0KDEpKTsKLQotICAgICAgICAvL01ldGFkYXRhIHdpbGwgYmUgbG9zdCB1bmxlc3MgaXQgaXMgc2F2ZWQgYXMgYW4gZXh0ZW5zaWJpbGl0eSBlbGVtZW50LgotICAgICAgICBtZXRhZGF0YSA9IGRlc2VyLmdldE1ldGFEYXRhKCk7Ci0gICAgICAgIGFzc2VydE51bGwobWV0YWRhdGEpOwotCi0gICAgICAgIGV4dGVsdHMgPSBkZXNlci5nZXRFeHRlbnNpYmxlRWxlbWVudHMoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGV4dDEsIGV4dGVsdHMuZ2V0KDApKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGV4dDIsIGV4dGVsdHMuZ2V0KDEpKTsKLQotICAgICAgICAvL0FsbCByZWZlcmVuY2UgcHJvcGVydGllcyBhcmUgcmV0dXJuZWQgYXMgcmVmZXJlbmNlIHBhcmFtZXRlcnMuCi0gICAgICAgIG0gPSBkZXNlci5nZXRBbGxSZWZlcmVuY2VQYXJhbWV0ZXJzKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyg0LCBtLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygicnAxIiwgKChPTUVsZW1lbnQpIG0uZ2V0KHJwMVFuYW1lKSkuZ2V0VGV4dCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJycDIiLCAoKE9NRWxlbWVudCkgbS5nZXQocnAyUW5hbWUpKS5nZXRUZXh0KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInAxIiwgKChPTUVsZW1lbnQpIG0uZ2V0KHAxUW5hbWUpKS5nZXRUZXh0KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInAyIiwgKChPTUVsZW1lbnQpIG0uZ2V0KHAyUW5hbWUpKS5nZXRUZXh0KCkpOwotCi0gICAgICAgIC8vRmFpbHVyZSB0ZXN0Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBkZXNlciA9IG5ldyBFbmRwb2ludFJlZmVyZW5jZSgiIik7Ci0gICAgICAgICAgICBFbmRwb2ludFJlZmVyZW5jZUhlbHBlci5mcm9tT00oZGVzZXIsIG9tLCBBZGRyZXNzaW5nQ29uc3RhbnRzLkZpbmFsLldTQV9OQU1FU1BBQ0UpOwotICAgICAgICAgICAgZmFpbCgiQW4gZXhjZXB0aW9uIHNob3VsZCBoYXZlIGJlZW4gdGhyb3duIGR1ZSB0byBmYWlsdXJlIHRvIGxvY2F0ZSBhIHdzYTpBZGRyZXNzIGZpZWxkLiIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy9wYXNzCi0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2FkZHJlc3NpbmcvRW5kcG9pbnRSZWZlcmVuY2VUeXBlVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9hZGRyZXNzaW5nL0VuZHBvaW50UmVmZXJlbmNlVHlwZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzY2NGRkYS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2FkZHJlc3NpbmcvRW5kcG9pbnRSZWZlcmVuY2VUeXBlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTmFtZXNwYWNlOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0KLXB1YmxpYyBjbGFzcyBFbmRwb2ludFJlZmVyZW5jZVR5cGVUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgRW5kcG9pbnRSZWZlcmVuY2UgZW5kcG9pbnRSZWZlcmVuY2U7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgYWRkcmVzcyA9ICJodHR0cDovL3d3d3cub3Blbm91cmNlLmxrL35jaGludGhha2EiOwotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotICAgICAgICBUZXN0UnVubmVyLnJ1bihFbmRwb2ludFJlZmVyZW5jZVR5cGVUZXN0LmNsYXNzKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEBzZWUgVGVzdENhc2Ujc2V0VXAoKQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgICAgIGVuZHBvaW50UmVmZXJlbmNlID0gbmV3IEVuZHBvaW50UmVmZXJlbmNlKGFkZHJlc3MpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRBbmRTZXRBZGRyZXNzKCkgewotICAgICAgICBhc3NlcnRFcXVhbHMoIkFkZHJlc3Mgbm90IHNldCBwcm9wZXJseSBpbiB0aGUgY29uc3RydWN0b3IiLAotICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgIGVuZHBvaW50UmVmZXJlbmNlLmdldEFkZHJlc3MoKSk7Ci0KLSAgICAgICAgU3RyaW5nIG5ld0FkZHJlc3MgPSAiaHR0cDovL3d3dy5heGlzMi5jb20iOwotICAgICAgICBlbmRwb2ludFJlZmVyZW5jZS5zZXRBZGRyZXNzKG5ld0FkZHJlc3MpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkFkZHJlc3Mgbm90IHNldCBwcm9wZXJseSBpbiB0aGUgc2V0dGVyIG1ldGhvZCIsCi0gICAgICAgICAgICAgICAgICAgICBuZXdBZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgZW5kcG9pbnRSZWZlcmVuY2UuZ2V0QWRkcmVzcygpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QW5kU2V0UmVmZXJlbmNlUGFyYW1ldGVycygpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7Ci0gICAgICAgICAgICBlbmRwb2ludFJlZmVyZW5jZS5hZGRSZWZlcmVuY2VQYXJhbWV0ZXIoCi0gICAgICAgICAgICAgICAgICAgIG5ldyBRTmFtZSgiaHR0cDovL3d3dy5vcGVuc291Y2UubGsvIiArIGksICIiICsgaSksCi0gICAgICAgICAgICAgICAgICAgICJ2YWx1ZSAiICsgaSAqIDUwKTsKLSAgICAgICAgfQotCi0gICAgICAgIE1hcCByZXRyaWV2ZWRSZWZlcmVuY2VQYXJhbWV0ZXJzID0gZW5kcG9pbnRSZWZlcmVuY2UuZ2V0QWxsUmVmZXJlbmNlUGFyYW1ldGVycygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKLSAgICAgICAgICAgIE9NRWxlbWVudCByZWZlcmVuY2VQYXJhbWV0ZXIgPSAoT01FbGVtZW50KSByZXRyaWV2ZWRSZWZlcmVuY2VQYXJhbWV0ZXJzLmdldCgKLSAgICAgICAgICAgICAgICAgICAgbmV3IFFOYW1lKCJodHRwOi8vd3d3Lm9wZW5zb3VjZS5say8iICsgaSwgIiIgKyBpKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICAgICAgICAgICAgICJJbnB1dCB2YWx1ZSBkaWZmZXJzIGZyb20gd2hhdCBpcyB0YWtlbiBvdXQgZnJvbSBBbnlDb250ZW50VHlwZSIsCi0gICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZVBhcmFtZXRlci5nZXRUZXh0KCksCi0gICAgICAgICAgICAgICAgICAgICJ2YWx1ZSAiICsgaSAqIDUwKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RIYXNBbm9ueW1vdXNBZGRyZXNzKCkgewotICAgICAgICAvLyBEZWZhdWx0IEVuZHBvaW50UmVmZXJlbmNlIGRvZXMgbm90IGhhcyAnYW5vbnltb3VzIGFkZHJlc3MnCi0gICAgICAgIGFzc2VydEZhbHNlKGVuZHBvaW50UmVmZXJlbmNlLmhhc0Fub255bW91c0FkZHJlc3MoKSk7Ci0KLSAgICAgICAgLy8gRW5kcG9pbnRSZWZlcmVuY2Ugd2l0aCAyMDA1LzA4IEFub255bW91cyBhZGRyZXNzCi0gICAgICAgIEVuZHBvaW50UmVmZXJlbmNlIGVwcjIwMDUwOGFub24gPQotICAgICAgICAgICAgICAgIG5ldyBFbmRwb2ludFJlZmVyZW5jZShBZGRyZXNzaW5nQ29uc3RhbnRzLkZpbmFsLldTQV9BTk9OWU1PVVNfVVJMKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShlcHIyMDA1MDhhbm9uLmhhc0Fub255bW91c0FkZHJlc3MoKSk7Ci0KLSAgICAgICAgLy8gRW5kcG9pbnRSZWZlcmVuY2Ugd2l0aCAyMDA0LzA4IEFub255bW91cyBhZGRyZXNzCi0gICAgICAgIEVuZHBvaW50UmVmZXJlbmNlIGVwcjIwMDQwOGFub24gPQotICAgICAgICAgICAgICAgIG5ldyBFbmRwb2ludFJlZmVyZW5jZShBZGRyZXNzaW5nQ29uc3RhbnRzLlN1Ym1pc3Npb24uV1NBX0FOT05ZTU9VU19VUkwpOwotICAgICAgICBhc3NlcnRUcnVlKGVwcjIwMDQwOGFub24uaGFzQW5vbnltb3VzQWRkcmVzcygpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SGFzTm9uZUFkZHJlc3MoKSB7Ci0gICAgICAgIC8vIERlZmF1bHQgRW5kcG9pbnRSZWZlcmVuY2UgZG9lcyBub3QgaGFzICdhbm9ueW1vdXMgYWRkcmVzcycKLSAgICAgICAgYXNzZXJ0RmFsc2UoZW5kcG9pbnRSZWZlcmVuY2UuaGFzTm9uZUFkZHJlc3MoKSk7Ci0KLSAgICAgICAgLy8gRW5kcG9pbnRSZWZlcmVuY2Ugd2l0aCAyMDA1LzA4IE5vbmUgYWRkcmVzcwotICAgICAgICBFbmRwb2ludFJlZmVyZW5jZSBlcHIyMDA1MDhub25lID0KLSAgICAgICAgICAgICAgICBuZXcgRW5kcG9pbnRSZWZlcmVuY2UoQWRkcmVzc2luZ0NvbnN0YW50cy5GaW5hbC5XU0FfTk9ORV9VUkkpOwotICAgICAgICBhc3NlcnRUcnVlKGVwcjIwMDUwOG5vbmUuaGFzTm9uZUFkZHJlc3MoKSk7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvbkRlc2VyaWFsaXphdGlvbigpCi0gICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIGFkZHJlc3MgPSAiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIiOwotICAgICAgICBFbmRwb2ludFJlZmVyZW5jZSBlcHIgPSBuZXcgRW5kcG9pbnRSZWZlcmVuY2UoYWRkcmVzcyk7Ci0KLSAgICAgICAgT01GYWN0b3J5IG9tZiA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpOwotICAgICAgICBPTU5hbWVzcGFjZSBuczEgPSBvbWYuY3JlYXRlT01OYW1lc3BhY2UoImh0dHA6Ly91cmkxIiwgInByZWZpeDEiKTsKLSAgICAgICAgT01BdHRyaWJ1dGUgYXR0cjEgPSBvbWYuY3JlYXRlT01BdHRyaWJ1dGUoImF0dHIxIiwgbnMxLCAiYXR0cjF2YWx1ZSIpOwotICAgICAgICBPTU5hbWVzcGFjZSBuczIgPSBvbWYuY3JlYXRlT01OYW1lc3BhY2UoImh0dHA6Ly91cmkyIiwgInByZWZpeDIiKTsKLSAgICAgICAgT01BdHRyaWJ1dGUgYXR0cjIgPSBvbWYuY3JlYXRlT01BdHRyaWJ1dGUoImF0dHIyIiwgbnMyLCAiYXR0cjJ2YWx1ZSIpOwotICAgICAgICBlcHIuYWRkQXR0cmlidXRlKGF0dHIxKTsKLSAgICAgICAgZXByLmFkZEF0dHJpYnV0ZShhdHRyMik7Ci0gICAgICAgIE9NRWxlbWVudCBtZDEgPSBvbWYuY3JlYXRlT01FbGVtZW50KCJtZDEiLCAiaHR0cDovL21kdXJpMSIsICJtZDFwcmVmaXgiKTsKLSAgICAgICAgT01FbGVtZW50IG1kMiA9IG9tZi5jcmVhdGVPTUVsZW1lbnQoIm1kMiIsICJodHRwOi8vbWR1cmkyIiwgIm1kMnByZWZpeCIpOwotICAgICAgICBlcHIuYWRkTWV0YURhdGEobWQxKTsKLSAgICAgICAgZXByLmFkZE1ldGFEYXRhKG1kMik7Ci0gICAgICAgIE9NRWxlbWVudCBleHQxID0gb21mLmNyZWF0ZU9NRWxlbWVudCgiZXh0MSIsICJodHRwOi8vZXh0dXJpMSIsICJleHQxcHJlZml4Iik7Ci0gICAgICAgIE9NRWxlbWVudCBleHQyID0gb21mLmNyZWF0ZU9NRWxlbWVudCgiZXh0MiIsICJodHRwOi8vZXh0dXJpMiIsICJleHQycHJlZml4Iik7Ci0gICAgICAgIGVwci5hZGRFeHRlbnNpYmxlRWxlbWVudChleHQxKTsKLSAgICAgICAgZXByLmFkZEV4dGVuc2libGVFbGVtZW50KGV4dDIpOwotICAgICAgICBRTmFtZSBycDFRbmFtZSA9IG5ldyBRTmFtZSgiaHR0cDovL3JwMXVyaSIsICJyZWZQYXJtMSIsICJycDFwcmVmaXgiKTsKLSAgICAgICAgUU5hbWUgcnAyUW5hbWUgPSBuZXcgUU5hbWUoImh0dHA6Ly9ycDJ1cmkiLCAicmVmUGFybTIiLCAicnAycHJlZml4Iik7Ci0gICAgICAgIGVwci5hZGRSZWZlcmVuY2VQYXJhbWV0ZXIocnAxUW5hbWUsICJycDEiKTsKLSAgICAgICAgZXByLmFkZFJlZmVyZW5jZVBhcmFtZXRlcihycDJRbmFtZSwgInJwMiIpOwotCi0gICAgICAgIEFycmF5TGlzdCBhZGRyZXNzQXR0cmlidXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgYWRkcmVzc0F0dHJpYnV0ZXMuYWRkKGF0dHIxKTsKLSAgICAgICAgYWRkcmVzc0F0dHJpYnV0ZXMuYWRkKGF0dHIyKTsKLSAgICAgICAgZXByLnNldEFkZHJlc3NBdHRyaWJ1dGVzKGFkZHJlc3NBdHRyaWJ1dGVzKTsKLQotICAgICAgICBBcnJheUxpc3QgbWV0YWRhdGFBdHRyaWJ1dGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBtZXRhZGF0YUF0dHJpYnV0ZXMuYWRkKGF0dHIxKTsKLSAgICAgICAgbWV0YWRhdGFBdHRyaWJ1dGVzLmFkZChhdHRyMik7Ci0gICAgICAgIGVwci5zZXRNZXRhZGF0YUF0dHJpYnV0ZXMobWV0YWRhdGFBdHRyaWJ1dGVzKTsKLQotICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgT2JqZWN0T3V0cHV0U3RyZWFtIG9vcyA9IG5ldyBPYmplY3RPdXRwdXRTdHJlYW0oYmFvcyk7Ci0gICAgICAgIG9vcy53cml0ZU9iamVjdChlcHIpOwotCi0gICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGJhaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKTsKLSAgICAgICAgT2JqZWN0SW5wdXRTdHJlYW0gb2lzID0gbmV3IE9iamVjdElucHV0U3RyZWFtKGJhaXMpOwotICAgICAgICBFbmRwb2ludFJlZmVyZW5jZSBkZXNlcmlhbGl6ZWRFUFIgPSAoRW5kcG9pbnRSZWZlcmVuY2UpIG9pcy5yZWFkT2JqZWN0KCk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKGVwci5nZXRBZGRyZXNzKCksIGRlc2VyaWFsaXplZEVQUi5nZXRBZGRyZXNzKCkpOwotICAgICAgICBBcnJheUxpc3QgYWRkckF0dHJzID0gZGVzZXJpYWxpemVkRVBSLmdldEFkZHJlc3NBdHRyaWJ1dGVzKCk7Ci0gICAgICAgIGFzc2VydEF0dHJpYnV0ZXNFcXVhbChhdHRyMSwgKE9NQXR0cmlidXRlKSBhZGRyQXR0cnMuZ2V0KDApKTsKLSAgICAgICAgYXNzZXJ0QXR0cmlidXRlc0VxdWFsKGF0dHIyLCAoT01BdHRyaWJ1dGUpIGFkZHJBdHRycy5nZXQoMSkpOwotCi0gICAgICAgIEFycmF5TGlzdCBhdHRycyA9IGRlc2VyaWFsaXplZEVQUi5nZXRBdHRyaWJ1dGVzKCk7Ci0gICAgICAgIGFzc2VydEF0dHJpYnV0ZXNFcXVhbChhdHRyMSwgKE9NQXR0cmlidXRlKSBhdHRycy5nZXQoMCkpOwotICAgICAgICBhc3NlcnRBdHRyaWJ1dGVzRXF1YWwoYXR0cjIsIChPTUF0dHJpYnV0ZSkgYXR0cnMuZ2V0KDEpKTsKLQotICAgICAgICBBcnJheUxpc3QgbWV0YWRhdGEgPSBkZXNlcmlhbGl6ZWRFUFIuZ2V0TWV0YURhdGEoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG1kMS50b1N0cmluZygpLCBtZXRhZGF0YS5nZXQoMCkudG9TdHJpbmcoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhtZDIudG9TdHJpbmcoKSwgbWV0YWRhdGEuZ2V0KDEpLnRvU3RyaW5nKCkpOwotICAgICAgICBBcnJheUxpc3QgbWRBdHRycyA9IGRlc2VyaWFsaXplZEVQUi5nZXRNZXRhZGF0YUF0dHJpYnV0ZXMoKTsKLSAgICAgICAgYXNzZXJ0QXR0cmlidXRlc0VxdWFsKGF0dHIxLCAoT01BdHRyaWJ1dGUpIG1kQXR0cnMuZ2V0KDApKTsKLSAgICAgICAgYXNzZXJ0QXR0cmlidXRlc0VxdWFsKGF0dHIyLCAoT01BdHRyaWJ1dGUpIG1kQXR0cnMuZ2V0KDEpKTsKLQotICAgICAgICBBcnJheUxpc3QgZXh0ZWx0cyA9IGRlc2VyaWFsaXplZEVQUi5nZXRFeHRlbnNpYmxlRWxlbWVudHMoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGV4dDEudG9TdHJpbmcoKSwgZXh0ZWx0cy5nZXQoMCkudG9TdHJpbmcoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhleHQyLnRvU3RyaW5nKCksIGV4dGVsdHMuZ2V0KDEpLnRvU3RyaW5nKCkpOwotCi0gICAgICAgIE1hcCBtID0gZGVzZXJpYWxpemVkRVBSLmdldEFsbFJlZmVyZW5jZVBhcmFtZXRlcnMoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJycDEiLCAoKE9NRWxlbWVudCkgbS5nZXQocnAxUW5hbWUpKS5nZXRUZXh0KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInJwMiIsICgoT01FbGVtZW50KSBtLmdldChycDJRbmFtZSkpLmdldFRleHQoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFzc2VydEF0dHJpYnV0ZXNFcXVhbChPTUF0dHJpYnV0ZSBhdHRyaWJ1dGUxLCBPTUF0dHJpYnV0ZSBhdHRyaWJ1dGUyKSB7Ci0gICAgICAgIGlmICghYXR0cmlidXRlMS5nZXRBdHRyaWJ1dGVWYWx1ZSgpLmVxdWFscyhhdHRyaWJ1dGUyLmdldEF0dHJpYnV0ZVZhbHVlKCkpCi0gICAgICAgICAgICAgICAgfHwgKCFhdHRyaWJ1dGUxLmdldFFOYW1lKCkuZXF1YWxzKGF0dHJpYnV0ZTIuZ2V0UU5hbWUoKSkpKSB7Ci0gICAgICAgICAgICBmYWlsKCJleHBlY3RlZDoiICsgYXR0cmlidXRlMS5nZXRRTmFtZSgpICsgIj0iCi0gICAgICAgICAgICAgICAgICAgICsgYXR0cmlidXRlMS5nZXRBdHRyaWJ1dGVWYWx1ZSgpICsgIiBidXQgZ290ICIgKyBhdHRyaWJ1dGUyLmdldFFOYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgKyAiPSIgKyBhdHRyaWJ1dGUyLmdldEF0dHJpYnV0ZVZhbHVlKCkpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9hZGRyZXNzaW5nL21paGVhZGVycy9SZWxhdGVzVG9UZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2FkZHJlc3NpbmcvbWloZWFkZXJzL1JlbGF0ZXNUb1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE1YTAxYS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2FkZHJlc3NpbmcvbWloZWFkZXJzL1JlbGF0ZXNUb1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLm1paGVhZGVyczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuUmVsYXRlc1RvOwotCi0KLXB1YmxpYyBjbGFzcyBSZWxhdGVzVG9UZXN0IGV4dGVuZHMgVGVzdENhc2UgewotICAgIHByaXZhdGUgUmVsYXRlc1RvIHJlbGF0ZXNUbzsKLSAgICBTdHJpbmcgYWRkcmVzcyA9ICJ3d3cuc29tZWFkZHJlc3MuY29tIjsKLSAgICBTdHJpbmcgcmVsYXRpb25zaGlwVHlwZSA9ICJSZXBseSI7Ci0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgVGVzdFJ1bm5lci5ydW4oUmVsYXRlc1RvVGVzdC5jbGFzcyk7Ci0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEdldEFkZHJlc3MoKSB7Ci0gICAgICAgIHJlbGF0ZXNUbyA9IG5ldyBSZWxhdGVzVG8oYWRkcmVzcywgcmVsYXRpb25zaGlwVHlwZSk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAgICAgICAgICJSZWxhdGVzVG8gYWRkcmVzcyBoYXMgbm90IGJlZW4gc2V0IHByb3Blcmx5IGluIHRoZSBjb25zdHJ1Y3RvciIsCi0gICAgICAgICAgICAgICAgcmVsYXRlc1RvLmdldFZhbHVlKCksCi0gICAgICAgICAgICAgICAgYWRkcmVzcyk7Ci0KLSAgICAgICAgU3RyaW5nIG5ld0FkZHJlc3MgPSAid3d3Lm5ld1JlbGF0aW9uLm9yZyI7Ci0gICAgICAgIHJlbGF0ZXNUby5zZXRWYWx1ZShuZXdBZGRyZXNzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJSZWxhdGVzVG8gYWRkcmVzcyBoYXMgbm90IGJlZW4gZ2V0L3NldCBwcm9wZXJseSIsCi0gICAgICAgICAgICAgICAgICAgICByZWxhdGVzVG8uZ2V0VmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgICAgIG5ld0FkZHJlc3MpOwotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEdldFJlbGF0aW9uc2hpcFR5cGUoKSB7Ci0gICAgICAgIHJlbGF0ZXNUbyA9IG5ldyBSZWxhdGVzVG8oYWRkcmVzcywgcmVsYXRpb25zaGlwVHlwZSk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAgICAgICAgICJSZWxhdGVzVG8gUmVsYXRpb25zaGlwVHlwZSBoYXMgbm90IGJlZW4gc2V0IHByb3Blcmx5IGluIHRoZSBjb25zdHJ1Y3RvciIsCi0gICAgICAgICAgICAgICAgcmVsYXRlc1RvLmdldFJlbGF0aW9uc2hpcFR5cGUoKSwKLSAgICAgICAgICAgICAgICByZWxhdGlvbnNoaXBUeXBlKTsKLQotICAgICAgICBTdHJpbmcgbmV3UmVsYXRpb25zaGlwVHlwZSA9ICJBbnlPdGhlclR5cGUiOwotICAgICAgICByZWxhdGVzVG8uc2V0UmVsYXRpb25zaGlwVHlwZShuZXdSZWxhdGlvbnNoaXBUeXBlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJSZWxhdGVzVG8gYWRkcmVzcyBoYXMgbm90IGJlZW4gZ2V0L3NldCBwcm9wZXJseSIsCi0gICAgICAgICAgICAgICAgICAgICByZWxhdGVzVG8uZ2V0UmVsYXRpb25zaGlwVHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgbmV3UmVsYXRpb25zaGlwVHlwZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNpbmdsZUFyZ3VtZW50Q29uc3RydWN0b3IoKSB7Ci0gICAgICAgIHJlbGF0ZXNUbyA9IG5ldyBSZWxhdGVzVG8oYWRkcmVzcyk7Ci0gICAgICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgICAgICAgICAiUmVsYXRlc1RvIGFkZHJlc3MgaGFzIG5vdCBiZWVuIHNldCBwcm9wZXJseSBpbiB0aGUgY29uc3RydWN0b3IiLAotICAgICAgICAgICAgICAgIHJlbGF0ZXNUby5nZXRWYWx1ZSgpLAotICAgICAgICAgICAgICAgIGFkZHJlc3MpOwotCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2FkZHJlc3Npbmcvd3NkbC9XU0RMMTFBY3Rpb25IZWxwZXJUZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2FkZHJlc3Npbmcvd3NkbC9XU0RMMTFBY3Rpb25IZWxwZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliMzFhMWQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9hZGRyZXNzaW5nL3dzZGwvV1NETDExQWN0aW9uSGVscGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLndzZGw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BYnN0cmFjdFRlc3RDYXNlOwotCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuRmF1bHQ7Ci1pbXBvcnQgamF2YXgud3NkbC5JbnB1dDsKLWltcG9ydCBqYXZheC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLk91dHB1dDsKLWltcG9ydCBqYXZheC53c2RsLlBvcnRUeXBlOwotaW1wb3J0IGphdmF4LndzZGwuZmFjdG9yeS5XU0RMRmFjdG9yeTsKLWltcG9ydCBqYXZheC53c2RsLnhtbC5XU0RMUmVhZGVyOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGNsYXNzIFdTREwxMUFjdGlvbkhlbHBlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBTdHJpbmcgdGVzdFdTRExGaWxlID0gIi90YXJnZXQvdGVzdC1yZXNvdXJjZXMvd3NkbC9hY3Rpb25UZXN0cy53c2RsIjsKLQotICAgIERlZmluaXRpb24gZGVmaW5pdGlvbjsKLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgICAgIFdTRExSZWFkZXIgcmVhZGVyID0gV1NETEZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdXU0RMUmVhZGVyKCk7Ci0gICAgICAgIHJlYWRlci5zZXRGZWF0dXJlKCJqYXZheC53c2RsLmltcG9ydERvY3VtZW50cyIsIGZhbHNlKTsKLSAgICAgICAgcmVhZGVyLnNldEZlYXR1cmUoImphdmF4LndzZGwudmVyYm9zZSIsIGZhbHNlKTsKLQotICAgICAgICBVUkwgd3NkbEZpbGUgPSBuZXcgRmlsZShBYnN0cmFjdFRlc3RDYXNlLmJhc2VkaXIgKyB0ZXN0V1NETEZpbGUpCi0gICAgICAgICAgICAgICAgLnRvVVJMKCk7Ly9nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkuZ2V0UmVzb3VyY2UodGVzdFdTRExGaWxlKTsKLSAgICAgICAgZGVmaW5pdGlvbiA9IHJlYWRlci5yZWFkV1NETCh3c2RsRmlsZS50b1N0cmluZygpKTsKLSAgICB9Ci0KLQotICAgIC8vIFRlc3QgRGVmYXVsdEFjdGlvblBhdHRlcm4gKG5vIG5hbWVzIGluIFdTREwpCi0gICAgLy8gVGVzdCBub3QgcmVxdWlyZWQgZm9yIEZhdWx0IGFzIEZhdWx0IGVsZW1lbnRzIE1VU1QgaGF2ZSBuYWVzIHBlciB0aGUgV1NETCAxLjEgc3BlYwotICAgIC8vICAgIHBvcnRUeXBlPXdpdGhvdXRXU0FXQWN0aW9uTm9OYW1lCi0gICAgLy8gb3BlcmF0aW9uPWVjaG8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2VuZXJhdGVJbnB1dEFjdGlvbk5vTmFtZXMoKSB7Ci0gICAgICAgIFN0cmluZyBleHBlY3RlZEFjdGlvbiA9Ci0gICAgICAgICAgICAgICAgImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL2FjdGlvbnRlc3Qvd2l0aG91dFdTQVdBY3Rpb25Ob05hbWUvZWNob1JlcXVlc3QiOwotICAgICAgICBQb3J0VHlwZSBwdCA9IGRlZmluaXRpb24uZ2V0UG9ydFR5cGUoCi0gICAgICAgICAgICAgICAgbmV3IFFOYW1lKCJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi9hY3Rpb250ZXN0LyIsICJ3aXRob3V0V1NBV0FjdGlvbk5vTmFtZSIpKTsKLSAgICAgICAgTGlzdCBvcGVyYXRpb25zID0gcHQuZ2V0T3BlcmF0aW9ucygpOwotICAgICAgICBPcGVyYXRpb24gb3AgPSAoT3BlcmF0aW9uKSBvcGVyYXRpb25zLmdldCgwKTsKLSAgICAgICAgSW5wdXQgaW4gPSBvcC5nZXRJbnB1dCgpOwotICAgICAgICBTdHJpbmcgYWN0dWFsQWN0aW9uID0gV1NETDExQWN0aW9uSGVscGVyLmdldEFjdGlvbkZyb21JbnB1dEVsZW1lbnQoZGVmaW5pdGlvbiwgcHQsIG9wLCBpbik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZEFjdGlvbiwgYWN0dWFsQWN0aW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2VuZXJhdGVPdXRwdXRBY3Rpb25Ob05hbWVzKCkgewotICAgICAgICBTdHJpbmcgZXhwZWN0ZWRBY3Rpb24gPQotICAgICAgICAgICAgICAgICJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi9hY3Rpb250ZXN0L3dpdGhvdXRXU0FXQWN0aW9uTm9OYW1lL2VjaG9SZXNwb25zZSI7Ci0gICAgICAgIFBvcnRUeXBlIHB0ID0gZGVmaW5pdGlvbi5nZXRQb3J0VHlwZSgKLSAgICAgICAgICAgICAgICBuZXcgUU5hbWUoImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL2FjdGlvbnRlc3QvIiwgIndpdGhvdXRXU0FXQWN0aW9uTm9OYW1lIikpOwotICAgICAgICBMaXN0IG9wZXJhdGlvbnMgPSBwdC5nZXRPcGVyYXRpb25zKCk7Ci0gICAgICAgIE9wZXJhdGlvbiBvcCA9IChPcGVyYXRpb24pIG9wZXJhdGlvbnMuZ2V0KDApOwotICAgICAgICBPdXRwdXQgb3V0ID0gb3AuZ2V0T3V0cHV0KCk7Ci0gICAgICAgIFN0cmluZyBhY3R1YWxBY3Rpb24gPQotICAgICAgICAgICAgICAgIFdTREwxMUFjdGlvbkhlbHBlci5nZXRBY3Rpb25Gcm9tT3V0cHV0RWxlbWVudChkZWZpbml0aW9uLCBwdCwgb3AsIG91dCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZEFjdGlvbiwgYWN0dWFsQWN0aW9uKTsKLSAgICB9Ci0KLSAgICAvLyBUZXN0IERlZmF1bHRBY3Rpb25QYXR0ZXJuIChuYW1lcyBleHBsaWNpdGx5IHNldCBpbiBXU0RMKQotICAgIC8vICAgIHBvcnRUeXBlPXdpdGhvdXRXU0FXQWN0aW9uCi0gICAgLy8gb3BlcmF0aW9uPWVjaG8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2VuZXJhdGVJbnB1dEFjdGlvbigpIHsKLSAgICAgICAgU3RyaW5nIGV4cGVjdGVkQWN0aW9uID0KLSAgICAgICAgICAgICAgICAiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvYWN0aW9udGVzdC93aXRob3V0V1NBV0FjdGlvbi9OYW1lZElucHV0IjsKLSAgICAgICAgUG9ydFR5cGUgcHQgPSBkZWZpbml0aW9uLmdldFBvcnRUeXBlKAotICAgICAgICAgICAgICAgIG5ldyBRTmFtZSgiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvYWN0aW9udGVzdC8iLCAid2l0aG91dFdTQVdBY3Rpb24iKSk7Ci0gICAgICAgIExpc3Qgb3BlcmF0aW9ucyA9IHB0LmdldE9wZXJhdGlvbnMoKTsKLSAgICAgICAgT3BlcmF0aW9uIG9wID0gKE9wZXJhdGlvbikgb3BlcmF0aW9ucy5nZXQoMCk7Ci0gICAgICAgIElucHV0IGluID0gb3AuZ2V0SW5wdXQoKTsKLSAgICAgICAgU3RyaW5nIGFjdHVhbEFjdGlvbiA9IFdTREwxMUFjdGlvbkhlbHBlci5nZXRBY3Rpb25Gcm9tSW5wdXRFbGVtZW50KGRlZmluaXRpb24sIHB0LCBvcCwgaW4pOwotICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRBY3Rpb24sIGFjdHVhbEFjdGlvbik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEdlbmVyYXRlT3V0cHV0QWN0aW9uKCkgewotICAgICAgICBTdHJpbmcgZXhwZWN0ZWRBY3Rpb24gPQotICAgICAgICAgICAgICAgICJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi9hY3Rpb250ZXN0L3dpdGhvdXRXU0FXQWN0aW9uL05hbWVkT3V0cHV0IjsKLSAgICAgICAgUG9ydFR5cGUgcHQgPSBkZWZpbml0aW9uLmdldFBvcnRUeXBlKAotICAgICAgICAgICAgICAgIG5ldyBRTmFtZSgiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvYWN0aW9udGVzdC8iLCAid2l0aG91dFdTQVdBY3Rpb24iKSk7Ci0gICAgICAgIExpc3Qgb3BlcmF0aW9ucyA9IHB0LmdldE9wZXJhdGlvbnMoKTsKLSAgICAgICAgT3BlcmF0aW9uIG9wID0gKE9wZXJhdGlvbikgb3BlcmF0aW9ucy5nZXQoMCk7Ci0gICAgICAgIE91dHB1dCBvdXQgPSBvcC5nZXRPdXRwdXQoKTsKLSAgICAgICAgU3RyaW5nIGFjdHVhbEFjdGlvbiA9Ci0gICAgICAgICAgICAgICAgV1NETDExQWN0aW9uSGVscGVyLmdldEFjdGlvbkZyb21PdXRwdXRFbGVtZW50KGRlZmluaXRpb24sIHB0LCBvcCwgb3V0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkQWN0aW9uLCBhY3R1YWxBY3Rpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RHZW5lcmF0ZUZhdWx0QWN0aW9uKCkgewotICAgICAgICBTdHJpbmcgZXhwZWN0ZWRBY3Rpb24gPQotICAgICAgICAgICAgICAgICJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi9hY3Rpb250ZXN0L3dpdGhvdXRXU0FXQWN0aW9uL2VjaG8vRmF1bHQvZWNob0ZhdWx0IjsKLSAgICAgICAgUG9ydFR5cGUgcHQgPSBkZWZpbml0aW9uLmdldFBvcnRUeXBlKAotICAgICAgICAgICAgICAgIG5ldyBRTmFtZSgiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvYWN0aW9udGVzdC8iLCAid2l0aG91dFdTQVdBY3Rpb24iKSk7Ci0gICAgICAgIExpc3Qgb3BlcmF0aW9ucyA9IHB0LmdldE9wZXJhdGlvbnMoKTsKLSAgICAgICAgT3BlcmF0aW9uIG9wID0gKE9wZXJhdGlvbikgb3BlcmF0aW9ucy5nZXQoMCk7Ci0gICAgICAgIEZhdWx0IGZhdWx0ID0gb3AuZ2V0RmF1bHQoImVjaG9GYXVsdCIpOwotICAgICAgICBTdHJpbmcgYWN0dWFsQWN0aW9uID0KLSAgICAgICAgICAgICAgICBXU0RMMTFBY3Rpb25IZWxwZXIuZ2V0QWN0aW9uRnJvbUZhdWx0RWxlbWVudChkZWZpbml0aW9uLCBwdCwgb3AsIGZhdWx0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkQWN0aW9uLCBhY3R1YWxBY3Rpb24pOwotICAgIH0KLQotICAgIC8vIFRlc3QgcmVhZGluZyB3c2F3OkFjdGlvbiB2YWx1ZXMKLSAgICAvLyBwb3J0VHlwZT13aXRoV1NBV0FjdGlvbgotICAgIC8vIG9wZXJhdGlvbj1lY2hvCi0gICAgcHVibGljIHZvaWQgdGVzdEdldFdTQVdJbnB1dEFjdGlvbigpIHsKLSAgICAgICAgU3RyaW5nIGV4cGVjdGVkQWN0aW9uID0gImh0dHA6Ly9leGFtcGxlLm9yZy9hY3Rpb24vZWNob0luIjsKLSAgICAgICAgUG9ydFR5cGUgcHQgPSBkZWZpbml0aW9uCi0gICAgICAgICAgICAgICAgLmdldFBvcnRUeXBlKG5ldyBRTmFtZSgiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvYWN0aW9udGVzdC8iLCAid2l0aFdTQVdBY3Rpb24iKSk7Ci0gICAgICAgIExpc3Qgb3BlcmF0aW9ucyA9IHB0LmdldE9wZXJhdGlvbnMoKTsKLSAgICAgICAgT3BlcmF0aW9uIG9wID0gKE9wZXJhdGlvbikgb3BlcmF0aW9ucy5nZXQoMCk7Ci0gICAgICAgIElucHV0IGluID0gb3AuZ2V0SW5wdXQoKTsKLSAgICAgICAgU3RyaW5nIGFjdHVhbEFjdGlvbiA9IFdTREwxMUFjdGlvbkhlbHBlci5nZXRBY3Rpb25Gcm9tSW5wdXRFbGVtZW50KGRlZmluaXRpb24sIHB0LCBvcCwgaW4pOwotICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRBY3Rpb24sIGFjdHVhbEFjdGlvbik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEdldFdTQVdPdXRwdXRBY3Rpb24oKSB7Ci0gICAgICAgIFN0cmluZyBleHBlY3RlZEFjdGlvbiA9ICJodHRwOi8vZXhhbXBsZS5vcmcvYWN0aW9uL2VjaG9PdXQiOwotICAgICAgICBQb3J0VHlwZSBwdCA9IGRlZmluaXRpb24KLSAgICAgICAgICAgICAgICAuZ2V0UG9ydFR5cGUobmV3IFFOYW1lKCJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi9hY3Rpb250ZXN0LyIsICJ3aXRoV1NBV0FjdGlvbiIpKTsKLSAgICAgICAgTGlzdCBvcGVyYXRpb25zID0gcHQuZ2V0T3BlcmF0aW9ucygpOwotICAgICAgICBPcGVyYXRpb24gb3AgPSAoT3BlcmF0aW9uKSBvcGVyYXRpb25zLmdldCgwKTsKLSAgICAgICAgT3V0cHV0IG91dCA9IG9wLmdldE91dHB1dCgpOwotICAgICAgICBTdHJpbmcgYWN0dWFsQWN0aW9uID0KLSAgICAgICAgICAgICAgICBXU0RMMTFBY3Rpb25IZWxwZXIuZ2V0QWN0aW9uRnJvbU91dHB1dEVsZW1lbnQoZGVmaW5pdGlvbiwgcHQsIG9wLCBvdXQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRBY3Rpb24sIGFjdHVhbEFjdGlvbik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEdldFdTQVdGYXVsdEFjdGlvbigpIHsKLSAgICAgICAgU3RyaW5nIGV4cGVjdGVkQWN0aW9uID0gImh0dHA6Ly9leGFtcGxlLm9yZy9hY3Rpb24vZWNob0ZhdWx0IjsKLSAgICAgICAgUG9ydFR5cGUgcHQgPSBkZWZpbml0aW9uCi0gICAgICAgICAgICAgICAgLmdldFBvcnRUeXBlKG5ldyBRTmFtZSgiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvYWN0aW9udGVzdC8iLCAid2l0aFdTQVdBY3Rpb24iKSk7Ci0gICAgICAgIExpc3Qgb3BlcmF0aW9ucyA9IHB0LmdldE9wZXJhdGlvbnMoKTsKLSAgICAgICAgT3BlcmF0aW9uIG9wID0gKE9wZXJhdGlvbikgb3BlcmF0aW9ucy5nZXQoMCk7Ci0gICAgICAgIEZhdWx0IGZhdWx0ID0gb3AuZ2V0RmF1bHQoImVjaG9GYXVsdCIpOwotICAgICAgICBTdHJpbmcgYWN0dWFsQWN0aW9uID0KLSAgICAgICAgICAgICAgICBXU0RMMTFBY3Rpb25IZWxwZXIuZ2V0QWN0aW9uRnJvbUZhdWx0RWxlbWVudChkZWZpbml0aW9uLCBwdCwgb3AsIGZhdWx0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkQWN0aW9uLCBhY3R1YWxBY3Rpb24pOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvYnVpbGRlci9TT0FQQnVpbGRlclRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvYnVpbGRlci9TT0FQQnVpbGRlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYxNDI1Ni4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2J1aWxkZXIvU09BUEJ1aWxkZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmJ1aWxkZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkFic3RyYWN0VGVzdENhc2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsNCi0NCi1pbXBvcnQgamF2YS5pby5GaWxlOw0KLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsNCi0NCi0NCi0vKioNCi0gKiBUZXN0cyBmb3IgU09BUEJ1aWxkZXINCi0gKi8NCi1wdWJsaWMgY2xhc3MgU09BUEJ1aWxkZXJUZXN0IGV4dGVuZHMgQWJzdHJhY3RUZXN0Q2FzZSB7DQotDQotICAgIHB1YmxpYyBTT0FQQnVpbGRlclRlc3QoU3RyaW5nIHRlc3ROYW1lKSB7DQotICAgICAgICBzdXBlcih0ZXN0TmFtZSk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFNpbXBsZSB0ZXN0IHRoZSBtYWtlcyBzdXJlIFNPQVBCdWlsZGVyIGJ1aWxkcyBhIGRvY3VtZW50IGFuZA0KLSAgICAgKiBoYXMgYSBjb250ZW50IGxlbmd0aA0KLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdCgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgRmlsZSBmaWxlID0gZ2V0VGVzdFJlc291cmNlRmlsZSgic29hcG1lc3NhZ2UueG1sIik7DQotICAgICAgICBTT0FQQnVpbGRlciBzb2FwQnVpbGRlciA9IG5ldyBTT0FQQnVpbGRlcigpOw0KLSAgICAgICAgRmlsZUlucHV0U3RyZWFtIGZpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSk7DQotICAgICAgICBNZXNzYWdlQ29udGV4dCBtYyA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOw0KLSAgICAgICAgT01FbGVtZW50IGVudmVsb3BlID0gc29hcEJ1aWxkZXIucHJvY2Vzc0RvY3VtZW50KGZpcywgInRleHQveG1sIiwgbWMpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShlbnZlbG9wZSAhPSBudWxsKTsNCi0gICAgICAgIGFzc2VydFRydWUoZW52ZWxvcGUgaW5zdGFuY2VvZiBTT0FQRW52ZWxvcGUpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShtYy5nZXRJbmJvdW5kQ29udGVudExlbmd0aCgpID4gMjAwMCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9jb250ZXh0L0NvbnRleHRIaWVyYXJjaHlUZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2NvbnRleHQvQ29udGV4dEhpZXJhcmNoeVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEyOTMxMy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2NvbnRleHQvQ29udGV4dEhpZXJhcmNoeVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY29udGV4dDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNNZXNzYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uSW5PdXRBeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMQ29uc3RhbnRzOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotcHVibGljIGNsYXNzIENvbnRleHRIaWVyYXJjaHlUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotICAgIHByaXZhdGUgQXhpc01lc3NhZ2UgYXhpc01lc3NhZ2U7Ci0gICAgcHJpdmF0ZSBBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb247Ci0gICAgcHJpdmF0ZSBBeGlzU2VydmljZSBheGlzU2VydmljZTsKLSAgICBwcml2YXRlIEF4aXNDb25maWd1cmF0aW9uIGF4aXNDb25maWd1cmF0aW9uOwotICAgIHByaXZhdGUgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlndXJhdGlvbkNvbnRleHQ7Ci0gICAgcHJpdmF0ZSBNZXNzYWdlQ29udGV4dCBtc2djdHg7Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBheGlzT3BlcmF0aW9uID0gbmV3IEluT3V0QXhpc09wZXJhdGlvbihuZXcgUU5hbWUoIlRlbXAiKSk7Ci0gICAgICAgIGF4aXNNZXNzYWdlID0gYXhpc09wZXJhdGlvbi5nZXRNZXNzYWdlKFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9JTl9WQUxVRSk7Ci0gICAgICAgIGF4aXNTZXJ2aWNlID0gbmV3IEF4aXNTZXJ2aWNlKCJUZW1wIik7Ci0gICAgICAgIGF4aXNDb25maWd1cmF0aW9uID0gbmV3IEF4aXNDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgIGF4aXNTZXJ2aWNlLmFkZE9wZXJhdGlvbihheGlzT3BlcmF0aW9uKTsKLSAgICAgICAgYXhpc0NvbmZpZ3VyYXRpb24uYWRkU2VydmljZShheGlzU2VydmljZSk7Ci0gICAgICAgIGNvbmZpZ3VyYXRpb25Db250ZXh0ID0gbmV3IENvbmZpZ3VyYXRpb25Db250ZXh0KGF4aXNDb25maWd1cmF0aW9uKTsKLSAgICAgICAgbXNnY3R4ID0gY29uZmlndXJhdGlvbkNvbnRleHQuY3JlYXRlTWVzc2FnZUNvbnRleHQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGVIaWVyYXJjaHkoKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgU2VydmljZUdyb3VwQ29udGV4dCBzZXJ2aWNlR3JvdXBDb250ZXh0ID0gY29uZmlndXJhdGlvbkNvbnRleHQuY3JlYXRlU2VydmljZUdyb3VwQ29udGV4dCgKLSAgICAgICAgICAgICAgICBheGlzU2VydmljZS5nZXRBeGlzU2VydmljZUdyb3VwKCkpOwotICAgICAgICBTZXJ2aWNlQ29udGV4dCBzZXJ2aWNlQ29udGV4dCA9IHNlcnZpY2VHcm91cENvbnRleHQuZ2V0U2VydmljZUNvbnRleHQoYXhpc1NlcnZpY2UpOwotICAgICAgICBPcGVyYXRpb25Db250ZXh0IG9wQ29udGV4dCA9IGF4aXNPcGVyYXRpb24uZmluZE9wZXJhdGlvbkNvbnRleHQobXNnY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZUNvbnRleHQpOwotICAgICAgICBheGlzT3BlcmF0aW9uLnJlZ2lzdGVyT3BlcmF0aW9uQ29udGV4dChtc2djdHgsIG9wQ29udGV4dCk7Ci0gICAgICAgIG1zZ2N0eC5zZXRBeGlzTWVzc2FnZShheGlzTWVzc2FnZSk7Ci0gICAgICAgIG1zZ2N0eC5zZXRTZXJ2aWNlQ29udGV4dChzZXJ2aWNlQ29udGV4dCk7Ci0KLSAgICAgICAgLy8gdGVzdCB0aGUgY29tcGx0ZSBIaWVyYXJjaHkgYnVpbHQKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG1zZ2N0eC5nZXRQYXJlbnQoKSwgb3BDb250ZXh0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG9wQ29udGV4dC5nZXRQYXJlbnQoKSwgc2VydmljZUNvbnRleHQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoc2VydmljZUNvbnRleHQuZ2V0UGFyZW50KCksIHNlcnZpY2VHcm91cENvbnRleHQpOwotCi0gICAgICAgIFN0cmluZyBrZXkgPSAia2V5MSI7Ci0gICAgICAgIFN0cmluZyBwYXJhbVZhbHVlMSA9ICJwYXJhbVZhbHVlMSI7Ci0gICAgICAgIFN0cmluZyBwcm9wVmFsdWUxID0gInByb3BWYWx1ZTEiOwotICAgICAgICBTdHJpbmcgcGFyYW1WYWx1ZTIgPSAicGFyYW1WYWx1ZTIiOwotICAgICAgICBTdHJpbmcgcHJvcFZhbHVlMiA9ICJwcm9wVmFsdWUyIjsKLSAgICAgICAgU3RyaW5nIHBhcmFtVmFsdWUzID0gInBhcmFtVmFsdWUzIjsKLSAgICAgICAgU3RyaW5nIHByb3BWYWx1ZTMgPSAicHJvcFZhbHVlMyI7Ci0gICAgICAgIFN0cmluZyBwYXJhbVZhbHVlNCA9ICJwYXJhbVZhbHVlNCI7Ci0gICAgICAgIFN0cmluZyBwcm9wVmFsdWU0ID0gInByb3BWYWx1ZTQiOwotCi0gICAgICAgIGNvbmZpZ3VyYXRpb25Db250ZXh0LnNldFByb3BlcnR5KGtleSwgcHJvcFZhbHVlMSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhwcm9wVmFsdWUxLCBtc2djdHguZ2V0UHJvcGVydHkoa2V5KSk7Ci0KLSAgICAgICAgYXhpc0NvbmZpZ3VyYXRpb24uYWRkUGFyYW1ldGVyKG5ldyBQYXJhbWV0ZXIoa2V5LCBwYXJhbVZhbHVlMSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMocGFyYW1WYWx1ZTEsIG1zZ2N0eC5nZXRQYXJhbWV0ZXIoa2V5KS5nZXRWYWx1ZSgpKTsKLSAgICAgICAgCi0gICAgICAgIHNlcnZpY2VDb250ZXh0LnNldFByb3BlcnR5KGtleSwgcHJvcFZhbHVlMik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhwcm9wVmFsdWUyLCBtc2djdHguZ2V0UHJvcGVydHkoa2V5KSk7Ci0gICAgICAgIAotICAgICAgICBheGlzU2VydmljZS5hZGRQYXJhbWV0ZXIobmV3IFBhcmFtZXRlcihrZXksIHBhcmFtVmFsdWUyKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhwYXJhbVZhbHVlMiwgbXNnY3R4LmdldFBhcmFtZXRlcihrZXkpLmdldFZhbHVlKCkpOwotCi0gICAgICAgIG9wQ29udGV4dC5zZXRQcm9wZXJ0eShrZXksIHByb3BWYWx1ZTMpOwotICAgICAgICBhc3NlcnRFcXVhbHMocHJvcFZhbHVlMywgbXNnY3R4LmdldFByb3BlcnR5KGtleSkpOwotICAgICAgICAKLSAgICAgICAgYXhpc09wZXJhdGlvbi5hZGRQYXJhbWV0ZXIobmV3IFBhcmFtZXRlcihrZXksIHBhcmFtVmFsdWUzKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhwYXJhbVZhbHVlMywgbXNnY3R4LmdldFBhcmFtZXRlcihrZXkpLmdldFZhbHVlKCkpOwotICAgICAgICAKLSAgICAgICAgbXNnY3R4LnNldFByb3BlcnR5KGtleSwgcHJvcFZhbHVlNCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhwcm9wVmFsdWU0LCBtc2djdHguZ2V0UHJvcGVydHkoa2V5KSk7Ci0gICAgICAgIAotICAgICAgICBheGlzTWVzc2FnZS5hZGRQYXJhbWV0ZXIobmV3IFBhcmFtZXRlcihrZXksIHBhcmFtVmFsdWU0KSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhwYXJhbVZhbHVlNCwgbXNnY3R4LmdldFBhcmFtZXRlcihrZXkpLmdldFZhbHVlKCkpOwotCi0gICAgICAgIAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3REaXNjb25udGVjdGVkSGllcmFyY2h5KCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIC8vIHRlc3QgdGhlIGNvbXBsZXRlIEhpZXJhcmNoeSBidWlsdAotICAgICAgICBhc3NlcnRFcXVhbHMobXNnY3R4LmdldFBhcmVudCgpLCBudWxsKTsKLQotICAgICAgICBTdHJpbmcga2V5MSA9ICJrZXkxIjsKLSAgICAgICAgU3RyaW5nIHZhbHVlMSA9ICJWYWwxIjsKLSAgICAgICAgU3RyaW5nIHZhbHVlMiA9ICJ2YWx1ZTIiOwotICAgICAgICBTdHJpbmcga2V5MiA9ICJrZXkyIjsKLQotICAgICAgICBjb25maWd1cmF0aW9uQ29udGV4dC5zZXRQcm9wZXJ0eShrZXkxLCB2YWx1ZTEpOwotICAgICAgICBhc3NlcnRFcXVhbHModmFsdWUxLCBtc2djdHguZ2V0UHJvcGVydHkoa2V5MSkpOwotCi0gICAgICAgIGF4aXNDb25maWd1cmF0aW9uLmFkZFBhcmFtZXRlcihuZXcgUGFyYW1ldGVyKGtleTIsIHZhbHVlMikpOwotICAgICAgICBhc3NlcnRFcXVhbHModmFsdWUyLCBtc2djdHguZ2V0UGFyYW1ldGVyKGtleTIpLmdldFZhbHVlKCkpOwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvY29udGV4dC9Db250ZXh0TGlzdGVuZXJUZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2NvbnRleHQvQ29udGV4dExpc3RlbmVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTlhMDBlLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvY29udGV4dC9Db250ZXh0TGlzdGVuZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY29udGV4dDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlR3JvdXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5Jbk91dEF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0NvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQ29udGV4dExpc3RlbmVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICBzdGF0aWMgY2xhc3MgTXlMaXN0ZW5lciBpbXBsZW1lbnRzIENvbnRleHRMaXN0ZW5lciB7Ci0gICAgICAgIHByaXZhdGUgQWJzdHJhY3RDb250ZXh0IGxhc3RDb250ZXh0OwotCi0gICAgICAgIHB1YmxpYyB2b2lkIGNvbnRleHRDcmVhdGVkKEFic3RyYWN0Q29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgICAgICBsYXN0Q29udGV4dCA9IGNvbnRleHQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBjb250ZXh0UmVtb3ZlZChBYnN0cmFjdENvbnRleHQgY29udGV4dCkgewotICAgICAgICAgICAgLy9UT0RPOiBNZXRob2QgaW1wbGVtZW50YXRpb24KLQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEFic3RyYWN0Q29udGV4dCBnZXRMYXN0Q29udGV4dCgpIHsKLSAgICAgICAgICAgIHJldHVybiBsYXN0Q29udGV4dDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbmZpcm0gdGhhdCBjcmVhdGluZyBjb250ZXh0cyBhdCB2YXJpb3VzIGxldmVscyBjb3JyZWN0bHkgY2F1c2VzIG5vdGlmaWNhdGlvbnMgdG8KLSAgICAgKiBDb250ZXh0TGlzdGVuZXJzIHRoYXQgYXJlIHJlZ2lzdGVyZWQgb24gYSBnaXZlbiBDb25maWd1cmF0aW9uQ29udGV4dC4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RDb250ZXh0TGlzdGVuZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gU2V0IHVwIG1ldGFkYXRhCi0gICAgICAgIEF4aXNDb25maWd1cmF0aW9uIGF4aXNDb25maWcgPSBuZXcgQXhpc0NvbmZpZ3VyYXRpb24oKTsKLSAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ3R4ID0gbmV3IENvbmZpZ3VyYXRpb25Db250ZXh0KGF4aXNDb25maWcpOwotICAgICAgICBBeGlzU2VydmljZUdyb3VwIHNlcnZpY2VHcm91cCA9IG5ldyBBeGlzU2VydmljZUdyb3VwKGF4aXNDb25maWcpOwotICAgICAgICBBeGlzU2VydmljZSBzZXJ2aWNlID0gbmV3IEF4aXNTZXJ2aWNlKCJUZXN0U2VydmljZSIpOwotICAgICAgICBBeGlzT3BlcmF0aW9uIG9wZXJhdGlvbiA9IG5ldyBJbk91dEF4aXNPcGVyYXRpb24obmV3IFFOYW1lKCJucyIsICJvcDEiKSk7Ci0gICAgICAgIHNlcnZpY2UuYWRkT3BlcmF0aW9uKG9wZXJhdGlvbik7Ci0gICAgICAgIHNlcnZpY2VHcm91cC5hZGRTZXJ2aWNlKHNlcnZpY2UpOwotCi0gICAgICAgIC8vIFJlZ2lzdGVyIGEgbGlzdGVuZXIgYW5kIG1ha2Ugc3VyZSBpdCBzdGFydHMgb3V0IGNsZWFuCi0gICAgICAgIE15TGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTXlMaXN0ZW5lcigpOwotICAgICAgICBjb25maWdDdHguYWRkQ29udGV4dExpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICAgICAgYXNzZXJ0TnVsbChsaXN0ZW5lci5nZXRMYXN0Q29udGV4dCgpKTsKLQotICAgICAgICBNZXNzYWdlQ29udGV4dCBtYyA9IGNvbmZpZ0N0eC5jcmVhdGVNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKG1jKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJNZXNzYWdlQ29udGV4dCBub3Qgc3RvcmVkIiwgbWMsIGxpc3RlbmVyLmdldExhc3RDb250ZXh0KCkpOwotCi0gICAgICAgIFNlcnZpY2VHcm91cENvbnRleHQgc2djID0gY29uZmlnQ3R4LmNyZWF0ZVNlcnZpY2VHcm91cENvbnRleHQoc2VydmljZUdyb3VwKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZ2MpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlNlcnZpY2VHcm91cENvbnRleHQgbm90IHN0b3JlZCIsIHNnYywgbGlzdGVuZXIuZ2V0TGFzdENvbnRleHQoKSk7Ci0KLSAgICAgICAgU2VydmljZUNvbnRleHQgc2MgPSBzZ2MuZ2V0U2VydmljZUNvbnRleHQoc2VydmljZSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2MpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlNlcnZpY2VDb250ZXh0IG5vdCBzdG9yZWQiLCBzYywgbGlzdGVuZXIuZ2V0TGFzdENvbnRleHQoKSk7Ci0KLSAgICAgICAgT3BlcmF0aW9uQ29udGV4dCBvYyA9IHNjLmNyZWF0ZU9wZXJhdGlvbkNvbnRleHQob3BlcmF0aW9uKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChvYyk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiT3BlcmF0aW9uQ29udGV4dCBub3Qgc3RvcmVkIiwgb2MsIGxpc3RlbmVyLmdldExhc3RDb250ZXh0KCkpOwotCi0gICAgICAgIC8vIFRyeSBhIHNlY29uZCBsaXN0ZW5lciBhbmQgbWFrZSBzdXJlIHRoZXkgYm90aCBnZXQgbm90aWZpZWQKLSAgICAgICAgTXlMaXN0ZW5lciBsaXN0ZW5lcjIgPSBuZXcgTXlMaXN0ZW5lcigpOwotICAgICAgICBjb25maWdDdHguYWRkQ29udGV4dExpc3RlbmVyKGxpc3RlbmVyMik7Ci0KLSAgICAgICAgbWMgPSBjb25maWdDdHguY3JlYXRlTWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChtYyk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiTWVzc2FnZUNvbnRleHQgbm90IHN0b3JlZCIsIG1jLCBsaXN0ZW5lci5nZXRMYXN0Q29udGV4dCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJNZXNzYWdlQ29udGV4dCBub3Qgc3RvcmVkIGluIGxpc3RlbmVyIDIiLCBtYywgbGlzdGVuZXIyLmdldExhc3RDb250ZXh0KCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvY29udGV4dC9Db250ZXh0UHJvcGVydGllc0V4dGVybmFsaXplVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9jb250ZXh0L0NvbnRleHRQcm9wZXJ0aWVzRXh0ZXJuYWxpemVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyODUwZTMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9jb250ZXh0L0NvbnRleHRQcm9wZXJ0aWVzRXh0ZXJuYWxpemVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqICAgICAgCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY29udGV4dDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uT3V0T25seUF4aXNPcGVyYXRpb247Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW07Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLS8qKgotICogVGVzdCB0aGUgZXh0ZXJuYWxpemF0aW9uIG9mIHByb3BlcnRpZXMgb24gYW4gQWJzdHJhY3RDb250ZXh0LiAgU2luY2UgZWFjaCBvZiB0aGUgQWJzdHJhY3RDb250ZXh0Ci0gKiBzdWJjbGFzc2VzIGhhdmUgdGhlaXIgb3duIHJlYWQgYW5kIHdyaXRlIEV4dGVybmFsIG1ldGhvZHMsIGVhY2ggb25lIGlzIHRlc3RlZC4KLSAqLwotcHVibGljIGNsYXNzIENvbnRleHRQcm9wZXJ0aWVzRXh0ZXJuYWxpemVUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RFeHRlcm5hbGl6ZU1lc3NhZ2VDb250ZXh0KCkgewotICAgICAgICBNZXNzYWdlQ29udGV4dCBtYyA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBtYy5zZXRQcm9wZXJ0eSgia2V5MSIsICJ2YWx1ZTEiKTsKLSAgICAgICAgbWMuc2V0UHJvcGVydHkoImtleTIiLCAidmFsdWUyIik7Ci0gICAgICAgIG1jLnNldFByb3BlcnR5KG51bGwsICJ2YWx1ZTNfbnVsbEtleSIpOwotICAgICAgICBtYy5zZXRQcm9wZXJ0eSgia2V5NF9udWxsVmFsdWUiLCBudWxsKTsKLSAgICAgICAgbWMuc2V0UHJvcGVydHkoImtleTUiLCAidmFsdWU1Iik7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRUcnVlKG1jLnByb3BlcnRpZXMgaW5zdGFuY2VvZiBIYXNoTWFwVXBkYXRlTG9ja2FibGUpOwotICAgICAgICAKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICAgICAgT2JqZWN0T3V0cHV0U3RyZWFtIG9vcyA9IG5ldyBPYmplY3RPdXRwdXRTdHJlYW0oYmFvcyk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIG1jLndyaXRlRXh0ZXJuYWwob29zKTsKLSAgICAgICAgICAgIG9vcy5mbHVzaCgpOwotICAgICAgICAgICAgb29zLmNsb3NlKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGJhaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKTsKLSAgICAgICAgICAgIE9iamVjdElucHV0U3RyZWFtIG9pcyA9IG5ldyBPYmplY3RJbnB1dFN0cmVhbShiYWlzKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgTWVzc2FnZUNvbnRleHQgbWNSZWFkID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgICAgICBtY1JlYWQucmVhZEV4dGVybmFsKG9pcyk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyg1LCBtY1JlYWQucHJvcGVydGllcy5zaXplKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ2YWx1ZTEiLCBtY1JlYWQuZ2V0UHJvcGVydHkoImtleTEiKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoInZhbHVlMiIsIG1jUmVhZC5nZXRQcm9wZXJ0eSgia2V5MiIpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygidmFsdWUzX251bGxLZXkiLCBtY1JlYWQuZ2V0UHJvcGVydHkobnVsbCkpOwotICAgICAgICAgICAgYXNzZXJ0TnVsbChtY1JlYWQuZ2V0UHJvcGVydHkoImtleTRfbnVsbFZhbHVlIikpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ2YWx1ZTUiLCBtY1JlYWQuZ2V0UHJvcGVydHkoImtleTUiKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKG1jUmVhZC5wcm9wZXJ0aWVzIGluc3RhbmNlb2YgSGFzaE1hcFVwZGF0ZUxvY2thYmxlKTsKLSAgICAgICAgICAgIAotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIGV4LnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgZmFpbCgiQ2F1Z2h0IGV4Y2VwdGlvbjogIiArIGV4KTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgCi0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RFeHRlcm5hbGl6ZU9wZXJhdGlvbkNvbnRleHQoKSB7Ci0gICAgICAgIE9wZXJhdGlvbkNvbnRleHQgY3R4ID0gbmV3IE9wZXJhdGlvbkNvbnRleHQobmV3IE91dE9ubHlBeGlzT3BlcmF0aW9uKCksIG5ldyBTZXJ2aWNlQ29udGV4dCgpKTsKLSAgICAgICAgCi0gICAgICAgIGN0eC5zZXRQcm9wZXJ0eSgia2V5MSIsICJ2YWx1ZTEiKTsKLSAgICAgICAgY3R4LnNldFByb3BlcnR5KCJrZXkyIiwgInZhbHVlMiIpOwotICAgICAgICBjdHguc2V0UHJvcGVydHkobnVsbCwgInZhbHVlM19udWxsS2V5Iik7Ci0gICAgICAgIGN0eC5zZXRQcm9wZXJ0eSgia2V5NF9udWxsVmFsdWUiLCBudWxsKTsKLSAgICAgICAgY3R4LnNldFByb3BlcnR5KCJrZXk1IiwgInZhbHVlNSIpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0VHJ1ZShjdHgucHJvcGVydGllcyBpbnN0YW5jZW9mIEhhc2hNYXBVcGRhdGVMb2NrYWJsZSk7Ci0gICAgICAgIAotICAgICAgICB0cnkgewotICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICBPYmplY3RPdXRwdXRTdHJlYW0gb29zID0gbmV3IE9iamVjdE91dHB1dFN0cmVhbShiYW9zKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgY3R4LndyaXRlRXh0ZXJuYWwob29zKTsKLSAgICAgICAgICAgIG9vcy5mbHVzaCgpOwotICAgICAgICAgICAgb29zLmNsb3NlKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGJhaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKTsKLSAgICAgICAgICAgIE9iamVjdElucHV0U3RyZWFtIG9pcyA9IG5ldyBPYmplY3RJbnB1dFN0cmVhbShiYWlzKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgT3BlcmF0aW9uQ29udGV4dCBjdHhSZWFkID0gbmV3IE9wZXJhdGlvbkNvbnRleHQoKTsKLSAgICAgICAgICAgIGN0eFJlYWQucmVhZEV4dGVybmFsKG9pcyk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyg1LCBjdHhSZWFkLnByb3BlcnRpZXMuc2l6ZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygidmFsdWUxIiwgY3R4UmVhZC5nZXRQcm9wZXJ0eSgia2V5MSIpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygidmFsdWUyIiwgY3R4UmVhZC5nZXRQcm9wZXJ0eSgia2V5MiIpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygidmFsdWUzX251bGxLZXkiLCBjdHhSZWFkLmdldFByb3BlcnR5KG51bGwpKTsKLSAgICAgICAgICAgIGFzc2VydE51bGwoY3R4UmVhZC5nZXRQcm9wZXJ0eSgia2V5NF9udWxsVmFsdWUiKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoInZhbHVlNSIsIGN0eFJlYWQuZ2V0UHJvcGVydHkoImtleTUiKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGN0eFJlYWQucHJvcGVydGllcyBpbnN0YW5jZW9mIEhhc2hNYXBVcGRhdGVMb2NrYWJsZSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBleC5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIGZhaWwoIkNhdWdodCBleGNlcHRpb246ICIgKyBleCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdEV4dGVybmFsaXplU2VydmljZUNvbnRleHQoKSB7Ci0gICAgICAgIFNlcnZpY2VDb250ZXh0IGN0eCA9IG5ldyBTZXJ2aWNlQ29udGV4dCgpOwotICAgICAgICAKLSAgICAgICAgY3R4LnNldFByb3BlcnR5KCJrZXkxIiwgInZhbHVlMSIpOwotICAgICAgICBjdHguc2V0UHJvcGVydHkoImtleTIiLCAidmFsdWUyIik7Ci0gICAgICAgIGN0eC5zZXRQcm9wZXJ0eShudWxsLCAidmFsdWUzX251bGxLZXkiKTsKLSAgICAgICAgY3R4LnNldFByb3BlcnR5KCJrZXk0X251bGxWYWx1ZSIsIG51bGwpOwotICAgICAgICBjdHguc2V0UHJvcGVydHkoImtleTUiLCAidmFsdWU1Iik7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRUcnVlKGN0eC5wcm9wZXJ0aWVzIGluc3RhbmNlb2YgSGFzaE1hcFVwZGF0ZUxvY2thYmxlKTsKLSAgICAgICAgCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgICAgIE9iamVjdE91dHB1dFN0cmVhbSBvb3MgPSBuZXcgT2JqZWN0T3V0cHV0U3RyZWFtKGJhb3MpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBjdHgud3JpdGVFeHRlcm5hbChvb3MpOwotICAgICAgICAgICAgb29zLmZsdXNoKCk7Ci0gICAgICAgICAgICBvb3MuY2xvc2UoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmFpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpOwotICAgICAgICAgICAgT2JqZWN0SW5wdXRTdHJlYW0gb2lzID0gbmV3IE9iamVjdElucHV0U3RyZWFtKGJhaXMpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBTZXJ2aWNlQ29udGV4dCBjdHhSZWFkID0gbmV3IFNlcnZpY2VDb250ZXh0KCk7Ci0gICAgICAgICAgICBjdHhSZWFkLnJlYWRFeHRlcm5hbChvaXMpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoNSwgY3R4UmVhZC5wcm9wZXJ0aWVzLnNpemUoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoInZhbHVlMSIsIGN0eFJlYWQuZ2V0UHJvcGVydHkoImtleTEiKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoInZhbHVlMiIsIGN0eFJlYWQuZ2V0UHJvcGVydHkoImtleTIiKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoInZhbHVlM19udWxsS2V5IiwgY3R4UmVhZC5nZXRQcm9wZXJ0eShudWxsKSk7Ci0gICAgICAgICAgICBhc3NlcnROdWxsKGN0eFJlYWQuZ2V0UHJvcGVydHkoImtleTRfbnVsbFZhbHVlIikpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ2YWx1ZTUiLCBjdHhSZWFkLmdldFByb3BlcnR5KCJrZXk1IikpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjdHhSZWFkLnByb3BlcnRpZXMgaW5zdGFuY2VvZiBIYXNoTWFwVXBkYXRlTG9ja2FibGUpOwotICAgICAgICAgICAgCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICBmYWlsKCJDYXVnaHQgZXhjZXB0aW9uOiAiICsgZXgpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RFeHRlcm5hbGl6ZVNlcnZpY2VHcm91cENvbnRleHQoKSB7Ci0gICAgICAgIFNlcnZpY2VHcm91cENvbnRleHQgY3R4ID0gbmV3IFNlcnZpY2VHcm91cENvbnRleHQoKTsKLSAgICAgICAgCi0gICAgICAgIGN0eC5zZXRQcm9wZXJ0eSgia2V5MSIsICJ2YWx1ZTEiKTsKLSAgICAgICAgY3R4LnNldFByb3BlcnR5KCJrZXkyIiwgInZhbHVlMiIpOwotICAgICAgICBjdHguc2V0UHJvcGVydHkobnVsbCwgInZhbHVlM19udWxsS2V5Iik7Ci0gICAgICAgIGN0eC5zZXRQcm9wZXJ0eSgia2V5NF9udWxsVmFsdWUiLCBudWxsKTsKLSAgICAgICAgY3R4LnNldFByb3BlcnR5KCJrZXk1IiwgInZhbHVlNSIpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0VHJ1ZShjdHgucHJvcGVydGllcyBpbnN0YW5jZW9mIEhhc2hNYXBVcGRhdGVMb2NrYWJsZSk7Ci0gICAgICAgIAotICAgICAgICB0cnkgewotICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICBPYmplY3RPdXRwdXRTdHJlYW0gb29zID0gbmV3IE9iamVjdE91dHB1dFN0cmVhbShiYW9zKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgY3R4LndyaXRlRXh0ZXJuYWwob29zKTsKLSAgICAgICAgICAgIG9vcy5mbHVzaCgpOwotICAgICAgICAgICAgb29zLmNsb3NlKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGJhaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKTsKLSAgICAgICAgICAgIE9iamVjdElucHV0U3RyZWFtIG9pcyA9IG5ldyBPYmplY3RJbnB1dFN0cmVhbShiYWlzKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgU2VydmljZUdyb3VwQ29udGV4dCBjdHhSZWFkID0gbmV3IFNlcnZpY2VHcm91cENvbnRleHQoKTsKLSAgICAgICAgICAgIGN0eFJlYWQucmVhZEV4dGVybmFsKG9pcyk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyg1LCBjdHhSZWFkLnByb3BlcnRpZXMuc2l6ZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygidmFsdWUxIiwgY3R4UmVhZC5nZXRQcm9wZXJ0eSgia2V5MSIpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygidmFsdWUyIiwgY3R4UmVhZC5nZXRQcm9wZXJ0eSgia2V5MiIpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygidmFsdWUzX251bGxLZXkiLCBjdHhSZWFkLmdldFByb3BlcnR5KG51bGwpKTsKLSAgICAgICAgICAgIGFzc2VydE51bGwoY3R4UmVhZC5nZXRQcm9wZXJ0eSgia2V5NF9udWxsVmFsdWUiKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoInZhbHVlNSIsIGN0eFJlYWQuZ2V0UHJvcGVydHkoImtleTUiKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGN0eFJlYWQucHJvcGVydGllcyBpbnN0YW5jZW9mIEhhc2hNYXBVcGRhdGVMb2NrYWJsZSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBleC5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIGZhaWwoIkNhdWdodCBleGNlcHRpb246ICIgKyBleCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdEV4dGVybmFsaXplU2Vzc2lvbkNvbnRleHQoKSB7Ci0gICAgICAgIFNlc3Npb25Db250ZXh0IGN0eCA9IG5ldyBTZXNzaW9uQ29udGV4dCgpOwotICAgICAgICAKLSAgICAgICAgY3R4LnNldFByb3BlcnR5KCJrZXkxIiwgInZhbHVlMSIpOwotICAgICAgICBjdHguc2V0UHJvcGVydHkoImtleTIiLCAidmFsdWUyIik7Ci0gICAgICAgIGN0eC5zZXRQcm9wZXJ0eShudWxsLCAidmFsdWUzX251bGxLZXkiKTsKLSAgICAgICAgY3R4LnNldFByb3BlcnR5KCJrZXk0X251bGxWYWx1ZSIsIG51bGwpOwotICAgICAgICBjdHguc2V0UHJvcGVydHkoImtleTUiLCAidmFsdWU1Iik7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRUcnVlKGN0eC5wcm9wZXJ0aWVzIGluc3RhbmNlb2YgSGFzaE1hcFVwZGF0ZUxvY2thYmxlKTsKLSAgICAgICAgCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgICAgIE9iamVjdE91dHB1dFN0cmVhbSBvb3MgPSBuZXcgT2JqZWN0T3V0cHV0U3RyZWFtKGJhb3MpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBjdHgud3JpdGVFeHRlcm5hbChvb3MpOwotICAgICAgICAgICAgb29zLmZsdXNoKCk7Ci0gICAgICAgICAgICBvb3MuY2xvc2UoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmFpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpOwotICAgICAgICAgICAgT2JqZWN0SW5wdXRTdHJlYW0gb2lzID0gbmV3IE9iamVjdElucHV0U3RyZWFtKGJhaXMpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBTZXNzaW9uQ29udGV4dCBjdHhSZWFkID0gbmV3IFNlc3Npb25Db250ZXh0KCk7Ci0gICAgICAgICAgICBjdHhSZWFkLnJlYWRFeHRlcm5hbChvaXMpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoNSwgY3R4UmVhZC5wcm9wZXJ0aWVzLnNpemUoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoInZhbHVlMSIsIGN0eFJlYWQuZ2V0UHJvcGVydHkoImtleTEiKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoInZhbHVlMiIsIGN0eFJlYWQuZ2V0UHJvcGVydHkoImtleTIiKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoInZhbHVlM19udWxsS2V5IiwgY3R4UmVhZC5nZXRQcm9wZXJ0eShudWxsKSk7Ci0gICAgICAgICAgICBhc3NlcnROdWxsKGN0eFJlYWQuZ2V0UHJvcGVydHkoImtleTRfbnVsbFZhbHVlIikpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ2YWx1ZTUiLCBjdHhSZWFkLmdldFByb3BlcnR5KCJrZXk1IikpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjdHhSZWFkLnByb3BlcnRpZXMgaW5zdGFuY2VvZiBIYXNoTWFwVXBkYXRlTG9ja2FibGUpOwotICAgICAgICAgICAgCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICBmYWlsKCJDYXVnaHQgZXhjZXB0aW9uOiAiICsgZXgpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9jb250ZXh0L0NvbnRleHRQcm9wZXJ0aWVzVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9jb250ZXh0L0NvbnRleHRQcm9wZXJ0aWVzVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjU5M2JiLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvY29udGV4dC9Db250ZXh0UHJvcGVydGllc1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogICAgICAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0OwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLS8qKgotICogVGVzdCB0aGUgc2V0dGluZyBvZiBwcm9wZXJ0aWVzIG9uIGFuIEFic3RyYWN0Q29udGV4dCBpbnN0YW5jZS4gIE5vdGUgdGhhdCBNZXNzYWdlQ29udGV4dCBpcyB1c2VkCi0gKiBpbiBtb3N0IG9mIHRoZSB0ZXN0cyBhcyB0aGUgY29uY3JldGUgaW1wbGVtZW50YXRpb24gb2YgQWJzdHJhY3RDb250ZXh0LiAgU29tZSB0ZXN0cyBhbHNvIHRlc3QKLSAqIHRoZSBIYXNoVGFibGVVcGRhdGVMb2NrYWJsZSBjb2xsZWN0aW9uIHVzZWQgaW4gQWJzdHJhY3RDb250ZXh0LnByb2VwcnRpZXMgZGlyZWN0bHkuIAotICovCi1wdWJsaWMgY2xhc3MgQ29udGV4dFByb3BlcnRpZXNUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotICAgIAotICAgIC8qKgotICAgICAqIFRlc3QgdG8gZW5zdXJlIHVzaW5nIGFuIEl0ZXJhdG9yIGZyb20gZ2V0UHJvcGVydHlOYW1lcygpIGFmdGVyIHRoZSBwcm9wZXJ0aWVzIGhhdmUgYmVlbiAKLSAgICAgKiB1cGRhdGVkIGRvZXMgbm90IGNhdXNlIGEgQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbi4gIFRoZSBDTUUgZG9lcyBub3QgaGFwcGVuIGJlY2F1c2UKLSAgICAgKiB0aGUgSXRlcmF0b3IgaXMgb3ZlciBhIGNvcHkgb2YgdGhlIGtleSBuYW1lcywgbm90IHRoZSBhY3R1YWwgY29sbGVjdGlvbiAod2hpY2ggd291bGQgY2F1c2UKLSAgICAgKiBhIENNRSBpbiB0aGlzIHRlc3QpLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RQcm9wZXJ0eU5hbWVzRm9yQ01FKCkgewotICAgICAgICBNZXNzYWdlQ29udGV4dCBtYyA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOwotCi0gICAgICAgIG1jLnNldFByb3BlcnR5KCJrZXkxIiwgInZhbHVlMSIpOwotICAgICAgICBtYy5zZXRQcm9wZXJ0eSgia2V5MiIsICJ2YWx1ZTIiKTsKLSAgICAgICAgbWMuc2V0UHJvcGVydHkobnVsbCwgInZhbHVlM19udWxsa2V5Iik7Ci0gICAgICAgIG1jLnNldFByb3BlcnR5KCJrZXk0X251bGx2YWx1ZSIsIG51bGwpOwotCi0gICAgICAgIC8vIEdldCBhbiBpdGVyYXRvciBvdmVyIHRoZSBrZXkgbmFtZXMsIHRoZW4gYWRkIGEgbmV3IGVsZW1lbnQuCi0gICAgICAgIC8vIFRoaXMgc2ltdWxhdGVzIHR3byB0aHJlYWRzIGFjY2Vzc2luZyB0aGUgY29udGV4dC4gIFRoaXMgc2hvdWxkIG5vdCBjYXVzZQotICAgICAgICAvLyBhIENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24gKGl0IHdpbGwgaWYgYSBsaXZlIGl0ZXJhdG9yIG92ZXIgdGhlIGNvbGxlY3Rpb24KLSAgICAgICAgLy8ga2V5IHNldCBpcyByZXR1cm5lZCBieSBnZXRQcm9wZXJ0eU5hbWVzKCkpCi0gICAgICAgIEl0ZXJhdG9yIHByb3BOYW1lc0l0ZXJhdG9yID0gbWMuZ2V0UHJvcGVydHlOYW1lcygpOwotICAgICAgICBtYy5zZXRQcm9wZXJ0eSgibmV3S2V5IiwgIm5ld1ZhbHVlIik7Ci0gICAgICAgIHdoaWxlIChwcm9wTmFtZXNJdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIC8vIFZlcmlmeSAKLSAgICAgICAgICAgIC8vICgxKSB0aGF0IGNhbGxpbmcgbmV4dCgpIG9uIHRoZSBpdGVyYXRvciBkb2VzIG5vdCBjYXVzZSBhIENNRSwgCi0gICAgICAgICAgICAvLyAoMikgdGhhdCB0aGUga2V5cyBhcmUgYXMgZXhwZWN0ZWQgYW5kIAotICAgICAgICAgICAgLy8gKDMpIHRob3NlIGtleXMgY2FuIGJlIHVzZWQgdG8gYWNjZXNzIHRoZSBlbnRyaWVzIGluIHRoZSBjb2xsZWN0aW9uLgotICAgICAgICAgICAgU3RyaW5nIGNoZWNrS2V5ID0gKFN0cmluZykgcHJvcE5hbWVzSXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgSXRlcmF0b3IgY29uY3VycmVudEl0ZXJhdG9yID0gbWMuZ2V0UHJvcGVydHlOYW1lcygpOwotICAgICAgICAgICAgd2hpbGUgKGNvbmN1cnJlbnRJdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgY29uY3VycmVudEtleSA9IChTdHJpbmcpIGNvbmN1cnJlbnRJdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGVzdCB0aGF0IHVzaW5nIGFuIGl0ZXJhdG9yIG9mIHByb3BlcnR5TmFtZXMgZG9lcyBub3QgY2F1c2UgYSBDTUUuICBUaGlzIGlzIGRlZ2VuZXJhdGUKLSAgICAgKiB0ZXN0IG9mIHRoZSB0ZXN0IGZvciBDTUUgdGhhdCB1cGRhdGVzIHRoZSBjb2xsZWN0aW9uIGJlZm9yZSB1c2luZyB0aGUgaXRlcmF0b3IuCi0gICAgICogQHNlZSAjdGVzdFByb3BlcnR5TmFtZXNGb3JDTUUoKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RQcm9wZXJ0eU5hbWVzRm9yQ01FX05vVXBkYXRlKCkgewotICAgICAgICBNZXNzYWdlQ29udGV4dCBtYyA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOwotCi0gICAgICAgIG1jLnNldFByb3BlcnR5KCJrZXkxIiwgInZhbHVlMSIpOwotICAgICAgICBtYy5zZXRQcm9wZXJ0eSgia2V5MiIsICJ2YWx1ZTIiKTsKLSAgICAgICAgbWMuc2V0UHJvcGVydHkobnVsbCwgInZhbHVlM19udWxsa2V5Iik7Ci0gICAgICAgIG1jLnNldFByb3BlcnR5KCJrZXk0X251bGx2YWx1ZSIsIG51bGwpOwotCi0gICAgICAgIEl0ZXJhdG9yIHByb3BOYW1lc0l0ZXJhdG9yID0gbWMuZ2V0UHJvcGVydHlOYW1lcygpOwotICAgICAgICB3aGlsZSAocHJvcE5hbWVzSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBJdGVyYXRvciBjb25jdXJyZW50SXRlcmF0b3IgPSBtYy5nZXRQcm9wZXJ0eU5hbWVzKCk7Ci0gICAgICAgICAgICAvLyBWZXJpZnkgCi0gICAgICAgICAgICAvLyAoMSkgdGhhdCBjYWxsaW5nIG5leHQoKSBvbiB0aGUgaXRlcmF0b3IgZG9lcyBub3QgY2F1c2UgYSBDTUUsIAotICAgICAgICAgICAgLy8gKDIpIHRoYXQgdGhlIGtleXMgYXJlIGFzIGV4cGVjdGVkIGFuZCAKLSAgICAgICAgICAgIC8vICgzKSB0aG9zZSBrZXlzIGNhbiBiZSB1c2VkIHRvIGFjY2VzcyB0aGUgZW50cmllcyBpbiB0aGUgY29sbGVjdGlvbi4KLSAgICAgICAgICAgIFN0cmluZyBjaGVja0tleSA9IChTdHJpbmcpIHByb3BOYW1lc0l0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUZXN0IHNvbWUgYXNwZWN0cyBvZiB0aGUgQ29uY3VycmVudCBjb2xsZWN0aW9uIGRpcmVjdGx5LCBzdWNoIGFzIGNyZWF0aW5nIHdpdGggYSBNYXAuIAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RIYXNoTWFwVXBkYXRlTG9ja2FibGUoKSB7Ci0gICAgICAgIAotICAgICAgICBIYXNoTWFwVXBkYXRlTG9ja2FibGUgdGVzdE1hcCA9IG5ldyBIYXNoTWFwVXBkYXRlTG9ja2FibGUoKTsKLSAgICAgICAgdGVzdE1hcC5wdXQoImtleSIsICJ2YWx1ZSIpOwotICAgICAgICB0ZXN0TWFwLnB1dCgxLCAyKTsKLSAgICAgICAgCi0gICAgICAgIE1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICBtYXAucHV0KCJrMSIsICJ2MSIpOwotICAgICAgICBtYXAucHV0KCJrMiIsICJ2MiIpOwotICAgICAgICBtYXAucHV0KG51bGwsICJ2M051bGxLZXkiKTsKLSAgICAgICAgbWFwLnB1dCgiazNfbnVsbCIsIG51bGwpOwotICAgICAgICBIYXNoTWFwVXBkYXRlTG9ja2FibGUgdGVzdEN0b3JNYXAgPSBuZXcgSGFzaE1hcFVwZGF0ZUxvY2thYmxlKG1hcCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygidjEiLCB0ZXN0Q3Rvck1hcC5nZXQoImsxIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInYyIiwgdGVzdEN0b3JNYXAuZ2V0KCJrMiIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJ2M051bGxLZXkiLCB0ZXN0Q3Rvck1hcC5nZXQobnVsbCkpOwotICAgICAgICBhc3NlcnROdWxsKHRlc3RDdG9yTWFwLmdldCgiazNfbnVsbCIpKTsKLSAgICAgICAgCi0gICAgICAgIC8vIHB1dCByZXR1cm5zIHRoZSBwcmV2aW91cyB2YWx1ZSBpZiB0aGVyZSB3YXMgb25lLCBvciBudWxsCi0gICAgICAgIGFzc2VydEVxdWFscygidjEiLCB0ZXN0Q3Rvck1hcC5wdXQoImsxIiwgIm5ld0sxVmFsdWUiKSk7Ci0gICAgICAgIGFzc2VydE51bGwodGVzdEN0b3JNYXAucHV0KCJrM19udWxsIiwgIm5ld0szVmFsdWUiKSk7Ci0gICAgICAgIGFzc2VydE51bGwodGVzdEN0b3JNYXAucHV0KCJub1N1Y2hLZXktcHV0IiwgInZhbHVlNiIpKTsKLSAgICAgICAgCi0gICAgICAgIC8vIHJlbW92ZSByZXR1cm5zIHRoZSB2YWx1ZSBpZiB0aGVyZSB3YXMgYW4gZW50cnkgd2l0aCB0aGF0IGtleSwgb3IgbnVsbAotICAgICAgICBhc3NlcnROdWxsKHRlc3RDdG9yTWFwLnJlbW92ZSgibm9TdWNoS2V5LXJlbW92ZSIpKTsKLSAgICAgICAgdGVzdEN0b3JNYXAucHV0KCJrZXk3IiwgbnVsbCk7Ci0gICAgICAgIGFzc2VydE51bGwodGVzdEN0b3JNYXAucmVtb3ZlKCJrZXk3IikpOwotCi0gICAgfQotICAgIAotICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIC8vIFRoZSBmb2xsb3dpbmcgdGVzdHMgYXJlIG11bHRpdGhyZWFkZWQgdGVzdHMgdG8gdGVzdCB0aGUgbG9ja2luZywgYmxvY2tpbmcsIGFuZCByZWxlYXNpbmcKLSAgICAvLyBvZiB0aHJlYWRzIGJ5IHRoZSBIYXNoVGFibGVVcGRhdGVMb2NrYWJsZSBjb2xsZWN0aW9uLgotICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gICAgLyoqCi0gICAgICogTWV0aG9kcyBvbiBIYXNoVGFibGVVcGRhdGVMb2NrYWJsZSB0byBiZSB0ZXN0ZWQuICBUaGUgdXBkYXRlIG1ldGhvZHMgYXJlIHRlc3RlZCB0bwotICAgICAqIHZlcmlmeSB0aGV5IGJsb2NrIHdoaWxlIHRoZSB1cGRhdGVMb2NrIGlzIGhlbGQuICBTb21lIG5vbi11cGRhdGUgbWV0aG9kcyBhcmUgdGVzdGVkIHRvCi0gICAgICogdmVyaWZ5IHRoZXkgZG8gbm90IGJsb2NrIGlmIHRoZSB1cGRhdGVMb2NrIGlzIGhlbGQuIAotICAgICAqLwotICAgIHByaXZhdGUgZW51bSBNZXRob2RUb0NoZWNrIHtjaGVja0xvY2tfd2FpdCwgY2hlY2tMb2NrX25vd2FpdCwgcHV0LCBwdXRBbGwsIHJlbW92ZSwgZ2V0fTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUZXN0IEhhc2hUYWJsZVVwZGF0ZUxvY2thYmxlLnJlbW92ZSBtZXRob2Qgd2hpY2ggb3ZlcnJpZGVzIHRoZSBIYXNoVGFibGUgbWV0aG9kLgotICAgICAqIFRlc3RzIHRoZSBIYXNoVGFibGVVcGRhdGVMb2NrYWJsZSBjb2xsZWN0aW9uIGluIGEgbXVsdGl0aHJlYWRlZCBlbnZpcm9ubWVudCB0byBlbnN1cmUgdGhhdAotICAgICAqIGEgdGhyZWFkIHRyeWluZyB0byB1cGRhdGUgdGhlIGNvbGxlY3Rpb24gd2lsbCBibG9jayBhcyBsb25nIGFzIGFub3RoZXIgdGhyZWFkIGhhcyB0aGUKLSAgICAgKiBjb2xsZWN0aW9uIGxvY2tlZCBmb3IgdXBkYXRlLiAgTm90ZSB0aGF0IFVwZGF0ZVJ1bm5hYmxlIHBlcmZvcm1zIHRoZSBhY3R1YWwgdGVzdCBvZiB0aGUKLSAgICAgKiBtZXRob2QuCi0gICAgICogQHNlZSBVcGRhdGVSdW5uYWJsZSNydW4oKQotICAgICAqIAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aXRocmVhZFVwZGF0ZUxvY2tfcmVtb3ZlKCkgewotICAgICAgICBNdWx0aXRocmVhZFVwZGF0ZUxvY2tNb25pdG9yIHRlc3RNb25pdG9yID0gbmV3IE11bHRpdGhyZWFkVXBkYXRlTG9ja01vbml0b3IoKTsKLSAgICAgICAgSGFzaE1hcFVwZGF0ZUxvY2thYmxlIHRlc3RNYXAgPSBuZXcgSGFzaE1hcFVwZGF0ZUxvY2thYmxlKCk7Ci0gICAgICAgIHRlc3RNYXAucHV0KCJ0ZXN0S2V5MSIsICJ2YWx1ZTEiKTsKLSAgICAgICAgdGVzdE1hcC5wdXQoInJlbW92ZUtleSIsICJ2YWx1ZTIiKTsKLSAgICAgICAgc3RhcnR1cFRlc3RUaHJlYWRzKHRlc3RNb25pdG9yLCB0ZXN0TWFwLCBNZXRob2RUb0NoZWNrLnJlbW92ZSk7Ci0KLSAgICAgICAgYXNzZXJ0Tm9UaHJlYWRFcnJvcnModGVzdE1vbml0b3IpOyAgICAgICAgICAgIAotCi0gICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgdXBkYXRlIHRocmVhZCBibG9ja2VkLCBpLmUuIHRoZSBsb2NrVGhyZWFkIHdhcyByZWxlYXNlZCBiZWZvcmUgdGhlIHVwZGF0ZSB0aHJlYWQuCi0gICAgICAgIGFzc2VydFRydWUodGVzdE1vbml0b3IubG9ja1RocmVhZFJlbGVhc2VUaW1lIDw9IHRlc3RNb25pdG9yLnVwZGF0ZVRocmVhZFJlbGVhc2VUaW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IEhhc2hUYWJsZVVwZGF0ZUxvY2thYmxlLnB1dEFsbCBtZXRob2Qgd2hpY2ggb3ZlcnJpZGVzIHRoZSBIYXNoVGFibGUgbWV0aG9kLgotICAgICAqIFRlc3RzIHRoZSBIYXNoVGFibGVVcGRhdGVMb2NrYWJsZSBjb2xsZWN0aW9uIGluIGEgbXVsdGl0aHJlYWRlZCBlbnZpcm9ubWVudCB0byBlbnN1cmUgdGhhdAotICAgICAqIGEgdGhyZWFkIHRyeWluZyB0byB1cGRhdGUgdGhlIGNvbGxlY3Rpb24gd2lsbCBibG9jayBhcyBsb25nIGFzIGFub3RoZXIgdGhyZWFkIGhhcyB0aGUKLSAgICAgKiBjb2xsZWN0aW9uIGxvY2tlZCBmb3IgdXBkYXRlLiAgTm90ZSB0aGF0IFVwZGF0ZVJ1bm5hYmxlIHBlcmZvcm1zIHRoZSBhY3R1YWwgdGVzdCBvZiB0aGUKLSAgICAgKiBtZXRob2QuCi0gICAgICogQHNlZSBVcGRhdGVSdW5uYWJsZSNydW4oKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aXRocmVhZFVwZGF0ZUxvY2tfcHV0QWxsKCkgewotICAgICAgICBNdWx0aXRocmVhZFVwZGF0ZUxvY2tNb25pdG9yIHRlc3RNb25pdG9yID0gbmV3IE11bHRpdGhyZWFkVXBkYXRlTG9ja01vbml0b3IoKTsKLSAgICAgICAgSGFzaE1hcFVwZGF0ZUxvY2thYmxlIHRlc3RNYXAgPSBuZXcgSGFzaE1hcFVwZGF0ZUxvY2thYmxlKCk7Ci0gICAgICAgIHN0YXJ0dXBUZXN0VGhyZWFkcyh0ZXN0TW9uaXRvciwgdGVzdE1hcCwgTWV0aG9kVG9DaGVjay5wdXRBbGwpOwotCi0gICAgICAgIGFzc2VydE5vVGhyZWFkRXJyb3JzKHRlc3RNb25pdG9yKTsgICAgICAgICAgICAKLQotICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIHVwZGF0ZSB0aHJlYWQgYmxvY2tlZCwgaS5lLiB0aGUgbG9ja1RocmVhZCB3YXMgcmVsZWFzZWQgYmVmb3JlIHRoZSB1cGRhdGUgdGhyZWFkLgotICAgICAgICBhc3NlcnRUcnVlKHRlc3RNb25pdG9yLmxvY2tUaHJlYWRSZWxlYXNlVGltZSA8PSB0ZXN0TW9uaXRvci51cGRhdGVUaHJlYWRSZWxlYXNlVGltZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCBIYXNoVGFibGVVcGRhdGVMb2NrYWJsZS5wdXQgbWV0aG9kIHdoaWNoIG92ZXJyaWRlcyB0aGUgSGFzaFRhYmxlIG1ldGhvZC4KLSAgICAgKiBUZXN0cyB0aGUgSGFzaFRhYmxlVXBkYXRlTG9ja2FibGUgY29sbGVjdGlvbiBpbiBhIG11bHRpdGhyZWFkZWQgZW52aXJvbm1lbnQgdG8gZW5zdXJlIHRoYXQKLSAgICAgKiBhIHRocmVhZCB0cnlpbmcgdG8gdXBkYXRlIHRoZSBjb2xsZWN0aW9uIHdpbGwgYmxvY2sgYXMgbG9uZyBhcyBhbm90aGVyIHRocmVhZCBoYXMgdGhlCi0gICAgICogY29sbGVjdGlvbiBsb2NrZWQgZm9yIHVwZGF0ZS4gIE5vdGUgdGhhdCBVcGRhdGVSdW5uYWJsZSBwZXJmb3JtcyB0aGUgYWN0dWFsIHRlc3Qgb2YgdGhlCi0gICAgICogbWV0aG9kLgotICAgICAqIEBzZWUgVXBkYXRlUnVubmFibGUjcnVuKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGl0aHJlYWRVcGRhdGVMb2NrX3B1dCgpIHsKLSAgICAgICAgTXVsdGl0aHJlYWRVcGRhdGVMb2NrTW9uaXRvciB0ZXN0TW9uaXRvciA9IG5ldyBNdWx0aXRocmVhZFVwZGF0ZUxvY2tNb25pdG9yKCk7Ci0gICAgICAgIEhhc2hNYXBVcGRhdGVMb2NrYWJsZSB0ZXN0TWFwID0gbmV3IEhhc2hNYXBVcGRhdGVMb2NrYWJsZSgpOwotICAgICAgICBzdGFydHVwVGVzdFRocmVhZHModGVzdE1vbml0b3IsIHRlc3RNYXAsIE1ldGhvZFRvQ2hlY2sucHV0KTsKLQotICAgICAgICBhc3NlcnROb1RocmVhZEVycm9ycyh0ZXN0TW9uaXRvcik7ICAgICAgICAgICAgCi0KLSAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSB1cGRhdGUgdGhyZWFkIGJsb2NrZWQsIGkuZS4gdGhlIGxvY2tUaHJlYWQgd2FzIHJlbGVhc2VkIGJlZm9yZSB0aGUgdXBkYXRlIHRocmVhZC4KLSAgICAgICAgYXNzZXJ0VHJ1ZSh0ZXN0TW9uaXRvci5sb2NrVGhyZWFkUmVsZWFzZVRpbWUgPD0gdGVzdE1vbml0b3IudXBkYXRlVGhyZWFkUmVsZWFzZVRpbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgSGFzaFRhYmxlVXBkYXRlTG9ja2FibGUucHV0IG1ldGhvZCB3aGljaCBvdmVycmlkZXMgdGhlIEhhc2hUYWJsZSBtZXRob2QuCi0gICAgICogVGVzdHMgdGhlIEhhc2hUYWJsZVVwZGF0ZUxvY2thYmxlIGNvbGxlY3Rpb24gaW4gYSBtdWx0aXRocmVhZGVkIGVudmlyb25tZW50IHRvIGVuc3VyZSB0aGF0Ci0gICAgICogYSB0aHJlYWQgdHJ5aW5nIHRvIHVwZGF0ZSB0aGUgY29sbGVjdGlvbiBkb2VzIG5vdCBibG9jayBhcyBsb25nIGFzIGFub3RoZXIgdGhyZWFkIGhhcyB0aGUKLSAgICAgKiBjb2xsZWN0aW9uIGxvY2tlZCBmb3IgdXBkYXRlLiAgTm90ZSB0aGF0IFVwZGF0ZVJ1bm5hYmxlIHBlcmZvcm1zIHRoZSBhY3R1YWwgdGVzdCBvZiB0aGUKLSAgICAgKiBtZXRob2QuCi0gICAgICogQHNlZSBVcGRhdGVSdW5uYWJsZSNydW4oKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aXRocmVhZFVwZGF0ZUxvY2tfZ2V0KCkgewotICAgICAgICBNdWx0aXRocmVhZFVwZGF0ZUxvY2tNb25pdG9yIHRlc3RNb25pdG9yID0gbmV3IE11bHRpdGhyZWFkVXBkYXRlTG9ja01vbml0b3IoKTsKLSAgICAgICAgSGFzaE1hcFVwZGF0ZUxvY2thYmxlIHRlc3RNYXAgPSBuZXcgSGFzaE1hcFVwZGF0ZUxvY2thYmxlKCk7Ci0gICAgICAgIHRlc3RNYXAucHV0KCJrZXkxIiwgInZhbHVlMSIpOwotICAgICAgICB0ZXN0TWFwLnB1dCgia2V5MiIsICJ2YWx1ZTIiKTsKLSAgICAgICAgdGVzdE1hcC5wdXQoImdldEtleSIsICJ2YWx1ZTMiKTsKLSAgICAgICAgc3RhcnR1cFRlc3RUaHJlYWRzKHRlc3RNb25pdG9yLCB0ZXN0TWFwLCBNZXRob2RUb0NoZWNrLmdldCk7Ci0KLSAgICAgICAgYXNzZXJ0Tm9UaHJlYWRFcnJvcnModGVzdE1vbml0b3IpOwotCi0gICAgICAgIC8vIFRoZSB1cGRhdGUgdGhyZWFkIHNob3VsZG4ndCBibG9jayBzaW5jZSB3ZSBzYWlkIHRvIG5vdCB3YWl0LgotICAgICAgICBhc3NlcnRUcnVlKHRlc3RNb25pdG9yLnVwZGF0ZVRocmVhZFJlbGVhc2VUaW1lIDw9IHRlc3RNb25pdG9yLmxvY2tUaHJlYWRSZWxlYXNlVGltZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCBIYXNoVGFibGVVcGRhdGVMb2NrYWJsZS5jaGVja1VwZGF0ZUxvY2sgbWV0aG9kLgotICAgICAqIFRlc3RzIHRoZSBIYXNoVGFibGVVcGRhdGVMb2NrYWJsZSBjb2xsZWN0aW9uIGluIGEgbXVsdGl0aHJlYWRlZCBlbnZpcm9ubWVudCB0byBlbnN1cmUgdGhhdAotICAgICAqIGEgdGhyZWFkIHRyeWluZyB0byB1cGRhdGUgdGhlIGNvbGxlY3Rpb24gd2lsbCBibG9jayBhcyBsb25nIGFzIGFub3RoZXIgdGhyZWFkIGhhcyB0aGUKLSAgICAgKiBjb2xsZWN0aW9uIGxvY2tlZCBmb3IgdXBkYXRlLiAgTm90ZSB0aGF0IFVwZGF0ZVJ1bm5hYmxlIHBlcmZvcm1zIHRoZSBhY3R1YWwgdGVzdCBvZiB0aGUKLSAgICAgKiBtZXRob2QuCi0gICAgICogQHNlZSBVcGRhdGVSdW5uYWJsZSNydW4oKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aXRocmVhZFVwZGF0ZUxvY2tfY2hlY2tMb2NrX3dhaXQoKSB7Ci0gICAgICAgIE11bHRpdGhyZWFkVXBkYXRlTG9ja01vbml0b3IgdGVzdE1vbml0b3IgPSBuZXcgTXVsdGl0aHJlYWRVcGRhdGVMb2NrTW9uaXRvcigpOwotICAgICAgICBIYXNoTWFwVXBkYXRlTG9ja2FibGUgdGVzdE1hcCA9IG5ldyBIYXNoTWFwVXBkYXRlTG9ja2FibGUoKTsKLSAgICAgICAgc3RhcnR1cFRlc3RUaHJlYWRzKHRlc3RNb25pdG9yLCB0ZXN0TWFwLCBNZXRob2RUb0NoZWNrLmNoZWNrTG9ja193YWl0KTsKLQotICAgICAgICBhc3NlcnROb1RocmVhZEVycm9ycyh0ZXN0TW9uaXRvcik7ICAgICAgICAgICAgCi0KLSAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSB1cGRhdGUgdGhyZWFkIGJsb2NrZWQsIGkuZS4gdGhlIGxvY2tUaHJlYWQgd2FzIHJlbGVhc2VkIGJlZm9yZSB0aGUgdXBkYXRlIHRocmVhZC4KLSAgICAgICAgYXNzZXJ0VHJ1ZSh0ZXN0TW9uaXRvci5sb2NrVGhyZWFkUmVsZWFzZVRpbWUgPD0gdGVzdE1vbml0b3IudXBkYXRlVGhyZWFkUmVsZWFzZVRpbWUpOwotICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIHJldHVybiB2YWx1ZSBpbmRpY2F0ZXMgdGhlIHRhYmxlIHdhcyBub3QgbG9ja2VkLgotICAgICAgICBhc3NlcnRGYWxzZSgoKEJvb2xlYW4pIHRlc3RNb25pdG9yLm1ldGhvZFRvVGVzdFJldHVyblZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCBIYXNoVGFibGVVcGRhdGVMb2NrYWJsZS5jaGVja1VwZGF0ZUxvY2sgbWV0aG9kLgotICAgICAqIFRlc3RzIHRoZSBIYXNoVGFibGVVcGRhdGVMb2NrYWJsZSBjb2xsZWN0aW9uIGluIGEgbXVsdGl0aHJlYWRlZCBlbnZpcm9ubWVudCB0byBlbnN1cmUgdGhhdAotICAgICAqIGEgdGhyZWFkIHRyeWluZyB0byB1cGRhdGUgdGhlIGNvbGxlY3Rpb24gd2lsbCBub3QgYmxvY2sgYXMgbG9uZyBhcyBhbm90aGVyIHRocmVhZCBoYXMgdGhlCi0gICAgICogY29sbGVjdGlvbiBsb2NrZWQgZm9yIHVwZGF0ZS4gIE5vdGUgdGhhdCBVcGRhdGVSdW5uYWJsZSBwZXJmb3JtcyB0aGUgYWN0dWFsIHRlc3Qgb2YgdGhlCi0gICAgICogbWV0aG9kLgotICAgICAqIEBzZWUgVXBkYXRlUnVubmFibGUjcnVuKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGl0aHJlYWRVcGRhdGVMb2NrX2NoZWNrTG9ja19ub3dhaXQoKSB7Ci0gICAgICAgIE11bHRpdGhyZWFkVXBkYXRlTG9ja01vbml0b3IgdGVzdE1vbml0b3IgPSBuZXcgTXVsdGl0aHJlYWRVcGRhdGVMb2NrTW9uaXRvcigpOwotICAgICAgICBIYXNoTWFwVXBkYXRlTG9ja2FibGUgdGVzdE1hcCA9IG5ldyBIYXNoTWFwVXBkYXRlTG9ja2FibGUoKTsKLSAgICAgICAgc3RhcnR1cFRlc3RUaHJlYWRzKHRlc3RNb25pdG9yLCB0ZXN0TWFwLCBNZXRob2RUb0NoZWNrLmNoZWNrTG9ja19ub3dhaXQpOwotCi0gICAgICAgIGFzc2VydE5vVGhyZWFkRXJyb3JzKHRlc3RNb25pdG9yKTsKLQotICAgICAgICAvLyBUaGUgdXBkYXRlIHRocmVhZCBzaG91bGRuJ3QgYmxvY2sgc2luY2Ugd2Ugc2FpZCB0byBub3Qgd2FpdC4KLSAgICAgICAgYXNzZXJ0VHJ1ZSh0ZXN0TW9uaXRvci51cGRhdGVUaHJlYWRSZWxlYXNlVGltZSA8PSB0ZXN0TW9uaXRvci5sb2NrVGhyZWFkUmVsZWFzZVRpbWUpOwotICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIHJldHVybiB2YWx1ZSBpbmRpY2F0ZXMgdGhlIHRhYmxlIHdhcyBsb2NrZWQuCi0gICAgICAgIGFzc2VydFRydWUoKChCb29sZWFuKSB0ZXN0TW9uaXRvci5tZXRob2RUb1Rlc3RSZXR1cm5WYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotICAgIH0KLSAgICAKLSAgICAvLyBBbW91bnQgb2YgdGltZSB0aGUgdGVzdGNhc2Ugc2hvdWxkIHdhaXQgb24gdGhlIHRlc3QgdGhyZWFkcyBiZWZvcmUgdGltaW5nIG91dAotICAgIHByaXZhdGUgc3RhdGljIGludCBUSFJFQURfVElNRU9VVCA9IDkwMDAwOwotICAgIC8vIEFtb3VudCBvZiB0aW1lIHRoZSB0aHJlYWQgaG9sZGluZyB0aGUgdXBkYXRlIGxvY2sgc2hvdWxkIHNsZWVwLiAgVGhpcyBuZWVkcyB0byBiZSBsb25nCi0gICAgLy8gZW5vdWdoIHNvIHRoYXQgY29tcGFyaXNvbnMgYmV0d2VlbiB0aGUgdGltZSB0aGUgbG9ja2luZyB0aHJlYWQgaXMgcmVsZWFzZWQgYW5kIHRoZSB1cGRhdGUKLSAgICAvLyB0aHJlYWQgaXMgcmVsZWFzZWQgY2FuIGJlIHJlbGlhYmx5IGNvbXBhcmVkIGFzIGFuIGluZGljYXRpb24gb2Ygd2hldGhlciB0aGUgdXBkYXRlIHRocmVhZAotICAgIC8vIHdhcyBibG9ja2VkLgotICAgIHByaXZhdGUgc3RhdGljIGludCBMT0NLX1RIUkVBRF9TTEVFUCA9IDUwMDA7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQXNzZXJ0IHRoZXJlIHdlcmUgbm8gZXJyb3JzIGluIHRoZSBiYXNpYyBydW5uaW5nIG9mIHRoZSB0aHJlYWRzLgotICAgICAqIEBwYXJhbSB0ZXN0TW9uaXRvciBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBlYWNoIG9mIHRoZSB0ZXN0IHRocmVhZHMuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGFzc2VydE5vVGhyZWFkRXJyb3JzKE11bHRpdGhyZWFkVXBkYXRlTG9ja01vbml0b3IgdGVzdE1vbml0b3IpIHsKLSAgICAgICAgLy8gTWFrZSBzdXJlIGJvdGggdGhyZWFkcyB3ZXJlIHJlbGVhc2VkIChpLmUuIHJlbGVhc2UgdGltZSAhPSAwKSBhbmQgdGhhdCB0aGUgCi0gICAgICAgIC8vIHRoYXQgdGhlcmUgd2VyZSBubyBleGNlcHRpb25zIGVuY291bnRlcmVkCi0gICAgICAgIAotICAgICAgICBhc3NlcnROdWxsKHRlc3RNb25pdG9yLmxvY2tUaHJlYWRFeGNlcHRpb24pOwotICAgICAgICBhc3NlcnRUcnVlKHRlc3RNb25pdG9yLmxvY2tUaHJlYWRSZWxlYXNlVGltZSAhPSAwKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydE51bGwodGVzdE1vbml0b3IudXBkYXRlVGhyZWFkRXhjZXB0aW9uKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSh0ZXN0TW9uaXRvci51cGRhdGVUaHJlYWRSZWxlYXNlVGltZSAhPSAwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25maWd1cmVzIHRoZSB0ZXN0IHRocmVhZHMgd2l0aCB0aGUgY29tbW9uIG9iamVjdCB0byBzdG9yZSBpbmZvcm1hdGlvbiBhYm91dCBlYWNoIG9uZSwgdGhlIAotICAgICAqIGNvbGxlY3Rpb24gdG8gYmUgdGVzdGVkIGFuZCB0aGUgbWV0aG9kIHRvIGJlIHRlc3RlZC4gIFR3byB0aHJlYWRzIHdpbGwgYmUgc3RhcnRlZDoKLSAgICAgKiAoMSkgQSB0aHJlYWQgdGhhdCB3aWxsIGxvY2sgdGhlIGNvbGxlY3Rpb24sIHNsZWVwLCB0aGVuIHVubG9jayB0aGUgY29sbGVjdGlvbgotICAgICAqICgyKSBBIHRocmVhZCB0aGF0IHdpbGwgdHJ5IHRvIHVwZGF0ZSB0aGUgY29sbGVjdGlvbiB3aGlsZSBpdCBpcyBsb2NrZWQuCi0gICAgICogVGhyZWFkICgyKSBzaG91bGQgYmxvY2sgaWYgdGhlIG1ldGhvZCB0byBiZSB0ZXN0ZWQgaXMgb25lIHRoYXQgd291bGQgdXBkYXRlIHRoZSB0YWJsZSwgCi0gICAgICogb3RoZXJ3aXNlIGl0IHNob3VsZCBub3QgYmxvY2suCi0gICAgICogCi0gICAgICogQHBhcmFtIHRlc3RNb25pdG9yIENvbW1vbiBvYmplY3QgdXNlZCB0byBjb21tdW5pY2F0ZSBiZXR3ZWVuIHRoZSB0ZXN0IG1ldGhvZCBhbmQgdGhlIHR3bwotICAgICAqIHRlc3QgdGhyZWFkcwotICAgICAqIEBwYXJhbSB0ZXN0TWFwIEluc3RhbmNlIG9mIEhhc2hUYWJsZVVwZGF0ZUxvY2thYmxlIHRvIHRlc3QKLSAgICAgKiBAcGFyYW0gbWV0aG9kVG9UZXN0IFRoZSBtZXRob2Qgb24gSGFzaFRhYmxlVXBkYXRlTG9ja2FibGUgdG8gYmUgdGVzdGVkLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzdGFydHVwVGVzdFRocmVhZHMoTXVsdGl0aHJlYWRVcGRhdGVMb2NrTW9uaXRvciB0ZXN0TW9uaXRvciwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYXNoTWFwVXBkYXRlTG9ja2FibGUgdGVzdE1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGhvZFRvQ2hlY2sgbWV0aG9kVG9UZXN0KSB7Ci0gICAgICAgIExvY2tpbmdSdW5uYWJsZSBsb2NraW5nUnVubmFibGUgPSBuZXcgTG9ja2luZ1J1bm5hYmxlKCk7Ci0gICAgICAgIGxvY2tpbmdSdW5uYWJsZS50ZXN0TW9uaXRvciA9IHRlc3RNb25pdG9yOwotICAgICAgICBsb2NraW5nUnVubmFibGUudGVzdE1hcCA9IHRlc3RNYXA7Ci0gICAgICAgIGxvY2tpbmdSdW5uYWJsZS5tZXRob2RUb1Rlc3QgPSBtZXRob2RUb1Rlc3Q7Ci0gICAgICAgIAotICAgICAgICBVcGRhdGVSdW5uYWJsZSB1cGRhdGVSdW5uYWJsZSA9IG5ldyBVcGRhdGVSdW5uYWJsZSgpOwotICAgICAgICB1cGRhdGVSdW5uYWJsZS50ZXN0TW9uaXRvciA9IHRlc3RNb25pdG9yOwotICAgICAgICB1cGRhdGVSdW5uYWJsZS50ZXN0TWFwID0gdGVzdE1hcDsKLSAgICAgICAgdXBkYXRlUnVubmFibGUubWV0aG9kVG9UZXN0ID0gbWV0aG9kVG9UZXN0OwotCi0gICAgICAgIFRocmVhZCBsb2NraW5nVGhyZWFkID0gbmV3IFRocmVhZChsb2NraW5nUnVubmFibGUsICJMb2NraW5nIik7Ci0gICAgICAgIFRocmVhZCB1cGRhdGVUaHJlYWQgPSBuZXcgVGhyZWFkKHVwZGF0ZVJ1bm5hYmxlLCAiVXBkYXRpbmciKTsKLQotICAgICAgICAvLyBUbyBlbGltaW5hdGUgYSB0aW1pbmcgd2luZG93IHdoZXJlIHRoZSBsb2NraW5nIHRocmVhZCBzdGFydHMgYW5kIHJ1bnMgdG8gY29tcGxldGlvbgotICAgICAgICAvLyBiZWZvcmUgdGhlIHVwZGF0ZSB0aHJlYWQgZ2V0cyBzdGFydGVkLCBzdGFydCB0aGUgdXBkYXRlIHRocmVhZCBmaXJzdC4gIEl0IHdpbGwgYmxvY2sKLSAgICAgICAgLy8gd2FpdGluZyBvbiB0aGUgbG9ja2luZyB0aHJlYWQgdG8gY29tcGxldGUuCi0gICAgICAgIHVwZGF0ZVRocmVhZC5zdGFydCgpOwotICAgICAgICBsb2NraW5nVGhyZWFkLnN0YXJ0KCk7Ci0gICAgICAgIAotICAgICAgICAvLyBKb2luIHRoZSB0aHJlYWRzIHRvIHdhaXQgZm9yIHRoZWlyIGNvbXBsZXRpb24sIHNwZWNpZnlpbmcgYSB0aW1lb3V0IHRvIHByZXZlbnQgCi0gICAgICAgIC8vIGEgdGVzdGNhc2UgaGFuZyBpZiBzb21ldGhpbmcgZ29lcyB3cm9uZyB3aXRoIHRoZSB0aHJlYWRzLgotICAgICAgICB0cnkgewotICAgICAgICAgICAgbG9ja2luZ1RocmVhZC5qb2luKFRIUkVBRF9USU1FT1VUKTsKLSAgICAgICAgICAgIHVwZGF0ZVRocmVhZC5qb2luKFRIUkVBRF9USU1FT1VUKTsKLSAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIGZhaWwoIlVuYWJsZSB0byBqb2luIHRvIHRlc3RpbmcgdGhyZWFkcyIpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIE9iamVjdCB1c2VkIHRvIGNvbW11bmljYXRlIGluZm9ybWF0aW9uIGJldHdlZW4gdGhlIHRlc3RjYXNlIGFuZCB0aGUgdHdvIHRlc3QgdGhyZWFkcy4KLSAgICAgKi8KLSAgICBjbGFzcyBNdWx0aXRocmVhZFVwZGF0ZUxvY2tNb25pdG9yIHsKLSAgICAgICAgbG9uZyBsb2NrVGhyZWFkUmVsZWFzZVRpbWUgPSAwOwotICAgICAgICBib29sZWFuIGxvY2tTZXR1cENvbXBsZXRlID0gZmFsc2U7Ci0gICAgICAgIFJ1bnRpbWVFeGNlcHRpb24gbG9ja1RocmVhZEV4Y2VwdGlvbiA9IG51bGw7Ci0KLSAgICAgICAgbG9uZyB1cGRhdGVUaHJlYWRSZWxlYXNlVGltZSA9IDA7Ci0gICAgICAgIFJ1bnRpbWVFeGNlcHRpb24gdXBkYXRlVGhyZWFkRXhjZXB0aW9uID0gbnVsbDsKLQotICAgICAgICBPYmplY3QgbWV0aG9kVG9UZXN0UmV0dXJuVmFsdWUgPSBudWxsOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBBYnN0cmFjdCBzdXBlcmNsYXNzIG9mIHRoZSB0d28gdGVzdCB0aHJlYWRzLgotICAgICAqLwotICAgIGFic3RyYWN0IGNsYXNzIFVwZGF0ZUxvY2thYmxlVGVzdFJ1bm5hYmxlIGltcGxlbWVudHMgUnVubmFibGUgewotICAgICAgICBNdWx0aXRocmVhZFVwZGF0ZUxvY2tNb25pdG9yIHRlc3RNb25pdG9yID0gbnVsbDsKLSAgICAgICAgTWV0aG9kVG9DaGVjayBtZXRob2RUb1Rlc3QgPSBudWxsOwotICAgICAgICBIYXNoTWFwVXBkYXRlTG9ja2FibGUgdGVzdE1hcCA9IG51bGw7Ci0gICAgfQotICAgIAotICAgIAotICAgIC8qKgotICAgICAqIFRlc3QgdGhyZWFkIHRoYXQgd2lsbCBsb2NrIHRoZSBjb2xsZWN0aW9uLCBzbGVlcCwgdGhlbiB1bmxvY2sgdGhlIGNvbGxlY3Rpb24uCi0gICAgICovCi0gICAgY2xhc3MgTG9ja2luZ1J1bm5hYmxlIGV4dGVuZHMgVXBkYXRlTG9ja2FibGVUZXN0UnVubmFibGUgewotCi0gICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgLy8gTG9jayB0aGUgdGFibGUsIHRoZW4gcmVsZXNlIHRoZSAibG9ja1NldHVwQ29tcGxldGUiIHdhaXRlcnMsIHdoaWNoIHdpbGwKLSAgICAgICAgICAgICAgICAvLyByZWxlYXNlIHRoZSB1cGRhdGUgdGhyZWFkLgotICAgICAgICAgICAgICAgIC8vIE5PVEUgdGhhdCB0aGUgbG9jayBpcyBkb25lIGluc2lkZSBhIHRyeSBibG9jayBhbmQgdGhlIHVubG9jayBpcyBkb25lIGluIAotICAgICAgICAgICAgICAgIC8vIGEgZmluYWx5IGJsb2NrIHNvIHRoYXQgaXQgd2lsbCBhbHdheXMgYmUgZXhlY3V0ZWQuCi0gICAgICAgICAgICAgICAgdGVzdE1hcC5sb2NrRm9yVXBkYXRlKCk7Ci0gICAgICAgICAgICAgICAgc3luY2hyb25pemVkICh0ZXN0TW9uaXRvcikgewotICAgICAgICAgICAgICAgICAgICB0ZXN0TW9uaXRvci5sb2NrVGhyZWFkUmVsZWFzZVRpbWUgPSAwOwotICAgICAgICAgICAgICAgICAgICB0ZXN0TW9uaXRvci5sb2NrU2V0dXBDb21wbGV0ZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIHRlc3RNb25pdG9yLm5vdGlmeUFsbCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBTbGVlcCBmb3IgYSB3aGlsZSB0byB2ZXJpZnkgdGhhdCB0aGUgdXBkYXRlIHRocmVhZCBpcyBiZWluZyBibG9ja2VkIHdoaWxlIAotICAgICAgICAgICAgICAgIC8vIHRoZSB0YWJsZSBpcyBsb2NrZWQgYnkgdGhpcyB0aHJlYWQuICBUaGVuIHVubG9jayB0aGUgdGFibGUuCi0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKExPQ0tfVEhSRUFEX1NMRUVQKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIHRlc3RNb25pdG9yLmxvY2tUaHJlYWRFeGNlcHRpb24gPSBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgdGVzdE1vbml0b3IubG9ja1RocmVhZEV4Y2VwdGlvbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBjdXJyZW50IHRpbWUgYmVmb3JlIHJlbGVhc2luZyB0aGUgbG9jay4gIE9uIHNvbWUgc3lzdGVtcywgYXMgc29vbiBhcyB0aGUgCi0gICAgICAgICAgICAgICAgLy8gbm90aWZ5IGlzIGRvbmUsIHRoZSB3YWl0aW5nIHRocmVhZCB3aWxsIGltbWVkaWF0ZWx5IGdldCBjb250cm9sLgotICAgICAgICAgICAgICAgIHRlc3RNb25pdG9yLmxvY2tUaHJlYWRSZWxlYXNlVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICAgICAgICAgIHRlc3RNYXAudW5sb2NrRm9yVXBkYXRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhyZWFkIHRoYXQgd2lsbCBydW4gdGhlIG1ldGhvZHMgdG8gYmUgdGVzdGVkIG9uIHRoZSBjb2xsZWN0aW9uIHdoaWxlIGl0IGlzIGxvY2tlZCBmb3IgCi0gICAgICogdXBkYXRlIGJ5IGFub3RoZXIgdGhyZWFkLgotICAgICAqLwotICAgIGNsYXNzIFVwZGF0ZVJ1bm5hYmxlIGV4dGVuZHMgVXBkYXRlTG9ja2FibGVUZXN0UnVubmFibGUgIHsKLSAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgLy8gU2V0dXAgd2hhdGV2ZXIgd2UnbGwgbmVlZCB0byB0ZXN0IGxhc2VyIG9uCi0gICAgICAgICAgICBNYXAgcHV0QWxsTWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgICAgIHB1dEFsbE1hcC5wdXQoImsxIiwgInYxIik7Ci0gICAgICAgICAgICBwdXRBbGxNYXAucHV0KCJrMiIsICJ2MiIpOwotICAgICAgICAgICAgcHV0QWxsTWFwLnB1dCgiazMiLCAidjMiKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gV2FpdCB0aWxsIHRoZSBsb2NraW5nIHRocmVhZCBpcyBzZXR1cAotICAgICAgICAgICAgc3luY2hyb25pemVkKHRlc3RNb25pdG9yKSB7Ci0gICAgICAgICAgICAgICAgdGVzdE1vbml0b3IudXBkYXRlVGhyZWFkUmVsZWFzZVRpbWUgPSAwOwotICAgICAgICAgICAgICAgIHdoaWxlKCF0ZXN0TW9uaXRvci5sb2NrU2V0dXBDb21wbGV0ZSkgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGVzdE1vbml0b3Iud2FpdCgpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgdGVzdE1vbml0b3IudXBkYXRlVGhyZWFkRXhjZXB0aW9uID0gbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyB0ZXN0TW9uaXRvci51cGRhdGVUaHJlYWRFeGNlcHRpb247Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFRlc3QgdGhlIHVwZGF0ZSBtZXRob2Qgc3BlY2lmaWVkCi0gICAgICAgICAgICBzd2l0Y2gobWV0aG9kVG9UZXN0KSB7Ci0gICAgICAgICAgICBjYXNlIGNoZWNrTG9ja193YWl0OgotICAgICAgICAgICAgICAgIGJvb2xlYW4gcmV0VmFsV2FpdCA9IHRlc3RNYXAuY2hlY2tVcGRhdGVMb2NrKHRydWUpOwotICAgICAgICAgICAgICAgIHRlc3RNb25pdG9yLm1ldGhvZFRvVGVzdFJldHVyblZhbHVlID0gbmV3IEJvb2xlYW4ocmV0VmFsV2FpdCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIGNoZWNrTG9ja19ub3dhaXQ6Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiByZXRWYWxOb1dhaXQgPSB0ZXN0TWFwLmNoZWNrVXBkYXRlTG9jayhmYWxzZSk7Ci0gICAgICAgICAgICAgICAgdGVzdE1vbml0b3IubWV0aG9kVG9UZXN0UmV0dXJuVmFsdWUgPSBuZXcgQm9vbGVhbihyZXRWYWxOb1dhaXQpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBwdXQ6Ci0gICAgICAgICAgICAgICAgdGVzdE1hcC5wdXQoIm5ld0tleSIsICJuZXdWYWx1ZSIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBwdXRBbGw6Ci0gICAgICAgICAgICAgICAgdGVzdE1hcC5wdXRBbGwocHV0QWxsTWFwKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgcmVtb3ZlOgotICAgICAgICAgICAgICAgIHRlc3RNYXAucmVtb3ZlKCJyZW1vdmVLZXkiKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgZ2V0OgotICAgICAgICAgICAgICAgIHRlc3RNYXAuZ2V0KCJnZXRLZXkiKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgdGVzdE1vbml0b3IudXBkYXRlVGhyZWFkRXhjZXB0aW9uID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJtZXRob2QgdG8gdGVzdCBub3QgcmVjb2duaXplZDogIiArIG1ldGhvZFRvVGVzdCk7IAotICAgICAgICAgICAgICAgIHRocm93IHRlc3RNb25pdG9yLnVwZGF0ZVRocmVhZEV4Y2VwdGlvbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRlc3RNb25pdG9yLnVwZGF0ZVRocmVhZFJlbGVhc2VUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2NvbnRleHQvT3BlcmF0aW9uQ29udGV4dFRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvY29udGV4dC9PcGVyYXRpb25Db250ZXh0VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGUwMjA2Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvY29udGV4dC9PcGVyYXRpb25Db250ZXh0VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLnV0aWwuVVVJREdlbmVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkFic3RyYWN0VGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLlJlbGF0ZXNUbzsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkluT3V0QXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlRyYW5zcG9ydEluRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5UcmFuc3BvcnRPdXREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzQ29uZmlndXJhdGlvbjsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLXB1YmxpYyBjbGFzcyBPcGVyYXRpb25Db250ZXh0VGVzdCBleHRlbmRzIEFic3RyYWN0VGVzdENhc2UgewotCi0gICAgcHJpdmF0ZSBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0ID0gbmV3IENvbmZpZ3VyYXRpb25Db250ZXh0KAotICAgICAgICAgICAgbmV3IEF4aXNDb25maWd1cmF0aW9uKCkpOwotCi0gICAgcHVibGljIE9wZXJhdGlvbkNvbnRleHRUZXN0KFN0cmluZyBhcmcwKSB7Ci0gICAgICAgIHN1cGVyKGFyZzApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNRVBmaW5kaW5nT25SZWxhdGVzVE8oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICBBeGlzU2VydmljZSBheGlzU2VydmljZSA9IG5ldyBBeGlzU2VydmljZSgiVGVtcFNDIik7Ci0gICAgICAgIGNvbmZpZ0NvbnRleHQuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5hZGRTZXJ2aWNlKGF4aXNTZXJ2aWNlKTsKLSAgICAgICAgU2VydmljZUdyb3VwQ29udGV4dCBzZ2MgPSBjb25maWdDb250ZXh0LmNyZWF0ZVNlcnZpY2VHcm91cENvbnRleHQoCi0gICAgICAgICAgICAgICAgYXhpc1NlcnZpY2UuZ2V0QXhpc1NlcnZpY2VHcm91cCgpKTsKLSAgICAgICAgU2VydmljZUNvbnRleHQgc2Vzc2lvbkNvbnRleHQgPSBzZ2MuZ2V0U2VydmljZUNvbnRleHQoYXhpc1NlcnZpY2UpOwotICAgICAgICBNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dDEgPSB0aGlzLmdldEJhc2ljTWVzc2FnZUNvbnRleHQoKTsKLQotICAgICAgICBtZXNzYWdlQ29udGV4dDEuc2V0TWVzc2FnZUlEKFVVSURHZW5lcmF0b3IuZ2V0VVVJRCgpKTsKLSAgICAgICAgQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uID0gbmV3IEluT3V0QXhpc09wZXJhdGlvbihuZXcgUU5hbWUoInRlc3QiKSk7Ci0gICAgICAgIE9wZXJhdGlvbkNvbnRleHQgb3BlcmF0aW9uQ29udGV4dDEgPSBheGlzT3BlcmF0aW9uCi0gICAgICAgICAgICAgICAgLmZpbmRPcGVyYXRpb25Db250ZXh0KG1lc3NhZ2VDb250ZXh0MSwgc2Vzc2lvbkNvbnRleHQpOwotICAgICAgICBheGlzT3BlcmF0aW9uLnJlZ2lzdGVyT3BlcmF0aW9uQ29udGV4dChtZXNzYWdlQ29udGV4dDEsIG9wZXJhdGlvbkNvbnRleHQxKTsKLQotICAgICAgICBNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dDIgPSB0aGlzLmdldEJhc2ljTWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgbWVzc2FnZUNvbnRleHQyLnNldE1lc3NhZ2VJRChVVUlER2VuZXJhdG9yLmdldFVVSUQoKSk7Ci0gICAgICAgIG1lc3NhZ2VDb250ZXh0Mi5nZXRPcHRpb25zKCkuYWRkUmVsYXRlc1RvKAotICAgICAgICAgICAgICAgIG5ldyBSZWxhdGVzVG8obWVzc2FnZUNvbnRleHQxLmdldE1lc3NhZ2VJRCgpKSk7Ci0gICAgICAgIG1lc3NhZ2VDb250ZXh0Mi5zZXRBeGlzT3BlcmF0aW9uKGF4aXNPcGVyYXRpb24pOwotICAgICAgICBPcGVyYXRpb25Db250ZXh0IG9wZXJhdGlvbkNvbnRleHQyID0gYXhpc09wZXJhdGlvbgotICAgICAgICAgICAgICAgIC5maW5kT3BlcmF0aW9uQ29udGV4dChtZXNzYWdlQ29udGV4dDIsIHNlc3Npb25Db250ZXh0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG9wZXJhdGlvbkNvbnRleHQxLCBvcGVyYXRpb25Db250ZXh0Mik7Ci0gICAgfQotCi0gICAgcHVibGljIE1lc3NhZ2VDb250ZXh0IGdldEJhc2ljTWVzc2FnZUNvbnRleHQoKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQgPSBjb25maWdDb250ZXh0LmNyZWF0ZU1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIG1lc3NhZ2VDb250ZXh0LnNldFRyYW5zcG9ydEluKG5ldyBUcmFuc3BvcnRJbkRlc2NyaXB0aW9uKCJheGlzMiIpKTsKLSAgICAgICAgbWVzc2FnZUNvbnRleHQuc2V0VHJhbnNwb3J0T3V0KG5ldyBUcmFuc3BvcnRPdXREZXNjcmlwdGlvbigiYXhpczIiKSk7Ci0KLSAgICAgICAgcmV0dXJuIG1lc3NhZ2VDb250ZXh0OwotCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvQWRkaW5nT2JzZXJ2ZXJUZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvQWRkaW5nT2JzZXJ2ZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViZjg5NGEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L0FkZGluZ09ic2VydmVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BYnN0cmFjdFRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0NvbmZpZ3VyYXRpb247Ci0KLXB1YmxpYyBjbGFzcyBBZGRpbmdPYnNlcnZlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBBeGlzQ29uZmlndXJhdGlvbiBlcjsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRpbmdPYnNlcnZzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTdHJpbmcgZmlsZW5hbWUgPSBBYnN0cmFjdFRlc3RDYXNlLmJhc2VkaXIgKwotICAgICAgICAgICAgICAgICAgICAiL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvQ29uZmlnV2l0aE9ic2VydmVycyI7Ci0gICAgICAgICAgICBlciA9IENvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeQotICAgICAgICAgICAgICAgICAgICAuY3JlYXRlQ29uZmlndXJhdGlvbkNvbnRleHRGcm9tRmlsZVN5c3RlbShmaWxlbmFtZSwgZmlsZW5hbWUgKyAiL2F4aXMyLnhtbCIpCi0gICAgICAgICAgICAgICAgICAgIC5nZXRBeGlzQ29uZmlndXJhdGlvbigpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChlcik7Ci0gICAgICAgIH0gY2F0Y2ggKERlcGxveW1lbnRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvQXhpc01lc3NhZ2VUZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvQXhpc01lc3NhZ2VUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2M2ViZmMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L0F4aXNNZXNzYWdlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BYnN0cmFjdFRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzTWVzc2FnZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzQ29uZmlndXJhdGlvbjsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLXB1YmxpYyBjbGFzcyBBeGlzTWVzc2FnZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXhpc01lc3NhZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIGZpbGVuYW1lID0KLSAgICAgICAgICAgICAgICBBYnN0cmFjdFRlc3RDYXNlLmJhc2VkaXIgKyAiL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvQXhpc01lc3NhZ2VUZXN0UmVwbyI7Ci0gICAgICAgIEF4aXNDb25maWd1cmF0aW9uIGVyID0gQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5Ci0gICAgICAgICAgICAgICAgLmNyZWF0ZUNvbmZpZ3VyYXRpb25Db250ZXh0RnJvbUZpbGVTeXN0ZW0oZmlsZW5hbWUsIGZpbGVuYW1lICsgIi9heGlzMi54bWwiKQotICAgICAgICAgICAgICAgIC5nZXRBeGlzQ29uZmlndXJhdGlvbigpOwotCi0gICAgICAgIGFzc2VydE5vdE51bGwoZXIpOwotICAgICAgICBBeGlzU2VydmljZSBzZXJ2aWNlID0gZXIuZ2V0U2VydmljZSgiTWVzc2FnZXRlc3RTZXJ2aWNlIik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZSk7Ci0gICAgICAgIEF4aXNPcGVyYXRpb24gb3AgPSBzZXJ2aWNlLmdldE9wZXJhdGlvbihuZXcgUU5hbWUoImVjaG9TdHJpbmciKSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwob3ApOwotICAgICAgICBBeGlzTWVzc2FnZSBtZXNzYWdlID0gb3AuZ2V0TWVzc2FnZSgiSW4iKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChtZXNzYWdlKTsKLSAgICAgICAgUGFyYW1ldGVyIHBhcmEgPSBtZXNzYWdlLmdldFBhcmFtZXRlcigibWVzc2FnZUlOIik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocGFyYSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhwYXJhLmdldFZhbHVlKCksICJtZXNzYWdlSU4iKTsKLQotCi0gICAgICAgIG9wID0gc2VydmljZS5nZXRPcGVyYXRpb24obmV3IFFOYW1lKCJlY2hvU3RyaW5nQXJyYXkiKSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwob3ApOwotICAgICAgICBtZXNzYWdlID0gb3AuZ2V0TWVzc2FnZSgiSW4iKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChtZXNzYWdlKTsKLSAgICAgICAgcGFyYSA9IG1lc3NhZ2UuZ2V0UGFyYW1ldGVyKCJtZXNzYWdlSU4iKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChwYXJhKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHBhcmEuZ2V0VmFsdWUoKSwgIm1lc3NhZ2VJTiIpOwotCi0gICAgICAgIG1lc3NhZ2UgPSBvcC5nZXRNZXNzYWdlKCJPdXQiKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChtZXNzYWdlKTsKLSAgICAgICAgcGFyYSA9IG1lc3NhZ2UuZ2V0UGFyYW1ldGVyKCJtZXNzYWdlT3V0Iik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocGFyYSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhwYXJhLmdldFZhbHVlKCksICJtZXNzYWdlT3V0Iik7Ci0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvQXhpc09ic2VydmVySW1wbC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L0F4aXNPYnNlcnZlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc3MTA2Mi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvQXhpc09ic2VydmVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNNb2R1bGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlR3JvdXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5QYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5QYXJhbWV0ZXJJbmNsdWRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVySW5jbHVkZUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0NvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0V2ZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNPYnNlcnZlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBBeGlzT2JzZXJ2ZXJJbXBsIGltcGxlbWVudHMgQXhpc09ic2VydmVyIHsKLQotICAgIFBhcmFtZXRlckluY2x1ZGUgcGFyYW1ldGVyaW1wbDsKLQotICAgIC8vIFRoZSBpbml0aWxpemF0aW9uIGNvZGUgd2lsbCBnbyBoZXJlCi0gICAgcHVibGljIHZvaWQgaW5pdChBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlnKSB7Ci0gICAgICAgIHBhcmFtZXRlcmltcGwgPSBuZXcgUGFyYW1ldGVySW5jbHVkZUltcGwoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXJ2aWNlVXBkYXRlKEF4aXNFdmVudCBldmVudCwgQXhpc1NlcnZpY2Ugc2VydmljZSkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG1vZHVsZVVwZGF0ZShBeGlzRXZlbnQgZXZlbnQsIEF4aXNNb2R1bGUgbW9kdWxlKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkUGFyYW1ldGVyKFBhcmFtZXRlciBwYXJhbSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlUGFyYW1ldGVyKFBhcmFtZXRlciBwYXJhbSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgfQotCi0gICAgcHVibGljIFBhcmFtZXRlciBnZXRQYXJhbWV0ZXIoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIEFycmF5TGlzdCBnZXRQYXJhbWV0ZXJzKCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvL3RvIGNoZWNrIHdoZXRoZXIgdGhlIHBhcmFtZXRlciBpcyBsb2NrZWQgYXQgYW55IGxldmxlCi0gICAgcHVibGljIGJvb2xlYW4gaXNQYXJhbWV0ZXJMb2NrZWQoU3RyaW5nIHBhcmFtZXRlck5hbWUpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRlc2VyaWFsaXplUGFyYW1ldGVycyhPTUVsZW1lbnQgcGFyYW1ldGVyRWxlbWVudCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIHRoaXMucGFyYW1ldGVyaW1wbC5kZXNlcmlhbGl6ZVBhcmFtZXRlcnMocGFyYW1ldGVyRWxlbWVudCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2VydmljZUdyb3VwVXBkYXRlKEF4aXNFdmVudCBldmVudCwgQXhpc1NlcnZpY2VHcm91cCBzZXJ2aWNlR3JvdXApIHsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvQmFkTW9kdWxlVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L0JhZE1vZHVsZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdhZDc3MC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvQmFkTW9kdWxlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkFic3RyYWN0VGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0NvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi1wdWJsaWMgY2xhc3MgQmFkTW9kdWxlVGVzdCBleHRlbmRzIEFic3RyYWN0VGVzdENhc2UgewotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBCYWRNb2R1bGVUZXN0KFN0cmluZyB0ZXN0TmFtZSkgewotICAgICAgICBzdXBlcih0ZXN0TmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEJhZE1vZHVsZVhNTCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIElucHV0U3RyZWFtIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbSgKLSAgICAgICAgICAgICAgICAgICAgZ2V0VGVzdFJlc291cmNlRmlsZSgiZGVwbG95bWVudC9CYWRtb2R1bGUueG1sIikpOwotICAgICAgICAgICAgQXhpc0NvbmZpZ3VyYXRpb24gZ2xhYmwgPSBuZXcgQXhpc0NvbmZpZ3VyYXRpb24oKTsKLSAgICAgICAgICAgIEF4aXNDb25maWdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgQXhpc0NvbmZpZ0J1aWxkZXIoaW4sIGdsYWJsLCBudWxsKTsKLSAgICAgICAgICAgIGJ1aWxkZXIucG9wdWxhdGVDb25maWcoKTsKLSAgICAgICAgICAgIGZhaWwoCi0gICAgICAgICAgICAgICAgICAgICJ0aGlzIG11c3QgZmFpbGVkIGdyYWNlZnVsbHkgd2l0aCBEZXBsb3ltZW50RXhjZXB0aW9uIG9yIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiIpOwotICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9IGNhdGNoIChEZXBsb3ltZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L0J1aWxkRVJXaXRoRGVwbG95bWVudFRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9CdWlsZEVSV2l0aERlcGxveW1lbnRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlMzFmYTEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L0J1aWxkRVJXaXRoRGVwbG95bWVudFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BYnN0cmFjdFRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0NvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLkxvYWRlcjsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLXB1YmxpYyBjbGFzcyBCdWlsZEVSV2l0aERlcGxveW1lbnRUZXN0IGV4dGVuZHMgQWJzdHJhY3RUZXN0Q2FzZSB7Ci0gICAgLyoqCi0gICAgICogQHBhcmFtIHRlc3ROYW1lCi0gICAgICovCi0gICAgcHVibGljIEJ1aWxkRVJXaXRoRGVwbG95bWVudFRlc3QoU3RyaW5nIHRlc3ROYW1lKSB7Ci0gICAgICAgIHN1cGVyKHRlc3ROYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGVwbG95bWVudCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFN0cmluZyBmaWxlbmFtZSA9IEFic3RyYWN0VGVzdENhc2UuYmFzZWRpciArICIvdGFyZ2V0L3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQiOwotICAgICAgICAgICAgQXhpc0NvbmZpZ3VyYXRpb24gZXIgPSBDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkKLSAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZUNvbmZpZ3VyYXRpb25Db250ZXh0RnJvbUZpbGVTeXN0ZW0oZmlsZW5hbWUsIGZpbGVuYW1lICsgIi9heGlzMi54bWwiKQotICAgICAgICAgICAgICAgICAgICAuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKTsKLQotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChlcik7Ci0gICAgICAgICAgICBBeGlzU2VydmljZSBzZXJ2aWNlID0gZXIuZ2V0U2VydmljZSgic2VydmljZTIiKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZSk7Ci0gICAgICAgICAgICAvL2NvbW1lbnRkIHNpbmNlIHRoZXJlIGlzIG5vIHNlcnZpY2UgYmFzZWQgbWVzc2FnZVJlY2VpdmVycwotICAgICAgICAgICAgLypNZXNzYWdlUmVjZWl2ZXIgcHJvdmlkZXIgPSBzZXJ2aWNlLmdldE1lc3NhZ2VSZWNlaXZlcigpOwotICAgICAgICAgIGFzc2VydE5vdE51bGwocHJvdmlkZXIpOwotICAgICAgICAgIGFzc2VydFRydWUocHJvdmlkZXIgaW5zdGFuY2VvZiBSYXdYTUxJTk91dE1lc3NhZ2VSZWNlaXZlcik7Ki8KLSAgICAgICAgICAgIENsYXNzTG9hZGVyIGNsID0gc2VydmljZS5nZXRDbGFzc0xvYWRlcigpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChjbCk7Ci0gICAgICAgICAgICBMb2FkZXIubG9hZENsYXNzKGNsLCAib3JnLmFwYWNoZS5heGlzMi5FY2hvMiIpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2UuZ2V0UGFyYW1ldGVyKCJwYXJhMiIpKTsKLQotICAgICAgICAgICAgQXhpc09wZXJhdGlvbiBvcCA9IHNlcnZpY2UuZ2V0T3BlcmF0aW9uKG5ldyBRTmFtZSgib3BuYW1lIikpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChvcCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvQnVpbGRlclNlbGVjdG9yRGVwbG95bWVudFRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9CdWlsZGVyU2VsZWN0b3JEZXBsb3ltZW50VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTNkYjhmLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9CdWlsZGVyU2VsZWN0b3JEZXBsb3ltZW50VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkFic3RyYWN0VGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLXB1YmxpYyBjbGFzcyBCdWlsZGVyU2VsZWN0b3JEZXBsb3ltZW50VGVzdCBleHRlbmRzIEFic3RyYWN0VGVzdENhc2UgewotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBCdWlsZGVyU2VsZWN0b3JEZXBsb3ltZW50VGVzdChTdHJpbmcgdGVzdE5hbWUpIHsKLSAgICAgICAgc3VwZXIodGVzdE5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RCdWlsZGVyU2VsZWN0aW9uKCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0vLyAgICAgICAgU3RyaW5nIHJlcG9zaXRvcnlOYW1lICA9U3lzdGVtLmdldFByb3BlcnR5KCJiYXNlZGlyIiwiLiIpKyIvIisidGFyZ2V0L3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQiOwotLy8gICAgICAgIEZpbGUgcmVwbyA9IG5ldyBGaWxlKHJlcG9zaXRvcnlOYW1lKTsKLS8vICAgICAgICBTdHJpbmcgeG1sRmlsZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiYmFzZWRpciIsIi4iKSsiLyIrInRlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvYnVpbGRlclNlbGVjdG9yVGVzdC9heGlzMi54bWwiOwotLy8gICAgICAgIEZpbGUgeG1sID0gbmV3IEZpbGUoeG1sRmlsZSk7Ci0vLyAgICAgICAgRmlsZVN5c3RlbUNvbmZpZ3VyYXRvciBmc2MgPSBuZXcgRmlsZVN5c3RlbUNvbmZpZ3VyYXRvcihyZXBvLmdldEFic29sdXRlUGF0aCgpLCB4bWwuZ2V0QWJzb2x1dGVQYXRoKCkpOwotLy8gICAgICAgIEF4aXNDb25maWd1cmF0aW9uIGF4aXNDb25maWcgPSBmc2MuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKTsKLS8vICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gYXhpc0NvbmZpZy5nZXRNZXNzYWdlQnVpbGRlcigidGV4dC94bWwiKS5nZXRDbGFzcygpLmdldE5hbWUoKTsKLS8vICAgICAgICBhc3NlcnRFcXVhbHMoY2xhc3NOYW1lLCJvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuYnVpbGRlci5TdEFYT01CdWlsZGVyIik7Ci0vLyAgICAgICAgY2xhc3NOYW1lID0gYXhpc0NvbmZpZy5nZXRNZXNzYWdlQnVpbGRlcigiYXBwbGljYXRpb24vc29hcCt4bWwiKS5nZXRDbGFzcygpLmdldE5hbWUoKTsKLS8vICAgICAgICBhc3NlcnRFcXVhbHMoY2xhc3NOYW1lLCJvcmcuYXBhY2hlLmF4aW9tLnNvYXAuaW1wbC5idWlsZGVyLlN0QVhTT0FQTW9kZWxCdWlsZGVyIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEJ1aWxkZXJTZWxlY3Rpb25JbnZhbGlkRW50cnkoKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgU3RyaW5nIHJlcG9zaXRvcnlOYW1lID0KLSAgICAgICAgICAgICAgICBTeXN0ZW0uZ2V0UHJvcGVydHkoImJhc2VkaXIiLCAiLiIpICsgIi8iICsgInRhcmdldC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50IjsKLSAgICAgICAgRmlsZSByZXBvID0gbmV3IEZpbGUocmVwb3NpdG9yeU5hbWUpOwotICAgICAgICBTdHJpbmcgeG1sRmlsZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiYmFzZWRpciIsICIuIikgKyAiLyIgKwotICAgICAgICAgICAgICAgICJ0ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L2J1aWxkZXJTZWxlY3RvclRlc3QvYmFkLWF4aXMyLnhtbCI7Ci0gICAgICAgIEZpbGUgeG1sID0gbmV3IEZpbGUoeG1sRmlsZSk7Ci0gICAgICAgIEZpbGVTeXN0ZW1Db25maWd1cmF0b3IgZnNjID0KLSAgICAgICAgICAgICAgICBuZXcgRmlsZVN5c3RlbUNvbmZpZ3VyYXRvcihyZXBvLmdldEFic29sdXRlUGF0aCgpLCB4bWwuZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgICAgICBBeGlzRmF1bHQgdGVzdEZhdWx0ID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZzYy5nZXRBeGlzQ29uZmlndXJhdGlvbigpOwotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgZSkgewotICAgICAgICAgICAgdGVzdEZhdWx0ID0gZTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnROb3ROdWxsKHRlc3RGYXVsdCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L0N1c3RvbURlcGxveWVyVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L0N1c3RvbURlcGxveWVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTA3Y2EwLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9DdXN0b21EZXBsb3llclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQWJzdHJhY3RUZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC5kZXBsb3llcnMuQ3VzdG9tRGVwbG95ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0NvbmZpZ3VyYXRpb247Ci0KLXB1YmxpYyBjbGFzcyBDdXN0b21EZXBsb3llclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgcHVibGljIHZvaWQgdGVzdEN1c3RvbURlcGxveWVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBmaWxlbmFtZSA9Ci0gICAgICAgICAgICAgICAgQWJzdHJhY3RUZXN0Q2FzZS5iYXNlZGlyICsgIi90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L0N1c3RvbURlcGxveWVyUmVwbyI7Ci0gICAgICAgIEF4aXNDb25maWd1cmF0aW9uIGF4aXNDb25maWcgPSBDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkKLSAgICAgICAgICAgICAgICAuY3JlYXRlQ29uZmlndXJhdGlvbkNvbnRleHRGcm9tRmlsZVN5c3RlbShmaWxlbmFtZSkKLSAgICAgICAgICAgICAgICAuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKTsKLQotICAgICAgICAvLyBPSywgbGV0J3Mgc2VlIHdoYXQgd2UndmUgZ290IGhlcmUuLi4KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiSW5pdCB3YXMgbm90IGNhbGxlZCIsIEN1c3RvbURlcGxveWVyLmluaXRDYWxsZWQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIldyb25nIGRpcmVjdG9yeSIsICJ3aWRnZXRzIiwgQ3VzdG9tRGVwbG95ZXIuZGlyZWN0b3J5KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJXcm9uZyBleHRlbnNpb24iLCAic3ZjIiwgQ3VzdG9tRGVwbG95ZXIuZXh0ZW5zaW9uKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJXcm9uZyBudW1iZXIgb2YgZGVwbG95ZWQgaXRlbXMiLCAyLCBDdXN0b21EZXBsb3llci5kZXBsb3llZEl0ZW1zKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiR2VvcmdlIHdhc24ndCBmb3VuZCIsIEN1c3RvbURlcGxveWVyLmdlb3JnZURlcGxveWVkKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiTWFyeSB3YXNuJ3QgZm91bmQiLCBDdXN0b21EZXBsb3llci5tYXJ5RGVwbG95ZWQpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygiUGFyYW1ldGVyIG5vdCBzZXQgY29ycmVjdGx5IiwKLSAgICAgICAgICAgICAgICAgICAgIEN1c3RvbURlcGxveWVyLlBBUkFNX1ZBTCwKLSAgICAgICAgICAgICAgICAgICAgIGF4aXNDb25maWcuZ2V0UGFyYW1ldGVyVmFsdWUoQ3VzdG9tRGVwbG95ZXIuUEFSQU1fTkFNRSkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9EZXBsb3ltZW50VG90YWxUZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvRGVwbG95bWVudFRvdGFsVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTA1ZmY3Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9EZXBsb3ltZW50VG90YWxUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkFic3RyYWN0VGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5IYW5kbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLlBoYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucmVnaXN0cnkuSGFuZGxlcjM7Ci0KLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1wdWJsaWMgY2xhc3MgRGVwbG95bWVudFRvdGFsVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICBBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlnOwotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIGZpbGVuYW1lID0gQWJzdHJhY3RUZXN0Q2FzZS5iYXNlZGlyICsgIi90YXJnZXQvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudCI7Ci0gICAgICAgIGF4aXNDb25maWcgPSBDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkKLSAgICAgICAgICAgICAgICAuY3JlYXRlQ29uZmlndXJhdGlvbkNvbnRleHRGcm9tRmlsZVN5c3RlbShmaWxlbmFtZSwgZmlsZW5hbWUgKyAiL2F4aXMyLnhtbCIpCi0gICAgICAgICAgICAgICAgLmdldEF4aXNDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgIGF4aXNDb25maWcuZW5nYWdlTW9kdWxlKCJtb2R1bGUxIik7Ci0gICAgICAgICAvLyBPSywgbm8gZXhjZXB0aW9ucy4gIE5vdyBtYWtlIHN1cmUgd2UgcmVhZCB0aGUgY29ycmVjdCBmaWxlLi4uCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdHBhcnNlU2VydmljZTEoKSB0aHJvd3MgQXhpc0ZhdWx0LCBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBQYXJhbWV0ZXIgcGFyYW0gPSBheGlzQ29uZmlnLmdldFBhcmFtZXRlcigiRmF2b3JpdGVDb2xvciIpOwotICAgICAgICBhc3NlcnROb3ROdWxsKCJObyBGYXZvcml0ZUNvbG9yIHBhcmFtZXRlciBpbiBheGlzMi54bWwhIiwgcGFyYW0pOwotICAgICAgICBhc3NlcnRFcXVhbHMoInB1cnBsZSIsIHBhcmFtLmdldFZhbHVlKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3REeW5hbWljUGhhc2UoKSB7Ci0gICAgICAgIExpc3QgaW5GbG93ID0gYXhpc0NvbmZpZy5nZXRJbkZsb3dQaGFzZXMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbkZsb3cuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIFBoYXNlIHBoYXNlID0gKFBoYXNlKSBpbkZsb3cuZ2V0KGkpOwotICAgICAgICAgICAgaWYgKHBoYXNlLmdldE5hbWUoKS5lcXVhbHMoIk5ld1BoYXNlIikpIHsKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIldyb25nIGluZGV4IGZvciBOZXdQaGFzZSEiLCAzLCBpKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIldyb25nICMgb2YgaGFuZGxlcnMgaW4gTmV3UGhhc2UiLCAzLCBwaGFzZS5nZXRIYW5kbGVyQ291bnQoKSk7Ci0gICAgICAgICAgICAgICAgSGFuZGxlciBoNiA9IChIYW5kbGVyKXBoYXNlLmdldEhhbmRsZXJzKCkuZ2V0KDApOwotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIldyb25nIHR5cGUgZm9yIGhhbmRsZXIiLCBoNiBpbnN0YW5jZW9mIEhhbmRsZXIzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGluRmxvdyA9IGF4aXNDb25maWcuZ2V0SW5GYXVsdEZsb3dQaGFzZXMoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiTmV3UGhhc2Ugd2Fzbid0IGZvdW5kIGluIEluRmF1bHRGbG93IiwgaXNQaGFzZUluRmxvdyhpbkZsb3csICJOZXdQaGFzZSIpKTsKLQotICAgICAgICBMaXN0IG91dEZsb3cgPSBheGlzQ29uZmlnLmdldEluRmF1bHRGbG93UGhhc2VzKCk7Ci0gICAgICAgIGFzc2VydFRydWUoIk5ld1BoYXNlIHdhc24ndCBmb3VuZCBpbiBPdXRGbG93IiwgaXNQaGFzZUluRmxvdyhvdXRGbG93LCAiTmV3UGhhc2UiKSk7ICAgICAgICAKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNQaGFzZUluRmxvdyhMaXN0IGluRmxvdywgU3RyaW5nIHBoYXNlTmFtZSkgewotICAgICAgICBib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0gICAgICAgIGZvciAoT2JqZWN0IGFuSW5GbG93IDogaW5GbG93KSB7Ci0gICAgICAgICAgICBQaGFzZSBwaGFzZSA9IChQaGFzZSlhbkluRmxvdzsKLSAgICAgICAgICAgIGlmIChwaGFzZS5nZXROYW1lKCkuZXF1YWxzKHBoYXNlTmFtZSkpIHsKLSAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZvdW5kOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L0V4Y2x1ZGVTZXJ2aWNlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvRXhjbHVkZVNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFlMDE4Yi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvRXhjbHVkZVNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50OwotCi1wdWJsaWMgY2xhc3MgRXhjbHVkZVNlcnZpY2UgewotICAgIHB1YmxpYyBpbnQgYWRkKGludCBhLCBpbnQgYikgewotICAgICAgICByZXR1cm4gYSArIGI7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBkZWR1YyhpbnQgYSwgaW50IGIpIHsKLSAgICAgICAgcmV0dXJuIGEgLSBiOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZGV2aWRlKGludCBhLCBpbnQgYikgewotICAgICAgICByZXR1cm4gYSAvIGI7Ci0gICAgfQotCi19Ci0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9NZXNzYWdlRm9ybWF0dGVyRGVwbG95bWVudFRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9NZXNzYWdlRm9ybWF0dGVyRGVwbG95bWVudFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmE1NGNmZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvTWVzc2FnZUZvcm1hdHRlckRlcGxveW1lbnRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQWJzdHJhY3RUZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzQ29uZmlndXJhdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotcHVibGljIGNsYXNzIE1lc3NhZ2VGb3JtYXR0ZXJEZXBsb3ltZW50VGVzdCBleHRlbmRzIEFic3RyYWN0VGVzdENhc2UgewotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBNZXNzYWdlRm9ybWF0dGVyRGVwbG95bWVudFRlc3QoU3RyaW5nIHRlc3ROYW1lKSB7Ci0gICAgICAgIHN1cGVyKHRlc3ROYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QnVpbGRlclNlbGVjdGlvbigpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBTdHJpbmcgcmVwb3NpdG9yeU5hbWUgPQotICAgICAgICAgICAgICAgIFN5c3RlbS5nZXRQcm9wZXJ0eSgiYmFzZWRpciIsICIuIikgKyAiLyIgKyAidGFyZ2V0L3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQiOwotICAgICAgICBGaWxlIHJlcG8gPSBuZXcgRmlsZShyZXBvc2l0b3J5TmFtZSk7Ci0gICAgICAgIFN0cmluZyB4bWxGaWxlID0gU3lzdGVtLmdldFByb3BlcnR5KCJiYXNlZGlyIiwgIi4iKSArICIvIiArCi0gICAgICAgICAgICAgICAgInRlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvbWVzc2FnZUZvcm1hdHRlclRlc3QvYXhpczIueG1sIjsKLSAgICAgICAgRmlsZSB4bWwgPSBuZXcgRmlsZSh4bWxGaWxlKTsKLSAgICAgICAgRmlsZVN5c3RlbUNvbmZpZ3VyYXRvciBmc2MgPQotICAgICAgICAgICAgICAgIG5ldyBGaWxlU3lzdGVtQ29uZmlndXJhdG9yKHJlcG8uZ2V0QWJzb2x1dGVQYXRoKCksIHhtbC5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgICAgIEF4aXNDb25maWd1cmF0aW9uIGF4aXNDb25maWcgPSBmc2MuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKTsKLSAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9Ci0gICAgICAgICAgICAgICAgYXhpc0NvbmZpZy5nZXRNZXNzYWdlRm9ybWF0dGVyKCJhcHBsaWNhdGlvbi9zb2FwK3htbCIpLmdldENsYXNzKCkuZ2V0TmFtZSgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIm9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuU09BUE1lc3NhZ2VGb3JtYXR0ZXIiLCBjbGFzc05hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RCdWlsZGVyU2VsZWN0aW9uSW52YWxpZEVudHJ5KCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIFN0cmluZyByZXBvc2l0b3J5TmFtZSA9Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmdldFByb3BlcnR5KCJiYXNlZGlyIiwgIi4iKSArICIvIiArICJ0YXJnZXQvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudCI7Ci0gICAgICAgIEZpbGUgcmVwbyA9IG5ldyBGaWxlKHJlcG9zaXRvcnlOYW1lKTsKLSAgICAgICAgU3RyaW5nIHhtbEZpbGUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImJhc2VkaXIiLCAiLiIpICsgIi8iICsKLSAgICAgICAgICAgICAgICAidGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9tZXNzYWdlRm9ybWF0dGVyVGVzdC9iYWQtYXhpczIueG1sIjsKLSAgICAgICAgRmlsZSB4bWwgPSBuZXcgRmlsZSh4bWxGaWxlKTsKLSAgICAgICAgRmlsZVN5c3RlbUNvbmZpZ3VyYXRvciBmc2MgPQotICAgICAgICAgICAgICAgIG5ldyBGaWxlU3lzdGVtQ29uZmlndXJhdG9yKHJlcG8uZ2V0QWJzb2x1dGVQYXRoKCksIHhtbC5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgICAgIEF4aXNGYXVsdCB0ZXN0RmF1bHQgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZnNjLmdldEF4aXNDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBlKSB7Ci0gICAgICAgICAgICB0ZXN0RmF1bHQgPSBlOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydE5vdE51bGwodGVzdEZhdWx0KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvTW9kaWZpZWRDb25maWdGaWxlVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L01vZGlmaWVkQ29uZmlnRmlsZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjA1MWUyNS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvTW9kaWZpZWRDb25maWdGaWxlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzQ29uZmlndXJhdGlvbjsKLQotcHVibGljIGNsYXNzIE1vZGlmaWVkQ29uZmlnRmlsZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBBeGlzQ29uZmlndXJhdGlvbiBlcjsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQaGFzZU9yZGVyY2hhZ2UoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTdHJpbmcgZmlsZW5hbWUgPSAiLi90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L0JhZENvbmZpZ09yZGVyQ2hhbmdlL2F4aXMyLnhtbCI7Ci0gICAgICAgICAgICBlciA9IENvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeQotICAgICAgICAgICAgICAgICAgICAuY3JlYXRlQ29uZmlndXJhdGlvbkNvbnRleHRGcm9tRmlsZVN5c3RlbShudWxsLCBmaWxlbmFtZSkKLSAgICAgICAgICAgICAgICAgICAgLmdldEF4aXNDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgICAgICBmYWlsKAotICAgICAgICAgICAgICAgICAgICAidGhpcyBtdXN0IGZhaWxlZCBncmFjZWZ1bGx5IHdpdGggRGVwbG95bWVudEV4Y2VwdGlvbiBcIkludmFsaWQgU3lzdGVtIHByZWRlZmluZWQgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgImlucGhhc2VzICwgcGhhc2Ugb3JkZXIgZG9lcyBub3RcIiArXG4gc3VwcG9ydFxcbiByZWNoZWNrIGF4aXMyLnhtbFwiIik7Ci0gICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBlKSB7Ci0KLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L01vZHVsZURpc2VuZ2FnZW1lbnRUZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvTW9kdWxlRGlzZW5nYWdlbWVudFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWYzNmI0YS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvTW9kdWxlRGlzZW5nYWdlbWVudFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BYnN0cmFjdFRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzTW9kdWxlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uSW5PdXRBeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLlBoYXNlOwotCi1wdWJsaWMgY2xhc3MgTW9kdWxlRGlzZW5nYWdlbWVudFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgQXhpc0NvbmZpZ3VyYXRpb24gY29uZmlnOwotICAgIFN0cmluZyBzZXJ2aWNlTmFtZSA9ICJ0ZXN0U2VydmljZSI7Ci0gICAgUU5hbWUgb3BOYW1lID0gbmV3IFFOYW1lKCJ0ZXN0T3BlcmF0aW9uIik7Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgZmlsZW5hbWUgPQotICAgICAgICAgICAgICAgIEFic3RyYWN0VGVzdENhc2UuYmFzZWRpciArICIvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9tb2R1bGVEaXNFbmdlZ2VSZXBvIjsKLSAgICAgICAgY29uZmlnID0gQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5LgotICAgICAgICAgICAgICAgIGNyZWF0ZUNvbmZpZ3VyYXRpb25Db250ZXh0RnJvbUZpbGVTeXN0ZW0oZmlsZW5hbWUsIGZpbGVuYW1lICsgIi9heGlzMi54bWwiKS5nZXRBeGlzQ29uZmlndXJhdGlvbigpOwotICAgICAgICBBeGlzU2VydmljZSB0ZXN0U2VydmljZSA9IG5ldyBBeGlzU2VydmljZSgpOwotICAgICAgICB0ZXN0U2VydmljZS5zZXROYW1lKHNlcnZpY2VOYW1lKTsKLSAgICAgICAgQXhpc09wZXJhdGlvbiB0ZXN0T3BlcmF0aW9uID0gbmV3IEluT3V0QXhpc09wZXJhdGlvbigpOwotICAgICAgICB0ZXN0T3BlcmF0aW9uLnNldE5hbWUob3BOYW1lKTsKLSAgICAgICAgdGVzdFNlcnZpY2UuYWRkT3BlcmF0aW9uKHRlc3RPcGVyYXRpb24pOwotCi0gICAgICAgIHRlc3RPcGVyYXRpb24gPSBuZXcgSW5PdXRBeGlzT3BlcmF0aW9uKCk7Ci0gICAgICAgIHRlc3RPcGVyYXRpb24uc2V0TmFtZShuZXcgUU5hbWUoIm9wZXIyIikpOwotICAgICAgICB0ZXN0U2VydmljZS5hZGRPcGVyYXRpb24odGVzdE9wZXJhdGlvbik7Ci0gICAgICAgIAotICAgICAgICBjb25maWcuYWRkU2VydmljZSh0ZXN0U2VydmljZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEdsb2JhbERpc2VuZ2FnZW1lbnQoKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgQXhpc01vZHVsZSBtb2R1bGUgPSBjb25maWcuZ2V0TW9kdWxlKCJ0ZXN0TW9kdWxlIik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwobW9kdWxlKTsKLSAgICAgICAgUGhhc2UgcGhhc2U7Ci0gICAgICAgIFBoYXNlIHVzZXJQaGFzZTsKLSAgICAgICAgTGlzdCBnbG9iYWxpbmZsb3cgPSBjb25maWcuZ2V0SW5GbG93UGhhc2VzKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZ2xvYmFsaW5mbG93KTsKLSAgICAgICAgcGhhc2UgPSAoUGhhc2UpIGdsb2JhbGluZmxvdy5nZXQoMyk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocGhhc2UpOwotICAgICAgICBhc3NlcnRFcXVhbHMocGhhc2UuZ2V0SGFuZGxlckNvdW50KCksIDApOwotICAgICAgICBBeGlzU2VydmljZSBzZXJ2aWNlID0gY29uZmlnLmdldFNlcnZpY2Uoc2VydmljZU5hbWUpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2UpOwotICAgICAgICBBeGlzT3BlcmF0aW9uIG9wZXJhdGlvbiA9IHNlcnZpY2UuZ2V0T3BlcmF0aW9uKG9wTmFtZSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwob3BlcmF0aW9uKTsKLSAgICAgICAgdXNlclBoYXNlID0gKFBoYXNlKSBvcGVyYXRpb24uZ2V0UmVtYWluaW5nUGhhc2VzSW5GbG93KCkuZ2V0KDEpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHVzZXJQaGFzZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCB1c2VyUGhhc2UuZ2V0SGFuZGxlckNvdW50KCkpOwotCi0gICAgICAgIGNvbmZpZy5lbmdhZ2VNb2R1bGUobW9kdWxlLmdldE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygyLCBwaGFzZS5nZXRIYW5kbGVyQ291bnQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCB1c2VyUGhhc2UuZ2V0SGFuZGxlckNvdW50KCkpOwotCi0gICAgICAgIGNvbmZpZy5kaXNlbmdhZ2VNb2R1bGUobW9kdWxlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHBoYXNlLmdldEhhbmRsZXJDb3VudCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHVzZXJQaGFzZS5nZXRIYW5kbGVyQ291bnQoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNlcnZpY2VEaXNlbmdhZ2VtZW50KCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIEF4aXNNb2R1bGUgbW9kdWxlID0gY29uZmlnLmdldE1vZHVsZSgidGVzdE1vZHVsZSIpOwotICAgICAgICBhc3NlcnROb3ROdWxsKG1vZHVsZSk7Ci0gICAgICAgIFBoYXNlIHBoYXNlOwotICAgICAgICBQaGFzZSB1c2VyUGhhc2U7Ci0gICAgICAgIExpc3QgZ2xvYmFsaW5mbG93ID0gY29uZmlnLmdldEluRmxvd1BoYXNlcygpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGdsb2JhbGluZmxvdyk7Ci0gICAgICAgIHBoYXNlID0gKFBoYXNlKSBnbG9iYWxpbmZsb3cuZ2V0KDMpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHBoYXNlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHBoYXNlLmdldEhhbmRsZXJDb3VudCgpKTsKLSAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSA9IGNvbmZpZy5nZXRTZXJ2aWNlKHNlcnZpY2VOYW1lKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlKTsKLSAgICAgICAgQXhpc09wZXJhdGlvbiBvcGVyYXRpb24gPSBzZXJ2aWNlLmdldE9wZXJhdGlvbihvcE5hbWUpOwotICAgICAgICBhc3NlcnROb3ROdWxsKG9wZXJhdGlvbik7Ci0KLSAgICAgICAgdXNlclBoYXNlID0gKFBoYXNlKSBvcGVyYXRpb24uZ2V0UmVtYWluaW5nUGhhc2VzSW5GbG93KCkuZ2V0KDEpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHVzZXJQaGFzZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCB1c2VyUGhhc2UuZ2V0SGFuZGxlckNvdW50KCkpOwotCi0gICAgICAgIGNvbmZpZy5lbmdhZ2VNb2R1bGUobW9kdWxlLmdldE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygyLCBwaGFzZS5nZXRIYW5kbGVyQ291bnQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCB1c2VyUGhhc2UuZ2V0SGFuZGxlckNvdW50KCkpOwotCi0gICAgICAgIHNlcnZpY2UuZGlzZW5nYWdlTW9kdWxlKG1vZHVsZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygyLCBwaGFzZS5nZXRIYW5kbGVyQ291bnQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCB1c2VyUGhhc2UuZ2V0SGFuZGxlckNvdW50KCkpOwotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgdGVzdEdsb2JhbENoZWNrKCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIEF4aXNNb2R1bGUgbW9kdWxlID0gY29uZmlnLmdldE1vZHVsZSgidGVzdE1vZHVsZSIpOwotICAgICAgICBhc3NlcnROb3ROdWxsKG1vZHVsZSk7Ci0gICAgICAgIGNvbmZpZy5lbmdhZ2VNb2R1bGUobW9kdWxlLmdldE5hbWUoKSk7Ci0gICAgICAgIGNvbmZpZy5kaXNlbmdhZ2VNb2R1bGUobW9kdWxlKTsKLSAgICAgICAgY29uZmlnLmVuZ2FnZU1vZHVsZShtb2R1bGUuZ2V0TmFtZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0T3BlcmF0aW9uRGlzZW5nYWdlbWVudCgpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBBeGlzTW9kdWxlIG1vZHVsZSA9IGNvbmZpZy5nZXRNb2R1bGUoInRlc3RNb2R1bGUiKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChtb2R1bGUpOwotICAgICAgICBQaGFzZSBwaGFzZTsKLSAgICAgICAgUGhhc2UgdXNlclBoYXNlOwotICAgICAgICBMaXN0IGdsb2JhbGluZmxvdyA9IGNvbmZpZy5nZXRJbkZsb3dQaGFzZXMoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChnbG9iYWxpbmZsb3cpOwotICAgICAgICBwaGFzZSA9IChQaGFzZSkgZ2xvYmFsaW5mbG93LmdldCgzKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChwaGFzZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhwaGFzZS5nZXRIYW5kbGVyQ291bnQoKSwgMCk7Ci0gICAgICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2UgPSBjb25maWcuZ2V0U2VydmljZShzZXJ2aWNlTmFtZSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZSk7Ci0gICAgICAgIEF4aXNPcGVyYXRpb24gb3BlcmF0aW9uID0gc2VydmljZS5nZXRPcGVyYXRpb24ob3BOYW1lKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChvcGVyYXRpb24pOwotICAgICAgICB1c2VyUGhhc2UgPSAoUGhhc2UpIG9wZXJhdGlvbi5nZXRSZW1haW5pbmdQaGFzZXNJbkZsb3coKS5nZXQoMSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwodXNlclBoYXNlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHVzZXJQaGFzZS5nZXRIYW5kbGVyQ291bnQoKSk7Ci0KLSAgICAgICAgY29uZmlnLmVuZ2FnZU1vZHVsZShtb2R1bGUuZ2V0TmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHBoYXNlLmdldEhhbmRsZXJDb3VudCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHVzZXJQaGFzZS5nZXRIYW5kbGVyQ291bnQoKSk7Ci0KLSAgICAgICAgb3BlcmF0aW9uLmRpc2VuZ2FnZU1vZHVsZShtb2R1bGUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgcGhhc2UuZ2V0SGFuZGxlckNvdW50KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgdXNlclBoYXNlLmdldEhhbmRsZXJDb3VudCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2VydmljZUVuZ2FnZVNlcnZpY2VEaXNlbmdhZ2UoKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgQXhpc01vZHVsZSBtb2R1bGUgPSBjb25maWcuZ2V0TW9kdWxlKCJ0ZXN0TW9kdWxlIik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwobW9kdWxlKTsKLSAgICAgICAgUGhhc2UgcHJlZGlzcHRhaDsKLSAgICAgICAgUGhhc2UgdXNlclBoYXNlOwotICAgICAgICBMaXN0IGdsb2JhbGluZmxvdyA9IGNvbmZpZy5nZXRJbkZsb3dQaGFzZXMoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChnbG9iYWxpbmZsb3cpOwotICAgICAgICBwcmVkaXNwdGFoID0gKFBoYXNlKSBnbG9iYWxpbmZsb3cuZ2V0KDMpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHByZWRpc3B0YWgpOwotICAgICAgICBhc3NlcnRFcXVhbHMocHJlZGlzcHRhaC5nZXRIYW5kbGVyQ291bnQoKSwgMCk7Ci0gICAgICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2UgPSBjb25maWcuZ2V0U2VydmljZShzZXJ2aWNlTmFtZSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZSk7Ci0gICAgICAgIEF4aXNPcGVyYXRpb24gb3BlcmF0aW9uID0gc2VydmljZS5nZXRPcGVyYXRpb24ob3BOYW1lKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChvcGVyYXRpb24pOwotICAgICAgICB1c2VyUGhhc2UgPSAoUGhhc2UpIG9wZXJhdGlvbi5nZXRSZW1haW5pbmdQaGFzZXNJbkZsb3coKS5nZXQoMSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwodXNlclBoYXNlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHVzZXJQaGFzZS5nZXRIYW5kbGVyQ291bnQoKSk7Ci0KLSAgICAgICAgc2VydmljZS5lbmdhZ2VNb2R1bGUobW9kdWxlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHByZWRpc3B0YWguZ2V0SGFuZGxlckNvdW50KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgdXNlclBoYXNlLmdldEhhbmRsZXJDb3VudCgpKTsKLQotICAgICAgICBzZXJ2aWNlLmRpc2VuZ2FnZU1vZHVsZShtb2R1bGUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgcHJlZGlzcHRhaC5nZXRIYW5kbGVyQ291bnQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCB1c2VyUGhhc2UuZ2V0SGFuZGxlckNvdW50KCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJ2aWNlRW5nYWdlT3BlcmF0aW9uRGlzZW5nYWdlKCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIEF4aXNNb2R1bGUgbW9kdWxlID0gY29uZmlnLmdldE1vZHVsZSgidGVzdE1vZHVsZSIpOwotICAgICAgICBhc3NlcnROb3ROdWxsKG1vZHVsZSk7Ci0gICAgICAgIFBoYXNlIHBoYXNlOwotICAgICAgICBQaGFzZSB1c2VyUGhhc2U7Ci0gICAgICAgIExpc3QgZ2xvYmFsaW5mbG93ID0gY29uZmlnLmdldEluRmxvd1BoYXNlcygpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGdsb2JhbGluZmxvdyk7Ci0gICAgICAgIHBoYXNlID0gKFBoYXNlKSBnbG9iYWxpbmZsb3cuZ2V0KDMpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHBoYXNlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHBoYXNlLmdldEhhbmRsZXJDb3VudCgpLCAwKTsKLSAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSA9IGNvbmZpZy5nZXRTZXJ2aWNlKHNlcnZpY2VOYW1lKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlKTsKLSAgICAgICAgQXhpc09wZXJhdGlvbiBvcGVyYXRpb24gPSBzZXJ2aWNlLmdldE9wZXJhdGlvbihvcE5hbWUpOwotICAgICAgICBhc3NlcnROb3ROdWxsKG9wZXJhdGlvbik7Ci0gICAgICAgIHVzZXJQaGFzZSA9IChQaGFzZSkgb3BlcmF0aW9uLmdldFJlbWFpbmluZ1BoYXNlc0luRmxvdygpLmdldCgxKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh1c2VyUGhhc2UpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgdXNlclBoYXNlLmdldEhhbmRsZXJDb3VudCgpKTsKLQotICAgICAgICBzZXJ2aWNlLmVuZ2FnZU1vZHVsZShtb2R1bGUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgcGhhc2UuZ2V0SGFuZGxlckNvdW50KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgdXNlclBoYXNlLmdldEhhbmRsZXJDb3VudCgpKTsKLQotICAgICAgICBvcGVyYXRpb24uZGlzZW5nYWdlTW9kdWxlKG1vZHVsZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygyLCBwaGFzZS5nZXRIYW5kbGVyQ291bnQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCB1c2VyUGhhc2UuZ2V0SGFuZGxlckNvdW50KCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RPcGVyYXRpb25FbmdhZ2VPcGVyYXRpb25EaXNlbmdhZ2UoKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgQXhpc01vZHVsZSBtb2R1bGUgPSBjb25maWcuZ2V0TW9kdWxlKCJ0ZXN0TW9kdWxlIik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwobW9kdWxlKTsKLSAgICAgICAgUGhhc2UgcGhhc2U7Ci0gICAgICAgIFBoYXNlIHVzZXJQaGFzZTsKLSAgICAgICAgTGlzdCBnbG9iYWxpbmZsb3cgPSBjb25maWcuZ2V0SW5GbG93UGhhc2VzKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZ2xvYmFsaW5mbG93KTsKLSAgICAgICAgcGhhc2UgPSAoUGhhc2UpIGdsb2JhbGluZmxvdy5nZXQoMyk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocGhhc2UpOwotICAgICAgICBhc3NlcnRFcXVhbHMocGhhc2UuZ2V0SGFuZGxlckNvdW50KCksIDApOwotICAgICAgICBBeGlzU2VydmljZSBzZXJ2aWNlID0gY29uZmlnLmdldFNlcnZpY2Uoc2VydmljZU5hbWUpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2UpOwotICAgICAgICBBeGlzT3BlcmF0aW9uIG9wZXJhdGlvbiA9IHNlcnZpY2UuZ2V0T3BlcmF0aW9uKG9wTmFtZSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwob3BlcmF0aW9uKTsKLSAgICAgICAgdXNlclBoYXNlID0gKFBoYXNlKSBvcGVyYXRpb24uZ2V0UmVtYWluaW5nUGhhc2VzSW5GbG93KCkuZ2V0KDEpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHVzZXJQaGFzZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCB1c2VyUGhhc2UuZ2V0SGFuZGxlckNvdW50KCkpOwotICAgICAgICBvcGVyYXRpb24uZW5nYWdlTW9kdWxlKG1vZHVsZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygyLCBwaGFzZS5nZXRIYW5kbGVyQ291bnQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCB1c2VyUGhhc2UuZ2V0SGFuZGxlckNvdW50KCkpOwotICAgICAgICBvcGVyYXRpb24uZGlzZW5nYWdlTW9kdWxlKG1vZHVsZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCBwaGFzZS5nZXRIYW5kbGVyQ291bnQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCB1c2VyUGhhc2UuZ2V0SGFuZGxlckNvdW50KCkpOwotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvTW9kdWxlTG9hZGluZ1Rlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9Nb2R1bGVMb2FkaW5nVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjlmZjM1Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9Nb2R1bGVMb2FkaW5nVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BYnN0cmFjdFRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzTW9kdWxlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0aW9uOwotCi1wdWJsaWMgY2xhc3MgTW9kdWxlTG9hZGluZ1Rlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgcHVibGljIHZvaWQgdGVzdE1vZHVsZUxvYWRpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHJlcG9Sb290ID0gQWJzdHJhY3RUZXN0Q2FzZS5iYXNlZGlyICsgIi90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L3JlcG9zaXRvcmllcy9tb2R1bGVMb2FkVGVzdCI7Ci0gICAgICAgIEF4aXNDb25maWd1cmF0aW9uIGFjID0KLSAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkuY3JlYXRlQ29uZmlndXJhdGlvbkNvbnRleHRGcm9tRmlsZVN5c3RlbShyZXBvUm9vdCAsIHJlcG9Sb290ICsgIi9heGlzMi54bWwiKQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldEF4aXNDb25maWd1cmF0aW9uKCk7Ci0KLSAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGdvdCB0aGUgZXhwbG9kZWQgbW9kdWxlIGluIHRoZSByZXBvL21vZHVsZXMgZGlyCi0gICAgICAgIEF4aXNNb2R1bGUgbW9kdWxlID0gYWMuZ2V0TW9kdWxlKCJleHBsb2RlZE1vZHVsZSIpOwotICAgICAgICBhc3NlcnROb3ROdWxsKG1vZHVsZSk7Ci0gICAgICAgIFN0cmluZyB2YWwgPSAoU3RyaW5nKW1vZHVsZS5nZXRQYXJhbWV0ZXIoImNvbG9yIikuZ2V0VmFsdWUoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJncmVlbiIsIHZhbCk7Ci0KLSAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGdvdCB0aGUgbW9kdWxlIHRoYXQncyBvdXRzaWRlIHRoZSByZXBvLCBidXQgaW4gdGhlIGNsYXNzcGF0aAotICAgICAgICBtb2R1bGUgPSBhYy5nZXRNb2R1bGUoImNsYXNzcGF0aE1vZHVsZSIpOwotICAgICAgICBhc3NlcnROb3ROdWxsKCJEaWRuJ3QgZmluZCBjbGFzc3BhdGggbW9kdWxlISIsIG1vZHVsZSk7Ci0gICAgICAgIHZhbCA9IChTdHJpbmcpbW9kdWxlLmdldFBhcmFtZXRlcigiY29sb3IiKS5nZXRWYWx1ZSgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlBhcmFtZXRlciB3YXNuJ3Qgc2V0IGNvcnJlY3RseSIsICJibHVlIiwgdmFsKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvTW9kdWxldmVyc2lvblRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9Nb2R1bGV2ZXJzaW9uVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmJkNzQ4Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9Nb2R1bGV2ZXJzaW9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQWJzdHJhY3RUZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc01vZHVsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuVXRpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBNb2R1bGV2ZXJzaW9uVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3REZWZhdXRNb2R1bGVWZXJzaW9uKCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIFN0cmluZyBmaWxlbmFtZSA9IEFic3RyYWN0VGVzdENhc2UuYmFzZWRpciArCi0gICAgICAgICAgICAgICAgIi90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L21vZHVsZVZlcnNpb24vVGVzdDEvYXhpczIueG1sIjsKLSAgICAgICAgQXhpc0NvbmZpZ3VyYXRpb24gYWMgPQotICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeS5jcmVhdGVDb25maWd1cmF0aW9uQ29udGV4dEZyb21GaWxlU3lzdGVtKG51bGwsIGZpbGVuYW1lKQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldEF4aXNDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoYWMpOwotICAgICAgICBhc3NlcnRFcXVhbHMoYWMuZ2V0RGVmYXVsdE1vZHVsZVZlcnNpb24oImFiYyIpLCAiMS4yMyIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoYWMuZ2V0RGVmYXVsdE1vZHVsZVZlcnNpb24oImZvbyIpLCAiMC44OSIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDYWxjdWxhdGVEZWZhdWx0TW9kdWxlVmVyc2lvbnMoKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZ3VyYXRpb24gPSBuZXcgQXhpc0NvbmZpZ3VyYXRpb24oKTsKLSAgICAgICAgQXhpc01vZHVsZSBtb2R1bGUxID0gbmV3IEF4aXNNb2R1bGUoKTsKLSAgICAgICAgbW9kdWxlMS5zZXRBcmNoaXZlTmFtZSgiTW9kdWxlMSIpOwotICAgICAgICBheGlzQ29uZmlndXJhdGlvbi5hZGRNb2R1bGUobW9kdWxlMSk7Ci0KLSAgICAgICAgQXhpc01vZHVsZSBtb2R1bGUyID0gbmV3IEF4aXNNb2R1bGUoKTsKLSAgICAgICAgbW9kdWxlMi5zZXRBcmNoaXZlTmFtZSgiTW9kdWxlMi0wLjk0Iik7Ci0gICAgICAgIGF4aXNDb25maWd1cmF0aW9uLmFkZE1vZHVsZShtb2R1bGUyKTsKLQotICAgICAgICBBeGlzTW9kdWxlIG1vZHVsZTMgPSBuZXcgQXhpc01vZHVsZSgpOwotICAgICAgICBtb2R1bGUzLnNldEFyY2hpdmVOYW1lKCJNb2R1bGUyLTAuOTUiKTsKLSAgICAgICAgYXhpc0NvbmZpZ3VyYXRpb24uYWRkTW9kdWxlKG1vZHVsZTMpOwotCi0gICAgICAgIEF4aXNNb2R1bGUgbW9kdWxlNCA9IG5ldyBBeGlzTW9kdWxlKCk7Ci0gICAgICAgIG1vZHVsZTQuc2V0QXJjaGl2ZU5hbWUoIk1vZHVsZTItMC45MyIpOwotICAgICAgICBheGlzQ29uZmlndXJhdGlvbi5hZGRNb2R1bGUobW9kdWxlNCk7Ci0KLSAgICAgICAgQXhpc01vZHVsZSBtb2R1bGU1ID0gbmV3IEF4aXNNb2R1bGUoKTsKLSAgICAgICAgbW9kdWxlNS5zZXRBcmNoaXZlTmFtZSgidGVzdE1vZHVsZS0xLjkzIik7Ci0gICAgICAgIGF4aXNDb25maWd1cmF0aW9uLmFkZE1vZHVsZShtb2R1bGU1KTsKLQotICAgICAgICBVdGlscy5jYWxjdWxhdGVEZWZhdWx0TW9kdWxlVmVyc2lvbihheGlzQ29uZmlndXJhdGlvbi5nZXRNb2R1bGVzKCksIGF4aXNDb25maWd1cmF0aW9uKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG1vZHVsZTEsIGF4aXNDb25maWd1cmF0aW9uLmdldERlZmF1bHRNb2R1bGUoIk1vZHVsZTEiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhtb2R1bGUzLCBheGlzQ29uZmlndXJhdGlvbi5nZXREZWZhdWx0TW9kdWxlKCJNb2R1bGUyIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMobW9kdWxlNSwgYXhpc0NvbmZpZ3VyYXRpb24uZ2V0RGVmYXVsdE1vZHVsZSgidGVzdE1vZHVsZSIpKTsKLSAgICAgICAgYXhpc0NvbmZpZ3VyYXRpb24uZW5nYWdlTW9kdWxlKCJNb2R1bGUyIik7Ci0gICAgICAgIGF4aXNDb25maWd1cmF0aW9uLmVuZ2FnZU1vZHVsZSgiTW9kdWxlMSIpOwotICAgICAgICBheGlzQ29uZmlndXJhdGlvbi5lbmdhZ2VNb2R1bGUoInRlc3RNb2R1bGUiLCAiMS45MyIpOwotCi0gICAgICAgIEl0ZXJhdG9yIGVuZ2FnZU1vZHVsZXMgPSBheGlzQ29uZmlndXJhdGlvbi5nZXRFbmdhZ2VkTW9kdWxlcygpLml0ZXJhdG9yKCk7Ci0gICAgICAgIGJvb2xlYW4gZm91bmQxID0gZmFsc2U7Ci0gICAgICAgIGJvb2xlYW4gZm91bmQyID0gZmFsc2U7Ci0gICAgICAgIGJvb2xlYW4gZm91bmQzID0gZmFsc2U7Ci0gICAgICAgIHdoaWxlIChlbmdhZ2VNb2R1bGVzLmhhc05leHQoKSkgewotICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSAoKEF4aXNNb2R1bGUpZW5nYWdlTW9kdWxlcy5uZXh0KCkpLmdldEFyY2hpdmVOYW1lKCk7Ci0gICAgICAgICAgICBpZiAobmFtZS5lcXVhbHMoIk1vZHVsZTItMC45NSIpKSB7Ci0gICAgICAgICAgICAgICAgZm91bmQxID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChuYW1lLmVxdWFscygiTW9kdWxlMSIpKSB7Ci0gICAgICAgICAgICAgICAgZm91bmQyID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChuYW1lLmVxdWFscygidGVzdE1vZHVsZS0xLjkzIikpIHsKLSAgICAgICAgICAgICAgICBmb3VuZDMgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFmb3VuZDEpIHsKLSAgICAgICAgICAgIGZhaWwoIkRpZG4ndCBmaW5kIE1vZHVsZTItMC45NSIpOwotICAgICAgICB9Ci0gICAgICAgIGlmICghZm91bmQyKSB7Ci0gICAgICAgICAgICBmYWlsKCJEaWRuJ3QgZmluZCBNb2R1bGUxIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFmb3VuZDMpIHsKLSAgICAgICAgICAgIGZhaWwoIkRpZG4ndCBmaW5kIHRlc3RNb2R1bGUtMS45MyIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgIHB1YmxpYyB2b2lkIHRlc3RNb2R1bGVXaXRoU05BUFNIT1QoKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZ3VyYXRpb24gPSBuZXcgQXhpc0NvbmZpZ3VyYXRpb24oKTsKLSAgICAgICAgQXhpc01vZHVsZSBtb2R1bGUxID0gbmV3IEF4aXNNb2R1bGUoKTsKLSAgICAgICAgbW9kdWxlMS5zZXRBcmNoaXZlTmFtZSgiTW9kdWxlMSIpOwotICAgICAgICBheGlzQ29uZmlndXJhdGlvbi5hZGRNb2R1bGUobW9kdWxlMSk7Ci0KLSAgICAgICAgQXhpc01vZHVsZSBtb2R1bGUyID0gbmV3IEF4aXNNb2R1bGUoKTsKLSAgICAgICAgbW9kdWxlMi5zZXRBcmNoaXZlTmFtZSgiTW9kdWxlMS1TTkFQU0hPVCIpOwotICAgICAgICBheGlzQ29uZmlndXJhdGlvbi5hZGRNb2R1bGUobW9kdWxlMik7Ci0KLSAgICAgICAgQXhpc01vZHVsZSBtb2R1bGUzID0gbmV3IEF4aXNNb2R1bGUoKTsKLSAgICAgICAgbW9kdWxlMy5zZXRBcmNoaXZlTmFtZSgiTW9kdWxlMS0wLjk1Iik7Ci0gICAgICAgIGF4aXNDb25maWd1cmF0aW9uLmFkZE1vZHVsZShtb2R1bGUzKTsKLSAgICAgICAgVXRpbHMuY2FsY3VsYXRlRGVmYXVsdE1vZHVsZVZlcnNpb24oYXhpc0NvbmZpZ3VyYXRpb24uZ2V0TW9kdWxlcygpLCBheGlzQ29uZmlndXJhdGlvbik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhtb2R1bGUyLCBheGlzQ29uZmlndXJhdGlvbi5nZXREZWZhdWx0TW9kdWxlKCJNb2R1bGUxIikpOwotICAgIH0KLQotCi0gICAgIHB1YmxpYyB2b2lkIHRlc3RNb2R1bGVXaXRoU05BUFNIT1QyKCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIEF4aXNDb25maWd1cmF0aW9uIGF4aXNDb25maWd1cmF0aW9uID0gbmV3IEF4aXNDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgIEF4aXNNb2R1bGUgbW9kdWxlMSA9IG5ldyBBeGlzTW9kdWxlKCk7Ci0gICAgICAgIG1vZHVsZTEuc2V0QXJjaGl2ZU5hbWUoIk1vZHVsZTEtYSIpOwotICAgICAgICBheGlzQ29uZmlndXJhdGlvbi5hZGRNb2R1bGUobW9kdWxlMSk7Ci0KLSAgICAgICAgQXhpc01vZHVsZSBtb2R1bGUyID0gbmV3IEF4aXNNb2R1bGUoKTsKLSAgICAgICAgbW9kdWxlMi5zZXRBcmNoaXZlTmFtZSgiTW9kdWxlMS1hLVNOQVBTSE9UIik7Ci0gICAgICAgIGF4aXNDb25maWd1cmF0aW9uLmFkZE1vZHVsZShtb2R1bGUyKTsKLQotICAgICAgICBBeGlzTW9kdWxlIG1vZHVsZTMgPSBuZXcgQXhpc01vZHVsZSgpOwotICAgICAgICBtb2R1bGUzLnNldEFyY2hpdmVOYW1lKCJNb2R1bGUxLWEtMC45NSIpOwotICAgICAgICBheGlzQ29uZmlndXJhdGlvbi5hZGRNb2R1bGUobW9kdWxlMyk7Ci0gICAgICAgIFV0aWxzLmNhbGN1bGF0ZURlZmF1bHRNb2R1bGVWZXJzaW9uKGF4aXNDb25maWd1cmF0aW9uLmdldE1vZHVsZXMoKSwgYXhpc0NvbmZpZ3VyYXRpb24pOwotICAgICAgICBVdGlscy5jYWxjdWxhdGVEZWZhdWx0TW9kdWxlVmVyc2lvbihheGlzQ29uZmlndXJhdGlvbi5nZXRNb2R1bGVzKCksIGF4aXNDb25maWd1cmF0aW9uKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG1vZHVsZTIsIGF4aXNDb25maWd1cmF0aW9uLmdldERlZmF1bHRNb2R1bGUoIk1vZHVsZTEtYSIpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvT3BlcmF0aW9uRXhjbHVkZVRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9PcGVyYXRpb25FeGNsdWRlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjQ0Mzc3Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9PcGVyYXRpb25FeGNsdWRlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BYnN0cmFjdFRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnBoYXNlcmVzb2x2ZXIuUGhhc2VFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgT3BlcmF0aW9uRXhjbHVkZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgQXhpc0NvbmZpZ3VyYXRpb24gZXI7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXhjbHVkZU9wZXJhdGlvbnMoKSB0aHJvd3MgUGhhc2VFeGNlcHRpb24sCi0gICAgICAgICAgICBEZXBsb3ltZW50RXhjZXB0aW9uLAotICAgICAgICAgICAgQXhpc0ZhdWx0LAotICAgICAgICAgICAgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIGZpbGVuYW1lID0gQWJzdHJhY3RUZXN0Q2FzZS5iYXNlZGlyICsgIi90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L2V4Y3VsZVJlcG8iOwotICAgICAgICBlciA9IENvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeS5jcmVhdGVDb25maWd1cmF0aW9uQ29udGV4dEZyb21GaWxlU3lzdGVtKGZpbGVuYW1lLCBmaWxlbmFtZSArICIvYXhpczIueG1sIikKLSAgICAgICAgICAgICAgICAuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKTsKLSAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSA9IGVyLmdldFNlcnZpY2UoImV4Y2x1ZGVTZXJ2aWNlIik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZS5nZXRPcGVyYXRpb24obmV3IFFOYW1lKCJkZWR1YyIpKSk7Ci0gICAgICAgIGFzc2VydE51bGwoc2VydmljZS5nZXRPcGVyYXRpb24obmV3IFFOYW1lKCJhZGQiKSkpOwotICAgIH0KLQotfQotCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvT3BlcmF0aW9uTW9kdWxlVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L09wZXJhdGlvbk1vZHVsZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTEwMjZkOC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvT3BlcmF0aW9uTW9kdWxlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BYnN0cmFjdFRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0aW9uOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1wdWJsaWMgY2xhc3MgT3BlcmF0aW9uTW9kdWxlVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICAvKioKLSAgICAgKiBDb25maXJtIHRoYXQgYW4gb3BlcmF0aW9uIG1vZHVsZSBhKSBkb2Vzbid0IGNhdXNlIGFueSBkZXBsb3ltZW50IHByb2JsZW1zLCBhbmQKLSAgICAgKiBiKSBjb3JyZWN0bHkgY29uZmlndXJlcyB0aGUgQXhpc09wZXJhdGlvbi4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgcHJvYmxlbQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RPcGVyYXRpb25Nb2R1bGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ3R4ID0KLSAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkuY3JlYXRlQ29uZmlndXJhdGlvbkNvbnRleHRGcm9tRmlsZVN5c3RlbSgKLSAgICAgICAgICAgICAgICAgICAgICAgIEFic3RyYWN0VGVzdENhc2UuYmFzZWRpciArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9BeGlzTWVzc2FnZVRlc3RSZXBvIik7Ci0gICAgICAgIEF4aXNDb25maWd1cmF0aW9uIGNvbmZpZyA9IGNvbmZpZ0N0eC5nZXRBeGlzQ29uZmlndXJhdGlvbigpOwotICAgICAgICBBeGlzU2VydmljZSBzZXJ2aWNlID0gY29uZmlnLmdldFNlcnZpY2UoIk1lc3NhZ2V0ZXN0U2VydmljZSIpOwotICAgICAgICBhc3NlcnROb3ROdWxsKCJDb3VsZG4ndCBmaW5kIHNlcnZpY2UiLCBzZXJ2aWNlKTsKLSAgICAgICAgQXhpc09wZXJhdGlvbiBvcGVyYXRpb24gPSBzZXJ2aWNlLmdldE9wZXJhdGlvbihuZXcgUU5hbWUoImVjaG9TdHJpbmciKSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoIkNvdWxkbid0IGZpbmQgb3BlcmF0aW9uIiwgb3BlcmF0aW9uKTsKLSAgICAgICAgQXJyYXlMaXN0IG1vZHVsZVJlZnMgPSBvcGVyYXRpb24uZ2V0TW9kdWxlUmVmcygpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIldyb25nICMgb2YgbW9kdWxlcyIsIDEsIG1vZHVsZVJlZnMuc2l6ZSgpKTsKLSAgICAgICAgU3RyaW5nIG1vZHVsZU5hbWUgPSAoU3RyaW5nKW1vZHVsZVJlZnMuZ2V0KDApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIldyb25nIG1vZHVsZSBuYW1lIiwgIm1vZHVsZTEiLCBtb2R1bGVOYW1lKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvU09BUFJvbGVDb25maWd1cmF0aW9uVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L1NPQVBSb2xlQ29uZmlndXJhdGlvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWEyODJiNy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvU09BUFJvbGVDb25maWd1cmF0aW9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50Ow0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5Sb2xlUGxheWVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkFic3RyYWN0VGVzdENhc2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzQ29uZmlndXJhdGlvbjsNCi0NCi1wdWJsaWMgY2xhc3MgU09BUFJvbGVDb25maWd1cmF0aW9uVGVzdCBleHRlbmRzIFRlc3RDYXNlew0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3VzdG9tU09BUFJvbGVDb25maWd1cmF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbnsNCi0JCVN0cmluZyBmaWxlbmFtZSA9DQotICAgICAgICAgICAgQWJzdHJhY3RUZXN0Q2FzZS5iYXNlZGlyICsgIi90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L3NvYXByb2xlY29uZmlndXJhdGlvbiI7DQotCQlBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlnID0gQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5DQotICAgICAgICAgICAgLmNyZWF0ZUNvbmZpZ3VyYXRpb25Db250ZXh0RnJvbUZpbGVTeXN0ZW0oZmlsZW5hbWUgLCBmaWxlbmFtZSArICIvYXhpczIueG1sIikNCi0gICAgICAgICAgICAuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKTsNCi0JCVJvbGVQbGF5ZXIgcm9sZVBsYXllciA9IChSb2xlUGxheWVyKWF4aXNDb25maWcuZ2V0UGFyYW1ldGVyVmFsdWUoQ29uc3RhbnRzLlNPQVBfUk9MRV9QTEFZRVJfUEFSQU1FVEVSKTsNCi0JCWFzc2VydE5vdE51bGwocm9sZVBsYXllcik7DQotCQlhc3NlcnRGYWxzZShyb2xlUGxheWVyLmlzVWx0aW1hdGVEZXN0aW5hdGlvbigpKTsNCi0JCWFzc2VydEVxdWFscygxLCByb2xlUGxheWVyLmdldFJvbGVzKCkuc2l6ZSgpKTsNCi0JCWFzc2VydEVxdWFscygiaHR0cDovL215L2N1c3RvbS9yb2xlIiwgcm9sZVBsYXllci5nZXRSb2xlcygpLmdldCgwKSk7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L1NhbWVTZXJ2aWNlQWRkaW5nVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L1NhbWVTZXJ2aWNlQWRkaW5nVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGMyOGRlLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9TYW1lU2VydmljZUFkZGluZ1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlR3JvdXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0NvbmZpZ3VyYXRpb247Ci0KLS8qKgotICogVGhpcyB0ZXN0IGNvbmZpcm1zIHRoYXQgd2UgYmVoYXZlIGNvcnJlY3RseSB3aGVuIGFkZGluZyBTZXJ2aWNlR3JvdXBzIHdpdGggZHVwbGljYXRlCi0gKiBTZXJ2aWNlcyB0byBvbmVzIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gZGVwbG95ZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBTYW1lU2VydmljZUFkZGluZ1Rlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgQXhpc0NvbmZpZ3VyYXRpb24gY29uZmlnOwotCi0gICAgcHVibGljIHZvaWQgdGVzdFNlcnZpY2VHcm91cCgpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBmaW5hbCBTdHJpbmcgU0VSVklDRTEgPSAic2VyZXZpY2UxIjsKLSAgICAgICAgZmluYWwgU3RyaW5nIFNFUlZJQ0UyID0gInNlcmV2aWNlMiI7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBTRVJWSUNFNCA9ICJzZXJldmljZTQiOwotICAgICAgICBmaW5hbCBTdHJpbmcgU0VSVklDRV9HUk9VUDIgPSAiU2VydmljZUdyb3VwMiI7Ci0KLSAgICAgICAgY29uZmlnID0gQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5LmNyZWF0ZUVtcHR5Q29uZmlndXJhdGlvbkNvbnRleHQoKQotICAgICAgICAgICAgICAgIC5nZXRBeGlzQ29uZmlndXJhdGlvbigpOwotCi0gICAgICAgIC8vIEZpcnN0IGNyZWF0ZSBhIFNlcnZpY2VHcm91cCB3aXRoIFMxIGFuZCBTNAotICAgICAgICBBeGlzU2VydmljZUdyb3VwIGF4aXNTZXJ2aWNlR3JvdXAxID0gbmV3IEF4aXNTZXJ2aWNlR3JvdXAoKTsKLSAgICAgICAgYXhpc1NlcnZpY2VHcm91cDEuc2V0U2VydmljZUdyb3VwTmFtZSgiU2VydmljZUdyb3VwMSIpOwotICAgICAgICBBeGlzU2VydmljZSBzZXJ2aWNlMSA9IG5ldyBBeGlzU2VydmljZSgpOwotICAgICAgICBzZXJ2aWNlMS5zZXROYW1lKFNFUlZJQ0UxKTsKLSAgICAgICAgYXhpc1NlcnZpY2VHcm91cDEuYWRkU2VydmljZShzZXJ2aWNlMSk7Ci0KLSAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZTQgPSBuZXcgQXhpc1NlcnZpY2UoKTsKLSAgICAgICAgc2VydmljZTQuc2V0TmFtZShTRVJWSUNFNCk7Ci0gICAgICAgIGF4aXNTZXJ2aWNlR3JvdXAxLmFkZFNlcnZpY2Uoc2VydmljZTQpOwotICAgICAgICBjb25maWcuYWRkU2VydmljZUdyb3VwKGF4aXNTZXJ2aWNlR3JvdXAxKTsKLQotICAgICAgICAvLyBOb3cgY3JlYXRlIGFub3RoZXIgU2VydmljZUdyb3VwIHdpdGggUzIgYW5kIFM0Ci0gICAgICAgIEF4aXNTZXJ2aWNlR3JvdXAgYXhpc1NlcnZpY2VHcm91cDIgPSBuZXcgQXhpc1NlcnZpY2VHcm91cCgpOwotICAgICAgICBheGlzU2VydmljZUdyb3VwMi5zZXRTZXJ2aWNlR3JvdXBOYW1lKFNFUlZJQ0VfR1JPVVAyKTsKLSAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZTIgPSBuZXcgQXhpc1NlcnZpY2UoKTsKLSAgICAgICAgc2VydmljZTIuc2V0TmFtZShTRVJWSUNFMik7Ci0gICAgICAgIGF4aXNTZXJ2aWNlR3JvdXAyLmFkZFNlcnZpY2Uoc2VydmljZTIpOwotCi0gICAgICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2UyNCA9IG5ldyBBeGlzU2VydmljZSgpOwotICAgICAgICBzZXJ2aWNlMjQuc2V0TmFtZShTRVJWSUNFNCk7Ci0gICAgICAgIGF4aXNTZXJ2aWNlR3JvdXAyLmFkZFNlcnZpY2Uoc2VydmljZTI0KTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIFRoaXMgc2hvdWxkIGZhaWwhCi0gICAgICAgICAgICBjb25maWcuYWRkU2VydmljZUdyb3VwKGF4aXNTZXJ2aWNlR3JvdXAyKTsKLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGF4aXNGYXVsdCkgewotICAgICAgICAgICAgLy8gVGhpcyBpcyBleHBlY3RlZCBiZWNhdXNlIFM0IHdhcyBhIGR1cGxpY2F0ZSBuYW1lIHRvIGFuIGFscmVhZHkgZXhpc3Rpbmcgc2VydmljZQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiQ2F1Z2h0IHRoZSB3cm9uZyBmYXVsdCEiLCBheGlzRmF1bHQuZ2V0TWVzc2FnZSgpLmluZGV4T2YoU0VSVklDRTQpID4gLTEpOwotICAgICAgICB9Ci0KLQotICAgICAgICBBeGlzU2VydmljZSBzZXJ2aWNlID0gY29uZmlnLmdldFNlcnZpY2UoU0VSVklDRTEpOwotICAgICAgICBhc3NlcnROb3ROdWxsKCJTZXJ2aWNlIDEgd2Fzbid0IGRlcGxveWVkISIsIHNlcnZpY2UpOwotICAgICAgICBzZXJ2aWNlID0gY29uZmlnLmdldFNlcnZpY2UoU0VSVklDRTQpOwotICAgICAgICBhc3NlcnROb3ROdWxsKCJTZXJ2aWNlIDQgd2Fzbid0IGRlcGxveWVkISIsIHNlcnZpY2UpOwotCi0gICAgICAgIHNlcnZpY2UgPSBjb25maWcuZ2V0U2VydmljZShTRVJWSUNFMik7Ci0gICAgICAgIGFzc2VydE51bGwoIlNlcnZpY2UgMiB3YXNuJ3Qgc3VwcG9zZWQgdG8gYmUgZGVwbG95ZWQhIiwgc2VydmljZSk7Ci0gICAgICAgIGFzc2VydE51bGwoIlNlcnZpY2VHcm91cDIgd2Fzbid0IHN1cHBvc2VkIHRvIGJlIGRlcGxveWVkISIsCi0gICAgICAgICAgICAgICAgICAgY29uZmlnLmdldFNlcnZpY2VHcm91cCgic2VydmljZTIiKSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvU2VydmljZUdyb3VwVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L1NlcnZpY2VHcm91cFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2VjNjkxZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvU2VydmljZUdyb3VwVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BYnN0cmFjdFRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlR3JvdXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0NvbmZpZ3VyYXRpb247Ci0KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlR3JvdXBUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotICAgIEF4aXNDb25maWd1cmF0aW9uIGFyOwotICAgIFN0cmluZyByZXBvID0gQWJzdHJhY3RUZXN0Q2FzZS5iYXNlZGlyICsgIi90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L3NlcnZpY2VHcm91cFJlcG8iOwotCi0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhciA9IENvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeS5jcmVhdGVDb25maWd1cmF0aW9uQ29udGV4dEZyb21GaWxlU3lzdGVtKHJlcG8sIHJlcG8gKyAiL2F4aXMyLnhtbCIpCi0gICAgICAgICAgICAgICAgLmdldEF4aXNDb25maWd1cmF0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNlcnZpY2VHcm91cCgpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBBeGlzU2VydmljZUdyb3VwIHNnZCA9IGFyLmdldFNlcnZpY2VHcm91cCgic2VydmljZUdyb3VwIik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2dkKTsKLSAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZTEgPSBhci5nZXRTZXJ2aWNlKCJzZXJ2aWNlMSIpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2UxKTsKLSAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZTIgPSBhci5nZXRTZXJ2aWNlKCJzZXJ2aWNlMiIpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2UyKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9TcGVha2luZ0hhbmRsZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9TcGVha2luZ0hhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA4ZmEyMi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvU3BlYWtpbmdIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5IYW5kbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaGFuZGxlcnMuQWJzdHJhY3RIYW5kbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgU3BlYWtpbmdIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyIGltcGxlbWVudHMgSGFuZGxlciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coU3BlYWtpbmdIYW5kbGVyLmNsYXNzKTsKLSAgICBwcml2YXRlIFN0cmluZyBtZXNzYWdlOwotICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0KLSAgICBwdWJsaWMgU3BlYWtpbmdIYW5kbGVyKCkgewotICAgICAgICB0aGlzLm1lc3NhZ2UgPSAiSGkgSSBhbXRlc3RpbmcgIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBJbnZvY2F0aW9uUmVzcG9uc2UgaW52b2tlKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBsb2cuaW5mbygiSSBhbSAiICsgbWVzc2FnZSArICIgSGFuZGxlciBSdW5uaW5nIDopIik7Ci0gICAgICAgIHJldHVybiBJbnZvY2F0aW9uUmVzcG9uc2UuQ09OVElOVUU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmV2b2tlKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHsKLSAgICAgICAgbG9nLmluZm8oIkkgYW0gIiArIG1lc3NhZ2UgKyAiIEhhbmRsZXIgUnVubmluZyA6KSIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9TeXN0ZW1QaGFzZXNyZW1vdmVkVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L1N5c3RlbVBoYXNlc3JlbW92ZWRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3Yzg5NTEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L1N5c3RlbVBoYXNlc3JlbW92ZWRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgU3lzdGVtUGhhc2VzcmVtb3ZlZFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBBeGlzQ29uZmlndXJhdGlvbiBlcjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coU3lzdGVtUGhhc2VzcmVtb3ZlZFRlc3QuY2xhc3MpOwotCi0gICAgcHVibGljIHZvaWQgdGVzdFBoYXNlT3JkZXJjaGFnZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFN0cmluZyBmaWxlbmFtZSA9ICIuL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvU3lzdGVtUGhhc2VSZW1vdmUiOwotICAgICAgICAgICAgZXIgPSBDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkKLSAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZUNvbmZpZ3VyYXRpb25Db250ZXh0RnJvbUZpbGVTeXN0ZW0oZmlsZW5hbWUsIGZpbGVuYW1lICsgIi9heGlzMi54bWwiKQotICAgICAgICAgICAgICAgICAgICAuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKTsKLSAgICAgICAgICAgIGZhaWwoCi0gICAgICAgICAgICAgICAgICAgICJ0aGlzIG11c3QgZmFpbGVkIGdyYWNlZnVsbHkgd2l0aCBEZXBsb3ltZW50RXhjZXB0aW9uIFwiSW52YWxpZCBTeXN0ZW0gcHJlZGVmaW5lZCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5waGFzZXMgLCBwaGFzZSBvcmRlciBkb2VzIG5vdFwiICtcbiBzdXBwb3J0XFxuIHJlY2hlY2sgYXhpczIueG1sXCIiKTsKLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGUpIHsKLSAgICAgICAgICAgIGxvZy5pbmZvKGUuZ2V0Q2F1c2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9kZXBsb3llcnMvQ3VzdG9tRGVwbG95ZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9kZXBsb3llcnMvQ3VzdG9tRGVwbG95ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzUwNzQyYS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvZGVwbG95ZXJzL0N1c3RvbURlcGxveWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQuZGVwbG95ZXJzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC5EZXBsb3llcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQuRGVwbG95bWVudEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQucmVwb3NpdG9yeS51dGlsLkRlcGxveW1lbnRGaWxlRGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotCi0vKioKLSAqIEEgY3VzdG9tIERlcGxveWVyIGluc3RhbmNlIGZvciB0ZXN0aW5nLiAgVGhpcyBjb29yZGluYXRlcyB3aXRoIHRoZSBDdXN0b21EZXBsb3llclRlc3QgYW5kCi0gKiB0aGUgQ3VzdG9tRGVwbG95ZXJSZXBvLyByZXBvc2l0b3J5IGluIHRlc3QtcmVzb3VyY2VzLy4gIEl0J3MgZ29pbmcgdG8gYmUgc2V0IHVwIHRvIGRlcGxveQotICogInN2YyIgZmlsZXMsIGJvdGggaW4gdGhlIHNlcnZpY2VzLyBkaXJlY3RvcnkgYW5kIGluIHRoZSB3aWRnZXRzLyBkaXJlY3RvcnkuICBBZnRlciB0aGUKLSAqIGNvbmZpZyBpcyBjb21wbGV0ZSwgd2Ugc2hvdWxkIGhhdmUgMiBkZXBsb3llZCBpdGVtcywgYW5kIHNob3VsZCBoYXZlIGZvdW5kIGJvdGggIk1hcnkiIGFuZAotICogIkdlb3JnZSIgKHNlZSB0aGUgcmVwbyBmb3IgdGVzdCBkYXRhKS4gIFdlIHVzZSBzdGF0aWMgZmllbGRzIHRvIGtlZXAgYWxsIHRoaXMgaW5mb3JtYXRpb24KLSAqIGluIGEgd2F5IHRoYXQgdGhlIHRlc3QgY2FuIGFjY2VzcyBpdC4KLSAqLwotcHVibGljIGNsYXNzIEN1c3RvbURlcGxveWVyIGltcGxlbWVudHMgRGVwbG95ZXIgewotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEN1c3RvbURlcGxveWVyLmNsYXNzKTsKLQotICAgIC8qKiBIYXMgaW5pdCgpIGJlZW4gY2FsbGVkPyAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpbml0Q2FsbGVkOwotICAgIC8qKiBUaGlzIGlzIHNldCB0byB0aGUgbGFzdCBhcmd1bWVudCB0byBzZXREaXJlY3RvcnkoKSAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpcmVjdG9yeTsKLSAgICAvKiogVGhpcyBpcyBzZXQgdG8gdGhlIGxhc3QgYXJndW1lbnQgdG8gc2V0RXh0ZW5zaW9uKCkgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBleHRlbnNpb247Ci0gICAgLyoqIFRoZSBjb3VudCBvZiBkZXBsb3llZCBpdGVtcyAqLwotICAgIHB1YmxpYyBzdGF0aWMgaW50IGRlcGxveWVkSXRlbXM7Ci0gICAgLyoqIFNldCB0byB0cnVlIGlmICJHZW9yZ2UiIGhhcyBiZWVuIGRlcGxveWVkICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGdlb3JnZURlcGxveWVkOwotICAgIC8qKiBTZXQgdG8gdHJ1ZSBpZiAiTWFyeSIgaGFzIGJlZW4gZGVwbG95ZWQgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gbWFyeURlcGxveWVkOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fTkFNRSA9ICJjdXN0b21EZXBsb3llclBhcmFtIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9WQUwgPSAiY3VzdG9tRGVwbG95ZXIgcGFyYW1ldGVyIHZhbHVlIjsKLQotICAgIC8qKgotICAgICAqIEluaXRpYWxpemUgdGhlIERlcGxveWVyCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29uZmlnQ3R4IG91ciBDb25maWd1cmF0aW9uQ29udGV4dAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGluaXQoQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ3R4KSB7Ci0gICAgICAgIGluaXRDYWxsZWQgPSB0cnVlOwotCi0gICAgICAgIC8vIFNldCBhIHByb3BlcnR5IG9uIHRoZSBBeGlzQ29uZmlnIGp1c3QgdG8gbWFrZSBzdXJlIHdlIGVuZCB1cCB3aXRoIHRoZSByaWdodCBvbmUKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNvbmZpZ0N0eC5nZXRBeGlzQ29uZmlndXJhdGlvbigpLmFkZFBhcmFtZXRlcihQQVJBTV9OQU1FLCBQQVJBTV9WQUwpOwotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgYXhpc0ZhdWx0KSB7Ci0gICAgICAgICAgICAvLyBUd28gY29tbWVudHMgLSAxKSB3aHkgdGhlIGhlY2sgZG9lcyBhZGRQYXJhbWV0ZXIgdGhyb3cgQXhpc0ZhdWx0PwotICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgMikgd2h5IGRvZXNuJ3QgaW5pdCgpIHRocm93IEF4aXNGYXVsdD8KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByb2Nlc3MgYSBmaWxlIGFuZCBhZGQgaXQgdG8gdGhlIGNvbmZpZ3VyYXRpb24KLSAgICAgKgotICAgICAqIEBwYXJhbSBkZXBsb3ltZW50RmlsZURhdGEgdGhlIERlcGxveW1lbnRGaWxlRGF0YSBvYmplY3QgdG8gZGVwbG95Ci0gICAgICogQHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQuRGVwbG95bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgIGlmIHRoZXJlIGlzIGEgcHJvYmxlbQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRlcGxveShEZXBsb3ltZW50RmlsZURhdGEgZGVwbG95bWVudEZpbGVEYXRhKSB0aHJvd3MgRGVwbG95bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIGxvZy5pbmZvKCJEZXBsb3lpbmcgLSAiICsgZGVwbG95bWVudEZpbGVEYXRhLmdldE5hbWUoKSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBGaWxlSW5wdXRTdHJlYW0gZmlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShkZXBsb3ltZW50RmlsZURhdGEuZ2V0RmlsZSgpKTsKLSAgICAgICAgICAgIGludCB4PSBmaXMuYXZhaWxhYmxlKCk7Ci0gICAgICAgICAgICBieXRlIGJbXT0gbmV3IGJ5dGVbeF07Ci0gICAgICAgICAgICBmaXMucmVhZChiKTsKLSAgICAgICAgICAgIFN0cmluZyBjb250ZW50ID0gbmV3IFN0cmluZyhiKTsKLSAgICAgICAgICAgIGlmIChjb250ZW50LmluZGV4T2YoIkdlb3JnZSIpID4gLTEpIGdlb3JnZURlcGxveWVkID0gdHJ1ZTsKLSAgICAgICAgICAgIGlmIChjb250ZW50LmluZGV4T2YoIk1hcnkiKSA+IC0xKSBtYXJ5RGVwbG95ZWQgPSB0cnVlOwotICAgICAgICAgICAgZGVwbG95ZWRJdGVtcysrOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGRpcmVjdG9yeQotICAgICAqCi0gICAgICogQHBhcmFtIGRpcmVjdG9yeSBkaXJlY3RvcnkgbmFtZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERpcmVjdG9yeShTdHJpbmcgZGlyZWN0b3J5KSB7Ci0gICAgICAgIEN1c3RvbURlcGxveWVyLmRpcmVjdG9yeSA9IGRpcmVjdG9yeTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGV4dGVuc2lvbiB0byBsb29rIGZvciBUT0RPOiBTdXBwb3J0IG11bHRpcGxlIGV4dGVuc2lvbnM/Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gZXh0ZW5zaW9uIHRoZSBmaWxlIGV4dGVuc2lvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyBEZXBsb3llcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEV4dGVuc2lvbihTdHJpbmcgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIEN1c3RvbURlcGxveWVyLmV4dGVuc2lvbiA9IGV4dGVuc2lvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmUgYSBnaXZlbiBmaWxlIGZyb20gdGhlIGNvbmZpZ3VyYXRpb24KLSAgICAgKgotICAgICAqIEBwYXJhbSBmaWxlTmFtZSBuYW1lIG9mIGl0ZW0gdG8gcmVtb3ZlCi0gICAgICogQHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQuRGVwbG95bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgIGlmIHRoZXJlIGlzIGEgcHJvYmxlbQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHVuRGVwbG95KFN0cmluZyBmaWxlTmFtZSkgdGhyb3dzIERlcGxveW1lbnRFeGNlcHRpb24gewotICAgICAgICAvLyBVbmRlcGxveQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC91dGlsL0JlYW5FeGNsdWRlSW5mb1Rlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC91dGlsL0JlYW5FeGNsdWRlSW5mb1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBmNGE1NC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvdXRpbC9CZWFuRXhjbHVkZUluZm9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC51dGlsOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi0KLXB1YmxpYyBjbGFzcyBCZWFuRXhjbHVkZUluZm9UZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHVibGljIHZvaWQgdGVzdElzRXhjbHVkZWRQcm9wZXJ0eSgpewotICAgICAgICBCZWFuRXhjbHVkZUluZm8gYmVhbkV4Y2x1ZGVJbmZvID0gbmV3IEJlYW5FeGNsdWRlSW5mbygiW0Etel0qU3RyaW5nfERheVBob25lVFRZIiwiRGF5UGhvbmVUVFlTdHJpbmciKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShiZWFuRXhjbHVkZUluZm8uaXNFeGNsdWRlZFByb3BlcnR5KCJEZXRhaWxzU3RyaW5nIikpOwotICAgICAgICBhc3NlcnRGYWxzZShiZWFuRXhjbHVkZUluZm8uaXNFeGNsdWRlZFByb3BlcnR5KCJEYXlQaG9uZVRUWVN0cmluZyIpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoYmVhbkV4Y2x1ZGVJbmZvLmlzRXhjbHVkZWRQcm9wZXJ0eSgiRWxlbWVudERldGlscyIpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvdXRpbC9FeGNsdWRlSW5mb1Rlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC91dGlsL0V4Y2x1ZGVJbmZvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDczN2FmLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC91dGlsL0V4Y2x1ZGVJbmZvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQudXRpbDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotCi1wdWJsaWMgY2xhc3MgRXhjbHVkZUluZm9UZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHVibGljIHZvaWQgdGVzdEdldEJlYW5FeGNsdWRlSW5mb0ZvckNsYXNzKCl7Ci0gICAgICAgIEV4Y2x1ZGVJbmZvIGV4Y2x1ZGVJbmZvID0gbmV3IEV4Y2x1ZGVJbmZvKCk7Ci0gICAgICAgIGV4Y2x1ZGVJbmZvLnB1dEJlYW5JbmZvKCJvcmcua3AuYW51aGFrLmNkci50ZXN0LltBLXpdKiIsbmV3IEJlYW5FeGNsdWRlSW5mbygiW0Etel0qQm9vbCIsImlzW0Etel0qIikpOwotICAgICAgICBleGNsdWRlSW5mby5wdXRCZWFuSW5mbygib3JnLmtwLmFudWhhay5jZHIudHlwZXMuW0Etel0qIixuZXcgQmVhbkV4Y2x1ZGVJbmZvKCJbQS16XSpTdHJpbmciLG51bGwpKTsKLSAgICAgICAgZXhjbHVkZUluZm8ucHV0QmVhbkluZm8oIm9yZy5rcC5hbnVoYWsubWV0YS5bQS16XSoiLG5ldyBCZWFuRXhjbHVkZUluZm8oIltBLXpdKiIsbnVsbCkpOwotCi0gICAgICAgIEJlYW5FeGNsdWRlSW5mbyBiZWFuRXhjbHVkZUluZm8gPSBleGNsdWRlSW5mby5nZXRCZWFuRXhjbHVkZUluZm9Gb3JDbGFzcygib3JnLmtwLmFudWhhay5jZHIudGVzdC5UZXN0Q2xhc3MiKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoYmVhbkV4Y2x1ZGVJbmZvLmlzRXhjbHVkZWRQcm9wZXJ0eSgiVGVzdFByb3BlcnR5IikpOwotICAgICAgICBhc3NlcnRUcnVlKGJlYW5FeGNsdWRlSW5mby5pc0V4Y2x1ZGVkUHJvcGVydHkoIlRlc3RCb29sIikpOwotICAgICAgICBhc3NlcnRGYWxzZShiZWFuRXhjbHVkZUluZm8uaXNFeGNsdWRlZFByb3BlcnR5KCJpc1Rlc3RCb29sIikpOwotCi0gICAgICAgIGJlYW5FeGNsdWRlSW5mbyA9IGV4Y2x1ZGVJbmZvLmdldEJlYW5FeGNsdWRlSW5mb0ZvckNsYXNzKCJvcmcua3AuYW51aGFrLmNkci50eXBlcy5UZXN0Q2xhc3MiKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoYmVhbkV4Y2x1ZGVJbmZvLmlzRXhjbHVkZWRQcm9wZXJ0eSgiVGVzdFByb3BlcnR5IikpOwotICAgICAgICBhc3NlcnRUcnVlKGJlYW5FeGNsdWRlSW5mby5pc0V4Y2x1ZGVkUHJvcGVydHkoIlRlc3RTdHJpbmciKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKGJlYW5FeGNsdWRlSW5mby5pc0V4Y2x1ZGVkUHJvcGVydHkoImlzVGVzdEJvb2wiKSk7Ci0KLSAgICAgICAgYmVhbkV4Y2x1ZGVJbmZvID0gZXhjbHVkZUluZm8uZ2V0QmVhbkV4Y2x1ZGVJbmZvRm9yQ2xhc3MoIm9yZy5rcC5hbnVoYWsubWV0YS5UZXN0Q2xhc3MiKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShiZWFuRXhjbHVkZUluZm8uaXNFeGNsdWRlZFByb3BlcnR5KCJUZXN0UHJvcGVydHkiKSk7Ci0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL0F4aXNTZXJ2aWNlVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9BeGlzU2VydmljZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNjN2JkYy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL0F4aXNTZXJ2aWNlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5TZXJ2aWNlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuU2VydmljZUdyb3VwQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzQ29uZmlndXJhdGlvbjsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW07Ci0KLXB1YmxpYyBjbGFzcyBBeGlzU2VydmljZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fTkFNRSA9ICJDdXN0b21QYXJhbWV0ZXIiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IFBBUkFNX1ZBTFVFID0gbmV3IE9iamVjdCgpOwotCi0gICAgY2xhc3MgTXlPYnNlcnZlciBpbXBsZW1lbnRzIFBhcmFtZXRlck9ic2VydmVyIHsKLSAgICAgICAgcHVibGljIGJvb2xlYW4gZ290SXQgPSBmYWxzZTsKLQotICAgICAgICBwdWJsaWMgdm9pZCBwYXJhbWV0ZXJDaGFuZ2VkKFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgICAgIGlmIChQQVJBTV9OQU1FLmVxdWFscyhuYW1lKSkgewotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygiV3JvbmcgdmFsdWUiLCBQQVJBTV9WQUxVRSwgdmFsdWUpOwotICAgICAgICAgICAgICAgIGdvdEl0ID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRNZXNzYWdlRWxlbWVudFFOYW1lVG9PcGVyYXRpb25NYXBwaW5nQmFzaWMoKSB7Ci0gICAgICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgQXhpc1NlcnZpY2UoKTsKLSAgICAgICAgCi0gICAgICAgIEF4aXNPcGVyYXRpb24gb3AxID0gbmV3IEluT25seUF4aXNPcGVyYXRpb24oKTsKLSAgICAgICAgUU5hbWUgb3BOYW1lID0gbmV3IFFOYW1lKCJmb28iKTsKLSAgICAgICAgCi0gICAgICAgIC8vIHRlc3QgcmVnaXN0ZXJpbmcgdGhlIHNhbWUgb3BlcmF0aW9uIG11bHRpcGxlIHRpbWVzCi0gICAgICAgIAotICAgICAgICBhc3NlcnRFcXVhbHMobnVsbCwgc2VydmljZS5nZXRPcGVyYXRpb25CeU1lc3NhZ2VFbGVtZW50UU5hbWUob3BOYW1lKSk7Ci0gICAgICAgIAotICAgICAgICBzZXJ2aWNlLmFkZE1lc3NhZ2VFbGVtZW50UU5hbWVUb09wZXJhdGlvbk1hcHBpbmcob3BOYW1lLCBvcDEpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG9wMSwgc2VydmljZS5nZXRPcGVyYXRpb25CeU1lc3NhZ2VFbGVtZW50UU5hbWUob3BOYW1lKSk7Ci0gICAgICAgIAotICAgICAgICBzZXJ2aWNlLmFkZE1lc3NhZ2VFbGVtZW50UU5hbWVUb09wZXJhdGlvbk1hcHBpbmcob3BOYW1lLCBvcDEpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG9wMSwgc2VydmljZS5nZXRPcGVyYXRpb25CeU1lc3NhZ2VFbGVtZW50UU5hbWUob3BOYW1lKSk7Ci0gICAgICAgIAotICAgICAgICBzZXJ2aWNlLmFkZE1lc3NhZ2VFbGVtZW50UU5hbWVUb09wZXJhdGlvbk1hcHBpbmcob3BOYW1lLCBvcDEpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG9wMSwgc2VydmljZS5nZXRPcGVyYXRpb25CeU1lc3NhZ2VFbGVtZW50UU5hbWUob3BOYW1lKSk7ICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdEFkZE1lc3NhZ2VFbGVtZW50UU5hbWVUb09wZXJhdGlvbk1hcHBpbmdPdmVybG9hZGluZygpIHsKLSAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSA9IG5ldyBBeGlzU2VydmljZSgpOwotICAgICAgICAKLSAgICAgICAgQXhpc09wZXJhdGlvbiBvcDEgPSBuZXcgSW5Pbmx5QXhpc09wZXJhdGlvbigpOwotICAgICAgICBBeGlzT3BlcmF0aW9uIG9wMiA9IG5ldyBJbk9ubHlBeGlzT3BlcmF0aW9uKCk7Ci0gICAgICAgIEF4aXNPcGVyYXRpb24gb3AzID0gbmV3IEluT25seUF4aXNPcGVyYXRpb24oKTsKLSAgICAgICAgUU5hbWUgb3BOYW1lID0gbmV3IFFOYW1lKCJmb28iKTsKLSAgICAgICAgCi0gICAgICAgIC8vIHRlc3QgcmVnaXN0ZXJpbmcgZGlmZmVyZW50IG9wZXJhdGlvbnMgdW5kZXIgdGhlIHNhbWUgb3BOYW1lCi0gICAgICAgIAotICAgICAgICBhc3NlcnRFcXVhbHMobnVsbCwgc2VydmljZS5nZXRPcGVyYXRpb25CeU1lc3NhZ2VFbGVtZW50UU5hbWUob3BOYW1lKSk7Ci0gICAgICAgIAotICAgICAgICBzZXJ2aWNlLmFkZE1lc3NhZ2VFbGVtZW50UU5hbWVUb09wZXJhdGlvbk1hcHBpbmcob3BOYW1lLCBvcDEpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG9wMSwgc2VydmljZS5nZXRPcGVyYXRpb25CeU1lc3NhZ2VFbGVtZW50UU5hbWUob3BOYW1lKSk7Ci0gICAgICAgIAotICAgICAgICBzZXJ2aWNlLmFkZE1lc3NhZ2VFbGVtZW50UU5hbWVUb09wZXJhdGlvbk1hcHBpbmcob3BOYW1lLCBvcDIpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG51bGwsIHNlcnZpY2UuZ2V0T3BlcmF0aW9uQnlNZXNzYWdlRWxlbWVudFFOYW1lKG9wTmFtZSkpOwotICAgICAgICAKLSAgICAgICAgc2VydmljZS5hZGRNZXNzYWdlRWxlbWVudFFOYW1lVG9PcGVyYXRpb25NYXBwaW5nKG9wTmFtZSwgb3AzKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydEVxdWFscyhudWxsLCBzZXJ2aWNlLmdldE9wZXJhdGlvbkJ5TWVzc2FnZUVsZW1lbnRRTmFtZShvcE5hbWUpKTsgICAgICAgCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBhcmFtZXRlck9ic2VydmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgQXhpc1NlcnZpY2UoKTsKLQotICAgICAgICBNeU9ic2VydmVyIG9ic2VydmVyID0gbmV3IE15T2JzZXJ2ZXIoKTsKLSAgICAgICAgc2VydmljZS5hZGRQYXJhbWV0ZXJPYnNlcnZlcihvYnNlcnZlcik7Ci0gICAgICAgIHNlcnZpY2UuYWRkUGFyYW1ldGVyKFBBUkFNX05BTUUsIFBBUkFNX1ZBTFVFKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiRGlkbid0IGdldCBub3RpZmljYXRpb24iLCBvYnNlcnZlci5nb3RJdCk7Ci0gICAgfQotICAgICAKLSAgICAvKioKLSAgICAgKiBTaW1wbGUgdGVzdCB0byBlbnN1cmUgdGhhdCBQYXJhbWV0ZXJzIG1hcmtlZCBhcyBUcmFuc2llbnQKLSAgICAgKiBhcmUgbm90IHBlcnNpc3RlZC4KLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RUcmFuc2llbnRQYXJhbWV0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICAKLSAgICAgICAgUGFyYW1ldGVyIHAxID0gbmV3IFBhcmFtZXRlcigiTk9STUFMIiwgIkhlbGxvIFdvcmxkIik7Ci0gICAgICAgIFBhcmFtZXRlciBwMiA9IG5ldyBQYXJhbWV0ZXIoIlRSQU5TSUVOVCIsICJIZWxsbyBXb3JsZCIpOwotICAgICAgICBwMi5zZXRUcmFuc2llbnQodHJ1ZSk7Ci0gICAgICAgIAotICAgICAgICAvLyBUaGUgaGVhZGVyIGluIGFuIG9iamVjdCBvdXRwdXQgaXMgNCBieXRlcwotICAgICAgICBmaW5hbCBpbnQgSEVBREVSX0xFTkdUSCA9IDQ7Ci0gICAgICAgIAotICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCBub24tdHJhbnNpZW50IHZhbHVlIGlzIHdyaXR0ZW4KLSAgICAgICAgT2JqZWN0T3V0cHV0U3RyZWFtIG9vcyA9IG5ldyBPYmplY3RPdXRwdXRTdHJlYW0oYmFvcyk7Ci0gICAgICAgIHAxLndyaXRlRXh0ZXJuYWwob29zKTsKLSAgICAgICAgb29zLmZsdXNoKCk7Ci0gICAgICAgIG9vcy5jbG9zZSgpOwotICAgICAgICBpbnQgbGVuZ3RoMSA9IGJhb3MudG9CeXRlQXJyYXkoKS5sZW5ndGg7Ci0gICAgICAgIGFzc2VydFRydWUoIGxlbmd0aDEgPiBIRUFERVJfTEVOR1RIKTsKLSAgICAgICAgCi0gICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgdHJhbnNpZW50IHZhbHVlIGlzIG5vdCB3cml0dGVuCi0gICAgICAgIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgIG9vcyA9IG5ldyBPYmplY3RPdXRwdXRTdHJlYW0oYmFvcyk7Ci0gICAgICAgIHAyLndyaXRlRXh0ZXJuYWwob29zKTsKLSAgICAgICAgb29zLmZsdXNoKCk7Ci0gICAgICAgIG9vcy5jbG9zZSgpOwotICAgICAgICBpbnQgbGVuZ3RoMiA9IGJhb3MudG9CeXRlQXJyYXkoKS5sZW5ndGg7Ci0gICAgICAgIGFzc2VydFRydWUoIGxlbmd0aDIgPD0gSEVBREVSX0xFTkdUSCk7Ci0gICAgICAgIAotICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2ltcGxlIHRlc3QgdG8gbWFrZSB2ZXJpZnkgdGhhdCB0aGUgTWVzc2FnZUNvbnRleHQgbGlzdGVuZXIKLSAgICAgKiBpcyBpbnZva2VkIHdoZW4gYSBTZXJ2aWNlQ29udGV4dCBpcyBhdHRhY2hlZCB0byB0aGUgTWVzc2FnZUNvbnRleHQKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RNZXNzYWdlQ29udGV4dExpc3RlbmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIAotICAgICAgICBBeGlzQ29uZmlndXJhdGlvbiBhYyA9IG5ldyBBeGlzQ29uZmlndXJhdGlvbigpOwotICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBjYyA9IG5ldyBDb25maWd1cmF0aW9uQ29udGV4dChhYyk7Ci0gICAgICAgIAotICAgICAgICAvLyBDcmVhdGUgYSBkdW1teSBBeGlzU2VydmljZQotICAgICAgICBBeGlzU2VydmljZSBzZXJ2aWNlID0gbmV3IEF4aXNTZXJ2aWNlKCk7Ci0gICAgICAgIHNlcnZpY2Uuc2V0TmFtZSgiZHVtbXkiKTsKLSAgICAgICAgCi0gICAgICAgIEF4aXNTZXJ2aWNlR3JvdXAgYXNnID0gbmV3IEF4aXNTZXJ2aWNlR3JvdXAoKTsKLSAgICAgICAgYXNnLmFkZFNlcnZpY2Uoc2VydmljZSk7Ci0gICAgICAgIAotICAgICAgICAvLyBBdHRhY2ggYSBTZXJ2aWNlQ29udGV4dExpc3RlbmVyCi0gICAgICAgIC8vIFRoZSBTZXJ2aWNlQ29udGV4dExpc3RlbmVyIHdpbGwgY29weSBzYW1wbGUgaW5mb3JtYXRpb24gZnJvbSAKLSAgICAgICAgLy8gdGhlIFNlcnZpY2VDb250ZXh0IG9udG8gdGhlIE1lc3NhZ2VDb250ZXh0Ci0gICAgICAgIHNlcnZpY2UuYWRkTWVzc2FnZUNvbnRleHRMaXN0ZW5lcihuZXcgTXlNZXNzYWdlQ29udGV4dExpc3RlbmVyKCkpOwotICAgICAgICAKLSAgICAgICAgLy8gQ3JlYXRlIGEgRHVtbXkgU2VydmljZUNvbnRleHQKLSAgICAgICAgU2VydmljZUdyb3VwQ29udGV4dCBzZ2MgPSBuZXcgU2VydmljZUdyb3VwQ29udGV4dChjYywgYXNnKTsKLSAgICAgICAgU2VydmljZUNvbnRleHQgc2MgPSBzZ2MuZ2V0U2VydmljZUNvbnRleHQoc2VydmljZSk7Ci0gICAgICAgIHNjLnNldFByb3BlcnR5KCJTRVJWSUNFX1BST1BFUlRZIiwgIlNVQ0NFU1NGVUwiKTsKLSAgICAgICAgCi0gICAgICAgIC8vIENyZWF0ZSBhIE1lc3NhZ2VDb250ZXh0Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1jID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIAotICAgICAgICAvLyBBdHRhY2ggdGhlIFNlcnZpY2VDb250ZXh0IGFuZCBNZXNzYWdlQ29udGV4dC4KLSAgICAgICAgLy8gVGhpcyB3aWxsIHRyaWdnZXIgdGhlIE15U2VydmljZUNvbnRleHRMaXN0ZW5lci5hdHRhY2hFdmVudAotICAgICAgICBtYy5zZXRTZXJ2aWNlQ29udGV4dChzYyk7Ci0gICAgICAgIAotICAgICAgICAvLyBWZXJpZnkgc3VjY2VzcwotICAgICAgICBhc3NlcnRUcnVlKCJTVUNDRVNTRlVMIi5lcXVhbHMobWMuZ2V0UHJvcGVydHkoIk1FU1NBR0VfUFJPUEVSVFkiKSkpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBTYW1lcGxlIE1lc3NhZ2VDb250ZXh0TGlzdGVuZXIgd2hpY2ggc2V0cyBhIHByb3BlcnR5IAotICAgICAqIG9uIHRoZSBNZXNzYWdlQ29udGV4dCB3aGVuIHRoZSBTZXJpdmNlQ29udGV4dCBpcyBhdHRhY2hlZC4KLSAgICAgKi8KLSAgICBjbGFzcyBNeU1lc3NhZ2VDb250ZXh0TGlzdGVuZXIgaW1wbGVtZW50cyBNZXNzYWdlQ29udGV4dExpc3RlbmVyIHsKLQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGF0dGFjaEVudmVsb3BlRXZlbnQoTWVzc2FnZUNvbnRleHQgbWMpIHsKLSAgICAgICAgICAgIAotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgYXR0YWNoU2VydmljZUNvbnRleHRFdmVudChTZXJ2aWNlQ29udGV4dCBzYywgTWVzc2FnZUNvbnRleHQgbWMpIHsKLSAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IChTdHJpbmcpIHNjLmdldFByb3BlcnR5KCJTRVJWSUNFX1BST1BFUlRZIik7Ci0gICAgICAgICAgICBtYy5zZXRQcm9wZXJ0eSgiTUVTU0FHRV9QUk9QRVJUWSIsIHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL01vY2tGbG93LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL01vY2tGbG93LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkMDJlYTMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9Nb2NrRmxvdy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5waGFzZXJlc29sdmVyLlBoYXNlTWV0YWRhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLlV0aWxzOwotCi0KLXB1YmxpYyBjbGFzcyBNb2NrRmxvdyBleHRlbmRzIEZsb3cgewotICAgIHB1YmxpYyBNb2NrRmxvdyhTdHJpbmcgbWVzc2FnZSwgaW50IGxlbmd0aCkgewotICAgICAgICBzdXBlcigpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBTcGVha2luZ0hhbmRsZXIxIGgxID0gbmV3IFNwZWFraW5nSGFuZGxlcjEoCi0gICAgICAgICAgICAgICAgICAgICJFeGVjdXRpbmcgIiArIGkgKyAiIGluc2lkZSAiICsgbWVzc2FnZSk7Ci0gICAgICAgICAgICBVdGlscy5hZGRIYW5kbGVyKHRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQaGFzZU1ldGFkYXRhLlBIQVNFX1BPTElDWV9ERVRFUk1JTkFUSU9OKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9QYXJhbWV0ZXJFZGl0VGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9QYXJhbWV0ZXJFZGl0VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjNjZjYyLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vUGFyYW1ldGVyRWRpdFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzQ29uZmlndXJhdGlvbjsKLQotcHVibGljIGNsYXNzIFBhcmFtZXRlckVkaXRUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHVibGljIHZvaWQgdGVzdFBhcmFtZXRlckVkaXQoKSB0aHJvd3MgRXhjZXB0aW9uewotICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDdHggPSBDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkuY3JlYXRlRW1wdHlDb25maWd1cmF0aW9uQ29udGV4dCgpOwotICAgICAgICBBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlnID0gY29uZmlnQ3R4LmdldEF4aXNDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgIFBhcmFtZXRlciBwYXJhbWV0ZXIgPSBuZXcgUGFyYW1ldGVyKCk7Ci0gICAgICAgIHBhcmFtZXRlci5zZXRWYWx1ZSgidHJ1ZSIpOwotICAgICAgICBwYXJhbWV0ZXIuc2V0TmFtZSgiZW5hYmxlTVRPTSIpOwotICAgICAgICBheGlzQ29uZmlnLmFkZFBhcmFtZXRlcihwYXJhbWV0ZXIpOwotICAgICAgICBwYXJhbWV0ZXIuc2V0VmFsdWUoInRydWUiKTsKLSAgICAgICAgQXhpc1NlcnZpY2VHcm91cCBzZXJ2aWNlR3JvdXAgPSBuZXcgQXhpc1NlcnZpY2VHcm91cCgpOwotICAgICAgICBzZXJ2aWNlR3JvdXAuc2V0U2VydmljZUdyb3VwTmFtZSgidGVzdFNlcnZpY2VHcm91cCIpOwotICAgICAgICBBeGlzU2VydmljZSBzZXJ2aWNlID0gbmV3IEF4aXNTZXJ2aWNlKCk7Ci0gICAgICAgIHNlcnZpY2Uuc2V0TmFtZSgic2VydmljZSIpOwotICAgICAgICBzZXJ2aWNlR3JvdXAuYWRkU2VydmljZShzZXJ2aWNlKTsKLSAgICAgICAgYXhpc0NvbmZpZy5hZGRTZXJ2aWNlR3JvdXAoc2VydmljZUdyb3VwKTsKLSAgICAgICAgcGFyYW1ldGVyID0gc2VydmljZUdyb3VwLmdldFBhcmFtZXRlcigiZW5hYmxlTVRPTSIpOwotICAgICAgICBwYXJhbWV0ZXIuc2V0VmFsdWUoInRydWUiKTsKLSAgICAgICAgUGFyYW1ldGVyIHBhcmEyPSBzZXJ2aWNlR3JvdXAuZ2V0UGFyYW1ldGVyKCJlbmFibGVNVE9NIik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhwYXJhMi5nZXRWYWx1ZSgpLCJ0cnVlIik7Ci0gICAgICAgIFBhcmFtZXRlciB0ZXN0ID0gbmV3IFBhcmFtZXRlcigpOwotICAgICAgICB0ZXN0LnNldE5hbWUoInRlc3QiKTsKLSAgICAgICAgdGVzdC5zZXRWYWx1ZSgidGVzdCIpOwotICAgICAgICBzZXJ2aWNlR3JvdXAuYWRkUGFyYW1ldGVyKHRlc3QpOwotICAgICAgICBQYXJhbWV0ZXIgcGFyYSA9IHNlcnZpY2VHcm91cC5nZXRQYXJhbWV0ZXIoInRlc3QiKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChwYXJhKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHBhcmEuZ2V0VmFsdWUoKSwidGVzdCIpOwotICAgICAgICBwYXJhLnNldFZhbHVlKCJuZXdWYWx1ZSIpOwotICAgICAgICBwYXJhID0gc2VydmljZUdyb3VwLmdldFBhcmFtZXRlcigidGVzdCIpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHBhcmEpOwotICAgICAgICBhc3NlcnRFcXVhbHMocGFyYS5nZXRWYWx1ZSgpLCJuZXdWYWx1ZSIpOwotCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9SZWdpc3RyeVRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vUmVnaXN0cnlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyNzYxN2UuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9SZWdpc3RyeVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQWJzdHJhY3RUZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0NvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuSGFuZGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmhhbmRsZXJzLkFic3RyYWN0SGFuZGxlcjsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLXB1YmxpYyBjbGFzcyBSZWdpc3RyeVRlc3QgZXh0ZW5kcyBBYnN0cmFjdFRlc3RDYXNlIHsKLSAgICBwcml2YXRlIEF4aXNDb25maWd1cmF0aW9uIGF4aXNDb25maWd1cmF0aW9uID0gbmV3IEF4aXNDb25maWd1cmF0aW9uKCk7Ci0gICAgQXhpc1NlcnZpY2Ugc2VydmljZSA9IG5ldyBBeGlzU2VydmljZSgiU2VydmljZTEiKTsKLQotICAgIHB1YmxpYyBSZWdpc3RyeVRlc3QoU3RyaW5nIHRlc3ROYW1lKSB7Ci0gICAgICAgIHN1cGVyKHRlc3ROYW1lKTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RIYW5kbGVyTWV0YWRhdGEoKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgSGFuZGxlckRlc2NyaXB0aW9uIGhtZCA9IG5ldyBIYW5kbGVyRGVzY3JpcHRpb24oKTsKLSAgICAgICAgdGVzdFBhcmFtZXRlSW5DbHVkZShobWQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJ2aWNlKCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIGF4aXNDb25maWd1cmF0aW9uLmFkZFNlcnZpY2Uoc2VydmljZSk7Ci0gICAgICAgIHRlc3RQYXJhbWV0ZUluQ2x1ZGUoc2VydmljZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE1vZHVsZSgpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBBeGlzTW9kdWxlIG1vZHVsZSA9IG5ldyBBeGlzTW9kdWxlKCJtb2R1bGUxIik7Ci0gICAgICAgIG1vZHVsZS5zZXRQYXJlbnQoYXhpc0NvbmZpZ3VyYXRpb24pOwotICAgICAgICB0ZXN0UGFyYW1ldGVJbkNsdWRlKG1vZHVsZSk7Ci0gICAgICAgIHRlc3RGbG93SW5jbHVkZVRlc3QobW9kdWxlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0T3BlcmF0aW9uKCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIEF4aXNPcGVyYXRpb24gb3AgPSBuZXcgSW5PdXRBeGlzT3BlcmF0aW9uKG5ldyBRTmFtZSgib3AiKSk7Ci0gICAgICAgIG9wLnNldFBhcmVudChzZXJ2aWNlKTsKLSAgICAgICAgdGVzdFBhcmFtZXRlSW5DbHVkZShvcCk7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGFyYW1ldGVJbkNsdWRlKFBhcmFtZXRlckluY2x1ZGUgcGFybUluY2x1ZGUpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBTdHJpbmcga2V5ID0gInZhbHVlMSI7Ci0gICAgICAgIFBhcmFtZXRlciBwID0gbmV3IFBhcmFtZXRlcihrZXksICJ2YWx1ZTIiKTsKLSAgICAgICAgcGFybUluY2x1ZGUuYWRkUGFyYW1ldGVyKHApOwotICAgICAgICBhc3NlcnRFcXVhbHMocCwgcGFybUluY2x1ZGUuZ2V0UGFyYW1ldGVyKGtleSkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RGbG93SW5jbHVkZVRlc3QoQXhpc01vZHVsZSBmbG93SW5jbHVkZSkgewotICAgICAgICBGbG93IGZsb3cxID0gbmV3IEZsb3coKTsKLSAgICAgICAgRmxvdyBmbG93MiA9IG5ldyBGbG93KCk7Ci0gICAgICAgIEZsb3cgZmxvdzMgPSBuZXcgRmxvdygpOwotCi0gICAgICAgIGZsb3dJbmNsdWRlLnNldEluRmxvdyhmbG93MSk7Ci0gICAgICAgIGZsb3dJbmNsdWRlLnNldEZhdWx0SW5GbG93KGZsb3cyKTsKLSAgICAgICAgZmxvd0luY2x1ZGUuc2V0T3V0RmxvdyhmbG93Myk7Ci0gICAgICAgIGFzc2VydFNhbWUoZmxvdzEsIGZsb3dJbmNsdWRlLmdldEluRmxvdygpKTsKLSAgICAgICAgYXNzZXJ0U2FtZShmbG93MiwgZmxvd0luY2x1ZGUuZ2V0RmF1bHRJbkZsb3coKSk7Ci0gICAgICAgIGFzc2VydFNhbWUoZmxvdzMsIGZsb3dJbmNsdWRlLmdldE91dEZsb3coKSk7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SGFuZGxlcnMoKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgSGFuZGxlciBoYW5kbGVyID0gbmV3IEFic3RyYWN0SGFuZGxlcigpIHsKLQotICAgICAgICAgICAgcHVibGljIEludm9jYXRpb25SZXNwb25zZSBpbnZva2UoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgewotICAgICAgICAgICAgICAgIHJldHVybiBJbnZvY2F0aW9uUmVzcG9uc2UuQ09OVElOVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIGhhbmRsZXIuaW5pdChuZXcgSGFuZGxlckRlc2NyaXB0aW9uKCkpOwotICAgICAgICBhc3NlcnROdWxsKGhhbmRsZXIuZ2V0TmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0TnVsbChoYW5kbGVyLmdldFBhcmFtZXRlcigiaGVsbG8iKSk7Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vU3BlYWtpbmdIYW5kbGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL1NwZWFraW5nSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmFhMmVjLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vU3BlYWtpbmdIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuSGFuZGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmhhbmRsZXJzLkFic3RyYWN0SGFuZGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotcHVibGljIGNsYXNzIFNwZWFraW5nSGFuZGxlciBleHRlbmRzIEFic3RyYWN0SGFuZGxlciBpbXBsZW1lbnRzIEhhbmRsZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhTcGVha2luZ0hhbmRsZXIuY2xhc3MpOwotICAgIHByaXZhdGUgU3RyaW5nIG1lc3NhZ2U7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQotICAgIHB1YmxpYyBTcGVha2luZ0hhbmRsZXIoKSB7Ci0gICAgICAgIHRoaXMubWVzc2FnZSA9ICJIaSBJIGFtdGVzdGluZyAiOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIEludm9jYXRpb25SZXNwb25zZSBpbnZva2UoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgdGhyb3dzCi0gICAgICAgICAgICBBeGlzRmF1bHQgewotICAgICAgICBsb2cuaW5mbygiSSBhbSAiICsgbWVzc2FnZSArICIgSGFuZGxlciBSdW5uaW5nIDopIik7Ci0gICAgICAgIHJldHVybiBJbnZvY2F0aW9uUmVzcG9uc2UuQ09OVElOVUU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmV2b2tlKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHsKLSAgICAgICAgbG9nLmluZm8oIkkgYW0gIiArIG1lc3NhZ2UgKyAiIEhhbmRsZXIgUnVubmluZyA6KSIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vU3BlYWtpbmdIYW5kbGVyMS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9TcGVha2luZ0hhbmRsZXIxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxZjU4YTkuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9TcGVha2luZ0hhbmRsZXIxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuSGFuZGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmhhbmRsZXJzLkFic3RyYWN0SGFuZGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotcHVibGljIGNsYXNzIFNwZWFraW5nSGFuZGxlcjEgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIgaW1wbGVtZW50cyBIYW5kbGVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coU3BlYWtpbmdIYW5kbGVyMS5jbGFzcyk7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbWVzc2FnZTsKLSAgICBwcml2YXRlIFN0cmluZyBuYW1lOwotCi0gICAgcHVibGljIFNwZWFraW5nSGFuZGxlcjEoU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBJbnZvY2F0aW9uUmVzcG9uc2UgaW52b2tlKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBsb2cuaW5mbygiSSBhbSAiICsgbWVzc2FnZSArICIgSGFuZGxlciBSdW5uaW5nIDopIik7Ci0gICAgICAgIHJldHVybiBJbnZvY2F0aW9uUmVzcG9uc2UuQ09OVElOVUU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmV2b2tlKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHsKLSAgICAgICAgbG9nLmluZm8oIkkgYW0gIiArIG1lc3NhZ2UgKyAiIEhhbmRsZXIgUnVubmluZyA6KSIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vU3BlYWtpbmdQcm92aWRlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9TcGVha2luZ1Byb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5YWRhNWYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9TcGVha2luZ1Byb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuTWVzc2FnZVJlY2VpdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgU3BlYWtpbmdQcm92aWRlciBpbXBsZW1lbnRzIE1lc3NhZ2VSZWNlaXZlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFNwZWFraW5nUHJvdmlkZXIuY2xhc3MpOwotCi0gICAgcHVibGljIFNwZWFraW5nUHJvdmlkZXIoKSB7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCByZWNlaXZlKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBsb2cuaW5mbygiSSBhbSBTcGVha2luZyBQcm92aWRlciBSdW5uaW5nIDopIik7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL1ZlcnNpb25UZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL1ZlcnNpb25UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2ZjY5NjIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9WZXJzaW9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIFZlcnNpb25UZXN0IGV4dGVuZHMgVGVzdENhc2UgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIHRlc3RWZXJzaW9uU2VxdWVuY2UgPSB7Ci0gICAgICAgICIwLjEiLAotICAgICAgICAiMC4yIiwKLSAgICAgICAgIjEuMCIsCi0gICAgICAgICIxLjEtYmV0YTEiLAotICAgICAgICAiMS4xLWJldGEyIiwKLSAgICAgICAgIjEuMS1SQzEiLAotICAgICAgICAiMS4xLVJDMiIsCi0gICAgICAgICIxLjEtU05BUFNIT1QiLAotICAgICAgICAiMS4xIiwKLSAgICAgICAgIjEuMS4xIiwKLSAgICAgICAgIjEuMS4yIiwKLSAgICAgICAgIjEuMiIsCi0gICAgICAgICJTTkFQU0hPVCIKLSAgICB9OwotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGludCBzaWduKGludCB2KSB7Ci0gICAgICAgIGlmICh2IDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9IGVsc2UgaWYgKHYgPiAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RDb21wYXJlVG8oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZm9yIChpbnQgaTE9MDsgaTE8dGVzdFZlcnNpb25TZXF1ZW5jZS5sZW5ndGg7IGkxKyspIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkyPTA7IGkyPHRlc3RWZXJzaW9uU2VxdWVuY2UubGVuZ3RoOyBpMisrKSB7Ci0gICAgICAgICAgICAgICAgVmVyc2lvbiB2MSA9IG5ldyBWZXJzaW9uKHRlc3RWZXJzaW9uU2VxdWVuY2VbaTFdKTsKLSAgICAgICAgICAgICAgICBWZXJzaW9uIHYyID0gbmV3IFZlcnNpb24odGVzdFZlcnNpb25TZXF1ZW5jZVtpMl0pOwotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyh2MSArICIgdnMuICIgKyB2Miwgc2lnbihpMS1pMiksIHNpZ24odjEuY29tcGFyZVRvKHYyKSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RUb1N0cmluZygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBmb3IgKGludCBpPTA7IGk8dGVzdFZlcnNpb25TZXF1ZW5jZS5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHRlc3RWZXJzaW9uU2VxdWVuY2VbaV0sIG5ldyBWZXJzaW9uKHRlc3RWZXJzaW9uU2VxdWVuY2VbaV0pLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RFcXVhbHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZm9yIChpbnQgaTE9MDsgaTE8dGVzdFZlcnNpb25TZXF1ZW5jZS5sZW5ndGg7IGkxKyspIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkyPTA7IGkyPHRlc3RWZXJzaW9uU2VxdWVuY2UubGVuZ3RoOyBpMisrKSB7Ci0gICAgICAgICAgICAgICAgVmVyc2lvbiB2MSA9IG5ldyBWZXJzaW9uKHRlc3RWZXJzaW9uU2VxdWVuY2VbaTFdKTsKLSAgICAgICAgICAgICAgICBWZXJzaW9uIHYyID0gbmV3IFZlcnNpb24odGVzdFZlcnNpb25TZXF1ZW5jZVtpMl0pOwotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyh2MSArICIgdnMuICIgKyB2MiwgaTEgPT0gaTIsIHYxLmVxdWFscyh2MikpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RIYXNoQ29kZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTZXQ8SW50ZWdlcj4gdmFsdWVzID0gbmV3IEhhc2hTZXQ8SW50ZWdlcj4oKTsKLSAgICAgICAgZm9yIChpbnQgaT0wOyBpPHRlc3RWZXJzaW9uU2VxdWVuY2UubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIHZhbHVlcy5hZGQobmV3IFZlcnNpb24odGVzdFZlcnNpb25TZXF1ZW5jZVtpXSkuaGFzaENvZGUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gQ2hlY2sgdGhhdCB0aGUgY29sbGlzaW9uIGZyZXF1ZW5jeSBpcyBsZXNzIHRoYW4gMTAlCi0gICAgICAgIGFzc2VydFRydWUodmFsdWVzLnNpemUoKSA+IHRlc3RWZXJzaW9uU2VxdWVuY2UubGVuZ3RoKjkvMTApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vV1NETDExVG9BeGlzU2VydmljZUJ1aWxkZXJBdHRhY2htZW50VGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9XU0RMMTFUb0F4aXNTZXJ2aWNlQnVpbGRlckF0dGFjaG1lbnRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1ODVmODEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9XU0RMMTFUb0F4aXNTZXJ2aWNlQnVpbGRlckF0dGFjaG1lbnRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0RMMTFUb0F4aXNTZXJ2aWNlQnVpbGRlckF0dGFjaG1lbnRUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RBdHRhY2htZW50KCkgewotICAgICAgICBGaWxlIHRlc3RSZXNvdXJjZUZpbGUgPSBuZXcgRmlsZSgidGVzdC1yZXNvdXJjZXMvd3NkbC9Td2FUZXN0LndzZGwiKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJ0ZXN0UmVzb3VjZUZpbGU6ICIgKyB0ZXN0UmVzb3VyY2VGaWxlKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFdTREwxMVRvQWxsQXhpc1NlcnZpY2VzQnVpbGRlciBidWlsZGVyID0gbmV3IFdTREwxMVRvQWxsQXhpc1NlcnZpY2VzQnVpbGRlcigKLSAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGVJbnB1dFN0cmVhbSh0ZXN0UmVzb3VyY2VGaWxlKSk7Ci0gICAgICAgICAgICBBeGlzU2VydmljZSBheGlzU2VydmljZSA9IGJ1aWxkZXIucG9wdWxhdGVTZXJ2aWNlKCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIldTREwgZmlsZTogIiArIHRlc3RSZXNvdXJjZUZpbGUuZ2V0TmFtZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3IgaW4gV1NETCA6ICIgKyB0ZXN0UmVzb3VyY2VGaWxlLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkV4Y2VwdGlvbjogIiArIGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgZmFpbCgiQ2F1Z2h0IGV4Y2VwdGlvbiAiICsgZS50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm47Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL1dTRExUb0FsbFNlcnZpY2VzQnVpbGRlclRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vV1NETFRvQWxsU2VydmljZXNCdWlsZGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDhiYWNjLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vV1NETFRvQWxsU2VydmljZXNCdWlsZGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5MaXN0ZW5lck1hbmFnZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0KLS8qKgotICogVGVzdHMgdGhlIFdTREwxMVRvQWxsU2VydmljZXNCdWlsZGVyIGNsYXNzLgotICovCi1wdWJsaWMgY2xhc3MgV1NETFRvQWxsU2VydmljZXNCdWlsZGVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBleHBlY3RlZFNlcnZpY2UxMSA9IHsKLSAgICAgICAgICAgICJFY2hvU2VydmljZVBvcnRPbmUiLAotICAgICAgICAgICAgIkVjaG9TZXJ2aWNlUG9ydFR3byIsCi0gICAgICAgICAgICAiRWNob1NlcnZpY2VQb3J0VGhyZWUifTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBleHBlY3RlZFNlcnZpY2UyMCA9IHsKLSAgICAgICAgICAgICJlY2hvU2VydmljZTEkZWNob1NlcnZpY2VTT0FQQmluZGluZ19odHRwIiwKLSAgICAgICAgICAgICJlY2hvU2VydmljZTEkZWNob1NlcnZpY2VFbmRwb2ludDJTT0FQQmluZGluZ19odHRwIiwKLSAgICAgICAgICAgICJlY2hvU2VydmljZTIkZWNob1NlcnZpY2VTT0FQQmluZGluZ19odHRwIn07Ci0gICAgcHJpdmF0ZSBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0OwotICAgIExpc3RlbmVyTWFuYWdlciBsbTsKLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGNvbmZpZ0NvbnRleHQgPQotICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeS5jcmVhdGVFbXB0eUNvbmZpZ3VyYXRpb25Db250ZXh0KCk7Ci0gICAgICAgIGxtID0gbmV3IExpc3RlbmVyTWFuYWdlcigpOwotICAgICAgICBsbS5pbml0KGNvbmZpZ0NvbnRleHQpOwotICAgICAgICBsbS5zdGFydCgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIGNvbmZpZ0NvbnRleHQudGVybWluYXRlKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrUmVzdWx0cyhMaXN0IGF4aXNTZXJ2aWNlcywgU3RyaW5nIGV4cGVjdGVkU2VydmljZVtdKSB7Ci0KLSAgICAgICAgSXRlcmF0b3IgYXNpID0gYXhpc1NlcnZpY2VzLml0ZXJhdG9yKCk7Ci0gICAgICAgIGludCBpID0gMDsKLSAgICAgICAgd2hpbGUgKGFzaS5oYXNOZXh0KCkgJiYgaSA8IGV4cGVjdGVkU2VydmljZS5sZW5ndGgpIHsKLSAgICAgICAgICAgIEF4aXNTZXJ2aWNlIGFzID0gKEF4aXNTZXJ2aWNlKSBhc2kubmV4dCgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJBeGlzU2VydmljZSA6ICIgKyBhcy5nZXROYW1lKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIHNlcnZpY2UgbmFtZSBpbiBBeGlzU2VydmljZSBMaXN0OiBleHBlY3RlZCAiCi0gICAgICAgICAgICAgICAgICAgICsgZXhwZWN0ZWRTZXJ2aWNlW2ldICsgIiBidXQgZm91bmQgIiArIGFzLmdldE5hbWUoKSArICIuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBhcy5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRTZXJ2aWNlW2ldKTsKLSAgICAgICAgICAgIGkrKzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RXU0RMMTF0b0FsbEF4aXNTZXJ2aWNlcygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBGaWxlIHRlc3RSZXNvdXJjZUZpbGUgPSBuZXcgRmlsZSgidGFyZ2V0L3Rlc3QtY2xhc3Nlcy93c2RsL0VjaG9TZXJ2aWNlV3NkbDExLndzZGwiKTsKLSAgICAgICAgRmlsZSBvdXRMb2NhdGlvbiA9IG5ldyBGaWxlKCJ0YXJnZXQvdGVzdC1yZXNvdXJjZXMiKTsKLSAgICAgICAgb3V0TG9jYXRpb24ubWtkaXJzKCk7Ci0gICAgICAgIGlmICh0ZXN0UmVzb3VyY2VGaWxlLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICBMaXN0IGF4aXNTZXJ2aWNlcyA9IG51bGw7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIFdTREwxMVRvQWxsQXhpc1NlcnZpY2VzQnVpbGRlciBidWlsZGVyID0gbmV3IFdTREwxMVRvQWxsQXhpc1NlcnZpY2VzQnVpbGRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlSW5wdXRTdHJlYW0odGVzdFJlc291cmNlRmlsZSkpOwotICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlcyA9IGJ1aWxkZXIucG9wdWxhdGVBbGxTZXJ2aWNlcygpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiV1NETCBmaWxlOiAiICsgdGVzdFJlc291cmNlRmlsZS5nZXROYW1lKCkpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIGluIFdTREwgOiAiICsgdGVzdFJlc291cmNlRmlsZS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXhjZXB0aW9uOiAiICsgZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2hlY2tSZXN1bHRzKGF4aXNTZXJ2aWNlcywgZXhwZWN0ZWRTZXJ2aWNlMTEpOwotCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0V1NETDIwdG9BbGxBeGlzU2VydmljZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgRmlsZSB0ZXN0UmVzb3VyY2VGaWxlID0gbmV3IEZpbGUoInRhcmdldC90ZXN0LWNsYXNzZXMvd3NkbC9FY2hvU2VydmljZVdzZGwyMC53c2RsIik7Ci0gICAgICAgIEZpbGUgb3V0TG9jYXRpb24gPSBuZXcgRmlsZSgidGFyZ2V0L3Rlc3QtcmVzb3VyY2VzIik7Ci0gICAgICAgIG91dExvY2F0aW9uLm1rZGlycygpOwotICAgICAgICBpZiAodGVzdFJlc291cmNlRmlsZS5leGlzdHMoKSkgewotICAgICAgICAgICAgTGlzdCBheGlzU2VydmljZXMgPSBudWxsOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBXU0RMMjBUb0FsbEF4aXNTZXJ2aWNlc0J1aWxkZXIgYnVpbGRlciA9IG5ldyBXU0RMMjBUb0FsbEF4aXNTZXJ2aWNlc0J1aWxkZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZUlucHV0U3RyZWFtKHRlc3RSZXNvdXJjZUZpbGUpKTsKLSAgICAgICAgICAgICAgICBheGlzU2VydmljZXMgPSBidWlsZGVyLnBvcHVsYXRlQWxsU2VydmljZXMoKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIldTREwgZmlsZTogIiArIHRlc3RSZXNvdXJjZUZpbGUuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciBpbiBXU0RMIDogIiArIHRlc3RSZXNvdXJjZUZpbGUuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkV4Y2VwdGlvbjogIiArIGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNoZWNrUmVzdWx0cyhheGlzU2VydmljZXMsIGV4cGVjdGVkU2VydmljZTIwKTsKLQotICAgICAgICB9Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vV1NETFdyYXBwZXJUZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL1dTRExXcmFwcGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmExMDIwLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vV1NETFdyYXBwZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbjsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkFic3RyYWN0VGVzdENhc2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dEZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwudXRpbC5XU0RMRGVmaW5pdGlvbldyYXBwZXI7DQotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50Ow0KLWltcG9ydCBvcmcueG1sLnNheC5FcnJvckhhbmRsZXI7DQotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOw0KLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247DQotaW1wb3J0IG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uOw0KLQ0KLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247DQotaW1wb3J0IGphdmF4LndzZGwuVHlwZXM7DQotaW1wb3J0IGphdmF4LndzZGwuV1NETEV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXgud3NkbC5mYWN0b3J5LldTRExGYWN0b3J5Ow0KLWltcG9ydCBqYXZheC53c2RsLnhtbC5XU0RMTG9jYXRvcjsNCi1pbXBvcnQgamF2YXgud3NkbC54bWwuV1NETFJlYWRlcjsNCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOw0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5Ow0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLmlvLkZpbGU7DQotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOw0KLQ0KLQ0KLXB1YmxpYyBjbGFzcyBXU0RMV3JhcHBlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7DQotDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBWF9XU0RMX1ZFUkJPU0VfTU9ERV9LRVkgPSAiamF2YXgud3NkbC52ZXJib3NlIjsNCi0NCi0gICAgLy9wcml2YXRlIERlZmluaXRpb24gd3NkbERlZiA9IG51bGw7DQotICAgIHByaXZhdGUgV1NETExvY2F0b3IgY3VzdG9tV1NMRDRKUmVzb2x2ZXIgPSBudWxsOw0KLSAgICBwcml2YXRlIFN0cmluZyBiYXNlVXJpID0gbnVsbDsNCi0NCi0gICAgcHJpdmF0ZSBBeGlzQ29uZmlndXJhdGlvbiBheGlzQ2ZnID0gbnVsbDsNCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgYXhpczJ4bWwgPSBBYnN0cmFjdFRlc3RDYXNlLmJhc2VkaXIgKw0KLSAgICAgICAgICAgICAgICAgICAgICAiL3RhcmdldC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L2F4aXMyX2EueG1sIjsNCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgd3NkbDEgPSBBYnN0cmFjdFRlc3RDYXNlLmJhc2VkaXIgKyANCi0gICAgICAgICAgICAgICAgICAgICAgIi90YXJnZXQvdGVzdC1yZXNvdXJjZXMvd3NkbC9hY3Rpb25UZXN0cy53c2RsIjsgDQotDQotICAgIHByaXZhdGUgU3RyaW5nIHdzZGwyID0gQWJzdHJhY3RUZXN0Q2FzZS5iYXNlZGlyICsgDQotICAgICAgICAgICAgICAgICAgICAgICIvdGFyZ2V0L3Rlc3QtcmVzb3VyY2VzL3dzZGwvdGVzdDEud3NkbCI7IA0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyB3c2RsMyA9IEFic3RyYWN0VGVzdENhc2UuYmFzZWRpciArIA0KLSAgICAgICAgICAgICAgICAgICAgICAiL3RhcmdldC90ZXN0LXJlc291cmNlcy93c2RsL3Rlc3QyLndzZGwiOyANCi0NCi0NCi0NCi0gICAgcHVibGljIFdTRExXcmFwcGVyVGVzdChTdHJpbmcgbmFtZSkgew0KLQkJc3VwZXIobmFtZSk7DQotICAgIH0NCi0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFdzZGxXcmFwcGVyKCkgew0KLSAgICAgICAgdHJ5IHsNCi0NCi0gICAgICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0gICAgICAgICAgICAvLyBsb2FkIHRoZSB3c2RsDQotICAgICAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotDQotICAgICAgICAgICAgRGVmaW5pdGlvbiBkZWYxID0gbnVsbDsNCi0NCi0gICAgICAgICAgICBGaWxlIHRlc3RSZXNvdXJjZUZpbGUxID0gbmV3IEZpbGUod3NkbDEpOw0KLQ0KLSAgICAgICAgICAgIGlmICh0ZXN0UmVzb3VyY2VGaWxlMS5leGlzdHMoKSkgew0KLSAgICAgICAgICAgICAgICB0cnkgew0KLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJXU0RMIGZpbGUgMTogIiArIHRlc3RSZXNvdXJjZUZpbGUxLmdldE5hbWUoKSk7DQotICAgICAgICAgICAgICAgICAgICBkZWYxID0gcmVhZEluVGhlV1NETEZpbGUobmV3IEZpbGVJbnB1dFN0cmVhbSh0ZXN0UmVzb3VyY2VGaWxlMSkpOyANCi0gICAgICAgICAgICAgICAgfSANCi0gICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlMSkgew0KLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciBpbiBXU0RMIDogIiArIHRlc3RSZXNvdXJjZUZpbGUxLmdldE5hbWUoKSk7DQotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkV4Y2VwdGlvbjogIiArIGUxLnRvU3RyaW5nKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgZTE7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgLy93c2RsRGVmID0gZGVmMTsNCi0gICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJ3c2RsRGVmIDEgPSBbIik7DQotICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4od3NkbERlZik7DQotICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIl0iKTsNCi0gICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLQ0KLQ0KLSAgICAgICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSAgICAgICAgICAgIC8vIHNldHVwIHRoZSB3cmFwcGVyDQotICAgICAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotDQotICAgICAgICAgICAgYXhpc0NmZyA9IENvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeQ0KLSAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlQ29uZmlndXJhdGlvbkNvbnRleHRGcm9tRmlsZVN5c3RlbShudWxsLCBheGlzMnhtbCkNCi0gICAgICAgICAgICAgICAgICAgICAgLmdldEF4aXNDb25maWd1cmF0aW9uKCk7DQotDQotICAgICAgICAgICAgV1NETERlZmluaXRpb25XcmFwcGVyIHBhc3N0aHJ1ID0gbmV3IFdTRExEZWZpbml0aW9uV3JhcHBlcihkZWYxLCB0ZXN0UmVzb3VyY2VGaWxlMS50b1VSTCgpLCBmYWxzZSk7DQotDQotICAgICAgICAgICAgRGVmaW5pdGlvbiBkZWZfcGFzc3RocnUgPSBwYXNzdGhydS5nZXRVbndyYXBwZWREZWZpbml0aW9uKCk7DQotICAgICAgICAgICAgU3RyaW5nIGRlZl9wYXNzdGhydV9zdHIgPSBkZWZfcGFzc3RocnUudG9TdHJpbmcoKTsNCi0gICAgICAgICAgICBRTmFtZSBkZWZfcGFzc3RocnVfcW4gPSBkZWZfcGFzc3RocnUuZ2V0UU5hbWUoKTsNCi0gICAgICAgICAgICBTdHJpbmcgZGVmX3Bhc3N0aHJ1X25hbWVzcGFjZSA9IGRlZl9wYXNzdGhydS5nZXRUYXJnZXROYW1lc3BhY2UoKTsNCi0gICAgICAgICAgICBUeXBlcyBkZWZfcGFzc3RocnVfdHlwZXMgPSBkZWZfcGFzc3RocnUuZ2V0VHlwZXMoKTsNCi0NCi0gICAgICAgICAgICBXU0RMRGVmaW5pdGlvbldyYXBwZXIgc2VyaWFsaXplID0gbmV3IFdTRExEZWZpbml0aW9uV3JhcHBlcihkZWYxLCB0ZXN0UmVzb3VyY2VGaWxlMS50b1VSTCgpLCBheGlzQ2ZnKTsgDQotDQotICAgICAgICAgICAgRGVmaW5pdGlvbiBkZWZfc2VyaWFsaXplID0gc2VyaWFsaXplLmdldFVud3JhcHBlZERlZmluaXRpb24oKTsNCi0gICAgICAgICAgICBTdHJpbmcgZGVmX3NlcmlhbGl6ZV9zdHIgPSBkZWZfc2VyaWFsaXplLnRvU3RyaW5nKCk7DQotICAgICAgICAgICAgUU5hbWUgZGVmX3NlcmlhbGl6ZV9xbiA9IGRlZl9zZXJpYWxpemUuZ2V0UU5hbWUoKTsNCi0gICAgICAgICAgICBTdHJpbmcgZGVmX3NlcmlhbGl6ZV9uYW1lc3BhY2UgPSBkZWZfc2VyaWFsaXplLmdldFRhcmdldE5hbWVzcGFjZSgpOw0KLSAgICAgICAgICAgIFR5cGVzIGRlZl9zZXJpYWxpemVfdHlwZXMgPSBkZWZfc2VyaWFsaXplLmdldFR5cGVzKCk7DQotDQotICAgICAgICAgICAgV1NETERlZmluaXRpb25XcmFwcGVyIHJlbG9hZCA9IG5ldyBXU0RMRGVmaW5pdGlvbldyYXBwZXIoZGVmMSwgdGVzdFJlc291cmNlRmlsZTEudG9VUkwoKSwgMik7IA0KLQ0KLSAgICAgICAgICAgIERlZmluaXRpb24gZGVmX3JlbG9hZCA9IHJlbG9hZC5nZXRVbndyYXBwZWREZWZpbml0aW9uKCk7DQotICAgICAgICAgICAgU3RyaW5nIGRlZl9yZWxvYWRfc3RyID0gZGVmX3JlbG9hZC50b1N0cmluZygpOw0KLSAgICAgICAgICAgIFFOYW1lIGRlZl9yZWxvYWRfcW4gPSBkZWZfcmVsb2FkLmdldFFOYW1lKCk7DQotICAgICAgICAgICAgU3RyaW5nIGRlZl9yZWxvYWRfbmFtZXNwYWNlID0gZGVmX3JlbG9hZC5nZXRUYXJnZXROYW1lc3BhY2UoKTsNCi0gICAgICAgICAgICBUeXBlcyBkZWZfcmVsb2FkX3R5cGVzID0gZGVmX3JlbG9hZC5nZXRUeXBlcygpOw0KLQ0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleHgpIHsNCi0gICAgICAgICAgICBmYWlsKCJUaGlzIGNhbiBub3QgZmFpbCB3aXRoIHRoaXMgRXhjZXB0aW9uICIgKyBleHgpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotDQotICAgIHByaXZhdGUgRGVmaW5pdGlvbiByZWFkSW5UaGVXU0RMRmlsZShJbnB1dFN0cmVhbSBpbikgdGhyb3dzIFdTRExFeGNlcHRpb24gew0KLQ0KLSAgICAgICAgV1NETFJlYWRlciByZWFkZXIgPSBXU0RMRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1dTRExSZWFkZXIoKTsNCi0NCi0gICAgICAgIC8vIHN3aXRjaCBvZmYgdGhlIHZlcmJvc2UgbW9kZSBmb3IgYWxsIHVzZWNhc2VzDQotICAgICAgICByZWFkZXIuc2V0RmVhdHVyZShKQVZBWF9XU0RMX1ZFUkJPU0VfTU9ERV9LRVksIGZhbHNlKTsNCi0NCi0gICAgICAgIC8vIGlmIHRoZSBjdXN0ZW0gcmVzb2x2ZXIgaXMgcHJlc2VudCB0aGVuIHVzZSBpdA0KLSAgICAgICAgaWYgKGN1c3RvbVdTTEQ0SlJlc29sdmVyICE9IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gcmVhZGVyLnJlYWRXU0RMKGN1c3RvbVdTTEQ0SlJlc29sdmVyKTsNCi0gICAgICAgIH0gDQotICAgICAgICBlbHNlIHsNCi0gICAgICAgICAgICBEb2N1bWVudCBkb2M7DQotICAgICAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICAgICAgZG9jID0gbmV3RG9jdW1lbnQoaW4pOw0KLSAgICAgICAgICAgIH0gDQotICAgICAgICAgICAgY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV1NETEV4Y2VwdGlvbihXU0RMRXhjZXB0aW9uLlBBUlNFUl9FUlJPUiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBhcnNlciBDb25maWd1cmF0aW9uIEVycm9yIiwgZSk7DQotICAgICAgICAgICAgfSANCi0gICAgICAgICAgICBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFdTRExFeGNlcHRpb24oV1NETEV4Y2VwdGlvbi5QQVJTRVJfRVJST1IsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQYXJzZXIgU0FYIEVycm9yIiwgZSk7DQotDQotICAgICAgICAgICAgfSANCi0gICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV1NETEV4Y2VwdGlvbihXU0RMRXhjZXB0aW9uLklOVkFMSURfV1NETCwgIklPIEVycm9yIiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiByZWFkZXIucmVhZFdTREwoZ2V0QmFzZVVyaSgpLCBkb2MpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QmFzZVVyaSgpIHsNCi0gICAgICAgIHJldHVybiBiYXNlVXJpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldEJhc2VVcmkoU3RyaW5nIGJhc2VVcmkpIHsNCi0gICAgICAgIHRoaXMuYmFzZVVyaSA9IGJhc2VVcmk7DQotICAgIH0NCi0NCi0NCi0gICAgcHJpdmF0ZSBEb2N1bWVudCBuZXdEb2N1bWVudChJbnB1dFN0cmVhbSBpbnApDQotICAgICAgICAgICAgdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gew0KLQ0KLSAgICAgICAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBkYmYgPSBnZXRET01GYWN0b3J5KCk7DQotICAgICAgICBEb2N1bWVudEJ1aWxkZXIgZGI7DQotDQotICAgICAgICBzeW5jaHJvbml6ZWQgKGRiZikgew0KLSAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgIGRiID0gZGJmLm5ld0RvY3VtZW50QnVpbGRlcigpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpew0KLSAgICAgICAgICAgICAgICAvLyBVbmRlciBzb21lIHBlY3VsaWFyIGNvbmRpdGlvbnMgKGNsYXNzbG9hZGVyIGlzc3VlcyksIGp1c3Qgc2NyYXAgdGhlIG9sZCBkYmYsIGNyZWF0ZSBhIG5ldyBvbmUgYW5kIHRyeSBhZ2Fpbi4NCi0gICAgICAgICAgICAgICAgZGJmID0gZ2V0RE9NRmFjdG9yeSgpOw0KLSAgICAgICAgICAgICAgICBkYiA9IGRiZi5uZXdEb2N1bWVudEJ1aWxkZXIoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBkYi5zZXRFbnRpdHlSZXNvbHZlcihuZXcgRGVmYXVsdEVudGl0eVJlc29sdmVyKCkpOw0KLSAgICAgICAgZGIuc2V0RXJyb3JIYW5kbGVyKG5ldyBQYXJzZXJFcnJvckhhbmRsZXIoKSk7DQotICAgICAgICByZXR1cm4gKGRiLnBhcnNlKGlucCkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBnZXRET01GYWN0b3J5KCkgew0KLSAgICAgICAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBkYmY7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIGRiZiA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsNCi0gICAgICAgICAgICBkYmYuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICAvL2xvZy5lcnJvcihNZXNzYWdlcy5nZXRNZXNzYWdlKCJleGNlcHRpb24wMCIpLCBlICk7DQotICAgICAgICAgICAgZGJmID0gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiAoZGJmKTsNCi0gICAgfQ0KLQ0KLQ0KLQ0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSAgICAvLyBpbnRlcm5hbCBjbGFzczogUGFyc2VyRXJyb3JIYW5kbGVyDQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotDQotICAgIHB1YmxpYyBjbGFzcyBQYXJzZXJFcnJvckhhbmRsZXIgaW1wbGVtZW50cyBFcnJvckhhbmRsZXIgew0KLSAgICAgICAgLyoqDQotICAgICAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIGRlc2NyaWJpbmcgcGFyc2UgZXhjZXB0aW9uIGRldGFpbHMNCi0gICAgICAgICAqLw0KLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0UGFyc2VFeGNlcHRpb25JbmZvKFNBWFBhcnNlRXhjZXB0aW9uIHNwZSkgew0KLSAgICAgICAgICAgIFN0cmluZyBzeXN0ZW1JZCA9IHNwZS5nZXRTeXN0ZW1JZCgpOw0KLSAgICAgICAgICAgIGlmIChzeXN0ZW1JZCA9PSBudWxsKSB7DQotICAgICAgICAgICAgICAgIHN5c3RlbUlkID0gIm51bGwiOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gIlVSST0iICsgc3lzdGVtSWQgKw0KLSAgICAgICAgICAgICAgICAgICAgIiBMaW5lPSIgKyBzcGUuZ2V0TGluZU51bWJlcigpICsNCi0gICAgICAgICAgICAgICAgICAgICI6ICIgKyBzcGUuZ2V0TWVzc2FnZSgpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBtZXRob2RzIGFyZSBzdGFuZGFyZCBTQVggRXJyb3JIYW5kbGVyIG1ldGhvZHMuDQotICAgICAgICAvLyBTZWUgU0FYIGRvY3VtZW50YXRpb24gZm9yIG1vcmUgaW5mby4NCi0NCi0gICAgICAgIHB1YmxpYyB2b2lkIHdhcm5pbmcoU0FYUGFyc2VFeGNlcHRpb24gc3BlKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyB2b2lkIGVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIHNwZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7DQotICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAiRXJyb3I6ICIgKyBnZXRQYXJzZUV4Y2VwdGlvbkluZm8oc3BlKTsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgU0FYRXhjZXB0aW9uKG1lc3NhZ2UpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIHZvaWQgZmF0YWxFcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBzcGUpIHRocm93cyBTQVhFeGNlcHRpb24gew0KLSAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gIkZhdGFsIEVycm9yOiAiICsgZ2V0UGFyc2VFeGNlcHRpb25JbmZvKHNwZSk7DQotICAgICAgICAgICAgdGhyb3cgbmV3IFNBWEV4Y2VwdGlvbihtZXNzYWdlKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSAgICAvLyBpbnRlcm5hbCBjbGFzczogRGVmYXVsdEVudGl0eVJlc29sdmVyDQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotDQotICAgIHB1YmxpYyBjbGFzcyBEZWZhdWx0RW50aXR5UmVzb2x2ZXIgaW1wbGVtZW50cyBvcmcueG1sLnNheC5FbnRpdHlSZXNvbHZlciB7DQotDQotICAgICAgICBwcml2YXRlIFN0cmluZyBlbXB0eSA9ICIiOw0KLSAgICAgICAgcHJpdmF0ZSBCeXRlQXJyYXlJbnB1dFN0cmVhbSBiYWlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGVtcHR5LmdldEJ5dGVzKCkpOw0KLQ0KLSAgICAgICAgcHVibGljIERlZmF1bHRFbnRpdHlSZXNvbHZlcigpIHsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyBJbnB1dFNvdXJjZSByZXNvbHZlRW50aXR5KFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKSB7DQotDQotICAgICAgICAgICAgcmV0dXJuIG5ldyBJbnB1dFNvdXJjZShiYWlzKTsNCi0gICAgICAgIH0NCi0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2Rpc3BhdGNoZXJzL0FjdGlvbkJhc2VkT3BlcmF0aW9uRGlzcGF0Y2hUZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2Rpc3BhdGNoZXJzL0FjdGlvbkJhc2VkT3BlcmF0aW9uRGlzcGF0Y2hUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNmM0M2IuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kaXNwYXRjaGVycy9BY3Rpb25CYXNlZE9wZXJhdGlvbkRpc3BhdGNoVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkluT25seUF4aXNPcGVyYXRpb247Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBBY3Rpb25CYXNlZE9wZXJhdGlvbkRpc3BhdGNoVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RGaW5kT3BlcmF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0ID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIEF4aXNTZXJ2aWNlIGFzID0gbmV3IEF4aXNTZXJ2aWNlKCJTZXJ2aWNlMSIpOwotICAgICAgICBtZXNzYWdlQ29udGV4dC5zZXRBeGlzU2VydmljZShhcyk7Ci0KLSAgICAgICAgQXhpc09wZXJhdGlvbiBvcGVyYXRpb24xID0gbmV3IEluT25seUF4aXNPcGVyYXRpb24obmV3IFFOYW1lKCJvcGVyYXRpb24xIikpOwotICAgICAgICBBcnJheUxpc3Qgb3AxYWN0aW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgb3AxYWN0aW9ucy5hZGQoInVybjpvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLnRlc3Q6b3BlcmF0aW9uMSIpOwotICAgICAgICBvcGVyYXRpb24xLnNldFdzYW1hcHBpbmdMaXN0KG9wMWFjdGlvbnMpOwotCi0gICAgICAgIEF4aXNPcGVyYXRpb24gb3BlcmF0aW9uMiA9IG5ldyBJbk9ubHlBeGlzT3BlcmF0aW9uKG5ldyBRTmFtZSgib3BlcmF0aW9uMiIpKTsKLSAgICAgICAgQXJyYXlMaXN0IG9wMmFjdGlvbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIG9wMmFjdGlvbnMuYWRkKCJ1cm46b3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy50ZXN0Om9wZXJhdGlvbjIiKTsKLSAgICAgICAgb3BlcmF0aW9uMi5zZXRXc2FtYXBwaW5nTGlzdChvcDJhY3Rpb25zKTsKLQotICAgICAgICBhcy5hZGRPcGVyYXRpb24ob3BlcmF0aW9uMSk7Ci0gICAgICAgIGFzLmFkZE9wZXJhdGlvbihvcGVyYXRpb24yKTsKLQotICAgICAgICBhcy5tYXBBY3Rpb25Ub09wZXJhdGlvbigidXJuOm9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMudGVzdDpvcGVyYXRpb24xIiwgb3BlcmF0aW9uMSk7Ci0gICAgICAgIGFzLm1hcEFjdGlvblRvT3BlcmF0aW9uKCJ1cm46b3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy50ZXN0Om9wZXJhdGlvbjIiLCBvcGVyYXRpb24yKTsKLQotICAgICAgICBtZXNzYWdlQ29udGV4dC5zZXRXU0FBY3Rpb24oInVybjpvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLnRlc3Q6b3BlcmF0aW9uMiIpOwotCi0gICAgICAgIEFjdGlvbkJhc2VkT3BlcmF0aW9uRGlzcGF0Y2hlciBhYm9kID0gbmV3IEFjdGlvbkJhc2VkT3BlcmF0aW9uRGlzcGF0Y2hlcigpOwotICAgICAgICBhYm9kLmludm9rZShtZXNzYWdlQ29udGV4dCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhvcGVyYXRpb24yLCBtZXNzYWdlQ29udGV4dC5nZXRBeGlzT3BlcmF0aW9uKCkpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kaXNwYXRjaGVycy9BZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kaXNwYXRjaGVycy9BZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmY5OTJhLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGlzcGF0Y2hlcnMvQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuQWRkcmVzc2luZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBBZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0ZUFjdGlvbkZsYWcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgTWVzc2FnZUNvbnRleHQgbWMgPSBuZXcgTWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgCi0gICAgICAgIC8vSW5kaWNhdGUgdGhhdCB0aGUgQWRkcmVzc2luZ0luSGFuZGxlciBoYXMgcnVuLgotICAgICAgICBtYy5zZXRQcm9wZXJ0eShBZGRyZXNzaW5nQ29uc3RhbnRzLklTX0FERFJfSU5GT19BTFJFQURZX1BST0NFU1NFRCwgQm9vbGVhbi5UUlVFKTsKLQotICAgICAgICAvLyBUZWxsIHZhbGlkYXRpb24gaGFuZGxlciBOT1QgdG8gY2hlY2sgYWN0aW9uIGRpc3BhdGNoCi0gICAgICAgIG1jLnNldFByb3BlcnR5KEFkZHJlc3NpbmdDb25zdGFudHMuQUREUl9WQUxJREFURV9BQ1RJT04sIEJvb2xlYW4uRkFMU0UpOwotCi0gICAgICAgIC8vIEV2ZW4gdGhvdWdoIHRoaXMgbWVzc2FnZSBoYXMgYW4gYWN0aW9uIHRoYXQgd2lsbCBub3QgZGlzcGF0Y2ggdG8gYW4KLSAgICAgICAgLy8gQXhpc09wZXJhdGlvbiwgdGhpcyBzaG91bGRuJ3QgdGhyb3cgYSBmYXVsdC4KLSAgICAgICAgQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciBkaXNwYXRjaGVyID0gbmV3IEFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIoKTsKLSAgICAgICAgZGlzcGF0Y2hlci5pbnZva2UobWMpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGlzcGF0Y2hlcnMvUmVsYXRlc1RvQmFzZWRPcGVyYXRpb25EaXNwYXRjaGVyVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kaXNwYXRjaGVycy9SZWxhdGVzVG9CYXNlZE9wZXJhdGlvbkRpc3BhdGNoZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0ZmFjNzcuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kaXNwYXRjaGVycy9SZWxhdGVzVG9CYXNlZE9wZXJhdGlvbkRpc3BhdGNoZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLlJlbGF0ZXNUbzsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5PcGVyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5TZXJ2aWNlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuU2VydmljZUdyb3VwQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkluT25seUF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0NvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1wdWJsaWMgY2xhc3MgUmVsYXRlc1RvQmFzZWRPcGVyYXRpb25EaXNwYXRjaGVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RGaW5kT3BlcmF0aW9uKCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0KLSAgICAgICAgTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQ7Ci0gICAgICAgIEF4aXNTZXJ2aWNlIGFzMSA9IG5ldyBBeGlzU2VydmljZSgiU2VydmljZTEiKTsKLSAgICAgICAgQXhpc0NvbmZpZ3VyYXRpb24gYWMgPSBuZXcgQXhpc0NvbmZpZ3VyYXRpb24oKTsKLSAgICAgICAgYWMuYWRkU2VydmljZShhczEpOwotCi0gICAgICAgIEF4aXNPcGVyYXRpb24gb3BlcmF0aW9uMSA9IG5ldyBJbk9ubHlBeGlzT3BlcmF0aW9uKG5ldyBRTmFtZSgib3BlcmF0aW9uMSIpKTsKLSAgICAgICAgQXhpc09wZXJhdGlvbiBvcGVyYXRpb24yID0gbmV3IEluT25seUF4aXNPcGVyYXRpb24obmV3IFFOYW1lKCJvcGVyYXRpb24yIikpOwotICAgICAgICBhczEuYWRkT3BlcmF0aW9uKG9wZXJhdGlvbjEpOwotICAgICAgICBhczEuYWRkT3BlcmF0aW9uKG9wZXJhdGlvbjIpOwotCi0gICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNjID0gbmV3IENvbmZpZ3VyYXRpb25Db250ZXh0KGFjKTsKLSAgICAgICAgU2VydmljZUdyb3VwQ29udGV4dCBzZ2MgPSBjYy5jcmVhdGVTZXJ2aWNlR3JvdXBDb250ZXh0KGFzMS5nZXRBeGlzU2VydmljZUdyb3VwKCkpOwotICAgICAgICBTZXJ2aWNlQ29udGV4dCBzZXJ2aWNlQ29udGV4dCA9IHNnYy5nZXRTZXJ2aWNlQ29udGV4dChhczEpOwotICAgICAgICBPcGVyYXRpb25Db250ZXh0IG9jMSA9IHNlcnZpY2VDb250ZXh0LmNyZWF0ZU9wZXJhdGlvbkNvbnRleHQob3BlcmF0aW9uMSk7Ci0gICAgICAgIE9wZXJhdGlvbkNvbnRleHQgb2MyID0gc2VydmljZUNvbnRleHQuY3JlYXRlT3BlcmF0aW9uQ29udGV4dChvcGVyYXRpb24yKTsKLSAgICAgICAgY2MucmVnaXN0ZXJPcGVyYXRpb25Db250ZXh0KCJ1cm46b3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5tZXNzYWdlaWQ6MTIzIiwgb2MxKTsKLSAgICAgICAgY2MucmVnaXN0ZXJPcGVyYXRpb25Db250ZXh0KCJ1cm46b3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5tZXNzYWdlaWQ6NDU2Iiwgb2MyKTsKLSAgICAgICAgbWVzc2FnZUNvbnRleHQgPSBjYy5jcmVhdGVNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBtZXNzYWdlQ29udGV4dAotICAgICAgICAgICAgICAgIC5hZGRSZWxhdGVzVG8obmV3IFJlbGF0ZXNUbygidXJuOm9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMubWVzc2FnZWlkOjQ1NiIpKTsKLSAgICAgICAgbWVzc2FnZUNvbnRleHQuc2V0QXhpc1NlcnZpY2UoYXMxKTsKLQotICAgICAgICBSZWxhdGVzVG9CYXNlZE9wZXJhdGlvbkRpc3BhdGNoZXIgcnVpc2QgPSBuZXcgUmVsYXRlc1RvQmFzZWRPcGVyYXRpb25EaXNwYXRjaGVyKCk7Ci0gICAgICAgIHJ1aXNkLmludm9rZShtZXNzYWdlQ29udGV4dCk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKG9wZXJhdGlvbjIsIG1lc3NhZ2VDb250ZXh0LmdldEF4aXNPcGVyYXRpb24oKSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2Rpc3BhdGNoZXJzL1JlbGF0ZXNUb0Jhc2VkU2VydmljZURpc3BhdGNoZXJUZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2Rpc3BhdGNoZXJzL1JlbGF0ZXNUb0Jhc2VkU2VydmljZURpc3BhdGNoZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExNmVhMzcuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kaXNwYXRjaGVycy9SZWxhdGVzVG9CYXNlZFNlcnZpY2VEaXNwYXRjaGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5SZWxhdGVzVG87Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuT3BlcmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuU2VydmljZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LlNlcnZpY2VHcm91cENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZUdyb3VwOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uSW5Pbmx5QXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzQ29uZmlndXJhdGlvbjsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLXB1YmxpYyBjbGFzcyBSZWxhdGVzVG9CYXNlZFNlcnZpY2VEaXNwYXRjaGVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RGaW5kU2VydmljZSgpIHRocm93cyBBeGlzRmF1bHQgewotCi0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0OwotCi0gICAgICAgIEF4aXNDb25maWd1cmF0aW9uIGFjID0gbmV3IEF4aXNDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNjID0gbmV3IENvbmZpZ3VyYXRpb25Db250ZXh0KGFjKTsKLSAgICAgICAgQXhpc1NlcnZpY2UgYXMxID0gbmV3IEF4aXNTZXJ2aWNlKCJTZXJ2aWNlMSIpOwotICAgICAgICBBeGlzU2VydmljZUdyb3VwIHNnID0gbmV3IEF4aXNTZXJ2aWNlR3JvdXAoYWMpOwotICAgICAgICBzZy5hZGRTZXJ2aWNlKGFzMSk7Ci0gICAgICAgIFNlcnZpY2VHcm91cENvbnRleHQgc2djID0gY2MuY3JlYXRlU2VydmljZUdyb3VwQ29udGV4dChzZyk7Ci0KLSAgICAgICAgU2VydmljZUNvbnRleHQgc2MxID0gc2djLmdldFNlcnZpY2VDb250ZXh0KGFzMSk7Ci0KLSAgICAgICAgQXhpc1NlcnZpY2UgYXMyID0gbmV3IEF4aXNTZXJ2aWNlKCJTZXJ2aWNlMiIpOwotICAgICAgICBzZy5hZGRTZXJ2aWNlKGFzMik7Ci0gICAgICAgIFNlcnZpY2VDb250ZXh0IHNjMiA9IHNnYy5nZXRTZXJ2aWNlQ29udGV4dChhczIpOwotCi0gICAgICAgIGFjLmFkZFNlcnZpY2UoYXMxKTsKLSAgICAgICAgYWMuYWRkU2VydmljZShhczIpOwotCi0gICAgICAgIEF4aXNPcGVyYXRpb24gb3BlcmF0aW9uMSA9IG5ldyBJbk9ubHlBeGlzT3BlcmF0aW9uKG5ldyBRTmFtZSgib3BlcmF0aW9uMSIpKTsKLSAgICAgICAgQXhpc09wZXJhdGlvbiBvcGVyYXRpb24yID0gbmV3IEluT25seUF4aXNPcGVyYXRpb24obmV3IFFOYW1lKCJvcGVyYXRpb24yIikpOwotICAgICAgICBhczEuYWRkT3BlcmF0aW9uKG9wZXJhdGlvbjEpOwotICAgICAgICBhczIuYWRkT3BlcmF0aW9uKG9wZXJhdGlvbjIpOwotCi0KLSAgICAgICAgT3BlcmF0aW9uQ29udGV4dCBvYzEgPSBzYzEuY3JlYXRlT3BlcmF0aW9uQ29udGV4dChvcGVyYXRpb24xKTsKLSAgICAgICAgT3BlcmF0aW9uQ29udGV4dCBvYzIgPSBzYzIuY3JlYXRlT3BlcmF0aW9uQ29udGV4dChvcGVyYXRpb24yKTsKLQotICAgICAgICBjYy5yZWdpc3Rlck9wZXJhdGlvbkNvbnRleHQoInVybjpvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLm1lc3NhZ2VpZDoxMjMiLCBvYzEpOwotICAgICAgICBjYy5yZWdpc3Rlck9wZXJhdGlvbkNvbnRleHQoInVybjpvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLm1lc3NhZ2VpZDo0NTYiLCBvYzIpOwotICAgICAgICBtZXNzYWdlQ29udGV4dCA9IGNjLmNyZWF0ZU1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIG1lc3NhZ2VDb250ZXh0Ci0gICAgICAgICAgICAgICAgLmFkZFJlbGF0ZXNUbyhuZXcgUmVsYXRlc1RvKCJ1cm46b3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5tZXNzYWdlaWQ6NDU2IikpOwotCi0gICAgICAgIFJlbGF0ZXNUb0Jhc2VkU2VydmljZURpc3BhdGNoZXIgcnVpc2QgPSBuZXcgUmVsYXRlc1RvQmFzZWRTZXJ2aWNlRGlzcGF0Y2hlcigpOwotICAgICAgICBydWlzZC5pbnZva2UobWVzc2FnZUNvbnRleHQpOwotCi0gICAgICAgIGFzc2VydEVxdWFscyhhczIsIG1lc3NhZ2VDb250ZXh0LmdldEF4aXNTZXJ2aWNlKCkpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kaXNwYXRjaGVycy9SZXF1ZXN0VVJJQmFzZWRPcGVyYXRpb25EaXNwYXRjaGVyVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kaXNwYXRjaGVycy9SZXF1ZXN0VVJJQmFzZWRPcGVyYXRpb25EaXNwYXRjaGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDhjMzE2Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGlzcGF0Y2hlcnMvUmVxdWVzdFVSSUJhc2VkT3BlcmF0aW9uRGlzcGF0Y2hlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVyczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uSW5Pbmx5QXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzQ29uZmlndXJhdGlvbjsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLXB1YmxpYyBjbGFzcyBSZXF1ZXN0VVJJQmFzZWRPcGVyYXRpb25EaXNwYXRjaGVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RGaW5kU2VydmljZSgpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dDsKLSAgICAgICAgQXhpc1NlcnZpY2UgYXMxID0gbmV3IEF4aXNTZXJ2aWNlKCJTZXJ2aWNlMSIpOwotCi0KLSAgICAgICAgQXhpc09wZXJhdGlvbiBvcGVyYXRpb24xID0gbmV3IEluT25seUF4aXNPcGVyYXRpb24obmV3IFFOYW1lKCJvcGVyYXRpb24xIikpOwotICAgICAgICBBeGlzT3BlcmF0aW9uIG9wZXJhdGlvbjIgPSBuZXcgSW5Pbmx5QXhpc09wZXJhdGlvbihuZXcgUU5hbWUoIm9wZXJhdGlvbjIiKSk7Ci0gICAgICAgIGFzMS5hZGRPcGVyYXRpb24ob3BlcmF0aW9uMSk7Ci0gICAgICAgIGFzMS5hZGRPcGVyYXRpb24ob3BlcmF0aW9uMik7Ci0KLSAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHQgY2MgPSBDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkuY3JlYXRlRW1wdHlDb25maWd1cmF0aW9uQ29udGV4dCgpOwotICAgICAgICBBeGlzQ29uZmlndXJhdGlvbiBhYyA9IGNjLmdldEF4aXNDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgIGFjLmFkZFNlcnZpY2UoYXMxKTsKLSAgICAgICAgbWVzc2FnZUNvbnRleHQgPSBjYy5jcmVhdGVNZXNzYWdlQ29udGV4dCgpOwotCi0gICAgICAgIG1lc3NhZ2VDb250ZXh0LnNldFRvKG5ldyBFbmRwb2ludFJlZmVyZW5jZSgKLSAgICAgICAgICAgICAgICAiaHR0cDovLzEyNy4wLjAuMTo4MDgwL2F4aXMyL3NlcnZpY2VzL1NlcnZpY2UxL29wZXJhdGlvbjIiKSk7Ci0gICAgICAgIG1lc3NhZ2VDb250ZXh0LnNldEF4aXNTZXJ2aWNlKGFzMSk7Ci0KLSAgICAgICAgUmVxdWVzdFVSSUJhc2VkT3BlcmF0aW9uRGlzcGF0Y2hlciBydWlzZCA9IG5ldyBSZXF1ZXN0VVJJQmFzZWRPcGVyYXRpb25EaXNwYXRjaGVyKCk7Ci0gICAgICAgIHJ1aXNkLmludm9rZShtZXNzYWdlQ29udGV4dCk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKG9wZXJhdGlvbjIsIG1lc3NhZ2VDb250ZXh0LmdldEF4aXNPcGVyYXRpb24oKSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2Rpc3BhdGNoZXJzL1JlcXVlc3RVUklCYXNlZFNlcnZpY2VEaXNwYXRjaGVyVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kaXNwYXRjaGVycy9SZXF1ZXN0VVJJQmFzZWRTZXJ2aWNlRGlzcGF0Y2hlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjJjOGIxZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2Rpc3BhdGNoZXJzL1JlcXVlc3RVUklCYXNlZFNlcnZpY2VEaXNwYXRjaGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzQ29uZmlndXJhdGlvbjsKLQotcHVibGljIGNsYXNzIFJlcXVlc3RVUklCYXNlZFNlcnZpY2VEaXNwYXRjaGVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RGaW5kU2VydmljZSgpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dDsKLSAgICAgICAgQXhpc1NlcnZpY2UgYXMxID0gbmV3IEF4aXNTZXJ2aWNlKCJTZXJ2aWNlMSIpOwotICAgICAgICBBeGlzU2VydmljZSBhczIgPSBuZXcgQXhpc1NlcnZpY2UoIlNlcnZpY2UyIik7Ci0KLSAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHQgY2MgPSBDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkuY3JlYXRlRW1wdHlDb25maWd1cmF0aW9uQ29udGV4dCgpOwotICAgICAgICBBeGlzQ29uZmlndXJhdGlvbiBhYyA9IGNjLmdldEF4aXNDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgIGFjLmFkZFNlcnZpY2UoYXMxKTsKLSAgICAgICAgYWMuYWRkU2VydmljZShhczIpOwotICAgICAgICBtZXNzYWdlQ29udGV4dCA9IGNjLmNyZWF0ZU1lc3NhZ2VDb250ZXh0KCk7Ci0KLSAgICAgICAgbWVzc2FnZUNvbnRleHQKLSAgICAgICAgICAgICAgICAuc2V0VG8obmV3IEVuZHBvaW50UmVmZXJlbmNlKCJodHRwOi8vMTI3LjAuMC4xOjgwODAvYXhpczIvc2VydmljZXMvU2VydmljZTIiKSk7Ci0KLSAgICAgICAgUmVxdWVzdFVSSUJhc2VkU2VydmljZURpc3BhdGNoZXIgcnVpc2QgPSBuZXcgUmVxdWVzdFVSSUJhc2VkU2VydmljZURpc3BhdGNoZXIoKTsKLSAgICAgICAgcnVpc2QuaW52b2tlKG1lc3NhZ2VDb250ZXh0KTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoYXMyLCBtZXNzYWdlQ29udGV4dC5nZXRBeGlzU2VydmljZSgpKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGlzcGF0Y2hlcnMvU09BUE1lc3NhZ2VCb2R5QmFzZWRPcGVyYXRpb25EaXNwYXRjaGVyVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kaXNwYXRjaGVycy9TT0FQTWVzc2FnZUJvZHlCYXNlZE9wZXJhdGlvbkRpc3BhdGNoZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyMDcwM2QuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kaXNwYXRjaGVycy9TT0FQTWVzc2FnZUJvZHlCYXNlZE9wZXJhdGlvbkRpc3BhdGNoZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEJvZHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5Jbk9ubHlBeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0aW9uOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotcHVibGljIGNsYXNzIFNPQVBNZXNzYWdlQm9keUJhc2VkT3BlcmF0aW9uRGlzcGF0Y2hlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmluZE9wZXJhdGlvbigpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dDsKLSAgICAgICAgQXhpc1NlcnZpY2UgYXMxID0gbmV3IEF4aXNTZXJ2aWNlKCJTZXJ2aWNlMSIpOwotCi0KLSAgICAgICAgQXhpc09wZXJhdGlvbiBvcGVyYXRpb24xID0gbmV3IEluT25seUF4aXNPcGVyYXRpb24obmV3IFFOYW1lKCJvcGVyYXRpb24xIikpOwotICAgICAgICBBeGlzT3BlcmF0aW9uIG9wZXJhdGlvbjIgPSBuZXcgSW5Pbmx5QXhpc09wZXJhdGlvbihuZXcgUU5hbWUoIm9wZXJhdGlvbjIiKSk7Ci0gICAgICAgIGFzMS5hZGRPcGVyYXRpb24ob3BlcmF0aW9uMSk7Ci0gICAgICAgIGFzMS5hZGRPcGVyYXRpb24ob3BlcmF0aW9uMik7Ci0KLSAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHQgY2MgPSBDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkuY3JlYXRlRW1wdHlDb25maWd1cmF0aW9uQ29udGV4dCgpOwotICAgICAgICBBeGlzQ29uZmlndXJhdGlvbiBhYyA9IGNjLmdldEF4aXNDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgIGFjLmFkZFNlcnZpY2UoYXMxKTsKLSAgICAgICAgbWVzc2FnZUNvbnRleHQgPSBjYy5jcmVhdGVNZXNzYWdlQ29udGV4dCgpOwotCi0gICAgICAgIG1lc3NhZ2VDb250ZXh0LnNldEF4aXNTZXJ2aWNlKGFzMSk7Ci0KLSAgICAgICAgU09BUEVudmVsb3BlIHNlID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDExRmFjdG9yeSgpLmNyZWF0ZVNPQVBFbnZlbG9wZSgpOwotICAgICAgICBTT0FQQm9keSBzYiA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMUZhY3RvcnkoKS5jcmVhdGVTT0FQQm9keShzZSk7Ci0gICAgICAgIHNiLmFkZENoaWxkKE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMUZhY3RvcnkoKS5jcmVhdGVPTUVsZW1lbnQoIm9wZXJhdGlvbjIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vdGVzdCIsICJwZngiKSk7Ci0gICAgICAgIG1lc3NhZ2VDb250ZXh0LnNldEVudmVsb3BlKHNlKTsKLQotCi0gICAgICAgIFNPQVBNZXNzYWdlQm9keUJhc2VkT3BlcmF0aW9uRGlzcGF0Y2hlciBydWlzZCA9Ci0gICAgICAgICAgICAgICAgbmV3IFNPQVBNZXNzYWdlQm9keUJhc2VkT3BlcmF0aW9uRGlzcGF0Y2hlcigpOwotICAgICAgICBydWlzZC5pbnZva2UobWVzc2FnZUNvbnRleHQpOwotCi0gICAgICAgIGFzc2VydEVxdWFscyhvcGVyYXRpb24yLCBtZXNzYWdlQ29udGV4dC5nZXRBeGlzT3BlcmF0aW9uKCkpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kaXNwYXRjaGVycy9TT0FQTWVzc2FnZUJvZHlCYXNlZFNlcnZpY2VEaXNwYXRjaGVyVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kaXNwYXRjaGVycy9TT0FQTWVzc2FnZUJvZHlCYXNlZFNlcnZpY2VEaXNwYXRjaGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDFhMTRjLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGlzcGF0Y2hlcnMvU09BUE1lc3NhZ2VCb2R5QmFzZWRTZXJ2aWNlRGlzcGF0Y2hlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVyczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQQm9keTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0aW9uOwotCi1wdWJsaWMgY2xhc3MgU09BUE1lc3NhZ2VCb2R5QmFzZWRTZXJ2aWNlRGlzcGF0Y2hlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmluZFNlcnZpY2UoKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQ7Ci0gICAgICAgIEF4aXNTZXJ2aWNlIGFzMSA9IG5ldyBBeGlzU2VydmljZSgiU2VydmljZTEiKTsKLSAgICAgICAgQXhpc1NlcnZpY2UgYXMyID0gbmV3IEF4aXNTZXJ2aWNlKCJTZXJ2aWNlMiIpOwotICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBjYyA9IENvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeS5jcmVhdGVFbXB0eUNvbmZpZ3VyYXRpb25Db250ZXh0KCk7Ci0gICAgICAgIEF4aXNDb25maWd1cmF0aW9uIGFjID0gY2MuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKTsKLSAgICAgICAgYWMuYWRkU2VydmljZShhczEpOwotICAgICAgICBhYy5hZGRTZXJ2aWNlKGFzMik7Ci0gICAgICAgIG1lc3NhZ2VDb250ZXh0ID0gY2MuY3JlYXRlTWVzc2FnZUNvbnRleHQoKTsKLQotICAgICAgICBTT0FQRW52ZWxvcGUgc2UgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTFGYWN0b3J5KCkuY3JlYXRlU09BUEVudmVsb3BlKCk7Ci0gICAgICAgIFNPQVBCb2R5IHNiID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDExRmFjdG9yeSgpLmNyZWF0ZVNPQVBCb2R5KHNlKTsKLSAgICAgICAgc2IuYWRkQ2hpbGQoT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDExRmFjdG9yeSgpLmNyZWF0ZU9NRWxlbWVudCgib3BlcmF0aW9uMiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly8xMjcuMC4wLjE6ODA4MC9heGlzMi9zZXJ2aWNlcy9TZXJ2aWNlMiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBmeCIpKTsKLSAgICAgICAgbWVzc2FnZUNvbnRleHQuc2V0RW52ZWxvcGUoc2UpOwotCi0KLSAgICAgICAgU09BUE1lc3NhZ2VCb2R5QmFzZWRTZXJ2aWNlRGlzcGF0Y2hlciBydWlzZCA9IG5ldyBTT0FQTWVzc2FnZUJvZHlCYXNlZFNlcnZpY2VEaXNwYXRjaGVyKCk7Ci0gICAgICAgIHJ1aXNkLmludm9rZShtZXNzYWdlQ29udGV4dCk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKGFzMiwgbWVzc2FnZUNvbnRleHQuZ2V0QXhpc1NlcnZpY2UoKSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9BYnN0cmFjdEVuZ2luZVRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL0Fic3RyYWN0RW5naW5lVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTU0MjcwLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL0Fic3RyYWN0RW5naW5lVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuQWJzdHJhY3RJbk91dFN5bmNNZXNzYWdlUmVjZWl2ZXI7Ci0KLXB1YmxpYyBjbGFzcyBBYnN0cmFjdEVuZ2luZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgcHVibGljIEFic3RyYWN0RW5naW5lVGVzdCgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQWJzdHJhY3RFbmdpbmVUZXN0KFN0cmluZyBhcmcwKSB7Ci0gICAgICAgIHN1cGVyKGFyZzApOwotICAgIH0KLQotICAgIHB1YmxpYyBjbGFzcyBOdWxsTWVzc2FnZVJlY2VpdmVyIGV4dGVuZHMgQWJzdHJhY3RJbk91dFN5bmNNZXNzYWdlUmVjZWl2ZXIgewotCi0gICAgICAgIHB1YmxpYyB2b2lkIGludm9rZUJ1c2luZXNzTG9naWMoTWVzc2FnZUNvbnRleHQgaW5NZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VDb250ZXh0IG91dE1lc3NhZ2UpCi0gICAgICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL0RlcGxveWFibGVDaGFpblRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL0RlcGxveWFibGVDaGFpblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFkN2Q3Yi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9EZXBsb3lhYmxlQ2hhaW5UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5lbmdpbmU7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotcHVibGljIGNsYXNzIERlcGxveWFibGVDaGFpblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7DQotICAgIHN0YXRpYyBmaW5hbCBPYmplY3QgQV9UQVJHRVQgPSBuZXcgT2JqZWN0KCk7DQotICAgIHN0YXRpYyBmaW5hbCBPYmplY3QgQl9UQVJHRVQgPSBuZXcgT2JqZWN0KCk7DQotICAgIHN0YXRpYyBmaW5hbCBPYmplY3QgQ19UQVJHRVQgPSBuZXcgT2JqZWN0KCk7DQotICAgIHN0YXRpYyBmaW5hbCBPYmplY3QgRF9UQVJHRVQgPSBuZXcgT2JqZWN0KCk7DQotICAgIHN0YXRpYyBmaW5hbCBPYmplY3QgRV9UQVJHRVQgPSBuZXcgT2JqZWN0KCk7DQotDQotICAgIHByaXZhdGUgRGVwbG95YWJsZSBhOw0KLSAgICBwcml2YXRlIERlcGxveWFibGUgYjsNCi0gICAgcHJpdmF0ZSBEZXBsb3lhYmxlIGM7DQotICAgIHByaXZhdGUgRGVwbG95YWJsZSBkOw0KLSAgICBwcml2YXRlIERlcGxveWFibGUgZTsNCi0gICAgRGVwbG95YWJsZUNoYWluIGVjOw0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgYSA9IG5ldyBEZXBsb3lhYmxlKCJhIiwgQV9UQVJHRVQpOw0KLSAgICAgICAgYiA9IG5ldyBEZXBsb3lhYmxlKCJiIiwgQl9UQVJHRVQpOw0KLSAgICAgICAgYyA9IG5ldyBEZXBsb3lhYmxlKCJjIiwgQ19UQVJHRVQpOw0KLSAgICAgICAgZCA9IG5ldyBEZXBsb3lhYmxlKCJkIiwgRF9UQVJHRVQpOw0KLSAgICAgICAgZSA9IG5ldyBEZXBsb3lhYmxlKCJlIiwgRV9UQVJHRVQpOw0KLSAgICAgICAgZWMgPSBuZXcgRGVwbG95YWJsZUNoYWluKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdER1cGxpY2F0ZURlcGxveSgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgYS5hZGRTdWNjZXNzb3IoImIiKTsNCi0gICAgICAgIGVjLmRlcGxveShhKTsNCi0NCi0gICAgICAgIC8vIFNob3VsZCBiZSBvayB0byBkbyB0aGlzIGFnYWluIGFzIGxvbmcgYXMgZXZlcnl0aGluZyBtYXRjaGVzLg0KLSAgICAgICAgZWMuZGVwbG95KGEpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RPcmRlcmluZygpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgYS5hZGRTdWNjZXNzb3IoImIiKTsNCi0gICAgICAgIGVjLmRlcGxveShiKTsNCi0gICAgICAgIGVjLmRlcGxveShhKTsNCi0gICAgICAgIGVjLnJlYnVpbGQoKTsNCi0gICAgICAgIExpc3QgY2hhaW4gPSBlYy5nZXRDaGFpbigpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJXcm9uZyBudW1iZXIgb2YgaXRlbXMiLCAyLCBjaGFpbi5zaXplKCkpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJXcm9uZyBvcmRlciIsIEFfVEFSR0VULCBjaGFpbi5nZXQoMCkpOw0KLQ0KLSAgICAgICAgZWMuYWRkUmVsYXRpb25zaGlwKCJiIiwgImEiKTsNCi0gICAgICAgIGJvb2xlYW4gY2F1Z2h0ID0gZmFsc2U7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIGVjLnJlYnVpbGQoKTsNCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlMSkgew0KLSAgICAgICAgICAgIC8vIEV4cGVjdGVkIEV4Y2VwdGlvbiwgeWF5IQ0KLSAgICAgICAgICAgIGNhdWdodCA9IHRydWU7DQotICAgICAgICB9DQotICAgICAgICBpZiAoIWNhdWdodCkgZmFpbCgiRGlkbid0IGNhdGNoIGV4Y2VwdGlvbiBmb3IgY3ljbGljIGRlcGVuZGVuY3kiKTsNCi0NCi0gICAgICAgIGVjID0gbmV3IERlcGxveWFibGVDaGFpbigpOw0KLSAgICAgICAgYi5hZGRTdWNjZXNzb3IoImMiKTsNCi0gICAgICAgIGQuYWRkU3VjY2Vzc29yKCJlIik7DQotICAgICAgICBlLmFkZFByZWRlY2Vzc29yKCJiIik7DQotDQotICAgICAgICBlLnNldExhc3QodHJ1ZSk7DQotDQotICAgICAgICBlYy5kZXBsb3koYik7DQotICAgICAgICBlYy5kZXBsb3koYSk7DQotICAgICAgICBlYy5kZXBsb3koYyk7DQotICAgICAgICBlYy5kZXBsb3koZCk7DQotICAgICAgICBlYy5kZXBsb3koZSk7DQotICAgICAgICBlYy5yZWJ1aWxkKCk7DQotICAgICAgICBjaGFpbiA9IGVjLmdldENoYWluKCk7DQotDQotICAgICAgICBhc3NlcnRFcXVhbHMoIldyb25nIG51bWJlciBvZiBpdGVtcyIsIDUsIGNoYWluLnNpemUoKSk7DQotICAgICAgICBpbnQgYUluZGV4ID0gY2hhaW4uaW5kZXhPZihBX1RBUkdFVCk7DQotICAgICAgICBpbnQgYkluZGV4ID0gY2hhaW4uaW5kZXhPZihCX1RBUkdFVCk7DQotICAgICAgICBpbnQgY0luZGV4ID0gY2hhaW4uaW5kZXhPZihDX1RBUkdFVCk7DQotICAgICAgICBpbnQgZEluZGV4ID0gY2hhaW4uaW5kZXhPZihEX1RBUkdFVCk7DQotICAgICAgICBpbnQgZUluZGV4ID0gY2hhaW4uaW5kZXhPZihFX1RBUkdFVCk7DQotICAgICAgICBhc3NlcnRUcnVlKGFJbmRleCA8IGJJbmRleCk7DQotICAgICAgICBhc3NlcnRUcnVlKGJJbmRleCA8IGNJbmRleCk7DQotICAgICAgICBhc3NlcnRUcnVlKGRJbmRleCA8IGVJbmRleCk7DQotICAgICAgICBhc3NlcnRUcnVlKGJJbmRleCA8IGVJbmRleCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvRGlzcGF0Y2hQaGFzZVRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL0Rpc3BhdGNoUGhhc2VUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhZjQ3ZWUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvRGlzcGF0Y2hQaGFzZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZW5naW5lOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uV1NETDJDb25zdGFudHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMQ29uc3RhbnRzLldTREwyMF8yMDA0X0NvbnN0YW50czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLldTRExDb25zdGFudHMuV1NETDIwXzIwMDZDb25zdGFudHM7DQotDQotcHVibGljIGNsYXNzIERpc3BhdGNoUGhhc2VUZXN0IGV4dGVuZHMgVGVzdENhc2Ugew0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFZlcmlmeSBjYXBhYmlsaXR5IG9mIGlzT25ld2F5IG1ldGhvZCBpbiBEaXNwYXRjaFBoYXNlLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdElzT25ld2F5KCkgew0KLSAgICAgICAgU3RyaW5nIG1lcCA9IFdTREwyQ29uc3RhbnRzLk1FUF9VUklfSU5fT05MWTsNCi0gICAgICAgIERpc3BhdGNoUGhhc2UgcGhhc2UgPSBuZXcgRGlzcGF0Y2hQaGFzZSgpOw0KLSAgICAgICAgYm9vbGVhbiBvbmV3YXkgPSBwaGFzZS5pc09uZXdheShtZXApOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShvbmV3YXkpOw0KLSAgICAgICAgbWVwID0gV1NETDIwXzIwMDRfQ29uc3RhbnRzLk1FUF9VUklfSU5fT05MWTsNCi0gICAgICAgIG9uZXdheSA9IHBoYXNlLmlzT25ld2F5KG1lcCk7DQotICAgICAgICBhc3NlcnRUcnVlKG9uZXdheSk7DQotICAgICAgICBtZXAgPSBXU0RMMjBfMjAwNkNvbnN0YW50cy5NRVBfVVJJX0lOX09OTFk7DQotICAgICAgICBvbmV3YXkgPSBwaGFzZS5pc09uZXdheShtZXApOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShvbmV3YXkpOw0KLSAgICAgICAgbWVwID0gV1NETDJDb25zdGFudHMuTUVQX1VSSV9JTl9PVVQ7DQotICAgICAgICBvbmV3YXkgPSBwaGFzZS5pc09uZXdheShtZXApOw0KLSAgICAgICAgYXNzZXJ0RmFsc2Uob25ld2F5KTsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9Nb2R1bGVDb25maWdUZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9Nb2R1bGVDb25maWdUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxMmY1MmIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvTW9kdWxlQ29uZmlnVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5lbmdpbmU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BYnN0cmFjdFRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC5EZXBsb3ltZW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC5TZXJ2aWNlQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLk1vZHVsZUNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5QYXJhbWV0ZXI7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLXB1YmxpYyBjbGFzcyBNb2R1bGVDb25maWdUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgQXhpc0NvbmZpZ3VyYXRpb24gYXI7Ci0gICAgU3RyaW5nIGF4aXMyeG1sID0gQWJzdHJhY3RUZXN0Q2FzZS5iYXNlZGlyICsKLSAgICAgICAgICAgICIvdGFyZ2V0L3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvbW9kdWxlQ29uZmlnL2F4aXMyLnhtbCI7Ci0gICAgU3RyaW5nIHJlcG8gPSBBYnN0cmFjdFRlc3RDYXNlLmJhc2VkaXIgKyAiL3RhcmdldC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L21vZHVsZUNvbmZpZyI7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TW9kdWxlQ29uZmlnQXRBeGlzQ29uZmlnKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYXIgPSBDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkKLSAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZUNvbmZpZ3VyYXRpb25Db250ZXh0RnJvbUZpbGVTeXN0ZW0obnVsbCwgYXhpczJ4bWwpCi0gICAgICAgICAgICAgICAgICAgIC5nZXRBeGlzQ29uZmlndXJhdGlvbigpOwotICAgICAgICAgICAgTW9kdWxlQ29uZmlndXJhdGlvbiBtb2R1bGVDb25maWd1cmF0aW9uID0KLSAgICAgICAgICAgICAgICAgICAgYXIuZ2V0TW9kdWxlQ29uZmlnKCJ0ZXN0TW9kdWxlIik7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKG1vZHVsZUNvbmZpZ3VyYXRpb24pOwotICAgICAgICAgICAgUGFyYW1ldGVyIHBhcmEgPSBtb2R1bGVDb25maWd1cmF0aW9uLmdldFBhcmFtZXRlcigidGVzdE1vZHVsZVBhcmEiKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwocGFyYSk7Ci0KLSAgICAgICAgICAgIG1vZHVsZUNvbmZpZ3VyYXRpb24gPQotICAgICAgICAgICAgICAgICAgICBhci5nZXRNb2R1bGVDb25maWcoInRlc3RNb2R1bGUyIik7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKG1vZHVsZUNvbmZpZ3VyYXRpb24pOwotICAgICAgICAgICAgcGFyYSA9IG1vZHVsZUNvbmZpZ3VyYXRpb24uZ2V0UGFyYW1ldGVyKCJ0ZXN0TW9kdWxlUGFyYTIiKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwocGFyYSk7Ci0gICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJUaGlzIGNhbiBub3QgZmFpbCB3aXRoIHRoaXMgRGVwbG95bWVudEV4Y2VwdGlvbiAiICsgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNb2R1bGVDb25maWdBdFNlcnZpY2UoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWd1cmF0aW9uQ29udGV4dCA9IENvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeQotICAgICAgICAgICAgICAgICAgICAuY3JlYXRlQ29uZmlndXJhdGlvbkNvbnRleHRGcm9tRmlsZVN5c3RlbShudWxsLCBheGlzMnhtbCk7Ci0gICAgICAgICAgICBhciA9IGNvbmZpZ3VyYXRpb25Db250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCk7Ci0KLQotICAgICAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSA9IG5ldyBBeGlzU2VydmljZSgpOwotICAgICAgICAgICAgc2VydmljZS5zZXROYW1lKCJ0ZXN0U2VydmljZSIpOwotICAgICAgICAgICAgYXIuYWRkU2VydmljZShzZXJ2aWNlKTsKLSAgICAgICAgICAgIElucHV0U3RyZWFtIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShyZXBvICsgIi9zZXJ2aWNlMS54bWwiKTsKLSAgICAgICAgICAgIFNlcnZpY2VCdWlsZGVyIHNidWlsZGVyID0gbmV3IFNlcnZpY2VCdWlsZGVyKGluLCBjb25maWd1cmF0aW9uQ29udGV4dCwgc2VydmljZSk7Ci0gICAgICAgICAgICBzYnVpbGRlci5wb3B1bGF0ZVNlcnZpY2Uoc2J1aWxkZXIuYnVpbGRPTSgpKTsKLQotICAgICAgICAgICAgTW9kdWxlQ29uZmlndXJhdGlvbiBtb2R1bGVDb25maWd1cmF0aW9uID0KLSAgICAgICAgICAgICAgICAgICAgc2VydmljZS5nZXRNb2R1bGVDb25maWcoIlNlcnZpZV9tb2R1bGUiKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwobW9kdWxlQ29uZmlndXJhdGlvbik7Ci0gICAgICAgICAgICBQYXJhbWV0ZXIgcGFyYSA9IG1vZHVsZUNvbmZpZ3VyYXRpb24uZ2V0UGFyYW1ldGVyKCJTZXJ2aWVfbW9kdWxlX3BhcmEiKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwocGFyYSk7Ci0KLSAgICAgICAgICAgIEF4aXNPcGVyYXRpb24gb3AgPSBzZXJ2aWNlLmdldE9wZXJhdGlvbihuZXcgUU5hbWUoImVjaG9TdHJpbmciKSk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKG9wKTsKLQotICAgICAgICAgICAgbW9kdWxlQ29uZmlndXJhdGlvbiA9IG9wLmdldE1vZHVsZUNvbmZpZygiT3BfTW9kdWxlIik7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKG1vZHVsZUNvbmZpZ3VyYXRpb24pOwotICAgICAgICAgICAgcGFyYSA9IG1vZHVsZUNvbmZpZ3VyYXRpb24uZ2V0UGFyYW1ldGVyKCJPcF9Nb2R1bGVfcGFyYSIpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChwYXJhKTsKLQotCi0gICAgICAgIH0gY2F0Y2ggKERlcGxveW1lbnRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiVGhpcyBjYW4gbm90IGZhaWwgd2l0aCB0aGlzIERlcGxveW1lbnRFeGNlcHRpb24gIiArIGUpOwotICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiVGhpcyBjYW4gbm90IGZhaWwgd2l0aCB0aGlzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiAgIiArIGUpOwotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgYXhpc0ZhdWx0KSB7Ci0gICAgICAgICAgICBmYWlsKCJUaGlzIGNhbiBub3QgZmFpbCB3aXRoIHRoaXMgQXhpc0ZhdWx0ICAiICsgYXhpc0ZhdWx0KTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIlRoaXMgY2FuIG5vdCBmYWlsIHdpdGggdGhpcyBBeGlzRmF1bHQgICIgKyBlKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL01vZHVsZUVuZ2FnZVRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL01vZHVsZUVuZ2FnZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBjYjEwMS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9Nb2R1bGVFbmdhZ2VUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZW5naW5lOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQWJzdHJhY3RUZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc01vZHVsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBNb2R1bGVFbmdhZ2VUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotICAgIEF4aXNDb25maWd1cmF0aW9uIGF4aXNDb25maWc7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TW9kdWxlRW5nYWdlbWVudCgpIHRocm93cyBBeGlzRmF1bHQsCi0gICAgICAgICAgICBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgZmlsZW5hbWUgPSBBYnN0cmFjdFRlc3RDYXNlLmJhc2VkaXIgKyAiL3RhcmdldC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50IjsKLSAgICAgICAgYXhpc0NvbmZpZyA9IENvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeS5jcmVhdGVDb25maWd1cmF0aW9uQ29udGV4dEZyb21GaWxlU3lzdGVtKGZpbGVuYW1lLCBmaWxlbmFtZSArICIvYXhpczIueG1sIikKLSAgICAgICAgICAgICAgICAuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKTsKLSAgICAgICAgQXhpc01vZHVsZSBtb2R1bGUgPSBheGlzQ29uZmlnLmdldE1vZHVsZSgibW9kdWxlMSIpOwotICAgICAgICBhc3NlcnROb3ROdWxsKG1vZHVsZSk7Ci0gICAgICAgIGF4aXNDb25maWcuZW5nYWdlTW9kdWxlKCJtb2R1bGUxIik7Ci0gICAgICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2UgPSBheGlzQ29uZmlnLmdldFNlcnZpY2UoInNlcnZpY2UyIik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZSk7Ci0gICAgICAgIEF4aXNPcGVyYXRpb24gbW9kdWxlT3BlcmF0aW9uID0gc2VydmljZS5nZXRPcGVyYXRpb24oCi0gICAgICAgICAgICAgICAgbmV3IFFOYW1lKCJjcmVhdFNlcSIpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChtb2R1bGVPcGVyYXRpb24pOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvUGFyYW1ldGVyQWRkVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvUGFyYW1ldGVyQWRkVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWUwNmZlLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL1BhcmFtZXRlckFkZFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZW5naW5lOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc01vZHVsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkluT3V0QXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlBhcmFtZXRlcjsKLQotLyoqCi0gKiBUbyBjaGNlayBsb2NrZWQgaXMgd29ya2luZyBjb3JyY2V0bHkKLSAqLwotCi1wdWJsaWMgY2xhc3MgUGFyYW1ldGVyQWRkVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHByaXZhdGUgQXhpc0NvbmZpZ3VyYXRpb24gcmVnID0gbmV3IEF4aXNDb25maWd1cmF0aW9uKCk7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkUGFyYW1ldGVyU2VydmljZUxvY2tlZEF0QXhpc0NvbmZpZygpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFBhcmFtZXRlciBwYXJhID0gbmV3IFBhcmFtZXRlcigpOwotICAgICAgICAgICAgcGFyYS5zZXRWYWx1ZShudWxsKTsKLSAgICAgICAgICAgIHBhcmEuc2V0TmFtZSgiUEFSQV9OQU1FIik7Ci0gICAgICAgICAgICBwYXJhLnNldExvY2tlZCh0cnVlKTsKLSAgICAgICAgICAgIHJlZy5hZGRQYXJhbWV0ZXIocGFyYSk7Ci0KLSAgICAgICAgICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgQXhpc1NlcnZpY2UoIlNlcnZpY2UxIik7Ci0gICAgICAgICAgICByZWcuYWRkU2VydmljZShzZXJ2aWNlKTsKLSAgICAgICAgICAgIHNlcnZpY2UuYWRkUGFyYW1ldGVyKHBhcmEpOwotICAgICAgICAgICAgZmFpbCgiVGhpcyBzaG91bGQgZmFpbHMgd2l0aCBQYXJtdGVyIGlzIGxvY2tlZCBjYW4gbm90IG92ZXJpZGUiKTsKLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGF4aXNGYXVsdCkgewotCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkUGFyYW1ldGVyTW9kdWxlTG9ja2VkQXRBeGlzQ29uZmlnKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgUGFyYW1ldGVyIHBhcmEgPSBuZXcgUGFyYW1ldGVyKCk7Ci0gICAgICAgICAgICBwYXJhLnNldFZhbHVlKG51bGwpOwotICAgICAgICAgICAgcGFyYS5zZXROYW1lKCJQQVJBX05BTUUiKTsKLSAgICAgICAgICAgIHBhcmEuc2V0TG9ja2VkKHRydWUpOwotICAgICAgICAgICAgcmVnLmFkZFBhcmFtZXRlcihwYXJhKTsKLSAgICAgICAgICAgIEF4aXNNb2R1bGUgbW9kdWxlID0gbmV3IEF4aXNNb2R1bGUoIlNlcnZpY2UxIik7Ci0gICAgICAgICAgICBtb2R1bGUuc2V0UGFyZW50KHJlZyk7Ci0gICAgICAgICAgICBtb2R1bGUuYWRkUGFyYW1ldGVyKHBhcmEpOwotICAgICAgICAgICAgZmFpbCgiVGhpcyBzaG91bGQgZmFpbHMgd2l0aCBQYXJtdGVyIGlzIGxvY2tlZCBjYW4gbm90IG92ZXJpZGUiKTsKLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGF4aXNGYXVsdCkgewotCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkUGFyYW1ldGVyT3BlcmF0aW9ubG9ja2VkQnlBeGlzQ29uZmlnKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgUGFyYW1ldGVyIHBhcmEgPSBuZXcgUGFyYW1ldGVyKCk7Ci0gICAgICAgICAgICBwYXJhLnNldFZhbHVlKG51bGwpOwotICAgICAgICAgICAgcGFyYS5zZXROYW1lKCJQQVJBX05BTUUiKTsKLSAgICAgICAgICAgIHBhcmEuc2V0TG9ja2VkKHRydWUpOwotICAgICAgICAgICAgcmVnLmFkZFBhcmFtZXRlcihwYXJhKTsKLQotICAgICAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSA9IG5ldyBBeGlzU2VydmljZSgiU2VydmljZTEiKTsKLSAgICAgICAgICAgIHJlZy5hZGRTZXJ2aWNlKHNlcnZpY2UpOwotCi0gICAgICAgICAgICBBeGlzT3BlcmF0aW9uIG9wZXJ0aW9uID0gbmV3IEluT3V0QXhpc09wZXJhdGlvbigpOwotICAgICAgICAgICAgb3BlcnRpb24uc2V0UGFyZW50KHNlcnZpY2UpOwotICAgICAgICAgICAgb3BlcnRpb24uYWRkUGFyYW1ldGVyKHBhcmEpOwotICAgICAgICAgICAgZmFpbCgiVGhpcyBzaG91bGQgZmFpbHMgd2l0aCBQYXJtdGVyIGlzIGxvY2tlZCBjYW4gbm90IG92ZXJpZGUiKTsKLQotCi0gICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBheGlzRmF1bHQpIHsKLQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEFkZFBhcmFtZXRlck9wZXJhdGlvbkxvY2tlYnlTZXJ2aWNlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgUGFyYW1ldGVyIHBhcmEgPSBuZXcgUGFyYW1ldGVyKCk7Ci0gICAgICAgICAgICBwYXJhLnNldFZhbHVlKG51bGwpOwotICAgICAgICAgICAgcGFyYS5zZXROYW1lKCJQQVJBX05BTUUiKTsKLSAgICAgICAgICAgIHBhcmEuc2V0TG9ja2VkKHRydWUpOwotCi0gICAgICAgICAgICBBeGlzU2VydmljZSBzZXJ2aWNlID0gbmV3IEF4aXNTZXJ2aWNlKCJTZXJ2aWNlMSIpOwotICAgICAgICAgICAgcmVnLmFkZFNlcnZpY2Uoc2VydmljZSk7Ci0gICAgICAgICAgICBzZXJ2aWNlLmFkZFBhcmFtZXRlcihwYXJhKTsKLQotICAgICAgICAgICAgQXhpc09wZXJhdGlvbiBvcGVydGlvbiA9IG5ldyBJbk91dEF4aXNPcGVyYXRpb24oKTsKLSAgICAgICAgICAgIG9wZXJ0aW9uLnNldFBhcmVudChzZXJ2aWNlKTsKLSAgICAgICAgICAgIG9wZXJ0aW9uLmFkZFBhcmFtZXRlcihwYXJhKTsKLSAgICAgICAgICAgIGZhaWwoIlRoaXMgc2hvdWxkIGZhaWxzIHdpdGggUGFybXRlciBpcyBsb2NrZWQgY2FuIG5vdCBvdmVyaWRlIik7Ci0gICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBheGlzRmF1bHQpIHsKLQotICAgICAgICB9Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL1BhcmFtZXRlckxvY2tlZC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvUGFyYW1ldGVyTG9ja2VkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyODNhYjIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvUGFyYW1ldGVyTG9ja2VkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC5EZXBsb3ltZW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC5Nb2R1bGVCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC5TZXJ2aWNlQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNNb2R1bGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLXB1YmxpYyBjbGFzcyBQYXJhbWV0ZXJMb2NrZWQgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBBeGlzQ29uZmlndXJhdGlvbiBhcjsKLSAgICBTdHJpbmcgcmVwbyA9ICIuL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvUGFyYUxvY2tlZFJlcG8iOwotCi0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhciA9IENvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeQotICAgICAgICAgICAgICAgIC5jcmVhdGVDb25maWd1cmF0aW9uQ29udGV4dEZyb21GaWxlU3lzdGVtKG51bGwsIHJlcG8gKyAiL2F4aXMyLnhtbCIpCi0gICAgICAgICAgICAgICAgLmdldEF4aXNDb25maWd1cmF0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE92ZXJpZGVfTm9uX2xvY2tlZF9QYXJhX1NlcnZpY2UoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGFyKTsKLSAgICAgICAgICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgQXhpc1NlcnZpY2UoKTsKLSAgICAgICAgICAgIGFyLmFkZFNlcnZpY2Uoc2VydmljZSk7Ci0gICAgICAgICAgICBJbnB1dFN0cmVhbSBpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0ocmVwbyArICIvc2VydmljZV9vdmVyaWRlX25vbl9sb2NrZWRfcGFyYS54bWwiKTsKLSAgICAgICAgICAgIFNlcnZpY2VCdWlsZGVyIHNidWlsZGVyID0gbmV3IFNlcnZpY2VCdWlsZGVyKGluLCBudWxsLCBzZXJ2aWNlKTsKLSAgICAgICAgICAgIHNidWlsZGVyLnBvcHVsYXRlU2VydmljZShzYnVpbGRlci5idWlsZE9NKCkpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChzYnVpbGRlcik7Ci0KLSAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIlRoaXMgY2FuIG5vdCBmYWlsIHdpdGggdGhpcyBGaWxlTm90Rm91bmRFeGNlcHRpb24gIiArIGUpOwotICAgICAgICB9IGNhdGNoIChEZXBsb3ltZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIlRoaXMgY2FuIG5vdCBmYWlsIHdpdGggdGhpcyBEZXBsb3ltZW50RXhjZXB0aW9uICIgKyBlKTsKLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGF4aXNGYXVsdCkgewotICAgICAgICAgICAgZmFpbCgiVGhpcyBjYW4gbm90IGZhaWwgd2l0aCB0aGlzIEF4aXNGYXVsdCAiICsgYXhpc0ZhdWx0KTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIlRoaXMgY2FuIG5vdCBmYWlsIHdpdGggdGhpcyBBeGlzRmF1bHQgIiArIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE92ZXJpZGVfbG9ja2VkX1BhcmFfU2VydmljZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYXIpOwotICAgICAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSA9IG5ldyBBeGlzU2VydmljZSgpOwotICAgICAgICAgICAgYXIuYWRkU2VydmljZShzZXJ2aWNlKTsKLSAgICAgICAgICAgIElucHV0U3RyZWFtIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShyZXBvICsgIi9zZXJ2aWNlX292ZXJpZGVfbG9ja2VkX3BhcmEueG1sIik7Ci0gICAgICAgICAgICBTZXJ2aWNlQnVpbGRlciBzYnVpbGRlciA9IG5ldyBTZXJ2aWNlQnVpbGRlcihpbiwgbnVsbCwgc2VydmljZSk7Ci0gICAgICAgICAgICBzYnVpbGRlci5wb3B1bGF0ZVNlcnZpY2Uoc2J1aWxkZXIuYnVpbGRPTSgpKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoc2J1aWxkZXIpOwotICAgICAgICAgICAgZmFpbCgiUGFybXRlciBpcyBsb2NrZWQgY2FuIG5vdCBvdmVyaWRlIik7Ci0gICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJUaGlzIGNhbiBub3QgZmFpbCB3aXRoIHRoaXMgRmlsZU5vdEZvdW5kRXhjZXB0aW9uICIgKyBlKTsKLSAgICAgICAgfSBjYXRjaCAoRGVwbG95bWVudEV4Y2VwdGlvbiBlKSB7Ci0KLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGF4aXNGYXVsdCkgewotICAgICAgICAgICAgZmFpbCgiVGhpcyBjYW4gbm90IGZhaWwgd2l0aCB0aGlzIEF4aXNGYXVsdCAiICsgYXhpc0ZhdWx0KTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIlRoaXMgY2FuIG5vdCBmYWlsIHdpdGggdGhpcyBBeGlzRmF1bHQgIiArIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE92ZXJpZGVfbG9ja2VkX1BhcmFfT3BlcmF0aW9uKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChhcik7Ci0gICAgICAgICAgICBBeGlzU2VydmljZSBzZXJ2aWNlID0gbmV3IEF4aXNTZXJ2aWNlKCk7Ci0gICAgICAgICAgICBhci5hZGRTZXJ2aWNlKHNlcnZpY2UpOwotICAgICAgICAgICAgSW5wdXRTdHJlYW0gaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKHJlcG8gKyAiL29wX292ZXJpZGVfZ2xvYmFsX3BhcmEueG1sIik7Ci0gICAgICAgICAgICBTZXJ2aWNlQnVpbGRlciBzYnVpbGRlciA9IG5ldyBTZXJ2aWNlQnVpbGRlcihpbiwgbnVsbCwgc2VydmljZSk7Ci0gICAgICAgICAgICBzYnVpbGRlci5wb3B1bGF0ZVNlcnZpY2Uoc2J1aWxkZXIuYnVpbGRPTSgpKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoc2J1aWxkZXIpOwotICAgICAgICAgICAgZmFpbCgiUGFybXRlciBpcyBsb2NrZWQgY2FuIG5vdCBvdmVyaWRlIik7Ci0gICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJUaGlzIGNhbiBub3QgZmFpbCB3aXRoIHRoaXMgRmlsZU5vdEZvdW5kRXhjZXB0aW9uICIgKyBlKTsKLSAgICAgICAgfSBjYXRjaCAoRGVwbG95bWVudEV4Y2VwdGlvbiBlKSB7Ci0KLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGF4aXNGYXVsdCkgewotICAgICAgICAgICAgZmFpbCgiVGhpcyBjYW4gbm90IGZhaWwgd2l0aCB0aGlzIEF4aXNGYXVsdCAiICsgYXhpc0ZhdWx0KTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIlRoaXMgY2FuIG5vdCBmYWlsIHdpdGggdGhpcyBBeGlzRmF1bHQgIiArIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE92ZXJpZGVfU2VydmljZV9sb2NrZWRfUGFyYV9PcGVyYXRpb24oKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGFyKTsKLSAgICAgICAgICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgQXhpc1NlcnZpY2UoKTsKLSAgICAgICAgICAgIGFyLmFkZFNlcnZpY2Uoc2VydmljZSk7Ci0gICAgICAgICAgICBJbnB1dFN0cmVhbSBpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0ocmVwbyArICIvT3Bfb3ZlcmlkZV9TZXJ2aWNlX3BhcmEueG1sIik7Ci0gICAgICAgICAgICBTZXJ2aWNlQnVpbGRlciBzYnVpbGRlciA9IG5ldyBTZXJ2aWNlQnVpbGRlcihpbiwgbnVsbCwgc2VydmljZSk7Ci0gICAgICAgICAgICBzYnVpbGRlci5wb3B1bGF0ZVNlcnZpY2Uoc2J1aWxkZXIuYnVpbGRPTSgpKTsKLSAgICAgICAgICAgIGZhaWwoIlBhcm10ZXIgaXMgbG9ja2VkIGNhbiBub3Qgb3ZlcmlkZSIpOwotICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiVGhpcyBjYW4gbm90IGZhaWwgd2l0aCB0aGlzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiAiICsgZSk7Ci0gICAgICAgIH0gY2F0Y2ggKERlcGxveW1lbnRFeGNlcHRpb24gZSkgewotCi0gICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBheGlzRmF1bHQpIHsKLSAgICAgICAgICAgIGZhaWwoIlRoaXMgY2FuIG5vdCBmYWlsIHdpdGggdGhpcyBBeGlzRmF1bHQgIiArIGF4aXNGYXVsdCk7Ci0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJUaGlzIGNhbiBub3QgZmFpbCB3aXRoIHRoaXMgQXhpc0ZhdWx0ICIgKyBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RPdmVyaWRlX05vbl9sb2NrZWRfUGFyYV9Nb2R1bGUoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGFyKTsKLSAgICAgICAgICAgIEF4aXNNb2R1bGUgbW9kdWxlID0gbmV3IEF4aXNNb2R1bGUoKTsKLSAgICAgICAgICAgIG1vZHVsZS5zZXRQYXJlbnQoYXIpOwotICAgICAgICAgICAgSW5wdXRTdHJlYW0gaW4gPQotICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZUlucHV0U3RyZWFtKHJlcG8gKyAiL21vZHVsZV9vdmVyaWRlX2dsb2JhbF9ub25fbG9ja2VkX3BhcmEueG1sIik7Ci0gICAgICAgICAgICBNb2R1bGVCdWlsZGVyIG1idWlsZGVyID0gbmV3IE1vZHVsZUJ1aWxkZXIoaW4sIG1vZHVsZSwgYXIpOwotICAgICAgICAgICAgbWJ1aWxkZXIucG9wdWxhdGVNb2R1bGUoKTsKLSAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIlRoaXMgY2FuIG5vdCBmYWlsIHdpdGggdGhpcyBGaWxlTm90Rm91bmRFeGNlcHRpb24gIiArIGUpOwotICAgICAgICB9IGNhdGNoIChEZXBsb3ltZW50RXhjZXB0aW9uIGUpIHsKLQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE92ZXJpZGVfbG9ja2VkX1BhcmFfTW9kdWxlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChhcik7Ci0gICAgICAgICAgICBBeGlzTW9kdWxlIG1vZHVsZSA9IG5ldyBBeGlzTW9kdWxlKCk7Ci0gICAgICAgICAgICBtb2R1bGUuc2V0UGFyZW50KGFyKTsKLSAgICAgICAgICAgIElucHV0U3RyZWFtIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShyZXBvICsgIi9tb2R1bGVfb3ZlcmlkZV9sb2NrZWRfcGFyYS54bWwiKTsKLSAgICAgICAgICAgIE1vZHVsZUJ1aWxkZXIgbWJ1aWxkZXIgPSBuZXcgTW9kdWxlQnVpbGRlcihpbiwgbW9kdWxlLCBhcik7Ci0gICAgICAgICAgICBtYnVpbGRlci5wb3B1bGF0ZU1vZHVsZSgpOwotICAgICAgICAgICAgZmFpbCgiUGFybXRlciBpcyBsb2NrZWQgY2FuIG5vdCBvdmVyaWRlIik7Ci0gICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJUaGlzIGNhbiBub3QgZmFpbCB3aXRoIHRoaXMgRmlsZU5vdEZvdW5kRXhjZXB0aW9uICIgKyBlKTsKLSAgICAgICAgfSBjYXRjaCAoRGVwbG95bWVudEV4Y2VwdGlvbiBlKSB7Ci0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL1NPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXJUZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9TT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjY1YzQ5Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL1NPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uSW5Pbmx5QXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXI7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1wdWJsaWMgY2xhc3MgU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmluZE9wZXJhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBjYyA9IG5ldyBDb25maWd1cmF0aW9uQ29udGV4dChuZXcgQXhpc0NvbmZpZ3VyYXRpb24oKSk7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0ID0gY2MuY3JlYXRlTWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgQXhpc1NlcnZpY2UgYXMgPSBuZXcgQXhpc1NlcnZpY2UoIlNlcnZpY2UxIik7Ci0gICAgICAgIG1lc3NhZ2VDb250ZXh0LnNldEF4aXNTZXJ2aWNlKGFzKTsKLQotICAgICAgICBBeGlzT3BlcmF0aW9uIG9wZXJhdGlvbjEgPSBuZXcgSW5Pbmx5QXhpc09wZXJhdGlvbihuZXcgUU5hbWUoIm9wZXJhdGlvbjEiKSk7Ci0gICAgICAgIG9wZXJhdGlvbjEuc2V0U29hcEFjdGlvbigidXJuOm9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMudGVzdDpvcGVyYXRpb24xIik7Ci0KLSAgICAgICAgQXhpc09wZXJhdGlvbiBvcGVyYXRpb24yID0gbmV3IEluT25seUF4aXNPcGVyYXRpb24obmV3IFFOYW1lKCJvcGVyYXRpb24yIikpOwotICAgICAgICBvcGVyYXRpb24yLnNldFNvYXBBY3Rpb24oInVybjpvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLnRlc3Q6b3BlcmF0aW9uMiIpOwotCi0gICAgICAgIGFzLmFkZE9wZXJhdGlvbihvcGVyYXRpb24xKTsKLSAgICAgICAgYXMuYWRkT3BlcmF0aW9uKG9wZXJhdGlvbjIpOwotCi0gICAgICAgIG1lc3NhZ2VDb250ZXh0LnNldFNvYXBBY3Rpb24oInVybjpvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLnRlc3Q6b3BlcmF0aW9uMSIpOwotCi0gICAgICAgIFNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIgc29hcEFjdGlvbkRpc3BhdGNoZXIgPSBuZXcgU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlcigpOwotICAgICAgICBzb2FwQWN0aW9uRGlzcGF0Y2hlci5pbnZva2UobWVzc2FnZUNvbnRleHQpOwotICAgICAgICBhc3NlcnRFcXVhbHMob3BlcmF0aW9uMSwgbWVzc2FnZUNvbnRleHQuZ2V0QXhpc09wZXJhdGlvbigpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHlBY3Rpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gV2Ugc2hvdWxkbid0IGJlIGFibGUgdG8gcm91dGUgb24gYW4gZW10cHktc3RyaW5nIGFjdGlvbi4KLSAgICAgICAgTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQgPSBuZXcgTWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgQXhpc1NlcnZpY2UgYXMgPSBuZXcgQXhpc1NlcnZpY2UoIlNlcnZpY2UxIik7Ci0gICAgICAgIG1lc3NhZ2VDb250ZXh0LnNldEF4aXNTZXJ2aWNlKGFzKTsKLQotICAgICAgICBBeGlzT3BlcmF0aW9uIG9wZXJhdGlvbjEgPSBuZXcgSW5Pbmx5QXhpc09wZXJhdGlvbihuZXcgUU5hbWUoIm9wZXJhdGlvbjEiKSk7Ci0gICAgICAgIG9wZXJhdGlvbjEuc2V0U29hcEFjdGlvbigiIik7Ci0KLSAgICAgICAgQXhpc09wZXJhdGlvbiBvcGVyYXRpb24yID0gbmV3IEluT25seUF4aXNPcGVyYXRpb24obmV3IFFOYW1lKCJvcGVyYXRpb24yIikpOwotICAgICAgICBvcGVyYXRpb24yLnNldFNvYXBBY3Rpb24oIiIpOwotCi0gICAgICAgIGFzLmFkZE9wZXJhdGlvbihvcGVyYXRpb24xKTsKLSAgICAgICAgYXMuYWRkT3BlcmF0aW9uKG9wZXJhdGlvbjIpOwotCi0gICAgICAgIG1lc3NhZ2VDb250ZXh0LnNldFNvYXBBY3Rpb24oIiIpOwotCi0gICAgICAgIFNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIgc29hcEFjdGlvbkRpc3BhdGNoZXIgPSBuZXcgU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlcigpOwotICAgICAgICBzb2FwQWN0aW9uRGlzcGF0Y2hlci5pbnZva2UobWVzc2FnZUNvbnRleHQpOwotICAgICAgICBhc3NlcnROdWxsKG1lc3NhZ2VDb250ZXh0LmdldEF4aXNPcGVyYXRpb24oKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE51bGxBY3Rpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gV2Ugc2hvdWxkbid0IGJlIGFibGUgdG8gcm91dGUgb24gYSBudWxsIGFjdGlvbi4KLSAgICAgICAgTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQgPSBuZXcgTWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgQXhpc1NlcnZpY2UgYXMgPSBuZXcgQXhpc1NlcnZpY2UoIlNlcnZpY2UxIik7Ci0gICAgICAgIG1lc3NhZ2VDb250ZXh0LnNldEF4aXNTZXJ2aWNlKGFzKTsKLQotICAgICAgICBBeGlzT3BlcmF0aW9uIG9wZXJhdGlvbjEgPSBuZXcgSW5Pbmx5QXhpc09wZXJhdGlvbihuZXcgUU5hbWUoIm9wZXJhdGlvbjEiKSk7Ci0gICAgICAgIG9wZXJhdGlvbjEuc2V0U29hcEFjdGlvbihudWxsKTsKLQotICAgICAgICBBeGlzT3BlcmF0aW9uIG9wZXJhdGlvbjIgPSBuZXcgSW5Pbmx5QXhpc09wZXJhdGlvbihuZXcgUU5hbWUoIm9wZXJhdGlvbjIiKSk7Ci0gICAgICAgIG9wZXJhdGlvbjIuc2V0U29hcEFjdGlvbihudWxsKTsKLQotICAgICAgICBhcy5hZGRPcGVyYXRpb24ob3BlcmF0aW9uMSk7Ci0gICAgICAgIGFzLmFkZE9wZXJhdGlvbihvcGVyYXRpb24yKTsKLQotICAgICAgICBtZXNzYWdlQ29udGV4dC5zZXRTb2FwQWN0aW9uKG51bGwpOwotCi0gICAgICAgIFNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIgc29hcEFjdGlvbkRpc3BhdGNoZXIgPSBuZXcgU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlcigpOwotICAgICAgICBzb2FwQWN0aW9uRGlzcGF0Y2hlci5pbnZva2UobWVzc2FnZUNvbnRleHQpOwotICAgICAgICBhc3NlcnROdWxsKG1lc3NhZ2VDb250ZXh0LmdldEF4aXNPcGVyYXRpb24oKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdER1cGxpY2F0ZUFjdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBXZSBzaG91bGRuJ3QgYmUgYWJsZSB0byByb3V0ZSBvbiBhIFNPQVBBY3Rpb24gdGhhdCBpcyBhIGR1cGxpY2F0ZS4KLSAgICAgICAgTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQgPSBuZXcgTWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgQXhpc1NlcnZpY2UgYXMgPSBuZXcgQXhpc1NlcnZpY2UoIlNlcnZpY2UxIik7Ci0gICAgICAgIG1lc3NhZ2VDb250ZXh0LnNldEF4aXNTZXJ2aWNlKGFzKTsKLQotICAgICAgICBBeGlzT3BlcmF0aW9uIG9wZXJhdGlvbjEgPSBuZXcgSW5Pbmx5QXhpc09wZXJhdGlvbihuZXcgUU5hbWUoIm9wZXJhdGlvbjEiKSk7Ci0gICAgICAgIG9wZXJhdGlvbjEuc2V0U29hcEFjdGlvbigidXJuOm9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMudGVzdDpvcGVyYXRpb24xIik7Ci0KLSAgICAgICAgQXhpc09wZXJhdGlvbiBvcGVyYXRpb24yID0gbmV3IEluT25seUF4aXNPcGVyYXRpb24obmV3IFFOYW1lKCJvcGVyYXRpb24yIikpOwotICAgICAgICBvcGVyYXRpb24yLnNldFNvYXBBY3Rpb24oInVybjpvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLnRlc3Q6b3BlcmF0aW9uMiIpOwotCi0gICAgICAgIGFzLmFkZE9wZXJhdGlvbihvcGVyYXRpb24xKTsKLSAgICAgICAgYXMuYWRkT3BlcmF0aW9uKG9wZXJhdGlvbjIpOwotCi0gICAgICAgIG1lc3NhZ2VDb250ZXh0LnNldFNvYXBBY3Rpb24oInVybjpvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLnRlc3Q6b3BlcmF0aW9uMiIpOwotCi0gICAgICAgIFNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIgc29hcEFjdGlvbkRpc3BhdGNoZXIgPSBuZXcgU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlcigpOwotICAgICAgICBzb2FwQWN0aW9uRGlzcGF0Y2hlci5pbnZva2UobWVzc2FnZUNvbnRleHQpOwotICAgICAgICBhc3NlcnRFcXVhbHMob3BlcmF0aW9uMiwgbWVzc2FnZUNvbnRleHQuZ2V0QXhpc09wZXJhdGlvbigpKTsKLQotICAgICAgICAvLyBOb3cgYWRkIGEgZHVwbGljYXRlIGFjdGlvbiwgdGhlbiB2YWxpZGF0ZSB3ZSBjYW4ndCByb3V0ZSBvbiBpdCBhbnltb3JlLgotICAgICAgICBBeGlzT3BlcmF0aW9uIG9wZXJhdGlvbjMgPSBuZXcgSW5Pbmx5QXhpc09wZXJhdGlvbihuZXcgUU5hbWUoIm9wZXJhdGlvbjMiKSk7Ci0gICAgICAgIC8vIE5vdGUgdGhhdCB0aGUgU09BUEFjdGlvbiBpcyBpbnRlbnRpb25hbGx5IGR1cGxpY2F0ZWQgd2l0aCBvcGVyYXRpb24gMiBhYm92ZS4KLSAgICAgICAgb3BlcmF0aW9uMy5zZXRTb2FwQWN0aW9uKCJ1cm46b3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy50ZXN0Om9wZXJhdGlvbjIiKTsKLSAgICAgICAgYXMuYWRkT3BlcmF0aW9uKG9wZXJhdGlvbjMpOwotCi0gICAgICAgIG1lc3NhZ2VDb250ZXh0ID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIG1lc3NhZ2VDb250ZXh0LnNldEF4aXNTZXJ2aWNlKGFzKTsKLSAgICAgICAgbWVzc2FnZUNvbnRleHQuc2V0U29hcEFjdGlvbigidXJuOm9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMudGVzdDpvcGVyYXRpb24yIik7Ci0gICAgICAgIHNvYXBBY3Rpb25EaXNwYXRjaGVyLmludm9rZShtZXNzYWdlQ29udGV4dCk7Ci0gICAgICAgIGFzc2VydE51bGwobWVzc2FnZUNvbnRleHQuZ2V0QXhpc09wZXJhdGlvbigpKTsKLQotICAgICAgICAvLyBOb3cgdmVyaWZ5IHRoYXQgYWRkaW5nIGFub3RoZXIgb3BlcmF0aW9uIHdpdGggdGhlIGR1cGxpY2F0ZSBTT0FQQWN0aW9uIAotICAgICAgICAvLyBkb2Vzbid0IHNvbWVob3cgZ2V0IGl0IGFkZGVkIGJhY2sgaW50byB0aGUgdmFsaWQgYWxpYXMgbWFwCi0gICAgICAgIEF4aXNPcGVyYXRpb24gb3BlcmF0aW9uNCA9IG5ldyBJbk9ubHlBeGlzT3BlcmF0aW9uKG5ldyBRTmFtZSgib3BlcmF0aW9uNCIpKTsKLSAgICAgICAgLy8gTm90ZSB0aGF0IHRoZSBTT0FQQWN0aW9uIGlzIGludGVudGlvbmFsbHkgZHVwbGljYXRlZCB3aXRoIG9wZXJhdGlvbiAyIGFib3ZlLgotICAgICAgICBvcGVyYXRpb240LnNldFNvYXBBY3Rpb24oInVybjpvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLnRlc3Q6b3BlcmF0aW9uMiIpOwotICAgICAgICBhcy5hZGRPcGVyYXRpb24ob3BlcmF0aW9uNCk7Ci0KLSAgICAgICAgbWVzc2FnZUNvbnRleHQgPSBuZXcgTWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgbWVzc2FnZUNvbnRleHQuc2V0QXhpc1NlcnZpY2UoYXMpOwotICAgICAgICBtZXNzYWdlQ29udGV4dC5zZXRTb2FwQWN0aW9uKCJ1cm46b3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy50ZXN0Om9wZXJhdGlvbjIiKTsKLSAgICAgICAgc29hcEFjdGlvbkRpc3BhdGNoZXIuaW52b2tlKG1lc3NhZ2VDb250ZXh0KTsKLSAgICAgICAgYXNzZXJ0TnVsbChtZXNzYWdlQ29udGV4dC5nZXRBeGlzT3BlcmF0aW9uKCkpOwotCi0gICAgICAgIC8vIEFuZCBmaW5hbGx5LCB2ZXJpZnkgdGhhdCBhZnRlciBhbGwgdGhlIGFib3ZlLCB3ZSBjYW4gc3RpbGwgcm91dGUgb24gYSB2YWxpZAotICAgICAgICAvLyBTT0FQQWN0aW9uIGZvciBvcGVyYXRpb24gMSAod2hvc2UgU09BUEFjdGlvbiB3YXMgbmV2ZXIgZHVwbGljYXRlZCwgc28gc2hvdWxkIHN0aWxsIGJlCi0gICAgICAgIC8vIHZhbGlkKQotICAgICAgICBtZXNzYWdlQ29udGV4dCA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBtZXNzYWdlQ29udGV4dC5zZXRBeGlzU2VydmljZShhcyk7Ci0gICAgICAgIG1lc3NhZ2VDb250ZXh0LnNldFNvYXBBY3Rpb24oInVybjpvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLnRlc3Q6b3BlcmF0aW9uMSIpOwotICAgICAgICBzb2FwQWN0aW9uRGlzcGF0Y2hlci5pbnZva2UobWVzc2FnZUNvbnRleHQpOwotICAgICAgICBhc3NlcnRFcXVhbHMob3BlcmF0aW9uMSwgbWVzc2FnZUNvbnRleHQuZ2V0QXhpc09wZXJhdGlvbigpKTsKLQotCi0gICAgfQotICAgICAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0QWN0aW9uVnNPcE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gU2hvdWxkIHJvdXRlIGJhc2VkIG9uIGFjdGlvbiBiZWZvcmUgdHJ5aW5nIHRvIHJvdXRlIGJhc2VkIG9uIG9wZXJhdGlvbiBuYW1lCi0gICAgICAgIC8vIC0gbWV0aG9kIG9wZXJhdGlvbjEsIGFjdGlvbiA9IG9wZXJhdGlvbjIKLSAgICAgICAgLy8gLSBtZXRob2Qgb3BlcmF0aW9uMiwgYWN0aW9uID0gb3BlcmF0aW9uMQotICAgICAgICAvLyBJbmNvbWluZyBhY3Rpb24gc2hvdWxkIHJvdXRlIHRvOgotICAgICAgICAvLyAtIGFjdGlvbiA9IG9wZXJhdGlvbjIsIHJvdXRlIHRvIG9wZXJhdGlvbjEKLSAgICAgICAgLy8gLSBhY3Rpb24gPSBvcGVyYXRpb24xLCByb3V0ZSB0byBvcGVyYXRpb24yCi0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0ID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIEF4aXNTZXJ2aWNlIGFzID0gbmV3IEF4aXNTZXJ2aWNlKCJTZXJ2aWNlMSIpOwotICAgICAgICBtZXNzYWdlQ29udGV4dC5zZXRBeGlzU2VydmljZShhcyk7Ci0gICAgICAgIAotICAgICAgICBBeGlzT3BlcmF0aW9uIG9wZXJhdGlvbjEgPSBuZXcgSW5Pbmx5QXhpc09wZXJhdGlvbihuZXcgUU5hbWUoIm9wZXJhdGlvbjEiKSk7Ci0gICAgICAgIG9wZXJhdGlvbjEuc2V0U29hcEFjdGlvbigib3BlcmF0aW9uMiIpOwotICAgICAgICAKLSAgICAgICAgQXhpc09wZXJhdGlvbiBvcGVyYXRpb24yID0gbmV3IEluT25seUF4aXNPcGVyYXRpb24obmV3IFFOYW1lKCJvcGVyYXRpb24yIikpOwotICAgICAgICBvcGVyYXRpb24yLnNldFNvYXBBY3Rpb24oIm9wZXJhdGlvbjEiKTsKLSAgICAgICAgCi0gICAgICAgIGFzLmFkZE9wZXJhdGlvbihvcGVyYXRpb24xKTsKLSAgICAgICAgYXMuYWRkT3BlcmF0aW9uKG9wZXJhdGlvbjIpOwotICAgICAgICAKLSAgICAgICAgbWVzc2FnZUNvbnRleHQuc2V0U29hcEFjdGlvbigib3BlcmF0aW9uMiIpOwotICAgICAgICAKLSAgICAgICAgU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciBzb2FwQWN0aW9uRGlzcGF0Y2hlciA9IG5ldyBTT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyKCk7Ci0gICAgICAgIHNvYXBBY3Rpb25EaXNwYXRjaGVyLmludm9rZShtZXNzYWdlQ29udGV4dCk7Ci0gICAgICAgIC8vIFNpbmNlIEF4aXMyIHVzZXMgYSBzaW5nbGUgYWxpYXMgdGFibGUgZm9yIFNPQVBBY3Rpb25zIGFuZCBvcGVyYXRpb24gbmFtZXMgKGFuZAotICAgICAgICAvLyBXUy1BZGRyZXNzaW5nIGFjdGlvbnMgYW5kIGlucHV0IG1lc3NhZ2UgbmFtZXMpLCBoYXZpbmcgYW4gYWN0aW9uIHdpdGggdGhlIHNhbWUgbmFtZQotICAgICAgICAvLyBhcyBhIGRpZmZlcmVudCBvcGVyYXRpb24gd2lsbCBjYXVzZSB0aGF0IGFsaWFzIHRvIGJlIHVudXNhYmxlIGZvciByb3V0aW5nLgotLy8gICAgICAgIGFzc2VydEVxdWFscyhvcGVyYXRpb24xLCBtZXNzYWdlQ29udGV4dC5nZXRBeGlzT3BlcmF0aW9uKCkpOwotICAgICAgICBhc3NlcnROdWxsKG1lc3NhZ2VDb250ZXh0LmdldEF4aXNPcGVyYXRpb24oKSk7Ci0gICAgICAgIAotICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIG90aGVyIGFjdGlvbiB3b3JrcyBhbHNvCi0gICAgICAgIG1lc3NhZ2VDb250ZXh0ID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIG1lc3NhZ2VDb250ZXh0LnNldEF4aXNTZXJ2aWNlKGFzKTsKLSAgICAgICAgbWVzc2FnZUNvbnRleHQuc2V0U29hcEFjdGlvbigib3BlcmF0aW9uMSIpOwotICAgICAgICBzb2FwQWN0aW9uRGlzcGF0Y2hlciA9IG5ldyBTT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyKCk7Ci0gICAgICAgIHNvYXBBY3Rpb25EaXNwYXRjaGVyLmludm9rZShtZXNzYWdlQ29udGV4dCk7Ci0vLyAgICAgICAgYXNzZXJ0RXF1YWxzKG9wZXJhdGlvbjIsIG1lc3NhZ2VDb250ZXh0LmdldEF4aXNPcGVyYXRpb24oKSk7Ci0gICAgICAgIGFzc2VydE51bGwobWVzc2FnZUNvbnRleHQuZ2V0QXhpc09wZXJhdGlvbigpKTsKLSAgICAgICAgCi0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkQWN0aW9uVnNPcE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gU2hvdWxkbid0IHJvdXRlIG9uIGFjdGlvbiBiZWNhdXNlIGl0IGlzIGludmFsaWQgKHVzZWQgPiAxIHRpbWUpIGV2ZW4gdGhvdWdoIGl0IG1hdGNoZXMKLSAgICAgICAgLy8gYW4gb3BlcmF0aW9uIG5hbWUKLSAgICAgICAgLy8gLSBtZXRob2Qgb3BlcmF0aW9uMSwgYWN0aW9uID0gb3BlcmF0aW9uMgotICAgICAgICAvLyAtIG1ldGhvZCBvcGVyYXRpb24yLCBhY3Rpb24gPSBvcGVyYXRpb24yCi0gICAgICAgIC8vIEluY29taW5nIGFjdGlvbiBzaG91bGQgcm91dGUgdG86Ci0gICAgICAgIC8vIC0gYWN0aW9uID0gb3BlcmF0aW9uMiwgbnVsbAotICAgICAgICAvLyAtIGFjdGlvbiA9IG9wZXJhdGlvbjEsIHJvdXRlIHRvIG9wZXJhdGlvbjEgKGJhc2VkIG9uIG1ldGhvZCBuYW1lIG1hdGNoIHRvIGFjdGlvbikKLSAgICAgICAgLy8gCi0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0ID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIEF4aXNTZXJ2aWNlIGFzID0gbmV3IEF4aXNTZXJ2aWNlKCJTZXJ2aWNlMSIpOwotICAgICAgICBtZXNzYWdlQ29udGV4dC5zZXRBeGlzU2VydmljZShhcyk7Ci0gICAgICAgIAotICAgICAgICBBeGlzT3BlcmF0aW9uIG9wZXJhdGlvbjEgPSBuZXcgSW5Pbmx5QXhpc09wZXJhdGlvbihuZXcgUU5hbWUoIm9wZXJhdGlvbjEiKSk7Ci0gICAgICAgIG9wZXJhdGlvbjEuc2V0U29hcEFjdGlvbigib3BlcmF0aW9uMiIpOwotICAgICAgICAKLSAgICAgICAgQXhpc09wZXJhdGlvbiBvcGVyYXRpb24yID0gbmV3IEluT25seUF4aXNPcGVyYXRpb24obmV3IFFOYW1lKCJvcGVyYXRpb24yIikpOwotICAgICAgICBvcGVyYXRpb24yLnNldFNvYXBBY3Rpb24oIm9wZXJhdGlvbjIiKTsKLSAgICAgICAgCi0gICAgICAgIGFzLmFkZE9wZXJhdGlvbihvcGVyYXRpb24xKTsKLSAgICAgICAgYXMuYWRkT3BlcmF0aW9uKG9wZXJhdGlvbjIpOwotICAgICAgICAKLSAgICAgICAgbWVzc2FnZUNvbnRleHQuc2V0U29hcEFjdGlvbigib3BlcmF0aW9uMiIpOwotICAgICAgICAKLSAgICAgICAgU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciBzb2FwQWN0aW9uRGlzcGF0Y2hlciA9IG5ldyBTT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyKCk7Ci0gICAgICAgIHNvYXBBY3Rpb25EaXNwYXRjaGVyLmludm9rZShtZXNzYWdlQ29udGV4dCk7Ci0gICAgICAgIC8vIFZlcmlmeSB0aGF0IHdlIGNhbid0IHJvdXRlIG9uIHRoZSBTT0FQQWN0aW9uIGJlY2F1c2UgaXQgaGFzIGJlZW4gc3BlY2lmaWVkID4gMSB0aW1lCi0gICAgICAgIGFzc2VydE51bGwobWVzc2FnZUNvbnRleHQuZ2V0QXhpc09wZXJhdGlvbigpKTsKLSAgICAgICAgCi0gICAgICAgIC8vIE5vdyB2ZXJpZnkgdGhhdCBhIFNPQVBBY3Rpb24gdGhhdCBoYXBwZW5zIHRvIG1hcCB0byBhbiBvcGVyYXRpb24gbmFtZSBjYW4gc3RpbGwgYmUgcm91dGVkCi0gICAgICAgIG1lc3NhZ2VDb250ZXh0ID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIG1lc3NhZ2VDb250ZXh0LnNldEF4aXNTZXJ2aWNlKGFzKTsKLSAgICAgICAgbWVzc2FnZUNvbnRleHQuc2V0U29hcEFjdGlvbigib3BlcmF0aW9uMSIpOwotICAgICAgICBzb2FwQWN0aW9uRGlzcGF0Y2hlciA9IG5ldyBTT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyKCk7Ci0gICAgICAgIHNvYXBBY3Rpb25EaXNwYXRjaGVyLmludm9rZShtZXNzYWdlQ29udGV4dCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhvcGVyYXRpb24xLCBtZXNzYWdlQ29udGV4dC5nZXRBeGlzT3BlcmF0aW9uKCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvaGFuZGxlcnMvSGFuZGxlcjIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvaGFuZGxlcnMvSGFuZGxlcjIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE0MzlkNi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2hhbmRsZXJzL0hhbmRsZXIyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuaGFuZGxlcnM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuSGFuZGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotcHVibGljIGNsYXNzIEhhbmRsZXIyIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyIGltcGxlbWVudHMgSGFuZGxlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEhhbmRsZXIyLmNsYXNzKTsKLSAgICBwcml2YXRlIFN0cmluZyBtZXNzYWdlOwotICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0KLSAgICBwdWJsaWMgSGFuZGxlcjIoKSB7Ci0gICAgICAgIHRoaXMubWVzc2FnZSA9ICJpbnNpZGUgc2VydmljZSAyIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBJbnZvY2F0aW9uUmVzcG9uc2UgaW52b2tlKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBsb2cuaW5mbygiSSBhbSAiICsgbWVzc2FnZSArICIgSGFuZGxlciBSdW5uaW5nIDopIik7Ci0gICAgICAgIHJldHVybiBJbnZvY2F0aW9uUmVzcG9uc2UuQ09OVElOVUU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmV2b2tlKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHsKLSAgICAgICAgbG9nLmluZm8oIkkgYW0gIiArIG1lc3NhZ2UgKyAiIEhhbmRsZXIgUnVubmluZyA6KSIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB9Ci0KLX0KLQotCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2phdmEvc2VjdXJpdHkvYWN0aW9uL0FjdGlvbi5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXZhL3NlY3VyaXR5L2FjdGlvbi9BY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFjYTMyNC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2phdmEvc2VjdXJpdHkvYWN0aW9uL0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmphdmEuc2VjdXJpdHkuYWN0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BYnN0cmFjdFRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF2YS5zZWN1cml0eS5kcml2ZXIuSmF2YTJTZWNUZXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF2YS5zZWN1cml0eS5pbnRlcmYuQWN0b3I7Ci0KLWltcG9ydCBqYXZhLmlvLkNoYXJBcnJheVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGVSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotCi0vKioKLSAqIEFjdGlvbiByZWFkcyB0aGUgZGF0YSBmcm9tIGFuIGlucHV0IGZpbGUKLSAqIGFuZCB0aGVuIHNhdmVzIHRoZSBmaWxlIGlucHV0IHRvIEphdmEyU2VjVGVzdCBjbGFzcwotICovCi0KLXB1YmxpYyBjbGFzcyBBY3Rpb24gaW1wbGVtZW50cyBBY3RvciB7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBmaWxlTmFtZTsKLSAgICBwcml2YXRlIEZpbGVSZWFkZXIgZmlsZVJlYWRlcjsKLQotICAgIC8vIENvbnN0cnVjdG9yCi0gICAgcHVibGljIEFjdGlvbihTdHJpbmcgZmlsZU5hbWUpIHsKLSAgICAgICAgdGhpcy5maWxlTmFtZSA9IGZpbGVOYW1lOwotICAgIH0KLQotICAgIC8vIEltcGxlbWVudGluZyBBY3RvcidzIHRha2VBY3Rpb24gbWV0aG9kCi0gICAgcHVibGljIHZvaWQgdGFrZUFjdGlvbigpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIFByaW50IG91dCBtYXZlbidzIGJhc2UsYnVpbGQsIGFuZCB0ZXN0IGRpcmVjb3RvcmllcwotICAgICAgICAgICAgU3RyaW5nIGJhc2VEaXIgPSBBYnN0cmFjdFRlc3RDYXNlLmJhc2VkaXI7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImJhc2VkaXIgPT4gIiArIGJhc2VEaXIpOwotCi0gICAgICAgICAgICBTdHJpbmcgYnVpbGREaXIgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm1hdmVuX2J1aWxkX2RpciIpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJidWlsZERpciA9PiAiICsgYnVpbGREaXIpOwotCi0gICAgICAgICAgICBTdHJpbmcgdGVzdERpciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibWF2ZW5fdGVzdF9kZXN0Iik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInRlc3REaXIgPT4gIiArIHRlc3REaXIpOwotCi0gICAgICAgICAgICAvLyBDb252ZXJ0IHRoZSBcIChiYWNrIHNsYXNoKSB0byAvIChmb3J3YXJkIHNsYXNoKQotICAgICAgICAgICAgU3RyaW5nIGJhc2VEaXJNID0gYmFzZURpci5yZXBsYWNlKCdcXCcsICcvJyk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImJhc2VEaXJNID0+ICIgKyBiYXNlRGlyTSk7Ci0KLSAgICAgICAgICAgIFN0cmluZyBmcyA9ICIvIjsKLQotICAgICAgICAgICAgLy8gQnVpbGQgdGhlIGZpbGUgVVJMCi0gICAgICAgICAgICBTdHJpbmcgZmlsZVVSTCA9IGJhc2VEaXJNICsgZnMgKyAidGVzdC1yZXNvdXJjZXMiICsgZnMgKyAiamF2YTJzZWMiICsgZnMgKyBmaWxlTmFtZTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRmlsZSBVUkwgPT4gIiArIGZpbGVVUkwpOwotCi0gICAgICAgICAgICBpZiAoZmlsZU5hbWUgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBmaWxlUmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoZmlsZVVSTCk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgZmlsZVJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCJwdWJsaWMudHh0Iik7Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgQ2hhckFycmF5V3JpdGVyIGNhdyA9IG5ldyBDaGFyQXJyYXlXcml0ZXIoKTsKLSAgICAgICAgICAgICAgICBpbnQgYzsKLSAgICAgICAgICAgICAgICB3aGlsZSAoKGMgPSBmaWxlUmVhZGVyLnJlYWQoKSkgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgY2F3LndyaXRlKGMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBTZXQvc2F2ZSB0aGUgZmlsZSBpbnB1dCBhcyB0ZXN0IHJlc3VsdCBvbnRvIEphdmEyU2VjVGVzdAotICAgICAgICAgICAgICAgIEphdmEyU2VjVGVzdC50ZXN0UmVzdWx0ID0gY2F3LnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5vdXQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgZmlsZVJlYWRlci5jbG9zZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZShTeXN0ZW0ub3V0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5vdXQpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXZhL3NlY3VyaXR5L2RyaXZlci9KYXZhMlNlY1Rlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF2YS9zZWN1cml0eS9kcml2ZXIvSmF2YTJTZWNUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhMGY2YmEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXZhL3NlY3VyaXR5L2RyaXZlci9KYXZhMlNlY1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF2YS5zZWN1cml0eS5kcml2ZXI7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkFic3RyYWN0VGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXZhLnNlY3VyaXR5LmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXZhLnNlY3VyaXR5Lmxlc3MuTGVzc1Blcm1pc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXZhLnNlY3VyaXR5Lmxlc3MuTGVzc1Blcm1pc3Npb25BY2Nlc3NDb250cm9sQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmphdmEuc2VjdXJpdHkubGVzcy5MZXNzUGVybWlzc2lvblByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXZhLnNlY3VyaXR5Lm1vcmUuTW9yZVBlcm1pc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXZhLnNlY3VyaXR5Lm1vcmUuTW9yZVBlcm1pc3Npb25BY2Nlc3NDb250cm9sQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmphdmEuc2VjdXJpdHkubW9yZS5Nb3JlUGVybWlzc2lvblByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb247Ci0KLWltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uOwotaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKLWltcG9ydCBqYXZhLnV0aWwuVGltZVpvbmU7Ci0KLS8qKgotICogSmF2YTJTZWNUZXN0IGRlbW9zdHJhdGVzIHRoZSB1c2FnZXMgb2YgQWNjZXNzQ29udHJvbGxlciBjbGFzcyBhbmQgUG9saWN5IGZpbGUocykgd2hpbGUgU2VjdXJpdHkgTWFuYWdlciBpcyBlbmFibGVkOgotICogMS4gdGVzdE5vUHJpdmlsZWdlUGFzc2VkIHNob3dzIHRoZSB1c2FnZSBvZiBubyBBY2Nlc3NDb250cm9sbGVyIGJ1dCBpdCBzdGlsbCB3b3JrIGZpbmUKLSAqIGJlY2F1c2UgaXQgaGFzIGFsbCB0aGUgcGVybWlzc2lvbnMuCi0gKiAyLiB0ZXN0Tm9Qcml2aWxlZ2VGYWlsdXJlIHNob3dzIHRoZSB1c2FnZSBvZiBBY2Nlc3NDb250cm9sbGVyIHdpdGggTGVzc1Blcm1pc3Npb24uamF2YSwKLSAqIHdoaWNoIGlzIG5vdCByaWdodCBhcHByb2FjaC4KLSAqIDMuIHRlc3REb1ByaXZpbGVnZVBhc3NlZCBzaG93cyB0aGUgY29ycmVjdCBwcmFjdGljZSBvZiBqYXZhIDIgc2VjdXJpdHkgYnkgZ3JhbnRpbmcgdGhlIGFwcHJvcHJpYXRlCi0gKiBwZXJtaXNzaW9uIGluIHRoZSBwb2xpY3kgZmlsZShzMCBhbmQgd3JhcHBpbmcgdGhlIEFjY2Vzc0NvbnRyb2xsZXIgY2FsbHMgd2l0aCBNb3JlUGVybWlzc2lvbi5qYXZhLgotICogNC4gdGVzdERvUHJpdmlsZWdlRmFpbHVyZSBzaG93cyB0aGUgcmV2ZXJzZSBjYWxsIG9yZGVyIG9mIE1vcmVQZXJtaXNzaW9uIGFuZCBMZXNzUGVybWlzc2lvbgotICogZnJvbSB0ZXN0RG9Qcml2aWxlZ2VkUGFzc2VkLgotICogNS4gdGVzdEFjY2Vzc0NvbnRyb2xDb250ZXh0RmFpbHVyZSBzaG93cyB0aGUgQWNjZXNzQ29udGV4dCB3aGljaCBjb250YWlucyBhIG5vLXBlcm1pc3Npb24gY2xhc3MKLSAqIG9uIHRoZSBzdGFjayBjYW4gY2F1c2UgYSBmYWlsdXJlLiBJbiBvdXIgY2FzZSwgdGhlIG5vLXBlcm1pc3Npb24gY2xhc3MgaXMKLSAqIExlc3NQZXJtaXNzaW9uQWNjZXNzQ29udHJvbENvbnRleHQuCi0gKi8KLQotcHVibGljIGNsYXNzIEphdmEyU2VjVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICAvLyBTdGF0aWMgdmFyaWFibGUgdG8ga2VlcCB0aGUgdGVzdCByZXN1bHQgCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdGVzdFJlc3VsdCA9ICIiOwotCi0gICAgLy8gRGVmYXVsdCBjb25zdHJ1Y3RvcgotICAgIHB1YmxpYyBKYXZhMlNlY1Rlc3QoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG5KYXZhMlNlY1Rlc3QgY3RvciAxIik7Ci0gICAgICAgIENhbGVuZGFyIGNhbCA9IENhbGVuZGFyLmdldEluc3RhbmNlKFRpbWVab25lLmdldERlZmF1bHQoKSk7Ci0gICAgICAgIFN0cmluZyBEQVRFX0ZPUk1BVCA9ICJ5eXl5LU1NLWRkIEhIOm1tOnNzIjsKLSAgICAgICAgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQgc2RmID0gbmV3IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0KERBVEVfRk9STUFUKTsKLSAgICAgICAgc2RmLnNldFRpbWVab25lKFRpbWVab25lLmdldERlZmF1bHQoKSk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ3VycmVudCB0aW1lID0+ICIgKyBzZGYuZm9ybWF0KGNhbC5nZXRUaW1lKCkpICsgIlxuIik7Ci0gICAgfQotCi0gICAgLy8gQ29uc3RydWN0b3IKLSAgICBwdWJsaWMgSmF2YTJTZWNUZXN0KFN0cmluZyBhcmcpIHsKLSAgICAgICAgc3VwZXIoYXJnKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcbkphdmEyU2VjVGVzdCBjdG9yIDIiKTsKLSAgICAgICAgQ2FsZW5kYXIgY2FsID0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoVGltZVpvbmUuZ2V0RGVmYXVsdCgpKTsKLSAgICAgICAgU3RyaW5nIERBVEVfRk9STUFUID0gInl5eXktTU0tZGQgSEg6bW06c3MiOwotICAgICAgICBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdCBzZGYgPSBuZXcgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQoREFURV9GT1JNQVQpOwotICAgICAgICBzZGYuc2V0VGltZVpvbmUoVGltZVpvbmUuZ2V0RGVmYXVsdCgpKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDdXJyZW50IHRpbWUgPT4gIiArIHNkZi5mb3JtYXQoY2FsLmdldFRpbWUoKSkgKyAiXG4iKTsKLSAgICB9Ci0KLSAgICAvLyBUaGlzIG1ldGhvZCBpcyBhZGRlZCBmb3IgcnVubmluZyB0aGlzIHRlc3QgYXMgYSBwdXJlIGp1bml0IHRlc3QKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0gICAgICAgIFRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotCi0gICAgfQotCi0gICAgLy8gVGhpcyBtZXRob2QgaXMgYWRkZWQgZm9yIHJ1bm5pbmcgdGhpcyB0ZXN0IGFzIGEgcHVyZSBqdW5pdCB0ZXN0Ci0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotICAgICAgICBUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEphdmEyU2VjVGVzdC5jbGFzcyk7Ci0KLSAgICAgICAgcmV0dXJuIHN1aXRlOwotCi0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiB0ZXN0Tm9Qcml2aWxlZ2VkU3VjY2Vzc2VkCi0gICAgICovCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9Qcml2aWxlZ2VTdWNjZXNzZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgSmF2YTJTZWNUZXN0LnRlc3RSZXN1bHQgPSAidGVzdE5vUHJpdmlsZWdlU3VjY2Vzc2VkIGZhaWxlZC4iOwotICAgICAgICBTZWN1cml0eU1hbmFnZXIgb2xkU00gPSBudWxsOwotICAgICAgICBTdHJpbmcgZXhwZWN0ZWRTdHJpbmcgPSAiVGhpcyBsaW5lIGlzIGZyb20gcHVibGljLnR4dC4iOwotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG50ZXN0Tm9Qcml2aWxlZ2VkU3VjY2Vzc2VkKCkgYmVnaW5zIik7Ci0gICAgICAgIC8vIENoZWNrIHdoZXRoZXIgdGhlIHNlY3VyaXR5IG1hbmFnZXIgaXMgZW5hYmxlZCBvciBub3QuCi0gICAgICAgIC8vIElmIG5vdCwgdHVybiBpdCBvbgotICAgICAgICBvbGRTTSA9IFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKTsKLSAgICAgICAgaWYgKG9sZFNNICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG5TZWN1cml0eSBNYW5hZ2VyIGlzIGVuYWJsZWQuIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxuU2VjdXJpdHkgTWFuYWdlciBpcyBkaXNhYmxlZC4iKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRW5hYmxpbmcgdGhlIGRlZmF1bHQgSmF2YSBTZWN1cml0eSBNYW5hZ2VyIik7Ci0gICAgICAgICAgICBTeXN0ZW0uc2V0U2VjdXJpdHlNYW5hZ2VyKG5ldyBTZWN1cml0eU1hbmFnZXIoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBSdW4gdGVzdCBXSVRIT1VUIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkIHdyYXBwZXIKLSAgICAgICAgQWN0aW9uIGRwID0gbmV3IEFjdGlvbigicHVibGljL3B1YmxpYy50eHQiKTsKLSAgICAgICAgTW9yZVBlcm1pc3Npb24gbXAgPSBuZXcgTW9yZVBlcm1pc3Npb24oZHAsIGZhbHNlKTsKLSAgICAgICAgTGVzc1Blcm1pc3Npb24gbHAgPSBuZXcgTGVzc1Blcm1pc3Npb24obXAsIGZhbHNlKTsKLSAgICAgICAgbHAudGFrZUFjdGlvbigpOwotCi0gICAgICAgIC8vIERpc2FibGUgc2VjdXJpdHkgbWFuYWdlciBpZiBpdCBpcyBlbmFibGVkIGJ5IHRoaXMgdGVzdGNzYWUKLSAgICAgICAgaWYgKFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKSAhPSBudWxsICYmIG9sZFNNID09IG51bGwpIHsKLSAgICAgICAgICAgIFN5c3RlbS5zZXRTZWN1cml0eU1hbmFnZXIobnVsbCk7Ci0gICAgICAgICAgICBpZiAoU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlNlY3VyaXR5IE1hbmFnZXIgaXMgc3VjY2Vzc2Z1bGx5IGRpc2FibGVkLiIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlNlY3VyaXR5IE1hbmFnZXIgaXMgc3RpbGwgZW5hYmxlZCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIFJlbW92ZSBleHRyYSBjaGFyYWN0ZXJzIHdpdGhpbiB0aGUgcmVzdWx0IHN0cmluZwotICAgICAgICB0ZXN0UmVzdWx0ID0gdGVzdFJlc3VsdC5yZXBsYWNlQWxsKCJcXHIiLCAiIik7Ci0gICAgICAgIHRlc3RSZXN1bHQgPSB0ZXN0UmVzdWx0LnJlcGxhY2VBbGwoIlxcbiIsICIiKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJSZXN1bHRpbmcgc3RyaW5nIGlzICIgKyB0ZXN0UmVzdWx0KTsKLQotICAgICAgICAvLyBWZXJpZnkgdGhlIHRlc3QgcmVzdWx0IGJ5IGNvbXBhcmluZyB0aGUgdGVzdCByZXN1bHQgd2l0aCBleHBlY3RlZCBzdHJpbmcKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIHN0cmluZyBjb250ZW50cyBkbyBub3QgbWF0Y2guIiwKLSAgICAgICAgICAgICAgICAgICBleHBlY3RlZFN0cmluZy5lcXVhbHNJZ25vcmVDYXNlKHRlc3RSZXN1bHQpKTsKLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxudGVzdE5vUHJpdmlsZWdlZFN1Y2Nlc3NlZCgpIGVuZHNcblxuIik7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiB0ZXN0Tm9Qcml2aWxlZ2VkRmFpbHVyZQotICAgICAqLwotCi0gICAgcHVibGljIHZvaWQgdGVzdE5vUHJpdmlsZWdlRmFpbHVyZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBKYXZhMlNlY1Rlc3QudGVzdFJlc3VsdCA9ICJ0ZXN0Tm9Qcml2aWxlZ2VGYWlsdXJlIGZhaWxlZC4iOwotICAgICAgICBTZWN1cml0eU1hbmFnZXIgb2xkU00gPSBudWxsOwotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG50ZXN0Tm9Qcml2aWxlZ2VkRmFpbHVyZWQoKSBiZWdpbnMiKTsKLSAgICAgICAgLy8gQ2hlY2sgd2hldGhlciB0aGUgc2VjdXJpdHkgaXMgZW5hYmxlIG9yIG5vdC4KLSAgICAgICAgLy8gaWYgaXQgaXMgbm90IGVuYWJsZWQsIHR1cm4gaXQgb24KLSAgICAgICAgb2xkU00gPSBTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCk7Ci0gICAgICAgIGlmIChvbGRTTSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxuU2VjdXJpdHkgTWFuYWdlciBpcyBlbmFibGVkLiIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcblNlY3VyaXR5IE1hbmFnZXIgaXMgZGlzYWJsZWQuIik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVuYWJsaW5nIHRoZSBkZWZhdWx0IFNlY3VyaXR5IE1hbmFnZXIiKTsKLSAgICAgICAgICAgIFN5c3RlbS5zZXRTZWN1cml0eU1hbmFnZXIobmV3IFNlY3VyaXR5TWFuYWdlcigpKTsKLSAgICAgICAgfQotICAgICAgICAvLyBSdW4gdGVzdCB3aXRoIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2Ugd3JhcHBlcgotICAgICAgICBBY3Rpb24gZHAgPSBuZXcgQWN0aW9uKCJwcml2YXRlL3ByaXZhdGUudHh0Iik7Ci0gICAgICAgIE1vcmVQZXJtaXNzaW9uIG1wID0gbmV3IE1vcmVQZXJtaXNzaW9uKGRwLCBmYWxzZSk7Ci0gICAgICAgIExlc3NQZXJtaXNzaW9uIGxwID0gbmV3IExlc3NQZXJtaXNzaW9uKG1wLCBmYWxzZSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBscC50YWtlQWN0aW9uKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyB2ZXJpZnkgdGhlIHRlc3QgcmVzdWx0Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKCJJdCBpcyBub3QgdGhlIHNlY3VyaXR5IGV4Y2VwdGlvbi4iLAotICAgICAgICAgICAgICAgICAgICAgICAoZSBpbnN0YW5jZW9mIGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbEV4Y2VwdGlvbikpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgLy8gRGlzYWJsZSBzZWN1cml0eSBtYW5hZ2VyIGlmIGl0IGlzIGVuYWJsZWQgYnkgdGhpcyB0ZXN0Y3NhZQotICAgICAgICAgICAgaWYgKFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKSAhPSBudWxsICYmIG9sZFNNID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uc2V0U2VjdXJpdHlNYW5hZ2VyKG51bGwpOwotICAgICAgICAgICAgICAgIGlmIChTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlNlY3VyaXR5IE1hbmFnZXIgaXMgc3VjY2Vzc2Z1bGx5IGRpc2FibGVkLiIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU2VjdXJpdHkgTWFuYWdlciBpcyBzdGlsbCBlbmFibGVkIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcbnRlc05vUHJpdmlsZWdlZEZhaWx1cmUoKSBlbmRzXG5cbiIpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiB0ZXN0RG9Qcml2aWxlZ2VkU3VjY2Vzc2VkCi0gICAgICovCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RG9Qcml2aWxlZ2VTdWNjZXNzZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgSmF2YTJTZWNUZXN0LnRlc3RSZXN1bHQgPSAidGVzdERvUHJpdmlsZWdlU3VjY2Vzc2VkIGZhaWxlZC4iOwotICAgICAgICBTZWN1cml0eU1hbmFnZXIgb2xkU00gPSBudWxsOwotICAgICAgICBTdHJpbmcgZXhwZWN0ZWRTdHJpbmcgPSAiVGhpcyBsaW5lIGlzIGZyb20gcHJpdmF0ZS50eHQuIjsKLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxudGVzdERvUHJpdmlsZWdlZFN1Y2Nlc3NlZCgpIGJlZ2lucyIpOwotICAgICAgICAvLyBDaGVjayB3aGV0aGVyIHRoZSBzZWN1cml0eSBpcyBlbmFibGUgb3Igbm90LgotICAgICAgICAvLyBJZiBpdCBpcyBub3QgZW5hYmxlZCwgdHVybiBpdCBvbgotICAgICAgICBvbGRTTSA9IFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKTsKLSAgICAgICAgaWYgKG9sZFNNICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG5TZWN1cml0eSBNYW5hZ2VyIGlzIGVuYWJsZWQuIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxuU2VjdXJpdHkgTWFuYWdlciBpcyBkaXNhYmxlZC4iKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRW5hYmxpbmcgdGhlIGRlZmF1bHQgSmF2YSBTZWN1cml0eSBNYW5hZ2VyIik7Ci0gICAgICAgICAgICBTeXN0ZW0uc2V0U2VjdXJpdHlNYW5hZ2VyKG5ldyBTZWN1cml0eU1hbmFnZXIoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBSdW4gdGVzdCB3aXRoIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2UKLSAgICAgICAgQWN0aW9uIGRwID0gbmV3IEFjdGlvbigicHJpdmF0ZS9wcml2YXRlLnR4dCIpOwotICAgICAgICBNb3JlUGVybWlzc2lvbiBtcCA9IG5ldyBNb3JlUGVybWlzc2lvbihkcCwgdHJ1ZSk7Ci0gICAgICAgIExlc3NQZXJtaXNzaW9uIGxwID0gbmV3IExlc3NQZXJtaXNzaW9uKG1wLCBmYWxzZSk7Ci0gICAgICAgIGxwLnRha2VBY3Rpb24oKTsKLQotICAgICAgICAvLyBEaXNhYmxlIHNlY3VyaXR5IG1hbmFnZXIgaWYgaXQgaXMgZW5hYmxlZCBieSB0aGlzIHRlc3Rjc2FlCi0gICAgICAgIGlmIChTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCkgIT0gbnVsbCAmJiBvbGRTTSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBTeXN0ZW0uc2V0U2VjdXJpdHlNYW5hZ2VyKG51bGwpOwotICAgICAgICAgICAgaWYgKFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTZWN1cml0eSBNYW5hZ2VyIGlzIHN1Y2Nlc3NmdWxseSBkaXNhYmxlZC4iKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTZWN1cml0eSBNYW5hZ2VyIGlzIHN0aWxsIGVuYWJsZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIFJlbW92ZSBleHRyYSBjaGFyYWN0ZXJzIHdpdGhpbiB0aGUgcmVzdWx0IHN0cmluZwotICAgICAgICB0ZXN0UmVzdWx0ID0gdGVzdFJlc3VsdC5yZXBsYWNlQWxsKCJcXHIiLCAiIik7Ci0gICAgICAgIHRlc3RSZXN1bHQgPSB0ZXN0UmVzdWx0LnJlcGxhY2VBbGwoIlxcbiIsICIiKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJSZXN1bHRpbmcgc3RyaW5nIGlzICIgKyB0ZXN0UmVzdWx0KTsKLQotICAgICAgICAvLyBWZXJpZnkgdGhlIHRlc3QgcmVzdWx0IGJ5IGNvbXBhcmluZyB0aGUgdGVzdCByZXN1bHQgd2l0aCBleHBlY3RlZCBzdHJpbmcgICAgICAgICAgICAgICAKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIHN0cmluZyBjb250ZW50cyBkbyBub3QgbWF0Y2guIiwKLSAgICAgICAgICAgICAgICAgICBleHBlY3RlZFN0cmluZy5lcXVhbHNJZ25vcmVDYXNlKHRlc3RSZXN1bHQpKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcbnRlc3REb1ByaXZpbGVnZWRTdWNjZXNzZWQoKSBlbmRzXG5cbiIpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogdGVzdERvUHJpdmlsZWdlZEZhaWx1cmUKLSAgICAgKi8KLQotICAgIHB1YmxpYyB2b2lkIHRlc3REb1ByaXZpbGVnZUZhaWx1cmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgSmF2YTJTZWNUZXN0LnRlc3RSZXN1bHQgPSAidGVzdERvUHJpdmlsZWdlRmFpbHVyZSBmYWlsZWQuIjsKLSAgICAgICAgU2VjdXJpdHlNYW5hZ2VyIG9sZFNNID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIGV4cGVjdGVkU3RyaW5nID0gIlRoaXMgbGluZSBpcyBmcm9tIHByaXZhdGUudHh0LiI7Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcbnRlc3REb1ByaXZpbGVnZWRGYWlsdXJlKCkgYmVnaW5zIik7Ci0gICAgICAgIC8vIENoZWNrIHdoZXRoZXIgdGhlIHNlY3VyaXR5IGlzIGVuYWJsZSBvciBub3QuCi0gICAgICAgIC8vIElmIGl0IGlzIG5vdCBlbmFibGVkLCB0dXJuIGl0IG9uCi0gICAgICAgIG9sZFNNID0gU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpOwotICAgICAgICBpZiAob2xkU00gIT0gbnVsbCkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcblNlY3VyaXR5IE1hbmFnZXIgaXMgZW5hYmxlZC4iKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG5TZWN1cml0eSBNYW5hZ2VyIGlzIGRpc2FibGVkLiIpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFbmFibGluZyB0aGUgZGVmYXVsdCBKYXZhIFNlY3VyaXR5IE1hbmFnZXIiKTsKLSAgICAgICAgICAgIFN5c3RlbS5zZXRTZWN1cml0eU1hbmFnZXIobmV3IFNlY3VyaXR5TWFuYWdlcigpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFJ1biB0ZXN0IHdpdGggQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZQotICAgICAgICBBY3Rpb24gZHAgPSBuZXcgQWN0aW9uKCJwcml2YXRlL3ByaXZhdGUudHh0Iik7Ci0gICAgICAgIE1vcmVQZXJtaXNzaW9uIG1wID0gbmV3IE1vcmVQZXJtaXNzaW9uKGRwLCBmYWxzZSk7Ci0gICAgICAgIExlc3NQZXJtaXNzaW9uIGxwID0gbmV3IExlc3NQZXJtaXNzaW9uKG1wLCB0cnVlKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1wLnRha2VBY3Rpb24oKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIFZlcmlmeSB0aGUgdGVzdCByZXN1bHQKLSAgICAgICAgICAgIGFzc2VydFRydWUoIkl0IGlzIG5vdCB0aGUgc2VjdXJpdHkgZXhjZXB0aW9uLiIsCi0gICAgICAgICAgICAgICAgICAgICAgIChlIGluc3RhbmNlb2YgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sRXhjZXB0aW9uKSk7Ci0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIC8vIERpc2FibGUgc2VjdXJpdHkgbWFuYWdlciBpZiBpdCBpcyBlbmFibGVkIGJ5IHRoaXMgdGVzdGNzYWUKLSAgICAgICAgICAgIGlmIChTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCkgIT0gbnVsbCAmJiBvbGRTTSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLnNldFNlY3VyaXR5TWFuYWdlcihudWxsKTsKLSAgICAgICAgICAgICAgICBpZiAoU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTZWN1cml0eSBNYW5hZ2VyIGlzIHN1Y2Nlc3NmdWxseSBkaXNhYmxlZC4iKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlNlY3VyaXR5IE1hbmFnZXIgaXMgc3RpbGwgZW5hYmxlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG50ZXN0RG9Qcml2aWxlZ2VkRmFpbHVyZSgpIGVuZHNcblxuIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIHRlc3RBY2Nlc3NDb250cm9sQ29udGV4dEZhaWx1cmUKLSAgICAgKi8KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBY2Nlc3NDb250cm9sQ29udGV4dEZhaWx1cmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgSmF2YTJTZWNUZXN0LnRlc3RSZXN1bHQgPSAidGVzdEFjY2Vzc0NvbnRyb2xDb250ZXh0RmFpbHVyZSBmYWlsZWQuIjsKLSAgICAgICAgU2VjdXJpdHlNYW5hZ2VyIG9sZFNNID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIGV4cGVjdGVkU3RyaW5nID0gIlRoaXMgbGluZSBpcyBmcm9tIHByaXZhdGUudHh0LiI7Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcbnRlc3RBY2Nlc3NDb250cm9sQ29udGV4dEZhaWx1cmUoKSBiZWdpbnMiKTsKLSAgICAgICAgLy8gQ2hlY2sgd2hldGhlciB0aGUgc2VjdXJpdHkgaXMgZW5hYmxlIG9yIG5vdC4KLSAgICAgICAgLy8gSWYgaXQgaXMgbm90IGVuYWJsZWQsIHR1cm4gaXQgb24KLSAgICAgICAgb2xkU00gPSBTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCk7Ci0gICAgICAgIGlmIChvbGRTTSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxuU2VjdXJpdHkgTWFuYWdlciBpcyBlbmFibGVkLiIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcblNlY3VyaXR5IE1hbmFnZXIgaXMgZGlzYWJsZWQuIik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVuYWJsaW5nIHRoZSBkZWZhdWx0IEphdmEgU2VjdXJpdHkgTWFuYWdlciIpOwotICAgICAgICAgICAgU3lzdGVtLnNldFNlY3VyaXR5TWFuYWdlcihuZXcgU2VjdXJpdHlNYW5hZ2VyKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gUnVuIHRlc3Qgd2l0aCBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlCi0gICAgICAgIEFjdGlvbiBkcCA9IG5ldyBBY3Rpb24oInByaXZhdGUvcHJpdmF0ZS50eHQiKTsKLSAgICAgICAgTW9yZVBlcm1pc3Npb25BY2Nlc3NDb250cm9sQ29udGV4dCBtcCA9IG5ldyBNb3JlUGVybWlzc2lvbkFjY2Vzc0NvbnRyb2xDb250ZXh0KGRwLCBmYWxzZSk7Ci0gICAgICAgIExlc3NQZXJtaXNzaW9uQWNjZXNzQ29udHJvbENvbnRleHQgbHAgPSBuZXcgTGVzc1Blcm1pc3Npb25BY2Nlc3NDb250cm9sQ29udGV4dChtcCwgdHJ1ZSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBscC50YWtlQWN0aW9uKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBWZXJpZnkgdGhlIHRlc3QgcmVzdWx0Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKCJJdCBpcyBub3QgdGhlIHNlY3VyaXR5IGV4Y2VwdGlvbi4iLAotICAgICAgICAgICAgICAgICAgICAgICAoZSBpbnN0YW5jZW9mIGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbEV4Y2VwdGlvbikpOwotCi0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAvLyBEaXNhYmxlIHNlY3VyaXR5IG1hbmFnZXIgaWYgaXQgaXMgZW5hYmxlZCBieSB0aGlzIHRlc3Rjc2FlCi0gICAgICAgICAgICBpZiAoU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpICE9IG51bGwgJiYgb2xkU00gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFN5c3RlbS5zZXRTZWN1cml0eU1hbmFnZXIobnVsbCk7Ci0gICAgICAgICAgICAgICAgaWYgKFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU2VjdXJpdHkgTWFuYWdlciBpcyBzdWNjZXNzZnVsbHkgZGlzYWJsZWQuIik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTZWN1cml0eSBNYW5hZ2VyIGlzIHN0aWxsIGVuYWJsZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxudGVzdEFjY2Vzc0NvbnRyb2xDb250ZXh0RmFpbHVyZSgpIGVuZHNcblxuIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyAyIGJlZ2lucwotCi0gICAgLyoqCi0gICAgICogdGVzdFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb25TdWNjZXNzZWQKLSAgICAgKi8KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQcml2aWxlZ2VkRXhjZXB0aW9uU3VjY2Vzc2VkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEphdmEyU2VjVGVzdC50ZXN0UmVzdWx0ID0gInRlc3RQcml2aWVsZ2VkRXhjZXB0aW9uU3VjY2Vzc2VkIGZhaWxlZCI7Ci0gICAgICAgIFNlY3VyaXR5TWFuYWdlciBvbGRTTSA9IG51bGw7Ci0gICAgICAgIFN0cmluZyBleHBlY3RlZFN0cmluZyA9ICJUaGlzIGxpbmUgaXMgZnJvbSBwcml2YXRlLnR4dC4iOwotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG50ZXN0UHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvblN1Y2Nlc3NlZCgpIGJlZ2lucyIpOwotICAgICAgICAvLyBDaGVjayB3aGV0aGVyIHRoZSBzZWN1cml0eSBpcyBlbmFibGUgb3Igbm90LgotICAgICAgICAvLyBJZiBpdCBpcyBub3QgZW5hYmxlZCwgdHVybiBpdCBvbgotICAgICAgICBvbGRTTSA9IFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKTsKLSAgICAgICAgaWYgKG9sZFNNICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG5TZWN1cml0eSBNYW5hZ2VyIGlzIGVuYWJsZWQuIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxuU2VjdXJpdHkgTWFuYWdlciBpcyBkaXNhYmxlZC4iKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRW5hYmxpbmcgdGhlIGRlZmF1bHQgSmF2YSBTZWN1cml0eSBNYW5hZ2VyIik7Ci0gICAgICAgICAgICBTeXN0ZW0uc2V0U2VjdXJpdHlNYW5hZ2VyKG5ldyBTZWN1cml0eU1hbmFnZXIoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBSdW4gdGVzdCB3aXRoIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2UKLSAgICAgICAgQWN0aW9uIGRwID0gbmV3IEFjdGlvbigicHJpdmF0ZS9wcml2YXRlLnR4dCIpOwotICAgICAgICBNb3JlUGVybWlzc2lvblByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24gbXAgPQotICAgICAgICAgICAgICAgIG5ldyBNb3JlUGVybWlzc2lvblByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24oZHAsIHRydWUpOwotICAgICAgICBMZXNzUGVybWlzc2lvblByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24gbHAgPQotICAgICAgICAgICAgICAgIG5ldyBMZXNzUGVybWlzc2lvblByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24obXAsIGZhbHNlKTsKLSAgICAgICAgbHAudGFrZUFjdGlvbigpOwotCi0gICAgICAgIC8vIERpc2FibGUgc2VjdXJpdHkgbWFuYWdlciBpZiBpdCBpcyBlbmFibGVkIGJ5IHRoaXMgdGVzdGNzYWUKLSAgICAgICAgaWYgKFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKSAhPSBudWxsICYmIG9sZFNNID09IG51bGwpIHsKLSAgICAgICAgICAgIFN5c3RlbS5zZXRTZWN1cml0eU1hbmFnZXIobnVsbCk7Ci0gICAgICAgICAgICBpZiAoU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlNlY3VyaXR5IE1hbmFnZXIgaXMgc3VjY2Vzc2Z1bGx5IGRpc2FibGVkLiIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlNlY3VyaXR5IE1hbmFnZXIgaXMgc3RpbGwgZW5hYmxlZCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gUmVtb3ZlIGV4dHJhIGNoYXJhY3RlcnMgd2l0aGluIHRoZSByZXN1bHQgc3RyaW5nCi0gICAgICAgIHRlc3RSZXN1bHQgPSB0ZXN0UmVzdWx0LnJlcGxhY2VBbGwoIlxcciIsICIiKTsKLSAgICAgICAgdGVzdFJlc3VsdCA9IHRlc3RSZXN1bHQucmVwbGFjZUFsbCgiXFxuIiwgIiIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInRlc3REb1ByaXZpbGVnZSdzIHJlc3VsdCBzdHJpbmcgaXMgIiArIHRlc3RSZXN1bHQpOwotCi0gICAgICAgIC8vIFZlcmlmeSB0aGUgdGVzdCByZXN1bHQgYnkgY29tcGFyaW5nIHRoZSB0ZXN0IHJlc3VsdCB3aXRoIGV4cGVjdGVkIHN0cmluZyAgICAgICAgICAgICAgIAotICAgICAgICBhc3NlcnRUcnVlKCJUaGUgc3RyaW5nIGNvbnRlbnRzIGRvIG5vdCBtYXRjaC4iLAotICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkU3RyaW5nLmVxdWFsc0lnbm9yZUNhc2UodGVzdFJlc3VsdCkpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxudGVzdERvUHJpdmlsZWdlU3VjY2Vzc2VkKCkgZW5kc1xuXG4iKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIHRlc3RQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uRmFpbHVyZQotICAgICAqLwotCi0gICAgcHVibGljIHZvaWQgdGVzdFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb25GYWlsdXJlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEphdmEyU2VjVGVzdC50ZXN0UmVzdWx0ID0gInRlc3RQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uRmFpbHVyZSBmYWlsZWQuIjsKLSAgICAgICAgU2VjdXJpdHlNYW5hZ2VyIG9sZFNNID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIGV4cGVjdGVkU3RyaW5nID0gIlRoaXMgbGluZSBpcyBmcm9tIHByaXZhdGUudHh0LiI7Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcbnRlc3RQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uRmFpbHVyZSgpIGJlZ2lucyIpOwotICAgICAgICAvLyBDaGVjayB3aGV0aGVyIHRoZSBzZWN1cml0eSBpcyBlbmFibGUgb3Igbm90LgotICAgICAgICAvLyBJZiBpdCBpcyBub3QgZW5hYmxlZCwgdHVybiBpdCBvbgotICAgICAgICBvbGRTTSA9IFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKTsKLSAgICAgICAgaWYgKG9sZFNNICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG5TZWN1cml0eSBNYW5hZ2VyIGlzIGVuYWJsZWQuIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxuU2VjdXJpdHkgTWFuYWdlciBpcyBkaXNhYmxlZC4iKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRW5hYmxpbmcgdGhlIGRlZmF1bHQgSmF2YSBTZWN1cml0eSBNYW5hZ2VyIik7Ci0gICAgICAgICAgICBTeXN0ZW0uc2V0U2VjdXJpdHlNYW5hZ2VyKG5ldyBTZWN1cml0eU1hbmFnZXIoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBSdW4gdGVzdCB3aXRoIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2UKLSAgICAgICAgQWN0aW9uIGRwID0gbmV3IEFjdGlvbigicHJpdmF0ZS9wcml2YXRlLnR4dCIpOwotICAgICAgICBNb3JlUGVybWlzc2lvblByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24gbXAgPQotICAgICAgICAgICAgICAgIG5ldyBNb3JlUGVybWlzc2lvblByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24oZHAsIGZhbHNlKTsKLSAgICAgICAgTGVzc1Blcm1pc3Npb25Qcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uIGxwID0KLSAgICAgICAgICAgICAgICBuZXcgTGVzc1Blcm1pc3Npb25Qcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uKG1wLCB0cnVlKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1wLnRha2VBY3Rpb24oKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIFZlcmlmeSB0aGUgdGVzdCByZXN1bHQKLSAgICAgICAgICAgIGFzc2VydFRydWUoIkl0IGlzIG5vdCB0aGUgc2VjdXJpdHkgZXhjZXB0aW9uLiIsCi0gICAgICAgICAgICAgICAgICAgICAgIChlIGluc3RhbmNlb2YgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uKSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAvLyBEaXNhYmxlIHNlY3VyaXR5IG1hbmFnZXIgaWYgaXQgaXMgZW5hYmxlZCBieSB0aGlzIHRlc3Rjc2FlCi0gICAgICAgICAgICBpZiAoU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpICE9IG51bGwgJiYgb2xkU00gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFN5c3RlbS5zZXRTZWN1cml0eU1hbmFnZXIobnVsbCk7Ci0gICAgICAgICAgICAgICAgaWYgKFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU2VjdXJpdHkgTWFuYWdlciBpcyBzdWNjZXNzZnVsbHkgZGlzYWJsZWQuIik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTZWN1cml0eSBNYW5hZ2VyIGlzIHN0aWxsIGVuYWJsZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxudGVzdFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb25GYWlsdXJlKCkgZW5kc1xuXG4iKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIHRlc3RDaGVja1Blcm1pc3Npb25BbGxvd2VkCi0gICAgICovCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2hlY2tQZXJtaXNzaW9uQWxsb3dlZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBKYXZhMlNlY1Rlc3QudGVzdFJlc3VsdCA9ICJ0ZXN0Q2hlY2tQZXJtaXNzaW9uQWxsb3dlZCBmYWlsZWQuIjsKLSAgICAgICAgU2VjdXJpdHlNYW5hZ2VyIG9sZFNNID0gbnVsbDsKLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxudGVzdENoZWNrUGVybWlzc2lvbkFsbG93ZWQoKSBiZWdpbnMuXG4iKTsKLSAgICAgICAgYm9vbGVhbiBhbGxvd2VkID0gZmFsc2U7Ci0gICAgICAgIFN0cmluZyBmaWxlTmFtZSA9ICJwdWJsaWMvcHVibGljLnR4dCI7Ci0KLSAgICAgICAgb2xkU00gPSBTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCk7Ci0gICAgICAgIGlmIChvbGRTTSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxuU2VjdXJpdHkgTWFuYWdlciBpcyBlbmFibGVkLiIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcblNlY3VyaXR5IE1hbmFnZXIgaXMgZGlzYWJsZWQuIik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVuYWJsaW5nIHRoZSBkZWZhdWx0IEphdmEgU2VjdXJpdHkgTWFuYWdlciIpOwotICAgICAgICAgICAgU3lzdGVtLnNldFNlY3VyaXR5TWFuYWdlcihuZXcgU2VjdXJpdHlNYW5hZ2VyKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIFByaW50IG91dCBtYXZlbidzIGJhc2UsYnVpbGQsIGFuZCB0ZXN0IGRpcmVjb3RvcmllcwotICAgICAgICAgICAgU3RyaW5nIGJhc2VEaXIgPSBBYnN0cmFjdFRlc3RDYXNlLmJhc2VkaXI7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImJhc2VkaXIgPT4gIiArIGJhc2VEaXIpOwotICAgICAgICAgICAgLy8gQ29udmVydCB0aGUgXCAoYmFjayBzbGFzaCkgdG8gLyAoZm9yd2FyZCBzbGFzaCkKLSAgICAgICAgICAgIFN0cmluZyBiYXNlRGlyTSA9IGJhc2VEaXIucmVwbGFjZSgnXFwnLCAnLycpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJiYXNlRGlyTSA9PiAiICsgYmFzZURpck0pOwotICAgICAgICAgICAgU3RyaW5nIGZzID0gIi8iOwotCi0gICAgICAgICAgICAvLyBCdWlsZCB0aGUgZmlsZSBVUkwKLSAgICAgICAgICAgIFN0cmluZyBmaWxlVVJMID0gYmFzZURpck0gKyBmcyArICJ0ZXN0LXJlc291cmNlcyIgKyBmcyArICJqYXZhMnNlYyIgKyBmcyArIGZpbGVOYW1lOwotICAgICAgICAgICAgUGVybWlzc2lvbiBwZXJtID0gbmV3IGphdmEuaW8uRmlsZVBlcm1pc3Npb24oZmlsZVVSTCwgInJlYWQiKTsKLSAgICAgICAgICAgIEFjY2Vzc0NvbnRyb2xsZXIuY2hlY2tQZXJtaXNzaW9uKHBlcm0pOwotICAgICAgICAgICAgYWxsb3dlZCA9IHRydWU7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZShTeXN0ZW0ub3V0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGFzc2VydFRydWUoIkFjY2Vzc2luZyB0byBwdWJsaWMudHh0IGZpbGUgaXMgZGVuaWVkOyBUZXN0IGZhaWxlZC4iLCBhbGxvd2VkKTsKLSAgICAgICAgICAgIC8vIERpc2FibGUgc2VjdXJpdHkgbWFuYWdlciBpZiBpdCBpcyBlbmFibGVkIGJ5IHRoaXMgdGVzdGNzYWUKLSAgICAgICAgICAgIGlmIChTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCkgIT0gbnVsbCAmJiBvbGRTTSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLnNldFNlY3VyaXR5TWFuYWdlcihudWxsKTsKLSAgICAgICAgICAgICAgICBpZiAoU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTZWN1cml0eSBNYW5hZ2VyIGlzIHN1Y2Nlc3NmdWxseSBkaXNhYmxlZC4iKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlNlY3VyaXR5IE1hbmFnZXIgaXMgc3RpbGwgZW5hYmxlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG50ZXN0Q2hlY2tQZXJtaXNzaW9uQWxsb3dlZCgpIGVuZHMuXG4iKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiB0ZXN0Q2hlY2tQZXJtaXNzaW9uRGVuaWVkCi0gICAgICovCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2hlY2tQZXJtaXNzaW9uRGVuaWVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEphdmEyU2VjVGVzdC50ZXN0UmVzdWx0ID0gInRlc3RDaGVja1Blcm1pc3Npb25EZW5pZWQgZmFpbGVkIjsKLSAgICAgICAgU2VjdXJpdHlNYW5hZ2VyIG9sZFNNID0gbnVsbDsKLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxudGVzdENoZWNrUGVybWlzc2lvbkRlbmllZCgpIGJlZ2lucy5cbiIpOwotICAgICAgICBib29sZWFuIGRlbmllZCA9IHRydWU7Ci0gICAgICAgIFN0cmluZyBmaWxlTmFtZSA9ICJwcml2YXRlL3ByaXZhdGUudHh0IjsKLQotICAgICAgICBvbGRTTSA9IFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKTsKLSAgICAgICAgaWYgKG9sZFNNICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG5TZWN1cml0eSBNYW5hZ2VyIGlzIGVuYWJsZWQuIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxuU2VjdXJpdHkgTWFuYWdlciBpcyBkaXNhYmxlZC4iKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRW5hYmxpbmcgdGhlIGRlZmF1bHQgSmF2YSBTZWN1cml0eSBNYW5hZ2VyIik7Ci0gICAgICAgICAgICBTeXN0ZW0uc2V0U2VjdXJpdHlNYW5hZ2VyKG5ldyBTZWN1cml0eU1hbmFnZXIoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gUHJpbnQgb3V0IG1hdmVuJ3MgYmFzZSxidWlsZCwgYW5kIHRlc3QgZGlyZWNvdG9yaWVzCi0gICAgICAgICAgICBTdHJpbmcgYmFzZURpciA9IEFic3RyYWN0VGVzdENhc2UuYmFzZWRpcjsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiYmFzZWRpciA9PiAiICsgYmFzZURpcik7Ci0KLSAgICAgICAgICAgIC8vIENvbnZlcnQgdGhlIFwgKGJhY2sgc2xhc2gpIHRvIC8gKGZvcndhcmQgc2xhc2gpCi0gICAgICAgICAgICBTdHJpbmcgYmFzZURpck0gPSBiYXNlRGlyLnJlcGxhY2UoJ1xcJywgJy8nKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiYmFzZURpck0gPT4gIiArIGJhc2VEaXJNKTsKLQotICAgICAgICAgICAgU3RyaW5nIGZzID0gIi8iOwotCi0gICAgICAgICAgICAvLyBCdWlsZCB0aGUgZmlsZSBVUkwKLSAgICAgICAgICAgIFN0cmluZyBmaWxlVVJMID0gYmFzZURpck0gKyBmcyArICJ0ZXN0LXJlc291cmNlcyIgKyBmcyArICJqYXZhMnNlYyIgKyBmcyArIGZpbGVOYW1lOwotICAgICAgICAgICAgUGVybWlzc2lvbiBwZXJtID0gbmV3IGphdmEuaW8uRmlsZVBlcm1pc3Npb24oZmlsZVVSTCwgInJlYWQiKTsKLSAgICAgICAgICAgIEFjY2Vzc0NvbnRyb2xsZXIuY2hlY2tQZXJtaXNzaW9uKHBlcm0pOwotICAgICAgICAgICAgZGVuaWVkID0gZmFsc2U7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpZiAoIShlIGluc3RhbmNlb2YgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbikpIHsKLSAgICAgICAgICAgICAgICBkZW5pZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5vdXQpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiQWNjZXNzaW5nIHRvIHByaXZhdGUudHh0IGZpbGUgaXMgYWxsb3dlZDsgVGVzdCBmYWlsZWQuIiwgZGVuaWVkKTsKLQotICAgICAgICAgICAgLy8gRGlzYWJsZSBzZWN1cml0eSBtYW5hZ2VyIGlmIGl0IGlzIGVuYWJsZWQgYnkgdGhpcyB0ZXN0Y3NhZQotICAgICAgICAgICAgaWYgKFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKSAhPSBudWxsICYmIG9sZFNNID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uc2V0U2VjdXJpdHlNYW5hZ2VyKG51bGwpOwotICAgICAgICAgICAgICAgIGlmIChTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlNlY3VyaXR5IE1hbmFnZXIgaXMgc3VjY2Vzc2Z1bGx5IGRpc2FibGVkLiIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU2VjdXJpdHkgTWFuYWdlciBpcyBzdGlsbCBlbmFibGVkIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcbnRlc3RDaGVja1Blcm1pc3Npb25EZW5pZWQoKSBlbmRzLlxuIik7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2phdmEvc2VjdXJpdHkvaW50ZXJmL0FjdG9yLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2phdmEvc2VjdXJpdHkvaW50ZXJmL0FjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4N2ExZjAuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXZhL3NlY3VyaXR5L2ludGVyZi9BY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmphdmEuc2VjdXJpdHkuaW50ZXJmOwotCi0vKioKLSAqIEludGVyZmFjZSBBY3RvcgotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgQWN0b3IgewotICAgIHB1YmxpYyB2b2lkIHRha2VBY3Rpb24oKTsKLX0KLQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXZhL3NlY3VyaXR5L2xlc3MvTGVzc1Blcm1pc3Npb24uamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF2YS9zZWN1cml0eS9sZXNzL0xlc3NQZXJtaXNzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3OWIyMTcuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXZhL3NlY3VyaXR5L2xlc3MvTGVzc1Blcm1pc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXZhLnNlY3VyaXR5Lmxlc3M7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmphdmEuc2VjdXJpdHkuaW50ZXJmLkFjdG9yOwotCi1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uOwotCi0KLS8qKgotICogTGVzc1Blcm1pc3Npb24gaGFzIG5vIHJlYWQgcGVybWlzc2lvbiB0byB0aGUgcHJpdmF0ZS50eHQgZmlsZQotICovCi0KLXB1YmxpYyBjbGFzcyBMZXNzUGVybWlzc2lvbiBpbXBsZW1lbnRzIEFjdG9yIHsKLQotICAgIHByaXZhdGUgQWN0b3IgX2FjdG9yOwotICAgIHByaXZhdGUgYm9vbGVhbiBfdXNpbmdEb1ByaXZpbGVnZTsKLQotICAgIC8vIENvbnN0cnV0b3IKLSAgICBwdWJsaWMgTGVzc1Blcm1pc3Npb24oQWN0b3IgYSwgYm9vbGVhbiB1c2luZ0RvUHJpdmlsZWdlKSB7Ci0gICAgICAgIF9hY3RvciA9IGE7Ci0gICAgICAgIF91c2luZ0RvUHJpdmlsZWdlID0gdXNpbmdEb1ByaXZpbGVnZTsKLSAgICB9Ci0KLSAgICAvLyBJbXBsZW1lbnQgQWN0b3IncyB0YWtlQWN0aW9uIG1ldGhvZAotICAgIHB1YmxpYyB2b2lkIHRha2VBY3Rpb24oKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoX3VzaW5nRG9Qcml2aWxlZ2UpIHsKLSAgICAgICAgICAgICAgICAvLyBVc2UgQWNjZXNzQ29udHJvbGxlcidzIGRvUHJpdmlsZWdlCi0gICAgICAgICAgICAgICAgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgUHJpdmlsZWdlZEFjdGlvbigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2FjdG9yLnRha2VBY3Rpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIFVzZSBubyBBY2Nlc3NDb250cm9sbGVyJ3MgZG9Qcml2aWxlZ2UKLSAgICAgICAgICAgICAgICBfYWN0b3IudGFrZUFjdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLm91dCk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF2YS9zZWN1cml0eS9sZXNzL0xlc3NQZXJtaXNzaW9uQWNjZXNzQ29udHJvbENvbnRleHQuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF2YS9zZWN1cml0eS9sZXNzL0xlc3NQZXJtaXNzaW9uQWNjZXNzQ29udHJvbENvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTExN2JhMi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2phdmEvc2VjdXJpdHkvbGVzcy9MZXNzUGVybWlzc2lvbkFjY2Vzc0NvbnRyb2xDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF2YS5zZWN1cml0eS5sZXNzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXZhLnNlY3VyaXR5LmludGVyZi5BY3RvcjsKLQotaW1wb3J0IGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbENvbnRleHQ7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uOwotCi0KLS8qKgotICogTGVzc1Blcm1pc3Npb24gaGFzIG5vIHJlYWQgcGVybWlzc2lvbiB0byB0aGUgcHJpdmF0ZS50eHQgZmlsZQotICovCi0KLXB1YmxpYyBjbGFzcyBMZXNzUGVybWlzc2lvbkFjY2Vzc0NvbnRyb2xDb250ZXh0IGltcGxlbWVudHMgQWN0b3IgewotCi0gICAgcHJpdmF0ZSBBY3RvciBfYWN0b3I7Ci0gICAgcHJpdmF0ZSBib29sZWFuIF91c2luZ0RvUHJpdmlsZWdlOwotCi0gICAgLy8gQ29uc3RydXRvcgotICAgIHB1YmxpYyBMZXNzUGVybWlzc2lvbkFjY2Vzc0NvbnRyb2xDb250ZXh0KEFjdG9yIGEsIGJvb2xlYW4gdXNpbmdEb1ByaXZpbGVnZSkgewotICAgICAgICBfYWN0b3IgPSBhOwotICAgICAgICBfdXNpbmdEb1ByaXZpbGVnZSA9IHVzaW5nRG9Qcml2aWxlZ2U7Ci0gICAgfQotCi0gICAgLy8gSW1wbGVtZW50IEFjdG9yJ3MgdGFrZUFjdGlvbiBtZXRob2QKLSAgICBwdWJsaWMgdm9pZCB0YWtlQWN0aW9uKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKF91c2luZ0RvUHJpdmlsZWdlKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgQWNjZXNzQ29udHJvbENvbnRleHQgYWNjID0gQWNjZXNzQ29udHJvbGxlci5nZXRDb250ZXh0KCk7Ci0gICAgICAgICAgICAgICAgLy8gRGVtb3N0cmF0ZSB0aGUgdXNhZ2Ugb2YgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoUHJpdmlsZWdlQWN0aW9uIGFjdGlvbiwgQWNjZXNzQ29udGV4dCBjdHgpCi0gICAgICAgICAgICAgICAgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgUHJpdmlsZWdlZEFjdGlvbigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2FjdG9yLnRha2VBY3Rpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSwgYWNjKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gVXNlIG5vIGRvUHJpdmlsZWdlZAotICAgICAgICAgICAgICAgIF9hY3Rvci50YWtlQWN0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZShTeXN0ZW0ub3V0KTsKLSAgICAgICAgfQotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXZhL3NlY3VyaXR5L2xlc3MvTGVzc1Blcm1pc3Npb25Qcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2phdmEvc2VjdXJpdHkvbGVzcy9MZXNzUGVybWlzc2lvblByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWRmZjlhOS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2phdmEvc2VjdXJpdHkvbGVzcy9MZXNzUGVybWlzc2lvblByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXZhLnNlY3VyaXR5Lmxlc3M7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmphdmEuc2VjdXJpdHkuaW50ZXJmLkFjdG9yOwotCi1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uOwotCi0KLS8qKgotICogTGVzc1Blcm1pc3Npb24gaGFzIG5vIHJlYWQgcGVybWlzc2lvbiB0byB0aGUgcHJpdmF0ZS50eHQgZmlsZQotICovCi0KLXB1YmxpYyBjbGFzcyBMZXNzUGVybWlzc2lvblByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24gaW1wbGVtZW50cyBBY3RvciB7Ci0KLSAgICBwcml2YXRlIEFjdG9yIF9hY3RvcjsKLSAgICBwcml2YXRlIGJvb2xlYW4gX3VzaW5nRG9Qcml2aWxlZ2U7Ci0KLSAgICAvLyBDb25zdHJ1dG9yCi0gICAgcHVibGljIExlc3NQZXJtaXNzaW9uUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbihBY3RvciBhLCBib29sZWFuIHVzaW5nRG9Qcml2aWxlZ2UpIHsKLSAgICAgICAgX2FjdG9yID0gYTsKLSAgICAgICAgX3VzaW5nRG9Qcml2aWxlZ2UgPSB1c2luZ0RvUHJpdmlsZWdlOwotICAgIH0KLQotICAgIC8vIEltcGxlbWVudCBBY3RvcidzIHRha2VBY3Rpb24gbWV0aG9kCi0gICAgcHVibGljIHZvaWQgdGFrZUFjdGlvbigpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChfdXNpbmdEb1ByaXZpbGVnZSkgewotICAgICAgICAgICAgICAgIC8vIERlbW9zdHJhdGUgdGhlIHVzYWdlIG9mIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24gYWN0aW9uKQotICAgICAgICAgICAgICAgIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9hY3Rvci50YWtlQWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBVc2Ugbm8gZG9Qcml2aWxlZ2VkCi0gICAgICAgICAgICAgICAgX2FjdG9yLnRha2VBY3Rpb24oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5vdXQpOwotICAgICAgICB9Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2phdmEvc2VjdXJpdHkvbW9yZS9Nb3JlUGVybWlzc2lvbi5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXZhL3NlY3VyaXR5L21vcmUvTW9yZVBlcm1pc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NlNzM5MS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2phdmEvc2VjdXJpdHkvbW9yZS9Nb3JlUGVybWlzc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmphdmEuc2VjdXJpdHkubW9yZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF2YS5zZWN1cml0eS5pbnRlcmYuQWN0b3I7Ci0KLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb247Ci0KLS8qKgotICogTW9yZVBlcm1pc3Npb24gaGFzIHJlYWQgcGVybWlzc2lvbiB0byBib3RoIHB1YmxpYy50eHQgYW5kIHByaXZhdGUudHh0Ci0gKi8KLQotcHVibGljIGNsYXNzIE1vcmVQZXJtaXNzaW9uIGltcGxlbWVudHMgQWN0b3IgewotCi0gICAgcHJpdmF0ZSBBY3RvciBfYWN0b3I7Ci0gICAgcHJpdmF0ZSBib29sZWFuIF91c2luZ0RvUHJpdmlsZWdlOwotCi0gICAgLy8gQ29uc3RydWN0b3IKLSAgICBwdWJsaWMgTW9yZVBlcm1pc3Npb24oQWN0b3IgYSwgYm9vbGVhbiB1c2luZ0RvUHJpdmlsZWdlKSB7Ci0gICAgICAgIF9hY3RvciA9IGE7Ci0gICAgICAgIF91c2luZ0RvUHJpdmlsZWdlID0gdXNpbmdEb1ByaXZpbGVnZTsKLQotICAgIH0KLQotICAgIC8vIEltcGxlbWVudGluZyBBY3RvcidzIHRha2VBY3Rpb24gbWV0aG9kCi0gICAgcHVibGljIHZvaWQgdGFrZUFjdGlvbigpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChfdXNpbmdEb1ByaXZpbGVnZSkgewotICAgICAgICAgICAgICAgIC8vIFVzZSBBY2Nlc3NDb250cm9sbGVyJ3MgZG9Qcml2aWxlZ2UKLSAgICAgICAgICAgICAgICBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBQcml2aWxlZ2VkQWN0aW9uKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYWN0b3IudGFrZUFjdGlvbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gVXNlIG5vIEFjY2Vzc0NvbnRyb2xsZXIncyBkb1ByaXZpbGVnZQotICAgICAgICAgICAgICAgIF9hY3Rvci50YWtlQWN0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZShTeXN0ZW0ub3V0KTsKLSAgICAgICAgfQotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXZhL3NlY3VyaXR5L21vcmUvTW9yZVBlcm1pc3Npb25BY2Nlc3NDb250cm9sQ29udGV4dC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXZhL3NlY3VyaXR5L21vcmUvTW9yZVBlcm1pc3Npb25BY2Nlc3NDb250cm9sQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWU4Zjk0Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF2YS9zZWN1cml0eS9tb3JlL01vcmVQZXJtaXNzaW9uQWNjZXNzQ29udHJvbENvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXZhLnNlY3VyaXR5Lm1vcmU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkFic3RyYWN0VGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXZhLnNlY3VyaXR5LmludGVyZi5BY3RvcjsKLQotaW1wb3J0IGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbENvbnRleHQ7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbjsKLQotLyoqCi0gKiBNb3JlUGVybWlzc2lvbkFjY2Vzc0NvbnRyb2xsZXJDb250ZXh0IGhhcyByZWFkIHBlcm1pc3Npb24gdG8gYm90aCBwdWJsaWMudHh0IGFuZCBwcml2YXRlLnR4dAotICovCi0KLXB1YmxpYyBjbGFzcyBNb3JlUGVybWlzc2lvbkFjY2Vzc0NvbnRyb2xDb250ZXh0IGltcGxlbWVudHMgQWN0b3IgewotCi0gICAgcHJpdmF0ZSBBY3RvciBfYWN0b3I7Ci0gICAgcHJpdmF0ZSBib29sZWFuIF91c2luZ0RvUHJpdmlsZWdlOwotCi0gICAgLy8gQ29uc3RydWN0b3IKLSAgICBwdWJsaWMgTW9yZVBlcm1pc3Npb25BY2Nlc3NDb250cm9sQ29udGV4dChBY3RvciBhLCBib29sZWFuIHVzaW5nRG9Qcml2aWxlZ2UpIHsKLSAgICAgICAgX2FjdG9yID0gYTsKLSAgICAgICAgX3VzaW5nRG9Qcml2aWxlZ2UgPSB1c2luZ0RvUHJpdmlsZWdlOwotCi0gICAgfQotCi0gICAgLy8gSW1wbGVtZW50aW5nIEFjdG9yJ3MgdGFrZUFjdGlvbiBtZXRob2QKLSAgICBwdWJsaWMgdm9pZCB0YWtlQWN0aW9uKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKF91c2luZ0RvUHJpdmlsZWdlKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgQWNjZXNzQ29udHJvbENvbnRleHQgYWNjID0gQWNjZXNzQ29udHJvbGxlci5nZXRDb250ZXh0KCk7Ci0gICAgICAgICAgICAgICAgLy8gUHJpbnQgb3V0IG1hdmVuJ3MgYmFzZSxidWlsZCwgYW5kIHRlc3QgZGlyZWNvdG9yaWVzCi0gICAgICAgICAgICAgICAgU3RyaW5nIGJhc2VEaXIgPSBBYnN0cmFjdFRlc3RDYXNlLmJhc2VkaXI7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJiYXNlZGlyID0+ICIgKyBiYXNlRGlyKTsKLQotICAgICAgICAgICAgICAgIC8vIENvbnZlcnQgdGhlIFwgKGJhY2sgc2xhc2gpIHRvIC8gKGZvcndhcmQgc2xhc2gpCi0gICAgICAgICAgICAgICAgU3RyaW5nIGJhc2VEaXJNID0gYmFzZURpci5yZXBsYWNlKCdcXCcsICcvJyk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJiYXNlRGlyTSA9PiAiICsgYmFzZURpck0pOwotCi0gICAgICAgICAgICAgICAgU3RyaW5nIGZzID0gIi8iOwotICAgICAgICAgICAgICAgIFN0cmluZyBmaWxlTmFtZSA9ICJwcml2YXRlL3ByaXZhdGUudHh0IjsKLQotICAgICAgICAgICAgICAgIC8vIEJ1aWxkIHRoZSBmaWxlIFVSTAotICAgICAgICAgICAgICAgIFN0cmluZyBmaWxlVVJMID0gYmFzZURpck0gKyBmcyArICJ0ZXN0LXJlc291cmNlcyIgKyBmcyArICJqYXZhMnNlYyIgKyBmcyArIGZpbGVOYW1lOwotICAgICAgICAgICAgICAgIFBlcm1pc3Npb24gcGVybSA9IG5ldyBqYXZhLmlvLkZpbGVQZXJtaXNzaW9uKGZpbGVVUkwsICJyZWFkIik7Ci0gICAgICAgICAgICAgICAgYWNjLmNoZWNrUGVybWlzc2lvbihwZXJtKTsKLSAgICAgICAgICAgICAgICAvLyBEZW1vc3RyYXRlIHRoZSB1c2FnZSBvZiBBY2Nlc3NDb250cm9sbGVyJ3MgZG9Qcml2aWxlZ2UoUHJpdmlsZWdlQWN0aW9uIGFjdGlvbiwgQWNjZXNzQ29udGV4dCBjdHgpCi0gICAgICAgICAgICAgICAgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgUHJpdmlsZWdlZEFjdGlvbigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2FjdG9yLnRha2VBY3Rpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSwgYWNjKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gVXNlIG5vIGRvUHJpdmlsZWdlZAotICAgICAgICAgICAgICAgIF9hY3Rvci50YWtlQWN0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZShTeXN0ZW0ub3V0KTsKLSAgICAgICAgfQotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXZhL3NlY3VyaXR5L21vcmUvTW9yZVBlcm1pc3Npb25Qcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2phdmEvc2VjdXJpdHkvbW9yZS9Nb3JlUGVybWlzc2lvblByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI2Y2VjMC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2phdmEvc2VjdXJpdHkvbW9yZS9Nb3JlUGVybWlzc2lvblByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXZhLnNlY3VyaXR5Lm1vcmU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmphdmEuc2VjdXJpdHkuaW50ZXJmLkFjdG9yOwotCi1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uOwotCi0vKioKLSAqIE1vcmVQZXJtaXNzaW9uIGhhcyByZWFkIHBlcm1pc3Npb24gdG8gYm90aCBwdWJsaWMudHh0IGFuZCBwcml2YXRlLnR4dAotICovCi0KLXB1YmxpYyBjbGFzcyBNb3JlUGVybWlzc2lvblByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24gaW1wbGVtZW50cyBBY3RvciB7Ci0KLSAgICBwcml2YXRlIEFjdG9yIF9hY3RvcjsKLSAgICBwcml2YXRlIGJvb2xlYW4gX3VzaW5nRG9Qcml2aWxlZ2U7Ci0KLSAgICAvLyBDb25zdHJ1Y3RvcgotICAgIHB1YmxpYyBNb3JlUGVybWlzc2lvblByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24oQWN0b3IgYSwgYm9vbGVhbiB1c2luZ0RvUHJpdmlsZWdlKSB7Ci0gICAgICAgIF9hY3RvciA9IGE7Ci0gICAgICAgIF91c2luZ0RvUHJpdmlsZWdlID0gdXNpbmdEb1ByaXZpbGVnZTsKLQotICAgIH0KLQotICAgIC8vIEltcGxlbWVudGluZyBBY3RvcidzIHRha2VBY3Rpb24gbWV0aG9kCi0gICAgcHVibGljIHZvaWQgdGFrZUFjdGlvbigpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChfdXNpbmdEb1ByaXZpbGVnZSkgewotICAgICAgICAgICAgICAgIC8vIERlbW9zdHJhdGUgdGhlIHVzYWdlIG9mIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24gYWN0aW9uKQotICAgICAgICAgICAgICAgIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9hY3Rvci50YWtlQWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBVc2Ugbm8gZG9Qcml2aWxlZ2UKLSAgICAgICAgICAgICAgICBfYWN0b3IudGFrZUFjdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLm91dCk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvbWlzYy9NaXNjVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9taXNjL01pc2NUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViNjU5NDQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9taXNjL01pc2NUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIubWlzYzsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQWJzdHJhY3RUZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBNaXNjVGVzdCBleHRlbmRzIEFic3RyYWN0VGVzdENhc2UgewotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHRlc3ROYW1lCi0gICAgICovCi0gICAgcHVibGljIE1pc2NUZXN0KFN0cmluZyB0ZXN0TmFtZSkgewotICAgICAgICBzdXBlcih0ZXN0TmFtZSk7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXhpc0ZhdWx0KCkgewotICAgICAgICBFeGNlcHRpb24gZSA9IG5ldyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKG5ldyBFeGNlcHRpb24oKSk7Ci0gICAgICAgIGFzc2VydE5vdFNhbWUoQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKSwgZSk7Ci0KLSAgICAgICAgZSA9IG5ldyBBeGlzRmF1bHQoIiIpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9waGFzZXJ1bGUvQWRkaW5nSGFuZGxlclRvRWFjaFBoYXNlVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9waGFzZXJ1bGUvQWRkaW5nSGFuZGxlclRvRWFjaFBoYXNlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYmFmZDYzLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvcGhhc2VydWxlL0FkZGluZ0hhbmRsZXJUb0VhY2hQaGFzZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucGhhc2VydWxlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BYnN0cmFjdFRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uSGFuZGxlckRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkRpc3BhdGNoUGhhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuSGFuZGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5QaGFzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnBoYXNlcmVzb2x2ZXIuUGhhc2VIb2xkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1wdWJsaWMgY2xhc3MgQWRkaW5nSGFuZGxlclRvRWFjaFBoYXNlVGVzdCBleHRlbmRzIEFic3RyYWN0VGVzdENhc2UgewotICAgIEF4aXNDb25maWd1cmF0aW9uIGF4aXNDb25maWc7Ci0KLSAgICBwdWJsaWMgQWRkaW5nSGFuZGxlclRvRWFjaFBoYXNlVGVzdChTdHJpbmcgdGVzdE5hbWUpIHsKLSAgICAgICAgc3VwZXIodGVzdE5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQaGFzZVJ1bGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vVE9ETyBmaXggbWUKLSAgICAgICAgYXhpc0NvbmZpZyA9IG5ldyBBeGlzQ29uZmlndXJhdGlvbigpOwotICAgICAgICBMaXN0IGluUGhhc2UgPSBheGlzQ29uZmlnLmdldEluRmxvd1BoYXNlcygpOwotICAgICAgICBQaGFzZSB0cmFuc3BvcnRJTiA9IG5ldyBQaGFzZSgiVHJhbnNwb3J0SW4iKTsKLSAgICAgICAgUGhhc2UgcHJlRGlzcGF0Y2ggPSBuZXcgUGhhc2UoIlByZURpc3BhdGNoIik7Ci0gICAgICAgIERpc3BhdGNoUGhhc2UgZGlzcGF0Y2hQaGFzZSA9IG5ldyBEaXNwYXRjaFBoYXNlKCk7Ci0vLwotICAgICAgICBkaXNwYXRjaFBoYXNlLnNldE5hbWUoIkRpc3BhdGNoIik7Ci0gICAgICAgIGluUGhhc2UuYWRkKHRyYW5zcG9ydElOKTsKLSAgICAgICAgaW5QaGFzZS5hZGQocHJlRGlzcGF0Y2gpOwotICAgICAgICBpblBoYXNlLmFkZChkaXNwYXRjaFBoYXNlKTsKLQotICAgICAgICBIYW5kbGVyRGVzY3JpcHRpb24gaG0gPSBuZXcgSGFuZGxlckRlc2NyaXB0aW9uKCk7Ci0gICAgICAgIGhtLnNldENsYXNzTmFtZSgib3JnLmFwYWNoZS5heGlzMi5oYW5kbGVycy5BYnN0cmFjdEhhbmRsZXIiKTsKLSAgICAgICAgSGFuZGxlciBoMSA9IG5ldyBQaGFzZVJ1bGVIYW5kbGVyKCk7Ci0gICAgICAgIGhtLnNldEhhbmRsZXIoaDEpOwotICAgICAgICBobS5nZXRSdWxlcygpLnNldFBoYXNlTmFtZSgiKiIpOwotCi0gICAgICAgIFBoYXNlSG9sZGVyIHBoID0gbmV3IFBoYXNlSG9sZGVyKGluUGhhc2UpOwotICAgICAgICBwaC5hZGRIYW5kbGVyKGhtKTsKLSAgICAgICAgYm9vbGVhbiBmb3VuZDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpblBoYXNlLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBmb3VuZCA9IGZhbHNlOwotICAgICAgICAgICAgUGhhc2UgcGhhc2UgPSAoUGhhc2UpIGluUGhhc2UuZ2V0KGkpOwotICAgICAgICAgICAgTGlzdCBoYW5kbGVycyA9IHBoYXNlLmdldEhhbmRsZXJzKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGhhbmRsZXJzLnNpemUoKTsgaisrKSB7Ci0gICAgICAgICAgICAgICAgSGFuZGxlciBoYW5kbGVyID0gKEhhbmRsZXIpIGhhbmRsZXJzLmdldChqKTsKLSAgICAgICAgICAgICAgICBpZiAoaDEuZXF1YWxzKGhhbmRsZXIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWZvdW5kKSB7Ci0gICAgICAgICAgICAgICAgZmFpbCgiU29tZSB0aGluZyBoYXMgZ29uZSB3cm9uZyBobmFkbGVyIGRvZXMgbm90IGV4aXQgaW4gdGhlIHBoYXNlIDoiCi0gICAgICAgICAgICAgICAgICAgICAgICArIHBoYXNlLmdldFBoYXNlTmFtZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQaGFzZVJ1bGVzV2l0aFBoYXNlRmlyc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICAgICAgLy9UT0RPIGZpeCBtZQotICAgICAgICBheGlzQ29uZmlnID0gbmV3IEF4aXNDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgIExpc3QgaW5QaGFzZSA9IGF4aXNDb25maWcuZ2V0SW5GbG93UGhhc2VzKCk7Ci0gICAgICAgIFBoYXNlIHRyYW5zcG9ydElOID0gbmV3IFBoYXNlKCJUcmFuc3BvcnRJbiIpOwotICAgICAgICBQaGFzZSBwcmVEaXNwYXRjaCA9IG5ldyBQaGFzZSgiUHJlRGlzcGF0Y2giKTsKLSAgICAgICAgRGlzcGF0Y2hQaGFzZSBkaXNwYXRjaFBoYXNlID0gbmV3IERpc3BhdGNoUGhhc2UoKTsKLS8vCi0gICAgICAgIGRpc3BhdGNoUGhhc2Uuc2V0TmFtZSgiRGlzcGF0Y2giKTsKLSAgICAgICAgaW5QaGFzZS5hZGQodHJhbnNwb3J0SU4pOwotICAgICAgICBpblBoYXNlLmFkZChwcmVEaXNwYXRjaCk7Ci0gICAgICAgIGluUGhhc2UuYWRkKGRpc3BhdGNoUGhhc2UpOwotCi0gICAgICAgIEhhbmRsZXJEZXNjcmlwdGlvbiBobSA9IG5ldyBIYW5kbGVyRGVzY3JpcHRpb24oKTsKLSAgICAgICAgaG0uc2V0Q2xhc3NOYW1lKCJvcmcuYXBhY2hlLmF4aXMyLmhhbmRsZXJzLkFic3RyYWN0SGFuZGxlciIpOwotICAgICAgICBIYW5kbGVyIGgxID0gbmV3IFBoYXNlUnVsZUhhbmRsZXIoKTsKLSAgICAgICAgaG0uc2V0SGFuZGxlcihoMSk7Ci0gICAgICAgIGhtLmdldFJ1bGVzKCkuc2V0UGhhc2VOYW1lKCIqIik7Ci0gICAgICAgIGhtLmdldFJ1bGVzKCkuc2V0UGhhc2VGaXJzdCh0cnVlKTsKLQotICAgICAgICBQaGFzZUhvbGRlciBwaCA9IG5ldyBQaGFzZUhvbGRlcihpblBoYXNlKTsKLSAgICAgICAgcGguYWRkSGFuZGxlcihobSk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5QaGFzZS5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgUGhhc2UgcGhhc2UgPSAoUGhhc2UpIGluUGhhc2UuZ2V0KGkpOwotICAgICAgICAgICAgTGlzdCBoYW5kbGVycyA9IHBoYXNlLmdldEhhbmRsZXJzKCk7Ci0gICAgICAgICAgICBIYW5kbGVyIGhhbmRsZXIgPSAoSGFuZGxlcikgaGFuZGxlcnMuZ2V0KDApOwotICAgICAgICAgICAgaWYgKCFoMS5lcXVhbHMoaGFuZGxlcikpIHsKLSAgICAgICAgICAgICAgICBmYWlsKCJTb21lIHRoaW5nIGhhcyBnb25lIHdyb25nIGhuYWRsZXIgZG9lcyBub3QgZXhpdCBhcyBwaGFzZSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJmaXJzdCBoYW5kbGVyIHRoZSBwaGFzZSA6IgotICAgICAgICAgICAgICAgICAgICAgICAgKyBwaGFzZS5nZXRQaGFzZU5hbWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGhhc2VSdWxlc1dpdGhBZnRlcigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvL1RPRE8gZml4IG1lCi0gICAgICAgIGF4aXNDb25maWcgPSBuZXcgQXhpc0NvbmZpZ3VyYXRpb24oKTsKLSAgICAgICAgTGlzdCBpblBoYXNlID0gYXhpc0NvbmZpZy5nZXRJbkZsb3dQaGFzZXMoKTsKLSAgICAgICAgUGhhc2UgdHJhbnNwb3J0SU4gPSBuZXcgUGhhc2UoIlRyYW5zcG9ydEluIik7Ci0gICAgICAgIFBoYXNlIHByZURpc3BhdGNoID0gbmV3IFBoYXNlKCJQcmVEaXNwYXRjaCIpOwotICAgICAgICBEaXNwYXRjaFBoYXNlIGRpc3BhdGNoUGhhc2UgPSBuZXcgRGlzcGF0Y2hQaGFzZSgpOwotLy8KLSAgICAgICAgZGlzcGF0Y2hQaGFzZS5zZXROYW1lKCJEaXNwYXRjaCIpOwotICAgICAgICBpblBoYXNlLmFkZCh0cmFuc3BvcnRJTik7Ci0gICAgICAgIGluUGhhc2UuYWRkKHByZURpc3BhdGNoKTsKLSAgICAgICAgaW5QaGFzZS5hZGQoZGlzcGF0Y2hQaGFzZSk7Ci0KLSAgICAgICAgSGFuZGxlckRlc2NyaXB0aW9uIGhtID0gbmV3IEhhbmRsZXJEZXNjcmlwdGlvbigpOwotICAgICAgICBobS5zZXRDbGFzc05hbWUoIm9yZy5hcGFjaGUuYXhpczIuaGFuZGxlcnMuQWJzdHJhY3RIYW5kbGVyIik7Ci0gICAgICAgIEhhbmRsZXIgaDEgPSBuZXcgUGhhc2VSdWxlSGFuZGxlcigpOwotICAgICAgICBobS5zZXRIYW5kbGVyKGgxKTsKLSAgICAgICAgaG0uZ2V0UnVsZXMoKS5zZXRQaGFzZU5hbWUoIioiKTsKLSAgICAgICAgaG0uZ2V0UnVsZXMoKS5zZXRQaGFzZUZpcnN0KHRydWUpOwotCi0gICAgICAgIFBoYXNlSG9sZGVyIHBoID0gbmV3IFBoYXNlSG9sZGVyKGluUGhhc2UpOwotICAgICAgICBwaC5hZGRIYW5kbGVyKGhtKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpblBoYXNlLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBQaGFzZSBwaGFzZSA9IChQaGFzZSkgaW5QaGFzZS5nZXQoaSk7Ci0gICAgICAgICAgICBMaXN0IGhhbmRsZXJzID0gcGhhc2UuZ2V0SGFuZGxlcnMoKTsKLSAgICAgICAgICAgIEhhbmRsZXIgaGFuZGxlciA9IChIYW5kbGVyKSBoYW5kbGVycy5nZXQoMCk7Ci0gICAgICAgICAgICBhc3NlcnROdWxsKGhhbmRsZXIuZ2V0SGFuZGxlckRlc2MoKS5nZXRSdWxlcygpLmdldEFmdGVyKCkpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9waGFzZXJ1bGUvUGhhc2VSdWxlSGFuZGxlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9waGFzZXJ1bGUvUGhhc2VSdWxlSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODEzMDcwLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvcGhhc2VydWxlL1BoYXNlUnVsZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5waGFzZXJ1bGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5IYW5kbGVyRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5oYW5kbGVycy5BYnN0cmFjdEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBQaGFzZVJ1bGVIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coUGhhc2VSdWxlSGFuZGxlci5jbGFzcyk7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQotICAgIHB1YmxpYyBQaGFzZVJ1bGVIYW5kbGVyKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBQaGFzZVJ1bGVIYW5kbGVyKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIEludm9jYXRpb25SZXNwb25zZSBpbnZva2UoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIGxvZy5pbmZvKCJJIGFtICIgKyBuYW1lICsgIiBIYW5kbGVyIFJ1bm5pbmcgOikiKTsKLSAgICAgICAgcmV0dXJuIEludm9jYXRpb25SZXNwb25zZS5DT05USU5VRTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZXZva2UoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgewotICAgICAgICBsb2cuaW5mbygiSSBhbSAiICsgbmFtZSArICIgSGFuZGxlciBSdW5uaW5nIDopIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGluaXQoSGFuZGxlckRlc2NyaXB0aW9uIGhhbmRsZXJkZXNjKSB7Ci0gICAgICAgIHN1cGVyLmluaXQoaGFuZGxlcmRlc2MpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvcGhhc2VydWxlL1BoYXNlUnVsZVRlc3RzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3BoYXNlcnVsZS9QaGFzZVJ1bGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjRjMWM1Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvcGhhc2VydWxlL1BoYXNlUnVsZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OTAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnBoYXNlcnVsZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkhhbmRsZXJEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlBoYXNlUnVsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5EaXNwYXRjaFBoYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuUGhhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5waGFzZXJlc29sdmVyLlBoYXNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucGhhc2VyZXNvbHZlci5QaGFzZUhvbGRlcjsKLQotLyoqCi0gKiBUZXN0IHZhcmlvdXMgUGhhc2VSdWxlIGNvbmZpZ3VyYXRpb25zCi0gKi8KLXB1YmxpYyBjbGFzcyBQaGFzZVJ1bGVUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIC8vIFNvbWUgc2hhcmVkIEhhbmRsZXJzIGFuZCBIYW5kbGVyRGVzY3JpcHRpb25zCi0gICAgLy8gVE9ETyA6IEZhY3RvciBvdXQgc2hhcmVkIGRhdGEgZm9yIHRoZXNlIHRlc3RzCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QmVmb3JlKCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIEFycmF5TGlzdCBwaGFzZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIFBoYXNlIHAxID0gbmV3IFBoYXNlKCJQaGFzZUEiKTsKLSAgICAgICAgcGhhc2VzLmFkZChwMSk7Ci0gICAgICAgIFBoYXNlIHAyID0gbmV3IFBoYXNlKCJQaGFzZUIiKTsKLSAgICAgICAgcGhhc2VzLmFkZChwMik7Ci0KLSAgICAgICAgTWVzc2FnZUNvbnRleHQgbXNnID0KLSAgICAgICAgICAgICAgICBuZXcgQ29uZmlndXJhdGlvbkNvbnRleHQobmV3IEF4aXNDb25maWd1cmF0aW9uKCkpLmNyZWF0ZU1lc3NhZ2VDb250ZXh0KCk7Ci0KLSAgICAgICAgUGhhc2VIb2xkZXIgcGggPSBuZXcgUGhhc2VIb2xkZXIocGhhc2VzKTsKLSAgICAgICAgSGFuZGxlckRlc2NyaXB0aW9uIGhtID0gbmV3IEhhbmRsZXJEZXNjcmlwdGlvbigpOwotICAgICAgICBobS5zZXRDbGFzc05hbWUoIm9yZy5hcGFjaGUuYXhpczIucGhhc2VydWxlLlBoYXNlUnVsZUhhbmRsZXIiKTsKLSAgICAgICAgSGFuZGxlciBoMSA9IG5ldyBQaGFzZVJ1bGVIYW5kbGVyKCk7Ci0gICAgICAgIGgxLmluaXQoaG0pOwotICAgICAgICAoKFBoYXNlUnVsZUhhbmRsZXIpIGgxKS5zZXROYW1lKCJGaXJzdCIpOwotICAgICAgICBobS5zZXRIYW5kbGVyKGgxKTsKLSAgICAgICAgaG0uc2V0TmFtZSgiSDEiKTsKLSAgICAgICAgUGhhc2VSdWxlIHJ1bGUgPSBuZXcgUGhhc2VSdWxlKCk7Ci0gICAgICAgIHJ1bGUuc2V0UGhhc2VOYW1lKCJQaGFzZUEiKTsKLSAgICAgICAgaG0uc2V0UnVsZXMocnVsZSk7Ci0gICAgICAgIHBoLmFkZEhhbmRsZXIoaG0pOwotCi0gICAgICAgIEhhbmRsZXJEZXNjcmlwdGlvbiBobTEgPSBuZXcgSGFuZGxlckRlc2NyaXB0aW9uKCk7Ci0gICAgICAgIGhtMS5zZXRDbGFzc05hbWUoIm9yZy5hcGFjaGUuYXhpczIucGhhc2VydWxlLlBoYXNlUnVsZUhhbmRsZXIiKTsKLSAgICAgICAgSGFuZGxlciBoMiA9IG5ldyBQaGFzZVJ1bGVIYW5kbGVyKCk7Ci0gICAgICAgICgoUGhhc2VSdWxlSGFuZGxlcikgaDIpLnNldE5hbWUoIlNlY29uZCIpOwotICAgICAgICBoMi5pbml0KGhtMSk7Ci0gICAgICAgIGhtMS5zZXRIYW5kbGVyKGgyKTsKLSAgICAgICAgaG0xLnNldE5hbWUoIkgyIik7Ci0gICAgICAgIFBoYXNlUnVsZSBydWxlMSA9IG5ldyBQaGFzZVJ1bGUoKTsKLSAgICAgICAgcnVsZTEuc2V0UGhhc2VOYW1lKCJQaGFzZUEiKTsKLSAgICAgICAgcnVsZTEuc2V0QmVmb3JlKCJIMSIpOwotICAgICAgICBobTEuc2V0UnVsZXMocnVsZTEpOwotICAgICAgICBwaC5hZGRIYW5kbGVyKGhtMSk7Ci0KLSAgICAgICAgTGlzdCBoYW5kbGVycyA9IHAxLmdldEhhbmRsZXJzKCk7Ci0gICAgICAgIEhhbmRsZXIgaGFuZGxlciA9IChIYW5kbGVyKSBoYW5kbGVycy5nZXQoMCk7Ci0gICAgICAgIGlmIChoYW5kbGVyICE9IGgyKSB7Ci0gICAgICAgICAgICBmYWlsKCJDb21wdXRlZCBIbmFkbGVyIG9yZGVyIGlzIHdyb25nICIpOwotICAgICAgICB9Ci0gICAgICAgIGhhbmRsZXIgPSAoSGFuZGxlcikgaGFuZGxlcnMuZ2V0KDEpOwotICAgICAgICBpZiAoaGFuZGxlciAhPSBoMSkgewotICAgICAgICAgICAgZmFpbCgiQ29tcHV0ZWQgSG5hZGxlciBvcmRlciBpcyB3cm9uZyAiKTsKLSAgICAgICAgfQotICAgICAgICBwMS5pbnZva2UobXNnKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QmVmb3Jld2l0aE5vRmlyc3QoKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgQXJyYXlMaXN0IHBoYXNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgUGhhc2UgcDEgPSBuZXcgUGhhc2UoIlBoYXNlQSIpOwotICAgICAgICBwaGFzZXMuYWRkKHAxKTsKLSAgICAgICAgUGhhc2UgcDIgPSBuZXcgUGhhc2UoIlBoYXNlQiIpOwotICAgICAgICBwaGFzZXMuYWRkKHAyKTsKLQotICAgICAgICBNZXNzYWdlQ29udGV4dCBtc2cgPQotICAgICAgICAgICAgICAgIG5ldyBDb25maWd1cmF0aW9uQ29udGV4dChuZXcgQXhpc0NvbmZpZ3VyYXRpb24oKSkuY3JlYXRlTWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgUGhhc2VIb2xkZXIgcGggPSBuZXcgUGhhc2VIb2xkZXIocGhhc2VzKTsKLQotCi0gICAgICAgIEhhbmRsZXJEZXNjcmlwdGlvbiBobTEgPSBuZXcgSGFuZGxlckRlc2NyaXB0aW9uKCk7Ci0gICAgICAgIGhtMS5zZXRDbGFzc05hbWUoIm9yZy5hcGFjaGUuYXhpczIucGhhc2VydWxlLlBoYXNlUnVsZUhhbmRsZXIiKTsKLSAgICAgICAgSGFuZGxlciBoMiA9IG5ldyBQaGFzZVJ1bGVIYW5kbGVyKCk7Ci0gICAgICAgICgoUGhhc2VSdWxlSGFuZGxlcikgaDIpLnNldE5hbWUoIlNlY29uZCIpOwotICAgICAgICBoMi5pbml0KGhtMSk7Ci0gICAgICAgIGhtMS5zZXRIYW5kbGVyKGgyKTsKLSAgICAgICAgaG0xLnNldE5hbWUoIkgyIik7Ci0gICAgICAgIFBoYXNlUnVsZSBydWxlMSA9IG5ldyBQaGFzZVJ1bGUoKTsKLSAgICAgICAgcnVsZTEuc2V0UGhhc2VOYW1lKCJQaGFzZUEiKTsKLSAgICAgICAgcnVsZTEuc2V0QmVmb3JlKCJIMSIpOwotICAgICAgICBobTEuc2V0UnVsZXMocnVsZTEpOwotICAgICAgICBwaC5hZGRIYW5kbGVyKGhtMSk7Ci0KLSAgICAgICAgSGFuZGxlckRlc2NyaXB0aW9uIGhtID0gbmV3IEhhbmRsZXJEZXNjcmlwdGlvbigpOwotICAgICAgICBobS5zZXRDbGFzc05hbWUoIm9yZy5hcGFjaGUuYXhpczIucGhhc2VydWxlLlBoYXNlUnVsZUhhbmRsZXIiKTsKLSAgICAgICAgSGFuZGxlciBoMSA9IG5ldyBQaGFzZVJ1bGVIYW5kbGVyKCk7Ci0gICAgICAgIGgxLmluaXQoaG0pOwotICAgICAgICAoKFBoYXNlUnVsZUhhbmRsZXIpIGgxKS5zZXROYW1lKCJGaXJzdCIpOwotICAgICAgICBobS5zZXRIYW5kbGVyKGgxKTsKLSAgICAgICAgaG0uc2V0TmFtZSgiSDEiKTsKLSAgICAgICAgUGhhc2VSdWxlIHJ1bGUgPSBuZXcgUGhhc2VSdWxlKCk7Ci0gICAgICAgIHJ1bGUuc2V0UGhhc2VOYW1lKCJQaGFzZUEiKTsKLSAgICAgICAgaG0uc2V0UnVsZXMocnVsZSk7Ci0gICAgICAgIHBoLmFkZEhhbmRsZXIoaG0pOwotCi0gICAgICAgIExpc3QgaGFuZGxlcnMgPSBwMS5nZXRIYW5kbGVycygpOwotICAgICAgICBIYW5kbGVyIGhhbmRsZXIgPSAoSGFuZGxlcikgaGFuZGxlcnMuZ2V0KDApOwotICAgICAgICBpZiAoaGFuZGxlciAhPSBoMikgewotICAgICAgICAgICAgZmFpbCgiQ29tcHV0ZWQgSGFuZGxlciBvcmRlciBpcyB3cm9uZyAiKTsKLSAgICAgICAgfQotICAgICAgICBoYW5kbGVyID0gKEhhbmRsZXIpIGhhbmRsZXJzLmdldCgxKTsKLSAgICAgICAgaWYgKGhhbmRsZXIgIT0gaDEpIHsKLSAgICAgICAgICAgIGZhaWwoIkNvbXB1dGVkIEhhbmRsZXIgb3JkZXIgaXMgd3JvbmcgIik7Ci0gICAgICAgIH0KLSAgICAgICAgcDEuaW52b2tlKG1zZyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEJlZm9yZUFmdGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEFycmF5TGlzdCBwaGFzZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIFBoYXNlIHAxID0gbmV3IFBoYXNlKCJQaGFzZUEiKTsKLSAgICAgICAgcGhhc2VzLmFkZChwMSk7Ci0gICAgICAgIFBoYXNlIHAyID0gbmV3IFBoYXNlKCJQaGFzZUIiKTsKLSAgICAgICAgcGhhc2VzLmFkZChwMik7Ci0KLSAgICAgICAgUGhhc2VIb2xkZXIgcGggPSBuZXcgUGhhc2VIb2xkZXIocGhhc2VzKTsKLSAgICAgICAgSGFuZGxlckRlc2NyaXB0aW9uIGhtID0gbmV3IEhhbmRsZXJEZXNjcmlwdGlvbigpOwotICAgICAgICBobS5zZXRDbGFzc05hbWUoIm9yZy5hcGFjaGUuYXhpczIucGhhc2VydWxlLlBoYXNlUnVsZUhhbmRsZXIiKTsKLSAgICAgICAgUGhhc2VSdWxlSGFuZGxlciBoMSA9IG5ldyBQaGFzZVJ1bGVIYW5kbGVyKCk7Ci0gICAgICAgIGgxLmluaXQoaG0pOwotICAgICAgICBoMS5zZXROYW1lKCJGaXJzdCIpOwotICAgICAgICBobS5zZXRIYW5kbGVyKGgxKTsKLSAgICAgICAgaG0uc2V0TmFtZSgiSDEiKTsKLSAgICAgICAgUGhhc2VSdWxlIHJ1bGUgPSBuZXcgUGhhc2VSdWxlKCk7Ci0gICAgICAgIHJ1bGUuc2V0UGhhc2VOYW1lKCJQaGFzZUEiKTsKLSAgICAgICAgaG0uc2V0UnVsZXMocnVsZSk7Ci0gICAgICAgIHBoLmFkZEhhbmRsZXIoaG0pOwotCi0gICAgICAgIEhhbmRsZXJEZXNjcmlwdGlvbiBobTEgPSBuZXcgSGFuZGxlckRlc2NyaXB0aW9uKCk7Ci0gICAgICAgIGhtMS5zZXRDbGFzc05hbWUoIm9yZy5hcGFjaGUuYXhpczIucGhhc2VydWxlLlBoYXNlUnVsZUhhbmRsZXIiKTsKLSAgICAgICAgSGFuZGxlciBoMiA9IG5ldyBQaGFzZVJ1bGVIYW5kbGVyKCk7Ci0gICAgICAgICgoUGhhc2VSdWxlSGFuZGxlcikgaDIpLnNldE5hbWUoIkZvcnRoIik7Ci0gICAgICAgIGgyLmluaXQoaG0xKTsKLSAgICAgICAgaG0xLnNldEhhbmRsZXIoaDIpOwotICAgICAgICBobTEuc2V0TmFtZSgiSDIiKTsKLSAgICAgICAgUGhhc2VSdWxlIHJ1bGUxID0gbmV3IFBoYXNlUnVsZSgpOwotICAgICAgICBydWxlMS5zZXRQaGFzZU5hbWUoIlBoYXNlQSIpOwotICAgICAgICBobTEuc2V0UnVsZXMocnVsZTEpOwotICAgICAgICBwaC5hZGRIYW5kbGVyKGhtMSk7Ci0KLQotICAgICAgICBIYW5kbGVyRGVzY3JpcHRpb24gaG0zID0gbmV3IEhhbmRsZXJEZXNjcmlwdGlvbigpOwotICAgICAgICBobTMuc2V0Q2xhc3NOYW1lKCJvcmcuYXBhY2hlLmF4aXMyLnBoYXNlcnVsZS5QaGFzZVJ1bGVIYW5kbGVyIik7Ci0gICAgICAgIEhhbmRsZXIgaDMgPSBuZXcgUGhhc2VSdWxlSGFuZGxlcigpOwotICAgICAgICAoKFBoYXNlUnVsZUhhbmRsZXIpIGgzKS5zZXROYW1lKCJTZWNvbmQiKTsKLSAgICAgICAgaDMuaW5pdChobTMpOwotICAgICAgICBobTMuc2V0SGFuZGxlcihoMyk7Ci0gICAgICAgIGhtMy5zZXROYW1lKCJIMyIpOwotICAgICAgICBQaGFzZVJ1bGUgcnVsZTMgPSBuZXcgUGhhc2VSdWxlKCk7Ci0gICAgICAgIHJ1bGUzLnNldFBoYXNlTmFtZSgiUGhhc2VBIik7Ci0gICAgICAgIHJ1bGUzLnNldEFmdGVyKCJIMSIpOwotICAgICAgICBobTMuc2V0UnVsZXMocnVsZTMpOwotICAgICAgICBwaC5hZGRIYW5kbGVyKGhtMyk7Ci0KLSAgICAgICAgSGFuZGxlckRlc2NyaXB0aW9uIGhtNCA9IG5ldyBIYW5kbGVyRGVzY3JpcHRpb24oKTsKLSAgICAgICAgaG00LnNldENsYXNzTmFtZSgib3JnLmFwYWNoZS5heGlzMi5waGFzZXJ1bGUuUGhhc2VSdWxlSGFuZGxlciIpOwotICAgICAgICBIYW5kbGVyIGg0ID0gbmV3IFBoYXNlUnVsZUhhbmRsZXIoKTsKLSAgICAgICAgKChQaGFzZVJ1bGVIYW5kbGVyKSBoNCkuc2V0TmFtZSgiVGhpcmQiKTsKLSAgICAgICAgaDQuaW5pdChobTQpOwotICAgICAgICBobTQuc2V0SGFuZGxlcihoNCk7Ci0gICAgICAgIGhtNC5zZXROYW1lKCJINCIpOwotICAgICAgICBQaGFzZVJ1bGUgcnVsZTQgPSBuZXcgUGhhc2VSdWxlKCk7Ci0gICAgICAgIHJ1bGU0LnNldFBoYXNlTmFtZSgiUGhhc2VBIik7Ci0gICAgICAgIHJ1bGU0LnNldEFmdGVyKCJIMSIpOwotICAgICAgICBydWxlNC5zZXRCZWZvcmUoIkgyIik7Ci0gICAgICAgIGhtNC5zZXRSdWxlcyhydWxlNCk7Ci0gICAgICAgIHBoLmFkZEhhbmRsZXIoaG00KTsKLQotICAgICAgICBMaXN0IGhhbmRsZXJzID0gcDEuZ2V0SGFuZGxlcnMoKTsKLSAgICAgICAgYm9vbGVhbiBmb3VuZEgxID0gZmFsc2U7Ci0gICAgICAgIGJvb2xlYW4gZm91bmRINCA9IGZhbHNlOwotCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBoYW5kbGVycy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBIYW5kbGVyIGhhbmRsZXIgPSAoSGFuZGxlcikgaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgaWYgKGgzID09IGhhbmRsZXIpIHsKLSAgICAgICAgICAgICAgICBpZiAoIWZvdW5kSDEpCi0gICAgICAgICAgICAgICAgICAgIGZhaWwoIkgzIGZvdW5kIGJlZm9yZSBIMSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGgxID09IGhhbmRsZXIpCi0gICAgICAgICAgICAgICAgZm91bmRIMSA9IHRydWU7Ci0gICAgICAgICAgICBpZiAoaDIgPT0gaGFuZGxlcikgewotICAgICAgICAgICAgICAgIGlmICghZm91bmRINCkgewotICAgICAgICAgICAgICAgICAgICBmYWlsKCJIMiBmb3VuZCBiZWZvcmUgSDQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoaDQgPT0gaGFuZGxlcikgewotICAgICAgICAgICAgICAgIGlmICghZm91bmRIMSkgewotICAgICAgICAgICAgICAgICAgICBmYWlsKCJINCBmb3VuZCBiZWZvcmUgSDEiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZm91bmRINCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGhhc2VGaXJzdCgpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBBcnJheUxpc3QgcGhhc2VzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBQaGFzZSBwMSA9IG5ldyBQaGFzZSgiUGhhc2VBIik7Ci0gICAgICAgIHBoYXNlcy5hZGQocDEpOwotICAgICAgICBQaGFzZSBwMiA9IG5ldyBQaGFzZSgiUGhhc2VCIik7Ci0gICAgICAgIHBoYXNlcy5hZGQocDIpOwotICAgICAgICBQaGFzZUhvbGRlciBwaCA9IG5ldyBQaGFzZUhvbGRlcihwaGFzZXMpOwotICAgICAgICBIYW5kbGVyRGVzY3JpcHRpb24gaG0gPSBuZXcgSGFuZGxlckRlc2NyaXB0aW9uKCk7Ci0gICAgICAgIGhtLnNldENsYXNzTmFtZSgib3JnLmFwYWNoZS5heGlzMi5waGFzZXJ1bGUuUGhhc2VSdWxlSGFuZGxlciIpOwotICAgICAgICBIYW5kbGVyIGgxID0gbmV3IFBoYXNlUnVsZUhhbmRsZXIoKTsKLSAgICAgICAgaDEuaW5pdChobSk7Ci0gICAgICAgICgoUGhhc2VSdWxlSGFuZGxlcikgaDEpLnNldE5hbWUoIlBoYXNlRmlyc3RIYW5kbGVyIik7Ci0gICAgICAgIGhtLnNldEhhbmRsZXIoaDEpOwotICAgICAgICBobS5zZXROYW1lKCJIMSIpOwotICAgICAgICBQaGFzZVJ1bGUgcnVsZSA9IG5ldyBQaGFzZVJ1bGUoKTsKLSAgICAgICAgcnVsZS5zZXRQaGFzZU5hbWUoIlBoYXNlQSIpOwotICAgICAgICBydWxlLnNldFBoYXNlRmlyc3QodHJ1ZSk7Ci0gICAgICAgIGhtLnNldFJ1bGVzKHJ1bGUpOwotICAgICAgICBwaC5hZGRIYW5kbGVyKGhtKTsKLQotICAgICAgICBIYW5kbGVyRGVzY3JpcHRpb24gaG0xID0gbmV3IEhhbmRsZXJEZXNjcmlwdGlvbigpOwotICAgICAgICBobTEuc2V0Q2xhc3NOYW1lKCJvcmcuYXBhY2hlLmF4aXMyLnBoYXNlcnVsZS5QaGFzZVJ1bGVIYW5kbGVyIik7Ci0gICAgICAgIEhhbmRsZXIgaDIgPSBuZXcgUGhhc2VSdWxlSGFuZGxlcigpOwotICAgICAgICAoKFBoYXNlUnVsZUhhbmRsZXIpIGgyKS5zZXROYW1lKCJTZWNvbmQgSGFuZGxlciIpOwotICAgICAgICBoMi5pbml0KGhtMSk7Ci0gICAgICAgIGhtMS5zZXRIYW5kbGVyKGgyKTsKLSAgICAgICAgaG0xLnNldE5hbWUoIkgyIik7Ci0gICAgICAgIFBoYXNlUnVsZSBydWxlMSA9IG5ldyBQaGFzZVJ1bGUoKTsKLSAgICAgICAgcnVsZTEuc2V0UGhhc2VOYW1lKCJQaGFzZUEiKTsKLSAgICAgICAgcnVsZTEuc2V0QmVmb3JlKCJIMSIpOwotICAgICAgICBobTEuc2V0UnVsZXMocnVsZTEpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcGguYWRkSGFuZGxlcihobTEpOwotICAgICAgICB9IGNhdGNoIChQaGFzZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgZmFpbCgiU3VjY2VlZGVkIGluIGRlcGxveWluZyBhZnRlciBQaGFzZUZpcnN0IGhhbmRsZXIhIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBoYXNlTGFzdCgpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBBcnJheUxpc3QgcGhhc2VzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBQaGFzZSBwMSA9IG5ldyBQaGFzZSgiUGhhc2VBIik7Ci0gICAgICAgIHBoYXNlcy5hZGQocDEpOwotICAgICAgICBQaGFzZSBwMiA9IG5ldyBQaGFzZSgiUGhhc2VCIik7Ci0gICAgICAgIHBoYXNlcy5hZGQocDIpOwotCi0gICAgICAgIFBoYXNlSG9sZGVyIHBoID0gbmV3IFBoYXNlSG9sZGVyKHBoYXNlcyk7Ci0gICAgICAgIEhhbmRsZXJEZXNjcmlwdGlvbiBobSA9IG5ldyBIYW5kbGVyRGVzY3JpcHRpb24oKTsKLSAgICAgICAgaG0uc2V0Q2xhc3NOYW1lKCJvcmcuYXBhY2hlLmF4aXMyLnBoYXNlcnVsZS5QaGFzZVJ1bGVIYW5kbGVyIik7Ci0gICAgICAgIEhhbmRsZXIgaDEgPSBuZXcgUGhhc2VSdWxlSGFuZGxlcigpOwotICAgICAgICBoMS5pbml0KGhtKTsKLSAgICAgICAgKChQaGFzZVJ1bGVIYW5kbGVyKSBoMSkuc2V0TmFtZSgiUGhhc2VMYXN0Iik7Ci0gICAgICAgIGhtLnNldEhhbmRsZXIoaDEpOwotICAgICAgICBobS5zZXROYW1lKCJIMSIpOwotICAgICAgICBQaGFzZVJ1bGUgcnVsZSA9IG5ldyBQaGFzZVJ1bGUoKTsKLSAgICAgICAgcnVsZS5zZXRQaGFzZU5hbWUoIlBoYXNlQSIpOwotICAgICAgICBydWxlLnNldFBoYXNlTGFzdCh0cnVlKTsKLSAgICAgICAgaG0uc2V0UnVsZXMocnVsZSk7Ci0gICAgICAgIHBoLmFkZEhhbmRsZXIoaG0pOwotCi0gICAgICAgIEhhbmRsZXJEZXNjcmlwdGlvbiBobTEgPSBuZXcgSGFuZGxlckRlc2NyaXB0aW9uKCk7Ci0gICAgICAgIGhtMS5zZXRDbGFzc05hbWUoIm9yZy5hcGFjaGUuYXhpczIucGhhc2VydWxlLlBoYXNlUnVsZUhhbmRsZXIiKTsKLSAgICAgICAgSGFuZGxlciBoMiA9IG5ldyBQaGFzZVJ1bGVIYW5kbGVyKCk7Ci0gICAgICAgICgoUGhhc2VSdWxlSGFuZGxlcikgaDIpLnNldE5hbWUoIlNlY29uZCBIYW5kbGVyIik7Ci0gICAgICAgIGgyLmluaXQoaG0xKTsKLSAgICAgICAgaG0xLnNldEhhbmRsZXIoaDIpOwotICAgICAgICBobTEuc2V0TmFtZSgiSDIiKTsKLSAgICAgICAgUGhhc2VSdWxlIHJ1bGUxID0gbmV3IFBoYXNlUnVsZSgpOwotICAgICAgICBydWxlMS5zZXRQaGFzZU5hbWUoIlBoYXNlQSIpOwotICAgICAgICBydWxlMS5zZXRBZnRlcigiSDEiKTsKLSAgICAgICAgaG0xLnNldFJ1bGVzKHJ1bGUxKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHBoLmFkZEhhbmRsZXIoaG0xKTsKLSAgICAgICAgfSBjYXRjaCAoUGhhc2VFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGZhaWwoIlN1Y2NlZWRlZCBpbiBkZXBsb3lpbmcgYWZ0ZXIgUGhhc2VMYXN0IGhhbmRsZXIhIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBoYXNlUnVsZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gVE9ETyA6IFdoYXQgaXMgdGhpcyB0ZXN0aW5nIGV4YWN0bHk/Ci0gICAgCUxpc3QgaW5QaGFzZSA9IG5ldyBBeGlzQ29uZmlndXJhdGlvbigpLmdldEluRmxvd1BoYXNlcygpOwotICAgICAgICBQaGFzZSB0cmFuc3BvcnRJTiA9IG5ldyBQaGFzZSgiVHJhbnNwb3J0SW4iKTsKLSAgICAgICAgUGhhc2UgcHJlRGlzcGF0Y2ggPSBuZXcgUGhhc2UoIlByZURpc3BhdGNoIik7Ci0gICAgICAgIERpc3BhdGNoUGhhc2UgZGlzcGF0Y2hQaGFzZSA9IG5ldyBEaXNwYXRjaFBoYXNlKCk7Ci0gICAgICAgIGRpc3BhdGNoUGhhc2Uuc2V0TmFtZSgiRGlzcGF0Y2giKTsKLQotICAgICAgICBpblBoYXNlLmFkZCh0cmFuc3BvcnRJTik7Ci0gICAgICAgIGluUGhhc2UuYWRkKHByZURpc3BhdGNoKTsKLSAgICAgICAgaW5QaGFzZS5hZGQoZGlzcGF0Y2hQaGFzZSk7Ci0KLSAgICAgICAgUGhhc2VIb2xkZXIgcGggPSBuZXcgUGhhc2VIb2xkZXIoaW5QaGFzZSk7Ci0KLSAgICAgICAgSGFuZGxlckRlc2NyaXB0aW9uIGhtID0gbmV3IEhhbmRsZXJEZXNjcmlwdGlvbigpOwotICAgICAgICBobS5zZXRDbGFzc05hbWUoIm9yZy5hcGFjaGUuYXhpczIucGhhc2VydWxlLlBoYXNlUnVsZUhhbmRsZXIiKTsKLSAgICAgICAgSGFuZGxlciBoMSA9IG5ldyBQaGFzZVJ1bGVIYW5kbGVyKCk7Ci0gICAgICAgIGgxLmluaXQoaG0pOwotICAgICAgICBobS5zZXRIYW5kbGVyKGgxKTsKLSAgICAgICAgaG0uc2V0TmFtZSgiSDEiKTsKLSAgICAgICAgUGhhc2VSdWxlIHJ1bGUgPSBuZXcgUGhhc2VSdWxlKCk7Ci0gICAgICAgIHJ1bGUuc2V0UGhhc2VOYW1lKCJQcmVEaXNwYXRjaCIpOwotICAgICAgICBydWxlLnNldFBoYXNlRmlyc3QodHJ1ZSk7Ci0gICAgICAgIGhtLnNldFJ1bGVzKHJ1bGUpOwotICAgICAgICBwaC5hZGRIYW5kbGVyKGhtKTsKLQotICAgICAgICBIYW5kbGVyRGVzY3JpcHRpb24gaG0xID0gbmV3IEhhbmRsZXJEZXNjcmlwdGlvbigpOwotICAgICAgICBobTEuc2V0Q2xhc3NOYW1lKCJvcmcuYXBhY2hlLmF4aXMyLnBoYXNlcnVsZS5QaGFzZVJ1bGVIYW5kbGVyIik7Ci0gICAgICAgIEhhbmRsZXIgaDIgPSBuZXcgUGhhc2VSdWxlSGFuZGxlcigpOwotICAgICAgICBoMi5pbml0KGhtMSk7Ci0gICAgICAgIGhtMS5zZXRIYW5kbGVyKGgyKTsKLSAgICAgICAgaG0xLnNldE5hbWUoIkgyIik7Ci0gICAgICAgIFBoYXNlUnVsZSBydWxlMSA9IG5ldyBQaGFzZVJ1bGUoKTsKLSAgICAgICAgcnVsZTEuc2V0UGhhc2VOYW1lKCJQcmVEaXNwYXRjaCIpOwotICAgICAgICBydWxlMS5zZXRBZnRlcigiSDEiKTsKLSAgICAgICAgaG0xLnNldFJ1bGVzKHJ1bGUxKTsKLSAgICAgICAgcGguYWRkSGFuZGxlcihobTEpOwotCi0gICAgICAgIEhhbmRsZXJEZXNjcmlwdGlvbiBobTIgPSBuZXcgSGFuZGxlckRlc2NyaXB0aW9uKCk7Ci0gICAgICAgIGhtMi5zZXRDbGFzc05hbWUoIm9yZy5hcGFjaGUuYXhpczIucGhhc2VydWxlLlBoYXNlUnVsZUhhbmRsZXIiKTsKLSAgICAgICAgSGFuZGxlciBoMyA9IG5ldyBQaGFzZVJ1bGVIYW5kbGVyKCk7Ci0gICAgICAgIGgzLmluaXQoaG0yKTsKLSAgICAgICAgaG0yLnNldEhhbmRsZXIoaDMpOwotICAgICAgICBobTIuc2V0TmFtZSgiSDMiKTsKLSAgICAgICAgUGhhc2VSdWxlIHJ1bGUyID0gbmV3IFBoYXNlUnVsZSgpOwotICAgICAgICBydWxlMi5zZXRQaGFzZU5hbWUoIlByZURpc3BhdGNoIik7Ci0gICAgICAgIHJ1bGUyLnNldEFmdGVyKCJIMSIpOwotICAgICAgICBydWxlMi5zZXRCZWZvcmUoIkgyIik7Ci0gICAgICAgIGhtMi5zZXRSdWxlcyhydWxlMik7Ci0gICAgICAgIHBoLmFkZEhhbmRsZXIoaG0yKTsKLQotICAgICAgICBIYW5kbGVyRGVzY3JpcHRpb24gaG0zID0gbmV3IEhhbmRsZXJEZXNjcmlwdGlvbigpOwotICAgICAgICBobTMuc2V0Q2xhc3NOYW1lKCJvcmcuYXBhY2hlLmF4aXMyLnBoYXNlcnVsZS5QaGFzZVJ1bGVIYW5kbGVyIik7Ci0gICAgICAgIEhhbmRsZXIgaDQgPSBuZXcgUGhhc2VSdWxlSGFuZGxlcigpOwotICAgICAgICBoNC5pbml0KGhtMyk7Ci0gICAgICAgIGhtMy5zZXRIYW5kbGVyKGg0KTsKLSAgICAgICAgaG0zLnNldE5hbWUoIkg0Iik7Ci0gICAgICAgIFBoYXNlUnVsZSBydWxlMyA9IG5ldyBQaGFzZVJ1bGUoKTsKLSAgICAgICAgcnVsZTMuc2V0UGhhc2VOYW1lKCJEaXNwYXRjaCIpOwotICAgICAgICBobTMuc2V0UnVsZXMocnVsZTMpOwotICAgICAgICBwaC5hZGRIYW5kbGVyKGhtMyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNpbmdsZUhhbmRsZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgQXJyYXlMaXN0IHBoYXNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgUGhhc2UgcDEgPSBuZXcgUGhhc2UoIlBoYXNlQSIpOwotICAgICAgICBwaGFzZXMuYWRkKHAxKTsKLSAgICAgICAgUGhhc2UgcDIgPSBuZXcgUGhhc2UoIlBoYXNlQiIpOwotICAgICAgICBwaGFzZXMuYWRkKHAyKTsKLQotICAgICAgICBQaGFzZUhvbGRlciBwaCA9IG5ldyBQaGFzZUhvbGRlcihwaGFzZXMpOwotICAgICAgICBIYW5kbGVyRGVzY3JpcHRpb24gaG0gPSBuZXcgSGFuZGxlckRlc2NyaXB0aW9uKCk7Ci0gICAgICAgIGhtLnNldENsYXNzTmFtZSgib3JnLmFwYWNoZS5heGlzMi5waGFzZXJ1bGUuUGhhc2VSdWxlSGFuZGxlciIpOwotICAgICAgICBIYW5kbGVyIGgxID0gbmV3IFBoYXNlUnVsZUhhbmRsZXIoKTsKLSAgICAgICAgaDEuaW5pdChobSk7Ci0gICAgICAgICgoUGhhc2VSdWxlSGFuZGxlcikgaDEpLnNldE5hbWUoIlBoYXNlRmlyc3RIYW5kbGVyIik7Ci0gICAgICAgIGhtLnNldEhhbmRsZXIoaDEpOwotICAgICAgICBobS5zZXROYW1lKCJIMSIpOwotICAgICAgICBQaGFzZVJ1bGUgcnVsZSA9IG5ldyBQaGFzZVJ1bGUoKTsKLSAgICAgICAgcnVsZS5zZXRQaGFzZU5hbWUoIlBoYXNlQSIpOwotICAgICAgICBydWxlLnNldFBoYXNlRmlyc3QodHJ1ZSk7Ci0gICAgICAgIHJ1bGUuc2V0UGhhc2VMYXN0KHRydWUpOwotICAgICAgICBobS5zZXRSdWxlcyhydWxlKTsKLSAgICAgICAgcGguYWRkSGFuZGxlcihobSk7Ci0KLSAgICAgICAgSGFuZGxlckRlc2NyaXB0aW9uIGhtMSA9IG5ldyBIYW5kbGVyRGVzY3JpcHRpb24oKTsKLSAgICAgICAgaG0xLnNldENsYXNzTmFtZSgib3JnLmFwYWNoZS5heGlzMi5waGFzZXJ1bGUuUGhhc2VSdWxlSGFuZGxlciIpOwotICAgICAgICBIYW5kbGVyIGgyID0gbmV3IFBoYXNlUnVsZUhhbmRsZXIoKTsKLSAgICAgICAgKChQaGFzZVJ1bGVIYW5kbGVyKSBoMikuc2V0TmFtZSgiU2Vjb25kIEhhbmRsZXIiKTsKLSAgICAgICAgaDIuaW5pdChobTEpOwotICAgICAgICBobTEuc2V0SGFuZGxlcihoMik7Ci0gICAgICAgIGhtMS5zZXROYW1lKCJIMiIpOwotICAgICAgICBQaGFzZVJ1bGUgcnVsZTEgPSBuZXcgUGhhc2VSdWxlKCk7Ci0gICAgICAgIHJ1bGUxLnNldFBoYXNlTmFtZSgiUGhhc2VBIik7Ci0gICAgICAgIHJ1bGUxLnNldEFmdGVyKCJIMSIpOwotICAgICAgICBobTEuc2V0UnVsZXMocnVsZTEpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcGguYWRkSGFuZGxlcihobTEpOwotICAgICAgICB9IGNhdGNoIChQaGFzZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBDYXVnaHQgZXhwZWN0ZWQgRXhjZXB0aW9uCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgZmFpbCgiVGhpcyBzaG91bGQgZmFpbCB3aXRoIDogY2FuIG9ubHkgaGF2ZSBvbmUgaGFuZGxlciwgc2luY2UgdGhlcmUgaXMgYSAiICsKLSAgICAgICAgICAgICAgICAiaGFuZGxlciB3aXRoIGJvdGggcGhhc2VGaXJzdCBhbmQgUGhhc2VMYXN0IHRydWUgIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEludmFsaWRQaGFzZUZpcnN0KCkgewotICAgICAgICBBcnJheUxpc3QgcGhhc2VzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBQaGFzZSBwMSA9IG5ldyBQaGFzZSgiUGhhc2VBIik7Ci0gICAgICAgIHBoYXNlcy5hZGQocDEpOwotICAgICAgICBQaGFzZSBwMiA9IG5ldyBQaGFzZSgiUGhhc2VCIik7Ci0gICAgICAgIHBoYXNlcy5hZGQocDIpOwotCi0gICAgICAgIFBoYXNlSG9sZGVyIHBoID0gbmV3IFBoYXNlSG9sZGVyKHBoYXNlcyk7Ci0gICAgICAgIEhhbmRsZXJEZXNjcmlwdGlvbiBobSA9IG5ldyBIYW5kbGVyRGVzY3JpcHRpb24oKTsKLSAgICAgICAgaG0uc2V0Q2xhc3NOYW1lKCJvcmcuYXBhY2hlLmF4aXMyLnBoYXNlcnVsZS5QaGFzZVJ1bGVIYW5kbGVyIik7Ci0gICAgICAgIEhhbmRsZXIgaDEgPSBuZXcgUGhhc2VSdWxlSGFuZGxlcigpOwotICAgICAgICBoMS5pbml0KGhtKTsKLSAgICAgICAgKChQaGFzZVJ1bGVIYW5kbGVyKSBoMSkuc2V0TmFtZSgiUGhhc2VGaXJzdEhhbmRsZXIiKTsKLSAgICAgICAgaG0uc2V0SGFuZGxlcihoMSk7Ci0gICAgICAgIGhtLnNldE5hbWUoIkgxIik7Ci0gICAgICAgIFBoYXNlUnVsZSBydWxlID0gbmV3IFBoYXNlUnVsZSgpOwotICAgICAgICBydWxlLnNldFBoYXNlTmFtZSgiUGhhc2VBIik7Ci0gICAgICAgIHJ1bGUuc2V0UGhhc2VGaXJzdCh0cnVlKTsKLSAgICAgICAgcnVsZS5zZXRCZWZvcmUoIkgyIik7Ci0gICAgICAgIGhtLnNldFJ1bGVzKHJ1bGUpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gVGhpcyBzaG91bGQgZmFpbAotICAgICAgICAgICAgcGguYWRkSGFuZGxlcihobSk7Ci0gICAgICAgICAgICBmYWlsKCJJbmNvcnJlY3RseSBhZGRlZCBIYW5kbGVyIHdpdGggYm90aCBQaGFzZUZpcnN0IGFuZCBiZWZvcmUgbmFtZSIpOwotICAgICAgICB9IGNhdGNoIChQaGFzZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBQZXJmZWN0LCBjYXVnaHQgdGhlIGV4cGVjdGVkIEV4Y2VwdGlvbgotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEludmFsaWRQaGFzZUZpcnN0MSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEFycmF5TGlzdCBwaGFzZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICBQaGFzZSBwMSA9IG5ldyBQaGFzZSgiUGhhc2VBIik7Ci0gICAgICAgICAgICBwaGFzZXMuYWRkKHAxKTsKLSAgICAgICAgICAgIFBoYXNlIHAyID0gbmV3IFBoYXNlKCJQaGFzZUIiKTsKLSAgICAgICAgICAgIHBoYXNlcy5hZGQocDIpOwotCi0gICAgICAgICAgICBQaGFzZUhvbGRlciBwaCA9IG5ldyBQaGFzZUhvbGRlcihwaGFzZXMpOwotICAgICAgICAgICAgSGFuZGxlckRlc2NyaXB0aW9uIGhtID0gbmV3IEhhbmRsZXJEZXNjcmlwdGlvbigpOwotICAgICAgICAgICAgaG0uc2V0Q2xhc3NOYW1lKCJvcmcuYXBhY2hlLmF4aXMyLnBoYXNlcnVsZS5QaGFzZVJ1bGVIYW5kbGVyIik7Ci0gICAgICAgICAgICBIYW5kbGVyIGgxID0gbmV3IFBoYXNlUnVsZUhhbmRsZXIoKTsKLSAgICAgICAgICAgIGgxLmluaXQoaG0pOwotICAgICAgICAgICAgKChQaGFzZVJ1bGVIYW5kbGVyKSBoMSkuc2V0TmFtZSgiUGhhc2VGaXJzdEhhbmRsZXIiKTsKLSAgICAgICAgICAgIGhtLnNldEhhbmRsZXIoaDEpOwotICAgICAgICAgICAgaG0uc2V0TmFtZSgiSDEiKTsKLSAgICAgICAgICAgIFBoYXNlUnVsZSBydWxlID0gbmV3IFBoYXNlUnVsZSgpOwotICAgICAgICAgICAgcnVsZS5zZXRQaGFzZU5hbWUoIlBoYXNlQSIpOwotICAgICAgICAgICAgcnVsZS5zZXRQaGFzZUZpcnN0KHRydWUpOwotICAgICAgICAgICAgaG0uc2V0UnVsZXMocnVsZSk7Ci0gICAgICAgICAgICBwaC5hZGRIYW5kbGVyKGhtKTsKLQotICAgICAgICAgICAgSGFuZGxlckRlc2NyaXB0aW9uIGhtMSA9IG5ldyBIYW5kbGVyRGVzY3JpcHRpb24oKTsKLSAgICAgICAgICAgIGhtMS5zZXRDbGFzc05hbWUoIm9yZy5hcGFjaGUuYXhpczIucGhhc2VydWxlLlBoYXNlUnVsZUhhbmRsZXIiKTsKLSAgICAgICAgICAgIEhhbmRsZXIgaDIgPSBuZXcgUGhhc2VSdWxlSGFuZGxlcigpOwotICAgICAgICAgICAgKChQaGFzZVJ1bGVIYW5kbGVyKSBoMikuc2V0TmFtZSgiU2Vjb25kIEhhbmRsZXIiKTsKLSAgICAgICAgICAgIGgyLmluaXQoaG0xKTsKLSAgICAgICAgICAgIGhtMS5zZXRIYW5kbGVyKGgyKTsKLSAgICAgICAgICAgIGhtMS5zZXROYW1lKCJIMiIpOwotICAgICAgICAgICAgUGhhc2VSdWxlIHJ1bGUxID0gbmV3IFBoYXNlUnVsZSgpOwotICAgICAgICAgICAgcnVsZTEuc2V0UGhhc2VOYW1lKCJQaGFzZUEiKTsKLSAgICAgICAgICAgIHJ1bGUxLnNldFBoYXNlRmlyc3QodHJ1ZSk7Ci0gICAgICAgICAgICBobTEuc2V0UnVsZXMocnVsZTEpOwotICAgICAgICAgICAgcGguYWRkSGFuZGxlcihobTEpOwotICAgICAgICAgICAgZmFpbCgiVGhpcyBzaG91bGQgYmUgZmFpbGQgd2l0aCBQaGFzZUZpcnN0IGFscmVhZHkgaGFzIGJlZW4gc2V0LCBjYW5ub3QgaGF2ZSB0d28gIiArCi0gICAgICAgICAgICAgICAgICAgICJwaGFzZUZpcnN0IEhhbmRsZXIgZm9yIHNhbWUgcGhhc2UgIik7Ci0gICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBheGlzRmF1bHQpIHsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQaGFzZUxhc3RFcnJvcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgQXJyYXlMaXN0IHBoYXNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgUGhhc2UgcDEgPSBuZXcgUGhhc2UoIlBoYXNlQSIpOwotICAgICAgICBwaGFzZXMuYWRkKHAxKTsKLSAgICAgICAgUGhhc2UgcDIgPSBuZXcgUGhhc2UoIlBoYXNlQiIpOwotICAgICAgICBwaGFzZXMuYWRkKHAyKTsKLQotICAgICAgICBQaGFzZUhvbGRlciBwaCA9IG5ldyBQaGFzZUhvbGRlcihwaGFzZXMpOwotICAgICAgICBIYW5kbGVyRGVzY3JpcHRpb24gaG0gPSBuZXcgSGFuZGxlckRlc2NyaXB0aW9uKCk7Ci0gICAgICAgIGhtLnNldENsYXNzTmFtZSgib3JnLmFwYWNoZS5heGlzMi5waGFzZXJ1bGUuUGhhc2VSdWxlSGFuZGxlciIpOwotICAgICAgICBIYW5kbGVyIGgxID0gbmV3IFBoYXNlUnVsZUhhbmRsZXIoKTsKLSAgICAgICAgaDEuaW5pdChobSk7Ci0gICAgICAgICgoUGhhc2VSdWxlSGFuZGxlcikgaDEpLnNldE5hbWUoIlBoYXNlRmlyc3RIYW5kbGVyIik7Ci0gICAgICAgIGhtLnNldEhhbmRsZXIoaDEpOwotICAgICAgICBobS5zZXROYW1lKCJIMSIpOwotICAgICAgICBQaGFzZVJ1bGUgcnVsZSA9IG5ldyBQaGFzZVJ1bGUoKTsKLSAgICAgICAgcnVsZS5zZXRQaGFzZU5hbWUoIlBoYXNlQSIpOwotICAgICAgICBydWxlLnNldFBoYXNlTGFzdCh0cnVlKTsKLSAgICAgICAgcnVsZS5zZXRCZWZvcmUoIkgyIik7Ci0gICAgICAgIGhtLnNldFJ1bGVzKHJ1bGUpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcGguYWRkSGFuZGxlcihobSk7Ci0gICAgICAgIH0gY2F0Y2ggKFBoYXNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGZhaWwoIkhhbmRsZXIgd2l0aCBQaGFzZUxhc3QgY2Fubm90IGFsc28gaGF2ZSBiZWZvcmUvYWZ0ZXIgc2V0Iik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEludmFsaWRQaGFzZUxhc3QoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBBcnJheUxpc3QgcGhhc2VzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgUGhhc2UgcDEgPSBuZXcgUGhhc2UoIlBoYXNlQSIpOwotICAgICAgICAgICAgcGhhc2VzLmFkZChwMSk7Ci0gICAgICAgICAgICBQaGFzZSBwMiA9IG5ldyBQaGFzZSgiUGhhc2VCIik7Ci0gICAgICAgICAgICBwaGFzZXMuYWRkKHAyKTsKLQotICAgICAgICAgICAgUGhhc2VIb2xkZXIgcGggPSBuZXcgUGhhc2VIb2xkZXIocGhhc2VzKTsKLSAgICAgICAgICAgIEhhbmRsZXJEZXNjcmlwdGlvbiBobSA9IG5ldyBIYW5kbGVyRGVzY3JpcHRpb24oKTsKLSAgICAgICAgICAgIGhtLnNldENsYXNzTmFtZSgib3JnLmFwYWNoZS5heGlzMi5waGFzZXJ1bGUuUGhhc2VSdWxlSGFuZGxlciIpOwotICAgICAgICAgICAgSGFuZGxlciBoMSA9IG5ldyBQaGFzZVJ1bGVIYW5kbGVyKCk7Ci0gICAgICAgICAgICBoMS5pbml0KGhtKTsKLSAgICAgICAgICAgICgoUGhhc2VSdWxlSGFuZGxlcikgaDEpLnNldE5hbWUoIlBoYXNlTGFzdCIpOwotICAgICAgICAgICAgaG0uc2V0SGFuZGxlcihoMSk7Ci0gICAgICAgICAgICBobS5zZXROYW1lKCJIMSIpOwotICAgICAgICAgICAgUGhhc2VSdWxlIHJ1bGUgPSBuZXcgUGhhc2VSdWxlKCk7Ci0gICAgICAgICAgICBydWxlLnNldFBoYXNlTmFtZSgiUGhhc2VBIik7Ci0gICAgICAgICAgICBydWxlLnNldFBoYXNlTGFzdCh0cnVlKTsKLSAgICAgICAgICAgIGhtLnNldFJ1bGVzKHJ1bGUpOwotICAgICAgICAgICAgcGguYWRkSGFuZGxlcihobSk7Ci0KLSAgICAgICAgICAgIEhhbmRsZXJEZXNjcmlwdGlvbiBobTEgPSBuZXcgSGFuZGxlckRlc2NyaXB0aW9uKCk7Ci0gICAgICAgICAgICBobTEuc2V0Q2xhc3NOYW1lKCJvcmcuYXBhY2hlLmF4aXMyLnBoYXNlcnVsZS5QaGFzZVJ1bGVIYW5kbGVyIik7Ci0gICAgICAgICAgICBIYW5kbGVyIGgyID0gbmV3IFBoYXNlUnVsZUhhbmRsZXIoKTsKLSAgICAgICAgICAgICgoUGhhc2VSdWxlSGFuZGxlcikgaDIpLnNldE5hbWUoIlNlY29uZCBIYW5kbGVyIik7Ci0gICAgICAgICAgICBoMi5pbml0KGhtMSk7Ci0gICAgICAgICAgICBobTEuc2V0SGFuZGxlcihoMik7Ci0gICAgICAgICAgICBobTEuc2V0TmFtZSgiSDIiKTsKLSAgICAgICAgICAgIFBoYXNlUnVsZSBydWxlMSA9IG5ldyBQaGFzZVJ1bGUoKTsKLSAgICAgICAgICAgIHJ1bGUxLnNldFBoYXNlTmFtZSgiUGhhc2VBIik7Ci0gICAgICAgICAgICBydWxlMS5zZXRQaGFzZUxhc3QodHJ1ZSk7Ci0gICAgICAgICAgICBobTEuc2V0UnVsZXMocnVsZTEpOwotICAgICAgICAgICAgcGguYWRkSGFuZGxlcihobTEpOwotICAgICAgICAgICAgZmFpbCgiVGhpcyBzaG91bGQgYmUgZmFpbGQgd2l0aCBQaGFzZWxhc3QgYWxyZWFkeSBoYXMgYmVlbiBzZXQsIGNhbm5vdCBoYXZlIHR3byAiICsKLSAgICAgICAgICAgICAgICAgICAgInBoYXNlTGFzdCBIYW5kbGVyIGZvciBzYW1lIHBoYXNlICIpOwotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgYXhpc0ZhdWx0KSB7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHRlc3QgbWFrZXMgc3VyZSB3ZSBjYW4ndCBhZGQgYSBIYW5kbGVyIHRvIGEgUGhhc2Ugd2hlbiB0aGUKLSAgICAgKiBiZWZvcmUgYW5kIGFmdGVyIGNvbnN0cmFpbnRzIGRvbid0IG1ha2Ugc2Vuc2UuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBpZiB0aGVyZSdzIGFuIGVycm9yCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEJhZEJlZm9yZUFuZEFmdGVycygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBQaGFzZVJ1bGVIYW5kbGVyIGgxID0gbmV3IFBoYXNlUnVsZUhhbmRsZXIoImEiKTsKLSAgICAgICAgSGFuZGxlckRlc2NyaXB0aW9uIGhkID0gbmV3IEhhbmRsZXJEZXNjcmlwdGlvbigiYSIpOwotICAgICAgICBoMS5pbml0KGhkKTsKLQotICAgICAgICBQaGFzZVJ1bGVIYW5kbGVyIGgyID0gbmV3IFBoYXNlUnVsZUhhbmRsZXIoImMiKTsKLSAgICAgICAgaGQgPSBuZXcgSGFuZGxlckRlc2NyaXB0aW9uKCJjIik7Ci0gICAgICAgIGgyLmluaXQoaGQpOwotCi0gICAgICAgIFBoYXNlIHBoYXNlID0gbmV3IFBoYXNlKCk7Ci0gICAgICAgIHBoYXNlLmFkZEhhbmRsZXIoaDEpOwotICAgICAgICBwaGFzZS5hZGRIYW5kbGVyKGgyKTsKLQotICAgICAgICBQaGFzZVJ1bGUgYmFkUnVsZSA9IG5ldyBQaGFzZVJ1bGUoKTsKLSAgICAgICAgYmFkUnVsZS5zZXRCZWZvcmUoImEiKTsKLSAgICAgICAgYmFkUnVsZS5zZXRBZnRlcigiYyIpOwotCi0gICAgICAgIGhkID0gbmV3IEhhbmRsZXJEZXNjcmlwdGlvbigiYiIpOwotICAgICAgICBQaGFzZVJ1bGVIYW5kbGVyIGgzID0gbmV3IFBoYXNlUnVsZUhhbmRsZXIoImIiKTsKLSAgICAgICAgaDMuaW5pdChoZCk7Ci0KLSAgICAgICAgaGQuc2V0SGFuZGxlcihoMyk7Ci0gICAgICAgIGhkLnNldFJ1bGVzKGJhZFJ1bGUpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcGhhc2UuYWRkSGFuZGxlcihoZCk7Ci0gICAgICAgICAgICBmYWlsKCJCYWQgUGhhc2VSdWxlIHdhcyBhY2NlcHRlZCEiKTsKLSAgICAgICAgfSBjYXRjaCAoUGhhc2VFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gQ29ycmVjdCAtIGV4Y2VwdGlvbiBjYXVnaHQKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvcGhhc2VydWxlL1ByZURpc3BhdGNoUGhhc2VSdWxlVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9waGFzZXJ1bGUvUHJlRGlzcGF0Y2hQaGFzZVJ1bGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyZWU1MDUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9waGFzZXJ1bGUvUHJlRGlzcGF0Y2hQaGFzZVJ1bGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnBoYXNlcnVsZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BYnN0cmFjdFRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uSGFuZGxlckRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGhhc2VSdWxlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkRpc3BhdGNoUGhhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuSGFuZGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5QaGFzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnBoYXNlcmVzb2x2ZXIuUGhhc2VIb2xkZXI7Ci0KLXB1YmxpYyBjbGFzcyBQcmVEaXNwYXRjaFBoYXNlUnVsZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdFRlc3RDYXNlIHsKLQotICAgIFByZURpc3BhdGNoUGhhc2VSdWxlVGVzdCBwaGFzZXJ1bDsKLSAgICBBeGlzQ29uZmlndXJhdGlvbiBheGlzU3l0ZW07Ci0KLSAgICBwdWJsaWMgUHJlRGlzcGF0Y2hQaGFzZVJ1bGVUZXN0KFN0cmluZyB0ZXN0TmFtZSkgewotICAgICAgICBzdXBlcih0ZXN0TmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBoYXNlUnVsZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvL1RPRE8gRml4IG1lCi0gICAgICAgIHBoYXNlcnVsID0gbmV3IFByZURpc3BhdGNoUGhhc2VSdWxlVGVzdCgiIik7Ci0gICAgICAgIGF4aXNTeXRlbSA9IG5ldyBBeGlzQ29uZmlndXJhdGlvbigpOwotICAgICAgICBMaXN0IGluUGhhc2UgPSBheGlzU3l0ZW0uZ2V0SW5GbG93UGhhc2VzKCk7Ci0gICAgICAgIFBoYXNlIHRyYW5zcG9ydElOID0gbmV3IFBoYXNlKCJUcmFuc3BvcnRJbiIpOwotICAgICAgICBQaGFzZSBwcmVEaXNwYXRjaCA9IG5ldyBQaGFzZSgiUHJlRGlzcGF0Y2giKTsKLSAgICAgICAgRGlzcGF0Y2hQaGFzZSBkaXNwYXRjaFBoYXNlID0gbmV3IERpc3BhdGNoUGhhc2UoKTsKLS8vCi0gICAgICAgIGRpc3BhdGNoUGhhc2Uuc2V0TmFtZSgiRGlzcGF0Y2giKTsKLSAgICAgICAgaW5QaGFzZS5hZGQodHJhbnNwb3J0SU4pOwotICAgICAgICBpblBoYXNlLmFkZChwcmVEaXNwYXRjaCk7Ci0gICAgICAgIGluUGhhc2UuYWRkKGRpc3BhdGNoUGhhc2UpOwotICAgICAgICBQaGFzZUhvbGRlciBwaCA9IG5ldyBQaGFzZUhvbGRlcihpblBoYXNlKTsKLQotCi0gICAgICAgIEhhbmRsZXJEZXNjcmlwdGlvbiBwcmUgPSBuZXcgSGFuZGxlckRlc2NyaXB0aW9uKCk7Ci0gICAgICAgIHByZS5zZXRDbGFzc05hbWUoIm9yZy5hcGFjaGUuYXhpczIuaGFuZGxlcnMuQWJzdHJhY3RIYW5kbGVyIik7Ci0gICAgICAgIEhhbmRsZXIgaDEgPSBuZXcgUGhhc2VSdWxlSGFuZGxlcigpOwotICAgICAgICBoMS5pbml0KHByZSk7Ci0gICAgICAgIHByZS5zZXRIYW5kbGVyKGgxKTsKLSAgICAgICAgcHJlLnNldE5hbWUoInByZS1IMSIpOwotICAgICAgICBQaGFzZVJ1bGUgcHJlX3J1bGUxID0gbmV3IFBoYXNlUnVsZSgpOwotICAgICAgICBwcmVfcnVsZTEuc2V0UGhhc2VOYW1lKCJQcmVEaXNwYXRjaCIpOwotICAgICAgICBwcmUuc2V0UnVsZXMocHJlX3J1bGUxKTsKLSAgICAgICAgcGguYWRkSGFuZGxlcihwcmUpOwotCi0gICAgICAgIEhhbmRsZXJEZXNjcmlwdGlvbiBwcmUyID0gbmV3IEhhbmRsZXJEZXNjcmlwdGlvbigpOwotICAgICAgICBwcmUyLnNldENsYXNzTmFtZSgib3JnLmFwYWNoZS5heGlzMi5oYW5kbGVycy5BYnN0cmFjdEhhbmRsZXIiKTsKLSAgICAgICAgSGFuZGxlciBoMiA9IG5ldyBQaGFzZVJ1bGVIYW5kbGVyKCk7Ci0gICAgICAgIGgyLmluaXQocHJlMik7Ci0gICAgICAgIHByZTIuc2V0SGFuZGxlcihoMik7Ci0gICAgICAgIHByZTIuc2V0TmFtZSgiZGlzcGF0Y2giKTsKLSAgICAgICAgUGhhc2VSdWxlIHByZXJ1bGUyID0gbmV3IFBoYXNlUnVsZSgpOwotICAgICAgICBwcmVydWxlMi5zZXRQaGFzZU5hbWUoIkRpc3BhdGNoIik7Ci0gICAgICAgIHByZTIuc2V0UnVsZXMocHJlcnVsZTIpOwotICAgICAgICBwaC5hZGRIYW5kbGVyKHByZTIpOwotCi0KLSAgICAgICAgSGFuZGxlckRlc2NyaXB0aW9uIGhtID0gbmV3IEhhbmRsZXJEZXNjcmlwdGlvbigpOwotICAgICAgICBobS5zZXRDbGFzc05hbWUoIm9yZy5hcGFjaGUuYXhpczIuaGFuZGxlcnMuQWJzdHJhY3RIYW5kbGVyIik7Ci0gICAgICAgIEhhbmRsZXIgaDMgPSBuZXcgUGhhc2VSdWxlSGFuZGxlcigpOwotICAgICAgICBoMy5pbml0KGhtKTsKLSAgICAgICAgaG0uc2V0SGFuZGxlcihoMyk7Ci0gICAgICAgIGhtLnNldE5hbWUoInByZS1IMiIpOwotICAgICAgICBQaGFzZVJ1bGUgcnVsZSA9IG5ldyBQaGFzZVJ1bGUoKTsKLSAgICAgICAgcnVsZS5zZXRQaGFzZU5hbWUoIlByZURpc3BhdGNoIik7Ci0gICAgICAgIHJ1bGUuc2V0UGhhc2VGaXJzdCh0cnVlKTsKLSAgICAgICAgaG0uc2V0UnVsZXMocnVsZSk7Ci0gICAgICAgIHBoLmFkZEhhbmRsZXIoaG0pOwotCi0gICAgICAgIEhhbmRsZXJEZXNjcmlwdGlvbiBobTEgPSBuZXcgSGFuZGxlckRlc2NyaXB0aW9uKCk7Ci0gICAgICAgIGhtMS5zZXRDbGFzc05hbWUoIm9yZy5hcGFjaGUuYXhpczIuaGFuZGxlcnMuQWJzdHJhY3RIYW5kbGVyIik7Ci0gICAgICAgIEhhbmRsZXIgaDQgPSBuZXcgUGhhc2VSdWxlSGFuZGxlcigpOwotICAgICAgICBoNC5pbml0KGhtMSk7Ci0gICAgICAgIGhtMS5zZXRIYW5kbGVyKGg0KTsKLSAgICAgICAgaG0xLnNldE5hbWUoInByZS1IMyIpOwotICAgICAgICBQaGFzZVJ1bGUgcnVsZTEgPSBuZXcgUGhhc2VSdWxlKCk7Ci0gICAgICAgIHJ1bGUxLnNldFBoYXNlTmFtZSgiUHJlRGlzcGF0Y2giKTsKLSAgICAgICAgcnVsZTEuc2V0QWZ0ZXIoInByZS1IMiIpOwotICAgICAgICBobTEuc2V0UnVsZXMocnVsZTEpOwotICAgICAgICBwaC5hZGRIYW5kbGVyKGhtMSk7Ci0KLSAgICAgICAgSGFuZGxlckRlc2NyaXB0aW9uIGhtMiA9IG5ldyBIYW5kbGVyRGVzY3JpcHRpb24oKTsKLSAgICAgICAgaG0yLnNldENsYXNzTmFtZSgib3JnLmFwYWNoZS5heGlzMi5oYW5kbGVycy5BYnN0cmFjdEhhbmRsZXIiKTsKLSAgICAgICAgSGFuZGxlciBoNSA9IG5ldyBQaGFzZVJ1bGVIYW5kbGVyKCk7Ci0gICAgICAgIGg1LmluaXQoaG0yKTsKLSAgICAgICAgaG0yLnNldEhhbmRsZXIoaDUpOwotICAgICAgICBobTIuc2V0TmFtZSgiSDMiKTsKLSAgICAgICAgUGhhc2VSdWxlIHJ1bGUyID0gbmV3IFBoYXNlUnVsZSgpOwotICAgICAgICBydWxlMi5zZXRQaGFzZU5hbWUoIlByZURpc3BhdGNoIik7Ci0gICAgICAgIHJ1bGUyLnNldEFmdGVyKCJwcmUtSDIiKTsKLSAgICAgICAgcnVsZTIuc2V0QmVmb3JlKCJwcmUtSDMiKTsKLSAgICAgICAgaG0yLnNldFJ1bGVzKHJ1bGUyKTsKLSAgICAgICAgcGguYWRkSGFuZGxlcihobTIpOwotCi0gICAgICAgIC8qQXJyYXlMaXN0IG9oID0gcGguZ2V0T3JkZXJIYW5kbGVyKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgb2guc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIEhhbmRsZXJEZXNjcmlwdGlvbiBtZXRhZGF0YSA9IChIYW5kbGVyRGVzY3JpcHRpb24pIG9oLmdldChpKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTmFtZToiICsgbWV0YWRhdGEuZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgfSovCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBoYXNlTGFzdEFuZEFmdGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgUGhhc2UgcGhhc2UgPSBuZXcgUGhhc2UoKTsKLQotICAgICAgICAvLy8vLy8vLy8vLy8vLy8vIGhhbmRsZXIgMSAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgICAgICBQaGFzZVJ1bGVIYW5kbGVyIGgxID0gbmV3IFBoYXNlUnVsZUhhbmRsZXIoImEiKTsKLSAgICAgICAgSGFuZGxlckRlc2NyaXB0aW9uIGhkMSA9IG5ldyBIYW5kbGVyRGVzY3JpcHRpb24oImEiKTsKLSAgICAgICAgaDEuaW5pdChoZDEpOwotICAgICAgICBoZDEuc2V0SGFuZGxlcihoMSk7Ci0gICAgICAgIHBoYXNlLmFkZEhhbmRsZXIoaGQxKTsKLSAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgICAgICAvLy8vLy8vLy8vLy8vLy8vIGhhbmRsZXIgNCAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgICAgICBQaGFzZVJ1bGUgcnVsZTQgPSBuZXcgUGhhc2VSdWxlKCk7Ci0gICAgICAgIHJ1bGU0LnNldFBoYXNlTGFzdCh0cnVlKTsKLQotICAgICAgICBQaGFzZVJ1bGVIYW5kbGVyIGg0ID0gbmV3IFBoYXNlUnVsZUhhbmRsZXIoImQiKTsKLSAgICAgICAgSGFuZGxlckRlc2NyaXB0aW9uIGhkNCA9IG5ldyBIYW5kbGVyRGVzY3JpcHRpb24oImQiKTsKLSAgICAgICAgaDQuaW5pdChoZDQpOwotCi0gICAgICAgIGhkNC5zZXRIYW5kbGVyKGg0KTsKLSAgICAgICAgaGQ0LnNldFJ1bGVzKHJ1bGU0KTsKLSAgICAgICAgcGhhc2UuYWRkSGFuZGxlcihoZDQpOwotICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSAgICAgICAgLy8vLy8vLy8vLy8vLy8vLyBoYW5kbGVyIDIgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAgICAgUGhhc2VSdWxlIHJ1bGUyID0gbmV3IFBoYXNlUnVsZSgpOwotICAgICAgICBydWxlMi5zZXRBZnRlcigiYSIpOwotCi0gICAgICAgIEhhbmRsZXJEZXNjcmlwdGlvbiBoZDIgPSBuZXcgSGFuZGxlckRlc2NyaXB0aW9uKCJiIik7Ci0gICAgICAgIFBoYXNlUnVsZUhhbmRsZXIgaDIgPSBuZXcgUGhhc2VSdWxlSGFuZGxlcigiYiIpOwotICAgICAgICBoMi5pbml0KGhkMik7Ci0KLSAgICAgICAgaGQyLnNldEhhbmRsZXIoaDIpOwotICAgICAgICBoZDIuc2V0UnVsZXMocnVsZTIpOwotICAgICAgICBwaGFzZS5hZGRIYW5kbGVyKGhkMik7Ci0gICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0gICAgICAgIC8vLy8vLy8vLy8vLy8vLy8gaGFuZGxlciAzIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgICAgIFBoYXNlUnVsZSBydWxlMyA9IG5ldyBQaGFzZVJ1bGUoKTsKLSAgICAgICAgcnVsZTMuc2V0QWZ0ZXIoImIiKTsKLQotICAgICAgICBIYW5kbGVyRGVzY3JpcHRpb24gaGQzID0gbmV3IEhhbmRsZXJEZXNjcmlwdGlvbigiYyIpOwotICAgICAgICBQaGFzZVJ1bGVIYW5kbGVyIGgzID0gbmV3IFBoYXNlUnVsZUhhbmRsZXIoImMiKTsKLSAgICAgICAgaDMuaW5pdChoZDMpOwotCi0gICAgICAgIGhkMy5zZXRIYW5kbGVyKGgzKTsKLSAgICAgICAgaGQzLnNldFJ1bGVzKHJ1bGUzKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHBoYXNlLmFkZEhhbmRsZXIoaGQzKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIkFkZGluZyBoYW5kbGVycyB3aXRoIGFmdGVyIGF0dHJpYnV0ZSB0byB0aGUgcGhhc2UgYmVoYXZpb3VyIGZhaWxlZCIpOwotICAgICAgICB9Ci0gICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvcmVnaXN0cnkvSGFuZGxlcjMuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvcmVnaXN0cnkvSGFuZGxlcjMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2U1NWZlMi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JlZ2lzdHJ5L0hhbmRsZXIzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuSGFuZGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmhhbmRsZXJzLkFic3RyYWN0SGFuZGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotcHVibGljIGNsYXNzIEhhbmRsZXIzIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyIGltcGxlbWVudHMgSGFuZGxlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEhhbmRsZXIzIC5jbGFzcyk7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbWVzc2FnZTsKLQotICAgIHB1YmxpYyBIYW5kbGVyMygpIHsKLSAgICAgICAgdGhpcy5tZXNzYWdlID0gImluc2lkZSBNb2R1bGUgMSI7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgSW52b2NhdGlvblJlc3BvbnNlIGludm9rZShNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgbG9nLmluZm8oIkkgYW0gIiArIG1lc3NhZ2UgKyAiIEhhbmRsZXIgUnVubmluZyA6KSIpOwotICAgICAgICByZXR1cm4gSW52b2NhdGlvblJlc3BvbnNlLkNPTlRJTlVFOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJldm9rZShNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB7Ci0gICAgICAgIGxvZy5pbmZvKCJJIGFtICIgKyBtZXNzYWdlICsgIiBIYW5kbGVyIFJ1bm5pbmcgOikiKTsKLSAgICB9Ci0KLQotCi19Ci0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2FtcGxlL2VjaG8vRWNob0ltcGwuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2FtcGxlL2VjaG8vRWNob0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjUwYzcwZi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NhbXBsZS9lY2hvL0VjaG9JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2FtcGxlLmVjaG87Ci0KLXB1YmxpYyBjbGFzcyBFY2hvSW1wbCB7Ci0gICAgcHVibGljIEVjaG9JbXBsKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGVjaG9TdHJpbmcoamF2YS5sYW5nLlN0cmluZyBpbikgewotICAgICAgICByZXR1cm4gaW47Ci0gICAgfQotCi0gICAgcHVibGljIGphdmEubGFuZy5TdHJpbmdbXSBlY2hvU3RyaW5nQXJyYXkoamF2YS5sYW5nLlN0cmluZ1tdIGluKSB7Ci0gICAgICAgIHJldHVybiBpbjsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zYW1wbGUvaGFuZGxlcnMvTG9nZ2luZ0hhbmRsZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2FtcGxlL2hhbmRsZXJzL0xvZ2dpbmdIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkODAyYmIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zYW1wbGUvaGFuZGxlcnMvTG9nZ2luZ0hhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zYW1wbGUuaGFuZGxlcnM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5oYW5kbGVycy5BYnN0cmFjdEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBMb2dnaW5nSGFuZGxlciBleHRlbmRzIEFic3RyYWN0SGFuZGxlciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA3NjU2ODUxMjYwNjc4NjY0NzQ2TDsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhMb2dnaW5nSGFuZGxlci5jbGFzcyk7Ci0KLSAgICBwdWJsaWMgSW52b2NhdGlvblJlc3BvbnNlIGludm9rZShNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgbG9nLmluZm8oIkluY29taW5nIG1lc3NhZ2UgRnJvbSAiICsgbXNnQ29udGV4dC5nZXRUbygpLmdldEFkZHJlc3MoKSk7Ci0gICAgICAgIHJldHVybiBJbnZvY2F0aW9uUmVzcG9uc2UuQ09OVElOVUU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmV2b2tlKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHsKLSAgICAgICAgbG9nLmluZm8oIkluY29taW5nIG1lc3NhZ2UgUmV2b2tlZCBhdCB0aGUgc2VydmVyICIgKyBtc2dDb250ZXh0LmdldFRvKCkuZ2V0QWRkcmVzcygpKTsKLSAgICB9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC91dGlsL1F1ZXJ5U3RyaW5nUGFyc2VyVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC91dGlsL1F1ZXJ5U3RyaW5nUGFyc2VyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjk1YWNkLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvdXRpbC9RdWVyeVN0cmluZ1BhcnNlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAudXRpbDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIFF1ZXJ5U3RyaW5nUGFyc2VyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2luZ2xlUGFyYW1ldGVyKCkgewotICAgICAgICBRdWVyeVN0cmluZ1BhcnNlciBwID0gbmV3IFF1ZXJ5U3RyaW5nUGFyc2VyKCJuYW1lPXZhbHVlIik7Ci0gICAgICAgIGFzc2VydFRydWUocC5uZXh0KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIm5hbWUiLCBwLmdldE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygidmFsdWUiLCBwLmdldFZhbHVlKCkpOwotICAgICAgICBhc3NlcnRGYWxzZShwLm5leHQoKSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aXBsZVBhcmFtZXRlcnMoKSB7Ci0gICAgICAgIFF1ZXJ5U3RyaW5nUGFyc2VyIHAgPSBuZXcgUXVlcnlTdHJpbmdQYXJzZXIoIm5hbWUxPXZhbHVlMSZuYW1lMj12YWx1ZTIiKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShwLm5leHQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygibmFtZTEiLCBwLmdldE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygidmFsdWUxIiwgcC5nZXRWYWx1ZSgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShwLm5leHQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygibmFtZTIiLCBwLmdldE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygidmFsdWUyIiwgcC5nZXRWYWx1ZSgpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UocC5uZXh0KCkpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2luZ2xlUGFyYW1ldGVyV2l0aG91dFZhbHVlKCkgewotICAgICAgICBRdWVyeVN0cmluZ1BhcnNlciBwID0gbmV3IFF1ZXJ5U3RyaW5nUGFyc2VyKCJuYW1lIik7Ci0gICAgICAgIGFzc2VydFRydWUocC5uZXh0KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIm5hbWUiLCBwLmdldE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydE51bGwocC5nZXRWYWx1ZSgpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UocC5uZXh0KCkpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVQYXJhbWV0ZXJzV2l0aG91dFZhbHVlMSgpIHsKLSAgICAgICAgUXVlcnlTdHJpbmdQYXJzZXIgcCA9IG5ldyBRdWVyeVN0cmluZ1BhcnNlcigibmFtZSZuYW1lMiIpOwotICAgICAgICBhc3NlcnRUcnVlKHAubmV4dCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJuYW1lIiwgcC5nZXROYW1lKCkpOwotICAgICAgICBhc3NlcnROdWxsKHAuZ2V0VmFsdWUoKSk7Ci0gICAgICAgIGFzc2VydFRydWUocC5uZXh0KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIm5hbWUyIiwgcC5nZXROYW1lKCkpOwotICAgICAgICBhc3NlcnROdWxsKHAuZ2V0VmFsdWUoKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKHAubmV4dCgpKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdE11bHRpcGxlUGFyYW1ldGVyc1dpdGhvdXRWYWx1ZTIoKSB7Ci0gICAgICAgIFF1ZXJ5U3RyaW5nUGFyc2VyIHAgPSBuZXcgUXVlcnlTdHJpbmdQYXJzZXIoIm5hbWU9dmFsdWUmbmFtZTIiKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShwLm5leHQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygibmFtZSIsIHAuZ2V0TmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJ2YWx1ZSIsIHAuZ2V0VmFsdWUoKSk7Ci0gICAgICAgIGFzc2VydFRydWUocC5uZXh0KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIm5hbWUyIiwgcC5nZXROYW1lKCkpOwotICAgICAgICBhc3NlcnROdWxsKHAuZ2V0VmFsdWUoKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKHAubmV4dCgpKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdEVuY29kZWRWYWx1ZSgpIHsKLSAgICAgICAgUXVlcnlTdHJpbmdQYXJzZXIgcCA9IG5ldyBRdWVyeVN0cmluZ1BhcnNlcigibmFtZT0yMCUyNSUyMGRvd24iKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShwLm5leHQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygibmFtZSIsIHAuZ2V0TmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIyMCUgZG93biIsIHAuZ2V0VmFsdWUoKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKHAubmV4dCgpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL3V0aWwvVVJMVGVtcGxhdGluZ1V0aWxUZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL3V0aWwvVVJMVGVtcGxhdGluZ1V0aWxUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0NGZiMjUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC91dGlsL1VSTFRlbXBsYXRpbmdVdGlsVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC51dGlsOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uV1NETDJDb25zdGFudHM7Ci0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1wdWJsaWMgY2xhc3MgVVJMVGVtcGxhdGluZ1V0aWxUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0KLSAgICBwcml2YXRlIE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0OwotCi0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBtZXNzYWdlQ29udGV4dCA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOwotCi0gICAgICAgIFNPQVBGYWN0b3J5IHNvYXBGYWN0b3J5ID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDEyRmFjdG9yeSgpOwotICAgICAgICBTT0FQRW52ZWxvcGUgZGVmYXVsdEVudmVsb3BlID0gc29hcEZhY3RvcnkuZ2V0RGVmYXVsdEVudmVsb3BlKCk7Ci0KLSAgICAgICAgbWVzc2FnZUNvbnRleHQuc2V0RW52ZWxvcGUoZGVmYXVsdEVudmVsb3BlKTsKLQotICAgICAgICBPTUVsZW1lbnQgYm9keUZpcnN0RWxlbWVudCA9IHNvYXBGYWN0b3J5LmNyZWF0ZU9NRWxlbWVudCgiVGVzdE9wZXJhdGlvbiIsIG51bGwpOwotICAgICAgICBkZWZhdWx0RW52ZWxvcGUuZ2V0Qm9keSgpLmFkZENoaWxkKGJvZHlGaXJzdEVsZW1lbnQpOwotCi0gICAgICAgIHNvYXBGYWN0b3J5LmNyZWF0ZU9NRWxlbWVudCgiRmlyc3ROYW1lIiwgbnVsbCwgYm9keUZpcnN0RWxlbWVudCkuc2V0VGV4dCgiRm9vIik7Ci0gICAgICAgIHNvYXBGYWN0b3J5LmNyZWF0ZU9NRWxlbWVudCgiTGFzdE5hbWUiLCBudWxsLCBib2R5Rmlyc3RFbGVtZW50KS5zZXRUZXh0KCJCYXIiKTsKLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRUZW1wbGF0ZWRVUkwoKSB0aHJvd3MgQXhpc0ZhdWx0LCBNYWxmb3JtZWRVUkxFeGNlcHRpb24gewotICAgICAgICBVUkwgdGVzdFVSTCA9Ci0gICAgICAgICAgICAgICAgbmV3IFVSTCgiaHR0cDovL2xvY2Fob3N0OjgwODAvcGFyYW1PbmUiKTsKLSAgICAgICAgbWVzc2FnZUNvbnRleHQuc2V0UHJvcGVydHkoV1NETDJDb25zdGFudHMuQVRUUl9XSFRUUF9MT0NBVElPTiwgIntGaXJzdE5hbWV9P3Rlc3Q9MSZsYXN0TmFtZT17TGFzdE5hbWV9Iik7Ci0gICAgICAgIFVSTCBtb2RpZmllZFVSTCA9IFVSTFRlbXBsYXRpbmdVdGlsLmdldFRlbXBsYXRlZFVSTCh0ZXN0VVJMLCBtZXNzYWdlQ29udGV4dCwgdHJ1ZSk7Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJvcmlnaW5hbCA9ICIgKyB0ZXN0VVJMKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJtb2RpZmllZFVSTCA9ICIgKyBtb2RpZmllZFVSTCk7Ci0KLSAgICAgICAgU3RyaW5nIGV4cGVjdGVkVVJMID0gImh0dHA6Ly9sb2NhaG9zdDo4MDgwL3BhcmFtT25lL0Zvbz90ZXN0PTEmbGFzdE5hbWU9QmFyIjsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG1vZGlmaWVkVVJMLnRvU3RyaW5nKCksIGV4cGVjdGVkVVJMKTsKLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBcHBlbmRQYXJhbWV0ZXJzVG9VUkwoKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBBeGlzRmF1bHQgewotICAgICAgICBVUkwgdGVzdFVSTCA9IG5ldyBVUkwoImh0dHA6Ly9sb2NhaG9zdDo4MDgwL3BhcmFtT25lIik7Ci0gICAgICAgIG1lc3NhZ2VDb250ZXh0LnNldFByb3BlcnR5KFdTREwyQ29uc3RhbnRzLkFUVFJfV0hUVFBfTE9DQVRJT04sIG51bGwpOwotICAgICAgICBVUkwgbW9kaWZpZWRVUkwgPSBVUkxUZW1wbGF0aW5nVXRpbC5hcHBlbmRRdWVyeVBhcmFtZXRlcnMobWVzc2FnZUNvbnRleHQsdGVzdFVSTCk7Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJvcmlnaW5hbCA9ICIgKyB0ZXN0VVJMKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJtb2RpZmllZFVSTCA9ICIgKyBtb2RpZmllZFVSTCk7Ci0KLSAgICAgICAgU3RyaW5nIGV4cGVjdGVkVVJMID0gImh0dHA6Ly9sb2NhaG9zdDo4MDgwL3BhcmFtT25lP0ZpcnN0TmFtZT1Gb28mTGFzdE5hbWU9QmFyIjsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG1vZGlmaWVkVVJMLnRvU3RyaW5nKCksIGV4cGVjdGVkVVJMKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UXVlcnlQYXJhbWV0ZXJTZXBlcmF0b3IoKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBBeGlzRmF1bHQgewotICAgICAgICBVUkwgdGVzdFVSTCA9IG5ldyBVUkwoImh0dHA6Ly9sb2NhaG9zdDo4MDgwL3BhcmFtT25lIik7Ci0gICAgICAgIG1lc3NhZ2VDb250ZXh0LnNldFByb3BlcnR5KFdTREwyQ29uc3RhbnRzLkFUVFJfV0hUVFBfTE9DQVRJT04sIG51bGwpOwotICAgICAgICBtZXNzYWdlQ29udGV4dC5zZXRQcm9wZXJ0eShXU0RMMkNvbnN0YW50cy5BVFRSX1dIVFRQX1FVRVJZX1BBUkFNRVRFUl9TRVBBUkFUT1IsIjsiKTsKLSAgICAgICAgVVJMIG1vZGlmaWVkVVJMID0gVVJMVGVtcGxhdGluZ1V0aWwuYXBwZW5kUXVlcnlQYXJhbWV0ZXJzKG1lc3NhZ2VDb250ZXh0LHRlc3RVUkwpOwotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigib3JpZ2luYWwgPSAiICsgdGVzdFVSTCk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigibW9kaWZpZWRVUkwgPSAiICsgbW9kaWZpZWRVUkwpOwotCi0gICAgICAgIFN0cmluZyBleHBlY3RlZFVSTCA9ICJodHRwOi8vbG9jYWhvc3Q6ODA4MC9wYXJhbU9uZT9GaXJzdE5hbWU9Rm9vO0xhc3ROYW1lPUJhciI7Ci0gICAgICAgIGFzc2VydEVxdWFscyhtb2RpZmllZFVSTC50b1N0cmluZygpLCBleHBlY3RlZFVSTCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdElnbm9yZVVuY2l0ZWRGYWxzZSgpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sIEF4aXNGYXVsdCB7Ci0KLSAgICAgICAgVVJMIHRlc3RVUkwgPSBuZXcgVVJMKCJodHRwOi8vbG9jYWhvc3Q6ODA4MC9wYXJhbU9uZS9Gb28/dGVzdD0xIik7Ci0gICAgICAgIG1lc3NhZ2VDb250ZXh0LnNldFByb3BlcnR5KFdTREwyQ29uc3RhbnRzLkFUVFJfV0hUVFBfSUdOT1JFX1VOQ0lURUQsImZhbHNlIik7Ci0gICAgICAgIG1lc3NhZ2VDb250ZXh0LnNldFByb3BlcnR5KFdTREwyQ29uc3RhbnRzLkFUVFJfV0hUVFBfTE9DQVRJT04sIG51bGwpOwotICAgICAgICBVUkwgbW9kaWZpZWRVUkwgPSBVUkxUZW1wbGF0aW5nVXRpbC5hcHBlbmRRdWVyeVBhcmFtZXRlcnMobWVzc2FnZUNvbnRleHQsdGVzdFVSTCk7Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJvcmlnaW5hbCA9ICIgKyB0ZXN0VVJMKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJtb2RpZmllZFVSTCA9ICIgKyBtb2RpZmllZFVSTCk7Ci0KLSAgICAgICAgU3RyaW5nIGV4cGVjdGVkVVJMID0gImh0dHA6Ly9sb2NhaG9zdDo4MDgwL3BhcmFtT25lL0Zvbz90ZXN0PTEmRmlyc3ROYW1lPUZvbyZMYXN0TmFtZT1CYXIiOwotICAgICAgICBhc3NlcnRFcXVhbHMobW9kaWZpZWRVUkwudG9TdHJpbmcoKSwgZXhwZWN0ZWRVUkwpOwotCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9zYW1wbGUueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvc2FtcGxlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI2ZmU3OC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9zYW1wbGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08c29hcGVudjpFbnZlbG9wZSB4bWxuczpzb2FwZW52PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyIgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6d3NhPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA4L2FkZHJlc3NpbmciPgotICAgIDxzb2FwZW52OkhlYWRlcj4KLSAgICAgICAgPHdzYTpNZXNzYWdlSUQgc29hcGVudjptdXN0VW5kZXJzdGFuZD0iMCI+dXVpZDo5MjBDNTE5MC0wQjhGLTExRDktOENFRC1GMjJFREVFQkY3RTU8L3dzYTpNZXNzYWdlSUQ+Ci0gICAgICAgIDx3c2E6VG8gc29hcGVudjptdXN0VW5kZXJzdGFuZD0iMCI+aHR0cDovL2xvY2FsaG9zdDo4MDgxL2F4aXMvc2VydmljZXMvQmFua1BvcnQ8L3dzYTpUbz4KLSAgICAgICAgPHdzYTpGcm9tIHNvYXBlbnY6bXVzdFVuZGVyc3RhbmQ9IjAiPgotICAgICAgICAgICAgPHdzYTpBZGRyZXNzPmh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDMvYWRkcmVzc2luZy9yb2xlL2Fub255bW91czwvd3NhOkFkZHJlc3M+Ci0gICAgICAgIDwvd3NhOkZyb20+Ci0gICAgICAgIDx3c2E6QWN0aW9uPmh0dHA6Ly93cy5hcGFjaGUub3JnL3Rlc3RzL2FjdGlvbjwvd3NhOkFjdGlvbj4KLSAgICA8L3NvYXBlbnY6SGVhZGVyPgotICAgIDxzb2FwZW52OkJvZHk+Ci0gICAgICAgIDxuczE6Z2V0QmFsYW5jZSBzb2FwZW52OmVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIiB4bWxuczpuczE9Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MS9heGlzL3NlcnZpY2VzL0JhbmtQb3J0Ij4KLSAgICAgICAgICAgIDxhY2NvdW50Tm8+MjM0PC9hY2NvdW50Tm8+Ci0gICAgICAgIDwvbnMxOmdldEJhbGFuY2U+Ci0gICAgPC9zb2FwZW52OkJvZHk+Ci08L3NvYXBlbnY6RW52ZWxvcGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvdGNwL1RDUFRyYW5zcG9ydFRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L3RjcC9UQ1BUcmFuc3BvcnRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyN2ZjYTkuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvdGNwL1RDUFRyYW5zcG9ydFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQudGNwOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5idWlsZGVyLlN0QVhCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5TdEFYVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuaW1wbC5idWlsZGVyLlN0QVhTT0FQTW9kZWxCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotcHVibGljIGNsYXNzIFRDUFRyYW5zcG9ydFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgcHVibGljIFRDUFRyYW5zcG9ydFRlc3QoU3RyaW5nIGFyZzApIHsKLSAgICAgICAgc3VwZXIoYXJnMCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFRyYW5zcG9ydFNlbmRlcigpIHRocm93cyBBeGlzRmF1bHQgewotICAgIH0KLQotICAgIHB1YmxpYyBTT0FQRW52ZWxvcGUgY3JlYXRlU09BUEVudmVsb3BlKElucHV0U3RyZWFtIGluKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxyZWFkZXIgPQotICAgICAgICAgICAgICAgICAgICBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKGluKTsKLSAgICAgICAgICAgIFN0QVhCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RBWFNPQVBNb2RlbEJ1aWxkZXIoeG1scmVhZGVyLCBudWxsKTsKLSAgICAgICAgICAgIHJldHVybiAoU09BUEVudmVsb3BlKSBidWlsZGVyLmdldERvY3VtZW50RWxlbWVudCgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdChlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvdXRpbC9KYXZhVXRpbHNUZXN0cy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi91dGlsL0phdmFVdGlsc1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1ZGE5ZWYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi91dGlsL0phdmFVdGlsc1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKg0KLSAqIENvcHlyaWdodCAoYykgMjAwNywgV1NPMiBJbmMuIChodHRwOi8vd3d3LndzbzIub3JnKSBBbGwgUmlnaHRzIFJlc2VydmVkLg0KLSAqDQotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudXRpbDsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOw0KLQ0KLXB1YmxpYyBjbGFzcyBKYXZhVXRpbHNUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsNCi0gICAgcHVibGljIHZvaWQgdGVzdFhNTE5hbWVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICAvKiBCZWdpbiBUQUJMRSAyMC0yIElsbHVzdHJhdGl2ZSBFeGFtcGxlcyBmcm9tIEpBWFJQQyBTcGVjICovDQotICAgICAgICBhc3NlcnRFcXVhbHMoIm1peGVkQ2FzZU5hbWUiLCBKYXZhVXRpbHMueG1sTmFtZVRvSmF2YUlkZW50aWZpZXIoIm1peGVkQ2FzZU5hbWUiKSk7DQotDQotICAgICAgICBhc3NlcnRFcXVhbHMoIm5hbWVXaXRoRGFzaGVzIiwgSmF2YVV0aWxzLnhtbE5hbWVUb0phdmFJZGVudGlmaWVyKCJuYW1lLXdpdGgtZGFzaGVzIikpOw0KLQ0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJuYW1lX3dpdGhfdW5kZXJzY29yZSIsIEphdmFVdGlscy54bWxOYW1lVG9KYXZhSWRlbnRpZmllcigibmFtZV93aXRoX3VuZGVyc2NvcmUiKSk7DQotDQotICAgICAgICBhc3NlcnRFcXVhbHMoIm90aGVyX3B1bmN0Q2hhcnMiLCBKYXZhVXRpbHMueG1sTmFtZVRvSmF2YUlkZW50aWZpZXIoIm90aGVyX3B1bmN0LmNoYXJzIikpOw0KLQ0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJhbnN3ZXI0MiIsIEphdmFVdGlscy54bWxOYW1lVG9KYXZhSWRlbnRpZmllcigiQW5zd2VyNDIiKSk7DQotICAgICAgICAvKiBFbmQgVEFCTEUgMjAtMiBJbGx1c3RyYXRpdmUgRXhhbXBsZXMgZnJvbSBKQVhSUEMgU3BlYyAqLw0KLQ0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJuYW1lV2l0aERhc2hlcyIsDQotICAgICAgICAgICAgICAgIEphdmFVdGlscy54bWxOYW1lVG9KYXZhSWRlbnRpZmllcigibmFtZS13aXRoLWRhc2hlcyIpKTsNCi0NCi0gICAgICAgIGFzc2VydEVxdWFscygib3RoZXJQdW5jdENoYXJzIiwNCi0gICAgICAgICAgICAgICAgSmF2YVV0aWxzLnhtbE5hbWVUb0phdmFJZGVudGlmaWVyKCJvdGhlci5wdW5jdFx1MDBCN2NoYXJzIikpOw0KLQ0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJhbnN3ZXI0MiIsIEphdmFVdGlscy54bWxOYW1lVG9KYXZhSWRlbnRpZmllcigiQW5zd2VyNDIiKSk7DQotDQotLy8gICAgICAgIGFzc2VydEVxdWFscygiXHUyMTYwRm9vIiwgSmF2YVV0aWxzLnhtbE5hbWVUb0phdmFJZGVudGlmaWVyKCJcdTIxNjBmb28iKSk7DQotDQotICAgICAgICBhc3NlcnRFcXVhbHMoImZvbyIsIEphdmFVdGlscy54bWxOYW1lVG9KYXZhSWRlbnRpZmllcigiMmZvbyIpKTsNCi0NCi0gICAgICAgIC8vYXNzZXJ0RXF1YWxzKCJfRm9vXyIsIEphdmFVdGlscy54bWxOYW1lVG9KYXZhSWRlbnRpZmllcigiX2Zvb18iKSk7DQotICAgICAgICBhc3NlcnRFcXVhbHMoIl9mb29fIiwgSmF2YVV0aWxzLnhtbE5hbWVUb0phdmFJZGVudGlmaWVyKCJfZm9vXyIpKTsNCi0NCi0gICAgICAgIGFzc2VydEVxdWFscygiZm9vYmFyIiwgSmF2YVV0aWxzLnhtbE5hbWVUb0phdmFJZGVudGlmaWVyKCItLWZvb2Jhci0tIikpOw0KLQ0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJmb28yMkJhciIsIEphdmFVdGlscy54bWxOYW1lVG9KYXZhSWRlbnRpZmllcigiZm9vMjJiYXIiKSk7DQotDQotICAgICAgICBhc3NlcnRFcXVhbHMoImZvb1x1MjE2MEJhciIsIEphdmFVdGlscy54bWxOYW1lVG9KYXZhSWRlbnRpZmllcigiZm9vXHUyMTYwYmFyIikpOw0KLQ0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJmb29CYXIiLCBKYXZhVXRpbHMueG1sTmFtZVRvSmF2YUlkZW50aWZpZXIoImZvby1iYXIiKSk7DQotDQotICAgICAgICBhc3NlcnRFcXVhbHMoImZvb0JhciIsIEphdmFVdGlscy54bWxOYW1lVG9KYXZhSWRlbnRpZmllcigiZm9vLmJhciIpKTsNCi0NCi0gICAgICAgIGFzc2VydEVxdWFscygiZm9vQmFyIiwgSmF2YVV0aWxzLnhtbE5hbWVUb0phdmFJZGVudGlmaWVyKCJmb286YmFyIikpOw0KLQ0KLSAgICAgICAgLy9hc3NlcnRFcXVhbHMoImZvb19CYXIiLCBKYXZhVXRpbHMueG1sTmFtZVRvSmF2YUlkZW50aWZpZXIoImZvb19iYXIiKSk7DQotICAgICAgICBhc3NlcnRFcXVhbHMoImZvb19iYXIiLCBKYXZhVXRpbHMueG1sTmFtZVRvSmF2YUlkZW50aWZpZXIoImZvb19iYXIiKSk7DQotDQotICAgICAgICBhc3NlcnRFcXVhbHMoImZvb0JhciIsIEphdmFVdGlscy54bWxOYW1lVG9KYXZhSWRlbnRpZmllcigiZm9vXHUwMEI3YmFyIikpOw0KLQ0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJmb29CYXIiLCBKYXZhVXRpbHMueG1sTmFtZVRvSmF2YUlkZW50aWZpZXIoImZvb1x1MDM4N2JhciIpKTsNCi0NCi0gICAgICAgIGFzc2VydEVxdWFscygiZm9vQmFyIiwgSmF2YVV0aWxzLnhtbE5hbWVUb0phdmFJZGVudGlmaWVyKCJmb29cdTA2RERiYXIiKSk7DQotDQotICAgICAgICBhc3NlcnRFcXVhbHMoImZvb0JhciIsIEphdmFVdGlscy54bWxOYW1lVG9KYXZhSWRlbnRpZmllcigiZm9vXHUwNkRFYmFyIikpOw0KLQ0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJmb29CYXIiLCBKYXZhVXRpbHMueG1sTmFtZVRvSmF2YUlkZW50aWZpZXIoIkZvb0JhciIpKTsNCi0NCi0vLyAgICAgICAgYXNzZXJ0RXF1YWxzKCJGT09CYXIiLCBKYXZhVXRpbHMueG1sTmFtZVRvSmF2YUlkZW50aWZpZXIoIkZPT0JhciIpKTsNCi0NCi0gICAgICAgIGFzc2VydEVxdWFscygiYTFCQkIiLCBKYXZhVXRpbHMueG1sTmFtZVRvSmF2YUlkZW50aWZpZXIoIkExLUJCQiIpKTsNCi0NCi0vLyAgICAgICAgYXNzZXJ0RXF1YWxzKCJBQkJCIiwgSmF2YVV0aWxzLnhtbE5hbWVUb0phdmFJZGVudGlmaWVyKCJBLUJCQiIpKTsNCi0NCi0vLyAgICAgICAgYXNzZXJ0RXF1YWxzKCJBQ0NDIiwgSmF2YVV0aWxzLnhtbE5hbWVUb0phdmFJZGVudGlmaWVyKCJBQ0NDIikpOw0KLQ0KLQ0KLSAgICAgICAgLy8gdGhlIGZvbGxvd2luZyBjYXNlcyBhcmUgYW1iaWd1b3VzIGluIEpTUi0xMDENCi0gICAgICAgIGFzc2VydEVxdWFscygiZm9vQmFyIiwgSmF2YVV0aWxzLnhtbE5hbWVUb0phdmFJZGVudGlmaWVyKCJmb28gYmFyIikpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJfMSIsIEphdmFVdGlscy54bWxOYW1lVG9KYXZhSWRlbnRpZmllcigiLSIpKTsNCi0NCi0gICAgICAgIGFzc2VydEVxdWFscygiX2Fic3RyYWN0IiwgSmF2YVV0aWxzLnhtbE5hbWVUb0phdmFJZGVudGlmaWVyKCJhYnN0cmFjdCIpKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvVGhyZWFkQ29udGV4dE1pZ3JhdG9yVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi91dGlsL1RocmVhZENvbnRleHRNaWdyYXRvclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWYyMWRhMi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvVGhyZWFkQ29udGV4dE1pZ3JhdG9yVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi51dGlsOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0NvbmZpZ3VyYXRpb247Ci0KLXB1YmxpYyBjbGFzcyBUaHJlYWRDb250ZXh0TWlncmF0b3JUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBURVNUX1RIUkVBRF9DT05URVhUX01JR1JBVE9SX0xJU1RfSUQKLSAgICAgICAgICAgID0gIlRlc3QtVGhyZWFkQ29udGV4dE1pZ3JhdG9yLUxpc3QiOwotICAgIHByaXZhdGUgTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQ7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKLSAgICAgICAgbWVzc2FnZUNvbnRleHQgPSBuZXcgQ29uZmlndXJhdGlvbkNvbnRleHQobmV3IEF4aXNDb25maWd1cmF0aW9uKCkpLmNyZWF0ZU1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEVtcHR5TWlncmF0b3JTdHJ1Y3R1cmUoKQotICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFRocmVhZENvbnRleHRNaWdyYXRvclV0aWwKLSAgICAgICAgICAgICAgICAucGVyZm9ybU1pZ3JhdGlvblRvVGhyZWFkKFRFU1RfVEhSRUFEX0NPTlRFWFRfTUlHUkFUT1JfTElTVF9JRCwgbWVzc2FnZUNvbnRleHQpOwotICAgICAgICBUaHJlYWRDb250ZXh0TWlncmF0b3JVdGlsCi0gICAgICAgICAgICAgICAgLnBlcmZvcm1NaWdyYXRpb25Ub0NvbnRleHQoVEVTVF9USFJFQURfQ09OVEVYVF9NSUdSQVRPUl9MSVNUX0lELCBtZXNzYWdlQ29udGV4dCk7Ci0gICAgICAgIFRocmVhZENvbnRleHRNaWdyYXRvclV0aWwKLSAgICAgICAgICAgICAgICAucGVyZm9ybVRocmVhZENsZWFudXAoVEVTVF9USFJFQURfQ09OVEVYVF9NSUdSQVRPUl9MSVNUX0lELCBtZXNzYWdlQ29udGV4dCk7Ci0gICAgICAgIFRocmVhZENvbnRleHRNaWdyYXRvclV0aWwKLSAgICAgICAgICAgICAgICAucGVyZm9ybUNvbnRleHRDbGVhbnVwKFRFU1RfVEhSRUFEX0NPTlRFWFRfTUlHUkFUT1JfTElTVF9JRCwgbWVzc2FnZUNvbnRleHQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNaWdyYXRpb24oKQotICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFRlc3RNaWdyYXRvciB0ZXN0TWlncmF0b3IxID0gbmV3IFRlc3RNaWdyYXRvcigpOwotICAgICAgICBUZXN0TWlncmF0b3IgdGVzdE1pZ3JhdG9yMiA9IG5ldyBUZXN0TWlncmF0b3IoKTsKLSAgICAgICAgVGhyZWFkQ29udGV4dE1pZ3JhdG9yVXRpbC5hZGRUaHJlYWRDb250ZXh0TWlncmF0b3IobWVzc2FnZUNvbnRleHQuZ2V0Q29uZmlndXJhdGlvbkNvbnRleHQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVTVF9USFJFQURfQ09OVEVYVF9NSUdSQVRPUl9MSVNUX0lELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0TWlncmF0b3IxKTsKLSAgICAgICAgVGhyZWFkQ29udGV4dE1pZ3JhdG9yVXRpbC5hZGRUaHJlYWRDb250ZXh0TWlncmF0b3IobWVzc2FnZUNvbnRleHQuZ2V0Q29uZmlndXJhdGlvbkNvbnRleHQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVTVF9USFJFQURfQ09OVEVYVF9NSUdSQVRPUl9MSVNUX0lELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0TWlncmF0b3IyKTsKLSAgICAgICAgVGhyZWFkQ29udGV4dE1pZ3JhdG9yVXRpbAotICAgICAgICAgICAgICAgIC5wZXJmb3JtTWlncmF0aW9uVG9UaHJlYWQoVEVTVF9USFJFQURfQ09OVEVYVF9NSUdSQVRPUl9MSVNUX0lELCBtZXNzYWdlQ29udGV4dCk7Ci0gICAgICAgIGFzc2VydFRydWUodGVzdE1pZ3JhdG9yMS5taWdyYXRlZFRvVGhyZWFkKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSh0ZXN0TWlncmF0b3IyLm1pZ3JhdGVkVG9UaHJlYWQpOwotICAgICAgICBUaHJlYWRDb250ZXh0TWlncmF0b3JVdGlsCi0gICAgICAgICAgICAgICAgLnBlcmZvcm1NaWdyYXRpb25Ub0NvbnRleHQoVEVTVF9USFJFQURfQ09OVEVYVF9NSUdSQVRPUl9MSVNUX0lELCBtZXNzYWdlQ29udGV4dCk7Ci0gICAgICAgIGFzc2VydFRydWUodGVzdE1pZ3JhdG9yMS5taWdyYXRlZFRvQ29udGV4dCk7Ci0gICAgICAgIGFzc2VydFRydWUodGVzdE1pZ3JhdG9yMi5taWdyYXRlZFRvQ29udGV4dCk7Ci0gICAgICAgIFRocmVhZENvbnRleHRNaWdyYXRvclV0aWwKLSAgICAgICAgICAgICAgICAucGVyZm9ybVRocmVhZENsZWFudXAoVEVTVF9USFJFQURfQ09OVEVYVF9NSUdSQVRPUl9MSVNUX0lELCBtZXNzYWdlQ29udGV4dCk7Ci0gICAgICAgIGFzc2VydFRydWUodGVzdE1pZ3JhdG9yMS5jbGVhbmVkVGhyZWFkKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSh0ZXN0TWlncmF0b3IyLmNsZWFuZWRUaHJlYWQpOwotICAgICAgICBUaHJlYWRDb250ZXh0TWlncmF0b3JVdGlsCi0gICAgICAgICAgICAgICAgLnBlcmZvcm1Db250ZXh0Q2xlYW51cChURVNUX1RIUkVBRF9DT05URVhUX01JR1JBVE9SX0xJU1RfSUQsIG1lc3NhZ2VDb250ZXh0KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSh0ZXN0TWlncmF0b3IxLmNsZWFuZWRDb250ZXh0KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSh0ZXN0TWlncmF0b3IyLmNsZWFuZWRDb250ZXh0KTsKLSAgICB9Ci0KLSAgICBjbGFzcyBUZXN0TWlncmF0b3IgaW1wbGVtZW50cyBUaHJlYWRDb250ZXh0TWlncmF0b3IgewotICAgICAgICBib29sZWFuIG1pZ3JhdGVkVG9UaHJlYWQ7Ci0gICAgICAgIGJvb2xlYW4gY2xlYW5lZFRocmVhZDsKLSAgICAgICAgYm9vbGVhbiBtaWdyYXRlZFRvQ29udGV4dDsKLSAgICAgICAgYm9vbGVhbiBjbGVhbmVkQ29udGV4dDsKLQotICAgICAgICBwdWJsaWMgdm9pZCBtaWdyYXRlQ29udGV4dFRvVGhyZWFkKE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgICAgIG1pZ3JhdGVkVG9UaHJlYWQgPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgY2xlYW51cFRocmVhZChNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCkgewotICAgICAgICAgICAgY2xlYW5lZFRocmVhZCA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBtaWdyYXRlVGhyZWFkVG9Db250ZXh0KE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgICAgIG1pZ3JhdGVkVG9Db250ZXh0ID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGNsZWFudXBDb250ZXh0KE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0KSB7Ci0gICAgICAgICAgICBjbGVhbmVkQ29udGV4dCA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvdXRpbC9VdGlsc1BhcnNlUmVxdWVzdFRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvdXRpbC9VdGlsc1BhcnNlUmVxdWVzdFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ0MWQ0ZC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvVXRpbHNQYXJzZVJlcXVlc3RUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudXRpbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQWJzdHJhY3RUZXN0Q2FzZTsKLQotLyoqCi0gKiBUZXN0IHRoYXQgdGhpbmdzIGJyZWFrCi0gKi8KLQotcHVibGljIGNsYXNzIFV0aWxzUGFyc2VSZXF1ZXN0VGVzdCBleHRlbmRzIEFic3RyYWN0VGVzdENhc2UgewotCi0gICAgcHVibGljIFV0aWxzUGFyc2VSZXF1ZXN0VGVzdChTdHJpbmcgdGVzdE5hbWUpIHsKLSAgICAgICAgc3VwZXIodGVzdE5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RmYWlsdXJlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vZmFpbCgiaGVyZSIpOwotICAgIH0KLQotLy8gICAgcHVibGljIHZvaWQgdGVzdFNlcnZpY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vICAgICAgICBhc3NlcnRQYXJzZXNUbygiaHR0cDovL2xvY2FsaG9zdDo4MDgxL3NlcnZpY2VzL1N5c3RlbSIsCi0vLyAgICAgICAgICAgICAgICAgICAgICAgIlN5c3RlbSIpOwotLy8gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNlcnZpY2VDYWxsZWRTZXJ2aWNlcygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnRQYXJzZXNUbygiaHR0cDovL2xvY2FsaG9zdDo4MDgxL3NlcnZpY2VzL3NlcnZpY2VzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgInNlcnZpY2VzIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNlcnZpY2VXaXRoUXVlcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0UGFyc2VzVG8oImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MS9zZXJ2aWNlcy9TeXN0ZW0/c3lzdGVtPWVjYjJmIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIlN5c3RlbSIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJ2aWNlV2l0aERvdWJsZVF1ZXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydFBhcnNlc1RvKCJodHRwOi8vbG9jYWxob3N0OjgwODEvc2VydmljZXMvU3lzdGVtP3N5c3RlbT1lY2IyZj9qb2I9MyIsCi0gICAgICAgICAgICAgICAgICAgICAgICJTeXN0ZW0iKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0T3BlcmF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydFBhcnNlc1RvKCJodHRwOi8vbG9jYWxob3N0OjgwODEvc2VydmljZXMvU3lzdGVtL29wZXJhdGlvbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICJTeXN0ZW0iLCAib3BlcmF0aW9uIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE9wZXJhdGlvbldpdGhRdWVyeSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnRQYXJzZXNUbygiaHR0cDovL2xvY2FsaG9zdDo4MDgxL3NlcnZpY2VzL1N5c3RlbS9vcGVyYXRpb24/c3lzdGVtPWVjYjJmIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIlN5c3RlbSIsICJvcGVyYXRpb24iKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0T3BlcmF0aW9uU2VydmljZUNhbGxlZFNlcnZpY2VzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydFBhcnNlc1RvKCJodHRwOi8vbG9jYWxob3N0OjgwODEvc2VydmljZXMvc2VydmljZXMvb3BlcmF0aW9uIiwKLSAgICAgICAgICAgICAgICAgICAgICAgInNlcnZpY2VzIiwgIm9wZXJhdGlvbiIpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhc3NlcnRQYXJzZXNUbyhTdHJpbmcgcGF0aCwgU3RyaW5nIHNlcnZpY2UpIHsKLSAgICAgICAgYXNzZXJ0UGFyc2VzVG8ocGF0aCwgc2VydmljZSwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFzc2VydFBhcnNlc1RvKFN0cmluZyBwYXRoLCBTdHJpbmcgc2VydmljZSwgU3RyaW5nIG9wZXJhdGlvbikgewotICAgICAgICBTdHJpbmdbXSBzdHJpbmdzID0gVXRpbHMucGFyc2VSZXF1ZXN0VVJMRm9yU2VydmljZUFuZE9wZXJhdGlvbihwYXRoLCAiL2F4aXMyL3NlcnZpY2VzIik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhzZXJ2aWNlLCBzdHJpbmdzWzBdKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG9wZXJhdGlvbiwgc3RyaW5nc1sxXSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvdGhyZWFkcG9vbC9UZXN0VGhyZWFkUG9vbC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi91dGlsL3RocmVhZHBvb2wvVGVzdFRocmVhZFBvb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNmZTcxZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvdGhyZWFkcG9vbC9UZXN0VGhyZWFkUG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnV0aWwudGhyZWFkcG9vbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQWJzdHJhY3RUZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0VGhyZWFkUG9vbCBleHRlbmRzIEFic3RyYWN0VGVzdENhc2UgewotICAgIC8qKgotICAgICAqIEBwYXJhbSB0ZXN0TmFtZQotICAgICAqLwotICAgIHB1YmxpYyBUZXN0VGhyZWFkUG9vbChTdHJpbmcgdGVzdE5hbWUpIHsKLSAgICAgICAgc3VwZXIodGVzdE5hbWUpOwotICAgIH0KLQotICAgIGNsYXNzIFRlc3RXb3JrZXIgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiB3b3JrRG9uZTsKLQotICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICB3b3JrRG9uZSA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1dvcmtEb25lKCkgewotICAgICAgICAgICAgcmV0dXJuIHdvcmtEb25lOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UG9vbCgpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBUaHJlYWRQb29sIHRQb29sID0gbmV3IFRocmVhZFBvb2woKTsKLSAgICAgICAgTGlzdCB3b3JrZXJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNTsgaSsrKSB7Ci0gICAgICAgICAgICBUZXN0V29ya2VyIHdvcmtlciA9IG5ldyBUZXN0V29ya2VyKCk7Ci0gICAgICAgICAgICB3b3JrZXJMaXN0LmFkZCh3b3JrZXIpOwotICAgICAgICAgICAgdFBvb2wuZXhlY3V0ZSh3b3JrZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgdFBvb2wuc2FmZVNodXREb3duKCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1OyBpKyspIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCAoKFRlc3RXb3JrZXIpIHdvcmtlckxpc3QuZ2V0KGkpKS5pc1dvcmtEb25lKCkpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvdmFsaWRhdGlvbi9WYWxpZGF0ZUF4aXMyWE1MVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi92YWxpZGF0aW9uL1ZhbGlkYXRlQXhpczJYTUxUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyODgxZDUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi92YWxpZGF0aW9uL1ZhbGlkYXRlQXhpczJYTUxUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi52YWxpZGF0aW9uOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQWJzdHJhY3RUZXN0Q2FzZTsNCi1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcueG1sLnNheC5TQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyOw0KLQ0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXI7DQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3Rvcnk7DQotaW1wb3J0IGphdmEuaW8uRmlsZTsNCi0NCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGVBeGlzMlhNTFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7DQotDQotDQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyB2YWxpZGF0aW9uRmVhdHVyZQ0KLSAgICAgICAgICAgID0gImh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy92YWxpZGF0aW9uIjsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHNjaGVtYVZhbGlkYXRpb25GZWF0dXJlDQotICAgICAgICAgICAgPSAiaHR0cDovL2FwYWNoZS5vcmcveG1sL2ZlYXR1cmVzL3ZhbGlkYXRpb24vc2NoZW1hIjsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGV4dFNjaGVtYVByb3ANCi0gICAgICAgICAgICA9ICJodHRwOi8vYXBhY2hlLm9yZy94bWwvcHJvcGVydGllcy9zY2hlbWEvZXh0ZXJuYWwtbm9OYW1lc3BhY2VTY2hlbWFMb2NhdGlvbiI7DQotDQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gdmFsaWRhdGUoRmlsZSB4bWxTb3VyY2UsIEZpbGUgeHNkU291cmNlKSB7DQotDQotICAgICAgICBib29sZWFuIHZhbGlkID0gdHJ1ZTsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgU0FYUGFyc2VyRmFjdG9yeSBmYWN0b3J5ID0gU0FYUGFyc2VyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOw0KLQ0KLSAgICAgICAgICAgIC8vIGNvbmZpZ3VyZXMgdGhlIHhlcmNlcyBwYXJzZXIgZm9yIHNjaGVtYSB2YWxpZGF0aW9uLg0KLSAgICAgICAgICAgIGZhY3Rvcnkuc2V0RmVhdHVyZSh2YWxpZGF0aW9uRmVhdHVyZSwgdHJ1ZSk7DQotICAgICAgICAgICAgZmFjdG9yeS5zZXRGZWF0dXJlKHNjaGVtYVZhbGlkYXRpb25GZWF0dXJlLCB0cnVlKTsNCi0NCi0gICAgICAgICAgICBTQVhQYXJzZXIgcGFyc2VyID0gZmFjdG9yeS5uZXdTQVhQYXJzZXIoKTsNCi0NCi0gICAgICAgICAgICAvL3ZhbGlkYXRlIGFnYWluc3QgdGhlIGdpdmVuIHNjaGVtYVVSTA0KLSAgICAgICAgICAgIHBhcnNlci5zZXRQcm9wZXJ0eShleHRTY2hlbWFQcm9wLCB4c2RTb3VyY2UudG9VUkwoKS50b1N0cmluZygpKTsNCi0NCi0gICAgICAgICAgICAvLyBwYXJzZSAodmFsaWRhdGVzKSB0aGUgeG1sDQotICAgICAgICAgICAgcGFyc2VyLnBhcnNlKHhtbFNvdXJjZSwgbmV3IERlZmF1bHRIYW5kbGVyKCkpOw0KLQ0KLSAgICAgICAgfSBjYXRjaCAoU0FYTm90UmVjb2duaXplZEV4Y2VwdGlvbiBzbnJlKSB7DQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTQVggbm90IHJlY29nbmlzZWQgIiArIHNucmUpOw0KLSAgICAgICAgICAgIHZhbGlkID0gZmFsc2U7DQotICAgICAgICB9IGNhdGNoIChTQVhFeGNlcHRpb24gc2UpIHsNCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlNBWCBwYXJzZXIgIiArIHNlKTsNCi0gICAgICAgICAgICB2YWxpZCA9IGZhbHNlOw0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImVycm9yIHBhcnNpbmcgIiArIGUpOw0KLSAgICAgICAgICAgIHZhbGlkID0gZmFsc2U7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gdmFsaWQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdERlZmF1bHRBeGlzMlhNTCgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgU3RyaW5nIHhtbEZpbGUgPQ0KLSAgICAgICAgICAgICAgICBBYnN0cmFjdFRlc3RDYXNlLmJhc2VkaXIgKyAiL2NvbmYvYXhpczIueG1sIjsNCi0gICAgICAgIFN0cmluZyB4c2RGaWxlID0NCi0gICAgICAgICAgICAgICAgQWJzdHJhY3RUZXN0Q2FzZS5iYXNlZGlyICsgIi9yZXNvdXJjZXMvYXhpczIueHNkIjsNCi0gICAgICAgIGFzc2VydFRydWUodmFsaWRhdGUobmV3IEZpbGUoeG1sRmlsZSksIG5ldyBGaWxlKHhzZEZpbGUpKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3NbXSkgew0KLSAgICAgICAgRmlsZSBmMSA9IG5ldyBGaWxlKGFyZ3NbMF0pOw0KLSAgICAgICAgRmlsZSBmMiA9IG5ldyBGaWxlKGFyZ3NbMV0pOw0KLSAgICAgICAgaWYgKGYxLmlzRGlyZWN0b3J5KCkpIHsNCi0gICAgICAgICAgICByZWN1cnNlRGlyZWN0b3J5KGYxLCBmMik7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihmMS5nZXRBYnNvbHV0ZVBhdGgoKSArICIgOiAiICsgKHZhbGlkYXRlKGYxLCBmMikgPyAiT0siIDogIklOVkFMSUQiKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCByZWN1cnNlRGlyZWN0b3J5KEZpbGUgZjEsIEZpbGUgZjIpIHsNCi0gICAgICAgIEZpbGVbXSBhcnJheSA9IGYxLmxpc3RGaWxlcygpOw0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykgew0KLSAgICAgICAgICAgIEZpbGUgZmlsZSA9IGFycmF5W2ldOw0KLSAgICAgICAgICAgIGlmIChmaWxlLmlzRGlyZWN0b3J5KCkpIHsNCi0gICAgICAgICAgICAgICAgcmVjdXJzZURpcmVjdG9yeShmaWxlLCBmMik7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgaWYgKGZpbGUuZ2V0TmFtZSgpLmVuZHNXaXRoKCJheGlzMi54bWwiKSkgew0KLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiIDogIiArICh2YWxpZGF0ZShmaWxlLCBmMikgPyAiT0siIDogIklOVkFMSUQiKSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvYnVpbGQueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTEyMmYyLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL2J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxwcm9qZWN0IG5hbWU9Iml0ZXN0IiBkZWZhdWx0PSJidWlsZC1yZXBvIiBiYXNlZGlyPSIuIj4KLQotCTx0YXJnZXQgbmFtZT0iYnVpbGQtcmVwbyIgdW5sZXNzPSJ0ZXN0LnNraXAiPgotCi0JCTwhLS0gU3RhbmRhcmQgcmVwb3NpdG9yeSAtLT4KLQkJPG1rZGlyIGRpcj0idGFyZ2V0L3JlcG9zaXRvcnkiLz4KLQkJPG1rZGlyIGRpcj0idGFyZ2V0L3JlcG9zaXRvcnkvY29uZiIvPgotCQk8bWtkaXIgZGlyPSJ0YXJnZXQvcmVwb3NpdG9yeS9zZXJ2aWNlcyIvPgotCQk8bWtkaXIgZGlyPSJ0YXJnZXQvcmVwb3NpdG9yeS9tb2R1bGVzIi8+Ci0JCTxjb3B5IGZpbGU9Ii4uL2FkZHJlc3NpbmcvdGFyZ2V0L2FkZHJlc3NpbmctJHthZGRyZXNzaW5nX3ZlcnNpb259Lm1hciIKLSAgICAJICAgICAgICAgICAgICAgICAgdG9maWxlPSJ0YXJnZXQvcmVwb3NpdG9yeS9tb2R1bGVzL2FkZHJlc3NpbmctJHthZGRyZXNzaW5nX3ZlcnNpb259Lm1hciIvPgotCQk8Y29weSBmaWxlPSIuLi9rZXJuZWwvY29uZi9heGlzMi54bWwiCi0gICAgCSAgICAgICAgICAgICAgICAgIHRvZmlsZT0idGFyZ2V0L3JlcG9zaXRvcnkvY29uZi9heGlzMi54bWwiLz4KLQotCTwvdGFyZ2V0PgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9wb20ueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTJhZGJjNS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjI5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjEuNS4xPC92ZXJzaW9uPgotICAgICAgICA8cmVsYXRpdmVQYXRoPi4uL3BhcmVudC9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+Ci0gICAgPC9wYXJlbnQ+Ci0gICAgPGFydGlmYWN0SWQ+YXhpczItbWV0YWRhdGE8L2FydGlmYWN0SWQ+Ci0gICAgPG5hbWU+QXBhY2hlIEF4aXMyIC0gTWV0YWRhdGE8L25hbWU+Ci0gICAgPGRlc2NyaXB0aW9uPkpTUi0xODEgYW5kIEpTUi0yMjQgQW5ub3RhdGlvbnMgUHJvY2Vzc2luZzwvZGVzY3JpcHRpb24+Ci0gICAgPGRlcGVuZGVuY2llcz4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczIta2VybmVsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHt2ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZ2Vyb25pbW8uc3BlY3M8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5nZXJvbmltby1qYXh3c18yLjFfc3BlYzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1zYWFqPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHt2ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPnhtbC1yZXNvbHZlcjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnhtbC1yZXNvbHZlcjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmNvbS5zdW4ueG1sLmJpbmQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXhiLWltcGw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8ZXhjbHVzaW9ucz4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qc3IxNzM8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPmphdmF4LnhtbDwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgIDwvZXhjbHVzaW9ucz4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmNvbS5zdW4ueG1sLmJpbmQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXhiLXhqYzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmxvZzRqPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bG9nNGo8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC54bWwuYmluZDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmpheGItYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPGV4Y2x1c2lvbnM+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+anNyMTczPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC54bWw8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICA8L2V4Y2x1c2lvbnM+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItdHJhbnNwb3J0LWh0dHA8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3ZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLXRyYW5zcG9ydC1sb2NhbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7dmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8L2RlcGVuZGVuY2llcz4KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxzb3VyY2VEaXJlY3Rvcnk+c3JjPC9zb3VyY2VEaXJlY3Rvcnk+Ci0gICAgICAgIDx0ZXN0U291cmNlRGlyZWN0b3J5PnRlc3Q8L3Rlc3RTb3VyY2VEaXJlY3Rvcnk+Ci0gICAgICAgIDxyZXNvdXJjZXM+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT4uLi8uLjwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+Tk9USUNFLnR4dDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+TElDRU5TRS50eHQ8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgICAgICA8ZmlsdGVyaW5nPmZhbHNlPC9maWx0ZXJpbmc+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi8qLmphdmE8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9leGNsdWRlcz4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgIDwvcmVzb3VyY2VzPgotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphci1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgIDxhcmNoaXZlPiAgCi0gICAgICAgICAgICAgICAgICA8bWFuaWZlc3RGaWxlPnJlc291cmNlcy9NRVRBLUlORi9NQU5JRkVTVC5NRjwvbWFuaWZlc3RGaWxlPgotICAgICAgICAgICAgICAgIDwvYXJjaGl2ZT4gCi0gICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPiAgCi0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGNvbXBpbGVyQXJndW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAtWGJvb3RjbGFzc3BhdGgvcDoke2Jhc2VkaXJ9Ly4uL2pheHdzLWFwaS90YXJnZXQvY2xhc3NlcyR7cGF0aC5zZXBhcmF0b3J9JHtiYXNlZGlyfS8uLi9qd3MtYXBpL3RhcmdldC9jbGFzc2VzCi0gICAgICAgICAgICAgICAgICAgIDwvY29tcGlsZXJBcmd1bWVudD4KLSAgICAgICAgICAgICAgICAgICAgPGNvbXBpbGVyVmVyc2lvbj4xLjU8L2NvbXBpbGVyVmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPHNvdXJjZT4xLjU8L3NvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgPHRhcmdldD4xLjU8L3RhcmdldD4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFudHJ1bi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+Z2VuLXRzPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5nZW5lcmF0ZS10ZXN0LXNvdXJjZXM8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhc2tzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFRoZXJlcyBnb3QgdG8gYmUgYSBiZXR0ZXIgd2F5IHRvIGRvIHRoaXMgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzY2hlbWEuc291cmNlLmRpciIgdmFsdWU9InRlc3QtcmVzb3VyY2VzL3hzZCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0id3NkbC5zb3VyY2UuZGlyIiB2YWx1ZT0idGVzdC1yZXNvdXJjZXMvd3NkbCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ic2NoZW1hLm91dHB1dC5iYXNlLmRpciIgdmFsdWU9InRhcmdldC9zY2hlbWEiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InNjaGVtYS5nZW5lcmF0ZWQuc3JjLmRpciIgdmFsdWU9IiR7c2NoZW1hLm91dHB1dC5iYXNlLmRpcn0vc3JjIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzY2hlbWEuZ2VuZXJhdGVkLmNsYXNzZXMuZGlyIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9IiR7c2NoZW1hLm91dHB1dC5iYXNlLmRpcn0vY2xhc3NlcyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIG1ha2UgdGhlIGRpcnMgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxta2RpciBkaXI9IiR7c2NoZW1hLm91dHB1dC5iYXNlLmRpcn0iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1rZGlyIGRpcj0iJHtzY2hlbWEuZ2VuZXJhdGVkLnNyYy5kaXJ9Ii8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxta2RpciBkaXI9IiR7c2NoZW1hLmdlbmVyYXRlZC5jbGFzc2VzLmRpcn0iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBSdW4gSkFYQiBzY2hlbWEgY29tcGlsZXIgd2l0aCBkZXNpZ25hdGVkIHNjaGVtYXMgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlY2hvPkdlbmVyYXRpbmcgSkFYLUIgY2xhc3NlcyBmcm9tIFhTRHM8L2VjaG8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlY2hvPkdlbmVyYXRpbmcgamF2YSBmcm9tIFByb3h5RG9jTGl0V3JhcHBlZC53c2RsPC9lY2hvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8amF2YSBjbGFzc25hbWU9ImNvbS5zdW4udG9vbHMueGpjLkRyaXZlciIgZm9yaz0idHJ1ZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJtYXZlbi5ydW50aW1lLmNsYXNzcGF0aCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzcGF0aCBsb2NhdGlvbj0iJHtjb21waWxlZC5jbGFzc2VzLmRpcn0iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcmcgbGluZT0iLWQgJHtzY2hlbWEuZ2VuZXJhdGVkLnNyYy5kaXJ9IC1xdWlldCAtcCBvcmcudGVzdC5wcm94eS5kb2NsaXR3cmFwcGVkIC1xdWlldCAtd3NkbCAke3dzZGwuc291cmNlLmRpcn0vUHJveHlEb2NMaXRXcmFwcGVkLndzZGwiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9qYXZhPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFza3M+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+cnVuPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+YnVpbGQtcmVwbzwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+dGVzdC1jb21waWxlPC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YXNrcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvcHkgdG9EaXI9InRhcmdldC90ZXN0LWNsYXNzZXMvIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0idGVzdC1yZXNvdXJjZXMvIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLnByb3BlcnRpZXMiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0idGVzdCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9IYW5kbGVyQ29uZmlnRmlsZS54bWwiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb3B5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iYWRkcmVzc2luZ192ZXJzaW9uIiB2YWx1ZT0iJHt2ZXJzaW9ufSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YW50IGFudGZpbGU9ImJ1aWxkLnhtbCIgaW5oZXJpdGFsbD0idHJ1ZSIgaW5oZXJpdHJlZnM9InRydWUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyPSIuIiB0YXJnZXQ9ImJ1aWxkLXJlcG8iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rhc2tzPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnJ1bjwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotCi0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmJ1aWxkLWhlbHBlci1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+YWRkLXRlc3Qtc291cmNlPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wcm9jZXNzLXRlc3QtcmVzb3VyY2VzPC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5hZGQtdGVzdC1zb3VyY2U8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNvdXJjZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzb3VyY2U+JHtiYXNlZGlyfS90YXJnZXQvc2NoZW1hL3NyYzwvc291cmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc291cmNlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHNraXA+ZmFsc2U8L3NraXA+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLypUZXN0cy5qYXZhPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8c3lzdGVtUHJvcGVydGllcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5vcmcuYXBhY2hlLmF4aXMyLmpheHdzLnJlcG8ucGF0aDwvbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmFsdWU+Li90YXJnZXQvcmVwb3NpdG9yeTwvdmFsdWU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3Byb3BlcnR5PgotICAgICAgICAgICAgICAgICAgICA8L3N5c3RlbVByb3BlcnRpZXM+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgIDwvcGx1Z2lucz4KLSAgICA8L2J1aWxkPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvcmVzb3VyY2VzL01FVEEtSU5GL01BTklGRVNULk1GIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvcmVzb3VyY2VzL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzE2MWZkLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3Jlc291cmNlcy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMA0KLUJ1bmRsZS1MaWNlbnNlOiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAudHh0DQotSW1wb3J0LVBhY2thZ2U6IA0KLSBqYXZheC5qd3MsDQotIGphdmF4Lmp3cy5zb2FwLA0KLSBqYXZheC5zZXJ2bGV0LA0KLSBqYXZheC53c2RsLA0KLSBqYXZheC53c2RsLmV4dGVuc2lvbnMsDQotIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLA0KLSBqYXZheC53c2RsLmV4dGVuc2lvbnMubWltZSwNCi0gamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAsDQotIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwMTIsDQotIGphdmF4LndzZGwuZmFjdG9yeSwNCi0gamF2YXgud3NkbC54bWwsDQotIGphdmF4LnhtbC5iaW5kLA0KLSBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLA0KLSBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLmFkYXB0ZXJzLA0KLSBqYXZheC54bWwubmFtZXNwYWNlLA0KLSBqYXZheC54bWwuc3RyZWFtLA0KLSBqYXZheC54bWwud3MsDQotIGphdmF4LnhtbC53cy5oYW5kbGVyLA0KLSBqYXZheC54bWwud3MuaGFuZGxlci5zb2FwLA0KLSBqYXZheC54bWwud3Muc29hcCwNCi0gamF2YXgueG1sLndzLnNwaSwNCi0gb3JnLmFwYWNoZS5heGlvbS5vbSwNCi0gb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmJ1aWxkZXIsDQotIG9yZy5hcGFjaGUuYXhpb20uc29hcCwNCi0gb3JnLmFwYWNoZS5heGlzMiwNCi0gb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLA0KLSBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcubWV0YWRhdGEsDQotIG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy53c2RsLA0KLSBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudCwNCi0gb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LA0KLSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFyZXRyaWV2YWwsDQotIG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudCwNCi0gb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LnV0aWwsDQotIG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24sDQotIG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLA0KLSBvcmcuYXBhY2hlLmF4aXMyLmkxOG4sDQotIG9yZy5hcGFjaGUuYXhpczIuamF2YS5zZWN1cml0eSwNCi0gb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cCwNCi0gb3JnLmFwYWNoZS5heGlzMi51dGlsLA0KLSBvcmcuYXBhY2hlLmF4aXMyLndzZGwudXRpbCwNCi0gb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcsDQotIG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEsDQotIG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEucmVzb2x2ZXIsDQotIG9yZy5hcGFjaGUueG1sLnJlc29sdmVyLA0KLSBvcmcuYXBhY2hlLnhtbC5yZXNvbHZlci5oZWxwZXJzLA0KLSBvcmcudzNjLmRvbSwNCi0gb3JnLnhtbC5zYXgNCi1FeHBvcnQtUGFja2FnZTogDQotIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuYWRkcmVzc2luZywNCi0gb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jYXRhbG9nLmltcGwsDQotIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY2F0YWxvZywNCi0gb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLmNvbnZlcnRlciwNCi0gb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLA0KLSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmltcGwsDQotIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24udmFsaWRhdG9yLA0KLSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLnhtbC5oYW5kbGVyLA0KLSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLA0KLSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmZlYXR1cmUsDQotIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaTE4biwNCi0gb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5yZWdpc3RyeSwNCi0gb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zZXJ2ZXIuY29uZmlnLA0KLSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnV0aWwsDQotIG9yZy5hcGFjaGUuYXhpczIuamF4d3Mud3NkbCwNCi0gb3JnLmFwYWNoZS5heGlzMi5qYXh3cywNCi0gb3JnLmFwYWNoZS5heGlzMi5tZXRhZGF0YS5mYWN0b3J5LA0KLSBvcmcuYXBhY2hlLmF4aXMyLm1ldGFkYXRhLnJlZ2lzdHJ5LA0KLSBvcmcuYXBhY2hlLmF4aXMyLm1ldGFkYXRhLnJlc291cmNlLmltcGwsDQotIG9yZy5hcGFjaGUuYXhpczIubWV0YWRhdGEucmVzb3VyY2UNCi1CdW5kbGUtVmVyc2lvbjogMS40DQotQnVuZGxlLU5hbWU6IEF4aXMyIE1ldGFkYXRhDQotQnVuZGxlLURvY1VSTDogaHR0cDovL3d3dy5hcGFjaGUub3JnLw0KLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDINCi1CdW5kbGUtVmVuZG9yOiBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5hcGFjaGUuYXhpczIubWV0YWRhdGENCi0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9DbGllbnRDb25maWd1cmF0aW9uRmFjdG9yeS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvQ2xpZW50Q29uZmlndXJhdGlvbkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM2MmI0OC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9DbGllbnRDb25maWd1cmF0aW9uRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3czsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC5EZXBsb3ltZW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0NvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmkxOG4uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51dGlsLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLm1ldGFkYXRhLnJlZ2lzdHJ5Lk1ldGFkYXRhRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uOwotCi0KLS8qKiBUaGlzIGNsYXNzIHNlcnZlcyBhcyBhIGZhY3RvcnkgZm9yIENvbmZpZ3VyYXRpb25Db250ZXh0cyBzdWl0YWJsZSBpbiB0aGUgY2xpZW50IGVudmlyb25tZW50LiAqLwotcHVibGljIGNsYXNzIENsaWVudENvbmZpZ3VyYXRpb25GYWN0b3J5IHsKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coQ2xpZW50Q29uZmlndXJhdGlvbkZhY3RvcnkuY2xhc3MpOwotICAgIHByaXZhdGUgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ29udGV4dCA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgcmVwb1BhdGggPSBudWxsOwotICAgIHByaXZhdGUgU3RyaW5nIGF4aXNDb25maWdQYXRoID0gbnVsbDsKLQotICAgIC8qKiBSZXR1cm5zIGEgQ2xpZW50Q29uZmlndXJhdGlvbkZhY3Rvcnkgb2JqZWN0LiAqLwotICAgIHB1YmxpYyBzdGF0aWMgQ2xpZW50Q29uZmlndXJhdGlvbkZhY3RvcnkgbmV3SW5zdGFuY2UoKSB7Ci0gICAgICAgIHJldHVybiAoQ2xpZW50Q29uZmlndXJhdGlvbkZhY3RvcnkpTWV0YWRhdGFGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShDbGllbnRDb25maWd1cmF0aW9uRmFjdG9yeS5jbGFzcyk7ICAgICAgIAotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIENvbmZpZ3VyYXRpb25Db250ZXh0IGZyb20gdGhlIHNwZWNpZmllZCBjb25maWd1cmF0b3IgCi0gICAgICogCi0gICAgICogQHBhcmFtIGNvbmZpZ3VyYXRvcgotICAgICAqLwotICAgIHB1YmxpYyBDbGllbnRDb25maWd1cmF0aW9uRmFjdG9yeShBeGlzQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvcikgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgY29uZmlnQ29udGV4dCA9IENvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeS5jcmVhdGVDb25maWd1cmF0aW9uQ29udGV4dChjb25maWd1cmF0b3IpOwotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgZSkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJjbGllbnRDb25maWdDdHh0RXJyIiwgZS5nZXRNZXNzYWdlKCkpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIENvbmZpZ3VyYXRpb25Db250ZXh0IGZyb20gdGhlIHNwZWNpZmllZCByZXBvc2l0b3J5IGFuZCBheGlzMi54bWwgCi0gICAgICogCi0gICAgICogQHBhcmFtIGNvbmZpZ3VyYXRvcgotICAgICAqLwotICAgIHB1YmxpYyBDbGllbnRDb25maWd1cmF0aW9uRmFjdG9yeShTdHJpbmcgcmVwb1BhdGgsCi0gICAgICAgICAgICBTdHJpbmcgYXhpc0NvbmZpZ1BhdGgpIHsKLSAgICAgICAgdGhpcy5yZXBvUGF0aCA9IHJlcG9QYXRoOwotICAgICAgICB0aGlzLmF4aXNDb25maWdQYXRoID0gYXhpc0NvbmZpZ1BhdGg7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGVmYXVsdCBjb25zdHJ1Y3RvcgotICAgICAqLwotICAgIHB1YmxpYyBDbGllbnRDb25maWd1cmF0aW9uRmFjdG9yeSgpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMb2FkcyB1cCBhIENvbmZpZ3VyYXRpb25Db250ZXh0IG9iamVjdCB1c2luZyB0aGUgY29uZmlndXJhdGlvbiBidWlsZGVyLgotICAgICAqCi0gICAgICogQHJldHVybiBhIENvbmZpZ3VyYXRpb25Db250ZXh0IG9iamVjdCB0aGF0IGlzIHN1aXRhYmxlIGZvciB0aGUgY2xpZW50IGVudmlyb25tZW50Ci0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBDb25maWd1cmF0aW9uQ29udGV4dCBnZXRDbGllbnRDb25maWd1cmF0aW9uQ29udGV4dCgpIHsKLSAgICAgICAgLy8gSWYgdGhlIHVzZXIgaGFzIHNwZWNpZmllZCBvbiB1c2UgaXQuCi0gICAgICAgIGlmIChjb25maWdDb250ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBjb25maWdDb250ZXh0OwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZihyZXBvUGF0aCA9PSBudWxsKSAgewotICAgICAgICAgICAgLy8gR2V0IHRoZSBzeXN0ZW0gcHJvcGVydGllcyBmb3IgdGhlIHJlcG9zaXRvcnkuCi0gICAgICAgICAgICByZXBvUGF0aCA9IGdldFByb3BlcnR5X2RvUHJpdihDb25zdGFudHMuQVhJUzJfUkVQT19QQVRIKTsKLSAgICAgICAgfQotICAgICAgICBpZihheGlzQ29uZmlnUGF0aCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBHZXQgdGhlIHN5c3RlbSBwcm9wZXJ0aWVzIGZvciBheGlzMi54bWwgCi0gICAgICAgICAgICBheGlzQ29uZmlnUGF0aCA9IGdldFByb3BlcnR5X2RvUHJpdihDb25zdGFudHMuQVhJUzJfQ09ORklHX1BBVEgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJBeGlzMiByZXBvc2l0b3J5IHBhdGggOiAiICsgcmVwb1BhdGgpOwotICAgICAgICAgICAgbG9nLmRlYnVnKCJBeGlzMiBDb25maWcgcGF0aCA6ICIgKyBheGlzQ29uZmlnUGF0aCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIElmIHRoZXkgYXJlIG5vdCBzcGVjaWZpZWQsIGNyZWF0ZSBhIGRlZmF1bHQgb25lIGZyb20gdGhlIGF4aXMyX2RlZmF1bHQueG1sIGluc2lkZSB0aGUga2VybmVsIGphci4KLS8vICAgICAgICBpZiAocmVwb1BhdGggPT0gbnVsbCAmJiBheGlzQ29uZmlnUGF0aCA9PSBudWxsKSB7Ci0vLyAgICAgICAgICAgIHRyeSB7Ci0vLyAgICAgICAgICAgICAgICBjb25maWdDb250ZXh0ID0gQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5LmNyZWF0ZURlZmF1bHRDb25maWd1cmF0aW9uQ29udGV4dCgpOwotLy8gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotLy8gICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJjbGllbnRDb25maWdDdHh0RXJyIiwgZS5nZXRNZXNzYWdlKCkpKTsKLS8vICAgICAgICAgICAgfQotLy8gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIFRyeSB0aGUgZmlsZSBzeXN0ZW0gd2l0aCB0aGUgc3BlY2lmaWVkIHN5c3RlbSBwcm9wZXJ0aWVzLgotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIENvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeQotICAgICAgICAgICAgICAgICAgICAuY3JlYXRlQ29uZmlndXJhdGlvbkNvbnRleHRGcm9tRmlsZVN5c3RlbShyZXBvUGF0aCwgYXhpc0NvbmZpZ1BhdGgpOwotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgZSkgewotICAgICAgICAJdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJjbGllbnRDb25maWdDdHh0RXJyIixlLmdldE1lc3NhZ2UoKSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFByb3BlcnR5X2RvUHJpdihmaW5hbCBTdHJpbmcgcHJvcGVydHkpIHsKLSAgICAgICAgcmV0dXJuIChTdHJpbmcpCi0gICAgICAgICBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgKLSAgICAgICAgICAgICAgbmV3IFByaXZpbGVnZWRBY3Rpb24oKSB7Ci0KLSAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTeXN0ZW0uZ2V0UHJvcGVydHkocHJvcGVydHkpOwotICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFBlcmZvcm0gYW55IGZpbmFsIGNsaWVudC1zcGVjaWZpYyBjb25maWd1cmF0aW9uIG9uIGEgbmV3bHkgY3JlYXRlZCBBeGlzU2VydmljZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzZXJ2aWNlIEEgbmV3bHkgY3JlYXRlZCBBeGlzU2VydmljZSBvbiB3aGljaCB0byBwZXJmb3JtIGFueSBmaW5hbCBjbGllbnQtcmVsYXRlZAotICAgICAqICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24uCi0gICAgICogQHRocm93cyBEZXBsb3ltZW50RXhjZXB0aW9uCi0gICAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgY29tcGxldGVBeGlzMkNvbmZpZ3VyYXRpb24oQXhpc1NlcnZpY2Ugc2VydmljZSkKLSAgICAgICAgICAgIHRocm93cyBEZXBsb3ltZW50RXhjZXB0aW9uLCBFeGNlcHRpb24gewotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL0V4Y2VwdGlvbkZhY3RvcnkuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL0V4Y2VwdGlvbkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc5NjRkNi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9FeGNlcHRpb25GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmkxOG4uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC54bWwud3MuUHJvdG9jb2xFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotCi0vKioKLSAqIEV4Y2VwdGlvbkZhY3RvcnkgaXMgdXNlZCB0byBjcmVhdGUgZXhjZXB0aW9ucyB3aXRoaW4gdGhlIEpBWC1XUyBpbXBsZW1lbnRhdGlvbi4gVGhlcmUgYXJlIHNldmVyYWwKLSAqIHJlYXNvbnMgZm9yIHVzaW5nIGEgZmFjdG9yeSB0byBjcmVhdGUgZXhjZXB0aW9ucy4gMS4gV2UgY2FuIGludGVyY2VwdCBhbGwgZXhjZXB0aW9uIGNyZWF0aW9uIGFuZAotICogYWRkIHRoZSBhcHByb3ByaWF0ZSBsb2dnaW5nL3NlcnZpY2VhYmlsaXR5LiAyLiBFeGNlcHRpb25zIGFyZSBjaGFpbmVkLiAgRXhjZXB0aW9uRmFjdG9yeSBjYW4KLSAqIGxlbmd0aGVuIG9yIHJlZHVjZSB0aGUgY2F1c2UgY2hhaW5zIGFzIG5lY2Vzc2FyeSB0byBzdXBwb3J0IHRoZSBKQVgtV1MgcHJvZ3JhbW1pbmcgbW9kZWwuIDMuCi0gKiBQcmV2ZW50cyBjb25zdHJ1Y3Rpb24gb2YgdGhlIHNhbWUgZXhjZXB0aW9uLiAgVXNlcyBzaW1pbGFyIHByaW5jaXBsZXMgYXMKLSAqIEF4aXNGYXVsdC5tYWtlRXhjZXB0aW9uLgotICogPHAvPgotICogRXhhbXBsZSBVc2FnZTogLy8gRXhhbXBsZSB1c2FnZQotICogPHAvPgotICogcHVibGljIGZvb01ldGhvZCgpIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsgdHJ5eyAuLi4gfSBjYXRjaChFeGNlcHRpb24gZSl7IHRocm93Ci0gKiBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOyB9IH0KLSAqLwotcHVibGljIGNsYXNzIEV4Y2VwdGlvbkZhY3RvcnkgewotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBMb2cgbG9nID0KLSAgICAgICAgICAgIExvZ0ZhY3RvcnkuZ2V0TG9nKEV4Y2VwdGlvbkZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpKTsKLQotICAgIC8qKiBQcml2YXRlIENvbnN0cnVjdG9yIEFsbCBtZXRob2RzIGFyZSBzdGF0aWMuICBUaGUgcHJpdmF0ZSBjb25zdHJ1Y3RvciBwcmV2ZW50cyBpbnN0YW50aWF0aW9uLiAqLwotICAgIHByaXZhdGUgRXhjZXB0aW9uRmFjdG9yeSgpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBXZWJTZXJ2aWNlRXhjZXB0aW9uIHVzaW5nIHRoZSBpbmZvcm1hdGlvbiBmcm9tIGEgZ2l2ZW4gVGhyb3dhYmxlIGluc3RhbmNlIGFuZCBtZXNzYWdlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVzc2FnZQotICAgICAqIEBwYXJhbSB0aHJvd2FibGUKLSAgICAgKiBAcmV0dXJuIFdlYlNlcnZpY2VFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFdlYlNlcnZpY2VFeGNlcHRpb24gbWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSB0aHJvd2FibGUpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIFNlZSBpZiB0aGVyZSBpcyBhbHJlYWR5IGEgV2ViU2VydmljZUV4Y2VwdGlvbiAoTm90ZSB0aGF0IHRoZSByZXR1cm5lZCBleGNlcHRpb24gY291bGQgYmUgYSBQcm90b2NvbEV4Y2VwdGlvbiBvcgotICAgICAgICAgICAgLy8gb3RoZXIga2luZCBvZiBleGNlcHRpb24pCi0gICAgICAgICAgICBXZWJTZXJ2aWNlRXhjZXB0aW9uIGUgPQotICAgICAgICAgICAgICAgICAgICAoV2ViU2VydmljZUV4Y2VwdGlvbilmaW5kRXhjZXB0aW9uKHRocm93YWJsZSwgV2ViU2VydmljZUV4Y2VwdGlvbi5jbGFzcyk7Ci0gICAgICAgICAgICBpZiAoZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZSA9IGNyZWF0ZVdlYlNlcnZpY2VFeGNlcHRpb24obWVzc2FnZSwgdGhyb3dhYmxlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBlOwotICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7Ci0gICAgICAgICAgICAvLyBUT0RPCi0gICAgICAgICAgICAvLyBUaGlzIGlzIG5vdCBhIGdvb2Qgc2l0dWF0aW9uLCBhbiBleGNlcHRpb24gb2NjdXJyZWQgd2hpbGUgYnVpbGRpbmcgdGhlIGV4Y2VwdGlvbi4KLSAgICAgICAgICAgIC8vIFRoaXMgc2hvdWxkIG5ldmVyIG9jY3VyISAgRm9yIG5vdyBsb2cgdGhlIHByb2JsZW0gYW5kIHJldGhyb3cuLi53ZSBtYXkgcmV2aXNpdCB0aGlzIGxhdGVyCi0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoTWVzc2FnZXMuZ2V0TWVzc2FnZSgiZXhjZXB0aW9uRHVyaW5nRXhjZXB0aW9uRmxvdyIpLCByZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aHJvdyByZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIFByb3RvY29sRXhjZXB0aW9uIHVzaW5nIHRoZSBpbmZvcm1hdGlvbiBmcm9tIGEgVGhyb3dhYmxlIGFuZCBtZXNzYWdlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVzc2FnZQotICAgICAqIEBwYXJhbSB0aHJvd2FibGUKLSAgICAgKiBAcmV0dXJuIFByb3RvY29sRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBQcm90b2NvbEV4Y2VwdGlvbiBtYWtlUHJvdG9jb2xFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSB0aHJvd2FibGUpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIFNlZSBpZiB0aGVyZSBpcyBhbHJlYWR5IGEgUHJvdG9jb2xFeGNlcHRpb24KLSAgICAgICAgICAgIFByb3RvY29sRXhjZXB0aW9uIGUgPQotICAgICAgICAgICAgICAgICAgICAoUHJvdG9jb2xFeGNlcHRpb24pZmluZEV4Y2VwdGlvbih0aHJvd2FibGUsIFByb3RvY29sRXhjZXB0aW9uLmNsYXNzKTsKLSAgICAgICAgICAgIGlmIChlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBlID0gY3JlYXRlUHJvdG9jb2xFeGNlcHRpb24obWVzc2FnZSwgdGhyb3dhYmxlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBlOwotICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7Ci0gICAgICAgICAgICAvLyBUT0RPCi0gICAgICAgICAgICAvLyBUaGlzIGlzIG5vdCBhIGdvb2Qgc2l0dWF0aW9uLCBhbiBleGNlcHRpb24gb2NjdXJyZWQgd2hpbGUgYnVpbGRpbmcgdGhlIGV4Y2VwdGlvbi4KLSAgICAgICAgICAgIC8vIFRoaXMgc2hvdWxkIG5ldmVyIG9jY3VyISAgRm9yIG5vdyBsb2cgdGhlIHByb2JsZW0gYW5kIHJldGhyb3cuLi53ZSBtYXkgcmV2aXNpdCB0aGlzIGxhdGVyCi0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoTWVzc2FnZXMuZ2V0TWVzc2FnZSgiZXhjZXB0aW9uRHVyaW5nRXhjZXB0aW9uRmxvdyIpLCByZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aHJvdyByZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ha2UgYSBXZWJTZXJ2aWNlRXhjZXB0aW9uIHdpdGggYSBnaXZlbiBtZXNzYWdlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVzc2FnZQotICAgICAqIEByZXR1cm4gV2ViU2VydmljZUV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgV2ViU2VydmljZUV4Y2VwdGlvbiBtYWtlV2ViU2VydmljZUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICByZXR1cm4gbWFrZVdlYlNlcnZpY2VFeGNlcHRpb24obWVzc2FnZSwgbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgV2ViU2VydmljZUV4Y2VwdGlvbiB1c2luZyB0aGUgaW5mb3JtYXRpb24gZnJvbSBhIGdpdmVuIFRocm93YWJsZSBpbnN0YW5jZQotICAgICAqCi0gICAgICogQHBhcmFtIHRocm93YWJsZQotICAgICAqIEByZXR1cm4gV2ViU2VydmljZUV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgV2ViU2VydmljZUV4Y2VwdGlvbiBtYWtlV2ViU2VydmljZUV4Y2VwdGlvbihUaHJvd2FibGUgdGhyb3dhYmxlKSB7Ci0gICAgICAgIHJldHVybiBtYWtlV2ViU2VydmljZUV4Y2VwdGlvbihudWxsLCB0aHJvd2FibGUpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgV2ViU2VydmljZUV4Y2VwdGlvbgotICAgICAqCi0gICAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gdCAgICAgICBUaHJvd2FibGUKLSAgICAgKiBAcmV0dXJuIFdlYlNlcnZpY2VFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBXZWJTZXJ2aWNlRXhjZXB0aW9uIGNyZWF0ZVdlYlNlcnZpY2VFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSB0KSB7Ci0KLSAgICAgICAgLy8gV2UgbWlnaHQgaGF2ZSBhbiBlbWJlZGRlZCBXZWJTZXJ2aWNlRXhjZXB0aW9uIHRoYXQgaGFzIGEgZ29vZCBtZXNzYWdlIG9uIGl0Ci0gICAgICAgIFdlYlNlcnZpY2VFeGNlcHRpb24gbWUgPSAoV2ViU2VydmljZUV4Y2VwdGlvbilmaW5kRXhjZXB0aW9uKHQsIFdlYlNlcnZpY2VFeGNlcHRpb24uY2xhc3MpOwotICAgICAgICBpZiAobWUgIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIG1lTWVzc2FnZSA9IG1lLmdldE1lc3NhZ2UoKTsKLSAgICAgICAgICAgIGlmIChtZU1lc3NhZ2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IG1lTWVzc2FnZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gbWVzc2FnZSArICI6ICIgKyBtZU1lc3NhZ2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gR2V0IHRoZSByb290IGNhdXNlLiAgV2Ugd2FudCB0byBzdHJpcCBvdXQgdGhlIGludGVybWVkaWF0ZSBleGNlcHRpb25zIChsaWtlIEF4aXNGYXVsdCkgYmVjYXVzZQotICAgICAgICAvLyB0aGVzZSB3b24ndCBtYWtlIHNlbnNlIHRvIHRoZSB1c2VyLgotICAgICAgICBUaHJvd2FibGUgcm9vdENhdXNlID0gbnVsbDsKLSAgICAgICAgaWYgKHQgIT0gbnVsbCkgewotICAgICAgICAgICAgcm9vdENhdXNlID0gZ2V0Um9vdENhdXNlKHQpOwotICAgICAgICB9Ci0gICAgICAgIHJvb3RDYXVzZSA9IHJvb3RDYXVzZSA9PSBudWxsID8gdCA6IHJvb3RDYXVzZTsKLSAgICAgICAgV2ViU2VydmljZUV4Y2VwdGlvbiBlID0gbnVsbDsKLQotICAgICAgICAvLyBUaGUgcm9vdCBjYXVzZSBtYXkgbm90IGhhdmUgYSBnb29kIG1lc3NhZ2UuICBXZSBtaWdodCB3YW50IHRvIGVuaGFuY2UgaXQKLSAgICAgICAgU3RyaW5nIGVuaGFuY2VkTWVzc2FnZSA9IGVuaGFuY2VNZXNzYWdlKHJvb3RDYXVzZSk7Ci0gICAgICAgIGlmIChlbmhhbmNlZE1lc3NhZ2UgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKG1lc3NhZ2UgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBtZXNzYWdlID0gbWVzc2FnZSArICI6ICIgKyBlbmhhbmNlZE1lc3NhZ2U7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgbWVzc2FnZSA9IGVuaGFuY2VkTWVzc2FnZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtZXNzYWdlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGUgPSBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihtZXNzYWdlLCByb290Q2F1c2UpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZSA9IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKHJvb3RDYXVzZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ3JlYXRlIEV4Y2VwdGlvbjoiLCBlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBQcm90b2NvbEV4Y2VwdGlvbgotICAgICAqCi0gICAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gdCAgICAgICBUaHJvd2FibGUKLSAgICAgKiBAcmV0dXJuIFByb3RvY29sRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgUHJvdG9jb2xFeGNlcHRpb24gY3JlYXRlUHJvdG9jb2xFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSB0KSB7Ci0gICAgICAgIFRocm93YWJsZSByb290Q2F1c2UgPSBudWxsOwotICAgICAgICBpZiAodCAhPSBudWxsKSB7Ci0gICAgICAgICAgICByb290Q2F1c2UgPSBnZXRSb290Q2F1c2UodCk7Ci0gICAgICAgIH0KLSAgICAgICAgcm9vdENhdXNlID0gcm9vdENhdXNlID09IG51bGwgPyB0IDogcm9vdENhdXNlOwotICAgICAgICBQcm90b2NvbEV4Y2VwdGlvbiBlID0gbnVsbDsKLSAgICAgICAgaWYgKG1lc3NhZ2UgIT0gbnVsbCkgewotICAgICAgICAgICAgZSA9IG5ldyBQcm90b2NvbEV4Y2VwdGlvbihtZXNzYWdlLCByb290Q2F1c2UpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZSA9IG5ldyBQcm90b2NvbEV4Y2VwdGlvbihyb290Q2F1c2UpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJjcmVhdGUgRXhjZXB0aW9uOiIsIGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgZXhjZXB0aW9uIG9yIG5lc3RlZCBjYXVzZSB0aGF0IGlzIGFzc2lnbmFibGUgZnJvbSB0aGUgc3BlY2lmaWVkIGNsYXNzCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdCAgIFRocm93YWJsZQotICAgICAqIEBwYXJhbSBjbHMKLSAgICAgKiBAcmV0dXJuIEV4Y2VwdGlvbiBvciBudWxsCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgRXhjZXB0aW9uIGZpbmRFeGNlcHRpb24oVGhyb3dhYmxlIHQsIENsYXNzIGNscykgewotICAgICAgICB3aGlsZSAodCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoY2xzLmlzQXNzaWduYWJsZUZyb20odC5nZXRDbGFzcygpKSkgewotICAgICAgICAgICAgICAgIHJldHVybiAoRXhjZXB0aW9uKXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0ID0gZ2V0Q2F1c2UodCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgVGhyb3dhYmxlIGNhdXNlIG9mIHRoZSBFeGNlcHRpb24uICBTb21lIGV4Y2VwdGlvbnMgc3RvcmUgdGhlIGNhdXNlIGluIGEgZGlmZmVyZW50Ci0gICAgICogZmllbGQsIHdoaWNoIGlzIHdoeSB0aGlzIG1ldGhvZCBzaG91bGQgYmUgdXNlZCB3aGVuIHdhbGtpbmcgdGhlIGNhdXNlcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0IFRocm93YWJsZQotICAgICAqIEByZXR1cm4gVGhyb3dhYmxlIG9yIG51bGwKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBUaHJvd2FibGUgZ2V0Q2F1c2UoVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgVGhyb3dhYmxlIGNhdXNlID0gbnVsbDsKLQotICAgICAgICAvLyBMb29rIGZvciBhIHNwZWNpZmljIGNhdXNlIGZvciB0aGlzIGtpbmQgb2YgZXhjZXB0aW9uCi0gICAgICAgIGlmICh0IGluc3RhbmNlb2YgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbikgewotICAgICAgICAgICAgY2F1c2UgPSAoKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24pdCkuZ2V0VGFyZ2V0RXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBJZiBubyBzcGVjaWZpYyBjYXVzZSwgZmFsbCBiYWNrIHRvIHRoZSBnZW5lcmFsIGNhdXNlLgotICAgICAgICBpZiAoY2F1c2UgPT0gbnVsbCkgewotICAgICAgICAgICAgY2F1c2UgPSB0LmdldENhdXNlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNhdXNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIHNlYXJjaGVzIHRoZSBjYXVzZXMgb2YgdGhlIHNwZWNpZmllZCB0aHJvd2FibGUgdW50aWwgaXQgZmluZHMgb25lIHRoYXQgaXMKLSAgICAgKiBhY2NlcHRhYmxlIGFzIGEgInJvb3QiIGNhdXNlLgotICAgICAqIDxwLz4KLSAgICAgKiBFeGFtcGxlOiBJZiB0IGlzIGFuIEF4aXNGYXVsdCwgdGhlIGNvZGUgdHJhdmVyc2VzIHRvIHRoZSBuZXh0IGNhdXNlLgotICAgICAqCi0gICAgICogQHBhcmFtIHQgVGhyb3dhYmxlCi0gICAgICogQHJldHVybiBUaHJvd2FibGUgcm9vdCBjYXVzZQotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIFRocm93YWJsZSBnZXRSb290Q2F1c2UoVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgd2hpbGUgKHQgIT0gbnVsbCkgewotICAgICAgICAgICAgVGhyb3dhYmxlIG5leHRDYXVzZSA9IG51bGw7Ci0gICAgICAgICAgICBpZiAodCBpbnN0YW5jZW9mIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gfHwKLSAgICAgICAgICAgICAgICAgICAgdCBpbnN0YW5jZW9mIE9NRXhjZXB0aW9uIHx8Ci0gICAgICAgICAgICAgICAgICAgIHQgaW5zdGFuY2VvZiBBeGlzRmF1bHQpIHsKLSAgICAgICAgICAgICAgICAvLyBTa2lwIG92ZXIgdGhpcyBjYXVzZQotICAgICAgICAgICAgICAgIG5leHRDYXVzZSA9IGdldENhdXNlKHQpOwotICAgICAgICAgICAgICAgIGlmIChuZXh0Q2F1c2UgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBsb2dSb290Q2F1c2UodCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0ID0gbmV4dENhdXNlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSByb290IGNhdXNlCi0gICAgICAgICAgICAgICAgbG9nUm9vdENhdXNlKHQpOwotICAgICAgICAgICAgICAgIHJldHVybiB0OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGxvZ1Jvb3RDYXVzZSh0KTsKLSAgICAgICAgcmV0dXJuIHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogT3RoZXIgZGV2ZWxvcGVycyBtYXkgYWRkIGFkZGl0aW9uYWwgY3JpdGVyaWEgdG8gZ2l2ZSBiZXR0ZXIgZXJyb3IgbWVzc2FnZXMgYmFjayB0byB0aGUgdXNlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0IFRocm93YWJsZQotICAgICAqIEByZXR1cm4gU3RyaW5nIGEgbWVzc2FnZSB0aGF0IGhlbHBzIHRoZSB1c2VyIHVuZGVyc3RhbmQgd2hhdCBjYXVzZWQgdGhlIGV4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBlbmhhbmNlTWVzc2FnZShUaHJvd2FibGUgdCkgewotICAgICAgICBpZiAodCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgIFByaW50U3RyZWFtIHBzID0gbmV3IFByaW50U3RyZWFtKGJhb3MsIHRydWUpOwotICAgICAgICB0LnByaW50U3RhY2tUcmFjZShwcyk7Ci0gICAgICAgIFN0cmluZyBzdGFja1RyYWNlID0gYmFvcy50b1N0cmluZygpOwotCi0gICAgICAgIC8vIFRPRE8gYmV0dGVyIGNyaXRlcmlhCi0gICAgICAgIGlmICgodCBpbnN0YW5jZW9mIFN0YWNrT3ZlcmZsb3dFcnJvcikgJiYgKHN0YWNrVHJhY2UuY29udGFpbnMoIkpBWEIiKSkpCi0gICAgICAgICAgICByZXR1cm4gTWVzc2FnZXMuZ2V0TWVzc2FnZSgiSkFCR3JhcGhQcm9ibGVtIik7Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIC8qKgotICAgICAqIExvZyB0aGUgcm9vdCBjYXVzZQotICAgICAqIEBwYXJhbSB0Ci0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBsb2dSb290Q2F1c2UoVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgLy8gVE9ETyBTaG91bGQgY2VydGFpbiB0aHJvd2FibGVzIGJlIGxvZ2dlZCBlbHNld2hlcmUKLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIlJvb3QgQ2F1c2U6IiArICB0LnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgbG9nLmRlYnVnKCJzdGFjazoiICsgc3RhY2tUb1N0cmluZyh0KSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogR2V0IGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHN0YWNrIG9mIHRoZSBzcGVjaWZpZWQgZXhjZXB0aW9uCi0gICAgICogQHBhcmFtIGUKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgc3RhY2tUb1N0cmluZyhUaHJvd2FibGUgZSkgewotICAgICAgICBqYXZhLmlvLlN0cmluZ1dyaXRlciBzdz0gbmV3IGphdmEuaW8uU3RyaW5nV3JpdGVyKCk7IAotICAgICAgICBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyIGJ3ID0gbmV3IGphdmEuaW8uQnVmZmVyZWRXcml0ZXIoc3cpOwotICAgICAgICBqYXZhLmlvLlByaW50V3JpdGVyIHB3PSBuZXcgamF2YS5pby5QcmludFdyaXRlcihidyk7IAotICAgICAgICBlLnByaW50U3RhY2tUcmFjZShwdyk7Ci0gICAgICAgIHB3LmNsb3NlKCk7Ci0gICAgICAgIHJldHVybiBzdy5nZXRCdWZmZXIoKS50b1N0cmluZygpOwotICAgIH0KLQotfQotCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9hZGRyZXNzaW5nL1N1Ym1pc3Npb25BZGRyZXNzaW5nLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9hZGRyZXNzaW5nL1N1Ym1pc3Npb25BZGRyZXNzaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczOWViNDUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvYWRkcmVzc2luZy9TdWJtaXNzaW9uQWRkcmVzc2luZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5hZGRyZXNzaW5nOw0KLQ0KLWltcG9ydCBqYXZheC54bWwud3Muc3BpLldlYlNlcnZpY2VGZWF0dXJlQW5ub3RhdGlvbjsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGU7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5Ow0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi1ARG9jdW1lbnRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLUBSZXRlbnRpb24odmFsdWU9UmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotQFRhcmdldCh2YWx1ZT1FbGVtZW50VHlwZS5UWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi1AV2ViU2VydmljZUZlYXR1cmVBbm5vdGF0aW9uKGlkPVN1Ym1pc3Npb25BZGRyZXNzaW5nRmVhdHVyZS5JRCwgYmVhbj1TdWJtaXNzaW9uQWRkcmVzc2luZ0ZlYXR1cmUuY2xhc3MpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi1wdWJsaWMgQGludGVyZmFjZSBTdWJtaXNzaW9uQWRkcmVzc2luZyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotICAgIHB1YmxpYyBib29sZWFuIGVuYWJsZWQoKSBkZWZhdWx0IHRydWU7DQotICAgIA0KLSAgICBwdWJsaWMgYm9vbGVhbiByZXF1aXJlZCgpIGRlZmF1bHQgZmFsc2U7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvYWRkcmVzc2luZy9TdWJtaXNzaW9uQWRkcmVzc2luZ0ZlYXR1cmUuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2FkZHJlc3NpbmcvU3VibWlzc2lvbkFkZHJlc3NpbmdGZWF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiMThjYzQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvYWRkcmVzc2luZy9TdWJtaXNzaW9uQWRkcmVzc2luZ0ZlYXR1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuYWRkcmVzc2luZzsNCi0NCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VGZWF0dXJlOw0KLQ0KLXB1YmxpYyBmaW5hbCBjbGFzcyBTdWJtaXNzaW9uQWRkcmVzc2luZ0ZlYXR1cmUgZXh0ZW5kcyBXZWJTZXJ2aWNlRmVhdHVyZSB7DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDgvYWRkcmVzc2luZyI7DQotICAgIA0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiByZXF1aXJlZDsNCi0gICAgDQotICAgIHB1YmxpYyBTdWJtaXNzaW9uQWRkcmVzc2luZ0ZlYXR1cmUoKSB7DQotICAgICAgICB0aGlzKHRydWUsIGZhbHNlKTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIFN1Ym1pc3Npb25BZGRyZXNzaW5nRmVhdHVyZShib29sZWFuIGVuYWJsZWQpIHsNCi0gICAgICAgIHRoaXMoZW5hYmxlZCwgZmFsc2UpOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgU3VibWlzc2lvbkFkZHJlc3NpbmdGZWF0dXJlKGJvb2xlYW4gZW5hYmxlZCwgYm9vbGVhbiByZXF1aXJlZCkgew0KLSAgICAgICAgdGhpcy5lbmFibGVkICA9IGVuYWJsZWQ7DQotICAgICAgICB0aGlzLnJlcXVpcmVkID0gcmVxdWlyZWQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaXNSZXF1aXJlZCgpIHsNCi0gICAgICAgIHJldHVybiByZXF1aXJlZDsNCi0gICAgfQ0KLSAgICANCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SUQoKSB7DQotICAgICAgICByZXR1cm4gSUQ7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2F0YWxvZy9KQVhXU0NhdGFsb2dNYW5hZ2VyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jYXRhbG9nL0pBWFdTQ2F0YWxvZ01hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGI2ZjI3Zi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jYXRhbG9nL0pBWFdTQ2F0YWxvZ01hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jYXRhbG9nOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWwucmVzb2x2ZXIuQ2F0YWxvZzsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLXB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgSkFYV1NDYXRhbG9nTWFuYWdlciB7Ci0KLSAgLyoqCi0gICAqIFdoYXQgaXMgdGhlIGN1cnJlbnQgdmVyYm9zaXR5PwotICAgKi8KLSAgYWJzdHJhY3QgcHVibGljIGludCBnZXRWZXJib3NpdHkoKTsKLQotICAvKioKLSAgICogU2V0IHRoZSBjdXJyZW50IHZlcmJvc2l0eS4KLSAgICovCi0gIGFic3RyYWN0IHB1YmxpYyB2b2lkIHNldFZlcmJvc2l0eSAoaW50IHZlcmJvc2l0eSk7Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0aGUgY3VycmVudCBsaXN0IG9mIGNhdGFsb2cgZmlsZXMuCi0gICAqCi0gICAqIEByZXR1cm4gQSB2ZWN0b3Igb2YgdGhlIGNhdGFsb2cgZmlsZSBuYW1lcyBvciBudWxsIGlmIG5vIGNhdGFsb2dzCi0gICAqIGFyZSBhdmFpbGFibGUgaW4gdGhlIHByb3BlcnRpZXMuCi0gICAqLwotICBhYnN0cmFjdCBwdWJsaWMgVmVjdG9yIGdldENhdGFsb2dGaWxlcygpOwotICAKLSAgLyoqCi0gICAqIFNldCB0aGUgbGlzdCBvZiBjYXRhbG9nIGZpbGVzLgotICAgKi8KLSAgYWJzdHJhY3QgcHVibGljIHZvaWQgc2V0Q2F0YWxvZ0ZpbGVzKFN0cmluZyBmaWxlTGlzdCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0aGUgY3VycmVudCBwcmVmZXIgcHVibGljIHNldHRpbmcuCi0gICAqCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiBwdWJsaWMgaWRlbnRpZmllcnMgYXJlIHByZWZlcnJlZC4KLSAgICovCi0gIGFic3RyYWN0IHB1YmxpYyBib29sZWFuIGdldFByZWZlclB1YmxpYyAoKTsKLSAgCi0gIC8qKgotICAgKiBTZXQgdGhlIHByZWZlciBwdWJsaWMgc2V0dGluZy4KLSAgICovCi0gIGFic3RyYWN0IHB1YmxpYyB2b2lkIHNldFByZWZlclB1YmxpYyAoYm9vbGVhbiBwcmVmZXJQdWJsaWMpOwotCi0gIC8qKgotICAgKiBHZXQgdGhlIGN1cnJlbnQgdXNlIHN0YXRpYyBjYXRhbG9nIHNldHRpbmcuCi0gICAqLwotICBhYnN0cmFjdCBwdWJsaWMgYm9vbGVhbiBnZXRVc2VTdGF0aWNDYXRhbG9nKCk7Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgdXNlIHN0YXRpYyBjYXRhbG9nIHNldHRpbmcuCi0gICAqLwotICBhYnN0cmFjdCBwdWJsaWMgdm9pZCBzZXRVc2VTdGF0aWNDYXRhbG9nKGJvb2xlYW4gdXNlU3RhdGljKTsKLQotICAvKioKLSAgICogR2V0IGEgbmV3IGNhdGFsb2cgaW5zdGFuY2UuCi0gICAqCi0gICAqIFRoaXMgbWV0aG9kIGFsd2F5cyByZXR1cm5zIGEgbmV3IGluc3RhbmNlIG9mIHRoZSB1bmRlcmx5aW5nIGNhdGFsb2cgY2xhc3MuCi0gICAqLwotICBhYnN0cmFjdCBwdWJsaWMgQ2F0YWxvZyBnZXRQcml2YXRlQ2F0YWxvZygpOyAKLSAgCi0gIC8qKgotICAgKiBHZXQgYSBjYXRhbG9nIGluc3RhbmNlLgotICAgKgotICAgKiBJZiB0aGlzIG1hbmFnZXIgdXNlcyBzdGF0aWMgY2F0YWxvZ3MsIHRoZSBzYW1lIHN0YXRpYyBjYXRhbG9nIHdpbGwKLSAgICogYWx3YXlzIGJlIHJldHVybmVkLiBPdGhlcndpc2UgYSBuZXcgY2F0YWxvZyB3aWxsIGJlIHJldHVybmVkLgotICAgKi8KLSAgYWJzdHJhY3QgcHVibGljIENhdGFsb2cgZ2V0Q2F0YWxvZygpOwotCi0gIC8qKgotICAgKiBHZXQgdGhlIGN1cnJlbnQgQ2F0YWxvZyBjbGFzcyBuYW1lLgotICAgKi8KLSAgYWJzdHJhY3QgcHVibGljIFN0cmluZyBnZXRDYXRhbG9nQ2xhc3NOYW1lKCk7Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgQ2F0YWxvZyBjbGFzcyBuYW1lLgotICAgKi8KLSAgYWJzdHJhY3QgcHVibGljIHZvaWQgc2V0Q2F0YWxvZ0NsYXNzTmFtZShTdHJpbmcgY2xhc3NOYW1lKTsgCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jYXRhbG9nL2ltcGwvT0FTSVNDYXRhbG9nTWFuYWdlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2F0YWxvZy9pbXBsL09BU0lTQ2F0YWxvZ01hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTVkNGRiNS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jYXRhbG9nL2ltcGwvT0FTSVNDYXRhbG9nTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY2F0YWxvZy5pbXBsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5FeGNlcHRpb25GYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNhdGFsb2cuSkFYV1NDYXRhbG9nTWFuYWdlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS54bWwucmVzb2x2ZXIuQ2F0YWxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS54bWwucmVzb2x2ZXIuQ2F0YWxvZ01hbmFnZXI7DQotDQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsNCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb247DQotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7DQotDQotLyoqDQotICogIE9BU0lTQ2F0YWxvZ01hbmFnZXIgcHJvdmlkZXMgYW4gaW50ZXJmYWNlIHRvIHRoZSBjYXRhbG9nIHByb3BlcnRpZXMuDQotICogIFRoZSBwcmltYXJ5IGRpZmZlcmVuY2UgYmV0d2VlbiB0aGlzIGFuZCB0aGUgDQotICogIG9yZy5hcGFjaGUueG1sLnJlc29sdmVyLkNhdGFsb2dNYW5nZXIgaXMgdGhhdCB0aGUgc3RhdGljQ2F0YWxvZyBpcyBub3QNCi0gKiAgYSBzdGF0aWMgZGF0YSBtZW1iZXIgaW4gdGhlIE9BU0lTQ2F0YWxvZ01hbmdlciBjbGFzcy4gIFRoaXMgZW5hYmxlcyB0aGUgdXNlDQotICogIG9mIGEgc3RhdGljIGNhdGFsb2cgcGVyIENhdGFsb2dNYW5hZ2VyLiAgDQotICovDQotcHVibGljIGNsYXNzIE9BU0lTQ2F0YWxvZ01hbmFnZXIgZXh0ZW5kcyBDYXRhbG9nTWFuYWdlciBpbXBsZW1lbnRzIEpBWFdTQ2F0YWxvZ01hbmFnZXIgew0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0NBVEFMT0dfV0VCID0gIldFQi1JTkYvamF4LXdzLWNhdGFsb2cueG1sIjsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9DQVRBTE9HX0VKQiA9ICJNRVRBLUlORi9qYXgtd3MtY2F0YWxvZy54bWwiOw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQVRBTE9HX0RFQlVHX0tFWSA9ICJPQVNJU0NhdGFsb2dNYW5hZ2VyLmNhdGFsb2cuZGVidWcubGV2ZWwiOw0KLSAgICANCi0gICAgcHJpdmF0ZSBDbGFzc0xvYWRlciBjbGFzc2xvYWRlciA9IG51bGw7DQotDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPQ0KLSAgICAJTG9nZ2VyLmdldExvZ2dlcihPQVNJU0NhdGFsb2dNYW5hZ2VyLmNsYXNzLmdldE5hbWUoKSk7DQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBERUJVR19MRVZFTCA9IG51bGw7DQotDQotICAgIHN0YXRpYyB7DQotICAgICAgICBERUJVR19MRVZFTCA9IChTdHJpbmcpDQotICAgICAgICAgICAgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoDQotICAgICAgICAgICAgICAgICAgbmV3IFByaXZpbGVnZWRBY3Rpb24oKSB7DQotDQotICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gU3lzdGVtLmdldFByb3BlcnR5KENBVEFMT0dfREVCVUdfS0VZKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICB9KTsNCi0gICAgfQ0KLSAgICAvKiogVGhlIHN0YXRpYyBjYXRhbG9nIHVzZWQgYnkgdGhpcyBtYW5hZ2VyLiAqLw0KLSAgICBwcml2YXRlIENhdGFsb2cgc3RhdGljQ2F0YWxvZyA9IG51bGw7DQotDQotICAgIC8qKg0KLSAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yIHdpdGggQ2xhc3NMb2FkZXIgYXJndW1lbnQuDQotICAgICAqIFRoaXMgY29uc3RydWN0b3Igd2lsbCB1c2UgdGhlIGRlZmF1bHRzIHNwZWNpZmllZCBmb3IgQXhpczIgaW4gdGhlDQotICAgICAqIGFjY2VwdERlZmF1bHRzIG1ldGhvZC4NCi0gICAgICogQHBhcmFtIGNsYXNzTG9hZGVyDQotICAgICAqLw0KLSAgICBwdWJsaWMgT0FTSVNDYXRhbG9nTWFuYWdlcihDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikgew0KLSAgICAgICAgdGhpcygpOw0KLSAgICAgICAgdGhpcy5jbGFzc2xvYWRlciA9IGNsYXNzTG9hZGVyOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogQ29uc3RydWN0b3IgdGhhdCBzcGVjaWZpZXMgYW4gZXhwbGljaXQgcHJvcGVydHkgZmlsZSBhbmQgQ2xhc3NMb2FkZXIuDQotICAgICAqIEBwYXJhbSBjbGFzc0xvYWRlcg0KLSAgICAgKiBAcGFyYW0gcHJvcGVydHlGaWxlTmFtZQ0KLSAgICAgKi8NCi0gICAgcHVibGljIE9BU0lTQ2F0YWxvZ01hbmFnZXIoQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIsIFN0cmluZyBwcm9wZXJ0eUZpbGVOYW1lKSB7DQotICAgICAgICB0aGlzKHByb3BlcnR5RmlsZU5hbWUpOw0KLSAgICAgICAgdGhpcy5jbGFzc2xvYWRlciA9IGNsYXNzTG9hZGVyOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogRGVmYXVsdCBjb25zdHJ1Y3RvciB3aXRoIG5vIGFyZ3VtZW50cy4NCi0gICAgICogVGhpcyBjb25zdHJ1Y3RvciB3aWxsIHVzZSB0aGUgZGVmYXVsdHMgc3BlY2lmaWVkIGZvciBBeGlzMiBpbiB0aGUNCi0gICAgICogYWNjZXB0RGVmYXVsdHMgbWV0aG9kLg0KLSAgICAgKi8NCi0gICAgcHVibGljIE9BU0lTQ2F0YWxvZ01hbmFnZXIoKSB7DQotICAgIAlzdXBlcigpOw0KLSAgICAJdGhpcy5hY2NlcHREZWZhdWx0cygpOw0KLSAgICAJaWYgKERFQlVHX0xFVkVMICE9IG51bGwpIHsNCi0gICAgCQl0aGlzLmRlYnVnLnNldERlYnVnKEludGVnZXIucGFyc2VJbnQoREVCVUdfTEVWRUwpKTsgDQotICAgIAl9DQotICAgIAkNCi0gICAgCVN0cmluZyBmaWxlcGF0aCA9IGRldGVybWluZUZpbGVOYW1lKCk7DQotICAgIA0KLSAgICAgICAgaWYgKGZpbGVwYXRoICE9IG51bGwpIHsNCi0gICAgICAgICAgICB0aGlzLnNldENhdGFsb2dGaWxlcyhmaWxlcGF0aCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBDb25zdHJ1Y3RvciB0aGF0IHNwZWNpZmllcyBhbiBleHBsaWNpdCBwcm9wZXJ0eSBmaWxlLg0KLSAgICAgKiBAcGFyYW0gcHJvcGVydHlGaWxlTmFtZQ0KLSAgICAgKi8NCi0gICAgcHVibGljIE9BU0lTQ2F0YWxvZ01hbmFnZXIoU3RyaW5nIHByb3BlcnR5RmlsZU5hbWUpIHsNCi0gICAgCXN1cGVyKHByb3BlcnR5RmlsZU5hbWUpOw0KLSAgICAgICAgaWYgKERFQlVHX0xFVkVMICE9IG51bGwpIHsNCi0gICAgICAgICAgICB0aGlzLmRlYnVnLnNldERlYnVnKEludGVnZXIucGFyc2VJbnQoREVCVUdfTEVWRUwpKTsgICAgICAgICAgICANCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICANCi0gICAgcHJpdmF0ZSB2b2lkIGFjY2VwdERlZmF1bHRzKCkgew0KLSAgICAJdGhpcy5zZXRVc2VTdGF0aWNDYXRhbG9nKHRydWUpOw0KLSAgICAJdGhpcy5zZXRJZ25vcmVNaXNzaW5nUHJvcGVydGllcyh0cnVlKTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIEdldCBhIGNhdGFsb2cgaW5zdGFuY2UuDQotICAgICAqDQotICAgICAqIElmIHRoaXMgbWFuYWdlciB1c2VzIHN0YXRpYyBjYXRhbG9ncywgdGhlIHNhbWUgc3RhdGljIGNhdGFsb2cgd2lsbA0KLSAgICAgKiBhbHdheXMgYmUgcmV0dXJuZWQuIE90aGVyd2lzZSBhIG5ldyBjYXRhbG9nIHdpbGwgYmUgcmV0dXJuZWQuDQotICAgICAqLw0KLSAgICBwdWJsaWMgQ2F0YWxvZyBnZXRDYXRhbG9nKCkgew0KLSAgICAgICAgQ2F0YWxvZyBjYXRhbG9nID0gc3RhdGljQ2F0YWxvZzsNCi0NCi0gICAgICAgIGlmIChjYXRhbG9nID09IG51bGwgfHwgIXN1cGVyLmdldFVzZVN0YXRpY0NhdGFsb2coKSkgew0KLSAgICAgICAgICAgIGNhdGFsb2cgPSBnZXRQcml2YXRlQ2F0YWxvZygpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGNhdGFsb2c7DQotICAgIH0NCi0NCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgZGV0ZXJtaW5lRmlsZU5hbWUoKSB7DQotDQotICAgICAgICBDbGFzc0xvYWRlciBjbGFzc0xvYWRlciA9IChjbGFzc2xvYWRlciAhPSBudWxsKSA/IGNsYXNzbG9hZGVyIDogZmluZENsYXNzTG9hZGVyKCk7DQotICAgICAgICAvLyB0cnkgd2ViIGFwcCBXRUItSU5GIGZpcnN0DQotICAgICAgICBVUkwgdXJsID0gY2xhc3NMb2FkZXIuZ2V0UmVzb3VyY2UoREVGQVVMVF9DQVRBTE9HX1dFQik7DQotICAgICAgICBpZiAodXJsICE9IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gdXJsLnRvU3RyaW5nKCk7DQotICAgICAgICB9DQotICAgICAgICAvLyBoYXZlIG5vdCByZXR1cm5lZCAtLSBwZXJoYXBzIHdlJ3JlIGluIGFuIEVKQj8NCi0gICAgICAgIHVybCA9IGNsYXNzTG9hZGVyLmdldFJlc291cmNlKERFRkFVTFRfQ0FUQUxPR19FSkIpOw0KLSAgICAgICAgcmV0dXJuIHVybCA9PSBudWxsPyBudWxsOiB1cmwudG9TdHJpbmcoKTsNCi0NCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIEdldCBhIG5ldyBjYXRhbG9nIGluc3RhbmNlLg0KLSAgICAgKg0KLSAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGFuIGluc3RhbmNlIG9mIHRoZSB1bmRlcmx5aW5nIGNhdGFsb2cgY2xhc3MuDQotICAgICAqLw0KLSAgICBwdWJsaWMgQ2F0YWxvZyBnZXRQcml2YXRlQ2F0YWxvZygpIHsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgZmluYWwgQ2F0YWxvZ01hbmFnZXIgY20gPSB0aGlzOw0KLSAgICAgICAgICAgIENhdGFsb2cgY2F0YWxvZyA9IA0KLSAgICAgICAgICAgICAgICAoQ2F0YWxvZykgQWNjZXNzQ29udHJvbGxlci4NCi0gICAgICAgICAgICAgICAgZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uKCkgew0KLSAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBDYXRhbG9nIGNhdGFsb2cgPSBzdGF0aWNDYXRhbG9nOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gdXNlU3RhdGljID0gY20uZ2V0VXNlU3RhdGljQ2F0YWxvZygpOw0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYXRhbG9nID09IG51bGwgfHwgIXVzZVN0YXRpYykgew0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY2F0YWxvZ0NsYXNzTmFtZSA9IGdldENhdGFsb2dDbGFzc05hbWUoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNhdGFsb2dDbGFzc05hbWUgPT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0YWxvZyA9IG5ldyBDYXRhbG9nKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGFsb2cgPSAoQ2F0YWxvZykgQ2xhc3MuZm9yTmFtZShjYXRhbG9nQ2xhc3NOYW1lKS5uZXdJbnN0YW5jZSgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBjbmZlKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVidWcubWVzc2FnZSgxLCJDYXRhbG9nIGNsYXNzIG5hbWVkICciDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGNhdGFsb2dDbGFzc05hbWUNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIicgY291bGQgbm90IGJlIGZvdW5kLiBVc2luZyBkZWZhdWx0LiIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGFsb2cgPSBuZXcgQ2F0YWxvZygpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGNuZmUpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWJ1Zy5tZXNzYWdlKDEsIkNsYXNzIG5hbWVkICciDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGNhdGFsb2dDbGFzc05hbWUNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIicgaXMgbm90IGEgQ2F0YWxvZy4gVXNpbmcgZGVmYXVsdC4iKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRhbG9nID0gbmV3IENhdGFsb2coKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRhbG9nLnNldENhdGFsb2dNYW5hZ2VyKGNtKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0YWxvZy5zZXR1cFJlYWRlcnMoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0YWxvZy5sb2FkU3lzdGVtQ2F0YWxvZ3MoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhdGFsb2c7DQotICAgICAgICAgICAgICAgICAgICB9fSk7DQotICAgICAgICAgICAgc3RhdGljQ2F0YWxvZyA9IGNhdGFsb2c7DQotICAgICAgICAgICAgcmV0dXJuIGNhdGFsb2c7DQotICAgICAgICB9IGNhdGNoIChQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uIHBhZSkgew0KLSAgICAgICAgICAgIC8vIFRoZSBDYXRjaCBhbmQgc3dhbGxvdw0KLSAgICAgICAgICAgIGRlYnVnLm1lc3NhZ2UoMSwiZ2V0UHJpdmF0ZUNhdGF0YWxvZyBmYWlsZWQuICAiICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAiUHJvY2Vzc2luZyBjb250aW51ZXMgIiArIHBhZS5nZXRFeGNlcHRpb24oKSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFNldCB0aGUgbGlzdCBvZiBjYXRhbG9nIGZpbGVzLg0KLSAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIHJlc2V0IHRoZSBzdGF0aWNDYXRhbG9nIGZvciB0aGlzIENhdGFsb2dNYW5hZ2VyLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgc2V0Q2F0YWxvZ0ZpbGVzKFN0cmluZyBmaWxlTGlzdCkgew0KLSAgICAJc3RhdGljQ2F0YWxvZyA9IG51bGw7DQotICAgIAlzdXBlci5zZXRDYXRhbG9nRmlsZXMoZmlsZUxpc3QpOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogQ09QSUVEIEZST00gamF2YXgueG1sLndzLnNwaS5GYWN0b3J5RmluZGVyDQotICAgICAqIA0KLSAgICAgKiBGaWd1cmUgb3V0IHdoaWNoIENsYXNzTG9hZGVyIHRvIHVzZS4gIEZvciBKREsgMS4yIGFuZCBsYXRlciB1c2UNCi0gICAgICogdGhlIGNvbnRleHQgQ2xhc3NMb2FkZXIuDQotICAgICAqDQotICAgICAqIEByZXR1cm4gdGhlIDxjb2RlPkNsYXNzTG9hZGVyPC9jb2RlPg0KLSAgICAgKiBAdGhyb3dzIENvbmZpZ3VyYXRpb25FcnJvciBpZiB0aGlzIGNsYXNzIGlzIHVuYWJsZSB0byB3b3JrIHdpdGggdGhlDQotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3QgSkRLDQotICAgICAqLw0KLSAgICBwcml2YXRlIHN0YXRpYyBDbGFzc0xvYWRlciBmaW5kQ2xhc3NMb2FkZXIoKSB7DQotDQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIENsYXNzTG9hZGVyIGNsID0gDQotICAgICAgICAgICAgICAgIChDbGFzc0xvYWRlcikgQWNjZXNzQ29udHJvbGxlci4NCi0gICAgICAgICAgICAgICAgZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uKCkgew0KLSAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBNZXRob2QgbSA9IG51bGw7DQotDQotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbSA9IFRocmVhZC5jbGFzcy5nZXRNZXRob2QoImdldENvbnRleHRDbGFzc0xvYWRlciIsIChDbGFzc1tdKSBudWxsKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBc3N1bWUgdGhhdCB3ZSBhcmUgcnVubmluZyBKREsgMS4xLCB1c2UgdGhlIGN1cnJlbnQgQ2xhc3NMb2FkZXINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyBwcmludCBkZWJ1ZyBzdGF0ZW1lbnQgYWJvdXQgYXNzdW1pbmcgSkRLIDEuMQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT0FTSVNDYXRhbG9nTWFuYWdlci5jbGFzcy5nZXRDbGFzc0xvYWRlcigpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKENsYXNzTG9hZGVyKSBtLmludm9rZShUaHJlYWQuY3VycmVudFRocmVhZCgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPYmplY3RbXSkgbnVsbCk7DQotICAgICAgICAgICAgICAgICAgICB9fQ0KLSAgICAgICAgICAgICAgICApOw0KLSAgICAgICAgICAgIHJldHVybiBjbDsNCi0gICAgICAgIH0gY2F0Y2ggKFByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb24gcGFlKSB7DQotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihwYWUuZ2V0RXhjZXB0aW9uKCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL0F0dGFjaG1lbnREZXNjcmlwdGlvbi5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vQXR0YWNobWVudERlc2NyaXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwYzZiM2EuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vQXR0YWNobWVudERlc2NyaXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uOw0KLQ0KLS8qKg0KLSAqIEEgcGFyYW1ldGVyIG9yIHJldHVybiB2YWx1ZSBtYXkgYmUgcmVwcmVzZW50ZWQgYXMgYW4gYXR0YWNobWVudC4NCi0gKiBJbiBzdWNoIGNhc2VzLCB0aGUgUGFyYW1ldGVyRGVzY3JpcHRpb24gb3IgT3BlcmF0aW9uRGVzY3JpcHRpb24gaGFzDQotICogYW4gQXR0YWNobWVudERlc2NyaXB0aW9uIGRlZmluaW5nIHRoZSBhdHRhY2htZW50IGluZm9ybWF0aW9uLg0KLSAqIA0KLSAqIE5vdGUgdGhhdCBhbiBBdHRhY2htZW50IG1heSBiZSBvbmUgb2YgMyB0eXBlczogU1dBLCBTV0FSRUYgYW5kIE1UT00uDQotICogICAgU1dBUkVGIGFuZCBNVE9NIGF0dGFjaG1lbnRzIGhhdmUgYW4geG1sIGVsZW1lbnQgKGVpdGhlciBpbiB0aGUgYm9keSBvciBoZWFkZXIpIA0KLSAqICAgIHRoYXQgcmVmZXJlbmNlcyB0aGUgYXR0YWNobWVudCBwYXJ0Lg0KLSAqICAgIA0KLSAqICAgIFNXQSBhdHRhY2htZW50cyBhcmUgcmVwcmVzZW50ZWQgYXMgYW4gYXR0YWNobWVudCBwYXJ0LiAgVGhlcmUgYXJlIGlzIG5vDQotICogICAgeG1sIGVsZW1lbnQgdGhhdCByZWZlcmVuY2VzIHRoZSBhdHRhY2htZW50Lg0KLSAqDQotICovDQotcHVibGljIGludGVyZmFjZSBBdHRhY2htZW50RGVzY3JpcHRpb24gew0KLSAgICANCi0gICAgLyoqDQotICAgICAqIEBSZXR1cm4gVGhlIGF0dGFjaG1lbnQgdHlwZSANCi0gICAgICovDQotICAgIEF0dGFjaG1lbnRUeXBlIGdldEF0dGFjaG1lbnRUeXBlKCk7DQotICAgIA0KLSAgICAvKioNCi0gICAgICogQHJldHVybiBvbmUgb3IgbW9yZSBtaW1lIHR5cGVzIGRlZmluZWQgZm9yIHRoaXMgYXR0YWNobWVudA0KLSAgICAgKi8NCi0gICAgU3RyaW5nW10gZ2V0TWltZVR5cGVzKCk7DQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL0F0dGFjaG1lbnRUeXBlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9BdHRhY2htZW50VHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2NiNTJlLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL0F0dGFjaG1lbnRUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uOw0KLQ0KLS8qKg0KLSAqIERlZmluZXMgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiBhdHRhY2htZW50cy4NCi0gKi8NCi1wdWJsaWMgZW51bSBBdHRhY2htZW50VHlwZSB7DQotICAgIFNXQSwgICAgICAvLyBEZWZpbmVkIGJ5IEJpbmRpbmcgTUlNRSBUeXBlcywgbm8geG1sIHJlZmVyZW5jZXMgdGhlIGF0dGFjaG1lbnQNCi0gICAgU1dBUkVGLCAgIC8vIERlZmluZWQgYnkgU1dBUkVGLCB4bWwgcmVmZXJlbmNlcyB0aGUgYXR0YWNobWVudA0KLSAgICBNVE9NICAgICAgLy8gRGVmaW5lZCBieSBNVE9NIHNwZWNpZmljYXRpb24sIHhtbCByZWZlcmVuY2VzIHRoZSBhdHRhY2htZW50DQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL0Rlc2NyaXB0aW9uRmFjdG9yeS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vRGVzY3JpcHRpb25GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiMjAxNGYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vRGVzY3JpcHRpb25GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NjMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuQ2xpZW50Q29uZmlndXJhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLkRlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuSkFYV1NSSVdTRExHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5pbXBsLkRlc2NyaXB0aW9uRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5TY2hlbWFCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogQ3JlYXRlcyB0aGUgSkFYLVdTIG1ldGFkYXRhIGRlc2NyaXB0aW9uIGhpZXJhcmNoeSBmcm9tIHNvbWUgY29tYmluYXRpb25zIG9mIFdTREwsIEphdmEgY2xhc3MKLSAqIGluZm9ybWF0aW9uIGluY2x1ZGluZyBhbm5vdGF0aW9ucywgYW5kIChpbiB0aGUgZnV0dXJlKSBkZXBsb3ltZW50IGRlc2NyaXB0b3JzLgotICovCi1wdWJsaWMgY2xhc3MgRGVzY3JpcHRpb25GYWN0b3J5IHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coRGVzY3JpcHRpb25GYWN0b3J5LmNsYXNzKTsKLQotICAgIC8qKgotICAgICAqIFRoZSB0eXBlIG9mIHVwZGF0ZSBiZWluZyBkb25lIGZvciBhIHBhcnRpY3VsYXIgUG9ydC4gIFRoaXMgaXMgdXNlZCBieSB0aGUgSkFYLVdTIHNlcnZpY2UKLSAgICAgKiBkZWxlZ2F0ZSBvbiB0aGUgQ0xJRU5UIHNpZGUuIFRoaXMgaXMgdXNlZCBhcyBhIHBhcmFtZXRlciB0byB0aGUgdXBkYXRlRW5kcG9pbnQgZmFjdG9yeQotICAgICAqIG1ldGhvZC4gIEFuIEVuZHBvaW50RGVzY3JpcHRpb24gd2lsbCBiZSByZXR1cm5lZCBjb3JyZXNwb25kaW5nIHRvIHRoZSBwb3J0LiBHRVRfUE9SVDoKLSAgICAgKiBSZXR1cm4gYW4gU0VJLWJhc2VkIHByZS1leGlzdGluZyBwb3J0IEFERF9QT1JUOiAgIFJldHVybiBhIERpc3BhdGNoLW9ubHkgbm9uLXByZS1leGlzdGluZwotICAgICAqIHBvcnQgQ1JFQVRFX0RJU1BBVENIOiBSZXR1cm4gYSBEaXNwYXRjaCBwb3J0OyB0aGlzIGlzIHZhbGlkIG9uIGVpdGhlciBhIHByZS1leGlzdGluZyBwb3J0Ci0gICAgICogKGUuZy4gR0VUX1BPUlQpIG9yIGR5bmFtaWMgcG9ydCAoQUREX1BPUlQpCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBlbnVtIFVwZGF0ZVR5cGUgewotICAgICAgICBHRVRfUE9SVCwgQUREX1BPUlQsIENSRUFURV9ESVNQQVRDSH0KLQotICAgIC8qKiBBIERlc2NycHRpb25GYWN0b3J5IGNhbiBub3QgYmUgaW5zdGFudGlhdGVkOyBhbGwgbWV0aG9kcyBhcmUgc3RhdGljLiAqLwotICAgIHByaXZhdGUgRGVzY3JpcHRpb25GYWN0b3J5KCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSB0aGUgaW5pdGlhbCBTZXJ2aWNlRGVzY3JpcHRpb24gaGllcmFyY2h5IG9uIHRoZSBDTElFTlQgc2lkZS4gIFRoaXMgaXMgaW50ZW5kZWQgdG8gYmUKLSAgICAgKiBjYWxsZWQgd2hlbiB0aGUgY2xpZW50IGNyZWF0ZXMgYSBTZXJ2aWNlRGVsZWdhdGUuICBOb3RlIHRoYXQgaXQgd2lsbCBvbmx5IGNyZWF0ZSB0aGUKLSAgICAgKiBTZXJ2aWNlRGVzY3JpcHRpb24gYXQgdGhpcyBwb2ludC4gIFRoZSBFbmRwb2ludERlc2NyaXB0aW9uIGhpZXJhcmNoeSB1bmRlciB0aGlzCi0gICAgICogU2VydmljZURlc2NyaXB0aW9uIHdpbGwgYmUgY3JlYXRlZCBieSB0aGUgdXBkYXRlRW5kcG9pbnQgZmFjdG9yeSBtZXRob2QsIHdoaWNoIHdpbGwgYmUgY2FsbGVkCi0gICAgICogYnkgdGhlIFNlcnZpY2VEZWxlZ2F0ZSBvbmNlIHRoZSBwb3J0IGlzIGtub3duIChpLmUuIGFkZFBvcnQsIGdldFBvcnQsIG9yIGNyZWF0ZURpc3BhdGNoKS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB3c2RsVVJMICAgICAgVVJMIHRvIHRoZSBXU0RMIGZpbGUgdG8gdXNlOyB0aGlzIG1heSBiZSBudWxsCi0gICAgICogQHBhcmFtIHNlcnZpY2VRTmFtZSBUaGUgU2VydmljZVFOYW1lIGZvciB0aGlzIHNlcnZpY2U7IG1heSBub3QgYmUgbnVsbAotICAgICAqIEBwYXJhbSBzZXJ2aWNlQ2xhc3MgVGhlIFNlcnZpY2UgY2xhc3M7IG1heSBub3QgYmUgbnVsbCBhbmQgbXVzdCBiZSBhc3NpZ25hYmxlIGZyb20KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC53cy5TZXJ2aWNlCi0gICAgICogQHJldHVybiBBIFNlcnZpY2VEZXNjcmlwdGlvbiBpbnN0YW5jZSBmb3IgYSBDTElFTlQgYWNjZXNzIHRvIHRoZSBzZXJ2aWNlLgotICAgICAqIEBzZWUgI3VwZGF0ZUVuZHBvaW50KFNlcnZpY2VEZXNjcmlwdGlvbiwgQ2xhc3MsIFFOYW1lLCBTZXJ2aWNlRGVzY3JpcHRpb24uVXBkYXRlVHlwZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFNlcnZpY2VEZXNjcmlwdGlvbiBjcmVhdGVTZXJ2aWNlRGVzY3JpcHRpb24oVVJMIHdzZGxVUkwsIFFOYW1lIHNlcnZpY2VRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3Mgc2VydmljZUNsYXNzKSB7Ci0gICAgICAgIHJldHVybiBEZXNjcmlwdGlvbkZhY3RvcnlJbXBsLmNyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbih3c2RsVVJMLCBzZXJ2aWNlUU5hbWUsIHNlcnZpY2VDbGFzcyk7Ci0gICAgfQotICAgIAotICAgIAotICAgIC8qKgotICAgICAqIENyZWF0ZSB0aGUgaW5pdGlhbCBTZXJ2aWNlRGVzY3JpcHRvbiBoaWVyYXJjaHkgb24gdGhlIENMSUVOVCBzaWRlLiAgVGhpcyBhbGxvd3MgYSBzcGFyc2UgREJDCi0gICAgICogdG8gYmUgc3BlY2lmaWVkIGluIGFkZGl0aW9uIHRvIHRoZSBzZXJ2aWNlIGNsYXNzLiAgVGhlIHNwYXJzZSBEQkMgY2FuIGJlIHVzZWQgdG8gb3ZlcnJpZGUKLSAgICAgKiB0aGUgY2xhc3MgYW5ub3RhdGlvbiBtZW1iZXIgdmFsdWVzLiAgCi0gICAgICogCi0gICAgICogQHNlZSAjY3JlYXRlU2VydmljZURlc2NyaXB0aW9uKFVSTCwgUU5hbWUsIENsYXNzKQotICAgICAqICAKLSAgICAgKiBAcGFyYW0gd3NkbFVSTAotICAgICAqIEBwYXJhbSBzZXJ2aWNlUU5hbWUKLSAgICAgKiBAcGFyYW0gc2VydmljZUNsYXNzCi0gICAgICogQHBhcmFtIHNwYXJzZUNvbXBvc2l0ZQotICAgICAqIEBwYXJhbSBzcGFyc2VDb21wb3NpdGVLZXkKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTZXJ2aWNlRGVzY3JpcHRpb24gY3JlYXRlU2VydmljZURlc2NyaXB0aW9uKFVSTCB3c2RsVVJMLCAKLSAgICAgICAgICAgIFFOYW1lIHNlcnZpY2VRTmFtZSwgQ2xhc3Mgc2VydmljZUNsYXNzLCBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgc3BhcnNlQ29tcG9zaXRlLAotICAgICAgICAgICAgT2JqZWN0IHNwYXJzZUNvbXBvc2l0ZUtleSkgewotICAgICAgICByZXR1cm4gRGVzY3JpcHRpb25GYWN0b3J5SW1wbC5jcmVhdGVTZXJ2aWNlRGVzY3JpcHRpb24od3NkbFVSTCwgc2VydmljZVFOYW1lLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VDbGFzcywgc3BhcnNlQ29tcG9zaXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhcnNlQ29tcG9zaXRlS2V5KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXRyaWV2ZSBvciBjcmVhdGUgdGhlIEVuZHBvaW50RGVzY3JpcHRpb24gaGllcmFyY2h5IGFzc29jaWF0ZWQgd2l0aCBhbiBleGlzdGluZyBDTElFTlQgc2lkZQotICAgICAqIFNlcnZpY2VEZXNjcmlwdGlvbiBmb3IgYSBwYXJ0aWN1bGFyIHBvcnQuICBJZiBhbiBFbmRwb2ludERlc2NyaXRwdGlvbiBhbHJlYWR5IGV4aXN0cywgaXQgd2lsbAotICAgICAqIGJlIHJldHVybmVkOyBpZiBvbmUgZG9lcyBub3QgYWxyZWFkeSBleGlzdCwgaXQgd2lsbCBiZSBjcmVhdGVkLiAgTm90ZSB0aGF0IGlmIHRoZSBTRUkgaXMgbnVsbAotICAgICAqIHRoZW4gdGhlIEVuZHBvaW50RGVzY3JpcHRpb24gcmV0dXJuZWQgd2lsbCBiZSBmb3IgYSBEaXNwYXRjaCBjbGllbnQgb25seSBhbmQgaXQgd2lsbCBub3QgaGF2ZQotICAgICAqIGFuIEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24gaGllcmFyY2h5IGFzc29jaWF0ZWQgd2l0aCBpdC4gIElmLCBhdCBhIGxhdGVyIHBvaW50LCB0aGUgc2FtZQotICAgICAqIHBvcnQgaXMgcmVxdWVzdGVkIGFuZCBhbiBTRUkgaXMgcHJvdmlkZWQsIHRoZSBleGlzdGluZyBFbmRwb2ludERlc2NyaXB0aW9uIHdpbGwgYmUgdXBkYXRlZAotICAgICAqIHdpdGggYSBuZXdseS1jcmVhdGVkIEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24gaGllcmFyY2h5LgotICAgICAqCi0gICAgICogQHBhcmFtIHNlcnZpY2VEZXNjcmlwdGlvbiBBbiBleGlzdGluZyBjbGllbnQtc2lkZSBTZXJ2aWNlRGVzY3JpcHRpb24uICBUaGlzIG11c3Qgbm90IGJlCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLgotICAgICAqIEBwYXJhbSBzZWkgICAgICAgICAgICAgICAgVGhlIFNlcnZpY2VJbnRlcmZhY2UgY2xhc3MuICBUaGlzIGNhbiBiZSBudWxsIGZvciBhZGRpbmcgYSBwb3J0IG9yCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGluZyBhIERpc3BhdGNoOyBpdCBjYW4gbm90IGJlIG51bGwgd2hlbiBnZXR0aW5nIGEgcG9ydC4KLSAgICAgKiBAcGFyYW0gcG9ydFFOYW1lICAgICAgICAgIFRoZSBRTmFtZSBvZiB0aGUgcG9ydC4gIElmIHRoaXMgaXMgbnVsbCwgdGhlIHJ1bnRpbWUgd2lsbCBhdHRlbXB0Ci0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICB0byB0byBzZWxlY3QgYW4gYXBwcm9wcmlhdGUgcG9ydCB0byB1c2UuCi0gICAgICogQHBhcmFtIHVwZGF0ZVR5cGUgICAgICAgICBUaGUgdHlwZSBvZiB0aGUgdXBkYXRlOiBhZGRpbmcgYSBwb3J0LCBjcmVhdGluZyBhIGRpc3BhdGNoLCBvcgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0dGluZyBhbiBTRUktYmFzZWQgcG9ydC4KLSAgICAgKiBAcmV0dXJuIEFuIEVuZHBvaW50RGVzY3JpcHRpb24gY29ycmVzcG9uZGluZyB0byB0aGUgcG9ydC4KLSAgICAgKiBAc2VlICNjcmVhdGVTZXJ2aWNlRGVzY3JpcHRpb24oVVJMLCBRTmFtZSwgQ2xhc3MpCi0gICAgICogQHNlZSBEZXNjcmlwdGlvbkZhY3RvcnkuVXBkYXRlVHlwZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgRW5kcG9pbnREZXNjcmlwdGlvbiB1cGRhdGVFbmRwb2ludChTZXJ2aWNlRGVzY3JpcHRpb24gc2VydmljZURlc2NyaXB0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyBzZWksIFFOYW1lIHBvcnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb25GYWN0b3J5LlVwZGF0ZVR5cGUgdXBkYXRlVHlwZSkgewotICAgICAgICByZXR1cm4gRGVzY3JpcHRpb25GYWN0b3J5SW1wbAotICAgICAgICAgICAgICAgICAgIC51cGRhdGVFbmRwb2ludChzZXJ2aWNlRGVzY3JpcHRpb24sIHNlaSwgcG9ydFFOYW1lLCB1cGRhdGVUeXBlLCBudWxsLCBudWxsKTsKLSAgICB9ICAgIAotICAgIAotICAgIC8qKgotICAgICAqIFJldHJpZXZlIG9yIGNyZWF0ZSB0aGUgRW5kcG9pbnREZXNjcmlwdGlvbiBoaWVyYXJjaHkgYXNzb2NpYXRlZCB3aXRoIGFuIGV4aXN0aW5nIENMSUVOVCBzaWRlCi0gICAgICogU2VydmljZURlc2NyaXB0aW9uIGZvciBhIHBhcnRpY3VsYXIgcG9ydC4gIFRoaXMgaXMgaWRlbnRpY2FsIHRvIGFib3ZlLCBidXQgdGhpcyBtZXRob2QgaGFzIGEgCi0gICAgICogcmVmZXJlbmNlIGJhY2sgdG8gdGhlIFNlcnZpY2VEZWxlZ2F0ZSAod2hpY2ggaW52b2tlZCBpdCkgZm9yIHB1cnBvc2VzIG9mIHByb3Blcmx5IGNhY2hpbmcgCi0gICAgICogU2VydmljZURlc2NyaXB0aW9ucyB0aGF0IGNvbnRhaW4gZHluYW1pYyBwb3J0cwotICAgICAqCi0gICAgICogQHBhcmFtIHNlcnZpY2VEZXNjcmlwdGlvbiBBbiBleGlzdGluZyBjbGllbnQtc2lkZSBTZXJ2aWNlRGVzY3JpcHRpb24uICBUaGlzIG11c3Qgbm90IGJlCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLgotICAgICAqIEBwYXJhbSBzZWkgICAgICAgICAgICAgICAgVGhlIFNlcnZpY2VJbnRlcmZhY2UgY2xhc3MuICBUaGlzIGNhbiBiZSBudWxsIGZvciBhZGRpbmcgYSBwb3J0IG9yCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGluZyBhIERpc3BhdGNoOyBpdCBjYW4gbm90IGJlIG51bGwgd2hlbiBnZXR0aW5nIGEgcG9ydC4KLSAgICAgKiBAcGFyYW0gcG9ydFFOYW1lICAgICAgICAgIFRoZSBRTmFtZSBvZiB0aGUgcG9ydC4gIElmIHRoaXMgaXMgbnVsbCwgdGhlIHJ1bnRpbWUgd2lsbCBhdHRlbXB0Ci0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICB0byB0byBzZWxlY3QgYW4gYXBwcm9wcmlhdGUgcG9ydCB0byB1c2UuCi0gICAgICogQHBhcmFtIHVwZGF0ZVR5cGUgICAgICAgICBUaGUgdHlwZSBvZiB0aGUgdXBkYXRlOiBhZGRpbmcgYSBwb3J0LCBjcmVhdGluZyBhIGRpc3BhdGNoLCBvcgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0dGluZyBhbiBTRUktYmFzZWQgcG9ydC4KLSAgICAgKiBAcGFyYW0gc2VydmljZURlbGVnYXRlS2V5IEEgcmVmZXJlbmNlIGJhY2sgdG8gdGhlIFNlcnZpY2VEZWxlZ2F0ZSB0aGF0IGNhbGxlZCBpdAotICAgICAqIEByZXR1cm4gQW4gRW5kcG9pbnREZXNjcmlwdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBwb3J0LgotICAgICAqIEBzZWUgI2NyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbihVUkwsIFFOYW1lLCBDbGFzcykKLSAgICAgKiBAc2VlIERlc2NyaXB0aW9uRmFjdG9yeS5VcGRhdGVUeXBlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBFbmRwb2ludERlc2NyaXB0aW9uIHVwZGF0ZUVuZHBvaW50KFNlcnZpY2VEZXNjcmlwdGlvbiBzZXJ2aWNlRGVzY3JpcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzIHNlaSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFOYW1lIHBvcnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb25GYWN0b3J5LlVwZGF0ZVR5cGUgdXBkYXRlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHNlcnZpY2VEZWxlZ2F0ZUtleSkgewotICAgICAgICByZXR1cm4gRGVzY3JpcHRpb25GYWN0b3J5SW1wbAotICAgICAgICAgICAgICAgICAgIC51cGRhdGVFbmRwb2ludChzZXJ2aWNlRGVzY3JpcHRpb24sIHNlaSwgcG9ydFFOYW1lLCB1cGRhdGVUeXBlLCBzZXJ2aWNlRGVsZWdhdGVLZXksIG51bGwsIG51bGwpOwotICAgIH0gICAgCi0gICAgCi0gICAgLyoqCi0gICAgICogUmV0cmlldmUgb3IgY3JlYXRlIGFuIEVuZHBvaW50RGVzY3JpcHRpb24gaGllcmFyY2h5IGFzc29jaWF0ZWQgd2l0aCBhbiBleGlzdGluZyBDTElFTlQgc2lkZQotICAgICAqIFNlcnZpY2VEZXNjcmlwdGlvbiBmb3IgYSBwYXJ0aWN1bGFyIHBvcnQuICBBZGRpdGlvbmFsIG1ldGFkYXRhIG1heSBiZSBzcGVjaWZpZWQgaW4gYSBzcGFyc2UKLSAgICAgKiBjb21wb3NpdGUuICBUaGF0IG1ldGFkYXRhIG1heSBjb21lIGZyb20gYSBKU1ItMTA5IGNsaWVudCBkZXBsb3ltZW50IGRlc2NyaXB0b3IsIGZvciBleGFtcGxlLAotICAgICAqIG9yIGZyb20gcmVzb3VyY2UgaW5qZWN0aW9uIG9mIGFuIFdlYlNlcnZpY2VSZWYgb3Igb3RoZXIgUmVzb3VyY2UgYW5ub3RhdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAc2VlICN1cGRhdGVFbmRwb2ludChTZXJ2aWNlRGVzY3JpcHRpb24sIENsYXNzLCBRTmFtZSwgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5EZXNjcmlwdGlvbkZhY3RvcnkuVXBkYXRlVHlwZSkKLSAgICAgKiAgCi0gICAgICogQHBhcmFtIHNlcnZpY2VEZXNjcmlwdGlvbgotICAgICAqIEBwYXJhbSBzZWkKLSAgICAgKiBAcGFyYW0gcG9ydFFOYW1lCi0gICAgICogQHBhcmFtIHVwZGF0ZVR5cGUKLSAgICAgKiBAcGFyYW0gY29tcG9zaXRlCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgRW5kcG9pbnREZXNjcmlwdGlvbiB1cGRhdGVFbmRwb2ludChTZXJ2aWNlRGVzY3JpcHRpb24gc2VydmljZURlc2NyaXB0aW9uLAotICAgICAgICAgICAgQ2xhc3Mgc2VpLCBRTmFtZSBwb3J0UU5hbWUsCi0gICAgICAgICAgICBEZXNjcmlwdGlvbkZhY3RvcnkuVXBkYXRlVHlwZSB1cGRhdGVUeXBlLAotICAgICAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIGNvbXBvc2l0ZSwKLSAgICAgICAgICAgIE9iamVjdCBzcGFyc2VDb21wb3NpdGVLZXkpIHsKLSAgICAgICAgcmV0dXJuIERlc2NyaXB0aW9uRmFjdG9yeUltcGwKLSAgICAgICAgICAgICAgICAgICAudXBkYXRlRW5kcG9pbnQoc2VydmljZURlc2NyaXB0aW9uLCBzZWksIHBvcnRRTmFtZSwgdXBkYXRlVHlwZSwgY29tcG9zaXRlLCBzcGFyc2VDb21wb3NpdGVLZXksIG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHJpZXZlIG9yIGNyZWF0ZSB0aGUgRW5kcG9pbnREZXNjcmlwdGlvbiBoaWVyYWNoeSBhc3NvY2lhdGVkIHdpdGggYW4gZXhpc3RpbmcgQ0xJRU5UIHNpZGUKLSAgICAgKiBTZXJ2aWNlRGVzY3JpcHRpb24gZm9yIGEgcGFydGljdWxhciBwb3J0LiAgSWYgYW4gRW5kcG9pbnREZXNjcml0cHRpb24gYWxyZWFkeSBleGlzdHMsIGl0IHdpbGwKLSAgICAgKiBiZSByZXR1cm5lZDsgaWYgb25lIGRvZXMgbm90IGFscmVhZHkgZXhpc3QsIGl0IHdpbGwgYmUgY3JlYXRlZC4gIE5vdGUgdGhhdCBpZiB0aGUgU0VJIGlzIG51bGwKLSAgICAgKiB0aGVuIHRoZSBFbmRwb2ludERlc2NyaXB0aW9uIHJldHVybmVkIHdpbGwgYmUgZm9yIGEgRGlzcGF0Y2ggY2xpZW50IG9ubHkgYW5kIGl0IHdpbGwgbm90IGhhdmUKLSAgICAgKiBhbiBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uIGhpZXJhY2h5IGFzc29jaWF0ZWQgd2l0aCBpdC4gIElmLCBhdCBhIGxhdGVyIHBvaW50LCB0aGUgc2FtZQotICAgICAqIHBvcnQgaXMgcmVxdWVzdGVkIGFuZCBhbiBTRUkgaXMgcHJvdmlkZWQsIHRoZSBleGlzdGluZyBFbmRwb2ludERlc2NyaXB0aW9uIHdpbGwgYmUgdXBkYXRlZAotICAgICAqIHdpdGggYSBuZXdseS1jcmVhdGVkIEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24gaGllcmFjeS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzZXJ2aWNlRGVzY3JpcHRpb24gIEFuIGV4aXN0aW5nIGNsaWVudC1zaWRlIFNlcnZpY2VEZXNjcmlwdGlvbi4gIFRoaXMgbXVzdCBub3QgYmUKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLgotICAgICAqIEBwYXJhbSBzZWkgICAgICAgICAgICAgICAgIFRoZSBTZXJ2aWNlSW50ZXJmYWNlIGNsYXNzLiAgVGhpcyBjYW4gYmUgbnVsbCBmb3IgYWRkaW5nIGEgcG9ydCBvcgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0aW5nIGEgRGlzcGF0Y2g7IGl0IGNhbiBub3QgYmUgbnVsbCB3aGVuIGdldHRpbmcgYSBwb3J0LgotICAgICAqIEBwYXJhbSBlcHIgICAgICAgICAgICAgICAgIFRoZSBlbmRwb2ludCByZWZlcmVuY2UgdG8gdGhlIHRhcmdldCBwb3J0LgotICAgICAqIEBwYXJhbSBhZGRyZXNzaW5nTmFtZXNwYWNlIFRoZSBhZGRyZXNzaW5nIG5hbWVzcGFjZSBvZiB0aGUgZW5kcG9pbnQgcmVmZXJlbmNlLgotICAgICAqIEBwYXJhbSB1cGRhdGVUeXBlICAgICAgICAgIFRoZSB0eXBlIG9mIHRoZSB1cGRhdGU6IGFkZGluZyBhIHBvcnQsIGNyZWF0aW5nIGEgZGlzcGF0Y2gsIG9yCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0dGluZyBhbiBTRUktYmFzZWQgcG9ydC4KLSAgICAgKiBAcmV0dXJuIEFuIEVuZHBvaW50RGVzY3JpcHRpb24gY29ycmVzcG9uZGluZyB0byB0aGUgcG9ydC4KLSAgICAgKiBAc2VlICNjcmVhdGVTZXJ2aWNlRGVzY3JpcHRpb24oVVJMLCBRTmFtZSwgQ2xhc3MpCi0gICAgICogQHNlZSBEZXNjcmlwdGlvbkZhY3RvcnkuVXBkYXRlVHlwZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgRW5kcG9pbnREZXNjcmlwdGlvbiB1cGRhdGVFbmRwb2ludChTZXJ2aWNlRGVzY3JpcHRpb24gc2VydmljZURlc2NyaXB0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyBzZWksIEVuZHBvaW50UmVmZXJlbmNlIGVwciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGFkZHJlc3NpbmdOYW1lc3BhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uRmFjdG9yeS5VcGRhdGVUeXBlIHVwZGF0ZVR5cGUpIHsKLSAgICAgICAgcmV0dXJuIERlc2NyaXB0aW9uRmFjdG9yeUltcGwKLSAgICAgICAgICAgICAgICAudXBkYXRlRW5kcG9pbnQoc2VydmljZURlc2NyaXB0aW9uLCBzZWksIGVwciwgYWRkcmVzc2luZ05hbWVzcGFjZSwgdXBkYXRlVHlwZSwgbnVsbCwgbnVsbCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHJpZXZlIG9yIGNyZWF0ZSB0aGUgRW5kcG9pbnREZXNjcmlwdGlvbiBoaWVyYXJjaHkgYXNzb2NpYXRlZCB3aXRoIGFuIGV4aXN0aW5nIENMSUVOVCBzaWRlCi0gICAgICogU2VydmljZURlc2NyaXB0aW9uIGZvciBhIHBhcnRpY3VsYXIgcG9ydC4gIFRoaXMgaXMgaWRlbnRpY2FsIHRvIGFib3ZlLCBidXQgdGhpcyBtZXRob2QgaGFzIGEgCi0gICAgICogcmVmZXJlbmNlIGJhY2sgdG8gdGhlIFNlcnZpY2VEZWxlZ2F0ZSAod2hpY2ggaW52b2tlZCBpdCkgZm9yIHB1cnBvc2VzIG9mIHByb3Blcmx5IGNhY2hpbmcgCi0gICAgICogU2VydmljZURlc2NyaXB0aW9ucyB0aGF0IGNvbnRhaW4gZHluYW1pYyBwb3J0cwotICAgICAqCi0gICAgICogQHBhcmFtIHNlcnZpY2VEZXNjcmlwdGlvbiBBbiBleGlzdGluZyBjbGllbnQtc2lkZSBTZXJ2aWNlRGVzY3JpcHRpb24uICBUaGlzIG11c3Qgbm90IGJlCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLgotICAgICAqIEBwYXJhbSBzZWkgICAgICAgICAgICAgICAgVGhlIFNlcnZpY2VJbnRlcmZhY2UgY2xhc3MuICBUaGlzIGNhbiBiZSBudWxsIGZvciBhZGRpbmcgYSBwb3J0IG9yCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGluZyBhIERpc3BhdGNoOyBpdCBjYW4gbm90IGJlIG51bGwgd2hlbiBnZXR0aW5nIGEgcG9ydC4KLSAgICAgKiBAcGFyYW0gZXByICAgICAgICAgICAgICAgICBUaGUgZW5kcG9pbnQgcmVmZXJlbmNlIHRvIHRoZSB0YXJnZXQgcG9ydC4KLSAgICAgKiBAcGFyYW0gYWRkcmVzc2luZ05hbWVzcGFjZSBUaGUgYWRkcmVzc2luZyBuYW1lc3BhY2Ugb2YgdGhlIGVuZHBvaW50IHJlZmVyZW5jZS4KLSAgICAgKiBAcGFyYW0gdXBkYXRlVHlwZSAgICAgICAgIFRoZSB0eXBlIG9mIHRoZSB1cGRhdGU6IGFkZGluZyBhIHBvcnQsIGNyZWF0aW5nIGEgZGlzcGF0Y2gsIG9yCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBnZXR0aW5nIGFuIFNFSS1iYXNlZCBwb3J0LgotICAgICAqIEBwYXJhbSBzZXJ2aWNlRGVsZWdhdGVLZXkgQSByZWZlcmVuY2UgYmFjayB0byB0aGUgU2VydmljZURlbGVnYXRlIHRoYXQgY2FsbGVkIGl0Ci0gICAgICogQHJldHVybiBBbiBFbmRwb2ludERlc2NyaXB0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHBvcnQuCi0gICAgICogQHNlZSAjY3JlYXRlU2VydmljZURlc2NyaXB0aW9uKFVSTCwgUU5hbWUsIENsYXNzKQotICAgICAqIEBzZWUgRGVzY3JpcHRpb25GYWN0b3J5LlVwZGF0ZVR5cGUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEVuZHBvaW50RGVzY3JpcHRpb24gdXBkYXRlRW5kcG9pbnQoU2VydmljZURlc2NyaXB0aW9uIHNlcnZpY2VEZXNjcmlwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3Mgc2VpLCBFbmRwb2ludFJlZmVyZW5jZSBlcHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhZGRyZXNzaW5nTmFtZXNwYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkZhY3RvcnkuVXBkYXRlVHlwZSB1cGRhdGVUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qgc2VydmljZURlbGVnYXRlS2V5KSB7Ci0gICAgICAgIHJldHVybiBEZXNjcmlwdGlvbkZhY3RvcnlJbXBsCi0gICAgICAgICAgICAgICAgICAgLnVwZGF0ZUVuZHBvaW50KHNlcnZpY2VEZXNjcmlwdGlvbiwgc2VpLCBlcHIsIGFkZHJlc3NpbmdOYW1lc3BhY2UsIHVwZGF0ZVR5cGUsIHNlcnZpY2VEZWxlZ2F0ZUtleSwgbnVsbCwgbnVsbCk7Ci0gICAgfSAgICAKLQotICAgIC8qKgotICAgICAqIFJldHJpZXZlIG9yIGNyZWF0ZSBhbiBFbmRwb2ludERlc2NyaXB0aW9uIGhpZXJhY2h5IGFzc29jaWF0ZWQgd2l0aCBhbiBleGlzdGluZyBDTElFTlQgc2lkZQotICAgICAqIFNlcnZpY2VEZXNjcmlwdGlvbiBmb3IgYSBwYXJ0aWN1bGFyIHBvcnQuICBBZGRpdG9uYWwgbWV0ZGF0YSBtYXkgYmUgc3BlY2lmaWVkIGluIGEgc3BhcnNlCi0gICAgICogY29tcG9zaXRlLiAgVGhhdCBtZXRhZGF0YSBtYXkgY29tZSBmcm9tIGEgSlNSLTEwOSBjbGllbnQgZGVwbG95bWVudCBkZXNjcmlwdG9yLCBmb3IgZXhhbXBsZSwKLSAgICAgKiBvciBmcm9tIHJlc291cmNlIGluamVjdGlvbiBvZiBhbiBXZWJTZXJ2aWNlUmVmIG9yIG90aGVyIFJlc291cmNlIGFubm90YXRpb24uCi0gICAgICogCi0gICAgICogQHNlZSAjdXBkYXRlRW5kcG9pbnQoU2VydmljZURlc2NyaXB0aW9uLCBDbGFzcywgUU5hbWUsIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRGVzY3JpcHRpb25GYWN0b3J5LlVwZGF0ZVR5cGUpCi0gICAgICogIAotICAgICAqIEBwYXJhbSBzZXJ2aWNlRGVzY3JpcHRpb24KLSAgICAgKiBAcGFyYW0gc2VpCi0gICAgICogQHBhcmFtIHBvcnRRTmFtZQotICAgICAqIEBwYXJhbSB1cGRhdGVUeXBlCi0gICAgICogQHBhcmFtIGNvbXBvc2l0ZQotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEVuZHBvaW50RGVzY3JpcHRpb24gdXBkYXRlRW5kcG9pbnQoU2VydmljZURlc2NyaXB0aW9uIHNlcnZpY2VEZXNjcmlwdGlvbiwKLSAgICAgICAgICAgIENsYXNzIHNlaSwgRW5kcG9pbnRSZWZlcmVuY2UgZXByLAotICAgICAgICAgICAgU3RyaW5nIGFkZHJlc3NpbmdOYW1lc3BhY2UsCi0gICAgICAgICAgICBEZXNjcmlwdGlvbkZhY3RvcnkuVXBkYXRlVHlwZSB1cGRhdGVUeXBlLAotICAgICAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIGNvbXBvc2l0ZSwKLSAgICAgICAgICAgIE9iamVjdCBzcGFyc2VDb21wb3NpdGVLZXkpIHsKLSAgICAgICAgcmV0dXJuIERlc2NyaXB0aW9uRmFjdG9yeUltcGwKLSAgICAgICAgLnVwZGF0ZUVuZHBvaW50KHNlcnZpY2VEZXNjcmlwdGlvbiwgc2VpLCBlcHIsIGFkZHJlc3NpbmdOYW1lc3BhY2UsIHVwZGF0ZVR5cGUsIGNvbXBvc2l0ZSwgc3BhcnNlQ29tcG9zaXRlS2V5LCBudWxsLCBudWxsKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0cmlldmUgb3IgY3JlYXRlIHRoZSBFbmRwb2ludERlc2NyaXB0aW9uIGhpZXJhcmNoeSBhc3NvY2lhdGVkIHdpdGggYW4gZXhpc3RpbmcgQ0xJRU5UIHNpZGUKLSAgICAgKiBTZXJ2aWNlRGVzY3JpcHRpb24gZm9yIGEgcGFydGljdWxhciBwb3J0LiAgSWYgYW4gRW5kcG9pbnREZXNjcml0cHRpb24gYWxyZWFkeSBleGlzdHMsIGl0IHdpbGwKLSAgICAgKiBiZSByZXR1cm5lZDsgaWYgb25lIGRvZXMgbm90IGFscmVhZHkgZXhpc3QsIGl0IHdpbGwgYmUgY3JlYXRlZC4gIE5vdGUgdGhhdCBpZiB0aGUgU0VJIGlzIG51bGwKLSAgICAgKiB0aGVuIHRoZSBFbmRwb2ludERlc2NyaXB0aW9uIHJldHVybmVkIHdpbGwgYmUgZm9yIGEgRGlzcGF0Y2ggY2xpZW50IG9ubHkgYW5kIGl0IHdpbGwgbm90IGhhdmUKLSAgICAgKiBhbiBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uIGhpZXJhcmNoeSBhc3NvY2lhdGVkIHdpdGggaXQuICBJZiwgYXQgYSBsYXRlciBwb2ludCwgdGhlIHNhbWUKLSAgICAgKiBwb3J0IGlzIHJlcXVlc3RlZCBhbmQgYW4gU0VJIGlzIHByb3ZpZGVkLCB0aGUgZXhpc3RpbmcgRW5kcG9pbnREZXNjcmlwdGlvbiB3aWxsIGJlIHVwZGF0ZWQKLSAgICAgKiB3aXRoIGEgbmV3bHktY3JlYXRlZCBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uIGhpZXJhcmNoeS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzZXJ2aWNlRGVzY3JpcHRpb24gQW4gZXhpc3RpbmcgY2xpZW50LXNpZGUgU2VydmljZURlc2NyaXB0aW9uLiAgVGhpcyBtdXN0IG5vdCBiZQotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbC4KLSAgICAgKiBAcGFyYW0gc2VpICAgICAgICAgICAgICAgIFRoZSBTZXJ2aWNlSW50ZXJmYWNlIGNsYXNzLiAgVGhpcyBjYW4gYmUgbnVsbCBmb3IgYWRkaW5nIGEgcG9ydCBvcgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRpbmcgYSBEaXNwYXRjaDsgaXQgY2FuIG5vdCBiZSBudWxsIHdoZW4gZ2V0dGluZyBhIHBvcnQuCi0gICAgICogQHBhcmFtIHBvcnRRTmFtZSAgICAgICAgICBUaGUgUU5hbWUgb2YgdGhlIHBvcnQuICBJZiB0aGlzIGlzIG51bGwsIHRoZSBydW50aW1lIHdpbGwgYXR0ZW1wdAotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gdG8gc2VsZWN0IGFuIGFwcHJvcHJpYXRlIHBvcnQgdG8gdXNlLgotICAgICAqIEBwYXJhbSB1cGRhdGVUeXBlICAgICAgICAgVGhlIHR5cGUgb2YgdGhlIHVwZGF0ZTogYWRkaW5nIGEgcG9ydCwgY3JlYXRpbmcgYSBkaXNwYXRjaCwgb3IKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldHRpbmcgYW4gU0VJLWJhc2VkIHBvcnQuCi0gICAgICogQHJldHVybiBBbiBFbmRwb2ludERlc2NyaXB0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHBvcnQuCi0gICAgICogQHNlZSAjY3JlYXRlU2VydmljZURlc2NyaXB0aW9uKFVSTCwgUU5hbWUsIENsYXNzKQotICAgICAqIEBzZWUgRGVzY3JpcHRpb25GYWN0b3J5LlVwZGF0ZVR5cGUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEVuZHBvaW50RGVzY3JpcHRpb24gdXBkYXRlRW5kcG9pbnQoU2VydmljZURlc2NyaXB0aW9uIHNlcnZpY2VEZXNjcmlwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3Mgc2VpLCBRTmFtZSBwb3J0UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uRmFjdG9yeS5VcGRhdGVUeXBlIHVwZGF0ZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBiaW5kaW5nSWQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZW5kcG9pbnRBZGRyZXNzKSB7Ci0gICAgICAgIHJldHVybiBEZXNjcmlwdGlvbkZhY3RvcnlJbXBsCi0gICAgICAgICAgICAgICAgICAgLnVwZGF0ZUVuZHBvaW50KHNlcnZpY2VEZXNjcmlwdGlvbiwgc2VpLCBwb3J0UU5hbWUsIHVwZGF0ZVR5cGUsIGJpbmRpbmdJZCwgZW5kcG9pbnRBZGRyZXNzKTsKLSAgICB9ICAgIAotICAgIAotICAgIC8qKgotICAgICAqIFJldHJpZXZlIG9yIGNyZWF0ZSB0aGUgRW5kcG9pbnREZXNjcmlwdGlvbiBoaWVyYXJjaHkgYXNzb2NpYXRlZCB3aXRoIGFuIGV4aXN0aW5nIENMSUVOVCBzaWRlCi0gICAgICogU2VydmljZURlc2NyaXB0aW9uIGZvciBhIHBhcnRpY3VsYXIgcG9ydC4gIFRoaXMgaXMgaWRlbnRpY2FsIHRvIGFib3ZlLCBidXQgdGhpcyBtZXRob2QgaGFzIGEgCi0gICAgICogcmVmZXJlbmNlIGJhY2sgdG8gdGhlIFNlcnZpY2VEZWxlZ2F0ZSAod2hpY2ggaW52b2tlZCBpdCkgZm9yIHB1cnBvc2VzIG9mIHByb3Blcmx5IGNhY2hpbmcgCi0gICAgICogU2VydmljZURlc2NyaXB0aW9ucyB0aGF0IGNvbnRhaW4gZHluYW1pYyBwb3J0cwotICAgICAqCi0gICAgICogQHBhcmFtIHNlcnZpY2VEZXNjcmlwdGlvbiBBbiBleGlzdGluZyBjbGllbnQtc2lkZSBTZXJ2aWNlRGVzY3JpcHRpb24uICBUaGlzIG11c3Qgbm90IGJlCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLgotICAgICAqIEBwYXJhbSBzZWkgICAgICAgICAgICAgICAgVGhlIFNlcnZpY2VJbnRlcmZhY2UgY2xhc3MuICBUaGlzIGNhbiBiZSBudWxsIGZvciBhZGRpbmcgYSBwb3J0IG9yCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGluZyBhIERpc3BhdGNoOyBpdCBjYW4gbm90IGJlIG51bGwgd2hlbiBnZXR0aW5nIGEgcG9ydC4KLSAgICAgKiBAcGFyYW0gcG9ydFFOYW1lICAgICAgICAgIFRoZSBRTmFtZSBvZiB0aGUgcG9ydC4gIElmIHRoaXMgaXMgbnVsbCwgdGhlIHJ1bnRpbWUgd2lsbCBhdHRlbXB0Ci0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICB0byB0byBzZWxlY3QgYW4gYXBwcm9wcmlhdGUgcG9ydCB0byB1c2UuCi0gICAgICogQHBhcmFtIHVwZGF0ZVR5cGUgICAgICAgICBUaGUgdHlwZSBvZiB0aGUgdXBkYXRlOiBhZGRpbmcgYSBwb3J0LCBjcmVhdGluZyBhIGRpc3BhdGNoLCBvcgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0dGluZyBhbiBTRUktYmFzZWQgcG9ydC4KLSAgICAgKiBAcGFyYW0gc2VydmljZURlbGVnYXRlS2V5IEEgcmVmZXJlbmNlIGJhY2sgdG8gdGhlIFNlcnZpY2VEZWxlZ2F0ZSB0aGF0IGNhbGxlZCBpdAotICAgICAqIEByZXR1cm4gQW4gRW5kcG9pbnREZXNjcmlwdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBwb3J0LgotICAgICAqIEBzZWUgI2NyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbihVUkwsIFFOYW1lLCBDbGFzcykKLSAgICAgKiBAc2VlIERlc2NyaXB0aW9uRmFjdG9yeS5VcGRhdGVUeXBlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBFbmRwb2ludERlc2NyaXB0aW9uIHVwZGF0ZUVuZHBvaW50KFNlcnZpY2VEZXNjcmlwdGlvbiBzZXJ2aWNlRGVzY3JpcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzIHNlaSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFOYW1lIHBvcnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb25GYWN0b3J5LlVwZGF0ZVR5cGUgdXBkYXRlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHNlcnZpY2VEZWxlZ2F0ZUtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGJpbmRpbmdJZCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBlbmRwb2ludEFkZHJlc3MpIHsKLSAgICAgICAgcmV0dXJuIERlc2NyaXB0aW9uRmFjdG9yeUltcGwKLSAgICAgICAgICAgICAgICAgICAudXBkYXRlRW5kcG9pbnQoc2VydmljZURlc2NyaXB0aW9uLCBzZWksIHBvcnRRTmFtZSwgdXBkYXRlVHlwZSwgc2VydmljZURlbGVnYXRlS2V5LCBiaW5kaW5nSWQsIGVuZHBvaW50QWRkcmVzcyk7Ci0gICAgfSAgICAKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXRyaWV2ZSBvciBjcmVhdGUgYW4gRW5kcG9pbnREZXNjcmlwdGlvbiBoaWVyYXJjaHkgYXNzb2NpYXRlZCB3aXRoIGFuIGV4aXN0aW5nIENMSUVOVCBzaWRlCi0gICAgICogU2VydmljZURlc2NyaXB0aW9uIGZvciBhIHBhcnRpY3VsYXIgcG9ydC4gIEFkZGl0aW9uYWwgbWV0YWRhdGEgbWF5IGJlIHNwZWNpZmllZCBpbiBhIHNwYXJzZQotICAgICAqIGNvbXBvc2l0ZS4gIFRoYXQgbWV0YWRhdGEgbWF5IGNvbWUgZnJvbSBhIEpTUi0xMDkgY2xpZW50IGRlcGxveW1lbnQgZGVzY3JpcHRvciwgZm9yIGV4YW1wbGUsCi0gICAgICogb3IgZnJvbSByZXNvdXJjZSBpbmplY3Rpb24gb2YgYW4gV2ViU2VydmljZVJlZiBvciBvdGhlciBSZXNvdXJjZSBhbm5vdGF0aW9uLgotICAgICAqIAotICAgICAqIEBzZWUgI3VwZGF0ZUVuZHBvaW50KFNlcnZpY2VEZXNjcmlwdGlvbiwgQ2xhc3MsIFFOYW1lLCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkRlc2NyaXB0aW9uRmFjdG9yeS5VcGRhdGVUeXBlKQotICAgICAqICAKLSAgICAgKiBAcGFyYW0gc2VydmljZURlc2NyaXB0aW9uCi0gICAgICogQHBhcmFtIHNlaQotICAgICAqIEBwYXJhbSBwb3J0UU5hbWUKLSAgICAgKiBAcGFyYW0gdXBkYXRlVHlwZQotICAgICAqIEBwYXJhbSBjb21wb3NpdGUKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBFbmRwb2ludERlc2NyaXB0aW9uIHVwZGF0ZUVuZHBvaW50KFNlcnZpY2VEZXNjcmlwdGlvbiBzZXJ2aWNlRGVzY3JpcHRpb24sCi0gICAgICAgICAgICBDbGFzcyBzZWksIFFOYW1lIHBvcnRRTmFtZSwKLSAgICAgICAgICAgIERlc2NyaXB0aW9uRmFjdG9yeS5VcGRhdGVUeXBlIHVwZGF0ZVR5cGUsCi0gICAgICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgY29tcG9zaXRlLAotICAgICAgICAgICAgT2JqZWN0IHNwYXJzZUNvbXBvc2l0ZUtleSwKLSAgICAgICAgICAgIFN0cmluZyBiaW5kaW5nSWQsIFN0cmluZyBlbmRwb2ludEFkZHJlc3MpIHsKLSAgICAgICAgcmV0dXJuIERlc2NyaXB0aW9uRmFjdG9yeUltcGwKLSAgICAgICAgICAgICAgICAgICAudXBkYXRlRW5kcG9pbnQoc2VydmljZURlc2NyaXB0aW9uLCBzZWksIHBvcnRRTmFtZSwgdXBkYXRlVHlwZSwgY29tcG9zaXRlLCBzcGFyc2VDb21wb3NpdGVLZXksIGJpbmRpbmdJZCwgZW5kcG9pbnRBZGRyZXNzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXRyaWV2ZSBvciBjcmVhdGUgdGhlIEVuZHBvaW50RGVzY3JpcHRpb24gaGllcmFjaHkgYXNzb2NpYXRlZCB3aXRoIGFuIGV4aXN0aW5nIENMSUVOVCBzaWRlCi0gICAgICogU2VydmljZURlc2NyaXB0aW9uIGZvciBhIHBhcnRpY3VsYXIgcG9ydC4gIElmIGFuIEVuZHBvaW50RGVzY3JpdHB0aW9uIGFscmVhZHkgZXhpc3RzLCBpdCB3aWxsCi0gICAgICogYmUgcmV0dXJuZWQ7IGlmIG9uZSBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LCBpdCB3aWxsIGJlIGNyZWF0ZWQuICBOb3RlIHRoYXQgaWYgdGhlIFNFSSBpcyBudWxsCi0gICAgICogdGhlbiB0aGUgRW5kcG9pbnREZXNjcmlwdGlvbiByZXR1cm5lZCB3aWxsIGJlIGZvciBhIERpc3BhdGNoIGNsaWVudCBvbmx5IGFuZCBpdCB3aWxsIG5vdCBoYXZlCi0gICAgICogYW4gRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiBoaWVyYWNoeSBhc3NvY2lhdGVkIHdpdGggaXQuICBJZiwgYXQgYSBsYXRlciBwb2ludCwgdGhlIHNhbWUKLSAgICAgKiBwb3J0IGlzIHJlcXVlc3RlZCBhbmQgYW4gU0VJIGlzIHByb3ZpZGVkLCB0aGUgZXhpc3RpbmcgRW5kcG9pbnREZXNjcmlwdGlvbiB3aWxsIGJlIHVwZGF0ZWQKLSAgICAgKiB3aXRoIGEgbmV3bHktY3JlYXRlZCBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uIGhpZXJhY3kuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2VydmljZURlc2NyaXB0aW9uICBBbiBleGlzdGluZyBjbGllbnQtc2lkZSBTZXJ2aWNlRGVzY3JpcHRpb24uICBUaGlzIG11c3Qgbm90IGJlCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbC4KLSAgICAgKiBAcGFyYW0gc2VpICAgICAgICAgICAgICAgICBUaGUgU2VydmljZUludGVyZmFjZSBjbGFzcy4gIFRoaXMgY2FuIGJlIG51bGwgZm9yIGFkZGluZyBhIHBvcnQgb3IKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGluZyBhIERpc3BhdGNoOyBpdCBjYW4gbm90IGJlIG51bGwgd2hlbiBnZXR0aW5nIGEgcG9ydC4KLSAgICAgKiBAcGFyYW0gZXByICAgICAgICAgICAgICAgICBUaGUgZW5kcG9pbnQgcmVmZXJlbmNlIHRvIHRoZSB0YXJnZXQgcG9ydC4KLSAgICAgKiBAcGFyYW0gYWRkcmVzc2luZ05hbWVzcGFjZSBUaGUgYWRkcmVzc2luZyBuYW1lc3BhY2Ugb2YgdGhlIGVuZHBvaW50IHJlZmVyZW5jZS4KLSAgICAgKiBAcGFyYW0gdXBkYXRlVHlwZSAgICAgICAgICBUaGUgdHlwZSBvZiB0aGUgdXBkYXRlOiBhZGRpbmcgYSBwb3J0LCBjcmVhdGluZyBhIGRpc3BhdGNoLCBvcgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldHRpbmcgYW4gU0VJLWJhc2VkIHBvcnQuCi0gICAgICogQHJldHVybiBBbiBFbmRwb2ludERlc2NyaXB0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHBvcnQuCi0gICAgICogQHNlZSAjY3JlYXRlU2VydmljZURlc2NyaXB0aW9uKFVSTCwgUU5hbWUsIENsYXNzKQotICAgICAqIEBzZWUgRGVzY3JpcHRpb25GYWN0b3J5LlVwZGF0ZVR5cGUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEVuZHBvaW50RGVzY3JpcHRpb24gdXBkYXRlRW5kcG9pbnQoU2VydmljZURlc2NyaXB0aW9uIHNlcnZpY2VEZXNjcmlwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3Mgc2VpLCBFbmRwb2ludFJlZmVyZW5jZSBlcHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhZGRyZXNzaW5nTmFtZXNwYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkZhY3RvcnkuVXBkYXRlVHlwZSB1cGRhdGVUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYmluZGluZ0lkLCBTdHJpbmcgZW5kcG9pbnRBZGRyZXNzKSB7Ci0gICAgICAgIHJldHVybiBEZXNjcmlwdGlvbkZhY3RvcnlJbXBsCi0gICAgICAgICAgICAgICAgLnVwZGF0ZUVuZHBvaW50KHNlcnZpY2VEZXNjcmlwdGlvbiwgc2VpLCBlcHIsIGFkZHJlc3NpbmdOYW1lc3BhY2UsIHVwZGF0ZVR5cGUsIGJpbmRpbmdJZCwgZW5kcG9pbnRBZGRyZXNzKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0cmlldmUgb3IgY3JlYXRlIHRoZSBFbmRwb2ludERlc2NyaXB0aW9uIGhpZXJhcmNoeSBhc3NvY2lhdGVkIHdpdGggYW4gZXhpc3RpbmcgQ0xJRU5UIHNpZGUKLSAgICAgKiBTZXJ2aWNlRGVzY3JpcHRpb24gZm9yIGEgcGFydGljdWxhciBwb3J0LiAgVGhpcyBpcyBpZGVudGljYWwgdG8gYWJvdmUsIGJ1dCB0aGlzIG1ldGhvZCBoYXMgYSAKLSAgICAgKiByZWZlcmVuY2UgYmFjayB0byB0aGUgU2VydmljZURlbGVnYXRlICh3aGljaCBpbnZva2VkIGl0KSBmb3IgcHVycG9zZXMgb2YgcHJvcGVybHkgY2FjaGluZyAKLSAgICAgKiBTZXJ2aWNlRGVzY3JpcHRpb25zIHRoYXQgY29udGFpbiBkeW5hbWljIHBvcnRzCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2VydmljZURlc2NyaXB0aW9uIEFuIGV4aXN0aW5nIGNsaWVudC1zaWRlIFNlcnZpY2VEZXNjcmlwdGlvbi4gIFRoaXMgbXVzdCBub3QgYmUKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwuCi0gICAgICogQHBhcmFtIHNlaSAgICAgICAgICAgICAgICBUaGUgU2VydmljZUludGVyZmFjZSBjbGFzcy4gIFRoaXMgY2FuIGJlIG51bGwgZm9yIGFkZGluZyBhIHBvcnQgb3IKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0aW5nIGEgRGlzcGF0Y2g7IGl0IGNhbiBub3QgYmUgbnVsbCB3aGVuIGdldHRpbmcgYSBwb3J0LgotICAgICAqIEBwYXJhbSBlcHIgICAgICAgICAgICAgICAgIFRoZSBlbmRwb2ludCByZWZlcmVuY2UgdG8gdGhlIHRhcmdldCBwb3J0LgotICAgICAqIEBwYXJhbSBhZGRyZXNzaW5nTmFtZXNwYWNlIFRoZSBhZGRyZXNzaW5nIG5hbWVzcGFjZSBvZiB0aGUgZW5kcG9pbnQgcmVmZXJlbmNlLgotICAgICAqIEBwYXJhbSB1cGRhdGVUeXBlICAgICAgICAgVGhlIHR5cGUgb2YgdGhlIHVwZGF0ZTogYWRkaW5nIGEgcG9ydCwgY3JlYXRpbmcgYSBkaXNwYXRjaCwgb3IKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldHRpbmcgYW4gU0VJLWJhc2VkIHBvcnQuCi0gICAgICogQHBhcmFtIHNlcnZpY2VEZWxlZ2F0ZUtleSBBIHJlZmVyZW5jZSBiYWNrIHRvIHRoZSBTZXJ2aWNlRGVsZWdhdGUgdGhhdCBjYWxsZWQgaXQKLSAgICAgKiBAcmV0dXJuIEFuIEVuZHBvaW50RGVzY3JpcHRpb24gY29ycmVzcG9uZGluZyB0byB0aGUgcG9ydC4KLSAgICAgKiBAc2VlICNjcmVhdGVTZXJ2aWNlRGVzY3JpcHRpb24oVVJMLCBRTmFtZSwgQ2xhc3MpCi0gICAgICogQHNlZSBEZXNjcmlwdGlvbkZhY3RvcnkuVXBkYXRlVHlwZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgRW5kcG9pbnREZXNjcmlwdGlvbiB1cGRhdGVFbmRwb2ludChTZXJ2aWNlRGVzY3JpcHRpb24gc2VydmljZURlc2NyaXB0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyBzZWksIEVuZHBvaW50UmVmZXJlbmNlIGVwciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGFkZHJlc3NpbmdOYW1lc3BhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uRmFjdG9yeS5VcGRhdGVUeXBlIHVwZGF0ZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBzZXJ2aWNlRGVsZWdhdGVLZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBiaW5kaW5nSWQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZW5kcG9pbnRBZGRyZXNzKSB7Ci0gICAgICAgIHJldHVybiBEZXNjcmlwdGlvbkZhY3RvcnlJbXBsCi0gICAgICAgICAgICAgICAgICAgLnVwZGF0ZUVuZHBvaW50KHNlcnZpY2VEZXNjcmlwdGlvbiwgc2VpLCBlcHIsIGFkZHJlc3NpbmdOYW1lc3BhY2UsIHVwZGF0ZVR5cGUsIHNlcnZpY2VEZWxlZ2F0ZUtleSwgYmluZGluZ0lkLCBlbmRwb2ludEFkZHJlc3MpOwotICAgIH0gICAgCi0KLSAgICAvKioKLSAgICAgKiBSZXRyaWV2ZSBvciBjcmVhdGUgYW4gRW5kcG9pbnREZXNjcmlwdGlvbiBoaWVyYWNoeSBhc3NvY2lhdGVkIHdpdGggYW4gZXhpc3RpbmcgQ0xJRU5UIHNpZGUKLSAgICAgKiBTZXJ2aWNlRGVzY3JpcHRpb24gZm9yIGEgcGFydGljdWxhciBwb3J0LiAgQWRkaXRvbmFsIG1ldGRhdGEgbWF5IGJlIHNwZWNpZmllZCBpbiBhIHNwYXJzZQotICAgICAqIGNvbXBvc2l0ZS4gIFRoYXQgbWV0YWRhdGEgbWF5IGNvbWUgZnJvbSBhIEpTUi0xMDkgY2xpZW50IGRlcGxveW1lbnQgZGVzY3JpcHRvciwgZm9yIGV4YW1wbGUsCi0gICAgICogb3IgZnJvbSByZXNvdXJjZSBpbmplY3Rpb24gb2YgYW4gV2ViU2VydmljZVJlZiBvciBvdGhlciBSZXNvdXJjZSBhbm5vdGF0aW9uLgotICAgICAqIAotICAgICAqIEBzZWUgI3VwZGF0ZUVuZHBvaW50KFNlcnZpY2VEZXNjcmlwdGlvbiwgQ2xhc3MsIFFOYW1lLCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkRlc2NyaXB0aW9uRmFjdG9yeS5VcGRhdGVUeXBlKQotICAgICAqICAKLSAgICAgKiBAcGFyYW0gc2VydmljZURlc2NyaXB0aW9uCi0gICAgICogQHBhcmFtIHNlaQotICAgICAqIEBwYXJhbSBwb3J0UU5hbWUKLSAgICAgKiBAcGFyYW0gdXBkYXRlVHlwZQotICAgICAqIEBwYXJhbSBjb21wb3NpdGUKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBFbmRwb2ludERlc2NyaXB0aW9uIHVwZGF0ZUVuZHBvaW50KFNlcnZpY2VEZXNjcmlwdGlvbiBzZXJ2aWNlRGVzY3JpcHRpb24sCi0gICAgICAgICAgICBDbGFzcyBzZWksIEVuZHBvaW50UmVmZXJlbmNlIGVwciwKLSAgICAgICAgICAgIFN0cmluZyBhZGRyZXNzaW5nTmFtZXNwYWNlLAotICAgICAgICAgICAgRGVzY3JpcHRpb25GYWN0b3J5LlVwZGF0ZVR5cGUgdXBkYXRlVHlwZSwKLSAgICAgICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBjb21wb3NpdGUsCi0gICAgICAgICAgICBPYmplY3Qgc3BhcnNlQ29tcG9zaXRlS2V5LAotICAgICAgICAgICAgU3RyaW5nIGJpbmRpbmdJZCwgU3RyaW5nIGVuZHBvaW50QWRkcmVzcykgewotICAgICAgICByZXR1cm4gRGVzY3JpcHRpb25GYWN0b3J5SW1wbAotICAgICAgICAudXBkYXRlRW5kcG9pbnQoc2VydmljZURlc2NyaXB0aW9uLCBzZWksIGVwciwgYWRkcmVzc2luZ05hbWVzcGFjZSwgdXBkYXRlVHlwZSwgY29tcG9zaXRlLCBzcGFyc2VDb21wb3NpdGVLZXksIGJpbmRpbmdJZCwgZW5kcG9pbnRBZGRyZXNzKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgZnVsbCBTZXJ2aWNlRGVzY3JpcHRpb24gaGllcmFyY2h5IG9uIHRoZSBTRVJWRVIgc2lkZSBmb3IgRUFDSCBzZXJ2aWNlIGltcGxlbWVudGF0aW9uCi0gICAgICogZW50cnkgaW4gdGhlIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSAoREJDKSBtYXAuICBOb3RlIHRoYXQgdGhlIGFzc29jaWF0ZWQgU0VSVkVSIHNpZGUKLSAgICAgKiBBeGlzIGRlc2NyaXB0aW9uIG9iamVjdHMgYXJlIGFsc28gY3JlYXRlZC4gIFRvIGNyZWF0ZSBhIHNpbmdsZSBTZXJ2aWNlRGVzY3JpcHRpb24gaGllcmFyY2h5Ci0gICAgICogZm9yIGEgc2luZ2xlIHNlcnZpY2UgaW1wbGVtZW50YXRpb24gY2xhc3MsIHVzZSB0aGUgZmFjdG9yeSBtZXRob2QgdGhhdCB0YWtlcyBhIHNpbmdsZSBjbGFzcwotICAgICAqIGFuZCByZXR1cm5zIGEgc2luZ2xlIFNlcnZpY2VEZXNjcmlwdGlvbi4KLSAgICAgKiA8cC8+Ci0gICAgICogQSBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIERCQyBlbnRyeSBpcyBvbmUgdGhhdDogKDEpIElzIGEgY2xhc3MgYW5kIG5vdCBhbiBpbnRlcmZhY2UgKDIpCi0gICAgICogQ2FycmllcyBhIFdlYlNlcnZpY2Ugb3IgV2ViU2VydmljZVByb3ZpZGVyIGFubm90YXRpb24uCi0gICAgICogPHAvPgotICAgICAqIEEgREJDIHJlcHJlc2VudHMgdGhlIGluZm9ybWF0aW9uIGZvdW5kIGluIHRoZSBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIGNsYXNzLiAgVGhlcmUgd2lsbCBiZQotICAgICAqIG90aGVyIERCQyBlbnRyaWVzIGluIHRoZSBtYXAgZm9yIGNsYXNzZXMgYW5kIGludGVyZmFjZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzZXJ2aWNlCi0gICAgICogaW1wbGVtZW50YXRpb24sIHN1Y2ggYXMgc3VwZXIgY2xhc3Nlcywgc3VwZXIgaW50ZXJmYWNlcywgZmF1bHQgY2xhc3NlcywgYW5kIHN1Y2guCi0gICAgICogPHAvPgotICAgICAqIE5vdGUgdGhhdCBtYXAgbWF5IGNvbnRhaW4gPiAxIHNlcnZpY2UgaW1wbGVtZW50YXRpb24gREJDLiAgQSBmdWxsIFNlcnZpY2VEZXNjcmlwdGlvbmhpZXJhcmNoeQotICAgICAqIHdpbGwgYmUgY3JlYXRlZCBmb3IgZWFjaCBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIERCQyBlbnRyeS4KLSAgICAgKiA8cC8+Ci0gICAgICogTm90ZSB0aGF0IGVhY2ggU2VydmljZURlc2NyaXB0aW9uIHdpbGwgaGF2ZSBleGFjdGx5IG9uZSBFbmRwb2ludERlc2NyaXB0aW9uIGNvcnJlc3BvbmRpbmcgdG8KLSAgICAgKiBlYWNoIHNlcnZpY2UgaW1wbGVtZW50YXRpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZGJjTWFwIEEgSGFzaE1hcCBrZXllZCBvbiBjbGFzcyBuYW1lIHdpdGggYSB2YWx1ZSBmb3IgdGhlIERCQyBmb3IgdGhhdCBjbGFzc25hbWUKLSAgICAgKiBAcmV0dXJuIEEgTGlzdCBvZiBTZXJ2aWNlRGVzY3JpcHRpb25zIHdpdGggdGhlIGFzc29jaWF0ZWQgU0VSVkVSIHNpZGUgaGllcmFyY2h5IGNyZWF0ZWQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBMaXN0PFNlcnZpY2VEZXNjcmlwdGlvbj4gY3JlYXRlU2VydmljZURlc2NyaXB0aW9uRnJvbURCQ01hcCgKLSAgICAgICAgICAgIEhhc2hNYXA8U3RyaW5nLCBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGU+IGRiY01hcCkgewotICAgICAgICBTY2hlbWFCdWlsZGVyLmluaXRDYWNoZSgpOyAgLy8gdHVybiBvbiBzdGF0aWMgWG1sU2NoZW1hIG9iamVjdCBjYWNoaW5nIGluIFNjaGVtYUJ1aWxkZXIKLSAgICAgICAgTGlzdDxTZXJ2aWNlRGVzY3JpcHRpb24+IGxpc3RTRCA9IERlc2NyaXB0aW9uRmFjdG9yeUltcGwuY3JlYXRlU2VydmljZURlc2NyaXB0aW9uRnJvbURCQ01hcChkYmNNYXAsIG51bGwpOwotICAgICAgICBTY2hlbWFCdWlsZGVyLmNsZWFyQ2FjaGUoKTsgIC8vIHR1cm4gb2ZmIGNhY2hpbmcgc28gd2UgZG9uJ3QgYnJlYWsgZXZlcnlib2R5IGVsc2UKLSAgICAgICAgcmV0dXJuIGxpc3RTRDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBmdWxsIFNlcnZpY2VEZXNjcmlwdGlvbiBoaWVyYXJjaHkgb24gdGhlIFNFUlZFUiBzaWRlIGZvciBFQUNIIHNlcnZpY2UgaW1wbGVtZW50YXRpb24KLSAgICAgKiBlbnRyeSBpbiB0aGUgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIChEQkMpIG1hcC4gIE5vdGUgdGhhdCB0aGUgYXNzb2NpYXRlZCBTRVJWRVIgc2lkZQotICAgICAqIEF4aXMgZGVzY3JpcHRpb24gb2JqZWN0cyBhcmUgYWxzbyBjcmVhdGVkLiAgVG8gY3JlYXRlIGEgc2luZ2xlIFNlcnZpY2VEZXNjcmlwdGlvbiBoaWVyYXJjaHkKLSAgICAgKiBmb3IgYSBzaW5nbGUgc2VydmljZSBpbXBsZW1lbnRhdGlvbiBjbGFzcywgdXNlIHRoZSBmYWN0b3J5IG1ldGhvZCB0aGF0IHRha2VzIGEgc2luZ2xlIGNsYXNzCi0gICAgICogYW5kIHJldHVybnMgYSBzaW5nbGUgU2VydmljZURlc2NyaXB0aW9uLgotICAgICAqIDxwLz4KLSAgICAgKiBBIHNlcnZpY2UgaW1wbGVtZW50YXRpb24gREJDIGVudHJ5IGlzIG9uZSB0aGF0OiAoMSkgSXMgYSBjbGFzcyBhbmQgbm90IGFuIGludGVyZmFjZSAoMikKLSAgICAgKiBDYXJyaWVzIGEgV2ViU2VydmljZSBvciBXZWJTZXJ2aWNlUHJvdmlkZXIgYW5ub3RhdGlvbi4KLSAgICAgKiA8cC8+Ci0gICAgICogQSBEQkMgcmVwcmVzZW50cyB0aGUgaW5mb3JtYXRpb24gZm91bmQgaW4gdGhlIHNlcnZpY2UgaW1wbGVtZW50YXRpb24gY2xhc3MuICBUaGVyZSB3aWxsIGJlCi0gICAgICogb3RoZXIgREJDIGVudHJpZXMgaW4gdGhlIG1hcCBmb3IgY2xhc3NlcyBhbmQgaW50ZXJmYWNlcyBhc3NvY2lhdGVkIHdpdGggdGhlIHNlcnZpY2UKLSAgICAgKiBpbXBsZW1lbnRhdGlvbiwgc3VjaCBhcyBzdXBlciBjbGFzc2VzLCBzdXBlciBpbnRlcmZhY2VzLCBmYXVsdCBjbGFzc2VzLCBhbmQgc3VjaC4KLSAgICAgKiA8cC8+Ci0gICAgICogTm90ZSB0aGF0IG1hcCBtYXkgY29udGFpbiA+IDEgc2VydmljZSBpbXBsZW1lbnRhdGlvbiBEQkMuICBBIGZ1bGwgU2VydmljZURlc2NyaXB0aW9uaGllcmFyY2h5Ci0gICAgICogd2lsbCBiZSBjcmVhdGVkIGZvciBlYWNoIHNlcnZpY2UgaW1wbGVtZW50YXRpb24gREJDIGVudHJ5LgotICAgICAqIDxwLz4KLSAgICAgKiBOb3RlIHRoYXQgZWFjaCBTZXJ2aWNlRGVzY3JpcHRpb24gd2lsbCBoYXZlIGV4YWN0bHkgb25lIEVuZHBvaW50RGVzY3JpcHRpb24gY29ycmVzcG9uZGluZyB0bwotICAgICAqIGVhY2ggc2VydmljZSBpbXBsZW1lbnRhdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBkYmNNYXAgQSBIYXNoTWFwIGtleWVkIG9uIGNsYXNzIG5hbWUgd2l0aCBhIHZhbHVlIGZvciB0aGUgREJDIGZvciB0aGF0IGNsYXNzbmFtZQotICAgICAqIEBwYXJhbSBjb25maWdDb250ZXh0IENvbmZpZ3VyYXRpb25Db250ZXh0IHVzZWQgdG8gZ2V0IFdTREwgRGVmaW5pdGlvbiBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMuCi0gICAgICogQHJldHVybiBBIExpc3Qgb2YgU2VydmljZURlc2NyaXB0aW9ucyB3aXRoIHRoZSBhc3NvY2lhdGVkIFNFUlZFUiBzaWRlIGhpZXJhcmNoeSBjcmVhdGVkLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxTZXJ2aWNlRGVzY3JpcHRpb24+IGNyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbkZyb21EQkNNYXAoCi0gICAgICAgICAgICAgSGFzaE1hcDxTdHJpbmcsIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZT4gZGJjTWFwLENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQpIHsKLSAgICAgICAgIHJldHVybiBEZXNjcmlwdGlvbkZhY3RvcnlJbXBsLmNyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbkZyb21EQkNNYXAoZGJjTWFwLCBjb25maWdDb250ZXh0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBmdWxsIFNlcnZpY2VEZXNjcmlwdGlvbiBoaWVyYXJjaHkgb24gdGhlIFNFUlZFUiBzaWRlIGZvciBhIHNpbmdsZSBzZXJ2aWNlCi0gICAgICogaW1wbGVtZW50YXRpb24gY2xhc3MuICBUbyBjcmVhdGUgcHJvY2VzcyBtb3JlIHRoYW4gb25lIHNlcnZpY2UgaW1wbGVtZW50YXRpb24gYXQgb25lIHRpbWUgb3IKLSAgICAgKiB0byBwcm9jZXNzIHRoZW0gd2l0aG91dCBjYXVzaW5nIHRoZSBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIGNsYXNzZXMgdG8gYmUgbG9hZGVkLCB1c2UgdGhlCi0gICAgICogZmFjdG9yeSBtZXRob2QgdGhhdCB0YWtlcyBhIGNvbGxlY3Rpb24gb2YgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIG9iamVjdHMgYW5kIHJldHVybnMgYQotICAgICAqIGNvbGxlY3Rpb24gb2YgU2VydmljZURlc2NyaXB0aW9ucy4KLSAgICAgKiA8cC8+Ci0gICAgICogTm90ZSB0aGF0IHRoZSBTZXJ2aWNlRGVzY3JpcHRpb24gd2lsbCBoYXZlIGV4YWN0bHkgb25lIEVuZHBvaW50RGVzY3JpcHRpb24gY29ycmVzcG9uZGluZyB0bwotICAgICAqIHRoZSBzZXJ2aWNlIGltcGxlbWVudGF0aW9uLgotICAgICAqCi0gICAgICogQHBhcmFtIHNlcnZpY2VJbXBsQ2xhc3MgQSBXZWIgU2VydmljZSBpbXBsZW1lbnRhdGlvbiBjbGFzcyAoaS5lLiBvbmUgdGhhdCBjYXJyaWVzIGFuCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgV2ViU2VydmljZSBvciBXZWJTZXJ2aWNlUHJvdmlkZXIgYW5ub3RhdGlvbikuCi0gICAgICogQHJldHVybiBBIFNlcnZpY2VEZXNjcmlwdGlvbiB3aXRoIHRoZSBhc3NvY2lhdGVkIFNFUlZFUiBzaWRlIGhpZXJhcmNoeSBjcmVhdGVkLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU2VydmljZURlc2NyaXB0aW9uIGNyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbihDbGFzcyBzZXJ2aWNlSW1wbENsYXNzKSB7Ci0gICAgICAgIHJldHVybiBEZXNjcmlwdGlvbkZhY3RvcnlJbXBsLmNyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbihzZXJ2aWNlSW1wbENsYXNzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHByb3ZpZGUgdmVyeSBjb252ZW5pZW50IHdheSBvZiBjcmVhdGluZyBhbiBBeGlzU2VydmljZSBmcm9tIGFuIGFubm90YXRlZCBqYXZhIGNsYXNzLgotICAgICAqCi0gICAgICogQHBhcmFtIHNlcnZpY2VJbXBsQ2xhc3MgQSBXZWIgU2VydmljZSBpbXBsZW1lbnRhdGlvbiBjbGFzcyAoaS5lLiBvbmUgdGhhdCBjYXJyaWVzIGFuCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgV2ViU2VydmljZSBvciBXZWJTZXJ2aWNlUHJvdmlkZXIgYW5ub3RhdGlvbikuCi0gICAgICogQHJldHVybiBBbiBBeGlzU2VydmljZSBpbnN0YW5jZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQXhpc1NlcnZpY2UgY3JlYXRlQXhpc1NlcnZpY2UoQ2xhc3Mgc2VydmljZUltcGxDbGFzcykgewotICAgICAgICByZXR1cm4gY3JlYXRlQXhpc1NlcnZpY2Uoc2VydmljZUltcGxDbGFzcywgbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBwcm92aWRlIHZlcnkgY29udmVuaWVudCB3YXkgb2YgY3JlYXRpbmcgYW4gQXhpc1NlcnZpY2UgZnJvbSBhbiBhbm5vdGF0ZWQgamF2YSBjbGFzcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzZXJ2aWNlSW1wbENsYXNzIEEgV2ViIFNlcnZpY2UgaW1wbGVtZW50YXRpb24gY2xhc3MgKGkuZS4gb25lIHRoYXQgY2FycmllcyBhbgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlNlcnZpY2Ugb3IgV2ViU2VydmljZVByb3ZpZGVyIGFubm90YXRpb24pLgotICAgICAqIEByZXR1cm4gQW4gQXhpc1NlcnZpY2UgaW5zdGFuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEF4aXNTZXJ2aWNlIGNyZWF0ZUF4aXNTZXJ2aWNlKENsYXNzIHNlcnZpY2VJbXBsQ2xhc3MsIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQpIHsKLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNlcnZpY2VEZXNjcmlwdGlvbiA9IERlc2NyaXB0aW9uRmFjdG9yeUltcGwuY3JlYXRlU2VydmljZURlc2NyaXB0aW9uKHNlcnZpY2VJbXBsQ2xhc3MsIGNvbmZpZ0NvbnRleHQpOwotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uW10gZWRBcnJheSA9IHNlcnZpY2VEZXNjcmlwdGlvbi5nZXRFbmRwb2ludERlc2NyaXB0aW9ucygpOwotICAgICAgICBBeGlzU2VydmljZSBheGlzU2VydmljZSA9IGVkQXJyYXlbMF0uZ2V0QXhpc1NlcnZpY2UoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEpBWFdTUklXU0RMR2VuZXJhdG9yIHZhbHVlID0gbmV3IEpBWFdTUklXU0RMR2VuZXJhdG9yKGF4aXNTZXJ2aWNlKTsKLSAgICAgICAgICAgIGF4aXNTZXJ2aWNlLmFkZFBhcmFtZXRlcigiV1NETFN1cHBsaWVyIiwgdmFsdWUpOwotICAgICAgICAgICAgYXhpc1NlcnZpY2UuYWRkUGFyYW1ldGVyKCJTY2hlbWFTdXBwbGllciIsIHZhbHVlKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBsb2cuaW5mbygiVW5hYmxlIHRvIHNldCB0aGUgV1NETFN1cHBsaWVyIiwgZXgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBheGlzU2VydmljZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIENsaWVudCBDb25maWd1cmF0aW9uRmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSBBeGlzQ29uZmlndXJhdGlvbi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gQSBDbGllbnQgQ29uZmlndXJhdGlvbiBGYWN0b3J5J3MgbmV3IGluc3RhbmNlLiBDbGluZXRDb25maWd1cmF0aW9uRmFjdG9yeSBpcwotICAgICAqICAgICAgICAgU2luZ2xldG9uLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQ2xpZW50Q29uZmlndXJhdGlvbkZhY3RvcnkgY3JlYXRlQ2xpZW50Q29uZmlndXJhdGlvbkZhY3RvcnkoKSB7Ci0gICAgICAgIHJldHVybiBEZXNjcmlwdGlvbkZhY3RvcnlJbXBsLmdldENsaWVudENvbmZpZ3VyYXRpb25GYWN0b3J5KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgUmVzb2x2ZWRIYW5kbGVyc0Rlc2NyaXB0aW9uIG9iamVjdCwgd2hpY2ggZGVzY3JpYmVzIGF0dHJpYnV0ZXMgb2YgaGFuZGxlcnMKLSAgICAgKiB0aGF0IGhhdmUgYmVlbiByZXNvbHZlZCBmb3IgYSBnaXZlIHBvcnQuICBUaGlzIGluY2x1ZGVzIHRoZSBoYW5kbGVyIGNsYXNzZXMgYW5kIHRoZSByb2xlcy4KLSAgICAgKiBAcmV0dXJuIEEgbmV3IGluc3RhbmNlIG9mIGEgUmVzb2xmZWRIYW5kbGVyc0Rlc2NyaXB0aW9uIG9iamVjdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFJlc29sdmVkSGFuZGxlcnNEZXNjcmlwdGlvbiBjcmVhdGVSZXNvbHZlZEhhbmRsZXJzRGVzY3JpcHRpb24oKSB7Ci0gICAgICAgIHJldHVybiBEZXNjcmlwdGlvbkZhY3RvcnlJbXBsLmNyZWF0ZVJlc29sdmVkSGFuZGxlcnNEZXNjcmlwdGlvbigpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL0Rlc2NyaXB0aW9uS2V5LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9EZXNjcmlwdGlvbktleS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYmE5ZjM4Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL0Rlc2NyaXB0aW9uS2V5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuRXhjZXB0aW9uRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1wdWJsaWMgY2xhc3MgRGVzY3JpcHRpb25LZXkgewotCi0gICAgcHJpdmF0ZSBRTmFtZSBzZXJ2aWNlTmFtZSA9IG51bGw7Ci0KLSAgICBwcml2YXRlIFVSTCB3c2RsVXJsID0gbnVsbDsKLQotICAgIHByaXZhdGUgQ2xhc3Mgc2VydmljZUNsYXNzID0gbnVsbDsKLQotICAgIHByaXZhdGUgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ29udGV4dCA9IG51bGw7Ci0KLSAgICBwdWJsaWMgRGVzY3JpcHRpb25LZXkoUU5hbWUgc2VydmljZU5hbWUsIFVSTCB3c2RsVXJsLCBDbGFzcyBzZXJ2aWNlQ2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgdGhpcy5zZXJ2aWNlTmFtZSA9IHNlcnZpY2VOYW1lOwotICAgICAgICB0aGlzLndzZGxVcmwgPSB3c2RsVXJsOwotICAgICAgICB0aGlzLnNlcnZpY2VDbGFzcyA9IHNlcnZpY2VDbGFzczsKLSAgICAgICAgdGhpcy5jb25maWdDb250ZXh0ID0gY29uZmlnQ29udGV4dDsKLQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotICAgICAgICBpZiAodGhpcyA9PSBvKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBEZXNjcmlwdGlvbktleSkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIERlc2NyaXB0aW9uS2V5IGRlc2NyaXB0aW9uID0gKERlc2NyaXB0aW9uS2V5KW87Ci0KLSAgICAgICAgaWYgKHNlcnZpY2VOYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkKLSAgICAgICAgICAgICAgICAgICAgLm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKG9yZy5hcGFjaGUuYXhpczIuaTE4bi5NZXNzYWdlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRNZXNzYWdlKCJEZXNjcmlwdGlvblJlZ2lzdHJ5RXJyMCIpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBkZXNjcmlwdGlvbi5zZXJ2aWNlTmFtZS5lcXVhbHModGhpcy5zZXJ2aWNlTmFtZSkKLSAgICAgICAgICAgICAgICAmJiBkZXNjcmlwdGlvbi53c2RsVXJsICE9IG51bGwgPyBkZXNjcmlwdGlvbi53c2RsVXJsLmVxdWFscyh0aGlzLndzZGxVcmwpIDoKLSAgICAgICAgICAgICAgICB0aGlzLndzZGxVcmwgPT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAgICAgJiYgZGVzY3JpcHRpb24uc2VydmljZUNsYXNzID09IHRoaXMuc2VydmljZUNsYXNzCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBkZXNjcmlwdGlvbi5jb25maWdDb250ZXh0ID09IHRoaXMuY29uZmlnQ29udGV4dDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCi0gICAgICAgIGludCBoYXNoID0gMTsKLSAgICAgICAgaGFzaCA9IDMxICogaGFzaCArICgoc2VydmljZU5hbWUgPT0gbnVsbCkgPyAwIDogc2VydmljZU5hbWUuaGFzaENvZGUoKSk7Ci0gICAgICAgIGhhc2ggPSBoYXNoICsgKCh3c2RsVXJsID09IG51bGwpID8gMCA6IHdzZGxVcmwuaGFzaENvZGUoKSk7Ci0gICAgICAgIGhhc2ggPSBoYXNoICsgKChzZXJ2aWNlQ2xhc3MgPT0gbnVsbCkgPyAwIDogc2VydmljZUNsYXNzLmhhc2hDb2RlKCkpOwotICAgICAgICBoYXNoID0gaGFzaCArICgoY29uZmlnQ29udGV4dCA9PSBudWxsKSA/IDAgOiBjb25maWdDb250ZXh0Lmhhc2hDb2RlKCkpOwotICAgICAgICByZXR1cm4gaGFzaDsKLQotICAgIH0KLQotICAgIHB1YmxpYyBDb25maWd1cmF0aW9uQ29udGV4dCBnZXRDb25maWdDb250ZXh0KCkgewotICAgICAgICByZXR1cm4gY29uZmlnQ29udGV4dDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb25maWdDb250ZXh0KENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQpIHsKLSAgICAgICAgdGhpcy5jb25maWdDb250ZXh0ID0gY29uZmlnQ29udGV4dDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUU5hbWUgZ2V0U2VydmljZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBzZXJ2aWNlTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlTmFtZShRTmFtZSBzZXJ2aWNlTmFtZSkgewotICAgICAgICB0aGlzLnNlcnZpY2VOYW1lID0gc2VydmljZU5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFVSTCBnZXRXc2RsVXJsKCkgewotICAgICAgICByZXR1cm4gd3NkbFVybDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRXc2RsVXJsKFVSTCB3c2RsVXJsKSB7Ci0gICAgICAgIHRoaXMud3NkbFVybCA9IHdzZGxVcmw7Ci0gICAgfQotCi0gICAgcHVibGljIENsYXNzIGdldFNlcnZpY2VDbGFzcygpIHsKLSAgICAgICAgcmV0dXJuIHNlcnZpY2VDbGFzczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlQ2xhc3MoQ2xhc3Mgc2VydmljZUNsYXNzKSB7Ci0gICAgICAgIHRoaXMuc2VydmljZUNsYXNzID0gc2VydmljZUNsYXNzOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgcHJpbnRLZXkoKSB7Ci0KLSAgICAgICAgU3RyaW5nIHNOYW1lID0gKHNlcnZpY2VOYW1lICE9IG51bGwpID8gc2VydmljZU5hbWUudG9TdHJpbmcoKSA6ICIiOwotICAgICAgICBTdHJpbmcgc1dzZGxVUkwgPSAod3NkbFVybCAhPSBudWxsKSA/IHdzZGxVcmwudG9TdHJpbmcoKSA6ICIiOwotICAgICAgICBTdHJpbmcgc0NsYXNzID0gKHNlcnZpY2VDbGFzcyAhPSBudWxsKSA/IHNlcnZpY2VDbGFzcy50b1N0cmluZygpIDogIiI7Ci0gICAgICAgIFN0cmluZyBzQ29uZmlnID0gKGNvbmZpZ0NvbnRleHQgIT0gbnVsbCkgPyBjb25maWdDb250ZXh0LnRvU3RyaW5nKCkKLSAgICAgICAgICAgICAgICA6ICIiOwotICAgICAgICBTdHJpbmcga2V5ID0gc05hbWUgKyBzV3NkbFVSTCArIHNDbGFzcyArIHNDb25maWc7Ci0gICAgICAgIHJldHVybiBrZXk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vRW5kcG9pbnREZXNjcmlwdGlvbi5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vRW5kcG9pbnREZXNjcmlwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGVjOTY0Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL0VuZHBvaW50RGVzY3JpcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50LlNlcnZpY2VDbGllbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24ueG1sLmhhbmRsZXIuSGFuZGxlckNoYWluc1R5cGU7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlOwotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLlBvcnRJbmZvOwotaW1wb3J0IGphdmF4LnhtbC53cy5zb2FwLlNPQVBCaW5kaW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogQW4gRW5kcG9pbnREZXNjcmlwdGlvbiBjb3JyZXNwb25kcyB0byBhIHBhcnRpY3VsYXIgU2VydmljZSBJbXBsZW1lbnRhdGlvbi4gSXQgY2FuIGNvcnJlc3BvbmQgdG8KLSAqIGVpdGhlciBlaXRoZXIgYSBjbGllbnQgdG8gdGhhdCBpbXBsIG9yIHRoZSBhY3R1YWwgc2VydmljZSBpbXBsLgotICogPHAvPgotICogVGhlIEVuZHBvaW50RGVzY3JpcHRpb24gY29udGFpbnMgaW5mb3JtYXRpb24gdGhhdCBpcyByZWxldmFudCB0byBib3RoIGEgUHJvdmlkZXItYmFzZWQgYW5kCi0gKiBTRUktYmFzZWQgKGFrYSBFbmRwb2ludC1iYXNlZCBvciBKYXZhLWJhc2VkKSBlbnBkb2ludHMuIFNFSS1iYXNlZCBlbmRwb2ludHMgKHdoZXRoZXIgdGhleSBoYXZlIGFuCi0gKiBleHBsaWNpdCBvciBpbXBsY2l0IFNFSSkgd2lsbCBoYXZlIGFkZHRpb25hbCBtZXRhZGF0YSBpbmZvcm1hdGlvbiBpbiBhbgotICogRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiBjbGFzcyBhbmQgc3ViLWhpZXJhY2h5OyBQcm92aWRlci1iYXNlZCBlbmRwb2l0bnMgZG8gbm90IGhhdmUgc3VjaCBhCi0gKiBoaWVyYWNoeS4KLSAqIDxwLz4KLSAqIDxwcmU+Ci0gKiA8Yj5FbmRwb2ludERlc2NyaXB0aW9uIGRldGFpbHM8L2I+Ci0gKiA8cC8+Ci0gKiAgICAgQ09SUkVTUE9ORFMgVE86ICAgICAgVGhlIGVuZHBvaW50IChib3RoIENsaWVudCBhbmQgU2VydmVyKQotICogPHAvPgotICogICAgIEFYSVMyIERFTEVHQVRFOiAgICAgIEF4aXNTZXJ2aWNlCi0gKiA8cC8+Ci0gKiAgICAgQ0hJTERSRU46ICAgICAgICAgICAgMC4uMSBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uCi0gKiA8cC8+Ci0gKiAgICAgQU5OT1RBVElPTlM6Ci0gKiAgICAgICAgIFdlYlNlcnZpY2UgWzE4MV0KLSAqICAgICAgICAgV2ViU2VydmljZVByb3ZpZGVyIFsyMjRdCi0gKiAgICAgICAgICAgICBTZXJ2aWNNb2RlIFsyMjRdCi0gKiAgICAgICAgIEJpbmRpbmdUeXBlIFsyMjRdCi0gKiA8cC8+Ci0gKiAgICAgV1NETCBFTEVNRU5UUzoKLSAqICAgICAgICAgcG9ydAotICogPHAvPgotICogIDwvcHJlPgotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgRW5kcG9pbnREZXNjcmlwdGlvbiB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBWElTX1NFUlZJQ0VfUEFSQU1FVEVSID0KLSAgICAgICAgICAgICJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkVuZHBvaW50RGVzY3JpcHRpb24iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfQ0xJRU5UX0JJTkRJTkdfSUQgPSBTT0FQQmluZGluZy5TT0FQMTFIVFRQX0JJTkRJTkc7Ci0KLSAgICAvKioKLSAgICAgKiBQYXJhbWF0ZXIgc2V0IG9uIEF4aXNTZXJ2aWNlIHdoaWNoIGNvbnRhaW5zIGFuIEFycmF5TGlzdCBvZiBTT0FQIGhlYWRlciBRTmFtZXMKLSAgICAgKiBvZiBTT0FQSGFuZGxlcnMuIAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhBTkRMRVJfUEFSQU1FVEVSX1FOQU1FUyA9ICJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkVuZHBvaW50RGVzY3JpcHRpb24uaGFuZGxlclBhcmFtZXRlclFOYW1lcyI7Ci0gICAgICAgIAotICAgIHB1YmxpYyBhYnN0cmFjdCBBeGlzU2VydmljZSBnZXRBeGlzU2VydmljZSgpOwotCi0gICAgcHVibGljIGFic3RyYWN0IFNlcnZpY2VDbGllbnQgZ2V0U2VydmljZUNsaWVudCgpOwotCi0gICAgcHVibGljIGFic3RyYWN0IFNlcnZpY2VEZXNjcmlwdGlvbiBnZXRTZXJ2aWNlRGVzY3JpcHRpb24oKTsKLQotICAgIHB1YmxpYyBhYnN0cmFjdCBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uIGdldEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24oKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIEpBWC1XUyBoYW5kbGVyIFBvcnRJbmZvIG9iamVjdCBmb3IgdGhpcyBlbmRwb2ludC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gUG9ydEluZm8KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgUG9ydEluZm8gZ2V0UG9ydEluZm8oKTsKLQotICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzUHJvdmlkZXJCYXNlZCgpOwotCi0gICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNFbmRwb2ludEJhc2VkKCk7Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldE5hbWUoKTsKLQotICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBiaW5kaW5nIHR5cGUgRk9SIEEgU0VSVkVSLiAgVGhpcyBpcyBiYXNlZCBvbiB0aGUgQmluZGluZ1R5cGUgYW5ub3RhdGlvbiBhbmQvb3IKLSAgICAgKiB0aGUgV1NETC4gVGhpcyB3aWxsIHJldHVybiB0aGUgZGVmYXVsdCBiaW5kaW5nIChTT0FQMTEpIGlmIG5vIGFubm90YXRpb24gd2FzIHNwZWNpZmllZCBvbiB0aGUKLSAgICAgKiBzZXJ2ZXIuIFRoaXMgc2hvdWxkIE5PVCBiZSBjYWxsZWQgb24gdGhlIGNsaWVudCBzaW5jZSBpdCB3aWxsIGFsd2F5cyByZXR1cm4gdGhlIGRlZmF1bHQKLSAgICAgKiBiaW5kaW5nLiBVc2UgZ2V0Q2xpZW50QmluZGluZ0lEKCkgb24gY2xpZW50cy4KLSAgICAgKgotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldEJpbmRpbmdUeXBlKCk7Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRIYW5kbGVyQ2hhaW4oSGFuZGxlckNoYWluc1R5cGUgaGFuZGxlckNoYWluKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIGhhbmRsZXIgY2hhaW4gY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBhcyBhIEhhbmRsZXJDaGFpbnNUeXBlIG9iamVjdC4gIElmIHRoZQotICAgICAqIGtleSBpcyBub24tbnVsbCB0aGVuIGl0IGlzIHVzZWQgdG8gbG9vayBmb3IgaGFuZGxlciBjaGFpbiBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGluIHRoZQotICAgICAqIHNwYXJzZSBtZXRhZGF0YS4gIFRoZSBvcmRlciBpbiB3aGljaCB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBpcyByZXNvbHZlZCBpczoKLSAgICAgKiAxKSBMb29rIGluIHNwYXJzZSBjb21wb3NpdGUgaWYgdGhlIGtleSBpcyBub3QgbnVsbAotICAgICAqIDIpIExvb2sgaW4gdGhlIGNvbXBvc2l0ZQotICAgICAqIDMpIExvb2sgZm9yIGEgSGFuZGxlckNoYWluIGFubm90YXRpb24gYW5kIHJlYWQgaW4gdGhlIGZpbGUgaXQgc3BlY2lmaWVzICAKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc2VydmljZURlbGVnYXRlS2V5IE1heSBiZSBudWxsLiAgSWYgbm9uLW51bGwsIHVzZWQgdG8gbG9vayBmb3Igc2VydmljZS1kZWxlZ2F0ZQotICAgICAqICAgICBzcGVjaWZpYyBzcGFyc2UgY29tcG9zaXRlIGluZm9ybWF0aW9uLgotICAgICAqIEByZXR1cm4gQSBIYW5kbGVyQ2hhaW5zVHlwZSBvYmplY3Qgb3IgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBIYW5kbGVyQ2hhaW5zVHlwZSBnZXRIYW5kbGVyQ2hhaW4oT2JqZWN0IHNlcnZpY2VEZWxlZ2F0ZUtleSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIGhhbmRsZXIgY2hhaW4gY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBhcyBhIEhhbmRsZXJDaGFpbnNUeXBlIG9iamVjdC4KLSAgICAgKiBUaGlzIGlzIHRoZSBzYW1lIGFzIGNhbGxpbmcgZ2V0SGFuZGxlckNoYWluKG51bGwpLgotICAgICAqIEBzZWUgI2dldEhhbmRsZXJDaGFpbihPYmplY3QpCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IEhhbmRsZXJDaGFpbnNUeXBlIGdldEhhbmRsZXJDaGFpbigpOwotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBiaW5kaW5nIHR5cGUgRk9SIEEgQ0xJRU5ULiAgVGhlIEJpbmRpbmdUeXBlIGFubm90YXRpb24gaXMgbm90IHZhbGlkIG9uIHRoZSBjbGllbnQgcGVyCi0gICAgICogdGhlIEpBWC1XUyBzcGVjLiAgVGhlIHZhbHVlIGNhbiBiZSBzZXQgdmlhIGFkZFBvcnQoLi4uKSBmb3IgYSBEaXNwYXRjaCBjbGllbnQgb3IgdmlhIFRCRCBmb3IKLSAgICAgKiBhIFByb3h5IGNsaWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRDbGllbnRCaW5kaW5nSUQoU3RyaW5nIGNsaWVudEJpbmRpbmdJRCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIGJpbmRpbmcgdHlwZSBGT1IgQSBDTElFTlQuICBUaGlzIHdpbGwgcmV0dXJuIHRoZSBkZWZhdWx0IGNsaWVudCBiaW5kaW5nIHR5cGUgaWYKLSAgICAgKiBjYWxsZWQgb24gdGhlIHNlcnZlci4gIFVzZSBnZXRCaW5kaW5nVHlwZSgpIG9uIHNlcnZlcnMuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFN0cmluZyByZXByZXNlbnRpbmcgdGhlIGNsaWVudCBiaW5kaW5nIHR5cGUKLSAgICAgKiBAc2VlIHNldENsaWVudEJpbmRpbmdJRCgpOwotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0Q2xpZW50QmluZGluZ0lEKCk7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRFbmRwb2ludEFkZHJlc3MoU3RyaW5nIGVuZHBvaW50QWRkcmVzcyk7Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldEVuZHBvaW50QWRkcmVzcygpOwotCi0gICAgLy9wdWJsaWMgYWJzdHJhY3QgTGlzdDxTdHJpbmc+IGdldEhhbmRsZXJMaXN0KCk7Ci0gICAgcHVibGljIGFic3RyYWN0IFFOYW1lIGdldFBvcnRRTmFtZSgpOwotCi0gICAgcHVibGljIGFic3RyYWN0IFFOYW1lIGdldFNlcnZpY2VRTmFtZSgpOwotCi0gICAgcHVibGljIGFic3RyYWN0IFNlcnZpY2UuTW9kZSBnZXRTZXJ2aWNlTW9kZSgpOwotICAgIAotICAgIC8qKgotICAgICAqIFNpZ25hbHMgd2hldGhlciBvciBub3QgTVRPTSBoYXMgYmVlbiB0dXJuZWQgb24gZm9yIHRoZSBlbmRwb2ludCAKLSAgICAgKiBiYXNlZCBvbiB0aGUgYW5ub3RhdGlvbiBjb25maWd1cmF0aW9uLgotICAgICAqIAotICAgICAqIEJvdGggdGhlIEBNVE9NIGFuZCBAQmluZGluZ1R5cGUgYXJlIGluc3BlY3RlZC4gIFRoZSBATVRPTQotICAgICAqIGFubm90YXRpb24gaXMgaW5zcGVjdGVkIGZpcnN0LiAgSWYgdGhlIEBNVE9NCi0gICAgICogYW5ub3RhdGlvbiBpcyBub3QgcHJlc2VudCwgdGhlbiB0aGUgQEJpbmRpbmdUeXBlIGlzIGluc3BlY3RlZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgYm9vbGVhbiB2YWx1ZSAKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc01UT01FbmFibGVkKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogSWYgTVRPTSBpcyBlbmFibGVkLCByZXR1cm5zIHRoZSB0aHJlc2hvbGQgdmFsdWUuCi0gICAgICogCi0gICAgICogQHJldHVybiAtMSBpZiBNVE9NIGlzIG5vdCBlbmFibGVkLCBhIHBvc2l0aXZlIGludGVnZXIgdmFsdWUgaWYgCi0gICAgICogb25lIHdhcyBjb25maWd1cmVkLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0TVRPTVRocmVzaG9sZCgpOwotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgY29udGVudHMgb2YgdGhlIDxjb2RlPiZsdDt3c2RsOmJpbmRpbmcmZ3Q7PC9jb2RlPiBtdXN0IGJlIAotICAgICAqIHN0cmljdGx5IHJlc3BlY3RlZCBieSB0aGUgcnVudGltZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgYm9vbGVhbiB2YWx1ZQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHJlc3BlY3RCaW5kaW5nKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogSW5kaWNhdGUgd2hldGhlciBvciBub3Qgc3RyaWN0IGJpbmRpbmcgc3VwcG9ydCBzaG91bGQgYmUgdXNlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRSZXNwZWN0QmluZGluZyhib29sZWFuIHJlc3BlY3QpOwotICAgIAotICAgIC8qKgotICAgICAqIEFkZHMgdGhlIFFOYW1lIHRvIGEgbGlzdCBvZiBiaW5kaW5nIHR5cGVzIHRoYXQgYXJlIHJlcXVpcmVkIHRvIGJlCi0gICAgICogc3VwcG9ydGVkIGJ5IHRoZSBlbmRwb2ludCBhcyBkZWZpbmVkIGluIHRoZSBXU0RMLgotICAgICAqIAotICAgICAqIEBwYXJhbSBuYW1lCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGFkZFJlcXVpcmVkQmluZGluZyhRTmFtZSBuYW1lKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBhbGwga25vd24gYmluZGluZ3MgdGhhdCBzaG91bGQgYmUgc3VwcG9ydGVkIGJhc2VkCi0gICAgICogb24gdGhlIGluZm9ybWF0aW9uIGluIHRoZSBXU0RMLgotICAgICAqIAotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdCBnZXRSZXF1aXJlZEJpbmRpbmdzKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUsIGlmIGFueSwgdXNlZCB0byBidWlsZCB0aGlzIHNlcnZpY2UgZGVzY3JpcHRpb24uCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgZ2V0RGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBPYmplY3QgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgcHJvcGVydHkga2V5IHN1cHBsaWVkLgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIGtleSk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogU3RvcmUgdGhlIHByb3BlcnR5IGJ5IHRoZSBrZXkgc3BlY2lmaWVkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBrZXksIE9iamVjdCB2YWx1ZSk7Ci0gICAgCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vRW5kcG9pbnREZXNjcmlwdGlvbkphdmEuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL0VuZHBvaW50RGVzY3JpcHRpb25KYXZhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiNTY3MTIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vRW5kcG9pbnREZXNjcmlwdGlvbkphdmEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbjsKLQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOwotaW1wb3J0IGphdmF4LnhtbC53cy5CaW5kaW5nVHlwZTsKLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsKLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZU1vZGU7Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VQcm92aWRlcjsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVuZHBvaW50RGVzY3JpcHRpb25KYXZhIHsKLQotICAgIHB1YmxpYyBXZWJTZXJ2aWNlIGdldEFubm9XZWJTZXJ2aWNlKCk7Ci0KLSAgICBwdWJsaWMgV2ViU2VydmljZVByb3ZpZGVyIGdldEFubm9XZWJTZXJ2aWNlUHJvdmlkZXIoKTsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QW5ub1dlYlNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpOwotCi0gICAgcHVibGljIFN0cmluZyBnZXRBbm5vV2ViU2VydmljZU5hbWUoKTsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QW5ub1dlYlNlcnZpY2VQb3J0TmFtZSgpOwotCi0gICAgcHVibGljIFN0cmluZyBnZXRBbm5vV2ViU2VydmljZVNlcnZpY2VOYW1lKCk7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEFubm9XZWJTZXJ2aWNlVGFyZ2V0TmFtZXNwYWNlKCk7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEFubm9XZWJTZXJ2aWNlV1NETExvY2F0aW9uKCk7Ci0KLSAgICBwdWJsaWMgQmluZGluZ1R5cGUgZ2V0QW5ub0JpbmRpbmdUeXBlKCk7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEFubm9CaW5kaW5nVHlwZVZhbHVlKCk7Ci0KLSAgICBwdWJsaWMgU2VydmljZU1vZGUgZ2V0QW5ub1NlcnZpY2VNb2RlKCk7Ci0KLSAgICBwdWJsaWMgU2VydmljZS5Nb2RlIGdldEFubm9TZXJ2aWNlTW9kZVZhbHVlKCk7Ci0gICAgCi0gICAgcHVibGljIEFubm90YXRpb24gZ2V0QW5ub0ZlYXR1cmUoU3RyaW5nIGlkKTsKLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL0VuZHBvaW50RGVzY3JpcHRpb25XU0RMLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9FbmRwb2ludERlc2NyaXB0aW9uV1NETC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDljZmY3Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL0VuZHBvaW50RGVzY3JpcHRpb25XU0RMLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnV0aWwuQ29uc3RhbnRzOwotCi1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nOwotaW1wb3J0IGphdmF4LndzZGwuUG9ydDsKLWltcG9ydCBqYXZheC53c2RsLlNlcnZpY2U7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBFbmRwb2ludERlc2NyaXB0aW9uV1NETCB7Ci0gICAgLyoqCi0gICAgICogU3RyaW5ncyByZXByZXNlbnRpbmcgdGhlIFNPQVAgQmluZGluZy4gIFRoZXNlIGNvcnJlc3BvbmQgdG8gdGhlIG5hbWVzcGFjZSBvZiB0aGUgYmluZGluZwotICAgICAqIGV4dGVuc2liaWxpdHkgZWxlbWVudCB1bmRlciB0aGUgV1NETCBiaW5kaW5nLiAgVGhpcyBjb3VsZCBiZSBTT0FQIG9yIEhUVFAKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTT0FQMTFfV1NETF9CSU5ESU5HID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNPQVAxMl9XU0RMX0JJTkRJTkcgPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwMTIvIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQX1dTRExfQklORElORyA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL2h0dHAvIjsKLSAgICAvKiogUU5hbWVzIGZvciB0aGUgU09BUCBhZGRyZXNzIGV4dGVuc2libGl0eSBlbGVtZW50IHVuZGVyIHRoZSBXU0RMIFBvcnQgZWxlbWVudCAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgU09BUF8xMV9BRERSRVNTX0VMRU1FTlQgPQotICAgICAgICAgICAgbmV3IFFOYW1lKENvbnN0YW50cy5VUklfV1NETF9TT0FQMTEsICJhZGRyZXNzIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBTT0FQXzEyX0FERFJFU1NfRUxFTUVOVCA9Ci0gICAgICAgICAgICBuZXcgUU5hbWUoQ29uc3RhbnRzLlVSSV9XU0RMX1NPQVAxMiwgImFkZHJlc3MiKTsKLQotICAgIHB1YmxpYyBTZXJ2aWNlIGdldFdTRExTZXJ2aWNlKCk7Ci0KLSAgICBwdWJsaWMgUG9ydCBnZXRXU0RMUG9ydCgpOwotCi0gICAgcHVibGljIEJpbmRpbmcgZ2V0V1NETEJpbmRpbmcoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG5hbWVzcGFjZSBmb3IgdGhlIHNwZWNpZmljIHdzZGw6YmluZGluZyBleHRlbnNpYmlsaXR5IGVsZW1lbnQuIFR5cGljYWxseSwgdGhpcyBpcwotICAgICAqIHRoZSA8c29hcDpiaW5kaW5nPiBlbGVtZW50IHRoYXQgZGVmaW5lcyBlaXRoZXIgYSBTT0FQIDEuMSBvciBhIFNPQVAgMS4yIGJpbmRpbmcuCi0gICAgICogCi0gICAgICogSU1QT1JUQU5UIE5PVEU6IFRoZSB2YWx1ZSByZXR1cm5lZCBpcyBjb252ZXJ0ZWQgZnJvbSB0aGUgV1NETCBCaW5kaW5nIHR5cGUgKHdoaWNoIGlzIHRoZQotICAgICAqIG5hbWVzcGFjZSBvbiB0aGUgYXNzb2NhaXRlZCBiaW5kaW5nIGV4dGVuc2liaWxpdHkgZWxlbWVudCkgdG8gdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUKLSAgICAgKiBmb3IgdGhlIFNPQVBCaW5kaW5nIGFubm90YXRpb24uICBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBTT0FQMTIgV1NETAotICAgICAqICAgICAuLi4KLSAgICAgKiAgICAgeG1sbnM6c29hcDEyPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAxMi8iCi0gICAgICogICAgIC4uLiAgCi0gICAgICogICAgIDx3c2RsOmJpbmRpbmcgLi4uPgotICAgICAqICAgICAgIDxzb2FwMTI6YmluZGluZyAuLi4+Ci0gICAgICogCi0gICAgICogV291bGQgcmV0dXJuIHRoZSB2YWx1ZSBqYXZheC54bWwud3Muc29hcC5TT0FQQmluZGluZy5TT0FQMTJIVFRQX0JJTkRJTkcgd2hpY2ggaXMKLSAgICAgKiAgICAgImh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC9iaW5kaW5ncy9IVFRQLyIKLSAgICAgKgotICAgICAqIEByZXR1cm4gU3RyaW5nIGNvbnN0YW50cyBkZWZpbmVkIGluIGphdmF4LnhtbC53cy5zb2FwLlNPQVBCaW5kaW5nCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRXU0RMQmluZGluZ1R5cGUoKTsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0V1NETFNPQVBBZGRyZXNzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBJcyB0aGUgV1NETCBkZWZpbml0aW9uIGZ1bGx5IHNwZWNpZmllZCBmb3IgdGhlIGVuZHBvaW50IChXU0RMIDEuMSBwb3J0KSByZXByZXNlbnRlZCBieSB0aGlzCi0gICAgICogRW5kcG9pbnREZXNjcmlwdGlvbi4gIElmIHRoZSBXU0RMIGlzIFBhcnRpYWwsIHRoYXQgbWVhbnMgdGhlIEVuZHBvaW50IGNvdWxkIG5vdCBiZSBjcmVhdGVkCi0gICAgICogd2l0aCB0aGUgaW5mb21hdGlvbiBjb250YWluZWQgaW4gdGhlIFdTREwgZmlsZSwgYW5kIGFubm90YXRpb25zIHdlcmUgdXNlZC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgV1NETCB3YXMgZnVsbHkgc3BlY2lmaWVkOyBmYWxzZSBpZiBpdCB3YXMgcGFydGlhbCBXU0RMCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNXU0RMRnVsbHlTcGVjaWZpZWQoKTsKLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbi5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODdlMDU1Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL0VuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb247Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLQotLyoqCi0gKiBBbiBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uIGNvcnJlc3BvbmRzIHRvIGEgcGFydGljdWxhciBTRUktYmFzZWQgU2VydmljZSBJbXBsZW1lbnRhdGlvbi4gSXQKLSAqIGNhbiBjb3JyZXNwb25kIHRvIGVpdGhlciBlaXRoZXIgYSBjbGllbnQgdG8gdGhhdCBpbXBsIG9yIHRoZSBhY3R1YWwgc2VydmljZSBpbXBsLgotICogPHAvPgotICogVGhlIEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24gY29udGFpbnMgaW5mb3JtYXRpb24gdGhhdCBpcyByZWxldmFudCBvbmx5IHRvIGFuIFNFSS1iYXNlZCAoYWthCi0gKiBFbmRwb2ludC1iYXNlZCBvciBKYXZhLWJhc2VkKSBlbnBkb2ludDsgUHJvdmlkZXItYmFzZWQgZW5kcG9pbnQsIHdoaWNoIGFyZSBub3Qgb3BlcmF0aW9uIGJhc2VkCi0gKiBhbmQgZG8gbm90IGhhdmUgYW4gYXNzb2NpYXRlZCBTRUksIHdpbGwgbm90IGhhdmUgYW4gYW4gRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiBjbGFzcyBhbmQKLSAqIHN1Yi1oaWVyYWNoeS4KLSAqIDxwLz4KLSAqIDxwcmU+Ci0gKiA8Yj5FbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uIGRldGFpbHM8L2I+Ci0gKiA8cC8+Ci0gKiAgICAgQ09SUkVTUE9ORFMgVE86ICAgICAgQW4gU0VJIChvbiBib3RoIENsaWVudCBhbmQgU2VydmVyKQotICogPHAvPgotICogICAgIEFYSVMyIERFTEVHQVRFOiAgICAgIG5vbmUKLSAqIDxwLz4KLSAqICAgICBDSElMRFJFTjogICAgICAgICAgICAxLi5uIE9wZXJhdGlvbkRlc2NyaXB0aW9uCi0gKiA8cC8+Ci0gKiAgICAgQU5OT1RBVElPTlM6Ci0gKiAgICAgICAgIFNPQVBCaW5kaW5nIFsxODFdCi0gKiA8cC8+Ci0gKiAgICAgV1NETCBFTEVNRU5UUzoKLSAqICAgICAgICAgcG9ydFR5cGUKLSAqIDxwLz4KLSAqICA8L3ByZT4KLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24gewotICAgIAotICAgIC8qKgotICAgICAqIFRoZSBuYW1lIG9mIGEgc3BlY2lhbCBvcGVyYXRpb24gYWRkZWQgdG8gRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbnMgZm9yIHByb3ZpZGVyIAotICAgICAqIGVuZHBvaW50cyB0aGF0IGRvIG5vdCBzcGVjaWZ5IFdTREwsIGFuZCB0aGVyZWZvcmUgZG8gbm90IGhhdmUgc3BlY2lmaWMgV1NETCBvcGVyYXRpb25zCi0gICAgICogY3JlYXRlZC4gTm90ZSB0aGF0IHRoaXMgaXMgY3VycmVudGx5IG9ubHkgc3VwcG9ydGVkIGZvciBIVFRQIGJpbmRpbmdzLCBub3QgZm9yIFNPQVAgYmluZGluZ3MuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFYV1NfTk9XU0RMX1BST1ZJREVSX09QRVJBVElPTl9OQU1FID0gImpheHdzTm9XU0RMUHJvdmlkZXJPcGVyYXRpb24iOwotCi0gICAgcHVibGljIGFic3RyYWN0IEVuZHBvaW50RGVzY3JpcHRpb24gZ2V0RW5kcG9pbnREZXNjcmlwdGlvbigpOwotCi0gICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRUYXJnZXROYW1lc3BhY2UoKTsKLQotICAgIHB1YmxpYyBhYnN0cmFjdCBPcGVyYXRpb25EZXNjcmlwdGlvbiBnZXRPcGVyYXRpb24oTWV0aG9kIHNlaU1ldGhvZCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFsbCB0aGUgb3BlcmF0aW9ucyBtYXRjaGluZyB0aGUgb3BlcmF0aW9uIFFOYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGVuZHBvaW50Ci0gICAgICogZGVzY3JpcHRpb24uIE5vdGUgdGhhdCBpZiB0aGUgU0VJIG9yIHNlcnZpY2UgaW1wbGVtZW50YXRpb24gKGFuZCB0aHVzIHRoZSBpbXBsaWNpdCBTRUkpCi0gICAgICogY29udGFpbmVkIEpBWC1XUyBjbGllbnQgc2lkZSBhc3luYyBvcGVyYXRpb25zIHRoZW4gdGhleSB3aWxsIGFsc28gYmUgcmV0dXJuZWQuIFVzZQotICAgICAqIGdldERpc3BhdGNoYWJsZU9wZXJhdGlvbnMoKSB0byByZXR1cm4gYW4gYXJyYXkgb2Ygb3BlcmF0aW9ucyB0aGF0IGRvZXMgbm90IGluY2x1ZGUgdGhlIEpBWC1XUwotICAgICAqIGNsaWVudCBzaWRlIGFzeW5jIG9wZXJhdGlvbnMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb3BlcmF0aW9uUU5hbWUKLSAgICAgKiBAcmV0dXJuCi0gICAgICogQHNlZSAjZ2V0RGlzcGF0Y2hhYmxlT3BlcmF0aW9uKFFOYW1lIG9wZXJhdGlvblFOYW1lKQotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBPcGVyYXRpb25EZXNjcmlwdGlvbltdIGdldE9wZXJhdGlvbihRTmFtZSBvcGVyYXRpb25RTmFtZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFsbCB0aGUgZGlzcGF0Y2hhYmxlIG9wZXJhdGlvbnMgbWF0Y2hpbmcgdGhlIG9wZXJhdGlvbiBRTmFtZS4gIEEgZGlzcGF0Y2hhYmxlCi0gICAgICogb3BlcmF0aW9uIGlzIG9uZSB0aGF0IGlzIE5PVCBhIEpBWC1XUyBjbGllbnQtc2lkZSBhc3luYyBtZXRob2QgaW52b2NhdGlvbiBhbmQgZG9lcyBOT1QKLSAgICAgKiBjYXJyeSBhbiBAV2ViTWV0aG9kKGV4Y2x1ZGU9dHJ1ZSkgYW5ub3RhdGlvbi4KLSAgICAgKiAKLSAgICAgKiBKQVgtV1MgY2xpZW50LXNpZGUgYXN5bmMgbWV0aG9kcyB3aGljaCBoYXZlIHNpZ25hdHVyZXMgb2YgdGhlIGZvbGxvd2luZyBmb3JtcyBhcmUgCi0gICAgICogZmlsdGVyZWQgb3V0IG9mIHRoaXMgbGlzdDogamF2YXgueG1sLndzLlJlc3BvbnNlPFQ+Ci0gICAgICogbWV0aG9kKC4uLikgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlPD8+IG1ldGhvZCguLi4sIGphdmF4LnhtbC53cy5Bc3luY0hhbmRsZXI8VD4pCi0gICAgICogPHAvPgotICAgICAqIFRoZXNlIG1ldGhvZHMgYXJlIGZpbHRlcmVkIGJlY2F1c2UgYSBjb21tb24gdXNlIGNhc2UgaXMgdG8gdXNlIHRoZSBzYW1lIFNFSSBvbiBib3RoIHRoZQotICAgICAqIGNsaWVudCBhbmQgc2VydmljZSBpbXBsZW1lbnRhdGlvbiBzaWRlLCBnZW5lcmF0aW5nIGJvdGggdGhlIGNsaWVudCBhbmQgc2VydmljZSBpbXBsZW1udGF0aW9uCi0gICAgICogY29kZSBmcm9tIHRoYXQgU0VJLiAgSWYgdGhhdCBTRUkgaGFwcGVucyB0byBjb250YWluIHRoZSBjbGllbnQtc2lkZS1vbmx5IEpBWC1XUyBtZXRob2RzLCB0aGV5Ci0gICAgICogc2hvdWxkIGJlIGluZ29yZWQgb24gdGhlIHNlcnZpY2UgaW1wbGVtZW5hdGlvbiBzaWRlLiAgVG8gcmV0dXJuIGFsbCB0aGUgb3BlcmF0aW9ucywgdXNlCi0gICAgICogZ2V0T3BlcmF0aW9uKFFOYW1lKS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvcGVyYXRpb25RTmFtZQotICAgICAqIEByZXR1cm4KLSAgICAgKiBAc2VlICNnZXRPcGVyYXRpb24oUU5hbWUgb3BlcmF0aW9uUU5hbWUpCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IE9wZXJhdGlvbkRlc2NyaXB0aW9uW10gZ2V0RGlzcGF0Y2hhYmxlT3BlcmF0aW9uKFFOYW1lIG9wZXJhdGlvblFOYW1lKTsKLSAgICBwdWJsaWMgYWJzdHJhY3QgT3BlcmF0aW9uRGVzY3JpcHRpb25bXSBnZXREaXNwYXRjaGFibGVPcGVyYXRpb25zKCk7Ci0gICAgcHVibGljIGFic3RyYWN0IE9wZXJhdGlvbkRlc2NyaXB0aW9uIGdldE9wZXJhdGlvbihTdHJpbmcgb3BlcmF0aW9uTmFtZSk7Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgT3BlcmF0aW9uRGVzY3JpcHRpb25bXSBnZXRPcGVyYXRpb25zKCk7Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgT3BlcmF0aW9uRGVzY3JpcHRpb25bXSBnZXRPcGVyYXRpb25Gb3JKYXZhTWV0aG9kKFN0cmluZyBqYXZhTWV0aG9kTmFtZSk7Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgQ2xhc3MgZ2V0U0VJQ2xhc3MoKTsKLQotICAgIHB1YmxpYyBhYnN0cmFjdCBRTmFtZSBnZXRQb3J0VHlwZSgpOwotCi0gICAgcHVibGljIGFic3RyYWN0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlBhcmFtZXRlclN0eWxlIGdldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKTsKLQotICAgIHB1YmxpYyBhYnN0cmFjdCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5TdHlsZSBnZXRTb2FwQmluZGluZ1N0eWxlKCk7Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuVXNlIGdldFNvYXBCaW5kaW5nVXNlKCk7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9FbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uSmF2YS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbkphdmEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJhNWVkMC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9FbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uSmF2YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uOwotCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7Ci1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmc7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbkphdmEgewotICAgIHB1YmxpYyBhYnN0cmFjdCBXZWJTZXJ2aWNlIGdldEFubm9XZWJTZXJ2aWNlKCk7Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldEFubm9XZWJTZXJ2aWNlVGFyZ2V0TmFtZXNwYWNlKCk7Ci0KLSAgICBwdWJsaWMgU09BUEJpbmRpbmcgZ2V0QW5ub1NvYXBCaW5kaW5nKCk7Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuUGFyYW1ldGVyU3R5bGUgZ2V0QW5ub1NvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKTsKLQotICAgIHB1YmxpYyBhYnN0cmFjdCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5TdHlsZSBnZXRBbm5vU29hcEJpbmRpbmdTdHlsZSgpOwotCi0gICAgcHVibGljIGFic3RyYWN0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlVzZSBnZXRBbm5vU29hcEJpbmRpbmdVc2UoKTsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL0VuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb25XU0RMLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9FbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uV1NETC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmNkYjQ5Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL0VuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb25XU0RMLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb247Ci0KLWltcG9ydCBqYXZheC53c2RsLlBvcnRUeXBlOwotCi1wdWJsaWMgaW50ZXJmYWNlIEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb25XU0RMIHsKLQotICAgIHB1YmxpYyBQb3J0VHlwZSBnZXRXU0RMUG9ydFR5cGUoKTsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL0ZhdWx0RGVzY3JpcHRpb24uamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL0ZhdWx0RGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU3ZTdiMi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9GYXVsdERlc2NyaXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbjsKLQotLyoqCi0gKiBBIEZhdWx0RGVzY3JpcHRpb24gY29ycmVzcG9uZHMgdG8gYSBmYXVsdCB0aGF0IGNhbiBiZSB0aHJvd24gZnJvbSBhbiBvcGVyYXRpb24uICBOT1RFIHRoaXMgaXQgbm90IAotICogaW1wbGVtZW50ZWQgeWV0IQotICogCi0gKiBGYXVsdERlc2NyaXB0b25zIGNvbnRhaW4gaW5mb3JtYXRpb24gdGhhdCBpcyBvbmx5IHJlbGV2ZW50IGZvciBhbmQgU0VJLWJhc2VkIHNlcnZpY2UsIGkuZS4gb25lIHRoYXQgaXMgaW52b2tlZCB2aWEgc3BlY2lmaWMKLSAqIG1ldGhvZHMuICBUaGlzIGNsYXNzIGRvZXMgbm90IGV4aXN0IGZvciBQcm92aWRlci1iYXNlZCBzZXJ2aWNlcyAoaS5lLiB0aG9zZSB0aGF0IHNwZWNpZnkgV2ViU2VydmljZVByb3ZpZGVyKQotICogCi0gKiA8cHJlPgotICogPGI+T3BlcmF0aW9uRGVzY3JpcHRpb24gZGV0YWlsczwvYj4KLSAqIAotICogICAgIENPUlJFU1BPTkRTIFRPOiAgICAgIEFuIGV4Y2VwdGlvbiB0aHJvd24gYnkgYW4gb3BlcmF0aW9uIG9uIGFuIFNFSSAob24gYm90aCBDbGllbnQgYW5kIFNlcnZlcikgICAgICAKLSAqICAgICAgICAgCi0gKiAgICAgQVhJUzIgREVMRUdBVEU6ICAgICAgTm9uZQotICogICAgIAotICogICAgIENISUxEUkVOOiAgICAgICAgICAgIE5vbmUKLSAqICAgICAKLSAqICAgICBBTk5PVEFUSU9OUzoKLSAqICAgICAgICAgV2ViRmF1bHQgWzIyNF0KLSAqICAgICAKLSAqICAgICBXU0RMIEVMRU1FTlRTOgotICogICAgICAgICBmYXVsdCBtZXNzYWdlCi0gKiAgICAgICAgIAotICogIDwvcHJlPiAgICAgICAKLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIEZhdWx0RGVzY3JpcHRpb24gewotICAgIHB1YmxpYyBPcGVyYXRpb25EZXNjcmlwdGlvbiBnZXRPcGVyYXRpb25EZXNjcmlwdGlvbigpOwotCi0KLSAgICAvKiogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgZXhjZXB0aW9uIGNsYXNzICovCi0gICAgcHVibGljIFN0cmluZyBnZXRFeGNlcHRpb25DbGFzc05hbWUoKTsKLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIGNsYXNzIHRoYXQgaXMgcHJvdmlkZWQgdmlhIHRoZSBnZXRGYXVsdEluZm8gbWV0aG9kLiAiIiBpcyByZXR1cm5lZCBpZiB0aGUKLSAgICAgKiAgICAgICAgIGV4Y2VwdGlvbiBjbGFzcyBkb2VzIG5vdCBwcm92aWRlIGEgZ2V0RmF1bHRJbmZvIG1ldGhvZCAoc3VjaCBleGNlcHRpb25zIGFyZQotICAgICAqICAgICAgICAgY29uc2lkZXJlZCBub24tY29tcGxpYW50IGJ5IEpBWC1XUykuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRGYXVsdEluZm8oKTsKLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIEpBWEIgY2xhc3MgZGVmaW5lZCBpbiB0aGUgc2NoZW1hIGZvciB0aGlzIGV4Y2VwdGlvbi4gIE5vdGUgdGhhdCB0aGlzCi0gICAgICogICAgICAgICBpcyB1c3VhbGx5IGEgYmVhbiwgYnV0IGl0IGNvdWxkIGFsc28gYmUgYSBqYXZhIHByaW1pdGl2ZS4gIElmIG5vdCBkZWZpbmVkLCB0aGUKLSAgICAgKiAgICAgICAgIGdldEZhdWx0SW5mbyB0eXBlIGlzIHJldHVybmVkLgotICAgICAqICAgICAgICAgPHAvPgotICAgICAqICAgICAgICAgTk9URSBGb3Igbm9uLWNvbXBsaWFudCBleGNlcHRpb25zLCB0aGUgZ2V0RmF1bHRJbmZvIGluZm9ybWF0aW9uIGlzIG5vdCBhdmFpbGFibGVkLgotICAgICAqICAgICAgICAgSW4gdGhlc2UgY2FzZXMsIGEgIiIgaXMgcmV0dXJuZWQuICBUaGUgcnVudGltZSAoSkFYV1MpIG1heSB1c2Ugb3RoZXIgaW5mb3JtYXRpb24gdG8KLSAgICAgKiAgICAgICAgIGxvY2F0ZSBhbmQvb3IgYnVpbGQgdGhlIGZhdWx0YmVhbgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmF1bHRCZWFuKCk7Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBlbGVtZW50IGxvY2FsbmFtZSAoZm9yIHRoZSBKQVhCIGNsYXNzKSBjb3JyZXNwb25kaW5nIHRvIHRoaXMgZXhjZXB0aW9uLiAiIiBpZiBub3QKLSAgICAgKiAgICAgICAgIGRlZmluZWQuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCk7Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBlbGVtZW50IHRhcmdldE5hbWVzcGFjZSAoZm9yIHRoZSBKQVhCIGNsYXNzKSBjb3JyZXNwb25kaW5nIHRvIHRoaXMgZXhjZXB0aW9uLiAiIgotICAgICAqICAgICAgICAgaWYgbm90IGRlZmluZWQuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRUYXJnZXROYW1lc3BhY2UoKTsKLQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vRmF1bHREZXNjcmlwdGlvbkphdmEuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL0ZhdWx0RGVzY3JpcHRpb25KYXZhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyZjE4MWIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vRmF1bHREZXNjcmlwdGlvbkphdmEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uOwotCi1pbXBvcnQgamF2YXgueG1sLndzLldlYkZhdWx0OwotCi1wdWJsaWMgaW50ZXJmYWNlIEZhdWx0RGVzY3JpcHRpb25KYXZhIHsKLSAgICBwdWJsaWMgV2ViRmF1bHQgZ2V0QW5ub1dlYkZhdWx0KCk7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9GYXVsdERlc2NyaXB0aW9uV1NETC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vRmF1bHREZXNjcmlwdGlvbldTREwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY2MzI0Ni4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9GYXVsdERlc2NyaXB0aW9uV1NETC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb247Ci0KLXB1YmxpYyBpbnRlcmZhY2UgRmF1bHREZXNjcmlwdGlvbldTREwgewotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vT3BlcmF0aW9uRGVzY3JpcHRpb24uamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL09wZXJhdGlvbkRlc2NyaXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1YmZkZjAuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vT3BlcmF0aW9uRGVzY3JpcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb247Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLQotLyoqCi0gKiBBbiBPcGVyYXRpb25EZXNjcmlwdG9uIGNvcnJlc3BvbmRzIHRvIGEgbWV0aG9kIG9uIGFuIFNFSS4gIFRoYXQgU0VJIGNvdWxkIGJlIGV4cGxpY2l0IChpLmUuCi0gKiBXZWJTZXJ2aWNlLmVuZHBvaW50SW50ZXJmYWNlPXNlaS5jbGFzcykgb3IgaW1wbGljaXQgKGkuZS4gcHVibGljIG1ldGhvZHMgb24gdGhlIHNlcnZpY2UKLSAqIGltcGxlbWVudGF0aW9uIGFyZSB0aGUgY29udHJhY3QgYW5kIHRodXMgdGhlIGltcGxpY2l0IFNFSSkuICBOb3RlIHRoYXQgd2hpbGUKLSAqIE9wZXJhdGlvbkRlc2NyaXB0aW9ucyBhcmUgY3JlYXRlZCBvbiBib3RoIHRoZSBjbGllbnQgYW5kIHNlcnZpY2Ugc2lkZSwgaW1wbGljaXQgU0VJcyB3aWxsIG9ubHkKLSAqIG9jY3VyIG9uIHRoZSBzZXJ2aWNlIHNpZGUuCi0gKiA8cC8+Ci0gKiBPcGVyYXRpb25EZXNjcmlwdG9ucyBjb250YWluIGluZm9ybWF0aW9uIHRoYXQgaXMgb25seSByZWxldmVudCBmb3IgYW5kIFNFSS1iYXNlZCBzZXJ2aWNlLCBpLmUuCi0gKiBvbmUgdGhhdCBpcyBpbnZva2VkIHZpYSBzcGVjaWZpYyBtZXRob2RzLiAgVGhpcyBjbGFzcyBkb2VzIG5vdCBleGlzdCBmb3IgUHJvdmlkZXItYmFzZWQgc2VydmljZXMKLSAqIChpLmUuIHRob3NlIHRoYXQgc3BlY2lmeSBXZWJTZXJ2aWNlUHJvdmlkZXIpCi0gKiA8cC8+Ci0gKiA8cHJlPgotICogPGI+T3BlcmF0aW9uRGVzY3JpcHRpb24gZGV0YWlsczwvYj4KLSAqIDxwLz4KLSAqICAgICBDT1JSRVNQT05EUyBUTzogICAgICBBIHNpbmdsZSBvcGVyYXRpb24gb24gYW4gU0VJIChvbiBib3RoIENsaWVudCBhbmQgU2VydmVyKQotICogPHAvPgotICogICAgIEFYSVMyIERFTEVHQVRFOiAgICAgIEF4aXNPcGVyYXRpb24KLSAqIDxwLz4KLSAqICAgICBDSElMRFJFTjogICAgICAgICAgICAwLi5uIFBhcmFtZXRlckRlc2NyaXB0aW9uCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4ubiBGYXVsdERlc2NyaXB0aW9uIChOb3RlOiBOb3QgZnVsbHkgaW1wbGVtZW50ZWQpCi0gKiA8cC8+Ci0gKiAgICAgQU5OT1RBVElPTlM6Ci0gKiAgICAgICAgIFdlYk1ldGhvZCBbMTgxXQotICogICAgICAgICBTT0FQQmluZGluZyBbMTgxXQotICogICAgICAgICBPbmV3YXkgWzE4MV0KLSAqICAgICAgICAgV2ViUmVzdWx0IFsxODFdCi0gKiAgICAgICAgIFJlcXVlc3RXcmFwcGVyIFsyMjRdCi0gKiAgICAgICAgIFJlc3BvbnNlV3JhcHBlciBbMjI0XQotICogPHAvPgotICogICAgIFdTREwgRUxFTUVOVFM6Ci0gKiAgICAgICAgIG9wZXJhdGlvbgotICogPHAvPgotICogIDwvcHJlPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9wZXJhdGlvbkRlc2NyaXB0aW9uIHsKLSAgICAvKioKLSAgICAgKiBQYXJhbWF0ZXIgc2V0IG9uIEF4aXNPcGVyYXRpb24gd2hpY2ggY29udGFpbnMgYW4gQXJyYXlMaXN0IG9mIFNPQVAgaGVhZGVyIFFOYW1lcwotICAgICAqIGNvcnJlc3BvbmRpbmcgdG8gU0VJIHBhcmFtZXRlcnMuIAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9QQVJBTUVURVJfUU5BTUVTID0gIm9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uT3BlcmF0aW9uRGVzY3JpcHRpb24uaGVhZGVyUGFyYW1ldGVyUU5hbWVzIjsKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBWElTX09QRVJBVElPTl9QQVJBTUVURVIgPSAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5PcGVyYXRpb25EZXNjcmlwdGlvbi5heGlzT3BlcmF0aW9uUGFyYW1ldGVyIjsKLSAgICAKLSAgICBwdWJsaWMgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiBnZXRFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uKCk7Ci0KLSAgICBwdWJsaWMgRmF1bHREZXNjcmlwdGlvbltdIGdldEZhdWx0RGVzY3JpcHRpb25zKCk7Ci0KLSAgICBwdWJsaWMgRmF1bHREZXNjcmlwdGlvbiByZXNvbHZlRmF1bHRCeUV4Y2VwdGlvbk5hbWUoU3RyaW5nIGV4Y2VwdGlvbkNsYXNzTmFtZSk7Ci0KLSAgICBwdWJsaWMgUGFyYW1ldGVyRGVzY3JpcHRpb24gZ2V0UGFyYW1ldGVyRGVzY3JpcHRpb24oaW50IHBhcmFtZXRlck51bWJlcik7Ci0KLSAgICBwdWJsaWMgUGFyYW1ldGVyRGVzY3JpcHRpb24gZ2V0UGFyYW1ldGVyRGVzY3JpcHRpb24oU3RyaW5nIHBhcmFtZXRlck5hbWUpOwotCi0gICAgcHVibGljIFBhcmFtZXRlckRlc2NyaXB0aW9uW10gZ2V0UGFyYW1ldGVyRGVzY3JpcHRpb25zKCk7Ci0gICAgCi0gICAgLy8gaW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IGFuIEBYbWxMaXN0IGFubm90YXRpb24gd2FzIGZvdW5kIG9uIHRoZSBtZXRob2QKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0xpc3RUeXBlKCk7Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgQXhpc09wZXJhdGlvbiBnZXRBeGlzT3BlcmF0aW9uKCk7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEphdmFNZXRob2ROYW1lKCk7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEphdmFEZWNsYXJpbmdDbGFzc05hbWUoKTsKLQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRKYXZhUGFyYW1ldGVycygpOwotCi0gICAgLyoqCi0gICAgICogQ2xpZW50IHNpZGUgYW5kIG5vbi1EQkMgc2VydmljZSBzaWRlIG9ubHkhIFJldHVybiB0aGUgU0VJIG1ldGhvZCBmb3Igd2hpY2ggYQotICAgICAqIHNlcnZpY2UuZ2V0UG9ydChDbGFzcyBTRUlDbGFzcykgY3JlYXRlZCB0aGUgRW5kcG9pbnREZXNjcmlwdGlvbkludGVyZmFjZSBhbmQgdGhlIGFzc29jaWF0ZWQKLSAgICAgKiBPcGVyYXRpb25EZXNjcmlwdGlvbnMuICBSZXR1cm5zIG51bGwgb24gdGhlIHNlcnZpY2UgaW1wbGVtZW50YXRpb24gc2lkZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWV0aG9kIGdldFNFSU1ldGhvZCgpOwotCi0gICAgLyoqCi0gICAgICogU2VydmljZSBpbXBsZW1lbnRhdGlvbiBzaWRlIG9ubHkhICBHaXZlbiBhIHNlcnZpY2UgaW1wbGVtZW50YXRpb24gY2xhc3MsIGZpbmQgdGhlIG1ldGhvZCBvbgotICAgICAqIHRoYXQgY2xhc3MgdGhhdCBjb3JyZXNwb25kcyB0byB0aGlzIG9wZXJhdGlvbiBkZXNjcmlwdGlvbi4gIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2Ugb24gdGhlCi0gICAgICogc2VydmljZSBpbXBsIHNpZGUsIHRoZSBPcGVyYXRpb25EZXNjcmlwdGlvbnMgY2FuIGJlIGJ1aWx0IHVzaW5nIGJ5dGUtc2Nhbm5pbmcgYW5kIHdpdGhvdXQgdGhlCi0gICAgICogY2xhc3MgYWN0dWFsbHkgaGF2aW5nIGJlZW4gbG9hZGVkLgotICAgICAqCi0gICAgICogQHBhcmFtIHNlcnZpY2VJbXBsCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBNZXRob2QgZ2V0TWV0aG9kRnJvbVNlcnZpY2VJbXBsKENsYXNzIHNlcnZpY2VJbXBsKTsKLQotICAgIC8qKgotICAgICAqIEFuc3dlciBpZiB0aGlzIG9wZXJhdGlvbiBjb3JyZXNwb25kcyB0byB0aGUgSkFYLVdTIENsaWVudC1vbmx5IGFzeW5jIG1ldGhvZHMuICBUaGVzZSBtZXRob2RzCi0gICAgICogYXJlIG9mIHRoZSBmb3JtOiBqYXZheC54bWwud3MuUmVzcG9uc2U8VD4gbWV0aG9kKC4uLikgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlPD8+Ci0gICAgICogbWV0aG9kKC4uLiwgamF2YXgueG1sLndzLkFzeW5jSGFuZGxlcjxUPikKLSAgICAgKgotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0pBWFdTQXN5bmNDbGllbnRNZXRob2QoKTsKLQotICAgIHB1YmxpYyBRTmFtZSBnZXROYW1lKCk7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE9wZXJhdGlvbk5hbWUoKTsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWN0aW9uKCk7Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc09uZVdheSgpOwotCi0gICAgcHVibGljIGJvb2xlYW4gaXNFeGNsdWRlZCgpOwotCi0gICAgcHVibGljIGJvb2xlYW4gaXNPcGVyYXRpb25SZXR1cm5pbmdSZXN1bHQoKTsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVzdWx0TmFtZSgpOwotCi0gICAgcHVibGljIFN0cmluZyBnZXRSZXN1bHRUYXJnZXROYW1lc3BhY2UoKTsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVzdWx0UGFydE5hbWUoKTsKLQotICAgIHB1YmxpYyBib29sZWFuIGlzUmVzdWx0SGVhZGVyKCk7Ci0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgQ2xhc3Mgb2YgdGhlIHJldHVybiB0eXBlLiAgRm9yIEpBWC1XUyBhc3luYyByZXR1cm5zIG9mIHR5cGUgUmVzcG9uc2U8VD4gb3IKLSAgICAgKiBBc3luY0hhbmRsZXI8VD4sIHRoZSBjbGFzcyBhc3NvY2lhdGVkIHdpdGggUmVzcG9uc2Ugb3IgQXN5bmNIYW5sZXIgcmVzcGVjdGl2ZWx5IGlzIHJldHVybmVkLgotICAgICAqIFRvIGdldCB0aGUgY2xhc3MgYXNzb2NpYXRlZCB3aXRoIDxUPgotICAgICAqCi0gICAgICogQHJldHVybiBDbGFzcwotICAgICAqIEBzZWUgZ2V0UmVzdWx0QWN0dWFsVHlwZSgpCi0gICAgICovCi0gICAgcHVibGljIENsYXNzIGdldFJlc3VsdFR5cGUoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgYWN0dWFsIENsYXNzIG9mIHRoZSB0eXBlLiAgRm9yIGEgSkFYLVdTIGFzeW5jIHJldHVybiB0eXBlIG9mIFJlc3BvbnNlPFQ+IG9yCi0gICAgICogQXN5bmNIYW5kbGVyPFQ+LCB0aGUgY2xhc3MgYXNzb2NpYXRlZCB3aXRoIDxUPiBpcyByZXR1cm5lZC4gIEZvciBub24tSkFYLVdTIGFzeW5jIHJldHVybnMsCi0gICAgICogdGhlIGNsYXNzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmV0dXJuIHR5cGUgaXMgcmV0dXJuZWQuICBOb3RlIHRoYXQgZm9yIGEgR2VuZXJpYyByZXR1cm4gdHlwZSwKLSAgICAgKiBzdWNoIGFzIExpc3Q8Rm9vPiwgdGhlIGNsYXNzIGFzc29jaWF0ZWQgd2l0aCBMaXN0IHdpbGwgYmUgcmV0dXJuZWQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGFjdHVhbCBDbGFzcwotICAgICAqLwotICAgIHB1YmxpYyBDbGFzcyBnZXRSZXN1bHRBY3R1YWxUeXBlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBjbGFzcyBuYW1lIG9mIHRoZSB3cmFwcGVyIGNsYXNzLiBOT1RFOiBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiBudWxsIGlmIHRoZQotICAgICAqICAgICAgICAgcmVxdWVzdCB3cmFwcGVyIGNsYXNzIGlzIG5vdCBrbm93biBkdXJpbmcgdGhlIGRlc2NyaXB0aW9uIGxheWVyIHByb2Nlc3NpbmcuIEluIHN1Y2gKLSAgICAgKiAgICAgICAgIGNhc2VzIHRoZSBpbXBsZW1lbnRhdGlvbiBtYXkgdXNlIHByb3ByaWV0YXJ5IGNvZGUgdG8gZmluZCB0aGUgY2xhc3MuIEZvciBleGFtcGxlLAotICAgICAqICAgICAgICAgSkFYV1MgbWF5IGxvb2sgZm9yIGEgbWF0Y2hpbmcgY2xhc3MgaW4gdGhlIHNlaSBwYWNrYWdlLCBpbiBhIHNwZWNpYWwgamF4d3MgcGFja2FnZSBvcgotICAgICAqICAgICAgICAgcHJvY2VlZCB3aXRob3V0IHRoZSBjbGFzcyBuYW1lCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRSZXF1ZXN0V3JhcHBlckNsYXNzTmFtZSgpOwotCi0gICAgcHVibGljIFN0cmluZyBnZXRSZXF1ZXN0V3JhcHBlclRhcmdldE5hbWVzcGFjZSgpOwotCi0gICAgcHVibGljIFN0cmluZyBnZXRSZXF1ZXN0V3JhcHBlckxvY2FsTmFtZSgpOwotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgY2xhc3MgbmFtZSBvZiB0aGUgd3JhcHBlciBjbGFzcy4gTk9URTogVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gbnVsbCBpZiB0aGUKLSAgICAgKiAgICAgICAgIHJlcXVlc3Qgd3JhcHBlciBjbGFzcyBpcyBub3Qga25vd24gZHVyaW5nIHRoZSBkZXNjcmlwdGlvbiBsYXllciBwcm9jZXNzaW5nLiBJbiBzdWNoCi0gICAgICogICAgICAgICBjYXNlcyB0aGUgaW1wbGVtZW50YXRpb24gbWF5IHVzZSBwcm9wcmlldGFyeSBjb2RlIHRvIGZpbmQgdGhlIGNsYXNzLiBGb3IgZXhhbXBsZSwKLSAgICAgKiAgICAgICAgIEpBWFdTIG1heSBsb29rIGZvciBhIG1hdGNoaW5nIGNsYXNzIGluIHRoZSBzZWkgcGFja2FnZSwgaW4gYSBzcGVjaWFsIGpheHdzIHBhY2thZ2Ugb3IKLSAgICAgKiAgICAgICAgIHByb2NlZWQgd2l0aG91dCB0aGUgY2xhc3MgbmFtZQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVzcG9uc2VXcmFwcGVyQ2xhc3NOYW1lKCk7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFJlc3BvbnNlV3JhcHBlclRhcmdldE5hbWVzcGFjZSgpOwotCi0gICAgcHVibGljIFN0cmluZyBnZXRSZXNwb25zZVdyYXBwZXJMb2NhbE5hbWUoKTsKLQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRQYXJhbU5hbWVzKCk7Ci0KLSAgICBwdWJsaWMgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuUGFyYW1ldGVyU3R5bGUgZ2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpOwotCi0gICAgcHVibGljIGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlN0eWxlIGdldFNvYXBCaW5kaW5nU3R5bGUoKTsKLQotICAgIHB1YmxpYyBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5Vc2UgZ2V0U29hcEJpbmRpbmdVc2UoKTsKLQotICAgIHB1YmxpYyBPcGVyYXRpb25SdW50aW1lRGVzY3JpcHRpb24gZ2V0T3BlcmF0aW9uUnVudGltZURlc2MoU3RyaW5nIG5hbWUpOwotCi0gICAgcHVibGljIHZvaWQgc2V0T3BlcmF0aW9uUnVudGltZURlc2MoT3BlcmF0aW9uUnVudGltZURlc2NyaXB0aW9uIG9yZCk7Ci0KLSAgICAvKioKLSAgICAgKiBGb3IgSkFYLVdTIGNsaWVudC1zaWRlIGFzeW5jIG9wZXJhdGlvbnMsIHRoaXMgd2lsbCByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgc3luYyAKLSAgICAgKiBPcGVyYXRpb25EZXNjcmlwdGlvbi4KLSAgICAgKiAKLSAgICAgKiBOb3RlIHRoYXQgaWYgdGhpcyBtZXRob2QgaXMgdXNlZCB3aXRoaW4gdGhlIG1ldGFkYXRhIGxheWVyLCBpdCBpcyBwb3NzaWJsZSB0aGF0IGl0IHdpbGwgcmV0dXJuCi0gICAgICogbnVsbC4gIFRoYXQgd2lsbCBoYXBwZW4gaWYgdGhlIG1ldGFkYXRhIGxheWVyIGlzIGNvbnN0cnVjdGVkIGZyb20gYW5ub3RhdGlvbnMgb24gdGhlIFNFSSAKLSAgICAgKiAobm90IFdTREwpLiAgSW4gdGhhdCBjYXNlLCBpdCBpcyBwb3NzaWJsZSB0aGF0IHRoZSBhc3luYyBtZXRob2RzIG9uIHRoZSBTRUkgYXJlIHByb2Nlc3NlZCAKLSAgICAgKiBiZWZvcmUgdGhlIHN5bmMgbWV0aG9kLiAgSW4gdGhhdCBjYXNlLCB0aGVyZSB3aWxsIGJlIG5vIHN5bmMgbWV0aG9kIHlldC4gIElmIHRoaXMgbWV0aG9kCi0gICAgICogaXMgY2FsbGVkIG91dHNpZGUgdGhlIG1ldGFkYXRhIGxheWVyLCB0aGVuIGlmIHRoZSBhc3luYyBtZXRob2RzIGV4aXN0LCB0aGUgc3luYyBtZXRob2QKLSAgICAgKiBzaG91bGQgYWxzbyBleGlzdC4gIAotICAgICAqIAotICAgICAqIEByZXR1cm4gT3BlcmF0aW9uRGVzY3JpcHRpb24gY29ycmVzcG9uZGluZyB0byB0aGUgc3luYyBvcGVyYXRpb24sIG9yIG51bGwgKHNlZSBub3RlIGFib3ZlKS4KLSAgICAgKi8KLSAgICBwdWJsaWMgT3BlcmF0aW9uRGVzY3JpcHRpb24gZ2V0U3luY09wZXJhdGlvbigpOwotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBBdHRhY2htZW50IERlc2NyaXB0aW9uIGZvciB0aGUgcmV0dXJuIHR5cGUgb3IgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBBdHRhY2htZW50RGVzY3JpcHRpb24gZ2V0UmVzdWx0QXR0YWNobWVudERlc2NyaXB0aW9uKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgKiBSZXR1cm5zIHRoZSBuYW1lc3BhY2Ugb2YgYmluZGluZyBpbnB1dCBtZXNzYWdlIGZvciB0aGUgb3BlcmF0aW9uCi0gICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEJpbmRpbmdJbnB1dE5hbWVzcGFjZSgpOwotICAgIAotICAgIC8qKgotICAgICogUmV0dXJucyB0aGUgbmFtZXNwYWNlIG9mIGJpbmRpbmcgb3V0cHV0IG1lc3NhZ2UgZm9yIHRoZSBvcGVyYXRpb24KLSAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QmluZGluZ091dHB1dE5hbWVzcGFjZSgpOwotICAgIAotICAgIC8qKgotICAgICAqIEByZXR1cm4gYSBib29sZWFuIGluZGljYXRvciBvZiBuZXN0ZWQgc3dhUmVmIGF0dGFjaG1lbnRzIG9uIHRoZSByZXF1ZXN0LgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGhhc1JlcXVlc3RTd2FSZWZBdHRhY2htZW50cygpOwotICAgIAotICAgIC8qKgotICAgICAqIEBwYXJhbSBzZXRzIHRoZSBpbmRpY2F0b3Igb2YgbmVzdGVkIHJlcXVlc3Qgc3dhUmVmIGF0dGFjaG1lbnRzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEhhc1JlcXVlc3RTd2FSZWZBdHRhY2htZW50cyhib29sZWFuIGIpOwotICAgIAotICAgIC8qKgotICAgICAqIEByZXR1cm4gYSBib29sZWFuIGluZGljYXRvciBvZiBuZXN0ZWQgc3dhUmVmIGF0dGFjaG1lbnRzIG9uIHRoZSByZXNwb25zZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNSZXNwb25zZVN3YVJlZkF0dGFjaG1lbnRzKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHNldHMgdGhlIGluZGljYXRvciBvZiBuZXN0ZWQgcmVzcG9uc2Ugc3dhUmVmIGF0dGFjaG1lbnRzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEhhc1Jlc3BvbnNlU3dhUmVmQXR0YWNobWVudHMoYm9vbGVhbiBiKTsKLSAgICAKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9PcGVyYXRpb25EZXNjcmlwdGlvbkphdmEuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL09wZXJhdGlvbkRlc2NyaXB0aW9uSmF2YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjU0Y2I4Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL09wZXJhdGlvbkRlc2NyaXB0aW9uSmF2YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uOwotCi1pbXBvcnQgamF2YXguandzLk9uZXdheTsKLWltcG9ydCBqYXZheC5qd3MuV2ViTWV0aG9kOwotaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbS5Nb2RlOwotaW1wb3J0IGphdmF4Lmp3cy5XZWJSZXN1bHQ7Ci1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmc7Ci1pbXBvcnQgamF2YXgueG1sLndzLkFjdGlvbjsKLWltcG9ydCBqYXZheC54bWwud3MuUmVxdWVzdFdyYXBwZXI7Ci1pbXBvcnQgamF2YXgueG1sLndzLlJlc3BvbnNlV3JhcHBlcjsKLQotcHVibGljIGludGVyZmFjZSBPcGVyYXRpb25EZXNjcmlwdGlvbkphdmEgewotCi0gICAgcHVibGljIFdlYlJlc3VsdCBnZXRBbm5vV2ViUmVzdWx0KCk7Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1dlYlJlc3VsdEFubm90YXRpb25TcGVjaWZpZWQoKTsKLQotICAgIHB1YmxpYyBib29sZWFuIGdldEFubm9XZWJSZXN1bHRIZWFkZXIoKTsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QW5ub1dlYlJlc3VsdE5hbWUoKTsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QW5ub1dlYlJlc3VsdFBhcnROYW1lKCk7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEFubm9XZWJSZXN1bHRUYXJnZXROYW1lc3BhY2UoKTsKLQotICAgIHB1YmxpYyBSZXF1ZXN0V3JhcHBlciBnZXRBbm5vUmVxdWVzdFdyYXBwZXIoKTsKLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIHNwZWNpZmllZCB2YWx1ZSBvZiBAUmVxdWVzdFdyYXBwZXIgY2xhc3NOYW1lIG9yIG51bGwgTk9URTogVGhlcmUgaXMgbm8gZGVmYXVsdAotICAgICAqICAgICAgICAgZm9yIHRoZSBjbGFzc25hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEFubm9SZXF1ZXN0V3JhcHBlckNsYXNzTmFtZSgpOwotCi0gICAgcHVibGljIFN0cmluZyBnZXRBbm5vUmVxdWVzdFdyYXBwZXJMb2NhbE5hbWUoKTsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QW5ub1JlcXVlc3RXcmFwcGVyVGFyZ2V0TmFtZXNwYWNlKCk7Ci0KLSAgICBwdWJsaWMgUmVzcG9uc2VXcmFwcGVyIGdldEFubm9SZXNwb25zZVdyYXBwZXIoKTsKLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIHNwZWNpZmllZCB2YWx1ZSBvZiBAUmVzcG9uc2VXcmFwcGVyIGNsYXNzTmFtZSBvciBudWxsIE5PVEU6IFRoZXJlIGlzIG5vIGRlZmF1bHQKLSAgICAgKiAgICAgICAgIGZvciB0aGUgY2xhc3NuYW1lCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRBbm5vUmVzcG9uc2VXcmFwcGVyQ2xhc3NOYW1lKCk7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEFubm9SZXNwb25zZVdyYXBwZXJMb2NhbE5hbWUoKTsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QW5ub1Jlc3BvbnNlV3JhcHBlclRhcmdldE5hbWVzcGFjZSgpOwotCi0gICAgcHVibGljIFNPQVBCaW5kaW5nIGdldEFubm9Tb2FwQmluZGluZygpOwotCi0gICAgcHVibGljIGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlBhcmFtZXRlclN0eWxlIGdldEFubm9Tb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCk7Ci0KLSAgICBwdWJsaWMgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuU3R5bGUgZ2V0QW5ub1NvYXBCaW5kaW5nU3R5bGUoKTsKLQotICAgIHB1YmxpYyBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5Vc2UgZ2V0QW5ub1NvYXBCaW5kaW5nVXNlKCk7Ci0KLSAgICBwdWJsaWMgV2ViTWV0aG9kIGdldEFubm9XZWJNZXRob2QoKTsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QW5ub1dlYk1ldGhvZEFjdGlvbigpOwotCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0QW5ub1dlYk1ldGhvZEV4Y2x1ZGUoKTsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QW5ub1dlYk1ldGhvZE9wZXJhdGlvbk5hbWUoKTsKLQotICAgIC8vIE5vdGUgdGhhdCB0aGUgV2ViUGFyYW0gYW5ub3RhdGlvbiBpcyBoYW5kbGVkIGJ5IFBhcmFtZXRlckRlc2NyaXB0aW9uLiAgVGhlc2UKLSAgICAvLyBXZWJQYXJhbS1yZWxhdGVkIG1ldGhvZHMgYXJlIHNpbXBseSBjb252ZW5pZW5jZSBtZXRob2RzLgotICAgIHB1YmxpYyBNb2RlW10gZ2V0QW5ub1dlYlBhcmFtTW9kZXMoKTsKLQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRBbm5vV2ViUGFyYW1OYW1lcygpOwotCi0gICAgcHVibGljIFN0cmluZyBnZXRBbm5vV2ViUGFyYW1UYXJnZXROYW1lc3BhY2UoU3RyaW5nIG5hbWUpOwotCi0gICAgcHVibGljIFN0cmluZ1tdIGdldEFubm9XZWJQYXJhbVRhcmdldE5hbWVzcGFjZXMoKTsKLQotICAgIHB1YmxpYyBib29sZWFuIGlzQW5ub1dlYlBhcmFtSGVhZGVyKFN0cmluZyBuYW1lKTsKLQotICAgIHB1YmxpYyBPbmV3YXkgZ2V0QW5ub09uZXdheSgpOwotCi0gICAgcHVibGljIGJvb2xlYW4gaXNBbm5vT25lV2F5KCk7Ci0gICAgCi0gICAgcHVibGljIEFjdGlvbiBnZXRBbm5vQWN0aW9uKCk7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9PcGVyYXRpb25EZXNjcmlwdGlvbldTREwuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL09wZXJhdGlvbkRlc2NyaXB0aW9uV1NETC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjJlZGYxLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL09wZXJhdGlvbkRlc2NyaXB0aW9uV1NETC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb247Ci0KLXB1YmxpYyBpbnRlcmZhY2UgT3BlcmF0aW9uRGVzY3JpcHRpb25XU0RMIHsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL09wZXJhdGlvblJ1bnRpbWVEZXNjcmlwdGlvbi5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vT3BlcmF0aW9uUnVudGltZURlc2NyaXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2NDU0NGMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vT3BlcmF0aW9uUnVudGltZURlc2NyaXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb247Ci0KLS8qKgotICogQSBPcGVyYXRpb25SdW50aW1lRGVzY3JpcHRpb24gb2JqZWN0IGNvbnRhaW5zIGltbXV0YWJsZSBkYXRhIHRoYXQgaXMgbmVlZGVkIGR1cmluZyB0aGUgcnVudGltZQotICogKGkuZS4gdG8gY2FjaGUgbWFyc2hhbCBhbmQgZGVtYXJzaGFsIGluZm9ybWF0aW9uKS4gIFRoZSBPcGVyYXRpb25SdW50aW1lRGVzY3JpcHRpb24gb2JqZWN0IG11c3QKLSAqIGJlIGltbXV0YWJsZSBzbyB0aGF0IGl0IGNhbiBzYWZlbHkgYWNjZXNzZWQgYnkgbXVsdGlwbGUgdGhlYWRzIHdpdGhvdXQgc3luY2hyb25pemF0aW9uLgotICogPHAvPgotICogSXQgY2Fubm90IGJlIHVzZWQgdG8gc3RvcmUgaW5mb3JtYXRpb24gdGhhdCBtYXkgbm90IGJlIGF2YWlsYWJsZSBpbiBkaWZmZXJlbnQgdGhyZWFkcy8KLSAqIGNsYXNzbG9hZGVycyAoaS5lLiBpdCBjYW5ub3QgaGF2ZSByZWZlcmVuY2VzIHRvIENsYXNzIG9iamVjdHMpCi0gKiA8cC8+Ci0gKiBUaGUgYWN0dWFsIE9wZXJhdGlvblJ1bnRpbWVEZXNjcmlwdGlvbiBvYmplY3RzIGFyZSBhY2Nlc3NlZCB2aWEgdGhlIGtleS4KLSAqLwotcHVibGljIGludGVyZmFjZSBPcGVyYXRpb25SdW50aW1lRGVzY3JpcHRpb24gewotCi0gICAgLyoqIEByZXR1cm4gT3BlcmF0aW9uRGVzYyBwYXJlbnQgKi8KLSAgICBwdWJsaWMgT3BlcmF0aW9uRGVzY3JpcHRpb24gZ2V0T3BlcmF0aW9uRGVzY3JpcHRpb24oKTsKLQotICAgIC8qKiBAcmV0dXJuIFN0cmluZyAoaS5lLiBKQVhXUykgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEtleSgpOwotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vUGFyYW1ldGVyRGVzY3JpcHRpb24uamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL1BhcmFtZXRlckRlc2NyaXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0MmMyNWUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vUGFyYW1ldGVyRGVzY3JpcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uOwotCi1pbXBvcnQgamF2YXguandzLldlYlBhcmFtOwotCi0vKioKLSAqIEEgUGFyYW1ldGVyRGVzY3JpcHRvbiBjb3JyZXNwb25kcyB0byBwYXJhbWV0ZXIgdG8gYSBtZXRob2Qgb24gYW4gU0VJLiBUaGF0IFNFSSBjb3VsZCBiZSBleHBsaWNpdAotICogKGkuZS4gV2ViU2VydmljZS5lbmRwb2ludEludGVyZmFjZT1zZWkuY2xhc3MpIG9yIGltcGxpY2l0IChpLmUuIHB1YmxpYyBtZXRob2RzIG9uIHRoZSBzZXJ2aWNlCi0gKiBpbXBsZW1lbnRhdGlvbiBhcmUgdGhlIGNvbnRyYWN0IGFuZCB0aHVzIHRoZSBpbXBsaWNpdCBTRUkpLgotICogPHAvPgotICogUGFyYW1ldGVyRGVzY3JpcHRvbnMgY29udGFpbiBpbmZvcm1hdGlvbiB0aGF0IGlzIG9ubHkgcmVsZXZlbnQgZm9yIGFuZCBTRUktYmFzZWQgc2VydmljZSwgaS5lLgotICogb25lIHRoYXQgaXMgaW52b2tlZCB2aWEgc3BlY2lmaWMgbWV0aG9kcy4gVGhpcyBjbGFzcyBkb2VzIG5vdCBleGlzdCBmb3IgUHJvdmlkZXItYmFzZWQgc2VydmljZXMKLSAqIChpLmUuIHRob3NlIHRoYXQgc3BlY2lmeSBXZWJTZXJ2aWNlUHJvdmlkZXIpCi0gKiA8cC8+Ci0gKiA8cHJlPgotICogIDxiPlBhcmFtZXRlcm5EZXNjcmlwdGlvbiBkZXRhaWxzPC9iPgotICogPHAvPgotICogICAgICBDT1JSRVNQT05EUyBUTzogICAgICBBIHBhcmFtZXRlciB0byBhIG1ldGhvZCBvbiBhbiBTRUkgKG9uIGJvdGggQ2xpZW50IGFuZCBTZXJ2ZXIpCi0gKiA8cC8+Ci0gKiAgICAgIEFYSVMyIERFTEVHQVRFOiAgICAgIE5vbmUKLSAqIDxwLz4KLSAqICAgICAgQ0hJTERSRU46ICAgICAgICAgICAgTm9uZQotICogPHAvPgotICogICAgICBBTk5PVEFUSU9OUzoKLSAqICAgICAgICAgIFdlYlBhcmFtIFsxODFdCi0gKiA8cC8+Ci0gKiAgICAgIFdTREwgRUxFTUVOVFM6Ci0gKiAgICAgICAgICBtZXNzYWdlIHBhcnRzCi0gKiA8cC8+Ci0gKiA8L3ByZT4KLSAqLwotcHVibGljIGludGVyZmFjZSBQYXJhbWV0ZXJEZXNjcmlwdGlvbiB7Ci0KLSAgICBwdWJsaWMgT3BlcmF0aW9uRGVzY3JpcHRpb24gZ2V0T3BlcmF0aW9uRGVzY3JpcHRpb24oKTsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFyYW1ldGVyTmFtZSgpOwotCi0gICAgcHVibGljIFN0cmluZyBnZXRUYXJnZXROYW1lc3BhY2UoKTsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFydE5hbWUoKTsKLQotICAgIHB1YmxpYyBib29sZWFuIGlzSG9sZGVyVHlwZSgpOwotICAgIAotICAgIC8vIEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCBhbiBAWE1MTGlzdCBhbm5vdGF0aW9uIHdhcyBmb3VuZCBvbiBhIHBhcmFtZXRlcgotICAgIHB1YmxpYyBib29sZWFuIGlzTGlzdFR5cGUoKTsKLSAgICAKLSAgICBwdWJsaWMgQ2xhc3MgZ2V0UGFyYW1ldGVyVHlwZSgpOwotCi0gICAgcHVibGljIENsYXNzIGdldFBhcmFtZXRlckFjdHVhbFR5cGUoKTsKLQotICAgIHB1YmxpYyBib29sZWFuIGlzSGVhZGVyKCk7Ci0KLSAgICBwdWJsaWMgV2ViUGFyYW0uTW9kZSBnZXRNb2RlKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHJldHVybiBBdHRhY2htZW50RGVzY3JpcHRpb24gZm9yIHRoaXMgcGFyYW1ldGVyIG9yIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgQXR0YWNobWVudERlc2NyaXB0aW9uIGdldEF0dGFjaG1lbnREZXNjcmlwdGlvbigpOwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vUGFyYW1ldGVyRGVzY3JpcHRpb25KYXZhLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9QYXJhbWV0ZXJEZXNjcmlwdGlvbkphdmEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM0YTFlNi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9QYXJhbWV0ZXJEZXNjcmlwdGlvbkphdmEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbjsKLQotaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbTsKLQotcHVibGljIGludGVyZmFjZSBQYXJhbWV0ZXJEZXNjcmlwdGlvbkphdmEgewotICAgIHB1YmxpYyBXZWJQYXJhbSBnZXRBbm5vV2ViUGFyYW0oKTsKLQotICAgIHB1YmxpYyBib29sZWFuIGdldEFubm9XZWJQYXJhbUhlYWRlcigpOwotCi0gICAgcHVibGljIFdlYlBhcmFtLk1vZGUgZ2V0QW5ub1dlYlBhcmFtTW9kZSgpOwotCi0gICAgcHVibGljIFN0cmluZyBnZXRBbm5vV2ViUGFyYW1OYW1lKCk7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEFubm9XZWJQYXJhbVBhcnROYW1lKCk7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEFubm9XZWJQYXJhbVRhcmdldE5hbWVzcGFjZSgpOwotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vUGFyYW1ldGVyRGVzY3JpcHRpb25XU0RMLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9QYXJhbWV0ZXJEZXNjcmlwdGlvbldTREwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY1ZmQ1Mi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9QYXJhbWV0ZXJEZXNjcmlwdGlvbldTREwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbjsKLQotcHVibGljIGludGVyZmFjZSBQYXJhbWV0ZXJEZXNjcmlwdGlvbldTREwgewotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9SZXNvbHZlZEhhbmRsZXJzRGVzY3JpcHRpb24uamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL1Jlc29sdmVkSGFuZGxlcnNEZXNjcmlwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDQ1OGFiLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL1Jlc29sdmVkSGFuZGxlcnNEZXNjcmlwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICogDQotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKiAgICAgIA0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb247DQotDQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLS8qKg0KLSAqIEluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gaGFuZGxlcnMgd2hpY2ggaGF2ZSBiZWVuIHJlc29sdmVkIHRvIGEgcGFydGljbHVhciBwb3J0Lg0KLSAqIFRoaXMgaW5mb3JtYXRpb24gY29uc2lzdHMgb2Y6DQotICogLSBUaGUgaGFuZGxlciBpbXBsZW1lbnRhdGlvbiBjbGFzc2VzDQotICogLSBUaGUgbGlzdCBvZiBTT0FQIHJvbGVzIChha2EgU09BUCBBY3RvcnMpDQotICogDQotICogIFRoaXMgaW5mb3JtYXRpb24gaXMgY2FjaGVkIG9uIHRoZSBzZXJ2aWNlIGRlc2NycGlwdGlvbiBzbyB0aGUgaGFuZGxlcnMgZG9uJ3QgDQotICogIGhhdmUgdG8gYmUgcmVzb2x2ZWQgZm9yIG90aGVyIEhhbmRsZXJSZXNvbHZlcnMgcmVxdWVzdGluZyBoYW5kbGVycyBmb3IgdGhlIA0KLSAqICBzYW1lIHBvcnQuDQotICovDQotcHVibGljIGludGVyZmFjZSBSZXNvbHZlZEhhbmRsZXJzRGVzY3JpcHRpb24gew0KLSAgICBwdWJsaWMgdm9pZCBzZXRIYW5kbGVyQ2xhc3NlcyhMaXN0PENsYXNzPiBoYW5kbGVyQ2xhc3Nlcyk7DQotICAgIHB1YmxpYyBMaXN0PENsYXNzPiBnZXRIYW5kbGVyQ2xhc3NlcygpOw0KLSAgICANCi0gICAgcHVibGljIHZvaWQgc2V0Um9sZXMoTGlzdDxTdHJpbmc+IHJvbGUpOw0KLSAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldFJvbGVzKCk7DQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL1NlcnZpY2VEZXNjcmlwdGlvbi5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vU2VydmljZURlc2NyaXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyMjQ0NzguLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vU2VydmljZURlc2NyaXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuU2VydmljZUNsaWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jYXRhbG9nLkpBWFdTQ2F0YWxvZ01hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi54bWwuaGFuZGxlci5IYW5kbGVyQ2hhaW5zVHlwZTsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuUG9ydEluZm87Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBBIFNlcnZpY2VEZXNjcmlwdGlvbiBjb3JyZXNwb25kcyB0byBhIFNlcnZpY2UgdW5kZXIgd2hpY2ggdGhlcmUgY2FuIGJlIGEgY29sbGVjdGlvbiBvZiBlbnBkb2ludHMuCi0gKiBJbiBXU0RMIDEuMSB0ZXJtcywgdGhlbiwgYSBTZXJ2aWNlRGVzY3JpcHRpb24gY29ycmVzcG9uZHMgdG8gYSB3c2RsOlNlcnZpY2UgdW5kZXIgd2hpY2ggdGhlcmUgYXJlCi0gKiBvbmUgb3IgbW9yZSB3c2RsOlBvcnQgZW50cmllcy4gVGhlIFNlcnZpY2VEZXNjcmlwdGlvbiBpcyB0aGUgcm9vdCBvZiB0aGUgbWV0ZGF0YSBhYnN0cmFjdGlvbgotICogRGVzY3JpcHRpb24gaGllcmFjaHkuCi0gKiA8cC8+Ci0gKiBUaGUgRGVzY3JpcHRpb24gaGllcmFjaHkgaXM6Ci0gKiA8cHJlPgotICogU2VydmljZURlc2NyaXB0aW9uCi0gKiAgICAgRW5kcG9pbnREZXNjcmlwdGlvbltdCi0gKiAgICAgICAgIEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24KLSAqICAgICAgICAgICAgIE9wZXJhdGlvbkRlc2NyaXB0aW9uW10KLSAqICAgICAgICAgICAgICAgICBQYXJhbWV0ZXJEZXNjcmlwdGlvbltdCi0gKiAgICAgICAgICAgICAgICAgRmF1bHREZXNjcmlwdGlvbltdCi0gKiA8cC8+Ci0gKiA8Yj5TZXJ2aWNlRGVzY3JpcHRpb24gZGV0YWlsczwvYj4KLSAqIDxwLz4KLSAqICAgICBDT1JSRVNQT05EUyBUTzoKLSAqICAgICAgICAgT24gdGhlIENsaWVudDogVGhlIEpBWC1XUyBTZXJ2aWNlIGNsYXNzIG9yIGdlbmVyYXRlZCBzdWJjbGFzcy4KLSAqIDxwLz4KLSAqICAgICAgICAgT24gdGhlIFNlcnZlcjogVGhlIFNlcnZpY2UgaW1wbGVtZW50YXRpb24uICBOb3RlIHRoYXQgdGhlcmUgaXMgYSAxLi4xCi0gKiAgICAgICAgIGNvcnJlc3BvbmRlbmNlIGJldHdlZW4gYSBTZXJ2aWNlRGVzY3JpcHRpb24gYW5kIEVuZHBvaW50RGVzY3JpcHRpb24KLSAqICAgICAgICAgb24gdGhlIHNlcnZlciBzaWRlLgotICogPHAvPgotICogICAgIEFYSVMyIERFTEVHQVRFOiAgICAgIE5vbmUKLSAqIDxwLz4KLSAqICAgICBDSElMRFJFTjogICAgICAgICAgICAxLi5uIEVuZHBvaW50RGVzY3JpcHRpb24KLSAqIDxwLz4KLSAqICAgICBBTk5PVEFUSU9OUzoKLSAqICAgICAgICAgTm9uZQotICogPHAvPgotICogICAgIFdTREwgRUxFTUVOVFM6Ci0gKiAgICAgICAgIHNlcnZpY2UKLSAqIDxwLz4KLSAqICA8L3ByZT4KLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIFNlcnZpY2VEZXNjcmlwdGlvbiB7Ci0gICAgCi0JcHVibGljIGFic3RyYWN0IEVuZHBvaW50RGVzY3JpcHRpb25bXSBnZXRFbmRwb2ludERlc2NyaXB0aW9ucygpOwotCi0gICAgcHVibGljIGFic3RyYWN0IENvbGxlY3Rpb248RW5kcG9pbnREZXNjcmlwdGlvbj4gZ2V0RW5kcG9pbnREZXNjcmlwdGlvbnNfQXNDb2xsZWN0aW9uKCk7Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgRW5kcG9pbnREZXNjcmlwdGlvbiBnZXRFbmRwb2ludERlc2NyaXB0aW9uKFFOYW1lIHBvcnRRTmFtZSk7Ci0KLSAgICAvLyBDYWxsZWQgdGhlIGNsaWVudC1zaWRlIHRvIHJldHJpZXZlIGRlZmluZWQgYW5kIGR5bmFtaWMgcG9ydHMKLSAgICBwdWJsaWMgYWJzdHJhY3QgRW5kcG9pbnREZXNjcmlwdGlvbiBnZXRFbmRwb2ludERlc2NyaXB0aW9uKFFOYW1lIHBvcnRRTmFtZSwgT2JqZWN0IHNlcnZpY2VEZWxlZ2F0ZUtleSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIEVuZHBvaW50RGVzY3JpcHRpb25zIGNvcnJlc3BvbmRpbmcgdG8gdGhlIFNFSSBjbGFzcy4gIE5vdGUgdGhhdCBEaXNwYXRjaCBlbmRwb2ludHMKLSAgICAgKiB3aWxsIG5ldmVyIGJlIHJldHVybmVkIGJlY2F1c2UgdGhleSBkbyBub3QgaGF2ZSBhbiBhc3NvY2lhdGVkIFNFSS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzZWlDbGFzcwotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgRW5kcG9pbnREZXNjcmlwdGlvbltdIGdldEVuZHBvaW50RGVzY3JpcHRpb24oQ2xhc3Mgc2VpQ2xhc3MpOwotCi0gICAgcHVibGljIGFic3RyYWN0IENvbmZpZ3VyYXRpb25Db250ZXh0IGdldEF4aXNDb25maWdDb250ZXh0KCk7Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgU2VydmljZUNsaWVudCBnZXRTZXJ2aWNlQ2xpZW50KFFOYW1lIHBvcnRRTmFtZSwgT2JqZWN0IHNlcnZpY2VEZWxlZ2F0ZUtleSk7Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgUU5hbWUgZ2V0U2VydmljZVFOYW1lKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIGhhbmRsZXIgY2hhaW4gY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBhcyBhIEhhbmRsZXJDaGFpbnNUeXBlIG9iamVjdC4gIElmIHRoZQotICAgICAqIGtleSBpcyBub24tbnVsbCB0aGVuIGl0IGlzIHVzZWQgdG8gbG9vayBmb3IgaGFuZGxlciBjaGFpbiBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGluIHRoZQotICAgICAqIHNwYXJzZSBtZXRhZGF0YS4gIFRoZSBvcmRlciBpbiB3aGljaCB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBpcyByZXNvbHZlZCBpczoKLSAgICAgKiAxKSBMb29rIGluIHNwYXJzZSBjb21wb3NpdGUgaWYgdGhlIGtleSBpcyBub3QgbnVsbAotICAgICAqIDIpIExvb2sgaW4gdGhlIGNvbXBvc2l0ZQotICAgICAqIDMpIExvb2sgZm9yIGEgSGFuZGxlckNoYWluIGFubm90YXRpb24gYW5kIHJlYWQgaW4gdGhlIGZpbGUgaXQgc3BlY2lmaWVzICAKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc2VydmljZURlbGVnYXRlS2V5IE1heSBiZSBudWxsLiAgSWYgbm9uLW51bGwsIHVzZWQgdG8gbG9vayBmb3Igc2VydmljZS1kZWxlZ2F0ZQotICAgICAqICAgICBzcGVjaWZpYyBzcGFyc2UgY29tcG9zaXRlIGluZm9ybWF0aW9uLgotICAgICAqIEByZXR1cm4gQSBIYW5kbGVyQ2hhaW5zVHlwZSBvYmplY3Qgb3IgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBIYW5kbGVyQ2hhaW5zVHlwZSBnZXRIYW5kbGVyQ2hhaW4oT2JqZWN0IHNlcnZpY2VEZWxlZ2F0ZUtleSk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBoYW5kbGVyIGNoYWluIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gYXMgYSBIYW5kbGVyQ2hhaW5zVHlwZSBvYmplY3QuCi0gICAgICogVGhpcyBpcyB0aGUgc2FtZSBhcyBjYWxsaW5nIGdldEhhbmRsZXJDaGFpbihudWxsKS4KLSAgICAgKiBAc2VlICNnZXRIYW5kbGVyQ2hhaW4oT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBIYW5kbGVyQ2hhaW5zVHlwZSBnZXRIYW5kbGVyQ2hhaW4oKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiB0aGUgcG9ydHMgZm9yIHRoaXMgc2VyaXZjZS4gIFRoZSBwb3J0cyByZXR1cm5lZCBhcmUgdGhlIC0gUG9ydHMgZGVjbGFyZWQKLSAgICAgKiBwb3J0cyBmb3IgdGhpcyBTZXJ2aWNlLiAgVGhleSBjYW4gYmUgZGVsY2FyZWQgaW4gdGhlIFdTREwgb3IgdmlhIGFubm90YXRpb25zLiAtIER5bmFtaWMgcG9ydHMKLSAgICAgKiBhZGRlZCB0byB0aGUgc2VydmljZQotICAgICAqCi0gICAgICogQHBhcmFtIHNlcnZpY2VEZWxlZ2F0ZUtleSBUaGlzIHNob3VsZCBhbHdheXMgYmUgbm9uLW51bGwgd2hlbiBjYWxsZWQgdmlhIFNlcnZpY2VEZWxlZ2F0ZSBhbmQgaXMKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkIHRvIGhlbHAgcmV0cmlldmUgZHluYW1pYyBwb3J0cyBwZXIgY2xpZW50Ci0KLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIExpc3Q8UU5hbWU+IGdldFBvcnRzKE9iamVjdCBzZXJ2aWNlRGVsZWdhdGVLZXkpOwotCi0gICAgcHVibGljIFNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb24gZ2V0U2VydmljZVJ1bnRpbWVEZXNjKFN0cmluZyBuYW1lKTsKLQotICAgIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VSdW50aW1lRGVzYyhTZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uIG9yZCk7Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gaXNTZXJ2ZXJTaWRlKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQW5zd2VyIGlmIE1UT00gaXMgZW5hYmxlZCBmb3IgdGhlIHNlcnZpY2UgcmVwcmVzZW50ZWQgYnkgdGhpcyBTZXJ2aWNlIERlc2NyaXB0aW9uLiAgVGhpcwotICAgICAqIGlzIGN1cnJlbnRseSBvbmx5IHN1cHBvcnRlZCBvbiB0aGUgc2VydmljZS1yZXF1ZXN0ZXIgc2lkZTsgaXQgaXMgbm90IHN1cHBvcnRlZCBvbiB0aGUgCi0gICAgICogc2VydmljZS1wcm92aWRlciBzaWRlLiAgSWYgdGhlIGtleSBpcyBub24tbnVsbCwgaXQgaXMgdXNlZCB0byBsb29rIHVwIGFuIHNwYXJzZSBtZXRhZGF0YQotICAgICAqIHRoYXQgbWF5IGhhdmUgYmVlbiBzcGVjaWZpZWQgd2hlbiB0aGUgU2VydmljZSBEZXNjcmlwdGlvbiB3YXMgY3JlYXRlZC4KLSAgICAgKiAgCi0gICAgICogQHBhcmFtIGtleSBJZiBub24tbnVsbCwgdXNlZCB0byBsb29rIHVwIGFueSBzcGFyc2UgbWV0YWRhdGEgdGhhdCBtYXkgaGF2ZSBiZWVuIHNwZWNpZmllZAotICAgICAqICAgICB3aGVuIHRoZSBzZXJ2aWNlIHdhcyBjcmVhdGVkLgotICAgICAqIEByZXR1cm4gVFJVRSBpZiBtdG9tIHdhcyBlbmFibGVkIGVpdGhlciBpbiB0aGUgc3BhcnNlIG1ldGFkYXRhIG9yIGluIHRoZSBjb21wb3NpdGU7IEZBTFNFCi0gICAgICogICAgIG90aGV3aXNlLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzTVRPTUVuYWJsZWQoT2JqZWN0IGtleSk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQW5zd2VyIGlmIE1UT00gaXMgZW5hYmxlZCBmb3IgdGhlIHNlcnZpY2UgcmVwcmVzZW50ZWQgYnkgdGhpcyBTZXJ2aWNlIERlc2NyaXB0aW9uICAKLSAgICAgKiBhbmQgdGhlIHNlcnZpY2UtZW5kcG9pbnQtaW50ZXJmYWNlIGluZGljYXRlZC4gVGhpcyBpcyBjdXJyZW50bHkgb25seSBzdXBwb3J0ZWQgb24gdGhlIAotICAgICAqIHNlcnZpY2UtcmVxdWVzdGVyIHNpZGU7IGl0IGlzIG5vdCBzdXBwb3J0ZWQgb24gdGhlIHNlcnZpY2UtcHJvdmlkZXIgc2lkZS4gIElmIHRoZSBrZXkgaXMgCi0gICAgICogbm9uLW51bGwsIGl0IGlzIHVzZWQgdG8gbG9vayB1cCBhbiBzcGFyc2UgbWV0YWRhdGEgdGhhdCBtYXkgaGF2ZSBiZWVuIHNwZWNpZmllZCB3aGVuIHRoZSAKLSAgICAgKiBTZXJ2aWNlIERlc2NyaXB0aW9uIHdhcyBjcmVhdGVkLiBJZiB0aGUgc2VpQ2xhc3MgaXMgbm9uLW51bGwgaXQgaXMgdXNlZCB0byBmdXJ0aGVyIHNjb3BlCi0gICAgICogdGhlIGVuYWJsZW1lbnQgb2YgTVRPTSB0byBhIHNwZWNpZmljIFNFSS4KLSAgICAgKiAgCi0gICAgICogQHBhcmFtIGtleSBJZiBub24tbnVsbCwgdXNlZCB0byBsb29rIHVwIGFueSBzcGFyc2UgbWV0YWRhdGEgdGhhdCBtYXkgaGF2ZSBiZWVuIHNwZWNpZmllZAotICAgICAqICAgICB3aGVuIHRoZSBzZXJ2aWNlIHdhcyBjcmVhdGVkLgotICAgICAqIEBwYXJhbSBzZWlDbGFzcyBSZXByZXNlbnRzIGNsaWVudCBzZXJ2aWNlLWVuZHBvaW50LWludGVyZmFjZSBjbGFzcy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFRSVUUgaWYgbXRvbSB3YXMgZW5hYmxlZCBlaXRoZXIgaW4gdGhlIHNwYXJzZSBtZXRhZGF0YSBvciBpbiB0aGUgY29tcG9zaXRlOyBGQUxTRQotICAgICAqICAgICBvdGhld2lzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc01UT01FbmFibGVkKE9iamVjdCBrZXksIENsYXNzIHNlaUNsYXNzKTsKLSAgICAKLSAgICBwdWJsaWMgUU5hbWUgZ2V0UHJlZmVycmVkUG9ydChPYmplY3Qga2V5KTsKLSAgICAKLSAgICBwdWJsaWMgSkFYV1NDYXRhbG9nTWFuYWdlciBnZXRDYXRhbG9nTWFuYWdlcigpOwotCi0gICAgLyoqCi0gICAgICogQW5zd2VyIGluZm9ybWF0aW9uIGZvciByZXNvbHZlZCBoYW5kbGVycyBmb3IgdGhlIGdpdmVuIHBvcnQuICBUaGlzIGluZm9ybWF0aW9uIGlzIHNldAotICAgICAqIHdoZW4gdGhlIGhhbmRsZXIgcmVzb2x2ZXIgaW5pdGlhbGx5IHJlc29sdmVzIHRoZSBoYW5kbGVycyBiYXNlZCBvbiB0aGUgaGFuZGxlciAKLSAgICAgKiBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLiAgSXQgaXMgY2FjaGVkIG9uIHRoZSBzZXJ2aWNlIGRlc2NyaXB0aW9uIGZvciBwZXJmb3JtYW5jZSAKLSAgICAgKiBzbyB0aGF0IHN1YnNlcXVlbnQgcXVlcmllcyBieSBvdGhlciBoYW5kbGVyIHJlc29sdmVycyBmb3IgdGhlIHNhbWUgcG9ydCBkbyBub3QgaGF2ZSB0bwotICAgICAqIHJlLXJlc29sdmUgdGhlIGluZm9ybWF0aW9uIGZyb20gdGhlIGhhbmRsZXIgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi4gIAotICAgICAqIAotICAgICAqIEBwYXJhbSBwb3J0SW5mbyBQb3J0IGZvciB3aGljaCB0aGUgaGFuZGxlciBpbmZvcm1hdGlvbiBpcyBkZXNpcmVkCi0gICAgICogQHJldHVybiBBbiBvYmplY3QgY29udGFpbmluZyBpbmZvcm1hdGlvbiBmb3IgdGhlIHJlc29sdmVkIGhhbmRsZXJzLCBvciBudWxsIGlmIG5vIAotICAgICAqICAgICBpbmZvcm1hdGlvbiBpcyBmb3VuZCBpbiB0aGUgY2FjaGUuCi0gICAgICovCi0gICAgcHVibGljIFJlc29sdmVkSGFuZGxlcnNEZXNjcmlwdGlvbiBnZXRSZXNvbHZlZEhhbmRsZXJzRGVzY3JpcHRpb24oUG9ydEluZm8gcG9ydEluZm8pOwotCi0gICAgLyoqCi0gICAgICogQ2FjaGUgaW5mb3JtYXRpb24gZm9yIGhhbmRsZXJzIHdoaWNoIGhhdmUgYmVlbiByZXNvbHZlZCBmb3IgdGhpcyBwb3J0LiBUaGlzIGluZm9ybWF0aW9uIGlzIHNldAotICAgICAqIHdoZW4gdGhlIGhhbmRsZXIgcmVzb2x2ZXIgaW5pdGlhbGx5IHJlc29sdmVzIHRoZSBoYW5kbGVycyBiYXNlZCBvbiB0aGUgaGFuZGxlciAKLSAgICAgKiBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLiAgSXQgaXMgY2FjaGVkIG9uIHRoZSBzZXJ2aWNlIGRlc2NyaXB0aW9uIGZvciBwZXJmb3JtYW5jZSAKLSAgICAgKiBzbyB0aGF0IHN1YnNlcXVlbnQgcXVlcmllcyBieSBvdGhlciBoYW5kbGVyIHJlc29sdmVycyBmb3IgdGhlIHNhbWUgcG9ydCBkbyBub3QgaGF2ZSB0bwotICAgICAqIHJlLXJlc29sdmUgdGhlIGluZm9ybWF0aW9uIGZyb20gdGhlIGhhbmRsZXIgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi4KLSAgICAgKiAgIAotICAgICAqIEBwYXJhbSBwb3J0SW5mbyBQb3J0IGZvciB3aGljaCB0aGUgaGFuZGxlciBpbmZvcm1hdGlvbiBzaG91bGQgYmUgY2FjaGVkCi0gICAgICogQHBhcmFtIHJlc29sdmVkSGFuZGxlcnNJbmZvIEFuIG9iamVjdCBjb250YWluaW5nIGluZm9ybWF0aW9uIGZvciB0aGUgcmVzb2x2ZWQgaGFuZGxlcnMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRSZXNvbHZlZEhhbmRsZXJzRGVzY3JpcHRpb24oUG9ydEluZm8gcG9ydEluZm8sIFJlc29sdmVkSGFuZGxlcnNEZXNjcmlwdGlvbiByZXNvbHZlZEhhbmRsZXJzSW5mbyk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ2hlY2sgaW50byByZWxlYXNpbmcgcmVzb3VyY2VzIHJlbGF0ZWQgdG8gdGhpcyBTZXJ2aWNlRGVzY3JpcHRpb24uICBUaG9zZSByZXNvdXJjZXMgaW5jbHVkZQotICAgICAqIHRoaXMgU2VydmljZURlc2NyaXB0aW9uIGluc3RhbmNlLCB0aGUgRW5kcG9pbnREZXNjcmlwdGlvbiBpbnN0YW5jZXMgaXQgb3ducyBhbmQgdGhlaXIKLSAgICAgKiBhc3NvY2lhdGVkIEF4aXNTZXJ2aWNlIGFuZCByZWxhdGVkIG9iamVjdHMuICAKLSAgICAgKiAKLSAgICAgKiBOT1RFOiBUaGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBvbiBTZXJ2aWNlRGVzY3JwaXRpb24gaW5zdGFuY2VzIHRoYXQgYXJlIG93bmVkIGJ5Ci0gICAgICogY2xpZW50IFNlcnZpY2VEZWxlZ2F0ZSBpbnN0YW5jZXM7IGl0IFNIT1VMRCBOT1QgYmUgY2FsbGVkIG9uIHNlcnZlci1zaWRlIAotICAgICAqIFNlcnZpY2VEZXNjcmlwdGlvbnMgc2luY2UgdGhvc2UgYXJlIGJ1aWx0IGR1cmluZyBzZXJ2ZXIgc3RhcnQgYW5kIHRoZWlyIGxpZmUtY3ljbGUgaXMKLSAgICAgKiB0aGUgbGlmZS1jeWNsZSBvZiB0aGUgc2VydmVyLgotICAgICAqIAotICAgICAqIEBwYXJhbSBkZWxlZ2F0ZSBUaGUgU2VydmljZURlbGVnYXRlIGluc3RhbmNlIHRoYXQgb3ducyB0aGlzIFNlcnZpY2VEZXNjcmlwdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZWxlYXNlUmVzb3VyY2VzKE9iamVjdCBkZWxlZ2F0ZSk7Ci0gICAgICAgIAotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIGlzIHJlc3BvbnNpYmxlIGZvciBxdWVyeWluZyB0aGUgbWV0YWRhdGEgZm9yIHByb3BlcnRpZXMgYXNzb2NpYXRlZCB3aXRoCi0gICAgICogYSBnaXZlbiBCaW5kaW5nUHJvdmlkZXIgaW5zdGFuY2UuIFRoaXMgaXMgb25seSBhcHBsaWNhYmxlIGZvciB0aGUgcmVxdWVzdG9yLXNpZGUsIGFuZAotICAgICAqIHRoZSBwcm9wZXJ0aWVzIGFyZSBzY29wZWQgYXQgdGhlIHBvcnQgbGV2ZWwuCi0gICAgICogQHBhcmFtIHNlcnZpY2VEZWxlZ2F0ZUtleSBUaGlzIHNob3VsZCBhbHdheXMgYmUgbm9uLW51bGwgd2hlbiBjYWxsZWQgdmlhIFNlcnZpY2VEZWxlZ2F0ZSBhbmQgaXMKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkIHRvIGhlbHAgcmV0cmlldmUgZHluYW1pYyBwb3J0cyBwZXIgY2xpZW50Ci0gICAgICogQHBhcmFtIGtleSBUaGlzIHNob3VsZCBhbHdheXMgYmUgbm9uLW51bGwgYW5kIGlzIHVzZWQgdG8gcmV0cmlldmUgcHJvcGVydGllcyBmb3IgYSBnaXZlbgotICAgICAqICAgICAgICAgICAgY2xpZW50LXNpZGUgcG9ydAotICAgICAqIEByZXR1cm4gCi0gICAgICovCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD4gZ2V0QmluZGluZ1Byb3BlcnRpZXMoT2JqZWN0IHNlcnZpY2VEZWxlZ2F0ZUtleSwgU3RyaW5nIGtleSk7Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL1NlcnZpY2VEZXNjcmlwdGlvbkphdmEuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL1NlcnZpY2VEZXNjcmlwdGlvbkphdmEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjkwZmZiMi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9TZXJ2aWNlRGVzY3JpcHRpb25KYXZhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb247Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU2VydmljZURlc2NyaXB0aW9uSmF2YSB7Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL1NlcnZpY2VEZXNjcmlwdGlvbldTREwuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL1NlcnZpY2VEZXNjcmlwdGlvbldTREwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNhMGFjZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9TZXJ2aWNlRGVzY3JpcHRpb25XU0RMLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnV0aWwuV1NETFdyYXBwZXI7Ci0KLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5Qb3J0OwotaW1wb3J0IGphdmF4LndzZGwuU2VydmljZTsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgU2VydmljZURlc2NyaXB0aW9uV1NETCB7Ci0gICAgcHVibGljIGFic3RyYWN0IFdTRExXcmFwcGVyIGdldFdTRExXcmFwcGVyKCk7Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgV1NETFdyYXBwZXIgZ2V0R2VuZXJhdGVkV3NkbFdyYXBwZXIoKTsKLQotICAgIHB1YmxpYyBTZXJ2aWNlIGdldFdTRExTZXJ2aWNlKCk7Ci0KLSAgICBwdWJsaWMgTWFwIGdldFdTRExQb3J0cygpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIGEgY29sbGVjdGlvbiBvZiBXU0RMIHBvcnRzIHVuZGVyIHRoaXMgc2VydmljZSB3aGljaCB1c2UgdGhlIHBvcnRUeXBlIFFOYW1lLgotICAgICAqCi0gICAgICogQHBhcmFtIHBvcnRUeXBlUU4KLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIExpc3Q8UG9ydD4gZ2V0V1NETFBvcnRzVXNpbmdQb3J0VHlwZShRTmFtZSBwb3J0VHlwZVFOKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybiBhIHN1YnNldCBvZiB0aGUgY29sbGVjdGlvbiBvZiBXU0RMIHBvcnRzIHdoaWNoIHNwZWNpZnkgYSBTT0FQIDEuMSBvciAxLjIgYWRkcmVzcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSB3c2RsUG9ydHMKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIExpc3Q8UG9ydD4gZ2V0V1NETFBvcnRzVXNpbmdTT0FQQWRkcmVzcyhMaXN0PFBvcnQ+IHdzZGxQb3J0cyk7Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFdTRExMb2NhdGlvbigpOwotCi0gICAgcHVibGljIERlZmluaXRpb24gZ2V0V1NETERlZmluaXRpb24oKTsKLQotICAgIHB1YmxpYyBib29sZWFuIGlzV1NETFNwZWNpZmllZCgpOwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbi5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzdkOWNlLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL1NlcnZpY2VSdW50aW1lRGVzY3JpcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbjsKLQotLyoqCi0gKiBBIFNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb24gb2JqZWN0IGNvbnRhaW5zIGltbXV0YWJsZSBkYXRhIHRoYXQgaXMgbmVlZGVkIGR1cmluZyB0aGUgcnVudGltZQotICogKGkuZS4gdG8gZGV0ZWN0IEBSZXNvdXJjZSBpbmplY3Rpb24pLiBUaGUgU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbiBtdXN0IGJlIGltbXV0YWJsZSBzbyB0aGF0IGl0Ci0gKiBjYW4gc2FmZWx5IGFjY2Vzc2VkIGJ5IG11bHRpcGxlIHRoZWFkcyB3aXRob3V0IHN5bmNocm9uaXphdGlvbi4gSXQgY2Fubm90IGJlIHVzZWQgdG8gc3RvcmUKLSAqIGluZm9ybWF0aW9uIHRoYXQgbWF5IG5vdCBiZSBhdmFpbGFibGUgaW4gZGlmZmVyZW50IHRocmVhZHMvIGNsYXNzbG9hZGVycyAoaS5lLiBpdCBjYW5ub3QgaGF2ZQotICogcmVmZXJlbmNlcyB0byBDbGFzcyBvYmplY3RzKQotICogPHAvPgotICogVGhlIGFjdHVhbCBTZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uIG9iamVjdHMgYXJlIGFjY2Vzc2VkIHZpYSB0aGUga2V5LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb24gewotCi0gICAgLyoqIEByZXR1cm4gT3BlcmF0aW9uRGVzYyBwYXJlbnQgKi8KLSAgICBwdWJsaWMgU2VydmljZURlc2NyaXB0aW9uIGdldFNlcnZpY2VEZXNjcmlwdGlvbigpOwotCi0gICAgLyoqIEByZXR1cm4gU3RyaW5nICovCi0gICAgcHVibGljIFN0cmluZyBnZXRLZXkoKTsKLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2J1aWxkZXIvQWN0aW9uQW5ub3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2J1aWxkZXIvQWN0aW9uQW5ub3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTgxZGU5MC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9idWlsZGVyL0FjdGlvbkFubm90LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlcjsKLQotaW1wb3J0IGphdmF4LnhtbC53cy5BY3Rpb247Ci1pbXBvcnQgamF2YXgueG1sLndzLkZhdWx0QWN0aW9uOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247Ci0KLXB1YmxpYyBjbGFzcyBBY3Rpb25Bbm5vdCBpbXBsZW1lbnRzIEFjdGlvbiB7Ci0gICAgCi0gICAgcHJpdmF0ZSBGYXVsdEFjdGlvbltdIGZhdWx0OwotICAgIHByaXZhdGUgU3RyaW5nIGlucHV0OwotICAgIHByaXZhdGUgU3RyaW5nIG91dHB1dDsKLQotICAgIHByaXZhdGUgQWN0aW9uQW5ub3QoKSB7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgQWN0aW9uQW5ub3QoRmF1bHRBY3Rpb25bXSBmYXVsdCwgU3RyaW5nIGlucHV0LCBTdHJpbmcgb3V0cHV0KSB7Ci0gICAgICAgIHRoaXMuZmF1bHQgPSBmYXVsdDsKLSAgICAgICAgdGhpcy5pbnB1dCA9IGlucHV0OwotICAgICAgICB0aGlzLm91dHB1dCA9IG91dHB1dDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBBY3Rpb25Bbm5vdCBjcmVhdGVBY3Rpb25Bbm5vdEltcGwoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgQWN0aW9uQW5ub3QoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBBY3Rpb25Bbm5vdCBjcmVhdGVBY3Rpb25Bbm5vdEltcGwoRmF1bHRBY3Rpb25bXSBmYXVsdCwgU3RyaW5nIGlucHV0LCBTdHJpbmcgb3V0cHV0KSB7Ci0gICAgICAgIHJldHVybiBuZXcgQWN0aW9uQW5ub3QoZmF1bHQsIGlucHV0LCBvdXRwdXQpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRGYXVsdChGYXVsdEFjdGlvbltdIGZhdWx0KSB7Ci0gICAgICAgIHRoaXMuZmF1bHQgPSBmYXVsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRJbnB1dChTdHJpbmcgaW5wdXQpIHsKLSAgICAgICAgdGhpcy5pbnB1dCA9IGlucHV0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE91dHB1dChTdHJpbmcgb3V0cHV0KSB7Ci0gICAgICAgIHRoaXMub3V0cHV0ID0gb3V0cHV0OwotICAgIH0KLQotICAgIHB1YmxpYyBGYXVsdEFjdGlvbltdIGZhdWx0KCkgewotICAgICAgICByZXR1cm4gZmF1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBpbnB1dCgpIHsKLSAgICAgICAgcmV0dXJuIGlucHV0OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgb3V0cHV0KCkgewotICAgICAgICByZXR1cm4gb3V0cHV0OwotICAgIH0KLQotICAgIC8vaG1tLCBzaG91bGQgd2UgcmVhbGx5IGRvIHRoaXMKLSAgICBwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+IGFubm90YXRpb25UeXBlKCkgewotICAgICAgICByZXR1cm4gQW5ub3RhdGlvbi5jbGFzczsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIFN0cmluZyBuZXdMaW5lID0gIlxuIjsKLSAgICAgICAgc2IuYXBwZW5kKG5ld0xpbmUpOwotICAgICAgICBzYi5hcHBlbmQoIkBBY3Rpb24uZmF1bHQ9ICIgKyBmYXVsdCk7Ci0gICAgICAgIHNiLmFwcGVuZChuZXdMaW5lKTsKLSAgICAgICAgc2IuYXBwZW5kKCJAQWN0aW9uLmlucHV0PSAiICsgaW5wdXQpOwotICAgICAgICBzYi5hcHBlbmQobmV3TGluZSk7Ci0gICAgICAgIHNiLmFwcGVuZCgiQEFjdGlvbi5vdXRwdXQ9ICIgKyBvdXRwdXQpOwotICAgICAgICBzYi5hcHBlbmQobmV3TGluZSk7Ci0gICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2J1aWxkZXIvQWRkcmVzc2luZ0Fubm90LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9idWlsZGVyL0FkZHJlc3NpbmdBbm5vdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZGJjMThjLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2J1aWxkZXIvQWRkcmVzc2luZ0Fubm90LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXI7DQotDQotaW1wb3J0IGphdmF4LnhtbC53cy5zb2FwLkFkZHJlc3Npbmc7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247DQotDQotcHVibGljIGNsYXNzIEFkZHJlc3NpbmdBbm5vdCBpbXBsZW1lbnRzIEFkZHJlc3Npbmcgew0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gZW5hYmxlZCA9IHRydWU7DQotICAgIHByaXZhdGUgYm9vbGVhbiByZXF1aXJlZDsNCi0gICAgDQotICAgIHB1YmxpYyBib29sZWFuIGVuYWJsZWQoKSB7DQotICAgICAgICByZXR1cm4gZW5hYmxlZDsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIHZvaWQgc2V0RW5hYmxlZChib29sZWFuIGUpIHsNCi0gICAgICAgIGVuYWJsZWQgPSBlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIHJlcXVpcmVkKCkgew0KLSAgICAgICAgcmV0dXJuIHJlcXVpcmVkOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCBzZXRSZXF1aXJlZChib29sZWFuIHIpIHsNCi0gICAgICAgIHJlcXVpcmVkID0gcjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+IGFubm90YXRpb25UeXBlKCkgew0KLSAgICAgICAgcmV0dXJuIEFkZHJlc3NpbmcuY2xhc3M7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9CaW5kaW5nVHlwZUFubm90LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9idWlsZGVyL0JpbmRpbmdUeXBlQW5ub3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI3ODdmMS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9idWlsZGVyL0JpbmRpbmdUeXBlQW5ub3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyOwotCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKLQotcHVibGljIGNsYXNzIEJpbmRpbmdUeXBlQW5ub3QgaW1wbGVtZW50cyBqYXZheC54bWwud3MuQmluZGluZ1R5cGUgewotCi0gICAgcHJpdmF0ZSBTdHJpbmcgdmFsdWUgPSAiIjsKLQotICAgIC8qKiBBIEJpbmRpbmdUeXBlQW5ub3QgY2Fubm90IGJlIGluc3RhbnRpYXRlZC4gKi8KLSAgICBwcml2YXRlIEJpbmRpbmdUeXBlQW5ub3QoKSB7Ci0KLSAgICB9Ci0KLSAgICBwcml2YXRlIEJpbmRpbmdUeXBlQW5ub3QoU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEJpbmRpbmdUeXBlQW5ub3QgY3JlYXRlQmluZGluZ1R5cGVBbm5vdEltcGwoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgQmluZGluZ1R5cGVBbm5vdCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQmluZGluZ1R5cGVBbm5vdCBjcmVhdGVCaW5kaW5nVHlwZUFubm90SW1wbChTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBCaW5kaW5nVHlwZUFubm90KHZhbHVlKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBCaW5kaW5nVHlwZUFubm90IGNyZWF0ZUZyb21Bbm5vdGF0aW9uKEFubm90YXRpb24gYW5ub3RhdGlvbikgewotICAgICAgICBCaW5kaW5nVHlwZUFubm90IHJldHVybkFubm90ID0gbnVsbDsKLSAgICAgICAgaWYgKGFubm90YXRpb24gIT0gbnVsbCAmJiBhbm5vdGF0aW9uIGluc3RhbmNlb2YgamF2YXgueG1sLndzLkJpbmRpbmdUeXBlKSB7Ci0gICAgICAgICAgICBqYXZheC54bWwud3MuQmluZGluZ1R5cGUgYnQgPSAoamF2YXgueG1sLndzLkJpbmRpbmdUeXBlKSBhbm5vdGF0aW9uOwotICAgICAgICAgICAgcmV0dXJuQW5ub3QgPSBuZXcgQmluZGluZ1R5cGVBbm5vdChidC52YWx1ZSgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0dXJuQW5ub3Q7Ci0gICAgfQotCi0gICAgLyoqIEByZXR1cm4gUmV0dXJucyB0aGUgdmFsdWUuICovCi0gICAgcHVibGljIFN0cmluZyB2YWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIC8qKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC4gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwotICAgIH0KLQotICAgIC8vaG1tLCBzaG91bGQgd2UgcmVhbGx5IGRvIHRoaXMKLSAgICBwdWJsaWMgQ2xhc3M8QW5ub3RhdGlvbj4gYW5ub3RhdGlvblR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBBbm5vdGF0aW9uLmNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgdW5pdCB0ZXN0aW5nLiBXZSB3aWxsIHByaW50IGFsbCBvZiB0aGUKLSAgICAgKiBkYXRhIG1lbWJlcnMgaGVyZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIFN0cmluZyBuZXdMaW5lID0gIlxuIjsKLSAgICAgICAgc2IuYXBwZW5kKG5ld0xpbmUpOwotICAgICAgICBzYi5hcHBlbmQoIkBCaW5kaW5nVHlwZS52YWx1ZT0gIiArIHZhbHVlKTsKLSAgICAgICAgc2IuYXBwZW5kKG5ld0xpbmUpOwotICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9DdXN0b21Bbm5vdGF0aW9uSW5zdGFuY2UuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2J1aWxkZXIvQ3VzdG9tQW5ub3RhdGlvbkluc3RhbmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwMWViZmUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9DdXN0b21Bbm5vdGF0aW9uSW5zdGFuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlcjsNCi0NCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGU7DQotDQotLyoqDQotICogVGhpcyBpbnRlcmZhY2UgaXMgaW50ZW5kZWQgdG8gcmVwcmVzZW50IGFubm90YXRpb24gaW5zdGFuY2VzIA0KLSAqIHRoYXQgYXJlIG5vdCBleHBsaWNpdGx5IGRlZmluZWQgYnkgdGhlIE1EUSBsYXllci4gVGhpcyB3aWxsIA0KLSAqIGFsbG93IHRoZSB1c2Ugb2YgY3VzdG9tIGFubm90YXRpb25zIG9yIHRob3NlIG91dHNpZGUgdGhlIHNjb3BlIA0KLSAqIG9mIHRoZSBtZXRhZGF0YSB0aGF0IGlzIGludGVuZGVkIGZvciB1c2Ugd2l0aGluIE1EUS4gVGhlIHByb3ZpZGVyDQotICogb2YgQ3VzdG9tQW5ub3RhdGlvbkluc3RhbmNlcyB3aWxsIGJlIHJlc3BvbnNiaWxlIGZvciBtYXBwaW5nDQotICogc3BlY2lmaWMgQ3VzdG9tQW5ub3RhdGlvbkluc3RhbmNlIGltcGxlbWVudGF0aW9ucyB0byBhY3R1YWwNCi0gKiBhbm5vdGF0aW9uIHR5cGVzLg0KLSAqDQotICovDQotcHVibGljIGludGVyZmFjZSBDdXN0b21Bbm5vdGF0aW9uSW5zdGFuY2Ugew0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFRoaXMgcmV0dXJucyBhIHN0cmluZyB0aGF0IHJlcHJlc2VudHMgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lDQotICAgICAqIG9mIHRoZSBhbm5vdGF0aW9uIHR5cGUgdGhpcyBpbnN0YW5jZSByZXByZXNlbnRzLg0KLSAgICAgKi8NCi0gICAgcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uQ2xhc3NOYW1lKCk7DQotICAgIA0KLSAgICAvKioNCi0gICAgICogVGhpcyBzZXRzIGEgc3RyaW5nIHRoYXQgcmVwcmVzZW50cyB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUNCi0gICAgICogb2YgdGhlIGFubm90YXRpb24gdHlwZSB0aGlzIGluc3RhbmNlIHJlcHJlc2VudHMuDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBzZXRBbm5vdGF0aW9uQ2xhc3NOYW1lKFN0cmluZyBhbm5vdGF0aW9uQ2xhc3NOYW1lKTsNCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBUaGlzIG1ldGhvZCBzZXRzIHRoZSBFbGVtZW50VHlwZSBFbnVtIHRoYXQgcmVwcmVzZW50cyB0aGUNCi0gICAgICogdGFyZ2V0IGZvciB0aGlzIGFubm90YXRpb24gaW5zdGFuY2UuDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBzZXRUYXJnZXQoRWxlbWVudFR5cGUgZWxlbWVudFR5cGUpOw0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIEVsZW1lbnRUeXBlIEVudW0gdGhhdCByZXByZXNlbnRzDQotICAgICAqIHRoZSB0YXJnZXQgZm9yIHRoaXMgYW5ub3RhdGlvbiBpbnN0YW5jZS4NCi0gICAgICovDQotICAgIHB1YmxpYyBFbGVtZW50VHlwZSBnZXRUYXJnZXQoKTsNCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBUaGlzIG1ldGhvZCBzdG9yZXMgcGFyYW1ldGVyIGRhdGEgaW4gdGhlIEN1c3RvbUFubm90YXRpb25JbnN0YW5jZQ0KLSAgICAgKiBiYXNlZCBvbiB0aGUga2V5IHRoYXQgaXMgc3VwcGxpZWQuDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBhZGRQYXJhbWV0ZXJEYXRhKFN0cmluZyBwYXJhbU5hbWUsIE9iamVjdCBwYXJhbVZhbHVlKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uOw0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFRoaXMgbWV0aG9kIHJldHJpZXZlcyB0aGUgcGFyYW1ldGVyIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbg0KLSAgICAgKiBwYXJhbWV0ZXIgbmFtZS4NCi0gICAgICovDQotICAgIHB1YmxpYyBPYmplY3QgZ2V0UGFyYW1ldGVyRGF0YShTdHJpbmcgcGFyYW1OYW1lKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uOw0KLSAgICANCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9DdXN0b21Bbm5vdGF0aW9uUHJvY2Vzc29yLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9idWlsZGVyL0N1c3RvbUFubm90YXRpb25Qcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVlYzc1Ny4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9idWlsZGVyL0N1c3RvbUFubm90YXRpb25Qcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5FbmRwb2ludERlc2NyaXB0aW9uOw0KLQ0KLS8qKg0KLSAqIFRoaXMgaW50ZXJmYWNlIHJlcHJlc2VudHMgcHJvY2Vzc29ycyB0aGF0IHdpbGwgYmUgdXNlZCB0byANCi0gKiBoYW5kbGUgQ3VzdG9tQW5ub3RhdGlvbkluc3RhbmNlcyB0aGF0IGFyZSBhZGRlZCB0byB0aGUgTURRIGxheWVyIA0KLSAqIGJ5IHRoZSB1YXNlci4gVGhlc2UgcHJvY2Vzc29ycyB3aWxsIGFsc28gYmUgcmVnaXN0ZXJlZCB3aXRoIA0KLSAqIE1EUSwgYW5kIHRoZXkgd2lsbCBiZSBjYWxsZWQgYnkgTURRIGFzIG5lZWRlZC4gDQotICoNCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIEN1c3RvbUFubm90YXRpb25Qcm9jZXNzb3Igew0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFRoaXMgbWV0aG9kIHNldHMgdGhlIGZ1bGx5IHF1YWxpZmVkIG5hbWUgb2YgdGhlIA0KLSAgICAgKiBDdXN0b21Bbm5vdGF0aW9uSW5zdGFuY2UgY2xhc3MgdGhhdCB0aGlzIHByb2Nlc3Nvcg0KLSAgICAgKiBpcyByZXNwb25zaWJsZSBmb3IgaGFuZGxpbmcuDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBzZXRBbm5vdGF0aW9uSW5zdGFuY2VDbGFzc05hbWUoU3RyaW5nIGFubm90YXRpb25JbnN0YW5jZUNsYXNzTmFtZSk7DQotICAgIA0KLSAgICAvKioNCi0gICAgICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgZnVsbHkgcXVhbGlmZWQgbmFtZSBvZiB0aGUgDQotICAgICAqIEN1c3RvbUFubm90YXRpb25JbnN0YW5jZSBjbGFzcyB0aGF0IHRoaXMgcHJvY2Vzc29yDQotICAgICAqIGlzIHJlc3BvbnNpYmxlIGZvciBoYW5kbGluZy4NCi0gICAgICovDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbkluc3RhbmNlQ2xhc3NOYW1lKCk7DQotICAgIA0KLSAgICAvKioNCi0gICAgICogVGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgdG8gcHJvY2VzcyBhbiBhbm5vdGF0aW9uIHR5cGUNCi0gICAgICogcmVjb2duaXplZCBieSB0aGlzIHByb2Nlc3NvciB0aGF0IHdhcyBmb3VuZCBhdCB0aGUgdHlwZQ0KLSAgICAgKiBsZXZlbC4NCi0gICAgICogQHBhcmFtIGVkIC0gRW5kcG9pbnREZXNjcmlwdGlvbiB0aGF0IHRoZSBhbm5vdGF0aW9uIHdhcyBhc3NvY2lhdGVkIHdpdGgNCi0gICAgICogQHBhcmFtIGFubm90YXRpb24gLSBUaGUgQ3VzdG9tQW5ub3RhdGlvbkluc3RhbmNlIHRoYXQgc2hvdWxkIGJlIHByb2Nlc3NlZA0KLSAgICAgKiBieSB0aGlzIHByb2Nlc3Nvcg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgcHJvY2Vzc1R5cGVMZXZlbEFubm90YXRpb24oRW5kcG9pbnREZXNjcmlwdGlvbiBlZCwgQ3VzdG9tQW5ub3RhdGlvbkluc3RhbmNlIGFubm90YXRpb24pOw0KLQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9idWlsZGVyL0Rlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9EZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzFmYjkyZi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9idWlsZGVyL0Rlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLkV4Y2VwdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jYXRhbG9nLkpBWFdTQ2F0YWxvZ01hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi54bWwuaGFuZGxlci5IYW5kbGVyQ2hhaW5zVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmkxOG4uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51dGlsLldTREw0SldyYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuV2Vha0hhc2hNYXA7Ci0KLXB1YmxpYyBjbGFzcyBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgaW1wbGVtZW50cyBUTUFubm90YXRpb25Db21wb3NpdGUsIFRNRkFubm90YXRpb25Db21wb3NpdGUgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZS5jbGFzcyk7Ci0KLSAgICAvKgotICAgICAgKiBUaGlzIHN0cnVjdHVyZSBjb250YWlucyB0aGUgZnVsbCByZWZsZWN0ZWQgY2xhc3MsIGFzIHdlbGwgYXMsIHRoZQotICAgICAgKiBwb3NzaWJsZSBhbm5vdGF0aW9ucyBmb3VuZCBmb3IgdGhpcyBjbGFzcy4uLnRoZSBjbGFzcyBkZXNjcmlwdGlvbgotICAgICAgKiBtdXN0IGJlIGNvbXBsZXRlIGVub3VnaCBmb3IgZnVsbCB2YWxpZGF0aW9uIGJldHdlZW4gY2xhc3MgaW5mbyBhbmQgYW5ub3RhdGlvbnMKLSAgICAgICogVGhlIGFubm90YXRpb25zIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgY2xhc3MgbWVtYmVycy4KLSAgICAgICovCi0KLSAgICBwdWJsaWMgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCkgewotICAgICAgICB0aGlzKChDb25maWd1cmF0aW9uQ29udGV4dCludWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQpIHsKLSAgICAgICAgbXlDb25maWdDb250ZXh0ID0gY29uZmlnQ29udGV4dDsKLSAgICAgICAgbWV0aG9kRGVzY3JpcHRpb25zID0gbmV3IEFycmF5TGlzdDxNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZT4oKTsKLSAgICAgICAgZmllbGREZXNjcmlwdGlvbnMgPSBuZXcgQXJyYXlMaXN0PEZpZWxkRGVzY3JpcHRpb25Db21wb3NpdGU+KCk7Ci0gICAgICAgIHdlYlNlcnZpY2VSZWZBbm5vdExpc3QgPSBuZXcgQXJyYXlMaXN0PFdlYlNlcnZpY2VSZWZBbm5vdD4oKTsKLSAgICAgICAgaW50ZXJmYWNlc0xpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgZ2VuZXJpY0Fubm90YXRpb25JbnN0YW5jZXMgPSBuZXcgQXJyYXlMaXN0PEN1c3RvbUFubm90YXRpb25JbnN0YW5jZT4oKTsKLSAgICAgICAgZ2VuZXJpY0Fubm90YXRpb25Qcm9jZXNzb3JzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBDdXN0b21Bbm5vdGF0aW9uUHJvY2Vzc29yPigpOwotICAgICAgICBwcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0gICAgfQotCi0gICAgLy9Ob3RlOiBhIFdTREwgaXMgbm90IG5lY2Vzc2FyeQotICAgIHByaXZhdGUgRGVmaW5pdGlvbiB3c2RsRGVmaW5pdGlvbiA9IG51bGw7Ci0gICAgcHJpdmF0ZSBVUkwgd3NkbFVSTCA9IG51bGw7Ci0gICAgcHJpdmF0ZSBXU0RMNEpXcmFwcGVyIHdzZGxXcmFwcGVyID0gbnVsbDsKLQotICAgIHByaXZhdGUgQ29uZmlndXJhdGlvbkNvbnRleHQgbXlDb25maWdDb250ZXh0OwotICAgIAotICAgIC8vIENsYXNzLWxldmVsIGFubm90YXRpb25zCi0gICAgcHJpdmF0ZSBXZWJTZXJ2aWNlQW5ub3Qgd2ViU2VydmljZUFubm90OwotICAgIHByaXZhdGUgV2ViU2VydmljZVByb3ZpZGVyQW5ub3Qgd2ViU2VydmljZVByb3ZpZGVyQW5ub3Q7Ci0gICAgcHJpdmF0ZSBTZXJ2aWNlTW9kZUFubm90IHNlcnZpY2VNb2RlQW5ub3Q7Ci0gICAgcHJpdmF0ZSBXZWJTZXJ2aWNlQ2xpZW50QW5ub3Qgd2ViU2VydmljZUNsaWVudEFubm90OwotICAgIHByaXZhdGUgV2ViRmF1bHRBbm5vdCB3ZWJGYXVsdEFubm90OwotICAgIHByaXZhdGUgSGFuZGxlckNoYWluQW5ub3QgaGFuZGxlckNoYWluQW5ub3Q7Ci0gICAgcHJpdmF0ZSBTb2FwQmluZGluZ0Fubm90IHNvYXBCaW5kaW5nQW5ub3Q7Ci0gICAgcHJpdmF0ZSBMaXN0PFdlYlNlcnZpY2VSZWZBbm5vdD4gd2ViU2VydmljZVJlZkFubm90TGlzdDsKLSAgICBwcml2YXRlIEJpbmRpbmdUeXBlQW5ub3QgYmluZGluZ1R5cGVBbm5vdDsKLSAgICAKLSAgICAvLyBDb2xsZWN0aW9uIG9mIFBvcnRDb21wb3NpdGUgb2JqZWN0cyB3aGljaCB3ZXJlIGNyZWF0ZWQgZnJvbQotICAgIC8vIHRoaXMgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIGluc3RhbmNlCi0gICAgcHJpdmF0ZSBMaXN0PFBvcnRDb21wb3NpdGU+IHBvcnRDb21wb3NpdGVMaXN0ID0gbmV3IEFycmF5TGlzdDxQb3J0Q29tcG9zaXRlPigpOwotICAgIAotICAgIHByaXZhdGUgTGlzdDxBbm5vdGF0aW9uPiBmZWF0dXJlczsKLSAgICAKLSAgICBwcml2YXRlIE1hcDxRTmFtZSwgRGVmaW5pdGlvbj4gd3NkbERlZnMgPSBuZXcgSGFzaE1hcDxRTmFtZSwgRGVmaW5pdGlvbj4oKTsKLSAgICAKLSAgICBwcml2YXRlIE1hcDxRTmFtZSwgVVJMPiB3c2RsVVJMcyA9IG5ldyBIYXNoTWFwPFFOYW1lLCBVUkw+KCk7Ci0gICAgCi0gICAgcHJpdmF0ZSBTZXQ8UU5hbWU+IHNlcnZpY2VRTmFtZXMgPSBuZXcgSGFzaFNldDxRTmFtZT4oKTsKLSAgICAKLSAgICBwcml2YXRlIE1hcDxRTmFtZSwgTGlzdDxQb3J0Q29tcG9zaXRlPj4gc1FOYW1lVG9QQyA9IG5ldyBIYXNoTWFwPFFOYW1lLCBMaXN0PFBvcnRDb21wb3NpdGU+PigpOwotICAgIAotICAgIC8vIENsYXNzIGluZm9ybWF0aW9uCi0gICAgcHJpdmF0ZSBTdHJpbmcgY2xhc3NOYW1lOwotICAgIC8qKgotICAgICAqIEdldCBhbiBhbm5vdGF0aW9uIGJ5IGludHJvc3BlY3Rpbmcgb24gYSBjbGFzcy4gIFRoaXMgaXMgd3JhcHBlcmVkIHRvIGF2b2lkIGEgSmF2YTJTZWN1cml0eSB2aW9sYXRpb24uCi0gICAgICogQHBhcmFtIGNscyBDbGFzcyB0aGF0IGNvbnRhaW5zIGFubm90YXRpb24gCi0gICAgICogQHBhcmFtIGFubm90YXRpb24gQ2xhc3Mgb2YgcmVxdXJlc3RlZCBBbm5vdGF0aW9uCi0gICAgICogQHJldHVybiBhbm5vdGF0aW9uIG9yIG51bGwKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBBbm5vdGF0aW9uIGdldEFubm90YXRpb25Gcm9tQ2xhc3MoZmluYWwgQ2xhc3MgY2xzLCBmaW5hbCBDbGFzcyBhbm5vdGF0aW9uKSB7Ci0gICAgICAgIHJldHVybiAoQW5ub3RhdGlvbikgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRBY3Rpb24oKSB7Ci0gICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBBbm5vdGF0aW9uIGEgPSBjbHMuZ2V0QW5ub3RhdGlvbihhbm5vdGF0aW9uKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gYTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmdbXSBjbGFzc01vZGlmaWVyczsgLy9wdWJsaWMsIGFic3RyYWN0LCBmaW5hbCwgc3RyaWN0ZnAuLi4KLSAgICBwcml2YXRlIFN0cmluZyBleHRlbmRzQ2xhc3M7ICAgIC8vU2V0IHRvIHRoZSBuYW1lIG9mIHRoZSBzdXBlciBjbGFzcwotICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IGludGVyZmFjZXNMaXN0OyAvL1NldCB0aGlzIGZvciBhbGwgaW1wbGVtZW50ZWQgaW50ZXJmYWNlcwotICAgIHByaXZhdGUgYm9vbGVhbiBpc0ludGVyZmFjZSA9IGZhbHNlOwotICAgIHByaXZhdGUgUU5hbWUgcHJlZmVycmVkUG9ydDsgICAgICAgIC8vIFBvcnQgdG8gdXNlIGlmIG5vIHBvcnQgUU5hbWUgZ2l2ZW4uICBNYXkgYmUgbnVsbAotICAgIHByaXZhdGUgYm9vbGVhbiBpc01UT01FbmFibGVkID0gZmFsc2U7Ci0gICAgCi0gICAgcHJpdmF0ZSBMaXN0PE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlPiBtZXRob2REZXNjcmlwdGlvbnM7Ci0gICAgcHJpdmF0ZSBMaXN0PEZpZWxkRGVzY3JpcHRpb25Db21wb3NpdGU+IGZpZWxkRGVzY3JpcHRpb25zOwotICAgIAotICAgIC8vIHdlIGNhbiBrZWVwIHRoZXNlIGluIGEgc2luZ3VsYXIgbGlzdCBiL2MgZm9yIGEgZ2l2ZW4gdHlwZS1sZXZlbCBhbm5vdGF0aW9uCi0gICAgLy8gdGhlcmUgY2FuIG9ubHkgb25lIGluc3RhbmNlIG9mIHRoZSBhbm5vdGF0aW9uCi0gICAgcHJpdmF0ZSBMaXN0PEN1c3RvbUFubm90YXRpb25JbnN0YW5jZT4gZ2VuZXJpY0Fubm90YXRpb25JbnN0YW5jZXM7Ci0gICAgCi0gICAgLy8gYSBtYXAgdGhhdCBzdG9yZXMgYWxsIHRoZSB0eXBlLXRhcmdldHRlZCBHZW5lcmljQW5ub3RhdGlvblByb2Nlc3NvciBpbnN0YW5jZXMKLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIEN1c3RvbUFubm90YXRpb25Qcm9jZXNzb3I+IGdlbmVyaWNBbm5vdGF0aW9uUHJvY2Vzc29yczsKLQotICAgIHByaXZhdGUgV3NkbEdlbmVyYXRvciB3c2RsR2VuZXJhdG9yOwotICAgIHByaXZhdGUgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXI7Ci0gICAgCi0gICAgLy8gSkFYQiBvYmplY3QgdXNlZCB0byByZXByZXNlbnQgaGFuZGxlciBjaGFpbiBjb25maWd1cmF0aW9uIGluZm8KLSAgICAvLyBlaXRoZXIgdGhpcyBvciB0aGUgSGFuZGxlckNoYWluQW5ub3QgbWF5IGJlIHByZXNlbnQsIGJ1dCAKLSAgICAvLyBub3QgYm90aCwgdGhleSBtYXkgYm90aCBiZSBudWxsCi0gICAgcHJpdmF0ZSBIYW5kbGVyQ2hhaW5zVHlwZSBoYW5kbGVyQ2hhaW5zVHlwZSA9IG51bGw7Ci0gICAgCi0gICAgLy8gRG9lcyB0aGlzIGNvbXBvc2l0ZSByZXByZXNlbnQgYSBzZXJ2aWNlIHJlcXVlc3RlciBvciBzZXJ2aWNlIHByb3ZpZGVyLgotICAgIC8vIFdlIGRlZmF1bHQgdG8gc2VydmljZSBwcm92aWRlciBzaW5jZSBjb21wb3NpdGVzIHdlcmUgb3JnaW5hbGx5IG5vdCB1c2VkIGJ5IHJlcXVlc3RlcnMuCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzU2VydmljZVByb3ZpZGVyID0gdHJ1ZTsKLSAgICAKLSAgICAvLyBGb3IgYSBzZXJ2aWNlIHJlcXVlc3RlciwgdGhpcyB3aWxsIGJlIHRoZSBjbGllbnQtc2lkZSBjbGFzcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb21wb3NpdGU7IAotICAgIC8vIEl0IGNvdWxkIGJlIHRoZSBTZXJ2aWNlIGNsYXNzIG9yIHRoZSBTRUkgY2xhc3MuICBPbiB0aGUgc2VydmljZSBwcm92aWRlciB0aGlzIHdpbGwgYmUgbnVsbAotICAgIC8vIHVubGVzcyB0aGUgZGVwcmVjYXRlZCBzZXJ2aWNlIGNvbnN0cnVjdGlvbiBsb2dpYyBpbiBEZXNjcmlwdGlvbkZhY3Rvcnkgd2FzIHVzZWQuCi0gICAgcHJpdmF0ZSBDbGFzcyB0aGVDb3JyZXNwb25kaW5nQ2xhc3M7Ci0gICAgCi0gICAgLy8gU2VydmljZS1yZXF1ZXN0ZXJzIChha2EgY2xpZW50cykgY2FuIHNwZWNpZnkgYSBzcHJhc2UgY29tcG9zaXRlIHRoYXQgbWF5IGNvbnRhaW4gYW5ub3RhdGlvbgotICAgIC8vIGluZm9ybWF0aW9uIGNvcnJlc3BvbmRpbmcgdG8gaW5mb3JtYXRpb24gaW4gYSBkZXBsb3ltZW50IGRlc2NyaXB0b3Igb3IgYW4gaW5qZWN0ZWQgCi0gICAgLy8gcmVzb3VyY2UuCi0gICAgcHJpdmF0ZSBXZWFrSGFzaE1hcDxPYmplY3QsIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZT4gc3BhcnNlQ29tcG9zaXRlTWFwID0gbmV3IFdlYWtIYXNoTWFwPE9iamVjdCwgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlPigpOwotICAgIAotICAgIC8vIEFsbG93IGEgdW5pcXVlIFhNTCBDYXRhbG9nTWFuYWdlciBwZXIgc2VydmljZSBkZXNjcmlwdGlvbi4KLSAgICBwcml2YXRlIEpBWFdTQ2F0YWxvZ01hbmFnZXIgY2F0YWxvZ01hbmFnZXIgPSBudWxsOwotICAgIAotICAgIC8vIFRoaXMgaXMgYSBiYWcgb2YgcHJvcGVydGllcyB0aGF0IGFwcGx5IHRvIHRoZSBEQkMuIEN1cnJlbnRseSB0aGVzZSBwcm9wZXJ0aWVzIHdpbGwgYmUKLSAgICAvLyBjb3BpZWQgb3ZlciBmcm9tIHRoZSBEQkMgdG8gdGhlIGRlc2NyaXB0aW9uIGhpZXJhcmNoeS4gVGhpcyB3aWxsIG9ubHkgb2NjdXIgb24gdGhlCi0gICAgLy8gc2VydmVyLXNpZGUgZm9yIG5vdwotICAgIHByaXZhdGUgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzID0gbnVsbDsKLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRTcGFyc2VDb21wb3NpdGUoT2JqZWN0IGtleSwgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIHNwYXJzZUNvbXBvc2l0ZSkgewotICAgICAgICBpZiAoa2V5ICE9IG51bGwgJiYgc3BhcnNlQ29tcG9zaXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRoaXMuc3BhcnNlQ29tcG9zaXRlTWFwLnB1dChrZXksIHNwYXJzZUNvbXBvc2l0ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcHVibGljIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBnZXRTcGFyc2VDb21wb3NpdGUoT2JqZWN0IGtleSkgewotICAgICAgICByZXR1cm4gc3BhcnNlQ29tcG9zaXRlTWFwLmdldChrZXkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZvciBhIHNlcnZpY2UgcmVxdWVzdGVyLCBzZXQgdGhlIFFOYW1lIG9mIHRoZSBwcmVmZXJyZWQgcG9ydCBmb3IgdGhpcyBzZXJ2aWNlLiAgVGhpcwotICAgICAqIGluZGljYXRlcyB3aGljaCBwb3J0IChpLmUuIHdoaWNoIEVuZHBvaW50RGVzY3JpcHRpb24pIHNob3VsZCBiZSByZXR1cm5lZCBpZiBhIHBvcnQgUU5hbWUKLSAgICAgKiBpc24ndCBzcGVjaWZpZWQuICBUaGlzIG1heSBiZSBudWxsLCBpbmRpY2F0aW5nIHRoZSBmaXJzdCB2YWxpZCBwb3J0IGluIHRoZSBXU0RMIHNob3VsZCBiZQotICAgICAqIHJldHVybmVkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwcmVmZXJyZWRQb3J0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UHJlZmVycmVkUG9ydChRTmFtZSBwcmVmZXJyZWRQb3J0KSB7Ci0gICAgICAgIHRoaXMucHJlZmVycmVkUG9ydCA9IHByZWZlcnJlZFBvcnQ7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEZvciBhIHNlcnZpY2UgcmVxdWVzdGVyLCB0aGUgUU5hbWUgb2YgdGhlIHByZWZlcmVkIHBvcnQgZm9yIHRoaXMgc2VydmljZS4gIFRoaXMgaW5kaWNhdGVzCi0gICAgICogd2hpY2ggcG9ydCBzaG91bGQgYmUgcmV0dXJuZWQgaWYgYSBwb3J0IFFOYW1lIHdhc24ndCBzcGVjaWZpZWQuICBUaGlzIG1heSBiZSBudWxsLCAKLSAgICAgKiBpbmRpY2F0aW5nIHRoZSBmaXJzdCB2YWxpZCBwb3J0IGluIHRoZSBXU0RMIHNob3VsZCBiZSByZXR1cm5lZC4KLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIFFOYW1lIGdldFByZWZlcnJlZFBvcnQoKSB7Ci0gICAgICAgIHJldHVybiBwcmVmZXJyZWRQb3J0OwotICAgIH0KLSAgICBwdWJsaWMgUU5hbWUgZ2V0UHJlZmVycmVkUG9ydChPYmplY3Qga2V5KSB7Ci0gICAgICAgIFFOYW1lIHJldHVyblByZWZlcnJlZFBvcnQgPSBudWxsOwotICAgICAgICAvLyBTZWUgaWYgdGhlcmUncyBhIHNwYXJzZSBjb21wb3NpdGUgb3ZlcnJpZGUgZm9yIHRoaXMgY29tcG9zaXRlCi0gICAgICAgIGlmIChrZXkgIT0gbnVsbCkgewotICAgICAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIHNwYXJzZSA9IGdldFNwYXJzZUNvbXBvc2l0ZShrZXkpOwotICAgICAgICAgICAgaWYgKHNwYXJzZSAhPSBudWxsIAotICAgICAgICAgICAgICAgICYmICFEZXNjcmlwdGlvbkJ1aWxkZXJVdGlscy5pc0VtcHR5KHNwYXJzZS5nZXRQcmVmZXJyZWRQb3J0KCkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuUHJlZmVycmVkUG9ydCA9IHNwYXJzZS5nZXRQcmVmZXJyZWRQb3J0KCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVyblByZWZlcnJlZFBvcnQgPSBnZXRQcmVmZXJyZWRQb3J0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm5QcmVmZXJyZWRQb3J0ID0gZ2V0UHJlZmVycmVkUG9ydCgpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gcmV0dXJuUHJlZmVycmVkUG9ydDsKLSAgICAgICAgCi0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldElzTVRPTUVuYWJsZWQoYm9vbGVhbiBpc01UT01FbmFibGVkKSB7Ci0gICAgICAgIHRoaXMuaXNNVE9NRW5hYmxlZCA9IGlzTVRPTUVuYWJsZWQ7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIGlzTVRPTUVuYWJsZWQoKSB7Ci0gICAgICAgIHJldHVybiBpc01UT01FbmFibGVkOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc01UT01FbmFibGVkKE9iamVjdCBrZXkpIHsKLSAgICAgICAgYm9vbGVhbiByZXR1cm5Jc01UT01FbmFibGVkID0gZmFsc2U7Ci0gICAgICAgIGlmIChrZXkgIT0gbnVsbCkgewotICAgICAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIHNwYXJzZURCQyA9IGdldFNwYXJzZUNvbXBvc2l0ZShrZXkpOwotICAgICAgICAgICAgaWYgKHNwYXJzZURCQyAhPSBudWxsICYmIHNwYXJzZURCQy5pc01UT01FbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm5Jc01UT01FbmFibGVkID0gc3BhcnNlREJDLmlzTVRPTUVuYWJsZWQoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuSXNNVE9NRW5hYmxlZCA9IGlzTVRPTUVuYWJsZWQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuSXNNVE9NRW5hYmxlZCA9IGlzTVRPTUVuYWJsZWQoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHJldHVybklzTVRPTUVuYWJsZWQ7Ci0gICAgfQotICAgIAotICAgIC8vIE1ldGhvZHMKLSAgICBwdWJsaWMgV2ViU2VydmljZUFubm90IGdldFdlYlNlcnZpY2VBbm5vdCgpIHsKLSAgICAgICAgcmV0dXJuIHdlYlNlcnZpY2VBbm5vdCA9IAotICAgICAgICAgICAgKFdlYlNlcnZpY2VBbm5vdCkgZ2V0Q29tcG9zaXRlQW5ub3RhdGlvbih3ZWJTZXJ2aWNlQW5ub3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlNlcnZpY2VBbm5vdC5jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXguandzLldlYlNlcnZpY2UuY2xhc3MpOwotICAgIH0KLSAgICAKLSAgICAvKiogQHJldHVybiBSZXR1cm5zIHRoZSBjbGFzc01vZGlmaWVycy4gKi8KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0Q2xhc3NNb2RpZmllcnMoKSB7Ci0gICAgICAgIHJldHVybiBjbGFzc01vZGlmaWVyczsKLSAgICB9Ci0KLSAgICAvKiogQHJldHVybiBSZXR1cm5zIHRoZSBjbGFzc05hbWUuICovCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0gICAgICAgIGlmIChjbGFzc05hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGNsYXNzTmFtZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICh0aGVDb3JyZXNwb25kaW5nQ2xhc3MgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHRoZUNvcnJlc3BvbmRpbmdDbGFzcy5nZXROYW1lKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLQotICAgIC8qKiBAcmV0dXJuIFJldHVybnMgdGhlIHN1cGVyIGNsYXNzIG5hbWUuICovCi0gICAgcHVibGljIFN0cmluZyBnZXRTdXBlckNsYXNzTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGV4dGVuZHNDbGFzczsKLSAgICB9Ci0KLSAgICAvKiogQHJldHVybiBSZXR1cm5zIHRoZSBsaXN0IG9mIGltcGxlbWVudGVkIGludGVyZmFjZXMuICovCi0gICAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRJbnRlcmZhY2VzTGlzdCgpIHsKLSAgICAgICAgcmV0dXJuIGludGVyZmFjZXNMaXN0OwotICAgIH0KLQotICAgIC8qKiBAcmV0dXJuIFJldHVybnMgdGhlIGhhbmRsZXJDaGFpbkFubm90SW1wbC4gKi8KLSAgICBwdWJsaWMgSGFuZGxlckNoYWluQW5ub3QgZ2V0SGFuZGxlckNoYWluQW5ub3QoKSB7Ci0gICAgICAgIHJldHVybiBoYW5kbGVyQ2hhaW5Bbm5vdCA9IAotICAgICAgICAgICAgKEhhbmRsZXJDaGFpbkFubm90KSBnZXRDb21wb3NpdGVBbm5vdGF0aW9uKGhhbmRsZXJDaGFpbkFubm90LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZXJDaGFpbkFubm90LmNsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4Lmp3cy5IYW5kbGVyQ2hhaW4uY2xhc3MpOwotICAgIH0KLQotICAgIC8qKiBAcmV0dXJuIFJldHVybnMgdGhlIHNlcnZpY2VNb2RlQW5ub3QuICovCi0gICAgcHVibGljIFNlcnZpY2VNb2RlQW5ub3QgZ2V0U2VydmljZU1vZGVBbm5vdCgpIHsKLSAgICAgICAgcmV0dXJuIHNlcnZpY2VNb2RlQW5ub3QgPSAKLSAgICAgICAgICAgIChTZXJ2aWNlTW9kZUFubm90KSBnZXRDb21wb3NpdGVBbm5vdGF0aW9uKHNlcnZpY2VNb2RlQW5ub3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlTW9kZUFubm90LmNsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLndzLlNlcnZpY2VNb2RlLmNsYXNzKTsKLSAgICB9Ci0KLSAgICAvKiogQHJldHVybiBSZXR1cm5zIHRoZSBzb2FwQmluZGluZ0Fubm90LiAqLwotICAgIHB1YmxpYyBTb2FwQmluZGluZ0Fubm90IGdldFNvYXBCaW5kaW5nQW5ub3QoKSB7Ci0gICAgICAgIHJldHVybiBzb2FwQmluZGluZ0Fubm90ID0gCi0gICAgICAgICAgICAoU29hcEJpbmRpbmdBbm5vdCkgZ2V0Q29tcG9zaXRlQW5ub3RhdGlvbihzb2FwQmluZGluZ0Fubm90LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29hcEJpbmRpbmdBbm5vdC5jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLmNsYXNzKTsKLSAgICB9Ci0KLSAgICAvKiogQHJldHVybiBSZXR1cm5zIHRoZSB3ZWJGYXVsdEFubm90LiAqLwotICAgIHB1YmxpYyBXZWJGYXVsdEFubm90IGdldFdlYkZhdWx0QW5ub3QoKSB7Ci0gICAgICAgIHJldHVybiB3ZWJGYXVsdEFubm90ID0gCi0gICAgICAgICAgICAoV2ViRmF1bHRBbm5vdCkgZ2V0Q29tcG9zaXRlQW5ub3RhdGlvbih3ZWJGYXVsdEFubm90LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYkZhdWx0QW5ub3QuY2xhc3MsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLndzLldlYkZhdWx0LmNsYXNzKTsKLSAgICB9Ci0KLSAgICAvKiogQHJldHVybiBSZXR1cm5zIHRoZSB3ZWJTZXJ2aWNlQ2xpZW50QW5ub3QuICovCi0gICAgcHVibGljIFdlYlNlcnZpY2VDbGllbnRBbm5vdCBnZXRXZWJTZXJ2aWNlQ2xpZW50QW5ub3QoKSB7Ci0gICAgICAgIHJldHVybiB3ZWJTZXJ2aWNlQ2xpZW50QW5ub3QgPSAKLSAgICAgICAgICAgIChXZWJTZXJ2aWNlQ2xpZW50QW5ub3QpIGdldENvbXBvc2l0ZUFubm90YXRpb24od2ViU2VydmljZUNsaWVudEFubm90LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViU2VydmljZUNsaWVudEFubm90LmNsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwud3MuV2ViU2VydmljZUNsaWVudC5jbGFzcyk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBXZWJTZXJ2aWNlQ2xpZW50QW5ub3QgZ2V0V2ViU2VydmljZUNsaWVudEFubm90KE9iamVjdCBrZXkpIHsKLSAgICAgICAgV2ViU2VydmljZUNsaWVudEFubm90IGFubm90ID0gZ2V0V2ViU2VydmljZUNsaWVudEFubm90KCk7Ci0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBzcGFyc2VDb21wb3NpdGUgPSBnZXRTcGFyc2VDb21wb3NpdGUoa2V5KTsKLSAgICAgICAgV2ViU2VydmljZUNsaWVudEFubm90IHNwYXJzZUFubm90ID0gbnVsbDsKLSAgICAgICAgaWYgKHNwYXJzZUNvbXBvc2l0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzcGFyc2VBbm5vdCA9IHNwYXJzZUNvbXBvc2l0ZS5nZXRXZWJTZXJ2aWNlQ2xpZW50QW5ub3QoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gV2ViU2VydmljZUNsaWVudEFubm90LmNyZWF0ZUZyb21Bbm5vdGF0aW9uKGFubm90LCBzcGFyc2VBbm5vdCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybiBhIGNvbXBvc2l0ZSBhbm5vdGF0aW9uIG9mIHRoZSBzcGVjaWZpZWQgdHlwZS4gIElmIHRoZSBjb21wb3NpdGUgYW5ub3RhdGlvbiBpcyAKLSAgICAgKiBudWxsLCB0aGVuIHRoZSBhc3NvY2lhdGVkIGNsYXNzIChpZiBub3QgbnVsbCkgd2lsbCBiZSBleGFtaW5lZCBmb3IgdGhlIGFwcHJvcHJpYXRlIGphdmEKLSAgICAgKiBhbm5vdGF0aW9uLiAgSWYgb25lIGlzIGZvdW5kLCBpdCB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIGEgbmV3IGNvbXBvc2l0ZSBhbm5vdGF0aW9uLgotICAgICAqIAotICAgICAqIEBwYXJhbSBjb21wb3NpdGVBbm5vdGF0aW9uIE1heSBiZSBudWxsLiAgVGhlIGN1cnJlbnQgY29tcG9zaXRlIGFubm90YXRpb24uICBJZiB0aGlzIGlzCi0gICAgICogbm9uLW51bGwsIGl0IHdpbGwgc2ltcGx5IGJlIHJldHVybmVkLgotICAgICAqIEBwYXJhbSBjb21wb3NpdGVBbm5vdENsYXNzIFRoZSBjbGFzcyBvZiB0aGUgY29tcG9zaXRlIGFubm90YXRpb24uICBUaGlzIGlzIGEgc3ViY2xhc3Mgb2YKLSAgICAgKiB0aGUgamF2YSBhbm5vdGF0aW9uIGNsYXNzLgotICAgICAqIEBwYXJhbSBqYXZhQW5ub3RhdGlvbkNsYXNzIFRoZSBqYXZhIGFubm90YXRpb24gY2xhc3MuICBUaGUgYXNzb2NpYXRlZCBjbGFzcyB3aWxsIGJlIAotICAgICAqIHJlZmxlY3RlZCBvbiB0byBzZWUgaWYgdGhpcyBhbm5vdGF0aW9uIGV4aXN0cy4gIElmIHNvLCBpdCBpcyB1c2VkIHRvIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZgotICAgICAqIHRoZSBjb21wb3NpdGUgYW5ub3RhdGlvbiBjbGFzcy4KLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHJpdmF0ZSBBbm5vdGF0aW9uIGdldENvbXBvc2l0ZUFubm90YXRpb24oQW5ub3RhdGlvbiBjb21wb3NpdGVBbm5vdGF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzIGNvbXBvc2l0ZUFubm90Q2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MgamF2YUFubm90YXRpb25DbGFzcykgewotICAgICAgICBBbm5vdGF0aW9uIHJldHVybkFubm90YXRpb24gPSBjb21wb3NpdGVBbm5vdGF0aW9uOwotICAgICAgICBpZiAocmV0dXJuQW5ub3RhdGlvbiA9PSBudWxsICYmIHRoZUNvcnJlc3BvbmRpbmdDbGFzcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBHZXQgdGhlIGFubm90YXRpb24gZnJvbSB0aGUgY2xhc3MgYW5kIGlmIG9uZSBleGlzdHMsIGNvbnN0cnVjdCBhIGNvbXBvc2l0ZSBhbm5vdCBmb3IgaXQKLSAgICAgICAgICAgIEFubm90YXRpb24gYW5ub3RhdGlvbkZyb21DbGFzcyA9IGdldEFubm90YXRpb25Gcm9tQ2xhc3ModGhlQ29ycmVzcG9uZGluZ0NsYXNzLCBqYXZhQW5ub3RhdGlvbkNsYXNzKTsKLSAgICAgICAgICAgIGlmIChhbm5vdGF0aW9uRnJvbUNsYXNzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBNZXRob2QgY3JlYXRlQW5ub3QgPSBjb21wb3NpdGVBbm5vdENsYXNzLmdldE1ldGhvZCgiY3JlYXRlRnJvbUFubm90YXRpb24iLCBBbm5vdGF0aW9uLmNsYXNzKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuQW5ub3RhdGlvbiA9IChBbm5vdGF0aW9uKSBjcmVhdGVBbm5vdC5pbnZva2UobnVsbCwgYW5ub3RhdGlvbkZyb21DbGFzcyk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlVuYWJsZSB0byBjcmVhdGUgY29tcG9zaXRlIGFubm90YXRpb24gZHVlIHRvIGV4Y2VwdGlvbi4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiICBDb21wb3NpdGUgQW5ub3RhdGlvbjogIiArIGNvbXBvc2l0ZUFubm90YXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICI7IENvbXBvc2l0ZSBBbm5vdCBjbGFzczogIiArIGNvbXBvc2l0ZUFubm90Q2xhc3MgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiOyBKYXZhIEFubm90IGNsYXNzOiAiICsgamF2YUFubm90YXRpb25DbGFzcywgZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1zZyA9IE1lc3NhZ2VzLmdldE1lc3NhZ2UoIkRlc2NyaXB0aW9uQnVpbGRlckVycjEiLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9zaXRlQW5ub3RDbGFzcy50b1N0cmluZygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKG1zZywgZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXR1cm5Bbm5vdGF0aW9uOwotICAgIH0KLQotICAgIC8qKiBAcmV0dXJuIFJldHVybnMgdGhlIHdlYlNlcnZpY2VQcm92aWRlckFubm90LiAqLwotICAgIHB1YmxpYyBXZWJTZXJ2aWNlUHJvdmlkZXJBbm5vdCBnZXRXZWJTZXJ2aWNlUHJvdmlkZXJBbm5vdCgpIHsKLSAgICAgICAgcmV0dXJuIHdlYlNlcnZpY2VQcm92aWRlckFubm90ID0gCi0gICAgICAgICAgICAoV2ViU2VydmljZVByb3ZpZGVyQW5ub3QpIGdldENvbXBvc2l0ZUFubm90YXRpb24od2ViU2VydmljZVByb3ZpZGVyQW5ub3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViU2VydmljZVByb3ZpZGVyQW5ub3QuY2xhc3MsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlUHJvdmlkZXIuY2xhc3MpOwotICAgIH0KLQotICAgIC8qKiBAcmV0dXJuIFJldHVybnMgdGhlIHdlYlNlcnZpY2VSZWZBbm5vdCBsaXN0LiAqLwotICAgIHB1YmxpYyBMaXN0PFdlYlNlcnZpY2VSZWZBbm5vdD4gZ2V0QWxsV2ViU2VydmljZVJlZkFubm90cygpIHsKLSAgICAgICAgcmV0dXJuIHdlYlNlcnZpY2VSZWZBbm5vdExpc3Q7Ci0gICAgfQotCi0gICAgLyoqIEByZXR1cm4gUmV0dXJucyB0aGUgd2ViU2VydmljZVJlZkFubm90LiAqLwotICAgIHB1YmxpYyBXZWJTZXJ2aWNlUmVmQW5ub3QgZ2V0V2ViU2VydmljZVJlZkFubm90KFN0cmluZyBuYW1lKSB7Ci0KLSAgICAgICAgV2ViU2VydmljZVJlZkFubm90IHdzcmEgPSBudWxsOwotICAgICAgICBJdGVyYXRvcjxXZWJTZXJ2aWNlUmVmQW5ub3Q+IGl0ZXIgPQotICAgICAgICAgICAgICAgIHdlYlNlcnZpY2VSZWZBbm5vdExpc3QuaXRlcmF0b3IoKTsKLQotICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIHdzcmEgPSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIGlmICh3c3JhLm5hbWUoKS5lcXVhbHMobmFtZSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHdzcmE7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHdzcmE7Ci0gICAgfQotCi0gICAgLyoqIEByZXR1cm4gUmV0dXJucyB0aGUgd2ViU2VydmljZVJlZkFubm90LiAqLwotICAgIHB1YmxpYyBCaW5kaW5nVHlwZUFubm90IGdldEJpbmRpbmdUeXBlQW5ub3QoKSB7Ci0gICAgICAgIHJldHVybiAoQmluZGluZ1R5cGVBbm5vdCkgZ2V0Q29tcG9zaXRlQW5ub3RhdGlvbihiaW5kaW5nVHlwZUFubm90LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmluZGluZ1R5cGVBbm5vdC5jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC53cy5CaW5kaW5nVHlwZS5jbGFzcyk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBMaXN0PEFubm90YXRpb24+IGdldFdlYlNlcnZpY2VGZWF0dXJlcygpIHsKLSAgICAgICAgcmV0dXJuIGZlYXR1cmVzOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRXZWJTZXJ2aWNlRmVhdHVyZXMoTGlzdDxBbm5vdGF0aW9uPiBsaXN0KSB7Ci0gICAgICAgIGZlYXR1cmVzID0gbGlzdDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgYWRkV2ViU2VydmljZUZlYXR1cmUoQW5ub3RhdGlvbiBhKSB7Ci0gICAgICAgIGlmIChmZWF0dXJlcyA9PSBudWxsKQotICAgICAgICAgICAgZmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0PEFubm90YXRpb24+KCk7Ci0gICAgICAgIAotICAgICAgICBmZWF0dXJlcy5hZGQoYSk7Ci0gICAgfQotICAgIAotICAgIC8qKiBAcmV0dXJuIFJldHVybnMgdGhlIHdzZGxEZWZpbml0aW9uICovCi0gICAgcHVibGljIERlZmluaXRpb24gZ2V0V3NkbERlZmluaXRpb24oKSB7Ci0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gd3NkbERlZmluaXRpb247Ci0gICAgICAgIH0gZWxzZSBpZiAod3NkbFdyYXBwZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgd3NkbERlZmluaXRpb24gPSB3c2RsV3JhcHBlci5nZXREZWZpbml0aW9uKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB3c2RsRGVmaW5pdGlvbiA9IGNyZWF0ZVdzZGxEZWZpbml0aW9uKHdzZGxVUkwpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB3c2RsRGVmaW5pdGlvbjsKLSAgICB9Ci0KLSAgICAvKiogQHJldHVybiBSZXR1cm5zIHRoZSB3c2RsVVJMICovCi0gICAgcHVibGljIFVSTCBnZXRXc2RsVVJMKCkgewotICAgICAgICByZXR1cm4gdGhpcy53c2RsVVJMOwotICAgIH0KLQotICAgIC8qKiBSZXR1cm5zIGEgY29sbGVjdGlvbiBvZiBhbGwgTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGVzIHRoYXQgbWF0Y2ggdGhlIHNwZWNpZmllZCBuYW1lICovCi0gICAgcHVibGljIExpc3Q8TWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGU+IGdldE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlKFN0cmluZyBtZXRob2ROYW1lKSB7Ci0gICAgICAgIEFycmF5TGlzdDxNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZT4gbWF0Y2hpbmdNZXRob2RzID0KLSAgICAgICAgICAgICAgICBuZXcgQXJyYXlMaXN0PE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlPigpOwotICAgICAgICBJdGVyYXRvcjxNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZT4gaXRlciA9IG1ldGhvZERlc2NyaXB0aW9ucy5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IGl0ZXIubmV4dCgpOwotCi0gICAgICAgICAgICBpZiAoY29tcG9zaXRlLmdldE1ldGhvZE5hbWUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbXBvc2l0ZS5nZXRNZXRob2ROYW1lKCkuZXF1YWxzKG1ldGhvZE5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1hdGNoaW5nTWV0aG9kcy5hZGQoY29tcG9zaXRlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbWF0Y2hpbmdNZXRob2RzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG50aCBvY2N1cmVuY2Ugb2YgdGhpcyBNZXRob2RDb21wb3NpdGUuIFNpbmNlIG1ldGhvZCBuYW1lcyBhcmUgbm90IHVuaXF1ZSwgd2UgaGF2ZQotICAgICAqIHRvIGFjY291bnQgZm9yIG11bHRpcGxlIG9jY3VycmVuY2VzCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWV0aG9kTmFtZQotICAgICAqIEBwYXJhbSBvY2N1cmVuY2UgIFRoZSBudGggb2NjdXJhbmNlIHRvIHJldHVybjsgbm90IHRoaXMgaXMgTk9UIDAgYmFzZWQKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIG1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlCi0gICAgICovCi0gICAgcHVibGljIE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlIGdldE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlKAotICAgICAgICAgICAgU3RyaW5nIG1ldGhvZE5hbWUsCi0gICAgICAgICAgICBpbnQgb2NjdXJlbmNlKSB7Ci0gICAgICAgIE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlIHJldHVybk1EQyA9IG51bGw7Ci0gICAgICAgIExpc3Q8TWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGU+IG1hdGNoaW5nTWV0aG9kcyA9Ci0gICAgICAgICAgICAgICAgZ2V0TWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUobWV0aG9kTmFtZSk7Ci0gICAgICAgIGlmIChtYXRjaGluZ01ldGhvZHMgIT0gbnVsbCAmJiAhbWF0Y2hpbmdNZXRob2RzLmlzRW1wdHkoKSAmJgotICAgICAgICAgICAgICAgIG9jY3VyZW5jZSA+IDAgJiYgb2NjdXJlbmNlIDw9IG1hdGNoaW5nTWV0aG9kcy5zaXplKCkpIHsKLSAgICAgICAgICAgIHJldHVybk1EQyA9IG1hdGNoaW5nTWV0aG9kcy5nZXQoLS1vY2N1cmVuY2UpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXR1cm5NREM7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8TWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGU+IGdldE1ldGhvZERlc2NyaXB0aW9uc0xpc3QoKSB7Ci0gICAgICAgIHJldHVybiBtZXRob2REZXNjcmlwdGlvbnM7Ci0gICAgfQotCi0gICAgLyoqIEByZXR1cm4gUmV0dXJucyB0aGUgbWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUuLm51bGwgaWYgbm90IGZvdW5kICovCi0gICAgcHVibGljIEZpZWxkRGVzY3JpcHRpb25Db21wb3NpdGUgZ2V0RmllbGREZXNjcmlwdGlvbkNvbXBvc2l0ZShTdHJpbmcgZmllbGROYW1lKSB7Ci0KLSAgICAgICAgRmllbGREZXNjcmlwdGlvbkNvbXBvc2l0ZSBjb21wb3NpdGUgPSBudWxsOwotICAgICAgICBJdGVyYXRvcjxGaWVsZERlc2NyaXB0aW9uQ29tcG9zaXRlPiBpdGVyID0KLSAgICAgICAgICAgICAgICBmaWVsZERlc2NyaXB0aW9ucy5pdGVyYXRvcigpOwotCi0gICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgY29tcG9zaXRlID0gaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAoY29tcG9zaXRlLmdldEZpZWxkTmFtZSgpLmVxdWFscyhmaWVsZE5hbWUpKQotICAgICAgICAgICAgICAgIHJldHVybiBjb21wb3NpdGU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZTsKLSAgICB9Ci0KLSAgICAvKiogQHJldHVybiBSZXR1cm5zIHRoZSBNb2R1bGVDbGFzc1R5cGUuICovCi0gICAgcHVibGljIFdzZGxHZW5lcmF0b3IgZ2V0Q3VzdG9tV3NkbEdlbmVyYXRvcigpIHsKLQotICAgICAgICByZXR1cm4gdGhpcy53c2RsR2VuZXJhdG9yOwotICAgIH0KLQotICAgIC8qKiBAcmV0dXJuIFJldHVybnMgdGhlIENsYXNzTG9hZGVyLiAqLwotICAgIHB1YmxpYyBDbGFzc0xvYWRlciBnZXRDbGFzc0xvYWRlcigpIHsKLQotICAgICAgICByZXR1cm4gdGhpcy5jbGFzc0xvYWRlcjsKLSAgICB9Ci0KLSAgICAvKiogQHJldHVybiBSZXR1cm5zIHRydWUgaWYgdGhpcyBpcyBhbiBpbnRlcmZhY2UgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0ludGVyZmFjZSgpIHsKLQotICAgICAgICByZXR1cm4gaXNJbnRlcmZhY2U7Ci0gICAgfQotCi0gICAgLy8rKysrKysrKwotICAgIC8vU2V0dGVycwotICAgIC8vKysrKysrKysKLSAgICBwdWJsaWMgdm9pZCBzZXRXZWJTZXJ2aWNlQW5ub3QoV2ViU2VydmljZUFubm90IHdlYlNlcnZpY2VBbm5vdCkgewotICAgICAgICB0aGlzLndlYlNlcnZpY2VBbm5vdCA9IHdlYlNlcnZpY2VBbm5vdDsKLSAgICB9Ci0KLSAgICAvKiogQHBhcmFtIGNsYXNzTW9kaWZpZXJzIFRoZSBjbGFzc01vZGlmaWVycyB0byBzZXQuICovCi0gICAgcHVibGljIHZvaWQgc2V0Q2xhc3NNb2RpZmllcnMoU3RyaW5nW10gY2xhc3NNb2RpZmllcnMpIHsKLSAgICAgICAgdGhpcy5jbGFzc01vZGlmaWVycyA9IGNsYXNzTW9kaWZpZXJzOwotICAgIH0KLQotICAgIC8qKiBAcGFyYW0gY2xhc3NOYW1lIFRoZSBjbGFzc05hbWUgdG8gc2V0LiAqLwotICAgIHB1YmxpYyB2b2lkIHNldENsYXNzTmFtZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0gICAgICAgIHRoaXMuY2xhc3NOYW1lID0gY2xhc3NOYW1lOwotICAgIH0KLQotICAgIC8qKiBAcGFyYW0gZXh0ZW5kc0NsYXNzIFRoZSBuYW1lIG9mIHRoZSBzdXBlciBjbGFzcyB0byBzZXQuICovCi0gICAgcHVibGljIHZvaWQgc2V0U3VwZXJDbGFzc05hbWUoU3RyaW5nIGV4dGVuZHNDbGFzcykgewotICAgICAgICB0aGlzLmV4dGVuZHNDbGFzcyA9IGV4dGVuZHNDbGFzczsKLSAgICB9Ci0KLSAgICAvKiogQHBhcmFtIGludGVyZmFjZXNMaXN0IFRoZSBpbnRlcmZhY2VzTGlzdCB0byBzZXQuICovCi0gICAgcHVibGljIHZvaWQgc2V0SW50ZXJmYWNlc0xpc3QoTGlzdDxTdHJpbmc+IGludGVyZmFjZXNMaXN0KSB7Ci0gICAgICAgIHRoaXMuaW50ZXJmYWNlc0xpc3QgPSBpbnRlcmZhY2VzTGlzdDsKLSAgICB9Ci0KLSAgICAvKiogQHBhcmFtIGhhbmRsZXJDaGFpbkFubm90IFRoZSBoYW5kbGVyQ2hhaW5Bbm5vdCB0byBzZXQuICovCi0gICAgcHVibGljIHZvaWQgc2V0SGFuZGxlckNoYWluQW5ub3QoSGFuZGxlckNoYWluQW5ub3QgaGFuZGxlckNoYWluQW5ub3QpIHsKLSAgICAgICAgdGhpcy5oYW5kbGVyQ2hhaW5Bbm5vdCA9IGhhbmRsZXJDaGFpbkFubm90OwotICAgIH0KLQotICAgIC8qKiBAcGFyYW0gc2VydmljZU1vZGVBbm5vdCBUaGUgc2VydmljZU1vZGVBbm5vdCB0byBzZXQuICovCi0gICAgcHVibGljIHZvaWQgc2V0U2VydmljZU1vZGVBbm5vdChTZXJ2aWNlTW9kZUFubm90IHNlcnZpY2VNb2RlQW5ub3QpIHsKLSAgICAgICAgdGhpcy5zZXJ2aWNlTW9kZUFubm90ID0gc2VydmljZU1vZGVBbm5vdDsKLSAgICB9Ci0KLSAgICAvKiogQHBhcmFtIHNvYXBCaW5kaW5nQW5ub3QgVGhlIHNvYXBCaW5kaW5nQW5ub3QgdG8gc2V0LiAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNvYXBCaW5kaW5nQW5ub3QoU29hcEJpbmRpbmdBbm5vdCBzb2FwQmluZGluZ0Fubm90KSB7Ci0gICAgICAgIHRoaXMuc29hcEJpbmRpbmdBbm5vdCA9IHNvYXBCaW5kaW5nQW5ub3Q7Ci0gICAgfQotCi0gICAgLyoqIEBwYXJhbSB3ZWJGYXVsdEFubm90IFRoZSB3ZWJGYXVsdEFubm90IHRvIHNldC4gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRXZWJGYXVsdEFubm90KFdlYkZhdWx0QW5ub3Qgd2ViRmF1bHRBbm5vdCkgewotICAgICAgICB0aGlzLndlYkZhdWx0QW5ub3QgPSB3ZWJGYXVsdEFubm90OwotICAgIH0KLQotICAgIC8qKiBAcGFyYW0gd2ViU2VydmljZUNsaWVudEFubm90IFRoZSB3ZWJTZXJ2aWNlQ2xpZW50QW5ub3QgdG8gc2V0LiAqLwotICAgIHB1YmxpYyB2b2lkIHNldFdlYlNlcnZpY2VDbGllbnRBbm5vdCgKLSAgICAgICAgICAgIFdlYlNlcnZpY2VDbGllbnRBbm5vdCB3ZWJTZXJ2aWNlQ2xpZW50QW5ub3QpIHsKLSAgICAgICAgdGhpcy53ZWJTZXJ2aWNlQ2xpZW50QW5ub3QgPSB3ZWJTZXJ2aWNlQ2xpZW50QW5ub3Q7Ci0gICAgfQotCi0gICAgLyoqIEBwYXJhbSB3ZWJTZXJ2aWNlUHJvdmlkZXJBbm5vdCBUaGUgd2ViU2VydmljZVByb3ZpZGVyQW5ub3QgdG8gc2V0LiAqLwotICAgIHB1YmxpYyB2b2lkIHNldFdlYlNlcnZpY2VQcm92aWRlckFubm90KAotICAgICAgICAgICAgV2ViU2VydmljZVByb3ZpZGVyQW5ub3Qgd2ViU2VydmljZVByb3ZpZGVyQW5ub3QpIHsKLSAgICAgICAgdGhpcy53ZWJTZXJ2aWNlUHJvdmlkZXJBbm5vdCA9IHdlYlNlcnZpY2VQcm92aWRlckFubm90OwotICAgIH0KLQotICAgIC8qKiBAcGFyYW0gd2ViU2VydmljZVJlZkFubm90IFRoZSB3ZWJTZXJ2aWNlUmVmQW5ub3QgdG8gYWRkIHRvIHRoZSBsaXN0LiAqLwotICAgIHB1YmxpYyB2b2lkIGFkZFdlYlNlcnZpY2VSZWZBbm5vdCgKLSAgICAgICAgICAgIFdlYlNlcnZpY2VSZWZBbm5vdCB3ZWJTZXJ2aWNlUmVmQW5ub3QpIHsKLSAgICAgICAgd2ViU2VydmljZVJlZkFubm90TGlzdC5hZGQod2ViU2VydmljZVJlZkFubm90KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRXZWJTZXJ2aWNlUmVmQW5ub3QoV2ViU2VydmljZVJlZkFubm90IHdlYlNlcnZpY2VSZWZBbm5vdCkgewotICAgICAgICBhZGRXZWJTZXJ2aWNlUmVmQW5ub3Qod2ViU2VydmljZVJlZkFubm90KTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgYWRkQ3VzdG9tQW5ub3RhdGlvblByb2Nlc3NvcihDdXN0b21Bbm5vdGF0aW9uUHJvY2Vzc29yIHByb2Nlc3NvcikgewotICAgICAgICBnZW5lcmljQW5ub3RhdGlvblByb2Nlc3NvcnMucHV0KHByb2Nlc3Nvci5nZXRBbm5vdGF0aW9uSW5zdGFuY2VDbGFzc05hbWUoKSwgcHJvY2Vzc29yKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIEN1c3RvbUFubm90YXRpb25Qcm9jZXNzb3I+IGdldEN1c3RvbUFubm90YXRpb25Qcm9jZXNzb3JzKCkgewotICAgICAgICByZXR1cm4gZ2VuZXJpY0Fubm90YXRpb25Qcm9jZXNzb3JzOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBhZGRDdXN0b21Bbm5vdGF0aW9uSW5zdGFuY2UoQ3VzdG9tQW5ub3RhdGlvbkluc3RhbmNlIGFubm90YXRpb24pIHsKLSAgICAgICAgZ2VuZXJpY0Fubm90YXRpb25JbnN0YW5jZXMuYWRkKGFubm90YXRpb24pOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgTGlzdDxDdXN0b21Bbm5vdGF0aW9uSW5zdGFuY2U+IGdldEN1c3RvbUFubm90YXRpb25JbnN0YW5jZXMoKSB7Ci0gICAgICAgIHJldHVybiBnZW5lcmljQW5ub3RhdGlvbkluc3RhbmNlczsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSB3c2RsRGVmaW5pdGlvbiBUaGUgd3NkbERlZmluaXRpb24gdG8gc2V0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFdzZGxEZWZpbml0aW9uKERlZmluaXRpb24gd3NkbERlZikgewotCi0gICAgICAgIERlZmluaXRpb24gZGVmID0gbnVsbDsKLQotICAgICAgICBpZiAod3NkbERlZiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAod3NkbERlZiBpbnN0YW5jZW9mIFdTREw0SldyYXBwZXIpIHsKLSAgICAgICAgICAgICAgICB3c2RsV3JhcHBlciA9IChXU0RMNEpXcmFwcGVyKSB3c2RsRGVmOwotCi0gICAgICAgICAgICAgICAgZGVmID0gd3NkbFdyYXBwZXIuZ2V0RGVmaW5pdGlvbigpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBpZiAobXlDb25maWdDb250ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbnN0cnVjdCBXU0RMNEpXcmFwcGVyIHdpdGggY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgd3NkbFdyYXBwZXIgPSBuZXcgV1NETDRKV3JhcHBlcih3c2RsRGVmLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXlDb25maWdDb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIG5vIGNvbmZpZ3VyYXRpb24sIGRlZmF1bHQgdG8gdXNpbmcgYSAKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lbW9yeSBzZW5zaXRpdmUgd3JhcHBlcgotICAgICAgICAgICAgICAgICAgICAgICAgd3NkbFdyYXBwZXIgPSBuZXcgV1NETDRKV3JhcHBlcih3c2RsRGVmLCB0cnVlLCAyKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBkZWYgPSB3c2RsV3JhcHBlci5nZXREZWZpbml0aW9uKCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGFic29yYgotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGRlZiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHdzZGxEZWZpbml0aW9uQmFzZVVSSSA9IGRlZi5nZXREb2N1bWVudEJhc2VVUkkoKTsKLQotICAgICAgICAgICAgICAgIGlmICgod3NkbERlZmluaXRpb25CYXNlVVJJICE9IG51bGwpICYmICh3c2RsVVJMID09IG51bGwpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3c2RsVVJMID0gbmV3IFVSTCh3c2RsRGVmaW5pdGlvbkJhc2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGU6c2V0V3NkbERlZmluaXRpb24oKTogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyJDYXVnaHQgZXhjZXB0aW9uIGNyZWF0aW5nIFdTREwgVVJMIDoiIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB3c2RsRGVmaW5pdGlvbkJhc2VVUkkgKyAiOyBleGNlcHRpb246ICIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArZS50b1N0cmluZygpLGUpOyAKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKiBAcGFyYW0gd3NkbFVSTCBUaGUgd3NkbFVSTCB0byBzZXQuICovCi0gICAgcHVibGljIHZvaWQgc2V0d3NkbFVSTChVUkwgd3NkbFVSTCkgewotICAgICAgICB0aGlzLndzZGxVUkwgPSB3c2RsVVJMOwotICAgIH0KLQotICAgIC8qKiBAcGFyYW0gQmluZGluZ1R5cGVBbm5vdCBUaGUgQmluZGluZ1R5cGVBbm5vdCB0byBzZXQuICovCi0gICAgcHVibGljIHZvaWQgc2V0QmluZGluZ1R5cGVBbm5vdCgKLSAgICAgICAgICAgIEJpbmRpbmdUeXBlQW5ub3QgYmluZGluZ1R5cGVBbm5vdCkgewotICAgICAgICB0aGlzLmJpbmRpbmdUeXBlQW5ub3QgPSBiaW5kaW5nVHlwZUFubm90OwotICAgIH0KLQotICAgIC8qKiBAcGFyYW0gaXNJbnRlcmZhY2UgU2V0cyB3aGV0aGVyIHRoaXMgY29tcG9zaXRlIHJlcHJlc2VudHMgYSBjbGFzcyBvciBpbnRlcmZhY2UgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJc0ludGVyZmFjZShib29sZWFuIGlzSW50ZXJmYWNlKSB7Ci0gICAgICAgIHRoaXMuaXNJbnRlcmZhY2UgPSBpc0ludGVyZmFjZTsKLSAgICB9Ci0KLSAgICAvKiogQHBhcmFtIG1ldGhvZERlc2NyaXB0aW9uIFRoZSBtZXRob2REZXNjcmlwdGlvbiB0byBhZGQgdG8gdGhlIHNldC4gKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZShNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSBtZXRob2REZXNjcmlwdGlvbikgewotICAgICAgICBtZXRob2REZXNjcmlwdGlvbnMuYWRkKG1ldGhvZERlc2NyaXB0aW9uKTsKLSAgICB9Ci0KLSAgICAvKiogQHBhcmFtIG1ldGhvZERlc2NyaXB0aW9uIFRoZSBtZXRob2REZXNjcmlwdGlvbiB0byBhZGQgdG8gdGhlIHNldC4gKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRGaWVsZERlc2NyaXB0aW9uQ29tcG9zaXRlKEZpZWxkRGVzY3JpcHRpb25Db21wb3NpdGUgZmllbGREZXNjcmlwdGlvbikgewotICAgICAgICBmaWVsZERlc2NyaXB0aW9ucy5hZGQoZmllbGREZXNjcmlwdGlvbik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q3VzdG9tV3NkbEdlbmVyYXRvcihXc2RsR2VuZXJhdG9yIHdzZGxHZW5lcmF0b3IpIHsKLQotICAgICAgICB0aGlzLndzZGxHZW5lcmF0b3IgPSB3c2RsR2VuZXJhdG9yOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENsYXNzTG9hZGVyKENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKSB7Ci0KLSAgICAgICAgdGhpcy5jbGFzc0xvYWRlciA9IGNsYXNzTG9hZGVyOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSGFuZGxlckNoYWluc1R5cGUgZ2V0SGFuZGxlckNoYWluc1R5cGUoKSB7Ci0gICAgCXJldHVybiBoYW5kbGVyQ2hhaW5zVHlwZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0SGFuZGxlckNoYWluc1R5cGUoSGFuZGxlckNoYWluc1R5cGUgaGFuZGxlckNoYWluc1R5cGUpIHsKLSAgICAJdGhpcy5oYW5kbGVyQ2hhaW5zVHlwZSA9IGhhbmRsZXJDaGFpbnNUeXBlOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBBbnN3ZXIgZG9lcyB0aGlzIGNvbXBvc2l0ZSByZXByZXNlbnQgYSBzZXJ2aWNlIHJlcXVlc3RlciAoYWthIGNsaWVudCkgb3IgYSBzZXJ2aWNlCi0gICAgICogcHJvdmlkZXIgKGFrYSBzZXJ2ZXIpLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGEgc2VydmljZSBwcm92aWRlciAoYWthIGFuIGVuZHBvaW50IG9yIGEgc2VydmljZSBpbXBsZW1lbnRhdGlvbgotICAgICAqIG9yIGEgc2VydmVyKQotICAgICAqIAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzU2VydmljZVByb3ZpZGVyKCkgewotICAgICAgICByZXR1cm4gaXNTZXJ2aWNlUHJvdmlkZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBpbmRpY2F0aW9uIG9mIHdoZXRoZXIgdGhpcyBjb21wb3NpdGUgcmVwcmVzZW50cyBhIHNlcnZpY2UgcmVxdWVzdGVyIChha2EgY2xpZW50KSBvcgotICAgICAqIGEgc2VydmljZSBwcm92aWRlciAoYWthIHNlcnZlcikuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SXNTZXJ2aWNlUHJvdmlkZXIoYm9vbGVhbiB2YWx1ZSkgewotICAgICAgICBpc1NlcnZpY2VQcm92aWRlciA9IHZhbHVlOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGNsYXNzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbXBvc2l0ZS4gIEZvciBhIHNlcnZpY2UgcmVxdWVzdGVyLCB0aGlzIGNvdWxkIGJlIHRoZQotICAgICAqIFNlcnZpY2UgY2xhc3Mgb3IgdGhlIFNFSSBjbGFzcy4gIEZvciBhIHNlcnZpY2UgcHJvdmlkZXIgdGhpcyB3aWxsIGJlIG51bGwgKHVubGVzcyB0aGUgCi0gICAgICogZGVwcmVjYXRlZCBzZXJ2aWNlIGNvbnN0cnVjdGlvbiBsb2dpYyBpbiBEZXNjcmlwdGlvbkZhY3RvcnkgaXMgdXNlZCkKLSAgICAgKiBAcGFyYW0gdGhlQ2xhc3MKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDb3JyZXNwb25kaW5nQ2xhc3MoQ2xhc3MgdGhlQ2xhc3MpIHsKLSAgICAgICAgdGhpcy50aGVDb3JyZXNwb25kaW5nQ2xhc3MgPSB0aGVDbGFzczsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBjbGFzcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb21wb3NpdGUsIGlmIGFueS4KLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIENsYXNzIGdldENvcnJlc3BvbmRpbmdDbGFzcygpIHsKLSAgICAgICAgcmV0dXJuIHRoZUNvcnJlc3BvbmRpbmdDbGFzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIENhdGFsb2cgTWFuYWdlciBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb21wb3NpdGUuICAKLSAgICAgKiBAcGFyYW0gdGhlQ2F0YWxvZ01hbmdlcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENhdGFsb2dNYW5hZ2VyKEpBWFdTQ2F0YWxvZ01hbmFnZXIgdGhlQ2F0YWxvZ01hbmFnZXIpIHsKLSAgICAJdGhpcy5jYXRhbG9nTWFuYWdlciA9IHRoZUNhdGFsb2dNYW5hZ2VyOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjYXRhbG9nIG1hbmFnZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29tcG9zaXRlLCBpZiBhbnkuCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBKQVhXU0NhdGFsb2dNYW5hZ2VyIGdldENhdGFsb2dNYW5hZ2VyKCkgewotICAgIAlyZXR1cm4gY2F0YWxvZ01hbmFnZXI7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnRpZXMoTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKSB7Ci0gICAgICAgIHRoaXMucHJvcGVydGllcyA9IHByb3BlcnRpZXM7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGdldFByb3BlcnRpZXMoKSB7Ci0gICAgICAgIHJldHVybiBwcm9wZXJ0aWVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN0b3JlIGEgV1NETCBEZWZpbml0aW9uIGtleWVkIGJ5IGEgc2VydmljZSBRTmFtZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFdzZGxEZWZpbml0aW9uKFFOYW1lIHNlcnZpY2VRTmFtZSwgRGVmaW5pdGlvbiBkZWZpbml0aW9uKSB7Ci0gICAgICAgIHRoaXMud3NkbERlZnMucHV0KHNlcnZpY2VRTmFtZSwgZGVmaW5pdGlvbik7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHJpdmUgYSBXU0RMIERlZmluaXRpb24gYnkgYSBzZXJ2aWNlIFFOYW1lCi0gICAgICovCi0gICAgcHVibGljIERlZmluaXRpb24gZ2V0V3NkbERlZmluaXRpb24oUU5hbWUgc2VydmljZVFOYW1lKSB7Ci0gICAgICAgIHJldHVybiB3c2RsRGVmcy5nZXQoc2VydmljZVFOYW1lKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogU3RvcmUgYSBXU0RMIFVSTCBrZXllZCBieSBhIHNlcnZpY2UgUU5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXR3c2RsVVJMKFFOYW1lIHNlcnZpY2VRTmFtZSwgVVJMIHVybCkgewotICAgICAgICB3c2RsVVJMcy5wdXQoc2VydmljZVFOYW1lLCB1cmwpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXRyaXZlIGEgV1NETCBVUkwgYnkgYSBzZXJ2aWNlIFFOYW1lCi0gICAgICovCi0gICAgcHVibGljIFVSTCBnZXRXc2RsVVJMKFFOYW1lIHNlcnZpY2VRTmFtZSkgewotICAgICAgICByZXR1cm4gd3NkbFVSTHMuZ2V0KHNlcnZpY2VRTmFtZSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEFkZCB0aGUgc2V0IG9mIHdzZGw6c2VydmljZSBRTmFtZXMgdGhhdCBhcmUgcmVwcmVzZW50ZWQgYnkgdGhpcyBEQkMncyBtZXRhZGF0YQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VRTmFtZXMoU2V0PFFOYW1lPiBzZXJ2aWNlUU5hbWVzKSB7Ci0gICAgICAgIHRoaXMuc2VydmljZVFOYW1lcyA9IHNlcnZpY2VRTmFtZXM7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEdldCB0aGUgc2V0IG9mIHdzZGw6c2VydmljZSBRTmFtZXMgcmVwcmVzZW50ZWQgYnkgdGhpcyBEQkMncyBtZXRhZGF0YQotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgU2V0PFFOYW1lPiBnZXRTZXJ2aWNlUU5hbWVzKCkgewotICAgICAgICByZXR1cm4gc2VydmljZVFOYW1lczsKLSAgICB9Ci0gICAgCi0KLSAgICAvKioKLSAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIHVuaXQgdGVzdGluZy4gV2Ugd2lsbCBwcmludCBhbGwgb2YgdGhlCi0gICAgICogZGF0YSBtZW1iZXJzIGhlcmUuCi0gICAgICovCi0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBuZXdMaW5lID0gIlxuIjsKLSAgICAgICAgZmluYWwgU3RyaW5nIHNhbWVMaW5lID0gIjsgIjsKLSAgICAgICAgc2IuYXBwZW5kKHN1cGVyLnRvU3RyaW5nKCkpOwotICAgICAgICBzYi5hcHBlbmQobmV3TGluZSk7Ci0gICAgICAgIHNiLmFwcGVuZCgiQ2xhc3NOYW1lOiAiICsgY2xhc3NOYW1lKTsKLSAgICAgICAgc2IuYXBwZW5kKHNhbWVMaW5lKTsKLSAgICAgICAgc2IuYXBwZW5kKCJTdXBlckNsYXNzOiIgKyBleHRlbmRzQ2xhc3MpOwotCi0gICAgICAgIHNiLmFwcGVuZChuZXdMaW5lKTsKLSAgICAgICAgc2IuYXBwZW5kKCJDbGFzcyBtb2RpZmllcnM6ICIpOwotICAgICAgICBpZiAoY2xhc3NNb2RpZmllcnMgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjbGFzc01vZGlmaWVycy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIHNiLmFwcGVuZChjbGFzc01vZGlmaWVyc1tpXSk7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKHNhbWVMaW5lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHNiLmFwcGVuZChuZXdMaW5lKTsKLSAgICAgICAgc2IuYXBwZW5kKCJpcyBTZXJ2aWNlIFByb3ZpZGVyOiAiICsgaXNTZXJ2aWNlUHJvdmlkZXIoKSApOwotCi0gICAgICAgIHNiLmFwcGVuZChuZXdMaW5lKTsKLSAgICAgICAgc2IuYXBwZW5kKCJ3c2RsVVJMOiAiICsgZ2V0V3NkbFVSTCgpICk7Ci0KLSAgICAgICAgc2IuYXBwZW5kKG5ld0xpbmUpOwotICAgICAgICBzYi5hcHBlbmQoImhhcyB3c2RsRGVmaW5pdGlvbj86ICIpOwotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT1udWxsKSB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoInRydWUiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgiZmFsc2UiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHNiLmFwcGVuZChuZXdMaW5lKTsKLSAgICAgICAgc2IuYXBwZW5kKCJJbnRlcmZhY2VzOiAiKTsKLSAgICAgICAgSXRlcmF0b3I8U3RyaW5nPiBpbnRJdGVyID0gaW50ZXJmYWNlc0xpc3QuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGludEl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgaW50ZXIgPSBpbnRJdGVyLm5leHQoKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZChpbnRlcik7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoc2FtZUxpbmUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHdlYlNlcnZpY2VBbm5vdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQobmV3TGluZSk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoIldlYlNlcnZpY2U6ICIpOwotICAgICAgICAgICAgc2IuYXBwZW5kKHdlYlNlcnZpY2VBbm5vdC50b1N0cmluZygpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh3ZWJTZXJ2aWNlUHJvdmlkZXJBbm5vdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQobmV3TGluZSk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoIldlYlNlcnZpY2VQcm92aWRlcjogIik7Ci0gICAgICAgICAgICBzYi5hcHBlbmQod2ViU2VydmljZVByb3ZpZGVyQW5ub3QudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYmluZGluZ1R5cGVBbm5vdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQobmV3TGluZSk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoIkJpbmRpbmdUeXBlOiAiKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZChiaW5kaW5nVHlwZUFubm90LnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHdlYlNlcnZpY2VDbGllbnRBbm5vdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQobmV3TGluZSk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoIldlYlNlcnZpY2VDbGllbnQ6ICIpOwotICAgICAgICAgICAgc2IuYXBwZW5kKHdlYlNlcnZpY2VDbGllbnRBbm5vdC50b1N0cmluZygpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh3ZWJGYXVsdEFubm90ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNiLmFwcGVuZChuZXdMaW5lKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgiV2ViRmF1bHQ6ICIpOwotICAgICAgICAgICAgc2IuYXBwZW5kKHdlYkZhdWx0QW5ub3QudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc2VydmljZU1vZGVBbm5vdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQobmV3TGluZSk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoIlNlcnZpY2VNb2RlOiAiKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZChzZXJ2aWNlTW9kZUFubm90LnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNvYXBCaW5kaW5nQW5ub3QgIT0gbnVsbCkgewotICAgICAgICAgICAgc2IuYXBwZW5kKG5ld0xpbmUpOwotICAgICAgICAgICAgc2IuYXBwZW5kKCJTT0FQQmluZGluZzogIik7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoc29hcEJpbmRpbmdBbm5vdC50b1N0cmluZygpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChoYW5kbGVyQ2hhaW5Bbm5vdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQobmV3TGluZSk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoIkhhbmRsZXJDaGFpbjogIik7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoaGFuZGxlckNoYWluQW5ub3QudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAod2ViU2VydmljZVJlZkFubm90TGlzdC5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQobmV3TGluZSk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoIk51bWJlciBvZiBXZWJTZXJ2aWNlUmVmOiAgIiArIHdlYlNlcnZpY2VSZWZBbm5vdExpc3Quc2l6ZSgpKTsKLSAgICAgICAgICAgIEl0ZXJhdG9yPFdlYlNlcnZpY2VSZWZBbm5vdD4gd3NySXRlciA9IHdlYlNlcnZpY2VSZWZBbm5vdExpc3QuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIHdoaWxlICh3c3JJdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIFdlYlNlcnZpY2VSZWZBbm5vdCB3c3IgPSB3c3JJdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQod3NyLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIHNiLmFwcGVuZChzYW1lTGluZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBzYi5hcHBlbmQobmV3TGluZSk7Ci0gICAgICAgIHNiLmFwcGVuZCgiTnVtYmVyIG9mIE1ldGhvZCBEZXNjcmlwdGlvbnM6ICIgKyBtZXRob2REZXNjcmlwdGlvbnMuc2l6ZSgpKTsKLSAgICAgICAgSXRlcmF0b3I8TWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGU+IG1kY0l0ZXIgPSBtZXRob2REZXNjcmlwdGlvbnMuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKG1kY0l0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQobmV3TGluZSk7Ci0gICAgICAgICAgICBNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSBtZGMgPSBtZGNJdGVyLm5leHQoKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZChtZGMudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBzYi5hcHBlbmQobmV3TGluZSk7Ci0gICAgICAgIHNiLmFwcGVuZCgiTnVtYmVyIG9mIEZpZWxkIERlc2NyaXB0aW9uczogIiArIGZpZWxkRGVzY3JpcHRpb25zLnNpemUoKSk7Ci0gICAgICAgIEl0ZXJhdG9yPEZpZWxkRGVzY3JpcHRpb25Db21wb3NpdGU+IGZkY0l0ZXIgPSBmaWVsZERlc2NyaXB0aW9ucy5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoZmRjSXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIHNiLmFwcGVuZChuZXdMaW5lKTsKLSAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRpb25Db21wb3NpdGUgZmRjID0gZmRjSXRlci5uZXh0KCk7Ci0JCQlzYi5hcHBlbmQoZmRjLnRvU3RyaW5nKCkpOwotCQl9Ci0gICAgICAgIAotICAgICAgICBpZihwb3J0Q29tcG9zaXRlTGlzdCAhPSBudWxsCi0gICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgICAgICAhcG9ydENvbXBvc2l0ZUxpc3QuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQobmV3TGluZSk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQobmV3TGluZSk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoIioqIFBvcnRDb21wb3NpdGUgT2JqZWN0cyoqIik7Ci0gICAgICAgICAgICBzYi5hcHBlbmQobmV3TGluZSk7Ci0gICAgICAgICAgICBmb3IoUG9ydENvbXBvc2l0ZSBwYyA6IHBvcnRDb21wb3NpdGVMaXN0KSB7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCJQb3J0Q29tcG9zaXRlIik7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKG5ld0xpbmUpOwotICAgICAgICAgICAgICAgIHNiLmFwcGVuZChwYy50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQobmV3TGluZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0JCXJldHVybiBzYi50b1N0cmluZygpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgd3NkbCBkZWZpbml0aW9uIGZyb20gdGhlIHN1cHBsaWVkIAotICAgICAqIGxvY2F0aW9uLgotICAgICAqIAotICAgICAqIEBwYXJhbSBfd3NkbFVSTCBUaGUgVVJMIHdoZXJlIHRoZSB3c2RsIGlzIGxvY2F0ZWQKLSAgICAgKiBAcmV0dXJuIFRoZSBXU0RMIERlZmluaXRpb24gb3IgTlVMTAotICAgICAqLwotICAgIHByaXZhdGUgRGVmaW5pdGlvbiBjcmVhdGVXc2RsRGVmaW5pdGlvbihVUkwgX3dzZGxVUkwpIHsKLSAgICAgICAgaWYgKF93c2RsVVJMID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgRGVmaW5pdGlvbiB3c2RsRGVmID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSApIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIm5ldyBXU0RMNEpXcmFwcGVyKCIgKyBfd3NkbFVSTC50b1N0cmluZygpICsgIixDb25maWd1cmF0aW9uQ29udGV4dCIgKTsgCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHdzZGxXcmFwcGVyID0gbmV3IFdTREw0SldyYXBwZXIoX3dzZGxVUkwsIG15Q29uZmlnQ29udGV4dCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmICh3c2RsV3JhcHBlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgd3NkbERlZiA9IHdzZGxXcmFwcGVyLmdldERlZmluaXRpb24oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlOmNyZWF0ZVdzZGxEZWZpbml0aW9uKCIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgX3dzZGxVUkwudG9TdHJpbmcoKQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiKTogQ2F1Z2h0IGV4Y2VwdGlvbiB0cnlpbmcgdG8gY3JlYXRlIFdTREwgRGVmaW5pdGlvbjogIgotICAgICAgICAgICAgICAgICAgICAgICAgK2UsIGUpOyAKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB3c2RsRGVmOwotICAgIH0KLQotICAgIHB1YmxpYyBDb25maWd1cmF0aW9uQ29udGV4dCBnZXRDb25maWd1cmF0aW9uQ29udGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIG15Q29uZmlnQ29udGV4dDsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQWRkcyBhIFBvcnRDb21wb3NpdGUgdG8gdGhlIGdlbmVyaWMgbGlzdC4gVGhpcyBsaXN0IG9mIFBvcnRDb21wb3NpdGUgb2JqZWN0cwotICAgICAqIGlzIG5vdCBrZXllZCBieSB3c2RsOnNlcnZpY2UgUU5hbWUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkUG9ydENvbXBvc2l0ZShQb3J0Q29tcG9zaXRlIHBvcnREQkMpIHsKLSAgICAgICAgcG9ydENvbXBvc2l0ZUxpc3QuYWRkKHBvcnREQkMpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBBZGRzIGEgUG9ydENvbXBvc2l0ZSB0byBhIGxpc3QgdGhhdCBpcyBrZXllZCBieSBhIHdzZGw6c2VydmljZSBRTmFtZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRQb3J0Q29tcG9zaXRlKFFOYW1lIHNlcnZpY2VRTmFtZSwgUG9ydENvbXBvc2l0ZSBwb3J0REJDKSB7Ci0gICAgICAgIExpc3Q8UG9ydENvbXBvc2l0ZT4gcGNMaXN0ID0gc1FOYW1lVG9QQy5nZXQoc2VydmljZVFOYW1lKTsKLSAgICAgICAgaWYocGNMaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHBjTGlzdCA9IG5ldyBMaW5rZWRMaXN0PFBvcnRDb21wb3NpdGU+KCk7Ci0gICAgICAgICAgICBzUU5hbWVUb1BDLnB1dChzZXJ2aWNlUU5hbWUsIHBjTGlzdCk7Ci0gICAgICAgIH0KLSAgICAgICAgcGNMaXN0LmFkZChwb3J0REJDKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgZ2VuZXJpYyBQb3J0Q29tcG9zaXRlIGluc3RhbmNlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxQb3J0Q29tcG9zaXRlPiBnZXRQb3J0Q29tcG9zaXRlcygpIHsKLSAgICAgICAgcmV0dXJuIHBvcnRDb21wb3NpdGVMaXN0OwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBHZXRzIGFsbCB0aGUgUG9ydENvbXBvc2l0ZSBpbnN0YW5jZXMgYXNzb2NpYXRlZCB3aXRoIGEgcGFydGljdWxhciB3c2RsOnNlcnZpY2UgUU5hbWUuCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PFBvcnRDb21wb3NpdGU+IGdldFBvcnRDb21wb3NpdGVzKFFOYW1lIHNlcnZpY2VRTmFtZSkgewotICAgICAgICByZXR1cm4gc1FOYW1lVG9QQy5nZXQoc2VydmljZVFOYW1lKTsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9idWlsZGVyL0Rlc2NyaXB0aW9uQnVpbGRlclV0aWxzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9idWlsZGVyL0Rlc2NyaXB0aW9uQnVpbGRlclV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5YWQ1YzEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9EZXNjcmlwdGlvbkJ1aWxkZXJVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDM3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5FeGNlcHRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaTE4bi5NZXNzYWdlczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbjsKLQotLyoqCi0gKiAKLSAqLwotY2xhc3MgRGVzY3JpcHRpb25CdWlsZGVyVXRpbHMgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKERlc2NyaXB0aW9uQnVpbGRlclV0aWxzLmNsYXNzKTsKLQotICAgIHN0YXRpYyBTdHJpbmcgSkFYV1NfSE9MREVSX0NMQVNTID0gImphdmF4LnhtbC53cy5Ib2xkZXIiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOVF9QUklNSVRJVkUgPSAiaW50IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5UX1BSSU1JVElWRV9FTkNPRElORyA9ICJJIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQllURV9QUklNSVRJVkUgPSAiYnl0ZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJZVEVfUFJJTUlUSVZFX0VOQ09ESU5HID0gIkIiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDSEFSX1BSSU1JVElWRSA9ICJjaGFyIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hBUl9QUklNSVRJVkVfRU5DT0RJTkcgPSAiQyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNIT1JUX1BSSU1JVElWRSA9ICJzaG9ydCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNIT1JUX1BSSU1JVElWRV9FTkNPRElORyA9ICJTIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQk9PTEVBTl9QUklNSVRJVkUgPSAiYm9vbGVhbiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJPT0xFQU5fUFJJTUlUSVZFX0VOQ09ESU5HID0gIloiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT05HX1BSSU1JVElWRSA9ICJsb25nIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9OR19QUklNSVRJVkVfRU5DT0RJTkcgPSAiSiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZMT0FUX1BSSU1JVElWRSA9ICJmbG9hdCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZMT0FUX1BSSU1JVElWRV9FTkNPRElORyA9ICJGIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9VQkxFX1BSSU1JVElWRSA9ICJkb3VibGUiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBET1VCTEVfUFJJTUlUSVZFX0VOQ09ESU5HID0gIkQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWT0lEX1BSSU1JVElWRSA9ICJ2b2lkIjsKLSAgICAvLyBSRVZJRVc6IFRoaXMgbWF5IG5vdCBiZSB0aGUgY29ycmVjdCBlbmNvZGluZyBmb3IgVm9pZAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWT0lEX1BSSU1JVElWRV9FTkNPRElORyA9ICJWIjsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBvdXRlcm1vc3QgZ2VuZXJpYyByYXcgdHlwZSBjbGFzcywgb3IgbnVsbCBpZiB0aGUgYXJndW1lbnQKLSAgICAgKiBpcyBub3QgYSBnZW5lcmljLiAgRm9yIGV4YW1wbGUgaWYgdGhlIHN0cmluZyAiamF2YXgueG1sLndzLkhvbGRlcjxteS5wYWNrYWdlLk15T2JqZWN0PiIgaXMKLSAgICAgKiBwYXNzZWQgaW4sIHRoZSBzdHJpbmcgImphdmF4LnhtbC53cy5Ib2xkZXIiIHdpbGwgYmUgcmV0dXJuZWQuCi0gICAgICogPHAvPgotICAgICAqIE5vdGUgdGhhdCBnZW5lcmljIGFycmF5cyBhcmUgc3VwcG9ydGVkLiAgRm9yIGV4YW1wbGUsIGZvciAiSG9sZGVyPExpc3Q8U3RyaW5nPltdW10iLCB0aGUKLSAgICAgKiByZXR1cm5lZCB2YWx1ZSB3aWxsIGJlICJMaXN0W11bXSIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaW5wdXRUeXBlCi0gICAgICogQHJldHVybiBBIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGdlbmVyaWMgcmF3IHR5cGUgb3IgbnVsbCBpZiB0aGVyZSBpcyBubyBnZW5lcmljLgotICAgICAqLwotICAgIHN0YXRpYyBTdHJpbmcgZ2V0UmF3VHlwZShTdHJpbmcgaW5wdXRUeXBlKSB7Ci0gICAgICAgIFN0cmluZyByZXR1cm5SYXdUeXBlID0gbnVsbDsKLSAgICAgICAgaW50IGxlZnRCcmFja2V0ID0gaW5wdXRUeXBlLmluZGV4T2YoIjwiKTsKLSAgICAgICAgaW50IHJpZ2h0QnJhY2tldCA9IGlucHV0VHlwZS5sYXN0SW5kZXhPZigiPiIpOwotICAgICAgICBpZiAobGVmdEJyYWNrZXQgPiAwICYmIHJpZ2h0QnJhY2tldCA+IDAgJiYgcmlnaHRCcmFja2V0ID4gbGVmdEJyYWNrZXQpIHsKLSAgICAgICAgICAgIFN0cmluZyBwYXJ0MSA9IGlucHV0VHlwZS5zdWJzdHJpbmcoMCwgbGVmdEJyYWNrZXQpOwotICAgICAgICAgICAgaWYgKChyaWdodEJyYWNrZXQgKyAxKSA9PSBpbnB1dFR5cGUubGVuZ3RoKCkpIHsKLSAgICAgICAgICAgICAgICAvLyBUaGVyZSBpcyBub3RoaW5nIGFmdGVyIHRoZSBjbG9zaW5nICI+IiB3ZSBuZWVkIHRvIGFwcGVuZCB0byB0aGUgcmF3IHR5cGUKLSAgICAgICAgICAgICAgICByZXR1cm5SYXdUeXBlID0gcGFydDE7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIFNraXAgb3ZlciB0aGUgY2xvc2luZyAiPiIgdGhlbiBhcHBlbmQgdGhlIHJlc3Qgb2YgdGhlIHN0cmluZyB0byB0aGUgcmF3IHR5cGUKLSAgICAgICAgICAgICAgICAvLyBUaGlzIHdvdWxkIGJlIGFuIGFycmF5IGRlY2xhcmF0aW9uIGZvciBleGFtcGxlLgotICAgICAgICAgICAgICAgIFN0cmluZyBwYXJ0MiA9IGlucHV0VHlwZS5zdWJzdHJpbmcocmlnaHRCcmFja2V0ICsgMSkudHJpbSgpOwotICAgICAgICAgICAgICAgIHJldHVyblJhd1R5cGUgPSBwYXJ0MSArIHBhcnQyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXR1cm5SYXdUeXBlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgYWN0dWFsIHR5cGUgaW4gYSBKQVgtV1MgaG9sZGVyIGRlY2xhcmF0aW9uLiAgRm9yIGV4YW1wbGUsIGZvciB0aGUgYXJndW1lbnQKLSAgICAgKiAiamF2YXgueG1sLndzLkhvbGRlcjxteS5wYWNrYWdlLk15T2JqZWN0PiIsIHJldHVybiAibXkucGFja2FnZS5NeU9iamVjdCIuIElmIHRoZSBhY3R1YWwgdHlwZQotICAgICAqIGl0c2VsZiBpcyBhIGdlbmVyaWMsIHRoZW4gdGhhdCByYXcgdHlwZSB3aWxsIGJlIHJldHVybmVkLiAgRm9yIGV4YW1wbGUsCi0gICAgICogImphdmF4LnhtbC53cy5Ib2xkZXI8amF2YS51dGlsLkxpc3Q8bXkucGFja2FnZS5NeU9iamVjdD4+IiB3aWxsIHJldHVybiAiamF2YS51dGlsLkxpc3QiLgotICAgICAqIDxwLz4KLSAgICAgKiBOb3RlIHRoYXQgSG9sZGVycyBvZiBBcnJheXMgYW5kIG9mIEdlbmVyaWMgQXJyYXlzIGFyZSBhbHNvIHN1cHBvcnRlZC4gIEZvciBleGFtcGxlLCBmb3IKLSAgICAgKiAiamF2YXgueG1sLndzLkhvbGRlcjxTdHJpbmdbXT4iLCByZXR1cm4gIlN0cmluZ1tdIi4gIEZvciBhbiBhcnJheSBvZiBhIGdlbmVyaWMsIHRoZSBhcnJheSBvZgotICAgICAqIHRoZSByYXcgdHlwZSBpcyByZXR1cm5lZC4gIEZvciBleGFtcGxlLCBmb3IgImphdmF4LnhtbC53cy5Ib2xkZXI8TGlzdDxTdHJpbmc+W11bXT4iLCByZXR1cm4KLSAgICAgKiAiTGlzdFtdW10iLgotICAgICAqIDxwLz4KLSAgICAgKiBJbXBvcnRhbnQgbm90ZSEgIFRoZSBKQVgtV1MgSG9sZGVyIGdlbmVyaWMgb25seSBzdXBwb3J0cyBhIHNpbmdsZSBhY3R1YWwgdHlwZSwgaS5lLiB0aGUKLSAgICAgKiBnZW5lcmljIGlzIGphdmF4LnhtbC53cy5Ib2xkZXI8VD4uICBUaGlzIG1ldGhvZCBpcyBub3QgZ2VuZXJhbCBwdXJwb3NlOyBpdCBkb2VzIG5vdCBzdXBwb3J0Ci0gICAgICogZ2VuZXJpY3Mgd2l0aCBtdWx0aXBsZSB0eXBlcyBzdWNoIGFzIEdlbmVyaWM8SyxWPiBhdCB0aGUgb3V0ZXJtb3N0IGxldmVsLgotICAgICAqCi0gICAgICogQHBhcmFtIGhvbGRlcklucHV0U3RyaW5nCi0gICAgICogQHJldHVybiByZXR1cm4gdGhlIGFjdHVhbCBhcmd1bWVudCBjbGFzcyBuYW1lIGZvciBhIEpBWC1XUyBIb2xkZXI7IHJldHVybnMgbnVsbCBpZiB0aGUKLSAgICAgKiAgICAgICAgIGFyZ3VtZW50IGlzIG5vdCBhIEpBWC1XUyBIb2xkZXIKLSAgICAgKi8KLSAgICBzdGF0aWMgU3RyaW5nIGdldEhvbGRlckFjdHVhbFR5cGUoU3RyaW5nIGhvbGRlcklucHV0U3RyaW5nKSB7Ci0gICAgICAgIFN0cmluZyByZXR1cm5TdHJpbmcgPSBudWxsOwotICAgICAgICBpZiAoRGVzY3JpcHRpb25CdWlsZGVyVXRpbHMuaXNIb2xkZXJUeXBlKGhvbGRlcklucHV0U3RyaW5nKSkgewotICAgICAgICAgICAgaW50IGxlZnRCcmFja2V0ID0gaG9sZGVySW5wdXRTdHJpbmcuaW5kZXhPZigiPCIpOwotICAgICAgICAgICAgaW50IHJpZ2h0QnJhY2tldCA9IGhvbGRlcklucHV0U3RyaW5nLmxhc3RJbmRleE9mKCI+Iik7Ci0gICAgICAgICAgICBpZiAobGVmdEJyYWNrZXQgPiAwICYmIHJpZ2h0QnJhY2tldCA+IGxlZnRCcmFja2V0ICsgMSkgewotICAgICAgICAgICAgICAgIC8vIEdldCBldmVyeXRoaW5nIGJldHdlZW4gdGhlIG91dGVybW9zdCAiPCIgYW5kICI+IgotICAgICAgICAgICAgICAgIFN0cmluZyBhY3R1YWxUeXBlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGhvbGRlcklucHV0U3RyaW5nLnN1YnN0cmluZyhsZWZ0QnJhY2tldCArIDEsIHJpZ2h0QnJhY2tldCkudHJpbSgpOwotICAgICAgICAgICAgICAgIC8vIElmIHRoZSBob2xkZXIgY29udGFpbmVkIGEgZ2VuZXJpYywgdGhlbiBnZXQgdGhlIGdlbmVyaWMgcmF3IHR5cGUgKGUuZy4gIkxpc3QiIGZvcgotICAgICAgICAgICAgICAgIC8vIEhvbGRlcjxMaXN0PFN0cmluZz4+KS4KLSAgICAgICAgICAgICAgICBTdHJpbmcgcmF3VHlwZSA9IGdldFJhd1R5cGUoYWN0dWFsVHlwZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHJhd1R5cGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm5TdHJpbmcgPSByYXdUeXBlOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5TdHJpbmcgPSBhY3R1YWxUeXBlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0dXJuU3RyaW5nOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQ2hlY2sgaWYgdGhlIGlucHV0IFN0cmluZyBpcyBhIEpBWC1XUyBIb2xkZXIuICBGb3IgZXhhbXBsZSAiamF2YXgueG1sLndzLkhvbGRlcjxteS5wYWNrYWdlLk15T2JqZWN0PiIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2hlY2tUeXBlCi0gICAgICogQHJldHVybiB0cnVlIGlmIGl0IGlzIGEgSkFYLVdTIEhvbGRlciB0eXBlOyBmYWxzZSBvdGhlcndpc2UuCi0gICAgICovCi0gICAgc3RhdGljIGJvb2xlYW4gaXNIb2xkZXJUeXBlKFN0cmluZyBjaGVja1R5cGUpIHsKLSAgICAgICAgYm9vbGVhbiBpc0hvbGRlciA9IGZhbHNlOwotICAgICAgICBpZiAoY2hlY2tUeXBlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChjaGVja1R5cGUuc3RhcnRzV2l0aChKQVhXU19IT0xERVJfQ0xBU1MpKSB7Ci0gICAgICAgICAgICAgICAgaXNIb2xkZXIgPSBjaGVja1R5cGUubGVuZ3RoKCkgPT0gSkFYV1NfSE9MREVSX0NMQVNTLmxlbmd0aCgpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja1R5cGUuY2hhckF0KEpBWFdTX0hPTERFUl9DTEFTUy5sZW5ndGgoKSkgPT0gJzwnOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpc0hvbGRlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBbnN3ZXJzIGlmIHRoZSBTdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBjbGFzcyBjb250YWlucyBhbiBhcnJheSBkZWNsYXJhdGlvbi4gRm9yIGV4YW1wbGUKLSAgICAgKiAiRm9vW11bXSIgd291bGQgcmV0dXJuIHRydWUsIGFzIHdvdWxkICJpbnRbXSIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2xhc3NOYW1lCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHN0YXRpYyBib29sZWFuIGlzQ2xhc3NBbkFycmF5KFN0cmluZyBjbGFzc05hbWUpIHsKLSAgICAgICAgaWYgKGNsYXNzTmFtZSAhPSBudWxsICYmIGNsYXNzTmFtZS5pbmRleE9mKCJbIikgPiAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZvciBhbiBjbGFzcyBuYW1lIHRoYXQgaXMgYW4gYXJyYXksIHJldHVybiB0aGUgbm9uLWFycmF5IGRlY2xhcmF0aW9uIHBvcnRpb24uIEZvciBleGFtcGxlCi0gICAgICogIm15LnBhY2thZ2UuRm9vW11bXSIgd291bGQgcmV0dXJuICJteS5wYWNrYWdlLkZvbyIuIFJldHVybnMgbnVsbCBpZiB0aGUgYXJndW1lbnQgZG9lcyBub3QKLSAgICAgKiBjb250YWluIGFuIGFycmF5IGRlY2xhcmF0aW9uLgotICAgICAqCi0gICAgICogQHBhcmFtIGZ1bGxDbGFzc05hbWUKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgc3RhdGljIFN0cmluZyBnZXRCYXNlQXJyYXlDbGFzc05hbWUoU3RyaW5nIGZ1bGxDbGFzc05hbWUpIHsKLSAgICAgICAgU3RyaW5nIGJhc2VBcnJheUNsYXNzTmFtZSA9IG51bGw7Ci0gICAgICAgIGlmIChmdWxsQ2xhc3NOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIGludCBmaXJzdEFycmF5RGltZW5zaW9uID0gZnVsbENsYXNzTmFtZS5pbmRleE9mKCJbIik7Ci0gICAgICAgICAgICBpZiAoZmlyc3RBcnJheURpbWVuc2lvbiA+IDApIHsKLSAgICAgICAgICAgICAgICBiYXNlQXJyYXlDbGFzc05hbWUgPSBmdWxsQ2xhc3NOYW1lLnN1YnN0cmluZygwLCBmaXJzdEFycmF5RGltZW5zaW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYmFzZUFycmF5Q2xhc3NOYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiBhIHByZWZpeCBzdWl0YWJsZSBmb3IgcGFzc2luZyB0byBDbGFzcy5mb3JOYW1lKFN0cmluZykgZm9yIGFuIGFycmF5LiAgRWFjaCBhcnJheQotICAgICAqIGRpbWVuc2lvbiByZXByZXNlbnRlZCBieSAiW10iIHdpbGwgYmUgcmVwcmVzZW50ZWQgYnkgYSBzaW5nbGUgIlsiLgotICAgICAqCi0gICAgICogQHBhcmFtIGFycmF5Q2xhc3NOYW1lCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHN0YXRpYyBTdHJpbmcgZ2V0QXJyYXlEaW1lbnNpb25QcmVmaXgoU3RyaW5nIGFycmF5Q2xhc3NOYW1lKSB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBhcnJheURpbVByZWZpeCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotICAgICAgICBpZiAoYXJyYXlDbGFzc05hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgaW50IGFycmF5RGltSW5kZXggPSBhcnJheUNsYXNzTmFtZS5pbmRleE9mKCJbXSIpOwotICAgICAgICAgICAgd2hpbGUgKGFycmF5RGltSW5kZXggPiAwKSB7Ci0gICAgICAgICAgICAgICAgYXJyYXlEaW1QcmVmaXguYXBwZW5kKCJbIik7Ci0gICAgICAgICAgICAgICAgLy8gU2tpcCBvdmVyIHRoaXMgIltdIiBhbmQgc2VlIGlmIHRoZXJlIGFyZSBhbnkgbW9yZS4KLSAgICAgICAgICAgICAgICBpbnQgc3RhcnROZXh0ID0gYXJyYXlEaW1JbmRleCArIDI7Ci0gICAgICAgICAgICAgICAgYXJyYXlEaW1JbmRleCA9IGFycmF5Q2xhc3NOYW1lLmluZGV4T2YoIltdIiwgc3RhcnROZXh0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChhcnJheURpbVByZWZpeC5sZW5ndGgoKSA+IDApCi0gICAgICAgICAgICByZXR1cm4gYXJyYXlEaW1QcmVmaXgudG9TdHJpbmcoKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRm9yIHByaW1pdGl2ZXMsIHJldHVybiB0aGUgYXBwcm9wcmlhdGUgcHJpbWl0aXZlIGNsYXNzLiAgTm90ZSB0aGF0IGFycmF5cyBvZiBwcmltaXRpdmVzIGFyZQotICAgICAqIGhhbmRsZWQgZGlmZmVyZW50bHksIGxpa2UgYXJyYXlzIG9mIG9iamVjdHMuICBPbmx5IG5vbi1hcnJheSBwcmltaXRpdmVzIGFyZSBwcm9jZXNzZWQgYnkgdGhpcwotICAgICAqIG1ldGhvZC4gIFRoaXMgbWV0aG9kIHVuZGVyc3RhbmRzIGJvdGggdGhlIHR5cGljYWwgcHJpbWl0aXZlIGRlY2xhcmF0aW9uIChlLmcuICJpbnQiKSBhbmQgdGhlCi0gICAgICogZW5jb2RpbmcgdXNlZCBhcyBmb3IgYXJyYXlzIChlLmcuICJJIikuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2xhc3NUeXBlCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHN0YXRpYyBDbGFzcyBnZXRQcmltaXRpdmVDbGFzcyhTdHJpbmcgY2xhc3NUeXBlKSB7Ci0KLSAgICAgICAgQ2xhc3MgcGFyYW1DbGFzcyA9IG51bGw7Ci0KLSAgICAgICAgaWYgKElOVF9QUklNSVRJVkUuZXF1YWxzKGNsYXNzVHlwZSkgfHwgSU5UX1BSSU1JVElWRV9FTkNPRElORy5lcXVhbHMoY2xhc3NUeXBlKSkgewotICAgICAgICAgICAgcGFyYW1DbGFzcyA9IGludC5jbGFzczsKLSAgICAgICAgfSBlbHNlIGlmIChCWVRFX1BSSU1JVElWRS5lcXVhbHMoY2xhc3NUeXBlKSB8fCBCWVRFX1BSSU1JVElWRV9FTkNPRElORy5lcXVhbHMoY2xhc3NUeXBlKSkgewotICAgICAgICAgICAgcGFyYW1DbGFzcyA9IGJ5dGUuY2xhc3M7Ci0gICAgICAgIH0gZWxzZSBpZiAoQ0hBUl9QUklNSVRJVkUuZXF1YWxzKGNsYXNzVHlwZSkgfHwgQ0hBUl9QUklNSVRJVkVfRU5DT0RJTkcuZXF1YWxzKGNsYXNzVHlwZSkpIHsKLSAgICAgICAgICAgIHBhcmFtQ2xhc3MgPSBjaGFyLmNsYXNzOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgaWYgKFNIT1JUX1BSSU1JVElWRS5lcXVhbHMoY2xhc3NUeXBlKSB8fCBTSE9SVF9QUklNSVRJVkVfRU5DT0RJTkcuZXF1YWxzKGNsYXNzVHlwZSkpIHsKLSAgICAgICAgICAgIHBhcmFtQ2xhc3MgPSBzaG9ydC5jbGFzczsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgIGlmIChCT09MRUFOX1BSSU1JVElWRS5lcXVhbHMoY2xhc3NUeXBlKSB8fCBCT09MRUFOX1BSSU1JVElWRV9FTkNPRElORy5lcXVhbHMoY2xhc3NUeXBlKSkgewotICAgICAgICAgICAgcGFyYW1DbGFzcyA9IGJvb2xlYW4uY2xhc3M7Ci0gICAgICAgIH0gZWxzZSBpZiAoTE9OR19QUklNSVRJVkUuZXF1YWxzKGNsYXNzVHlwZSkgfHwgTE9OR19QUklNSVRJVkVfRU5DT0RJTkcuZXF1YWxzKGNsYXNzVHlwZSkpIHsKLSAgICAgICAgICAgIHBhcmFtQ2xhc3MgPSBsb25nLmNsYXNzOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgaWYgKEZMT0FUX1BSSU1JVElWRS5lcXVhbHMoY2xhc3NUeXBlKSB8fCBGTE9BVF9QUklNSVRJVkVfRU5DT0RJTkcuZXF1YWxzKGNsYXNzVHlwZSkpIHsKLSAgICAgICAgICAgIHBhcmFtQ2xhc3MgPSBmbG9hdC5jbGFzczsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgIGlmIChET1VCTEVfUFJJTUlUSVZFLmVxdWFscyhjbGFzc1R5cGUpIHx8IERPVUJMRV9QUklNSVRJVkVfRU5DT0RJTkcuZXF1YWxzKGNsYXNzVHlwZSkpIHsKLSAgICAgICAgICAgIHBhcmFtQ2xhc3MgPSBkb3VibGUuY2xhc3M7Ci0gICAgICAgIH0gZWxzZSBpZiAoVk9JRF9QUklNSVRJVkUuZXF1YWxzKGNsYXNzVHlwZSkgfHwgVk9JRF9QUklNSVRJVkVfRU5DT0RJTkcuZXF1YWxzKGNsYXNzVHlwZSkpIHsKLSAgICAgICAgICAgIHBhcmFtQ2xhc3MgPSB2b2lkLmNsYXNzOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwYXJhbUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGVuY29kaW5nIHVzZWQgdG8gcmVwcmVzZW50IGEgQ2xhc3MgZm9yIGFuIGFycmF5IG9mIGEgcHJpbWl0aXZlIHR5cGUuICBGb3IKLSAgICAgKiBleGFtcGxlLCBhbiBhcnJheSBvZiBib29sZWFuIGlzIHJlcHJlc2VudGVkIGJ5ICJaIi4gVGhpcyBpcyBhcyBkZXNjcmliZWQgaW4gdGhlIGphdmFkb2MgZm9yCi0gICAgICogQ2xhc3MuZ2V0TmFtZSgpLiAgSWYgdGhlIGFyZ3VtZW50IGlzIG5vdCBhIHByaW1pdGl2ZSB0eXBlLCBhIG51bGwgd2lsbCBiZSByZXR1cm5lZC4KLSAgICAgKiA8cC8+Ci0gICAgICogTm90ZSB0aGF0IGFycmF5cyBvZiB2b2lkcyBhcmUgbm90IGFsbG93ZWQ7IGEgbnVsbCB3aWxsIGJlIHJldHVybmVkLgotICAgICAqCi0gICAgICogQHBhcmFtIHByaW1pdGl2ZVR5cGUKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgc3RhdGljIFN0cmluZyBnZXRQcmltaXRpdmVUeXBlQXJyYXlFbmNvZGluZyhTdHJpbmcgcHJpbWl0aXZlVHlwZSkgewotICAgICAgICBTdHJpbmcgZW5jb2RpbmcgPSBudWxsOwotCi0gICAgICAgIGlmIChCT09MRUFOX1BSSU1JVElWRS5lcXVhbHMocHJpbWl0aXZlVHlwZSkpIHsKLSAgICAgICAgICAgIGVuY29kaW5nID0gQk9PTEVBTl9QUklNSVRJVkVfRU5DT0RJTkc7Ci0gICAgICAgIH0gZWxzZSBpZiAoQllURV9QUklNSVRJVkUuZXF1YWxzKHByaW1pdGl2ZVR5cGUpKSB7Ci0gICAgICAgICAgICBlbmNvZGluZyA9IEJZVEVfUFJJTUlUSVZFX0VOQ09ESU5HOwotICAgICAgICB9IGVsc2UgaWYgKENIQVJfUFJJTUlUSVZFLmVxdWFscyhwcmltaXRpdmVUeXBlKSkgewotICAgICAgICAgICAgZW5jb2RpbmcgPSBDSEFSX1BSSU1JVElWRV9FTkNPRElORzsKLSAgICAgICAgfSBlbHNlIGlmIChET1VCTEVfUFJJTUlUSVZFLmVxdWFscyhwcmltaXRpdmVUeXBlKSkgewotICAgICAgICAgICAgZW5jb2RpbmcgPSBET1VCTEVfUFJJTUlUSVZFX0VOQ09ESU5HOwotICAgICAgICB9IGVsc2UgaWYgKEZMT0FUX1BSSU1JVElWRS5lcXVhbHMocHJpbWl0aXZlVHlwZSkpIHsKLSAgICAgICAgICAgIGVuY29kaW5nID0gRkxPQVRfUFJJTUlUSVZFX0VOQ09ESU5HOwotICAgICAgICB9IGVsc2UgaWYgKElOVF9QUklNSVRJVkUuZXF1YWxzKHByaW1pdGl2ZVR5cGUpKSB7Ci0gICAgICAgICAgICBlbmNvZGluZyA9IElOVF9QUklNSVRJVkVfRU5DT0RJTkc7Ci0gICAgICAgIH0gZWxzZSBpZiAoTE9OR19QUklNSVRJVkUuZXF1YWxzKHByaW1pdGl2ZVR5cGUpKSB7Ci0gICAgICAgICAgICBlbmNvZGluZyA9IExPTkdfUFJJTUlUSVZFX0VOQ09ESU5HOwotICAgICAgICB9IGVsc2UgaWYgKFNIT1JUX1BSSU1JVElWRS5lcXVhbHMocHJpbWl0aXZlVHlwZSkpIHsKLSAgICAgICAgICAgIGVuY29kaW5nID0gU0hPUlRfUFJJTUlUSVZFX0VOQ09ESU5HOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBlbmNvZGluZzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJZiB0aGUgcGFyYW1ldGVyIHJlcHJlc2VudHMgYW5kIGFycmF5LCB0aGVuIHRoZSByZXR1cm5lZCBzdHJpbmcgaXMgaW4gYSBmb3JtYXQgdGhhdCBhCi0gICAgICogQ2xhc3MuZm9yTmFtZShTdHJpbmcpIGNhbiBiZSBkb25lIG9uIGl0LiAgVGhpcyBmb3JtYXQgaXMgZGVzY3JpYmVkIGJ5IENsYXNzLmdldE5hbWUoKS4gSWYgdGhlCi0gICAgICogcGFyYW1ldGVyIGRvZXMgbm90IHJlcHJlc2VudCBhbiBhcnJheSwgdGhlIHBhcmVtZW10ZXIgaXMgcmV0dXJuZWQgdW5tb2RpZmllZC4KLSAgICAgKiA8cC8+Ci0gICAgICogTm90ZSB0aGF0IGFycmF5cyBvZiBwcmltaXRpdmVzIGFyZSBwcm9jZXNzZWQgYXMgd2VsbCBhcyBhcnJheXMgb2Ygb2JqZWN0cy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjbGFzc1RvTG9hZAotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBzdGF0aWMgU3RyaW5nIHJlcGFyc2VJZkFycmF5KFN0cmluZyBjbGFzc1RvTG9hZCkgewotCi0gICAgICAgIFN0cmluZyByZXBhcnNlZENsYXNzTmFtZSA9IGNsYXNzVG9Mb2FkOwotICAgICAgICBpZiAoaXNDbGFzc0FuQXJyYXkoY2xhc3NUb0xvYWQpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgYmFzZVR5cGUgPSBnZXRCYXNlQXJyYXlDbGFzc05hbWUoY2xhc3NUb0xvYWQpOwotICAgICAgICAgICAgU3RyaW5nIGRpbWVuc2lvblByZWZpeCA9IGdldEFycmF5RGltZW5zaW9uUHJlZml4KGNsYXNzVG9Mb2FkKTsKLSAgICAgICAgICAgIGlmIChnZXRQcmltaXRpdmVUeXBlQXJyYXlFbmNvZGluZyhiYXNlVHlwZSkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJlcGFyc2VkQ2xhc3NOYW1lID0gZGltZW5zaW9uUHJlZml4ICsgZ2V0UHJpbWl0aXZlVHlwZUFycmF5RW5jb2RpbmcoYmFzZVR5cGUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXBhcnNlZENsYXNzTmFtZSA9IGRpbWVuc2lvblByZWZpeCArICJMIiArIGJhc2VUeXBlICsgIjsiOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXBhcnNlZENsYXNzTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMb2FkIGEgY2xhc3MgcmVwcmVzZW50ZWQgaW4gYSBEZXNjcmlwdGlvbiBCdWlsZGVyIENvbXBvc2l0ZS4gIElmIGEgY2xhc3Nsb2FkZXIgaXMgc3BlY2lmaWVkLAotICAgICAqIGl0IHdpbGwgYmUgdXNlZDsgb3RoZXJ3aXNlIHRoZSBkZWZhdWx0IGNsYXNzbG9hZGVyIGlzIHVzZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2xhc3NUb0xvYWQKLSAgICAgKiBAcGFyYW0gY2xhc3NMb2FkZXIKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgc3RhdGljIENsYXNzIGxvYWRDbGFzc0Zyb21Db21wb3NpdGUoU3RyaW5nIGNsYXNzVG9Mb2FkLCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikgewotICAgICAgICBDbGFzcyByZXR1cm5DbGFzcyA9IG51bGw7Ci0KLSAgICAgICAgLy8gSWYgdGhpcyBpcyBhbiBhcnJheSwgdGhlbiBjcmVhdGUgYSBzdHJpbmcgdmVyc2lvbiBhcyBkZXNjcmliZWQgYnkgQ2xhc3MuZ2V0TmFtZS4KLSAgICAgICAgLy8gRm9yIGV4YW1wbGUsICJGb29bXVtdIiBiZWNvbWVzICJbW0xGb28iLiAgTm90ZSB0aGF0IGFycmF5cyBvZiBwcmltaXRpdmVzIG11c3QgYWxzbyBiZSBwYXJzZWQuCi0gICAgICAgIGNsYXNzVG9Mb2FkID0gRGVzY3JpcHRpb25CdWlsZGVyVXRpbHMucmVwYXJzZUlmQXJyYXkoY2xhc3NUb0xvYWQpOwotCi0gICAgICAgIGlmIChjbGFzc0xvYWRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBVc2UgdGhlIHNwZWNpZmllZCBjbGFzc2xvYWRlciB0byBsb2FkIHRoZSBjbGFzcy4KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuQ2xhc3MgPSBmb3JOYW1lKGNsYXNzVG9Mb2FkLCBmYWxzZSwgY2xhc3NMb2FkZXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy9DYXRjaCBUaHJvd2FibGUgYXMgQ2xhc3NMb2FkZXIgY2FuIHRocm93IGFuIE5vQ2xhc3NEZWZGb3VuZEVycm9yIHRoYXQKLSAgICAgICAgICAgIC8vZG9lcyBub3QgZXh0ZW5kIEV4Y2VwdGlvbiwgc28gbGV0cyBjYXRjaCBldmVyeXRoaW5nIHRoYXQgZXh0ZW5kcyBUaHJvd2FibGUKLSAgICAgICAgICAgIC8vcmF0aGVyIHRoYW4ganVzdCBFeGNlcHRpb24uCi0gICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIGV4KSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoIkRCVUNsYXNzTm90Rm91bmQiLCBjbGFzc1RvTG9hZCwgY2xhc3NMb2FkZXIudG9TdHJpbmcoKSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy9Vc2UgdGhlIHRocmVhZCBjb250ZXh0IGNsYXNzIGxvYWRlciB0byBsb2FkIHRoZSBjbGFzcy4KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuQ2xhc3MgPSBmb3JOYW1lKGNsYXNzVG9Mb2FkLCBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRDb250ZXh0Q2xhc3NMb2FkZXIobnVsbCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSBleCkgewotICAgICAgICAgICAgICAgIC8vVXNlIHRoZSBkZWZhdWx0IGNsYXNzbG9hZGVyIHRvIGxvYWQgdGhlIGNsYXNzLgotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybkNsYXNzID0gZm9yTmFtZShjbGFzc1RvTG9hZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vQ2F0Y2ggVGhyb3dhYmxlIGFzIENsYXNzTG9hZGVyIGNhbiB0aHJvdyBhbiBOb0NsYXNzRGVmRm91bmRFcnJvciB0aGF0Ci0gICAgICAgICAgICAgICAgLy9kb2VzIG5vdCBleHRlbmQgRXhjZXB0aW9uCi0gICAgICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSBleDIpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRNZXNzYWdlKCJEQlVDbGFzc05vdEZvdW5kMiIsIGNsYXNzVG9Mb2FkKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXR1cm5DbGFzczsKLSAgICB9Ci0KLSAgICBzdGF0aWMgYm9vbGVhbiBpc0VtcHR5KFN0cmluZyBzdHJpbmcpIHsKLSAgICAgICAgcmV0dXJuIChzdHJpbmcgPT0gbnVsbCB8fCAiIi5lcXVhbHMoc3RyaW5nKSk7Ci0gICAgfQotCi0gICAgc3RhdGljIGJvb2xlYW4gaXNFbXB0eShRTmFtZSBxbmFtZSkgewotICAgICAgICByZXR1cm4gcW5hbWUgPT0gbnVsbCB8fCBpc0VtcHR5KHFuYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIGNsYXNzIGZvciB0aGlzIG5hbWUKLSAgICAgKgotICAgICAqIEByZXR1cm4gQ2xhc3MKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBDbGFzcyBmb3JOYW1lKGZpbmFsIFN0cmluZyBjbGFzc05hbWUsIGZpbmFsIGJvb2xlYW4gaW5pdGlhbGl6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ2xhc3NMb2FkZXIgY2xhc3Nsb2FkZXIpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgQ2xhc3MgY2wgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY2wgPSAoQ2xhc3MpIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAotICAgICAgICAgICAgICAgICAgICBuZXcgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSwgaW5pdGlhbGl6ZSwgY2xhc3Nsb2FkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICApOwotICAgICAgICB9IGNhdGNoIChQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiRXhjZXB0aW9uIHRocm93biBmcm9tIEFjY2Vzc0NvbnRyb2xsZXI6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aHJvdyAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbikgZS5nZXRFeGNlcHRpb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIGNsYXNzIGZvciB0aGlzIG5hbWUKLSAgICAgKgotICAgICAqIEByZXR1cm4gQ2xhc3MKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBDbGFzcyBmb3JOYW1lKGZpbmFsIFN0cmluZyBjbGFzc05hbWUpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgQ2xhc3MgY2wgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY2wgPSAoQ2xhc3MpIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAotICAgICAgICAgICAgICAgICAgICBuZXcgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICk7Ci0gICAgICAgIH0gY2F0Y2ggKFByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJFeGNlcHRpb24gdGhyb3duIGZyb20gQWNjZXNzQ29udHJvbGxlcjogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRocm93IChDbGFzc05vdEZvdW5kRXhjZXB0aW9uKSBlLmdldEV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGNsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gQ2xhc3NMb2FkZXIKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBDbGFzc0xvYWRlciBnZXRDb250ZXh0Q2xhc3NMb2FkZXIoZmluYWwgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpIHsKLSAgICAgICAgQ2xhc3NMb2FkZXIgY2w7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjbCA9IChDbGFzc0xvYWRlcikgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoCi0gICAgICAgICAgICAgICAgICAgIG5ldyBQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNsYXNzTG9hZGVyICE9IG51bGwgPyBjbGFzc0xvYWRlciA6IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICk7Ci0gICAgICAgIH0gY2F0Y2ggKFByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJFeGNlcHRpb24gdGhyb3duIGZyb20gQWNjZXNzQ29udHJvbGxlcjogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZS5nZXRFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gY2w7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9GYXVsdEFjdGlvbkFubm90LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9idWlsZGVyL0ZhdWx0QWN0aW9uQW5ub3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjEzYmQyOS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9idWlsZGVyL0ZhdWx0QWN0aW9uQW5ub3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyOwotCi1pbXBvcnQgamF2YXgueG1sLndzLkZhdWx0QWN0aW9uOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247Ci0KLXB1YmxpYyBjbGFzcyBGYXVsdEFjdGlvbkFubm90IGltcGxlbWVudHMgRmF1bHRBY3Rpb24gewotICAgIAotICAgIHByaXZhdGUgQ2xhc3MgY2xhc3NOYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIHZhbHVlOwotICAgIHByaXZhdGUgU3RyaW5nIGNsYXNzTmFtZVN0cmluZzsKLQotICAgIHByaXZhdGUgRmF1bHRBY3Rpb25Bbm5vdCgpIHsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBGYXVsdEFjdGlvbkFubm90KENsYXNzIGNsYXNzTmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMuY2xhc3NOYW1lID0gY2xhc3NOYW1lOwotICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgRmF1bHRBY3Rpb25Bbm5vdCBjcmVhdGVGYXVsdEFjdGlvbkFubm90SW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBGYXVsdEFjdGlvbkFubm90KCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgRmF1bHRBY3Rpb25Bbm5vdCBjcmVhdGVGYXVsdEFjdGlvbkFubm90SW1wbChDbGFzcyBjbGFzc05hbWUsIFN0cmluZyB2YWx1ZSkgewotICAgICAgICByZXR1cm4gbmV3IEZhdWx0QWN0aW9uQW5ub3QoY2xhc3NOYW1lLCB2YWx1ZSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldENsYXNzTmFtZShTdHJpbmcgY2xhc3NOYW1lU3RyaW5nKSB7Ci0gICAgICAgIHRoaXMuY2xhc3NOYW1lU3RyaW5nID0gY2xhc3NOYW1lU3RyaW5nOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENsYXNzTmFtZShDbGFzcyBjbGFzc05hbWUpIHsKLSAgICAgICAgdGhpcy5jbGFzc05hbWUgPSBjbGFzc05hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2xhc3MgY2xhc3NOYW1lKCkgewotICAgICAgICByZXR1cm4gY2xhc3NOYW1lOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGNsYXNzTmFtZVN0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIGNsYXNzTmFtZVN0cmluZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHZhbHVlKCkgewotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotCi0gICAgLy9obW0sIHNob3VsZCB3ZSByZWFsbHkgZG8gdGhpcwotICAgIHB1YmxpYyBDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4gYW5ub3RhdGlvblR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBBbm5vdGF0aW9uLmNsYXNzOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgU3RyaW5nIG5ld0xpbmUgPSAiXG4iOwotICAgICAgICBzYi5hcHBlbmQobmV3TGluZSk7Ci0gICAgICAgIHNiLmFwcGVuZCgiQEZhdWx0QWN0aW9uLmNsYXNzTmFtZT0gIiArIGNsYXNzTmFtZSk7Ci0gICAgICAgIHNiLmFwcGVuZChuZXdMaW5lKTsKLSAgICAgICAgc2IuYXBwZW5kKCJARmF1bHRBY3Rpb24udmFsdWU9ICIgKyB2YWx1ZSk7Ci0gICAgICAgIHNiLmFwcGVuZChuZXdMaW5lKTsKLSAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9GaWVsZERlc2NyaXB0aW9uQ29tcG9zaXRlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9idWlsZGVyL0ZpZWxkRGVzY3JpcHRpb25Db21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk4YWYwNC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9idWlsZGVyL0ZpZWxkRGVzY3JpcHRpb25Db21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlcjsKLQotCi1wdWJsaWMgY2xhc3MgRmllbGREZXNjcmlwdGlvbkNvbXBvc2l0ZSBpbXBsZW1lbnRzIFRNRkFubm90YXRpb25Db21wb3NpdGUgewotCi0gICAgLy9NZXRob2QgcmVmbGVjdGl2ZSBpbmZvcm1hdGlvbgotICAgIHByaXZhdGUgU3RyaW5nIGZpZWxkTmFtZTsgICAgICAgLy8gZmllbGQgbmFtZQotICAgIHByaXZhdGUgU3RyaW5nIG1vZGlmaWVyVHlwZTsgICAgLy8gZmllbGQgbW9kaWZpZXIKLSAgICBwcml2YXRlIFN0cmluZyBmaWVsZENsYXNzTmFtZTsgIC8vIGZ1bGx5IHF1YWxpZmllZCBmaWVsZCBjbGFzcyBuYW1lCi0JCi0JLy8gaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGZpZWxkIHdhcyBhbm5vdGF0ZWQgd2l0aCBAWG1sTGlzdCBvciBub3QKLQlwcml2YXRlIGJvb2xlYW4gaXNMaXN0VHlwZSA9IGZhbHNlOwotCi0gICAgcHJpdmF0ZSBIYW5kbGVyQ2hhaW5Bbm5vdCBoYW5kbGVyQ2hhaW5Bbm5vdDsKLSAgICBwcml2YXRlIFdlYlNlcnZpY2VSZWZBbm5vdCB3ZWJTZXJ2aWNlUmVmQW5ub3Q7Ci0KLSAgICAvKgotICAgICAgKiBEZWZhdWx0IENvbnN0cnVjdG9yCi0gICAgICAqLwotICAgIHB1YmxpYyBGaWVsZERlc2NyaXB0aW9uQ29tcG9zaXRlKCkgewotCi0gICAgfQotCi0gICAgcHVibGljIEZpZWxkRGVzY3JpcHRpb25Db21wb3NpdGUoCi0gICAgICAgICAgICBTdHJpbmcgZmllbGROYW1lLAotICAgICAgICAgICAgU3RyaW5nIG1vZGlmaWVyVHlwZSwKLSAgICAgICAgICAgIEhhbmRsZXJDaGFpbkFubm90IGhhbmRsZXJDaGFpbkFubm90LAotICAgICAgICAgICAgV2ViU2VydmljZVJlZkFubm90IHdlYlNlcnZpY2VSZWZBbm5vdAotICAgICkgewotICAgICAgICB0aGlzLmZpZWxkTmFtZSA9IGZpZWxkTmFtZTsKLSAgICAgICAgdGhpcy5tb2RpZmllclR5cGUgPSBtb2RpZmllclR5cGU7Ci0gICAgICAgIHRoaXMuaGFuZGxlckNoYWluQW5ub3QgPSBoYW5kbGVyQ2hhaW5Bbm5vdDsKLSAgICAgICAgdGhpcy53ZWJTZXJ2aWNlUmVmQW5ub3QgPSB3ZWJTZXJ2aWNlUmVmQW5ub3Q7Ci0gICAgfQotCi0gICAgLyoqIEByZXR1cm4gUmV0dXJucyB0aGUgZmllbGROYW1lLiAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmllbGROYW1lKCkgewotICAgICAgICByZXR1cm4gZmllbGROYW1lOwotICAgIH0KLQotICAgIC8qKiBAcmV0dXJuIFJldHVybnMgdGhlIGhhbmRsZXJDaGFpbkFubm90LiAqLwotICAgIHB1YmxpYyBIYW5kbGVyQ2hhaW5Bbm5vdCBnZXRIYW5kbGVyQ2hhaW5Bbm5vdCgpIHsKLSAgICAgICAgcmV0dXJuIGhhbmRsZXJDaGFpbkFubm90OwotICAgIH0KLQotICAgIC8qKiBAcmV0dXJuIFJldHVybnMgdGhlIG1vZGlmaWVyVHlwZS4gKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE1vZGlmaWVyVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIG1vZGlmaWVyVHlwZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqIEByZXR1cm4gUmV0dXJucyB0aGUgZmllbGRDbGFzc05hbWUuICovCi0gICAgcHVibGljIFN0cmluZyBnZXRGaWVsZENsYXNzTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGZpZWxkQ2xhc3NOYW1lOwotICAgIH0KLQotICAgIC8qKiBAcmV0dXJuIFJldHVybnMgdGhlIHdlYlNlcnZpY2VSZWZBbm5vdC4gKi8KLSAgICBwdWJsaWMgV2ViU2VydmljZVJlZkFubm90IGdldFdlYlNlcnZpY2VSZWZBbm5vdCgpIHsKLSAgICAgICAgcmV0dXJuIHdlYlNlcnZpY2VSZWZBbm5vdDsKLSAgICB9Ci0KLSAgICAvKiogQHBhcmFtIGZpZWxkTmFtZSBUaGUgZmllbGROYW1lIHRvIHNldC4gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRGaWVsZE5hbWUoU3RyaW5nIGZpZWxkTmFtZSkgewotICAgICAgICB0aGlzLmZpZWxkTmFtZSA9IGZpZWxkTmFtZTsKLSAgICB9Ci0KLSAgICAvKiogQHBhcmFtIGhhbmRsZXJDaGFpbkFubm90IFRoZSBoYW5kbGVyQ2hhaW5Bbm5vdCB0byBzZXQuICovCi0gICAgcHVibGljIHZvaWQgc2V0SGFuZGxlckNoYWluQW5ub3QoSGFuZGxlckNoYWluQW5ub3QgaGFuZGxlckNoYWluQW5ub3QpIHsKLSAgICAgICAgdGhpcy5oYW5kbGVyQ2hhaW5Bbm5vdCA9IGhhbmRsZXJDaGFpbkFubm90OwotICAgIH0KLQotICAgIC8qKiBAcGFyYW0gbW9kaWZpZXJUeXBlIFRoZSBtb2RpZmllclR5cGUgdG8gc2V0LiAqLwotICAgIHB1YmxpYyB2b2lkIHNldE1vZGlmaWVyVHlwZShTdHJpbmcgbW9kaWZpZXJUeXBlKSB7Ci0gICAgICAgIHRoaXMubW9kaWZpZXJUeXBlID0gbW9kaWZpZXJUeXBlOwotICAgIH0KLQotICAgIC8qKiBAcGFyYW0gd2ViU2VydmljZVJlZkFubm90IFRoZSB3ZWJTZXJ2aWNlUmVmQW5ub3QgdG8gc2V0LiAqLwotICAgIHB1YmxpYyB2b2lkIHNldFdlYlNlcnZpY2VSZWZBbm5vdChXZWJTZXJ2aWNlUmVmQW5ub3Qgd2ViU2VydmljZVJlZkFubm90KSB7Ci0gICAgICAgIHRoaXMud2ViU2VydmljZVJlZkFubm90ID0gd2ViU2VydmljZVJlZkFubm90OwotICAgIH0KLQotCXB1YmxpYyB2b2lkIHNldElzTGlzdFR5cGUoYm9vbGVhbiBpc0xpc3RUeXBlKSB7Ci0JCXRoaXMuaXNMaXN0VHlwZSA9IGlzTGlzdFR5cGU7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzTGlzdFR5cGUoKSB7Ci0JCXJldHVybiBpc0xpc3RUeXBlOwotCX0KLSAgICAgCi0gICAgcHVibGljIHZvaWQgc2V0RmllbGRDbGFzc05hbWUoU3RyaW5nIGZpZWxkQ2xhc3NOYW1lKSB7Ci0gICAgICAgIHRoaXMuZmllbGRDbGFzc05hbWUgPSBmaWVsZENsYXNzTmFtZTsKLSAgICB9Ci0JCi0gICAgLyoqCi0gICAgICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciB1bml0IHRlc3RpbmcuIFdlIHdpbGwgcHJpbnQgYWxsIG9mIHRoZQotICAgICAqIGRhdGEgbWVtYmVycyBoZXJlLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgU3RyaW5nIG5ld0xpbmUgPSAiXG4iOwotICAgICAgICBzYi5hcHBlbmQoIioqKioqIEJFR0lOIEZpZWxkRGVzY3JpcHRpb25Db21wb3NpdGUgKioqKioiKTsKLSAgICAgICAgc2IuYXBwZW5kKCJGREMuZmllbGROYW1lPSIgKyBmaWVsZE5hbWUpOwotICAgICAgICBzYi5hcHBlbmQobmV3TGluZSk7Ci0gICAgICAgIGlmIChoYW5kbGVyQ2hhaW5Bbm5vdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoIlx0IEBIYW5kbGVyQ2hhaW4iKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZChuZXdMaW5lKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgiXHQiICsgaGFuZGxlckNoYWluQW5ub3QudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgc2IuYXBwZW5kKG5ld0xpbmUpOwotICAgICAgICBpZiAod2ViU2VydmljZVJlZkFubm90ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgiXHQgQFdlYlNlcnZpY2VSZWYiKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZChuZXdMaW5lKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgiXHQiICsgd2ViU2VydmljZVJlZkFubm90LnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgICAgIHNiLmFwcGVuZCgiKioqKiogRU5EIEZpZWxkRGVzY3JpcHRpb25Db21wb3NpdGUiKTsKLSAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotfQotCQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9IYW5kbGVyQ2hhaW5Bbm5vdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9IYW5kbGVyQ2hhaW5Bbm5vdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmMyN2QxLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2J1aWxkZXIvSGFuZGxlckNoYWluQW5ub3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyOwotCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKLQotcHVibGljIGNsYXNzIEhhbmRsZXJDaGFpbkFubm90IGltcGxlbWVudHMgamF2YXguandzLkhhbmRsZXJDaGFpbiB7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBmaWxlID0gIiI7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZSA9ICIiOwotCi0gICAgLyoqIEEgV2ViU2VydmljZUFubm90IGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQuICovCi0gICAgcHJpdmF0ZSBIYW5kbGVyQ2hhaW5Bbm5vdCgpIHsKLQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIEhhbmRsZXJDaGFpbkFubm90KFN0cmluZyBmaWxlLCBTdHJpbmcgbmFtZSkgewotICAgICAgICB0aGlzLmZpbGUgPSBmaWxlOwotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgSGFuZGxlckNoYWluQW5ub3QgY3JlYXRlSGFuZGxlckNoYWluQW5ub3RJbXBsKCkgewotICAgICAgICByZXR1cm4gbmV3IEhhbmRsZXJDaGFpbkFubm90KCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgSGFuZGxlckNoYWluQW5ub3QgY3JlYXRlRnJvbUFubm90YXRpb24oQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB7Ci0gICAgICAgIEhhbmRsZXJDaGFpbkFubm90IHJldHVybkFubm90ID0gbnVsbDsKLSAgICAgICAgaWYgKGFubm90YXRpb24gIT0gbnVsbCAmJiBhbm5vdGF0aW9uIGluc3RhbmNlb2YgamF2YXguandzLkhhbmRsZXJDaGFpbikgewotICAgICAgICAgICAgamF2YXguandzLkhhbmRsZXJDaGFpbiBoYyA9IChqYXZheC5qd3MuSGFuZGxlckNoYWluKSBhbm5vdGF0aW9uOwotICAgICAgICAgICAgcmV0dXJuQW5ub3QgPSBuZXcgSGFuZGxlckNoYWluQW5ub3QoaGMuZmlsZSgpLCBoYy5uYW1lKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXR1cm5Bbm5vdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGZpbGUoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmZpbGU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBuYW1lKCkgewotICAgICAgICByZXR1cm4gdGhpcy5uYW1lOwotICAgIH0KLQotICAgIC8qKiBAcGFyYW0gZmlsZSBUaGUgZmlsZSB0byBzZXQuICovCi0gICAgcHVibGljIHZvaWQgc2V0RmlsZShTdHJpbmcgZmlsZSkgewotICAgICAgICB0aGlzLmZpbGUgPSBmaWxlOwotICAgIH0KLQotICAgIC8qKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSB0byBzZXQuICovCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIH0KLQotICAgIC8vaG1tLCBzaG91bGQgd2UgcmVhbGx5IGRvIHRoaXMKLSAgICBwdWJsaWMgQ2xhc3M8QW5ub3RhdGlvbj4gYW5ub3RhdGlvblR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBBbm5vdGF0aW9uLmNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgdW5pdCB0ZXN0aW5nLiBXZSB3aWxsIHByaW50IGFsbCBvZiB0aGUKLSAgICAgKiBkYXRhIG1lbWJlcnMgaGVyZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIFN0cmluZyBuZXdMaW5lID0gIlxuIjsKLSAgICAgICAgc2IuYXBwZW5kKG5ld0xpbmUpOwotICAgICAgICBzYi5hcHBlbmQoIkBIYW5kbGVyQ2hhaW4uZmlsZT0gIiArIGZpbGUpOwotICAgICAgICBzYi5hcHBlbmQobmV3TGluZSk7Ci0gICAgICAgIHNiLmFwcGVuZCgiQEhhbmRsZXJDaGFpbi5uYW1lPSAiICsgbmFtZSk7Ci0gICAgICAgIHNiLmFwcGVuZChuZXdMaW5lKTsKLSAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9KQVhXU1JJV1NETEdlbmVyYXRvci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9KQVhXU1JJV1NETEdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjRkOTQwLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2J1aWxkZXIvSkFYV1NSSVdTRExHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YXJldHJpZXZhbC5TY2hlbWFTdXBwbGllcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFyZXRyaWV2YWwuV1NETFN1cHBsaWVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC51dGlsLlV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5QYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0NvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jYXRhbG9nLkpBWFdTQ2F0YWxvZ01hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jYXRhbG9nLmltcGwuT0FTSVNDYXRhbG9nTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkVuZHBvaW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51dGlsLkNhdGFsb2dVUklSZXNvbHZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkhUVFBDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLlNjaGVtYVV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWE7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFDb2xsZWN0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotCi1pbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29uZmlnOwotaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQ7Ci1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuV1NETEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLmZhY3RvcnkuV1NETEZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgud3NkbC54bWwuV1NETFJlYWRlcjsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5TT0FQQmluZGluZzsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlRmlsdGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5VUkxDbGFzc0xvYWRlcjsKLWltcG9ydCBqYXZhLm5ldC5VUkxEZWNvZGVyOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotaW1wb3J0IGphdmEudXRpbC5qYXIuQXR0cmlidXRlczsKLWltcG9ydCBqYXZhLnV0aWwuamFyLkphckZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLmphci5KYXJJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuamFyLk1hbmlmZXN0OwotCi0vKioKLSAqIFRoaXMgY2xhc3Mgd2lsbCBpbXBsZW1lbnQgYW4gaW50ZXJmYWNlIHRoYXQgaXMgZGVmaW5lZCBieSB0aGUKLSAqIE1EUSBjb2RlLiBJdCB3aWxsIGJlIHJlZ2lzdGVyZWQgd2l0aGluIHRoZSBNRFEgZnJhbWV3b3JrLCBhbmQgdGhlCi0gKiBNRFEgY29kZSB3aWxsIGNhbGwgdGhpcyB3aGVuIGl0IGZpbmRzIGFuIGFwcGxpY2F0aW9uIHRoYXQgd2FzCi0gKiBkZXBsb3llZCB3aXRob3V0IFdTREwuIFRoaXMgY2xhc3Mgd2lsbCB1c2UgdGhlIFdzR2VuIHRvb2wgdG8KLSAqIGdlbmVyYXRlIGEgV1NETCBEZWZpbml0aW9uIGJhc2VkIG9uIHRoZSBKYXZhIHNvdXJjZSBmb3IgdGhlIGFwcGxpY2F0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgSkFYV1NSSVdTRExHZW5lcmF0b3IgaW1wbGVtZW50cyBTY2hlbWFTdXBwbGllciwgV1NETFN1cHBsaWVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhKQVhXU1JJV1NETEdlbmVyYXRvci5jbGFzcyk7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBjbGFzc1BhdGg7Ci0KLSAgICBwcml2YXRlIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlOwotICAgIHByaXZhdGUgYm9vbGVhbiBpbml0ID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBIYXNoTWFwPFN0cmluZywgWG1sU2NoZW1hPiBkb2NNYXA7Ci0gICAgcHJpdmF0ZSBIYXNoTWFwPFN0cmluZywgRGVmaW5pdGlvbj4gd3NkbERlZk1hcDsKLQotICAgIHB1YmxpYyBKQVhXU1JJV1NETEdlbmVyYXRvcihBeGlzU2VydmljZSBheGlzU2VydmljZSkgewotICAgICAgICB0aGlzLmF4aXNTZXJ2aWNlID0gYXhpc1NlcnZpY2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2Qgd2lsbCBkcml2ZSB0aGUgY2FsbCB0byBXc0dlbiB0byBnZW5lcmF0ZSBhIFdTREwgZmlsZSBmb3IKLSAgICAgKiBhcHBsaWNhdGlvbnMgZGVwbG95ZWQgd2l0aG91dCBXU0RMLiBXZSB3aWxsIHRoZW4gcmVhZCB0aGlzIGZpbGUgaW4gZnJvbQotICAgICAqIGRpc2sgYW5kIGNyZWF0ZSBhIERlZmluaXRpb24uIEFmdGVyIHdlIGFyZSBkb25lIHdpdGggdGhlIGZpbGUgd2Ugd2lsbAotICAgICAqIHJlbW92ZSBpdCBmcm9tIGRpc2suCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZ2VuZXJhdGVXc2RsKFN0cmluZyBjbGFzc05hbWUsIFN0cmluZyBiaW5kaW5nVHlwZSkgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgIAlnZW5lcmF0ZVdzZGwoY2xhc3NOYW1lLCBiaW5kaW5nVHlwZSwgbnVsbCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgZHJpdmUgdGhlIGNhbGwgdG8gV3NHZW4gdG8gZ2VuZXJhdGUgYSBXU0RMIGZpbGUgZm9yCi0gICAgICogYXBwbGljYXRpb25zIGRlcGxveWVkIHdpdGhvdXQgV1NETC4gV2Ugd2lsbCB0aGVuIHJlYWQgdGhpcyBmaWxlIGluIGZyb20KLSAgICAgKiBkaXNrIGFuZCBjcmVhdGUgYSBEZWZpbml0aW9uLiBBZnRlciB3ZSBhcmUgZG9uZSB3aXRoIHRoZSBmaWxlIHdlIHdpbGwKLSAgICAgKiByZW1vdmUgaXQgZnJvbSBkaXNrLiAgVGhpcyBtZXRob2QgYWNjZXB0cyBhIENhdGFsb2dNYW5hZ2VyIGFzIGEgcGFyYW1ldGVyCi0gICAgICogZm9yIHRoZSBldmVudHVhbCB1c2UgaW4gYnkgYW4gWE1MU2NoZW1hQ29sbGVjdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBnZW5lcmF0ZVdzZGwoU3RyaW5nIGNsYXNzTmFtZSwgU3RyaW5nIGJpbmRpbmdUeXBlLCBKQVhXU0NhdGFsb2dNYW5hZ2VyIGNhdGFsb2dNYW5hZ2VyKSB0aHJvd3MKLSAgICAgICAgICAgIFdlYlNlcnZpY2VFeGNlcHRpb24gewotCi0gICAgICAgIEF4aXNDb25maWd1cmF0aW9uIGF4aXNDb25maWd1cmF0aW9uID0gYXhpc1NlcnZpY2UuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKTsKLSAgICAgICAgRmlsZSB0ZW1wRmlsZSA9IChGaWxlKSBheGlzQ29uZmlndXJhdGlvbi5nZXRQYXJhbWV0ZXJWYWx1ZSgKLSAgICAgICAgICAgICAgICBDb25zdGFudHMuQ29uZmlndXJhdGlvbi5BUlRJRkFDVFNfVEVNUF9ESVIpOwotICAgICAgICBpZiAodGVtcEZpbGUgPT0gbnVsbCkgewotICAgICAgICAgICAgdGVtcEZpbGUgPSBuZXcgRmlsZShnZXRQcm9wZXJ0eV9kb1ByaXYoImphdmEuaW8udG1wZGlyIiksICJfYXhpczIiKTsKLSAgICAgICAgfQotCi0gICAgICAgIFBhcmFtZXRlciBzZXJ2bGV0Q29uZmlnUGFyYW0gPSBheGlzQ29uZmlndXJhdGlvbgotICAgICAgICAgICAgICAgIC5nZXRQYXJhbWV0ZXIoSFRUUENvbnN0YW50cy5IVFRQX1NFUlZMRVRDT05GSUcpOwotCi0gICAgICAgIFN0cmluZyB3ZWJCYXNlID0gbnVsbDsKLSAgICAgICAgaWYgKHNlcnZsZXRDb25maWdQYXJhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBPYmplY3Qgb2JqID0gc2VydmxldENvbmZpZ1BhcmFtLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICBTZXJ2bGV0Q29udGV4dCBzZXJ2bGV0Q29udGV4dDsKLSAgICAKLSAgICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBTZXJ2bGV0Q29uZmlnKSB7Ci0gICAgICAgICAgICAgICAgU2VydmxldENvbmZpZyBzZXJ2bGV0Q29uZmlnID0gKFNlcnZsZXRDb25maWcpIG9iajsKLSAgICAgICAgICAgICAgICBzZXJ2bGV0Q29udGV4dCA9IHNlcnZsZXRDb25maWcuZ2V0U2VydmxldENvbnRleHQoKTsKLSAgICAgICAgICAgICAgICB3ZWJCYXNlID0gc2VydmxldENvbnRleHQuZ2V0UmVhbFBhdGgoIi9XRUItSU5GIik7Ci0gICAgICAgICAgICB9IAotICAgICAgICB9Ci0KLSAgICAgICAgaWYoY2xhc3NQYXRoID09IG51bGwpIHsKLSAgICAgICAgICAgIHRoaXMuY2xhc3NQYXRoID0gZ2V0RGVmYXVsdENsYXNzcGF0aCh3ZWJCYXNlKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiRm9yIGltcGxlbWVudGF0aW9uIGNsYXNzICIgKyBjbGFzc05hbWUgKwotICAgICAgICAgICAgICAgICAgICAiIFdzR2VuIGNsYXNzcGF0aDogIiArCi0gICAgICAgICAgICAgICAgICAgIGNsYXNzUGF0aCk7Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nIGxvY2FsT3V0cHV0RGlyZWN0b3J5ID0gdGVtcEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkgKyBjbGFzc05hbWU7Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJPdXRwdXQgZGlyZWN0b3J5IGZvciBnZW5lcmF0ZWQgV1NETCBmaWxlOiAiICsgbG9jYWxPdXRwdXREaXJlY3RvcnkpOwotICAgICAgICB9Ci0gICAgICAgIGJvb2xlYW4gZXJyb3JPblJlYWQgPSBmYWxzZTsKLSAgICAgICAgdHJ5IHsKLQotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJHZW5lcmF0aW5nIG5ldyBXU0RMIERlZmluaXRpb24iKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY3JlYXRlT3V0cHV0RGlyZWN0b3J5KGxvY2FsT3V0cHV0RGlyZWN0b3J5KTsKLSAgICAgICAgICAgIENsYXNzIGNsYXp6OwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAvLyBUcnkgdGhlIG9uZSBpbiBKREsxNgotICAgICAgICAgICAgICAgIGNsYXp6ID0gQ2xhc3MuZm9yTmFtZSgiY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5zcGkuV1NUb29sc09iamVjdEZhY3RvcnkiKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KXsKLSAgICAgICAgICAgICAgICAvLyBMb29rIGZvciB0aGUgUkkKLSAgICAgICAgICAgICAgICBjbGF6eiA9IENsYXNzLmZvck5hbWUoImNvbS5zdW4udG9vbHMud3Muc3BpLldTVG9vbHNPYmplY3RGYWN0b3J5Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBNZXRob2QgbTEgPSBjbGF6ei5nZXRNZXRob2QoIm5ld0luc3RhbmNlIiwgbmV3IENsYXNzW117fSk7Ci0gICAgICAgICAgICBPYmplY3QgZmFjdG9yeSA9IG0xLmludm9rZShuZXcgT2JqZWN0W117fSk7Ci0gICAgICAgICAgICBTdHJpbmdbXSBhcmd1bWVudHMgPSBnZXRXc0dlbkFyZ3VtZW50cyhjbGFzc05hbWUsIGJpbmRpbmdUeXBlLCBsb2NhbE91dHB1dERpcmVjdG9yeSk7Ci0gICAgICAgICAgICBPdXRwdXRTdHJlYW0gb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICBNZXRob2QgbTIgPSBjbGF6ei5nZXRNZXRob2QoIndzZ2VuIiwgbmV3IENsYXNzW117T3V0cHV0U3RyZWFtLmNsYXNzLCBTdHJpbmdbXS5jbGFzc30pOwotICAgICAgICAgICAgbTIuaW52b2tlKGZhY3RvcnksIG9zLCBhcmd1bWVudHMpOwotICAgICAgICAgICAgb3MuY2xvc2UoKTsKLSAgICAgICAgICAgIHdzZGxEZWZNYXAgPSByZWFkSW5XU0RMKGxvY2FsT3V0cHV0RGlyZWN0b3J5KTsKLSAgICAgICAgICAgIGlmICh3c2RsRGVmTWFwLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIkEgV1NETCBEZWZpbml0aW9uIGNvdWxkIG5vdCBiZSBnZW5lcmF0ZWQgZm9yICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgInRoZSBpbXBsZW1lbnRhdGlvbiBjbGFzczogIiArIGNsYXNzTmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkb2NNYXAgPSByZWFkSW5TY2hlbWEobG9jYWxPdXRwdXREaXJlY3RvcnksIGNhdGFsb2dNYW5hZ2VyKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgICAgIFN0cmluZyBtc2cgPQotICAgICAgICAgICAgICAgICAgICAiRXJyb3Igb2NjdXJyZWQgZ2VuZXJhdGluZyBXU0RMIGZpbGUgZm9yIFdlYiBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIGNsYXNzICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ7IiArIGNsYXNzTmFtZSArICJ9OiB7IiArIHQgKyAifSI7Ci0gICAgICAgICAgICBsb2cuZXJyb3IobXNnLCB0KTsKLSAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKG1zZywgdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHdpbGwgc2V0IHVwIHRoZSBhcmd1bWVudHMgdGhhdCB3aWxsIGJlIHVzZWQgYnkgdGhlIFdzR2VuIHRvb2wuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmdbXSBnZXRXc0dlbkFyZ3VtZW50cyhTdHJpbmcgY2xhc3NOYW1lLCBTdHJpbmcgYmluZGluZ1R5cGUsIFN0cmluZyBsb2NhbE91dHB1dERpcmVjdG9yeSkgdGhyb3dzCi0gICAgICAgICAgICBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nW10gYXJndW1lbnRzID0gbnVsbDsKLSAgICAgICAgaWYgKGJpbmRpbmdUeXBlID09IG51bGwgfHwgYmluZGluZ1R5cGUuZXF1YWxzKCIiKSB8fCBiaW5kaW5nVHlwZS5lcXVhbHMoCi0gICAgICAgICAgICAgICAgU09BUEJpbmRpbmcuU09BUDExSFRUUF9CSU5ESU5HKSB8fCBiaW5kaW5nVHlwZS5lcXVhbHMoCi0gICAgICAgICAgICAgICAgU09BUEJpbmRpbmcuU09BUDExSFRUUF9NVE9NX0JJTkRJTkcpKSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkdlbmVyYXRpbmcgV1NETCB3aXRoIFNPQVAgMS4xIGJpbmRpbmcgdHlwZSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXJndW1lbnRzID0gbmV3IFN0cmluZ1tdeyItY3AiLCBjbGFzc1BhdGgsIGNsYXNzTmFtZSwgIi1rZWVwIiwgIi13c2RsOnNvYXAxLjEiLCAiLWQiLAotICAgICAgICAgICAgICAgICAgICBsb2NhbE91dHB1dERpcmVjdG9yeX07Ci0gICAgICAgIH0gZWxzZSBpZiAoYmluZGluZ1R5cGUuZXF1YWxzKFNPQVBCaW5kaW5nLlNPQVAxMkhUVFBfQklORElORykgfHwgYmluZGluZ1R5cGUuZXF1YWxzKAotICAgICAgICAgICAgICAgIFNPQVBCaW5kaW5nLlNPQVAxMkhUVFBfTVRPTV9CSU5ESU5HKSkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJHZW5lcmF0aW5nIFdTREwgd2l0aCBTT0FQIDEuMiBiaW5kaW5nIHR5cGUiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFyZ3VtZW50cyA9IG5ldyBTdHJpbmdbXXsiLWNwIiwgY2xhc3NQYXRoLCBjbGFzc05hbWUsICIta2VlcCIsICItZXh0ZW5zaW9uIiwKLSAgICAgICAgICAgICAgICAgICAgIi13c2RsOlhzb2FwMS4yIiwgIi1kIiwgbG9jYWxPdXRwdXREaXJlY3Rvcnl9OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oIlRoZSBiaW5kaW5nICIgKyBiaW5kaW5nVHlwZSArICIgc3BlY2lmaWVkIGJ5IHRoZSAiICsKLSAgICAgICAgICAgICAgICAgICAgImNsYXNzICIgKyBjbGFzc05hbWUgKyAiIGNhbm5vdCBiZSB1c2VkIHRvIGdlbmVyYXRlIGEgV1NETC4gUGxlYXNlIGNob29zZSAiICsKLSAgICAgICAgICAgICAgICAgICAgImEgc3VwcG9ydGVkIGJpbmRpbmcgdHlwZS4iKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYXJndW1lbnRzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgYSBEZWZpbml0aW9uIGJhc2VkIG9uIHRoZQotICAgICAqIFdTREwgZmlsZSBnZW5lcmF0ZWQgYnkgV3NHZW4uCi0gICAgICovCi0gICAgcHJpdmF0ZSBIYXNoTWFwPFN0cmluZywgRGVmaW5pdGlvbj4gcmVhZEluV1NETChTdHJpbmcgbG9jYWxPdXRwdXREaXJlY3RvcnkpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBMaXN0PEZpbGU+IHdzZGxGaWxlcyA9IGdldFdTRExGaWxlcyhsb2NhbE91dHB1dERpcmVjdG9yeSk7Ci0gICAgICAgIEhhc2hNYXA8U3RyaW5nLCBEZWZpbml0aW9uPiB3c2RsRGVmTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBEZWZpbml0aW9uPigpOwotICAgICAgICBmb3IgKEZpbGUgd3NkbEZpbGUgOiB3c2RsRmlsZXMpIHsKLSAgICAgICAgICAgIGlmICh3c2RsRmlsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgV1NETEZhY3Rvcnkgd3NkbEZhY3RvcnkgPSBXU0RMRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgICAgICAgICBXU0RMUmVhZGVyIHdzZGxSZWFkZXIgPSB3c2RsRmFjdG9yeS5uZXdXU0RMUmVhZGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGlzID0gd3NkbEZpbGUudG9VUkwoKS5vcGVuU3RyZWFtKCk7Ci0gICAgICAgICAgICAgICAgICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IHdzZGxSZWFkZXIucmVhZFdTREwobG9jYWxPdXRwdXREaXJlY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IElucHV0U291cmNlKGlzKSk7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWZpbml0aW9uLnNldERvY3VtZW50QmFzZVVSSSh3c2RsRmlsZS50b1VSSSgpLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJTZXQgYmFzZSBkb2N1bWVudCBVUkkgZm9yIGdlbmVyYXRlZCBXU0RMOiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzZGxGaWxlLnRvVVJJKCkudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkNvdWxkIG5vdCBzZXQgYmFzZSBkb2N1bWVudCBVUkkgZm9yIGdlbmVyYXRlZCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXU0RMOiAiICsgd3NkbEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiIDogIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHdzZGxEZWZNYXAucHV0KHdzZGxGaWxlLmdldE5hbWUoKS50b0xvd2VyQ2FzZSgpLCBkZWZpbml0aW9uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKFdTRExFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbXNnID0gIkVycm9yIG9jY3VycmVkIHdoaWxlIGF0dGVtcHRpbmcgdG8gY3JlYXRlIERlZmluaXRpb24gZnJvbSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2VuZXJhdGVkIFdTREwgZmlsZSB7IiArIHdzZGxGaWxlLmdldE5hbWUoKSArICJ9OiB7IiArIGUgKyAifSI7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcihtc2cpOwotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKG1zZyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiRXJyb3Igb2NjdXJyZWQgd2hpbGUgYXR0ZW1wdGluZyB0byBjcmVhdGUgRGVmaW5pdGlvbiBmcm9tICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnZW5lcmF0ZWQgV1NETCBmaWxlICB7IiArIHdzZGxGaWxlLmdldE5hbWUoKSArICJ9OiB7IiArIGUgKyAifSI7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcihtc2cpOwotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKG1zZyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB3c2RsRGVmTWFwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgYmUgdXNlZCB0byBsb2NhdGUgdGhlIFdTREwgZmlsZSB0aGF0IHdhcwotICAgICAqIGdlbmVyYXRlZCBieSBXc0dlbi4gVGhlcmUgc2hvdWxkIGJlIG9ubHkgb25lIGZpbGUgd2l0aCB0aGUKLSAgICAgKiAiLndzZGwiIGV4dGVuc2lvbiBpbiB0aGlzIGRpcmVjdG9yeS4KLSAgICAgKi8KLSAgICBwcml2YXRlIExpc3Q8RmlsZT4gZ2V0V1NETEZpbGVzKFN0cmluZyBsb2NhbE91dHB1dERpcmVjdG9yeSkgewotICAgICAgICBGaWxlIGNsYXNzRGlyZWN0b3J5ID0gbmV3IEZpbGUobG9jYWxPdXRwdXREaXJlY3RvcnkpOwotICAgICAgICBBcnJheUxpc3Q8RmlsZT4gd3NkbEZpbGVzID0gbmV3IEFycmF5TGlzdDxGaWxlPigpOwotICAgICAgICBpZiAoY2xhc3NEaXJlY3RvcnkuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgRmlsZVtdIGZpbGVzID0gY2xhc3NEaXJlY3RvcnkubGlzdEZpbGVzKCk7Ci0gICAgICAgICAgICBmb3IgKEZpbGUgZmlsZSA6IGZpbGVzKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGZpbGVOYW1lID0gZmlsZS5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGZpbGVOYW1lLmVuZHNXaXRoKCIud3NkbCIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJMb2NhdGVkIGdlbmVyYXRlZCBXU0RMIGZpbGU6ICIgKyBmaWxlTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgd3NkbEZpbGVzLmFkZChmaWxlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHdzZGxGaWxlczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIGZpbGUgd2lsbCBjcmVhdGUgdGhlIGRpcmVjdG9yeSB3ZSB3aWxsIHVzZSBhcyB0aGUgb3V0cHV0Ci0gICAgICogZGlyZWN0b3J5IGFyZ3VtZW50IGluIG91ciBjYWxsIHRvIFdzR2VuLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVPdXRwdXREaXJlY3RvcnkoU3RyaW5nIGxvY2FsT3V0cHV0RGlyZWN0b3J5KSB7Ci0gICAgICAgIEZpbGUgZGlyZWN0b3J5ID0gbmV3IEZpbGUobG9jYWxPdXRwdXREaXJlY3RvcnkpOwotICAgICAgICBpZiAoIWRpcmVjdG9yeS5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICBkaXJlY3RvcnkubWtkaXJzKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIHJlYWQgaW4gYWxsIG9mIHRoZSBzY2hlbWEgZmlsZXMgdGhhdCB3ZXJlIGdlbmVyYXRlZAotICAgICAqIGZvciBhIGdpdmVuIGFwcGxpY2F0aW9uLgotICAgICAqLwotICAgIHByaXZhdGUgSGFzaE1hcDxTdHJpbmcsIFhtbFNjaGVtYT4gcmVhZEluU2NoZW1hKFN0cmluZyBsb2NhbE91dHB1dERpcmVjdG9yeSwgCi0gICAgCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDYXRhbG9nTWFuYWdlciBjYXRhbG9nTWFuYWdlcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0KLSAgICAgICAgICAgIFhtbFNjaGVtYUNvbGxlY3Rpb24gc2NoZW1hQ29sbGVjdGlvbiA9IG5ldyBYbWxTY2hlbWFDb2xsZWN0aW9uKCk7Ci0gICAgICAgICAgICBpZiAoY2F0YWxvZ01hbmFnZXIgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBzY2hlbWFDb2xsZWN0aW9uLnNldFNjaGVtYVJlc29sdmVyKG5ldyBDYXRhbG9nVVJJUmVzb2x2ZXIoY2F0YWxvZ01hbmFnZXIpKTsKLSAgICAgICAgICAgIHNjaGVtYUNvbGxlY3Rpb24uc2V0QmFzZVVyaShuZXcgRmlsZShsb2NhbE91dHB1dERpcmVjdG9yeSkuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCi0gICAgICAgICAgICBIYXNoTWFwPFN0cmluZywgWG1sU2NoZW1hPiBkb2NNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFhtbFNjaGVtYT4oKTsKLSAgICAgICAgICAgIExpc3Q8RmlsZT4gc2NoZW1hRmlsZXMgPSBnZXRTY2hlbWFGaWxlcyhsb2NhbE91dHB1dERpcmVjdG9yeSk7Ci0gICAgICAgICAgICBmb3IgKEZpbGUgc2NoZW1hRmlsZSA6IHNjaGVtYUZpbGVzKSB7Ci0gICAgICAgICAgICAgICAgWG1sU2NoZW1hIGRvYyA9IHNjaGVtYUNvbGxlY3Rpb24ucmVhZChuZXcgSW5wdXRTb3VyY2Uoc2NoZW1hRmlsZS50b1VSTCgpLnRvU3RyaW5nKCkpLCBudWxsKTsKLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJSZWFkIGluIHNjaGVtYSBmaWxlOiAiICsgc2NoZW1hRmlsZS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkb2NNYXAucHV0KHNjaGVtYUZpbGUuZ2V0TmFtZSgpLCBkb2MpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGRvY01hcDsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIFN0cmluZyBtc2cgPQotICAgICAgICAgICAgICAgICAgICAiRXJyb3Igb2NjdXJyZWQgd2hpbGUgYXR0ZW1wdGluZyB0byByZWFkIGdlbmVyYXRlZCBzY2hlbWEgZmlsZSB7IiArIGUgKyAifSI7Ci0gICAgICAgICAgICBsb2cuZXJyb3IobXNnKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24obXNnKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIGEgbGlzdCBvZiBmaWxlIG9iamVjdHMgdGhhdCByZXByZXNlbnQgYWxsIHRoZQotICAgICAqIHNjaGVtYSBmaWxlcyBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkuCi0gICAgICovCi0gICAgcHJpdmF0ZSBMaXN0PEZpbGU+IGdldFNjaGVtYUZpbGVzKFN0cmluZyBsb2NhbE91dHB1dERpcmVjdG9yeSkgewotICAgICAgICBBcnJheUxpc3Q8RmlsZT4gc2NoZW1hRmlsZXMgPSBuZXcgQXJyYXlMaXN0PEZpbGU+KCk7Ci0gICAgICAgIEZpbGUgY2xhc3NEaXJlY3RvcnkgPSBuZXcgRmlsZShsb2NhbE91dHB1dERpcmVjdG9yeSk7Ci0gICAgICAgIGlmIChjbGFzc0RpcmVjdG9yeS5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICBGaWxlW10gZmlsZXMgPSBjbGFzc0RpcmVjdG9yeS5saXN0RmlsZXMoKTsKLSAgICAgICAgICAgIGZvciAoRmlsZSBmaWxlIDogZmlsZXMpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZmlsZU5hbWUgPSBmaWxlLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICBpZiAoZmlsZU5hbWUuZW5kc1dpdGgoIi54c2QiKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiTG9jYXRlZCBnZW5lcmF0ZWQgc2NoZW1hIGZpbGU6ICIgKyBmaWxlTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc2NoZW1hRmlsZXMuYWRkKGZpbGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc2NoZW1hRmlsZXM7Ci0gICAgfQotCi0gICAgcHVibGljIERlZmluaXRpb24gZ2V0V1NETChBeGlzU2VydmljZSBzZXJ2aWNlKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgUGFyYW1ldGVyIHdzZGxQYXJhbWV0ZXIgPSBzZXJ2aWNlLmdldFBhcmFtZXRlcihXU0RMQ29uc3RhbnRzLldTRExfNF9KX0RFRklOSVRJT04pOwotICAgICAgICBpZiAod3NkbFBhcmFtZXRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBPYmplY3QgdmFsdWUgPSB3c2RsUGFyYW1ldGVyLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiAoRGVmaW5pdGlvbikgdmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaW5pdGlhbGl6ZShzZXJ2aWNlKTsKLSAgICAgICAgcmV0dXJuIHdzZGxEZWZNYXAudmFsdWVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBpbml0aWFsaXplKEF4aXNTZXJ2aWNlIHNlcnZpY2UpIHsKLSAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IChTdHJpbmcpIGF4aXNTZXJ2aWNlLmdldFBhcmFtZXRlcihDb25zdGFudHMuU0VSVklDRV9DTEFTUykuZ2V0VmFsdWUoKTsKLSAgICAgICAgaWYgKCFpbml0KSB7Ci0gICAgICAgICAgICBnZW5lcmF0ZVdzZGwoY2xhc3NOYW1lLCBTT0FQQmluZGluZy5TT0FQMTFIVFRQX0JJTkRJTkcsIGdldENhdGFsb2dNYW5hZ2VyKHNlcnZpY2UpKTsKLSAgICAgICAgICAgIGluaXQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFhtbFNjaGVtYSBnZXRTY2hlbWEoQXhpc1NlcnZpY2Ugc2VydmljZSwgU3RyaW5nIHhzZCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIFBhcmFtZXRlciB3c2RsUGFyYW1ldGVyID0gc2VydmljZS5nZXRQYXJhbWV0ZXIoV1NETENvbnN0YW50cy5XU0RMXzRfSl9ERUZJTklUSU9OKTsKLSAgICAgICAgaWYgKHdzZGxQYXJhbWV0ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgQXJyYXlMaXN0IGxpc3QgPSBzZXJ2aWNlLmdldFNjaGVtYSgpOwotICAgICAgICAgICAgaWYgKGxpc3Quc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgICAgIGlmICh4c2QgPT0gbnVsbCB8fCB4c2QubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFhtbFNjaGVtYSkgbGlzdC5nZXQoMCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgICAgICBYbWxTY2hlbWEgc2NoZW1hID0gKFhtbFNjaGVtYSkgaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBYbWxTY2hlbWFbXSBzY2hlbWFzID0gU2NoZW1hVXRpbC5nZXRBbGxTY2hlbWFzKHNjaGVtYSk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2NoZW1hcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHVyaSA9IHNjaGVtYXNbaV0uZ2V0U291cmNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodXJpICE9IG51bGwgJiYgdXJpLmVuZHNXaXRoKHhzZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2NoZW1hc1tpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gKFhtbFNjaGVtYSkgbGlzdC5nZXQoMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaW5pdGlhbGl6ZShzZXJ2aWNlKTsKLSAgICAgICAgWG1sU2NoZW1hIHNjaGVtYSA9IGRvY01hcC5nZXQoeHNkKTsKLSAgICAgICAgaWYgKHNjaGVtYSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBkb2NNYXAudmFsdWVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNjaGVtYTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFeHBhbmQgYSBkaXJlY3RvcnkgcGF0aCBvciBsaXN0IG9mIGRpcmVjdG9yeSBwYXRocyAoRmlsZS5wYXRoU2VwYXJhdG9yCi0gICAgICogZGVsaW1pdGVkKSBpbnRvIGEgbGlzdCBvZiBmaWxlIHBhdGhzIG9mIGFsbCB0aGUgamFyIGZpbGVzIGluIHRob3NlCi0gICAgICogZGlyZWN0b3JpZXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZGlyUGF0aHMgVGhlIHN0cmluZyBjb250YWluaW5nIHRoZSBkaXJlY3RvcnkgcGF0aCBvciBsaXN0IG9mCi0gICAgICogICAgICAgICAgICAgICAgIGRpcmVjdG9yeSBwYXRocy4KLSAgICAgKiBAcmV0dXJuIFRoZSBmaWxlIHBhdGhzIG9mIHRoZSBqYXIgZmlsZXMgaW4gdGhlIGRpcmVjdG9yaWVzLiBUaGlzIGlzIGFuCi0gICAgICogICAgICAgICBlbXB0eSBzdHJpbmcgaWYgbm8gZmlsZXMgd2VyZSBmb3VuZCwgYW5kIGlzIHRlcm1pbmF0ZWQgYnkgYW4KLSAgICAgKiAgICAgICAgIGFkZGl0aW9uYWwgcGF0aFNlcGFyYXRvciBpbiBhbGwgb3RoZXIgY2FzZXMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZXhwYW5kRGlycyhTdHJpbmcgZGlyUGF0aHMpIHsKLSAgICAgICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihkaXJQYXRocywgRmlsZS5wYXRoU2VwYXJhdG9yKTsKLSAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgewotICAgICAgICAgICAgU3RyaW5nIGQgPSBzdC5uZXh0VG9rZW4oKTsKLSAgICAgICAgICAgIEZpbGUgZGlyID0gbmV3IEZpbGUoZCk7Ci0gICAgICAgICAgICBpZiAoZGlyLmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgICAgICBGaWxlW10gZmlsZXMgPSBkaXIubGlzdEZpbGVzKG5ldyBKYXZhQXJjaGl2ZUZpbHRlcigpKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoZmlsZXNbaV0pLmFwcGVuZChGaWxlLnBhdGhTZXBhcmF0b3IpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2sgaWYgdGhpcyBpbnB1dHN0cmVhbSBpcyBhIGphci96aXAKLSAgICAgKgotICAgICAqIEBwYXJhbSBpcwotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBpbnB1dHN0cmVhbSBpcyBhIGphcgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0phcihJbnB1dFN0cmVhbSBpcykgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgSmFySW5wdXRTdHJlYW0gamlzID0gbmV3IEphcklucHV0U3RyZWFtKGlzKTsKLSAgICAgICAgICAgIGlmIChqaXMuZ2V0TmV4dEVudHJ5KCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBDYXRhbG9nTWFuYWdlciBhc3NvY2lhdGVkIHdpdGggYW4gQXhpc1NlcnZpY2UKLSAgICAgKiBAcmV0dXJuIHRoZSBDYXRhbG9nTWFuYWdlciBpbiB1c2UgZm9yIHRoaXMgQXhpc1NlcnZpY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEpBWFdTQ2F0YWxvZ01hbmFnZXIgZ2V0Q2F0YWxvZ01hbmFnZXIoQXhpc1NlcnZpY2Ugc2VydmljZSkgewotICAgIAlQYXJhbWV0ZXIgcGFyYW0gPSBzZXJ2aWNlLmdldFBhcmFtZXRlcihFbmRwb2ludERlc2NyaXB0aW9uLkFYSVNfU0VSVklDRV9QQVJBTUVURVIpOwotCi0gICAgCWlmIChwYXJhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVkID0gKEVuZHBvaW50RGVzY3JpcHRpb24pcGFyYW0uZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIHJldHVybiBlZC5nZXRTZXJ2aWNlRGVzY3JpcHRpb24oKS5nZXRDYXRhbG9nTWFuYWdlcigpOwotICAgIAl9IGVsc2UKLSAgICAJICAgIHJldHVybiBuZXcgT0FTSVNDYXRhbG9nTWFuYWdlcigpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGRlZmF1bHQgY2xhc3NwYXRoIGZyb20gdmFyaW91cyB0aGluZ2llcyBpbiB0aGUgbWVzc2FnZSBjb250ZXh0Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbXNnQ29udGV4dAotICAgICAqIEByZXR1cm4gZGVmYXVsdCBjbGFzc3BhdGgKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRDbGFzc3BhdGgoU3RyaW5nIHdlYkJhc2UpIHsKLSAgICAgICAgSGFzaFNldCBjbGFzc3BhdGggPSBuZXcgSGFzaFNldCgpOwotICAgICAgICBDbGFzc0xvYWRlciBjbCA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7Ci0gICAgICAgIGZpbGxDbGFzc1BhdGgoY2wsIGNsYXNzcGF0aCk7Ci0KLSAgICAgICAgLy8gSnVzdCB0byBiZSBzYWZlICh0aGUgYWJvdmUgZG9lc24ndCBzZWVtIHRvIHJldHVybiB0aGUgd2ViYXBwCi0gICAgICAgIC8vIGNsYXNzcGF0aCBpbiBhbGwgY2FzZXMpLCBtYW51YWxseSBkbyB0aGlzOgotICAgICAgICBpZiAod2ViQmFzZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBhZGRQYXRoKGNsYXNzcGF0aCwgd2ViQmFzZSArIEZpbGUuc2VwYXJhdG9yQ2hhciArICJjbGFzc2VzIik7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIFN0cmluZyBsaWJCYXNlID0gd2ViQmFzZSArIEZpbGUuc2VwYXJhdG9yQ2hhciArICJsaWIiOwotICAgICAgICAgICAgICAgIEZpbGUgbGliRGlyID0gbmV3IEZpbGUobGliQmFzZSk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nW10gamFyRmlsZXMgPSBsaWJEaXIubGlzdCgpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgamFyRmlsZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGphckZpbGUgPSBqYXJGaWxlc1tpXTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGphckZpbGUuZW5kc1dpdGgoIi5qYXIiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYWRkUGF0aChjbGFzc3BhdGgsIGxpYkJhc2UgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlLnNlcGFyYXRvckNoYXIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXJGaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gT2ggd2VsbC4gIE5vIGJpZyBkZWFsLgotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBVUkwgc2VydmljZUFyY2hpdmUgPSBheGlzU2VydmljZS5nZXRGaWxlTmFtZSgpOwotICAgICAgICBpZihzZXJ2aWNlQXJjaGl2ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGNsYXNzcGF0aC5hZGQoVXRpbHMudG9GaWxlKHNlcnZpY2VBcmNoaXZlKS5nZXRDYW5vbmljYWxQYXRoKCkpOwotICAgICAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmVycm9yKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBsb2cuZXJyb3IoZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gYXhpcy5leHQuZGlycyBjYW4gYmUgdXNlZCBpbiBhbnkgYXBwc2VydmVyCi0gICAgICAgIGdldENsYXNzUGF0aEZyb21EaXJlY3RvcnlQcm9wZXJ0eShjbGFzc3BhdGgsICJheGlzLmV4dC5kaXJzIik7Ci0KLSAgICAgICAgLy8gY2xhc3NwYXRoIHVzZWQgYnkgSmFzcGVyIAotICAgICAgICBnZXRDbGFzc1BhdGhGcm9tUHJvcGVydHkoY2xhc3NwYXRoLCAib3JnLmFwYWNoZS5jYXRhbGluYS5qc3BfY2xhc3NwYXRoIik7Ci0KLSAgICAgICAgLy8gd2Vic3BoZXJlIHN0dWZmLgotICAgICAgICBnZXRDbGFzc1BhdGhGcm9tUHJvcGVydHkoY2xhc3NwYXRoLCAid3MuZXh0LmRpcnMiKTsKLSAgICAgICAgZ2V0Q2xhc3NQYXRoRnJvbVByb3BlcnR5KGNsYXNzcGF0aCwgImNvbS5pYm0ud2Vic3BoZXJlLnNlcnZsZXQuYXBwbGljYXRpb24uY2xhc3NwYXRoIik7Ci0KLSAgICAgICAgLy8gamF2YSBjbGFzcyBwYXRoCi0gICAgICAgIGdldENsYXNzUGF0aEZyb21Qcm9wZXJ0eShjbGFzc3BhdGgsICJqYXZhLmNsYXNzLnBhdGgiKTsKLQotICAgICAgICAvLyBMb2FkIGphcnMgZnJvbSBqYXZhIGV4dGVybmFsIGRpcmVjdG9yeQotICAgICAgICBnZXRDbGFzc1BhdGhGcm9tRGlyZWN0b3J5UHJvcGVydHkoY2xhc3NwYXRoLCAiamF2YS5leHQuZGlycyIpOwotCi0gICAgICAgIC8vIGJvb3QgY2xhc3NwYXRoIGlzbid0IGZvdW5kIGluIGFib3ZlIHNlYXJjaAotICAgICAgICBnZXRDbGFzc1BhdGhGcm9tUHJvcGVydHkoY2xhc3NwYXRoLCAic3VuLmJvb3QuY2xhc3MucGF0aCIpOwotICAgICAgICAKLSAgICAgICAgU3RyaW5nQnVmZmVyIHBhdGggPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBjbGFzc3BhdGguaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgU3RyaW5nIHMgPSAoU3RyaW5nKSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICBwYXRoLmFwcGVuZChzKTsKLSAgICAgICAgICAgIHBhdGguYXBwZW5kKEZpbGUucGF0aFNlcGFyYXRvckNoYXIpOwotICAgICAgICB9Ci0gICAgICAgIGxvZy5kZWJ1ZyhwYXRoKTsKLSAgICAgICAgcmV0dXJuIHBhdGgudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFkZFBhdGgoSGFzaFNldCBjbGFzc3BhdGgsIFN0cmluZyBzKSB7Ci0gICAgICAgIFN0cmluZyBwYXRoID0gcy5yZXBsYWNlKCgoRmlsZS5zZXBhcmF0b3JDaGFyID09ICcvJykgPyAnXFwnIDogJy8nKSwgRmlsZS5zZXBhcmF0b3JDaGFyKS50cmltKCk7Ci0gICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKHBhdGgpOwotICAgICAgICBpZiAoZmlsZUV4aXN0cyhmaWxlKSkgewotICAgICAgICAgICAgcGF0aCA9IGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0gICAgICAgICAgICBjbGFzc3BhdGguYWRkKHBhdGgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkIGFsbCBmaWxlcyBpbiB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeSB0byB0aGUgY2xhc3NwYXRoCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2xhc3NwYXRoCi0gICAgICogQHBhcmFtIHByb3BlcnR5Ci0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBnZXRDbGFzc1BhdGhGcm9tRGlyZWN0b3J5UHJvcGVydHkoSGFzaFNldCBjbGFzc3BhdGgsIFN0cmluZyBwcm9wZXJ0eSkgewotICAgICAgICBTdHJpbmcgZGlycyA9IGdldFByb3BlcnR5X2RvUHJpdihwcm9wZXJ0eSk7Ci0gICAgICAgIFN0cmluZyBwYXRoID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHBhdGggPSBleHBhbmREaXJzKGRpcnMpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gT2ggd2VsbC4gIE5vIGJpZyBkZWFsLgotICAgICAgICB9Ci0gICAgICAgIGlmIChwYXRoICE9IG51bGwpIHsKLSAgICAgICAgICAgIGFkZFBhdGgoY2xhc3NwYXRoLCBwYXRoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRQcm9wZXJ0eV9kb1ByaXYoZmluYWwgU3RyaW5nIHByb3BlcnR5KSB7Ci0gICAgICAgIHJldHVybiAoU3RyaW5nKQotICAgICAgICAgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoCi0gICAgICAgICAgICAgIG5ldyBQcml2aWxlZ2VkQWN0aW9uKCkgewotCi0gICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gU3lzdGVtLmdldFByb3BlcnR5KHByb3BlcnR5KTsKLSAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0pOwotICAgIH0KLSAgICAvKioKLSAgICAgKiBBZGQgYSBjbGFzc3BhdGggc3RvcmVkIGluIGEgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2xhc3NwYXRoCi0gICAgICogQHBhcmFtIHByb3BlcnR5Ci0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBnZXRDbGFzc1BhdGhGcm9tUHJvcGVydHkoSGFzaFNldCBjbGFzc3BhdGgsIFN0cmluZyBwcm9wZXJ0eSkgewotICAgICAgICBTdHJpbmcgcGF0aCA9IGdldFByb3BlcnR5X2RvUHJpdihwcm9wZXJ0eSk7Ci0gICAgICAgIGlmIChwYXRoICE9IG51bGwpIHsKLSAgICAgICAgICAgIGFkZFBhdGgoY2xhc3NwYXRoLCBwYXRoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdhbGsgdGhlIGNsYXNzbG9hZGVyIGhpZXJhcmNoeSBhbmQgYWRkIHRvIHRoZSBjbGFzc3BhdGgKLSAgICAgKgotICAgICAqIEBwYXJhbSBjbAotICAgICAqIEBwYXJhbSBjbGFzc3BhdGgKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGZpbGxDbGFzc1BhdGgoQ2xhc3NMb2FkZXIgY2wsIEhhc2hTZXQgY2xhc3NwYXRoKSB7Ci0gICAgICAgIHdoaWxlIChjbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoY2wgaW5zdGFuY2VvZiBVUkxDbGFzc0xvYWRlcikgewotICAgICAgICAgICAgICAgIFVSTFtdIHVybHMgPSAoKFVSTENsYXNzTG9hZGVyKSBjbCkuZ2V0VVJMcygpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyAodXJscyAhPSBudWxsKSAmJiBpIDwgdXJscy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGF0aCA9IHVybHNbaV0uZ2V0UGF0aCgpOwotICAgICAgICAgICAgICAgICAgICAvL0lmIGl0IGlzIGEgZHJpdmUgbGV0dGVyLCBhZGp1c3QgYWNjb3JkaW5nbHkuCi0gICAgICAgICAgICAgICAgICAgIGlmIChwYXRoLmxlbmd0aCgpID49IDMgJiYgcGF0aC5jaGFyQXQoMCkgPT0gJy8nICYmIHBhdGguY2hhckF0KDIpID09ICc6JykKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhdGggPSBwYXRoLnN1YnN0cmluZygxKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkUGF0aChjbGFzc3BhdGgsIFVSTERlY29kZXIuZGVjb2RlKHBhdGgpKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBpZiBpdHMgYSBqYXIgZXh0cmFjdCBDbGFzcy1QYXRoIGVudHJpZXMgZnJvbSBtYW5pZmVzdAotICAgICAgICAgICAgICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZSh1cmxzW2ldLmdldEZpbGUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmaWxlLmlzRmlsZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBGaWxlSW5wdXRTdHJlYW0gZmlzID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNKYXIoZmlzKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKYXJGaWxlIGphciA9IG5ldyBKYXJGaWxlKGZpbGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYW5pZmVzdCBtYW5pZmVzdCA9IGphci5nZXRNYW5pZmVzdCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWFuaWZlc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlcyBhdHRyaWJ1dGVzID0gbWFuaWZlc3QuZ2V0TWFpbkF0dHJpYnV0ZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcyA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoQXR0cmlidXRlcy5OYW1lLkNMQVNTX1BBVEgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBiYXNlID0gZmlsZS5nZXRQYXJlbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIocywgIiAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHQgPSBzdC5uZXh0VG9rZW4oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZFBhdGgoY2xhc3NwYXRoLCBiYXNlICsgRmlsZS5zZXBhcmF0b3JDaGFyICsgdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXMuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lMikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2wgPSBjbC5nZXRQYXJlbnQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZpbHRlciBmb3IgemlwL2phcgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEphdmFBcmNoaXZlRmlsdGVyIGltcGxlbWVudHMgRmlsZUZpbHRlciB7Ci0gICAgICAgIHB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGZpbGUpIHsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gZmlsZS5nZXROYW1lKCkudG9Mb3dlckNhc2UoKTsKLSAgICAgICAgICAgIHJldHVybiAobmFtZS5lbmRzV2l0aCgiLmphciIpIHx8IG5hbWUuZW5kc1dpdGgoIi56aXAiKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgc3RhdGljIHByaXZhdGUgQm9vbGVhbiBmaWxlRXhpc3RzIChmaW5hbCBGaWxlIGZpbGUpIHsKLSAgICAgICAgQm9vbGVhbiBleGlzdHMgPSAoQm9vbGVhbikgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoCi0gICAgICAgICAgICAgICAgbmV3IFByaXZpbGVnZWRBY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCb29sZWFuKGZpbGUuZXhpc3RzKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICApOwotICAgICAgICByZXR1cm4gZXhpc3RzOwotICAgIH0KLSAgICAKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9idWlsZGVyL01EUUNvbnN0YW50cy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9NRFFDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODNlZjU2ZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9idWlsZGVyL01EUUNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuV1NETENvbnN0YW50czsKLQotcHVibGljIGNsYXNzIE1EUUNvbnN0YW50cyB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXU0RMX1NFUlZJQ0VfUU5BTUUgPSAiV1NETF9TRVJWSUNFX1FOQU1FIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXU0RMX1BPUlQgPSAiV1NETF9QT1JUIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXU0RMX0RFRklOSVRJT04gPSBXU0RMQ29uc3RhbnRzLldTRExfNF9KX0RFRklOSVRJT047Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NETF9MT0NBVElPTiA9ICJXU0RMX0xPQ0FUSU9OIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWSUNFX0NMQVNTID0gIlNlcnZpY2VDbGFzcyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NETF9QT1JUVFlQRV9OQU1FID0gIldTRExfUE9SVFRZUEVfTkFNRSI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPQkpFQ1RfQ0xBU1NfTkFNRSA9ICJqYXZhLmxhbmcuT2JqZWN0IjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1ZJREVSX1NPVVJDRSA9Ci0gICAgICAgICAgICAiamF2YXgueG1sLndzLlByb3ZpZGVyPGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlPiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPVklERVJfU09BUCA9ICJqYXZheC54bWwud3MuUHJvdmlkZXI8amF2YXgueG1sLnNvYXAuU09BUE1lc3NhZ2U+IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9WSURFUl9EQVRBU09VUkNFID0KLSAgICAgICAgICAgICJqYXZheC54bWwud3MuUHJvdmlkZXI8amF2YXguYWN0aXZhdGlvbi5EYXRhU291cmNlPiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPVklERVJfU1RSSU5HID0gImphdmF4LnhtbC53cy5Qcm92aWRlcjxqYXZhLmxhbmcuU3RyaW5nPiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPVklERVJfT01FTEVNRU5UID0gImphdmF4LnhtbC53cy5Qcm92aWRlcjxvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudD4iOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NETF9GSUxFX05BTUUgPSAiV1NETF9GSUxFX05BTUUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNDSEVNQV9ET0NTID0gIlNDSEVNQV9ET0NTIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXU0RMX0NPTVBPU0lURSA9ICJXU0RMX0NPTVBPU0lURSI7Ci0KLSAgICAvLyBKYXZhIHN0cmluZyB0aGF0IHJlcHJlc2VudHMgYSBjbGFzcyBjb25zdHJ1Y3RvcgotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlNUUlVDVE9SX01FVEhPRCA9ICI8aW5pdD4iOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVUVVJOX1RZUEVfRlVUVVJFID0gImphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVUVVJOX1RZUEVfUkVTUE9OU0UgPSAiamF2YXgueG1sLndzLlJlc3BvbnNlIjsKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTElFTlRfU0VSVklDRV9DTEFTUyA9ICJDTElFTlRfU0VSVklDRV9DTEFTUyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xJRU5UX1NFSV9DTEFTUyA9ICJDTElFTlRfU0VJX0NMQVNTIjsKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIQU5ETEVSX0NIQUlOX0RFQ0xBUklOR19DTEFTUyA9ICJIQU5ETEVSX0NIQUlOX0RFQ0xBUklOR19DTEFTUyI7Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VJX01UT01fRU5BQkxFTUVOVF9NQVAgPSAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLlNFSV9NVE9NX0VOQUJMRU1FTlRfTUFQIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCSU5ESU5HX1BST1BTX01BUCA9ICJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuQklORElOR19QUk9QU19NQVAiOyAgICAKLSAgICAKLSAgICAvL1JlcHJlc2VudCBTT0FQL0pNUyBCaW5kaW5ncwotICAgIC8vUkVWSUVXOiBTT0FQLUpNUyBtYXkgYmUgdXNpbmcgdGhlIHNhbWUgTlMgZm9yIFNPQVAxMSBhbmQgU09BUDEyLCAKLSAgICAvLyAgaWYgc28gd2UgY291bGQgcmVtb3ZlIHNvbWUgZHVwbGljYXRlIHZhbHVlcyBiZWxvdwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNPQVAxMUpNU19CSU5ESU5HID0gImh0dHA6Ly93d3cuZXhhbXBsZS5vcmcvMjAwNi8wNi9zb2FwL2JpbmRpbmdzL0pNUy8iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNPQVAxMkpNU19CSU5ESU5HID0gImh0dHA6Ly93d3cuZXhhbXBsZS5vcmcvMjAwNi8wNi9zb2FwL2JpbmRpbmdzL0pNUy8iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNPQVAxMUpNU19NVE9NX0JJTkRJTkcgPSAiaHR0cDovL2h0dHA6Ly93d3cuZXhhbXBsZS5vcmcvMjAwNi8wNi9zb2FwL2JpbmRpbmdzL0pNUy8/bXRvbT10cnVlIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTT0FQMTJKTVNfTVRPTV9CSU5ESU5HID0gImh0dHA6Ly9odHRwOi8vd3d3LmV4YW1wbGUub3JnLzIwMDYvMDYvc29hcC9iaW5kaW5ncy9KTVMvP210b209dHJ1ZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09BUF9IVFRQX0JJTkRJTkcgPSJTT0FQX0hUVFBfQklORElORyI7Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9idWlsZGVyL01UT01Bbm5vdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9NVE9NQW5ub3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM4MzU0Yy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9idWlsZGVyL01UT01Bbm5vdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyOw0KLQ0KLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5NVE9NOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOw0KLQ0KLXB1YmxpYyBjbGFzcyBNVE9NQW5ub3QgaW1wbGVtZW50cyBNVE9NIHsNCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGVuYWJsZWQgPSB0cnVlOw0KLSAgICBwcml2YXRlIGludCB0aHJlc2hvbGQ7DQotICAgIA0KLSAgICBwdWJsaWMgYm9vbGVhbiBlbmFibGVkKCkgew0KLSAgICAgICAgcmV0dXJuIGVuYWJsZWQ7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiBlKSB7DQotICAgICAgICBlbmFibGVkID0gZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgaW50IHRocmVzaG9sZCgpIHsNCi0gICAgICAgIHJldHVybiB0aHJlc2hvbGQ7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHNldFRocmVzaG9sZChpbnQgaSkgew0KLSAgICAgICAgdGhyZXNob2xkID0gaTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+IGFubm90YXRpb25UeXBlKCkgew0KLSAgICAgICAgcmV0dXJuIE1UT00uY2xhc3M7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9NZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9NZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzQzY2UyLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2J1aWxkZXIvTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1wdWJsaWMgY2xhc3MgTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUgaW1wbGVtZW50cyBUTUFubm90YXRpb25Db21wb3NpdGUsIFRNRkFubm90YXRpb25Db21wb3NpdGUgewotCi0gICAgLy9NZXRob2QgcmVmbGVjdGl2ZSBpbmZvcm1hdGlvbgotICAgIHByaXZhdGUgU3RyaW5nIG1ldGhvZE5hbWU7ICAgIC8vYSBwdWJsaWMgbWV0aG9kIG5hbWUgaW4gdGhpcyBjbGFzcwotICAgIHByaXZhdGUgU3RyaW5nIHJldHVyblR5cGU7ICAgIC8vTWV0aG9kcyByZXR1cm4gdHlwZQotICAgIHByaXZhdGUgU3RyaW5nW10gZXhjZXB0aW9uczsKLSAgICBwcml2YXRlIFN0cmluZyBkZWNsYXJpbmdDbGFzczsgLy90aGUgY2xhc3MvaW50ZXJmYWNlIHRoYXQgYWN0dWFsbHkgZGVjbGFyZXMgdGhpcyBtZXRob2QKLQotICAgIGJvb2xlYW4gb25lV2F5QW5ub3RhdGVkOwotCS8vIGJvb2xlYW4gdGhhdCBpbmRpY2F0ZXMgaWYgYW4gQFhtbExpc3QgYW5ub3RhdGlvbiB3YXMgZm91bmQgb24gdGhlIG1ldGhvZAotCXByaXZhdGUgYm9vbGVhbiAJCQkJaXNMaXN0VHlwZSA9IGZhbHNlOwotICAgIHByaXZhdGUgV2ViTWV0aG9kQW5ub3Qgd2ViTWV0aG9kQW5ub3Q7Ci0gICAgcHJpdmF0ZSBXZWJSZXN1bHRBbm5vdCB3ZWJSZXN1bHRBbm5vdDsKLSAgICBwcml2YXRlIEhhbmRsZXJDaGFpbkFubm90IGhhbmRsZXJDaGFpbkFubm90OwotICAgIHByaXZhdGUgU29hcEJpbmRpbmdBbm5vdCBzb2FwQmluZGluZ0Fubm90OwotICAgIHByaXZhdGUgV2ViU2VydmljZVJlZkFubm90IHdlYlNlcnZpY2VSZWZBbm5vdDsKLSAgICBwcml2YXRlIFdlYkVuZHBvaW50QW5ub3Qgd2ViRW5kcG9pbnRBbm5vdDsKLSAgICBwcml2YXRlIFJlcXVlc3RXcmFwcGVyQW5ub3QgcmVxdWVzdFdyYXBwZXJBbm5vdDsgLy9UT0RPIEVESVQgQ0hFQ0s6IG9ubHkgb24gbWV0aG9kcyBvZiBTRUkKLSAgICBwcml2YXRlIFJlc3BvbnNlV3JhcHBlckFubm90IHJlc3BvbnNlV3JhcHBlckFubm90Oy8vVE9ETyBFRElUIENIRUNLOiBvbmx5IG9uIG1ldGhvZHMgb2YgU0VJCi0gICAgcHJpdmF0ZSBMaXN0PFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlPiBwYXJhbWV0ZXJEZXNjcmlwdGlvbnM7Ly9UT0RPIEVESVQgQ0hFQ0s6IG9ubHkgb24gbWV0aG9kcyBvZiBTRUkKLQotICAgIHByaXZhdGUgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIHBhcmVudERCQzsKLSAgICAKLSAgICBwcml2YXRlIEFjdGlvbkFubm90IGFjdGlvbkFubm90OwotCi0gICAgLyoKLSAgICAgICogRGVmYXVsdCBDb25zdHJ1Y3RvcgotICAgICAgKi8KLSAgICBwdWJsaWMgTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUoKSB7Ci0gICAgICAgIHBhcmFtZXRlckRlc2NyaXB0aW9ucyA9IG5ldyBBcnJheUxpc3Q8UGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGU+KCk7Ci0gICAgfQotCi0gICAgcHVibGljIE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlKAotICAgICAgICAgICAgU3RyaW5nIG1ldGhvZE5hbWUsCi0gICAgICAgICAgICBTdHJpbmcgcmV0dXJuVHlwZSwKLSAgICAgICAgICAgIFdlYk1ldGhvZEFubm90IHdlYk1ldGhvZEFubm90LAotICAgICAgICAgICAgV2ViUmVzdWx0QW5ub3Qgd2ViUmVzdWx0QW5ub3QsCi0gICAgICAgICAgICBib29sZWFuIG9uZVdheUFubm90YXRlZCwKLSAgICAgICAgICAgIEhhbmRsZXJDaGFpbkFubm90IGhhbmRsZXJDaGFpbkFubm90LAotICAgICAgICAgICAgU29hcEJpbmRpbmdBbm5vdCBzb2FwQmluZGluZ0Fubm90LAotICAgICAgICAgICAgV2ViU2VydmljZVJlZkFubm90IHdlYlNlcnZpY2VSZWZBbm5vdCwKLSAgICAgICAgICAgIFdlYkVuZHBvaW50QW5ub3Qgd2ViRW5kcG9pbnRBbm5vdCwKLSAgICAgICAgICAgIFJlcXVlc3RXcmFwcGVyQW5ub3QgcmVxdWVzdFdyYXBwZXJBbm5vdCwKLSAgICAgICAgICAgIFJlc3BvbnNlV3JhcHBlckFubm90IHJlc3BvbnNlV3JhcHBlckFubm90Ci0gICAgKSB7Ci0KLSAgICAgICAgdGhpcy5tZXRob2ROYW1lID0gbWV0aG9kTmFtZTsKLSAgICAgICAgdGhpcy5yZXR1cm5UeXBlID0gcmV0dXJuVHlwZTsKLSAgICAgICAgdGhpcy53ZWJNZXRob2RBbm5vdCA9IHdlYk1ldGhvZEFubm90OwotICAgICAgICB0aGlzLndlYlJlc3VsdEFubm90ID0gd2ViUmVzdWx0QW5ub3Q7Ci0gICAgICAgIHRoaXMub25lV2F5QW5ub3RhdGVkID0gb25lV2F5QW5ub3RhdGVkOwotICAgICAgICB0aGlzLmhhbmRsZXJDaGFpbkFubm90ID0gaGFuZGxlckNoYWluQW5ub3Q7Ci0gICAgICAgIHRoaXMuc29hcEJpbmRpbmdBbm5vdCA9IHNvYXBCaW5kaW5nQW5ub3Q7Ci0gICAgICAgIHRoaXMud2ViU2VydmljZVJlZkFubm90ID0gd2ViU2VydmljZVJlZkFubm90OwotICAgICAgICB0aGlzLndlYkVuZHBvaW50QW5ub3QgPSB3ZWJFbmRwb2ludEFubm90OwotICAgICAgICB0aGlzLnJlcXVlc3RXcmFwcGVyQW5ub3QgPSByZXF1ZXN0V3JhcHBlckFubm90OwotICAgICAgICB0aGlzLnJlc3BvbnNlV3JhcHBlckFubm90ID0gcmVzcG9uc2VXcmFwcGVyQW5ub3Q7Ci0gICAgfQotCi0gICAgLyoqIEByZXR1cm4gUmV0dXJucyB0aGUgbWV0aG9kTmFtZSAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWV0aG9kTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG1ldGhvZE5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgU3RyaW5nIGRlc2NyYmluZyB0aGlzIG1ldGhvZCByZXN1bHQgdHlwZS4gIE5vdGUgdGhhdCB0aGlzIHN0cmluZyBpcyB1bnBhcnNlZC4gIEZvcgotICAgICAqIGV4YW1wbGUsIGlmIGl0IHJlcHJlc2VudHMgYSBqYXZhLnV0aWwuTGlzdDxteS5wYWNrYWdlLkZvbz4sIHRoZW4gdGhhdCBleGNhY3Qgc3RyaW5nIHdpbGwgYmUKLSAgICAgKiByZXR1cm5lZCwgaS5lLiAiamF2YS51dGlsLkxpc3Q8bXkucGFja2FnZS5Gb28+Ii4gIFlvdSBjYW4gdXNlIG90aGVyIG1ldGhvZHMgb24gdGhpcyBvYmplY3QgdG8KLSAgICAgKiByZXRyaWV2ZSBwYXJzZWQgdmFsdWVzIGZvciBHZW5lcmljcyBhbmQgSG9sZGVycy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgcmV0dXJuVHlwZQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmV0dXJuVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIHJldHVyblR5cGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY2xhc3MgYXNzb2NpYXRlZCB3aXRoIHRoZSBtZXRob2QgcmVzdWx0IHR5cGUuICBOb3RlIHRoYXQgaWYgdGhlIHJlc3R1cm4gdHlwZSBhCi0gICAgICogZ2VuZXJpYyAoc3VjaCBhcyBqYXZhLnV0aWwuTGlzdDxteS5wYWNrYWdlLkZvbz4pIHRoZW4gdGhlIGNsYXNzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmF3IHR5cGUgaXMKLSAgICAgKiByZXR1cm5lZCAoaS5lLiBqYXZhLnV0aWwuTGlzdCkuCi0gICAgICogPHAvPgotICAgICAqIFRoZXJlIGFyZSBvdGhlciBtZXRob2RzIHRoYXQgcmV0dXJuIHRoZSBjbGFzcyBmb3IgdGhlIGFjdHVhbCB0eXBlIGZvciBjZXJ0YWluIEpBWC1XUyBzcGVjaWZpYwotICAgICAqIGdlbmVyaWNzIHN1Y2ggYXMgUmVzcG9uc2U8VD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgcGFyYW1ldGVyVHlwZUNsYXNzLgotICAgICAqLwotICAgIHB1YmxpYyBDbGFzcyBnZXRSZXR1cm5UeXBlQ2xhc3MoKSB7Ci0gICAgICAgIENsYXNzIHJldHVyblR5cGVDbGFzcyA9IG51bGw7Ci0gICAgICAgIFN0cmluZyBmdWxsUmV0dXJuVHlwZSA9IGdldFJldHVyblR5cGUoKTsKLSAgICAgICAgaWYgKGZ1bGxSZXR1cm5UeXBlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVyblR5cGVDbGFzcyA9IERlc2NyaXB0aW9uQnVpbGRlclV0aWxzLmdldFByaW1pdGl2ZUNsYXNzKGZ1bGxSZXR1cm5UeXBlKTsKLSAgICAgICAgICAgIGlmIChyZXR1cm5UeXBlQ2xhc3MgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgaXMgYSBHZW5lcmljLCB3ZSBuZWVkIHRvIGxvYWQgdGhlIGNsYXNzIGFzc29jaWF0ZWQgd2l0aCB0aGUgUmF3IFR5cGUsIAotICAgICAgICAgICAgICAgIC8vIGkuZS4gZm9yIExpc3Q8Rm9vPiwgd2Ugd2FudCB0byBsb2FkIExpc3QuIE90aHdlcmlzZSwgbG9hZCB0aGUgdHlwZSBkaXJlY3RseS4gCi0gICAgICAgICAgICAgICAgU3RyaW5nIGNsYXNzVG9Mb2FkID0gbnVsbDsKLSAgICAgICAgICAgICAgICBpZiAoRGVzY3JpcHRpb25CdWlsZGVyVXRpbHMuZ2V0UmF3VHlwZShmdWxsUmV0dXJuVHlwZSkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjbGFzc1RvTG9hZCA9IERlc2NyaXB0aW9uQnVpbGRlclV0aWxzLmdldFJhd1R5cGUoZnVsbFJldHVyblR5cGUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGNsYXNzVG9Mb2FkID0gZnVsbFJldHVyblR5cGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVyblR5cGVDbGFzcyA9IGxvYWRDbGFzc0Zyb21NREMoY2xhc3NUb0xvYWQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJldHVyblR5cGVDbGFzczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIENsYXNzIGxvYWRDbGFzc0Zyb21NREMoU3RyaW5nIGNsYXNzVG9Mb2FkKSB7Ci0gICAgICAgIENsYXNzIHJldHVybkNsYXNzID0gbnVsbDsKLSAgICAgICAgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIgPSBudWxsOwotCi0gICAgICAgIGlmIChnZXREZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGVSZWYoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjbGFzc0xvYWRlciA9IGdldERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZVJlZigpLmdldENsYXNzTG9hZGVyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuQ2xhc3MgPSBEZXNjcmlwdGlvbkJ1aWxkZXJVdGlscy5sb2FkQ2xhc3NGcm9tQ29tcG9zaXRlKGNsYXNzVG9Mb2FkLCBjbGFzc0xvYWRlcik7Ci0gICAgICAgIHJldHVybiByZXR1cm5DbGFzczsKLSAgICB9Ci0KLSAgICAvKiogQHJldHVybiByZXR1cm5zIHdoZXRoZXIgdGhpcyBpcyBPbmVXYXkgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc09uZVdheSgpIHsKLSAgICAgICAgcmV0dXJuIG9uZVdheUFubm90YXRlZDsKLSAgICB9Ci0KLSAgICAvKiogQHJldHVybiBSZXR1cm5zIHRoZSB3ZWJFbmRwb2ludEFubm90LiAqLwotICAgIHB1YmxpYyBXZWJFbmRwb2ludEFubm90IGdldFdlYkVuZHBvaW50QW5ub3QoKSB7Ci0gICAgICAgIHJldHVybiB3ZWJFbmRwb2ludEFubm90OwotICAgIH0KLQotICAgIC8qKiBAcmV0dXJuIFJldHVybnMgdGhlIHJlcXVlc3RXcmFwcGVyQW5ub3QuICovCi0gICAgcHVibGljIFJlcXVlc3RXcmFwcGVyQW5ub3QgZ2V0UmVxdWVzdFdyYXBwZXJBbm5vdCgpIHsKLSAgICAgICAgcmV0dXJuIHJlcXVlc3RXcmFwcGVyQW5ub3Q7Ci0gICAgfQotCi0gICAgLyoqIEByZXR1cm4gUmV0dXJucyB0aGUgcmVzcG9uc2VXcmFwcGVyQW5ub3QuICovCi0gICAgcHVibGljIFJlc3BvbnNlV3JhcHBlckFubm90IGdldFJlc3BvbnNlV3JhcHBlckFubm90KCkgewotICAgICAgICByZXR1cm4gcmVzcG9uc2VXcmFwcGVyQW5ub3Q7Ci0gICAgfQotCi0gICAgLyoqIEByZXR1cm4gUmV0dXJucyB0aGUgaGFuZGxlckNoYWluQW5ub3QuICovCi0gICAgcHVibGljIEhhbmRsZXJDaGFpbkFubm90IGdldEhhbmRsZXJDaGFpbkFubm90KCkgewotICAgICAgICByZXR1cm4gaGFuZGxlckNoYWluQW5ub3Q7Ci0gICAgfQotCi0gICAgLyoqIEByZXR1cm4gUmV0dXJucyB0aGUgc29hcEJpbmRpbmdBbm5vdC4gKi8KLSAgICBwdWJsaWMgU29hcEJpbmRpbmdBbm5vdCBnZXRTb2FwQmluZGluZ0Fubm90KCkgewotICAgICAgICByZXR1cm4gc29hcEJpbmRpbmdBbm5vdDsKLSAgICB9Ci0KLSAgICAvKiogQHJldHVybiBSZXR1cm5zIHRoZSB3ZWJNZXRob2RBbm5vdC4gKi8KLSAgICBwdWJsaWMgV2ViTWV0aG9kQW5ub3QgZ2V0V2ViTWV0aG9kQW5ub3QoKSB7Ci0gICAgICAgIHJldHVybiB3ZWJNZXRob2RBbm5vdDsKLSAgICB9Ci0KLSAgICAvKiogQHJldHVybiBSZXR1cm5zIHRoZSB3ZWJSZXN1bHRBbm5vdC4gKi8KLSAgICBwdWJsaWMgV2ViUmVzdWx0QW5ub3QgZ2V0V2ViUmVzdWx0QW5ub3QoKSB7Ci0gICAgICAgIHJldHVybiB3ZWJSZXN1bHRBbm5vdDsKLSAgICB9Ci0KLSAgICAvKiogQHJldHVybiBSZXR1cm5zIHRoZSB3ZWJTZXJ2aWNlUmVmQW5ub3QuICovCi0gICAgcHVibGljIFdlYlNlcnZpY2VSZWZBbm5vdCBnZXRXZWJTZXJ2aWNlUmVmQW5ub3QoKSB7Ci0gICAgICAgIHJldHVybiB3ZWJTZXJ2aWNlUmVmQW5ub3Q7Ci0gICAgfQotCi0gICAgLyoqIEByZXR1cm4gUmV0dXJucyB0aGUgYWN0aW9uQW5ub3QuICovCi0gICAgcHVibGljIEFjdGlvbkFubm90IGdldEFjdGlvbkFubm90KCkgewotICAgICAgICByZXR1cm4gYWN0aW9uQW5ub3Q7Ci0gICAgfQotCi0gICAgLyoqIEByZXR1cm4gUmV0dXJucyB0aGUgZXhjZXB0aW9ucy4gKi8KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0RXhjZXB0aW9ucygpIHsKLSAgICAgICAgcmV0dXJuIGV4Y2VwdGlvbnM7Ci0gICAgfQotCi0gICAgLyoqIEByZXR1cm4gUmV0dXJucyB0aGUgZXhjZXB0aW9ucy4gKi8KLSAgICBwdWJsaWMgQ2xhc3NbXSBnZXRFeGNlcHRpb25UeXBlcygpIHsKLSAgICAgICAgLy9UT0RPOiBJbXBsZW1lbnQgdGhpcy4uLgotICAgICAgICAvL2ZvciBlYWNoIGV4Y2VwdGlvbiBpbiB0aGUgYXJyYXksIGNvbnZlcnQgaXQgdG8gYSBjbGFzcywgYW5kIHJldHVybiB0aGF0Ci0gICAgICAgIC8vSWYgYSBjbGFzc2xvYWRlciB3YXMgbm90IHNldCwgdGhlbiBqdXN0IHVzZSB0aGUgZGVmYXVsdAotICAgICAgICBDbGFzc1tdIGNsYXNzZXMgPSBuZXcgQ2xhc3NbMF07Ci0gICAgICAgIHJldHVybiBjbGFzc2VzOwotICAgIH0KLQotICAgIC8qKiBAcmV0dXJuIFJldHVybnMgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBkZWNsYXJpbmcgY2xhc3MuICovCi0gICAgcHVibGljIFN0cmluZyBnZXREZWNsYXJpbmdDbGFzcygpIHsKLSAgICAgICAgaWYgKGRlY2xhcmluZ0NsYXNzID09IG51bGwgJiYgcGFyZW50REJDICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBwYXJlbnREQkMuZ2V0Q2xhc3NOYW1lKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGRlY2xhcmluZ0NsYXNzOwotICAgIH0KLQotICAgIC8qKiBAcmV0dXJuIFJldHVybnMgdGhlIE1vZHVsZUNsYXNzVHlwZS4gKi8KLSAgICBwdWJsaWMgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIGdldERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZVJlZigpIHsKLQotICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnREQkM7Ci0gICAgfQotCi0gICAgLyoqIEBwYXJhbSBtZXRob2ROYW1lIFRoZSBtZXRob2ROYW1lIHRvIHNldC4gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXRob2ROYW1lKFN0cmluZyBtZXRob2ROYW1lKSB7Ci0gICAgICAgIHRoaXMubWV0aG9kTmFtZSA9IG1ldGhvZE5hbWU7Ci0gICAgfQotCi0gICAgLyoqIEBwYXJhbSByZXR1cm5UeXBlIFRoZSByZXR1cm5UeXBlIHRvIHNldC4gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRSZXR1cm5UeXBlKFN0cmluZyByZXR1cm5UeXBlKSB7Ci0gICAgICAgIHRoaXMucmV0dXJuVHlwZSA9IHJldHVyblR5cGU7Ci0gICAgfQotCi0gICAgLyoqIEBwYXJhbSBvbmVXYXlBbm5vdGF0ZWQgVGhlIG9uZVdheSBib29sZWFuIHRvIHNldCAqLwotICAgIHB1YmxpYyB2b2lkIHNldE9uZVdheUFubm90KGJvb2xlYW4gb25lV2F5QW5ub3RhdGVkKSB7Ci0gICAgICAgIHRoaXMub25lV2F5QW5ub3RhdGVkID0gb25lV2F5QW5ub3RhdGVkOwotICAgIH0KLQotICAgIC8qKiBAcGFyYW0gd2ViRW5kcG9pbnRBbm5vdEltcGwgVGhlIHdlYkVuZHBvaW50QW5ub3RJbXBsIHRvIHNldC4gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRXZWJFbmRwb2ludEFubm90KFdlYkVuZHBvaW50QW5ub3Qgd2ViRW5kcG9pbnRBbm5vdCkgewotICAgICAgICB0aGlzLndlYkVuZHBvaW50QW5ub3QgPSB3ZWJFbmRwb2ludEFubm90OwotICAgIH0KLQotICAgIC8qKiBAcGFyYW0gcmVxdWVzdFdyYXBwZXJBbm5vdCBUaGUgcmVxdWVzdFdyYXBwZXJBbm5vdCB0byBzZXQuICovCi0gICAgcHVibGljIHZvaWQgc2V0UmVxdWVzdFdyYXBwZXJBbm5vdCgKLSAgICAgICAgICAgIFJlcXVlc3RXcmFwcGVyQW5ub3QgcmVxdWVzdFdyYXBwZXJBbm5vdCkgewotICAgICAgICB0aGlzLnJlcXVlc3RXcmFwcGVyQW5ub3QgPSByZXF1ZXN0V3JhcHBlckFubm90OwotICAgIH0KLQotICAgIC8qKiBAcGFyYW0gcmVzcG9uc2VXcmFwcGVyQW5ub3QgVGhlIHJlc3BvbnNlV3JhcHBlckFubm90IHRvIHNldC4gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRSZXNwb25zZVdyYXBwZXJBbm5vdCgKLSAgICAgICAgICAgIFJlc3BvbnNlV3JhcHBlckFubm90IHJlc3BvbnNlV3JhcHBlckFubm90KSB7Ci0gICAgICAgIHRoaXMucmVzcG9uc2VXcmFwcGVyQW5ub3QgPSByZXNwb25zZVdyYXBwZXJBbm5vdDsKLSAgICB9Ci0KLSAgICAvKiogQHBhcmFtIGhhbmRsZXJDaGFpbkFubm90IFRoZSBoYW5kbGVyQ2hhaW5Bbm5vdCB0byBzZXQuICovCi0gICAgcHVibGljIHZvaWQgc2V0SGFuZGxlckNoYWluQW5ub3QoSGFuZGxlckNoYWluQW5ub3QgaGFuZGxlckNoYWluQW5ub3QpIHsKLSAgICAgICAgdGhpcy5oYW5kbGVyQ2hhaW5Bbm5vdCA9IGhhbmRsZXJDaGFpbkFubm90OwotICAgIH0KLQotICAgIC8qKiBAcGFyYW0gc29hcEJpbmRpbmdBbm5vdCBUaGUgc29hcEJpbmRpbmdBbm5vdCB0byBzZXQuICovCi0gICAgcHVibGljIHZvaWQgc2V0U29hcEJpbmRpbmdBbm5vdChTb2FwQmluZGluZ0Fubm90IHNvYXBCaW5kaW5nQW5ub3QpIHsKLSAgICAgICAgdGhpcy5zb2FwQmluZGluZ0Fubm90ID0gc29hcEJpbmRpbmdBbm5vdDsKLSAgICB9Ci0KLSAgICAvKiogQHBhcmFtIHdlYk1ldGhvZEFubm90IFRoZSB3ZWJNZXRob2RBbm5vdCB0byBzZXQuICovCi0gICAgcHVibGljIHZvaWQgc2V0V2ViTWV0aG9kQW5ub3QoV2ViTWV0aG9kQW5ub3Qgd2ViTWV0aG9kQW5ub3QpIHsKLSAgICAgICAgdGhpcy53ZWJNZXRob2RBbm5vdCA9IHdlYk1ldGhvZEFubm90OwotICAgIH0KLQotICAgIC8qKiBAcGFyYW0gd2ViUmVzdWx0QW5ub3QgVGhlIHdlYlJlc3VsdEFubm90IHRvIHNldC4gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRXZWJSZXN1bHRBbm5vdChXZWJSZXN1bHRBbm5vdCB3ZWJSZXN1bHRBbm5vdCkgewotICAgICAgICB0aGlzLndlYlJlc3VsdEFubm90ID0gd2ViUmVzdWx0QW5ub3Q7Ci0gICAgfQotCi0gICAgLyoqIEBwYXJhbSB3ZWJTZXJ2aWNlUmVmQW5ub3QgVGhlIHdlYlNlcnZpY2VSZWZBbm5vdCB0byBzZXQuICovCi0gICAgcHVibGljIHZvaWQgc2V0V2ViU2VydmljZVJlZkFubm90KFdlYlNlcnZpY2VSZWZBbm5vdCB3ZWJTZXJ2aWNlUmVmQW5ub3QpIHsKLSAgICAgICAgdGhpcy53ZWJTZXJ2aWNlUmVmQW5ub3QgPSB3ZWJTZXJ2aWNlUmVmQW5ub3Q7Ci0gICAgfQotCi0gICAgLyoqIEBwYXJhbSBhY3Rpb25Bbm5vdCBUaGUgYWN0aW9uQW5ub3QgdG8gc2V0LiAqLwotICAgIHB1YmxpYyB2b2lkIHNldEFjdGlvbkFubm90KEFjdGlvbkFubm90IGFjdGlvbkFubm90KSB7Ci0gICAgICAgIHRoaXMuYWN0aW9uQW5ub3QgPSBhY3Rpb25Bbm5vdDsKLSAgICB9Ci0KLSAgICAvKiogQHBhcmFtIHBhcmFtZXRlckRlc2NyaXB0aW9uIFRoZSBwYXJhbWV0ZXJEZXNjcmlwdGlvbiB0byBhZGQgdG8gdGhlIHNldC4gKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZSgKLSAgICAgICAgICAgIFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlIHBhcmFtZXRlckRlc2NyaXB0aW9uKSB7Ci0gICAgICAgIHBhcmFtZXRlckRlc2NyaXB0aW9ucy5hZGQocGFyYW1ldGVyRGVzY3JpcHRpb24pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJEZXNjcmlwdGlvbiBUaGUgcGFyYW1ldGVyRGVzY3JpcHRpb24gdG8gYWRkIHRvIHRoZSBzZXQuCi0gICAgICogQHBhcmFtIGluZGV4ICAgICAgICAgICAgICAgIFRoZSBpbmRleCBhdCB3aGljaCB0byBwbGFjZSB0aGlzIHBhcmFtZXRlckRlc2NyaXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkUGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGUoUGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGUgcGFyYW1ldGVyRGVzY3JpcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4KSB7Ci0gICAgICAgIHBhcmFtZXRlckRlc2NyaXB0aW9uLnNldExpc3RPcmRlcihpbmRleCk7Ci0gICAgICAgIHBhcmFtZXRlckRlc2NyaXB0aW9ucy5hZGQoaW5kZXgsIHBhcmFtZXRlckRlc2NyaXB0aW9uKTsKLSAgICB9Ci0KLSAgICAvKiogQHBhcmFtIHBhcmFtZXRlckRlc2NyaXB0aW9uIFRoZSBwYXJhbWV0ZXJEZXNjcmlwdGlvbiB0byBhZGQgdG8gdGhlIHNldC4gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZUxpc3QoCi0gICAgICAgICAgICBMaXN0PFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlPiBwYXJhbWV0ZXJEZXNjcmlwdGlvbkxpc3QpIHsKLSAgICAgICAgdGhpcy5wYXJhbWV0ZXJEZXNjcmlwdGlvbnMgPSBwYXJhbWV0ZXJEZXNjcmlwdGlvbkxpc3Q7Ci0gICAgfQotCi0gICAgLyoqIEBwYXJhbSBwYXJhbWV0ZXJEZXNjcmlwdGlvbiBUaGUgcGFyYW1ldGVyRGVzY3JpcHRpb24gdG8gYWRkIHRvIHRoZSBzZXQuICovCi0gICAgcHVibGljIFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlIGdldFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlKGludCBpbmRleCkgewotICAgICAgICByZXR1cm4gcGFyYW1ldGVyRGVzY3JpcHRpb25zLmdldChpbmRleCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICovCi0gICAgcHVibGljIExpc3Q8UGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGU+IGdldFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlTGlzdCgpIHsKLSAgICAgICAgcmV0dXJuIHBhcmFtZXRlckRlc2NyaXB0aW9uczsKLSAgICB9Ci0KLSAgICAvKiogQHBhcmFtIGV4Y2VwdGlvbnMgVGhlIGV4Y2VwdGlvbnMgdG8gc2V0LiAqLwotICAgIHB1YmxpYyB2b2lkIHNldEV4Y2VwdGlvbnMoU3RyaW5nW10gZXhjZXB0aW9ucykgewotICAgICAgICB0aGlzLmV4Y2VwdGlvbnMgPSBleGNlcHRpb25zOwotICAgIH0KLQotICAgIC8qKiBAcGFyYW0gZGVjbGFyaW5nQ2xhc3MgVGhlIHdyYXBwZXIgY2xhc3MgdG8gc2V0LiAqLwotICAgIHB1YmxpYyB2b2lkIHNldERlY2xhcmluZ0NsYXNzKFN0cmluZyBkZWNsYXJpbmdDbGFzcykgewotICAgICAgICB0aGlzLmRlY2xhcmluZ0NsYXNzID0gZGVjbGFyaW5nQ2xhc3M7Ci0gICAgfQotCi0gICAgLyoqIEByZXR1cm4gUmV0dXJucyB0aGUgTW9kdWxlQ2xhc3NUeXBlLiAqLwotICAgIHB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZVJlZihEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgZGJjKSB7Ci0KLSAgICAgICAgdGhpcy5wYXJlbnREQkMgPSBkYmM7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gY29tcGFyZShPYmplY3Qgb2JqKSB7Ci0gICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSkgewotICAgICAgICAgICAgTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUgbWRjID0gKE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlKW9iajsKLSAgICAgICAgICAgIGlmICghKHRoaXMubWV0aG9kTmFtZS5lcXVhbHMobWRjLmdldE1ldGhvZE5hbWUoKSkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTGlzdDxQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZT4gdGhpc1BhcmFtTGlzdCA9IHRoaXMucGFyYW1ldGVyRGVzY3JpcHRpb25zOwotICAgICAgICAgICAgTGlzdDxQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZT4gcGFyYW1MaXN0ID0KLSAgICAgICAgICAgICAgICAgICAgbWRjLmdldFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlTGlzdCgpOwotICAgICAgICAgICAgaWYgKHRoaXNQYXJhbUxpc3Quc2l6ZSgpICE9IHBhcmFtTGlzdC5zaXplKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXNQYXJhbUxpc3Quc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoISh0aGlzUGFyYW1MaXN0LmdldChpKS5jb21wYXJlKHBhcmFtTGlzdC5nZXQoaSkpKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gc3VwZXIuZXF1YWxzKG9iaik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJc0xpc3RUeXBlKGJvb2xlYW4gaXNMaXN0VHlwZSkgewotCQl0aGlzLmlzTGlzdFR5cGUgPSBpc0xpc3RUeXBlOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0xpc3RUeXBlKCkgewotCQlyZXR1cm4gaXNMaXN0VHlwZTsKLQl9Ci0JCi0gICAgLyoqCi0gICAgICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciB1bml0IHRlc3RpbmcuIFdlIHdpbGwgcHJpbnQgYWxsIG9mIHRoZQotICAgICAqIGRhdGEgbWVtYmVycyBoZXJlLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIG5ld0xpbmUgPSAiXG4iOwotICAgICAgICBmaW5hbCBTdHJpbmcgc2FtZUxpbmUgPSAiOyAiOwotICAgICAgICBzYi5hcHBlbmQoc3VwZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgIHNiLmFwcGVuZChuZXdMaW5lKTsKLSAgICAgICAgc2IuYXBwZW5kKCJOYW1lOiAiICsgbWV0aG9kTmFtZSk7Ci0gICAgICAgIHNiLmFwcGVuZChzYW1lTGluZSk7Ci0gICAgICAgIHNiLmFwcGVuZCgiUmV0dXJuVHlwZTogIiArIHJldHVyblR5cGUpOwotCi0gICAgICAgIHNiLmFwcGVuZChuZXdMaW5lKTsKLSAgICAgICAgc2IuYXBwZW5kKCJFeGNlcHRpb25zOiAiKTsKLSAgICAgICAgaWYgKGV4Y2VwdGlvbnMgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleGNlcHRpb25zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKGV4Y2VwdGlvbnNbaV0pOwotICAgICAgICAgICAgICAgIHNiLmFwcGVuZChzYW1lTGluZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAob25lV2F5QW5ub3RhdGVkKSB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQobmV3TGluZSk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoIk9uZVdheSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHdlYk1ldGhvZEFubm90ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNiLmFwcGVuZChuZXdMaW5lKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgiV2ViTWV0aG9kOiAiKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZCh3ZWJNZXRob2RBbm5vdC50b1N0cmluZygpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChyZXF1ZXN0V3JhcHBlckFubm90ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNiLmFwcGVuZChuZXdMaW5lKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgiUmVxdWVzdFdyYXBwZXI6ICIpOwotICAgICAgICAgICAgc2IuYXBwZW5kKHJlcXVlc3RXcmFwcGVyQW5ub3QudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocmVzcG9uc2VXcmFwcGVyQW5ub3QgIT0gbnVsbCkgewotICAgICAgICAgICAgc2IuYXBwZW5kKG5ld0xpbmUpOwotICAgICAgICAgICAgc2IuYXBwZW5kKCJSZXNwb25zZXRXcmFwcGVyOiAiKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZChyZXNwb25zZVdyYXBwZXJBbm5vdC50b1N0cmluZygpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzb2FwQmluZGluZ0Fubm90ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNiLmFwcGVuZChuZXdMaW5lKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgiU09BUEJpbmRpbmc6ICIpOwotICAgICAgICAgICAgc2IuYXBwZW5kKHNvYXBCaW5kaW5nQW5ub3QudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAod2ViRW5kcG9pbnRBbm5vdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQobmV3TGluZSk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoIldlYkVuZHBvaW50OiAiKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZCh3ZWJFbmRwb2ludEFubm90LnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHdlYlJlc3VsdEFubm90ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNiLmFwcGVuZChuZXdMaW5lKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgiV2ViUmVzdWx0OiAiKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZCh3ZWJSZXN1bHRBbm5vdC50b1N0cmluZygpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh3ZWJTZXJ2aWNlUmVmQW5ub3QgIT0gbnVsbCkgewotICAgICAgICAgICAgc2IuYXBwZW5kKG5ld0xpbmUpOwotICAgICAgICAgICAgc2IuYXBwZW5kKCJXZWJTZXJ2aWNlUmVmOiAiKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZCh3ZWJTZXJ2aWNlUmVmQW5ub3QudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYWN0aW9uQW5ub3QgIT0gbnVsbCkgewotICAgICAgICAgICAgc2IuYXBwZW5kKG5ld0xpbmUpOwotICAgICAgICAgICAgc2IuYXBwZW5kKCJBY3Rpb246ICIpOwotICAgICAgICAgICAgc2IuYXBwZW5kKGFjdGlvbkFubm90LnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGhhbmRsZXJDaGFpbkFubm90ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNiLmFwcGVuZChuZXdMaW5lKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgiSGFuZGxlckNoYWluOiAiKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZChoYW5kbGVyQ2hhaW5Bbm5vdC50b1N0cmluZygpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHNiLmFwcGVuZChuZXdMaW5lKTsKLSAgICAgICAgc2IuYXBwZW5kKCJOdW1iZXIgb2YgUGFyYW1ldGVyIERlc2NyaXB0aW9uczogIiArIHBhcmFtZXRlckRlc2NyaXB0aW9ucy5zaXplKCkpOwotICAgICAgICBJdGVyYXRvcjxQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZT4gcGRjSXRlciA9IHBhcmFtZXRlckRlc2NyaXB0aW9ucy5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAocGRjSXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIHNiLmFwcGVuZChuZXdMaW5lKTsKLSAgICAgICAgICAgIFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlIHBkYyA9IHBkY0l0ZXIubmV4dCgpOwotCQkJc2IuYXBwZW5kKHBkYy50b1N0cmluZygpKTsKLQkJfQotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9idWlsZGVyL09uZVdheUFubm90LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9idWlsZGVyL09uZVdheUFubm90LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmMmIyYmMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9PbmVXYXlBbm5vdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXI7Ci0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOwotCi1wdWJsaWMgY2xhc3MgT25lV2F5QW5ub3QgaW1wbGVtZW50cyBqYXZheC5qd3MuT25ld2F5IHsKLQotICAgIC8qKiBBIE9uZVdheUFubm90IGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQuICovCi0gICAgcHJpdmF0ZSBPbmVXYXlBbm5vdCgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9uZVdheUFubm90IGNyZWF0ZU9uZVdheUFubm90SW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBPbmVXYXlBbm5vdCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBDbGFzczxBbm5vdGF0aW9uPiBhbm5vdGF0aW9uVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIEFubm90YXRpb24uY2xhc3M7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9QYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9QYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTQzMWIwLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2J1aWxkZXIvUGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlcjsKLQotcHVibGljIGNsYXNzIFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlIHsKLSAgICBwcml2YXRlIFN0cmluZyBwYXJhbWV0ZXJUeXBlOwotICAgIHByaXZhdGUgQ2xhc3MgcGFyYW1ldGVyVHlwZUNsYXNzOwotICAgIHByaXZhdGUgV2ViUGFyYW1Bbm5vdCB3ZWJQYXJhbUFubm90OwotICAgIHByaXZhdGUgV2ViU2VydmljZVJlZkFubm90IHdlYlNlcnZpY2VSZWZBbm5vdDsKLSAgICBwcml2YXRlIGludCBsaXN0T3JkZXI7Ci0JLy8gV2lsbCBpbmRpY2F0ZSB3aGV0aGVyIG9yIG5vdCB3ZSBmb3VuZCBhbiBAWE1MTGlzdCBhbm5vdGF0aW9uIG9uIHRoZSBwYXJhbWV0ZXIKLQlwcml2YXRlIGJvb2xlYW4gICAgICAgICAgICAgICAgIGlzTGlzdFR5cGU7Ci0KLSAgICBwcml2YXRlIE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlIHBhcmVudE1EQzsKLQotICAgIHB1YmxpYyBQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZSgpIHsKLQotICAgIH0KLQotICAgIHB1YmxpYyBQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZSgKLSAgICAgICAgICAgIFN0cmluZyBwYXJhbWV0ZXJUeXBlLAotICAgICAgICAgICAgQ2xhc3MgcGFyYW1ldGVyVHlwZUNsYXNzLAotICAgICAgICAgICAgV2ViUGFyYW1Bbm5vdCB3ZWJQYXJhbUFubm90LAotICAgICAgICAgICAgV2ViU2VydmljZVJlZkFubm90IHdlYlNlcnZpY2VSZWZBbm5vdCkgewotCi0gICAgICAgIHRoaXMucGFyYW1ldGVyVHlwZSA9IHBhcmFtZXRlclR5cGU7Ci0gICAgICAgIHRoaXMucGFyYW1ldGVyVHlwZUNsYXNzID0gcGFyYW1ldGVyVHlwZUNsYXNzOwotICAgICAgICB0aGlzLndlYlBhcmFtQW5ub3QgPSB3ZWJQYXJhbUFubm90OwotICAgICAgICB0aGlzLndlYlNlcnZpY2VSZWZBbm5vdCA9IHdlYlNlcnZpY2VSZWZBbm5vdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBTdHJpbmcgZGVzY3JiaW5nIHRoaXMgUGFyYW1ldGVyIHR5cGUuICBOb3RlIHRoYXQgdGhpcyBzdHJpbmcgaXMgdW5wYXJzZWQuICBGb3IKLSAgICAgKiBleGFtcGxlLCBpZiBpdCByZXByZXNlbnRzIGEgamF2YS51dGlsLkxpc3Q8bXkucGFja2FnZS5Gb28+LCB0aGVuIHRoYXQgZXhjYWN0IHN0cmluZyB3aWxsIGJlCi0gICAgICogcmV0dXJuZWQsIGkuZS4gImphdmEudXRpbC5MaXN0PG15LnBhY2thZ2UuRm9vPiIuICBZb3UgY2FuIHVzZSBvdGhlciBtZXRob2RzIHRvIHJldHJpZXZlIHBhcnNlZAotICAgICAqIHZhbHVlcyBmb3IgR2VuZXJpY3MgYW5kIEhvbGRlcnMuICBGb3IgZXhhbXBsZSwgZ2V0UGFyYW1ldGVyVHlwZUNsYXNzKCksIGdldFJhd1R5cGUoKSwKLSAgICAgKiBnZXRIb2xkZXJBY3R1YWxUeXBlKCksIGFuZCBnZXRIb2xkZXJBY3R1YWxUeXBlQ2xhc3MoKS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgcGFyYW1ldGVyVHlwZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhcmFtZXRlclR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBwYXJhbWV0ZXJUeXBlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNsYXNzIGFzc29jaWF0ZWQgd2l0aCB0aGUgUGFyYW1ldGVyLiAgTm90ZSB0aGF0IGlmIHRoaXMgaXMgYSBnZW5lcmljIChpbmNsdWRpbmcgYQotICAgICAqIEpBWFdTIEhvbGRlcjxUPikgdGhlbiB0aGUgY2xhc3MgYXNzb2NpYXRlZCB3aXRoIHRoZSByYXcgdHlwZSBpcyByZXR1cm5lZCAoaS5lLiBIb2xkZXIuY2xhc3MpLgotICAgICAqIDxwLz4KLSAgICAgKiBGb3IgYSBKQVgtV1MgSG9sZGVyPFQ+LCB1c2UgZ2V0SG9sZGVyQWN0dWFsVHlwZSguLi4pIHRvIGdldCB0aGUgY2xhc3MgYXNzb2NpYXRlZCB3aXRoIFQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHBhcmFtZXRlclR5cGVDbGFzcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ2xhc3MgZ2V0UGFyYW1ldGVyVHlwZUNsYXNzKCkgewotCi0gICAgICAgIGlmIChwYXJhbWV0ZXJUeXBlQ2xhc3MgPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGdldFBhcmFtZXRlclR5cGUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcGFyYW1ldGVyVHlwZUNsYXNzID0gRGVzY3JpcHRpb25CdWlsZGVyVXRpbHMuZ2V0UHJpbWl0aXZlQ2xhc3MoZ2V0UGFyYW1ldGVyVHlwZSgpKTsKLSAgICAgICAgICAgICAgICBpZiAocGFyYW1ldGVyVHlwZUNsYXNzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBpcyBhIEdlbmVyaWMsIHdlIG5lZWQgdG8gbG9hZCB0aGUgY2xhc3MgYXNzb2NpYXRlZCB3aXRoIHRoZSBSYXcgVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgLy8gaS5lLiBmb3IgSkFYLVdTIEhvbGRlcjxGb28+LCB3ZSB3YW50IHRvIGxvYWQgSG9sZGVyLiBPdGh3ZXJpc2UsIGxvYWQgdGhlIHR5cGUgZGlyZWN0bHkuIAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY2xhc3NUb0xvYWQgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBpZiAoRGVzY3JpcHRpb25CdWlsZGVyVXRpbHMuZ2V0UmF3VHlwZShwYXJhbWV0ZXJUeXBlKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc1RvTG9hZCA9IERlc2NyaXB0aW9uQnVpbGRlclV0aWxzLmdldFJhd1R5cGUocGFyYW1ldGVyVHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc1RvTG9hZCA9IHBhcmFtZXRlclR5cGU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyVHlwZUNsYXNzID0gbG9hZENsYXNzRnJvbVBEQyhjbGFzc1RvTG9hZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwYXJhbWV0ZXJUeXBlQ2xhc3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRm9yIEpBWC1XUyBIb2xkZXI8VD4sIHJldHVybnMgdGhlIGNsYXNzIGFzc29jaWF0ZWQgd2l0aCBULiAgRm9yIG5vbi1KQVgtV1MgSG9sZGVycyByZXR1cm5zCi0gICAgICogbnVsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ2xhc3MgZ2V0SG9sZGVyQWN0dWFsVHlwZUNsYXNzKCkgewotICAgICAgICBDbGFzcyByZXR1cm5DbGFzcyA9IG51bGw7Ci0KLSAgICAgICAgaWYgKERlc2NyaXB0aW9uQnVpbGRlclV0aWxzLmlzSG9sZGVyVHlwZShwYXJhbWV0ZXJUeXBlKSkgewotICAgICAgICAgICAgU3RyaW5nIGNsYXNzVG9Mb2FkID0gRGVzY3JpcHRpb25CdWlsZGVyVXRpbHMuZ2V0SG9sZGVyQWN0dWFsVHlwZShwYXJhbWV0ZXJUeXBlKTsKLSAgICAgICAgICAgIHJldHVybkNsYXNzID0gbG9hZENsYXNzRnJvbVBEQyhjbGFzc1RvTG9hZCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldHVybkNsYXNzOwotICAgIH0KLQotICAgIHByaXZhdGUgQ2xhc3MgbG9hZENsYXNzRnJvbVBEQyhTdHJpbmcgY2xhc3NUb0xvYWQpIHsKLSAgICAgICAgQ2xhc3MgcmV0dXJuQ2xhc3MgPSBudWxsOwotICAgICAgICBDbGFzc0xvYWRlciBjbGFzc0xvYWRlciA9IG51bGw7Ci0KLSAgICAgICAgaWYgKGdldE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlUmVmKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGdldE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlUmVmKCkuZ2V0RGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlUmVmKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNsYXNzTG9hZGVyID0gZ2V0TWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGVSZWYoKS5nZXREZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGVSZWYoKQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldENsYXNzTG9hZGVyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuQ2xhc3MgPSBEZXNjcmlwdGlvbkJ1aWxkZXJVdGlscy5sb2FkQ2xhc3NGcm9tQ29tcG9zaXRlKGNsYXNzVG9Mb2FkLCBjbGFzc0xvYWRlcik7Ci0gICAgICAgIHJldHVybiByZXR1cm5DbGFzczsKLSAgICB9Ci0KLSAgICAvKiogQHJldHVybiBSZXR1cm5zIHRoZSB3ZWJQYXJhbUFubm90LiAqLwotICAgIHB1YmxpYyBXZWJQYXJhbUFubm90IGdldFdlYlBhcmFtQW5ub3QoKSB7Ci0gICAgICAgIHJldHVybiB3ZWJQYXJhbUFubm90OwotICAgIH0KLQotICAgIC8qKiBAcmV0dXJuIFJldHVybnMgdGhlIHdlYlNlcnZpY2VSZWZBbm5vdC4gKi8KLSAgICBwdWJsaWMgV2ViU2VydmljZVJlZkFubm90IGdldFdlYlNlcnZpY2VSZWZBbm5vdCgpIHsKLSAgICAgICAgcmV0dXJuIHdlYlNlcnZpY2VSZWZBbm5vdDsKLSAgICB9Ci0KLSAgICAvKiogQHJldHVybiBSZXR1cm5zIHRoZSB3ZWJTZXJ2aWNlQ29udGV4dEFubm90LiAqLwotICAgIHB1YmxpYyBpbnQgZ2V0TGlzdE9yZGVyKCkgewotICAgICAgICByZXR1cm4gbGlzdE9yZGVyOwotICAgIH0KLQotICAgIC8qKiBAcmV0dXJuIFJldHVybnMgdGhlIHBhcmVudE1EQy4gKi8KLSAgICBwdWJsaWMgTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUgZ2V0TWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGVSZWYoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnBhcmVudE1EQzsKLSAgICB9Ci0KLSAgICAvKiogQHBhcmFtIHBhcmFtZXRlclR5cGUgVGhlIHBhcmFtZXRlclR5cGUgdG8gc2V0LiAqLwotICAgIHB1YmxpYyB2b2lkIHNldFBhcmFtZXRlclR5cGUoU3RyaW5nIHBhcmFtZXRlclR5cGUpIHsKLSAgICAgICAgdGhpcy5wYXJhbWV0ZXJUeXBlID0gcGFyYW1ldGVyVHlwZTsKLSAgICB9Ci0KLSAgICAvKiogQHBhcmFtIHBhcmFtZXRlclR5cGVDbGFzcyBUaGUgcGFyYW1ldGVyVHlwZUNsYXNzIHRvIHNldC4gKi8KLSAgICBwcml2YXRlIHZvaWQgc2V0UGFyYW1ldGVyVHlwZUNsYXNzKENsYXNzIHBhcmFtZXRlclR5cGVDbGFzcykgewotICAgICAgICB0aGlzLnBhcmFtZXRlclR5cGVDbGFzcyA9IHBhcmFtZXRlclR5cGVDbGFzczsKLSAgICB9Ci0KLSAgICAvKiogQHBhcmFtIHdlYlBhcmFtQW5ub3QgVGhlIHdlYlBhcmFtQW5ub3QgdG8gc2V0LiAqLwotICAgIHB1YmxpYyB2b2lkIHNldFdlYlBhcmFtQW5ub3QoV2ViUGFyYW1Bbm5vdCB3ZWJQYXJhbUFubm90KSB7Ci0gICAgICAgIHRoaXMud2ViUGFyYW1Bbm5vdCA9IHdlYlBhcmFtQW5ub3Q7Ci0gICAgfQotCi0gICAgLyoqIEBwYXJhbSB3ZWJTZXJ2aWNlUmVmQW5ub3QgVGhlIHdlYlNlcnZpY2VSZWZBbm5vdCB0byBzZXQuICovCi0gICAgcHVibGljIHZvaWQgc2V0V2ViU2VydmljZVJlZkFubm90KFdlYlNlcnZpY2VSZWZBbm5vdCB3ZWJTZXJ2aWNlUmVmQW5ub3QpIHsKLSAgICAgICAgdGhpcy53ZWJTZXJ2aWNlUmVmQW5ub3QgPSB3ZWJTZXJ2aWNlUmVmQW5ub3Q7Ci0gICAgfQotCi0gICAgLyoqIEBwYXJhbSB3ZWJTZXJ2aWNlQ29udGV4dEFubm90IFRoZSB3ZWJTZXJ2aWNlQ29udGV4dEFubm90IHRvIHNldC4gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRMaXN0T3JkZXIoaW50IGxpc3RPcmRlcikgewotICAgICAgICB0aGlzLmxpc3RPcmRlciA9IGxpc3RPcmRlcjsKLSAgICB9Ci0KLSAgICAvKiogQHBhcmFtIG1kYyBUaGUgcGFyZW50IE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlIHRvIHNldC4gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZVJlZihNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSBtZGMpIHsKLSAgICAgICAgdGhpcy5wYXJlbnRNREMgPSBtZGM7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gY29tcGFyZShPYmplY3Qgb2JqKSB7Ci0gICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZSkgewotICAgICAgICAgICAgUGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGUgcGRjID0gKFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlKW9iajsKLSAgICAgICAgICAgIGlmICghKHRoaXMucGFyYW1ldGVyVHlwZS5lcXVhbHMocGRjLmdldFBhcmFtZXRlclR5cGUoKSkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gc3VwZXIuZXF1YWxzKG9iaik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAJCi0gICAgcHVibGljIHZvaWQgc2V0SXNMaXN0VHlwZShib29sZWFuIGlzTGlzdFR5cGUpIHsKLSAgICAJdGhpcy5pc0xpc3RUeXBlID0gaXNMaXN0VHlwZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0xpc3RUeXBlKCkgewotICAgIAlyZXR1cm4gaXNMaXN0VHlwZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgdW5pdCB0ZXN0aW5nLiBXZSB3aWxsIHByaW50IGFsbCBvZiB0aGUgZGF0YSBtZW1iZXJzIGhlcmUuICovCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBmaW5hbCBTdHJpbmcgbmV3TGluZSA9ICJcbiI7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBzYW1lTGluZSA9ICI7ICI7Ci0gICAgICAgIHNiLmFwcGVuZChzdXBlci50b1N0cmluZygpKTsKLSAgICAgICAgc2IuYXBwZW5kKHNhbWVMaW5lKTsKLSAgICAgICAgc2IuYXBwZW5kKCJQYXJhbWV0ZXJUeXBlOiAiICsgcGFyYW1ldGVyVHlwZSk7Ci0KLSAgICAgICAgaWYgKHdlYlBhcmFtQW5ub3QgIT0gbnVsbCkgewotICAgICAgICAgICAgc2IuYXBwZW5kKG5ld0xpbmUpOwotICAgICAgICAgICAgc2IuYXBwZW5kKCJXZWJQYXJhbTogIik7Ci0gICAgICAgICAgICBzYi5hcHBlbmQod2ViUGFyYW1Bbm5vdC50b1N0cmluZygpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh3ZWJTZXJ2aWNlUmVmQW5ub3QgIT0gbnVsbCkgewotICAgICAgICAgICAgc2IuYXBwZW5kKG5ld0xpbmUpOwotICAgICAgICAgICAgc2IuYXBwZW5kKCJXZWJTZXJ2aWNlUmVmOiAiKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZCh3ZWJTZXJ2aWNlUmVmQW5ub3QudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRSYXdUeXBlKCkgewotICAgICAgICByZXR1cm4gRGVzY3JpcHRpb25CdWlsZGVyVXRpbHMuZ2V0UmF3VHlwZShwYXJhbWV0ZXJUeXBlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEhvbGRlckFjdHVhbFR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBEZXNjcmlwdGlvbkJ1aWxkZXJVdGlscy5nZXRIb2xkZXJBY3R1YWxUeXBlKHBhcmFtZXRlclR5cGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzSG9sZGVyVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIERlc2NyaXB0aW9uQnVpbGRlclV0aWxzLmlzSG9sZGVyVHlwZShwYXJhbWV0ZXJUeXBlKTsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9idWlsZGVyL1BvcnRDb21wb3NpdGUuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2J1aWxkZXIvUG9ydENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDAzYmExLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2J1aWxkZXIvUG9ydENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlcjsNCi0NCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLlNldDsNCi0NCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOw0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNhdGFsb2cuSkFYV1NDYXRhbG9nTWFuYWdlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi54bWwuaGFuZGxlci5IYW5kbGVyQ2hhaW5zVHlwZTsNCi0NCi0vKioNCi0gKiBUaGlzIHN1YmNsYXNzIG9mIHRoZSBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgd2lsbCBiZSB1c2VkIHRvIG1vZGVsDQotICogaW5mb3JtYXRpb24gc3BlY2lmaWMgdG8gYSBwb3J0LiAgVGhlIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSwgd2hlbg0KLSAqIHVzZWQgaW4gc2VydmVyLXNpZGUgcHJvY2Vzc2luZywgbW9yZSBvciBsZXNzIHJlcHJlc2VudHMgYSBzaW5nbGUgd2ViIA0KLSAqIHNlcnZpY2UgaW1wbGVtZW50YXRpb24gY2xhc3MuIEl0IGlzIHBvc3NpYmxlLCBhbmQgbGlrZWx5LCB0aGF0IGEgc2luZ2xlDQotICogaW1wbGVtZW50YXRpb24gY2xhc3Mgd2lsbCBzZXJ2ZSBtdWx0aXBsZSBwb3J0cy4gVGhlIFBvcnRDb21wb3NpdGUgYWxsb3dzDQotICogbWV0YWRhdGEgdGhhdCBhcHBsaWVzIGF0IHRoZSBwb3J0IGxldmVsIHRvIGJlIHNlcGFyYXRlZCBmcm9tIHRoZSANCi0gKiBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUuIFRoaXMgd2lsbCBhbGxvdyBwcm9jZXNzaW5nIGFuZCBjb25maWd1cmluZw0KLSAqIG9mIG11bHRpcGxlIHBvcnRzIGluIHRoZSBkZXNjcmlwdGlvbiBoaWVyYXJjaHkgZnJvbSBhIHNpbmdsZSBEQkMgb2JqZWN0Lg0KLSAqDQotICovDQotcHVibGljIGNsYXNzIFBvcnRDb21wb3NpdGUgZXh0ZW5kcyBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgew0KLSAgICANCi0gICAgcHJpdmF0ZSBXc2RsR2VuZXJhdG9yIHdzZGxHZW5lcmF0b3I7DQotICAgIA0KLSAgICAvLyBUaGUgV2ViU2VydmljZUFubm90IHNob3VsZCBoYXZlIGJlZW4gY3JlYXRlZCBmcm9tIHRoZSBXZWJTZXJ2aWNlQW5ub3QNCi0gICAgLy8gdGhhdCBleGlzdHMgb24gdGhlIERCQyB3aXRoIHdoaWNoIGEgUG9ydENvbXBvc2l0ZSBpbnN0YW5jZSB3YXMgY29uc3RydWN0ZWQuDQotICAgIC8vIEl0IGV4aXN0cyBoZXJlIHNvIHBvcnQtc3BlY2lmaWMgdmFsdWVzLCBzdWNoIGFzICdwb3J0TmFtZScsIGNhbiBiZSBvdmVycmlkZGVuLg0KLSAgICBwcml2YXRlIFdlYlNlcnZpY2VBbm5vdCB3c0Fubm90Ow0KLSAgICANCi0gICAgLy8gVGhlIFdlYlNlcnZpY2VQcm92aWRlckFubm90IHNob3VsZCBoYXZlIGJlZW4gY3JlYXRlZCBmcm9tIHRoZSBXZWJTZXJ2aWNlUHJvdmlkZXJBbm5vdA0KLSAgICAvLyB0aGF0IGV4aXN0cyBvbiB0aGUgREJDIHdpdGggd2hpY2ggYSBQb3J0Q29tcG9zaXRlIGluc3RhbmNlIHdhcyBjb25zdHJ1Y3RlZC4NCi0gICAgLy8gSXQgZXhpc3RzIGhlcmUgc28gcG9ydC1zcGVjaWZpYyB2YWx1ZXMsIHN1Y2ggYXMgJ3BvcnROYW1lJywgY2FuIGJlIG92ZXJyaWRkZW4uDQotICAgIHByaXZhdGUgV2ViU2VydmljZVByb3ZpZGVyQW5ub3Qgd3NwQW5ub3Q7DQotICAgIA0KLSAgICBwcml2YXRlIEJpbmRpbmdUeXBlQW5ub3QgYnRBbm5vdDsNCi0gICAgDQotICAgIHByaXZhdGUgSGFuZGxlckNoYWluQW5ub3QgaGNBbm5vdDsNCi0gICAgDQotICAgIHByaXZhdGUgSGFuZGxlckNoYWluc1R5cGUgaGNzVHlwZTsNCi0gICAgDQotICAgIHByaXZhdGUgQm9vbGVhbiBtdG9tRW5hYmxlZDsNCi0gICAgDQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzOw0KLSAgICANCi0gICAgcHJpdmF0ZSBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgYmFzZURCQzsNCi0gICAgDQotICAgIHB1YmxpYyBQb3J0Q29tcG9zaXRlKERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBiYXNlREJDKSB7DQotICAgICAgICB0aGlzLmJhc2VEQkMgPSBiYXNlREJDOw0KLSAgICB9DQotICAgIA0KLSAgICANCi0gICAgcHVibGljIFdzZGxHZW5lcmF0b3IgZ2V0Q3VzdG9tV3NkbEdlbmVyYXRvcigpIHsNCi0gICAgICAgIGlmKHdzZGxHZW5lcmF0b3IgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiBiYXNlREJDLmdldEN1c3RvbVdzZGxHZW5lcmF0b3IoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB3c2RsR2VuZXJhdG9yOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBXZWJTZXJ2aWNlQW5ub3QgZ2V0V2ViU2VydmljZUFubm90KCkgew0KLSAgICAgICAgaWYod3NBbm5vdCA9PSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuIGJhc2VEQkMuZ2V0V2ViU2VydmljZUFubm90KCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gd3NBbm5vdDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgV2ViU2VydmljZVByb3ZpZGVyQW5ub3QgZ2V0V2ViU2VydmljZVByb3ZpZGVyQW5ub3QoKSB7DQotICAgICAgICBpZih3c3BBbm5vdCA9PSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuIGJhc2VEQkMuZ2V0V2ViU2VydmljZVByb3ZpZGVyQW5ub3QoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB3c3BBbm5vdDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRDdXN0b21Xc2RsR2VuZXJhdG9yKFdzZGxHZW5lcmF0b3Igd3NkbEdlbmVyYXRvcikgew0KLSAgICAgICAgdGhpcy53c2RsR2VuZXJhdG9yID0gd3NkbEdlbmVyYXRvcjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRIYW5kbGVyQ2hhaW5Bbm5vdChIYW5kbGVyQ2hhaW5Bbm5vdCBoYW5kbGVyQ2hhaW5Bbm5vdCkgew0KLSAgICAgICAgdGhpcy5oY0Fubm90ID0gaGFuZGxlckNoYWluQW5ub3Q7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0SGFuZGxlckNoYWluc1R5cGUoSGFuZGxlckNoYWluc1R5cGUgaGFuZGxlckNoYWluc1R5cGUpIHsNCi0gICAgICAgIHRoaXMuaGNzVHlwZSA9IGhhbmRsZXJDaGFpbnNUeXBlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldElzTVRPTUVuYWJsZWQoYm9vbGVhbiBpc01UT01FbmFibGVkKSB7DQotICAgICAgICB0aGlzLm10b21FbmFibGVkID0gaXNNVE9NRW5hYmxlZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0aWVzKE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykgew0KLSAgICAgICAgdGhpcy5wcm9wZXJ0aWVzID0gcHJvcGVydGllczsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRXZWJTZXJ2aWNlQW5ub3QoV2ViU2VydmljZUFubm90IHdlYlNlcnZpY2VBbm5vdCkgew0KLSAgICAgICAgdGhpcy53c0Fubm90ID0gd2ViU2VydmljZUFubm90Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFdlYlNlcnZpY2VQcm92aWRlckFubm90KFdlYlNlcnZpY2VQcm92aWRlckFubm90IHdlYlNlcnZpY2VQcm92aWRlckFubm90KSB7DQotICAgICAgICB0aGlzLndzcEFubm90ID0gd2ViU2VydmljZVByb3ZpZGVyQW5ub3Q7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEJpbmRpbmdUeXBlQW5ub3QgZ2V0QmluZGluZ1R5cGVBbm5vdCgpIHsNCi0gICAgICAgIGlmKGJ0QW5ub3QgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiBiYXNlREJDLmdldEJpbmRpbmdUeXBlQW5ub3QoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBidEFubm90Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBIYW5kbGVyQ2hhaW5Bbm5vdCBnZXRIYW5kbGVyQ2hhaW5Bbm5vdCgpIHsNCi0gICAgICAgIGlmKGhjQW5ub3QgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiBiYXNlREJDLmdldEhhbmRsZXJDaGFpbkFubm90KCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gaGNBbm5vdDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgSGFuZGxlckNoYWluc1R5cGUgZ2V0SGFuZGxlckNoYWluc1R5cGUoKSB7DQotICAgICAgICBpZihoY3NUeXBlID09IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gYmFzZURCQy5nZXRIYW5kbGVyQ2hhaW5zVHlwZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGhjc1R5cGU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaXNNVE9NRW5hYmxlZCgpIHsNCi0gICAgICAgIGlmKG10b21FbmFibGVkID09IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gYmFzZURCQy5pc01UT01FbmFibGVkKCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbXRvbUVuYWJsZWQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0QmluZGluZ1R5cGVBbm5vdChCaW5kaW5nVHlwZUFubm90IGJpbmRpbmdUeXBlQW5ub3QpIHsNCi0gICAgICAgIHRoaXMuYnRBbm5vdCA9IGJpbmRpbmdUeXBlQW5ub3Q7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD4gZ2V0UHJvcGVydGllcygpIHsNCi0gICAgICAgIGlmKHByb3BlcnRpZXMgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiBiYXNlREJDLmdldFByb3BlcnRpZXMoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBwcm9wZXJ0aWVzOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGFkZFBvcnRDb21wb3NpdGUoUG9ydENvbXBvc2l0ZSBwb3J0REJDKSB7DQotICAgICAgICAvLyBub3RoaW5nIHRvIGRvIGhlcmUNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTGlzdDxQb3J0Q29tcG9zaXRlPiBnZXRQb3J0Q29tcG9zaXRlcygpIHsNCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgSkFYV1NDYXRhbG9nTWFuYWdlciBnZXRDYXRhbG9nTWFuYWdlcigpIHsNCi0gICAgICAgIHJldHVybiBiYXNlREJDLmdldENhdGFsb2dNYW5hZ2VyKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIENsYXNzTG9hZGVyIGdldENsYXNzTG9hZGVyKCkgew0KLSAgICAgICAgcmV0dXJuIGJhc2VEQkMuZ2V0Q2xhc3NMb2FkZXIoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0Q2xhc3NNb2RpZmllcnMoKSB7DQotICAgICAgICByZXR1cm4gYmFzZURCQy5nZXRDbGFzc01vZGlmaWVycygpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgew0KLSAgICAgICAgcmV0dXJuIGJhc2VEQkMuZ2V0Q2xhc3NOYW1lKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIExpc3Q8Q3VzdG9tQW5ub3RhdGlvbkluc3RhbmNlPiBnZXRDdXN0b21Bbm5vdGF0aW9uSW5zdGFuY2VzKCkgew0KLSAgICAgICAgcmV0dXJuIGJhc2VEQkMuZ2V0Q3VzdG9tQW5ub3RhdGlvbkluc3RhbmNlcygpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBDdXN0b21Bbm5vdGF0aW9uUHJvY2Vzc29yPiBnZXRDdXN0b21Bbm5vdGF0aW9uUHJvY2Vzc29ycygpIHsNCi0gICAgICAgIHJldHVybiBiYXNlREJDLmdldEN1c3RvbUFubm90YXRpb25Qcm9jZXNzb3JzKCk7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyBGaWVsZERlc2NyaXB0aW9uQ29tcG9zaXRlIGdldEZpZWxkRGVzY3JpcHRpb25Db21wb3NpdGUoU3RyaW5nIGZpZWxkTmFtZSkgew0KLSAgICAgICAgcmV0dXJuIGJhc2VEQkMuZ2V0RmllbGREZXNjcmlwdGlvbkNvbXBvc2l0ZShmaWVsZE5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0SW50ZXJmYWNlc0xpc3QoKSB7DQotICAgICAgICByZXR1cm4gYmFzZURCQy5nZXRJbnRlcmZhY2VzTGlzdCgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSBnZXRNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZShTdHJpbmcgbWV0aG9kTmFtZSwgaW50IG9jY3VyZW5jZSkgew0KLSAgICAgICAgcmV0dXJuIGJhc2VEQkMuZ2V0TWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUobWV0aG9kTmFtZSwgb2NjdXJlbmNlKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTGlzdDxNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZT4gZ2V0TWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUoU3RyaW5nIG1ldGhvZE5hbWUpIHsNCi0gICAgICAgIHJldHVybiBiYXNlREJDLmdldE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlKG1ldGhvZE5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBMaXN0PE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlPiBnZXRNZXRob2REZXNjcmlwdGlvbnNMaXN0KCkgew0KLSAgICAgICAgcmV0dXJuIGJhc2VEQkMuZ2V0TWV0aG9kRGVzY3JpcHRpb25zTGlzdCgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBRTmFtZSBnZXRQcmVmZXJyZWRQb3J0KCkgew0KLSAgICAgICAgcmV0dXJuIGJhc2VEQkMuZ2V0UHJlZmVycmVkUG9ydCgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBRTmFtZSBnZXRQcmVmZXJyZWRQb3J0KE9iamVjdCBrZXkpIHsNCi0gICAgICAgIHJldHVybiBiYXNlREJDLmdldFByZWZlcnJlZFBvcnQoa2V5KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU2VydmljZU1vZGVBbm5vdCBnZXRTZXJ2aWNlTW9kZUFubm90KCkgew0KLSAgICAgICAgcmV0dXJuIGJhc2VEQkMuZ2V0U2VydmljZU1vZGVBbm5vdCgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTb2FwQmluZGluZ0Fubm90IGdldFNvYXBCaW5kaW5nQW5ub3QoKSB7DQotICAgICAgICByZXR1cm4gYmFzZURCQy5nZXRTb2FwQmluZGluZ0Fubm90KCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRTdXBlckNsYXNzTmFtZSgpIHsNCi0gICAgICAgIHJldHVybiBiYXNlREJDLmdldFN1cGVyQ2xhc3NOYW1lKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaXNJbnRlcmZhY2UoKSB7DQotICAgICAgICByZXR1cm4gYmFzZURCQy5pc0ludGVyZmFjZSgpOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgRGVmaW5pdGlvbiBnZXRXc2RsRGVmaW5pdGlvbigpIHsNCi0gICAgICAgIHJldHVybiBiYXNlREJDLmdldFdzZGxEZWZpbml0aW9uKCk7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyBTZXQ8UU5hbWU+IGdldFNlcnZpY2VRTmFtZXMoKSB7DQotICAgICAgICByZXR1cm4gYmFzZURCQy5nZXRTZXJ2aWNlUU5hbWVzKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIERlZmluaXRpb24gZ2V0V3NkbERlZmluaXRpb24oUU5hbWUgc2VydmljZVFOYW1lKSB7DQotICAgICAgICByZXR1cm4gYmFzZURCQy5nZXRXc2RsRGVmaW5pdGlvbihzZXJ2aWNlUU5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VRTmFtZXMoU2V0PFFOYW1lPiBzZXJ2aWNlUU5hbWVzKSB7DQotICAgICAgICBiYXNlREJDLnNldFNlcnZpY2VRTmFtZXMoc2VydmljZVFOYW1lcyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0V3NkbERlZmluaXRpb24oUU5hbWUgc2VydmljZVFOYW1lLCBEZWZpbml0aW9uIGRlZmluaXRpb24pIHsNCi0gICAgICAgIGJhc2VEQkMuc2V0V3NkbERlZmluaXRpb24oc2VydmljZVFOYW1lLCBkZWZpbml0aW9uKTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIHZvaWQgc2V0d3NkbFVSTChRTmFtZSBzZXJ2aWNlUU5hbWUsIFVSTCB1cmwpIHsNCi0gICAgICAgIGJhc2VEQkMuc2V0d3NkbFVSTChzZXJ2aWNlUU5hbWUsIHVybCk7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyBVUkwgZ2V0V3NkbFVSTChRTmFtZSBzZXJ2aWNlUU5hbWUpIHsNCi0gICAgICAgIHJldHVybiBiYXNlREJDLmdldFdzZGxVUkwoc2VydmljZVFOYW1lKTsNCi0gICAgfQ0KLSAgICANCi0gICAgDQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQotICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7DQotICAgICAgICBmaW5hbCBTdHJpbmcgbmV3TGluZSA9ICJcbiI7DQotICAgICAgICBmaW5hbCBTdHJpbmcgc2FtZUxpbmUgPSAiOyAiOw0KLSAgICAgICAgc2IuYXBwZW5kKHN1cGVyLnRvU3RyaW5nKCkpOw0KLSAgICAgICAgc2IuYXBwZW5kKG5ld0xpbmUpOw0KLSAgICAgICAgc2IuYXBwZW5kKCJDbGFzc05hbWU6ICIgKyBnZXRDbGFzc05hbWUoKSk7DQotDQotICAgICAgICBzYi5hcHBlbmQobmV3TGluZSk7DQotDQotICAgICAgICBzYi5hcHBlbmQobmV3TGluZSk7DQotICAgICAgICBzYi5hcHBlbmQoImhhcyB3c2RsRGVmaW5pdGlvbj86ICIpOw0KLSAgICAgICAgaWYgKGdldFdzZGxEZWZpbml0aW9uKCkgIT1udWxsKSB7DQotICAgICAgICAgICAgc2IuYXBwZW5kKCJ0cnVlIik7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIHNiLmFwcGVuZCgiZmFsc2UiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmICh3c0Fubm90ICE9IG51bGwpIHsNCi0gICAgICAgICAgICBzYi5hcHBlbmQobmV3TGluZSk7DQotICAgICAgICAgICAgc2IuYXBwZW5kKCJXZWJTZXJ2aWNlOiAiKTsNCi0gICAgICAgICAgICBzYi5hcHBlbmQod3NBbm5vdC50b1N0cmluZygpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmICh3c3BBbm5vdCAhPSBudWxsKSB7DQotICAgICAgICAgICAgc2IuYXBwZW5kKG5ld0xpbmUpOw0KLSAgICAgICAgICAgIHNiLmFwcGVuZCgiV2ViU2VydmljZVByb3ZpZGVyOiAiKTsNCi0gICAgICAgICAgICBzYi5hcHBlbmQod3NwQW5ub3QudG9TdHJpbmcoKSk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoYnRBbm5vdCAhPSBudWxsKSB7DQotICAgICAgICAgICAgc2IuYXBwZW5kKG5ld0xpbmUpOw0KLSAgICAgICAgICAgIHNiLmFwcGVuZCgiQmluZGluZ1R5cGU6ICIpOw0KLSAgICAgICAgICAgIHNiLmFwcGVuZChidEFubm90LnRvU3RyaW5nKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICBpZiAoaGNBbm5vdCAhPSBudWxsKSB7DQotICAgICAgICAgICAgc2IuYXBwZW5kKG5ld0xpbmUpOw0KLSAgICAgICAgICAgIHNiLmFwcGVuZCgiSGFuZGxlckNoYWluOiAiKTsNCi0gICAgICAgICAgICBzYi5hcHBlbmQoaGNBbm5vdC50b1N0cmluZygpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9SZXF1ZXN0V3JhcHBlckFubm90LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9idWlsZGVyL1JlcXVlc3RXcmFwcGVyQW5ub3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzFiNzU5OC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9idWlsZGVyL1JlcXVlc3RXcmFwcGVyQW5ub3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlcjsKLQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247Ci0KLXB1YmxpYyBjbGFzcyBSZXF1ZXN0V3JhcHBlckFubm90IGltcGxlbWVudHMgamF2YXgueG1sLndzLlJlcXVlc3RXcmFwcGVyIHsKLQotICAgIHByaXZhdGUgU3RyaW5nIGxvY2FsTmFtZTsKLSAgICBwcml2YXRlIFN0cmluZyB0YXJnZXROYW1lc3BhY2U7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgY2xhc3NOYW1lOwotCi0KLSAgICAvKiogQSBSZXF1ZXN0V3JhcHBlckFubm90IGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQuICovCi0gICAgcHJpdmF0ZSBSZXF1ZXN0V3JhcHBlckFubm90KCkgewotCi0gICAgfQotCi0gICAgcHJpdmF0ZSBSZXF1ZXN0V3JhcHBlckFubm90KAotICAgICAgICAgICAgU3RyaW5nIGxvY2FsTmFtZSwKLSAgICAgICAgICAgIFN0cmluZyB0YXJnZXROYW1lc3BhY2UsCi0gICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lKSB7Ci0gICAgICAgIHRoaXMubG9jYWxOYW1lID0gbG9jYWxOYW1lOwotICAgICAgICB0aGlzLnRhcmdldE5hbWVzcGFjZSA9IHRhcmdldE5hbWVzcGFjZTsKLSAgICAgICAgdGhpcy5jbGFzc05hbWUgPSBjbGFzc05hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBSZXF1ZXN0V3JhcHBlckFubm90IGNyZWF0ZVJlcXVlc3RXcmFwcGVyQW5ub3RJbXBsKCkgewotICAgICAgICByZXR1cm4gbmV3IFJlcXVlc3RXcmFwcGVyQW5ub3QoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFJlcXVlc3RXcmFwcGVyQW5ub3QgY3JlYXRlUmVxdWVzdFdyYXBwZXJBbm5vdEltcGwoCi0gICAgICAgICAgICBTdHJpbmcgbG9jYWxOYW1lLAotICAgICAgICAgICAgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSwKLSAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUKLSAgICApIHsKLSAgICAgICAgcmV0dXJuIG5ldyBSZXF1ZXN0V3JhcHBlckFubm90KGxvY2FsTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZSk7Ci0gICAgfQotCi0KLSAgICAvKiogQHJldHVybiBSZXR1cm5zIHRoZSBuYW1lLiAqLwotICAgIHB1YmxpYyBTdHJpbmcgbG9jYWxOYW1lKCkgewotICAgICAgICByZXR1cm4gdGhpcy5sb2NhbE5hbWU7Ci0gICAgfQotCi0gICAgLyoqIEByZXR1cm4gUmV0dXJucyB0aGUgdGFyZ2V0TmFtZXNwYWNlLiAqLwotICAgIHB1YmxpYyBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlKCkgewotICAgICAgICByZXR1cm4gdGhpcy50YXJnZXROYW1lc3BhY2U7Ci0gICAgfQotCi0gICAgLyoqIEByZXR1cm4gUmV0dXJucyB0aGUgd3NkbExvY2F0aW9uLiAqLwotICAgIHB1YmxpYyBTdHJpbmcgY2xhc3NOYW1lKCkgewotICAgICAgICByZXR1cm4gdGhpcy5jbGFzc05hbWU7Ci0gICAgfQotCi0gICAgLyoqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIHRvIHNldC4gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRMb2NhbE5hbWUoU3RyaW5nIGxvY2FsTmFtZSkgewotICAgICAgICB0aGlzLmxvY2FsTmFtZSA9IGxvY2FsTmFtZTsKLSAgICB9Ci0KLSAgICAvKiogQHBhcmFtIHRhcmdldE5hbWVzcGFjZSBUaGUgdGFyZ2V0TmFtZXNwYWNlIHRvIHNldC4gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUYXJnZXROYW1lc3BhY2UoU3RyaW5nIHRhcmdldE5hbWVzcGFjZSkgewotICAgICAgICB0aGlzLnRhcmdldE5hbWVzcGFjZSA9IHRhcmdldE5hbWVzcGFjZTsKLSAgICB9Ci0KLSAgICAvKiogQHBhcmFtIHdzZGxMb2NhdGlvbiBUaGUgd3NkbExvY2F0aW9uIHRvIHNldC4gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc05hbWUoU3RyaW5nIGNsYXNzTmFtZSkgewotICAgICAgICB0aGlzLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTsKLSAgICB9Ci0KLSAgICAvL2htbSwgc2hvdWxkIHdlIHJlYWxseSBkbyB0aGlzCi0gICAgcHVibGljIENsYXNzPEFubm90YXRpb24+IGFubm90YXRpb25UeXBlKCkgewotICAgICAgICByZXR1cm4gQW5ub3RhdGlvbi5jbGFzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIHVuaXQgdGVzdGluZy4gV2Ugd2lsbCBwcmludCBhbGwgb2YgdGhlCi0gICAgICogZGF0YSBtZW1iZXJzIGhlcmUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBTdHJpbmcgbmV3TGluZSA9ICJcbiI7Ci0gICAgICAgIHNiLmFwcGVuZChuZXdMaW5lKTsKLSAgICAgICAgc2IuYXBwZW5kKCJAUmVxdWVzdFdyYXBwZXIubG9jYWxOYW1lPSAiICsgbG9jYWxOYW1lKTsKLSAgICAgICAgc2IuYXBwZW5kKG5ld0xpbmUpOwotICAgICAgICBzYi5hcHBlbmQoIkBSZXF1ZXN0V3JhcHBlci5jbGFzc05hbWU9ICIgKyBjbGFzc05hbWUpOwotICAgICAgICBzYi5hcHBlbmQobmV3TGluZSk7Ci0gICAgICAgIHNiLmFwcGVuZCgiQFJlcXVlc3RXcmFwcGVyLnRhcmdldE5hbWVzcGFjZT0gIiArIHRhcmdldE5hbWVzcGFjZSk7Ci0gICAgICAgIHNiLmFwcGVuZChuZXdMaW5lKTsKLSAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2J1aWxkZXIvUmVzcGVjdEJpbmRpbmdBbm5vdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9SZXNwZWN0QmluZGluZ0Fubm90LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmMTI3YjcuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9SZXNwZWN0QmluZGluZ0Fubm90LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXI7DQotDQotaW1wb3J0IGphdmF4LnhtbC53cy5SZXNwZWN0QmluZGluZzsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi0NCi1wdWJsaWMgY2xhc3MgUmVzcGVjdEJpbmRpbmdBbm5vdCBpbXBsZW1lbnRzIFJlc3BlY3RCaW5kaW5nIHsNCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGVuYWJsZWQgPSB0cnVlOw0KLSAgICANCi0gICAgcHVibGljIGJvb2xlYW4gZW5hYmxlZCgpIHsNCi0gICAgICAgIHJldHVybiBlbmFibGVkOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCBzZXRFbmFibGVkKGJvb2xlYW4gZSkgew0KLSAgICAgICAgZW5hYmxlZCA9IGU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiBhbm5vdGF0aW9uVHlwZSgpIHsNCi0gICAgICAgIHJldHVybiBSZXNwZWN0QmluZGluZy5jbGFzczsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9idWlsZGVyL1Jlc3BvbnNlV3JhcHBlckFubm90LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9idWlsZGVyL1Jlc3BvbnNlV3JhcHBlckFubm90LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2MjY3ZmEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9SZXNwb25zZVdyYXBwZXJBbm5vdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyOwotCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKLQotcHVibGljIGNsYXNzIFJlc3BvbnNlV3JhcHBlckFubm90IGltcGxlbWVudHMgamF2YXgueG1sLndzLlJlc3BvbnNlV3JhcHBlciB7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBsb2NhbE5hbWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlOwotICAgIHByaXZhdGUgU3RyaW5nIGNsYXNzTmFtZTsKLQotCi0gICAgLyoqIEEgUmVzcG9uc2VXcmFwcGVyQW5ub3QgY2Fubm90IGJlIGluc3RhbnRpYXRlZC4gKi8KLSAgICBwcml2YXRlIFJlc3BvbnNlV3JhcHBlckFubm90KCkgewotCi0gICAgfQotCi0gICAgcHJpdmF0ZSBSZXNwb25zZVdyYXBwZXJBbm5vdCgKLSAgICAgICAgICAgIFN0cmluZyBsb2NhbE5hbWUsCi0gICAgICAgICAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlLAotICAgICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSkgewotICAgICAgICB0aGlzLmxvY2FsTmFtZSA9IGxvY2FsTmFtZTsKLSAgICAgICAgdGhpcy50YXJnZXROYW1lc3BhY2UgPSB0YXJnZXROYW1lc3BhY2U7Ci0gICAgICAgIHRoaXMuY2xhc3NOYW1lID0gY2xhc3NOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgUmVzcG9uc2VXcmFwcGVyQW5ub3QgY3JlYXRlUmVzcG9uc2VXcmFwcGVyQW5ub3RJbXBsKCkgewotICAgICAgICByZXR1cm4gbmV3IFJlc3BvbnNlV3JhcHBlckFubm90KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBSZXNwb25zZVdyYXBwZXJBbm5vdCBjcmVhdGVSZXNwb25zZVdyYXBwZXJBbm5vdEltcGwoCi0gICAgICAgICAgICBTdHJpbmcgbG9jYWxOYW1lLAotICAgICAgICAgICAgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSwKLSAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUKLSAgICApIHsKLSAgICAgICAgcmV0dXJuIG5ldyBSZXNwb25zZVdyYXBwZXJBbm5vdChsb2NhbE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZSk7Ci0gICAgfQotCi0KLSAgICAvKiogQHJldHVybiBSZXR1cm5zIHRoZSBuYW1lLiAqLwotICAgIHB1YmxpYyBTdHJpbmcgbG9jYWxOYW1lKCkgewotICAgICAgICByZXR1cm4gdGhpcy5sb2NhbE5hbWU7Ci0gICAgfQotCi0gICAgLyoqIEByZXR1cm4gUmV0dXJucyB0aGUgdGFyZ2V0TmFtZXNwYWNlLiAqLwotICAgIHB1YmxpYyBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlKCkgewotICAgICAgICByZXR1cm4gdGhpcy50YXJnZXROYW1lc3BhY2U7Ci0gICAgfQotCi0gICAgLyoqIEByZXR1cm4gUmV0dXJucyB0aGUgd3NkbExvY2F0aW9uLiAqLwotICAgIHB1YmxpYyBTdHJpbmcgY2xhc3NOYW1lKCkgewotICAgICAgICByZXR1cm4gdGhpcy5jbGFzc05hbWU7Ci0gICAgfQotCi0gICAgLyoqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIHRvIHNldC4gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRMb2NhbE5hbWUoU3RyaW5nIGxvY2FsTmFtZSkgewotICAgICAgICB0aGlzLmxvY2FsTmFtZSA9IGxvY2FsTmFtZTsKLSAgICB9Ci0KLSAgICAvKiogQHBhcmFtIHRhcmdldE5hbWVzcGFjZSBUaGUgdGFyZ2V0TmFtZXNwYWNlIHRvIHNldC4gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUYXJnZXROYW1lc3BhY2UoU3RyaW5nIHRhcmdldE5hbWVzcGFjZSkgewotICAgICAgICB0aGlzLnRhcmdldE5hbWVzcGFjZSA9IHRhcmdldE5hbWVzcGFjZTsKLSAgICB9Ci0KLSAgICAvKiogQHBhcmFtIHdzZGxMb2NhdGlvbiBUaGUgd3NkbExvY2F0aW9uIHRvIHNldC4gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc05hbWUoU3RyaW5nIGNsYXNzTmFtZSkgewotICAgICAgICB0aGlzLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTsKLSAgICB9Ci0KLSAgICAvL2htbSwgc2hvdWxkIHdlIHJlYWxseSBkbyB0aGlzCi0gICAgcHVibGljIENsYXNzPEFubm90YXRpb24+IGFubm90YXRpb25UeXBlKCkgewotICAgICAgICByZXR1cm4gQW5ub3RhdGlvbi5jbGFzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIHVuaXQgdGVzdGluZy4gV2Ugd2lsbCBwcmludCBhbGwgb2YgdGhlCi0gICAgICogZGF0YSBtZW1iZXJzIGhlcmUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBTdHJpbmcgbmV3TGluZSA9ICJcbiI7Ci0gICAgICAgIHNiLmFwcGVuZChuZXdMaW5lKTsKLSAgICAgICAgc2IuYXBwZW5kKCJAUmVzcG9uc2VXcmFwcGVyLmxvY2FsTmFtZT0gIiArIGxvY2FsTmFtZSk7Ci0gICAgICAgIHNiLmFwcGVuZChuZXdMaW5lKTsKLSAgICAgICAgc2IuYXBwZW5kKCJAUmVzcG9uc2VXcmFwcGVyLmNsYXNzTmFtZT0gIiArIGNsYXNzTmFtZSk7Ci0gICAgICAgIHNiLmFwcGVuZChuZXdMaW5lKTsKLSAgICAgICAgc2IuYXBwZW5kKCJAUmVzcG9uc2VXcmFwcGVyLnRhcmdldE5hbWVzcGFjZT0gIiArIHRhcmdldE5hbWVzcGFjZSk7Ci0gICAgICAgIHNiLmFwcGVuZChuZXdMaW5lKTsKLSAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2J1aWxkZXIvU2VydmljZU1vZGVBbm5vdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9TZXJ2aWNlTW9kZUFubm90LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3NGU0YTIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9TZXJ2aWNlTW9kZUFubm90LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlcjsKLQotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247Ci0KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlTW9kZUFubm90IGltcGxlbWVudHMgamF2YXgueG1sLndzLlNlcnZpY2VNb2RlIHsKLQotICAgIHByaXZhdGUgU2VydmljZS5Nb2RlIHZhbHVlID0gU2VydmljZS5Nb2RlLlBBWUxPQUQ7Ci0KLSAgICAvKiogQSBTZXJ2aWNlTW9kZUFubm90IGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQuICovCi0gICAgcHJpdmF0ZSBTZXJ2aWNlTW9kZUFubm90KCkgewotCi0gICAgfQotCi0gICAgcHJpdmF0ZSBTZXJ2aWNlTW9kZUFubm90KFNlcnZpY2UuTW9kZSB2YWx1ZSkgewotICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTZXJ2aWNlTW9kZUFubm90IGNyZWF0ZVdlYlNlcnZpY2VBbm5vdEltcGwoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgU2VydmljZU1vZGVBbm5vdCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU2VydmljZU1vZGVBbm5vdCBjcmVhdGVXZWJTZXJ2aWNlQW5ub3RJbXBsKFNlcnZpY2UuTW9kZSB2YWx1ZSkgewotICAgICAgICByZXR1cm4gbmV3IFNlcnZpY2VNb2RlQW5ub3QodmFsdWUpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFNlcnZpY2VNb2RlQW5ub3QgY3JlYXRlRnJvbUFubm90YXRpb24oQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB7Ci0gICAgICAgIFNlcnZpY2VNb2RlQW5ub3QgcmV0dXJuQW5ub3QgPSBudWxsOwotICAgICAgICBpZiAoYW5ub3RhdGlvbiAhPSBudWxsICYmIGFubm90YXRpb24gaW5zdGFuY2VvZiBqYXZheC54bWwud3MuU2VydmljZU1vZGUpIHsKLSAgICAgICAgICAgIGphdmF4LnhtbC53cy5TZXJ2aWNlTW9kZSBzbSA9IChqYXZheC54bWwud3MuU2VydmljZU1vZGUpIGFubm90YXRpb247Ci0gICAgICAgICAgICByZXR1cm5Bbm5vdCA9IG5ldyBTZXJ2aWNlTW9kZUFubm90KHNtLnZhbHVlKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXR1cm5Bbm5vdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2VydmljZS5Nb2RlIHZhbHVlKCkgewotICAgICAgICByZXR1cm4gdGhpcy52YWx1ZTsKLSAgICB9Ci0KLSAgICAvL2htbSwgc2hvdWxkIHdlIHJlYWxseSBkbyB0aGlzCi0gICAgcHVibGljIENsYXNzPEFubm90YXRpb24+IGFubm90YXRpb25UeXBlKCkgewotICAgICAgICByZXR1cm4gQW5ub3RhdGlvbi5jbGFzczsKLSAgICB9Ci0KLSAgICAvL1NldHRlcnMKLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShTZXJ2aWNlLk1vZGUgdmFsdWUpIHsKLSAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwotICAgIH0KLQotICAgIC8qKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIHVuaXQgdGVzdGluZy4gV2Ugd2lsbCBwcmludCBhbGwgb2YgdGhlIGRhdGEgbWVtYmVycyBoZXJlLiAqLwotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgU3RyaW5nIG5ld0xpbmUgPSAiXG4iOwotICAgICAgICBzYi5hcHBlbmQobmV3TGluZSk7Ci0gICAgICAgIHNiLmFwcGVuZCgiQFNlcnZpY2VNb2RlLnZhbHVlPSAiICsgdmFsdWUudG9TdHJpbmcoKSk7Ci0gICAgICAgIHNiLmFwcGVuZChuZXdMaW5lKTsKLSAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0gICAgfQotCQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9Tb2FwQmluZGluZ0Fubm90LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9idWlsZGVyL1NvYXBCaW5kaW5nQW5ub3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY4ZmQ4Yy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9idWlsZGVyL1NvYXBCaW5kaW5nQW5ub3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlcjsKLQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247Ci0KLXB1YmxpYyBjbGFzcyBTb2FwQmluZGluZ0Fubm90IGltcGxlbWVudHMgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcgewotCi0gICAgcHJpdmF0ZSBTdHlsZSBzdHlsZSA9IFN0eWxlLkRPQ1VNRU5UOwotICAgIHByaXZhdGUgVXNlIHVzZSA9IFVzZS5MSVRFUkFMOwotICAgIHByaXZhdGUgUGFyYW1ldGVyU3R5bGUgcGFyYW1ldGVyU3R5bGUgPSBQYXJhbWV0ZXJTdHlsZS5XUkFQUEVEOwotCi0gICAgLyoqIEEgU29hcEJpbmRpbmdBbm5vdCBjYW5ub3QgYmUgaW5zdGFudGlhdGVkLiAqLwotICAgIHByaXZhdGUgU29hcEJpbmRpbmdBbm5vdCgpIHsKLQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIFNvYXBCaW5kaW5nQW5ub3QoU3R5bGUgc3R5bGUsIFVzZSB1c2UsIFBhcmFtZXRlclN0eWxlIHBhcmFtU3R5bGUpIHsKLSAgICAgICAgdGhpcy5zdHlsZSA9IHN0eWxlOwotICAgICAgICB0aGlzLnVzZSA9IHVzZTsKLSAgICAgICAgdGhpcy5wYXJhbWV0ZXJTdHlsZSA9IHBhcmFtU3R5bGU7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTb2FwQmluZGluZ0Fubm90IGNyZWF0ZVNvYXBCaW5kaW5nQW5ub3RJbXBsKCkgewotICAgICAgICByZXR1cm4gbmV3IFNvYXBCaW5kaW5nQW5ub3QoKTsKLSAgICB9Ci0gICAgcHVibGljIHN0YXRpYyBTb2FwQmluZGluZ0Fubm90IGNyZWF0ZUZyb21Bbm5vdGF0aW9uKEFubm90YXRpb24gYW5ub3RhdGlvbikgewotICAgICAgICBTb2FwQmluZGluZ0Fubm90IHJldHVybkFubm90ID0gbnVsbDsKLSAgICAgICAgaWYgKGFubm90YXRpb24gIT0gbnVsbCAmJiBhbm5vdGF0aW9uIGluc3RhbmNlb2YgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcpIHsKLSAgICAgICAgICAgIGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nIHNiID0gKGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nKSBhbm5vdGF0aW9uOwotICAgICAgICAgICAgcmV0dXJuQW5ub3QgPSBuZXcgU29hcEJpbmRpbmdBbm5vdChzYi5zdHlsZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYi51c2UoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IucGFyYW1ldGVyU3R5bGUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiByZXR1cm5Bbm5vdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3R5bGUgc3R5bGUoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnN0eWxlOwotICAgIH0KLQotICAgIHB1YmxpYyBVc2UgdXNlKCkgewotICAgICAgICByZXR1cm4gdGhpcy51c2U7Ci0gICAgfQotCi0gICAgcHVibGljIFBhcmFtZXRlclN0eWxlIHBhcmFtZXRlclN0eWxlKCkgewotICAgICAgICByZXR1cm4gdGhpcy5wYXJhbWV0ZXJTdHlsZTsKLSAgICB9Ci0KLQotICAgIC8qKiBAcGFyYW0gcGFyYW1ldGVyU3R5bGUgVGhlIHBhcmFtZXRlclN0eWxlIHRvIHNldC4gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJhbWV0ZXJTdHlsZShQYXJhbWV0ZXJTdHlsZSBwYXJhbWV0ZXJTdHlsZSkgewotICAgICAgICB0aGlzLnBhcmFtZXRlclN0eWxlID0gcGFyYW1ldGVyU3R5bGU7Ci0gICAgfQotCi0gICAgLyoqIEBwYXJhbSBzdHlsZSBUaGUgc3R5bGUgdG8gc2V0LiAqLwotICAgIHB1YmxpYyB2b2lkIHNldFN0eWxlKFN0eWxlIHN0eWxlKSB7Ci0gICAgICAgIHRoaXMuc3R5bGUgPSBzdHlsZTsKLSAgICB9Ci0KLSAgICAvKiogQHBhcmFtIHVzZSBUaGUgdXNlIHRvIHNldC4gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRVc2UoVXNlIHVzZSkgewotICAgICAgICB0aGlzLnVzZSA9IHVzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2xhc3M8QW5ub3RhdGlvbj4gYW5ub3RhdGlvblR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBBbm5vdGF0aW9uLmNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgdW5pdCB0ZXN0aW5nLiBXZSB3aWxsIHByaW50IGFsbCBvZiB0aGUKLSAgICAgKiBkYXRhIG1lbWJlcnMgaGVyZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIFN0cmluZyBuZXdMaW5lID0gIlxuIjsKLSAgICAgICAgc2IuYXBwZW5kKG5ld0xpbmUpOwotICAgICAgICBzYi5hcHBlbmQoIkBTT0FQQmluZGluZy5zdHlsZT0gIiArIHN0eWxlLnRvU3RyaW5nKCkpOwotICAgICAgICBzYi5hcHBlbmQoIkBTT0FQQmluZGluZy5wYXJhbWV0ZXJTdHlsZT0gIiArIHBhcmFtZXRlclN0eWxlLnRvU3RyaW5nKCkpOwotICAgICAgICBzYi5hcHBlbmQoIkBTT0FQQmluZGluZy51c2U9ICIgKyB1c2UudG9TdHJpbmcoKSk7Ci0gICAgICAgIHNiLmFwcGVuZChuZXdMaW5lKTsKLSAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9UTUFubm90YXRpb25Db21wb3NpdGUuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2J1aWxkZXIvVE1Bbm5vdGF0aW9uQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyMTQ1MTIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9UTUFubm90YXRpb25Db21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIHdpbGwgYmUgaW1wbGVtZW50ZWQgYnkgdGhlIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBhbmQKLSAqIE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlLiBJdCB3aWxsIGRlY2xhcmUgc2V0dGVycyBmb3IgYW5ub3RhdGlvbiB0eXBlcyB0aGF0IGFyZSBjb21tb24gdG8gVHlwZXMKLSAqIGFuZCBNZXRob2RzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRNQW5ub3RhdGlvbkNvbXBvc2l0ZSB7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTb2FwQmluZGluZ0Fubm90KFNvYXBCaW5kaW5nQW5ub3Qgc2JBbm5vdCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2J1aWxkZXIvVE1GQW5ub3RhdGlvbkNvbXBvc2l0ZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9UTUZBbm5vdGF0aW9uQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkNWM0NWUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9UTUZBbm5vdGF0aW9uQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlcjsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSB3aWxsIGJlIGltcGxlbWVudGVkIGJ5IHRoZSBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUsCi0gKiBNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSwgYW5kIEZpZWxkRGVzY3JpcHRpb25Db21wb2lzdGUuIEl0IHdpbGwgZGVjbGFyZSBzZXR0ZXJzIGZvciBhbm5vdGF0aW9uCi0gKiB0eXBlcyB0aGF0IGFyZSBjb21tb24gdG8gVHlwZXMsIE1ldGhvZHMsIGFuZCBGaWVsZHMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVE1GQW5ub3RhdGlvbkNvbXBvc2l0ZSB7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRIYW5kbGVyQ2hhaW5Bbm5vdChIYW5kbGVyQ2hhaW5Bbm5vdCBoY0Fubm90KTsKLQotICAgIHB1YmxpYyB2b2lkIHNldFdlYlNlcnZpY2VSZWZBbm5vdChXZWJTZXJ2aWNlUmVmQW5ub3Qgd3NyQW5ub3QpOwotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9XZWJFbmRwb2ludEFubm90LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9idWlsZGVyL1dlYkVuZHBvaW50QW5ub3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTViY2Y1Ni4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9idWlsZGVyL1dlYkVuZHBvaW50QW5ub3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyOwotCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKLQotcHVibGljIGNsYXNzIFdlYkVuZHBvaW50QW5ub3QgaW1wbGVtZW50cyBqYXZheC54bWwud3MuV2ViRW5kcG9pbnQgewotCi0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZSA9ICIiOwotCi0gICAgLyoqIEEgV2ViRW5kcG9pbnRBbm5vdCBjYW5ub3QgYmUgaW5zdGFudGlhdGVkLiAqLwotICAgIHByaXZhdGUgV2ViRW5kcG9pbnRBbm5vdChTdHJpbmcgbmFtZSkgewotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIH0KLQotICAgIHByaXZhdGUgV2ViRW5kcG9pbnRBbm5vdCgpIHsKLQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgV2ViRW5kcG9pbnRBbm5vdCBjcmVhdGVXZWJFbmRwb2ludEFubm90SW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBXZWJFbmRwb2ludEFubm90KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBXZWJFbmRwb2ludEFubm90IGNyZWF0ZVdlYkVuZHBvaW50QW5ub3RJbXBsKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHJldHVybiBuZXcgV2ViRW5kcG9pbnRBbm5vdChuYW1lKTsKLSAgICB9Ci0KLSAgICAvKiogQHJldHVybiBSZXR1cm5zIHRoZSBuYW1lLiAqLwotICAgIHB1YmxpYyBTdHJpbmcgbmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotCi0gICAgLyoqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIHRvIHNldC4gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgfQotCi0gICAgLy9obW0sIHNob3VsZCB3ZSByZWFsbHkgZG8gdGhpcwotICAgIHB1YmxpYyBDbGFzczxBbm5vdGF0aW9uPiBhbm5vdGF0aW9uVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIEFubm90YXRpb24uY2xhc3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciB1bml0IHRlc3RpbmcuIFdlIHdpbGwgcHJpbnQgYWxsIG9mIHRoZQotICAgICAqIGRhdGEgbWVtYmVycyBoZXJlLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgU3RyaW5nIG5ld0xpbmUgPSAiXG4iOwotICAgICAgICBzYi5hcHBlbmQobmV3TGluZSk7Ci0gICAgICAgIHNiLmFwcGVuZCgiQFdlYkVuZHBvaW50Lm5hbWU9ICIgKyBuYW1lKTsKLSAgICAgICAgc2IuYXBwZW5kKG5ld0xpbmUpOwotICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9idWlsZGVyL1dlYkZhdWx0QW5ub3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2J1aWxkZXIvV2ViRmF1bHRBbm5vdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWJlNzgxLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2J1aWxkZXIvV2ViRmF1bHRBbm5vdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXI7Ci0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOwotCi1wdWJsaWMgY2xhc3MgV2ViRmF1bHRBbm5vdCBpbXBsZW1lbnRzIGphdmF4LnhtbC53cy5XZWJGYXVsdCB7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBuYW1lID0gInJldHVybiI7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0gIiI7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgZmF1bHRCZWFuID0gIiI7Ci0KLSAgICAvKiogQSBXZWJGYXVsdEFubm90IGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQuICovCi0gICAgcHJpdmF0ZSBXZWJGYXVsdEFubm90KCkgewotCi0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBXZWJGYXVsdEFubm90IGNyZWF0ZVdlYkZhdWx0QW5ub3RJbXBsKCkgewotICAgICAgICByZXR1cm4gbmV3IFdlYkZhdWx0QW5ub3QoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlICduYW1lJwotICAgICAqCi0gICAgICogQHJldHVybiBTdHJpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIG5hbWUoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLm5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB0YXJnZXROYW1lc3BhY2UoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnRhcmdldE5hbWVzcGFjZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGZhdWx0QmVhbigpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuZmF1bHRCZWFuOwotICAgIH0KLQotICAgIC8qKiBAcGFyYW0gZmF1bHRCZWFuIFRoZSBmYXVsdEJlYW4gdG8gc2V0LiAqLwotICAgIHB1YmxpYyB2b2lkIHNldEZhdWx0QmVhbihTdHJpbmcgZmF1bHRCZWFuKSB7Ci0gICAgICAgIHRoaXMuZmF1bHRCZWFuID0gZmF1bHRCZWFuOwotICAgIH0KLQotICAgIC8qKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSB0byBzZXQuICovCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIH0KLQotICAgIC8qKiBAcGFyYW0gdGFyZ2V0TmFtZXNwYWNlIFRoZSB0YXJnZXROYW1lc3BhY2UgdG8gc2V0LiAqLwotICAgIHB1YmxpYyB2b2lkIHNldFRhcmdldE5hbWVzcGFjZShTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlKSB7Ci0gICAgICAgIHRoaXMudGFyZ2V0TmFtZXNwYWNlID0gdGFyZ2V0TmFtZXNwYWNlOwotICAgIH0KLQotICAgIHB1YmxpYyBDbGFzczxBbm5vdGF0aW9uPiBhbm5vdGF0aW9uVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIEFubm90YXRpb24uY2xhc3M7Ci0gICAgfQotCi0gICAgLyoqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgdW5pdCB0ZXN0aW5nLiBXZSB3aWxsIHByaW50IGFsbCBvZiB0aGUgZGF0YSBtZW1iZXJzIGhlcmUuICovCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBTdHJpbmcgbmV3TGluZSA9ICJcbiI7Ci0gICAgICAgIHNiLmFwcGVuZChuZXdMaW5lKTsKLSAgICAgICAgc2IuYXBwZW5kKCJAV2ViRmF1bHQubmFtZT0gIiArIG5hbWUpOwotICAgICAgICBzYi5hcHBlbmQobmV3TGluZSk7Ci0gICAgICAgIHNiLmFwcGVuZCgiQFdlYkZhdWx0LmZhdWx0QmVhbj0gIiArIGZhdWx0QmVhbik7Ci0gICAgICAgIHNiLmFwcGVuZChuZXdMaW5lKTsKLSAgICAgICAgc2IuYXBwZW5kKCJAV2ViRmF1bHQudGFyZ2V0TmFtZXNwYWNlPSAiICsgdGFyZ2V0TmFtZXNwYWNlKTsKLSAgICAgICAgc2IuYXBwZW5kKG5ld0xpbmUpOwotICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2J1aWxkZXIvV2ViTWV0aG9kQW5ub3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2J1aWxkZXIvV2ViTWV0aG9kQW5ub3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY2YjBmOS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9idWlsZGVyL1dlYk1ldGhvZEFubm90LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlcjsKLQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247Ci0KLXB1YmxpYyBjbGFzcyBXZWJNZXRob2RBbm5vdCBpbXBsZW1lbnRzIGphdmF4Lmp3cy5XZWJNZXRob2QgewotCi0gICAgcHJpdmF0ZSBTdHJpbmcgb3BlcmF0aW9uTmFtZSA9ICIiOwotICAgIHByaXZhdGUgU3RyaW5nIGFjdGlvbiA9ICIiOwotICAgIHByaXZhdGUgYm9vbGVhbiBleGNsdWRlID0gZmFsc2U7Ci0KLSAgICAvKiogQSBXZWJNZXRob2RBbm5vdCBjYW5ub3QgYmUgaW5zdGFudGlhdGVkLiAqLwotICAgIHByaXZhdGUgV2ViTWV0aG9kQW5ub3QoKSB7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFdlYk1ldGhvZEFubm90IGNyZWF0ZVdlYk1ldGhvZEFubm90SW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBXZWJNZXRob2RBbm5vdCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgb3BlcmF0aW9uTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMub3BlcmF0aW9uTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGFjdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuYWN0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGV4Y2x1ZGUoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmV4Y2x1ZGU7Ci0gICAgfQotCi0gICAgLyoqIEBwYXJhbSBhY3Rpb24gVGhlIGFjdGlvbiB0byBzZXQuICovCi0gICAgcHVibGljIHZvaWQgc2V0QWN0aW9uKFN0cmluZyBhY3Rpb24pIHsKLSAgICAgICAgdGhpcy5hY3Rpb24gPSBhY3Rpb247Ci0gICAgfQotCi0gICAgLyoqIEBwYXJhbSBleGNsdWRlIFRoZSBleGNsdWRlIHRvIHNldC4gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRFeGNsdWRlKGJvb2xlYW4gZXhjbHVkZSkgewotICAgICAgICB0aGlzLmV4Y2x1ZGUgPSBleGNsdWRlOwotICAgIH0KLQotICAgIC8qKiBAcGFyYW0gb3BlcmF0aW9uTmFtZSBUaGUgb3BlcmF0aW9uTmFtZSB0byBzZXQuICovCi0gICAgcHVibGljIHZvaWQgc2V0T3BlcmF0aW9uTmFtZShTdHJpbmcgb3BlcmF0aW9uTmFtZSkgewotICAgICAgICB0aGlzLm9wZXJhdGlvbk5hbWUgPSBvcGVyYXRpb25OYW1lOwotICAgIH0KLQotICAgIC8vaG1tLCBzaG91bGQgd2UgcmVhbGx5IGRvIHRoaXMKLSAgICBwdWJsaWMgQ2xhc3M8QW5ub3RhdGlvbj4gYW5ub3RhdGlvblR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBBbm5vdGF0aW9uLmNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgdW5pdCB0ZXN0aW5nLiBXZSB3aWxsIHByaW50IGFsbCBvZiB0aGUKLSAgICAgKiBkYXRhIG1lbWJlcnMgaGVyZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIFN0cmluZyBuZXdMaW5lID0gIlxuIjsKLSAgICAgICAgc2IuYXBwZW5kKG5ld0xpbmUpOwotICAgICAgICBzYi5hcHBlbmQoIkBXZWJNZXRob2Qub3BlcmF0aW9uTmFtZT0gIiArIG9wZXJhdGlvbk5hbWUpOwotICAgICAgICBzYi5hcHBlbmQobmV3TGluZSk7Ci0gICAgICAgIHNiLmFwcGVuZCgiQFdlYk1ldGhvZC5hY3Rpb249ICIgKyBhY3Rpb24pOwotICAgICAgICBzYi5hcHBlbmQobmV3TGluZSk7Ci0gICAgICAgIHNiLmFwcGVuZCgiQFdlYk1ldGhvZC5leGNsdWRlID0gIik7Ci0gICAgICAgIGlmIChleGNsdWRlKSB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoInRydWUiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgiZmFsc2UiKTsKLSAgICAgICAgfQotICAgICAgICBzYi5hcHBlbmQobmV3TGluZSk7Ci0gICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9XZWJQYXJhbUFubm90LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9idWlsZGVyL1dlYlBhcmFtQW5ub3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODYzMTY2ZC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9idWlsZGVyL1dlYlBhcmFtQW5ub3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlcjsKLQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247Ci0KLXB1YmxpYyBjbGFzcyBXZWJQYXJhbUFubm90IGltcGxlbWVudHMgamF2YXguandzLldlYlBhcmFtIHsKLQotICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlOwotICAgIHByaXZhdGUgTW9kZSBtb2RlID0gTW9kZS5JTjsKLSAgICBwcml2YXRlIGJvb2xlYW4gaGVhZGVyOwotICAgIHByaXZhdGUgU3RyaW5nIHBhcnROYW1lOwotCi0gICAgLyoqIEEgV2ViUGFyYW1Bbm5vdCBjYW5ub3QgYmUgaW5zdGFudGlhdGVkLiAqLwotICAgIHByaXZhdGUgV2ViUGFyYW1Bbm5vdCgpIHsKLQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgV2ViUGFyYW1Bbm5vdCBjcmVhdGVXZWJQYXJhbUFubm90SW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBXZWJQYXJhbUFubm90KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSAnbmFtZScKLSAgICAgKgotICAgICAqIEByZXR1cm4gU3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBuYW1lKCkgewotICAgICAgICByZXR1cm4gdGhpcy5uYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlKCkgewotICAgICAgICByZXR1cm4gdGhpcy50YXJnZXROYW1lc3BhY2U7Ci0gICAgfQotCi0gICAgcHVibGljIE1vZGUgbW9kZSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMubW9kZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBoZWFkZXIoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmhlYWRlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHBhcnROYW1lKCkgewotICAgICAgICByZXR1cm4gdGhpcy5wYXJ0TmFtZTsKLSAgICB9Ci0KLSAgICAvKiogQHBhcmFtIG5hbWUgVGhlIG5hbWUgdG8gc2V0LiAqLwotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB9Ci0KLSAgICAvKiogQHBhcmFtIHRhcmdldE5hbWVzcGFjZSBUaGUgdGFyZ2V0TmFtZXNwYWNlIHRvIHNldC4gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUYXJnZXROYW1lc3BhY2UoU3RyaW5nIHRhcmdldE5hbWVzcGFjZSkgewotICAgICAgICB0aGlzLnRhcmdldE5hbWVzcGFjZSA9IHRhcmdldE5hbWVzcGFjZTsKLSAgICB9Ci0KLSAgICAvKiogQHBhcmFtIG1vZGUgVGhlIG1vZGUgdG8gc2V0LiAqLwotICAgIHB1YmxpYyB2b2lkIHNldE1vZGUoTW9kZSBtb2RlKSB7Ci0gICAgICAgIHRoaXMubW9kZSA9IG1vZGU7Ci0gICAgfQotCi0gICAgLyoqIEBwYXJhbSBoZWFkZXIgVGhlIGhlYWRlciB0byBzZXQuICovCi0gICAgcHVibGljIHZvaWQgc2V0SGVhZGVyKGJvb2xlYW4gaGVhZGVyKSB7Ci0gICAgICAgIHRoaXMuaGVhZGVyID0gaGVhZGVyOwotICAgIH0KLQotICAgIC8qKiBAcGFyYW0gcGFydE5hbWUgVGhlIHBhcnROYW1lIHRvIHNldC4gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJ0TmFtZShTdHJpbmcgcGFydE5hbWUpIHsKLSAgICAgICAgdGhpcy5wYXJ0TmFtZSA9IHBhcnROYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBDbGFzczxBbm5vdGF0aW9uPiBhbm5vdGF0aW9uVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIEFubm90YXRpb24uY2xhc3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciB1bml0IHRlc3RpbmcuIFdlIHdpbGwgcHJpbnQgYWxsIG9mIHRoZQotICAgICAqIGRhdGEgbWVtYmVycyBoZXJlLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgU3RyaW5nIG5ld0xpbmUgPSAiXG4iOwotICAgICAgICBzYi5hcHBlbmQobmV3TGluZSk7Ci0gICAgICAgIHNiLmFwcGVuZCgiQFdlYlBhcmFtLm5hbWU9ICIgKyBuYW1lKTsKLSAgICAgICAgc2IuYXBwZW5kKG5ld0xpbmUpOwotICAgICAgICBzYi5hcHBlbmQoIkBXZWJQYXJhbS5wYXJ0TmFtZT0gIiArIHBhcnROYW1lKTsKLSAgICAgICAgc2IuYXBwZW5kKG5ld0xpbmUpOwotICAgICAgICBzYi5hcHBlbmQoIkBXZWJQYXJhbS5tb2RlID0gIiArIG1vZGUudG9TdHJpbmcoKSk7Ci0gICAgICAgIHNiLmFwcGVuZChuZXdMaW5lKTsKLSAgICAgICAgc2IuYXBwZW5kKCJAV2ViUGFyYW0udGFyZ2V0TmFtZXNwYWNlPSAiICsgdGFyZ2V0TmFtZXNwYWNlKTsKLSAgICAgICAgc2IuYXBwZW5kKG5ld0xpbmUpOwotICAgICAgICBzYi5hcHBlbmQoIkBXZWJQYXJhbS5oZWFkZXI9ICIpOwotICAgICAgICBpZiAoaGVhZGVyKSB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoInRydWUiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgiZmFsc2UiKTsKLSAgICAgICAgfQotICAgICAgICBzYi5hcHBlbmQobmV3TGluZSk7Ci0gICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9XZWJSZXN1bHRBbm5vdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9XZWJSZXN1bHRBbm5vdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiN2U3MDY1Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2J1aWxkZXIvV2ViUmVzdWx0QW5ub3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlcjsKLQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247Ci0KLXB1YmxpYyBjbGFzcyBXZWJSZXN1bHRBbm5vdCBpbXBsZW1lbnRzIGphdmF4Lmp3cy5XZWJSZXN1bHQgewotCi0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZSA9ICIiOwotICAgIHByaXZhdGUgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9ICIiOwotICAgIHByaXZhdGUgYm9vbGVhbiBoZWFkZXIgPSBmYWxzZTsKLSAgICBwcml2YXRlIFN0cmluZyBwYXJ0TmFtZSA9ICIiOwotCi0gICAgLyoqIEEgV2ViUmVzdWx0QW5ub3QgY2Fubm90IGJlIGluc3RhbnRpYXRlZC4gKi8KLSAgICBwcml2YXRlIFdlYlJlc3VsdEFubm90KCkgewotCi0gICAgfQotCi0gICAgLyoqIEByZXR1cm4gUmV0dXJucyBhbiBpbnN0YW5jZSBvZiBXZWJSZXN1bHRBbm5vdC4gKi8KLSAgICBwdWJsaWMgc3RhdGljIFdlYlJlc3VsdEFubm90IGNyZWF0ZVdlYlJlc3VsdEFubm90SW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBXZWJSZXN1bHRBbm5vdCgpOwotICAgIH0KLQotICAgIC8qKiBAcmV0dXJuIFJldHVybnMgdGhlIGhlYWRlci4gKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBoZWFkZXIoKSB7Ci0gICAgICAgIHJldHVybiBoZWFkZXI7Ci0gICAgfQotCi0gICAgLyoqIEByZXR1cm4gUmV0dXJucyB0aGUgbmFtZS4gKi8KLSAgICBwdWJsaWMgU3RyaW5nIG5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLQotICAgIC8qKiBAcmV0dXJuIFJldHVybnMgdGhlIHBhcnROYW1lLiAqLwotICAgIHB1YmxpYyBTdHJpbmcgcGFydE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBwYXJ0TmFtZTsKLSAgICB9Ci0KLSAgICAvKiogQHJldHVybiBSZXR1cm5zIHRoZSB0YXJnZXROYW1lc3BhY2UuICovCi0gICAgcHVibGljIFN0cmluZyB0YXJnZXROYW1lc3BhY2UoKSB7Ci0gICAgICAgIHJldHVybiB0YXJnZXROYW1lc3BhY2U7Ci0gICAgfQotCi0gICAgLyoqIEBwYXJhbSBoZWFkZXIgVGhlIGhlYWRlciB0byBzZXQuICovCi0gICAgcHVibGljIHZvaWQgc2V0SGVhZGVyKGJvb2xlYW4gaGVhZGVyKSB7Ci0gICAgICAgIHRoaXMuaGVhZGVyID0gaGVhZGVyOwotICAgIH0KLQotICAgIC8qKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSB0byBzZXQuICovCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIH0KLQotICAgIC8qKiBAcGFyYW0gcGFydE5hbWUgVGhlIHBhcnROYW1lIHRvIHNldC4gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJ0TmFtZShTdHJpbmcgcGFydE5hbWUpIHsKLSAgICAgICAgdGhpcy5wYXJ0TmFtZSA9IHBhcnROYW1lOwotICAgIH0KLQotICAgIC8qKiBAcGFyYW0gdGFyZ2V0TmFtZXNwYWNlIFRoZSB0YXJnZXROYW1lc3BhY2UgdG8gc2V0LiAqLwotICAgIHB1YmxpYyB2b2lkIHNldFRhcmdldE5hbWVzcGFjZShTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlKSB7Ci0gICAgICAgIHRoaXMudGFyZ2V0TmFtZXNwYWNlID0gdGFyZ2V0TmFtZXNwYWNlOwotICAgIH0KLQotICAgIHB1YmxpYyBDbGFzczxBbm5vdGF0aW9uPiBhbm5vdGF0aW9uVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIEFubm90YXRpb24uY2xhc3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciB1bml0IHRlc3RpbmcuIFdlIHdpbGwgcHJpbnQgYWxsIG9mIHRoZQotICAgICAqIGRhdGEgbWVtYmVycyBoZXJlLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgU3RyaW5nIG5ld0xpbmUgPSAiXG4iOwotICAgICAgICBzYi5hcHBlbmQobmV3TGluZSk7Ci0gICAgICAgIHNiLmFwcGVuZCgiQFdlYlJlc3VsdC5uYW1lPSAiICsgbmFtZSk7Ci0gICAgICAgIHNiLmFwcGVuZChuZXdMaW5lKTsKLSAgICAgICAgc2IuYXBwZW5kKCJAV2ViUmVzdWx0LnBhcnROYW1lPSAiICsgcGFydE5hbWUpOwotICAgICAgICBzYi5hcHBlbmQobmV3TGluZSk7Ci0gICAgICAgIHNiLmFwcGVuZCgiQFdlYlJlc3VsdC50YXJnZXROYW1lc3BhY2U9ICIgKyB0YXJnZXROYW1lc3BhY2UpOwotICAgICAgICBzYi5hcHBlbmQobmV3TGluZSk7Ci0gICAgICAgIHNiLmFwcGVuZCgiQFdlYlJlc3VsdC5oZWFkZXI9ICIpOwotICAgICAgICBpZiAoaGVhZGVyKSB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoInRydWUiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgiZmFsc2UiKTsKLSAgICAgICAgfQotICAgICAgICBzYi5hcHBlbmQobmV3TGluZSk7Ci0gICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9XZWJTZXJ2aWNlQW5ub3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2J1aWxkZXIvV2ViU2VydmljZUFubm90LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjYTViNTcuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9XZWJTZXJ2aWNlQW5ub3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlcjsKLQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247Ci0KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlQW5ub3QgaW1wbGVtZW50cyBqYXZheC5qd3MuV2ViU2VydmljZSB7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBuYW1lID0gIiI7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0gIiI7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgc2VydmljZU5hbWUgPSAiIjsKLSAgICBwcml2YXRlIFN0cmluZyB3c2RsTG9jYXRpb24gPSAiIjsKLSAgICBwcml2YXRlIFN0cmluZyBlbmRwb2ludEludGVyZmFjZSA9ICIiOwotICAgIHByaXZhdGUgU3RyaW5nIHBvcnROYW1lID0gIiI7Ci0KLSAgICAvKiogQSBXZWJTZXJ2aWNlQW5ub3QgY2Fubm90IGJlIGluc3RhbnRpYXRlZC4gKi8KLSAgICBwcml2YXRlIFdlYlNlcnZpY2VBbm5vdCgpIHsKLQotICAgIH0KLQotICAgIHByaXZhdGUgV2ViU2VydmljZUFubm90KAotICAgICAgICAgICAgU3RyaW5nIG5hbWUsCi0gICAgICAgICAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlLAotICAgICAgICAgICAgU3RyaW5nIHNlcnZpY2VOYW1lLAotICAgICAgICAgICAgU3RyaW5nIHdzZGxMb2NhdGlvbiwKLSAgICAgICAgICAgIFN0cmluZyBlbmRwb2ludEludGVyZmFjZSwKLSAgICAgICAgICAgIFN0cmluZyBwb3J0TmFtZSkgewotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgICAgICB0aGlzLnRhcmdldE5hbWVzcGFjZSA9IHRhcmdldE5hbWVzcGFjZTsKLSAgICAgICAgdGhpcy5zZXJ2aWNlTmFtZSA9IHNlcnZpY2VOYW1lOwotICAgICAgICB0aGlzLndzZGxMb2NhdGlvbiA9IHdzZGxMb2NhdGlvbjsKLSAgICAgICAgdGhpcy5lbmRwb2ludEludGVyZmFjZSA9IGVuZHBvaW50SW50ZXJmYWNlOwotICAgICAgICB0aGlzLnBvcnROYW1lID0gcG9ydE5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBXZWJTZXJ2aWNlQW5ub3QgY3JlYXRlV2ViU2VydmljZUFubm90SW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBXZWJTZXJ2aWNlQW5ub3QoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFdlYlNlcnZpY2VBbm5vdCBjcmVhdGVXZWJTZXJ2aWNlQW5ub3RJbXBsKAotICAgICAgICAgICAgU3RyaW5nIG5hbWUsCi0gICAgICAgICAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlLAotICAgICAgICAgICAgU3RyaW5nIHNlcnZpY2VOYW1lLAotICAgICAgICAgICAgU3RyaW5nIHdzZGxMb2NhdGlvbiwKLSAgICAgICAgICAgIFN0cmluZyBlbmRwb2ludEludGVyZmFjZSwKLSAgICAgICAgICAgIFN0cmluZyBwb3J0TmFtZQotICAgICkgewotICAgICAgICByZXR1cm4gbmV3IFdlYlNlcnZpY2VBbm5vdChuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXROYW1lc3BhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c2RsTG9jYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZHBvaW50SW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0TmFtZSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgV2ViU2VydmljZUFubm90IGNyZWF0ZUZyb21Bbm5vdGF0aW9uKEFubm90YXRpb24gYW5ub3RhdGlvbikgewotICAgICAgICBXZWJTZXJ2aWNlQW5ub3QgcmV0dXJuQW5ub3QgPSBudWxsOwotICAgICAgICBpZiAoYW5ub3RhdGlvbiAhPSBudWxsICYmIGFubm90YXRpb24gaW5zdGFuY2VvZiBqYXZheC5qd3MuV2ViU2VydmljZSkgewotICAgICAgICAgICAgamF2YXguandzLldlYlNlcnZpY2Ugd3MgPSAoamF2YXguandzLldlYlNlcnZpY2UpIGFubm90YXRpb247Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFdlYlNlcnZpY2VBbm5vdCh3cy5uYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cy50YXJnZXROYW1lc3BhY2UoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzLnNlcnZpY2VOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cy53c2RsTG9jYXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzLmVuZHBvaW50SW50ZXJmYWNlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cy5wb3J0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldHVybkFubm90OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgbmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMubmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMudGFyZ2V0TmFtZXNwYWNlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgc2VydmljZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnNlcnZpY2VOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgd3NkbExvY2F0aW9uKCkgewotICAgICAgICByZXR1cm4gdGhpcy53c2RsTG9jYXRpb247Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBlbmRwb2ludEludGVyZmFjZSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuZW5kcG9pbnRJbnRlcmZhY2U7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBwb3J0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucG9ydE5hbWU7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgQ2xhc3M8QW5ub3RhdGlvbj4gYW5ub3RhdGlvblR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBBbm5vdGF0aW9uLmNsYXNzOwotICAgIH0KLQotICAgIC8vU2V0dGVycwotCi0gICAgLyoqIEBwYXJhbSBlbmRwb2ludEludGVyZmFjZSBUaGUgZW5kcG9pbnRJbnRlcmZhY2UgdG8gc2V0LiAqLwotICAgIHB1YmxpYyB2b2lkIHNldEVuZHBvaW50SW50ZXJmYWNlKFN0cmluZyBlbmRwb2ludEludGVyZmFjZSkgewotICAgICAgICB0aGlzLmVuZHBvaW50SW50ZXJmYWNlID0gZW5kcG9pbnRJbnRlcmZhY2U7Ci0gICAgfQotCi0gICAgLyoqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIHRvIHNldC4gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgfQotCi0gICAgLyoqIEBwYXJhbSBwb3J0TmFtZSBUaGUgcG9ydE5hbWUgdG8gc2V0LiAqLwotICAgIHB1YmxpYyB2b2lkIHNldFBvcnROYW1lKFN0cmluZyBwb3J0TmFtZSkgewotICAgICAgICB0aGlzLnBvcnROYW1lID0gcG9ydE5hbWU7Ci0gICAgfQotCi0gICAgLyoqIEBwYXJhbSBzZXJ2aWNlTmFtZSBUaGUgc2VydmljZU5hbWUgdG8gc2V0LiAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VOYW1lKFN0cmluZyBzZXJ2aWNlTmFtZSkgewotICAgICAgICB0aGlzLnNlcnZpY2VOYW1lID0gc2VydmljZU5hbWU7Ci0gICAgfQotCi0gICAgLyoqIEBwYXJhbSB0YXJnZXROYW1lc3BhY2UgVGhlIHRhcmdldE5hbWVzcGFjZSB0byBzZXQuICovCi0gICAgcHVibGljIHZvaWQgc2V0VGFyZ2V0TmFtZXNwYWNlKFN0cmluZyB0YXJnZXROYW1lc3BhY2UpIHsKLSAgICAgICAgdGhpcy50YXJnZXROYW1lc3BhY2UgPSB0YXJnZXROYW1lc3BhY2U7Ci0gICAgfQotCi0gICAgLyoqIEBwYXJhbSB3c2RsTG9jYXRpb24gVGhlIHdzZGxMb2NhdGlvbiB0byBzZXQuICovCi0gICAgcHVibGljIHZvaWQgc2V0V3NkbExvY2F0aW9uKFN0cmluZyB3c2RsTG9jYXRpb24pIHsKLSAgICAgICAgdGhpcy53c2RsTG9jYXRpb24gPSB3c2RsTG9jYXRpb247Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIHVuaXQgdGVzdGluZy4gV2Ugd2lsbCBwcmludCBhbGwgb2YgdGhlCi0gICAgICogZGF0YSBtZW1iZXJzIGhlcmUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBTdHJpbmcgbmV3TGluZSA9ICJcbiI7Ci0gICAgICAgIHNiLmFwcGVuZChuZXdMaW5lKTsKLSAgICAgICAgc2IuYXBwZW5kKCJAV2ViU2VydmljZS5uYW1lPSAiICsgbmFtZSk7Ci0gICAgICAgIHNiLmFwcGVuZChuZXdMaW5lKTsKLSAgICAgICAgc2IuYXBwZW5kKCJAV2ViU2VydmljZS5zZXJ2aWNlTmFtZT0gIiArIHNlcnZpY2VOYW1lKTsKLSAgICAgICAgc2IuYXBwZW5kKG5ld0xpbmUpOwotICAgICAgICBzYi5hcHBlbmQoIkBXZWJTZXJ2aWNlLmVuZHBvaW50SW50ZXJmYWNlPSAiICsgZW5kcG9pbnRJbnRlcmZhY2UpOwotICAgICAgICBzYi5hcHBlbmQobmV3TGluZSk7Ci0gICAgICAgIHNiLmFwcGVuZCgiQFdlYlNlcnZpY2UudGFyZ2V0TmFtZXNwYWNlPSAiICsgdGFyZ2V0TmFtZXNwYWNlKTsKLSAgICAgICAgc2IuYXBwZW5kKG5ld0xpbmUpOwotICAgICAgICBzYi5hcHBlbmQoIkBXZWJTZXJ2aWNlLndzZGxMb2NhdGlvbj0gIiArIHdzZGxMb2NhdGlvbik7Ci0gICAgICAgIHNiLmFwcGVuZChuZXdMaW5lKTsKLSAgICAgICAgc2IuYXBwZW5kKCJAV2ViU2VydmljZS5wb3J0TmFtZT0gIiArIHBvcnROYW1lKTsKLSAgICAgICAgc2IuYXBwZW5kKG5ld0xpbmUpOwotICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9idWlsZGVyL1dlYlNlcnZpY2VDbGllbnRBbm5vdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9XZWJTZXJ2aWNlQ2xpZW50QW5ub3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA0ZmY3Yi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9idWlsZGVyL1dlYlNlcnZpY2VDbGllbnRBbm5vdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5FeGNlcHRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaTE4bi5NZXNzYWdlczsKLQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247Ci0KLQotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VDbGllbnRBbm5vdCBpbXBsZW1lbnRzIGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlQ2xpZW50IHsKLQotICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlOwotICAgIHByaXZhdGUgU3RyaW5nIHdzZGxMb2NhdGlvbjsKLQotICAgIC8qKiBBIFdlYlNlcnZpY2VDbGllbnRBbm5vdCBjYW5ub3QgYmUgaW5zdGFudGlhdGVkLiAqLwotICAgIHByaXZhdGUgV2ViU2VydmljZUNsaWVudEFubm90KCkgewotCi0gICAgfQotCi0gICAgcHJpdmF0ZSBXZWJTZXJ2aWNlQ2xpZW50QW5ub3QoCi0gICAgICAgICAgICBTdHJpbmcgbmFtZSwKLSAgICAgICAgICAgIFN0cmluZyB0YXJnZXROYW1lc3BhY2UsCi0gICAgICAgICAgICBTdHJpbmcgd3NkbExvY2F0aW9uKSB7Ci0gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgICAgIHRoaXMudGFyZ2V0TmFtZXNwYWNlID0gdGFyZ2V0TmFtZXNwYWNlOwotICAgICAgICB0aGlzLndzZGxMb2NhdGlvbiA9IHdzZGxMb2NhdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFdlYlNlcnZpY2VDbGllbnRBbm5vdCBjcmVhdGVXZWJTZXJ2aWNlQ2xpZW50QW5ub3RJbXBsKCkgewotICAgICAgICByZXR1cm4gbmV3IFdlYlNlcnZpY2VDbGllbnRBbm5vdCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgV2ViU2VydmljZUNsaWVudEFubm90IGNyZWF0ZVdlYlNlcnZpY2VDbGllbnRBbm5vdEltcGwoCi0gICAgICAgICAgICBTdHJpbmcgbmFtZSwKLSAgICAgICAgICAgIFN0cmluZyB0YXJnZXROYW1lc3BhY2UsCi0gICAgICAgICAgICBTdHJpbmcgd3NkbExvY2F0aW9uCi0gICAgKSB7Ci0gICAgICAgIHJldHVybiBuZXcgV2ViU2VydmljZUNsaWVudEFubm90KG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NkbExvY2F0aW9uKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhpcyBhbm5vdGF0aW9uIHVzaW5nIHRoZSB2YWx1ZXMgZnJvbSB0aGUgYW5ub3RhdGlvbiBpbnN0YW5jZQotICAgICAqIHBhc3NlZCBpbi4gCi0gICAgICogCi0gICAgICogQHBhcmFtIGFubm90YXRpb24gVXNlIHRoZSB2YWx1ZXMgdG8gY3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIGFubm90YXRpb24uICBOb3RlIHRoaXMgY291bGQKLSAgICAgKiBiZSBhbiBpbnN0YW5jZSBvZiB0aGUgamF2YSBhbm5vdGF0aW9uIHN1cGVyY2xhc3MgYXMgd2VsbC4KLSAgICAgKiBAcmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgYW5ub3RhdGlvbiBvciBudWxsIGlmIG9uZSBjb3VsZCBub3QgYmUgY3JlYXRlZCB3aXRoIHRoZQotICAgICAqIGFubm90YXRpb24gcGFzc2VkIGluLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgV2ViU2VydmljZUNsaWVudEFubm90IGNyZWF0ZUZyb21Bbm5vdGF0aW9uKEFubm90YXRpb24gYW5ub3RhdGlvbikgewotICAgICAgICBXZWJTZXJ2aWNlQ2xpZW50QW5ub3QgcmV0dXJuQW5ub3QgPSBudWxsOwotICAgICAgICBpZiAoYW5ub3RhdGlvbiAhPSBudWxsICYmIGFubm90YXRpb24gaW5zdGFuY2VvZiBqYXZheC54bWwud3MuV2ViU2VydmljZUNsaWVudCkgewotICAgICAgICAgICAgamF2YXgueG1sLndzLldlYlNlcnZpY2VDbGllbnQgd3NjID0gKGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlQ2xpZW50KSBhbm5vdGF0aW9uOwotICAgICAgICAgICAgcmV0dXJuQW5ub3QgPSBuZXcgV2ViU2VydmljZUNsaWVudEFubm90KHdzYy5uYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NjLnRhcmdldE5hbWVzcGFjZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzYy53c2RsTG9jYXRpb24oKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldHVybkFubm90OwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBhbm5vdGF0aW9uIHVzaW5nIHRoZSB2YWx1ZXMgZnJvbSB0aGUgdHdvIGFubm90YXRpb25zIHBhc3NlZAotICAgICAqIGluIGFzIGFyZ3VtZW50cy4gIElmIGVpdGhlciBpcyBudWxsLCB0aGUgbmV3IGFubm90YXRpb24gaXMgY3JlYXRlZCB3aXRoIHRoZSBub24tbnVsbCAKLSAgICAgKiBhbm5vdGF0aW9uJ3MgdmFsdWVzLiAgSWYgYm90aCBhcmUgbnVsbCwgdGhlbiBubyBhbm5vdGF0aW9uIGlzIGNyZWF0ZWQuICBOb24tZW1wdHkgdmFsdWVzIGluIAotICAgICAqIHRoZSBzcGFyc2UgYW5ub3RhdGlvbiAoaWYgYW55KSB3aWxsIG92ZXJyaWRlIHRoZSB2YWx1ZXMgaW4gdGhlIGJhc2UgYW5ub3RhdGlvbi4gCi0gICAgICogIAotICAgICAqIEBwYXJhbSBiYXNlQW5ub3RhdGlvbiBJbml0aWFsIHZhbHVlcyB0byBiZSB1c2VkIGluIGNyZWF0aW5nIHRoZSBhbm5vdGF0aW9uLiAgTWF5IGJlIG51bGwuCi0gICAgICogQHBhcmFtIHNwYXJzZUFubm90YXRpb24gTm9uLWVtcHR5IHZhbHVlcyAobm90IG51bGwgYW5kIG5vdCAiIikgd2lsbCBvdmVycmlkZSB2YWx1ZXMgaW4gCi0gICAgICogdGhlIGJhc2UgYW5ub3RhdGlvbi4KLSAgICAgKiBAcmV0dXJuIEEgbmV3IGFubm90YXRpb24gY3JlYXRlZCBmcm9tIHRoZSBhcmd1bWVudHMsIG9yIG51bGwgaWYgb25lIGNvdWxkIG5vdCBiZSBjcmVhdGVkLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgV2ViU2VydmljZUNsaWVudEFubm90IGNyZWF0ZUZyb21Bbm5vdGF0aW9uKEFubm90YXRpb24gYmFzZUFubm90YXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvbiBzcGFyc2VBbm5vdGF0aW9uKSB7Ci0gICAgICAgIFdlYlNlcnZpY2VDbGllbnRBbm5vdCByZXR1cm5Bbm5vdCA9IG51bGw7Ci0gICAgICAgIGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlQ2xpZW50IGJhc2VXU0NBbm5vdGF0aW9uID0gbnVsbDsKLSAgICAgICAgamF2YXgueG1sLndzLldlYlNlcnZpY2VDbGllbnQgc3BhcnNlV1NDQW5ub3RhdGlvbiA9IG51bGw7Ci0gICAgICAgIAotICAgICAgICBpZiAoYmFzZUFubm90YXRpb24gIT0gbnVsbCAmJiBiYXNlQW5ub3RhdGlvbiBpbnN0YW5jZW9mIGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlQ2xpZW50KSB7Ci0gICAgICAgICAgICBiYXNlV1NDQW5ub3RhdGlvbiA9IChqYXZheC54bWwud3MuV2ViU2VydmljZUNsaWVudCkgYmFzZUFubm90YXRpb247Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmIChzcGFyc2VBbm5vdGF0aW9uICE9IG51bGwgJiYgc3BhcnNlQW5ub3RhdGlvbiBpbnN0YW5jZW9mIGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlQ2xpZW50KSB7Ci0gICAgICAgICAgICBzcGFyc2VXU0NBbm5vdGF0aW9uID0gKGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlQ2xpZW50KSBzcGFyc2VBbm5vdGF0aW9uOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAoYmFzZVdTQ0Fubm90YXRpb24gIT0gbnVsbCAmJiBzcGFyc2VXU0NBbm5vdGF0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIEJvdGggc3BlY2lmaWVkLCBjcmVhdGUgYmFzZWQgb24gdGhlIGJhc2UgYW5ub3RhdGlvbiBtZXJnZWQgd2l0aCB0aGUgc3BhcnNlCi0gICAgICAgICAgICAvLyBhbm5vdGF0aW9uCi0gICAgICAgICAgICByZXR1cm5Bbm5vdCA9IFdlYlNlcnZpY2VDbGllbnRBbm5vdC5jcmVhdGVGcm9tQW5ub3RhdGlvbihiYXNlV1NDQW5ub3RhdGlvbik7Ci0gICAgICAgICAgICBpZiAoIURlc2NyaXB0aW9uQnVpbGRlclV0aWxzLmlzRW1wdHkoc3BhcnNlV1NDQW5ub3RhdGlvbi5uYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuQW5ub3Quc2V0TmFtZShzcGFyc2VXU0NBbm5vdGF0aW9uLm5hbWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIURlc2NyaXB0aW9uQnVpbGRlclV0aWxzLmlzRW1wdHkoc3BhcnNlV1NDQW5ub3RhdGlvbi50YXJnZXROYW1lc3BhY2UoKSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm5Bbm5vdC5zZXRUYXJnZXROYW1lc3BhY2Uoc3BhcnNlV1NDQW5ub3RhdGlvbi50YXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIURlc2NyaXB0aW9uQnVpbGRlclV0aWxzLmlzRW1wdHkoc3BhcnNlV1NDQW5ub3RhdGlvbi53c2RsTG9jYXRpb24oKSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm5Bbm5vdC5zZXRXc2RsTG9jYXRpb24oc3BhcnNlV1NDQW5ub3RhdGlvbi53c2RsTG9jYXRpb24oKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoYmFzZVdTQ0Fubm90YXRpb24gIT0gbnVsbCAmJiBzcGFyc2VXU0NBbm5vdGF0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIFRoZXJlJ3Mgbm8gc3BhcnNlIGluZm9ybWF0aW9uLCBzbyBqdXN0IGNyZWF0ZSBmcm9tIHRoZSBiYXNlIGFubm90YXRpb24KLSAgICAgICAgICAgIHJldHVybkFubm90ID0gV2ViU2VydmljZUNsaWVudEFubm90LmNyZWF0ZUZyb21Bbm5vdGF0aW9uKGJhc2VXU0NBbm5vdGF0aW9uKTsKLSAgICAgICAgfSBlbHNlIGlmIChiYXNlV1NDQW5ub3RhdGlvbiA9PSBudWxsICYmIHNwYXJzZVdTQ0Fubm90YXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gVGhlcmUncyBvbmx5IHNwYXJzZSBpbmZvcm1hdGlvbiwgc28gY3JlYXRlIGEgbmV3IGFubm90YXRpb24gYmFzZWQgb24gdGhhdAotICAgICAgICAgICAgcmV0dXJuQW5ub3QgPSBXZWJTZXJ2aWNlQ2xpZW50QW5ub3QuY3JlYXRlRnJvbUFubm90YXRpb24oc3BhcnNlV1NDQW5ub3RhdGlvbik7Ci0gICAgICAgIH0gZWxzZSBpZiAoYmFzZVdTQ0Fubm90YXRpb24gPT0gbnVsbCAmJiBzcGFyc2VXU0NBbm5vdGF0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIE5vIGFubnRvdGF0aW9uIHNwZWNpZmVkLCBzbyBqdXN0IHJldHVybiBudWxsIHdoaWNoIHdhcyBpbml0aWFsaXplZCBhYm92ZQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuOyBhbGwgdGhlIGNhc2VzIGFyZSBjb3ZlcmVkIGFib3ZlCi0gICAgICAgICAgICBTdHJpbmcgbXNnID0gTWVzc2FnZXMuZ2V0TWVzc2FnZSgiRGVzY3JpcHRpb25CdWlsZGVyRXJyMiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3BhcnNlQW5ub3RhdGlvbiA9PSBudWxsKSA/IG51bGwgOiBzcGFyc2VBbm5vdGF0aW9uLnRvU3RyaW5nKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmFzZUFubm90YXRpb24gPT0gbnVsbCkgPyBudWxsIDogYmFzZUFubm90YXRpb24udG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKG1zZyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldHVybkFubm90OwotICAgIH0KLQotICAgIC8qKiBAcmV0dXJuIFJldHVybnMgdGhlIG5hbWUuICovCi0gICAgcHVibGljIFN0cmluZyBuYW1lKCkgewotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0KLSAgICAvKiogQHJldHVybiBSZXR1cm5zIHRoZSB0YXJnZXROYW1lc3BhY2UuICovCi0gICAgcHVibGljIFN0cmluZyB0YXJnZXROYW1lc3BhY2UoKSB7Ci0gICAgICAgIHJldHVybiB0YXJnZXROYW1lc3BhY2U7Ci0gICAgfQotCi0gICAgLyoqIEByZXR1cm4gUmV0dXJucyB0aGUgd3NkbExvY2F0aW9uLiAqLwotICAgIHB1YmxpYyBTdHJpbmcgd3NkbExvY2F0aW9uKCkgewotICAgICAgICByZXR1cm4gd3NkbExvY2F0aW9uOwotICAgIH0KLQotICAgIC8qKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSB0byBzZXQuICovCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIH0KLQotICAgIC8qKiBAcGFyYW0gdGFyZ2V0TmFtZXNwYWNlIFRoZSB0YXJnZXROYW1lc3BhY2UgdG8gc2V0LiAqLwotICAgIHB1YmxpYyB2b2lkIHNldFRhcmdldE5hbWVzcGFjZShTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlKSB7Ci0gICAgICAgIHRoaXMudGFyZ2V0TmFtZXNwYWNlID0gdGFyZ2V0TmFtZXNwYWNlOwotICAgIH0KLQotICAgIC8qKiBAcGFyYW0gd3NkbExvY2F0aW9uIFRoZSB3c2RsTG9jYXRpb24gdG8gc2V0LiAqLwotICAgIHB1YmxpYyB2b2lkIHNldFdzZGxMb2NhdGlvbihTdHJpbmcgd3NkbExvY2F0aW9uKSB7Ci0gICAgICAgIHRoaXMud3NkbExvY2F0aW9uID0gd3NkbExvY2F0aW9uOwotICAgIH0KLQotICAgIC8vaG1tLCBzaG91bGQgd2UgcmVhbGx5IGRvIHRoaXMKLSAgICBwdWJsaWMgQ2xhc3M8QW5ub3RhdGlvbj4gYW5ub3RhdGlvblR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBBbm5vdGF0aW9uLmNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgdW5pdCB0ZXN0aW5nLiBXZSB3aWxsIHByaW50IGFsbCBvZiB0aGUKLSAgICAgKiBkYXRhIG1lbWJlcnMgaGVyZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIFN0cmluZyBuZXdMaW5lID0gIlxuIjsKLSAgICAgICAgc2IuYXBwZW5kKG5ld0xpbmUpOwotICAgICAgICBzYi5hcHBlbmQoIkBXZWJTZXJ2aWNlQ2xpZW50Lm5hbWU9ICIgKyBuYW1lKTsKLSAgICAgICAgc2IuYXBwZW5kKG5ld0xpbmUpOwotICAgICAgICBzYi5hcHBlbmQoIkBXZWJTZXJ2aWNlQ2xpZW50LnRhcmdldE5hbWVzcGFjZT0gIiArIHRhcmdldE5hbWVzcGFjZSk7Ci0gICAgICAgIHNiLmFwcGVuZChuZXdMaW5lKTsKLSAgICAgICAgc2IuYXBwZW5kKCJAV2ViU2VydmljZUNsaWVudC53c2RsTG9jYXRpb249ICIgKyB3c2RsTG9jYXRpb24pOwotICAgICAgICBzYi5hcHBlbmQobmV3TGluZSk7Ci0gICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2J1aWxkZXIvV2ViU2VydmljZUNvbnRleHRBbm5vdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9XZWJTZXJ2aWNlQ29udGV4dEFubm90LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4NGRmMjguLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9XZWJTZXJ2aWNlQ29udGV4dEFubm90LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlcjsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLWltcG9ydCBqYXZheC54bWwud3MuRW5kcG9pbnRSZWZlcmVuY2U7Ci1pbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaW5jaXBhbDsKLQotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VDb250ZXh0QW5ub3QgaW1wbGVtZW50cyBqYXZheC54bWwud3MuV2ViU2VydmljZUNvbnRleHQgewotCi0gICAgcHJpdmF0ZSBNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dDsKLSAgICBwcml2YXRlIFByaW5jaXBhbCB1c2VyUHJpbmNpcGFsOwotICAgIHByaXZhdGUgYm9vbGVhbiBpc1VzZXJJblJvbGUgPSBmYWxzZTsKLQotICAgIC8qKiBBIFdlYlNlcnZpY2VDb250ZXh0QW5ub3QgY2Fubm90IGJlIGluc3RhbnRpYXRlZC4gKi8KLSAgICBwcml2YXRlIFdlYlNlcnZpY2VDb250ZXh0QW5ub3QoKSB7Ci0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFdlYlNlcnZpY2VDb250ZXh0QW5ub3QoCi0gICAgICAgICAgICBNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCwKLSAgICAgICAgICAgIFByaW5jaXBhbCB1c2VyUHJpbmNpcGFsLAotICAgICAgICAgICAgYm9vbGVhbiBpc1VzZXJJblJvbGUpIHsKLSAgICAgICAgdGhpcy5tZXNzYWdlQ29udGV4dCA9IG1lc3NhZ2VDb250ZXh0OwotICAgICAgICB0aGlzLnVzZXJQcmluY2lwYWwgPSB1c2VyUHJpbmNpcGFsOwotICAgICAgICB0aGlzLmlzVXNlckluUm9sZSA9IGlzVXNlckluUm9sZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gcm9sZSBUaGUgcm9sZSB0byBjaGVjay4KLSAgICAgKiBAcmV0dXJuIFJldHVybnMgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdXNlciBpcyBpbiBSb2xlCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNVc2VySW5Sb2xlKFN0cmluZyByb2xlKSB7Ci0gICAgICAgIHJldHVybiBpc1VzZXJJblJvbGU7Ci0gICAgfQotCi0gICAgLyoqIEByZXR1cm4gUmV0dXJucyB0aGUgbWVzc2FnZUNvbnRleHQuICovCi0gICAgcHVibGljIE1lc3NhZ2VDb250ZXh0IGdldE1lc3NhZ2VDb250ZXh0KCkgewotICAgICAgICByZXR1cm4gbWVzc2FnZUNvbnRleHQ7Ci0gICAgfQotCi0gICAgLyoqIEByZXR1cm4gUmV0dXJucyB0aGUgdXNlclByaW5jaXBhbC4gKi8KLSAgICBwdWJsaWMgUHJpbmNpcGFsIGdldFVzZXJQcmluY2lwYWwoKSB7Ci0gICAgICAgIHJldHVybiB1c2VyUHJpbmNpcGFsOwotICAgIH0KLQotICAgIC8qKiBAcGFyYW0gaXNVc2VySW5Sb2xlIFRoZSBpc1VzZXJJblJvbGUgdG8gc2V0LiAqLwotICAgIHB1YmxpYyB2b2lkIHNldFVzZXJJblJvbGUoYm9vbGVhbiBpc1VzZXJJblJvbGUpIHsKLSAgICAgICAgdGhpcy5pc1VzZXJJblJvbGUgPSBpc1VzZXJJblJvbGU7Ci0gICAgfQotCi0gICAgLyoqIEBwYXJhbSBtZXNzYWdlQ29udGV4dCBUaGUgbWVzc2FnZUNvbnRleHQgdG8gc2V0LiAqLwotICAgIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2VDb250ZXh0KE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0KSB7Ci0gICAgICAgIHRoaXMubWVzc2FnZUNvbnRleHQgPSBtZXNzYWdlQ29udGV4dDsKLSAgICB9Ci0KLSAgICAvKiogQHBhcmFtIHVzZXJQcmluY2lwYWwgVGhlIHVzZXJQcmluY2lwYWwgdG8gc2V0LiAqLwotICAgIHB1YmxpYyB2b2lkIHNldFVzZXJQcmluY2lwYWwoUHJpbmNpcGFsIHVzZXJQcmluY2lwYWwpIHsKLSAgICAgICAgdGhpcy51c2VyUHJpbmNpcGFsID0gdXNlclByaW5jaXBhbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgPFQgZXh0ZW5kcyBFbmRwb2ludFJlZmVyZW5jZT4gVCBnZXRFbmRwb2ludFJlZmVyZW5jZShDbGFzczxUPiBhcmcwLCBFbGVtZW50Li4uIGFyZzEpIHsKLSAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRW5kcG9pbnRSZWZlcmVuY2UgZ2V0RW5kcG9pbnRSZWZlcmVuY2UoRWxlbWVudC4uLiBhcmcwKSB7Ci0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0KLSAgICAvL2htbSwgc2hvdWxkIHdlIHJlYWxseSBkbyB0aGlzCi0gICAgcHVibGljIENsYXNzPEFubm90YXRpb24+IGFubm90YXRpb25UeXBlKCkgewotICAgICAgICByZXR1cm4gQW5ub3RhdGlvbi5jbGFzczsKLSAgICB9Ci0JCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9idWlsZGVyL1dlYlNlcnZpY2VQcm92aWRlckFubm90LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9idWlsZGVyL1dlYlNlcnZpY2VQcm92aWRlckFubm90LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlYWMxNWYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9XZWJTZXJ2aWNlUHJvdmlkZXJBbm5vdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyOwotCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKLQotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VQcm92aWRlckFubm90IGltcGxlbWVudHMgamF2YXgueG1sLndzLldlYlNlcnZpY2VQcm92aWRlciB7Ci0KLSAgICBwcml2YXRlIFN0cmluZyB3c2RsTG9jYXRpb24gPSAiIjsKLSAgICBwcml2YXRlIFN0cmluZyBzZXJ2aWNlTmFtZSA9ICIiOwotICAgIHByaXZhdGUgU3RyaW5nIHBvcnROYW1lID0gIiI7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0gIiI7Ci0KLSAgICAvKiogQSBXZWJTZXJ2aWNlUHJvdmlkZXJBbm5vdCBjYW5ub3QgYmUgaW5zdGFudGlhdGVkLiAqLwotICAgIHByaXZhdGUgV2ViU2VydmljZVByb3ZpZGVyQW5ub3QoKSB7Ci0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFdlYlNlcnZpY2VQcm92aWRlckFubm90KAotICAgICAgICAgICAgU3RyaW5nIHdzZGxMb2NhdGlvbiwKLSAgICAgICAgICAgIFN0cmluZyBzZXJ2aWNlTmFtZSwKLSAgICAgICAgICAgIFN0cmluZyBwb3J0TmFtZSwKLSAgICAgICAgICAgIFN0cmluZyB0YXJnZXROYW1lc3BhY2UpIHsKLSAgICAgICAgdGhpcy50YXJnZXROYW1lc3BhY2UgPSB0YXJnZXROYW1lc3BhY2U7Ci0gICAgICAgIHRoaXMuc2VydmljZU5hbWUgPSBzZXJ2aWNlTmFtZTsKLSAgICAgICAgdGhpcy53c2RsTG9jYXRpb24gPSB3c2RsTG9jYXRpb247Ci0gICAgICAgIHRoaXMucG9ydE5hbWUgPSBwb3J0TmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFdlYlNlcnZpY2VQcm92aWRlckFubm90IGNyZWF0ZVdlYlNlcnZpY2VBbm5vdEltcGwoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgV2ViU2VydmljZVByb3ZpZGVyQW5ub3QoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFdlYlNlcnZpY2VQcm92aWRlckFubm90IGNyZWF0ZVdlYlNlcnZpY2VBbm5vdEltcGwoCi0gICAgICAgICAgICBTdHJpbmcgbmFtZSwKLSAgICAgICAgICAgIFN0cmluZyB0YXJnZXROYW1lc3BhY2UsCi0gICAgICAgICAgICBTdHJpbmcgc2VydmljZU5hbWUsCi0gICAgICAgICAgICBTdHJpbmcgd3NkbExvY2F0aW9uLAotICAgICAgICAgICAgU3RyaW5nIGVuZHBvaW50SW50ZXJmYWNlLAotICAgICAgICAgICAgU3RyaW5nIHBvcnROYW1lCi0gICAgKSB7Ci0gICAgICAgIHJldHVybiBuZXcgV2ViU2VydmljZVByb3ZpZGVyQW5ub3Qod3NkbExvY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgV2ViU2VydmljZVByb3ZpZGVyQW5ub3QgY3JlYXRlRnJvbUFubm90YXRpb24oQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB7Ci0gICAgICAgIFdlYlNlcnZpY2VQcm92aWRlckFubm90IHJldHVybkFubm90ID0gbnVsbDsKLSAgICAgICAgaWYgKGFubm90YXRpb24gIT0gbnVsbCAmJiBhbm5vdGF0aW9uIGluc3RhbmNlb2YgamF2YXgueG1sLndzLldlYlNlcnZpY2VQcm92aWRlcikgewotICAgICAgICAgICAgamF2YXgueG1sLndzLldlYlNlcnZpY2VQcm92aWRlciB3c3AgPSAoamF2YXgueG1sLndzLldlYlNlcnZpY2VQcm92aWRlcikgYW5ub3RhdGlvbjsKLSAgICAgICAgICAgIHJldHVybkFubm90ID0gbmV3IFdlYlNlcnZpY2VQcm92aWRlckFubm90KHdzcC53c2RsTG9jYXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzcC5zZXJ2aWNlTmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NwLnBvcnROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c3AudGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHJldHVybkFubm90OwotICAgIH0KLQotICAgIC8qKiBAcmV0dXJuIFJldHVybnMgdGhlIHBvcnROYW1lLiAqLwotICAgIHB1YmxpYyBTdHJpbmcgcG9ydE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBwb3J0TmFtZTsKLSAgICB9Ci0KLSAgICAvKiogQHJldHVybiBSZXR1cm5zIHRoZSBzZXJ2aWNlTmFtZS4gKi8KLSAgICBwdWJsaWMgU3RyaW5nIHNlcnZpY2VOYW1lKCkgewotICAgICAgICByZXR1cm4gc2VydmljZU5hbWU7Ci0gICAgfQotCi0gICAgLyoqIEByZXR1cm4gUmV0dXJucyB0aGUgdGFyZ2V0TmFtZXNwYWNlLiAqLwotICAgIHB1YmxpYyBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlKCkgewotICAgICAgICByZXR1cm4gdGFyZ2V0TmFtZXNwYWNlOwotICAgIH0KLQotICAgIC8qKiBAcmV0dXJuIFJldHVybnMgdGhlIHdzZGxMb2NhdGlvbi4gKi8KLSAgICBwdWJsaWMgU3RyaW5nIHdzZGxMb2NhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIHdzZGxMb2NhdGlvbjsKLSAgICB9Ci0KLSAgICAvKiogQHBhcmFtIHBvcnROYW1lIFRoZSBwb3J0TmFtZSB0byBzZXQuICovCi0gICAgcHVibGljIHZvaWQgc2V0UG9ydE5hbWUoU3RyaW5nIHBvcnROYW1lKSB7Ci0gICAgICAgIHRoaXMucG9ydE5hbWUgPSBwb3J0TmFtZTsKLSAgICB9Ci0KLSAgICAvKiogQHBhcmFtIHNlcnZpY2VOYW1lIFRoZSBzZXJ2aWNlTmFtZSB0byBzZXQuICovCi0gICAgcHVibGljIHZvaWQgc2V0U2VydmljZU5hbWUoU3RyaW5nIHNlcnZpY2VOYW1lKSB7Ci0gICAgICAgIHRoaXMuc2VydmljZU5hbWUgPSBzZXJ2aWNlTmFtZTsKLSAgICB9Ci0KLSAgICAvKiogQHBhcmFtIHRhcmdldE5hbWVzcGFjZSBUaGUgdGFyZ2V0TmFtZXNwYWNlIHRvIHNldC4gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUYXJnZXROYW1lc3BhY2UoU3RyaW5nIHRhcmdldE5hbWVzcGFjZSkgewotICAgICAgICB0aGlzLnRhcmdldE5hbWVzcGFjZSA9IHRhcmdldE5hbWVzcGFjZTsKLSAgICB9Ci0KLSAgICAvKiogQHBhcmFtIHdzZGxMb2NhdGlvbiBUaGUgd3NkbExvY2F0aW9uIHRvIHNldC4gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRXc2RsTG9jYXRpb24oU3RyaW5nIHdzZGxMb2NhdGlvbikgewotICAgICAgICB0aGlzLndzZGxMb2NhdGlvbiA9IHdzZGxMb2NhdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2xhc3M8QW5ub3RhdGlvbj4gYW5ub3RhdGlvblR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBBbm5vdGF0aW9uLmNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgdW5pdCB0ZXN0aW5nLiBXZSB3aWxsIHByaW50IGFsbCBvZiB0aGUKLSAgICAgKiBkYXRhIG1lbWJlcnMgaGVyZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIFN0cmluZyBuZXdMaW5lID0gIlxuIjsKLSAgICAgICAgc2IuYXBwZW5kKG5ld0xpbmUpOwotICAgICAgICBzYi5hcHBlbmQoIkBXZWJTZXJ2aWNlUHJvdmlkZXIuc2VydmljZU5hbWU9ICIgKyBzZXJ2aWNlTmFtZSk7Ci0gICAgICAgIHNiLmFwcGVuZChuZXdMaW5lKTsKLSAgICAgICAgc2IuYXBwZW5kKCJAV2ViU2VydmljZVByb3ZpZGVyLnRhcmdldE5hbWVzcGFjZT0gIiArIHRhcmdldE5hbWVzcGFjZSk7Ci0gICAgICAgIHNiLmFwcGVuZChuZXdMaW5lKTsKLSAgICAgICAgc2IuYXBwZW5kKCJAV2ViU2VydmljZVByb3ZpZGVyLndzZGxMb2NhdGlvbj0gIiArIHdzZGxMb2NhdGlvbik7Ci0gICAgICAgIHNiLmFwcGVuZChuZXdMaW5lKTsKLSAgICAgICAgc2IuYXBwZW5kKCJAV2ViU2VydmljZVByb3ZpZGVyLnBvcnROYW1lPSAiICsgcG9ydE5hbWUpOwotICAgICAgICBzYi5hcHBlbmQobmV3TGluZSk7Ci0gICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2J1aWxkZXIvV2ViU2VydmljZVJlZkFubm90LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9idWlsZGVyL1dlYlNlcnZpY2VSZWZBbm5vdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjJkZDIxLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2J1aWxkZXIvV2ViU2VydmljZVJlZkFubm90LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXI7Ci0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOwotCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZVJlZkFubm90IGltcGxlbWVudHMgamF2YXgueG1sLndzLldlYlNlcnZpY2VSZWYgewotCi0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZSA9ICIiOwotICAgIHByaXZhdGUgU3RyaW5nIHdzZGxMb2NhdGlvbiA9ICIiOwotICAgIHByaXZhdGUgQ2xhc3MgdHlwZTsKLSAgICBwcml2YXRlIENsYXNzIHZhbHVlOwotICAgIHByaXZhdGUgU3RyaW5nIG1hcHBlZE5hbWUgPSAiIjsKLSAgICAKLSAgICAvLyBUT0RPOiBSZW1vdmUgdGhlIFN0cmluZyB2ZXJzaW9ucyBvZiB0aGUgQ2xhc3MgYXR0cmlidXRlcyB3aGVuIHRoZSBhc3NvY2lhdGVkIGRlcHJlY2F0ZWQgCi0gICAgLy8gbWV0aG9kcyBhcmUgcmVtb3ZlZC4KLSAgICBwcml2YXRlIFN0cmluZyB0eXBlU3RyaW5nID0gIiI7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgdmFsdWVTdHJpbmcgPSAiIjsKLQotICAgIC8qKiBBIFdlYlNlcnZpY2VSZWZBbm5vdCBjYW5ub3QgYmUgaW5zdGFudGlhdGVkLiAqLwotICAgIHByaXZhdGUgV2ViU2VydmljZVJlZkFubm90KCkgewotCi0gICAgfQotCi0gICAgcHJpdmF0ZSBXZWJTZXJ2aWNlUmVmQW5ub3QoCi0gICAgICAgICAgICBTdHJpbmcgbmFtZSwKLSAgICAgICAgICAgIFN0cmluZyB3c2RsTG9jYXRpb24sCi0gICAgICAgICAgICBDbGFzcyB0eXBlLAotICAgICAgICAgICAgQ2xhc3MgdmFsdWUsCi0gICAgICAgICAgICBTdHJpbmcgbWFwcGVkTmFtZSkgewotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgICAgICB0aGlzLndzZGxMb2NhdGlvbiA9IHdzZGxMb2NhdGlvbjsKLSAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKLSAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwotICAgICAgICB0aGlzLm1hcHBlZE5hbWUgPSBtYXBwZWROYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEBkZXByZWNhdGVkIFRoZSBTdHJpbmcgdmFsdWVzIGZvciB0eXBlIGFuZCB2YWx1ZSBzaG91bGRuJ3QgYmUgdXNlZC4gIFVzZSB7QGxpbmsgI1dlYlNlcnZpY2VSZWZBbm5vdChTdHJpbmcsIFN0cmluZywgQ2xhc3MsIENsYXNzLCBTdHJpbmcpfQotICAgICAqIAotICAgICAqIEBwYXJhbSBuYW1lCi0gICAgICogQHBhcmFtIHdzZGxMb2NhdGlvbgotICAgICAqIEBwYXJhbSB0eXBlCi0gICAgICogQHBhcmFtIHZhbHVlCi0gICAgICogQHBhcmFtIG1hcHBlZE5hbWUKLSAgICAgKiBAcGFyYW0gdHlwZVN0cmluZwotICAgICAqIEBwYXJhbSB2YWx1ZVN0cmluZwotICAgICAqLwotICAgIHByaXZhdGUgV2ViU2VydmljZVJlZkFubm90KAotICAgICAgICAgICAgU3RyaW5nIG5hbWUsCi0gICAgICAgICAgICBTdHJpbmcgd3NkbExvY2F0aW9uLAotICAgICAgICAgICAgQ2xhc3MgdHlwZSwKLSAgICAgICAgICAgIENsYXNzIHZhbHVlLAotICAgICAgICAgICAgU3RyaW5nIG1hcHBlZE5hbWUsCi0gICAgICAgICAgICBTdHJpbmcgdHlwZVN0cmluZywKLSAgICAgICAgICAgIFN0cmluZyB2YWx1ZVN0cmluZykgewotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgICAgICB0aGlzLndzZGxMb2NhdGlvbiA9IHdzZGxMb2NhdGlvbjsKLSAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKLSAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwotICAgICAgICB0aGlzLm1hcHBlZE5hbWUgPSBtYXBwZWROYW1lOwotICAgICAgICB0aGlzLnR5cGVTdHJpbmcgPSB0eXBlU3RyaW5nOwotICAgICAgICB0aGlzLnZhbHVlU3RyaW5nID0gdmFsdWVTdHJpbmc7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBXZWJTZXJ2aWNlUmVmQW5ub3QgY3JlYXRlV2ViU2VydmljZVJlZkFubm90SW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBXZWJTZXJ2aWNlUmVmQW5ub3QoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFdlYlNlcnZpY2VSZWZBbm5vdCBjcmVhdGVXZWJTZXJ2aWNlUmVmQW5ub3RJbXBsKAotICAgICAgICAgICAgU3RyaW5nIG5hbWUsCi0gICAgICAgICAgICBTdHJpbmcgd3NkbExvY2F0aW9uLAotICAgICAgICAgICAgQ2xhc3MgdHlwZSwKLSAgICAgICAgICAgIENsYXNzIHZhbHVlLAotICAgICAgICAgICAgU3RyaW5nIG1hcHBlZE5hbWUpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBXZWJTZXJ2aWNlUmVmQW5ub3QobmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NkbExvY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGVkTmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQGRlcHJlY2F0ZWQgVGhlIFN0cmluZyB2YWx1ZXMgZm9yIHR5cGUgYW5kIHZhbHVlIHNob3VsZCBub3QgYmUgdXNlZC4gIFVzZSB7QGxpbmsgI2NyZWF0ZVdlYlNlcnZpY2VSZWZBbm5vdEltcGwoU3RyaW5nLCBTdHJpbmcsIENsYXNzLCBDbGFzcywgU3RyaW5nKX0KLSAgICAgKiAKLSAgICAgKiAgVGhlcmUgc2hvdWxkbid0IGJlIGJvdGggYSBjbGFzcyBhbmQgU3RyaW5nIGZvciB0eXBlIGFuZCB2YWx1ZTsgdGhlcmUgaXNuJ3Qgb24gdGhlIGFjdHVhbCAKLSAgICAgKiAgYW5ub3RhdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbmFtZQotICAgICAqIEBwYXJhbSB3c2RsTG9jYXRpb24KLSAgICAgKiBAcGFyYW0gdHlwZQotICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqIEBwYXJhbSBtYXBwZWROYW1lCi0gICAgICogQHBhcmFtIHR5cGVTdHJpbmcKLSAgICAgKiBAcGFyYW0gdmFsdWVTdHJpbmcKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBXZWJTZXJ2aWNlUmVmQW5ub3QgY3JlYXRlV2ViU2VydmljZVJlZkFubm90SW1wbCgKLSAgICAgICAgICAgIFN0cmluZyBuYW1lLAotICAgICAgICAgICAgU3RyaW5nIHdzZGxMb2NhdGlvbiwKLSAgICAgICAgICAgIENsYXNzIHR5cGUsCi0gICAgICAgICAgICBDbGFzcyB2YWx1ZSwKLSAgICAgICAgICAgIFN0cmluZyBtYXBwZWROYW1lLAotICAgICAgICAgICAgU3RyaW5nIHR5cGVTdHJpbmcsCi0gICAgICAgICAgICBTdHJpbmcgdmFsdWVTdHJpbmcKLSAgICApIHsKLSAgICAgICAgcmV0dXJuIG5ldyBXZWJTZXJ2aWNlUmVmQW5ub3QobmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NkbExvY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGVkTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZVN0cmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVTdHJpbmcpOwotICAgIH0KLQotCi0gICAgLyoqIEByZXR1cm4gUmV0dXJucyB0aGUgbWFwcGVkTmFtZS4gKi8KLSAgICBwdWJsaWMgU3RyaW5nIG1hcHBlZE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBtYXBwZWROYW1lOwotICAgIH0KLQotICAgIC8qKiBAcmV0dXJuIFJldHVybnMgdGhlIG5hbWUuICovCi0gICAgcHVibGljIFN0cmluZyBuYW1lKCkgewotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0KLSAgICAvKiogQHJldHVybiBSZXR1cm5zIHRoZSB0eXBlLiAqLwotICAgIHB1YmxpYyBDbGFzcyB0eXBlKCkgewotICAgICAgICByZXR1cm4gdHlwZTsKLSAgICB9Ci0KLSAgICAvKiogQHJldHVybiBSZXR1cm5zIHRoZSB2YWx1ZS4gKi8KLSAgICBwdWJsaWMgQ2xhc3MgdmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKiogQHJldHVybiBSZXR1cm5zIHRoZSB3c2RsTG9jYXRpb24uICovCi0gICAgcHVibGljIFN0cmluZyB3c2RsTG9jYXRpb24oKSB7Ci0gICAgICAgIHJldHVybiB3c2RsTG9jYXRpb247Ci0gICAgfQotCi0gICAgLyoqIAotICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgI3R5cGUoKX0gCi0gICAgICogQHJldHVybiBSZXR1cm5zIHRoZSB0eXBlU3RyaW5nLiAKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGVTdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiB0eXBlU3RyaW5nOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgI3ZhbHVlKCl9IAotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgdmFsdWVTdHJpbmcuICovCi0gICAgcHVibGljIFN0cmluZyBnZXRWYWx1ZVN0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlU3RyaW5nOwotICAgIH0KLQotICAgIC8qKiBAcGFyYW0gbWFwcGVkTmFtZSBUaGUgbWFwcGVkTmFtZSB0byBzZXQuICovCi0gICAgcHVibGljIHZvaWQgc2V0TWFwcGVkTmFtZShTdHJpbmcgbWFwcGVkTmFtZSkgewotICAgICAgICB0aGlzLm1hcHBlZE5hbWUgPSBtYXBwZWROYW1lOwotICAgIH0KLQotICAgIC8qKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSB0byBzZXQuICovCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIH0KLQotICAgIC8qKiBAcGFyYW0gdHlwZSBUaGUgdHlwZSB0byBzZXQuICovCi0gICAgcHVibGljIHZvaWQgc2V0VHlwZShDbGFzcyB0eXBlKSB7Ci0gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7Ci0gICAgfQotCi0gICAgLyoqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LiAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKENsYXNzIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKiogQHBhcmFtIHdzZGxMb2NhdGlvbiBUaGUgd3NkbExvY2F0aW9uIHRvIHNldC4gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRXc2RsTG9jYXRpb24oU3RyaW5nIHdzZGxMb2NhdGlvbikgewotICAgICAgICB0aGlzLndzZGxMb2NhdGlvbiA9IHdzZGxMb2NhdGlvbjsKLSAgICB9Ci0KLSAgICAvKiogQHJldHVybiBSZXR1cm5zIHRoZSB3c2RsTG9jYXRpb24uICovCi0gICAgcHVibGljIFN0cmluZyBnZXRXc2RsTG9jYXRpb24oKSB7Ci0gICAgICAgIHJldHVybiB3c2RsTG9jYXRpb247Ci0gICAgfQotCi0gICAgLyoqIAotICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgI3NldFR5cGUoQ2xhc3MpfQotICAgICAqIEBwYXJhbSB0eXBlU3RyaW5nIFRoZSB0eXBlU3RyaW5nIHRvIHNldC4gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUeXBlU3RyaW5nKFN0cmluZyB0eXBlU3RyaW5nKSB7Ci0gICAgICAgIHRoaXMudHlwZVN0cmluZyA9IHR5cGVTdHJpbmc7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQGRlcHJlY2F0ZWQge0BsaW5rICNzZXRWYWx1ZShDbGFzcyl9IAotICAgICAqIEBwYXJhbSB2YWx1ZVN0cmluZyBUaGUgdmFsdWVTdHJpbmcgdG8gc2V0LiAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlU3RyaW5nKFN0cmluZyB2YWx1ZVN0cmluZykgewotICAgICAgICB0aGlzLnZhbHVlU3RyaW5nID0gdmFsdWVTdHJpbmc7Ci0gICAgfQotCi0gICAgcHVibGljIENsYXNzPEFubm90YXRpb24+IGFubm90YXRpb25UeXBlKCkgewotICAgICAgICByZXR1cm4gQW5ub3RhdGlvbi5jbGFzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIHVuaXQgdGVzdGluZy4gV2Ugd2lsbCBwcmludCBhbGwgb2YgdGhlCi0gICAgICogZGF0YSBtZW1iZXJzIGhlcmUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBTdHJpbmcgbmV3TGluZSA9ICJcbiI7Ci0gICAgICAgIHNiLmFwcGVuZChuZXdMaW5lKTsKLSAgICAgICAgc2IuYXBwZW5kKCJAV2ViU2VydmljZVJlZi5uYW1lPSAiICsgbmFtZSk7Ci0gICAgICAgIHNiLmFwcGVuZChuZXdMaW5lKTsKLSAgICAgICAgc2IuYXBwZW5kKCJAV2ViU2VydmljZVJlZi53c2RsTG9jYXRpb249ICIgKyB3c2RsTG9jYXRpb24pOwotICAgICAgICBzYi5hcHBlbmQobmV3TGluZSk7Ci0gICAgICAgIHNiLmFwcGVuZCgiQFdlYlNlcnZpY2VSZWYubWFwcGVkTmFtZT0gIiArIG1hcHBlZE5hbWUpOwotICAgICAgICBzYi5hcHBlbmQobmV3TGluZSk7Ci0gICAgICAgIHNiLmFwcGVuZCgiQFdlYlNlcnZpY2VSZWYudHlwZVN0cmluZz0gIiArIHR5cGVTdHJpbmcpOwotICAgICAgICBzYi5hcHBlbmQobmV3TGluZSk7Ci0gICAgICAgIHNiLmFwcGVuZCgiQFdlYlNlcnZpY2VSZWYudHlwZT0gIiArICgodHlwZSAhPSBudWxsKSA/IHR5cGUudG9TdHJpbmcoKSA6IG51bGwpKTsKLSAgICAgICAgc2IuYXBwZW5kKG5ld0xpbmUpOwotICAgICAgICBzYi5hcHBlbmQoIkBXZWJTZXJ2aWNlUmVmLnZhbHVlU3RyaW5nPSAiICsgdmFsdWVTdHJpbmcpOwotICAgICAgICBzYi5hcHBlbmQobmV3TGluZSk7Ci0gICAgICAgIHNiLmFwcGVuZCgiQFdlYlNlcnZpY2VSZWYudmFsdWU9ICIgKyAoKHZhbHVlICE9IG51bGwpID8gdmFsdWUudG9TdHJpbmcoKSA6IG51bGwpKTsKLSAgICAgICAgc2IuYXBwZW5kKG5ld0xpbmUpOwotICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9idWlsZGVyL1dzZGxDb21wb3NpdGUuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2J1aWxkZXIvV3NkbENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NmQxZjAyLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2J1aWxkZXIvV3NkbENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRG9jdW1lbnQ7Ci0KLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLXB1YmxpYyBjbGFzcyBXc2RsQ29tcG9zaXRlIHsKLQotICAgIEhhc2hNYXA8U3RyaW5nLCBEZWZpbml0aW9uPiB3c2RsRGVmaW5pdGlvbnNNYXA7Ci0KLSAgICBIYXNoTWFwPFN0cmluZywgT01Eb2N1bWVudD4gc2NoZW1hTWFwOwotCi0gICAgU3RyaW5nIHdzZGxGaWxlTmFtZTsKLQotICAgIHB1YmxpYyBXc2RsQ29tcG9zaXRlKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKiBAcmV0dXJuIFJldHVybnMgdGhlIHNjaGVtYU1hcC4gKi8KLSAgICBwdWJsaWMgSGFzaE1hcDxTdHJpbmcsIE9NRG9jdW1lbnQ+IGdldFNjaGVtYU1hcCgpIHsKLSAgICAgICAgcmV0dXJuIHNjaGVtYU1hcDsKLSAgICB9Ci0KLSAgICAvKiogQHJldHVybiBSZXR1cm5zIHRoZSB3c2RsRGVmaW5pdGlvbi4gKi8KLSAgICBwdWJsaWMgSGFzaE1hcDxTdHJpbmcsIERlZmluaXRpb24+IGdldFdzZGxEZWZpbml0aW9uc01hcCgpIHsKLSAgICAgICAgcmV0dXJuIHdzZGxEZWZpbml0aW9uc01hcDsKLSAgICB9Ci0KLSAgICAvKiogQHJldHVybiBSZXR1cm5zIHRoZSByb290IFdTREwgRGVmaW5pdGlvbiAqLwotICAgIHB1YmxpYyBEZWZpbml0aW9uIGdldFJvb3RXc2RsRGVmaW5pdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIHdzZGxEZWZpbml0aW9uc01hcC5nZXQoZ2V0V3NkbEZpbGVOYW1lKCkpOwotICAgIH0KLQotICAgIC8qKiBAcmV0dXJuIFJldHVybnMgdGhlIHdzZGxGaWxlTmFtZS4gKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFdzZGxGaWxlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHdzZGxGaWxlTmFtZTsKLSAgICB9Ci0KLSAgICAvKiogQHBhcmFtIHNjaGVtYU1hcCBUaGUgc2NoZW1hTWFwIHRvIHNldC4gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTY2hlbWFNYXAoSGFzaE1hcDxTdHJpbmcsIE9NRG9jdW1lbnQ+IHNjaGVtYU1hcCkgewotICAgICAgICB0aGlzLnNjaGVtYU1hcCA9IHNjaGVtYU1hcDsKLSAgICB9Ci0KLSAgICAvKiogQHBhcmFtIHdzZGxEZWZpbml0aW9uIFRoZSB3c2RsRGVmaW5pdGlvbiB0byBzZXQuICovCi0gICAgcHVibGljIHZvaWQgc2V0V3NkbERlZmluaXRpb24oSGFzaE1hcDxTdHJpbmcsIERlZmluaXRpb24+IHdzZGxEZWZpbml0aW9uc01hcCkgewotICAgICAgICB0aGlzLndzZGxEZWZpbml0aW9uc01hcCA9IHdzZGxEZWZpbml0aW9uc01hcDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gd3NkbEZpbGVOYW1lIFRoZSB3c2RsRmlsZU5hbWUgdG8gc2V0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFdzZGxGaWxlTmFtZShTdHJpbmcgd3NkbEZpbGVOYW1lKSB7Ci0gICAgICAgIHRoaXMud3NkbEZpbGVOYW1lID0gd3NkbEZpbGVOYW1lOwotICAgIH0KLQkKLQkKLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2J1aWxkZXIvV3NkbEdlbmVyYXRvci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9Xc2RsR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwMmYxMmMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9Xc2RsR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlcjsKLQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5FbmRwb2ludERlc2NyaXB0aW9uOwotCi1wdWJsaWMgaW50ZXJmYWNlIFdzZGxHZW5lcmF0b3IgewotCi0gICAgcHVibGljIFdzZGxDb21wb3NpdGUgZ2VuZXJhdGVXc2RsKFN0cmluZyBpbXBsQ2xhc3MsIEVuZHBvaW50RGVzY3JpcHRpb24gZW5kcG9pbnREZXNjKQotICAgICAgICAgICAgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb247Ci0gICAgCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9idWlsZGVyL2NvbnZlcnRlci9Db252ZXJ0ZXJVdGlscy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9jb252ZXJ0ZXIvQ29udmVydGVyVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRiODNiNC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9idWlsZGVyL2NvbnZlcnRlci9Db252ZXJ0ZXJVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLmNvbnZlcnRlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5EZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLkZpZWxkRGVzY3JpcHRpb25Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLkhhbmRsZXJDaGFpbkFubm90OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5NZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuUGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLlNvYXBCaW5kaW5nQW5ub3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLlRNQW5ub3RhdGlvbkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuVE1GQW5ub3RhdGlvbkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuV2ViU2VydmljZVJlZkFubm90OwotCi1pbXBvcnQgamF2YXguandzLkhhbmRsZXJDaGFpbjsKLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZzsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbExpc3Q7Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VSZWY7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkdlbmVyaWNBcnJheVR5cGU7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlBhcmFtZXRlcml6ZWRUeXBlOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuV2lsZGNhcmRUeXBlOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1wdWJsaWMgY2xhc3MgQ29udmVydGVyVXRpbHMgewotCi0gICAgLyoqCi0gICAgICogSGVscGVyIG1ldGhvZCB0byByZXRyaWV2ZSB0aGUgYW5ub3RhdGlvbiBzcGVjaWZpZWQgYnkgYSBjZXJ0YWluIDxjb2RlPkNsYXNzPC9jb2RlPgotICAgICAqCi0gICAgICogQHBhcmFtIGFubm90YXRpb25DbGFzcyAtIDxjb2RlPkNsYXNzPC9jb2RlPiB0aGUgYW5ub3RhdGlvbiA8Y29kZT5DbGFzczwvY29kZT4KLSAgICAgKiBAcGFyYW0gZWxlbWVudCAgICAgICAgIC0gPGNvZGU+QW5ub3RhdGVkRWxlbWVudDwvY29kZT4gLSB0aGUgZWxlbWVudCBvbiB3aGljaCB3ZSBhcmUgbG9va2luZyBmb3IKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBhbm5vdGF0aW9uIChpLmUuIENsYXNzLCBNZXRob2QsIEZpZWxkKQotICAgICAqIEByZXR1cm4gLSA8Y29kZT5Bbm5vdGF0aW9uPC9jb2RlPiBhbm5vdGF0aW9uIHJlcHJlc2VudGVkIGJ5IHRoZSBnaXZlbiA8Y29kZT5DbGFzczwvY29kZT4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbihmaW5hbCBDbGFzcyBhbm5vdGF0aW9uQ2xhc3MsIGZpbmFsIEFubm90YXRlZEVsZW1lbnQgZWxlbWVudCkgewotICAgICAgICByZXR1cm4gKEFubm90YXRpb24pIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkQWN0aW9uKCkgewotICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuZ2V0QW5ub3RhdGlvbihhbm5vdGF0aW9uQ2xhc3MpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEhlbHBlciBtZXRob2QgdG8gcmV0cmlldmUgYSBsaXN0IG9mIGFsbCBhbm5vdGF0aW9ucyB0aGF0IG1hdGNoIHRoZSBmb2xsb3dpbmcKLSAgICAgKiBjb25kaXRpb25zOgotICAgICAqIAotICAgICAqIC0gQW5ub3RhdGlvbnMgdGhhdCBleHRlbmQgdGhlIHBhcmFtZXRlcml6ZWQgdHlwZSBUCi0gICAgICogLSBBbm5vdGF0aW9ucyB0aGF0IHRoZW1zZWx2ZXMgYXJlIGFubm90YXRlZCB3aXRoIHR5cGUgVAotICAgICAqIAotICAgICAqIEBwYXJhbSBhbm5vdGF0aW9uQ2xhc3MKLSAgICAgKiBAcGFyYW0gZWxlbWVudAotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIDxUIGV4dGVuZHMgQW5ub3RhdGlvbj4gTGlzdDxBbm5vdGF0aW9uPiBnZXRBbm5vdGF0aW9ucyhmaW5hbCBDbGFzczxUPiBhbm5vdGF0aW9uQ2xhc3MsIGZpbmFsIEFubm90YXRlZEVsZW1lbnQgZWxlbWVudCkgewotICAgICAgICBMaXN0PEFubm90YXRpb24+IG1hdGNoZXMgPSBuZXcgQXJyYXlMaXN0PEFubm90YXRpb24+KCk7Ci0gICAgICAgIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucyA9IG51bGw7Ci0gICAgICAgIAotICAgICAgICAvLyBHZXQgdGhlIGNvbXBsZXRlIGxpc3Qgb2YgYW5ub3RhdGlvbnMgZnJvbSB0aGUgY2xhc3MgdGhhdCB3YXMgcHJvdmlkZWQuCi0gICAgICAgIGFubm90YXRpb25zID0gKEFubm90YXRpb25bXSkgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRBY3Rpb24oKSB7Ci0gICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudC5nZXRBbm5vdGF0aW9ucygpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgCi0gICAgICAgIGZvciAoQW5ub3RhdGlvbiBhOiBhbm5vdGF0aW9ucykgeyAgICAgICAgCi0gICAgICAgICAgICAvLyBJZiB0aGUgYW5ub3RhdGlvbiBtYXRjaGVzIHRoZSBwYXJhbWV0ZXIgdHlwZSB3ZSdyZSBsb29raW5nCi0gICAgICAgICAgICAvLyBmb3IsIGFkZCBpdCB0byB0aGUgbGlzdC4KLSAgICAgICAgICAgIGlmIChhLmFubm90YXRpb25UeXBlKCkuaXNBbm5vdGF0aW9uUHJlc2VudChhbm5vdGF0aW9uQ2xhc3MpIHx8IAotICAgICAgICAgICAgICAgIGFubm90YXRpb25DbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGEuYW5ub3RhdGlvblR5cGUoKSkpIHsKLSAgICAgICAgICAgICAgICBtYXRjaGVzLmFkZChhKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIG1hdGNoZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBpcyBhIGhlbHBlciBtZXRob2QgdG8gY3JlYXRlIGEgPGNvZGU+SGFuZGxlckNoYWluQW5ub3Q8L2NvZGU+IHNpbmNlIHRoZQotICAgICAqCi0gICAgICogQHBhcmFtIGhhbmRsZXJDaGFpbiAtIDxjb2RlPkhhbmRsZXJDaGFpbjwvY29kZT4KLSAgICAgKiBAcmV0dXJuIC0gPGNvZGU+SGFuZGxlckNoYWluQW5ub3Q8L2NvZGU+Ci0gICAgICogQEhhbmRsZXJDaGFpbiBhbm5vdGF0aW9uIG1heSBiZSBwcmVzZW50IG9uIGEgVHlwZSwgTWV0aG9kLCBvciBGaWVsZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEhhbmRsZXJDaGFpbkFubm90IGNyZWF0ZUhhbmRsZXJDaGFpbkFubm90KEhhbmRsZXJDaGFpbiBoYW5kbGVyQ2hhaW4pIHsKLSAgICAgICAgSGFuZGxlckNoYWluQW5ub3QgaGNBbm5vdCA9IEhhbmRsZXJDaGFpbkFubm90LmNyZWF0ZUhhbmRsZXJDaGFpbkFubm90SW1wbCgpOwotICAgICAgICBoY0Fubm90LnNldEZpbGUoaGFuZGxlckNoYWluLmZpbGUoKSk7Ci0gICAgICAgIGhjQW5ub3Quc2V0TmFtZShoYW5kbGVyQ2hhaW4ubmFtZSgpKTsKLSAgICAgICAgcmV0dXJuIGhjQW5ub3Q7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBpcyBhIGhlbHBlciBtZXRob2QgdG8gY3JlYXRlIGEgPGNvZGU+U29hcEJpbmRpbmdBbm5vdDwvY29kZT4gc2luY2UgdGhlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc29hcEJpbmRpbmcgLSA8Y29kZT5TT0FQQmluZGluZzwvY29kZT4KLSAgICAgKiBAcmV0dXJuIC0gPGNvZGU+U29hcEJpbmRpbmdBbm5vdDwvY29kZT4KLSAgICAgKiBAU09BUEJpbmRpbmcgYW5ub3RhdGlvbiBtYXkgYmUgcHJlc2VudCBvbiBhIFR5cGUgb3IgTWV0aG9kLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU29hcEJpbmRpbmdBbm5vdCBjcmVhdGVTb2FwQmluZGluZ0Fubm90KFNPQVBCaW5kaW5nIHNvYXBCaW5kaW5nKSB7Ci0gICAgICAgIFNvYXBCaW5kaW5nQW5ub3Qgc2JBbm5vdCA9IFNvYXBCaW5kaW5nQW5ub3QuY3JlYXRlU29hcEJpbmRpbmdBbm5vdEltcGwoKTsKLSAgICAgICAgc2JBbm5vdC5zZXRQYXJhbWV0ZXJTdHlsZShzb2FwQmluZGluZy5wYXJhbWV0ZXJTdHlsZSgpKTsKLSAgICAgICAgc2JBbm5vdC5zZXRTdHlsZShzb2FwQmluZGluZy5zdHlsZSgpKTsKLSAgICAgICAgc2JBbm5vdC5zZXRVc2Uoc29hcEJpbmRpbmcudXNlKCkpOwotICAgICAgICByZXR1cm4gc2JBbm5vdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIGlzIGEgaGVscGVyIG1ldGhvZCB0byBjcmVhdGUgYSA8Y29kZT5XZWJTZXJ2aWNlUmVmQW5ub3Q8L2NvZGU+IHNpbmNlIHRoZQotICAgICAqCi0gICAgICogQHBhcmFtIHdlYlNlcnZpY2VSZWYgLSA8Y29kZT5XZWJTZXJ2aWNlUmVmPC9jb2RlPgotICAgICAqIEByZXR1cm4gLSA8Y29kZT5XZWJTZXJ2aWNlUmVmQW5ub3Q8L2NvZGU+Ci0gICAgICogQFdlYlNlcnZpY2VSZWYgYW5ub3RhdGlvbiBtYXkgYmUgcHJlc2VudCBvbiBhIFR5cGUsIE1ldGhvZCwgb3IgRmllbGQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBXZWJTZXJ2aWNlUmVmQW5ub3QgY3JlYXRlV2ViU2VydmljZVJlZkFubm90KFdlYlNlcnZpY2VSZWYgd2ViU2VydmljZVJlZikgewotICAgICAgICBXZWJTZXJ2aWNlUmVmQW5ub3Qgd3NyQW5ub3QgPSBXZWJTZXJ2aWNlUmVmQW5ub3QuY3JlYXRlV2ViU2VydmljZVJlZkFubm90SW1wbCgpOwotICAgICAgICB3c3JBbm5vdC5zZXRNYXBwZWROYW1lKHdlYlNlcnZpY2VSZWYubWFwcGVkTmFtZSgpKTsKLSAgICAgICAgd3NyQW5ub3Quc2V0TmFtZSh3ZWJTZXJ2aWNlUmVmLm5hbWUoKSk7Ci0gICAgICAgIHdzckFubm90LnNldFR5cGUod2ViU2VydmljZVJlZi50eXBlKCkpOwotICAgICAgICB3c3JBbm5vdC5zZXRWYWx1ZSh3ZWJTZXJ2aWNlUmVmLnZhbHVlKCkpOwotICAgICAgICB3c3JBbm5vdC5zZXRXc2RsTG9jYXRpb24od2ViU2VydmljZVJlZi53c2RsTG9jYXRpb24oKSk7Ci0gICAgICAgIHJldHVybiB3c3JBbm5vdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCBpcyB1c2UgdG8gYXR0YWNoIEBIYW5kbGVyQ2hhaW4gYW5ub3RhdGlvbiBkYXRhIHRvIGEgY29tcG9zaXRlIG9iamVjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb21wb3NpdGUgICAgICAgIC0gPGNvZGU+VE1GQW5ub3RhdGlvbkNvbXBvc2l0ZTwvY29kZT4KLSAgICAgKiBAcGFyYW0gYW5ub3RhdGVkRWxlbWVudCAtIDxjb2RlPkFubm90YXRlZEVsZW1lbnQ8L2NvZGU+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGF0dGFjaEhhbmRsZXJDaGFpbkFubm90YXRpb24oVE1GQW5ub3RhdGlvbkNvbXBvc2l0ZSBjb21wb3NpdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50KSB7Ci0gICAgICAgIEhhbmRsZXJDaGFpbiBoYW5kbGVyQ2hhaW4gPSAoSGFuZGxlckNoYWluKUNvbnZlcnRlclV0aWxzLmdldEFubm90YXRpb24oCi0gICAgICAgICAgICAgICAgSGFuZGxlckNoYWluLmNsYXNzLCBhbm5vdGF0ZWRFbGVtZW50KTsKLSAgICAgICAgaWYgKGhhbmRsZXJDaGFpbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBIYW5kbGVyQ2hhaW5Bbm5vdCBoY0Fubm90ID0gQ29udmVydGVyVXRpbHMuY3JlYXRlSGFuZGxlckNoYWluQW5ub3QoCi0gICAgICAgICAgICAgICAgICAgIGhhbmRsZXJDaGFpbik7Ci0gICAgICAgICAgICBjb21wb3NpdGUuc2V0SGFuZGxlckNoYWluQW5ub3QoaGNBbm5vdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCBpcyB1c2UgdG8gYXR0YWNoIEBTT0FQQmluZGluZyBhbm5vdGF0aW9uIGRhdGEgdG8gYSBjb21wb3NpdGUgb2JqZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbXBvc2l0ZSAgICAgICAgLSA8Y29kZT5UTUFubm90YXRpb25Db21wb3NpdGU8L2NvZGU+Ci0gICAgICogQHBhcmFtIGFubm90YXRlZEVsZW1lbnQgLSA8Y29kZT5Bbm5vdGF0ZWRFbGVtZW50PC9jb2RlPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhdHRhY2hTb2FwQmluZGluZ0Fubm90YXRpb24oVE1Bbm5vdGF0aW9uQ29tcG9zaXRlIGNvbXBvc2l0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCkgewotICAgICAgICBTT0FQQmluZGluZyBzb2FwQmluZGluZyA9IChTT0FQQmluZGluZylDb252ZXJ0ZXJVdGlscy5nZXRBbm5vdGF0aW9uKAotICAgICAgICAgICAgICAgIFNPQVBCaW5kaW5nLmNsYXNzLCBhbm5vdGF0ZWRFbGVtZW50KTsKLSAgICAgICAgaWYgKHNvYXBCaW5kaW5nICE9IG51bGwpIHsKLSAgICAgICAgICAgIFNvYXBCaW5kaW5nQW5ub3Qgc2JBbm5vdCA9IENvbnZlcnRlclV0aWxzLmNyZWF0ZVNvYXBCaW5kaW5nQW5ub3Qoc29hcEJpbmRpbmcpOwotICAgICAgICAgICAgY29tcG9zaXRlLnNldFNvYXBCaW5kaW5nQW5ub3Qoc2JBbm5vdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCBpcyB1c2UgdG8gYXR0YWNoIEBXZWJTZXJ2aWNlUmVmIGFubm90YXRpb24gZGF0YSB0byBhIGNvbXBvc2l0ZSBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29tcG9zaXRlICAgICAgICAtIDxjb2RlPlRNRkFubm90YXRpb25Db21wb3NpdGU8L2NvZGU+Ci0gICAgICogQHBhcmFtIGFubm90YXRlZEVsZW1lbnQgLSA8Y29kZT5Bbm5vdGF0ZWRFbGVtZW50PC9jb2RlPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhdHRhY2hXZWJTZXJ2aWNlUmVmQW5ub3RhdGlvbihUTUZBbm5vdGF0aW9uQ29tcG9zaXRlIGNvbXBvc2l0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50KSB7Ci0gICAgICAgIFdlYlNlcnZpY2VSZWYgd2ViU2VydmljZVJlZiA9IChXZWJTZXJ2aWNlUmVmKUNvbnZlcnRlclV0aWxzLmdldEFubm90YXRpb24oCi0gICAgICAgICAgICAgICAgV2ViU2VydmljZVJlZi5jbGFzcywgYW5ub3RhdGVkRWxlbWVudCk7Ci0gICAgICAgIGlmICh3ZWJTZXJ2aWNlUmVmICE9IG51bGwpIHsKLSAgICAgICAgICAgIFdlYlNlcnZpY2VSZWZBbm5vdCB3c3JBbm5vdCA9IENvbnZlcnRlclV0aWxzLmNyZWF0ZVdlYlNlcnZpY2VSZWZBbm5vdCgKLSAgICAgICAgICAgICAgICAgICAgd2ViU2VydmljZVJlZik7Ci0gICAgICAgICAgICBjb21wb3NpdGUuc2V0V2ViU2VydmljZVJlZkFubm90KHdzckFubm90KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKiBUaGlzIG1ldGhvZCB3aWxsIGFkZCBGaWVsZERlc2NyaXB0aW9uQ29tcG9zaXRlIG9iamVjdHMgdG8gYSBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYXR0YWNoRmllbGREZXNjcmlwdGlvbkNvbXBvc2l0ZXMoRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlCi0gICAgICAgICAgICBjb21wb3NpdGUsIExpc3Q8RmllbGREZXNjcmlwdGlvbkNvbXBvc2l0ZT4gZmRjTGlzdCkgewotICAgICAgICBmb3IgKEZpZWxkRGVzY3JpcHRpb25Db21wb3NpdGUgZmRjIDogZmRjTGlzdCkgewotICAgICAgICAgICAgY29tcG9zaXRlLmFkZEZpZWxkRGVzY3JpcHRpb25Db21wb3NpdGUoZmRjKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKiBUaGlzIG1ldGhvZCB3aWxsIGFkZCBNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSBvYmplY3RzIHRvIGEgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGF0dGFjaE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlcyhEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUKLSAgICAgICAgICAgIGNvbXBvc2l0ZSwgTGlzdDxNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZT4gbWRjTGlzdCkgewotICAgICAgICBmb3IgKE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlIG1kYyA6IG1kY0xpc3QpIHsKLSAgICAgICAgICAgIGNvbXBvc2l0ZS5hZGRNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZShtZGMpOwotICAgICAgICAgICAgbWRjLnNldERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZVJlZihjb21wb3NpdGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqIFRoaXMgbWV0aG9kIHdpbGwgYWRkIFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlIG9iamVjdHMgdG8gYSBNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhdHRhY2hQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZXMoTGlzdAotICAgICAgICAgICAgPFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlPiBwZGNMaXN0LCBNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSBtZGMpIHsKLSAgICAgICAgZm9yIChQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZSBwZGMgOiBwZGNMaXN0KSB7Ci0gICAgICAgICAgICBtZGMuYWRkUGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGUocGRjKTsKLSAgICAgICAgICAgIHBkYy5zZXRNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZVJlZihtZGMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2Qgd2lsbCBjaGVjayB0byBzZWUgaWYgYSBtZXRob2QncyBkZWNsYXJpbmcgY2xhc3MgaXMgdGhlIE9iamVjdCBjbGFzcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXRob2QgLSA8Y29kZT5NZXRob2Q8L2NvZGU+Ci0gICAgICogQHJldHVybiAtIDxjb2RlPmJvb2xlYW48L2NvZGU+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzSW5oZXJpdGVkKE1ldGhvZCBtZXRob2QsIFN0cmluZyBkZWNsYXJpbmdDbGFzcykgewotICAgICAgICBpZiAobWV0aG9kLmdldERlY2xhcmluZ0NsYXNzKCkuZ2V0TmFtZSgpLmVxdWFscyhkZWNsYXJpbmdDbGFzcykpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGNvbnN0cnVjdCBhIDxjb2RlPlN0cmluZzwvY29kZT4gdGhhdCByZXByZXNlbnRzIHRoZQotICAgICAqIGZ1bGwgdHlwZSBvZiBhIHBhcmFtZXRlcml6ZWQgdmFyaWFibGUuCi0gICAgICogQHBhcmFtIHB0IC0gPGNvZGU+UGFyYW1ldGVyaXplZFR5cGU8L2NvZGU+Ci0gICAgICogQHBhcmFtIHBhcmFtVHlwZSAtIDxjb2RlPlN0cmluZzwvY29kZT4KLSAgICAgKiBAcmV0dXJuIC0gPGNvZGU+U3RyaW5nPC9jb2RlPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEZ1bGxUeXBlKFBhcmFtZXRlcml6ZWRUeXBlIHB0LCBTdHJpbmcgcGFyYW1UeXBlKSB7Ci0gICAgICAgIGlmIChwdC5nZXRSYXdUeXBlKCkgaW5zdGFuY2VvZiBDbGFzcykgewotICAgICAgICAgICAgQ2xhc3MgcmF3Q2xhc3MgPSAoQ2xhc3MpcHQuZ2V0UmF3VHlwZSgpOwotICAgICAgICAgICAgcGFyYW1UeXBlID0gcGFyYW1UeXBlICsgcmF3Q2xhc3MuZ2V0TmFtZSgpOwotICAgICAgICB9Ci0gICAgICAgIFR5cGVbXSBnZW5lcmljVHlwZXMgPSBwdC5nZXRBY3R1YWxUeXBlQXJndW1lbnRzKCk7Ci0gICAgICAgIGlmIChnZW5lcmljVHlwZXMubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgcGFyYW1UeXBlID0gcGFyYW1UeXBlICsgIjwiOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBnZW5lcmljVHlwZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBUeXBlIHR5cGUgPSBnZW5lcmljVHlwZXNbaV07Ci0gICAgICAgICAgICAgICAgcGFyYW1UeXBlID0gZ2V0VHlwZSh0eXBlLCBwYXJhbVR5cGUpOwotCi0gICAgICAgICAgICAgICAgLy8gU2V0IHN0cmluZyBmb3IgbW9yZSBwYXJhbWV0ZXJzIE9SIGNsb3NlIHRoZSBnZW5lcmljIGlmIHRoaXMgaXMgdGhlIGxhc3Qgb25lLgotICAgICAgICAgICAgICAgIGlmIChpICE9IGdlbmVyaWNUeXBlcy5sZW5ndGggLSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmFtVHlwZSA9IHBhcmFtVHlwZSArICIsICI7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcGFyYW1UeXBlID0gcGFyYW1UeXBlICsgIj4iOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwYXJhbVR5cGU7Ci0JfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFR5cGUoVHlwZSB0eXBlLCBTdHJpbmcgcGFyYW1UeXBlKSB7Ci0gICAgICAgIGlmICh0eXBlIGluc3RhbmNlb2YgQ2xhc3MpIHsKLSAgICAgICAgICAgIHBhcmFtVHlwZSA9IHBhcmFtVHlwZSArICgoQ2xhc3MpdHlwZSkuZ2V0TmFtZSgpOwotICAgICAgICB9IGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBQYXJhbWV0ZXJpemVkVHlwZSkgewotICAgICAgICAgICAgcGFyYW1UeXBlID0gZ2V0RnVsbFR5cGUoKFBhcmFtZXRlcml6ZWRUeXBlKXR5cGUsIHBhcmFtVHlwZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAodHlwZSBpbnN0YW5jZW9mIFdpbGRjYXJkVHlwZSkgewotICAgICAgICAgICAgcGFyYW1UeXBlID0gcGFyYW1UeXBlICsgIj8iOwotICAgICAgICB9IGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBHZW5lcmljQXJyYXlUeXBlKSB7Ci0gICAgICAgICAgICBwYXJhbVR5cGUgPSBnZXRUeXBlKCgoR2VuZXJpY0FycmF5VHlwZSl0eXBlKS5nZXRHZW5lcmljQ29tcG9uZW50VHlwZSgpLCBwYXJhbVR5cGUpICsgIltdIjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcGFyYW1UeXBlOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIHNlYXJjaCBhcnJheSBvZiBwYXJhbWV0ZXIgYW5ub3RhdGlvbnMgZm9yIHRoZSBwcmVzZW5jZSBvZiB0aGUgQFhtbExpc3QKLSAgICAgKiBhbm5vdGF0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNYbWxMaXN0QW5ub3RhdGlvbihBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMpIHsKLSAgICAgICAgZm9yKEFubm90YXRpb24gYW5ub3RhdGlvbiA6IGFubm90YXRpb25zKSB7Ci0gICAgICAgICAgICBpZihhbm5vdGF0aW9uLmFubm90YXRpb25UeXBlKCkgPT0gWG1sTGlzdC5jbGFzcykgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9idWlsZGVyL2NvbnZlcnRlci9KYXZhQ2xhc3NUb0RCQ0NvbnZlcnRlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9jb252ZXJ0ZXIvSmF2YUNsYXNzVG9EQkNDb252ZXJ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM2NTE3OC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9idWlsZGVyL2NvbnZlcnRlci9KYXZhQ2xhc3NUb0RCQ0NvbnZlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDc5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLmNvbnZlcnRlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5CaW5kaW5nVHlwZUFubm90OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5EZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLkZpZWxkRGVzY3JpcHRpb25Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLk1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5TZXJ2aWNlTW9kZUFubm90OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5XZWJGYXVsdEFubm90OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5XZWJTZXJ2aWNlQW5ub3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLldlYlNlcnZpY2VQcm92aWRlckFubm90OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5XZWJTZXJ2aWNlUmVmQW5ub3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51dGlsLkNsYXNzTG9hZGVyVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKLWltcG9ydCBqYXZheC54bWwud3MuQmluZGluZ1R5cGU7Ci1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2VNb2RlOwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJGYXVsdDsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUNsaWVudDsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZVByb3ZpZGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlUmVmOwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlUmVmczsKLWltcG9ydCBqYXZheC54bWwud3Muc3BpLldlYlNlcnZpY2VGZWF0dXJlQW5ub3RhdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5QYXJhbWV0ZXJpemVkVHlwZTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb247Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIEphdmFDbGFzc1RvREJDQ29udmVydGVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coSmF2YUNsYXNzVG9EQkNDb252ZXJ0ZXIuY2xhc3MpOwotCi0gICAgcHJpdmF0ZSBDbGFzcyBzZXJ2aWNlQ2xhc3M7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBzZWlDbGFzc05hbWU7Ci0KLSAgICBwcml2YXRlIExpc3Q8Q2xhc3M+IGNsYXNzZXM7Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPENsYXNzLCBPYmplY3Q+IGFubm90YXRpb25Qcm9jZXNzb3JzOwotICAgIAotICAgIHN0YXRpYyB7Ci0gICAgICAgIGFubm90YXRpb25Qcm9jZXNzb3JzID0gbmV3IEhhc2hNYXA8Q2xhc3MsIE9iamVjdD4oKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIEphdmFDbGFzc1RvREJDQ29udmVydGVyKENsYXNzIHNlcnZpY2VDbGFzcykgewotICAgICAgICB0aGlzLnNlcnZpY2VDbGFzcyA9IHNlcnZpY2VDbGFzczsKLSAgICAgICAgY2xhc3NlcyA9IG5ldyBBcnJheUxpc3Q8Q2xhc3M+KCk7Ci0gICAgICAgIGVzdGFibGlzaENsYXNzSGllcmFyY2h5KHNlcnZpY2VDbGFzcyk7Ci0gICAgICAgIGVzdGFibGlzaEludGVyZmFjZUhpZXJhcmNoeShzZXJ2aWNlQ2xhc3MuZ2V0SW50ZXJmYWNlcygpKTsKLSAgICAgICAgZXN0YWJsaXNoRXhjZXB0aW9uQ2xhc3NlcyhzZXJ2aWNlQ2xhc3MpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSBvbmx5IG1ldGhvZCB3ZSB3aWxsIGV4cG9zZSB0byB1c2VycyBvZiB0aGlzIGNsYXNzLiBJdCB3aWxsIHRyaWdnZXIgdGhlIGNyZWF0aW9uIG9mIHRoZQotICAgICAqIDxjb2RlPkRlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZTwvY29kZT4gYmFzZWQgb24gb3VyIHNlcnZpY2UgY2xhc3MuIEl0IHdpbGwgYWxzbyBoYW5kbGUgdGhlCi0gICAgICogY2FzZSBvZiBhbiBpbXBsIGNsYXNzIHRoYXQgcmVmZXJlbmNlcyBhbiBTRUkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIC0gPGNvZGU+RGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlPC9jb2RlPgotICAgICAqLwotICAgIHB1YmxpYyBIYXNoTWFwPFN0cmluZywgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlPiBwcm9kdWNlREJDKCkgewotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ3JlYXRpbmcgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIG1hcCBmcm9tIEphdmEgQ2xhc3MuIik7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIEhhc2hNYXA8U3RyaW5nLCBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGU+IGRiY01hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywKLSAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGU+KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2xhc3Nlcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgYnVpbGREQkMoZGJjTWFwLCBjbGFzc2VzLmdldChpKSk7Ci0gICAgICAgICAgICBpZiAoc2VpQ2xhc3NOYW1lICE9IG51bGwgJiYgIXNlaUNsYXNzTmFtZS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgQ2xhc3NMb2FkZXIgY29udGV4dENsYXNzTG9hZGVyID0gKENsYXNzTG9hZGVyKSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUHJpdmlsZWdlZEFjdGlvbigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgKTsKLSAgICAgICAgICAgICAgICAgICAgQ2xhc3Mgc2VpQ2xhc3MgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZWlDbGFzcyA9IChDbGFzcykgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHRDbGFzc0xvYWRlci5sb2FkQ2xhc3Moc2VpQ2xhc3NOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbikgZS5nZXRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBidWlsZERCQyhkYmNNYXAsIHNlaUNsYXNzKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIC8vIEFsc28gdHJ5IHRvIHNlZSBpZiB0aGUgU0VJIGhhcyBhbnkgc3VwZXIgaW50ZXJmYWNlcyAgCi0gICAgICAgICAgICAgICAgICAgIENsYXNzW10gaW50ZXJmYWNlcyA9IHNlaUNsYXNzLmdldEludGVyZmFjZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBpbnRlcmZhY2VzLmxlbmd0aDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBidWlsZERCQyhkYmNNYXAsIGludGVyZmFjZXNbaV0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJDbGFzcyBub3QgZm91bmQgZXhjZXB0aW9uIGNhdWdodCBmb3IgY2xhc3M6ICIgKyBzZWlDbGFzc05hbWUsIGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBkYmNNYXA7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGJ1aWxkREJDKEhhc2hNYXA8U3RyaW5nLCBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGU+IGRiY01hcCwgQ2xhc3MgY2xhenopIHsKLSAgICAgICAgc2VydmljZUNsYXNzID0gY2xheno7Ci0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCk7Ci0gICAgICAgIGludHJvc3BlY3RDbGFzcyhjb21wb3NpdGUpOwotICAgICAgICBkYmNNYXAucHV0KGNvbXBvc2l0ZS5nZXRDbGFzc05hbWUoKSwgY29tcG9zaXRlKTsgICAgICAgIAotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGRyaXZlIHRoZSBpbnRyb3NwZWN0aW9uIG9mIHRoZSBjbGFzcy1sZXZlbCBpbmZvcm1hdGlvbi4gSXQgd2lsbCBzdG9yZSB0aGUKLSAgICAgKiBnYXRoZXJlZCBpbmZvcm1hdGlvbiBpbiB0aGUgcGVydGluZW50IGRhdGEgbWVtYmVycyBvZiB0aGUgPGNvZGU+RGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlPC9jb2RlPgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbXBvc2l0ZSAtIDxjb2RlPkRlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZTwvY29kZT4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgaW50cm9zcGVjdENsYXNzKERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLSAgICAgICAgLy8gTmVlZCB0byBpbnZlc3RpZ2F0ZSB0aGlzLCBwcm9iYWJseSB3YW50IHRvIHNwZWNpZnkKLSAgICAgICAgY29tcG9zaXRlLnNldENsYXNzTG9hZGVyKENsYXNzTG9hZGVyVXRpbHMuZ2V0Q2xhc3NMb2FkZXIoc2VydmljZUNsYXNzKSk7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRJc0ludGVyZmFjZShzZXJ2aWNlQ2xhc3MuaXNJbnRlcmZhY2UoKSk7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRTdXBlckNsYXNzTmFtZShzZXJ2aWNlQ2xhc3MuZ2V0U3VwZXJjbGFzcygpICE9IG51bGwgPyBzZXJ2aWNlQ2xhc3MuCi0gICAgICAgICAgICAgICAgZ2V0U3VwZXJjbGFzcygpLmdldE5hbWUoKSA6IG51bGwpOwotICAgICAgICBjb21wb3NpdGUuc2V0Q2xhc3NOYW1lKHNlcnZpY2VDbGFzcy5nZXROYW1lKCkpOwotICAgICAgICBzZXRJbnRlcmZhY2VzKGNvbXBvc2l0ZSk7Ci0gICAgICAgIHNldFR5cGVUYXJnZXR0ZWRBbm5vdGF0aW9ucyhjb21wb3NpdGUpOwotICAgICAgICBGaWVsZFtdIGZpZWxkcyA9IChGaWVsZFtdKSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgKLSAgICAgICAgICAgICAgICBuZXcgUHJpdmlsZWdlZEFjdGlvbigpIHsKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VydmljZUNsYXNzLmdldEZpZWxkcygpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICApOwotICAgICAgICBpZiAoZmllbGRzLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgIEphdmFGaWVsZHNUb0ZEQ0NvbnZlcnRlciBmaWVsZENvbnZlcnRlciA9IG5ldyBKYXZhRmllbGRzVG9GRENDb252ZXJ0ZXIoCi0gICAgICAgICAgICAgICAgICAgIGZpZWxkcyk7Ci0gICAgICAgICAgICBMaXN0PEZpZWxkRGVzY3JpcHRpb25Db21wb3NpdGU+IGZkY0xpc3QgPSBmaWVsZENvbnZlcnRlci5jb252ZXJ0RmllbGRzKCk7Ci0gICAgICAgICAgICBDb252ZXJ0ZXJVdGlscy5hdHRhY2hGaWVsZERlc2NyaXB0aW9uQ29tcG9zaXRlcyhjb21wb3NpdGUsIGZkY0xpc3QpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzZXJ2aWNlQ2xhc3MuZ2V0TWV0aG9kcygpLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgIC8vIEluaGVyaXRlZCBtZXRob2RzIGFuZCBjb25zdHJ1Y3RvcnMgZm9yIHN1cGVyY2xhc3NlcyB3aWxsIGJlIGluIGEgc2VwZXJhdGUgREJDIGZvcgotICAgICAgICAgICAgLy8gdGhlIHN1cGVyY2xhc3MuICBXZSBvbmx5IG5lZWQgdGhlIG9uZXMgYWN0dWFsbHkgZGVjbGFyZWQgaW4gdGhpcyBjbGFzcy4KLSAgICAgICAgICAgIE1ldGhvZFtdIG1ldGhvZHMgPSAoTWV0aG9kW10pIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAotICAgICAgICAgICAgICAgICAgICBuZXcgUHJpdmlsZWdlZEFjdGlvbigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlQ2xhc3MuZ2V0RGVjbGFyZWRNZXRob2RzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICk7Ci0gICAgICAgICAgICBDb25zdHJ1Y3RvcltdIGRlY2xhcmVkQ29uc3RydWN0b3JzID0gKENvbnN0cnVjdG9yW10pIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAotICAgICAgICAgICAgICAgICAgICBuZXcgUHJpdmlsZWdlZEFjdGlvbigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlQ2xhc3MuZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvcnMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgKTsKLSAgICAgICAgICAgIEphdmFNZXRob2RzVG9NRENDb252ZXJ0ZXIgbWV0aG9kQ29udmVydGVyID0gbmV3IEphdmFNZXRob2RzVG9NRENDb252ZXJ0ZXIoCi0gICAgICAgICAgICAgICAgICAgIG1ldGhvZHMsIGRlY2xhcmVkQ29uc3RydWN0b3JzLAotICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlQ2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIExpc3Q8TWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGU+IG1kY0xpc3QgPSBtZXRob2RDb252ZXJ0ZXIuY29udmVydE1ldGhvZHMoKTsKLSAgICAgICAgICAgIENvbnZlcnRlclV0aWxzLmF0dGFjaE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlcyhjb21wb3NpdGUsIG1kY0xpc3QpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgaXMgcmVzcG9uc2libGUgZm9yIGZpbmRpbmcgYW55IGludGVyZmFjZXMgaW1wbGVtZW50ZWQgYnkgdGhlIHNlcnZpY2UgY2xhc3MuIFdlIHdpbGwKLSAgICAgKiB0aGVuIHNldCB0aGVzZSBhcyBhIGxpc3Qgb2YgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWVzIG9uIHRoZSA8Y29kZT5EZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGU8L2NvZGU+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gY29tcG9zaXRlIDxjb2RlPkRlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZTwvY29kZT4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2V0SW50ZXJmYWNlcyhEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0gICAgICAgIFR5cGVbXSBpbnRlcmZhY2VzID0gKFR5cGVbXSkgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoCi0gICAgICAgICAgICAgICAgbmV3IFByaXZpbGVnZWRBY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2VDbGFzcy5nZXRHZW5lcmljSW50ZXJmYWNlcygpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICApOwotICAgICAgICBMaXN0PFN0cmluZz4gaW50ZXJmYWNlTGlzdCA9IGludGVyZmFjZXMubGVuZ3RoID4gMCA/IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpCi0gICAgICAgICAgICAgICAgOiBudWxsOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGludGVyZmFjZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGludGVyZmFjZUxpc3QuYWRkKGdldE5hbWVGcm9tVHlwZShpbnRlcmZhY2VzW2ldKSk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gV2Ugb25seSB3YW50IHRvIHNldCB0aGlzIGxpc3QgaWYgd2UgZm91bmQgaW50ZXJmYWNlcyBiL2MgdGhlCi0gICAgICAgIC8vIERCQyBuZXdzIHVwIGFuIGludGVyZmFjZSBsaXN0IGFzIHBhcnQgb2YgaXRzIHN0YXRpYyBpbml0aWFsaXphdGlvbi4KLSAgICAgICAgLy8gVGh1cywgaWYgd2Ugc2V0IHRoaXMgbGlzdCB0byBudWxsIHdlIG1heSBjYXVzZSBhbiBOUEUKLSAgICAgICAgaWYgKGludGVyZmFjZUxpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgY29tcG9zaXRlLnNldEludGVyZmFjZXNMaXN0KGludGVyZmFjZUxpc3QpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0TmFtZUZyb21UeXBlKFR5cGUgdHlwZSkgewotICAgICAgICBTdHJpbmcgcmV0dXJuTmFtZSA9IG51bGw7Ci0gICAgICAgIGlmICh0eXBlIGluc3RhbmNlb2YgQ2xhc3MpIHsKLSAgICAgICAgICAgIHJldHVybk5hbWUgPSAoKENsYXNzKXR5cGUpLmdldE5hbWUoKTsKLSAgICAgICAgfSBlbHNlIGlmICh0eXBlIGluc3RhbmNlb2YgUGFyYW1ldGVyaXplZFR5cGUpIHsKLSAgICAgICAgICAgIHJldHVybk5hbWUgPSAoKFBhcmFtZXRlcml6ZWRUeXBlKXR5cGUpLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldHVybk5hbWU7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGRyaXZlIHRoZSBhdHRhY2htZW50IG9mIFR5cGUgdGFyZ2V0dGVkIGFubm90YXRpb25zIHRvIHRoZQotICAgICAqIDxjb2RlPkRlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZTwvY29kZT4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb21wb3NpdGUgLSA8Y29kZT5EZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGU8L2NvZGU+Ci0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHNldFR5cGVUYXJnZXR0ZWRBbm5vdGF0aW9ucyhEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0gICAgICAgIGF0dGFjaEJpbmRpbmdUeXBlQW5ub3RhdGlvbihjb21wb3NpdGUpOwotICAgICAgICBhdHRhY2hIYW5kbGVyQ2hhaW5Bbm5vdGF0aW9uKGNvbXBvc2l0ZSk7Ci0gICAgICAgIGF0dGFjaFNlcnZpY2VNb2RlQW5ub3RhdGlvbihjb21wb3NpdGUpOwotICAgICAgICBhdHRhY2hTb2FwQmluZGluZ0Fubm90YXRpb24oY29tcG9zaXRlKTsKLSAgICAgICAgYXR0YWNoV2ViRmF1bHRBbm5vdGF0aW9uKGNvbXBvc2l0ZSk7Ci0gICAgICAgIGF0dGFjaFdlYlNlcnZpY2VBbm5vdGF0aW9uKGNvbXBvc2l0ZSk7Ci0gICAgICAgIGF0dGFjaFdlYlNlcnZpY2VDbGllbnRBbm5vdGF0aW9uKGNvbXBvc2l0ZSk7Ci0gICAgICAgIGF0dGFjaFdlYlNlcnZpY2VQcm92aWRlckFubm90YXRpb24oY29tcG9zaXRlKTsKLSAgICAgICAgYXR0YWNoV2ViU2VydmljZVJlZnNBbm5vdGF0aW9uKGNvbXBvc2l0ZSk7Ci0gICAgICAgIGF0dGFjaFdlYlNlcnZpY2VSZWZBbm5vdGF0aW9uKGNvbXBvc2l0ZSk7Ci0gICAgICAgIGF0dGFjaFdlYlNlcnZpY2VGZWF0dXJlQW5ub3RhdGlvbnMoY29tcG9zaXRlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIHVzZWQgdG8gYXR0YWNoIEBXZWJTZXJ2aWNlIGFubm90YXRpb24gZGF0YSB0byB0aGUKLSAgICAgKiA8Y29kZT5EZXNjcmlwdGlvbkJ1aWxkZXJjb21wb3NpdGU8L2NvZGU+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gY29tcG9zaXRlIC0gPGNvZGU+RGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlPC9jb2RlPgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBhdHRhY2hXZWJTZXJ2aWNlQW5ub3RhdGlvbihEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0gICAgICAgIFdlYlNlcnZpY2Ugd2ViU2VydmljZSA9IChXZWJTZXJ2aWNlKUNvbnZlcnRlclV0aWxzLmdldEFubm90YXRpb24oCi0gICAgICAgICAgICAgICAgV2ViU2VydmljZS5jbGFzcywgc2VydmljZUNsYXNzKTsKLSAgICAgICAgaWYgKHdlYlNlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gQXR0YWNoIEBXZWJTZXJ2aWNlIGFubm90YXRlZCBkYXRhCi0gICAgICAgICAgICBXZWJTZXJ2aWNlQW5ub3Qgd3NBbm5vdCA9IFdlYlNlcnZpY2VBbm5vdC5jcmVhdGVXZWJTZXJ2aWNlQW5ub3RJbXBsKCk7Ci0gICAgICAgICAgICB3c0Fubm90LnNldEVuZHBvaW50SW50ZXJmYWNlKHdlYlNlcnZpY2UuZW5kcG9pbnRJbnRlcmZhY2UoKSk7Ci0gICAgICAgICAgICAvLyBjaGVjayBmb3IgU0VJIGFuZCBzYXZlIG5hbWUgaWYgbmVjZXNzYXJ5Ci0gICAgICAgICAgICBzZWlDbGFzc05hbWUgPSB3ZWJTZXJ2aWNlLmVuZHBvaW50SW50ZXJmYWNlKCk7Ci0gICAgICAgICAgICB3c0Fubm90LnNldE5hbWUod2ViU2VydmljZS5uYW1lKCkpOwotICAgICAgICAgICAgd3NBbm5vdC5zZXRQb3J0TmFtZSh3ZWJTZXJ2aWNlLnBvcnROYW1lKCkpOwotICAgICAgICAgICAgd3NBbm5vdC5zZXRTZXJ2aWNlTmFtZSh3ZWJTZXJ2aWNlLnNlcnZpY2VOYW1lKCkpOwotICAgICAgICAgICAgd3NBbm5vdC5zZXRUYXJnZXROYW1lc3BhY2Uod2ViU2VydmljZS50YXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgICAgICB3c0Fubm90LnNldFdzZGxMb2NhdGlvbih3ZWJTZXJ2aWNlLndzZGxMb2NhdGlvbigpKTsKLSAgICAgICAgICAgIGNvbXBvc2l0ZS5zZXRXZWJTZXJ2aWNlQW5ub3Qod3NBbm5vdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIHVzZWQgdG8gYXR0YWNoIEBXZWJTZXJ2aWNlQ2xpZW50IGFubm90YXRpb24gZGF0YSB0byB0aGUKLSAgICAgKiA8Y29kZT5EZXNjcmlwdGlvbkJ1aWxkZXJjb21wb3NpdGU8L2NvZGU+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gY29tcG9zaXRlIC0gPGNvZGU+RGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlPC9jb2RlPgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBhdHRhY2hXZWJTZXJ2aWNlQ2xpZW50QW5ub3RhdGlvbihEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0gICAgICAgIFdlYlNlcnZpY2VDbGllbnQgd2ViU2VydmljZUNsaWVudCA9IChXZWJTZXJ2aWNlQ2xpZW50KUNvbnZlcnRlclV0aWxzLgotICAgICAgICAgICAgICAgIGdldEFubm90YXRpb24oV2ViU2VydmljZUNsaWVudC5jbGFzcywgc2VydmljZUNsYXNzKTsKLSAgICAgICAgaWYgKHdlYlNlcnZpY2VDbGllbnQgIT0gbnVsbCkgewotCi0gICAgICAgIH0KLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgYmUgdXNlZCB0byBhdHRhY2ggQFdlYlNlcnZpY2VQcm92aWRlciBhbm5vdGF0aW9uIGRhdGEgdG8gdGhlCi0gICAgICogPGNvZGU+RGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlPC9jb2RlPgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbXBvc2l0ZSAtIDxjb2RlPkRlc2NyaXB0aW9uQnVpbGRlcmNvbXBvc2l0ZTwvY29kZT4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYXR0YWNoV2ViU2VydmljZVByb3ZpZGVyQW5ub3RhdGlvbihEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0gICAgICAgIFdlYlNlcnZpY2VQcm92aWRlciB3ZWJTZXJ2aWNlUHJvdmlkZXIgPSAoV2ViU2VydmljZVByb3ZpZGVyKUNvbnZlcnRlclV0aWxzLgotICAgICAgICAgICAgICAgIGdldEFubm90YXRpb24oV2ViU2VydmljZVByb3ZpZGVyLmNsYXNzLCBzZXJ2aWNlQ2xhc3MpOwotICAgICAgICBpZiAod2ViU2VydmljZVByb3ZpZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIEF0dGFjaCBAV2ViU2VydmljZVByb3ZpZGVyIGFubm90YXRpb24gZGF0YQotICAgICAgICAgICAgV2ViU2VydmljZVByb3ZpZGVyQW5ub3Qgd3NwQW5ub3QgPSBXZWJTZXJ2aWNlUHJvdmlkZXJBbm5vdC4KLSAgICAgICAgICAgICAgICAgICAgY3JlYXRlV2ViU2VydmljZUFubm90SW1wbCgpOwotICAgICAgICAgICAgd3NwQW5ub3Quc2V0UG9ydE5hbWUod2ViU2VydmljZVByb3ZpZGVyLnBvcnROYW1lKCkpOwotICAgICAgICAgICAgd3NwQW5ub3Quc2V0U2VydmljZU5hbWUod2ViU2VydmljZVByb3ZpZGVyLnNlcnZpY2VOYW1lKCkpOwotICAgICAgICAgICAgd3NwQW5ub3Quc2V0VGFyZ2V0TmFtZXNwYWNlKHdlYlNlcnZpY2VQcm92aWRlci50YXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgICAgICB3c3BBbm5vdC5zZXRXc2RsTG9jYXRpb24od2ViU2VydmljZVByb3ZpZGVyLndzZGxMb2NhdGlvbigpKTsKLSAgICAgICAgICAgIGNvbXBvc2l0ZS5zZXRXZWJTZXJ2aWNlUHJvdmlkZXJBbm5vdCh3c3BBbm5vdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIHVzZWQgdG8gYXR0YWNoIEBCaW5kaW5nVHlwZSBhbm5vdGF0aW9uIGRhdGEgdG8gdGhlCi0gICAgICogPGNvZGU+RGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlPC9jb2RlPgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbXBvc2l0ZSAtIDxjb2RlPkRlc2NyaXB0aW9uQnVpbGRlcmNvbXBvc2l0ZTwvY29kZT4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYXR0YWNoQmluZGluZ1R5cGVBbm5vdGF0aW9uKERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLSAgICAgICAgQmluZGluZ1R5cGUgYmluZGluZ1R5cGUgPSAoQmluZGluZ1R5cGUpQ29udmVydGVyVXRpbHMuZ2V0QW5ub3RhdGlvbigKLSAgICAgICAgICAgICAgICBCaW5kaW5nVHlwZS5jbGFzcywgc2VydmljZUNsYXNzKTsKLSAgICAgICAgaWYgKGJpbmRpbmdUeXBlICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIEF0dGFjaCBAQmluZGluZ1R5cGUgYW5ub3RhdGlvbiBkYXRhCi0gICAgICAgICAgICBCaW5kaW5nVHlwZUFubm90IGJ0QW5ub3QgPSBCaW5kaW5nVHlwZUFubm90LmNyZWF0ZUJpbmRpbmdUeXBlQW5ub3RJbXBsKCk7Ci0gICAgICAgICAgICBidEFubm90LnNldFZhbHVlKGJpbmRpbmdUeXBlLnZhbHVlKCkpOwotICAgICAgICAgICAgY29tcG9zaXRlLnNldEJpbmRpbmdUeXBlQW5ub3QoYnRBbm5vdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIHVzZWQgdG8gYXR0YWNoIEBIYW5kbGVyQ2hhaW4gYW5ub3RhdGlvbiBkYXRhIHRvIHRoZQotICAgICAqIDxjb2RlPkRlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZTwvY29kZT4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb21wb3NpdGUgLSA8Y29kZT5EZXNjcmlwdGlvbkJ1aWxkZXJjb21wb3NpdGU8L2NvZGU+Ci0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGF0dGFjaEhhbmRsZXJDaGFpbkFubm90YXRpb24oRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotICAgICAgICBDb252ZXJ0ZXJVdGlscy5hdHRhY2hIYW5kbGVyQ2hhaW5Bbm5vdGF0aW9uKGNvbXBvc2l0ZSwgc2VydmljZUNsYXNzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIHVzZWQgdG8gYXR0YWNoIEBTZXJ2aWNlTW9kZSBhbm5vdGF0aW9uIGRhdGEgdG8gdGhlCi0gICAgICogPGNvZGU+RGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlPC9jb2RlPgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbXBvc2l0ZSAtIDxjb2RlPkRlc2NyaXB0aW9uQnVpbGRlcmNvbXBvc2l0ZTwvY29kZT4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYXR0YWNoU2VydmljZU1vZGVBbm5vdGF0aW9uKERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLSAgICAgICAgU2VydmljZU1vZGUgc2VydmljZU1vZGUgPSAoU2VydmljZU1vZGUpQ29udmVydGVyVXRpbHMuZ2V0QW5ub3RhdGlvbigKLSAgICAgICAgICAgICAgICBTZXJ2aWNlTW9kZS5jbGFzcywgc2VydmljZUNsYXNzKTsKLSAgICAgICAgaWYgKHNlcnZpY2VNb2RlICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIEF0dGFjaCBAU2VydmljZU1vZGUgYW5ub3RhdGVkIGRhdGEKLSAgICAgICAgICAgIFNlcnZpY2VNb2RlQW5ub3Qgc21Bbm5vdCA9IFNlcnZpY2VNb2RlQW5ub3QuY3JlYXRlV2ViU2VydmljZUFubm90SW1wbCgpOwotICAgICAgICAgICAgc21Bbm5vdC5zZXRWYWx1ZShzZXJ2aWNlTW9kZS52YWx1ZSgpKTsKLSAgICAgICAgICAgIGNvbXBvc2l0ZS5zZXRTZXJ2aWNlTW9kZUFubm90KHNtQW5ub3QpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2Qgd2lsbCBiZSB1c2VkIHRvIGRyaXZlIHRoZSBzZXR0aW5nIG9mIEBTT0FQQmluZGluZyBhbm5vdGF0aW9uIGRhdGEgdG8gdGhlCi0gICAgICogPGNvZGU+RGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlPC9jb2RlPgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbXBvc2l0ZSAtIDxjb2RlPkRlc2NyaXB0aW9uQnVpbGRlcmNvbXBvc2l0ZTwvY29kZT4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYXR0YWNoU29hcEJpbmRpbmdBbm5vdGF0aW9uKERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLSAgICAgICAgQ29udmVydGVyVXRpbHMuYXR0YWNoU29hcEJpbmRpbmdBbm5vdGF0aW9uKGNvbXBvc2l0ZSwgc2VydmljZUNsYXNzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIHVzZWQgdG8gYXR0YWNoIEBXZWJGYXVsdCBhbm5vdGF0aW9uIGRhdGEgdG8gdGhlCi0gICAgICogPGNvZGU+RGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlPC9jb2RlPgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbXBvc2l0ZSAtIDxjb2RlPkRlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZTwvY29kZT4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYXR0YWNoV2ViRmF1bHRBbm5vdGF0aW9uKERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLSAgICAgICAgV2ViRmF1bHQgd2ViRmF1bHQgPSAoV2ViRmF1bHQpQ29udmVydGVyVXRpbHMuZ2V0QW5ub3RhdGlvbigKLSAgICAgICAgICAgICAgICBXZWJGYXVsdC5jbGFzcywgc2VydmljZUNsYXNzKTsKLSAgICAgICAgaWYgKHdlYkZhdWx0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIFdlYkZhdWx0QW5ub3Qgd2ViRmF1bHRBbm5vdCA9IFdlYkZhdWx0QW5ub3QuY3JlYXRlV2ViRmF1bHRBbm5vdEltcGwoKTsKLSAgICAgICAgICAgIHdlYkZhdWx0QW5ub3Quc2V0RmF1bHRCZWFuKHdlYkZhdWx0LmZhdWx0QmVhbigpKTsKLSAgICAgICAgICAgIHdlYkZhdWx0QW5ub3Quc2V0TmFtZSh3ZWJGYXVsdC5uYW1lKCkpOwotICAgICAgICAgICAgd2ViRmF1bHRBbm5vdC5zZXRUYXJnZXROYW1lc3BhY2Uod2ViRmF1bHQudGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICAgICAgY29tcG9zaXRlLnNldFdlYkZhdWx0QW5ub3Qod2ViRmF1bHRBbm5vdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIHVzZWQgdG8gYXR0YWNoIEBXZWJTZXJ2aWNlUmVmcyBhbm5vdGF0aW9uIGRhdGEgdG8gdGhlCi0gICAgICogPGNvZGU+RGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlPC9jb2RlPgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbXBvc2l0ZSAtIDxjb2RlPkRlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZTwvY29kZT4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYXR0YWNoV2ViU2VydmljZVJlZnNBbm5vdGF0aW9uKERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLSAgICAgICAgV2ViU2VydmljZVJlZnMgd2ViU2VydmljZVJlZnMgPSAoV2ViU2VydmljZVJlZnMpQ29udmVydGVyVXRpbHMuZ2V0QW5ub3RhdGlvbigKLSAgICAgICAgICAgICAgICBXZWJTZXJ2aWNlUmVmcy5jbGFzcywgc2VydmljZUNsYXNzKTsKLSAgICAgICAgaWYgKHdlYlNlcnZpY2VSZWZzICE9IG51bGwpIHsKLSAgICAgICAgICAgIFdlYlNlcnZpY2VSZWZbXSByZWZzID0gd2ViU2VydmljZVJlZnMudmFsdWUoKTsKLSAgICAgICAgICAgIGZvciAoV2ViU2VydmljZVJlZiByZWYgOiByZWZzKSB7Ci0gICAgICAgICAgICAgICAgV2ViU2VydmljZVJlZkFubm90IHdzckFubm90ID0gQ29udmVydGVyVXRpbHMuY3JlYXRlV2ViU2VydmljZVJlZkFubm90KAotICAgICAgICAgICAgICAgICAgICAgICAgcmVmKTsKLSAgICAgICAgICAgICAgICBjb21wb3NpdGUuc2V0V2ViU2VydmljZVJlZkFubm90KHdzckFubm90KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgYmUgdXNlZCB0byBkcml2ZSB0aGUgc2V0dGluZyBvZiBAV2ViU2VydmljZVJlZiBhbm5vdGF0aW9uIGRhdGEgdG8gdGhlCi0gICAgICogPGNvZGU+RGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlPC9jb2RlPgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbXBvc2l0ZSAtIDxjb2RlPkRlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZTwvY29kZT4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYXR0YWNoV2ViU2VydmljZVJlZkFubm90YXRpb24oRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotICAgICAgICBDb252ZXJ0ZXJVdGlscy5hdHRhY2hXZWJTZXJ2aWNlUmVmQW5ub3RhdGlvbihjb21wb3NpdGUsIHNlcnZpY2VDbGFzcyk7Ci0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogRmluZHMgdGhlIGxpc3Qgb2YgV2ViU2VydmljZUZlYXR1cmVBbm5vdGF0aW9uIGluc3RhbmNlcywgYW5kIHNldCB0aGVtIG9uIHRoZSBjb21wb3NpdGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIGNvbXBvc2l0ZQotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBhdHRhY2hXZWJTZXJ2aWNlRmVhdHVyZUFubm90YXRpb25zKERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLSAgICAgICAgTGlzdDxBbm5vdGF0aW9uPiBmZWF0dXJlcyA9IENvbnZlcnRlclV0aWxzLmdldEFubm90YXRpb25zKAotICAgICAgICAgICAgV2ViU2VydmljZUZlYXR1cmVBbm5vdGF0aW9uLmNsYXNzLCBzZXJ2aWNlQ2xhc3MpOyAKLSAgICAgICAgCi0gICAgICAgIGlmIChmZWF0dXJlcy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlRoZXJlIHdlcmUgWyIgKyBmZWF0dXJlcy5zaXplKCkgKyAiXSBXZWJTZXJ2aWNlRmVhdHVyZSBhbm5vdGF0aW9ucyBmb3VuZC4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgY29tcG9zaXRlLnNldFdlYlNlcnZpY2VGZWF0dXJlcyhmZWF0dXJlcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZXN0YWJsaXNoQ2xhc3NIaWVyYXJjaHkoQ2xhc3Mgcm9vdENsYXNzKSB7Ci0gICAgICAgIGNsYXNzZXMuYWRkKHJvb3RDbGFzcyk7Ci0gICAgICAgIGlmIChyb290Q2xhc3MuZ2V0U3VwZXJjbGFzcygpICE9IG51bGwgJiYgIXJvb3RDbGFzcy5nZXRTdXBlcmNsYXNzKCkuZ2V0TmFtZSgpLgotICAgICAgICAgICAgICAgIGVxdWFscygiamF2YS5sYW5nLk9iamVjdCIpKSB7Ci0gICAgICAgICAgICBjbGFzc2VzLmFkZChyb290Q2xhc3MuZ2V0U3VwZXJjbGFzcygpKTsKLSAgICAgICAgICAgIGVzdGFibGlzaEludGVyZmFjZUhpZXJhcmNoeShyb290Q2xhc3MuZ2V0U3VwZXJjbGFzcygpLmdldEludGVyZmFjZXMoKSk7Ci0gICAgICAgICAgICBlc3RhYmxpc2hDbGFzc0hpZXJhcmNoeShyb290Q2xhc3MuZ2V0U3VwZXJjbGFzcygpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBlc3RhYmxpc2hJbnRlcmZhY2VIaWVyYXJjaHkoQ2xhc3NbXSBpbnRlcmZhY2VzKSB7Ci0gICAgICAgIGlmIChpbnRlcmZhY2VzLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgIGZvciAoQ2xhc3MgaW50ZXIgOiBpbnRlcmZhY2VzKSB7Ci0gICAgICAgICAgICAgICAgY2xhc3Nlcy5hZGQoaW50ZXIpOwotICAgICAgICAgICAgICAgIGVzdGFibGlzaEludGVyZmFjZUhpZXJhcmNoeShpbnRlci5nZXRJbnRlcmZhY2VzKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhbnkgY2hlY2tlZCBleGNlcHRpb25zIChpLmUuIGRlY2xhcmVkIG9uIGEgbWV0aG9kIHZpYSBhIHRocm93cyBjbGF1c2UpCi0gICAgICogdG8gdGhlIGxpc3Qgb2YgY2xhc3NlcyBmb3Igd2hpY2ggYSBEQkMgbmVlZHMgdG8gYmUgYnVpbHQuCi0gICAgICogQHBhcmFtIHJvb3RDbGFzcwotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBlc3RhYmxpc2hFeGNlcHRpb25DbGFzc2VzKGZpbmFsIENsYXNzIHJvb3RDbGFzcykgewotICAgICAgICBNZXRob2RbXSBtZXRob2RzID0gKE1ldGhvZFtdKSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgKLSAgICAgICAgICAgICAgICBuZXcgUHJpdmlsZWdlZEFjdGlvbigpIHsKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcm9vdENsYXNzLmdldE1ldGhvZHMoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgKTsKLSAgICAgICAgZm9yIChNZXRob2QgbWV0aG9kIDogbWV0aG9kcykgewotICAgICAgICAgICAgQ2xhc3NbXSBleGNlcHRpb25DbGFzc2VzID0gbWV0aG9kLmdldEV4Y2VwdGlvblR5cGVzKCk7Ci0gICAgICAgICAgICBpZiAoZXhjZXB0aW9uQ2xhc3Nlcy5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChDbGFzcyBjaGVja2VkRXhjZXB0aW9uIDogZXhjZXB0aW9uQ2xhc3NlcykgewotICAgICAgICAgICAgICAgICAgICBjbGFzc2VzLmFkZChjaGVja2VkRXhjZXB0aW9uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9jb252ZXJ0ZXIvSmF2YUZpZWxkc1RvRkRDQ29udmVydGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9idWlsZGVyL2NvbnZlcnRlci9KYXZhRmllbGRzVG9GRENDb252ZXJ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM1NjE4My4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9idWlsZGVyL2NvbnZlcnRlci9KYXZhRmllbGRzVG9GRENDb252ZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLmNvbnZlcnRlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5GaWVsZERlc2NyaXB0aW9uQ29tcG9zaXRlOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqIFRoaXMgY2xhc3Mgd2lsbCBiZSB1c2VkIHRvIGNvbnZlcnQgSmF2YSBGaWVsZHMgaW50byBGaWVsZERlc2NyaXB0aW9uQ29tcG9zaXRlIG9iamVjdHMuICovCi1wdWJsaWMgY2xhc3MgSmF2YUZpZWxkc1RvRkRDQ29udmVydGVyIHsKLQotICAgIHByaXZhdGUgRmllbGRbXSBmaWVsZHM7Ci0KLSAgICBwdWJsaWMgSmF2YUZpZWxkc1RvRkRDQ29udmVydGVyKEZpZWxkW10gZmllbGRzKSB7Ci0gICAgICAgIHRoaXMuZmllbGRzID0gZmllbGRzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIHRvIGNyZWF0ZSA8Y29kZT5GaWVsZERlc2NyaXB0aW9uQ29tcG9zaXRlPC9jb2RlPiBvYmplY3RzIGZvciBwdWJsaWMKLSAgICAgKiBmaWVsZHMgaW4gYSBnaXZlbiBDbGFzcy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gLSA8Y29kZT5MaXN0PC9jb2RlPgotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PEZpZWxkRGVzY3JpcHRpb25Db21wb3NpdGU+IGNvbnZlcnRGaWVsZHMoKSB7Ci0gICAgICAgIExpc3Q8RmllbGREZXNjcmlwdGlvbkNvbXBvc2l0ZT4gZmRjTGlzdCA9IG5ldwotICAgICAgICAgICAgICAgIEFycmF5TGlzdDxGaWVsZERlc2NyaXB0aW9uQ29tcG9zaXRlPigpOwotICAgICAgICBmb3IgKEZpZWxkIGZpZWxkIDogZmllbGRzKSB7Ci0gICAgICAgICAgICBGaWVsZERlc2NyaXB0aW9uQ29tcG9zaXRlIGZkYyA9IG5ldyBGaWVsZERlc2NyaXB0aW9uQ29tcG9zaXRlKCk7Ci0gICAgICAgICAgICBmZGMuc2V0RmllbGROYW1lKGZpZWxkLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICBmZGMuc2V0TW9kaWZpZXJUeXBlKE1vZGlmaWVyLnRvU3RyaW5nKGZpZWxkLmdldE1vZGlmaWVycygpKSk7Ci0gICAgICAgICAgICBhdHRhY2hIYW5kbGVyQ2hhaW5Bbm5vdGF0aW9uKGZkYywgZmllbGQpOwotICAgICAgICAgICAgYXR0YWNoV2ViU2VydmljZVJlZkFubm90YXRpb24oZmRjLCBmaWVsZCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZkY0xpc3Q7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2Qgd2lsbCBkcml2ZSB0aGUgY2FsbCB0byBhdHRhY2ggQEhhbmRsZXJDaGFpbiBhbm5vdGF0aW9uIGRhdGEgaWYgaXQgaXMgZm91bmQgb24gdGhlCi0gICAgICogRmllbGQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZmRjICAgLSA8Y29kZT5GaWVsZERlc2NyaXB0aW9uQ29tcG9zaXRlPC9jb2RlPgotICAgICAqIEBwYXJhbSBmaWVsZCAtIDxjb2RlPkZpZWxkPC9jb2RlPgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBhdHRhY2hIYW5kbGVyQ2hhaW5Bbm5vdGF0aW9uKEZpZWxkRGVzY3JpcHRpb25Db21wb3NpdGUgZmRjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkIGZpZWxkKSB7Ci0gICAgICAgIENvbnZlcnRlclV0aWxzLmF0dGFjaEhhbmRsZXJDaGFpbkFubm90YXRpb24oZmRjLCBmaWVsZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2Qgd2lsbCBkcml2ZSB0aGUgY2FsbCB0byBhdHRhY2ggQFdlYlNlcnZpY2VSZWYgYW5ub3RhdGlvbiBkYXRhCi0gICAgICogaWYgaXQgaXMgZm91bmQgb24gdGhlIEZpZWxkLgotICAgICAqIEBwYXJhbSBmZGMgLSA8Y29kZT5GaWVsZERlc2NyaXB0aW9uQ29tcG9zaXRlPC9jb2RlPgotICAgICAqIEBwYXJhbSBmaWVsZCAtIDxjb2RlPkZpZWxkPC9jb2RlPgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBhdHRhY2hXZWJTZXJ2aWNlUmVmQW5ub3RhdGlvbihGaWVsZERlc2NyaXB0aW9uQ29tcG9zaXRlIGZkYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmllbGQgZmllbGQpIHsKLSAgICAgICAgQ29udmVydGVyVXRpbHMuYXR0YWNoV2ViU2VydmljZVJlZkFubm90YXRpb24oZmRjLCBmaWVsZCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9jb252ZXJ0ZXIvSmF2YU1ldGhvZHNUb01EQ0NvbnZlcnRlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9jb252ZXJ0ZXIvSmF2YU1ldGhvZHNUb01EQ0NvbnZlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWRiZjAxLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2J1aWxkZXIvY29udmVydGVyL0phdmFNZXRob2RzVG9NRENDb252ZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5jb252ZXJ0ZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuQWN0aW9uQW5ub3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLkZhdWx0QWN0aW9uQW5ub3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLk1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5QYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuUmVxdWVzdFdyYXBwZXJBbm5vdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuUmVzcG9uc2VXcmFwcGVyQW5ub3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLldlYkVuZHBvaW50QW5ub3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLldlYk1ldGhvZEFubm90OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5XZWJSZXN1bHRBbm5vdDsKLQotaW1wb3J0IGphdmF4Lmp3cy5PbmV3YXk7Ci1pbXBvcnQgamF2YXguandzLldlYk1ldGhvZDsKLWltcG9ydCBqYXZheC5qd3MuV2ViUmVzdWx0OwotaW1wb3J0IGphdmF4LnhtbC53cy5BY3Rpb247Ci1pbXBvcnQgamF2YXgueG1sLndzLkZhdWx0QWN0aW9uOwotaW1wb3J0IGphdmF4LnhtbC53cy5SZXF1ZXN0V3JhcHBlcjsKLWltcG9ydCBqYXZheC54bWwud3MuUmVzcG9uc2VXcmFwcGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJFbmRwb2ludDsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuUGFyYW1ldGVyaXplZFR5cGU7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1wdWJsaWMgY2xhc3MgSmF2YU1ldGhvZHNUb01EQ0NvbnZlcnRlciB7Ci0KLSAgICBwcml2YXRlIE1ldGhvZFtdIG1ldGhvZHM7Ci0gICAgcHJpdmF0ZSBDb25zdHJ1Y3RvcltdIGNvbnN0cnVjdG9yczsKLSAgICBwcml2YXRlIFN0cmluZyBkZWNsYXJpbmdDbGFzczsKLQotICAgIHB1YmxpYyBKYXZhTWV0aG9kc1RvTURDQ29udmVydGVyKE1ldGhvZFtdIG1ldGhvZHMsIENvbnN0cnVjdG9yW10gY29uc3RydWN0b3JzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBkZWNsYXJpbmdDbGFzcykgewotICAgICAgICB0aGlzLm1ldGhvZHMgPSBtZXRob2RzOwotICAgICAgICB0aGlzLmNvbnN0cnVjdG9ycyA9IGNvbnN0cnVjdG9yczsKLSAgICAgICAgdGhpcy5kZWNsYXJpbmdDbGFzcyA9IGRlY2xhcmluZ0NsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgd2lsbCBkcml2ZSB0aGUgY3JlYXRpb24gb2YgYSA8Y29kZT5NZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZTwvY29kZT4gZm9yIGV2ZXJ5IHB1YmxpYyAKLSAgICAgKiBKYXZhIE1ldGhvZCBpbiB0aGUgbWV0aG9kcyBhcnJheSBhbmQgZXZlcnkgSmF2YSBDb25zdHJ1Y3RvciBpbiB0aGUgY29uc3RydWN0b3JzIGFycmF5LgotICAgICAqCi0gICAgICogQHJldHVybiAtIDxjb2RlPkxpc3Q8L2NvZGU+Ci0gICAgICovCi0gICAgcHVibGljIExpc3Q8TWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGU+IGNvbnZlcnRNZXRob2RzKCkgewotICAgICAgICBMaXN0PE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlPiBtZGNMaXN0ID0gbmV3Ci0gICAgICAgICAgICAgICAgQXJyYXlMaXN0PE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlPigpOwotICAgICAgICBmb3IgKE1ldGhvZCBtZXRob2QgOiBtZXRob2RzKSB7Ci0gICAgICAgICAgICBpZiAoIUNvbnZlcnRlclV0aWxzLmlzSW5oZXJpdGVkKG1ldGhvZCwgZGVjbGFyaW5nQ2xhc3MpIAotICAgICAgICAgICAgICAgICYmIE1vZGlmaWVyLmlzUHVibGljKG1ldGhvZC5nZXRNb2RpZmllcnMoKSkpIHsKLSAgICAgICAgICAgICAgICBNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSBtZGMgPSBuZXcgTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUoKTsKLSAgICAgICAgICAgICAgICBzZXRFeGNlcHRpb25MaXN0KG1kYywgbWV0aG9kKTsKLSAgICAgICAgICAgICAgICBtZGMuc2V0TWV0aG9kTmFtZShtZXRob2QuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICBzZXRSZXR1cm5UeXBlKG1kYywgbWV0aG9kKTsKLSAgICAgICAgICAgICAgICBzZXRJc0xpc3RUeXBlKG1kYywgbWV0aG9kKTsKLSAgICAgICAgICAgICAgICBtZGMuc2V0RGVjbGFyaW5nQ2xhc3MobWV0aG9kLmdldERlY2xhcmluZ0NsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICBhdHRhY2hIYW5kbGVyQ2hhaW5Bbm5vdGF0aW9uKG1kYywgbWV0aG9kKTsKLSAgICAgICAgICAgICAgICBhdHRhY2hPbmV3YXlBbm5vdGF0aW9uKG1kYywgbWV0aG9kKTsKLSAgICAgICAgICAgICAgICBhdHRhY2hTb2FwQmluZGluZ0Fubm90YXRpb24obWRjLCBtZXRob2QpOwotICAgICAgICAgICAgICAgIGF0dGFjaFJlcXVlc3RXcmFwcGVyQW5ub3RhdGlvbihtZGMsIG1ldGhvZCk7Ci0gICAgICAgICAgICAgICAgYXR0YWNoUmVzcG9uc2VXcmFwcGVyQW5ub3RhdGlvbihtZGMsIG1ldGhvZCk7Ci0gICAgICAgICAgICAgICAgYXR0YWNoV2ViRW5kcG9pbnRBbm5vdGF0aW9uKG1kYywgbWV0aG9kKTsKLSAgICAgICAgICAgICAgICBhdHRhY2hXZWJNZXRob2RBbm5vdGF0aW9uKG1kYywgbWV0aG9kKTsKLSAgICAgICAgICAgICAgICBhdHRhY2hXZWJSZXN1bHRBbm5vdGF0aW9uKG1kYywgbWV0aG9kKTsKLSAgICAgICAgICAgICAgICBhdHRhY2hXZWJTZXJ2aWNlUmVmQW5ub3RhdGlvbihtZGMsIG1ldGhvZCk7Ci0gICAgICAgICAgICAgICAgYXR0YWNoQWN0aW9uQW5ub3RhdGlvbihtZGMsIG1ldGhvZCk7Ci0gICAgICAgICAgICAgICAgaWYgKG1ldGhvZC5nZXRHZW5lcmljUGFyYW1ldGVyVHlwZXMoKS5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIEphdmFQYXJhbVRvUERDQ29udmVydGVyIHBhcmFtQ29udmVydGVyID0gbmV3IEphdmFQYXJhbVRvUERDQ29udmVydGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZC5nZXRHZW5lcmljUGFyYW1ldGVyVHlwZXMoKSwgbWV0aG9kLmdldFBhcmFtZXRlckFubm90YXRpb25zKCkpOwotICAgICAgICAgICAgICAgICAgICBMaXN0PFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlPiBwZGNMaXN0ID0gcGFyYW1Db252ZXJ0ZXIuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydFBhcmFtcygpOwotICAgICAgICAgICAgICAgICAgICBDb252ZXJ0ZXJVdGlscy5hdHRhY2hQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZXMocGRjTGlzdCwgbWRjKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbWRjTGlzdC5hZGQobWRjKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoQ29uc3RydWN0b3IgY29uc3RydWN0b3IgOiBjb25zdHJ1Y3RvcnMpIHsKLSAgICAgICAgICAgIE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlIG1kYyA9IG5ldyBNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSgpOwotICAgICAgICAgICAgbWRjLnNldE1ldGhvZE5hbWUoIjxpbml0PiIpOwotICAgICAgICAgICAgbWRjLnNldERlY2xhcmluZ0NsYXNzKGNvbnN0cnVjdG9yLmdldERlY2xhcmluZ0NsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIG1kY0xpc3QuYWRkKG1kYyk7Ci0gICAgICAgICAgICBpZiAoY29uc3RydWN0b3IuZ2V0R2VuZXJpY1BhcmFtZXRlclR5cGVzKCkubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgICAgIEphdmFQYXJhbVRvUERDQ29udmVydGVyIHBhcmFtQ29udmVydGVyID0gbmV3IEphdmFQYXJhbVRvUERDQ29udmVydGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IuZ2V0R2VuZXJpY1BhcmFtZXRlclR5cGVzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3Rvci5nZXRQYXJhbWV0ZXJBbm5vdGF0aW9ucygpKTsKLSAgICAgICAgICAgICAgICBMaXN0PFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlPiBwZGNMaXN0ID0gcGFyYW1Db252ZXJ0ZXIuCi0gICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0UGFyYW1zKCk7Ci0gICAgICAgICAgICAgICAgQ29udmVydGVyVXRpbHMuYXR0YWNoUGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGVzKHBkY0xpc3QsIG1kYyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbWRjTGlzdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCBhdHRhY2hlcyB0aGUgbGlzdCBvZiBleGNlcHRpb25zIGZvciBhIEphdmEgTWV0aG9kIHRvIHRoZQotICAgICAqIDxjb2RlPk1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlPC9jb2RlPgotICAgICAqCi0gICAgICogQHBhcmFtIG1kYyAgICAtIDxjb2RlPk1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlPC9jb2RlPgotICAgICAqIEBwYXJhbSBtZXRob2QgLSA8Y29kZT5NZXRob2Q8L2NvZGU+Ci0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHNldEV4Y2VwdGlvbkxpc3QoTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUgbWRjLCBNZXRob2QgbWV0aG9kKSB7Ci0gICAgICAgIGlmIChtZXRob2QuZ2V0RXhjZXB0aW9uVHlwZXMoKS5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICBUeXBlW10gZXhjZXB0aW9uVHlwZXMgPSBtZXRob2QuZ2V0R2VuZXJpY0V4Y2VwdGlvblR5cGVzKCk7Ci0gICAgICAgICAgICBTdHJpbmdbXSBleGNlcHRpb25zID0gbmV3IFN0cmluZ1tleGNlcHRpb25UeXBlcy5sZW5ndGhdOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleGNlcHRpb25UeXBlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIFR5cGUgdHlwZSA9IGV4Y2VwdGlvblR5cGVzW2ldOwotICAgICAgICAgICAgICAgIGlmICh0eXBlIGluc3RhbmNlb2YgUGFyYW1ldGVyaXplZFR5cGUpIHsKLSAgICAgICAgICAgICAgICAgICAgUGFyYW1ldGVyaXplZFR5cGUgcHQgPSAoUGFyYW1ldGVyaXplZFR5cGUpdHlwZTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZ1bGxUeXBlID0gIiI7Ci0gICAgICAgICAgICAgICAgICAgIGZ1bGxUeXBlID0gQ29udmVydGVyVXRpbHMuZ2V0RnVsbFR5cGUocHQsIGZ1bGxUeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uc1tpXSA9IGZ1bGxUeXBlOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSBpbnN0YW5jZW9mIENsYXNzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbnNbaV0gPSAoKENsYXNzKXR5cGUpLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtZGMuc2V0RXhjZXB0aW9ucyhleGNlcHRpb25zKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgZHJpdmUgdGhlIGF0dGFjaG1lbnQgb2YgQEhhbmRsZXJDaGFpbiBhbm5vdGF0aW9uIGRhdGEgdG8gdGhlCi0gICAgICogPGNvZGU+TWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGU8L2NvZGU+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbWRjICAgIC0gPGNvZGU+TWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGU8L2NvZGU+Ci0gICAgICogQHBhcmFtIG1ldGhvZCAtIDxjb2RlPk1ldGhvZDwvY29kZT4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYXR0YWNoSGFuZGxlckNoYWluQW5ub3RhdGlvbihNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSBtZGMsIE1ldGhvZAotICAgICAgICAgICAgbWV0aG9kKSB7Ci0gICAgICAgIENvbnZlcnRlclV0aWxzLmF0dGFjaEhhbmRsZXJDaGFpbkFubm90YXRpb24obWRjLCBtZXRob2QpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgYmUgdXNlZCB0byBkcml2ZSB0aGUgc2V0dGluZyBvZiBAU09BUEJpbmRpbmcgYW5ub3RhdGlvbiBkYXRhIHRvIHRoZQotICAgICAqIDxjb2RlPk1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlPC9jb2RlPgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbXBvc2l0ZSAtIDxjb2RlPk1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlPC9jb2RlPgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBhdHRhY2hTb2FwQmluZGluZ0Fubm90YXRpb24oTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUgbWRjLCBNZXRob2QgbWV0aG9kKSB7Ci0gICAgICAgIENvbnZlcnRlclV0aWxzLmF0dGFjaFNvYXBCaW5kaW5nQW5ub3RhdGlvbihtZGMsIG1ldGhvZCk7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGRyaXZlIHRoZSBhdHRhY2htZW50IG9mIEBPbmV3YXkgYW5ub3RhdGlvbiBkYXRhIHRvIHRoZQotICAgICAqIDxjb2RlPk1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlPC9jb2RlPgotICAgICAqCi0gICAgICogQHBhcmFtIG1kYyAgICAtIDxjb2RlPk1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlPC9jb2RlPgotICAgICAqIEBwYXJhbSBtZXRob2QgLSA8Y29kZT5NZXRob2Q8L2NvZGU+Ci0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGF0dGFjaE9uZXdheUFubm90YXRpb24oTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUgbWRjLCBNZXRob2QKLSAgICAgICAgICAgIG1ldGhvZCkgewotICAgICAgICBPbmV3YXkgb25ld2F5ID0gKE9uZXdheSlDb252ZXJ0ZXJVdGlscy5nZXRBbm5vdGF0aW9uKE9uZXdheS5jbGFzcywgbWV0aG9kKTsKLSAgICAgICAgaWYgKG9uZXdheSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtZGMuc2V0T25lV2F5QW5ub3QodHJ1ZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtZGMuc2V0T25lV2F5QW5ub3QoZmFsc2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2Qgd2lsbCBkcml2ZSB0aGUgYXR0YWNobWVudCBvZiBAUmVxdWVzdFdyYXBwZXIgYW5ub3RhdGlvbiBkYXRhIHRvIHRoZQotICAgICAqIDxjb2RlPk1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlPC9jb2RlPgotICAgICAqCi0gICAgICogQHBhcmFtIG1kYyAgICAtIDxjb2RlPk1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlPC9jb2RlPgotICAgICAqIEBwYXJhbSBtZXRob2QgLSA8Y29kZT5NZXRob2Q8L2NvZGU+Ci0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGF0dGFjaFJlcXVlc3RXcmFwcGVyQW5ub3RhdGlvbihNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSBtZGMsIE1ldGhvZAotICAgICAgICAgICAgbWV0aG9kKSB7Ci0gICAgICAgIFJlcXVlc3RXcmFwcGVyIHJlcXVlc3RXcmFwcGVyID0gKFJlcXVlc3RXcmFwcGVyKUNvbnZlcnRlclV0aWxzLmdldEFubm90YXRpb24oCi0gICAgICAgICAgICAgICAgUmVxdWVzdFdyYXBwZXIuY2xhc3MsIG1ldGhvZCk7Ci0gICAgICAgIGlmIChyZXF1ZXN0V3JhcHBlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBSZXF1ZXN0V3JhcHBlckFubm90IHJ3QW5ub3QgPSBSZXF1ZXN0V3JhcHBlckFubm90LmNyZWF0ZVJlcXVlc3RXcmFwcGVyQW5ub3RJbXBsKCk7Ci0gICAgICAgICAgICByd0Fubm90LnNldENsYXNzTmFtZShyZXF1ZXN0V3JhcHBlci5jbGFzc05hbWUoKSk7Ci0gICAgICAgICAgICByd0Fubm90LnNldExvY2FsTmFtZShyZXF1ZXN0V3JhcHBlci5sb2NhbE5hbWUoKSk7Ci0gICAgICAgICAgICByd0Fubm90LnNldFRhcmdldE5hbWVzcGFjZShyZXF1ZXN0V3JhcHBlci50YXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgICAgICBtZGMuc2V0UmVxdWVzdFdyYXBwZXJBbm5vdChyd0Fubm90KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgZHJpdmUgdGhlIGF0dGFjaG1lbnQgb2YgQFJlc3BvbmVXcmFwcGVyIGFubm90YXRpb24gZGF0YSB0byB0aGUKLSAgICAgKiA8Y29kZT5NZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZTwvY29kZT4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtZGMgICAgLSA8Y29kZT5NZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZTwvY29kZT4KLSAgICAgKiBAcGFyYW0gbWV0aG9kIC0gPGNvZGU+TWV0aG9kPC9jb2RlPgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBhdHRhY2hSZXNwb25zZVdyYXBwZXJBbm5vdGF0aW9uKE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlIG1kYywgTWV0aG9kCi0gICAgICAgICAgICBtZXRob2QpIHsKLSAgICAgICAgUmVzcG9uc2VXcmFwcGVyIHJlc3BvbnNlV3JhcHBlciA9IChSZXNwb25zZVdyYXBwZXIpQ29udmVydGVyVXRpbHMuZ2V0QW5ub3RhdGlvbigKLSAgICAgICAgICAgICAgICBSZXNwb25zZVdyYXBwZXIuY2xhc3MsIG1ldGhvZCk7Ci0gICAgICAgIGlmIChyZXNwb25zZVdyYXBwZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgUmVzcG9uc2VXcmFwcGVyQW5ub3QgcndBbm5vdCA9IFJlc3BvbnNlV3JhcHBlckFubm90LmNyZWF0ZVJlc3BvbnNlV3JhcHBlckFubm90SW1wbCgpOwotICAgICAgICAgICAgcndBbm5vdC5zZXRDbGFzc05hbWUocmVzcG9uc2VXcmFwcGVyLmNsYXNzTmFtZSgpKTsKLSAgICAgICAgICAgIHJ3QW5ub3Quc2V0TG9jYWxOYW1lKHJlc3BvbnNlV3JhcHBlci5sb2NhbE5hbWUoKSk7Ci0gICAgICAgICAgICByd0Fubm90LnNldFRhcmdldE5hbWVzcGFjZShyZXNwb25zZVdyYXBwZXIudGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICAgICAgbWRjLnNldFJlc3BvbnNlV3JhcHBlckFubm90KHJ3QW5ub3QpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2Qgd2lsbCBkcml2ZSB0aGUgYXR0YWNobWVudCBvZiBAV2ViRW5kcG9pbnQgYW5ub3RhdGlvbiBkYXRhIHRvIHRoZQotICAgICAqIDxjb2RlPk1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlPC9jb2RlPgotICAgICAqCi0gICAgICogQHBhcmFtIG1kYyAgICAtIDxjb2RlPk1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlPC9jb2RlPgotICAgICAqIEBwYXJhbSBtZXRob2QgLSA8Y29kZT5NZXRob2Q8L2NvZGU+Ci0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGF0dGFjaFdlYkVuZHBvaW50QW5ub3RhdGlvbihNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSBtZGMsIE1ldGhvZAotICAgICAgICAgICAgbWV0aG9kKSB7Ci0gICAgICAgIFdlYkVuZHBvaW50IHdlYkVuZHBvaW50ID0gKFdlYkVuZHBvaW50KUNvbnZlcnRlclV0aWxzLmdldEFubm90YXRpb24oCi0gICAgICAgICAgICAgICAgV2ViRW5kcG9pbnQuY2xhc3MsIG1ldGhvZCk7Ci0gICAgICAgIGlmICh3ZWJFbmRwb2ludCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBXZWJFbmRwb2ludEFubm90IHdlQW5ub3QgPSBXZWJFbmRwb2ludEFubm90LmNyZWF0ZVdlYkVuZHBvaW50QW5ub3RJbXBsKCk7Ci0gICAgICAgICAgICB3ZUFubm90LnNldE5hbWUod2ViRW5kcG9pbnQubmFtZSgpKTsKLSAgICAgICAgICAgIG1kYy5zZXRXZWJFbmRwb2ludEFubm90KHdlQW5ub3QpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2Qgd2lsbCBkcml2ZSB0aGUgYXR0YWNobWVudCBvZiBAV2ViTWV0aG9kIGFubm90YXRpb24gZGF0YSB0byB0aGUKLSAgICAgKiA8Y29kZT5NZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZTwvY29kZT4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtZGMgICAgLSA8Y29kZT5NZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZTwvY29kZT4KLSAgICAgKiBAcGFyYW0gbWV0aG9kIC0gPGNvZGU+TWV0aG9kPC9jb2RlPgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBhdHRhY2hXZWJNZXRob2RBbm5vdGF0aW9uKE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlIG1kYywgTWV0aG9kCi0gICAgICAgICAgICBtZXRob2QpIHsKLSAgICAgICAgV2ViTWV0aG9kIHdlYk1ldGhvZCA9IChXZWJNZXRob2QpQ29udmVydGVyVXRpbHMuZ2V0QW5ub3RhdGlvbihXZWJNZXRob2QuY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kKTsKLSAgICAgICAgaWYgKHdlYk1ldGhvZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBXZWJNZXRob2RBbm5vdCB3bUFubm90ID0gV2ViTWV0aG9kQW5ub3QuY3JlYXRlV2ViTWV0aG9kQW5ub3RJbXBsKCk7Ci0gICAgICAgICAgICB3bUFubm90LnNldEFjdGlvbih3ZWJNZXRob2QuYWN0aW9uKCkpOwotICAgICAgICAgICAgd21Bbm5vdC5zZXRFeGNsdWRlKHdlYk1ldGhvZC5leGNsdWRlKCkpOwotICAgICAgICAgICAgd21Bbm5vdC5zZXRPcGVyYXRpb25OYW1lKHdlYk1ldGhvZC5vcGVyYXRpb25OYW1lKCkpOwotICAgICAgICAgICAgbWRjLnNldFdlYk1ldGhvZEFubm90KHdtQW5ub3QpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2Qgd2lsbCBkcml2ZSB0aGUgYXR0YWNobWVudCBvZiBAV2ViUmVzdWx0IGFubm90YXRpb24gZGF0YSB0byB0aGUKLSAgICAgKiA8Y29kZT5NZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZTwvY29kZT4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtZGMgICAgLSA8Y29kZT5NZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZTwvY29kZT4KLSAgICAgKiBAcGFyYW0gbWV0aG9kIC0gPGNvZGU+TWV0aG9kPC9jb2RlPgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBhdHRhY2hXZWJSZXN1bHRBbm5vdGF0aW9uKE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlIG1kYywgTWV0aG9kCi0gICAgICAgICAgICBtZXRob2QpIHsKLSAgICAgICAgV2ViUmVzdWx0IHdlYlJlc3VsdCA9IChXZWJSZXN1bHQpQ29udmVydGVyVXRpbHMuZ2V0QW5ub3RhdGlvbihXZWJSZXN1bHQuY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kKTsKLSAgICAgICAgaWYgKHdlYlJlc3VsdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBXZWJSZXN1bHRBbm5vdCB3ckFubm90ID0gV2ViUmVzdWx0QW5ub3QuY3JlYXRlV2ViUmVzdWx0QW5ub3RJbXBsKCk7Ci0gICAgICAgICAgICB3ckFubm90LnNldEhlYWRlcih3ZWJSZXN1bHQuaGVhZGVyKCkpOwotICAgICAgICAgICAgd3JBbm5vdC5zZXROYW1lKHdlYlJlc3VsdC5uYW1lKCkpOwotICAgICAgICAgICAgd3JBbm5vdC5zZXRQYXJ0TmFtZSh3ZWJSZXN1bHQucGFydE5hbWUoKSk7Ci0gICAgICAgICAgICB3ckFubm90LnNldFRhcmdldE5hbWVzcGFjZSh3ZWJSZXN1bHQudGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICAgICAgbWRjLnNldFdlYlJlc3VsdEFubm90KHdyQW5ub3QpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2Qgd2lsbCBkcml2ZSB0aGUgYXR0YWNobWVudCBvZiBAV2ViU2VydmljZVJlZiBhbm5vdGF0aW9uIGRhdGEgdG8gdGhlCi0gICAgICogPGNvZGU+TWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGU8L2NvZGU+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbWRjICAgIC0gPGNvZGU+TWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGU8L2NvZGU+Ci0gICAgICogQHBhcmFtIG1ldGhvZCAtIDxjb2RlPk1ldGhvZDwvY29kZT4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYXR0YWNoV2ViU2VydmljZVJlZkFubm90YXRpb24oTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUgbWRjLCBNZXRob2QKLSAgICAgICAgICAgIG1ldGhvZCkgewotICAgICAgICBDb252ZXJ0ZXJVdGlscy5hdHRhY2hXZWJTZXJ2aWNlUmVmQW5ub3RhdGlvbihtZGMsIG1ldGhvZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2Qgd2lsbCBkcml2ZSB0aGUgYXR0YWNobWVudCBvZiBAQWN0aW9uIGFubm90YXRpb24gZGF0YSB0byB0aGUKLSAgICAgKiA8Y29kZT5NZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZTwvY29kZT4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtZGMgICAgLSA8Y29kZT5NZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZTwvY29kZT4KLSAgICAgKiBAcGFyYW0gbWV0aG9kIC0gPGNvZGU+TWV0aG9kPC9jb2RlPgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBhdHRhY2hBY3Rpb25Bbm5vdGF0aW9uKE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlIG1kYywgTWV0aG9kCi0gICAgICAgICAgICBtZXRob2QpIHsKLSAgICAgICAgQWN0aW9uIGFjdGlvbiA9IChBY3Rpb24pQ29udmVydGVyVXRpbHMuZ2V0QW5ub3RhdGlvbihBY3Rpb24uY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kKTsKLSAgICAgICAgaWYgKGFjdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBBY3Rpb25Bbm5vdCBhY3Rpb25Bbm5vdCA9IEFjdGlvbkFubm90LmNyZWF0ZUFjdGlvbkFubm90SW1wbCgpOwotICAgICAgICAgICAgRmF1bHRBY3Rpb25bXSBmYXVsdHMgPSBhY3Rpb24uZmF1bHQoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGZhdWx0cyAhPSBudWxsICYmIGZhdWx0cy5sZW5ndGggIT0gMCkgewotICAgICAgICAgICAgICAgIExpc3Q8RmF1bHRBY3Rpb24+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PEZhdWx0QWN0aW9uPigpOwotICAgICAgICAgICAgICAgIGZvciAoRmF1bHRBY3Rpb24gZmF1bHQgOiBmYXVsdHMpIHsKLSAgICAgICAgICAgICAgICAgICAgRmF1bHRBY3Rpb25Bbm5vdCBmYXVsdEFubm90ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIEZhdWx0QWN0aW9uQW5ub3QuY3JlYXRlRmF1bHRBY3Rpb25Bbm5vdEltcGwoKTsKLSAgICAgICAgICAgICAgICAgICAgZmF1bHRBbm5vdC5zZXRDbGFzc05hbWUoZmF1bHQuY2xhc3NOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICBmYXVsdEFubm90LnNldFZhbHVlKGZhdWx0LnZhbHVlKCkpOwotICAgICAgICAgICAgICAgICAgICBsaXN0LmFkZChmYXVsdEFubm90KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYWN0aW9uQW5ub3Quc2V0RmF1bHQobGlzdC50b0FycmF5KG5ldyBGYXVsdEFjdGlvblswXSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBhY3Rpb25Bbm5vdC5zZXRJbnB1dChhY3Rpb24uaW5wdXQoKSk7Ci0gICAgICAgICAgICBhY3Rpb25Bbm5vdC5zZXRPdXRwdXQoYWN0aW9uLm91dHB1dCgpKTsKLSAgICAgICAgICAgIG1kYy5zZXRBY3Rpb25Bbm5vdChhY3Rpb25Bbm5vdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGRldGVybWluZSB0aGUgcmV0dXJuIHR5cGUgb2YgYSA8Y29kZT5NZXRob2Q8L2NvZGU+IGFuZAotICAgICAqIGF0dGFjaCBpdCB0byBhIDxjb2RlPk1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlPC9jb2RlPiBvYmplY3QuCi0gICAgICogQHBhcmFtIG1kYyAtIDxjb2RlPk1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlPC9jb2RlPgotICAgICAqIEBwYXJhbSBtZXRob2QgLSA8Y29kZT5NZXRob2Q8L2NvZGU+Ci0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHNldFJldHVyblR5cGUoTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUgbWRjLCBNZXRob2QgbWV0aG9kKSB7Ci0gICAgICAgIFR5cGUgdHlwZSA9IG1ldGhvZC5nZXRHZW5lcmljUmV0dXJuVHlwZSgpOwotICAgICAgICBpZiAodHlwZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtZGMuc2V0UmV0dXJuVHlwZSgidm9pZCIpOwotICAgICAgICB9IGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBQYXJhbWV0ZXJpemVkVHlwZSkgewotICAgICAgICAgICAgUGFyYW1ldGVyaXplZFR5cGUgcHQgPSAoUGFyYW1ldGVyaXplZFR5cGUpdHlwZTsKLSAgICAgICAgICAgIFN0cmluZyBmdWxsVHlwZSA9ICIiOwotICAgICAgICAgICAgZnVsbFR5cGUgPSBDb252ZXJ0ZXJVdGlscy5nZXRGdWxsVHlwZShwdCwgZnVsbFR5cGUpOwotICAgICAgICAgICAgbWRjLnNldFJldHVyblR5cGUoZnVsbFR5cGUpOwotICAgICAgICB9IGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBDbGFzcykgewotICAgICAgICAgICAgbWRjLnNldFJldHVyblR5cGUoKChDbGFzcyl0eXBlKS5nZXROYW1lKCkpOwotCQl9Ci0JfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBzZXRJc0xpc3RUeXBlKE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlIG1kYywgTWV0aG9kIG1ldGhvZCkgewotICAgICAgICBtZGMuc2V0SXNMaXN0VHlwZShDb252ZXJ0ZXJVdGlscy5oYXNYbWxMaXN0QW5ub3RhdGlvbihtZXRob2QuZ2V0QW5ub3RhdGlvbnMoKSkpOwotICAgIH0KLSAgICAgICAgCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9idWlsZGVyL2NvbnZlcnRlci9KYXZhUGFyYW1Ub1BEQ0NvbnZlcnRlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9jb252ZXJ0ZXIvSmF2YVBhcmFtVG9QRENDb252ZXJ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDlkNmMxMi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9idWlsZGVyL2NvbnZlcnRlci9KYXZhUGFyYW1Ub1BEQ0NvbnZlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuY29udmVydGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLlBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5XZWJQYXJhbUFubm90OwotCi1pbXBvcnQgamF2YXguandzLldlYlBhcmFtOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1wdWJsaWMgY2xhc3MgSmF2YVBhcmFtVG9QRENDb252ZXJ0ZXIgewotCi0gICAgcHJpdmF0ZSBUeXBlW10gcGFyYW1UeXBlczsKLQotICAgIHByaXZhdGUgQW5ub3RhdGlvbltdW10gcGFyYW1Bbm5vdGF0aW9uczsKLQotICAgIHB1YmxpYyBKYXZhUGFyYW1Ub1BEQ0NvbnZlcnRlcihUeXBlW10gcGFyYW1UeXBlcywgQW5ub3RhdGlvbltdW10gcGFyYW1Bbm5vdGF0aW9ucykgewotICAgICAgICB0aGlzLnBhcmFtVHlwZXMgPSBwYXJhbVR5cGVzOwotICAgICAgICB0aGlzLnBhcmFtQW5ub3RhdGlvbnMgPSBwYXJhbUFubm90YXRpb25zOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlPiBjb252ZXJ0UGFyYW1zKCkgewotICAgICAgICBMaXN0PFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlPiBwZGNMaXN0ID0gbmV3Ci0gICAgICAgICAgICAgICAgQXJyYXlMaXN0PFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlPigpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtVHlwZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlIHBkYyA9IG5ldyBQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZSgpOwotICAgICAgICAgICAgVHlwZSBwYXJhbVR5cGUgPSBwYXJhbVR5cGVzW2ldOwotICAgICAgICAgICAgU3RyaW5nIGZ1bGxUeXBlID0gQ29udmVydGVyVXRpbHMuZ2V0VHlwZShwYXJhbVR5cGUsICIiKTsKLSAgICAgICAgICAgIHBkYy5zZXRQYXJhbWV0ZXJUeXBlKGZ1bGxUeXBlKTsKLSAgICAgICAgICAgIHBkYy5zZXRMaXN0T3JkZXIoaSk7Ci0gICAgICAgICAgICBhdHRhY2hXZWJQYXJhbUFubm90YXRpb24ocGRjLCBpKTsKLSAgICAgICAgICAgIHBkYy5zZXRJc0xpc3RUeXBlKENvbnZlcnRlclV0aWxzLmhhc1htbExpc3RBbm5vdGF0aW9uKHBhcmFtQW5ub3RhdGlvbnNbaV0pKTsKLSAgICAgICAgICAgIHBkY0xpc3QuYWRkKHBkYyk7ICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHBkY0xpc3Q7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGF0dGFjaCBAV2ViUGFyYW0gYW5ub3RhdGlvbiBkYXRhIHRvIHRoZSA8Y29kZT4gUGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGU8L2NvZGU+Ci0gICAgICogaWYgdGhlIGFubm90YXRpb24gd2FzIGZvdW5kIG9uIHRoZSBwYXJhbWV0ZXIgcmVwcmVzZW50ZWQgYnkgdGhpcyBpbmRleCBpbiB0aGUgcGFyYW1ldGVyIGxpc3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGRjICAgLSA8Y29kZT5QYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZTwvY29kZT4KLSAgICAgKiBAcGFyYW0gb3JkZXIgLSB0aGUgY3VycmVudCBpbmRleCBpbiB0aGUgcGFyYW1ldGVyIGxpc3QKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYXR0YWNoV2ViUGFyYW1Bbm5vdGF0aW9uKFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlIHBkYywgaW50IG9yZGVyKSB7Ci0gICAgICAgIEFubm90YXRpb25bXSBvcmRlckFubm90cyA9IHBhcmFtQW5ub3RhdGlvbnNbb3JkZXJdOwotICAgICAgICBmb3IgKEFubm90YXRpb24gYW5ub3QgOiBvcmRlckFubm90cykgewotICAgICAgICAgICAgaWYgKGFubm90IGluc3RhbmNlb2YgV2ViUGFyYW0pIHsKLSAgICAgICAgICAgICAgICBXZWJQYXJhbSB3ZWJQYXJhbSA9IChXZWJQYXJhbSlhbm5vdDsKLSAgICAgICAgICAgICAgICBXZWJQYXJhbUFubm90IHdwQW5ub3QgPSBXZWJQYXJhbUFubm90LmNyZWF0ZVdlYlBhcmFtQW5ub3RJbXBsKCk7Ci0gICAgICAgICAgICAgICAgd3BBbm5vdC5zZXRIZWFkZXIod2ViUGFyYW0uaGVhZGVyKCkpOwotICAgICAgICAgICAgICAgIHdwQW5ub3Quc2V0TW9kZSh3ZWJQYXJhbS5tb2RlKCkpOwotICAgICAgICAgICAgICAgIHdwQW5ub3Quc2V0TmFtZSh3ZWJQYXJhbS5uYW1lKCkpOwotICAgICAgICAgICAgICAgIHdwQW5ub3Quc2V0UGFydE5hbWUod2ViUGFyYW0ucGFydE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgd3BBbm5vdC5zZXRUYXJnZXROYW1lc3BhY2Uod2ViUGFyYW0udGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICAgICAgICAgIHBkYy5zZXRXZWJQYXJhbUFubm90KHdwQW5ub3QpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vaW1wbC9BdHRhY2htZW50RGVzY3JpcHRpb25JbXBsLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9pbXBsL0F0dGFjaG1lbnREZXNjcmlwdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFhMjAzMC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9pbXBsL0F0dGFjaG1lbnREZXNjcmlwdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uaW1wbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5BdHRhY2htZW50VHlwZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLXB1YmxpYyBjbGFzcyBBdHRhY2htZW50RGVzY3JpcHRpb25JbXBsIGltcGxlbWVudHMNCi0gICAgICAgIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uQXR0YWNobWVudERlc2NyaXB0aW9uIHsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEF0dGFjaG1lbnREZXNjcmlwdGlvbkltcGwuY2xhc3MpOw0KLSAgICANCi0gICAgcHJpdmF0ZSBBdHRhY2htZW50VHlwZSBhdHRhY2htZW50VHlwZTsNCi0gICAgcHJpdmF0ZSBTdHJpbmdbXSBtaW1lVHlwZXM7DQotICAgIA0KLSAgICAvKioNCi0gICAgICogQHBhcmFtIGF0dGFjaG1lbnRUeXBlDQotICAgICAqIEBwYXJhbSBtaW1lVHlwZXMNCi0gICAgICovDQotICAgIHB1YmxpYyBBdHRhY2htZW50RGVzY3JpcHRpb25JbXBsKEF0dGFjaG1lbnRUeXBlIGF0dGFjaG1lbnRUeXBlLCBTdHJpbmdbXSBtaW1lVHlwZXMpIHsNCi0gICAgICAgIHRoaXMuYXR0YWNobWVudFR5cGUgPSBhdHRhY2htZW50VHlwZTsNCi0gICAgICAgIHRoaXMubWltZVR5cGVzID0gbWltZVR5cGVzOw0KLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgU3RyaW5nIGRlYnVnU3RyaW5nID0gdG9TdHJpbmcoKTsNCi0gICAgICAgICAgICBsb2cuZGVidWcoIkNyZWF0ZWQgQXR0YWNobWVudERlc2NyaXB0aW9uSW1wbCIpOw0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhkZWJ1Z1N0cmluZyk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIEF0dGFjaG1lbnRUeXBlIGdldEF0dGFjaG1lbnRUeXBlKCkgew0KLSAgICAgICAgcmV0dXJuIGF0dGFjaG1lbnRUeXBlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRNaW1lVHlwZXMoKSB7DQotICAgICAgICByZXR1cm4gbWltZVR5cGVzOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KLSAgICAgICAgZmluYWwgU3RyaW5nIG5ld2xpbmUgPSAiXG4iOw0KLSAgICAgICAgZmluYWwgU3RyaW5nIHNhbWVsaW5lID0gIjsgIjsNCi0gICAgICAgIFN0cmluZ0J1ZmZlciBzdHJpbmcgPSBuZXcgU3RyaW5nQnVmZmVyKCk7DQotICAgICAgICANCi0gICAgICAgIHN0cmluZy5hcHBlbmQoc3VwZXIudG9TdHJpbmcoKSk7DQotICAgICAgICBzdHJpbmcuYXBwZW5kKG5ld2xpbmUpOw0KLSAgICAgICAgc3RyaW5nLmFwcGVuZCgiICBBdHRhY2htZW50IFR5cGU6ICIgKyBnZXRBdHRhY2htZW50VHlwZSgpKTsNCi0gICAgICAgIC8vDQotICAgICAgICBzdHJpbmcuYXBwZW5kKG5ld2xpbmUpOw0KLSAgICAgICAgc3RyaW5nLmFwcGVuZCgiICBNaW1lIFR5cGVzOiAiICsgZ2V0TWltZVR5cGVzKCkpOw0KLSAgICAgICAgcmV0dXJuIHN0cmluZy50b1N0cmluZygpOw0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2ltcGwvRGVzY3JpcHRpb25GYWN0b3J5SW1wbC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vaW1wbC9EZXNjcmlwdGlvbkZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxZTM1MmYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vaW1wbC9EZXNjcmlwdGlvbkZhY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MjUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmltcGw7Ci0KLS8qKgotICogCi0gKi8KLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLm1ldGFkYXRhLlNlcnZpY2VOYW1lOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuQ2xpZW50Q29uZmlndXJhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5FeGNlcHRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRGVzY3JpcHRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRGVzY3JpcHRpb25LZXk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5FbmRwb2ludERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uUmVzb2x2ZWRIYW5kbGVyc0Rlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uU2VydmljZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5EZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLmNvbnZlcnRlci5KYXZhQ2xhc3NUb0RCQ0NvbnZlcnRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLnZhbGlkYXRvci5FbmRwb2ludERlc2NyaXB0aW9uVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24udmFsaWRhdG9yLlNlcnZpY2VEZXNjcmlwdGlvblZhbGlkYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmkxOG4uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKioKLSAqIENyZWF0ZXMgdGhlIEpBWC1XUyBtZXRhZGF0YSBkZXNjcml0cGlvbiBoaWVyYWNoeSBmcm9tIHNvbWUgY29tYmluYXRpb25zIG9mIFdTREwsIEphdmEgY2xhc3NlcwotICogd2l0aCBhbm5vdGF0aW9ucywgYW5kIChpbiB0aGUgZnV0dXJlKSBkZXBsb3ltZW50IGRlc2NyaXB0b3JzLiAgVGhpcyBpcyB0aGUgaW1wbGVtZW50YXRpb24gYW5kIGlzCi0gKiBub3QgaW50ZW5kZWQgdG8gYmUgYSBwdWJsaWMgQVBJLiAgVGhlIEFQSSBpczoKLSAqCi0gKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRGVzY3JpcHRpb25GYWN0b3J5Ci0gKi8KLXB1YmxpYyBjbGFzcyBEZXNjcmlwdGlvbkZhY3RvcnlJbXBsIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coRGVzY3JpcHRpb25GYWN0b3J5SW1wbC5jbGFzcyk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgTWFwPERlc2NyaXB0aW9uS2V5LCBTZXJ2aWNlRGVzY3JpcHRpb24+IGNhY2hlID0KLSAgICAgICAgICAgIG5ldyBIYXNodGFibGU8RGVzY3JpcHRpb25LZXksIFNlcnZpY2VEZXNjcmlwdGlvbj4oKTsKLQotICAgIC8qKiBBIERlc2NycHRpb25GYWN0b3J5IGNhbiBub3QgYmUgaW5zdGFudGlhdGVkOyBhbGwgbWV0aG9kcyBhcmUgc3RhdGljLiAqLwotICAgIHByaXZhdGUgRGVzY3JpcHRpb25GYWN0b3J5SW1wbCgpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRGVzY3JpcHRpb25GYWN0b3J5I2NyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbihVUkwsIFFOYW1lLCBDbGFzcywgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU2VydmljZURlc2NyaXB0aW9uIGNyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbihVUkwgd3NkbFVSTCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFOYW1lIHNlcnZpY2VRTmFtZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzIHNlcnZpY2VDbGFzcykgewotICAgICAgICByZXR1cm4gY3JlYXRlU2VydmljZURlc2NyaXB0aW9uKHdzZGxVUkwsIHNlcnZpY2VRTmFtZSwgc2VydmljZUNsYXNzLCBudWxsLCBudWxsKTsKLSAgICAgICAgCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkRlc2NyaXB0aW9uRmFjdG9yeSNjcmVhdGVTZXJ2aWNlRGVzY3JpcHRpb24oVVJMLAotICAgICAqICAgICAgUU5hbWUsIENsYXNzKQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU2VydmljZURlc2NyaXB0aW9uIGNyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbihVUkwgd3NkbFVSTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUU5hbWUgc2VydmljZVFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyBzZXJ2aWNlQ2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBzcGFyc2VDb21wb3NpdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBzcGFyc2VDb21wb3NpdGVLZXkpIHsKLSAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ29udGV4dCA9IERlc2NyaXB0aW9uRmFjdG9yeS5jcmVhdGVDbGllbnRDb25maWd1cmF0aW9uRmFjdG9yeSgpCi0gICAgICAgICAgICAgICAgLmdldENsaWVudENvbmZpZ3VyYXRpb25Db250ZXh0KCk7Ci0gICAgICAgIERlc2NyaXB0aW9uS2V5IGtleSA9IG5ldyBEZXNjcmlwdGlvbktleShzZXJ2aWNlUU5hbWUsIHdzZGxVUkwsIHNlcnZpY2VDbGFzcywgY29uZmlnQ29udGV4dCk7Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJDYWNoZSBNYXAgPSAiICsgY2FjaGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICBpZiAoa2V5ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJEZXNjcmlwdGlvbiBLZXkgPSAiICsga2V5LnByaW50S2V5KCkpOwotCi0gICAgICAgIH0KLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNlcnZpY2VEZXNjID0gbnVsbDsKLSAgICAgICAgc3luY2hyb25pemVkKGNvbmZpZ0NvbnRleHQpIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ2hlY2sgdG8gc2VlIGlmIFNlcnZpY2VEZXNjcmlwdGlvbiBpcyBmb3VuZCBpbiBjYWNoZSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2VydmljZURlc2MgPSBjYWNoZS5nZXQoa2V5KTsKLQotICAgICAgICAgICAgaWYgKHNlcnZpY2VEZXNjICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJTZXJ2aWNlRGVzY3JpcHRpb24gZm91bmQgaW4gdGhlIGNhY2hlIik7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhzZXJ2aWNlRGVzYy50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc2VydmljZURlc2MgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlNlcnZpY2VEZXNjcmlwdGlvbiBub3QgZm91bmQgaW4gdGhlIGNhY2hlIik7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiIGNyZWF0aW5nIG5ldyBTZXJ2aWNlRGVzY3JpcHRpb25JbXBsIik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgU2VydmljZURlc2NyaXB0aW9uSW1wbCBzZXJ2aWNlRGVzY0ltcGwgPSBudWxsOwotICAgICAgICAgICAgICAgIGlmIChzcGFyc2VDb21wb3NpdGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlRGVzY0ltcGwgPSBuZXcgU2VydmljZURlc2NyaXB0aW9uSW1wbCh3c2RsVVJMLCBzZXJ2aWNlUU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VDbGFzcywgc3BhcnNlQ29tcG9zaXRlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhcnNlQ29tcG9zaXRlS2V5KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkNsaWVudC1zaWRlIHNlcnZpY2UgZGVzY3JpcHRpb24gY3JlYXRlZCB3aXRoIHNlcnZpY2UgY2xhc3M6ICIgKyBzZXJ2aWNlQ2xhc3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIFNlcnZpY2UgUU46ICIgKyBzZXJ2aWNlUU5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIGFuZCBEQkM6ICIgKyBzcGFyc2VDb21wb3NpdGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKHNlcnZpY2VEZXNjSW1wbC50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgc2VydmljZURlc2NJbXBsID0gbmV3IFNlcnZpY2VEZXNjcmlwdGlvbkltcGwod3NkbFVSTCwgc2VydmljZVFOYW1lLCBzZXJ2aWNlQ2xhc3MpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzZXJ2aWNlRGVzY0ltcGwuc2V0QXhpc0NvbmZpZ0NvbnRleHQoY29uZmlnQ29udGV4dCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgc2VydmljZURlc2MgPSBzZXJ2aWNlRGVzY0ltcGw7Ci0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiU2VydmljZURlc2NyaXB0aW9uIGNyZWF0ZWQgd2l0aCBXU0RMIFVSTDogIiArIHdzZGxVUkwgKyAiOyBRTmFtZTogIiArCi0gICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlUU5hbWUgKyAiOyBDbGFzczogIiArIHNlcnZpY2VDbGFzcyk7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhzZXJ2aWNlRGVzYy50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ2FjaGluZyBuZXcgU2VydmljZURlc2NyaXB0aW9uIGluIHRoZSBjYWNoZSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYWNoZS5wdXQoa2V5LCBzZXJ2aWNlRGVzYyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIEEgc2VydmljZSBkZXNjcmlwdGlvbiB3YXMgZm91bmQgaW4gdGhlIGNhY2hlLiAgSWYgYSBzcGFyc2UgY29tcG9zaXRlIHdhcwotICAgICAgICAgICAgICAgIC8vIHNwZWNpZmllZCwgdGhlbiBzZXQgaXQgb24gdGhlIGZvdW5kIHNlcnZpY2UgZGVzYwotICAgICAgICAgICAgICAgICgoU2VydmljZURlc2NyaXB0aW9uSW1wbCkgc2VydmljZURlc2MpLmdldERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSgpLgotICAgICAgICAgICAgICAgICAgICBzZXRTcGFyc2VDb21wb3NpdGUoc3BhcnNlQ29tcG9zaXRlS2V5LCBzcGFyc2VDb21wb3NpdGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgKChTZXJ2aWNlRGVzY3JpcHRpb25JbXBsKSBzZXJ2aWNlRGVzYykucmVnaXN0ZXJVc2UoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc2VydmljZURlc2M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2xlYXJzIHRoZSBlbnRpcmUgU2VydmljZURlc2NyaXB0aW9uIGNhY2hlLgotICAgICAqIAotICAgICAqIDxoND5Ob3RlPC9oND4gICAgIAotICAgICAqIFRoaXMgZnVuY3Rpb24gbWlnaHQgY2F1c2UgdW5wcmVkaWN0YWJsZSByZXN1bHRzIHdoZW4gY29uZmlndXJhdGlvbiBjb250ZXh0cyBhcmUgYmVpbmcgcmV1c2VkCi0gICAgICogYW5kL29yIHRoZXJlIGFyZSBvdXRzdGFuZGluZyByZXF1ZXN0cyB1c2luZyB0aGUgY2FjaGVkIFNlcnZpY2VEZXNjcmlwdGlvbiBvYmplY3RzLiBBbHNvLCAKLSAgICAgKiBpbi1mbGlnaHQgcmVxdWVzdHMgKGJvdGggY2xpZW50IGFuZCBzZXJ2ZXIpIHVzaW5nIFNlcnZpY2VEZWxlZ2F0ZXMgTVVTVCBiZSBkb25lIGFuZCBvdXQgb2YKLSAgICAgKiBzY29wZSBiZWZvcmUgdGhpcyBtZXRob2QgaXMgY2FsbGVkLgotICAgICAqIAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjbGVhclNlcnZpY2VEZXNjcmlwdGlvbkNhY2hlKCkgewotICAgICAgICBjYWNoZS5jbGVhcigpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDbGVhcnMgYWxsIHRoZSBTZXJ2aWNlRGVzY3JpcHRpb24gb2JqZWN0cyBpbiB0aGUgY2FjaGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgCi0gICAgICogY29uZmlndXJhdGlvbiBjb250ZXh0LgotICAgICAqIAotICAgICAqIDxoND5Ob3RlPC9oND4KLSAgICAgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBvbmx5IGJlIHVzZWQgdG8gY2xlYXIgdGhlIGNhY2hlIHdoZW4gdGhlIHNwZWNpZmllZCBjb25maWd1cmF0aW9uIGNvbnRleHQKLSAgICAgKiB3aWxsIG5vdCBiZSB1c2VkIGFueW1vcmUgYW5kIHRoZXJlIGFyZSBubyBvdXRzdGFuZGluZyByZXF1ZXN0cyB1c2luZyB0aGUgYXNzb2NpYXRlZCAKLSAgICAgKiBTZXJ2aWNlRGVzY3JpcHRpb24gb2JqZWN0cy4gQWxzbywgaW4tZmxpZ2h0IHJlcXVlc3RzIChib3RoIGNsaWVudCBhbmQgc2VydmVyKSB1c2luZyAKLSAgICAgKiBTZXJ2aWNlRGVsZWdhdGVzIE1VU1QgYmUgZG9uZSBhbmQgb3V0IG9mIHNjb3BlIGJlZm9yZSB0aGlzIG1ldGhvZCBpcyBjYWxsZWQuICAgICAgCi0gICAgICogT3RoZXJ3aXNlLCB1bnByZWRpY3RhYmxlIHJlc3VsdHMgbWlnaHQgb2NjdXIuCi0gICAgICogCi0gICAgICogQHBhcmFtIGNvbmZpZ0NvbnRleHQgVGhlIGNvbmZpZ3VyYXRpb24gY29udGV4dCBhc3NvY2lhdGVkIHdpdGggdGhlIFNlcnZpY2VEZXNjcmlwdGlvbiAKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBvYmplY3RzIGluIHRoZSBjYWNoZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY2xlYXJTZXJ2aWNlRGVzY3JpcHRpb25DYWNoZShDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0KSB7Ci0gICAgICAgIGlmIChjb25maWdDb250ZXh0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBzeW5jaHJvbml6ZWQgKGNvbmZpZ0NvbnRleHQpIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAoY2FjaGUpIHsKLSAgICAgICAgICAgICAgICBJdGVyYXRvcjxEZXNjcmlwdGlvbktleT4gaXRlciA9IGNhY2hlLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uS2V5IGtleSA9IGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoa2V5LmdldENvbmZpZ0NvbnRleHQoKSA9PSBjb25maWdDb250ZXh0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpdGVyLnJlbW92ZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSAgICAKLSAgICAKLSAgICAvKiogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkRlc2NyaXB0aW9uRmFjdG9yeSNjcmVhdGVTZXJ2aWNlRGVzY3JpcHRpb24oQ2xhc3MpICovCi0gICAgcHVibGljIHN0YXRpYyBTZXJ2aWNlRGVzY3JpcHRpb24gY3JlYXRlU2VydmljZURlc2NyaXB0aW9uKENsYXNzIHNlcnZpY2VJbXBsQ2xhc3MpIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbihzZXJ2aWNlSW1wbENsYXNzLCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKiogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkRlc2NyaXB0aW9uRmFjdG9yeSNjcmVhdGVTZXJ2aWNlRGVzY3JpcHRpb24oQ2xhc3MpICovCi0gICAgcHVibGljIHN0YXRpYyBTZXJ2aWNlRGVzY3JpcHRpb24gY3JlYXRlU2VydmljZURlc2NyaXB0aW9uKENsYXNzIHNlcnZpY2VJbXBsQ2xhc3MsIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQpIHsKLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNlcnZpY2VEZXNjID0gbnVsbDsKLQotICAgICAgICBpZiAoc2VydmljZUltcGxDbGFzcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBKYXZhQ2xhc3NUb0RCQ0NvbnZlcnRlciBjb252ZXJ0ZXIgPSBuZXcgSmF2YUNsYXNzVG9EQkNDb252ZXJ0ZXIoc2VydmljZUltcGxDbGFzcyk7Ci0gICAgICAgICAgICBIYXNoTWFwPFN0cmluZywgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlPiBkYmNNYXAgPSBjb252ZXJ0ZXIucHJvZHVjZURCQygpOwotICAgICAgICAgICAgTGlzdDxTZXJ2aWNlRGVzY3JpcHRpb24+IHNlcnZpY2VEZXNjTGlzdCA9IGNyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbkZyb21EQkNNYXAoZGJjTWFwLCBjb25maWdDb250ZXh0KTsKLSAgICAgICAgICAgIGlmIChzZXJ2aWNlRGVzY0xpc3QgIT0gbnVsbCAmJiBzZXJ2aWNlRGVzY0xpc3Quc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgICAgIHNlcnZpY2VEZXNjID0gc2VydmljZURlc2NMaXN0LmdldCgwKTsKLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJTZXJ2aWNlRGVzY3JpcHRpb24gY3JlYXRlZCB3aXRoIGNsYXNzOiAiICsgc2VydmljZUltcGxDbGFzcyk7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhzZXJ2aWNlRGVzYyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJTZXJ2aWNlRGVzY2lwdGlvbiB3YXMgbm90IGNyZWF0ZWQgZm9yIGNsYXNzOiAiICsgc2VydmljZUltcGxDbGFzcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiY3JlYXRlU2VydmljZURlc2NyRXJyIiwgc2VydmljZUltcGxDbGFzcy5nZXROYW1lKCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc2VydmljZURlc2M7Ci0gICAgfQotCi0gICAgLyoqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5EZXNjcmlwdGlvbkZhY3RvcnkjY3JlYXRlU2VydmljZURlc2NyaXB0aW9uRnJvbURCQ01hcChIYXNoTWFwKSAqLwotICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxTZXJ2aWNlRGVzY3JpcHRpb24+IGNyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbkZyb21EQkNNYXAoCi0gICAgICAgICAgICBIYXNoTWFwPFN0cmluZywgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlPiBkYmNNYXAsIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQpIHsKLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoImNyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbkZyb21EQkNNYXAoSGFzaG1hcDxTdHJpbmcsRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlPixDb25maWd1cmF0aW9uQ29udGV4dCAiICk7Ci0gICAgICAgIH0KLQotICAgICAgICBMaXN0PFNlcnZpY2VEZXNjcmlwdGlvbj4gc2VydmljZURlc2NyaXB0aW9uTGlzdCA9IG5ldyBBcnJheUxpc3Q8U2VydmljZURlc2NyaXB0aW9uPigpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yPERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZT4gbmFtZUl0ZXIgPSBkYmNNYXAudmFsdWVzKCkKLSAgICAgICAgICAgICAgICAuaXRlcmF0b3IoKTsgbmFtZUl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIHNlcnZpY2VJbXBsQ29tcG9zaXRlID0gbmFtZUl0ZXIubmV4dCgpOwotICAgICAgICAgICAgaWYgKGlzSW1wbChzZXJ2aWNlSW1wbENvbXBvc2l0ZSkpIHsKLSAgICAgICAgICAgICAgICAvLyBwcm9jZXNzIHRoaXMgaW1wbCBjbGFzcwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIHRoZSBpbXBsZW1lbnRhdGlvbiBjbGFzcyByZXByZXNlbnRlZCBieSB0aGlzIERCQyByZXByZXNlbnRzIGEgc2luZ2xlIHdzZGw6c2VydmljZSAKLSAgICAgICAgICAgICAgICBTZXQ8UU5hbWU+IHNRTmFtZXMgPSBzZXJ2aWNlSW1wbENvbXBvc2l0ZS5nZXRTZXJ2aWNlUU5hbWVzKCk7Ci0gICAgICAgICAgICAgICAgaWYoc1FOYW1lcyA9PSBudWxsCi0gICAgICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgICAgICAgICAgICAgICAgc1FOYW1lcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkFkZGluZyBTZXJ2aWNlRGVzY3JpcHRpb24gaW5zdGFuY2VzIGZyb20gY29tcG9zaXRlIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgU2VydmljZURlc2NyaXB0aW9uSW1wbCBzZXJ2aWNlRGVzY3JpcHRpb24gPSBuZXcgU2VydmljZURlc2NyaXB0aW9uSW1wbCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYmNNYXAsIHNlcnZpY2VJbXBsQ29tcG9zaXRlLCBjb25maWdDb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgU2VydmljZURlc2NyaXB0aW9uVmFsaWRhdG9yIHZhbGlkYXRvciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgU2VydmljZURlc2NyaXB0aW9uVmFsaWRhdG9yKHNlcnZpY2VEZXNjcmlwdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2YWxpZGF0b3IudmFsaWRhdGUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZURlc2NyaXB0aW9uTGlzdC5hZGQoc2VydmljZURlc2NyaXB0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiU2VydmljZSBEZXNjcmlwdGlvbiBjcmVhdGVkIGZyb20gRGVzY3JpcHRpb25Db21wb3NpdGU6ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlRGVzY3JpcHRpb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbXNnID0gTWVzc2FnZXMuZ2V0TWVzc2FnZSgiY3JlYXRlU3J2Y0Rlc2NyREJDTWFwRXJyIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRvci50b1N0cmluZygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZUltcGxDb21wb3NpdGUudG9TdHJpbmcoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VEZXNjcmlwdGlvbi50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24obXNnKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyB0aGUgaW1wbGVtZW50YXRpb24gY2xhc3MgcmVwcmVzZW50ZWQgYnkgdGhpcyBEQkMgcmVwcmVzZW50cyBtdWx0aXBsZSB3c2RsOnNlcnZpY2VzCi0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yPFFOYW1lPiBzUU5hbWVJdGVyID0gc1FOYW1lcy5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgICAgICB3aGlsZShzUU5hbWVJdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgUU5hbWUgc1FOYW1lID0gc1FOYW1lSXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQWRkaW5nIFNlcnZpY2VEZXNjcmlwdGlvbiBmcm9tIHNlcnZpY2UgUU5hbWUgc2V0IGZvciA6ICIgKyBzUU5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgU2VydmljZURlc2NyaXB0aW9uSW1wbCBzZXJ2aWNlRGVzY3JpcHRpb24gPSBuZXcgU2VydmljZURlc2NyaXB0aW9uSW1wbChkYmNNYXAsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlSW1wbENvbXBvc2l0ZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ0NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNRTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb25WYWxpZGF0b3IgdmFsaWRhdG9yID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU2VydmljZURlc2NyaXB0aW9uVmFsaWRhdG9yKHNlcnZpY2VEZXNjcmlwdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWRhdG9yLnZhbGlkYXRlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlRGVzY3JpcHRpb25MaXN0LmFkZChzZXJ2aWNlRGVzY3JpcHRpb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlNlcnZpY2UgRGVzY3JpcHRpb24gY3JlYXRlZCBmcm9tIERlc2NyaXB0aW9uQ29tcG9zaXRlOiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VEZXNjcmlwdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPSBNZXNzYWdlcy5nZXRNZXNzYWdlKCJjcmVhdGVTcnZjRGVzY3JEQkNNYXBFcnIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRvci50b1N0cmluZygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VJbXBsQ29tcG9zaXRlLnRvU3RyaW5nKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZURlc2NyaXB0aW9uLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24obXNnKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gCi0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJEQkMgaXMgbm90IGEgc2VydmljZSBpbXBsOiAiICsgc2VydmljZUltcGxDb21wb3NpdGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVE9ETzogUHJvY2VzcyBhbGwgY29tcG9zaXRlcyB0aGF0IGFyZSBXZWJGYXVsdHMuLi5jdXJyZW50IHRoaW5raW5nIGlzCi0gICAgICAgIC8vIHRoYXQKLSAgICAgICAgLy8gc2luY2UgV2ViRmF1bHQgYW5ub3RhdGlvbnMgb25seSBleGlzdCBvbiBleGNlcHRpb24gY2xhc3NlcywgdGhlbiB0aGV5Ci0gICAgICAgIC8vIHNob3VsZCBiZSBwcm9jZXNzZWQgYnkgdGhlbXNlbHZlcywgYW5kIGF0IHRoaXMgbGV2ZWwKLQotICAgICAgICByZXR1cm4gc2VydmljZURlc2NyaXB0aW9uTGlzdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRGVzY3JpcHRpb25GYWN0b3J5I3VwZGF0ZUVuZHBvaW50KFNlcnZpY2VEZXNjcmlwdGlvbiwKLSAgICAgKiAgICAgIENsYXNzLCBRTmFtZSwgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5EZXNjcmlwdGlvbkZhY3RvcnkuVXBkYXRlVHlwZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEVuZHBvaW50RGVzY3JpcHRpb24gdXBkYXRlRW5kcG9pbnQoCi0gICAgICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc2VydmljZURlc2NyaXB0aW9uLCBDbGFzcyBzZWksIFFOYW1lIHBvcnRRTmFtZSwKLSAgICAgICAgICAgIERlc2NyaXB0aW9uRmFjdG9yeS5VcGRhdGVUeXBlIHVwZGF0ZVR5cGUsCi0gICAgICAgICAgICBTdHJpbmcgYmluZGluZ0lkLCBTdHJpbmcgZW5kcG9pbnRBZGRyZXNzKSB7Ci0gICAgICAgIHJldHVybiB1cGRhdGVFbmRwb2ludChzZXJ2aWNlRGVzY3JpcHRpb24sIHNlaSwgcG9ydFFOYW1lLCB1cGRhdGVUeXBlLCBudWxsLCBudWxsLCBiaW5kaW5nSWQsIGVuZHBvaW50QWRkcmVzcyk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5EZXNjcmlwdGlvbkZhY3RvcnkjdXBkYXRlRW5kcG9pbnQoU2VydmljZURlc2NyaXB0aW9uLAotICAgICAqICAgICAgQ2xhc3MsIFFOYW1lLCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkRlc2NyaXB0aW9uRmFjdG9yeS5VcGRhdGVUeXBlKQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgRW5kcG9pbnREZXNjcmlwdGlvbiB1cGRhdGVFbmRwb2ludCgKLSAgICAgICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzZXJ2aWNlRGVzY3JpcHRpb24sIENsYXNzIHNlaSwgUU5hbWUgcG9ydFFOYW1lLAotICAgICAgICAgICAgRGVzY3JpcHRpb25GYWN0b3J5LlVwZGF0ZVR5cGUgdXBkYXRlVHlwZSwgT2JqZWN0IHNlcnZpY2VEZWxlZ2F0ZUtleSwgU3RyaW5nIGJpbmRpbmdJZCwgU3RyaW5nIGVuZHBvaW50QWRkcmVzcykgewotICAgICAgICByZXR1cm4gdXBkYXRlRW5kcG9pbnQoc2VydmljZURlc2NyaXB0aW9uLCBzZWksIHBvcnRRTmFtZSwgdXBkYXRlVHlwZSwgbnVsbCwgc2VydmljZURlbGVnYXRlS2V5LCBiaW5kaW5nSWQsIGVuZHBvaW50QWRkcmVzcyk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5EZXNjcmlwdGlvbkZhY3RvcnkjdXBkYXRlRW5kcG9pbnQoU2VydmljZURlc2NyaXB0aW9uLCBDbGFzcywgUU5hbWUsIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRGVzY3JpcHRpb25GYWN0b3J5LlVwZGF0ZVR5cGUsIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEVuZHBvaW50RGVzY3JpcHRpb24gdXBkYXRlRW5kcG9pbnQoCi0gICAgICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc2VydmljZURlc2NyaXB0aW9uLCBDbGFzcyBzZWksIFFOYW1lIHBvcnRRTmFtZSwKLSAgICAgICAgICAgIERlc2NyaXB0aW9uRmFjdG9yeS5VcGRhdGVUeXBlIHVwZGF0ZVR5cGUsIAotICAgICAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIGNvbXBvc2l0ZSwKLSAgICAgICAgICAgIE9iamVjdCBzZXJ2aWNlRGVsZWdhdGVLZXksCi0gICAgICAgICAgICBTdHJpbmcgYmluZGluZ0lkLCAKLSAgICAgICAgICAgIFN0cmluZyBlbmRwb2ludEFkZHJlc3MpIHsKLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlbmRwb2ludERlc2MgPSBudWxsOwotICAgICAgICBzeW5jaHJvbml6ZWQoc2VydmljZURlc2NyaXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgZW5kcG9pbnREZXNjID0gCi0gICAgICAgICAgICAgICAgKChTZXJ2aWNlRGVzY3JpcHRpb25JbXBsKXNlcnZpY2VEZXNjcmlwdGlvbikKLSAgICAgICAgICAgICAgICAgICAgICAgIC51cGRhdGVFbmRwb2ludERlc2NyaXB0aW9uKHNlaSwgcG9ydFFOYW1lLCB1cGRhdGVUeXBlLCBjb21wb3NpdGUsIHNlcnZpY2VEZWxlZ2F0ZUtleSwgYmluZGluZ0lkLCBlbmRwb2ludEFkZHJlc3MpOwotICAgICAgICB9Ci0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb25WYWxpZGF0b3IgZW5kcG9pbnRWYWxpZGF0b3IgPSBuZXcgRW5kcG9pbnREZXNjcmlwdGlvblZhbGlkYXRvcihlbmRwb2ludERlc2MpOwotICAgICAgICAKLSAgICAgICAgYm9vbGVhbiBpc0VuZHBvaW50VmFsaWQgPSBlbmRwb2ludFZhbGlkYXRvci52YWxpZGF0ZSgpOwotICAgICAgICAKLSAgICAgICAgaWYgKCFpc0VuZHBvaW50VmFsaWQpIHsKLSAgICAgICAgICAgIFN0cmluZyBtc2cgPSBNZXNzYWdlcy5nZXRNZXNzYWdlKCJlbmRwb2ludERlc2NyaXB0aW9uVmFsaWRhdGlvbkVycm9ycyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRwb2ludFZhbGlkYXRvci50b1N0cmluZygpKTsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24obXNnKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiRW5kcG9pbnREZXNjcmlwdGlvbiB1cGRhdGVkOiAiICsgZW5kcG9pbnREZXNjKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgc2V0UHJvcGVydGllc09uRW5kcG9pbnREZXNjKGVuZHBvaW50RGVzYywgY29tcG9zaXRlKTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiBlbmRwb2ludERlc2M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkRlc2NyaXB0aW9uRmFjdG9yeSN1cGRhdGVFbmRwb2ludChTZXJ2aWNlRGVzY3JpcHRpb24sCi0gICAgICogQ2xhc3MsIEVuZHBvaW50UmVmZXJlbmNlLCBTdHJpbmcsIERlc2NyaXB0aW9uRmFjdG9yeS5VcGRhdGVUeXBlKQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgRW5kcG9pbnREZXNjcmlwdGlvbiB1cGRhdGVFbmRwb2ludCgKLSAgICAgICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzZXJ2aWNlRGVzY3JpcHRpb24sIENsYXNzIHNlaSwgRW5kcG9pbnRSZWZlcmVuY2UgZXByLAotICAgICAgICAgICAgU3RyaW5nIGFkZHJlc3NpbmdOYW1lc3BhY2UsCi0gICAgICAgICAgICBEZXNjcmlwdGlvbkZhY3RvcnkuVXBkYXRlVHlwZSB1cGRhdGVUeXBlLCBTdHJpbmcgYmluZGluZ0lkLCBTdHJpbmcgZW5kcG9pbnRBZGRyZXNzKSB7Ci0gICAgICAgIHJldHVybiB1cGRhdGVFbmRwb2ludChzZXJ2aWNlRGVzY3JpcHRpb24sIHNlaSwgZXByLCBhZGRyZXNzaW5nTmFtZXNwYWNlLCB1cGRhdGVUeXBlLCBudWxsLCBudWxsLCBiaW5kaW5nSWQsIGVuZHBvaW50QWRkcmVzcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkRlc2NyaXB0aW9uRmFjdG9yeSN1cGRhdGVFbmRwb2ludChTZXJ2aWNlRGVzY3JpcHRpb24sCi0gICAgICogQ2xhc3MsIEVuZHBvaW50UmVmZXJlbmNlLCBTdHJpbmcsIERlc2NyaXB0aW9uRmFjdG9yeS5VcGRhdGVUeXBlLCBPYmplY3QpCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBFbmRwb2ludERlc2NyaXB0aW9uIHVwZGF0ZUVuZHBvaW50KAotICAgICAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNlcnZpY2VEZXNjcmlwdGlvbiwgQ2xhc3Mgc2VpLCBFbmRwb2ludFJlZmVyZW5jZSBlcHIsCi0gICAgICAgICAgICBTdHJpbmcgYWRkcmVzc2luZ05hbWVzcGFjZSwKLSAgICAgICAgICAgIERlc2NyaXB0aW9uRmFjdG9yeS5VcGRhdGVUeXBlIHVwZGF0ZVR5cGUsCi0gICAgICAgICAgICBPYmplY3Qgc3BhcnNlQ29tcG9zaXRlS2V5LCBTdHJpbmcgYmluZGluZ0lkLCBTdHJpbmcgZW5kcG9pbnRBZGRyZXNzKSB7Ci0gICAgICAgIHJldHVybiB1cGRhdGVFbmRwb2ludChzZXJ2aWNlRGVzY3JpcHRpb24sIHNlaSwgZXByLCBhZGRyZXNzaW5nTmFtZXNwYWNlLCB1cGRhdGVUeXBlLCBudWxsLCBzcGFyc2VDb21wb3NpdGVLZXksIGJpbmRpbmdJZCwgZW5kcG9pbnRBZGRyZXNzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRGVzY3JpcHRpb25GYWN0b3J5I3VwZGF0ZUVuZHBvaW50KFNlcnZpY2VEZXNjcmlwdGlvbiwKLSAgICAgKiBDbGFzcywgRW5kcG9pbnRSZWZlcmVuY2UsIFN0cmluZywgRGVzY3JpcHRpb25GYWN0b3J5LlVwZGF0ZVR5cGUsIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSwgT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgRW5kcG9pbnREZXNjcmlwdGlvbiB1cGRhdGVFbmRwb2ludCgKLSAgICAgICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzZXJ2aWNlRGVzY3JpcHRpb24sIENsYXNzIHNlaSwgRW5kcG9pbnRSZWZlcmVuY2UgZXByLAotICAgICAgICAgICAgU3RyaW5nIGFkZHJlc3NpbmdOYW1lc3BhY2UsCi0gICAgICAgICAgICBEZXNjcmlwdGlvbkZhY3RvcnkuVXBkYXRlVHlwZSB1cGRhdGVUeXBlLAotICAgICAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIGNvbXBvc2l0ZSwKLSAgICAgICAgICAgIE9iamVjdCBzcGFyc2VDb21wb3NpdGVLZXksIFN0cmluZyBiaW5kaW5nSWQsIFN0cmluZyBlbmRwb2ludEFkZHJlc3MpIHsKLSAgICAgICAgUU5hbWUgcG9ydFFOYW1lID0gbnVsbDsKLSAgICAgICAgCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTZXJ2aWNlTmFtZSBzZXJ2aWNlTmFtZSA9IEVuZHBvaW50UmVmZXJlbmNlSGVscGVyLmdldFNlcnZpY2VOYW1lTWV0YWRhdGEoZXByLCBhZGRyZXNzaW5nTmFtZXNwYWNlKTsKLSAgICAgICAgICAgIFFOYW1lIHNlcnZpY2VRTmFtZSA9IHNlcnZpY2VEZXNjcmlwdGlvbi5nZXRTZXJ2aWNlUU5hbWUoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy9XZSBuZWVkIHRvIHRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgc2VydmljZSBuYW1lIGluIHRoZSBFUFIgbWV0YWRhdGEgZG9lcyBub3QKLSAgICAgICAgICAgIC8vbWF0Y2ggdGhlIHNlcnZpY2UgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhlIEpBWC1XUyBzZXJ2aWNlIGluc3RhbmNlLgotICAgICAgICAgICAgaWYgKHNlcnZpY2VOYW1lLmdldE5hbWUoKSAhPSBudWxsICYmICFzZXJ2aWNlUU5hbWUuZXF1YWxzKHNlcnZpY2VOYW1lLmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRNZXNzYWdlKCJzZXJ2aWNlTmFtZU1pc21hdGNoIiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZU5hbWUuZ2V0TmFtZSgpLnRvU3RyaW5nKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VRTmFtZS50b1N0cmluZygpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvL0lmIGEgcG9ydCBuYW1lIGlzIGF2YWlsYWJsZSBmcm9tIHRoZSBFUFIgbWV0YWRhdGEgdGhlbiB1c2UgdGhhdCwgb3RoZXJ3aXNlCi0gICAgICAgICAgICAvL2xlYXZlIGl0IHRvIHRoZSBydW50aW1lIHRvIGZpbmQgYSBzdWl0YWJsZSBwb3J0LCBiYXNlZCBvbiBXU0RML2Fubm90YXRpb25zLgotICAgICAgICAgICAgaWYgKHNlcnZpY2VOYW1lLmdldEVuZHBvaW50TmFtZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBwb3J0UU5hbWUgPSBuZXcgUU5hbWUoc2VydmljZVFOYW1lLmdldE5hbWVzcGFjZVVSSSgpLCBzZXJ2aWNlTmFtZS5nZXRFbmRwb2ludE5hbWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRNZXNzYWdlKCJ1cGRhdGVFbmRwb2ludEVycm9yIiwgZS5nZXRNZXNzYWdlKCkpKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHVwZGF0ZUVuZHBvaW50KHNlcnZpY2VEZXNjcmlwdGlvbiwgc2VpLCBwb3J0UU5hbWUsIHVwZGF0ZVR5cGUsIGNvbXBvc2l0ZSwgc3BhcnNlQ29tcG9zaXRlS2V5LCBiaW5kaW5nSWQsIGVuZHBvaW50QWRkcmVzcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBDbGllbnRDb25maWd1cmF0aW9uRmFjdG9yeSBnZXRDbGllbnRDb25maWd1cmF0aW9uRmFjdG9yeSgpIHsKLSAgICAgICAgcmV0dXJuIENsaWVudENvbmZpZ3VyYXRpb25GYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2Qgd2lsbCBiZSB1c2VkIHRvIGRldGVybWluZSBpZiBhIGdpdmVuIERCQyByZXByZXNlbnRzIGEgV2ViIHNlcnZpY2UKLSAgICAgKiBpbXBsZW1lbnRhdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBkYmMgLSA8Y29kZT5EZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGU8L2NvZGU+Ci0gICAgICogQHJldHVybiAtIDxjb2RlPmJvb2xlYW48L2NvZGU+Ci0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0ltcGwoRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIGRiYykgewotICAgICAgICBpZiAoIWRiYy5pc0ludGVyZmFjZSgpCi0gICAgICAgICAgICAgICAgJiYgKGRiYy5nZXRXZWJTZXJ2aWNlQW5ub3QoKSAhPSBudWxsIHx8IGRiYwotICAgICAgICAgICAgICAgIC5nZXRXZWJTZXJ2aWNlUHJvdmlkZXJBbm5vdCgpICE9IG51bGwpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgc2V0IGFueSBwcm9wZXJ0aWVzIHN1cHBsaWVkIG9uIHRoZSBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgaW5zdGFuY2UKLSAgICAgKiBvbiB0aGUgRW5kcG9pbnREZXNjcmlwdGlvbi4gSWYgdGhlIERCQyBpcyBudWxsIG9yIHRoZXJlIGFyZSBubyBwcm9wZXJ0aWVzIHByZXNlbnQsIHRoaXMKLSAgICAgKiBtZXRob2Qgd2lsbCBoYXZlIG5vIGVmZmVjdC4KLSAgICAgKi8KLSAgICBzdGF0aWMgdm9pZCBzZXRQcm9wZXJ0aWVzT25FbmRwb2ludERlc2MoRW5kcG9pbnREZXNjcmlwdGlvbiBlbmRwb2ludERlc2MsIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb3NpdGUpIHsKLSAgICAgICAgaWYoY29tcG9zaXRlICE9IG51bGwgCi0gICAgICAgICAgICAgICAgJiYgCi0gICAgICAgICAgICAgICAgY29tcG9zaXRlLmdldFByb3BlcnRpZXMoKSAhPSBudWxsCi0gICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgICAgICAhY29tcG9zaXRlLmdldFByb3BlcnRpZXMoKS5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGZvcihTdHJpbmcga2V5IDogY29tcG9zaXRlLmdldFByb3BlcnRpZXMoKS5rZXlTZXQoKSkgewotICAgICAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IGNvbXBvc2l0ZS5nZXRQcm9wZXJ0aWVzKCkuZ2V0KGtleSk7Ci0gICAgICAgICAgICAgICAgaWYobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJTZXR0aW5nIHByb3BlcnR5IGZyb20gREJDIG9udG8gRW5kcG9pbnREZXNjcmlwdGlvbiwga2V5PSAiICsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkgKyAiLCB2YWx1ZT0gIiArIHZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZW5kcG9pbnREZXNjLnNldFByb3BlcnR5KGtleSwgdmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBSZXNvbHZlZEhhbmRsZXJzRGVzY3JpcHRpb24gY3JlYXRlUmVzb2x2ZWRIYW5kbGVyc0Rlc2NyaXB0aW9uKCkgewotICAgICAgICByZXR1cm4gbmV3IFJlc29sdmVkSGFuZGxlcnNEZXNjcmlwdGlvbkltcGwoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmUgdGhlIFNlcnZpY2VEZXNjcmlwdGlvbiBpbnN0YW5jZSBmcm9tIHRoZSBjbGllbnQtc2lkZSBjYWNoZSBpZiB0aGVyZSBhcmUgbm8KLSAgICAgKiBzZXJ2aWNlIGRlbGVnYXRlcyB1c2luZyBpdC4gIE5vdGUgdGhpcyBtdXN0IGJlIGRvbmUgaW4gYSBzeW5jIGJsb2NrIHNvIHRoYXQgYSBsb29rdXAgCi0gICAgICogaW4gY3JlYXRlU2VydmljZURlc2NyaXB0aW9uIGRvZXNuJ3QgYWNjZXNzIHRoZSBjYWNoZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3ZjRGVzYyBUaGUgaW5zdGFuY2UgdG8gYmUgcmVtb3ZlZC4KLSAgICAgKi8KLSAgICBzdGF0aWMgYm9vbGVhbiByZW1vdmVGcm9tQ2FjaGUoU2VydmljZURlc2NyaXB0aW9uSW1wbCBzdmNEZXNjKSB7Ci0gICAgICAgIGJvb2xlYW4gc3ZjRGVzY1JlbW92ZWQgPSBmYWxzZTsKLSAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ29udGV4dCA9IHN2Y0Rlc2MuZ2V0QXhpc0NvbmZpZ0NvbnRleHQoKTsKLSAgICAgICAgc3luY2hyb25pemVkKGNvbmZpZ0NvbnRleHQpIHsKLSAgICAgICAgICAgIHN2Y0Rlc2MuZGVyZWdpc3RlclVzZSgpOwotICAgICAgICAgICAgaWYgKHN2Y0Rlc2MuaXNJblVzZSgpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiU2VydmljZURlc2NyaXB0aW9uIHN0aWxsIGluIHVzZTsgbm90IHJlbW92ZWQgZnJvbSBjYWNoZSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzdmNEZXNjUmVtb3ZlZCA9IGZhbHNlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJTZXJ2aWNlRGVzY3JpcHRpb24gbm90IGluIHVzZTsgd2lsbCBiZSByZW1vdmVkIGZyb20gY2FjaGUiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc3ZjRGVzY1JlbW92ZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIFNldDxNYXAuRW50cnk8RGVzY3JpcHRpb25LZXksIFNlcnZpY2VEZXNjcmlwdGlvbj4+IGNhY2hlRW50cnlTZXQgPSAKLSAgICAgICAgICAgICAgICAgICAgY2FjaGUuZW50cnlTZXQoKTsKLSAgICAgICAgICAgICAgICBJdGVyYXRvcjxNYXAuRW50cnk8RGVzY3JpcHRpb25LZXksIFNlcnZpY2VEZXNjcmlwdGlvbj4+IGNhY2hlRW50cnlJdGVyYXRvciA9Ci0gICAgICAgICAgICAgICAgICAgIGNhY2hlRW50cnlTZXQuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAoY2FjaGVFbnRyeUl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICBNYXAuRW50cnk8RGVzY3JpcHRpb25LZXksIFNlcnZpY2VEZXNjcmlwdGlvbj4gZW50cnkgPSAKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlRW50cnlJdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBlbnRyeVN2Y0Rlc2NWYWx1ZSA9IGVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdmNEZXNjID09IGVudHJ5U3ZjRGVzY1ZhbHVlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYWNoZUVudHJ5SXRlcmF0b3IucmVtb3ZlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlJlbW92ZWQgc2VydmljZSBkZXNjcmlwdGlvbiBmcm9tIGNhY2hlIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN2Y0Rlc2NSZW1vdmVkOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2ltcGwvRGVzY3JpcHRpb25VdGlscy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vaW1wbC9EZXNjcmlwdGlvblV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxOWFiN2MuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vaW1wbC9EZXNjcmlwdGlvblV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MTIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmltcGw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuRXhjZXB0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkF0dGFjaG1lbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkF0dGFjaG1lbnRUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRW5kcG9pbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkVuZHBvaW50RGVzY3JpcHRpb25XU0RMOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5EZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGU7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5NRFFDb25zdGFudHMuQ09OU1RSVUNUT1JfTUVUSE9EOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLk1EUUNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLldlYk1ldGhvZEFubm90OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24ueG1sLmhhbmRsZXIuSGFuZGxlckNoYWluc1R5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5pMThuLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nOwotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ09wZXJhdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMubWltZS5NSU1FQ29udGVudDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMubWltZS5NSU1FTXVsdGlwYXJ0UmVsYXRlZDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMubWltZS5NSU1FUGFydDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQQm9keTsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQSGVhZGVyOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwMTIuU09BUDEyQm9keTsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcDEyLlNPQVAxMkhlYWRlcjsKLWltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCQ29udGV4dDsKLWltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCRWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwuYmluZC5Vbm1hcnNoYWxsZXI7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5IYW5kbGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLnNvYXAuU09BUEhhbmRsZXI7Ci1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuU09BUEJpbmRpbmc7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci1pbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLS8qKiBVdGlsaXRpZXMgdXNlZCB0aHJvdWdob3V0IHRoZSBEZXNjcmlwdGlvbiBwYWNrYWdlLiAqLwotcHVibGljIGNsYXNzIERlc2NyaXB0aW9uVXRpbHMgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhEZXNjcmlwdGlvblV0aWxzLmNsYXNzKTsKLQotICAgIHN0YXRpYyBib29sZWFuIGlzRW1wdHkoU3RyaW5nIHN0cmluZykgewotICAgICAgICByZXR1cm4gKHN0cmluZyA9PSBudWxsIHx8ICIiLmVxdWFscyhzdHJpbmcpKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgYm9vbGVhbiBpc0VtcHR5KFFOYW1lIHFuYW1lKSB7Ci0gICAgICAgIHJldHVybiBxbmFtZSA9PSBudWxsIHx8IGlzRW1wdHkocW5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgIH0KLQotICAgIC8qKiBAcmV0dXJuIFJldHVybnMgVFJVRSBpZiB3ZSBmaW5kIGp1c3Qgb25lIFdlYk1ldGhvZCBBbm5vdGF0aW9uIHdpdGggZXhjbHVkZSBmbGFnIHNldCB0byBmYWxzZSAqLwotICAgIHN0YXRpYyBib29sZWFuIGZhbHNlRXhjbHVzaW9uc0V4aXN0KERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBkYmMpIHsKLSAgICAgICAgTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUgbWRjID0gbnVsbDsKLSAgICAgICAgSXRlcmF0b3I8TWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGU+IGl0ZXIgPSBkYmMuZ2V0TWV0aG9kRGVzY3JpcHRpb25zTGlzdCgpLml0ZXJhdG9yKCk7Ci0KLSAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBtZGMgPSBpdGVyLm5leHQoKTsKLQotICAgICAgICAgICAgV2ViTWV0aG9kQW5ub3Qgd21hID0gbWRjLmdldFdlYk1ldGhvZEFubm90KCk7Ci0gICAgICAgICAgICBpZiAod21hICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAod21hLmV4Y2x1ZGUoKSA9PSBmYWxzZSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2F0aGVycyBhbGwgTWV0aG9kRGVzY3JpcHRpb25Db21wc2l0ZSdzIHRoYXQgY29udGFpbiBhIFdlYk1ldGhvZCBBbm5vdGF0aW9uIHdpdGggdGhlIGV4Y2x1ZGUKLSAgICAgKiBzZXQgdG8gRkFMU0UKLSAgICAgKgotICAgICAqIEByZXR1cm4gUmV0dXJucyBMaXN0PE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlPgotICAgICAqLwotICAgIHN0YXRpYyBBcnJheUxpc3Q8TWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGU+IGdldE1ldGhvZHNXaXRoRmFsc2VFeGNsdXNpb25zKAotICAgICAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIGRiYykgewotICAgICAgICBBcnJheUxpc3Q8TWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGU+IG1kY0xpc3QgPSBuZXcgQXJyYXlMaXN0PE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlPigpOwotICAgICAgICBJdGVyYXRvcjxNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZT4gaXRlciA9IGRiYy5nZXRNZXRob2REZXNjcmlwdGlvbnNMaXN0KCkuaXRlcmF0b3IoKTsKLQotICAgICAgICBpZiAoRGVzY3JpcHRpb25VdGlscy5mYWxzZUV4Y2x1c2lvbnNFeGlzdChkYmMpKSB7Ci0gICAgICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSBtZGMgPSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBpZiAobWRjLmdldFdlYk1ldGhvZEFubm90KCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAobWRjLmdldFdlYk1ldGhvZEFubm90KCkuZXhjbHVkZSgpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZGMuc2V0RGVjbGFyaW5nQ2xhc3MoZGJjLmdldENsYXNzTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1kY0xpc3QuYWRkKG1kYyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbWRjTGlzdDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAgKiBDaGVjayB3aGV0aGVyIGEgTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUgY29udGFpbnMgYSBXZWJNZXRob2QgYW5ub3RhdGlvbiB3aXRoCi0gICAgICAqIGV4bHVkZSBzZXQgdG8gdHJ1ZQotICAgICAgKi8KLSAgICBzdGF0aWMgYm9vbGVhbiBpc0V4Y2x1ZGVUcnVlKE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlIG1kYykgewotCi0gICAgICAgIGlmIChtZGMuZ2V0V2ViTWV0aG9kQW5ub3QoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAobWRjLmdldFdlYk1ldGhvZEFubm90KCkuZXhjbHVkZSgpID09IHRydWUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgU3RyaW5nIGphdmlmeUNsYXNzTmFtZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0gICAgICAgIGlmIChjbGFzc05hbWUuaW5kZXhPZigiLyIpICE9IC0xKSB7Ci0gICAgICAgICAgICByZXR1cm4gY2xhc3NOYW1lLnJlcGxhY2VBbGwoIi8iLCAiLiIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjbGFzc05hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyB3aXRob3V0IGFueSBwYWNrYWdlIHF1YWxpZmllci4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0aGVDbGFzcwotICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGNsYXNzIHNhbnMgcGFja2FnZSBxdWFsaWZpY2F0aW9uLgotICAgICAqLwotICAgIHN0YXRpYyBTdHJpbmcgZ2V0U2ltcGxlSmF2YUNsYXNzTmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICBTdHJpbmcgcmV0dXJuTmFtZSA9IG51bGw7Ci0KLSAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIGZxTmFtZSA9IG5hbWU7Ci0KLSAgICAgICAgICAgIC8vIFdlIG5lZWQgdGhlICJzaW1wbGUgbmFtZSIsIHNvIHN0cmlwIG9mZiBhbnkgcGFja2FnZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBuYW1lCi0gICAgICAgICAgICBpbnQgZW5kT2ZQYWNrYWdlSW5kZXggPSBmcU5hbWUubGFzdEluZGV4T2YoJy4nKTsKLSAgICAgICAgICAgIGludCBzdGFydE9mQ2xhc3NJbmRleCA9IGVuZE9mUGFja2FnZUluZGV4ICsgMTsKLSAgICAgICAgICAgIHJldHVybk5hbWUgPSBmcU5hbWUuc3Vic3RyaW5nKHN0YXJ0T2ZDbGFzc0luZGV4KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0dXJuTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBwYWNrYWdlIG5hbWUgZnJvbSB0aGUgY2xhc3MuICBJZiBubyBwYWNrYWdlLCB0aGVuIHJldHVybnMgbnVsbAotICAgICAqCi0gICAgICogQHBhcmFtIHRoZUNsYXNzTmFtZQotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBzdGF0aWMgU3RyaW5nIGdldEphdmFQYWNrYWdlTmFtZShTdHJpbmcgdGhlQ2xhc3NOYW1lKSB7Ci0gICAgICAgIFN0cmluZyByZXR1cm5QYWNrYWdlID0gbnVsbDsKLSAgICAgICAgaWYgKHRoZUNsYXNzTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgZnFOYW1lID0gdGhlQ2xhc3NOYW1lOwotICAgICAgICAgICAgLy8gR2V0IHRoZSBwYWNrYWdlIG5hbWUsIGlmIHRoZXJlIGlzIG9uZQotICAgICAgICAgICAgaW50IGVuZE9mUGFja2FnZUluZGV4ID0gZnFOYW1lLmxhc3RJbmRleE9mKCcuJyk7Ci0gICAgICAgICAgICBpZiAoZW5kT2ZQYWNrYWdlSW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgIHJldHVyblBhY2thZ2UgPSBmcU5hbWUuc3Vic3RyaW5nKDAsIGVuZE9mUGFja2FnZUluZGV4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0dXJuUGFja2FnZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBKQVgtV1MgbmFtZXNwYWNlIGJhc2VkIG9uIHRoZSBwYWNrYWdlIG5hbWUKLSAgICAgKgotICAgICAqIEBwYXJhbSBwYWNrYWdlTmFtZQotICAgICAqIEBwYXJhbSBwcm90b2NvbAotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIE5PX1BBQ0tBR0VfSE9TVF9OQU1FID0gIkRlZmF1bHROYW1lc3BhY2UiOwotCi0gICAgc3RhdGljIFN0cmluZyBtYWtlTmFtZXNwYWNlRnJvbVBhY2thZ2VOYW1lKFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIHByb3RvY29sKSB7Ci0gICAgICAgIGlmIChEZXNjcmlwdGlvblV0aWxzLmlzRW1wdHkocHJvdG9jb2wpKSB7Ci0gICAgICAgICAgICBwcm90b2NvbCA9ICJodHRwIjsKLSAgICAgICAgfQotICAgICAgICBpZiAoRGVzY3JpcHRpb25VdGlscy5pc0VtcHR5KHBhY2thZ2VOYW1lKSkgewotICAgICAgICAgICAgcmV0dXJuIHByb3RvY29sICsgIjovLyIgKyBOT19QQUNLQUdFX0hPU1RfTkFNRTsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHBhY2thZ2VOYW1lLCAiLiIpOwotICAgICAgICBTdHJpbmdbXSB3b3JkcyA9IG5ldyBTdHJpbmdbIHN0LmNvdW50VG9rZW5zKCkgXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB3b3Jkcy5sZW5ndGg7ICsraSkKLSAgICAgICAgICAgIHdvcmRzW2ldID0gc3QubmV4dFRva2VuKCk7Ci0KLSAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcig4MCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSB3b3Jkcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkgewotICAgICAgICAgICAgU3RyaW5nIHdvcmQgPSB3b3Jkc1tpXTsKLSAgICAgICAgICAgIC8vIHNlcGVyYXRlIHdpdGggZG90Ci0gICAgICAgICAgICBpZiAoaSAhPSB3b3Jkcy5sZW5ndGggLSAxKQotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgnLicpOwotICAgICAgICAgICAgc2IuYXBwZW5kKHdvcmQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwcm90b2NvbCArICI6Ly8iICsgc2IudG9TdHJpbmcoKSArICIvIjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgYSBtZXRob2Qgc2hvdWxkIGhhdmUgYW4gT3BlcmF0aW9uRGVzY3JpcHRpb24gY3JlYXRlZCBmb3IgaXQgYmFzZWQgb24gdGhlCi0gICAgICogbmFtZS4gVGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCB0byBhbGxvdyB1cyB0byBleGx1ZGUgbWV0aG9kcyBzdWNoIGFzIGNvbnN0cnVjdG9ycy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXRob2ROYW1lCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHN0YXRpYyBib29sZWFuIGNyZWF0ZU9wZXJhdGlvbkRlc2NyaXB0aW9uKFN0cmluZyBtZXRob2ROYW1lKSB7Ci0gICAgICAgIGlmIChtZXRob2ROYW1lLmVxdWFscyhDT05TVFJVQ1RPUl9NRVRIT0QpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBpcyBhIGhlbHBlciBtZXRob2QgdGhhdCB3aWxsIG9wZW4gYSBzdHJlYW0gdG8gYW4gQEhhbmRsZXJDaGFpbiBjb25maWd1cmF0aW9uIGZpbGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29uZmlnRmlsZSAgLSBUaGUgcGF0aCB0byB0aGUgZmlsZQotICAgICAqIEBwYXJhbSBjbGFzc05hbWUgICAtIFRoZSBjbGFzcyBpbiB3aGljaCB0aGUgYW5ub3RhdGlvbiB3YXMgZGVjbGFyZWQuIFRoaXMgaXMgdXNlZCBpbiBjYXNlIHRoZQotICAgICAqICAgICAgICAgICAgICAgICAgICBmaWxlIHBhdGggaXMgcmVsYXRpdmUuCi0gICAgICogQHBhcmFtIGNsYXNzTG9hZGVyIC0gQ2xhc3NMb2FkZXIgdXNlZCB0byBsb2FkIHJlbGF0aXZlIGZpbGUgcGF0aHMuCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSW5wdXRTdHJlYW0gb3BlbkhhbmRsZXJDb25maWdTdHJlYW0oU3RyaW5nIGNvbmZpZ0ZpbGUsIFN0cmluZyBjbGFzc05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc0xvYWRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc0xvYWRlcikgewotICAgICAgICBJbnB1dFN0cmVhbSBjb25maWdTdHJlYW0gPSBudWxsOwotICAgICAgICBVUkwgY29uZmlnVVJMOwotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiQXR0ZW1wdGluZyB0byBsb2FkIEBIYW5kbGVyQ2hhaW4gY29uZmlndXJhdGlvbiBmaWxlOiAiICsgY29uZmlnRmlsZSArCi0gICAgICAgICAgICAgICAgICAgICIgcmVsYXRpdmUgdG8gY2xhc3M6ICIgKyBjbGFzc05hbWUpOwotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjb25maWdVUkwgPSBuZXcgVVJMKGNvbmZpZ0ZpbGUpOwotICAgICAgICAgICAgaWYgKGNvbmZpZ1VSTCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiRm91bmQgYWJzb2x1dGUgQEhhbmRsZXJDaGFpbiBjb25maWd1cmF0aW9uIGZpbGU6ICIgKyBjb25maWdGaWxlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY29uZmlnU3RyZWFtID0gY29uZmlnVVJMLm9wZW5TdHJlYW0oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIHRyeSBhbm90aGVyIG1ldGhvZCB0byBvYnRhaW4gYSBzdHJlYW0gdG8gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyByZXBvcnQgdGhpcyBzaW5jZSBpdCB3YXMgYSB2YWxpZCBVUkwgYnV0IHRoZSBvcGVuU3RyZWFtIGNhdXNlZCBhIHByb2JsZW0KLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiaGNDb25maWdMb2FkRmFpbCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnRmlsZSwgY2xhc3NOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUudG9TdHJpbmcoKSkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjb25maWdTdHJlYW0gPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJASGFuZGxlckNoYWluLmZpbGUgYXR0cmlidXRlIHJlZmVycyB0byBhIHJlbGF0aXZlIGxvY2F0aW9uOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICArIGNvbmZpZ0ZpbGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2xhc3NOYW1lID0gY2xhc3NOYW1lLnJlcGxhY2UoIi4iLCAiLyIpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJSZXNvbHZpbmcgQEhhbmRsZXJDaGFpbiBjb25maWd1cmF0aW9uIGZpbGU6ICIgKyBjb25maWdGaWxlICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHJlbGF0aXZlIHRvIGNsYXNzIGZpbGU6ICIgKyBjbGFzc05hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBVUkkgdXJpID0gbmV3IFVSSShjbGFzc05hbWUpOwotICAgICAgICAgICAgICAgIHVyaSA9IHVyaS5yZXNvbHZlKGNvbmZpZ0ZpbGUpOwotICAgICAgICAgICAgICAgIFN0cmluZyByZXNvbHZlZFBhdGggPSB1cmkudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJASGFuZGxlckNoYWluLmZpbGUgcmVzb2x2ZWQgZmlsZSBwYXRoIGxvY2F0aW9uOiAiICsgcmVzb2x2ZWRQYXRoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY29uZmlnU3RyZWFtID0gZ2V0SW5wdXRTdHJlYW0ocmVzb2x2ZWRQYXRoLCBjbGFzc0xvYWRlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoImhjQ29uZmlnTG9hZEZhaWwiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWdGaWxlLCBjbGFzc05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUudG9TdHJpbmcoKSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChjb25maWdTdHJlYW0gPT0gbnVsbCkgewotICAgICAgICAgICAgLy90aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoImhhbmRsZXJDaGFpbk5TIiwKLSAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ0ZpbGUsIGNsYXNzTmFtZSkpOwotICAgICAgICAgICAgLy8gTm8gbG9uZ2VyIHRocm93aW5nIGFuIGV4Y2VwdGlvbiBoZXJlLiAgVGhpcyBtZXRob2QgaXMgYmVzdC1lZmZvcnQsIGFuZCB0aGUgY2FsbGVyIG1heQotICAgICAgICAgICAgLy8gY2hhbmdlIHRoZSBjbGFzcyB0byB3aGljaCB0aGUgcGF0aCBpcyByZWxhdGl2ZSBhbmQgdHJ5IGFnYWluLiAgVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZQotICAgICAgICAgICAgLy8gZm9yIGRldGVybWluaW5nIHdoZW4gdG8gImdpdmUgdXAiCi0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkBIYW5kbGVyQ2hhaW4gY29uZmlndXJhdGlvbiBmYWlsOiAiICsgY29uZmlnRmlsZSArICIgaW4gY2xhc3M6ICIgKyBjbGFzc05hbWUgKyAiIGZhaWxlZCB0byBsb2FkLiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJASGFuZGxlckNoYWluIGNvbmZpZ3VyYXRpb24gZmlsZTogIiArIGNvbmZpZ0ZpbGUgKyAiIGluIGNsYXNzOiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZSArICIgd2FzIHN1Y2Nlc3NmdWxseSBsb2FkZWQuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNvbmZpZ1N0cmVhbTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oU3RyaW5nIHBhdGgsIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKSB7Ci0gICAgICAgIElucHV0U3RyZWFtIGNvbmZpZ1N0cmVhbSA9IGNsYXNzTG9hZGVyLmdldFJlc291cmNlQXNTdHJlYW0ocGF0aCk7Ci0gICAgICAgIGlmIChjb25maWdTdHJlYW0gPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gdHJ5IGFub3RoZXIgY2xhc3Nsb2FkZXIKLSAgICAgICAgICAgIENsYXNzTG9hZGVyIGNsID0gU3lzdGVtLmNsYXNzLmdldENsYXNzTG9hZGVyKCk7Ci0gICAgICAgICAgICBpZiAoY2wgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNvbmZpZ1N0cmVhbSA9IGNsLmdldFJlc291cmNlQXNTdHJlYW0ocGF0aCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNvbmZpZ1N0cmVhbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBhbmQgYW5vdGhlciBjbGFzc2xvYWRlcgotICAgICAgICAgICAgQ2xhc3NMb2FkZXIgY2wgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOwotICAgICAgICAgICAgaWYgKGNsICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjb25maWdTdHJlYW0gPSBjbC5nZXRSZXNvdXJjZUFzU3RyZWFtKHBhdGgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjb25maWdTdHJlYW07Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGV0ZXJtaW5lIGlzIHRoaXMgbWV0aG9kIGlzIGFuIGFzeW5jIG1ldGhvZAotICAgICAqIEBwYXJhbSBtZXRob2QgLSBUaGUgbWV0aG9kIHRvIGV4YW1pbmUKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQXN5bmMoTWV0aG9kIG1ldGhvZCkgewotCi0gICAgICAgIGlmIChtZXRob2QgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIG1ldGhvZE5hbWUgPSBtZXRob2QuZ2V0TmFtZSgpOwotICAgICAgICBDbGFzcyByZXR1cm5UeXBlID0gbWV0aG9kLmdldFJldHVyblR5cGUoKTsKLQotICAgICAgICBpZiAobWV0aG9kTmFtZS5lbmRzV2l0aCgiQXN5bmMiKQotICAgICAgICAgICAgJiYgKHJldHVyblR5cGUuaXNBc3NpZ25hYmxlRnJvbShqYXZheC54bWwud3MuUmVzcG9uc2UuY2xhc3MpIHx8IHJldHVyblR5cGUKLSAgICAgICAgICAgICAgICAuaXNBc3NpZ25hYmxlRnJvbShqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmUuY2xhc3MpKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBIYW5kbGVyQ2hhaW5zVHlwZSBsb2FkSGFuZGxlckNoYWlucyhJbnB1dFN0cmVhbSBpcywgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEhhbmRsZXJDaGFpbnNQYXJzZXIgcGFyc2VyID0gbmV3IEhhbmRsZXJDaGFpbnNQYXJzZXIoKTsKLSAgICAgICAgICAgIHJldHVybiBwYXJzZXIubG9hZEhhbmRsZXJDaGFpbnMoaXMpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeQotICAgICAgICAgICAgICAgICAgICAubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgibG9hZEhhbmRsZXJDaGFpbkVyciIsIGUuZ2V0TWVzc2FnZSgpKSk7Ci0gICAgICAgIH0gICAgICAgCi0gICAgfQotICAgIAotCQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgbG9vcCB0aHJvdWdoIGEgbGlzdCBvZiBleHRlbnNpYmlsaXR5IGVsZW1lbnRzIGxvb2tpbmcgZm9yIG9uZQotICAgICAqIG9mIGZvdXIgb2JqZWN0czogU09BUEJvZHksIFNPQVAxMkJvZHksIFNPQVBIZWFkZXIsIFNPQVAxMkhlYWRlci4gSWYgYW55IG9mIHRoZXNlCi0gICAgICogb2JqZWN0cyBhcmUgZm91bmQgdGhlIG5hbWVzcGFjZSBVUkkgZnJvbSB0aGlzIG9iamVjdCB3aWxsIGJlIHJldHVybmVkLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE5hbWVzcGFjZUZyb21TT0FQRWxlbWVudChMaXN0IGV4dEVsZW1lbnRzKSB7Ci0gICAgICAgIEl0ZXJhdG9yIGV4dEl0ZXIgPSBleHRFbGVtZW50cy5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoZXh0SXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIE9iamVjdCBleHRPYmogPSBleHRJdGVyLm5leHQoKTsKLSAgICAgICAgICAgIGlmIChleHRPYmogaW5zdGFuY2VvZiBTT0FQQm9keSkgewotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlJldHVybmluZyBTT0FQQm9keSBuYW1lc3BhY2U6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICgoU09BUEJvZHkpIGV4dE9iaikuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gKChTT0FQQm9keSkgZXh0T2JqKS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZXh0T2JqIGluc3RhbmNlb2YgU09BUDEyQm9keSkgewotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlJldHVybmluZyBTT0FQMTJCb2R5IG5hbWVzcGFjZTogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKChTT0FQMTJCb2R5KSBleHRPYmopLmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuICgoU09BUDEyQm9keSkgZXh0T2JqKS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZXh0T2JqIGluc3RhbmNlb2YgU09BUEhlYWRlcikgewotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlJldHVybmluZyBTT0FQSGVhZGVyIG5hbWVzcGFjZTogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKChTT0FQSGVhZGVyKSBleHRPYmopLmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuICgoU09BUEhlYWRlcikgZXh0T2JqKS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZXh0T2JqIGluc3RhbmNlb2YgU09BUDEySGVhZGVyKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiUmV0dXJuaW5nIFNPQVAxMkhlYWRlciBuYW1lc3BhY2U6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICgoU09BUDEySGVhZGVyKSBleHRPYmopLmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuICgoU09BUDEySGVhZGVyKSBleHRPYmopLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoZXh0T2JqIGluc3RhbmNlb2YgTUlNRU11bHRpcGFydFJlbGF0ZWQpIHsKLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJGb3VuZCBhIE1JTUVNdWx0aXBhcnRSZWxhdGVkIGVsZW1lbnQuICBVbndyYXBwaW5nIHRvIGdldCBTT0FQIGJpbmRpbmcuIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIE1JTUVNdWx0aXBhcnRSZWxhdGVkIG1pbWUgPSAoTUlNRU11bHRpcGFydFJlbGF0ZWQpIGV4dE9iajsKLSAgICAgICAgICAgICAgICBMaXN0IG1pbWVQYXJ0cyA9IG1pbWUuZ2V0TUlNRVBhcnRzKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgSXRlcmF0b3IgaXRyID0gbWltZVBhcnRzLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgTUlNRVBhcnQgbWltZVBhcnQgPSAoTUlNRVBhcnQpIGl0ci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIExpc3QgZWxlbWVudHMgPSBtaW1lUGFydC5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBucyA9IGdldE5hbWVzcGFjZUZyb21TT0FQRWxlbWVudChlbGVtZW50cyk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuczsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgcHJvY2VzcyBhIFdTREwgQmluZGluZyBhbmQgYnVpbGQgQXR0YWNobWVudERlc2NyaXB0aW9uIG9iamVjdHMgaWYgdGhlCi0gICAgICogV1NETCBkaWNhdGF0ZXMgYXR0YWNobWVudHMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGdldEF0dGFjaG1lbnRGcm9tQmluZGluZyhPcGVyYXRpb25EZXNjcmlwdGlvbkltcGwgb3BEZXNjLCBCaW5kaW5nIGJpbmRpbmcpIHsKLSAgICAgICAgaWYgKGJpbmRpbmcgIT0gbnVsbCkgewotICAgICAgICAgICAgSXRlcmF0b3IgYmluZGluZ09wSXRlciA9IGJpbmRpbmcuZ2V0QmluZGluZ09wZXJhdGlvbnMoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgd2hpbGUgKGJpbmRpbmdPcEl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3AgPSAoQmluZGluZ09wZXJhdGlvbikgYmluZGluZ09wSXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgLy8gZm91bmQgdGhlIEJpbmRpbmdPcGVyYXRpb24gdGhhdCBtYXRjaGVzIHRoZSBjdXJyZW50IE9wZXJhdGlvbkRlc2NyaXB0aW9uCi0gICAgICAgICAgICAgICAgaWYgKGJpbmRpbmdPcC5nZXROYW1lKCkuZXF1YWxzKG9wRGVzYy5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChiaW5kaW5nT3AuZ2V0QmluZGluZ0lucHV0KCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiUHJvY2Vzc2luZyBiaW5kaW5nIG9wZXJ0aW9uIGlucHV0Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzQmluZGluZ0Zvck1JTUUoYmluZGluZ09wLmdldEJpbmRpbmdJbnB1dCgpLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcERlc2MsIGJpbmRpbmdPcC5nZXRPcGVyYXRpb24oKSwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGJpbmRpbmdPcC5nZXRCaW5kaW5nT3V0cHV0KCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJQcm9jZXNzaW5nIGJpbmRpbmcgb3V0cHV0Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzQmluZGluZ0Zvck1JTUUoYmluZGluZ09wLmdldEJpbmRpbmdPdXRwdXQoKS5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BEZXNjLCBiaW5kaW5nT3AuZ2V0T3BlcmF0aW9uKCksIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgbG9vcCB0aHJvdWdoIHRoZSBleHRlbnNpYmlsaXR5IGVsZW1lbnRzIGZvciBhIGdpdmVuIEJpbmRpbmdJbnB1dCBvcgotICAgICAqIEJpbmRpbmdPdXRwdXQgZWxlbWVudCBhbmQgZGV0ZXJtaW5lIGlmIGl0IGhhcyBhbnkgTUlNRU11bHRpcGFydFJlbGF0ZWQgY29udGVudC4gSWYgaXQgCi0gICAgICogZG9lcyBpdCB3aWxsIGJ1aWxkIHVwIHRoZSBhcHByb3ByaWF0ZSBBdHRhY2htZW50RGVzY3JpcHRpb24gb2JqZWN0cy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHByb2Nlc3NCaW5kaW5nRm9yTUlNRShMaXN0IGV4dGVuc2liaWxpdHlFbGVtZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYXRpb25EZXNjcmlwdGlvbkltcGwgb3BEZXNjLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYXRpb24gb3BlcmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNSZXF1ZXN0KSB7Ci0gICAgICAgIEl0ZXJhdG9yIGV4dGVuc2liaWxpdHlJdGVyID0gZXh0ZW5zaWJpbGl0eUVsZW1lbnRzLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChleHRlbnNpYmlsaXR5SXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIE9iamVjdCBvYmogPSBleHRlbnNpYmlsaXR5SXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgTUlNRU11bHRpcGFydFJlbGF0ZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkZvdW5kIGEgbWltZTptdWx0aXBhcnRSZWxhdGVkIGV4dGVuc2libGl0eSBlbGVtZW50LiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gRm91bmQgbWltZSBpbmZvcm1hdGlvbiBub3cgcHJvY2VzcyBpdCBhbmQgZGV0ZXJtaW5lIGlmIHdlIG5lZWQgdG8KLSAgICAgICAgICAgICAgICAvLyBjcmVhdGUgYW4gQXR0YWNobWVudERlc2NyaXB0aW9uCi0gICAgICAgICAgICAgICAgTUlNRU11bHRpcGFydFJlbGF0ZWQgbWltZSA9IChNSU1FTXVsdGlwYXJ0UmVsYXRlZCkgb2JqOwotICAgICAgICAgICAgICAgIEl0ZXJhdG9yIHBhcnRJdGVyID0gbWltZS5nZXRNSU1FUGFydHMoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgIHdoaWxlIChwYXJ0SXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiRm91bmQgYSBtaW1lOnBhcnQgY2hpbGQgZWxlbWVudC4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgTUlNRVBhcnQgbWltZVBhcnQgPSAoTUlNRVBhcnQpIHBhcnRJdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3IgbUV4dEl0ZXIgPSBtaW1lUGFydC5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgICAgICAvLyBQcm9jZXNzIGVhY2ggbWltZSBwYXJ0IHRvIGRldGVybWluZSBpZiB0aGVyZSBpcyBtaW1lIGNvbnRlbnQKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG1FeHRJdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IG9iajIgPSBtRXh0SXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBGb3IgbWltZSBjb250ZW50IHdlIG5lZWQgdG8gcG90ZW50aWFsbHkgY3JlYXRlIGFuIEF0dGFjaG1lbnREZXNjcmlwdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9iajIgaW5zdGFuY2VvZiBNSU1FQ29udGVudCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1JTUVDb250ZW50IG1pbWVDb250ZW50ID0gKE1JTUVDb250ZW50KSBvYmoyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXJ0ID0gbWltZUNvbnRlbnQuZ2V0UGFydCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0eXBlID0gbWltZUNvbnRlbnQuZ2V0VHlwZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIGhhdmUgbm90IGFscmVhZHkgcHJvY2Vzc2VkIHRoaXMgcGFydCBmb3IgdGhlIG9wZXJhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcERlc2MuZ2V0UGFydEF0dGFjaG1lbnREZXNjcmlwdGlvbihwYXJ0KSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJBZGRpbmcgbmV3IEF0dGFjaG1lbnREZXNjcmlwdGlvbiBmb3IgcGFydDogIiArIHBhcnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIG9uIG9wZXJhdGlvbjogIiArIG9wRGVzYy5nZXRPcGVyYXRpb25OYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dGFjaG1lbnREZXNjcmlwdGlvbiBhdHRhY2htZW50RGVzYyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEF0dGFjaG1lbnREZXNjcmlwdGlvbkltcGwoQXR0YWNobWVudFR5cGUuU1dBLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IHR5cGUgfSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wRGVzYy5hZGRQYXJ0QXR0YWNobWVudERlc2NyaXB0aW9uKHBhcnQsIGF0dGFjaG1lbnREZXNjKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQWxyZWFkeSBjcmVhdGVkIEF0dGFjaG1lbnREZXNjcmlwdGlvbiBmb3IgcGFydDogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHBhcnQgKyAiIG9mIHR5cGU6ICIgKyB0eXBlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG9iajIgaW5zdGFuY2VvZiBTT0FQQm9keSB8fCBvYmoyIGluc3RhbmNlb2YgU09BUDEyQm9keSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkZvdW5kIGEgYm9keSBlbGVtZW50IHdpdGggcG90ZW50aWFsIG5lc3RlZCBtaW1lIGNvbnRlbnQiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmxhZyB3aGV0aGVyIHRoZXJlJ3MgYSBwb3RlbnRpYWwgbmVzdGVkIGF0dGFjaG1lbnQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzUmVxdWVzdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcERlc2Muc2V0SGFzUmVxdWVzdFN3YVJlZkF0dGFjaG1lbnRzKHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BEZXNjLnNldEhhc1Jlc3BvbnNlU3dhUmVmQXR0YWNobWVudHModHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlckhhbmRsZXJIZWFkZXJzKEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlLCBMaXN0PEhhbmRsZXI+IGhhbmRsZXJzKSB7Ci0gICAgICAgIGlmIChoYW5kbGVycyA9PSBudWxsIHx8IGF4aXNTZXJ2aWNlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgQXJyYXlMaXN0PFFOYW1lPiB1bmRlcnN0b29kSGVhZGVyUU5hbWVzID0gbmV3IEFycmF5TGlzdDxRTmFtZT4oKTsKLSAgICAgICAgZm9yIChIYW5kbGVyIGhhbmRsZXIgOiBoYW5kbGVycykgewotICAgICAgICAgICAgaWYgKGhhbmRsZXIgaW5zdGFuY2VvZiBTT0FQSGFuZGxlcikgewotICAgICAgICAgICAgICAgIFNPQVBIYW5kbGVyIHNvYXBIYW5kbGVyID0gKFNPQVBIYW5kbGVyKSBoYW5kbGVyOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFNldDxRTmFtZT4gaGVhZGVycyA9IHNvYXBIYW5kbGVyLmdldEhlYWRlcnMoKTsKLSAgICAgICAgICAgICAgICBpZiAoaGVhZGVycyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoUU5hbWUgaGVhZGVyIDogaGVhZGVycykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF1bmRlcnN0b29kSGVhZGVyUU5hbWVzLmNvbnRhaW5zKGhlYWRlcikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlcnN0b29kSGVhZGVyUU5hbWVzLmFkZChoZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSAKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKCF1bmRlcnN0b29kSGVhZGVyUU5hbWVzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgUGFyYW1ldGVyIGhlYWRlclFOUGFyYW1ldGVyID0gCi0gICAgICAgICAgICAgICAgbmV3IFBhcmFtZXRlcihFbmRwb2ludERlc2NyaXB0aW9uLkhBTkRMRVJfUEFSQU1FVEVSX1FOQU1FUywgdW5kZXJzdG9vZEhlYWRlclFOYW1lcyk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlLmFkZFBhcmFtZXRlcihoZWFkZXJRTlBhcmFtZXRlcik7Ci0gICAgICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgZSkgewotICAgICAgICAgICAgICAgIGxvZy53YXJuKE1lc3NhZ2VzLmdldE1lc3NhZ2UoInJlZ0hhbmRsZXJIZWFkZXJzRXJyIixheGlzU2VydmljZS5nZXROYW1lKCksZS5nZXRNZXNzYWdlKCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSAgCi0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEdpdmVuIGEgYmluZGluZyB0eXBlIHZhbHVlIGJhc2VkIG9uIGEgSkFYV1MgYW5udGF0aW9uLCByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgV1NETAotICAgICAqIGJpbmRpbmcgdHlwZS4gIFRoZSBKQVhXUyBhbm5vdGF0aW9uIHZhbHVlcyB1bmRlcnN0b29kIGFyZSB0aG9zZSByZXR1cm5lZCBieQotICAgICAqIG1hcEJpbmRpbmdUeXBlV3NkbHRvQW5ub3RhdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAc2VlICNtYXBCaW5kaW5nVHlwZVdzZGxUb0Fubm90YXRpb24oU3RyaW5nLCBTdHJpbmcpCi0gICAgICogCi0gICAgICogQHBhcmFtIGFubm90YXRpb25CaW5kaW5nVHlwZSBUaGUgYmluZGluZyB0eXBlIGFzIHJlcHJlc2VudGVkIGJ5IGEgSkFYV1MgYW5ub3RhdGlvbiB2YWx1ZQotICAgICAqIEByZXR1cm4gVGhlIGJpbmRpbmcgdHlwZSBhcyByZXByZXNlbnRlZCBieSBhIFdTREwgYmluZGluZyBleHRlbnNpb24gbmFtZXNwYWNlIHZhbHVlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgbWFwQmluZGluZ1R5cGVBbm5vdGF0aW9uVG9Xc2RsKFN0cmluZyBhbm5vdGF0aW9uQmluZGluZ1R5cGUpIHsKLSAgICAgICAgU3RyaW5nIHdzZGxCaW5kaW5nVHlwZSA9IG51bGw7Ci0gICAgICAgIAotICAgICAgICBpZiAoU09BUEJpbmRpbmcuU09BUDExSFRUUF9CSU5ESU5HLmVxdWFscyhhbm5vdGF0aW9uQmluZGluZ1R5cGUpCi0gICAgICAgICAgICAgICAgfHwgTURRQ29uc3RhbnRzLlNPQVAxMUpNU19CSU5ESU5HLmVxdWFscyhhbm5vdGF0aW9uQmluZGluZ1R5cGUpKSB7Ci0gICAgICAgICAgICB3c2RsQmluZGluZ1R5cGUgPSBFbmRwb2ludERlc2NyaXB0aW9uV1NETC5TT0FQMTFfV1NETF9CSU5ESU5HOwotICAgICAgICB9IGVsc2UgaWYgKFNPQVBCaW5kaW5nLlNPQVAxMkhUVFBfQklORElORy5lcXVhbHMoYW5ub3RhdGlvbkJpbmRpbmdUeXBlKQotICAgICAgICAgICAgICAgIHx8IE1EUUNvbnN0YW50cy5TT0FQMTJKTVNfQklORElORy5lcXVhbHMoYW5ub3RhdGlvbkJpbmRpbmdUeXBlKSkgewotICAgICAgICAgICAgd3NkbEJpbmRpbmdUeXBlID0gRW5kcG9pbnREZXNjcmlwdGlvbldTREwuU09BUDEyX1dTRExfQklORElORzsKLSAgICAgICAgfSBlbHNlIGlmIChqYXZheC54bWwud3MuaHR0cC5IVFRQQmluZGluZy5IVFRQX0JJTkRJTkcuZXF1YWxzKGFubm90YXRpb25CaW5kaW5nVHlwZSkpIHsKLSAgICAgICAgICAgIHdzZGxCaW5kaW5nVHlwZSA9IEVuZHBvaW50RGVzY3JpcHRpb25XU0RMLkhUVFBfV1NETF9CSU5ESU5HOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gd3NkbEJpbmRpbmdUeXBlOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBHaXZlbiBhIGJpbmRpbmcgdHlwZSB2YWx1ZSBiYXNlZCBvbiBXU0RMLCByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgSkFYV1MgYW5ub3RhdGlvbiB2YWx1ZS4KLSAgICAgKiBUaGUgV1NETCBiaW5kaW5nIHR5cGUgdmFsdWVzIGFyZSBiYXNlZCBvbiB0aGUgbmFtZXNwYWNlIG9mIHRoZSBiaW5kaW5nIGV4dGVuc2lvbiBlbGVtZW50LgotICAgICAqIFRoZSBKQVhXUyBhbm5vdGF0aW9uIHZhbHVlcyBjb3JyZXNwb25kIHRvIHRoZSB2YWx1ZXMgdG8gdGhlIEhUVFBCaW5kaW5nIGFuZCBTT0FQQmluZGluZwotICAgICAqIGFubm90YXRpb25zLiAgQWRkaXRpb25hbGx5LCBwcm9wcmlldGFyeSB2YWx1ZXMgZm9yIEpNUyBiaW5kaW5ncyBhcmUgc3VwcG9ydGVkLiAgVGhlIEpBWFdTCi0gICAgICogYmluZGluZyB0eXBlIGFubm90YXRpb24gdmFsdWVzIHJldHVybmVkIGNvdWxkIGJlIGZyb20gU09BUEJpbmRpbmcgb3IgSFRUUEJpbmRpbmcuCi0gICAgICogCi0gICAgICogQHBhcmFtIHdzZGxCaW5kaW5nVHlwZSBUaGUgYmluZGluZyB0eXBlIGFzIHJlcHJlc250ZWQgYnkgdGhlIFdTREwgYmluZGluZyBleHRlbnNpb24gbmFtZXNwYWNlCi0gICAgICogQHBhcmFtIHNvYXBUcmFuc3BvcnQgVGhlIFdTREwgdHJhbnNwb3J0LiAgVXNlZCB0byBkZXRlcm1pbmUgaWYgYSBKTVMgYmluZGluZyB0eXBlIHNob3VsZAotICAgICAqIGJlIHJldHVybmVkCi0gICAgICogQHJldHVybiBUaGUgYmluZGluZyByZXByZXNlbnRlZCBieSBhIEpBWFdTIEJpbmRpbmcgVHlwZSBBbm5vdGF0aW9uIHZhbHVlIGZyb20gZWl0aGVyIAotICAgICAqIFNPQVBCaW5kaW5nIG9yIEhUVFBCaW5kaW5nLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIG1hcEJpbmRpbmdUeXBlV3NkbFRvQW5ub3RhdGlvbihTdHJpbmcgd3NkbEJpbmRpbmdUeXBlLCBTdHJpbmcgc29hcFRyYW5zcG9ydCkgewotICAgICAgICBTdHJpbmcgc29hcEJpbmRpbmdUeXBlID0gbnVsbDsKLSAgICAgICAgaWYgKEVuZHBvaW50RGVzY3JpcHRpb25XU0RMLlNPQVAxMV9XU0RMX0JJTkRJTkcuZXF1YWxzKHdzZGxCaW5kaW5nVHlwZSkpIHsKLSAgICAgICAgICAgIGlmIChNRFFDb25zdGFudHMuU09BUDExSk1TX0JJTkRJTkcuZXF1YWxzKHNvYXBUcmFuc3BvcnQpKSB7Ci0gICAgICAgICAgICAgICAgc29hcEJpbmRpbmdUeXBlID0gIE1EUUNvbnN0YW50cy5TT0FQMTFKTVNfQklORElORzsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy9SRVZJRVc6IFdlIGFyZSBtYWtpbmcgdGhlIGFzc3VtcHRpb24gdGhhdCBpZiBub3QgSk1TLCB0aGVuIEhUVFAKLSAgICAgICAgICAgICAgICBzb2FwQmluZGluZ1R5cGUgPSBTT0FQQmluZGluZy5TT0FQMTFIVFRQX0JJTkRJTkc7Ci0gICAgICAgICAgICB9IAotICAgICAgICB9IGVsc2UgaWYgKEVuZHBvaW50RGVzY3JpcHRpb25XU0RMLlNPQVAxMl9XU0RMX0JJTkRJTkcuZXF1YWxzKHdzZGxCaW5kaW5nVHlwZSkpIHsKLSAgICAgICAgICAgIGlmIChNRFFDb25zdGFudHMuU09BUDEySk1TX0JJTkRJTkcuZXF1YWxzKHNvYXBUcmFuc3BvcnQpKSB7Ci0gICAgICAgICAgICAgICAgc29hcEJpbmRpbmdUeXBlID0gIE1EUUNvbnN0YW50cy5TT0FQMTJKTVNfQklORElORzsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy9SRVZJRVc6IFdlIGFyZSBtYWtpbmcgdGhlIGFzc3VtcHRpb24gdGhhdCBpZiBub3QgSk1TLCB0aGVuIEhUVFAKLSAgICAgICAgICAgICAgICBzb2FwQmluZGluZ1R5cGUgPSBTT0FQQmluZGluZy5TT0FQMTJIVFRQX0JJTkRJTkc7Ci0gICAgICAgICAgICB9IAotICAgICAgICB9IGVsc2UgaWYgKEVuZHBvaW50RGVzY3JpcHRpb25XU0RMLkhUVFBfV1NETF9CSU5ESU5HLmVxdWFscyh3c2RsQmluZGluZ1R5cGUpKSB7Ci0gICAgICAgICAgICBzb2FwQmluZGluZ1R5cGUgPSBqYXZheC54bWwud3MuaHR0cC5IVFRQQmluZGluZy5IVFRQX0JJTkRJTkc7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNvYXBCaW5kaW5nVHlwZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9pbXBsL0VuZHBvaW50RGVzY3JpcHRpb25JbXBsLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9pbXBsL0VuZHBvaW50RGVzY3JpcHRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2YmEwZjYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vaW1wbC9FbmRwb2ludERlc2NyaXB0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE0MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uaW1wbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuU2VydmljZUNsaWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlR3JvdXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5PdXRJbkF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5PdXRPbmx5QXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLldTREwxMVRvQWxsQXhpc1NlcnZpY2VzQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLldTREwxMVRvQXhpc1NlcnZpY2VCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuRXhjZXB0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNhdGFsb2cuSkFYV1NDYXRhbG9nTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkVuZHBvaW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5FbmRwb2ludERlc2NyaXB0aW9uSmF2YTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkVuZHBvaW50RGVzY3JpcHRpb25XU0RMOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLlNlcnZpY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLlNlcnZpY2VEZXNjcmlwdGlvbldTREw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLkN1c3RvbUFubm90YXRpb25JbnN0YW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuQ3VzdG9tQW5ub3RhdGlvblByb2Nlc3NvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5NRFFDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLldzZGxDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi54bWwuaGFuZGxlci5IYW5kbGVyQ2hhaW5zVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmZlYXR1cmUuU2VydmVyQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZmVhdHVyZS5TZXJ2ZXJGcmFtZXdvcms7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5pMThuLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MucmVnaXN0cnkuU2VydmVyQ29uZmlndXJhdG9yUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51dGlsLkNhdGFsb2dVUklSZXNvbHZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnV0aWwuV1NETDRKV3JhcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuV1NETENvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwudXRpbC5XU0RMRGVmaW5pdGlvbldyYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC5qd3MuSGFuZGxlckNoYWluOwotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOwotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZzsKLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5Qb3J0OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQQmluZGluZzsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQQWRkcmVzczsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcDEyLlNPQVAxMkFkZHJlc3M7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAxMi5TT0FQMTJCaW5kaW5nOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLndzLkJpbmRpbmdUeXBlOwotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlOwotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlTW9kZTsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZVByb3ZpZGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLlBvcnRJbmZvOwotaW1wb3J0IGphdmF4LnhtbC53cy5zb2FwLk1UT007Ci1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuTVRPTUZlYXR1cmU7Ci1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuU09BUEJpbmRpbmc7Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb247Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7Ci0KLS8qKiBAc2VlIC4uL0VuZHBvaW50RGVzY3JpcHRpb24gKi8KLS8qCi0gKiBJTVBPUlRBTlQgTk9URTogQXhpczIgY3VycmVudGx5IG9ubHkgc3VwcG9ydHMgMSBzZXJ2aWNlIGFuZCAxIHBvcnQgdW5kZXIgdGhhdCBzZXJ2aWNlLiAgV2hlbiB0aGF0IGlzCi0gKiBmaXhlZCwgdGhhdCB3aWxsIHByb2JhYmx5IGhhdmUgYW4gaW1wYWN0IG9uIHRoaXMgY2xhc3MuICBJbiBwYXJ0aWN1bGFyLCBJIHRoaW5rIHRoaXMgc2hvdWxkIGJlIGNyZWF0ZWQgCi0gKiBzb21laG93IGZyb20gYW4gQXhpc1NlcnZpY2UvQXhpc1BvcnQgY29tYmluYXRpb24sIGFuZCBub3QgZGlyZWN0bHkgZnJvbSB0aGUgV1NETC4KLSAqLwotY2xhc3MgRW5kcG9pbnREZXNjcmlwdGlvbkltcGwKLSAgICAgICAgaW1wbGVtZW50cyBFbmRwb2ludERlc2NyaXB0aW9uLCBFbmRwb2ludERlc2NyaXB0aW9uSmF2YSwgRW5kcG9pbnREZXNjcmlwdGlvbldTREwgewotCi0gICAgcHJpdmF0ZSBTZXJ2aWNlRGVzY3JpcHRpb25JbXBsIHBhcmVudFNlcnZpY2VEZXNjcmlwdGlvbjsKLSAgICBwcml2YXRlIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlOwotICAgIC8vIEluIHNvbWUgZW52aXJvbm1lbnRzIHNvbWUgb2YgdGhlIHJlc291cmNlcyBvbiBhbiBBeGlzU2VydmljZSBjYW4gbGVhZCB0byBPT01zLgotICAgIC8vIEhvd2V2ZXIsIHJlbGVhc2luZyB0aGVzZSByZXNvdXJjZXMgY2FuIGhhdmUgb3RoZXIgaW1wbGljYXRpb25zLiAgCi0gICAgcHJpdmF0ZSBib29sZWFuIHJlbGVhc2VBeGlzU2VydmljZVJlc291cmNlcyA9IGZhbHNlOwotCi0gICAgcHJpdmF0ZSBRTmFtZSBwb3J0UU5hbWU7Ci0gICAgcHJpdmF0ZSBRTmFtZSBzZXJ2aWNlUU5hbWU7Ci0KLSAgICAvLyBDb3JyZXNwb25kcyB0byBhIHBvcnQgdGhhdCB3YXMgYWRkZWQgZHluYW1pY2FsbHkgdmlhIGFkZFBvcnQgYW5kIGlzIG5vdCBkZWNsYXJlZCAoZWl0aGVyIGluIFdTREwgb3IgYW5ub3RhdGlvbnMpCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzRHluYW1pY1BvcnQ7Ci0KLSAgICAvLyBJZiB0aGUgV1NETCBpcyBmdWxseSBzcGVjaWZpZWQsIHdlIGNvdWxkIGJ1aWxkIHRoZSBBeGlzU2VydmljZSBmcm9tIHRoZSBXU0RMCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzQXhpc1NlcnZpY2VCdWlsdEZyb21XU0RMOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgc2VydmljZUltcGxOYW1lOyAgICAvL2NsYXNzIG5hbWUgb2YgdGhlIHNlcnZpY2UgaW1wbCBvciBTRUkKLQotICAgIC8vIE5vdGUgdGhhdCBhbiBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uIHdpbGwgT05MWSBiZSBzZXQgZm9yIGFuIEVuZHBvaW50LWJhc2VkIGltcGxlbWVudGF0aW9uOwotICAgIC8vIGl0IHdpbGwgTk9UIGJlIHNldCBmb3IgYSBQcm92aWRlci1iYXNlZCBpbXBsZW1lbnRhdGlvbgotICAgIHByaXZhdGUgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiBlbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uOwotCi0gICAgLy9PbiBDbGllbnQgc2lkZSwgdGhlcmUgc2hvdWxkIGJlIE9uZSBTZXJ2aWNlQ2xpZW50IGluc3RhbmNlIHBlciBBeGlzU2VyaXZjZQotICAgIHByaXZhdGUgU2VydmljZUNsaWVudCBzZXJ2aWNlQ2xpZW50ID0gbnVsbDsKLQotICAgIC8vVGhpcyBpcyB0aGUgYmFzZSBXZWJTZXJ2aWNlIG9yIFdlYlNlcnZpY2VQcm92aWRlciB0aGF0IHdlIGFyZSBwcm9jZXNzaW5nCi0gICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG51bGw7Ci0KLSAgICAvLyBTZXQgb2YgcGFja2FnZXMgdGhhdCBhcmUgbmVlZGVkIHRvIG1hcnNoYWwvdW5tYXNoYWwgZGF0YSAodXNlZCB0byBzZXQgSkFYQkNvbnRleHQpCi0gICAgVHJlZVNldDxTdHJpbmc+IHBhY2thZ2VzID0gbnVsbDsKLQotICAgIC8vIFRoZSBKQVgtV1MgSGFuZGxlciBwb3J0IGluZm9ybWF0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBlbmRwb2ludAotICAgIHByaXZhdGUgUG9ydEluZm8gcG9ydEluZm87Ci0KLSAgICBwcml2YXRlIFN0cmluZyBjbGllbnRCaW5kaW5nSUQ7Ci0gICAgLy8gVGhlIGVmZmVjdGl2ZSBlbmRwb2ludCBhZGRyZXNzLiAgSXQgY291bGQgYmUgc2V0IGJ5IHRoZSBjbGllbnQgb3IgY29tZSBmcm9tIHRoZSBXU0RMIFNPQVAgYWRkcmVzcwotICAgIHByaXZhdGUgU3RyaW5nIGVuZHBvaW50QWRkcmVzczsKLSAgICAvLyBUaGUgZW5kcG9pbnQgYWRkcmVzcyBmcm9tIHRoZSBXU0RMIHNvYXA6YWRkcmVzcyBleHRlbnNpYmlsaXR5IGVsZW1lbnQgaWYgcHJlc2VudC4KLSAgICBwcml2YXRlIFN0cmluZyB3c2RsU09BUEFkZHJlc3M7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coRW5kcG9pbnREZXNjcmlwdGlvbkltcGwuY2xhc3MpOwotCi0gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIC8vIEFOTk9UQVRJT04gcmVsYXRlZCBpbmZvcm1hdGlvbgotICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAgIC8vIEFOTk9UQVRJT046IEBXZWJTZXJ2aWNlIGFuZCBAV2ViU2VydmljZVByb3ZpZGVyCi0gICAgLy8gT25seSBvbmUgb2YgdGhlc2UgdHdvIGFubm90YXRpb25zIHdpbGwgYmUgc2V0OyB0aGV5IGFyZSBtdXR1YWxseSBleGNsdXNpdmUKLSAgICBwcml2YXRlIFdlYlNlcnZpY2Ugd2ViU2VydmljZUFubm90YXRpb247Ci0gICAgcHJpdmF0ZSBXZWJTZXJ2aWNlUHJvdmlkZXIgd2ViU2VydmljZVByb3ZpZGVyQW5ub3RhdGlvbjsKLQotICAgIC8vQU5OT1RBVElPTjogQEhhbmRsZXJDaGFpbgotICAgIHByaXZhdGUgSGFuZGxlckNoYWluIGhhbmRsZXJDaGFpbkFubm90YXRpb247Ci0gICAgcHJpdmF0ZSBIYW5kbGVyQ2hhaW5zVHlwZSBoYW5kbGVyQ2hhaW5zVHlwZTsKLQotICAgIC8vIEluZm9ybWF0aW9uIGNvbW1vbiB0byBib3RoIFdlYlNlcnZpY2UgYW5kIFdlYlNlcnZpY2VQcm92aWRlciBhbm5vdGF0aW9ucwotICAgIHByaXZhdGUgU3RyaW5nIGFubm90YXRpb25fV3NkbExvY2F0aW9uOwotICAgIHByaXZhdGUgU3RyaW5nIGFubm90YXRpb25fU2VydmljZU5hbWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgYW5ub3RhdGlvbl9Qb3J0TmFtZTsKLSAgICBwcml2YXRlIFN0cmluZyBhbm5vdGF0aW9uX1RhcmdldE5hbWVzcGFjZTsKLQotICAgIC8vIEluZm9ybWF0aW9uIG9ubHkgc2V0IG9uIFdlYlNlcnZpY2UgYW5ub3RhdGlvbgotICAgIC8vIEFOTk9UQVRJT046IEBXZWJTZXJ2aWNlCi0gICAgcHJpdmF0ZSBTdHJpbmcgd2ViU2VydmljZV9FbmRwb2ludEludGVyZmFjZTsKLSAgICBwcml2YXRlIFN0cmluZyB3ZWJTZXJ2aWNlX05hbWU7Ci0KLSAgICAvLyBBTk5PVEFUSU9OOiBAU2VydmljZU1vZGUKLSAgICAvLyBOb3RlIHRoaXMgaXMgb25seSB2YWxpZCBvbiBhIFByb3ZpZGVyLWJhc2VkIGVuZHBvaW50Ci0gICAgcHJpdmF0ZSBTZXJ2aWNlTW9kZSBzZXJ2aWNlTW9kZUFubm90YXRpb247Ci0gICAgcHJpdmF0ZSBTZXJ2aWNlLk1vZGUgc2VydmljZU1vZGVWYWx1ZTsKLSAgICAvLyBEZWZhdWx0IFNlcnZpY2VNb2RlLnZhbHVlIHBlciBKQVhXUyBTcGVjIDcuMSAiamF2YXgueG1sLlNlcnZpY2VNb2RlIiBwZyA3OQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YXgueG1sLndzLlNlcnZpY2UuTW9kZSBTZXJ2aWNlTW9kZV9ERUZBVUxUID0KLSAgICAgICAgICAgIGphdmF4LnhtbC53cy5TZXJ2aWNlLk1vZGUuUEFZTE9BRDsKLQotICAgIC8vIEFOTk9UQVRJT046IEBCaW5kaW5nVHlwZQotICAgIHByaXZhdGUgQmluZGluZ1R5cGUgYmluZGluZ1R5cGVBbm5vdGF0aW9uOwotICAgIHByaXZhdGUgU3RyaW5nIGJpbmRpbmdUeXBlVmFsdWU7Ci0gICAgLy8gRGVmYXVsdCBCaW5kaW5nVHlwZS52YWx1ZSBwZXIgSkFYV1MgU3BlYyBTZWMgNy44ICJqYXZheC54bWwud3MuQmluZGluZ1R5cGUiIHBnIDgzIAotICAgIC8vIGFuZCBTZWMgMS40ICJTT0FQIFRyYW5zcG9ydCBhbmQgVHJhbnNmZXIgQmluZGluZ3MiIHBnIDExOQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJpbmRpbmdUeXBlX0RFRkFVTFQgPQotICAgICAgICAgICAgamF2YXgueG1sLndzLnNvYXAuU09BUEJpbmRpbmcuU09BUDExSFRUUF9CSU5ESU5HOwotICAgIAotICAgIC8vIEFOTk9UQVRJT046IEBSZXNwZWN0QmluZGluZwotICAgIHByaXZhdGUgQm9vbGVhbiByZXNwZWN0QmluZGluZyA9IGZhbHNlOwotICAgIHByaXZhdGUgTGlzdCByZXF1aXJlZEJpbmRpbmdzOwotICAgIAotICAgIHByaXZhdGUgSW50ZWdlciBwb3J0Q29tcG9zaXRlSW5kZXggPSBudWxsOwotICAgIAotICAgIHByaXZhdGUgTGlzdDxDdXN0b21Bbm5vdGF0aW9uSW5zdGFuY2U+IGN1c3RvbUFubm90YXRpb25zOwotICAgIAotICAgIHByaXZhdGUgTWFwPFN0cmluZywgQ3VzdG9tQW5ub3RhdGlvblByb2Nlc3Nvcj4gY3VzdG9tQW5ub3RhdGlvblByb2Nlc3NvcnM7Ci0KLSAgICAvLyBTdXBwb3J0cyBXZWJTZXJ2aWNlRmVhdHVyZUFubm90YXRpb25zCi0gICAgcHJpdmF0ZSBTZXJ2ZXJGcmFtZXdvcmsgZnJhbWV3b3JrID0gbmV3IFNlcnZlckZyYW1ld29yaygpOwotICAgIAotICAgIHByaXZhdGUgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzOwotICAgIAotICAgIC8vIFJlbWVtYmVycyBpZiB0aGlzIGVuZHBvaW50IGRlc2NyaXB0aW9uIGlzIE1UT01FbmFibGVkCi0gICAgcHJpdmF0ZSBCb29sZWFuIGlzTVRPTUVuYWJsZWRDYWNoZSA9IG51bGw7Ci0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBzZXJ2aWNlLXJlcXVlc3RlciBzaWRlIEVuZHBvaW50RGVzY3JpcHRpb24gYmFzZWQgb24gdGhlIFdTREwgcG9ydC4gIAotICAgICAqIE5vdGUgdGhhdCBwZXIgdGhlIEpBWC1XUyBTcGVjIChGaW5hbAotICAgICAqIFJlbGVhc2UsIDQvMTkvMjAwNiBTZWN0aW9uIDQuMi4zIFByb3hpZXMsIHBhZ2UgNTUpdGhlICJuYW1lc3BhY2UgY29tcG9uZW50IG9mIHRoZSBwb3J0IGlzIHRoZQotICAgICAqIHRhcmdldCBuYW1lc3BhY2Ugb2YgdGhlIFdTREwgZGVmaW5pdGlvbiBkb2N1bWVudCIuIE5vdGUgdGhpcyBpcyBjdXJyZW50bHkgb25seSB1c2VkIG9uIHRoZQotICAgICAqIGNsaWVudC1zaWRlICh0aGlzIG1heSBjaGFuZ2UpLgotICAgICAqCi0gICAgICogQHBhcmFtIHRoZUNsYXNzIFRoZSBTRUkgb3IgSW1wbCBjbGFzcy4gIFRoaXMgd2lsbCBiZSBOVUxMIGZvciBEaXNwYXRjaCBjbGllbnRzIHNpbmNlIHRoZXkKLSAgICAgKiAgICAgICAgICAgICAgICAgZG9uJ3QgdXNlIGFuIFNFSQotICAgICAqLwotICAgIEVuZHBvaW50RGVzY3JpcHRpb25JbXBsKENsYXNzIHRoZUNsYXNzLCBRTmFtZSBwb3J0TmFtZSwgU2VydmljZURlc2NyaXB0aW9uSW1wbCBwYXJlbnQpIHsKLSAgICAgICAgdGhpcyh0aGVDbGFzcywgcG9ydE5hbWUsIHBhcmVudCwgbnVsbCwgbnVsbCk7Ci0gICAgfQotICAgIEVuZHBvaW50RGVzY3JpcHRpb25JbXBsKENsYXNzIHRoZUNsYXNzLCBRTmFtZSBwb3J0TmFtZSwgU2VydmljZURlc2NyaXB0aW9uSW1wbCBwYXJlbnQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBkYmMsIE9iamVjdCBjb21wb3NpdGVLZXkgKSB7Ci0gICAgICAgIHRoaXModGhlQ2xhc3MsIHBvcnROYW1lLCBmYWxzZSwgcGFyZW50LCBkYmMsIGNvbXBvc2l0ZUtleSk7Ci0gICAgfQotICAgIEVuZHBvaW50RGVzY3JpcHRpb25JbXBsKENsYXNzIHRoZUNsYXNzLCBRTmFtZSBwb3J0TmFtZSwgYm9vbGVhbiBkeW5hbWljUG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb25JbXBsIHBhcmVudCkgewotICAgICAgICB0aGlzKHRoZUNsYXNzLCBwb3J0TmFtZSwgZHluYW1pY1BvcnQsIHBhcmVudCwgbnVsbCwgbnVsbCk7Ci0gICAgfQotICAgIEVuZHBvaW50RGVzY3JpcHRpb25JbXBsKENsYXNzIHRoZUNsYXNzLCBRTmFtZSBwb3J0TmFtZSwgYm9vbGVhbiBkeW5hbWljUG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb25JbXBsIHBhcmVudCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIHNwYXJzZUNvbXBvc2l0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qgc3BhcnNlQ29tcG9zaXRlS2V5KSB7Ci0KLSAgICAgICAgdGhpcy5wYXJlbnRTZXJ2aWNlRGVzY3JpcHRpb24gPSBwYXJlbnQ7Ci0gICAgICAgIGNvbXBvc2l0ZSA9IG5ldyBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUoKTsKLSAgICAgICAgY29tcG9zaXRlLnNldFNwYXJzZUNvbXBvc2l0ZShzcGFyc2VDb21wb3NpdGVLZXksIHNwYXJzZUNvbXBvc2l0ZSk7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRDb3JyZXNwb25kaW5nQ2xhc3ModGhlQ2xhc3MpOwotICAgICAgICBDbGFzc0xvYWRlciBsb2FkZXIgPSAoQ2xhc3NMb2FkZXIpIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAotICAgICAgICAgICAgICAgIG5ldyBQcml2aWxlZ2VkQWN0aW9uKCkgewotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgKTsKLSAgICAgICAgY29tcG9zaXRlLnNldENsYXNzTG9hZGVyKGxvYWRlcik7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRJc1NlcnZpY2VQcm92aWRlcihmYWxzZSk7Ci0KLSAgICAgICAgd2ViU2VydmljZUFubm90YXRpb24gPSBjb21wb3NpdGUuZ2V0V2ViU2VydmljZUFubm90KCk7Ci0gICAgICAgIAotICAgICAgICB0aGlzLmlzRHluYW1pY1BvcnQgPSBkeW5hbWljUG9ydDsKLSAgICAgICAgaWYgKERlc2NyaXB0aW9uVXRpbHMuaXNFbXB0eShwb3J0TmFtZSkpIHsKLSAgICAgICAgICAgIC8vIElmIHRoZSBwb3J0IG5hbWUgaXMgbnVsbCwgdGhlbiBwZXIgSkFYLVdTIDIuMCBzcGVjIHAuIDU1LCB0aGUgcnVudGltZSBpcyByZXNwb25zaWJsZSBmb3Igc2VsZWN0aW5nIHRoZSBwb3J0LgotICAgICAgICAgICAgdGhpcy5wb3J0UU5hbWUgPSBzZWxlY3RQb3J0VG9Vc2UoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRoaXMucG9ydFFOYW1lID0gcG9ydE5hbWU7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gQXQgdGhpcyBwb2ludCwgdGhlcmUgbXVzdCBiZSBhIHBvcnQgUU5hbWUgc2V0LCBlaXRoZXIgYXMgcGFzc2VkIGluLCBvciBkZXRlcm1pbmVkIGZyb20gdGhlIFdTREwgYW5kL29yIGFubm90YXRpb25zLgotICAgICAgICAvLyBJZiBub3QsIHRoYXQgaXMgYW4gZXJyb3IuCi0gICAgICAgIGlmICh0aGlzLnBvcnRRTmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbXNnID0gTWVzc2FnZXMuZ2V0TWVzc2FnZSgiZW5kcG9pbnREZXNjcmlwdGlvbkVycjEiLHRoZUNsYXNzLmdldE5hbWUoKSxwYXJlbnQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihtc2cpOwotICAgICAgICB9Ci0KLSAgICAgICAgc2V0dXBBeGlzU2VydmljZSgpOwotICAgICAgICBhZGRUb0F4aXNTZXJ2aWNlKCk7Ci0gICAgICAgIHNldHVwUmVsZWFzZVJlc291cmNlcyhnZXRTZXJ2aWNlRGVzY3JpcHRpb24oKS5nZXRBeGlzQ29uZmlnQ29udGV4dCgpKTsKLQotICAgICAgICBidWlsZERlc2NyaXB0aW9uSGllcmFjaHkoKTsKLSAgICAgICAgYWRkQW5vbnltb3VzQXhpc09wZXJhdGlvbnMoKTsKLQotICAgICAgICAvLyBUaGlzIHdpbGwgc2V0IHRoZSBzZXJ2aWNlQ2xpZW50IGZpZWxkIGFmdGVyIGFkZGluZyB0aGUgQXhpc1NlcnZpY2UgdG8gdGhlIEF4aXNDb25maWcKLSAgICAgICAgZ2V0U2VydmljZUNsaWVudCgpOwotICAgICAgICAvLyBHaXZlIHRoZSBjb25maWd1cmF0aW9uIGJ1aWxkZXIgYSBjaGFuY2UgdG8gZmluYWxpemUgY29uZmlndXJhdGlvbiBmb3IgdGhpcyBzZXJ2aWNlCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBnZXRTZXJ2aWNlRGVzY3JpcHRpb25JbXBsKCkuZ2V0Q2xpZW50Q29uZmlndXJhdGlvbkZhY3RvcnkoKQotICAgICAgICAgICAgICAgICAgICAuY29tcGxldGVBeGlzMkNvbmZpZ3VyYXRpb24oYXhpc1NlcnZpY2UpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgU3RyaW5nIG1zZyA9IE1lc3NhZ2VzLmdldE1lc3NhZ2UoImVuZHBvaW50RGVzY3JpcHRpb25FcnIyIixlLmdldENsYXNzKCkuZ2V0TmFtZSgpLHBhcmVudC5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKG1zZywgZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICByZWxlYXNlQXhpc1NlcnZpY2VSZXNvdXJjZXMoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIHNldHVwUmVsZWFzZVJlc291cmNlcyhDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWd1cmF0aW9uQ29udGV4dCkgewotICAgICAgICBpZiAoY29uZmlndXJhdGlvbkNvbnRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpOwotICAgICAgICAgICAgaWYgKGF4aXNDb25maWd1cmF0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBQYXJhbWV0ZXIgcGFyYW0gPSAKLSAgICAgICAgICAgICAgICAgICAgYXhpc0NvbmZpZ3VyYXRpb24uZ2V0UGFyYW1ldGVyKENvbnN0YW50cy5Db25maWd1cmF0aW9uLlJFRFVDRV9XU0RMX01FTU9SWV9DQUNIRSk7Ci0gICAgICAgICAgICAgICAgaWYgKHBhcmFtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVsZWFzZUF4aXNTZXJ2aWNlUmVzb3VyY2VzID0gKChTdHJpbmcpIHBhcmFtLmdldFZhbHVlKCkpLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkVuZHBvaW50RGVzY3JpcHRpb24gY29uZmlndXJlZCB0byByZWxlYXNlIEF4aXNTZXJ2aWNlIHJlc291cmNlcyB2aWEgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uUkVEVUNFX1dTRExfTUVNT1JZX0NBQ0hFKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKGNvbXBvc2l0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBCb29sZWFuIHJlZHVjZUNhY2hlID0gKEJvb2xlYW4pIGNvbXBvc2l0ZS5nZXRQcm9wZXJ0aWVzKCkuZ2V0KENvbnN0YW50cy5Db25maWd1cmF0aW9uLlJFRFVDRV9XU0RMX01FTU9SWV9DQUNIRSk7Ci0gICAgICAgICAgICBpZihyZWR1Y2VDYWNoZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJSZXRyaWV2ZWQgdGhlIGZvbGxvd2luZyByZWR1Y2UgV1NETCBjYWNoZSB2YWx1ZTogIiArIHJlZHVjZUNhY2hlICsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGZyb20gdGhlIGNvbXBvc2l0ZTogIiArIGNvbXBvc2l0ZS5nZXRDbGFzc05hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJlbGVhc2VBeGlzU2VydmljZVJlc291cmNlcyA9IHJlZHVjZUNhY2hlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgIH0KLSAgICBFbmRwb2ludERlc2NyaXB0aW9uSW1wbChTZXJ2aWNlRGVzY3JpcHRpb25JbXBsIHBhcmVudCwgU3RyaW5nIHNlcnZpY2VJbXBsTmFtZSkgewotICAgICAgICB0aGlzKHBhcmVudCwgc2VydmljZUltcGxOYW1lLCBudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBzZXJ2aWNlLXByb3ZpZGVyIHNpZGUgRW5kcG9pbnREZXNjcmlwdGlvbiBiYXNlZCBvbiB0aGUgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlLiAKLSAgICAgKiBOb3RlIHRoYXQgcGVyIHRoZQotICAgICAqIEpBWC1XUyBTcGVjIChGaW5hbCBSZWxlYXNlLCA0LzE5LzIwMDYgU2VjdGlvbiA0LjIuMyBQcm94aWVzLCBwYWdlIDU1KXRoZSAibmFtZXNwYWNlIGNvbXBvbmVudAotICAgICAqIG9mIHRoZSBwb3J0IGlzIHRoZSB0YXJnZXQgbmFtZXNwYWNlIG9mIHRoZSBXU0RMIGRlZmluaXRpb24gZG9jdW1lbnQiLgotICAgICAqCi0gICAgICogQHBhcmFtIHRoZUNsYXNzIFRoZSBTRUkgb3IgSW1wbCBjbGFzcy4gIFRoaXMgd2lsbCBiZSBOVUxMIGZvciBEaXNwYXRjaCBjbGllbnRzIHNpbmNlIHRoZXkKLSAgICAgKiAgICAgICAgICAgICAgICAgZG9uJ3QgdXNlIGFuIFNFSQotICAgICAqLwotICAgIEVuZHBvaW50RGVzY3JpcHRpb25JbXBsKFNlcnZpY2VEZXNjcmlwdGlvbkltcGwgcGFyZW50LCBTdHJpbmcgc2VydmljZUltcGxOYW1lLCBNYXA8U3RyaW5nLCBPYmplY3Q+Ci0gICAgICAgIHByb3BlcnRpZXMsIEludGVnZXIgcG9ydENvbXBvc2l0ZUluZGV4KSB7Ci0gICAgICAgIAotICAgICAgICAvLyBpbml0aWFsaXplIEN1c3RvbUFubm90YXRpb25JbnRhbmNlIGxpc3QgYW5kIEN1c3RvbUFubm90YXRpb25Qcm9jZXNzb3IgbWFwCi0gICAgICAgIGN1c3RvbUFubm90YXRpb25zID0gbmV3IEFycmF5TGlzdDxDdXN0b21Bbm5vdGF0aW9uSW5zdGFuY2U+KCk7Ci0gICAgICAgIGN1c3RvbUFubm90YXRpb25Qcm9jZXNzb3JzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBDdXN0b21Bbm5vdGF0aW9uUHJvY2Vzc29yPigpOwotICAgICAgICB0aGlzLnBvcnRDb21wb3NpdGVJbmRleCA9IHBvcnRDb21wb3NpdGVJbmRleDsKLSAgICAgICAgCi0gICAgICAgIC8vIHNldCBwcm9wZXJ0aWVzIG1hcAotICAgICAgICB0aGlzLnByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzOwotICAgICAgICAKLSAgICAgICAgdGhpcy5wYXJlbnRTZXJ2aWNlRGVzY3JpcHRpb24gPSBwYXJlbnQ7Ci0gICAgICAgIHRoaXMuc2VydmljZUltcGxOYW1lID0gc2VydmljZUltcGxOYW1lOwotCi0gICAgICAgIC8vIGlmIHRoZSBTZXJ2aWNlRGVzY3JpcHRpb24ncyBzZXJ2aWNlIFFOYW1lIGlzIHNwZWNpZmllZCwgbGV0J3MgdXNlIHRoYXQgdG8gZ2V0IHRoZQotICAgICAgICAvLyBjb3JyZWN0IERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZQotICAgICAgICBpZihwYXJlbnQuZ2V0U2VydmljZVFOYW1lKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgY29tcG9zaXRlID0gZ2V0U2VydmljZURlc2NyaXB0aW9uSW1wbCgpLmdldERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZShwYXJlbnQuZ2V0U2VydmljZVFOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnRDb21wb3NpdGVJbmRleCk7IAotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBvdGhlcndpc2Ugd2Ugd2lsbCBnZXQgdGhlIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBieSB0aGUgY3VycmVudCBpbmRleAotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGNvbXBvc2l0ZSA9IGdldFNlcnZpY2VEZXNjcmlwdGlvbkltcGwoKS5nZXREZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUobnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydENvbXBvc2l0ZUluZGV4KTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKGNvbXBvc2l0ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoImVuZHBvaW50RGVzY3JpcHRpb25FcnIzIikpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZihjb21wb3NpdGUuZ2V0SGFuZGxlckNoYWluQW5ub3QoKSAhPSBudWxsICYmIGNvbXBvc2l0ZS5nZXRIYW5kbGVyQ2hhaW5zVHlwZSgpICE9IG51bGwpIHsKLSAgICAgICAgCXRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oCi0gICAgICAgICAgICBNZXNzYWdlcy5nZXRNZXNzYWdlKCJoYW5kbGVyU291cmNlRmFpbCIsIGNvbXBvc2l0ZS5nZXRDbGFzc05hbWUoKSkpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBoYW5kbGVyQ2hhaW5zVHlwZSA9IGNvbXBvc2l0ZS5nZXRIYW5kbGVyQ2hhaW5zVHlwZSgpOwotCi0gICAgICAgIC8vU2V0IHRoZSBiYXNlIGxldmVsIG9mIGFubm90YXRpb24gdGhhdCB3ZSBhcmUgcHJvY2Vzc2luZy4uLmN1cnJlbnRseQotICAgICAgICAvLyBhICdXZWJTZXJ2aWNlJyBvciBhICdXZWJTZXJ2aWNlUHJvdmlkZXInCi0gICAgICAgIGlmIChjb21wb3NpdGUuZ2V0V2ViU2VydmljZUFubm90KCkgIT0gbnVsbCkKLSAgICAgICAgICAgIHdlYlNlcnZpY2VBbm5vdGF0aW9uID0gY29tcG9zaXRlLmdldFdlYlNlcnZpY2VBbm5vdCgpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICB3ZWJTZXJ2aWNlUHJvdmlkZXJBbm5vdGF0aW9uID0gY29tcG9zaXRlLmdldFdlYlNlcnZpY2VQcm92aWRlckFubm90KCk7Ci0KLSAgICAgICAgCi0gICAgICAgIC8vIG5vdyBnZXQgdGhlIGN1c3RvbSBhbm5vdGF0aW9uIGFuZCBwcm9jZXNzIGluZm9ybWF0aW9uIGZyb20gdGhlIERCQwotICAgICAgICBjdXN0b21Bbm5vdGF0aW9ucy5hZGRBbGwoY29tcG9zaXRlLmdldEN1c3RvbUFubm90YXRpb25JbnN0YW5jZXMoKSk7Ci0gICAgICAgIGN1c3RvbUFubm90YXRpb25Qcm9jZXNzb3JzLnB1dEFsbChjb21wb3NpdGUuZ2V0Q3VzdG9tQW5ub3RhdGlvblByb2Nlc3NvcnMoKSk7Ci0gICAgICAgIAotICAgICAgICAvLyBOb3RlIHRoYXQgb24gdGhlIGNsaWVudCBzaWRlLCB0aGUgc2VydmljZSBRTiBzaG91bGQgYmUgc2V0OyBvbiB0aGUgc2VydmVyIHNpZGUgaXQgd2lsbCBub3QgYmUuCi0gICAgICAgIGlmIChEZXNjcmlwdGlvblV0aWxzLmlzRW1wdHkoZ2V0U2VydmljZURlc2NyaXB0aW9uKCkuZ2V0U2VydmljZVFOYW1lKCkpKSB7Ci0gICAgICAgICAgICBnZXRTZXJ2aWNlRGVzY3JpcHRpb25JbXBsKCkuc2V0U2VydmljZVFOYW1lKGdldFNlcnZpY2VRTmFtZSgpKTsKLSAgICAgICAgfQotICAgICAgICAvL0NhbGwgdGhlIGdldHRlciB0byBpbnN1cmUgdGhlIHF1YWxpZmllZCBwb3J0IG5hbWUgaXMgc2V0LiAKLSAgICAgICAgZ2V0UG9ydFFOYW1lKCk7Ci0KLSAgICAgICAgc2V0dXBBeGlzU2VydmljZUZyb21EQkwoKTsKLSAgICAgICAgYWRkVG9BeGlzU2VydmljZSgpOyAgICAvL0FkZCBhIHJlZmVyZW5jZSB0byB0aGlzIEVuZHBvaW50RGVzY3JpcHRpb24gdG8gdGhlIEF4aXNTZXJ2aWNlCi0KLSAgICAgICAgYnVpbGREZXNjcmlwdGlvbkhpZXJhY2h5KCk7Ci0KLSAgICAgICAgV3NkbENvbXBvc2l0ZSB3c2RsQ29tcG9zaXRlID0gbnVsbDsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBiaW5kaW5nVHlwZSA9IGdldEJpbmRpbmdUeXBlKCk7Ci0KLSAgICAgICAgYm9vbGVhbiBpc1NPQVAxMSA9Ci0gICAgICAgICAgICAgICAgKGJpbmRpbmdUeXBlLmVxdWFscyhqYXZheC54bWwud3Muc29hcC5TT0FQQmluZGluZy5TT0FQMTFIVFRQX0JJTkRJTkcpIHx8IAotICAgICAgICAgICAgICAgICAgICAgICAgYmluZGluZ1R5cGUuZXF1YWxzKGphdmF4LnhtbC53cy5zb2FwLlNPQVBCaW5kaW5nLlNPQVAxMUhUVFBfTVRPTV9CSU5ESU5HKSkKLSAgICAgICAgICAgICAgICAgICAgICAgID8gdHJ1ZSA6IGZhbHNlOwotCi0KLSAgICAgICAgLy8gRGV0ZXJtaW5lIGlmIHdlIG5lZWQgdG8gZ2VuZXJhdGUgV1NETAotICAgICAgICAvLyBGaXJzdCwgbWFrZSBzdXJlIHRoYXQgdGhpcyBpcyBvbmx5IGEgU09BUCAxLjEgYmFzZWQgYmluZGluZywgcGVyIEpBWFdTIHNwZWMuIHdlIGNhbm5vdCAKLSAgICAgICAgLy8gZ2VuZXJhdGUgV1NETCBpZiB0aGUgYmluZGluZyB0eXBlIGlzIG5vdCBTT0FQIDEuMSBiYXNlZC4KLSAgICAgICAgLy8gVGhlbiwgYXNzdW1pbmcgdGhlIGNvbXBvc2l0ZSBkb2VzIG5vdCBjb250YWluIGEgCi0gICAgICAgIC8vIFdzZGwgRGVmaW5pdGlvbiwgZ28gYWhlYWQgYW5kIGdlbmVyYXRlIGl0Ci0gICAgICAgIGlmIChpc1NPQVAxMSl7Ci0gICAgICAgICAgICBpZiAoCi0gICAgICAgICAgICAgICAgICAgIChpc0VuZHBvaW50QmFzZWQoKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uVXRpbHMuaXNFbXB0eShnZXRBbm5vV2ViU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKCFpc0VuZHBvaW50QmFzZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgKSB7Ci0gICAgICAgICAgICAgICAgLy9UaGlzIGlzIGVpdGhlciBhbiBpbXBsaWNpdCBTRUksIG9yIGEgV2ViU2VydmljZSBQcm92aWRlcgotICAgIAotICAgICAgICAgICAgICAgIHdzZGxDb21wb3NpdGUgPSBnZW5lcmF0ZVdTREwoY29tcG9zaXRlKTsKLSAgICAKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNFbmRwb2ludEJhc2VkKCkpIHsKLSAgICAgICAgICAgICAgICAvL1RoaXMgaW1wbCBjbGFzcyBzcGVjaWZpZXMgYW4gU0VJLi4udGhpcyBpcyBhIHNwZWNpYWwgY2FzZS4gVGhlcmUgaXMgYSBidWcKLSAgICAgICAgICAgICAgICAvL2luIHRoZSB0b29saW5nIHRoYXQgYWxsb3dzIGZvciB0aGUgd3NkbGxvY2F0aW9uIHRvIGJlIHNwZWNpZmVkIG9uIGVpdGhlciB0aGUKLSAgICAgICAgICAgICAgICAvL2ltcGwuIGNsYXNzLCBvciB0aGUgU0VJLCBvciBib3RoLiBTbywgd2UgbmVlZCB0byBsb29rIGZvciB0aGUgd3NkbCBhcyBmb2xsb3dzOgotICAgICAgICAgICAgICAgIC8vCQkJMS4gSWYgdGhlIFdzZGwgZXhpc3RzIG9uIHRoZSBTRUksIHRoZW4gY2hlY2sgZm9yIGl0IG9uIHRoZSBpbXBsLgotICAgICAgICAgICAgICAgIC8vCQkJMi4gSWYgaXQgaXMgbm90IGZvdW5kIGluIGVpdGhlciBsb2NhdGlvbiwgaW4gdGhhdCBvcmRlciwgdGhlbiBnZW5lcmF0ZQotICAgIAotICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBzZWljID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGdldFNlcnZpY2VEZXNjcmlwdGlvbkltcGwoKS5nZXREQkNNYXAoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0KGNvbXBvc2l0ZS5nZXRXZWJTZXJ2aWNlQW5ub3QoKS5lbmRwb2ludEludGVyZmFjZSgpKTsKLSAgICAKLSAgICAgICAgICAgICAgICAvL09ubHkgZ2VuZXJhdGUgV1NETCBpZiBhIGRlZmluaXRpb24gZG9lc24ndCBhbHJlYWR5IGV4aXN0Ci0gICAgICAgICAgICAgICAgaWYgKHNlaWMuZ2V0V3NkbERlZmluaXRpb24oKSA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICB3c2RsQ29tcG9zaXRlID0gZ2VuZXJhdGVXU0RMKGNvbXBvc2l0ZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBlbHNlIGlmIChjb21wb3NpdGUuZ2V0V3NkbERlZmluaXRpb24oKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvL1RoaXMgaXMgYSBTT0FQMTIgYmluZGluZyB0aGF0IGRvZXMgbm90IGNvbnRhaW4gYSBXU0RMIGRlZmluaXRpb24sIGxvZyBhIFdBUk5JTkcKLSAgICAgICAgICAgIGxvZy53YXJuKCJUaGlzIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IGNvbnRhaW4gYSBXU0RMIGRlZmluaXRpb24gYW5kIGlzIG5vdCBhIFNPQVAgMS4xIGJhc2VkIGJpbmRpbmcuICIKLSAgICAgICAgICAgICAgICAgICAgKyAiUGVyIEpBWFdTIHNwZWMuIC0gYSBXU0RMIGRlZmluaXRpb24gY2Fubm90IGJlIGdlbmVyYXRlZCBmb3IgdGhpcyBpbXBsZW1lbnRhdGlvbi4gTmFtZTogIgotICAgICAgICAgICAgICAgICAgICArIGNvbXBvc2l0ZS5nZXRDbGFzc05hbWUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaXNTT0FQMTEpewotICAgIAotICAgICAgICAgICAgLy9TYXZlIHRoZSBXU0RMIExvY2F0aW9uIGFuZCB0aGUgV3NkbERlZmluaXRpb24sIHZhbHVlIGRlcGVuZHMgb24gd2hldGhlciB3c2RsIHdhcyBnZW5lcmF0ZWQKLSAgICAgICAgICAgIFBhcmFtZXRlciB3c2RsTG9jYXRpb25QYXJhbWV0ZXIgPSBuZXcgUGFyYW1ldGVyKCk7Ci0gICAgICAgICAgICB3c2RsTG9jYXRpb25QYXJhbWV0ZXIuc2V0TmFtZShNRFFDb25zdGFudHMuV1NETF9MT0NBVElPTik7Ci0gICAgCi0gICAgICAgICAgICBQYXJhbWV0ZXIgd3NkbERlZlBhcmFtZXRlciA9IG5ldyBQYXJhbWV0ZXIoKTsKLSAgICAgICAgICAgIHdzZGxEZWZQYXJhbWV0ZXIuc2V0TmFtZShNRFFDb25zdGFudHMuV1NETF9ERUZJTklUSU9OKTsKLSAgICAKLSAgICAgICAgICAgIFBhcmFtZXRlciB3c2RsQ29tcG9zaXRlUGFyYW1ldGVyID0gbmV3IFBhcmFtZXRlcigpOwotICAgICAgICAgICAgd3NkbENvbXBvc2l0ZVBhcmFtZXRlci5zZXROYW1lKE1EUUNvbnN0YW50cy5XU0RMX0NPTVBPU0lURSk7Ci0gICAgCi0gICAgICAgICAgICBpZiAod3NkbENvbXBvc2l0ZSAhPSBudWxsKSB7Ci0gICAgCi0gICAgICAgICAgICAgICAgLy9XZSBoYXZlIGEgd3NkbCBjb21wb3NpdGUsIHNvIHNldCB0aGVzZSB2YWx1ZXMgZm9yIHRoZSBnZW5lcmF0ZWQgd3NkbAotICAgICAgICAgICAgICAgIHdzZGxDb21wb3NpdGVQYXJhbWV0ZXIuc2V0VmFsdWUod3NkbENvbXBvc2l0ZSk7Ci0gICAgICAgICAgICAgICAgd3NkbExvY2F0aW9uUGFyYW1ldGVyLnNldFZhbHVlKHdzZGxDb21wb3NpdGUuZ2V0V3NkbEZpbGVOYW1lKCkpOwotCi0gICAgICAgICAgICAgICAgRGVmaW5pdGlvbiBkZWYgPQotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U2VydmljZURlc2NyaXB0aW9uSW1wbCgpLmdldEdlbmVyYXRlZFdzZGxXcmFwcGVyKCkuZ2V0RGVmaW5pdGlvbigpOwotICAgICAgICAgICAgICAgIFVSTCB3c2RsVXJsID0gZ2V0U2VydmljZURlc2NyaXB0aW9uSW1wbCgpLmdldEdlbmVyYXRlZFdzZGxXcmFwcGVyKCkuZ2V0V1NETExvY2F0aW9uKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGRlZiBpbnN0YW5jZW9mIFdTRExEZWZpbml0aW9uV3JhcHBlcikgewotICAgICAgICAgICAgICAgICAgICB3c2RsRGVmUGFyYW1ldGVyLnNldFZhbHVlKGRlZik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIFdTRExEZWZpbml0aW9uV3JhcHBlcgotICAgICAgICAgICAgICAgICAgICBXU0RMRGVmaW5pdGlvbldyYXBwZXIgd3JhcCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNjID0gY29tcG9zaXRlLmdldENvbmZpZ3VyYXRpb25Db250ZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjYyAhPSBudWxsICYmIGNjLmdldEF4aXNDb25maWd1cmF0aW9uKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgd3JhcCA9IG5ldyBXU0RMRGVmaW5pdGlvbldyYXBwZXIoZGVmLCB3c2RsVXJsLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjLmdldEF4aXNDb25maWd1cmF0aW9uKCkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gUHJvYmFibHkgc2hvdWxkbid0IGdldCBoZXJlLiAgQnV0IGlmIHdlIGRvLCB1c2UKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGEgbWVtb3J5IHNlbnNpdHZlIHdzZGwgd3JhcHBlcgotICAgICAgICAgICAgICAgICAgICAgICAgd3JhcCA9IG5ldyBXU0RMRGVmaW5pdGlvbldyYXBwZXIoZGVmLCB3c2RsVXJsLCB0cnVlLCAyKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB3c2RsRGVmUGFyYW1ldGVyLnNldFZhbHVlKHdyYXApOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBlbHNlIGlmIChnZXRTZXJ2aWNlRGVzY3JpcHRpb25JbXBsKCkuZ2V0V1NETFdyYXBwZXIoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy9ObyB3c2RsIGNvbXBvc2l0ZSBiZWNhdXNlIHdzZGwgYWxyZWFkeSBleGlzdHMKLQotICAgICAgICAgICAgICAgIHdzZGxMb2NhdGlvblBhcmFtZXRlci5zZXRWYWx1ZShnZXRBbm5vV2ViU2VydmljZVdTRExMb2NhdGlvbigpKTsKLQotICAgICAgICAgICAgICAgIERlZmluaXRpb24gZGVmID0gZ2V0U2VydmljZURlc2NyaXB0aW9uSW1wbCgpLmdldFdTRExXcmFwcGVyKCkuZ2V0RGVmaW5pdGlvbigpOwotICAgICAgICAgICAgICAgIFVSTCB3c2RsVXJsID0gZ2V0U2VydmljZURlc2NyaXB0aW9uSW1wbCgpLmdldFdTRExXcmFwcGVyKCkuZ2V0V1NETExvY2F0aW9uKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGRlZiBpbnN0YW5jZW9mIFdTRExEZWZpbml0aW9uV3JhcHBlcikgewotICAgICAgICAgICAgICAgICAgICB3c2RsRGVmUGFyYW1ldGVyLnNldFZhbHVlKGRlZik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIFdTRExEZWZpbml0aW9uV3JhcHBlcgotICAgICAgICAgICAgICAgICAgICBXU0RMRGVmaW5pdGlvbldyYXBwZXIgd3JhcCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNjID0gY29tcG9zaXRlLmdldENvbmZpZ3VyYXRpb25Db250ZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjYyAhPSBudWxsICYmIGNjLmdldEF4aXNDb25maWd1cmF0aW9uKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgd3JhcCA9IG5ldyBXU0RMRGVmaW5pdGlvbldyYXBwZXIoZGVmLCB3c2RsVXJsLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjLmdldEF4aXNDb25maWd1cmF0aW9uKCkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gUHJvYmFibHkgc2hvdWxkbid0IGdldCBoZXJlLiAgQnV0IGlmIHdlIGRvLCB1c2UKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGEgbWVtb3J5IHNlbnNpdHZlIHdzZGwgd3JhcHBlcgotICAgICAgICAgICAgICAgICAgICAgICAgd3JhcCA9IG5ldyBXU0RMRGVmaW5pdGlvbldyYXBwZXIoZGVmLCB3c2RsVXJsLCB0cnVlLCAyKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB3c2RsRGVmUGFyYW1ldGVyLnNldFZhbHVlKHdyYXApOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvL1RoZXJlIGlzIG5vIHdzZGwgY29tcG9zaXRlIGFuZCB0aGVyZSBpcyBOT1QgYSB3c2RsIGRlZmluaXRpb24KLSAgICAgICAgICAgICAgICB3c2RsTG9jYXRpb25QYXJhbWV0ZXIuc2V0VmFsdWUobnVsbCk7Ci0gICAgICAgICAgICAgICAgd3NkbERlZlBhcmFtZXRlci5zZXRWYWx1ZShudWxsKTsKLSAgICAKLSAgICAgICAgICAgIH0KLSAgICAKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaWYgKHdzZGxDb21wb3NpdGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBheGlzU2VydmljZS5hZGRQYXJhbWV0ZXIod3NkbENvbXBvc2l0ZVBhcmFtZXRlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlLmFkZFBhcmFtZXRlcih3c2RsRGVmUGFyYW1ldGVyKTsKLSAgICAgICAgICAgICAgICBheGlzU2VydmljZS5hZGRQYXJhbWV0ZXIod3NkbExvY2F0aW9uUGFyYW1ldGVyKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJlbmRwb2ludERlc2NyaXB0aW9uRXJyNCIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIC8vIE5lZWQgdG8gYWNjb3VudCBmb3IgU09BUCAxLjIgV1NETCB3aGVuIHN1cHBsaWVkIHdpdGggYXBwbGljYXRpb24KLSAgICAgICAgICAgIFBhcmFtZXRlciB3c2RsRGVmUGFyYW1ldGVyID0gbmV3IFBhcmFtZXRlcigpOwotICAgICAgICAgICAgd3NkbERlZlBhcmFtZXRlci5zZXROYW1lKE1EUUNvbnN0YW50cy5XU0RMX0RFRklOSVRJT04pOwotICAgICAgICAgICAgUGFyYW1ldGVyIHdzZGxMb2NhdGlvblBhcmFtZXRlciA9IG5ldyBQYXJhbWV0ZXIoKTsKLSAgICAgICAgICAgIHdzZGxMb2NhdGlvblBhcmFtZXRlci5zZXROYW1lKE1EUUNvbnN0YW50cy5XU0RMX0xPQ0FUSU9OKTsKLSAgICAgICAgICAgIGlmIChnZXRTZXJ2aWNlRGVzY3JpcHRpb25JbXBsKCkuZ2V0V1NETFdyYXBwZXIoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgd3NkbExvY2F0aW9uUGFyYW1ldGVyLnNldFZhbHVlKGdldEFubm9XZWJTZXJ2aWNlV1NETExvY2F0aW9uKCkpOwotCi0gICAgICAgICAgICAgICAgRGVmaW5pdGlvbiBkZWYgPSBnZXRTZXJ2aWNlRGVzY3JpcHRpb25JbXBsKCkuZ2V0V1NETFdyYXBwZXIoKS5nZXREZWZpbml0aW9uKCk7Ci0gICAgICAgICAgICAgICAgVVJMIHdzZGxVcmwgPSBnZXRTZXJ2aWNlRGVzY3JpcHRpb25JbXBsKCkuZ2V0V1NETFdyYXBwZXIoKS5nZXRXU0RMTG9jYXRpb24oKTsKLSAgICAgICAgICAgICAgICBpZiAoZGVmIGluc3RhbmNlb2YgV1NETERlZmluaXRpb25XcmFwcGVyKSB7Ci0gICAgICAgICAgICAgICAgICAgIHdzZGxEZWZQYXJhbWV0ZXIuc2V0VmFsdWUoZGVmKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBDcmVhdGUgV1NETERlZmluaXRpb25XcmFwcGVyCi0gICAgICAgICAgICAgICAgICAgIFdTRExEZWZpbml0aW9uV3JhcHBlciB3cmFwID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHQgY2MgPSBjb21wb3NpdGUuZ2V0Q29uZmlndXJhdGlvbkNvbnRleHQoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNjICE9IG51bGwgJiYgY2MuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3cmFwID0gbmV3IFdTRExEZWZpbml0aW9uV3JhcHBlcihkZWYsIHdzZGxVcmwsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2MuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBQcm9iYWJseSBzaG91bGRuJ3QgZ2V0IGhlcmUuICBCdXQgaWYgd2UgZG8sIHVzZQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gYSBtZW1vcnkgc2Vuc2l0dmUgd3NkbCB3cmFwcGVyCi0gICAgICAgICAgICAgICAgICAgICAgICB3cmFwID0gbmV3IFdTRExEZWZpbml0aW9uV3JhcHBlcihkZWYsIHdzZGxVcmwsIHRydWUsIDIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHdzZGxEZWZQYXJhbWV0ZXIuc2V0VmFsdWUod3JhcCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gTm8gV1NETCBzdXBwbGllZCBhbmQgd2UgZG8gbm90IGdlbmVyYXRlIGZvciBub24tU09BUCAxLjEvSFRUUAotICAgICAgICAgICAgLy8gZW5kcG9pbnRzCi0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICB3c2RsTG9jYXRpb25QYXJhbWV0ZXIuc2V0VmFsdWUobnVsbCk7Ci0gICAgICAgICAgICAgICAgd3NkbERlZlBhcmFtZXRlci5zZXRWYWx1ZShudWxsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYXhpc1NlcnZpY2UuYWRkUGFyYW1ldGVyKHdzZGxEZWZQYXJhbWV0ZXIpOwotICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlLmFkZFBhcmFtZXRlcih3c2RsTG9jYXRpb25QYXJhbWV0ZXIpOwotCi0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkKLSAgICAgICAgICAgICAgICAgICAgLm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoImVuZHBvaW50RGVzY3JpcHRpb25FcnI0IiksZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIEJlZm9yZSB3ZSBsZWF2ZSB3ZSBuZWVkIHRvIGRyaXZlIHRoZSBDdXN0b21Bbm5vdGF0aW9uUHJvY2Vzc29ycyBpZiAKLSAgICAgICAgLy8gdGhlcmUgd2VyZSBhbnkgQ3VzdG9tQW5ub3RhdGlvbkluc3RhbmNlIG9iamVjdHMgcmVnaXN0ZXJlZAotICAgICAgICBJdGVyYXRvcjxDdXN0b21Bbm5vdGF0aW9uSW5zdGFuY2U+IGFubm90YXRpb25JdGVyID0gY3VzdG9tQW5ub3RhdGlvbnMuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUoYW5ub3RhdGlvbkl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBDdXN0b21Bbm5vdGF0aW9uSW5zdGFuY2UgYW5ub3RhdGlvbiA9IGFubm90YXRpb25JdGVyLm5leHQoKTsKLSAgICAgICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJDaGVja2luZyBmb3IgQ3VzdG9tQW5ub3RhdGlvblByb2Nlc3NvciBmb3IgQ3VzdG9tQW5ub3RhdGlvbkluc3RhbmNlICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2xhc3M6ICIgKyBhbm5vdGF0aW9uLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEN1c3RvbUFubm90YXRpb25Qcm9jZXNzb3IgcHJvY2Vzc29yID0gY3VzdG9tQW5ub3RhdGlvblByb2Nlc3NvcnMuZ2V0KGFubm90YXRpb24uZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgaWYocHJvY2Vzc29yICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkZvdW5kIEN1c3RvbUFubm90YXRpb25Qcm9jZXNzb3I6ICIgKyBwcm9jZXNzb3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZm9yIEN1c3RvbUFubm90YXRpb25JbnN0YW5jZTogIiArIGFubm90YXRpb24uZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwcm9jZXNzb3IucHJvY2Vzc1R5cGVMZXZlbEFubm90YXRpb24odGhpcywgYW5ub3RhdGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIENvbmZpZ3VyZSBhbnkgYXZhaWxhYmxlIFdlYlNlcnZpY2VGZWF0dXJlcyBvbiB0aGUgZW5kcG9pbnQuCi0gICAgICAgIGNvbmZpZ3VyZVdlYlNlcnZpY2VGZWF0dXJlcygpOwotICAgICAgICAKLSAgICAgICAgLy8gUkVWSUVXOiB0aGVyZSBhcmUgc29tZSB0aHJvd3MgYWJvdmUgdGhhdCB3b24ndCBjYXVzZSB0aGUgcmVsZWFzZQotICAgICAgICBzZXR1cFJlbGVhc2VSZXNvdXJjZXMoY29tcG9zaXRlLmdldENvbmZpZ3VyYXRpb25Db250ZXh0KCkpOwotICAgICAgICByZWxlYXNlQXhpc1NlcnZpY2VSZXNvdXJjZXMoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkVG9BeGlzU2VydmljZSgpIHsKLSAgICAgICAgLy8gQWRkIGEgcmVmZXJlbmNlIHRvIHRoaXMgRW5kcG9pbnREZXNjcmlwdGlvbiBvYmplY3QgdG8gdGhlIEF4aXNTZXJ2aWNlCi0gICAgICAgIGlmIChheGlzU2VydmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBQYXJhbWV0ZXIgcGFyYW1ldGVyID0gbmV3IFBhcmFtZXRlcigpOwotICAgICAgICAgICAgcGFyYW1ldGVyLnNldE5hbWUoRW5kcG9pbnREZXNjcmlwdGlvbi5BWElTX1NFUlZJQ0VfUEFSQU1FVEVSKTsKLSAgICAgICAgICAgIHBhcmFtZXRlci5zZXRWYWx1ZSh0aGlzKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYXhpc1NlcnZpY2UuYWRkUGFyYW1ldGVyKHBhcmFtZXRlcik7Ci0gICAgICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgZSkgewotICAgICAgICAgICAgCXRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiZW5kcG9pbnREZXNjcmlwdGlvbkVycjUiKSxlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBidWlsZEVuZHBvaW50RGVzY3JpcHRpb25Gcm9tQW5ub3RhdGlvbnMoKSB7Ci0gICAgICAgIC8vIFRPRE86IFRoZSBjb21tZW50cyBiZWxvdyBhcmUgbm90IHF1aXRlIGNvcnJlY3Q7IHRoaXMgbWV0aG9kIGlzIHVzZWQgb24gQk9USCB0aGUgCi0gICAgICAgIC8vICAgICAgIGNsaWVudCBhbmQgc2VydmVyLiAgT24gdGhlIGNsaWVudCB0aGUgY2xhc3MgaXMgYWx3YXlzIGFuIFNFSS4gIE9uIHRoZSBzZXJ2ZXIgaXQgCi0gICAgICAgIC8vCQkgaXMgYWx3YXlzIGEgc2VydmljZSBpbXBsIHdoaWNoIG1heSBiZSBhIHByb3ZpZGVyIG9yIGVuZHBvaW50IGJhc2VkOwotICAgICAgICAvLwkJIGVuZHBvaW50IGJhc2VkIG1heSByZWZlcmVuY2UgYW4gU0VJIGNsYXNzCi0KLSAgICAgICAgLy8gVGhlIFNlcnZpY2UgSW1wbGVtZW50YXRpb24gY2xhc3MgY291bGQgYmUgZWl0aGVyIFByb3ZpZGVyLWJhc2VkIG9yIEVuZHBvaW50LWJhc2VkLiAgVGhlIAotICAgICAgICAvLyBhbm5vdGF0aW9ucyB0aGF0IGFyZSBwcmVzZW50IGFyZSBzaW1pbGFyIGJ1dCBkaWZmZXJlbnQuICBDb25mb3JtYW5jZSByZXF1aXJlbWVudHMgCi0gICAgICAgIC8vIHBlciBKQVgtV1MKLSAgICAgICAgLy8gLSBBIFByb3ZpZGVyIGJhc2VkIGltcGxlbWVudGF0aW9uIE1VU1QgY2FycnkgdGhlIEBXZWJTZXJ2aWNlUHJvdmlkZXIgYW5ub3RhdGlvbgotICAgICAgICAvLyAgIHBlciBzZWN0aW9uIDUuMSBqYXZheC54bWwud3MuUHJvdmlkZXIgb24gcGFnZSA2MwotICAgICAgICAvLyAtIEFuIEVuZHBvaW50IGJhc2VkIGltcGxlbWVudGF0aW9uIE1VU1QgY2FycnkgdGhlIEBXZWJTZXJ2aWNlIGFubm90YXRpb24gcGVyIEpTUi0xODEgCi0gICAgICAgIC8vICAgKHJlZmVyZW5jZSBUQkQpIGFuZCBKQVgtV1MgKHJlZmVyZW5jZSBUQkQpCi0gICAgICAgIC8vIC0gQW4gRW5kcG9pbnQgYmFzZWQgaW1wbGVtZW50YXRpb24gQFdlYlNlcnZpY2UgYW5ub3RhdGlvbiBNQVkgcmVmZXJlbmNlIGFuIGVuZHBvaW50Ci0gICAgICAgIC8vICAgaW50ZXJmYWNlIAotICAgICAgICAvLyAtIFRoZSBAV2ViU2VydmljZSBhbmQgQFdlYlNlcnZpY2VQcm92aWRlciBhbm5vdGF0aW9ucyBjYW4gbm90IGFwcGVhciBpbiB0aGUgc2FtZSBjbGFzcyBwZXIgCi0gICAgICAgIC8vICAgSkFYLVdTIHNlY3Rpb24gNy43IG9uIHBhZ2UgODIuCi0KLSAgICAgICAgLy8gSWYgcG9ydE5hbWUgd2FzIHNwZWNpZmllZCwgc2V0IGl0LiAgT3RoZXJ3aXNlLCB3ZSB3aWxsIGdldCBpdCBmcm9tIHRoZSBhcHByb3ByaWF0ZQotICAgICAgICAvLyBhbm5vdGF0aW9uIHdoZW4gdGhlIGdldHRlciBpcyBjYWxsZWQuCi0KLSAgICAgICAgLy8gSWYgdGhpcyBpcyBhbiBFbmRwb2ludC1iYXNlZCBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIChpLmUuIG5vdCBhIAotICAgICAgICAvLyBQcm92aWRlci1iYXNlZCBvbmUpLCB0aGVuIGNyZWF0ZSB0aGUgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiB0byBjb250YWluCi0gICAgICAgIC8vIHRoZSBvcGVyYXRpb25zIG9uIHRoZSBlbmRwb2ludC4gIFByb3ZpZGVyLWJhc2VkIGVuZHBvaW50cyBkb24ndCBoYXZlIG9wZXJhdGlvbnMKLSAgICAgICAgLy8gYXNzb2NpYXRlZCB3aXRoIHRoZW0sIHNvIHRoZXkgZG9uJ3QgaGF2ZSBhbiBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uLgotICAgICAgICBpZiAod2ViU2VydmljZUFubm90YXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gSWYgdGhpcyBpbXBsIGNsYXNzIHJlZmVyZW5jZXMgYW4gU0VJLCB0aGVuIHVzZSB0aGF0IFNFSSB0byBjcmVhdGUgdGhlIEVuZHBvaW50SW50ZXJmYWNlRGVzYy4KLSAgICAgICAgICAgIFN0cmluZyBzZWlDbGFzc05hbWUgPSBnZXRBbm5vV2ViU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCk7Ci0KLSAgICAgICAgICAgIGlmICghY29tcG9zaXRlLmlzU2VydmljZVByb3ZpZGVyKCkpIHsKLSAgICAgICAgICAgICAgICBDbGFzcyBzZWlDbGFzcyA9IG51bGw7Ci0gICAgICAgICAgICAgICAgaWYgKERlc2NyaXB0aW9uVXRpbHMuaXNFbXB0eShzZWlDbGFzc05hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIGNsaWVudCBjb2RlIHBhdGg7IHRoZSBAV2ViU2VydmNlIHdpbGwgbm90IGhhdmUgYW4gZW5kcG9pbnRJbnRlcmZhY2UgbWVtYmVyCi0gICAgICAgICAgICAgICAgICAgIC8vIEZvciBub3csIGp1c3QgYnVpbGQgdGhlIEVuZHBvaW50SW50ZXJmYWNlRGVzYyBiYXNlZCBvbiB0aGUgY2xhc3MgaXRzZWxmLgotICAgICAgICAgICAgICAgICAgICBzZWlDbGFzcyA9IGNvbXBvc2l0ZS5nZXRDb3JyZXNwb25kaW5nQ2xhc3MoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiA9IG5ldyBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uSW1wbChzZWlDbGFzcywgdGhpcyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChEZXNjcmlwdGlvblV0aWxzLmlzRW1wdHkoZ2V0QW5ub1dlYlNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpKSkgewotCi0gICAgICAgICAgICAgICAgICAgIGVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uSW1wbChjb21wb3NpdGUsIHRydWUsIHRoaXMpOwotCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy9PdGhlcndpc2UsIGJ1aWxkIHRoZSBFSUQgYmFzZWQgb24gdGhlIFNFSSBjb21wb3NpdGUKLSAgICAgICAgICAgICAgICAgICAgZW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiA9IG5ldyBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uSW1wbCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRTZXJ2aWNlRGVzY3JpcHRpb25JbXBsKCkuZ2V0REJDTWFwKCkuZ2V0KHNlaUNsYXNzTmFtZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAvLyBhZnRlciB0aGlzIGlzIGNvbnN0cnVjdGVkLCB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGUgQFdlYlNlcnZpY2UubmFtZSAKLSAgICAgICAgICAgICAgICAgICAgLy8gYXR0cmlidXRlIG9uIHRoZSBheGlzU2VydmljZSBpbnN0YW5jZQotICAgICAgICAgICAgICAgICAgICBpZihheGlzU2VydmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVXZWJTZXJ2aWNlTmFtZVBhcmFtZXRlcigoKEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb25JbXBsKSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbikuZ2V0QW5ub1dlYlNlcnZpY2VOYW1lKCksIGF4aXNTZXJ2aWNlKTsgCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIldlYlNlcnZpY2VQcm92aWRlciB3aXRob3V0IFdTREwgZW5jb3VudGVyZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFN0cmluZyBiaW5kaW5nVHlwZSA9IGdldEJpbmRpbmdUeXBlKCk7Ci0gICAgICAgICAgICBpZiAoamF2YXgueG1sLndzLmh0dHAuSFRUUEJpbmRpbmcuSFRUUF9CSU5ESU5HLmVxdWFscyhiaW5kaW5nVHlwZSl8fAotICAgICAgICAgICAgICAgICAgICBTT0FQQmluZGluZy5TT0FQMTFIVFRQX0JJTkRJTkcuZXF1YWxzKGJpbmRpbmdUeXBlKXx8Ci0gICAgICAgICAgICAgICAgICAgIFNPQVBCaW5kaW5nLlNPQVAxMkhUVFBfQklORElORy5lcXVhbHMoYmluZGluZ1R5cGUpfHwKLSAgICAgICAgICAgICAgICAgICAgTURRQ29uc3RhbnRzLlNPQVBfSFRUUF9CSU5ESU5HLmVxdWFscyhiaW5kaW5nVHlwZSkpIHsKLSAgICAgICAgICAgICAgICBlbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uID0gbmV3IEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb25JbXBsKGNvbXBvc2l0ZSwgdGhpcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgUU5hbWUgZ2V0UG9ydFFOYW1lKCkgewotICAgICAgICBpZiAocG9ydFFOYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIFRoZSBuYW1lIHdhcyBub3Qgc2V0IGJ5IHRoZSBjb25zdHJ1Y3RvcnMsIHNvIGdldCBpdCBmcm9tIHRoZQotICAgICAgICAgICAgLy8gYXBwcm9wcmlhdGUgYW5ub3RhdGlvbi4KLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gZ2V0QW5ub1dlYlNlcnZpY2VQb3J0TmFtZSgpOwotICAgICAgICAgICAgU3RyaW5nIHRucyA9IGdldEFubm9XZWJTZXJ2aWNlVGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgICAgICBwb3J0UU5hbWUgPSBuZXcgUU5hbWUodG5zLCBuYW1lKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcG9ydFFOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBRTmFtZSBnZXRTZXJ2aWNlUU5hbWUoKSB7Ci0gICAgICAgIGlmIChzZXJ2aWNlUU5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gSWYgdGhlIHNlcnZpY2UgbmFtZSBoYXMgYmVlbiBzZXQgb24gdGhlIFNlcnZpY2UsIHVzZSB0aGF0LiAgT3RoZXJ3aXNlCi0gICAgICAgICAgICAvLyBnZXQgdGhlIG5hbWUgb2ZmIHRoZSBhbm5vdGF0aW9ucwotICAgICAgICAgICAgUU5hbWUgc2VydmljZURlc2NRTmFtZSA9IGdldFNlcnZpY2VEZXNjcmlwdGlvbigpLmdldFNlcnZpY2VRTmFtZSgpOwotICAgICAgICAgICAgaWYgKCFEZXNjcmlwdGlvblV0aWxzLmlzRW1wdHkoc2VydmljZURlc2NRTmFtZSkpIHsKLSAgICAgICAgICAgICAgICBzZXJ2aWNlUU5hbWUgPSBzZXJ2aWNlRGVzY1FOYW1lOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbG9jYWxQYXJ0ID0gZ2V0QW5ub1dlYlNlcnZpY2VTZXJ2aWNlTmFtZSgpOwotICAgICAgICAgICAgICAgIFN0cmluZyB0bnMgPSBnZXRBbm5vV2ViU2VydmljZVRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgICAgICAgICAgIHNlcnZpY2VRTmFtZSA9IG5ldyBRTmFtZSh0bnMsIGxvY2FsUGFydCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNlcnZpY2VRTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2VydmljZURlc2NyaXB0aW9uIGdldFNlcnZpY2VEZXNjcmlwdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIHBhcmVudFNlcnZpY2VEZXNjcmlwdGlvbjsKLSAgICB9Ci0KLSAgICBTZXJ2aWNlRGVzY3JpcHRpb25JbXBsIGdldFNlcnZpY2VEZXNjcmlwdGlvbkltcGwoKSB7Ci0gICAgICAgIHJldHVybiAoU2VydmljZURlc2NyaXB0aW9uSW1wbClwYXJlbnRTZXJ2aWNlRGVzY3JpcHRpb247Ci0gICAgfQotCi0gICAgcHVibGljIEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24gZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIGVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb247Ci0gICAgfQotCi0gICAgcHVibGljIEF4aXNTZXJ2aWNlIGdldEF4aXNTZXJ2aWNlKCkgewotICAgICAgICByZXR1cm4gYXhpc1NlcnZpY2U7Ci0gICAgfQotCi0gICAgYm9vbGVhbiBpc0R5bmFtaWNQb3J0KCkgewotICAgICAgICByZXR1cm4gaXNEeW5hbWljUG9ydDsKLSAgICB9Ci0KLSAgICB2b2lkIHVwZGF0ZVdpdGhTRUkoQ2xhc3Mgc2VpLCBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgc3BhcnNlQ29tcG9zaXRlLCBPYmplY3Qgc3BhcnNlQ29tcG9zaXRlS2V5KSB7Ci0gICAgICAgIC8vIFVwZGF0aW5nIHdpdGggYW4gU0VJIGlzIG9ubHkgdmFsaWQgZm9yIGRlY2xhcmVkIHBvcnRzOyBpdCBpcyBub3QgdmFsaWQgZm9yIGR5bmFtaWMgcG9ydHMuCi0gICAgICAgIGlmIChpc0R5bmFtaWNQb3J0KCkpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgidXBkYXRlV2l0aFNFSUVycjEiLHBvcnRRTmFtZS50b1N0cmluZygpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNlaSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoInVwZGF0ZVdpdGhTRUlFcnIyIixwb3J0UU5hbWUudG9TdHJpbmcoKSkpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBjb21wb3NpdGUuc2V0U3BhcnNlQ29tcG9zaXRlKHNwYXJzZUNvbXBvc2l0ZUtleSwgc3BhcnNlQ29tcG9zaXRlKTsKLQotICAgICAgICBpZiAoZW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBUaGUgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiB3YXMgY3JlYXRlZCBwcmV2aW91c2x5IGJhc2VkIG9uIHRoZSBwb3J0IGRlY2xhcmF0aW9uIChpLmUuIFdTREwpCi0gICAgICAgICAgICAvLyBzbyB1cGRhdGUgdGhhdCB3aXRoIGluZm9ybWF0aW9uIGZyb20gdGhlIFNFSSBhbm5vdGF0aW9ucwotICAgICAgICAgICAgKChFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uSW1wbCllbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uKS51cGRhdGVXaXRoU0VJKHNlaSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBBbiBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uIGRvZXMgbm90IGV4aXN0IHlldC4gIFRoaXMgY3VycmVudGx5IGhhcHBlbnMgaW4gdGhlIGNhc2Ugd2hlcmUgdGhlcmUgaXMgCi0gICAgICAgICAgICAvLyBOTyBXU0RMIHByb3ZpZGVkIGFuZCBhIERpc3BhdGNoIGNsaWVudCBpcyBjcmVhdGVkIGZvciBwcmlvciB0byBhIGdldFBvcnQgYmVpbmcgZG9uZSBmb3IgdGhhdCBwb3J0LgotICAgICAgICAgICAgLy8gVGhlcmUgd2FzIG5vIFdTREwgdG8gY3JlYXRlIHRoZSBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uIGZyb20gYW5kIHRoZXJlIHdhcyBubyBhbm5vdGF0ZWQgU0VJIHRvCi0gICAgICAgICAgICAvLyB1c2UgYXQgdGhhdCB0aW1lLiAgTm93IHdlIGhhdmUgYW4gYW5ub3RhdGVkIFNFSSwgc28gY3JlYXRlIHRoZSBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uIG5vdy4KLSAgICAgICAgICAgIGVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24gPSBuZXcgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbkltcGwoc2VpLCB0aGlzKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNldHVwQXhpc1NlcnZpY2UoKSB7Ci0gICAgICAgIC8vIEJ1aWxkIHVwIHRoZSBBeGlzU2VydmljZS4gIE5vdGUgdGhhdCBpZiB0aGlzIGlzIGEgZHluYW1pYyBwb3J0LCB0aGVuIHdlIGRvbid0IHVzZSB0aGUKLSAgICAgICAgLy8gV1NETCB0byBidWlsZCB1cCB0aGUgQXhpc1NlcnZpY2Ugc2luY2UgdGhlIHBvcnQgYWRkZWQgdG8gdGhlIFNlcnZpY2UgYnkgdGhlIGNsaWVudCBpcyBub3QKLSAgICAgICAgLy8gb25lIHRoYXQgd2lsbCBiZSBwcmVzZW50IGluIHRoZSBXU0RMLiAgQSBudWxsIGNsYXNzIHBhc3NlZCBpbiBhcyB0aGUgU0VJIGluZGljYXRlcyB0aGlzIAotICAgICAgICAvLyBpcyBhIGRpc3BhdGNoIGNsaWVudC4KLSAgICAgICAgaWYgKCFpc0R5bmFtaWNQb3J0ICYmIGdldFNlcnZpY2VEZXNjcmlwdGlvbkltcGwoKS5nZXRXU0RMV3JhcHBlcigpICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlzQXhpc1NlcnZpY2VCdWlsdEZyb21XU0RMID0gYnVpbGRBeGlzU2VydmljZUZyb21XU0RMKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBidWlsZEF4aXNTZXJ2aWNlRnJvbUFubm90YXRpb25zKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYXhpc1NlcnZpY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJzZXR1cEF4aXNTZXJ2aWNlRXJyMSIsY3JlYXRlQXhpc1NlcnZpY2VOYW1lKCkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFNhdmUgdGhlIFNlcnZpY2UgUU5hbWUgYXMgYSBwYXJhbWV0ZXIuCi0gICAgICAgIFBhcmFtZXRlciBzZXJ2aWNlTmFtZVBhcmFtZXRlciA9IG5ldyBQYXJhbWV0ZXIoKTsKLSAgICAgICAgc2VydmljZU5hbWVQYXJhbWV0ZXIuc2V0TmFtZShXU0RMMTFUb0FsbEF4aXNTZXJ2aWNlc0J1aWxkZXIuV1NETF9TRVJWSUNFX1FOQU1FKTsKLSAgICAgICAgc2VydmljZU5hbWVQYXJhbWV0ZXIuc2V0VmFsdWUoZ2V0U2VydmljZURlc2NyaXB0aW9uKCkuZ2V0U2VydmljZVFOYW1lKCkpOwotCi0gICAgICAgIC8vIFNhdmUgdGhlIFBvcnQgbmFtZS4gIE5vdGU6IEF4aXMgZG9lcyBub3QgZXhwZWN0IGEgUU5hbWUgc2luY2UgdGhlIG5hbWVzcGFjZSBmb3IgdGhlIHBvcnQgaXMgdGhlIG5zIGZyb20gdGhlIFdTREwgZGVmaW5pdGlvbiAKLSAgICAgICAgUGFyYW1ldGVyIHBvcnRQYXJhbWV0ZXIgPSBuZXcgUGFyYW1ldGVyKCk7Ci0gICAgICAgIHBvcnRQYXJhbWV0ZXIuc2V0TmFtZShXU0RMMTFUb0FsbEF4aXNTZXJ2aWNlc0J1aWxkZXIuV1NETF9QT1JUKTsKLSAgICAgICAgcG9ydFBhcmFtZXRlci5zZXRWYWx1ZShwb3J0UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAKLSAgICAgICAgLy8gU3RvcmUgdGhlIHNlcnZpY2UgY2xhc3MgZnVsbHkgcXVhbGlmaWVkIG5hbWUKLSAgICAgICAgUGFyYW1ldGVyIHNlcnZpY2VDbGFzc05hbWVQYXJhbSA9IG5ldyBQYXJhbWV0ZXIoKTsKLSAgICAgICAgc2VydmljZUNsYXNzTmFtZVBhcmFtLnNldE5hbWUoTURRQ29uc3RhbnRzLkNMSUVOVF9TRVJWSUNFX0NMQVNTKTsKLSAgICAgICAgU3RyaW5nIHNlcnZpY2VDbGFzc05hbWUgPSB0aGlzLmdldFNlcnZpY2VEZXNjcmlwdGlvbkltcGwoKS5nZXRTZXJ2aWNlQ2xhc3NOYW1lKCk7Ci0gICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIlNldHRpbmcgc2VydmljZSBjbGFzcyBuYW1lIHBhcmFtZXRlciB0bzogIiArIHNlcnZpY2VDbGFzc05hbWUgKyAKLSAgICAgICAgICAgICAgICAgICAgICAiIG9uIEF4aXNTZXJ2aWNlOiAiICsgYXhpc1NlcnZpY2UgKyAiQCIgKyBheGlzU2VydmljZS5oYXNoQ29kZSgpKTsKLSAgICAgICAgfQotICAgICAgICBzZXJ2aWNlQ2xhc3NOYW1lUGFyYW0uc2V0VmFsdWUoc2VydmljZUNsYXNzTmFtZSk7Ci0gICAgICAgIAotICAgICAgICAvLyBTdG9yZSB0aGUgc2VpIGNsYXNzIGZ1bGx5IHF1YWxpZmllZCBuYW1lLCBpZiBpdCBpcyBhdmFpbGFibGUKLSAgICAgICAgUGFyYW1ldGVyIHNlaUNsYXNzTmFtZVBhcmFtID0gbmV3IFBhcmFtZXRlcigpOwotICAgICAgICBzZWlDbGFzc05hbWVQYXJhbS5zZXROYW1lKE1EUUNvbnN0YW50cy5DTElFTlRfU0VJX0NMQVNTKTsKLSAgICAgICAgU3RyaW5nIHNlaUNsYXNzTmFtZSA9IGNvbXBvc2l0ZS5nZXRDbGFzc05hbWUoKTsKLSAgICAgICAgaWYobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiU2V0dGluZyBzZWkgY2xhc3MgbmFtZSBwYXJhbWV0ZXIgdG86ICIgKyBzZWlDbGFzc05hbWUgKyAKLSAgICAgICAgICAgICAgICAgICAgICAiIG9uIEF4aXNTZXJ2aWNlOiAiICsgYXhpc1NlcnZpY2UgKyAiQCIgKyBheGlzU2VydmljZS5oYXNoQ29kZSgpKTsKLSAgICAgICAgfQotICAgICAgICBzZWlDbGFzc05hbWVQYXJhbS5zZXRWYWx1ZShzZWlDbGFzc05hbWUpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBheGlzU2VydmljZS5hZGRQYXJhbWV0ZXIoc2VydmljZU5hbWVQYXJhbWV0ZXIpOwotICAgICAgICAgICAgYXhpc1NlcnZpY2UuYWRkUGFyYW1ldGVyKHBvcnRQYXJhbWV0ZXIpOwotICAgICAgICAgICAgYXhpc1NlcnZpY2UuYWRkUGFyYW1ldGVyKHNlcnZpY2VDbGFzc05hbWVQYXJhbSk7Ci0gICAgICAgICAgICBheGlzU2VydmljZS5hZGRQYXJhbWV0ZXIoc2VpQ2xhc3NOYW1lUGFyYW0pOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChBeGlzRmF1bHQgZSkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJzZXR1cEF4aXNTZXJ2aWNlRXJyMiIpLGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBUaGlzIHNldHVwcyBhbmQgYnVpbGRzIHRoZSBBeGlzU2VydmljZSB1c2luZyBvbmx5IHRoZSBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGVMaXN0Ci0gICAgICogCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHNldHVwQXhpc1NlcnZpY2VGcm9tREJMKCkgewotICAgICAgICAvLyBCdWlsZCB1cCB0aGUgQXhpc1NlcnZpY2UuICBOb3RlIHRoYXQgaWYgdGhpcyBpcyBhIGRpc3BhdGNoIGNsaWVudCwgdGhlbiB3ZSBkb24ndCB1c2UgdGhlCi0gICAgICAgIC8vIFdTREwgdG8gYnVpbGQgdXAgdGhlIEF4aXNTZXJ2aWNlIHNpbmNlIHRoZSBwb3J0IGFkZGVkIHRvIHRoZSBTZXJ2aWNlIGJ5IHRoZSBjbGllbnQgaXMgbm90Ci0gICAgICAgIC8vIG9uZSB0aGF0IHdpbGwgYmUgcHJlc2VudCBpbiB0aGUgV1NETC4gIEEgbnVsbCBjbGFzcyBwYXNzZWQgaW4gYXMgdGhlIFNFSSBpbmRpY2F0ZXMgdGhpcyAKLSAgICAgICAgLy8gaXMgYSBkaXNwYXRjaCBjbGllbnQuCi0KLSAgICAgICAgLy8gSWYgV1NETCBpcyBwcmVzZW50LCBpdCBtYXkgYmUgZnVsbCBvciBvbmx5IHBhcnRpYWwuICBJZiB3ZSBjYW4gY3JlYXRlIHRoZSBBeGlzU2VydmljZSBmcm9tIAotICAgICAgICAvLyB0aGUgV1NETCwgdGhhdCBXU0RMIGlzIGZ1bGx5IHNwZWNpZmllZC4gIE90aGVyd2lzZSwgaXQgaXMgInBhcnRpYWwgV1NETCIuICBJbiB0aGF0IGNhc2UKLSAgICAgICAgLy8gd2UgdXNlIGFubm90YWlvbnMgdG8gYnVpbGQgdGhlIEF4aXNTZXJ2aWNlCi0gICAgICAgIGlzQXhpc1NlcnZpY2VCdWlsdEZyb21XU0RMID0gZmFsc2U7Ci0gICAgICAgIGlmIChnZXRTZXJ2aWNlRGVzY3JpcHRpb25JbXBsKCkuZ2V0V1NETFdyYXBwZXIoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpc0F4aXNTZXJ2aWNlQnVpbHRGcm9tV1NETCA9IGJ1aWxkQXhpc1NlcnZpY2VGcm9tV1NETCgpOwotCi0gICAgICAgIH0KLQotICAgICAgICBpZiAoIWlzQXhpc1NlcnZpY2VCdWlsdEZyb21XU0RMKSB7Ci0gICAgICAgICAgICAvL2dlbmVyYXRlV1NETChjb21wb3NpdGUpOwotICAgICAgICAgICAgYnVpbGRBeGlzU2VydmljZUZyb21Bbm5vdGF0aW9ucygpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGF4aXNTZXJ2aWNlID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgic2V0dXBBeGlzU2VydmljZUVycjEiLGNyZWF0ZUF4aXNTZXJ2aWNlTmFtZSgpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vU2F2ZSB0aGUgUG9ydCBUeXBlIG5hbWUKLSAgICAgICAgUGFyYW1ldGVyIHBvcnRUeXBlTmFtZVBhcmFtZXRlciA9IG5ldyBQYXJhbWV0ZXIoKTsKLSAgICAgICAgcG9ydFR5cGVOYW1lUGFyYW1ldGVyLnNldE5hbWUoTURRQ29uc3RhbnRzLldTRExfUE9SVFRZUEVfTkFNRSk7Ci0gICAgICAgIHBvcnRUeXBlTmFtZVBhcmFtZXRlci5zZXRWYWx1ZShnZXROYW1lKCkpOwotCi0gICAgICAgIC8vIFNhdmUgdGhlIFNlcnZpY2UgUU5hbWUgYXMgYSBwYXJhbWV0ZXIuCi0gICAgICAgIFBhcmFtZXRlciBzZXJ2aWNlTmFtZVBhcmFtZXRlciA9IG5ldyBQYXJhbWV0ZXIoKTsKLSAgICAgICAgc2VydmljZU5hbWVQYXJhbWV0ZXIuc2V0TmFtZShNRFFDb25zdGFudHMuV1NETF9TRVJWSUNFX1FOQU1FKTsKLSAgICAgICAgc2VydmljZU5hbWVQYXJhbWV0ZXIuc2V0VmFsdWUoZ2V0U2VydmljZURlc2NyaXB0aW9uKCkuZ2V0U2VydmljZVFOYW1lKCkpOwotCi0gICAgICAgIC8vIFNhdmUgdGhlIFBvcnQgbmFtZS4gIE5vdGU6IEF4aXMgZG9lcyBub3QgZXhwZWN0IGEgUU5hbWUgc2luY2UgdGhlIG5hbWVzcGFjZQotICAgICAgICAvLyAgIGZvciB0aGUgcG9ydCBpcyB0aGUgbnMgZnJvbSB0aGUgV1NETCBkZWZpbml0aW9uIAotICAgICAgICBQYXJhbWV0ZXIgcG9ydFBhcmFtZXRlciA9IG5ldyBQYXJhbWV0ZXIoKTsKLSAgICAgICAgcG9ydFBhcmFtZXRlci5zZXROYW1lKE1EUUNvbnN0YW50cy5XU0RMX1BPUlQpOwotICAgICAgICBwb3J0UGFyYW1ldGVyLnNldFZhbHVlKGdldFBvcnRRTmFtZSgpLmdldExvY2FsUGFydCgpKTsKLQotICAgICAgICAvL1NhdmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIGZvciB0aGUgc2VydmljZUltcGwKLSAgICAgICAgUGFyYW1ldGVyIHNlcnZpY2VDbGFzc05hbWVQYXJhbWV0ZXIgPSBuZXcgUGFyYW1ldGVyKCk7Ci0gICAgICAgIHNlcnZpY2VDbGFzc05hbWVQYXJhbWV0ZXIuc2V0TmFtZShNRFFDb25zdGFudHMuU0VSVklDRV9DTEFTUyk7Ci0gICAgICAgIHNlcnZpY2VDbGFzc05hbWVQYXJhbWV0ZXIKLSAgICAgICAgICAgICAgICAuc2V0VmFsdWUoRGVzY3JpcHRpb25VdGlscy5qYXZpZnlDbGFzc05hbWUoY29tcG9zaXRlLmdldENsYXNzTmFtZSgpKSk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGF4aXNTZXJ2aWNlLmFkZFBhcmFtZXRlcihwb3J0VHlwZU5hbWVQYXJhbWV0ZXIpOwotICAgICAgICAgICAgYXhpc1NlcnZpY2UuYWRkUGFyYW1ldGVyKHNlcnZpY2VOYW1lUGFyYW1ldGVyKTsKLSAgICAgICAgICAgIGF4aXNTZXJ2aWNlLmFkZFBhcmFtZXRlcihwb3J0UGFyYW1ldGVyKTsKLSAgICAgICAgICAgIGF4aXNTZXJ2aWNlLmFkZFBhcmFtZXRlcihzZXJ2aWNlQ2xhc3NOYW1lUGFyYW1ldGVyKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoQXhpc0ZhdWx0IGUpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgic2V0dXBBeGlzU2VydmljZUVycjIiKSxlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBidWlsZEF4aXNTZXJ2aWNlRnJvbVdTREwoKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNCdWlsdEZyb21XU0RMID0gZmFsc2U7Ci0gICAgICAgIHRyeSB7Ci0KLSAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB0aGUgYXhpcyBzZXJ2aWNlIGJ1aWxkZXIgdGFrZXMgb25seSB0aGUgbG9jYWxwYXJ0IG9mIHRoZSBwb3J0IHFuYW1lLgotICAgICAgICAgICAgLy8gVE9ETzo6IFRoaXMgc2hvdWxkIGNoZWNrIHRoYXQgdGhlIG5hbWVzcGFjZSBvZiB0aGUgZGVmaW5pdGlvbiBtYXRjaGVzIHRoZSBuYW1lc3BhY2Ugb2YgdGhlIHBvcnRRTmFtZSBwZXIgSkFYUlBDIHNwZWMKLQotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBVc2UgZ2V0RGVmaW5pdGlvbigpIHNvIHRoYXQgd2UgaGF2ZSB0aGUgYWR2YW50YWdlcyBvZiB0aGUgbWVtb3J5IGZlYXR1cmVzLgotICAgICAgICAgICAgRGVmaW5pdGlvbiBkZWYgPSBnZXRTZXJ2aWNlRGVzY3JpcHRpb25JbXBsKCkuZ2V0V1NETFdyYXBwZXIoKS5nZXREZWZpbml0aW9uKCk7Ci0KLSAgICAgICAgICAgIFdTREwxMVRvQXhpc1NlcnZpY2VCdWlsZGVyIHNlcnZpY2VCdWlsZGVyID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IFdTREwxMVRvQXhpc1NlcnZpY2VCdWlsZGVyKGRlZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRTZXJ2aWNlRGVzY3JpcHRpb24oKS5nZXRTZXJ2aWNlUU5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRQb3J0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKSk7Ci0KLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQnVpbGRpbmcgQXhpc1NlcnZpY2UgZnJvbSB3c2RsOiAiICsgZ2V0U2VydmljZURlc2NyaXB0aW9uSW1wbCgpLmdldFdTRExXcmFwcGVyKCkuZ2V0V1NETExvY2F0aW9uKCkpOyAgICAKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXI7Ci0gICAgICAgICAgICBpZiAoY29tcG9zaXRlLmlzU2VydmljZVByb3ZpZGVyKCkpIHsKLSAgICAgICAgICAgICAgICBjbGFzc0xvYWRlciA9IGNvbXBvc2l0ZS5nZXRDbGFzc0xvYWRlcigpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBjbGFzc0xvYWRlciA9IGdldENvbnRleHRDbGFzc0xvYWRlcihudWxsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEpBWFdTQ2F0YWxvZ01hbmFnZXIgY2F0YWxvZ01hbmFnZXIgPSBnZXRTZXJ2aWNlRGVzY3JpcHRpb25JbXBsKCkuZ2V0Q2F0YWxvZ01hbmFnZXIoKTsKLSAgICAgICAgICAgIENhdGFsb2dVUklSZXNvbHZlciB1cmlSZXNvbHZlciA9IG5ldyBDYXRhbG9nVVJJUmVzb2x2ZXIoY2F0YWxvZ01hbmFnZXIsIGNsYXNzTG9hZGVyKTsKLSAgICAgICAgICAgIHNlcnZpY2VCdWlsZGVyLnNldEN1c3RvbVJlc29sdmVyKHVyaVJlc29sdmVyKTsKLQotICAgICAgICAgICAgaWYgKGdldFNlcnZpY2VEZXNjcmlwdGlvbkltcGwoKS5pc1NlcnZlclNpZGUoKSkKLSAgICAgICAgICAgICAgICBzZXJ2aWNlQnVpbGRlci5zZXRTZXJ2ZXJTaWRlKHRydWUpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHNlcnZpY2VCdWlsZGVyLnNldFNlcnZlclNpZGUoZmFsc2UpOwotCi0gICAgICAgICAgICAvLyBBc3NvY2lhdGUgdGhlIEF4aXNDb25maWd1cmF0aW9uIHdpdGggdGhlIFNlcnZpY2VCdWlsZGVyIGlmIGl0Ci0gICAgICAgICAgICAvLyBpcyBhdmFpbGFibGUuICBUaGlzIGlzIGRvbmUgc28gdGhhdCB0aGUgc2VydmljZUJ1aWxkZXIgY2FuCi0gICAgICAgICAgICAvLyB1c2UgdGhlIGFwcHJvcHJpYXRlIFdTREwgd3JhcHBlciBtZW1vcnkgcGFyYW1ldGVycy4KLSAgICAgICAgICAgIEF4aXNDb25maWd1cmF0aW9uIGFjID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChjb21wb3NpdGUuZ2V0Q29uZmlndXJhdGlvbkNvbnRleHQoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYWMgPSBjb21wb3NpdGUuZ2V0Q29uZmlndXJhdGlvbkNvbnRleHQoKS5nZXRBeGlzQ29uZmlndXJhdGlvbigpOwotICAgICAgICAgICAgICAgIGlmIChhYyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNlcnZpY2VCdWlsZGVyLnVzZUF4aXNDb25maWd1cmF0aW9uKGFjKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBDcmVhdGUgYW5kIHBvcHVsYXRlIHRoZSBBeGlzU2VydmljZQotICAgICAgICAgICAgYXhpc1NlcnZpY2UgPSBzZXJ2aWNlQnVpbGRlci5wb3B1bGF0ZVNlcnZpY2UoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gSWYgYW4gQXhpc0NvbmZpZ3VyYXRpb24gd2FzIG5vdCBhdmFpbGFibGUsCi0gICAgICAgICAgICAvLyBkZWZhdWx0IHRvIHVzaW5nIGEgbWVtb3J5IGVmZmljaWVudCB3cmFwcGVyCi0gICAgICAgICAgICBpZiAoYWMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFBhcmFtZXRlciB3c2RsV3JhcHBlclBhcmFtID0gCi0gICAgICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlLmdldFBhcmFtZXRlcihXU0RMQ29uc3RhbnRzLldTRExfNF9KX0RFRklOSVRJT04pOwotICAgICAgICAgICAgICAgIGlmICh3c2RsV3JhcHBlclBhcmFtICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAgICAgd3NkbFdyYXBwZXJQYXJhbS5nZXRWYWx1ZSgpIGluc3RhbmNlb2YgV1NETERlZmluaXRpb25XcmFwcGVyKSB7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBXU0RMRGVmaW5pdGlvbldyYXBwZXIgd3JhcHBlciA9IAotICAgICAgICAgICAgICAgICAgICAgICAgKFdTRExEZWZpbml0aW9uV3JhcHBlcikgIHdzZGxXcmFwcGVyUGFyYW0uZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIC8vIElmIG9ubHkgdGhlIGJhc2ljIHdyYXBwZXIgaXMgYmVpbmcgdXNlZCwgdXBncmFkZSB0byB0aGUKLSAgICAgICAgICAgICAgICAgICAgLy8gUkVMT0FEIHdyYXBwZXIKLSAgICAgICAgICAgICAgICAgICAgaWYgKHdyYXBwZXIuZ2V0TWVtb3J5TGltaXRUeXBlKCkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgRGVmaW5pdGlvbiB3c2RsRGVmID0gd3JhcHBlci5nZXRVbndyYXBwZWREZWZpbml0aW9uKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIFdTRExEZWZpbml0aW9uV3JhcHBlciB3cmFwcGVyMiA9IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBXU0RMRGVmaW5pdGlvbldyYXBwZXIod3NkbERlZiwgdHJ1ZSwgMik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHdzZGxXcmFwcGVyUGFyYW0uc2V0VmFsdWUod3JhcHBlcjIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXhpc1NlcnZpY2Uuc2V0TmFtZShjcmVhdGVBeGlzU2VydmljZU5hbWUoKSk7Ci0gICAgICAgICAgICBpc0J1aWx0RnJvbVdTREwgPSB0cnVlOwotCi0gICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBlKSB7Ci0gICAgICAgICAgICBTdHJpbmcgd3NkbExvY2F0aW9uID0gKGdldFNlcnZpY2VEZXNjcmlwdGlvbkltcGwoKS5nZXRXU0RMTG9jYXRpb24oKSAhPSBudWxsKSA/Ci0gICAgICAgICAgICAgICAgICAgIGdldFNlcnZpY2VEZXNjcmlwdGlvbkltcGwoKS5nZXRXU0RMTG9jYXRpb24oKS50b1N0cmluZygpIDogbnVsbDsKLSAgICAgICAgICAgIFN0cmluZyBpbXBsQ2xhc3NOYW1lID0gY29tcG9zaXRlLmdldENsYXNzTmFtZSgpOwotICAgICAgICAgICAgbG9nLndhcm4oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiYmxkQXhpc1NydmNGcm9tV1NETEVyciIsaW1wbENsYXNzTmFtZSx3c2RsTG9jYXRpb24pLGUpOwotCi0gICAgICAgICAgICBpc0J1aWx0RnJvbVdTREwgPSBmYWxzZTsKLSAgICAgICAgICAgIHJldHVybiBpc0J1aWx0RnJvbVdTREw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlzQnVpbHRGcm9tV1NETDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYnVpbGRBeGlzU2VydmljZUZyb21Bbm5vdGF0aW9ucygpIHsKLSAgICAgICAgU3RyaW5nIHNlcnZpY2VOYW1lID0gbnVsbDsKLSAgICAgICAgaWYgKHBvcnRRTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzZXJ2aWNlTmFtZSA9IGNyZWF0ZUF4aXNTZXJ2aWNlTmFtZSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gTWFrZSB0aGlzIHNlcnZpY2UgbmFtZSB1bmlxdWUuICBUaGUgQXhpczIgZW5naW5lIGFzc3VtZXMgdGhhdCBhIHNlcnZpY2UgaXQgY2FuIG5vdCBmaW5kIGlzIGEgY2xpZW50LXNpZGUgc2VydmljZS4KLSAgICAgICAgICAgIHNlcnZpY2VOYW1lID0gU2VydmljZUNsaWVudC5BTk9OX1NFUlZJQ0UgKyB0aGlzLmhhc2hDb2RlKCkgKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgfQotICAgICAgICBheGlzU2VydmljZSA9IG5ldyBBeGlzU2VydmljZShzZXJ2aWNlTmFtZSk7Ci0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcmVsZWFzZUF4aXNTZXJ2aWNlUmVzb3VyY2VzKCkgewotICAgICAgICAvLyByZWxlYXNlIHRoZSBzY2hlbWEgbGlzdCBpbiB0aGUgQXhpc1NlcnZpY2UKLSAgICAgICAgaWYgKHJlbGVhc2VBeGlzU2VydmljZVJlc291cmNlcyAmJiBheGlzU2VydmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBheGlzU2VydmljZS5yZWxlYXNlU2NoZW1hTGlzdCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGJ1aWxkRGVzY3JpcHRpb25IaWVyYWNoeSgpIHsKLSAgICAgICAgLy8gQnVpbGQgdXAgdGhlIERlc2NyaXB0aW9uIEhpZXJhY2h5LiAgTm90ZSB0aGF0IGlmIHRoaXMgaXMgYSBkeW5hbWljIHBvcnQsIHRoZW4gd2UgZG9uJ3QgdXNlIHRoZQotICAgICAgICAvLyBXU0RMIHRvIGJ1aWxkIHVwIHRoZSBoaWVyYWNoeSBzaW5jZSB0aGUgcG9ydCBhZGRlZCB0byB0aGUgU2VydmljZSBieSB0aGUgY2xpZW50IGlzIG5vdAotICAgICAgICAvLyBvbmUgdGhhdCB3aWxsIGJlIHByZXNlbnQgaW4gdGhlIFdTREwuCi0KLSAgICAgICAgaWYgKGNvbXBvc2l0ZS5pc1NlcnZpY2VQcm92aWRlcigpKSB7Ci0gICAgICAgICAgICBpZiAoIWlzRHluYW1pY1BvcnQgJiYgaXNXU0RMRnVsbHlTcGVjaWZpZWQoKSkKLSAgICAgICAgICAgICAgICBidWlsZEVuZHBvaW50RGVzY3JpcHRpb25Gcm9tV1NETCgpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGJ1aWxkRW5kcG9pbnREZXNjcmlwdGlvbkZyb21Bbm5vdGF0aW9ucygpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy9TdGlsbCBwcm9jZXNzaW5nIGFubm90YXRpb25zIGZyb20gdGhlIGNsYXNzCi0gICAgICAgICAgICAvLyBUaGlzIHBhdGggd2FzIG5vdCB1cGRhdGVkCi0gICAgICAgICAgICBpZiAoIWlzRHluYW1pY1BvcnQgJiYgaXNXU0RMRnVsbHlTcGVjaWZpZWQoKSkgewotICAgICAgICAgICAgICAgIGJ1aWxkRW5kcG9pbnREZXNjcmlwdGlvbkZyb21XU0RMKCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGNvbXBvc2l0ZS5nZXRDb3JyZXNwb25kaW5nQ2xhc3MoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSByZXN0IG9mIHRoZSBkZXNjcmlwdGlvbiBoaWVyYWNoeSBmcm9tIGFubm90YXRpb25zIG9uIHRoZSBjbGFzcy4KLSAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBubyBTRUkgY2xhc3MsIHRoZW4gdGhpcyBpcyBhIERpc3RwYWNoIGNhc2UsIGFuZCB3ZSBjdXJyZW50bHkKLSAgICAgICAgICAgICAgICAvLyBkb24ndCBjcmVhdGUgdGhlIHJlc3Qgb2YgdGhlIGRlc2NyaXB0aW9uIGhpZXJhY2h5IChzaW5jZSBpdCBpcyBub3QgYW4gU0VJIGFuZCB0aHVzCi0gICAgICAgICAgICAgICAgLy8gbm90IG9wZXJhdGlvbi1iYXNlZCBjbGllbnQuCi0gICAgICAgICAgICAgICAgYnVpbGRFbmRwb2ludERlc2NyaXB0aW9uRnJvbUFubm90YXRpb25zKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYnVpbGRFbmRwb2ludERlc2NyaXB0aW9uRnJvbVdTREwoKSB7Ci0gICAgICAgIERlZmluaXRpb24gd3NkbERlZmluaXRpb24gPSBnZXRTZXJ2aWNlRGVzY3JpcHRpb25JbXBsKCkuZ2V0V1NETFdyYXBwZXIoKS5nZXREZWZpbml0aW9uKCk7Ci0gICAgICAgIGphdmF4LndzZGwuU2VydmljZSB3c2RsU2VydmljZSA9Ci0gICAgICAgICAgICAgICAgd3NkbERlZmluaXRpb24uZ2V0U2VydmljZShnZXRTZXJ2aWNlRGVzY3JpcHRpb24oKS5nZXRTZXJ2aWNlUU5hbWUoKSk7Ci0gICAgICAgIGlmICh3c2RsU2VydmljZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRNZXNzYWdlKCJzZXJ2aWNlRGVzY0VycjIiLCBjcmVhdGVBeGlzU2VydmljZU5hbWUoKSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgTWFwIHdzZGxQb3J0cyA9IHdzZGxTZXJ2aWNlLmdldFBvcnRzKCk7Ci0gICAgICAgIGJvb2xlYW4gd3NkbFBvcnRGb3VuZCA9IGZhbHNlOwotICAgICAgICBpZiAod3NkbFBvcnRzICE9IG51bGwgJiYgd3NkbFBvcnRzLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIEl0ZXJhdG9yIHdzZGxQb3J0SXRlcmF0b3IgPSB3c2RsUG9ydHMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQotICAgICAgICAgICAgd2hpbGUgKHdzZGxQb3J0SXRlcmF0b3IuaGFzTmV4dCgpICYmICF3c2RsUG9ydEZvdW5kKSB7Ci0gICAgICAgICAgICAgICAgUG9ydCB3c2RsUG9ydCA9IChQb3J0KXdzZGxQb3J0SXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhlIG5hbWVzcGFjZSBpcyBub3QgaW5jbHVkZWQgb24gdGhlIFdTREwgUG9ydC4KLSAgICAgICAgICAgICAgICBpZiAod3NkbFBvcnQuZ2V0TmFtZSgpLmVxdWFscyhwb3J0UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gQnVpbGQgdGhlIEVuZHBvaW50SW50ZXJmYWNlIGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQgU0VJIGlmIHRoZXJlIGlzIG9uZQotICAgICAgICAgICAgICAgICAgICAvLyBvciBvbiB0aGUgc2VydmljZSBpbXBsIGNsYXNzIChpLmUuIGFuIGltcGxpY2l0IFNFSSkuCi0gICAgICAgICAgICAgICAgICAgIGlmIChjb21wb3NpdGUuaXNTZXJ2aWNlUHJvdmlkZXIoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNlaUNsYXNzTmFtZSA9IGdldEFubm9XZWJTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChEZXNjcmlwdGlvblV0aWxzLmlzRW1wdHkoc2VpQ2xhc3NOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vIFNFSSBzcGVjaWZpZWQsIHNvIHVzZSB0aGUgc2VydmljZSBpbXBsIGFzIGFuIGltcGxpY2l0IFNFSQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb25JbXBsKGNvbXBvc2l0ZSwgdHJ1ZSwgdGhpcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgYnVpbGQgdGhlIEVJRCBiYXNlZCBvbiB0aGUgU0VJIGNvbXBvc2l0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24gPSBuZXcgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbkltcGwoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRTZXJ2aWNlRGVzY3JpcHRpb25JbXBsKCkuZ2V0REJDTWFwKCkuZ2V0KHNlaUNsYXNzTmFtZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFmdGVyIHRoaXMgaXMgY29uc3RydWN0ZWQsIHdlIG5lZWQgdG8gdXBkYXRlIHRoZSBAV2ViU2VydmljZS5uYW1lIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF0dHJpYnV0ZSBvbiB0aGUgYXhpc1NlcnZpY2UgaW5zdGFuY2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihheGlzU2VydmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVdlYlNlcnZpY2VOYW1lUGFyYW1ldGVyKCgoRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbkltcGwpIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24pLmdldEFubm9XZWJTZXJ2aWNlTmFtZSgpLCBheGlzU2VydmljZSk7IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBFbmRwb2ludCBJbnRlcmZhY2UgRGVzY3JpcHRpb24gYmFzZWQgb24gdGhlIFdTREwuCi0gICAgICAgICAgICAgICAgICAgICAgICBlbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uID0gbmV3IEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb25JbXBsKHRoaXMpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgdGhlIEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24gY3JlYXRlZCB3aXRoIFdTREwgd2l0aCBpbmZvcm1hdGlvbiBmcm9tIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5ub3RhdGlvbnMgaW4gdGhlIFNFSQotICAgICAgICAgICAgICAgICAgICAgICAgKChFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uSW1wbCllbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudXBkYXRlV2l0aFNFSShjb21wb3NpdGUuZ2V0Q29ycmVzcG9uZGluZ0NsYXNzKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHdzZGxQb3J0Rm91bmQgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICghd3NkbFBvcnRGb3VuZCkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJzZXJ2aWNlRGVzY0VycjMiLHBvcnRRTmFtZS5nZXRMb2NhbFBhcnQoKSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyB0aGUgYW5vbnltb3VzIGF4aXMgb3BlcmF0aW9ucyB0byB0aGUgQXhpc1NlcnZpY2UuICBOb3RlIHRoYXQgdGhpcyBpcyBvbmx5IG5lZWRlZCBvbiB0aGUKLSAgICAgKiBjbGllbnQgc2lkZSwgYW5kIHRoZXkgYXJlIGN1cnJlbnRseSB1c2VkIGluIHR3byBjYXNlcyAoMSkgRm9yIERpc3BhdGNoIGNsaWVudHMgKHdoaWNoIGRvbid0Ci0gICAgICogdXNlIFNFSXMgYW5kIHRodXMgZG9uJ3QgdXNlIG9wZXJhdGlvbnMpICgyKSBURU1QT1JBUkxJWSBmb3IgU2VydmljZXMgY3JlYXRlZCB3aXRob3V0IFdTREwKLSAgICAgKiAoYW5kIHRodXMgd2hpY2ggaGF2ZSBubyBBeGlzT3BlcmF0aW9ucyBjcmVhdGVkKSBTZWUgdGhlIEF4aXNJbnZvY2F0aW9uQ29udHJvbGxlciBpbnZva2UKLSAgICAgKiBtZXRob2RzIGZvciBtb3JlIGRldGFpbHMuCi0gICAgICogPHAvPgotICAgICAqIEJhc2VkIG9uIFNlcnZpY2VDbGllbnQuY3JlYXRlQW5vbnltb3VTZXJ2aWNlCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGFkZEFub255bW91c0F4aXNPcGVyYXRpb25zKCkgewotICAgICAgICBpZiAoYXhpc1NlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgT3V0T25seUF4aXNPcGVyYXRpb24gb3V0T25seU9wZXJhdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBPdXRPbmx5QXhpc09wZXJhdGlvbihTZXJ2aWNlQ2xpZW50LkFOT05fT1VUX09OTFlfT1ApOwotICAgICAgICAgICAgYXhpc1NlcnZpY2UuYWRkT3BlcmF0aW9uKG91dE9ubHlPcGVyYXRpb24pOwotICAgICAgICAgICAgb3V0T25seU9wZXJhdGlvbi5zZXRTb2FwQWN0aW9uKG51bGwpOwotCi0gICAgICAgICAgICBPdXRJbkF4aXNPcGVyYXRpb24gb3V0SW5PcGVyYXRpb24gPQotICAgICAgICAgICAgICAgICAgICBuZXcgT3V0SW5BeGlzT3BlcmF0aW9uKFNlcnZpY2VDbGllbnQuQU5PTl9PVVRfSU5fT1ApOwotICAgICAgICAgICAgYXhpc1NlcnZpY2UuYWRkT3BlcmF0aW9uKG91dEluT3BlcmF0aW9uKTsKLSAgICAgICAgICAgIG91dEluT3BlcmF0aW9uLnNldFNvYXBBY3Rpb24obnVsbCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU2VydmljZUNsaWVudCBnZXRTZXJ2aWNlQ2xpZW50KCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKHNlcnZpY2VDbGllbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0N0eCA9IGdldFNlcnZpY2VEZXNjcmlwdGlvbigpLmdldEF4aXNDb25maWdDb250ZXh0KCk7Ci0gICAgICAgICAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1N2YyA9IGdldEF4aXNTZXJ2aWNlKCk7Ci0gICAgICAgICAgICAgICAgQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NmZyA9IGNvbmZpZ0N0eC5nZXRBeGlzQ29uZmlndXJhdGlvbigpOwotICAgICAgICAgICAgICAgIGlmIChheGlzQ2ZnLmdldFNlcnZpY2UoYXhpc1N2Yy5nZXROYW1lKCkpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYXhpc1N2Yy5zZXROYW1lKGF4aXNTdmMuZ2V0TmFtZSgpICsgdW5pcXVlSUQoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNlcnZpY2VDbGllbnQgPSBuZXcgU2VydmljZUNsaWVudChjb25maWdDdHgsIGF4aXNTdmMpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgZSkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZ2V0TWVzc2FnZSgic2VydmljZUNsaWVudENyZWF0ZUVycm9yIiksIGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzZXJ2aWNlQ2xpZW50OwotICAgIH0KLQotICAgIC8vVGhpcyBzaG91bGQgZXZlbnR1YWxseSBiZSBkZXByZWNhdGVkIGluIGZhdm9yICdjcmVhdGVBeGlzU2VydmljZU5hbWVGcm9tREJMCi0gICAgcHJpdmF0ZSBTdHJpbmcgY3JlYXRlQXhpc1NlcnZpY2VOYW1lKCkgewotICAgICAgICBTdHJpbmcgcG9ydE5hbWUgPSBudWxsOwotICAgICAgICBpZiAocG9ydFFOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIHBvcnROYW1lID0gcG9ydFFOYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcG9ydE5hbWUgPSAiTm9Qb3J0TmFtZVNwZWNpZmllZCI7Ci0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZ2V0U2VydmljZURlc2NyaXB0aW9uKCkuZ2V0U2VydmljZVFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCkgKyAiLiIgKyBwb3J0TmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1dTRExGdWxseVNwZWNpZmllZCgpIHsKLSAgICAgICAgcmV0dXJuIGlzQXhpc1NlcnZpY2VCdWlsdEZyb21XU0RMOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzUHJvdmlkZXJCYXNlZCgpIHsKLSAgICAgICAgcmV0dXJuIHdlYlNlcnZpY2VQcm92aWRlckFubm90YXRpb24gIT0gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VuZHBvaW50QmFzZWQoKSB7Ci0gICAgICAgIHJldHVybiB3ZWJTZXJ2aWNlQW5ub3RhdGlvbiAhPSBudWxsOwotICAgIH0KLQotICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAvLyBBTk5PVEFUSU9OOiBXZWJTZXJ2aWNlIGFuZCBXZWJTZXJ2aWNlUHJvdmlkZXIKLSAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEFubm9XZWJTZXJ2aWNlV1NETExvY2F0aW9uKCkgewotICAgICAgICBpZiAoYW5ub3RhdGlvbl9Xc2RsTG9jYXRpb24gPT0gbnVsbCkgewotCi0gICAgICAgICAgICBpZiAoZ2V0QW5ub1dlYlNlcnZpY2UoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYW5ub3RhdGlvbl9Xc2RsTG9jYXRpb24gPSBnZXRBbm5vV2ViU2VydmljZSgpLndzZGxMb2NhdGlvbigpOwotCi0gICAgICAgICAgICAgICAgLy9JZiB0aGlzIGlzIG5vdCBhbiBpbXBsaWNpdCBTRUksIHRoZW4gbWFrZSBzdXJlIHRoYXQgaXRzIG5vdCBvbiB0aGUgU0VJCi0gICAgICAgICAgICAgICAgaWYgKGNvbXBvc2l0ZS5pc1NlcnZpY2VQcm92aWRlcigpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghRGVzY3JpcHRpb25VdGlscy5pc0VtcHR5KGdldEFubm9XZWJTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKSkpIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIHNlaWMgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRTZXJ2aWNlRGVzY3JpcHRpb25JbXBsKCkuZ2V0REJDTWFwKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0KGNvbXBvc2l0ZS5nZXRXZWJTZXJ2aWNlQW5ub3QoKS5lbmRwb2ludEludGVyZmFjZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghRGVzY3JpcHRpb25VdGlscy5pc0VtcHR5KHNlaWMuZ2V0V2ViU2VydmljZUFubm90KCkud3NkbExvY2F0aW9uKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbl9Xc2RsTG9jYXRpb24gPSBzZWljLmdldFdlYlNlcnZpY2VBbm5vdCgpLndzZGxMb2NhdGlvbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChnZXRBbm5vV2ViU2VydmljZVByb3ZpZGVyKCkgIT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAmJiAhRGVzY3JpcHRpb25VdGlscy5pc0VtcHR5KGdldEFubm9XZWJTZXJ2aWNlUHJvdmlkZXIoKS53c2RsTG9jYXRpb24oKSkpIHsKLSAgICAgICAgICAgICAgICBhbm5vdGF0aW9uX1dzZGxMb2NhdGlvbiA9IGdldEFubm9XZWJTZXJ2aWNlUHJvdmlkZXIoKS53c2RsTG9jYXRpb24oKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhlcmUgaXMgbm8gZGVmYXVsdCB2YWx1ZSBwZXIgSlNSLTE4MSBNUiBTZWMgNC4xIHBnIDE2Ci0gICAgICAgICAgICAgICAgYW5ub3RhdGlvbl9Xc2RsTG9jYXRpb24gPSAiIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYW5ub3RhdGlvbl9Xc2RsTG9jYXRpb247Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBbm5vV2ViU2VydmljZVNlcnZpY2VOYW1lKCkgewotICAgICAgICBpZiAoYW5ub3RhdGlvbl9TZXJ2aWNlTmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoZ2V0QW5ub1dlYlNlcnZpY2UoKSAhPSBudWxsCi0gICAgICAgICAgICAgICAgICAgICYmICFEZXNjcmlwdGlvblV0aWxzLmlzRW1wdHkoZ2V0QW5ub1dlYlNlcnZpY2UoKS5zZXJ2aWNlTmFtZSgpKSkgewotICAgICAgICAgICAgICAgIGFubm90YXRpb25fU2VydmljZU5hbWUgPSBnZXRBbm5vV2ViU2VydmljZSgpLnNlcnZpY2VOYW1lKCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGdldEFubm9XZWJTZXJ2aWNlUHJvdmlkZXIoKSAhPSBudWxsCi0gICAgICAgICAgICAgICAgICAgICYmICFEZXNjcmlwdGlvblV0aWxzLmlzRW1wdHkoZ2V0QW5ub1dlYlNlcnZpY2VQcm92aWRlcigpLnNlcnZpY2VOYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgYW5ub3RhdGlvbl9TZXJ2aWNlTmFtZSA9IGdldEFubm9XZWJTZXJ2aWNlUHJvdmlkZXIoKS5zZXJ2aWNlTmFtZSgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBEZWZhdWx0IHZhbHVlIGlzIHRoZSAic2ltcGxlIG5hbWUiIG9mIHRoZSBjbGFzcyBvciBpbnRlcmZhY2UgKyAiU2VydmljZSIKLSAgICAgICAgICAgICAgICAvLyBQZXIgSlNSLTE4MSBNUiBTZWMgNC4xLCBwZyAxNQotICAgICAgICAgICAgICAgIGFubm90YXRpb25fU2VydmljZU5hbWUgPSBEZXNjcmlwdGlvblV0aWxzLmdldFNpbXBsZUphdmFDbGFzc05hbWUoY29tcG9zaXRlLmdldENsYXNzTmFtZSgpKSArICJTZXJ2aWNlIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYW5ub3RhdGlvbl9TZXJ2aWNlTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEFubm9XZWJTZXJ2aWNlUG9ydE5hbWUoKSB7Ci0gICAgICAgIGlmIChhbm5vdGF0aW9uX1BvcnROYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChnZXRBbm5vV2ViU2VydmljZSgpICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgJiYgIURlc2NyaXB0aW9uVXRpbHMuaXNFbXB0eShnZXRBbm5vV2ViU2VydmljZSgpLnBvcnROYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgYW5ub3RhdGlvbl9Qb3J0TmFtZSA9IGdldEFubm9XZWJTZXJ2aWNlKCkucG9ydE5hbWUoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZ2V0QW5ub1dlYlNlcnZpY2VQcm92aWRlcigpICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgJiYgIURlc2NyaXB0aW9uVXRpbHMuaXNFbXB0eShnZXRBbm5vV2ViU2VydmljZVByb3ZpZGVyKCkucG9ydE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICBhbm5vdGF0aW9uX1BvcnROYW1lID0gZ2V0QW5ub1dlYlNlcnZpY2VQcm92aWRlcigpLnBvcnROYW1lKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIERlZmF1bHQgdGhlIHZhbHVlCi0gICAgICAgICAgICAgICAgaWYgKGlzUHJvdmlkZXJCYXNlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIEBXZWJTZXJ2aWNlUHJvdmlkZXIgYW5ub3RhdGlvbiBwYXRoCi0gICAgICAgICAgICAgICAgICAgIC8vIERlZmF1bHQgdmFsdWUgaXMgbm90IHNwZWNpZmllZCBpbiBKU1ItMjI0LCBidXQgd2UgY2FuIGFzc3VtZSBpdCBpcyAKLSAgICAgICAgICAgICAgICAgICAgLy8gc2ltaWxhciB0byB0aGUgZGVmYXVsdCBpbiB0aGUgV2ViU2VydmljZSBjYXNlLCBob3dldmVyIHRoZXJlIGlzIG5vCi0gICAgICAgICAgICAgICAgICAgIC8vIG5hbWUgYXR0cmlidXRlIGZvciBhIFdlYlNlcnZpY2VQcm92aWRlci4gIFNvIGluIHRoaXMgY2FzZSB3ZSB1c2UgCi0gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBkZWZhdWx0IHZhbHVlIGZvciBXZWJTZXJ2aWNlLm5hbWUgcGVyIEpTUi0xODEgTVIgc2VjIDQuMSBwZyAxNS4KLSAgICAgICAgICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHRoaXMgaXMgcmVhbGx5IHRoZSBzYW1lIHRoaW5nIGFzIHRoZSBjYWxsIHRvIGdldFdlYlNlcnZpY2VOYW1lKCkgCi0gICAgICAgICAgICAgICAgICAgIC8vIGluIHRoZSBXZWJTZXJ2aWNlIGNhc2U7IGl0IGlzIGRvbmUgc2VwZXJ0ZWx5IGp1c3QgdG8gYmUgY2xlYXIgdGhlcmUgaXMgbm8gCi0gICAgICAgICAgICAgICAgICAgIC8vIG5hbWUgZWxlbWVudCBvbiB0aGUgV2ViU2VydmljZVByb3ZpZGVyIGFubm90YXRpb24KLSAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbl9Qb3J0TmFtZSA9IERlc2NyaXB0aW9uVXRpbHMuZ2V0U2ltcGxlSmF2YUNsYXNzTmFtZShjb21wb3NpdGUuZ2V0Q2xhc3NOYW1lKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICArICJQb3J0IjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBAV2ViU2VydmljZSBhbm5vdGF0aW9uIHBhdGgKLSAgICAgICAgICAgICAgICAgICAgLy8gRGVmYXVsdCB2YWx1ZSBpcyB0aGUgQFdlYlNlcnZpY2UubmFtZSBvZiB0aGUgY2xhc3Mgb3IgaW50ZXJmYWNlICsgIlBvcnQiCi0gICAgICAgICAgICAgICAgICAgIC8vIFBlciBKU1ItMTgxIE1SIFNlYyA0LjEsIHBnIDE1Ci0gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25fUG9ydE5hbWUgPSBnZXRBbm5vV2ViU2VydmljZU5hbWUoKSArICJQb3J0IjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGFubm90YXRpb25fUG9ydE5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBbm5vV2ViU2VydmljZVRhcmdldE5hbWVzcGFjZSgpIHsKLSAgICAgICAgaWYgKGFubm90YXRpb25fVGFyZ2V0TmFtZXNwYWNlID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChnZXRBbm5vV2ViU2VydmljZSgpICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgJiYgIURlc2NyaXB0aW9uVXRpbHMuaXNFbXB0eShnZXRBbm5vV2ViU2VydmljZSgpLnRhcmdldE5hbWVzcGFjZSgpKSkgewotICAgICAgICAgICAgICAgIGFubm90YXRpb25fVGFyZ2V0TmFtZXNwYWNlID0gZ2V0QW5ub1dlYlNlcnZpY2UoKS50YXJnZXROYW1lc3BhY2UoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZ2V0QW5ub1dlYlNlcnZpY2VQcm92aWRlcigpICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgJiYgIURlc2NyaXB0aW9uVXRpbHMuaXNFbXB0eShnZXRBbm5vV2ViU2VydmljZVByb3ZpZGVyKCkudGFyZ2V0TmFtZXNwYWNlKCkpKSB7Ci0gICAgICAgICAgICAgICAgYW5ub3RhdGlvbl9UYXJnZXROYW1lc3BhY2UgPSBnZXRBbm5vV2ViU2VydmljZVByb3ZpZGVyKCkudGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIERlZmF1bHQgdmFsdWUgcGVyIEpTUi0xODEgTVIgU2VjIDQuMSBwZyAxNSBkZWZlcnMgdG8gIkltcGxlbWVudGF0aW9uIGRlZmluZWQsIAotICAgICAgICAgICAgICAgIC8vIGFzIGRlc2NyaWJlZCBpbiBKQVgtV1MgMi4wLCBzZWN0aW9uIDMuMiIgd2hpY2ggaXMgSkFYLVdTIDIuMCBTZWMgMy4yLCBwZyAyOS4KLSAgICAgICAgICAgICAgICBhbm5vdGF0aW9uX1RhcmdldE5hbWVzcGFjZSA9Ci0gICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uVXRpbHMubWFrZU5hbWVzcGFjZUZyb21QYWNrYWdlTmFtZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvblV0aWxzLmdldEphdmFQYWNrYWdlTmFtZShjb21wb3NpdGUuZ2V0Q2xhc3NOYW1lKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGFubm90YXRpb25fVGFyZ2V0TmFtZXNwYWNlOwotICAgIH0KLQotICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAvLyBBTk5PVEFUSU9OOiBXZWJTZXJ2aWNlUHJvdmlkZXIKLSAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgICBwdWJsaWMgV2ViU2VydmljZVByb3ZpZGVyIGdldEFubm9XZWJTZXJ2aWNlUHJvdmlkZXIoKSB7Ci0gICAgICAgIHJldHVybiB3ZWJTZXJ2aWNlUHJvdmlkZXJBbm5vdGF0aW9uOwotICAgIH0KLQotICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAvLyBBTk5PVEFUSU9OOiBXZWJTZXJ2aWNlCi0gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gICAgcHVibGljIFdlYlNlcnZpY2UgZ2V0QW5ub1dlYlNlcnZpY2UoKSB7Ci0gICAgICAgIHJldHVybiB3ZWJTZXJ2aWNlQW5ub3RhdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEFubm9XZWJTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKSB7Ci0gICAgICAgIC8vIFRPRE86IFZhbGlkYXRpb246IE5vdCBhbGxvd2VkIG9uIFdlYlNlcnZpY2VQcm92aWRlcgotICAgICAgICBpZiAod2ViU2VydmljZV9FbmRwb2ludEludGVyZmFjZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoIWlzUHJvdmlkZXJCYXNlZCgpICYmIGdldEFubm9XZWJTZXJ2aWNlKCkgIT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAmJiAhRGVzY3JpcHRpb25VdGlscy5pc0VtcHR5KGdldEFubm9XZWJTZXJ2aWNlKCkuZW5kcG9pbnRJbnRlcmZhY2UoKSkpIHsKLSAgICAgICAgICAgICAgICB3ZWJTZXJ2aWNlX0VuZHBvaW50SW50ZXJmYWNlID0gZ2V0QW5ub1dlYlNlcnZpY2UoKS5lbmRwb2ludEludGVyZmFjZSgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBUaGlzIGVsZW1lbnQgaXMgbm90IHZhbGlkIG9uIGEgV2ViU2VydmljZVByb3ZpZGVyIGFubm90YXRpb24KLSAgICAgICAgICAgICAgICB3ZWJTZXJ2aWNlX0VuZHBvaW50SW50ZXJmYWNlID0gIiI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHdlYlNlcnZpY2VfRW5kcG9pbnRJbnRlcmZhY2U7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBbm5vV2ViU2VydmljZU5hbWUoKSB7Ci0gICAgICAgIC8vIFRPRE86IFZhbGlkYXRpb246IE5vdCBhbGxvd2VkIG9uIFdlYlNlcnZpY2VQcm92aWRlcgotCi0gICAgICAgIC8vVE9ETzogUGVyIEpTUjEwOSB2MS4yIFNlYy4gNS4zLjIuMQotICAgICAgICAvLyAgICAgIElmIG5vdCBzcGVjaWZpZWQgdGhlbiB3ZSBjYW4gdXNlIHRoZSBkZWZhdWx0IHZhbHVlIGFzIHNwZWNpZmllZCBpbiBKU1IgMTgxCi0gICAgICAgIC8vCQkoYnV0IG9ubHkgaWYgaXQgaXMgdW5pcXVlIHdpdGhpbiB0aGUgbW9kdWxlKS4uLm9yIElmIHRoZSBuYW1lIGlzCi0gICAgICAgIC8vCQlub3Qgc3BlY2lmaWVkIGluIHRoZSBTZXJ2aWNlIEltcGxlbWVudGF0aW9uIEJlYW4gdGhlbiBmdWxseQotICAgICAgICAvLwkJcXVhbGlmaWVkIG5hbWUgb2YgdGhlIEJlYW4gY2xhc3MgaXMgdXNlZCB0byBndWFyYW50ZWUgdW5pcXVlbmVzcwotICAgICAgICAvLwkJSWYgdGhlIGFib3ZlIGlzIG5vdCB1bmlxdWUgdGhlbiBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUKLSAgICAgICAgLy8JCUJlYW4gY2xhc3MgaXMgdXNlZCB0byBndWFyYW50ZWUgdW5pcXVlbmVzcwotCi0gICAgICAgIGlmICh3ZWJTZXJ2aWNlX05hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKCFpc1Byb3ZpZGVyQmFzZWQoKSkgewotICAgICAgICAgICAgICAgIGlmIChnZXRBbm5vV2ViU2VydmljZSgpICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgICAgICYmICFEZXNjcmlwdGlvblV0aWxzLmlzRW1wdHkoZ2V0QW5ub1dlYlNlcnZpY2UoKS5uYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHdlYlNlcnZpY2VfTmFtZSA9IGdldEFubm9XZWJTZXJ2aWNlKCkubmFtZSgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHdlYlNlcnZpY2VfTmFtZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvblV0aWxzLmdldFNpbXBsZUphdmFDbGFzc05hbWUoY29tcG9zaXRlLmdldENsYXNzTmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIFRoaXMgZWxlbWVudCBpcyBub3QgdmFsaWQgb24gYSBXZWJTZXJ2aWNlUHJvdmlkZXIgYW5ub3RhdGlvbgotICAgICAgICAgICAgICAgIHdlYlNlcnZpY2VfTmFtZSA9ICIiOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB3ZWJTZXJ2aWNlX05hbWU7Ci0gICAgfQotCi0gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIC8vIEFOTk9UQVRJT046IFNlcnZpY2VNb2RlCi0gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIHB1YmxpYyBTZXJ2aWNlTW9kZSBnZXRBbm5vU2VydmljZU1vZGUoKSB7Ci0KLSAgICAgICAgaWYgKHNlcnZpY2VNb2RlQW5ub3RhdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICBzZXJ2aWNlTW9kZUFubm90YXRpb24gPSBjb21wb3NpdGUuZ2V0U2VydmljZU1vZGVBbm5vdCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzZXJ2aWNlTW9kZUFubm90YXRpb247Ci0gICAgfQotCi0gICAgcHVibGljIFNlcnZpY2UuTW9kZSBnZXRTZXJ2aWNlTW9kZSgpIHsKLSAgICAgICAgcmV0dXJuIGdldEFubm9TZXJ2aWNlTW9kZVZhbHVlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFNlcnZpY2UuTW9kZSBnZXRBbm5vU2VydmljZU1vZGVWYWx1ZSgpIHsKLSAgICAgICAgLy8gVGhpcyBhbm5vdGF0aW9uIGlzIG9ubHkgdmFsaWQgb24gUHJvdmlkZXItYmFzZWQgZW5kcG9pbnRzLiAKLSAgICAgICAgaWYgKGlzUHJvdmlkZXJCYXNlZCgpICYmIHNlcnZpY2VNb2RlVmFsdWUgPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGdldEFubm9TZXJ2aWNlTW9kZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzZXJ2aWNlTW9kZVZhbHVlID0gZ2V0QW5ub1NlcnZpY2VNb2RlKCkudmFsdWUoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2VydmljZU1vZGVWYWx1ZSA9IFNlcnZpY2VNb2RlX0RFRkFVTFQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNlcnZpY2VNb2RlVmFsdWU7Ci0gICAgfQotCi0gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIC8vIEFOTk9UQVRJT046IEJpbmRpbmdUeXBlCi0gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gICAgcHVibGljIEJpbmRpbmdUeXBlIGdldEFubm9CaW5kaW5nVHlwZSgpIHsKLSAgICAgICAgaWYgKGJpbmRpbmdUeXBlQW5ub3RhdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICBiaW5kaW5nVHlwZUFubm90YXRpb24gPSBjb21wb3NpdGUuZ2V0QmluZGluZ1R5cGVBbm5vdCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBiaW5kaW5nVHlwZUFubm90YXRpb247Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRCaW5kaW5nVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIGdldEFubm9CaW5kaW5nVHlwZVZhbHVlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBbm5vQmluZGluZ1R5cGVWYWx1ZSgpIHsKLSAgICAgICAgaWYgKGJpbmRpbmdUeXBlVmFsdWUgPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGdldEFubm9CaW5kaW5nVHlwZSgpICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAgICAgIURlc2NyaXB0aW9uVXRpbHMuaXNFbXB0eShnZXRBbm5vQmluZGluZ1R5cGUoKS52YWx1ZSgpKSkgewotICAgICAgICAgICAgICAgIGJpbmRpbmdUeXBlVmFsdWUgPSBnZXRBbm5vQmluZGluZ1R5cGUoKS52YWx1ZSgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBObyBCaW5kaW5nVHlwZSBhbm5vdGF0aW9uIHByZXNlbnQgb3IgdmFsdWUgd2FzIGVtcHR5OyB1c2UgZGVmYXVsdCB2YWx1ZQotICAgICAgICAgICAgICAgIGJpbmRpbmdUeXBlVmFsdWUgPSBCaW5kaW5nVHlwZV9ERUZBVUxUOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBiaW5kaW5nVHlwZVZhbHVlOwotICAgIH0KLQotICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAvLyBBTk5PVEFUSU9OOiBIYW5kbGVyQ2hhaW4KLSAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRIYW5kbGVyQ2hhaW4oSGFuZGxlckNoYWluc1R5cGUgaGFuZGxlckNoYWluKSB7Ci0gICAgICAgIGhhbmRsZXJDaGFpbnNUeXBlID0gaGFuZGxlckNoYWluOwotICAgIH0KLQotICAgIHB1YmxpYyBIYW5kbGVyQ2hhaW5zVHlwZSBnZXRIYW5kbGVyQ2hhaW4oKSB7Ci0gICAgICAgIHJldHVybiBnZXRIYW5kbGVyQ2hhaW4obnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIHNjaGVtYSBkZXJpdmVkIGphdmEgY2xhc3MgY29udGFpbmluZyB0aGUgdGhlIGhhbmRsZXIgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi4gIAotICAgICAqIFRoYXQgaW5mb3JtYXRpb24sIHJldHVybmVkIGluIHRoZSBIYW5kbGVyQ2hhaW5zVHlwZSBvYmplY3QsIGlzIGxvb2tlZCBmb3IgaW4gdGhlIGZvbGxvd2luZyAKLSAgICAgKiBwbGFjZXMgaW4gdGhpcyBvcmRlcjoKLSAgICAgKiAtIFNldCBvbiB0aGUgc3BhcnNlQ29tcG9zaXRlIGZvciB0aGUgZ2l2ZW4ga2V5Ci0gICAgICogLSBTZXQgb24gdGhlIGNvbXBvc2l0ZQotICAgICAqIC0gUmVhZCBpbiBmcm9tIHRoZSBmaWxlIHNwZWNpZmllZCBvbiBIYW5kbGVyQ2hhaW4gYW5ub3RhdGlvbgotICAgICAqIAotICAgICAqIEByZXR1cm4gSGFuZGxlckNoYWluc1R5cGUgVGhpcyBpcyB0aGUgdG9wLWxldmVsIGVsZW1lbnQgZm9yIHRoZSBIYW5kbGVyIGNvbmZpZ3VyYXRpb24gZmlsZQotICAgICAqIAotICAgICAqLwotICAgIHB1YmxpYyBIYW5kbGVyQ2hhaW5zVHlwZSBnZXRIYW5kbGVyQ2hhaW4oT2JqZWN0IHNwYXJzZUNvbXBvc2l0ZUtleSkgewotICAgICAgICAKLSAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIHNwYXJzZUNvbXBvc2l0ZSA9IG51bGw7Ci0gICAgICAgIAotICAgICAgICAvLyBJZiB0aGVyZSBpcyBhIEhhbmRsZXJDaGFpbnNUeXBlIGluIHRoZSBzcGFyc2UgY29tcG9zaXRlIGZvciB0aGlzIFNlcnZpY2VEZWxlZ2F0ZQotICAgICAgICAvLyAoaS5lLiB0aGlzIHNwYXJzZUNvbXBvc2l0ZUtleSksIHRoZW4gcmV0dXJuIHRoYXQuCi0gICAgICAgIGlmIChzcGFyc2VDb21wb3NpdGVLZXkgIT0gbnVsbCkgewotICAgICAgICAgICAgc3BhcnNlQ29tcG9zaXRlID0gY29tcG9zaXRlLmdldFNwYXJzZUNvbXBvc2l0ZShzcGFyc2VDb21wb3NpdGVLZXkpOwotICAgICAgICAgICAgaWYgKHNwYXJzZUNvbXBvc2l0ZSAhPSBudWxsICYmIHNwYXJzZUNvbXBvc2l0ZS5nZXRIYW5kbGVyQ2hhaW5zVHlwZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBIYW5kbGVyQ2hhaW5zVHlwZSBoY3QgPSBzcGFyc2VDb21wb3NpdGUuZ2V0SGFuZGxlckNoYWluc1R5cGUoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gaGN0OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBJZiB0aGVyZSBpcyBubyBIYW5kbGVyQ2hhaW5zVHlwZSBpbiB0aGUgY29tcG9zaXRlLCB0aGVuIHJlYWQgaW4gdGhlIGZpbGUgc3BlY2lmaWVkCi0gICAgICAgIC8vIG9uIHRoZSBIYW5kbGVyQ2hhaW4gYW5ub3RhdGlvbiBpZiBpdCBpcyBwcmVzZW50LgotICAgICAgICBpZiAoaGFuZGxlckNoYWluc1R5cGUgPT0gbnVsbCkgewotICAgICAgICAgICAgZ2V0QW5ub0hhbmRsZXJDaGFpbkFubm90YXRpb24oc3BhcnNlQ29tcG9zaXRlS2V5KTsKLSAgICAgICAgICAgIGlmIChoYW5kbGVyQ2hhaW5Bbm5vdGF0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgaGFuZGxlckZpbGVOYW1lID0gaGFuZGxlckNoYWluQW5ub3RhdGlvbi5maWxlKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKE1lc3NhZ2VzLmdldE1lc3NhZ2UoImhhbmRsZXJDaGFpbnNUeXBlRXJyIixoYW5kbGVyRmlsZU5hbWUsY29tcG9zaXRlLmdldENsYXNzTmFtZSgpKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IGNvbXBvc2l0ZS5nZXRDbGFzc05hbWUoKTsKLQotICAgICAgICAgICAgICAgIC8vIFJFVklFVzogVGhpcyBpcyB1c2luZyB0aGUgY2xhc3Nsb2FkZXIgZm9yIEVuZHBvaW50RGVzY3JpcHRpb25JbXBsOyBpcyB0aGF0IE9LPwotICAgICAgICAgICAgICAgIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyID0gKGNvbXBvc2l0ZS5pc1NlcnZpY2VQcm92aWRlcigpKSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb21wb3NpdGUuZ2V0Q2xhc3NMb2FkZXIoKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAoQ2xhc3NMb2FkZXIpIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUHJpdmlsZWdlZEFjdGlvbigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgKTsKLQotICAgICAgICAgICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKXsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJUcnlpbmcgdG8gbG9hZCBmaWxlICIgKyBoYW5kbGVyRmlsZU5hbWUgKyAiIHJlbGF0aXZlIHRvICIgKyBjbGFzc05hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IERlc2NyaXB0aW9uVXRpbHMub3BlbkhhbmRsZXJDb25maWdTdHJlYW0oCi0gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyRmlsZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc0xvYWRlcik7Ci0gICAgICAgICAgICAgICAgaWYgKGlzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gY29uZmlnIHN0cmVhbSBpcyBzdGlsbCBudWxsLiAgVGhpcyBtYXkgbWVhbiB0aGUgQEhhbmRsZXJDaGFpbiBhbm5vdGF0aW9uIGlzIG9uIGEgKmRyaXZlciogY2xhc3MKLSAgICAgICAgICAgICAgICAgICAgLy8gbmV4dCB0byBhIEBXZWJTZXJ2aWNlUmVmIGFubm90YXRpb24sIHNvIHRoZSBwYXRoIGlzIHJlbGF0aXZlIHRvIHRoZSBjbGFzcyBkZWNsYXJpbmcgQEhhbmRsZXJDaGFpbgotICAgICAgICAgICAgICAgICAgICAvLyBhbmQgTk9UIHJlbGF0aXZlIHRvIHRoZSBTZXJ2aWNlIG9yIEVuZHBvaW50IGNsYXNzLCB3aGljaCBhbHNvIG1lYW5zIHdlIHNob3VsZCB1c2UgdGhlIHNwYXJzZUNvbXBvc2l0ZQotICAgICAgICAgICAgICAgICAgICAvLyBzaW5jZSB0aGF0IGlzIHdoZXJlIHRoZSBASGFuZGxlckNoYWluIGFubm90YXRpb24gaW5mbyB3b3VsZCBoYXZlIGJlZW4gbG9hZGVkLgotICAgICAgICAgICAgICAgICAgICBpZiAoc3BhcnNlQ29tcG9zaXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoYW5kbGVyQ2hhaW5EZWNsYXJpbmdDbGFzcyA9IChTdHJpbmcpc3BhcnNlQ29tcG9zaXRlLmdldFByb3BlcnRpZXMoKS5nZXQoTURRQ29uc3RhbnRzLkhBTkRMRVJfQ0hBSU5fREVDTEFSSU5HX0NMQVNTKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYW5kbGVyQ2hhaW5EZWNsYXJpbmdDbGFzcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lID0gaGFuZGxlckNoYWluRGVjbGFyaW5nQ2xhc3M7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgPSBEZXNjcmlwdGlvblV0aWxzLm9wZW5IYW5kbGVyQ29uZmlnU3RyZWFtKGhhbmRsZXJGaWxlTmFtZSwgY2xhc3NOYW1lLCBjbGFzc0xvYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZihpcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiaGFuZGxlckNoYWluTlMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXJGaWxlTmFtZSwgY2xhc3NOYW1lKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIxID0gKENsYXNzTG9hZGVyKSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUHJpdmlsZWdlZEFjdGlvbigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICk7Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZXJDaGFpbnNUeXBlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uVXRpbHMubG9hZEhhbmRsZXJDaGFpbnMoaXMsIGNsYXNzTG9hZGVyMSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBoYW5kbGVyQ2hhaW5zVHlwZTsKLSAgICB9Ci0gIAotICAgIHB1YmxpYyBIYW5kbGVyQ2hhaW4gZ2V0QW5ub0hhbmRsZXJDaGFpbkFubm90YXRpb24oT2JqZWN0IHNwYXJzZUNvbXBvc2l0ZUtleSkgewotICAgICAgICBpZiAodGhpcy5oYW5kbGVyQ2hhaW5Bbm5vdGF0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChjb21wb3NpdGUuaXNTZXJ2aWNlUHJvdmlkZXIoKSkgewotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICogUGVyIEpTUi0xODEgVGhlIEBIYW5kbGVyQ2hhaW4gYW5ub3RhdGlvbiBNQVkgYmUgcHJlc2VudCBvbgotICAgICAgICAgICAgICAgICAqIHRoZSBlbmRwb2ludCBpbnRlcmZhY2UgYW5kIHNlcnZpY2UgaW1wbGVtZW50YXRpb24gYmVhbi4gVGhlCi0gICAgICAgICAgICAgICAgICogc2VydmljZSBpbXBsZW1lbnRhdGlvbnMgYmVhbidzIEBIYW5kbGVyQ2hhaW4gaXMgdXNlZCBpZgotICAgICAgICAgICAgICAgICAqIEBIYW5kbGVyQ2hhaW4gaXMgcHJlc2VudCBvbiBib3RoLiBTbywgaWYgd2UgZG8gZmluZCB0aGUKLSAgICAgICAgICAgICAgICAgKiBhbm5vdGF0aW9uIG9uIHRoaXMgaW1wbCwgdGhlbiBkb24ndCB3b3JyeSBhYm91dCBlbHNlCi0gICAgICAgICAgICAgICAgICogT3RoZXJ3aXNlLCBjaGVjayB0byBzZWUgaWYgdGhlIFNFSSBtaWdodCBiZSBhbm5vdGF0ZWQgd2l0aAotICAgICAgICAgICAgICAgICAqIEBIYW5kbGVyQ2hhaW4KLSAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgICAgIGhhbmRsZXJDaGFpbkFubm90YXRpb24gPSBjb21wb3NpdGUuZ2V0SGFuZGxlckNoYWluQW5ub3QoKTsKLSAgICAgICAgICAgICAgICBpZiAoaGFuZGxlckNoYWluQW5ub3RhdGlvbiA9PSBudWxsKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBpcyBOT1QgYW4gaW1wbGljaXQgU0VJLCB0aGVuIGNoZWNrIGZvciB0aGUKLSAgICAgICAgICAgICAgICAgICAgLy8gYW5ub3RhdGlvbiBvbiB0aGUgU0VJCi0gICAgICAgICAgICAgICAgICAgIGlmICghRGVzY3JpcHRpb25VdGlscy5pc0VtcHR5KGdldEFubm9XZWJTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKSkpIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIHNlaWMgPSBnZXRTZXJ2aWNlRGVzY3JpcHRpb25JbXBsKCkuZ2V0REJDTWFwKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0KGNvbXBvc2l0ZS5nZXRXZWJTZXJ2aWNlQW5ub3QoKS5lbmRwb2ludEludGVyZmFjZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWljICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyQ2hhaW5Bbm5vdGF0aW9uID0gc2VpYy5nZXRIYW5kbGVyQ2hhaW5Bbm5vdCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVyQ2hhaW5Bbm5vdGF0aW9uID0gY29tcG9zaXRlLmdldEhhbmRsZXJDaGFpbkFubm90KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGhhbmRsZXJDaGFpbkFubm90YXRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKHNwYXJzZUNvbXBvc2l0ZUtleSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIHNwYXJzZUNvbXBvc2l0ZSA9IGNvbXBvc2l0ZS5nZXRTcGFyc2VDb21wb3NpdGUoc3BhcnNlQ29tcG9zaXRlS2V5KTsKLSAgICAgICAgICAgICAgICBpZiAoc3BhcnNlQ29tcG9zaXRlICE9IG51bGwgJiYgc3BhcnNlQ29tcG9zaXRlLmdldEhhbmRsZXJDaGFpbkFubm90KCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBoYW5kbGVyQ2hhaW5Bbm5vdGF0aW9uID0gc3BhcnNlQ29tcG9zaXRlLmdldEhhbmRsZXJDaGFpbkFubm90KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGhhbmRsZXJDaGFpbkFubm90YXRpb247Ci0gICAgfQotCi0gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIC8vIEFOTk9UQVRJT046IE1UT00KLSAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkVuZHBvaW50RGVzY3JpcHRpb24jaXNNVE9NRW5hYmxlZCgpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNNVE9NRW5hYmxlZCgpIHsKLSAgICAgICAgaWYgKGlzTVRPTUVuYWJsZWRDYWNoZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gaXNNVE9NRW5hYmxlZENhY2hlLmJvb2xlYW5WYWx1ZSgpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBpc01UT01FbmFibGVkIGlzIGEgY29tYmluYXRpb24gb2YgdGhlIEBCaW5kaW5nVHlwZSBhbmQgdGhlIEBNVE9NIHNldHRpbmcuCi0gICAgICAgIE1UT00gbXRvbUFubm90YXRpb24gPQotICAgICAgICAgICAgICAgIChNVE9NKSBnZXRBbm5vRmVhdHVyZShNVE9NRmVhdHVyZS5JRCk7Ci0gICAgICAgIAotICAgICAgICAvLyBJZiB0aGUgQE1UT00gYW5ub3RhdGlvbiBpcyBzZXQsIGl0IHdpbnMKLSAgICAgICAgaWYgKG10b21Bbm5vdGF0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlzTVRPTUVuYWJsZWRDYWNoZSA9IEJvb2xlYW4udmFsdWVPZihtdG9tQW5ub3RhdGlvbi5lbmFibGVkKCkpOwotICAgICAgICAgICAgcmV0dXJuIGlzTVRPTUVuYWJsZWRDYWNoZS5ib29sZWFuVmFsdWUoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gRWxzZSBsb29rIGF0IHRoZSBiaW5kaW5nVHlwZQotICAgICAgICBTdHJpbmcgYmluZGluZ1R5cGUgPSBnZXRCaW5kaW5nVHlwZSgpOwotICAgICAgICBpc01UT01FbmFibGVkQ2FjaGUgPSBCb29sZWFuLnZhbHVlT2YoaXNNVE9NQmluZGluZyhiaW5kaW5nVHlwZSkpOwotICAgICAgICByZXR1cm4gaXNNVE9NRW5hYmxlZENhY2hlLmJvb2xlYW5WYWx1ZSgpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTVRPTUJpbmRpbmcoU3RyaW5nIHVybCkgewotICAgICAgICBpZiAodXJsICE9IG51bGwgJiYgCi0gICAgICAgICAgICAgICAodXJsLmVxdWFscyhTT0FQQmluZGluZy5TT0FQMTFIVFRQX01UT01fQklORElORykgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgdXJsLmVxdWFscyhTT0FQQmluZGluZy5TT0FQMTJIVFRQX01UT01fQklORElORykgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgdXJsLmVxdWFscyhNRFFDb25zdGFudHMuU09BUDExSk1TX01UT01fQklORElORykgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgdXJsLmVxdWFscyhNRFFDb25zdGFudHMuU09BUDEySk1TX01UT01fQklORElORykpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAvLyBBTk5PVEFUSU9OOiBSZXNwZWN0QmluZGluZwotICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiByZXNwZWN0QmluZGluZygpIHsKLSAgICAgICAgcmV0dXJuIHJlc3BlY3RCaW5kaW5nOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRSZXNwZWN0QmluZGluZyhib29sZWFuIHIpIHsKLSAgICAgICAgcmVzcGVjdEJpbmRpbmcgPSByOwotICAgIH0KLQotCi0gICAgcHVibGljIGJvb2xlYW4gYWRkUmVxdWlyZWRCaW5kaW5nKFFOYW1lIG5hbWUpIHsKLSAgICAgICAgaWYgKHJlcXVpcmVkQmluZGluZ3MgPT0gbnVsbCkKLSAgICAgICAgICAgIHJlcXVpcmVkQmluZGluZ3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgcmV0dXJuIHJlcXVpcmVkQmluZGluZ3MuYWRkKG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0IGdldFJlcXVpcmVkQmluZGluZ3MoKSB7Ci0gICAgICAgIGlmIChyZXF1aXJlZEJpbmRpbmdzID09IG51bGwpCi0gICAgICAgICAgICByZXF1aXJlZEJpbmRpbmdzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICByZXR1cm4gcmVxdWlyZWRCaW5kaW5nczsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRW5kcG9pbnREZXNjcmlwdGlvbiNnZXRNVE9NVGhyZXNob2xkKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldE1UT01UaHJlc2hvbGQoKSB7Ci0gICAgICAgIGlmIChheGlzU2VydmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBXZSBzaG91bGQgY2FjaGUgdGhpcyBjYWxsIGhlcmUgc28gd2UgZG9uJ3QgaGF2ZSB0byBtYWtlCi0gICAgICAgICAgICAvLyBpdCBvbiBldmVyeSBwYXNzIHRocm91Z2guCi0gICAgICAgICAgICBQYXJhbWV0ZXIgbXRvbVRocmVzaG9sZCA9IGF4aXNTZXJ2aWNlLmdldFBhcmFtZXRlcihDb25maWd1cmF0aW9uLk1UT01fVEhSRVNIT0xEKTsKLSAgICAgICAgICAgIGlmIChtdG9tVGhyZXNob2xkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKEludGVnZXIpIG10b21UaHJlc2hvbGQuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICAKLSAgICAvLyBHZXQgdGhlIHNwZWNpZmllZCBXZWJTZXJ2aWNlRmVhdHVyZUFubm90YXRpb24KLSAgICBwdWJsaWMgQW5ub3RhdGlvbiBnZXRBbm5vRmVhdHVyZShTdHJpbmcgaWQpIHsKLSAgICAgICAgcmV0dXJuIGZyYW1ld29yay5nZXRBbm5vdGF0aW9uKGlkKTsKLSAgICB9Ci0gICAgCi0gICAgLy9UaGUgV2ViU2VydmljZUZlYXR1cmVzIHNob3VsZCBiZSBjb25maWd1ZWQgbGFzdCBzbyB0aGF0IGFueSBvdGhlcgotICAgIC8vY29uZmlndXJhdGlvbiBjYW4gYmUgb3ZlcnJpZGRlbi4gU2hvdWxkIG9ubHkgYmUgY2FsbGVkIG9uIHRoZQotICAgIC8vc2VydmVyIHNpZGUuCi0gICAgcHJpdmF0ZSB2b2lkIGNvbmZpZ3VyZVdlYlNlcnZpY2VGZWF0dXJlcygpIHsKLSAgICAgICAgU3RyaW5nIGJpbmRpbmdUeXBlID0gZ2V0QmluZGluZ1R5cGUoKTsKLSAgICAgICAgU2V0PFN0cmluZz4gaWRzID0gU2VydmVyQ29uZmlndXJhdG9yUmVnaXN0cnkuZ2V0SWRzKCk7Ci0gICAgICAgIAotICAgICAgICBmb3IgKFN0cmluZyBpZCA6IGlkcykgewotICAgICAgICAgICAgU2VydmVyQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvciA9IFNlcnZlckNvbmZpZ3VyYXRvclJlZ2lzdHJ5LmdldENvbmZpZ3VyYXRvcihpZCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChjb25maWd1cmF0b3Iuc3VwcG9ydHMoYmluZGluZ1R5cGUpKQotICAgICAgICAgICAgICAgIGZyYW1ld29yay5hZGRDb25maWd1cmF0b3IoaWQsIGNvbmZpZ3VyYXRvcik7Ci0gICAgICAgIH0KLSAgICAJCi0gICAgICAgIC8vIFRoZSBmZWF0dXJlIGluc3RhbmNlcyBhcmUgc3RvcmVkIG9uIHRoZSBjb21wb3NpdGUgZnJvbSBlaXRoZXIgdGhlIAotICAgICAgICAvLyBKYXZhIGNsYXNzIG9yIGZyb20gc29tZXRoaW5nIGVsc2UgYnVpbGRpbmcgdGhlIGxpc3QgYW5kIHNldHRpbmcgaXQgdGhlcmUuCi0gICAgICAgIExpc3Q8QW5ub3RhdGlvbj4gZmVhdHVyZXMgPSBjb21wb3NpdGUuZ2V0V2ViU2VydmljZUZlYXR1cmVzKCk7Ci0gICAgICAgIAotICAgICAgICBpZiAoZmVhdHVyZXMgIT0gbnVsbCAmJiBmZWF0dXJlcy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICAvLyBBZGQgZWFjaCBvZiB0aGUgYW5ub3RhdGlvbiBpbnN0YW5jZXMgdG8gdGhlIFdlYlNlcnZpY2VGZWF0dXJlIGZyYW1ld29yawotICAgICAgICAgICAgSXRlcmF0b3I8QW5ub3RhdGlvbj4gaXRyID0gZmVhdHVyZXMuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgQW5ub3RhdGlvbiBmZWF0dXJlID0gKEFubm90YXRpb24pIGl0ci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgZnJhbWV3b3JrLmFkZEFubm90YXRpb24oZmVhdHVyZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIEtpY2sgb2ZmIHRoZSBjb25maWd1cmF0aW9uIG9mIHRoZSBXZWJTZXJ2aWNlRmVhdHVyZSBpbnN0YW5jZXMuCi0gICAgICAgICAgICBmcmFtZXdvcmsuY29uZmlndXJlKHRoaXMpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJObyBXZWJTZXJ2aWNlRmVhdHVyZUFubm90YXRpb24gaW5zdGFuY2VzIHdlcmUgZm91bmQgb24gdGhlIGNvbXBvc2l0ZS4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSAgIAotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIERlZmluaXRpb24gZ2V0V1NETERlZmluaXRpb24oKSB7Ci0gICAgICAgIHJldHVybiAoKFNlcnZpY2VEZXNjcmlwdGlvbldTREwpZ2V0U2VydmljZURlc2NyaXB0aW9uKCkpLmdldFdTRExEZWZpbml0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGphdmF4LndzZGwuU2VydmljZSBnZXRXU0RMU2VydmljZSgpIHsKLSAgICAgICAgRGVmaW5pdGlvbiBkZWZuID0gZ2V0V1NETERlZmluaXRpb24oKTsKLSAgICAgICAgaWYgKGRlZm4gIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGRlZm4uZ2V0U2VydmljZShnZXRTZXJ2aWNlUU5hbWUoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBQb3J0IGdldFdTRExQb3J0KCkgewotICAgICAgICBqYXZheC53c2RsLlNlcnZpY2Ugc2VydmljZSA9IGdldFdTRExTZXJ2aWNlKCk7Ci0gICAgICAgIGlmIChzZXJ2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlLmdldFBvcnQoZ2V0UG9ydFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgQmluZGluZyBnZXRXU0RMQmluZGluZygpIHsKLSAgICAgICAgQmluZGluZyB3c2RsQmluZGluZyA9IG51bGw7Ci0gICAgICAgIFBvcnQgd3NkbFBvcnQgPSBnZXRXU0RMUG9ydCgpOwotICAgICAgICBEZWZpbml0aW9uIHdzZGxEZWYgPSBnZXRXU0RMRGVmaW5pdGlvbigpOwotICAgICAgICBpZiAod3NkbFBvcnQgIT0gbnVsbCAmJiB3c2RsRGVmICE9IG51bGwpIHsKLSAgICAgICAgICAgIHdzZGxCaW5kaW5nID0gd3NkbFBvcnQuZ2V0QmluZGluZygpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB3c2RsQmluZGluZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFdTRExCaW5kaW5nVHlwZSgpIHsKLSAgICAgICAgU3RyaW5nIHdzZGxCaW5kaW5nVHlwZSA9IG51bGw7Ci0gICAgICAgIFN0cmluZyBzb2FwVHJhbnNwb3J0ID0gbnVsbDsKLSAgICAgICAgQmluZGluZyB3c2RsQmluZGluZyA9IGdldFdTRExCaW5kaW5nKCk7Ci0gICAgICAgIGlmICh3c2RsQmluZGluZyAhPSBudWxsKSB7Ci0gICAgICAgIAkKLSAgICAgICAgICAgIC8vIElmIGEgV1NETCBiaW5kaW5nIHdhcyBmb3VuZCwgd2UgbmVlZCB0byBmaW5kIHRoZSBwcm9wZXIgZXh0ZW5zaWJpbGl0eQotICAgICAgICAgICAgLy8gZWxlbWVudCBhbmQgcmV0dXJuIHRoZSBuYW1lc3BhY2UuICBUaGUgbmFtZXNwYWNlIGZvciB0aGUgYmluZGluZyBlbGVtZW50IHdpbGwgCi0gICAgICAgICAgICAvLyBkZXRlcm1pbmUgd2hldGhlciBpdCBpcyBTT0FQIDEuMSB2cy4gU09BUCAxLjIgdnMuIEhUVFAgKG9yIG90aGVyKS4gSWYgdGhlIG5hbWVzcGFjZSAKLSAgICAgICAgICAgIC8vIGluZGljYXRlcyBTT0FQIHdlIHRoZW4gbmVlZCB0byBkZXRlcm1pbmUgd2hhdCB0aGUgdHJhbnNwb3J0IGlzIChIVFRQIHZzLiBKTVMpCi0gICAgICAgICAgICAvLyBUT0RPOiBXaGF0IGRvIHdlIGRvIGlmIG5vIGV4dGVuc2liaWxpdHkgZWxlbWVudCBleGlzdHM/Ci0gICAgICAgICAgICBMaXN0PEV4dGVuc2liaWxpdHlFbGVtZW50PiBlbGVtZW50cyA9IHdzZGxCaW5kaW5nLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICAgICAgICAgICAgSXRlcmF0b3I8RXh0ZW5zaWJpbGl0eUVsZW1lbnQ+IGl0ciA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IGUgPSBpdHIubmV4dCgpOwotICAgICAgICAgICAgICAgIGlmIChqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQQmluZGluZy5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGUuZ2V0Q2xhc3MoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEJpbmRpbmcgc29hcEJuZCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBCaW5kaW5nKWU7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAvL3JlcHJlc2VudGF0aW9uOiB0aGlzIGlzIHNvYXA6YmluZGluZyA9IGVsZW1lbnRUeXBlIHdoZXJlIE5hbWVzcGFjZVVSSSBpcyAic29hcCIKLSAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHRyYW5zcG9ydCBpcyByZXByZXNlbnRlZCBieSB0aGUgJ3RyYW5zcG9ydCcgYXR0cmlidXRlIHdpdGhpbiB0aGlzIGJpbmRpbmcgZWxlbWVudAotICAgICAgICAgICAgICAgICAgICB3c2RsQmluZGluZ1R5cGUgPSBzb2FwQm5kLmdldEVsZW1lbnRUeXBlKCkuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgc29hcFRyYW5zcG9ydCA9IHNvYXBCbmQuZ2V0VHJhbnNwb3J0VVJJKCk7Ci0KLQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFNPQVAxMkJpbmRpbmcuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShlLmdldENsYXNzKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFNPQVAxMkJpbmRpbmcgc29hcEJuZCA9IChTT0FQMTJCaW5kaW5nKWU7Ci0gICAgICAgICAgICAgICAgICAgIHdzZGxCaW5kaW5nVHlwZSA9IHNvYXBCbmQuZ2V0RWxlbWVudFR5cGUoKS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICAgICAgc29hcFRyYW5zcG9ydCA9IHNvYXBCbmQuZ2V0VHJhbnNwb3J0VVJJKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoSFRUUEJpbmRpbmcuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShlLmdldENsYXNzKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEhUVFBCaW5kaW5nIGh0dHBCbmQgPSAoSFRUUEJpbmRpbmcpZTsKLSAgICAgICAgICAgICAgICAgICAgd3NkbEJpbmRpbmdUeXBlID0gaHR0cEJuZC5nZXRFbGVtZW50VHlwZSgpLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gY29udmVydCB0aGUgd3NkbC1iYXNlZCBTT0FQIGFuZCBIVFRQIG5hbWVzcGFjZSBpbnRvIHRoZSBleHBlY3RlZCBCaW5kaW5nIFR5cGUgZm9yIAotICAgICAgICAgICAgLy8gSFRUUCBvciBTT0FQQmluZGluZ3Mgd2l0aCB0aGUgYXBwcm9wcmlhdGUgdHJhbnNwb3J0IChIVFRQLCBKTVMsIGV0Yy4pCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHdoYXQgd2UncmUgYWN0dWFsbHkgcmV0dXJuaW5nIGlzIHRoZSBXU0RMIGJpbmRpbmcgdHlwZSB2YWx1ZSBjb252ZXRlZAotICAgICAgICAgICAgLy8gdG8gdGhlIGNvcnJlc3BvbmRpbmcgU09BUEJpbmRpbmcgb3IgSFRUUEJpbmRpbmcgdmFsdWUuICBXZSBhcmUgb3ZlcndpdGUgdGhlIAotICAgICAgICAgICAgLy8gd3NkbEJpbmRpbmdUeXBlIHdpdGggdGhhdCBjb252ZXJ0ZWQgSkFYV1MgYW5ub3RhdGlvbiBiaW5kaW5nIHR5cGUgdmFsdWUgYW5kCi0gICAgICAgICAgICAvLyByZXR1cm4gaXQuCi0gICAgICAgICAgICB3c2RsQmluZGluZ1R5cGUgPSBEZXNjcmlwdGlvblV0aWxzLm1hcEJpbmRpbmdUeXBlV3NkbFRvQW5ub3RhdGlvbih3c2RsQmluZGluZ1R5cGUsIHNvYXBUcmFuc3BvcnQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB3c2RsQmluZGluZ1R5cGU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gZ2V0QW5ub1dlYlNlcnZpY2VOYW1lKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRUYXJnZXROYW1lc3BhY2UoKSB7Ci0gICAgICAgIHJldHVybiBnZXRBbm5vV2ViU2VydmljZVRhcmdldE5hbWVzcGFjZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBQb3J0SW5mbyBnZXRQb3J0SW5mbygpIHsKLSAgICAgICAgaWYgKHBvcnRJbmZvID09IG51bGwpIHsKLSAgICAgICAgICAgIHBvcnRJbmZvID0gbmV3IFBvcnRJbmZvSW1wbChnZXRTZXJ2aWNlUU5hbWUoKSwgZ2V0UG9ydFFOYW1lKCksIGdldEJpbmRpbmdUeXBlKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwb3J0SW5mbzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDbGllbnRCaW5kaW5nSUQoU3RyaW5nIGNsaWVudEJpbmRpbmdJRCkgewotCi0gICAgICAgIGlmIChjbGllbnRCaW5kaW5nSUQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhpcy5jbGllbnRCaW5kaW5nSUQgPSBERUZBVUxUX0NMSUVOVF9CSU5ESU5HX0lEOwotICAgICAgICB9IGVsc2UgaWYgKHZhbGlkYXRlQ2xpZW50QmluZGluZ0lEKGNsaWVudEJpbmRpbmdJRCkpIHsKLSAgICAgICAgICAgIHRoaXMuY2xpZW50QmluZGluZ0lEID0gY2xpZW50QmluZGluZ0lEOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZ2V0TWVzc2FnZSgiYWRkUG9ydEVycjAiLCBnZXRQb3J0UU5hbWUoKS50b1N0cmluZygpKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gdmFsaWRhdGVDbGllbnRCaW5kaW5nSUQoU3RyaW5nIGJpbmRpbmdJZCkgewotICAgICAgICBib29sZWFuIGlzVmFsaWQgPSB0cnVlOwotICAgICAgICBpZiAoYmluZGluZ0lkICE9IG51bGwgJiYgIShiaW5kaW5nSWQuZXF1YWxzKFNPQVBCaW5kaW5nLlNPQVAxMUhUVFBfQklORElORykgfHwKLSAgICAgICAgICAgICAgICBiaW5kaW5nSWQuZXF1YWxzKGphdmF4LnhtbC53cy5odHRwLkhUVFBCaW5kaW5nLkhUVFBfQklORElORykgfHwKLSAgICAgICAgICAgICAgICBiaW5kaW5nSWQuZXF1YWxzKFNPQVBCaW5kaW5nLlNPQVAxMkhUVFBfQklORElORykgfHwKLSAgICAgICAgICAgICAgICBiaW5kaW5nSWQuZXF1YWxzKFNPQVBCaW5kaW5nLlNPQVAxMUhUVFBfTVRPTV9CSU5ESU5HKSB8fAotICAgICAgICAgICAgICAgIGJpbmRpbmdJZC5lcXVhbHMoU09BUEJpbmRpbmcuU09BUDEySFRUUF9NVE9NX0JJTkRJTkcpIHx8Ci0gICAgICAgICAgICAgICAgYmluZGluZ0lkLmVxdWFscyhNRFFDb25zdGFudHMuU09BUDExSk1TX0JJTkRJTkcpIHx8Ci0gICAgICAgICAgICAgICAgYmluZGluZ0lkLmVxdWFscyhNRFFDb25zdGFudHMuU09BUDEySk1TX0JJTkRJTkcpIHx8Ci0gICAgICAgICAgICAgICAgYmluZGluZ0lkLmVxdWFscyhNRFFDb25zdGFudHMuU09BUDExSk1TX01UT01fQklORElORykgfHwKLSAgICAgICAgICAgICAgICBiaW5kaW5nSWQuZXF1YWxzKE1EUUNvbnN0YW50cy5TT0FQMTJKTVNfTVRPTV9CSU5ESU5HKSkpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoImFkZFBvcnRFcnIwIiwgZ2V0UG9ydFFOYW1lKCkudG9TdHJpbmcoKSkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpc1ZhbGlkOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xpZW50QmluZGluZ0lEKCkgewotICAgICAgICBpZiAoY2xpZW50QmluZGluZ0lEID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChnZXRXU0RMRGVmaW5pdGlvbigpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjbGllbnRCaW5kaW5nSUQgPSBnZXRXU0RMQmluZGluZ1R5cGUoKTsKLSAgICAgICAgICAgICAgICBpZiAoY2xpZW50QmluZGluZ0lEID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY2xpZW50QmluZGluZ0lEID0gREVGQVVMVF9DTElFTlRfQklORElOR19JRDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGNsaWVudEJpbmRpbmdJRCA9IERFRkFVTFRfQ0xJRU5UX0JJTkRJTkdfSUQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNsaWVudEJpbmRpbmdJRDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRFbmRwb2ludEFkZHJlc3MoU3RyaW5nIGVuZHBvaW50QWRkcmVzcykgewotICAgICAgICAvLyBSRVZJRVc6IFNob3VsZCB0aGlzIGJlIGNhbGxlZCB3aGVuZXZlciBCaW5kaW5nUHJvdmlkZXIuRU5EUE9JTlRfQUREUkVTU19QUk9QRVJUWSBpcyBzZXQgYnkgdGhlIGNsaWVudD8KLSAgICAgICAgaWYgKCFEZXNjcmlwdGlvblV0aWxzLmlzRW1wdHkoZW5kcG9pbnRBZGRyZXNzKSkgewotICAgICAgICAgICAgdGhpcy5lbmRwb2ludEFkZHJlc3MgPSBlbmRwb2ludEFkZHJlc3M7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBTaW5jZSBhIHBvcnQgY2FuIGJlIGFkZGVkIHdpdGhvdXQgc2V0dGluZyBhbiBlbmRwb2ludCBhZGRyZXNzLCB0aGlzIGlzIG5vdCBhbiBlcnJvci4KLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkEgbnVsbCBvciBlbXB0eSBlbmRwb2ludCBhZGRyZXNzIHdhcyBhdHRlbXB0ZWQgdG8gYmUgc2V0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFRocm93YWJsZSgiU3RhY2sgVHJhY2ViYWNrIikpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRFbmRwb2ludEFkZHJlc3MoKSB7Ci0gICAgICAgIGlmIChlbmRwb2ludEFkZHJlc3MgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gSWYgdGhlIGVuZHBvaW50QWRkcmVzcyBoYXMgbm90IGJlZW4gc2V0IGV4cGxpY2l0bHkgYnkgYSBjYWxsIHRvIHNldEVuZHBvaW50QWRkcmVzcygpCi0gICAgICAgICAgICAvLyB0aGVuIHRyeSB0byBnZXQgaXQgZnJvbSB0aGUgV1NETAotICAgICAgICAgICAgZW5kcG9pbnRBZGRyZXNzID0gZ2V0V1NETFNPQVBBZGRyZXNzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVuZHBvaW50QWRkcmVzczsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIGtleSwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIGlmKHByb3BlcnRpZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotICAgICAgICB9Ci0gICAgICAgIHByb3BlcnRpZXMucHV0KGtleSwgdmFsdWUpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBrZXkpIHsKLSAgICAgICAgaWYocHJvcGVydGllcyAhPSBudWxsKSB7Ci0gICAgICAgICAgIHJldHVybiBwcm9wZXJ0aWVzLmdldChrZXkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgU09BUCBBZGRyZXNzIGZyb20gdGhlIFdTREwgZm9yIHRoaXMgcG9ydC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIFNPQVAgQWRkcmVzcyBmcm9tIHRoZSBXU0RMIGZvciB0aGlzIHBvcnQgb3IgbnVsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFdTRExTT0FQQWRkcmVzcygpIHsKLSAgICAgICAgaWYgKHdzZGxTT0FQQWRkcmVzcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBQb3J0IHdzZGxQb3J0ID0gZ2V0V1NETFBvcnQoKTsKLSAgICAgICAgICAgIGlmICh3c2RsUG9ydCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhlIHBvcnQgaXMgaW4gdGhlIFdTREwsIHNvIHNlZSBpZiBpdCBoYXMgYSBTT0FQIGFkZHJlc3MgZXh0ZW5zaWJpbGl0eSBlbGVtZW50IHNwZWNpZmllZC4KLSAgICAgICAgICAgICAgICBMaXN0IGV4dEVsZW1lbnRMaXN0ID0gd3NkbFBvcnQuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChPYmplY3QgbGlzdEVsZW1lbnQgOiBleHRFbGVtZW50TGlzdCkgewotICAgICAgICAgICAgICAgICAgICBFeHRlbnNpYmlsaXR5RWxlbWVudCBleHRFbGVtZW50ID0gKEV4dGVuc2liaWxpdHlFbGVtZW50KWxpc3RFbGVtZW50OwotICAgICAgICAgICAgICAgICAgICBpZiAoaXNTT0FQQWRkcmVzc0VsZW1lbnQoZXh0RWxlbWVudCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzb2FwQWRkcmVzcyA9IGdldFNPQVBBZGRyZXNzRnJvbUVsZW1lbnQoZXh0RWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIURlc2NyaXB0aW9uVXRpbHMuaXNFbXB0eShzb2FwQWRkcmVzcykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c2RsU09BUEFkZHJlc3MgPSBzb2FwQWRkcmVzczsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gd3NkbFNPQVBBZGRyZXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERldGVybWluZSBpZiB0aGUgV1NETCBFeHRlbnNpYmlsaXR5IGVsZW1lbnQgY29ycmVzcG9uZHMgdG8gdGhlIFNPQVAgQWRkcmVzcyBlbGVtZW50LgotICAgICAqCi0gICAgICogQHBhcmFtIGV4RWxlbWVudAotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBzdGF0aWMgYm9vbGVhbiBpc1NPQVBBZGRyZXNzRWxlbWVudChFeHRlbnNpYmlsaXR5RWxlbWVudCBleEVsZW1lbnQpIHsKLSAgICAgICAgYm9vbGVhbiBpc0FkZHJlc3MgPSBmYWxzZTsKLSAgICAgICAgaWYgKGV4RWxlbWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpc0FkZHJlc3MgPSAoU09BUF8xMV9BRERSRVNTX0VMRU1FTlQuZXF1YWxzKGV4RWxlbWVudC5nZXRFbGVtZW50VHlwZSgpKQotICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgICAgICAgICAgICAoU09BUF8xMl9BRERSRVNTX0VMRU1FTlQuZXF1YWxzKGV4RWxlbWVudC5nZXRFbGVtZW50VHlwZSgpKSkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpc0FkZHJlc3M7Ci0gICAgfQotCi0gICAgc3RhdGljIFN0cmluZyBnZXRTT0FQQWRkcmVzc0Zyb21FbGVtZW50KEV4dGVuc2liaWxpdHlFbGVtZW50IGV4dEVsZW1lbnQpIHsKLSAgICAgICAgU3RyaW5nIHJldHVybkFkZHJlc3MgPSBudWxsOwotCi0gICAgICAgIGlmIChleHRFbGVtZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChTT0FQXzExX0FERFJFU1NfRUxFTUVOVC5lcXVhbHMoZXh0RWxlbWVudC5nZXRFbGVtZW50VHlwZSgpKSkgewotICAgICAgICAgICAgICAgIHJldHVybkFkZHJlc3MgPSAoKFNPQVBBZGRyZXNzKWV4dEVsZW1lbnQpLmdldExvY2F0aW9uVVJJKCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKFNPQVBfMTJfQUREUkVTU19FTEVNRU5ULmVxdWFscyhleHRFbGVtZW50LmdldEVsZW1lbnRUeXBlKCkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuQWRkcmVzcyA9ICgoU09BUDEyQWRkcmVzcylleHRFbGVtZW50KS5nZXRMb2NhdGlvblVSSSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJldHVybkFkZHJlc3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VsZWN0cyBhIHBvcnQgdG8gdXNlIGluIHRoZSBjYXNlIHdoZXJlIGEgcG9ydFFOYW1lIHdhcyBub3Qgc3BlY2lmaWVkIGJ5IHRoZSBjbGllbnQgb24gdGhlCi0gICAgICogU2VydmljZS5nZXRQb3J0KENsYXNzKSBjYWxsLiAgSWYgV1NETCBpcyBwcmVzZW50LCB0aGVuIGFuIGFwcHJvcHJpYXRlIHBvcnQgaXMgbG9va2VkIGZvcgotICAgICAqIHVuZGVyIHRoZSBzZXJ2aWNlIGVsZW1lbnQsIGFuZCBhbiBleGNlcHRpb24gaXMgdGhyb3duIGlmIG5vbmUgY2FuIGJlIGZvdW5kLiAgSWYgV1NETCBpcyBub3QKLSAgICAgKiBwcmVzZW50LCB0aGVuIHRoZSBzZWxlY3RlZCBwb3J0IGlzIHNpbXBseSB0aGUgb25lIGRldGVybWluZWQgYnkgYW5ub3RhdGlvbnMuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIEEgUU5hbWUgcmVwcmVzZW50aW5nIHRoZSBwb3J0IHRoYXQgaXMgdG8gYmUgdXNlZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIFFOYW1lIHNlbGVjdFBvcnRUb1VzZSgpIHsKLSAgICAgICAgUU5hbWUgcG9ydFRvVXNlID0gbnVsbDsKLSAgICAgICAgLy8gSWYgV1NETCBTZXJ2aWNlIGZvciB0aGlzIHBvcnQgaXMgcHJlc2VudCwgdGhlbiB3ZSdsbCBmaW5kIGFuIGFwcHJvcHJpYXRlIHBvcnQgZGVmaW5lZCBpbiB0aGVyZSBhbmQgc2V0IAotICAgICAgICAvLyB0aGUgbmFtZSBhY2NvcmRpbmdseS4gIElmIG5vIFdTREwgaXMgcHJlc2VudCwgdGhlIHRoZSBQb3J0UU5hbWUgZ2V0dGVyIHdpbGwgdXNlIGFubm90YXRpb25zIHRvIHNldCB0aGUgdmFsdWUuCi0gICAgICAgIGlmIChnZXRXU0RMU2VydmljZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIHBvcnRUb1VzZSA9IHNlbGVjdFdTRExQb3J0VG9Vc2UoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIE5vIFdTREwsIHNvIHRoZSBwb3J0IHRvIHVzZSBpcyB0aGUgb25lIGRlZmluZWQgYnkgdGhlIGFubm90YXRpb25zLgotICAgICAgICAgICAgcG9ydFRvVXNlID0gZ2V0UG9ydFFOYW1lKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHBvcnRUb1VzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMb29rIHRocm91Z2ggdGhlIFdTREwgU2VydmljZSBmb3IgYSBwb3J0IHRoYXQgc2hvdWxkIGJlIHVzZWQuICBJZiBub25lIGNhbiBiZSBmb3VuZCwgdGhlbgotICAgICAqIHRocm93IGFuIGV4Y2VwdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSB3c2RsU2VydmljZQotICAgICAqIEByZXR1cm4gQSBRTmFtZSByZXByZXNlbnRpbmcgdGhlIHBvcnQgZnJvbSB0aGUgV1NETCB0aGF0IHNob3VsZCBiZSB1c2VkLgotICAgICAqLwotICAgIHByaXZhdGUgUU5hbWUgc2VsZWN0V1NETFBvcnRUb1VzZSgpIHsKLSAgICAgICAgUU5hbWUgd3NkbFBvcnRUb1VzZSA9IG51bGw7Ci0KLSAgICAgICAgLy8gVG8gc2VsZWN0IHdoaWNoIFdTREwgUG9ydCB0byB1c2UsIHdlIGRvIHRoZSBmb2xsb3dpbmcKLSAgICAgICAgLy8gMSkgRmluZCB0aGUgc3Vic2V0IG9mIGFsbCBwb3J0cyB1bmRlciB0aGUgc2VydmljZSB0aGF0IHVzZSB0aGUgUG9ydFR5cGUgcmVwcmVzZW50ZWQgYnkgdGhlIFNFSQotICAgICAgICAvLyAyKSBGcm9tIHRoZSBzdWJzZXQgaW4gKDEpIGZpbmQgYWxsIHRob3NlIHBvcnRzIHRoYXQgc3BlY2lmeSBhIFNPQVAgQWRkcmVzcwotICAgICAgICAvLyAzKSBVc2UgdGhlIGZpcnN0IHBvcnQgZnJvbSAoMikKLQotICAgICAgICAvLyBQZXIgSlNSLTE4MSwgCi0gICAgICAgIC8vIC0gVGhlIHBvcnRUeXBlIG5hbWUgY29ycmVzcG9uZHMgdG8gdGhlIFdlYlNlcnZpY2UubmFtZSBhbm5vdGF0aW9uIHZhbHVlLCB3aGljaCBpcwotICAgICAgICAvLyAgIHJldHVybmVkIGJ5IGdldE5hbWUoKQotICAgICAgICAvLyAtIFRoZSBwb3J0VHlwZSBuYW1lc3BhY2UgY29ycmVzcG9uZHMgdG8gdGhlIFdlYlNlcnZpY2UudGFyZ2V0TmFtZXNwYWNlIGFubm90YXRpb24sIHdoaWNoCi0gICAgICAgIC8vICAgaXMgcmV0dXJuZWQgYnkgZ2V0VGFyZ2V0TmFtZXNwYWNlKCkKLSAgICAgICAgU3RyaW5nIHBvcnRUeXBlTFAgPSBnZXROYW1lKCk7Ci0gICAgICAgIFN0cmluZyBwb3J0VHlwZVROUyA9IGdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgICBRTmFtZSBwb3J0VHlwZVFOID0gbmV3IFFOYW1lKHBvcnRUeXBlVE5TLCBwb3J0VHlwZUxQKTsKLQotICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb25XU0RMIHNlcnZpY2VEZXNjV1NETCA9IChTZXJ2aWNlRGVzY3JpcHRpb25XU0RMKWdldFNlcnZpY2VEZXNjcmlwdGlvbigpOwotCi0gICAgICAgIExpc3Q8UG9ydD4gd3NkbFBvcnRzVXNpbmdQb3J0VHlwZSA9IHNlcnZpY2VEZXNjV1NETC5nZXRXU0RMUG9ydHNVc2luZ1BvcnRUeXBlKHBvcnRUeXBlUU4pOwotICAgICAgICBMaXN0PFBvcnQ+IHdzZGxQb3J0c1VzaW5nU09BUEFkZHJlc3NlcyA9Ci0gICAgICAgICAgICAgICAgc2VydmljZURlc2NXU0RMLmdldFdTRExQb3J0c1VzaW5nU09BUEFkZHJlc3Mod3NkbFBvcnRzVXNpbmdQb3J0VHlwZSk7Ci0gICAgICAgIGlmICh3c2RsUG9ydHNVc2luZ1NPQVBBZGRyZXNzZXMgIT0gbnVsbCAmJiAhd3NkbFBvcnRzVXNpbmdTT0FQQWRkcmVzc2VzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgLy8gV2UgcmV0dXJuIHRoZSBmaXJzdCBwb3J0IHRoYXQgdXNlcyB0aGUgcGFydGljbHVhciBQb3J0VHlwZSBhbmQgaGFzIGEgU09BUCBhZGRyZXNzLgotICAgICAgICAgICAgLy8gSE9XRVZFUiwgdGhhdCBpcyBub3QgbmVjZXNzYXJpbHkgdGhlIGZpcnN0IG9uZSBpbiB0aGUgV1NETCB0aGF0IG1lZXRzIHRoYXQgY3JpdGVyaWEhICAKLSAgICAgICAgICAgIC8vIFRoZSBwcm9ibGVtIGlzIHRoYXQgV1NETDRKIFNlcnZpY2UuZ2V0UG9ydHMoKSwgd2hpY2ggaXMgdXNlZCB0byBnZXQgYSBNYXAgb2YgcG9ydHMgdW5kZXIgdGhlIHNlcnZpY2UgCi0gICAgICAgICAgICAvLyBET0VTIE5PVCByZXR1cm4gdGhlIHBvcnRzIGluIHRoZSBvcmRlciB0aGV5IGFyZSBkZWZpbmVkIGluIHRoZSBXU0RMLiAgCi0gICAgICAgICAgICAvLyBUaGVyZWZvcmUsIHdlIGNhbid0IG5lY2Vzc2FyaWx5IHByZWRpY3Qgd2hpY2ggb25lIHdlJ2xsIGdldCBiYWNrIGFzIHRoZSAiZmlyc3QiIG9uZSBpbiB0aGUgY29sbGVjdGlvbi4KLSAgICAgICAgICAgIC8vIFJFVklFVzogTm90ZSB0aGUgYWJvdmUgY29tbWVudDsgaXMgdGhlcmUgYW55dGhpbmcgbW9yZSBwcmVkaWN0aWJsZSBhbmQgZGV0ZXJtaW5zdGljIHdlIGNhbiBkbz8KLSAgICAgICAgICAgIFBvcnQgcG9ydFRvVXNlID0gKFBvcnQpd3NkbFBvcnRzVXNpbmdTT0FQQWRkcmVzc2VzLnRvQXJyYXkoKVswXTsKLSAgICAgICAgICAgIFN0cmluZyBwb3J0TG9jYWxQYXJ0ID0gcG9ydFRvVXNlLmdldE5hbWUoKTsKLSAgICAgICAgICAgIFN0cmluZyBwb3J0TmFtZXNwYWNlID0gc2VydmljZURlc2NXU0RMLmdldFdTRExTZXJ2aWNlKCkuZ2V0UU5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgIHdzZGxQb3J0VG9Vc2UgPSBuZXcgUU5hbWUocG9ydE5hbWVzcGFjZSwgcG9ydExvY2FsUGFydCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gd3NkbFBvcnRUb1VzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFdzZGxDb21wb3NpdGUgZ2VuZXJhdGVXU0RMKERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBkYmMpIHsKLQotICAgICAgICBXc2RsQ29tcG9zaXRlIHdzZGxDb21wb3NpdGUgPSBudWxsOwotICAgICAgICBEZWZpbml0aW9uIGRlZm4gPSBkYmMuZ2V0V3NkbERlZmluaXRpb24oZ2V0U2VydmljZVFOYW1lKCkpOwotICAgICAgICBpZihkZWZuID09IG51bGwpIHsKLSAgICAgICAgICAgIGRlZm4gPSBkYmMuZ2V0V3NkbERlZmluaXRpb24oKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZGVmbiA9PSBudWxsIHx8ICFpc0F4aXNTZXJ2aWNlQnVpbHRGcm9tV1NETCkgewotCi0gICAgICAgICAgICAvL0ludm9rZSB0aGUgY2FsbGJhY2sgZm9yIGdlbmVyYXRpbmcgdGhlIHdzZGwKLSAgICAgICAgICAgIGlmIChkYmMuZ2V0Q3VzdG9tV3NkbEdlbmVyYXRvcigpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgaW1wbE5hbWUgPSBudWxsOwotICAgICAgICAgICAgICAgIGlmIChheGlzU2VydmljZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGltcGxOYW1lID0gRGVzY3JpcHRpb25VdGlscy5qYXZpZnlDbGFzc05hbWUoY29tcG9zaXRlLmdldENsYXNzTmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpbXBsTmFtZSA9IChTdHJpbmcpYXhpc1NlcnZpY2UuZ2V0UGFyYW1ldGVyVmFsdWUoTURRQ29uc3RhbnRzLlNFUlZJQ0VfQ0xBU1MpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB3c2RsQ29tcG9zaXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRiYy5nZXRDdXN0b21Xc2RsR2VuZXJhdG9yKCkuZ2VuZXJhdGVXc2RsKGltcGxOYW1lLCB0aGlzKTsKLQotICAgICAgICAgICAgICAgIGlmICh3c2RsQ29tcG9zaXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYod3NkbENvbXBvc2l0ZS5nZXRXc2RsRmlsZU5hbWUoKSA9PSBudWxsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIi5lcXVhbHMod3NkbENvbXBvc2l0ZS5nZXRXc2RsRmlsZU5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdzZGxDb21wb3NpdGUuc2V0V3NkbEZpbGVOYW1lKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMuZ2V0QW5ub1dlYlNlcnZpY2VTZXJ2aWNlTmFtZSgpICsgIi53c2RsIikudG9Mb3dlckNhc2UoKSk7IAotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBEZWZpbml0aW9uIHdzZGxEZWYgPSB3c2RsQ29tcG9zaXRlLmdldFJvb3RXc2RsRGVmaW5pdGlvbigpOwotCi0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBjYyA9IGRiYy5nZXRDb25maWd1cmF0aW9uQ29udGV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgV1NETDRKV3JhcHBlciB3c2RsNGpXcmFwcGVyID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NkbDRqV3JhcHBlciA9IG5ldyBXU0RMNEpXcmFwcGVyKGRiYy5nZXRXc2RsVVJMKCksIHdzZGxEZWYsIGNjKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NkbDRqV3JhcHBlciA9IG5ldyBXU0RMNEpXcmFwcGVyKGRiYy5nZXRXc2RsVVJMKCksIHdzZGxEZWYsIHRydWUsIDIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U2VydmljZURlc2NyaXB0aW9uSW1wbCgpLnNldEdlbmVyYXRlZFdzZGxXcmFwcGVyKHdzZGw0aldyYXBwZXIpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJnZW5lcmF0ZVdTRExFcnIiKSxlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFJFVklFVzpEZXRlcm1pbmUgaWYgd2Ugc2hvdWxkIGFsd2F5cyB0aHJvdyBhbiBleGNlcHRpb24gb24gdGhpcywgb3IgYXQgdGhpcyBwb2ludAotICAgICAgICAgICAgICAgICAgICAvL3Rocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oIkVuZHBvaW50RGVzY3JpcHRpb25JbXBsOiBVbmFibGUgdG8gZmluZCBjdXN0b20gV1NETCBnZW5lcmF0b3IiKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgY3VzdG9tIFdTREwgZ2VuZXJhdG9yIHJldHVybmVkIG51bGwsIHNvIG5vIGdlbmVyYXRlZCBXU0RMIGlzIGF2YWlsYWJsZSIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIFJFVklFVzogVGhpcyB1c2VkIHRvIHRocm93IGFuIGV4Y2VwdGlvbiwgYnV0IGl0IHNlZW1zIHdlIHNob3VsZG4ndCByZXF1aXJlCi0gICAgICAgICAgICAgICAgLy8gYSB3c2RsIGdlbmVyYXRvciBiZSBwcm92aWRlZC4KLS8vICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oIkVuZHBvaW50RGVzY3JpcHRpb25JbXBsOiBVbmFibGUgdG8gZmluZCBjdXN0b20gV1NETCBnZW5lcmF0b3IiKTsKLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJObyBjdXN0b20gV1NETCBnZW5lcmF0b3Igd2FzIHN1cHBsaWVkLCBzbyBXU0RMIGNhbiBub3QgYmUgZ2VuZXJhdGVkIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB3c2RsQ29tcG9zaXRlOwotICAgIH0KLSAgICAKLSAgICBMaXN0PEN1c3RvbUFubm90YXRpb25JbnN0YW5jZT4gZ2V0Q3VzdG9tQW5ub3RhdGlvbkluc3RhbmNlcygpIHsKLSAgICAgICAgcmV0dXJuIGN1c3RvbUFubm90YXRpb25zOwotICAgIH0KLSAgICAKLSAgICBDdXN0b21Bbm5vdGF0aW9uUHJvY2Vzc29yIGdldEN1c3RvbUFubm90YXRpb25Qcm9jZXNzb3IoU3RyaW5nIGFubm90YXRpb25JbnN0YW5jZUNsYXNzTmFtZSkgewotICAgICAgICByZXR1cm4gY3VzdG9tQW5ub3RhdGlvblByb2Nlc3NvcnMgIT0gbnVsbCA/IAotICAgICAgICAgICAgICAgIGN1c3RvbUFubm90YXRpb25Qcm9jZXNzb3JzLmdldChhbm5vdGF0aW9uSW5zdGFuY2VDbGFzc05hbWUpIDogbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBnZXREZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUoKSB7Ci0gICAgICAgIHJldHVybiBjb21wb3NpdGU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIG5ld2xpbmUgPSAiXG4iOwotICAgICAgICBmaW5hbCBTdHJpbmcgc2FtZWxpbmUgPSAiOyAiOwotICAgICAgICBTdHJpbmdCdWZmZXIgc3RyaW5nID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZChzdXBlci50b1N0cmluZygpKTsKLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQobmV3bGluZSk7Ci0gICAgICAgICAgICBzdHJpbmcuYXBwZW5kKCJOYW1lOiAiICsgZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQoc2FtZWxpbmUpOwotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZCgiRW5kcG9pbnQgQWRkcmVzczogIiArIGdldEVuZHBvaW50QWRkcmVzcygpKTsKLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICBzdHJpbmcuYXBwZW5kKG5ld2xpbmUpOwotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZCgiU2VydmljZVFOYW1lOiAiICsgZ2V0U2VydmljZVFOYW1lKCkpOwotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZChzYW1lbGluZSk7Ci0gICAgICAgICAgICBzdHJpbmcuYXBwZW5kKCJQb3J0UU5hbWU6ICIgKyBnZXRQb3J0UU5hbWUoKSk7Ci0gICAgICAgICAgICBzdHJpbmcuYXBwZW5kKHNhbWVsaW5lKTsKLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQoIlRhcmdldE5hbWVzcGFjZTogIiArIGdldFRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICBzdHJpbmcuYXBwZW5kKG5ld2xpbmUpOwotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZCgiU2VydmljZSBNb2RlOiAiICsgZ2V0U2VydmljZU1vZGUoKSk7Ci0gICAgICAgICAgICBzdHJpbmcuYXBwZW5kKHNhbWVsaW5lKTsKLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQoIkJpbmRpbmcgVHlwZTogIiArIGdldEJpbmRpbmdUeXBlKCkpOwotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZChzYW1lbGluZSk7Ci0gICAgICAgICAgICBzdHJpbmcuYXBwZW5kKCJDbGllbnQgQmluZGluZyBUeXBlOiAiICsgZ2V0Q2xpZW50QmluZGluZ0lEKCkpOwotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQobmV3bGluZSk7Ci0gICAgICAgICAgICBzdHJpbmcuYXBwZW5kKCJJcyBwcm92aWRlci1iYXNlZDogIiArIChpc1Byb3ZpZGVyQmFzZWQoKSA9PSB0cnVlKSk7Ci0gICAgICAgICAgICBzdHJpbmcuYXBwZW5kKHNhbWVsaW5lKTsKLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQoIklzIHByb3h5LWJhc2VkOiAiICsgKGlzRW5kcG9pbnRCYXNlZCgpID09IHRydWUpKTsKLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQoc2FtZWxpbmUpOwotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZCgiSXMgV1NETCBmdWxseSBzcGVjaWZpZWQ6ICIgKyAoaXNXU0RMRnVsbHlTcGVjaWZpZWQoKSA9PSB0cnVlKSk7Ci0gICAgICAgICAgICAvLwotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZChuZXdsaW5lKTsKLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQoIkF4aXNTZXJ2aWNlOiAiICsgZ2V0QXhpc1NlcnZpY2UoKSk7Ci0gICAgICAgICAgICAvLwotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZChuZXdsaW5lKTsKLSAgICAgICAgICAgIEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24gZW5kcG9pbnRJbnRlcmZhY2VEZXNjID0gZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbigpOwotICAgICAgICAgICAgaWYgKGVuZHBvaW50SW50ZXJmYWNlRGVzYyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc3RyaW5nLmFwcGVuZCgiRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbjogIiArIGVuZHBvaW50SW50ZXJmYWNlRGVzYy50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc3RyaW5nLmFwcGVuZCgiRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiBpcyBudWxsLiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkgewotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZChuZXdsaW5lKTsKLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQoIkNvbXBsZXRlIGRlYnVnIGluZm9ybWF0aW9uIG5vdCBjdXJyZW50bHkgYXZhaWxhYmxlIGZvciAiICsKLSAgICAgICAgICAgICAgICAgICAgIkVuZHBvaW50RGVzY3JpcHRpb24iKTsKLSAgICAgICAgICAgIHJldHVybiBzdHJpbmcudG9TdHJpbmcoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RyaW5nLnRvU3RyaW5nKCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEdldCBhbiBhbm5vdGF0aW9uLiAgVGhpcyBpcyB3cmFwcGVyZWQgdG8gYXZvaWQgYSBKYXZhMlNlY3VyaXR5IHZpb2xhdGlvbi4KLSAgICAgKiBAcGFyYW0gY2xzIENsYXNzIHRoYXQgY29udGFpbnMgYW5ub3RhdGlvbiAKLSAgICAgKiBAcGFyYW0gYW5ub3RhdGlvbiBDbGFzcyBvZiByZXF1cmVzdGVkIEFubm90YXRpb24KLSAgICAgKiBAcmV0dXJuIGFubm90YXRpb24gb3IgbnVsbAotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbihmaW5hbCBDbGFzcyBjbHMsIGZpbmFsIENsYXNzIGFubm90YXRpb24pIHsKLSAgICAgICAgcmV0dXJuIChBbm5vdGF0aW9uKSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEFjdGlvbigpIHsKLSAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgewotICAgICAgICAgICAgICAgIHJldHVybiBjbHMuZ2V0QW5ub3RhdGlvbihhbm5vdGF0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBjbGFzcyBmb3IgdGhpcyBuYW1lCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIENsYXNzCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3MgZm9yTmFtZShmaW5hbCBTdHJpbmcgY2xhc3NOYW1lLCBmaW5hbCBib29sZWFuIGluaXRpYWxpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzTG9hZGVyIGNsYXNzbG9hZGVyKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIENsYXNzIGNsID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNsID0gKENsYXNzKSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgKLSAgICAgICAgICAgICAgICAgICAgbmV3IFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUsIGluaXRpYWxpemUsIGNsYXNzbG9hZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgKTsKLSAgICAgICAgfSBjYXRjaCAoUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkV4Y2VwdGlvbiB0aHJvd24gZnJvbSBBY2Nlc3NDb250cm9sbGVyOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhyb3cgKENsYXNzTm90Rm91bmRFeGNlcHRpb24pIGUuZ2V0RXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gY2w7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3NMb2FkZXIgZ2V0Q29udGV4dENsYXNzTG9hZGVyKGZpbmFsIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKSB7Ci0gICAgICAgIENsYXNzTG9hZGVyIGNsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY2wgPSAoQ2xhc3NMb2FkZXIpIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAotICAgICAgICAgICAgICAgICAgICBuZXcgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjbGFzc0xvYWRlciAhPSBudWxsID8gY2xhc3NMb2FkZXIgOiBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICApOwotICAgICAgICB9IGNhdGNoIChQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiRXhjZXB0aW9uIHRocm93biBmcm9tIEFjY2Vzc0NvbnRyb2xsZXI6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGUuZ2V0RXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGNsOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGlzIHdpbGwgdXBkYXRlIG9yIHNldCB0aGUgcGFyYW1ldGVyIG9uIHRoZSBBeGlzU2VydmljZSB0aGF0IHJlcHJlc2VudHMgdGhlCi0gICAgICogdmFsdWUgb2YgdGhlIEBXZWJTZXJ2aWNlLm5hbWUgYXR0cmlidXRlLiBUaGlzIGlzIG5lZWRlZCBzaW5jZSB0aGUgQFdlYlNlcnZpY2UubmFtZQotICAgICAqIHZhbHVlIG1heSBub3QgYmUga25vd24gdW50aWwgdGhlIEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24gaXMgY3JlYXRlZCBmb3IKLSAgICAgKiB0aGUgZXhwbGljaXRseSBkZWZpbmVkIFNFSS4KLSAgICAgKi8KLSAgICB2b2lkIHVwZGF0ZVdlYlNlcnZpY2VOYW1lUGFyYW1ldGVyKFN0cmluZyBuZXdOYW1lLCBBeGlzU2VydmljZSBzZXJ2aWNlKSB7Ci0gICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIlNldHRpbmcgQFdlYlNlcnZpY2UubmFtZSB2YWx1ZSBvbiB0aGUgIiArIHNlcnZpY2UuZ2V0TmFtZSgpICsgCi0gICAgICAgICAgICAgICAgICAgICAgIiBBeGlzU2VydmljZSB0bzogIiArIG5ld05hbWUpOwotICAgICAgICB9Ci0gICAgICAgIFBhcmFtZXRlciBwYXJhbSA9IHNlcnZpY2UuZ2V0UGFyYW1ldGVyKE1EUUNvbnN0YW50cy5XU0RMX1BPUlRUWVBFX05BTUUpOwotICAgICAgICBpZihwYXJhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwYXJhbS5zZXRWYWx1ZShuZXdOYW1lKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHBhcmFtID0gbmV3IFBhcmFtZXRlcigpOwotICAgICAgICAgICAgcGFyYW0uc2V0TmFtZShNRFFDb25zdGFudHMuV1NETF9QT1JUVFlQRV9OQU1FKTsKLSAgICAgICAgICAgIHBhcmFtLnNldFZhbHVlKG5ld05hbWUpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgc2VydmljZS5hZGRQYXJhbWV0ZXIocGFyYW0pOyAgCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoQXhpc0ZhdWx0IGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoInNldHVwQXhpc1NlcnZpY2VFcnIyIiksZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgbG9uZyBjdXJyZW50VW5pcXVlSUQgPSAwOwotICAgIHByaXZhdGUgbG9uZyB1bmlxdWVJRCgpIHsKLSAgICAgICAgaWYgKGN1cnJlbnRVbmlxdWVJRCA9PSAwKSB7Ci0gICAgICAgICAgICBjdXJyZW50VW5pcXVlSUQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY3VycmVudFVuaXF1ZUlEKys7Ci0gICAgfQotICAgICAgICAKLSAgICAvKioKLSAgICAgKiBSZWxlYXNlIHRoZSBBeGlzU2VydmljZSBvYmplY3RzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIEVuZHBvaW50RGVzY3JpcHRpb24uICBOb3RlIHRoYXQKLSAgICAgKiB0aGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBieSB0aGUgU2VydmljZURlc2NyaXB0aW9uIHRoYXQgb3ducyB0aGlzIEVuZHBvaW50RGVzY3JpdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29uZmlndXJhdGlvbkNvbnRleHQgIFRoZSBBeGlzMiBDb25maWd1cmF0aW9uQ29udGV4dCBob2xkaW5nIHRoZSBBeGlzQ29uZmlndXJhdGlvbgotICAgICAqIGZyb20gd2hpY2ggdGhlIEF4aXNTZXJ2aWNlcyBzaG91bGQgYmUgcmVtb3ZlZC4KLSAgICAgKi8KLSAgICB2b2lkIHJlbGVhc2VSZXNvdXJjZXMoQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlndXJhdGlvbkNvbnRleHQpIHsKLSAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb25Db250ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIEF4aXNDb25maWd1cmF0aW9uIGF4aXNDb25maWcgPSBjb25maWd1cmF0aW9uQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpOwotICAgICAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UgPSBnZXRBeGlzU2VydmljZSgpOwotICAgICAgICAgICAgQXhpc1NlcnZpY2VHcm91cCBheGlzU2VydmljZUdyb3VwID0gYXhpc1NlcnZpY2UuZ2V0QXhpc1NlcnZpY2VHcm91cCgpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBheGlzQ29uZmlnLnJlbW92ZVNlcnZpY2VHcm91cChheGlzU2VydmljZUdyb3VwLmdldFNlcnZpY2VHcm91cE5hbWUoKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgZSkgewotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkVuZHBvaW50RGVzY3JpcHRpb25JbXBsIHJlbGVhc2UgcmVzb3VyY2VzIGNhdWdodCBleGNlcHRpb24gd2hpY2ggaXQgaXMgaWdub3JpbmciLCBlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vaW1wbC9FbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uSW1wbC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vaW1wbC9FbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTBlMzBhLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2ltcGwvRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwODkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uaW1wbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5FeGNlcHRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRW5kcG9pbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5FbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uSmF2YTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb25XU0RMOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uT3BlcmF0aW9uRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5TZXJ2aWNlRGVzY3JpcHRpb25XU0RMOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5EZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLk1EUUNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5pMThuLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7Ci1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmc7Ci1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuUG9ydFR5cGU7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqIEBzZWUgLi4vRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiAqLwotY2xhc3MgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbkltcGwKLSAgICAgICAgaW1wbGVtZW50cyBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uLCBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uSmF2YSwKLSAgICAgICAgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbldTREwgewotICAgIHByaXZhdGUgRW5kcG9pbnREZXNjcmlwdGlvbkltcGwgcGFyZW50RW5kcG9pbnREZXNjcmlwdGlvbjsKLSAgICBwcml2YXRlIEFycmF5TGlzdDxPcGVyYXRpb25EZXNjcmlwdGlvbj4gb3BlcmF0aW9uRGVzY3JpcHRpb25zID0KLSAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8T3BlcmF0aW9uRGVzY3JpcHRpb24+KCk7Ci0gICAgcHJpdmF0ZSBNYXA8UU5hbWUsIExpc3Q8T3BlcmF0aW9uRGVzY3JpcHRpb24+PiBkaXNwYXRjaGFibGVPcGVyYXRpb25zOwotICAgIHByaXZhdGUgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIGRiYzsKLQotICAgIC8vTG9nZ2luZyBzZXR1cAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uSW1wbC5jbGFzcyk7Ci0KLSAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgLy8gQU5OT1RBVElPTiByZWxhdGVkIGluZm9ybWF0aW9uCi0gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gICAgLy8gQU5OT1RBVElPTjogQFdlYlNlcnZpY2UKLSAgICBwcml2YXRlIFdlYlNlcnZpY2Ugd2ViU2VydmljZUFubm90YXRpb247Ci0gICAgcHJpdmF0ZSBTdHJpbmcgd2ViU2VydmljZVRhcmdldE5hbWVzcGFjZTsKLSAgICBwcml2YXRlIFN0cmluZyB3ZWJTZXJ2aWNlX05hbWU7Ci0KLQotICAgIC8vIEFOTk9UQVRJT046IEBTT0FQQmluZGluZwotICAgIC8vIE5vdGUgdGhpcyBpcyB0aGUgVHlwZS1sZXZlbCBhbm5vdGF0aW9uLiAgU2VlIE9wZXJhdGlvbkRlc2NyaXB0aW9uIGZvciB0aGUgTWV0aG9kLWxldmVsIGFubm90YXRpb24KLSAgICBwcml2YXRlIFNPQVBCaW5kaW5nIHNvYXBCaW5kaW5nQW5ub3RhdGlvbjsKLSAgICBwcml2YXRlIGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlN0eWxlIHNvYXBCaW5kaW5nU3R5bGU7Ci0gICAgLy8gRGVmYXVsdCB2YWx1ZSBwZXIgSlNSLTE4MSBNUiBTZWMgNC43ICJBbm5vdGF0aW9uOiBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZyIgcGcgMjgKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlN0eWxlIFNPQVBCaW5kaW5nX1N0eWxlX0RFRkFVTFQgPQotICAgICAgICAgICAgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuU3R5bGUuRE9DVU1FTlQ7Ci0gICAgcHJpdmF0ZSBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5Vc2Ugc29hcEJpbmRpbmdVc2U7Ci0gICAgLy8gRGVmYXVsdCB2YWx1ZSBwZXIgSlNSLTE4MSBNUiBTZWMgNC43ICJBbm5vdGF0aW9uOiBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZyIgcGcgMjgKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlVzZSBTT0FQQmluZGluZ19Vc2VfREVGQVVMVCA9Ci0gICAgICAgICAgICBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5Vc2UuTElURVJBTDsKLSAgICBwcml2YXRlIGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlBhcmFtZXRlclN0eWxlIHNvYXBQYXJhbWV0ZXJTdHlsZTsKLSAgICAvLyBEZWZhdWx0IHZhbHVlIHBlciBKU1ItMTgxIE1SIFNlYyA0LjcgIkFubm90YXRpb246IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nIiBwZyAyOAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuUGFyYW1ldGVyU3R5bGUgU09BUEJpbmRpbmdfUGFyYW1ldGVyU3R5bGVfREVGQVVMVCA9Ci0gICAgICAgICAgICBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5QYXJhbWV0ZXJTdHlsZS5XUkFQUEVEOwotCi0gICAgLyoqCi0gICAgICogQWRkIHRoZSBvcGVyYXRpb25EZXNjcmlwdGlvbiB0byB0aGUgbGlzdCBvZiBvcGVyYXRpb25zLiAgTm90ZSB0aGF0IHdlIGNhbiBub3QgY3JlYXRlIHRoZQotICAgICAqIGxpc3Qgb2YgZGlzcGF0Y2hhYmxlIG9wZXJhdGlvbnMgYXQgdGhpcyBwb2ludHMuCi0gICAgICogQHNlZSAjaW5pdGlhbGl6ZURpc3BhdGNoYWJsZU9wZXJhdGlvbnNMaXN0KCkKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gb3BlcmF0aW9uIFRoZSBvcGVyYXRpb24gZGVzY3JpcHRpb24gdG8gYWRkIHRvIHRoaXMgZW5kcG9pbnQgaW50ZXJmYWNlCi0gICAgICovCi0gICAgdm9pZCBhZGRPcGVyYXRpb24oT3BlcmF0aW9uRGVzY3JpcHRpb24gb3BlcmF0aW9uKSB7Ci0gICAgICAgIG9wZXJhdGlvbkRlc2NyaXB0aW9ucy5hZGQob3BlcmF0aW9uKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3QgYSBzZXJ2aWNlIHJlcXVlc3RlciAoYWthIGNsaWVudC1zaWRlKSBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uIGZvciB0aGUKLSAgICAgKiBnaXZlbiBTRUkgY2xhc3MuICBUaGlzIGNvbnN0cnVjdG9yIGlzIHVzZWQgaWYgaGllcmFjaHkgaXMgYmVpbmcgYnVpbHQgZnVsbHkgZnJvbSBhbm5vdGF0aW9ucwotICAgICAqIGFuZCBub3QgV1NETC4KLSAgICAgKiBAcGFyYW0gc2VpCi0gICAgICogQHBhcmFtIHBhcmVudAotICAgICAqLwotICAgIEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb25JbXBsKENsYXNzIHNlaSwgRW5kcG9pbnREZXNjcmlwdGlvbkltcGwgcGFyZW50KSB7Ci0gICAgICAgIHBhcmVudEVuZHBvaW50RGVzY3JpcHRpb24gPSBwYXJlbnQ7Ci0gICAgICAgIGRiYyA9IG5ldyBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUoKTsKLSAgICAgICAgZGJjLnNldENvcnJlc3BvbmRpbmdDbGFzcyhzZWkpOwotCi0gICAgICAgIC8vIFBlciBKU1ItMTgxIGFsbCBtZXRob2RzIG9uIHRoZSBTRUkgYXJlIG1hcHBlZCB0byBvcGVyYXRpb25zIHJlZ2FyZGxlc3MKLSAgICAgICAgLy8gb2Ygd2hldGhlciB0aGV5IGluY2x1ZGUgYW4gQFdlYk1ldGhvZCBhbm5vdGF0aW9uLiAgVGhhdCBhbm5vdGF0aW9uIG1heQotICAgICAgICAvLyBiZSBwcmVzZW50IHRvIGN1c3RvbWl6ZSB0aGUgbWFwcGluZywgYnV0IGlzIG5vdCByZXF1aXJlZCAocDE0KQotICAgICAgICBmb3IgKE1ldGhvZCBtZXRob2QgOiBnZXRTRUlNZXRob2RzKGRiYy5nZXRDb3JyZXNwb25kaW5nQ2xhc3MoKSkpIHsKLSAgICAgICAgICAgIE9wZXJhdGlvbkRlc2NyaXB0aW9uIG9wZXJhdGlvbiA9IG5ldyBPcGVyYXRpb25EZXNjcmlwdGlvbkltcGwobWV0aG9kLCB0aGlzKTsKLSAgICAgICAgICAgIGFkZE9wZXJhdGlvbihvcGVyYXRpb24pOwotICAgICAgICB9IAotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdCBhIHNlcnZpY2UgcmVxdWVzdGVyIChha2EgY2xpZW50LXNpZGUpIEVuZHBvaW50SW50ZXJmYWNlRGVzY3JwdGlvbiBmb3IKLSAgICAgKiBhbiBTRUkgcmVwcmVzZW50ZWQgYnkgYW4gQXhpc1NlcnZpY2UuICBUaGlzIGNvbnN0cnVjdG9yIGlzIHVzZWQgaWYgdGhlIGhpZXJhY2h5IGlzCi0gICAgICogYmVpbmcgYnVpbHQgZnVsbHkgZnJvbSBXU0RMLiAgVGhlIEF4aXNTZXJ2aWNlIGFuZCB1bmRlcmx5aW5nIEF4aXNPcGVyYXRpb25zIHdlcmUgYnVpbHQKLSAgICAgKiBiYXNlZCBvbiB0aGUgV1NETCwgc28gd2Ugd2lsbCB1c2UgdGhlbSB0byBjcmVhdGUgdGhlIG5lY2Vzc2FyeSBvYmplY3RzLgotICAgICAqCi0gICAgICogQHBhcmFtIHBhcmVudAotICAgICAqLwotICAgIEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb25JbXBsKEVuZHBvaW50RGVzY3JpcHRpb25JbXBsIHBhcmVudCkgewotICAgICAgICBwYXJlbnRFbmRwb2ludERlc2NyaXB0aW9uID0gcGFyZW50OwotICAgICAgICBkYmMgPSBuZXcgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCk7Ci0gICAgICAgIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlID0gcGFyZW50RW5kcG9pbnREZXNjcmlwdGlvbi5nZXRBeGlzU2VydmljZSgpOwotICAgICAgICBpZiAoYXhpc1NlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgQXJyYXlMaXN0IHB1Ymxpc2hlZE9wZXJhdGlvbnMgPSBheGlzU2VydmljZS5nZXRQdWJsaXNoZWRPcGVyYXRpb25zKCk7Ci0gICAgICAgICAgICBJdGVyYXRvciBvcGVyYXRpb25zSXRlcmF0b3IgPSBwdWJsaXNoZWRPcGVyYXRpb25zLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB3aGlsZSAob3BlcmF0aW9uc0l0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIEF4aXNPcGVyYXRpb24gYXhpc09wZXJhdGlvbiA9IChBeGlzT3BlcmF0aW9uKW9wZXJhdGlvbnNJdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgYWRkT3BlcmF0aW9uKG5ldyBPcGVyYXRpb25EZXNjcmlwdGlvbkltcGwoYXhpc09wZXJhdGlvbiwgdGhpcykpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdCBhcyBQcm92aWRlci1iYXNlZCBlbmRwb2ludCB3aGljaCBkb2VzIG5vdCBoYXZlIHNwZWNpZmljIFdTREwgb3BlcmF0aW9ucy4gIFNpbmNlIHRoZXJlCi0gICAgICogYXJlIG5vIHNwZWNpZmljIFdTREwgb3BlcmF0aW9ucyBpbiB0aGlzIGNhc2UsIHRoZXJlIHdpbGwgYmUgYSBzaW5nbGUgZ2VuZXJpYyBvcGVyYXRpb24gdGhhdAotICAgICAqIHdpbGwgYWNjZXB0IGFueSBpbmNvbWluZyBvcGVyYXRpb24uCi0gICAgICogCi0gICAgICogQHBhcmFtIGRiYwotICAgICAqIEBwYXJhbSBwYXJlbnQKLSAgICAgKi8KLSAgICBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uSW1wbChEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgZGJjLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uSW1wbCBwYXJlbnQpIHsKLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIkNyZWF0aW5nIGEgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiBmb3IgYSBnZW5lcmljIFdTREwtbGVzcyBwcm92aWRlciIpOwotICAgICAgICB9Ci0gICAgICAgIHBhcmVudEVuZHBvaW50RGVzY3JpcHRpb24gPSBwYXJlbnQ7Ci0gICAgICAgIHRoaXMuZGJjID0gZGJjOwotICAgICAgICAKLSAgICAgICAgLy8gQ29uc3RydWN0IHRoZSBnZW5lcmljIHByb3ZpZGVyIEF4aXNPcGVyYXRpb24gdG8gdXNlIHRoZW4gY29uc3RydWN0Ci0gICAgICAgIC8vIGFuIE9wZXJhY3Rpb25EZXNjcmlwdGlvbiBmb3IgaXQuCi0gICAgICAgIEF4aXNPcGVyYXRpb24gZ2VuZXJpY1Byb3ZpZGVyQXhpc09wID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGdlbmVyaWNQcm92aWRlckF4aXNPcCA9IAotICAgICAgICAgICAgICAgIEF4aXNPcGVyYXRpb25GYWN0b3J5LmdldE9wZXJhdGlvbkRlc2NyaXB0aW9uKFdTRExDb25zdGFudHMuV1NETDIwXzIwMDZDb25zdGFudHMuTUVQX1VSSV9JTl9PVVQpOwotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgZSkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJlaURlc2NySW1wbEVyciIpLGUpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBnZW5lcmljUHJvdmlkZXJBeGlzT3Auc2V0TmFtZShuZXcgUU5hbWUoSkFYV1NfTk9XU0RMX1BST1ZJREVSX09QRVJBVElPTl9OQU1FKSk7Ci0gICAgICAgIE9wZXJhdGlvbkRlc2NyaXB0aW9uIG9wRGVzYyA9IG5ldyBPcGVyYXRpb25EZXNjcmlwdGlvbkltcGwoZ2VuZXJpY1Byb3ZpZGVyQXhpc09wLCB0aGlzKTsKLSAgICAgICAgCi0gICAgICAgIGFkZE9wZXJhdGlvbihvcERlc2MpOwotICAgICAgICBBeGlzU2VydmljZSBheGlzU2VydmljZSA9IGdldEVuZHBvaW50RGVzY3JpcHRpb24oKS5nZXRBeGlzU2VydmljZSgpOwotICAgICAgICBheGlzU2VydmljZS5hZGRPcGVyYXRpb24oZ2VuZXJpY1Byb3ZpZGVyQXhpc09wKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBCdWlsZCBhbiBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uIGZyb20gYSBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUuICBUaGlzIEVJRCBoYXMKLSAgICAgKiBXU0RMIG9wZXJhdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGl0LiAgSXQgY291bGQgcmVwcmVzZW50IGFuIFNFSS1iYXNlZCBlbmRwb2ludCBidWlsdCBmcm9tCi0gICAgICogV1NETCBvciBhbm5vdGF0aW9ucywgT1IgaXQgY291bGQgcmVwcmVzZW50IGEgUHJvdmlkZXItYmFzZWQgZW5wb2ludCBidWlsdCBmcm9tIFdTREwuICBJdCB3aWxsCi0gICAgICogbm90IHJlcHJlc2VudCBhIFByb3ZpZGVyLWJhc2VkIGVuZHBvaW50IGJ1aWx0IHdpdGhvdXQgV1NETCAod2hpY2ggZG9lcyBub3Qga25vdyBhYm91dAotICAgICAqIHNwZWNpZmljIFdTREwgb3BlcmF0aW9ucykuIEZvciB0aGF0IHR5cGUgb2YgRUlELCBzZWU6Ci0gICAgICogQHNlZSAgI0VuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb25JbXBsKERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBkYmMsIEVuZHBvaW50RGVzY3JpcHRpb25JbXBsIHBhcmVudCkKLSAgICAgKiBAcGFyYW0gZGJjCi0gICAgICogQHBhcmFtIGlzQ2xhc3MKLSAgICAgKiBAcGFyYW0gcGFyZW50Ci0gICAgICovCi0gICAgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbkltcGwoRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIGRiYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzQ2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbkltcGwgcGFyZW50KSB7Ci0KLSAgICAgICAgcGFyZW50RW5kcG9pbnREZXNjcmlwdGlvbiA9IHBhcmVudDsKLSAgICAgICAgdGhpcy5kYmMgPSBkYmM7Ci0KLSAgICAgICAgZ2V0RW5kcG9pbnREZXNjcmlwdGlvbigpLmdldEF4aXNTZXJ2aWNlKCkKLSAgICAgICAgICAgICAgICAuc2V0VGFyZ2V0TmFtZXNwYWNlKGdldEVuZHBvaW50RGVzY3JpcHRpb25JbXBsKCkuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOwotCi0gICAgICAgIC8vIFBlciBKU1ItMTgxIGFsbCBtZXRob2RzIG9uIHRoZSBTRUkgYXJlIG1hcHBlZCB0byBvcGVyYXRpb25zIHJlZ2FyZGxlc3MKLSAgICAgICAgLy8gb2Ygd2hldGhlciB0aGV5IGluY2x1ZGUgYW4gQFdlYk1ldGhvZCBhbm5vdGF0aW9uLiAgVGhhdCBhbm5vdGF0aW9uIG1heQotICAgICAgICAvLyBiZSBwcmVzZW50IHRvIGN1c3RvbWl6ZSB0aGUgbWFwcGluZywgYnV0IGlzIG5vdCByZXF1aXJlZCAocDE0KQotCi0gICAgICAgIC8vV2UgYXJlIHByb2Nlc3NpbmcgdGhlIFNFSSBjb21wb3NpdGUKLSAgICAgICAgLy9Gb3IgZXZlcnkgTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUgaW4gdGhpcyBsaXN0LCBjYWxsIE9wZXJhdGlvbkRlc2NyaXB0aW9uIAotICAgICAgICAvL2NvbnN0cnVjdG9yIGZvciBpdCwgdGhlbiBhZGQgdGhpcyBvcGVyYXRpb24KLQotICAgICAgICAvL1JldHJpZXZlIHRoZSByZWxldmVudCBtZXRob2QgY29tcG9zaXRlcyBmb3IgdGhpcyBkYmMgKGFuZCB0aG9zZSBpbiB0aGUgc3VwZXJjbGFzcyBjaGFpbikKLSAgICAgICAgSXRlcmF0b3I8TWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGU+IGl0ZXIgPSByZXRyaWV2ZVJlbGV2ZW50TWV0aG9kcyhkYmMpOwotCi0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbkltcGw6IEZpbmlzaGVkIHJldHJpZXZpbmcgbWV0aG9kcyIpOwotICAgICAgICBNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSBtZGMgPSBudWxsOwotCi0gICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgbWRjID0gaXRlci5uZXh0KCk7Ci0KLSAgICAgICAgICAgIG1kYy5zZXREZWNsYXJpbmdDbGFzcyhkYmMuZ2V0Q2xhc3NOYW1lKCkpOwotCi0gICAgICAgICAgICAvLyBPbmx5IGFkZCBpZiBpdCBpcyBhIG1ldGhvZCB0aGF0IHdvdWxkIGJlIG9yIGlzIGluIHRoZSBXU0RMIGkuZS4gCi0gICAgICAgICAgICAvLyBkb24ndCBjcmVhdGUgYW4gT3BlcmF0aW9uRGVzY3JpcHRvciBmb3IgdGhlIE1EQyByZXByZXNlbnRpbmcgdGhlCi0gICAgICAgICAgICAvLyBjb25zdHJ1Y3RvcgotICAgICAgICAgICAgaWYgKERlc2NyaXB0aW9uVXRpbHMuY3JlYXRlT3BlcmF0aW9uRGVzY3JpcHRpb24obWRjLmdldE1ldGhvZE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAvL0ZpcnN0IGNoZWNrIGlmIHRoaXMgb3BlcmF0aW9uIGFscmVhZHkgZXhpc3RzIG9uIHRoZSBBeGlzU2VydmljZSwgaWYgc28KLSAgICAgICAgICAgICAgICAvL3RoZW4gdXNlIHRoYXQgaW4gdGhlIGRlc2NyaXB0aW9uIGhpZXJhcmNoeQotCi0gICAgICAgICAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UgPSBnZXRFbmRwb2ludERlc2NyaXB0aW9uKCkuZ2V0QXhpc1NlcnZpY2UoKTsKLSAgICAgICAgICAgICAgICBBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb24gPSBheGlzU2VydmljZQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldE9wZXJhdGlvbihPcGVyYXRpb25EZXNjcmlwdGlvbkltcGwuZGV0ZXJtaW5lT3BlcmF0aW9uUU5hbWUobWRjKSk7Ci0KLSAgICAgICAgICAgICAgICBPcGVyYXRpb25EZXNjcmlwdGlvbiBvcGVyYXRpb24gPQotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9wZXJhdGlvbkRlc2NyaXB0aW9uSW1wbChtZGMsIHRoaXMsIGF4aXNPcGVyYXRpb24pOwotCi0gICAgICAgICAgICAgICAgaWYgKGF4aXNPcGVyYXRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGF4aXNPcGVyYXRpb24gZGlkIG5vdCBhbHJlYWR5IGV4aXN0IG9uIHRoZSBBeGlzU2VydmljZSwgYW5kIHNvIHdhcyBjcmVhdGVkCi0gICAgICAgICAgICAgICAgICAgIC8vIHdpdGggdGhlIE9wZXJhdGlvbkRlc2NyaXB0aW9uLCBzbyB3ZSBuZWVkIHRvIGFkZCB0aGUgb3BlcmF0aW9uIHRvIHRoZSBzZXJ2aWNlCi0gICAgICAgICAgICAgICAgICAgICgoT3BlcmF0aW9uRGVzY3JpcHRpb25JbXBsKW9wZXJhdGlvbikuYWRkVG9BeGlzU2VydmljZShheGlzU2VydmljZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkVJRDogSnVzdCBhZGRlZCBvcGVyYXRpb249ICIgKyBvcGVyYXRpb24uZ2V0T3BlcmF0aW9uTmFtZSgpKTsKLSAgICAgICAgICAgICAgICBhZGRPcGVyYXRpb24ob3BlcmF0aW9uKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICAgICAgbG9nLmRlYnVnKCJFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uSW1wbDogRmluaXNoZWQgQWRkaW5nIG9wZXJhdGlvbnMiKTsKLQotICAgIH0KLQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTWV0aG9kW10gZ2V0U0VJTWV0aG9kcyhDbGFzcyBzZWkpIHsKLSAgICAgICAgLy8gUGVyIEpTUi0xODEgYWxsIG1ldGhvZHMgb24gdGhlIFNFSSBhcmUgbWFwcGVkIHRvIG9wZXJhdGlvbnMgcmVnYXJkbGVzcwotICAgICAgICAvLyBvZiB3aGV0aGVyIHRoZXkgaW5jbHVkZSBhbiBAV2ViTWV0aG9kIGFubm90YXRpb24uICBUaGF0IGFubm90YXRpb24gbWF5Ci0gICAgICAgIC8vIGJlIHByZXNlbnQgdG8gY3VzdG9taXplIHRoZSBtYXBwaW5nLCBidXQgaXMgbm90IHJlcXVpcmVkIChwMTQpCi0gICAgICAgIE1ldGhvZFtdIHNlaU1ldGhvZHMgPSBzZWkuZ2V0TWV0aG9kcygpOwotICAgICAgICBBcnJheUxpc3QgbWV0aG9kTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgaWYgKHNlaSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKE1ldGhvZCBtZXRob2QgOiBzZWlNZXRob2RzKSB7Ci0KLSAgICAgICAgICAgICAgICBpZiAobWV0aG9kLmdldERlY2xhcmluZ0NsYXNzKCkuZ2V0TmFtZSgpLmVxdWFscygiamF2YS5sYW5nLk9iamVjdCIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtZXRob2RMaXN0LmFkZChtZXRob2QpOwotICAgICAgICAgICAgICAgIGlmICghTW9kaWZpZXIuaXNQdWJsaWMobWV0aG9kLmdldE1vZGlmaWVycygpKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBKU1ItMTgxIHNheXMgbWV0aG9kcyBtdXN0IGJlIHB1YmxpYyAocDE0KQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoInNlaU1ldGhvZHNFcnIiKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIFRPRE86IG90aGVyIHZhbGlkYXRpb24gcGVyIEpTUi0xODEKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAoTWV0aG9kW10pbWV0aG9kTGlzdC50b0FycmF5KG5ldyBNZXRob2RbbWV0aG9kTGlzdC5zaXplKCldKTsKLS8vICAgICAgICByZXR1cm4gc2VpTWV0aG9kczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVcGRhdGUgYSBwcmV2aW91c2x5IGNyZWF0ZWQgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiB3aXRoIGluZm9ybWF0aW9uIGZyb20gYW4gYW5ub3RhdGVkCi0gICAgICogU0VJLiAgVGhpcyBzaG91bGQgb25seSBiZSBuZWNlc3Nhcnkgd2hlbiB0aGUgdGhpcyB3YXMgY3JlYXRlZCB3aXRoIFdTREwuIEluIHRoaXMgY2FzZSwgdGhlCi0gICAgICogaW5mb3JtYXRpb24gZnJvbSB0aGUgV1NETCBpcyBhdWdtZW50ZWQgYmFzZWQgb24gdGhlIGFubm90YXRlZCBTRUkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2VpCi0gICAgICovCi0gICAgdm9pZCB1cGRhdGVXaXRoU0VJKENsYXNzIHNlaSkgewotICAgICAgICBDbGFzcyBzZWlDbGFzcyA9IGRiYy5nZXRDb3JyZXNwb25kaW5nQ2xhc3MoKTsKLSAgICAgICAgaWYgKHNlaUNsYXNzICE9IG51bGwgJiYgc2VpQ2xhc3MgIT0gc2VpKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJzZWlQcm9jZXNzaW5nRXJyIikpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChzZWlDbGFzcyAhPSBudWxsICYmIHNlaUNsYXNzID09IHNlaSkgewotICAgICAgICAgICAgLy8gV2UndmUgYWxyZWFkeSBkb25lIHRoZSBuZWNlc3NhcnkgdXBkYXRlcyBmb3IgdGhpcyBTRUkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChzZWkgIT0gbnVsbCkgewotICAgICAgICAgICAgc2VpQ2xhc3MgPSBzZWk7Ci0gICAgICAgICAgICBkYmMuc2V0Q29ycmVzcG9uZGluZ0NsYXNzKHNlaSk7Ci0gICAgICAgICAgICAvLyBVcGRhdGUgKG9yIHBvc3NpYmx5IGFkZCkgdGhlIE9wZXJhdGlvbkRlc2NyaXB0aW9uIGZvciBlYWNoIG9mIHRoZSBtZXRob2RzIG9uIHRoZSBTRUkuCi0gICAgICAgICAgICBmb3IgKE1ldGhvZCBzZWlNZXRob2QgOiBnZXRTRUlNZXRob2RzKHNlaUNsYXNzKSkgewotCi0gICAgICAgICAgICAgICAgaWYgKGdldE9wZXJhdGlvbihzZWlNZXRob2QpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSWYgYW4gT3BEZXNjIGFscmVhZHkgZXhpc3RzIHdpdGggdGhpcyBqYXZhIG1ldGhvZCBzZXQgb24gaXQsIHRoZW4gdGhlIE9wRGVzYyBoYXMgYWxyZWFkeQotICAgICAgICAgICAgICAgICAgICAvLyBiZWVuIHVwZGF0ZWQgZm9yIHRoaXMgbWV0aG9kLCBzbyBza2lwIGl0LgotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gQXQgdGhpcyBwb2ludCAoZm9yIG5vdyBhdCBsZWFzdCkgdGhlIG9wZXJhdGlvbnMgd2VyZSBjcmVhdGVkIHdpdGggV1NETCBwcmV2aW91c2x5LgotICAgICAgICAgICAgICAgIC8vIElmIHRoZXkgaGFkIGJlZW4gY3JlYXRlZCBmcm9tIGFuIGFubm90YXRlZCBjbGFzcyBhbmQgbm8gV1NETCwgdGhlbiB0aGUgc2VpQ2xhc3Mgd291bGQgaGF2ZSAKLSAgICAgICAgICAgICAgICAvLyBhbHJlYWR5IGJlZW4gc2V0IHNvIHdlIHdvdWxkIGhhdmUgdGFrZW4gb3RoZXIgYnJhbmNoZXMgaW4gdGhpcyBpZiB0ZXN0LiAgKE5vdGUgdGhpcyBjb3VsZAotICAgICAgICAgICAgICAgIC8vIGNoYW5nZSBvbmNlIEF4aXNTZXJ2aWNlcyBjYW4gYmUgYnVpbHQgZnJvbSBhbm5vdGF0aW9ucyBieSB0aGUgU2VydmljZURlc2NyaXB0aW9uIGNsYXNzKS4KLSAgICAgICAgICAgICAgICAvLyBTaW5jZSB0aGUgb3BlcmF0aW9ucyB3ZXJlIGNyZWF0ZWQgZnJvbSBXU0RMLCB0aGV5IHdpbGwgbm90IGhhdmUgYSBqYXZhIG1ldGhvZCwgd2hpY2gKLSAgICAgICAgICAgICAgICAvLyBjb21lcyBmcm9tIHRoZSBTRUksIHNldCBvbiB0aGVtIHlldC4KLSAgICAgICAgICAgICAgICAvLwotICAgICAgICAgICAgICAgIC8vIEFub3RoZXIgY29uc2lkZXJhdGlvbiBpcyB0aGF0IGN1cnJlbnRseSBBeGlzMiBkb2VzIG5vdCBzdXBwb3J0IG92ZXJsb2FkZWQgV1NETCBvcGVyYXRpb25zLgotICAgICAgICAgICAgICAgIC8vIFRoYXQgbWVhbnMgdGhlcmUgd2lsbCBvbmx5IGJlIG9uZSBPcGVyYXRpb25EZXNjIGJ1aWxkIGZyb20gV1NETC4gIFN0aWxsIGFub3RoZXIgY29uc2lkZXJhdGlvbiBpcwotICAgICAgICAgICAgICAgIC8vIHRoYXQgdGhlIEpBWFdTIGFzeW5jIG1ldGhvZHMgd2hpY2ggbWF5IGV4aXN0IG9uIHRoZSBTRUkgd2lsbCBOT1QgZXhpc3QgaW4gdGhlIFdTREwuICBBbiBleGFtcGxlCi0gICAgICAgICAgICAgICAgLy8gb2YgdGhlc2UgbWV0aG9kcyBmb3IgdGhlIFdTREwgb3BlcmF0aW9uOgotICAgICAgICAgICAgICAgIC8vICAgICBTdHJpbmcgZWNobyhTdHJpbmcpCi0gICAgICAgICAgICAgICAgLy8gb3B0aW9uYWxseSBnZW5lcmF0ZWQgSkFYLVdTIFNFSSBtZXRob2RzIGZyb20gdGhlIHRvb2xpbmc7IHRha2Ugbm90ZSBvZiB0aGUgYW5ub3RhdGlvbiBzcGVjaWZ5aW5nIHRoZSAKLSAgICAgICAgICAgICAgICAvLyBvcGVyYXRpb24gbmFtZQotICAgICAgICAgICAgICAgIC8vICAgICBAV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWU9ImVjaG8iIC4uLikKLSAgICAgICAgICAgICAgICAvLyAgICAgUmVzcG9uc2U8U3RyaW5nPiBlY2hvU3RyaW5nQXN5bmMoU3RyaW5nKQotICAgICAgICAgICAgICAgIC8vICAgICBAV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWU9ImVjaG8iIC4uLikKLSAgICAgICAgICAgICAgICAvLyAgICAgRnV0dXJlPD8+IGVjaG9TdHJpbmdBc3luYyhTdHJpbmcsIEFzeW5jSGFuZGxlcikKLSAgICAgICAgICAgICAgICAvLwotICAgICAgICAgICAgICAgIC8vIFNvIGdpdmVuIGFsbCB0aGUgYWJvdmUsIHRoZSBjb2RlIGRvZXMgdGhlIGZvbGxvd2luZyBiYXNlZCBvbiB0aGUgb3BlcmF0aW9uIFFOYW1lCi0gICAgICAgICAgICAgICAgLy8gKHdoaWNoIG1pZ2h0IGFsc28gYmUgdGhlIGphdmEgbWV0aG9kIG5hbWU7IHNlZSBkZXRlcm1pbmVPcGVyYXRpb25RTmFtZSBmb3IgZGV0YWlscykKLSAgICAgICAgICAgICAgICAvLyAoMSkgSWYgYW4gb3BlcmF0aW9uRGVzYyBkb2VzIG5vdCBleGlzdCwgYWRkIGl0LgotICAgICAgICAgICAgICAgIC8vICgyKSBJZiBhbiBvcGVyYXRpb25EZXNjIGRvZXMgZXhpc3QgYnV0IGRvZXMgbm90IGhhdmUgYSBqYXZhIG1ldGhvZCBzZXQgb24gaXQsIHNldCBpdAotICAgICAgICAgICAgICAgIC8vICgzKSBJZiBhbiBvcGVyYXRpb25EZXNjIGRvZXMgZXhpc3QgYW5kIGhhcyBhIGphdmEgbWV0aG9kIHNldCBvbiBpdCBhbHJlYWR5LCBhZGQgYSBuZXcgb25lLiAKLSAgICAgICAgICAgICAgICAvLwotICAgICAgICAgICAgICAgIC8vIFRPRE86IE1heSBuZWVkIHRvIGNoYW5nZSB3aGVuIEF4aXMyIHN1cHBvcnRzIG92ZXJsb2FkZWQgV1NETCBvcGVyYXRpb25zCi0KLSAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIFFOYW1lIGZvciB0aGlzIGphdmEgbWV0aG9kIGFuZCB0aGVuIHVwZGF0ZSAob3IgYWRkKSB0aGUgYXBwcm9wcmlhdGUgT3BlcmF0aW9uRGVzY3JpcHRpb24KLSAgICAgICAgICAgICAgICAvLyBTZWUgY29tbWVudHMgYmVsb3cgZm9yIGltcG9yYW50IG5vdGVzIGFib3V0IHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uLgotICAgICAgICAgICAgICAgIC8vIE5PVEUgT04gT1ZFUkxPQURFRCBPUEVSQVRJT05TCi0gICAgICAgICAgICAgICAgLy8gQXhpczIgZG9lcyBOT1QgY3VycmVudGx5IHN1cHBvcnQgb3ZlcmxvYWRpbmcgV1NETCBvcGVyYXRpb25zLgotICAgICAgICAgICAgICAgIFFOYW1lIHNlaU9wZXJhdGlvblFOYW1lID0KLSAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhdGlvbkRlc2NyaXB0aW9uSW1wbC5kZXRlcm1pbmVPcGVyYXRpb25RTmFtZShzZWlNZXRob2QpOwotICAgICAgICAgICAgICAgIE9wZXJhdGlvbkRlc2NyaXB0aW9uW10gdXBkYXRlT3BEZXNjID0gZ2V0T3BlcmF0aW9uKHNlaU9wZXJhdGlvblFOYW1lKTsKLSAgICAgICAgICAgICAgICBpZiAodXBkYXRlT3BEZXNjID09IG51bGwgfHwgdXBkYXRlT3BEZXNjLmxlbmd0aCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgb3BlcmF0aW9uIHdhc24ndCBkZWZpbmVkIGluIHRoZSBXU0RMLiAgTm90ZSB0aGF0IHRoZSBKQVgtV1MgYXN5bmMgbWV0aG9kcwotICAgICAgICAgICAgICAgICAgICAvLyB3aGljaCBhcmUgZGVmaW5lZCBvbiB0aGUgU0VJIGFyZSBub3QgZGVmaW5lZCBhcyBvcGVyYXRpb25zIGluIHRoZSBXU0RMLgotICAgICAgICAgICAgICAgICAgICAvLyBBbHRob3VnaCB0aGV5IHVzdWFsbHkgc3BlY2lmaWMgdGhlIHNhbWUgT3BlcmF0aW9uTmFtZSBhcyB0aGUgV1NETCBvcGVyYXRpb24sIAotICAgICAgICAgICAgICAgICAgICAvLyB0aGVyZSBtYXkgYmUgY2FzZXMgd2hlcmUgdGhleSBkbyBub3QuCi0gICAgICAgICAgICAgICAgICAgIE9wZXJhdGlvbkRlc2NyaXB0aW9uIG9wZXJhdGlvbiA9IG5ldyBPcGVyYXRpb25EZXNjcmlwdGlvbkltcGwoc2VpTWV0aG9kLCB0aGlzKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkT3BlcmF0aW9uKG9wZXJhdGlvbik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gQ3VycmVudGx5IEF4aXMyIGRvZXMgbm90IHN1cHBvcnQgb3ZlcmxvYWRlZCBvcGVyYXRpb25zLiAgVGhhdCBtZWFucyB0aGF0IGV2ZW4gaWYgdGhlIFdTREwKLSAgICAgICAgICAgICAgICAgICAgLy8gZGVmaW5lZCBvdmVybG9hZGVkIG9wZXJhdGlvbnMsIHRoZXJlIHdvdWxkIHN0aWxsIG9ubHkgYmUgYSBzaW5nbGUgQXhpc09wZXJhdGlvbiwgYW5kIGl0Ci0gICAgICAgICAgICAgICAgICAgIC8vIHdvdWxkIGJlIHRoZSBsYXN0IG9wZXJhdGlvbiBlbmNvdW50ZXJkLgotICAgICAgICAgICAgICAgICAgICAvLyBIT1dFVkVSIHRoZSBnZW5lcmF0ZWQgSkFYLVdTIGFzeW5jIG1ldGhvZHMgKHNlZSBhYm92ZSkgbWF5ICh3aWxsIGFsd2F5cz8pIGhhdmUgdGhlIHNhbWUKLSAgICAgICAgICAgICAgICAgICAgLy8gb3BlcmF0aW9uIG5hbWUgYW5kIHNvIHdpbGwgY29tZSBkb3duIHRoaXMgcGF0aDsgdGhleSBuZWVkIHRvIGJlIGFkZGVkLgotICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBXaGVuIEF4aXMyIHN0YXJ0cyBzdXBwb3J0aW5nIG92ZXJsb2FkZWQgb3BlcmF0aW9ucywgdGhlbiB0aGlzIGxvZ2ljIHdpbGwgbmVlZCB0byBiZSBjaGFuZ2VkCi0KLSAgICAgICAgICAgICAgICAgICAgLy8gTG9vcCB0aHJvdWdoIGFsbCB0aGUgb3BkZXNjczsgaWYgb25lIGRvZXNuJ3QgY3VycmVudGx5IGhhdmUgYSBqYXZhIG1ldGhvZCBzZXQsIHNldCBpdAotICAgICAgICAgICAgICAgICAgICAvLyBJZiBhbGwgaGF2ZSBqYXZhIG1ldGhvZHMgc2V0LCB0aGVuIGFkZCBhIG5ldyBvbmUuICBBc3N1bWUgd2UnbGwgbmVlZCB0byBhZGQgYSBuZXcgb25lLgotICAgICAgICAgICAgICAgICAgICBib29sZWFuIGFkZE9wRGVzYyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoT3BlcmF0aW9uRGVzY3JpcHRpb24gY2hlY2tPcERlc2MgOiB1cGRhdGVPcERlc2MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGVja09wRGVzYy5nZXRTRUlNZXRob2QoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogU2hvdWxkIHRoaXMgYmUgY2hlY2tpbmcgKHNvbWVob3cpIHRoYXQgdGhlIHNpZ25hdHVyZSBtYXRjaGVzPyAgUHJvYmFibHkgbm90IGFuIGlzc3VlIHVudGlsIG92ZXJsb2FkZWQgV1NETCBvcHMgYXJlIHN1cHBvcnRlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL01ha2Ugc3VyZSB0aGF0IHRoaXMgaXMgbm90IG9uZSBvZiB0aGUgJ2FzeW5jJyBtZXRob2RzIGFzc29jaWF0ZWQgd2l0aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdGhpcyBvcGVyYXRpb24uIElmIGl0IGlzLCBsZXQgaXQgYmUgY3JlYXRlZCBhcyBpdHMgb3duIG9wRGVzYy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIURlc2NyaXB0aW9uVXRpbHMuaXNBc3luYyhzZWlNZXRob2QpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoT3BlcmF0aW9uRGVzY3JpcHRpb25JbXBsKSBjaGVja09wRGVzYykuc2V0U0VJTWV0aG9kKHNlaU1ldGhvZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZE9wRGVzYyA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGFkZE9wRGVzYykgewotICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmF0aW9uRGVzY3JpcHRpb24gb3BlcmF0aW9uID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9wZXJhdGlvbkRlc2NyaXB0aW9uSW1wbChzZWlNZXRob2QsIHRoaXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgYWRkT3BlcmF0aW9uKG9wZXJhdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIE9wZXJhdGlvbkRlc2NyaXB0aW9ucyBjb3JyZXNwb25kaW5nIHRvIGEgcGFydGljdWxhciBKYXZhIG1ldGhvZCBuYW1lLiBOb3RlIHRoYXQgYW4KLSAgICAgKiBhcnJheSBpcyByZXR1cm5lZCBiZWNhdXNlIGEgbWV0aG9kIGNvdWxkIGJlIG92ZXJsb2FkZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gamF2YU1ldGhvZE5hbWUgU3RyaW5nIHJlcHJlc2VudGluZyBhIEphdmEgTWV0aG9kIE5hbWUKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIE9wZXJhdGlvbkRlc2NyaXB0aW9uW10gZ2V0T3BlcmF0aW9uRm9ySmF2YU1ldGhvZChTdHJpbmcgamF2YU1ldGhvZE5hbWUpIHsKLSAgICAgICAgaWYgKERlc2NyaXB0aW9uVXRpbHMuaXNFbXB0eShqYXZhTWV0aG9kTmFtZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgQXJyYXlMaXN0PE9wZXJhdGlvbkRlc2NyaXB0aW9uPiBtYXRjaGluZ09wZXJhdGlvbnMgPSBuZXcgQXJyYXlMaXN0PE9wZXJhdGlvbkRlc2NyaXB0aW9uPigpOwotICAgICAgICBmb3IgKE9wZXJhdGlvbkRlc2NyaXB0aW9uIG9wZXJhdGlvbiA6IGdldE9wZXJhdGlvbnMoKSkgewotICAgICAgICAgICAgaWYgKGphdmFNZXRob2ROYW1lLmVxdWFscyhvcGVyYXRpb24uZ2V0SmF2YU1ldGhvZE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICBtYXRjaGluZ09wZXJhdGlvbnMuYWRkKG9wZXJhdGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobWF0Y2hpbmdPcGVyYXRpb25zLnNpemUoKSA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiBtYXRjaGluZ09wZXJhdGlvbnMudG9BcnJheShuZXcgT3BlcmF0aW9uRGVzY3JpcHRpb25bMF0pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgT3BlcmF0aW9uRGVzcmlwdGlvbiAob25seSBvbmUpIGNvcnJlc3BvbmRpbmcgdG8gdGhlIE9wZXJhdGlvbk5hbWUgcGFzc2VkIGluLgotICAgICAqCi0gICAgICogQHBhcmFtIG9wZXJhdGlvbk5hbWUKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIE9wZXJhdGlvbkRlc2NyaXB0aW9uIGdldE9wZXJhdGlvbihTdHJpbmcgb3BlcmF0aW9uTmFtZSkgewotICAgICAgICBpZiAoRGVzY3JpcHRpb25VdGlscy5pc0VtcHR5KG9wZXJhdGlvbk5hbWUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIE9wZXJhdGlvbkRlc2NyaXB0aW9uIG1hdGNoaW5nT3BlcmF0aW9uID0gbnVsbDsKLSAgICAgICAgZm9yIChPcGVyYXRpb25EZXNjcmlwdGlvbiBvcGVyYXRpb24gOiBnZXRPcGVyYXRpb25zKCkpIHsKLSAgICAgICAgICAgIGlmIChvcGVyYXRpb25OYW1lLmVxdWFscyhvcGVyYXRpb24uZ2V0T3BlcmF0aW9uTmFtZSgpKSkgewotICAgICAgICAgICAgICAgIG1hdGNoaW5nT3BlcmF0aW9uID0gb3BlcmF0aW9uOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtYXRjaGluZ09wZXJhdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT3BlcmF0aW9uRGVzY3JpcHRpb25bXSBnZXRPcGVyYXRpb25zKCkgewotICAgICAgICByZXR1cm4gb3BlcmF0aW9uRGVzY3JpcHRpb25zLnRvQXJyYXkobmV3IE9wZXJhdGlvbkRlc2NyaXB0aW9uWzBdKTsKLSAgICB9Ci0KLSAgICBFbmRwb2ludERlc2NyaXB0aW9uSW1wbCBnZXRFbmRwb2ludERlc2NyaXB0aW9uSW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIChFbmRwb2ludERlc2NyaXB0aW9uSW1wbClwYXJlbnRFbmRwb2ludERlc2NyaXB0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyBFbmRwb2ludERlc2NyaXB0aW9uIGdldEVuZHBvaW50RGVzY3JpcHRpb24oKSB7Ci0gICAgICAgIHJldHVybiBwYXJlbnRFbmRwb2ludERlc2NyaXB0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiBhbiBhcnJheSBvZiBPcGVyYXRpb25zIGdpdmVuIGFuIG9wZXJhdGlvbiBRTmFtZS4gIE5vdGUgdGhhdCBhbiBhcnJheSBpcyByZXR1cm5lZCBzaW5jZQotICAgICAqIGEgV1NETCBvcGVyYXRpb24gbWF5IGJlIG92ZXJsb2FkZWQgcGVyIEpBWC1XUy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvcGVyYXRpb25RTmFtZQotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgT3BlcmF0aW9uRGVzY3JpcHRpb25bXSBnZXRPcGVyYXRpb24oUU5hbWUgb3BlcmF0aW9uUU5hbWUpIHsKLSAgICAgICAgT3BlcmF0aW9uRGVzY3JpcHRpb25bXSByZXR1cm5PcGVyYXRpb25zID0gbnVsbDsKLSAgICAgICAgaWYgKCFEZXNjcmlwdGlvblV0aWxzLmlzRW1wdHkob3BlcmF0aW9uUU5hbWUpKSB7Ci0gICAgICAgICAgICBBcnJheUxpc3Q8T3BlcmF0aW9uRGVzY3JpcHRpb24+IG1hdGNoaW5nT3BlcmF0aW9ucyA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8T3BlcmF0aW9uRGVzY3JpcHRpb24+KCk7Ci0gICAgICAgICAgICBPcGVyYXRpb25EZXNjcmlwdGlvbltdIGFsbE9wZXJhdGlvbnMgPSBnZXRPcGVyYXRpb25zKCk7Ci0gICAgICAgICAgICBmb3IgKE9wZXJhdGlvbkRlc2NyaXB0aW9uIG9wZXJhdGlvbiA6IGFsbE9wZXJhdGlvbnMpIHsKLSAgICAgICAgICAgICAgICBpZiAob3BlcmF0aW9uLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKS5lcXVhbHMob3BlcmF0aW9uUU5hbWUuZ2V0TG9jYWxQYXJ0KCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1hdGNoaW5nT3BlcmF0aW9ucy5hZGQob3BlcmF0aW9uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBPbmx5IHJldHVybiBhbiBhcnJheSBpZiB0aGVyZSdzIGFueXRoaW5nIGluIGl0Ci0gICAgICAgICAgICBpZiAobWF0Y2hpbmdPcGVyYXRpb25zLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm5PcGVyYXRpb25zID0gbWF0Y2hpbmdPcGVyYXRpb25zLnRvQXJyYXkobmV3IE9wZXJhdGlvbkRlc2NyaXB0aW9uWzBdKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0dXJuT3BlcmF0aW9uczsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiNnZXREaXNwYXRjaGFibGVPcGVyYXRpb24oUU5hbWUgb3BlcmF0aW9uUU5hbWUpCi0gICAgKi8KLSAgICBwdWJsaWMgT3BlcmF0aW9uRGVzY3JpcHRpb25bXSBnZXREaXNwYXRjaGFibGVPcGVyYXRpb24oUU5hbWUgb3BlcmF0aW9uUU5hbWUpIHsKLSAgICAgICAgLy8gUkVWSUVXOiBDYW4gdGhpcyBiZSBzeW5jZWQgYXQgYSBtb3JlIGdyYW51bGFyIGxldmVsPyAgQ2FuJ3Qgc3luYyBvbiBkaXNwYXRjaGFibGVPcGVyYXRpb25zIGJlY2F1c2UKLSAgICAgICAgLy8gICAgICAgICBpdCBtYXkgYmUgbnVsbCwgYnV0IGFsc28gdGhlIGluaXRpYWxpemF0aW9uIG11c3QgZmluaXNoIGJlZm9yZSBuZXh0IHRocmVhZCBzZWVzIAotICAgICAgICAvLyAgICAgICAgIGRpc3BhdGFjaGFibGVPcGVyYXRpb25zICE9IG51bGwKLSAgICAgICAgc3luY2hyb25pemVkKHRoaXMpIHsKLSAgICAgICAgICAgIGlmIChkaXNwYXRjaGFibGVPcGVyYXRpb25zID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpbml0aWFsaXplRGlzcGF0Y2hhYmxlT3BlcmF0aW9uc0xpc3QoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIE5vdGUgdGhhdCBPcGVyYXRpb25EZXNjcmlwdGlvbkltcGwgY3JlYXRlcyBvcGVyYXRpb24gcW5hbWUgd2l0aCBlbXB0eSBuYW1lc3BhY2UuIFRodXMgCi0gICAgICAgIC8vIHVzaW5nIG9ubHkgdGhlIGxvY2FsUGFydCB0byBnZXQgZGlzcGF0Y2hhYmxlIG9wZXJhdGlvbnMuCi0gICAgCVFOYW1lIGtleSA9IG5ldyBRTmFtZSgiIixvcGVyYXRpb25RTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgCUxpc3Q8T3BlcmF0aW9uRGVzY3JpcHRpb24+IG9wZXJhdGlvbnMgPSBkaXNwYXRjaGFibGVPcGVyYXRpb25zLmdldChrZXkpOwotICAgIAlpZihvcGVyYXRpb25zIT1udWxsKXsKLSAgICAJCXJldHVybiBvcGVyYXRpb25zLnRvQXJyYXkobmV3IE9wZXJhdGlvbkRlc2NyaXB0aW9uW29wZXJhdGlvbnMuc2l6ZSgpXSk7Ci0gICAgCX0KLSAgICAJcmV0dXJuIG5ldyBPcGVyYXRpb25EZXNjcmlwdGlvblswXTsKLSAgICB9Ci0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5FbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uI2dldERpc3BhdGNoYWJsZU9wZXJhdGlvbnMoKQotICAgICAqLwotICAgIHB1YmxpYyBPcGVyYXRpb25EZXNjcmlwdGlvbltdIGdldERpc3BhdGNoYWJsZU9wZXJhdGlvbnMoKSB7Ci0gICAgICAgIE9wZXJhdGlvbkRlc2NyaXB0aW9uW10gcmV0dXJuT3BlcmF0aW9ucyA9IG51bGw7Ci0KLSAgICAgICAgLy8gUkVWSUVXOiBDYW4gdGhpcyBiZSBzeW5jZWQgYXQgYSBtb3JlIGdyYW51bGFyIGxldmVsPyAgQ2FuJ3Qgc3luYyBvbiBkaXNwYXRjaGFibGVPcGVyYXRpb25zIGJlY2F1c2UKLSAgICAgICAgLy8gICAgICAgICBpdCBtYXkgYmUgbnVsbCwgYnV0IGFsc28gdGhlIGluaXRpYWxpemF0aW9uIG11c3QgZmluaXNoIGJlZm9yZSBuZXh0IHRocmVhZCBzZWVzIAotICAgICAgICAvLyAgICAgICAgIGRpc3BhdGFjaGFibGVPcGVyYXRpb25zICE9IG51bGwKLSAgICAgICAgc3luY2hyb25pemVkKHRoaXMpIHsKLSAgICAgICAgICAgIGlmIChkaXNwYXRjaGFibGVPcGVyYXRpb25zID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpbml0aWFsaXplRGlzcGF0Y2hhYmxlT3BlcmF0aW9uc0xpc3QoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBDb2xsZWN0aW9uPExpc3Q8T3BlcmF0aW9uRGVzY3JpcHRpb24+PiBkaXNwYXRjaGFibGVWYWx1ZXMgPSBkaXNwYXRjaGFibGVPcGVyYXRpb25zLnZhbHVlcygpOwotICAgICAgICBJdGVyYXRvcjxMaXN0PE9wZXJhdGlvbkRlc2NyaXB0aW9uPj4gaXRlcmF0b3JWYWx1ZXMgPSBkaXNwYXRjaGFibGVWYWx1ZXMuaXRlcmF0b3IoKTsKLSAgICAgICAgQXJyYXlMaXN0PE9wZXJhdGlvbkRlc2NyaXB0aW9uPiBhbGxEaXNwYXRjaGFibGVPcGVyYXRpb25zID0gbmV3IEFycmF5TGlzdDxPcGVyYXRpb25EZXNjcmlwdGlvbj4oKTsKLSAgICAgICAgd2hpbGUgKGl0ZXJhdG9yVmFsdWVzLmhhc05leHQoKSkgewotICAgICAgICAgICAgTGlzdDxPcGVyYXRpb25EZXNjcmlwdGlvbj4gb3BEZXNjTGlzdCA9IGl0ZXJhdG9yVmFsdWVzLm5leHQoKTsKLSAgICAgICAgICAgIGFsbERpc3BhdGNoYWJsZU9wZXJhdGlvbnMuYWRkQWxsKG9wRGVzY0xpc3QpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChhbGxEaXNwYXRjaGFibGVPcGVyYXRpb25zLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIHJldHVybk9wZXJhdGlvbnMgPSBhbGxEaXNwYXRjaGFibGVPcGVyYXRpb25zLnRvQXJyYXkobmV3IE9wZXJhdGlvbkRlc2NyaXB0aW9uW2FsbERpc3BhdGNoYWJsZU9wZXJhdGlvbnMuc2l6ZSgpXSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldHVybk9wZXJhdGlvbnM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIHRoZSBsaXN0IG9mIGRpc3BhdGNoYWJsZSBvcGVyYXRpb25zIGZyb20gdGhlIGxpc3Qgb2YgYWxsIHRoZSBvcGVyYXRpb25zLiAgQSAKLSAgICAgKiBkaXNwYXRjaGFibGUgb3BlcmF0aW9uIGlzIG9uZSB0aGF0IGNhbiBiZSBpbnZva2VkIG9uIHRoZSBlbmRwb2ludCwgc28gaXQgRE9FUyBOT1QgaW5jbHVkZToKLSAgICAgKiAtIEpBWFdTIENsaWVudCBBc3luYyBtZXRob2RzCi0gICAgICogLSBNZXRob2RzIHRoYXQgaGF2ZSBiZWVuIGV4Y2x1ZGVkIHZpYSBXZWJNZXRob2QuZXhjbHVkZSBhbm5vdGF0aW9uCi0gICAgICoKLSAgICAgKiBOb3RlOiBXZSBoYXZlIHRvIGNyZWF0ZSB0aGUgbGlzdCBvZiBkaXNwYXRjaGFibGUgb3BlcmF0aW9ucyBpbiBhIGxhenkgd2F5OyB3ZSBjYW4ndAotICAgICAqIGNyZWF0ZSBpdCBhcyB0aGUgb3BlcmF0aW9ucyBhcmUgYWRkZWQgdmlhIGFkZE9wZXJhdGlvbnMoKSBiZWNhdXNlIG9uIHRoZSBjbGllbnQKLSAgICAgKiB0aGF0IGxpc3QgaXMgYnVpbHQgaW4gdHdvIHBhcnRzOyBmaXJzdCB1c2luZyBBeGlzT3BlcmF0aW9ucyBmcm9tIHRoZSBXU0RMLCB3aGljaCB3aWxsCi0gICAgICogbm90IGhhdmUgYW55IGFubm90YXRpb24gaW5mb3JtYXRpb24gKHN1Y2ggYXMgV2ViTWV0aG9kLmV4Y2x1ZGUpLiAgVGhhdCBsaXN0IHdpbGwgdGhlbgotICAgICAqICBiZSB1cGRhdGVkIHdpdGggU0VJIGluZm9ybWF0aW9uLCB3aGljaCBpcyB0aGUgcG9pbnQgYW5ub3RhdGlvbiBpbmZvcm1hdGlvbiBiZWNvbWVzCi0gICAgICogIGF2YWlsYWJsZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZURpc3BhdGNoYWJsZU9wZXJhdGlvbnNMaXN0KCkgewotICAgICAgICBkaXNwYXRjaGFibGVPcGVyYXRpb25zID0gbmV3IEhhc2hNYXA8UU5hbWUsIExpc3Q8T3BlcmF0aW9uRGVzY3JpcHRpb24+PigpOwotICAgICAgICBPcGVyYXRpb25EZXNjcmlwdGlvbltdIG9wRGVzY3MgPSBnZXRPcGVyYXRpb25zKCk7Ci0gICAgICAgIGZvciAoT3BlcmF0aW9uRGVzY3JpcHRpb24gb3BEZXNjIDogb3BEZXNjcykgewotICAgICAgICAgIGlmICghb3BEZXNjLmlzSkFYV1NBc3luY0NsaWVudE1ldGhvZCgpICYmICFvcERlc2MuaXNFeGNsdWRlZCgpKSB7Ci0gICAgICAgICAgICAgIExpc3Q8T3BlcmF0aW9uRGVzY3JpcHRpb24+IGRpc3BhdGNoYWJsZU9wZXJhdGlvbnNXaXRoTmFtZSA9IGRpc3BhdGNoYWJsZU9wZXJhdGlvbnMuZ2V0KG9wRGVzYy5nZXROYW1lKCkpOwotICAgICAgICAgICAgICBpZihkaXNwYXRjaGFibGVPcGVyYXRpb25zV2l0aE5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgZGlzcGF0Y2hhYmxlT3BlcmF0aW9uc1dpdGhOYW1lID0gbmV3IEFycmF5TGlzdDxPcGVyYXRpb25EZXNjcmlwdGlvbj4oKTsKLSAgICAgICAgICAgICAgICAgIGRpc3BhdGNoYWJsZU9wZXJhdGlvbnMucHV0KG9wRGVzYy5nZXROYW1lKCksIGRpc3BhdGNoYWJsZU9wZXJhdGlvbnNXaXRoTmFtZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZGlzcGF0Y2hhYmxlT3BlcmF0aW9uc1dpdGhOYW1lLmFkZChvcERlc2MpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiBhbiBPcGVyYXRpb25EZXNjcmlwdGlvbiBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgU0VJIG1ldGhvZC4gIE5vdGUgdGhhdCB0aGlzIE9OTFkgd29ya3MKLSAgICAgKiBpZiB0aGUgT3BlcmF0aW9uRGVzY3JpcHRpb25zIHdlcmUgY3JlYXRlZCBmcm9tIGludHJvc3BlY3RpbmcgYW4gU0VJLiAgSWYgdGhlIHdlcmUgY3JlYXRlZAotICAgICAqIHdpdGggYSBXU0RMIHRoZW4gdXNlIHRoZSBnZXRPcGVyYXRpb24oUU5hbWUpIG1ldGhvZCwgd2hpY2ggY2FuIHJldHVybiA+IDEgb3BlcmF0aW9uLgotICAgICAqCi0gICAgICogQHBhcmFtIHNlaU1ldGhvZCBUaGUgamF2YS5sYW5nLk1ldGhvZCBmcm9tIHRoZSBTRUkgZm9yIHdoaWNoIGFuIE9wZXJhdGlvbkRlc2NyaXB0aW9uIGlzCi0gICAgICogICAgICAgICAgICAgICAgICB3YW50ZWQKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIE9wZXJhdGlvbkRlc2NyaXB0aW9uIGdldE9wZXJhdGlvbihNZXRob2Qgc2VpTWV0aG9kKSB7Ci0gICAgICAgIE9wZXJhdGlvbkRlc2NyaXB0aW9uIHJldHVybk9wZXJhdGlvbiA9IG51bGw7Ci0gICAgICAgIGlmIChzZWlNZXRob2QgIT0gbnVsbCkgewotICAgICAgICAgICAgT3BlcmF0aW9uRGVzY3JpcHRpb25bXSBhbGxPcGVyYXRpb25zID0gZ2V0T3BlcmF0aW9ucygpOwotICAgICAgICAgICAgZm9yIChPcGVyYXRpb25EZXNjcmlwdGlvbiBvcGVyYXRpb24gOiBhbGxPcGVyYXRpb25zKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG9wZXJhdGlvbi5nZXRTRUlNZXRob2QoKSAhPSBudWxsICYmIG9wZXJhdGlvbi5nZXRTRUlNZXRob2QoKS5lcXVhbHMoc2VpTWV0aG9kKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybk9wZXJhdGlvbiA9IG9wZXJhdGlvbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldHVybk9wZXJhdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2xhc3MgZ2V0U0VJQ2xhc3MoKSB7Ci0gICAgICAgIHJldHVybiBkYmMuZ2V0Q29ycmVzcG9uZGluZ0NsYXNzKCk7Ci0gICAgfQotICAgIC8vIEFubm90YXRpb24tcmVhbHRlZCBnZXR0ZXJzCi0KLSAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgLy8gU09BUCBCaW5kaW5nIGFubm90YXRpb24gcmVhbHRlZCBtZXRob2RzCi0gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIHB1YmxpYyBTT0FQQmluZGluZyBnZXRBbm5vU29hcEJpbmRpbmcoKSB7Ci0gICAgICAgIGlmIChzb2FwQmluZGluZ0Fubm90YXRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgc29hcEJpbmRpbmdBbm5vdGF0aW9uID0gZGJjLmdldFNvYXBCaW5kaW5nQW5ub3QoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc29hcEJpbmRpbmdBbm5vdGF0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5TdHlsZSBnZXRTb2FwQmluZGluZ1N0eWxlKCkgewotICAgICAgICByZXR1cm4gZ2V0QW5ub1NvYXBCaW5kaW5nU3R5bGUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuU3R5bGUgZ2V0QW5ub1NvYXBCaW5kaW5nU3R5bGUoKSB7Ci0gICAgICAgIGlmIChzb2FwQmluZGluZ1N0eWxlID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChnZXRBbm5vU29hcEJpbmRpbmcoKSAhPSBudWxsICYmIGdldEFubm9Tb2FwQmluZGluZygpLnN0eWxlKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHNvYXBCaW5kaW5nU3R5bGUgPSBnZXRBbm5vU29hcEJpbmRpbmcoKS5zdHlsZSgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzb2FwQmluZGluZ1N0eWxlID0gU09BUEJpbmRpbmdfU3R5bGVfREVGQVVMVDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc29hcEJpbmRpbmdTdHlsZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuVXNlIGdldFNvYXBCaW5kaW5nVXNlKCkgewotICAgICAgICByZXR1cm4gZ2V0QW5ub1NvYXBCaW5kaW5nVXNlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlVzZSBnZXRBbm5vU29hcEJpbmRpbmdVc2UoKSB7Ci0gICAgICAgIGlmIChzb2FwQmluZGluZ1VzZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoZ2V0QW5ub1NvYXBCaW5kaW5nKCkgIT0gbnVsbCAmJiBnZXRBbm5vU29hcEJpbmRpbmcoKS51c2UoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc29hcEJpbmRpbmdVc2UgPSBnZXRBbm5vU29hcEJpbmRpbmcoKS51c2UoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc29hcEJpbmRpbmdVc2UgPSBTT0FQQmluZGluZ19Vc2VfREVGQVVMVDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc29hcEJpbmRpbmdVc2U7Ci0gICAgfQotCi0gICAgcHVibGljIGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlBhcmFtZXRlclN0eWxlIGdldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKSB7Ci0gICAgICAgIHJldHVybiBnZXRBbm5vU29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5QYXJhbWV0ZXJTdHlsZSBnZXRBbm5vU29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpIHsKLSAgICAgICAgaWYgKHNvYXBQYXJhbWV0ZXJTdHlsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoZ2V0QW5ub1NvYXBCaW5kaW5nKCkgIT0gbnVsbCAmJiBnZXRBbm5vU29hcEJpbmRpbmcoKS5wYXJhbWV0ZXJTdHlsZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzb2FwUGFyYW1ldGVyU3R5bGUgPSBnZXRBbm5vU29hcEJpbmRpbmcoKS5wYXJhbWV0ZXJTdHlsZSgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzb2FwUGFyYW1ldGVyU3R5bGUgPSBTT0FQQmluZGluZ19QYXJhbWV0ZXJTdHlsZV9ERUZBVUxUOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzb2FwUGFyYW1ldGVyU3R5bGU7Ci0gICAgfQotCi0gICAgLyoKLSAgICAqIFJldHVybnMgYSBub24tbnVsbCAocG9zc2libHkgZW1wdHkpIGxpc3Qgb2YgTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGVzCi0gICAgKi8KLSAgICBJdGVyYXRvcjxNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZT4gcmV0cmlldmVSZWxldmVudE1ldGhvZHMoRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIGRiYykgewotCi0gICAgICAgIC8qCi0gICAgICAgICogRGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhpcyBpcyBhbiBpbXBsaWNpdCBTRUkgb3IgYW4gYWN0dWFsIFNFSSwgR2F0aGVyIHVwIGFuZCBidWlsZCBhCi0gICAgICAgICogbGlzdCBvZiBNREMncy4gSWYgdGhpcyBpcyBhbiBhY3R1YWwgU0VJLCB0aGVuIHN0YXJ0aW5nIHdpdGggdGhpcyBEQkMsIGJ1aWxkIGEgbGlzdCBvZiBhbGwKLSAgICAgICAgKiBNREMncyB0aGF0IGFyZSBwdWJsaWMgbWV0aG9kcyBpbiB0aGUgY2hhaW4gb2YgZXh0ZW5kZWQgY2xhc3Nlcy4KLSAgICAgICAgKiBJZiB0aGlzIGlzIGFuIGltcGxpY2l0IFNFSSwgdGhlbiBzdGFydGluZyB3aXRoIHRoaXMgREJDLAotICAgICAgICAqICAxLiBJZiBhIGZhbHNlIGV4Y2x1ZGUgaXMgZm91bmQsIHRoZW4gdGFrZSBvbmx5IHRob3NlIHRoYXQgaGF2ZSBmYWxzZSBleGNsdWRlcwotICAgICAgICAqICAyLiBBc3N1bWluZyBubyBmYWxzZSBleGNsdWRlcywgdGFrZSBhbGwgcHVibGljIG1ldGhvZHMgdGhhdCBkb24ndCBoYXZlIGV4Y2x1ZGUgPT0gdHJ1ZQotICAgICAgICAqICAzLiBGb3IgZWFjaCBzdXBlciBjbGFzcywgaWYgJ1dlYlNlcnZpY2UnIHByZXNlbnQsIHRha2UgYWxsIE1EQydzIGFjY29yZGluZyB0byBydWxlcyAxJjIKLSAgICAgICAgKiAgICBCdXQsIGlmIFdlYlNlcnZpY2Ugbm90IHByZXNlbnQsIGdyYWIgb25seSBNREMncyB0aGF0IGFyZSBhbm5vdGF0ZWQuCi0gICAgICAgICovCi0gICAgICAgIGlmIChsb2cuaXNUcmFjZUVuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLnRyYWNlKCJyZXRyaWV2ZVJlbGV2ZW50TWV0aG9kczogRW50ZXIiKTsKLSAgICAgICAgfQotCi0gICAgICAgIEFycmF5TGlzdDxNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZT4gcmV0cmlldmVMaXN0ID0KLSAgICAgICAgICAgICAgICBuZXcgQXJyYXlMaXN0PE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlPigpOwotCi0gICAgICAgIGlmIChkYmMuaXNJbnRlcmZhY2UoKSkgewotICAgICAgICAgICAgaWYobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlJlbW92aW5nIG92ZXJyaWRkZW4gbWV0aG9kcyBmb3IgaW50ZXJmYWNlOiAiICsgZGJjLmdldENsYXNzTmFtZSgpICsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICIgd2l0aCBzdXBlciBpbnRlcmZhY2U6ICIgKyBkYmMuZ2V0U3VwZXJDbGFzc05hbWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB3ZSByZXRyaWV2ZSBhbGwgdGhlIG1ldGhvZHMsIHRoZW4gcmVtb3ZlIHRoZSBvdmVycmlkZGVuCi0gICAgICAgICAgICAvLyBtZXRob2RzIHRoYXQgZXhpc3QgaW4gdGhlIGJhc2UgaW50ZXJmYWNlCi0gICAgICAgICAgICByZXRyaWV2ZUxpc3QgPSByZXRyaWV2ZVNFSU1ldGhvZHNDaGFpbihkYmMpOwotICAgICAgICAgICAgcmV0cmlldmVMaXN0ID0gcmVtb3ZlT3ZlcnJpZGRlbk1ldGhvZHMocmV0cmlldmVMaXN0LCBkYmMpOwotICAgICAgICAgICAgCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvL3RoaXMgaXMgYW4gaW1wbGllZCBTRUkuLi5ydWxlcyBhcmUgbW9yZSBjb21wbGljYXRlZAotCi0gICAgICAgICAgICByZXRyaWV2ZUxpc3QgPSByZXRyaWV2ZUltcGxpY2l0U0VJTWV0aG9kcyhkYmMpOwotCi0gICAgICAgICAgICAvL05vdywgY29udGludWUgdG8gYnVpbGQgdGhpcyBsaXN0IHdpdGggcmVsZXZlbnQgbWV0aG9kcyBpbiB0aGUgY2hhaW4gb2YKLSAgICAgICAgICAgIC8vc3VwZXJjbGFzc2VzLiBJZiB0aGUgbG9naWMgZm9yIHByb2Nlc3Npbmcgc3VwZXJjbGFzc2VzIGlzIHRoZSBzYW1lIGFzIGZvcgotICAgICAgICAgICAgLy90aGUgb3JpZ2luYWwgU0VJLCB0aGVuIHdlIGNhbiBjb21iaW5lIHRoaXMgY29kZSB3aXRoIGFib3ZlIGNvZGUuIEJ1dCwgaXRzIHBvc3NpYmxlCi0gICAgICAgICAgICAvL3RoZSBsb2dpYyBpcyBkaWZmZXJlbnQgZm9yIHN1cGVyY2xhc3Nlcy4uLmtlZXBpbmcgc2VwYXJhdGUgZm9yIG5vdy4KLSAgICAgICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSB0ZW1wREJDID0gZGJjOwotCi0gICAgICAgICAgICB3aGlsZSAoIURlc2NyaXB0aW9uVXRpbHMuaXNFbXB0eSh0ZW1wREJDLmdldFN1cGVyQ2xhc3NOYW1lKCkpKSB7Ci0KLSAgICAgICAgICAgICAgICAvL3ZlcmlmeSB0aGF0IHRoaXMgc3VwZXJjbGFzcyBuYW1lIGlzIG5vdAotICAgICAgICAgICAgICAgIC8vICAgICAgamF2YS5sYW5nLm9iamVjdCwgaWYgc28sIHRoZW4gd2UncmUgZG9uZSBwcm9jZXNzaW5nCi0gICAgICAgICAgICAgICAgaWYgKERlc2NyaXB0aW9uVXRpbHMuamF2aWZ5Q2xhc3NOYW1lKHRlbXBEQkMuZ2V0U3VwZXJDbGFzc05hbWUoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5lcXVhbHMoTURRQ29uc3RhbnRzLk9CSkVDVF9DTEFTU19OQU1FKSkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgc3VwZXJEQkMgPQotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RW5kcG9pbnREZXNjcmlwdGlvbkltcGwoKS5nZXRTZXJ2aWNlRGVzY3JpcHRpb25JbXBsKCkuZ2V0REJDTWFwKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldCh0ZW1wREJDLmdldFN1cGVyQ2xhc3NOYW1lKCkpOwotCi0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgICAgICBsb2cudHJhY2UoInN1cGVyY2xhc3MgbmFtZSBmb3IgdGhpcyBEQkMgaXM6IiArIHRlbXBEQkMuZ2V0U3VwZXJDbGFzc05hbWUoKSk7Ci0KLSAgICAgICAgICAgICAgICAvL1ZlcmlmeSB0aGF0IHdlIGNhbiBmaW5kIHRoZSBTRUkgaW4gdGhlIGNvbXBvc2l0ZSBsaXN0Ci0gICAgICAgICAgICAgICAgaWYgKHN1cGVyREJDID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJzZWlOb3RGb3VuZEVyciIpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvL0lmIHRoZSBzdXBlcmNsYXNzIGNvbnRhaW5zIGEgV2ViU2VydmljZSBhbm5vdGF0aW9uIHRoZW4gcmV0cmlldmUgaXRzIG1ldGhvZHMKLSAgICAgICAgICAgICAgICAvL2FzIHdlIHdvdWxkIGZvciB0aGUgaW1wbCBjbGFzcywgb3RoZXJ3aXNlIGlnbm9yZSB0aGUgbWV0aG9kcyBvZiB0aGlzCi0gICAgICAgICAgICAgICAgLy9zdXBlcmNsYXNzCi0gICAgICAgICAgICAgICAgaWYgKHN1cGVyREJDLmdldFdlYlNlcnZpY2VBbm5vdCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgLy9Ob3csIGdhdGhlciB0aGUgbGlzdCBvZiBNZXRob2RzIGp1c3QgbGlrZSB3ZSBkbyBmb3IgdGhlIGxvd2VzdCBzdWJjbGFzcwotICAgICAgICAgICAgICAgICAgICByZXRyaWV2ZUxpc3QuYWRkQWxsKHJldHJpZXZlSW1wbGljaXRTRUlNZXRob2RzKHN1cGVyREJDKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRlbXBEQkMgPSBzdXBlckRCQzsKLSAgICAgICAgICAgIH0gLy9Eb25lIHdpdGggaW1wbGllZCBTRUkncyBzdXBlcmNsYXNzZXMKLSAgICAgICAgICAgIHJldHJpZXZlTGlzdCA9IHJlbW92ZU92ZXJyaWRkZW5NZXRob2RzKHJldHJpZXZlTGlzdCwgZGJjKTsKLSAgICAgICAgfS8vRG9uZSB3aXRoIGltcGxpZWQgU0VJJ3MKLQotICAgICAgICByZXR1cm4gcmV0cmlldmVMaXN0Lml0ZXJhdG9yKCk7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGVzdGFibGlzaCBhIDxjb2RlPkhhc2hNYXA8L2NvZGU+IHRoYXQgcmVwcmVzZW50cyBhIGNsYXNzIG5hbWUgb2YgYSBjb21wb3NpdGUKLSAgICAgKiBhbmQgYW4gaW50ZWdlciB2YWx1ZSBmb3IgdGhlIGVudHJ5LiBUaGUgaW50ZWdlciByZXByZXNlbnRzIHRoZSBjbGFzc2VzIGxldmVsIGluIHRoZSBKYXZhCi0gICAgICogaGllcmFyY2h5LiAwIHJlcHJlc2VudHMgdGhlIG1vc3QgYmFzaWMgY2xhc3Mgd2l0aCBuIHJlcHJlc2VudGluZyB0aGUgaGlnaGVzdCBsZXZlbCBjbGFzcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBkYmMgLSA8Y29kZT5EZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGU8L2NvZGU+Ci0gICAgICogQHJldHVybiAtIDxjb2RlPkhhc2hNYXA8L2NvZGU+Ci0gICAgICovCi0gICAgcHJpdmF0ZSBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4gZ2V0Q2xhc3NIaWVyYXJjaHkoRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIGRiYykgewotICAgICAgICBIYXNoTWFwPFN0cmluZywgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlPiBkYmNNYXAgPSBnZXRFbmRwb2ludERlc2NyaXB0aW9uSW1wbCgpLgotICAgICAgICAgICAgICAgIGdldFNlcnZpY2VEZXNjcmlwdGlvbkltcGwoKS5nZXREQkNNYXAoKTsKLSAgICAgICAgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+IGhpZXJhcmNoeU1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4oKTsKLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIlB1dHRpbmcgY2xhc3MgYXQgYmFzZSBsZXZlbDogIiArIGRiYy5nZXRDbGFzc05hbWUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaGllcmFyY2h5TWFwLnB1dChkYmMuZ2V0Q2xhc3NOYW1lKCksIEludGVnZXIudmFsdWVPZigwKSk7Ci0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBzdXBlckRCQyA9IGRiY01hcC5nZXQoKGRiYy5nZXRTdXBlckNsYXNzTmFtZSgpKSk7Ci0gICAgICAgIGludCBpID0gMTsKLSAgICAgICAgd2hpbGUgKHN1cGVyREJDICE9IG51bGwgJiYgIXN1cGVyREJDLmdldENsYXNzTmFtZSgpLmVxdWFscygiamF2YS5sYW5nLk9iamVjdCIpKSB7Ci0gICAgICAgICAgICBoaWVyYXJjaHlNYXAucHV0KHN1cGVyREJDLmdldENsYXNzTmFtZSgpLCBJbnRlZ2VyLnZhbHVlT2YoaSkpOwotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJQdXR0aW5nIGNsYXNzOiAiICsgc3VwZXJEQkMuZ2V0Q2xhc3NOYW1lKCkgKyAiIGF0IGhpZXJhcmNoeSByYW5rOiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgIGkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgc3VwZXJEQkMgPSBkYmNNYXAuZ2V0KHN1cGVyREJDLmdldFN1cGVyQ2xhc3NOYW1lKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBoaWVyYXJjaHlNYXA7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIGRyaXZlcyB0aGUgZXN0YWJsaXNobWVudCBvZiB0aGUgaGllcmFyY2h5IG9mIGludGVyZmFjZXMgZm9yIGFuIFNFSS4KLSAgICAgKi8KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIEludGVnZXI+IGdldEludGVyZmFjZUhpZXJhcmNoeShEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgZGJjKSB7Ci0gICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIkdldHRpbmcgaW50ZXJmYWNlIGhpZXJhcmNoeSBmb3I6ICIgKyBkYmMuZ2V0Q2xhc3NOYW1lKCkpOwotICAgICAgICB9Ci0gICAgICAgIE1hcDxTdHJpbmcsIEludGVnZXI+IGhpZXJhcmNoeU1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4oKTsKLSAgICAgICAgaGllcmFyY2h5TWFwLnB1dChkYmMuZ2V0Q2xhc3NOYW1lKCksIDApOwotICAgICAgICByZXR1cm4gZ2V0SW50ZXJmYWNlSGllcmFyY2h5KGRiYy5nZXRJbnRlcmZhY2VzTGlzdCgpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWVyYXJjaHlNYXAsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlY3Vyc2l2ZSBtZXRob2QgdGhhdCBidWlsZHMgdGhlIGhpZXJhcmNoeSBvZiBpbnRlcmZhY2VzLiBUaGlzIGJlZ2lucyB3aXRoIGFuCi0gICAgICogU0VJIGFuZCB3YWxrcyBhbGwgb2YgaXRzIHN1cGVyIGludGVyZmFjZXMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBJbnRlZ2VyPiBnZXRJbnRlcmZhY2VIaWVyYXJjaHkoTGlzdDxTdHJpbmc+IGludGVyZmFjZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIEludGVnZXI+IGhpZXJhcmNoeU1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxldmVsKSB7Ci0gICAgICAgIEhhc2hNYXA8U3RyaW5nLCBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGU+IGRiY01hcCA9IGdldEVuZHBvaW50RGVzY3JpcHRpb25JbXBsKCkuCi0gICAgICAgICAgICBnZXRTZXJ2aWNlRGVzY3JpcHRpb25JbXBsKCkuZ2V0REJDTWFwKCk7Ci0gICAgICAgIAotICAgICAgICAvLyB3YWxrIHRocm91Z2ggYWxsIG9mIHRoZSBpbnRlcmZhY2VzCi0gICAgICAgIGlmKGludGVyZmFjZXMgIT0gbnVsbAotICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgICAgIWludGVyZmFjZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBmb3IoU3RyaW5nIGludGVyZmF6ZSA6IGludGVyZmFjZXMpIHsKLSAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgaW50ZXJEQkMgPSBkYmNNYXAuZ2V0KGludGVyZmF6ZSk7Ci0gICAgICAgICAgICAgICAgaWYoaW50ZXJEQkMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJJbnNlcnRpbmcgc3VwZXIgaW50ZXJmYWNlICIgKyBpbnRlckRCQy5nZXRDbGFzc05hbWUoKSArIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgYXQgbGV2ZWwgIiArIGxldmVsKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBoaWVyYXJjaHlNYXAucHV0KGludGVyREJDLmdldENsYXNzTmFtZSgpLCBsZXZlbCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRJbnRlcmZhY2VIaWVyYXJjaHkoaW50ZXJEQkMuZ2V0SW50ZXJmYWNlc0xpc3QoKSwgaGllcmFyY2h5TWFwLCBsZXZlbCsrKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGhpZXJhcmNoeU1hcDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGxvb3AgdGhyb3VnaCBlYWNoIG1ldGhvZCB0aGF0IHdhcyBwcmV2aW91c2x5IGRldGVybWluZWQgYXMgYmVpbmcgcmVsZXZhbnQgdG8KLSAgICAgKiB0aGUgY3VycmVudCBjb21wb3NpdGUuIEl0IHdpbGwgdGhlbiBkcml2ZSB0aGUgY2FsbCB0byBkZXRlcm1pbmUgaWYgdGhpcyByZXByZXNlbnRzIGEgbWV0aG9kCi0gICAgICogdGhhdCBoYXMgYmVlbiBvdmVycmlkZGVuLiBJZiBpdCByZXByZXNlbnRzIGFuIG92ZXJyaWRpbmcgbWV0aG9kIGRlY2xhcmF0aW9uIGl0IHdpbGwgcmVtb3ZlCi0gICAgICogdGhlIGluaGVyaXRlZCBtZXRob2RzIGZyb20gdGhlIGxpc3QgbGVhdmluZyBvbmx5IHRoZSBtb3N0IGJhc2ljIG1ldGhvZCBkZWNsYXJhdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXRob2RMaXN0IC0gPGNvZGU+QXJyYXlMaXN0PC9jb2RlPiBsaXN0IG9mIHJlbGV2YW50IG1ldGhvZHMKLSAgICAgKiBAcGFyYW0gZGJjICAgICAgICAtIDxjb2RlPkRlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZTwvY29kZT4gY3VycmVudCBjb21wb3NpdGUKLSAgICAgKiBAcmV0dXJuIC0gPGNvZGU+QXJyYXlMaXN0PC9jb2RlPgotICAgICAqLwotICAgIHByaXZhdGUgQXJyYXlMaXN0PE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlPiByZW1vdmVPdmVycmlkZGVuTWV0aG9kcygKLSAgICAgICAgICAgIEFycmF5TGlzdDxNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZT4KLSAgICAgICAgICAgICAgICAgICAgbWV0aG9kTGlzdCwgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIGRiYykgewotICAgICAgICBNYXA8U3RyaW5nLCBJbnRlZ2VyPiBoaWVyYXJjaHlNYXAgPSBkYmMuaXNJbnRlcmZhY2UoKSA/IGdldEludGVyZmFjZUhpZXJhcmNoeShkYmMpIDogCi0gICAgICAgICAgICBnZXRDbGFzc0hpZXJhcmNoeShkYmMpOwotICAgICAgICBBcnJheUxpc3Q8TWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGU+IHJldHVybk1ldGhvZHMgPQotICAgICAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8TWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGU+KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kTGlzdC5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgaWYgKG5vdEZvdW5kKHJldHVybk1ldGhvZHMsIG1ldGhvZExpc3QuZ2V0KGkpKSkgewotICAgICAgICAgICAgICAgIHJldHVybk1ldGhvZHMuYWRkKGdldEJhc2VNZXRob2QobWV0aG9kTGlzdC5nZXQoaSksIGksIG1ldGhvZExpc3QsIGhpZXJhcmNoeU1hcCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldHVybk1ldGhvZHM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2Qgd2lsbCBsb29wIHRocm91Z2ggZWFjaCBtZXRob2Qgd2UgaGF2ZSBhbHJlYWR5IGlkZW50aWZpZWQgYXMgYSBiYXNlIG1ldGhvZCBhbmQKLSAgICAgKiBjb21wYXJlIHRoZSBjdXJyZW50IG1ldGhvZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtZGNMaXN0IC0gPGNvZGU+QXJyYXlMaXN0PC9jb2RlPiBpZGVudGlmaWVkIGJhc2UgbWV0aG9kcwotICAgICAqIEBwYXJhbSBtZGMgICAgIC0gPGNvZGU+TWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGU8L2NvZGU+IGN1cnJlbnQgbWV0aG9kCi0gICAgICogQHJldHVybiAtIGJvb2xlYW4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gbm90Rm91bmQoQXJyYXlMaXN0PE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlPiBtZGNMaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSBtZGMpIHsKLSAgICAgICAgZm9yIChNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSBtZXRob2QgOiBtZGNMaXN0KSB7Ci0gICAgICAgICAgICBpZiAobWRjLmNvbXBhcmUobWV0aG9kKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCBpcyByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIG1vc3QgYmFzaWMgbGV2ZWwgb2YgYSBtZXRob2QgZGVjbGFyYXRpb24gaW4KLSAgICAgKiB0aGUgPGNvZGU+RGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlPC9jb2RlPiBoaWVyYXJjaHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWRjICAgICAgICAgIC0gPGNvZGU+TWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGU8L2NvZGU+IGN1cnJlbnQgbWV0aG9kCi0gICAgICogQHBhcmFtIGluZGV4ICAgICAgICAtIDxjb2RlPmludDwvY29kZT4gY3VycmVudCBsb2NhdGlvbiBpbiBtZXRob2QgbGlzdAotICAgICAqIEBwYXJhbSBtZXRob2RMaXN0ICAgLSA8Y29kZT5MaXN0PC9jb2RlPiBsaXN0IG9mIG1ldGhvZHMgYXZhaWxhYmxlIG9uIHRoaXMgY29tcG9zaXRlCi0gICAgICogQHBhcmFtIGhpZXJhcmNoeU1hcCAtIDxjb2RlPkhhc2hNYXA8L2NvZGU+IG1hcCB0aGF0IHJlcHJlc2VudHMgdGhlIGhpZXJhcmNoeSBvZiB0aGUgY3VycmVudAotICAgICAqICAgICAgICAgICAgICAgICAgICAgPGNvZGU+RGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlPC9jb2RlPgotICAgICAqIEByZXR1cm4gLSA8Y29kZT5NZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZTwvY29kZT4gbW9zdCBiYXNpYyBtZXRob2QgZGVjbGFyYXRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSBnZXRCYXNlTWV0aG9kKE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlIG1kYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5TGlzdDxNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZT4gbWV0aG9kTGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIEludGVnZXI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZXJhcmNoeU1hcCkgewotICAgICAgICBpbnQgYmFzZUxldmVsID0gaGllcmFyY2h5TWFwLmdldChtZGMuZ2V0RGVjbGFyaW5nQ2xhc3MoKSk7Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJCYXNlIG1ldGhvZDogIiArIG1kYy5nZXRNZXRob2ROYW1lKCkgKyAiIGluaXRpYWwgbGV2ZWw6ICIgKyBiYXNlTGV2ZWwpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoOyBpbmRleCA8IG1ldGhvZExpc3Quc2l6ZSgpOyBpbmRleCsrKSB7Ci0gICAgICAgICAgICBNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSBjb21wYXJlTURDID0gbWV0aG9kTGlzdC5nZXQoaW5kZXgpOwotICAgICAgICAgICAgLy8gSWYgdGhlIHR3byBtZXRob2RzIGFyZSB0aGUgc2FtZSBtZXRob2QgdGhhdCBtZWFucyB3ZSBoYXZlIGZvdW5kIGFuIGluaGVyaXRlZAotICAgICAgICAgICAgLy8gb3ZlcnJpZGRlbiBjYXNlCi0gICAgICAgICAgICBpZiAobWRjLmVxdWFscyhjb21wYXJlTURDKSkgewotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkZvdW5kIGVxdWl2YWxlbnQgbWV0aG9kczogIiArIG1kYy5nZXRNZXRob2ROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIGRlY2xhcmF0aW9uIGxldmVsIG9mIHRoZSBtZXRob2Qgd2UgYXJlIGNvbXBhcmluZyB0bwotICAgICAgICAgICAgICAgIGludCBjb21wYXJlTGV2ZWwgPSBoaWVyYXJjaHlNYXAuZ2V0KGNvbXBhcmVNREMuZ2V0RGVjbGFyaW5nQ2xhc3MoKSk7Ci0gICAgICAgICAgICAgICAgLy8gaWYgdGhlIG1ldGhvZCB3YXMgZGVjbGFyZWQgYnkgYSBjbGFzcyBpbiBhIGxvd2VyIGxldmVsIG9mIHRoZSBoaWVyYXJjaHkgaXQKLSAgICAgICAgICAgICAgICAvLyBiZWNvbWVzIHRoZSBtZXRob2QgdGhhdCB3ZSB3aWxsIGNvbXBhcmUgb3RoZXIgbWV0aG9kcyB0bwotICAgICAgICAgICAgICAgIGlmIChjb21wYXJlTGV2ZWwgPCBiYXNlTGV2ZWwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkZvdW5kIG1ldGhvZCBsb3dlciBpbiBoaWVyYXJjaHkgY2hhaW46ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJlTURDLmdldE1ldGhvZE5hbWUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgb2YgY2xhc3M6ICIgKyBjb21wYXJlTURDLmdldE1ldGhvZE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbWRjID0gY29tcGFyZU1EQzsKLSAgICAgICAgICAgICAgICAgICAgYmFzZUxldmVsID0gY29tcGFyZUxldmVsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbWRjOwotICAgIH0KLQotICAgIC8qCi0gICAgKiBUaGlzIGlzIGNhbGxlZCB3aGVuIHdlIGtub3cgdGhhdCB0aGlzIERCQyBpcyBhbiBpbXBsaWNpdCBTRUkKLSAgICAqLwotICAgIHByaXZhdGUgQXJyYXlMaXN0PE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlPiByZXRyaWV2ZUltcGxpY2l0U0VJTWV0aG9kcygKLSAgICAgICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBkYmMpIHsKLQotICAgICAgICBBcnJheUxpc3Q8TWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGU+IHJldHJpZXZlTGlzdCA9Ci0gICAgICAgICAgICAgICAgbmV3IEFycmF5TGlzdDxNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZT4oKTsKLQotICAgICAgICByZXRyaWV2ZUxpc3QgPSBEZXNjcmlwdGlvblV0aWxzLmdldE1ldGhvZHNXaXRoRmFsc2VFeGNsdXNpb25zKGRiYyk7Ci0KLSAgICAgICAgLy9JZiB0aGlzIGxpc3QgaXMgZW1wdHksIHRoZW4gdGhlcmUgYXJlIG5vIGZhbHNlIGV4Y2x1c2lvbnMsIHNvIGdhdGhlcgotICAgICAgICAvL2FsbCBjb21wb3NpdGVzIHRoYXQgZG9uJ3QgaGF2ZSBleGNsdWRlID09IHRydWUKLSAgICAgICAgLy9JZiB0aGUgbGlzdCBpcyBub3QgZW1wdHksIHRoZW4gaXQgbWVhbnMgd2UgZm91bmQgYXQgbGVhc3Qgb25lIG1ldGhvZCB3aXRoICdleGNsdWRlPT1mYWxzZScKLSAgICAgICAgLy9zbyB0aGUgbGlzdCBzaG91bGQgY29udGFpbiBvbmx5IHRob3NlIG1ldGhvZHMKLSAgICAgICAgaWYgKHJldHJpZXZlTGlzdCA9PSBudWxsIHx8IHJldHJpZXZlTGlzdC5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgSXRlcmF0b3I8TWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGU+IGl0ZXIgPSBudWxsOwotICAgICAgICAgICAgTGlzdDxNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZT4gbWRjTGlzdCA9IGRiYy5nZXRNZXRob2REZXNjcmlwdGlvbnNMaXN0KCk7Ci0KLSAgICAgICAgICAgIGlmIChtZGNMaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpdGVyID0gZGJjLmdldE1ldGhvZERlc2NyaXB0aW9uc0xpc3QoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICBNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSBtZGMgPSBpdGVyLm5leHQoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoIURlc2NyaXB0aW9uVXRpbHMuaXNFeGNsdWRlVHJ1ZShtZGMpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZGMuc2V0RGVjbGFyaW5nQ2xhc3MoZGJjLmdldENsYXNzTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHJpZXZlTGlzdC5hZGQobWRjKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXRyaWV2ZUxpc3Q7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBBcnJheUxpc3Q8TWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGU+IHJldHJpZXZlU0VJTWV0aG9kcygKLSAgICAgICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBkYmMpIHsKLQotICAgICAgICAvL1J1bGVzIGZvciByZXRyaWV2aW5nIE1ldGhvZHMgb24gYW4gU0VJIChvciBhIHN1cGVyY2xhc3Mgb2YgYW4gU0VJKSBhcmUgc2ltcGxlCi0gICAgICAgIC8vSnVzdCByZXRyaWV2ZSBhbGwgbWV0aG9kcyByZWdhcmRsZXNzIG9mIFdlYk1ldGhvZCBhbm5vdGF0aW9ucwotICAgICAgICBBcnJheUxpc3Q8TWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGU+IHJldHJpZXZlTGlzdCA9Ci0gICAgICAgICAgICAgICAgbmV3IEFycmF5TGlzdDxNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZT4oKTsKLQotICAgICAgICBJdGVyYXRvcjxNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZT4gaXRlciA9IG51bGw7Ci0gICAgICAgIExpc3Q8TWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGU+IG1kY0xpc3QgPSBkYmMuZ2V0TWV0aG9kRGVzY3JpcHRpb25zTGlzdCgpOwotCi0gICAgICAgIGlmIChtZGNMaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGl0ZXIgPSBkYmMuZ2V0TWV0aG9kRGVzY3JpcHRpb25zTGlzdCgpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSBtZGMgPSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBtZGMuc2V0RGVjbGFyaW5nQ2xhc3MoZGJjLmdldENsYXNzTmFtZSgpKTsKLSAgICAgICAgICAgICAgICByZXRyaWV2ZUxpc3QuYWRkKG1kYyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmV0cmlldmVMaXN0OwotICAgIH0KLQotICAgIHByaXZhdGUgQXJyYXlMaXN0PE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlPiByZXRyaWV2ZVNFSU1ldGhvZHNDaGFpbigKLSAgICAgICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSB0bXBEQkMpIHsKLQotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgZGJjID0gdG1wREJDOwotICAgICAgICBBcnJheUxpc3Q8TWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGU+IHJldHJpZXZlTGlzdCA9Ci0gICAgICAgICAgICAgICAgbmV3IEFycmF5TGlzdDxNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZT4oKTsKLQotICAgICAgICByZXRyaWV2ZUxpc3QgPSByZXRyaWV2ZVNFSU1ldGhvZHMoZGJjKTsKLQotICAgICAgICAvL1NpbmNlIHRoaXMgaXMgYW4gaW50ZXJmYWNlLCBhbnl0aGluZyB0aGF0IGlzIGluIHRoZSBleHRlbmRzIGNsYXVzZSB3aWxsIGFjdHVhbGx5IGFwcGVhcgotICAgICAgICAvLyBpbiB0aGUgaW50ZXJmYWNlcyBsaXN0IGluc3RlYWQuCi0gICAgICAgIEl0ZXJhdG9yPFN0cmluZz4gaXRlciA9IG51bGw7Ci0gICAgICAgIExpc3Q8U3RyaW5nPiBpbnRlcmZhY2VzTGlzdCA9IGRiYy5nZXRJbnRlcmZhY2VzTGlzdCgpOwotICAgICAgICBpZiAoaW50ZXJmYWNlc0xpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgaXRlciA9IGRiYy5nZXRJbnRlcmZhY2VzTGlzdCgpLml0ZXJhdG9yKCk7Ci0KLSAgICAgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCi0gICAgICAgICAgICAgICAgU3RyaW5nIGludGVyZmFjZU5hbWUgPSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgc3VwZXJJbnRlcmZhY2UgPQotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RW5kcG9pbnREZXNjcmlwdGlvbkltcGwoKS5nZXRTZXJ2aWNlRGVzY3JpcHRpb25JbXBsKCkuZ2V0REJDTWFwKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldChpbnRlcmZhY2VOYW1lKTsKLQotICAgICAgICAgICAgICAgIHJldHJpZXZlTGlzdC5hZGRBbGwocmV0cmlldmVTRUlNZXRob2RzQ2hhaW4oc3VwZXJJbnRlcmZhY2UpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXRyaWV2ZUxpc3Q7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBEZWZpbml0aW9uIGdldFdTRExEZWZpbml0aW9uKCkgewotICAgICAgICByZXR1cm4gKChTZXJ2aWNlRGVzY3JpcHRpb25XU0RMKWdldEVuZHBvaW50RGVzY3JpcHRpb24oKS5nZXRTZXJ2aWNlRGVzY3JpcHRpb24oKSkKLSAgICAgICAgICAgICAgICAuZ2V0V1NETERlZmluaXRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUG9ydFR5cGUgZ2V0V1NETFBvcnRUeXBlKCkgewotICAgICAgICBQb3J0VHlwZSBwb3J0VHlwZSA9IG51bGw7Ci0vLyAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbldTREwgZW5kcG9pbnREZXNjV1NETCA9IChFbmRwb2ludERlc2NyaXB0aW9uV1NETCkgZ2V0RW5kcG9pbnREZXNjcmlwdGlvbigpOwotLy8gICAgICAgIEJpbmRpbmcgd3NkbEJpbmRpbmcgPSBlbmRwb2ludERlc2NXU0RMLmdldFdTRExCaW5kaW5nKCk7Ci0vLyAgICAgICAgaWYgKHdzZGxCaW5kaW5nICE9IG51bGwpIHsKLS8vICAgICAgICAgICAgcG9ydFR5cGUgPSB3c2RsQmluZGluZy5nZXRQb3J0VHlwZSgpOwotLy8gICAgICAgIH0KLSAgICAgICAgRGVmaW5pdGlvbiB3c2RsRGVmbiA9IGdldFdTRExEZWZpbml0aW9uKCk7Ci0gICAgICAgIGlmICh3c2RsRGVmbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgdG5zID0gZ2V0RW5kcG9pbnREZXNjcmlwdGlvbigpLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgICAgICAgU3RyaW5nIGxvY2FsUGFydCA9IGdldEVuZHBvaW50RGVzY3JpcHRpb24oKS5nZXROYW1lKCk7Ci0gICAgICAgICAgICBpZiAobG9jYWxQYXJ0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBwb3J0VHlwZSA9IHdzZGxEZWZuLmdldFBvcnRUeXBlKG5ldyBRTmFtZSh0bnMsIGxvY2FsUGFydCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwb3J0VHlwZTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0TmFtZXNwYWNlKCkgewotICAgICAgICByZXR1cm4gZ2V0QW5ub1dlYlNlcnZpY2VUYXJnZXROYW1lc3BhY2UoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgV2ViU2VydmljZSBnZXRBbm5vV2ViU2VydmljZSgpIHsKLSAgICAgICAgaWYgKHdlYlNlcnZpY2VBbm5vdGF0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgIHdlYlNlcnZpY2VBbm5vdGF0aW9uID0gZGJjLmdldFdlYlNlcnZpY2VBbm5vdCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB3ZWJTZXJ2aWNlQW5ub3RhdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEFubm9XZWJTZXJ2aWNlVGFyZ2V0TmFtZXNwYWNlKCkgewotICAgICAgICBpZiAod2ViU2VydmljZVRhcmdldE5hbWVzcGFjZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoZ2V0QW5ub1dlYlNlcnZpY2UoKSAhPSBudWxsCi0gICAgICAgICAgICAgICAgICAgICYmICFEZXNjcmlwdGlvblV0aWxzLmlzRW1wdHkoZ2V0QW5ub1dlYlNlcnZpY2UoKS50YXJnZXROYW1lc3BhY2UoKSkpIHsKLSAgICAgICAgICAgICAgICB3ZWJTZXJ2aWNlVGFyZ2V0TmFtZXNwYWNlID0gZ2V0QW5ub1dlYlNlcnZpY2UoKS50YXJnZXROYW1lc3BhY2UoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gRGVmYXVsdCB2YWx1ZSBwZXIgSlNSLTE4MSBNUiBTZWMgNC4xIHBnIDE1IGRlZmVycyB0byAiSW1wbGVtZW50YXRpb24gZGVmaW5lZCwgCi0gICAgICAgICAgICAgICAgLy8gYXMgZGVzY3JpYmVkIGluIEpBWC1XUyAyLjAsIHNlY3Rpb24gMy4yIiB3aGljaCBpcyBKQVgtV1MgMi4wIFNlYyAzLjIsIHBnIDI5LgotICAgICAgICAgICAgICAgIHdlYlNlcnZpY2VUYXJnZXROYW1lc3BhY2UgPQotICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvblV0aWxzLm1ha2VOYW1lc3BhY2VGcm9tUGFja2FnZU5hbWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb25VdGlscy5nZXRKYXZhUGFja2FnZU5hbWUoZGJjLmdldENsYXNzTmFtZSgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB3ZWJTZXJ2aWNlVGFyZ2V0TmFtZXNwYWNlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QW5ub1dlYlNlcnZpY2VOYW1lKCkgewotICAgICAgICBpZiAod2ViU2VydmljZV9OYW1lID09IG51bGwpIHsKLQotICAgICAgICAgICAgaWYgKGdldEFubm9XZWJTZXJ2aWNlKCkgIT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAmJiAhRGVzY3JpcHRpb25VdGlscy5pc0VtcHR5KGdldEFubm9XZWJTZXJ2aWNlKCkubmFtZSgpKSkgewotICAgICAgICAgICAgICAgIHdlYlNlcnZpY2VfTmFtZSA9IGdldEFubm9XZWJTZXJ2aWNlKCkubmFtZSgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBQZXIgdGhlIEpTUiAxODEgU3BlY2lmaWNhdGlvbiwgdGhlIGRlZmF1bHQKLSAgICAgICAgICAgICAgICAvLyBpcyB0aGUgc2ltcGxlIG5hbWUgb2YgdGhlIGNsYXNzLgotICAgICAgICAgICAgICAgIHdlYlNlcnZpY2VfTmFtZSA9IERlc2NyaXB0aW9uVXRpbHMuZ2V0U2ltcGxlSmF2YUNsYXNzTmFtZShkYmMuZ2V0Q2xhc3NOYW1lKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB3ZWJTZXJ2aWNlX05hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gZ2V0QW5ub1dlYlNlcnZpY2VOYW1lKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFFOYW1lIGdldFBvcnRUeXBlKCkgewotICAgICAgICBTdHJpbmcgbmFtZSA9IGdldE5hbWUoKTsKLSAgICAgICAgU3RyaW5nIHRucyA9IGdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgICByZXR1cm4gbmV3IFFOYW1lKHRucywgbmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIG5ld2xpbmUgPSAiXG4iOwotICAgICAgICBmaW5hbCBTdHJpbmcgc2FtZWxpbmUgPSAiOyAiOwotICAgICAgICBTdHJpbmdCdWZmZXIgc3RyaW5nID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZChzdXBlci50b1N0cmluZygpKTsKLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQobmV3bGluZSk7Ci0gICAgICAgICAgICBzdHJpbmcuYXBwZW5kKCJOYW1lOiAiICsgZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQoc2FtZWxpbmUpOwotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZCgiUG9ydFR5cGU6ICIgKyBnZXRQb3J0VHlwZSgpKTsKLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICBzdHJpbmcuYXBwZW5kKG5ld2xpbmUpOwotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZCgiU09BUCBTdHlsZTogIiArIGdldFNvYXBCaW5kaW5nU3R5bGUoKSk7Ci0gICAgICAgICAgICBzdHJpbmcuYXBwZW5kKHNhbWVsaW5lKTsKLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQoIlNPQVAgVXNlOiAiICsgZ2V0U29hcEJpbmRpbmdVc2UoKSk7Ci0gICAgICAgICAgICBzdHJpbmcuYXBwZW5kKHNhbWVsaW5lKTsKLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQoIlNPQVAgUGFyYW1hdGVyIFN0eWxlOiAiICsgZ2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpKTsKLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICBzdHJpbmcuYXBwZW5kKG5ld2xpbmUpOwotICAgICAgICAgICAgT3BlcmF0aW9uRGVzY3JpcHRpb25bXSBvcGVyYXRpb25zID0gZ2V0T3BlcmF0aW9ucygpOwotICAgICAgICAgICAgaWYgKG9wZXJhdGlvbnMgIT0gbnVsbCAmJiBvcGVyYXRpb25zLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgICAgICBzdHJpbmcuYXBwZW5kKCJOdW1iZXIgb2Ygb3BlcmF0aW9uczogIiArIG9wZXJhdGlvbnMubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBmb3IgKE9wZXJhdGlvbkRlc2NyaXB0aW9uIG9wZXJhdGlvbiA6IG9wZXJhdGlvbnMpIHsKLSAgICAgICAgICAgICAgICAgICAgc3RyaW5nLmFwcGVuZChuZXdsaW5lKTsKLSAgICAgICAgICAgICAgICAgICAgc3RyaW5nLmFwcGVuZCgiT3BlcmF0aW9uOiAiICsgb3BlcmF0aW9uLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc3RyaW5nLmFwcGVuZCgiT3BlcmF0aW9uRGVzY3JpcHRpb24gYXJyYXkgaXMgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkgewotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZChuZXdsaW5lKTsKLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQoIkNvbXBsZXRlIGRlYnVnIGluZm9ybWF0aW9uIG5vdCBjdXJyZW50bHkgYXZhaWxhYmxlIGZvciAiICsKLSAgICAgICAgICAgICAgICAgICAgIkVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24iKTsKLSAgICAgICAgICAgIHJldHVybiBzdHJpbmcudG9TdHJpbmcoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RyaW5nLnRvU3RyaW5nKCk7Ci0gICAgfQotICAgIC8qKgotICAgICAqIEdldCBhbiBhbm5vdGF0aW9uLiAgVGhpcyBpcyB3cmFwcGVyZWQgdG8gYXZvaWQgYSBKYXZhMlNlY3VyaXR5IHZpb2xhdGlvbi4KLSAgICAgKiBAcGFyYW0gY2xzIENsYXNzIHRoYXQgY29udGFpbnMgYW5ub3RhdGlvbiAKLSAgICAgKiBAcGFyYW0gYW5ub3RhdGlvbiBDbGFzcyBvZiByZXF1cmVzdGVkIEFubm90YXRpb24KLSAgICAgKiBAcmV0dXJuIGFubm90YXRpb24gb3IgbnVsbAotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbihmaW5hbCBDbGFzcyBjbHMsIGZpbmFsIENsYXNzIGFubm90YXRpb24pIHsKLSAgICAgICAgcmV0dXJuIChBbm5vdGF0aW9uKSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEFjdGlvbigpIHsKLSAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgewotICAgICAgICAgICAgICAgIHJldHVybiBjbHMuZ2V0QW5ub3RhdGlvbihhbm5vdGF0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vaW1wbC9GYXVsdERlc2NyaXB0aW9uSW1wbC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vaW1wbC9GYXVsdERlc2NyaXB0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAyMjE3Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2ltcGwvRmF1bHREZXNjcmlwdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5pbXBsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5GYXVsdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRmF1bHREZXNjcmlwdGlvbkphdmE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5GYXVsdERlc2NyaXB0aW9uV1NETDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLk9wZXJhdGlvbkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5EZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLk1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlOwotCi1pbXBvcnQgamF2YXgueG1sLndzLldlYkZhdWx0OwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi0KLS8qKiBAc2VlIC4uL0ZhdWx0RGVzY3JpcHRpb24gKi8KLQotCi1jbGFzcyBGYXVsdERlc2NyaXB0aW9uSW1wbCBpbXBsZW1lbnRzIEZhdWx0RGVzY3JpcHRpb24sIEZhdWx0RGVzY3JpcHRpb25KYXZhLCBGYXVsdERlc2NyaXB0aW9uV1NETCB7Ci0KLSAgICBwcml2YXRlIENsYXNzIGV4Y2VwdGlvbkNsYXNzOwotICAgIHByaXZhdGUgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIGNvbXBvc2l0ZTsKLSAgICBwcml2YXRlIFdlYkZhdWx0IGFubm90YXRpb247Ci0gICAgcHJpdmF0ZSBPcGVyYXRpb25EZXNjcmlwdGlvbiBwYXJlbnQ7Ci0KLQotICAgIHByaXZhdGUgU3RyaW5nIG5hbWUgPSAiIjsgIC8vIFdlYkZhdWx0Lm5hbWUKLSAgICBwcml2YXRlIFN0cmluZyBmYXVsdEJlYW4gPSAiIjsgIC8vIFdlYkZhdWx0LmZhdWx0QmVhbgotICAgIHByaXZhdGUgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9ICIiOyAvLyBXZWJGYXVsdC50YXJnZXROYW1lc3BhY2UKLSAgICBwcml2YXRlIFN0cmluZyBmYXVsdEluZm8gPSBudWxsOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZBVUxUID0gIkZhdWx0IjsKLQotCi0gICAgLyoqCi0gICAgICogVGhlIEZhdWx0RGVzY3JpcHRpb25JbXBsIGNsYXNzIHdpbGwgb25seSBiZSB1c2VkIHRvIGRlc2NyaWJlIGV4Y2VwdGlvbnMgZGVjbGFyZWQgdG8gYmUgdGhyb3duCi0gICAgICogYnkgYSBzZXJ2aWNlIHRoYXQgaGFzIGEgV2ViRmF1bHQgYW5ub3RhdGlvbi4gIE5vIGdlbmVyaWMgZXhjZXB0aW9uIHNob3VsZCBldmVyIGhhdmUgYQotICAgICAqIEZhdWx0RGVzY3JpcHRpb24gYXNzb2NpYXRlZCB3aXRoIGl0LiAgSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSB1c2VyIG9mIHRoZQotICAgICAqIEZhdWx0RGVzY3JpcHRpb25JbXBsIGNsYXNzIHRvIGF2b2lkIGluc3RhbnRpYXRpbmcgdGhpcyBvYmplY3QgZm9yIG5vbi1hbm5vdGF0ZWQgZ2VuZXJpYwotICAgICAqIGV4Y2VwdGlvbnMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZXhjZXB0aW9uQ2xhc3MgYW4gZXhjZXB0aW9uIGRlY2xhcmVkIHRvIGJlIHRocm93biBieSB0aGUgc2VydmljZSBvbiB3aGljaCB0aGlzCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgIEZhdWx0RGVzY3JpcHRpb24gbWF5IGFwcGx5LgotICAgICAqIEBwYXJhbSBiZWFuTmFtZSAgICAgICBmdWxseSBxdWFsaWZpZWQgcGFja2FnZStjbGFzc25hbWUgb2YgdGhlIGJlYW4gYXNzb2NpYXRlZCB3aXRoIHRoaXMKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uCi0gICAgICogQHBhcmFtIGFubm90YXRpb24gICAgIHRoZSBXZWJGYXVsdCBhbm5vdGF0aW9uIG9iamVjdCBvbiB0aGlzIGV4Y2VwdGlvbiBjbGFzcwotICAgICAqIEBwYXJhbSBwYXJlbnQgICAgICAgICB0aGUgT3BlcmF0aW9uRGVzY3JpcHRpb24gdGhhdCBpcyB0aGUgcGFyZW50IG9mIHRoaXMgRmF1bHREZXNjcmlwdGlvbgotICAgICAqLwotICAgIEZhdWx0RGVzY3JpcHRpb25JbXBsKENsYXNzIGV4Y2VwdGlvbkNsYXNzLCBXZWJGYXVsdCBhbm5vdGF0aW9uLCBPcGVyYXRpb25EZXNjcmlwdGlvbiBwYXJlbnQpIHsKLSAgICAgICAgdGhpcy5leGNlcHRpb25DbGFzcyA9IGV4Y2VwdGlvbkNsYXNzOwotICAgICAgICB0aGlzLmFubm90YXRpb24gPSBhbm5vdGF0aW9uOwotICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKLSAgICB9Ci0KLSAgICBGYXVsdERlc2NyaXB0aW9uSW1wbChEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgZmF1bHREQkMsIE9wZXJhdGlvbkRlc2NyaXB0aW9uIHBhcmVudCkgewotICAgICAgICB0aGlzLmNvbXBvc2l0ZSA9IGZhdWx0REJDOwotICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgV2ViRmF1bHQgZ2V0QW5ub1dlYkZhdWx0KCkgewotCi0gICAgICAgIGlmIChhbm5vdGF0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChpc0RCQygpKSB7Ci0gICAgICAgICAgICAgICAgYW5ub3RhdGlvbiA9IHRoaXMuY29tcG9zaXRlLmdldFdlYkZhdWx0QW5ub3QoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBhbm5vdGF0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXhjZXB0aW9uQ2xhc3NOYW1lKCkgewotICAgICAgICBpZiAoIWlzREJDKCkpIHsKLSAgICAgICAgICAgIC8vIG5vIG5lZWQgZm9yIGRlZmF1bHRzIGhlcmUuICBUaGUgZXhjZXB0aW9uQ2xhc3Mgc3RvcmVkIGluIHRoaXMKLSAgICAgICAgICAgIC8vIEZhdWx0RGVzY3JpcHRpb24gb2JqZWN0IGlzIG9uZSB0aGF0IGhhcyBiZWVuIGRlY2xhcmVkIHRvIGJlCi0gICAgICAgICAgICAvLyB0aHJvd24gZnJvbSB0aGUgc2VydmljZSBtZXRob2QKLSAgICAgICAgICAgIHJldHVybiBleGNlcHRpb25DbGFzcy5nZXROYW1lKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gY29tcG9zaXRlLmdldENsYXNzTmFtZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRGYXVsdEluZm8oKSB7Ci0gICAgICAgIGlmIChmYXVsdEluZm8gIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGZhdWx0SW5mbzsKLSAgICAgICAgfQotICAgICAgICBpZiAoIWlzREJDKCkpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgTWV0aG9kIG1ldGhvZCA9IGV4Y2VwdGlvbkNsYXNzLmdldE1ldGhvZCgiZ2V0RmF1bHRJbmZvIiwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgZmF1bHRJbmZvID0gbWV0aG9kLmdldFJldHVyblR5cGUoKS5nZXRDYW5vbmljYWxOYW1lKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIFRoaXMgbXVzdCBiZSBhIGxlZ2FjeSBleGNlcHRpb24KLSAgICAgICAgICAgICAgICBmYXVsdEluZm8gPSAiIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlIG1kYyA9Ci0gICAgICAgICAgICAgICAgICAgIGNvbXBvc2l0ZS5nZXRNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSgiZ2V0RmF1bHRJbmZvIiwgMSk7Ci0gICAgICAgICAgICBpZiAobWRjICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmYXVsdEluZm8gPSBtZGMuZ2V0UmV0dXJuVHlwZSgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmYXVsdEluZm8gPSAiIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmF1bHRJbmZvOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmF1bHRCZWFuKCkgewotICAgICAgICBpZiAoZmF1bHRCZWFuICE9IG51bGwgJiYgZmF1bHRCZWFuLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgLy8gUmV0dXJuIHRoZSBmYXVsdEJlYW4gaWYgaXQgd2FzIGFscmVhZHkgY2FsY3VsYXRlZAotICAgICAgICAgICAgcmV0dXJuIGZhdWx0QmVhbjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIExvYWQgdXAgdGhlIFdlYkZhdWx0IGFubm90YXRpb24gYW5kIGdldCB0aGUgZmF1bHRCZWFuLgotICAgICAgICAgICAgLy8gQFdlYkZhdWx0IG1heSBub3QgYmUgcHJlc2VudAotICAgICAgICAgICAgV2ViRmF1bHQgYW5ub3RhdGlvbiA9IGdldEFubm9XZWJGYXVsdCgpOwotCi0gICAgICAgICAgICBpZiAoYW5ub3RhdGlvbiAhPSBudWxsICYmIGFubm90YXRpb24uZmF1bHRCZWFuKCkgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uLmZhdWx0QmVhbigpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgIGZhdWx0QmVhbiA9IGFubm90YXRpb24uZmF1bHRCZWFuKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIFRoZXJlIGlzIG5vIGRlZmF1bHQuICBCdXQgaXQgc2VlbXMgcmVhc29uYWJsZSB0byByZXR1cm4KLSAgICAgICAgICAgICAgICAvLyB0aGUgZmF1bHQgaW5mbyB0eXBlLgotICAgICAgICAgICAgICAgIGZhdWx0QmVhbiA9IGdldEZhdWx0SW5mbygpOwotCi0gICAgICAgICAgICAgICAgLy8gVGhlIGZhdWx0QmVhbiBzdGlsbCBtYXkgYmUgIiIgYXQgdGhpcyBwb2ludC4gIFRoZSBKQVhXUyBydW50aW1lCi0gICAgICAgICAgICAgICAgLy8gaXMgcmVzcG9uc2libGUgZm9yIGZpbmRpbmcvYnVpbGRpbiBhIHJlcHJlc2VudGF0aXZlIGZhdWx0IGJlYW4uCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhdWx0QmVhbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIGlmIChuYW1lLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBMb2FkIHRoZSBhbm5vdGF0aW9uLiBUaGUgYW5ub3RhdGlvbiBtYXkgbm90IGJlIHByZXNlbnQgaW4gV1NHZW4gY2FzZXMKLSAgICAgICAgICAgIFdlYkZhdWx0IGFubm90YXRpb24gPSB0aGlzLmdldEFubm9XZWJGYXVsdCgpOwotICAgICAgICAgICAgaWYgKGFubm90YXRpb24gIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uLm5hbWUoKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBuYW1lID0gYW5ub3RhdGlvbi5uYW1lKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIFRoZSBkZWZhdWx0IGlzIHVuZGVmaW5lZC4KLSAgICAgICAgICAgICAgICAvLyBUaGUgSkFYLVdTIGxheWVyIG1heSB1c2UgdGhlIGZhdWx0IGJlYW4gaW5mb3JtYXRpb24gdG8gZGV0ZXJtaW5lIHRoZSBuYW1lCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRUYXJnZXROYW1lc3BhY2UoKSB7Ci0gICAgICAgIGlmICh0YXJnZXROYW1lc3BhY2UubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gdGFyZ2V0TmFtZXNwYWNlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gTG9hZCB0aGUgYW5ub3RhdGlvbi4gVGhlIGFubm90YXRpb24gbWF5IG5vdCBiZSBwcmVzZW50IGluIFdTR2VuIGNhc2VzCi0gICAgICAgICAgICBXZWJGYXVsdCBhbm5vdGF0aW9uID0gdGhpcy5nZXRBbm5vV2ViRmF1bHQoKTsKLSAgICAgICAgICAgIGlmIChhbm5vdGF0aW9uICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbi50YXJnZXROYW1lc3BhY2UoKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICB0YXJnZXROYW1lc3BhY2UgPSBhbm5vdGF0aW9uLnRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBUaGUgZGVmYXVsdCBpcyB1bmRlZmluZWQKLSAgICAgICAgICAgICAgICAvLyBUaGUgSkFYLVdTIGxheWVyIG1heSB1c2UgdGhlIGZhdWx0IGJlYW4gaW5mb3JtYXRpb24gdG8gZGV0ZXJtaW5lIHRoZSBuYW1lCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRhcmdldE5hbWVzcGFjZTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyBPcGVyYXRpb25EZXNjcmlwdGlvbiBnZXRPcGVyYXRpb25EZXNjcmlwdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIHBhcmVudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB1dGlsaXR5IG1ldGhvZCB0byBnZXQgdGhlIGxhc3QgdG9rZW4gaW4gYSAiLiItZGVsaW1pdGVkIHBhY2thZ2UrY2xhc3NuYW1lIHN0cmluZwotICAgICAqCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRTaW1wbGVOYW1lKFN0cmluZyBpbikgewotICAgICAgICBpZiAoaW4gPT0gbnVsbCB8fCBpbi5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gaW47Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nIG91dCA9IG51bGw7Ci0gICAgICAgIFN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGluLCAiLiIpOwotICAgICAgICBpZiAodG9rZW5pemVyLmNvdW50VG9rZW5zKCkgPT0gMCkKLSAgICAgICAgICAgIG91dCA9IGluOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0gICAgICAgICAgICAgICAgb3V0ID0gdG9rZW5pemVyLm5leHRUb2tlbigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBvdXQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzREJDKCkgewotICAgICAgICBpZiAodGhpcy5jb21wb3NpdGUgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIG5ld2xpbmUgPSAiXG4iOwotICAgICAgICBmaW5hbCBTdHJpbmcgc2FtZWxpbmUgPSAiOyAiOwotICAgICAgICBTdHJpbmdCdWZmZXIgc3RyaW5nID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZChzdXBlci50b1N0cmluZygpKTsKLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQobmV3bGluZSk7Ci0gICAgICAgICAgICBzdHJpbmcuYXBwZW5kKCJFeGNlcHRpb24gY2xhc3M6ICIgKyBnZXRFeGNlcHRpb25DbGFzc05hbWUoKSk7Ci0gICAgICAgICAgICBzdHJpbmcuYXBwZW5kKG5ld2xpbmUpOwotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZCgiTmFtZTogIiArIGdldE5hbWUoKSk7Ci0gICAgICAgICAgICBzdHJpbmcuYXBwZW5kKG5ld2xpbmUpOwotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZCgiTmFtZXNwYWNlOiAiICsgZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZChuZXdsaW5lKTsKLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQoIkZhdWx0QmVhbjogIiArIGdldEZhdWx0QmVhbigpKTsKLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQobmV3bGluZSk7Ci0gICAgICAgICAgICBzdHJpbmcuYXBwZW5kKCJGYXVsdEluZm8gVHlwZSBOYW1lICA6ICIgKyBnZXRGYXVsdEluZm8oKSk7Ci0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQobmV3bGluZSk7Ci0gICAgICAgICAgICBzdHJpbmcuYXBwZW5kKCJDb21wbGV0ZSBkZWJ1ZyBpbmZvcm1hdGlvbiBub3QgY3VycmVudGx5IGF2YWlsYWJsZSBmb3IgIiArCi0gICAgICAgICAgICAgICAgICAgICJGYXVsdERlc2NyaXB0aW9uIik7Ci0gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0cmluZy50b1N0cmluZygpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2ltcGwvSGFuZGxlckNoYWluc1BhcnNlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vaW1wbC9IYW5kbGVyQ2hhaW5zUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjYWExODAuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vaW1wbC9IYW5kbGVyQ2hhaW5zUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmltcGw7Ci0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCQ29udGV4dDsKLWltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLlVubWFyc2hhbGxlcjsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi54bWwuaGFuZGxlci5IYW5kbGVyQ2hhaW5UeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24ueG1sLmhhbmRsZXIuSGFuZGxlckNoYWluc1R5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi54bWwuaGFuZGxlci5IYW5kbGVyVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuWE1MVXRpbHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgSGFuZGxlckNoYWluc1BhcnNlciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQV9FRV9OUyA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFFOYW1lIFFOQU1FX0hBTkRMRVJfQ0hBSU5TID0gbmV3IFFOYW1lKEpBVkFfRUVfTlMsICJoYW5kbGVyLWNoYWlucyIpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFFOYW1lIFFOQU1FX0hBTkRMRVJfQ0hBSU4gPSBuZXcgUU5hbWUoSkFWQV9FRV9OUywgImhhbmRsZXItY2hhaW4iKTsKLSAgICBwcml2YXRlIHN0YXRpYyBKQVhCQ29udGV4dCBjb250ZXh0OwotICAgIAotICAgIHB1YmxpYyBIYW5kbGVyQ2hhaW5zVHlwZSBsb2FkSGFuZGxlckNoYWlucyhJbnB1dFN0cmVhbSBpbikgdGhyb3dzIEV4Y2VwdGlvbiB7ICAgICAgIAotICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IFhNTFV0aWxzLm5ld0RvY3VtZW50KGluKTsKLSAgICAgICAgRWxlbWVudCBlbCA9IGRvY3VtZW50LmdldERvY3VtZW50RWxlbWVudCgpOwotICAgICAgICBpZiAoIUpBVkFfRUVfTlMuZXF1YWxzKGVsLmdldE5hbWVzcGFjZVVSSSgpKSB8fAotICAgICAgICAgICAgISJoYW5kbGVyLWNoYWlucyIuZXF1YWxzKGVsLmdldExvY2FsTmFtZSgpKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKCJVbmV4cGVjdGVkIGVsZW1lbnQgeyIgKyBlbC5nZXROYW1lc3BhY2VVUkkoKSArICJ9IiArIGVsLmdldExvY2FsTmFtZSgpICsgIi4gRXhwZWN0ZWQgIiArIFFOQU1FX0hBTkRMRVJfQ0hBSU5TICsgIiBlbGVtZW50Iik7Ci0gICAgICAgIH0KLQotICAgICAgICBIYW5kbGVyQ2hhaW5zVHlwZSBoYW5kbGVyQ2hhaW5zID0gbmV3IEhhbmRsZXJDaGFpbnNUeXBlKCk7Ci0gICAgICAgIE5vZGUgbm9kZSA9IGVsLmdldEZpcnN0Q2hpbGQoKTsKLSAgICAgICAgd2hpbGUgKG5vZGUgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0gICAgICAgICAgICAgICAgZWwgPSAoRWxlbWVudClub2RlOwotICAgICAgICAgICAgICAgIGlmICghSkFWQV9FRV9OUy5lcXVhbHMoZWwuZ2V0TmFtZXNwYWNlVVJJKCkpIHx8Ci0gICAgICAgICAgICAgICAgICAgICFlbC5nZXRMb2NhbE5hbWUoKS5lcXVhbHMoImhhbmRsZXItY2hhaW4iKSkgeyAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oIlVuZXhwZWN0ZWQgZWxlbWVudCB7IiArIGVsLmdldE5hbWVzcGFjZVVSSSgpICsgIn0iICsgZWwuZ2V0TG9jYWxOYW1lKCkgKyAiLiBFeHBlY3RlZCAiICsgUU5BTUVfSEFORExFUl9DSEFJTiArICIgZWxlbWVudCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBoYW5kbGVyQ2hhaW5zLmdldEhhbmRsZXJDaGFpbigpLmFkZChwcm9jZXNzSGFuZGxlckNoYWluRWxlbWVudChlbCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbm9kZSA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBoYW5kbGVyQ2hhaW5zOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIEhhbmRsZXJDaGFpblR5cGUgcHJvY2Vzc0hhbmRsZXJDaGFpbkVsZW1lbnQoRWxlbWVudCBlbCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEhhbmRsZXJDaGFpblR5cGUgaGFuZGxlciA9IG5ldyBIYW5kbGVyQ2hhaW5UeXBlKCk7Ci0gICAgICAgIE5vZGUgbm9kZSA9IGVsLmdldEZpcnN0Q2hpbGQoKTsKLSAgICAgICAgd2hpbGUgKG5vZGUgIT0gbnVsbCkgewotICAgICAgICAgICAgTm9kZSBjdXIgPSBub2RlOwotICAgICAgICAgICAgbm9kZSA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLSAgICAgICAgICAgIGlmIChjdXIgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0gICAgICAgICAgICAgICAgZWwgPSAoRWxlbWVudCljdXI7Ci0gICAgICAgICAgICAgICAgaWYgKCFKQVZBX0VFX05TLmVxdWFscyhlbC5nZXROYW1lc3BhY2VVUkkoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBlbC5nZXRMb2NhbE5hbWUoKTsKLSAgICAgICAgICAgICAgICBpZiAoInBvcnQtbmFtZS1wYXR0ZXJuIi5lcXVhbHMobmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlci5zZXRQb3J0TmFtZVBhdHRlcm4ocHJvY2Vzc1BhdHRlcm5FbGVtZW50KGVsKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgic2VydmljZS1uYW1lLXBhdHRlcm4iLmVxdWFscyhuYW1lKSkgewotICAgICAgICAgICAgICAgICAgICBoYW5kbGVyLnNldFNlcnZpY2VOYW1lUGF0dGVybihwcm9jZXNzUGF0dGVybkVsZW1lbnQoZWwpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJwcm90b2NvbC1iaW5kaW5ncyIuZXF1YWxzKG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZXIuZ2V0UHJvdG9jb2xCaW5kaW5ncygpLmFkZEFsbChwcm9jZXNzUHJvdG9jb2xCaW5kaW5nc0VsZW1lbnQoZWwpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJoYW5kbGVyIi5lcXVhbHMobmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlci5nZXRIYW5kbGVyKCkuYWRkKHByb2Nlc3NIYW5kbGVyRWxlbWVudChlbCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaGFuZGxlcjsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gcHJvY2Vzc1Byb3RvY29sQmluZGluZ3NFbGVtZW50KEVsZW1lbnQgZWwpIHsKLSAgICAgICAgU3RyaW5nIHByb3RvY29sQmluZGluZ3NTdHJpbmcgPSBlbC5nZXRUZXh0Q29udGVudCgpLnRyaW0oKTsKLSAgICAgICAgU3RyaW5nIFtdIHByb3RvY29sQmluZGluZ3MgPSBwcm90b2NvbEJpbmRpbmdzU3RyaW5nLnNwbGl0KCJcXHMrIik7Ci0gICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KHByb3RvY29sQmluZGluZ3MpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIFFOYW1lIHByb2Nlc3NQYXR0ZXJuRWxlbWVudChFbGVtZW50IGVsKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIG5hbWVQYXR0ZXJuID0gZWwuZ2V0VGV4dENvbnRlbnQoKS50cmltKCk7Ci0gICAgICAgIAotICAgICAgICAvLyBzZWUgQmFzZUhhbmRsZXJSZXNvbHZlci52YWxpZGF0ZVBhdHRlcm4gZm9yIHZhbGlkIHN0cmluZ3MKLSAgICAgICAgCi0gICAgICAgIGlmICgiKiIuZXF1YWxzKG5hbWVQYXR0ZXJuKSkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBRTmFtZSgiKiIpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAoIW5hbWVQYXR0ZXJuLmNvbnRhaW5zKCI6IikpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgUU5hbWUoIiIsIG5hbWVQYXR0ZXJuLCAiIik7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBsb2NhbFBhcnQgPSBuYW1lUGF0dGVybi5zdWJzdHJpbmcobmFtZVBhdHRlcm4uaW5kZXhPZignOicpICsgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lUGF0dGVybi5sZW5ndGgoKSk7Ci0gICAgICAgIFN0cmluZyBwZnggPSBuYW1lUGF0dGVybi5zdWJzdHJpbmcoMCwgbmFtZVBhdHRlcm4uaW5kZXhPZignOicpKTsKLSAgICAgICAgU3RyaW5nIG5zID0gZWwubG9va3VwTmFtZXNwYWNlVVJJKHBmeCk7Ci0gICAgICAgIGlmIChucyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBucyA9IHBmeDsKLSAgICAgICAgfQotICAgICAgICAvLyBwb3B1bGF0ZSBwcmVmaXggc28gQmFzZUhhbmRsZXJSZXNvbHZlci52YWxpZGF0ZVBhdHRlcm4gY2FuIHZhbGlkYXRlIGl0Ci0gICAgICAgIC8vIFFOYW1lIGN0b3IgaXMgUU5hbWUobmFtZXNwYWNlLCBsb2NhbHBhcnQsIHByZWZpeCkKLSAgICAgICAgcmV0dXJuIG5ldyBRTmFtZShucywgbG9jYWxQYXJ0LCBwZngpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIEhhbmRsZXJUeXBlIHByb2Nlc3NIYW5kbGVyRWxlbWVudChFbGVtZW50IGVsKSB0aHJvd3MgRXhjZXB0aW9uIHsgICAgICAKLSAgICAgICAgSkFYQkNvbnRleHQgY3R4ID0gZ2V0Q29udGV4dEZvckhhbmRsZXJUeXBlKCk7Ci0gICAgICAgIFVubWFyc2hhbGxlciB1bm1hcnNoYWxsZXIgPSBjdHguY3JlYXRlVW5tYXJzaGFsbGVyKCk7Ci0gICAgICAgIEhhbmRsZXJUeXBlIGhhbmRsZXIgPSB1bm1hcnNoYWxsZXIudW5tYXJzaGFsKGVsLCBIYW5kbGVyVHlwZS5jbGFzcykuZ2V0VmFsdWUoKTsKLSAgICAgICAgcmV0dXJuIGhhbmRsZXI7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCBKQVhCQ29udGV4dCBnZXRDb250ZXh0Rm9ySGFuZGxlclR5cGUoKQotICAgICAgICB0aHJvd3MgSkFYQkV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChjb250ZXh0ID09IG51bGwpIHsKLSAgICAgICAgICAgIGNvbnRleHQgPSBKQVhCQ29udGV4dC5uZXdJbnN0YW5jZShIYW5kbGVyVHlwZS5jbGFzcyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNvbnRleHQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vaW1wbC9PcGVyYXRpb25EZXNjcmlwdGlvbkltcGwuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2ltcGwvT3BlcmF0aW9uRGVzY3JpcHRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkZDQxMzIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vaW1wbC9PcGVyYXRpb25EZXNjcmlwdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNzAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uaW1wbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy53c2RsLldTREwxMUFjdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNNZXNzYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5QYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5XU0RMMkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLkV4Y2VwdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5BdHRhY2htZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5FbmRwb2ludERlc2NyaXB0aW9uSmF2YTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5GYXVsdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uT3BlcmF0aW9uRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5PcGVyYXRpb25EZXNjcmlwdGlvbkphdmE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5PcGVyYXRpb25EZXNjcmlwdGlvbldTREw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5PcGVyYXRpb25SdW50aW1lRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5QYXJhbWV0ZXJEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLlBhcmFtZXRlckRlc2NyaXB0aW9uSmF2YTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5GYXVsdEFjdGlvbkFubm90OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5NZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuT25lV2F5QW5ub3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLlBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5jb252ZXJ0ZXIuQ29udmVydGVyVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5pMThuLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MudXRpbC5XU0RMNEpXcmFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXguandzLk9uZXdheTsKLWltcG9ydCBqYXZheC5qd3MuV2ViTWV0aG9kOwotaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbTsKLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW0uTW9kZTsKLWltcG9ydCBqYXZheC5qd3MuV2ViUmVzdWx0OwotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nOwotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZzsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdJbnB1dDsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nT3V0cHV0OwotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuQXR0cmlidXRlRXh0ZW5zaWJsZTsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC53cy5BY3Rpb247Ci1pbXBvcnQgamF2YXgueG1sLndzLkFzeW5jSGFuZGxlcjsKLWltcG9ydCBqYXZheC54bWwud3MuRmF1bHRBY3Rpb247Ci1pbXBvcnQgamF2YXgueG1sLndzLlJlcXVlc3RXcmFwcGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5SZXNwb25zZTsKLWltcG9ydCBqYXZheC54bWwud3MuUmVzcG9uc2VXcmFwcGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJGYXVsdDsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5QYXJhbWV0ZXJpemVkVHlwZTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOwotCi0vKiogQHNlZSAuLi9PcGVyYXRpb25EZXNjcmlwdGlvbiAqLwotLy8gVE9ETzogQXhpczIgZG9lcyBub3Qgc3VwcG9ydCBvdmVybG9hZGVkIG9wZXJhdGlvbnMsIGFsdGhvdWdoIEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24uYWRkT3BlcmF0aW9uKCkgZG9lcyBzdXBwb3J0IG92ZXJsb2FkaW5nCi0vLyAgICAgICBvZiBtZXRob2RzIHJlcHJlc2VudGVkIGJ5IE9wZXJhdGlvbkRlc2NyaXB0aW9uIGNsYXNzZXMuICBIb3dldmVyLCB0aGUgQXhpc09wZXJhdGlvbiBjb250YWluZWQgaW4gYW4gT3BlcmF0aW9uRGVzY3JpcHRpb24KLS8vICAgICAgIGRvZXMgTk9UIHN1cHBvcnQgb3ZlcmxvYWRlZCBtZXRob2RzLgotLy8KLS8vICAgICAgIFdoaWxlIG92ZXJsb2FkaW5nIGlzIG5vdCBzdXBwb3J0ZWQgYnkgV1MtSSwgaXQgSVMgc3VwcG9ydGVkIGJ5IEpBWC1XUyAocDExKS4KLS8vICAgICAgIE5vdGUgdGhhdCB0aGlzIHJlcXVpcmVzIHN1cHBvcnQgaW4gQXhpczI7IGN1cnJlbnRseSBXU0RMMTFUb0F4aXNTZXJ2aWNlQnVpbGRlci5wb3B1bGF0ZU9wZXJhdGlvbnMgZG9lcyBub3QKLS8vICAgICAgIHN1cHBvcnQgb3ZlcmxvYWRlZCBtZXRob2RzIGluIHRoZSBXU0RMOyB0aGUgb3BlcmF0aW9ucyBhcmUgc3RvcmVkIG9uIEF4aXNTZXJ2aWNlIGFzIGNoaWxkcmVuIGluIGEgSGFzaE1hcCB3aXRoIHRoZSB3c2RsCi0vLyAgICAgICBvcGVyYXRpb24gbmFtZSBhcyB0aGUga2V5LgotCi1jbGFzcyBPcGVyYXRpb25EZXNjcmlwdGlvbkltcGwKLSAgICAgICAgaW1wbGVtZW50cyBPcGVyYXRpb25EZXNjcmlwdGlvbiwgT3BlcmF0aW9uRGVzY3JpcHRpb25KYXZhLCBPcGVyYXRpb25EZXNjcmlwdGlvbldTREwgewotICAgIHByaXZhdGUgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiBwYXJlbnRFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uOwotICAgIHByaXZhdGUgQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uOwotICAgIHByaXZhdGUgUU5hbWUgb3BlcmF0aW9uUU5hbWU7Ci0gICAgcHJpdmF0ZSBNZXRob2Qgc2VpTWV0aG9kOwotICAgIHByaXZhdGUgTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUgbWV0aG9kQ29tcG9zaXRlOwotICAgIHByaXZhdGUgUGFyYW1ldGVyRGVzY3JpcHRpb25bXSBwYXJhbWV0ZXJEZXNjcmlwdGlvbnM7Ci0gICAgcHJpdmF0ZSBGYXVsdERlc2NyaXB0aW9uW10gZmF1bHREZXNjcmlwdGlvbnM7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKE9wZXJhdGlvbkRlc2NyaXB0aW9uSW1wbC5jbGFzcyk7Ci0gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIC8vIEFOTk9UQVRJT04gcmVsYXRlZCBpbmZvcm1hdGlvbgotICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAgIC8vIEFOTk9UQVRJT046IEBPbmV3YXkKLSAgICBwcml2YXRlIE9uZXdheSBvbmV3YXlBbm5vdGF0aW9uOwotICAgIHByaXZhdGUgQm9vbGVhbiBvbmV3YXlJc09uZXdheTsKLQotICAgIC8vIEFOTk9UQVRJT046IEBYbWxMaXN0Ci0gICAgcHJpdmF0ZSBib29sZWFuIGlzTGlzdFR5cGUgPSBmYWxzZTsKLQotICAgIC8vIEFOTk9UQVRJT046IEBSZXF1ZXN0V3JhcHBlcgotICAgIHByaXZhdGUgUmVxdWVzdFdyYXBwZXIgcmVxdWVzdFdyYXBwZXJBbm5vdGF0aW9uOwotICAgIHByaXZhdGUgU3RyaW5nIHJlcXVlc3RXcmFwcGVyVGFyZ2V0TmFtZXNwYWNlOwotICAgIHByaXZhdGUgU3RyaW5nIHJlcXVlc3RXcmFwcGVyTG9jYWxOYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIHJlcXVlc3RXcmFwcGVyQ2xhc3NOYW1lOwotCi0gICAgLy8gQU5OT1RBVElPTjogQFJlc3BvbnNlV3JhcHBlcgotICAgIHByaXZhdGUgUmVzcG9uc2VXcmFwcGVyIHJlc3BvbnNlV3JhcHBlckFubm90YXRpb247Ci0gICAgcHJpdmF0ZSBTdHJpbmcgcmVzcG9uc2VXcmFwcGVyTG9jYWxOYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIHJlc3BvbnNlV3JhcHBlclRhcmdldE5hbWVzcGFjZTsKLSAgICBwcml2YXRlIFN0cmluZyByZXNwb25zZVdyYXBwZXJDbGFzc05hbWU7Ci0gICAgCi0gICAgLy8gQU5OT1RBVElPTjogQEFjdGlvbgotICAgIHByaXZhdGUgQWN0aW9uIGFjdGlvbkFubm90YXRpb247Ci0KLSAgICAvLyBBTk5PVEFUSU9OOiBAU09BUEJpbmRpbmcKLSAgICAvLyBOb3RlIHRoaXMgaXMgdGhlIE1ldGhvZC1sZXZlbCBhbm5vdGF0aW9uLiAgU2VlIEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24gZm9yIHRoZSBUeXBlLWxldmVsIGFubm90YXRpb24KLSAgICAvLyBBbHNvIG5vdGUgdGhpcyBhbm5vdGF0aW9uIGlzIG9ubHkgYWxsb3dlZCBvbiBtZXRob2RzIGlmIFNPQVBCaW5kaW5nLlN0eWxlIGlzIERPQ1VNRU5UIGFuZCBpZiB0aGUgbWV0aG9kLWxldmVsCi0gICAgLy8gYW5ub3RhdGlvbiBpcyBhYnNlbnQsIHRoZSBiZWhhdmlvciBkZWZpbmVkIG9uIHRoZSBUeXBlIGlzIHVzZWQuCi0gICAgLy8gcGVyIEpTUi0xODEgTVIgU2VjIDQuNyAiQW5ub3RhdGlvbjogamF2YXguandzLnNvYXAuU09BUEJpbmRpbmciIHBnIDI4Ci0gICAgcHJpdmF0ZSBTT0FQQmluZGluZyBzb2FwQmluZGluZ0Fubm90YXRpb247Ci0gICAgcHJpdmF0ZSBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5TdHlsZSBzb2FwQmluZGluZ1N0eWxlOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuU3R5bGUgU29hcEJpbmRpbmdfU3R5bGVfVkFMSUQgPQotICAgICAgICAgICAgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuU3R5bGUuRE9DVU1FTlQ7Ci0gICAgcHJpdmF0ZSBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5Vc2Ugc29hcEJpbmRpbmdVc2U7Ci0gICAgLy8gRGVmYXVsdCB2YWx1ZSBwZXIgSlNSLTE4MSBNUiBTZWMgNC43ICJBbm5vdGF0aW9uOiBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZyIgcGcgMjgKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlVzZSBTT0FQQmluZGluZ19Vc2VfREVGQVVMVCA9Ci0gICAgICAgICAgICBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5Vc2UuTElURVJBTDsKLSAgICBwcml2YXRlIGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlBhcmFtZXRlclN0eWxlIHNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGU7Ci0gICAgLy8gRGVmYXVsdCB2YWx1ZSBwZXIgSlNSLTE4MSBNUiBTZWMgNC43ICJBbm5vdGF0aW9uOiBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZyIgcGcgMjgKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlBhcmFtZXRlclN0eWxlIFNPQVBCaW5kaW5nX1BhcmFtZXRlclN0eWxlX0RFRkFVTFQgPQotICAgICAgICAgICAgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuUGFyYW1ldGVyU3R5bGUuV1JBUFBFRDsKLQotICAgIC8vIEFOTk9UQVRJT046IEBXZWJNZXRob2QKLSAgICBwcml2YXRlIFdlYk1ldGhvZCB3ZWJNZXRob2RBbm5vdGF0aW9uOwotICAgIHByaXZhdGUgU3RyaW5nIHdlYk1ldGhvZE9wZXJhdGlvbk5hbWU7Ci0gICAgLy8gRGVmYXVsdCB2YWx1ZSBwZXIgSlNSLTE4MSBNUiBTZWMgNC4yLCBwZyAxNwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdlYk1ldGhvZF9BY3Rpb25fREVGQVVMVCA9ICIiOwotICAgIHByaXZhdGUgU3RyaW5nIHdlYk1ldGhvZEFjdGlvbjsKLSAgICAvLyBEZWZhdWx0IHZhbHVlIHBlciBKU1ItMTgxIE1SIHNlYyA0LjIsIHBnIDE3Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIFdlYk1ldGhvZF9FeGNsdWRlX0RFRkFVTFQgPSBuZXcgQm9vbGVhbihmYWxzZSk7Ci0gICAgcHJpdmF0ZSBCb29sZWFuIHdlYk1ldGhvZEV4Y2x1ZGU7Ci0KLSAgICAvLyBBTk5PVEFUSU9OOiBAV2ViUGFyYW0KLSAgICBwcml2YXRlIFN0cmluZ1tdIHdlYlBhcmFtTmFtZXM7Ci0gICAgcHJpdmF0ZSBNb2RlW10gd2ViUGFyYW1Nb2RlOwotICAgIHByaXZhdGUgU3RyaW5nW10gd2ViUGFyYW1UYXJnZXROYW1lc3BhY2U7Ci0KLQotICAgIC8vIEFOTk9UQVRJT046IEBXZWJSZXN1bHQKLSAgICBwcml2YXRlIFdlYlJlc3VsdCB3ZWJSZXN1bHRBbm5vdGF0aW9uOwotICAgIHByaXZhdGUgU3RyaW5nIHdlYlJlc3VsdE5hbWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgd2ViUmVzdWx0UGFydE5hbWU7Ci0gICAgLy8gRGVmYXVsdCB2YWx1ZSBwZXIgSlNSLTE4MSBNUiBTZWMgNC41LjEsIHBnIDIzCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV2ViUmVzdWx0X1RhcmdldE5hbWVzcGFjZV9ERUZBVUxUID0gIiI7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgd2ViUmVzdWx0VGFyZ2V0TmFtZXNwYWNlOwotICAgIC8vIERlZmF1bHQgdmFsdWUgcGVyIEpTUi0xODEgTVIgc2VjIDQuNSwgcGcgMjQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gV2ViUmVzdWx0X0hlYWRlcl9ERUZBVUxUID0gbmV3IEJvb2xlYW4oZmFsc2UpOwotICAgIHByaXZhdGUgQm9vbGVhbiB3ZWJSZXN1bHRIZWFkZXI7Ci0gICAgCi0gICAgLy8gIFdlYiBSZXN1bHQgQXR0YWNobWVudCBEZXNjcmlwdGlvbiBpbmZvcm1hdGlvbgotICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgICAgICBfc2V0QXR0YWNobWVudERlc2MgPSBmYWxzZTsKLSAgICBwcml2YXRlIEF0dGFjaG1lbnREZXNjcmlwdGlvbiBhdHRhY2htZW50RGVzYyA9IG51bGw7Ci0gICAgCi0gICAgcHJpdmF0ZSBib29sZWFuIGhhc1JlcXVlc3RTd2FSZWZBdHRhY2htZW50cyA9IGZhbHNlOwotICAgIHByaXZhdGUgYm9vbGVhbiBoYXNSZXNwb25zZVN3YVJlZkF0dGFjaG1lbnRzID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBBdHRhY2htZW50RGVzY3JpcHRpb24+IHBhcnRBdHRhY2htZW50TWFwOwotICAgIAotICAgIHByaXZhdGUgTWV0aG9kIHNlcnZpY2VJbXBsTWV0aG9kOwotICAgIHByaXZhdGUgYm9vbGVhbiBzZXJ2aWNlSW1wbE1ldGhvZEZvdW5kID0gZmFsc2U7Ci0gICAgLy8gRm9yIEpBWC1XUyBjbGllbnQgYXN5bmMgbWV0aG9kcywgdGhpcyBpcyB0aGUgY29ycmVzcG9uZGluZyBTeW5jIG1ldGhvZDsgZm9yIGV2ZXJ5dGhpbmcgZWxzZSwKLSAgICAvLyB0aGlzIGlzICJ0aGlzIi4KLSAgICBwcml2YXRlIE9wZXJhdGlvbkRlc2NyaXB0aW9uIHN5bmNPcGVyYXRpb25EZXNjcmlwdGlvbiA9IG51bGw7Ci0gICAgLy8gUlVOVElNRSBJTkZPUk1BVElPTgotICAgIE1hcDxTdHJpbmcsIE9wZXJhdGlvblJ1bnRpbWVEZXNjcmlwdGlvbj4gcnVudGltZURlc2NNYXAgPQotICAgICAgICAgICAgQ29sbGVjdGlvbnMuc3luY2hyb25pemVkTWFwKG5ldyBIYXNoTWFwPFN0cmluZywgT3BlcmF0aW9uUnVudGltZURlc2NyaXB0aW9uPigpKTsKLSAgICAvLyBDYWNoZSB0aGUgYWN0dWFsIENsYXNzIG9mIHRoZSB0eXBlIGJlaW5nIHJldHVybmVkLiAKLSAgICBwcml2YXRlIENsYXNzIHJlc3VsdEFjdHVhbFR5cGVDbGF6ejsKLQotICAgIE9wZXJhdGlvbkRlc2NyaXB0aW9uSW1wbChNZXRob2QgbWV0aG9kLCBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uIHBhcmVudCkgewotICAgICAgICBwYXJlbnRFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uID0gcGFyZW50OwotICAgICAgICBwYXJ0QXR0YWNobWVudE1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgQXR0YWNobWVudERlc2NyaXB0aW9uPigpOwotICAgICAgICBzZXRTRUlNZXRob2QobWV0aG9kKTsKLQkJCi0gICAgICAgIC8vIFRoZSBvcGVyYXRpb25RTmFtZSBpcyBpbnRlbnRpb25hbGx5IHVucXVhbGlmaWVkIHRvIGJlIGNvbnNpc3RlbnQgd2l0aCB0aGUgcmVtYWluaW5nIHBhcnRzIG9mIHRoZSBzeXN0ZW0uIAotICAgICAgICAvLyBVc2luZyBhIHF1YWxpZmllZCBuYW1lIHdpbGwgY2F1c2UgYnJlYWthZ2UuCi0gICAgICAgIC8vIERvbid0IGRvIC0tPiB0aGlzLm9wZXJhdGlvblFOYW1lID0gbmV3IFFOYW1lKHBhcmVudC5nZXRUYXJnZXROYW1lc3BhY2UoKSwgZ2V0T3BlcmF0aW9uTmFtZSgpKTsKLSAgICAgICAgdGhpcy5vcGVyYXRpb25RTmFtZSA9IG5ldyBRTmFtZSgiIiwgZ2V0T3BlcmF0aW9uTmFtZSgpKTsKLSAgICAgICAgaWYgKGdldEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24oKS5nZXRFbmRwb2ludERlc2NyaXB0aW9uKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKCFnZXRFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uKCkuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbigpLmdldFNlcnZpY2VEZXNjcmlwdGlvbigpLmlzU2VydmVyU2lkZSgpKSB7Ci0gICAgICAgICAgICAgICAgYXhpc09wZXJhdGlvbiA9IGNyZWF0ZUNsaWVudEF4aXNPcGVyYXRpb24oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZih0aGlzLmF4aXNPcGVyYXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICB0aGlzLmF4aXNPcGVyYXRpb24uYWRkUGFyYW1ldGVyKG5ldyBQYXJhbWV0ZXIoT3BlcmF0aW9uRGVzY3JpcHRpb24uQVhJU19PUEVSQVRJT05fUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcykpOyAgCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaChBeGlzRmF1bHQgYWYpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoIm9wZXJhdGlvbkRlc2NyaXB0aW9uRXJyMSIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBidWlsZEF0dGFjaG1lbnRJbmZvcm1hdGlvbigpOwotICAgIH0KLQotICAgIE9wZXJhdGlvbkRlc2NyaXB0aW9uSW1wbChBeGlzT3BlcmF0aW9uIG9wZXJhdGlvbiwgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiBwYXJlbnQpIHsKLSAgICAgICAgcGFyZW50RW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiA9IHBhcmVudDsKLSAgICAgICAgcGFydEF0dGFjaG1lbnRNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEF0dGFjaG1lbnREZXNjcmlwdGlvbj4oKTsKLSAgICAgICAgYXhpc09wZXJhdGlvbiA9IG9wZXJhdGlvbjsKLSAgICAgICAgaWYodGhpcy5heGlzT3BlcmF0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5heGlzT3BlcmF0aW9uLmFkZFBhcmFtZXRlcihuZXcgUGFyYW1ldGVyKE9wZXJhdGlvbkRlc2NyaXB0aW9uLkFYSVNfT1BFUkFUSU9OX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMpKTsgIAotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2goQXhpc0ZhdWx0IGFmKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJvcGVyYXRpb25EZXNjcmlwdGlvbkVycjEiKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy5vcGVyYXRpb25RTmFtZSA9IGF4aXNPcGVyYXRpb24uZ2V0TmFtZSgpOwotICAgICAgICBidWlsZEF0dGFjaG1lbnRJbmZvcm1hdGlvbigpOwotICAgIH0KLQotICAgIE9wZXJhdGlvbkRlc2NyaXB0aW9uSW1wbChNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSBtZGMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24gcGFyZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb24pIHsKLQotICAgICAgICBwYXJlbnRFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uID0gcGFyZW50OwotICAgICAgICBwYXJ0QXR0YWNobWVudE1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgQXR0YWNobWVudERlc2NyaXB0aW9uPigpOwotICAgICAgICBtZXRob2RDb21wb3NpdGUgPSBtZGM7Ci0gICAgICAgIC8vIFRoZSBvcGVyYXRpb25RTmFtZSBpcyBpbnRlbnRpb25hbGx5IHVucXVhbGlmaWVkIHRvIGJlIGNvbnNpc3RlbnQgd2l0aCB0aGUgcmVtYWluaW5nIHBhcnRzIG9mIHRoZSBzeXN0ZW0uIAotICAgICAgICAvLyBVc2luZyBhIHF1YWxpZmllZCBuYW1lIHdpbGwgY2F1c2UgYnJlYWthZ2UuCi0gICAgICAgIC8vIERvbid0IGRvIC0tPiB0aGlzLm9wZXJhdGlvblFOYW1lID0gbmV3IFFOYW1lKHBhcmVudC5nZXRUYXJnZXROYW1lc3BhY2UoKSwgZ2V0T3BlcmF0aW9uTmFtZSgpKTsKLSAgICAgICAgdGhpcy5vcGVyYXRpb25RTmFtZSA9IG5ldyBRTmFtZSgiIiwgZ2V0T3BlcmF0aW9uTmFtZSgpKTsKLQotICAgICAgICB3ZWJNZXRob2RBbm5vdGF0aW9uID0gbWV0aG9kQ29tcG9zaXRlLmdldFdlYk1ldGhvZEFubm90KCk7Ci0KLSAgICAgICAgcGFyYW1ldGVyRGVzY3JpcHRpb25zID0gY3JlYXRlUGFyYW1ldGVyRGVzY3JpcHRpb25zKCk7Ci0gICAgICAgIGZhdWx0RGVzY3JpcHRpb25zID0gY3JlYXRlRmF1bHREZXNjcmlwdGlvbnMoKTsKLSAgICAgICAgaXNMaXN0VHlwZSA9IG1kYy5pc0xpc3RUeXBlKCk7Ci0gICAgICAgIGJ1aWxkQXR0YWNobWVudEluZm9ybWF0aW9uKCk7Ci0KLSAgICAgICAgLy9JZiBhbiBBeGlzT3BlcmF0aW9uIHdhcyBhbHJlYWR5IGNyZWF0ZWQgZm9yIHVzIGJ5IHBvcHVsYXRlU2VydmljZSB0aGVuIGp1c3QgdXNlIHRoYXQgb25lCi0gICAgICAgIC8vT3RoZXJ3aXNlLCBjcmVhdGUgaXQKLSAgICAgICAgaWYgKGF4aXNPcGVyYXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgdGhpcy5heGlzT3BlcmF0aW9uID0gYXhpc09wZXJhdGlvbjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRoaXMuYXhpc09wZXJhdGlvbiA9IGNyZWF0ZUF4aXNPcGVyYXRpb24oKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYodGhpcy5heGlzT3BlcmF0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5heGlzT3BlcmF0aW9uLmFkZFBhcmFtZXRlcihuZXcgUGFyYW1ldGVyKE9wZXJhdGlvbkRlc2NyaXB0aW9uLkFYSVNfT1BFUkFUSU9OX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMpKTsgIAotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2goQXhpc0ZhdWx0IGFmKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJvcGVyYXRpb25EZXNjcmlwdGlvbkVycjEiKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIFJlZ2lzdGVyIHVuZGVyc3Rvb2QgaGVhZGVycyBvbiBheGlzT3BlcmF0aW9uCi0gICAgICAgIHJlZ2lzdGVyTXVzdFVuZGVyc3RhbmRIZWFkZXJzKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIEF4aXNPcGVyYXRpb24gZm9yIHRoaXMgT3BlcmF0aW9uLiAgTm90ZSB0aGF0IHRoZSBQYXJhbWV0ZXJEZXNjcmlwdGlvbnMgbXVzdAotICAgICAqIGJlIGNyZWF0ZWQgYmVmb3JlIGNhbGxpbmcgdGhpcyBtZXRob2Qgc2luY2UsIGZvciBhIERPQy9MSVQvQkFSRSAoYWthIFVOV1JBUFBFRCkgbWVzc2FnZSwgdGhlIAotICAgICAqIFBhcmFtYXRlckRlc2NyaXB0aW9uIGlzIHVzZWQgdG8gc2V0dXAgdGhlIEF4aXNNZXNzYWdlIGNvcnJlY3RseSBmb3IgdXNlIGluIFNPQVAgQm9keS1iYXNlZAotICAgICAqIGRpc3BhdGNoaW5nIG9uIGluY29taW5nIERPQy9MSVQvQkFSRSBtZXNzYWdlcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIEF4aXNPcGVyYXRpb24gY3JlYXRlQ2xpZW50QXhpc09wZXJhdGlvbigpIHsKLSAgICAgICAgQXhpc09wZXJhdGlvbiBuZXdBeGlzT3BlcmF0aW9uID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChpc09uZVdheSgpKSB7Ci0gICAgICAgICAgICAgICAgbmV3QXhpc09wZXJhdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBBeGlzT3BlcmF0aW9uRmFjdG9yeS5nZXRPcGVyYXRpb25EZXNjcmlwdGlvbihXU0RMMkNvbnN0YW50cy5NRVBfVVJJX09VVF9PTkxZKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbmV3QXhpc09wZXJhdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBBeGlzT3BlcmF0aW9uRmFjdG9yeS5nZXRPcGVyYXRpb25EZXNjcmlwdGlvbihXU0RMMkNvbnN0YW50cy5NRVBfVVJJX09VVF9JTik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvL1JFVklFVzogVGhlcmUgYXJlIHNldmVyYWwgb3RoZXIgTUVQJ3MsIHN1Y2ggYXM6IE9VVF9PTkxZLCBJTl9PUFRJT05BTF9PVVQsIE9VVF9JTiwgT1VUX09QVElPTkFMX0lOLCBST0JVU1RfT1VUX09OTFksCi0gICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBST0JVU1RfSU5fT05MWQotICAgICAgICAgICAgLy8gICAgICBEZXRlcm1pbmUgaG93IHRoZXNlIE1FUCdzIHNob3VsZCBiZSBoYW5kbGVkLCBpZiBhdCBhbGwKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiY2xpZW50QXhpc09wckVyciIpLGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgbmV3QXhpc09wZXJhdGlvbi5zZXROYW1lKGRldGVybWluZU9wZXJhdGlvblFOYW1lKHNlaU1ldGhvZCkpOwotICAgICAgICBuZXdBeGlzT3BlcmF0aW9uLnNldFNvYXBBY3Rpb24odGhpcy5nZXRBY3Rpb24oKSk7Ci0gICAgICAgIAotICAgICAgICAvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgLy9OT1RFOiBhc3N1bXB0aW9uIGhlcmUgaXMgdGhhdCBhbGwgaW5mby4gbmVlZCB0byBnZW5lcmF0ZSB0aGUgYWN0aW9ucyB3aWxsIGhhdmUgdG8gY29tZQotICAgICAgICAvLyAgICAgIGZyb20gYW5ub3RhdGlvbnMgKG9yIGRlZmF1bHQgdmFsdWVzKQotICAgICAgICAvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBtZXNzYWdlRXhjaGFuZ2VQYXR0ZXJuID0gbmV3QXhpc09wZXJhdGlvbi5nZXRNZXNzYWdlRXhjaGFuZ2VQYXR0ZXJuKCk7Ci0gICAgICAgIFN0cmluZyBvcGVyYXRpb25OYW1lID0gbmV3QXhpc09wZXJhdGlvbi5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgIFN0cmluZyB0YXJnZXROUyA9IGdldEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb25JbXBsKCkuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7ICAgICAgICAKLSAgICAgICAgU3RyaW5nIHBvcnRUeXBlTmFtZSA9IGdldEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb25JbXBsKCkuZ2V0UG9ydFR5cGUoKS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgIAotICAgICAgICAvL1dlIGRvbid0IGhhdmUgYSBuYW1lIGF0IHRoaXMgcG9pbnQsIHNob3VsZG4ndCBtYXR0ZXIgaWYgd2UgaGF2ZSB0aGUgTUVQLgotICAgICAgICAvL09uIHRoZSBjbGllbnQgdGhlIGlucHV0IGFuZCBvdXRwdXQgYWN0aW9ucyBhcmUgcmV2ZXJzZWQuCi0gICAgICAgIFN0cmluZyBpbnB1dE5hbWUgPSBudWxsOwotICAgICAgICBTdHJpbmcgaW5wdXRBY3Rpb24gPSBnZXRPdXRwdXRBY3Rpb24oKTsKLQotICAgICAgICAvL0lmIHdlIHN0aWxsIGRvbid0IGhhdmUgYW4gYWN0aW9uIHRoZW4gZmFsbCBiYWNrIHRvIHRoZSBEZWZhdWx0IEFjdGlvbiBQYXR0ZXJuLgotICAgICAgICBpZiAoaW5wdXRBY3Rpb24gPT0gbnVsbCB8fCBpbnB1dEFjdGlvbi5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICBpbnB1dEFjdGlvbiA9Ci0gICAgICAgICAgICAgICAgV1NETDExQWN0aW9uSGVscGVyLmdldElucHV0QWN0aW9uRnJvbVN0cmluZ0luZm9ybWF0aW9uKCBtZXNzYWdlRXhjaGFuZ2VQYXR0ZXJuLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldE5TLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnRUeXBlTmFtZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25OYW1lLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0TmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgQXJyYXlMaXN0IGlucHV0QWN0aW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgaW5wdXRBY3Rpb25zLmFkZChpbnB1dEFjdGlvbik7Ci0gICAgICAgIG5ld0F4aXNPcGVyYXRpb24uc2V0V3NhbWFwcGluZ0xpc3QoaW5wdXRBY3Rpb25zKTsKLSAgICAgICAgCi0gICAgICAgIC8vTWFwIHRoZSBhY3Rpb24gdG8gdGhlIG9wZXJhdGlvbiBvbiB0aGUgYWN0dWFsIGF4aXNTZXJ2aWNlCi0gICAgICAgIC8vVE9ETzogRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBzaG91bGQgYmUgZG9uZSBhdCBhIGhpZ2hlciBsZXZlbCBpbiB0aGUgCi0gICAgICAgIC8vICAgICAgZGVzY3JpcHRpb24gaGllcmFyY2h5Ci0gICAgICAgIGdldEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb25JbXBsKCkuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbkltcGwoKS4KLSAgICAgICAgICAgIGdldEF4aXNTZXJ2aWNlKCkubWFwQWN0aW9uVG9PcGVyYXRpb24oaW5wdXRBY3Rpb24sIG5ld0F4aXNPcGVyYXRpb24pOyAgICAgICAgCi0gICAgICAgIAotICAgICAgICAvL3NldCB0aGUgT1VUUFVUIEFDVElPTgotCi0gICAgICAgIC8vV2UgZG9uJ3QgaGF2ZSBhIG5hbWUgYXQgdGhpcyBwb2ludCwgc2hvdWxkbid0IG1hdHRlciBpZiB3ZSBoYXZlIHRoZSBNRVAKLSAgICAgICAgLy9PbiB0aGUgY2xpZW50IHRoZSBpbnB1dCBhbmQgb3V0cHV0IGFjdGlvbnMgYXJlIHJldmVyc2VkLgotICAgICAgICBTdHJpbmcgb3V0cHV0TmFtZSA9IG51bGw7Ci0gICAgICAgIFN0cmluZyBvdXRwdXRBY3Rpb24gPSBnZXRJbnB1dEFjdGlvbigpOwotCi0gICAgICAgIGlmIChvdXRwdXRBY3Rpb24gPT0gbnVsbCB8fCBvdXRwdXRBY3Rpb24ubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgb3V0cHV0QWN0aW9uID0KLSAgICAgICAgICAgICAgICBXU0RMMTFBY3Rpb25IZWxwZXIuZ2V0T3V0cHV0QWN0aW9uRnJvbVN0cmluZ0luZm9ybWF0aW9uKCBtZXNzYWdlRXhjaGFuZ2VQYXR0ZXJuLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXROUywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydFR5cGVOYW1lLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25OYW1lLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXROYW1lKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgbmV3QXhpc09wZXJhdGlvbi5zZXRPdXRwdXRBY3Rpb24ob3V0cHV0QWN0aW9uKTsKLQotICAgICAgICBzZXRGYXVsdEFjdGlvbnMobmV3QXhpc09wZXJhdGlvbiwgb3BlcmF0aW9uTmFtZSwgdGFyZ2V0TlMsIHBvcnRUeXBlTmFtZSk7Ci0KLSAgICAgICAgZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbkltcGwoKS5nZXRFbmRwb2ludERlc2NyaXB0aW9uSW1wbCgpLgotICAgICAgICAgICAgZ2V0QXhpc1NlcnZpY2UoKS5hZGRPcGVyYXRpb24obmV3QXhpc09wZXJhdGlvbik7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gbmV3QXhpc09wZXJhdGlvbjsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIEF4aXNPcGVyYXRpb24gZm9yIHRoaXMgT3BlcmF0aW9uLiAgTm90ZSB0aGF0IHRoZSBQYXJhbWV0ZXJEZXNjcmlwdGlvbnMgbXVzdAotICAgICAqIGJlIGNyZWF0ZWQgYmVmb3JlIGNhbGxpbmcgdGhpcyBtZXRob2Qgc2luY2UsIGZvciBhIERPQy9MSVQvQkFSRSAoYWthIFVOV1JBUFBFRCkgbWVzc2FnZSwgdGhlIAotICAgICAqIFBhcmFtYXRlckRlc2NyaXB0aW9uIGlzIHVzZWQgdG8gc2V0dXAgdGhlIEF4aXNNZXNzYWdlIGNvcnJlY3RseSBmb3IgdXNlIGluIFNPQVAgQm9keS1iYXNlZAotICAgICAqIGRpc3BhdGNoaW5nIG9uIGluY29taW5nIERPQy9MSVQvQkFSRSBtZXNzYWdlcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIEF4aXNPcGVyYXRpb24gY3JlYXRlQXhpc09wZXJhdGlvbigpIHsKLSAgICAgICAgQXhpc09wZXJhdGlvbiBuZXdBeGlzT3BlcmF0aW9uID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChpc09uZVdheSgpKSB7Ci0gICAgICAgICAgICAgICAgbmV3QXhpc09wZXJhdGlvbiA9IEF4aXNPcGVyYXRpb25GYWN0b3J5Ci0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0T3BlcmF0aW9uRGVzY3JpcHRpb24oV1NETDJDb25zdGFudHMuTUVQX1VSSV9JTl9PTkxZKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbmV3QXhpc09wZXJhdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBBeGlzT3BlcmF0aW9uRmFjdG9yeS5nZXRPcGVyYXRpb25EZXNjcmlwdGlvbihXU0RMMkNvbnN0YW50cy5NRVBfVVJJX0lOX09VVCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvL1RPRE86IFRoZXJlIGFyZSBzZXZlcmFsIG90aGVyIE1FUCdzLCBzdWNoIGFzOiBPVVRfT05MWSwgSU5fT1BUSU9OQUxfT1VULCBPVVRfSU4sIE9VVF9PUFRJT05BTF9JTiwgUk9CVVNUX09VVF9PTkxZLAotICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUk9CVVNUX0lOX09OTFkKLSAgICAgICAgICAgIC8vICAgICAgRGV0ZXJtaW5lIGhvdyB0aGVzZSBNRVAncyBzaG91bGQgYmUgaGFuZGxlZCwgaWYgYXQgYWxsCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoImNsaWVudEF4aXNPcHJFcnIiKSwgZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBuZXdBeGlzT3BlcmF0aW9uLnNldE5hbWUoZGV0ZXJtaW5lT3BlcmF0aW9uUU5hbWUodGhpcy5tZXRob2RDb21wb3NpdGUpKTsKLSAgICAgICAgbmV3QXhpc09wZXJhdGlvbi5zZXRTb2FwQWN0aW9uKHRoaXMuZ2V0QWN0aW9uKCkpOwotCi0gICAgICAgIC8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAvL05PVEU6IGFzc3VtcHRpb24gaGVyZSBpcyB0aGF0IGFsbCBpbmZvLiBuZWVkIHRvIGdlbmVyYXRlIHRoZSBhY3Rpb25zIHdpbGwgaGF2ZSB0byBjb21lCi0gICAgICAgIC8vICAgICAgZnJvbSBhbm5vdGF0aW9ucyAob3IgZGVmYXVsdCB2YWx1ZXMpCi0gICAgICAgIC8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAKLSAgICAgICAgU3RyaW5nIG1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4gPSBuZXdBeGlzT3BlcmF0aW9uLmdldE1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4oKTsKLSAgICAgICAgU3RyaW5nIG9wZXJhdGlvbk5hbWUgPSBuZXdBeGlzT3BlcmF0aW9uLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgU3RyaW5nIHRhcmdldE5TID0gZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbkltcGwoKS5nZXRUYXJnZXROYW1lc3BhY2UoKTsgICAgICAgIAotICAgICAgICBTdHJpbmcgcG9ydFR5cGVOYW1lID0gZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbkltcGwoKS5nZXRQb3J0VHlwZSgpLmdldExvY2FsUGFydCgpOwotICAgICAgICAgCi0gICAgICAgIC8vV2UgZG9uJ3QgaGF2ZSBhIG5hbWUgYXQgdGhpcyBwb2ludCwgc2hvdWxkbid0IG1hdHRlciBpZiB3ZSBoYXZlIHRoZSBNRVAKLSAgICAgICAgU3RyaW5nIGlucHV0TmFtZSA9IG51bGw7Ci0gICAgICAgIFN0cmluZyBpbnB1dEFjdGlvbiA9IGdldElucHV0QWN0aW9uKCk7Ci0gICAgICAgIAotICAgICAgICAvL0lmIHdlIGRvbid0IGhhdmUgYW4gYWN0aW9uIHRoZW4gZmFsbCBiYWNrIHRvIHRoZSBEZWZhdWx0IEFjdGlvbiBQYXR0ZXJuLgotICAgICAgICBpZiAoaW5wdXRBY3Rpb24gPT0gbnVsbCB8fCBpbnB1dEFjdGlvbi5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICBpbnB1dEFjdGlvbiA9Ci0gICAgICAgICAgICAgICAgV1NETDExQWN0aW9uSGVscGVyLmdldElucHV0QWN0aW9uRnJvbVN0cmluZ0luZm9ybWF0aW9uKG1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4sIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXROUywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnRUeXBlTmFtZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbk5hbWUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dE5hbWUpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBBcnJheUxpc3QgaW5wdXRBY3Rpb25zID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBpbnB1dEFjdGlvbnMuYWRkKGlucHV0QWN0aW9uKTsKLSAgICAgICAgbmV3QXhpc09wZXJhdGlvbi5zZXRXc2FtYXBwaW5nTGlzdChpbnB1dEFjdGlvbnMpOwotICAgICAgICAKLSAgICAgICAgLy9NYXAgdGhlIGFjdGlvbiB0byB0aGUgb3BlcmF0aW9uIG9uIHRoZSBhY3R1YWwgYXhpc1NlcnZpY2UKLSAgICAgICAgLy9UT0RPOiBEZXRlcm1pbmUgd2hldGhlciB0aGlzIHNob3VsZCBiZSBkb25lIGF0IGEgaGlnaGVyIGxldmVsIGluIHRoZSAKLSAgICAgICAgLy8gICAgICBkZXNjcmlwdGlvbiBoaWVyYXJjaHkKLSAgICAgICAgZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbkltcGwoKS5nZXRFbmRwb2ludERlc2NyaXB0aW9uSW1wbCgpLgotICAgICAgICAgICAgZ2V0QXhpc1NlcnZpY2UoKS5tYXBBY3Rpb25Ub09wZXJhdGlvbihpbnB1dEFjdGlvbiwgbmV3QXhpc09wZXJhdGlvbik7Ci0gICAgICAgIAotICAgICAgICAvL3NldCB0aGUgT1VUUFVUIEFDVElPTgotCi0gICAgICAgIC8vV2UgZG9uJ3QgaGF2ZSBhIG5hbWUgYXQgdGhpcyBwb2ludCwgc2hvdWxkbid0IG1hdHRlciBpZiB3ZSBoYXZlIHRoZSBNRVAKLSAgICAgICAgU3RyaW5nIG91dHB1dE5hbWUgPSBudWxsOwotICAgICAgICBTdHJpbmcgb3V0cHV0QWN0aW9uID0gZ2V0T3V0cHV0QWN0aW9uKCk7Ci0gICAgICAgIAotICAgICAgICAvL0lmIHdlIGRvbid0IGhhdmUgYW4gYWN0aW9uIHRoZW4gZmFsbCBiYWNrIHRvIHRoZSBEZWZhdWx0IEFjdGlvbiBQYXR0ZXJuLgotICAgICAgICBpZiAob3V0cHV0QWN0aW9uID09IG51bGwgfHwgb3V0cHV0QWN0aW9uLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIG91dHB1dEFjdGlvbiA9Ci0gICAgICAgICAgICAgICAgV1NETDExQWN0aW9uSGVscGVyLmdldE91dHB1dEFjdGlvbkZyb21TdHJpbmdJbmZvcm1hdGlvbihtZXNzYWdlRXhjaGFuZ2VQYXR0ZXJuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0TlMsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydFR5cGVOYW1lLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbk5hbWUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0TmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIG5ld0F4aXNPcGVyYXRpb24uc2V0T3V0cHV0QWN0aW9uKG91dHB1dEFjdGlvbik7Ci0gICAgICAgIAotICAgICAgICAvL1NldCB0aGUgRkFVTFQgQUNUSU9OCi0gICAgICAgIHNldEZhdWx0QWN0aW9ucyhuZXdBeGlzT3BlcmF0aW9uLCBvcGVyYXRpb25OYW1lLCB0YXJnZXROUywgcG9ydFR5cGVOYW1lKTsKLQotICAgICAgICAvLyBJZiB0aGlzIGlzIGEgRE9DL0xJVC9CQVJFIG9wZXJhdGlvbiwgdGhlbiBzZXQgdGhlIFFOYW1lIG9mIHRoZSBpbnB1dCBBeGlzTWVzc2FnZSB0byB0aGUgCi0gICAgICAgIC8vIHBhcnQgZm9yIHRoZSBmaXJzdCBJTiBvciBJTi9PVVQgbm9uLWhlYWRlciBwYXJhbWV0ZXIuICBJZiB0aGVyZSBhcmUgbm8gcGFyYW1ldGVycywgdGhlbiBkb24ndCBzZXQKLSAgICAgICAgLy8gYW55dGhpbmcuICBUaGUgQXhpc01lc3NhZ2UgbmFtZSBpcyB1c2VkIHRvIGRvIFNPQVAtYm9keSBiYXNlZCByb3V0aW5nIG9mIERPQy9MSVQvQkFSRQotICAgICAgICAvLyBpbmNvbWluZyBtZXNzYWdlcy4KLSAgICAgICAgaWYgKGdldFNvYXBCaW5kaW5nU3R5bGUoKSA9PSBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5TdHlsZS5ET0NVTUVOVAotICAgICAgICAgICAgICAgICYmIGdldFNvYXBCaW5kaW5nVXNlKCkgPT0gamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuVXNlLkxJVEVSQUwKLSAgICAgICAgICAgICAgICAmJiBnZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCkgPT0gamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuUGFyYW1ldGVyU3R5bGUuQkFSRSkKLSAgICAgICAgewotICAgICAgICAgICAgUGFyYW1ldGVyRGVzY3JpcHRpb25bXSBwYXJhbURlc2NzID0gZ2V0UGFyYW1ldGVyRGVzY3JpcHRpb25zKCk7Ci0gICAgICAgICAgICBpZiAocGFyYW1EZXNjcyAhPSBudWxsICYmIHBhcmFtRGVzY3MubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgICAgIGZvciAoUGFyYW1ldGVyRGVzY3JpcHRpb24gcGFyYW1EZXNjIDogcGFyYW1EZXNjcykgewotICAgICAgICAgICAgICAgICAgICBXZWJQYXJhbS5Nb2RlIHBhcmFtTW9kZSA9IHBhcmFtRGVzYy5nZXRNb2RlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghcGFyYW1EZXNjLmlzSGVhZGVyKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAocGFyYW1Nb2RlID09IFdlYlBhcmFtLk1vZGUuSU4gfHwgcGFyYW1Nb2RlID09IFdlYlBhcmFtLk1vZGUuSU5PVVQpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSd2ZSBmb3VuZCB0aGUgZmlyc3QgSU4gb3IgSU5PVVQgbm9uLWhlYWRlciBwYXJhbWV0ZXIsIHNvIHNldCB0aGUgQXhpc01lc3NhZ2UKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFFOYW1lIGJhc2VkIG9uIHRoaXMgcGFyYW1ldGVyIHRoZW4gYnJlYWsgb3V0IG9mIHRoZSBsb29wLgotICAgICAgICAgICAgICAgICAgICAgICAgQXhpc01lc3NhZ2UgYXhpc01lc3NhZ2UgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdBeGlzT3BlcmF0aW9uLmdldE1lc3NhZ2UoV1NETENvbnN0YW50cy5NRVNTQUdFX0xBQkVMX0lOX1ZBTFVFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBlbGVtZW50TmFtZSA9IHBhcmFtRGVzYy5nZXRQYXJhbWV0ZXJOYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGFydE5hbWVzcGFjZSA9IHBhcmFtRGVzYy5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiU2V0dGluZyB1cCBhbm5vdGF0aW9uIGJhc2VkIERvYy9MaXQvQmFyZSBvcGVyYXRpb246ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3QXhpc09wZXJhdGlvbi5nZXROYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIjsgYXhpc01lc3NhZ2U6ICIgKyBheGlzTWVzc2FnZSArICI7IG5hbWU6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZWxlbWVudE5hbWUgKyAiOyBwYXJ0VE5TOiAiICsgcGFydE5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXhpc01lc3NhZ2UgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiY3JlYXRlQXhpc09wckVycjEiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKERlc2NyaXB0aW9uVXRpbHMuaXNFbXB0eShwYXJ0TmFtZXNwYWNlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiY3JlYXRlQXhpc09wckVycjIiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKERlc2NyaXB0aW9uVXRpbHMuaXNFbXB0eShlbGVtZW50TmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoImNyZWF0ZUF4aXNPcHJFcnIzIikpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBRTmFtZSBwYXJ0UU5hbWUgPSBuZXcgUU5hbWUocGFydE5hbWVzcGFjZSwgZWxlbWVudE5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiU2V0dGluZyBBeGlzTWVzc2FnZSBlbGVtZW50IFFOYW1lIGZvciBiYXJlIG1hcHBpbmc6ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRRTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNNZXNzYWdlLnNldEVsZW1lbnRRTmFtZShwYXJ0UU5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb25JbXBsKCkuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbkltcGwoKQotICAgICAgICAgICAgICAgICAgICAgICAgCQkuZ2V0QXhpc1NlcnZpY2UoKQotICAgICAgICAgICAgICAgICAgICAgICAgCQkJLmFkZE1lc3NhZ2VFbGVtZW50UU5hbWVUb09wZXJhdGlvbk1hcHBpbmcocGFydFFOYW1lLCBuZXdBeGlzT3BlcmF0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXdBeGlzT3BlcmF0aW9uOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZXRGYXVsdEFjdGlvbnMoQXhpc09wZXJhdGlvbiBuZXdBeGlzT3BlcmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG9wZXJhdGlvbk5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdGFyZ2V0TlMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcG9ydFR5cGVOYW1lKSB7Ci0gICAgICAgIC8vIFdhbGsgdGhlIGZhdWx0IGluZm9ybWF0aW9uCi0gICAgICAgIEZhdWx0RGVzY3JpcHRpb25bXSBmYXVsdERlc2NzID0gZ2V0RmF1bHREZXNjcmlwdGlvbnMoKTsKLSAgICAgICAgCi0gICAgICAgIC8vR2VuZXJhdGUgZmF1bHQgYWN0aW9ucyBhY2NvcmRpbmcgdG8gdGhlIERlZmF1bHQgQWN0aW9uIFBhdHRlcm4uCi0gICAgICAgIGlmIChmYXVsdERlc2NzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoRmF1bHREZXNjcmlwdGlvbiBmYXVsdERlc2MgOiBmYXVsdERlc2NzKSB7Ci0gICAgICAgIAotICAgICAgICAgICAgICAgIEF4aXNNZXNzYWdlIGZhdWx0TWVzc2FnZSA9IG5ldyBBeGlzTWVzc2FnZSgpOwotICAgICAgICAgICAgICAgIFN0cmluZyBmYXVsdE5hbWUgPSBmYXVsdERlc2MuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgIGZhdWx0TWVzc2FnZS5zZXROYW1lKGZhdWx0TmFtZSk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgU3RyaW5nIGZhdWx0QWN0aW9uID0gCi0gICAgICAgICAgICAgICAgICAgICAgICBXU0RMMTFBY3Rpb25IZWxwZXIuZ2V0RmF1bHRBY3Rpb25Gcm9tU3RyaW5nSW5mb3JtYXRpb24oIHRhcmdldE5TLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0VHlwZU5hbWUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbk5hbWUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhdWx0TWVzc2FnZS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIG5ld0F4aXNPcGVyYXRpb24uYWRkRmF1bHRBY3Rpb24oZmF1bHREZXNjLmdldEV4Y2VwdGlvbkNsYXNzTmFtZSgpLCAgZmF1bHRBY3Rpb24pOwotICAgICAgICAgICAgICAgIG5ld0F4aXNPcGVyYXRpb24uc2V0RmF1bHRNZXNzYWdlcyhmYXVsdE1lc3NhZ2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvL092ZXJyaWRlIHRoZSBmYXVsdCBhY3Rpb25zIGJhc2VkIG9uIGFueSBGYXVsdEFjdGlvbiBhbm5vdGF0aW9ucyB0aGF0IGFyZSBkZWZpbmVkLgotICAgICAgICBGYXVsdEFjdGlvbltdIGZhdWx0QWN0aW9ucyA9IGdldEZhdWx0QWN0aW9ucygpOwotICAgICAgICAKLSAgICAgICAgaWYgKGZhdWx0QWN0aW9ucyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKEZhdWx0QWN0aW9uIGZhdWx0QWN0aW9uIDogZmF1bHRBY3Rpb25zKSB7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYoZmF1bHRBY3Rpb24gaW5zdGFuY2VvZiBGYXVsdEFjdGlvbkFubm90Ci0gICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAgICAgICAgICAgICAgKChGYXVsdEFjdGlvbkFubm90KSBmYXVsdEFjdGlvbikuY2xhc3NOYW1lU3RyaW5nKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSAoKEZhdWx0QWN0aW9uQW5ub3QpIGZhdWx0QWN0aW9uKS5jbGFzc05hbWVTdHJpbmcoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZihmYXVsdEFjdGlvbi5jbGFzc05hbWUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZSA9IGZhdWx0QWN0aW9uLmNsYXNzTmFtZSgpLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYoY2xhc3NOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiTG9va2luZyBmb3IgRmF1bHREZXNjcmlwdGlvbiBmb3IgY2xhc3M6ICIgKyBjbGFzc05hbWUgKyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGZyb20gQEZhdWx0QWN0aW9uIGFubm90YXRpb24iKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBGYXVsdERlc2NyaXB0aW9uIGZhdWx0RGVzYyA9IHJlc29sdmVGYXVsdEJ5RXhjZXB0aW9uTmFtZShjbGFzc05hbWUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZmF1bHREZXNjICE9IG51bGwpICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZXdBeGlzT3BlcmF0aW9uLmFkZEZhdWx0QWN0aW9uKGNsYXNzTmFtZSwgZmF1bHRBY3Rpb24udmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIHRoZSBBeGlzT3BlcmF0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBPcGVyYXRpb25EZXNjcmlwdGlvbiB0byB0aGUgQXhpc1NlcnZpY2UgaWYgaXQKLSAgICAgKiBpc24ndCBhbHJlYWR5IHRoZXJlLiBJdCBhbHNvIGFkZGVzIHRoZSBBeGlzT3BlcmF0aW9uIHRvIGFueSBvdGhlciByb3V0aW5nIG1lY2hhbmlzbXMgZm9yCi0gICAgICogdGhhdCBBeGlzU2VydmljZTogLSBGb3IgRG9jL0xpdC9CYXJlIG9wZXJhdGlvbnMgaXQgaXMgYWRkZWQgdG8gdGhlCi0gICAgICogTWVzc2FnZUVsZW1lbnRRTmFtZVRvT3BlcmF0aW9uTWFwcGluZwotICAgICAqCi0gICAgICogQHBhcmFtIGF4aXNTZXJ2aWNlCi0gICAgICovCi0gICAgdm9pZCBhZGRUb0F4aXNTZXJ2aWNlKEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlKSB7Ci0gICAgICAgIEF4aXNPcGVyYXRpb24gbmV3QXhpc09wZXJhdGlvbiA9IGdldEF4aXNPcGVyYXRpb24oKTsKLSAgICAgICAgUU5hbWUgYXhpc09wUU5hbWUgPSBuZXdBeGlzT3BlcmF0aW9uLmdldE5hbWUoKTsKLSAgICAgICAgQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uID0gYXhpc1NlcnZpY2UuZ2V0T3BlcmF0aW9uKGF4aXNPcFFOYW1lKTsKLSAgICAgICAgaWYgKGF4aXNPcGVyYXRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgYXhpc1NlcnZpY2UuYWRkT3BlcmF0aW9uKG5ld0F4aXNPcGVyYXRpb24pOwotICAgICAgICAgICAgLy8gRm9yIGEgRG9jL0xpdC9CYXJlIG9wZXJhdGlvbiwgd2UgYWxzbyBuZWVkIHRvIGFkZCB0aGUgZWxlbWVudCBtYXBwaW5nCi0gICAgICAgIH0KLSAgICAgICAgaWYgKGdldFNvYXBCaW5kaW5nU3R5bGUoKSA9PSBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5TdHlsZS5ET0NVTUVOVAotICAgICAgICAgICAgICAgICYmIGdldFNvYXBCaW5kaW5nVXNlKCkgPT0gamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuVXNlLkxJVEVSQUwKLSAgICAgICAgICAgICAgICAmJiBnZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCkgPT0gamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuUGFyYW1ldGVyU3R5bGUKLSAgICAgICAgICAgICAgICAuQkFSRSkgewotICAgICAgICAgICAgQXhpc01lc3NhZ2UgYXhpc01lc3NhZ2UgPQotICAgICAgICAgICAgICAgICAgICBudWxsOwotICAgICAgICAgICAgaWYgKGF4aXNPcGVyYXRpb24hPW51bGwpIHsKLSAgICAgICAgICAgICAgICBheGlzTWVzc2FnZSA9IGF4aXNPcGVyYXRpb24uZ2V0TWVzc2FnZShXU0RMQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfSU5fVkFMVUUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBheGlzTWVzc2FnZSA9IG5ld0F4aXNPcGVyYXRpb24uZ2V0TWVzc2FnZShXU0RMQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfSU5fVkFMVUUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGF4aXNNZXNzYWdlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBRTmFtZSBlbGVtZW50UU5hbWUgPSBheGlzTWVzc2FnZS5nZXRFbGVtZW50UU5hbWUoKTsKLSAgICAgICAgICAgICAgICBpZiAoIURlc2NyaXB0aW9uVXRpbHMuaXNFbXB0eShlbGVtZW50UU5hbWUpICYmIAotICAgICAgICAgICAgICAgICAgICBheGlzU2VydmljZS5nZXRPcGVyYXRpb25CeU1lc3NhZ2VFbGVtZW50UU5hbWUoZWxlbWVudFFOYW1lKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlLmFkZE1lc3NhZ2VFbGVtZW50UU5hbWVUb09wZXJhdGlvbk1hcHBpbmcoZWxlbWVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0F4aXNPcGVyYXRpb24pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgc2V0U0VJTWV0aG9kKE1ldGhvZCBtZXRob2QpIHsKLSAgICAgICAgaWYgKHNlaU1ldGhvZCAhPSBudWxsKSB7Ci0gICAgICAgIAl0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKAotICAgICAgICAJCQluZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgic2VpTWV0aG9kRXJyIikpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNlaU1ldGhvZCA9IG1ldGhvZDsKLSAgICAgICAgICAgIHdlYk1ldGhvZEFubm90YXRpb24gPSAoV2ViTWV0aG9kKQotICAgICAgICAgICAgICAgIGdldEFubm90YXRpb24oc2VpTWV0aG9kLCBXZWJNZXRob2QuY2xhc3MpOwotICAgICAgICAgICAgcGFyYW1ldGVyRGVzY3JpcHRpb25zID0gY3JlYXRlUGFyYW1ldGVyRGVzY3JpcHRpb25zKCk7Ci0gICAgICAgICAgICBmYXVsdERlc2NyaXB0aW9ucyA9IGNyZWF0ZUZhdWx0RGVzY3JpcHRpb25zKCk7Ci0gICAgICAgICAgICBpc0xpc3RUeXBlID0gQ29udmVydGVyVXRpbHMuaGFzWG1sTGlzdEFubm90YXRpb24oc2VpTWV0aG9kLmdldEFubm90YXRpb25zKCkpOwotICAgICAgICB9Ci0gICAgICAgIC8vIFJlZ2lzdGVyIHVuZGVyc3Rvb2QgaGVhZGVycyBvbiBheGlzT3BlcmF0aW9uCi0gICAgICAgIHJlZ2lzdGVyTXVzdFVuZGVyc3RhbmRIZWFkZXJzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24gZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIHBhcmVudEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb247Ci0gICAgfQotCi0gICAgcHVibGljIEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb25JbXBsIGdldEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb25JbXBsKCkgewotICAgICAgICByZXR1cm4gKEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb25JbXBsKXBhcmVudEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb247Ci0gICAgfQotCi0gICAgcHVibGljIEF4aXNPcGVyYXRpb24gZ2V0QXhpc09wZXJhdGlvbigpIHsKLSAgICAgICAgLy8gTm90ZSB0aGF0IG9ubHkgdGhlIHN5bmMgb3BlcmF0aW9ucywgYW5kIG5vdCB0aGUgSkFYLVdTIGFzeW5jIGNsaWVudCB2ZXJzaW9ucyBvZiBhbiAKLSAgICAgICAgLy8gb3BlcmF0aW9uLCB3aWxsIGhhdmUgYW4gQXhpc09wZXJhdGlvbiBhc3NvY2lhdGVkIHdpdGggaXQuICBGb3IgdGhvc2UgYXN5bmMgb3BlcmF0aW9ucywgCi0gICAgICAgIC8vIGdldCB0aGUgQXhpc09wZXJhdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIHN5bmMgbWV0aG9kIGFuZCByZXR1cm4gdGhhdC4KLSAgICAgICAgaWYgKGF4aXNPcGVyYXRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgT3BlcmF0aW9uRGVzY3JpcHRpb24gb3BEZXNjID0gZ2V0U3luY09wZXJhdGlvbigpOwotICAgICAgICAgICAgaWYgKG9wRGVzYyAhPSBudWxsICYmIG9wRGVzYyAhPSB0aGlzKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldFN5bmNPcGVyYXRpb24oKS5nZXRBeGlzT3BlcmF0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gCi0gICAgICAgIAotICAgICAgICByZXR1cm4gYXhpc09wZXJhdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUU5hbWUgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG9wZXJhdGlvblFOYW1lOwotICAgIH0KLQotICAgIC8vIEphdmEtcmVsYXRlZCBnZXR0ZXJzCi0gICAgcHVibGljIFN0cmluZyBnZXRKYXZhTWV0aG9kTmFtZSgpIHsKLSAgICAgICAgU3RyaW5nIHJldHVyblN0cmluZyA9IG51bGw7Ci0KLSAgICAgICAgaWYgKCFpc0RCQygpKSB7Ci0gICAgICAgICAgICBpZiAoc2VpTWV0aG9kICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm5TdHJpbmcgPSBzZWlNZXRob2QuZ2V0TmFtZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKG1ldGhvZENvbXBvc2l0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuU3RyaW5nID0gbWV0aG9kQ29tcG9zaXRlLmdldE1ldGhvZE5hbWUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXR1cm5TdHJpbmc7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRKYXZhRGVjbGFyaW5nQ2xhc3NOYW1lKCkgewotICAgICAgICBpZiAoIWlzREJDKCkgJiYgc2VpTWV0aG9kICE9IG51bGwpIHsKLSAgICAgICAgICAgIENsYXNzIGNsYXp6ID0gc2VpTWV0aG9kLmdldERlY2xhcmluZ0NsYXNzKCk7Ci0gICAgICAgICAgICByZXR1cm4gY2xhenouZ2V0Q2Fub25pY2FsTmFtZSgpOwotICAgICAgICB9IGVsc2UgaWYgKG1ldGhvZENvbXBvc2l0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbWV0aG9kQ29tcG9zaXRlLmdldERlY2xhcmluZ0NsYXNzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZ1tdIGdldEphdmFQYXJhbWV0ZXJzKCkgewotCi0gICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IHJldHVyblBhcmFtZXRlcnMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQotICAgICAgICBpZiAoIWlzREJDKCkpIHsKLSAgICAgICAgICAgIGlmIChzZWlNZXRob2QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIENsYXNzW10gcGFyYW1hdGVycyA9IHNlaU1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpOwotICAgICAgICAgICAgICAgIGZvciAoQ2xhc3MgcGFyYW0gOiBwYXJhbWF0ZXJzKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVyblBhcmFtZXRlcnMuYWRkKHBhcmFtLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAobWV0aG9kQ29tcG9zaXRlICE9IG51bGwpIHsKLQotICAgICAgICAgICAgICAgIEl0ZXJhdG9yPFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlPiBpdGVyID0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZENvbXBvc2l0ZS5nZXRQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZUxpc3QoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm5QYXJhbWV0ZXJzLmFkZChpdGVyLm5leHQoKS5nZXRQYXJhbWV0ZXJUeXBlKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIFRPRE86IFRoaXMgaXMgZGlmZmVyZW50IHRoYW4gdGhlIHJlc3QsIHdoaWNoIHJldHVybiBudWxsIGluc3RlYWQgb2YgYW4gZW1wdHkgYXJyYXkKLSAgICAgICAgcmV0dXJuIHJldHVyblBhcmFtZXRlcnMudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBOb3RlIHRoaXMgd2lsbCByZXR1cm4gTlVMTCB1bmxlc3MgdGhlIG9wZXJhdGlvbiB3YXMgYnVpbHQgdmlhIGludHJvc3BlY3Rpb24gb24gdGhlIFNFSS4gSW4KLSAgICAgKiBvdGhlciB3b3JkcywgaXQgd2lsbCByZXR1cm4gbnVsbCBpZiB0aGUgb3BlcmF0aW9uIHdhcyBidWlsdCB3aXRoIFdTREwuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIE1ldGhvZCBnZXRTRUlNZXRob2QoKSB7Ci0gICAgICAgIHJldHVybiBzZWlNZXRob2Q7Ci0gICAgfQotCi0gICAgTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUgZ2V0TWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUoKSB7Ci0gICAgICAgIHJldHVybiBtZXRob2RDb21wb3NpdGU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzV3JhcHBlZFBhcmFtZXRlcnMoKSB7Ci0gICAgICAgIHJldHVybiBnZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCkgPT0gamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuUGFyYW1ldGVyU3R5bGUuV1JBUFBFRDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFBhcmFtZXRlckRlc2NyaXB0aW9uW10gY3JlYXRlUGFyYW1ldGVyRGVzY3JpcHRpb25zKCkgewotCi0gICAgICAgIEFycmF5TGlzdDxQYXJhbWV0ZXJEZXNjcmlwdGlvbj4gYnVpbGRQYXJhbWV0ZXJMaXN0ID0gbmV3IEFycmF5TGlzdDxQYXJhbWV0ZXJEZXNjcmlwdGlvbj4oKTsKLQotICAgICAgICBpZiAoIWlzREJDKCkpIHsKLSAgICAgICAgICAgIENsYXNzW10gcGFyYW1ldGVycyA9IHNlaU1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpOwotICAgICAgICAgICAgVHlwZVtdIHBhcmFtYXRlclR5cGVzID0gc2VpTWV0aG9kLmdldEdlbmVyaWNQYXJhbWV0ZXJUeXBlcygpOwotICAgICAgICAgICAgQW5ub3RhdGlvbltdW10gYW5ub3RhdGlvbnMgPSBzZWlNZXRob2QuZ2V0UGFyYW1ldGVyQW5ub3RhdGlvbnMoKTsKLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgUGFyYW1ldGVyRGVzY3JpcHRpb24gcGFyYW1EZXNjID0gbmV3IFBhcmFtZXRlckRlc2NyaXB0aW9uSW1wbChpLCBwYXJhbWV0ZXJzW2ldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1hdGVyVHlwZXNbaV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uc1tpXSwgdGhpcyk7Ci0gICAgICAgICAgICAgICAgYnVpbGRQYXJhbWV0ZXJMaXN0LmFkZChwYXJhbURlc2MpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZSBwZGMgPSBudWxsOwotICAgICAgICAgICAgSXRlcmF0b3I8UGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGU+IGl0ZXIgPQotICAgICAgICAgICAgICAgICAgICBtZXRob2RDb21wb3NpdGUuZ2V0UGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGVMaXN0KCkuaXRlcmF0b3IoKTsKLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RDb21wb3NpdGUuZ2V0UGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGVMaXN0KCkuc2l6ZSgpOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgUGFyYW1ldGVyRGVzY3JpcHRpb24gcGFyYW1EZXNjID0KLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBQYXJhbWV0ZXJEZXNjcmlwdGlvbkltcGwoaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQ29tcG9zaXRlLmdldFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzKTsKLSAgICAgICAgICAgICAgICBidWlsZFBhcmFtZXRlckxpc3QuYWRkKHBhcmFtRGVzYyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gYnVpbGRQYXJhbWV0ZXJMaXN0LnRvQXJyYXkobmV3IFBhcmFtZXRlckRlc2NyaXB0aW9uW2J1aWxkUGFyYW1ldGVyTGlzdC5zaXplKCldKTsKLQotICAgIH0KLQotICAgIHByaXZhdGUgRmF1bHREZXNjcmlwdGlvbltdIGNyZWF0ZUZhdWx0RGVzY3JpcHRpb25zKCkgewotCi0gICAgICAgIEFycmF5TGlzdDxGYXVsdERlc2NyaXB0aW9uPiBidWlsZEZhdWx0TGlzdCA9IG5ldyBBcnJheUxpc3Q8RmF1bHREZXNjcmlwdGlvbj4oKTsKLQotICAgICAgICBpZiAoIWlzREJDKCkpIHsKLSAgICAgICAgICAgIC8vIGdldCBleGNlcHRpb25zIHRoaXMgbWV0aG9kICJ0aHJvd3MiCi0gICAgICAgICAgICBDbGFzc1tdIHdlYkZhdWx0Q2xhc3NlcyA9IHNlaU1ldGhvZC5nZXRFeGNlcHRpb25UeXBlcygpOwotCi0gICAgICAgICAgICBmb3IgKENsYXNzIHdmQ2xhc3MgOiB3ZWJGYXVsdENsYXNzZXMpIHsKLSAgICAgICAgICAgICAgICAvLyBhY2NvcmRpbmcgdG8gSkFYV1MgMy43LCB0aGUgQFdlYkZhdWx0IGFubm90YXRpb24gaXMgb25seSB1c2VkIGZvciBjdXN0b21pemF0aW9ucywKLSAgICAgICAgICAgICAgICAvLyBzbyB3ZSdsbCBhZGQgYWxsIGRlY2xhcmVkIGV4Y2VwdGlvbnMKLSAgICAgICAgICAgICAgICBXZWJGYXVsdCB3ZmFubm8gPSBudWxsOwotICAgICAgICAgICAgICAgIGZvciAoQW5ub3RhdGlvbiBhbm5vIDogd2ZDbGFzcy5nZXRBbm5vdGF0aW9ucygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhbm5vLmFubm90YXRpb25UeXBlKCkgPT0gV2ViRmF1bHQuY2xhc3MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdmYW5ubyA9IChXZWJGYXVsdClhbm5vOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJ1aWxkRmF1bHRMaXN0LmFkZChuZXcgRmF1bHREZXNjcmlwdGlvbkltcGwod2ZDbGFzcywgd2Zhbm5vLCB0aGlzKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBUT0RPIGRvIEkgY2FyZSBhYm91dCBtZXRob2RDb21wb3NpdGUgbGlrZSB0aGUgcGFyYW1EZXNjcmlwdGlvbiBkb2VzPwotICAgICAgICAgICAgLy9DYWxsIEZhdWx0RGVzY3JpcHRpb25JbXBsIGZvciBhbGwgbm9uLWdlbmVyaWMgZXhjZXB0aW9ucy4uLk5lZWQgdG8gY2hlY2sgYQotICAgICAgICAgICAgLy8gYSBjb3VwbGUgb2YgdGhpbmdzCi0gICAgICAgICAgICAvLyAxLiBJZiB0aGlzIGlzIGEgZ2VuZXJpYyBleGNlcHRpb24sIGlnbm9yZSBpdAotICAgICAgICAgICAgLy8gMi4gSWYgdGhpcyBpcyBub3QgYSBnZW5lcmljIGV4Y2VwdGlvbiwgdGhlbiBmaW5kIGl0IGluIHRoZSBEQkMgTWFwCi0gICAgICAgICAgICAvLyAgICAgICBJZiBub3QgZm91bmQgaW4gbWFwLCB0aGVuIHRocm93IG5vdCBmb3VuZCBleGNlcHRpb24KLSAgICAgICAgICAgIC8vMy4gUGFzcyB0aGUgdmFsaWRhdGVkIFdlYkZhdWx0IGRiYyBhbmQgcG9zc2libHkgdGhlIGNsYXNzSW1wbCBkYmMgdG8gRmF1bHREZXNjcmlwdGlvbgotICAgICAgICAgICAgLy80LiBQb3NzaWJseSBzZXQgQXhpc09wZXJhdGlvbi5zZXRGYXVsdE1lc3NhZ2VzIGFycmF5Li4ub3Igc29tZXRoaW5nIGxpa2UgdGhhdAotCi0gICAgICAgICAgICBTdHJpbmdbXSB3ZWJGYXVsdENsYXNzTmFtZXMgPSBtZXRob2RDb21wb3NpdGUuZ2V0RXhjZXB0aW9ucygpOwotCi0gICAgICAgICAgICBIYXNoTWFwPFN0cmluZywgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlPiBkYmNNYXAgPQotICAgICAgICAgICAgICAgICAgICBnZXRFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uSW1wbCgpLmdldEVuZHBvaW50RGVzY3JpcHRpb25JbXBsKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0U2VydmljZURlc2NyaXB0aW9uSW1wbCgpLmdldERCQ01hcCgpOwotCi0gICAgICAgICAgICBpZiAod2ViRmF1bHRDbGFzc05hbWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyB3ZkNsYXNzTmFtZSA6IHdlYkZhdWx0Q2xhc3NOYW1lcykgewotICAgICAgICAgICAgICAgICAgICAvLwlUcnkgdG8gZmluZCB0aGlzIGV4Y2VwdGlvbiBjbGFzcyBpbiB0aGUgZGJjIGxpc3QuIElmIHdlIGNhbid0IGZpbmQgaXQKLSAgICAgICAgICAgICAgICAgICAgLy8gIHRoZW4ganVzdCBhc3N1bWUgdGhhdCBpdHMgYSBnZW5lcmljIGV4Y2VwdGlvbi4KLQotICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgZmF1bHREQkMgPSBkYmNNYXAuZ2V0KHdmQ2xhc3NOYW1lKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoZmF1bHREQkMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gSkFYV1MgMy43IGRvZXMgbm90IHJlcXVpcmUgQFdlYkZhdWx0IGFubm90YXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGZvdW5kIGEgdmFsaWQgZXhjZXB0aW9uIGNvbXBvc2l0ZSB0aGF0cyBhbm5vdGF0ZWQKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkRmF1bHRMaXN0LmFkZChuZXcgRmF1bHREZXNjcmlwdGlvbkltcGwoZmF1bHREQkMsIHRoaXMpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGJ1aWxkRmF1bHRMaXN0LnRvQXJyYXkobmV3IEZhdWx0RGVzY3JpcHRpb25bMF0pOwotICAgIH0KLQotICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAvLyBBTk5PVEFUSU9OOiBXZWJNZXRob2QKLSAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgcHVibGljIFdlYk1ldGhvZCBnZXRBbm5vV2ViTWV0aG9kKCkgewotICAgICAgICBpZiAod2ViTWV0aG9kQW5ub3RhdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoaXNEQkMoKSAmJiBtZXRob2RDb21wb3NpdGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHdlYk1ldGhvZEFubm90YXRpb24gPSBtZXRob2RDb21wb3NpdGUuZ2V0V2ViTWV0aG9kQW5ub3QoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIWlzREJDKCkgJiYgc2VpTWV0aG9kICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB3ZWJNZXRob2RBbm5vdGF0aW9uID0gKFdlYk1ldGhvZCkgZ2V0QW5ub3RhdGlvbihzZWlNZXRob2QsIFdlYk1ldGhvZC5jbGFzcyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlVuYWJsZSB0byBnZXQgV2ViTWV0aG9kIGFubm90YXRpb24iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHdlYk1ldGhvZEFubm90YXRpb247Ci0gICAgfQotCi0gICAgc3RhdGljIFFOYW1lIGRldGVybWluZU9wZXJhdGlvblFOYW1lKE1ldGhvZCBqYXZhTWV0aG9kKSB7Ci0gICAgICAgIHJldHVybiBuZXcgUU5hbWUoZGV0ZXJtaW5lT3BlcmF0aW9uTmFtZShqYXZhTWV0aG9kKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBRTmFtZSBkZXRlcm1pbmVPcGVyYXRpb25RTmFtZShNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSBtZGMpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBRTmFtZShkZXRlcm1pbmVPcGVyYXRpb25OYW1lKG1kYykpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBkZXRlcm1pbmVPcGVyYXRpb25OYW1lKE1ldGhvZCBqYXZhTWV0aG9kKSB7Ci0KLSAgICAgICAgU3RyaW5nIG9wZXJhdGlvbk5hbWUgPSBudWxsOwotICAgICAgICBpZiAoamF2YU1ldGhvZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIFdlYk1ldGhvZCB3bUFubm90YXRpb24gPSAoV2ViTWV0aG9kKSBnZXRBbm5vdGF0aW9uKGphdmFNZXRob2QsV2ViTWV0aG9kLmNsYXNzKTsKLSAgICAgICAgLy8gUGVyIEpTUi0xODEgTVIgU2VjIDQuMiAiQW5ub3RhdGlvbjogamF2YXguandzLldlYk1ldGhvZCIgcGcgMTcsCi0gICAgICAgIC8vIGlmIEBXZWJNZXRob2Qgc3BlY2lmaWVzIGFuZCBvcGVyYXRpb24gbmFtZSwgdXNlIHRoYXQuICBPdGhlcndpc2UKLSAgICAgICAgLy8gZGVmYXVsdCBpcyB0aGUgSmF2YSBtZXRob2QgbmFtZQotICAgICAgICBpZiAod21Bbm5vdGF0aW9uICE9IG51bGwgJiYgIURlc2NyaXB0aW9uVXRpbHMuaXNFbXB0eSh3bUFubm90YXRpb24ub3BlcmF0aW9uTmFtZSgpKSkgewotICAgICAgICAgICAgb3BlcmF0aW9uTmFtZSA9IHdtQW5ub3RhdGlvbi5vcGVyYXRpb25OYW1lKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBvcGVyYXRpb25OYW1lID0gamF2YU1ldGhvZC5nZXROYW1lKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gb3BlcmF0aW9uTmFtZTsKLSAgICB9Ci0KLSAgICAvL1RPRE86IEZvciBub3csIHdlIGFyZSBvdmVycmlkaW5nIHRoZSBhYm92ZSBtZXRob2Qgb25seSBiZWNhdXNlIGl0IGlzIHN0YXRpYywgdGhlc2Ugc2hvdWxkCi0gICAgLy9iZSBjb21iaW5lZCBhdCBzb21lIHBvaW50Ci0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGRldGVybWluZU9wZXJhdGlvbk5hbWUoTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUgbWRjKSB7Ci0gICAgICAgIFN0cmluZyBvcGVyYXRpb25OYW1lID0gbnVsbDsKLQotICAgICAgICBpZiAobWRjID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIFdlYk1ldGhvZCB3bUFubm90YXRpb24gPSBtZGMuZ2V0V2ViTWV0aG9kQW5ub3QoKTsKLSAgICAgICAgaWYgKHdtQW5ub3RhdGlvbiAhPSBudWxsICYmICFEZXNjcmlwdGlvblV0aWxzLmlzRW1wdHkod21Bbm5vdGF0aW9uLm9wZXJhdGlvbk5hbWUoKSkpIHsKLSAgICAgICAgICAgIG9wZXJhdGlvbk5hbWUgPSB3bUFubm90YXRpb24ub3BlcmF0aW9uTmFtZSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgb3BlcmF0aW9uTmFtZSA9IG1kYy5nZXRNZXRob2ROYW1lKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gb3BlcmF0aW9uTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE9wZXJhdGlvbk5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBnZXRBbm5vV2ViTWV0aG9kT3BlcmF0aW9uTmFtZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QW5ub1dlYk1ldGhvZE9wZXJhdGlvbk5hbWUoKSB7Ci0gICAgICAgIGlmICh3ZWJNZXRob2RPcGVyYXRpb25OYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmICghaXNEQkMoKSAmJiBzZWlNZXRob2QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHdlYk1ldGhvZE9wZXJhdGlvbk5hbWUgPSBkZXRlcm1pbmVPcGVyYXRpb25OYW1lKHNlaU1ldGhvZCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1ldGhvZENvbXBvc2l0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgd2ViTWV0aG9kT3BlcmF0aW9uTmFtZSA9IGRldGVybWluZU9wZXJhdGlvbk5hbWUobWV0aG9kQ29tcG9zaXRlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gd2ViTWV0aG9kT3BlcmF0aW9uTmFtZTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLk9wZXJhdGlvbkRlc2NyaXB0aW9uI2dldFN5bmNPcGVyYXRpb24oKQotICAgICAqLwotICAgIHB1YmxpYyBPcGVyYXRpb25EZXNjcmlwdGlvbiBnZXRTeW5jT3BlcmF0aW9uKCkgewotCi0gICAgICAgIGlmIChzeW5jT3BlcmF0aW9uRGVzY3JpcHRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gTm8gbmVlZCB0byBkbyBhbnl0aGluZzsgdGhlIHN5bmMgb3BlcmF0aW9uIGhhcyBhbHJlYWR5IGJlZW4gc2V0IGFuZCB3aWxsIGJlCi0gICAgICAgICAgICAvLyByZXR1cm5lZCBiZWxvdwotICAgICAgICB9IGVsc2UgaWYgKCFpc0pBWFdTQXN5bmNDbGllbnRNZXRob2QoKSkgewotICAgICAgICAgICAgLy8gVGhlIGN1cnJlbnQgT3BEZXNjIGlzIG5vdCBhbiBhc3luYyBvcGVyYXRpb24uICBDYWNoZSBpdCwgdGhlbiByZXR1cm4gaXQgYmVsb3cuCi0gICAgICAgICAgICBzeW5jT3BlcmF0aW9uRGVzY3JpcHRpb24gPSB0aGlzOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gV2UgaGF2ZW4ndCBmb3VuZCBhIHN5bmMgb3BkZXNjIGZvciB0aGlzIG9wZXJhdGlvbiB5ZXQsIHNvIHRyeSBhZ2Fpbi4gIFNlZSB0aGUgCi0gICAgICAgICAgICAvLyBjb21tZW50cyBpbiB0aGUgaW50ZXJmYWNlIGRlY2xhcmF0aW9uIGZvciB0aGlzIG1ldGhvZCBvbiB3aHkgdGhpcyBtaWdodCBvY2N1ci4KLSAgICAgICAgICAgIE9wZXJhdGlvbkRlc2NyaXB0aW9uIG9wRGVzYyA9IG51bGw7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFN0cmluZyB3ZWJNZXRob2RBbm5vTmFtZSA9IGdldE9wZXJhdGlvbk5hbWUoKTsKLSAgICAgICAgICAgIFN0cmluZyBqYXZhTWV0aG9kTmFtZSA9IGdldEphdmFNZXRob2ROYW1lKCk7Ci0gICAgICAgICAgICBpZiAod2ViTWV0aG9kQW5ub05hbWUgIT0gbnVsbCAmJiB3ZWJNZXRob2RBbm5vTmFtZS5sZW5ndGgoKSA+IDAgJiYKLSAgICAgICAgICAgICAgICAgICAgd2ViTWV0aG9kQW5ub05hbWUgIT0gamF2YU1ldGhvZE5hbWUpIHsKLSAgICAgICAgICAgICAgICBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uIGVpZCA9IGdldEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24oKTsKLSAgICAgICAgICAgICAgICBpZiAoZWlkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgLy9zZWFyY2hpbmcgZm9yIG9wRGVzYyBvZiBzeW5jIG9wZXJhdGlvbi4KLSAgICAgICAgICAgICAgICAgICAgT3BlcmF0aW9uRGVzY3JpcHRpb25bXSBvZHMgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBvZHMgPSBlaWQuZ2V0T3BlcmF0aW9uRm9ySmF2YU1ldGhvZCh3ZWJNZXRob2RBbm5vTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvZHMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChPcGVyYXRpb25EZXNjcmlwdGlvbiBvZCA6IG9kcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvZC5nZXRKYXZhTWV0aG9kTmFtZSgpLmVxdWFscyh3ZWJNZXRob2RBbm5vTmFtZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICFvZC5pc0pBWFdTQXN5bmNDbGllbnRNZXRob2QoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcERlc2MgPSBvZDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gTm90ZSB0aGF0IG9wRGVzYyBtaWdodCBzdGlsbCBiZSBudWxsCi0gICAgICAgICAgICBzeW5jT3BlcmF0aW9uRGVzY3JpcHRpb24gPSBvcERlc2M7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN5bmNPcGVyYXRpb25EZXNjcmlwdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEFjdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIGdldEFubm9XZWJNZXRob2RBY3Rpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEFubm9XZWJNZXRob2RBY3Rpb24oKSB7Ci0gICAgICAgIGlmICh3ZWJNZXRob2RBY3Rpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGdldEFubm9XZWJNZXRob2QoKSAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgICAgICFEZXNjcmlwdGlvblV0aWxzLmlzRW1wdHkoZ2V0QW5ub1dlYk1ldGhvZCgpLmFjdGlvbigpKSkgewotICAgICAgICAgICAgICAgIHdlYk1ldGhvZEFjdGlvbiA9IGdldEFubm9XZWJNZXRob2QoKS5hY3Rpb24oKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgd2ViTWV0aG9kQWN0aW9uID0gV2ViTWV0aG9kX0FjdGlvbl9ERUZBVUxUOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB3ZWJNZXRob2RBY3Rpb247Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNFeGNsdWRlZCgpIHsKLSAgICAgICAgcmV0dXJuIGdldEFubm9XZWJNZXRob2RFeGNsdWRlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0QW5ub1dlYk1ldGhvZEV4Y2x1ZGUoKSB7Ci0gICAgICAgIGlmICh3ZWJNZXRob2RFeGNsdWRlID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIFRPRE86IFZhbGlkYXRpb246IGlmIHRoaXMgYXR0cmlidXRlIHNwZWNpZmllZCwgbm8gb3RoZXIgZWxlbWVudHMgYWxsb3dlZCBwZXIgSlNSLTE4MSBNUiBTZWMgNC4yLCBwZyAxNwotICAgICAgICAgICAgLy8gVE9ETzogVmFsaWRhdGlvbjogVGhpcyBlbGVtZW50IGlzIG5vdCBhbGxvd2VkIG9uIGVuZHBvaW50IGludGVyZmFjZXMKLSAgICAgICAgICAgIC8vIFVubGlrZSB0aGUgZWxlbWVudHMgd2l0aCBhIFN0cmluZyB2YWx1ZSwgaWYgdGhlIGFubm90YXRpb24gaXMgcHJlc2VudCwgZXhjbHVkZSB3aWxsIGFsd2F5cyAKLSAgICAgICAgICAgIC8vIHJldHVybiBhIHVzYWJsZSB2YWx1ZSBzaW5jZSBpdCB3aWxsIGRlZmF1bHQgdG8gRkFMU0UgaWYgdGhlIGVsZW1lbnQgaXMgbm90IHByZXNlbnQuCi0gICAgICAgICAgICBpZiAoZ2V0QW5ub1dlYk1ldGhvZCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB3ZWJNZXRob2RFeGNsdWRlID0gbmV3IEJvb2xlYW4oZ2V0QW5ub1dlYk1ldGhvZCgpLmV4Y2x1ZGUoKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHdlYk1ldGhvZEV4Y2x1ZGUgPSBXZWJNZXRob2RfRXhjbHVkZV9ERUZBVUxUOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHdlYk1ldGhvZEV4Y2x1ZGUuYm9vbGVhblZhbHVlKCk7Ci0gICAgfQotCi0gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgLy8gQU5OT1RBVElPTjogUmVxdWVzdFdyYXBwZXIKLSAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBwdWJsaWMgUmVxdWVzdFdyYXBwZXIgZ2V0QW5ub1JlcXVlc3RXcmFwcGVyKCkgewotICAgICAgICBpZiAocmVxdWVzdFdyYXBwZXJBbm5vdGF0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmICghaXNEQkMoKSAmJiBzZWlNZXRob2QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJlcXVlc3RXcmFwcGVyQW5ub3RhdGlvbiA9IChSZXF1ZXN0V3JhcHBlcikgCi0gICAgICAgICAgICAgICAgICAgIGdldEFubm90YXRpb24oc2VpTWV0aG9kLFJlcXVlc3RXcmFwcGVyLmNsYXNzKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNEQkMoKSAmJiBtZXRob2RDb21wb3NpdGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJlcXVlc3RXcmFwcGVyQW5ub3RhdGlvbiA9IG1ldGhvZENvbXBvc2l0ZS5nZXRSZXF1ZXN0V3JhcHBlckFubm90KCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlVuYWJsZSB0byBnZXQgUmVxdWVzdFdyYXBwZXIgYW5ub3RhdGlvbiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVxdWVzdFdyYXBwZXJBbm5vdGF0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVxdWVzdFdyYXBwZXJMb2NhbE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBnZXRBbm5vUmVxdWVzdFdyYXBwZXJMb2NhbE5hbWUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGb3Igd3JhcHBlZCBwYXJhbWV0ZXIgc3R5bGUgKGJhc2VkIG9uIHRoZSBhbm5vdGF0aW9uIGFuZCB0aGUgV1NETCksIHJldHVybnMgdGhlIHdyYXBwZXIKLSAgICAgKiB2YWx1ZS4gIEZvciBub24td3JhcHBlZCAoaS5lLiBiYXJlKSBwYXJhbWV0ZXIgc3R5bGUsIHJldHVybnMgbnVsbC4KLSAgICAgKgotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEFubm9SZXF1ZXN0V3JhcHBlckxvY2FsTmFtZSgpIHsKLSAgICAgICAgaWYgKCFpc1dyYXBwZWRQYXJhbWV0ZXJzKCkpIHsKLSAgICAgICAgICAgIC8vIEEgd3JhcHBlciBpcyBvbmx5IG1lYW5pbmdmdWwgZm9yIHdyYXBwZWQgcGFyYW1ldGVycwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJlcXVlc3RXcmFwcGVyTG9jYWxOYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChnZXRBbm5vUmVxdWVzdFdyYXBwZXIoKSAhPSBudWxsCi0gICAgICAgICAgICAgICAgICAgICYmICFEZXNjcmlwdGlvblV0aWxzLmlzRW1wdHkoZ2V0QW5ub1JlcXVlc3RXcmFwcGVyKCkubG9jYWxOYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgcmVxdWVzdFdyYXBwZXJMb2NhbE5hbWUgPSBnZXRBbm5vUmVxdWVzdFdyYXBwZXIoKS5sb2NhbE5hbWUoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhlIGRlZmF1bHQgdmFsdWUgb2YgbG9jYWxOYW1lIGlzIHRoZSB2YWx1ZSBvZiBvcGVyYXRpb25RTmFtZSBhcwotICAgICAgICAgICAgICAgIC8vIGRlZmluZWQgaW4gdGhlIFdlYk1ldGhvZCBhbm5vdGF0aW9uLiBbSkFYLVdTIFNlYy4gNy4zLCBwLiA4MF0KLSAgICAgICAgICAgICAgICByZXF1ZXN0V3JhcHBlckxvY2FsTmFtZSA9IGdldEFubm9XZWJNZXRob2RPcGVyYXRpb25OYW1lKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlcXVlc3RXcmFwcGVyTG9jYWxOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVxdWVzdFdyYXBwZXJUYXJnZXROYW1lc3BhY2UoKSB7Ci0gICAgICAgIHJldHVybiBnZXRBbm5vUmVxdWVzdFdyYXBwZXJUYXJnZXROYW1lc3BhY2UoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGb3Igd3JhcHBlZCBwYXJhbWV0ZXIgc3R5bGUgKGJhc2VkIG9uIHRoZSBhbm5vdGF0aW9uIGFuZCB0aGUgV1NETCksIHJldHVybnMgdGhlIHdyYXBwZXIKLSAgICAgKiB2YWx1ZS4gIEZvciBub24td3JhcHBlZCAoaS5lLiBiYXJlKSBwYXJhbWV0ZXIgc3R5bGUsIHJldHVybnMgbnVsbC4KLSAgICAgKgotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEFubm9SZXF1ZXN0V3JhcHBlclRhcmdldE5hbWVzcGFjZSgpIHsKLSAgICAgICAgaWYgKCFpc1dyYXBwZWRQYXJhbWV0ZXJzKCkpIHsKLSAgICAgICAgICAgIC8vIEEgd3JhcHBlciBpcyBvbmx5IG1lYW5pbmdmdWwgZm9yIHdyYXBwZWQgcGFyYW1ldGVycwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJlcXVlc3RXcmFwcGVyVGFyZ2V0TmFtZXNwYWNlID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChnZXRBbm5vUmVxdWVzdFdyYXBwZXIoKSAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgICAgICFEZXNjcmlwdGlvblV0aWxzLmlzRW1wdHkoZ2V0QW5ub1JlcXVlc3RXcmFwcGVyKCkudGFyZ2V0TmFtZXNwYWNlKCkpKSB7Ci0gICAgICAgICAgICAgICAgcmVxdWVzdFdyYXBwZXJUYXJnZXROYW1lc3BhY2UgPSBnZXRBbm5vUmVxdWVzdFdyYXBwZXIoKS50YXJnZXROYW1lc3BhY2UoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRhcmdldE5hbWVzcGFjZSBpcyB0aGUgdGFyZ2V0IG5hbWVzcGFjZSBvZiB0aGUgU0VJLiBbSkFYLVdTIFNlYyA3LjMsIHAuIDgwXQotICAgICAgICAgICAgICAgIHJlcXVlc3RXcmFwcGVyVGFyZ2V0TmFtZXNwYWNlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGdldEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24oKS5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVxdWVzdFdyYXBwZXJUYXJnZXROYW1lc3BhY2U7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRSZXF1ZXN0V3JhcHBlckNsYXNzTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGdldEFubm9SZXF1ZXN0V3JhcHBlckNsYXNzTmFtZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZvciB3cmFwcGVkIHBhcmFtZXRlciBzdHlsZSAoYmFzZWQgb24gdGhlIGFubm90YXRpb24gYW5kIHRoZSBXU0RMKSwgcmV0dXJucyB0aGUgd3JhcHBlcgotICAgICAqIHZhbHVlLiAgRm9yIG5vbi13cmFwcGVkIChpLmUuIGJhcmUpIHBhcmFtZXRlciBzdHlsZSwgcmV0dXJucyBudWxsLgotICAgICAqCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QW5ub1JlcXVlc3RXcmFwcGVyQ2xhc3NOYW1lKCkgewotICAgICAgICBpZiAoIWlzV3JhcHBlZFBhcmFtZXRlcnMoKSkgewotICAgICAgICAgICAgLy8gQSB3cmFwcGVyIGlzIG9ubHkgbWVhbmluZ2Z1bCBmb3Igd3JhcHBlZCBwYXJhbWV0ZXJzCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBpZiAocmVxdWVzdFdyYXBwZXJDbGFzc05hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGdldEFubm9SZXF1ZXN0V3JhcHBlcigpICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAgICAgIURlc2NyaXB0aW9uVXRpbHMuaXNFbXB0eShnZXRBbm5vUmVxdWVzdFdyYXBwZXIoKS5jbGFzc05hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICByZXF1ZXN0V3JhcHBlckNsYXNzTmFtZSA9IGdldEFubm9SZXF1ZXN0V3JhcHBlcigpLmNsYXNzTmFtZSgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBUaGVyZSBpcyBubyBkZWZhdWx0IGZvciB0aGUgUmVxdWVzdFdyYXBwZXIgY2xhc3MgbmFtZS4gIAotICAgICAgICAgICAgICAgIC8vIEluIHN1Y2ggY2FzZXMgdGhlIHByb2dyYW1taW5nIGxheWVyIChKQVhXUykgbWF5IHVzZSBhIHByb2dyYW1taW5nIHNwZWMgc3BlY2lmaWMKLSAgICAgICAgICAgICAgICAvLyBtZWNoYW5pc20gdG8gZmluZCB0aGUgY2xhc3MsIGJ1aWxkIHRoZSBjbGFzcywgb3Igb3BlcmF0ZSB3aXRob3V0IHRoZSBjbGFzcy4KLSAgICAgICAgICAgICAgICByZXF1ZXN0V3JhcHBlckNsYXNzTmFtZSA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlcXVlc3RXcmFwcGVyQ2xhc3NOYW1lOwotICAgIH0KLQotICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAvLyBBTk5PVEFUSU9OOiBSZXNwb25zZVdyYXBwZXIKLSAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgcHVibGljIFJlc3BvbnNlV3JhcHBlciBnZXRBbm5vUmVzcG9uc2VXcmFwcGVyKCkgewotICAgICAgICBpZiAocmVzcG9uc2VXcmFwcGVyQW5ub3RhdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoIWlzREJDKCkgJiYgc2VpTWV0aG9kICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXNwb25zZVdyYXBwZXJBbm5vdGF0aW9uID0gKFJlc3BvbnNlV3JhcHBlcikKLSAgICAgICAgICAgICAgICAgICAgZ2V0QW5ub3RhdGlvbihzZWlNZXRob2QsUmVzcG9uc2VXcmFwcGVyLmNsYXNzKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNEQkMoKSAmJiBtZXRob2RDb21wb3NpdGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJlc3BvbnNlV3JhcHBlckFubm90YXRpb24gPSBtZXRob2RDb21wb3NpdGUuZ2V0UmVzcG9uc2VXcmFwcGVyQW5ub3QoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiVW5hYmxlIHRvIGdldCBSZXNwb25zZVdyYXBwZXIgYW5ub3RhdGlvbiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzcG9uc2VXcmFwcGVyQW5ub3RhdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFJlc3BvbnNlV3JhcHBlckxvY2FsTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGdldEFubm9SZXNwb25zZVdyYXBwZXJMb2NhbE5hbWUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGb3Igd3JhcHBlZCBwYXJhbWV0ZXIgc3R5bGUgKGJhc2VkIG9uIHRoZSBhbm5vdGF0aW9uIGFuZCB0aGUgV1NETCksIHJldHVybnMgdGhlIHdyYXBwZXIKLSAgICAgKiB2YWx1ZS4gIEZvciBub24td3JhcHBlZCAoaS5lLiBiYXJlKSBwYXJhbWV0ZXIgc3R5bGUsIHJldHVybnMgbnVsbC4KLSAgICAgKgotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEFubm9SZXNwb25zZVdyYXBwZXJMb2NhbE5hbWUoKSB7Ci0gICAgICAgIGlmICghaXNXcmFwcGVkUGFyYW1ldGVycygpKSB7Ci0gICAgICAgICAgICAvLyBBIHdyYXBwZXIgaXMgb25seSBtZWFuaW5nZnVsIGZvciB3cmFwcGVkIHBhcmFtZXRlcnMKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGlmIChyZXNwb25zZVdyYXBwZXJMb2NhbE5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGdldEFubm9SZXNwb25zZVdyYXBwZXIoKSAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgICAgICFEZXNjcmlwdGlvblV0aWxzLmlzRW1wdHkoZ2V0QW5ub1Jlc3BvbnNlV3JhcHBlcigpLmxvY2FsTmFtZSgpKSkgewotICAgICAgICAgICAgICAgIHJlc3BvbnNlV3JhcHBlckxvY2FsTmFtZSA9IGdldEFubm9SZXNwb25zZVdyYXBwZXIoKS5sb2NhbE5hbWUoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhlIGRlZmF1bHQgdmFsdWUgb2YgbG9jYWxOYW1lIGlzIHRoZSB2YWx1ZSBvZiBvcGVyYXRpb25RTmFtZSBhcyAKLSAgICAgICAgICAgICAgICAvLyBkZWZpbmVkIGluIHRoZSBXZWJNZXRob2QgYW5ub3RhdGlvbiBhcHBlbmRlZCB3aXRoICJSZXNwb25zZSIuIFtKQVgtV1MgU2VjLiA3LjQsIHAuIDgxXQotICAgICAgICAgICAgICAgIHJlc3BvbnNlV3JhcHBlckxvY2FsTmFtZSA9IGdldEFubm9XZWJNZXRob2RPcGVyYXRpb25OYW1lKCkgKyAiUmVzcG9uc2UiOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXNwb25zZVdyYXBwZXJMb2NhbE5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRSZXNwb25zZVdyYXBwZXJUYXJnZXROYW1lc3BhY2UoKSB7Ci0gICAgICAgIHJldHVybiBnZXRBbm5vUmVzcG9uc2VXcmFwcGVyVGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRm9yIHdyYXBwZWQgcGFyYW1ldGVyIHN0eWxlIChiYXNlZCBvbiB0aGUgYW5ub3RhdGlvbiBhbmQgdGhlIFdTREwpLCByZXR1cm5zIHRoZSB3cmFwcGVyCi0gICAgICogdmFsdWUuICBGb3Igbm9uLXdyYXBwZWQgKGkuZS4gYmFyZSkgcGFyYW1ldGVyIHN0eWxlLCByZXR1cm5zIG51bGwuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRBbm5vUmVzcG9uc2VXcmFwcGVyVGFyZ2V0TmFtZXNwYWNlKCkgewotICAgICAgICBpZiAoIWlzV3JhcHBlZFBhcmFtZXRlcnMoKSkgewotICAgICAgICAgICAgLy8gQSB3cmFwcGVyIGlzIG9ubHkgbWVhbmluZ2Z1bCBmb3Igd3JhcHBlZCBwYXJhbWV0ZXJzCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBpZiAocmVzcG9uc2VXcmFwcGVyVGFyZ2V0TmFtZXNwYWNlID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChnZXRBbm5vUmVzcG9uc2VXcmFwcGVyKCkgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgICAgICAhRGVzY3JpcHRpb25VdGlscy5pc0VtcHR5KGdldEFubm9SZXNwb25zZVdyYXBwZXIoKS50YXJnZXROYW1lc3BhY2UoKSkpIHsKLSAgICAgICAgICAgICAgICByZXNwb25zZVdyYXBwZXJUYXJnZXROYW1lc3BhY2UgPSBnZXRBbm5vUmVzcG9uc2VXcmFwcGVyKCkudGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIFRoZSBkZWZhdWx0IHZhbHVlIGZvciB0YXJnZXROYW1lc3BhY2UgaXMgdGhlIHRhcmdldCBuYW1lc3BhY2Ugb2YgdGhlIFNFSS4gW0pBWC1XUyBTZWMgNy4zLCBwLiA4MF0KLSAgICAgICAgICAgICAgICByZXNwb25zZVdyYXBwZXJUYXJnZXROYW1lc3BhY2UgPQotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbigpLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXNwb25zZVdyYXBwZXJUYXJnZXROYW1lc3BhY2U7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRSZXNwb25zZVdyYXBwZXJDbGFzc05hbWUoKSB7Ci0gICAgICAgIHJldHVybiBnZXRBbm5vUmVzcG9uc2VXcmFwcGVyQ2xhc3NOYW1lKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRm9yIHdyYXBwZWQgcGFyYW1ldGVyIHN0eWxlIChiYXNlZCBvbiB0aGUgYW5ub3RhdGlvbiBhbmQgdGhlIFdTREwpLCByZXR1cm5zIHRoZSB3cmFwcGVyCi0gICAgICogdmFsdWUuICBGb3Igbm9uLXdyYXBwZWQgKGkuZS4gYmFyZSkgcGFyYW1ldGVyIHN0eWxlLCByZXR1cm5zIG51bGwuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRBbm5vUmVzcG9uc2VXcmFwcGVyQ2xhc3NOYW1lKCkgewotICAgICAgICBpZiAoIWlzV3JhcHBlZFBhcmFtZXRlcnMoKSkgewotICAgICAgICAgICAgLy8gQSB3cmFwcGVyIGlzIG9ubHkgbWVhbmluZ2Z1bCBmb3Igd3JhcHBlZCBwYXJhbWV0ZXJzCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBpZiAocmVzcG9uc2VXcmFwcGVyQ2xhc3NOYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChnZXRBbm5vUmVzcG9uc2VXcmFwcGVyKCkgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgICAgICAhRGVzY3JpcHRpb25VdGlscy5pc0VtcHR5KGdldEFubm9SZXNwb25zZVdyYXBwZXIoKS5jbGFzc05hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICByZXNwb25zZVdyYXBwZXJDbGFzc05hbWUgPSBnZXRBbm5vUmVzcG9uc2VXcmFwcGVyKCkuY2xhc3NOYW1lKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIFRoZXJlIGlzIG5vIGRlZmF1bHQgZm9yIHRoZSBSZXNwb25zZVdyYXBwZXIgY2xhc3MgbmFtZS4gIAotICAgICAgICAgICAgICAgIC8vIEluIHN1Y2ggY2FzZXMgdGhlIHByb2dyYW1taW5nIGxheWVyIChKQVhXUykgbWF5IHVzZSBhIHByb2dyYW1taW5nIHNwZWMgc3BlY2lmaWMKLSAgICAgICAgICAgICAgICAvLyBtZWNoYW5pc20gdG8gZmluZCB0aGUgY2xhc3MsIGJ1aWxkIHRoZSBjbGFzcywgb3Igb3BlcmF0ZSB3aXRob3V0IHRoZSBjbGFzcy4KLSAgICAgICAgICAgICAgICByZXNwb25zZVdyYXBwZXJDbGFzc05hbWUgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXNwb25zZVdyYXBwZXJDbGFzc05hbWU7Ci0gICAgfQotCi0gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIC8vIEFOTk9UQVRJT046IFdlYkZhdWx0Ci0gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gICAgLyoKLSAgICAgKiBUT0RPIHNvbWUgb2YgdGhlIFdlYkZhdWx0IHN0dWZmIHNob3VsZCBiZSBtb3ZlZCB0byBGYXVsdERlc2NyaXB0aW9uCi0gICAgICovCi0KLSAgICAvKgotICAgICogIFRPRE86ICB0aGlzIHdpbGwgbmVlZCByZXZpc2l0ZWQuICBUaGUgcHJvYmxlbSBpcyB0aGF0IGEgV2ViRmF1bHQgaXMgbm90IG1hcHBlZCAxOjEgdG8gYW4KLSAgICAqICBPcGVyYXRpb25EZXNjcmlwdGlvbi4gIFdlIHNob3VsZCBkbyBhIGJldHRlciBqb2IgY2FjaGluZyB0aGUgaW5mb3JtYXRpb24uICBGb3Igbm93LCBJJ20KLSAgICAqICBmb2xsb3dpbmcgdGhlIGdldFdlYlBhcmFtKCkgcGF0dGVybi4KLSAgICAqCi0gICAgKiAgVGhpcyBpcyBnb25uYSBnZXQgY29tcGxpY2F0ZWQuICBPbmUgb3RoZXIgdGhpbmcgdG8gY29uc2lkZXIgaXMgdGhhdCBhIG1ldGhvZCAob3BkZXNjKSBtYXkgZGVjbGFyZQotICAgICogIHNldmVyYWwgdHlwZXMgb2YgZXhjZXB0aW9ucyBpdCB0aHJvd3MKLSAgICAqCi0gICAgKi8KLQotICAgIHB1YmxpYyBGYXVsdERlc2NyaXB0aW9uW10gZ2V0RmF1bHREZXNjcmlwdGlvbnMoKSB7Ci0gICAgICAgIHJldHVybiBmYXVsdERlc2NyaXB0aW9uczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRmF1bHREZXNjcmlwdGlvbiByZXNvbHZlRmF1bHRCeUV4Y2VwdGlvbk5hbWUoU3RyaW5nIGV4Y2VwdGlvbkNsYXNzTmFtZSkgewotICAgICAgICBpZiAoZmF1bHREZXNjcmlwdGlvbnMgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChGYXVsdERlc2NyaXB0aW9uIGZkIDogZmF1bHREZXNjcmlwdGlvbnMpIHsKLSAgICAgICAgICAgICAgICBpZiAoZXhjZXB0aW9uQ2xhc3NOYW1lLmVxdWFscyhmZC5nZXRFeGNlcHRpb25DbGFzc05hbWUoKSkpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgLy8gQU5OT1RBVElPTjogV2ViUGFyYW0KLSAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgLy8gTm90ZSB0aGF0IHRoaXMgYW5ub3RhdGlvbiBpcyBoYW5kbGVkIGJ5IHRoZSBQYXJhbWV0ZXJEZXNjcmlwdG9uLgotICAgIC8vIE1ldGhvZHMgYXJlIHByb3ZpZGVkIG9uIE9wZXJhdGlvbkRlc2NyaXB0aW9uIGFzIGNvbnZlbmllbmNlIG1ldGhvZHMuCi0gICAgcHVibGljIFBhcmFtZXRlckRlc2NyaXB0aW9uW10gZ2V0UGFyYW1ldGVyRGVzY3JpcHRpb25zKCkgewotICAgICAgICByZXR1cm4gcGFyYW1ldGVyRGVzY3JpcHRpb25zOwotICAgIH0KLQotICAgIHB1YmxpYyBQYXJhbWV0ZXJEZXNjcmlwdGlvbiBnZXRQYXJhbWV0ZXJEZXNjcmlwdGlvbihTdHJpbmcgcGFyYW1ldGVyTmFtZSkgewotICAgICAgICAvLyBUT0RPOiBWYWxpZGF0aW9uOiBGb3IgQkFSRSBwYXJhbWF0ZXJVc2UsIG9ubHkgYSBzaW5nbGUgSU4gb3VyIElOT1VUIHBhcmFtYXRlciBhbmQgYSBzaW5nbGUgb3V0cHV0IChlaXRoZXIgcmV0dXJuIG9yIE9VVCBvciBJTk9VVCkgaXMgYWxsb3dlZCAKLSAgICAgICAgLy8gICAgICAgUGVyIEpTUi0yMjQsIFNlYyAzLjYuMi4yLCBwZyAzNwotICAgICAgICBQYXJhbWV0ZXJEZXNjcmlwdGlvbiBtYXRjaGluZ1BhcmFtRGVzYyA9IG51bGw7Ci0gICAgICAgIGlmIChwYXJhbWV0ZXJOYW1lICE9IG51bGwgJiYgIXBhcmFtZXRlck5hbWUuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgZm9yIChQYXJhbWV0ZXJEZXNjcmlwdGlvbiBwYXJhbURlc2MgOiBwYXJhbWV0ZXJEZXNjcmlwdGlvbnMpIHsKLSAgICAgICAgICAgICAgICBpZiAocGFyYW1ldGVyTmFtZS5lcXVhbHMocGFyYW1EZXNjLmdldFBhcmFtZXRlck5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgbWF0Y2hpbmdQYXJhbURlc2MgPSBwYXJhbURlc2M7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbWF0Y2hpbmdQYXJhbURlc2M7Ci0gICAgfQotCi0gICAgcHVibGljIFBhcmFtZXRlckRlc2NyaXB0aW9uIGdldFBhcmFtZXRlckRlc2NyaXB0aW9uKGludCBwYXJhbWV0ZXJOdW1iZXIpIHsKLSAgICAgICAgcmV0dXJuIHBhcmFtZXRlckRlc2NyaXB0aW9uc1twYXJhbWV0ZXJOdW1iZXJdOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRQYXJhbU5hbWVzKCkgewotICAgICAgICByZXR1cm4gZ2V0QW5ub1dlYlBhcmFtTmFtZXMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0QW5ub1dlYlBhcmFtTmFtZXMoKSB7Ci0gICAgICAgIGlmICh3ZWJQYXJhbU5hbWVzID09IG51bGwpIHsKLSAgICAgICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IGJ1aWxkTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgICAgIFBhcmFtZXRlckRlc2NyaXB0aW9uW10gcGFyYW1EZXNjcyA9IGdldFBhcmFtZXRlckRlc2NyaXB0aW9ucygpOwotICAgICAgICAgICAgZm9yIChQYXJhbWV0ZXJEZXNjcmlwdGlvbiBjdXJyZW50UGFyYW1EZXNjIDogcGFyYW1EZXNjcykgewotICAgICAgICAgICAgICAgIGJ1aWxkTmFtZXMuYWRkKGN1cnJlbnRQYXJhbURlc2MuZ2V0UGFyYW1ldGVyTmFtZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHdlYlBhcmFtTmFtZXMgPSBidWlsZE5hbWVzLnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHdlYlBhcmFtTmFtZXM7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZ1tdIGdldEFubm9XZWJQYXJhbVRhcmdldE5hbWVzcGFjZXMoKSB7Ci0gICAgICAgIGlmICh3ZWJQYXJhbVRhcmdldE5hbWVzcGFjZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBidWlsZFRhcmdldE5TID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICBQYXJhbWV0ZXJEZXNjcmlwdGlvbltdIHBhcmFtRGVzY3MgPSBnZXRQYXJhbWV0ZXJEZXNjcmlwdGlvbnMoKTsKLSAgICAgICAgICAgIGZvciAoUGFyYW1ldGVyRGVzY3JpcHRpb24gY3VycmVudFBhcmFtRGVzYyA6IHBhcmFtRGVzY3MpIHsKLSAgICAgICAgICAgICAgICBidWlsZFRhcmdldE5TLmFkZChjdXJyZW50UGFyYW1EZXNjLmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHdlYlBhcmFtVGFyZ2V0TmFtZXNwYWNlID0gYnVpbGRUYXJnZXROUy50b0FycmF5KG5ldyBTdHJpbmdbMF0pOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB3ZWJQYXJhbVRhcmdldE5hbWVzcGFjZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEFubm9XZWJQYXJhbVRhcmdldE5hbWVzcGFjZShTdHJpbmcgbmFtZSkgewotICAgICAgICBTdHJpbmcgcmV0dXJuVGFyZ2V0TlMgPSBudWxsOwotICAgICAgICBQYXJhbWV0ZXJEZXNjcmlwdGlvbiBwYXJhbURlc2MgPSBnZXRQYXJhbWV0ZXJEZXNjcmlwdGlvbihuYW1lKTsKLSAgICAgICAgaWYgKHBhcmFtRGVzYyAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm5UYXJnZXROUyA9IHBhcmFtRGVzYy5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0dXJuVGFyZ2V0TlM7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgTW9kZVtdIGdldEFubm9XZWJQYXJhbU1vZGVzKCkgewotICAgICAgICBpZiAod2ViUGFyYW1Nb2RlID09IG51bGwpIHsKLSAgICAgICAgICAgIEFycmF5TGlzdDxNb2RlPiBidWlsZE1vZGVzID0gbmV3IEFycmF5TGlzdDxNb2RlPigpOwotICAgICAgICAgICAgUGFyYW1ldGVyRGVzY3JpcHRpb25bXSBwYXJhbURlc2NzID0gZ2V0UGFyYW1ldGVyRGVzY3JpcHRpb25zKCk7Ci0gICAgICAgICAgICBmb3IgKFBhcmFtZXRlckRlc2NyaXB0aW9uIGN1cnJlbnRQYXJhbURlc2MgOiBwYXJhbURlc2NzKSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRNb2Rlcy5hZGQoKChQYXJhbWV0ZXJEZXNjcmlwdGlvbkphdmEpY3VycmVudFBhcmFtRGVzYykuZ2V0QW5ub1dlYlBhcmFtTW9kZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHdlYlBhcmFtTW9kZSA9IGJ1aWxkTW9kZXMudG9BcnJheShuZXcgTW9kZVswXSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHdlYlBhcmFtTW9kZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0Fubm9XZWJQYXJhbUhlYWRlcihTdHJpbmcgbmFtZSkgewotICAgICAgICBQYXJhbWV0ZXJEZXNjcmlwdGlvbiBwYXJhbURlc2MgPSBnZXRQYXJhbWV0ZXJEZXNjcmlwdGlvbihuYW1lKTsKLSAgICAgICAgaWYgKHBhcmFtRGVzYyAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gcGFyYW1EZXNjLmlzSGVhZGVyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAvLyBBTk5PVEFUSU9OOiBXZWJSZXN1bHQKLSAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgcHVibGljIFdlYlJlc3VsdCBnZXRBbm5vV2ViUmVzdWx0KCkgewotICAgICAgICBpZiAod2ViUmVzdWx0QW5ub3RhdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoIWlzREJDKCkgJiYgc2VpTWV0aG9kICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB3ZWJSZXN1bHRBbm5vdGF0aW9uID0gKFdlYlJlc3VsdCkKLSAgICAgICAgICAgICAgICAgICAgZ2V0QW5ub3RhdGlvbihzZWlNZXRob2QsV2ViUmVzdWx0LmNsYXNzKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobWV0aG9kQ29tcG9zaXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB3ZWJSZXN1bHRBbm5vdGF0aW9uID0gbWV0aG9kQ29tcG9zaXRlLmdldFdlYlJlc3VsdEFubm90KCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlVuYWJsZSB0byBnZXQgV2ViUmVzdWx0IGFubm90YXRpb24iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHdlYlJlc3VsdEFubm90YXRpb247Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNXZWJSZXN1bHRBbm5vdGF0aW9uU3BlY2lmaWVkKCkgewotICAgICAgICByZXR1cm4gZ2V0QW5ub1dlYlJlc3VsdCgpICE9IG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNPcGVyYXRpb25SZXR1cm5pbmdSZXN1bHQoKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNSZXN1bHQgPSBmYWxzZTsKLSAgICAgICAgaWYgKCFpc0Fubm9PbmVXYXkoKSkgewotICAgICAgICAgICAgaWYgKCFpc0RCQygpICYmIHNlaU1ldGhvZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNlaU1ldGhvZC5nZXRSZXR1cm5UeXBlKCkgIT0gVm9pZC5UWVBFKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlzUmVzdWx0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1ldGhvZENvbXBvc2l0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFEZXNjcmlwdGlvblV0aWxzLmlzRW1wdHkobWV0aG9kQ29tcG9zaXRlLmdldFJldHVyblR5cGUoKSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICFtZXRob2RDb21wb3NpdGUuZ2V0UmV0dXJuVHlwZSgpLmVxdWFscygidm9pZCIpKQotICAgICAgICAgICAgICAgICAgICBpc1Jlc3VsdCA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIk5vIGNsYXNzIHRvIGRldGVybWluZSBpZiByZXN1bHQgaXMgcmV0dXJuZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlzUmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVzdWx0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGdldEFubm9XZWJSZXN1bHROYW1lKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBbm5vV2ViUmVzdWx0TmFtZSgpIHsKLSAgICAgICAgaWYgKCFpc09wZXJhdGlvblJldHVybmluZ1Jlc3VsdCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBpZiAod2ViUmVzdWx0TmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoZ2V0QW5ub1dlYlJlc3VsdCgpICE9IG51bGwgJiYgIURlc2NyaXB0aW9uVXRpbHMuaXNFbXB0eShnZXRBbm5vV2ViUmVzdWx0KCkubmFtZSgpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB3ZWJSZXN1bHROYW1lID0gZ2V0QW5ub1dlYlJlc3VsdCgpLm5hbWUoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZ2V0QW5ub1NvYXBCaW5kaW5nU3R5bGUoKSA9PSBTT0FQQmluZGluZy5TdHlsZS5ET0NVTUVOVAotICAgICAgICAgICAgICAgICAgICAmJiBnZXRBbm5vU29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpID09IFNPQVBCaW5kaW5nLlBhcmFtZXRlclN0eWxlLkJBUkUpIHsKLSAgICAgICAgICAgICAgICAvLyBEZWZhdWx0IGZvciBvcGVyYXRpb24gc3R5bGUgRE9DVU1FTlQgYW5kIHBhcmFtYXRlciBzdHlsZSBCQVJFIHBlciBKU1IgMTgxIE1SIFNlYyA0LjUuMSwgcGcgMjMKLSAgICAgICAgICAgICAgICB3ZWJSZXN1bHROYW1lID0gZ2V0QW5ub1dlYk1ldGhvZE9wZXJhdGlvbk5hbWUoKSArICJSZXNwb25zZSI7Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gRGVmZWF1bHQgdmFsdWUgaXMgInJldHVybiIgcGVyIEpTUi0xODEgTVIgU2VjLiA0LjUuMSwgcC4gMjIKLSAgICAgICAgICAgICAgICB3ZWJSZXN1bHROYW1lID0gInJldHVybiI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHdlYlJlc3VsdE5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRSZXN1bHRQYXJ0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGdldEFubm9XZWJSZXN1bHRQYXJ0TmFtZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QW5ub1dlYlJlc3VsdFBhcnROYW1lKCkgewotICAgICAgICBpZiAoIWlzT3BlcmF0aW9uUmV0dXJuaW5nUmVzdWx0KCkpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGlmICh3ZWJSZXN1bHRQYXJ0TmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoZ2V0QW5ub1dlYlJlc3VsdCgpICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAgICAgIURlc2NyaXB0aW9uVXRpbHMuaXNFbXB0eShnZXRBbm5vV2ViUmVzdWx0KCkucGFydE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICB3ZWJSZXN1bHRQYXJ0TmFtZSA9IGdldEFubm9XZWJSZXN1bHQoKS5wYXJ0TmFtZSgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBEZWZhdWx0IGlzIHRoZSBXZWJSZXN1bHQubmFtZSBwZXIgSlNSLTE4MSBNUiBTZWMgNC41LjEsIHBnIDIzCi0gICAgICAgICAgICAgICAgd2ViUmVzdWx0UGFydE5hbWUgPSBnZXRBbm5vV2ViUmVzdWx0TmFtZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB3ZWJSZXN1bHRQYXJ0TmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFJlc3VsdFRhcmdldE5hbWVzcGFjZSgpIHsKLSAgICAgICAgcmV0dXJuIGdldEFubm9XZWJSZXN1bHRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEFubm9XZWJSZXN1bHRUYXJnZXROYW1lc3BhY2UoKSB7Ci0gICAgICAgIGlmICghaXNPcGVyYXRpb25SZXR1cm5pbmdSZXN1bHQoKSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHdlYlJlc3VsdFRhcmdldE5hbWVzcGFjZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoZ2V0QW5ub1dlYlJlc3VsdCgpICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAgICAgIURlc2NyaXB0aW9uVXRpbHMuaXNFbXB0eShnZXRBbm5vV2ViUmVzdWx0KCkudGFyZ2V0TmFtZXNwYWNlKCkpKSB7Ci0gICAgICAgICAgICAgICAgd2ViUmVzdWx0VGFyZ2V0TmFtZXNwYWNlID0gZ2V0QW5ub1dlYlJlc3VsdCgpLnRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChnZXRBbm5vU29hcEJpbmRpbmdTdHlsZSgpID09IFNPQVBCaW5kaW5nLlN0eWxlLkRPQ1VNRU5UCi0gICAgICAgICAgICAgICAgICAgICYmIGdldEFubm9Tb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCkgPT0gU09BUEJpbmRpbmcuUGFyYW1ldGVyU3R5bGUuV1JBUFBFRAotICAgICAgICAgICAgICAgICAgICAmJiAhZ2V0QW5ub1dlYlJlc3VsdEhlYWRlcigpKSB7Ci0gICAgICAgICAgICAgICAgLy8gRGVmYXVsdCBmb3Igb3BlcmF0aW9uIHN0eWxlIERPQ1VNRU5UIGFuZCBwYXJhbWF0ZXIgc3R5bGUgV1JBUFBFRCBhbmQgdGhlIHJldHVybiB2YWx1ZQotICAgICAgICAgICAgICAgIC8vIGRvZXMgbm90IG1hcCB0byBhIGhlYWRlciBwZXIgSlNSLTE4MSBNUiBTZWMgNC41LjEsIHBnIDIzLTI0Ci0gICAgICAgICAgICAgICAgd2ViUmVzdWx0VGFyZ2V0TmFtZXNwYWNlID0gV2ViUmVzdWx0X1RhcmdldE5hbWVzcGFjZV9ERUZBVUxUOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBEZWZhdWx0IGlzIHRoZSBuYW1lc3BhY2UgZnJvbSB0aGUgV2ViU2VydmljZSBwZXIgSlNSLTE4MSBNUiBTZWMgNC41LjEsIHBnIDIzLTI0Ci0gICAgICAgICAgICAgICAgd2ViUmVzdWx0VGFyZ2V0TmFtZXNwYWNlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICgoRW5kcG9pbnREZXNjcmlwdGlvbkphdmEpZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRFbmRwb2ludERlc2NyaXB0aW9uKCkpLmdldEFubm9XZWJTZXJ2aWNlVGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gd2ViUmVzdWx0VGFyZ2V0TmFtZXNwYWNlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzUmVzdWx0SGVhZGVyKCkgewotICAgICAgICByZXR1cm4gZ2V0QW5ub1dlYlJlc3VsdEhlYWRlcigpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGdldEFubm9XZWJSZXN1bHRIZWFkZXIoKSB7Ci0gICAgICAgIGlmICghaXNPcGVyYXRpb25SZXR1cm5pbmdSZXN1bHQoKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGlmICh3ZWJSZXN1bHRIZWFkZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGdldEFubm9XZWJSZXN1bHQoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gVW5saWtlIHRoZSBlbGVtZW50cyB3aXRoIGEgU3RyaW5nIHZhbHVlLCBpZiB0aGUgYW5ub3RhdGlvbiBpcyBwcmVzZW50LCBleGNsdWRlIHdpbGwgYWx3YXlzIAotICAgICAgICAgICAgICAgIC8vIHJldHVybiBhIHVzYWJsZSB2YWx1ZSBzaW5jZSBpdCB3aWxsIGRlZmF1bHQgdG8gRkFMU0UgaWYgdGhlIGVsZW1lbnQgaXMgbm90IHByZXNlbnQuCi0gICAgICAgICAgICAgICAgd2ViUmVzdWx0SGVhZGVyID0gbmV3IEJvb2xlYW4oZ2V0QW5ub1dlYlJlc3VsdCgpLmhlYWRlcigpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgd2ViUmVzdWx0SGVhZGVyID0gV2ViUmVzdWx0X0hlYWRlcl9ERUZBVUxUOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB3ZWJSZXN1bHRIZWFkZXIuYm9vbGVhblZhbHVlKCk7Ci0gICAgfQotCi0gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIC8vIEFOTk9UQVRJT046IFNPQVBCaW5kaW5nCi0gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIHB1YmxpYyBTT0FQQmluZGluZyBnZXRBbm5vU29hcEJpbmRpbmcoKSB7Ci0gICAgICAgIC8vIFRPRE86IFZBTElEQVRJT046IE9ubHkgc3R5bGUgb2YgRE9DVU1FTlQgYWxsb3dlZCBvbiBNZXRob2QgYW5ub3RhdGlvbjsgcmVtZW1iZXIgdG8gY2hlY2sgdGhlIFR5cGUncyBzdHlsZSBzZXR0aW5nIGFsc28KLSAgICAgICAgLy8gICAgICAgSlNSLTE4MSBTZWMgNC43IHAuIDI4Ci0gICAgICAgIGlmIChzb2FwQmluZGluZ0Fubm90YXRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKCFpc0RCQygpICYmIHNlaU1ldGhvZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc29hcEJpbmRpbmdBbm5vdGF0aW9uID0gKFNPQVBCaW5kaW5nKQotICAgICAgICAgICAgICAgICAgICBnZXRBbm5vdGF0aW9uKHNlaU1ldGhvZCxTT0FQQmluZGluZy5jbGFzcyk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGlzREJDKCkgJiYgbWV0aG9kQ29tcG9zaXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzb2FwQmluZGluZ0Fubm90YXRpb24gPSBtZXRob2RDb21wb3NpdGUuZ2V0U29hcEJpbmRpbmdBbm5vdCgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJVbmFibGUgdG8gZ2V0IFNPQVAgQmluZGluZyBhbm5vdGF0aW9uIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzb2FwQmluZGluZ0Fubm90YXRpb247Ci0gICAgfQotCi0gICAgcHVibGljIGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlN0eWxlIGdldFNvYXBCaW5kaW5nU3R5bGUoKSB7Ci0gICAgICAgIHJldHVybiBnZXRBbm5vU29hcEJpbmRpbmdTdHlsZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5TdHlsZSBnZXRBbm5vU29hcEJpbmRpbmdTdHlsZSgpIHsKLSAgICAgICAgaWYgKHNvYXBCaW5kaW5nU3R5bGUgPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGdldEFubm9Tb2FwQmluZGluZygpICE9IG51bGwgJiYgZ2V0QW5ub1NvYXBCaW5kaW5nKCkuc3R5bGUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc29hcEJpbmRpbmdTdHlsZSA9IGdldEFubm9Tb2FwQmluZGluZygpLnN0eWxlKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIFBlciBKU1ItMTgxIE1SIFNlYyA0LjcsIHBnIDI4OiBpZiBub3Qgc3BlY2lmaWVkLCB1c2UgdGhlIFR5cGUgdmFsdWUuCi0gICAgICAgICAgICAgICAgc29hcEJpbmRpbmdTdHlsZSA9IGdldEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24oKS5nZXRTb2FwQmluZGluZ1N0eWxlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNvYXBCaW5kaW5nU3R5bGU7Ci0gICAgfQotCi0gICAgcHVibGljIGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlVzZSBnZXRTb2FwQmluZGluZ1VzZSgpIHsKLSAgICAgICAgcmV0dXJuIGdldEFubm9Tb2FwQmluZGluZ1VzZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5Vc2UgZ2V0QW5ub1NvYXBCaW5kaW5nVXNlKCkgewotICAgICAgICBpZiAoc29hcEJpbmRpbmdVc2UgPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGdldEFubm9Tb2FwQmluZGluZygpICE9IG51bGwgJiYgZ2V0QW5ub1NvYXBCaW5kaW5nKCkudXNlKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHNvYXBCaW5kaW5nVXNlID0gZ2V0QW5ub1NvYXBCaW5kaW5nKCkudXNlKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIFBlciBKU1ItMTgxIE1SIFNlYyA0LjcsIHBnIDI4OiBpZiBub3Qgc3BlY2lmaWVkLCB1c2UgdGhlIFR5cGUgdmFsdWUuCi0gICAgICAgICAgICAgICAgc29hcEJpbmRpbmdVc2UgPSBnZXRFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uKCkuZ2V0U29hcEJpbmRpbmdVc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc29hcEJpbmRpbmdVc2U7Ci0gICAgfQotCi0gICAgcHVibGljIGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlBhcmFtZXRlclN0eWxlIGdldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKSB7Ci0gICAgICAgIHJldHVybiBnZXRBbm5vU29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5QYXJhbWV0ZXJTdHlsZSBnZXRBbm5vU29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpIHsKLSAgICAgICAgaWYgKHNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUgPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGdldEFubm9Tb2FwQmluZGluZygpICE9IG51bGwgJiYgZ2V0QW5ub1NvYXBCaW5kaW5nKCkucGFyYW1ldGVyU3R5bGUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSA9IGdldEFubm9Tb2FwQmluZGluZygpLnBhcmFtZXRlclN0eWxlKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIFBlciBKU1ItMTgxIE1SIFNlYyA0LjcsIHBnIDI4OiBpZiBub3Qgc3BlY2lmaWVkLCB1c2UgdGhlIFR5cGUgdmFsdWUuCi0gICAgICAgICAgICAgICAgc29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBnZXRFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uKCkuZ2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlOwotICAgIH0KLSAgICAKLSAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgLy8gQU5OT1RBVElPTjogQWN0aW9uCi0gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIHB1YmxpYyBBY3Rpb24gZ2V0QW5ub0FjdGlvbigpIHsKLSAgICAgICAgaWYgKGFjdGlvbkFubm90YXRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKCFpc0RCQygpICYmIHNlaU1ldGhvZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYWN0aW9uQW5ub3RhdGlvbiA9IChBY3Rpb24pIGdldEFubm90YXRpb24oc2VpTWV0aG9kLCBBY3Rpb24uY2xhc3MpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAobWV0aG9kQ29tcG9zaXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBhY3Rpb25Bbm5vdGF0aW9uID0gbWV0aG9kQ29tcG9zaXRlLmdldEFjdGlvbkFubm90KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJVbmFibGUgdG8gZ2V0IEFjdGlvbiBhbm5vdGF0aW9uLiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoImdldEFubm9BY3Rpb246ICIgKyBhY3Rpb25Bbm5vdGF0aW9uKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGFjdGlvbkFubm90YXRpb247Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgU3RyaW5nIGdldElucHV0QWN0aW9uKCkgewotICAgICAgICBTdHJpbmcgaW5wdXRBY3Rpb24gPSBudWxsOwotICAgICAgICBBY3Rpb24gYWN0aW9uID0gZ2V0QW5ub0FjdGlvbigpOwotICAgICAgICAKLSAgICAgICAgaWYgKGFjdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnB1dEFjdGlvbiA9IGFjdGlvbi5pbnB1dCgpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiZ2V0SW5wdXRBY3Rpb246ICIgKyBpbnB1dEFjdGlvbik7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBpbnB1dEFjdGlvbjsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0T3V0cHV0QWN0aW9uKCkgewotICAgICAgICBTdHJpbmcgb3V0cHV0QWN0aW9uID0gbnVsbDsKLSAgICAgICAgQWN0aW9uIGFjdGlvbiA9IGdldEFubm9BY3Rpb24oKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChhY3Rpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgb3V0cHV0QWN0aW9uID0gYWN0aW9uLm91dHB1dCgpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiZ2V0T3V0cHV0QWN0aW9uOiAiICsgb3V0cHV0QWN0aW9uKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIG91dHB1dEFjdGlvbjsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBGYXVsdEFjdGlvbltdIGdldEZhdWx0QWN0aW9ucygpIHsKLSAgICAgICAgRmF1bHRBY3Rpb25bXSBmYXVsdEFjdGlvbnMgPSBudWxsOwotICAgICAgICBBY3Rpb24gYWN0aW9uID0gZ2V0QW5ub0FjdGlvbigpOwotICAgICAgICAKLSAgICAgICAgaWYgKGFjdGlvbiAhPSAgbnVsbCkgewotICAgICAgICAgICAgZmF1bHRBY3Rpb25zID0gYWN0aW9uLmZhdWx0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJnZXRGYXVsdEFjdGlvbnM6ICIgKyBmYXVsdEFjdGlvbnMpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gZmF1bHRBY3Rpb25zOwotICAgIH0KLQotICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAvLyBBTk5PVEFUSU9OOiBPbmVXYXkKLSAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgcHVibGljIE9uZXdheSBnZXRBbm5vT25ld2F5KCkgewotICAgICAgICBpZiAob25ld2F5QW5ub3RhdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBHZXQgdGhlIG9uZXctd2F5IGFubm90YXRpb24gZnJvbSBlaXRoZXIgdGhlIG1ldGhvZCBjb21wb3NpdGUgKHNlcnZlci1zaWRlKQotICAgICAgICAgICAgLy8gb3IgZnJvbSB0aGUgU0VJIG1ldGhvZCAoY2xpZW50LXNpZGUpLiAgCi0gICAgICAgICAgICBpZiAoaXNEQkMoKSAmJiBtZXRob2RDb21wb3NpdGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChtZXRob2RDb21wb3NpdGUuaXNPbmVXYXkoKSkgewotICAgICAgICAgICAgICAgICAgICBvbmV3YXlBbm5vdGF0aW9uID0gT25lV2F5QW5ub3QuY3JlYXRlT25lV2F5QW5ub3RJbXBsKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmICghaXNEQkMoKSAmJiBzZWlNZXRob2QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG9uZXdheUFubm90YXRpb24gPSAoT25ld2F5KSBnZXRBbm5vdGF0aW9uKHNlaU1ldGhvZCxPbmV3YXkuY2xhc3MpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJVbmFibGUgdG8gZ2V0IE9uZVdheSBhbm5vdGF0aW9uIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBvbmV3YXlBbm5vdGF0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzT25lV2F5KCkgewotICAgICAgICByZXR1cm4gaXNBbm5vT25lV2F5KCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNBbm5vT25lV2F5KCkgewotICAgICAgICBpZiAob25ld2F5SXNPbmV3YXkgPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGdldEFubm9PbmV3YXkoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhlIHByZXNlbmNlIG9mIHRoZSBhbm5vdGF0aW9uIGluZGljYXRlcyB0aGUgbWV0aG9kIGlzIG9uZXdheQotICAgICAgICAgICAgICAgIG9uZXdheUlzT25ld2F5ID0gbmV3IEJvb2xlYW4odHJ1ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIElmIHRoZSBhbm5vdGF0aW9uIGlzIG5vdCBwcmVzZW50LCB0aGUgZGVmYXVsdCBpcyB0aGlzIGlzIE5PVCBhIE9uZSBXYXkgbWV0aG9kCi0gICAgICAgICAgICAgICAgb25ld2F5SXNPbmV3YXkgPSBuZXcgQm9vbGVhbihmYWxzZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG9uZXdheUlzT25ld2F5LmJvb2xlYW5WYWx1ZSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0RCQygpIHsKLSAgICAgICAgaWYgKG1ldGhvZENvbXBvc2l0ZSAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLk9wZXJhdGlvbkRlc2NyaXB0aW9uI2dldFJlc3VsdFR5cGUoKQotICAgICAqLwotICAgIHB1YmxpYyBDbGFzcyBnZXRSZXN1bHRUeXBlKCkgewotICAgICAgICBDbGFzcyByZXR1cm5DbGFzcyA9IG51bGw7Ci0gICAgICAgIGlmICghaXNEQkMoKSAmJiBnZXRTRUlNZXRob2QoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBNZXRob2Qgc2VpTWV0aG9kID0gdGhpcy5nZXRTRUlNZXRob2QoKTsKLSAgICAgICAgICAgIHJldHVybkNsYXNzID0gc2VpTWV0aG9kLmdldFJldHVyblR5cGUoKTsKLSAgICAgICAgfSBlbHNlIGlmIChtZXRob2RDb21wb3NpdGUgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuQ2xhc3MgPSBtZXRob2RDb21wb3NpdGUuZ2V0UmV0dXJuVHlwZUNsYXNzKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlVuYWJsZSB0byBnZXQgcmVzdWx0IHR5cGUgZnJvbSBudWxsIGNsYXNzIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldHVybkNsYXNzOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uT3BlcmF0aW9uRGVzY3JpcHRpb24jZ2V0UmVzdWx0QWN0dWFsVHlwZSgpCi0gICAgICovCi0gICAgcHVibGljIENsYXNzIGdldFJlc3VsdEFjdHVhbFR5cGUoKSB7Ci0gICAgICAgIGlmKHJlc3VsdEFjdHVhbFR5cGVDbGF6eiA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXN1bHRBY3R1YWxUeXBlQ2xhenogPSBmaW5kUmVzdWx0QWN0dWFsVHlwZSgpOyAgICAKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0QWN0dWFsVHlwZUNsYXp6OwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgQ2xhc3MgZmluZFJlc3VsdEFjdHVhbFR5cGUoKSB7Ci0gICAgICAgIC8vIFRPRE86IEZpeCB0aGlzISAgaXQgaXNuJ3QgZG9pbmcgdGhlIHJpZ2h0IHRoaW5nIGZvciBEQkMgYXMgbm90ZWQgYmVsb3cgd2l0aCBGSVhNRSBjb21tZW50cwotICAgICAgICAvLyAgICAgICBUaGlzIGlzIHVzZWQgdG8gbWFyc2hhbGwgdGhlIHJzcCBvbiB0aGUgc2VydmljZSAoZGJjKSBhbmQgZGVtYXJzaGFsbCBvbiB0aGUgY2xpZW50IChyZWZsZWN0aW9uKQotICAgICAgICAvLyAgICAgICBCdXQgd2Ugc2hvdWxkbid0IGdldCBhbiBhc3luYyBPcERlc2Mgb24gdGhlIHNlcnZpY2Ugc2luY2UgZ2V0RGlzcGF0Y2hhYmxlT3BlcmF0aW9uKFFOKSByZW1vdmVzIHRoZW0uCi0KLSAgICAgICAgQ2xhc3MgcmV0dXJuVHlwZSA9IGdldFJlc3VsdFR5cGUoKTsKLSAgICAgICAgaWYgKHJldHVyblR5cGUgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlzSkFYV1NBc3luY0NsaWVudE1ldGhvZCgpKSB7Ci0gICAgICAgICAgICAvL3Bvb2xpbmcgaW1wbGVtZW50YXRpb24KLSAgICAgICAgICAgIGlmIChSZXNwb25zZS5jbGFzcyA9PSByZXR1cm5UeXBlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFpc0RCQygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFR5cGUgdHlwZSA9IHNlaU1ldGhvZC5nZXRHZW5lcmljUmV0dXJuVHlwZSgpOwotICAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXJpemVkVHlwZSBwVHlwZSA9IChQYXJhbWV0ZXJpemVkVHlwZSl0eXBlOwotICAgICAgICAgICAgICAgICAgICBUeXBlIGFUeXBlID0gcFR5cGUuZ2V0QWN0dWFsVHlwZUFyZ3VtZW50cygpWzBdOwotICAgICAgICAgICAgICAgICAgICBpZiAoYVR5cGUgIT0gbnVsbCAmJiBQYXJhbWV0ZXJpemVkVHlwZS5jbGFzcy5pc0luc3RhbmNlKGFUeXBlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChDbGFzcykoKFBhcmFtZXRlcml6ZWRUeXBlKWFUeXBlKS5nZXRSYXdUeXBlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChDbGFzcylhVHlwZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRTogVGhpcyBkb2Vzbid0IHdvcmsgZm9yIERCQy4gIFRoYXQncyBPSyBmb3Igbm93IGJlY2F1c2UgREJDIGlzbid0IHVzZWQgb24gdGhlIGNsaWVudCBzaWRlCi0gICAgICAgICAgICAgICAgICAgIC8vICAgICAgICB5ZXQ7IHRoZSBjbGllbnQgaXMgYWxsIEphdmEgUmVmbGVjdGlvbi4gIE9uIHRoZSBTZXJ2aWNlIHNpZGUsIHRoZSBBc3luYyBtZXRob2RzIGFyZSBub3QgdXNlZC4KLSAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgIFRoaXMgbmVlZHMgdG8gcmV0dXJuIFQgZm9yIFJlc3BvbnNlPFQ+LCBvciBMaXN0IGZvciBSZXNwb25zZTxMaXN0PFQ+Pj4KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHVyblR5cGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy9DYWxsYmFjayBJbXBsZW1lbnRhdGlvbgotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gRklYTUU6IFRoaXMgZG9lc24ndCB3b3JrIGZvciBEQkMuICBUaGF0J3MgT0sgZm9yIG5vdyBiZWNhdXNlIERCQyBpc24ndCB1c2VkIG9uIHRoZSBjbGllbnQgc2lkZQotICAgICAgICAgICAgICAgIC8vICAgICAgICB5ZXQ7IHRoZSBjbGllbnQgaXMgYWxsIEphdmEgUmVmbGVjdGlvbi4gIE9uIHRoZSBTZXJ2aWNlIHNpZGUsIHRoZSBBc3luYyBtZXRob2RzIGFyZSBub3QgdXNlZC4KLSAgICAgICAgICAgICAgICAvLyAgICAgICAgVGhpcyBuZWVkcyB0byBmaW5kIGFuZCByZXR1cm4gVCBmb3IgQXN5bmNIYW5kbGVyPFQ+LCBvciBMaXN0IGZvciBBc3luY0hhbmRsZXI8TGlzdDxUPj4+Ci0gICAgICAgICAgICAgICAgVHlwZVtdIHR5cGUgPSBnZXRHZW5lcmljUGFyYW1ldGVyVHlwZXMoKTsKLSAgICAgICAgICAgICAgICBDbGFzcyBwYXJhbWV0ZXJzW10gPSBnZXRQYXJhbWV0ZXJUeXBlcygpOwotICAgICAgICAgICAgICAgIGludCBpID0gMDsKLSAgICAgICAgICAgICAgICBmb3IgKENsYXNzIHBhcmFtIDogcGFyYW1ldGVycykgewotICAgICAgICAgICAgICAgICAgICBpZiAoQXN5bmNIYW5kbGVyLmNsYXNzLmlzQXNzaWduYWJsZUZyb20ocGFyYW0pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXJpemVkVHlwZSBwVHlwZSA9IChQYXJhbWV0ZXJpemVkVHlwZSl0eXBlW2ldOwotICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSBhVHlwZSA9IHBUeXBlLmdldEFjdHVhbFR5cGVBcmd1bWVudHMoKVswXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhVHlwZSAhPSBudWxsICYmIFBhcmFtZXRlcml6ZWRUeXBlLmNsYXNzLmlzSW5zdGFuY2UoYVR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChDbGFzcykoKFBhcmFtZXRlcml6ZWRUeXBlKWFUeXBlKS5nZXRSYXdUeXBlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKENsYXNzKWFUeXBlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmV0dXJuVHlwZTsKLSAgICB9Ci0KLQotICAgIHByaXZhdGUgVHlwZVtdIGdldEdlbmVyaWNQYXJhbWV0ZXJUeXBlcygpIHsKLSAgICAgICAgaWYgKGlzREJDKCkpIHsKLSAgICAgICAgICAgIC8vIEZJWE1FOiBUaGlzIGRvZXNuJ3Qgd29yayBmb3IgREJDLiAgVGhhdCdzIE9LIGZvciBub3cgYmVjYXVzZSBEQkMgaXNuJ3QgdXNlZCBvbiB0aGUgY2xpZW50IHNpZGUKLSAgICAgICAgICAgIC8vICAgICAgICB5ZXQ7IHRoZSBjbGllbnQgaXMgYWxsIEphdmEgUmVmbGVjdGlvbi4gIE9uIHRoZSBTZXJ2aWNlIHNpZGUsIHRoZSBBc3luYyBtZXRob2RzIGFyZSBub3QgdXNlZC4KLSAgICAgICAgICAgIC8vICAgICAgICBBbmQgdGhpcyBtZXRob2QgaXMgb25seSB1c2VkIHRvIHBhcnNlIG91dCB0aGUgSkFYLVdTIEFzeW5jIHBhcmFtZXRlciB0eXBlcyB0byBmaW5kCi0gICAgICAgICAgICAvLyAgICAgICAgQXN5bmNIYW5kbGVyPFQ+LiAgVGhlIHByb2JsZW0gd2l0aCB0aGUgY29kZSB0aGF0IHdhcyByZW1vdmVkIGlzIHRoYXQgYSBUeXBlIGNhbiBub3QgYmUKLSAgICAgICAgICAgIC8vICAgICAgICBpbnN0YW50aWF0ZWQsIHNvIHdlIGNhbid0IG5ldyB1cCBhIFR5cGUgaW5zaWRlIHRoZSBQREMuCi0gICAgICAgIAl0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJnZW5QYXJhbVR5cGVzRXJyIikpKTsKLS8vICAgICAgICAgICBUeXBlIFtdIHR5cGUgPSBuZXcgVHlwZVtwYXJhbWV0ZXJEZXNjcmlwdGlvbnMubGVuZ3RoXTsKLS8vICAgICAgICAgICBmb3IgKGludCBpPTA7IGkgPCBwYXJhbWV0ZXJEZXNjcmlwdGlvbnMubGVuZ3RoOyBpKyspewotLy8gICAgICAgICAgICAgICB0eXBlW2ldID0gKChQYXJhbWV0ZXJEZXNjcmlwdGlvbkltcGwpIHBhcmFtZXRlckRlc2NyaXB0aW9uc1tpXSkuZ2V0UGFyYW1ldGVyQWN0dWFsR2VuZXJpY1R5cGUoKTsKLS8vICAgICAgICAgICB9Ci0vLyAgICAgICAgICAgcmV0dXJuIHR5cGU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBUeXBlIFtdIHR5cGUgPSBzZWlNZXRob2QuZ2V0R2VuZXJpY1BhcmFtZXRlclR5cGVzKCk7Ci0gICAgICAgICAgICByZXR1cm4gdHlwZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgQ2xhc3NbXSBnZXRQYXJhbWV0ZXJUeXBlcygpIHsKLSAgICAgICAgaWYgKGlzREJDKCkpIHsKLSAgICAgICAgICAgIENsYXNzIFtdIHBhcmFtZXRlcnMgPSBuZXcgQ2xhc3NbcGFyYW1ldGVyRGVzY3JpcHRpb25zLmxlbmd0aF07Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtZXRlckRlc2NyaXB0aW9ucy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIHBhcmFtZXRlcnNbaV0gPSBwYXJhbWV0ZXJEZXNjcmlwdGlvbnNbaV0uZ2V0UGFyYW1ldGVyVHlwZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHBhcmFtZXRlcnM7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBDbGFzcyBbXSBwYXJhbWV0ZXJzID0gc2VpTWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCk7Ci0gICAgICAgICAgICByZXR1cm4gcGFyYW1ldGVyczsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgKiAobm9uLUphdmFkb2MpCi0gICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uT3BlcmF0aW9uRGVzY3JpcHRpb24jaXNKQVhXU0FzeW5jQ2xpZW50TWV0aG9kKCkKLSAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzSkFYV1NBc3luY0NsaWVudE1ldGhvZCgpIHsKLSAgICAgICAgYm9vbGVhbiBhbnN3ZXIgPSBmYWxzZTsKLSAgICAgICAgU3RyaW5nIG1ldGhvZE5hbWUgPSBudWxsOwotICAgICAgICBTdHJpbmcgcmV0dXJuVHlwZU5hbWUgPSBudWxsOwotICAgICAgICBpZiAoaXNEQkMoKSkgewotICAgICAgICAgICAgbWV0aG9kTmFtZSA9IGdldE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlKCkuZ2V0TWV0aG9kTmFtZSgpOwotICAgICAgICAgICAgcmV0dXJuVHlwZU5hbWUgPSBnZXRNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSgpLmdldFJldHVyblR5cGUoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIE1ldGhvZCBtZXRob2QgPSB0aGlzLmdldFNFSU1ldGhvZCgpOwotICAgICAgICAgICAgaWYgKG1ldGhvZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9IG1ldGhvZC5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuVHlwZU5hbWUgPSBtZXRob2QuZ2V0UmV0dXJuVHlwZSgpLmdldE5hbWUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAobWV0aG9kTmFtZSAhPSBudWxsICYmIHJldHVyblR5cGVOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIGFuc3dlciA9IChyZXR1cm5UeXBlTmFtZS5jb250YWlucyhSZXNwb25zZS5jbGFzcy5nZXROYW1lKCkpIHx8Ci0gICAgICAgICAgICAgICAgICAgIHJldHVyblR5cGVOYW1lLmNvbnRhaW5zKEZ1dHVyZS5jbGFzcy5nZXROYW1lKCkpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiTWV0aG9kID0gIiArIG1ldGhvZE5hbWUpOwotICAgICAgICAgICAgbG9nLmRlYnVnKCJSZXR1cm4gVHlwZSA9ICIgKyByZXR1cm5UeXBlTmFtZSk7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIklzIGNsaWVudCBhc3luYyA9ICIgKyBhbnN3ZXIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBhbnN3ZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBTZXJ2aWNlIEltcGxlbWVudGF0aW9uIG1ldGhvZCBmb3IgdGhpcyBvcGVyYXRpb24gSUZGIGl0IGhhcyBiZWVuIHNldCBieSBhIHByZXZpb3VzCi0gICAgICogY2FsbCB0byBnZXRNZXRob2RGcm9tU2VydmljZUltcGwoQ2xhc3Mgc2VydmljZUltcGxDbGFzcykuICBPdGhlcndpc2UgYSBudWxsIGlzIHJldHVybmVkLgotICAgICAqCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHByaXZhdGUgTWV0aG9kIGdldE1ldGhvZEZyb21TZXJ2aWNlSW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIHNlcnZpY2VJbXBsTWV0aG9kOwotCi0gICAgfQotCi0gICAgcHVibGljIE1ldGhvZCBnZXRNZXRob2RGcm9tU2VydmljZUltcGwoQ2xhc3Mgc2VydmljZUltcGwpIHsKLQotICAgICAgICAvLyBUT0RPOiBUaGlzIGRvZXNuJ3Qgc3VwcG9ydCBvdmVybG9hZGVkIG1ldGhvZHMgaW4gdGhlIHNlcnZpY2UgaW1wbCAgVGhpcyBpcwotICAgICAgICAvLyAgICAgICBESUZGRVJFTlQgdGhhbiBvdmVybG9hZGVkIFdTREwgb3BlcmF0aW9ucyAod2hpY2ggYXJlbid0IHN1cHBvcnRlZCkuICBXZQotICAgICAgICAvLyAgICAgICBNVVNUIHN1cHBvcnQgb3ZlcmxvYWRlZCBzZXJ2aWNlIGltcGwgbWV0aG9kcyBhcyBsb25nIGFzIHRoZXkgaGF2ZSBkaWZmZXJlbnQKLSAgICAgICAgLy8gICAgICAgd3NkbCBvcGVyYXRpb24gbmFtZXMuICBGb3IgZXhhbXBsZToKLSAgICAgICAgLy8gIFNlcnZpY2VJbXBsZSBDbGFzcyAgICAgICAgICBTRUkgQ2xhc3MKLSAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAV2ViTWV0aG9kLm5hbWUgPSBGb28xCi0gICAgICAgIC8vICB2b2lkIGZvbygpICAgICAgICAgICAgICAgICAgdm9pZCBmb28oKQotICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBXZWJNZXRob2QubmFtZSA9IEZvbzIKLSAgICAgICAgLy8gIHZvaWQgZm9vKGludCkgICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQpCi0gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQFdlYk1ldGhvZC5uYW1lID0gRm9vMwotICAgICAgICAvLyAgdm9pZCBmb28oU3RyaW5nKSAgICAgICAgICAgIHZvaWQgZm9vKFN0cmluZykKLSAgICAgICAgLy8KLSAgICAgICAgLy8gIFRoZXJlIHdpbGwgYmUgdHdvIE9wRGVzY3MsIEZvbzEgYW5kIEZvbzI7IHRoZSBpbmNvbWluZyB3c2RsIG9wZXJhdGlvbiB3aWxsIGNvcnJlY3RseSBpZGVudGlmeQotICAgICAgICAvLyAgd2hpY2ggT3BEZXNjLiAgSG93ZXZlciwgdG8gcmV0dXJuIHRoZSBjb3JyZWN0IHNlcnZpY2UgaW1wbCBtZXRob2QsIHdlIG5lZWQgdG8gY29tcGFyZSB0aGUKLSAgICAgICAgLy8gIHNpZ25hdHVyZXMsIG5vdCBqdXN0IHRoZSBtZXRob2QgbmFtZXMuCi0gICAgICAgIGlmICghc2VydmljZUltcGxNZXRob2RGb3VuZCkgewotICAgICAgICAgICAgTWV0aG9kW10gbWV0aG9kcyA9IHNlcnZpY2VJbXBsLmdldE1ldGhvZHMoKTsKLSAgICAgICAgICAgIFN0cmluZyBvcERlc2NNZXRob2ROYW1lID0gZ2V0SmF2YU1ldGhvZE5hbWUoKTsKLSAgICAgICAgICAgIFBhcmFtZXRlckRlc2NyaXB0aW9uW10gcGFyYW1EZXNjID0gZ2V0UGFyYW1ldGVyRGVzY3JpcHRpb25zKCk7Ci0gICAgICAgICAgICAvLyBUT0RPOiBBcyBub3RlZCBhYm92ZSwgYSBmdWxsIHNpZ25hdHVyZSBpcyBuZWNlc3NhcnksIG5vdCBqdXN0IG51bWJlciBvZiBwYXJhbXMKLSAgICAgICAgICAgIGludCBudW1iZXJPZlBhcmFtcyA9IDA7Ci0gICAgICAgICAgICBpZiAocGFyYW1EZXNjICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBudW1iZXJPZlBhcmFtcyA9IHBhcmFtRGVzYy5sZW5ndGg7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIExvb3AgdGhyb3VnaCBhbGwgdGhlIG1ldGhvZHMgb24gdGhlIHNlcnZpY2UgaW1wbCBhbmQgZmluZCB0aGUgbWV0aG9kIHRoYXQgbWFwcwotICAgICAgICAgICAgLy8gdG8gdGhpcyBPcGVyYXRpb25EZXNjcmlwdG9uCi0gICAgICAgICAgICBmb3IgKE1ldGhvZCBjaGVja01ldGhvZCA6IG1ldGhvZHMpIHsKLSAgICAgICAgICAgICAgICBpZiAoY2hlY2tNZXRob2QuZ2V0TmFtZSgpLmVxdWFscyhvcERlc2NNZXRob2ROYW1lKSkgewotICAgICAgICAgICAgICAgICAgICBDbGFzc1tdIG1ldGhvZFBhcmFtcyA9IGNoZWNrTWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IEFzIG5vdGVkIGFib3ZlLCBhIGZ1bGwgc2lnbmF0dXJlIGlzIG5lY2Vzc2FyeSwgbm90IGp1c3QgbnVtYmVyIG9mIHBhcmFtcwotICAgICAgICAgICAgICAgICAgICBpZiAobWV0aG9kUGFyYW1zLmxlbmd0aCA9PSBudW1iZXJPZlBhcmFtcykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtVHlwZXNNYXRjaChwYXJhbURlc2MsIG1ldGhvZFBhcmFtcykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlSW1wbE1ldGhvZCA9IGNoZWNrTWV0aG9kOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2VydmljZUltcGxNZXRob2RGb3VuZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNlcnZpY2VJbXBsTWV0aG9kOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgY29tcGFyZSB0aGUgdHlwZXMgb2YgdGhlIHBhcmFtZXRlcnMgaW4gYSA8Y29kZT5QYXJhbWV0ZXJEZXNjcmlwdGlvbjwvY29kZT4KLSAgICAgKiB2cy4gdGhlIHR5cGUgb2YgdGhlIGFyZ3VtZW50cyBpbiB0aGUgcGFyYW1ldGVycyBvZiBhIDxjb2RlPk1ldGhvZDwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGFyYW1EZXNjcyAgIC0gPGNvZGU+UGFyYW1ldGVyRGVzY3JpcHRpb248L2NvZGU+W10KLSAgICAgKiBAcGFyYW0gbWV0aG9kUGFyYW1zIC0gPGNvZGU+Q2xhc3M8L2NvZGU+W10KLSAgICAgKiBAcmV0dXJuIC0gPGNvZGU+Ym9vbGVhbjwvY29kZT4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gcGFyYW1UeXBlc01hdGNoKFBhcmFtZXRlckRlc2NyaXB0aW9uW10gcGFyYW1EZXNjcywgQ2xhc3NbXQotICAgICAgICAgICAgbWV0aG9kUGFyYW1zKSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1EZXNjcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgU3RyaW5nIG1QYXJhbVR5cGUgPSBtZXRob2RQYXJhbXNbaV0uZ2V0TmFtZSgpOwotICAgICAgICAgICAgU3RyaW5nIHBkVHlwZSA9IGdldFBEVHlwZShwYXJhbURlc2NzW2ldKTsKLSAgICAgICAgICAgIGlmIChtUGFyYW1UeXBlID09IG51bGwgfHwgIW1QYXJhbVR5cGUuZXF1YWxzKHBkVHlwZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyB3aWxsIGdldCBhIDxjb2RlPlN0cmluZzwvY29kZT4gcmVwcmVzZW50aW5nIHRoZSBwYXJhbWV0ZXIgY2xhc3Mgb2YgYQotICAgICAqIDxjb2RlPlBhcmFtZXRlckRlc2NyaXB0aW9uPC9jb2RlPi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwZCAtIDxjb2RlPlBhcmFtZXRlckRlc2NyaXRpb248L2NvZGU+Ci0gICAgICogQHJldHVybiAtIDxjb2RlPlN0cmluZzwvY29kZT4KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBnZXRQRFR5cGUoUGFyYW1ldGVyRGVzY3JpcHRpb24gcGQpIHsKLSAgICAgICAgU3RyaW5nIHR5cGUgPSBudWxsOwotICAgICAgICBpZiAocGQuZ2V0UGFyYW1ldGVyVHlwZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIHR5cGUgPSBwZC5nZXRQYXJhbWV0ZXJUeXBlKCkuZ2V0TmFtZSgpOwotICAgICAgICB9IGVsc2UgaWYgKHBkLmdldFBhcmFtZXRlckFjdHVhbFR5cGUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0eXBlID0gcGQuZ2V0UGFyYW1ldGVyQWN0dWFsVHlwZSgpLmdldE5hbWUoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHlwZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT3BlcmF0aW9uUnVudGltZURlc2NyaXB0aW9uIGdldE9wZXJhdGlvblJ1bnRpbWVEZXNjKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIC8vIFRPRE8gQWRkIHRvU3RyaW5nIHN1cHBvcnQKLSAgICAgICAgcmV0dXJuIHJ1bnRpbWVEZXNjTWFwLmdldChuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRPcGVyYXRpb25SdW50aW1lRGVzYyhPcGVyYXRpb25SdW50aW1lRGVzY3JpcHRpb24gb3JkKSB7Ci0gICAgICAgIC8vIFRPRE8gQWRkIHRvU3RyaW5nIHN1cHBvcnQKLSAgICAgICAgcnVudGltZURlc2NNYXAucHV0KG9yZC5nZXRLZXkoKSwgb3JkKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gaXNMaXN0VHlwZSgpIHsKLSAgICAJcmV0dXJuIGlzTGlzdFR5cGU7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIHRoZSBuYW1lc3BhY2UgZm9yIHRoZSBCaW5kaW5nSW5wdXQgdGhhdCB0aGlzIG9wZXJhdGlvbgotICAgICAqIHNwZWNpZmllcy4gSXQgd2lsbCBmaXJzdCBsb29rIGZvciBhIG5hbWVzcGFjZSBvbiB0aGUgV1NETCBCaW5kaW5nIG9iamVjdCBhbmQgdGhlbiAKLSAgICAgKiBkZWZhdWx0IHRvIHRoZSB3ZWIgc2VydmljZSdzIHRhcmdldCBuYW1lc3BhY2UuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRCaW5kaW5nSW5wdXROYW1lc3BhY2UoKSB7Ci0gICAgICAgIFN0cmluZyB0bnMgPSBudWxsOwotICAgICAgICBCaW5kaW5nIGJpbmRpbmcgPQotICAgICAgICAgICAgICAgIHRoaXMuZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbkltcGwoKQotICAgICAgICAgICAgICAgICAgICAuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbkltcGwoKQotICAgICAgICAgICAgICAgICAgICAuZ2V0V1NETEJpbmRpbmcoKTsKLSAgICAgICAgaWYgKGJpbmRpbmcgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJGb3VuZCBXU0RMIGJpbmRpbmciKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIHRoaXMgY2FsbCBkb2VzIG5vdCBzdXBwb3J0IG92ZXJsb2FkZWQgV1NETCBvcGVyYXRpb25zIGFzIGl0Ci0gICAgICAgICAgICAvLyBkb2VzIG5vdCBzcGVjaWZ5IHRoZSBuYW1lIG9mIHRoZSBpbnB1dCBhbmQgb3V0cHV0IG1lc3NhZ2VzCi0gICAgICAgICAgICBCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcCA9Ci0gICAgICAgICAgICAgICAgICAgIGJpbmRpbmcuZ2V0QmluZGluZ09wZXJhdGlvbihnZXRPcGVyYXRpb25OYW1lKCksIG51bGwsIG51bGwpOwotICAgICAgICAgICAgaWYgKGJpbmRpbmdPcCAhPSBudWxsICYmIGJpbmRpbmdPcC5nZXRCaW5kaW5nSW5wdXQoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiRm91bmQgV1NETCBiaW5kaW5nIG9wZXJhdGlvbiBhbmQgaW5wdXQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdG5zID0gZ2V0QmluZGluZ05hbWVzcGFjZShiaW5kaW5nT3AuZ2V0QmluZGluZ0lucHV0KCkpOwotICAgICAgICAgICAgICAgIGlmICh0bnMgIT0gbnVsbCAmJiBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkZvciBvcGVyYXRpb246ICIgKyBiaW5kaW5nT3AuZ2V0TmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHJldHVybmluZyB0aGUgZm9sbG93aW5nIG5hbWVzcGFjZSBmb3IgaW5wdXQgbWVzc2FnZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZnJvbSBXU0RMOiAiICsgdG5zKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHRucyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0bnMgPSBnZXRFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uKCkuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkZvciBiaW5kaW5nIGlucHV0IHJldHVybmluZyBAV2ViU2VydmljZS50YXJnZXROYW1lc3BhY2U6ICIgKyB0bnMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0bnM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gdGhlIG5hbWVzcGFjZSBmb3IgdGhlIEJpbmRpbmdPdXRwdXQgdGhhdCB0aGlzIG9wZXJhdGlvbgotICAgICAqIHNwZWNpZmllcy4gSXQgd2lsbCBmaXJzdCBsb29rIGZvciBhIG5hbWVzcGFjZSBvbiB0aGUgV1NETCBCaW5kaW5nIG9iamVjdCBhbmQgdGhlbiAKLSAgICAgKiBkZWZhdWx0IHRvIHRoZSB3ZWIgc2VydmljZSdzIHRhcmdldCBuYW1lc3BhY2UuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRCaW5kaW5nT3V0cHV0TmFtZXNwYWNlKCkgewotICAgICAgICBTdHJpbmcgdG5zID0gbnVsbDsKLSAgICAgICAgQmluZGluZyBiaW5kaW5nID0KLSAgICAgICAgICAgICAgICB0aGlzLmdldEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb25JbXBsKCkKLSAgICAgICAgICAgICAgICAgICAgLmdldEVuZHBvaW50RGVzY3JpcHRpb25JbXBsKCkKLSAgICAgICAgICAgICAgICAgICAgLmdldFdTRExCaW5kaW5nKCk7Ci0gICAgICAgIGlmIChiaW5kaW5nICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiRm91bmQgV1NETCBiaW5kaW5nIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyB0aGlzIGNhbGwgZG9lcyBub3Qgc3VwcG9ydCBvdmVybG9hZGVkIFdTREwgb3BlcmF0aW9ucyBhcyBpdAotICAgICAgICAgICAgLy8gZG9lcyBub3Qgc3BlY2lmeSB0aGUgbmFtZSBvZiB0aGUgaW5wdXQgYW5kIG91dHB1dCBtZXNzYWdlcwotICAgICAgICAgICAgQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3AgPQotICAgICAgICAgICAgICAgICAgICBiaW5kaW5nLmdldEJpbmRpbmdPcGVyYXRpb24oZ2V0T3BlcmF0aW9uTmFtZSgpLCBudWxsLCBudWxsKTsKLSAgICAgICAgICAgIGlmIChiaW5kaW5nT3AgIT0gbnVsbCAmJiBiaW5kaW5nT3AuZ2V0QmluZGluZ091dHB1dCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJGb3VuZCBXU0RMIGJpbmRpbmcgb3BlcmF0aW9uIGFuZCBvdXRwdXQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdG5zID0gZ2V0QmluZGluZ05hbWVzcGFjZShiaW5kaW5nT3AuZ2V0QmluZGluZ091dHB1dCgpKTsKLSAgICAgICAgICAgICAgICBpZiAodG5zICE9IG51bGwgJiYgbG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJGb3Igb3BlcmF0aW9uOiAiICsgYmluZGluZ09wLmdldE5hbWUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiByZXR1cm5pbmcgdGhlIGZvbGxvd2luZyBuYW1lc3BhY2UgZm9yIG91dHB1dCBtZXNzYWdlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBmcm9tIFdTREw6ICIgKyB0bnMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAodG5zID09IG51bGwpIHsKLSAgICAgICAgICAgIHRucyA9IGdldEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24oKS5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiRm9yIGJpbmRpbmcgb3V0cHV0IHJldHVybmluZyBAV2ViU2VydmljZS50YXJnZXROYW1lc3BhY2U6ICIgKyB0bnMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0bnM7Ci0gICAgfQotCi0gICAgCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2Qgd2lsbCByZXRyaWV2ZSB0aGUgbmFtZXNwYWNlIHRoYXQgaXMgc3BlY2lmaWVkIGJ5IHRoZSBCaW5kaW5nSW5wdXQgb3IKLSAgICAgKiBCaW5kaW5nT3V0cHV0IG9iamVjdC4KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBnZXRCaW5kaW5nTmFtZXNwYWNlKEF0dHJpYnV0ZUV4dGVuc2libGUgb3BJbmZvKSB7Ci0gICAgICAgIGlmIChvcEluZm8gaW5zdGFuY2VvZiBCaW5kaW5nSW5wdXQpIHsKLSAgICAgICAgICAgIEJpbmRpbmdJbnB1dCBpbnB1dCA9IChCaW5kaW5nSW5wdXQpIG9wSW5mbzsKLSAgICAgICAgICAgIHJldHVybiBEZXNjcmlwdGlvblV0aWxzLmdldE5hbWVzcGFjZUZyb21TT0FQRWxlbWVudChpbnB1dC5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAob3BJbmZvIGluc3RhbmNlb2YgQmluZGluZ091dHB1dCkgewotICAgICAgICAgICAgQmluZGluZ091dHB1dCBvdXRwdXQgPSAoQmluZGluZ091dHB1dCkgb3BJbmZvOwotICAgICAgICAgICAgcmV0dXJuIERlc2NyaXB0aW9uVXRpbHMuZ2V0TmFtZXNwYWNlRnJvbVNPQVBFbGVtZW50KG91dHB1dC5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBBdHRhY2htZW50RGVzY3JpcHRpb24gZ2V0UmVzdWx0QXR0YWNobWVudERlc2NyaXB0aW9uKCkgewotICAgICAgICBTdHJpbmcgcGFydE5hbWUgPSB0aGlzLmdldFJlc3VsdFBhcnROYW1lKCk7Ci0gICAgICAgIGlmIChwYXJ0TmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlJldHVybmluZyByZXN1bHQgQXR0YWNobWVudERlc2NyaXB0aW9uIGZvciBwYXJ0TmFtZTogIiArIHBhcnROYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBwYXJ0QXR0YWNobWVudE1hcC5nZXQocGFydE5hbWUpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJEaWQgbm90IGZpbmQgcmVzdWx0IEF0dGFjaG1lbnREZXNjcmlwdGlvbiBmb3IgcGFydE5hbWU6ICIgKyBwYXJ0TmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgZHJpdmUgdGhlIGJ1aWxkaW5nIG9mIEF0dGFjaG1lbnREZXNjcmlwdGlvbiBvYmplY3RzIGZvciB0aGUKLSAgICAgKiBvcGVyYXRpb24gaW5wdXQvb3V0cHV0IG1lc3NhZ2VzIGluIHRoZSBXU0RMLgotICAgICAqCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGJ1aWxkQXR0YWNobWVudEluZm9ybWF0aW9uKCkgewotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiU3RhcnQgYnVpbGRBdHRhY2htZW50SW5mb3JtYXRpb24iKTsKLSAgICAgICAgfQotICAgICAgICAvLyBPbmx5IGJ1aWxkaW5nIGF0dGFjaG1lbnQgaW5mbyBpZiB3ZSBmaW5kIGEgZnVsbCBXU0RMCi0gICAgICAgIGlmICh0aGlzLmdldEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb25JbXBsKCkKLSAgICAgICAgICAgICAgICAuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbkltcGwoKQotICAgICAgICAgICAgICAgIC5pc1dTRExGdWxseVNwZWNpZmllZCgpKSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkEgZnVsbCBXU0RMIGlzIGF2YWlsYWJsZS4gIFF1ZXJ5IHRoZSBXU0RMIGJpbmRpbmcgZm9yIHRoZSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkF0dGFjaG1lbnREZXNjcmlwdGlvbiBpbmZvcm1hdGlvbi4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIERlc2NyaXB0aW9uVXRpbHMuZ2V0QXR0YWNobWVudEZyb21CaW5kaW5nKHRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb25JbXBsKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbkltcGwoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRXU0RMQmluZGluZygpKTsKLSAgICAgICAgfSAgZWxzZSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlRoZSBXU0RMIGlzIG5vdCBhdmFpbGFibGUuICBMb29raW5nIGZvciBAV2ViU2VydmljZSB3c2RsTG9jYXRpb24uIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIFRyeSBnZXR0aW5nIGEgV1NETAotICAgICAgICAgICAgU3RyaW5nIHdzZGxMb2NhdGlvbiA9IHRoaXMuZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbkltcGwoKS4KLSAgICAgICAgICAgICAgICBnZXRFbmRwb2ludERlc2NyaXB0aW9uSW1wbCgpLgotICAgICAgICAgICAgICAgIGdldEFubm9XZWJTZXJ2aWNlV1NETExvY2F0aW9uKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmICh3c2RsTG9jYXRpb24gPT0gbnVsbCB8fCB3c2RsTG9jYXRpb24ubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkBXZWJTZXJ2aWNlIHdzZGxMb2NhdGlvbiBpcyBub3Qgc3BlY2lmaWVkLiAgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcm9jZXNzaW5nIGNvbnRpbnVlcyB3aXRob3V0IEF0dGFjaG1lbnREZXNjcmlwdGlvbiBpbmZvcm1hdGlvbiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQFdlYlNlcnZpY2Ugd3NkbExvY2F0aW9uIGlzICIgKyB3c2RsTG9jYXRpb24pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBEZWZpbml0aW9uIGRlZiA9IG51bGw7Ci0gICAgICAgICAgICAgICAgV1NETDRKV3JhcHBlciB3c2RsNGogPSBudWxsOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKHdzZGxMb2NhdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIFVSTCB1cmwgPSBmaWxlLnRvVVJMKCk7Ci0gICAgICAgICAgICAgICAgICAgIHdzZGw0aiA9IG5ldyBXU0RMNEpXcmFwcGVyKHVybCwgdHJ1ZSwgMik7ICAvLyBJbiB0aGlzIGNvbnRleHQsIGxpbWl0IHRoZSB3c2RsIG1lbW9yeQotICAgICAgICAgICAgICAgICAgICBkZWYgPSB3c2RsNGouZ2V0RGVmaW5pdGlvbigpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJFcnJvciBvY2N1cnJlZCB3aGlsZSBsb2FkaW5nIFdTREwuICAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJvY2VzaW5nIGNvbnRpbnVlcyB3aXRob3V0IEF0dGFjaG1lbnREZXNjcmlwdGlvbiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5mb3JtYXRpb24uICIgKyB0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoZGVmICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gU2V0IHRoZSBXU0RMIG9uIHRoZSBzZXJ2ZXIKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uSW1wbCgpLmdldEVuZHBvaW50RGVzY3JpcHRpb25JbXBsKCkuCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRTZXJ2aWNlRGVzY3JpcHRpb25JbXBsKCkuc2V0V3NkbFdyYXBwZXIod3NkbDRqKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIldTREwgRGVmaW5pdGlvbiBpcyBsb2FkZWQuICBHZXQgdGhlIFdTREwgQmluZGluZy4iKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgQmluZGluZyBiaW5kaW5nID0gdGhpcy5nZXRFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uSW1wbCgpLgotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RW5kcG9pbnREZXNjcmlwdGlvbkltcGwoKS5nZXRXU0RMQmluZGluZygpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYgKGJpbmRpbmcgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJXU0RMIEJpbmRpbmcgd2FzIG5vdCBmb3VuZCBmb3Igc2VydmljZU5hbWU9IiArICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uKCkuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RW5kcG9pbnREZXNjcmlwdGlvbigpLmdldFNlcnZpY2VRTmFtZSgpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBhbmQgcG9ydE5hbWU9IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbigpLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEVuZHBvaW50RGVzY3JpcHRpb24oKS5nZXRQb3J0UU5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlF1ZXJ5IEJpbmRpbmcgZm9yIEF0dGFjaG1lbnREZXNjcmlwdGlvbiBJbmZvcm1hdGlvbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb25VdGlscy5nZXRBdHRhY2htZW50RnJvbUJpbmRpbmcodGhpcywgYmluZGluZyk7Ci0gICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIkVuZCBidWlsZEF0dGFjaG1lbnRJbmZvcm1hdGlvbiIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyB3aWxsIHJldHVybiBhbiBBdHRhY2htZW50RGVzY3JpcHRpb24gYmFzZWQgb24gYSBwYXJ0IG5hbWUuCi0gICAgICovCi0gICAgcHVibGljIEF0dGFjaG1lbnREZXNjcmlwdGlvbiBnZXRQYXJ0QXR0YWNobWVudERlc2NyaXB0aW9uKFN0cmluZyBwYXJ0TmFtZSkgewotICAgICAgICByZXR1cm4gcGFydEF0dGFjaG1lbnRNYXAuZ2V0KHBhcnROYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRQYXJ0QXR0YWNobWVudERlc2NyaXB0aW9uKFN0cmluZyBwYXJ0TmFtZSwgQXR0YWNobWVudERlc2NyaXB0aW9uIGF0dGFjaG1lbnREZXNjKSB7Ci0gICAgICAgIHBhcnRBdHRhY2htZW50TWFwLnB1dChwYXJ0TmFtZSwgYXR0YWNobWVudERlc2MpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNSZXF1ZXN0U3dhUmVmQXR0YWNobWVudHMoKSB7Ci0gICAgICAgIHJldHVybiBoYXNSZXF1ZXN0U3dhUmVmQXR0YWNobWVudHM7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldEhhc1JlcXVlc3RTd2FSZWZBdHRhY2htZW50cyhib29sZWFuIGIpIHsKLSAgICAgICAgaGFzUmVxdWVzdFN3YVJlZkF0dGFjaG1lbnRzID0gYjsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gaGFzUmVzcG9uc2VTd2FSZWZBdHRhY2htZW50cygpIHsKLSAgICAgICAgcmV0dXJuIGhhc1Jlc3BvbnNlU3dhUmVmQXR0YWNobWVudHM7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldEhhc1Jlc3BvbnNlU3dhUmVmQXR0YWNobWVudHMoYm9vbGVhbiBiKSB7Ci0gICAgICAgIGhhc1Jlc3BvbnNlU3dhUmVmQXR0YWNobWVudHMgPSBiOwotICAgIH0KLSAgICAgICAgICAgIAotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBuZXdsaW5lID0gIlxuIjsKLSAgICAgICAgZmluYWwgU3RyaW5nIHNhbWVsaW5lID0gIjsgIjsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHN0cmluZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQoc3VwZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICBzdHJpbmcuYXBwZW5kKG5ld2xpbmUpOwotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZCgiTmFtZTogIiArIGdldE5hbWUoKSk7Ci0gICAgICAgICAgICBzdHJpbmcuYXBwZW5kKHNhbWVsaW5lKTsKLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQoIk9wZXJhdGlvbiBOYW1lOiAiICsgZ2V0T3BlcmF0aW9uTmFtZSgpKTsKLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQoc2FtZWxpbmUpOwotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZCgiQWN0aW9uOiAiICsgZ2V0QWN0aW9uKCkpOwotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQobmV3bGluZSk7Ci0gICAgICAgICAgICBzdHJpbmcuYXBwZW5kKCJPcGVyYXRpb24gZXhjbHVkZWQ6ICIgKyAoaXNFeGNsdWRlZCgpID09IHRydWUpKTsKLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQoc2FtZWxpbmUpOwotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZCgiSXMgb25ld2F5OiAiICsgKGlzT25lV2F5KCkgPT0gdHJ1ZSkpOwotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZChzYW1lbGluZSk7Ci0gICAgICAgICAgICBzdHJpbmcuYXBwZW5kKCJJcyByZXR1cm5pbmcgcmVzdWx0OiAiICsgKGlzT3BlcmF0aW9uUmV0dXJuaW5nUmVzdWx0KCkgPT0gdHJ1ZSkpOwotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZChzYW1lbGluZSk7Ci0gICAgICAgICAgICBzdHJpbmcuYXBwZW5kKCJJcyByZXN1bHQgaGVhZGVyOiAiICsgKGlzUmVzdWx0SGVhZGVyKCkgPT0gdHJ1ZSkpOwotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZChzYW1lbGluZSk7Ci0gICAgICAgICAgICBzdHJpbmcuYXBwZW5kKCJJcyBKQVhXUyBDbGllbnQgQXN5bmMgbWV0aG9kOiAiICsgKGlzSkFYV1NBc3luY0NsaWVudE1ldGhvZCgpID09IHRydWUpKTsKLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICBzdHJpbmcuYXBwZW5kKG5ld2xpbmUpOwotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZCgiU09BUCBTdHlsZTogIiArIGdldFNvYXBCaW5kaW5nU3R5bGUoKSk7Ci0gICAgICAgICAgICBzdHJpbmcuYXBwZW5kKHNhbWVsaW5lKTsKLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQoIlNPQVAgVXNlOiAiICsgZ2V0U29hcEJpbmRpbmdVc2UoKSk7Ci0gICAgICAgICAgICBzdHJpbmcuYXBwZW5kKHNhbWVsaW5lKTsKLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQoIlNPQVAgUGFyYW1hdGVyIFN0eWxlOiAiICsgZ2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpKTsKLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICBzdHJpbmcuYXBwZW5kKG5ld2xpbmUpOwotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZCgiUmVzdWx0IG5hbWU6ICIgKyBnZXRSZXN1bHROYW1lKCkpOwotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZChzYW1lbGluZSk7Ci0gICAgICAgICAgICBzdHJpbmcuYXBwZW5kKCJSZXN1bHQgcGFydCBuYW1lOiAiICsgZ2V0UmVzdWx0UGFydE5hbWUoKSk7Ci0gICAgICAgICAgICBzdHJpbmcuYXBwZW5kKHNhbWVsaW5lKTsKLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQoIlJlc3VsdCB0eXBlOiAiICsgZ2V0UmVzdWx0VHlwZSgpKTsKLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQoc2FtZWxpbmUpOwotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZCgiUmVzdWx0IGFjdHVhbCB0eXBlOiAiICsgZ2V0UmVzdWx0QWN0dWFsVHlwZSgpKTsKLSAgICAgICAgICAgIGlmIChnZXRSZXN1bHRBdHRhY2htZW50RGVzY3JpcHRpb24oKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc3RyaW5nLmFwcGVuZChuZXdsaW5lKTsKLSAgICAgICAgICAgICAgICBzdHJpbmcuYXBwZW5kKGdldFJlc3VsdEF0dGFjaG1lbnREZXNjcmlwdGlvbigpLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQobmV3bGluZSk7Ci0gICAgICAgICAgICBzdHJpbmcuYXBwZW5kKCJSZXF1ZXN0IFdyYXBwZXIgY2xhc3M6ICIgKyBnZXRSZXF1ZXN0V3JhcHBlckNsYXNzTmFtZSgpKTsKLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQoc2FtZWxpbmUpOwotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZCgiUmVzcG9uc2UgV3JhcHBlciBjbGFzczogIiArIGdldFJlc3BvbnNlV3JhcHBlckNsYXNzTmFtZSgpKTsKLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICBzdHJpbmcuYXBwZW5kKG5ld2xpbmUpOwotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZCgiSmF2YSBkZWNsYXJpbmcgY2xhc3MgbmFtZTogIiArIGdldEphdmFEZWNsYXJpbmdDbGFzc05hbWUoKSk7Ci0gICAgICAgICAgICBzdHJpbmcuYXBwZW5kKG5ld2xpbmUpOwotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZCgiSmF2YSBtZXRob2QgbmFtZTogIiArIGdldEphdmFNZXRob2ROYW1lKCkpOwotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZChuZXdsaW5lKTsKLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQoIkphdmEgcGFyYW1hdGVyczogIiArIGdldEphdmFQYXJhbWV0ZXJzKCkpOwotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZChuZXdsaW5lKTsKLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQoIlNlcnZpY2UgSW1wbGVtZW50YXRpb24gbWV0aG9kOiAiICsgZ2V0TWV0aG9kRnJvbVNlcnZpY2VJbXBsKCkpOwotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZChuZXdsaW5lKTsKLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQoIkF4aXMgT3BlcmF0aW9uOiAiICsgZ2V0QXhpc09wZXJhdGlvbigpKTsKLQotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZChuZXdsaW5lKTsKLSAgICAgICAgICAgIFBhcmFtZXRlckRlc2NyaXB0aW9uW10gcGFyYW1EZXNjcyA9IGdldFBhcmFtZXRlckRlc2NyaXB0aW9ucygpOwotICAgICAgICAgICAgaWYgKHBhcmFtRGVzY3MgIT0gbnVsbCAmJiBwYXJhbURlc2NzLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgICAgICBzdHJpbmcuYXBwZW5kKCJOdW1iZXIgb2YgUGFyYW1ldGVyIERlc2NyaXB0aW9uczogIiArIHBhcmFtRGVzY3MubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBmb3IgKFBhcmFtZXRlckRlc2NyaXB0aW9uIHBhcmFtRGVzYyA6IHBhcmFtRGVzY3MpIHsKLSAgICAgICAgICAgICAgICAgICAgc3RyaW5nLmFwcGVuZChuZXdsaW5lKTsKLSAgICAgICAgICAgICAgICAgICAgc3RyaW5nLmFwcGVuZCgiUGFyYW1ldGVyIERlc2NyaXB0aW9uOiAiICsgcGFyYW1EZXNjLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc3RyaW5nLmFwcGVuZCgiTm8gUGFyYW1hdGVyIERlc2NyaXB0aW9ucyIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzdHJpbmcuYXBwZW5kKG5ld2xpbmUpOwotICAgICAgICAgICAgRmF1bHREZXNjcmlwdGlvbltdIGZhdWx0RGVzY3MgPSBnZXRGYXVsdERlc2NyaXB0aW9ucygpOwotICAgICAgICAgICAgaWYgKGZhdWx0RGVzY3MgIT0gbnVsbCAmJiBmYXVsdERlc2NzLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgICAgICBzdHJpbmcuYXBwZW5kKCJOdW1iZXIgb2YgRmF1bHQgRGVzY3JpcHRpb25zOiAiICsgZmF1bHREZXNjcy5sZW5ndGgpOwotICAgICAgICAgICAgICAgIGZvciAoRmF1bHREZXNjcmlwdGlvbiBmYXVsdERlc2MgOiBmYXVsdERlc2NzKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0cmluZy5hcHBlbmQobmV3bGluZSk7Ci0gICAgICAgICAgICAgICAgICAgIHN0cmluZy5hcHBlbmQoIkZhdWx0IERlc2NyaXB0aW9uOiAiICsgZmF1bHREZXNjLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc3RyaW5nLmFwcGVuZCgiTm8gRmF1bHQgRGVzY3JpcHRpb25zIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmKCFwYXJ0QXR0YWNobWVudE1hcC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBzdHJpbmcuYXBwZW5kKG5ld2xpbmUpOwotICAgICAgICAgICAgICAgIHN0cmluZy5hcHBlbmQoIk51bWJlciBvZiBBdHRhY2htZW50IERlc2NyaXB0aW9uczogIiAgKyBwYXJ0QXR0YWNobWVudE1hcC5zaXplKCkpOwotICAgICAgICAgICAgICAgIHN0cmluZy5hcHBlbmQobmV3bGluZSk7Ci0gICAgICAgICAgICAgICAgSXRlcmF0b3I8QXR0YWNobWVudERlc2NyaXB0aW9uPiBhZEl0ZXIgPSBwYXJ0QXR0YWNobWVudE1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgIHdoaWxlKGFkSXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZy5hcHBlbmQoYWRJdGVyLm5leHQoKS50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZy5hcHBlbmQobmV3bGluZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzdHJpbmcuYXBwZW5kKG5ld2xpbmUpOwotICAgICAgICAgICAgICAgIHN0cmluZy5hcHBlbmQoIk5vIEF0dGFjaG1lbnQgRGVzY3JpcHRpb25zIik7Ci0gICAgICAgICAgICAgICAgc3RyaW5nLmFwcGVuZChuZXdsaW5lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZCgiUnVudGltZURlc2NyaXB0aW9uczoiICsgdGhpcy5ydW50aW1lRGVzY01hcC5zaXplKCkpOwotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZChuZXdsaW5lKTsKLSAgICAgICAgICAgIGZvciAoT3BlcmF0aW9uUnVudGltZURlc2NyaXB0aW9uIHJ1bnRpbWVEZXNjIDogcnVudGltZURlc2NNYXAudmFsdWVzKCkpIHsKLSAgICAgICAgICAgICAgICBzdHJpbmcuYXBwZW5kKHJ1bnRpbWVEZXNjLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIHN0cmluZy5hcHBlbmQobmV3bGluZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0gICAgICAgICAgICBzdHJpbmcuYXBwZW5kKG5ld2xpbmUpOwotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZCgiQ29tcGxldGUgZGVidWcgaW5mb3JtYXRpb24gbm90IGN1cnJlbnRseSBhdmFpbGFibGUgZm9yICIgKwotICAgICAgICAgICAgICAgICAgICAiT3BlcmF0aW9uRGVzY3JpcHRpb24iKTsKLSAgICAgICAgICAgIHJldHVybiBzdHJpbmcudG9TdHJpbmcoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RyaW5nLnRvU3RyaW5nKCk7Ci0gICAgfQotICAgIAotICAgIC8qKiAKLSAgICAgKiBBZGRzIGEgbGlzdCBvZiBTT0FQIGhlYWRlciBRTmFtZXMgdGhhdCBhcmUgdW5kZXJzdG9vZCBieSBKQVhXUyBmb3IgdGhpcyBvcGVyYXRpb24gdG8gdGhlCi0gICAgICogQXhpc09wZXJhdGlvbi4gIFRoaXMgd2lsbCBiZSB1c2VkIGJ5IEF4aXMyIHRvIHZlcmlmeSB0aGF0IGFsbCBoZWFkZXJzIG1hcmtlZCBhcwotICAgICAqIG11c3RVbmRlcnN0YW5kIGhhdmUgYmVlbiBvciB3aWxsIGJlIHByb2Nlc3NlZC4KLSAgICAgKiAKLSAgICAgKiBTZXJ2ZXIgc2lkZSBoZWFkZXJzIGNvbnNpZGVyZWQgdW5kZXJzdG9vZCBbSkFYV1MgMi4wIFNlYyAxMC4yLjEgcGFnZSAxMTddCi0gICAgICogLSBTRUkgbWV0aG9kIHBhcmFtcyB0aGF0IGFyZSBpbiBoZWFkZXJzIAotICAgICAqIC0gSGVhZGVycyBwcm9jZXNzZWQgYnkgYXBwbGljYXRpb24gaGFuZGxlcnMgKFRCRCkKLSAgICAgKiAKLSAgICAgKiBDbGllbnQgc2lkZSBoZWFkZXJzIGNvbnNpZGVyZWQgdW5kZXJzdG9vZDogTm9uZQotICAgICAqCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHJlZ2lzdGVyTXVzdFVuZGVyc3RhbmRIZWFkZXJzKCkgewotICAgICAgICAKLSAgICAgICAgLy8gUkVWSUVXOiBJZiBjbGllbnQgc2lkZSAocmV0dXJuIHZhbHVlLCBPVVQgb3IgSU5PVVQgcGFyYW1zKSBuZWVkcyB0byBiZSBzdXBwb3J0ZWQgdGhlbgotICAgICAgICAvLyB0aGlzIG5lZWRzIHRvIHByb2Nlc3MgY2xpZW50IGFuZCBzZXJ2ZXIgZGlmZmVyZW50bHkuCi0KLSAgICAgICAgQXhpc09wZXJhdGlvbiB0aGVBeGlzT3BlcmF0aW9uID0gZ2V0QXhpc09wZXJhdGlvbigpOyAKLSAgICAgICAgaWYgKHRoZUF4aXNPcGVyYXRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJUaGUgYXhpcyBvcGVyYXRpb24gaXMgbnVsbCwgc28gaGVhZGVyIFFOYW1lcyBjb3VsZCBub3QgYmUgcmVnaXN0ZXJlZC4gIE9wRGVzYyA9ICIgKyB0aGlzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIElmIGFueSBJTiBvciBJTk9VVCBwYXJhbWV0ZXJzIGFyZSBpbiB0aGUgaGVhZGVyLCB0aGVuIGFkZCB0aGVpciBRTmFtZXMgdG8gdGhlIGxpc3QKLSAgICAgICAgUGFyYW1ldGVyRGVzY3JpcHRpb24gcGFyYW1EZXNjc1tdID0gZ2V0UGFyYW1ldGVyRGVzY3JpcHRpb25zKCk7Ci0gICAgICAgIEFycmF5TGlzdCB1bmRlcnN0b29kUU5hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBpZiAocGFyYW1EZXNjcyAhPSBudWxsICYmIHBhcmFtRGVzY3MubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgZm9yIChQYXJhbWV0ZXJEZXNjcmlwdGlvbiBwYXJhbURlc2MgOiBwYXJhbURlc2NzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBhcmFtRGVzYy5pc0hlYWRlcigpIAotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHBhcmFtRGVzYy5nZXRNb2RlKCkgPT0gV2ViUGFyYW0uTW9kZS5JTiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgcGFyYW1EZXNjLmdldE1vZGUoKSA9PSBXZWJQYXJhbS5Nb2RlLklOT1VUKSkgewotICAgICAgICAgICAgICAgICAgICBRTmFtZSBoZWFkZXJRTiA9IG5ldyBRTmFtZShwYXJhbURlc2MuZ2V0VGFyZ2V0TmFtZXNwYWNlKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbURlc2MuZ2V0UGFyYW1ldGVyTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgdW5kZXJzdG9vZFFOYW1lcy5hZGQoaGVhZGVyUU4pOwotICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiT3BEZXNjOiB1bmRlcnN0b29kUU5hbWUgYWRkZWQgdG8gQXhpc09wZXJhdGlvbiAoaWYgbm90IG51bGwpICIgKyBoZWFkZXJRTik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIXVuZGVyc3Rvb2RRTmFtZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBQYXJhbWV0ZXIgaGVhZGVyUU5QYXJhbWV0ZXIgPSBuZXcgUGFyYW1ldGVyKE9wZXJhdGlvbkRlc2NyaXB0aW9uLkhFQURFUl9QQVJBTUVURVJfUU5BTUVTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlcnN0b29kUU5hbWVzKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgdGhlQXhpc09wZXJhdGlvbi5hZGRQYXJhbWV0ZXIoaGVhZGVyUU5QYXJhbWV0ZXIpOwotICAgICAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGUpIHsKLSAgICAgICAgICAgICAgICBsb2cud2FybihNZXNzYWdlcy5nZXRNZXNzYWdlKCJyZWdNVUhlYWRlcnNFcnIiLHRoZUF4aXNPcGVyYXRpb24uZ2V0Q2xhc3MoKS5nZXROYW1lKCkpLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAvKioKLSAgICAgKiBHZXQgYW4gYW5ub3RhdGlvbi4gIFRoaXMgaXMgd3JhcHBlcmVkIHRvIGF2b2lkIGEgSmF2YTJTZWN1cml0eSB2aW9sYXRpb24uCi0gICAgICogQHBhcmFtIGNscyBDbGFzcyB0aGF0IGNvbnRhaW5zIGFubm90YXRpb24gCi0gICAgICogQHBhcmFtIGFubm90YXRpb24gQ2xhc3Mgb2YgcmVxdXJlc3RlZCBBbm5vdGF0aW9uCi0gICAgICogQHJldHVybiBhbm5vdGF0aW9uIG9yIG51bGwKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBBbm5vdGF0aW9uIGdldEFubm90YXRpb24oZmluYWwgQW5ub3RhdGVkRWxlbWVudCBlbGVtZW50LCBmaW5hbCBDbGFzcyBhbm5vdGF0aW9uKSB7Ci0gICAgICAgIHJldHVybiAoQW5ub3RhdGlvbikgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRBY3Rpb24oKSB7Ci0gICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudC5nZXRBbm5vdGF0aW9uKGFubm90YXRpb24pOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9pbXBsL1BhcmFtZXRlckRlc2NyaXB0aW9uSW1wbC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vaW1wbC9QYXJhbWV0ZXJEZXNjcmlwdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdmMjMxYy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9pbXBsL1BhcmFtZXRlckRlc2NyaXB0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmltcGw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkF0dGFjaG1lbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkVuZHBvaW50RGVzY3JpcHRpb25KYXZhOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uT3BlcmF0aW9uRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5QYXJhbWV0ZXJEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLlBhcmFtZXRlckRlc2NyaXB0aW9uSmF2YTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLlBhcmFtZXRlckRlc2NyaXB0aW9uV1NETDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuUGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLmNvbnZlcnRlci5Db252ZXJ0ZXJVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbTsKLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZzsKLWltcG9ydCBqYXZheC54bWwud3MuSG9sZGVyOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQXJyYXk7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuR2VuZXJpY0FycmF5VHlwZTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5QYXJhbWV0ZXJpemVkVHlwZTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOwotCi0vKiogQHNlZSAuLi9QYXJhbWV0ZXJEZXNjcmlwdGlvbiAqLwotY2xhc3MgUGFyYW1ldGVyRGVzY3JpcHRpb25JbXBsCi0gICAgICAgIGltcGxlbWVudHMgUGFyYW1ldGVyRGVzY3JpcHRpb24sIFBhcmFtZXRlckRlc2NyaXB0aW9uSmF2YSwgUGFyYW1ldGVyRGVzY3JpcHRpb25XU0RMIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coUGFyYW1ldGVyRGVzY3JpcHRpb25JbXBsLmNsYXNzKTsKLSAgICBwcml2YXRlIE9wZXJhdGlvbkRlc2NyaXB0aW9uIHBhcmVudE9wZXJhdGlvbkRlc2NyaXB0aW9uOwotICAgIC8vIFRoZSBDbGFzcyByZXByZXNlbnRpbmcgdGhlIHBhcmFtZXRlci4gIE5vdGUgdGhhdCBmb3IgYSBHZW5lcmljLCBpbmNsdWRpbmcgdGhlIEpBWC1XUyBIb2xkZXI8VD4gR2VuZXJpYywgCi0gICAgLy8gdGhpcyByZXByZXNlbnRzIHRoZSByYXcgdHlwZSBvZiB0aGUgR2VuZXJpYyAoZS5nLiBMaXN0IGZvciBMaXN0PFQ+IG9yIEhvbGRlciBmb3IgSG9sZGVyPFQ+KS4KLSAgICBwcml2YXRlIENsYXNzIHBhcmFtZXRlclR5cGU7Ci0gICAgLy8gRm9yIHRoZSBKQVgtV1MgR2VuZXJpYyBIb2xkZXI8VD4gKGUuZy4gSG9sZGVyPEZvbz4pLCB0aGlzIHdpbGwgYmUgdGhlIGFjdHVhbCB0eXBlIGFyZ3VtZW50IChlLmcuIEZvbykuICBGb3IgCi0gICAgLy8gYW55IG90aGVyIHBhcmFtZXRlciAoaW5jbHVkaW5nIG90aGVyIEdlbmVyaWNzKSwgdGhpcyB3aWxsIGJlIG51bGwuIAotICAgIC8vIE5vdGUgdGhhdCBzaW5jZSBKQVgtV1MgSG9sZGVyPFQ+IG9ubHkgc3VwcG9ydHMgYSBzaW5nbGUgYWN0dWFsIHR5cGUgVCAobm90IG11bHRpcGxlIHR5cGVzIHN1Y2ggYXMgPEssVj4pCi0gICAgcHJpdmF0ZSBDbGFzcyBwYXJhbWV0ZXJIb2xkZXJBY3R1YWxUeXBlOwotCi0gICAgLy8gMC1iYXNlZCBudW1iZXIgb2YgdGhlIHBhcmFtZXRlciBpbiB0aGUgYXJndW1lbnQgbGlzdAotICAgIHByaXZhdGUgaW50IHBhcmFtZXRlck51bWJlciA9IC0xOwotICAgIC8vIFRoZSBQYXJhbWV0ZXIgRGVzY3JpcHRpb24gQ29tcG9zaXRlIHVzZWQgdG8gYnVpbGQgdGhlIFBhcmFtZXRlckRlc2NyaXB0aW9uCi0gICAgcHJpdmF0ZSBQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZSBwYXJhbURlc2NDb21wb3NpdGU7Ci0KLSAgICAvLyBBTk5PVEFUSU9OOiBAV2ViTWV0aG9kCi0gICAgcHJpdmF0ZSBXZWJQYXJhbSB3ZWJQYXJhbUFubm90YXRpb247Ci0gICAgcHJpdmF0ZSBTdHJpbmcgd2ViUGFyYW1OYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIHdlYlBhcmFtUGFydE5hbWU7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV2ViUGFyYW1fVGFyZ2V0TmFtZXNwYWNlX0RFRkFVTFQgPSAiIjsKLSAgICBwcml2YXRlIFN0cmluZyB3ZWJQYXJhbVRhcmdldE5hbWVzcGFjZTsKLSAgICBwcml2YXRlIFdlYlBhcmFtLk1vZGUgd2ViUGFyYW1Nb2RlOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhbiBXZWJQYXJhbV9IZWFkZXJfREVGQVVMVCA9IG5ldyBCb29sZWFuKGZhbHNlKTsKLSAgICBwcml2YXRlIEJvb2xlYW4gd2ViUGFyYW1IZWFkZXI7Ci0gICAgCi0gICAgLy8gQXR0YWNobWVudCBEZXNjcmlwdGlvbiBpbmZvcm1hdGlvbgotICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgICAgICBfc2V0QXR0YWNobWVudERlc2MgPSBmYWxzZTsKLSAgICBwcml2YXRlIEF0dGFjaG1lbnREZXNjcmlwdGlvbiBhdHRhY2htZW50RGVzYyA9IG51bGw7Ci0gICAgCi0gICAgLy8gVGhpcyBib29sZWFuIGluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0aGVyZSB3YXMgYW4gQFhNTExpc3Qgb24gdGhlIHBhcmFtZXRlcgotICAgIHByaXZhdGUgYm9vbGVhbiBpc0xpc3RUeXBlID0gZmFsc2U7Ci0gICAgCi0gICAgUGFyYW1ldGVyRGVzY3JpcHRpb25JbXBsKGludCBwYXJhbWV0ZXJOdW1iZXIsIENsYXNzIHBhcmFtZXRlclR5cGUsIFR5cGUgcGFyYW1ldGVyR2VuZXJpY1R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFubm90YXRpb25bXSBwYXJhbWV0ZXJBbm5vdGF0aW9ucywgT3BlcmF0aW9uRGVzY3JpcHRpb24gcGFyZW50KSB7Ci0gICAgICAgIHRoaXMucGFyYW1ldGVyTnVtYmVyID0gcGFyYW1ldGVyTnVtYmVyOwotICAgICAgICB0aGlzLnBhcmVudE9wZXJhdGlvbkRlc2NyaXB0aW9uID0gcGFyZW50OwotICAgICAgICB0aGlzLnBhcmFtZXRlclR5cGUgPSBwYXJhbWV0ZXJUeXBlOwotCi0gICAgICAgIC8vIFRoZSBUeXBlIGFyZ3VtZW50IGNvdWxkIGJlIGEgVHlwZSAoaWYgdGhlIHBhcmFtZXRlciBpcyBhIFBhcmFtYXRlcml6ZWQgR2VuZXJpYykgb3IKLSAgICAgICAgLy8ganVzdCBhIENsYXNzIChpZiBpdCBpcyBub3QpLiAgSWYgaXQgSkFYLVdTIEhvbGRlcjxUPiBwYXJhbWV0ZXJpemVkIHR5cGUsIHRoZW4gZ2V0IHRoZSAKLSAgICAgICAgLy8gYWN0dWFsIHBhcmFtZXRlciB0eXBlIGFuZCBoYW5nIG9uIHRvIHRoYXQsIHRvby4KLSAgICAgICAgaWYgKFBhcmFtZXRlcml6ZWRUeXBlLmNsYXNzLmlzSW5zdGFuY2UocGFyYW1ldGVyR2VuZXJpY1R5cGUpKSB7Ci0gICAgICAgICAgICB0aGlzLnBhcmFtZXRlckhvbGRlckFjdHVhbFR5cGUgPQotICAgICAgICAgICAgICAgICAgICBnZXRHZW5lcmljUGFyYW1ldGVyQWN0dWFsVHlwZSgoUGFyYW1ldGVyaXplZFR5cGUpcGFyYW1ldGVyR2VuZXJpY1R5cGUpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmRXZWJQYXJhbUFubm90YXRpb24ocGFyYW1ldGVyQW5ub3RhdGlvbnMpOwotICAgICAgICB0aGlzLmlzTGlzdFR5cGUgPSBDb252ZXJ0ZXJVdGlscy5oYXNYbWxMaXN0QW5ub3RhdGlvbihwYXJhbWV0ZXJBbm5vdGF0aW9ucyk7Ci0gICAgfQotCi0gICAgUGFyYW1ldGVyRGVzY3JpcHRpb25JbXBsKGludCBwYXJhbWV0ZXJOdW1iZXIsIFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlIHBkYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmF0aW9uRGVzY3JpcHRpb24gcGFyZW50KSB7Ci0gICAgICAgIHRoaXMucGFyYW1EZXNjQ29tcG9zaXRlID0gcGRjOwotICAgICAgICB0aGlzLnBhcmFtZXRlck51bWJlciA9IHBhcmFtZXRlck51bWJlcjsKLSAgICAgICAgdGhpcy5wYXJlbnRPcGVyYXRpb25EZXNjcmlwdGlvbiA9IHBhcmVudDsKLSAgICAgICAgd2ViUGFyYW1Bbm5vdGF0aW9uID0gcGRjLmdldFdlYlBhcmFtQW5ub3QoKTsKLSAgICAgICAgdGhpcy5pc0xpc3RUeXBlID0gcGRjLmlzTGlzdFR5cGUoKTsKLQotICAgICAgICAvL1RPRE86IE5lZWQgdG8gYnVpbGQgdGhlIHNjaGVtYSBtYXAuIE5lZWQgdG8gYWRkIGxvZ2ljIHRvIGFkZCB0aGlzIHBhcmFtZXRlcgotICAgICAgICAvLyAgICAgIHRvIHRoZSBzY2hlbWEgbWFwLgotCi0gICAgfQotCi0gICAgLyoKLSAgICAqIFRoaXMgZ3JhYnMgdGhlIFdlYlBhcmFtIGFubm90YXRpb24gZnJvbSB0aGUgbGlzdCBvZiBhbm5vdGF0aW9ucyBmb3IgdGhpcyBwYXJhbWV0ZXIKLSAgICAqIFRoaXMgc2hvdWxkIGJlIERFUFJFQ0FURUQgb25jZSBEQkMgcHJvY2Vzc2luZyBpcyBjb21wbGV0ZS4KLSAgICAqLwotICAgIHByaXZhdGUgdm9pZCBmaW5kV2ViUGFyYW1Bbm5vdGF0aW9uKEFubm90YXRpb25bXSBhbm5vdGF0aW9ucykgewotICAgICAgICBmb3IgKEFubm90YXRpb24gY2hlY2tBbm5vdGF0aW9uIDogYW5ub3RhdGlvbnMpIHsKLSAgICAgICAgICAgIC8vIFJFVklFVzogVGhpcyBtYXkgbm90IHdvcmsgd2l0aCB0aGUgTURRSW5wdXQuICBGcm9tIHRoZSBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uIGludGVyZmFjZQotICAgICAgICAgICAgLy8gICAgICAgICBqYXZhZG9jOiAiTm90ZSB0aGF0IGFuIGludGVyZmFjZSB0aGF0IG1hbnVhbGx5IGV4dGVuZHMgdGhpcyBvbmUgZG9lcyBub3QgZGVmaW5lIGFuIGFubm90YXRpb24gdHlwZS4iCi0gICAgICAgICAgICBpZiAoY2hlY2tBbm5vdGF0aW9uLmFubm90YXRpb25UeXBlKCkgPT0gV2ViUGFyYW0uY2xhc3MpIHsKLSAgICAgICAgICAgICAgICB3ZWJQYXJhbUFubm90YXRpb24gPSAoV2ViUGFyYW0pY2hlY2tBbm5vdGF0aW9uOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBPcGVyYXRpb25EZXNjcmlwdGlvbiBnZXRPcGVyYXRpb25EZXNjcmlwdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIHBhcmVudE9wZXJhdGlvbkRlc2NyaXB0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNsYXNzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcGFyYW1ldGVyLiAgTm90ZSB0aGF0IGZvciB0aGUgSkFYLVdTIEhvbGRlcjxUPiB0eXBlLAotICAgICAqIHlvdSBjYW4gdXNlIGdldFBhcmFtZXRlckFjdHVhbFR5cGUoKSB0byBnZXQgdGhlIGNsYXNzIGFzc29jaWF0ZWQgd2l0aCBULgotICAgICAqLwotICAgIHB1YmxpYyBDbGFzcyBnZXRQYXJhbWV0ZXJUeXBlKCkgewotICAgICAgICBpZiAocGFyYW1ldGVyVHlwZSA9PSBudWxsICYmIHBhcmFtRGVzY0NvbXBvc2l0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwYXJhbWV0ZXJUeXBlID0gcGFyYW1EZXNjQ29tcG9zaXRlLmdldFBhcmFtZXRlclR5cGVDbGFzcygpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwYXJhbWV0ZXJUeXBlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZvciBhIG5vbi1Ib2xkZXIgdHlwZSwgcmV0dXJucyB0aGUgcGFyYW1ldGVyIGNsYXNzLiAgRm9yIGEgSG9sZGVyPFQ+IHR5cGUsIHJldHVybnMgdGhlIGNsYXNzCi0gICAgICogb2YgVC4KLSAgICAgKgotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ2xhc3MgZ2V0UGFyYW1ldGVyQWN0dWFsVHlwZSgpIHsKLSAgICAgICAgaWYgKHBhcmFtZXRlckhvbGRlckFjdHVhbFR5cGUgPT0gbnVsbCAmJiBwYXJhbURlc2NDb21wb3NpdGUgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgIHBhcmFtRGVzY0NvbXBvc2l0ZS5pc0hvbGRlclR5cGUoKSkgewotICAgICAgICAgICAgcGFyYW1ldGVySG9sZGVyQWN0dWFsVHlwZSA9IHBhcmFtRGVzY0NvbXBvc2l0ZS5nZXRIb2xkZXJBY3R1YWxUeXBlQ2xhc3MoKTsKLSAgICAgICAgICAgIHJldHVybiBwYXJhbWV0ZXJIb2xkZXJBY3R1YWxUeXBlOwotICAgICAgICB9IGVsc2UgaWYgKHBhcmFtZXRlckhvbGRlckFjdHVhbFR5cGUgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHBhcmFtZXRlckhvbGRlckFjdHVhbFR5cGU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAocGFyYW1EZXNjQ29tcG9zaXRlICE9IG51bGwgJiYgcGFyYW1ldGVyVHlwZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcGFyYW1ldGVyVHlwZSA9IHBhcmFtRGVzY0NvbXBvc2l0ZS5nZXRQYXJhbWV0ZXJUeXBlQ2xhc3MoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBwYXJhbWV0ZXJUeXBlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVEVNUE9SQVJZIE1FVEhPRCEgIEZvciBhIEpBWC1XUyBIb2xkZXI8VD4gdGhpcyByZXR1cm5zIHRoZSBjbGFzcyBhc3NvY2lhdGVkIHdpdGggPFQ+LiBGb3IgYQotICAgICAqIEhvbGRlcjxHZW5lcmljPC4uLj4+LCBpdCByZXR1cm5zIHRoZSBjbGFzcyBhc3NvY2lhdGVkIHdpdGggR2VuZXJpYy4gIElmIHRoZSB0eXBlIGlzIG5vdCBhCi0gICAgICogSkFYLVdTIEhvbGRlciwgcmV0dXJuIGEgbnVsbC4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhpcyBtZXRob2QgU0hPVUxEIEJFIFJFTU9WRUQgd2hlbiB0aGUgZGVzY3JpcHRpb24gbGF5ZXIgaXMgcmVmYWN0b3JlZCB0byB1c2Ugb25seSBEQkMgYW5kCi0gICAgICogbm90IEphdmEgcmVmbGVjdGlvbiBkaXJlY3RseS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJHZW5lcmljVHlwZQotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICAvLyBUT0RPOiBSZW1vdmUgdGhpcyBtZXRob2Qgd2hlbiBjb2RlIHJlZmFjdG9yZWQgdG8gb25seSB1c2UgREJDLgotICAgIHByaXZhdGUgQ2xhc3MgZ2V0R2VuZXJpY1BhcmFtZXRlckFjdHVhbFR5cGUoUGFyYW1ldGVyaXplZFR5cGUgcGFyYW1ldGVyR2VuZXJpY1R5cGUpIHsKLSAgICAgICAgQ2xhc3MgcmV0dXJuQ2xhc3MgPSBudWxsOwotICAgICAgICAvLyBJZiB0aGlzIGlzIGEgSkFYLVdTIEhvbGRlciB0eXBlLCB0aGVuIGdldCB0aGUgYWN0dWFsIHR5cGUuICBOb3RlIHRoYXQgd2UgY2FuJ3QgdXNlIHRoZQotICAgICAgICAvLyBpc0hvbGRlclR5cGUgbWV0aG9kIHlldCBiZWNhdXNlIHRoZSBjbGFzcyB2YXJpYWJsZSBpdCBpcyBnb2luZyB0byBjaGVjayAocGFyYW1ldGVySG9sZGVyQWN0dWFsVHlwZSkKLSAgICAgICAgLy8gaGFzbid0IGJlZW4gaW5pdGlhbGl6ZWQgeWV0LgotICAgICAgICBpZiAocGFyYW1ldGVyR2VuZXJpY1R5cGUgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgIHBhcmFtZXRlckdlbmVyaWNUeXBlLmdldFJhd1R5cGUoKSA9PSBqYXZheC54bWwud3MuSG9sZGVyLmNsYXNzKSB7Ci0gICAgICAgICAgICAvLyBOT1RFCi0gICAgICAgICAgICAvLyBJZiB5b3UgY2hhbmdlIHRoaXMgY29kZSwgcGxlYXNlIHJlbWVtYmVyIHRvIGNoYW5nZSAKLSAgICAgICAgICAgIC8vIE9wZXJhdGlvbkRlc2MuZ2V0UmVzdWx0QWN0dWFsVHlwZQotCi0gICAgICAgICAgICBUeXBlIHR5cGUgPSBwYXJhbWV0ZXJHZW5lcmljVHlwZS5nZXRBY3R1YWxUeXBlQXJndW1lbnRzKClbMF07Ci0gICAgICAgICAgICBpZiAodHlwZSAhPSBudWxsICYmIFBhcmFtZXRlcml6ZWRUeXBlLmNsYXNzLmlzSW5zdGFuY2UodHlwZSkpIHsKLSAgICAgICAgICAgICAgICAvLyBGb3IgdHlwZXMgb2YgSG9sZGVyPEdlbmVyaWM8SyxWPj4sIHJldHVybiBjbGFzcyBhc3NvY2lhdGVkIHdpdGggR2VuZXJpYwotICAgICAgICAgICAgICAgIHJldHVybkNsYXNzID0gKENsYXNzKSgoUGFyYW1ldGVyaXplZFR5cGUpdHlwZSkuZ2V0UmF3VHlwZSgpOwotICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlICE9IG51bGwgJiYgR2VuZXJpY0FycmF5VHlwZS5jbGFzcy5pc0luc3RhbmNlKHR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgVHlwZSBjb21wb25lbnRUeXBlID0gKChHZW5lcmljQXJyYXlUeXBlKXR5cGUpLmdldEdlbmVyaWNDb21wb25lbnRUeXBlKCk7Ci0gICAgICAgICAgICAgICAgQ2xhc3MgYXJyYXlDbGFzcyA9IG51bGw7Ci0gICAgICAgICAgICAgICAgaWYgKFBhcmFtZXRlcml6ZWRUeXBlLmNsYXNzLmlzSW5zdGFuY2UoY29tcG9uZW50VHlwZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gRm9yIHR5cGVzIG9mIEhvbGRlcjxHZW5lcmljPEssVj5bXT4sIHJldHVybiBjbGFzcyBhc3NvY2lhdGVkIHdpdGggR2VuZXJpY1tdCi0gICAgICAgICAgICAgICAgICAgIGFycmF5Q2xhc3MgPSAoQ2xhc3MpKChQYXJhbWV0ZXJpemVkVHlwZSljb21wb25lbnRUeXBlKS5nZXRSYXdUeXBlKCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gRm9yIHR5cGVzIG9mIEhvbGRlcjxPYmplY3RbXT4sIHJldHVybiBjbGFzcyBhc3NvY2lhdGVkIHdpdGggT2JqZWN0W10KLSAgICAgICAgICAgICAgICAgICAgYXJyYXlDbGFzcyA9IChDbGFzcyljb21wb25lbnRUeXBlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBSRVZJRVc6IFRoaXMgb25seSB3b3JrcyBmb3IgYSBzaW5nbGUgZGltZW5zaW9uIGFycmF5ISAgTm90ZSB0aGF0IGlmIHRoaXMgbWV0aG9kIGlzIHJlbW92ZWQKLSAgICAgICAgICAgICAgICAvLyAgICAgICAgIHdoZW4gREJDIGlzIHVzZWQsIGp1c3QgbWFrZSBzdXJlIERCQyBzdXBwb3J0cyBtdWx0aS1kaW0gYXJyYXlzCi0gICAgICAgICAgICAgICAgcmV0dXJuQ2xhc3MgPSBBcnJheS5uZXdJbnN0YW5jZShhcnJheUNsYXNzLCAwKS5nZXRDbGFzcygpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBGb3IgdHlwZXMgb2YgSG9sZGVyPE9iamVjdD4sIHJldHVybiB0aGUgY2xhc3MgYXNzb2NpYXRlZCB3aXRoIE9iamVjdAotICAgICAgICAgICAgICAgIHJldHVybkNsYXNzID0gKENsYXNzKXR5cGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmV0dXJuQ2xhc3M7Ci0gICAgfQotCi0gICAgLyoqIEFuc3dlciB3aGV0aGVyIHRoaXMgUGFyYW1ldGVyRGVzY3JpcHRpb24gcmVwcmVzZW50cyBhIEpBWC1XUyBIb2xkZXI8VD4gdHlwZS4gKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0hvbGRlclR5cGUoKSB7Ci0gICAgICAgIC8vIElmIHRoaXMgaXMgYSBKQVgtV1MgSG9sZGVyPFQ+IHR5cGUsIHRoZW4gd2Ugc2V0IHRoZSB0aGUgY2xhc3Mgb2YgdGhlIGFjdHVhbAotICAgICAgICAvLyBwYXJhbWV0ZXIgPFQ+IGluIHRoZSBjb25zdHJ1Y3Rvci4gIE90aGVyd2lzZSwgdGhhdCBpcyBudWxsLgotICAgICAgICAvLyBIb2xkZXIgdHlwZXMgYXJlIGRlZmluZWQgYnkgSlNSLTIyNCBKQVgtV1MgMi4wLCBTZWMgMi4zLjMsIHBnIDE2Ci0gICAgICAgIGlmIChwYXJhbURlc2NDb21wb3NpdGUgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHBhcmFtRGVzY0NvbXBvc2l0ZS5pc0hvbGRlclR5cGUoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBIb2xkZXIuY2xhc3MuZXF1YWxzKGdldFBhcmFtZXRlclR5cGUoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgLy8gQU5OT1RBVElPTjogV2ViUGFyYW0KLSAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgcHVibGljIFdlYlBhcmFtIGdldEFubm9XZWJQYXJhbSgpIHsKLSAgICAgICAgcmV0dXJuIHdlYlBhcmFtQW5ub3RhdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhcmFtZXRlck5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBnZXRBbm5vV2ViUGFyYW1OYW1lKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBbm5vV2ViUGFyYW1OYW1lKCkgewotICAgICAgICBpZiAod2ViUGFyYW1OYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChnZXRBbm5vV2ViUGFyYW0oKSAhPSBudWxsICYmICFEZXNjcmlwdGlvblV0aWxzLmlzRW1wdHkoZ2V0QW5ub1dlYlBhcmFtKCkubmFtZSgpKSkgewotICAgICAgICAgICAgICAgIHdlYlBhcmFtTmFtZSA9IGdldEFubm9XZWJQYXJhbSgpLm5hbWUoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZ2V0T3BlcmF0aW9uRGVzY3JpcHRpb24oKS5nZXRTb2FwQmluZGluZ1N0eWxlKCkgPT0gU09BUEJpbmRpbmcuU3R5bGUuRE9DVU1FTlQKLSAgICAgICAgICAgICAgICAgICAgJiYgZ2V0T3BlcmF0aW9uRGVzY3JpcHRpb24oKS5nZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCkgPT0KLSAgICAgICAgICAgICAgICAgICAgU09BUEJpbmRpbmcuUGFyYW1ldGVyU3R5bGUuQkFSRSkgewotICAgICAgICAgICAgICAgIC8vIERlZmF1bCBwZXIgSlNSLTE4MSBNUiBTZWMgNC40LjEsIHBnIDE5Ci0gICAgICAgICAgICAgICAgLy8gVE9ETzogVmFsaWRhdGlvbjogRm9yIEJBUkUgcGFyYW1hdGVyVXNlLCBvbmx5IGEgc2luZ2xlIElOIG91ciBJTk9VVCBwYXJhbWF0ZXIgYW5kIGEgc2luZ2xlIG91dHB1dCAoZWl0aGVyIHJldHVybiBvciBPVVQgb3IgSU5PVVQpIGlzIGFsbG93ZWQKLSAgICAgICAgICAgICAgICAvLyAgICAgICBQZXIgSlNSLTIyNCwgU2VjIDMuNi4yLjIsIHBnIDM3Ci0gICAgICAgICAgICAgICAgd2ViUGFyYW1OYW1lID0gZ2V0T3BlcmF0aW9uRGVzY3JpcHRpb24oKS5nZXRPcGVyYXRpb25OYW1lKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIERlZmF1bHQgcGVyIEpTUi0xODEgTVIgU2VjIDQuNC4xLCBwZyAyMAotICAgICAgICAgICAgICAgIC8vIFJldHVybiAiYXJnTiIgd2hlcmUgTiBpcyB0aGUgaW5kZXggb2YgdGhlIHBhcmFtZXRlciBpbiB0aGUgbWV0aG9kIHNpZ25hdHVyZQotICAgICAgICAgICAgICAgIHdlYlBhcmFtTmFtZSA9ICJhcmciICsgcGFyYW1ldGVyTnVtYmVyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB3ZWJQYXJhbU5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQYXJ0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGdldEFubm9XZWJQYXJhbVBhcnROYW1lKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBbm5vV2ViUGFyYW1QYXJ0TmFtZSgpIHsKLSAgICAgICAgaWYgKHdlYlBhcmFtUGFydE5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGdldEFubm9XZWJQYXJhbSgpICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAgICAgIURlc2NyaXB0aW9uVXRpbHMuaXNFbXB0eShnZXRBbm5vV2ViUGFyYW0oKS5wYXJ0TmFtZSgpKSkgewotICAgICAgICAgICAgICAgIHdlYlBhcmFtUGFydE5hbWUgPSBnZXRBbm5vV2ViUGFyYW0oKS5wYXJ0TmFtZSgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBEZWZhdWx0IHBlciBKU1ItMTgxIE1SIFNlYyA0LjQuMSwgcGcgMjAKLSAgICAgICAgICAgICAgICB3ZWJQYXJhbVBhcnROYW1lID0gZ2V0QW5ub1dlYlBhcmFtTmFtZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB3ZWJQYXJhbVBhcnROYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0TmFtZXNwYWNlKCkgewotICAgICAgICByZXR1cm4gZ2V0QW5ub1dlYlBhcmFtVGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBbm5vV2ViUGFyYW1UYXJnZXROYW1lc3BhY2UoKSB7Ci0gICAgICAgIGlmICh3ZWJQYXJhbVRhcmdldE5hbWVzcGFjZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoZ2V0QW5ub1dlYlBhcmFtKCkgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgICAgICAhRGVzY3JpcHRpb25VdGlscy5pc0VtcHR5KGdldEFubm9XZWJQYXJhbSgpLnRhcmdldE5hbWVzcGFjZSgpKSkgewotICAgICAgICAgICAgICAgIHdlYlBhcmFtVGFyZ2V0TmFtZXNwYWNlID0gZ2V0QW5ub1dlYlBhcmFtKCkudGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGdldE9wZXJhdGlvbkRlc2NyaXB0aW9uKCkuZ2V0U29hcEJpbmRpbmdTdHlsZSgpID09IFNPQVBCaW5kaW5nLlN0eWxlLkRPQ1VNRU5UCi0gICAgICAgICAgICAgICAgICAgICYmIGdldE9wZXJhdGlvbkRlc2NyaXB0aW9uKCkuZ2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpID09Ci0gICAgICAgICAgICAgICAgICAgIFNPQVBCaW5kaW5nLlBhcmFtZXRlclN0eWxlLldSQVBQRUQKLSAgICAgICAgICAgICAgICAgICAgJiYgIWdldEFubm9XZWJQYXJhbUhlYWRlcigpKSB7Ci0gICAgICAgICAgICAgICAgLy8gRGVmYXVsIHBlciBKU1ItMTgxIE1SIFNlYyA0LjQuMSwgcGcgMjAKLSAgICAgICAgICAgICAgICB3ZWJQYXJhbVRhcmdldE5hbWVzcGFjZSA9IFdlYlBhcmFtX1RhcmdldE5hbWVzcGFjZV9ERUZBVUxUOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBEZWZhdWx0IHBlciBKU1ItMTgxIE1SIFNlYyA0LjQuMSwgcGcgMjAKLSAgICAgICAgICAgICAgICB3ZWJQYXJhbVRhcmdldE5hbWVzcGFjZSA9ICgoRW5kcG9pbnREZXNjcmlwdGlvbkphdmEpZ2V0T3BlcmF0aW9uRGVzY3JpcHRpb24oKQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24oKS5nZXRFbmRwb2ludERlc2NyaXB0aW9uKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0QW5ub1dlYlNlcnZpY2VUYXJnZXROYW1lc3BhY2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gd2ViUGFyYW1UYXJnZXROYW1lc3BhY2U7Ci0gICAgfQotCi0vLyAgICBwdWJsaWMgTW9kZSBnZXRNb2RlKCkgewotCi0gICAgcHVibGljIFdlYlBhcmFtLk1vZGUgZ2V0TW9kZSgpIHsKLSAgICAgICAgcmV0dXJuIGdldEFubm9XZWJQYXJhbU1vZGUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgV2ViUGFyYW0uTW9kZSBnZXRBbm5vV2ViUGFyYW1Nb2RlKCkgewotICAgICAgICBpZiAod2ViUGFyYW1Nb2RlID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIEludGVyZXN0aW5nIGNvbnVuZHJ1bSBoZXJlOgotICAgICAgICAgICAgLy8gQmVjYXVzZSBXZWJQYXJhbS5tb2RlIGhhcyBhIGRlZmF1bHQgdmFsdWUsIGl0IHdpbGwgYWx3YXlzIHJldHVybiBzb21ldGhpbmcgaWYgdGhlCi0gICAgICAgICAgICAvLyBhbm5vdGF0aW9uIGlzIHByZXNlbnQuICBUaGF0IHZhbHVlIGlzIGN1cnJlbnRseSBNb2RlLklOLiAgSG93ZXZlciwgdGhhdCBkZWZhdWx0IGlzIG9ubHkKLSAgICAgICAgICAgIC8vIGNvcnJlY3QgZm9yIGEgbm9uLUhvbGRlciBUeXBlOyB0aGUgY29ycmVjdCBkZWZhdWx0IGZvciBhIEhvbGRlciBUeXBlIGlzIE1vZGUuSU5PVVQuICBGdXJ0aGVybW9yZSwKLSAgICAgICAgICAgIC8vIHRoZXJlJ3Mgbm8gd2F5IChJIGNhbiB0ZWxsKSB0byBkaWZmZXJlbnRpYXRlIGlmIHRoZSBzZXR0aW5nIGZvciBtb2RlKCkgd2FzIHNwZWNpZmllZCBvciBkZWZhdWx0ZWQsCi0gICAgICAgICAgICAvLyBzbyB0aGVyZSdzIG5vIHdheSB0byB0ZWxsIGlmIHRoZSB2YWx1ZSBpcyBkZWZhdWx0ZWQgdG8gSU4gb3IgZXhwbGljaXRseSBzcGVjaWZpZWQgSU4gYnkgdGhlIGFubm90YXRpb24uCi0gICAgICAgICAgICAvLyBUaGUgY29udW5kcnVtIGlzOiBEbyB3ZSByZXR1cm4gdGhlIHZhbHVlIGZyb20gdGhlIGFubm90YXRpb24sIG9yIGRvIHdlIHJldHVybiB0aGUgZGVmYXVsdCB2YWx1ZSBiYXNlZCBvbiB0aGUKLSAgICAgICAgICAgIC8vIHR5cGUuICBGb3Igbm93LCBmb3IgYSBIb2xkZXIgdHlwZSB0aGF0IGhhcyBhIHZhbHVlIG9mIElOLCB3ZSByZXNldCB0aGUgdmFsdWUgdG8gSU5PVVQuCi0gICAgICAgICAgICAvLyBUaGF0IG1lYW5zIGV2ZW4gaWYgV2ViUGFyYW0ubW9kZT1JTiB3YXMgZXhwbGljaXRseSBzZXQsIGl0IHdpbGwgYmUgb3ZlcnJpZGRlbiB0byBJTk9VVC4KLSAgICAgICAgICAgIC8vIFRoZSBkZWZhdWx0IHZhbHVlcyBhcmUgZnJvbSBKU1ItMTgxIE1SIFNlYyA0LjQuMSwgcGcgMjAKLQotICAgICAgICAgICAgLy8gVW5saWtlIGEgU3RyaW5nIHZhbHVlLCBpZiB0aGUgYW5ub3RhdGlvbiBpcyBwcmVzZW50LCBpdCB3aWxsIHJldHVybiBhIHVzYWJsZSBkZWZhdWx0IHZhbHVlIGFzIGRlZmluZWQgYnkgCi0gICAgICAgICAgICAvLyB0aGUgQW5ub3RhdGlvbi4gIFRoYXQgaXMgY3VycmVudGx5IE1vZGUuSU4KLSAgICAgICAgICAgIGlmIChnZXRBbm5vV2ViUGFyYW0oKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgd2ViUGFyYW1Nb2RlID0gZ2V0QW5ub1dlYlBhcmFtKCkubW9kZSgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB3ZWJQYXJhbU1vZGUgPSBXZWJQYXJhbS5Nb2RlLklOOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoaXNIb2xkZXJUeXBlKCkgJiYgd2ViUGFyYW1Nb2RlID09IFdlYlBhcmFtLk1vZGUuSU4pIHsKLSAgICAgICAgICAgICAgICAvLyBEZWZhdWx0IHBlciBKU1ItMTgxIE1SIFNlYyA0LjQuMSwgcGcgMjAKLSAgICAgICAgICAgICAgICB3ZWJQYXJhbU1vZGUgPSBXZWJQYXJhbS5Nb2RlLklOT1VUOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB3ZWJQYXJhbU1vZGU7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNIZWFkZXIoKSB7Ci0gICAgICAgIHJldHVybiBnZXRBbm5vV2ViUGFyYW1IZWFkZXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRBbm5vV2ViUGFyYW1IZWFkZXIoKSB7Ci0gICAgICAgIGlmICh3ZWJQYXJhbUhlYWRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBVbmxpa2UgYSBTdHJpbmcgdmFsdWUsIGlmIHRoZSBhbm5vdGF0aW9uIGlzIHByZXNlbnQsIGl0IHdpbGwgcmV0dXJuIGEgdXNhYmxlIGRlZmF1bHQgdmFsdWUuCi0gICAgICAgICAgICBpZiAoZ2V0QW5ub1dlYlBhcmFtKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHdlYlBhcmFtSGVhZGVyID0gZ2V0QW5ub1dlYlBhcmFtKCkuaGVhZGVyKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHdlYlBhcmFtSGVhZGVyID0gV2ViUGFyYW1fSGVhZGVyX0RFRkFVTFQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHdlYlBhcmFtSGVhZGVyLmJvb2xlYW5WYWx1ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBuZXdsaW5lID0gIlxuIjsKLSAgICAgICAgZmluYWwgU3RyaW5nIHNhbWVsaW5lID0gIjsgIjsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHN0cmluZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQoc3VwZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICBzdHJpbmcuYXBwZW5kKG5ld2xpbmUpOwotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZCgiTmFtZTogIiArIGdldFBhcmFtZXRlck5hbWUoKSk7Ci0gICAgICAgICAgICAvLwotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZChuZXdsaW5lKTsKLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQoIklzIGhlYWRlcjogIiArIChpc0hlYWRlcigpID09IHRydWUpKTsKLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQoc2FtZWxpbmUpOwotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZCgiSXMgaG9sZGVyOiAiICsgKGlzSG9sZGVyVHlwZSgpID09IHRydWUpKTsKLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICBzdHJpbmcuYXBwZW5kKG5ld2xpbmUpOwotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZCgiTW9kZTogIiArIGdldE1vZGUoKSk7Ci0gICAgICAgICAgICAvLwotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZChuZXdsaW5lKTsKLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQoIlR5cGU6ICIgKyBnZXRQYXJhbWV0ZXJUeXBlKCkpOwotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZChzYW1lbGluZSk7Ci0gICAgICAgICAgICBzdHJpbmcuYXBwZW5kKCJBY3R1YWwgdHlwZTogIiArIGdldFBhcmFtZXRlckFjdHVhbFR5cGUoKSk7Ci0gICAgICAgICAgICBpZiAoZ2V0QXR0YWNobWVudERlc2NyaXB0aW9uKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHN0cmluZy5hcHBlbmQobmV3bGluZSk7Ci0gICAgICAgICAgICAgICAgc3RyaW5nLmFwcGVuZChnZXRBdHRhY2htZW50RGVzY3JpcHRpb24oKS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQobmV3bGluZSk7Ci0gICAgICAgICAgICBzdHJpbmcuYXBwZW5kKCJDb21wbGV0ZSBkZWJ1ZyBpbmZvcm1hdGlvbiBub3QgY3VycmVudGx5IGF2YWlsYWJsZSBmb3IgIiArCi0gICAgICAgICAgICAgICAgICAgICJQYXJhbWV0ZXJEZXNjcmlwdGlvbiIpOwotICAgICAgICAgICAgcmV0dXJuIHN0cmluZy50b1N0cmluZygpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdHJpbmcudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0xpc3RUeXBlKCkgewotICAgIAlyZXR1cm4gaXNMaXN0VHlwZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogSGVscGVyIG1ldGhvZCB0byBnZXQgdG8gcGFyZW50IGltcGwgb2JqZWN0LgotICAgICAqLwotICAgIHByaXZhdGUgT3BlcmF0aW9uRGVzY3JpcHRpb25JbXBsIGdldE9wZXJhdGlvbkRlc2NyaXB0aW9uSW1wbCgpIHsKLSAgICAgICAgaWYodGhpcy5nZXRPcGVyYXRpb25EZXNjcmlwdGlvbigpIGluc3RhbmNlb2YgT3BlcmF0aW9uRGVzY3JpcHRpb25JbXBsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChPcGVyYXRpb25EZXNjcmlwdGlvbkltcGwpIHRoaXMuZ2V0T3BlcmF0aW9uRGVzY3JpcHRpb24oKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gYW4gQXR0YWNobWVudERlc2NyaXB0aW9uIGJhc2VkIG9uIHRoZSBwYXJ0IG5hbWUgb2YgdGhlIHBhcmFtZXRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgQXR0YWNobWVudERlc2NyaXB0aW9uIGdldEF0dGFjaG1lbnREZXNjcmlwdGlvbigpIHsKLSAgICAgICAgU3RyaW5nIHBhcnROYW1lID0gdGhpcy5nZXRQYXJ0TmFtZSgpOwotICAgICAgICBpZihwYXJ0TmFtZSAhPSBudWxsICYmIGdldE9wZXJhdGlvbkRlc2NyaXB0aW9uSW1wbCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJSZXR1cm5pbmcgcGFyYW1ldGVyIEF0dGFjaG1lbnREZXNjcmlwdGlvbiBmb3IgcGFydE5hbWU6ICIgKyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydE5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGdldE9wZXJhdGlvbkRlc2NyaXB0aW9uSW1wbCgpLmdldFBhcnRBdHRhY2htZW50RGVzY3JpcHRpb24ocGFydE5hbWUpOwotICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgaWYobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiRGlkIG5vdCBmaW5kIHBhcmFtZXRlciBBdHRhY2htZW50RGVzY3JpcHRpb24gZm9yIHBhcnROYW1lOiAiICsgcGFydE5hbWUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2ltcGwvUG9ydEluZm9JbXBsLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9pbXBsL1BvcnRJbmZvSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODUyMDc3Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2ltcGwvUG9ydEluZm9JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uaW1wbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuRXhjZXB0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmkxOG4uTWVzc2FnZXM7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLlBvcnRJbmZvOwotCi1wdWJsaWMgY2xhc3MgUG9ydEluZm9JbXBsIGltcGxlbWVudHMgUG9ydEluZm8gewotICAgIHByaXZhdGUgUU5hbWUgc2VydmljZU5hbWUgPSBudWxsOwotICAgIHByaXZhdGUgUU5hbWUgcG9ydE5hbWUgPSBudWxsOwotICAgIHByaXZhdGUgU3RyaW5nIGJpbmRpbmdJZCA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gc2VydmljZU5hbWUKLSAgICAgKiBAcGFyYW0gcG9ydE5hbWUKLSAgICAgKiBAcGFyYW0gYmluZGluZ0lkCi0gICAgICovCi0gICAgUG9ydEluZm9JbXBsKFFOYW1lIHNlcnZpY2VOYW1lLCBRTmFtZSBwb3J0TmFtZSwgU3RyaW5nIGJpbmRpbmdJZCkgewotICAgICAgICBzdXBlcigpOwotICAgICAgICBpZiAoc2VydmljZU5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeQotICAgICAgICAgICAgICAgICAgICAubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgicG9ydEluZm9FcnIwIiwgIjxudWxsPiIpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocG9ydE5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeQotICAgICAgICAgICAgICAgICAgICAubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgicG9ydEluZm9FcnIxIiwgIjxudWxsPiIpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYmluZGluZ0lkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkKLSAgICAgICAgICAgICAgICAgICAgLm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoInBvcnRJbmZvRXJyMiIsICI8bnVsbD4iKSk7Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy5zZXJ2aWNlTmFtZSA9IHNlcnZpY2VOYW1lOwotICAgICAgICB0aGlzLnBvcnROYW1lID0gcG9ydE5hbWU7Ci0gICAgICAgIHRoaXMuYmluZGluZ0lkID0gYmluZGluZ0lkOwotICAgIH0KLQotICAgIHB1YmxpYyBRTmFtZSBnZXRTZXJ2aWNlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHNlcnZpY2VOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBRTmFtZSBnZXRQb3J0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHBvcnROYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QmluZGluZ0lEKCkgewotICAgICAgICByZXR1cm4gYmluZGluZ0lkOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2ltcGwvUmVzb2x2ZWRIYW5kbGVyc0Rlc2NyaXB0aW9uSW1wbC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vaW1wbC9SZXNvbHZlZEhhbmRsZXJzRGVzY3JpcHRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzYTJkZWEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vaW1wbC9SZXNvbHZlZEhhbmRsZXJzRGVzY3JpcHRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKiANCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqICAgICAgDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5pbXBsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLlJlc29sdmVkSGFuZGxlcnNEZXNjcmlwdGlvbjsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotLyoqDQotICogSW1wbGVtZW50YXRpb24gb2YgdGhlIFJlc29sdmVkSGFuZGxlcnNEZXNjcmlwdGlvbiBpbnRlcmZhY2UgDQotICovDQotcHVibGljIGNsYXNzIFJlc29sdmVkSGFuZGxlcnNEZXNjcmlwdGlvbkltcGwgaW1wbGVtZW50cyBSZXNvbHZlZEhhbmRsZXJzRGVzY3JpcHRpb24gew0KLSAgICBwcml2YXRlIExpc3Q8Q2xhc3M+IGhhbmRsZXJDbGFzc2VzOw0KLSAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiByb2xlczsgDQotDQotICAgIC8qIChub24tSmF2YWRvYykNCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLlJlc29sdmVkSGFuZGxlcnNEZXNjcmlwdGlvbiNhZGRIYW5kbGVyQ2xhc3MoamF2YS5sYW5nLkNsYXNzKQ0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgc2V0SGFuZGxlckNsYXNzZXMoTGlzdDxDbGFzcz4gaGFuZGxlckNsYXNzZXMpIHsNCi0gICAgICAgIHRoaXMuaGFuZGxlckNsYXNzZXMgPSBoYW5kbGVyQ2xhc3NlczsNCi0gICAgfQ0KLQ0KLSAgICAvKiAobm9uLUphdmFkb2MpDQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5SZXNvbHZlZEhhbmRsZXJzRGVzY3JpcHRpb24jYWRkUm9sZShqYXZhLmxhbmcuU3RyaW5nKQ0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgc2V0Um9sZXMoTGlzdDxTdHJpbmc+IHJvbGVzKSB7DQotICAgICAgICB0aGlzLnJvbGVzID0gcm9sZXM7DQotICAgIH0NCi0NCi0gICAgLyogKG5vbi1KYXZhZG9jKQ0KLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uUmVzb2x2ZWRIYW5kbGVyc0Rlc2NyaXB0aW9uI2dldEhhbmRsZXJDbGFzc2VzKCkNCi0gICAgICovDQotICAgIHB1YmxpYyBMaXN0PENsYXNzPiBnZXRIYW5kbGVyQ2xhc3NlcygpIHsNCi0gICAgICAgIHJldHVybiB0aGlzLmhhbmRsZXJDbGFzc2VzOw0KLSAgICB9DQotDQotICAgIC8qIChub24tSmF2YWRvYykNCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLlJlc29sdmVkSGFuZGxlcnNEZXNjcmlwdGlvbiNnZXRSb2xlcygpDQotICAgICAqLw0KLSAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldFJvbGVzKCkgew0KLSAgICAgICAgcmV0dXJuIHRoaXMucm9sZXM7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vaW1wbC9TZXJ2aWNlRGVzY3JpcHRpb25JbXBsLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9pbXBsL1NlcnZpY2VEZXNjcmlwdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FiZWIzYS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9pbXBsL1NlcnZpY2VEZXNjcmlwdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NTEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmltcGw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5TZXJ2aWNlQ2xpZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuQ2xpZW50Q29uZmlndXJhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5FeGNlcHRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY2F0YWxvZy5KQVhXU0NhdGFsb2dNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY2F0YWxvZy5pbXBsLk9BU0lTQ2F0YWxvZ01hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5EZXNjcmlwdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5FbmRwb2ludERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLlJlc29sdmVkSGFuZGxlcnNEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLlNlcnZpY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLlNlcnZpY2VEZXNjcmlwdGlvbkphdmE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5TZXJ2aWNlRGVzY3JpcHRpb25XU0RMOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5NRFFDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLlBvcnRDb21wb3NpdGU7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLk1EUUNvbnN0YW50cy5SRVRVUk5fVFlQRV9GVVRVUkU7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5NRFFDb25zdGFudHMuUkVUVVJOX1RZUEVfUkVTUE9OU0U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLk1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5QYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLnhtbC5oYW5kbGVyLkhhbmRsZXJDaGFpbnNUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaTE4bi5NZXNzYWdlczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnV0aWwuV1NETDRKV3JhcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnV0aWwuV1NETFdyYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0NvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWwucmVzb2x2ZXIuQ2F0YWxvZzsKLQotaW1wb3J0IGphdmF4Lmp3cy5IYW5kbGVyQ2hhaW47Ci1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuUG9ydDsKLWltcG9ydCBqYXZheC53c2RsLlBvcnRUeXBlOwotaW1wb3J0IGphdmF4LndzZGwuU2VydmljZTsKLWltcG9ydCBqYXZheC53c2RsLldTRExFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VDbGllbnQ7Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuUG9ydEluZm87Ci1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuU09BUEJpbmRpbmc7Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZi5Tb2Z0UmVmZXJlbmNlOwotaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKLWltcG9ydCBqYXZhLm5ldC5Db25uZWN0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5Vbmtub3duSG9zdEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb247Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLldlYWtIYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRIYXNoTWFwOwotCi0KLS8qKiBAc2VlIC4uL1NlcnZpY2VEZXNjcmlwdGlvbiAqLwotY2xhc3MgU2VydmljZURlc2NyaXB0aW9uSW1wbAotICAgICAgICBpbXBsZW1lbnRzIFNlcnZpY2VEZXNjcmlwdGlvbiwgU2VydmljZURlc2NyaXB0aW9uV1NETCwgU2VydmljZURlc2NyaXB0aW9uSmF2YSB7Ci0gICAgcHJpdmF0ZSBDbGllbnRDb25maWd1cmF0aW9uRmFjdG9yeSBjbGllbnRDb25maWdGYWN0b3J5OwotICAgIHByaXZhdGUgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ29udGV4dDsKLQotICAgIC8vIE51bWJlciBvZiB0aW1lcyB0aGlzIGluc3RhbmNlIGlzIGJlaW5nIHVzZWQuICBGb3Igc2VydmljZS1wcm92aWRlcnMsIHRoaXMgaXMgbm90IGRlY3JlbWVudGVkCi0gICAgLy8gc2luY2UgdGhlIHNlcmljZSBpc24ndCB1bi11c2VkIG9uY2UgaXQgaXMgY3JlYXRlZC4gIEZvciBzZXJ2aWNlLXJlcXVlc3RlcnMsIHRoZSBzZXJ2aWNlCi0gICAgLy8gaXMgdXNlZCBieSBTZXJ2aWNlRGVsZWdhdGVzLCBhbmQgYmVjb21lcyB1bi11c2VkIHdoZW4gdGhlIFNlcnZpY2VEZWxlZ2F0ZSBpcyByZWxlYXNlZC4KLSAgICBwcml2YXRlIGludCB1c2VDb3VudCA9IDA7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgd3NkbFVSTDsKLSAgICBwcml2YXRlIFFOYW1lIHNlcnZpY2VRTmFtZTsKLQotICAgIHByaXZhdGUgV1NETFdyYXBwZXIgd3NkbFdyYXBwZXI7Ci0gICAgcHJpdmF0ZSBXU0RMV3JhcHBlciBnZW5lcmF0ZWRXc2RsV3JhcHBlcjsKLSAgICAKLSAgICAvL0FOTk9UQVRJT046IEBIYW5kbGVyQ2hhaW4KLSAgICBwcml2YXRlIEhhbmRsZXJDaGFpbiBoYW5kbGVyQ2hhaW5Bbm5vdGF0aW9uOwotICAgIHByaXZhdGUgSGFuZGxlckNoYWluc1R5cGUgaGFuZGxlckNoYWluc1R5cGU7Ci0KLSAgICAvLyBFbmRwb2ludERlc2NyaXB0aW9ucyBmcm9tIGFubm90YXRpb25zIGFuZCB3c2RsCi0gICAgcHJpdmF0ZSBNYXA8UU5hbWUsIEVuZHBvaW50RGVzY3JpcHRpb24+IGRlZmluZWRFbmRwb2ludERlc2NyaXB0aW9ucyA9Ci0gICAgICAgICAgICAgICAgbmV3IEhhc2hNYXA8UU5hbWUsIEVuZHBvaW50RGVzY3JpcHRpb24+KCk7Ci0KLSAgICAvLyBFbmRwb2ludHMgZm9yIGR5bmFtaWMgcG9ydHMKLSAgICAvLyBUaGlzIG5lZWRzIHRvIGJlIGEgc3Ryb25nIHJlZmVyZW5jZSAobm90IFdlYWsgb3IgU29mdCkgc28gdGhhdCB0aGUgcmVzb3VyY2UgcmVsZWFzZSBsb2dpYwotICAgIC8vIGluIHRoZSBmaW5hbGl6ZXIgc3RpbGwgaGFzIGEgcmVmZXJlbmNlIHRvIHRoZSBFbmRwb2ludERlc2NyaXB0aW9ucyBzbyB0aGV5IGNhbiBiZQotICAgIC8vIHJlbGVhc2VkLiAgT3RoZXJ3aXNlLCB0aGlzIGNvbGxlY3Rpb24gd2lsbCBiZSBudWxsIHdoZW4gdGhlIGZpbmFsaXplciBpcyBjYWxsZWQuCi0gICAgcHJpdmF0ZSBNYXA8T2JqZWN0LCBNYXA8UU5hbWUsIEVuZHBvaW50RGVzY3JpcHRpb25JbXBsPj4gZHluYW1pY0VuZHBvaW50RGVzY3JpcHRpb25zID0KLSAgICAgICAgICAgICAgICBuZXcgSGFzaE1hcDxPYmplY3QsIE1hcDxRTmFtZSwgRW5kcG9pbnREZXNjcmlwdGlvbkltcGw+PigpOwotCi0gICAgLy8gQ2FjaGUgY2xhc3NlcyBmb3IgdGhlIGluZm8gZm9yIHJlc29sdmVkIGhhbmRsZXJzCi0gICAgcHJpdmF0ZSBTb2Z0UmVmZXJlbmNlPE1hcDxQb3J0SW5mbywgUmVzb2x2ZWRIYW5kbGVyc0Rlc2NyaXB0aW9uPj4gcmVzb2x2ZWRIYW5kbGVyc0Rlc2NyaXB0aW9uID0KLSAgICAgICAgICAgIG5ldyBTb2Z0UmVmZXJlbmNlPE1hcDxQb3J0SW5mbywgUmVzb2x2ZWRIYW5kbGVyc0Rlc2NyaXB0aW9uPj4KLSAgICAgICAgKG5ldyBDb25jdXJyZW50SGFzaE1hcDxQb3J0SW5mbywgUmVzb2x2ZWRIYW5kbGVyc0Rlc2NyaXB0aW9uPigpKTsKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coU2VydmljZURlc2NyaXB0aW9uSW1wbC5jbGFzcyk7Ci0KLSAgICBwcml2YXRlIEhhc2hNYXA8U3RyaW5nLCBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGU+IGRiY01hcCA9IG51bGw7Ci0KLSAgICBwcml2YXRlIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBjb21wb3NpdGUgPSBudWxsOwotICAgIHByaXZhdGUgYm9vbGVhbiBpc1NlcnZlclNpZGUgPSBmYWxzZTsKLQotICAgIC8vIEFsbG93IGEgdW5pcXVlIFhNTCBDYXRhbG9nTWFuYWdlciBwZXIgc2VydmljZSBkZXNjcmlwdGlvbi4KLSAgICBwcml2YXRlIEpBWFdTQ2F0YWxvZ01hbmFnZXIgY2F0YWxvZ01hbmFnZXIgPSBudWxsOwotICAgIAotICAgIC8vIFJVTlRJTUUgSU5GT1JNQVRJT04KLSAgICBNYXA8U3RyaW5nLCBTZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uPiBydW50aW1lRGVzY01hcCA9Ci0gICAgICAgICAgICBuZXcgQ29uY3VycmVudEhhc2hNYXA8U3RyaW5nLCBTZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uPigpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKQVhXU19EWU5BTUlDX0VORFBPSU5UUyA9ICJqYXh3cy5keW5hbWljLmVuZHBvaW50cyI7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBzZXJ2aWNlLXJlcXVlc3RlciBzaWRlIChha2EgY2xpZW50LXNpZGUpIHNlcnZpY2UgZGVzY3JpcHRpb24uCi0gICAgICogQ29uc3RydWN0IGEgc2VydmljZSBkZXNjcmlwdGlvbiBoaWVyYWNoeQotICAgICAqIGJhc2VkIG9uIFdTREwgKG1heSBiZSBudWxsKSwgdGhlIFNlcnZpY2UgY2xhc3MsIGFuZCBhIHNlcnZpY2UgUU5hbWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gd3NkbFVSTCAgICAgIFRoZSBXU0RMIGZpbGUgKHRoaXMgbWF5IGJlIG51bGwpLgotICAgICAqIEBwYXJhbSBzZXJ2aWNlUU5hbWUgVGhlIG5hbWUgb2YgdGhlIHNlcnZpY2UgaW4gdGhlIFdTREwuICBUaGlzIGNhbiBub3QgYmUgbnVsbCBzaW5jZSBhCi0gICAgICogICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwud3MuU2VydmljZSBjYW4gbm90IGJlIGNyZWF0ZWQgd2l0aCBhIG51bGwgc2VydmljZSBRTmFtZS4KLSAgICAgKiBAcGFyYW0gc2VydmljZUNsYXNzIFRoZSBKQVgtV1Mgc2VydmljZSBjbGFzcy4gIFRoaXMgY291bGQgYmUgYW4gaW5zdGFuY2Ugb2YKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC53cy5TZXJ2aWNlIG9yIGEgZ2VuZXJhdGVkIHNlcnZpY2Ugc3ViY2xhc3MgdGhlcmVvZi4gIFRoaXMgd2lsbAotICAgICAqICAgICAgICAgICAgICAgICAgICAgbm90IGJlIG51bGwuCi0gICAgICovCi0gICAgU2VydmljZURlc2NyaXB0aW9uSW1wbChVUkwgd3NkbFVSTCwgUU5hbWUgc2VydmljZVFOYW1lLCBDbGFzcyBzZXJ2aWNlQ2xhc3MpIHsKLSAgICAgICAgdGhpcyh3c2RsVVJMLCBzZXJ2aWNlUU5hbWUsIHNlcnZpY2VDbGFzcywgbnVsbCwgbnVsbCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIHNlcnZpY2UtcmVxdWVzdGVyIHNpZGUgc2VydmljZSBkZXNjcmlwdGlvbi4gIFNhbWUgYXMgY29uc3RydWN0b3IgYWJvdmUgd2l0aCBhbiAKLSAgICAgKiBhZGRpdG9uYWwgY29tcG9zaXRlIHBhcmFtYXRlci4gIE5vdGUgdGhhdCB0aGUgY29tcG9zaXRlIGlzICJzcGFyc2UiIGluIHRoYXQgYW55IHZhbHVlcyBpdAotICAgICAqIGNvbnRhaW5zIG92ZXJyaWRlcyBhbnkgdmFsdWVzIG9uIHRoZSBjb3JyZXNwb25kaW5nIGNsYXNzIGFubm90YXRpb24gSE9XRVZFUiBpZiB0aGUgY29tcG9zaXRlCi0gICAgICogZG9lc24ndCBzcGVjaWZ5IGEgdmFsdWUsIGl0IGlzIGdvdHRlbiBmcm9tIHRoZSBjbGFzcyBhbm5vdGF0aW9uLiAKLSAgICAgKiBAcGFyYW0gd3NkbFVSTAotICAgICAqIEBwYXJhbSBzZXJ2aWNlUU5hbWUKLSAgICAgKiBAcGFyYW0gc2VydmljZUNsYXNzCi0gICAgICogQHBhcmFtIHNwYXJzZUNvbXBvc2l0ZSBhIGNvbXBvc2l0ZSB3aXRoIGFueSBhbm5vdGF0aW9uIG92ZXJyaWRlcyBzdWNoIGFzIGZyb20gYSBjbGllbnQgZGVwbG95bWVudAotICAgICAqICAgICBkZXNjcmlwdG9yLiAgQ0FOIE5PVCBCRSBOVUxMLCBidXQgaXQgY2FuIGJlIGFuIG9iamVjdCBjcmVhdGVkIHdpdGggYSBkZWZhdWx0IGNvbnN0cnVjdG9yCi0gICAgICovCi0gICAgU2VydmljZURlc2NyaXB0aW9uSW1wbChVUkwgd3NkbFVSTCwgUU5hbWUgc2VydmljZVFOYW1lLCBDbGFzcyBzZXJ2aWNlQ2xhc3MsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIHNwYXJzZUNvbXBvc2l0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBzcGFyc2VDb21wb3NpdGVLZXkpIHsKLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIlNlcnZpY2VEZXNjcmlwdGlvbkltcGwoVVJMLFFOYW1lLENsYXNzLERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSxPYmplY3QpIik7Ci0gICAgICAgIH0KLSAgICAJCi0gICAgCWlmIChzcGFyc2VDb21wb3NpdGUgIT0gbnVsbCkgewotICAgIAkgICAgY2F0YWxvZ01hbmFnZXIgPSBzcGFyc2VDb21wb3NpdGUuZ2V0Q2F0YWxvZ01hbmFnZXIoKTsKLSAgICAgICAgfQotICAgIAlpZiAoY2F0YWxvZ01hbmFnZXIgPT0gbnVsbCkgewotICAgIAkJY2F0YWxvZ01hbmFnZXIgPSBuZXcgT0FTSVNDYXRhbG9nTWFuYWdlcigpOwotICAgICAgICB9Ci0gICAgCQotICAgICAgICBpZiAoc2VydmljZVFOYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgic2VydmljZURlc2NFcnIwIikpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzZXJ2aWNlQ2xhc3MgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeQotICAgICAgICAgICAgICAgICAgICAubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgic2VydmljZURlc2NFcnIxIiwgIm51bGwiKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFqYXZheC54bWwud3MuU2VydmljZS5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHNlcnZpY2VDbGFzcykpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoInNlcnZpY2VEZXNjRXJyMSIsIHNlcnZpY2VDbGFzcy5nZXROYW1lKCkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGNvbXBvc2l0ZSA9IG5ldyBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUoKTsKLSAgICAgICAgY29tcG9zaXRlLnNldElzU2VydmljZVByb3ZpZGVyKGZhbHNlKTsKLSAgICAgICAgY29tcG9zaXRlLnNldENvcnJlc3BvbmRpbmdDbGFzcyhzZXJ2aWNlQ2xhc3MpOwotICAgICAgICAvLyBUaGUgY2xhc3Nsb2FkZXIgd2FzIG9yaWdpbmFsbHkgZ290dGVuIG9mZiB0aGlzIGNsYXNzLCBidXQgaXQgc2VlbXMgbW9yZSBsb2dpY2FsIHRvIAotICAgICAgICAvLyBnZXQgaXQgb2ZmIHRoZSBhcHBsaWNhdGlvbiBzZXJ2aWNlIGNsYXNzLgotLy8gICAgICAgIGNvbXBvc2l0ZS5zZXRDbGFzc0xvYWRlcih0aGlzLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSk7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRDbGFzc0xvYWRlcihnZXRDbGFzc0xvYWRlcihzZXJ2aWNlQ2xhc3MpKTsKLSAgICAgICAgY29tcG9zaXRlLnNldFNwYXJzZUNvbXBvc2l0ZShzcGFyc2VDb21wb3NpdGVLZXksIHNwYXJzZUNvbXBvc2l0ZSk7Ci0gICAgICAgIAotICAgICAgICAvLyBJZiB0aGVyZSdzIGEgV1NETCBVUkwgc3BlY2lmaWVkIGluIHRoZSBzcGFyc2UgY29tcG9zaXRlLCB0aGF0IGlzIGEgb3ZlcnJpZGUsIGZvciBleGFtcGxlCi0gICAgICAgIC8vIGZyb20gYSBKU1ItMTA5IGRlcGxveW1lbnQgZGVzY3JpcHRvciwgYW5kIHRoYXQncyB0aGUgb25lIHRvIHVzZS4KLSAgICAgICAgVVJMIHNwYXJzZUNvbXBvc2l0ZVdzZGxVUkwgPSBnZXRTcGFyc2VDb21wb3NpdGVXc2RsVVJMKHNwYXJzZUNvbXBvc2l0ZSk7Ci0gICAgICAgIGlmIChzcGFyc2VDb21wb3NpdGVXc2RsVVJMICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiV3NkbCBsb2NhdGlvbiBvdmVycmlkZW4gYnkgc3BhcnNlIGNvbXBvc2l0ZTsgb3ZlcnJpZGVuIHZhbHVlOiAiICsgdGhpcy53c2RsVVJMKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRoaXMud3NkbFVSTCA9IHNwYXJzZUNvbXBvc2l0ZVdzZGxVUkwudG9TdHJpbmcoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRoaXMud3NkbFVSTCA9IHdzZGxVUkwgPT0gbnVsbCA/IG51bGwgOiB3c2RsVVJMLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIldzZGwgTG9jYXRpb24gdmFsdWUgdXNlZDogIiArIHRoaXMud3NkbFVSTCk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gVE9ETzogT24gdGhlIGNsaWVudCBzaWRlLCB3ZSBzaG91bGQgbm90IHN1cHBvcnQgcGFydGlhbCBXU0RMOyBpLmUuIGlmIHRoZSBXU0RMIGlzIHNwZWNpZmllZCBpdCBtdXN0IGJlCi0gICAgICAgIC8vICAgICAgIGNvbXBsZXRlIGFuZCBtdXN0IGNvbnRhaW4gdGhlIFNlcnZpY2VRTmFtZS4gIFRoaXMgaXMgaG93IHRoZSBTdW4gUkkgYmVoYXZlcyBvbiB0aGUgY2xpZW50LgotICAgICAgICAvLyAgICAgICBXaGVuIHRoaXMgaXMgZml4ZWQsIHRoZSBjaGVjayBpbiBTZXJ2aWNlRGVsZWdhdGUoVVJMLCBRTmFtZSwgQ2xhc3MpIHNob3VsZCBiZSByZW1vdmVkCi0gICAgICAgIAotICAgICAgICAvLyBUT0RPOiBUaGUgc2VydmljZVFOYW1lIG5lZWRzIHRvIGJlIHZlcmlmaWVkIGJldHdlZW4gdGhlIGFyZ3VtZW50L1dTREwvQW5ub3RhdGlvbgotICAgICAgICB0aGlzLnNlcnZpY2VRTmFtZSA9IHNlcnZpY2VRTmFtZTsKLQotICAgICAgICBzZXR1cFdzZGxEZWZpbml0aW9uKCk7Ci0gICAgfQotICAgIAotICAgIFVSTCBnZXRTcGFyc2VDb21wb3NpdGVXc2RsVVJMKERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBzcGFyc2VDb21wb3NpdGUpIHsKLSAgICAgICAgLy8gVXNlIHRoZSBXU0RMIGZpbGUgaWYgaXQgaXMgc3BlY2lmaWVkIGluIHRoZSBjb21wb3NpdGUKLSAgICAgICAgVVJMIHVybCA9IG51bGw7Ci0gICAgICAgIGlmIChzcGFyc2VDb21wb3NpdGUgIT0gbnVsbCkgewotICAgICAgICAgICAgV2ViU2VydmljZUNsaWVudCB3c2MgPSAoV2ViU2VydmljZUNsaWVudCkgc3BhcnNlQ29tcG9zaXRlLmdldFdlYlNlcnZpY2VDbGllbnRBbm5vdCgpOwotICAgICAgICAgICAgaWYgKHdzYyAhPSBudWxsICYmIHdzYy53c2RsTG9jYXRpb24oKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHdzZGxMb2NhdGlvbiA9IHdzYy53c2RsTG9jYXRpb24oKTsKLSAgICAgICAgICAgICAgICBVUkwgd3NkbFVybCA9IGdldFdTRExVUkwod3NkbExvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAod3NkbFVybCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgic2VydmljZURlc2NFcnI0Iiwgd3NkbExvY2F0aW9uKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdXJsID0gd3NkbFVybDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHVybDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBVUkwgY3JlYXRlV3NkbFVSTChTdHJpbmcgd3NkbExvY2F0aW9uKSB7Ci0gICAgICAgIFVSTCB0aGVVcmwgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgdGhlVXJsID0gbmV3IFVSTCh3c2RsTG9jYXRpb24pOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIC8vIEp1c3QgcmV0dXJuIGEgbnVsbCB0byBpbmRpY2F0ZSB3ZSBjb3VsZG4ndCBjcmVhdGUgYSBVUkwgZnJvbSB0aGUgc3RyaW5nCi0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlVuYWJsZSB0byBvYnRhaW4gVVJMIGZvciBXU0RMIGZpbGU6ICIgKyB3c2RsTG9jYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiBieSB1c2luZyBGaWxlIHJlZmVyZW5jZSIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGVVcmw7Ci0gICAgfQotCi0gICAgU2VydmljZURlc2NyaXB0aW9uSW1wbCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhc2hNYXA8U3RyaW5nLCBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGU+IGRiY01hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLSAgICAgICAgdGhpcyhkYmNNYXAsIGNvbXBvc2l0ZSwgbnVsbCk7Ci0gICAgfQotICAgIAotICAgIFNlcnZpY2VEZXNjcmlwdGlvbkltcGwoSGFzaE1hcDxTdHJpbmcsIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZT4gZGJjTWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIGNvbXBvc2l0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQpIHsKLSAgICAgICAgdGhpcyhkYmNNYXAsIGNvbXBvc2l0ZSwgY29uZmlnQ29udGV4dCwgbnVsbCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIHNlcnZpY2UtcHJvdmlkZXIgc2lkZSBTZXJ2aWNlIGRlc2NyaXB0aW9uIGhpZXJhY2h5LiAgVGhlIGhpZXJhY2h5IGlzIGNyZWF0ZWQgZW50aXJlbHkKLSAgICAgKiBmcm9tIGNvbXBvc2l0ZS4gIEFsbCByZWxldmFudCBjbGFzc2VzIGFuZCBpbnRlcmZhY2VzIHJlZmVyZW5jZWQgZnJvbSB0aGUgY2xhc3MgcmVwcmVzZW50ZWQgYnkKLSAgICAgKiBjb21wb3NpdGUgbXVzdCBiZSBpbmNsdWRlZCBpbiB0aGUgbWFwLgotICAgICAqIEBwYXJhbSBkYmNNYXAKLSAgICAgKiBAcGFyYW0gY29tcG9zaXRlCi0gICAgICovCi0gICAgU2VydmljZURlc2NyaXB0aW9uSW1wbCgKLSAgICAgICAgICAgIEhhc2hNYXA8U3RyaW5nLCBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGU+IGRiY01hcCwKLSAgICAgICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBjb21wb3NpdGUsIAotICAgICAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ29udGV4dCwgCi0gICAgICAgICAgICBRTmFtZSBzZXJ2aWNlUU5hbWUpIHsKLSAgICAgICAgdGhpcy5jb21wb3NpdGUgPSBjb21wb3NpdGU7Ci0gICAgICAgIAotICAgICAgICB0aGlzLmNvbmZpZ0NvbnRleHQgPSBjb25maWdDb250ZXh0OwotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiU2VydmljZURlc2NyaXB0aW9uSW1wbChIYXNoTWFwPFN0cmluZyxEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGU+LENvbmZpZ3VyYXRpb25Db250ZXh0KSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIHNlcnZpY2VJbXBsTmFtZSA9IHRoaXMuY29tcG9zaXRlLmdldENsYXNzTmFtZSgpOwotCi0gICAgICAgIHRoaXMuZGJjTWFwID0gZGJjTWFwOwotICAgICAgICB0aGlzLmlzU2VydmVyU2lkZSA9IHRydWU7Ci0gICAgICAgIHRoaXMuc2VydmljZVFOYW1lID0gc2VydmljZVFOYW1lOwotICAgICAgICB0aGlzLmNhdGFsb2dNYW5hZ2VyID0gdGhpcy5jb21wb3NpdGUuZ2V0Q2F0YWxvZ01hbmFnZXIoKTsKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAvLyBpZiB0aGUgU2VydmljZURlc2NyaXB0aW9uSW1wbCB3YXMgY29uc3RydWN0ZWQgd2l0aCBhIHNwZWNpZmljIHNlcnZpY2UgUU5hbWUKLSAgICAgICAgLy8gd2Ugc2hvdWxkIHVzZSB0aGF0IHRvIHJldHJpZXZlIHRoZSBwb3RlbnRpYWwgbGlzdCBvZiBQb3J0Q29tcG9zaXRlIG9iamVjdHMKLSAgICAgICAgTGlzdDxQb3J0Q29tcG9zaXRlPiBwb3J0Q29tcG9zaXRlcyA9IG51bGw7Ci0gICAgICAgIAotICAgICAgICBpZih0aGlzLnNlcnZpY2VRTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwb3J0Q29tcG9zaXRlcyA9IGNvbXBvc2l0ZS5nZXRQb3J0Q29tcG9zaXRlcyh0aGlzLnNlcnZpY2VRTmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBwb3J0Q29tcG9zaXRlcyA9IGNvbXBvc2l0ZS5nZXRQb3J0Q29tcG9zaXRlcygpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIC8vY2FwdHVyZSB0aGUgV1NETCwgaWYgdGhlcmUgaXMgYW55Li4udG8gYmUgdXNlZCBmb3IgbGF0ZXIgcHJvY2Vzc2luZwotICAgICAgICBzZXR1cFdzZGxEZWZpbml0aW9uKCk7Ci0KLSAgICAgICAgLy8gRG8gYSBmaXJzdCBwYXNzIHZhbGlkYXRpb24gZm9yIHRoaXMgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlLgotICAgICAgICAvLyBUaGlzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBhIGZ1bGwgaW50ZWdyaXR5IGNoZWNrLCBidXQgcmF0aGVyIGEgZmFpbC1mYXN0IG1lY2hhbmlzbQotICAgICAgICB2YWxpZGF0ZURCQ0xJbnRlZ3JpdHkoKTsKLQotICAgICAgICAvLyBUaGUgU2VydmljZVFOYW1lIGluc3RhbmNlIHZhcmlhYmxlIGlzIHNldCBiYXNlZCBvbiBhbm5vdGF0aW9uIG9yIGRlZmF1bHQKLSAgICAgICAgLy8gSXQgd2lsbCBiZSBzZXQgYnkgdGhlIEVuZHBvaW50RGVzY3JpcHRpb25JbXBsIHNpbmNlIGl0IGlzIHRoZSBvbmUgdGhhdCBrbm93cwotICAgICAgICAvLyBob3cgdG8gcHJvY2VzcyB0aGUgYW5ub3RhdGlvbnMgYW5kIHRoZSBkZWZhdWx0cy4KLQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIC8vIElmIFBvcnRDb21wb3NpdGUgaW5zdGFuY2VzIHdlcmUgc3BlY2lmaWVkIG9uIHRoZSBEQkMgd2UgYXJlIGN1cnJlbnRseSBwcm9jZXNzaW5nCi0gICAgICAgIC8vIHdlIHdhbnQgdG8gc3dpdGNoIHRoZSBjb250ZXh0IG9mIHByb2Nlc3NpbmcgdG8gdGhlIFBvcnRDb21wb3NpdGVzCi0gICAgICAgIGlmKHBvcnRDb21wb3NpdGVzICE9IG51bGwKLSAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAgICAgICFwb3J0Q29tcG9zaXRlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJDb25zdHJ1Y3RpbmcgRW5kcG9pbnREZXNjcmlwdGlvbiBpbnN0YW5jZSBmcm9tIFBvcnRDb21wb3NpdGVzIGZvciAiICsKLSAgICAgICAgICAgICAgICAJCSJpbXBsZW1lbnRhdGlvbiBjbGFzczogIiArIGNvbXBvc2l0ZS5nZXRDbGFzc05hbWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgICAgICBmb3IoUG9ydENvbXBvc2l0ZSBwb3J0Q29tcG9zaXRlIDogcG9ydENvbXBvc2l0ZXMpIHsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIHByb3BlcnRpZXMgZnJvbSB0aGUgU0VJIGFuZCB0aGUgSW1wbAotICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcHMgPSBnZXRBbGxQcm9wcyhwb3J0Q29tcG9zaXRlLCBkYmNNYXApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIGhlcmUgd2UgcGFzcyBpbiBhbiBpbmRleCBzbyB0aGUgRW5kcG9pbnREZXNjcmlwdGlvbkltcGwgaW5zdGFuY2Ugd2lsbCBrbm93Ci0gICAgICAgICAgICAgICAgLy8gd2hpY2ggUG9ydENvbXBvc2l0ZSBpbnN0YW5jZSBpdCBpcyBhc3NvY2lhdGVkIHdpdGggYW5kIGNhbiByZXRyaWV2ZSB0aGF0IAotICAgICAgICAgICAgICAgIC8vIGluc3RhbmNlIGFzIHJlcXVpcmVkCi0gICAgICAgICAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbkltcGwgZW5kcG9pbnREZXNjcmlwdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBFbmRwb2ludERlc2NyaXB0aW9uSW1wbCh0aGlzLCBzZXJ2aWNlSW1wbE5hbWUsIHByb3BzLCBpKTsKLSAgICAgICAgICAgICAgICBhZGRFbmRwb2ludERlc2NyaXB0aW9uKGVuZHBvaW50RGVzY3JpcHRpb24pOwotICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gSWYgbm8gUG9ydENvbXBvc2l0ZXMgdGhlbiB3ZSBidWlsZCB0aGUgRW5kcG9pbnREZXNjcmlwdGlvbkltcGwgaW5zdGFuY2UgZnJvbSB0aGUKLSAgICAgICAgLy8gREJDIHRoYXQgd2FzIHN1cHBsaWVkCi0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgaWYobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIk5vIFBvcnRDb21wb3NpdGVzIGZvdW5kIGZvciBpbXBsZW1lbnRhdGlvbiBjbGFzczogIiArIGNvbXBvc2l0ZS5nZXRDbGFzc05hbWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIHByb3BlcnRpZXMgZnJvbSB0aGUgU0VJIGFuZCB0aGUgSW1wbAotICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcHMgPSBnZXRBbGxQcm9wcyhjb21wb3NpdGUsIGRiY01hcCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBzaW5nbGUgRW5kcG9pbnREZXNjcmlwdGlvbiBoaWVyYWNoeSBmcm9tIHRoZSBzZXJ2aWNlIGltcGwgYW5ub3RhdGlvbnM7IFNpbmNlIHRoZSBQb3J0UU5hbWUgaXMgbnVsbCwgCi0gICAgICAgIAkvLyBpdCB3aWxsIGJlIHNldCB0byB0aGUgYW5ub3RhdGlvbiB2YWx1ZS4KLSAgICAgICAgCUVuZHBvaW50RGVzY3JpcHRpb25JbXBsIGVuZHBvaW50RGVzY3JpcHRpb24gPQotICAgICAgICAgICAgICAgIAluZXcgRW5kcG9pbnREZXNjcmlwdGlvbkltcGwodGhpcywgc2VydmljZUltcGxOYW1lLCBwcm9wcywgbnVsbCk7Ci0gICAgICAgIAlhZGRFbmRwb2ludERlc2NyaXB0aW9uKGVuZHBvaW50RGVzY3JpcHRpb24pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0gICAgLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0gICAgLy8gU1RBUlQgb2YgcHVibGljIGFjY2Vzc29yIG1ldGhvZHMKLQotICAgIC8qKgotICAgICAqIFVwZGF0ZSBvciBjcmVhdGUgYW4gRW5kcG9pbnREZXNjcmlwdGlvbi4gVXBkYXRlcyB0byBleGlzdGluZyBFbmRwb2ludERlc2NyaXB0b25zIHdpbGwgYmUKLSAgICAgKiBiYXNlZCBvbiB0aGUgU0VJIGNsYXNzIGFuZCBpdHMgYW5ub3RhdGlvbnMuICBCb3RoIGRlY2xhcmVkIHBvcnRzIGFuZCBkeW5hbWljIHBvcnRzIGNhbiBiZQotICAgICAqIHVwZGF0ZWQuICBBIGRlY2xhcmVkIHBvcnQgaXMgb25lIHRoYXQgaXMgZGVmaW5lZCAoZS5nLiBpbiBXU0RMIG9yIHZpYSBhbm5vdGF0aW9ucyk7IGEgZHlhbWljCi0gICAgICogcG9ydCBpcyBvbmUgdGhhdCBpcyBub3QgZGVmaW5lZCAoZS5nLiBub3QgdmlhIFdTREwgb3IgYW5ub3RhdGlvbnMpIGFuZCBoYXMgYmVlbiBhZGRlZCB2aWEKLSAgICAgKiBTZXJpdmNlLmFkZFBvcnQuCi0gICAgICogPHAvPgotICAgICAqIEZvciBwcmVkZWZpbmVkIHBvcnRzLCBhIGNvbXBvc2l0ZSBvZiBzcGFyc2UgbWV0YWRhdGEsIHN1Y2ggYXMgZnJvbSBhIGRlcGxveW1lbnQgZGVzY3JpcHRvcgotICAgICAqIG1heSBiZSBzdXBwbGllZC4gIFRoaXMgY2FuIGJlIHVzZWQgdG8gbW9kaWZ5IHRoZSBlbmRwb2ludCBpbnRlcmZhY2Vhbm5vdGF0aW9ucyBzdWNoIGFzCi0gICAgICogYWRkaW5nIGEgaGFuZGxlciBjaGFpbi4gIFRoZSBzcGFyc2UgY29tcG9zaXRlIGlzIE5PVCBzdXBwb3J0ZWQgZm9yIGR5bmFtaWMgKGkuZS4gQUREX1BPUlQpCi0gICAgICogb3IgZGlzcGF0Y2ggY2xpZW50cy4gCi0gICAgICogPHAvPgotICAgICAqIE5vdGVzIG9uIGhvdyBhbiBFbmRwb2ludERlc2NyaXB0aW9uIGNhbiBiZSB1cGRhdGVkIG9yIGNyZWF0ZWQ6IDEpIFNlcnZpY2UuY3JlYXRlRGlzcGF0Y2ggY2FuCi0gICAgICogY3JlYXRlIGEgRGlzcGF0Y2ggY2xpZW50IGZvciBlaXRoZXIgYSBkZWNsYXJlZCBvciBkeW5hbWljIHBvcnQgMikgTm90ZSB0aGF0IGNyZWF0aW5nIGEKLSAgICAgKiBEaXNwYXRjaCBkb2VzIG5vdCBhc3NvY2lhdGUgYW4gU0VJIHdpdGggYW4gZW5kcG9pbnQgMykgU2VydmljZS5nZXRQb3J0IHdpbGwgYXNzb2NpYXRlIGFuIFNFSQotICAgICAqIHdpdGggYSBwb3J0IDQpIEEgZ2V0UG9ydCBvbiBhbiBlbmRwb2ludCB3aGljaCB3YXMgb3JpZ2luYWxseSBjcmVhdGVkIGZvciBhIERpc3RwYXRjaCB3aWxsCi0gICAgICogdXBkYXRlIHRoYXQgRW5kcG9pbnREZXNjcmlwdGlvbiB3aXRoIHRoZSBTRUkgcHJvdmlkZWQgb24gdGhlIGdldFBvcnQgNSkgU2VydmljZS5nZXRQb3J0IGNhbgotICAgICAqIG5vdCBiZSBjYWxsZWQgb24gYSBkeW5hbWljIHBvcnQgKHBlciB0aGUgSkFYLVdTIHNwZWMpIDYpIFNlcnZpY2UuYWRkUG9ydCBjYW4gbm90IGJlIGNhbGxlZAotICAgICAqIGZvciBhIGRlY2xhcmVkIHBvcnQKLSAgICAgKgotICAgICAqIEBwYXJhbSBzZWkgICAgICAgIFRoaXMgd2lsbCBiZSBub24tbnVsbCBpZiB0aGUgdXBkYXRlIGlzIG9mIHR5cGUgR0VUX1BPUlQ7IGl0IHdpbGwgYmUgbnVsbCBpZgotICAgICAqICAgICAgICAgICAgICAgICAgIHRoZSB1cGRhdGUgaXMgQUREX1BPUlQgb3IgQ1JFQVRFX0RJU1BBVENICi0gICAgICogQHBhcmFtIHBvcnRRTmFtZQotICAgICAqIEBwYXJhbSB1cGRhdGVUeXBlIEluZGljYXRlcyB3aGF0IGlzIGNhdXNpbmcgdGhlIHVwZGF0ZSBHRVRfUE9SVCBpcyBhbiBhdHRlbXB0IHRvIGdldCBhCi0gICAgICogICAgICAgICAgICAgICAgICAgZGVjbGFyZWQgU0VJLWJhc2VkIHBvcnQgQUREX1BPUlQgaXMgYW4gYXR0ZW1wdCB0byBhZGQgYSBwcmV2aW91c2x5Ci0gICAgICogICAgICAgICAgICAgICAgICAgbm9uLWV4aXN0ZW50IGR5bmFtaWMgcG9ydCBDUkVBVEVfRElTUEFUQ0ggaXMgYW4gYXR0ZW1wdCB0byBjcmVhdGUgYQotICAgICAqICAgICAgICAgICAgICAgICAgIERpc3BhdGNoLWJhc2VkIGNsaWVudCB0byBlaXRoZXIgYSBkZWNsYXJlZCBwb3J0IG9yIGEgcHJlLWV4aXN0aW5nIGR5bmFtaWMKLSAgICAgKiAgICAgICAgICAgICAgICAgICBwb3J0LgotICAgICAqIEBwYXJhbSBjb21wb3NpdGUgIE1heSBjb250YWluIHNwYXJzZSBtZXRhZGF0YSwgZm9yIGV4YW1wbGUgZnJvbSBhIGRlcGxveW1lbnQgZGVzY3JpcHRvciwgdGhhdAotICAgICAqICAgICAgICAgICAgICAgICAgIHNob3VsZCBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIGNsYXNzIGFubm90YXRpb25zIHRvIHVwZGF0ZSB0aGUKLSAgICAgKiAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiBoaWVyYXJjaHkuICBGb3IgZXhhbXBsZSwgaXQgbWF5IGNvbnRhaW4gYSBIYW5kbGVyQ2hhaW4gYW5ub3RhdGlvbgotICAgICAqICAgICAgICAgICAgICAgICAgIGJhc2VkIG9uIGluZm9ybWF0aW9uIGluIGEgSlNSLTEwOSBkZXBsb3ltZW50IGRlc2NyaXB0b3IuICAgICAgICAgICAgICAgICAgICAKLSAgICAgKi8KLQotICAgIEVuZHBvaW50RGVzY3JpcHRpb24gdXBkYXRlRW5kcG9pbnREZXNjcmlwdGlvbihDbGFzcyBzZWksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRTmFtZSBwb3J0UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uRmFjdG9yeS5VcGRhdGVUeXBlIHVwZGF0ZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBjb21wb3NpdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBzZXJ2aWNlRGVsZWdhdGVLZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBiaW5kaW5nSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBlbmRwb2ludEFkZHJlc3MpIHsKLQotCQotICAgIAlFbmRwb2ludERlc2NyaXB0aW9uSW1wbCBlbmRwb2ludERlc2NyaXB0aW9uID0gZ2V0RW5kcG9pbnREZXNjcmlwdGlvbkltcGwocG9ydFFOYW1lKTsKLSAgICAJYm9vbGVhbiBpc1BvcnREZWNsYXJlZCA9IGlzUG9ydERlY2xhcmVkKHBvcnRRTmFtZSk7Ci0KLSAgICAJLy8gSWYgYSBkZWZpbmVkIGVuZHBvaW50RGVzY3JpcHRpb24gaXMgbm90IGF2YWlsYWJsZSwgdHJ5IGFuZCBsb2NhdGUgYSBkeW5hbWljIGVuZHBvaW50LgotICAgIAkvLyBOb3RlIHRoYXQgYSBkeW5hbWljIHBvcnQgd2lsbCBvbmx5IGJlIGZvdW5kIGZvciB0aGUgY2xpZW50IHRoYXQgY3JlYXRlZCBpdCwgcGVyIHRoZQotICAgIAkvLyBzZXJ2aWNlRGVsZWdhdGVLZXkKLQotICAgIAlpZiAoZW5kcG9pbnREZXNjcmlwdGlvbiA9PSBudWxsICYmIHNlcnZpY2VEZWxlZ2F0ZUtleSAhPSBudWxsKSB7Ci0gICAgCQllbmRwb2ludERlc2NyaXB0aW9uID0gZ2V0RHluYW1pY0VuZHBvaW50RGVzY3JpcHRpb25JbXBsKHBvcnRRTmFtZSwgc2VydmljZURlbGVnYXRlS2V5KTsKLSAgICAJfQotCi0gICAgICAgIC8vIElmIG5vIFFOYW1lIHdhcyBzcGVjaWZpZWQgaW4gdGhlIGFyZ3VtZW50cywgb25lIG1heSBoYXZlIGJlZW4gc3BlY2lmaWVkIGluIHRoZSBzcGFyc2UKLSAgICAgICAgLy8gY29tcG9zaXRlIG1ldGFkYXRhIHdoZW4gdGhlIHNlcnZpY2Ugd2FzIGNyZWF0ZWQuCi0gICAgICAgIGlmIChEZXNjcmlwdGlvblV0aWxzLmlzRW1wdHkocG9ydFFOYW1lKSkgewotICAgICAgICAgICAgUU5hbWUgcHJlZmVycmVkUG9ydFFOID0gZ2V0UHJlZmVycmVkUG9ydChzZXJ2aWNlRGVsZWdhdGVLZXkpOwotICAgICAgICAgICAgaWYgKCFEZXNjcmlwdGlvblV0aWxzLmlzRW1wdHkocHJlZmVycmVkUG9ydFFOKSkgewotICAgICAgICAgICAgICAgIHBvcnRRTmFtZSA9IHByZWZlcnJlZFBvcnRRTjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHN3aXRjaCAodXBkYXRlVHlwZSkgewotCi0gICAgICAgICAgICBjYXNlIEFERF9QT1JUOgotICAgICAgICAgICAgICAgIGlmIChjb21wb3NpdGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoInNlcnZpY2VEZXNjRXJyNSIsIHBvcnRRTmFtZS50b1N0cmluZygpKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIFBvcnQgbXVzdCBOT1QgYmUgZGVjbGFyZWQgKGUuZy4gY2FuIG5vdCBhbHJlYWR5IGV4aXN0IGluIFdTREwpCi0gICAgICAgICAgICAgICAgLy8gSWYgYW4gRW5kcG9pbnREZXNjIGRvZXNuJ3QgZXhpc3Q7IGNyZWF0ZSBpdCBhcyBsb25nIGFzIGl0IGRvZXNuJ3QgZXhpc3QgaW4gdGhlIFdTREwKLSAgICAgICAgICAgICAgICBpZiAoRGVzY3JpcHRpb25VdGlscy5pc0VtcHR5KHBvcnRRTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJhZGRQb3J0RXJyMiIpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGdldFdTRExXcmFwcGVyKCkgIT0gbnVsbCAmJiBpc1BvcnREZWNsYXJlZCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoImFkZFBvcnREdXAiLCBwb3J0UU5hbWUudG9TdHJpbmcoKSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZW5kcG9pbnREZXNjcmlwdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFVzZSB0aGUgU0VJIENsYXNzIGFuZCBpdHMgYW5ub3RhdGlvbnMgdG8gZmluaXNoIGNyZWF0aW5nIHRoZSBEZXNjcmlwdGlvbiBoaWVyYXJjaHkuICBOb3RlIHRoYXQgRW5kcG9pbnRJbnRlcmZhY2UsIE9wZXJhdGlvbnMsIFBhcmFtZXRlcnMsIGV0Yy4KLSAgICAgICAgICAgICAgICAgICAgLy8gYXJlIG5vdCBjcmVhdGVkIGZvciBkeW5hbWljIHBvcnRzLiAgSXQgd291bGQgYmUgYW4gZXJyb3IgdG8gbGF0ZXIgZG8gYSBnZXRQb3J0IGFnYWluc3QgYSBkeW5hbWljIHBvcnQgKHBlciB0aGUgSkFYLVdTIHNwZWMpCi0gICAgICAgICAgICAgICAgICAgIC8vIElmIHdlIGNhbid0IGFkZCB0aGUgZHluYW1pYyBwb3J0IHVuZGVyIGEgc3BlY2lmaWMgc2VydmljZSBkZWxlZ2F0ZSwgdGhhdCBpcyBhbiBlcnJvcgotCi0gICAgICAgICAgICAgICAgICAgIGlmIChzZXJ2aWNlRGVsZWdhdGVLZXkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoInNlcnZpY2VEZXNjcmlwdGlvbkltcGxBZGRQb3J0RXJyIikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgZW5kcG9pbnREZXNjcmlwdGlvbiA9IGNyZWF0ZUVuZHBvaW50RGVzY3JpcHRpb25JbXBsKHNlaSwgcG9ydFFOYW1lLCBiaW5kaW5nSWQsIGVuZHBvaW50QWRkcmVzcyk7ICAgIAotICAgICAgICAgICAgICAgICAgICBhZGREeW5hbWljRW5kcG9pbnREZXNjcmlwdGlvbkltcGwoZW5kcG9pbnREZXNjcmlwdGlvbiwgc2VydmljZURlbGVnYXRlS2V5KTsKLQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEFsbCBlcnJvciBjaEplY2sgYWJvdmUgcGFzc2VkLCB0aGUgRW5kcG9pbnREZXNjcmlwdGlvbiBhbHJlYWR5IGV4aXN0cyBhbmQgbmVlZHMgbm8gdXBkYXRpbmcKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgR0VUX1BPUlQ6Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gdHJ5IHRvIGZpbmQgZXhpc3RpbmcgZW5kcG9pbnREZXNjIGJ5IFNFSSBjbGFzcyBpZiBwb3J0UU5hbWUgd2FzIG5vdCBzcGVjaWZpZWQgCi0gICAgICAgICAgICAgICAgaWYgKGVuZHBvaW50RGVzY3JpcHRpb24gPT0gbnVsbCAmJiBwb3J0UU5hbWUgPT0gbnVsbCAmJiBzZWkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBlbmRwb2ludERlc2NyaXB0aW9uID0gZ2V0RW5kcG9pbnREZXNjcmlwdGlvbkltcGwoc2VpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gSWYgYW4gZW5kcG9pbnREZXNjIGRvZXNuJ3QgZXhpc3QsIGFuZCB0aGUgcG9ydCBleGlzdHMgaW4gdGhlIFdTREwsIGNyZWF0ZSBpdAotICAgICAgICAgICAgICAgIC8vIElmIGFuIGVuZHBvaW50RGVzYyBhbHJlYWR5IGV4aXN0cyBhbmQgaGFzIGFuIGFzc29jaWF0ZWQgU0VJIGFscmVhZHksIG1ha2Ugc3VyZSB0aGV5IG1hdGNoCi0gICAgICAgICAgICAgICAgLy8gSWYgYW4gZW5kcG9pbnREZXNjIGFscmVhZHkgZXhpc3RzIGFuZCB3YXMgY3JlYXRlZCBmb3IgRGlzcGF0Y2ggKG5vIFNFSSksIHVwZGF0ZSB0aGF0IHdpdGggdGhlIFNFSSBwcm92aWRlZCBvbiB0aGUgZ2V0UG9ydAotCi0gICAgICAgICAgICAgICAgLy8gUG9ydCBtdXN0IGJlIGRlY2xhcmVkIChlLmcuIGluIFdTREwgb3IgdmlhIGFubm90YXRpb25zKQotICAgICAgICAgICAgICAgIC8vIFRPRE86IE9uY2UgaXNQb3J0RGVjbGFyZWQgdW5kZXJzdGFuZHMgYW5ub3RhdGlvbnMgYW5kIG5vdCBqdXN0IFdTREwsIHRoZSAybmQgcGFydCBvZiB0aGlzIGNoZWNrIGNhbiBwb3NzaWJseSBiZSByZW1vdmVkLgotICAgICAgICAgICAgICAgIC8vICAgICAgIEFsdGhvdWdoIGNvbnNpZGVyIHRoZSBjaGVjayBiZWxvdyB0aGF0IHVwZGF0ZXMgYW4gZXhpc3RpbmcgRW5kcG9pbnREZXNjcml0cGlvbiB3aXRoIGFuIFNFSS4KLSAgICAgICAgICAgICAgICBpZiAoIWlzUG9ydERlY2xhcmVkIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAoZW5kcG9pbnREZXNjcmlwdGlvbiAhPSBudWxsICYmIGVuZHBvaW50RGVzY3JpcHRpb24uaXNEeW5hbWljUG9ydCgpKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGd1YXJkcyBhZ2FpbnN0IHRoZSBjYXNlIHdoZXJlIGFuIGFkZFBvcnQgd2FzIGRvbmUgcHJldmlvdXNseSBhbmQgbm93IGEgZ2V0UG9ydCBpcyBkb25lIG9uIGl0LgotICAgICAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAJCU1lc3NhZ2VzLmdldE1lc3NhZ2UoInVwZGF0ZUVQRGVzY3JFcnIxIiwocG9ydFFOYW1lICE9IG51bGwgPyBwb3J0UU5hbWUudG9TdHJpbmcoKSA6ICJub3Qgc3BlY2lmaWVkIikpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNlaSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIAkJTWVzc2FnZXMuZ2V0TWVzc2FnZSgidXBkYXRlRVBEZXNjckVycjIiLChwb3J0UU5hbWUgIT0gbnVsbCA/IHBvcnRRTmFtZS50b1N0cmluZygpIDogIm5vdCBzcGVjaWZpZWQiKSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZW5kcG9pbnREZXNjcmlwdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFVzZSB0aGUgU0VJIENsYXNzIGFuZCBpdHMgYW5ub3RhdGlvbnMgdG8gZmluaXNoIGNyZWF0aW5nIHRoZSBEZXNjcmlwdGlvbiBoaWVyYWNoeTogRW5kcG9pbnQsIEVuZHBvaW50SW50ZXJmYWNlLCBPcGVyYXRpb25zLCBQYXJhbWV0ZXJzLCBldGMuCi0gICAgICAgICAgICAgICAgICAgIGVuZHBvaW50RGVzY3JpcHRpb24gPSBuZXcgRW5kcG9pbnREZXNjcmlwdGlvbkltcGwoc2VpLCBwb3J0UU5hbWUsIHRoaXMsIGNvbXBvc2l0ZSwgc2VydmljZURlbGVnYXRlS2V5KTsKLSAgICAgICAgICAgICAgICAgICAgYWRkRW5kcG9pbnREZXNjcmlwdGlvbihlbmRwb2ludERlc2NyaXB0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgICogV2UgbXVzdCByZXNldCB0aGUgc2VydmljZSBydW50aW1lIGRlc2NyaXB0aW9uIGFmdGVyIGFkZGluZyBhIG5ldyBlbmRwb2ludAotICAgICAgICAgICAgICAgICAgICAgKiBzaW5jZSB0aGUgcnVudGltZSBkZXNjcmlwdGlvbiBpbmZvcm1hdGlvbiBjb3VsZCBoYXZlIHJlZmVyZW5jZXMgdG8gb2xkCi0gICAgICAgICAgICAgICAgICAgICAqIGluZm9ybWF0aW9uLiBTZWUgTWFyc2hhbFNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb25GYWN0b3J5IGFuZCAKLSAgICAgICAgICAgICAgICAgICAgICogTWFyc2hhbFNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb24uCi0gICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICByZXNldFNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb24oKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICBpZiAoZ2V0RW5kcG9pbnRTRUkocG9ydFFOYW1lKSA9PSBudWxsICYmICFlbmRwb2ludERlc2NyaXB0aW9uLmlzRHluYW1pY1BvcnQoKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBFeGlzdGluZyBlbmRwb2ludERlc2MgZnJvbSBhIGRlY2xhcmVkIHBvcnQgbmVlZHMgdG8gYmUgdXBkYXRlZCB3aXRoIGFuIFNFSS4KLSAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBjb3VsZCBoYXBwZW4gaWYgdGhlIGNsaWVudCBmaXJzdCBkaWQgYSBDUkVBVEVfRElTUEFUQ0ggb24gYSBkZWNsYXJlZAotICAgICAgICAgICAgICAgICAgICAvLyBwb3J0LCB3aGljaCB3b3VsZCBjYXVzZSBpdCB0byBiZSBjcmVhdGVkLCBhbmQgdGhlbiBkaWQgYSBHRVRfUE9SVCBvbiB0aGUgCi0gICAgICAgICAgICAgICAgICAgIC8vIHNhbWUgcG9ydCBsYXRlciwgcHJvdmlkaW5nIGFuIFNFSS4KLSAgICAgICAgICAgICAgICAgICAgLy8gTm90ZXMgCi0gICAgICAgICAgICAgICAgICAgIC8vIDEpIEFuIEVuZHBvaW50RGVzY3JpdHB0aW9uIGNyZWF0ZWQgZnJvbSBhbiBhZGRQb3J0IChpLmUuIGEgZHluYW1pYyBwb3J0KSBjYW4gCi0gICAgICAgICAgICAgICAgICAgIC8vICAgIG5vdCBkbyB0aGlzLgotICAgICAgICAgICAgICAgICAgICAvLyAyKSBBIHNwYXJzZSBjb21wb3NpdGUgbWF5IGJlIHNwZWNpZmllZC4gIFdlIGRvbid0IGFsbG93IG1peGluZyBKQVgtV1MgdW5tYW5hZ2VkCi0gICAgICAgICAgICAgICAgICAgIC8vICAgIGFwaXMgKENSRUFURV9ESVNQQVRDSCkgd2l0aCBKU1ItMTA5IG1hbmFnZWQgYXBpcyAoR0VUX1BPUlQgd2l0aCBzcGFyc2UKLSAgICAgICAgICAgICAgICAgICAgLy8gICAgY29tcG9zaXRlIG1ldGFkYXRhIGZyb20gYSBERCkuICBTaW5jZSB0aGUgc3BhcnNlIGNvbXBvc2l0ZSBpcyBzdG9yZWQgYnkKLSAgICAgICAgICAgICAgICAgICAgLy8gICAgYSBrZXkgQU5EIENSRUFURV9ESVNQQVRDSCBhbmQgQUREX1BPUlQgd2lsbCB0aHJvd24gYW4gZXhjZXB0aW9uIG9mIGEgY29tcG9zaXRlCi0gICAgICAgICAgICAgICAgICAgIC8vICAgIGlzIHNwZWNpZmllZCwgaGF2aW5nIGEgY29tcG9zaXRlIGFuZCBrZXkgb24gdGhlIEdFVF9QT1JUcyBzaG91bGRuJ3QgYmUKLSAgICAgICAgICAgICAgICAgICAgLy8gICAgYSBwcm9ibGVtLgotICAgICAgICAgICAgICAgICAgICBlbmRwb2ludERlc2NyaXB0aW9uLnVwZGF0ZVdpdGhTRUkoc2VpLCBjb21wb3NpdGUsIHNlcnZpY2VEZWxlZ2F0ZUtleSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChnZXRFbmRwb2ludFNFSShwb3J0UU5hbWUpICE9IHNlaSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAJCU1lc3NhZ2VzLmdldE1lc3NhZ2UoInVwZGF0ZUVQRGVzY3JFcnIzIixwb3J0UU5hbWUudG9TdHJpbmcoKSwKLSAgICAgICAgICAgICAgICAgICAgCQkJCXNlaS5nZXROYW1lKCksZ2V0RW5kcG9pbnRTRUkocG9ydFFOYW1lKS5nZXROYW1lKCkpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBBbGwgZXJyb3IgY2hlY2sgYWJvdmUgcGFzc2VkLCB0aGUgRW5kcG9pbnREZXNjcmlwdGlvbiBhbHJlYWR5IGV4aXN0cyBhbmQgbmVlZHMgbm8gdXBkYXRpbmcKLSAgICAgICAgICAgICAgICAgICAgLy8gSnVzdCBhZGQgdGhlIHNwYXJzZSBjb21wb3NpdGUgaWYgb25lIHdhcyBzcGVjaWZpZWQuCi0gICAgICAgICAgICAgICAgICAgIGVuZHBvaW50RGVzY3JpcHRpb24uZ2V0RGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCkuc2V0U3BhcnNlQ29tcG9zaXRlKHNlcnZpY2VEZWxlZ2F0ZUtleSwgY29tcG9zaXRlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgQ1JFQVRFX0RJU1BBVENIOgotICAgICAgICAgICAgICAgIGlmIChjb21wb3NpdGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoInNlcnZpY2VEZXNjRXJyNiIpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gUG9ydCBtYXkgb3IgbWF5IG5vdCBleGlzdCBpbiBXU0RMLgotICAgICAgICAgICAgICAgIC8vIElmIGFuIGVuZHBvaW50RGVzYyBkb2Vzbid0IGV4aXN0IGFuZCBpdCBpcyBpbiB0aGUgV1NETCwgaXQgY2FuIGJlIGNyZWF0ZWQKLSAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UsIGl0IGlzIGFuIGVycm9yLgotICAgICAgICAgICAgICAgIGlmIChEZXNjcmlwdGlvblV0aWxzLmlzRW1wdHkocG9ydFFOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoImNyZWF0ZURpc3BhdGNoRmFpbDAiKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlbmRwb2ludERlc2NyaXB0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVGhlIEVuZHBvaW50RGVzY3JpcHRpb24gYWxyZWFkeSBleGlzdHM7IG5vdGhpbmcgbmVlZHMgdG8gYmUgZG9uZQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVGhlIERpc3BhdGNoIHNob3VsZCBub3QgaGF2ZSBhbiBTRUkgYXNzb2NpYXRlZCB3aXRoIGl0IG9uIHRoZSB1cGRhdGUgY2FsbC4KLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgCQlNZXNzYWdlcy5nZXRNZXNzYWdlKCJjcmVhdGVEaXNwYXRjaEZhaWwzIixwb3J0UU5hbWUudG9TdHJpbmcoKSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZ2V0V1NETFdyYXBwZXIoKSAhPSBudWxsICYmIGlzUG9ydERlY2xhcmVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEVuZHBvaW50RGVzY3JpcHRpb24gZG9lc24ndCBleGlzdCBhbmQgdGhpcyBpcyBhIGRlY2xhcmVkIFBvcnQsIHNvIGNyZWF0ZSBvbmUKLSAgICAgICAgICAgICAgICAgICAgLy8gVXNlIHRoZSBTRUkgQ2xhc3MgYW5kIGl0cyBhbm5vdGF0aW9ucyB0byBmaW5pc2ggY3JlYXRpbmcgdGhlIERlc2NyaXB0aW9uIGhpZXJhcmNoeS4gIAotICAgICAgICAgICAgICAgICAgICAvLyBOb3RlIHRoYXQgRW5kcG9pbnRJbnRlcmZhY2UsIE9wZXJhdGlvbnMsIFBhcmFtZXRlcnMsIGV0Yy4gYXJlIG5vdCBjcmVhdGVkIGZvciAKLSAgICAgICAgICAgICAgICAgICAgLy8gRGlzcGF0Y2gtYmFzZWQgcG9ydHMsIGJ1dCBtaWdodCBiZSB1cGRhdGVkIGxhdGVyIGlmIGEgZ2V0UG9ydCBpcyBkb25lIGFnYWluc3QgCi0gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzYW1lIGRlY2xhcmVkIHBvcnQuCi0gICAgICAgICAgICAgICAgICAgIGVuZHBvaW50RGVzY3JpcHRpb24gPSBuZXcgRW5kcG9pbnREZXNjcmlwdGlvbkltcGwoc2VpLCBwb3J0UU5hbWUsIHRoaXMpOwotICAgICAgICAgICAgICAgICAgICBhZGRFbmRwb2ludERlc2NyaXB0aW9uKGVuZHBvaW50RGVzY3JpcHRpb24pOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRoZSBwb3J0IGlzIG5vdCBhIGRlY2xhcmVkIHBvcnQgYW5kIGl0IGRvZXMgbm90IGhhdmUgYW4gRW5kcG9pbnREZXNjcmlwdGlvbiwgCi0gICAgICAgICAgICAgICAgICAgIC8vIG1lYW5pbmcgYW4gYWRkUG9ydCBoYXMgbm90IGJlZW4gZG9uZSBmb3IgaXQKLSAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhbiBlcnJvci4KLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRNZXNzYWdlKCJjcmVhdGVEaXNwYXRjaEZhaWwxIiwgcG9ydFFOYW1lLnRvU3RyaW5nKCkpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVuZHBvaW50RGVzY3JpcHRpb247Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBFbmRwb2ludERlc2NyaXB0aW9uSW1wbCBjcmVhdGVFbmRwb2ludERlc2NyaXB0aW9uSW1wbChDbGFzcyBzZWksIFFOYW1lIHBvcnRRTmFtZSwgU3RyaW5nIGJpbmRpbmdJZCwgU3RyaW5nIGVuZHBvaW50QWRkcmVzcykgewotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ2FsbGluZyBjcmVhdGVFbmRwb2ludERlc2NyaXB0aW9uSW1wbCA6ICgiCi0gICAgICAgICAgICAgICAgICAgICAgKyBwb3J0UU5hbWUgKyAiLCIgKyBiaW5kaW5nSWQgKyAiLCIgKyBlbmRwb2ludEFkZHJlc3MgKyAiKSIpOwotICAgICAgICB9Ci0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb25JbXBsIGVuZHBvaW50RGVzY3JpcHRpb24gPSBudWxsOwotICAgICAgICBBeGlzQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uID0gY29uZmlnQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpOwotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygibG9va2luZyBmb3IgIiArIEpBWFdTX0RZTkFNSUNfRU5EUE9JTlRTICsgIiBpbiBBeGlzQ29uZmlndXJhdGlvbiA6ICIgKyBjb25maWd1cmF0aW9uKTsKLSAgICAgICAgfQotICAgICAgICBQYXJhbWV0ZXIgcGFyYW1ldGVyID0gY29uZmlndXJhdGlvbi5nZXRQYXJhbWV0ZXIoSkFYV1NfRFlOQU1JQ19FTkRQT0lOVFMpOwotICAgICAgICBIYXNoTWFwIGNhY2hlZERlc2NyaXB0aW9ucyA9IChIYXNoTWFwKQotICAgICAgICAgICAgICAgICgocGFyYW1ldGVyID09IG51bGwpID8gbnVsbCA6IHBhcmFtZXRlci5nZXRWYWx1ZSgpKTsKLSAgICAgICAgaWYoY2FjaGVkRGVzY3JpcHRpb25zID09IG51bGwpIHsKLSAgICAgICAgICAgIGNhY2hlZERlc2NyaXB0aW9ucyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24uYWRkUGFyYW1ldGVyKEpBWFdTX0RZTkFNSUNfRU5EUE9JTlRTLCBjYWNoZWREZXNjcmlwdGlvbnMpOwotICAgICAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGF4aXNGYXVsdCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGF4aXNGYXVsdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkFkZGVkIG5ldyBpbnN0YW5jZSBvZiBjYWNoZWREZXNjcmlwdGlvbnMgOiAiICsgY2FjaGVkRGVzY3JpcHRpb25zKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiZm91bmQgb2xkIGpheHdzLmR5bmFtaWMuZW5kcG9pbnRzIGNhY2hlIGluIEF4aXNDb25maWd1cmF0aW9uICgiICArICBjYWNoZWREZXNjcmlwdGlvbnMgKyAiKSB3aXRoIHNpemUgOiAoIgotICAgICAgICAgICAgICAgICAgICAgICAgICArIGNhY2hlZERlc2NyaXB0aW9ucy5zaXplKCkgKyAiKSIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nQnVmZmVyIGtleSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAga2V5LmFwcGVuZChwb3J0UU5hbWUgPT0gbnVsbCA/ICJOVUxMIiA6IHBvcnRRTmFtZS50b1N0cmluZygpKTsKLSAgICAgICAga2V5LmFwcGVuZCgnOicpOwotICAgICAgICBrZXkuYXBwZW5kKGJpbmRpbmdJZCA9PSBudWxsID8gIk5VTEwiIDogYmluZGluZ0lkKTsKLSAgICAgICAga2V5LmFwcGVuZCgnOicpOwotICAgICAgICBrZXkuYXBwZW5kKGVuZHBvaW50QWRkcmVzcyA9PSBudWxsID8gIk5VTEwiIDogZW5kcG9pbnRBZGRyZXNzKTsKLSAgICAgICAgc3luY2hyb25pemVkKGNhY2hlZERlc2NyaXB0aW9ucykgewotICAgICAgICAgICAgV2Vha1JlZmVyZW5jZSByZWYgPSAoV2Vha1JlZmVyZW5jZSkgY2FjaGVkRGVzY3JpcHRpb25zLmdldChrZXkudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICBpZiAocmVmICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBlbmRwb2ludERlc2NyaXB0aW9uID0gKEVuZHBvaW50RGVzY3JpcHRpb25JbXBsKSByZWYuZ2V0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYoZW5kcG9pbnREZXNjcmlwdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICBlbmRwb2ludERlc2NyaXB0aW9uID0gbmV3IEVuZHBvaW50RGVzY3JpcHRpb25JbXBsKHNlaSwgcG9ydFFOYW1lLCB0cnVlLCB0aGlzKTsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZChjYWNoZWREZXNjcmlwdGlvbnMpIHsKLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJDYWxsaW5nIGNhY2hlZERlc2NyaXB0aW9ucy5wdXQgOiAoIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBrZXkudG9TdHJpbmcoKSArICIpIDogc2l6ZSAtICIgKyBjYWNoZWREZXNjcmlwdGlvbnMuc2l6ZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2FjaGVkRGVzY3JpcHRpb25zLnB1dChrZXkudG9TdHJpbmcoKSwgbmV3IFdlYWtSZWZlcmVuY2UoZW5kcG9pbnREZXNjcmlwdGlvbikpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJmb3VuZCBvbGQgZW50cnkgZm9yIGVuZHBvaW50RGVzY3JpcHRpb24gaW4gamF4d3MuZHluYW1pYy5lbmRwb2ludHMgY2FjaGUgOiAoIgotICAgICAgICAgICAgICAgICAgICAgICAgICArIGNhY2hlZERlc2NyaXB0aW9ucy5zaXplKCkgKyAiKSIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBlbmRwb2ludERlc2NyaXB0aW9uOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGdldCBhbGwgcHJvcGVydGllcyB0aGF0IGhhdmUgYmVlbiBzZXQgb24gdGhlIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZQotICAgICAqIGluc3RhbmNlLiBJZiB0aGUgREJDIHJlcHJlc2VudHMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgdGhhdCByZWZlcmVuY2VzIGFuIFNFSSwgdGhlCi0gICAgICogcHJvcGVydGllcyBmcm9tIHRoZSBTRUkgd2lsbCBhbHNvIGJlIG1lcmdlZCB3aXRoIHRoZSByZXR1cm5lZCByZXN1bHQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBPYmplY3Q+IGdldEFsbFByb3BzKERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBkYmMsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGU+IGRiY01hcCkgewotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0gICAgICAgIAotICAgICAgICAvLyBmaXJzdCBnZXQgdGhlIHByb3BlcnRpZXMgZnJvbSB0aGUgREJDCi0gICAgICAgIGlmKGRiYy5nZXRQcm9wZXJ0aWVzKCkgIT0gbnVsbAotICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgICAgIWRiYy5nZXRQcm9wZXJ0aWVzKCkuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBwcm9wcy5wdXRBbGwoZGJjLmdldFByb3BlcnRpZXMoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIG5vIG5lZWQgdG8gY29udGludWUgaWYgdGhlICdkYmNNYXAnIGlzIG51bGwKLSAgICAgICAgaWYoZGJjTWFwICE9IG51bGwpIHsKLSAgICAgICAgICAgIAotICAgICAgICAgLy8gbm93IGlmIHRoaXMgaXMgYSB3ZWIgc2VydmljZSBpbXBsIHdpdGggYW4gU0VJLCBnZXQgdGhlIFNFSSBwcm9wcwotICAgICAgICAgICAgaWYoZGJjLmdldFdlYlNlcnZpY2VBbm5vdCgpICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgICAgICAgICAgIURlc2NyaXB0aW9uVXRpbHMuaXNFbXB0eShkYmMuZ2V0V2ViU2VydmljZUFubm90KCkuZW5kcG9pbnRJbnRlcmZhY2UoKSkpIHsKLSAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgc2VpREJDID0gZGJjTWFwLmdldChkYmMuZ2V0V2ViU2VydmljZUFubm90KCkuZW5kcG9pbnRJbnRlcmZhY2UoKSk7Ci0gICAgICAgICAgICAgICAgaWYoc2VpREJDICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBzZWlEQkMuZ2V0UHJvcGVydGllcygpICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAhc2VpREJDLmdldFByb3BlcnRpZXMoKS5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJvcHMucHV0QWxsKHNlaURCQy5nZXRQcm9wZXJ0aWVzKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHByb3BzOwotICAgIH0KLQotICAgIHByaXZhdGUgQ2xhc3MgZ2V0RW5kcG9pbnRTRUkoUU5hbWUgcG9ydFFOYW1lKSB7Ci0gICAgICAgIENsYXNzIGVuZHBvaW50U0VJID0gbnVsbDsKLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlbmRwb2ludERlc2MgPSBnZXRFbmRwb2ludERlc2NyaXB0aW9uKHBvcnRRTmFtZSk7Ci0gICAgICAgIGlmIChlbmRwb2ludERlc2MgIT0gbnVsbCkgewotICAgICAgICAgICAgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiBlbmRwb2ludEludGVyZmFjZURlc2MgPSAKLSAgICAgICAgICAgICAgICBlbmRwb2ludERlc2MuZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbigpOwotICAgICAgICAgICAgaWYgKGVuZHBvaW50SW50ZXJmYWNlRGVzYyAhPSBudWxsICkgewotICAgICAgICAgICAgICAgIGVuZHBvaW50U0VJID0gZW5kcG9pbnRJbnRlcmZhY2VEZXNjLmdldFNFSUNsYXNzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVuZHBvaW50U0VJOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1BvcnREZWNsYXJlZChRTmFtZSBwb3J0UU5hbWUpIHsKLSAgICAgICAgLy8gVE9ETzogVGhpcyBuZWVkcyB0byBhY2NvdW50IGZvciBkZWNsYXJhdGlvbiBvZiB0aGUgcG9ydCB2aWEgYW5ub3RhdGlvbnMgaW4gYWRkaXRpb24gdG8ganVzdCBXU0RMCi0gICAgICAgIC8vIFRPRE86IEFkZCBsb2dpYyB0byBjaGVjayB0aGUgcG9ydFFOIG5hbWVzcGFjZSBhZ2FpbnN0IHRoZSBXU0RMIERlZmluaXRpb24gTlMKLSAgICAgICAgYm9vbGVhbiBwb3J0SXNEZWNsYXJlZCA9IGZhbHNlOwotICAgICAgICBpZiAoIURlc2NyaXB0aW9uVXRpbHMuaXNFbXB0eShwb3J0UU5hbWUpKSB7Ci0gICAgICAgICAgICBpZiAoZ2V0V1NETFdyYXBwZXIoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgRGVmaW5pdGlvbiB3c2RsRGVmbiA9IGdldFdTRExXcmFwcGVyKCkuZ2V0RGVmaW5pdGlvbigpOwotICAgICAgICAgICAgICAgIFNlcnZpY2Ugd3NkbFNlcnZpY2UgPSB3c2RsRGVmbi5nZXRTZXJ2aWNlKHNlcnZpY2VRTmFtZSk7Ci0gICAgICAgICAgICAgICAgUG9ydCB3c2RsUG9ydCA9IHdzZGxTZXJ2aWNlLmdldFBvcnQocG9ydFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICBwb3J0SXNEZWNsYXJlZCA9ICh3c2RsUG9ydCAhPSBudWxsKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETzogQWRkIGxvZ2ljIHRvIGRldGVybWluZSBpZiBwb3J0IGlzIGRlY2xhcmVkIHZpYSBhbm5vdGF0aW9ucyB3aGVuIG5vIFdTREwgaXMgcHJlc2VudC4gIEZvciBub3csIHdlIGhhdmUgdG8gYXNzdW1lIGl0IGlzIGRlY2xhcmVkIAotICAgICAgICAgICAgICAgIC8vIHNvIGdldFBvcnQoLi4uKSBhbmQgY3JlYXRlRGlzcGF0Y2goLi4uKSBjYWxscyB3b3JrIHdoZW4gdGhlcmUgaXMgbm8gV1NETC4KLSAgICAgICAgICAgICAgICBwb3J0SXNEZWNsYXJlZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBQb3J0UU5hbWUgaXMgbnVsbCwgc28gdGhlIHJ1bnRpbWUgZ2V0cyB0byBjaG9vc2Ugd2hpY2ggb25lIHRvIHVzZS4gIFNpbmNlIHRoZXJlJ3Mgbm8gV1NETAotICAgICAgICAgICAgLy8gd2UnbGwgdXNlIGFubm90YXRpb25zLCBzbyBpdCBpcyBpbXBsaWNpdGx5IGRlY2xhcmVkCi0gICAgICAgICAgICBwb3J0SXNEZWNsYXJlZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHBvcnRJc0RlY2xhcmVkOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5TZXJ2aWNlRGVzY3JpcHRpb24jZ2V0RW5kcG9pbnREZXNjcmlwdGlvbnMoKQotICAgICovCi0gICAgcHVibGljIEVuZHBvaW50RGVzY3JpcHRpb25bXSBnZXRFbmRwb2ludERlc2NyaXB0aW9ucygpIHsKLSAgICAgICAgcmV0dXJuIGRlZmluZWRFbmRwb2ludERlc2NyaXB0aW9ucy52YWx1ZXMoKS50b0FycmF5KG5ldyBFbmRwb2ludERlc2NyaXB0aW9uSW1wbFswXSk7Ci0gICAgfQotCi0gICAgcHVibGljIENvbGxlY3Rpb248RW5kcG9pbnREZXNjcmlwdGlvbkltcGw+IGdldER5bmFtaWNFbmRwb2ludERlc2NyaXB0aW9uc19Bc0NvbGxlY3Rpb24oT2JqZWN0IHNlcnZpY2VEZWxlZ2F0ZUtleSkgewotICAgICAgICBDb2xsZWN0aW9uIDxFbmRwb2ludERlc2NyaXB0aW9uSW1wbD4gZHluYW1pY0VuZHBvaW50cyA9IG51bGw7Ci0gICAgCWlmIChzZXJ2aWNlRGVsZWdhdGVLZXkgIT0gbnVsbCApIHsKLSAgICAJCWlmIChkeW5hbWljRW5kcG9pbnREZXNjcmlwdGlvbnMuZ2V0KHNlcnZpY2VEZWxlZ2F0ZUtleSkgIT0gbnVsbCkKLSAgICAJCQlkeW5hbWljRW5kcG9pbnRzID0gZHluYW1pY0VuZHBvaW50RGVzY3JpcHRpb25zLmdldChzZXJ2aWNlRGVsZWdhdGVLZXkpLnZhbHVlcygpOwotICAgICAgICB9Ci0gICAgCXJldHVybiBkeW5hbWljRW5kcG9pbnRzOwotICAgIH0KLQotICAgIHB1YmxpYyBDb2xsZWN0aW9uPEVuZHBvaW50RGVzY3JpcHRpb24+IGdldEVuZHBvaW50RGVzY3JpcHRpb25zX0FzQ29sbGVjdGlvbigpIHsKLSAgICAJcmV0dXJuIGRlZmluZWRFbmRwb2ludERlc2NyaXB0aW9ucy52YWx1ZXMoKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uU2VydmljZURlc2NyaXB0aW9uI2dldEVuZHBvaW50RGVzY3JpcHRpb24oamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSkKLSAgICAqLwotICAgIHB1YmxpYyBFbmRwb2ludERlc2NyaXB0aW9uIGdldEVuZHBvaW50RGVzY3JpcHRpb24oUU5hbWUgcG9ydFFOYW1lKSB7Ci0KLSAgICAJcmV0dXJuIGdldEVuZHBvaW50RGVzY3JpcHRpb24ocG9ydFFOYW1lLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRW5kcG9pbnREZXNjcmlwdGlvbiBnZXRFbmRwb2ludERlc2NyaXB0aW9uKFFOYW1lIHBvcnRRTmFtZSwgT2JqZWN0IHNlcnZpY2VEZWxlZ2F0ZUtleSkgewotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIHJldHVybkRlc2MgPSBudWxsOwotICAgICAgICBpZiAoIURlc2NyaXB0aW9uVXRpbHMuaXNFbXB0eShwb3J0UU5hbWUpKSB7Ci0gICAgCQlyZXR1cm5EZXNjID0gZGVmaW5lZEVuZHBvaW50RGVzY3JpcHRpb25zLmdldChwb3J0UU5hbWUpOwotCi0gICAgCQlpZiAocmV0dXJuRGVzYyA9PSBudWxsICYmIHNlcnZpY2VEZWxlZ2F0ZUtleSAhPSBudWxsKSB7Ci0JCSAgICAgICAgICAgcmV0dXJuRGVzYyA9IGdldER5bmFtaWNFbmRwb2ludERlc2NyaXB0aW9uSW1wbChwb3J0UU5hbWUsIHNlcnZpY2VEZWxlZ2F0ZUtleSk7Ci0gICAgCQl9ICAgIAkJICAgICAgICAJCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldHVybkRlc2M7Ci0gICAgfQotCi0gICAgRW5kcG9pbnREZXNjcmlwdGlvbkltcGwgZ2V0RW5kcG9pbnREZXNjcmlwdGlvbkltcGwoUU5hbWUgcG9ydFFOYW1lKSB7Ci0gICAgICAgIHJldHVybiAoRW5kcG9pbnREZXNjcmlwdGlvbkltcGwpZ2V0RW5kcG9pbnREZXNjcmlwdGlvbihwb3J0UU5hbWUsIG51bGwpOwotICAgIH0KLSAgICAKLSAgICBFbmRwb2ludERlc2NyaXB0aW9uSW1wbCBnZXRFbmRwb2ludERlc2NyaXB0aW9uSW1wbChRTmFtZSBwb3J0UU5hbWUsIE9iamVjdCBzZXJ2aWNlRGVsZWdhdGVLZXkpIHsKLSAgICAgICAgcmV0dXJuIChFbmRwb2ludERlc2NyaXB0aW9uSW1wbClnZXRFbmRwb2ludERlc2NyaXB0aW9uKHBvcnRRTmFtZSk7Ci0gICAgfQotICAgIAotICAgIEVuZHBvaW50RGVzY3JpcHRpb25JbXBsIGdldEVuZHBvaW50RGVzY3JpcHRpb25JbXBsKENsYXNzIHNlaUNsYXNzKSB7Ci0gICAgICAgIGZvciAoRW5kcG9pbnREZXNjcmlwdGlvbiBlbmRwb2ludERlc2NyaXB0aW9uIDogZGVmaW5lZEVuZHBvaW50RGVzY3JpcHRpb25zLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uIGVuZHBvaW50SW50ZXJmYWNlRGVzYyA9Ci0gICAgICAgICAgICAgICAgICAgIGVuZHBvaW50RGVzY3JpcHRpb24uZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbigpOwotICAgICAgICAgICAgLy8gTm90ZSB0aGF0IERpc3BhdGNoIGVuZHBvaW50cyB3aWxsIG5vdCBoYXZlIGFuIGVuZHBvaW50SW50ZXJmYWNlIGJlY2F1c2UgdGhlIGRvIG5vdCBoYXZlIGFuIGFzc29jaWF0ZWQgU0VJCi0gICAgICAgICAgICBpZiAoZW5kcG9pbnRJbnRlcmZhY2VEZXNjICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBDbGFzcyBlbmRwb2ludFNFSUNsYXNzID0gZW5kcG9pbnRJbnRlcmZhY2VEZXNjLmdldFNFSUNsYXNzKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGVuZHBvaW50U0VJQ2xhc3MgIT0gbnVsbCAmJiBlbmRwb2ludFNFSUNsYXNzLmVxdWFscyhzZWlDbGFzcykpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChFbmRwb2ludERlc2NyaXB0aW9uSW1wbCllbmRwb2ludERlc2NyaXB0aW9uOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBnZXREZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUoKSB7Ci0gICAgICAgIHJldHVybiBnZXREZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUobnVsbCwgbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgcHJvdmlkZXMgYSBtZWFucyBmb3IgYWNjZXNzaW5nIGEgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIGluc3RhbmNlLgotICAgICAqIElmIHRoZSBpbnRlZ2VyIHZhbHVlIHBhc3NlZCBpbiBpcyBhbiBpbmRleCBpbiB0aGUgbGlzdCBvZiBQb3J0Q29tcG9zaXRlIG9iamVjdHMsIAotICAgICAqIHRoZW4gdGhlIGluZGljaWF0ZWQgUG9ydENvbXBvc2l0ZSB3aWxsIGJlIHJldHVybmVkLiBPdGhlcndpc2UsIHRoZSBpbnN0YW5jZSBEQkMKLSAgICAgKiB3aWxsIGJlIHJldHVybmVkLgotICAgICAqLwotICAgIHB1YmxpYyBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgZ2V0RGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKFFOYW1lIHNlcnZpY2VRTmFtZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlciBwb3J0Q29tcG9zaXRlSW5kZXgpIHsKLSAgICAgICAgCi0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBkYmMgPSBudWxsOwotICAgICAgICAKLSAgICAgICAgLy8gaWYgdGhlIHNlcnZpY2UgUU5hbWUgd2FzIHNwZWNpZmllZCBsZXQncyBhdHRlbXB0IHRvIGdldCB0aGUgY29ycmVjdCAKLSAgICAgICAgLy8gUG9ydENvbXBvc2l0ZSBsaXN0Ci0gICAgICAgIGlmKHNlcnZpY2VRTmFtZSAhPSBudWxsCi0gICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgICAgICBjb21wb3NpdGUuZ2V0U2VydmljZVFOYW1lcygpICE9IG51bGwKLSAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAgICAgICFjb21wb3NpdGUuZ2V0U2VydmljZVFOYW1lcygpLmlzRW1wdHkoKQotICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgICAgcG9ydENvbXBvc2l0ZUluZGV4ICE9IG51bGwpIHsKLSAgICAgICAgICAgIExpc3Q8UG9ydENvbXBvc2l0ZT4gcGNMaXN0ID0gY29tcG9zaXRlLmdldFBvcnRDb21wb3NpdGVzKHNlcnZpY2VRTmFtZSk7Ci0gICAgICAgICAgICBpZihwY0xpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGRiYyA9IHBjTGlzdC5nZXQocG9ydENvbXBvc2l0ZUluZGV4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGRiYyA9IGNvbXBvc2l0ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gaWdub3JlIG51bGwgdmFsdWVzIG9yIHZhbHVlcyB0aGF0IHdvdWxkIGNhdXNlIGFuIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KLSAgICAgICAgZWxzZSBpZihwb3J0Q29tcG9zaXRlSW5kZXggPT0gbnVsbCAKLSAgICAgICAgICAgICAgICB8fCAKLSAgICAgICAgICAgICAgICBjb21wb3NpdGUuZ2V0UG9ydENvbXBvc2l0ZXMoKSA9PSBudWxsCi0gICAgICAgICAgICAgICAgfHwKLSAgICAgICAgICAgICAgICBwb3J0Q29tcG9zaXRlSW5kZXggPCAwCi0gICAgICAgICAgICAgICAgfHwKLSAgICAgICAgICAgICAgICBwb3J0Q29tcG9zaXRlSW5kZXggPj0gY29tcG9zaXRlLmdldFBvcnRDb21wb3NpdGVzKCkuc2l6ZSgpKSB7Ci0gICAgICAgICAgICBkYmMgPSBjb21wb3NpdGU7ICAKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gcmV0dXJuIHRoZSBhcHByb3ByaWF0ZSBQb3J0Q29tcG9zaXRlIGluc3RhbmNlCi0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgaWYobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlJldHVybmluZyBQb3J0Q29tcG9zaXRlIGF0IGluZGV4OiAiICsgcG9ydENvbXBvc2l0ZUluZGV4ICsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICIgZnJvbSBTZXJ2aWNlRGVzY3JpcHRpb25JbXBsOiAiICsgdGhpcy5oYXNoQ29kZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRiYyA9IGNvbXBvc2l0ZS5nZXRQb3J0Q29tcG9zaXRlcygpLmdldChwb3J0Q29tcG9zaXRlSW5kZXgpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gZGJjOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uU2VydmljZURlc2NyaXB0aW9uI2dldEVuZHBvaW50RGVzY3JpcHRpb24oamF2YS5sYW5nLkNsYXNzKQotICAgICAqLwotICAgIHB1YmxpYyBFbmRwb2ludERlc2NyaXB0aW9uW10gZ2V0RW5kcG9pbnREZXNjcmlwdGlvbihDbGFzcyBzZWlDbGFzcykgewotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uW10gcmV0dXJuRW5kcG9pbnREZXNjID0gbnVsbDsKLSAgICAgICAgQXJyYXlMaXN0PEVuZHBvaW50RGVzY3JpcHRpb25JbXBsPiBtYXRjaGluZ0VuZHBvaW50cyA9Ci0gICAgICAgICAgICAgICAgbmV3IEFycmF5TGlzdDxFbmRwb2ludERlc2NyaXB0aW9uSW1wbD4oKTsKLSAgICAgICAgZm9yIChFbmRwb2ludERlc2NyaXB0aW9uIGVuZHBvaW50RGVzY3JpcHRpb24gOiBkZWZpbmVkRW5kcG9pbnREZXNjcmlwdGlvbnMudmFsdWVzKCkpIHsKLSAgICAgICAgICAgIEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24gZW5kcG9pbnRJbnRlcmZhY2VEZXNjID0KLSAgICAgICAgICAgICAgICAgICAgZW5kcG9pbnREZXNjcmlwdGlvbi5nZXRFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgICAgICAvLyBOb3RlIHRoYXQgRGlzcGF0Y2ggZW5kcG9pbnRzIHdpbGwgbm90IGhhdmUgYW4gZW5kcG9pbnRJbnRlcmZhY2UgYmVjYXVzZSB0aGUgZG8gbm90IGhhdmUgYW4gYXNzb2NpYXRlZCBTRUkKLSAgICAgICAgICAgIGlmIChlbmRwb2ludEludGVyZmFjZURlc2MgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIENsYXNzIGVuZHBvaW50U0VJQ2xhc3MgPSBlbmRwb2ludEludGVyZmFjZURlc2MuZ2V0U0VJQ2xhc3MoKTsKLSAgICAgICAgICAgICAgICBpZiAoZW5kcG9pbnRTRUlDbGFzcyAhPSBudWxsICYmIGVuZHBvaW50U0VJQ2xhc3MuZXF1YWxzKHNlaUNsYXNzKSkgewotICAgICAgICAgICAgICAgICAgICBtYXRjaGluZ0VuZHBvaW50cy5hZGQoKEVuZHBvaW50RGVzY3JpcHRpb25JbXBsKWVuZHBvaW50RGVzY3JpcHRpb24pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAobWF0Y2hpbmdFbmRwb2ludHMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgcmV0dXJuRW5kcG9pbnREZXNjID0gbWF0Y2hpbmdFbmRwb2ludHMudG9BcnJheShuZXcgRW5kcG9pbnREZXNjcmlwdGlvbkltcGxbMF0pOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXR1cm5FbmRwb2ludERlc2M7Ci0gICAgfQotCi0gICAgLy8gRU5EIG9mIHB1YmxpYyBhY2Nlc3NvciBtZXRob2RzCi0gICAgLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0gICAgLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0gICAgcHJpdmF0ZSB2b2lkIGFkZEVuZHBvaW50RGVzY3JpcHRpb24oRW5kcG9pbnREZXNjcmlwdGlvbkltcGwgZW5kcG9pbnQpIHsKLSAgICAJZGVmaW5lZEVuZHBvaW50RGVzY3JpcHRpb25zLnB1dChlbmRwb2ludC5nZXRQb3J0UU5hbWUoKSwgZW5kcG9pbnQpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZXR1cFdzZGxEZWZpbml0aW9uKCkgewotICAgICAgICAvLyBOb3RlIHRoYXQgdGhlcmUgbWF5IGJlIG5vIFdTREwgcHJvdmlkZWQsIGZvciBleGFtcGxlIHdoZW4gY2FsbGVkIGZyb20gCi0gICAgICAgIC8vIFNlcnZpY2UuY3JlYXRlKFFOYW1lIHNlcnZpY2VOYW1lKS4KLQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1Zygic2V0dXBXc2RsRGVmaW5pdGlvbigpIik7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmIChjb21wb3NpdGUuaXNTZXJ2aWNlUHJvdmlkZXIoKSkgewotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyAgQ3VycmVudGx5LCB0aGVyZSBpcyBhIGJ1ZyB3aGljaCBhbGxvd3MgdGhlIHdzZGxEZWZpbml0aW9uIHRvIGJlIHBsYWNlZAotICAgICAgICAgICAgLy8gIG9uIGVpdGhlciB0aGUgaW1wbCBjbGFzcyBjb21wb3NpdGUgb3IgdGhlIHNlaSBjb21wb3NpdGUsIG9yIGJvdGguIFdlIG5lZWQgdG8KLSAgICAgICAgICAgIC8vICBsb29rIGluIGJvdGggcGxhY2VzIGFuZCBmaW5kIHRoZSBjb3JyZWN0IG9uZSwgaWYgaXQgZXhpc3RzLgotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZihzZXJ2aWNlUU5hbWUgIT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAgICAgICAgICBjb21wb3NpdGUuZ2V0V3NkbERlZmluaXRpb24oc2VydmljZVFOYW1lKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJGb3VuZCBXU0RMIGRlZmluaXRpb24gYnkgc2VydmljZSBRTmFtZSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBEZWZpbml0aW9uIGRlZiA9IGNvbXBvc2l0ZS5nZXRXc2RsRGVmaW5pdGlvbihzZXJ2aWNlUU5hbWUpOwotICAgICAgICAgICAgICAgIFVSTCB1cmwgPSBjb21wb3NpdGUuZ2V0V3NkbFVSTChzZXJ2aWNlUU5hbWUpOwotICAgICAgICAgICAgICAgIHRoaXMud3NkbFVSTCA9IHVybCAhPSBudWxsID8gdXJsLnRvU3RyaW5nKCkgOiBudWxsOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25maWdDb250ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIm5ldyBXU0RMNEpXcmFwcGVyLUNvbmZpZ0NvbnRleHQgbm90IG51bGwxIik7IAotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIm5ldyBXU0RMNEpXcmFwcGVyLUNvbmZpZ0NvbnRleHQgbnVsbDEiKTsgCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB0aGlzLndzZGxXcmFwcGVyID0gbmV3IFdTREw0SldyYXBwZXIodXJsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ0NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhdGFsb2dNYW5hZ2VyKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChXU0RMRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRNZXNzYWdlKCJ3c2RsRXhjZXB0aW9uIiwgZS5nZXRNZXNzYWdlKCkpLCBlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGVsc2UgaWYgKCgoY29tcG9zaXRlLmdldFdlYlNlcnZpY2VBbm5vdCgpICE9IG51bGwpICYmCi0gICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uVXRpbHMuaXNFbXB0eShjb21wb3NpdGUuZ2V0V2ViU2VydmljZUFubm90KCkuZW5kcG9pbnRJbnRlcmZhY2UoKSkpCi0gICAgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICAgICAgICAgICAgICghKGNvbXBvc2l0ZS5nZXRXZWJTZXJ2aWNlUHJvdmlkZXJBbm5vdCgpID09IG51bGwpKSkgewotICAgICAgICAgICAgICAgIC8vVGhpcyBpcyBlaXRoZXIgYW4gaW1wbGljaXQgU0VJLCBvciBhIFdlYlNlcnZpY2UgUHJvdmlkZXIKLSAgICAgICAgICAgICAgICBpZiAoY29tcG9zaXRlLmdldFdzZGxEZWZpbml0aW9uKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBVUkwgdXJsID0gY29tcG9zaXRlLmdldFdzZGxVUkwoKTsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy53c2RsVVJMID0gdXJsID09IG51bGwgPyBudWxsIDogdXJsLnRvU3RyaW5nKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnQ29udGV4dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygibmV3IFdTREw0SldyYXBwZXItQ29uZmlnQ29udGV4dCBub3QgbnVsbDEiKTsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJuZXcgV1NETDRKV3JhcHBlci1Db25maWdDb250ZXh0IG51bGwxIik7IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy53c2RsV3JhcHBlciA9IG5ldyBXU0RMNEpXcmFwcGVyKHVybCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb3NpdGUuZ2V0V3NkbERlZmluaXRpb24oKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhdGFsb2dNYW5hZ2VyKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoV1NETEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRNZXNzYWdlKCJ3c2RsRXhjZXB0aW9uIiwgZS5nZXRNZXNzYWdlKCkpLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgCVN0cmluZyB3c2RsTG9jYXRpb24gPSBudWxsOwotICAgICAgICAgICAgICAgIAl3c2RsTG9jYXRpb24gPSBjb21wb3NpdGUuZ2V0V2ViU2VydmljZUFubm90KCkgIT0gbnVsbCA/IGNvbXBvc2l0ZS5nZXRXZWJTZXJ2aWNlQW5ub3QoKS53c2RsTG9jYXRpb24oKSA6Ci0gICAgICAgICAgICAgICAgCQljb21wb3NpdGUuZ2V0V2ViU2VydmljZVByb3ZpZGVyQW5ub3QoKS53c2RsTG9jYXRpb24oKTsKLSAgICAgICAgICAgICAgICAJaWYod3NkbExvY2F0aW9uICE9IG51bGwKLSAgICAgICAgICAgICAgICAJCQkmJgotICAgICAgICAgICAgICAgIAkJCSEiIi5lcXVhbHMod3NkbExvY2F0aW9uKSkgewotICAgICAgICAgICAgICAgIAkgICAgc2V0V1NETERlZmluaXRpb25PbkRCQyh3c2RsTG9jYXRpb24pOwotICAgICAgICAgICAgICAgIAl9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IGVsc2UgaWYgKGNvbXBvc2l0ZS5nZXRXZWJTZXJ2aWNlQW5ub3QoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy9UaGlzIGltcGwgY2xhc3Mgc3BlY2lmaWVzIGFuIFNFSS4uLnRoaXMgaXMgYSBzcGVjaWFsIGNhc2UuIFRoZXJlIGlzIGEgYnVnCi0gICAgICAgICAgICAgICAgLy9pbiB0aGUgdG9vbGluZyB0aGF0IGFsbG93cyBmb3IgdGhlIHdzZGxsb2NhdGlvbiB0byBiZSBzcGVjaWZlZCBvbiBlaXRoZXIgdGhlCi0gICAgICAgICAgICAgICAgLy9pbXBsLiBjbGFzcywgb3IgdGhlIFNFSSwgb3IgYm90aC4gU28sIHdlIG5lZWQgdG8gbG9vayBmb3IgdGhlIHdzZGwgYXMgZm9sbG93czoKLSAgICAgICAgICAgICAgICAvLyAgICAgICAgICAxLiBJZiB0aGUgV3NkbCBleGlzdHMgb24gdGhlIFNFSSwgdGhlbiBjaGVjayBmb3IgaXQgb24gdGhlIGltcGwuCi0gICAgICAgICAgICAgICAgLy8gICAgICAgICAgMi4gSWYgaXQgaXMgbm90IGZvdW5kIGluIGVpdGhlciBsb2NhdGlvbiwgaW4gdGhhdCBvcmRlciwgdGhlbiBnZW5lcmF0ZQotCi0gICAgICAgICAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIHNlaWMgPQotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0REJDTWFwKCkuZ2V0KGNvbXBvc2l0ZS5nZXRXZWJTZXJ2aWNlQW5ub3QoKS5lbmRwb2ludEludGVyZmFjZSgpKTsKLQotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzZWljID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiVGhlIFNFSSBjbGFzcyAiICsgY29tcG9zaXRlLmdldFdlYlNlcnZpY2VBbm5vdCgpLmVuZHBvaW50SW50ZXJmYWNlKCkgKyAiIHdhcyBub3QgZm91bmQuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHNlaWMgIT0gbnVsbCAmJiBzZWljLmdldFdzZGxEZWZpbml0aW9uKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IHRoZSB3c2RsIGRlZiBmcm9tIHRoZSBTRUkgY29tcG9zaXRlCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkdldCB0aGUgd3NkbCBkZWZpbml0aW9uIGZyb20gdGhlIFNFSSBjb21wb3NpdGUuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBVUkwgdXJsID0gc2VpYy5nZXRXc2RsVVJMKCk7IAotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy53c2RsVVJMID0gdXJsLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZ0NvbnRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIm5ldyBXU0RMNEpXcmFwcGVyLUNvbmZpZ0NvbnRleHQgbm90IG51bGwyIik7IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygibmV3IFdTREw0SldyYXBwZXItQ29uZmlnQ29udGV4dCBudWxsMiIpOyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLndzZGxXcmFwcGVyID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFdTREw0SldyYXBwZXIoc2VpYy5nZXRXc2RsVVJMKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWljLmdldFdzZGxEZWZpbml0aW9uKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWdDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhdGFsb2dNYW5hZ2VyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb21wb3NpdGUuZ2V0V3NkbERlZmluaXRpb24oKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vc2V0IHRoZSB3c2RsIGRlZiBmcm9tIHRoZSBpbXBsLiBjbGFzcyBjb21wb3NpdGUKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiR2V0IHRoZSB3c2RsIGRlZmluaXRpb24gZnJvbSB0aGUgaW1wbCBjbGFzcyBjb21wb3NpdGUuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZ0NvbnRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIm5ldyBXU0RMNEpXcmFwcGVyLUNvbmZpZ0NvbnRleHQgbm90IG51bGwzIik7IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygibmV3IFdTREw0SldyYXBwZXItQ29uZmlnQ29udGV4dCBudWxsMyIpOyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBVUkwgdXJsID0gY29tcG9zaXRlLmdldFdzZGxVUkwoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMud3NkbFVSTCA9IHVybCA9PSBudWxsID8gbnVsbCA6IHVybC50b1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy53c2RsV3JhcHBlciA9IG5ldyBXU0RMNEpXcmFwcGVyKGNvbXBvc2l0ZS5nZXRXc2RsVVJMKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9zaXRlLmdldFdzZGxEZWZpbml0aW9uKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ0NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYXRhbG9nTWFuYWdlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgCVN0cmluZyB3c2RsTG9jYXRpb24gPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAJLy8gZmlyc3QgY2hlY2sgdG8gc2VlIGlmIHRoZSB3c2RsTG9jYXRpb24gaXMgb24gdGhlIFNFSQotICAgICAgICAgICAgICAgICAgICAJaWYoc2VpYyAhPSBudWxsCi0gICAgICAgICAgICAgICAgICAgIAkJCSYmCi0gICAgICAgICAgICAgICAgICAgIAkJCXNlaWMuZ2V0V2ViU2VydmljZUFubm90KCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAJICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAJICAgICAgICBsb2cuZGVidWcoIkdldCB0aGUgd3NkbCBsb2NhdGlvbiBmcm9tIHRoZSBTRUkgY29tcG9zaXRlLiIpOwotICAgICAgICAgICAgICAgICAgICAJICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCSAgICB3c2RsTG9jYXRpb24gPSBzZWljLmdldFdlYlNlcnZpY2VBbm5vdCgpLndzZGxMb2NhdGlvbigpOwotICAgICAgICAgICAgICAgICAgICAJfQotICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICAJCi0gICAgICAgICAgICAgICAgICAgIAkvLyBub3cgY2hlY2sgdGhlIGltcGwKLSAgICAgICAgICAgICAgICAgICAgCWlmKHdzZGxMb2NhdGlvbiA9PSBudWxsCi0gICAgICAgICAgICAgICAgICAgIAkgICAgICAgIHx8Ci0gICAgICAgICAgICAgICAgICAgIAkgICAgICAgICIiLmVxdWFscyh3c2RsTG9jYXRpb24pKSB7Ci0gICAgICAgICAgICAgICAgICAgIAkgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIAkgICAgICAgIGxvZy5kZWJ1ZygiR2V0IHRoZSB3c2RsIGxvY2F0aW9uIGZyb20gdGhlIGltcGwgY2xhc3MgY29tcG9zaXRlLiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCSAgICB3c2RsTG9jYXRpb24gPSBjb21wb3NpdGUuZ2V0V2ViU2VydmljZUFubm90KCkud3NkbExvY2F0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIAl9Ci0gICAgICAgICAgICAgICAgICAgIAkKLSAgICAgICAgICAgICAgICAgICAgCWlmKHdzZGxMb2NhdGlvbiAhPSBudWxsCi0gICAgICAgICAgICAgICAgICAgIAkgICAgICAgICYmCi0gICAgICAgICAgICAgICAgICAgIAkgICAgICAgICEiIi5lcXVhbHMod3NkbExvY2F0aW9uKSkgewotICAgICAgICAgICAgICAgICAgICAJICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAJICAgICAgICBsb2cuZGVidWcoIndzZGwgbG9jYXRpb24gPSIgKyB3c2RsTG9jYXRpb24pOwotICAgICAgICAgICAgICAgICAgICAJICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCSAgICAKLSAgICAgICAgICAgICAgICAgICAgCSAgICB0aGlzLndzZGxVUkwgPSB3c2RsTG9jYXRpb247Ci0gICAgICAgICAgICAgICAgICAgIAkgICAgc2V0V1NETERlZmluaXRpb25PbkRCQyh3c2RsTG9jYXRpb24pOwotICAgICAgICAgICAgICAgICAgICAJfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoV1NETEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZ2V0TWVzc2FnZSgid3NkbEV4Y2VwdGlvbiIsIGUuZ2V0TWVzc2FnZSgpKSwgZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvL0RlcHJlY2F0ZSB0aGlzIGNvZGUgYmxvY2sgd2hlbiBNRFEgaXMgZnVsbHkgaW50ZWdyYXRlZAotICAgICAgICB9IGVsc2UgaWYgKHdzZGxVUkwgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb25maWdDb250ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygibmV3IFdTREw0SldyYXBwZXItQ29uZmlnQ29udGV4dCBub3QgbnVsbDQiKTsgCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIm5ldyBXU0RMNEpXcmFwcGVyLUNvbmZpZ0NvbnRleHQgbnVsbDQiKTsgCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdGhpcy53c2RsV3JhcHBlciA9IG5ldyBXU0RMNEpXcmFwcGVyKG5ldyBVUkwodGhpcy53c2RsVVJMKSxjb25maWdDb250ZXh0LAotICAgICAgICAgICAgICAgIAkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhdGFsb2dNYW5hZ2VyKTsKLSAgICAgICAgICAgICAKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRNZXNzYWdlKCJ3c2RsTm90Rm91bmRFcnIiLCBlLmdldE1lc3NhZ2UoKSksIGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFVua25vd25Ib3N0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZ2V0TWVzc2FnZSgidW5rbm93bkhvc3QiLCBlLmdldE1lc3NhZ2UoKSksIGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKENvbm5lY3RFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRNZXNzYWdlKCJjb25uZWN0aW9uUmVmdXNlZCIsIGUuZ2V0TWVzc2FnZSgpKSwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJ1cmxTdHJlYW0iLCBlLmdldE1lc3NhZ2UoKSksIGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFdTRExFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRNZXNzYWdlKCJ3c2RsRXhjZXB0aW9uIiwgZS5nZXRNZXNzYWdlKCkpLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCBhY2NlcHRzIGEgbG9jYXRpb24gb2YgYSBXU0RMIGRvY3VtZW50IGFuZCBhdHRlbXB0cyB0bwotICAgICAqIGxvYWQgYW5kIHNldCB0aGUgV1NETCBkZWZpbml0aW9uIG9uIHRoZSBEQkMgb2JqZWN0LgotICAgICAqIEBwYXJhbSB3c2RsTG9jYXRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2V0V1NETERlZmluaXRpb25PbkRCQyhTdHJpbmcgd3NkbExvY2F0aW9uKSB7Ci0gICAgCWlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0JCQlsb2cuZGVidWcoIkF0dGVtcHRpbmcgdG8gbG9hZCBXU0RMIGZpbGUgZnJvbSBsb2NhdGlvbiBzcGVjaWZpZWQgaW4gYW5ub3RhdGlvbjogIiArCi0JCQkJCXdzZGxMb2NhdGlvbik7Ci0JCX0KLQkJaWYoY29tcG9zaXRlLmdldENsYXNzTG9hZGVyKCkgPT0gbnVsbCkgewotCQkJaWYobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLQkJCQlsb2cuZGVidWcoIkEgY2xhc3Nsb2FkZXIgY291bGQgbm90IGJlIGZvdW5kIGZvciBjbGFzczogIiArIGNvbXBvc2l0ZS4KLQkJCQkJCWdldENsYXNzTmFtZSgpICsgIi4gVGhlIFdTREwgZmlsZTogIiArIHdzZGxMb2NhdGlvbiArICIgd2lsbCBub3QgYmUgIiArCi0JCQkJCQkJCSJwcm9jZXNzZWQsIGFuZCB0aGUgU2VydmljZURlc2NyaXB0aW9uIHdpbGwgYmUgYnVpbHQgZnJvbSAiICsKLQkJCQkJCQkJImFubm90YXRpb25zIik7Ci0JCQl9Ci0JCX0KLQkJdHJ5IHsKLQkJICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0JCSAgICAgICAgbG9nLmRlYnVnKCJBdHRlbXB0aW5nIHRvIHJlYWQgV1NETDogIiArIHdzZGxMb2NhdGlvbiArICIgZm9yIHdlYiAiICsKLQkJICAgICAgICAJCSJzZXJ2aWNlIGVuZHBvaW50OiAiICsgY29tcG9zaXRlLmdldENsYXNzTmFtZSgpKTsKLQkJICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpICkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZ0NvbnRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygibmV3IFdTREw0SldyYXBwZXItQ29uZmlnQ29udGV4dCBub3QgbnVsbDUiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJuZXcgV1NETDRKV3JhcHBlci1Db25maWdDb250ZXh0IG51bGw1Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBVUkwgdXJsID0gZ2V0V1NETFVSTCh3c2RsTG9jYXRpb24pOwotICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBjYyA9IGNvbXBvc2l0ZS5nZXRDb25maWd1cmF0aW9uQ29udGV4dCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoY2MgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy53c2RsV3JhcHBlciA9IG5ldyBXU0RMNEpXcmFwcGVyKHVybCwgY2MsIHRoaXMuY2F0YWxvZ01hbmFnZXIpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gUHJvYmFibHkgc2hvdWxkbid0IGdldCBoZXJlLiAgQnV0IGlmIHdlIGRvLCB1c2UgYSBtZW1vcnkgc2Vuc2l0aXZlCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyB3c2RsIHdyYXBwZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMud3NkbFdyYXBwZXIgPSBuZXcgV1NETDRKV3JhcHBlcih1cmwsIHRoaXMuY2F0YWxvZ01hbmFnZXIsIHRydWUsIDIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNvbXBvc2l0ZS5zZXRXc2RsRGVmaW5pdGlvbih3c2RsV3JhcHBlci5nZXREZWZpbml0aW9uKCkpOwotCQl9Ci0JCWNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCQlpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotCQkJCWxvZy5kZWJ1ZygiVGhlIFdTREwgZmlsZTogIiArIHdzZGxMb2NhdGlvbiArICIgZm9yIGNsYXNzOiAiICsgY29tcG9zaXRlLmdldENsYXNzTmFtZSgpICsgCi0JCQkJCQkiY291bGQgbm90IGJlIHByb2Nlc3NlZC4gVGhlIFNlcnZpY2VEZXNjcmlwdGlvbiB3aWxsIGJlIGJ1aWx0IGZyb20gIiArCi0JCQkJCQkJCSJhbm5vdGF0aW9ucyIpOwotCQkJfQotCQl9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgaGFuZGxlIG9idGFpbmluZyBhIFVSTCBmb3IgdGhlIGdpdmVuIFdTREwgbG9jYXRpb24uICBUaGUgV1NETCB3aWxsIGJlCi0gICAgICogbG9va2VkIGZvciBpbiB0aGUgZm9sbG93aW5nIHBsYWNlcyBpbiB0aGlzIG9yZGVyOgotICAgICAqIAotICAgICAqIFByZVJlc29sdXRpb24pIGNoZWNrIGZvciB4bWxjYXRhbG9nIHJlc29sdmVyCi0gICAgICogMSkgQXMgYSByZXNvdXJjZSBvbiB0aGUgY2xhc3NwYXRoCi0gICAgICogMikgQXMgYSBmdWxseSBzcGVjaWZpZWQgVVJMCi0gICAgICogMykgQXMgYSBmaWxlIG9uIHRoZSBmaWxlc3lzdGVtLiAgVGhpcyBpcyBhbmFsYWdvdXMgdG8gd2hhdCB0aGUgZ2VuZXJhdGVkCi0gICAgICogICAgU2VydmljZSBjbGllbnQgZG9lcy4gIElzIHByZXBlbmRzICJmaWxlOi8iIHRvIHdoYXRldmVyIGlzIHNwZWNpZmllZCBpbiB0aGUKLSAgICAgKiAgICBAV2ViU2VydmljZUNsaWVudC53c2RsTG9jYXRpb24gZWxlbWVudC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gd3NkbExvY2F0aW9uIFRoZSBXU0RMIGZvciB3aGljaCBhIFVSTCBpcyB3YW50ZWQKLSAgICAgKiBAcmV0dXJuIEEgVVJMIGlmIHRoZSBXU0RMIGNhbiBiZSBsb2NhdGVkLCBvciBudWxsCi0gICAgICovCi0gICAgcHJpdmF0ZSBVUkwgZ2V0V1NETFVSTChTdHJpbmcgd3NkbExvY2F0aW9uKSB7Ci0gICAgICAgIC8vIExvb2sgZm9yIHRoZSBXU0RMIGZpbGUgYXMgZm9sbG93czoKLSAgICAgICAgLy8gUHJlUmVzb2x1dGlvbikgY2hlY2sgZm9yIHhtbGNhdGFsb2cgcmVzb2x2ZXIKLSAgICAgICAgd3NkbExvY2F0aW9uID0gcmVzb2x2ZVdTRExMb2NhdGlvbkJ5Q2F0YWxvZyh3c2RsTG9jYXRpb24pOwotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIC8vIDEpIEFzIGEgcmVzb3VyY2Ugb24gdGhlIGNsYXNzcGF0aAotCi0gICAgICAgIENsYXNzTG9hZGVyIGxvYWRlciA9IGNvbXBvc2l0ZS5nZXRDbGFzc0xvYWRlcigpOwotICAgICAgICBVUkwgdXJsID0gbnVsbDsKLSAgICAgICAgaWYgKGxvYWRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB1cmwgPSBnZXRSZXNvdXJjZSh3c2RsTG9jYXRpb24sIGxvYWRlcik7IAotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBUcnkgdGhlIGNvbnRleHQgY2xhc3MgbG9hZGVyCi0gICAgICAgIGlmKHVybCA9PSBudWxsKXsKLSAgICAgICAgICAgIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyID0gZ2V0Q29udGV4dENsYXNzTG9hZGVyKG51bGwpOwotICAgICAgICAgICAgaWYoY2xhc3NMb2FkZXIgIT0gbG9hZGVyKXsKLSAgICAgICAgICAgICAgICB1cmwgPSBnZXRSZXNvdXJjZSh3c2RsTG9jYXRpb24sIGNsYXNzTG9hZGVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIDIpIEFzIGEgZnVsbHkgc3BlY2lmaWVkIFVSTAotICAgICAgICBpZiAodXJsID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiVVJMIGZvciB3c2RsIGZpbGU6ICIgKyB3c2RsTG9jYXRpb24gKyAiIGNvdWxkIG5vdCBiZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICArICJkZXRlcm1pbmVkIGJ5IGNsYXNzbG9hZGVyLi4uIGxvb2tpbmcgZm9yIGZpbGUgcmVmZXJlbmNlIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB1cmwgPSBjcmVhdGVXc2RsVVJMKHdzZGxMb2NhdGlvbik7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gMykgQXMgYSBmaWxlIG9uIHRoZSBmaWxlc3lzdGVtLiAgVGhpcyBpcyBhbmFsYWdvdXMgdG8gd2hhdCB0aGUgZ2VuZXJhdGVkCi0gICAgICAgIC8vICAgIFNlcnZpY2UgY2xpZW50IGRvZXMuICBJcyBwcmVwZW5kcyAiZmlsZTovIiB0byB3aGF0ZXZlciBpcyBzcGVjaWZpZWQgaW4gdGhlCi0gICAgICAgIC8vICAgIEBXZWJTZXJ2aWNlQ2xpZW50LndzZGxMb2NhdGlvbiBlbGVtZW50LgotICAgICAgICBpZiAodXJsID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiVVJMIGZvciB3c2RsIGZpbGU6ICIgKyB3c2RsTG9jYXRpb24gKyAiIGNvdWxkIG5vdCBiZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICArICJmb3VuZCBhcyBsb2NhbCBmaWxlIHJlZmVyZW5jZS4uLiBwcmVwZW5kaW5nIGZpbGU6IHByb3RvY29sIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBUaGlzIGNoZWNrIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIFVuaXgvTGludXggZmlsZSBwYXRocyBiZWdpbgotICAgICAgICAgICAgLy8gd2l0aCBhICcvJy4gV2hlbiBhZGRpbmcgdGhlIHByZWZpeCAnamFyOmZpbGU6Lycgd2UgbWF5IGVuZAotICAgICAgICAgICAgLy8gdXAgd2l0aCAnLy8nIGFmdGVyIHRoZSAnZmlsZTonIHBhcnQuIFRoaXMgY2F1c2VzIHRoZSBVUkwgCi0gICAgICAgICAgICAvLyBvYmplY3QgdG8gdHJlYXQgdGhpcyBsaWtlIGEgcmVtb3RlIHJlc291cmNlCi0gICAgICAgICAgICBpZih3c2RsTG9jYXRpb24uaW5kZXhPZigiLyIpID09IDApIHsKLSAgICAgICAgICAgICAgICB3c2RsTG9jYXRpb24gPSB3c2RsTG9jYXRpb24uc3Vic3RyaW5nKDEsIHdzZGxMb2NhdGlvbi5sZW5ndGgoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB1cmwgPSBjcmVhdGVXc2RsVVJMKCJmaWxlOi8iICsgd3NkbExvY2F0aW9uKTsKLQotICAgICAgICB9Ci0gICAgICAgIGlmICh1cmwgPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJVbmFibGUgdG8gb2J0YWluIFVSTCBmb3IgV1NETCBmaWxlOiAiICsgd3NkbExvY2F0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICArICIgYnkgdXNpbmcgcHJlcGVuZGVkIGZpbGU6IHByb3RvY29sIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHVybDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFVSTCBnZXRSZXNvdXJjZShmaW5hbCBTdHJpbmcgd3NkbExvY2F0aW9uLCBmaW5hbCBDbGFzc0xvYWRlciBsb2FkZXIpIHsKLSAgICAgICAgcmV0dXJuIChVUkwpIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAotICAgICAgICAgICAgICAgIG5ldyBQcml2aWxlZ2VkQWN0aW9uKCkgewotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2FkZXIuZ2V0UmVzb3VyY2Uod3NkbExvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLlNlcnZpY2VEZXNjcmlwdGlvbldTREwjZ2V0V1NETFdyYXBwZXIoKQotICAgICAqLwotICAgIHB1YmxpYyBXU0RMV3JhcHBlciBnZXRXU0RMV3JhcHBlcigpIHsKLSAgICAgICAgcmV0dXJuIHdzZGxXcmFwcGVyOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5TZXJ2aWNlRGVzY3JpcHRpb25XU0RMI2dldFdTRExMb2NhdGlvbigpCi0gICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFdTRExMb2NhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIHdzZGxVUkw7Ci0gICAgfQotCi0gICAgcHVibGljIFdTRExXcmFwcGVyIGdldEdlbmVyYXRlZFdzZGxXcmFwcGVyKCkgewotICAgICAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZWRXc2RsV3JhcHBlcjsKLSAgICB9Ci0KLSAgICB2b2lkIHNldEF4aXNDb25maWdDb250ZXh0KENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZykgewotICAgICAgICB0aGlzLmNvbmZpZ0NvbnRleHQgPSBjb25maWc7Ci0gICAgfQotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5TZXJ2aWNlRGVzY3JpcHRpb24jZ2V0QXhpc0NvbmZpZ0NvbnRleHQoKQotICAgICovCi0gICAgcHVibGljIENvbmZpZ3VyYXRpb25Db250ZXh0IGdldEF4aXNDb25maWdDb250ZXh0KCkgewotICAgICAgICBpZiAoY29uZmlnQ29udGV4dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBjb25maWdDb250ZXh0ID0gZ2V0Q2xpZW50Q29uZmlndXJhdGlvbkZhY3RvcnkoKS5nZXRDbGllbnRDb25maWd1cmF0aW9uQ29udGV4dCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjb25maWdDb250ZXh0OwotCi0gICAgfQotCi0gICAgQ2xpZW50Q29uZmlndXJhdGlvbkZhY3RvcnkgZ2V0Q2xpZW50Q29uZmlndXJhdGlvbkZhY3RvcnkoKSB7Ci0KLSAgICAgICAgaWYgKGNsaWVudENvbmZpZ0ZhY3RvcnkgPT0gbnVsbCkgewotICAgICAgICAgICAgY2xpZW50Q29uZmlnRmFjdG9yeSA9IERlc2NyaXB0aW9uRmFjdG9yeS5jcmVhdGVDbGllbnRDb25maWd1cmF0aW9uRmFjdG9yeSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjbGllbnRDb25maWdGYWN0b3J5OwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5TZXJ2aWNlRGVzY3JpcHRpb24jZ2V0U2VydmljZUNsaWVudChqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lKQotICAgICovCi0gICAgcHVibGljIFNlcnZpY2VDbGllbnQgZ2V0U2VydmljZUNsaWVudChRTmFtZSBwb3J0UU5hbWUsIE9iamVjdCBzZXJ2aWNlRGVsZWdhdGVLZXkpIHsKLSAgICAgICAgU2VydmljZUNsaWVudCByZXR1cm5TZXJ2aWNlQ2xpZW50ID0gbnVsbDsKLSAgICAgICAgaWYgKCFEZXNjcmlwdGlvblV0aWxzLmlzRW1wdHkocG9ydFFOYW1lKSkgewotICAgICAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlbmRwb2ludERlc2MgPSBnZXRFbmRwb2ludERlc2NyaXB0aW9uKHBvcnRRTmFtZSwgc2VydmljZURlbGVnYXRlS2V5KTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGVuZHBvaW50RGVzYyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuU2VydmljZUNsaWVudCA9IGVuZHBvaW50RGVzYy5nZXRTZXJ2aWNlQ2xpZW50KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBDb3VsZG4ndCBmaW5kIEVuZHBvaW50IERlc2NyaXB0aW9uIGZvciBwb3J0IFFOYW1lCi0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ291bGQgbm90IGZpbmQgcG9ydFFOYW1lOiAiICsgcG9ydFFOYW1lIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiB1bmRlciBTZXJ2aWNlRGVzY3JpcHRpb246ICIgKyB0b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAvLyBQb3J0UU5hbWUgaXMgZW1wdHkKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiUG9ydFFOYW1lIGFncnVtZW50IGlzIGludmFsaWQ7IGl0IGNhbiBub3QgYmUgbnVsbCBvciBhbiBlbXB0eSBzdHJpbmc6ICIgKyBwb3J0UU5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gcmV0dXJuU2VydmljZUNsaWVudDsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uU2VydmljZURlc2NyaXB0aW9uI2dldFNlcnZpY2VRTmFtZSgpCi0gICAgKi8KLSAgICBwdWJsaWMgUU5hbWUgZ2V0U2VydmljZVFOYW1lKCkgewotICAgICAgICAvL0l0IGlzIGFzc3VtZWQgdGhhdCB0aGlzIHdpbGwgYWx3YXlzIGJlIHNldCBpbiB0aGUgY29uc3RydWN0b3IgcmF0aGVyIHRoYW4KLSAgICAgICAgLy9idWlsdCB1cCBmcm9tIHRoZSBjbGFzcyBvciBEQkMKLSAgICAgICAgcmV0dXJuIHNlcnZpY2VRTmFtZTsKLSAgICB9Ci0KLSAgICB2b2lkIHNldFNlcnZpY2VRTmFtZShRTmFtZSB0aGVOYW1lKSB7Ci0gICAgICAgIHNlcnZpY2VRTmFtZSA9IHRoZU5hbWU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBKQVhXU0NhdGFsb2dNYW5hZ2VyIGdldENhdGFsb2dNYW5hZ2VyKCkgewotICAgIAlyZXR1cm4gY2F0YWxvZ01hbmFnZXI7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5TZXJ2aWNlRGVzY3JpcHRpb24jaXNNVE9NRW5hYmxlZChqYXZhLmxhbmcuT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzTVRPTUVuYWJsZWQoT2JqZWN0IGtleSkgewotICAgICAgICByZXR1cm4gZ2V0RGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCkuaXNNVE9NRW5hYmxlZChrZXkpOwotICAgIH0KLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLlNlcnZpY2VEZXNjcmlwdGlvbiNpc01UT01FbmFibGVkKGphdmEubGFuZy5PYmplY3QsIENsYXNzIHNlaUNsYXNzKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzTVRPTUVuYWJsZWQoT2JqZWN0IGtleSwgQ2xhc3Mgc2VpQ2xhc3MpIHsKLSAgICAgICAgaWYobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiaXNNVE9NRW5hYmxlZCwga2V5PSAiICsga2V5ICsgIiwgc2VpQ2xhc3M9ICIgKyBzZWlDbGFzcyk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGJvb2xlYW4gbXRvbUVuYWJsZWQgPSBmYWxzZTsKLSAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIHNwYXJzZUNvbXBvc2l0ZSA9IGdldERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSgpLmdldFNwYXJzZUNvbXBvc2l0ZShrZXkpOwotICAgICAgICBpZihzcGFyc2VDb21wb3NpdGUgIT0gbnVsbAotICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgICAgc2VpQ2xhc3MgIT0gbnVsbCkgewotICAgICAgICAgICAgTWFwPFN0cmluZywgQm9vbGVhbj4gc2VpVG9NVE9NID0gKE1hcDxTdHJpbmcsIEJvb2xlYW4+KSAKLSAgICAgICAgICAgICAgICBzcGFyc2VDb21wb3NpdGUuZ2V0UHJvcGVydGllcygpLmdldChNRFFDb25zdGFudHMuU0VJX01UT01fRU5BQkxFTUVOVF9NQVApOwotICAgICAgICAgICAgaWYoc2VpVG9NVE9NICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgICAgICAgICAgc2VpVG9NVE9NLmdldChzZWlDbGFzcy5nZXROYW1lKCkpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtdG9tRW5hYmxlZCA9IHNlaVRvTVRPTS5nZXQoc2VpQ2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIG10b21FbmFibGVkID0gaXNNVE9NRW5hYmxlZChrZXkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgbXRvbUVuYWJsZWQgPSBpc01UT01FbmFibGVkKGtleSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoImlzTVRPTUVuYWJsZWQsIGtleT0gIiArIGtleSArICIsIHNlaUNsYXNzPSAiICsgc2VpQ2xhc3MgKyAiLCBpc01UT01FbmFibGVkPSAiICsgbXRvbUVuYWJsZWQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtdG9tRW5hYmxlZDsKLSAgICB9Ci0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5TZXJ2aWNlRGVzY3JpcHRpb24jZ2V0QmluZGluZ1Byb3Blcml0ZXMoamF2YS5sYW5nLk9iamVjdCwgU3RyaW5nIGtleSkKLSAgICAgKi8KLSAgICBwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiBnZXRCaW5kaW5nUHJvcGVydGllcyhPYmplY3Qgc2VydmljZURlbGVnYXRlS2V5LCBTdHJpbmcga2V5KSB7Ci0gICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoImdldEJpbmRpbmdQcm9wZXJ0aWVzLCBzZXJ2aWNlRGVsZWdhdGVLZXk9ICIgKyBzZXJ2aWNlRGVsZWdhdGVLZXkgKyAKLSAgICAgICAgICAgICAgICAgICAgICAiLCBrZXk9ICIgKyBrZXkpOwotICAgICAgICB9Ci0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBiaW5kaW5nUHJvcHMgPSBudWxsOwotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgc3BhcnNlQ29tcG9zaXRlID0gZ2V0RGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCkuZ2V0U3BhcnNlQ29tcG9zaXRlKHNlcnZpY2VEZWxlZ2F0ZUtleSk7Ci0gICAgICAgIGlmKHNwYXJzZUNvbXBvc2l0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLCBPYmplY3Q+PiBhbGxCaW5kaW5nUHJvcHMgPSAoTWFwPFN0cmluZywgTWFwPFN0cmluZywgT2JqZWN0Pj4pIAotICAgICAgICAgICAgICAgIHNwYXJzZUNvbXBvc2l0ZS5nZXRQcm9wZXJ0aWVzKCkuZ2V0KE1EUUNvbnN0YW50cy5CSU5ESU5HX1BST1BTX01BUCk7Ci0gICAgICAgICAgICBiaW5kaW5nUHJvcHMgPSBhbGxCaW5kaW5nUHJvcHMgIT0gbnVsbCA/IChNYXA8U3RyaW5nLCBPYmplY3Q+KSBhbGxCaW5kaW5nUHJvcHMuZ2V0KGtleSkgOiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiZ2V0QmluZGluZ1Byb3BlcnRpZXMsIHNlcnZpY2VEZWxlZ2F0ZUtleT0gIiArIHNlcnZpY2VEZWxlZ2F0ZUtleSArIAotICAgICAgICAgICAgICAgICAgICAgICIsIGtleT0gIiArIGtleSArICIsIHByb3BzU2l6ZT0gIiArIChiaW5kaW5nUHJvcHMgIT0gbnVsbCA/IGJpbmRpbmdQcm9wcy5zaXplKCkgOiAwKSk7Ci0gICAgICAgIH0gICAgCi0KLSAgICAgICAgcmV0dXJuIGJpbmRpbmdQcm9wczsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLlNlcnZpY2VEZXNjcmlwdGlvbiNnZXRQcmVmZXJyZWRQb3J0KGphdmEubGFuZy5PYmplY3QpCi0gICAgICovCi0gICAgcHVibGljIFFOYW1lIGdldFByZWZlcnJlZFBvcnQoT2JqZWN0IGtleSkgewotICAgICAgICByZXR1cm4gZ2V0RGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCkuZ2V0UHJlZmVycmVkUG9ydChrZXkpOwotICAgIH0KLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLlNlcnZpY2VEZXNjcmlwdGlvbiNpc1NlcnZlclNpZGUoKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzU2VydmVyU2lkZSgpIHsKLSAgICAgICAgcmV0dXJuIGlzU2VydmVyU2lkZTsKLSAgICB9Ci0KLSAgICBIYXNoTWFwPFN0cmluZywgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlPiBnZXREQkNNYXAoKSB7Ci0gICAgICAgIHJldHVybiBkYmNNYXA7Ci0gICAgfQotCi0gICAgdm9pZCBzZXRHZW5lcmF0ZWRXc2RsV3JhcHBlcihXU0RMNEpXcmFwcGVyIHdyYXBwZXIpIHsKLSAgICAgICAgdGhpcy5nZW5lcmF0ZWRXc2RsV3JhcHBlciA9IHdyYXBwZXI7Ci0gICAgfQotCi0gICAgdm9pZCBzZXRXc2RsV3JhcHBlcihXU0RMNEpXcmFwcGVyIHdyYXBwZXIpIHsKLSAgICAgICAgdGhpcy53c2RsV3JhcHBlciA9IHdyYXBwZXI7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlREJDTEludGVncml0eSgpIHsKLQotICAgICAgICAvL0ZpcnN0LCBjaGVjayB0aGUgaW50ZWdyaXR5IG9mIHRoaXMgaW5wdXQgY29tcG9zaXRlCi0gICAgICAgIC8vYW5kIHJldHJpZXZlCi0gICAgICAgIC8vdGhlIGNvbXBvc2l0ZSB0aGF0IHJlcHJlc2VudHMgdGhpcyBpbXBsCi0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHZhbGlkYXRlSW50ZWdyaXR5KCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbigKLSAgICAgICAgICAgIAkJTWVzc2FnZXMuZ2V0TWVzc2FnZSgiZGJjbEludGVncml0eUVyciIsZXgudG9TdHJpbmcoKSxjb21wb3NpdGUudG9TdHJpbmcoKSksIGV4KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICAqIFZhbGlkYXRlcyB0aGUgaW50ZWdyaXR5IG9mIGFuIGltcGwuIGNsYXNzLiBUaGlzIHNob3VsZCBub3QgYmUgY2FsbGVkIGRpcmVjdGx5IGZvciBhbiBTRUkgY29tcG9zaXRlCi0gICAgICAqLwotICAgIHZvaWQgdmFsaWRhdGVJbnRlZ3JpdHkoKSB7Ci0gICAgICAgIC8vSW4gR2VuZXJhbCwgdGhpcyBpbnRlZ3JpdHkgY2hlY2tlciBzaG91bGQgZG8gZ3Jvc3MgbGV2ZWwgY2hlY2tpbmcKLSAgICAgICAgLy9JdCBzaG91bGQgbm90IGJlIHNldHRpbmcgc3BlYy1kZWZpbmVkIGRlZmF1bHQgdmFsdWVzLCBidXQgY2FuIGxvb2sKLSAgICAgICAgLy9hdCB0aGluZ3MgbGlrZSBlbXB0eSBzdHJpbmdzIG9yIG51bGwgdmFsdWVzCi0KLSAgICAgICAgLy9WZXJpZnkgdGhhdCwgaWYgdGhpcyBpbXBsZW1lbnRzIGEgc3Ryb25nbHkgdHlwZWQgcHJvdmlkZXIgaW50ZXJmYWNlLCB0aGF0IGl0Ci0gICAgICAgIC8vIGFsc28gY29udGFpbiBhIFdlYlNlcnZpY2VQcm92aWRlciBhbm5vdGF0aW9uIHBlciBKQVhXUyBTZWMuIDUuMQotICAgICAgICBJdGVyYXRvcjxTdHJpbmc+IGl0ZXIgPQotICAgICAgICAgICAgICAgIGNvbXBvc2l0ZS5nZXRJbnRlcmZhY2VzTGlzdCgpLml0ZXJhdG9yKCk7Ci0KLSAgICAgICAgLy8gUmVtZW1iZXIgaWYgd2UndmUgdmFsaWRhdGVkIHRoZSBQcm92aWRlciBpbnRlcmZhY2UuICBMYXRlciB3ZSdsbCBtYWtlIHN1cmUgdGhhdCBpZiB3ZSBoYXZlIGFuIAotICAgICAgICAvLyBXZWJTZXJ2aWNlUHJvdmlkZXIgYW5ub3RhdGlvbiwgd2UgZm91bmQgYSB2YWxpZCBpbnRlcmZhY2UgaGVyZS4KLSAgICAgICAgYm9vbGVhbiBwcm92aWRlckludGVyZmFjZVZhbGlkID0gZmFsc2U7Ci0gICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgU3RyaW5nIGludGVyZmFjZVN0cmluZyA9IGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgaWYgKGludGVyZmFjZVN0cmluZy5lcXVhbHMoTURRQ29uc3RhbnRzLlBST1ZJREVSX1NPVVJDRSkKLSAgICAgICAgICAgICAgICAgICAgfHwgaW50ZXJmYWNlU3RyaW5nLmVxdWFscyhNRFFDb25zdGFudHMuUFJPVklERVJfU09BUCkKLSAgICAgICAgICAgICAgICAgICAgfHwgaW50ZXJmYWNlU3RyaW5nLmVxdWFscyhNRFFDb25zdGFudHMuUFJPVklERVJfREFUQVNPVVJDRSkKLSAgICAgICAgICAgICAgICAgICAgfHwgaW50ZXJmYWNlU3RyaW5nLmVxdWFscyhNRFFDb25zdGFudHMuUFJPVklERVJfU1RSSU5HKQotICAgICAgICAgICAgICAgICAgICB8fCBpbnRlcmZhY2VTdHJpbmcuZXF1YWxzKE1EUUNvbnN0YW50cy5QUk9WSURFUl9PTUVMRU1FTlQpKSB7Ci0gICAgICAgICAgICAgICAgcHJvdmlkZXJJbnRlcmZhY2VWYWxpZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgLy9UaGlzIGlzIGEgcHJvdmlkZXIgYmFzZWQgZW5kcG9pbnQsIG1ha2Ugc3VyZSB0aGUgYW5ub3RhdGlvbiBleGlzdHMKLSAgICAgICAgICAgICAgICBpZiAoY29tcG9zaXRlLmdldFdlYlNlcnZpY2VQcm92aWRlckFubm90KCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAJCU1lc3NhZ2VzLmdldE1lc3NhZ2UoInZhbGlkYXRlSW50ZWdyaXR5RXJyMSIsY29tcG9zaXRlLmdldENsYXNzTmFtZSgpKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy9WZXJpZnkgdGhhdCBXZWJTZXJ2aWNlIGFuZCBXZWJTZXJ2aWNlUHJvdmlkZXIgYXJlIG5vdCBib3RoIHNwZWNpZmllZAotICAgICAgICAvL3BlciBKQVhXUyAtIFNlYy4gNy43Ci0gICAgICAgIGlmIChjb21wb3NpdGUuZ2V0V2ViU2VydmljZUFubm90KCkgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgIGNvbXBvc2l0ZS5nZXRXZWJTZXJ2aWNlUHJvdmlkZXJBbm5vdCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oCi0gICAgICAgICAgICAJCU1lc3NhZ2VzLmdldE1lc3NhZ2UoInZhbGlkYXRlSW50ZWdyaXR5RXJyMiIsY29tcG9zaXRlLmdldENsYXNzTmFtZSgpKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY29tcG9zaXRlLmdldFdlYlNlcnZpY2VQcm92aWRlckFubm90KCkgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKCFwcm92aWRlckludGVyZmFjZVZhbGlkKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAJCU1lc3NhZ2VzLmdldE1lc3NhZ2UoInZhbGlkYXRlSW50ZWdyaXR5RXJyMyIsY29tcG9zaXRlLmdldENsYXNzTmFtZSgpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBUaGVyZSBtdXN0IGJlIGEgcHVibGljIGRlZmF1bHQgY29uc3RydWN0b3IgcGVyIEpBWFdTIC0gU2VjIDUuMQotICAgICAgICAgICAgaWYgKCF2YWxpZGF0ZURlZmF1bHRDb25zdHJ1Y3RvcigpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAJCU1lc3NhZ2VzLmdldE1lc3NhZ2UoInZhbGlkYXRlSW50ZWdyaXR5RXJyNCIsY29tcG9zaXRlLmdldENsYXNzTmFtZSgpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBUaGVyZSBtdXN0IGJlIGFuIGludm9rZSBtZXRob2QgcGVyIEpBWFdTIC0gU2VjIDUuMS4xCi0gICAgICAgICAgICBpZiAoIXZhbGlkYXRlSW52b2tlTWV0aG9kKCkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgIAkJTWVzc2FnZXMuZ2V0TWVzc2FnZSgidmFsaWRhdGVJbnRlZ3JpdHlFcnI1Iixjb21wb3NpdGUuZ2V0Q2xhc3NOYW1lKCkpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy9JZiBTZXJ2aWNlTW9kZSBhbm5vdGF0aW9uIHNwZWNpZmllcyAncGF5bG9hZCcsIHRoZW4gbWFrZSBzdXJlIHRoYXQgaXQgaXMgbm90IHR5cGVkIHdpdGgKLSAgICAgICAgICAgIC8vIFNPQVBNZXNzYWdlIG9yIERhdGFTb3VyY2UKLSAgICAgICAgICAgIHZhbGlkYXRlUHJvdmlkZXJJbnRlcmZhY2VzKCk7Ci0KLSAgICAgICAgfSBlbHNlIGlmIChjb21wb3NpdGUuZ2V0V2ViU2VydmljZUFubm90KCkgIT0gbnVsbCkgewotCi0gICAgICAgICAgICBpZiAoY29tcG9zaXRlLmdldFNlcnZpY2VNb2RlQW5ub3QoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAJCU1lc3NhZ2VzLmdldE1lc3NhZ2UoInZhbGlkYXRlSW50ZWdyaXR5RXJyNiIsY29tcG9zaXRlLmdldENsYXNzTmFtZSgpKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghY29tcG9zaXRlLmlzSW50ZXJmYWNlKCkpIHsKLSAgICAgICAgICAgICAgICAvLyBUT0RPOiBWYWxpZGF0ZSBvbiB0aGUgY2xhc3MgdGhhdCB0aGlzLmNsYXNzTW9kaWZpZXJzIEFycmF5IGRvZXMgbm90IGNvbnRhaW4gdGhlIHN0cmluZ3MKLSAgICAgICAgICAgICAgICAvLyAgICAgICAgRklOQUwgb3IgQUJTVFJBQ1QsIGJ1dCBkb2VzIGNvbnRhaW4gUFVCTElDCi0gICAgICAgICAgICAgICAgLy8gVE9ETzogVmFsaWRhdGUgb24gdGhlIGNsYXNzIHRoYXQgYSBwdWJsaWMgY29uc3RydWN0b3IgZXhpc3RzCi0gICAgICAgICAgICAgICAgLy8gVE9ETzogVmFsaWRhdGUgb24gdGhlIGNsYXNzIHRoYXQgYSBmaW5hbGl6ZSgpIG1ldGhvZCBkb2VzIG5vdCBleGlzdAotICAgICAgICAgICAgICAgIGlmICghRGVzY3JpcHRpb25VdGlscy5pc0VtcHR5KGNvbXBvc2l0ZS5nZXRXZWJTZXJ2aWNlQW5ub3QoKS53c2RsTG9jYXRpb24oKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBvc2l0ZS5nZXRXc2RsRGVmaW5pdGlvbihnZXRTZXJ2aWNlUU5hbWUoKSkgPT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9zaXRlLmdldFdzZGxEZWZpbml0aW9uKCkgPT0gbnVsbCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvc2l0ZS5nZXRXc2RsVVJMKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgIAkJTWVzc2FnZXMuZ2V0TWVzc2FnZSgidmFsaWRhdGVJbnRlZ3JpdHlFcnI3Iixjb21wb3NpdGUuZ2V0Q2xhc3NOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAJCQkJY29tcG9zaXRlLmdldFdlYlNlcnZpY2VBbm5vdCgpLndzZGxMb2NhdGlvbigpKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLwkJc2V0V2ViU2VydmljZUFubm90RGVmYXVsdHModHJ1ZT1pbXBsKTsgTXVzdCBoYXBwZW4gYmVmb3JlIHdlIHN0YXJ0IGNoZWNraW5nIGFubm90Ci0gICAgICAgICAgICAgICAgaWYgKCFEZXNjcmlwdGlvblV0aWxzLmlzRW1wdHkoY29tcG9zaXRlLmdldFdlYlNlcnZpY2VBbm5vdCgpLmVuZHBvaW50SW50ZXJmYWNlKCkpKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIHNlaWMgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRiY01hcC5nZXQoY29tcG9zaXRlLmdldFdlYlNlcnZpY2VBbm5vdCgpLmVuZHBvaW50SW50ZXJmYWNlKCkpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vVmVyaWZ5IHRoYXQgd2UgY2FuIGZpbmQgdGhlIFNFSSBpbiB0aGUgY29tcG9zaXRlIGxpc3QKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNlaWMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgIAkJTWVzc2FnZXMuZ2V0TWVzc2FnZSgidmFsaWRhdGVJbnRlZ3JpdHlFcnI4Iixjb21wb3NpdGUuZ2V0Q2xhc3NOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAJCQkJY29tcG9zaXRlLmdldFdlYlNlcnZpY2VBbm5vdCgpLmVuZHBvaW50SW50ZXJmYWNlKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8vIFZlcmlmeSB0aGF0IHRoZSBvbmx5IGNsYXNzIGFubm90YXRpb25zIGFyZSBXZWJTZXJ2aWNlIGFuZCBIYW5kbGVyQ2hhaW4KLSAgICAgICAgICAgICAgICAgICAgLy8gKHBlciBKU1IxODEgU2VjLiAzLjEpLiAgTm90ZSB0aGF0IHRoaXMgYXBwbGllcyB0byBKU1ItMTgxIGFubm90YXRpb25zOyB0aGUgcmVzdHJpY3Rpb24KLSAgICAgICAgICAgICAgICAgICAgLy8gZG9lcyBub3QgYXBwbHkgdG8gSlNSLTIyNCBhbm5vdGF0aW9ucyBzdWNoIGFzIEJpbmRpbmdUeXBlCi0gICAgICAgICAgICAgICAgICAgIGlmIChjb21wb3NpdGUuZ2V0U29hcEJpbmRpbmdBbm5vdCgpICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBjb21wb3NpdGUuZ2V0V2ViRmF1bHRBbm5vdCgpICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBjb21wb3NpdGUuZ2V0V2ViU2VydmljZUNsaWVudEFubm90KCkgIT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgIAkJTWVzc2FnZXMuZ2V0TWVzc2FnZSgidmFsaWRhdGVJbnRlZ3JpdHlFcnI5Iixjb21wb3NpdGUuZ2V0Q2xhc3NOYW1lKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8vVmVyaWZ5IHRoYXQgV2ViU2VydmljZSBhbm5vdGF0aW9uIGRvZXMgbm90IGNvbnRhaW4gYSBuYW1lIGF0dHJpYnV0ZQotICAgICAgICAgICAgICAgICAgICAvLyhwZXIgSlNSMTgxIFNlYy4gMy4xKQotICAgICAgICAgICAgICAgICAgICBpZiAoIURlc2NyaXB0aW9uVXRpbHMuaXNFbXB0eShjb21wb3NpdGUuZ2V0V2ViU2VydmljZUFubm90KCkubmFtZSgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgIAkJTWVzc2FnZXMuZ2V0TWVzc2FnZSgidmFsaWRhdGVJbnRlZ3JpdHlFcnIxMCIsY29tcG9zaXRlLmdldENsYXNzTmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgCQkJCWNvbXBvc2l0ZS5nZXRXZWJTZXJ2aWNlQW5ub3QoKS5uYW1lKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlU0VJKHNlaWMpOwotICAgICAgICAgICAgICAgICAgICAvL1ZlcmlmeSB0aGF0IHRoYXQgdGhpcyBpbXBsZW1lbnRhdGlvbiBjbGFzcyBpbXBsZW1lbnRzIGFsbCBtZXRob2RzIGluIHRoZSBpbnRlcmZhY2UKLSAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVJbXBsZW1lbnRhdGlvbihzZWljKTsKLQotICAgICAgICAgICAgICAgICAgICAvL1ZlcmlmeSB0aGF0IHRoaXMgaW1wbC4gY2xhc3MgZG9lcyBub3QgY29udGFpbiBhbnkgQFdlYk1ldGhvZCBhbm5vdGF0aW9ucwotICAgICAgICAgICAgICAgICAgICBpZiAod2ViTWV0aG9kQW5ub3RhdGlvbnNFeGlzdCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgCQlNZXNzYWdlcy5nZXRNZXNzYWdlKCJ2YWxpZGF0ZUludGVncml0eUVycjExIixjb21wb3NpdGUuZ2V0Q2xhc3NOYW1lKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0KLSAgICAgICAgICAgICAgICB9IGVsc2UgeyAvL3RoaXMgaXMgYW4gaW1wbGljaXQgU0VJIChpLmUuIGltcGwgdy9vdXQgZW5kcG9pbnRJbnRlcmZhY2UKLQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgY2hlY2tJbXBsaWNpdFNFSUFnYWluc3RXU0RMKCk7Ci0gICAgICAgICAgICAgICAgICAgIC8vCVRPRE86CUNhbGwgVmFsaWRhdGVXZWJNZXRob2RBbm5vdHMoKQotICAgICAgICAgICAgICAgICAgICAvLwkJCS0gdGhpcyBtZXRob2Qgd2lsbCBjaGVjayB0aGF0IGFsbCBtZXRob2RzIGFyZSBwdWJsaWMgLSA/Pz8KLSAgICAgICAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgeyAvL3RoaXMgaXMgYW4gaW50ZXJmYWNlLi4ud2Ugc2hvdWxkIG5vdCBiZSBwcm9jZXNzaW5nIGludGVyZmFjZXMgaGVyZQotICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgCQlNZXNzYWdlcy5nZXRNZXNzYWdlKCJ2YWxpZGF0ZUludGVncml0eUVycjEyIixjb21wb3NpdGUuZ2V0Q2xhc3NOYW1lKCkpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gVmVyaWZ5IHRoYXQgdGhlIFNPQVBCaW5kaW5nIGFubm90YXRpb25zIGFyZSBzdXBwb3J0ZWQuCi0gICAgICAgICAgICBpZiAoY29tcG9zaXRlLmdldFNvYXBCaW5kaW5nQW5ub3QoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbXBvc2l0ZS5nZXRTb2FwQmluZGluZ0Fubm90KCkudXNlKCkgPT0gamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuVXNlLkVOQ09ERUQpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgCQlNZXNzYWdlcy5nZXRNZXNzYWdlKCJ2YWxpZGF0ZUludGVncml0eUVycjEzIixjb21wb3NpdGUuZ2V0Q2xhc3NOYW1lKCkpKTsgIAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgY2hlY2tNZXRob2RzQWdhaW5zdFdTREwoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFZhbGlkYXRlIHRoZXJlIGlzIGFuIGludm9rZSBtZXRob2Qgb24gdGhlIGNvbXBvc2l0ZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gdmFsaWRhdGVJbnZva2VNZXRob2QoKSB7Ci0gICAgICAgIGJvb2xlYW4gdmFsaWRJbnZva2VNZXRob2QgPSBmYWxzZTsKLSAgICAgICAgTGlzdDxNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZT4gaW52b2tlTWV0aG9kTGlzdCA9Ci0gICAgICAgICAgICAgICAgY29tcG9zaXRlLmdldE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlKCJpbnZva2UiKTsKLSAgICAgICAgaWYgKGludm9rZU1ldGhvZExpc3QgIT0gbnVsbCAmJiAhaW52b2tlTWV0aG9kTGlzdC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIHZhbGlkSW52b2tlTWV0aG9kID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdmFsaWRJbnZva2VNZXRob2Q7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVmFsaWRhdGUgdGhhdCwgaWYgdXNpbmcgUEFZTE9BRCBtb2RlLCB0aGVuIGludGVyZmFjZXMgbGlzdCBjYW5ub3QgY29udGFpbiBTT0FQTWVzc2FnZSBvcgotICAgICAqIERhdGFTb3VyY2UKLSAgICAgKgotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVQcm92aWRlckludGVyZmFjZXMoKSB7Ci0KLSAgICAgICAgLy8gRGVmYXVsdCBmb3IgU2VydmljZU1vZGUgaXMgJ1BBWUxPQUQnLiBTbywgaWYgaXQgaXMgc3BlY2lmaWVkICAoZXhwbGljaXRseSBvcgotICAgICAgICAvLyBpbXBsaWNpdGx5KSB0aGVuIHZlcmlmeSB0aGF0IHdlIGFyZSBub3QgaW1wbGVtZW50aW5nIGltcHJvcGVyIGludGVyZmFjZXMpCi0gICAgICAgIGlmICgoY29tcG9zaXRlLmdldFNlcnZpY2VNb2RlQW5ub3QoKSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHx8IGNvbXBvc2l0ZS5nZXRTZXJ2aWNlTW9kZUFubm90KCkudmFsdWUoKSA9PSBqYXZheC54bWwud3MuU2VydmljZS5Nb2RlLlBBWUxPQUQpIHsKLQotICAgICAgICAgICAgSXRlcmF0b3I8U3RyaW5nPiBpdGVyID0gY29tcG9zaXRlLmdldEludGVyZmFjZXNMaXN0KCkuaXRlcmF0b3IoKTsKLQotICAgICAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGludGVyZmFjZVN0cmluZyA9IGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgIGlmIChpbnRlcmZhY2VTdHJpbmcuZXF1YWxzKE1EUUNvbnN0YW50cy5QUk9WSURFUl9TT0FQKQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgaW50ZXJmYWNlU3RyaW5nLmVxdWFscyhNRFFDb25zdGFudHMuUFJPVklERVJfREFUQVNPVVJDRSkpIHsKLSAgICAgICAgICAgICAgICAJCi0gICAgICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIAkJTWVzc2FnZXMuZ2V0TWVzc2FnZSgidmFsaWRhdGVQSXNFcnIxIixjb21wb3NpdGUuZ2V0Q2xhc3NOYW1lKCkpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFdlIGFyZSBpbiBNRVNTQUdFIG1vZGUKLSAgICAgICAgICAgIC8vIENvbmZvcm1hbmNlOiBKQVhXUyBTcGVjLi0gU2VjLiA0LjMgKGphdmF4LmFjdGl2YXRpb24uRGF0YVNvdXJjZSkKLQotICAgICAgICAgICAgLy8gUkVWSUVXOiBTaG91bGQgdGhlIHByb3ZpZGVyIGludGVyZmFjZSB2YWxpZGF0aW9uIGJlIG1vdmVkIHRvIHBvc3QtY29uc3RydWN0aW9uIHZhbGlkYXRpb24sIAotICAgICAgICAgICAgLy8gc2luY2UgaXQgc2VlbXMgdGhhdCB0aGUgbG9naWMgdG8gdW5kZXJzdGFuZCB0aGUgZGVmYXVsdCB2YWx1ZXMgZm9yIGJpbmRpbmcgdHlwZSAKLSAgICAgICAgICAgIC8vIChzZWUgY29tbWVudCBiZWxvdykgc2hvdWxkIGJlIGxlZnQgdG8gdGhlIGNyZWF0aW9uIG9mIHRoZSBEZXNjcmlwdGlvbiBvYmplY3RzLgotICAgICAgICAgICAgU3RyaW5nIGJpbmRpbmdUeXBlID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChjb21wb3NpdGUuZ2V0QmluZGluZ1R5cGVBbm5vdCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBiaW5kaW5nVHlwZSA9IGNvbXBvc2l0ZS5nZXRCaW5kaW5nVHlwZUFubm90KCkudmFsdWUoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgSXRlcmF0b3I8U3RyaW5nPiBpdGVyID0gY29tcG9zaXRlLmdldEludGVyZmFjZXNMaXN0KCkuaXRlcmF0b3IoKTsKLQotICAgICAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGludGVyZmFjZVN0cmluZyA9IGl0ZXIubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgaWYgKGludGVyZmFjZVN0cmluZy5lcXVhbHMoTURRQ29uc3RhbnRzLlBST1ZJREVSX1NPQVApKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIEJpbmRpbmdUeXBlIGlzIFNPQVAvSFRUUCB3aXRoIFNPQVBNZXNzYWdlCi0JCQkJCS8vIG9iamVjdCwgRGVmYXVsdCBmb3IgQmluZGluZyBUeXBlIGlzIFNPQVAvSFRUUAotCQkJCQlpZiAoIURlc2NyaXB0aW9uVXRpbHMuaXNFbXB0eShiaW5kaW5nVHlwZSkKLQkJCQkJCQkmJiAhYmluZGluZ1R5cGUKLQkJCQkJCQkJCS5lcXVhbHMoU09BUEJpbmRpbmcuU09BUDExSFRUUF9CSU5ESU5HKQotCQkJCQkJCSYmICFiaW5kaW5nVHlwZQotCQkJCQkJCQkJLmVxdWFscyhTT0FQQmluZGluZy5TT0FQMTFIVFRQX01UT01fQklORElORykKLQkJCQkJCQkmJiAhYmluZGluZ1R5cGUKLQkJCQkJCQkJCS5lcXVhbHMoU09BUEJpbmRpbmcuU09BUDEySFRUUF9CSU5ESU5HKQotCQkJCQkJCSYmICFiaW5kaW5nVHlwZQotCQkJCQkJCQkJLmVxdWFscyhTT0FQQmluZGluZy5TT0FQMTJIVFRQX01UT01fQklORElORykKLQkJCQkJCQkmJiAhYmluZGluZ1R5cGUKLQkJCQkJCQkJCS5lcXVhbHMoTURRQ29uc3RhbnRzLlNPQVAxMUpNU19CSU5ESU5HKQotCQkJCQkJCSYmICFiaW5kaW5nVHlwZQotCQkJCQkJCQkJLmVxdWFscyhNRFFDb25zdGFudHMuU09BUDExSk1TX01UT01fQklORElORykKLQkJCQkJCQkmJiAhYmluZGluZ1R5cGUKLQkJCQkJCQkJCS5lcXVhbHMoTURRQ29uc3RhbnRzLlNPQVAxMkpNU19CSU5ESU5HKQotCQkJCQkJCSYmICFiaW5kaW5nVHlwZQotCQkJCQkJCQkJLmVxdWFscyhNRFFDb25zdGFudHMuU09BUDEySk1TX01UT01fQklORElORykKLQkJCQkJCQkmJiAhYmluZGluZ1R5cGUKLQkJCQkJCQkgICAgICAgIC5lcXVhbHMoTURRQ29uc3RhbnRzLlNPQVBfSFRUUF9CSU5ESU5HKSkKLQotCQkJCQkJdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcwotCQkJCQkJCQkuZ2V0TWVzc2FnZSgidmFsaWRhdGVQSXNFcnIyIiwgY29tcG9zaXRlCi0JCQkJCQkJCQkJLmdldENsYXNzTmFtZSgpKSk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpbnRlcmZhY2VTdHJpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgIC5lcXVhbHMoTURRQ29uc3RhbnRzLlBST1ZJREVSX0RBVEFTT1VSQ0UpKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIEJpbmRpbmdUeXBlIGlzIFhNTC9IVFRQIHdpdGggRGF0YVNvdXJjZSBvYmplY3QKLSAgICAgICAgICAgICAgICAgICAgaWYgKERlc2NyaXB0aW9uVXRpbHMuaXNFbXB0eShiaW5kaW5nVHlwZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAhYmluZGluZ1R5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKGphdmF4LnhtbC53cy5odHRwLkhUVFBCaW5kaW5nLkhUVFBfQklORElORykpCi0gICAgICAgICAgICAgICAgICAgIAkKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAJCU1lc3NhZ2VzLmdldE1lc3NhZ2UoInZhbGlkYXRlUElzRXJyMyIsY29tcG9zaXRlLmdldENsYXNzTmFtZSgpKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBWYWxpZGF0ZSB0aGVyZSBpcyBhIGRlZmF1bHQgbm8tYXJndW1lbnQgY29uc3RydWN0b3Igb24gdGhlIGNvbXBvc2l0ZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gdmFsaWRhdGVEZWZhdWx0Q29uc3RydWN0b3IoKSB7Ci0gICAgICAgIGJvb2xlYW4gdmFsaWREZWZhdWx0Q3RvciA9IGZhbHNlOwotICAgICAgICBMaXN0PE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlPiBjb25zdHJ1Y3Rvckxpc3QgPQotICAgICAgICAgICAgICAgIGNvbXBvc2l0ZS5nZXRNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSgiPGluaXQ+Iik7Ci0gICAgICAgIGlmIChjb25zdHJ1Y3Rvckxpc3QgIT0gbnVsbCAmJiAhY29uc3RydWN0b3JMaXN0LmlzRW1wdHkoKSkgewotICAgICAgICAgICAgLy8gVGhlcmUgYXJlIHB1YmxpYyBjb25zdHJ1Y3RvcnM7IG1ha2Ugc3VyZSB0aGVyZSBpcyBvbmUgdGhhdCB0YWtlcyBubyBhcmd1bWVudHMuCi0gICAgICAgICAgICBmb3IgKE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlIGNoZWNrQ3RvciA6IGNvbnN0cnVjdG9yTGlzdCkgewotICAgICAgICAgICAgICAgIExpc3Q8UGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGU+IHBhcmFtTGlzdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaGVja0N0b3IuZ2V0UGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGVMaXN0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKHBhcmFtTGlzdCA9PSBudWxsIHx8IHBhcmFtTGlzdC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgdmFsaWREZWZhdWx0Q3RvciA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB2YWxpZERlZmF1bHRDdG9yOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZUltcGxlbWVudGF0aW9uKERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBzZWljKSB7Ci0gICAgICAgIC8qCi0gICAgICAgICAqICBWZXJpZnkgdGhhdCBhbiBpbXBsIGNsYXNzIGltcGxlbWVudHMgYWxsIHRoZSBtZXRob2RzIG9mIHRoZSBTRUkuIFdlIGhhdmUgdG8gdmVyaWZ5IHRoaXMgCi0gICAgICAgICAqICBiZWNhdXNlIGFuIGltcGwgY2xhc3MgaXMgbm90IHJlcXVpcmVkIHRvIGFjdHVhbGx5IHVzZSB0aGUgJ2ltcGxlbWVudHMnIGNsYXVzZS4gU28sIGlmIAotICAgICAgICAgKiAgaXQgZG9lc24ndCwgdGhlIEphdmEgY29tcGlsZXIgd29uJ3QgY2F0Y2ggaXQuIERvbid0IG5lZWQgdG8gd29ycnkgYWJvdXQgY2hhaW5pbmcgCi0gICAgICAgICAqICBiZWNhdXNlIG9ubHkgb25lIEVuZHBvaW50SW50ZXJmYWNlIGNhbiBiZSBzcGVjaWZpZWQsIGFuZCB0aGUgU0VJIGNhbm5vdCBzcGVjaWZ5IGFuIAotICAgICAgICAgKiAgRW5kcG9pbnRJbnRlcmZhY2UsIHNvIHRoZSBKYXZhIGNvbXBpbGVyIHdpbGwgdGFrZSBjYXJlIG9mIGV2ZXJ5dGhpbmcgZWxzZS4KLSAgICAgICAgICogIAotICAgICAgICAgKiAgTm90ZSwgaG93ZXZlciwgdGhhdCB3ZSBkbyBuZWVkIHRvIHRha2Ugb3ZlcmxvYWRlZCBtZXRob2RzIGludG8gYSBjb25zaWRlcmF0aW9uLiAgVGhlCi0gICAgICAgICAqICBzYW1lIG1ldGhvZCBuYW1lIGNhbiBiZSBzcGVjaWZpZWQgZm9yIG11bHRpcGxlIG1ldGhvZHMsIGJ1dCB0aGV5IGNhbiBoYXZlIGRpZmZlcmVudAotICAgICAgICAgKiAgcGFyYW1ldGVycy4gIE5vdGUgdGhhdCBtZXRob2RzIHdoaWNoIGRpZmZlciBvbmx5IGluIHRoZSByZXR1cm4gdHlwZSBvciB0aGUgZXhjZXB0aW9ucwotICAgICAgICAgKiAgdGhyb3duIGFyZSBub3Qgb3ZlcmxvYWRlZCAoYW5kIHRoZXJlZm9yZSB3b3VsZCBjYXVzZSBhIGNvbXBpbGUgZXJyb3IpLgotICAgICAgICAgKi8KLQotICAgICAgICBMaXN0PE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlPiBpbXBsTWV0aG9kcyA9IGNvbXBvc2l0ZS5nZXRNZXRob2REZXNjcmlwdGlvbnNMaXN0KCk7Ci0gICAgICAgIC8vIEFkZCBtZXRob2RzIGRlY2xhcmVkIGluIHRoZSBpbXBsZW1lbnRhdGlvbidzIHN1cGVyY2xhc3MKLSAgICAgICAgYWRkU3VwZXJDbGFzc01ldGhvZHMoaW1wbE1ldGhvZHMsIGNvbXBvc2l0ZSk7Ci0KLSAgICAgICAgTGlzdDxNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZT4gc2VpTWV0aG9kcyA9IHNlaWMuZ2V0TWV0aG9kRGVzY3JpcHRpb25zTGlzdCgpOwotICAgICAgICAvLyBBZGQgYW55IG1ldGhvZHMgZGVjbGFyZWQgaW4gc3VwZXJpbnRlcmZhY2VzIG9mIHRoZSBTRUkKLSAgICAgICAgYWRkU3VwZXJDbGFzc01ldGhvZHMoc2VpTWV0aG9kcywgc2VpYyk7Ci0KLSAgICAgICAgLy8gTWFrZSBzdXJlIGFsbCB0aGUgbWV0aG9kcyBpbiB0aGUgU0VJIChpbmNsdWRpbmcgYW55IGluaGVyaXRlZCBmcm9tIHN1cGVyaW50ZXJmYWNlcykgYXJlCi0gICAgICAgIC8vIGltcGxlbWVudGVkIGJ5IHRoZSBiZWFuIChpbmNsdWRpbmcgaW5oZXJpdGVkIG1ldGhvZHMgb24gdGhlIGJlYW4pLCB0YWtpbmcgaW50bwotICAgICAgICAvLyBhY2NvdW50IG92ZXJsb2FkZWQgbWV0aG9kcy4KLSAgICAgICAgSXRlcmF0b3I8TWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGU+IHZlcmlmeVNFSUl0ZXJhdG9yID0gc2VpTWV0aG9kcy5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAodmVyaWZ5U0VJSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSBzZWlNREMgPSB2ZXJpZnlTRUlJdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgaW1wbGVtZW50YXRpb24gaW1wbGVtZW50cyB0aGlzIFNFSSBtZXRob2QuICBTaW5jZSB3ZSBoYXZlIHRvIGFjY291bnQKLSAgICAgICAgICAgIC8vIGZvciBtZXRob2Qgb3ZlcmxvYWRpbmcsIHdlIGxvb2sgZm9yIEFMTCBtZXRob2RzIHdpdGggdGhlIHNhbWUgbmFtZSBpbiB0aGUgCi0gICAgICAgICAgICAvLyBpbXBsZW1lbnRhdGlvbiwgdGhlbiBmcm9tIHRoYXQgY29sbGVjdGlvbiBvZiBtZXRob2RzLCB3ZSBsb29rIGZvciBvbmUgdGhhdCBoYXMgdGhlIAotICAgICAgICAgICAgLy8gc2FtZSBwYXJhbWV0ZXJzLiAgSWYgd2UgZmluZCBvbmUgd2l0aCB0aGUgc2FtZSBwYXJhbWV0ZXJzLCB0aGVuIHdlIGNoZWNrIHRoZSByZXR1cm4KLSAgICAgICAgICAgIC8vIGFuZCBleGNlcHRpb25zLiAgTm90ZSB0aGF0IGluIEphdmEsIG92ZXJsb2FkZWQgbWV0aG9kcyBhcmUgb25lcyB0aGF0IGhhdmUgdGhlIHNhbWUKLSAgICAgICAgICAgIC8vIG5hbWUgYnV0IGRpZmZlcmVudCBwYXJhbWV0ZXJzOyBhIGRpZmZlcmVuY2UgaW4gdGhlIHJldHVybiB0eXBlIG9yIHRocm93biBleGNlcHRpb25zCi0gICAgICAgICAgICAvLyBkb2VzIG5vdCBjb25zdGl0dXRlIG92ZXJsb2FkaW5nIGFuZCBpcyBhIGNvbXBpbGUgZXJyb3IuCi0gICAgICAgICAgICBJdGVyYXRvcjxNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZT4gaW1wbE1EQ0l0ZXJhdG9yID0gaW1wbE1ldGhvZHMuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIGJvb2xlYW4gbWV0aG9kSW1wbEZvdW5kID0gZmFsc2U7Ci0gICAgICAgICAgICB3aGlsZSAoaW1wbE1EQ0l0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlIGltcGxNREMgPSBpbXBsTURDSXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChzZWlNREMuZ2V0TWV0aG9kTmFtZSgpLmVxdWFscyhpbXBsTURDLmdldE1ldGhvZE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVGhlIG1ldGhvZCBuYW1lcyBtYXRjaCwgc28gbm93IGNoZWNrIHRoZSBwYXJhbWV0ZXJzCi0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZU1ldGhvZFBhcmFtZXRlcnMoc2VpTURDLCBpbXBsTURDLCBzZWljLmdldENsYXNzTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEltcGxGb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHBhcmFtZXRlcnMgZGlkbid0IG1hdGNoLCBzbyB3ZSdsbCBjaGVjayB0aGUgbmV4dCAKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGltcGxlbW50YXRpb24gbWV0aG9kIG9uIHRoZSBuZXh0IGl0ZXJhdGlvbiBvZiB0aGUgaW5uZXIgbG9vcC4KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIG5hbWUgYW5kIHRoZSBwYXJhbWV0ZXJzIG1hdGNoZWQsIHRoZW4gd2UndmUgZm91bmQgdGhlIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAvLyBpbXBsZW1lbnRhdGlvbiwgZXZlbiBpZiBpdCB3YXMgb3ZlcmxvYWRlZC4gTm93IGNoZWNrIHRoZSByZXR1cm4gdmFsdWUgYW5kCi0gICAgICAgICAgICAgICAgICAgIC8vIHRocm93biBleGNlcHRpb25zLiAgTm90ZSB0aGVzZSB3aWxsIG1ldGhvZHMgdGhyb3cgZXhjZXB0aW9ucyBpZiB2YWxpZGF0aW9uIGZhaWxzLgotICAgICAgICAgICAgICAgICAgICAvLyBJZiBhbGwgdGhlIHZhbGlkYXRpb24gcGFzc2VzLCB3ZSBjYW4gYnJlYWsgb3V0IG9mIHRoZSBpbm5lciBsb29wIHNpbmNlIHdlIAotICAgICAgICAgICAgICAgICAgICAvLyBmb3VuZCB0aGUgaW1wbGVtZW50YXRpb24gZm9yIHRoaXMgc2VpIG1ldGhvZC4KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGhvZEltcGxGb3VuZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVNZXRob2RFeGNlcHRpb25zKHNlaU1EQywgaW1wbE1EQywgc2VpYy5nZXRDbGFzc05hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZU1ldGhvZFJldHVyblZhbHVlKHNlaU1EQywgaW1wbE1EQywgc2VpYy5nZXRDbGFzc05hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKCFtZXRob2RJbXBsRm91bmQpIHsKLSAgICAgICAgICAgICAgICAvLyBXZSBkaWRuJ3QgZmluZCB0aGUgaW1wbGVtZW50YXRpb24gZm9yIHRoaXMgU0VJIG1ldGhvZCwgc28gdGhyb3cgYSB2YWxpZGF0aW9uCi0gICAgICAgICAgICAgICAgLy8gZXhjZXB0aW9uLgotICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgCQlNZXNzYWdlcy5nZXRNZXNzYWdlKCJ2YWxpZGF0ZUltcGxFcnIiLGNvbXBvc2l0ZS5nZXRDbGFzc05hbWUoKSwKLSAgICAgICAgICAgICAgICAJCQkJc2VpTURDLmdldE1ldGhvZE5hbWUoKSxzZWljLmdldENsYXNzTmFtZSgpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVNZXRob2RQYXJhbWV0ZXJzKE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlIHNlaU1EQywKLSAgICAgICAgTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUgaW1wbE1EQywgU3RyaW5nIGNsYXNzTmFtZSkgewotICAgICAgICBMaXN0PFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlPiBzZWlQRENMaXN0ID0gc2VpTURDCi0gICAgICAgICAgICAuZ2V0UGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGVMaXN0KCk7Ci0gICAgICAgIExpc3Q8UGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGU+IGltcGxQRENMaXN0ID0gaW1wbE1EQwotICAgICAgICAgICAgLmdldFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlTGlzdCgpOwotICAgICAgICBpZiAoKHNlaVBEQ0xpc3QgPT0gbnVsbCB8fCBzZWlQRENMaXN0LmlzRW1wdHkoKSkKLSAgICAgICAgICAgICYmIChpbXBsUERDTGlzdCA9PSBudWxsIHx8IGltcGxQRENMaXN0LmlzRW1wdHkoKSkpIHsKLSAgICAgICAgICAgIC8vIFRoZXJlIGFyZSBubyBwYXJhbWV0ZXJzIG9uIHRoZSBTRUkgb3IgdGhlIGltcGw7IGFsbCBpcyB3ZWxsCi0gICAgICAgIH0gZWxzZSBpZiAoKHNlaVBEQ0xpc3QgPT0gbnVsbCB8fCBzZWlQRENMaXN0LmlzRW1wdHkoKSkKLSAgICAgICAgICAgICYmICEoaW1wbFBEQ0xpc3QgPT0gbnVsbCB8fCBpbXBsUERDTGlzdC5pc0VtcHR5KCkpKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKAotICAgICAgICAgICAgCQlNZXNzYWdlcy5nZXRNZXNzYWdlKCJ2YWxpZGF0ZU1ldGhvZFBhcmFtRXJyMSIsaW1wbFBEQ0xpc3QudG9TdHJpbmcoKSwKLSAgICAgICAgICAgIAkJCQljb21wb3NpdGUuZ2V0Q2xhc3NOYW1lKCksc2VpTURDLmdldE1ldGhvZE5hbWUoKSxjbGFzc05hbWUpKTsKLSAgICAgICAgfSBlbHNlIGlmICgoc2VpUERDTGlzdCAhPSBudWxsICYmICFzZWlQRENMaXN0LmlzRW1wdHkoKSkKLSAgICAgICAgICAgICYmICEoaW1wbFBEQ0xpc3QgIT0gbnVsbCAmJiAhaW1wbFBEQ0xpc3QuaXNFbXB0eSgpKSkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbigKLSAgICAgICAgICAgIAkJTWVzc2FnZXMuZ2V0TWVzc2FnZSgidmFsaWRhdGVNZXRob2RQYXJhbUVycjIiLHNlaVBEQ0xpc3QudG9TdHJpbmcoKSwKLSAgICAgICAgICAgIAkJCQljb21wb3NpdGUuZ2V0Q2xhc3NOYW1lKCksc2VpTURDLmdldE1ldGhvZE5hbWUoKSxjbGFzc05hbWUpKTsKLSAgICAgICAgfSBlbHNlIGlmIChzZWlQRENMaXN0LnNpemUoKSAhPSBpbXBsUERDTGlzdC5zaXplKCkpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oCi0gICAgICAgICAgICAJCU1lc3NhZ2VzLmdldE1lc3NhZ2UoInZhbGlkYXRlTWV0aG9kUGFyYW1FcnIzIiwKLSAgICAgICAgICAgIAkJCQluZXcgSW50ZWdlcihzZWlQRENMaXN0LnNpemUoKSkudG9TdHJpbmcoKSwKLSAgICAgICAgICAgIAkJCQluZXcgSW50ZWdlcihpbXBsUERDTGlzdC5zaXplKCkpLnRvU3RyaW5nKCksY29tcG9zaXRlLmdldENsYXNzTmFtZSgpLAotICAgICAgICAgICAgCQkJCXNlaU1EQy5nZXRNZXRob2ROYW1lKCksY2xhc3NOYW1lKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIG9yZGVyIGFuZCB0eXBlIG9mIHBhcmFtZXRlcnMgbWF0Y2gKLSAgICAgICAgICAgIC8vIFJFVklFVzogVGhpcyBjaGVja3MgZm9yIHN0cmljdCBlcXVhbGl0eSBvZiB0aGUgZnVsbHkgcXVhbGlmaWVkCi0gICAgICAgICAgICAvLyB0eXBlLiBJdCBkb2VzIG5vdAotICAgICAgICAgICAgLy8gdGFrZSBpbnRvIGNvbnNpZGVyYXRpb24gb2JqZWN0IGhpZXJhY2h5LiBGb3IgZXhhbXBsZSBmb28oQW5pbWFsKQotICAgICAgICAgICAgLy8gd2lsbCBub3QgZXF1YWwgYmFyKFplYnJhKQotICAgICAgICAgICAgYm9vbGVhbiBwYXJhbWV0ZXJzTWF0Y2ggPSB0cnVlOwotICAgICAgICAgICAgU3RyaW5nIGZhaWxpbmdNZXNzYWdlID0gbnVsbDsKLSAgICAgICAgICAgIGZvciAoaW50IHBhcmFtTnVtYmVyID0gMDsgcGFyYW1OdW1iZXIgPCBzZWlQRENMaXN0LnNpemUoKTsgcGFyYW1OdW1iZXIrKykgewotICAgICAgICAgICAgICAgIFN0cmluZyBzZWlQYXJhbVR5cGUgPSBzZWlQRENMaXN0LmdldChwYXJhbU51bWJlcikuZ2V0UGFyYW1ldGVyVHlwZSgpOwotICAgICAgICAgICAgICAgIFN0cmluZyBpbXBsUGFyYW1UeXBlID0gaW1wbFBEQ0xpc3QuZ2V0KHBhcmFtTnVtYmVyKS5nZXRQYXJhbWV0ZXJUeXBlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFzZWlQYXJhbVR5cGUuZXF1YWxzKGltcGxQYXJhbVR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnNNYXRjaCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSBpbnNlcnRzID0gbmV3IFN0cmluZ1tdIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcudmFsdWVPZihwYXJhbU51bWJlciksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlaVBhcmFtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsUGFyYW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvc2l0ZS5nZXRDbGFzc05hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWlNREMuZ2V0TWV0aG9kTmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZQotICAgICAgICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgZmFpbGluZ01lc3NhZ2UgPSBNZXNzYWdlcy5nZXRNZXNzYWdlKCJzZXJ2aWNlRGVzY3JpcHRpb25JbXBsVmFsaWRhdGlvbkVyciIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIXBhcmFtZXRlcnNNYXRjaCkgewotICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZmFpbGluZ01lc3NhZ2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlTWV0aG9kUmV0dXJuVmFsdWUoTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUgc2VpTURDLAotICAgICAgICBNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSBpbXBsTURDLCBTdHJpbmcgY2xhc3NOYW1lKSB7Ci0gICAgICAgIFN0cmluZyBzZWlSZXR1cm5WYWx1ZSA9IHNlaU1EQy5nZXRSZXR1cm5UeXBlKCk7Ci0gICAgICAgIFN0cmluZyBpbXBsUmV0dXJuVmFsdWUgPSBpbXBsTURDLmdldFJldHVyblR5cGUoKTsKLQotICAgICAgICBpZiAoc2VpUmV0dXJuVmFsdWUgPT0gbnVsbCAmJiBpbXBsUmV0dXJuVmFsdWUgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gTmVpdGhlciBzcGVjaWZ5IGEgcmV0dXJuIHZhbHVlOyBhbGwgaXMgd2VsbAotICAgICAgICB9IGVsc2UgaWYgKHNlaVJldHVyblZhbHVlID09IG51bGwgJiYgaW1wbFJldHVyblZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oCi0gICAgICAgICAgICAJCU1lc3NhZ2VzLmdldE1lc3NhZ2UoInZhbGlkYXRlTWV0aG9kUlZFcnIxIixpbXBsUmV0dXJuVmFsdWUsCi0gICAgICAgICAgICAJCQkJY29tcG9zaXRlLmdldENsYXNzTmFtZSgpLHNlaU1EQy5nZXRNZXRob2ROYW1lKCksY2xhc3NOYW1lKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc2VpUmV0dXJuVmFsdWUgIT0gbnVsbCAmJiBpbXBsUmV0dXJuVmFsdWUgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbigKLSAgICAgICAgICAgIAkJTWVzc2FnZXMuZ2V0TWVzc2FnZSgidmFsaWRhdGVNZXRob2RSVkVycjIiLHNlaVJldHVyblZhbHVlLAotICAgICAgICAgICAgCQkJCWNvbXBvc2l0ZS5nZXRDbGFzc05hbWUoKSxzZWlNREMuZ2V0TWV0aG9kTmFtZSgpLGNsYXNzTmFtZSkpOwotICAgICAgICB9IGVsc2UgaWYgKCFzZWlSZXR1cm5WYWx1ZS5lcXVhbHMoaW1wbFJldHVyblZhbHVlKSkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbigKLSAgICAgICAgICAgIAkJTWVzc2FnZXMuZ2V0TWVzc2FnZSgidmFsaWRhdGVNZXRob2RSVkVycjMiLHNlaVJldHVyblZhbHVlLGltcGxSZXR1cm5WYWx1ZSwKLSAgICAgICAgICAgIAkJCQljb21wb3NpdGUuZ2V0Q2xhc3NOYW1lKCksc2VpTURDLmdldE1ldGhvZE5hbWUoKSxjbGFzc05hbWUpKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlTWV0aG9kRXhjZXB0aW9ucyAoIE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlIHNlaU1EQywgCi0gICAgICAgIE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlIGltcGxNREMsCi0gICAgICAgIFN0cmluZyBjbGFzc05hbWUpIHsKLQotICAgICAgICBTdHJpbmdbXSBzZWlFeGNlcHRpb25zID0gc2VpTURDLmdldEV4Y2VwdGlvbnMoKTsKLSAgICAgICAgU3RyaW5nW10gaW1wbEV4Y2VwdGlvbnMgPSBpbXBsTURDLmdldEV4Y2VwdGlvbnMoKTsKLQotICAgICAgICAvLyBBbiBpbXBsIGNhbiBjaG9vc2UgdG8gdGhyb3cgZmV3ZXIgY2hlY2tlZCBleGNlcHRpb25zIHRoYW4gZGVjbGFyZWQgb24gdGhlIFNFSSwgYnV0IG5vdCBtb3JlLgotICAgICAgICAvLyBUaGlzIGlzIGFuYWxhZ291cyB0byB0aGUgSmF2YSBydWxlcyBmb3IgaW50ZXJmYWNlcy4KLSAgICAgICAgaWYgKHNlaUV4Y2VwdGlvbnMgPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGltcGxFeGNlcHRpb25zID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIFNFSSBkZWxjYXJlcyBubyBjaGVja2VkIGV4Y2VwdGlvbnMsIGJ1dCB0aGUgaW1wbGVtZW50YXRpb24gaGFzIGNoZWNrZWQgZXhjZXB0aW9ucywgd2hpY2ggaXMgYW4gZXJyb3IKLSAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgIAkJTWVzc2FnZXMuZ2V0TWVzc2FnZSgidmFsaWRhdGVNZXRob2RFeGNlcHRpb25FcnIxIiwKLSAgICAgICAgICAgICAgICAJCQkJY29tcG9zaXRlLmdldENsYXNzTmFtZSgpLHNlaU1EQy5nZXRNZXRob2ROYW1lKCksY2xhc3NOYW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoaW1wbEV4Y2VwdGlvbnMgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gSW1wbGVtZW50YXRpb24gdGhyb3dzIGZld2VyIGNoZWNrZWQgZXhjZXB0aW9ucyB0aGFuIFNFSSwgd2hpY2ggaXMgT0suCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIENoZWNrIHRoZSBsaXN0IGxlbmd0aDsgQW4gaW1wbGVtZW50YXRpb24gY2FuIG5vdCBkZWNsYXJlIG1vcmUgZXhjZXB0aW9ucyB0aGFuIHRoZSBTRUkKLSAgICAgICAgaWYgKHNlaUV4Y2VwdGlvbnMubGVuZ3RoIDwgaW1wbEV4Y2VwdGlvbnMubGVuZ3RoKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKAotICAgICAgICAgICAgCQlNZXNzYWdlcy5nZXRNZXNzYWdlKCJ2YWxpZGF0ZU1ldGhvZEV4Y2VwdGlvbkVycjIiLAotICAgICAgICAgICAgCQkJCW5ldyBJbnRlZ2VyKGltcGxFeGNlcHRpb25zLmxlbmd0aCkudG9TdHJpbmcoKSwKLSAgICAgICAgICAgIAkJCQluZXcgSW50ZWdlcihzZWlFeGNlcHRpb25zLmxlbmd0aCkudG9TdHJpbmcoKSwKLSAgICAgICAgICAgIAkJCQljb21wb3NpdGUuZ2V0Q2xhc3NOYW1lKCksc2VpTURDLmdldE1ldGhvZE5hbWUoKSxjbGFzc05hbWUpKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgZWFjaCBjaGVja2VkIGV4Y2VwdGlvbiBkZWNsYXJlZCBieSB0aGUgCi0gICAgICAgIC8vIGltcGxlbWVudGF0aW9uIGlzIG9uIHRoZSBTRUkgYWxzbwotICAgICAgICBpZiAoaW1wbEV4Y2VwdGlvbnMubGVuZ3RoID4gMCkgeyAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIGltcGxFeGNlcHRpb24gOiBpbXBsRXhjZXB0aW9ucykgewotICAgICAgICAgICAgICAgIGJvb2xlYW4gZm91bmRJdCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGlmIChzZWlFeGNlcHRpb25zLmxlbmd0aCA+IDApIHsgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgc2VpRXhjZXB0aW9uIDogc2VpRXhjZXB0aW9ucykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlaUV4Y2VwdGlvbi5lcXVhbHMoaW1wbEV4Y2VwdGlvbikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZEl0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAoIWZvdW5kSXQpIHsgICAgCQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAJCU1lc3NhZ2VzLmdldE1lc3NhZ2UoInZhbGlkYXRlTWV0aG9kRXhjZXB0aW9uRXJyMyIsaW1wbEV4Y2VwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgCQkJCWNvbXBvc2l0ZS5nZXRDbGFzc05hbWUoKSxzZWlNREMuZ2V0TWV0aG9kTmFtZSgpLGNsYXNzTmFtZSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhbnkgbWV0aG9kcyBkZWNsYXJlZCBpbiBzdXBlcmNsYXNzZXMgdG8gdGhlIExpc3QuICBUaGUgaGllcmFjaHkgc3RhcnRpbmcgd2l0aCB0aGUgREJDCi0gICAgICogd2lsbCBiZSB3YWxrZWQgdXAgcmVjdXJzaXZlbHksIGFkZGluZyBtZXRob2RzIGZyb20gZWFjaCBwYXJlbnQgREJDIGVuY291bnRlcmVkLgotICAgICAqIDxwLz4KLSAgICAgKiBOb3RlIHRoYXQgdGhpcyBjYW4gYmUgdXNlZCBmb3IgZWl0aGVyIGNsYXNzZXMgb3IgaW50ZXJmYWNlcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXRob2RMaXN0IFRoZSBjdXJyZW50IGNvbGxlY3Rpb24gb2YgbWV0aG9kcywgaW5jbHVkaW5nIG92ZXJsb2FkZWQgb25lcwotICAgICAqIEBwYXJhbSBkYmMgVGhlIGNvbXBvc2l0ZSB0byBiZSBjaGVja2VkIGZvciBtZXRob2RzIHRvIGJlIGFkZGVkIHRvIHRoZSBjb2xsZWN0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGFkZFN1cGVyQ2xhc3NNZXRob2RzKExpc3Q8TWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGU+IG1ldGhvZExpc3QsIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBkYmMpIHsKLSAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIHN1cGVyREJDID0gZGJjTWFwLmdldChkYmMuZ2V0U3VwZXJDbGFzc05hbWUoKSk7Ci0gICAgICAgIGlmIChzdXBlckRCQyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBJdGVyYXRvcjxNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZT4gbUl0ZXIgPSBzdXBlckRCQy5nZXRNZXRob2REZXNjcmlwdGlvbnNMaXN0KCkuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIHdoaWxlIChtSXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSBtZGMgPSBtSXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgbWV0aG9kTGlzdC5hZGQobWRjKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFkZFN1cGVyQ2xhc3NNZXRob2RzKG1ldGhvZExpc3QsIHN1cGVyREJDKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLyoKLSAgICAgICogVGhpcyBtZXRob2QgdmVyaWZpZXMgdGhhdCwgaWYgdGhlcmUgYXJlIGFueSBXZWJNZXRob2Qgd2l0aCBleGNsdWRlID09IGZhbHNlLCB0aGVuCi0gICAgICAqIG1ha2Ugc3VyZSB0aGF0IHdlIGZpbmQgYWxsIG9mIHRob3NlIG1ldGhvZHMgcmVwcmVzZW50ZWQgaW4gdGhlIHdzZGwuIEhvd2V2ZXIsIGlmCi0gICAgICAqIHRoZXJlIGFyZSBubyBleGNsdXNpb25zID09IGZhbHNlLCBvciB0aGVyZSBhcmUgbm8gV2ViTWV0aG9kIGFubm90YXRpb25zLCB0aGVuIHZlcmlmeQotICAgICAgKiB0aGF0IGFsbCB0aGUgcHVibGljIG1ldGhvZHMgYXJlIGluIHRoZSB3c2RsCi0gICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjaGVja01ldGhvZHNBZ2FpbnN0V1NETCgpIHsKLSAgICAgICAgLy8gVmVyaWZ5IHRoYXQsIGZvciBJbXBsaWNpdFNFSSwgdGhhdCBhbGwgbWV0aG9kcyB0aGF0IHNob3VsZCBleGlzdChpZiBvbmUgZmFsc2UgZm91bmQsIHRoZW4KLSAgICAgICAgLy8gb25seSBsb29rIGZvciBXZWJNZXRob2RzIHcvIEZhbHNlLCBlbHNlIHRha2UgYWxsIHB1YmxpYyBtZXRob2RzIGJ1dCBpZ25vcmUgdGhvc2Ugd2l0aAotICAgICAgICAvLyBleGNsdWRlID09IHRydWUKLSAgICAgICAgaWYgKHdlYk1ldGhvZEFubm90YXRpb25zRXhpc3QoKSkgewotICAgICAgICAgICAgaWYgKERlc2NyaXB0aW9uVXRpbHMuZmFsc2VFeGNsdXNpb25zRXhpc3QoY29tcG9zaXRlKSkKLSAgICAgICAgICAgICAgICB2ZXJpZnlGYWxzZUV4Y2x1c2lvbnNXaXRoV1NETCgpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHZlcmlmeVB1YmxpY01ldGhvZHNXaXRoV1NETCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdmVyaWZ5UHVibGljTWV0aG9kc1dpdGhXU0RMKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tJbXBsaWNpdFNFSUFnYWluc3RXU0RMKCkgewotCi0gICAgICAgIC8vVE9ETzogSWYgdGhlcmUgaXMgYSBXU0RMLCB0aGVuIHZlcmlmeSB0aGF0IGFsbCBXZWJNZXRob2RzIG9uIHRoaXMgY2xhc3MgYW5kIGluIHRoZQotICAgICAgICAvLwkJc3VwZXJjbGFzc2VzIGNoYWluIGFyZSByZXByZXNlbnRlZCBpbiB0aGUgV1NETC4uLkxvb2sgYXQgbG9naWMgYmVsb3cgdG8gbWFrZQotICAgICAgICAvLwkJc3VyZSB0aGlzIHJlYWxseSBoYXBwZW5pbmcKLQotCi0gICAgICAgIGlmICh3ZWJNZXRob2RBbm5vdGF0aW9uc0V4aXN0KCkpIHsKLSAgICAgICAgICAgIGlmIChEZXNjcmlwdGlvblV0aWxzLmZhbHNlRXhjbHVzaW9uc0V4aXN0KGNvbXBvc2l0ZSkpCi0gICAgICAgICAgICAgICAgdmVyaWZ5RmFsc2VFeGNsdXNpb25zV2l0aFdTREwoKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB2ZXJpZnlQdWJsaWNNZXRob2RzV2l0aFdTREwoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHZlcmlmeVB1YmxpY01ldGhvZHNXaXRoV1NETCgpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tTRUlBZ2FpbnN0V1NETCgpIHsKLSAgICAgICAgLy9UT0RPOiBQbGFjZSBsb2dpYyBoZXJlIHRvIHZlcmlmeSB0aGF0IGVhY2ggcHVibGljTWV0aG9kIHdpdGggV2ViTWV0aG9kIGFubm90Ci0gICAgICAgIC8vICAgICAgaXMgY29udGFpbmVkIGluIHRoZSBXU0RMIChJZiB0aGVyZSBpcyBhIFdTREwpIElmIHdlIGZpbmQKLSAgICAgICAgLy8JICAgIGEgV2ViTWV0aG9kIGFubm90YXRpb24sIHVzZSBpdHMgdmFsdWVzIGZvciBsb29raW5nIGluIHRoZSBXU0RMCi0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVTRUkoRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIHNlaWMpIHsKLQotICAgICAgICBpZiAoc2VpYy5nZXRXZWJTZXJ2aWNlQW5ub3QoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKAotICAgICAgICAgICAgCQlNZXNzYWdlcy5nZXRNZXNzYWdlKCJ2YWxpZGF0ZVNFSUVycjEiLGNvbXBvc2l0ZS5nZXRDbGFzc05hbWUoKSxzZWljLmdldENsYXNzTmFtZSgpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFzZWljLmdldFdlYlNlcnZpY2VBbm5vdCgpLmVuZHBvaW50SW50ZXJmYWNlKCkuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbigKLSAgICAgICAgICAgIAkJTWVzc2FnZXMuZ2V0TWVzc2FnZSgidmFsaWRhdGVTRUlFcnIyIixjb21wb3NpdGUuZ2V0Q2xhc3NOYW1lKCksCi0gICAgICAgICAgICAJCQkJc2VpYy5nZXRDbGFzc05hbWUoKSxzZWljLmdldFdlYlNlcnZpY2VBbm5vdCgpLmVuZHBvaW50SW50ZXJmYWNlKCkpKTsKLSAgICAgICAgfQotICAgICAgICAvLyBWZXJpZnkgdGhhdCB0aGUgU09BUEJpbmRpbmcgYW5ub3RhdGlvbnMgYXJlIHN1cHBvcnRlZC4KLSAgICAgICAgaWYgKHNlaWMuZ2V0U29hcEJpbmRpbmdBbm5vdCgpICE9IG51bGwgJiYKLSAgICAgICAgCQlzZWljLmdldFNvYXBCaW5kaW5nQW5ub3QoKS51c2UoKSA9PSBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5Vc2UuRU5DT0RFRCkgewotICAgICAgICAJdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJ2YWxpZGF0ZVNFSUVycjMiLHNlaWMuZ2V0Q2xhc3NOYW1lKCkpKTsgIAotICAgICAgICB9Ci0KLSAgICAgICAgY2hlY2tTRUlBZ2FpbnN0V1NETCgpOwotCi0gICAgICAgIC8vVE9ETzogTW9yZSB2YWxpZGF0aW9uIGhlcmUKLQotICAgICAgICAvL1RPRE86IE1ha2Ugc3VyZSB3ZSBkb24ndCBmaW5kIGFueSBXZWJNZXRob2QgYW5ub3RhdGlvbnMgd2l0aCBleGNsdWRlID09IHRydWUKLSAgICAgICAgLy8JCWFueXdoZXJlIGluIHRoZSBzdXBlcmNsYXNzZXMgY2hhaW4KLQotICAgICAgICAvL1RPRE86IENoZWNrIHRoYXQgYWxsIFdlYk1ldGhvZCBhbm5vdGF0aW9ucyBpbiB0aGUgc3VwZXJjbGFzcyBjaGFpbiBhcmUgcmVwcmVzZW50ZWQgaW4KLSAgICAgICAgLy8JCVdTREwsIGFzc3VtaW5nIHRoZXJlIGlzIFdTREwKLQotICAgICAgICAvL1RPRE86CVZhbGlkYXRlIHRoYXQgdGhlIGludGVyZmFjZSBpcyBwdWJsaWMKLQotICAgICAgICAvLwkJQ2FsbCBWYWxpZGF0ZVdlYk1ldGhvZEFubm90cygpCi0gICAgICAgIC8vCi0KLSAgICAgICAgLy9UaGlzIHdpbGwgcGVyZm9ybSB2YWxpZGF0aW9uIGZvciBhbGwgbWV0aG9kcywgcmVnYXJkbGVzcyBvZiBXZWJNZXRob2QgYW5ub3RhdGlvbnMKLSAgICAgICAgLy9JdCBpcyBjYWxsZWQgZm9yIHRoZSBTRUksIGFuZCBhbiBpbXBsLiBjbGFzcyB0aGF0IGRvZXMgbm90IHNwZWNpZnkgYW4gZW5kcG9pbnRJbnRlcmZhY2UKLSAgICAgICAgdmFsaWRhdGVNZXRob2RzKHNlaWMuZ2V0TWV0aG9kRGVzY3JpcHRpb25zTGlzdCgpKTsKLSAgICB9Ci0KLSAgICAvKiogQHJldHVybiBSZXR1cm5zIFRSVUUgaWYgd2UgZmluZCBqdXN0IG9uZSBXZWJNZXRob2QgQW5ub3RhdGlvbiAqLwotICAgIHByaXZhdGUgYm9vbGVhbiB3ZWJNZXRob2RBbm5vdGF0aW9uc0V4aXN0KCkgewotICAgICAgICBNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSBtZGMgPSBudWxsOwotICAgICAgICBJdGVyYXRvcjxNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZT4gaXRlciA9Ci0gICAgICAgICAgICAgICAgY29tcG9zaXRlLmdldE1ldGhvZERlc2NyaXB0aW9uc0xpc3QoKS5pdGVyYXRvcigpOwotCi0gICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgbWRjID0gaXRlci5uZXh0KCk7Ci0KLSAgICAgICAgICAgIGlmIChtZGMuZ2V0V2ViTWV0aG9kQW5ub3QoKSAhPSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB2ZXJpZnlGYWxzZUV4Y2x1c2lvbnNXaXRoV1NETCgpIHsKLSAgICAgICAgLy9UT0RPOiBQbGFjZSBsb2dpYyBoZXJlIHRvIHZlcmlmeSB0aGF0IGVhY2ggZXhjbHVkZT09ZmFsc2UgV2ViTWV0aG9kIGFubm90IHdlIGZpbmQKLSAgICAgICAgLy8gICAgICBpcyBjb250YWluZWQgaW4gdGhlIFdTREwKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdmVyaWZ5UHVibGljTWV0aG9kc1dpdGhXU0RMKCkgewotICAgICAgICAvL1RPRE86IFBsYWNlIGxvZ2ljIGhlcmUgdG8gdmVyaWZ5IHRoYXQgZWFjaCBwdWJsaWNNZXRob2Qgd2l0aCBubyBXZWJNZXRob2QgYW5ub3QKLSAgICAgICAgLy8gICAgICBpcyBjb250YWluZWQgaW4gdGhlIFdTREwKLQotICAgIH0KLQotCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlTWV0aG9kcyhMaXN0PE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlPiBtZGNMaXN0KSB7Ci0gICAgICAgIGlmIChtZGNMaXN0ICE9IG51bGwgJiYgIW1kY0xpc3QuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBmb3IgKE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlIG1kYyA6IG1kY0xpc3QpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcmV0dXJuVHlwZSA9IG1kYy5nZXRSZXR1cm5UeXBlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHVyblR5cGUgIT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAocmV0dXJuVHlwZS5lcXVhbHMoUkVUVVJOX1RZUEVfRlVUVVJFKSB8fCByZXR1cm5UeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKFJFVFVSTl9UWVBFX1JFU1BPTlNFKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldE1lc3NhZ2UoInNlcnZlclNpZGVBc3luYyIsIG1kYy5nZXREZWNsYXJpbmdDbGFzcygpLCBtZGMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0TWV0aG9kTmFtZSgpKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIFZlcmlmeSB0aGF0IHRoZSBTT0FQQmluZGluZyBhbm5vdGF0aW9uIHZhbHVlcyBhcmUgc3VwcG9ydGVkLgotICAgICAgICAgICAgICAgIGlmIChtZGMuZ2V0U29hcEJpbmRpbmdBbm5vdCgpICE9IG51bGwpIHsKLQotICAgICAgICAgICAgICAgICAgICAvLyBGb3IgdGhpcyBKQVhXUyBlbmdpbmUsIFNPQVBCaW5kaW5nLlVzZSA9IEVOQ09ERUQgaXMgdW5zdXBwb3J0ZWQKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1kYy5nZXRTb2FwQmluZGluZ0Fubm90KCkudXNlKCkgPT0gamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuVXNlLkVOQ09ERUQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkuCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoInNvYXBCaW5kaW5nVXNlRW5jb2RlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWRjLmdldERlY2xhcmluZ0NsYXNzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWRjLmdldE1ldGhvZE5hbWUoKSkpOwotCi0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvLyBWZXJpZnkgdGhhdCwgaWYgYSBTT0FQQmluZGluZyBhbm5vdGF0aW9uIGV4aXN0cywgdGhhdCBpdHMgc3R5bGUgYmUgc2V0IHRvCi0gICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgRE9DVU1FTlQgSlNSMTgxLVNlYyA0LjcuMQotICAgICAgICAgICAgICAgICAgICBpZiAobWRjLmdldFNvYXBCaW5kaW5nQW5ub3QoKS5zdHlsZSgpID09IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlN0eWxlLlJQQykgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgic29hcEJpbmRpbmdTdHlsZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWRjLmdldERlY2xhcmluZ0NsYXNzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWRjLmdldE1ldGhvZE5hbWUoKSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB9IAotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIFRPRE86IEZpbGwgdGhpcyBvdXQgdG8gdmFsaWRhdGUgYWxsIE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlIChhbmQKLSAgICAgICAgLy8gdGhlaXIgaW5jbHVzaXZlCi0gICAgICAgIC8vICAgICAgYW5ub3RhdGlvbnMgb24gdGhpcyBTRUkgKFNFSSBpcyBhc3N1bWVkIGhlcmUpCi0gICAgICAgIC8vY2hlY2sgb25ld2F5Ci0gICAgICAgIC8vCi0KLSAgICAgICAgLy9UaGlzIGNvdWxkIGJlIGFuIFNFSSwgb3IgYW4gaW1wbC4gY2xhc3MgdGhhdCBkb2Vzbicgc3BlY2lmeSBhbiBFbmRwb2ludEludGVyZmFjZSAoc28sIGl0Ci0gICAgICAgIC8vaXMgaW1wbGljaXRseSBhbiBTRUkuLi5uZWVkIHRvIGNvbnNpZGVyIHRoaXMKLSAgICAgICAgLy8KLQotICAgICAgICAvL1RPRE86IFZlcmlmeSB0aGF0LCBpZiB0aGlzIGlzIGFuIGludGVyZmFjZS4uLnRoYXQgdGhlcmUgYXJlIG5vIE1ldGhvZHMgd2l0aCBXZWJNZXRob2QKLSAgICAgICAgLy8gICAgICBhbm5vdGF0aW9ucyB0aGF0IGNvbnRhaW4gZXhjbHVkZSA9PSB0cnVlCi0KLSAgICAgICAgLy9UT0RPOiBWZXJpZnkgdGhhdCwgaWYgYSBTT0FQQmluZGluZyBhbm5vdGF0aW9uIGV4aXN0cywgdGhhdCBpdHMgc3R5bGUgYmUgc2V0IHRvCi0gICAgICAgIC8vICAgICAgb25seSBET0NVTUVOVCBKU1IxODEtU2VjIDQuNy4xCi0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVXU0RMT3BlcmF0aW9ucygpIHsKLSAgICAgICAgLy9WZXJpZmllcyB0aGF0IGFsbCBvcGVyYXRpb25zIG9uIHRoZSB3c2RsIGFyZSBmb3VuZCBpbiB0aGUgaW1wbC9zZWkgY2xhc3MKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1dTRExTcGVjaWZpZWQoKSB7Ci0gICAgICAgIGJvb2xlYW4gd3NkbFNwZWNpZmllZCA9IGZhbHNlOwotICAgICAgICBpZiAoZ2V0V1NETFdyYXBwZXIoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB3c2RsU3BlY2lmaWVkID0gKGdldFdTRExXcmFwcGVyKCkuZ2V0RGVmaW5pdGlvbigpICE9IG51bGwpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB3c2RsU3BlY2lmaWVkOwotICAgIH0KLQotICAgIAotICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAvLyBBTk5PVEFUSU9OOiBIYW5kbGVyQ2hhaW4KLSAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLlNlcnZpY2VEZXNjcmlwdGlvbiNnZXRIYW5kbGVyQ2hhaW4oKQotICAgICAqLwotICAgIHB1YmxpYyBIYW5kbGVyQ2hhaW5zVHlwZSBnZXRIYW5kbGVyQ2hhaW4oKSB7Ci0gICAgICAgIHJldHVybiBnZXRIYW5kbGVyQ2hhaW4obnVsbCk7Ci0gICAgfQotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uU2VydmljZURlc2NyaXB0aW9uI2dldEhhbmRsZXJDaGFpbihqYXZhLmxhbmcuT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyBIYW5kbGVyQ2hhaW5zVHlwZSBnZXRIYW5kbGVyQ2hhaW4oT2JqZWN0IHNwYXJzZUNvbXBvc2l0ZUtleSkgewotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgc3BhcnNlQ29tcG9zaXRlID0gbnVsbDsKLQotICAgICAgICAvLyBJZiB0aGVyZSBpcyBhIEhhbmRsZXJDaGFpbnNUeXBlIGluIHRoZSBzcGFyc2UgY29tcG9zaXRlIGZvciB0aGlzIFNlcnZpY2VEZWxlZ2F0ZQotICAgICAgICAvLyAoaS5lLiB0aGlzIHNwYXJzZUNvbXBvc2l0ZUtleSksIHRoZW4gcmV0dXJuIHRoYXQuCi0gICAgICAgIGlmIChzcGFyc2VDb21wb3NpdGVLZXkgIT0gbnVsbCkgewotICAgICAgICAgICAgc3BhcnNlQ29tcG9zaXRlID0gY29tcG9zaXRlLmdldFNwYXJzZUNvbXBvc2l0ZShzcGFyc2VDb21wb3NpdGVLZXkpOwotICAgICAgICAgICAgaWYgKHNwYXJzZUNvbXBvc2l0ZSAhPSBudWxsICYmIHNwYXJzZUNvbXBvc2l0ZS5nZXRIYW5kbGVyQ2hhaW5zVHlwZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gc3BhcnNlQ29tcG9zaXRlLmdldEhhbmRsZXJDaGFpbnNUeXBlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIElmIHRoZXJlIGlzIG5vIEhhbmRsZXJDaGFpbnNUeXBlIGluIHRoZSBjb21wb3NpdGUsIHRoZW4gcmVhZCBpbiB0aGUgZmlsZSBzcGVjaWZpZWQKLSAgICAgICAgLy8gb24gdGhlIEhhbmRsZXJDaGFpbiBhbm5vdGF0aW9uIGlmIGl0IGlzIHByZXNlbnQuCi0gICAgICAgIGlmIChoYW5kbGVyQ2hhaW5zVHlwZSA9PSBudWxsKSB7Ci0KLSAgICAgICAgICAgIGdldEFubm9IYW5kbGVyQ2hhaW5Bbm5vdGF0aW9uKHNwYXJzZUNvbXBvc2l0ZUtleSk7Ci0gICAgICAgICAgICBpZiAoaGFuZGxlckNoYWluQW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0KLSAgICAgICAgICAgICAgICBTdHJpbmcgaGFuZGxlckZpbGVOYW1lID0gaGFuZGxlckNoYWluQW5ub3RhdGlvbi5maWxlKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJFbmRwb2ludERlc2NyaXB0aW9uSW1wbC5nZXRIYW5kbGVyQ2hhaW46IGZpbGVOYW1lOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGhhbmRsZXJGaWxlTmFtZSArICIgY2xhc3NOYW1lOiAiICsgY29tcG9zaXRlLmdldENsYXNzTmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gY29tcG9zaXRlLmdldENsYXNzTmFtZSgpOwotCi0gICAgICAgICAgICAgICAgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIgPSBjb21wb3NpdGUuZ2V0Q2xhc3NMb2FkZXIoKTsKLQotICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGlzID0KLSAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uVXRpbHMub3BlbkhhbmRsZXJDb25maWdTdHJlYW0oaGFuZGxlckZpbGVOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTG9hZGVyKTsKLSAgICAgICAgICAgICAgICBpZiAoaXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAvLyBjb25maWcgc3RyZWFtIGlzIHN0aWxsIG51bGwuICBUaGlzIG1heSBtZWFuIHRoZSBASGFuZGxlckNoYWluIGFubm90YXRpb24gaXMgb24gYSAqZHJpdmVyKiBjbGFzcwotICAgICAgICAgICAgICAgICAgICAvLyBuZXh0IHRvIGEgQFdlYlNlcnZpY2VSZWYgYW5ub3RhdGlvbiwgc28gdGhlIHBhdGggaXMgcmVsYXRpdmUgdG8gdGhlIGNsYXNzIGRlY2xhcmluZyBASGFuZGxlckNoYWluCi0gICAgICAgICAgICAgICAgICAgIC8vIGFuZCBOT1QgcmVsYXRpdmUgdG8gdGhlIFNlcnZpY2Ugb3IgRW5kcG9pbnQgY2xhc3MsIHdoaWNoIGFsc28gbWVhbnMgd2Ugc2hvdWxkIHVzZSB0aGUgc3BhcnNlQ29tcG9zaXRlCi0gICAgICAgICAgICAgICAgICAgIC8vIHNpbmNlIHRoYXQgaXMgd2hlcmUgdGhlIEBIYW5kbGVyQ2hhaW4gYW5ub3RhdGlvbiBpbmZvIHdvdWxkIGhhdmUgYmVlbiBsb2FkZWQuCi0gICAgICAgICAgICAgICAgICAgIGlmIChzcGFyc2VDb21wb3NpdGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhhbmRsZXJDaGFpbkRlY2xhcmluZ0NsYXNzID0gKFN0cmluZylzcGFyc2VDb21wb3NpdGUuZ2V0UHJvcGVydGllcygpLmdldChNRFFDb25zdGFudHMuSEFORExFUl9DSEFJTl9ERUNMQVJJTkdfQ0xBU1MpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhbmRsZXJDaGFpbkRlY2xhcmluZ0NsYXNzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSBoYW5kbGVyQ2hhaW5EZWNsYXJpbmdDbGFzczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyA9IERlc2NyaXB0aW9uVXRpbHMub3BlbkhhbmRsZXJDb25maWdTdHJlYW0oaGFuZGxlckZpbGVOYW1lLCBjbGFzc05hbWUsIGNsYXNzTG9hZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmKGlzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJoYW5kbGVyQ2hhaW5OUyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlckZpbGVOYW1lLCBjbGFzc05hbWUpKTsKLQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlckNoYWluc1R5cGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb25VdGlscy5sb2FkSGFuZGxlckNoYWlucyhpcywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRDbGFzc0xvYWRlcih0aGlzLmdldENsYXNzKCkpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGhhbmRsZXJDaGFpbnNUeXBlOwotICAgIH0KLQotICAgIAotICAgIC8qCi0gICAgICogVGhpcyBpcyBhIGNsaWVudCBzaWRlIG9ubHkgbWV0aG9kLiBUaGUgZ2VuZXJhdGVkIHNlcnZpY2UgY2xhc3MgbWF5IGNvbnRhaW4gCi0gICAgICogaGFuZGxlciBjaGFpbiBhbm5vdGF0aW9ucwotICAgICAqLwotICAgIHB1YmxpYyBIYW5kbGVyQ2hhaW4gZ2V0QW5ub0hhbmRsZXJDaGFpbkFubm90YXRpb24oT2JqZWN0IHNwYXJzZUNvbXBvc2l0ZUtleSkgewotICAgICAgICBpZiAodGhpcy5oYW5kbGVyQ2hhaW5Bbm5vdGF0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgIENsYXNzIHNlcnZpY2VDbGFzcyA9IGNvbXBvc2l0ZS5nZXRDb3JyZXNwb25kaW5nQ2xhc3MoKTsKLSAgICAgICAgICAgICAgICBpZiAoc2VydmljZUNsYXNzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlckNoYWluQW5ub3RhdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKEhhbmRsZXJDaGFpbikgZ2V0QW5ub3RhdGlvbihzZXJ2aWNlQ2xhc3MsIEhhbmRsZXJDaGFpbi5jbGFzcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQlpZiAoaGFuZGxlckNoYWluQW5ub3RhdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoc3BhcnNlQ29tcG9zaXRlS2V5ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgc3BhcnNlQ29tcG9zaXRlID0gY29tcG9zaXRlLmdldFNwYXJzZUNvbXBvc2l0ZShzcGFyc2VDb21wb3NpdGVLZXkpOwotICAgICAgICAgICAgICAgIGlmIChzcGFyc2VDb21wb3NpdGUgIT0gbnVsbCAmJiBzcGFyc2VDb21wb3NpdGUuZ2V0SGFuZGxlckNoYWluQW5ub3QoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZXJDaGFpbkFubm90YXRpb24gPSBzcGFyc2VDb21wb3NpdGUuZ2V0SGFuZGxlckNoYWluQW5ub3QoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gaGFuZGxlckNoYWluQW5ub3RhdGlvbjsKLSAgICB9Ci0gICAgCi0gICAgLyogUmV0dXJucyB0aGUgV1NETCBkZWZpbml0b24gYXMgc3BlY2lmaWVkIGluIHRoZSBtZXRhZGF0YS4gIE5vdGUgdGhhdCB0aGlzIFdTREwgbWF5IG5vdCBiZQotICAgICAqIGNvbXBsZXRlLgotICAgICAqLwotICAgIHB1YmxpYyBEZWZpbml0aW9uIGdldFdTRExEZWZpbml0aW9uKCkgewotICAgICAgICBEZWZpbml0aW9uIGRlZm4gPSBudWxsOwotICAgICAgICBpZiAoZ2V0V1NETFdyYXBwZXIoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBkZWZuID0gZ2V0V1NETFdyYXBwZXIoKS5nZXREZWZpbml0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGRlZm47Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgV1NETCBkZWZpbml0b24gYXMgY3JlYXRlZCBieSBjYWxsaW5nIHRoZSBXU0RMIGdlbmVyYXRvci4gIFRoaXMgd2lsbCBiZSBudWxsCi0gICAgICogdW5sZXNzIHRoZSBXU0RMIGRlZmluaXRpb24gcHJvdmlkZWQgYnkgdGhlIG1ldGFkYXRhIGlzIGluY29tcGxldGUKLSAgICAgKi8KLSAgICBwdWJsaWMgRGVmaW5pdGlvbiBnZXRXU0RMR2VuZXJhdGVkRGVmaW5pdGlvbigpIHsKLSAgICAgICAgRGVmaW5pdGlvbiBkZWZuID0gbnVsbDsKLSAgICAgICAgaWYgKGdldEdlbmVyYXRlZFdzZGxXcmFwcGVyKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgZGVmbiA9IGdldEdlbmVyYXRlZFdzZGxXcmFwcGVyKCkuZ2V0RGVmaW5pdGlvbigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBkZWZuOwotICAgIH0KLQotICAgIHB1YmxpYyBTZXJ2aWNlIGdldFdTRExTZXJ2aWNlKCkgewotICAgICAgICBTZXJ2aWNlIHJldHVybldTRExTZXJ2aWNlID0gbnVsbDsKLSAgICAgICAgRGVmaW5pdGlvbiBkZWZuID0gZ2V0V1NETERlZmluaXRpb24oKTsKLSAgICAgICAgaWYgKGRlZm4gIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuV1NETFNlcnZpY2UgPSBkZWZuLmdldFNlcnZpY2UoZ2V0U2VydmljZVFOYW1lKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXR1cm5XU0RMU2VydmljZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWFwIGdldFdTRExQb3J0cygpIHsKLSAgICAgICAgU2VydmljZSB3c2RsU2VydmljZSA9IGdldFdTRExTZXJ2aWNlKCk7Ci0gICAgICAgIGlmICh3c2RsU2VydmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gd3NkbFNlcnZpY2UuZ2V0UG9ydHMoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8UU5hbWU+IGdldFBvcnRzKE9iamVjdCBzZXJ2aWNlRGVsZWdhdGVLZXkpIHsKLSAgICAgICAgQXJyYXlMaXN0PFFOYW1lPiBwb3J0TGlzdCA9IG5ldyBBcnJheUxpc3Q8UU5hbWU+KCk7Ci0gICAgICAgIC8vIE5vdGUgdGhhdCB3ZSBkb24ndCBjYWNoZSB0aGVzZSByZXN1bHRzIGJlY2F1c2UgdGhlIGxpc3Qgb2YgcG9ydHMgY2FuIGJlIGFkZGVkCi0gICAgICAgIC8vIHRvIHZpYSBnZXRQb3J0KC4uLikgYW5kIGFkZFBvcnQoLi4uKS4KLQotICAgICAgICAvLyBJZiB0aGUgV1NETCBpcyBzcGVjaWZpZWQsIGdldCB0aGUgbGlzdCBvZiBwb3J0cyB1bmRlciB0aGlzIHNlcnZpY2UKLSAgICAgICAgTWFwIHdzZGxQb3J0c01hcCA9IGdldFdTRExQb3J0cygpOwotICAgICAgICBpZiAod3NkbFBvcnRzTWFwICE9IG51bGwpIHsKLSAgICAgICAgICAgIEl0ZXJhdG9yIHdzZGxQb3J0c0l0ZXJhdG9yID0gd3NkbFBvcnRzTWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAvLyBOb3RlIHRoYXQgdGhlIFdTREwgUG9ydHMgZG8gbm90IGhhdmUgYSB0YXJnZXQgbmFtZXNwYWNlIGFzc29jaWF0ZWQgd2l0aCB0aGVtLgotICAgICAgICAgICAgLy8gSkFYV1Mgc2F5cyB0byB1c2UgdGhlIFROUyBmcm9tIHRoZSBTZXJ2aWNlLgotICAgICAgICAgICAgU3RyaW5nIHNlcnZpY2VUTlMgPSBnZXRTZXJ2aWNlUU5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgIGZvciAoUG9ydCB3c2RsUG9ydCA9IG51bGw7IHdzZGxQb3J0c0l0ZXJhdG9yLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICB3c2RsUG9ydCA9IChQb3J0KXdzZGxQb3J0c0l0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgd3NkbFBvcnRMb2NhbFBhcnQgPSB3c2RsUG9ydC5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgcG9ydExpc3QuYWRkKG5ldyBRTmFtZShzZXJ2aWNlVE5TLCB3c2RsUG9ydExvY2FsUGFydCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gR28gdGhyb3VnaCB0aGUgbGlzdCBvZiBFbmRwb2ludHMgdGhhdCBoYXZlIGJlZW4gY3JlYXRlZCBhbmQgYWRkIGFueQotICAgICAgICAvLyBub3QgYWxyZWFkeSBpbiB0aGUgbGlzdC4gIFRoaXMgd2lsbCBpbmNsdWRlIHBvcnRzIGFkZGVkIHRvIHRoZSBTZXJ2aWNlCi0gICAgICAgIC8vIHZpYSBnZXRQb3J0KC4uLikgYW5kIGFkZFBvcnQoLi4uKQotICAgICAgICBDb2xsZWN0aW9uPEVuZHBvaW50RGVzY3JpcHRpb24+IGVuZHBvaW50RGVzY3MgPSBnZXRFbmRwb2ludERlc2NyaXB0aW9uc19Bc0NvbGxlY3Rpb24oKTsKLSAgICAgICAgZm9yIChFbmRwb2ludERlc2NyaXB0aW9uIGVuZHBvaW50RGVzYyA6IGVuZHBvaW50RGVzY3MpIHsKLSAgICAgICAgICAgIFFOYW1lIGVuZHBvaW50UG9ydFFOYW1lID0gZW5kcG9pbnREZXNjLmdldFBvcnRRTmFtZSgpOwotICAgICAgICAgICAgaWYgKCFwb3J0TGlzdC5jb250YWlucyhlbmRwb2ludFBvcnRRTmFtZSkpIHsKLSAgICAgICAgICAgICAgICBwb3J0TGlzdC5hZGQoZW5kcG9pbnRQb3J0UU5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvL1JldHJpZXZlIGFsbCB0aGUgZHluYW1pYyBwb3J0cyBmb3IgdGhpcyBjbGllbnQKLSAgICAgICAgaWYgKHNlcnZpY2VEZWxlZ2F0ZUtleSAhPSBudWxsKSB7Ci0JCQlDb2xsZWN0aW9uPEVuZHBvaW50RGVzY3JpcHRpb25JbXBsPiBkeW5hbWljRW5kcG9pbnREZXNjcyA9IGdldER5bmFtaWNFbmRwb2ludERlc2NyaXB0aW9uc19Bc0NvbGxlY3Rpb24oc2VydmljZURlbGVnYXRlS2V5KTsKLQkJCWlmIChkeW5hbWljRW5kcG9pbnREZXNjcyAhPSBudWxsKSB7Ci0JCQkJZm9yIChFbmRwb2ludERlc2NyaXB0aW9uIGR5bmFtaWNFbmRwb2ludERlc2MgOiBkeW5hbWljRW5kcG9pbnREZXNjcykgewotCQkJCQlRTmFtZSBlbmRwb2ludFBvcnRRTmFtZSA9IGR5bmFtaWNFbmRwb2ludERlc2MKLQkJCQkJCQkuZ2V0UG9ydFFOYW1lKCk7Ci0JCQkJCWlmICghcG9ydExpc3QuY29udGFpbnMoZW5kcG9pbnRQb3J0UU5hbWUpKSB7Ci0JCQkJCQlwb3J0TGlzdC5hZGQoZW5kcG9pbnRQb3J0UU5hbWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0gICAgICAgIHJldHVybiBwb3J0TGlzdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxQb3J0PiBnZXRXU0RMUG9ydHNVc2luZ1BvcnRUeXBlKFFOYW1lIHBvcnRUeXBlUU4pIHsKLSAgICAgICAgQXJyYXlMaXN0PFBvcnQ+IHBvcnRMaXN0ID0gbmV3IEFycmF5TGlzdDxQb3J0PigpOwotICAgICAgICBpZiAoIURlc2NyaXB0aW9uVXRpbHMuaXNFbXB0eShwb3J0VHlwZVFOKSkgewotICAgICAgICAgICAgTWFwIHdzZGxQb3J0TWFwID0gZ2V0V1NETFBvcnRzKCk7Ci0gICAgICAgICAgICBpZiAod3NkbFBvcnRNYXAgIT0gbnVsbCAmJiAhd3NkbFBvcnRNYXAuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChPYmplY3QgbWFwRWxlbWVudCA6IHdzZGxQb3J0TWFwLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFBvcnQgd3NkbFBvcnQgPSAoUG9ydCltYXBFbGVtZW50OwotICAgICAgICAgICAgICAgICAgICBQb3J0VHlwZSB3c2RsUG9ydFR5cGUgPSB3c2RsUG9ydC5nZXRCaW5kaW5nKCkuZ2V0UG9ydFR5cGUoKTsKLSAgICAgICAgICAgICAgICAgICAgUU5hbWUgd3NkbFBvcnRUeXBlUU4gPSB3c2RsUG9ydFR5cGUuZ2V0UU5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBvcnRUeXBlUU4uZXF1YWxzKHdzZGxQb3J0VHlwZVFOKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcG9ydExpc3QuYWRkKHdzZGxQb3J0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcG9ydExpc3Q7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8UG9ydD4gZ2V0V1NETFBvcnRzVXNpbmdTT0FQQWRkcmVzcyhMaXN0PFBvcnQ+IHdzZGxQb3J0cykgewotICAgICAgICBBcnJheUxpc3Q8UG9ydD4gcG9ydHNVc2luZ0FkZHJlc3MgPSBuZXcgQXJyYXlMaXN0PFBvcnQ+KCk7Ci0gICAgICAgIGlmICh3c2RsUG9ydHMgIT0gbnVsbCAmJiAhd3NkbFBvcnRzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgZm9yIChQb3J0IGNoZWNrUG9ydCA6IHdzZGxQb3J0cykgewotICAgICAgICAgICAgICAgIExpc3QgZXh0ZW5zaWJpbGl0eUVsZW1lbnRMaXN0ID0gY2hlY2tQb3J0LmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICAgICAgICAgICAgICAgIGZvciAoT2JqZWN0IGNoZWNrRWxlbWVudCA6IGV4dGVuc2liaWxpdHlFbGVtZW50TGlzdCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoRW5kcG9pbnREZXNjcmlwdGlvbkltcGwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaXNTT0FQQWRkcmVzc0VsZW1lbnQoKEV4dGVuc2liaWxpdHlFbGVtZW50KWNoZWNrRWxlbWVudCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBvcnRzVXNpbmdBZGRyZXNzLmFkZChjaGVja1BvcnQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwb3J0c1VzaW5nQWRkcmVzczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbiBnZXRTZXJ2aWNlUnVudGltZURlc2MoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgcmV0dXJuIHJ1bnRpbWVEZXNjTWFwLmdldChuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlUnVudGltZURlc2MoU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbiBzcmQpIHsKLSAgICAgICAgcnVudGltZURlc2NNYXAucHV0KHNyZC5nZXRLZXkoKSwgc3JkKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIHJlc2V0U2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbigpIHsKLSAgICAgICAgcnVudGltZURlc2NNYXAuY2xlYXIoKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBjbGllbnQtc2lkZSBzZXJ2aWNlIGNsYXNzIGlmIGl0IGV4aXN0cy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFNlcnZpY2VDbGFzc05hbWUoKSB7Ci0gICAgICAgIHJldHVybiBjb21wb3NpdGUuZ2V0Q2xhc3NOYW1lKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBFbmRwb2ludERlc2NyaXB0aW9uSW1wbCBnZXREeW5hbWljRW5kcG9pbnREZXNjcmlwdGlvbkltcGwoUU5hbWUgcG9ydFFOYW1lLCBPYmplY3Qga2V5KSB7Ci0gICAgICAgIE1hcDxRTmFtZSwgRW5kcG9pbnREZXNjcmlwdGlvbkltcGw+IGlubmVyTWFwID0gbnVsbDsKLSAgICAgICAgc3luY2hyb25pemVkKGR5bmFtaWNFbmRwb2ludERlc2NyaXB0aW9ucykgewotICAgICAgICAJaW5uZXJNYXAgPSBkeW5hbWljRW5kcG9pbnREZXNjcmlwdGlvbnMuZ2V0KGtleSk7Ci0gICAgICAgICAgICBpZiAoaW5uZXJNYXAgIT0gbnVsbCkgewotICAgICAgICAgICAgCXJldHVybiBpbm5lck1hcC5nZXQocG9ydFFOYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkRHluYW1pY0VuZHBvaW50RGVzY3JpcHRpb25JbXBsKEVuZHBvaW50RGVzY3JpcHRpb25JbXBsIGVuZHBvaW50RGVzY3JpcHRpb25JbXBsLCAKLSAgICAJCQkJCQkJCQkJCQlPYmplY3Qga2V5KSB7Ci0gICAgICAgIE1hcDxRTmFtZSwgRW5kcG9pbnREZXNjcmlwdGlvbkltcGw+IGlubmVyTWFwID0gbnVsbDsKLSAgICAgICAgc3luY2hyb25pemVkKGR5bmFtaWNFbmRwb2ludERlc2NyaXB0aW9ucykgewotICAgICAgICAgICAgaW5uZXJNYXAgPSBkeW5hbWljRW5kcG9pbnREZXNjcmlwdGlvbnMuZ2V0KGtleSk7Ci0gICAgICAgICAgICBpZiAoaW5uZXJNYXAgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgaW5uZXJNYXAgPSBuZXcgSGFzaE1hcDxRTmFtZSwgRW5kcG9pbnREZXNjcmlwdGlvbkltcGw+KCk7Ci0gICAgICAgICAgICAgICBkeW5hbWljRW5kcG9pbnREZXNjcmlwdGlvbnMucHV0KGtleSwgaW5uZXJNYXApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW5uZXJNYXAucHV0KGVuZHBvaW50RGVzY3JpcHRpb25JbXBsLmdldFBvcnRRTmFtZSgpLCBlbmRwb2ludERlc2NyaXB0aW9uSW1wbCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgICAgIAotICAgIC8qKiBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoaXMgRGVzY3JpcHRpb24gb2JqZWN0IGFuZCBhbGwgdGhlIG9iamVjdHMgaXQgY29udGFpbnMuICovCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIG5ld2xpbmUgPSAiXG4iOwotICAgICAgICBmaW5hbCBTdHJpbmcgc2FtZWxpbmUgPSAiOyAiOwotICAgICAgICAvLyBUaGlzIHByb2R1Y2VzIGEgVFJFTUVORE9VUyBhbW91bnQgb2Ygb3V0cHV0IGlmIHdlIGhhdmUgdGhlIFdTREwgRGVmaW5pdGlvbiBvYmplY3RzIAotICAgICAgICAvLyBkbyBhIHRvU3RyaW5nIG9uIHRoZW1zZWx2ZXMuCi0gICAgICAgIGJvb2xlYW4gZHVtcFdTRExDb250ZW50cyA9IGZhbHNlOwotICAgICAgICBTdHJpbmdCdWZmZXIgc3RyaW5nID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gQmFzaWMgaW5mb3JtYXRpb24KLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQoc3VwZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICBzdHJpbmcuYXBwZW5kKG5ld2xpbmUpOwotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZCgiU2VydmljZVFOYW1lOiAiICsgZ2V0U2VydmljZVFOYW1lKCkpOwotICAgICAgICAgICAgLy8gV1NETCBpbmZvcm1hdGlvbgotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZChuZXdsaW5lKTsKLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQoImlzV1NETFNwZWNpZmllZDogIiArIGlzV1NETFNwZWNpZmllZCgpKTsKLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQoc2FtZWxpbmUpOwotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZCgiV1NETCBMb2NhdGlvbjogIiArIGdldFdTRExMb2NhdGlvbigpKTsKLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQobmV3bGluZSk7Ci0gICAgICAgICAgICBpZiAoZHVtcFdTRExDb250ZW50cykgewotICAgICAgICAgICAgICAgIHN0cmluZy5hcHBlbmQoIldTREwgRGVmaW5pdGlvbjogIiArIGdldFdTRExEZWZpbml0aW9uKCkpOwotICAgICAgICAgICAgICAgIHN0cmluZy5hcHBlbmQobmV3bGluZSk7Ci0gICAgICAgICAgICAgICAgc3RyaW5nLmFwcGVuZCgiR2VuZXJhdGVkIFdTREwgRGVmaW5pdGlvbjogIiArIGdldFdTRExHZW5lcmF0ZWREZWZpbml0aW9uKCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzdHJpbmcuYXBwZW5kKCJXU0RMIERlZmluaXRpb24gYXZhaWxhYmxlOiAiICsgKGdldFdTRExEZWZpbml0aW9uKCkgIT0gbnVsbCkpOwotICAgICAgICAgICAgICAgIHN0cmluZy5hcHBlbmQoc2FtZWxpbmUpOwotICAgICAgICAgICAgICAgIHN0cmluZy5hcHBlbmQoIkdlbmVyYXRlZCBXU0RMIERlZmluaXRpb24gYXZhaWxhYmxlOiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgIChnZXRXU0RMR2VuZXJhdGVkRGVmaW5pdGlvbigpICE9IG51bGwpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIFBvcnRzCi0gICAgICAgICAgICBzdHJpbmcuYXBwZW5kKG5ld2xpbmUpOwotICAgICAgICAgICAgTGlzdDxRTmFtZT4gcG9ydHMgPSBnZXRQb3J0cyhudWxsKTsKLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQoIk51bWJlciBvZiBkZWZpbmVkIHBvcnRzOiAiICsgcG9ydHMuc2l6ZSgpKTsKLSAgICAgICAgICAgIC8vVE9ETzogU2hvdyB0aGUgbWFwIHRoYXQgY29udGFpbnMgdGhlIGR5bmFtaWMgcG9ydHMKLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQobmV3bGluZSk7Ci0gICAgICAgICAgICBzdHJpbmcuYXBwZW5kKCJQb3J0IFFOYW1lczogIik7Ci0gICAgICAgICAgICBmb3IgKFFOYW1lIHBvcnQgOiBwb3J0cykgewotICAgICAgICAgICAgICAgIHN0cmluZy5hcHBlbmQocG9ydCArIHNhbWVsaW5lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEF4aXMgQ29uZmlnIGluZm9ybWF0aW9uCi0gICAgICAgICAgICAvLyBXZSBkb24ndCBwcmludCBvdXQgdGhlIGNvbmZpZyBjb250ZXh0IGJlY2F1c2UgaXQgd2lsbCBmb3JjZSBvbmUgdG8gYmUgY3JlYXRlZAotICAgICAgICAgICAgLy8gaWYgaXQgZG9lc24ndCBhbHJlYWR5IGV4aXN0LgotICAgICAgICAgICAgLy8gc3RyaW5nLmFwcGVuZChuZXdsaW5lKTsKLSAgICAgICAgICAgIC8vIHN0cmluZy5hcHBlbmQoIkNvbmZpZ3VyYXRpb25Db250ZXh0OiAiICsgZ2V0QXhpc0NvbmZpZ0NvbnRleHQoKSk7Ci0gICAgICAgICAgICAvLyBFbmRwb2ludERlc2NyaXB0aW9ucwotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZChuZXdsaW5lKTsKLSAgICAgICAgICAgIENvbGxlY3Rpb248RW5kcG9pbnREZXNjcmlwdGlvbj4gZW5kcG9pbnREZXNjcyA9IGdldEVuZHBvaW50RGVzY3JpcHRpb25zX0FzQ29sbGVjdGlvbigpOwotICAgICAgICAgICAgaWYgKGVuZHBvaW50RGVzY3MgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHN0cmluZy5hcHBlbmQoIkVuZHBvaW50RGVzY3JpcHRpb24gYXJyYXkgaXMgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgc3RyaW5nLmFwcGVuZCgiTnVtYmVyIG9mIEVuZHBvaW50RGVzY3JwdGlvbnM6ICIgKyBlbmRwb2ludERlc2NzLnNpemUoKSk7Ci0gICAgICAgICAgICAgICAgc3RyaW5nLmFwcGVuZChuZXdsaW5lKTsKLSAgICAgICAgICAgICAgICBmb3IgKEVuZHBvaW50RGVzY3JpcHRpb24gZW5kcG9pbnREZXNjIDogZW5kcG9pbnREZXNjcykgewotICAgICAgICAgICAgICAgICAgICBzdHJpbmcuYXBwZW5kKGVuZHBvaW50RGVzYy50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgc3RyaW5nLmFwcGVuZChuZXdsaW5lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdHJpbmcuYXBwZW5kKCJSdW50aW1lRGVzY3JpcHRpb25zOiIgKyB0aGlzLnJ1bnRpbWVEZXNjTWFwLnNpemUoKSk7Ci0gICAgICAgICAgICBzdHJpbmcuYXBwZW5kKG5ld2xpbmUpOwotICAgICAgICAgICAgZm9yIChTZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uIHJ1bnRpbWVEZXNjIDogcnVudGltZURlc2NNYXAudmFsdWVzKCkpIHsKLSAgICAgICAgICAgICAgICBzdHJpbmcuYXBwZW5kKHJ1bnRpbWVEZXNjLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIHN0cmluZy5hcHBlbmQobmV3bGluZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0gICAgICAgICAgICBzdHJpbmcuYXBwZW5kKG5ld2xpbmUpOwotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZCgiQ29tcGxldGUgZGVidWcgaW5mb3JtYXRpb24gbm90IGN1cnJlbnRseSBhdmFpbGFibGUgZm9yICIgKwotICAgICAgICAgICAgICAgICAgICAiU2VydmljZURlc2NyaXB0aW9uIik7Ci0gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0cmluZy50b1N0cmluZygpOwotCi0gICAgfQotICAgIC8qKgotICAgICAqIEdldCBhbiBhbm5vdGF0aW9uLiAgVGhpcyBpcyB3cmFwcGVyZWQgdG8gYXZvaWQgYSBKYXZhMlNlY3VyaXR5IHZpb2xhdGlvbi4KLSAgICAgKiBAcGFyYW0gY2xzIENsYXNzIHRoYXQgY29udGFpbnMgYW5ub3RhdGlvbiAKLSAgICAgKiBAcGFyYW0gYW5ub3RhdGlvbiBDbGFzcyBvZiByZXF1cmVzdGVkIEFubm90YXRpb24KLSAgICAgKiBAcmV0dXJuIGFubm90YXRpb24gb3IgbnVsbAotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbihmaW5hbCBDbGFzcyBjbHMsIGZpbmFsIENsYXNzIGFubm90YXRpb24pIHsKLSAgICAgICAgcmV0dXJuIChBbm5vdGF0aW9uKSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEFjdGlvbigpIHsKLSAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgewotICAgICAgICAgICAgICAgIHJldHVybiBjbHMuZ2V0QW5ub3RhdGlvbihhbm5vdGF0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3NMb2FkZXIgZ2V0Q29udGV4dENsYXNzTG9hZGVyKGZpbmFsIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKSB7Ci0gICAgICAgIENsYXNzTG9hZGVyIGNsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY2wgPSAoQ2xhc3NMb2FkZXIpIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAotICAgICAgICAgICAgICAgICAgICBuZXcgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjbGFzc0xvYWRlciAhPSBudWxsID8gY2xhc3NMb2FkZXIgOiBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICApOwotICAgICAgICB9IGNhdGNoIChQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiRXhjZXB0aW9uIHRocm93biBmcm9tIEFjY2Vzc0NvbnRyb2xsZXI6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGUuZ2V0RXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGNsOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBDbGFzc0xvYWRlciBnZXRDbGFzc0xvYWRlcihmaW5hbCBDbGFzcyBjbHMpIHsKLSAgICAgICAgQ2xhc3NMb2FkZXIgY2wgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY2wgPSAoQ2xhc3NMb2FkZXIpIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAotICAgICAgICAgICAgICAgICAgICBuZXcgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjbHMuZ2V0Q2xhc3NMb2FkZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgKTsKLSAgICAgICAgfSBjYXRjaCAoUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkV4Y2VwdGlvbiB0aHJvd24gZnJvbSBBY2Nlc3NDb250cm9sbGVyOiAiICsgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGUuZ2V0RXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGNsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFJlc29sdmVkSGFuZGxlcnNEZXNjcmlwdGlvbihQb3J0SW5mbyBwb3J0SW5mbywgUmVzb2x2ZWRIYW5kbGVyc0Rlc2NyaXB0aW9uIHJlc29sdmVkSGFuZGxlcnNJbmZvKSB7Ci0gICAgICAgIC8vIEdldCB0aGUgY2FjaGUgYW5kIHN0b3JlIHRoZSBoYW5kbGVyIGRlc2NyaXB0aW9uCi0gICAgICAgIE1hcDxQb3J0SW5mbywgUmVzb2x2ZWRIYW5kbGVyc0Rlc2NyaXB0aW9uPiBjYWNoZSA9IHJlc29sdmVkSGFuZGxlcnNEZXNjcmlwdGlvbi5nZXQoKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChjYWNoZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBjYWNoZSA9IG5ldyBDb25jdXJyZW50SGFzaE1hcDxQb3J0SW5mbywgUmVzb2x2ZWRIYW5kbGVyc0Rlc2NyaXB0aW9uPigpOwotICAgICAgICAgICAgcmVzb2x2ZWRIYW5kbGVyc0Rlc2NyaXB0aW9uID0KLSAgICAgICAgICAgICAgICBuZXcgU29mdFJlZmVyZW5jZTxNYXA8UG9ydEluZm8sIFJlc29sdmVkSGFuZGxlcnNEZXNjcmlwdGlvbj4+KGNhY2hlKTsKLSAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIGNhY2hlLnB1dChwb3J0SW5mbywgcmVzb2x2ZWRIYW5kbGVyc0luZm8pOwotICAgICAgICAKLSAgICB9Ci0KLSAgICAKLSAgICBwdWJsaWMgUmVzb2x2ZWRIYW5kbGVyc0Rlc2NyaXB0aW9uIGdldFJlc29sdmVkSGFuZGxlcnNEZXNjcmlwdGlvbihQb3J0SW5mbyBwb3J0SW5mbykgewotICAgICAgICBNYXA8UG9ydEluZm8sIFJlc29sdmVkSGFuZGxlcnNEZXNjcmlwdGlvbj4gY2FjaGUgPSByZXNvbHZlZEhhbmRsZXJzRGVzY3JpcHRpb24uZ2V0KCk7Ci0KLSAgICAgICAgcmV0dXJuIChjYWNoZSA9PSBudWxsKSA/Ci0gICAgICAgICAgICAgICAgbnVsbDogLy8gTm8gQ2FjaGUKLSAgICAgICAgICAgICAgICBjYWNoZS5nZXQocG9ydEluZm8pOyAKLSAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBTdHJpbmcgcmVzb2x2ZVdTRExMb2NhdGlvbkJ5Q2F0YWxvZyhTdHJpbmcgd3NkbExvY2F0aW9uKSB7Ci0gICAgICAgIGlmIChjYXRhbG9nTWFuYWdlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBDYXRhbG9nIGNhdGFsb2cgPSBjYXRhbG9nTWFuYWdlci5nZXRDYXRhbG9nKCk7Ci0gICAgICAgICAgICBpZiAoY2F0YWxvZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHJlc29sdmVkTG9jYXRpb24gPSBudWxsOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc29sdmVkTG9jYXRpb24gPSBjYXRhbG9nLnJlc29sdmVTeXN0ZW0od3NkbExvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlc29sdmVkTG9jYXRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZWRMb2NhdGlvbiA9IGNhdGFsb2cucmVzb2x2ZVVSSSh3c2RsTG9jYXRpb24pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIG5vcm1hbGx5LCBvbmUgbWlnaHQgYWxzbyBkbyB0aGUgZm9sbG93aW5nLCBidXQgaW4gdGhpcyBjYXNlIHdlJ3JlIGxvb2tpbmcgYXQgYSB0b3AtbGV2ZWwgV1NETCwgc28gbm8gcGFyZW50Ci0gICAgICAgICAgICAgICAgICAgIC8vIHJlc29sdmVkTG9jYXRpb24gPSBjYXRhbG9nLnJlc29sdmVQdWJsaWMod3NkbExvY2F0aW9uLCBwYXJlbnQpOwotICAgICAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWRMb2NhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlhNTENhdGFsb2cgdHJhbnNmb3JtZWQgb3JpZ2luYWwgd3NkbCBsb2NhdGlvbiBcIiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgd3NkbExvY2F0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJcIiB0byBcIiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcmVzb2x2ZWRMb2NhdGlvbiArICJcIiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVkTG9jYXRpb247Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ2F0YWxvZyByZXNvbHV0aW9uIGF0dGVtcHQgY2F1c2VkIGV4Y2VwdGlvbjogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB3c2RsTG9jYXRpb247Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEluY3JlbWVudCB0aGUgdXNlIGNvdW50IGZvciB0aGlzIFNlcnZpY2VEZXNjcmlwdGlvbiBpbnN0YW5jZS4gIE5vdGUgdGhlIHVzZSBjb3VudCBpcwotICAgICAqIG9ubHkgdXNlZCBvbiB0aGUgY2xpZW50IHNpZGUuCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIGJvb2xlYW4gaXNJblVzZSgpIHsKLSAgICAgICAgcmV0dXJuIHVzZUNvdW50ID4gMDsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmVnaXN0ZXIgdGhhdCB0aGlzIFNlcnZpY2VEZXNjcmlwdGlvbiBpcyBiZWluZyB1c2VkIGJ5IGEgc2VydmljZSBkZWxlZ2F0ZSBpbnN0YW5jZS4gIE5vdGUKLSAgICAgKiB0aGlzIGlzIG9ubHkgdXNlZCBvbiB0aGUgY2xpZW50IHNpZGUgKHNpbmNlIHRoZSBzZXJ2aWNlIGRlbGVnYXRlIGlzIHdoYXQgaXMgYmVpbmcgCi0gICAgICogcmVnaXN0ZXJlZCkuCi0gICAgICogCi0gICAgICogTm90ZSB0aGF0IHRoaXMgaXMgcGFja2FnZSBwcm90ZWN0ZWQgc2luY2Ugb25seSB0aGUgaW1wbGVtZW50YXRpb24gY2xhc3NlcyBzaG91bGQgYmUgY2FsbGluZwotICAgICAqIGl0LgotICAgICAqLwotICAgIHZvaWQgcmVnaXN0ZXJVc2UoKSB7Ci0gICAgICAgIHVzZUNvdW50Kys7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGVyZWdpc3RlciB0aGF0IHRoaXMgU2VydmljZURlc2NyaXB0aW9uIGlzIGJlaW5nIHVzZWQgYnkgYSBzZXJ2aWNlIGRlbGVnYXRlIGluc3RhbmNlLiAgTm90ZQotICAgICAqIHRoaXMgaXMgb25seSB1c2VkIG9uIHRoZSBjbGllbnQgc2lkZSAoc2luY2UgdGhlIHNlcnZpY2UgZGVsZWdhdGUgaXMgd2hhdCBpcyBiZWluZyAKLSAgICAgKiByZWdpc3RlcmVkKS4KLQotICAgICAqIE5vdGUgdGhhdCB0aGlzIGlzIHBhY2thZ2UgcHJvdGVjdGVkIHNpbmNlIG9ubHkgdGhlIGltcGxlbWVudGF0aW9uIGNsYXNzZXMgc2hvdWxkIGJlIGNhbGxpbmcKLSAgICAgKiBpdC4KLSAgICAgKi8KLSAgICB2b2lkIGRlcmVnaXN0ZXJVc2UoKSB7Ci0gICAgICAgIGlmICh1c2VDb3VudCA+IDApIHsKLSAgICAgICAgICAgIHVzZUNvdW50LS07Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZWxlYXNlUmVzb3VyY2VzKE9iamVjdCBkZWxlZ2F0ZSkgewotICAgICAgICB0cnkgewotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiU2VydmljZURlc2NyaXB0aW9uIHJlbGVhc2UgcmVzb3VyY2VzIGNhbGxlZCB3aXRoIGRlbGVnYXRlICIgKyBkZWxlZ2F0ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gSWYgdGhlIHNlcnZpY2UgZGVzYyBjYW4gYmUgcmVtb3ZlZCBmcm9tIHRoZSBjYWNoZSwgd2hpY2ggbWVhbnMgbm8gb3RoZXIgc2VydmljZSBkZWxlZ2F0ZXMKLSAgICAgICAgLy8gYXJlIHVzaW5nIGl0LCB0aGVuIHdlIHdpbGwgcmVsZWFzZSB0aGUgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCBpdC4gIElmIGl0IGNhbid0IGJlIAotICAgICAgICAvLyByZW1vdmVkIGJlY2F1c2UgaXQgaXMgc3RpbGwgaW4gdXNlLCB0aGVuIGp1c3QgcmV0dXJuLgotICAgICAgICBpZiAoIURlc2NyaXB0aW9uRmFjdG9yeUltcGwucmVtb3ZlRnJvbUNhY2hlKHRoaXMpKSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlNlcnZpY2VEZXNjIHdhcyBub3QgcmVtb3ZlZCBmcm9tIGNhY2hlLCBzbyBpdCB3aWxsIG5vdCBiZSByZWxlYXNlZCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiU2VydmljZURlc2Mgd2FzIHJlbW92ZWQgZnJvbSBjYWNoZSwgc28gcmVsZWFzaW5nIGFzc29jaWF0ZWQgcmVzb3VyY2VzIik7Ci0gICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIC8vIENsb3NlIGFsbCB0aGUgZW5kcG9pbnQgZGVzY3MsIGJvdGggZGVjbGFyZWQgYW5kIGR5bmFtaWMKLSAgICAgICAgQ29sbGVjdGlvbjxFbmRwb2ludERlc2NyaXB0aW9uPiBkZWZpbmVkRW5kcG9pbnRzID0gZGVmaW5lZEVuZHBvaW50RGVzY3JpcHRpb25zLnZhbHVlcygpOyAKLSAgICAgICAgaWYgKGRlZmluZWRFbmRwb2ludHMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJSZWxlYXNpbmcgZGVmaW5lZCBlbmRwb2ludHMsIHNpemU6ICIgKyBkZWZpbmVkRW5kcG9pbnRzLnNpemUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKEVuZHBvaW50RGVzY3JpcHRpb24gZW5kcG9pbnREZXNjIDogZGVmaW5lZEVuZHBvaW50cykgewotICAgICAgICAgICAgICAgICgoRW5kcG9pbnREZXNjcmlwdGlvbkltcGwpIGVuZHBvaW50RGVzYykucmVsZWFzZVJlc291cmNlcyhnZXRBeGlzQ29uZmlnQ29udGV4dCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBkZWZpbmVkRW5kcG9pbnREZXNjcmlwdGlvbnMuY2xlYXIoKTsKLSAgICAgICAgCi0gICAgICAgIENvbGxlY3Rpb248TWFwPFFOYW1lLCBFbmRwb2ludERlc2NyaXB0aW9uSW1wbD4+IGR5bmFtaWNFbmRwb2ludHNNYXAgPSAKLSAgICAgICAgICAgIGR5bmFtaWNFbmRwb2ludERlc2NyaXB0aW9ucy52YWx1ZXMoKTsKLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIlJlbGVhc2luZyBkeW5hbWljIGVuZHBvaW50cywgc2l6ZTogIiArIGR5bmFtaWNFbmRwb2ludHNNYXAuc2l6ZSgpKTsKLSAgICAgICAgfQotICAgICAgICBJdGVyYXRvcjxNYXA8UU5hbWUsIEVuZHBvaW50RGVzY3JpcHRpb25JbXBsPj4gZHluYW1pY0VuZHBvaW50c01hcEl0ZXJhdG9yID0gZHluYW1pY0VuZHBvaW50c01hcC5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoZHluYW1pY0VuZHBvaW50c01hcEl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgTWFwPFFOYW1lLCBFbmRwb2ludERlc2NyaXB0aW9uSW1wbD4gbWFwRW50cnkgPSBkeW5hbWljRW5kcG9pbnRzTWFwSXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgQ29sbGVjdGlvbjxFbmRwb2ludERlc2NyaXB0aW9uSW1wbD4gZHluYW1pY0VuZHBvaW50cyA9IG1hcEVudHJ5LnZhbHVlcygpOwotICAgICAgICAgICAgaWYgKGR5bmFtaWNFbmRwb2ludHMgIT0gbnVsbCAmJiBkeW5hbWljRW5kcG9pbnRzLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBmb3IgKEVuZHBvaW50RGVzY3JpcHRpb24gZW5kcG9pbnREZXNjIDogZHluYW1pY0VuZHBvaW50cykgewotICAgICAgICAgICAgICAgICAgICAoKEVuZHBvaW50RGVzY3JpcHRpb25JbXBsKSBlbmRwb2ludERlc2MpLnJlbGVhc2VSZXNvdXJjZXMoZ2V0QXhpc0NvbmZpZ0NvbnRleHQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFJlbW92ZSB0aGlzIGVuZHBvaW50IGZyb20gdGhlIGxpc3Qgb24gYXhpcyBjb25maWcgCi0gICAgICAgICAgICAgICAgICAgIHJlbW92ZUZyb21EeW5hbWljRW5kcG9pbnRDYWNoZShlbmRwb2ludERlc2MpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBkeW5hbWljRW5kcG9pbnREZXNjcmlwdGlvbnMuY2xlYXIoKTsKLSAgICAgICAgCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlJlbGVhc2UgcmVzb3JjZXMgaW4gU2VydmljZURlc2MgY2F1Z2h0IHRocm93YWJsZSAiLCB0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24odCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmVtb3ZlIHRoZSBlbmRwb2ludERlc2NyaXB0aW9uIGZyb20gdGhlIGxpc3Qgb2YgZHluYW1pYyBwb3J0cyBoZWxkIG9uIHRoZQotICAgICAqIEF4aXNDb25maWd1cmF0aW9uIG9iamVjdC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZW5kcG9pbnREZXNjIFRoZSBlbmRwb2ludERlc2NyaXB0aW9uIHRvIGJlIHJlbW92ZWQgZnJvbSB0aGUgbGlzdC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcmVtb3ZlRnJvbUR5bmFtaWNFbmRwb2ludENhY2hlKEVuZHBvaW50RGVzY3JpcHRpb24gZW5kcG9pbnREZXNjKSB7Ci0gICAgICAgIEF4aXNDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gPSBjb25maWdDb250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgIFBhcmFtZXRlciBwYXJhbWV0ZXIgPSBjb25maWd1cmF0aW9uLmdldFBhcmFtZXRlcihKQVhXU19EWU5BTUlDX0VORFBPSU5UUyk7Ci0gICAgICAgIEhhc2hNYXAgY2FjaGVkRGVzY3JpcHRpb25zID0gKEhhc2hNYXApCi0gICAgICAgICAgICAgICAgKChwYXJhbWV0ZXIgPT0gbnVsbCkgPyBudWxsIDogcGFyYW1ldGVyLmdldFZhbHVlKCkpOwotICAgICAgICBpZiAoY2FjaGVkRGVzY3JpcHRpb25zICE9IG51bGwpIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZChjYWNoZWREZXNjcmlwdGlvbnMpIHsKLSAgICAgICAgICAgICAgICBTZXQgY2FjaGVkRGVzY1NldCA9IGNhY2hlZERlc2NyaXB0aW9ucy5lbnRyeVNldCgpOwotICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGNhY2hlZERlc2NJdGVyYXRvciA9IGNhY2hlZERlc2NTZXQuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAoY2FjaGVkRGVzY0l0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICBNYXAuRW50cnkgbWFwRW50cnkgPSAoTWFwLkVudHJ5KSBjYWNoZWREZXNjSXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBXZWFrUmVmZXJlbmNlIHdlYWtSZWYgPSAoV2Vha1JlZmVyZW5jZSkgbWFwRW50cnkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHdlYWtSZWYgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbkltcGwgY2hlY2tEeW5hbWljRW5kcG9pbnREZXNjID0gKEVuZHBvaW50RGVzY3JpcHRpb25JbXBsKSB3ZWFrUmVmLmdldCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVuZHBvaW50RGVzYyA9PSBjaGVja0R5bmFtaWNFbmRwb2ludERlc2MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZWREZXNjSXRlcmF0b3IucmVtb3ZlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiUmVtb3ZpbmcgZW5kcG9pbnQgZGVzYyBmcm9tIGR5bmFtaWMgY2FjaGUgb24gY29uZmlndXJhdGlvbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2ltcGwvVVJJUmVzb2x2ZXJJbXBsLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9pbXBsL1VSSVJlc29sdmVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTU0Nzg4Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2ltcGwvVVJJUmVzb2x2ZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmltcGw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLkV4Y2VwdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5pMThuLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEucmVzb2x2ZXIuVVJJUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci1pbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb247Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbjsKLQotLyoqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBsb2NhdGUgeG1sIHNjaGVtYXMgdGhhdCBhcmUgaW1wb3J0ZWQgYnkgd3NkbCBkb2N1bWVudHMuICovCi1wdWJsaWMgY2xhc3MgVVJJUmVzb2x2ZXJJbXBsIGltcGxlbWVudHMgVVJJUmVzb2x2ZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhUVFBfUFJPVE9DT0wgPSAiaHR0cCI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRUUFNfUFJPVE9DT0wgPSAiaHR0cHMiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVfUFJPVE9DT0wgPSAiZmlsZSI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFSX1BST1RPQ09MID0gImphciI7Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9SRVNPVVJDRV9QUk9UT0NPTCA9ICJidW5kbGVyZXNvdXJjZSI7Ci0KLSAgICBwcml2YXRlIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyOwotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhVUklSZXNvbHZlckltcGwuY2xhc3MpOwotCi0gICAgcHVibGljIFVSSVJlc29sdmVySW1wbCgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVVJJUmVzb2x2ZXJJbXBsKENsYXNzTG9hZGVyIGNsKSB7Ci0gICAgICAgIGNsYXNzTG9hZGVyID0gY2w7Ci0gICAgfQotCi0gICAgcHVibGljIElucHV0U291cmNlIHJlc29sdmVFbnRpdHkoU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIHNjaGVtYUxvY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBiYXNlVXJpKSB7Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJyZXNvbHZlRW50aXR5OiBbIisgbmFtZXNwYWNlICsgIl1bIisgc2NoZW1hTG9jYXRpb24gKyAiXVsgIiArIGJhc2VVcmkrICJdIik7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIElucHV0U3RyZWFtIGlzID0gbnVsbDsKLSAgICAgICAgVVJJIHBhdGhVUkkgPSBudWxsOwotICAgICAgICBTdHJpbmcgcGF0aFVSSVN0ciA9IG51bGw7Ci0gICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIkltcG9ydCBsb2NhdGlvbjogIiArIHNjaGVtYUxvY2F0aW9uICsgIiBwYXJlbnQgZG9jdW1lbnQ6ICIgKyAKLSAgICAgICAgICAgICAgICAgICAgYmFzZVVyaSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJhc2VVcmkgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAvLyBpZiB0aGUgbG9jYXRpb24gaXMgYW4gYWJzb2x1dGUgcGF0aCwgYnVpbGQgYSBVUkwgZGlyZWN0bHkKLSAgICAgICAgICAgICAgICAvLyBmcm9tIGl0Ci0gICAgICAgICAgICAJaWYobG9nLmlzRGVidWdFbmFibGVkKCkpewotICAgICAgICAgICAgCQlsb2cuZGVidWcoIkJhc2UgVVJJIG5vdCBudWxsIik7Ci0gICAgICAgICAgICAJfQotICAgICAgICAgICAgICAgIGlmIChpc0Fic29sdXRlKHNjaGVtYUxvY2F0aW9uKSkgewotICAgICAgICAgICAgICAgICAgICBpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJSZXRyaWV2aW5nIGlucHV0IHN0cmVhbSBmb3IgYWJzb2x1dGUgc2NoZW1hIGxvY2F0aW9uOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc2NoZW1hTG9jYXRpb24pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlzID0gZ2V0SW5wdXRTdHJlYW1Gb3JVUkkoc2NoZW1hTG9jYXRpb24pOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoInNjaGVtYUxvY2F0aW9uIG5vdCBpbiBhYnNvbHV0ZSBwYXRoIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgdHJ5ewotICAgICAgICAgICAgICAgICAgICAgICAgcGF0aFVSSSA9IG5ldyBVUkkoYmFzZVVyaSk7Ci0gICAgICAgICAgICAgICAgICAgIH1jYXRjaChVUklTeW50YXhFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBHb3QgVVJJU3ludGF4RXhjZXB0aW9uLCBDcmVhdGlvbiBvZiBVUkkgcmVxdWlyZXMgCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGF0IHdlIHVzZSBzcGVjaWFsIGVzY2FwZSBjaGFyYWN0ZXJzIGluIHBhdGguCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgVVJJIGNvbnN0cnVjdG9yIGJlbG93IGRvZXMgdGhpcyBmb3IgdXMsIHNvIGxldHMgdXNlIHRoYXQuCi0gICAgICAgICAgICAgICAgICAgICAgICBpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJHb3QgVVJJU3ludGF4RXhjZXB0aW9uLiBFeGNlcHRpb24gTWVzc2FnZSA9ICIrZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiSW1wbGVtZW50aW5nIGFsdGVybmF0ZSB3YXkgdG8gY3JlYXRlIFVSSSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICBwYXRoVVJJID0gbmV3IFVSSShudWxsLCBudWxsLCBiYXNlVXJpLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcGF0aFVSSVN0ciA9IHNjaGVtYUxvY2F0aW9uOwotICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGlzIGlzIGFic29sdXRlIHdlIG5lZWQgdG8gcmVzb2x2ZSB0aGUgcGF0aCB3aXRob3V0IHRoZSAKLSAgICAgICAgICAgICAgICAgICAgLy8gc2NoZW1lIGluZm9ybWF0aW9uCi0gICAgICAgICAgICAgICAgICAgIGlmIChwYXRoVVJJLmlzQWJzb2x1dGUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlBhcmVudCBkb2N1bWVudCBpcyBhdCBhYnNvbHV0ZSBsb2NhdGlvbjogIiArIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aFVSSS50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIFVSTCB1cmwgPSBuZXcgVVJMKGJhc2VVcmkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVybCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJJIHRlbXBVUkk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5ewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wVVJJID0gbmV3IFVSSSh1cmwuZ2V0UGF0aCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Y2F0Y2goVVJJU3ludGF4RXhjZXB0aW9uIGUpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0dvdCBVUklTeW50YXhFeGNlcHRpb24sIENyZWF0aW9uIG9mIFVSSSByZXF1aXJlcyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhhdCB3ZSB1c2Ugc3BlY2lhbCBlc2NhcGUgY2hhcmFjdGVycyBpbiBwYXRoLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgVVJJIGNvbnN0cnVjdG9yIGJlbG93IGRvZXMgdGhpcyBmb3IgdXMsIHNvIGxldHMgdXNlIHRoYXQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiR290IFVSSVN5bnRheEV4Y2VwdGlvbi4gRXhjZXB0aW9uIE1lc3NhZ2UgPSAiK2UuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiSW1wbGVtZW50aW5nIGFsdGVybmF0ZSB3YXkgdG8gY3JlYXRlIFVSSSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBVUkkgPSBuZXcgVVJJKG51bGwsIG51bGwsIHVybC5nZXRQYXRoKCksIG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkkgcmVzb2x2ZWRVUkkgPSB0ZW1wVVJJLnJlc29sdmUoc2NoZW1hTG9jYXRpb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFkZCBiYWNrIHRoZSBzY2hlbWUgdG8gdGhlIHJlc29sdmVkIHBhdGgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoVVJJU3RyID0gY29uc3RydWN0UGF0aCh1cmwsIHJlc29sdmVkVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlJlc29sdmVkIHRoaXMgcGF0aCB0byBpbXBvcnRlZCBkb2N1bWVudDogIiArIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhVUklTdHIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJQYXJlbnQgZG9jdW1lbnQgaXMgYXQgcmVsYXRpdmUgbG9jYXRpb246ICIgKyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhVUkkudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYXRoVVJJID0gcGF0aFVSSS5yZXNvbHZlKHNjaGVtYUxvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhVUklTdHIgPSBwYXRoVVJJLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiUmVzb2x2ZWQgdGhpcyBwYXRoIHRvIGltcG9ydGVkIGRvY3VtZW50OiAiICsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoVVJJU3RyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBJZiBwYXRoIGlzIGFic29sdXRlLCBidWlsZCBVUkwgZGlyZWN0bHkgZnJvbSBpdAotICAgICAgICAgICAgICAgICAgICBpZiAoaXNBYnNvbHV0ZShwYXRoVVJJU3RyKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaXMgPSBnZXRJbnB1dFN0cmVhbUZvclVSSShwYXRoVVJJU3RyKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBsb2NhdGlvbiBpcyByZWxhdGl2ZSwgd2UgbmVlZCB0byByZXNvbHZlIHRoZQotICAgICAgICAgICAgICAgICAgICAvLyBsb2NhdGlvbiB1c2luZwotICAgICAgICAgICAgICAgICAgICAvLyB0aGUgYmFzZVVSSSwgdGhlbiB1c2UgdGhlIGxvYWRTdHJhdGVneSB0byBnYWluIGFuIGlucHV0Ci0gICAgICAgICAgICAgICAgICAgIC8vIHN0cmVhbQotICAgICAgICAgICAgICAgICAgICAvLyBiZWNhdXNlIHRoZSBVUkkgd2lsbCBzdGlsbCBiZSByZWxhdGl2ZSB0byB0aGUgbW9kdWxlCi0gICAgICAgICAgICAgICAgICAgIGlmKGlzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlzID0gY2xhc3NMb2FkZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFJlc291cmNlQXNTdHJlYW0ocGF0aFVSSS50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgaWYobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAJbG9nLmRlYnVnKCJFeGNlcHRpb24gb2NjdXJlZCBpbiByZXNvbHZlRW50aXR5LCBpZ25vcmluZyBleGNlcHRpb24gY29udGludWluZyBwcm9jZXNzaW5nICIrZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmKGlzID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJYU0QgaW5wdXQgc3RyZWFtIGlzIG51bGwgYWZ0ZXIgcmVzb2x2aW5nIGltcG9ydCBmb3I6ICIgKyAKLSAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYUxvY2F0aW9uICsgIiBmcm9tIHBhcmVudCBkb2N1bWVudDogIiArIGJhc2VVcmkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgaWYobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlhTRCBpbnB1dCBzdHJlYW0gaXMgbm90IG51bGwgYWZ0ZXIgcmVzb2x2aW5nIGltcG9ydCBmb3I6ICIgKyAKLSAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYUxvY2F0aW9uICsgIiBmcm9tIHBhcmVudCBkb2N1bWVudDogIiArIGJhc2VVcmkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgSW5wdXRTb3VyY2UgcmV0dXJuSW5wdXRTb3VyY2UgPSBuZXcgSW5wdXRTb3VyY2UoaXMpOwotICAgICAgICAvLyBXZSBuZWVkIHRvIHNldCB0aGUgc3lzdGVtSWQuICBYbWxTY2hlbWEgd2lsbCB1c2UgdGhpcyB2YWx1ZSB0byBtYWludGFpbiBhIGNvbGxlY3Rpb24gb2YKLSAgICAgICAgLy8gaW1wb3J0ZWQgWFNEcyB0aGF0IGhhdmUgYmVlbiByZWFkLiAgSWYgdGhpcyB2YWx1ZSBpcyBudWxsLCB0aGVuIGNpcmN1bGFyIFhTRHMgd2lsbCAKLSAgICAgICAgLy8gY2F1c2UgaW5maW5pdGUgcmVjdXJzaXZlIHJlYWRzLgotICAgICAgICByZXR1cm5JbnB1dFNvdXJjZS5zZXRTeXN0ZW1JZChwYXRoVVJJU3RyICE9IG51bGwgPyBwYXRoVVJJU3RyIDogc2NoZW1hTG9jYXRpb24pOwotICAgICAgICAKLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoInJldHVybklucHV0U291cmNlIDoiICsgcmV0dXJuSW5wdXRTb3VyY2UuZ2V0U3lzdGVtSWQoKSk7ICAgIAotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gcmV0dXJuSW5wdXRTb3VyY2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIHRvIHNlZSBpZiB0aGUgbG9jYXRpb24gZ2l2ZW4gaXMgYW4gYWJzb2x1dGUgKGFjdHVhbCkgb3IgcmVsYXRpdmUgcGF0aC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBsb2NhdGlvbgotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNBYnNvbHV0ZShTdHJpbmcgbG9jYXRpb24pIHsKLSAgICAgICAgYm9vbGVhbiBhYnNvbHV0ZSA9IGZhbHNlOwotICAgICAgICBpZiAobG9jYXRpb24uaW5kZXhPZigiOi8iKSAhPSAtMSkgewotICAgICAgICAgICAgYWJzb2x1dGUgPSB0cnVlOwotICAgICAgICB9IGVsc2UgaWYgKGxvY2F0aW9uLmluZGV4T2YoIjpcXCIpICE9IC0xKSB7Ci0gICAgICAgICAgICBhYnNvbHV0ZSA9IHRydWU7Ci0gICAgICAgIH0gZWxzZSBpZiAobG9jYXRpb24uaW5kZXhPZigiZmlsZToiKSAhPSAtMSkgewotICAgICAgICAgICAgYWJzb2x1dGUgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBhYnNvbHV0ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGlucHV0IHN0cmVhbSBmcm9tIHRoZSB1cmkgZ2l2ZW4uIElmIHdlIGNhbm5vdCBmaW5kIHRoZSBzdHJlYW0sIDxjb2RlPm51bGw8L2NvZGU+IGlzCi0gICAgICogcmV0dXJuZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdXJpCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHByaXZhdGUgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW1Gb3JVUkkoU3RyaW5nIHVyaSkgewotICAgICAgICBVUkwgc3RyZWFtVVJMID0gbnVsbDsKLSAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBudWxsOwotICAgICAgICBVUkkgcGF0aFVSSSA9IG51bGw7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHN0cmVhbVVSTCA9IG5ldyBVUkwodXJpKTsKLSAgICAgICAgICAgIGlzID0gb3BlblN0cmVhbV9kb1ByaXYoc3RyZWFtVVJMKTsKLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgICAgIC8vRXhjZXB0aW9uIGhhbmRsaW5nIG5vdCBuZWVkZWQKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHBhdGhVUkkgPSBuZXcgVVJJKHVyaSk7Ci0gICAgICAgICAgICAgICAgc3RyZWFtVVJMID0gcGF0aFVSSS50b1VSTCgpOwotICAgICAgICAgICAgICAgIGlzID0gb3BlblN0cmVhbV9kb1ByaXYoc3RyZWFtVVJMKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0gICAgICAgICAgICAgICAgLy9FeGNlcHRpb24gaGFuZGxpbmcgbm90IG5lZWRlZAotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGlzID09IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgRmlsZSBmaWxlID0gbmV3IEZpbGUodXJpKTsKLSAgICAgICAgICAgICAgICBzdHJlYW1VUkwgPSAoVVJMKSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmaWxlLnRvVVJMKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICk7Ci0gICAgICAgICAgICAgICAgaXMgPSBvcGVuU3RyZWFtX2RvUHJpdihzdHJlYW1VUkwpOwotICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgICAgICAgICAvL0V4Y2VwdGlvbiBoYW5kbGluZyBub3QgbmVlZGVkCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlzOwotICAgIH0KLQotICAgIHByaXZhdGUgSW5wdXRTdHJlYW0gb3BlblN0cmVhbV9kb1ByaXYoZmluYWwgVVJMIHN0cmVhbVVSTCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiAoSW5wdXRTdHJlYW0pIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAotICAgICAgICAgICAgICAgICAgICBuZXcgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RyZWFtVVJMLm9wZW5TdHJlYW0oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgKTsKLSAgICAgICAgfSBjYXRjaCAoUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyAoSU9FeGNlcHRpb24pIGUuZ2V0RXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBjb25zdHJ1Y3RQYXRoKFVSTCBiYXNlVVJMLCBVUkkgcmVzb2x2ZWRVUkkpIHsKLSAgICAgICAgU3RyaW5nIGltcG9ydExvY2F0aW9uID0gbnVsbDsKLSAgICAgICAgVVJMIHVybCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBBbGxvdyBmb3IgaHR0cCBvciBodHRwcwotICAgICAgICAgICAgaWYgKGJhc2VVUkwuZ2V0UHJvdG9jb2woKSAhPSBudWxsICYmIAotICAgICAgICAgICAgICAgICAgICAoYmFzZVVSTC5nZXRQcm90b2NvbCgpLmVxdWFscyhIVFRQX1BST1RPQ09MKSB8fCAKLSAgICAgICAgICAgICAgICAgICAgIGJhc2VVUkwuZ2V0UHJvdG9jb2woKS5lcXVhbHMoSFRUUFNfUFJPVE9DT0wpIHx8IAotICAgICAgICAgICAgICAgICAgICAgYmFzZVVSTC5nZXRQcm90b2NvbCgpLmVxdWFscyhCVU5ETEVfUkVTT1VSQ0VfUFJPVE9DT0wpKSkgewotICAgICAgICAgICAgCWlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKXsKLSAgICAgICAgICAgIAkJbG9nLmRlYnVnKCJDb25zdHJ1Y3RpbmcgcGF0aCB3aXRoIGh0dHAvaHR0cHMgcHJvdG9jb2wiKTsKLSAgICAgICAgICAgIAl9Ci0gICAgICAgICAgICAgICAgdXJsID0gbmV3IFVSTChiYXNlVVJMLmdldFByb3RvY29sKCksIGJhc2VVUkwuZ2V0SG9zdCgpLCBiYXNlVVJMLmdldFBvcnQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVkVVJJLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotCQkJCQlsb2cuZGVidWcoIlVSTCA9ICIgKyB1cmwpOwotCQkJCX0KLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIGZpbGUKLSAgICAgICAgICAgIGVsc2UgaWYgKGJhc2VVUkwuZ2V0UHJvdG9jb2woKSAhPSBudWxsICYmIGJhc2VVUkwuZ2V0UHJvdG9jb2woKS5lcXVhbHMoRklMRV9QUk9UT0NPTCkpIHsKLSAgICAgICAgICAgIAlpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSl7Ci0gICAgICAgICAgICAJCWxvZy5kZWJ1ZygiQ29uc3RydWN0aW5nIHBhdGggd2l0aCBmaWxlIHByb3RvY29sIik7Ci0gICAgICAgICAgICAJfQotICAgICAgICAgICAgICAgIHVybCA9IG5ldyBVUkwoYmFzZVVSTC5nZXRQcm90b2NvbCgpLCBiYXNlVVJMLmdldEhvc3QoKSwgcmVzb2x2ZWRVUkkudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvL0NoZWNrIGZvciBqYXIKLSAgICAgICAgICAgIGVsc2UgaWYgKGJhc2VVUkwuZ2V0UHJvdG9jb2woKSAhPSBudWxsICYmIGJhc2VVUkwuZ2V0UHJvdG9jb2woKS5lcXVhbHMoSkFSX1BST1RPQ09MKSkgewotICAgICAgICAgICAgCWlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKXsKLSAgICAgICAgICAgIAkJbG9nLmRlYnVnKCJDb25zdHJ1Y3RpbmcgcGF0aCB3aXRoIGphciBwcm90b2NvbCIpOwotICAgICAgICAgICAgCX0KLSAgICAgICAgICAgIAl1cmwgPSBuZXcgVVJMKGJhc2VVUkwuZ2V0UHJvdG9jb2woKSwgYmFzZVVSTC5nZXRIb3N0KCksIHJlc29sdmVkVVJJLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZXsKLSAgICAgICAgICAgICAgICBpZihiYXNlVVJMICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIC8vIHRyeSBjb25zdHJ1Y3RpbmcgaXQgd2l0aCB1bmtub3duIHByb3RvY29sCi0gICAgICAgICAgICAgICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ29uc3RydWN0aW5nIHBhdGggd2l0aCB1bmtub3duIHByb3RvY29sOiAiICsgYmFzZVVSTC5nZXRQcm90b2NvbCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB1cmwgPSBuZXcgVVJMKGJhc2VVUkwuZ2V0UHJvdG9jb2woKSwgYmFzZVVSTC5nZXRIb3N0KCksIHJlc29sdmVkVVJJLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiYmFzZVVSTCBpcyBOVUxMIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgic2NoZW1hSW1wb3J0RXJyb3IiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVkVVJJLnRvU3RyaW5nKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZVVSTC50b1N0cmluZygpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHVybCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoInNjaGVtYUltcG9ydEVycm9yIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlZFVSSS50b1N0cmluZygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VVUkwudG9TdHJpbmcoKSkpOwotICAgICAgICB9Ci0gICAgICAgIGltcG9ydExvY2F0aW9uID0gdXJsLnRvU3RyaW5nKCk7Ci0gICAgICAgIHJldHVybiBpbXBvcnRMb2NhdGlvbjsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3ZhbGlkYXRvci9FbmRwb2ludERlc2NyaXB0aW9uVmFsaWRhdG9yLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi92YWxpZGF0b3IvRW5kcG9pbnREZXNjcmlwdGlvblZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmZiNzI4Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3ZhbGlkYXRvci9FbmRwb2ludERlc2NyaXB0aW9uVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLnZhbGlkYXRvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRW5kcG9pbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkVuZHBvaW50RGVzY3JpcHRpb25KYXZhOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRW5kcG9pbnREZXNjcmlwdGlvbldTREw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5FbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5NRFFDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5pbXBsLkRlc2NyaXB0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5pMThuLk1lc3NhZ2VzOwotCi1pbXBvcnQgamF2YXgud3NkbC5Qb3J0OwotaW1wb3J0IGphdmF4LndzZGwuU2VydmljZTsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRmVhdHVyZTsKLWltcG9ydCBqYXZheC54bWwud3MuaHR0cC5IVFRQQmluZGluZzsKLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5BZGRyZXNzaW5nRmVhdHVyZTsKLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5TT0FQQmluZGluZzsKLWltcG9ydCBqYXZheC54bWwud3Muc3BpLldlYlNlcnZpY2VGZWF0dXJlQW5ub3RhdGlvbjsKLQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgRW5kcG9pbnREZXNjcmlwdGlvblZhbGlkYXRvciBleHRlbmRzIFZhbGlkYXRvciB7Ci0gICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlbmRwb2ludERlc2M7Ci0gICAgRW5kcG9pbnREZXNjcmlwdGlvbkphdmEgZW5kcG9pbnREZXNjSmF2YTsKLSAgICBFbmRwb2ludERlc2NyaXB0aW9uV1NETCBlbmRwb2ludERlc2NXU0RMOwotCi0gICAgcHVibGljIEVuZHBvaW50RGVzY3JpcHRpb25WYWxpZGF0b3IoRW5kcG9pbnREZXNjcmlwdGlvbiB0b1ZhbGlkYXRlKSB7Ci0gICAgICAgIGVuZHBvaW50RGVzYyA9IHRvVmFsaWRhdGU7Ci0gICAgICAgIGVuZHBvaW50RGVzY0phdmEgPSAoRW5kcG9pbnREZXNjcmlwdGlvbkphdmEpZW5kcG9pbnREZXNjOwotICAgICAgICBlbmRwb2ludERlc2NXU0RMID0gKEVuZHBvaW50RGVzY3JpcHRpb25XU0RMKWVuZHBvaW50RGVzYzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZSgpIHsKLQotICAgICAgICBpZiAoZ2V0VmFsaWRhdGlvbkxldmVsKCkgPT0gVmFsaWRhdGlvbkxldmVsLk9GRikgewotICAgICAgICAgICAgcmV0dXJuIFZBTElEOwotICAgICAgICB9Ci0KLSAgICAgICAgLy9UaGUgZm9sbG93aW5nIHBoYXNlIElJIHZhbGlkYXRpb24gY2FuIG9ubHkgaGFwcGVuIG9uIHRoZSBzZXJ2ZXIgc2lkZQotICAgICAgICBpZiAoZW5kcG9pbnREZXNjLmdldFNlcnZpY2VEZXNjcmlwdGlvbigpLmlzU2VydmVyU2lkZSgpKSB7Ci0gICAgICAgICAgICBpZiAoIXZhbGlkYXRlV1NETFBvcnQoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoIXZhbGlkYXRlV1NETEJpbmRpbmdUeXBlKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKCF2YWxpZGF0ZVJlc3BlY3RCaW5kaW5nKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICghdmFsaWRhdGVFbmRwb2ludEludGVyZmFjZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gVkFMSUQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIHZhbGlkYXRlV1NETEJpbmRpbmdUeXBlKCkgewotICAgICAgICBib29sZWFuIGlzQmluZGluZ1ZhbGlkID0gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICAvL0dldCB0aGUgYmluZGluZyB0eXBlIGZyb20gdGhlIGFubm90YXRpb24KLSAgICAgICAgU3RyaW5nIGJpbmRpbmdUeXBlID0gZW5kcG9pbnREZXNjLmdldEJpbmRpbmdUeXBlKCk7Ci0gICAgICAgIAotICAgICAgICAvLyBUaGUgd3NkbCBiaW5kaW5nIHR5cGUgdGhhdCB3ZSBub3cgcmVjZWl2ZSBoYXMgYmVlbiBwcmV2aW91c2x5IG1hcHBlZCB0byB0aGUgZXhwZWN0ZWQKLSAgICAgICAgLy8gU09BUCBhbmQgSFRUUCBiaW5kaW5ncy4gU28sIHRoZXJlIGlzIG5vdyBsaW1pdGVkIHZhbGlkYXRpb24gdG8gcGVyZm9ybS4KLSAgICAgICAgLy8gCi0gICAgICAgIC8vIElNUE9SVEFOVCBOT1RFOiBUaGUgdmFsdWUgcmV0dXJuZWQgaXMgTk9UIHRoZSBXU0RMIEJpbmRpbmcgVHlwZSB2YWx1ZTsgaXQgaGFzIGJlZW4KLSAgICAgICAgLy8gICAgbm9ybWFsaXplZCB0byBiZSB0aGUgdmFsdWUgY29ycmVzcG9uZGluZyB0byB0aGUgSkFYV1MgQmluZGluZ1R5cGUgYW5ub3RhdGlvbnMuCi0gICAgICAgIC8vICAgIFRoYXQgbWVhbnMgd2hlbiB3ZSBsb2cgdGhpcyB2YWx1ZSBiZWxvdyB3ZSBuZWVkIHRvIHVuLW5vcm1hbGl6ZSBpdCBzbyB0aGUgdmFsdWUKLSAgICAgICAgLy8gICAgaXMgb25lIHRoYXQgYWN0dWFsbCBhcHBlYXJzIGluIHRoZSBXU0RMLiAgVGhpcyBpc24ndCBhbiBpc3N1ZSBmb3IgU09BUDExIGJlY2F1c2UKLSAgICAgICAgLy8gICAgdGhlIHZhbHVlcyBhcmUgdGhlIHNhbWU7IGJ1dCBpdCBJUyBhbiBpc3N1ZSBmb3IgU09BUDEyLgotICAgICAgICBTdHJpbmcgd3NkbEJpbmRpbmdUeXBlID0gZW5kcG9pbnREZXNjV1NETC5nZXRXU0RMQmluZGluZ1R5cGUoKTsKLSAgICAgICAgaWYgKGJpbmRpbmdUeXBlID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIEkgZG9uJ3QgdGhpbmsgdGhpcyBjYW4gaGFwcGVuOyB0aGUgRGVzY3JpcHRpb24gbGF5ZXIgc2hvdWxkIHByb3ZpZGUgYSBkZWZhdWx0Ci0gICAgICAgICAgICBhZGRWYWxpZGF0aW9uRmFpbHVyZSh0aGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFubm90YXRpb24gYmluZGluZyB0eXBlIGlzIG51bGwgYW5kIGRpZCBub3QgaGF2ZSBhIGRlZmF1bHQiKTsKLSAgICAgICAgICAgIGlzQmluZGluZ1ZhbGlkID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gVmFsaWRhdGUgdGhhdCB0aGUgYW5ub3RhdGlvbiB2YWx1ZSBzcGVjaWZpZWQgaXMgdmFsaWQuCi0gICAgICAgIGVsc2UgaWYgKCFTT0FQQmluZGluZy5TT0FQMTFIVFRQX0JJTkRJTkcuZXF1YWxzKGJpbmRpbmdUeXBlKSAmJgotICAgICAgICAgICAgICAgICFTT0FQQmluZGluZy5TT0FQMTFIVFRQX01UT01fQklORElORy5lcXVhbHMoYmluZGluZ1R5cGUpICYmCi0gICAgICAgICAgICAgICAgIVNPQVBCaW5kaW5nLlNPQVAxMkhUVFBfQklORElORy5lcXVhbHMoYmluZGluZ1R5cGUpICYmCi0gICAgICAgICAgICAgICAgIVNPQVBCaW5kaW5nLlNPQVAxMkhUVFBfTVRPTV9CSU5ESU5HLmVxdWFscyhiaW5kaW5nVHlwZSkgJiYKLSAgICAgICAgICAgICAgICAhTURRQ29uc3RhbnRzLlNPQVAxMUpNU19CSU5ESU5HLmVxdWFscyhiaW5kaW5nVHlwZSkgJiYKLSAgICAgICAgICAgICAgICAhTURRQ29uc3RhbnRzLlNPQVAxMUpNU19NVE9NX0JJTkRJTkcuZXF1YWxzKGJpbmRpbmdUeXBlKSAmJgotICAgICAgICAgICAgICAgICFNRFFDb25zdGFudHMuU09BUDEySk1TX0JJTkRJTkcuZXF1YWxzKGJpbmRpbmdUeXBlKSAmJgotICAgICAgICAgICAgICAgICFNRFFDb25zdGFudHMuU09BUDEySk1TX01UT01fQklORElORy5lcXVhbHMoYmluZGluZ1R5cGUpICYmCi0gICAgICAgICAgICAgICAgIUhUVFBCaW5kaW5nLkhUVFBfQklORElORy5lcXVhbHMoYmluZGluZ1R5cGUpICYmCi0gICAgICAgICAgICAgICAgIU1EUUNvbnN0YW50cy5TT0FQX0hUVFBfQklORElORy5lcXVhbHMoYmluZGluZ1R5cGUpKSB7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGFkZFZhbGlkYXRpb25GYWlsdXJlKHRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBhbm5vdGF0aW9uIGJpbmRpbmcgdmFsdWUgc3BlY2lmaWVkOiAiICsgYmluZGluZ1R5cGUpOwotICAgICAgICAgICAgaXNCaW5kaW5nVmFsaWQgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKGJpbmRpbmdUeXBlLmVxdWFscyhNRFFDb25zdGFudHMuU09BUF9IVFRQX0JJTkRJTkcpICYmIGVuZHBvaW50RGVzYy5pc0VuZHBvaW50QmFzZWQoKSl7Ci0gICAgICAgIAlhZGRWYWxpZGF0aW9uRmFpbHVyZSh0aGlzLAotICAgICAgICAgICAgICAgICAgICAiQSBTT0FQX0hUVFBfQklORElORyB3YXMgZm91bmQgb24gYSBAQmluZGluZ3R5cGUgU0VJIGJhc2VkIEVuZHBvaW50LiIgKwotICAgICAgICAgICAgICAgICAgICAiIFNPQVBfSFRUUF9CSU5ESU5HIGlzIHN1cHBvcnRlZCBvbiBQcm92aWRlciBFbmRwb2ludHMgb25seS4iKTsKLSAgICAgICAgCWlzQmluZGluZ1ZhbGlkID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gSWYgdGhlcmUncyBubyBXU0RMLCB0aGVuIHRoZXJlIHdpbGwgYmUgbm8gV1NETCBCaW5kaW5nIFR5cGUgdG8gdmFsaWRhdGUgYWdhaW5zdAotICAgICAgICBlbHNlIGlmICh3c2RsQmluZGluZ1R5cGUgPT0gbnVsbCkgewotICAgICAgICAgICAgaXNCaW5kaW5nVmFsaWQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIC8vIFZhbGlkYXRlIHRoYXQgdGhlIFdTREwgdmFsdWUgaXMgdmFsaWQKLSAgICAgICAgZWxzZSBpZiAoIVNPQVBCaW5kaW5nLlNPQVAxMUhUVFBfQklORElORy5lcXVhbHMod3NkbEJpbmRpbmdUeXBlKQotICAgICAgICAgICAgICAgICYmICFTT0FQQmluZGluZy5TT0FQMTJIVFRQX0JJTkRJTkcuZXF1YWxzKHdzZGxCaW5kaW5nVHlwZSkKLSAgICAgICAgICAgICAgICAmJiAhamF2YXgueG1sLndzLmh0dHAuSFRUUEJpbmRpbmcuSFRUUF9CSU5ESU5HLmVxdWFscyh3c2RsQmluZGluZ1R5cGUpKSB7Ci0gICAgICAgICAgICBhZGRWYWxpZGF0aW9uRmFpbHVyZSh0aGlzLCAiSW52YWxpZCB3c2RsIGJpbmRpbmcgdmFsdWUgc3BlY2lmaWVkOiAiIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBEZXNjcmlwdGlvblV0aWxzLm1hcEJpbmRpbmdUeXBlQW5ub3RhdGlvblRvV3NkbCh3c2RsQmluZGluZ1R5cGUpKTsKLSAgICAgICAgICAgIGlzQmluZGluZ1ZhbGlkID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gVmFsaWRhdGUgdGhhdCB0aGUgV1NETCBhbmQgYW5ub3RhdGlvbnMgdmFsdWVzIGluZGljYXRlIHRoZSBzYW1lIHR5cGUgb2YgYmluZGluZwotICAgICAgICBlbHNlIGlmICh3c2RsQmluZGluZ1R5cGUuZXF1YWxzKFNPQVBCaW5kaW5nLlNPQVAxMUhUVFBfQklORElORykKLSAgICAgICAgICAgICAgICAmJiAoYmluZGluZ1R5cGUuZXF1YWxzKFNPQVBCaW5kaW5nLlNPQVAxMUhUVFBfQklORElORykgfHwKLSAgICAgICAgICAgICAgICBiaW5kaW5nVHlwZS5lcXVhbHMoU09BUEJpbmRpbmcuU09BUDExSFRUUF9NVE9NX0JJTkRJTkcpKSkgewotICAgICAgICAgICAgaXNCaW5kaW5nVmFsaWQgPSB0cnVlOwotICAgICAgICB9IGVsc2UgaWYgKHdzZGxCaW5kaW5nVHlwZS5lcXVhbHMoU09BUEJpbmRpbmcuU09BUDEySFRUUF9CSU5ESU5HKQotICAgICAgICAgICAgICAgICYmIChiaW5kaW5nVHlwZS5lcXVhbHMoU09BUEJpbmRpbmcuU09BUDEySFRUUF9CSU5ESU5HKSB8fAotICAgICAgICAgICAgICAgIGJpbmRpbmdUeXBlLmVxdWFscyhTT0FQQmluZGluZy5TT0FQMTJIVFRQX01UT01fQklORElORykpKSB7Ci0gICAgICAgICAgICBpc0JpbmRpbmdWYWxpZCA9IHRydWU7Ci0gICAgICAgIH0gZWxzZSBpZiAod3NkbEJpbmRpbmdUeXBlLmVxdWFscyhIVFRQQmluZGluZy5IVFRQX0JJTkRJTkcpCi0gICAgICAgICAgICAgICAgICYmIGJpbmRpbmdUeXBlLmVxdWFscyhIVFRQQmluZGluZy5IVFRQX0JJTkRJTkcpKSB7Ci0gICAgICAgICAgICBpc0JpbmRpbmdWYWxpZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gVGhlIEhUVFAgYmluZGluZyBpcyBub3QgdmFsaWQgb24gYSBKYXZhIEJlYW4gU0VJLWJhc2VkIGVuZHBvaW50OyBvbmx5IG9uIGEgUHJvdmlkZXIgYmFzZWQgb25lLgotICAgICAgICBlbHNlIGlmICh3c2RsQmluZGluZ1R5cGUuZXF1YWxzKEhUVFBCaW5kaW5nLkhUVFBfQklORElORykgJiYKLSAgICAgICAgICAgICAgICBlbmRwb2ludERlc2MuaXNFbmRwb2ludEJhc2VkKCkpIHsKLSAgICAgICAgICAgIGFkZFZhbGlkYXRpb25GYWlsdXJlKHRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQW4gSFRUUEJpbmRpbmcgd2FzIGZvdW5kIG9uIGFuIEBXZWJTZXJ2aWNlIFNFSSBiYXNlZCBlbmRwb2ludC4gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhpcyBpcyBub3Qgc3VwcG9ydGVkLiAgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQW4gSFRUUEJpbmRpbmcgbXVzdCB1c2UgYW4gQFdlYlNlcnZpY2VQcm92aWRlciBlbmRwb2ludC4iKTsKLSAgICAgICAgICAgIGlzQmluZGluZ1ZhbGlkID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gSWYgd3NkbCBiaW5kaW5nIGlzIG5vdCBIVFRQIGJpbmRpbmcgYW5kIEJpbmRpbmdUeXBlIGFubm90YXRpb24gaXMgU09BUF9IVFRQX0JJTkRJTkcgdGhlbgotICAgICAgICAvLyB3c2RsIGlzIHZhbGlkIGFuZCBKQVgtV1MgbmVlZHMgdG8gc3VwcG9ydCBib3RoIHNvYXAgMTEgYW5kIHNvYXAgMTIgb24gUHJvdmlkZXIgZW5kcG9pbnRzLgotICAgICAgICBlbHNlIGlmKCF3c2RsQmluZGluZ1R5cGUuZXF1YWxzKEhUVFBCaW5kaW5nLkhUVFBfQklORElORykgCi0gICAgICAgICAgICAmJiBiaW5kaW5nVHlwZS5lcXVhbHMoTURRQ29uc3RhbnRzLlNPQVBfSFRUUF9CSU5ESU5HKSAmJiBlbmRwb2ludERlc2MuaXNQcm92aWRlckJhc2VkKCkpewotICAgICAgICAgICAgaXNCaW5kaW5nVmFsaWQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBNaXNtYXRjaGVkIGJpbmRpbmdzIAotICAgICAgICAgICAgU3RyaW5nIHdzZGxJbnNlcnQgPSAiWyIgKyBiaW5kaW5nSHVtYW5SZWFkYWJsZURlc2NyaXB0aW9uKHdzZGxCaW5kaW5nVHlwZSkgKyAiXSIgKwotICAgICAgICAgICAgICAgICJuYW1lc3BhY2UgPSB7IiArIERlc2NyaXB0aW9uVXRpbHMubWFwQmluZGluZ1R5cGVBbm5vdGF0aW9uVG9Xc2RsKHdzZGxCaW5kaW5nVHlwZSkgKyJ9IjsKLSAgICAgICAgICAgIFN0cmluZyBhbm5vdGF0aW9uSW5zZXJ0ID0gIlsiICsgYmluZGluZ0h1bWFuUmVhZGFibGVEZXNjcmlwdGlvbihiaW5kaW5nVHlwZSkgKyAiXSIgKwotICAgICAgICAgICAgICAgICJuYW1lc3BhY2UgPSB7IiArIGJpbmRpbmdUeXBlICsifSI7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gTWVzc2FnZXMuZ2V0TWVzc2FnZSgiZW5kcG9pbnREZXNjcmlwdGlvblZhbGlkYXRpb24iLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c2RsSW5zZXJ0LCBhbm5vdGF0aW9uSW5zZXJ0KTsKLSAgICAgICAgICAgIGFkZFZhbGlkYXRpb25GYWlsdXJlKHRoaXMsIG1lc3NhZ2UpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpc0JpbmRpbmdWYWxpZCA9IGZhbHNlOwotICAgICAgICB9IAotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGlzQmluZGluZ1ZhbGlkOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiB2YWxpZGF0ZVdTRExQb3J0KCkgewotICAgICAgICAvLyBWQUxJREFUSU9OOiBJZiB0aGUgc2VydmljZSBpcyBzcGVjaWZpZWQgaW4gdGhlIFdTREwsIHRoZW4gdGhlIHBvcnQgbXVzdCBhbHNvIGJlIHNwZWNpZmllZC4KLSAgICAgICAgLy8gICAgICAgICAgICAgSWYgdGhlIHNlcnZpY2UgaXMgTk9UIGluIHRoZSBXU0RMLCB0aGVuIHRoaXMgaXMgInBhcnRpYWwgd3NkbCIgYW5kIHRoZXJlIGlzIG5vdGhpbmcgdG8gdmFsaWRhdGUKLSAgICAgICAgLy8gICAgICAgICAgICAgYWdhaW5zdCB0aGUgV1NETAotICAgICAgICBTZXJ2aWNlIHdzZGxTZXJ2aWNlID0gZW5kcG9pbnREZXNjV1NETC5nZXRXU0RMU2VydmljZSgpOwotICAgICAgICBpZiAod3NkbFNlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgUG9ydCB3c2RsUG9ydCA9IGVuZHBvaW50RGVzY1dTREwuZ2V0V1NETFBvcnQoKTsKLSAgICAgICAgICAgIGlmICh3c2RsUG9ydCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYWRkVmFsaWRhdGlvbkZhaWx1cmUodGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2VyaXZjZSBleGlzdHMgaW4gV1NETCwgYnV0IFBvcnQgZG9lcyBub3QuICBOb3QgYSB2YWxpZCBQYXJ0aWFsIFdTREwuICBTZXJ2aWNlOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGVuZHBvaW50RGVzYy5nZXRTZXJ2aWNlUU5hbWUoKSArICI7IFBvcnQ6ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kcG9pbnREZXNjLmdldFBvcnRRTmFtZSgpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gVkFMSUQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIHZhbGlkYXRlRW5kcG9pbnRJbnRlcmZhY2UoKSB7Ci0gICAgICAgIEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24gZWlkID0gZW5kcG9pbnREZXNjLmdldEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24oKTsKLSAgICAgICAgaWYgKGVpZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uVmFsaWRhdG9yIGVpZFZhbGlkYXRvciA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uVmFsaWRhdG9yKGVpZCk7Ci0gICAgICAgICAgICBib29sZWFuIGlzRW5kcG9pbnRJbnRlcmZhY2VWYWxpZCA9IGVpZFZhbGlkYXRvci52YWxpZGF0ZSgpOwotICAgICAgICAgICAgaWYgKCFpc0VuZHBvaW50SW50ZXJmYWNlVmFsaWQpIHsKLSAgICAgICAgICAgICAgICBhZGRWYWxpZGF0aW9uRmFpbHVyZShlaWRWYWxpZGF0b3IsICJJbnZhbGlkIEVuZHBvaW50IEludGVyZmFjZSIpOwotICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBWQUxJRDsKLSAgICB9Ci0gICAgCi0gICAgLyoKLSAgICAgKiBJZiB0aGUgQFJlc3BlY3RCaW5kaW5nIGFubm90YXRpb24gaXMgcHJlc2VudCwgdGhlbiB3ZSBtdXN0IGFsc28gaGF2ZSBhIFdTREwgCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIHZhbGlkYXRlUmVzcGVjdEJpbmRpbmcoKSB7Ci0gICAgICAgIC8vIElmIGEgV1NETCB3aXRoIGEgdmFsaWQgPHdzZGw6cG9ydD4gd2FzIHByZXNlbnQsIHRoZW4gdGhlIFdTREwgaXMgY29uc2lkZXJlZAotICAgICAgICAvLyBmdWxseSBzcGVjaWZpZWQuICBXaXRob3V0IHRoYXQsIHRoZSBAUmVzcGVjdEJpbmRpbmcgYW5ub3RhdGlvbiBpcyBpbnZhbGlkLgotICAgICAgICBpZiAoZW5kcG9pbnREZXNjLnJlc3BlY3RCaW5kaW5nKCkpIHsKLSAgICAgICAgICAgIFN0cmluZyB3c2RsTG9jYXRpb24gPSBudWxsOwotICAgICAgICAgICAgaWYgKCFlbmRwb2ludERlc2MuaXNQcm92aWRlckJhc2VkKCkpIHsKLSAgICAgICAgICAgICAgICB3c2RsTG9jYXRpb24gPSBlbmRwb2ludERlc2NKYXZhLmdldEFubm9XZWJTZXJ2aWNlV1NETExvY2F0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICB3c2RsTG9jYXRpb24gPSBlbmRwb2ludERlc2NKYXZhLmdldEFubm9XZWJTZXJ2aWNlUHJvdmlkZXIoKS53c2RsTG9jYXRpb24oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKHdzZGxMb2NhdGlvbiA9PSBudWxsIHx8IHdzZGxMb2NhdGlvbi5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgYWRkVmFsaWRhdGlvbkZhaWx1cmUodGhpcywgIkFubm90YXRpb24gQFJlc3BlY3RCaW5kaW5nIHJlcXVpcmVzIHRoYXQgYSBXU0RMIGZpbGUgYmUgc3BlY2lmaWVkLiIpOyAgICAKLSAgICAgICAgICAgICAgICByZXR1cm4gVmFsaWRhdG9yLklOVkFMSUQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIFdlIHdpbGwgdmFsaWRhdGUgdGhlIGNvbmZpZ3VyZWQgYmluZGluZ3MgYmFzZWQgb24gdGhlaXIgbWFwcGluZwotICAgICAgICAgICAgLy8gdG8gYSBrbm93biBXZWJTZXJ2aWNlRmVhdHVyZSBlbGVtZW50LiAgSWYgdGhlcmUgaXMgbm90IGEgV2ViU2VydmljZUZlYXR1cmUKLSAgICAgICAgICAgIC8vIGFubm90YXRpb24gZm9yIGEgZ2l2ZW4gYmluZGluZywgYSB2YWxpZGF0aW9uIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQuCi0gICAgICAgICAgICBMaXN0IHJlcXVpcmVkID0gZW5kcG9pbnREZXNjLmdldFJlcXVpcmVkQmluZGluZ3MoKTsKLSAgICAgICAgICAgIGlmIChyZXF1aXJlZC5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgSXRlcmF0b3IgaSA9IHJlcXVpcmVkLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFFOYW1lIG5hbWUgPSAoUU5hbWUpIGkubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZmVhdHVyZU5hbWUgPSBnZXRGZWF0dXJlRm9yQmluZGluZyhuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZlYXR1cmVOYW1lICE9IG51bGwgJiYgZmVhdHVyZU5hbWUubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uSmF2YSBlZGogPSAoRW5kcG9pbnREZXNjcmlwdGlvbkphdmEpIGVuZHBvaW50RGVzYzsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFubm90YXRpb24gYW5ubyA9IGVkai5nZXRBbm5vRmVhdHVyZShmZWF0dXJlTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBXZWJTZXJ2aWNlRmVhdHVyZUFubm90YXRpb24gZmVhdHVyZSA9IGdldEZlYXR1cmVGcm9tQW5ub3RhdGlvbihhbm5vKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZlYXR1cmUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZFZhbGlkYXRpb25GYWlsdXJlKHRoaXMsICJBbm5vdGF0aW9uIEBSZXNwZWN0QmluZGluZyB3YXMgZW5hYmxlZCwgYnV0IHRoZSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29ycmVzcG9uZGluZyBmZWF0dXJlICIgKyBmZWF0dXJlTmFtZSArICIgd2FzIG5vdCBlbmFibGVkLiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBWYWxpZGF0b3IuSU5WQUxJRDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIGFkZFZhbGlkYXRpb25GYWlsdXJlKHRoaXMsICJBbm5vdGF0aW9uIEBSZXNwZWN0QmluZGluZyB3YXMgZW5hYmxlZCwgYnV0IGV4dGVuc2liaWxpdHkgZWxlbWVudCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgKyAiIHdhcyBub3QgcmVjb2duaXplZC4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFZhbGlkYXRvci5JTlZBTElEOwotICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgfQotICAgICAgICB9ICAgICAgICAKLSAgICAgICAgcmV0dXJuIFZhbGlkYXRvci5WQUxJRDsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBXZWJTZXJ2aWNlRmVhdHVyZUFubm90YXRpb24gZ2V0RmVhdHVyZUZyb21Bbm5vdGF0aW9uKEFubm90YXRpb24gYSkgewotICAgICAgICByZXR1cm4gYS5hbm5vdGF0aW9uVHlwZSgpLmdldEFubm90YXRpb24oV2ViU2VydmljZUZlYXR1cmVBbm5vdGF0aW9uLmNsYXNzKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGJpbmRpbmdIdW1hblJlYWRhYmxlRGVzY3JpcHRpb24oU3RyaW5nIG5zKSB7Ci0gICAgICAgIGlmIChTT0FQQmluZGluZy5TT0FQMTFIVFRQX0JJTkRJTkcuZXF1YWxzKG5zKSkgewotICAgICAgICAgICAgcmV0dXJuICJTT0FQIDEuMSBIVFRQIEJpbmRpbmciOwotICAgICAgICB9IGVsc2UgaWYgKFNPQVBCaW5kaW5nLlNPQVAxMUhUVFBfTVRPTV9CSU5ESU5HLmVxdWFscyhucykpIHsKLSAgICAgICAgICAgIHJldHVybiAiU09BUCAxLjEgTVRPTSBIVFRQIEJpbmRpbmciOwotICAgICAgICB9IGVsc2UgaWYgKFNPQVBCaW5kaW5nLlNPQVAxMkhUVFBfQklORElORy5lcXVhbHMobnMpKSB7Ci0gICAgICAgICAgICByZXR1cm4gIlNPQVAgMS4yIEhUVFAgQmluZGluZyI7Ci0gICAgICAgIH0gZWxzZSBpZiAoU09BUEJpbmRpbmcuU09BUDEySFRUUF9NVE9NX0JJTkRJTkcuZXF1YWxzKG5zKSkgewotICAgICAgICAgICAgcmV0dXJuICJTT0FQIDEuMiBNVE9NIEhUVFAgQmluZGluZyI7Ci0gICAgICAgIH0gZWxzZSBpZiAoTURRQ29uc3RhbnRzLlNPQVAxMUpNU19CSU5ESU5HLmVxdWFscyhucykpIHsKLSAgICAgICAgICAgIHJldHVybiAiU09BUCAxLjEgSk1TIEJpbmRpbmciOwotICAgICAgICB9IGVsc2UgaWYgKE1EUUNvbnN0YW50cy5TT0FQMTFKTVNfTVRPTV9CSU5ESU5HLmVxdWFscyhucykpIHsKLSAgICAgICAgICAgIHJldHVybiAiU09BUCAxLjEgTVRPTSBKTVMgQmluZGluZyI7Ci0gICAgICAgIH0gZWxzZSBpZiAoTURRQ29uc3RhbnRzLlNPQVAxMkpNU19CSU5ESU5HLmVxdWFscyhucykpIHsKLSAgICAgICAgICAgIHJldHVybiAiU09BUCAxLjIgSk1TIEJpbmRpbmciOwotICAgICAgICB9IGVsc2UgaWYgKE1EUUNvbnN0YW50cy5TT0FQMTJKTVNfTVRPTV9CSU5ESU5HLmVxdWFscyhucykpIHsKLSAgICAgICAgICAgIHJldHVybiAiU09BUCAxLjIgTVRPTSBKTVMgQmluZGluZyI7Ci0gICAgICAgIH0gZWxzZSBpZiAoSFRUUEJpbmRpbmcuSFRUUF9CSU5ESU5HLmVxdWFscyhucykpIHsKLSAgICAgICAgICAgIHJldHVybiAiWE1MIEhUVFAgQmluZGluZyI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gIlVua25vd24gQmluZGluZyI7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEZlYXR1cmVGb3JCaW5kaW5nKFFOYW1lIG5hbWUpIHsKLSAgICAgICAgaWYgKG5hbWUuZXF1YWxzKG5ldyBRTmFtZSgiaHR0cDovL3d3dy53My5vcmcvMjAwNi8wNS9hZGRyZXNzaW5nL3dzZGwiLCAiVXNpbmdBZGRyZXNzaW5nIikpKSB7Ci0gICAgICAgICAgICByZXR1cm4gQWRkcmVzc2luZ0ZlYXR1cmUuSUQ7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3ZhbGlkYXRvci9FbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uVmFsaWRhdG9yLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi92YWxpZGF0b3IvRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvblZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmQ0YjMzLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3ZhbGlkYXRvci9FbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLnZhbGlkYXRvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb25KYXZhOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbldTREw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5PcGVyYXRpb25EZXNjcmlwdGlvbjsKLQotaW1wb3J0IGphdmF4LndzZGwuT3BlcmF0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuUG9ydFR5cGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uVmFsaWRhdG9yIGV4dGVuZHMgVmFsaWRhdG9yIHsKLSAgICBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uIGVwSW50ZXJmYWNlRGVzYzsKLSAgICBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uSmF2YSBlcEludGVyZmFjZURlc2NKYXZhOwotICAgIEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb25XU0RMIGVwSW50ZXJmYWNlRGVzY1dTREw7Ci0KLSAgICBwdWJsaWMgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvblZhbGlkYXRvcihFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uIHRvVmFsaWRhdGUpIHsKLSAgICAgICAgZXBJbnRlcmZhY2VEZXNjID0gdG9WYWxpZGF0ZTsKLSAgICAgICAgZXBJbnRlcmZhY2VEZXNjSmF2YSA9IChFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uSmF2YSllcEludGVyZmFjZURlc2M7Ci0gICAgICAgIGVwSW50ZXJmYWNlRGVzY1dTREwgPSAoRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbldTREwpZXBJbnRlcmZhY2VEZXNjOwotCi0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLnZhbGlkYXRvci5WYWxpZGF0b3IjdmFsaWRhdGUoKQotICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gdmFsaWRhdGUoKSB7Ci0gICAgICAgIGlmIChnZXRWYWxpZGF0aW9uTGV2ZWwoKSA9PSBWYWxpZGF0aW9uTGV2ZWwuT0ZGKSB7Ci0gICAgICAgICAgICByZXR1cm4gVkFMSUQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCF2YWxpZGF0ZVNFSXZzV1NETFBvcnRUeXBlKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBJTlZBTElEOwotICAgICAgICB9Ci0gICAgICAgIGlmICghdmFsaWRhdGVTRUl2c0ltcGxlbWVudGF0aW9uKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBJTlZBTElEOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBWQUxJRDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gdmFsaWRhdGVTRUl2c1dTRExQb3J0VHlwZSgpIHsKLSAgICAgICAgUG9ydFR5cGUgcG9ydFR5cGUgPSBlcEludGVyZmFjZURlc2NXU0RMLmdldFdTRExQb3J0VHlwZSgpOwotICAgICAgICBpZiAocG9ydFR5cGUgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gVE9ETzogTmVlZCBtb3JlIHZhbGlkYXRpb24gaGVyZSwgaW5jbHVkaW5nOiBvcGVyYXRpb24gbmFtZSwgcGFyYW1ldGVycywgZmF1bHRzCi0gICAgICAgICAgICBMaXN0IHdzZGxPcGVyYXRpb25MaXN0ID0gcG9ydFR5cGUuZ2V0T3BlcmF0aW9ucygpOwotCi0gICAgICAgICAgICBPcGVyYXRpb25EZXNjcmlwdGlvbltdIGRpc3BhdGNoYWJsZU9wRGVzY0FycmF5ID0gCi0gICAgICAgICAgICAgICAgZXBJbnRlcmZhY2VEZXNjLmdldERpc3BhdGNoYWJsZU9wZXJhdGlvbnMoKTsKLSAgICAKLSAgICAgICAgICAgIGlmICh3c2RsT3BlcmF0aW9uTGlzdC5zaXplKCkgIT0gZGlzcGF0Y2hhYmxlT3BEZXNjQXJyYXkubGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgYWRkVmFsaWRhdGlvbkZhaWx1cmUodGhpcywgIlRoZSBudW1iZXIgb2Ygb3BlcmF0aW9ucyBpbiB0aGUgV1NETCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJwb3J0VHlwZSBkb2VzIG5vdCBtYXRjaCB0aGUgbnVtYmVyIG9mIG1ldGhvZHMgaW4gdGhlIFNFSSBvciAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJXZWIgc2VydmljZSBpbXBsZW1lbnRhdGlvbiBjbGFzcy4gICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIndzZGwgb3BlcmF0aW9ucyA9IFsiICsgdG9TdHJpbmcod3NkbE9wZXJhdGlvbkxpc3QpICsiXSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJkaXNwYXRjaCBvcGVyYXRpb25zID0gWyIgKyB0b1N0cmluZyhkaXNwYXRjaGFibGVPcERlc2NBcnJheSkgKyJdIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIElmIHRoZXkgYXJlIHRoZSBzYW1lIHNpemUsIGxldCdzIGNoZWNrIHRvIHNlZSBpZiB0aGUgb3BlcmF0aW9uIG5hbWVzIG1hdGNoCi0gICAgICAgICAgICBpZiAoIWNoZWNrT3BlcmF0aW9uc01hdGNoTWV0aG9kcyh3c2RsT3BlcmF0aW9uTGlzdCwgZGlzcGF0Y2hhYmxlT3BEZXNjQXJyYXkpKSB7Ci0gICAgICAgICAgICAgICAgYWRkVmFsaWRhdGlvbkZhaWx1cmUodGhpcywgIlRoZSBvcGVyYXRpb24gbmFtZXMgaW4gdGhlIFdTREwgcG9ydFR5cGUgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiZG8gbm90IG1hdGNoIHRoZSBtZXRob2QgbmFtZXMgaW4gdGhlIFNFSSBvciBXZWIgc2VydmljZSBpIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAibXBsZW1lbnRhdGlvbiBjbGFzcy4gICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIndzZGwgb3BlcmF0aW9ucyA9IFsiICsgdG9TdHJpbmcod3NkbE9wZXJhdGlvbkxpc3QpICsiXSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJkaXNwYXRjaCBvcGVyYXRpb25zID0gWyIgKyB0b1N0cmluZyhkaXNwYXRjaGFibGVPcERlc2NBcnJheSkgKyJdIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFZBTElEOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBjaGVja09wZXJhdGlvbnNNYXRjaE1ldGhvZHMoTGlzdCB3c2RsT3BlcmF0aW9uTGlzdCwgT3BlcmF0aW9uRGVzY3JpcHRpb25bXQotICAgICAgICAgICAgb3BEZXNjQXJyYXkpIHsKLSAgICAgICAgTGlzdDxTdHJpbmc+IG9wTmFtZUxpc3QgPSBjcmVhdGVXU0RMT3BlcmF0aW9uTmFtZUxpc3Qod3NkbE9wZXJhdGlvbkxpc3QpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG9wRGVzY0FycmF5Lmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBPcGVyYXRpb25EZXNjcmlwdGlvbiBvcERlc2MgPSBvcERlc2NBcnJheVtpXTsKLSAgICAgICAgICAgIGlmIChvcE5hbWVMaXN0LmNvbnRhaW5zKG9wRGVzYy5nZXRPcGVyYXRpb25OYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgb3BOYW1lTGlzdC5yZW1vdmUob3BEZXNjLmdldE9wZXJhdGlvbk5hbWUoKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBjcmVhdGVXU0RMT3BlcmF0aW9uTmFtZUxpc3QoTGlzdCB3c2RsT3BlcmF0aW9uTGlzdCkgewotICAgICAgICBMaXN0PFN0cmluZz4gb3BOYW1lTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICBJdGVyYXRvciB3c2RsT3BJdGVyID0gd3NkbE9wZXJhdGlvbkxpc3QuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKHdzZGxPcEl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBPYmplY3Qgb2JqID0gd3NkbE9wSXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgT3BlcmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgT3BlcmF0aW9uIG9wZXJhdGlvbiA9IChPcGVyYXRpb24pb2JqOwotICAgICAgICAgICAgICAgIG9wTmFtZUxpc3QuYWRkKG9wZXJhdGlvbi5nZXROYW1lKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBvcE5hbWVMaXN0OwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiB2YWxpZGF0ZVNFSXZzSW1wbGVtZW50YXRpb24oKSB7Ci0gICAgICAgIC8vIFJFVklFVzogVGhpcyBsZXZlbCBvZiB2YWxpZGF0aW9uIGlzIGN1cnJlbnRseSBiZWluZyBkb25lIGJ5IHRoZSBEQkMgQ29tcG9zaXRlIHZhbGlkYXRpb24KLSAgICAgICAgcmV0dXJuIFZBTElEOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgdG9TdHJpbmcoTGlzdCB3c2RsT3BlcmF0aW9uTGlzdCkgewotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gIiI7Ci0gICAgICAgIEl0ZXJhdG9yIHdzZGxPcEl0ZXIgPSB3c2RsT3BlcmF0aW9uTGlzdC5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAod3NkbE9wSXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIE9iamVjdCBvYmogPSB3c2RsT3BJdGVyLm5leHQoKTsKLSAgICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBPcGVyYXRpb24pIHsKLSAgICAgICAgICAgICAgICBPcGVyYXRpb24gb3BlcmF0aW9uID0gKE9wZXJhdGlvbilvYmo7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ICs9IG9wZXJhdGlvbi5nZXROYW1lKCkgKyAiICI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHRvU3RyaW5nKE9wZXJhdGlvbkRlc2NyaXB0aW9uW10gd3NkbE9wRGVzY3MpIHsKLSAgICAgICAgU3RyaW5nIHJlc3VsdCA9ICIiOwotICAgICAgICBmb3IgKGludCBpPSAwOyBpPHdzZGxPcERlc2NzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICByZXN1bHQgKz0gd3NkbE9wRGVzY3NbaV0uZ2V0T3BlcmF0aW9uTmFtZSgpICsgIiAiOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vdmFsaWRhdG9yL09wZXJhdGlvbkRlc2NyaXB0aW9uVmFsaWRhdG9yLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi92YWxpZGF0b3IvT3BlcmF0aW9uRGVzY3JpcHRpb25WYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjc0MDNhNi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi92YWxpZGF0b3IvT3BlcmF0aW9uRGVzY3JpcHRpb25WYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi52YWxpZGF0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLk9wZXJhdGlvbkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uT3BlcmF0aW9uRGVzY3JpcHRpb25KYXZhOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uT3BlcmF0aW9uRGVzY3JpcHRpb25XU0RMOwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgT3BlcmF0aW9uRGVzY3JpcHRpb25WYWxpZGF0b3IgZXh0ZW5kcyBWYWxpZGF0b3IgewotICAgIHByaXZhdGUgT3BlcmF0aW9uRGVzY3JpcHRpb24gb3BEZXNjOwotICAgIHByaXZhdGUgT3BlcmF0aW9uRGVzY3JpcHRpb25KYXZhIG9wRGVzY0phdmE7Ci0gICAgcHJpdmF0ZSBPcGVyYXRpb25EZXNjcmlwdGlvbldTREwgb3BEZXNjV1NETDsKLQotCi0gICAgcHVibGljIE9wZXJhdGlvbkRlc2NyaXB0aW9uVmFsaWRhdG9yKE9wZXJhdGlvbkRlc2NyaXB0aW9uIHRvVmFsaWRhdGUpIHsKLSAgICAgICAgb3BEZXNjID0gdG9WYWxpZGF0ZTsKLSAgICAgICAgb3BEZXNjSmF2YSA9IChPcGVyYXRpb25EZXNjcmlwdGlvbkphdmEpb3BEZXNjOwotICAgICAgICBvcERlc2NXU0RMID0gKE9wZXJhdGlvbkRlc2NyaXB0aW9uV1NETClvcERlc2M7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLnZhbGlkYXRvci5WYWxpZGF0b3IjdmFsaWRhdGUoKQotICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gdmFsaWRhdGUoKSB7Ci0gICAgICAgIGlmIChnZXRWYWxpZGF0aW9uTGV2ZWwoKSA9PSBWYWxpZGF0aW9uTGV2ZWwuT0ZGKSB7Ci0gICAgICAgICAgICByZXR1cm4gVkFMSUQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBSRVZJRVc6IFNob3VsZCB0aGVyZSBiZSBvcGVyYXRpb24tbGV2ZWwgdmFsaWRhdGlvbiBwZXJmb3JtZWQgaGVyZT8KLSAgICAgICAgcmV0dXJuIFZBTElEOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vdmFsaWRhdG9yL1NlcnZpY2VEZXNjcmlwdGlvblZhbGlkYXRvci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vdmFsaWRhdG9yL1NlcnZpY2VEZXNjcmlwdGlvblZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjMwOTM0Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3ZhbGlkYXRvci9TZXJ2aWNlRGVzY3JpcHRpb25WYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi52YWxpZGF0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkVuZHBvaW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5TZXJ2aWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5TZXJ2aWNlRGVzY3JpcHRpb25KYXZhOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uU2VydmljZURlc2NyaXB0aW9uV1NETDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgU2VydmljZURlc2NyaXB0aW9uVmFsaWRhdG9yIGV4dGVuZHMgVmFsaWRhdG9yIHsKLQotICAgIHByaXZhdGUgU2VydmljZURlc2NyaXB0aW9uIHNlcnZpY2VEZXNjOwotICAgIHByaXZhdGUgU2VydmljZURlc2NyaXB0aW9uSmF2YSBzZXJ2aWNlRGVzY0phdmE7Ci0gICAgcHJpdmF0ZSBTZXJ2aWNlRGVzY3JpcHRpb25XU0RMIHNlcnZpY2VEZXNjV1NETDsKLQotICAgIHB1YmxpYyBTZXJ2aWNlRGVzY3JpcHRpb25WYWxpZGF0b3IoU2VydmljZURlc2NyaXB0aW9uIHRvVmFsaWRhdGUpIHsKLSAgICAgICAgc2VydmljZURlc2MgPSB0b1ZhbGlkYXRlOwotICAgICAgICBzZXJ2aWNlRGVzY0phdmEgPSAoU2VydmljZURlc2NyaXB0aW9uSmF2YSlzZXJ2aWNlRGVzYzsKLSAgICAgICAgc2VydmljZURlc2NXU0RMID0gKFNlcnZpY2VEZXNjcmlwdGlvbldTREwpc2VydmljZURlc2M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVmFsaWRhdGUgdGhlIFNlcnZpY2VEZXNjcmlwdGlvbiBhcyBmb2xsb3dzIDEpIFZhbGlkYXRlIHRoYXQgYW5ub3RhdGlvbnMgYW5kIHdoYXRldmVyIFdTREwgaXMKLSAgICAgKiBzcGVjaWZpZWQgaXMgdmFsaWQgMikgVmFsaWRhdGUgdGhhdCBKYXZhIGltcGxlbWVudGF0aW9ucyBhcmUgY29ycmVjIGEpIFNlcnZpY2UKLSAgICAgKiBJbXBsZW1lbnRhdGlvbnMgbWF0Y2ggU0VJcyBpZiBzcGVjaWZpZWQgYikgT3BlcmF0aW9ucyBtYXRjaCBTRUkgbWV0aG9kcwotICAgICAqCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBTZXJ2aWNlRGVzY3JpcHRpb24gaXMgdmFsaWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZSgpIHsKLSAgICAgICAgaWYgKGdldFZhbGlkYXRpb25MZXZlbCgpID09IFZhbGlkYXRpb25MZXZlbC5PRkYpIHsKLSAgICAgICAgICAgIHJldHVybiBWQUxJRDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghdmFsaWRhdGVFbmRwb2ludERlc2NyaXB0aW9ucygpKSB7Ci0gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBWQUxJRDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gdmFsaWRhdGVFbmRwb2ludERlc2NyaXB0aW9ucygpIHsKLSAgICAgICAgYm9vbGVhbiBhcmVBbGxWYWxpZCA9IHRydWU7Ci0gICAgICAgIC8vIFZhbGlkYXRlIGFsbCB0aGUgRW5kcG9pbnRzIHRoYXQgd2VyZSBjcmVhdGVkIHVuZGVyIHRoaXMgU2VydmljZSBEZXNjcmlwdGlvbgotICAgICAgICBDb2xsZWN0aW9uPEVuZHBvaW50RGVzY3JpcHRpb24+IGVuZHBvaW50RGVzY3MgPSBzZXJ2aWNlRGVzYy5nZXRFbmRwb2ludERlc2NyaXB0aW9uc19Bc0NvbGxlY3Rpb24oKTsKLSAgICAgICAgZm9yIChFbmRwb2ludERlc2NyaXB0aW9uIGVuZHBvaW50RGVzYzplbmRwb2ludERlc2NzKSB7Ci0gICAgICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uVmFsaWRhdG9yIGVuZHBvaW50VmFsaWRhdG9yID0gbmV3IEVuZHBvaW50RGVzY3JpcHRpb25WYWxpZGF0b3IoZW5kcG9pbnREZXNjKTsKLQotICAgICAgICAgICAgYm9vbGVhbiBpc0VuZHBvaW50VmFsaWQgPSBlbmRwb2ludFZhbGlkYXRvci52YWxpZGF0ZSgpOwotICAgICAgICAgICAgaWYgKCFpc0VuZHBvaW50VmFsaWQpIHsKLSAgICAgICAgICAgICAgICBhZGRWYWxpZGF0aW9uRmFpbHVyZShlbmRwb2ludFZhbGlkYXRvciwgIkVuZHBvaW50IGZhaWxlZCB2YWxpZGF0aW9uIik7Ci0gICAgICAgICAgICAgICAgYXJlQWxsVmFsaWQgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYXJlQWxsVmFsaWQ7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi92YWxpZGF0b3IvVmFsaWRhdGlvbkZhaWx1cmVzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi92YWxpZGF0b3IvVmFsaWRhdGlvbkZhaWx1cmVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmYjYzNTEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vdmFsaWRhdG9yL1ZhbGlkYXRpb25GYWlsdXJlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLnZhbGlkYXRvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5KYXZhVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0KLS8qKgotICogUmVjb3JkIFZhbGlkYXRvciBGYWlsdXJlcy4KLSAqIFRoZSB2YWxpZGF0b3IgZmFpbHVyZXMgYXJlIGdhdGhlcmVkIGFuZCB0aGVuIGlzc3VlZCBhdCB0aGUgZW5kIG9mIHRoZSB2YWxpZGF0aW9uIHBoYXNlLgotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGlvbkZhaWx1cmVzIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhWYWxpZGF0aW9uRmFpbHVyZXMuY2xhc3MpOwotICAgIEFycmF5TGlzdDxWYWxpZGF0aW9uRmFpbHVyZT4gdmFsaWRhdGlvbkZhaWx1cmVzID0gbmV3IEFycmF5TGlzdDxWYWxpZGF0aW9uRmFpbHVyZT4oKTsKLQotICAgIHB1YmxpYyB2b2lkIGFkZChWYWxpZGF0b3IgZmFpbGluZ1ZhbGlkYXRvciwgU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgVmFsaWRhdGlvbkZhaWx1cmUgdmYgPSBuZXcgVmFsaWRhdGlvbkZhaWx1cmUoZmFpbGluZ1ZhbGlkYXRvciwgbWVzc2FnZSk7Ci0gICAgICAgIHZhbGlkYXRpb25GYWlsdXJlcy5hZGQodmYpOwotICAgICAgICAKLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIkFkZGluZyBWYWxpZGF0aW9uRmFpbHVyZSA9ICIgKyB2Zi50b1N0cmluZygpKTsKLSAgICAgICAgICAgIGxvZy50cmFjZSgiTG9jYXRpb24gb2YgVmFsaWRhdGlvbiBGYWlsdXJlID0gIiArIEphdmFVdGlscy5jYWxsU3RhY2tUb1N0cmluZygpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PFZhbGlkYXRpb25GYWlsdXJlPiBnZXRWYWxpZGF0aW9uRmFpbHVyZXMoKSB7Ci0gICAgICAgIHJldHVybiB2YWxpZGF0aW9uRmFpbHVyZXM7Ci0gICAgfQotCi19Ci0KLS8qKgotICogIlNwZWNpZmljIFZhbGlkYXRvciBGYWlsdXJlcwotICoKLSAqLwotY2xhc3MgVmFsaWRhdGlvbkZhaWx1cmUgewotICAgIFZhbGlkYXRvciB2YWxpZGF0b3I7Ci0gICAgU3RyaW5nIG1lc3NhZ2U7Ci0KLSAgICBWYWxpZGF0aW9uRmFpbHVyZShWYWxpZGF0b3IgdmFsaWRhdG9yLCBTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICB0aGlzLnZhbGlkYXRvciA9IHZhbGlkYXRvcjsKLSAgICAgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7Ci0gICAgICAgIHJldHVybiBtZXNzYWdlOwotICAgIH0KLQotICAgIHB1YmxpYyBWYWxpZGF0b3IgZ2V0VmFsaWRhdG9yKCkgewotICAgICAgICByZXR1cm4gdmFsaWRhdG9yOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgcmV0dXJuICJWYWxpZGF0b3IgPSBbIiArIHZhbGlkYXRvciArICJdIE1lc3NhZ2UgPSBbIiArIG1lc3NhZ2UgKyAiXSI7Ci0gICAgfQotICAgCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi92YWxpZGF0b3IvVmFsaWRhdG9yLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi92YWxpZGF0b3IvVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzY2VmNjkuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vdmFsaWRhdG9yL1ZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLnZhbGlkYXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFZhbGlkYXRvciB7Ci0gICAgcHVibGljIGVudW0gVmFsaWRhdGlvbkxldmVsIHsKLSAgICAgICAgT0ZGLCBGVUxMfQotCi0gICAgOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBWQUxJRCA9IHRydWU7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIElOVkFMSUQgPSBmYWxzZTsKLQotICAgIHByb3RlY3RlZCBWYWxpZGF0aW9uRmFpbHVyZXMgdmFsaWRhdGlvbkZhaWx1cmVzID0gbmV3IFZhbGlkYXRpb25GYWlsdXJlcygpOwotICAgIHByaXZhdGUgVmFsaWRhdGlvbkxldmVsIHZhbGlkYXRpb25MZXZlbCA9IFZhbGlkYXRpb25MZXZlbC5GVUxMOwotCi0gICAgYWJzdHJhY3QgcHVibGljIGJvb2xlYW4gdmFsaWRhdGUoKTsKLQotICAgIHZvaWQgYWRkVmFsaWRhdGlvbkZhaWx1cmUoVmFsaWRhdG9yIGZhaWxpbmdWYWxpZGF0b3IsIFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIHZhbGlkYXRpb25GYWlsdXJlcy5hZGQoZmFpbGluZ1ZhbGlkYXRvciwgbWVzc2FnZSk7Ci0gICAgfQotCi0gICAgVmFsaWRhdGlvbkxldmVsIGdldFZhbGlkYXRpb25MZXZlbCgpIHsKLSAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25MZXZlbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBTdHJpbmcgbWVzc2FnZVN0cmluZyA9ICIiOwotICAgICAgICBJdGVyYXRvcjxWYWxpZGF0aW9uRmFpbHVyZT4gZmFpbHVyZUl0ZXIgPSB2YWxpZGF0aW9uRmFpbHVyZXMuCi0gICAgICAgICAgICAgICAgZ2V0VmFsaWRhdGlvbkZhaWx1cmVzKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGZhaWx1cmVJdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgVmFsaWRhdGlvbkZhaWx1cmUgZmFpbHVyZSA9IGZhaWx1cmVJdGVyLm5leHQoKTsKLSAgICAgICAgICAgIG1lc3NhZ2VTdHJpbmcgPSBtZXNzYWdlU3RyaW5nICsgIiA6OiAiICsgZmFpbHVyZS5nZXRNZXNzYWdlKCk7Ci0gICAgICAgICAgICBWYWxpZGF0b3IgdmFsaWRhdG9yID0gZmFpbHVyZS5nZXRWYWxpZGF0b3IoKTsKLSAgICAgICAgICAgIC8vIGlmIHRoaXMgaXMgYSBkaWZmZXJlbnQgdmFsaWRhdG9yIHJlZmVyZW5jZSB3ZSB3YW50IHRvIGNhbGwKLSAgICAgICAgICAgIC8vIHRvU3RyaW5nIG9uIGl0IGFsc28KLSAgICAgICAgICAgIGlmICh2YWxpZGF0b3IgIT0gdGhpcykgewotICAgICAgICAgICAgICAgIG1lc3NhZ2VTdHJpbmcgPSBtZXNzYWdlU3RyaW5nICsgIiA6OiAiICsgdmFsaWRhdG9yLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1lc3NhZ2VTdHJpbmc7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvRGVzY3JpcHRpb25UeXBlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9EZXNjcmlwdGlvblR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQxYmZkYy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9EZXNjcmlwdGlvblR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi54bWwuaGFuZGxlcjsKLQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEF0dHJpYnV0ZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGU7Ci0KLQotLyoqCi0gKiBUaGUgZGVzY3JpcHRpb24gdHlwZSBpcyB1c2VkIGJ5IGEgZGVzY3JpcHRpb24gZWxlbWVudCB0byBwcm92aWRlIHRleHQgZGVzY3JpYmluZyB0aGUgcGFyZW50Ci0gKiBlbGVtZW50LiAgVGhlIGVsZW1lbnRzIHRoYXQgdXNlIHRoaXMgdHlwZSBzaG91bGQgaW5jbHVkZSBhbnkgaW5mb3JtYXRpb24gdGhhdCB0aGUgRGVwbG95bWVudAotICogQ29tcG9uZW50J3MgRGVwbG95bWVudCBGaWxlIGZpbGUgcHJvZHVjZXIgd2FudHMgdG8gcHJvdmlkZSB0byB0aGUgY29uc3VtZXIgb2YgdGhlIERlcGxveW1lbnQKLSAqIENvbXBvbmVudCdzIERlcGxveW1lbnQgRmlsZSAoaS5lLiwgdG8gdGhlIERlcGxveWVyKS4gVHlwaWNhbGx5LCB0aGUgdG9vbHMgdXNlZCBieSBzdWNoIGEKLSAqIERlcGxveW1lbnQgRmlsZSBjb25zdW1lciB3aWxsIGRpc3BsYXkgdGhlIGRlc2NyaXB0aW9uIHdoZW4gcHJvY2Vzc2luZyB0aGUgcGFyZW50IGVsZW1lbnQgdGhhdAotICogY29udGFpbnMgdGhlIGRlc2NyaXB0aW9uLgotICogPHAvPgotICogVGhlIGxhbmcgYXR0cmlidXRlIGRlZmluZXMgdGhlIGxhbmd1YWdlIHRoYXQgdGhlIGRlc2NyaXB0aW9uIGlzIHByb3ZpZGVkIGluLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcwotICogImVuIiAoRW5nbGlzaCkuCi0gKiA8cC8+Ci0gKiA8cC8+Ci0gKiA8cC8+Ci0gKiA8cD5KYXZhIGNsYXNzIGZvciBkZXNjcmlwdGlvblR5cGUgY29tcGxleCB0eXBlLgotICogPHAvPgotICogPHA+VGhlIGZvbGxvd2luZyBzY2hlbWEgZnJhZ21lbnQgc3BlY2lmaWVzIHRoZSBleHBlY3RlZCBjb250ZW50IGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBjbGFzcy4KLSAqIDxwLz4KLSAqIDxwcmU+Ci0gKiAmbHQ7Y29tcGxleFR5cGUgbmFtZT0iZGVzY3JpcHRpb25UeXBlIj4KLSAqICAgJmx0O3NpbXBsZUNvbnRlbnQ+Ci0gKiAgICAgJmx0O2V4dGVuc2lvbiBiYXNlPSImbHQ7aHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlPnhzZFN0cmluZ1R5cGUiPgotICogICAgICAgJmx0O2F0dHJpYnV0ZSByZWY9IntodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2V9bGFuZyIvPgotICogICAgICZsdDsvZXh0ZW5zaW9uPgotICogICAmbHQ7L3NpbXBsZUNvbnRlbnQ+Ci0gKiAmbHQ7L2NvbXBsZXhUeXBlPgotICogPC9wcmU+Ci0gKi8KLUBYbWxBY2Nlc3NvclR5cGUoWG1sQWNjZXNzVHlwZS5GSUVMRCkKLUBYbWxUeXBlKG5hbWUgPSAiZGVzY3JpcHRpb25UeXBlIikKLXB1YmxpYyBjbGFzcyBEZXNjcmlwdGlvblR5cGUKLSAgICAgICAgZXh0ZW5kcyBYc2RTdHJpbmdUeXBlIHsKLQotICAgIEBYbWxBdHRyaWJ1dGUobmFtZXNwYWNlID0gImh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIpCi0gICAgcHJvdGVjdGVkIGphdmEubGFuZy5TdHJpbmcgbGFuZzsKLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBsYW5nIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiBwb3NzaWJsZSBvYmplY3QgaXMge0BsaW5rIGphdmEubGFuZy5TdHJpbmcgfQotICAgICAqLwotICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldExhbmcoKSB7Ci0gICAgICAgIHJldHVybiBsYW5nOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBsYW5nIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIGFsbG93ZWQgb2JqZWN0IGlzIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRMYW5nKGphdmEubGFuZy5TdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5sYW5nID0gdmFsdWU7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9EaXNwbGF5TmFtZVR5cGUuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL0Rpc3BsYXlOYW1lVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjYwYzY2Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL0Rpc3BsYXlOYW1lVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLnhtbC5oYW5kbGVyOwotCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQXR0cmlidXRlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZTsKLQotCi0vKioKLSAqIFRoZSBkaXNwbGF5LW5hbWUgdHlwZSBjb250YWlucyBhIHNob3J0IG5hbWUgdGhhdCBpcyBpbnRlbmRlZCB0byBiZSBkaXNwbGF5ZWQgYnkgdG9vbHMuIEl0IGlzIHVzZWQKLSAqIGJ5IGRpc3BsYXktbmFtZSBlbGVtZW50cy4gIFRoZSBkaXNwbGF5IG5hbWUgbmVlZCBub3QgYmUgdW5pcXVlLgotICogPHAvPgotICogRXhhbXBsZToKLSAqIDxwLz4KLSAqIC4uLiA8ZGlzcGxheS1uYW1lIHhtbDpsYW5nPSJlbiI+IEVtcGxveWVlIFNlbGYgU2VydmljZSA8L2Rpc3BsYXktbmFtZT4KLSAqIDxwLz4KLSAqIFRoZSB2YWx1ZSBvZiB0aGUgeG1sOmxhbmcgYXR0cmlidXRlIGlzICJlbiIgKEVuZ2xpc2gpIGJ5IGRlZmF1bHQuCi0gKiA8cC8+Ci0gKiA8cC8+Ci0gKiA8cC8+Ci0gKiA8cC8+Ci0gKiA8cD5KYXZhIGNsYXNzIGZvciBkaXNwbGF5LW5hbWVUeXBlIGNvbXBsZXggdHlwZS4KLSAqIDxwLz4KLSAqIDxwPlRoZSBmb2xsb3dpbmcgc2NoZW1hIGZyYWdtZW50IHNwZWNpZmllcyB0aGUgZXhwZWN0ZWQgY29udGVudCBjb250YWluZWQgd2l0aGluIHRoaXMgY2xhc3MuCi0gKiA8cC8+Ci0gKiA8cHJlPgotICogJmx0O2NvbXBsZXhUeXBlIG5hbWU9ImRpc3BsYXktbmFtZVR5cGUiPgotICogICAmbHQ7c2ltcGxlQ29udGVudD4KLSAqICAgICAmbHQ7ZXh0ZW5zaW9uIGJhc2U9IiZsdDtodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWU+c3RyaW5nIj4KLSAqICAgICAgICZsdDthdHRyaWJ1dGUgcmVmPSJ7aHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlfWxhbmciLz4KLSAqICAgICAmbHQ7L2V4dGVuc2lvbj4KLSAqICAgJmx0Oy9zaW1wbGVDb250ZW50PgotICogJmx0Oy9jb21wbGV4VHlwZT4KLSAqIDwvcHJlPgotICovCi1AWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpCi1AWG1sVHlwZShuYW1lID0gImRpc3BsYXktbmFtZVR5cGUiKQotcHVibGljIGNsYXNzIERpc3BsYXlOYW1lVHlwZQotICAgICAgICBleHRlbmRzIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24ueG1sLmhhbmRsZXIuU3RyaW5nIHsKLQotICAgIEBYbWxBdHRyaWJ1dGUobmFtZXNwYWNlID0gImh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIpCi0gICAgcHJvdGVjdGVkIGphdmEubGFuZy5TdHJpbmcgbGFuZzsKLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBsYW5nIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiBwb3NzaWJsZSBvYmplY3QgaXMge0BsaW5rIGphdmEubGFuZy5TdHJpbmcgfQotICAgICAqLwotICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldExhbmcoKSB7Ci0gICAgICAgIHJldHVybiBsYW5nOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBsYW5nIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIGFsbG93ZWQgb2JqZWN0IGlzIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRMYW5nKGphdmEubGFuZy5TdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5sYW5nID0gdmFsdWU7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9FamJMaW5rVHlwZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvRWpiTGlua1R5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjcyYzg4NS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9FamJMaW5rVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8KLS8vIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IHRoZSBKYXZhVE0gQXJjaGl0ZWN0dXJlIGZvciBYTUwgQmluZGluZyhKQVhCKSBSZWZlcmVuY2UgSW1wbGVtZW50YXRpb24sIHYyLjAtYjUyLWZjcyAKLS8vIFNlZSA8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9qYXhiIj5odHRwOi8vamF2YS5zdW4uY29tL3htbC9qYXhiPC9hPiAKLS8vIEFueSBtb2RpZmljYXRpb25zIHRvIHRoaXMgZmlsZSB3aWxsIGJlIGxvc3QgdXBvbiByZWNvbXBpbGF0aW9uIG9mIHRoZSBzb3VyY2Ugc2NoZW1hLiAKLS8vIEdlbmVyYXRlZCBvbjogMjAwNy4wMy4yMSBhdCAxMDo1Njo1MSBBTSBDRFQgCi0vLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi54bWwuaGFuZGxlcjsKLQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGU7Ci0KLQotLyoqCi0gKiBUaGUgZWpiLWxpbmtUeXBlIGlzIHVzZWQgYnkgZWpiLWxpbmsgZWxlbWVudHMgaW4gdGhlIGVqYi1yZWYgb3IgZWpiLWxvY2FsLXJlZiBlbGVtZW50cyB0byBzcGVjaWZ5Ci0gKiB0aGF0IGFuIEVKQiByZWZlcmVuY2UgaXMgbGlua2VkIHRvIGVudGVycHJpc2UgYmVhbi4KLSAqIDxwLz4KLSAqIFRoZSB2YWx1ZSBvZiB0aGUgZWpiLWxpbmsgZWxlbWVudCBtdXN0IGJlIHRoZSBlamItbmFtZSBvZiBhbiBlbnRlcnByaXNlIGJlYW4gaW4gdGhlIHNhbWUgZWpiLWphcgotICogZmlsZSBvciBpbiBhbm90aGVyIGVqYi1qYXIgZmlsZSBpbiB0aGUgc2FtZSBKYXZhIEVFIGFwcGxpY2F0aW9uIHVuaXQuCi0gKiA8cC8+Ci0gKiBBbHRlcm5hdGl2ZWx5LCB0aGUgbmFtZSBpbiB0aGUgZWpiLWxpbmsgZWxlbWVudCBtYXkgYmUgY29tcG9zZWQgb2YgYSBwYXRoIG5hbWUgc3BlY2lmeWluZyB0aGUKLSAqIGVqYi1qYXIgY29udGFpbmluZyB0aGUgcmVmZXJlbmNlZCBlbnRlcnByaXNlIGJlYW4gd2l0aCB0aGUgZWpiLW5hbWUgb2YgdGhlIHRhcmdldCBiZWFuIGFwcGVuZGVkCi0gKiBhbmQgc2VwYXJhdGVkIGZyb20gdGhlIHBhdGggbmFtZSBieSAiIyIuICBUaGUgcGF0aCBuYW1lIGlzIHJlbGF0aXZlIHRvIHRoZSBEZXBsb3ltZW50IEZpbGUKLSAqIGNvbnRhaW5pbmcgRGVwbG95bWVudCBDb21wb25lbnQgdGhhdCBpcyByZWZlcmVuY2luZyB0aGUgZW50ZXJwcmlzZSBiZWFuLiAgVGhpcyBhbGxvd3MgbXVsdGlwbGUKLSAqIGVudGVycHJpc2UgYmVhbnMgd2l0aCB0aGUgc2FtZSBlamItbmFtZSB0byBiZSB1bmlxdWVseSBpZGVudGlmaWVkLgotICogPHAvPgotICogRXhhbXBsZXM6Ci0gKiA8cC8+Ci0gKiA8ZWpiLWxpbms+RW1wbG95ZWVSZWNvcmQ8L2VqYi1saW5rPgotICogPHAvPgotICogPGVqYi1saW5rPi4uL3Byb2R1Y3RzL3Byb2R1Y3QuamFyI1Byb2R1Y3RFSkI8L2VqYi1saW5rPgotICogPHAvPgotICogPHAvPgotICogPHAvPgotICogPHAvPgotICogPHA+SmF2YSBjbGFzcyBmb3IgZWpiLWxpbmtUeXBlIGNvbXBsZXggdHlwZS4KLSAqIDxwLz4KLSAqIDxwPlRoZSBmb2xsb3dpbmcgc2NoZW1hIGZyYWdtZW50IHNwZWNpZmllcyB0aGUgZXhwZWN0ZWQgY29udGVudCBjb250YWluZWQgd2l0aGluIHRoaXMgY2xhc3MuCi0gKiA8cC8+Ci0gKiA8cHJlPgotICogJmx0O2NvbXBsZXhUeXBlIG5hbWU9ImVqYi1saW5rVHlwZSI+Ci0gKiAgICZsdDtzaW1wbGVDb250ZW50PgotICogICAgICZsdDtyZXN0cmljdGlvbiBiYXNlPSImbHQ7aHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlPnN0cmluZyI+Ci0gKiAgICAgJmx0Oy9yZXN0cmljdGlvbj4KLSAqICAgJmx0Oy9zaW1wbGVDb250ZW50PgotICogJmx0Oy9jb21wbGV4VHlwZT4KLSAqIDwvcHJlPgotICovCi1AWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpCi1AWG1sVHlwZShuYW1lID0gImVqYi1saW5rVHlwZSIpCi1wdWJsaWMgY2xhc3MgRWpiTGlua1R5cGUKLSAgICAgICAgZXh0ZW5kcyBTdHJpbmcgewotCi0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL0VqYkxvY2FsUmVmVHlwZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvRWpiTG9jYWxSZWZUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2Y2E3MmEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvRWpiTG9jYWxSZWZUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8KLS8vIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IHRoZSBKYXZhVE0gQXJjaGl0ZWN0dXJlIGZvciBYTUwgQmluZGluZyhKQVhCKSBSZWZlcmVuY2UgSW1wbGVtZW50YXRpb24sIHYyLjAtYjUyLWZjcyAKLS8vIFNlZSA8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9qYXhiIj5odHRwOi8vamF2YS5zdW4uY29tL3htbC9qYXhiPC9hPiAKLS8vIEFueSBtb2RpZmljYXRpb25zIHRvIHRoaXMgZmlsZSB3aWxsIGJlIGxvc3QgdXBvbiByZWNvbXBpbGF0aW9uIG9mIHRoZSBzb3VyY2Ugc2NoZW1hLiAKLS8vIEdlbmVyYXRlZCBvbjogMjAwNy4wMy4yMSBhdCAxMDo1Njo1MSBBTSBDRFQgCi0vLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi54bWwuaGFuZGxlcjsKLQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEF0dHJpYnV0ZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxJRDsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5hZGFwdGVycy5Db2xsYXBzZWRTdHJpbmdBZGFwdGVyOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uYWRhcHRlcnMuWG1sSmF2YVR5cGVBZGFwdGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLQotLyoqCi0gKiBUaGUgZWpiLWxvY2FsLXJlZlR5cGUgaXMgdXNlZCBieSBlamItbG9jYWwtcmVmIGVsZW1lbnRzIGZvciB0aGUgZGVjbGFyYXRpb24gb2YgYSByZWZlcmVuY2UgdG8gYW4KLSAqIGVudGVycHJpc2UgYmVhbidzIGxvY2FsIGhvbWUgb3IgdG8gdGhlIGxvY2FsIGJ1c2luZXNzIGludGVyZmFjZSBvZiBhIDMuMCBiZWFuLiBUaGUgZGVjbGFyYXRpb24KLSAqIGNvbnNpc3RzIG9mOgotICogPHAvPgotICogLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiAtIHRoZSBFSkIgcmVmZXJlbmNlIG5hbWUgdXNlZCBpbiB0aGUgY29kZSBvZiB0aGUgRGVwbG95bWVudCBDb21wb25lbnQKLSAqIHRoYXQncyByZWZlcmVuY2luZyB0aGUgZW50ZXJwcmlzZSBiZWFuLiAtIHRoZSBvcHRpb25hbCBleHBlY3RlZCB0eXBlIG9mIHRoZSByZWZlcmVuY2VkIGVudGVycHJpc2UKLSAqIGJlYW4gLSB0aGUgb3B0aW9uYWwgZXhwZWN0ZWQgbG9jYWwgaW50ZXJmYWNlIG9mIHRoZSByZWZlcmVuY2VkIGVudGVycHJpc2UgYmVhbiBvciB0aGUgbG9jYWwKLSAqIGJ1c2luZXNzIGludGVyZmFjZSBvZiB0aGUgcmVmZXJlbmNlZCBlbnRlcnByaXNlIGJlYW4uIC0gdGhlIG9wdGlvbmFsIGV4cGVjdGVkIGxvY2FsIGhvbWUKLSAqIGludGVyZmFjZSBvZiB0aGUgcmVmZXJlbmNlZCBlbnRlcnByaXNlIGJlYW4uIE5vdCBhcHBsaWNhYmxlIGlmIHRoaXMgZWpiLWxvY2FsLXJlZiByZWZlcnMgdG8gdGhlCi0gKiBsb2NhbCBidXNpbmVzcyBpbnRlcmZhY2Ugb2YgYSAzLjAgYmVhbi4gLSBvcHRpb25hbCBlamItbGluayBpbmZvcm1hdGlvbiwgdXNlZCB0byBzcGVjaWZ5IHRoZQotICogcmVmZXJlbmNlZCBlbnRlcnByaXNlIGJlYW4gLSBvcHRpb25hbCBlbGVtZW50cyB0byBkZWZpbmUgaW5qZWN0aW9uIG9mIHRoZSBuYW1lZCBlbnRlcnByaXNlIGJlYW4KLSAqIGludG8gYSBjb21wb25lbnQgZmllbGQgb3IgcHJvcGVydHkuCi0gKiA8cC8+Ci0gKiA8cC8+Ci0gKiA8cC8+Ci0gKiA8cD5KYXZhIGNsYXNzIGZvciBlamItbG9jYWwtcmVmVHlwZSBjb21wbGV4IHR5cGUuCi0gKiA8cC8+Ci0gKiA8cD5UaGUgZm9sbG93aW5nIHNjaGVtYSBmcmFnbWVudCBzcGVjaWZpZXMgdGhlIGV4cGVjdGVkIGNvbnRlbnQgY29udGFpbmVkIHdpdGhpbiB0aGlzIGNsYXNzLgotICogPHAvPgotICogPHByZT4KLSAqICZsdDtjb21wbGV4VHlwZSBuYW1lPSJlamItbG9jYWwtcmVmVHlwZSI+Ci0gKiAgICZsdDtjb21wbGV4Q29udGVudD4KLSAqICAgICAmbHQ7cmVzdHJpY3Rpb24gYmFzZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfWFueVR5cGUiPgotICogICAgICAgJmx0O3NlcXVlbmNlPgotICogICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ie2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZX1kZXNjcmlwdGlvblR5cGUiCi0gKiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIi8+Ci0gKiAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9ImVqYi1yZWYtbmFtZSIgdHlwZT0ie2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZX1lamItcmVmLW5hbWVUeXBlIi8+Ci0gKiAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9ImVqYi1yZWYtdHlwZSIgdHlwZT0ie2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZX1lamItcmVmLXR5cGVUeXBlIgotICogbWluT2NjdXJzPSIwIi8+Ci0gKiAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9ImxvY2FsLWhvbWUiIHR5cGU9IntodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWV9bG9jYWwtaG9tZVR5cGUiCi0gKiBtaW5PY2N1cnM9IjAiLz4KLSAqICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0ibG9jYWwiIHR5cGU9IntodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWV9bG9jYWxUeXBlIgotICogbWluT2NjdXJzPSIwIi8+Ci0gKiAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9ImVqYi1saW5rIiB0eXBlPSJ7aHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlfWVqYi1saW5rVHlwZSIKLSAqIG1pbk9jY3Vycz0iMCIvPgotICogICAgICAgICAmbHQ7Z3JvdXAgcmVmPSJ7aHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlfXJlc291cmNlR3JvdXAiLz4KLSAqICAgICAgICZsdDsvc2VxdWVuY2U+Ci0gKiAgICAgICAmbHQ7YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9SUQiIC8+Ci0gKiAgICAgJmx0Oy9yZXN0cmljdGlvbj4KLSAqICAgJmx0Oy9jb21wbGV4Q29udGVudD4KLSAqICZsdDsvY29tcGxleFR5cGU+Ci0gKiA8L3ByZT4KLSAqLwotQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKQotQFhtbFR5cGUobmFtZSA9ICJlamItbG9jYWwtcmVmVHlwZSIsIHByb3BPcmRlciA9IHsKLSAgICAgICAgImRlc2NyaXB0aW9uIiwKLSAgICAgICAgImVqYlJlZk5hbWUiLAotICAgICAgICAiZWpiUmVmVHlwZSIsCi0gICAgICAgICJsb2NhbEhvbWUiLAotICAgICAgICAibG9jYWwiLAotICAgICAgICAiZWpiTGluayIsCi0gICAgICAgICJtYXBwZWROYW1lIiwKLSAgICAgICAgImluamVjdGlvblRhcmdldCIKLSAgICAgICAgfSkKLXB1YmxpYyBjbGFzcyBFamJMb2NhbFJlZlR5cGUgewotCi0gICAgQFhtbEVsZW1lbnQobmFtZXNwYWNlID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIsIHJlcXVpcmVkID0gdHJ1ZSkKLSAgICBwcm90ZWN0ZWQgTGlzdDxEZXNjcmlwdGlvblR5cGU+IGRlc2NyaXB0aW9uOwotICAgIEBYbWxFbGVtZW50KG5hbWUgPSAiZWpiLXJlZi1uYW1lIiwgbmFtZXNwYWNlID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIsCi0gICAgICAgICAgICAgICAgcmVxdWlyZWQgPSB0cnVlKQotICAgIHByb3RlY3RlZCBFamJSZWZOYW1lVHlwZSBlamJSZWZOYW1lOwotICAgIEBYbWxFbGVtZW50KG5hbWUgPSAiZWpiLXJlZi10eXBlIiwgbmFtZXNwYWNlID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIpCi0gICAgcHJvdGVjdGVkIEVqYlJlZlR5cGVUeXBlIGVqYlJlZlR5cGU7Ci0gICAgQFhtbEVsZW1lbnQobmFtZSA9ICJsb2NhbC1ob21lIiwgbmFtZXNwYWNlID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIpCi0gICAgcHJvdGVjdGVkIExvY2FsSG9tZVR5cGUgbG9jYWxIb21lOwotICAgIEBYbWxFbGVtZW50KG5hbWVzcGFjZSA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiKQotICAgIHByb3RlY3RlZCBMb2NhbFR5cGUgbG9jYWw7Ci0gICAgQFhtbEVsZW1lbnQobmFtZSA9ICJlamItbGluayIsIG5hbWVzcGFjZSA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiKQotICAgIHByb3RlY3RlZCBFamJMaW5rVHlwZSBlamJMaW5rOwotICAgIEBYbWxFbGVtZW50KG5hbWUgPSAibWFwcGVkLW5hbWUiLCBuYW1lc3BhY2UgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIikKLSAgICBwcm90ZWN0ZWQgWHNkU3RyaW5nVHlwZSBtYXBwZWROYW1lOwotICAgIEBYbWxFbGVtZW50KG5hbWUgPSAiaW5qZWN0aW9uLXRhcmdldCIsIG5hbWVzcGFjZSA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiLAotICAgICAgICAgICAgICAgIHJlcXVpcmVkID0gdHJ1ZSkKLSAgICBwcm90ZWN0ZWQgTGlzdDxJbmplY3Rpb25UYXJnZXRUeXBlPiBpbmplY3Rpb25UYXJnZXQ7Ci0gICAgQFhtbEF0dHJpYnV0ZQotICAgIEBYbWxKYXZhVHlwZUFkYXB0ZXIoQ29sbGFwc2VkU3RyaW5nQWRhcHRlci5jbGFzcykKLSAgICBAWG1sSUQKLSAgICBwcm90ZWN0ZWQgamF2YS5sYW5nLlN0cmluZyBpZDsKLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBkZXNjcmlwdGlvbiBwcm9wZXJ0eS4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIFRoaXMgYWNjZXNzb3IgbWV0aG9kIHJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIGxpdmUgbGlzdCwgbm90IGEgc25hcHNob3QuIFRoZXJlZm9yZSBhbnkKLSAgICAgKiBtb2RpZmljYXRpb24geW91IG1ha2UgdG8gdGhlIHJldHVybmVkIGxpc3Qgd2lsbCBiZSBwcmVzZW50IGluc2lkZSB0aGUgSkFYQiBvYmplY3QuIFRoaXMgaXMKLSAgICAgKiB3aHkgdGhlcmUgaXMgbm90IGEgPENPREU+c2V0PC9DT0RFPiBtZXRob2QgZm9yIHRoZSBkZXNjcmlwdGlvbiBwcm9wZXJ0eS4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIEZvciBleGFtcGxlLCB0byBhZGQgYSBuZXcgaXRlbSwgZG8gYXMgZm9sbG93czoKLSAgICAgKiA8cHJlPgotICAgICAqICAgIGdldERlc2NyaXB0aW9uKCkuYWRkKG5ld0l0ZW0pOwotICAgICAqIDwvcHJlPgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIE9iamVjdHMgb2YgdGhlIGZvbGxvd2luZyB0eXBlKHMpIGFyZSBhbGxvd2VkIGluIHRoZSBsaXN0IHtAbGluayBEZXNjcmlwdGlvblR5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PERlc2NyaXB0aW9uVHlwZT4gZ2V0RGVzY3JpcHRpb24oKSB7Ci0gICAgICAgIGlmIChkZXNjcmlwdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICBkZXNjcmlwdGlvbiA9IG5ldyBBcnJheUxpc3Q8RGVzY3JpcHRpb25UeXBlPigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzLmRlc2NyaXB0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBlamJSZWZOYW1lIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiBwb3NzaWJsZSBvYmplY3QgaXMge0BsaW5rIEVqYlJlZk5hbWVUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgRWpiUmVmTmFtZVR5cGUgZ2V0RWpiUmVmTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGVqYlJlZk5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGVqYlJlZk5hbWUgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgYWxsb3dlZCBvYmplY3QgaXMge0BsaW5rIEVqYlJlZk5hbWVUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRFamJSZWZOYW1lKEVqYlJlZk5hbWVUeXBlIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMuZWpiUmVmTmFtZSA9IHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBlamJSZWZUeXBlIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiBwb3NzaWJsZSBvYmplY3QgaXMge0BsaW5rIEVqYlJlZlR5cGVUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgRWpiUmVmVHlwZVR5cGUgZ2V0RWpiUmVmVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIGVqYlJlZlR5cGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGVqYlJlZlR5cGUgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgYWxsb3dlZCBvYmplY3QgaXMge0BsaW5rIEVqYlJlZlR5cGVUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRFamJSZWZUeXBlKEVqYlJlZlR5cGVUeXBlIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMuZWpiUmVmVHlwZSA9IHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBsb2NhbEhvbWUgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHBvc3NpYmxlIG9iamVjdCBpcyB7QGxpbmsgTG9jYWxIb21lVHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIExvY2FsSG9tZVR5cGUgZ2V0TG9jYWxIb21lKCkgewotICAgICAgICByZXR1cm4gbG9jYWxIb21lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBsb2NhbEhvbWUgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgYWxsb3dlZCBvYmplY3QgaXMge0BsaW5rIExvY2FsSG9tZVR5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldExvY2FsSG9tZShMb2NhbEhvbWVUeXBlIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMubG9jYWxIb21lID0gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGxvY2FsIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiBwb3NzaWJsZSBvYmplY3QgaXMge0BsaW5rIExvY2FsVHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIExvY2FsVHlwZSBnZXRMb2NhbCgpIHsKLSAgICAgICAgcmV0dXJuIGxvY2FsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBsb2NhbCBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcyB7QGxpbmsgTG9jYWxUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRMb2NhbChMb2NhbFR5cGUgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5sb2NhbCA9IHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBlamJMaW5rIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiBwb3NzaWJsZSBvYmplY3QgaXMge0BsaW5rIEVqYkxpbmtUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgRWpiTGlua1R5cGUgZ2V0RWpiTGluaygpIHsKLSAgICAgICAgcmV0dXJuIGVqYkxpbms7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGVqYkxpbmsgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgYWxsb3dlZCBvYmplY3QgaXMge0BsaW5rIEVqYkxpbmtUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRFamJMaW5rKEVqYkxpbmtUeXBlIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMuZWpiTGluayA9IHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBtYXBwZWROYW1lIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiBwb3NzaWJsZSBvYmplY3QgaXMge0BsaW5rIFhzZFN0cmluZ1R5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyBYc2RTdHJpbmdUeXBlIGdldE1hcHBlZE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBtYXBwZWROYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBtYXBwZWROYW1lIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIGFsbG93ZWQgb2JqZWN0IGlzIHtAbGluayBYc2RTdHJpbmdUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRNYXBwZWROYW1lKFhzZFN0cmluZ1R5cGUgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5tYXBwZWROYW1lID0gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGluamVjdGlvblRhcmdldCBwcm9wZXJ0eS4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIFRoaXMgYWNjZXNzb3IgbWV0aG9kIHJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIGxpdmUgbGlzdCwgbm90IGEgc25hcHNob3QuIFRoZXJlZm9yZSBhbnkKLSAgICAgKiBtb2RpZmljYXRpb24geW91IG1ha2UgdG8gdGhlIHJldHVybmVkIGxpc3Qgd2lsbCBiZSBwcmVzZW50IGluc2lkZSB0aGUgSkFYQiBvYmplY3QuIFRoaXMgaXMKLSAgICAgKiB3aHkgdGhlcmUgaXMgbm90IGEgPENPREU+c2V0PC9DT0RFPiBtZXRob2QgZm9yIHRoZSBpbmplY3Rpb25UYXJnZXQgcHJvcGVydHkuCi0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBGb3IgZXhhbXBsZSwgdG8gYWRkIGEgbmV3IGl0ZW0sIGRvIGFzIGZvbGxvd3M6Ci0gICAgICogPHByZT4KLSAgICAgKiAgICBnZXRJbmplY3Rpb25UYXJnZXQoKS5hZGQobmV3SXRlbSk7Ci0gICAgICogPC9wcmU+Ci0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogT2JqZWN0cyBvZiB0aGUgZm9sbG93aW5nIHR5cGUocykgYXJlIGFsbG93ZWQgaW4gdGhlIGxpc3Qge0BsaW5rIEluamVjdGlvblRhcmdldFR5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PEluamVjdGlvblRhcmdldFR5cGU+IGdldEluamVjdGlvblRhcmdldCgpIHsKLSAgICAgICAgaWYgKGluamVjdGlvblRhcmdldCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpbmplY3Rpb25UYXJnZXQgPSBuZXcgQXJyYXlMaXN0PEluamVjdGlvblRhcmdldFR5cGU+KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMuaW5qZWN0aW9uVGFyZ2V0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBpZCBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRJZCgpIHsKLSAgICAgICAgcmV0dXJuIGlkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBpZCBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcyB7QGxpbmsgamF2YS5sYW5nLlN0cmluZyB9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SWQoamF2YS5sYW5nLlN0cmluZyB2YWx1ZSkgewotICAgICAgICB0aGlzLmlkID0gdmFsdWU7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9FamJSZWZOYW1lVHlwZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvRWpiUmVmTmFtZVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E5NGU4ZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9FamJSZWZOYW1lVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8KLS8vIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IHRoZSBKYXZhVE0gQXJjaGl0ZWN0dXJlIGZvciBYTUwgQmluZGluZyhKQVhCKSBSZWZlcmVuY2UgSW1wbGVtZW50YXRpb24sIHYyLjAtYjUyLWZjcyAKLS8vIFNlZSA8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9qYXhiIj5odHRwOi8vamF2YS5zdW4uY29tL3htbC9qYXhiPC9hPiAKLS8vIEFueSBtb2RpZmljYXRpb25zIHRvIHRoaXMgZmlsZSB3aWxsIGJlIGxvc3QgdXBvbiByZWNvbXBpbGF0aW9uIG9mIHRoZSBzb3VyY2Ugc2NoZW1hLiAKLS8vIEdlbmVyYXRlZCBvbjogMjAwNy4wMy4yMSBhdCAxMDo1Njo1MSBBTSBDRFQgCi0vLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi54bWwuaGFuZGxlcjsKLQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGU7Ci0KLQotLyoqCi0gKiBUaGUgZWpiLXJlZi1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYW4gRUpCIHJlZmVyZW5jZS4gVGhlIEVKQiByZWZlcmVuY2UgaXMgYW4gZW50cnkgaW4KLSAqIHRoZSBEZXBsb3ltZW50IENvbXBvbmVudCdzIGVudmlyb25tZW50IGFuZCBpcyByZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudiBjb250ZXh0LiAgVGhlIG5hbWUKLSAqIG11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUgRGVwbG95bWVudCBDb21wb25lbnQuCi0gKiA8cC8+Ci0gKiBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IG5hbWUgaXMgcHJlZml4ZWQgd2l0aCAiZWpiLyIuCi0gKiA8cC8+Ci0gKiBFeGFtcGxlOgotICogPHAvPgotICogPGVqYi1yZWYtbmFtZT5lamIvUGF5cm9sbDwvZWpiLXJlZi1uYW1lPgotICogPHAvPgotICogPHAvPgotICogPHAvPgotICogPHAvPgotICogPHA+SmF2YSBjbGFzcyBmb3IgZWpiLXJlZi1uYW1lVHlwZSBjb21wbGV4IHR5cGUuCi0gKiA8cC8+Ci0gKiA8cD5UaGUgZm9sbG93aW5nIHNjaGVtYSBmcmFnbWVudCBzcGVjaWZpZXMgdGhlIGV4cGVjdGVkIGNvbnRlbnQgY29udGFpbmVkIHdpdGhpbiB0aGlzIGNsYXNzLgotICogPHAvPgotICogPHByZT4KLSAqICZsdDtjb21wbGV4VHlwZSBuYW1lPSJlamItcmVmLW5hbWVUeXBlIj4KLSAqICAgJmx0O3NpbXBsZUNvbnRlbnQ+Ci0gKiAgICAgJmx0O3Jlc3RyaWN0aW9uIGJhc2U9IiZsdDtodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWU+am5kaS1uYW1lVHlwZSI+Ci0gKiAgICAgJmx0Oy9yZXN0cmljdGlvbj4KLSAqICAgJmx0Oy9zaW1wbGVDb250ZW50PgotICogJmx0Oy9jb21wbGV4VHlwZT4KLSAqIDwvcHJlPgotICovCi1AWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpCi1AWG1sVHlwZShuYW1lID0gImVqYi1yZWYtbmFtZVR5cGUiKQotcHVibGljIGNsYXNzIEVqYlJlZk5hbWVUeXBlCi0gICAgICAgIGV4dGVuZHMgSm5kaU5hbWVUeXBlIHsKLQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9FamJSZWZUeXBlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9FamJSZWZUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhZjI3MGUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvRWpiUmVmVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vCi0vLyBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSB0aGUgSmF2YVRNIEFyY2hpdGVjdHVyZSBmb3IgWE1MIEJpbmRpbmcoSkFYQikgUmVmZXJlbmNlIEltcGxlbWVudGF0aW9uLCB2Mi4wLWI1Mi1mY3MgCi0vLyBTZWUgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YiI+aHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YjwvYT4gCi0vLyBBbnkgbW9kaWZpY2F0aW9ucyB0byB0aGlzIGZpbGUgd2lsbCBiZSBsb3N0IHVwb24gcmVjb21waWxhdGlvbiBvZiB0aGUgc291cmNlIHNjaGVtYS4gCi0vLyBHZW5lcmF0ZWQgb246IDIwMDcuMDMuMjEgYXQgMTA6NTY6NTEgQU0gQ0RUIAotLy8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24ueG1sLmhhbmRsZXI7Ci0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBdHRyaWJ1dGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50OwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sSUQ7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uYWRhcHRlcnMuQ29sbGFwc2VkU3RyaW5nQWRhcHRlcjsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLmFkYXB0ZXJzLlhtbEphdmFUeXBlQWRhcHRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0KLS8qKgotICogVGhlIGVqYi1yZWZUeXBlIGlzIHVzZWQgYnkgZWpiLXJlZiBlbGVtZW50cyBmb3IgdGhlIGRlY2xhcmF0aW9uIG9mIGEgcmVmZXJlbmNlIHRvIGFuIGVudGVycHJpc2UKLSAqIGJlYW4ncyBob21lIG9yIHRvIHRoZSByZW1vdGUgYnVzaW5lc3MgaW50ZXJmYWNlIG9mIGEgMy4wIGJlYW4uIFRoZSBkZWNsYXJhdGlvbiBjb25zaXN0cyBvZjoKLSAqIDxwLz4KLSAqIC0gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gLSB0aGUgRUpCIHJlZmVyZW5jZSBuYW1lIHVzZWQgaW4gdGhlIGNvZGUgb2YgdGhlIERlcGxveW1lbnQgQ29tcG9uZW50Ci0gKiB0aGF0J3MgcmVmZXJlbmNpbmcgdGhlIGVudGVycHJpc2UgYmVhbi4gLSB0aGUgb3B0aW9uYWwgZXhwZWN0ZWQgdHlwZSBvZiB0aGUgcmVmZXJlbmNlZCBlbnRlcnByaXNlCi0gKiBiZWFuIC0gdGhlIG9wdGlvbmFsIHJlbW90ZSBpbnRlcmZhY2Ugb2YgdGhlIHJlZmVyZW5jZWQgZW50ZXJwcmlzZSBiZWFuIG9yIHRoZSByZW1vdGUgYnVzaW5lc3MKLSAqIGludGVyZmFjZSBvZiB0aGUgcmVmZXJlbmNlZCBlbnRlcnByaXNlIGJlYW4gLSB0aGUgb3B0aW9uYWwgZXhwZWN0ZWQgaG9tZSBpbnRlcmZhY2Ugb2YgdGhlCi0gKiByZWZlcmVuY2VkIGVudGVycHJpc2UgYmVhbi4gIE5vdCBhcHBsaWNhYmxlIGlmIHRoaXMgZWpiLXJlZiByZWZlcnMgdG8gdGhlIHJlbW90ZSBidXNpbmVzcwotICogaW50ZXJmYWNlIG9mIGEgMy4wIGJlYW4uIC0gb3B0aW9uYWwgZWpiLWxpbmsgaW5mb3JtYXRpb24sIHVzZWQgdG8gc3BlY2lmeSB0aGUgcmVmZXJlbmNlZAotICogZW50ZXJwcmlzZSBiZWFuIC0gb3B0aW9uYWwgZWxlbWVudHMgdG8gZGVmaW5lIGluamVjdGlvbiBvZiB0aGUgbmFtZWQgZW50ZXJwcmlzZSBiZWFuIGludG8gYQotICogY29tcG9uZW50IGZpZWxkIG9yIHByb3BlcnR5Ci0gKiA8cC8+Ci0gKiA8cC8+Ci0gKiA8cC8+Ci0gKiA8cD5KYXZhIGNsYXNzIGZvciBlamItcmVmVHlwZSBjb21wbGV4IHR5cGUuCi0gKiA8cC8+Ci0gKiA8cD5UaGUgZm9sbG93aW5nIHNjaGVtYSBmcmFnbWVudCBzcGVjaWZpZXMgdGhlIGV4cGVjdGVkIGNvbnRlbnQgY29udGFpbmVkIHdpdGhpbiB0aGlzIGNsYXNzLgotICogPHAvPgotICogPHByZT4KLSAqICZsdDtjb21wbGV4VHlwZSBuYW1lPSJlamItcmVmVHlwZSI+Ci0gKiAgICZsdDtjb21wbGV4Q29udGVudD4KLSAqICAgICAmbHQ7cmVzdHJpY3Rpb24gYmFzZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfWFueVR5cGUiPgotICogICAgICAgJmx0O3NlcXVlbmNlPgotICogICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ie2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZX1kZXNjcmlwdGlvblR5cGUiCi0gKiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIi8+Ci0gKiAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9ImVqYi1yZWYtbmFtZSIgdHlwZT0ie2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZX1lamItcmVmLW5hbWVUeXBlIi8+Ci0gKiAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9ImVqYi1yZWYtdHlwZSIgdHlwZT0ie2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZX1lamItcmVmLXR5cGVUeXBlIgotICogbWluT2NjdXJzPSIwIi8+Ci0gKiAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9ImhvbWUiIHR5cGU9IntodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWV9aG9tZVR5cGUiCi0gKiBtaW5PY2N1cnM9IjAiLz4KLSAqICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0icmVtb3RlIiB0eXBlPSJ7aHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlfXJlbW90ZVR5cGUiCi0gKiBtaW5PY2N1cnM9IjAiLz4KLSAqICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0iZWpiLWxpbmsiIHR5cGU9IntodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWV9ZWpiLWxpbmtUeXBlIgotICogbWluT2NjdXJzPSIwIi8+Ci0gKiAgICAgICAgICZsdDtncm91cCByZWY9IntodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWV9cmVzb3VyY2VHcm91cCIvPgotICogICAgICAgJmx0Oy9zZXF1ZW5jZT4KLSAqICAgICAgICZsdDthdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1JRCIgLz4KLSAqICAgICAmbHQ7L3Jlc3RyaWN0aW9uPgotICogICAmbHQ7L2NvbXBsZXhDb250ZW50PgotICogJmx0Oy9jb21wbGV4VHlwZT4KLSAqIDwvcHJlPgotICovCi1AWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpCi1AWG1sVHlwZShuYW1lID0gImVqYi1yZWZUeXBlIiwgcHJvcE9yZGVyID0gewotICAgICAgICAiZGVzY3JpcHRpb24iLAotICAgICAgICAiZWpiUmVmTmFtZSIsCi0gICAgICAgICJlamJSZWZUeXBlIiwKLSAgICAgICAgImhvbWUiLAotICAgICAgICAicmVtb3RlIiwKLSAgICAgICAgImVqYkxpbmsiLAotICAgICAgICAibWFwcGVkTmFtZSIsCi0gICAgICAgICJpbmplY3Rpb25UYXJnZXQiCi0gICAgICAgIH0pCi1wdWJsaWMgY2xhc3MgRWpiUmVmVHlwZSB7Ci0KLSAgICBAWG1sRWxlbWVudChuYW1lc3BhY2UgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiwgcmVxdWlyZWQgPSB0cnVlKQotICAgIHByb3RlY3RlZCBMaXN0PERlc2NyaXB0aW9uVHlwZT4gZGVzY3JpcHRpb247Ci0gICAgQFhtbEVsZW1lbnQobmFtZSA9ICJlamItcmVmLW5hbWUiLCBuYW1lc3BhY2UgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiwKLSAgICAgICAgICAgICAgICByZXF1aXJlZCA9IHRydWUpCi0gICAgcHJvdGVjdGVkIEVqYlJlZk5hbWVUeXBlIGVqYlJlZk5hbWU7Ci0gICAgQFhtbEVsZW1lbnQobmFtZSA9ICJlamItcmVmLXR5cGUiLCBuYW1lc3BhY2UgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIikKLSAgICBwcm90ZWN0ZWQgRWpiUmVmVHlwZVR5cGUgZWpiUmVmVHlwZTsKLSAgICBAWG1sRWxlbWVudChuYW1lc3BhY2UgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIikKLSAgICBwcm90ZWN0ZWQgSG9tZVR5cGUgaG9tZTsKLSAgICBAWG1sRWxlbWVudChuYW1lc3BhY2UgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIikKLSAgICBwcm90ZWN0ZWQgUmVtb3RlVHlwZSByZW1vdGU7Ci0gICAgQFhtbEVsZW1lbnQobmFtZSA9ICJlamItbGluayIsIG5hbWVzcGFjZSA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiKQotICAgIHByb3RlY3RlZCBFamJMaW5rVHlwZSBlamJMaW5rOwotICAgIEBYbWxFbGVtZW50KG5hbWUgPSAibWFwcGVkLW5hbWUiLCBuYW1lc3BhY2UgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIikKLSAgICBwcm90ZWN0ZWQgWHNkU3RyaW5nVHlwZSBtYXBwZWROYW1lOwotICAgIEBYbWxFbGVtZW50KG5hbWUgPSAiaW5qZWN0aW9uLXRhcmdldCIsIG5hbWVzcGFjZSA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiLAotICAgICAgICAgICAgICAgIHJlcXVpcmVkID0gdHJ1ZSkKLSAgICBwcm90ZWN0ZWQgTGlzdDxJbmplY3Rpb25UYXJnZXRUeXBlPiBpbmplY3Rpb25UYXJnZXQ7Ci0gICAgQFhtbEF0dHJpYnV0ZQotICAgIEBYbWxKYXZhVHlwZUFkYXB0ZXIoQ29sbGFwc2VkU3RyaW5nQWRhcHRlci5jbGFzcykKLSAgICBAWG1sSUQKLSAgICBwcm90ZWN0ZWQgamF2YS5sYW5nLlN0cmluZyBpZDsKLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBkZXNjcmlwdGlvbiBwcm9wZXJ0eS4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIFRoaXMgYWNjZXNzb3IgbWV0aG9kIHJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIGxpdmUgbGlzdCwgbm90IGEgc25hcHNob3QuIFRoZXJlZm9yZSBhbnkKLSAgICAgKiBtb2RpZmljYXRpb24geW91IG1ha2UgdG8gdGhlIHJldHVybmVkIGxpc3Qgd2lsbCBiZSBwcmVzZW50IGluc2lkZSB0aGUgSkFYQiBvYmplY3QuIFRoaXMgaXMKLSAgICAgKiB3aHkgdGhlcmUgaXMgbm90IGEgPENPREU+c2V0PC9DT0RFPiBtZXRob2QgZm9yIHRoZSBkZXNjcmlwdGlvbiBwcm9wZXJ0eS4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIEZvciBleGFtcGxlLCB0byBhZGQgYSBuZXcgaXRlbSwgZG8gYXMgZm9sbG93czoKLSAgICAgKiA8cHJlPgotICAgICAqICAgIGdldERlc2NyaXB0aW9uKCkuYWRkKG5ld0l0ZW0pOwotICAgICAqIDwvcHJlPgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIE9iamVjdHMgb2YgdGhlIGZvbGxvd2luZyB0eXBlKHMpIGFyZSBhbGxvd2VkIGluIHRoZSBsaXN0IHtAbGluayBEZXNjcmlwdGlvblR5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PERlc2NyaXB0aW9uVHlwZT4gZ2V0RGVzY3JpcHRpb24oKSB7Ci0gICAgICAgIGlmIChkZXNjcmlwdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICBkZXNjcmlwdGlvbiA9IG5ldyBBcnJheUxpc3Q8RGVzY3JpcHRpb25UeXBlPigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzLmRlc2NyaXB0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBlamJSZWZOYW1lIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiBwb3NzaWJsZSBvYmplY3QgaXMge0BsaW5rIEVqYlJlZk5hbWVUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgRWpiUmVmTmFtZVR5cGUgZ2V0RWpiUmVmTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGVqYlJlZk5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGVqYlJlZk5hbWUgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgYWxsb3dlZCBvYmplY3QgaXMge0BsaW5rIEVqYlJlZk5hbWVUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRFamJSZWZOYW1lKEVqYlJlZk5hbWVUeXBlIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMuZWpiUmVmTmFtZSA9IHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBlamJSZWZUeXBlIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiBwb3NzaWJsZSBvYmplY3QgaXMge0BsaW5rIEVqYlJlZlR5cGVUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgRWpiUmVmVHlwZVR5cGUgZ2V0RWpiUmVmVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIGVqYlJlZlR5cGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGVqYlJlZlR5cGUgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgYWxsb3dlZCBvYmplY3QgaXMge0BsaW5rIEVqYlJlZlR5cGVUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRFamJSZWZUeXBlKEVqYlJlZlR5cGVUeXBlIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMuZWpiUmVmVHlwZSA9IHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBob21lIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiBwb3NzaWJsZSBvYmplY3QgaXMge0BsaW5rIEhvbWVUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgSG9tZVR5cGUgZ2V0SG9tZSgpIHsKLSAgICAgICAgcmV0dXJuIGhvbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGhvbWUgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgYWxsb3dlZCBvYmplY3QgaXMge0BsaW5rIEhvbWVUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRIb21lKEhvbWVUeXBlIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMuaG9tZSA9IHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSByZW1vdGUgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHBvc3NpYmxlIG9iamVjdCBpcyB7QGxpbmsgUmVtb3RlVHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIFJlbW90ZVR5cGUgZ2V0UmVtb3RlKCkgewotICAgICAgICByZXR1cm4gcmVtb3RlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSByZW1vdGUgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgYWxsb3dlZCBvYmplY3QgaXMge0BsaW5rIFJlbW90ZVR5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFJlbW90ZShSZW1vdGVUeXBlIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMucmVtb3RlID0gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGVqYkxpbmsgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHBvc3NpYmxlIG9iamVjdCBpcyB7QGxpbmsgRWpiTGlua1R5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyBFamJMaW5rVHlwZSBnZXRFamJMaW5rKCkgewotICAgICAgICByZXR1cm4gZWpiTGluazsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZWpiTGluayBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcyB7QGxpbmsgRWpiTGlua1R5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEVqYkxpbmsoRWpiTGlua1R5cGUgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5lamJMaW5rID0gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIG1hcHBlZE5hbWUgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHBvc3NpYmxlIG9iamVjdCBpcyB7QGxpbmsgWHNkU3RyaW5nVHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIFhzZFN0cmluZ1R5cGUgZ2V0TWFwcGVkTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG1hcHBlZE5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIG1hcHBlZE5hbWUgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgYWxsb3dlZCBvYmplY3QgaXMge0BsaW5rIFhzZFN0cmluZ1R5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE1hcHBlZE5hbWUoWHNkU3RyaW5nVHlwZSB2YWx1ZSkgewotICAgICAgICB0aGlzLm1hcHBlZE5hbWUgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgaW5qZWN0aW9uVGFyZ2V0IHByb3BlcnR5LgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhpcyBhY2Nlc3NvciBtZXRob2QgcmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgbGl2ZSBsaXN0LCBub3QgYSBzbmFwc2hvdC4gVGhlcmVmb3JlIGFueQotICAgICAqIG1vZGlmaWNhdGlvbiB5b3UgbWFrZSB0byB0aGUgcmV0dXJuZWQgbGlzdCB3aWxsIGJlIHByZXNlbnQgaW5zaWRlIHRoZSBKQVhCIG9iamVjdC4gVGhpcyBpcwotICAgICAqIHdoeSB0aGVyZSBpcyBub3QgYSA8Q09ERT5zZXQ8L0NPREU+IG1ldGhvZCBmb3IgdGhlIGluamVjdGlvblRhcmdldCBwcm9wZXJ0eS4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIEZvciBleGFtcGxlLCB0byBhZGQgYSBuZXcgaXRlbSwgZG8gYXMgZm9sbG93czoKLSAgICAgKiA8cHJlPgotICAgICAqICAgIGdldEluamVjdGlvblRhcmdldCgpLmFkZChuZXdJdGVtKTsKLSAgICAgKiA8L3ByZT4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBPYmplY3RzIG9mIHRoZSBmb2xsb3dpbmcgdHlwZShzKSBhcmUgYWxsb3dlZCBpbiB0aGUgbGlzdCB7QGxpbmsgSW5qZWN0aW9uVGFyZ2V0VHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIExpc3Q8SW5qZWN0aW9uVGFyZ2V0VHlwZT4gZ2V0SW5qZWN0aW9uVGFyZ2V0KCkgewotICAgICAgICBpZiAoaW5qZWN0aW9uVGFyZ2V0ID09IG51bGwpIHsKLSAgICAgICAgICAgIGluamVjdGlvblRhcmdldCA9IG5ldyBBcnJheUxpc3Q8SW5qZWN0aW9uVGFyZ2V0VHlwZT4oKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpcy5pbmplY3Rpb25UYXJnZXQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGlkIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiBwb3NzaWJsZSBvYmplY3QgaXMge0BsaW5rIGphdmEubGFuZy5TdHJpbmcgfQotICAgICAqLwotICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldElkKCkgewotICAgICAgICByZXR1cm4gaWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGlkIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIGFsbG93ZWQgb2JqZWN0IGlzIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJZChqYXZhLmxhbmcuU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMuaWQgPSB2YWx1ZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL0VqYlJlZlR5cGVUeXBlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9FamJSZWZUeXBlVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjljMDQ1Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL0VqYlJlZlR5cGVUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLwotLy8gVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIEphdmFUTSBBcmNoaXRlY3R1cmUgZm9yIFhNTCBCaW5kaW5nKEpBWEIpIFJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbiwgdjIuMC1iNTItZmNzIAotLy8gU2VlIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGIiPmh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGI8L2E+IAotLy8gQW55IG1vZGlmaWNhdGlvbnMgdG8gdGhpcyBmaWxlIHdpbGwgYmUgbG9zdCB1cG9uIHJlY29tcGlsYXRpb24gb2YgdGhlIHNvdXJjZSBzY2hlbWEuIAotLy8gR2VuZXJhdGVkIG9uOiAyMDA3LjAzLjIxIGF0IDEwOjU2OjUxIEFNIENEVCAKLS8vCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLnhtbC5oYW5kbGVyOwotCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZTsKLQotCi0vKioKLSAqIFRoZSBlamItcmVmLXR5cGVUeXBlIGNvbnRhaW5zIHRoZSBleHBlY3RlZCB0eXBlIG9mIHRoZSByZWZlcmVuY2VkIGVudGVycHJpc2UgYmVhbi4KLSAqIDxwLz4KLSAqIFRoZSBlamItcmVmLXR5cGUgZGVzaWduYXRlcyBhIHZhbHVlIHRoYXQgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLSAqIDxwLz4KLSAqIEVudGl0eSBTZXNzaW9uCi0gKiA8cC8+Ci0gKiA8cC8+Ci0gKiA8cC8+Ci0gKiA8cD5KYXZhIGNsYXNzIGZvciBlamItcmVmLXR5cGVUeXBlIGNvbXBsZXggdHlwZS4KLSAqIDxwLz4KLSAqIDxwPlRoZSBmb2xsb3dpbmcgc2NoZW1hIGZyYWdtZW50IHNwZWNpZmllcyB0aGUgZXhwZWN0ZWQgY29udGVudCBjb250YWluZWQgd2l0aGluIHRoaXMgY2xhc3MuCi0gKiA8cC8+Ci0gKiA8cHJlPgotICogJmx0O2NvbXBsZXhUeXBlIG5hbWU9ImVqYi1yZWYtdHlwZVR5cGUiPgotICogICAmbHQ7c2ltcGxlQ29udGVudD4KLSAqICAgICAmbHQ7cmVzdHJpY3Rpb24gYmFzZT0iJmx0O2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZT5zdHJpbmciPgotICogICAgICZsdDsvcmVzdHJpY3Rpb24+Ci0gKiAgICZsdDsvc2ltcGxlQ29udGVudD4KLSAqICZsdDsvY29tcGxleFR5cGU+Ci0gKiA8L3ByZT4KLSAqLwotQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKQotQFhtbFR5cGUobmFtZSA9ICJlamItcmVmLXR5cGVUeXBlIikKLXB1YmxpYyBjbGFzcyBFamJSZWZUeXBlVHlwZQotICAgICAgICBleHRlbmRzIFN0cmluZyB7Ci0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvRW1wdHlUeXBlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9FbXB0eVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTY5MzI1OC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9FbXB0eVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vCi0vLyBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSB0aGUgSmF2YVRNIEFyY2hpdGVjdHVyZSBmb3IgWE1MIEJpbmRpbmcoSkFYQikgUmVmZXJlbmNlIEltcGxlbWVudGF0aW9uLCB2Mi4wLWI1Mi1mY3MgCi0vLyBTZWUgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YiI+aHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YjwvYT4gCi0vLyBBbnkgbW9kaWZpY2F0aW9ucyB0byB0aGlzIGZpbGUgd2lsbCBiZSBsb3N0IHVwb24gcmVjb21waWxhdGlvbiBvZiB0aGUgc291cmNlIHNjaGVtYS4gCi0vLyBHZW5lcmF0ZWQgb246IDIwMDcuMDMuMjEgYXQgMTA6NTY6NTEgQU0gQ0RUIAotLy8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24ueG1sLmhhbmRsZXI7Ci0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBdHRyaWJ1dGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxJRDsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5hZGFwdGVycy5Db2xsYXBzZWRTdHJpbmdBZGFwdGVyOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uYWRhcHRlcnMuWG1sSmF2YVR5cGVBZGFwdGVyOwotCi0KLS8qKgotICogVGhpcyB0eXBlIGlzIHVzZWQgdG8gZGVzaWduYXRlIGFuIGVtcHR5IGVsZW1lbnQgd2hlbiB1c2VkLgotICogPHAvPgotICogPHAvPgotICogPHAvPgotICogPHA+SmF2YSBjbGFzcyBmb3IgZW1wdHlUeXBlIGNvbXBsZXggdHlwZS4KLSAqIDxwLz4KLSAqIDxwPlRoZSBmb2xsb3dpbmcgc2NoZW1hIGZyYWdtZW50IHNwZWNpZmllcyB0aGUgZXhwZWN0ZWQgY29udGVudCBjb250YWluZWQgd2l0aGluIHRoaXMgY2xhc3MuCi0gKiA8cC8+Ci0gKiA8cHJlPgotICogJmx0O2NvbXBsZXhUeXBlIG5hbWU9ImVtcHR5VHlwZSI+Ci0gKiAgICZsdDtjb21wbGV4Q29udGVudD4KLSAqICAgICAmbHQ7cmVzdHJpY3Rpb24gYmFzZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfWFueVR5cGUiPgotICogICAgICAgJmx0O2F0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfUlEIiAvPgotICogICAgICZsdDsvcmVzdHJpY3Rpb24+Ci0gKiAgICZsdDsvY29tcGxleENvbnRlbnQ+Ci0gKiAmbHQ7L2NvbXBsZXhUeXBlPgotICogPC9wcmU+Ci0gKi8KLUBYbWxBY2Nlc3NvclR5cGUoWG1sQWNjZXNzVHlwZS5GSUVMRCkKLUBYbWxUeXBlKG5hbWUgPSAiZW1wdHlUeXBlIikKLXB1YmxpYyBjbGFzcyBFbXB0eVR5cGUgewotCi0gICAgQFhtbEF0dHJpYnV0ZQotICAgIEBYbWxKYXZhVHlwZUFkYXB0ZXIoQ29sbGFwc2VkU3RyaW5nQWRhcHRlci5jbGFzcykKLSAgICBAWG1sSUQKLSAgICBwcm90ZWN0ZWQgamF2YS5sYW5nLlN0cmluZyBpZDsKLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBpZCBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRJZCgpIHsKLSAgICAgICAgcmV0dXJuIGlkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBpZCBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcyB7QGxpbmsgamF2YS5sYW5nLlN0cmluZyB9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SWQoamF2YS5sYW5nLlN0cmluZyB2YWx1ZSkgewotICAgICAgICB0aGlzLmlkID0gdmFsdWU7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9FbnZFbnRyeVR5cGUuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL0VudkVudHJ5VHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTQ2OWFlLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL0VudkVudHJ5VHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vCi0vLyBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSB0aGUgSmF2YVRNIEFyY2hpdGVjdHVyZSBmb3IgWE1MIEJpbmRpbmcoSkFYQikgUmVmZXJlbmNlIEltcGxlbWVudGF0aW9uLCB2Mi4wLWI1Mi1mY3MgCi0vLyBTZWUgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YiI+aHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YjwvYT4gCi0vLyBBbnkgbW9kaWZpY2F0aW9ucyB0byB0aGlzIGZpbGUgd2lsbCBiZSBsb3N0IHVwb24gcmVjb21waWxhdGlvbiBvZiB0aGUgc291cmNlIHNjaGVtYS4gCi0vLyBHZW5lcmF0ZWQgb246IDIwMDcuMDMuMjEgYXQgMTA6NTY6NTEgQU0gQ0RUIAotLy8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24ueG1sLmhhbmRsZXI7Ci0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBdHRyaWJ1dGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50OwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sSUQ7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uYWRhcHRlcnMuQ29sbGFwc2VkU3RyaW5nQWRhcHRlcjsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLmFkYXB0ZXJzLlhtbEphdmFUeXBlQWRhcHRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0KLS8qKgotICogVGhlIGVudi1lbnRyeVR5cGUgaXMgdXNlZCB0byBkZWNsYXJlIGFuIGFwcGxpY2F0aW9uJ3MgZW52aXJvbm1lbnQgZW50cnkuIFRoZSBkZWNsYXJhdGlvbiBjb25zaXN0cwotICogb2YgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24sIHRoZSBuYW1lIG9mIHRoZSBlbnZpcm9ubWVudCBlbnRyeSwgYSB0eXBlIChvcHRpb25hbCBpZiB0aGUgdmFsdWUgaXMKLSAqIGluamVjdGVkLCBvdGhlcndpc2UgcmVxdWlyZWQpLCBhbmQgYW4gb3B0aW9uYWwgdmFsdWUuCi0gKiA8cC8+Ci0gKiBJdCBhbHNvIGluY2x1ZGVzIG9wdGlvbmFsIGVsZW1lbnRzIHRvIGRlZmluZSBpbmplY3Rpb24gb2YgdGhlIG5hbWVkIHJlc291cmNlIGludG8gZmllbGRzIG9yCi0gKiBKYXZhQmVhbnMgcHJvcGVydGllcy4KLSAqIDxwLz4KLSAqIElmIGEgdmFsdWUgaXMgbm90IHNwZWNpZmllZCBhbmQgaW5qZWN0aW9uIGlzIHJlcXVlc3RlZCwgbm8gaW5qZWN0aW9uIHdpbGwgb2NjdXIgYW5kIG5vIGVudHJ5IG9mCi0gKiB0aGUgc3BlY2lmaWVkIG5hbWUgd2lsbCBiZSBjcmVhdGVkLiAgVGhpcyBhbGxvd3MgYW4gaW5pdGlhbCB2YWx1ZSB0byBiZSBzcGVjaWZpZWQgaW4gdGhlIHNvdXJjZQotICogY29kZSB3aXRob3V0IGJlaW5nIGluY29ycmVjdGx5IGNoYW5nZWQgd2hlbiBubyBvdmVycmlkZSBoYXMgYmVlbiBzcGVjaWZpZWQuCi0gKiA8cC8+Ci0gKiBJZiBhIHZhbHVlIGlzIG5vdCBzcGVjaWZpZWQgYW5kIG5vIGluamVjdGlvbiBpcyByZXF1ZXN0ZWQsIGEgdmFsdWUgbXVzdCBiZSBzdXBwbGllZCBkdXJpbmcKLSAqIGRlcGxveW1lbnQuCi0gKiA8cC8+Ci0gKiBUaGlzIHR5cGUgaXMgdXNlZCBieSBlbnYtZW50cnkgZWxlbWVudHMuCi0gKiA8cC8+Ci0gKiA8cC8+Ci0gKiA8cC8+Ci0gKiA8cD5KYXZhIGNsYXNzIGZvciBlbnYtZW50cnlUeXBlIGNvbXBsZXggdHlwZS4KLSAqIDxwLz4KLSAqIDxwPlRoZSBmb2xsb3dpbmcgc2NoZW1hIGZyYWdtZW50IHNwZWNpZmllcyB0aGUgZXhwZWN0ZWQgY29udGVudCBjb250YWluZWQgd2l0aGluIHRoaXMgY2xhc3MuCi0gKiA8cC8+Ci0gKiA8cHJlPgotICogJmx0O2NvbXBsZXhUeXBlIG5hbWU9ImVudi1lbnRyeVR5cGUiPgotICogICAmbHQ7Y29tcGxleENvbnRlbnQ+Ci0gKiAgICAgJmx0O3Jlc3RyaWN0aW9uIGJhc2U9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1hbnlUeXBlIj4KLSAqICAgICAgICZsdDtzZXF1ZW5jZT4KLSAqICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9IntodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWV9ZGVzY3JpcHRpb25UeXBlIgotICogbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCIvPgotICogICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJlbnYtZW50cnktbmFtZSIgdHlwZT0ie2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZX1qbmRpLW5hbWVUeXBlIi8+Ci0gKiAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9ImVudi1lbnRyeS10eXBlIiB0eXBlPSJ7aHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlfWVudi1lbnRyeS10eXBlLXZhbHVlc1R5cGUiCi0gKiBtaW5PY2N1cnM9IjAiLz4KLSAqICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0iZW52LWVudHJ5LXZhbHVlIiB0eXBlPSJ7aHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlfXhzZFN0cmluZ1R5cGUiCi0gKiBtaW5PY2N1cnM9IjAiLz4KLSAqICAgICAgICAgJmx0O2dyb3VwIHJlZj0ie2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZX1yZXNvdXJjZUdyb3VwIi8+Ci0gKiAgICAgICAmbHQ7L3NlcXVlbmNlPgotICogICAgICAgJmx0O2F0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfUlEIiAvPgotICogICAgICZsdDsvcmVzdHJpY3Rpb24+Ci0gKiAgICZsdDsvY29tcGxleENvbnRlbnQ+Ci0gKiAmbHQ7L2NvbXBsZXhUeXBlPgotICogPC9wcmU+Ci0gKi8KLUBYbWxBY2Nlc3NvclR5cGUoWG1sQWNjZXNzVHlwZS5GSUVMRCkKLUBYbWxUeXBlKG5hbWUgPSAiZW52LWVudHJ5VHlwZSIsIHByb3BPcmRlciA9IHsKLSAgICAgICAgImRlc2NyaXB0aW9uIiwKLSAgICAgICAgImVudkVudHJ5TmFtZSIsCi0gICAgICAgICJlbnZFbnRyeVR5cGUiLAotICAgICAgICAiZW52RW50cnlWYWx1ZSIsCi0gICAgICAgICJtYXBwZWROYW1lIiwKLSAgICAgICAgImluamVjdGlvblRhcmdldCIKLSAgICAgICAgfSkKLXB1YmxpYyBjbGFzcyBFbnZFbnRyeVR5cGUgewotCi0gICAgQFhtbEVsZW1lbnQobmFtZXNwYWNlID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIsIHJlcXVpcmVkID0gdHJ1ZSkKLSAgICBwcm90ZWN0ZWQgTGlzdDxEZXNjcmlwdGlvblR5cGU+IGRlc2NyaXB0aW9uOwotICAgIEBYbWxFbGVtZW50KG5hbWUgPSAiZW52LWVudHJ5LW5hbWUiLCBuYW1lc3BhY2UgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiwKLSAgICAgICAgICAgICAgICByZXF1aXJlZCA9IHRydWUpCi0gICAgcHJvdGVjdGVkIEpuZGlOYW1lVHlwZSBlbnZFbnRyeU5hbWU7Ci0gICAgQFhtbEVsZW1lbnQobmFtZSA9ICJlbnYtZW50cnktdHlwZSIsIG5hbWVzcGFjZSA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiKQotICAgIHByb3RlY3RlZCBFbnZFbnRyeVR5cGVWYWx1ZXNUeXBlIGVudkVudHJ5VHlwZTsKLSAgICBAWG1sRWxlbWVudChuYW1lID0gImVudi1lbnRyeS12YWx1ZSIsIG5hbWVzcGFjZSA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiKQotICAgIHByb3RlY3RlZCBYc2RTdHJpbmdUeXBlIGVudkVudHJ5VmFsdWU7Ci0gICAgQFhtbEVsZW1lbnQobmFtZSA9ICJtYXBwZWQtbmFtZSIsIG5hbWVzcGFjZSA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiKQotICAgIHByb3RlY3RlZCBYc2RTdHJpbmdUeXBlIG1hcHBlZE5hbWU7Ci0gICAgQFhtbEVsZW1lbnQobmFtZSA9ICJpbmplY3Rpb24tdGFyZ2V0IiwgbmFtZXNwYWNlID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIsCi0gICAgICAgICAgICAgICAgcmVxdWlyZWQgPSB0cnVlKQotICAgIHByb3RlY3RlZCBMaXN0PEluamVjdGlvblRhcmdldFR5cGU+IGluamVjdGlvblRhcmdldDsKLSAgICBAWG1sQXR0cmlidXRlCi0gICAgQFhtbEphdmFUeXBlQWRhcHRlcihDb2xsYXBzZWRTdHJpbmdBZGFwdGVyLmNsYXNzKQotICAgIEBYbWxJRAotICAgIHByb3RlY3RlZCBqYXZhLmxhbmcuU3RyaW5nIGlkOwotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGRlc2NyaXB0aW9uIHByb3BlcnR5LgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhpcyBhY2Nlc3NvciBtZXRob2QgcmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgbGl2ZSBsaXN0LCBub3QgYSBzbmFwc2hvdC4gVGhlcmVmb3JlIGFueQotICAgICAqIG1vZGlmaWNhdGlvbiB5b3UgbWFrZSB0byB0aGUgcmV0dXJuZWQgbGlzdCB3aWxsIGJlIHByZXNlbnQgaW5zaWRlIHRoZSBKQVhCIG9iamVjdC4gVGhpcyBpcwotICAgICAqIHdoeSB0aGVyZSBpcyBub3QgYSA8Q09ERT5zZXQ8L0NPREU+IG1ldGhvZCBmb3IgdGhlIGRlc2NyaXB0aW9uIHByb3BlcnR5LgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogRm9yIGV4YW1wbGUsIHRvIGFkZCBhIG5ldyBpdGVtLCBkbyBhcyBmb2xsb3dzOgotICAgICAqIDxwcmU+Ci0gICAgICogICAgZ2V0RGVzY3JpcHRpb24oKS5hZGQobmV3SXRlbSk7Ci0gICAgICogPC9wcmU+Ci0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogT2JqZWN0cyBvZiB0aGUgZm9sbG93aW5nIHR5cGUocykgYXJlIGFsbG93ZWQgaW4gdGhlIGxpc3Qge0BsaW5rIERlc2NyaXB0aW9uVHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIExpc3Q8RGVzY3JpcHRpb25UeXBlPiBnZXREZXNjcmlwdGlvbigpIHsKLSAgICAgICAgaWYgKGRlc2NyaXB0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gbmV3IEFycmF5TGlzdDxEZXNjcmlwdGlvblR5cGU+KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMuZGVzY3JpcHRpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGVudkVudHJ5TmFtZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzIHtAbGluayBKbmRpTmFtZVR5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyBKbmRpTmFtZVR5cGUgZ2V0RW52RW50cnlOYW1lKCkgewotICAgICAgICByZXR1cm4gZW52RW50cnlOYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBlbnZFbnRyeU5hbWUgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgYWxsb3dlZCBvYmplY3QgaXMge0BsaW5rIEpuZGlOYW1lVHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RW52RW50cnlOYW1lKEpuZGlOYW1lVHlwZSB2YWx1ZSkgewotICAgICAgICB0aGlzLmVudkVudHJ5TmFtZSA9IHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBlbnZFbnRyeVR5cGUgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHBvc3NpYmxlIG9iamVjdCBpcyB7QGxpbmsgRW52RW50cnlUeXBlVmFsdWVzVHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIEVudkVudHJ5VHlwZVZhbHVlc1R5cGUgZ2V0RW52RW50cnlUeXBlKCkgewotICAgICAgICByZXR1cm4gZW52RW50cnlUeXBlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBlbnZFbnRyeVR5cGUgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgYWxsb3dlZCBvYmplY3QgaXMge0BsaW5rIEVudkVudHJ5VHlwZVZhbHVlc1R5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEVudkVudHJ5VHlwZShFbnZFbnRyeVR5cGVWYWx1ZXNUeXBlIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMuZW52RW50cnlUeXBlID0gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGVudkVudHJ5VmFsdWUgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHBvc3NpYmxlIG9iamVjdCBpcyB7QGxpbmsgWHNkU3RyaW5nVHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIFhzZFN0cmluZ1R5cGUgZ2V0RW52RW50cnlWYWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIGVudkVudHJ5VmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGVudkVudHJ5VmFsdWUgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgYWxsb3dlZCBvYmplY3QgaXMge0BsaW5rIFhzZFN0cmluZ1R5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEVudkVudHJ5VmFsdWUoWHNkU3RyaW5nVHlwZSB2YWx1ZSkgewotICAgICAgICB0aGlzLmVudkVudHJ5VmFsdWUgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgbWFwcGVkTmFtZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzIHtAbGluayBYc2RTdHJpbmdUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgWHNkU3RyaW5nVHlwZSBnZXRNYXBwZWROYW1lKCkgewotICAgICAgICByZXR1cm4gbWFwcGVkTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgbWFwcGVkTmFtZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcyB7QGxpbmsgWHNkU3RyaW5nVHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TWFwcGVkTmFtZShYc2RTdHJpbmdUeXBlIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMubWFwcGVkTmFtZSA9IHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBpbmplY3Rpb25UYXJnZXQgcHJvcGVydHkuCi0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBUaGlzIGFjY2Vzc29yIG1ldGhvZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBsaXZlIGxpc3QsIG5vdCBhIHNuYXBzaG90LiBUaGVyZWZvcmUgYW55Ci0gICAgICogbW9kaWZpY2F0aW9uIHlvdSBtYWtlIHRvIHRoZSByZXR1cm5lZCBsaXN0IHdpbGwgYmUgcHJlc2VudCBpbnNpZGUgdGhlIEpBWEIgb2JqZWN0LiBUaGlzIGlzCi0gICAgICogd2h5IHRoZXJlIGlzIG5vdCBhIDxDT0RFPnNldDwvQ09ERT4gbWV0aG9kIGZvciB0aGUgaW5qZWN0aW9uVGFyZ2V0IHByb3BlcnR5LgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogRm9yIGV4YW1wbGUsIHRvIGFkZCBhIG5ldyBpdGVtLCBkbyBhcyBmb2xsb3dzOgotICAgICAqIDxwcmU+Ci0gICAgICogICAgZ2V0SW5qZWN0aW9uVGFyZ2V0KCkuYWRkKG5ld0l0ZW0pOwotICAgICAqIDwvcHJlPgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIE9iamVjdHMgb2YgdGhlIGZvbGxvd2luZyB0eXBlKHMpIGFyZSBhbGxvd2VkIGluIHRoZSBsaXN0IHtAbGluayBJbmplY3Rpb25UYXJnZXRUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxJbmplY3Rpb25UYXJnZXRUeXBlPiBnZXRJbmplY3Rpb25UYXJnZXQoKSB7Ci0gICAgICAgIGlmIChpbmplY3Rpb25UYXJnZXQgPT0gbnVsbCkgewotICAgICAgICAgICAgaW5qZWN0aW9uVGFyZ2V0ID0gbmV3IEFycmF5TGlzdDxJbmplY3Rpb25UYXJnZXRUeXBlPigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzLmluamVjdGlvblRhcmdldDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgaWQgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHBvc3NpYmxlIG9iamVjdCBpcyB7QGxpbmsgamF2YS5sYW5nLlN0cmluZyB9Ci0gICAgICovCi0gICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0SWQoKSB7Ci0gICAgICAgIHJldHVybiBpZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgaWQgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgYWxsb3dlZCBvYmplY3QgaXMge0BsaW5rIGphdmEubGFuZy5TdHJpbmcgfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldElkKGphdmEubGFuZy5TdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5pZCA9IHZhbHVlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvRW52RW50cnlUeXBlVmFsdWVzVHlwZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvRW52RW50cnlUeXBlVmFsdWVzVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjFjNzI1Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL0VudkVudHJ5VHlwZVZhbHVlc1R5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vCi0vLyBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSB0aGUgSmF2YVRNIEFyY2hpdGVjdHVyZSBmb3IgWE1MIEJpbmRpbmcoSkFYQikgUmVmZXJlbmNlIEltcGxlbWVudGF0aW9uLCB2Mi4wLWI1Mi1mY3MgCi0vLyBTZWUgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YiI+aHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YjwvYT4gCi0vLyBBbnkgbW9kaWZpY2F0aW9ucyB0byB0aGlzIGZpbGUgd2lsbCBiZSBsb3N0IHVwb24gcmVjb21waWxhdGlvbiBvZiB0aGUgc291cmNlIHNjaGVtYS4gCi0vLyBHZW5lcmF0ZWQgb246IDIwMDcuMDMuMjEgYXQgMTA6NTY6NTEgQU0gQ0RUIAotLy8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24ueG1sLmhhbmRsZXI7Ci0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlOwotCi0KLS8qKgotICogVGhpcyB0eXBlIGNvbnRhaW5zIHRoZSBmdWxseS1xdWFsaWZpZWQgSmF2YSB0eXBlIG9mIHRoZSBlbnZpcm9ubWVudCBlbnRyeSB2YWx1ZSB0aGF0IGlzIGV4cGVjdGVkCi0gKiBieSB0aGUgYXBwbGljYXRpb24ncyBjb2RlLgotICogPHAvPgotICogVGhlIGZvbGxvd2luZyBhcmUgdGhlIGxlZ2FsIHZhbHVlcyBvZiBlbnYtZW50cnktdHlwZS12YWx1ZXNUeXBlOgotICogPHAvPgotICogamF2YS5sYW5nLkJvb2xlYW4gamF2YS5sYW5nLkJ5dGUgamF2YS5sYW5nLkNoYXJhY3RlciBqYXZhLmxhbmcuU3RyaW5nIGphdmEubGFuZy5TaG9ydAotICogamF2YS5sYW5nLkludGVnZXIgamF2YS5sYW5nLkxvbmcgamF2YS5sYW5nLkZsb2F0IGphdmEubGFuZy5Eb3VibGUKLSAqIDxwLz4KLSAqIEV4YW1wbGU6Ci0gKiA8cC8+Ci0gKiA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkJvb2xlYW48L2Vudi1lbnRyeS10eXBlPgotICogPHAvPgotICogPHAvPgotICogPHAvPgotICogPHAvPgotICogPHA+SmF2YSBjbGFzcyBmb3IgZW52LWVudHJ5LXR5cGUtdmFsdWVzVHlwZSBjb21wbGV4IHR5cGUuCi0gKiA8cC8+Ci0gKiA8cD5UaGUgZm9sbG93aW5nIHNjaGVtYSBmcmFnbWVudCBzcGVjaWZpZXMgdGhlIGV4cGVjdGVkIGNvbnRlbnQgY29udGFpbmVkIHdpdGhpbiB0aGlzIGNsYXNzLgotICogPHAvPgotICogPHByZT4KLSAqICZsdDtjb21wbGV4VHlwZSBuYW1lPSJlbnYtZW50cnktdHlwZS12YWx1ZXNUeXBlIj4KLSAqICAgJmx0O3NpbXBsZUNvbnRlbnQ+Ci0gKiAgICAgJmx0O3Jlc3RyaWN0aW9uIGJhc2U9IiZsdDtodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWU+c3RyaW5nIj4KLSAqICAgICAmbHQ7L3Jlc3RyaWN0aW9uPgotICogICAmbHQ7L3NpbXBsZUNvbnRlbnQ+Ci0gKiAmbHQ7L2NvbXBsZXhUeXBlPgotICogPC9wcmU+Ci0gKi8KLUBYbWxBY2Nlc3NvclR5cGUoWG1sQWNjZXNzVHlwZS5GSUVMRCkKLUBYbWxUeXBlKG5hbWUgPSAiZW52LWVudHJ5LXR5cGUtdmFsdWVzVHlwZSIpCi1wdWJsaWMgY2xhc3MgRW52RW50cnlUeXBlVmFsdWVzVHlwZQotICAgICAgICBleHRlbmRzIFN0cmluZyB7Ci0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvRnVsbHlRdWFsaWZpZWRDbGFzc1R5cGUuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL0Z1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkZTk1MmEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvRnVsbHlRdWFsaWZpZWRDbGFzc1R5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vCi0vLyBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSB0aGUgSmF2YVRNIEFyY2hpdGVjdHVyZSBmb3IgWE1MIEJpbmRpbmcoSkFYQikgUmVmZXJlbmNlIEltcGxlbWVudGF0aW9uLCB2Mi4wLWI1Mi1mY3MgCi0vLyBTZWUgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YiI+aHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YjwvYT4gCi0vLyBBbnkgbW9kaWZpY2F0aW9ucyB0byB0aGlzIGZpbGUgd2lsbCBiZSBsb3N0IHVwb24gcmVjb21waWxhdGlvbiBvZiB0aGUgc291cmNlIHNjaGVtYS4gCi0vLyBHZW5lcmF0ZWQgb246IDIwMDcuMDMuMjEgYXQgMTA6NTY6NTEgQU0gQ0RUIAotLy8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24ueG1sLmhhbmRsZXI7Ci0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlOwotCi0KLS8qKgotICogVGhlIGVsZW1lbnRzIHRoYXQgdXNlIHRoaXMgdHlwZSBkZXNpZ25hdGUgdGhlIG5hbWUgb2YgYSBKYXZhIGNsYXNzIG9yIGludGVyZmFjZS4gIFRoZSBuYW1lIGlzIGluCi0gKiB0aGUgZm9ybSBvZiBhICJiaW5hcnkgbmFtZSIsIGFzIGRlZmluZWQgaW4gdGhlIEpMUy4gIFRoaXMgaXMgdGhlIGZvcm0gb2YgbmFtZSB1c2VkIGluCi0gKiBDbGFzcy5mb3JOYW1lKCkuICBUb29scyB0aGF0IG5lZWQgdGhlIGNhbm9uaWNhbCBuYW1lICh0aGUgbmFtZSB1c2VkIGluIHNvdXJjZSBjb2RlKSB3aWxsIG5lZWQgdG8KLSAqIGNvbnZlcnQgdGhpcyBiaW5hcnkgbmFtZSB0byB0aGUgY2Fub25pY2FsIG5hbWUuCi0gKiA8cC8+Ci0gKiA8cC8+Ci0gKiA8cC8+Ci0gKiA8cD5KYXZhIGNsYXNzIGZvciBmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIGNvbXBsZXggdHlwZS4KLSAqIDxwLz4KLSAqIDxwPlRoZSBmb2xsb3dpbmcgc2NoZW1hIGZyYWdtZW50IHNwZWNpZmllcyB0aGUgZXhwZWN0ZWQgY29udGVudCBjb250YWluZWQgd2l0aGluIHRoaXMgY2xhc3MuCi0gKiA8cC8+Ci0gKiA8cHJlPgotICogJmx0O2NvbXBsZXhUeXBlIG5hbWU9ImZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotICogICAmbHQ7c2ltcGxlQ29udGVudD4KLSAqICAgICAmbHQ7cmVzdHJpY3Rpb24gYmFzZT0iJmx0O2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZT5zdHJpbmciPgotICogICAgICZsdDsvcmVzdHJpY3Rpb24+Ci0gKiAgICZsdDsvc2ltcGxlQ29udGVudD4KLSAqICZsdDsvY29tcGxleFR5cGU+Ci0gKiA8L3ByZT4KLSAqLwotQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKQotQFhtbFR5cGUobmFtZSA9ICJmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIikKLXB1YmxpYyBjbGFzcyBGdWxseVF1YWxpZmllZENsYXNzVHlwZQotICAgICAgICBleHRlbmRzIFN0cmluZyB7Ci0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvR2VuZXJpY0Jvb2xlYW5UeXBlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9HZW5lcmljQm9vbGVhblR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU1ODQzYS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9HZW5lcmljQm9vbGVhblR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vCi0vLyBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSB0aGUgSmF2YVRNIEFyY2hpdGVjdHVyZSBmb3IgWE1MIEJpbmRpbmcoSkFYQikgUmVmZXJlbmNlIEltcGxlbWVudGF0aW9uLCB2Mi4wLWI1Mi1mY3MgCi0vLyBTZWUgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YiI+aHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YjwvYT4gCi0vLyBBbnkgbW9kaWZpY2F0aW9ucyB0byB0aGlzIGZpbGUgd2lsbCBiZSBsb3N0IHVwb24gcmVjb21waWxhdGlvbiBvZiB0aGUgc291cmNlIHNjaGVtYS4gCi0vLyBHZW5lcmF0ZWQgb246IDIwMDcuMDMuMjEgYXQgMTA6NTY6NTEgQU0gQ0RUIAotLy8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24ueG1sLmhhbmRsZXI7Ci0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlOwotCi0KLS8qKgotICogVGhpcyB0eXBlIGRlZmluZXMgZm91ciBkaWZmZXJlbnQgdmFsdWVzIHdoaWNoIGNhbiBkZXNpZ25hdGUgYm9vbGVhbiB2YWx1ZXMuIFRoaXMgaW5jbHVkZXMgdmFsdWVzCi0gKiB5ZXMgYW5kIG5vIHdoaWNoIGFyZSBub3QgZGVzaWduYXRlZCBieSB4c2Q6Ym9vbGVhbgotICogPHAvPgotICogPHAvPgotICogPHAvPgotICogPHA+SmF2YSBjbGFzcyBmb3IgZ2VuZXJpYy1ib29sZWFuVHlwZSBjb21wbGV4IHR5cGUuCi0gKiA8cC8+Ci0gKiA8cD5UaGUgZm9sbG93aW5nIHNjaGVtYSBmcmFnbWVudCBzcGVjaWZpZXMgdGhlIGV4cGVjdGVkIGNvbnRlbnQgY29udGFpbmVkIHdpdGhpbiB0aGlzIGNsYXNzLgotICogPHAvPgotICogPHByZT4KLSAqICZsdDtjb21wbGV4VHlwZSBuYW1lPSJnZW5lcmljLWJvb2xlYW5UeXBlIj4KLSAqICAgJmx0O3NpbXBsZUNvbnRlbnQ+Ci0gKiAgICAgJmx0O3Jlc3RyaWN0aW9uIGJhc2U9IiZsdDtodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWU+c3RyaW5nIj4KLSAqICAgICAmbHQ7L3Jlc3RyaWN0aW9uPgotICogICAmbHQ7L3NpbXBsZUNvbnRlbnQ+Ci0gKiAmbHQ7L2NvbXBsZXhUeXBlPgotICogPC9wcmU+Ci0gKi8KLUBYbWxBY2Nlc3NvclR5cGUoWG1sQWNjZXNzVHlwZS5GSUVMRCkKLUBYbWxUeXBlKG5hbWUgPSAiZ2VuZXJpYy1ib29sZWFuVHlwZSIpCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0Jvb2xlYW5UeXBlCi0gICAgICAgIGV4dGVuZHMgU3RyaW5nIHsKLQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9IYW5kbGVyQ2hhaW5UeXBlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9IYW5kbGVyQ2hhaW5UeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxZTJiMDMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvSGFuZGxlckNoYWluVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vCi0vLyBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSB0aGUgSmF2YVRNIEFyY2hpdGVjdHVyZSBmb3IgWE1MIEJpbmRpbmcoSkFYQikgUmVmZXJlbmNlIEltcGxlbWVudGF0aW9uLCB2Mi4wLWI1Mi1mY3MgCi0vLyBTZWUgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YiI+aHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YjwvYT4gCi0vLyBBbnkgbW9kaWZpY2F0aW9ucyB0byB0aGlzIGZpbGUgd2lsbCBiZSBsb3N0IHVwb24gcmVjb21waWxhdGlvbiBvZiB0aGUgc291cmNlIHNjaGVtYS4gCi0vLyBHZW5lcmF0ZWQgb246IDIwMDcuMDMuMjEgYXQgMTA6NTY6NTEgQU0gQ0RUIAotLy8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24ueG1sLmhhbmRsZXI7Ci0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBdHRyaWJ1dGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50OwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sSUQ7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxMaXN0OwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLmFkYXB0ZXJzLkNvbGxhcHNlZFN0cmluZ0FkYXB0ZXI7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5hZGFwdGVycy5YbWxKYXZhVHlwZUFkYXB0ZXI7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0KLS8qKgotICogVGhlIGhhbmRsZXItY2hhaW4gZWxlbWVudCBkZWZpbmVzIHRoZSBoYW5kbGVyY2hhaW4uIEhhbmRsZXJjaGFpbiBjYW4gYmUgZGVmaW5lZCBzdWNoIHRoYXQgdGhlCi0gKiBoYW5kbGVycyBpbiB0aGUgaGFuZGxlcmNoYWluIG9wZXJhdGUgYWxsIHBvcnRzIG9mIGEgc2VydmljZSwgb24gYSBzcGVjaWZpYyBwb3J0LCBvciBvbiBhIGxpc3Qgb2YKLSAqIHByb3RvY29sLWJpbmRpbmdzLiBUaGUgY2hvaWNlIG9mIGVsZW1lbnRzIHNlcnZpY2UtbmFtZS1wYXR0ZXJuLCBwb3J0LW5hbWUtcGF0dGVybiwgYW5kCi0gKiBwcm90b2NvbC1iaW5kaW5ncyBhcmUgdXNlZCB0byBzcGVjaWZ5IHdoZXRoZXIgdGhlIGhhbmRsZXJzIGluIHRoZSBoYW5kbGVyLWNoYWluIGFyZSBmb3IgYQotICogc2VydmljZSwgcG9ydCBvciBwcm90b2NvbCBiaW5kaW5nLiBJZiBub25lIG9mIHRoZXNlIGNob2ljZXMgYXJlIHNwZWNpZmllZCB3aXRoIHRoZSBoYW5kbGVyLWNoYWluCi0gKiBlbGVtZW50LCB0aGVuIHRoZSBoYW5kbGVycyBzcGVjaWZpZWQgaW4gdGhlIGhhbmRsZXItY2hhaW4gd2lsbCBiZSBhcHBsaWVkIG9uIGV2ZXJ5dGhpbmcuCi0gKiA8cC8+Ci0gKiA8cC8+Ci0gKiA8cC8+Ci0gKiA8cD5KYXZhIGNsYXNzIGZvciBoYW5kbGVyLWNoYWluVHlwZSBjb21wbGV4IHR5cGUuCi0gKiA8cC8+Ci0gKiA8cD5UaGUgZm9sbG93aW5nIHNjaGVtYSBmcmFnbWVudCBzcGVjaWZpZXMgdGhlIGV4cGVjdGVkIGNvbnRlbnQgY29udGFpbmVkIHdpdGhpbiB0aGlzIGNsYXNzLgotICogPHAvPgotICogPHByZT4KLSAqICZsdDtjb21wbGV4VHlwZSBuYW1lPSJoYW5kbGVyLWNoYWluVHlwZSI+Ci0gKiAgICZsdDtjb21wbGV4Q29udGVudD4KLSAqICAgICAmbHQ7cmVzdHJpY3Rpb24gYmFzZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfWFueVR5cGUiPgotICogICAgICAgJmx0O3NlcXVlbmNlPgotICogICAgICAgICAmbHQ7Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0gKiAgICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0ic2VydmljZS1uYW1lLXBhdHRlcm4iIHR5cGU9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1RTmFtZSIvPgotICogICAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9InBvcnQtbmFtZS1wYXR0ZXJuIiB0eXBlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9UU5hbWUiLz4KLSAqICAgICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJwcm90b2NvbC1iaW5kaW5ncyIgdHlwZT0ie2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZX1wcm90b2NvbC1iaW5kaW5nTGlzdFR5cGUiLz4KLSAqICAgICAgICAgJmx0Oy9jaG9pY2U+Ci0gKiAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9ImhhbmRsZXIiIHR5cGU9IntodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWV9aGFuZGxlclR5cGUiCi0gKiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICogICAgICAgJmx0Oy9zZXF1ZW5jZT4KLSAqICAgICAgICZsdDthdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1JRCIgLz4KLSAqICAgICAmbHQ7L3Jlc3RyaWN0aW9uPgotICogICAmbHQ7L2NvbXBsZXhDb250ZW50PgotICogJmx0Oy9jb21wbGV4VHlwZT4KLSAqIDwvcHJlPgotICovCi1AWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpCi1AWG1sVHlwZShuYW1lID0gImhhbmRsZXItY2hhaW5UeXBlIiwgcHJvcE9yZGVyID0gewotICAgICAgICAic2VydmljZU5hbWVQYXR0ZXJuIiwKLSAgICAgICAgInBvcnROYW1lUGF0dGVybiIsCi0gICAgICAgICJwcm90b2NvbEJpbmRpbmdzIiwKLSAgICAgICAgImhhbmRsZXIiCi0gICAgICAgIH0pCi1wdWJsaWMgY2xhc3MgSGFuZGxlckNoYWluVHlwZSB7Ci0KLSAgICBAWG1sRWxlbWVudChuYW1lID0gInNlcnZpY2UtbmFtZS1wYXR0ZXJuIiwgbmFtZXNwYWNlID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIpCi0gICAgcHJvdGVjdGVkIFFOYW1lIHNlcnZpY2VOYW1lUGF0dGVybjsKLSAgICBAWG1sRWxlbWVudChuYW1lID0gInBvcnQtbmFtZS1wYXR0ZXJuIiwgbmFtZXNwYWNlID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIpCi0gICAgcHJvdGVjdGVkIFFOYW1lIHBvcnROYW1lUGF0dGVybjsKLSAgICBAWG1sTGlzdAotICAgIEBYbWxFbGVtZW50KG5hbWUgPSAicHJvdG9jb2wtYmluZGluZ3MiLCBuYW1lc3BhY2UgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIikKLSAgICBwcm90ZWN0ZWQgTGlzdDxqYXZhLmxhbmcuU3RyaW5nPiBwcm90b2NvbEJpbmRpbmdzOwotICAgIEBYbWxFbGVtZW50KG5hbWVzcGFjZSA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiLCByZXF1aXJlZCA9IHRydWUpCi0gICAgcHJvdGVjdGVkIExpc3Q8SGFuZGxlclR5cGU+IGhhbmRsZXI7Ci0gICAgQFhtbEF0dHJpYnV0ZQotICAgIEBYbWxKYXZhVHlwZUFkYXB0ZXIoQ29sbGFwc2VkU3RyaW5nQWRhcHRlci5jbGFzcykKLSAgICBAWG1sSUQKLSAgICBwcm90ZWN0ZWQgamF2YS5sYW5nLlN0cmluZyBpZDsKLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBzZXJ2aWNlTmFtZVBhdHRlcm4gcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHBvc3NpYmxlIG9iamVjdCBpcyB7QGxpbmsgamF2YS5sYW5nLlN0cmluZyB9Ci0gICAgICovCi0gICAgcHVibGljIFFOYW1lIGdldFNlcnZpY2VOYW1lUGF0dGVybigpIHsKLSAgICAgICAgcmV0dXJuIHNlcnZpY2VOYW1lUGF0dGVybjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgc2VydmljZU5hbWVQYXR0ZXJuIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIGFsbG93ZWQgb2JqZWN0IGlzIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlTmFtZVBhdHRlcm4oUU5hbWUgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5zZXJ2aWNlTmFtZVBhdHRlcm4gPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgcG9ydE5hbWVQYXR0ZXJuIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiBwb3NzaWJsZSBvYmplY3QgaXMge0BsaW5rIGphdmEubGFuZy5TdHJpbmcgfQotICAgICAqLwotICAgIHB1YmxpYyBRTmFtZSBnZXRQb3J0TmFtZVBhdHRlcm4oKSB7Ci0gICAgICAgIHJldHVybiBwb3J0TmFtZVBhdHRlcm47Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHBvcnROYW1lUGF0dGVybiBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcyB7QGxpbmsgamF2YS5sYW5nLlN0cmluZyB9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UG9ydE5hbWVQYXR0ZXJuKFFOYW1lIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMucG9ydE5hbWVQYXR0ZXJuID0gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIHByb3RvY29sQmluZGluZ3MgcHJvcGVydHkuCi0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBUaGlzIGFjY2Vzc29yIG1ldGhvZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBsaXZlIGxpc3QsIG5vdCBhIHNuYXBzaG90LiBUaGVyZWZvcmUgYW55Ci0gICAgICogbW9kaWZpY2F0aW9uIHlvdSBtYWtlIHRvIHRoZSByZXR1cm5lZCBsaXN0IHdpbGwgYmUgcHJlc2VudCBpbnNpZGUgdGhlIEpBWEIgb2JqZWN0LiBUaGlzIGlzCi0gICAgICogd2h5IHRoZXJlIGlzIG5vdCBhIDxDT0RFPnNldDwvQ09ERT4gbWV0aG9kIGZvciB0aGUgcHJvdG9jb2xCaW5kaW5ncyBwcm9wZXJ0eS4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIEZvciBleGFtcGxlLCB0byBhZGQgYSBuZXcgaXRlbSwgZG8gYXMgZm9sbG93czoKLSAgICAgKiA8cHJlPgotICAgICAqICAgIGdldFByb3RvY29sQmluZGluZ3MoKS5hZGQobmV3SXRlbSk7Ci0gICAgICogPC9wcmU+Ci0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogT2JqZWN0cyBvZiB0aGUgZm9sbG93aW5nIHR5cGUocykgYXJlIGFsbG93ZWQgaW4gdGhlIGxpc3Qge0BsaW5rIGphdmEubGFuZy5TdHJpbmcgfQotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PGphdmEubGFuZy5TdHJpbmc+IGdldFByb3RvY29sQmluZGluZ3MoKSB7Ci0gICAgICAgIGlmIChwcm90b2NvbEJpbmRpbmdzID09IG51bGwpIHsKLSAgICAgICAgICAgIHByb3RvY29sQmluZGluZ3MgPSBuZXcgQXJyYXlMaXN0PGphdmEubGFuZy5TdHJpbmc+KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMucHJvdG9jb2xCaW5kaW5nczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgaGFuZGxlciBwcm9wZXJ0eS4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIFRoaXMgYWNjZXNzb3IgbWV0aG9kIHJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIGxpdmUgbGlzdCwgbm90IGEgc25hcHNob3QuIFRoZXJlZm9yZSBhbnkKLSAgICAgKiBtb2RpZmljYXRpb24geW91IG1ha2UgdG8gdGhlIHJldHVybmVkIGxpc3Qgd2lsbCBiZSBwcmVzZW50IGluc2lkZSB0aGUgSkFYQiBvYmplY3QuIFRoaXMgaXMKLSAgICAgKiB3aHkgdGhlcmUgaXMgbm90IGEgPENPREU+c2V0PC9DT0RFPiBtZXRob2QgZm9yIHRoZSBoYW5kbGVyIHByb3BlcnR5LgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogRm9yIGV4YW1wbGUsIHRvIGFkZCBhIG5ldyBpdGVtLCBkbyBhcyBmb2xsb3dzOgotICAgICAqIDxwcmU+Ci0gICAgICogICAgZ2V0SGFuZGxlcigpLmFkZChuZXdJdGVtKTsKLSAgICAgKiA8L3ByZT4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBPYmplY3RzIG9mIHRoZSBmb2xsb3dpbmcgdHlwZShzKSBhcmUgYWxsb3dlZCBpbiB0aGUgbGlzdCB7QGxpbmsgSGFuZGxlclR5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PEhhbmRsZXJUeXBlPiBnZXRIYW5kbGVyKCkgewotICAgICAgICBpZiAoaGFuZGxlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBoYW5kbGVyID0gbmV3IEFycmF5TGlzdDxIYW5kbGVyVHlwZT4oKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBpZCBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRJZCgpIHsKLSAgICAgICAgcmV0dXJuIGlkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBpZCBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcyB7QGxpbmsgamF2YS5sYW5nLlN0cmluZyB9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SWQoamF2YS5sYW5nLlN0cmluZyB2YWx1ZSkgewotICAgICAgICB0aGlzLmlkID0gdmFsdWU7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9IYW5kbGVyQ2hhaW5zVHlwZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvSGFuZGxlckNoYWluc1R5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzRkNDQwZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9IYW5kbGVyQ2hhaW5zVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vCi0vLyBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSB0aGUgSmF2YVRNIEFyY2hpdGVjdHVyZSBmb3IgWE1MIEJpbmRpbmcoSkFYQikgUmVmZXJlbmNlIEltcGxlbWVudGF0aW9uLCB2Mi4wLWI1Mi1mY3MgCi0vLyBTZWUgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YiI+aHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YjwvYT4gCi0vLyBBbnkgbW9kaWZpY2F0aW9ucyB0byB0aGlzIGZpbGUgd2lsbCBiZSBsb3N0IHVwb24gcmVjb21waWxhdGlvbiBvZiB0aGUgc291cmNlIHNjaGVtYS4gCi0vLyBHZW5lcmF0ZWQgb246IDIwMDcuMDMuMjEgYXQgMTA6NTY6NTEgQU0gQ0RUIAotLy8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24ueG1sLmhhbmRsZXI7Ci0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBdHRyaWJ1dGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50OwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sSUQ7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uYWRhcHRlcnMuQ29sbGFwc2VkU3RyaW5nQWRhcHRlcjsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLmFkYXB0ZXJzLlhtbEphdmFUeXBlQWRhcHRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0KLS8qKgotICogVGhlIGhhbmRsZXItY2hhaW5zIGVsZW1lbnQgZGVmaW5lcyB0aGUgaGFuZGxlcmNoYWlucyBhc3NvY2lhdGVkIHdpdGggdGhpcyBzZXJ2aWNlIG9yIHNlcnZpY2UKLSAqIGVuZHBvaW50LgotICogPHAvPgotICogPHAvPgotICogPHAvPgotICogPHA+SmF2YSBjbGFzcyBmb3IgaGFuZGxlci1jaGFpbnNUeXBlIGNvbXBsZXggdHlwZS4KLSAqIDxwLz4KLSAqIDxwPlRoZSBmb2xsb3dpbmcgc2NoZW1hIGZyYWdtZW50IHNwZWNpZmllcyB0aGUgZXhwZWN0ZWQgY29udGVudCBjb250YWluZWQgd2l0aGluIHRoaXMgY2xhc3MuCi0gKiA8cC8+Ci0gKiA8cHJlPgotICogJmx0O2NvbXBsZXhUeXBlIG5hbWU9ImhhbmRsZXItY2hhaW5zVHlwZSI+Ci0gKiAgICZsdDtjb21wbGV4Q29udGVudD4KLSAqICAgICAmbHQ7cmVzdHJpY3Rpb24gYmFzZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfWFueVR5cGUiPgotICogICAgICAgJmx0O3NlcXVlbmNlPgotICogICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJoYW5kbGVyLWNoYWluIiB0eXBlPSJ7aHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlfWhhbmRsZXItY2hhaW5UeXBlIgotICogbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAqICAgICAgICZsdDsvc2VxdWVuY2U+Ci0gKiAgICAgICAmbHQ7YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9SUQiIC8+Ci0gKiAgICAgJmx0Oy9yZXN0cmljdGlvbj4KLSAqICAgJmx0Oy9jb21wbGV4Q29udGVudD4KLSAqICZsdDsvY29tcGxleFR5cGU+Ci0gKiA8L3ByZT4KLSAqLwotQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKQotQFhtbFR5cGUobmFtZSA9ICJoYW5kbGVyLWNoYWluc1R5cGUiLCBwcm9wT3JkZXIgPSB7Ci0gICAgICAgICJoYW5kbGVyQ2hhaW4iCi0gICAgICAgIH0pCi1wdWJsaWMgY2xhc3MgSGFuZGxlckNoYWluc1R5cGUgewotCi0gICAgQFhtbEVsZW1lbnQobmFtZSA9ICJoYW5kbGVyLWNoYWluIiwgbmFtZXNwYWNlID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIsCi0gICAgICAgICAgICAgICAgcmVxdWlyZWQgPSB0cnVlKQotICAgIHByb3RlY3RlZCBMaXN0PEhhbmRsZXJDaGFpblR5cGU+IGhhbmRsZXJDaGFpbjsKLSAgICBAWG1sQXR0cmlidXRlCi0gICAgQFhtbEphdmFUeXBlQWRhcHRlcihDb2xsYXBzZWRTdHJpbmdBZGFwdGVyLmNsYXNzKQotICAgIEBYbWxJRAotICAgIHByb3RlY3RlZCBqYXZhLmxhbmcuU3RyaW5nIGlkOwotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGhhbmRsZXJDaGFpbiBwcm9wZXJ0eS4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIFRoaXMgYWNjZXNzb3IgbWV0aG9kIHJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIGxpdmUgbGlzdCwgbm90IGEgc25hcHNob3QuIFRoZXJlZm9yZSBhbnkKLSAgICAgKiBtb2RpZmljYXRpb24geW91IG1ha2UgdG8gdGhlIHJldHVybmVkIGxpc3Qgd2lsbCBiZSBwcmVzZW50IGluc2lkZSB0aGUgSkFYQiBvYmplY3QuIFRoaXMgaXMKLSAgICAgKiB3aHkgdGhlcmUgaXMgbm90IGEgPENPREU+c2V0PC9DT0RFPiBtZXRob2QgZm9yIHRoZSBoYW5kbGVyQ2hhaW4gcHJvcGVydHkuCi0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBGb3IgZXhhbXBsZSwgdG8gYWRkIGEgbmV3IGl0ZW0sIGRvIGFzIGZvbGxvd3M6Ci0gICAgICogPHByZT4KLSAgICAgKiAgICBnZXRIYW5kbGVyQ2hhaW4oKS5hZGQobmV3SXRlbSk7Ci0gICAgICogPC9wcmU+Ci0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogT2JqZWN0cyBvZiB0aGUgZm9sbG93aW5nIHR5cGUocykgYXJlIGFsbG93ZWQgaW4gdGhlIGxpc3Qge0BsaW5rIEhhbmRsZXJDaGFpblR5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PEhhbmRsZXJDaGFpblR5cGU+IGdldEhhbmRsZXJDaGFpbigpIHsKLSAgICAgICAgaWYgKGhhbmRsZXJDaGFpbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICBoYW5kbGVyQ2hhaW4gPSBuZXcgQXJyYXlMaXN0PEhhbmRsZXJDaGFpblR5cGU+KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlckNoYWluOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBpZCBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRJZCgpIHsKLSAgICAgICAgcmV0dXJuIGlkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBpZCBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcyB7QGxpbmsgamF2YS5sYW5nLlN0cmluZyB9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SWQoamF2YS5sYW5nLlN0cmluZyB2YWx1ZSkgewotICAgICAgICB0aGlzLmlkID0gdmFsdWU7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9IYW5kbGVyVHlwZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvSGFuZGxlclR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5MTZmYi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9IYW5kbGVyVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vCi0vLyBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSB0aGUgSmF2YVRNIEFyY2hpdGVjdHVyZSBmb3IgWE1MIEJpbmRpbmcoSkFYQikgUmVmZXJlbmNlIEltcGxlbWVudGF0aW9uLCB2Mi4wLWI1Mi1mY3MgCi0vLyBTZWUgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YiI+aHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YjwvYT4gCi0vLyBBbnkgbW9kaWZpY2F0aW9ucyB0byB0aGlzIGZpbGUgd2lsbCBiZSBsb3N0IHVwb24gcmVjb21waWxhdGlvbiBvZiB0aGUgc291cmNlIHNjaGVtYS4gCi0vLyBHZW5lcmF0ZWQgb246IDIwMDcuMDMuMjEgYXQgMTA6NTY6NTEgQU0gQ0RUIAotLy8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24ueG1sLmhhbmRsZXI7Ci0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBdHRyaWJ1dGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50OwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sSUQ7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uYWRhcHRlcnMuQ29sbGFwc2VkU3RyaW5nQWRhcHRlcjsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLmFkYXB0ZXJzLlhtbEphdmFUeXBlQWRhcHRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0KLS8qKgotICogRGVjbGFyZXMgdGhlIGhhbmRsZXIuIEhhbmRsZXJzIGNhbiBhY2Nlc3MgdGhlIGluaXQtcGFyYW0gbmFtZS92YWx1ZSBwYWlycyB1c2luZyB0aGUgSGFuZGxlckluZm8KLSAqIGludGVyZmFjZS4KLSAqIDxwLz4KLSAqIDxwLz4KLSAqIDxwPkphdmEgY2xhc3MgZm9yIGhhbmRsZXJUeXBlIGNvbXBsZXggdHlwZS4KLSAqIDxwLz4KLSAqIDxwPlRoZSBmb2xsb3dpbmcgc2NoZW1hIGZyYWdtZW50IHNwZWNpZmllcyB0aGUgZXhwZWN0ZWQgY29udGVudCBjb250YWluZWQgd2l0aGluIHRoaXMgY2xhc3MuCi0gKiA8cC8+Ci0gKiA8cHJlPgotICogJmx0O2NvbXBsZXhUeXBlIG5hbWU9ImhhbmRsZXJUeXBlIj4KLSAqICAgJmx0O2NvbXBsZXhDb250ZW50PgotICogICAgICZsdDtyZXN0cmljdGlvbiBiYXNlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9YW55VHlwZSI+Ci0gKiAgICAgICAmbHQ7c2VxdWVuY2U+Ci0gKiAgICAgICAgICZsdDtncm91cCByZWY9IntodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWV9ZGVzY3JpcHRpb25Hcm91cCIvPgotICogICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJoYW5kbGVyLW5hbWUiIHR5cGU9IntodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWV9c3RyaW5nIi8+Ci0gKiAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9ImhhbmRsZXItY2xhc3MiIHR5cGU9IntodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWV9ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIvPgotICogICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJpbml0LXBhcmFtIiB0eXBlPSJ7aHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlfXBhcmFtLXZhbHVlVHlwZSIKLSAqIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiLz4KLSAqICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0ic29hcC1yb2xlIiB0eXBlPSJ7aHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlfXN0cmluZyIKLSAqIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiLz4KLSAqICAgICAgICZsdDsvc2VxdWVuY2U+Ci0gKiAgICAgICAmbHQ7YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9SUQiIC8+Ci0gKiAgICAgJmx0Oy9yZXN0cmljdGlvbj4KLSAqICAgJmx0Oy9jb21wbGV4Q29udGVudD4KLSAqICZsdDsvY29tcGxleFR5cGU+Ci0gKiA8L3ByZT4KLSAqLwotQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKQotQFhtbFR5cGUobmFtZSA9ICJoYW5kbGVyVHlwZSIsIHByb3BPcmRlciA9IHsKLSAgICAgICAgImRlc2NyaXB0aW9uIiwKLSAgICAgICAgImRpc3BsYXlOYW1lIiwKLSAgICAgICAgImljb24iLAotICAgICAgICAiaGFuZGxlck5hbWUiLAotICAgICAgICAiaGFuZGxlckNsYXNzIiwKLSAgICAgICAgImluaXRQYXJhbSIsCi0gICAgICAgICJzb2FwUm9sZSIKLSAgICAgICAgfSkKLXB1YmxpYyBjbGFzcyBIYW5kbGVyVHlwZSB7Ci0KLSAgICBAWG1sRWxlbWVudChuYW1lc3BhY2UgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiwgcmVxdWlyZWQgPSB0cnVlKQotICAgIHByb3RlY3RlZCBMaXN0PERlc2NyaXB0aW9uVHlwZT4gZGVzY3JpcHRpb247Ci0gICAgQFhtbEVsZW1lbnQobmFtZSA9ICJkaXNwbGF5LW5hbWUiLCBuYW1lc3BhY2UgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiwKLSAgICAgICAgICAgICAgICByZXF1aXJlZCA9IHRydWUpCi0gICAgcHJvdGVjdGVkIExpc3Q8RGlzcGxheU5hbWVUeXBlPiBkaXNwbGF5TmFtZTsKLSAgICBAWG1sRWxlbWVudChuYW1lc3BhY2UgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiwgcmVxdWlyZWQgPSB0cnVlKQotICAgIHByb3RlY3RlZCBMaXN0PEljb25UeXBlPiBpY29uOwotICAgIEBYbWxFbGVtZW50KG5hbWUgPSAiaGFuZGxlci1uYW1lIiwgbmFtZXNwYWNlID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIsCi0gICAgICAgICAgICAgICAgcmVxdWlyZWQgPSB0cnVlKQotICAgIHByb3RlY3RlZCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLnhtbC5oYW5kbGVyLlN0cmluZyBoYW5kbGVyTmFtZTsKLSAgICBAWG1sRWxlbWVudChuYW1lID0gImhhbmRsZXItY2xhc3MiLCBuYW1lc3BhY2UgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiwKLSAgICAgICAgICAgICAgICByZXF1aXJlZCA9IHRydWUpCi0gICAgcHJvdGVjdGVkIEZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlIGhhbmRsZXJDbGFzczsKLSAgICBAWG1sRWxlbWVudChuYW1lID0gImluaXQtcGFyYW0iLCBuYW1lc3BhY2UgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiwKLSAgICAgICAgICAgICAgICByZXF1aXJlZCA9IHRydWUpCi0gICAgcHJvdGVjdGVkIExpc3Q8UGFyYW1WYWx1ZVR5cGU+IGluaXRQYXJhbTsKLSAgICBAWG1sRWxlbWVudChuYW1lID0gInNvYXAtcm9sZSIsIG5hbWVzcGFjZSA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiLAotICAgICAgICAgICAgICAgIHJlcXVpcmVkID0gdHJ1ZSkKLSAgICBwcm90ZWN0ZWQgTGlzdDxvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLnhtbC5oYW5kbGVyLlN0cmluZz4gc29hcFJvbGU7Ci0gICAgQFhtbEF0dHJpYnV0ZQotICAgIEBYbWxKYXZhVHlwZUFkYXB0ZXIoQ29sbGFwc2VkU3RyaW5nQWRhcHRlci5jbGFzcykKLSAgICBAWG1sSUQKLSAgICBwcm90ZWN0ZWQgamF2YS5sYW5nLlN0cmluZyBpZDsKLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBkZXNjcmlwdGlvbiBwcm9wZXJ0eS4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIFRoaXMgYWNjZXNzb3IgbWV0aG9kIHJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIGxpdmUgbGlzdCwgbm90IGEgc25hcHNob3QuIFRoZXJlZm9yZSBhbnkKLSAgICAgKiBtb2RpZmljYXRpb24geW91IG1ha2UgdG8gdGhlIHJldHVybmVkIGxpc3Qgd2lsbCBiZSBwcmVzZW50IGluc2lkZSB0aGUgSkFYQiBvYmplY3QuIFRoaXMgaXMKLSAgICAgKiB3aHkgdGhlcmUgaXMgbm90IGEgPENPREU+c2V0PC9DT0RFPiBtZXRob2QgZm9yIHRoZSBkZXNjcmlwdGlvbiBwcm9wZXJ0eS4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIEZvciBleGFtcGxlLCB0byBhZGQgYSBuZXcgaXRlbSwgZG8gYXMgZm9sbG93czoKLSAgICAgKiA8cHJlPgotICAgICAqICAgIGdldERlc2NyaXB0aW9uKCkuYWRkKG5ld0l0ZW0pOwotICAgICAqIDwvcHJlPgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIE9iamVjdHMgb2YgdGhlIGZvbGxvd2luZyB0eXBlKHMpIGFyZSBhbGxvd2VkIGluIHRoZSBsaXN0IHtAbGluayBEZXNjcmlwdGlvblR5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PERlc2NyaXB0aW9uVHlwZT4gZ2V0RGVzY3JpcHRpb24oKSB7Ci0gICAgICAgIGlmIChkZXNjcmlwdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICBkZXNjcmlwdGlvbiA9IG5ldyBBcnJheUxpc3Q8RGVzY3JpcHRpb25UeXBlPigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzLmRlc2NyaXB0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBkaXNwbGF5TmFtZSBwcm9wZXJ0eS4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIFRoaXMgYWNjZXNzb3IgbWV0aG9kIHJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIGxpdmUgbGlzdCwgbm90IGEgc25hcHNob3QuIFRoZXJlZm9yZSBhbnkKLSAgICAgKiBtb2RpZmljYXRpb24geW91IG1ha2UgdG8gdGhlIHJldHVybmVkIGxpc3Qgd2lsbCBiZSBwcmVzZW50IGluc2lkZSB0aGUgSkFYQiBvYmplY3QuIFRoaXMgaXMKLSAgICAgKiB3aHkgdGhlcmUgaXMgbm90IGEgPENPREU+c2V0PC9DT0RFPiBtZXRob2QgZm9yIHRoZSBkaXNwbGF5TmFtZSBwcm9wZXJ0eS4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIEZvciBleGFtcGxlLCB0byBhZGQgYSBuZXcgaXRlbSwgZG8gYXMgZm9sbG93czoKLSAgICAgKiA8cHJlPgotICAgICAqICAgIGdldERpc3BsYXlOYW1lKCkuYWRkKG5ld0l0ZW0pOwotICAgICAqIDwvcHJlPgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIE9iamVjdHMgb2YgdGhlIGZvbGxvd2luZyB0eXBlKHMpIGFyZSBhbGxvd2VkIGluIHRoZSBsaXN0IHtAbGluayBEaXNwbGF5TmFtZVR5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PERpc3BsYXlOYW1lVHlwZT4gZ2V0RGlzcGxheU5hbWUoKSB7Ci0gICAgICAgIGlmIChkaXNwbGF5TmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBkaXNwbGF5TmFtZSA9IG5ldyBBcnJheUxpc3Q8RGlzcGxheU5hbWVUeXBlPigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzLmRpc3BsYXlOYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBpY29uIHByb3BlcnR5LgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhpcyBhY2Nlc3NvciBtZXRob2QgcmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgbGl2ZSBsaXN0LCBub3QgYSBzbmFwc2hvdC4gVGhlcmVmb3JlIGFueQotICAgICAqIG1vZGlmaWNhdGlvbiB5b3UgbWFrZSB0byB0aGUgcmV0dXJuZWQgbGlzdCB3aWxsIGJlIHByZXNlbnQgaW5zaWRlIHRoZSBKQVhCIG9iamVjdC4gVGhpcyBpcwotICAgICAqIHdoeSB0aGVyZSBpcyBub3QgYSA8Q09ERT5zZXQ8L0NPREU+IG1ldGhvZCBmb3IgdGhlIGljb24gcHJvcGVydHkuCi0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBGb3IgZXhhbXBsZSwgdG8gYWRkIGEgbmV3IGl0ZW0sIGRvIGFzIGZvbGxvd3M6Ci0gICAgICogPHByZT4KLSAgICAgKiAgICBnZXRJY29uKCkuYWRkKG5ld0l0ZW0pOwotICAgICAqIDwvcHJlPgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIE9iamVjdHMgb2YgdGhlIGZvbGxvd2luZyB0eXBlKHMpIGFyZSBhbGxvd2VkIGluIHRoZSBsaXN0IHtAbGluayBJY29uVHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIExpc3Q8SWNvblR5cGU+IGdldEljb24oKSB7Ci0gICAgICAgIGlmIChpY29uID09IG51bGwpIHsKLSAgICAgICAgICAgIGljb24gPSBuZXcgQXJyYXlMaXN0PEljb25UeXBlPigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzLmljb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGhhbmRsZXJOYW1lIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiBwb3NzaWJsZSBvYmplY3QgaXMge0BsaW5rIFN0cmluZyB9Ci0gICAgICovCi0gICAgcHVibGljIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24ueG1sLmhhbmRsZXIuU3RyaW5nIGdldEhhbmRsZXJOYW1lKCkgewotICAgICAgICByZXR1cm4gaGFuZGxlck5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGhhbmRsZXJOYW1lIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIGFsbG93ZWQgb2JqZWN0IGlzIHtAbGluayBTdHJpbmcKLSAgICAgKiAgICAgICAgICAgICAgfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEhhbmRsZXJOYW1lKG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24ueG1sLmhhbmRsZXIuU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMuaGFuZGxlck5hbWUgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgaGFuZGxlckNsYXNzIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiBwb3NzaWJsZSBvYmplY3QgaXMge0BsaW5rIEZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgRnVsbHlRdWFsaWZpZWRDbGFzc1R5cGUgZ2V0SGFuZGxlckNsYXNzKCkgewotICAgICAgICByZXR1cm4gaGFuZGxlckNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBoYW5kbGVyQ2xhc3MgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgYWxsb3dlZCBvYmplY3QgaXMge0BsaW5rIEZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRIYW5kbGVyQ2xhc3MoRnVsbHlRdWFsaWZpZWRDbGFzc1R5cGUgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5oYW5kbGVyQ2xhc3MgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgaW5pdFBhcmFtIHByb3BlcnR5LgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhpcyBhY2Nlc3NvciBtZXRob2QgcmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgbGl2ZSBsaXN0LCBub3QgYSBzbmFwc2hvdC4gVGhlcmVmb3JlIGFueQotICAgICAqIG1vZGlmaWNhdGlvbiB5b3UgbWFrZSB0byB0aGUgcmV0dXJuZWQgbGlzdCB3aWxsIGJlIHByZXNlbnQgaW5zaWRlIHRoZSBKQVhCIG9iamVjdC4gVGhpcyBpcwotICAgICAqIHdoeSB0aGVyZSBpcyBub3QgYSA8Q09ERT5zZXQ8L0NPREU+IG1ldGhvZCBmb3IgdGhlIGluaXRQYXJhbSBwcm9wZXJ0eS4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIEZvciBleGFtcGxlLCB0byBhZGQgYSBuZXcgaXRlbSwgZG8gYXMgZm9sbG93czoKLSAgICAgKiA8cHJlPgotICAgICAqICAgIGdldEluaXRQYXJhbSgpLmFkZChuZXdJdGVtKTsKLSAgICAgKiA8L3ByZT4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBPYmplY3RzIG9mIHRoZSBmb2xsb3dpbmcgdHlwZShzKSBhcmUgYWxsb3dlZCBpbiB0aGUgbGlzdCB7QGxpbmsgUGFyYW1WYWx1ZVR5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PFBhcmFtVmFsdWVUeXBlPiBnZXRJbml0UGFyYW0oKSB7Ci0gICAgICAgIGlmIChpbml0UGFyYW0gPT0gbnVsbCkgewotICAgICAgICAgICAgaW5pdFBhcmFtID0gbmV3IEFycmF5TGlzdDxQYXJhbVZhbHVlVHlwZT4oKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpcy5pbml0UGFyYW07Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIHNvYXBSb2xlIHByb3BlcnR5LgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhpcyBhY2Nlc3NvciBtZXRob2QgcmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgbGl2ZSBsaXN0LCBub3QgYSBzbmFwc2hvdC4gVGhlcmVmb3JlIGFueQotICAgICAqIG1vZGlmaWNhdGlvbiB5b3UgbWFrZSB0byB0aGUgcmV0dXJuZWQgbGlzdCB3aWxsIGJlIHByZXNlbnQgaW5zaWRlIHRoZSBKQVhCIG9iamVjdC4gVGhpcyBpcwotICAgICAqIHdoeSB0aGVyZSBpcyBub3QgYSA8Q09ERT5zZXQ8L0NPREU+IG1ldGhvZCBmb3IgdGhlIHNvYXBSb2xlIHByb3BlcnR5LgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogRm9yIGV4YW1wbGUsIHRvIGFkZCBhIG5ldyBpdGVtLCBkbyBhcyBmb2xsb3dzOgotICAgICAqIDxwcmU+Ci0gICAgICogICAgZ2V0U29hcFJvbGUoKS5hZGQobmV3SXRlbSk7Ci0gICAgICogPC9wcmU+Ci0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogT2JqZWN0cyBvZiB0aGUgZm9sbG93aW5nIHR5cGUocykgYXJlIGFsbG93ZWQgaW4gdGhlIGxpc3Qge0BsaW5rCi0gICAgICogb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi54bWwuaGFuZGxlci5TdHJpbmcgfQotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24ueG1sLmhhbmRsZXIuU3RyaW5nPiBnZXRTb2FwUm9sZSgpIHsKLSAgICAgICAgaWYgKHNvYXBSb2xlID09IG51bGwpIHsKLSAgICAgICAgICAgIHNvYXBSb2xlID0gbmV3IEFycmF5TGlzdDxvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLnhtbC5oYW5kbGVyLlN0cmluZz4oKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpcy5zb2FwUm9sZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgaWQgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHBvc3NpYmxlIG9iamVjdCBpcyB7QGxpbmsgamF2YS5sYW5nLlN0cmluZyB9Ci0gICAgICovCi0gICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0SWQoKSB7Ci0gICAgICAgIHJldHVybiBpZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgaWQgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgYWxsb3dlZCBvYmplY3QgaXMge0BsaW5rIGphdmEubGFuZy5TdHJpbmcgfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldElkKGphdmEubGFuZy5TdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5pZCA9IHZhbHVlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvSG9tZVR5cGUuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL0hvbWVUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhYTVmNzAuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvSG9tZVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vCi0vLyBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSB0aGUgSmF2YVRNIEFyY2hpdGVjdHVyZSBmb3IgWE1MIEJpbmRpbmcoSkFYQikgUmVmZXJlbmNlIEltcGxlbWVudGF0aW9uLCB2Mi4wLWI1Mi1mY3MgCi0vLyBTZWUgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YiI+aHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YjwvYT4gCi0vLyBBbnkgbW9kaWZpY2F0aW9ucyB0byB0aGlzIGZpbGUgd2lsbCBiZSBsb3N0IHVwb24gcmVjb21waWxhdGlvbiBvZiB0aGUgc291cmNlIHNjaGVtYS4gCi0vLyBHZW5lcmF0ZWQgb246IDIwMDcuMDMuMjEgYXQgMTA6NTY6NTEgQU0gQ0RUIAotLy8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24ueG1sLmhhbmRsZXI7Ci0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlOwotCi0KLS8qKgotICogVGhlIGhvbWVUeXBlIGRlZmluZXMgdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIGFuIGVudGVycHJpc2UgYmVhbidzIGhvbWUgaW50ZXJmYWNlLgotICogPHAvPgotICogRXhhbXBsZToKLSAqIDxwLz4KLSAqIDxob21lPmNvbS5hYXJkdmFyay5wYXlyb2xsLlBheXJvbGxIb21lPC9ob21lPgotICogPHAvPgotICogPHAvPgotICogPHAvPgotICogPHAvPgotICogPHA+SmF2YSBjbGFzcyBmb3IgaG9tZVR5cGUgY29tcGxleCB0eXBlLgotICogPHAvPgotICogPHA+VGhlIGZvbGxvd2luZyBzY2hlbWEgZnJhZ21lbnQgc3BlY2lmaWVzIHRoZSBleHBlY3RlZCBjb250ZW50IGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBjbGFzcy4KLSAqIDxwLz4KLSAqIDxwcmU+Ci0gKiAmbHQ7Y29tcGxleFR5cGUgbmFtZT0iaG9tZVR5cGUiPgotICogICAmbHQ7c2ltcGxlQ29udGVudD4KLSAqICAgICAmbHQ7cmVzdHJpY3Rpb24gYmFzZT0iJmx0O2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZT5mdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLSAqICAgICAmbHQ7L3Jlc3RyaWN0aW9uPgotICogICAmbHQ7L3NpbXBsZUNvbnRlbnQ+Ci0gKiAmbHQ7L2NvbXBsZXhUeXBlPgotICogPC9wcmU+Ci0gKi8KLUBYbWxBY2Nlc3NvclR5cGUoWG1sQWNjZXNzVHlwZS5GSUVMRCkKLUBYbWxUeXBlKG5hbWUgPSAiaG9tZVR5cGUiKQotcHVibGljIGNsYXNzIEhvbWVUeXBlCi0gICAgICAgIGV4dGVuZHMgRnVsbHlRdWFsaWZpZWRDbGFzc1R5cGUgewotCi0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL0ljb25UeXBlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9JY29uVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGM4ZTY1Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL0ljb25UeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8KLS8vIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IHRoZSBKYXZhVE0gQXJjaGl0ZWN0dXJlIGZvciBYTUwgQmluZGluZyhKQVhCKSBSZWZlcmVuY2UgSW1wbGVtZW50YXRpb24sIHYyLjAtYjUyLWZjcyAKLS8vIFNlZSA8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9qYXhiIj5odHRwOi8vamF2YS5zdW4uY29tL3htbC9qYXhiPC9hPiAKLS8vIEFueSBtb2RpZmljYXRpb25zIHRvIHRoaXMgZmlsZSB3aWxsIGJlIGxvc3QgdXBvbiByZWNvbXBpbGF0aW9uIG9mIHRoZSBzb3VyY2Ugc2NoZW1hLiAKLS8vIEdlbmVyYXRlZCBvbjogMjAwNy4wMy4yMSBhdCAxMDo1Njo1MSBBTSBDRFQgCi0vLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi54bWwuaGFuZGxlcjsKLQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEF0dHJpYnV0ZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxJRDsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5hZGFwdGVycy5Db2xsYXBzZWRTdHJpbmdBZGFwdGVyOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uYWRhcHRlcnMuWG1sSmF2YVR5cGVBZGFwdGVyOwotCi0KLS8qKgotICogVGhlIGljb24gdHlwZSBjb250YWlucyBzbWFsbC1pY29uIGFuZCBsYXJnZS1pY29uIGVsZW1lbnRzIHRoYXQgc3BlY2lmeSB0aGUgZmlsZSBuYW1lcyBmb3Igc21hbGwKLSAqIGFuZCBsYXJnZSBHSUYsIEpQRUcsIG9yIFBORyBpY29uIGltYWdlcyB1c2VkIHRvIHJlcHJlc2VudCB0aGUgcGFyZW50IGVsZW1lbnQgaW4gYSBHVUkgdG9vbC4KLSAqIDxwLz4KLSAqIFRoZSB4bWw6bGFuZyBhdHRyaWJ1dGUgZGVmaW5lcyB0aGUgbGFuZ3VhZ2UgdGhhdCB0aGUgaWNvbiBmaWxlIG5hbWVzIGFyZSBwcm92aWRlZCBpbi4gSXRzIHZhbHVlCi0gKiBpcyAiZW4iIChFbmdsaXNoKSBieSBkZWZhdWx0LgotICogPHAvPgotICogPHAvPgotICogPHAvPgotICogPHA+SmF2YSBjbGFzcyBmb3IgaWNvblR5cGUgY29tcGxleCB0eXBlLgotICogPHAvPgotICogPHA+VGhlIGZvbGxvd2luZyBzY2hlbWEgZnJhZ21lbnQgc3BlY2lmaWVzIHRoZSBleHBlY3RlZCBjb250ZW50IGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBjbGFzcy4KLSAqIDxwLz4KLSAqIDxwcmU+Ci0gKiAmbHQ7Y29tcGxleFR5cGUgbmFtZT0iaWNvblR5cGUiPgotICogICAmbHQ7Y29tcGxleENvbnRlbnQ+Ci0gKiAgICAgJmx0O3Jlc3RyaWN0aW9uIGJhc2U9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1hbnlUeXBlIj4KLSAqICAgICAgICZsdDtzZXF1ZW5jZT4KLSAqICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0ic21hbGwtaWNvbiIgdHlwZT0ie2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZX1wYXRoVHlwZSIKLSAqIG1pbk9jY3Vycz0iMCIvPgotICogICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJsYXJnZS1pY29uIiB0eXBlPSJ7aHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlfXBhdGhUeXBlIgotICogbWluT2NjdXJzPSIwIi8+Ci0gKiAgICAgICAmbHQ7L3NlcXVlbmNlPgotICogICAgICAgJmx0O2F0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfUlEIiAvPgotICogICAgICAgJmx0O2F0dHJpYnV0ZSByZWY9IntodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2V9bGFuZyIvPgotICogICAgICZsdDsvcmVzdHJpY3Rpb24+Ci0gKiAgICZsdDsvY29tcGxleENvbnRlbnQ+Ci0gKiAmbHQ7L2NvbXBsZXhUeXBlPgotICogPC9wcmU+Ci0gKi8KLUBYbWxBY2Nlc3NvclR5cGUoWG1sQWNjZXNzVHlwZS5GSUVMRCkKLUBYbWxUeXBlKG5hbWUgPSAiaWNvblR5cGUiLCBwcm9wT3JkZXIgPSB7Ci0gICAgICAgICJzbWFsbEljb24iLAotICAgICAgICAibGFyZ2VJY29uIgotICAgICAgICB9KQotcHVibGljIGNsYXNzIEljb25UeXBlIHsKLQotICAgIEBYbWxFbGVtZW50KG5hbWUgPSAic21hbGwtaWNvbiIsIG5hbWVzcGFjZSA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiKQotICAgIHByb3RlY3RlZCBQYXRoVHlwZSBzbWFsbEljb247Ci0gICAgQFhtbEVsZW1lbnQobmFtZSA9ICJsYXJnZS1pY29uIiwgbmFtZXNwYWNlID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIpCi0gICAgcHJvdGVjdGVkIFBhdGhUeXBlIGxhcmdlSWNvbjsKLSAgICBAWG1sQXR0cmlidXRlCi0gICAgQFhtbEphdmFUeXBlQWRhcHRlcihDb2xsYXBzZWRTdHJpbmdBZGFwdGVyLmNsYXNzKQotICAgIEBYbWxJRAotICAgIHByb3RlY3RlZCBqYXZhLmxhbmcuU3RyaW5nIGlkOwotICAgIEBYbWxBdHRyaWJ1dGUobmFtZXNwYWNlID0gImh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIpCi0gICAgcHJvdGVjdGVkIGphdmEubGFuZy5TdHJpbmcgbGFuZzsKLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBzbWFsbEljb24gcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHBvc3NpYmxlIG9iamVjdCBpcyB7QGxpbmsgUGF0aFR5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyBQYXRoVHlwZSBnZXRTbWFsbEljb24oKSB7Ci0gICAgICAgIHJldHVybiBzbWFsbEljb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHNtYWxsSWNvbiBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcyB7QGxpbmsgUGF0aFR5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNtYWxsSWNvbihQYXRoVHlwZSB2YWx1ZSkgewotICAgICAgICB0aGlzLnNtYWxsSWNvbiA9IHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBsYXJnZUljb24gcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHBvc3NpYmxlIG9iamVjdCBpcyB7QGxpbmsgUGF0aFR5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyBQYXRoVHlwZSBnZXRMYXJnZUljb24oKSB7Ci0gICAgICAgIHJldHVybiBsYXJnZUljb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGxhcmdlSWNvbiBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcyB7QGxpbmsgUGF0aFR5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldExhcmdlSWNvbihQYXRoVHlwZSB2YWx1ZSkgewotICAgICAgICB0aGlzLmxhcmdlSWNvbiA9IHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBpZCBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRJZCgpIHsKLSAgICAgICAgcmV0dXJuIGlkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBpZCBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcyB7QGxpbmsgamF2YS5sYW5nLlN0cmluZyB9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SWQoamF2YS5sYW5nLlN0cmluZyB2YWx1ZSkgewotICAgICAgICB0aGlzLmlkID0gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGxhbmcgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHBvc3NpYmxlIG9iamVjdCBpcyB7QGxpbmsgamF2YS5sYW5nLlN0cmluZyB9Ci0gICAgICovCi0gICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0TGFuZygpIHsKLSAgICAgICAgcmV0dXJuIGxhbmc7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGxhbmcgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgYWxsb3dlZCBvYmplY3QgaXMge0BsaW5rIGphdmEubGFuZy5TdHJpbmcgfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldExhbmcoamF2YS5sYW5nLlN0cmluZyB2YWx1ZSkgewotICAgICAgICB0aGlzLmxhbmcgPSB2YWx1ZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL0luamVjdGlvblRhcmdldFR5cGUuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL0luamVjdGlvblRhcmdldFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDU0N2YwNi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9JbmplY3Rpb25UYXJnZXRUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8KLS8vIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IHRoZSBKYXZhVE0gQXJjaGl0ZWN0dXJlIGZvciBYTUwgQmluZGluZyhKQVhCKSBSZWZlcmVuY2UgSW1wbGVtZW50YXRpb24sIHYyLjAtYjUyLWZjcyAKLS8vIFNlZSA8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9qYXhiIj5odHRwOi8vamF2YS5zdW4uY29tL3htbC9qYXhiPC9hPiAKLS8vIEFueSBtb2RpZmljYXRpb25zIHRvIHRoaXMgZmlsZSB3aWxsIGJlIGxvc3QgdXBvbiByZWNvbXBpbGF0aW9uIG9mIHRoZSBzb3VyY2Ugc2NoZW1hLiAKLS8vIEdlbmVyYXRlZCBvbjogMjAwNy4wMy4yMSBhdCAxMDo1Njo1MSBBTSBDRFQgCi0vLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi54bWwuaGFuZGxlcjsKLQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlOwotCi0KLS8qKgotICogQW4gaW5qZWN0aW9uIHRhcmdldCBzcGVjaWZpZXMgYSBjbGFzcyBhbmQgYSBuYW1lIHdpdGhpbiB0aGF0IGNsYXNzIGludG8gd2hpY2ggYSByZXNvdXJjZSBzaG91bGQKLSAqIGJlIGluamVjdGVkLgotICogPHAvPgotICogVGhlIGluamVjdGlvbiB0YXJnZXQgY2xhc3Mgc3BlY2lmaWVzIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSB0aGF0IGlzIHRoZSB0YXJnZXQgb2YgdGhlCi0gKiBpbmplY3Rpb24uICBUaGUgSmF2YSBFRSBzcGVjaWZpY2F0aW9ucyBkZXNjcmliZSB3aGljaCBjbGFzc2VzIGNhbiBiZSBhbiBpbmplY3Rpb24gdGFyZ2V0LgotICogPHAvPgotICogVGhlIGluamVjdGlvbiB0YXJnZXQgbmFtZSBzcGVjaWZpZXMgdGhlIHRhcmdldCB3aXRoaW4gdGhlIHNwZWNpZmllZCBjbGFzcy4gIFRoZSB0YXJnZXQgaXMgZmlyc3QKLSAqIGxvb2tlZCBmb3IgYXMgYSBKYXZhQmVhbnMgcHJvcGVydHkgbmFtZS4gIElmIG5vdCBmb3VuZCwgdGhlIHRhcmdldCBpcyBsb29rZWQgZm9yIGFzIGEgZmllbGQKLSAqIG5hbWUuCi0gKiA8cC8+Ci0gKiBUaGUgc3BlY2lmaWVkIHJlc291cmNlIHdpbGwgYmUgaW5qZWN0ZWQgaW50byB0aGUgdGFyZ2V0IGR1cmluZyBpbml0aWFsaXphdGlvbiBvZiB0aGUgY2xhc3MgYnkKLSAqIGVpdGhlciBjYWxsaW5nIHRoZSBzZXQgbWV0aG9kIGZvciB0aGUgdGFyZ2V0IHByb3BlcnR5IG9yIGJ5IHNldHRpbmcgYSB2YWx1ZSBpbnRvIHRoZSBuYW1lZAotICogZmllbGQuCi0gKiA8cC8+Ci0gKiA8cC8+Ci0gKiA8cC8+Ci0gKiA8cD5KYXZhIGNsYXNzIGZvciBpbmplY3Rpb24tdGFyZ2V0VHlwZSBjb21wbGV4IHR5cGUuCi0gKiA8cC8+Ci0gKiA8cD5UaGUgZm9sbG93aW5nIHNjaGVtYSBmcmFnbWVudCBzcGVjaWZpZXMgdGhlIGV4cGVjdGVkIGNvbnRlbnQgY29udGFpbmVkIHdpdGhpbiB0aGlzIGNsYXNzLgotICogPHAvPgotICogPHByZT4KLSAqICZsdDtjb21wbGV4VHlwZSBuYW1lPSJpbmplY3Rpb24tdGFyZ2V0VHlwZSI+Ci0gKiAgICZsdDtjb21wbGV4Q29udGVudD4KLSAqICAgICAmbHQ7cmVzdHJpY3Rpb24gYmFzZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfWFueVR5cGUiPgotICogICAgICAgJmx0O3NlcXVlbmNlPgotICogICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJpbmplY3Rpb24tdGFyZ2V0LWNsYXNzIiB0eXBlPSJ7aHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlfWZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiLz4KLSAqICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0iaW5qZWN0aW9uLXRhcmdldC1uYW1lIiB0eXBlPSJ7aHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlfWphdmEtaWRlbnRpZmllclR5cGUiLz4KLSAqICAgICAgICZsdDsvc2VxdWVuY2U+Ci0gKiAgICAgJmx0Oy9yZXN0cmljdGlvbj4KLSAqICAgJmx0Oy9jb21wbGV4Q29udGVudD4KLSAqICZsdDsvY29tcGxleFR5cGU+Ci0gKiA8L3ByZT4KLSAqLwotQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKQotQFhtbFR5cGUobmFtZSA9ICJpbmplY3Rpb24tdGFyZ2V0VHlwZSIsIHByb3BPcmRlciA9IHsKLSAgICAgICAgImluamVjdGlvblRhcmdldENsYXNzIiwKLSAgICAgICAgImluamVjdGlvblRhcmdldE5hbWUiCi0gICAgICAgIH0pCi1wdWJsaWMgY2xhc3MgSW5qZWN0aW9uVGFyZ2V0VHlwZSB7Ci0KLSAgICBAWG1sRWxlbWVudChuYW1lID0gImluamVjdGlvbi10YXJnZXQtY2xhc3MiLCBuYW1lc3BhY2UgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiwKLSAgICAgICAgICAgICAgICByZXF1aXJlZCA9IHRydWUpCi0gICAgcHJvdGVjdGVkIEZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlIGluamVjdGlvblRhcmdldENsYXNzOwotICAgIEBYbWxFbGVtZW50KG5hbWUgPSAiaW5qZWN0aW9uLXRhcmdldC1uYW1lIiwgbmFtZXNwYWNlID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIsCi0gICAgICAgICAgICAgICAgcmVxdWlyZWQgPSB0cnVlKQotICAgIHByb3RlY3RlZCBKYXZhSWRlbnRpZmllclR5cGUgaW5qZWN0aW9uVGFyZ2V0TmFtZTsKLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBpbmplY3Rpb25UYXJnZXRDbGFzcyBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzIHtAbGluayBGdWxseVF1YWxpZmllZENsYXNzVHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIEZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlIGdldEluamVjdGlvblRhcmdldENsYXNzKCkgewotICAgICAgICByZXR1cm4gaW5qZWN0aW9uVGFyZ2V0Q2xhc3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGluamVjdGlvblRhcmdldENsYXNzIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIGFsbG93ZWQgb2JqZWN0IGlzIHtAbGluayBGdWxseVF1YWxpZmllZENsYXNzVHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SW5qZWN0aW9uVGFyZ2V0Q2xhc3MoRnVsbHlRdWFsaWZpZWRDbGFzc1R5cGUgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5pbmplY3Rpb25UYXJnZXRDbGFzcyA9IHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBpbmplY3Rpb25UYXJnZXROYW1lIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiBwb3NzaWJsZSBvYmplY3QgaXMge0BsaW5rIEphdmFJZGVudGlmaWVyVHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIEphdmFJZGVudGlmaWVyVHlwZSBnZXRJbmplY3Rpb25UYXJnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gaW5qZWN0aW9uVGFyZ2V0TmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgaW5qZWN0aW9uVGFyZ2V0TmFtZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcyB7QGxpbmsgSmF2YUlkZW50aWZpZXJUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJbmplY3Rpb25UYXJnZXROYW1lKEphdmFJZGVudGlmaWVyVHlwZSB2YWx1ZSkgewotICAgICAgICB0aGlzLmluamVjdGlvblRhcmdldE5hbWUgPSB2YWx1ZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL0phdmFJZGVudGlmaWVyVHlwZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvSmF2YUlkZW50aWZpZXJUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmNjRiNzUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvSmF2YUlkZW50aWZpZXJUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLwotLy8gVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIEphdmFUTSBBcmNoaXRlY3R1cmUgZm9yIFhNTCBCaW5kaW5nKEpBWEIpIFJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbiwgdjIuMC1iNTItZmNzIAotLy8gU2VlIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGIiPmh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGI8L2E+IAotLy8gQW55IG1vZGlmaWNhdGlvbnMgdG8gdGhpcyBmaWxlIHdpbGwgYmUgbG9zdCB1cG9uIHJlY29tcGlsYXRpb24gb2YgdGhlIHNvdXJjZSBzY2hlbWEuIAotLy8gR2VuZXJhdGVkIG9uOiAyMDA3LjAzLjIxIGF0IDEwOjU2OjUxIEFNIENEVCAKLS8vCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLnhtbC5oYW5kbGVyOwotCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZTsKLQotCi0vKioKLSAqIFRoZSBqYXZhLWlkZW50aWZpZXJUeXBlIGRlZmluZXMgYSBKYXZhIGlkZW50aWZpZXIuIFRoZSB1c2VycyBvZiB0aGlzIHR5cGUgc2hvdWxkIGZ1cnRoZXIgdmVyaWZ5Ci0gKiB0aGF0IHRoZSBjb250ZW50IGRvZXMgbm90IGNvbnRhaW4gSmF2YSByZXNlcnZlZCBrZXl3b3Jkcy4KLSAqIDxwLz4KLSAqIDxwLz4KLSAqIDxwLz4KLSAqIDxwPkphdmEgY2xhc3MgZm9yIGphdmEtaWRlbnRpZmllclR5cGUgY29tcGxleCB0eXBlLgotICogPHAvPgotICogPHA+VGhlIGZvbGxvd2luZyBzY2hlbWEgZnJhZ21lbnQgc3BlY2lmaWVzIHRoZSBleHBlY3RlZCBjb250ZW50IGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBjbGFzcy4KLSAqIDxwLz4KLSAqIDxwcmU+Ci0gKiAmbHQ7Y29tcGxleFR5cGUgbmFtZT0iamF2YS1pZGVudGlmaWVyVHlwZSI+Ci0gKiAgICZsdDtzaW1wbGVDb250ZW50PgotICogICAgICZsdDtyZXN0cmljdGlvbiBiYXNlPSImbHQ7aHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlPnN0cmluZyI+Ci0gKiAgICAgJmx0Oy9yZXN0cmljdGlvbj4KLSAqICAgJmx0Oy9zaW1wbGVDb250ZW50PgotICogJmx0Oy9jb21wbGV4VHlwZT4KLSAqIDwvcHJlPgotICovCi1AWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpCi1AWG1sVHlwZShuYW1lID0gImphdmEtaWRlbnRpZmllclR5cGUiKQotcHVibGljIGNsYXNzIEphdmFJZGVudGlmaWVyVHlwZQotICAgICAgICBleHRlbmRzIFN0cmluZyB7Ci0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvSmF2YVR5cGVUeXBlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9KYXZhVHlwZVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk5NDU0My4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9KYXZhVHlwZVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vCi0vLyBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSB0aGUgSmF2YVRNIEFyY2hpdGVjdHVyZSBmb3IgWE1MIEJpbmRpbmcoSkFYQikgUmVmZXJlbmNlIEltcGxlbWVudGF0aW9uLCB2Mi4wLWI1Mi1mY3MgCi0vLyBTZWUgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YiI+aHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YjwvYT4gCi0vLyBBbnkgbW9kaWZpY2F0aW9ucyB0byB0aGlzIGZpbGUgd2lsbCBiZSBsb3N0IHVwb24gcmVjb21waWxhdGlvbiBvZiB0aGUgc291cmNlIHNjaGVtYS4gCi0vLyBHZW5lcmF0ZWQgb246IDIwMDcuMDMuMjEgYXQgMTA6NTY6NTEgQU0gQ0RUIAotLy8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24ueG1sLmhhbmRsZXI7Ci0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlOwotCi0KLS8qKgotICogVGhpcyBpcyBhIGdlbmVyaWMgdHlwZSB0aGF0IGRlc2lnbmF0ZXMgYSBKYXZhIHByaW1pdGl2ZSB0eXBlIG9yIGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBKYXZhCi0gKiBpbnRlcmZhY2UvdHlwZSwgb3IgYW4gYXJyYXkgb2Ygc3VjaCB0eXBlcy4KLSAqIDxwLz4KLSAqIDxwLz4KLSAqIDxwLz4KLSAqIDxwPkphdmEgY2xhc3MgZm9yIGphdmEtdHlwZVR5cGUgY29tcGxleCB0eXBlLgotICogPHAvPgotICogPHA+VGhlIGZvbGxvd2luZyBzY2hlbWEgZnJhZ21lbnQgc3BlY2lmaWVzIHRoZSBleHBlY3RlZCBjb250ZW50IGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBjbGFzcy4KLSAqIDxwLz4KLSAqIDxwcmU+Ci0gKiAmbHQ7Y29tcGxleFR5cGUgbmFtZT0iamF2YS10eXBlVHlwZSI+Ci0gKiAgICZsdDtzaW1wbGVDb250ZW50PgotICogICAgICZsdDtyZXN0cmljdGlvbiBiYXNlPSImbHQ7aHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlPnN0cmluZyI+Ci0gKiAgICAgJmx0Oy9yZXN0cmljdGlvbj4KLSAqICAgJmx0Oy9zaW1wbGVDb250ZW50PgotICogJmx0Oy9jb21wbGV4VHlwZT4KLSAqIDwvcHJlPgotICovCi1AWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpCi1AWG1sVHlwZShuYW1lID0gImphdmEtdHlwZVR5cGUiKQotcHVibGljIGNsYXNzIEphdmFUeXBlVHlwZQotICAgICAgICBleHRlbmRzIFN0cmluZyB7Ci0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvSm5kaU5hbWVUeXBlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9KbmRpTmFtZVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY3MTE0Zi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9KbmRpTmFtZVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vCi0vLyBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSB0aGUgSmF2YVRNIEFyY2hpdGVjdHVyZSBmb3IgWE1MIEJpbmRpbmcoSkFYQikgUmVmZXJlbmNlIEltcGxlbWVudGF0aW9uLCB2Mi4wLWI1Mi1mY3MgCi0vLyBTZWUgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YiI+aHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YjwvYT4gCi0vLyBBbnkgbW9kaWZpY2F0aW9ucyB0byB0aGlzIGZpbGUgd2lsbCBiZSBsb3N0IHVwb24gcmVjb21waWxhdGlvbiBvZiB0aGUgc291cmNlIHNjaGVtYS4gCi0vLyBHZW5lcmF0ZWQgb246IDIwMDcuMDMuMjEgYXQgMTA6NTY6NTEgQU0gQ0RUIAotLy8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24ueG1sLmhhbmRsZXI7Ci0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlOwotCi0KLS8qKgotICogVGhlIGpuZGktbmFtZVR5cGUgdHlwZSBkZXNpZ25hdGVzIGEgSk5ESSBuYW1lIGluIHRoZSBEZXBsb3ltZW50IENvbXBvbmVudCdzIGVudmlyb25tZW50IGFuZCBpcwotICogcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYgY29udGV4dC4gIEEgSk5ESSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUgRGVwbG95bWVudAotICogQ29tcG9uZW50LgotICogPHAvPgotICogPHAvPgotICogPHAvPgotICogPHA+SmF2YSBjbGFzcyBmb3Igam5kaS1uYW1lVHlwZSBjb21wbGV4IHR5cGUuCi0gKiA8cC8+Ci0gKiA8cD5UaGUgZm9sbG93aW5nIHNjaGVtYSBmcmFnbWVudCBzcGVjaWZpZXMgdGhlIGV4cGVjdGVkIGNvbnRlbnQgY29udGFpbmVkIHdpdGhpbiB0aGlzIGNsYXNzLgotICogPHAvPgotICogPHByZT4KLSAqICZsdDtjb21wbGV4VHlwZSBuYW1lPSJqbmRpLW5hbWVUeXBlIj4KLSAqICAgJmx0O3NpbXBsZUNvbnRlbnQ+Ci0gKiAgICAgJmx0O3Jlc3RyaWN0aW9uIGJhc2U9IiZsdDtodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWU+c3RyaW5nIj4KLSAqICAgICAmbHQ7L3Jlc3RyaWN0aW9uPgotICogICAmbHQ7L3NpbXBsZUNvbnRlbnQ+Ci0gKiAmbHQ7L2NvbXBsZXhUeXBlPgotICogPC9wcmU+Ci0gKi8KLUBYbWxBY2Nlc3NvclR5cGUoWG1sQWNjZXNzVHlwZS5GSUVMRCkKLUBYbWxUeXBlKG5hbWUgPSAiam5kaS1uYW1lVHlwZSIpCi1wdWJsaWMgY2xhc3MgSm5kaU5hbWVUeXBlCi0gICAgICAgIGV4dGVuZHMgU3RyaW5nIHsKLQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9MaWZlY3ljbGVDYWxsYmFja1R5cGUuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL0xpZmVjeWNsZUNhbGxiYWNrVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzUxMzU0Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL0xpZmVjeWNsZUNhbGxiYWNrVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vCi0vLyBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSB0aGUgSmF2YVRNIEFyY2hpdGVjdHVyZSBmb3IgWE1MIEJpbmRpbmcoSkFYQikgUmVmZXJlbmNlIEltcGxlbWVudGF0aW9uLCB2Mi4wLWI1Mi1mY3MgCi0vLyBTZWUgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YiI+aHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YjwvYT4gCi0vLyBBbnkgbW9kaWZpY2F0aW9ucyB0byB0aGlzIGZpbGUgd2lsbCBiZSBsb3N0IHVwb24gcmVjb21waWxhdGlvbiBvZiB0aGUgc291cmNlIHNjaGVtYS4gCi0vLyBHZW5lcmF0ZWQgb246IDIwMDcuMDMuMjEgYXQgMTA6NTY6NTEgQU0gQ0RUIAotLy8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24ueG1sLmhhbmRsZXI7Ci0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50OwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZTsKLQotCi0vKioKLSAqIFRoZSBsaWZlY3ljbGUtY2FsbGJhY2sgdHlwZSBzcGVjaWZpZXMgYSBtZXRob2Qgb24gYSBjbGFzcyB0byBiZSBjYWxsZWQgd2hlbiBhIGxpZmVjeWNsZSBldmVudAotICogb2NjdXJzLiBOb3RlIHRoYXQgZWFjaCBjbGFzcyBtYXkgaGF2ZSBvbmx5IG9uZSBsaWZlY3ljbGUgY2FsbGJhY2sgbWV0aG9kIGZvciBhbnkgZ2l2ZW4gZXZlbnQgYW5kCi0gKiB0aGF0IHRoZSBtZXRob2QgbWF5IG5vdCBiZSBvdmVybG9hZGVkLgotICogPHAvPgotICogSWYgdGhlIGxpZmVmeWNsZS1jYWxsYmFjay1jbGFzcyBlbGVtZW50IGlzIG1pc3NpbmcgdGhlbiB0aGUgY2xhc3MgZGVmaW5pbmcgdGhlIGNhbGxiYWNrIGlzCi0gKiBhc3N1bWVkIHRvIGJlIHRoZSBjb21wb25lbnQgY2xhc3MgaW4gc2NvcGUgYXQgdGhlIHBsYWNlIGluIHRoZSBkZXNjcmlwdG9yIGluIHdoaWNoIHRoZSBjYWxsYmFjawotICogZGVmaW5pdGlvbiBhcHBlYXJzLgotICogPHAvPgotICogPHAvPgotICogPHAvPgotICogPHA+SmF2YSBjbGFzcyBmb3IgbGlmZWN5Y2xlLWNhbGxiYWNrVHlwZSBjb21wbGV4IHR5cGUuCi0gKiA8cC8+Ci0gKiA8cD5UaGUgZm9sbG93aW5nIHNjaGVtYSBmcmFnbWVudCBzcGVjaWZpZXMgdGhlIGV4cGVjdGVkIGNvbnRlbnQgY29udGFpbmVkIHdpdGhpbiB0aGlzIGNsYXNzLgotICogPHAvPgotICogPHByZT4KLSAqICZsdDtjb21wbGV4VHlwZSBuYW1lPSJsaWZlY3ljbGUtY2FsbGJhY2tUeXBlIj4KLSAqICAgJmx0O2NvbXBsZXhDb250ZW50PgotICogICAgICZsdDtyZXN0cmljdGlvbiBiYXNlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9YW55VHlwZSI+Ci0gKiAgICAgICAmbHQ7c2VxdWVuY2U+Ci0gKiAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9ImxpZmVjeWNsZS1jYWxsYmFjay1jbGFzcyIgdHlwZT0ie2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZX1mdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIgotICogbWluT2NjdXJzPSIwIi8+Ci0gKiAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9ImxpZmVjeWNsZS1jYWxsYmFjay1tZXRob2QiIHR5cGU9IntodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWV9amF2YS1pZGVudGlmaWVyVHlwZSIvPgotICogICAgICAgJmx0Oy9zZXF1ZW5jZT4KLSAqICAgICAmbHQ7L3Jlc3RyaWN0aW9uPgotICogICAmbHQ7L2NvbXBsZXhDb250ZW50PgotICogJmx0Oy9jb21wbGV4VHlwZT4KLSAqIDwvcHJlPgotICovCi1AWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpCi1AWG1sVHlwZShuYW1lID0gImxpZmVjeWNsZS1jYWxsYmFja1R5cGUiLCBwcm9wT3JkZXIgPSB7Ci0gICAgICAgICJsaWZlY3ljbGVDYWxsYmFja0NsYXNzIiwKLSAgICAgICAgImxpZmVjeWNsZUNhbGxiYWNrTWV0aG9kIgotICAgICAgICB9KQotcHVibGljIGNsYXNzIExpZmVjeWNsZUNhbGxiYWNrVHlwZSB7Ci0KLSAgICBAWG1sRWxlbWVudChuYW1lID0gImxpZmVjeWNsZS1jYWxsYmFjay1jbGFzcyIsIG5hbWVzcGFjZSA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiKQotICAgIHByb3RlY3RlZCBGdWxseVF1YWxpZmllZENsYXNzVHlwZSBsaWZlY3ljbGVDYWxsYmFja0NsYXNzOwotICAgIEBYbWxFbGVtZW50KG5hbWUgPSAibGlmZWN5Y2xlLWNhbGxiYWNrLW1ldGhvZCIsIG5hbWVzcGFjZSA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiLAotICAgICAgICAgICAgICAgIHJlcXVpcmVkID0gdHJ1ZSkKLSAgICBwcm90ZWN0ZWQgSmF2YUlkZW50aWZpZXJUeXBlIGxpZmVjeWNsZUNhbGxiYWNrTWV0aG9kOwotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGxpZmVjeWNsZUNhbGxiYWNrQ2xhc3MgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHBvc3NpYmxlIG9iamVjdCBpcyB7QGxpbmsgRnVsbHlRdWFsaWZpZWRDbGFzc1R5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyBGdWxseVF1YWxpZmllZENsYXNzVHlwZSBnZXRMaWZlY3ljbGVDYWxsYmFja0NsYXNzKCkgewotICAgICAgICByZXR1cm4gbGlmZWN5Y2xlQ2FsbGJhY2tDbGFzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgbGlmZWN5Y2xlQ2FsbGJhY2tDbGFzcyBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcyB7QGxpbmsgRnVsbHlRdWFsaWZpZWRDbGFzc1R5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldExpZmVjeWNsZUNhbGxiYWNrQ2xhc3MoRnVsbHlRdWFsaWZpZWRDbGFzc1R5cGUgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5saWZlY3ljbGVDYWxsYmFja0NsYXNzID0gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGxpZmVjeWNsZUNhbGxiYWNrTWV0aG9kIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiBwb3NzaWJsZSBvYmplY3QgaXMge0BsaW5rIEphdmFJZGVudGlmaWVyVHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIEphdmFJZGVudGlmaWVyVHlwZSBnZXRMaWZlY3ljbGVDYWxsYmFja01ldGhvZCgpIHsKLSAgICAgICAgcmV0dXJuIGxpZmVjeWNsZUNhbGxiYWNrTWV0aG9kOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBsaWZlY3ljbGVDYWxsYmFja01ldGhvZCBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcyB7QGxpbmsgSmF2YUlkZW50aWZpZXJUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRMaWZlY3ljbGVDYWxsYmFja01ldGhvZChKYXZhSWRlbnRpZmllclR5cGUgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5saWZlY3ljbGVDYWxsYmFja01ldGhvZCA9IHZhbHVlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvTGlzdGVuZXJUeXBlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9MaXN0ZW5lclR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhmNDE3Ny4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9MaXN0ZW5lclR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLwotLy8gVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIEphdmFUTSBBcmNoaXRlY3R1cmUgZm9yIFhNTCBCaW5kaW5nKEpBWEIpIFJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbiwgdjIuMC1iNTItZmNzIAotLy8gU2VlIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGIiPmh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGI8L2E+IAotLy8gQW55IG1vZGlmaWNhdGlvbnMgdG8gdGhpcyBmaWxlIHdpbGwgYmUgbG9zdCB1cG9uIHJlY29tcGlsYXRpb24gb2YgdGhlIHNvdXJjZSBzY2hlbWEuIAotLy8gR2VuZXJhdGVkIG9uOiAyMDA3LjAzLjIxIGF0IDEwOjU2OjUxIEFNIENEVCAKLS8vCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLnhtbC5oYW5kbGVyOwotCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQXR0cmlidXRlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbElEOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLmFkYXB0ZXJzLkNvbGxhcHNlZFN0cmluZ0FkYXB0ZXI7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5hZGFwdGVycy5YbWxKYXZhVHlwZUFkYXB0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotCi0vKioKLSAqIFRoZSBsaXN0ZW5lclR5cGUgaW5kaWNhdGVzIHRoZSBkZXBsb3ltZW50IHByb3BlcnRpZXMgZm9yIGEgd2ViIGFwcGxpY2F0aW9uIGxpc3RlbmVyIGJlYW4uCi0gKiA8cC8+Ci0gKiA8cC8+Ci0gKiA8cC8+Ci0gKiA8cD5KYXZhIGNsYXNzIGZvciBsaXN0ZW5lclR5cGUgY29tcGxleCB0eXBlLgotICogPHAvPgotICogPHA+VGhlIGZvbGxvd2luZyBzY2hlbWEgZnJhZ21lbnQgc3BlY2lmaWVzIHRoZSBleHBlY3RlZCBjb250ZW50IGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBjbGFzcy4KLSAqIDxwLz4KLSAqIDxwcmU+Ci0gKiAmbHQ7Y29tcGxleFR5cGUgbmFtZT0ibGlzdGVuZXJUeXBlIj4KLSAqICAgJmx0O2NvbXBsZXhDb250ZW50PgotICogICAgICZsdDtyZXN0cmljdGlvbiBiYXNlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9YW55VHlwZSI+Ci0gKiAgICAgICAmbHQ7c2VxdWVuY2U+Ci0gKiAgICAgICAgICZsdDtncm91cCByZWY9IntodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWV9ZGVzY3JpcHRpb25Hcm91cCIvPgotICogICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJsaXN0ZW5lci1jbGFzcyIgdHlwZT0ie2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZX1mdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIi8+Ci0gKiAgICAgICAmbHQ7L3NlcXVlbmNlPgotICogICAgICAgJmx0O2F0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfUlEIiAvPgotICogICAgICZsdDsvcmVzdHJpY3Rpb24+Ci0gKiAgICZsdDsvY29tcGxleENvbnRlbnQ+Ci0gKiAmbHQ7L2NvbXBsZXhUeXBlPgotICogPC9wcmU+Ci0gKi8KLUBYbWxBY2Nlc3NvclR5cGUoWG1sQWNjZXNzVHlwZS5GSUVMRCkKLUBYbWxUeXBlKG5hbWUgPSAibGlzdGVuZXJUeXBlIiwgcHJvcE9yZGVyID0gewotICAgICAgICAiZGVzY3JpcHRpb24iLAotICAgICAgICAiZGlzcGxheU5hbWUiLAotICAgICAgICAiaWNvbiIsCi0gICAgICAgICJsaXN0ZW5lckNsYXNzIgotICAgICAgICB9KQotcHVibGljIGNsYXNzIExpc3RlbmVyVHlwZSB7Ci0KLSAgICBAWG1sRWxlbWVudChuYW1lc3BhY2UgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiwgcmVxdWlyZWQgPSB0cnVlKQotICAgIHByb3RlY3RlZCBMaXN0PERlc2NyaXB0aW9uVHlwZT4gZGVzY3JpcHRpb247Ci0gICAgQFhtbEVsZW1lbnQobmFtZSA9ICJkaXNwbGF5LW5hbWUiLCBuYW1lc3BhY2UgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiwKLSAgICAgICAgICAgICAgICByZXF1aXJlZCA9IHRydWUpCi0gICAgcHJvdGVjdGVkIExpc3Q8RGlzcGxheU5hbWVUeXBlPiBkaXNwbGF5TmFtZTsKLSAgICBAWG1sRWxlbWVudChuYW1lc3BhY2UgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiwgcmVxdWlyZWQgPSB0cnVlKQotICAgIHByb3RlY3RlZCBMaXN0PEljb25UeXBlPiBpY29uOwotICAgIEBYbWxFbGVtZW50KG5hbWUgPSAibGlzdGVuZXItY2xhc3MiLCBuYW1lc3BhY2UgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiwKLSAgICAgICAgICAgICAgICByZXF1aXJlZCA9IHRydWUpCi0gICAgcHJvdGVjdGVkIEZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlIGxpc3RlbmVyQ2xhc3M7Ci0gICAgQFhtbEF0dHJpYnV0ZQotICAgIEBYbWxKYXZhVHlwZUFkYXB0ZXIoQ29sbGFwc2VkU3RyaW5nQWRhcHRlci5jbGFzcykKLSAgICBAWG1sSUQKLSAgICBwcm90ZWN0ZWQgamF2YS5sYW5nLlN0cmluZyBpZDsKLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBkZXNjcmlwdGlvbiBwcm9wZXJ0eS4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIFRoaXMgYWNjZXNzb3IgbWV0aG9kIHJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIGxpdmUgbGlzdCwgbm90IGEgc25hcHNob3QuIFRoZXJlZm9yZSBhbnkKLSAgICAgKiBtb2RpZmljYXRpb24geW91IG1ha2UgdG8gdGhlIHJldHVybmVkIGxpc3Qgd2lsbCBiZSBwcmVzZW50IGluc2lkZSB0aGUgSkFYQiBvYmplY3QuIFRoaXMgaXMKLSAgICAgKiB3aHkgdGhlcmUgaXMgbm90IGEgPENPREU+c2V0PC9DT0RFPiBtZXRob2QgZm9yIHRoZSBkZXNjcmlwdGlvbiBwcm9wZXJ0eS4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIEZvciBleGFtcGxlLCB0byBhZGQgYSBuZXcgaXRlbSwgZG8gYXMgZm9sbG93czoKLSAgICAgKiA8cHJlPgotICAgICAqICAgIGdldERlc2NyaXB0aW9uKCkuYWRkKG5ld0l0ZW0pOwotICAgICAqIDwvcHJlPgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIE9iamVjdHMgb2YgdGhlIGZvbGxvd2luZyB0eXBlKHMpIGFyZSBhbGxvd2VkIGluIHRoZSBsaXN0IHtAbGluayBEZXNjcmlwdGlvblR5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PERlc2NyaXB0aW9uVHlwZT4gZ2V0RGVzY3JpcHRpb24oKSB7Ci0gICAgICAgIGlmIChkZXNjcmlwdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICBkZXNjcmlwdGlvbiA9IG5ldyBBcnJheUxpc3Q8RGVzY3JpcHRpb25UeXBlPigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzLmRlc2NyaXB0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBkaXNwbGF5TmFtZSBwcm9wZXJ0eS4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIFRoaXMgYWNjZXNzb3IgbWV0aG9kIHJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIGxpdmUgbGlzdCwgbm90IGEgc25hcHNob3QuIFRoZXJlZm9yZSBhbnkKLSAgICAgKiBtb2RpZmljYXRpb24geW91IG1ha2UgdG8gdGhlIHJldHVybmVkIGxpc3Qgd2lsbCBiZSBwcmVzZW50IGluc2lkZSB0aGUgSkFYQiBvYmplY3QuIFRoaXMgaXMKLSAgICAgKiB3aHkgdGhlcmUgaXMgbm90IGEgPENPREU+c2V0PC9DT0RFPiBtZXRob2QgZm9yIHRoZSBkaXNwbGF5TmFtZSBwcm9wZXJ0eS4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIEZvciBleGFtcGxlLCB0byBhZGQgYSBuZXcgaXRlbSwgZG8gYXMgZm9sbG93czoKLSAgICAgKiA8cHJlPgotICAgICAqICAgIGdldERpc3BsYXlOYW1lKCkuYWRkKG5ld0l0ZW0pOwotICAgICAqIDwvcHJlPgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIE9iamVjdHMgb2YgdGhlIGZvbGxvd2luZyB0eXBlKHMpIGFyZSBhbGxvd2VkIGluIHRoZSBsaXN0IHtAbGluayBEaXNwbGF5TmFtZVR5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PERpc3BsYXlOYW1lVHlwZT4gZ2V0RGlzcGxheU5hbWUoKSB7Ci0gICAgICAgIGlmIChkaXNwbGF5TmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBkaXNwbGF5TmFtZSA9IG5ldyBBcnJheUxpc3Q8RGlzcGxheU5hbWVUeXBlPigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzLmRpc3BsYXlOYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBpY29uIHByb3BlcnR5LgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhpcyBhY2Nlc3NvciBtZXRob2QgcmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgbGl2ZSBsaXN0LCBub3QgYSBzbmFwc2hvdC4gVGhlcmVmb3JlIGFueQotICAgICAqIG1vZGlmaWNhdGlvbiB5b3UgbWFrZSB0byB0aGUgcmV0dXJuZWQgbGlzdCB3aWxsIGJlIHByZXNlbnQgaW5zaWRlIHRoZSBKQVhCIG9iamVjdC4gVGhpcyBpcwotICAgICAqIHdoeSB0aGVyZSBpcyBub3QgYSA8Q09ERT5zZXQ8L0NPREU+IG1ldGhvZCBmb3IgdGhlIGljb24gcHJvcGVydHkuCi0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBGb3IgZXhhbXBsZSwgdG8gYWRkIGEgbmV3IGl0ZW0sIGRvIGFzIGZvbGxvd3M6Ci0gICAgICogPHByZT4KLSAgICAgKiAgICBnZXRJY29uKCkuYWRkKG5ld0l0ZW0pOwotICAgICAqIDwvcHJlPgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIE9iamVjdHMgb2YgdGhlIGZvbGxvd2luZyB0eXBlKHMpIGFyZSBhbGxvd2VkIGluIHRoZSBsaXN0IHtAbGluayBJY29uVHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIExpc3Q8SWNvblR5cGU+IGdldEljb24oKSB7Ci0gICAgICAgIGlmIChpY29uID09IG51bGwpIHsKLSAgICAgICAgICAgIGljb24gPSBuZXcgQXJyYXlMaXN0PEljb25UeXBlPigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzLmljb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGxpc3RlbmVyQ2xhc3MgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHBvc3NpYmxlIG9iamVjdCBpcyB7QGxpbmsgRnVsbHlRdWFsaWZpZWRDbGFzc1R5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyBGdWxseVF1YWxpZmllZENsYXNzVHlwZSBnZXRMaXN0ZW5lckNsYXNzKCkgewotICAgICAgICByZXR1cm4gbGlzdGVuZXJDbGFzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgbGlzdGVuZXJDbGFzcyBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcyB7QGxpbmsgRnVsbHlRdWFsaWZpZWRDbGFzc1R5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldExpc3RlbmVyQ2xhc3MoRnVsbHlRdWFsaWZpZWRDbGFzc1R5cGUgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5saXN0ZW5lckNsYXNzID0gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGlkIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiBwb3NzaWJsZSBvYmplY3QgaXMge0BsaW5rIGphdmEubGFuZy5TdHJpbmcgfQotICAgICAqLwotICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldElkKCkgewotICAgICAgICByZXR1cm4gaWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGlkIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIGFsbG93ZWQgb2JqZWN0IGlzIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJZChqYXZhLmxhbmcuU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMuaWQgPSB2YWx1ZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL0xvY2FsSG9tZVR5cGUuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL0xvY2FsSG9tZVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjY2YTI2ZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9Mb2NhbEhvbWVUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLwotLy8gVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIEphdmFUTSBBcmNoaXRlY3R1cmUgZm9yIFhNTCBCaW5kaW5nKEpBWEIpIFJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbiwgdjIuMC1iNTItZmNzIAotLy8gU2VlIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGIiPmh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGI8L2E+IAotLy8gQW55IG1vZGlmaWNhdGlvbnMgdG8gdGhpcyBmaWxlIHdpbGwgYmUgbG9zdCB1cG9uIHJlY29tcGlsYXRpb24gb2YgdGhlIHNvdXJjZSBzY2hlbWEuIAotLy8gR2VuZXJhdGVkIG9uOiAyMDA3LjAzLjIxIGF0IDEwOjU2OjUxIEFNIENEVCAKLS8vCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLnhtbC5oYW5kbGVyOwotCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZTsKLQotCi0vKioKLSAqIFRoZSBsb2NhbC1ob21lVHlwZSBkZWZpbmVzIHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiBhbiBlbnRlcnByaXNlIGJlYW4ncyBsb2NhbCBob21lCi0gKiBpbnRlcmZhY2UuCi0gKiA8cC8+Ci0gKiA8cC8+Ci0gKiA8cC8+Ci0gKiA8cD5KYXZhIGNsYXNzIGZvciBsb2NhbC1ob21lVHlwZSBjb21wbGV4IHR5cGUuCi0gKiA8cC8+Ci0gKiA8cD5UaGUgZm9sbG93aW5nIHNjaGVtYSBmcmFnbWVudCBzcGVjaWZpZXMgdGhlIGV4cGVjdGVkIGNvbnRlbnQgY29udGFpbmVkIHdpdGhpbiB0aGlzIGNsYXNzLgotICogPHAvPgotICogPHByZT4KLSAqICZsdDtjb21wbGV4VHlwZSBuYW1lPSJsb2NhbC1ob21lVHlwZSI+Ci0gKiAgICZsdDtzaW1wbGVDb250ZW50PgotICogICAgICZsdDtyZXN0cmljdGlvbiBiYXNlPSImbHQ7aHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlPmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotICogICAgICZsdDsvcmVzdHJpY3Rpb24+Ci0gKiAgICZsdDsvc2ltcGxlQ29udGVudD4KLSAqICZsdDsvY29tcGxleFR5cGU+Ci0gKiA8L3ByZT4KLSAqLwotQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKQotQFhtbFR5cGUobmFtZSA9ICJsb2NhbC1ob21lVHlwZSIpCi1wdWJsaWMgY2xhc3MgTG9jYWxIb21lVHlwZQotICAgICAgICBleHRlbmRzIEZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlIHsKLQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9Mb2NhbFR5cGUuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL0xvY2FsVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTM5MGI3Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL0xvY2FsVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8KLS8vIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IHRoZSBKYXZhVE0gQXJjaGl0ZWN0dXJlIGZvciBYTUwgQmluZGluZyhKQVhCKSBSZWZlcmVuY2UgSW1wbGVtZW50YXRpb24sIHYyLjAtYjUyLWZjcyAKLS8vIFNlZSA8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9qYXhiIj5odHRwOi8vamF2YS5zdW4uY29tL3htbC9qYXhiPC9hPiAKLS8vIEFueSBtb2RpZmljYXRpb25zIHRvIHRoaXMgZmlsZSB3aWxsIGJlIGxvc3QgdXBvbiByZWNvbXBpbGF0aW9uIG9mIHRoZSBzb3VyY2Ugc2NoZW1hLiAKLS8vIEdlbmVyYXRlZCBvbjogMjAwNy4wMy4yMSBhdCAxMDo1Njo1MSBBTSBDRFQgCi0vLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi54bWwuaGFuZGxlcjsKLQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGU7Ci0KLQotLyoqCi0gKiBUaGUgbG9jYWxUeXBlIGRlZmluZXMgdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIGFuIGVudGVycHJpc2UgYmVhbidzIGxvY2FsIGludGVyZmFjZS4KLSAqIDxwLz4KLSAqIDxwLz4KLSAqIDxwLz4KLSAqIDxwPkphdmEgY2xhc3MgZm9yIGxvY2FsVHlwZSBjb21wbGV4IHR5cGUuCi0gKiA8cC8+Ci0gKiA8cD5UaGUgZm9sbG93aW5nIHNjaGVtYSBmcmFnbWVudCBzcGVjaWZpZXMgdGhlIGV4cGVjdGVkIGNvbnRlbnQgY29udGFpbmVkIHdpdGhpbiB0aGlzIGNsYXNzLgotICogPHAvPgotICogPHByZT4KLSAqICZsdDtjb21wbGV4VHlwZSBuYW1lPSJsb2NhbFR5cGUiPgotICogICAmbHQ7c2ltcGxlQ29udGVudD4KLSAqICAgICAmbHQ7cmVzdHJpY3Rpb24gYmFzZT0iJmx0O2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZT5mdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLSAqICAgICAmbHQ7L3Jlc3RyaWN0aW9uPgotICogICAmbHQ7L3NpbXBsZUNvbnRlbnQ+Ci0gKiAmbHQ7L2NvbXBsZXhUeXBlPgotICogPC9wcmU+Ci0gKi8KLUBYbWxBY2Nlc3NvclR5cGUoWG1sQWNjZXNzVHlwZS5GSUVMRCkKLUBYbWxUeXBlKG5hbWUgPSAibG9jYWxUeXBlIikKLXB1YmxpYyBjbGFzcyBMb2NhbFR5cGUKLSAgICAgICAgZXh0ZW5kcyBGdWxseVF1YWxpZmllZENsYXNzVHlwZSB7Ci0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvTWVzc2FnZURlc3RpbmF0aW9uTGlua1R5cGUuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL01lc3NhZ2VEZXN0aW5hdGlvbkxpbmtUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwNjA5OGEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvTWVzc2FnZURlc3RpbmF0aW9uTGlua1R5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vCi0vLyBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSB0aGUgSmF2YVRNIEFyY2hpdGVjdHVyZSBmb3IgWE1MIEJpbmRpbmcoSkFYQikgUmVmZXJlbmNlIEltcGxlbWVudGF0aW9uLCB2Mi4wLWI1Mi1mY3MgCi0vLyBTZWUgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YiI+aHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YjwvYT4gCi0vLyBBbnkgbW9kaWZpY2F0aW9ucyB0byB0aGlzIGZpbGUgd2lsbCBiZSBsb3N0IHVwb24gcmVjb21waWxhdGlvbiBvZiB0aGUgc291cmNlIHNjaGVtYS4gCi0vLyBHZW5lcmF0ZWQgb246IDIwMDcuMDMuMjEgYXQgMTA6NTY6NTEgQU0gQ0RUIAotLy8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24ueG1sLmhhbmRsZXI7Ci0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlOwotCi0KLS8qKgotICogVGhlIG1lc3NhZ2UtZGVzdGluYXRpb24tbGlua1R5cGUgaXMgdXNlZCB0byBsaW5rIGEgbWVzc2FnZSBkZXN0aW5hdGlvbiByZWZlcmVuY2Ugb3IKLSAqIG1lc3NhZ2UtZHJpdmVuIGJlYW4gdG8gYSBtZXNzYWdlIGRlc3RpbmF0aW9uLgotICogPHAvPgotICogVGhlIEFzc2VtYmxlciBzZXRzIHRoZSB2YWx1ZSB0byByZWZsZWN0IHRoZSBmbG93IG9mIG1lc3NhZ2VzIGJldHdlZW4gcHJvZHVjZXJzIGFuZCBjb25zdW1lcnMgaW4KLSAqIHRoZSBhcHBsaWNhdGlvbi4KLSAqIDxwLz4KLSAqIFRoZSB2YWx1ZSBtdXN0IGJlIHRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uLW5hbWUgb2YgYSBtZXNzYWdlIGRlc3RpbmF0aW9uIGluIHRoZSBzYW1lIERlcGxveW1lbnQKLSAqIEZpbGUgb3IgaW4gYW5vdGhlciBEZXBsb3ltZW50IEZpbGUgaW4gdGhlIHNhbWUgSmF2YSBFRSBhcHBsaWNhdGlvbiB1bml0LgotICogPHAvPgotICogQWx0ZXJuYXRpdmVseSwgdGhlIHZhbHVlIG1heSBiZSBjb21wb3NlZCBvZiBhIHBhdGggbmFtZSBzcGVjaWZ5aW5nIGEgRGVwbG95bWVudCBGaWxlIGNvbnRhaW5pbmcKLSAqIHRoZSByZWZlcmVuY2VkIG1lc3NhZ2UgZGVzdGluYXRpb24gd2l0aCB0aGUgbWVzc2FnZS1kZXN0aW5hdGlvbi1uYW1lIG9mIHRoZSBkZXN0aW5hdGlvbiBhcHBlbmRlZAotICogYW5kIHNlcGFyYXRlZCBmcm9tIHRoZSBwYXRoIG5hbWUgYnkgIiMiLiBUaGUgcGF0aCBuYW1lIGlzIHJlbGF0aXZlIHRvIHRoZSBEZXBsb3ltZW50IEZpbGUKLSAqIGNvbnRhaW5pbmcgRGVwbG95bWVudCBDb21wb25lbnQgdGhhdCBpcyByZWZlcmVuY2luZyB0aGUgbWVzc2FnZSBkZXN0aW5hdGlvbi4gIFRoaXMgYWxsb3dzCi0gKiBtdWx0aXBsZSBtZXNzYWdlIGRlc3RpbmF0aW9ucyB3aXRoIHRoZSBzYW1lIG5hbWUgdG8gYmUgdW5pcXVlbHkgaWRlbnRpZmllZC4KLSAqIDxwLz4KLSAqIDxwLz4KLSAqIDxwLz4KLSAqIDxwPkphdmEgY2xhc3MgZm9yIG1lc3NhZ2UtZGVzdGluYXRpb24tbGlua1R5cGUgY29tcGxleCB0eXBlLgotICogPHAvPgotICogPHA+VGhlIGZvbGxvd2luZyBzY2hlbWEgZnJhZ21lbnQgc3BlY2lmaWVzIHRoZSBleHBlY3RlZCBjb250ZW50IGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBjbGFzcy4KLSAqIDxwLz4KLSAqIDxwcmU+Ci0gKiAmbHQ7Y29tcGxleFR5cGUgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbi1saW5rVHlwZSI+Ci0gKiAgICZsdDtzaW1wbGVDb250ZW50PgotICogICAgICZsdDtyZXN0cmljdGlvbiBiYXNlPSImbHQ7aHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlPnN0cmluZyI+Ci0gKiAgICAgJmx0Oy9yZXN0cmljdGlvbj4KLSAqICAgJmx0Oy9zaW1wbGVDb250ZW50PgotICogJmx0Oy9jb21wbGV4VHlwZT4KLSAqIDwvcHJlPgotICovCi1AWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpCi1AWG1sVHlwZShuYW1lID0gIm1lc3NhZ2UtZGVzdGluYXRpb24tbGlua1R5cGUiKQotcHVibGljIGNsYXNzIE1lc3NhZ2VEZXN0aW5hdGlvbkxpbmtUeXBlCi0gICAgICAgIGV4dGVuZHMgU3RyaW5nIHsKLQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9NZXNzYWdlRGVzdGluYXRpb25SZWZUeXBlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9NZXNzYWdlRGVzdGluYXRpb25SZWZUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0N2ZkZjYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvTWVzc2FnZURlc3RpbmF0aW9uUmVmVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vCi0vLyBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSB0aGUgSmF2YVRNIEFyY2hpdGVjdHVyZSBmb3IgWE1MIEJpbmRpbmcoSkFYQikgUmVmZXJlbmNlIEltcGxlbWVudGF0aW9uLCB2Mi4wLWI1Mi1mY3MgCi0vLyBTZWUgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YiI+aHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YjwvYT4gCi0vLyBBbnkgbW9kaWZpY2F0aW9ucyB0byB0aGlzIGZpbGUgd2lsbCBiZSBsb3N0IHVwb24gcmVjb21waWxhdGlvbiBvZiB0aGUgc291cmNlIHNjaGVtYS4gCi0vLyBHZW5lcmF0ZWQgb246IDIwMDcuMDMuMjEgYXQgMTA6NTY6NTEgQU0gQ0RUIAotLy8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24ueG1sLmhhbmRsZXI7Ci0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBdHRyaWJ1dGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50OwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sSUQ7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uYWRhcHRlcnMuQ29sbGFwc2VkU3RyaW5nQWRhcHRlcjsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLmFkYXB0ZXJzLlhtbEphdmFUeXBlQWRhcHRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0KLS8qKgotICogVGhlIG1lc3NhZ2UtZGVzdGluYXRpb24tcmVmIGVsZW1lbnQgY29udGFpbnMgYSBkZWNsYXJhdGlvbiBvZiBEZXBsb3ltZW50IENvbXBvbmVudCdzIHJlZmVyZW5jZSB0bwotICogYSBtZXNzYWdlIGRlc3RpbmF0aW9uIGFzc29jaWF0ZWQgd2l0aCBhIHJlc291cmNlIGluIERlcGxveW1lbnQgQ29tcG9uZW50J3MgZW52aXJvbm1lbnQuIEl0Ci0gKiBjb25zaXN0cyBvZjoKLSAqIDxwLz4KLSAqIC0gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gLSB0aGUgbWVzc2FnZSBkZXN0aW5hdGlvbiByZWZlcmVuY2UgbmFtZSAtIGFuIG9wdGlvbmFsIG1lc3NhZ2UKLSAqIGRlc3RpbmF0aW9uIHR5cGUgLSBhbiBvcHRpb25hbCBzcGVjaWZpY2F0aW9uIGFzIHRvIHdoZXRoZXIgdGhlIGRlc3RpbmF0aW9uIGlzIHVzZWQgZm9yIGNvbnN1bWluZwotICogb3IgcHJvZHVjaW5nIG1lc3NhZ2VzLCBvciBib3RoLiBpZiBub3Qgc3BlY2lmaWVkLCAiYm90aCIgaXMgYXNzdW1lZC4gLSBhbiBvcHRpb25hbCBsaW5rIHRvIHRoZQotICogbWVzc2FnZSBkZXN0aW5hdGlvbiAtIG9wdGlvbmFsIGluamVjdGlvbiB0YXJnZXRzCi0gKiA8cC8+Ci0gKiBUaGUgbWVzc2FnZSBkZXN0aW5hdGlvbiB0eXBlIG11c3QgYmUgc3VwcGxpZWQgdW5sZXNzIGFuIGluamVjdGlvbiB0YXJnZXQgaXMgc3BlY2lmaWVkLCBpbiB3aGljaAotICogY2FzZSB0aGUgdHlwZSBvZiB0aGUgdGFyZ2V0IGlzIHVzZWQuICBJZiBib3RoIGFyZSBzcGVjaWZpZWQsIHRoZSB0eXBlIG11c3QgYmUgYXNzaWdubWVudAotICogY29tcGF0aWJsZSB3aXRoIHRoZSB0eXBlIG9mIHRoZSBpbmplY3Rpb24gdGFyZ2V0LgotICogPHAvPgotICogRXhhbXBsZXM6Ci0gKiA8cC8+Ci0gKiA8bWVzc2FnZS1kZXN0aW5hdGlvbi1yZWY+IDxtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lPmptcy9TdG9ja1F1ZXVlCi0gKiA8L21lc3NhZ2UtZGVzdGluYXRpb24tcmVmLW5hbWU+IDxtZXNzYWdlLWRlc3RpbmF0aW9uLXR5cGU+amF2YXguam1zLlF1ZXVlCi0gKiA8L21lc3NhZ2UtZGVzdGluYXRpb24tdHlwZT4gPG1lc3NhZ2UtZGVzdGluYXRpb24tdXNhZ2U+Q29uc3VtZXMgPC9tZXNzYWdlLWRlc3RpbmF0aW9uLXVzYWdlPgotICogPG1lc3NhZ2UtZGVzdGluYXRpb24tbGluaz5Db3Jwb3JhdGVTdG9ja3MgPC9tZXNzYWdlLWRlc3RpbmF0aW9uLWxpbms+IDwvbWVzc2FnZS1kZXN0aW5hdGlvbi1yZWY+Ci0gKiA8cC8+Ci0gKiA8cC8+Ci0gKiA8cC8+Ci0gKiA8cC8+Ci0gKiA8cD5KYXZhIGNsYXNzIGZvciBtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZlR5cGUgY29tcGxleCB0eXBlLgotICogPHAvPgotICogPHA+VGhlIGZvbGxvd2luZyBzY2hlbWEgZnJhZ21lbnQgc3BlY2lmaWVzIHRoZSBleHBlY3RlZCBjb250ZW50IGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBjbGFzcy4KLSAqIDxwLz4KLSAqIDxwcmU+Ci0gKiAmbHQ7Y29tcGxleFR5cGUgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbi1yZWZUeXBlIj4KLSAqICAgJmx0O2NvbXBsZXhDb250ZW50PgotICogICAgICZsdDtyZXN0cmljdGlvbiBiYXNlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9YW55VHlwZSI+Ci0gKiAgICAgICAmbHQ7c2VxdWVuY2U+Ci0gKiAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ7aHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlfWRlc2NyaXB0aW9uVHlwZSIKLSAqIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiLz4KLSAqICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtbmFtZSIgdHlwZT0ie2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZX1qbmRpLW5hbWVUeXBlIi8+Ci0gKiAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9Im1lc3NhZ2UtZGVzdGluYXRpb24tdHlwZSIgdHlwZT0ie2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZX1tZXNzYWdlLWRlc3RpbmF0aW9uLXR5cGVUeXBlIgotICogbWluT2NjdXJzPSIwIi8+Ci0gKiAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9Im1lc3NhZ2UtZGVzdGluYXRpb24tdXNhZ2UiIHR5cGU9IntodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWV9bWVzc2FnZS1kZXN0aW5hdGlvbi11c2FnZVR5cGUiCi0gKiBtaW5PY2N1cnM9IjAiLz4KLSAqICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbi1saW5rIiB0eXBlPSJ7aHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlfW1lc3NhZ2UtZGVzdGluYXRpb24tbGlua1R5cGUiCi0gKiBtaW5PY2N1cnM9IjAiLz4KLSAqICAgICAgICAgJmx0O2dyb3VwIHJlZj0ie2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZX1yZXNvdXJjZUdyb3VwIi8+Ci0gKiAgICAgICAmbHQ7L3NlcXVlbmNlPgotICogICAgICAgJmx0O2F0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfUlEIiAvPgotICogICAgICZsdDsvcmVzdHJpY3Rpb24+Ci0gKiAgICZsdDsvY29tcGxleENvbnRlbnQ+Ci0gKiAmbHQ7L2NvbXBsZXhUeXBlPgotICogPC9wcmU+Ci0gKi8KLUBYbWxBY2Nlc3NvclR5cGUoWG1sQWNjZXNzVHlwZS5GSUVMRCkKLUBYbWxUeXBlKG5hbWUgPSAibWVzc2FnZS1kZXN0aW5hdGlvbi1yZWZUeXBlIiwgcHJvcE9yZGVyID0gewotICAgICAgICAiZGVzY3JpcHRpb24iLAotICAgICAgICAibWVzc2FnZURlc3RpbmF0aW9uUmVmTmFtZSIsCi0gICAgICAgICJtZXNzYWdlRGVzdGluYXRpb25UeXBlIiwKLSAgICAgICAgIm1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlIiwKLSAgICAgICAgIm1lc3NhZ2VEZXN0aW5hdGlvbkxpbmsiLAotICAgICAgICAibWFwcGVkTmFtZSIsCi0gICAgICAgICJpbmplY3Rpb25UYXJnZXQiCi0gICAgICAgIH0pCi1wdWJsaWMgY2xhc3MgTWVzc2FnZURlc3RpbmF0aW9uUmVmVHlwZSB7Ci0KLSAgICBAWG1sRWxlbWVudChuYW1lc3BhY2UgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiwgcmVxdWlyZWQgPSB0cnVlKQotICAgIHByb3RlY3RlZCBMaXN0PERlc2NyaXB0aW9uVHlwZT4gZGVzY3JpcHRpb247Ci0gICAgQFhtbEVsZW1lbnQobmFtZSA9ICJtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lIiwKLSAgICAgICAgICAgICAgICBuYW1lc3BhY2UgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiwgcmVxdWlyZWQgPSB0cnVlKQotICAgIHByb3RlY3RlZCBKbmRpTmFtZVR5cGUgbWVzc2FnZURlc3RpbmF0aW9uUmVmTmFtZTsKLSAgICBAWG1sRWxlbWVudChuYW1lID0gIm1lc3NhZ2UtZGVzdGluYXRpb24tdHlwZSIsIG5hbWVzcGFjZSA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiKQotICAgIHByb3RlY3RlZCBNZXNzYWdlRGVzdGluYXRpb25UeXBlVHlwZSBtZXNzYWdlRGVzdGluYXRpb25UeXBlOwotICAgIEBYbWxFbGVtZW50KG5hbWUgPSAibWVzc2FnZS1kZXN0aW5hdGlvbi11c2FnZSIsIG5hbWVzcGFjZSA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiKQotICAgIHByb3RlY3RlZCBNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUgbWVzc2FnZURlc3RpbmF0aW9uVXNhZ2U7Ci0gICAgQFhtbEVsZW1lbnQobmFtZSA9ICJtZXNzYWdlLWRlc3RpbmF0aW9uLWxpbmsiLCBuYW1lc3BhY2UgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIikKLSAgICBwcm90ZWN0ZWQgTWVzc2FnZURlc3RpbmF0aW9uTGlua1R5cGUgbWVzc2FnZURlc3RpbmF0aW9uTGluazsKLSAgICBAWG1sRWxlbWVudChuYW1lID0gIm1hcHBlZC1uYW1lIiwgbmFtZXNwYWNlID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIpCi0gICAgcHJvdGVjdGVkIFhzZFN0cmluZ1R5cGUgbWFwcGVkTmFtZTsKLSAgICBAWG1sRWxlbWVudChuYW1lID0gImluamVjdGlvbi10YXJnZXQiLCBuYW1lc3BhY2UgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiwKLSAgICAgICAgICAgICAgICByZXF1aXJlZCA9IHRydWUpCi0gICAgcHJvdGVjdGVkIExpc3Q8SW5qZWN0aW9uVGFyZ2V0VHlwZT4gaW5qZWN0aW9uVGFyZ2V0OwotICAgIEBYbWxBdHRyaWJ1dGUKLSAgICBAWG1sSmF2YVR5cGVBZGFwdGVyKENvbGxhcHNlZFN0cmluZ0FkYXB0ZXIuY2xhc3MpCi0gICAgQFhtbElECi0gICAgcHJvdGVjdGVkIGphdmEubGFuZy5TdHJpbmcgaWQ7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZGVzY3JpcHRpb24gcHJvcGVydHkuCi0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBUaGlzIGFjY2Vzc29yIG1ldGhvZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBsaXZlIGxpc3QsIG5vdCBhIHNuYXBzaG90LiBUaGVyZWZvcmUgYW55Ci0gICAgICogbW9kaWZpY2F0aW9uIHlvdSBtYWtlIHRvIHRoZSByZXR1cm5lZCBsaXN0IHdpbGwgYmUgcHJlc2VudCBpbnNpZGUgdGhlIEpBWEIgb2JqZWN0LiBUaGlzIGlzCi0gICAgICogd2h5IHRoZXJlIGlzIG5vdCBhIDxDT0RFPnNldDwvQ09ERT4gbWV0aG9kIGZvciB0aGUgZGVzY3JpcHRpb24gcHJvcGVydHkuCi0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBGb3IgZXhhbXBsZSwgdG8gYWRkIGEgbmV3IGl0ZW0sIGRvIGFzIGZvbGxvd3M6Ci0gICAgICogPHByZT4KLSAgICAgKiAgICBnZXREZXNjcmlwdGlvbigpLmFkZChuZXdJdGVtKTsKLSAgICAgKiA8L3ByZT4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBPYmplY3RzIG9mIHRoZSBmb2xsb3dpbmcgdHlwZShzKSBhcmUgYWxsb3dlZCBpbiB0aGUgbGlzdCB7QGxpbmsgRGVzY3JpcHRpb25UeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxEZXNjcmlwdGlvblR5cGU+IGdldERlc2NyaXB0aW9uKCkgewotICAgICAgICBpZiAoZGVzY3JpcHRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgZGVzY3JpcHRpb24gPSBuZXcgQXJyYXlMaXN0PERlc2NyaXB0aW9uVHlwZT4oKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpcy5kZXNjcmlwdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgbWVzc2FnZURlc3RpbmF0aW9uUmVmTmFtZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzIHtAbGluayBKbmRpTmFtZVR5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyBKbmRpTmFtZVR5cGUgZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG1lc3NhZ2VEZXN0aW5hdGlvblJlZk5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIG1lc3NhZ2VEZXN0aW5hdGlvblJlZk5hbWUgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgYWxsb3dlZCBvYmplY3QgaXMge0BsaW5rIEpuZGlOYW1lVHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmTmFtZShKbmRpTmFtZVR5cGUgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5tZXNzYWdlRGVzdGluYXRpb25SZWZOYW1lID0gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIG1lc3NhZ2VEZXN0aW5hdGlvblR5cGUgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHBvc3NpYmxlIG9iamVjdCBpcyB7QGxpbmsgTWVzc2FnZURlc3RpbmF0aW9uVHlwZVR5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyBNZXNzYWdlRGVzdGluYXRpb25UeXBlVHlwZSBnZXRNZXNzYWdlRGVzdGluYXRpb25UeXBlKCkgewotICAgICAgICByZXR1cm4gbWVzc2FnZURlc3RpbmF0aW9uVHlwZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgbWVzc2FnZURlc3RpbmF0aW9uVHlwZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcyB7QGxpbmsgTWVzc2FnZURlc3RpbmF0aW9uVHlwZVR5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2VEZXN0aW5hdGlvblR5cGUoTWVzc2FnZURlc3RpbmF0aW9uVHlwZVR5cGUgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5tZXNzYWdlRGVzdGluYXRpb25UeXBlID0gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIG1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiBwb3NzaWJsZSBvYmplY3QgaXMge0BsaW5rIE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZSBnZXRNZXNzYWdlRGVzdGluYXRpb25Vc2FnZSgpIHsKLSAgICAgICAgcmV0dXJuIG1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBtZXNzYWdlRGVzdGluYXRpb25Vc2FnZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcyB7QGxpbmsgTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXNzYWdlRGVzdGluYXRpb25Vc2FnZShNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5tZXNzYWdlRGVzdGluYXRpb25Vc2FnZSA9IHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBtZXNzYWdlRGVzdGluYXRpb25MaW5rIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiBwb3NzaWJsZSBvYmplY3QgaXMge0BsaW5rIE1lc3NhZ2VEZXN0aW5hdGlvbkxpbmtUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgTWVzc2FnZURlc3RpbmF0aW9uTGlua1R5cGUgZ2V0TWVzc2FnZURlc3RpbmF0aW9uTGluaygpIHsKLSAgICAgICAgcmV0dXJuIG1lc3NhZ2VEZXN0aW5hdGlvbkxpbms7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIG1lc3NhZ2VEZXN0aW5hdGlvbkxpbmsgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgYWxsb3dlZCBvYmplY3QgaXMge0BsaW5rIE1lc3NhZ2VEZXN0aW5hdGlvbkxpbmtUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXNzYWdlRGVzdGluYXRpb25MaW5rKE1lc3NhZ2VEZXN0aW5hdGlvbkxpbmtUeXBlIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMubWVzc2FnZURlc3RpbmF0aW9uTGluayA9IHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBtYXBwZWROYW1lIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiBwb3NzaWJsZSBvYmplY3QgaXMge0BsaW5rIFhzZFN0cmluZ1R5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyBYc2RTdHJpbmdUeXBlIGdldE1hcHBlZE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBtYXBwZWROYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBtYXBwZWROYW1lIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIGFsbG93ZWQgb2JqZWN0IGlzIHtAbGluayBYc2RTdHJpbmdUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRNYXBwZWROYW1lKFhzZFN0cmluZ1R5cGUgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5tYXBwZWROYW1lID0gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGluamVjdGlvblRhcmdldCBwcm9wZXJ0eS4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIFRoaXMgYWNjZXNzb3IgbWV0aG9kIHJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIGxpdmUgbGlzdCwgbm90IGEgc25hcHNob3QuIFRoZXJlZm9yZSBhbnkKLSAgICAgKiBtb2RpZmljYXRpb24geW91IG1ha2UgdG8gdGhlIHJldHVybmVkIGxpc3Qgd2lsbCBiZSBwcmVzZW50IGluc2lkZSB0aGUgSkFYQiBvYmplY3QuIFRoaXMgaXMKLSAgICAgKiB3aHkgdGhlcmUgaXMgbm90IGEgPENPREU+c2V0PC9DT0RFPiBtZXRob2QgZm9yIHRoZSBpbmplY3Rpb25UYXJnZXQgcHJvcGVydHkuCi0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBGb3IgZXhhbXBsZSwgdG8gYWRkIGEgbmV3IGl0ZW0sIGRvIGFzIGZvbGxvd3M6Ci0gICAgICogPHByZT4KLSAgICAgKiAgICBnZXRJbmplY3Rpb25UYXJnZXQoKS5hZGQobmV3SXRlbSk7Ci0gICAgICogPC9wcmU+Ci0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogT2JqZWN0cyBvZiB0aGUgZm9sbG93aW5nIHR5cGUocykgYXJlIGFsbG93ZWQgaW4gdGhlIGxpc3Qge0BsaW5rIEluamVjdGlvblRhcmdldFR5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PEluamVjdGlvblRhcmdldFR5cGU+IGdldEluamVjdGlvblRhcmdldCgpIHsKLSAgICAgICAgaWYgKGluamVjdGlvblRhcmdldCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpbmplY3Rpb25UYXJnZXQgPSBuZXcgQXJyYXlMaXN0PEluamVjdGlvblRhcmdldFR5cGU+KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMuaW5qZWN0aW9uVGFyZ2V0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBpZCBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRJZCgpIHsKLSAgICAgICAgcmV0dXJuIGlkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBpZCBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcyB7QGxpbmsgamF2YS5sYW5nLlN0cmluZyB9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SWQoamF2YS5sYW5nLlN0cmluZyB2YWx1ZSkgewotICAgICAgICB0aGlzLmlkID0gdmFsdWU7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9NZXNzYWdlRGVzdGluYXRpb25UeXBlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9NZXNzYWdlRGVzdGluYXRpb25UeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5YzY2YmMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvTWVzc2FnZURlc3RpbmF0aW9uVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vCi0vLyBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSB0aGUgSmF2YVRNIEFyY2hpdGVjdHVyZSBmb3IgWE1MIEJpbmRpbmcoSkFYQikgUmVmZXJlbmNlIEltcGxlbWVudGF0aW9uLCB2Mi4wLWI1Mi1mY3MgCi0vLyBTZWUgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YiI+aHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YjwvYT4gCi0vLyBBbnkgbW9kaWZpY2F0aW9ucyB0byB0aGlzIGZpbGUgd2lsbCBiZSBsb3N0IHVwb24gcmVjb21waWxhdGlvbiBvZiB0aGUgc291cmNlIHNjaGVtYS4gCi0vLyBHZW5lcmF0ZWQgb246IDIwMDcuMDMuMjEgYXQgMTA6NTY6NTEgQU0gQ0RUIAotLy8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24ueG1sLmhhbmRsZXI7Ci0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBdHRyaWJ1dGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50OwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sSUQ7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uYWRhcHRlcnMuQ29sbGFwc2VkU3RyaW5nQWRhcHRlcjsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLmFkYXB0ZXJzLlhtbEphdmFUeXBlQWRhcHRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0KLS8qKgotICogVGhlIG1lc3NhZ2UtZGVzdGluYXRpb25UeXBlIHNwZWNpZmllcyBhIG1lc3NhZ2UgZGVzdGluYXRpb24uIFRoZSBsb2dpY2FsIGRlc3RpbmF0aW9uIGRlc2NyaWJlZCBieQotICogdGhpcyBlbGVtZW50IGlzIG1hcHBlZCB0byBhIHBoeXNpY2FsIGRlc3RpbmF0aW9uIGJ5IHRoZSBEZXBsb3llci4KLSAqIDxwLz4KLSAqIFRoZSBtZXNzYWdlIGRlc3RpbmF0aW9uIGVsZW1lbnQgY29udGFpbnM6Ci0gKiA8cC8+Ci0gKiAtIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIC0gYW4gb3B0aW9uYWwgZGlzcGxheS1uYW1lIC0gYW4gb3B0aW9uYWwgaWNvbiAtIGEgbWVzc2FnZSBkZXN0aW5hdGlvbgotICogbmFtZSB3aGljaCBtdXN0IGJlIHVuaXF1ZSBhbW9uZyBtZXNzYWdlIGRlc3RpbmF0aW9uIG5hbWVzIHdpdGhpbiB0aGUgc2FtZSBEZXBsb3ltZW50IEZpbGUuIC0gYW4KLSAqIG9wdGlvbmFsIG1hcHBlZCBuYW1lCi0gKiA8cC8+Ci0gKiBFeGFtcGxlOgotICogPHAvPgotICogPG1lc3NhZ2UtZGVzdGluYXRpb24+IDxtZXNzYWdlLWRlc3RpbmF0aW9uLW5hbWU+Q29ycG9yYXRlU3RvY2tzIDwvbWVzc2FnZS1kZXN0aW5hdGlvbi1uYW1lPgotICogPC9tZXNzYWdlLWRlc3RpbmF0aW9uPgotICogPHAvPgotICogPHAvPgotICogPHAvPgotICogPHAvPgotICogPHA+SmF2YSBjbGFzcyBmb3IgbWVzc2FnZS1kZXN0aW5hdGlvblR5cGUgY29tcGxleCB0eXBlLgotICogPHAvPgotICogPHA+VGhlIGZvbGxvd2luZyBzY2hlbWEgZnJhZ21lbnQgc3BlY2lmaWVzIHRoZSBleHBlY3RlZCBjb250ZW50IGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBjbGFzcy4KLSAqIDxwLz4KLSAqIDxwcmU+Ci0gKiAmbHQ7Y29tcGxleFR5cGUgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvblR5cGUiPgotICogICAmbHQ7Y29tcGxleENvbnRlbnQ+Ci0gKiAgICAgJmx0O3Jlc3RyaWN0aW9uIGJhc2U9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1hbnlUeXBlIj4KLSAqICAgICAgICZsdDtzZXF1ZW5jZT4KLSAqICAgICAgICAgJmx0O2dyb3VwIHJlZj0ie2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZX1kZXNjcmlwdGlvbkdyb3VwIi8+Ci0gKiAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9Im1lc3NhZ2UtZGVzdGluYXRpb24tbmFtZSIgdHlwZT0ie2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZX1zdHJpbmciLz4KLSAqICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0ibWFwcGVkLW5hbWUiIHR5cGU9IntodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWV9eHNkU3RyaW5nVHlwZSIKLSAqIG1pbk9jY3Vycz0iMCIvPgotICogICAgICAgJmx0Oy9zZXF1ZW5jZT4KLSAqICAgICAgICZsdDthdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1JRCIgLz4KLSAqICAgICAmbHQ7L3Jlc3RyaWN0aW9uPgotICogICAmbHQ7L2NvbXBsZXhDb250ZW50PgotICogJmx0Oy9jb21wbGV4VHlwZT4KLSAqIDwvcHJlPgotICovCi1AWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpCi1AWG1sVHlwZShuYW1lID0gIm1lc3NhZ2UtZGVzdGluYXRpb25UeXBlIiwgcHJvcE9yZGVyID0gewotICAgICAgICAiZGVzY3JpcHRpb24iLAotICAgICAgICAiZGlzcGxheU5hbWUiLAotICAgICAgICAiaWNvbiIsCi0gICAgICAgICJtZXNzYWdlRGVzdGluYXRpb25OYW1lIiwKLSAgICAgICAgIm1hcHBlZE5hbWUiCi0gICAgICAgIH0pCi1wdWJsaWMgY2xhc3MgTWVzc2FnZURlc3RpbmF0aW9uVHlwZSB7Ci0KLSAgICBAWG1sRWxlbWVudChuYW1lc3BhY2UgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiwgcmVxdWlyZWQgPSB0cnVlKQotICAgIHByb3RlY3RlZCBMaXN0PERlc2NyaXB0aW9uVHlwZT4gZGVzY3JpcHRpb247Ci0gICAgQFhtbEVsZW1lbnQobmFtZSA9ICJkaXNwbGF5LW5hbWUiLCBuYW1lc3BhY2UgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiwKLSAgICAgICAgICAgICAgICByZXF1aXJlZCA9IHRydWUpCi0gICAgcHJvdGVjdGVkIExpc3Q8RGlzcGxheU5hbWVUeXBlPiBkaXNwbGF5TmFtZTsKLSAgICBAWG1sRWxlbWVudChuYW1lc3BhY2UgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiwgcmVxdWlyZWQgPSB0cnVlKQotICAgIHByb3RlY3RlZCBMaXN0PEljb25UeXBlPiBpY29uOwotICAgIEBYbWxFbGVtZW50KG5hbWUgPSAibWVzc2FnZS1kZXN0aW5hdGlvbi1uYW1lIiwgbmFtZXNwYWNlID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIsCi0gICAgICAgICAgICAgICAgcmVxdWlyZWQgPSB0cnVlKQotICAgIHByb3RlY3RlZCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLnhtbC5oYW5kbGVyLlN0cmluZyBtZXNzYWdlRGVzdGluYXRpb25OYW1lOwotICAgIEBYbWxFbGVtZW50KG5hbWUgPSAibWFwcGVkLW5hbWUiLCBuYW1lc3BhY2UgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIikKLSAgICBwcm90ZWN0ZWQgWHNkU3RyaW5nVHlwZSBtYXBwZWROYW1lOwotICAgIEBYbWxBdHRyaWJ1dGUKLSAgICBAWG1sSmF2YVR5cGVBZGFwdGVyKENvbGxhcHNlZFN0cmluZ0FkYXB0ZXIuY2xhc3MpCi0gICAgQFhtbElECi0gICAgcHJvdGVjdGVkIGphdmEubGFuZy5TdHJpbmcgaWQ7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZGVzY3JpcHRpb24gcHJvcGVydHkuCi0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBUaGlzIGFjY2Vzc29yIG1ldGhvZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBsaXZlIGxpc3QsIG5vdCBhIHNuYXBzaG90LiBUaGVyZWZvcmUgYW55Ci0gICAgICogbW9kaWZpY2F0aW9uIHlvdSBtYWtlIHRvIHRoZSByZXR1cm5lZCBsaXN0IHdpbGwgYmUgcHJlc2VudCBpbnNpZGUgdGhlIEpBWEIgb2JqZWN0LiBUaGlzIGlzCi0gICAgICogd2h5IHRoZXJlIGlzIG5vdCBhIDxDT0RFPnNldDwvQ09ERT4gbWV0aG9kIGZvciB0aGUgZGVzY3JpcHRpb24gcHJvcGVydHkuCi0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBGb3IgZXhhbXBsZSwgdG8gYWRkIGEgbmV3IGl0ZW0sIGRvIGFzIGZvbGxvd3M6Ci0gICAgICogPHByZT4KLSAgICAgKiAgICBnZXREZXNjcmlwdGlvbigpLmFkZChuZXdJdGVtKTsKLSAgICAgKiA8L3ByZT4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBPYmplY3RzIG9mIHRoZSBmb2xsb3dpbmcgdHlwZShzKSBhcmUgYWxsb3dlZCBpbiB0aGUgbGlzdCB7QGxpbmsgRGVzY3JpcHRpb25UeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxEZXNjcmlwdGlvblR5cGU+IGdldERlc2NyaXB0aW9uKCkgewotICAgICAgICBpZiAoZGVzY3JpcHRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgZGVzY3JpcHRpb24gPSBuZXcgQXJyYXlMaXN0PERlc2NyaXB0aW9uVHlwZT4oKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpcy5kZXNjcmlwdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZGlzcGxheU5hbWUgcHJvcGVydHkuCi0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBUaGlzIGFjY2Vzc29yIG1ldGhvZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBsaXZlIGxpc3QsIG5vdCBhIHNuYXBzaG90LiBUaGVyZWZvcmUgYW55Ci0gICAgICogbW9kaWZpY2F0aW9uIHlvdSBtYWtlIHRvIHRoZSByZXR1cm5lZCBsaXN0IHdpbGwgYmUgcHJlc2VudCBpbnNpZGUgdGhlIEpBWEIgb2JqZWN0LiBUaGlzIGlzCi0gICAgICogd2h5IHRoZXJlIGlzIG5vdCBhIDxDT0RFPnNldDwvQ09ERT4gbWV0aG9kIGZvciB0aGUgZGlzcGxheU5hbWUgcHJvcGVydHkuCi0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBGb3IgZXhhbXBsZSwgdG8gYWRkIGEgbmV3IGl0ZW0sIGRvIGFzIGZvbGxvd3M6Ci0gICAgICogPHByZT4KLSAgICAgKiAgICBnZXREaXNwbGF5TmFtZSgpLmFkZChuZXdJdGVtKTsKLSAgICAgKiA8L3ByZT4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBPYmplY3RzIG9mIHRoZSBmb2xsb3dpbmcgdHlwZShzKSBhcmUgYWxsb3dlZCBpbiB0aGUgbGlzdCB7QGxpbmsgRGlzcGxheU5hbWVUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxEaXNwbGF5TmFtZVR5cGU+IGdldERpc3BsYXlOYW1lKCkgewotICAgICAgICBpZiAoZGlzcGxheU5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgZGlzcGxheU5hbWUgPSBuZXcgQXJyYXlMaXN0PERpc3BsYXlOYW1lVHlwZT4oKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpcy5kaXNwbGF5TmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgaWNvbiBwcm9wZXJ0eS4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIFRoaXMgYWNjZXNzb3IgbWV0aG9kIHJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIGxpdmUgbGlzdCwgbm90IGEgc25hcHNob3QuIFRoZXJlZm9yZSBhbnkKLSAgICAgKiBtb2RpZmljYXRpb24geW91IG1ha2UgdG8gdGhlIHJldHVybmVkIGxpc3Qgd2lsbCBiZSBwcmVzZW50IGluc2lkZSB0aGUgSkFYQiBvYmplY3QuIFRoaXMgaXMKLSAgICAgKiB3aHkgdGhlcmUgaXMgbm90IGEgPENPREU+c2V0PC9DT0RFPiBtZXRob2QgZm9yIHRoZSBpY29uIHByb3BlcnR5LgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogRm9yIGV4YW1wbGUsIHRvIGFkZCBhIG5ldyBpdGVtLCBkbyBhcyBmb2xsb3dzOgotICAgICAqIDxwcmU+Ci0gICAgICogICAgZ2V0SWNvbigpLmFkZChuZXdJdGVtKTsKLSAgICAgKiA8L3ByZT4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBPYmplY3RzIG9mIHRoZSBmb2xsb3dpbmcgdHlwZShzKSBhcmUgYWxsb3dlZCBpbiB0aGUgbGlzdCB7QGxpbmsgSWNvblR5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PEljb25UeXBlPiBnZXRJY29uKCkgewotICAgICAgICBpZiAoaWNvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpY29uID0gbmV3IEFycmF5TGlzdDxJY29uVHlwZT4oKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpcy5pY29uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBtZXNzYWdlRGVzdGluYXRpb25OYW1lIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiBwb3NzaWJsZSBvYmplY3QgaXMge0BsaW5rIFN0cmluZyB9Ci0gICAgICovCi0gICAgcHVibGljIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24ueG1sLmhhbmRsZXIuU3RyaW5nIGdldE1lc3NhZ2VEZXN0aW5hdGlvbk5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBtZXNzYWdlRGVzdGluYXRpb25OYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBtZXNzYWdlRGVzdGluYXRpb25OYW1lIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIGFsbG93ZWQgb2JqZWN0IGlzIHtAbGluayBTdHJpbmcKLSAgICAgKiAgICAgICAgICAgICAgfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2VEZXN0aW5hdGlvbk5hbWUoCi0gICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLnhtbC5oYW5kbGVyLlN0cmluZyB2YWx1ZSkgewotICAgICAgICB0aGlzLm1lc3NhZ2VEZXN0aW5hdGlvbk5hbWUgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgbWFwcGVkTmFtZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzIHtAbGluayBYc2RTdHJpbmdUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgWHNkU3RyaW5nVHlwZSBnZXRNYXBwZWROYW1lKCkgewotICAgICAgICByZXR1cm4gbWFwcGVkTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgbWFwcGVkTmFtZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcyB7QGxpbmsgWHNkU3RyaW5nVHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TWFwcGVkTmFtZShYc2RTdHJpbmdUeXBlIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMubWFwcGVkTmFtZSA9IHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBpZCBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRJZCgpIHsKLSAgICAgICAgcmV0dXJuIGlkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBpZCBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcyB7QGxpbmsgamF2YS5sYW5nLlN0cmluZyB9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SWQoamF2YS5sYW5nLlN0cmluZyB2YWx1ZSkgewotICAgICAgICB0aGlzLmlkID0gdmFsdWU7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9NZXNzYWdlRGVzdGluYXRpb25UeXBlVHlwZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvTWVzc2FnZURlc3RpbmF0aW9uVHlwZVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2YwNmFjOS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9NZXNzYWdlRGVzdGluYXRpb25UeXBlVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8KLS8vIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IHRoZSBKYXZhVE0gQXJjaGl0ZWN0dXJlIGZvciBYTUwgQmluZGluZyhKQVhCKSBSZWZlcmVuY2UgSW1wbGVtZW50YXRpb24sIHYyLjAtYjUyLWZjcyAKLS8vIFNlZSA8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9qYXhiIj5odHRwOi8vamF2YS5zdW4uY29tL3htbC9qYXhiPC9hPiAKLS8vIEFueSBtb2RpZmljYXRpb25zIHRvIHRoaXMgZmlsZSB3aWxsIGJlIGxvc3QgdXBvbiByZWNvbXBpbGF0aW9uIG9mIHRoZSBzb3VyY2Ugc2NoZW1hLiAKLS8vIEdlbmVyYXRlZCBvbjogMjAwNy4wMy4yMSBhdCAxMDo1Njo1MSBBTSBDRFQgCi0vLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi54bWwuaGFuZGxlcjsKLQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGU7Ci0KLQotLyoqCi0gKiBUaGUgbWVzc2FnZS1kZXN0aW5hdGlvbi10eXBlVHlwZSBzcGVjaWZpZXMgdGhlIHR5cGUgb2YgdGhlIGRlc3RpbmF0aW9uLiBUaGUgdHlwZSBpcyBzcGVjaWZpZWQgYnkKLSAqIHRoZSBKYXZhIGludGVyZmFjZSBleHBlY3RlZCB0byBiZSBpbXBsZW1lbnRlZCBieSB0aGUgZGVzdGluYXRpb24uCi0gKiA8cC8+Ci0gKiBFeGFtcGxlOgotICogPHAvPgotICogPG1lc3NhZ2UtZGVzdGluYXRpb24tdHlwZT5qYXZheC5qbXMuUXVldWUgPC9tZXNzYWdlLWRlc3RpbmF0aW9uLXR5cGU+Ci0gKiA8cC8+Ci0gKiA8cC8+Ci0gKiA8cC8+Ci0gKiA8cC8+Ci0gKiA8cD5KYXZhIGNsYXNzIGZvciBtZXNzYWdlLWRlc3RpbmF0aW9uLXR5cGVUeXBlIGNvbXBsZXggdHlwZS4KLSAqIDxwLz4KLSAqIDxwPlRoZSBmb2xsb3dpbmcgc2NoZW1hIGZyYWdtZW50IHNwZWNpZmllcyB0aGUgZXhwZWN0ZWQgY29udGVudCBjb250YWluZWQgd2l0aGluIHRoaXMgY2xhc3MuCi0gKiA8cC8+Ci0gKiA8cHJlPgotICogJmx0O2NvbXBsZXhUeXBlIG5hbWU9Im1lc3NhZ2UtZGVzdGluYXRpb24tdHlwZVR5cGUiPgotICogICAmbHQ7c2ltcGxlQ29udGVudD4KLSAqICAgICAmbHQ7cmVzdHJpY3Rpb24gYmFzZT0iJmx0O2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZT5mdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLSAqICAgICAmbHQ7L3Jlc3RyaWN0aW9uPgotICogICAmbHQ7L3NpbXBsZUNvbnRlbnQ+Ci0gKiAmbHQ7L2NvbXBsZXhUeXBlPgotICogPC9wcmU+Ci0gKi8KLUBYbWxBY2Nlc3NvclR5cGUoWG1sQWNjZXNzVHlwZS5GSUVMRCkKLUBYbWxUeXBlKG5hbWUgPSAibWVzc2FnZS1kZXN0aW5hdGlvbi10eXBlVHlwZSIpCi1wdWJsaWMgY2xhc3MgTWVzc2FnZURlc3RpbmF0aW9uVHlwZVR5cGUKLSAgICAgICAgZXh0ZW5kcyBGdWxseVF1YWxpZmllZENsYXNzVHlwZSB7Ci0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9NZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhmOTdmZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9NZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vCi0vLyBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSB0aGUgSmF2YVRNIEFyY2hpdGVjdHVyZSBmb3IgWE1MIEJpbmRpbmcoSkFYQikgUmVmZXJlbmNlIEltcGxlbWVudGF0aW9uLCB2Mi4wLWI1Mi1mY3MgCi0vLyBTZWUgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YiI+aHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YjwvYT4gCi0vLyBBbnkgbW9kaWZpY2F0aW9ucyB0byB0aGlzIGZpbGUgd2lsbCBiZSBsb3N0IHVwb24gcmVjb21waWxhdGlvbiBvZiB0aGUgc291cmNlIHNjaGVtYS4gCi0vLyBHZW5lcmF0ZWQgb246IDIwMDcuMDMuMjEgYXQgMTA6NTY6NTEgQU0gQ0RUIAotLy8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24ueG1sLmhhbmRsZXI7Ci0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlOwotCi0KLS8qKgotICogVGhlIG1lc3NhZ2UtZGVzdGluYXRpb24tdXNhZ2VUeXBlIHNwZWNpZmllcyB0aGUgdXNlIG9mIHRoZSBtZXNzYWdlIGRlc3RpbmF0aW9uIGluZGljYXRlZCBieSB0aGUKLSAqIHJlZmVyZW5jZS4gIFRoZSB2YWx1ZSBpbmRpY2F0ZXMgd2hldGhlciBtZXNzYWdlcyBhcmUgY29uc3VtZWQgZnJvbSB0aGUgbWVzc2FnZSBkZXN0aW5hdGlvbiwKLSAqIHByb2R1Y2VkIGZvciB0aGUgZGVzdGluYXRpb24sIG9yIGJvdGguICBUaGUgQXNzZW1ibGVyIG1ha2VzIHVzZSBvZiB0aGlzIGluZm9ybWF0aW9uIGluIGxpbmtpbmcKLSAqIHByb2R1Y2VycyBvZiBhIGRlc3RpbmF0aW9uIHdpdGggaXRzIGNvbnN1bWVycy4KLSAqIDxwLz4KLSAqIFRoZSB2YWx1ZSBvZiB0aGUgbWVzc2FnZS1kZXN0aW5hdGlvbi11c2FnZSBlbGVtZW50IG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6IENvbnN1bWVzCi0gKiBQcm9kdWNlcyBDb25zdW1lc1Byb2R1Y2VzCi0gKiA8cC8+Ci0gKiA8cC8+Ci0gKiA8cC8+Ci0gKiA8cD5KYXZhIGNsYXNzIGZvciBtZXNzYWdlLWRlc3RpbmF0aW9uLXVzYWdlVHlwZSBjb21wbGV4IHR5cGUuCi0gKiA8cC8+Ci0gKiA8cD5UaGUgZm9sbG93aW5nIHNjaGVtYSBmcmFnbWVudCBzcGVjaWZpZXMgdGhlIGV4cGVjdGVkIGNvbnRlbnQgY29udGFpbmVkIHdpdGhpbiB0aGlzIGNsYXNzLgotICogPHAvPgotICogPHByZT4KLSAqICZsdDtjb21wbGV4VHlwZSBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uLXVzYWdlVHlwZSI+Ci0gKiAgICZsdDtzaW1wbGVDb250ZW50PgotICogICAgICZsdDtyZXN0cmljdGlvbiBiYXNlPSImbHQ7aHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlPnN0cmluZyI+Ci0gKiAgICAgJmx0Oy9yZXN0cmljdGlvbj4KLSAqICAgJmx0Oy9zaW1wbGVDb250ZW50PgotICogJmx0Oy9jb21wbGV4VHlwZT4KLSAqIDwvcHJlPgotICovCi1AWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpCi1AWG1sVHlwZShuYW1lID0gIm1lc3NhZ2UtZGVzdGluYXRpb24tdXNhZ2VUeXBlIikKLXB1YmxpYyBjbGFzcyBNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUKLSAgICAgICAgZXh0ZW5kcyBTdHJpbmcgewotCi0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL09iamVjdEZhY3RvcnkuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL09iamVjdEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRmNmEzNy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9PYmplY3RGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NTkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8KLS8vIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IHRoZSBKYXZhVE0gQXJjaGl0ZWN0dXJlIGZvciBYTUwgQmluZGluZyhKQVhCKSBSZWZlcmVuY2UgSW1wbGVtZW50YXRpb24sIHYyLjAtYjUyLWZjcyAKLS8vIFNlZSA8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9qYXhiIj5odHRwOi8vamF2YS5zdW4uY29tL3htbC9qYXhiPC9hPiAKLS8vIEFueSBtb2RpZmljYXRpb25zIHRvIHRoaXMgZmlsZSB3aWxsIGJlIGxvc3QgdXBvbiByZWNvbXBpbGF0aW9uIG9mIHRoZSBzb3VyY2Ugc2NoZW1hLiAKLS8vIEdlbmVyYXRlZCBvbjogMjAwNy4wMy4yMSBhdCAxMDo1Njo1MSBBTSBDRFQgCi0vLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi54bWwuaGFuZGxlcjsKLQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJFbGVtZW50OwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudERlY2w7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSZWdpc3RyeTsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi0KLS8qKgotICogVGhpcyBvYmplY3QgY29udGFpbnMgZmFjdG9yeSBtZXRob2RzIGZvciBlYWNoIAotICogSmF2YSBjb250ZW50IGludGVyZmFjZSBhbmQgSmF2YSBlbGVtZW50IGludGVyZmFjZSAKLSAqIGdlbmVyYXRlZCBpbiB0aGUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi54bWwuaGFuZGxlciBwYWNrYWdlLiAKLSAqIDxwPkFuIE9iamVjdEZhY3RvcnkgYWxsb3dzIHlvdSB0byBwcm9ncmFtYXRpY2FsbHkgCi0gKiBjb25zdHJ1Y3QgbmV3IGluc3RhbmNlcyBvZiB0aGUgSmF2YSByZXByZXNlbnRhdGlvbiAKLSAqIGZvciBYTUwgY29udGVudC4gVGhlIEphdmEgcmVwcmVzZW50YXRpb24gb2YgWE1MIAotICogY29udGVudCBjYW4gY29uc2lzdCBvZiBzY2hlbWEgZGVyaXZlZCBpbnRlcmZhY2VzIAotICogYW5kIGNsYXNzZXMgcmVwcmVzZW50aW5nIHRoZSBiaW5kaW5nIG9mIHNjaGVtYSAKLSAqIHR5cGUgZGVmaW5pdGlvbnMsIGVsZW1lbnQgZGVjbGFyYXRpb25zIGFuZCBtb2RlbCAKLSAqIGdyb3Vwcy4gIEZhY3RvcnkgbWV0aG9kcyBmb3IgZWFjaCBvZiB0aGVzZSBhcmUgCi0gKiBwcm92aWRlZCBpbiB0aGlzIGNsYXNzLgotICogCi0gKi8KLUBYbWxSZWdpc3RyeQotcHVibGljIGNsYXNzIE9iamVjdEZhY3RvcnkgewotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgUU5hbWUgX0hhbmRsZXJDaGFpbnNfUU5BTUUgPSBuZXcgUU5hbWUoImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIsICJoYW5kbGVyLWNoYWlucyIpOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbmV3IE9iamVjdEZhY3RvcnkgdGhhdCBjYW4gYmUgdXNlZCB0byBjcmVhdGUgbmV3IGluc3RhbmNlcyBvZiBzY2hlbWEgZGVyaXZlZCBjbGFzc2VzIGZvciBwYWNrYWdlOiBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLnhtbC5oYW5kbGVyCi0gICAgICogCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdEZhY3RvcnkoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBQYXRoVHlwZSB9Ci0gICAgICogCi0gICAgICovCi0gICAgcHVibGljIFBhdGhUeXBlIGNyZWF0ZVBhdGhUeXBlKCkgewotICAgICAgICByZXR1cm4gbmV3IFBhdGhUeXBlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBYc2ROb25OZWdhdGl2ZUludGVnZXJUeXBlIH0KLSAgICAgKiAKLSAgICAgKi8KLSAgICBwdWJsaWMgWHNkTm9uTmVnYXRpdmVJbnRlZ2VyVHlwZSBjcmVhdGVYc2ROb25OZWdhdGl2ZUludGVnZXJUeXBlKCkgewotICAgICAgICByZXR1cm4gbmV3IFhzZE5vbk5lZ2F0aXZlSW50ZWdlclR5cGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIFJlbW90ZVR5cGUgfQotICAgICAqIAotICAgICAqLwotICAgIHB1YmxpYyBSZW1vdGVUeXBlIGNyZWF0ZVJlbW90ZVR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgUmVtb3RlVHlwZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgUmVzU2hhcmluZ1Njb3BlVHlwZSB9Ci0gICAgICogCi0gICAgICovCi0gICAgcHVibGljIFJlc1NoYXJpbmdTY29wZVR5cGUgY3JlYXRlUmVzU2hhcmluZ1Njb3BlVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBSZXNTaGFyaW5nU2NvcGVUeXBlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBUcnVlRmFsc2VUeXBlIH0KLSAgICAgKiAKLSAgICAgKi8KLSAgICBwdWJsaWMgVHJ1ZUZhbHNlVHlwZSBjcmVhdGVUcnVlRmFsc2VUeXBlKCkgewotICAgICAgICByZXR1cm4gbmV3IFRydWVGYWxzZVR5cGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIExpc3RlbmVyVHlwZSB9Ci0gICAgICogCi0gICAgICovCi0gICAgcHVibGljIExpc3RlbmVyVHlwZSBjcmVhdGVMaXN0ZW5lclR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTGlzdGVuZXJUeXBlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBYc2RJbnRlZ2VyVHlwZSB9Ci0gICAgICogCi0gICAgICovCi0gICAgcHVibGljIFhzZEludGVnZXJUeXBlIGNyZWF0ZVhzZEludGVnZXJUeXBlKCkgewotICAgICAgICByZXR1cm4gbmV3IFhzZEludGVnZXJUeXBlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBYc2RBbnlVUklUeXBlIH0KLSAgICAgKiAKLSAgICAgKi8KLSAgICBwdWJsaWMgWHNkQW55VVJJVHlwZSBjcmVhdGVYc2RBbnlVUklUeXBlKCkgewotICAgICAgICByZXR1cm4gbmV3IFhzZEFueVVSSVR5cGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIFJlc0F1dGhUeXBlIH0KLSAgICAgKiAKLSAgICAgKi8KLSAgICBwdWJsaWMgUmVzQXV0aFR5cGUgY3JlYXRlUmVzQXV0aFR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgUmVzQXV0aFR5cGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEphdmFUeXBlVHlwZSB9Ci0gICAgICogCi0gICAgICovCi0gICAgcHVibGljIEphdmFUeXBlVHlwZSBjcmVhdGVKYXZhVHlwZVR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgSmF2YVR5cGVUeXBlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBFamJSZWZUeXBlIH0KLSAgICAgKiAKLSAgICAgKi8KLSAgICBwdWJsaWMgRWpiUmVmVHlwZSBjcmVhdGVFamJSZWZUeXBlKCkgewotICAgICAgICByZXR1cm4gbmV3IEVqYlJlZlR5cGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZSB9Ci0gICAgICogCi0gICAgICovCi0gICAgcHVibGljIE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZSBjcmVhdGVNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBHZW5lcmljQm9vbGVhblR5cGUgfQotICAgICAqIAotICAgICAqLwotICAgIHB1YmxpYyBHZW5lcmljQm9vbGVhblR5cGUgY3JlYXRlR2VuZXJpY0Jvb2xlYW5UeXBlKCkgewotICAgICAgICByZXR1cm4gbmV3IEdlbmVyaWNCb29sZWFuVHlwZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgRWpiTGlua1R5cGUgfQotICAgICAqIAotICAgICAqLwotICAgIHB1YmxpYyBFamJMaW5rVHlwZSBjcmVhdGVFamJMaW5rVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBFamJMaW5rVHlwZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgU2VydmljZVJlZkhhbmRsZXJDaGFpblR5cGUgfQotICAgICAqIAotICAgICAqLwotICAgIHB1YmxpYyBTZXJ2aWNlUmVmSGFuZGxlckNoYWluVHlwZSBjcmVhdGVTZXJ2aWNlUmVmSGFuZGxlckNoYWluVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTZXJ2aWNlUmVmSGFuZGxlckNoYWluVHlwZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgRnVsbHlRdWFsaWZpZWRDbGFzc1R5cGUgfQotICAgICAqIAotICAgICAqLwotICAgIHB1YmxpYyBGdWxseVF1YWxpZmllZENsYXNzVHlwZSBjcmVhdGVGdWxseVF1YWxpZmllZENsYXNzVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBGdWxseVF1YWxpZmllZENsYXNzVHlwZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgSGFuZGxlckNoYWluc1R5cGUgfQotICAgICAqIAotICAgICAqLwotICAgIHB1YmxpYyBIYW5kbGVyQ2hhaW5zVHlwZSBjcmVhdGVIYW5kbGVyQ2hhaW5zVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBIYW5kbGVyQ2hhaW5zVHlwZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgSGFuZGxlclR5cGUgfQotICAgICAqIAotICAgICAqLwotICAgIHB1YmxpYyBIYW5kbGVyVHlwZSBjcmVhdGVIYW5kbGVyVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBIYW5kbGVyVHlwZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgRGVzY3JpcHRpb25UeXBlIH0KLSAgICAgKiAKLSAgICAgKi8KLSAgICBwdWJsaWMgRGVzY3JpcHRpb25UeXBlIGNyZWF0ZURlc2NyaXB0aW9uVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBEZXNjcmlwdGlvblR5cGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIFhzZFN0cmluZ1R5cGUgfQotICAgICAqIAotICAgICAqLwotICAgIHB1YmxpYyBYc2RTdHJpbmdUeXBlIGNyZWF0ZVhzZFN0cmluZ1R5cGUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgWHNkU3RyaW5nVHlwZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgU3RyaW5nIH0KLSAgICAgKiAKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZVN0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEVtcHR5VHlwZSB9Ci0gICAgICogCi0gICAgICovCi0gICAgcHVibGljIEVtcHR5VHlwZSBjcmVhdGVFbXB0eVR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgRW1wdHlUeXBlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBFamJSZWZUeXBlVHlwZSB9Ci0gICAgICogCi0gICAgICovCi0gICAgcHVibGljIEVqYlJlZlR5cGVUeXBlIGNyZWF0ZUVqYlJlZlR5cGVUeXBlKCkgewotICAgICAgICByZXR1cm4gbmV3IEVqYlJlZlR5cGVUeXBlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBYc2RQb3NpdGl2ZUludGVnZXJUeXBlIH0KLSAgICAgKiAKLSAgICAgKi8KLSAgICBwdWJsaWMgWHNkUG9zaXRpdmVJbnRlZ2VyVHlwZSBjcmVhdGVYc2RQb3NpdGl2ZUludGVnZXJUeXBlKCkgewotICAgICAgICByZXR1cm4gbmV3IFhzZFBvc2l0aXZlSW50ZWdlclR5cGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIERpc3BsYXlOYW1lVHlwZSB9Ci0gICAgICogCi0gICAgICovCi0gICAgcHVibGljIERpc3BsYXlOYW1lVHlwZSBjcmVhdGVEaXNwbGF5TmFtZVR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgRGlzcGxheU5hbWVUeXBlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBJY29uVHlwZSB9Ci0gICAgICogCi0gICAgICovCi0gICAgcHVibGljIEljb25UeXBlIGNyZWF0ZUljb25UeXBlKCkgewotICAgICAgICByZXR1cm4gbmV3IEljb25UeXBlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBKbmRpTmFtZVR5cGUgfQotICAgICAqIAotICAgICAqLwotICAgIHB1YmxpYyBKbmRpTmFtZVR5cGUgY3JlYXRlSm5kaU5hbWVUeXBlKCkgewotICAgICAgICByZXR1cm4gbmV3IEpuZGlOYW1lVHlwZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgTWVzc2FnZURlc3RpbmF0aW9uUmVmVHlwZSB9Ci0gICAgICogCi0gICAgICovCi0gICAgcHVibGljIE1lc3NhZ2VEZXN0aW5hdGlvblJlZlR5cGUgY3JlYXRlTWVzc2FnZURlc3RpbmF0aW9uUmVmVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNZXNzYWdlRGVzdGluYXRpb25SZWZUeXBlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBFamJMb2NhbFJlZlR5cGUgfQotICAgICAqIAotICAgICAqLwotICAgIHB1YmxpYyBFamJMb2NhbFJlZlR5cGUgY3JlYXRlRWpiTG9jYWxSZWZUeXBlKCkgewotICAgICAgICByZXR1cm4gbmV3IEVqYkxvY2FsUmVmVHlwZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgU2VjdXJpdHlSb2xlVHlwZSB9Ci0gICAgICogCi0gICAgICovCi0gICAgcHVibGljIFNlY3VyaXR5Um9sZVR5cGUgY3JlYXRlU2VjdXJpdHlSb2xlVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTZWN1cml0eVJvbGVUeXBlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBQZXJzaXN0ZW5jZVVuaXRSZWZUeXBlIH0KLSAgICAgKiAKLSAgICAgKi8KLSAgICBwdWJsaWMgUGVyc2lzdGVuY2VVbml0UmVmVHlwZSBjcmVhdGVQZXJzaXN0ZW5jZVVuaXRSZWZUeXBlKCkgewotICAgICAgICByZXR1cm4gbmV3IFBlcnNpc3RlbmNlVW5pdFJlZlR5cGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIFNlY3VyaXR5Um9sZVJlZlR5cGUgfQotICAgICAqIAotICAgICAqLwotICAgIHB1YmxpYyBTZWN1cml0eVJvbGVSZWZUeXBlIGNyZWF0ZVNlY3VyaXR5Um9sZVJlZlR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgU2VjdXJpdHlSb2xlUmVmVHlwZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgSGFuZGxlckNoYWluVHlwZSB9Ci0gICAgICogCi0gICAgICovCi0gICAgcHVibGljIEhhbmRsZXJDaGFpblR5cGUgY3JlYXRlSGFuZGxlckNoYWluVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBIYW5kbGVyQ2hhaW5UeXBlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBSb2xlTmFtZVR5cGUgfQotICAgICAqIAotICAgICAqLwotICAgIHB1YmxpYyBSb2xlTmFtZVR5cGUgY3JlYXRlUm9sZU5hbWVUeXBlKCkgewotICAgICAgICByZXR1cm4gbmV3IFJvbGVOYW1lVHlwZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgTWVzc2FnZURlc3RpbmF0aW9uVHlwZVR5cGUgfQotICAgICAqIAotICAgICAqLwotICAgIHB1YmxpYyBNZXNzYWdlRGVzdGluYXRpb25UeXBlVHlwZSBjcmVhdGVNZXNzYWdlRGVzdGluYXRpb25UeXBlVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNZXNzYWdlRGVzdGluYXRpb25UeXBlVHlwZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgWHNkTk1UT0tFTlR5cGUgfQotICAgICAqIAotICAgICAqLwotICAgIHB1YmxpYyBYc2ROTVRPS0VOVHlwZSBjcmVhdGVYc2ROTVRPS0VOVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBYc2ROTVRPS0VOVHlwZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgSmF2YUlkZW50aWZpZXJUeXBlIH0KLSAgICAgKiAKLSAgICAgKi8KLSAgICBwdWJsaWMgSmF2YUlkZW50aWZpZXJUeXBlIGNyZWF0ZUphdmFJZGVudGlmaWVyVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBKYXZhSWRlbnRpZmllclR5cGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIFJlc291cmNlRW52UmVmVHlwZSB9Ci0gICAgICogCi0gICAgICovCi0gICAgcHVibGljIFJlc291cmNlRW52UmVmVHlwZSBjcmVhdGVSZXNvdXJjZUVudlJlZlR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VFbnZSZWZUeXBlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBQb3J0Q29tcG9uZW50UmVmVHlwZSB9Ci0gICAgICogCi0gICAgICovCi0gICAgcHVibGljIFBvcnRDb21wb25lbnRSZWZUeXBlIGNyZWF0ZVBvcnRDb21wb25lbnRSZWZUeXBlKCkgewotICAgICAgICByZXR1cm4gbmV3IFBvcnRDb21wb25lbnRSZWZUeXBlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBJbmplY3Rpb25UYXJnZXRUeXBlIH0KLSAgICAgKiAKLSAgICAgKi8KLSAgICBwdWJsaWMgSW5qZWN0aW9uVGFyZ2V0VHlwZSBjcmVhdGVJbmplY3Rpb25UYXJnZXRUeXBlKCkgewotICAgICAgICByZXR1cm4gbmV3IEluamVjdGlvblRhcmdldFR5cGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIFBlcnNpc3RlbmNlQ29udGV4dFR5cGVUeXBlIH0KLSAgICAgKiAKLSAgICAgKi8KLSAgICBwdWJsaWMgUGVyc2lzdGVuY2VDb250ZXh0VHlwZVR5cGUgY3JlYXRlUGVyc2lzdGVuY2VDb250ZXh0VHlwZVR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgUGVyc2lzdGVuY2VDb250ZXh0VHlwZVR5cGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIFBhcmFtVmFsdWVUeXBlIH0KLSAgICAgKiAKLSAgICAgKi8KLSAgICBwdWJsaWMgUGFyYW1WYWx1ZVR5cGUgY3JlYXRlUGFyYW1WYWx1ZVR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgUGFyYW1WYWx1ZVR5cGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIFNlcnZpY2VSZWZIYW5kbGVyVHlwZSB9Ci0gICAgICogCi0gICAgICovCi0gICAgcHVibGljIFNlcnZpY2VSZWZIYW5kbGVyVHlwZSBjcmVhdGVTZXJ2aWNlUmVmSGFuZGxlclR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgU2VydmljZVJlZkhhbmRsZXJUeXBlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBMaWZlY3ljbGVDYWxsYmFja1R5cGUgfQotICAgICAqIAotICAgICAqLwotICAgIHB1YmxpYyBMaWZlY3ljbGVDYWxsYmFja1R5cGUgY3JlYXRlTGlmZWN5Y2xlQ2FsbGJhY2tUeXBlKCkgewotICAgICAgICByZXR1cm4gbmV3IExpZmVjeWNsZUNhbGxiYWNrVHlwZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgU2VydmljZVJlZlR5cGUgfQotICAgICAqIAotICAgICAqLwotICAgIHB1YmxpYyBTZXJ2aWNlUmVmVHlwZSBjcmVhdGVTZXJ2aWNlUmVmVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTZXJ2aWNlUmVmVHlwZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgTWVzc2FnZURlc3RpbmF0aW9uTGlua1R5cGUgfQotICAgICAqIAotICAgICAqLwotICAgIHB1YmxpYyBNZXNzYWdlRGVzdGluYXRpb25MaW5rVHlwZSBjcmVhdGVNZXNzYWdlRGVzdGluYXRpb25MaW5rVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNZXNzYWdlRGVzdGluYXRpb25MaW5rVHlwZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgTWVzc2FnZURlc3RpbmF0aW9uVHlwZSB9Ci0gICAgICogCi0gICAgICovCi0gICAgcHVibGljIE1lc3NhZ2VEZXN0aW5hdGlvblR5cGUgY3JlYXRlTWVzc2FnZURlc3RpbmF0aW9uVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNZXNzYWdlRGVzdGluYXRpb25UeXBlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBVcmxQYXR0ZXJuVHlwZSB9Ci0gICAgICogCi0gICAgICovCi0gICAgcHVibGljIFVybFBhdHRlcm5UeXBlIGNyZWF0ZVVybFBhdHRlcm5UeXBlKCkgewotICAgICAgICByZXR1cm4gbmV3IFVybFBhdHRlcm5UeXBlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBIb21lVHlwZSB9Ci0gICAgICogCi0gICAgICovCi0gICAgcHVibGljIEhvbWVUeXBlIGNyZWF0ZUhvbWVUeXBlKCkgewotICAgICAgICByZXR1cm4gbmV3IEhvbWVUeXBlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBSZXNvdXJjZVJlZlR5cGUgfQotICAgICAqIAotICAgICAqLwotICAgIHB1YmxpYyBSZXNvdXJjZVJlZlR5cGUgY3JlYXRlUmVzb3VyY2VSZWZUeXBlKCkgewotICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlUmVmVHlwZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgRW52RW50cnlUeXBlVmFsdWVzVHlwZSB9Ci0gICAgICogCi0gICAgICovCi0gICAgcHVibGljIEVudkVudHJ5VHlwZVZhbHVlc1R5cGUgY3JlYXRlRW52RW50cnlUeXBlVmFsdWVzVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBFbnZFbnRyeVR5cGVWYWx1ZXNUeXBlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBFamJSZWZOYW1lVHlwZSB9Ci0gICAgICogCi0gICAgICovCi0gICAgcHVibGljIEVqYlJlZk5hbWVUeXBlIGNyZWF0ZUVqYlJlZk5hbWVUeXBlKCkgewotICAgICAgICByZXR1cm4gbmV3IEVqYlJlZk5hbWVUeXBlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBSdW5Bc1R5cGUgfQotICAgICAqIAotICAgICAqLwotICAgIHB1YmxpYyBSdW5Bc1R5cGUgY3JlYXRlUnVuQXNUeXBlKCkgewotICAgICAgICByZXR1cm4gbmV3IFJ1bkFzVHlwZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgTG9jYWxUeXBlIH0KLSAgICAgKiAKLSAgICAgKi8KLSAgICBwdWJsaWMgTG9jYWxUeXBlIGNyZWF0ZUxvY2FsVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBMb2NhbFR5cGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIFByb3BlcnR5VHlwZSB9Ci0gICAgICogCi0gICAgICovCi0gICAgcHVibGljIFByb3BlcnR5VHlwZSBjcmVhdGVQcm9wZXJ0eVR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgUHJvcGVydHlUeXBlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBTZXJ2aWNlUmVmSGFuZGxlckNoYWluc1R5cGUgfQotICAgICAqIAotICAgICAqLwotICAgIHB1YmxpYyBTZXJ2aWNlUmVmSGFuZGxlckNoYWluc1R5cGUgY3JlYXRlU2VydmljZVJlZkhhbmRsZXJDaGFpbnNUeXBlKCkgewotICAgICAgICByZXR1cm4gbmV3IFNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5zVHlwZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgTG9jYWxIb21lVHlwZSB9Ci0gICAgICogCi0gICAgICovCi0gICAgcHVibGljIExvY2FsSG9tZVR5cGUgY3JlYXRlTG9jYWxIb21lVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBMb2NhbEhvbWVUeXBlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBYc2RCb29sZWFuVHlwZSB9Ci0gICAgICogCi0gICAgICovCi0gICAgcHVibGljIFhzZEJvb2xlYW5UeXBlIGNyZWF0ZVhzZEJvb2xlYW5UeXBlKCkgewotICAgICAgICByZXR1cm4gbmV3IFhzZEJvb2xlYW5UeXBlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBYc2RRTmFtZVR5cGUgfQotICAgICAqIAotICAgICAqLwotICAgIHB1YmxpYyBYc2RRTmFtZVR5cGUgY3JlYXRlWHNkUU5hbWVUeXBlKCkgewotICAgICAgICByZXR1cm4gbmV3IFhzZFFOYW1lVHlwZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgRW52RW50cnlUeXBlIH0KLSAgICAgKiAKLSAgICAgKi8KLSAgICBwdWJsaWMgRW52RW50cnlUeXBlIGNyZWF0ZUVudkVudHJ5VHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBFbnZFbnRyeVR5cGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIFBlcnNpc3RlbmNlQ29udGV4dFJlZlR5cGUgfQotICAgICAqIAotICAgICAqLwotICAgIHB1YmxpYyBQZXJzaXN0ZW5jZUNvbnRleHRSZWZUeXBlIGNyZWF0ZVBlcnNpc3RlbmNlQ29udGV4dFJlZlR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgUGVyc2lzdGVuY2VDb250ZXh0UmVmVHlwZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgSkFYQkVsZW1lbnQgfXtAY29kZSA8fXtAbGluayBIYW5kbGVyQ2hhaW5zVHlwZSB9e0Bjb2RlID59fQotICAgICAqIAotICAgICAqLwotICAgIEBYbWxFbGVtZW50RGVjbChuYW1lc3BhY2UgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiwgbmFtZSA9ICJoYW5kbGVyLWNoYWlucyIpCi0gICAgcHVibGljIEpBWEJFbGVtZW50PEhhbmRsZXJDaGFpbnNUeXBlPiBjcmVhdGVIYW5kbGVyQ2hhaW5zKEhhbmRsZXJDaGFpbnNUeXBlIHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgSkFYQkVsZW1lbnQ8SGFuZGxlckNoYWluc1R5cGU+KF9IYW5kbGVyQ2hhaW5zX1FOQU1FLCBIYW5kbGVyQ2hhaW5zVHlwZS5jbGFzcywgbnVsbCwgdmFsdWUpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvUGFyYW1WYWx1ZVR5cGUuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL1BhcmFtVmFsdWVUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiOWQ2MmMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvUGFyYW1WYWx1ZVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLwotLy8gVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIEphdmFUTSBBcmNoaXRlY3R1cmUgZm9yIFhNTCBCaW5kaW5nKEpBWEIpIFJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbiwgdjIuMC1iNTItZmNzIAotLy8gU2VlIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGIiPmh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGI8L2E+IAotLy8gQW55IG1vZGlmaWNhdGlvbnMgdG8gdGhpcyBmaWxlIHdpbGwgYmUgbG9zdCB1cG9uIHJlY29tcGlsYXRpb24gb2YgdGhlIHNvdXJjZSBzY2hlbWEuIAotLy8gR2VuZXJhdGVkIG9uOiAyMDA3LjAzLjIxIGF0IDEwOjU2OjUxIEFNIENEVCAKLS8vCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLnhtbC5oYW5kbGVyOwotCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQXR0cmlidXRlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbElEOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLmFkYXB0ZXJzLkNvbGxhcHNlZFN0cmluZ0FkYXB0ZXI7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5hZGFwdGVycy5YbWxKYXZhVHlwZUFkYXB0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotCi0vKioKLSAqIFRoaXMgdHlwZSBpcyBhIGdlbmVyYWwgdHlwZSB0aGF0IGNhbiBiZSB1c2VkIHRvIGRlY2xhcmUgcGFyYW1ldGVyL3ZhbHVlIGxpc3RzLgotICogPHAvPgotICogPHAvPgotICogPHAvPgotICogPHA+SmF2YSBjbGFzcyBmb3IgcGFyYW0tdmFsdWVUeXBlIGNvbXBsZXggdHlwZS4KLSAqIDxwLz4KLSAqIDxwPlRoZSBmb2xsb3dpbmcgc2NoZW1hIGZyYWdtZW50IHNwZWNpZmllcyB0aGUgZXhwZWN0ZWQgY29udGVudCBjb250YWluZWQgd2l0aGluIHRoaXMgY2xhc3MuCi0gKiA8cC8+Ci0gKiA8cHJlPgotICogJmx0O2NvbXBsZXhUeXBlIG5hbWU9InBhcmFtLXZhbHVlVHlwZSI+Ci0gKiAgICZsdDtjb21wbGV4Q29udGVudD4KLSAqICAgICAmbHQ7cmVzdHJpY3Rpb24gYmFzZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfWFueVR5cGUiPgotICogICAgICAgJmx0O3NlcXVlbmNlPgotICogICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ie2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZX1kZXNjcmlwdGlvblR5cGUiCi0gKiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIi8+Ci0gKiAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9InBhcmFtLW5hbWUiIHR5cGU9IntodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWV9c3RyaW5nIi8+Ci0gKiAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9InBhcmFtLXZhbHVlIiB0eXBlPSJ7aHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlfXhzZFN0cmluZ1R5cGUiLz4KLSAqICAgICAgICZsdDsvc2VxdWVuY2U+Ci0gKiAgICAgICAmbHQ7YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9SUQiIC8+Ci0gKiAgICAgJmx0Oy9yZXN0cmljdGlvbj4KLSAqICAgJmx0Oy9jb21wbGV4Q29udGVudD4KLSAqICZsdDsvY29tcGxleFR5cGU+Ci0gKiA8L3ByZT4KLSAqLwotQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKQotQFhtbFR5cGUobmFtZSA9ICJwYXJhbS12YWx1ZVR5cGUiLCBwcm9wT3JkZXIgPSB7Ci0gICAgICAgICJkZXNjcmlwdGlvbiIsCi0gICAgICAgICJwYXJhbU5hbWUiLAotICAgICAgICAicGFyYW1WYWx1ZSIKLSAgICAgICAgfSkKLXB1YmxpYyBjbGFzcyBQYXJhbVZhbHVlVHlwZSB7Ci0KLSAgICBAWG1sRWxlbWVudChuYW1lc3BhY2UgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiwgcmVxdWlyZWQgPSB0cnVlKQotICAgIHByb3RlY3RlZCBMaXN0PERlc2NyaXB0aW9uVHlwZT4gZGVzY3JpcHRpb247Ci0gICAgQFhtbEVsZW1lbnQobmFtZSA9ICJwYXJhbS1uYW1lIiwgbmFtZXNwYWNlID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIsCi0gICAgICAgICAgICAgICAgcmVxdWlyZWQgPSB0cnVlKQotICAgIHByb3RlY3RlZCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLnhtbC5oYW5kbGVyLlN0cmluZyBwYXJhbU5hbWU7Ci0gICAgQFhtbEVsZW1lbnQobmFtZSA9ICJwYXJhbS12YWx1ZSIsIG5hbWVzcGFjZSA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiLAotICAgICAgICAgICAgICAgIHJlcXVpcmVkID0gdHJ1ZSkKLSAgICBwcm90ZWN0ZWQgWHNkU3RyaW5nVHlwZSBwYXJhbVZhbHVlOwotICAgIEBYbWxBdHRyaWJ1dGUKLSAgICBAWG1sSmF2YVR5cGVBZGFwdGVyKENvbGxhcHNlZFN0cmluZ0FkYXB0ZXIuY2xhc3MpCi0gICAgQFhtbElECi0gICAgcHJvdGVjdGVkIGphdmEubGFuZy5TdHJpbmcgaWQ7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZGVzY3JpcHRpb24gcHJvcGVydHkuCi0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBUaGlzIGFjY2Vzc29yIG1ldGhvZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBsaXZlIGxpc3QsIG5vdCBhIHNuYXBzaG90LiBUaGVyZWZvcmUgYW55Ci0gICAgICogbW9kaWZpY2F0aW9uIHlvdSBtYWtlIHRvIHRoZSByZXR1cm5lZCBsaXN0IHdpbGwgYmUgcHJlc2VudCBpbnNpZGUgdGhlIEpBWEIgb2JqZWN0LiBUaGlzIGlzCi0gICAgICogd2h5IHRoZXJlIGlzIG5vdCBhIDxDT0RFPnNldDwvQ09ERT4gbWV0aG9kIGZvciB0aGUgZGVzY3JpcHRpb24gcHJvcGVydHkuCi0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBGb3IgZXhhbXBsZSwgdG8gYWRkIGEgbmV3IGl0ZW0sIGRvIGFzIGZvbGxvd3M6Ci0gICAgICogPHByZT4KLSAgICAgKiAgICBnZXREZXNjcmlwdGlvbigpLmFkZChuZXdJdGVtKTsKLSAgICAgKiA8L3ByZT4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBPYmplY3RzIG9mIHRoZSBmb2xsb3dpbmcgdHlwZShzKSBhcmUgYWxsb3dlZCBpbiB0aGUgbGlzdCB7QGxpbmsgRGVzY3JpcHRpb25UeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxEZXNjcmlwdGlvblR5cGU+IGdldERlc2NyaXB0aW9uKCkgewotICAgICAgICBpZiAoZGVzY3JpcHRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgZGVzY3JpcHRpb24gPSBuZXcgQXJyYXlMaXN0PERlc2NyaXB0aW9uVHlwZT4oKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpcy5kZXNjcmlwdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgcGFyYW1OYW1lIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiBwb3NzaWJsZSBvYmplY3QgaXMge0BsaW5rIFN0cmluZyB9Ci0gICAgICovCi0gICAgcHVibGljIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24ueG1sLmhhbmRsZXIuU3RyaW5nIGdldFBhcmFtTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHBhcmFtTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgcGFyYW1OYW1lIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIGFsbG93ZWQgb2JqZWN0IGlzIHtAbGluayBTdHJpbmcKLSAgICAgKiAgICAgICAgICAgICAgfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFBhcmFtTmFtZShvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLnhtbC5oYW5kbGVyLlN0cmluZyB2YWx1ZSkgewotICAgICAgICB0aGlzLnBhcmFtTmFtZSA9IHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBwYXJhbVZhbHVlIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiBwb3NzaWJsZSBvYmplY3QgaXMge0BsaW5rIFhzZFN0cmluZ1R5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyBYc2RTdHJpbmdUeXBlIGdldFBhcmFtVmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiBwYXJhbVZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBwYXJhbVZhbHVlIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIGFsbG93ZWQgb2JqZWN0IGlzIHtAbGluayBYc2RTdHJpbmdUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJhbVZhbHVlKFhzZFN0cmluZ1R5cGUgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5wYXJhbVZhbHVlID0gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGlkIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiBwb3NzaWJsZSBvYmplY3QgaXMge0BsaW5rIGphdmEubGFuZy5TdHJpbmcgfQotICAgICAqLwotICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldElkKCkgewotICAgICAgICByZXR1cm4gaWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGlkIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIGFsbG93ZWQgb2JqZWN0IGlzIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJZChqYXZhLmxhbmcuU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMuaWQgPSB2YWx1ZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL1BhdGhUeXBlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9QYXRoVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGMwMjg3Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL1BhdGhUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLwotLy8gVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIEphdmFUTSBBcmNoaXRlY3R1cmUgZm9yIFhNTCBCaW5kaW5nKEpBWEIpIFJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbiwgdjIuMC1iNTItZmNzIAotLy8gU2VlIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGIiPmh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGI8L2E+IAotLy8gQW55IG1vZGlmaWNhdGlvbnMgdG8gdGhpcyBmaWxlIHdpbGwgYmUgbG9zdCB1cG9uIHJlY29tcGlsYXRpb24gb2YgdGhlIHNvdXJjZSBzY2hlbWEuIAotLy8gR2VuZXJhdGVkIG9uOiAyMDA3LjAzLjIxIGF0IDEwOjU2OjUxIEFNIENEVCAKLS8vCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLnhtbC5oYW5kbGVyOwotCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZTsKLQotCi0vKioKLSAqIFRoZSBlbGVtZW50cyB0aGF0IHVzZSB0aGlzIHR5cGUgZGVzaWduYXRlIGVpdGhlciBhIHJlbGF0aXZlIHBhdGggb3IgYW4gYWJzb2x1dGUgcGF0aCBzdGFydGluZwotICogd2l0aCBhICIvIi4KLSAqIDxwLz4KLSAqIEluIGVsZW1lbnRzIHRoYXQgc3BlY2lmeSBhIHBhdGhuYW1lIHRvIGEgZmlsZSB3aXRoaW4gdGhlIHNhbWUgRGVwbG95bWVudCBGaWxlLCByZWxhdGl2ZSBmaWxlbmFtZXMKLSAqIChpLmUuLCB0aG9zZSBub3Qgc3RhcnRpbmcgd2l0aCAiLyIpIGFyZSBjb25zaWRlcmVkIHJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZSBEZXBsb3ltZW50IEZpbGUncwotICogbmFtZXNwYWNlLiAgQWJzb2x1dGUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZSBzdGFydGluZyB3aXRoICIvIikgYWxzbyBzcGVjaWZ5IG5hbWVzIGluIHRoZSByb290IG9mCi0gKiB0aGUgRGVwbG95bWVudCBGaWxlJ3MgbmFtZXNwYWNlLiAgSW4gZ2VuZXJhbCwgcmVsYXRpdmUgbmFtZXMgYXJlIHByZWZlcnJlZC4gIFRoZSBleGNlcHRpb24gaXMKLSAqIC53YXIgZmlsZXMgd2hlcmUgYWJzb2x1dGUgbmFtZXMgYXJlIHByZWZlcnJlZCBmb3IgY29uc2lzdGVuY3kgd2l0aCB0aGUgU2VydmxldCBBUEkuCi0gKiA8cC8+Ci0gKiA8cC8+Ci0gKiA8cC8+Ci0gKiA8cD5KYXZhIGNsYXNzIGZvciBwYXRoVHlwZSBjb21wbGV4IHR5cGUuCi0gKiA8cC8+Ci0gKiA8cD5UaGUgZm9sbG93aW5nIHNjaGVtYSBmcmFnbWVudCBzcGVjaWZpZXMgdGhlIGV4cGVjdGVkIGNvbnRlbnQgY29udGFpbmVkIHdpdGhpbiB0aGlzIGNsYXNzLgotICogPHAvPgotICogPHByZT4KLSAqICZsdDtjb21wbGV4VHlwZSBuYW1lPSJwYXRoVHlwZSI+Ci0gKiAgICZsdDtzaW1wbGVDb250ZW50PgotICogICAgICZsdDtyZXN0cmljdGlvbiBiYXNlPSImbHQ7aHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlPnN0cmluZyI+Ci0gKiAgICAgJmx0Oy9yZXN0cmljdGlvbj4KLSAqICAgJmx0Oy9zaW1wbGVDb250ZW50PgotICogJmx0Oy9jb21wbGV4VHlwZT4KLSAqIDwvcHJlPgotICovCi1AWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpCi1AWG1sVHlwZShuYW1lID0gInBhdGhUeXBlIikKLXB1YmxpYyBjbGFzcyBQYXRoVHlwZQotICAgICAgICBleHRlbmRzIFN0cmluZyB7Ci0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvUGVyc2lzdGVuY2VDb250ZXh0UmVmVHlwZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvUGVyc2lzdGVuY2VDb250ZXh0UmVmVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjRkMThhLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL1BlcnNpc3RlbmNlQ29udGV4dFJlZlR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLwotLy8gVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIEphdmFUTSBBcmNoaXRlY3R1cmUgZm9yIFhNTCBCaW5kaW5nKEpBWEIpIFJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbiwgdjIuMC1iNTItZmNzIAotLy8gU2VlIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGIiPmh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGI8L2E+IAotLy8gQW55IG1vZGlmaWNhdGlvbnMgdG8gdGhpcyBmaWxlIHdpbGwgYmUgbG9zdCB1cG9uIHJlY29tcGlsYXRpb24gb2YgdGhlIHNvdXJjZSBzY2hlbWEuIAotLy8gR2VuZXJhdGVkIG9uOiAyMDA3LjAzLjIxIGF0IDEwOjU2OjUxIEFNIENEVCAKLS8vCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLnhtbC5oYW5kbGVyOwotCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQXR0cmlidXRlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbElEOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLmFkYXB0ZXJzLkNvbGxhcHNlZFN0cmluZ0FkYXB0ZXI7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5hZGFwdGVycy5YbWxKYXZhVHlwZUFkYXB0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotCi0vKioKLSAqIFRoZSBwZXJzaXN0ZW5jZS1jb250ZXh0LXJlZiBlbGVtZW50IGNvbnRhaW5zIGEgZGVjbGFyYXRpb24gb2YgRGVwbG95bWVudCBDb21wb25lbnQncyByZWZlcmVuY2UgdG8KLSAqIGEgcGVyc2lzdGVuY2UgY29udGV4dCBhc3NvY2lhdGVkIHdpdGhpbiBhIERlcGxveW1lbnQgQ29tcG9uZW50J3MgZW52aXJvbm1lbnQuIEl0IGNvbnNpc3RzIG9mOgotICogPHAvPgotICogLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiAtIHRoZSBwZXJzaXN0ZW5jZSBjb250ZXh0IHJlZmVyZW5jZSBuYW1lIC0gYW4gb3B0aW9uYWwgcGVyc2lzdGVuY2UgdW5pdAotICogbmFtZS4gIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBkZWZhdWx0IHBlcnNpc3RlbmNlIHVuaXQgaXMgYXNzdW1lZC4gLSBhbiBvcHRpb25hbCBzcGVjaWZpY2F0aW9uIGFzCi0gKiB0byB3aGV0aGVyIHRoZSBwZXJzaXN0ZW5jZSBjb250ZXh0IHR5cGUgaXMgVHJhbnNhY3Rpb24gb3IgRXh0ZW5kZWQuICBJZiBub3Qgc3BlY2lmaWVkLAotICogVHJhbnNhY3Rpb24gaXMgYXNzdW1lZC4gLSBhbiBvcHRpb25hbCBsaXN0IG9mIHBlcnNpc3RlbmNlIHByb3BlcnRpZXMgLSBvcHRpb25hbCBpbmplY3Rpb24KLSAqIHRhcmdldHMKLSAqIDxwLz4KLSAqIEV4YW1wbGVzOgotICogPHAvPgotICogPHBlcnNpc3RlbmNlLWNvbnRleHQtcmVmPiA8cGVyc2lzdGVuY2UtY29udGV4dC1yZWYtbmFtZT5teVBlcnNpc3RlbmNlQ29udGV4dAotICogPC9wZXJzaXN0ZW5jZS1jb250ZXh0LXJlZi1uYW1lPiA8L3BlcnNpc3RlbmNlLWNvbnRleHQtcmVmPgotICogPHAvPgotICogPHBlcnNpc3RlbmNlLWNvbnRleHQtcmVmPiA8cGVyc2lzdGVuY2UtY29udGV4dC1yZWYtbmFtZT5teVBlcnNpc3RlbmNlQ29udGV4dAotICogPC9wZXJzaXN0ZW5jZS1jb250ZXh0LXJlZi1uYW1lPiA8cGVyc2lzdGVuY2UtdW5pdC1uYW1lPlBlcnNpc3RlbmNlVW5pdDEgPC9wZXJzaXN0ZW5jZS11bml0LW5hbWU+Ci0gKiA8cGVyc2lzdGVuY2UtY29udGV4dC10eXBlPkV4dGVuZGVkPC9wZXJzaXN0ZW5jZS1jb250ZXh0LXR5cGU+IDwvcGVyc2lzdGVuY2UtY29udGV4dC1yZWY+Ci0gKiA8cC8+Ci0gKiA8cC8+Ci0gKiA8cC8+Ci0gKiA8cC8+Ci0gKiA8cD5KYXZhIGNsYXNzIGZvciBwZXJzaXN0ZW5jZS1jb250ZXh0LXJlZlR5cGUgY29tcGxleCB0eXBlLgotICogPHAvPgotICogPHA+VGhlIGZvbGxvd2luZyBzY2hlbWEgZnJhZ21lbnQgc3BlY2lmaWVzIHRoZSBleHBlY3RlZCBjb250ZW50IGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBjbGFzcy4KLSAqIDxwLz4KLSAqIDxwcmU+Ci0gKiAmbHQ7Y29tcGxleFR5cGUgbmFtZT0icGVyc2lzdGVuY2UtY29udGV4dC1yZWZUeXBlIj4KLSAqICAgJmx0O2NvbXBsZXhDb250ZW50PgotICogICAgICZsdDtyZXN0cmljdGlvbiBiYXNlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9YW55VHlwZSI+Ci0gKiAgICAgICAmbHQ7c2VxdWVuY2U+Ci0gKiAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ7aHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlfWRlc2NyaXB0aW9uVHlwZSIKLSAqIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiLz4KLSAqICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0icGVyc2lzdGVuY2UtY29udGV4dC1yZWYtbmFtZSIgdHlwZT0ie2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZX1qbmRpLW5hbWVUeXBlIi8+Ci0gKiAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9InBlcnNpc3RlbmNlLXVuaXQtbmFtZSIgdHlwZT0ie2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZX1zdHJpbmciCi0gKiBtaW5PY2N1cnM9IjAiLz4KLSAqICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0icGVyc2lzdGVuY2UtY29udGV4dC10eXBlIiB0eXBlPSJ7aHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlfXBlcnNpc3RlbmNlLWNvbnRleHQtdHlwZVR5cGUiCi0gKiBtaW5PY2N1cnM9IjAiLz4KLSAqICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0icGVyc2lzdGVuY2UtcHJvcGVydHkiIHR5cGU9IntodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWV9cHJvcGVydHlUeXBlIgotICogbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCIvPgotICogICAgICAgICAmbHQ7Z3JvdXAgcmVmPSJ7aHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlfXJlc291cmNlR3JvdXAiLz4KLSAqICAgICAgICZsdDsvc2VxdWVuY2U+Ci0gKiAgICAgICAmbHQ7YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9SUQiIC8+Ci0gKiAgICAgJmx0Oy9yZXN0cmljdGlvbj4KLSAqICAgJmx0Oy9jb21wbGV4Q29udGVudD4KLSAqICZsdDsvY29tcGxleFR5cGU+Ci0gKiA8L3ByZT4KLSAqLwotQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKQotQFhtbFR5cGUobmFtZSA9ICJwZXJzaXN0ZW5jZS1jb250ZXh0LXJlZlR5cGUiLCBwcm9wT3JkZXIgPSB7Ci0gICAgICAgICJkZXNjcmlwdGlvbiIsCi0gICAgICAgICJwZXJzaXN0ZW5jZUNvbnRleHRSZWZOYW1lIiwKLSAgICAgICAgInBlcnNpc3RlbmNlVW5pdE5hbWUiLAotICAgICAgICAicGVyc2lzdGVuY2VDb250ZXh0VHlwZSIsCi0gICAgICAgICJwZXJzaXN0ZW5jZVByb3BlcnR5IiwKLSAgICAgICAgIm1hcHBlZE5hbWUiLAotICAgICAgICAiaW5qZWN0aW9uVGFyZ2V0IgotICAgICAgICB9KQotcHVibGljIGNsYXNzIFBlcnNpc3RlbmNlQ29udGV4dFJlZlR5cGUgewotCi0gICAgQFhtbEVsZW1lbnQobmFtZXNwYWNlID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIsIHJlcXVpcmVkID0gdHJ1ZSkKLSAgICBwcm90ZWN0ZWQgTGlzdDxEZXNjcmlwdGlvblR5cGU+IGRlc2NyaXB0aW9uOwotICAgIEBYbWxFbGVtZW50KG5hbWUgPSAicGVyc2lzdGVuY2UtY29udGV4dC1yZWYtbmFtZSIsCi0gICAgICAgICAgICAgICAgbmFtZXNwYWNlID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIsIHJlcXVpcmVkID0gdHJ1ZSkKLSAgICBwcm90ZWN0ZWQgSm5kaU5hbWVUeXBlIHBlcnNpc3RlbmNlQ29udGV4dFJlZk5hbWU7Ci0gICAgQFhtbEVsZW1lbnQobmFtZSA9ICJwZXJzaXN0ZW5jZS11bml0LW5hbWUiLCBuYW1lc3BhY2UgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIikKLSAgICBwcm90ZWN0ZWQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi54bWwuaGFuZGxlci5TdHJpbmcgcGVyc2lzdGVuY2VVbml0TmFtZTsKLSAgICBAWG1sRWxlbWVudChuYW1lID0gInBlcnNpc3RlbmNlLWNvbnRleHQtdHlwZSIsIG5hbWVzcGFjZSA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiKQotICAgIHByb3RlY3RlZCBQZXJzaXN0ZW5jZUNvbnRleHRUeXBlVHlwZSBwZXJzaXN0ZW5jZUNvbnRleHRUeXBlOwotICAgIEBYbWxFbGVtZW50KG5hbWUgPSAicGVyc2lzdGVuY2UtcHJvcGVydHkiLCBuYW1lc3BhY2UgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiwKLSAgICAgICAgICAgICAgICByZXF1aXJlZCA9IHRydWUpCi0gICAgcHJvdGVjdGVkIExpc3Q8UHJvcGVydHlUeXBlPiBwZXJzaXN0ZW5jZVByb3BlcnR5OwotICAgIEBYbWxFbGVtZW50KG5hbWUgPSAibWFwcGVkLW5hbWUiLCBuYW1lc3BhY2UgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIikKLSAgICBwcm90ZWN0ZWQgWHNkU3RyaW5nVHlwZSBtYXBwZWROYW1lOwotICAgIEBYbWxFbGVtZW50KG5hbWUgPSAiaW5qZWN0aW9uLXRhcmdldCIsIG5hbWVzcGFjZSA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiLAotICAgICAgICAgICAgICAgIHJlcXVpcmVkID0gdHJ1ZSkKLSAgICBwcm90ZWN0ZWQgTGlzdDxJbmplY3Rpb25UYXJnZXRUeXBlPiBpbmplY3Rpb25UYXJnZXQ7Ci0gICAgQFhtbEF0dHJpYnV0ZQotICAgIEBYbWxKYXZhVHlwZUFkYXB0ZXIoQ29sbGFwc2VkU3RyaW5nQWRhcHRlci5jbGFzcykKLSAgICBAWG1sSUQKLSAgICBwcm90ZWN0ZWQgamF2YS5sYW5nLlN0cmluZyBpZDsKLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBkZXNjcmlwdGlvbiBwcm9wZXJ0eS4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIFRoaXMgYWNjZXNzb3IgbWV0aG9kIHJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIGxpdmUgbGlzdCwgbm90IGEgc25hcHNob3QuIFRoZXJlZm9yZSBhbnkKLSAgICAgKiBtb2RpZmljYXRpb24geW91IG1ha2UgdG8gdGhlIHJldHVybmVkIGxpc3Qgd2lsbCBiZSBwcmVzZW50IGluc2lkZSB0aGUgSkFYQiBvYmplY3QuIFRoaXMgaXMKLSAgICAgKiB3aHkgdGhlcmUgaXMgbm90IGEgPENPREU+c2V0PC9DT0RFPiBtZXRob2QgZm9yIHRoZSBkZXNjcmlwdGlvbiBwcm9wZXJ0eS4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIEZvciBleGFtcGxlLCB0byBhZGQgYSBuZXcgaXRlbSwgZG8gYXMgZm9sbG93czoKLSAgICAgKiA8cHJlPgotICAgICAqICAgIGdldERlc2NyaXB0aW9uKCkuYWRkKG5ld0l0ZW0pOwotICAgICAqIDwvcHJlPgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIE9iamVjdHMgb2YgdGhlIGZvbGxvd2luZyB0eXBlKHMpIGFyZSBhbGxvd2VkIGluIHRoZSBsaXN0IHtAbGluayBEZXNjcmlwdGlvblR5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PERlc2NyaXB0aW9uVHlwZT4gZ2V0RGVzY3JpcHRpb24oKSB7Ci0gICAgICAgIGlmIChkZXNjcmlwdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICBkZXNjcmlwdGlvbiA9IG5ldyBBcnJheUxpc3Q8RGVzY3JpcHRpb25UeXBlPigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzLmRlc2NyaXB0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBwZXJzaXN0ZW5jZUNvbnRleHRSZWZOYW1lIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiBwb3NzaWJsZSBvYmplY3QgaXMge0BsaW5rIEpuZGlOYW1lVHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIEpuZGlOYW1lVHlwZSBnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZOYW1lKCkgewotICAgICAgICByZXR1cm4gcGVyc2lzdGVuY2VDb250ZXh0UmVmTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgcGVyc2lzdGVuY2VDb250ZXh0UmVmTmFtZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcyB7QGxpbmsgSm5kaU5hbWVUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZOYW1lKEpuZGlOYW1lVHlwZSB2YWx1ZSkgewotICAgICAgICB0aGlzLnBlcnNpc3RlbmNlQ29udGV4dFJlZk5hbWUgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgcGVyc2lzdGVuY2VVbml0TmFtZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzIHtAbGluayBTdHJpbmcgfQotICAgICAqLwotICAgIHB1YmxpYyBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLnhtbC5oYW5kbGVyLlN0cmluZyBnZXRQZXJzaXN0ZW5jZVVuaXROYW1lKCkgewotICAgICAgICByZXR1cm4gcGVyc2lzdGVuY2VVbml0TmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgcGVyc2lzdGVuY2VVbml0TmFtZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcyB7QGxpbmsgU3RyaW5nCi0gICAgICogICAgICAgICAgICAgIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQZXJzaXN0ZW5jZVVuaXROYW1lKAotICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi54bWwuaGFuZGxlci5TdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5wZXJzaXN0ZW5jZVVuaXROYW1lID0gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIHBlcnNpc3RlbmNlQ29udGV4dFR5cGUgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHBvc3NpYmxlIG9iamVjdCBpcyB7QGxpbmsgUGVyc2lzdGVuY2VDb250ZXh0VHlwZVR5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyBQZXJzaXN0ZW5jZUNvbnRleHRUeXBlVHlwZSBnZXRQZXJzaXN0ZW5jZUNvbnRleHRUeXBlKCkgewotICAgICAgICByZXR1cm4gcGVyc2lzdGVuY2VDb250ZXh0VHlwZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgcGVyc2lzdGVuY2VDb250ZXh0VHlwZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcyB7QGxpbmsgUGVyc2lzdGVuY2VDb250ZXh0VHlwZVR5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFBlcnNpc3RlbmNlQ29udGV4dFR5cGUoUGVyc2lzdGVuY2VDb250ZXh0VHlwZVR5cGUgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5wZXJzaXN0ZW5jZUNvbnRleHRUeXBlID0gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIHBlcnNpc3RlbmNlUHJvcGVydHkgcHJvcGVydHkuCi0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBUaGlzIGFjY2Vzc29yIG1ldGhvZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBsaXZlIGxpc3QsIG5vdCBhIHNuYXBzaG90LiBUaGVyZWZvcmUgYW55Ci0gICAgICogbW9kaWZpY2F0aW9uIHlvdSBtYWtlIHRvIHRoZSByZXR1cm5lZCBsaXN0IHdpbGwgYmUgcHJlc2VudCBpbnNpZGUgdGhlIEpBWEIgb2JqZWN0LiBUaGlzIGlzCi0gICAgICogd2h5IHRoZXJlIGlzIG5vdCBhIDxDT0RFPnNldDwvQ09ERT4gbWV0aG9kIGZvciB0aGUgcGVyc2lzdGVuY2VQcm9wZXJ0eSBwcm9wZXJ0eS4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIEZvciBleGFtcGxlLCB0byBhZGQgYSBuZXcgaXRlbSwgZG8gYXMgZm9sbG93czoKLSAgICAgKiA8cHJlPgotICAgICAqICAgIGdldFBlcnNpc3RlbmNlUHJvcGVydHkoKS5hZGQobmV3SXRlbSk7Ci0gICAgICogPC9wcmU+Ci0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogT2JqZWN0cyBvZiB0aGUgZm9sbG93aW5nIHR5cGUocykgYXJlIGFsbG93ZWQgaW4gdGhlIGxpc3Qge0BsaW5rIFByb3BlcnR5VHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIExpc3Q8UHJvcGVydHlUeXBlPiBnZXRQZXJzaXN0ZW5jZVByb3BlcnR5KCkgewotICAgICAgICBpZiAocGVyc2lzdGVuY2VQcm9wZXJ0eSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBwZXJzaXN0ZW5jZVByb3BlcnR5ID0gbmV3IEFycmF5TGlzdDxQcm9wZXJ0eVR5cGU+KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMucGVyc2lzdGVuY2VQcm9wZXJ0eTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgbWFwcGVkTmFtZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzIHtAbGluayBYc2RTdHJpbmdUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgWHNkU3RyaW5nVHlwZSBnZXRNYXBwZWROYW1lKCkgewotICAgICAgICByZXR1cm4gbWFwcGVkTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgbWFwcGVkTmFtZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcyB7QGxpbmsgWHNkU3RyaW5nVHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TWFwcGVkTmFtZShYc2RTdHJpbmdUeXBlIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMubWFwcGVkTmFtZSA9IHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBpbmplY3Rpb25UYXJnZXQgcHJvcGVydHkuCi0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBUaGlzIGFjY2Vzc29yIG1ldGhvZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBsaXZlIGxpc3QsIG5vdCBhIHNuYXBzaG90LiBUaGVyZWZvcmUgYW55Ci0gICAgICogbW9kaWZpY2F0aW9uIHlvdSBtYWtlIHRvIHRoZSByZXR1cm5lZCBsaXN0IHdpbGwgYmUgcHJlc2VudCBpbnNpZGUgdGhlIEpBWEIgb2JqZWN0LiBUaGlzIGlzCi0gICAgICogd2h5IHRoZXJlIGlzIG5vdCBhIDxDT0RFPnNldDwvQ09ERT4gbWV0aG9kIGZvciB0aGUgaW5qZWN0aW9uVGFyZ2V0IHByb3BlcnR5LgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogRm9yIGV4YW1wbGUsIHRvIGFkZCBhIG5ldyBpdGVtLCBkbyBhcyBmb2xsb3dzOgotICAgICAqIDxwcmU+Ci0gICAgICogICAgZ2V0SW5qZWN0aW9uVGFyZ2V0KCkuYWRkKG5ld0l0ZW0pOwotICAgICAqIDwvcHJlPgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIE9iamVjdHMgb2YgdGhlIGZvbGxvd2luZyB0eXBlKHMpIGFyZSBhbGxvd2VkIGluIHRoZSBsaXN0IHtAbGluayBJbmplY3Rpb25UYXJnZXRUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxJbmplY3Rpb25UYXJnZXRUeXBlPiBnZXRJbmplY3Rpb25UYXJnZXQoKSB7Ci0gICAgICAgIGlmIChpbmplY3Rpb25UYXJnZXQgPT0gbnVsbCkgewotICAgICAgICAgICAgaW5qZWN0aW9uVGFyZ2V0ID0gbmV3IEFycmF5TGlzdDxJbmplY3Rpb25UYXJnZXRUeXBlPigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzLmluamVjdGlvblRhcmdldDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgaWQgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHBvc3NpYmxlIG9iamVjdCBpcyB7QGxpbmsgamF2YS5sYW5nLlN0cmluZyB9Ci0gICAgICovCi0gICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0SWQoKSB7Ci0gICAgICAgIHJldHVybiBpZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgaWQgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgYWxsb3dlZCBvYmplY3QgaXMge0BsaW5rIGphdmEubGFuZy5TdHJpbmcgfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldElkKGphdmEubGFuZy5TdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5pZCA9IHZhbHVlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvUGVyc2lzdGVuY2VDb250ZXh0VHlwZVR5cGUuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL1BlcnNpc3RlbmNlQ29udGV4dFR5cGVUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxODAyMzAuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvUGVyc2lzdGVuY2VDb250ZXh0VHlwZVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vCi0vLyBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSB0aGUgSmF2YVRNIEFyY2hpdGVjdHVyZSBmb3IgWE1MIEJpbmRpbmcoSkFYQikgUmVmZXJlbmNlIEltcGxlbWVudGF0aW9uLCB2Mi4wLWI1Mi1mY3MgCi0vLyBTZWUgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YiI+aHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YjwvYT4gCi0vLyBBbnkgbW9kaWZpY2F0aW9ucyB0byB0aGlzIGZpbGUgd2lsbCBiZSBsb3N0IHVwb24gcmVjb21waWxhdGlvbiBvZiB0aGUgc291cmNlIHNjaGVtYS4gCi0vLyBHZW5lcmF0ZWQgb246IDIwMDcuMDMuMjEgYXQgMTA6NTY6NTEgQU0gQ0RUIAotLy8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24ueG1sLmhhbmRsZXI7Ci0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlOwotCi0KLS8qKgotICogVGhlIHBlcnNpc3RlbmNlLWNvbnRleHQtdHlwZVR5cGUgc3BlY2lmaWVzIHRoZSB0cmFuc2FjdGlvbmFsIG5hdHVyZSBvZiBhIHBlcnNpc3RlbmNlIGNvbnRleHQKLSAqIHJlZmVyZW5jZS4KLSAqIDxwLz4KLSAqIFRoZSB2YWx1ZSBvZiB0aGUgcGVyc2lzdGVuY2UtY29udGV4dC10eXBlIGVsZW1lbnQgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzogVHJhbnNhY3Rpb24KLSAqIEV4dGVuZGVkCi0gKiA8cC8+Ci0gKiA8cC8+Ci0gKiA8cC8+Ci0gKiA8cD5KYXZhIGNsYXNzIGZvciBwZXJzaXN0ZW5jZS1jb250ZXh0LXR5cGVUeXBlIGNvbXBsZXggdHlwZS4KLSAqIDxwLz4KLSAqIDxwPlRoZSBmb2xsb3dpbmcgc2NoZW1hIGZyYWdtZW50IHNwZWNpZmllcyB0aGUgZXhwZWN0ZWQgY29udGVudCBjb250YWluZWQgd2l0aGluIHRoaXMgY2xhc3MuCi0gKiA8cC8+Ci0gKiA8cHJlPgotICogJmx0O2NvbXBsZXhUeXBlIG5hbWU9InBlcnNpc3RlbmNlLWNvbnRleHQtdHlwZVR5cGUiPgotICogICAmbHQ7c2ltcGxlQ29udGVudD4KLSAqICAgICAmbHQ7cmVzdHJpY3Rpb24gYmFzZT0iJmx0O2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZT5zdHJpbmciPgotICogICAgICZsdDsvcmVzdHJpY3Rpb24+Ci0gKiAgICZsdDsvc2ltcGxlQ29udGVudD4KLSAqICZsdDsvY29tcGxleFR5cGU+Ci0gKiA8L3ByZT4KLSAqLwotQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKQotQFhtbFR5cGUobmFtZSA9ICJwZXJzaXN0ZW5jZS1jb250ZXh0LXR5cGVUeXBlIikKLXB1YmxpYyBjbGFzcyBQZXJzaXN0ZW5jZUNvbnRleHRUeXBlVHlwZQotICAgICAgICBleHRlbmRzIFN0cmluZyB7Ci0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvUGVyc2lzdGVuY2VVbml0UmVmVHlwZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvUGVyc2lzdGVuY2VVbml0UmVmVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWQwNGRhLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL1BlcnNpc3RlbmNlVW5pdFJlZlR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLwotLy8gVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIEphdmFUTSBBcmNoaXRlY3R1cmUgZm9yIFhNTCBCaW5kaW5nKEpBWEIpIFJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbiwgdjIuMC1iNTItZmNzIAotLy8gU2VlIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGIiPmh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGI8L2E+IAotLy8gQW55IG1vZGlmaWNhdGlvbnMgdG8gdGhpcyBmaWxlIHdpbGwgYmUgbG9zdCB1cG9uIHJlY29tcGlsYXRpb24gb2YgdGhlIHNvdXJjZSBzY2hlbWEuIAotLy8gR2VuZXJhdGVkIG9uOiAyMDA3LjAzLjIxIGF0IDEwOjU2OjUxIEFNIENEVCAKLS8vCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLnhtbC5oYW5kbGVyOwotCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQXR0cmlidXRlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbElEOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLmFkYXB0ZXJzLkNvbGxhcHNlZFN0cmluZ0FkYXB0ZXI7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5hZGFwdGVycy5YbWxKYXZhVHlwZUFkYXB0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotCi0vKioKLSAqIFRoZSBwZXJzaXN0ZW5jZS11bml0LXJlZiBlbGVtZW50IGNvbnRhaW5zIGEgZGVjbGFyYXRpb24gb2YgRGVwbG95bWVudCBDb21wb25lbnQncyByZWZlcmVuY2UgdG8gYQotICogcGVyc2lzdGVuY2UgdW5pdCBhc3NvY2lhdGVkIHdpdGhpbiBhIERlcGxveW1lbnQgQ29tcG9uZW50J3MgZW52aXJvbm1lbnQuIEl0IGNvbnNpc3RzIG9mOgotICogPHAvPgotICogLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiAtIHRoZSBwZXJzaXN0ZW5jZSB1bml0IHJlZmVyZW5jZSBuYW1lIC0gYW4gb3B0aW9uYWwgcGVyc2lzdGVuY2UgdW5pdAotICogbmFtZS4gIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBkZWZhdWx0IHBlcnNpc3RlbmNlIHVuaXQgaXMgYXNzdW1lZC4gLSBvcHRpb25hbCBpbmplY3Rpb24gdGFyZ2V0cwotICogPHAvPgotICogRXhhbXBsZXM6Ci0gKiA8cC8+Ci0gKiA8cGVyc2lzdGVuY2UtdW5pdC1yZWY+IDxwZXJzaXN0ZW5jZS11bml0LXJlZi1uYW1lPm15UGVyc2lzdGVuY2VVbml0IDwvcGVyc2lzdGVuY2UtdW5pdC1yZWYtbmFtZT4KLSAqIDwvcGVyc2lzdGVuY2UtdW5pdC1yZWY+Ci0gKiA8cC8+Ci0gKiA8cGVyc2lzdGVuY2UtdW5pdC1yZWY+IDxwZXJzaXN0ZW5jZS11bml0LXJlZi1uYW1lPm15UGVyc2lzdGVuY2VVbml0IDwvcGVyc2lzdGVuY2UtdW5pdC1yZWYtbmFtZT4KLSAqIDxwZXJzaXN0ZW5jZS11bml0LW5hbWU+UGVyc2lzdGVuY2VVbml0MSA8L3BlcnNpc3RlbmNlLXVuaXQtbmFtZT4gPC9wZXJzaXN0ZW5jZS11bml0LXJlZj4KLSAqIDxwLz4KLSAqIDxwLz4KLSAqIDxwLz4KLSAqIDxwLz4KLSAqIDxwPkphdmEgY2xhc3MgZm9yIHBlcnNpc3RlbmNlLXVuaXQtcmVmVHlwZSBjb21wbGV4IHR5cGUuCi0gKiA8cC8+Ci0gKiA8cD5UaGUgZm9sbG93aW5nIHNjaGVtYSBmcmFnbWVudCBzcGVjaWZpZXMgdGhlIGV4cGVjdGVkIGNvbnRlbnQgY29udGFpbmVkIHdpdGhpbiB0aGlzIGNsYXNzLgotICogPHAvPgotICogPHByZT4KLSAqICZsdDtjb21wbGV4VHlwZSBuYW1lPSJwZXJzaXN0ZW5jZS11bml0LXJlZlR5cGUiPgotICogICAmbHQ7Y29tcGxleENvbnRlbnQ+Ci0gKiAgICAgJmx0O3Jlc3RyaWN0aW9uIGJhc2U9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1hbnlUeXBlIj4KLSAqICAgICAgICZsdDtzZXF1ZW5jZT4KLSAqICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9IntodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWV9ZGVzY3JpcHRpb25UeXBlIgotICogbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCIvPgotICogICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJwZXJzaXN0ZW5jZS11bml0LXJlZi1uYW1lIiB0eXBlPSJ7aHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlfWpuZGktbmFtZVR5cGUiLz4KLSAqICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0icGVyc2lzdGVuY2UtdW5pdC1uYW1lIiB0eXBlPSJ7aHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlfXN0cmluZyIKLSAqIG1pbk9jY3Vycz0iMCIvPgotICogICAgICAgICAmbHQ7Z3JvdXAgcmVmPSJ7aHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlfXJlc291cmNlR3JvdXAiLz4KLSAqICAgICAgICZsdDsvc2VxdWVuY2U+Ci0gKiAgICAgICAmbHQ7YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9SUQiIC8+Ci0gKiAgICAgJmx0Oy9yZXN0cmljdGlvbj4KLSAqICAgJmx0Oy9jb21wbGV4Q29udGVudD4KLSAqICZsdDsvY29tcGxleFR5cGU+Ci0gKiA8L3ByZT4KLSAqLwotQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKQotQFhtbFR5cGUobmFtZSA9ICJwZXJzaXN0ZW5jZS11bml0LXJlZlR5cGUiLCBwcm9wT3JkZXIgPSB7Ci0gICAgICAgICJkZXNjcmlwdGlvbiIsCi0gICAgICAgICJwZXJzaXN0ZW5jZVVuaXRSZWZOYW1lIiwKLSAgICAgICAgInBlcnNpc3RlbmNlVW5pdE5hbWUiLAotICAgICAgICAibWFwcGVkTmFtZSIsCi0gICAgICAgICJpbmplY3Rpb25UYXJnZXQiCi0gICAgICAgIH0pCi1wdWJsaWMgY2xhc3MgUGVyc2lzdGVuY2VVbml0UmVmVHlwZSB7Ci0KLSAgICBAWG1sRWxlbWVudChuYW1lc3BhY2UgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiwgcmVxdWlyZWQgPSB0cnVlKQotICAgIHByb3RlY3RlZCBMaXN0PERlc2NyaXB0aW9uVHlwZT4gZGVzY3JpcHRpb247Ci0gICAgQFhtbEVsZW1lbnQobmFtZSA9ICJwZXJzaXN0ZW5jZS11bml0LXJlZi1uYW1lIiwgbmFtZXNwYWNlID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIsCi0gICAgICAgICAgICAgICAgcmVxdWlyZWQgPSB0cnVlKQotICAgIHByb3RlY3RlZCBKbmRpTmFtZVR5cGUgcGVyc2lzdGVuY2VVbml0UmVmTmFtZTsKLSAgICBAWG1sRWxlbWVudChuYW1lID0gInBlcnNpc3RlbmNlLXVuaXQtbmFtZSIsIG5hbWVzcGFjZSA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiKQotICAgIHByb3RlY3RlZCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLnhtbC5oYW5kbGVyLlN0cmluZyBwZXJzaXN0ZW5jZVVuaXROYW1lOwotICAgIEBYbWxFbGVtZW50KG5hbWUgPSAibWFwcGVkLW5hbWUiLCBuYW1lc3BhY2UgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIikKLSAgICBwcm90ZWN0ZWQgWHNkU3RyaW5nVHlwZSBtYXBwZWROYW1lOwotICAgIEBYbWxFbGVtZW50KG5hbWUgPSAiaW5qZWN0aW9uLXRhcmdldCIsIG5hbWVzcGFjZSA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiLAotICAgICAgICAgICAgICAgIHJlcXVpcmVkID0gdHJ1ZSkKLSAgICBwcm90ZWN0ZWQgTGlzdDxJbmplY3Rpb25UYXJnZXRUeXBlPiBpbmplY3Rpb25UYXJnZXQ7Ci0gICAgQFhtbEF0dHJpYnV0ZQotICAgIEBYbWxKYXZhVHlwZUFkYXB0ZXIoQ29sbGFwc2VkU3RyaW5nQWRhcHRlci5jbGFzcykKLSAgICBAWG1sSUQKLSAgICBwcm90ZWN0ZWQgamF2YS5sYW5nLlN0cmluZyBpZDsKLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBkZXNjcmlwdGlvbiBwcm9wZXJ0eS4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIFRoaXMgYWNjZXNzb3IgbWV0aG9kIHJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIGxpdmUgbGlzdCwgbm90IGEgc25hcHNob3QuIFRoZXJlZm9yZSBhbnkKLSAgICAgKiBtb2RpZmljYXRpb24geW91IG1ha2UgdG8gdGhlIHJldHVybmVkIGxpc3Qgd2lsbCBiZSBwcmVzZW50IGluc2lkZSB0aGUgSkFYQiBvYmplY3QuIFRoaXMgaXMKLSAgICAgKiB3aHkgdGhlcmUgaXMgbm90IGEgPENPREU+c2V0PC9DT0RFPiBtZXRob2QgZm9yIHRoZSBkZXNjcmlwdGlvbiBwcm9wZXJ0eS4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIEZvciBleGFtcGxlLCB0byBhZGQgYSBuZXcgaXRlbSwgZG8gYXMgZm9sbG93czoKLSAgICAgKiA8cHJlPgotICAgICAqICAgIGdldERlc2NyaXB0aW9uKCkuYWRkKG5ld0l0ZW0pOwotICAgICAqIDwvcHJlPgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIE9iamVjdHMgb2YgdGhlIGZvbGxvd2luZyB0eXBlKHMpIGFyZSBhbGxvd2VkIGluIHRoZSBsaXN0IHtAbGluayBEZXNjcmlwdGlvblR5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PERlc2NyaXB0aW9uVHlwZT4gZ2V0RGVzY3JpcHRpb24oKSB7Ci0gICAgICAgIGlmIChkZXNjcmlwdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICBkZXNjcmlwdGlvbiA9IG5ldyBBcnJheUxpc3Q8RGVzY3JpcHRpb25UeXBlPigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzLmRlc2NyaXB0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBwZXJzaXN0ZW5jZVVuaXRSZWZOYW1lIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiBwb3NzaWJsZSBvYmplY3QgaXMge0BsaW5rIEpuZGlOYW1lVHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIEpuZGlOYW1lVHlwZSBnZXRQZXJzaXN0ZW5jZVVuaXRSZWZOYW1lKCkgewotICAgICAgICByZXR1cm4gcGVyc2lzdGVuY2VVbml0UmVmTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgcGVyc2lzdGVuY2VVbml0UmVmTmFtZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcyB7QGxpbmsgSm5kaU5hbWVUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQZXJzaXN0ZW5jZVVuaXRSZWZOYW1lKEpuZGlOYW1lVHlwZSB2YWx1ZSkgewotICAgICAgICB0aGlzLnBlcnNpc3RlbmNlVW5pdFJlZk5hbWUgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgcGVyc2lzdGVuY2VVbml0TmFtZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzIHtAbGluayBTdHJpbmcgfQotICAgICAqLwotICAgIHB1YmxpYyBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLnhtbC5oYW5kbGVyLlN0cmluZyBnZXRQZXJzaXN0ZW5jZVVuaXROYW1lKCkgewotICAgICAgICByZXR1cm4gcGVyc2lzdGVuY2VVbml0TmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgcGVyc2lzdGVuY2VVbml0TmFtZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcyB7QGxpbmsgU3RyaW5nCi0gICAgICogICAgICAgICAgICAgIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQZXJzaXN0ZW5jZVVuaXROYW1lKAotICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi54bWwuaGFuZGxlci5TdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5wZXJzaXN0ZW5jZVVuaXROYW1lID0gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIG1hcHBlZE5hbWUgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHBvc3NpYmxlIG9iamVjdCBpcyB7QGxpbmsgWHNkU3RyaW5nVHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIFhzZFN0cmluZ1R5cGUgZ2V0TWFwcGVkTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG1hcHBlZE5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIG1hcHBlZE5hbWUgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgYWxsb3dlZCBvYmplY3QgaXMge0BsaW5rIFhzZFN0cmluZ1R5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE1hcHBlZE5hbWUoWHNkU3RyaW5nVHlwZSB2YWx1ZSkgewotICAgICAgICB0aGlzLm1hcHBlZE5hbWUgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgaW5qZWN0aW9uVGFyZ2V0IHByb3BlcnR5LgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhpcyBhY2Nlc3NvciBtZXRob2QgcmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgbGl2ZSBsaXN0LCBub3QgYSBzbmFwc2hvdC4gVGhlcmVmb3JlIGFueQotICAgICAqIG1vZGlmaWNhdGlvbiB5b3UgbWFrZSB0byB0aGUgcmV0dXJuZWQgbGlzdCB3aWxsIGJlIHByZXNlbnQgaW5zaWRlIHRoZSBKQVhCIG9iamVjdC4gVGhpcyBpcwotICAgICAqIHdoeSB0aGVyZSBpcyBub3QgYSA8Q09ERT5zZXQ8L0NPREU+IG1ldGhvZCBmb3IgdGhlIGluamVjdGlvblRhcmdldCBwcm9wZXJ0eS4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIEZvciBleGFtcGxlLCB0byBhZGQgYSBuZXcgaXRlbSwgZG8gYXMgZm9sbG93czoKLSAgICAgKiA8cHJlPgotICAgICAqICAgIGdldEluamVjdGlvblRhcmdldCgpLmFkZChuZXdJdGVtKTsKLSAgICAgKiA8L3ByZT4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBPYmplY3RzIG9mIHRoZSBmb2xsb3dpbmcgdHlwZShzKSBhcmUgYWxsb3dlZCBpbiB0aGUgbGlzdCB7QGxpbmsgSW5qZWN0aW9uVGFyZ2V0VHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIExpc3Q8SW5qZWN0aW9uVGFyZ2V0VHlwZT4gZ2V0SW5qZWN0aW9uVGFyZ2V0KCkgewotICAgICAgICBpZiAoaW5qZWN0aW9uVGFyZ2V0ID09IG51bGwpIHsKLSAgICAgICAgICAgIGluamVjdGlvblRhcmdldCA9IG5ldyBBcnJheUxpc3Q8SW5qZWN0aW9uVGFyZ2V0VHlwZT4oKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpcy5pbmplY3Rpb25UYXJnZXQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGlkIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiBwb3NzaWJsZSBvYmplY3QgaXMge0BsaW5rIGphdmEubGFuZy5TdHJpbmcgfQotICAgICAqLwotICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldElkKCkgewotICAgICAgICByZXR1cm4gaWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGlkIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIGFsbG93ZWQgb2JqZWN0IGlzIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJZChqYXZhLmxhbmcuU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMuaWQgPSB2YWx1ZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL1BvcnRDb21wb25lbnRSZWZUeXBlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9Qb3J0Q29tcG9uZW50UmVmVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTlkN2Y4Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL1BvcnRDb21wb25lbnRSZWZUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8KLS8vIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IHRoZSBKYXZhVE0gQXJjaGl0ZWN0dXJlIGZvciBYTUwgQmluZGluZyhKQVhCKSBSZWZlcmVuY2UgSW1wbGVtZW50YXRpb24sIHYyLjAtYjUyLWZjcyAKLS8vIFNlZSA8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9qYXhiIj5odHRwOi8vamF2YS5zdW4uY29tL3htbC9qYXhiPC9hPiAKLS8vIEFueSBtb2RpZmljYXRpb25zIHRvIHRoaXMgZmlsZSB3aWxsIGJlIGxvc3QgdXBvbiByZWNvbXBpbGF0aW9uIG9mIHRoZSBzb3VyY2Ugc2NoZW1hLiAKLS8vIEdlbmVyYXRlZCBvbjogMjAwNy4wMy4yMSBhdCAxMDo1Njo1MSBBTSBDRFQgCi0vLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi54bWwuaGFuZGxlcjsKLQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEF0dHJpYnV0ZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxJRDsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5hZGFwdGVycy5Db2xsYXBzZWRTdHJpbmdBZGFwdGVyOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uYWRhcHRlcnMuWG1sSmF2YVR5cGVBZGFwdGVyOwotCi0KLS8qKgotICogVGhlIHBvcnQtY29tcG9uZW50LXJlZiBlbGVtZW50IGRlY2xhcmVzIGEgY2xpZW50IGRlcGVuZGVuY3kgb24gdGhlIGNvbnRhaW5lciBmb3IgcmVzb2x2aW5nIGEKLSAqIFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlIHRvIGEgV1NETCBwb3J0LiBJdCBvcHRpb25hbGx5IGFzc29jaWF0ZXMgdGhlIFNlcnZpY2UgRW5kcG9pbnQKLSAqIEludGVyZmFjZSB3aXRoIGEgcGFydGljdWxhciBwb3J0LWNvbXBvbmVudC4gVGhpcyBpcyBvbmx5IHVzZWQgYnkgdGhlIGNvbnRhaW5lciBmb3IgYQotICogU2VydmljZS5nZXRQb3J0KENsYXNzKSBtZXRob2QgY2FsbC4KLSAqIDxwLz4KLSAqIDxwLz4KLSAqIDxwLz4KLSAqIDxwPkphdmEgY2xhc3MgZm9yIHBvcnQtY29tcG9uZW50LXJlZlR5cGUgY29tcGxleCB0eXBlLgotICogPHAvPgotICogPHA+VGhlIGZvbGxvd2luZyBzY2hlbWEgZnJhZ21lbnQgc3BlY2lmaWVzIHRoZSBleHBlY3RlZCBjb250ZW50IGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBjbGFzcy4KLSAqIDxwLz4KLSAqIDxwcmU+Ci0gKiAmbHQ7Y29tcGxleFR5cGUgbmFtZT0icG9ydC1jb21wb25lbnQtcmVmVHlwZSI+Ci0gKiAgICZsdDtjb21wbGV4Q29udGVudD4KLSAqICAgICAmbHQ7cmVzdHJpY3Rpb24gYmFzZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfWFueVR5cGUiPgotICogICAgICAgJmx0O3NlcXVlbmNlPgotICogICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJzZXJ2aWNlLWVuZHBvaW50LWludGVyZmFjZSIgdHlwZT0ie2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZX1mdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIi8+Ci0gKiAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9ImVuYWJsZS1tdG9tIiB0eXBlPSJ7aHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlfXRydWUtZmFsc2VUeXBlIgotICogbWluT2NjdXJzPSIwIi8+Ci0gKiAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9InBvcnQtY29tcG9uZW50LWxpbmsiIHR5cGU9IntodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWV9c3RyaW5nIgotICogbWluT2NjdXJzPSIwIi8+Ci0gKiAgICAgICAmbHQ7L3NlcXVlbmNlPgotICogICAgICAgJmx0O2F0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfUlEIiAvPgotICogICAgICZsdDsvcmVzdHJpY3Rpb24+Ci0gKiAgICZsdDsvY29tcGxleENvbnRlbnQ+Ci0gKiAmbHQ7L2NvbXBsZXhUeXBlPgotICogPC9wcmU+Ci0gKi8KLUBYbWxBY2Nlc3NvclR5cGUoWG1sQWNjZXNzVHlwZS5GSUVMRCkKLUBYbWxUeXBlKG5hbWUgPSAicG9ydC1jb21wb25lbnQtcmVmVHlwZSIsIHByb3BPcmRlciA9IHsKLSAgICAgICAgInNlcnZpY2VFbmRwb2ludEludGVyZmFjZSIsCi0gICAgICAgICJlbmFibGVNdG9tIiwKLSAgICAgICAgInBvcnRDb21wb25lbnRMaW5rIgotICAgICAgICB9KQotcHVibGljIGNsYXNzIFBvcnRDb21wb25lbnRSZWZUeXBlIHsKLQotICAgIEBYbWxFbGVtZW50KG5hbWUgPSAic2VydmljZS1lbmRwb2ludC1pbnRlcmZhY2UiLAotICAgICAgICAgICAgICAgIG5hbWVzcGFjZSA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiLCByZXF1aXJlZCA9IHRydWUpCi0gICAgcHJvdGVjdGVkIEZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlIHNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsKLSAgICBAWG1sRWxlbWVudChuYW1lID0gImVuYWJsZS1tdG9tIiwgbmFtZXNwYWNlID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIpCi0gICAgcHJvdGVjdGVkIFRydWVGYWxzZVR5cGUgZW5hYmxlTXRvbTsKLSAgICBAWG1sRWxlbWVudChuYW1lID0gInBvcnQtY29tcG9uZW50LWxpbmsiLCBuYW1lc3BhY2UgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIikKLSAgICBwcm90ZWN0ZWQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi54bWwuaGFuZGxlci5TdHJpbmcgcG9ydENvbXBvbmVudExpbms7Ci0gICAgQFhtbEF0dHJpYnV0ZQotICAgIEBYbWxKYXZhVHlwZUFkYXB0ZXIoQ29sbGFwc2VkU3RyaW5nQWRhcHRlci5jbGFzcykKLSAgICBAWG1sSUQKLSAgICBwcm90ZWN0ZWQgamF2YS5sYW5nLlN0cmluZyBpZDsKLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHBvc3NpYmxlIG9iamVjdCBpcyB7QGxpbmsgRnVsbHlRdWFsaWZpZWRDbGFzc1R5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyBGdWxseVF1YWxpZmllZENsYXNzVHlwZSBnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKSB7Ci0gICAgICAgIHJldHVybiBzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcyB7QGxpbmsgRnVsbHlRdWFsaWZpZWRDbGFzc1R5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZShGdWxseVF1YWxpZmllZENsYXNzVHlwZSB2YWx1ZSkgewotICAgICAgICB0aGlzLnNlcnZpY2VFbmRwb2ludEludGVyZmFjZSA9IHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBlbmFibGVNdG9tIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiBwb3NzaWJsZSBvYmplY3QgaXMge0BsaW5rIFRydWVGYWxzZVR5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyBUcnVlRmFsc2VUeXBlIGdldEVuYWJsZU10b20oKSB7Ci0gICAgICAgIHJldHVybiBlbmFibGVNdG9tOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBlbmFibGVNdG9tIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIGFsbG93ZWQgb2JqZWN0IGlzIHtAbGluayBUcnVlRmFsc2VUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRFbmFibGVNdG9tKFRydWVGYWxzZVR5cGUgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5lbmFibGVNdG9tID0gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIHBvcnRDb21wb25lbnRMaW5rIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiBwb3NzaWJsZSBvYmplY3QgaXMge0BsaW5rIFN0cmluZyB9Ci0gICAgICovCi0gICAgcHVibGljIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24ueG1sLmhhbmRsZXIuU3RyaW5nIGdldFBvcnRDb21wb25lbnRMaW5rKCkgewotICAgICAgICByZXR1cm4gcG9ydENvbXBvbmVudExpbms7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHBvcnRDb21wb25lbnRMaW5rIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIGFsbG93ZWQgb2JqZWN0IGlzIHtAbGluayBTdHJpbmcKLSAgICAgKiAgICAgICAgICAgICAgfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFBvcnRDb21wb25lbnRMaW5rKG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24ueG1sLmhhbmRsZXIuU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMucG9ydENvbXBvbmVudExpbmsgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgaWQgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHBvc3NpYmxlIG9iamVjdCBpcyB7QGxpbmsgamF2YS5sYW5nLlN0cmluZyB9Ci0gICAgICovCi0gICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0SWQoKSB7Ci0gICAgICAgIHJldHVybiBpZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgaWQgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgYWxsb3dlZCBvYmplY3QgaXMge0BsaW5rIGphdmEubGFuZy5TdHJpbmcgfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldElkKGphdmEubGFuZy5TdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5pZCA9IHZhbHVlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvUHJvcGVydHlUeXBlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9Qcm9wZXJ0eVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDMyMDE3ZC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9Qcm9wZXJ0eVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLwotLy8gVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIEphdmFUTSBBcmNoaXRlY3R1cmUgZm9yIFhNTCBCaW5kaW5nKEpBWEIpIFJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbiwgdjIuMC1iNTItZmNzIAotLy8gU2VlIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGIiPmh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGI8L2E+IAotLy8gQW55IG1vZGlmaWNhdGlvbnMgdG8gdGhpcyBmaWxlIHdpbGwgYmUgbG9zdCB1cG9uIHJlY29tcGlsYXRpb24gb2YgdGhlIHNvdXJjZSBzY2hlbWEuIAotLy8gR2VuZXJhdGVkIG9uOiAyMDA3LjAzLjIxIGF0IDEwOjU2OjUxIEFNIENEVCAKLS8vCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLnhtbC5oYW5kbGVyOwotCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQXR0cmlidXRlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbElEOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLmFkYXB0ZXJzLkNvbGxhcHNlZFN0cmluZ0FkYXB0ZXI7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5hZGFwdGVycy5YbWxKYXZhVHlwZUFkYXB0ZXI7Ci0KLQotLyoqCi0gKiBTcGVjaWZpZXMgYSBuYW1lL3ZhbHVlIHBhaXIuCi0gKiA8cC8+Ci0gKiA8cC8+Ci0gKiA8cC8+Ci0gKiA8cD5KYXZhIGNsYXNzIGZvciBwcm9wZXJ0eVR5cGUgY29tcGxleCB0eXBlLgotICogPHAvPgotICogPHA+VGhlIGZvbGxvd2luZyBzY2hlbWEgZnJhZ21lbnQgc3BlY2lmaWVzIHRoZSBleHBlY3RlZCBjb250ZW50IGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBjbGFzcy4KLSAqIDxwLz4KLSAqIDxwcmU+Ci0gKiAmbHQ7Y29tcGxleFR5cGUgbmFtZT0icHJvcGVydHlUeXBlIj4KLSAqICAgJmx0O2NvbXBsZXhDb250ZW50PgotICogICAgICZsdDtyZXN0cmljdGlvbiBiYXNlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9YW55VHlwZSI+Ci0gKiAgICAgICAmbHQ7c2VxdWVuY2U+Ci0gKiAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9Im5hbWUiIHR5cGU9IntodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWV9eHNkU3RyaW5nVHlwZSIvPgotICogICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJ2YWx1ZSIgdHlwZT0ie2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZX14c2RTdHJpbmdUeXBlIi8+Ci0gKiAgICAgICAmbHQ7L3NlcXVlbmNlPgotICogICAgICAgJmx0O2F0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfUlEIiAvPgotICogICAgICZsdDsvcmVzdHJpY3Rpb24+Ci0gKiAgICZsdDsvY29tcGxleENvbnRlbnQ+Ci0gKiAmbHQ7L2NvbXBsZXhUeXBlPgotICogPC9wcmU+Ci0gKi8KLUBYbWxBY2Nlc3NvclR5cGUoWG1sQWNjZXNzVHlwZS5GSUVMRCkKLUBYbWxUeXBlKG5hbWUgPSAicHJvcGVydHlUeXBlIiwgcHJvcE9yZGVyID0gewotICAgICAgICAibmFtZSIsCi0gICAgICAgICJ2YWx1ZSIKLSAgICAgICAgfSkKLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eVR5cGUgewotCi0gICAgQFhtbEVsZW1lbnQobmFtZXNwYWNlID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIsIHJlcXVpcmVkID0gdHJ1ZSkKLSAgICBwcm90ZWN0ZWQgWHNkU3RyaW5nVHlwZSBuYW1lOwotICAgIEBYbWxFbGVtZW50KG5hbWVzcGFjZSA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiLCByZXF1aXJlZCA9IHRydWUpCi0gICAgcHJvdGVjdGVkIFhzZFN0cmluZ1R5cGUgdmFsdWU7Ci0gICAgQFhtbEF0dHJpYnV0ZQotICAgIEBYbWxKYXZhVHlwZUFkYXB0ZXIoQ29sbGFwc2VkU3RyaW5nQWRhcHRlci5jbGFzcykKLSAgICBAWG1sSUQKLSAgICBwcm90ZWN0ZWQgamF2YS5sYW5nLlN0cmluZyBpZDsKLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBuYW1lIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiBwb3NzaWJsZSBvYmplY3QgaXMge0BsaW5rIFhzZFN0cmluZ1R5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyBYc2RTdHJpbmdUeXBlIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBuYW1lIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIGFsbG93ZWQgb2JqZWN0IGlzIHtAbGluayBYc2RTdHJpbmdUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFhzZFN0cmluZ1R5cGUgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5uYW1lID0gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIHZhbHVlIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiBwb3NzaWJsZSBvYmplY3QgaXMge0BsaW5rIFhzZFN0cmluZ1R5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyBYc2RTdHJpbmdUeXBlIGdldFZhbHVlKCkgewotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHZhbHVlIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIGFsbG93ZWQgb2JqZWN0IGlzIHtAbGluayBYc2RTdHJpbmdUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShYc2RTdHJpbmdUeXBlIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgaWQgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHBvc3NpYmxlIG9iamVjdCBpcyB7QGxpbmsgamF2YS5sYW5nLlN0cmluZyB9Ci0gICAgICovCi0gICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0SWQoKSB7Ci0gICAgICAgIHJldHVybiBpZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgaWQgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgYWxsb3dlZCBvYmplY3QgaXMge0BsaW5rIGphdmEubGFuZy5TdHJpbmcgfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldElkKGphdmEubGFuZy5TdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5pZCA9IHZhbHVlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvUmVtb3RlVHlwZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvUmVtb3RlVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWNmMGI1Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL1JlbW90ZVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vCi0vLyBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSB0aGUgSmF2YVRNIEFyY2hpdGVjdHVyZSBmb3IgWE1MIEJpbmRpbmcoSkFYQikgUmVmZXJlbmNlIEltcGxlbWVudGF0aW9uLCB2Mi4wLWI1Mi1mY3MgCi0vLyBTZWUgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YiI+aHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YjwvYT4gCi0vLyBBbnkgbW9kaWZpY2F0aW9ucyB0byB0aGlzIGZpbGUgd2lsbCBiZSBsb3N0IHVwb24gcmVjb21waWxhdGlvbiBvZiB0aGUgc291cmNlIHNjaGVtYS4gCi0vLyBHZW5lcmF0ZWQgb246IDIwMDcuMDMuMjEgYXQgMTA6NTY6NTEgQU0gQ0RUIAotLy8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24ueG1sLmhhbmRsZXI7Ci0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlOwotCi0KLS8qKgotICogVGhlIHJlbW90ZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUgZW50ZXJwcmlzZSBiZWFuJ3MgcmVtb3RlIGludGVyZmFjZS4KLSAqIDxwLz4KLSAqIEV4YW1wbGU6Ci0gKiA8cC8+Ci0gKiA8cmVtb3RlPmNvbS53b21iYXQuZW1wbC5FbXBsb3llZVNlcnZpY2U8L3JlbW90ZT4KLSAqIDxwLz4KLSAqIDxwLz4KLSAqIDxwLz4KLSAqIDxwLz4KLSAqIDxwPkphdmEgY2xhc3MgZm9yIHJlbW90ZVR5cGUgY29tcGxleCB0eXBlLgotICogPHAvPgotICogPHA+VGhlIGZvbGxvd2luZyBzY2hlbWEgZnJhZ21lbnQgc3BlY2lmaWVzIHRoZSBleHBlY3RlZCBjb250ZW50IGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBjbGFzcy4KLSAqIDxwLz4KLSAqIDxwcmU+Ci0gKiAmbHQ7Y29tcGxleFR5cGUgbmFtZT0icmVtb3RlVHlwZSI+Ci0gKiAgICZsdDtzaW1wbGVDb250ZW50PgotICogICAgICZsdDtyZXN0cmljdGlvbiBiYXNlPSImbHQ7aHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlPmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotICogICAgICZsdDsvcmVzdHJpY3Rpb24+Ci0gKiAgICZsdDsvc2ltcGxlQ29udGVudD4KLSAqICZsdDsvY29tcGxleFR5cGU+Ci0gKiA8L3ByZT4KLSAqLwotQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKQotQFhtbFR5cGUobmFtZSA9ICJyZW1vdGVUeXBlIikKLXB1YmxpYyBjbGFzcyBSZW1vdGVUeXBlCi0gICAgICAgIGV4dGVuZHMgRnVsbHlRdWFsaWZpZWRDbGFzc1R5cGUgewotCi0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL1Jlc0F1dGhUeXBlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9SZXNBdXRoVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTdkMTczLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL1Jlc0F1dGhUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLwotLy8gVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIEphdmFUTSBBcmNoaXRlY3R1cmUgZm9yIFhNTCBCaW5kaW5nKEpBWEIpIFJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbiwgdjIuMC1iNTItZmNzIAotLy8gU2VlIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGIiPmh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGI8L2E+IAotLy8gQW55IG1vZGlmaWNhdGlvbnMgdG8gdGhpcyBmaWxlIHdpbGwgYmUgbG9zdCB1cG9uIHJlY29tcGlsYXRpb24gb2YgdGhlIHNvdXJjZSBzY2hlbWEuIAotLy8gR2VuZXJhdGVkIG9uOiAyMDA3LjAzLjIxIGF0IDEwOjU2OjUxIEFNIENEVCAKLS8vCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLnhtbC5oYW5kbGVyOwotCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZTsKLQotCi0vKioKLSAqIFRoZSByZXMtYXV0aFR5cGUgc3BlY2lmaWVzIHdoZXRoZXIgdGhlIERlcGxveW1lbnQgQ29tcG9uZW50IGNvZGUgc2lnbnMgb24gcHJvZ3JhbW1hdGljYWxseSB0byB0aGUKLSAqIHJlc291cmNlIG1hbmFnZXIsIG9yIHdoZXRoZXIgdGhlIENvbnRhaW5lciB3aWxsIHNpZ24gb24gdG8gdGhlIHJlc291cmNlIG1hbmFnZXIgb24gYmVoYWxmIG9mIHRoZQotICogRGVwbG95bWVudCBDb21wb25lbnQuIEluIHRoZSBsYXR0ZXIgY2FzZSwgdGhlIENvbnRhaW5lciB1c2VzIGluZm9ybWF0aW9uIHRoYXQgaXMgc3VwcGxpZWQgYnkgdGhlCi0gKiBEZXBsb3llci4KLSAqIDxwLz4KLSAqIFRoZSB2YWx1ZSBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZzoKLSAqIDxwLz4KLSAqIEFwcGxpY2F0aW9uIENvbnRhaW5lcgotICogPHAvPgotICogPHAvPgotICogPHAvPgotICogPHA+SmF2YSBjbGFzcyBmb3IgcmVzLWF1dGhUeXBlIGNvbXBsZXggdHlwZS4KLSAqIDxwLz4KLSAqIDxwPlRoZSBmb2xsb3dpbmcgc2NoZW1hIGZyYWdtZW50IHNwZWNpZmllcyB0aGUgZXhwZWN0ZWQgY29udGVudCBjb250YWluZWQgd2l0aGluIHRoaXMgY2xhc3MuCi0gKiA8cC8+Ci0gKiA8cHJlPgotICogJmx0O2NvbXBsZXhUeXBlIG5hbWU9InJlcy1hdXRoVHlwZSI+Ci0gKiAgICZsdDtzaW1wbGVDb250ZW50PgotICogICAgICZsdDtyZXN0cmljdGlvbiBiYXNlPSImbHQ7aHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlPnN0cmluZyI+Ci0gKiAgICAgJmx0Oy9yZXN0cmljdGlvbj4KLSAqICAgJmx0Oy9zaW1wbGVDb250ZW50PgotICogJmx0Oy9jb21wbGV4VHlwZT4KLSAqIDwvcHJlPgotICovCi1AWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpCi1AWG1sVHlwZShuYW1lID0gInJlcy1hdXRoVHlwZSIpCi1wdWJsaWMgY2xhc3MgUmVzQXV0aFR5cGUKLSAgICAgICAgZXh0ZW5kcyBTdHJpbmcgewotCi0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL1Jlc1NoYXJpbmdTY29wZVR5cGUuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL1Jlc1NoYXJpbmdTY29wZVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNhMmM0Ni4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9SZXNTaGFyaW5nU2NvcGVUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLwotLy8gVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIEphdmFUTSBBcmNoaXRlY3R1cmUgZm9yIFhNTCBCaW5kaW5nKEpBWEIpIFJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbiwgdjIuMC1iNTItZmNzIAotLy8gU2VlIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGIiPmh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGI8L2E+IAotLy8gQW55IG1vZGlmaWNhdGlvbnMgdG8gdGhpcyBmaWxlIHdpbGwgYmUgbG9zdCB1cG9uIHJlY29tcGlsYXRpb24gb2YgdGhlIHNvdXJjZSBzY2hlbWEuIAotLy8gR2VuZXJhdGVkIG9uOiAyMDA3LjAzLjIxIGF0IDEwOjU2OjUxIEFNIENEVCAKLS8vCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLnhtbC5oYW5kbGVyOwotCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZTsKLQotCi0vKioKLSAqIFRoZSByZXMtc2hhcmluZy1zY29wZSB0eXBlIHNwZWNpZmllcyB3aGV0aGVyIGNvbm5lY3Rpb25zIG9idGFpbmVkIHRocm91Z2ggdGhlIGdpdmVuIHJlc291cmNlCi0gKiBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2UgY2FuIGJlIHNoYXJlZC4gVGhlIHZhbHVlLCBpZiBzcGVjaWZpZWQsIG11c3QgYmUgb25lIG9mIHRoZQotICogdHdvIGZvbGxvd2luZzoKLSAqIDxwLz4KLSAqIFNoYXJlYWJsZSBVbnNoYXJlYWJsZQotICogPHAvPgotICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgU2hhcmVhYmxlLgotICogPHAvPgotICogPHAvPgotICogPHAvPgotICogPHA+SmF2YSBjbGFzcyBmb3IgcmVzLXNoYXJpbmctc2NvcGVUeXBlIGNvbXBsZXggdHlwZS4KLSAqIDxwLz4KLSAqIDxwPlRoZSBmb2xsb3dpbmcgc2NoZW1hIGZyYWdtZW50IHNwZWNpZmllcyB0aGUgZXhwZWN0ZWQgY29udGVudCBjb250YWluZWQgd2l0aGluIHRoaXMgY2xhc3MuCi0gKiA8cC8+Ci0gKiA8cHJlPgotICogJmx0O2NvbXBsZXhUeXBlIG5hbWU9InJlcy1zaGFyaW5nLXNjb3BlVHlwZSI+Ci0gKiAgICZsdDtzaW1wbGVDb250ZW50PgotICogICAgICZsdDtyZXN0cmljdGlvbiBiYXNlPSImbHQ7aHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlPnN0cmluZyI+Ci0gKiAgICAgJmx0Oy9yZXN0cmljdGlvbj4KLSAqICAgJmx0Oy9zaW1wbGVDb250ZW50PgotICogJmx0Oy9jb21wbGV4VHlwZT4KLSAqIDwvcHJlPgotICovCi1AWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpCi1AWG1sVHlwZShuYW1lID0gInJlcy1zaGFyaW5nLXNjb3BlVHlwZSIpCi1wdWJsaWMgY2xhc3MgUmVzU2hhcmluZ1Njb3BlVHlwZQotICAgICAgICBleHRlbmRzIFN0cmluZyB7Ci0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvUmVzb3VyY2VFbnZSZWZUeXBlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9SZXNvdXJjZUVudlJlZlR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDMwOGQ0YS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9SZXNvdXJjZUVudlJlZlR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLwotLy8gVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIEphdmFUTSBBcmNoaXRlY3R1cmUgZm9yIFhNTCBCaW5kaW5nKEpBWEIpIFJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbiwgdjIuMC1iNTItZmNzIAotLy8gU2VlIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGIiPmh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGI8L2E+IAotLy8gQW55IG1vZGlmaWNhdGlvbnMgdG8gdGhpcyBmaWxlIHdpbGwgYmUgbG9zdCB1cG9uIHJlY29tcGlsYXRpb24gb2YgdGhlIHNvdXJjZSBzY2hlbWEuIAotLy8gR2VuZXJhdGVkIG9uOiAyMDA3LjAzLjIxIGF0IDEwOjU2OjUxIEFNIENEVCAKLS8vCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLnhtbC5oYW5kbGVyOwotCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQXR0cmlidXRlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbElEOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLmFkYXB0ZXJzLkNvbGxhcHNlZFN0cmluZ0FkYXB0ZXI7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5hZGFwdGVycy5YbWxKYXZhVHlwZUFkYXB0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotCi0vKioKLSAqIFRoZSByZXNvdXJjZS1lbnYtcmVmVHlwZSBpcyB1c2VkIHRvIGRlZmluZSByZXNvdXJjZS1lbnYtdHlwZSBlbGVtZW50cy4gIEl0IGNvbnRhaW5zIGEgZGVjbGFyYXRpb24KLSAqIG9mIGEgRGVwbG95bWVudCBDb21wb25lbnQncyByZWZlcmVuY2UgdG8gYW4gYWRtaW5pc3RlcmVkIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggYSByZXNvdXJjZSBpbiB0aGUKLSAqIERlcGxveW1lbnQgQ29tcG9uZW50J3MgZW52aXJvbm1lbnQuICBJdCBjb25zaXN0cyBvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgdGhlIHJlc291cmNlCi0gKiBlbnZpcm9ubWVudCByZWZlcmVuY2UgbmFtZSwgYW5kIGFuIG9wdGlvbmFsIGluZGljYXRpb24gb2YgdGhlIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZSB0eXBlCi0gKiBleHBlY3RlZCBieSB0aGUgRGVwbG95bWVudCBDb21wb25lbnQgY29kZS4KLSAqIDxwLz4KLSAqIEl0IGFsc28gaW5jbHVkZXMgb3B0aW9uYWwgZWxlbWVudHMgdG8gZGVmaW5lIGluamVjdGlvbiBvZiB0aGUgbmFtZWQgcmVzb3VyY2UgaW50byBmaWVsZHMgb3IKLSAqIEphdmFCZWFucyBwcm9wZXJ0aWVzLgotICogPHAvPgotICogVGhlIHJlc291cmNlIGVudmlyb25tZW50IHR5cGUgbXVzdCBiZSBzdXBwbGllZCB1bmxlc3MgYW4gaW5qZWN0aW9uIHRhcmdldCBpcyBzcGVjaWZpZWQsIGluIHdoaWNoCi0gKiBjYXNlIHRoZSB0eXBlIG9mIHRoZSB0YXJnZXQgaXMgdXNlZC4gIElmIGJvdGggYXJlIHNwZWNpZmllZCwgdGhlIHR5cGUgbXVzdCBiZSBhc3NpZ25tZW50Ci0gKiBjb21wYXRpYmxlIHdpdGggdGhlIHR5cGUgb2YgdGhlIGluamVjdGlvbiB0YXJnZXQuCi0gKiA8cC8+Ci0gKiBFeGFtcGxlOgotICogPHAvPgotICogPHJlc291cmNlLWVudi1yZWY+IDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+am1zL1N0b2NrUXVldWUgPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gKiA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmF4Lmptcy5RdWV1ZSA8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4gPC9yZXNvdXJjZS1lbnYtcmVmPgotICogPHAvPgotICogPHAvPgotICogPHAvPgotICogPHAvPgotICogPHA+SmF2YSBjbGFzcyBmb3IgcmVzb3VyY2UtZW52LXJlZlR5cGUgY29tcGxleCB0eXBlLgotICogPHAvPgotICogPHA+VGhlIGZvbGxvd2luZyBzY2hlbWEgZnJhZ21lbnQgc3BlY2lmaWVzIHRoZSBleHBlY3RlZCBjb250ZW50IGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBjbGFzcy4KLSAqIDxwLz4KLSAqIDxwcmU+Ci0gKiAmbHQ7Y29tcGxleFR5cGUgbmFtZT0icmVzb3VyY2UtZW52LXJlZlR5cGUiPgotICogICAmbHQ7Y29tcGxleENvbnRlbnQ+Ci0gKiAgICAgJmx0O3Jlc3RyaWN0aW9uIGJhc2U9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1hbnlUeXBlIj4KLSAqICAgICAgICZsdDtzZXF1ZW5jZT4KLSAqICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9IntodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWV9ZGVzY3JpcHRpb25UeXBlIgotICogbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCIvPgotICogICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJyZXNvdXJjZS1lbnYtcmVmLW5hbWUiIHR5cGU9IntodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWV9am5kaS1uYW1lVHlwZSIvPgotICogICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJyZXNvdXJjZS1lbnYtcmVmLXR5cGUiIHR5cGU9IntodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWV9ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIKLSAqIG1pbk9jY3Vycz0iMCIvPgotICogICAgICAgICAmbHQ7Z3JvdXAgcmVmPSJ7aHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlfXJlc291cmNlR3JvdXAiLz4KLSAqICAgICAgICZsdDsvc2VxdWVuY2U+Ci0gKiAgICAgICAmbHQ7YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9SUQiIC8+Ci0gKiAgICAgJmx0Oy9yZXN0cmljdGlvbj4KLSAqICAgJmx0Oy9jb21wbGV4Q29udGVudD4KLSAqICZsdDsvY29tcGxleFR5cGU+Ci0gKiA8L3ByZT4KLSAqLwotQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKQotQFhtbFR5cGUobmFtZSA9ICJyZXNvdXJjZS1lbnYtcmVmVHlwZSIsIHByb3BPcmRlciA9IHsKLSAgICAgICAgImRlc2NyaXB0aW9uIiwKLSAgICAgICAgInJlc291cmNlRW52UmVmTmFtZSIsCi0gICAgICAgICJyZXNvdXJjZUVudlJlZlR5cGUiLAotICAgICAgICAibWFwcGVkTmFtZSIsCi0gICAgICAgICJpbmplY3Rpb25UYXJnZXQiCi0gICAgICAgIH0pCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VFbnZSZWZUeXBlIHsKLQotICAgIEBYbWxFbGVtZW50KG5hbWVzcGFjZSA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiLCByZXF1aXJlZCA9IHRydWUpCi0gICAgcHJvdGVjdGVkIExpc3Q8RGVzY3JpcHRpb25UeXBlPiBkZXNjcmlwdGlvbjsKLSAgICBAWG1sRWxlbWVudChuYW1lID0gInJlc291cmNlLWVudi1yZWYtbmFtZSIsIG5hbWVzcGFjZSA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiLAotICAgICAgICAgICAgICAgIHJlcXVpcmVkID0gdHJ1ZSkKLSAgICBwcm90ZWN0ZWQgSm5kaU5hbWVUeXBlIHJlc291cmNlRW52UmVmTmFtZTsKLSAgICBAWG1sRWxlbWVudChuYW1lID0gInJlc291cmNlLWVudi1yZWYtdHlwZSIsIG5hbWVzcGFjZSA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiKQotICAgIHByb3RlY3RlZCBGdWxseVF1YWxpZmllZENsYXNzVHlwZSByZXNvdXJjZUVudlJlZlR5cGU7Ci0gICAgQFhtbEVsZW1lbnQobmFtZSA9ICJtYXBwZWQtbmFtZSIsIG5hbWVzcGFjZSA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiKQotICAgIHByb3RlY3RlZCBYc2RTdHJpbmdUeXBlIG1hcHBlZE5hbWU7Ci0gICAgQFhtbEVsZW1lbnQobmFtZSA9ICJpbmplY3Rpb24tdGFyZ2V0IiwgbmFtZXNwYWNlID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIsCi0gICAgICAgICAgICAgICAgcmVxdWlyZWQgPSB0cnVlKQotICAgIHByb3RlY3RlZCBMaXN0PEluamVjdGlvblRhcmdldFR5cGU+IGluamVjdGlvblRhcmdldDsKLSAgICBAWG1sQXR0cmlidXRlCi0gICAgQFhtbEphdmFUeXBlQWRhcHRlcihDb2xsYXBzZWRTdHJpbmdBZGFwdGVyLmNsYXNzKQotICAgIEBYbWxJRAotICAgIHByb3RlY3RlZCBqYXZhLmxhbmcuU3RyaW5nIGlkOwotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGRlc2NyaXB0aW9uIHByb3BlcnR5LgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhpcyBhY2Nlc3NvciBtZXRob2QgcmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgbGl2ZSBsaXN0LCBub3QgYSBzbmFwc2hvdC4gVGhlcmVmb3JlIGFueQotICAgICAqIG1vZGlmaWNhdGlvbiB5b3UgbWFrZSB0byB0aGUgcmV0dXJuZWQgbGlzdCB3aWxsIGJlIHByZXNlbnQgaW5zaWRlIHRoZSBKQVhCIG9iamVjdC4gVGhpcyBpcwotICAgICAqIHdoeSB0aGVyZSBpcyBub3QgYSA8Q09ERT5zZXQ8L0NPREU+IG1ldGhvZCBmb3IgdGhlIGRlc2NyaXB0aW9uIHByb3BlcnR5LgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogRm9yIGV4YW1wbGUsIHRvIGFkZCBhIG5ldyBpdGVtLCBkbyBhcyBmb2xsb3dzOgotICAgICAqIDxwcmU+Ci0gICAgICogICAgZ2V0RGVzY3JpcHRpb24oKS5hZGQobmV3SXRlbSk7Ci0gICAgICogPC9wcmU+Ci0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogT2JqZWN0cyBvZiB0aGUgZm9sbG93aW5nIHR5cGUocykgYXJlIGFsbG93ZWQgaW4gdGhlIGxpc3Qge0BsaW5rIERlc2NyaXB0aW9uVHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIExpc3Q8RGVzY3JpcHRpb25UeXBlPiBnZXREZXNjcmlwdGlvbigpIHsKLSAgICAgICAgaWYgKGRlc2NyaXB0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gbmV3IEFycmF5TGlzdDxEZXNjcmlwdGlvblR5cGU+KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMuZGVzY3JpcHRpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIHJlc291cmNlRW52UmVmTmFtZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzIHtAbGluayBKbmRpTmFtZVR5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyBKbmRpTmFtZVR5cGUgZ2V0UmVzb3VyY2VFbnZSZWZOYW1lKCkgewotICAgICAgICByZXR1cm4gcmVzb3VyY2VFbnZSZWZOYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSByZXNvdXJjZUVudlJlZk5hbWUgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgYWxsb3dlZCBvYmplY3QgaXMge0BsaW5rIEpuZGlOYW1lVHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UmVzb3VyY2VFbnZSZWZOYW1lKEpuZGlOYW1lVHlwZSB2YWx1ZSkgewotICAgICAgICB0aGlzLnJlc291cmNlRW52UmVmTmFtZSA9IHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSByZXNvdXJjZUVudlJlZlR5cGUgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHBvc3NpYmxlIG9iamVjdCBpcyB7QGxpbmsgRnVsbHlRdWFsaWZpZWRDbGFzc1R5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyBGdWxseVF1YWxpZmllZENsYXNzVHlwZSBnZXRSZXNvdXJjZUVudlJlZlR5cGUoKSB7Ci0gICAgICAgIHJldHVybiByZXNvdXJjZUVudlJlZlR5cGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHJlc291cmNlRW52UmVmVHlwZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcyB7QGxpbmsgRnVsbHlRdWFsaWZpZWRDbGFzc1R5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFJlc291cmNlRW52UmVmVHlwZShGdWxseVF1YWxpZmllZENsYXNzVHlwZSB2YWx1ZSkgewotICAgICAgICB0aGlzLnJlc291cmNlRW52UmVmVHlwZSA9IHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBtYXBwZWROYW1lIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiBwb3NzaWJsZSBvYmplY3QgaXMge0BsaW5rIFhzZFN0cmluZ1R5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyBYc2RTdHJpbmdUeXBlIGdldE1hcHBlZE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBtYXBwZWROYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBtYXBwZWROYW1lIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIGFsbG93ZWQgb2JqZWN0IGlzIHtAbGluayBYc2RTdHJpbmdUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRNYXBwZWROYW1lKFhzZFN0cmluZ1R5cGUgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5tYXBwZWROYW1lID0gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGluamVjdGlvblRhcmdldCBwcm9wZXJ0eS4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIFRoaXMgYWNjZXNzb3IgbWV0aG9kIHJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIGxpdmUgbGlzdCwgbm90IGEgc25hcHNob3QuIFRoZXJlZm9yZSBhbnkKLSAgICAgKiBtb2RpZmljYXRpb24geW91IG1ha2UgdG8gdGhlIHJldHVybmVkIGxpc3Qgd2lsbCBiZSBwcmVzZW50IGluc2lkZSB0aGUgSkFYQiBvYmplY3QuIFRoaXMgaXMKLSAgICAgKiB3aHkgdGhlcmUgaXMgbm90IGEgPENPREU+c2V0PC9DT0RFPiBtZXRob2QgZm9yIHRoZSBpbmplY3Rpb25UYXJnZXQgcHJvcGVydHkuCi0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBGb3IgZXhhbXBsZSwgdG8gYWRkIGEgbmV3IGl0ZW0sIGRvIGFzIGZvbGxvd3M6Ci0gICAgICogPHByZT4KLSAgICAgKiAgICBnZXRJbmplY3Rpb25UYXJnZXQoKS5hZGQobmV3SXRlbSk7Ci0gICAgICogPC9wcmU+Ci0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogT2JqZWN0cyBvZiB0aGUgZm9sbG93aW5nIHR5cGUocykgYXJlIGFsbG93ZWQgaW4gdGhlIGxpc3Qge0BsaW5rIEluamVjdGlvblRhcmdldFR5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PEluamVjdGlvblRhcmdldFR5cGU+IGdldEluamVjdGlvblRhcmdldCgpIHsKLSAgICAgICAgaWYgKGluamVjdGlvblRhcmdldCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpbmplY3Rpb25UYXJnZXQgPSBuZXcgQXJyYXlMaXN0PEluamVjdGlvblRhcmdldFR5cGU+KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMuaW5qZWN0aW9uVGFyZ2V0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBpZCBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRJZCgpIHsKLSAgICAgICAgcmV0dXJuIGlkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBpZCBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcyB7QGxpbmsgamF2YS5sYW5nLlN0cmluZyB9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SWQoamF2YS5sYW5nLlN0cmluZyB2YWx1ZSkgewotICAgICAgICB0aGlzLmlkID0gdmFsdWU7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9SZXNvdXJjZVJlZlR5cGUuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL1Jlc291cmNlUmVmVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmYwOGNlLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL1Jlc291cmNlUmVmVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vCi0vLyBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSB0aGUgSmF2YVRNIEFyY2hpdGVjdHVyZSBmb3IgWE1MIEJpbmRpbmcoSkFYQikgUmVmZXJlbmNlIEltcGxlbWVudGF0aW9uLCB2Mi4wLWI1Mi1mY3MgCi0vLyBTZWUgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YiI+aHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YjwvYT4gCi0vLyBBbnkgbW9kaWZpY2F0aW9ucyB0byB0aGlzIGZpbGUgd2lsbCBiZSBsb3N0IHVwb24gcmVjb21waWxhdGlvbiBvZiB0aGUgc291cmNlIHNjaGVtYS4gCi0vLyBHZW5lcmF0ZWQgb246IDIwMDcuMDMuMjEgYXQgMTA6NTY6NTEgQU0gQ0RUIAotLy8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24ueG1sLmhhbmRsZXI7Ci0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBdHRyaWJ1dGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50OwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sSUQ7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uYWRhcHRlcnMuQ29sbGFwc2VkU3RyaW5nQWRhcHRlcjsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLmFkYXB0ZXJzLlhtbEphdmFUeXBlQWRhcHRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0KLS8qKgotICogVGhlIHJlc291cmNlLXJlZlR5cGUgY29udGFpbnMgYSBkZWNsYXJhdGlvbiBvZiBhIERlcGxveW1lbnQgQ29tcG9uZW50J3MgcmVmZXJlbmNlIHRvIGFuIGV4dGVybmFsCi0gKiByZXNvdXJjZS4gSXQgY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24sIHRoZSByZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeQotICogcmVmZXJlbmNlIG5hbWUsIGFuIG9wdGlvbmFsIGluZGljYXRpb24gb2YgdGhlIHJlc291cmNlIG1hbmFnZXIgY29ubmVjdGlvbiBmYWN0b3J5IHR5cGUgZXhwZWN0ZWQKLSAqIGJ5IHRoZSBEZXBsb3ltZW50IENvbXBvbmVudCBjb2RlLCBhbiBvcHRpb25hbCB0eXBlIG9mIGF1dGhlbnRpY2F0aW9uIChBcHBsaWNhdGlvbiBvciBDb250YWluZXIpLAotICogYW5kIGFuIG9wdGlvbmFsIHNwZWNpZmljYXRpb24gb2YgdGhlIHNoYXJlYWJpbGl0eSBvZiBjb25uZWN0aW9ucyBvYnRhaW5lZCBmcm9tIHRoZSByZXNvdXJjZQotICogKFNoYXJlYWJsZSBvciBVbnNoYXJlYWJsZSkuCi0gKiA8cC8+Ci0gKiBJdCBhbHNvIGluY2x1ZGVzIG9wdGlvbmFsIGVsZW1lbnRzIHRvIGRlZmluZSBpbmplY3Rpb24gb2YgdGhlIG5hbWVkIHJlc291cmNlIGludG8gZmllbGRzIG9yCi0gKiBKYXZhQmVhbnMgcHJvcGVydGllcy4KLSAqIDxwLz4KLSAqIFRoZSBjb25uZWN0aW9uIGZhY3RvcnkgdHlwZSBtdXN0IGJlIHN1cHBsaWVkIHVubGVzcyBhbiBpbmplY3Rpb24gdGFyZ2V0IGlzIHNwZWNpZmllZCwgaW4gd2hpY2gKLSAqIGNhc2UgdGhlIHR5cGUgb2YgdGhlIHRhcmdldCBpcyB1c2VkLiAgSWYgYm90aCBhcmUgc3BlY2lmaWVkLCB0aGUgdHlwZSBtdXN0IGJlIGFzc2lnbm1lbnQKLSAqIGNvbXBhdGlibGUgd2l0aCB0aGUgdHlwZSBvZiB0aGUgaW5qZWN0aW9uIHRhcmdldC4KLSAqIDxwLz4KLSAqIEV4YW1wbGU6Ci0gKiA8cC8+Ci0gKiA8cmVzb3VyY2UtcmVmPiA8cmVzLXJlZi1uYW1lPmpkYmMvRW1wbG95ZWVBcHBEQjwvcmVzLXJlZi1uYW1lPiA8cmVzLXR5cGU+amF2YXguc3FsLkRhdGFTb3VyY2U8L3Jlcy10eXBlPgotICogPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+IDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPiA8L3Jlc291cmNlLXJlZj4KLSAqIDxwLz4KLSAqIDxwLz4KLSAqIDxwLz4KLSAqIDxwLz4KLSAqIDxwPkphdmEgY2xhc3MgZm9yIHJlc291cmNlLXJlZlR5cGUgY29tcGxleCB0eXBlLgotICogPHAvPgotICogPHA+VGhlIGZvbGxvd2luZyBzY2hlbWEgZnJhZ21lbnQgc3BlY2lmaWVzIHRoZSBleHBlY3RlZCBjb250ZW50IGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBjbGFzcy4KLSAqIDxwLz4KLSAqIDxwcmU+Ci0gKiAmbHQ7Y29tcGxleFR5cGUgbmFtZT0icmVzb3VyY2UtcmVmVHlwZSI+Ci0gKiAgICZsdDtjb21wbGV4Q29udGVudD4KLSAqICAgICAmbHQ7cmVzdHJpY3Rpb24gYmFzZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfWFueVR5cGUiPgotICogICAgICAgJmx0O3NlcXVlbmNlPgotICogICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ie2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZX1kZXNjcmlwdGlvblR5cGUiCi0gKiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIi8+Ci0gKiAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9InJlcy1yZWYtbmFtZSIgdHlwZT0ie2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZX1qbmRpLW5hbWVUeXBlIi8+Ci0gKiAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9InJlcy10eXBlIiB0eXBlPSJ7aHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlfWZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiCi0gKiBtaW5PY2N1cnM9IjAiLz4KLSAqICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0icmVzLWF1dGgiIHR5cGU9IntodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWV9cmVzLWF1dGhUeXBlIgotICogbWluT2NjdXJzPSIwIi8+Ci0gKiAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9InJlcy1zaGFyaW5nLXNjb3BlIiB0eXBlPSJ7aHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlfXJlcy1zaGFyaW5nLXNjb3BlVHlwZSIKLSAqIG1pbk9jY3Vycz0iMCIvPgotICogICAgICAgICAmbHQ7Z3JvdXAgcmVmPSJ7aHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlfXJlc291cmNlR3JvdXAiLz4KLSAqICAgICAgICZsdDsvc2VxdWVuY2U+Ci0gKiAgICAgICAmbHQ7YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9SUQiIC8+Ci0gKiAgICAgJmx0Oy9yZXN0cmljdGlvbj4KLSAqICAgJmx0Oy9jb21wbGV4Q29udGVudD4KLSAqICZsdDsvY29tcGxleFR5cGU+Ci0gKiA8L3ByZT4KLSAqLwotQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKQotQFhtbFR5cGUobmFtZSA9ICJyZXNvdXJjZS1yZWZUeXBlIiwgcHJvcE9yZGVyID0gewotICAgICAgICAiZGVzY3JpcHRpb24iLAotICAgICAgICAicmVzUmVmTmFtZSIsCi0gICAgICAgICJyZXNUeXBlIiwKLSAgICAgICAgInJlc0F1dGgiLAotICAgICAgICAicmVzU2hhcmluZ1Njb3BlIiwKLSAgICAgICAgIm1hcHBlZE5hbWUiLAotICAgICAgICAiaW5qZWN0aW9uVGFyZ2V0IgotICAgICAgICB9KQotcHVibGljIGNsYXNzIFJlc291cmNlUmVmVHlwZSB7Ci0KLSAgICBAWG1sRWxlbWVudChuYW1lc3BhY2UgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiwgcmVxdWlyZWQgPSB0cnVlKQotICAgIHByb3RlY3RlZCBMaXN0PERlc2NyaXB0aW9uVHlwZT4gZGVzY3JpcHRpb247Ci0gICAgQFhtbEVsZW1lbnQobmFtZSA9ICJyZXMtcmVmLW5hbWUiLCBuYW1lc3BhY2UgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiwKLSAgICAgICAgICAgICAgICByZXF1aXJlZCA9IHRydWUpCi0gICAgcHJvdGVjdGVkIEpuZGlOYW1lVHlwZSByZXNSZWZOYW1lOwotICAgIEBYbWxFbGVtZW50KG5hbWUgPSAicmVzLXR5cGUiLCBuYW1lc3BhY2UgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIikKLSAgICBwcm90ZWN0ZWQgRnVsbHlRdWFsaWZpZWRDbGFzc1R5cGUgcmVzVHlwZTsKLSAgICBAWG1sRWxlbWVudChuYW1lID0gInJlcy1hdXRoIiwgbmFtZXNwYWNlID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIpCi0gICAgcHJvdGVjdGVkIFJlc0F1dGhUeXBlIHJlc0F1dGg7Ci0gICAgQFhtbEVsZW1lbnQobmFtZSA9ICJyZXMtc2hhcmluZy1zY29wZSIsIG5hbWVzcGFjZSA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiKQotICAgIHByb3RlY3RlZCBSZXNTaGFyaW5nU2NvcGVUeXBlIHJlc1NoYXJpbmdTY29wZTsKLSAgICBAWG1sRWxlbWVudChuYW1lID0gIm1hcHBlZC1uYW1lIiwgbmFtZXNwYWNlID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIpCi0gICAgcHJvdGVjdGVkIFhzZFN0cmluZ1R5cGUgbWFwcGVkTmFtZTsKLSAgICBAWG1sRWxlbWVudChuYW1lID0gImluamVjdGlvbi10YXJnZXQiLCBuYW1lc3BhY2UgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiwKLSAgICAgICAgICAgICAgICByZXF1aXJlZCA9IHRydWUpCi0gICAgcHJvdGVjdGVkIExpc3Q8SW5qZWN0aW9uVGFyZ2V0VHlwZT4gaW5qZWN0aW9uVGFyZ2V0OwotICAgIEBYbWxBdHRyaWJ1dGUKLSAgICBAWG1sSmF2YVR5cGVBZGFwdGVyKENvbGxhcHNlZFN0cmluZ0FkYXB0ZXIuY2xhc3MpCi0gICAgQFhtbElECi0gICAgcHJvdGVjdGVkIGphdmEubGFuZy5TdHJpbmcgaWQ7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZGVzY3JpcHRpb24gcHJvcGVydHkuCi0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBUaGlzIGFjY2Vzc29yIG1ldGhvZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBsaXZlIGxpc3QsIG5vdCBhIHNuYXBzaG90LiBUaGVyZWZvcmUgYW55Ci0gICAgICogbW9kaWZpY2F0aW9uIHlvdSBtYWtlIHRvIHRoZSByZXR1cm5lZCBsaXN0IHdpbGwgYmUgcHJlc2VudCBpbnNpZGUgdGhlIEpBWEIgb2JqZWN0LiBUaGlzIGlzCi0gICAgICogd2h5IHRoZXJlIGlzIG5vdCBhIDxDT0RFPnNldDwvQ09ERT4gbWV0aG9kIGZvciB0aGUgZGVzY3JpcHRpb24gcHJvcGVydHkuCi0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBGb3IgZXhhbXBsZSwgdG8gYWRkIGEgbmV3IGl0ZW0sIGRvIGFzIGZvbGxvd3M6Ci0gICAgICogPHByZT4KLSAgICAgKiAgICBnZXREZXNjcmlwdGlvbigpLmFkZChuZXdJdGVtKTsKLSAgICAgKiA8L3ByZT4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBPYmplY3RzIG9mIHRoZSBmb2xsb3dpbmcgdHlwZShzKSBhcmUgYWxsb3dlZCBpbiB0aGUgbGlzdCB7QGxpbmsgRGVzY3JpcHRpb25UeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxEZXNjcmlwdGlvblR5cGU+IGdldERlc2NyaXB0aW9uKCkgewotICAgICAgICBpZiAoZGVzY3JpcHRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgZGVzY3JpcHRpb24gPSBuZXcgQXJyYXlMaXN0PERlc2NyaXB0aW9uVHlwZT4oKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpcy5kZXNjcmlwdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgcmVzUmVmTmFtZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzIHtAbGluayBKbmRpTmFtZVR5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyBKbmRpTmFtZVR5cGUgZ2V0UmVzUmVmTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHJlc1JlZk5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHJlc1JlZk5hbWUgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgYWxsb3dlZCBvYmplY3QgaXMge0BsaW5rIEpuZGlOYW1lVHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UmVzUmVmTmFtZShKbmRpTmFtZVR5cGUgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5yZXNSZWZOYW1lID0gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIHJlc1R5cGUgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHBvc3NpYmxlIG9iamVjdCBpcyB7QGxpbmsgRnVsbHlRdWFsaWZpZWRDbGFzc1R5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyBGdWxseVF1YWxpZmllZENsYXNzVHlwZSBnZXRSZXNUeXBlKCkgewotICAgICAgICByZXR1cm4gcmVzVHlwZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgcmVzVHlwZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcyB7QGxpbmsgRnVsbHlRdWFsaWZpZWRDbGFzc1R5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFJlc1R5cGUoRnVsbHlRdWFsaWZpZWRDbGFzc1R5cGUgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5yZXNUeXBlID0gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIHJlc0F1dGggcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHBvc3NpYmxlIG9iamVjdCBpcyB7QGxpbmsgUmVzQXV0aFR5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyBSZXNBdXRoVHlwZSBnZXRSZXNBdXRoKCkgewotICAgICAgICByZXR1cm4gcmVzQXV0aDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgcmVzQXV0aCBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcyB7QGxpbmsgUmVzQXV0aFR5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFJlc0F1dGgoUmVzQXV0aFR5cGUgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5yZXNBdXRoID0gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIHJlc1NoYXJpbmdTY29wZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzIHtAbGluayBSZXNTaGFyaW5nU2NvcGVUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgUmVzU2hhcmluZ1Njb3BlVHlwZSBnZXRSZXNTaGFyaW5nU2NvcGUoKSB7Ci0gICAgICAgIHJldHVybiByZXNTaGFyaW5nU2NvcGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHJlc1NoYXJpbmdTY29wZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcyB7QGxpbmsgUmVzU2hhcmluZ1Njb3BlVHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UmVzU2hhcmluZ1Njb3BlKFJlc1NoYXJpbmdTY29wZVR5cGUgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5yZXNTaGFyaW5nU2NvcGUgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgbWFwcGVkTmFtZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzIHtAbGluayBYc2RTdHJpbmdUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgWHNkU3RyaW5nVHlwZSBnZXRNYXBwZWROYW1lKCkgewotICAgICAgICByZXR1cm4gbWFwcGVkTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgbWFwcGVkTmFtZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcyB7QGxpbmsgWHNkU3RyaW5nVHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TWFwcGVkTmFtZShYc2RTdHJpbmdUeXBlIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMubWFwcGVkTmFtZSA9IHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBpbmplY3Rpb25UYXJnZXQgcHJvcGVydHkuCi0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBUaGlzIGFjY2Vzc29yIG1ldGhvZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBsaXZlIGxpc3QsIG5vdCBhIHNuYXBzaG90LiBUaGVyZWZvcmUgYW55Ci0gICAgICogbW9kaWZpY2F0aW9uIHlvdSBtYWtlIHRvIHRoZSByZXR1cm5lZCBsaXN0IHdpbGwgYmUgcHJlc2VudCBpbnNpZGUgdGhlIEpBWEIgb2JqZWN0LiBUaGlzIGlzCi0gICAgICogd2h5IHRoZXJlIGlzIG5vdCBhIDxDT0RFPnNldDwvQ09ERT4gbWV0aG9kIGZvciB0aGUgaW5qZWN0aW9uVGFyZ2V0IHByb3BlcnR5LgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogRm9yIGV4YW1wbGUsIHRvIGFkZCBhIG5ldyBpdGVtLCBkbyBhcyBmb2xsb3dzOgotICAgICAqIDxwcmU+Ci0gICAgICogICAgZ2V0SW5qZWN0aW9uVGFyZ2V0KCkuYWRkKG5ld0l0ZW0pOwotICAgICAqIDwvcHJlPgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIE9iamVjdHMgb2YgdGhlIGZvbGxvd2luZyB0eXBlKHMpIGFyZSBhbGxvd2VkIGluIHRoZSBsaXN0IHtAbGluayBJbmplY3Rpb25UYXJnZXRUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxJbmplY3Rpb25UYXJnZXRUeXBlPiBnZXRJbmplY3Rpb25UYXJnZXQoKSB7Ci0gICAgICAgIGlmIChpbmplY3Rpb25UYXJnZXQgPT0gbnVsbCkgewotICAgICAgICAgICAgaW5qZWN0aW9uVGFyZ2V0ID0gbmV3IEFycmF5TGlzdDxJbmplY3Rpb25UYXJnZXRUeXBlPigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzLmluamVjdGlvblRhcmdldDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgaWQgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHBvc3NpYmxlIG9iamVjdCBpcyB7QGxpbmsgamF2YS5sYW5nLlN0cmluZyB9Ci0gICAgICovCi0gICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0SWQoKSB7Ci0gICAgICAgIHJldHVybiBpZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgaWQgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgYWxsb3dlZCBvYmplY3QgaXMge0BsaW5rIGphdmEubGFuZy5TdHJpbmcgfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldElkKGphdmEubGFuZy5TdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5pZCA9IHZhbHVlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvUm9sZU5hbWVUeXBlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9Sb2xlTmFtZVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZlYWM3OC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9Sb2xlTmFtZVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vCi0vLyBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSB0aGUgSmF2YVRNIEFyY2hpdGVjdHVyZSBmb3IgWE1MIEJpbmRpbmcoSkFYQikgUmVmZXJlbmNlIEltcGxlbWVudGF0aW9uLCB2Mi4wLWI1Mi1mY3MgCi0vLyBTZWUgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YiI+aHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YjwvYT4gCi0vLyBBbnkgbW9kaWZpY2F0aW9ucyB0byB0aGlzIGZpbGUgd2lsbCBiZSBsb3N0IHVwb24gcmVjb21waWxhdGlvbiBvZiB0aGUgc291cmNlIHNjaGVtYS4gCi0vLyBHZW5lcmF0ZWQgb246IDIwMDcuMDMuMjEgYXQgMTA6NTY6NTEgQU0gQ0RUIAotLy8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24ueG1sLmhhbmRsZXI7Ci0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlOwotCi0KLS8qKgotICogVGhlIHJvbGUtbmFtZVR5cGUgZGVzaWduYXRlcyB0aGUgbmFtZSBvZiBhIHNlY3VyaXR5IHJvbGUuCi0gKiA8cC8+Ci0gKiBUaGUgbmFtZSBtdXN0IGNvbmZvcm0gdG8gdGhlIGxleGljYWwgcnVsZXMgZm9yIGEgdG9rZW4uCi0gKiA8cC8+Ci0gKiA8cC8+Ci0gKiA8cC8+Ci0gKiA8cD5KYXZhIGNsYXNzIGZvciByb2xlLW5hbWVUeXBlIGNvbXBsZXggdHlwZS4KLSAqIDxwLz4KLSAqIDxwPlRoZSBmb2xsb3dpbmcgc2NoZW1hIGZyYWdtZW50IHNwZWNpZmllcyB0aGUgZXhwZWN0ZWQgY29udGVudCBjb250YWluZWQgd2l0aGluIHRoaXMgY2xhc3MuCi0gKiA8cC8+Ci0gKiA8cHJlPgotICogJmx0O2NvbXBsZXhUeXBlIG5hbWU9InJvbGUtbmFtZVR5cGUiPgotICogICAmbHQ7c2ltcGxlQ29udGVudD4KLSAqICAgICAmbHQ7cmVzdHJpY3Rpb24gYmFzZT0iJmx0O2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZT5zdHJpbmciPgotICogICAgICZsdDsvcmVzdHJpY3Rpb24+Ci0gKiAgICZsdDsvc2ltcGxlQ29udGVudD4KLSAqICZsdDsvY29tcGxleFR5cGU+Ci0gKiA8L3ByZT4KLSAqLwotQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKQotQFhtbFR5cGUobmFtZSA9ICJyb2xlLW5hbWVUeXBlIikKLXB1YmxpYyBjbGFzcyBSb2xlTmFtZVR5cGUKLSAgICAgICAgZXh0ZW5kcyBTdHJpbmcgewotCi0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL1J1bkFzVHlwZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvUnVuQXNUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjNGYyMzkuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvUnVuQXNUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8KLS8vIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IHRoZSBKYXZhVE0gQXJjaGl0ZWN0dXJlIGZvciBYTUwgQmluZGluZyhKQVhCKSBSZWZlcmVuY2UgSW1wbGVtZW50YXRpb24sIHYyLjAtYjUyLWZjcyAKLS8vIFNlZSA8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9qYXhiIj5odHRwOi8vamF2YS5zdW4uY29tL3htbC9qYXhiPC9hPiAKLS8vIEFueSBtb2RpZmljYXRpb25zIHRvIHRoaXMgZmlsZSB3aWxsIGJlIGxvc3QgdXBvbiByZWNvbXBpbGF0aW9uIG9mIHRoZSBzb3VyY2Ugc2NoZW1hLiAKLS8vIEdlbmVyYXRlZCBvbjogMjAwNy4wMy4yMSBhdCAxMDo1Njo1MSBBTSBDRFQgCi0vLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi54bWwuaGFuZGxlcjsKLQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEF0dHJpYnV0ZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxJRDsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5hZGFwdGVycy5Db2xsYXBzZWRTdHJpbmdBZGFwdGVyOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uYWRhcHRlcnMuWG1sSmF2YVR5cGVBZGFwdGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLQotLyoqCi0gKiBUaGUgcnVuLWFzVHlwZSBzcGVjaWZpZXMgdGhlIHJ1bi1hcyBpZGVudGl0eSB0byBiZSB1c2VkIGZvciB0aGUgZXhlY3V0aW9uIG9mIGEgY29tcG9uZW50LiBJdAotICogY29udGFpbnMgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24sIGFuZCB0aGUgbmFtZSBvZiBhIHNlY3VyaXR5IHJvbGUuCi0gKiA8cC8+Ci0gKiA8cC8+Ci0gKiA8cC8+Ci0gKiA8cD5KYXZhIGNsYXNzIGZvciBydW4tYXNUeXBlIGNvbXBsZXggdHlwZS4KLSAqIDxwLz4KLSAqIDxwPlRoZSBmb2xsb3dpbmcgc2NoZW1hIGZyYWdtZW50IHNwZWNpZmllcyB0aGUgZXhwZWN0ZWQgY29udGVudCBjb250YWluZWQgd2l0aGluIHRoaXMgY2xhc3MuCi0gKiA8cC8+Ci0gKiA8cHJlPgotICogJmx0O2NvbXBsZXhUeXBlIG5hbWU9InJ1bi1hc1R5cGUiPgotICogICAmbHQ7Y29tcGxleENvbnRlbnQ+Ci0gKiAgICAgJmx0O3Jlc3RyaWN0aW9uIGJhc2U9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1hbnlUeXBlIj4KLSAqICAgICAgICZsdDtzZXF1ZW5jZT4KLSAqICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9IntodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWV9ZGVzY3JpcHRpb25UeXBlIgotICogbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCIvPgotICogICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJyb2xlLW5hbWUiIHR5cGU9IntodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWV9cm9sZS1uYW1lVHlwZSIvPgotICogICAgICAgJmx0Oy9zZXF1ZW5jZT4KLSAqICAgICAgICZsdDthdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1JRCIgLz4KLSAqICAgICAmbHQ7L3Jlc3RyaWN0aW9uPgotICogICAmbHQ7L2NvbXBsZXhDb250ZW50PgotICogJmx0Oy9jb21wbGV4VHlwZT4KLSAqIDwvcHJlPgotICovCi1AWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpCi1AWG1sVHlwZShuYW1lID0gInJ1bi1hc1R5cGUiLCBwcm9wT3JkZXIgPSB7Ci0gICAgICAgICJkZXNjcmlwdGlvbiIsCi0gICAgICAgICJyb2xlTmFtZSIKLSAgICAgICAgfSkKLXB1YmxpYyBjbGFzcyBSdW5Bc1R5cGUgewotCi0gICAgQFhtbEVsZW1lbnQobmFtZXNwYWNlID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIsIHJlcXVpcmVkID0gdHJ1ZSkKLSAgICBwcm90ZWN0ZWQgTGlzdDxEZXNjcmlwdGlvblR5cGU+IGRlc2NyaXB0aW9uOwotICAgIEBYbWxFbGVtZW50KG5hbWUgPSAicm9sZS1uYW1lIiwgbmFtZXNwYWNlID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIsCi0gICAgICAgICAgICAgICAgcmVxdWlyZWQgPSB0cnVlKQotICAgIHByb3RlY3RlZCBSb2xlTmFtZVR5cGUgcm9sZU5hbWU7Ci0gICAgQFhtbEF0dHJpYnV0ZQotICAgIEBYbWxKYXZhVHlwZUFkYXB0ZXIoQ29sbGFwc2VkU3RyaW5nQWRhcHRlci5jbGFzcykKLSAgICBAWG1sSUQKLSAgICBwcm90ZWN0ZWQgamF2YS5sYW5nLlN0cmluZyBpZDsKLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBkZXNjcmlwdGlvbiBwcm9wZXJ0eS4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIFRoaXMgYWNjZXNzb3IgbWV0aG9kIHJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIGxpdmUgbGlzdCwgbm90IGEgc25hcHNob3QuIFRoZXJlZm9yZSBhbnkKLSAgICAgKiBtb2RpZmljYXRpb24geW91IG1ha2UgdG8gdGhlIHJldHVybmVkIGxpc3Qgd2lsbCBiZSBwcmVzZW50IGluc2lkZSB0aGUgSkFYQiBvYmplY3QuIFRoaXMgaXMKLSAgICAgKiB3aHkgdGhlcmUgaXMgbm90IGEgPENPREU+c2V0PC9DT0RFPiBtZXRob2QgZm9yIHRoZSBkZXNjcmlwdGlvbiBwcm9wZXJ0eS4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIEZvciBleGFtcGxlLCB0byBhZGQgYSBuZXcgaXRlbSwgZG8gYXMgZm9sbG93czoKLSAgICAgKiA8cHJlPgotICAgICAqICAgIGdldERlc2NyaXB0aW9uKCkuYWRkKG5ld0l0ZW0pOwotICAgICAqIDwvcHJlPgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIE9iamVjdHMgb2YgdGhlIGZvbGxvd2luZyB0eXBlKHMpIGFyZSBhbGxvd2VkIGluIHRoZSBsaXN0IHtAbGluayBEZXNjcmlwdGlvblR5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PERlc2NyaXB0aW9uVHlwZT4gZ2V0RGVzY3JpcHRpb24oKSB7Ci0gICAgICAgIGlmIChkZXNjcmlwdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICBkZXNjcmlwdGlvbiA9IG5ldyBBcnJheUxpc3Q8RGVzY3JpcHRpb25UeXBlPigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzLmRlc2NyaXB0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSByb2xlTmFtZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzIHtAbGluayBSb2xlTmFtZVR5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyBSb2xlTmFtZVR5cGUgZ2V0Um9sZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiByb2xlTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgcm9sZU5hbWUgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgYWxsb3dlZCBvYmplY3QgaXMge0BsaW5rIFJvbGVOYW1lVHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Um9sZU5hbWUoUm9sZU5hbWVUeXBlIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMucm9sZU5hbWUgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgaWQgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHBvc3NpYmxlIG9iamVjdCBpcyB7QGxpbmsgamF2YS5sYW5nLlN0cmluZyB9Ci0gICAgICovCi0gICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0SWQoKSB7Ci0gICAgICAgIHJldHVybiBpZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgaWQgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgYWxsb3dlZCBvYmplY3QgaXMge0BsaW5rIGphdmEubGFuZy5TdHJpbmcgfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldElkKGphdmEubGFuZy5TdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5pZCA9IHZhbHVlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvU2VjdXJpdHlSb2xlUmVmVHlwZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvU2VjdXJpdHlSb2xlUmVmVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTBiN2ZlLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL1NlY3VyaXR5Um9sZVJlZlR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLwotLy8gVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIEphdmFUTSBBcmNoaXRlY3R1cmUgZm9yIFhNTCBCaW5kaW5nKEpBWEIpIFJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbiwgdjIuMC1iNTItZmNzIAotLy8gU2VlIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGIiPmh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGI8L2E+IAotLy8gQW55IG1vZGlmaWNhdGlvbnMgdG8gdGhpcyBmaWxlIHdpbGwgYmUgbG9zdCB1cG9uIHJlY29tcGlsYXRpb24gb2YgdGhlIHNvdXJjZSBzY2hlbWEuIAotLy8gR2VuZXJhdGVkIG9uOiAyMDA3LjAzLjIxIGF0IDEwOjU2OjUxIEFNIENEVCAKLS8vCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLnhtbC5oYW5kbGVyOwotCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQXR0cmlidXRlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbElEOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLmFkYXB0ZXJzLkNvbGxhcHNlZFN0cmluZ0FkYXB0ZXI7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5hZGFwdGVycy5YbWxKYXZhVHlwZUFkYXB0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotCi0vKioKLSAqIFRoZSBzZWN1cml0eS1yb2xlLXJlZlR5cGUgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9uIG9mIGEgc2VjdXJpdHkgcm9sZSByZWZlcmVuY2UgaW4gYSBjb21wb25lbnQncwotICogb3IgYSBEZXBsb3ltZW50IENvbXBvbmVudCdzIGNvZGUuIFRoZSBkZWNsYXJhdGlvbiBjb25zaXN0cyBvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgdGhlCi0gKiBzZWN1cml0eSByb2xlIG5hbWUgdXNlZCBpbiB0aGUgY29kZSwgYW5kIGFuIG9wdGlvbmFsIGxpbmsgdG8gYSBzZWN1cml0eSByb2xlLiBJZiB0aGUgc2VjdXJpdHkKLSAqIHJvbGUgaXMgbm90IHNwZWNpZmllZCwgdGhlIERlcGxveWVyIG11c3QgY2hvb3NlIGFuIGFwcHJvcHJpYXRlIHNlY3VyaXR5IHJvbGUuCi0gKiA8cC8+Ci0gKiA8cC8+Ci0gKiA8cC8+Ci0gKiA8cD5KYXZhIGNsYXNzIGZvciBzZWN1cml0eS1yb2xlLXJlZlR5cGUgY29tcGxleCB0eXBlLgotICogPHAvPgotICogPHA+VGhlIGZvbGxvd2luZyBzY2hlbWEgZnJhZ21lbnQgc3BlY2lmaWVzIHRoZSBleHBlY3RlZCBjb250ZW50IGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBjbGFzcy4KLSAqIDxwLz4KLSAqIDxwcmU+Ci0gKiAmbHQ7Y29tcGxleFR5cGUgbmFtZT0ic2VjdXJpdHktcm9sZS1yZWZUeXBlIj4KLSAqICAgJmx0O2NvbXBsZXhDb250ZW50PgotICogICAgICZsdDtyZXN0cmljdGlvbiBiYXNlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9YW55VHlwZSI+Ci0gKiAgICAgICAmbHQ7c2VxdWVuY2U+Ci0gKiAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ7aHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlfWRlc2NyaXB0aW9uVHlwZSIKLSAqIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiLz4KLSAqICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0icm9sZS1uYW1lIiB0eXBlPSJ7aHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlfXJvbGUtbmFtZVR5cGUiLz4KLSAqICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0icm9sZS1saW5rIiB0eXBlPSJ7aHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlfXJvbGUtbmFtZVR5cGUiCi0gKiBtaW5PY2N1cnM9IjAiLz4KLSAqICAgICAgICZsdDsvc2VxdWVuY2U+Ci0gKiAgICAgICAmbHQ7YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9SUQiIC8+Ci0gKiAgICAgJmx0Oy9yZXN0cmljdGlvbj4KLSAqICAgJmx0Oy9jb21wbGV4Q29udGVudD4KLSAqICZsdDsvY29tcGxleFR5cGU+Ci0gKiA8L3ByZT4KLSAqLwotQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKQotQFhtbFR5cGUobmFtZSA9ICJzZWN1cml0eS1yb2xlLXJlZlR5cGUiLCBwcm9wT3JkZXIgPSB7Ci0gICAgICAgICJkZXNjcmlwdGlvbiIsCi0gICAgICAgICJyb2xlTmFtZSIsCi0gICAgICAgICJyb2xlTGluayIKLSAgICAgICAgfSkKLXB1YmxpYyBjbGFzcyBTZWN1cml0eVJvbGVSZWZUeXBlIHsKLQotICAgIEBYbWxFbGVtZW50KG5hbWVzcGFjZSA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiLCByZXF1aXJlZCA9IHRydWUpCi0gICAgcHJvdGVjdGVkIExpc3Q8RGVzY3JpcHRpb25UeXBlPiBkZXNjcmlwdGlvbjsKLSAgICBAWG1sRWxlbWVudChuYW1lID0gInJvbGUtbmFtZSIsIG5hbWVzcGFjZSA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiLAotICAgICAgICAgICAgICAgIHJlcXVpcmVkID0gdHJ1ZSkKLSAgICBwcm90ZWN0ZWQgUm9sZU5hbWVUeXBlIHJvbGVOYW1lOwotICAgIEBYbWxFbGVtZW50KG5hbWUgPSAicm9sZS1saW5rIiwgbmFtZXNwYWNlID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIpCi0gICAgcHJvdGVjdGVkIFJvbGVOYW1lVHlwZSByb2xlTGluazsKLSAgICBAWG1sQXR0cmlidXRlCi0gICAgQFhtbEphdmFUeXBlQWRhcHRlcihDb2xsYXBzZWRTdHJpbmdBZGFwdGVyLmNsYXNzKQotICAgIEBYbWxJRAotICAgIHByb3RlY3RlZCBqYXZhLmxhbmcuU3RyaW5nIGlkOwotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGRlc2NyaXB0aW9uIHByb3BlcnR5LgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhpcyBhY2Nlc3NvciBtZXRob2QgcmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgbGl2ZSBsaXN0LCBub3QgYSBzbmFwc2hvdC4gVGhlcmVmb3JlIGFueQotICAgICAqIG1vZGlmaWNhdGlvbiB5b3UgbWFrZSB0byB0aGUgcmV0dXJuZWQgbGlzdCB3aWxsIGJlIHByZXNlbnQgaW5zaWRlIHRoZSBKQVhCIG9iamVjdC4gVGhpcyBpcwotICAgICAqIHdoeSB0aGVyZSBpcyBub3QgYSA8Q09ERT5zZXQ8L0NPREU+IG1ldGhvZCBmb3IgdGhlIGRlc2NyaXB0aW9uIHByb3BlcnR5LgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogRm9yIGV4YW1wbGUsIHRvIGFkZCBhIG5ldyBpdGVtLCBkbyBhcyBmb2xsb3dzOgotICAgICAqIDxwcmU+Ci0gICAgICogICAgZ2V0RGVzY3JpcHRpb24oKS5hZGQobmV3SXRlbSk7Ci0gICAgICogPC9wcmU+Ci0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogT2JqZWN0cyBvZiB0aGUgZm9sbG93aW5nIHR5cGUocykgYXJlIGFsbG93ZWQgaW4gdGhlIGxpc3Qge0BsaW5rIERlc2NyaXB0aW9uVHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIExpc3Q8RGVzY3JpcHRpb25UeXBlPiBnZXREZXNjcmlwdGlvbigpIHsKLSAgICAgICAgaWYgKGRlc2NyaXB0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gbmV3IEFycmF5TGlzdDxEZXNjcmlwdGlvblR5cGU+KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMuZGVzY3JpcHRpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIHJvbGVOYW1lIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiBwb3NzaWJsZSBvYmplY3QgaXMge0BsaW5rIFJvbGVOYW1lVHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIFJvbGVOYW1lVHlwZSBnZXRSb2xlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHJvbGVOYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSByb2xlTmFtZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcyB7QGxpbmsgUm9sZU5hbWVUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRSb2xlTmFtZShSb2xlTmFtZVR5cGUgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5yb2xlTmFtZSA9IHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSByb2xlTGluayBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzIHtAbGluayBSb2xlTmFtZVR5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyBSb2xlTmFtZVR5cGUgZ2V0Um9sZUxpbmsoKSB7Ci0gICAgICAgIHJldHVybiByb2xlTGluazsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgcm9sZUxpbmsgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgYWxsb3dlZCBvYmplY3QgaXMge0BsaW5rIFJvbGVOYW1lVHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Um9sZUxpbmsoUm9sZU5hbWVUeXBlIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMucm9sZUxpbmsgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgaWQgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHBvc3NpYmxlIG9iamVjdCBpcyB7QGxpbmsgamF2YS5sYW5nLlN0cmluZyB9Ci0gICAgICovCi0gICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0SWQoKSB7Ci0gICAgICAgIHJldHVybiBpZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgaWQgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgYWxsb3dlZCBvYmplY3QgaXMge0BsaW5rIGphdmEubGFuZy5TdHJpbmcgfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldElkKGphdmEubGFuZy5TdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5pZCA9IHZhbHVlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvU2VjdXJpdHlSb2xlVHlwZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvU2VjdXJpdHlSb2xlVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMGY0MTlhLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL1NlY3VyaXR5Um9sZVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLwotLy8gVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIEphdmFUTSBBcmNoaXRlY3R1cmUgZm9yIFhNTCBCaW5kaW5nKEpBWEIpIFJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbiwgdjIuMC1iNTItZmNzIAotLy8gU2VlIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGIiPmh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGI8L2E+IAotLy8gQW55IG1vZGlmaWNhdGlvbnMgdG8gdGhpcyBmaWxlIHdpbGwgYmUgbG9zdCB1cG9uIHJlY29tcGlsYXRpb24gb2YgdGhlIHNvdXJjZSBzY2hlbWEuIAotLy8gR2VuZXJhdGVkIG9uOiAyMDA3LjAzLjIxIGF0IDEwOjU2OjUxIEFNIENEVCAKLS8vCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLnhtbC5oYW5kbGVyOwotCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQXR0cmlidXRlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbElEOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLmFkYXB0ZXJzLkNvbGxhcHNlZFN0cmluZ0FkYXB0ZXI7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5hZGFwdGVycy5YbWxKYXZhVHlwZUFkYXB0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotCi0vKioKLSAqIFRoZSBzZWN1cml0eS1yb2xlVHlwZSBjb250YWlucyB0aGUgZGVmaW5pdGlvbiBvZiBhIHNlY3VyaXR5IHJvbGUuIFRoZSBkZWZpbml0aW9uIGNvbnNpc3RzIG9mIGFuCi0gKiBvcHRpb25hbCBkZXNjcmlwdGlvbiBvZiB0aGUgc2VjdXJpdHkgcm9sZSwgYW5kIHRoZSBzZWN1cml0eSByb2xlIG5hbWUuCi0gKiA8cC8+Ci0gKiBFeGFtcGxlOgotICogPHAvPgotICogPHNlY3VyaXR5LXJvbGU+IDxkZXNjcmlwdGlvbj4gVGhpcyByb2xlIGluY2x1ZGVzIGFsbCBlbXBsb3llZXMgd2hvIGFyZSBhdXRob3JpemVkIHRvIGFjY2VzcyB0aGUKLSAqIGVtcGxveWVlIHNlcnZpY2UgYXBwbGljYXRpb24uIDwvZGVzY3JpcHRpb24+IDxyb2xlLW5hbWU+ZW1wbG95ZWU8L3JvbGUtbmFtZT4gPC9zZWN1cml0eS1yb2xlPgotICogPHAvPgotICogPHAvPgotICogPHAvPgotICogPHAvPgotICogPHA+SmF2YSBjbGFzcyBmb3Igc2VjdXJpdHktcm9sZVR5cGUgY29tcGxleCB0eXBlLgotICogPHAvPgotICogPHA+VGhlIGZvbGxvd2luZyBzY2hlbWEgZnJhZ21lbnQgc3BlY2lmaWVzIHRoZSBleHBlY3RlZCBjb250ZW50IGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBjbGFzcy4KLSAqIDxwLz4KLSAqIDxwcmU+Ci0gKiAmbHQ7Y29tcGxleFR5cGUgbmFtZT0ic2VjdXJpdHktcm9sZVR5cGUiPgotICogICAmbHQ7Y29tcGxleENvbnRlbnQ+Ci0gKiAgICAgJmx0O3Jlc3RyaWN0aW9uIGJhc2U9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1hbnlUeXBlIj4KLSAqICAgICAgICZsdDtzZXF1ZW5jZT4KLSAqICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9IntodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWV9ZGVzY3JpcHRpb25UeXBlIgotICogbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCIvPgotICogICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJyb2xlLW5hbWUiIHR5cGU9IntodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWV9cm9sZS1uYW1lVHlwZSIvPgotICogICAgICAgJmx0Oy9zZXF1ZW5jZT4KLSAqICAgICAgICZsdDthdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1JRCIgLz4KLSAqICAgICAmbHQ7L3Jlc3RyaWN0aW9uPgotICogICAmbHQ7L2NvbXBsZXhDb250ZW50PgotICogJmx0Oy9jb21wbGV4VHlwZT4KLSAqIDwvcHJlPgotICovCi1AWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpCi1AWG1sVHlwZShuYW1lID0gInNlY3VyaXR5LXJvbGVUeXBlIiwgcHJvcE9yZGVyID0gewotICAgICAgICAiZGVzY3JpcHRpb24iLAotICAgICAgICAicm9sZU5hbWUiCi0gICAgICAgIH0pCi1wdWJsaWMgY2xhc3MgU2VjdXJpdHlSb2xlVHlwZSB7Ci0KLSAgICBAWG1sRWxlbWVudChuYW1lc3BhY2UgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiwgcmVxdWlyZWQgPSB0cnVlKQotICAgIHByb3RlY3RlZCBMaXN0PERlc2NyaXB0aW9uVHlwZT4gZGVzY3JpcHRpb247Ci0gICAgQFhtbEVsZW1lbnQobmFtZSA9ICJyb2xlLW5hbWUiLCBuYW1lc3BhY2UgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiwKLSAgICAgICAgICAgICAgICByZXF1aXJlZCA9IHRydWUpCi0gICAgcHJvdGVjdGVkIFJvbGVOYW1lVHlwZSByb2xlTmFtZTsKLSAgICBAWG1sQXR0cmlidXRlCi0gICAgQFhtbEphdmFUeXBlQWRhcHRlcihDb2xsYXBzZWRTdHJpbmdBZGFwdGVyLmNsYXNzKQotICAgIEBYbWxJRAotICAgIHByb3RlY3RlZCBqYXZhLmxhbmcuU3RyaW5nIGlkOwotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGRlc2NyaXB0aW9uIHByb3BlcnR5LgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhpcyBhY2Nlc3NvciBtZXRob2QgcmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgbGl2ZSBsaXN0LCBub3QgYSBzbmFwc2hvdC4gVGhlcmVmb3JlIGFueQotICAgICAqIG1vZGlmaWNhdGlvbiB5b3UgbWFrZSB0byB0aGUgcmV0dXJuZWQgbGlzdCB3aWxsIGJlIHByZXNlbnQgaW5zaWRlIHRoZSBKQVhCIG9iamVjdC4gVGhpcyBpcwotICAgICAqIHdoeSB0aGVyZSBpcyBub3QgYSA8Q09ERT5zZXQ8L0NPREU+IG1ldGhvZCBmb3IgdGhlIGRlc2NyaXB0aW9uIHByb3BlcnR5LgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogRm9yIGV4YW1wbGUsIHRvIGFkZCBhIG5ldyBpdGVtLCBkbyBhcyBmb2xsb3dzOgotICAgICAqIDxwcmU+Ci0gICAgICogICAgZ2V0RGVzY3JpcHRpb24oKS5hZGQobmV3SXRlbSk7Ci0gICAgICogPC9wcmU+Ci0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogT2JqZWN0cyBvZiB0aGUgZm9sbG93aW5nIHR5cGUocykgYXJlIGFsbG93ZWQgaW4gdGhlIGxpc3Qge0BsaW5rIERlc2NyaXB0aW9uVHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIExpc3Q8RGVzY3JpcHRpb25UeXBlPiBnZXREZXNjcmlwdGlvbigpIHsKLSAgICAgICAgaWYgKGRlc2NyaXB0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gbmV3IEFycmF5TGlzdDxEZXNjcmlwdGlvblR5cGU+KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMuZGVzY3JpcHRpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIHJvbGVOYW1lIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiBwb3NzaWJsZSBvYmplY3QgaXMge0BsaW5rIFJvbGVOYW1lVHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIFJvbGVOYW1lVHlwZSBnZXRSb2xlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHJvbGVOYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSByb2xlTmFtZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcyB7QGxpbmsgUm9sZU5hbWVUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRSb2xlTmFtZShSb2xlTmFtZVR5cGUgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5yb2xlTmFtZSA9IHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBpZCBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRJZCgpIHsKLSAgICAgICAgcmV0dXJuIGlkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBpZCBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcyB7QGxpbmsgamF2YS5sYW5nLlN0cmluZyB9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SWQoamF2YS5sYW5nLlN0cmluZyB2YWx1ZSkgewotICAgICAgICB0aGlzLmlkID0gdmFsdWU7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9TZXJ2aWNlUmVmSGFuZGxlckNoYWluVHlwZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvU2VydmljZVJlZkhhbmRsZXJDaGFpblR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI1NTQwMS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9TZXJ2aWNlUmVmSGFuZGxlckNoYWluVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vCi0vLyBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSB0aGUgSmF2YVRNIEFyY2hpdGVjdHVyZSBmb3IgWE1MIEJpbmRpbmcoSkFYQikgUmVmZXJlbmNlIEltcGxlbWVudGF0aW9uLCB2Mi4wLWI1Mi1mY3MgCi0vLyBTZWUgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YiI+aHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YjwvYT4gCi0vLyBBbnkgbW9kaWZpY2F0aW9ucyB0byB0aGlzIGZpbGUgd2lsbCBiZSBsb3N0IHVwb24gcmVjb21waWxhdGlvbiBvZiB0aGUgc291cmNlIHNjaGVtYS4gCi0vLyBHZW5lcmF0ZWQgb246IDIwMDcuMDMuMjEgYXQgMTA6NTY6NTEgQU0gQ0RUIAotLy8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24ueG1sLmhhbmRsZXI7Ci0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBdHRyaWJ1dGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50OwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sSUQ7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxMaXN0OwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLmFkYXB0ZXJzLkNvbGxhcHNlZFN0cmluZ0FkYXB0ZXI7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5hZGFwdGVycy5YbWxKYXZhVHlwZUFkYXB0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotCi0vKioKLSAqIFRoZSBoYW5kbGVyLWNoYWluIGVsZW1lbnQgZGVmaW5lcyB0aGUgaGFuZGxlcmNoYWluLiBIYW5kbGVyY2hhaW4gY2FuIGJlIGRlZmluZWQgc3VjaCB0aGF0IHRoZQotICogaGFuZGxlcnMgaW4gdGhlIGhhbmRsZXJjaGFpbiBvcGVyYXRlLGFsbCBwb3J0cyBvZiBhIHNlcnZpY2UsIG9uIGEgc3BlY2lmaWMgcG9ydCBvciBvbiBhIGxpc3Qgb2YKLSAqIHByb3RvY29sLWJpbmRpbmdzLiBUaGUgY2hvaWNlIG9mIGVsZW1lbnRzIHNlcnZpY2UtbmFtZS1wYXR0ZXJuLCBwb3J0LW5hbWUtcGF0dGVybiBhbmQKLSAqIHByb3RvY29sLWJpbmRpbmdzIGFyZSB1c2VkIHRvIHNwZWNpZnkgd2hldGhlciB0aGUgaGFuZGxlcnMgaW4gaGFuZGxlci1jaGFpbiBhcmUgZm9yIGEgc2VydmljZSwKLSAqIHBvcnQgb3IgcHJvdG9jb2wgYmluZGluZy4gSWYgbm9uZSBvZiB0aGVzZSBjaG9pY2VzIGFyZSBzcGVjaWZpZWQgd2l0aCB0aGUgaGFuZGxlci1jaGFpbiBlbGVtZW50Ci0gKiB0aGVuIHRoZSBoYW5kbGVycyBzcGVjaWZpZWQgaW4gdGhlIGhhbmRsZXItY2hhaW4gd2lsbCBiZSBhcHBsaWVkIG9uIGV2ZXJ5dGhpbmcuCi0gKiA8cC8+Ci0gKiA8cC8+Ci0gKiA8cC8+Ci0gKiA8cD5KYXZhIGNsYXNzIGZvciBzZXJ2aWNlLXJlZl9oYW5kbGVyLWNoYWluVHlwZSBjb21wbGV4IHR5cGUuCi0gKiA8cC8+Ci0gKiA8cD5UaGUgZm9sbG93aW5nIHNjaGVtYSBmcmFnbWVudCBzcGVjaWZpZXMgdGhlIGV4cGVjdGVkIGNvbnRlbnQgY29udGFpbmVkIHdpdGhpbiB0aGlzIGNsYXNzLgotICogPHAvPgotICogPHByZT4KLSAqICZsdDtjb21wbGV4VHlwZSBuYW1lPSJzZXJ2aWNlLXJlZl9oYW5kbGVyLWNoYWluVHlwZSI+Ci0gKiAgICZsdDtjb21wbGV4Q29udGVudD4KLSAqICAgICAmbHQ7cmVzdHJpY3Rpb24gYmFzZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfWFueVR5cGUiPgotICogICAgICAgJmx0O3NlcXVlbmNlPgotICogICAgICAgICAmbHQ7Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0gKiAgICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0ic2VydmljZS1uYW1lLXBhdHRlcm4iIHR5cGU9IntodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWV9c2VydmljZS1yZWZfcW5hbWUtcGF0dGVybiIvPgotICogICAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9InBvcnQtbmFtZS1wYXR0ZXJuIiB0eXBlPSJ7aHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlfXNlcnZpY2UtcmVmX3FuYW1lLXBhdHRlcm4iLz4KLSAqICAgICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJwcm90b2NvbC1iaW5kaW5ncyIgdHlwZT0ie2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZX1zZXJ2aWNlLXJlZl9wcm90b2NvbC1iaW5kaW5nTGlzdFR5cGUiLz4KLSAqICAgICAgICAgJmx0Oy9jaG9pY2U+Ci0gKiAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9ImhhbmRsZXIiIHR5cGU9IntodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWV9c2VydmljZS1yZWZfaGFuZGxlclR5cGUiCi0gKiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICogICAgICAgJmx0Oy9zZXF1ZW5jZT4KLSAqICAgICAgICZsdDthdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1JRCIgLz4KLSAqICAgICAmbHQ7L3Jlc3RyaWN0aW9uPgotICogICAmbHQ7L2NvbXBsZXhDb250ZW50PgotICogJmx0Oy9jb21wbGV4VHlwZT4KLSAqIDwvcHJlPgotICovCi1AWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpCi1AWG1sVHlwZShuYW1lID0gInNlcnZpY2UtcmVmX2hhbmRsZXItY2hhaW5UeXBlIiwgcHJvcE9yZGVyID0gewotICAgICAgICAic2VydmljZU5hbWVQYXR0ZXJuIiwKLSAgICAgICAgInBvcnROYW1lUGF0dGVybiIsCi0gICAgICAgICJwcm90b2NvbEJpbmRpbmdzIiwKLSAgICAgICAgImhhbmRsZXIiCi0gICAgICAgIH0pCi1wdWJsaWMgY2xhc3MgU2VydmljZVJlZkhhbmRsZXJDaGFpblR5cGUgewotCi0gICAgQFhtbEVsZW1lbnQobmFtZSA9ICJzZXJ2aWNlLW5hbWUtcGF0dGVybiIsIG5hbWVzcGFjZSA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiKQotICAgIEBYbWxKYXZhVHlwZUFkYXB0ZXIoQ29sbGFwc2VkU3RyaW5nQWRhcHRlci5jbGFzcykKLSAgICBwcm90ZWN0ZWQgamF2YS5sYW5nLlN0cmluZyBzZXJ2aWNlTmFtZVBhdHRlcm47Ci0gICAgQFhtbEVsZW1lbnQobmFtZSA9ICJwb3J0LW5hbWUtcGF0dGVybiIsIG5hbWVzcGFjZSA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiKQotICAgIEBYbWxKYXZhVHlwZUFkYXB0ZXIoQ29sbGFwc2VkU3RyaW5nQWRhcHRlci5jbGFzcykKLSAgICBwcm90ZWN0ZWQgamF2YS5sYW5nLlN0cmluZyBwb3J0TmFtZVBhdHRlcm47Ci0gICAgQFhtbExpc3QKLSAgICBAWG1sRWxlbWVudChuYW1lID0gInByb3RvY29sLWJpbmRpbmdzIiwgbmFtZXNwYWNlID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIpCi0gICAgcHJvdGVjdGVkIExpc3Q8amF2YS5sYW5nLlN0cmluZz4gcHJvdG9jb2xCaW5kaW5nczsKLSAgICBAWG1sRWxlbWVudChuYW1lc3BhY2UgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiwgcmVxdWlyZWQgPSB0cnVlKQotICAgIHByb3RlY3RlZCBMaXN0PFNlcnZpY2VSZWZIYW5kbGVyVHlwZT4gaGFuZGxlcjsKLSAgICBAWG1sQXR0cmlidXRlCi0gICAgQFhtbEphdmFUeXBlQWRhcHRlcihDb2xsYXBzZWRTdHJpbmdBZGFwdGVyLmNsYXNzKQotICAgIEBYbWxJRAotICAgIHByb3RlY3RlZCBqYXZhLmxhbmcuU3RyaW5nIGlkOwotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIHNlcnZpY2VOYW1lUGF0dGVybiBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRTZXJ2aWNlTmFtZVBhdHRlcm4oKSB7Ci0gICAgICAgIHJldHVybiBzZXJ2aWNlTmFtZVBhdHRlcm47Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHNlcnZpY2VOYW1lUGF0dGVybiBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcyB7QGxpbmsgamF2YS5sYW5nLlN0cmluZyB9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U2VydmljZU5hbWVQYXR0ZXJuKGphdmEubGFuZy5TdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5zZXJ2aWNlTmFtZVBhdHRlcm4gPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgcG9ydE5hbWVQYXR0ZXJuIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiBwb3NzaWJsZSBvYmplY3QgaXMge0BsaW5rIGphdmEubGFuZy5TdHJpbmcgfQotICAgICAqLwotICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFBvcnROYW1lUGF0dGVybigpIHsKLSAgICAgICAgcmV0dXJuIHBvcnROYW1lUGF0dGVybjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgcG9ydE5hbWVQYXR0ZXJuIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIGFsbG93ZWQgb2JqZWN0IGlzIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQb3J0TmFtZVBhdHRlcm4oamF2YS5sYW5nLlN0cmluZyB2YWx1ZSkgewotICAgICAgICB0aGlzLnBvcnROYW1lUGF0dGVybiA9IHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBwcm90b2NvbEJpbmRpbmdzIHByb3BlcnR5LgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhpcyBhY2Nlc3NvciBtZXRob2QgcmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgbGl2ZSBsaXN0LCBub3QgYSBzbmFwc2hvdC4gVGhlcmVmb3JlIGFueQotICAgICAqIG1vZGlmaWNhdGlvbiB5b3UgbWFrZSB0byB0aGUgcmV0dXJuZWQgbGlzdCB3aWxsIGJlIHByZXNlbnQgaW5zaWRlIHRoZSBKQVhCIG9iamVjdC4gVGhpcyBpcwotICAgICAqIHdoeSB0aGVyZSBpcyBub3QgYSA8Q09ERT5zZXQ8L0NPREU+IG1ldGhvZCBmb3IgdGhlIHByb3RvY29sQmluZGluZ3MgcHJvcGVydHkuCi0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBGb3IgZXhhbXBsZSwgdG8gYWRkIGEgbmV3IGl0ZW0sIGRvIGFzIGZvbGxvd3M6Ci0gICAgICogPHByZT4KLSAgICAgKiAgICBnZXRQcm90b2NvbEJpbmRpbmdzKCkuYWRkKG5ld0l0ZW0pOwotICAgICAqIDwvcHJlPgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIE9iamVjdHMgb2YgdGhlIGZvbGxvd2luZyB0eXBlKHMpIGFyZSBhbGxvd2VkIGluIHRoZSBsaXN0IHtAbGluayBqYXZhLmxhbmcuU3RyaW5nIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxqYXZhLmxhbmcuU3RyaW5nPiBnZXRQcm90b2NvbEJpbmRpbmdzKCkgewotICAgICAgICBpZiAocHJvdG9jb2xCaW5kaW5ncyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBwcm90b2NvbEJpbmRpbmdzID0gbmV3IEFycmF5TGlzdDxqYXZhLmxhbmcuU3RyaW5nPigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzLnByb3RvY29sQmluZGluZ3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGhhbmRsZXIgcHJvcGVydHkuCi0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBUaGlzIGFjY2Vzc29yIG1ldGhvZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBsaXZlIGxpc3QsIG5vdCBhIHNuYXBzaG90LiBUaGVyZWZvcmUgYW55Ci0gICAgICogbW9kaWZpY2F0aW9uIHlvdSBtYWtlIHRvIHRoZSByZXR1cm5lZCBsaXN0IHdpbGwgYmUgcHJlc2VudCBpbnNpZGUgdGhlIEpBWEIgb2JqZWN0LiBUaGlzIGlzCi0gICAgICogd2h5IHRoZXJlIGlzIG5vdCBhIDxDT0RFPnNldDwvQ09ERT4gbWV0aG9kIGZvciB0aGUgaGFuZGxlciBwcm9wZXJ0eS4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIEZvciBleGFtcGxlLCB0byBhZGQgYSBuZXcgaXRlbSwgZG8gYXMgZm9sbG93czoKLSAgICAgKiA8cHJlPgotICAgICAqICAgIGdldEhhbmRsZXIoKS5hZGQobmV3SXRlbSk7Ci0gICAgICogPC9wcmU+Ci0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogT2JqZWN0cyBvZiB0aGUgZm9sbG93aW5nIHR5cGUocykgYXJlIGFsbG93ZWQgaW4gdGhlIGxpc3Qge0BsaW5rIFNlcnZpY2VSZWZIYW5kbGVyVHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIExpc3Q8U2VydmljZVJlZkhhbmRsZXJUeXBlPiBnZXRIYW5kbGVyKCkgewotICAgICAgICBpZiAoaGFuZGxlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBoYW5kbGVyID0gbmV3IEFycmF5TGlzdDxTZXJ2aWNlUmVmSGFuZGxlclR5cGU+KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgaWQgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHBvc3NpYmxlIG9iamVjdCBpcyB7QGxpbmsgamF2YS5sYW5nLlN0cmluZyB9Ci0gICAgICovCi0gICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0SWQoKSB7Ci0gICAgICAgIHJldHVybiBpZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgaWQgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgYWxsb3dlZCBvYmplY3QgaXMge0BsaW5rIGphdmEubGFuZy5TdHJpbmcgfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldElkKGphdmEubGFuZy5TdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5pZCA9IHZhbHVlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvU2VydmljZVJlZkhhbmRsZXJDaGFpbnNUeXBlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9TZXJ2aWNlUmVmSGFuZGxlckNoYWluc1R5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk0NDgxMC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9TZXJ2aWNlUmVmSGFuZGxlckNoYWluc1R5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLwotLy8gVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIEphdmFUTSBBcmNoaXRlY3R1cmUgZm9yIFhNTCBCaW5kaW5nKEpBWEIpIFJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbiwgdjIuMC1iNTItZmNzIAotLy8gU2VlIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGIiPmh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGI8L2E+IAotLy8gQW55IG1vZGlmaWNhdGlvbnMgdG8gdGhpcyBmaWxlIHdpbGwgYmUgbG9zdCB1cG9uIHJlY29tcGlsYXRpb24gb2YgdGhlIHNvdXJjZSBzY2hlbWEuIAotLy8gR2VuZXJhdGVkIG9uOiAyMDA3LjAzLjIxIGF0IDEwOjU2OjUxIEFNIENEVCAKLS8vCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLnhtbC5oYW5kbGVyOwotCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQXR0cmlidXRlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbElEOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLmFkYXB0ZXJzLkNvbGxhcHNlZFN0cmluZ0FkYXB0ZXI7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5hZGFwdGVycy5YbWxKYXZhVHlwZUFkYXB0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotCi0vKioKLSAqIFRoZSBoYW5kbGVyLWNoYWlucyBlbGVtZW50IGRlZmluZXMgdGhlIGhhbmRsZXJjaGFpbnMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc2VydmljZSBvciBzZXJ2aWNlCi0gKiBlbmRwb2ludC4KLSAqIDxwLz4KLSAqIDxwLz4KLSAqIDxwLz4KLSAqIDxwPkphdmEgY2xhc3MgZm9yIHNlcnZpY2UtcmVmX2hhbmRsZXItY2hhaW5zVHlwZSBjb21wbGV4IHR5cGUuCi0gKiA8cC8+Ci0gKiA8cD5UaGUgZm9sbG93aW5nIHNjaGVtYSBmcmFnbWVudCBzcGVjaWZpZXMgdGhlIGV4cGVjdGVkIGNvbnRlbnQgY29udGFpbmVkIHdpdGhpbiB0aGlzIGNsYXNzLgotICogPHAvPgotICogPHByZT4KLSAqICZsdDtjb21wbGV4VHlwZSBuYW1lPSJzZXJ2aWNlLXJlZl9oYW5kbGVyLWNoYWluc1R5cGUiPgotICogICAmbHQ7Y29tcGxleENvbnRlbnQ+Ci0gKiAgICAgJmx0O3Jlc3RyaWN0aW9uIGJhc2U9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1hbnlUeXBlIj4KLSAqICAgICAgICZsdDtzZXF1ZW5jZT4KLSAqICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0iaGFuZGxlci1jaGFpbiIgdHlwZT0ie2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZX1zZXJ2aWNlLXJlZl9oYW5kbGVyLWNoYWluVHlwZSIKLSAqIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiLz4KLSAqICAgICAgICZsdDsvc2VxdWVuY2U+Ci0gKiAgICAgICAmbHQ7YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9SUQiIC8+Ci0gKiAgICAgJmx0Oy9yZXN0cmljdGlvbj4KLSAqICAgJmx0Oy9jb21wbGV4Q29udGVudD4KLSAqICZsdDsvY29tcGxleFR5cGU+Ci0gKiA8L3ByZT4KLSAqLwotQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKQotQFhtbFR5cGUobmFtZSA9ICJzZXJ2aWNlLXJlZl9oYW5kbGVyLWNoYWluc1R5cGUiLCBwcm9wT3JkZXIgPSB7Ci0gICAgICAgICJoYW5kbGVyQ2hhaW4iCi0gICAgICAgIH0pCi1wdWJsaWMgY2xhc3MgU2VydmljZVJlZkhhbmRsZXJDaGFpbnNUeXBlIHsKLQotICAgIEBYbWxFbGVtZW50KG5hbWUgPSAiaGFuZGxlci1jaGFpbiIsIG5hbWVzcGFjZSA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiLAotICAgICAgICAgICAgICAgIHJlcXVpcmVkID0gdHJ1ZSkKLSAgICBwcm90ZWN0ZWQgTGlzdDxTZXJ2aWNlUmVmSGFuZGxlckNoYWluVHlwZT4gaGFuZGxlckNoYWluOwotICAgIEBYbWxBdHRyaWJ1dGUKLSAgICBAWG1sSmF2YVR5cGVBZGFwdGVyKENvbGxhcHNlZFN0cmluZ0FkYXB0ZXIuY2xhc3MpCi0gICAgQFhtbElECi0gICAgcHJvdGVjdGVkIGphdmEubGFuZy5TdHJpbmcgaWQ7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgaGFuZGxlckNoYWluIHByb3BlcnR5LgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhpcyBhY2Nlc3NvciBtZXRob2QgcmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgbGl2ZSBsaXN0LCBub3QgYSBzbmFwc2hvdC4gVGhlcmVmb3JlIGFueQotICAgICAqIG1vZGlmaWNhdGlvbiB5b3UgbWFrZSB0byB0aGUgcmV0dXJuZWQgbGlzdCB3aWxsIGJlIHByZXNlbnQgaW5zaWRlIHRoZSBKQVhCIG9iamVjdC4gVGhpcyBpcwotICAgICAqIHdoeSB0aGVyZSBpcyBub3QgYSA8Q09ERT5zZXQ8L0NPREU+IG1ldGhvZCBmb3IgdGhlIGhhbmRsZXJDaGFpbiBwcm9wZXJ0eS4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIEZvciBleGFtcGxlLCB0byBhZGQgYSBuZXcgaXRlbSwgZG8gYXMgZm9sbG93czoKLSAgICAgKiA8cHJlPgotICAgICAqICAgIGdldEhhbmRsZXJDaGFpbigpLmFkZChuZXdJdGVtKTsKLSAgICAgKiA8L3ByZT4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBPYmplY3RzIG9mIHRoZSBmb2xsb3dpbmcgdHlwZShzKSBhcmUgYWxsb3dlZCBpbiB0aGUgbGlzdCB7QGxpbmsgU2VydmljZVJlZkhhbmRsZXJDaGFpblR5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PFNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5UeXBlPiBnZXRIYW5kbGVyQ2hhaW4oKSB7Ci0gICAgICAgIGlmIChoYW5kbGVyQ2hhaW4gPT0gbnVsbCkgewotICAgICAgICAgICAgaGFuZGxlckNoYWluID0gbmV3IEFycmF5TGlzdDxTZXJ2aWNlUmVmSGFuZGxlckNoYWluVHlwZT4oKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVyQ2hhaW47Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGlkIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiBwb3NzaWJsZSBvYmplY3QgaXMge0BsaW5rIGphdmEubGFuZy5TdHJpbmcgfQotICAgICAqLwotICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldElkKCkgewotICAgICAgICByZXR1cm4gaWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGlkIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIGFsbG93ZWQgb2JqZWN0IGlzIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJZChqYXZhLmxhbmcuU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMuaWQgPSB2YWx1ZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL1NlcnZpY2VSZWZIYW5kbGVyVHlwZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvU2VydmljZVJlZkhhbmRsZXJUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjYmQ3ZjUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvU2VydmljZVJlZkhhbmRsZXJUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8KLS8vIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IHRoZSBKYXZhVE0gQXJjaGl0ZWN0dXJlIGZvciBYTUwgQmluZGluZyhKQVhCKSBSZWZlcmVuY2UgSW1wbGVtZW50YXRpb24sIHYyLjAtYjUyLWZjcyAKLS8vIFNlZSA8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9qYXhiIj5odHRwOi8vamF2YS5zdW4uY29tL3htbC9qYXhiPC9hPiAKLS8vIEFueSBtb2RpZmljYXRpb25zIHRvIHRoaXMgZmlsZSB3aWxsIGJlIGxvc3QgdXBvbiByZWNvbXBpbGF0aW9uIG9mIHRoZSBzb3VyY2Ugc2NoZW1hLiAKLS8vIEdlbmVyYXRlZCBvbjogMjAwNy4wMy4yMSBhdCAxMDo1Njo1MSBBTSBDRFQgCi0vLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi54bWwuaGFuZGxlcjsKLQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEF0dHJpYnV0ZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxJRDsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5hZGFwdGVycy5Db2xsYXBzZWRTdHJpbmdBZGFwdGVyOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uYWRhcHRlcnMuWG1sSmF2YVR5cGVBZGFwdGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLQotLyoqCi0gKiBEZWNsYXJlcyB0aGUgaGFuZGxlciBmb3IgYSBwb3J0LWNvbXBvbmVudC4gSGFuZGxlcnMgY2FuIGFjY2VzcyB0aGUgaW5pdC1wYXJhbSBuYW1lL3ZhbHVlIHBhaXJzCi0gKiB1c2luZyB0aGUgSGFuZGxlckluZm8gaW50ZXJmYWNlLiBJZiBwb3J0LW5hbWUgaXMgbm90IHNwZWNpZmllZCwgdGhlIGhhbmRsZXIgaXMgYXNzdW1lZCB0byBiZQotICogYXNzb2NpYXRlZCB3aXRoIGFsbCBwb3J0cyBvZiB0aGUgc2VydmljZS4KLSAqIDxwLz4KLSAqIFVzZWQgaW46IHNlcnZpY2UtcmVmCi0gKiA8cC8+Ci0gKiA8cC8+Ci0gKiA8cC8+Ci0gKiA8cD5KYXZhIGNsYXNzIGZvciBzZXJ2aWNlLXJlZl9oYW5kbGVyVHlwZSBjb21wbGV4IHR5cGUuCi0gKiA8cC8+Ci0gKiA8cD5UaGUgZm9sbG93aW5nIHNjaGVtYSBmcmFnbWVudCBzcGVjaWZpZXMgdGhlIGV4cGVjdGVkIGNvbnRlbnQgY29udGFpbmVkIHdpdGhpbiB0aGlzIGNsYXNzLgotICogPHAvPgotICogPHByZT4KLSAqICZsdDtjb21wbGV4VHlwZSBuYW1lPSJzZXJ2aWNlLXJlZl9oYW5kbGVyVHlwZSI+Ci0gKiAgICZsdDtjb21wbGV4Q29udGVudD4KLSAqICAgICAmbHQ7cmVzdHJpY3Rpb24gYmFzZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfWFueVR5cGUiPgotICogICAgICAgJmx0O3NlcXVlbmNlPgotICogICAgICAgICAmbHQ7Z3JvdXAgcmVmPSJ7aHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlfWRlc2NyaXB0aW9uR3JvdXAiLz4KLSAqICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0iaGFuZGxlci1uYW1lIiB0eXBlPSJ7aHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlfXN0cmluZyIvPgotICogICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJoYW5kbGVyLWNsYXNzIiB0eXBlPSJ7aHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlfWZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiLz4KLSAqICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0iaW5pdC1wYXJhbSIgdHlwZT0ie2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZX1wYXJhbS12YWx1ZVR5cGUiCi0gKiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIi8+Ci0gKiAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9InNvYXAtaGVhZGVyIiB0eXBlPSJ7aHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlfXhzZFFOYW1lVHlwZSIKLSAqIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiLz4KLSAqICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0ic29hcC1yb2xlIiB0eXBlPSJ7aHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlfXN0cmluZyIKLSAqIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiLz4KLSAqICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0icG9ydC1uYW1lIiB0eXBlPSJ7aHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlfXN0cmluZyIKLSAqIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiLz4KLSAqICAgICAgICZsdDsvc2VxdWVuY2U+Ci0gKiAgICAgICAmbHQ7YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9SUQiIC8+Ci0gKiAgICAgJmx0Oy9yZXN0cmljdGlvbj4KLSAqICAgJmx0Oy9jb21wbGV4Q29udGVudD4KLSAqICZsdDsvY29tcGxleFR5cGU+Ci0gKiA8L3ByZT4KLSAqLwotQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKQotQFhtbFR5cGUobmFtZSA9ICJzZXJ2aWNlLXJlZl9oYW5kbGVyVHlwZSIsIHByb3BPcmRlciA9IHsKLSAgICAgICAgImRlc2NyaXB0aW9uIiwKLSAgICAgICAgImRpc3BsYXlOYW1lIiwKLSAgICAgICAgImljb24iLAotICAgICAgICAiaGFuZGxlck5hbWUiLAotICAgICAgICAiaGFuZGxlckNsYXNzIiwKLSAgICAgICAgImluaXRQYXJhbSIsCi0gICAgICAgICJzb2FwSGVhZGVyIiwKLSAgICAgICAgInNvYXBSb2xlIiwKLSAgICAgICAgInBvcnROYW1lIgotICAgICAgICB9KQotcHVibGljIGNsYXNzIFNlcnZpY2VSZWZIYW5kbGVyVHlwZSB7Ci0KLSAgICBAWG1sRWxlbWVudChuYW1lc3BhY2UgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiwgcmVxdWlyZWQgPSB0cnVlKQotICAgIHByb3RlY3RlZCBMaXN0PERlc2NyaXB0aW9uVHlwZT4gZGVzY3JpcHRpb247Ci0gICAgQFhtbEVsZW1lbnQobmFtZSA9ICJkaXNwbGF5LW5hbWUiLCBuYW1lc3BhY2UgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiwKLSAgICAgICAgICAgICAgICByZXF1aXJlZCA9IHRydWUpCi0gICAgcHJvdGVjdGVkIExpc3Q8RGlzcGxheU5hbWVUeXBlPiBkaXNwbGF5TmFtZTsKLSAgICBAWG1sRWxlbWVudChuYW1lc3BhY2UgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiwgcmVxdWlyZWQgPSB0cnVlKQotICAgIHByb3RlY3RlZCBMaXN0PEljb25UeXBlPiBpY29uOwotICAgIEBYbWxFbGVtZW50KG5hbWUgPSAiaGFuZGxlci1uYW1lIiwgbmFtZXNwYWNlID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIsCi0gICAgICAgICAgICAgICAgcmVxdWlyZWQgPSB0cnVlKQotICAgIHByb3RlY3RlZCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLnhtbC5oYW5kbGVyLlN0cmluZyBoYW5kbGVyTmFtZTsKLSAgICBAWG1sRWxlbWVudChuYW1lID0gImhhbmRsZXItY2xhc3MiLCBuYW1lc3BhY2UgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiwKLSAgICAgICAgICAgICAgICByZXF1aXJlZCA9IHRydWUpCi0gICAgcHJvdGVjdGVkIEZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlIGhhbmRsZXJDbGFzczsKLSAgICBAWG1sRWxlbWVudChuYW1lID0gImluaXQtcGFyYW0iLCBuYW1lc3BhY2UgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiwKLSAgICAgICAgICAgICAgICByZXF1aXJlZCA9IHRydWUpCi0gICAgcHJvdGVjdGVkIExpc3Q8UGFyYW1WYWx1ZVR5cGU+IGluaXRQYXJhbTsKLSAgICBAWG1sRWxlbWVudChuYW1lID0gInNvYXAtaGVhZGVyIiwgbmFtZXNwYWNlID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIsCi0gICAgICAgICAgICAgICAgcmVxdWlyZWQgPSB0cnVlKQotICAgIHByb3RlY3RlZCBMaXN0PFhzZFFOYW1lVHlwZT4gc29hcEhlYWRlcjsKLSAgICBAWG1sRWxlbWVudChuYW1lID0gInNvYXAtcm9sZSIsIG5hbWVzcGFjZSA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiLAotICAgICAgICAgICAgICAgIHJlcXVpcmVkID0gdHJ1ZSkKLSAgICBwcm90ZWN0ZWQgTGlzdDxvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLnhtbC5oYW5kbGVyLlN0cmluZz4gc29hcFJvbGU7Ci0gICAgQFhtbEVsZW1lbnQobmFtZSA9ICJwb3J0LW5hbWUiLCBuYW1lc3BhY2UgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiwKLSAgICAgICAgICAgICAgICByZXF1aXJlZCA9IHRydWUpCi0gICAgcHJvdGVjdGVkIExpc3Q8b3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi54bWwuaGFuZGxlci5TdHJpbmc+IHBvcnROYW1lOwotICAgIEBYbWxBdHRyaWJ1dGUKLSAgICBAWG1sSmF2YVR5cGVBZGFwdGVyKENvbGxhcHNlZFN0cmluZ0FkYXB0ZXIuY2xhc3MpCi0gICAgQFhtbElECi0gICAgcHJvdGVjdGVkIGphdmEubGFuZy5TdHJpbmcgaWQ7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZGVzY3JpcHRpb24gcHJvcGVydHkuCi0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBUaGlzIGFjY2Vzc29yIG1ldGhvZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBsaXZlIGxpc3QsIG5vdCBhIHNuYXBzaG90LiBUaGVyZWZvcmUgYW55Ci0gICAgICogbW9kaWZpY2F0aW9uIHlvdSBtYWtlIHRvIHRoZSByZXR1cm5lZCBsaXN0IHdpbGwgYmUgcHJlc2VudCBpbnNpZGUgdGhlIEpBWEIgb2JqZWN0LiBUaGlzIGlzCi0gICAgICogd2h5IHRoZXJlIGlzIG5vdCBhIDxDT0RFPnNldDwvQ09ERT4gbWV0aG9kIGZvciB0aGUgZGVzY3JpcHRpb24gcHJvcGVydHkuCi0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBGb3IgZXhhbXBsZSwgdG8gYWRkIGEgbmV3IGl0ZW0sIGRvIGFzIGZvbGxvd3M6Ci0gICAgICogPHByZT4KLSAgICAgKiAgICBnZXREZXNjcmlwdGlvbigpLmFkZChuZXdJdGVtKTsKLSAgICAgKiA8L3ByZT4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBPYmplY3RzIG9mIHRoZSBmb2xsb3dpbmcgdHlwZShzKSBhcmUgYWxsb3dlZCBpbiB0aGUgbGlzdCB7QGxpbmsgRGVzY3JpcHRpb25UeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxEZXNjcmlwdGlvblR5cGU+IGdldERlc2NyaXB0aW9uKCkgewotICAgICAgICBpZiAoZGVzY3JpcHRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgZGVzY3JpcHRpb24gPSBuZXcgQXJyYXlMaXN0PERlc2NyaXB0aW9uVHlwZT4oKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpcy5kZXNjcmlwdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZGlzcGxheU5hbWUgcHJvcGVydHkuCi0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBUaGlzIGFjY2Vzc29yIG1ldGhvZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBsaXZlIGxpc3QsIG5vdCBhIHNuYXBzaG90LiBUaGVyZWZvcmUgYW55Ci0gICAgICogbW9kaWZpY2F0aW9uIHlvdSBtYWtlIHRvIHRoZSByZXR1cm5lZCBsaXN0IHdpbGwgYmUgcHJlc2VudCBpbnNpZGUgdGhlIEpBWEIgb2JqZWN0LiBUaGlzIGlzCi0gICAgICogd2h5IHRoZXJlIGlzIG5vdCBhIDxDT0RFPnNldDwvQ09ERT4gbWV0aG9kIGZvciB0aGUgZGlzcGxheU5hbWUgcHJvcGVydHkuCi0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBGb3IgZXhhbXBsZSwgdG8gYWRkIGEgbmV3IGl0ZW0sIGRvIGFzIGZvbGxvd3M6Ci0gICAgICogPHByZT4KLSAgICAgKiAgICBnZXREaXNwbGF5TmFtZSgpLmFkZChuZXdJdGVtKTsKLSAgICAgKiA8L3ByZT4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBPYmplY3RzIG9mIHRoZSBmb2xsb3dpbmcgdHlwZShzKSBhcmUgYWxsb3dlZCBpbiB0aGUgbGlzdCB7QGxpbmsgRGlzcGxheU5hbWVUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxEaXNwbGF5TmFtZVR5cGU+IGdldERpc3BsYXlOYW1lKCkgewotICAgICAgICBpZiAoZGlzcGxheU5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgZGlzcGxheU5hbWUgPSBuZXcgQXJyYXlMaXN0PERpc3BsYXlOYW1lVHlwZT4oKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpcy5kaXNwbGF5TmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgaWNvbiBwcm9wZXJ0eS4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIFRoaXMgYWNjZXNzb3IgbWV0aG9kIHJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIGxpdmUgbGlzdCwgbm90IGEgc25hcHNob3QuIFRoZXJlZm9yZSBhbnkKLSAgICAgKiBtb2RpZmljYXRpb24geW91IG1ha2UgdG8gdGhlIHJldHVybmVkIGxpc3Qgd2lsbCBiZSBwcmVzZW50IGluc2lkZSB0aGUgSkFYQiBvYmplY3QuIFRoaXMgaXMKLSAgICAgKiB3aHkgdGhlcmUgaXMgbm90IGEgPENPREU+c2V0PC9DT0RFPiBtZXRob2QgZm9yIHRoZSBpY29uIHByb3BlcnR5LgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogRm9yIGV4YW1wbGUsIHRvIGFkZCBhIG5ldyBpdGVtLCBkbyBhcyBmb2xsb3dzOgotICAgICAqIDxwcmU+Ci0gICAgICogICAgZ2V0SWNvbigpLmFkZChuZXdJdGVtKTsKLSAgICAgKiA8L3ByZT4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBPYmplY3RzIG9mIHRoZSBmb2xsb3dpbmcgdHlwZShzKSBhcmUgYWxsb3dlZCBpbiB0aGUgbGlzdCB7QGxpbmsgSWNvblR5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PEljb25UeXBlPiBnZXRJY29uKCkgewotICAgICAgICBpZiAoaWNvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpY29uID0gbmV3IEFycmF5TGlzdDxJY29uVHlwZT4oKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpcy5pY29uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBoYW5kbGVyTmFtZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzIHtAbGluayBTdHJpbmcgfQotICAgICAqLwotICAgIHB1YmxpYyBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLnhtbC5oYW5kbGVyLlN0cmluZyBnZXRIYW5kbGVyTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGhhbmRsZXJOYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBoYW5kbGVyTmFtZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcyB7QGxpbmsgU3RyaW5nCi0gICAgICogICAgICAgICAgICAgIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRIYW5kbGVyTmFtZShvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLnhtbC5oYW5kbGVyLlN0cmluZyB2YWx1ZSkgewotICAgICAgICB0aGlzLmhhbmRsZXJOYW1lID0gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGhhbmRsZXJDbGFzcyBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzIHtAbGluayBGdWxseVF1YWxpZmllZENsYXNzVHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIEZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlIGdldEhhbmRsZXJDbGFzcygpIHsKLSAgICAgICAgcmV0dXJuIGhhbmRsZXJDbGFzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgaGFuZGxlckNsYXNzIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIGFsbG93ZWQgb2JqZWN0IGlzIHtAbGluayBGdWxseVF1YWxpZmllZENsYXNzVHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SGFuZGxlckNsYXNzKEZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMuaGFuZGxlckNsYXNzID0gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGluaXRQYXJhbSBwcm9wZXJ0eS4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIFRoaXMgYWNjZXNzb3IgbWV0aG9kIHJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIGxpdmUgbGlzdCwgbm90IGEgc25hcHNob3QuIFRoZXJlZm9yZSBhbnkKLSAgICAgKiBtb2RpZmljYXRpb24geW91IG1ha2UgdG8gdGhlIHJldHVybmVkIGxpc3Qgd2lsbCBiZSBwcmVzZW50IGluc2lkZSB0aGUgSkFYQiBvYmplY3QuIFRoaXMgaXMKLSAgICAgKiB3aHkgdGhlcmUgaXMgbm90IGEgPENPREU+c2V0PC9DT0RFPiBtZXRob2QgZm9yIHRoZSBpbml0UGFyYW0gcHJvcGVydHkuCi0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBGb3IgZXhhbXBsZSwgdG8gYWRkIGEgbmV3IGl0ZW0sIGRvIGFzIGZvbGxvd3M6Ci0gICAgICogPHByZT4KLSAgICAgKiAgICBnZXRJbml0UGFyYW0oKS5hZGQobmV3SXRlbSk7Ci0gICAgICogPC9wcmU+Ci0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogT2JqZWN0cyBvZiB0aGUgZm9sbG93aW5nIHR5cGUocykgYXJlIGFsbG93ZWQgaW4gdGhlIGxpc3Qge0BsaW5rIFBhcmFtVmFsdWVUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxQYXJhbVZhbHVlVHlwZT4gZ2V0SW5pdFBhcmFtKCkgewotICAgICAgICBpZiAoaW5pdFBhcmFtID09IG51bGwpIHsKLSAgICAgICAgICAgIGluaXRQYXJhbSA9IG5ldyBBcnJheUxpc3Q8UGFyYW1WYWx1ZVR5cGU+KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMuaW5pdFBhcmFtOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBzb2FwSGVhZGVyIHByb3BlcnR5LgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhpcyBhY2Nlc3NvciBtZXRob2QgcmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgbGl2ZSBsaXN0LCBub3QgYSBzbmFwc2hvdC4gVGhlcmVmb3JlIGFueQotICAgICAqIG1vZGlmaWNhdGlvbiB5b3UgbWFrZSB0byB0aGUgcmV0dXJuZWQgbGlzdCB3aWxsIGJlIHByZXNlbnQgaW5zaWRlIHRoZSBKQVhCIG9iamVjdC4gVGhpcyBpcwotICAgICAqIHdoeSB0aGVyZSBpcyBub3QgYSA8Q09ERT5zZXQ8L0NPREU+IG1ldGhvZCBmb3IgdGhlIHNvYXBIZWFkZXIgcHJvcGVydHkuCi0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBGb3IgZXhhbXBsZSwgdG8gYWRkIGEgbmV3IGl0ZW0sIGRvIGFzIGZvbGxvd3M6Ci0gICAgICogPHByZT4KLSAgICAgKiAgICBnZXRTb2FwSGVhZGVyKCkuYWRkKG5ld0l0ZW0pOwotICAgICAqIDwvcHJlPgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIE9iamVjdHMgb2YgdGhlIGZvbGxvd2luZyB0eXBlKHMpIGFyZSBhbGxvd2VkIGluIHRoZSBsaXN0IHtAbGluayBYc2RRTmFtZVR5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PFhzZFFOYW1lVHlwZT4gZ2V0U29hcEhlYWRlcigpIHsKLSAgICAgICAgaWYgKHNvYXBIZWFkZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgc29hcEhlYWRlciA9IG5ldyBBcnJheUxpc3Q8WHNkUU5hbWVUeXBlPigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzLnNvYXBIZWFkZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIHNvYXBSb2xlIHByb3BlcnR5LgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhpcyBhY2Nlc3NvciBtZXRob2QgcmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgbGl2ZSBsaXN0LCBub3QgYSBzbmFwc2hvdC4gVGhlcmVmb3JlIGFueQotICAgICAqIG1vZGlmaWNhdGlvbiB5b3UgbWFrZSB0byB0aGUgcmV0dXJuZWQgbGlzdCB3aWxsIGJlIHByZXNlbnQgaW5zaWRlIHRoZSBKQVhCIG9iamVjdC4gVGhpcyBpcwotICAgICAqIHdoeSB0aGVyZSBpcyBub3QgYSA8Q09ERT5zZXQ8L0NPREU+IG1ldGhvZCBmb3IgdGhlIHNvYXBSb2xlIHByb3BlcnR5LgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogRm9yIGV4YW1wbGUsIHRvIGFkZCBhIG5ldyBpdGVtLCBkbyBhcyBmb2xsb3dzOgotICAgICAqIDxwcmU+Ci0gICAgICogICAgZ2V0U29hcFJvbGUoKS5hZGQobmV3SXRlbSk7Ci0gICAgICogPC9wcmU+Ci0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogT2JqZWN0cyBvZiB0aGUgZm9sbG93aW5nIHR5cGUocykgYXJlIGFsbG93ZWQgaW4gdGhlIGxpc3Qge0BsaW5rCi0gICAgICogb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi54bWwuaGFuZGxlci5TdHJpbmcgfQotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24ueG1sLmhhbmRsZXIuU3RyaW5nPiBnZXRTb2FwUm9sZSgpIHsKLSAgICAgICAgaWYgKHNvYXBSb2xlID09IG51bGwpIHsKLSAgICAgICAgICAgIHNvYXBSb2xlID0gbmV3IEFycmF5TGlzdDxvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLnhtbC5oYW5kbGVyLlN0cmluZz4oKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpcy5zb2FwUm9sZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgcG9ydE5hbWUgcHJvcGVydHkuCi0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBUaGlzIGFjY2Vzc29yIG1ldGhvZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBsaXZlIGxpc3QsIG5vdCBhIHNuYXBzaG90LiBUaGVyZWZvcmUgYW55Ci0gICAgICogbW9kaWZpY2F0aW9uIHlvdSBtYWtlIHRvIHRoZSByZXR1cm5lZCBsaXN0IHdpbGwgYmUgcHJlc2VudCBpbnNpZGUgdGhlIEpBWEIgb2JqZWN0LiBUaGlzIGlzCi0gICAgICogd2h5IHRoZXJlIGlzIG5vdCBhIDxDT0RFPnNldDwvQ09ERT4gbWV0aG9kIGZvciB0aGUgcG9ydE5hbWUgcHJvcGVydHkuCi0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBGb3IgZXhhbXBsZSwgdG8gYWRkIGEgbmV3IGl0ZW0sIGRvIGFzIGZvbGxvd3M6Ci0gICAgICogPHByZT4KLSAgICAgKiAgICBnZXRQb3J0TmFtZSgpLmFkZChuZXdJdGVtKTsKLSAgICAgKiA8L3ByZT4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBPYmplY3RzIG9mIHRoZSBmb2xsb3dpbmcgdHlwZShzKSBhcmUgYWxsb3dlZCBpbiB0aGUgbGlzdCB7QGxpbmsKLSAgICAgKiBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLnhtbC5oYW5kbGVyLlN0cmluZyB9Ci0gICAgICovCi0gICAgcHVibGljIExpc3Q8b3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi54bWwuaGFuZGxlci5TdHJpbmc+IGdldFBvcnROYW1lKCkgewotICAgICAgICBpZiAocG9ydE5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgcG9ydE5hbWUgPSBuZXcgQXJyYXlMaXN0PG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24ueG1sLmhhbmRsZXIuU3RyaW5nPigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzLnBvcnROYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBpZCBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRJZCgpIHsKLSAgICAgICAgcmV0dXJuIGlkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBpZCBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcyB7QGxpbmsgamF2YS5sYW5nLlN0cmluZyB9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SWQoamF2YS5sYW5nLlN0cmluZyB2YWx1ZSkgewotICAgICAgICB0aGlzLmlkID0gdmFsdWU7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9TZXJ2aWNlUmVmVHlwZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvU2VydmljZVJlZlR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk3MzVmYi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9TZXJ2aWNlUmVmVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDU2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vCi0vLyBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSB0aGUgSmF2YVRNIEFyY2hpdGVjdHVyZSBmb3IgWE1MIEJpbmRpbmcoSkFYQikgUmVmZXJlbmNlIEltcGxlbWVudGF0aW9uLCB2Mi4wLWI1Mi1mY3MgCi0vLyBTZWUgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YiI+aHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YjwvYT4gCi0vLyBBbnkgbW9kaWZpY2F0aW9ucyB0byB0aGlzIGZpbGUgd2lsbCBiZSBsb3N0IHVwb24gcmVjb21waWxhdGlvbiBvZiB0aGUgc291cmNlIHNjaGVtYS4gCi0vLyBHZW5lcmF0ZWQgb246IDIwMDcuMDMuMjEgYXQgMTA6NTY6NTEgQU0gQ0RUIAotLy8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24ueG1sLmhhbmRsZXI7Ci0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBdHRyaWJ1dGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50OwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sSUQ7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uYWRhcHRlcnMuQ29sbGFwc2VkU3RyaW5nQWRhcHRlcjsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLmFkYXB0ZXJzLlhtbEphdmFUeXBlQWRhcHRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0KLS8qKgotICogVGhlIHNlcnZpY2UtcmVmIGVsZW1lbnQgZGVjbGFyZXMgYSByZWZlcmVuY2UgdG8gYSBXZWIgc2VydmljZS4gSXQgY29udGFpbnMgb3B0aW9uYWwgZGVzY3JpcHRpb24sCi0gKiBkaXNwbGF5IG5hbWUgYW5kIGljb25zLCBhIGRlY2xhcmF0aW9uIG9mIHRoZSByZXF1aXJlZCBTZXJ2aWNlIGludGVyZmFjZSwgYW4gb3B0aW9uYWwgV1NETAotICogZG9jdW1lbnQgbG9jYXRpb24sIGFuIG9wdGlvbmFsIHNldCBvZiBKQVgtUlBDIG1hcHBpbmdzLCBhbiBvcHRpb25hbCBRTmFtZSBmb3IgdGhlIHNlcnZpY2UKLSAqIGVsZW1lbnQsIGFuIG9wdGlvbmFsIHNldCBvZiBTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZXMgdG8gYmUgcmVzb2x2ZWQgYnkgdGhlIGNvbnRhaW5lciB0byBhIFdTREwKLSAqIHBvcnQsIGFuZCBhbiBvcHRpb25hbCBzZXQgb2YgaGFuZGxlcnMuCi0gKiA8cC8+Ci0gKiA8cC8+Ci0gKiA8cC8+Ci0gKiA8cD5KYXZhIGNsYXNzIGZvciBzZXJ2aWNlLXJlZlR5cGUgY29tcGxleCB0eXBlLgotICogPHAvPgotICogPHA+VGhlIGZvbGxvd2luZyBzY2hlbWEgZnJhZ21lbnQgc3BlY2lmaWVzIHRoZSBleHBlY3RlZCBjb250ZW50IGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBjbGFzcy4KLSAqIDxwLz4KLSAqIDxwcmU+Ci0gKiAmbHQ7Y29tcGxleFR5cGUgbmFtZT0ic2VydmljZS1yZWZUeXBlIj4KLSAqICAgJmx0O2NvbXBsZXhDb250ZW50PgotICogICAgICZsdDtyZXN0cmljdGlvbiBiYXNlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9YW55VHlwZSI+Ci0gKiAgICAgICAmbHQ7c2VxdWVuY2U+Ci0gKiAgICAgICAgICZsdDtncm91cCByZWY9IntodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWV9ZGVzY3JpcHRpb25Hcm91cCIvPgotICogICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJzZXJ2aWNlLXJlZi1uYW1lIiB0eXBlPSJ7aHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlfWpuZGktbmFtZVR5cGUiLz4KLSAqICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0ic2VydmljZS1pbnRlcmZhY2UiIHR5cGU9IntodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWV9ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIvPgotICogICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJzZXJ2aWNlLXJlZi10eXBlIiB0eXBlPSJ7aHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlfWZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiCi0gKiBtaW5PY2N1cnM9IjAiLz4KLSAqICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0id3NkbC1maWxlIiB0eXBlPSJ7aHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlfXhzZEFueVVSSVR5cGUiCi0gKiBtaW5PY2N1cnM9IjAiLz4KLSAqICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0iamF4cnBjLW1hcHBpbmctZmlsZSIgdHlwZT0ie2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZX1wYXRoVHlwZSIKLSAqIG1pbk9jY3Vycz0iMCIvPgotICogICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJzZXJ2aWNlLXFuYW1lIiB0eXBlPSJ7aHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlfXhzZFFOYW1lVHlwZSIKLSAqIG1pbk9jY3Vycz0iMCIvPgotICogICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJwb3J0LWNvbXBvbmVudC1yZWYiIHR5cGU9IntodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWV9cG9ydC1jb21wb25lbnQtcmVmVHlwZSIKLSAqIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiLz4KLSAqICAgICAgICAgJmx0O2Nob2ljZT4KLSAqICAgICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJoYW5kbGVyIiB0eXBlPSJ7aHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlfXNlcnZpY2UtcmVmX2hhbmRsZXJUeXBlIgotICogbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCIvPgotICogICAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9ImhhbmRsZXItY2hhaW5zIiB0eXBlPSJ7aHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlfXNlcnZpY2UtcmVmX2hhbmRsZXItY2hhaW5zVHlwZSIKLSAqIG1pbk9jY3Vycz0iMCIvPgotICogICAgICAgICAmbHQ7L2Nob2ljZT4KLSAqICAgICAgICAgJmx0O2dyb3VwIHJlZj0ie2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZX1yZXNvdXJjZUdyb3VwIi8+Ci0gKiAgICAgICAmbHQ7L3NlcXVlbmNlPgotICogICAgICAgJmx0O2F0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfUlEIiAvPgotICogICAgICZsdDsvcmVzdHJpY3Rpb24+Ci0gKiAgICZsdDsvY29tcGxleENvbnRlbnQ+Ci0gKiAmbHQ7L2NvbXBsZXhUeXBlPgotICogPC9wcmU+Ci0gKi8KLUBYbWxBY2Nlc3NvclR5cGUoWG1sQWNjZXNzVHlwZS5GSUVMRCkKLUBYbWxUeXBlKG5hbWUgPSAic2VydmljZS1yZWZUeXBlIiwgcHJvcE9yZGVyID0gewotICAgICAgICAiZGVzY3JpcHRpb24iLAotICAgICAgICAiZGlzcGxheU5hbWUiLAotICAgICAgICAiaWNvbiIsCi0gICAgICAgICJzZXJ2aWNlUmVmTmFtZSIsCi0gICAgICAgICJzZXJ2aWNlSW50ZXJmYWNlIiwKLSAgICAgICAgInNlcnZpY2VSZWZUeXBlIiwKLSAgICAgICAgIndzZGxGaWxlIiwKLSAgICAgICAgImpheHJwY01hcHBpbmdGaWxlIiwKLSAgICAgICAgInNlcnZpY2VRbmFtZSIsCi0gICAgICAgICJwb3J0Q29tcG9uZW50UmVmIiwKLSAgICAgICAgImhhbmRsZXIiLAotICAgICAgICAiaGFuZGxlckNoYWlucyIsCi0gICAgICAgICJtYXBwZWROYW1lIiwKLSAgICAgICAgImluamVjdGlvblRhcmdldCIKLSAgICAgICAgfSkKLXB1YmxpYyBjbGFzcyBTZXJ2aWNlUmVmVHlwZSB7Ci0KLSAgICBAWG1sRWxlbWVudChuYW1lc3BhY2UgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiwgcmVxdWlyZWQgPSB0cnVlKQotICAgIHByb3RlY3RlZCBMaXN0PERlc2NyaXB0aW9uVHlwZT4gZGVzY3JpcHRpb247Ci0gICAgQFhtbEVsZW1lbnQobmFtZSA9ICJkaXNwbGF5LW5hbWUiLCBuYW1lc3BhY2UgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiwKLSAgICAgICAgICAgICAgICByZXF1aXJlZCA9IHRydWUpCi0gICAgcHJvdGVjdGVkIExpc3Q8RGlzcGxheU5hbWVUeXBlPiBkaXNwbGF5TmFtZTsKLSAgICBAWG1sRWxlbWVudChuYW1lc3BhY2UgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiwgcmVxdWlyZWQgPSB0cnVlKQotICAgIHByb3RlY3RlZCBMaXN0PEljb25UeXBlPiBpY29uOwotICAgIEBYbWxFbGVtZW50KG5hbWUgPSAic2VydmljZS1yZWYtbmFtZSIsIG5hbWVzcGFjZSA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiLAotICAgICAgICAgICAgICAgIHJlcXVpcmVkID0gdHJ1ZSkKLSAgICBwcm90ZWN0ZWQgSm5kaU5hbWVUeXBlIHNlcnZpY2VSZWZOYW1lOwotICAgIEBYbWxFbGVtZW50KG5hbWUgPSAic2VydmljZS1pbnRlcmZhY2UiLCBuYW1lc3BhY2UgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiwKLSAgICAgICAgICAgICAgICByZXF1aXJlZCA9IHRydWUpCi0gICAgcHJvdGVjdGVkIEZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlIHNlcnZpY2VJbnRlcmZhY2U7Ci0gICAgQFhtbEVsZW1lbnQobmFtZSA9ICJzZXJ2aWNlLXJlZi10eXBlIiwgbmFtZXNwYWNlID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIpCi0gICAgcHJvdGVjdGVkIEZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlIHNlcnZpY2VSZWZUeXBlOwotICAgIEBYbWxFbGVtZW50KG5hbWUgPSAid3NkbC1maWxlIiwgbmFtZXNwYWNlID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIpCi0gICAgcHJvdGVjdGVkIFhzZEFueVVSSVR5cGUgd3NkbEZpbGU7Ci0gICAgQFhtbEVsZW1lbnQobmFtZSA9ICJqYXhycGMtbWFwcGluZy1maWxlIiwgbmFtZXNwYWNlID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIpCi0gICAgcHJvdGVjdGVkIFBhdGhUeXBlIGpheHJwY01hcHBpbmdGaWxlOwotICAgIEBYbWxFbGVtZW50KG5hbWUgPSAic2VydmljZS1xbmFtZSIsIG5hbWVzcGFjZSA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiKQotICAgIHByb3RlY3RlZCBYc2RRTmFtZVR5cGUgc2VydmljZVFuYW1lOwotICAgIEBYbWxFbGVtZW50KG5hbWUgPSAicG9ydC1jb21wb25lbnQtcmVmIiwgbmFtZXNwYWNlID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIsCi0gICAgICAgICAgICAgICAgcmVxdWlyZWQgPSB0cnVlKQotICAgIHByb3RlY3RlZCBMaXN0PFBvcnRDb21wb25lbnRSZWZUeXBlPiBwb3J0Q29tcG9uZW50UmVmOwotICAgIEBYbWxFbGVtZW50KG5hbWVzcGFjZSA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiLCByZXF1aXJlZCA9IHRydWUpCi0gICAgcHJvdGVjdGVkIExpc3Q8U2VydmljZVJlZkhhbmRsZXJUeXBlPiBoYW5kbGVyOwotICAgIEBYbWxFbGVtZW50KG5hbWUgPSAiaGFuZGxlci1jaGFpbnMiLCBuYW1lc3BhY2UgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIikKLSAgICBwcm90ZWN0ZWQgU2VydmljZVJlZkhhbmRsZXJDaGFpbnNUeXBlIGhhbmRsZXJDaGFpbnM7Ci0gICAgQFhtbEVsZW1lbnQobmFtZSA9ICJtYXBwZWQtbmFtZSIsIG5hbWVzcGFjZSA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiKQotICAgIHByb3RlY3RlZCBYc2RTdHJpbmdUeXBlIG1hcHBlZE5hbWU7Ci0gICAgQFhtbEVsZW1lbnQobmFtZSA9ICJpbmplY3Rpb24tdGFyZ2V0IiwgbmFtZXNwYWNlID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIsCi0gICAgICAgICAgICAgICAgcmVxdWlyZWQgPSB0cnVlKQotICAgIHByb3RlY3RlZCBMaXN0PEluamVjdGlvblRhcmdldFR5cGU+IGluamVjdGlvblRhcmdldDsKLSAgICBAWG1sQXR0cmlidXRlCi0gICAgQFhtbEphdmFUeXBlQWRhcHRlcihDb2xsYXBzZWRTdHJpbmdBZGFwdGVyLmNsYXNzKQotICAgIEBYbWxJRAotICAgIHByb3RlY3RlZCBqYXZhLmxhbmcuU3RyaW5nIGlkOwotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGRlc2NyaXB0aW9uIHByb3BlcnR5LgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhpcyBhY2Nlc3NvciBtZXRob2QgcmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgbGl2ZSBsaXN0LCBub3QgYSBzbmFwc2hvdC4gVGhlcmVmb3JlIGFueQotICAgICAqIG1vZGlmaWNhdGlvbiB5b3UgbWFrZSB0byB0aGUgcmV0dXJuZWQgbGlzdCB3aWxsIGJlIHByZXNlbnQgaW5zaWRlIHRoZSBKQVhCIG9iamVjdC4gVGhpcyBpcwotICAgICAqIHdoeSB0aGVyZSBpcyBub3QgYSA8Q09ERT5zZXQ8L0NPREU+IG1ldGhvZCBmb3IgdGhlIGRlc2NyaXB0aW9uIHByb3BlcnR5LgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogRm9yIGV4YW1wbGUsIHRvIGFkZCBhIG5ldyBpdGVtLCBkbyBhcyBmb2xsb3dzOgotICAgICAqIDxwcmU+Ci0gICAgICogICAgZ2V0RGVzY3JpcHRpb24oKS5hZGQobmV3SXRlbSk7Ci0gICAgICogPC9wcmU+Ci0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogT2JqZWN0cyBvZiB0aGUgZm9sbG93aW5nIHR5cGUocykgYXJlIGFsbG93ZWQgaW4gdGhlIGxpc3Qge0BsaW5rIERlc2NyaXB0aW9uVHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIExpc3Q8RGVzY3JpcHRpb25UeXBlPiBnZXREZXNjcmlwdGlvbigpIHsKLSAgICAgICAgaWYgKGRlc2NyaXB0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gbmV3IEFycmF5TGlzdDxEZXNjcmlwdGlvblR5cGU+KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMuZGVzY3JpcHRpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGRpc3BsYXlOYW1lIHByb3BlcnR5LgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhpcyBhY2Nlc3NvciBtZXRob2QgcmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgbGl2ZSBsaXN0LCBub3QgYSBzbmFwc2hvdC4gVGhlcmVmb3JlIGFueQotICAgICAqIG1vZGlmaWNhdGlvbiB5b3UgbWFrZSB0byB0aGUgcmV0dXJuZWQgbGlzdCB3aWxsIGJlIHByZXNlbnQgaW5zaWRlIHRoZSBKQVhCIG9iamVjdC4gVGhpcyBpcwotICAgICAqIHdoeSB0aGVyZSBpcyBub3QgYSA8Q09ERT5zZXQ8L0NPREU+IG1ldGhvZCBmb3IgdGhlIGRpc3BsYXlOYW1lIHByb3BlcnR5LgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogRm9yIGV4YW1wbGUsIHRvIGFkZCBhIG5ldyBpdGVtLCBkbyBhcyBmb2xsb3dzOgotICAgICAqIDxwcmU+Ci0gICAgICogICAgZ2V0RGlzcGxheU5hbWUoKS5hZGQobmV3SXRlbSk7Ci0gICAgICogPC9wcmU+Ci0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogT2JqZWN0cyBvZiB0aGUgZm9sbG93aW5nIHR5cGUocykgYXJlIGFsbG93ZWQgaW4gdGhlIGxpc3Qge0BsaW5rIERpc3BsYXlOYW1lVHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIExpc3Q8RGlzcGxheU5hbWVUeXBlPiBnZXREaXNwbGF5TmFtZSgpIHsKLSAgICAgICAgaWYgKGRpc3BsYXlOYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIGRpc3BsYXlOYW1lID0gbmV3IEFycmF5TGlzdDxEaXNwbGF5TmFtZVR5cGU+KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMuZGlzcGxheU5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGljb24gcHJvcGVydHkuCi0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBUaGlzIGFjY2Vzc29yIG1ldGhvZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBsaXZlIGxpc3QsIG5vdCBhIHNuYXBzaG90LiBUaGVyZWZvcmUgYW55Ci0gICAgICogbW9kaWZpY2F0aW9uIHlvdSBtYWtlIHRvIHRoZSByZXR1cm5lZCBsaXN0IHdpbGwgYmUgcHJlc2VudCBpbnNpZGUgdGhlIEpBWEIgb2JqZWN0LiBUaGlzIGlzCi0gICAgICogd2h5IHRoZXJlIGlzIG5vdCBhIDxDT0RFPnNldDwvQ09ERT4gbWV0aG9kIGZvciB0aGUgaWNvbiBwcm9wZXJ0eS4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIEZvciBleGFtcGxlLCB0byBhZGQgYSBuZXcgaXRlbSwgZG8gYXMgZm9sbG93czoKLSAgICAgKiA8cHJlPgotICAgICAqICAgIGdldEljb24oKS5hZGQobmV3SXRlbSk7Ci0gICAgICogPC9wcmU+Ci0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogT2JqZWN0cyBvZiB0aGUgZm9sbG93aW5nIHR5cGUocykgYXJlIGFsbG93ZWQgaW4gdGhlIGxpc3Qge0BsaW5rIEljb25UeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxJY29uVHlwZT4gZ2V0SWNvbigpIHsKLSAgICAgICAgaWYgKGljb24gPT0gbnVsbCkgewotICAgICAgICAgICAgaWNvbiA9IG5ldyBBcnJheUxpc3Q8SWNvblR5cGU+KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMuaWNvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgc2VydmljZVJlZk5hbWUgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHBvc3NpYmxlIG9iamVjdCBpcyB7QGxpbmsgSm5kaU5hbWVUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgSm5kaU5hbWVUeXBlIGdldFNlcnZpY2VSZWZOYW1lKCkgewotICAgICAgICByZXR1cm4gc2VydmljZVJlZk5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHNlcnZpY2VSZWZOYW1lIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIGFsbG93ZWQgb2JqZWN0IGlzIHtAbGluayBKbmRpTmFtZVR5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VSZWZOYW1lKEpuZGlOYW1lVHlwZSB2YWx1ZSkgewotICAgICAgICB0aGlzLnNlcnZpY2VSZWZOYW1lID0gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIHNlcnZpY2VJbnRlcmZhY2UgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHBvc3NpYmxlIG9iamVjdCBpcyB7QGxpbmsgRnVsbHlRdWFsaWZpZWRDbGFzc1R5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyBGdWxseVF1YWxpZmllZENsYXNzVHlwZSBnZXRTZXJ2aWNlSW50ZXJmYWNlKCkgewotICAgICAgICByZXR1cm4gc2VydmljZUludGVyZmFjZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgc2VydmljZUludGVyZmFjZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcyB7QGxpbmsgRnVsbHlRdWFsaWZpZWRDbGFzc1R5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VJbnRlcmZhY2UoRnVsbHlRdWFsaWZpZWRDbGFzc1R5cGUgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5zZXJ2aWNlSW50ZXJmYWNlID0gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIHNlcnZpY2VSZWZUeXBlIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiBwb3NzaWJsZSBvYmplY3QgaXMge0BsaW5rIEZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgRnVsbHlRdWFsaWZpZWRDbGFzc1R5cGUgZ2V0U2VydmljZVJlZlR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBzZXJ2aWNlUmVmVHlwZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgc2VydmljZVJlZlR5cGUgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgYWxsb3dlZCBvYmplY3QgaXMge0BsaW5rIEZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlUmVmVHlwZShGdWxseVF1YWxpZmllZENsYXNzVHlwZSB2YWx1ZSkgewotICAgICAgICB0aGlzLnNlcnZpY2VSZWZUeXBlID0gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIHdzZGxGaWxlIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiBwb3NzaWJsZSBvYmplY3QgaXMge0BsaW5rIFhzZEFueVVSSVR5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyBYc2RBbnlVUklUeXBlIGdldFdzZGxGaWxlKCkgewotICAgICAgICByZXR1cm4gd3NkbEZpbGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHdzZGxGaWxlIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIGFsbG93ZWQgb2JqZWN0IGlzIHtAbGluayBYc2RBbnlVUklUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRXc2RsRmlsZShYc2RBbnlVUklUeXBlIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMud3NkbEZpbGUgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgamF4cnBjTWFwcGluZ0ZpbGUgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHBvc3NpYmxlIG9iamVjdCBpcyB7QGxpbmsgUGF0aFR5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyBQYXRoVHlwZSBnZXRKYXhycGNNYXBwaW5nRmlsZSgpIHsKLSAgICAgICAgcmV0dXJuIGpheHJwY01hcHBpbmdGaWxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBqYXhycGNNYXBwaW5nRmlsZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcyB7QGxpbmsgUGF0aFR5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEpheHJwY01hcHBpbmdGaWxlKFBhdGhUeXBlIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMuamF4cnBjTWFwcGluZ0ZpbGUgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgc2VydmljZVFuYW1lIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiBwb3NzaWJsZSBvYmplY3QgaXMge0BsaW5rIFhzZFFOYW1lVHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIFhzZFFOYW1lVHlwZSBnZXRTZXJ2aWNlUW5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBzZXJ2aWNlUW5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHNlcnZpY2VRbmFtZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcyB7QGxpbmsgWHNkUU5hbWVUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlUW5hbWUoWHNkUU5hbWVUeXBlIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMuc2VydmljZVFuYW1lID0gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIHBvcnRDb21wb25lbnRSZWYgcHJvcGVydHkuCi0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBUaGlzIGFjY2Vzc29yIG1ldGhvZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBsaXZlIGxpc3QsIG5vdCBhIHNuYXBzaG90LiBUaGVyZWZvcmUgYW55Ci0gICAgICogbW9kaWZpY2F0aW9uIHlvdSBtYWtlIHRvIHRoZSByZXR1cm5lZCBsaXN0IHdpbGwgYmUgcHJlc2VudCBpbnNpZGUgdGhlIEpBWEIgb2JqZWN0LiBUaGlzIGlzCi0gICAgICogd2h5IHRoZXJlIGlzIG5vdCBhIDxDT0RFPnNldDwvQ09ERT4gbWV0aG9kIGZvciB0aGUgcG9ydENvbXBvbmVudFJlZiBwcm9wZXJ0eS4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIEZvciBleGFtcGxlLCB0byBhZGQgYSBuZXcgaXRlbSwgZG8gYXMgZm9sbG93czoKLSAgICAgKiA8cHJlPgotICAgICAqICAgIGdldFBvcnRDb21wb25lbnRSZWYoKS5hZGQobmV3SXRlbSk7Ci0gICAgICogPC9wcmU+Ci0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogT2JqZWN0cyBvZiB0aGUgZm9sbG93aW5nIHR5cGUocykgYXJlIGFsbG93ZWQgaW4gdGhlIGxpc3Qge0BsaW5rIFBvcnRDb21wb25lbnRSZWZUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxQb3J0Q29tcG9uZW50UmVmVHlwZT4gZ2V0UG9ydENvbXBvbmVudFJlZigpIHsKLSAgICAgICAgaWYgKHBvcnRDb21wb25lbnRSZWYgPT0gbnVsbCkgewotICAgICAgICAgICAgcG9ydENvbXBvbmVudFJlZiA9IG5ldyBBcnJheUxpc3Q8UG9ydENvbXBvbmVudFJlZlR5cGU+KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMucG9ydENvbXBvbmVudFJlZjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgaGFuZGxlciBwcm9wZXJ0eS4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIFRoaXMgYWNjZXNzb3IgbWV0aG9kIHJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIGxpdmUgbGlzdCwgbm90IGEgc25hcHNob3QuIFRoZXJlZm9yZSBhbnkKLSAgICAgKiBtb2RpZmljYXRpb24geW91IG1ha2UgdG8gdGhlIHJldHVybmVkIGxpc3Qgd2lsbCBiZSBwcmVzZW50IGluc2lkZSB0aGUgSkFYQiBvYmplY3QuIFRoaXMgaXMKLSAgICAgKiB3aHkgdGhlcmUgaXMgbm90IGEgPENPREU+c2V0PC9DT0RFPiBtZXRob2QgZm9yIHRoZSBoYW5kbGVyIHByb3BlcnR5LgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogRm9yIGV4YW1wbGUsIHRvIGFkZCBhIG5ldyBpdGVtLCBkbyBhcyBmb2xsb3dzOgotICAgICAqIDxwcmU+Ci0gICAgICogICAgZ2V0SGFuZGxlcigpLmFkZChuZXdJdGVtKTsKLSAgICAgKiA8L3ByZT4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBPYmplY3RzIG9mIHRoZSBmb2xsb3dpbmcgdHlwZShzKSBhcmUgYWxsb3dlZCBpbiB0aGUgbGlzdCB7QGxpbmsgU2VydmljZVJlZkhhbmRsZXJUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxTZXJ2aWNlUmVmSGFuZGxlclR5cGU+IGdldEhhbmRsZXIoKSB7Ci0gICAgICAgIGlmIChoYW5kbGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIGhhbmRsZXIgPSBuZXcgQXJyYXlMaXN0PFNlcnZpY2VSZWZIYW5kbGVyVHlwZT4oKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBoYW5kbGVyQ2hhaW5zIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiBwb3NzaWJsZSBvYmplY3QgaXMge0BsaW5rIFNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5zVHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIFNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5zVHlwZSBnZXRIYW5kbGVyQ2hhaW5zKCkgewotICAgICAgICByZXR1cm4gaGFuZGxlckNoYWluczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgaGFuZGxlckNoYWlucyBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcyB7QGxpbmsgU2VydmljZVJlZkhhbmRsZXJDaGFpbnNUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRIYW5kbGVyQ2hhaW5zKFNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5zVHlwZSB2YWx1ZSkgewotICAgICAgICB0aGlzLmhhbmRsZXJDaGFpbnMgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgbWFwcGVkTmFtZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzIHtAbGluayBYc2RTdHJpbmdUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgWHNkU3RyaW5nVHlwZSBnZXRNYXBwZWROYW1lKCkgewotICAgICAgICByZXR1cm4gbWFwcGVkTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgbWFwcGVkTmFtZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcyB7QGxpbmsgWHNkU3RyaW5nVHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TWFwcGVkTmFtZShYc2RTdHJpbmdUeXBlIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMubWFwcGVkTmFtZSA9IHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBpbmplY3Rpb25UYXJnZXQgcHJvcGVydHkuCi0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBUaGlzIGFjY2Vzc29yIG1ldGhvZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBsaXZlIGxpc3QsIG5vdCBhIHNuYXBzaG90LiBUaGVyZWZvcmUgYW55Ci0gICAgICogbW9kaWZpY2F0aW9uIHlvdSBtYWtlIHRvIHRoZSByZXR1cm5lZCBsaXN0IHdpbGwgYmUgcHJlc2VudCBpbnNpZGUgdGhlIEpBWEIgb2JqZWN0LiBUaGlzIGlzCi0gICAgICogd2h5IHRoZXJlIGlzIG5vdCBhIDxDT0RFPnNldDwvQ09ERT4gbWV0aG9kIGZvciB0aGUgaW5qZWN0aW9uVGFyZ2V0IHByb3BlcnR5LgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogRm9yIGV4YW1wbGUsIHRvIGFkZCBhIG5ldyBpdGVtLCBkbyBhcyBmb2xsb3dzOgotICAgICAqIDxwcmU+Ci0gICAgICogICAgZ2V0SW5qZWN0aW9uVGFyZ2V0KCkuYWRkKG5ld0l0ZW0pOwotICAgICAqIDwvcHJlPgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIE9iamVjdHMgb2YgdGhlIGZvbGxvd2luZyB0eXBlKHMpIGFyZSBhbGxvd2VkIGluIHRoZSBsaXN0IHtAbGluayBJbmplY3Rpb25UYXJnZXRUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxJbmplY3Rpb25UYXJnZXRUeXBlPiBnZXRJbmplY3Rpb25UYXJnZXQoKSB7Ci0gICAgICAgIGlmIChpbmplY3Rpb25UYXJnZXQgPT0gbnVsbCkgewotICAgICAgICAgICAgaW5qZWN0aW9uVGFyZ2V0ID0gbmV3IEFycmF5TGlzdDxJbmplY3Rpb25UYXJnZXRUeXBlPigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzLmluamVjdGlvblRhcmdldDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgaWQgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHBvc3NpYmxlIG9iamVjdCBpcyB7QGxpbmsgamF2YS5sYW5nLlN0cmluZyB9Ci0gICAgICovCi0gICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0SWQoKSB7Ci0gICAgICAgIHJldHVybiBpZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgaWQgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgYWxsb3dlZCBvYmplY3QgaXMge0BsaW5rIGphdmEubGFuZy5TdHJpbmcgfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldElkKGphdmEubGFuZy5TdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5pZCA9IHZhbHVlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvU3RyaW5nLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9TdHJpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I2ZGY4ZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9TdHJpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLwotLy8gVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIEphdmFUTSBBcmNoaXRlY3R1cmUgZm9yIFhNTCBCaW5kaW5nKEpBWEIpIFJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbiwgdjIuMC1iNTItZmNzIAotLy8gU2VlIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGIiPmh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGI8L2E+IAotLy8gQW55IG1vZGlmaWNhdGlvbnMgdG8gdGhpcyBmaWxlIHdpbGwgYmUgbG9zdCB1cG9uIHJlY29tcGlsYXRpb24gb2YgdGhlIHNvdXJjZSBzY2hlbWEuIAotLy8gR2VuZXJhdGVkIG9uOiAyMDA3LjAzLjIxIGF0IDEwOjU2OjUxIEFNIENEVCAKLS8vCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLnhtbC5oYW5kbGVyOwotCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQXR0cmlidXRlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sSUQ7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVmFsdWU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5hZGFwdGVycy5Db2xsYXBzZWRTdHJpbmdBZGFwdGVyOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uYWRhcHRlcnMuWG1sSmF2YVR5cGVBZGFwdGVyOwotCi0KLS8qKgotICogVGhpcyBpcyBhIHNwZWNpYWwgc3RyaW5nIGRhdGF0eXBlIHRoYXQgaXMgZGVmaW5lZCBieSBKYXZhIEVFIGFzIGEgYmFzZSB0eXBlIGZvciBkZWZpbmluZwotICogY29sbGFwc2VkIHN0cmluZ3MuIFdoZW4gc2NoZW1hcyByZXF1aXJlIHRyYWlsaW5nL2xlYWRpbmcgc3BhY2UgZWxpbWluYXRpb24gYXMgd2VsbCBhcyBjb2xsYXBzaW5nCi0gKiB0aGUgZXhpc3Rpbmcgd2hpdGVzcGFjZSwgdGhpcyBiYXNlIHR5cGUgbWF5IGJlIHVzZWQuCi0gKiA8cC8+Ci0gKiA8cC8+Ci0gKiA8cC8+Ci0gKiA8cD5KYXZhIGNsYXNzIGZvciBzdHJpbmcgY29tcGxleCB0eXBlLgotICogPHAvPgotICogPHA+VGhlIGZvbGxvd2luZyBzY2hlbWEgZnJhZ21lbnQgc3BlY2lmaWVzIHRoZSBleHBlY3RlZCBjb250ZW50IGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBjbGFzcy4KLSAqIDxwLz4KLSAqIDxwcmU+Ci0gKiAmbHQ7Y29tcGxleFR5cGUgbmFtZT0ic3RyaW5nIj4KLSAqICAgJmx0O3NpbXBsZUNvbnRlbnQ+Ci0gKiAgICAgJmx0O2V4dGVuc2lvbiBiYXNlPSImbHQ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWE+dG9rZW4iPgotICogICAgICAgJmx0O2F0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfUlEIiAvPgotICogICAgICZsdDsvZXh0ZW5zaW9uPgotICogICAmbHQ7L3NpbXBsZUNvbnRlbnQ+Ci0gKiAmbHQ7L2NvbXBsZXhUeXBlPgotICogPC9wcmU+Ci0gKi8KLUBYbWxBY2Nlc3NvclR5cGUoWG1sQWNjZXNzVHlwZS5GSUVMRCkKLUBYbWxUeXBlKG5hbWUgPSAic3RyaW5nIiwgcHJvcE9yZGVyID0gewotICAgICAgICAidmFsdWUiCi0gICAgICAgIH0pCi1wdWJsaWMgY2xhc3MgU3RyaW5nIHsKLQotICAgIEBYbWxWYWx1ZQotICAgIEBYbWxKYXZhVHlwZUFkYXB0ZXIoQ29sbGFwc2VkU3RyaW5nQWRhcHRlci5jbGFzcykKLSAgICBwcm90ZWN0ZWQgamF2YS5sYW5nLlN0cmluZyB2YWx1ZTsKLSAgICBAWG1sQXR0cmlidXRlCi0gICAgQFhtbEphdmFUeXBlQWRhcHRlcihDb2xsYXBzZWRTdHJpbmdBZGFwdGVyLmNsYXNzKQotICAgIEBYbWxJRAotICAgIHByb3RlY3RlZCBqYXZhLmxhbmcuU3RyaW5nIGlkOwotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIHZhbHVlIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiBwb3NzaWJsZSBvYmplY3QgaXMge0BsaW5rIGphdmEubGFuZy5TdHJpbmcgfQotICAgICAqLwotICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFZhbHVlKCkgewotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHZhbHVlIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIGFsbG93ZWQgb2JqZWN0IGlzIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShqYXZhLmxhbmcuU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgaWQgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHBvc3NpYmxlIG9iamVjdCBpcyB7QGxpbmsgamF2YS5sYW5nLlN0cmluZyB9Ci0gICAgICovCi0gICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0SWQoKSB7Ci0gICAgICAgIHJldHVybiBpZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgaWQgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgYWxsb3dlZCBvYmplY3QgaXMge0BsaW5rIGphdmEubGFuZy5TdHJpbmcgfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldElkKGphdmEubGFuZy5TdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5pZCA9IHZhbHVlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvVHJ1ZUZhbHNlVHlwZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvVHJ1ZUZhbHNlVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTIxYjRlLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL1RydWVGYWxzZVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vCi0vLyBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSB0aGUgSmF2YVRNIEFyY2hpdGVjdHVyZSBmb3IgWE1MIEJpbmRpbmcoSkFYQikgUmVmZXJlbmNlIEltcGxlbWVudGF0aW9uLCB2Mi4wLWI1Mi1mY3MgCi0vLyBTZWUgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YiI+aHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YjwvYT4gCi0vLyBBbnkgbW9kaWZpY2F0aW9ucyB0byB0aGlzIGZpbGUgd2lsbCBiZSBsb3N0IHVwb24gcmVjb21waWxhdGlvbiBvZiB0aGUgc291cmNlIHNjaGVtYS4gCi0vLyBHZW5lcmF0ZWQgb246IDIwMDcuMDMuMjEgYXQgMTA6NTY6NTEgQU0gQ0RUIAotLy8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24ueG1sLmhhbmRsZXI7Ci0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlOwotCi0KLS8qKgotICogVGhpcyBzaW1wbGUgdHlwZSBkZXNpZ25hdGVzIGEgYm9vbGVhbiB3aXRoIG9ubHkgdHdvIHBlcm1pc3NpYmxlIHZhbHVlcwotICogPHAvPgotICogLSB0cnVlIC0gZmFsc2UKLSAqIDxwLz4KLSAqIDxwLz4KLSAqIDxwLz4KLSAqIDxwPkphdmEgY2xhc3MgZm9yIHRydWUtZmFsc2VUeXBlIGNvbXBsZXggdHlwZS4KLSAqIDxwLz4KLSAqIDxwPlRoZSBmb2xsb3dpbmcgc2NoZW1hIGZyYWdtZW50IHNwZWNpZmllcyB0aGUgZXhwZWN0ZWQgY29udGVudCBjb250YWluZWQgd2l0aGluIHRoaXMgY2xhc3MuCi0gKiA8cC8+Ci0gKiA8cHJlPgotICogJmx0O2NvbXBsZXhUeXBlIG5hbWU9InRydWUtZmFsc2VUeXBlIj4KLSAqICAgJmx0O3NpbXBsZUNvbnRlbnQ+Ci0gKiAgICAgJmx0O3Jlc3RyaWN0aW9uIGJhc2U9IiZsdDtodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWU+eHNkQm9vbGVhblR5cGUiPgotICogICAgICZsdDsvcmVzdHJpY3Rpb24+Ci0gKiAgICZsdDsvc2ltcGxlQ29udGVudD4KLSAqICZsdDsvY29tcGxleFR5cGU+Ci0gKiA8L3ByZT4KLSAqLwotQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKQotQFhtbFR5cGUobmFtZSA9ICJ0cnVlLWZhbHNlVHlwZSIpCi1wdWJsaWMgY2xhc3MgVHJ1ZUZhbHNlVHlwZQotICAgICAgICBleHRlbmRzIFhzZEJvb2xlYW5UeXBlIHsKLQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9VcmxQYXR0ZXJuVHlwZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvVXJsUGF0dGVyblR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQzNTZlZi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9VcmxQYXR0ZXJuVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8KLS8vIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IHRoZSBKYXZhVE0gQXJjaGl0ZWN0dXJlIGZvciBYTUwgQmluZGluZyhKQVhCKSBSZWZlcmVuY2UgSW1wbGVtZW50YXRpb24sIHYyLjAtYjUyLWZjcyAKLS8vIFNlZSA8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9qYXhiIj5odHRwOi8vamF2YS5zdW4uY29tL3htbC9qYXhiPC9hPiAKLS8vIEFueSBtb2RpZmljYXRpb25zIHRvIHRoaXMgZmlsZSB3aWxsIGJlIGxvc3QgdXBvbiByZWNvbXBpbGF0aW9uIG9mIHRoZSBzb3VyY2Ugc2NoZW1hLiAKLS8vIEdlbmVyYXRlZCBvbjogMjAwNy4wMy4yMSBhdCAxMDo1Njo1MSBBTSBDRFQgCi0vLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi54bWwuaGFuZGxlcjsKLQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxWYWx1ZTsKLQotCi0vKioKLSAqIFRoZSB1cmwtcGF0dGVyblR5cGUgY29udGFpbnMgdGhlIHVybCBwYXR0ZXJuIG9mIHRoZSBtYXBwaW5nLiBJdCBtdXN0IGZvbGxvdyB0aGUgcnVsZXMgc3BlY2lmaWVkCi0gKiBpbiBTZWN0aW9uIDExLjIgb2YgdGhlIFNlcnZsZXQgQVBJIFNwZWNpZmljYXRpb24uIFRoaXMgcGF0dGVybiBpcyBhc3N1bWVkIHRvIGJlIGluIFVSTC1kZWNvZGVkCi0gKiBmb3JtIGFuZCBtdXN0IG5vdCBjb250YWluIENSKCN4RCkgb3IgTEYoI3hBKS4gSWYgaXQgY29udGFpbnMgdGhvc2UgY2hhcmFjdGVycywgdGhlIGNvbnRhaW5lciBtdXN0Ci0gKiBpbmZvcm0gdGhlIGRldmVsb3BlciB3aXRoIGEgZGVzY3JpcHRpdmUgZXJyb3IgbWVzc2FnZS4gVGhlIGNvbnRhaW5lciBtdXN0IHByZXNlcnZlIGFsbCBjaGFyYWN0ZXJzCi0gKiBpbmNsdWRpbmcgd2hpdGVzcGFjZXMuCi0gKiA8cC8+Ci0gKiA8cC8+Ci0gKiA8cC8+Ci0gKiA8cD5KYXZhIGNsYXNzIGZvciB1cmwtcGF0dGVyblR5cGUgY29tcGxleCB0eXBlLgotICogPHAvPgotICogPHA+VGhlIGZvbGxvd2luZyBzY2hlbWEgZnJhZ21lbnQgc3BlY2lmaWVzIHRoZSBleHBlY3RlZCBjb250ZW50IGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBjbGFzcy4KLSAqIDxwLz4KLSAqIDxwcmU+Ci0gKiAmbHQ7Y29tcGxleFR5cGUgbmFtZT0idXJsLXBhdHRlcm5UeXBlIj4KLSAqICAgJmx0O3NpbXBsZUNvbnRlbnQ+Ci0gKiAgICAgJmx0O2V4dGVuc2lvbiBiYXNlPSImbHQ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWE+c3RyaW5nIj4KLSAqICAgICAmbHQ7L2V4dGVuc2lvbj4KLSAqICAgJmx0Oy9zaW1wbGVDb250ZW50PgotICogJmx0Oy9jb21wbGV4VHlwZT4KLSAqIDwvcHJlPgotICovCi1AWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpCi1AWG1sVHlwZShuYW1lID0gInVybC1wYXR0ZXJuVHlwZSIsIHByb3BPcmRlciA9IHsKLSAgICAgICAgInZhbHVlIgotICAgICAgICB9KQotcHVibGljIGNsYXNzIFVybFBhdHRlcm5UeXBlIHsKLQotICAgIEBYbWxWYWx1ZQotICAgIHByb3RlY3RlZCBqYXZhLmxhbmcuU3RyaW5nIHZhbHVlOwotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIHZhbHVlIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiBwb3NzaWJsZSBvYmplY3QgaXMge0BsaW5rIGphdmEubGFuZy5TdHJpbmcgfQotICAgICAqLwotICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFZhbHVlKCkgewotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHZhbHVlIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIGFsbG93ZWQgb2JqZWN0IGlzIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShqYXZhLmxhbmcuU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL1hzZEFueVVSSVR5cGUuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL1hzZEFueVVSSVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RlODA1MC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9Yc2RBbnlVUklUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8KLS8vIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IHRoZSBKYXZhVE0gQXJjaGl0ZWN0dXJlIGZvciBYTUwgQmluZGluZyhKQVhCKSBSZWZlcmVuY2UgSW1wbGVtZW50YXRpb24sIHYyLjAtYjUyLWZjcyAKLS8vIFNlZSA8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9qYXhiIj5odHRwOi8vamF2YS5zdW4uY29tL3htbC9qYXhiPC9hPiAKLS8vIEFueSBtb2RpZmljYXRpb25zIHRvIHRoaXMgZmlsZSB3aWxsIGJlIGxvc3QgdXBvbiByZWNvbXBpbGF0aW9uIG9mIHRoZSBzb3VyY2Ugc2NoZW1hLiAKLS8vIEdlbmVyYXRlZCBvbjogMjAwNy4wMy4yMSBhdCAxMDo1Njo1MSBBTSBDRFQgCi0vLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi54bWwuaGFuZGxlcjsKLQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEF0dHJpYnV0ZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbElEOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFZhbHVlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uYWRhcHRlcnMuQ29sbGFwc2VkU3RyaW5nQWRhcHRlcjsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLmFkYXB0ZXJzLlhtbEphdmFUeXBlQWRhcHRlcjsKLQotCi0vKioKLSAqIFRoaXMgdHlwZSBhZGRzIGFuICJpZCIgYXR0cmlidXRlIHRvIHhzZDphbnlVUkkuCi0gKiA8cC8+Ci0gKiA8cC8+Ci0gKiA8cC8+Ci0gKiA8cD5KYXZhIGNsYXNzIGZvciB4c2RBbnlVUklUeXBlIGNvbXBsZXggdHlwZS4KLSAqIDxwLz4KLSAqIDxwPlRoZSBmb2xsb3dpbmcgc2NoZW1hIGZyYWdtZW50IHNwZWNpZmllcyB0aGUgZXhwZWN0ZWQgY29udGVudCBjb250YWluZWQgd2l0aGluIHRoaXMgY2xhc3MuCi0gKiA8cC8+Ci0gKiA8cHJlPgotICogJmx0O2NvbXBsZXhUeXBlIG5hbWU9InhzZEFueVVSSVR5cGUiPgotICogICAmbHQ7c2ltcGxlQ29udGVudD4KLSAqICAgICAmbHQ7ZXh0ZW5zaW9uIGJhc2U9IiZsdDtodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYT5hbnlVUkkiPgotICogICAgICAgJmx0O2F0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfUlEIiAvPgotICogICAgICZsdDsvZXh0ZW5zaW9uPgotICogICAmbHQ7L3NpbXBsZUNvbnRlbnQ+Ci0gKiAmbHQ7L2NvbXBsZXhUeXBlPgotICogPC9wcmU+Ci0gKi8KLUBYbWxBY2Nlc3NvclR5cGUoWG1sQWNjZXNzVHlwZS5GSUVMRCkKLUBYbWxUeXBlKG5hbWUgPSAieHNkQW55VVJJVHlwZSIsIHByb3BPcmRlciA9IHsKLSAgICAgICAgInZhbHVlIgotICAgICAgICB9KQotcHVibGljIGNsYXNzIFhzZEFueVVSSVR5cGUgewotCi0gICAgQFhtbFZhbHVlCi0gICAgcHJvdGVjdGVkIGphdmEubGFuZy5TdHJpbmcgdmFsdWU7Ci0gICAgQFhtbEF0dHJpYnV0ZQotICAgIEBYbWxKYXZhVHlwZUFkYXB0ZXIoQ29sbGFwc2VkU3RyaW5nQWRhcHRlci5jbGFzcykKLSAgICBAWG1sSUQKLSAgICBwcm90ZWN0ZWQgamF2YS5sYW5nLlN0cmluZyBpZDsKLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSB2YWx1ZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRWYWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSB2YWx1ZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcyB7QGxpbmsgamF2YS5sYW5nLlN0cmluZyB9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWUoamF2YS5sYW5nLlN0cmluZyB2YWx1ZSkgewotICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGlkIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiBwb3NzaWJsZSBvYmplY3QgaXMge0BsaW5rIGphdmEubGFuZy5TdHJpbmcgfQotICAgICAqLwotICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldElkKCkgewotICAgICAgICByZXR1cm4gaWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGlkIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIGFsbG93ZWQgb2JqZWN0IGlzIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJZChqYXZhLmxhbmcuU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMuaWQgPSB2YWx1ZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL1hzZEJvb2xlYW5UeXBlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9Yc2RCb29sZWFuVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGIwNjY0Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL1hzZEJvb2xlYW5UeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8KLS8vIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IHRoZSBKYXZhVE0gQXJjaGl0ZWN0dXJlIGZvciBYTUwgQmluZGluZyhKQVhCKSBSZWZlcmVuY2UgSW1wbGVtZW50YXRpb24sIHYyLjAtYjUyLWZjcyAKLS8vIFNlZSA8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9qYXhiIj5odHRwOi8vamF2YS5zdW4uY29tL3htbC9qYXhiPC9hPiAKLS8vIEFueSBtb2RpZmljYXRpb25zIHRvIHRoaXMgZmlsZSB3aWxsIGJlIGxvc3QgdXBvbiByZWNvbXBpbGF0aW9uIG9mIHRoZSBzb3VyY2Ugc2NoZW1hLiAKLS8vIEdlbmVyYXRlZCBvbjogMjAwNy4wMy4yMSBhdCAxMDo1Njo1MSBBTSBDRFQgCi0vLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi54bWwuaGFuZGxlcjsKLQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEF0dHJpYnV0ZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbElEOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFZhbHVlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uYWRhcHRlcnMuQ29sbGFwc2VkU3RyaW5nQWRhcHRlcjsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLmFkYXB0ZXJzLlhtbEphdmFUeXBlQWRhcHRlcjsKLQotCi0vKioKLSAqIFRoaXMgdHlwZSBhZGRzIGFuICJpZCIgYXR0cmlidXRlIHRvIHhzZDpib29sZWFuLgotICogPHAvPgotICogPHAvPgotICogPHAvPgotICogPHA+SmF2YSBjbGFzcyBmb3IgeHNkQm9vbGVhblR5cGUgY29tcGxleCB0eXBlLgotICogPHAvPgotICogPHA+VGhlIGZvbGxvd2luZyBzY2hlbWEgZnJhZ21lbnQgc3BlY2lmaWVzIHRoZSBleHBlY3RlZCBjb250ZW50IGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBjbGFzcy4KLSAqIDxwLz4KLSAqIDxwcmU+Ci0gKiAmbHQ7Y29tcGxleFR5cGUgbmFtZT0ieHNkQm9vbGVhblR5cGUiPgotICogICAmbHQ7c2ltcGxlQ29udGVudD4KLSAqICAgICAmbHQ7ZXh0ZW5zaW9uIGJhc2U9IiZsdDtodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYT5ib29sZWFuIj4KLSAqICAgICAgICZsdDthdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1JRCIgLz4KLSAqICAgICAmbHQ7L2V4dGVuc2lvbj4KLSAqICAgJmx0Oy9zaW1wbGVDb250ZW50PgotICogJmx0Oy9jb21wbGV4VHlwZT4KLSAqIDwvcHJlPgotICovCi1AWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpCi1AWG1sVHlwZShuYW1lID0gInhzZEJvb2xlYW5UeXBlIiwgcHJvcE9yZGVyID0gewotICAgICAgICAidmFsdWUiCi0gICAgICAgIH0pCi1wdWJsaWMgY2xhc3MgWHNkQm9vbGVhblR5cGUgewotCi0gICAgQFhtbFZhbHVlCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gdmFsdWU7Ci0gICAgQFhtbEF0dHJpYnV0ZQotICAgIEBYbWxKYXZhVHlwZUFkYXB0ZXIoQ29sbGFwc2VkU3RyaW5nQWRhcHRlci5jbGFzcykKLSAgICBAWG1sSUQKLSAgICBwcm90ZWN0ZWQgamF2YS5sYW5nLlN0cmluZyBpZDsKLQotICAgIC8qKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgdmFsdWUgcHJvcGVydHkuICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNWYWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIC8qKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgdmFsdWUgcHJvcGVydHkuICovCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWUoYm9vbGVhbiB2YWx1ZSkgewotICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGlkIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiBwb3NzaWJsZSBvYmplY3QgaXMge0BsaW5rIGphdmEubGFuZy5TdHJpbmcgfQotICAgICAqLwotICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldElkKCkgewotICAgICAgICByZXR1cm4gaWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGlkIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIGFsbG93ZWQgb2JqZWN0IGlzIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJZChqYXZhLmxhbmcuU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMuaWQgPSB2YWx1ZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL1hzZEludGVnZXJUeXBlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9Yc2RJbnRlZ2VyVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDBjNzY3Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL1hzZEludGVnZXJUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8KLS8vIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IHRoZSBKYXZhVE0gQXJjaGl0ZWN0dXJlIGZvciBYTUwgQmluZGluZyhKQVhCKSBSZWZlcmVuY2UgSW1wbGVtZW50YXRpb24sIHYyLjAtYjUyLWZjcyAKLS8vIFNlZSA8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9qYXhiIj5odHRwOi8vamF2YS5zdW4uY29tL3htbC9qYXhiPC9hPiAKLS8vIEFueSBtb2RpZmljYXRpb25zIHRvIHRoaXMgZmlsZSB3aWxsIGJlIGxvc3QgdXBvbiByZWNvbXBpbGF0aW9uIG9mIHRoZSBzb3VyY2Ugc2NoZW1hLiAKLS8vIEdlbmVyYXRlZCBvbjogMjAwNy4wMy4yMSBhdCAxMDo1Njo1MSBBTSBDRFQgCi0vLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi54bWwuaGFuZGxlcjsKLQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEF0dHJpYnV0ZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbElEOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFZhbHVlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uYWRhcHRlcnMuQ29sbGFwc2VkU3RyaW5nQWRhcHRlcjsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLmFkYXB0ZXJzLlhtbEphdmFUeXBlQWRhcHRlcjsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotCi0vKioKLSAqIFRoaXMgdHlwZSBhZGRzIGFuICJpZCIgYXR0cmlidXRlIHRvIHhzZDppbnRlZ2VyLgotICogPHAvPgotICogPHAvPgotICogPHAvPgotICogPHA+SmF2YSBjbGFzcyBmb3IgeHNkSW50ZWdlclR5cGUgY29tcGxleCB0eXBlLgotICogPHAvPgotICogPHA+VGhlIGZvbGxvd2luZyBzY2hlbWEgZnJhZ21lbnQgc3BlY2lmaWVzIHRoZSBleHBlY3RlZCBjb250ZW50IGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBjbGFzcy4KLSAqIDxwLz4KLSAqIDxwcmU+Ci0gKiAmbHQ7Y29tcGxleFR5cGUgbmFtZT0ieHNkSW50ZWdlclR5cGUiPgotICogICAmbHQ7c2ltcGxlQ29udGVudD4KLSAqICAgICAmbHQ7ZXh0ZW5zaW9uIGJhc2U9IiZsdDtodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYT5pbnRlZ2VyIj4KLSAqICAgICAgICZsdDthdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1JRCIgLz4KLSAqICAgICAmbHQ7L2V4dGVuc2lvbj4KLSAqICAgJmx0Oy9zaW1wbGVDb250ZW50PgotICogJmx0Oy9jb21wbGV4VHlwZT4KLSAqIDwvcHJlPgotICovCi1AWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpCi1AWG1sVHlwZShuYW1lID0gInhzZEludGVnZXJUeXBlIiwgcHJvcE9yZGVyID0gewotICAgICAgICAidmFsdWUiCi0gICAgICAgIH0pCi1wdWJsaWMgY2xhc3MgWHNkSW50ZWdlclR5cGUgewotCi0gICAgQFhtbFZhbHVlCi0gICAgcHJvdGVjdGVkIEJpZ0ludGVnZXIgdmFsdWU7Ci0gICAgQFhtbEF0dHJpYnV0ZQotICAgIEBYbWxKYXZhVHlwZUFkYXB0ZXIoQ29sbGFwc2VkU3RyaW5nQWRhcHRlci5jbGFzcykKLSAgICBAWG1sSUQKLSAgICBwcm90ZWN0ZWQgamF2YS5sYW5nLlN0cmluZyBpZDsKLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSB2YWx1ZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzIHtAbGluayBCaWdJbnRlZ2VyIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgQmlnSW50ZWdlciBnZXRWYWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSB2YWx1ZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcyB7QGxpbmsgQmlnSW50ZWdlciB9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWUoQmlnSW50ZWdlciB2YWx1ZSkgewotICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGlkIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiBwb3NzaWJsZSBvYmplY3QgaXMge0BsaW5rIGphdmEubGFuZy5TdHJpbmcgfQotICAgICAqLwotICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldElkKCkgewotICAgICAgICByZXR1cm4gaWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGlkIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIGFsbG93ZWQgb2JqZWN0IGlzIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJZChqYXZhLmxhbmcuU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMuaWQgPSB2YWx1ZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL1hzZE5NVE9LRU5UeXBlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9Yc2ROTVRPS0VOVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjAwZTY3Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL1hzZE5NVE9LRU5UeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8KLS8vIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IHRoZSBKYXZhVE0gQXJjaGl0ZWN0dXJlIGZvciBYTUwgQmluZGluZyhKQVhCKSBSZWZlcmVuY2UgSW1wbGVtZW50YXRpb24sIHYyLjAtYjUyLWZjcyAKLS8vIFNlZSA8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9qYXhiIj5odHRwOi8vamF2YS5zdW4uY29tL3htbC9qYXhiPC9hPiAKLS8vIEFueSBtb2RpZmljYXRpb25zIHRvIHRoaXMgZmlsZSB3aWxsIGJlIGxvc3QgdXBvbiByZWNvbXBpbGF0aW9uIG9mIHRoZSBzb3VyY2Ugc2NoZW1hLiAKLS8vIEdlbmVyYXRlZCBvbjogMjAwNy4wMy4yMSBhdCAxMDo1Njo1MSBBTSBDRFQgCi0vLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi54bWwuaGFuZGxlcjsKLQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEF0dHJpYnV0ZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbElEOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFZhbHVlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uYWRhcHRlcnMuQ29sbGFwc2VkU3RyaW5nQWRhcHRlcjsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLmFkYXB0ZXJzLlhtbEphdmFUeXBlQWRhcHRlcjsKLQotCi0vKioKLSAqIFRoaXMgdHlwZSBhZGRzIGFuICJpZCIgYXR0cmlidXRlIHRvIHhzZDpOTVRPS0VOLgotICogPHAvPgotICogPHAvPgotICogPHAvPgotICogPHA+SmF2YSBjbGFzcyBmb3IgeHNkTk1UT0tFTlR5cGUgY29tcGxleCB0eXBlLgotICogPHAvPgotICogPHA+VGhlIGZvbGxvd2luZyBzY2hlbWEgZnJhZ21lbnQgc3BlY2lmaWVzIHRoZSBleHBlY3RlZCBjb250ZW50IGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBjbGFzcy4KLSAqIDxwLz4KLSAqIDxwcmU+Ci0gKiAmbHQ7Y29tcGxleFR5cGUgbmFtZT0ieHNkTk1UT0tFTlR5cGUiPgotICogICAmbHQ7c2ltcGxlQ29udGVudD4KLSAqICAgICAmbHQ7ZXh0ZW5zaW9uIGJhc2U9IiZsdDtodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYT5OTVRPS0VOIj4KLSAqICAgICAgICZsdDthdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1JRCIgLz4KLSAqICAgICAmbHQ7L2V4dGVuc2lvbj4KLSAqICAgJmx0Oy9zaW1wbGVDb250ZW50PgotICogJmx0Oy9jb21wbGV4VHlwZT4KLSAqIDwvcHJlPgotICovCi1AWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpCi1AWG1sVHlwZShuYW1lID0gInhzZE5NVE9LRU5UeXBlIiwgcHJvcE9yZGVyID0gewotICAgICAgICAidmFsdWUiCi0gICAgICAgIH0pCi1wdWJsaWMgY2xhc3MgWHNkTk1UT0tFTlR5cGUgewotCi0gICAgQFhtbFZhbHVlCi0gICAgQFhtbEphdmFUeXBlQWRhcHRlcihDb2xsYXBzZWRTdHJpbmdBZGFwdGVyLmNsYXNzKQotICAgIHByb3RlY3RlZCBqYXZhLmxhbmcuU3RyaW5nIHZhbHVlOwotICAgIEBYbWxBdHRyaWJ1dGUKLSAgICBAWG1sSmF2YVR5cGVBZGFwdGVyKENvbGxhcHNlZFN0cmluZ0FkYXB0ZXIuY2xhc3MpCi0gICAgQFhtbElECi0gICAgcHJvdGVjdGVkIGphdmEubGFuZy5TdHJpbmcgaWQ7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgdmFsdWUgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHBvc3NpYmxlIG9iamVjdCBpcyB7QGxpbmsgamF2YS5sYW5nLlN0cmluZyB9Ci0gICAgICovCi0gICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0VmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgdmFsdWUgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgYWxsb3dlZCBvYmplY3QgaXMge0BsaW5rIGphdmEubGFuZy5TdHJpbmcgfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKGphdmEubGFuZy5TdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBpZCBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRJZCgpIHsKLSAgICAgICAgcmV0dXJuIGlkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBpZCBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcyB7QGxpbmsgamF2YS5sYW5nLlN0cmluZyB9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SWQoamF2YS5sYW5nLlN0cmluZyB2YWx1ZSkgewotICAgICAgICB0aGlzLmlkID0gdmFsdWU7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9Yc2ROb25OZWdhdGl2ZUludGVnZXJUeXBlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9Yc2ROb25OZWdhdGl2ZUludGVnZXJUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyM2RmZGMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvWHNkTm9uTmVnYXRpdmVJbnRlZ2VyVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vCi0vLyBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSB0aGUgSmF2YVRNIEFyY2hpdGVjdHVyZSBmb3IgWE1MIEJpbmRpbmcoSkFYQikgUmVmZXJlbmNlIEltcGxlbWVudGF0aW9uLCB2Mi4wLWI1Mi1mY3MgCi0vLyBTZWUgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YiI+aHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YjwvYT4gCi0vLyBBbnkgbW9kaWZpY2F0aW9ucyB0byB0aGlzIGZpbGUgd2lsbCBiZSBsb3N0IHVwb24gcmVjb21waWxhdGlvbiBvZiB0aGUgc291cmNlIHNjaGVtYS4gCi0vLyBHZW5lcmF0ZWQgb246IDIwMDcuMDMuMjEgYXQgMTA6NTY6NTEgQU0gQ0RUIAotLy8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24ueG1sLmhhbmRsZXI7Ci0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBdHRyaWJ1dGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxJRDsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxWYWx1ZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLmFkYXB0ZXJzLkNvbGxhcHNlZFN0cmluZ0FkYXB0ZXI7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5hZGFwdGVycy5YbWxKYXZhVHlwZUFkYXB0ZXI7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLQotLyoqCi0gKiBUaGlzIHR5cGUgYWRkcyBhbiAiaWQiIGF0dHJpYnV0ZSB0byB4c2Q6bm9uTmVnYXRpdmVJbnRlZ2VyLgotICogPHAvPgotICogPHAvPgotICogPHAvPgotICogPHA+SmF2YSBjbGFzcyBmb3IgeHNkTm9uTmVnYXRpdmVJbnRlZ2VyVHlwZSBjb21wbGV4IHR5cGUuCi0gKiA8cC8+Ci0gKiA8cD5UaGUgZm9sbG93aW5nIHNjaGVtYSBmcmFnbWVudCBzcGVjaWZpZXMgdGhlIGV4cGVjdGVkIGNvbnRlbnQgY29udGFpbmVkIHdpdGhpbiB0aGlzIGNsYXNzLgotICogPHAvPgotICogPHByZT4KLSAqICZsdDtjb21wbGV4VHlwZSBuYW1lPSJ4c2ROb25OZWdhdGl2ZUludGVnZXJUeXBlIj4KLSAqICAgJmx0O3NpbXBsZUNvbnRlbnQ+Ci0gKiAgICAgJmx0O2V4dGVuc2lvbiBiYXNlPSImbHQ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWE+bm9uTmVnYXRpdmVJbnRlZ2VyIj4KLSAqICAgICAgICZsdDthdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1JRCIgLz4KLSAqICAgICAmbHQ7L2V4dGVuc2lvbj4KLSAqICAgJmx0Oy9zaW1wbGVDb250ZW50PgotICogJmx0Oy9jb21wbGV4VHlwZT4KLSAqIDwvcHJlPgotICovCi1AWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpCi1AWG1sVHlwZShuYW1lID0gInhzZE5vbk5lZ2F0aXZlSW50ZWdlclR5cGUiLCBwcm9wT3JkZXIgPSB7Ci0gICAgICAgICJ2YWx1ZSIKLSAgICAgICAgfSkKLXB1YmxpYyBjbGFzcyBYc2ROb25OZWdhdGl2ZUludGVnZXJUeXBlIHsKLQotICAgIEBYbWxWYWx1ZQotICAgIHByb3RlY3RlZCBCaWdJbnRlZ2VyIHZhbHVlOwotICAgIEBYbWxBdHRyaWJ1dGUKLSAgICBAWG1sSmF2YVR5cGVBZGFwdGVyKENvbGxhcHNlZFN0cmluZ0FkYXB0ZXIuY2xhc3MpCi0gICAgQFhtbElECi0gICAgcHJvdGVjdGVkIGphdmEubGFuZy5TdHJpbmcgaWQ7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgdmFsdWUgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHBvc3NpYmxlIG9iamVjdCBpcyB7QGxpbmsgQmlnSW50ZWdlciB9Ci0gICAgICovCi0gICAgcHVibGljIEJpZ0ludGVnZXIgZ2V0VmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgdmFsdWUgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgYWxsb3dlZCBvYmplY3QgaXMge0BsaW5rIEJpZ0ludGVnZXIgfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKEJpZ0ludGVnZXIgdmFsdWUpIHsKLSAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBpZCBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRJZCgpIHsKLSAgICAgICAgcmV0dXJuIGlkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBpZCBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcyB7QGxpbmsgamF2YS5sYW5nLlN0cmluZyB9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SWQoamF2YS5sYW5nLlN0cmluZyB2YWx1ZSkgewotICAgICAgICB0aGlzLmlkID0gdmFsdWU7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9Yc2RQb3NpdGl2ZUludGVnZXJUeXBlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9Yc2RQb3NpdGl2ZUludGVnZXJUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0OGMwNzIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvWHNkUG9zaXRpdmVJbnRlZ2VyVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vCi0vLyBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSB0aGUgSmF2YVRNIEFyY2hpdGVjdHVyZSBmb3IgWE1MIEJpbmRpbmcoSkFYQikgUmVmZXJlbmNlIEltcGxlbWVudGF0aW9uLCB2Mi4wLWI1Mi1mY3MgCi0vLyBTZWUgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YiI+aHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YjwvYT4gCi0vLyBBbnkgbW9kaWZpY2F0aW9ucyB0byB0aGlzIGZpbGUgd2lsbCBiZSBsb3N0IHVwb24gcmVjb21waWxhdGlvbiBvZiB0aGUgc291cmNlIHNjaGVtYS4gCi0vLyBHZW5lcmF0ZWQgb246IDIwMDcuMDMuMjEgYXQgMTA6NTY6NTEgQU0gQ0RUIAotLy8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24ueG1sLmhhbmRsZXI7Ci0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBdHRyaWJ1dGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxJRDsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxWYWx1ZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLmFkYXB0ZXJzLkNvbGxhcHNlZFN0cmluZ0FkYXB0ZXI7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5hZGFwdGVycy5YbWxKYXZhVHlwZUFkYXB0ZXI7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLQotLyoqCi0gKiBUaGlzIHR5cGUgYWRkcyBhbiAiaWQiIGF0dHJpYnV0ZSB0byB4c2Q6cG9zaXRpdmVJbnRlZ2VyLgotICogPHAvPgotICogPHAvPgotICogPHAvPgotICogPHA+SmF2YSBjbGFzcyBmb3IgeHNkUG9zaXRpdmVJbnRlZ2VyVHlwZSBjb21wbGV4IHR5cGUuCi0gKiA8cC8+Ci0gKiA8cD5UaGUgZm9sbG93aW5nIHNjaGVtYSBmcmFnbWVudCBzcGVjaWZpZXMgdGhlIGV4cGVjdGVkIGNvbnRlbnQgY29udGFpbmVkIHdpdGhpbiB0aGlzIGNsYXNzLgotICogPHAvPgotICogPHByZT4KLSAqICZsdDtjb21wbGV4VHlwZSBuYW1lPSJ4c2RQb3NpdGl2ZUludGVnZXJUeXBlIj4KLSAqICAgJmx0O3NpbXBsZUNvbnRlbnQ+Ci0gKiAgICAgJmx0O2V4dGVuc2lvbiBiYXNlPSImbHQ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWE+cG9zaXRpdmVJbnRlZ2VyIj4KLSAqICAgICAgICZsdDthdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1JRCIgLz4KLSAqICAgICAmbHQ7L2V4dGVuc2lvbj4KLSAqICAgJmx0Oy9zaW1wbGVDb250ZW50PgotICogJmx0Oy9jb21wbGV4VHlwZT4KLSAqIDwvcHJlPgotICovCi1AWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpCi1AWG1sVHlwZShuYW1lID0gInhzZFBvc2l0aXZlSW50ZWdlclR5cGUiLCBwcm9wT3JkZXIgPSB7Ci0gICAgICAgICJ2YWx1ZSIKLSAgICAgICAgfSkKLXB1YmxpYyBjbGFzcyBYc2RQb3NpdGl2ZUludGVnZXJUeXBlIHsKLQotICAgIEBYbWxWYWx1ZQotICAgIHByb3RlY3RlZCBCaWdJbnRlZ2VyIHZhbHVlOwotICAgIEBYbWxBdHRyaWJ1dGUKLSAgICBAWG1sSmF2YVR5cGVBZGFwdGVyKENvbGxhcHNlZFN0cmluZ0FkYXB0ZXIuY2xhc3MpCi0gICAgQFhtbElECi0gICAgcHJvdGVjdGVkIGphdmEubGFuZy5TdHJpbmcgaWQ7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgdmFsdWUgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHBvc3NpYmxlIG9iamVjdCBpcyB7QGxpbmsgQmlnSW50ZWdlciB9Ci0gICAgICovCi0gICAgcHVibGljIEJpZ0ludGVnZXIgZ2V0VmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgdmFsdWUgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgYWxsb3dlZCBvYmplY3QgaXMge0BsaW5rIEJpZ0ludGVnZXIgfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKEJpZ0ludGVnZXIgdmFsdWUpIHsKLSAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBpZCBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRJZCgpIHsKLSAgICAgICAgcmV0dXJuIGlkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBpZCBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcyB7QGxpbmsgamF2YS5sYW5nLlN0cmluZyB9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SWQoamF2YS5sYW5nLlN0cmluZyB2YWx1ZSkgewotICAgICAgICB0aGlzLmlkID0gdmFsdWU7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9Yc2RRTmFtZVR5cGUuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL1hzZFFOYW1lVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODhmN2VlLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL1hzZFFOYW1lVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vCi0vLyBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSB0aGUgSmF2YVRNIEFyY2hpdGVjdHVyZSBmb3IgWE1MIEJpbmRpbmcoSkFYQikgUmVmZXJlbmNlIEltcGxlbWVudGF0aW9uLCB2Mi4wLWI1Mi1mY3MgCi0vLyBTZWUgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YiI+aHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YjwvYT4gCi0vLyBBbnkgbW9kaWZpY2F0aW9ucyB0byB0aGlzIGZpbGUgd2lsbCBiZSBsb3N0IHVwb24gcmVjb21waWxhdGlvbiBvZiB0aGUgc291cmNlIHNjaGVtYS4gCi0vLyBHZW5lcmF0ZWQgb246IDIwMDcuMDMuMjEgYXQgMTA6NTY6NTEgQU0gQ0RUIAotLy8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24ueG1sLmhhbmRsZXI7Ci0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBdHRyaWJ1dGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxJRDsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxWYWx1ZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLmFkYXB0ZXJzLkNvbGxhcHNlZFN0cmluZ0FkYXB0ZXI7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5hZGFwdGVycy5YbWxKYXZhVHlwZUFkYXB0ZXI7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotCi0vKioKLSAqIFRoaXMgdHlwZSBhZGRzIGFuICJpZCIgYXR0cmlidXRlIHRvIHhzZDpRTmFtZS4KLSAqIDxwLz4KLSAqIDxwLz4KLSAqIDxwLz4KLSAqIDxwPkphdmEgY2xhc3MgZm9yIHhzZFFOYW1lVHlwZSBjb21wbGV4IHR5cGUuCi0gKiA8cC8+Ci0gKiA8cD5UaGUgZm9sbG93aW5nIHNjaGVtYSBmcmFnbWVudCBzcGVjaWZpZXMgdGhlIGV4cGVjdGVkIGNvbnRlbnQgY29udGFpbmVkIHdpdGhpbiB0aGlzIGNsYXNzLgotICogPHAvPgotICogPHByZT4KLSAqICZsdDtjb21wbGV4VHlwZSBuYW1lPSJ4c2RRTmFtZVR5cGUiPgotICogICAmbHQ7c2ltcGxlQ29udGVudD4KLSAqICAgICAmbHQ7ZXh0ZW5zaW9uIGJhc2U9IiZsdDtodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYT5RTmFtZSI+Ci0gKiAgICAgICAmbHQ7YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9SUQiIC8+Ci0gKiAgICAgJmx0Oy9leHRlbnNpb24+Ci0gKiAgICZsdDsvc2ltcGxlQ29udGVudD4KLSAqICZsdDsvY29tcGxleFR5cGU+Ci0gKiA8L3ByZT4KLSAqLwotQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKQotQFhtbFR5cGUobmFtZSA9ICJ4c2RRTmFtZVR5cGUiLCBwcm9wT3JkZXIgPSB7Ci0gICAgICAgICJ2YWx1ZSIKLSAgICAgICAgfSkKLXB1YmxpYyBjbGFzcyBYc2RRTmFtZVR5cGUgewotCi0gICAgQFhtbFZhbHVlCi0gICAgcHJvdGVjdGVkIFFOYW1lIHZhbHVlOwotICAgIEBYbWxBdHRyaWJ1dGUKLSAgICBAWG1sSmF2YVR5cGVBZGFwdGVyKENvbGxhcHNlZFN0cmluZ0FkYXB0ZXIuY2xhc3MpCi0gICAgQFhtbElECi0gICAgcHJvdGVjdGVkIGphdmEubGFuZy5TdHJpbmcgaWQ7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgdmFsdWUgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHBvc3NpYmxlIG9iamVjdCBpcyB7QGxpbmsgUU5hbWUgfQotICAgICAqLwotICAgIHB1YmxpYyBRTmFtZSBnZXRWYWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSB2YWx1ZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcyB7QGxpbmsgUU5hbWUgfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKFFOYW1lIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgaWQgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHBvc3NpYmxlIG9iamVjdCBpcyB7QGxpbmsgamF2YS5sYW5nLlN0cmluZyB9Ci0gICAgICovCi0gICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0SWQoKSB7Ci0gICAgICAgIHJldHVybiBpZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgaWQgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgYWxsb3dlZCBvYmplY3QgaXMge0BsaW5rIGphdmEubGFuZy5TdHJpbmcgfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldElkKGphdmEubGFuZy5TdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5pZCA9IHZhbHVlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvWHNkU3RyaW5nVHlwZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvWHNkU3RyaW5nVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjI2ODVjLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL1hzZFN0cmluZ1R5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLwotLy8gVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIEphdmFUTSBBcmNoaXRlY3R1cmUgZm9yIFhNTCBCaW5kaW5nKEpBWEIpIFJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbiwgdjIuMC1iNTItZmNzIAotLy8gU2VlIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGIiPmh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGI8L2E+IAotLy8gQW55IG1vZGlmaWNhdGlvbnMgdG8gdGhpcyBmaWxlIHdpbGwgYmUgbG9zdCB1cG9uIHJlY29tcGlsYXRpb24gb2YgdGhlIHNvdXJjZSBzY2hlbWEuIAotLy8gR2VuZXJhdGVkIG9uOiAyMDA3LjAzLjIxIGF0IDEwOjU2OjUxIEFNIENEVCAKLS8vCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLnhtbC5oYW5kbGVyOwotCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQXR0cmlidXRlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sSUQ7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVmFsdWU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5hZGFwdGVycy5Db2xsYXBzZWRTdHJpbmdBZGFwdGVyOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uYWRhcHRlcnMuWG1sSmF2YVR5cGVBZGFwdGVyOwotCi0KLS8qKgotICogVGhpcyB0eXBlIGFkZHMgYW4gImlkIiBhdHRyaWJ1dGUgdG8geHNkOnN0cmluZy4KLSAqIDxwLz4KLSAqIDxwLz4KLSAqIDxwLz4KLSAqIDxwPkphdmEgY2xhc3MgZm9yIHhzZFN0cmluZ1R5cGUgY29tcGxleCB0eXBlLgotICogPHAvPgotICogPHA+VGhlIGZvbGxvd2luZyBzY2hlbWEgZnJhZ21lbnQgc3BlY2lmaWVzIHRoZSBleHBlY3RlZCBjb250ZW50IGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBjbGFzcy4KLSAqIDxwLz4KLSAqIDxwcmU+Ci0gKiAmbHQ7Y29tcGxleFR5cGUgbmFtZT0ieHNkU3RyaW5nVHlwZSI+Ci0gKiAgICZsdDtzaW1wbGVDb250ZW50PgotICogICAgICZsdDtleHRlbnNpb24gYmFzZT0iJmx0O2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hPnN0cmluZyI+Ci0gKiAgICAgICAmbHQ7YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9SUQiIC8+Ci0gKiAgICAgJmx0Oy9leHRlbnNpb24+Ci0gKiAgICZsdDsvc2ltcGxlQ29udGVudD4KLSAqICZsdDsvY29tcGxleFR5cGU+Ci0gKiA8L3ByZT4KLSAqLwotQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKQotQFhtbFR5cGUobmFtZSA9ICJ4c2RTdHJpbmdUeXBlIiwgcHJvcE9yZGVyID0gewotICAgICAgICAidmFsdWUiCi0gICAgICAgIH0pCi1wdWJsaWMgY2xhc3MgWHNkU3RyaW5nVHlwZSB7Ci0KLSAgICBAWG1sVmFsdWUKLSAgICBwcm90ZWN0ZWQgamF2YS5sYW5nLlN0cmluZyB2YWx1ZTsKLSAgICBAWG1sQXR0cmlidXRlCi0gICAgQFhtbEphdmFUeXBlQWRhcHRlcihDb2xsYXBzZWRTdHJpbmdBZGFwdGVyLmNsYXNzKQotICAgIEBYbWxJRAotICAgIHByb3RlY3RlZCBqYXZhLmxhbmcuU3RyaW5nIGlkOwotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIHZhbHVlIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiBwb3NzaWJsZSBvYmplY3QgaXMge0BsaW5rIGphdmEubGFuZy5TdHJpbmcgfQotICAgICAqLwotICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFZhbHVlKCkgewotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHZhbHVlIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIGFsbG93ZWQgb2JqZWN0IGlzIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShqYXZhLmxhbmcuU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgaWQgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHBvc3NpYmxlIG9iamVjdCBpcyB7QGxpbmsgamF2YS5sYW5nLlN0cmluZyB9Ci0gICAgICovCi0gICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0SWQoKSB7Ci0gICAgICAgIHJldHVybiBpZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgaWQgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgYWxsb3dlZCBvYmplY3QgaXMge0BsaW5rIGphdmEubGFuZy5TdHJpbmcgfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldElkKGphdmEubGFuZy5TdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5pZCA9IHZhbHVlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvcGFja2FnZS1pbmZvLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9wYWNrYWdlLWluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTU2YzVlOS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9wYWNrYWdlLWluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vCi0vLyBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSB0aGUgSmF2YVRNIEFyY2hpdGVjdHVyZSBmb3IgWE1MIEJpbmRpbmcoSkFYQikgUmVmZXJlbmNlIEltcGxlbWVudGF0aW9uLCB2Mi4wLWI1Mi1mY3MgCi0vLyBTZWUgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YiI+aHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YjwvYT4gCi0vLyBBbnkgbW9kaWZpY2F0aW9ucyB0byB0aGlzIGZpbGUgd2lsbCBiZSBsb3N0IHVwb24gcmVjb21waWxhdGlvbiBvZiB0aGUgc291cmNlIHNjaGVtYS4gCi0vLyBHZW5lcmF0ZWQgb246IDIwMDcuMDMuMjEgYXQgMTA6NTY6NTEgQU0gQ0RUIAotLy8KLQotQGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sU2NoZW1hKG5hbWVzcGFjZSA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiKQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLnhtbC5oYW5kbGVyOwpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZmVhdHVyZS9TZXJ2ZXJDb25maWd1cmF0b3IuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2ZlYXR1cmUvU2VydmVyQ29uZmlndXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4ODU1ZDcuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZmVhdHVyZS9TZXJ2ZXJDb25maWd1cmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZmVhdHVyZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5FbmRwb2ludERlc2NyaXB0aW9uOw0KLQ0KLS8qKg0KLSAqIA0KLSAqLw0KLXB1YmxpYyBpbnRlcmZhY2UgU2VydmVyQ29uZmlndXJhdG9yIHsNCi0gICAgLyoqDQotICAgICAqIFBlcmZvcm0gc2VydmVyLXNpZGUgY29uZmlndXJhdGlvbiBmb3IgYSA8Y29kZT5XZWJTZXJ2aWNlRmVhdHVyZTwvY29kZT4uDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gZW5kcG9pbnREZXNjcmlwdGlvbg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgY29uZmlndXJlKEVuZHBvaW50RGVzY3JpcHRpb24gZW5kcG9pbnREZXNjcmlwdGlvbik7DQotICAgIA0KLSAgICAvKioNCi0gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGNvbmZpZ3VyYXRvciBzdXBwb3J0cyB0aGUgc3BlY2lmaWVkIGJpbmRpbmcuDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gYmluZGluZ0lkIHRoZSBiaW5kaW5nIGlkIHRvIHRlc3QNCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY29uZmlndXJhdG9yIHN1cHBvcnRzIHRoZSBiaW5kaW5nIGlkLCA8Y29kZT5mYWxzZTwvY29kZT4NCi0gICAgICogb3RoZXJ3aXNlLg0KLSAgICAgKi8NCi0gICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoU3RyaW5nIGJpbmRpbmdJZCk7DQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2ZlYXR1cmUvU2VydmVyRnJhbWV3b3JrLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9mZWF0dXJlL1NlcnZlckZyYW1ld29yay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGQ1ZmYxLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2ZlYXR1cmUvU2VydmVyRnJhbWV3b3JrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5mZWF0dXJlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLkV4Y2VwdGlvbkZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRW5kcG9pbnREZXNjcmlwdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5pMThuLk1lc3NhZ2VzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmF4LnhtbC53cy5zcGkuV2ViU2VydmljZUZlYXR1cmVBbm5vdGF0aW9uOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi1wdWJsaWMgY2xhc3MgU2VydmVyRnJhbWV3b3JrIHsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFNlcnZlckZyYW1ld29yay5jbGFzcyk7DQotICAgIA0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uW10gWkVST19MRU5HVEhfQVJSQVkgPSBuZXcgQW5ub3RhdGlvblswXTsNCi0NCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBTZXJ2ZXJDb25maWd1cmF0b3I+IGNvbmZpZ3VyYXRvck1hcDsNCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBBbm5vdGF0aW9uPiBhbm5vdGF0aW9uTWFwOw0KLSAgICANCi0gICAgcHVibGljIFNlcnZlckZyYW1ld29yaygpIHsNCi0gICAgCXN1cGVyKCk7DQotICAgICAgICBjb25maWd1cmF0b3JNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFNlcnZlckNvbmZpZ3VyYXRvcj4oKTsNCi0gICAgICAgIGFubm90YXRpb25NYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEFubm90YXRpb24+KCk7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIGFkZENvbmZpZ3VyYXRvcihTdHJpbmcgaWQsIFNlcnZlckNvbmZpZ3VyYXRvciBjb25maWd1cmF0b3IpIHsNCi0gICAgICAgIGNvbmZpZ3VyYXRvck1hcC5wdXQoaWQsIGNvbmZpZ3VyYXRvcik7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWQoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB7DQotICAgICAgICBpZiAoYW5ub3RhdGlvbiA9PSBudWxsKQ0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIA0KLSAgICAgICAgV2ViU2VydmljZUZlYXR1cmVBbm5vdGF0aW9uIHdzZkFubm90YXRpb24gPSBnZXRXZWJTZXJ2aWNlRmVhdHVyZUFubm90YXRpb24oYW5ub3RhdGlvbik7DQotICAgICAgICANCi0gICAgICAgIFN0cmluZyBpZCA9IG51bGw7DQotICAgICAgICBpZiAod3NmQW5ub3RhdGlvbiAhPSBudWxsKQ0KLSAgICAgICAgCWlkID0gd3NmQW5ub3RhdGlvbi5pZCgpOw0KLSAgICAgICAgDQotICAgICAgICByZXR1cm4gY29uZmlndXJhdG9yTWFwLmNvbnRhaW5zS2V5KGlkKTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIHZvaWQgYWRkQW5ub3RhdGlvbihBbm5vdGF0aW9uIGFubm90YXRpb24pIHsNCi0gICAgICAgIGlmICghaXNWYWxpZChhbm5vdGF0aW9uKSkgew0KLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkuDQotICAgICAgICAgICAgICAgIG1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoImludmFsaWRXU0Fubm90YXRpb24iLCANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uLnRvU3RyaW5nKCkpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIFdlYlNlcnZpY2VGZWF0dXJlQW5ub3RhdGlvbiB3c2ZBbm5vdGF0aW9uID0gZ2V0V2ViU2VydmljZUZlYXR1cmVBbm5vdGF0aW9uKGFubm90YXRpb24pOw0KLQ0KLSAgICAgICAgYW5ub3RhdGlvbk1hcC5wdXQod3NmQW5ub3RhdGlvbi5pZCgpLCBhbm5vdGF0aW9uKTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbihTdHJpbmcgaWQpIHsNCi0gICAgICAgIHJldHVybiBhbm5vdGF0aW9uTWFwLmdldChpZCk7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyBBbm5vdGF0aW9uW10gZ2V0QWxsQW5ub3RhdGlvbnMoKSB7DQotICAgICAgICByZXR1cm4gYW5ub3RhdGlvbk1hcC52YWx1ZXMoKS50b0FycmF5KFpFUk9fTEVOR1RIX0FSUkFZKTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIHZvaWQgY29uZmlndXJlKEVuZHBvaW50RGVzY3JpcHRpb24gZW5kcG9pbnREZXNjcmlwdGlvbikgew0KLSAgICAgICAgZm9yIChBbm5vdGF0aW9uIGFubm90YXRpb24gOiBnZXRBbGxBbm5vdGF0aW9ucygpKSB7DQotICAgICAgICAgICAgV2ViU2VydmljZUZlYXR1cmVBbm5vdGF0aW9uIHdzZkFubm90YXRpb24gPSBnZXRXZWJTZXJ2aWNlRmVhdHVyZUFubm90YXRpb24oYW5ub3RhdGlvbik7DQotICAgICAgICAgICAgU2VydmVyQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvciA9IGNvbmZpZ3VyYXRvck1hcC5nZXQod3NmQW5ub3RhdGlvbi5pZCgpKTsNCi0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJGb3VuZCBTZXJ2ZXJDb25maWd1cmF0b3I6ICIgKyBjb25maWd1cmF0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJTdGFydGluZyAiICsgY29uZmlndXJhdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIi5jb25maWd1cmUoKSIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBjb25maWd1cmF0b3IuY29uZmlndXJlKGVuZHBvaW50RGVzY3JpcHRpb24pOw0KLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkNvbXBsZXRlZCAiICsgY29uZmlndXJhdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIi5jb25maWd1cmUoKSIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICANCi0gICAgcHJpdmF0ZSBXZWJTZXJ2aWNlRmVhdHVyZUFubm90YXRpb24gZ2V0V2ViU2VydmljZUZlYXR1cmVBbm5vdGF0aW9uKEFubm90YXRpb24gYW5ub3RhdGlvbikgew0KLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKCJMb29raW5nIHVwIFdlYlNlcnZpY2VGZWF0dXJlIGFubm90YXRpb24gZm9yICIgKyBhbm5vdGF0aW9uLmFubm90YXRpb25UeXBlKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGFubm90YXRpb24uYW5ub3RhdGlvblR5cGUoKS5nZXRBbm5vdGF0aW9uKFdlYlNlcnZpY2VGZWF0dXJlQW5ub3RhdGlvbi5jbGFzcyk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvaTE4bi9NZXNzYWdlQnVuZGxlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9pMThuL01lc3NhZ2VCdW5kbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJiNjcwNy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9pMThuL01lc3NhZ2VCdW5kbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaTE4bjsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLS8qKgotICogQWNjZXB0IHBhcmFtZXRlcnMgZm9yIFByb2plY3RSZXNvdXJjZUJ1bmRsZSwgYnV0IGRlZmVyIG9iamVjdCBpbnN0YW50aWF0aW9uIChhbmQgdGhlcmVmb3JlCi0gKiByZXNvdXJjZSBidW5kbGUgbG9hZGluZykgdW50aWwgcmVxdWlyZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXNzYWdlQnVuZGxlIHsKLSAgICBwcml2YXRlIGJvb2xlYW4gbG9hZGVkID0gZmFsc2U7Ci0KLSAgICBwcml2YXRlIFByb2plY3RSZXNvdXJjZUJ1bmRsZSBfcmVzb3VyY2VCdW5kbGUgPSBudWxsOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcHJvamVjdE5hbWU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcGFja2FnZU5hbWU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcmVzb3VyY2VOYW1lOwotICAgIHByaXZhdGUgZmluYWwgTG9jYWxlIGxvY2FsZTsKLSAgICBwcml2YXRlIGZpbmFsIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyOwotICAgIHByaXZhdGUgZmluYWwgUmVzb3VyY2VCdW5kbGUgcGFyZW50OwotCi0KLSAgICBwdWJsaWMgZmluYWwgUHJvamVjdFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKCkgewotICAgICAgICBpZiAoIWxvYWRlZCkgewotICAgICAgICAgICAgX3Jlc291cmNlQnVuZGxlID0gUHJvamVjdFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShwcm9qZWN0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc0xvYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50KTsKLSAgICAgICAgICAgIGxvYWRlZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIF9yZXNvdXJjZUJ1bmRsZTsKLSAgICB9Ci0KLSAgICAvKiogQ29uc3RydWN0IGEgbmV3IEV4dGVuZE1lc3NhZ2VzICovCi0gICAgcHVibGljIE1lc3NhZ2VCdW5kbGUoU3RyaW5nIHByb2plY3ROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmVzb3VyY2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgIExvY2FsZSBsb2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VCdW5kbGUgcGFyZW50KQotICAgICAgICAgICAgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMucHJvamVjdE5hbWUgPSBwcm9qZWN0TmFtZTsKLSAgICAgICAgdGhpcy5wYWNrYWdlTmFtZSA9IHBhY2thZ2VOYW1lOwotICAgICAgICB0aGlzLnJlc291cmNlTmFtZSA9IHJlc291cmNlTmFtZTsKLSAgICAgICAgdGhpcy5sb2NhbGUgPSBsb2NhbGU7Ci0gICAgICAgIHRoaXMuY2xhc3NMb2FkZXIgPSBjbGFzc0xvYWRlcjsKLSAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhIHN0cmluZyBtZXNzYWdlIGZyb20gdGhlIHJlc291cmNlIGJ1bmRsZSBmb3IgdGhlIGdpdmVuIGtleQotICAgICAqCi0gICAgICogQHBhcmFtIGtleSBUaGUgcmVzb3VyY2Uga2V5Ci0gICAgICogQHJldHVybiBUaGUgbWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZShTdHJpbmcga2V5KSB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGdldE1lc3NhZ2Uoa2V5LCAoU3RyaW5nW10pbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPHA+R2V0cyBhIHN0cmluZyBtZXNzYWdlIGZyb20gdGhlIHJlc291cmNlIGJ1bmRsZSBmb3IgdGhlIGdpdmVuIGtleS4gVGhlIG1lc3NhZ2UgbWF5IGNvbnRhaW4KLSAgICAgKiB2YXJpYWJsZXMgdGhhdCB3aWxsIGJlIHN1YnN0aXR1dGVkIHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50cy4gVmFyaWFibGVzIGhhdmUgdGhlIGZvcm1hdDo8L3A+Ci0gICAgICogPGRpcj4gVGhpcyBtZXNzYWdlIGhhcyB0d28gdmFyaWFibGVzOiB7MH0gYW5kIHsxfSA8L2Rpcj4KLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXkgIFRoZSByZXNvdXJjZSBrZXkKLSAgICAgKiBAcGFyYW0gYXJnMCBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezB9Ci0gICAgICogQHJldHVybiBUaGUgbWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZShTdHJpbmcga2V5LCBTdHJpbmcgYXJnMCkgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBnZXRNZXNzYWdlKGtleSwgbmV3IFN0cmluZ1tdIHsgYXJnMCB9KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8cD5HZXRzIGEgc3RyaW5nIG1lc3NhZ2UgZnJvbSB0aGUgcmVzb3VyY2UgYnVuZGxlIGZvciB0aGUgZ2l2ZW4ga2V5LiBUaGUgbWVzc2FnZSBtYXkgY29udGFpbgotICAgICAqIHZhcmlhYmxlcyB0aGF0IHdpbGwgYmUgc3Vic3RpdHV0ZWQgd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzLiBWYXJpYWJsZXMgaGF2ZSB0aGUgZm9ybWF0OjwvcD4KLSAgICAgKiA8ZGlyPiBUaGlzIG1lc3NhZ2UgaGFzIHR3byB2YXJpYWJsZXM6IHswfSBhbmQgezF9IDwvZGlyPgotICAgICAqCi0gICAgICogQHBhcmFtIGtleSAgVGhlIHJlc291cmNlIGtleQotICAgICAqIEBwYXJhbSBhcmcwIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7MH0KLSAgICAgKiBAcGFyYW0gYXJnMSBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezF9Ci0gICAgICogQHJldHVybiBUaGUgbWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZShTdHJpbmcga2V5LCBTdHJpbmcgYXJnMCwgU3RyaW5nIGFyZzEpIHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZ2V0TWVzc2FnZShrZXksIG5ldyBTdHJpbmdbXSB7IGFyZzAsIGFyZzEgfSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPHA+R2V0cyBhIHN0cmluZyBtZXNzYWdlIGZyb20gdGhlIHJlc291cmNlIGJ1bmRsZSBmb3IgdGhlIGdpdmVuIGtleS4gVGhlIG1lc3NhZ2UgbWF5IGNvbnRhaW4KLSAgICAgKiB2YXJpYWJsZXMgdGhhdCB3aWxsIGJlIHN1YnN0aXR1dGVkIHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50cy4gVmFyaWFibGVzIGhhdmUgdGhlIGZvcm1hdDo8L3A+Ci0gICAgICogPGRpcj4gVGhpcyBtZXNzYWdlIGhhcyB0d28gdmFyaWFibGVzOiB7MH0gYW5kIHsxfSA8L2Rpcj4KLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXkgIFRoZSByZXNvdXJjZSBrZXkKLSAgICAgKiBAcGFyYW0gYXJnMCBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezB9Ci0gICAgICogQHBhcmFtIGFyZzEgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHsxfQotICAgICAqIEBwYXJhbSBhcmcyIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7Mn0KLSAgICAgKiBAcmV0dXJuIFRoZSBtZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBrZXksIFN0cmluZyBhcmcwLCBTdHJpbmcgYXJnMSwgU3RyaW5nIGFyZzIpCi0gICAgICAgICAgICB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGdldE1lc3NhZ2Uoa2V5LCBuZXcgU3RyaW5nW10geyBhcmcwLCBhcmcxLCBhcmcyIH0pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDxwPkdldHMgYSBzdHJpbmcgbWVzc2FnZSBmcm9tIHRoZSByZXNvdXJjZSBidW5kbGUgZm9yIHRoZSBnaXZlbiBrZXkuIFRoZSBtZXNzYWdlIG1heSBjb250YWluCi0gICAgICogdmFyaWFibGVzIHRoYXQgd2lsbCBiZSBzdWJzdGl0dXRlZCB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMuIFZhcmlhYmxlcyBoYXZlIHRoZSBmb3JtYXQ6PC9wPgotICAgICAqIDxkaXI+IFRoaXMgbWVzc2FnZSBoYXMgdHdvIHZhcmlhYmxlczogezB9IGFuZCB7MX0gPC9kaXI+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5ICBUaGUgcmVzb3VyY2Uga2V5Ci0gICAgICogQHBhcmFtIGFyZzAgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHswfQotICAgICAqIEBwYXJhbSBhcmcxIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7MX0KLSAgICAgKiBAcGFyYW0gYXJnMiBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezJ9Ci0gICAgICogQHBhcmFtIGFyZzMgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHszfQotICAgICAqIEByZXR1cm4gVGhlIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIGtleSwgU3RyaW5nIGFyZzAsIFN0cmluZyBhcmcxLCBTdHJpbmcgYXJnMiwgU3RyaW5nIGFyZzMpCi0gICAgICAgICAgICB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGdldE1lc3NhZ2Uoa2V5LCBuZXcgU3RyaW5nW10geyBhcmcwLCBhcmcxLCBhcmcyLCBhcmczIH0pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDxwPkdldHMgYSBzdHJpbmcgbWVzc2FnZSBmcm9tIHRoZSByZXNvdXJjZSBidW5kbGUgZm9yIHRoZSBnaXZlbiBrZXkuIFRoZSBtZXNzYWdlIG1heSBjb250YWluCi0gICAgICogdmFyaWFibGVzIHRoYXQgd2lsbCBiZSBzdWJzdGl0dXRlZCB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMuIFZhcmlhYmxlcyBoYXZlIHRoZSBmb3JtYXQ6PC9wPgotICAgICAqIDxkaXI+IFRoaXMgbWVzc2FnZSBoYXMgdHdvIHZhcmlhYmxlczogezB9IGFuZCB7MX0gPC9kaXI+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5ICBUaGUgcmVzb3VyY2Uga2V5Ci0gICAgICogQHBhcmFtIGFyZzAgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHswfQotICAgICAqIEBwYXJhbSBhcmcxIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7MX0KLSAgICAgKiBAcGFyYW0gYXJnMiBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezJ9Ci0gICAgICogQHBhcmFtIGFyZzMgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHszfQotICAgICAqIEBwYXJhbSBhcmc0IFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7NH0KLSAgICAgKiBAcmV0dXJuIFRoZSBtZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBrZXksIFN0cmluZyBhcmcwLCBTdHJpbmcgYXJnMSwgU3RyaW5nIGFyZzIsIFN0cmluZyBhcmczLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYXJnNCkgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBnZXRNZXNzYWdlKGtleSwgbmV3IFN0cmluZ1tdIHsgYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCB9KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8cD5HZXRzIGEgc3RyaW5nIG1lc3NhZ2UgZnJvbSB0aGUgcmVzb3VyY2UgYnVuZGxlIGZvciB0aGUgZ2l2ZW4ga2V5LiBUaGUgbWVzc2FnZSBtYXkgY29udGFpbgotICAgICAqIHZhcmlhYmxlcyB0aGF0IHdpbGwgYmUgc3Vic3RpdHV0ZWQgd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzLiBWYXJpYWJsZXMgaGF2ZSB0aGUgZm9ybWF0OjwvcD4KLSAgICAgKiA8ZGlyPiBUaGlzIG1lc3NhZ2UgaGFzIHR3byB2YXJpYWJsZXM6IHswfSBhbmQgezF9IDwvZGlyPgotICAgICAqCi0gICAgICogQHBhcmFtIGtleSAgIFRoZSByZXNvdXJjZSBrZXkKLSAgICAgKiBAcGFyYW0gYXJyYXkgQW4gYXJyYXkgb2Ygb2JqZWN0cyB0byBwbGFjZSBpbiBjb3JyZXNwb25kaW5nIHZhcmlhYmxlcwotICAgICAqIEByZXR1cm4gVGhlIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIGtleSwgU3RyaW5nW10gYXJyYXkpIHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgbXNnID0gbnVsbDsKLSAgICAgICAgaWYgKGdldFJlc291cmNlQnVuZGxlKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgbXNnID0gZ2V0UmVzb3VyY2VCdW5kbGUoKS5nZXRTdHJpbmcoa2V5KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtc2cgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbigiQ2Fubm90IGZpbmQgcmVzb3VyY2Uga2V5IFwiIiArIGtleSArCi0gICAgICAgICAgICAgICAgICAgICJcIiBpbiBiYXNlIG5hbWUgIiArCi0gICAgICAgICAgICAgICAgICAgIGdldFJlc291cmNlQnVuZGxlKCkuZ2V0UmVzb3VyY2VOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFJlc291cmNlQnVuZGxlKCkuZ2V0UmVzb3VyY2VOYW1lKCksIGtleSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQobXNnLCAoT2JqZWN0W10pYXJyYXkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2kxOG4vTWVzc2FnZXMuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2kxOG4vTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjVjMWI5YS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9pMThuL01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmkxOG47Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1wdWJsaWMgY2xhc3MgTWVzc2FnZXMgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzIHRoaXNDbGFzcyA9IE1lc3NhZ2VzLmNsYXNzOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHByb2plY3ROYW1lID0gTWVzc2FnZXNDb25zdGFudHMucHJvamVjdE5hbWU7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgcmVzb3VyY2VOYW1lID0gTWVzc2FnZXNDb25zdGFudHMucmVzb3VyY2VOYW1lOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvY2FsZSBsb2NhbGUgPSBNZXNzYWdlc0NvbnN0YW50cy5sb2NhbGU7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX01FU1NBR0VfQlVORExFX0tFWSA9ICJkZWZhdWx0IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9fTUVTU0FHRV9CVU5ETEUgPSAiTWVzc2FnZSBCdW5kbGUgaXMgbm90IGF2YWlsYWJsZSI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgcGFja2FnZU5hbWUgPSBnZXRQYWNrYWdlKHRoaXNDbGFzcy5nZXROYW1lKCkpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyID0gdGhpc0NsYXNzLmdldENsYXNzTG9hZGVyKCk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZUJ1bmRsZSBwYXJlbnQgPQotICAgICAgICAgICAgKE1lc3NhZ2VzQ29uc3RhbnRzLnJvb3RQYWNrYWdlTmFtZS5lcXVhbHMocGFja2FnZU5hbWUpKQotICAgICAgICAgICAgICAgICAgICA/IG51bGwKLSAgICAgICAgICAgICAgICAgICAgOiBNZXNzYWdlc0NvbnN0YW50cy5yb290QnVuZGxlOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgSGFzaE1hcCBtZXNzYWdlQnVuZGxlTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotICAgIHN0YXRpYyB7Ci0gICAgICAgIE1lc3NhZ2VCdW5kbGUgZGVmYXVsdE1lc3NhZ2VCdW5kbGUgPQotICAgICAgICAgICAgICAgIG5ldyBNZXNzYWdlQnVuZGxlKHByb2plY3ROYW1lLCBwYWNrYWdlTmFtZSwgcmVzb3VyY2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsZSwgY2xhc3NMb2FkZXIsIHBhcmVudCk7Ci0gICAgICAgIGFkZE1lc3NhZ2VCdW5kbGUoREVGQVVMVF9NRVNTQUdFX0JVTkRMRV9LRVksIGRlZmF1bHRNZXNzYWdlQnVuZGxlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUbyBhZGQgYSBuZXcgTWVzc2FnZSBCdW5kbGUgdG8gdGhlIE1lc3NhZ2VCdW5kbGUgbGlzdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXNzYWdlQnVuZGxlS2V5IFRoZSBrZXkgd2hpY2ggd2lsbCBiZSB1c2VkIHRvIHJlZmVyIHRvIHRoaXMgbWVzc2FnZSBidW5kbGUgbGF0ZXIuCi0gICAgICogQHBhcmFtIG1lc3NhZ2VCdW5kbGUgICAgVGhlIG1lc3NhZ2UgYnVuZGxlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRNZXNzYWdlQnVuZGxlKFN0cmluZyBtZXNzYWdlQnVuZGxlS2V5LCBNZXNzYWdlQnVuZGxlIG1lc3NhZ2VCdW5kbGUpIHsKLSAgICAgICAgbWVzc2FnZUJ1bmRsZU1hcC5wdXQobWVzc2FnZUJ1bmRsZUtleSwgbWVzc2FnZUJ1bmRsZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGEgbWVzc2FnZSBmcm9tIHJlc291cmNlLnByb3BlcnRpZXMgZnJvbSB0aGUgcGFja2FnZSBvZiB0aGUgZ2l2ZW4gb2JqZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIGtleSBUaGUgcmVzb3VyY2Uga2V5Ci0gICAgICogQHJldHVybiBUaGUgZm9ybWF0dGVkIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBrZXkpCi0gICAgICAgICAgICB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHsKLSAgICAgICAgTWVzc2FnZUJ1bmRsZSBtZXNzYWdlQnVuZGxlID0gZ2V0TWVzc2FnZUJ1bmRsZShERUZBVUxUX01FU1NBR0VfQlVORExFX0tFWSk7Ci0gICAgICAgIHJldHVybiBtZXNzYWdlQnVuZGxlLmdldE1lc3NhZ2Uoa2V5KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYSBtZXNzYWdlIGZyb20gcmVzb3VyY2UucHJvcGVydGllcyBmcm9tIHRoZSBwYWNrYWdlIG9mIHRoZSBnaXZlbiBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5ICBUaGUgcmVzb3VyY2Uga2V5Ci0gICAgICogQHBhcmFtIGFyZzAgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHswfQotICAgICAqIEByZXR1cm4gVGhlIGZvcm1hdHRlZCBtZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZShTdHJpbmcga2V5LCBTdHJpbmcgYXJnMCkKLSAgICAgICAgICAgIHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gewotICAgICAgICBNZXNzYWdlQnVuZGxlIG1lc3NhZ2VCdW5kbGUgPSBnZXRNZXNzYWdlQnVuZGxlKERFRkFVTFRfTUVTU0FHRV9CVU5ETEVfS0VZKTsKLSAgICAgICAgcmV0dXJuIG1lc3NhZ2VCdW5kbGUuZ2V0TWVzc2FnZShrZXksIGFyZzApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBhIG1lc3NhZ2UgZnJvbSByZXNvdXJjZS5wcm9wZXJ0aWVzIGZyb20gdGhlIHBhY2thZ2Ugb2YgdGhlIGdpdmVuIG9iamVjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXkgIFRoZSByZXNvdXJjZSBrZXkKLSAgICAgKiBAcGFyYW0gYXJnMCBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezB9Ci0gICAgICogQHBhcmFtIGFyZzEgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHsxfQotICAgICAqIEByZXR1cm4gVGhlIGZvcm1hdHRlZCBtZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZShTdHJpbmcga2V5LCBTdHJpbmcgYXJnMCwgU3RyaW5nIGFyZzEpCi0gICAgICAgICAgICB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHsKLSAgICAgICAgTWVzc2FnZUJ1bmRsZSBtZXNzYWdlQnVuZGxlID0gZ2V0TWVzc2FnZUJ1bmRsZShERUZBVUxUX01FU1NBR0VfQlVORExFX0tFWSk7Ci0gICAgICAgIHJldHVybiBtZXNzYWdlQnVuZGxlLmdldE1lc3NhZ2Uoa2V5LCBhcmcwLCBhcmcxKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYSBtZXNzYWdlIGZyb20gcmVzb3VyY2UucHJvcGVydGllcyBmcm9tIHRoZSBwYWNrYWdlIG9mIHRoZSBnaXZlbiBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5ICBUaGUgcmVzb3VyY2Uga2V5Ci0gICAgICogQHBhcmFtIGFyZzAgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHswfQotICAgICAqIEBwYXJhbSBhcmcxIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7MX0KLSAgICAgKiBAcGFyYW0gYXJnMiBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezJ9Ci0gICAgICogQHJldHVybiBUaGUgZm9ybWF0dGVkIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBrZXksIFN0cmluZyBhcmcwLCBTdHJpbmcgYXJnMSwgU3RyaW5nIGFyZzIpCi0gICAgICAgICAgICB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHsKLSAgICAgICAgTWVzc2FnZUJ1bmRsZSBtZXNzYWdlQnVuZGxlID0gZ2V0TWVzc2FnZUJ1bmRsZShERUZBVUxUX01FU1NBR0VfQlVORExFX0tFWSk7Ci0gICAgICAgIHJldHVybiBtZXNzYWdlQnVuZGxlLmdldE1lc3NhZ2Uoa2V5LCBhcmcwLCBhcmcxLCBhcmcyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYSBtZXNzYWdlIGZyb20gcmVzb3VyY2UucHJvcGVydGllcyBmcm9tIHRoZSBwYWNrYWdlIG9mIHRoZSBnaXZlbiBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5ICBUaGUgcmVzb3VyY2Uga2V5Ci0gICAgICogQHBhcmFtIGFyZzAgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHswfQotICAgICAqIEBwYXJhbSBhcmcxIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7MX0KLSAgICAgKiBAcGFyYW0gYXJnMiBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezJ9Ci0gICAgICogQHBhcmFtIGFyZzMgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHszfQotICAgICAqIEByZXR1cm4gVGhlIGZvcm1hdHRlZCBtZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZShTdHJpbmcga2V5LCBTdHJpbmcgYXJnMCwgU3RyaW5nIGFyZzEsIFN0cmluZyBhcmcyLCBTdHJpbmcgYXJnMykKLSAgICAgICAgICAgIHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gewotICAgICAgICBNZXNzYWdlQnVuZGxlIG1lc3NhZ2VCdW5kbGUgPSBnZXRNZXNzYWdlQnVuZGxlKERFRkFVTFRfTUVTU0FHRV9CVU5ETEVfS0VZKTsKLSAgICAgICAgcmV0dXJuIG1lc3NhZ2VCdW5kbGUuZ2V0TWVzc2FnZShrZXksIGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBhIG1lc3NhZ2UgZnJvbSByZXNvdXJjZS5wcm9wZXJ0aWVzIGZyb20gdGhlIHBhY2thZ2Ugb2YgdGhlIGdpdmVuIG9iamVjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXkgIFRoZSByZXNvdXJjZSBrZXkKLSAgICAgKiBAcGFyYW0gYXJnMCBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezB9Ci0gICAgICogQHBhcmFtIGFyZzEgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHsxfQotICAgICAqIEBwYXJhbSBhcmcyIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7Mn0KLSAgICAgKiBAcGFyYW0gYXJnMyBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezN9Ci0gICAgICogQHBhcmFtIGFyZzQgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHs0fQotICAgICAqIEByZXR1cm4gVGhlIGZvcm1hdHRlZCBtZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZShTdHJpbmcga2V5LCBTdHJpbmcgYXJnMCwgU3RyaW5nIGFyZzEsIFN0cmluZyBhcmcyLCBTdHJpbmcgYXJnMywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhcmc0KQotICAgICAgICAgICAgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIE1lc3NhZ2VCdW5kbGUgbWVzc2FnZUJ1bmRsZSA9IGdldE1lc3NhZ2VCdW5kbGUoREVGQVVMVF9NRVNTQUdFX0JVTkRMRV9LRVkpOwotICAgICAgICByZXR1cm4gbWVzc2FnZUJ1bmRsZS5nZXRNZXNzYWdlKGtleSwgYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGEgbWVzc2FnZSBmcm9tIHJlc291cmNlLnByb3BlcnRpZXMgZnJvbSB0aGUgcGFja2FnZSBvZiB0aGUgZ2l2ZW4gb2JqZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIGtleSAgVGhlIHJlc291cmNlIGtleQotICAgICAqIEBwYXJhbSBhcmdzIEFuIGFycmF5IG9mIG9iamVjdHMgdG8gcGxhY2UgaW4gY29ycmVzcG9uZGluZyB2YXJpYWJsZXMKLSAgICAgKiBAcmV0dXJuIFRoZSBmb3JtYXR0ZWQgbWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIGtleSwgU3RyaW5nW10gYXJncykKLSAgICAgICAgICAgIHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gewotICAgICAgICBNZXNzYWdlQnVuZGxlIG1lc3NhZ2VCdW5kbGUgPSBnZXRNZXNzYWdlQnVuZGxlKERFRkFVTFRfTUVTU0FHRV9CVU5ETEVfS0VZKTsKLSAgICAgICAgcmV0dXJuIG1lc3NhZ2VCdW5kbGUuZ2V0TWVzc2FnZShrZXksIGFyZ3MpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgZ2V0UmVzb3VyY2VCdW5kbGUoKSB7Ci0gICAgICAgIE1lc3NhZ2VCdW5kbGUgbWVzc2FnZUJ1bmRsZSA9IGdldE1lc3NhZ2VCdW5kbGUoREVGQVVMVF9NRVNTQUdFX0JVTkRMRV9LRVkpOwotICAgICAgICByZXR1cm4gbWVzc2FnZUJ1bmRsZS5nZXRSZXNvdXJjZUJ1bmRsZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTWVzc2FnZUJ1bmRsZSBnZXRNZXNzYWdlQnVuZGxlKCkgewotICAgICAgICBNZXNzYWdlQnVuZGxlIG1lc3NhZ2VCdW5kbGUgPSBnZXRNZXNzYWdlQnVuZGxlKERFRkFVTFRfTUVTU0FHRV9CVU5ETEVfS0VZKTsKLSAgICAgICAgcmV0dXJuIG1lc3NhZ2VCdW5kbGU7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBNZXNzYWdlQnVuZGxlIGdldE1lc3NhZ2VCdW5kbGUoU3RyaW5nIG1lc3NhZ2VCdW5kbGVLZXkpIHsKLSAgICAgICAgTWVzc2FnZUJ1bmRsZSBtZXNzYWdlQnVuZGxlID0gKE1lc3NhZ2VCdW5kbGUpbWVzc2FnZUJ1bmRsZU1hcC5nZXQobWVzc2FnZUJ1bmRsZUtleSk7Ci0gICAgICAgIHJldHVybiBtZXNzYWdlQnVuZGxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBhIG1lc3NhZ2UgZnJvbSByZXNvdXJjZS5wcm9wZXJ0aWVzIGZyb20gdGhlIHBhY2thZ2Ugb2YgdGhlIGdpdmVuIG9iamVjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXNzYWdlQnVuZGxlS2V5IFRoZSBrZXkgZm9yIGdldHRpbmcgdGhlIGNvcnJlY3QgbWVzc2FnZSBidW5kbGUuCi0gICAgICogQHBhcmFtIGtleSAgICAgICAgICAgICAgVGhlIHJlc291cmNlIGtleQotICAgICAqIEByZXR1cm4gVGhlIGZvcm1hdHRlZCBtZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZUZyb21CdW5kbGUoU3RyaW5nIG1lc3NhZ2VCdW5kbGVLZXksIFN0cmluZyBrZXkpCi0gICAgICAgICAgICB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uLCBFeGNlcHRpb24gewotICAgICAgICBNZXNzYWdlQnVuZGxlIG1lc3NhZ2VCdW5kbGUgPSBnZXRNZXNzYWdlQnVuZGxlKG1lc3NhZ2VCdW5kbGVLZXkpOwotICAgICAgICBpZiAobWVzc2FnZUJ1bmRsZSA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbihOT19NRVNTQUdFX0JVTkRMRSk7Ci0KLSAgICAgICAgcmV0dXJuIG1lc3NhZ2VCdW5kbGUuZ2V0TWVzc2FnZShrZXkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBhIG1lc3NhZ2UgZnJvbSByZXNvdXJjZS5wcm9wZXJ0aWVzIGZyb20gdGhlIHBhY2thZ2Ugb2YgdGhlIGdpdmVuIG9iamVjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXNzYWdlQnVuZGxlS2V5IFRoZSBrZXkgZm9yIGdldHRpbmcgdGhlIGNvcnJlY3QgbWVzc2FnZSBidW5kbGUuCi0gICAgICogQHBhcmFtIGtleSAgICAgICAgICAgICAgVGhlIHJlc291cmNlIGtleQotICAgICAqIEBwYXJhbSBhcmcwICAgICAgICAgICAgIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7MH0KLSAgICAgKiBAcmV0dXJuIFRoZSBmb3JtYXR0ZWQgbWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2VGcm9tQnVuZGxlKFN0cmluZyBtZXNzYWdlQnVuZGxlS2V5LCBTdHJpbmcga2V5LCBTdHJpbmcgYXJnMCkKLSAgICAgICAgICAgIHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24sIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE1lc3NhZ2VCdW5kbGUgbWVzc2FnZUJ1bmRsZSA9IGdldE1lc3NhZ2VCdW5kbGUobWVzc2FnZUJ1bmRsZUtleSk7Ci0gICAgICAgIGlmIChtZXNzYWdlQnVuZGxlID09IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKE5PX01FU1NBR0VfQlVORExFKTsKLQotICAgICAgICByZXR1cm4gbWVzc2FnZUJ1bmRsZS5nZXRNZXNzYWdlKGtleSwgYXJnMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGEgbWVzc2FnZSBmcm9tIHJlc291cmNlLnByb3BlcnRpZXMgZnJvbSB0aGUgcGFja2FnZSBvZiB0aGUgZ2l2ZW4gb2JqZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIG1lc3NhZ2VCdW5kbGVLZXkgVGhlIGtleSBmb3IgZ2V0dGluZyB0aGUgY29ycmVjdCBtZXNzYWdlIGJ1bmRsZS4KLSAgICAgKiBAcGFyYW0ga2V5ICAgICAgICAgICAgICBUaGUgcmVzb3VyY2Uga2V5Ci0gICAgICogQHBhcmFtIGFyZzAgICAgICAgICAgICAgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHswfQotICAgICAqIEBwYXJhbSBhcmcxICAgICAgICAgICAgIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7MX0KLSAgICAgKiBAcmV0dXJuIFRoZSBmb3JtYXR0ZWQgbWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2VGcm9tQnVuZGxlKFN0cmluZyBtZXNzYWdlQnVuZGxlS2V5LCBTdHJpbmcga2V5LCBTdHJpbmcgYXJnMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYXJnMSkKLSAgICAgICAgICAgIHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24sIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE1lc3NhZ2VCdW5kbGUgbWVzc2FnZUJ1bmRsZSA9IGdldE1lc3NhZ2VCdW5kbGUobWVzc2FnZUJ1bmRsZUtleSk7Ci0gICAgICAgIGlmIChtZXNzYWdlQnVuZGxlID09IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKE5PX01FU1NBR0VfQlVORExFKTsKLQotICAgICAgICByZXR1cm4gbWVzc2FnZUJ1bmRsZS5nZXRNZXNzYWdlKGtleSwgYXJnMCwgYXJnMSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGEgbWVzc2FnZSBmcm9tIHJlc291cmNlLnByb3BlcnRpZXMgZnJvbSB0aGUgcGFja2FnZSBvZiB0aGUgZ2l2ZW4gb2JqZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIG1lc3NhZ2VCdW5kbGVLZXkgVGhlIGtleSBmb3IgZ2V0dGluZyB0aGUgY29ycmVjdCBtZXNzYWdlIGJ1bmRsZS4KLSAgICAgKiBAcGFyYW0ga2V5ICAgICAgICAgICAgICBUaGUgcmVzb3VyY2Uga2V5Ci0gICAgICogQHBhcmFtIGFyZzAgICAgICAgICAgICAgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHswfQotICAgICAqIEBwYXJhbSBhcmcxICAgICAgICAgICAgIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7MX0KLSAgICAgKiBAcGFyYW0gYXJnMiAgICAgICAgICAgICBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezJ9Ci0gICAgICogQHJldHVybiBUaGUgZm9ybWF0dGVkIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXNzYWdlRnJvbUJ1bmRsZShTdHJpbmcgbWVzc2FnZUJ1bmRsZUtleSwgU3RyaW5nIGtleSwgU3RyaW5nIGFyZzAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGFyZzEsIFN0cmluZyBhcmcyKQotICAgICAgICAgICAgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiwgRXhjZXB0aW9uIHsKLSAgICAgICAgTWVzc2FnZUJ1bmRsZSBtZXNzYWdlQnVuZGxlID0gZ2V0TWVzc2FnZUJ1bmRsZShtZXNzYWdlQnVuZGxlS2V5KTsKLSAgICAgICAgaWYgKG1lc3NhZ2VCdW5kbGUgPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oTk9fTUVTU0FHRV9CVU5ETEUpOwotCi0gICAgICAgIHJldHVybiBtZXNzYWdlQnVuZGxlLmdldE1lc3NhZ2Uoa2V5LCBhcmcwLCBhcmcxLCBhcmcyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYSBtZXNzYWdlIGZyb20gcmVzb3VyY2UucHJvcGVydGllcyBmcm9tIHRoZSBwYWNrYWdlIG9mIHRoZSBnaXZlbiBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVzc2FnZUJ1bmRsZUtleSBUaGUga2V5IGZvciBnZXR0aW5nIHRoZSBjb3JyZWN0IG1lc3NhZ2UgYnVuZGxlLgotICAgICAqIEBwYXJhbSBrZXkgICAgICAgICAgICAgIFRoZSByZXNvdXJjZSBrZXkKLSAgICAgKiBAcGFyYW0gYXJnMCAgICAgICAgICAgICBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezB9Ci0gICAgICogQHBhcmFtIGFyZzEgICAgICAgICAgICAgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHsxfQotICAgICAqIEBwYXJhbSBhcmcyICAgICAgICAgICAgIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7Mn0KLSAgICAgKiBAcGFyYW0gYXJnMyAgICAgICAgICAgICBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezN9Ci0gICAgICogQHJldHVybiBUaGUgZm9ybWF0dGVkIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXNzYWdlRnJvbUJ1bmRsZShTdHJpbmcgbWVzc2FnZUJ1bmRsZUtleSwgU3RyaW5nIGtleSwgU3RyaW5nIGFyZzAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGFyZzEsIFN0cmluZyBhcmcyLCBTdHJpbmcgYXJnMykKLSAgICAgICAgICAgIHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24sIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE1lc3NhZ2VCdW5kbGUgbWVzc2FnZUJ1bmRsZSA9IGdldE1lc3NhZ2VCdW5kbGUobWVzc2FnZUJ1bmRsZUtleSk7Ci0gICAgICAgIGlmIChtZXNzYWdlQnVuZGxlID09IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKE5PX01FU1NBR0VfQlVORExFKTsKLQotICAgICAgICByZXR1cm4gbWVzc2FnZUJ1bmRsZS5nZXRNZXNzYWdlKGtleSwgYXJnMCwgYXJnMSwgYXJnMiwgYXJnMyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGEgbWVzc2FnZSBmcm9tIHJlc291cmNlLnByb3BlcnRpZXMgZnJvbSB0aGUgcGFja2FnZSBvZiB0aGUgZ2l2ZW4gb2JqZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIG1lc3NhZ2VCdW5kbGVLZXkgVGhlIGtleSBmb3IgZ2V0dGluZyB0aGUgY29ycmVjdCBtZXNzYWdlIGJ1bmRsZS4KLSAgICAgKiBAcGFyYW0ga2V5ICAgICAgICAgICAgICBUaGUgcmVzb3VyY2Uga2V5Ci0gICAgICogQHBhcmFtIGFyZzAgICAgICAgICAgICAgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHswfQotICAgICAqIEBwYXJhbSBhcmcxICAgICAgICAgICAgIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7MX0KLSAgICAgKiBAcGFyYW0gYXJnMiAgICAgICAgICAgICBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezJ9Ci0gICAgICogQHBhcmFtIGFyZzMgICAgICAgICAgICAgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHszfQotICAgICAqIEBwYXJhbSBhcmc0ICAgICAgICAgICAgIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7NH0KLSAgICAgKiBAcmV0dXJuIFRoZSBmb3JtYXR0ZWQgbWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2VGcm9tQnVuZGxlKFN0cmluZyBtZXNzYWdlQnVuZGxlS2V5LCBTdHJpbmcga2V5LCBTdHJpbmcgYXJnMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYXJnMSwgU3RyaW5nIGFyZzIsIFN0cmluZyBhcmczLCBTdHJpbmcgYXJnNCkKLSAgICAgICAgICAgIHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24sIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE1lc3NhZ2VCdW5kbGUgbWVzc2FnZUJ1bmRsZSA9IGdldE1lc3NhZ2VCdW5kbGUobWVzc2FnZUJ1bmRsZUtleSk7Ci0gICAgICAgIGlmIChtZXNzYWdlQnVuZGxlID09IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKE5PX01FU1NBR0VfQlVORExFKTsKLQotICAgICAgICByZXR1cm4gbWVzc2FnZUJ1bmRsZS5nZXRNZXNzYWdlKGtleSwgYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFBhY2thZ2UoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgcmV0dXJuIG5hbWUuc3Vic3RyaW5nKDAsIG5hbWUubGFzdEluZGV4T2YoJy4nKSkuaW50ZXJuKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvaTE4bi9NZXNzYWdlc0NvbnN0YW50cy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvaTE4bi9NZXNzYWdlc0NvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGNjZGQ0Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2kxOG4vTWVzc2FnZXNDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5pMThuOwotCi1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLXB1YmxpYyBjbGFzcyBNZXNzYWdlc0NvbnN0YW50cyB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgcHJvamVjdE5hbWUgPSAib3JnLmFwYWNoZS5heGlzMi5qYXh3cyIuaW50ZXJuKCk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgcmVzb3VyY2VOYW1lID0gInJlc291cmNlIi5pbnRlcm4oKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIExvY2FsZSBsb2NhbGUgPSBudWxsOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgcm9vdFBhY2thZ2VOYW1lID0gIm9yZy5hcGFjaGUuYXhpczIuamF4d3MuaTE4biIuaW50ZXJuKCk7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFJlc291cmNlQnVuZGxlIHJvb3RCdW5kbGUgPQotICAgICAgICAgICAgUHJvamVjdFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShwcm9qZWN0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9vdFBhY2thZ2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXNDb25zdGFudHMuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCk7Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9pMThuL1Byb2plY3RSZXNvdXJjZUJ1bmRsZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvaTE4bi9Qcm9qZWN0UmVzb3VyY2VCdW5kbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY1ZWViMC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9pMThuL1Byb2plY3RSZXNvdXJjZUJ1bmRsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5pMThuOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotLyoqCi0gKiA8cD5XcmFwcGVyIGNsYXNzIGZvciByZXNvdXJjZSBidW5kbGVzLiBQcm9wZXJ0eSBmaWxlcyBhcmUgdXNlZCB0byBzdG9yZSByZXNvdXJjZSBzdHJpbmdzLCB3aGljaAotICogYXJlIHRoZSBvbmx5IHR5cGVzIG9mIHJlc291cmNlcyBhdmFpbGFibGUuIFByb3BlcnR5IGZpbGVzIGNhbiBpbmhlcml0IHByb3BlcnRpZXMgZnJvbSBvdGhlciBmaWxlcwotICogc28gdGhhdCBhIGJhc2UgcHJvcGVydHkgZmlsZSBjYW4gYmUgdXNlZCBhbmQgYSBzbWFsbCBudW1iZXIgb2YgcHJvcGVydGllcyBjYW4gYmUgb3Zlci1yaWRkZW4gYnkKLSAqIGFub3RoZXIgcHJvcGVydHkgZmlsZS4gRm9yIGV4YW1wbGUgeW91IG1heSBjcmVhdGUgYW4gZW5nbGlzaCB2ZXJzaW9uIG9mIGEgcmVzb3VyY2UgZmlsZSBuYW1lZAotICogInJlc291cmNlLnByb3BlcnRpZXMiLiBZb3UgdGhlbiBkZWNpZGUgdGhhdCB0aGUgQnJpdGlzaCBFbmdsaXNoIHZlcnNpb24gb2YgYWxsIG9mIHRoZSBwcm9wZXJ0aWVzCi0gKiBleGNlcHQgb25lIGFyZSB0aGUgc2FtZSwgc28gdGhlcmUgaXMgbm8gbmVlZCB0byByZWRlZmluZSBhbGwgb2YgdGhlIHByb3BlcnRpZXMgaW4KLSAqICJyZXNvdXJjZV9lbl9HQiIsIGp1c3QgdGhlIG9uZSB0aGF0IGlzIGRpZmZlcmVudC48L3A+IDxwPlRoZSBiYXNlbmFtZSBpcyB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkKLSAqIGZpbGUgd2l0aG91dCB0aGUgIi5wcm9wZXJ0aWVzIiBleHRlbnNpb24uPC9wPiA8cD5Qcm9wZXJ0aWVzIHdpbGwgYmUgY2FjaGVkIGZvciBwZXJmb3JtYW5jZS48cD4KLSAqIDxwPlByb3BlcnR5IHZhbHVlcyBzdG9yZWQgaW4gdGhlIHByb3BlcnR5IGZpbGVzIGNhbiBhbHNvIGNvbnRhaW4gZHluYW1pYyB2YXJpYWJsZXMuIEFueSBkeW5hbWljCi0gKiB2YXJpYWJsZSBkZWZpbmVkIGluIFByb3BlcnRpZXNVdGlsLmdldFZhcmlhYmxlVmFsdWUoKSBjYW4gYmUgdXNlZCAoc3VjaCBhcyB7ZGF0ZX0pLCBhcyB3ZWxsIGFzCi0gKiBhcmd1bWVudHMgaW4gdGhlIGZvcm0gezB9LCB7MX0sIGV0Yy4gQXJndW1lbnQgdmFsdWVzIGFyZSBzcGVjaWZpZWQgaW4gdGhlIHZhcmlvdXMgb3ZlcmxvYWRlZAotICogZ2V0U3RyaW5nKCkgbWV0aG9kcy48L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBQcm9qZWN0UmVzb3VyY2VCdW5kbGUgZXh0ZW5kcyBSZXNvdXJjZUJ1bmRsZSB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFByb2plY3RSZXNvdXJjZUJ1bmRsZS5jbGFzcyk7Ci0KLQotICAgIC8vIFRoZSBzdGF0aWMgY2FjaGUgb2YgUmVzb3VyY2VCdW5kbGVzLgotICAgIC8vIFRoZSBrZXkgaXMgdGhlICdiYXNlbmFtZSArIGxvY2FsZSArIGRlZmF1bHQgbG9jYWxlJwotICAgIC8vIFRoZSBlbGVtZW50IGlzIGEgUmVzb3VyY2VCdW5kbGUgb2JqZWN0Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSGFzaHRhYmxlIGJ1bmRsZUNhY2hlID0gbmV3IEhhc2h0YWJsZSgpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9jYWxlIGRlZmF1bHRMb2NhbGUgPSBMb2NhbGUuZ2V0RGVmYXVsdCgpOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZTsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyByZXNvdXJjZU5hbWU7Ci0KLQotICAgIHByb3RlY3RlZCBPYmplY3QgaGFuZGxlR2V0T2JqZWN0KFN0cmluZyBrZXkpCi0gICAgICAgICAgICB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcodGhpcy50b1N0cmluZygpICsgIjo6aGFuZGxlR2V0T2JqZWN0KCIgKyBrZXkgKyAiKSIpOwotICAgICAgICB9Ci0gICAgICAgIE9iamVjdCBvYmo7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBvYmogPSByZXNvdXJjZUJ1bmRsZS5nZXRPYmplY3Qoa2V5KTsKLSAgICAgICAgfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8qIGNhdGNoIG1pc3NpbmcgcmVzb3VyY2UsIGlnbm9yZSwgJiByZXR1cm4gbnVsbAotICAgICAgICAgICAgICogaWYgdGhpcyBtZXRob2QgZG9lc24ndCByZXR1cm4gbnVsbCwgdGhlbiBwYXJlbnRzCi0gICAgICAgICAgICAgKiBhcmUgbm90IHNlYXJjaGVkCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIG9iaiA9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG9iajsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0S2V5cygpIHsKLSAgICAgICAgRW51bWVyYXRpb24gbXlLZXlzID0gcmVzb3VyY2VCdW5kbGUuZ2V0S2V5cygpOwotICAgICAgICBpZiAocGFyZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBteUtleXM7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmaW5hbCBIYXNoU2V0IHNldCA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgICAgICAgICB3aGlsZSAobXlLZXlzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICAgICAgc2V0LmFkZChteUtleXMubmV4dEVsZW1lbnQoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEVudW1lcmF0aW9uIHBLZXlzID0gcGFyZW50LmdldEtleXMoKTsKLSAgICAgICAgICAgIHdoaWxlIChwS2V5cy5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgICAgIHNldC5hZGQocEtleXMubmV4dEVsZW1lbnQoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBuZXcgRW51bWVyYXRpb24oKSB7Ci0gICAgICAgICAgICAgICAgcHJpdmF0ZSBJdGVyYXRvciBpdCA9IHNldC5pdGVyYXRvcigpOwotCi0gICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTW9yZUVsZW1lbnRzKCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXQuaGFzTmV4dCgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgbmV4dEVsZW1lbnQoKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBpdC5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0IGEgbmV3IFByb2plY3RSZXNvdXJjZUJ1bmRsZQotICAgICAqCi0gICAgICogQHBhcmFtIHByb2plY3ROYW1lICBUaGUgbmFtZSBvZiB0aGUgcHJvamVjdCB0byB3aGljaCB0aGUgY2xhc3MgYmVsb25ncy4gSXQgbXVzdCBiZSBhIHByb3BlcgotICAgICAqICAgICAgICAgICAgICAgICAgICAgcHJlZml4IG9mIHRoZSBjYWxsZXIncyBwYWNrYWdlLgotICAgICAqIEBwYXJhbSBwYWNrYWdlTmFtZSAgVGhlIHBhY2thZ2UgbmFtZSB0byBmdXJ0aGVyIGNvbnN0cnVjdCB0aGUgYmFzZW5hbWUuCi0gICAgICogQHBhcmFtIHJlc291cmNlTmFtZSBUaGUgbmFtZSBvZiB0aGUgcmVzb3VyY2Ugd2l0aG91dCB0aGUgIi5wcm9wZXJ0aWVzIiBleHRlbnNpb24KLSAgICAgKiBAdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBpZiBwcm9qZWN0TmFtZSBpcyBub3QgYSBwcmVmaXggb2YgdGhlIGNhbGxlcidzIHBhY2thZ2UgbmFtZSwKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBpZiB0aGUgcmVzb3VyY2UgY291bGQgbm90IGJlIGZvdW5kL2xvYWRlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFByb2plY3RSZXNvdXJjZUJ1bmRsZSBnZXRCdW5kbGUoU3RyaW5nIHByb2plY3ROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyByZXNvdXJjZU5hbWUpCi0gICAgICAgICAgICB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGdldEJ1bmRsZShwcm9qZWN0TmFtZSwgcGFja2FnZU5hbWUsIHJlc291cmNlTmFtZSwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0IGEgbmV3IFByb2plY3RSZXNvdXJjZUJ1bmRsZQotICAgICAqCi0gICAgICogQHBhcmFtIHByb2plY3ROYW1lICBUaGUgbmFtZSBvZiB0aGUgcHJvamVjdCB0byB3aGljaCB0aGUgY2xhc3MgYmVsb25ncy4gSXQgbXVzdCBiZSBhIHByb3BlcgotICAgICAqICAgICAgICAgICAgICAgICAgICAgcHJlZml4IG9mIHRoZSBjYWxsZXIncyBwYWNrYWdlLgotICAgICAqIEBwYXJhbSBjYWxsZXIgICAgICAgVGhlIGNhbGxpbmcgY2xhc3MuCi0gICAgICogQHBhcmFtIHJlc291cmNlTmFtZSBUaGUgbmFtZSBvZiB0aGUgcmVzb3VyY2Ugd2l0aG91dCB0aGUgIi5wcm9wZXJ0aWVzIiBleHRlbnNpb24KLSAgICAgKiBAdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBpZiBwcm9qZWN0TmFtZSBpcyBub3QgYSBwcmVmaXggb2YgdGhlIGNhbGxlcidzIHBhY2thZ2UgbmFtZSwKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBpZiB0aGUgcmVzb3VyY2UgY291bGQgbm90IGJlIGZvdW5kL2xvYWRlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFByb2plY3RSZXNvdXJjZUJ1bmRsZSBnZXRCdW5kbGUoU3RyaW5nIHByb2plY3ROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyBjYWxsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyByZXNvdXJjZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY2FsZSBsb2NhbGUpCi0gICAgICAgICAgICB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGdldEJ1bmRsZShwcm9qZWN0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgUHJvamVjdFJlc291cmNlQnVuZGxlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcHJvamVjdE5hbWUgIFRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0IHRvIHdoaWNoIHRoZSBjbGFzcyBiZWxvbmdzLiBJdCBtdXN0IGJlIGEgcHJvcGVyCi0gICAgICogICAgICAgICAgICAgICAgICAgICBwcmVmaXggb2YgdGhlIGNhbGxlcidzIHBhY2thZ2UuCi0gICAgICogQHBhcmFtIHBhY2thZ2VOYW1lICBUaGUgcGFja2FnZSBuYW1lIHRvIGNvbnN0cnVjdCBiYXNlIG5hbWUuCi0gICAgICogQHBhcmFtIHJlc291cmNlTmFtZSBUaGUgbmFtZSBvZiB0aGUgcmVzb3VyY2Ugd2l0aG91dCB0aGUgIi5wcm9wZXJ0aWVzIiBleHRlbnNpb24KLSAgICAgKiBAcGFyYW0gbG9jYWxlICAgICAgIFRoZSBsb2NhbGUKLSAgICAgKiBAdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBpZiBwcm9qZWN0TmFtZSBpcyBub3QgYSBwcmVmaXggb2YgdGhlIGNhbGxlcidzIHBhY2thZ2UgbmFtZSwKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBpZiB0aGUgcmVzb3VyY2UgY291bGQgbm90IGJlIGZvdW5kL2xvYWRlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFByb2plY3RSZXNvdXJjZUJ1bmRsZSBnZXRCdW5kbGUoU3RyaW5nIHByb2plY3ROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyByZXNvdXJjZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY2FsZSBsb2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzTG9hZGVyIGxvYWRlcikKLSAgICAgICAgICAgIHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZ2V0QnVuZGxlKHByb2plY3ROYW1lLCBwYWNrYWdlTmFtZSwgcmVzb3VyY2VOYW1lLCBsb2NhbGUsIGxvYWRlciwgbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0IGEgbmV3IFByb2plY3RSZXNvdXJjZUJ1bmRsZQotICAgICAqCi0gICAgICogQHBhcmFtIHByb2plY3ROYW1lICAgVGhlIG5hbWUgb2YgdGhlIHByb2plY3QgdG8gd2hpY2ggdGhlIGNsYXNzIGJlbG9uZ3MuIEl0IG11c3QgYmUgYSBwcm9wZXIKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggb2YgdGhlIGNhbGxlcidzIHBhY2thZ2UuCi0gICAgICogQHBhcmFtIGNhbGxlciAgICAgICAgVGhlIGNhbGxpbmcgY2xhc3MuIFRoaXMgaXMgdXNlZCB0byBnZXQgdGhlIHBhY2thZ2UgbmFtZSB0byBmdXJ0aGVyCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0IHRoZSBiYXNlbmFtZSBhcyB3ZWxsIGFzIHRvIGdldCB0aGUgcHJvcGVyIENsYXNzTG9hZGVyLgotICAgICAqIEBwYXJhbSByZXNvdXJjZU5hbWUgIFRoZSBuYW1lIG9mIHRoZSByZXNvdXJjZSB3aXRob3V0IHRoZSAiLnByb3BlcnRpZXMiIGV4dGVuc2lvbgotICAgICAqIEBwYXJhbSBsb2NhbGUgICAgICAgIFRoZSBsb2NhbGUKLSAgICAgKiBAcGFyYW0gZXh0ZW5kc0J1bmRsZSBJZiBub24tbnVsbCwgdGhlbiB0aGlzIEV4dGVuZE1lc3NhZ2VzIHdpbGwgZGVmYXVsdCB0byBleHRlbmRzQnVuZGxlLgotICAgICAqIEB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGlmIHByb2plY3ROYW1lIGlzIG5vdCBhIHByZWZpeCBvZiB0aGUgY2FsbGVyJ3MgcGFja2FnZSBuYW1lLAotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGlmIHRoZSByZXNvdXJjZSBjb3VsZCBub3QgYmUgZm91bmQvbG9hZGVkLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgUHJvamVjdFJlc291cmNlQnVuZGxlIGdldEJ1bmRsZShTdHJpbmcgcHJvamVjdE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzIGNhbGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlc291cmNlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxlIGxvY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VCdW5kbGUgZXh0ZW5kc0J1bmRsZSkKLSAgICAgICAgICAgIHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZ2V0QnVuZGxlKHByb2plY3ROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgIGdldFBhY2thZ2UoY2FsbGVyLmdldENsYXNzKCkuZ2V0TmFtZSgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxlci5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5kc0J1bmRsZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0IGEgbmV3IFByb2plY3RSZXNvdXJjZUJ1bmRsZQotICAgICAqCi0gICAgICogQHBhcmFtIHByb2plY3ROYW1lICAgVGhlIG5hbWUgb2YgdGhlIHByb2plY3QgdG8gd2hpY2ggdGhlIGNsYXNzIGJlbG9uZ3MuIEl0IG11c3QgYmUgYSBwcm9wZXIKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggb2YgdGhlIGNhbGxlcidzIHBhY2thZ2UuCi0gICAgICogQHBhcmFtIHBhY2thZ2VOYW1lICAgVGhlIHBhY2thZ2UgbmFtZSB0byBmdXJ0aGVyIGNvbnN0cnVjdCB0aGUgYmFzZW5hbWUuCi0gICAgICogQHBhcmFtIHJlc291cmNlTmFtZSAgVGhlIG5hbWUgb2YgdGhlIHJlc291cmNlIHdpdGhvdXQgdGhlICIucHJvcGVydGllcyIgZXh0ZW5zaW9uCi0gICAgICogQHBhcmFtIGxvY2FsZSAgICAgICAgVGhlIGxvY2FsZQotICAgICAqIEBwYXJhbSBleHRlbmRzQnVuZGxlIElmIG5vbi1udWxsLCB0aGVuIHRoaXMgRXh0ZW5kTWVzc2FnZXMgd2lsbCBkZWZhdWx0IHRvIGV4dGVuZHNCdW5kbGUuCi0gICAgICogQHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gaWYgcHJvamVjdE5hbWUgaXMgbm90IGEgcHJlZml4IG9mIHRoZSBjYWxsZXIncyBwYWNrYWdlIG5hbWUsCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgaWYgdGhlIHJlc291cmNlIGNvdWxkIG5vdCBiZSBmb3VuZC9sb2FkZWQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBQcm9qZWN0UmVzb3VyY2VCdW5kbGUgZ2V0QnVuZGxlKFN0cmluZyBwcm9qZWN0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmVzb3VyY2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbGUgbG9jYWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc0xvYWRlciBsb2FkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlQnVuZGxlIGV4dGVuZHNCdW5kbGUpCi0gICAgICAgICAgICB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoImdldEJ1bmRsZSgiICsgcHJvamVjdE5hbWUgKyAiLCIKLSAgICAgICAgICAgICAgICAgICAgKyBwYWNrYWdlTmFtZSArICIsIgotICAgICAgICAgICAgICAgICAgICArIHJlc291cmNlTmFtZSArICIsIgotICAgICAgICAgICAgICAgICAgICArIFN0cmluZy52YWx1ZU9mKGxvY2FsZSkgKyAiLC4uLikiKTsKLSAgICAgICAgfQotCi0gICAgICAgIENvbnRleHQgY29udGV4dCA9IG5ldyBDb250ZXh0KCk7Ci0gICAgICAgIGNvbnRleHQuc2V0TG9jYWxlKGxvY2FsZSk7Ci0gICAgICAgIGNvbnRleHQuc2V0TG9hZGVyKGxvYWRlcik7Ci0gICAgICAgIGNvbnRleHQuc2V0UHJvamVjdE5hbWUocHJvamVjdE5hbWUpOwotICAgICAgICBjb250ZXh0LnNldFJlc291cmNlTmFtZShyZXNvdXJjZU5hbWUpOwotICAgICAgICBjb250ZXh0LnNldFBhcmVudEJ1bmRsZShleHRlbmRzQnVuZGxlKTsKLQotICAgICAgICBwYWNrYWdlTmFtZSA9IGNvbnRleHQudmFsaWRhdGUocGFja2FnZU5hbWUpOwotCi0gICAgICAgIFByb2plY3RSZXNvdXJjZUJ1bmRsZSBidW5kbGUgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnVuZGxlID0gZ2V0QnVuZGxlKGNvbnRleHQsIHBhY2thZ2VOYW1lKTsKLSAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIkV4Y2VwdGlvbjogIiwgZSk7Ci0gICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGJ1bmRsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uKCJDYW5ub3QgZmluZCByZXNvdXJjZSAnIiArCi0gICAgICAgICAgICAgICAgICAgIHBhY2thZ2VOYW1lICsgJy4nICsgcmVzb3VyY2VOYW1lICsgIiciLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZU5hbWUsICIiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBidW5kbGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogZ2V0IGJ1bmRsZS4uLiAtIGNoZWNrIGNhY2hlIC0gdHJ5IHVwIGhpZXJhcmNoeSAtIGlmIGF0IHRvcCBvZiBoaWVyYXJjaHksIHVzZSAobGluayB0bykKLSAgICAgKiBjb250ZXh0LmdldFBhcmVudEJ1bmRsZSgpCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgc3luY2hyb25pemVkIFByb2plY3RSZXNvdXJjZUJ1bmRsZSBnZXRCdW5kbGUoQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgcGFja2FnZU5hbWUpCi0gICAgICAgICAgICB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIGNhY2hlS2V5ID0gY29udGV4dC5nZXRDYWNoZUtleShwYWNrYWdlTmFtZSk7Ci0KLSAgICAgICAgUHJvamVjdFJlc291cmNlQnVuZGxlIHByYiA9IChQcm9qZWN0UmVzb3VyY2VCdW5kbGUpYnVuZGxlQ2FjaGUuZ2V0KGNhY2hlS2V5KTsKLQotICAgICAgICBpZiAocHJiID09IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gcGFja2FnZU5hbWUgKyAnLicgKyBjb250ZXh0LmdldFJlc291cmNlTmFtZSgpOwotICAgICAgICAgICAgUmVzb3VyY2VCdW5kbGUgcmIgPSBjb250ZXh0LmxvYWRCdW5kbGUocGFja2FnZU5hbWUpOwotICAgICAgICAgICAgUmVzb3VyY2VCdW5kbGUgcGFyZW50ID0gY29udGV4dC5nZXRQYXJlbnRCdW5kbGUocGFja2FnZU5hbWUpOwotCi0gICAgICAgICAgICBpZiAocmIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHByYiA9IG5ldyBQcm9qZWN0UmVzb3VyY2VCdW5kbGUobmFtZSwgcmIpOwotICAgICAgICAgICAgICAgIHByYi5zZXRQYXJlbnQocGFyZW50KTsKLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJDcmVhdGVkICIgKyBwcmIgKyAiLCBsaW5rZWQgdG8gcGFyZW50ICIgKyBTdHJpbmcudmFsdWVPZihwYXJlbnQpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgUHJvamVjdFJlc291cmNlQnVuZGxlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmIgPSAoUHJvamVjdFJlc291cmNlQnVuZGxlKXBhcmVudDsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByYiA9IG5ldyBQcm9qZWN0UmVzb3VyY2VCdW5kbGUobmFtZSwgcGFyZW50KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiUm9vdCBwYWNrYWdlIG5vdCBmb3VuZCwgY3Jvc3MgbGluayB0byAiICsgcGFyZW50KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHByYiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gQ2FjaGUgdGhlIHJlc291cmNlCi0gICAgICAgICAgICAgICAgYnVuZGxlQ2FjaGUucHV0KGNhY2hlS2V5LCBwcmIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHByYjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0UGFja2FnZShTdHJpbmcgbmFtZSkgewotICAgICAgICByZXR1cm4gbmFtZS5zdWJzdHJpbmcoMCwgbmFtZS5sYXN0SW5kZXhPZignLicpKS5pbnRlcm4oKTsKLSAgICB9Ci0KLSAgICAvKiogQ29uc3RydWN0IGEgbmV3IFByb2plY3RSZXNvdXJjZUJ1bmRsZSAqLwotICAgIHByaXZhdGUgUHJvamVjdFJlc291cmNlQnVuZGxlKFN0cmluZyBuYW1lLCBSZXNvdXJjZUJ1bmRsZSBidW5kbGUpCi0gICAgICAgICAgICB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5yZXNvdXJjZUJ1bmRsZSA9IGJ1bmRsZTsKLSAgICAgICAgdGhpcy5yZXNvdXJjZU5hbWUgPSBuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVzb3VyY2VOYW1lKCkgewotICAgICAgICByZXR1cm4gcmVzb3VyY2VOYW1lOwotICAgIH0KLQotICAgIC8qKiBDbGVhcnMgdGhlIGludGVybmFsIGNhY2hlICovCi0vLyAgICBwdWJsaWMgc3RhdGljIHZvaWQgY2xlYXJDYWNoZSgpIHsKLS8vICAgICAgICBidW5kbGVDYWNoZS5jbGVhcigpOwotLy8gICAgfQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiByZXNvdXJjZU5hbWU7Ci0gICAgfQotCi0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDb250ZXh0IHsKLSAgICAgICAgcHJpdmF0ZSBMb2NhbGUgX2xvY2FsZTsKLSAgICAgICAgcHJpdmF0ZSBDbGFzc0xvYWRlciBfbG9hZGVyOwotICAgICAgICBwcml2YXRlIFN0cmluZyBfcHJvamVjdE5hbWU7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIF9yZXNvdXJjZU5hbWU7Ci0gICAgICAgIHByaXZhdGUgUmVzb3VyY2VCdW5kbGUgX3BhcmVudDsKLQotICAgICAgICB2b2lkIHNldExvY2FsZShMb2NhbGUgbCkgewotICAgICAgICAgICAgLyogMS4gRG9jcyBpbmRpY2F0ZSB0aGF0IGlmIGxvY2FsZSBpcyBub3Qgc3BlY2lmaWVkLAotICAgICAgICAgICAgICogICAgdGhlbiB0aGUgZGVmYXVsdCBsb2NhbCBpcyB1c2VkIGluIGl0J3MgcGxhY2UuCi0gICAgICAgICAgICAgKiAyLiBBIG51bGwgdmFsdWUgZm9yIGxvY2FsZSBpcyBpbnZhbGlkLgotICAgICAgICAgICAgICogCi0gICAgICAgICAgICAgKiBUaGVyZWZvcmUsIGRlZmF1bHQuLi4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgX2xvY2FsZSA9IChsID09IG51bGwpID8gZGVmYXVsdExvY2FsZSA6IGw7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHNldExvYWRlcihDbGFzc0xvYWRlciBsKSB7Ci0gICAgICAgICAgICBfbG9hZGVyID0gKGwgIT0gbnVsbCkgPyBsIDogdGhpcy5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCk7Ci0gICAgICAgICAgICAvLyBTVEFSVCBGSVg6IGh0dHA6Ly9uYWdveWEuYXBhY2hlLm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MTY4NjgKLSAgICAgICAgICAgIGlmIChfbG9hZGVyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBfbG9hZGVyID0gQ2xhc3NMb2FkZXIuZ2V0U3lzdGVtQ2xhc3NMb2FkZXIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEVORCBGSVg6IGh0dHA6Ly9uYWdveWEuYXBhY2hlLm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MTY4NjgKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgc2V0UHJvamVjdE5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgICAgIF9wcm9qZWN0TmFtZSA9IG5hbWUuaW50ZXJuKCk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHNldFJlc291cmNlTmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICAgICAgX3Jlc291cmNlTmFtZSA9IG5hbWUuaW50ZXJuKCk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHNldFBhcmVudEJ1bmRsZShSZXNvdXJjZUJ1bmRsZSBiKSB7Ci0gICAgICAgICAgICBfcGFyZW50ID0gYjsKLSAgICAgICAgfQotCi0gICAgICAgIExvY2FsZSBnZXRMb2NhbGUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gX2xvY2FsZTsKLSAgICAgICAgfQotCi0gICAgICAgIENsYXNzTG9hZGVyIGdldExvYWRlcigpIHsKLSAgICAgICAgICAgIHJldHVybiBfbG9hZGVyOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGdldFByb2plY3ROYW1lKCkgewotICAgICAgICAgICAgcmV0dXJuIF9wcm9qZWN0TmFtZTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBnZXRSZXNvdXJjZU5hbWUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gX3Jlc291cmNlTmFtZTsKLSAgICAgICAgfQotCi0gICAgICAgIFJlc291cmNlQnVuZGxlIGdldFBhcmVudEJ1bmRsZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBfcGFyZW50OwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGdldENhY2hlS2V5KFN0cmluZyBwYWNrYWdlTmFtZSkgewotICAgICAgICAgICAgU3RyaW5nIGxvYWRlck5hbWUgPSAoX2xvYWRlciA9PSBudWxsKSA/ICIiIDogKCI6IiArIF9sb2FkZXIuaGFzaENvZGUoKSk7Ci0gICAgICAgICAgICByZXR1cm4gcGFja2FnZU5hbWUgKyAiLiIgKyBfcmVzb3VyY2VOYW1lICsgIjoiICsgX2xvY2FsZSArICI6IiArIGRlZmF1bHRMb2NhbGUgKwotICAgICAgICAgICAgICAgICAgICBsb2FkZXJOYW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgUmVzb3VyY2VCdW5kbGUgbG9hZEJ1bmRsZShTdHJpbmcgcGFja2FnZU5hbWUpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShwYWNrYWdlTmFtZSArICcuJyArIF9yZXNvdXJjZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbG9jYWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2xvYWRlcik7Ci0gICAgICAgICAgICB9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIERlbGliZXJhdGVseSBzdXJwcmVzc2luZyBwcmludCBzdGFjay4uIGp1c3QgdGhlIHN0cmluZyBmb3IgaW5mby4KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoImxvYWRCdW5kbGU6IElnbm9yaW5nIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgUmVzb3VyY2VCdW5kbGUgZ2V0UGFyZW50QnVuZGxlKFN0cmluZyBwYWNrYWdlTmFtZSkgewotICAgICAgICAgICAgUmVzb3VyY2VCdW5kbGUgcDsKLSAgICAgICAgICAgIGlmICghcGFja2FnZU5hbWUuZXF1YWxzKF9wcm9qZWN0TmFtZSkpIHsKLSAgICAgICAgICAgICAgICBwID0gZ2V0QnVuZGxlKHRoaXMsIGdldFBhY2thZ2UocGFja2FnZU5hbWUpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcCA9IF9wYXJlbnQ7Ci0gICAgICAgICAgICAgICAgX3BhcmVudCA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcDsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyB2YWxpZGF0ZShTdHJpbmcgcGFja2FnZU5hbWUpCi0gICAgICAgICAgICAgICAgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBpZiAoX3Byb2plY3ROYW1lID09IG51bGwgfHwgX3Byb2plY3ROYW1lLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlByb2plY3QgbmFtZSBub3Qgc3BlY2lmaWVkIik7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbigiUHJvamVjdCBuYW1lIG5vdCBzcGVjaWZpZWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIsICIiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHBhY2thZ2VOYW1lID09IG51bGwgfHwgcGFja2FnZU5hbWUubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiUGFja2FnZSBuYW1lIG5vdCBzcGVjaWZpZWQiKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uKCJQYWNrYWdlIG5vdCBzcGVjaWZpZWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZU5hbWUsICIiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBhY2thZ2VOYW1lID0gcGFja2FnZU5hbWUuaW50ZXJuKCk7Ci0KLSAgICAgICAgICAgIC8qIEVuc3VyZSB0aGF0IHByb2plY3QgaXMgYSBwcm9wZXIgcHJlZml4IG9mIGNsYXNzLgotICAgICAgICAgICAgKiBUZXJtaW5hdGUgcHJvamVjdCBuYW1lIHdpdGggJy4nIHRvIGVuc3VyZSBwcm9wZXIgbWF0Y2guCi0gICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKCFwYWNrYWdlTmFtZS5lcXVhbHMoX3Byb2plY3ROYW1lKSAmJiAhcGFja2FnZU5hbWUuc3RhcnRzV2l0aChfcHJvamVjdE5hbWUgKyAnLicpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJQcm9qZWN0IG5vdCBhIHByZWZpeCBvZiBQYWNrYWdlIik7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbigiUHJvamVjdCAnIiArIF9wcm9qZWN0TmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiJyBtdXN0IGJlIGEgcHJlZml4IG9mIFBhY2thZ2UgJyIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgcGFja2FnZU5hbWUgKyAiJyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlTmFtZSArICcuJyArIF9yZXNvdXJjZU5hbWUsICIiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHBhY2thZ2VOYW1lOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvaTE4bi9SQi5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvaTE4bi9SQi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWQ2Y2Q4Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2kxOG4vUkIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaTE4bjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci0KLS8qKgotICogQ1VSUkVOVExZIE5PVCBVU0VEIEtFRVBJTkcgRk9SIFJFRkVSRU5DRSAgOS8xOS8yMDAyCi0gKiA8cC8+Ci0gKiA8cD5XcmFwcGVyIGNsYXNzIGZvciByZXNvdXJjZSBidW5kbGVzLiBQcm9wZXJ0eSBmaWxlcyBhcmUgdXNlZCB0byBzdG9yZSByZXNvdXJjZSBzdHJpbmdzLCB3aGljaAotICogYXJlIHRoZSBvbmx5IHR5cGVzIG9mIHJlc291cmNlcyBhdmFpbGFibGUuIFByb3BlcnR5IGZpbGVzIGNhbiBpbmhlcml0IHByb3BlcnRpZXMgZnJvbSBvdGhlciBmaWxlcwotICogc28gdGhhdCBhIGJhc2UgcHJvcGVydHkgZmlsZSBjYW4gYmUgdXNlZCBhbmQgYSBzbWFsbCBudW1iZXIgb2YgcHJvcGVydGllcyBjYW4gYmUgb3Zlci1yaWRkZW4gYnkKLSAqIGFub3RoZXIgcHJvcGVydHkgZmlsZS4gRm9yIGV4YW1wbGUgeW91IG1heSBjcmVhdGUgYW4gZW5nbGlzaCB2ZXJzaW9uIG9mIGEgcmVzb3VyY2UgZmlsZSBuYW1lZAotICogInJlc291cmNlLnByb3BlcnRpZXMiLiBZb3UgdGhlbiBkZWNpZGUgdGhhdCB0aGUgQnJpdGlzaCBFbmdsaXNoIHZlcnNpb24gb2YgYWxsIG9mIHRoZSBwcm9wZXJ0aWVzCi0gKiBleGNlcHQgb25lIGFyZSB0aGUgc2FtZSwgc28gdGhlcmUgaXMgbm8gbmVlZCB0byByZWRlZmluZSBhbGwgb2YgdGhlIHByb3BlcnRpZXMgaW4KLSAqICJyZXNvdXJjZV9lbl9HQiIsIGp1c3QgdGhlIG9uZSB0aGF0IGlzIGRpZmZlcmVudC48L3A+IDxwPlRoZSBwcm9wZXJ0eSBmaWxlIGxvb2t1cCBzZWFyY2hlcyBmb3IKLSAqIGNsYXNzZXMgd2l0aCB2YXJpb3VzIHN1ZmZpeGVzIG9uIHRoZSBiYXNpcyBpZiB0aGUgZGVzaXJlZCBsb2NhbCBhbmQgdGhlIGN1cnJlbnQgZGVmYXVsdCBsb2NhbCAoYXMKLSAqIHJldHVybmVkIGJ5IExvY2FsLmdldERlZmF1bHQoKSkuIEFzIHByb3BlcnR5IGZpbGVzIGFyZSBmb3VuZCB0aGUgcHJvcGVydHkgdmFsdWVzIGFyZSBtZXJnZWQgc28KLSAqIHRoYXQgaW5oZXJpdGFuY2UgaXMgcHJlc2VydmVkLjwvcD4gPHA+VGhlIG9yZGVyIG9mIHNlYXJjaGluZyBpczo8L3A+IDxkaXI+IGJhc2VuYW1lICsgIl8iICsKLSAqIGxhbmdhZ2UgKyAiXyIgKyBjb3VudHJ5ICsgIl8iICsgdmFyaWFudCBiYXNlbmFtZSArICJfIiArIGxhbmdhZ2UgKyAiXyIgKyBjb3VudHJ5IGJhc2VuYW1lICsgIl8iICsKLSAqIGxhbmdhZ2UgYmFzZW5hbWUgKyAiXyIgKyBkZWZhdWx0TGFuZ3VhZ2UgKyAiXyIgKyBkZWZhdWx0Q291bnRyeSArICJfIiArIGRlZmF1bHRWYXJpYW50IGJhc2VuYW1lICsKLSAqICJfIiArIGRlZmF1bHRMYW5ndWFnZSArICJfIiArIGRlZmF1bHRDb3VudHJ5IGJhc2VuYW1lICsgIl8iICsgZGVmYXVsdExhbmd1YWdlIGJhc2VuYW1lIDwvZGlyPgotICogPHA+VGhlIGJhc2VuYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBmaWxlIHdpdGhvdXQgdGhlICIucHJvcGVydGllcyIgZXh0ZW5zaW9uLjwvcD4KLSAqIDxwPlByb3BlcnRpZXMgd2lsbCBiZSBjYWNoZWQgZm9yIHBlcmZvcm1hbmNlLjxwPiA8cD5Qcm9wZXJ0eSB2YWx1ZXMgc3RvcmVkIGluIHRoZSBwcm9wZXJ0eSBmaWxlcwotICogY2FuIGFsc28gY29udGFpbiBkeW5hbWljIHZhcmlhYmxlcy4gQW55IGR5bmFtaWMgdmFyaWFibGUgZGVmaW5lZCBpbgotICogUHJvcGVydGllc1V0aWwuZ2V0VmFyaWFibGVWYWx1ZSgpIGNhbiBiZSB1c2VkIChzdWNoIGFzIHtkYXRlfSksIGFzIHdlbGwgYXMgYXJndW1lbnRzIGluIHRoZSBmb3JtCi0gKiB7MH0sIHsxfSwgZXRjLiBBcmd1bWVudCB2YWx1ZXMgYXJlIHNwZWNpZmllZCBpbiB0aGUgdmFyaW91cyBvdmVybG9hZGVkIGdldFN0cmluZygpIG1ldGhvZHMuPC9wPgotICovCi1wdWJsaWMgY2xhc3MgUkIgewotICAgIC8vIFRoZSBzdGF0aWMgY2FjaGUgb2YgcHJvcGVydGllcy4gVGhlIGtleSBpcyB0aGUgYmFzZW5hbWUgKyB0aGUgbG9jYWwgKwotICAgIC8vIHRoZSBkZWZhdWx0IGxvY2FsIGFuZCB0aGUgZWxlbWVudCBpcyB0aGUgUHJvcGVydGllcyBvYmplY3QgY29udGFpbmluZwotICAgIC8vIHRoZSByZXNvdXJjZXMKLSAgICBzdGF0aWMgSGFzaHRhYmxlIHByb3BlcnR5Q2FjaGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLSAgICAvLyBUaGUgZGVmYXVsdCBiYXNlIG5hbWUKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCQVNFX05BTUUgPSAicmVzb3VyY2UiOwotCi0gICAgLy8gVGhlIHByb3BlcnR5IGZpbGUgZXh0ZW5zaW9uCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfRVhUID0gIi5wcm9wZXJ0aWVzIjsKLQotICAgIC8vIFRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IGJhc2UgcHJvcGVydHkgZmlsZSAod2l0aCBleHRlbnNpb24pCi0gICAgcHJvdGVjdGVkIFN0cmluZyBiYXNlUHJvcGVydHlGaWxlTmFtZTsKLQotICAgIC8vIFRoZSBwcm9wZXJ0aWVzIGZvciB0aGUgY3VycmVudCByZXNvdXJjZSBidW5kbGUKLSAgICBwcm90ZWN0ZWQgUHJvcGVydGllcyByZXNvdXJjZVByb3BlcnRpZXM7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgUkIKLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBmaWxlIHdpdGhvdXQgdGhlICIucHJvcGVydGllcyIgZXh0ZW5zaW9uCi0gICAgICovCi0gICAgcHVibGljIFJCKFN0cmluZyBuYW1lKSB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcyhudWxsLCBuYW1lLCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgUkIKLSAgICAgKgotICAgICAqIEBwYXJhbSBjYWxsZXIgVGhlIGNhbGxpbmcgb2JqZWN0LiBUaGlzIGlzIHVzZWQgdG8gZ2V0IHRoZSBwYWNrYWdlIG5hbWUgdG8gZnVydGhlciBjb25zdHJ1Y3QKLSAgICAgKiAgICAgICAgICAgICAgIHRoZSBiYXNlbmFtZSBhcyB3ZWxsIGFzIHRvIGdldCB0aGUgcHJvcGVyIENsYXNzTG9hZGVyCi0gICAgICogQHBhcmFtIG5hbWUgICBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgZmlsZSB3aXRob3V0IHRoZSAiLnByb3BlcnRpZXMiIGV4dGVuc2lvbgotICAgICAqLwotICAgIHB1YmxpYyBSQihPYmplY3QgY2FsbGVyLCBTdHJpbmcgbmFtZSkgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMoY2FsbGVyLCBuYW1lLCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgUkIKLSAgICAgKgotICAgICAqIEBwYXJhbSBjYWxsZXIgVGhlIGNhbGxpbmcgb2JqZWN0LiBUaGlzIGlzIHVzZWQgdG8gZ2V0IHRoZSBwYWNrYWdlIG5hbWUgdG8gZnVydGhlciBjb25zdHJ1Y3QKLSAgICAgKiAgICAgICAgICAgICAgIHRoZSBiYXNlbmFtZSBhcyB3ZWxsIGFzIHRvIGdldCB0aGUgcHJvcGVyIENsYXNzTG9hZGVyCi0gICAgICogQHBhcmFtIG5hbWUgICBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgZmlsZSB3aXRob3V0IHRoZSAiLnByb3BlcnRpZXMiIGV4dGVuc2lvbgotICAgICAqIEBwYXJhbSBsb2NhbGUgVGhlIGxvY2FsZQotICAgICAqLwotICAgIHB1YmxpYyBSQihPYmplY3QgY2FsbGVyLCBTdHJpbmcgbmFtZSwgTG9jYWxlIGxvY2FsZSkgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIENsYXNzTG9hZGVyIGNsID0gbnVsbDsKLQotICAgICAgICBpZiAoY2FsbGVyICE9IG51bGwpIHsKLQotICAgICAgICAgICAgQ2xhc3MgYzsKLSAgICAgICAgICAgIGlmIChjYWxsZXIgaW5zdGFuY2VvZiBDbGFzcykgewotICAgICAgICAgICAgICAgIGMgPSAoQ2xhc3MpY2FsbGVyOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBjID0gY2FsbGVyLmdldENsYXNzKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEdldCB0aGUgYXBwcm9wcmlhdGUgY2xhc3MgbG9hZGVyCi0gICAgICAgICAgICBjbCA9IGMuZ2V0Q2xhc3NMb2FkZXIoKTsKLQotICAgICAgICAgICAgaWYgKG5hbWUuaW5kZXhPZigiLyIpID09IC0xKSB7Ci0KLSAgICAgICAgICAgICAgICAvLyBDcmVhdGUgdGhlIGZ1bGwgYmFzZW5hbWUgb25seSBpZiBub3QgZ2l2ZW4KLSAgICAgICAgICAgICAgICBTdHJpbmcgZnVsbE5hbWUgPSBjLmdldE5hbWUoKTsKLQotICAgICAgICAgICAgICAgIGludCBwb3MgPSBmdWxsTmFtZS5sYXN0SW5kZXhPZigiLiIpOwotICAgICAgICAgICAgICAgIGlmIChwb3MgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWUgPSBmdWxsTmFtZS5zdWJzdHJpbmcoMCwgcG9zICsgMSkucmVwbGFjZSgnLicsICcvJykgKyBuYW1lOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFRyeSB0aGUgc2hhcmVkIGRlZmF1bHQgcHJvcGVydGllcyBmaWxlLi4uCi0gICAgICAgICAgICBpZiAobmFtZS5pbmRleE9mKCIvIikgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICBuYW1lID0gIm9yZy9hcGFjaGUvYXhpczIvZGVmYXVsdC1yZXNvdXJjZSI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBMb2NhbGUgZGVmYXVsdExvY2FsZSA9IExvY2FsZS5nZXREZWZhdWx0KCk7Ci0KLSAgICAgICAgLy8gSWYgdGhlIGxvY2FsZSBnaXZlbiBpcyB0aGUgc2FtZSBhcyB0aGUgZGVmYXVsdCBsb2NhbGUsIGlnbm9yZSBpdAotICAgICAgICBpZiAobG9jYWxlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChsb2NhbGUuZXF1YWxzKGRlZmF1bHRMb2NhbGUpKSB7Ci0gICAgICAgICAgICAgICAgbG9jYWxlID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIExvYWQgdGhlIHByb3BlcnRpZXMuIElmIG5vIHByb3BlcnR5IGZpbGVzIGV4aXN0IHRoZW4gYQotICAgICAgICAvLyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gd2lsbCBiZSB0aHJvd24KLSAgICAgICAgbG9hZFByb3BlcnRpZXMobmFtZSwgY2wsIGxvY2FsZSwgZGVmYXVsdExvY2FsZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhIHN0cmluZyBtZXNzYWdlIGZyb20gdGhlIHJlc291cmNlIGJ1bmRsZSBmb3IgdGhlIGdpdmVuIGtleQotICAgICAqCi0gICAgICogQHBhcmFtIGtleSBUaGUgcmVzb3VyY2Uga2V5Ci0gICAgICogQHJldHVybiBUaGUgbWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZ2V0U3RyaW5nKGtleSwgKE9iamVjdFtdKW51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDxwPkdldHMgYSBzdHJpbmcgbWVzc2FnZSBmcm9tIHRoZSByZXNvdXJjZSBidW5kbGUgZm9yIHRoZSBnaXZlbiBrZXkuIFRoZSBtZXNzYWdlIG1heSBjb250YWluCi0gICAgICogdmFyaWFibGVzIHRoYXQgd2lsbCBiZSBzdWJzdGl0dXRlZCB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMuIFZhcmlhYmxlcyBoYXZlIHRoZSBmb3JtYXQ6PC9wPgotICAgICAqIDxkaXI+IFRoaXMgbWVzc2FnZSBoYXMgdHdvIHZhcmlhYmxlczogezB9IGFuZCB7MX0gPC9kaXI+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5ICBUaGUgcmVzb3VyY2Uga2V5Ci0gICAgICogQHBhcmFtIGFyZzAgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHswfQotICAgICAqIEByZXR1cm4gVGhlIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBPYmplY3QgYXJnMCkgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIE9iamVjdFtdIG8gPSBuZXcgT2JqZWN0WzFdOwotICAgICAgICBvWzBdID0gYXJnMDsKLSAgICAgICAgcmV0dXJuIGdldFN0cmluZyhrZXksIG8pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDxwPkdldHMgYSBzdHJpbmcgbWVzc2FnZSBmcm9tIHRoZSByZXNvdXJjZSBidW5kbGUgZm9yIHRoZSBnaXZlbiBrZXkuIFRoZSBtZXNzYWdlIG1heSBjb250YWluCi0gICAgICogdmFyaWFibGVzIHRoYXQgd2lsbCBiZSBzdWJzdGl0dXRlZCB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMuIFZhcmlhYmxlcyBoYXZlIHRoZSBmb3JtYXQ6PC9wPgotICAgICAqIDxkaXI+IFRoaXMgbWVzc2FnZSBoYXMgdHdvIHZhcmlhYmxlczogezB9IGFuZCB7MX0gPC9kaXI+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5ICBUaGUgcmVzb3VyY2Uga2V5Ci0gICAgICogQHBhcmFtIGFyZzAgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHswfQotICAgICAqIEBwYXJhbSBhcmcxIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7MX0KLSAgICAgKiBAcmV0dXJuIFRoZSBtZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSwgT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHsKLSAgICAgICAgT2JqZWN0W10gbyA9IG5ldyBPYmplY3RbMl07Ci0gICAgICAgIG9bMF0gPSBhcmcwOwotICAgICAgICBvWzFdID0gYXJnMTsKLSAgICAgICAgcmV0dXJuIGdldFN0cmluZyhrZXksIG8pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDxwPkdldHMgYSBzdHJpbmcgbWVzc2FnZSBmcm9tIHRoZSByZXNvdXJjZSBidW5kbGUgZm9yIHRoZSBnaXZlbiBrZXkuIFRoZSBtZXNzYWdlIG1heSBjb250YWluCi0gICAgICogdmFyaWFibGVzIHRoYXQgd2lsbCBiZSBzdWJzdGl0dXRlZCB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMuIFZhcmlhYmxlcyBoYXZlIHRoZSBmb3JtYXQ6PC9wPgotICAgICAqIDxkaXI+IFRoaXMgbWVzc2FnZSBoYXMgdHdvIHZhcmlhYmxlczogezB9IGFuZCB7MX0gPC9kaXI+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5ICBUaGUgcmVzb3VyY2Uga2V5Ci0gICAgICogQHBhcmFtIGFyZzAgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHswfQotICAgICAqIEBwYXJhbSBhcmcxIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7MX0KLSAgICAgKiBAcGFyYW0gYXJnMiBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezF9Ci0gICAgICogQHJldHVybiBUaGUgbWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSwgT2JqZWN0IGFyZzIpCi0gICAgICAgICAgICB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHsKLSAgICAgICAgT2JqZWN0W10gbyA9IG5ldyBPYmplY3RbM107Ci0gICAgICAgIG9bMF0gPSBhcmcwOwotICAgICAgICBvWzFdID0gYXJnMTsKLSAgICAgICAgb1syXSA9IGFyZzI7Ci0gICAgICAgIHJldHVybiBnZXRTdHJpbmcoa2V5LCBvKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8cD5HZXRzIGEgc3RyaW5nIG1lc3NhZ2UgZnJvbSB0aGUgcmVzb3VyY2UgYnVuZGxlIGZvciB0aGUgZ2l2ZW4ga2V5LiBUaGUgbWVzc2FnZSBtYXkgY29udGFpbgotICAgICAqIHZhcmlhYmxlcyB0aGF0IHdpbGwgYmUgc3Vic3RpdHV0ZWQgd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzLiBWYXJpYWJsZXMgaGF2ZSB0aGUgZm9ybWF0OjwvcD4KLSAgICAgKiA8ZGlyPiBUaGlzIG1lc3NhZ2UgaGFzIHR3byB2YXJpYWJsZXM6IHswfSBhbmQgezF9IDwvZGlyPgotICAgICAqCi0gICAgICogQHBhcmFtIGtleSAgIFRoZSByZXNvdXJjZSBrZXkKLSAgICAgKiBAcGFyYW0gYXJyYXkgQW4gYXJyYXkgb2Ygb2JqZWN0cyB0byBwbGFjZSBpbiBjb3JyZXNwb25kaW5nIHZhcmlhYmxlcwotICAgICAqIEByZXR1cm4gVGhlIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBPYmplY3RbXSBhcnJheSkgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBtc2cgPSBudWxsOwotICAgICAgICBpZiAocmVzb3VyY2VQcm9wZXJ0aWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1zZyA9IHJlc291cmNlUHJvcGVydGllcy5nZXRQcm9wZXJ0eShrZXkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1zZyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uKCJDYW5ub3QgZmluZCByZXNvdXJjZSBrZXkgXCIiICsga2V5ICsKLSAgICAgICAgICAgICAgICAgICAgIlwiIGluIGJhc2UgbmFtZSAiICsgYmFzZVByb3BlcnR5RmlsZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VQcm9wZXJ0eUZpbGVOYW1lLCBrZXkpOwotICAgICAgICB9Ci0KLSAgICAgICAgbXNnID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQobXNnLCBhcnJheSk7Ci0gICAgICAgIHJldHVybiBtc2c7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgbG9hZFByb3BlcnRpZXMoU3RyaW5nIGJhc2VuYW1lLCBDbGFzc0xvYWRlciBsb2FkZXIsIExvY2FsZSBsb2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxlIGRlZmF1bHRMb2NhbGUpCi0gICAgICAgICAgICB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gQ2hlY2sgdGhlIGNhY2hlIGZpcnN0Ci0gICAgICAgIFN0cmluZyBsb2FkZXJOYW1lID0gIiI7Ci0gICAgICAgIGlmIChsb2FkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbG9hZGVyTmFtZSA9ICI6IiArIGxvYWRlci5oYXNoQ29kZSgpOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZyBjYWNoZUtleSA9IGJhc2VuYW1lICsgIjoiICsgbG9jYWxlICsgIjoiICsgZGVmYXVsdExvY2FsZSArIGxvYWRlck5hbWU7Ci0gICAgICAgIFByb3BlcnRpZXMgcCA9IChQcm9wZXJ0aWVzKXByb3BlcnR5Q2FjaGUuZ2V0KGNhY2hlS2V5KTsKLSAgICAgICAgYmFzZVByb3BlcnR5RmlsZU5hbWUgPSBiYXNlbmFtZSArIFBST1BFUlRZX0VYVDsKLQotICAgICAgICBpZiAocCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBUaGUgcHJvcGVydGllcyB3ZXJlIG5vdCBmb3VuZCBpbiB0aGUgY2FjaGUuIFNlYXJjaCB0aGUgZ2l2ZW4gbG9jYWxlCi0gICAgICAgICAgICAvLyBmaXJzdAotICAgICAgICAgICAgaWYgKGxvY2FsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcCA9IGxvYWRQcm9wZXJ0aWVzKGJhc2VuYW1lLCBsb2FkZXIsIGxvY2FsZSwgcCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFNlYXJjaCB0aGUgZGVmYXVsdCBsb2NhbGUKLSAgICAgICAgICAgIGlmIChkZWZhdWx0TG9jYWxlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBwID0gbG9hZFByb3BlcnRpZXMoYmFzZW5hbWUsIGxvYWRlciwgZGVmYXVsdExvY2FsZSwgcCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFNlYXJjaCBmb3IgdGhlIGJhc2VuYW1lCi0gICAgICAgICAgICBwID0gbWVyZ2UocCwgbG9hZFByb3BlcnRpZXMoYmFzZVByb3BlcnR5RmlsZU5hbWUsIGxvYWRlcikpOwotCi0gICAgICAgICAgICBpZiAocCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbigiQ2Fubm90IGZpbmQgcmVzb3VyY2UgZm9yIGJhc2UgbmFtZSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VQcm9wZXJ0eUZpbGVOYW1lLCBiYXNlUHJvcGVydHlGaWxlTmFtZSwgIiIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBDYWNoZSB0aGUgcHJvcGVydGllcwotICAgICAgICAgICAgcHJvcGVydHlDYWNoZS5wdXQoY2FjaGVLZXksIHApOwotCi0gICAgICAgIH0KLQotICAgICAgICByZXNvdXJjZVByb3BlcnRpZXMgPSBwOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBQcm9wZXJ0aWVzIGxvYWRQcm9wZXJ0aWVzKFN0cmluZyBiYXNlbmFtZSwgQ2xhc3NMb2FkZXIgbG9hZGVyLCBMb2NhbGUgbG9jYWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnRpZXMgcHJvcHMpIHsKLQotICAgICAgICBTdHJpbmcgbGFuZ3VhZ2UgPSBsb2NhbGUuZ2V0TGFuZ3VhZ2UoKTsKLSAgICAgICAgU3RyaW5nIGNvdW50cnkgPSBsb2NhbGUuZ2V0Q291bnRyeSgpOwotICAgICAgICBTdHJpbmcgdmFyaWFudCA9IGxvY2FsZS5nZXRWYXJpYW50KCk7Ci0gICAgICAgIGlmICh2YXJpYW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmICh2YXJpYW50LnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgdmFyaWFudCA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobGFuZ3VhZ2UgIT0gbnVsbCkgewotCi0gICAgICAgICAgICBpZiAoY291bnRyeSAhPSBudWxsKSB7Ci0KLSAgICAgICAgICAgICAgICBpZiAodmFyaWFudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByb3BzID0gbWVyZ2UocHJvcHMsIGxvYWRQcm9wZXJ0aWVzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VuYW1lICsgIl8iICsgbGFuZ3VhZ2UgKyAiXyIgKyBjb3VudHJ5ICsgIl8iICsgdmFyaWFudCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9QRVJUWV9FWFQsIGxvYWRlcikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwcm9wcyA9IG1lcmdlKHByb3BzLCBsb2FkUHJvcGVydGllcyhiYXNlbmFtZSArICJfIiArIGxhbmd1YWdlICsgIl8iICsgY291bnRyeSArCi0gICAgICAgICAgICAgICAgICAgICAgICBQUk9QRVJUWV9FWFQsIGxvYWRlcikpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHJvcHMgPSBtZXJnZShwcm9wcywgbG9hZFByb3BlcnRpZXMoYmFzZW5hbWUgKyAiXyIgKyBsYW5ndWFnZSArIFBST1BFUlRZX0VYVCwgbG9hZGVyKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHByb3BzOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBQcm9wZXJ0aWVzIGxvYWRQcm9wZXJ0aWVzKFN0cmluZyByZXNuYW1lLCBDbGFzc0xvYWRlciBsb2FkZXIpIHsKLSAgICAgICAgUHJvcGVydGllcyBwcm9wcyA9IG51bGw7Ci0KLSAgICAgICAgLy8gQXR0ZW1wdCB0byBvcGVuIGFuZCBsb2FkIHRoZSBwcm9wZXJ0aWVzCi0gICAgICAgIElucHV0U3RyZWFtIGluID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChsb2FkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGluID0gbG9hZGVyLmdldFJlc291cmNlQXNTdHJlYW0ocmVzbmFtZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEVpdGhlciB3ZSdyZSB1c2luZyB0aGUgc3lzdGVtIGNsYXNzIGxvYWRlciBvciB3ZSBkaWRuJ3QgZmluZCB0aGUKLSAgICAgICAgICAgIC8vIHJlc291cmNlIHVzaW5nIHRoZSBnaXZlbiBjbGFzcyBsb2FkZXIKLSAgICAgICAgICAgIGlmIChpbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaW4gPSBDbGFzc0xvYWRlci5nZXRTeXN0ZW1SZXNvdXJjZUFzU3RyZWFtKHJlc25hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGluICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgcHJvcHMubG9hZChpbik7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gT24gZXJyb3IsIGNsZWFyIHRoZSBwcm9wcwotICAgICAgICAgICAgICAgICAgICBwcm9wcyA9IG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKGluICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBpbi5jbG9zZSgpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUgZXJyb3Igb24gY2xvc2UKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHByb3BzOwotICAgIH0KLQotICAgIC8qKiBNZXJnZSB0d28gUHJvcGVydGllcyBvYmplY3RzICovCi0gICAgcHJvdGVjdGVkIFByb3BlcnRpZXMgbWVyZ2UoUHJvcGVydGllcyBwMSwgUHJvcGVydGllcyBwMikgewotICAgICAgICBpZiAoKHAxID09IG51bGwpICYmCi0gICAgICAgICAgICAgICAgKHAyID09IG51bGwpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfSBlbHNlIGlmIChwMSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gcDI7Ci0gICAgICAgIH0gZWxzZSBpZiAocDIgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHAxOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTm93IG1lcmdlLiBwMSB0YWtlcyBwcmVjZWRlbmNlCi0gICAgICAgIEVudW1lcmF0aW9uIGVudW1lcmF0aW9uID0gcDIua2V5cygpOwotICAgICAgICB3aGlsZSAoZW51bWVyYXRpb24uaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgIFN0cmluZyBrZXkgPSAoU3RyaW5nKWVudW1lcmF0aW9uLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICBpZiAocDEuZ2V0UHJvcGVydHkoa2V5KSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcDEucHV0KGtleSwgcDIuZ2V0UHJvcGVydHkoa2V5KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcDE7Ci0gICAgfQotCi0gICAgLyoqIEdldCB0aGUgdW5kZXJseWluZyBwcm9wZXJ0aWVzICovCi0gICAgcHVibGljIFByb3BlcnRpZXMgZ2V0UHJvcGVydGllcygpIHsKLSAgICAgICAgcmV0dXJuIHJlc291cmNlUHJvcGVydGllczsKLSAgICB9Ci0KLSAgICAvLyBTVEFUSUMgQUNDRVNTT1JTCi0KLSAgICAvKioKLSAgICAgKiBHZXQgYSBtZXNzYWdlIGZyb20gcmVzb3VyY2UucHJvcGVydGllcyBmcm9tIHRoZSBwYWNrYWdlIG9mIHRoZSBnaXZlbiBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2FsbGVyIFRoZSBjYWxsaW5nIG9iamVjdCwgdXNlZCB0byBnZXQgdGhlIHBhY2thZ2UgbmFtZSBhbmQgY2xhc3MgbG9hZGVyCi0gICAgICogQHBhcmFtIGtleSAgICBUaGUgcmVzb3VyY2Uga2V5Ci0gICAgICogQHJldHVybiBUaGUgZm9ybWF0dGVkIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoT2JqZWN0IGNhbGxlciwgU3RyaW5nIGtleSkKLSAgICAgICAgICAgIHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZ2V0TWVzc2FnZShjYWxsZXIsIEJBU0VfTkFNRSwgbnVsbCwga2V5LCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYSBtZXNzYWdlIGZyb20gcmVzb3VyY2UucHJvcGVydGllcyBmcm9tIHRoZSBwYWNrYWdlIG9mIHRoZSBnaXZlbiBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2FsbGVyIFRoZSBjYWxsaW5nIG9iamVjdCwgdXNlZCB0byBnZXQgdGhlIHBhY2thZ2UgbmFtZSBhbmQgY2xhc3MgbG9hZGVyCi0gICAgICogQHBhcmFtIGtleSAgICBUaGUgcmVzb3VyY2Uga2V5Ci0gICAgICogQHBhcmFtIGFyZzAgICBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezB9Ci0gICAgICogQHJldHVybiBUaGUgZm9ybWF0dGVkIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoT2JqZWN0IGNhbGxlciwgU3RyaW5nIGtleSwgT2JqZWN0IGFyZzApCi0gICAgICAgICAgICB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHsKLSAgICAgICAgT2JqZWN0W10gbyA9IG5ldyBPYmplY3RbMV07Ci0gICAgICAgIG9bMF0gPSBhcmcwOwotICAgICAgICByZXR1cm4gZ2V0TWVzc2FnZShjYWxsZXIsIEJBU0VfTkFNRSwgbnVsbCwga2V5LCBvKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYSBtZXNzYWdlIGZyb20gcmVzb3VyY2UucHJvcGVydGllcyBmcm9tIHRoZSBwYWNrYWdlIG9mIHRoZSBnaXZlbiBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2FsbGVyIFRoZSBjYWxsaW5nIG9iamVjdCwgdXNlZCB0byBnZXQgdGhlIHBhY2thZ2UgbmFtZSBhbmQgY2xhc3MgbG9hZGVyCi0gICAgICogQHBhcmFtIGtleSAgICBUaGUgcmVzb3VyY2Uga2V5Ci0gICAgICogQHBhcmFtIGFyZzAgICBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezB9Ci0gICAgICogQHBhcmFtIGFyZzEgICBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezF9Ci0gICAgICogQHJldHVybiBUaGUgZm9ybWF0dGVkIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoT2JqZWN0IGNhbGxlciwgU3RyaW5nIGtleSwgT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKQotICAgICAgICAgICAgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIE9iamVjdFtdIG8gPSBuZXcgT2JqZWN0WzJdOwotICAgICAgICBvWzBdID0gYXJnMDsKLSAgICAgICAgb1sxXSA9IGFyZzE7Ci0gICAgICAgIHJldHVybiBnZXRNZXNzYWdlKGNhbGxlciwgQkFTRV9OQU1FLCBudWxsLCBrZXksIG8pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBhIG1lc3NhZ2UgZnJvbSByZXNvdXJjZS5wcm9wZXJ0aWVzIGZyb20gdGhlIHBhY2thZ2Ugb2YgdGhlIGdpdmVuIG9iamVjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjYWxsZXIgVGhlIGNhbGxpbmcgb2JqZWN0LCB1c2VkIHRvIGdldCB0aGUgcGFja2FnZSBuYW1lIGFuZCBjbGFzcyBsb2FkZXIKLSAgICAgKiBAcGFyYW0ga2V5ICAgIFRoZSByZXNvdXJjZSBrZXkKLSAgICAgKiBAcGFyYW0gYXJnMCAgIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7MH0KLSAgICAgKiBAcGFyYW0gYXJnMSAgIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7MX0KLSAgICAgKiBAcGFyYW0gYXJnMiAgIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7Mn0KLSAgICAgKiBAcmV0dXJuIFRoZSBmb3JtYXR0ZWQgbWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhPYmplY3QgY2FsbGVyLCBTdHJpbmcga2V5LCBPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEsIE9iamVjdCBhcmcyKQotICAgICAgICAgICAgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIE9iamVjdFtdIG8gPSBuZXcgT2JqZWN0WzNdOwotICAgICAgICBvWzBdID0gYXJnMDsKLSAgICAgICAgb1sxXSA9IGFyZzE7Ci0gICAgICAgIG9bMl0gPSBhcmcyOwotICAgICAgICByZXR1cm4gZ2V0TWVzc2FnZShjYWxsZXIsIEJBU0VfTkFNRSwgbnVsbCwga2V5LCBvKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYSBtZXNzYWdlIGZyb20gcmVzb3VyY2UucHJvcGVydGllcyBmcm9tIHRoZSBwYWNrYWdlIG9mIHRoZSBnaXZlbiBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2FsbGVyIFRoZSBjYWxsaW5nIG9iamVjdCwgdXNlZCB0byBnZXQgdGhlIHBhY2thZ2UgbmFtZSBhbmQgY2xhc3MgbG9hZGVyCi0gICAgICogQHBhcmFtIGtleSAgICBUaGUgcmVzb3VyY2Uga2V5Ci0gICAgICogQHBhcmFtIGFyZzAgICBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezB9Ci0gICAgICogQHBhcmFtIGFyZzEgICBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezF9Ci0gICAgICogQHBhcmFtIGFyZzIgICBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezJ9Ci0gICAgICogQHBhcmFtIGFyZzMgICBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezN9Ci0gICAgICogQHJldHVybiBUaGUgZm9ybWF0dGVkIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoT2JqZWN0IGNhbGxlciwgU3RyaW5nIGtleSwgT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxLCBPYmplY3QgYXJnMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGFyZzMpCi0gICAgICAgICAgICB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHsKLSAgICAgICAgT2JqZWN0W10gbyA9IG5ldyBPYmplY3RbNF07Ci0gICAgICAgIG9bMF0gPSBhcmcwOwotICAgICAgICBvWzFdID0gYXJnMTsKLSAgICAgICAgb1syXSA9IGFyZzI7Ci0gICAgICAgIG9bM10gPSBhcmczOwotICAgICAgICByZXR1cm4gZ2V0TWVzc2FnZShjYWxsZXIsIEJBU0VfTkFNRSwgbnVsbCwga2V5LCBvKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIEdldCBhIG1lc3NhZ2UgZnJvbSByZXNvdXJjZS5wcm9wZXJ0aWVzIGZyb20gdGhlIHBhY2thZ2Ugb2YgdGhlIGdpdmVuIG9iamVjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjYWxsZXIgVGhlIGNhbGxpbmcgb2JqZWN0LCB1c2VkIHRvIGdldCB0aGUgcGFja2FnZSBuYW1lIGFuZCBjbGFzcyBsb2FkZXIKLSAgICAgKiBAcGFyYW0ga2V5ICAgIFRoZSByZXNvdXJjZSBrZXkKLSAgICAgKiBAcGFyYW0gYXJnMCAgIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7MH0KLSAgICAgKiBAcGFyYW0gYXJnMSAgIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7MX0KLSAgICAgKiBAcGFyYW0gYXJnMiAgIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7Mn0KLSAgICAgKiBAcGFyYW0gYXJnMyAgIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7M30KLSAgICAgKiBAcGFyYW0gYXJnNCAgIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7NH0KLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGZvcm1hdHRlZCBtZXNzYWdlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhPYmplY3QgY2FsbGVyLCBTdHJpbmcga2V5LCBPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEsIE9iamVjdCBhcmcyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgYXJnMywgT2JqZWN0IGFyZzQpCi0gICAgICAgICAgICB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHsKLSAgICAgICAgT2JqZWN0W10gbyA9IG5ldyBPYmplY3RbNV07Ci0gICAgICAgIG9bMF0gPSBhcmcwOwotICAgICAgICBvWzFdID0gYXJnMTsKLSAgICAgICAgb1syXSA9IGFyZzI7Ci0gICAgICAgIG9bM10gPSBhcmczOwotICAgICAgICBvWzRdID0gYXJnNDsKLSAgICAgICAgcmV0dXJuIGdldE1lc3NhZ2UoY2FsbGVyLCBCQVNFX05BTUUsIG51bGwsIGtleSwgbyk7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBHZXQgYSBtZXNzYWdlIGZyb20gcmVzb3VyY2UucHJvcGVydGllcyBmcm9tIHRoZSBwYWNrYWdlIG9mIHRoZSBnaXZlbiBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2FsbGVyIFRoZSBjYWxsaW5nIG9iamVjdCwgdXNlZCB0byBnZXQgdGhlIHBhY2thZ2UgbmFtZSBhbmQgY2xhc3MgbG9hZGVyCi0gICAgICogQHBhcmFtIGtleSAgICBUaGUgcmVzb3VyY2Uga2V5Ci0gICAgICogQHBhcmFtIGFyZ3MgICBBbiBhcnJheSBvZiBvYmplY3RzIHRvIHBsYWNlIGluIGNvcnJlc3BvbmRpbmcgdmFyaWFibGVzCi0gICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBmb3JtYXR0ZWQgbWVzc2FnZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoT2JqZWN0IGNhbGxlciwgU3RyaW5nIGtleSwgT2JqZWN0W10gYXJncykKLSAgICAgICAgICAgIHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZ2V0TWVzc2FnZShjYWxsZXIsIEJBU0VfTkFNRSwgbnVsbCwga2V5LCBhcmdzKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIEdldCBhIG1lc3NhZ2UgZnJvbSByZXNvdXJjZS5wcm9wZXJ0aWVzIGZyb20gdGhlIHBhY2thZ2Ugb2YgdGhlIGdpdmVuIG9iamVjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjYWxsZXIgVGhlIGNhbGxpbmcgb2JqZWN0LCB1c2VkIHRvIGdldCB0aGUgcGFja2FnZSBuYW1lIGFuZCBjbGFzcyBsb2FkZXIKLSAgICAgKiBAcGFyYW0gbG9jYWxlIFRoZSBsb2NhbGUKLSAgICAgKiBAcGFyYW0ga2V5ICAgIFRoZSByZXNvdXJjZSBrZXkKLSAgICAgKiBAcmV0dXJuIFRoZSBmb3JtYXR0ZWQgbWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhPYmplY3QgY2FsbGVyLCBMb2NhbGUgbG9jYWxlLCBTdHJpbmcga2V5KQotICAgICAgICAgICAgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBnZXRNZXNzYWdlKGNhbGxlciwgQkFTRV9OQU1FLCBsb2NhbGUsIGtleSwgbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGEgbWVzc2FnZSBmcm9tIHJlc291cmNlLnByb3BlcnRpZXMgZnJvbSB0aGUgcGFja2FnZSBvZiB0aGUgZ2l2ZW4gb2JqZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIGNhbGxlciBUaGUgY2FsbGluZyBvYmplY3QsIHVzZWQgdG8gZ2V0IHRoZSBwYWNrYWdlIG5hbWUgYW5kIGNsYXNzIGxvYWRlcgotICAgICAqIEBwYXJhbSBsb2NhbGUgVGhlIGxvY2FsZQotICAgICAqIEBwYXJhbSBrZXkgICAgVGhlIHJlc291cmNlIGtleQotICAgICAqIEBwYXJhbSBhcmcwICAgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHswfQotICAgICAqIEByZXR1cm4gVGhlIGZvcm1hdHRlZCBtZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKE9iamVjdCBjYWxsZXIsIExvY2FsZSBsb2NhbGUsIFN0cmluZyBrZXksIE9iamVjdCBhcmcwKQotICAgICAgICAgICAgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIE9iamVjdFtdIG8gPSBuZXcgT2JqZWN0WzFdOwotICAgICAgICBvWzBdID0gYXJnMDsKLSAgICAgICAgcmV0dXJuIGdldE1lc3NhZ2UoY2FsbGVyLCBCQVNFX05BTUUsIGxvY2FsZSwga2V5LCBvKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYSBtZXNzYWdlIGZyb20gcmVzb3VyY2UucHJvcGVydGllcyBmcm9tIHRoZSBwYWNrYWdlIG9mIHRoZSBnaXZlbiBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2FsbGVyIFRoZSBjYWxsaW5nIG9iamVjdCwgdXNlZCB0byBnZXQgdGhlIHBhY2thZ2UgbmFtZSBhbmQgY2xhc3MgbG9hZGVyCi0gICAgICogQHBhcmFtIGxvY2FsZSBUaGUgbG9jYWxlCi0gICAgICogQHBhcmFtIGtleSAgICBUaGUgcmVzb3VyY2Uga2V5Ci0gICAgICogQHBhcmFtIGFyZzAgICBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezB9Ci0gICAgICogQHBhcmFtIGFyZzEgICBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezF9Ci0gICAgICogQHJldHVybiBUaGUgZm9ybWF0dGVkIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoT2JqZWN0IGNhbGxlciwgTG9jYWxlIGxvY2FsZSwgU3RyaW5nIGtleSwgT2JqZWN0IGFyZzAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBhcmcxKQotICAgICAgICAgICAgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIE9iamVjdFtdIG8gPSBuZXcgT2JqZWN0WzJdOwotICAgICAgICBvWzBdID0gYXJnMDsKLSAgICAgICAgb1sxXSA9IGFyZzE7Ci0gICAgICAgIHJldHVybiBnZXRNZXNzYWdlKGNhbGxlciwgQkFTRV9OQU1FLCBsb2NhbGUsIGtleSwgbyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGEgbWVzc2FnZSBmcm9tIHJlc291cmNlLnByb3BlcnRpZXMgZnJvbSB0aGUgcGFja2FnZSBvZiB0aGUgZ2l2ZW4gb2JqZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIGNhbGxlciBUaGUgY2FsbGluZyBvYmplY3QsIHVzZWQgdG8gZ2V0IHRoZSBwYWNrYWdlIG5hbWUgYW5kIGNsYXNzIGxvYWRlcgotICAgICAqIEBwYXJhbSBsb2NhbGUgVGhlIGxvY2FsZQotICAgICAqIEBwYXJhbSBrZXkgICAgVGhlIHJlc291cmNlIGtleQotICAgICAqIEBwYXJhbSBhcmcwICAgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHswfQotICAgICAqIEBwYXJhbSBhcmcxICAgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHsxfQotICAgICAqIEBwYXJhbSBhcmcyICAgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHsyfQotICAgICAqIEByZXR1cm4gVGhlIGZvcm1hdHRlZCBtZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKE9iamVjdCBjYWxsZXIsIExvY2FsZSBsb2NhbGUsIFN0cmluZyBrZXksIE9iamVjdCBhcmcwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgYXJnMSwgT2JqZWN0IGFyZzIpCi0gICAgICAgICAgICB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHsKLSAgICAgICAgT2JqZWN0W10gbyA9IG5ldyBPYmplY3RbM107Ci0gICAgICAgIG9bMF0gPSBhcmcwOwotICAgICAgICBvWzFdID0gYXJnMTsKLSAgICAgICAgb1syXSA9IGFyZzI7Ci0gICAgICAgIHJldHVybiBnZXRNZXNzYWdlKGNhbGxlciwgQkFTRV9OQU1FLCBsb2NhbGUsIGtleSwgbyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGEgbWVzc2FnZSBmcm9tIHJlc291cmNlLnByb3BlcnRpZXMgZnJvbSB0aGUgcGFja2FnZSBvZiB0aGUgZ2l2ZW4gb2JqZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIGNhbGxlciBUaGUgY2FsbGluZyBvYmplY3QsIHVzZWQgdG8gZ2V0IHRoZSBwYWNrYWdlIG5hbWUgYW5kIGNsYXNzIGxvYWRlcgotICAgICAqIEBwYXJhbSBsb2NhbGUgVGhlIGxvY2FsZQotICAgICAqIEBwYXJhbSBrZXkgICAgVGhlIHJlc291cmNlIGtleQotICAgICAqIEBwYXJhbSBhcmcwICAgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHswfQotICAgICAqIEBwYXJhbSBhcmcxICAgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHsxfQotICAgICAqIEBwYXJhbSBhcmcyICAgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHsyfQotICAgICAqIEBwYXJhbSBhcmczICAgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHszfQotICAgICAqIEByZXR1cm4gVGhlIGZvcm1hdHRlZCBtZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKE9iamVjdCBjYWxsZXIsIExvY2FsZSBsb2NhbGUsIFN0cmluZyBrZXksIE9iamVjdCBhcmcwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgYXJnMSwgT2JqZWN0IGFyZzIsIE9iamVjdCBhcmczKQotICAgICAgICAgICAgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIE9iamVjdFtdIG8gPSBuZXcgT2JqZWN0WzRdOwotICAgICAgICBvWzBdID0gYXJnMDsKLSAgICAgICAgb1sxXSA9IGFyZzE7Ci0gICAgICAgIG9bMl0gPSBhcmcyOwotICAgICAgICBvWzNdID0gYXJnMzsKLSAgICAgICAgcmV0dXJuIGdldE1lc3NhZ2UoY2FsbGVyLCBCQVNFX05BTUUsIGxvY2FsZSwga2V5LCBvKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYSBtZXNzYWdlIGZyb20gcmVzb3VyY2UucHJvcGVydGllcyBmcm9tIHRoZSBwYWNrYWdlIG9mIHRoZSBnaXZlbiBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2FsbGVyIFRoZSBjYWxsaW5nIG9iamVjdCwgdXNlZCB0byBnZXQgdGhlIHBhY2thZ2UgbmFtZSBhbmQgY2xhc3MgbG9hZGVyCi0gICAgICogQHBhcmFtIGxvY2FsZSBUaGUgbG9jYWxlCi0gICAgICogQHBhcmFtIGtleSAgICBUaGUgcmVzb3VyY2Uga2V5Ci0gICAgICogQHBhcmFtIGFyZzAgICBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezB9Ci0gICAgICogQHBhcmFtIGFyZzEgICBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezF9Ci0gICAgICogQHBhcmFtIGFyZzIgICBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezJ9Ci0gICAgICogQHBhcmFtIGFyZzMgICBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezN9Ci0gICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBmb3JtYXR0ZWQgbWVzc2FnZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoT2JqZWN0IGNhbGxlciwgTG9jYWxlIGxvY2FsZSwgU3RyaW5nIGtleSwgT2JqZWN0IGFyZzAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBhcmcxLCBPYmplY3QgYXJnMiwgT2JqZWN0IGFyZzMsIE9iamVjdCBhcmc0KQotICAgICAgICAgICAgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIE9iamVjdFtdIG8gPSBuZXcgT2JqZWN0WzVdOwotICAgICAgICBvWzBdID0gYXJnMDsKLSAgICAgICAgb1sxXSA9IGFyZzE7Ci0gICAgICAgIG9bMl0gPSBhcmcyOwotICAgICAgICBvWzNdID0gYXJnMzsKLSAgICAgICAgb1s0XSA9IGFyZzQ7Ci0gICAgICAgIHJldHVybiBnZXRNZXNzYWdlKGNhbGxlciwgQkFTRV9OQU1FLCBsb2NhbGUsIGtleSwgbyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGEgbWVzc2FnZSBmcm9tIHJlc291cmNlLnByb3BlcnRpZXMgZnJvbSB0aGUgcGFja2FnZSBvZiB0aGUgZ2l2ZW4gb2JqZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIGNhbGxlciBUaGUgY2FsbGluZyBvYmplY3QsIHVzZWQgdG8gZ2V0IHRoZSBwYWNrYWdlIG5hbWUgYW5kIGNsYXNzIGxvYWRlcgotICAgICAqIEBwYXJhbSBsb2NhbGUgVGhlIGxvY2FsZQotICAgICAqIEBwYXJhbSBrZXkgICAgVGhlIHJlc291cmNlIGtleQotICAgICAqIEBwYXJhbSBhcmdzICAgQW4gYXJyYXkgb2Ygb2JqZWN0cyB0byBwbGFjZSBpbiBjb3JyZXNwb25kaW5nIHZhcmlhYmxlcwotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgZm9ybWF0dGVkIG1lc3NhZ2UuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKE9iamVjdCBjYWxsZXIsIExvY2FsZSBsb2NhbGUsIFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3MpCi0gICAgICAgICAgICB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGdldE1lc3NhZ2UoY2FsbGVyLCBCQVNFX05BTUUsIGxvY2FsZSwga2V5LCBhcmdzKTsKLSAgICB9Ci0KLSAgICAvLyBXb3JraG9yc2UgdGhhdCBkb2VzIHRoZSByZXNvdXJjZSBsb2FkaW5nIGFuZCBrZXkgbG9va3VwCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZShPYmplY3QgY2FsbGVyLCBTdHJpbmcgYmFzZW5hbWUsIExvY2FsZSBsb2NhbGUsIFN0cmluZyBrZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RbXSBhcmdzKQotICAgICAgICAgICAgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBtc2cgPSBudWxsOwotICAgICAgICBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZmlyc3RFeCA9IG51bGw7Ci0gICAgICAgIFN0cmluZyBmdWxsTmFtZSA9IG51bGw7Ci0gICAgICAgIENsYXNzIGN1ckNsYXNzID0gbnVsbDsKLSAgICAgICAgYm9vbGVhbiBkaWROdWxsID0gZmFsc2U7Ci0KLSAgICAgICAgaWYgKGNhbGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoY2FsbGVyIGluc3RhbmNlb2YgQ2xhc3MpCi0gICAgICAgICAgICAgICAgY3VyQ2xhc3MgPSAoQ2xhc3MpY2FsbGVyOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGN1ckNsYXNzID0gY2FsbGVyLmdldENsYXNzKCk7Ci0gICAgICAgIH0KLQotICAgICAgICB3aGlsZSAobXNnID09IG51bGwpIHsKLQotICAgICAgICAgICAgLy8gR2V0IHRoZSBmdWxsIG5hbWUgb2YgdGhlIHJlc291cmNlCi0gICAgICAgICAgICBpZiAoY3VyQ2xhc3MgIT0gbnVsbCkgewotCi0gICAgICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBmdWxsIGJhc2VuYW1lCi0gICAgICAgICAgICAgICAgU3RyaW5nIHBrZ05hbWUgPSBjdXJDbGFzcy5nZXROYW1lKCk7Ci0KLSAgICAgICAgICAgICAgICBpbnQgcG9zID0gcGtnTmFtZS5sYXN0SW5kZXhPZigiLiIpOwotICAgICAgICAgICAgICAgIGlmIChwb3MgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZ1bGxOYW1lID0gcGtnTmFtZS5zdWJzdHJpbmcoMCwgcG9zICsgMSkucmVwbGFjZSgnLicsICcvJykgKyBiYXNlbmFtZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBmdWxsTmFtZSA9IGJhc2VuYW1lOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZnVsbE5hbWUgPSBiYXNlbmFtZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBSQiByYiA9IG5ldyBSQihjYWxsZXIsIGZ1bGxOYW1lLCBsb2NhbGUpOwotICAgICAgICAgICAgICAgIG1zZyA9IHJiLmdldFN0cmluZyhrZXksIGFyZ3MpOwotICAgICAgICAgICAgfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGN1ckNsYXNzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXg7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gU2F2ZSB0aGUgZmlyc3QgZXhjZXB0aW9uCi0gICAgICAgICAgICAgICAgaWYgKGZpcnN0RXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBmaXJzdEV4ID0gZXg7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBzdXBlcmNsYXNzCi0gICAgICAgICAgICAgICAgY3VyQ2xhc3MgPSBjdXJDbGFzcy5nZXRTdXBlcmNsYXNzKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGN1ckNsYXNzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGRpZE51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBmaXJzdEV4OwotICAgICAgICAgICAgICAgICAgICBkaWROdWxsID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgY2FsbGVyID0gbnVsbDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY25hbWUgPSBjdXJDbGFzcy5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjbmFtZS5zdGFydHNXaXRoKCJqYXZhLiIpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY25hbWUuc3RhcnRzV2l0aCgiamF2YXguIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaWROdWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGZpcnN0RXg7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkaWROdWxsID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxlciA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjdXJDbGFzcyA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbXNnOwotICAgIH0KLQotICAgIC8qKiBDbGVhcnMgdGhlIGludGVybmFsIGNhY2hlLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjbGVhckNhY2hlKCkgewotICAgICAgICBwcm9wZXJ0eUNhY2hlLmNsZWFyKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvaTE4bi9yZXNvdXJjZS5wcm9wZXJ0aWVzIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvaTE4bi9yZXNvdXJjZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2E2YzA5Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2kxOG4vcmVzb3VyY2UucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM0OSArMCwwIEBACi0jCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLQotIyBUcmFuc2xhdGlvbiBpbnN0cnVjdGlvbnMuCi0jIDEuICBFYWNoIG1lc3NhZ2UgbGluZSBpcyBvZiB0aGUgZm9ybSBrZXk9dmFsdWUuCi0jICAgICBUcmFuc2xhdGUgdGhlIHZhbHVlLCBETyBOT1QgdHJhbnNsYXRlIHRoZSBrZXkuCi0jIDIuICBUaGUgbWVzc2FnZXMgbWF5IGNvbnRhaW4gYXJndW1lbnRzIHRoYXQgd2lsbCBiZSBmaWxsZWQgaW4KLSMgICAgIGJ5IHRoZSBydW50aW1lLiAgVGhlc2UgYXJlIG9mIHRoZSBmb3JtOiB7MH0sIHsxfSwgZXRjLgotIyAgICAgVGhlc2UgbXVzdCBhcHBlYXIgYXMgaXMgaW4gdGhlIG1lc3NhZ2UsIHRob3VnaCB0aGUgb3JkZXIKLSMgICAgIG1heSBiZSBjaGFuZ2VkIHRvIHN1cHBvcnQgcHJvcGVyIGxhbmd1YWdlIHN5bnRheC4KLSMgMy4gIElmIGEgc2luZ2xlIHF1b3RlIGNoYXJhY3RlciBpcyB0byBhcHBlYXIgaW4gdGhlIHJlc3VsdGluZwotIyAgICAgbWVzc2FnZSwgaXQgbXVzdCBhcHBlYXIgaW4gdGhpcyBmaWxlIGFzIHR3byBjb25zZWN1dGl2ZQotIyAgICAgc2luZ2xlIHF1b3RlIGNoYXJhY3RlcnMuCi0jIDQuICBMaW5lcyBiZWdpbm5pbmcgd2l0aCAiIyIgKGxpa2UgdGhpcyBvbmUpIGFyZSBjb21tZW50IGxpbmVzCi0jICAgICBhbmQgbWF5IGNvbnRhaW4gdHJhbnNsYXRpb24gaW5zdHJ1Y3Rpb25zLiAgVGhleSBuZWVkIG5vdCBiZQotIyAgICAgdHJhbnNsYXRlZCB1bmxlc3MgeW91ciB0cmFuc2xhdGVkIGZpbGUsIHJhdGhlciB0aGFuIHRoaXMgZmlsZSwKLSMgICAgIHdpbGwgc2VydmUgYXMgYSBiYXNlIGZvciBvdGhlciB0cmFuc2xhdG9ycy4KLSMKLSMgRG8gbm90IHJlbW92ZSB0aGUgZm9sbG93aW5nIGNvbW1lbnQgbGluZS4gSXQgaXMgYSB2YXJpYWJsZSB1c2VkIGJ5IGEgdHJhbnNsYXRpb24gdG9vbC4KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIERPIE5PVCBUT1VDSCBUSEVTRSBQUk9QRVJUSUVTIC0gVEhFWSBBUkUgQVVUT01BVElDQUxMWSBVUERBVEVEIEJZIFRIRSBCVUlMRAotIyBQUk9DRVNTLgotYXhpc1ZlcnNpb249QXBhY2hlIEF4aXMyIHZlcnNpb246ICNheGlzVmVyc2lvbiMKLWF4aXNWZXJzaW9uUmF3PSNheGlzVmVyc2lvbiMKLWF4aXNCdWlsdE9uUmF3PSN0b2RheSMKLWF4aXNVc2VyQWdlbnQ9QXhpcy8jYXhpc1ZlcnNpb24jCi1idWlsdE9uPUJ1aWx0IG9uICN0b2RheSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi10ZXN0MDE9VGhpcyBzdHJpbmcgaXMgYSB0ZXN0IHN0cmluZyAwMS4KLWZhdWx0UHJvY2Vzc2luZ05vdFN1cHBvcnRlZD1Vc2VyIGZhdWx0IHByb2Nlc3NpbmcgaXMgbm90IHN1cHBvcnRlZC4gVGhlIEBXZWJGYXVsdCBmYXVsdGJlYW4gaXMgbWlzc2luZyBmb3IgezB9Ci1leGNlcHRpb25EdXJpbmdFeGNlcHRpb25GbG93PUFuIGV4Y2VwdGlvbiBvY2N1cnJlZCBkdXJpbmcgZXhjZXB0aW9uIHByb2Nlc3NpbmcuICBUaGUgZXhjZXB0aW9uIGlzIHN3YWxsb3dlZCBhbmQgaXMgbm90IHByb3BhZ2F0ZWQgYmFjayB0byB0aGUgY2FsbGVyLgotc2VydmljZUNsaWVudENyZWF0ZUVycm9yPVRoZSBTZXJ2aWNlQ2xpZW50IGNhbm5vdCBiZSBjcmVhdGVkLiAKLWNhbm5vdFNldEV4Y3V0b3JUb051bGw9QW4gYXR0ZW1wdCB3YXMgbWFkZSB0byBzZXQgdGhlIEV4ZWN1dG9yIHRvIGEgbnVsbCB2YWx1ZS4gVGhpcyBpcyBub3QgYWxsb3dlZC4KLWdldFBvcnRJbnZhbGlkU0VJPUFuIGF0dGVtcHQgd2FzIG1hZGUgdG8gY2FsbCBnZXRQb3J0IHdpdGggdGhlIHswfSBwb3J0IGFuZCB7MX0gc2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2UgKFNFSSkuIEhvd2V2ZXIsIHRoaXMgY2FsbCBpcyBub3QgYWxsb3dlZC4KLWNyZWF0ZURpc3BhdGNoRmFpbDA9RGlzcGF0Y2ggY3JlYXRpb24gZmFpbGVkLiBUaGUgUU5hbWUgcG9ydCBjYW5ub3QgYmUgbnVsbC4KLWNyZWF0ZURpc3BhdGNoRmFpbDE9RGlzcGF0Y2ggY3JlYXRpb24gZmFpbGVkLiBUaGUgezB9IHBvcnQgY2Fubm90IGJlIGZvdW5kLiAgVmVyaWZ5IHRoYXQgdGhlIHBvcnQgaGFzIGJlZW4gYWRkZWQgdG8gdGhlIHNlcnZpY2UuCi1jcmVhdGVEaXNwYXRjaEZhaWwyPURpc3BhdGNoIGNyZWF0aW9uIGZhaWxlZC4gVGhlIHNlcnZpY2UgY2Fubm90IGZpbmQgUG9ydCBkYXRhIGZvciB0aGUgezB9IHBvcnQuCi1hZGRQb3J0RHVwPUFuIGF0dGVtcHQgd2FzIG1hZGUgdG8gYWRkIHRoZSB7MH0gcG9ydCB0byB0aGUgU2VydmljZURlbGVnYXRlLiBUaGUgcG9ydCBhbHJlYWR5IGV4aXN0cy4KLWFkZFBvcnRFcnIwPU9ubHkgdGhlIFNPQVAxMUhUVFBfQklORElORywgU09BUDEySFRUUF9CSU5ESU5HLCBTT0FQMTFIVFRQX01UT01fQklORElORywgU09BUDEySFRUUF9NVE9NX0JJTkRJTkcgYW5kIEhUVFBfQklORElORyBwb3J0cyBhcmUgc3VwcG9ydGVkIGF0IHRoaXMgdGltZS4gVGhlIHswfSBwb3J0IGNhbm5vdCBiZSBhZGRlZCB0byB0aGUgU2VydmljZURlbGVnYXRlLgotYWRkUG9ydEVycjE9QW4gYXR0ZW1wdCB3YXMgbWFkZSB0byBhZGQgdGhlIHswfSBwb3J0IHdpdGggdGhlIHsxfSBlbmRwb2ludCBhZGRyZXNzLCB3aGljaCBpcyBub3QgdmFsaWQsIHRvIHRoZSBTZXJ2aWNlRGVsZWdhdGUuIFRoaXMgYWRkaXRpb24gaXMgbm90IGFsbG93ZWQuCi1hZGRQb3J0RXJyMj1BbiBhdHRlbXB0IHdhcyBtYWRlIHRvIGFkZCBhIHBvcnQgd2l0aG91dCBhIG5hbWUgdG8gdGhlIFNlcnZpY2VEZWxlZ2F0ZSBvYmplY3QuIFRoaXMgYWRkaXRpb24gaXMgbm90IGFsbG93ZWQuCi1zZXJ2aWNlRGVsZWdhdGVDb25zdHJ1Y3QwPUFuIGF0dGVtcHQgd2FzIG1hZGUgdG8gY29uc3RydWN0IHRoZSBTZXJ2aWNlRGVsZWdhdGUgb2JqZWN0IHdpdGggYW4gc2VydmljZSBuYW1lIHRoYXQgaXMgbm90IHZhbGlkOiB7MH0uCi1zZXJ2aWNlRGVsZWdhdGVDb25zdHJ1Y3QxPUFuIGF0dGVtcHQgd2FzIG1hZGUgdG8gY29uc3RydWN0IHRoZSBTZXJ2aWNlRGVsZWdhdGUgb2JqZWN0IHdpdGggdGhlIHswfSBzZXJ2aWNlLCBidXQgdGhlIHNlcnZpY2UgaXMgbm90IGRlZmluZWQgaW4gdGhlIHsxfSBXU0RMIGZpbGUuCi1zZXJ2aWNlRGVzY0VycjA9VGhlIHNlcnZpY2UgY2xhc3MgaXMgbm90IHZhbGlkLiBUaGUgc2VydmljZSBRTmFtZSBjYW5ub3QgYmUgbnVsbC4KLXNlcnZpY2VEZXNjRXJyMT1UaGUgc2VydmljZSBjbGFzcyBpcyBub3QgdmFsaWQuIFRoZSBTZXJ2aWNlIGNsYXNzIHswfSBtdXN0IGJlIGFzc2lnbmFibGUgdG8gamF2YXgueG1sLndzLlNlcnZpY2UuCi1zZXJ2aWNlRGVzY0VycjI9VGhlIHNlcnZpY2UgaXMgbm90IHZhbGlkLiBUaGUgezB9IHNlcnZpY2UgUU5hbWUgY2Fubm90IGJlIGZvdW5kIGluIHRoZSBXU0RMIGZpbGUuCi13c2RsTm90Rm91bmRFcnI9VGhlIFdTREwgZmlsZSBjb3VsZCBub3QgYmUgZm91bmQ6IHswfQotd3NkbEV4Y2VwdGlvbj1UaGUgZm9sbG93aW5nIFdTREwgZXhjZXB0aW9uIG9jY3VycmVkOiB7MH0KLW5vV2ViUmVzdWx0Rm9yUHJvcGVydHk9VGhlIHN5c3RlbSBjYW5ub3QgY3JlYXRlIHRoZSBXZWJSZXN1bHQgb2JqZWN0IGZvciB0aGUgezB9IHByb3BlcnR5IG9mIHRoZSB7MX0gSmF2YSBiZWFuLgotcG9ydEluZm9FcnIwPVRoZSBzeXN0ZW0gY2Fubm90IGNvbnN0cnVjdCB0aGUgcG9ydCBkYXRhLiBUaGUgezB9IHNlcnZpY2UgbmFtZSBpcyBub3QgdmFsaWQuCi1wb3J0SW5mb0VycjE9VGhlIHN5c3RlbSBjYW5ub3QgY29uc3RydWN0IHRoZSBwb3J0IGRhdGEuIFRoZSB7MH0gcG9ydCBuYW1lIGlzIG5vdCB2YWxpZC4KLXBvcnRJbmZvRXJyMj1UaGUgc3lzdGVtIGNhbm5vdCBjb25zdHJ1Y3QgdGhlIHBvcnQgZGF0YS4gVGhlIHswfSBiaW5kaW5nIGlkIGlzIG5vdCB2YWxpZC4KLSMgVGhlIGtleSBwb3J0SW5mb0VycjMgaXMgbm90IGN1cnJlbnRseSB1c2VkLgotIyBwb3J0SW5mb0VycjM9VGhlIHN5c3RlbSBjYW5ub3QgY29uc3RydWN0IHRoZSBwb3J0IGRhdGEuIFRoZSB7MH0gc2VydmljZSBlbmRwb2ludCBpcyBub3QgdmFsaWQuCi13YXJuQXhpc0ZhdWx0PUFuIEF4aXNGYXVsdCBvY2N1cnJlZC4gSG93ZXZlciwgcHJvY2Vzc2luZyBjb250aW51ZXMuICBUaGUgQXhpc0ZhdWx0IGlzIHswfQotaGFuZGxlckNoYWluRXJyMD1BbiBpbnRlcm5hbCBlcnJvciBvY2N1cnJlZC4gVGhlIHswfSBsb2dpY2FsIGhhbmRsZXIgb2NjdXJzIGFmdGVyIHRoZSBwcm90b2NvbCBoYW5kbGVycy4KLWhhbmRsZXJDaGFpbkVycjE9VGhlIHswfSBoYW5kbGVyIHNob3VsZCBub3QgZGlyZWN0bHkgaW1wbGVtZW50IHRoZSBqYXZheC54bWwud3MuaGFuZGxlci5IYW5kbGVyIGludGVyZmFjZS4KLWhhbmRsZXJDaGFpbkVycjI9VGhlIHswfSBoYW5kbGVyIG11c3QgaW1wbGVtZW50IGphdmF4LnhtbC53cy5oYW5kbGVyLkxvZ2ljYWxIYW5kbGVyIG9yIGphdmF4LnhtbC53cy5oYW5kbGVyLnNvYXAuU09BUEhhbmRsZXIuCi1JQ0VycjE9QW4gaW50ZXJuYWwgZXJyb3Igb2NjdXJyZWQuIFRoZSBpbnZvY2F0aW9uIGNvbnRleHQgaXMgbnVsbC4KLUlDRXJyMj0gQW4gaW50ZXJuYWwgZXJyb3Igb2NjdXJyZWQuIFRoZSBtZXNzYWdlIGNvbnRleHQgaXMgbnVsbC4KLUlDRXJyMz0gQW4gaW50ZXJuYWwgZXJyb3Igb2NjdXJyZWQuIFRoZSByZXF1ZXN0IG1lc3NhZ2UgY29udGV4dCBpcyBudWxsLgotSUNFcnI0PVRoZSBzeXN0ZW0gY2Fubm90IHBlcmZvcm0gYW4gYXN5bmNocm9ub3VzIGludm9rZSB3aXRoIGEgbnVsbCBjYWxsYmFjay4KLUFzeW5jUG9sbGluZ05vdFN1cHBvcnRlZD1Bc3luY2hyb25vdXMgcG9sbGluZyBpbnZvY2F0aW9ucyBhcmUgbm90IHN1cHBvcnRlZC4KLUlDQ3JlYXRlT3BDbGllbnRFcnIxPVRoZSBzeXN0ZW0gY2Fubm90IGNyZWF0ZSB0aGUgT3BlcmF0aW9uQ2xpZW50LiBUaGUgU2VydmljZUNsaWVudCBpcyBudWxsLgotSUNDcmVhdGVPcENsaWVudEVycjI9VGhlIHN5c3RlbSBjYW5ub3QgY3JlYXRlIHRoZSBPcGVyYXRpb25DbGllbnQuIFRoZSBvcGVyYXRpb24gcW5hbWUgaXMgbnVsbC4KLXByb3h5RXJyMT1BbiBhdHRlbXB0IHdhcyBtYWRlIHRvIGludm9rZSB0aGUgezB9IG1ldGhvZCwgYnV0IHRoaXMgbWV0aG9kIGlzIG5vdCBhdmFpbGFibGUgb24gdGhlIGphdmF4LnhtbC53cy5CaW5kaW5nUHJvdmlkZXIgb3IgezF9IGNsYXNzLgotcHJveHlFcnIyPVRoZSBAU09BUEJpbmRpbmcgYW5ub3RhdGlvbiBTdHlsZSBmb3IgdGhlIHNlcnZpY2UgZW5kcG9pbnQgaW50ZXJmYWNlIChTRUkpIGFuZCB0aGUgQFNPQVBCaW5kaW5nIGFubm90YXRpb24gU3R5bGUgZm9yIHRoZSBtZXRob2Qgc2hvdWxkIGJlIHNhbWUuCi1wcm94eUVycjM9T3BlcmF0aW9uIERlc2NyaXB0aW9uIHdhcyBub3Qgc2V0LgotcHJveHlQcml2YXRlTWV0aG9kPUludmFsaWQgbWV0aG9kIGNhbGwuICBUaGUgbWV0aG9kIHswfSBpcyBub3QgYSB2YWxpZCBtZXRob2QuCi1wcm94eUV4Y2x1ZGVkTWV0aG9kPUludmFsaWQgbWV0aG9kIGNhbGwuICBUaGUgbWV0aG9kIHswfSBoYXMgYmVlbiBleGNsdWRlZCB1c2luZyB0aGUgQFdlYk1ldGhvZChleGNsdWRlPXRydWUpIGFubm90YXRpb24uCi1wcm94eU51bGxDYWxsYmFjaz1JbnZhbGlkIEFzeW5jSGFuZGxlciBvYmplY3QuICBUaGUgQXN5bmNoSGFuZGxlciBjYW5ub3QgYmUgbnVsbCBmb3IgYW4gYXN5bmNocm9ub3VzIGNhbGxiYWNrIGludm9jYXRpb24uCi1KQVhXU01lc3NhZ2VSZWNlaXZlck5vU2VydmljZUNsYXNzPVRoZSBzZXJ2aWNlIGNsYXNzIGNhbm5vdCBiZSBmb3VuZCBmb3IgdGhpcyBBeGlzU2VydmljZS4KLUVuZHBvaW50Q29udHJvbGxlckVycjI9VGhlIHNlcnZpY2UgY2xhc3MgaXMgbm90IGNvbmZpZ3VyZWQgZm9yIHRoaXMgZW5kcG9pbnQuIFByb2Nlc3NpbmcgY2Fubm90IGNvbnRpbnVlLgotRW5kcG9pbnRDb250cm9sbGVyRXJyND1UaGUgezB9IHByb3ZpZGVyIGltcGxlbWVudGF0aW9uIGNsYXNzIGNhbm5vdCBiZSBsb2FkZWQgZHVlIHRvIGFuIGVycm9yLiBQcm9jZXNzaW5nIGNhbm5vdCBjb250aW51ZS4KLUVuZHBvaW50Q29udHJvbGxlckVycjU9QSBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIGNsYXNzIGNhbm5vdCBiZSBmb3VuZC4KLUVuZHBvaW50Q29udHJvbGxlckVycjY9VGhlIHNlcnZpY2UgaXMgdW5hYmxlIHRvIGxvYWQgdGhlIHswfSBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIGNsYXNzLgotQmxvY2tJbXBsRXJyMT1BbiBpbnRlcm5hbCBlcnJvciBvY2N1cnJlZC4gVGhlIHswfSBibG9jayBvYmplY3QgaXMgYWxyZWFkeSBjb25zdW1lZC4gUHJvY2Vzc2luZyBjYW5ub3QgY29udGludWUuICBSdW4gd2l0aCB0aGUgZGVidWcgb3B0aW9uIHRvIGRldGVybWluZSB3aGVyZSB0aGUgYmxvY2sgd2FzIGZpcnN0IGNvbnN1bWVkLgotWE1MUGFydEltcGxFcnIxPUFuIGludGVybmFsIGVycm9yIG9jY3VycmVkLiBUaGUgWE1MIHBhcnQgaXMgYWxyZWFkeSBjb25zdW1lZC4gIFByb2Nlc3NpbmcgY2Fubm90IGNvbnRpbnVlLiBSdW4gd2l0aCB0aGUgZGVidWcgb3B0aW9uIHRvIGRldGVybWluZSB3aGVyZSB0aGUgYmxvY2sgd2FzIGZpcnN0IGNvbnN1bWVkLgotWE1MUGFydEltcGxFcnIyPUFuIGludGVybmFsIGVycm9yIG9jY3VycmVkLiBUaGUgY29udGVudCBvZiB0aGUgWE1MIHBhcnQgY2Fubm90IGJlIGRldGVybWluZWQuCi1SRVNUSXNOb3RTdXBwb3J0ZWQ9VGhlIFJFU1QgcHJvdG9jb2wgaXMgbm90IHN1cHBvcnRlZCBpbiB0aGlzIHZlcnNpb24gb2YgdGhlIHN5c3RlbS4KLVByb3RvY29sSXNOb3RLbm93bj1UaGUgcHJvdG9jb2wgaGFzIG5vdCBiZWVuIHNldC4gVGhpcyBlcnJvciBtaWdodCBpbmRpY2F0ZSBhbiBpbnRlcm5hbCBlcnJvciBpbiB0aGUgSkFYLVdTIGxheWVyLgotU291cmNlTm90U3VwcG9ydGVkPVRoZSB7MH0gY2xhc3MgaXMgbm90IGEgc3VwcG9ydGVkIGV4dGVuc2lvbiBvZiB0aGUgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2UuCi1Tb3VyY2VNaXNzaW5nU3VwcG9ydD1BbiBpbnRlcm5hbCBlcnJvciBvY2N1cnJlZC4gVGhlIGNvZGUgdG8gbWFrZSBhIGNvcHkgb2YgdGhpcyBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZSAoezB9KSBpcyBub3Qgc3VwcG9ydGVkIGluIHRoaXMgdmVyc2lvbiBvZiB0aGUgc3lzdGVtLgotTWV0aG9kTm90SW1wbGVtZW50ZWQ9QW4gaW50ZXJuYWwgZXJyb3Igb2NjdXJyZWQuIFRoZSB7MH0gbWV0aG9kIGlzIG5vdCBpbXBsZW1lbnRlZCBpbiB0aGlzIHZlcnNpb24gb2YgdGhlIHN5c3RlbS4KLWRpc3BhdGNoSW52b2tlRXJyMT1UaGUgRGlzcGF0Y2guaW52b2tlT25lV2F5IG1ldGhvZCBpcyBjYWxsZWQgd2l0aCBhIG51bGwgT2JqZWN0IGFyZ3VtZW50LgotZGlzcGF0Y2hJbnZva2VFcnIyPVRoZSBEaXNwYXRjaC5pbnZva2VBc3luYyBtZXRob2QgaXMgY2FsbGVkIHdpdGggYSBudWxsIE9iamVjdCBhcmd1bWVudC4KLXJlc2V0UmVhZGVyRXJyPUFuIGludGVybmFsIGVycm9yIG9jY3VycmVkLiBUaGUgc3lzdGVtIGNhbm5vdCByZXNldCBhIFhNTFN0cmVhbVJlYWRlciB0aGF0IGRvZXMgbm90IHN1cHBvcnQgdGhlIHJlc2V0IGZlYXR1cmUuCi1TQUFKQ29udmVydGVyRXJyMT1UaGUgU09BUEVsZW1lbnQgcGFyZW50IHRoYXQgd2FzIHBhc3NlZCB0byB0aGUgdG9TQUFKIG1ldGhvZCBpcyBub3QgYXR0YWNoZWQgdG8gYSBTT0FQRW52ZWxvcGUuIFByb2Nlc3NpbmcgY2Fubm90IGNvbnRpbnVlLgotU0FBSkNvbnZlcnRlckVycjI9QW4gdW5leHBlY3RlZCBYTUxTdHJlYW1SZWFkZXIgZXZlbnQsIHswfSwgb2NjdXJyZWQgd2hlbiBjb252ZXJ0aW5nIGFuIE9NIHRvIGEgU09BUEVsZW1lbnQuCi1YTUxTUkVycjE9VGhlIGdldFByb3BlcnR5IG1ldGhvZCB3YXMgY2FsbGVkIHdpdGggYSBudWxsIGtleSBhcmd1bWVudC4KLVhNTFNSRXJyMj1BbGwgb2YgdGhlIGV2ZW50cyBvZiB0aGUgWE1MU3RyZWFtUmVhZGVyIGhhdmUgYmVlbiBwcm9jZXNzZWQuICBUaGVyZSBhcmUgbm8gbW9yZSBldmVudHMuCi1YTUxTUkVycjM9VGhlIFJlcXVpcmUgbWV0aG9kIGZhaWxlZC4gVGhlIHN5c3RlbSBleHBlY3RlZCB7MH0sIGJ1dCBmb3VuZCB7MX0uCi1YTUxTUkVycjQ9QSBmYWlsdXJlIG9jY3VycmVkIGluIHRoZSB7MH0gbWV0aG9kLgotWE1MU1JFcnI1PVRoZSBYTUxTdHJlYW1SZWFkZXIgZXZlbnQsIHswfSwgaXMgbm90IHN1cHBvcnRlZCB3aGVuIHByb2Nlc3NpbmcgYSBTT0FQTWVzc2FnZS4KLUludmFsaWRQcm92aWRlcj1UaGUgezB9IFByb3ZpZGVyIGltcGxlbWVudGF0aW9uIGlzIG5vdCB2YWxpZC4gT25seSBTdHJpbmcsIFNvdXJjZSwgYW5kIFNPQVBNZXNzYWdlIGFyZSBzdXBwb3J0ZWQgYnkgdGhlIEpBWC1XUyBzcGVjaWZpY2F0aW9uLgotSW52YWxpZFByb3ZpZGVyQ3JlYXRlPVRoZSBjcmVhdGlvbiBvZiB0aGUgezB9IHByb3ZpZGVyIGluc3RhbmNlIGZhaWxlZC4gCi1TT0FQRmF1bHRJc05vdEltcGxlbWVudGVkPUFuIGludGVybmFsIGVycm9yIG9jY3VycmVkLiBTT0FQRmF1bHQgcHJvY2Vzc2luZyBpcyBub3QgaW1wbGVtZW50ZWQuCi1OZXZlckNhbGxlZD1BbiBpbnRlcm5hbCBhc3NlcnRpb24gZXJyb3Igb2NjdXJyZWQuIFRoZSBpbnRlcm5hbCBtZXRob2QsIHswfSwgIHNob3VsZCBuZXZlciBiZSBjYWxsZWQgd2hlbiBwcm9jZXNzaW5nIGEgbWVzc2FnZS4KLUpBWEJXcmFwcGVyRXJyMT1BbiBpbnRlcm5hbCBhc3NlcnRpb24gZXJyb3Igb2NjdXJyZWQuIFRoZSBKQVhCIG9iamVjdCBhcmd1bWVudCB0byB0aGUgdW53cmFwIG1ldGhvZCBpcyBudWxsLgotSkFYQldyYXBwZXJFcnIyPUFuIGludGVybmFsIGFzc2VydGlvbiBlcnJvciBvY2N1cnJlZC4gVGhlIGNoaWxkIG5hbWVzIGFyZ3VtZW50IHRvIHRoZSB1bndyYXAgbWV0aG9kIGlzIG51bGwuCi1KQVhCV3JhcHBlckVycjM9QW4gaW50ZXJuYWwgYXNzZXJ0aW9uIGVycm9yIG9jY3VycmVkLiBUaGUgY2hpbGQgb2JqZWN0cyBvciBjaGlsZCBuYW1lcyBhcmd1bWVudCB0byB0aGUgd3JhcCBtZXRob2QgaXMgbnVsbC4KLUpBWEJXcmFwcGVyRXJyND1BbiBpbnRlcm5hbCBhc3NlcnRpb24gZXJyb3Igb2NjdXJyZWQuIFRoZSBudW1iZXIgb2YgY2hpbGQgb2JqZWN0cyBkb2VzIG5vdCBtYXRjaCB0aGUgbnVtYmVyIG9mIGNoaWxkIG5hbWVzIGluIHRoZSB3cmFwIG1ldGhvZC4KLUpBWEJXcmFwcGVyRXJyNT1BbiBpbnRlcm5hbCBhc3NlcnRpb24gZXJyb3Igb2NjdXJyZWQuIFRoZSBudW1iZXIgb2YgY2hpbGQgbmFtZXMgZG9lcyBub3QgbWF0Y2ggdGhlIG51bWJlciBvZiBiZWFuIHByb3BlcnRpZXMgaW4gdGhlIHswfSBKQVhCIGNsYXNzLgotSkFYQldyYXBwZXJFcnI2PUFuIGludGVybmFsIGFzc2VydGlvbiBlcnJvciBvY2N1cnJlZC4gVGhlIHswfSBKQVhCIG9iamVjdCBkb2VzIG5vdCBoYXZlIGEgezF9IHhtbCBwcm9wZXJ0eS4KLUpBWEJXcmFwcGVyRXJyNz1BbiBpbnRlcm5hbCBhc3NlcnRpb24gZXJyb3Igb2NjdXJyZWQuIFRoZSB2YWx1ZSBvZiB0aGUgbWV0aG9kIHBhcmFtZXRlcnMgdGhhdCBob2xkcyB0aGUgY2hpbGQgb2JqZWN0cyB0byBjcmVhdGUgdGhlIEpBWEJPYmplY3QgaXMgbnVsbC4KLUpBWEJTb3VyY2VOYW1lc3BhY2VFcnI9VGhlIERPTVNvdXJjZSB2YWx1ZSBtdXN0IGJlIE5hbWVzcGFjZSBBd2FyZS4KLUF0dGFjaG1lbnRzTm90U3VwcG9ydGVkPVNBQUogYXR0YWNobWVudHMgYXJlIG5vdCBzdXBwb3J0ZWQuCi1wcm90b05vdEZvdW5kMDA9QW4gYXNzb2NpYXRlZCBwcm90b2NvbCBjYW5ub3QgYmUgZm91bmQgZm9yIHRoZSB7MH0gYmluZGluZy4KLUphdmFEaXNwRXJyMT1BIHNlcnZpY2UgaW1wbGVtZW50YXRpb24gY2xhc3MgY2Fubm90IGJlIGZvdW5kLgotSmF2YURpc3BFcnIyPVRoZSBzZXJ2aWNlIGlzIHVuYWJsZSB0byBsb2FkIHRoZSB7MH0gc2VydmljZSBpbXBsZW1lbnRhdGlvbiBjbGFzcy4KLUludmFsaWRXZWJQYXJhbXM9VGhlIHNlcnZpY2UgZm91bmQgd2ViUGFyYW1zIHRoYXQgYXJlIG5vdCB2YWxpZC4gVGhlIG51bWJlciBvZiB3ZWJwYXJhbXMgdGhhdCBhcmUgZGVmaW5lZCBkb2VzIG5vdCBtYXRjaCB0aGUgbWV0aG9kIGlucHV0IHBhcmFtZXRlcnMuCi1Bc3luY0xpc3RlbmVyRXJyMT1BbiBpbnRlcm5hbCBlcnJvciBvY2N1cnJlZC4gVGhlIEF4aXNDYWxsYmFjayBvYmplY3QgY2Fubm90IGJlIG51bGwuCi1Eb2NMaXRQcm94eUhhbmRsZXJFcnIxPUFjY29yZGluZyB0byB0aGUgV1MtSSBzcGVjaWZpY2F0aW9uLCBtdWx0aXBsZSBwYXJ0IFdTREwgZmlsZXMgYXJlIG5vdCBhbGxvd2VkIGZvciBhIERvY3VtZW50L0xpdGVyYWwgQmFyZSByZXF1ZXN0LiBUaGUgaW52b2tlZCBtZXRob2QgaGFzIG11bHRpcGxlIGlucHV0IHBhcmFtZXRlcnMuCi1Eb2NMaXRQcm94eUhhbmRsZXJFcnIyPVRoZSBNZXRob2QgSW5wdXQgcGFyYW1ldGVyIGZvciBhIG5vbi13cmFwcGVkIFJlcXVlc3QgY2Fubm90IGJlIG51bGwuCi1Eb2NMaXRQcm94eUhhbmRsZXJFcnIzPVVzZSB0aGUgamF2YXgueG1sLndzLkFzeW5jSGFuZGxlciBtZXRob2QgcGFyYW1ldGVyIHR5cGUgd2l0aCBBc3luYyBDYWxsYmFjayBvcGVyYXRpb25zIG9ubHkuIFRoZSBtZXRob2QgaXMgQXN5bmMgaWYgaXQgcmV0dXJucyBhIEZ1dHVyZTw/PiB0eXBlIGFuZCBlbmRzIHdpdGggbGV0dGVycyAnQXN5bmMnLgotRG9jTGl0UHJveHlIYW5kbGVyRXJyND1UaGUgbW9kZSBmb3IgdGhlIFdlYlBhcmFtIGFubm90YXRpb24gY2Fubm90IGJlIElOIGZvciBhbiBpbnB1dCBwYXJhbWV0ZXIgdGhhdCBpcyBhIEhvbGRlciB0eXBlLgotRG9jTGl0UHJveHlIYW5kbGVyRXJyNT1UaGUgb2JqZWN0IGlzIG5vdCBhIEhvbGRlciB0eXBlLgotSmF2YUJlYW5EaXNwYXRjaGVyRXJyMT1BIEphdmEgbWV0aG9kIHdhcyBub3QgZm91bmQgZm9yIHRoZSBvcGVyYXRpb24uIElmIHRoZSBXU0RMIG9wZXJhdGlvbiBuYW1lIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBKYXZhIG1ldGhvZCBuYW1lLCBtYWtlIHN1cmUgdGhhdCB0aGUgQFdlYk1ldGhvZCBhbm5vdGF0aW9uIG5hbWUgaXMgcHJlc2VudC4KLVNPQVAxMldpdGhTQUFKMTJFcnI9QSBTT0FQIDEuMiBtZXNzYWdlIGNhbm5vdCBiZSByZW5kZXJlZCBpbiBhbiBTQUFKIDEuMiBvYmplY3QgbW9kZWwuCi1kaXNwYXRjaE51bGxQYXJhbU1lc3NhZ2VNb2RlPVRoZSBwYXJhbWV0ZXIgY2Fubm90IGJlIGEgbnVsbCB2YWx1ZSBmb3IgYSBEaXNwYXRjaCBpbnZvY2F0aW9uIHVzaW5nIHRoZSBNRVNTQUdFIG1vZGUuCi1kaXNwYXRjaE51bGxQYXJhbUh0dHBCaW5kaW5nPVRoZSBwYXJhbWV0ZXIgY2Fubm90IGJlIGEgbnVsbCB2YWx1ZSBmb3IgYSBEaXNwYXRjaCBpbnZvY2F0aW9uIHVzaW5nIHRoZSBYTUwvSFRUUCBiaW5kaW5nLgotZGlzcGF0Y2hJbnZhbGlkUGFyYW09VGhlIHBhcmFtZXRlciBmb3IgdGhlIERpc3BhdGNoIGludm9jYXRpb24gd2FzIG5vdCB2YWxpZC4KLWRpc3BhdGNoSW52YWxpZFR5cGU9VW5zdXBwb3J0ZWQgRGlzcGF0Y2ggVHlwZSwgRGlzcGF0Y2ggY2FuIG9ubHkgYmUgb2YgdGhlIGphdmEubGFuZy5TdHJpbmcsIGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlLCBqYXZheC54bWwuc29hcC5TT0FQTWVzc2FnZSwgb3IgamF2YXgueG1sLnNvYXAuU09BUEVudmVsb3BlIHR5cGUuCi1wcmVwYXJlUmVxdWVzdEZhaWw9QW4gZXJyb3Igb2NjdXJyZWQgd2hlbiB0aGUgc3lzdGVtIHdhcyBwcmVwYXJpbmcgdGhlIHJlcXVlc3QgbWVzc2FnZS4KLXZhbGlkYXRlVXNlck5hbWU9RXJyb3I6IEEgdmFsdWUgbXVzdCBiZSBzcGVjaWZpZWQgd2hlbiBzZXR0aW5nIHRoZSBqYXZheC54bWwud3Muc2VjdXJpdHkuYXV0aC51c2VybmFtZSBwcm9wZXJ0eS4KLXZhbGlkYXRlUGFzc3dvcmQ9RXJyb3I6IEEgdmFsdWUgbXVzdCBiZSBzcGVjaWZpZWQgd2hlbiBzZXR0aW5nIHRoZSBqYXZheC54bWwud3Muc2VjdXJpdHkuYXV0aC5wYXNzd29yZCBwcm9wZXJ0eS4KLWNoZWNrVXNlcm5hbWVBbmRQYXNzd29yZD1FcnJvcjogVGhlIGphdmF4LnhtbC53cy5zZWN1cml0eS5hdXRoLnVzZXJuYW1lIHVzZXIgbmFtZSBhbmQgdGhlIGphdmF4LnhtbC53cy5zZWN1cml0eS5hdXRoLnBhc3N3b3JkIHBhc3N3b3JkIG11c3QgYmUgc3BlY2lmaWVkLgotY2hlY2tVc2VyTmFtZT1FcnJvcjogVGhlIGphdmF4LnhtbC53cy5zZWN1cml0eS5hdXRoLnVzZXJuYW1lIHByb3BlcnR5IHdhcyBzZXQsIGJ1dCBubyB2YWx1ZSB3YXMgc3BlY2lmaWVkLgotTm9NYWludGFpblNlc3Npb25Qcm9wZXJ0eT1FcnJvcjogTWFpbnRhaW4gU2Vzc2lvbiBpcyBlbmFibGVkIGJ1dCBub25lIG9mIHRoZSBzZXNzaW9uIHByb3BlcnRpZXMgKENvb2tpZXMsIE92ZXItd3JpdHRlbiBVUkwpIGFyZSByZXR1cm5lZC4KLU51bGxWYWx1ZUZvck1haW50YWluU2Vzc2lvblByb3BlcnR5PUVycm9yOiBUaGUgdmFsdWUgb2YgdGhlIHswfSBTZXNzaW9uIHByb3BlcnR5IGlzIE5VTEwuCi1KQVhCQmxvY2tGYWN0b3J5RXJyMT1BbiBpbnRlcm5hbCBhc3NlcnRpb24gZXJyb3Igb2NjdXJyZWQuIFRoZSBjb250ZXh0IHBhcmFtZXRlciBvZiB0aGUgSkFYQkJsb2NrRmFjdG9yeS5jcmVhdGVGcm9tIG1ldGhvZCBzaG91bGQgYmUgYSBKQVhCQmxvY2tDb250ZXh0IG9iamVjdCwgYnV0IGEgezB9IG9iamVjdCB3YXMgZm91bmQuCi1KQVhCQmxvY2tGYWN0b3J5RXJyMj1BbiBpbnRlcm5hbCBhc3NlcnRpb24gZXJyb3Igb2NjdXJyZWQuIFRoZSBidXNpbmVzcyBvYmplY3QgcGFyYW1ldGVyIG9mIEpBWEJCbG9ja0ZhY3RvcnkuY3JlYXRlRnJvbSBtZXRob2Qgc2hvdWxkIGJlIGEgSkFYQkVsZW1lbnQgb2JqZWN0IG9yIGFuIG9iamVjdCB3aXRoIGFuIEBYbWxSb290RWxlbWVudCBhbm5vdGF0aW9uLCBidXQgYSB7MH0gb2JqZWN0IHdhcyBmb3VuZC4KLUpBWEJCbG9ja0ZhY3RvcnlFcnIzPUFuIGludGVybmFsIGFzc2VydGlvbiBlcnJvciBvY2N1cnJlZC4gVGhlIHFOYW1lIHBhcmFtZXRlciBvZiBKQVhCQmxvY2tGYWN0b3J5LmNyZWF0ZUZyb20gbWV0aG9kIHNob3VsZCBub3QgYmUgbnVsbC4KLVdTREw0SldyYXBwZXJFcnIxPVVuYWJsZSB0byByZWFkIHdzZGwgZnJvbSByZWxhdGl2ZSBwYXRoLgotV2ViU2VydmljZUNvbnRleHRJbmplY3Rpb25JbXBsRXJyMT1BIG51bGwgc2VydmljZSBpbnN0YW5jZSBjYW5ub3QgYmUgaW5qZWN0ZWQgaW50byB0aGUgcmVzb3VyY2UuCi1XZWJTZXJ2aWNlQ29udGV4dEluamVjdGlvbkltcGxFcnIyPVRoZSBpbmplY3Rpb24gb2YgcHJpdmF0ZSBhbmQgcHJvdGVjdGVkIHNldCBtZXRob2RzIGFyZSBub3Qgc3VwcG9ydGVkLgotV2ViU2VydmljZUNvbnRleHRJbmplY3Rpb25JbXBsRXJyMz1BIG51bGwgc2VydmljZSBpbnN0YW5jZSBjYW5ub3QgYmUgaW5qZWN0ZWQgaW50byB0aGUgd2Vic2VydmljZXMgY29udGV4dC4KLVdlYlNlcnZpY2VDb250ZXh0SW5qZWN0aW9uSW1wbEVycjQ9QSBudWxsIHNlcnZpY2UgaW5zdGFuY2UgY2Fubm90IGJlIGluamVjdGVkIGludG8gdGhlIHdlYnNlcnZpY2VzIGNvbnRleHQuCi1XZWJTZXJ2aWNlQ29udGV4dEluamVjdGlvbkltcGxFcnI1PVRoZSBpbmplY3Rpb24gb2YgcHJpdmF0ZSBhbmQgcHJvdGVjdGVkIHNlcnZpY2UgaW5zdGFuY2UgZmllbGQgaXMgbm90IHN1cHBvcnRlZC4KLVdlYlNlcnZpY2VDb250ZXh0SW5qZWN0aW9uSW1wbEVycjY9VGhlIGluamVjdGlvbiBjYW4gaGFwcGVuIHVzaW5nIGEgbWV0aG9kIGlmIHRoZSBtZXRob2QgbmFtZSB0aGF0IHN0YXJ0cyB3aXRoIFwic2V0XCIgcmV0dXJucyBhIHZvaWQsIG9ubHkgaGFzIG9uZSBwYXJhbWV0ZXIsIGFuZCB0aGUgdHlwZSBvZiB0aGlzIHBhcmFtZXRlciBpcyBjb21wYXRpYmxlIHdpdGggdGhlIHJlc291cmNlLgotUmVzb3VyY2VJbmplY3Rpb25GYWN0b3J5RXJyMT1BbiB1bmtub3duIHJlc291cmNlIHR5cGUgd2FzIGZvdW5kLCBPbmx5IGEgamF2YXgueG1sLndzLldlYlNlcnZpY2VDb250ZXh0IHJlc291cmNlIHR5cGUgY2FuIGJlIGluamVjdGVkLgotRW5kcG9pbnRMaWZlY3ljbGVNYW5hZ2VySW1wbEVycjE9RW5kcG9pbnRMaWZlY3ljbGVNYW5hZ2VyIG9iamVjdCBpcyBudWxsLgotQ2xhc3NVdGlsc0VycjE9QSBjbGFzcyBsb2FkZXIgd2FzIG5vdCBmb3VuZC4gIAotQ2xhc3NVdGlsc0VycjI9ezB9IG1pZ2h0IG5vdCBiZSBhIHZhbGlkIHBhY2thZ2UgYmVjYXVzZSB0aGUgZW5jb2RpbmcgaXMgdW5zdXBwb3J0ZWQuCi1DbGFzc1V0aWxzRXJyMz1BbiBJT0V4Y2VwdGlvbiBlcnJvciB3YXMgdGhyb3duIHdoZW4gdHJ5aW5nIHRvIGdldCBhbGwgb2YgdGhlIHJlc291cmNlcyBmb3IgezB9Ci1DbGFzc1V0aWxzRXJyND1BbiBJT0V4Y2VwdGlvbiBlcnJvciB3YXMgdGhyb3duIHdoZW4gdHJ5aW5nIHRvIHJlYWQgdGhlIGphciBmaWxlLgotTWV0aG9kTWFyc2hhbGxlckVycjE9QSBKQVgtV1Mgc2VydmljZSBleGNlcHRpb24gZm9yIHRoZSB7MH0gZmF1bHQgYmVhbiBjYW5ub3QgYmUgY3JlYXRlZC4KLU1ldGhvZE1hcnNoYWxsZXJVdGlsRXJyMT1FbXB0eSBCb2R5IEJsb2NrIEZvdW5kIGluIHJlc3BvbnNlIE1lc3NhZ2UgZm9yIHdzZGwgT3BlcmF0aW9uIGRlZmludGlvbiB0aGF0IGV4cGVjdHMgYW4gT3V0cHV0LiBSZXR1cm4gdHlwZSBhc3NvY2lhdGVkIHdpdGggU0VJIG9wZXJhdGlvbiBpcyBub3Qgdm9pZCwgQm9keSBCbG9jayBjYW5ub3QgYmUgbnVsbC4KLVNvdXJjZVJlYWRFcnI9QSBwcm9ibGVtIHdhcyBlbmNvdW50ZXJlZCB3aGlsZSByZWFkaW5nIHRoZSBTb3VyY2Ugb2JqZWN0LiAgUGxlYXNlIHZlcmlmeSB0aGF0IHlvdXIgU291cmNlIG9iamVjdCBpcyBjb3JyZWN0LiAgVGhlIGNsYXNzIG9mIHRoZSBTb3VyY2Ugb2JqZWN0IGlzIHswfQotSkFCR3JhcGhQcm9ibGVtPVRoZSBzeXN0ZW0gdGhyZXcgYSBTdGFja092ZXJmbG93RXJyb3IgYXQgdGhlIEpBWEIgbGV2ZWwuICBUaGlzIHVzdWFsbHkgbWVhbnMgdGhhdCB5b3VyIEpBWEIgb2JqZWN0IGhhcyBhIGNpcmN1bGFyIHJlZmVyZW5jZS4gIFRoaXMgaXMgbm90IHN1cHBvcnRlZCBieSBKQVhCLgotU2NoZW1hUmVhZGVyRXJyMT1JbnZsaWQgd3NkbCBEZWZpbml0aW9uIHByb3ZpZGVkLgotU2NoZW1hUmVhZGVyRXJyMj1DaXJjdWxhciBEZXBlbmRlbmN5IEZvdW5kIGluIFdTREwgU2NoZW1hIEltcG9ydHMsIFR3byBTY2hlbWFzIGFyZSBpbXBvcnRpbmcgZWFjaCBvdGhlci4KLVhTRExpc3ROb3RTdXBwb3J0ZWQ9QW4gYXR0ZW1wdCB3YXMgbWFkZSB0byBtYXJzaGFsIG9yIHVubWFyc2hhbCBhbiB4c2Q6bGlzdCB3aXRoIGEgY29tcG9uZW50IHR5cGUgdGhhdCBpcyBhIHswfS4gIFRoaXMgc2NlbmFyaW8gaXMgbm90IHN1cHBvcnRlZCBmb3IgcnBjL2xpdGVyYWwgcHJvY2Vzc2luZy4gIFBsZWFzZSB1c2UgZG9jdW1lbnQvbGl0ZXJhbCBwcm9jZXNzaW5nCi1kaXNwYXRjaEJhZERPTVNvdXJjZT1BbiBpbnZhbGlkIERPTVNvdXJjZSB3YXMgZW5jb3VudGVyZWQgZHVyaW5nIERpc3BhdGNoLiAgUGxlYXNlIHVzZSBhIERPTVNvdXJjZSB0aGF0IGNvbnRhaW5zIGEgTm9kZS4KLWNvbnZlcnRQcm9ibGVtPUFuIGludGVybmFsIGVycm9yIG9jY3VycmVkIGR1cmluZyBKQVgtV1MgbWFyc2hhbGxpbmcuIEFuIG9iamVjdCBvZiB0eXBlIHswfSBjYW5ub3QgYmUgY29udmVydGVkIGludG8gdGhlIGRlc3RpbmF0aW9uIHR5cGUgb2YgezF9Ci1pbnZhbGlkUHJvcFZhbHVlPVRoZSB2YWx1ZSBvZiBwcm9wZXJ0eSB7MH0gd2FzIGludmFsaWQuICB7MX0gZG9lcyBub3QgbWF0Y2ggZXhwZWN0ZWQgdHlwZSB7Mn0uCi1OdWxsUGFyYW1FcnIxPUlucHV0IGFyZ3VtZW50KHMpIGluIG9wZXJhdGlvbiBtZXRob2QgezB9IGlzIG51bGwuICBUaGlzIGlzIG5vdCBhbGxvd2VkIGZvciBkb2MvbGl0IG1lc3NhZ2VzLgotTnVsbFBhcmFtRXJyMj1JbnB1dCBhcmd1bWVudChzKSBpbiBvcGVyYXRpb24gbWV0aG9kIHswfSBpcyBudWxsLiAgVGhpcyBpcyBub3QgYWxsb3dlZCBmb3IgcnBjL2xpdCBtZXNzYWdlcy4KLU51bGxQYXJhbUVycjM9UmV0dXJuIGFyZ3VtZW50KHMpIGluIG9wZXJhdGlvbiBtZXRob2QgezB9IGlzIG51bGwuICBUaGlzIGlzIG5vdCBhbGxvd2VkIGZvciBycGMvbGl0IG1lc3NhZ2VzLgotdW5rbm93bkhvc3Q9VGhlIGhvc3Qgc3BlY2lmaWVkIGJ5IHRoZSBVUkwgaXMgdW5rbm93bi4KLWNvbm5lY3Rpb25SZWZ1c2VkPUFuIGF0dGVtcHQgdG8gY29ubmVjdCB0byB0aGUgVVJMIHdhcyByZWZ1c2VkLgotdXJsU3RyZWFtPVRoZSBXU0RMIGZpbGUgY291bGQgbm90IGJlIGxvY2F0ZWQuCi1taW1lQm9keVBhcnRFcnJvcj1FcnJvcjogUHJvYmxlbSBjcmVhdGluZyBtaW1lIHBhcnRzLgotc2NoZW1hSW1wb3J0RXJyb3I9QW4gaW50ZXJuYWwgZXJyb3Igb2NjdXJyZWQgcmVzb2x2aW5nIGltcG9ydGVkIHNjaGVtYSB7MH0gcmVsYXRpdmUgdG8gcGFyZW50IGRvY3VtZW50IHsxfQotRXhlY3V0b3JTaHV0ZG93bj1SZWplY3RlZEV4Y2VjdXRpb25FeGNlcHRpb24uIFRoZSByZXF1ZXN0IGlzIHJlamVjdGVkIGJlY2F1c2UgdGhlIEV4ZWN1dG9yIFNlcnZpY2UgZm9yIHRoZSBzZXJ2aWNlIGlzIHNodXRkb3duLgotaGFuZGxlckNoYWluTlM9VGhlIEBIYW5kbGVyQ2hhaW4gY29uZmlndXJhdGlvbiBmaWxlIHswfSBpbiB0aGUgY2xhc3MgezF9IGNvdWxkIG5vdCBiZSBsb2FkZWQuCi1oY0NvbmZpZ0xvYWRGYWlsPVRoZSBASGFuZGxlckNoYWluIGNvbmZpZ3VyYXRpb24gZmlsZSB7MH0gaW4gdGhlIGNsYXNzIHsxfSBjb3VsZCBub3QgYmUgbG9hZGVkIGR1ZSB0byB0aGUgZm9sbG93aW5nIGVycm9yOiB7Mn0KLXNlcnZlclNpZGVBc3luYz1UaGUgc2VydmVyLXNpZGUgU0VJIHswfSBjb250YWlucyB0aGUgYXN5bmNocm9ub3VzIG1ldGhvZCB7MX0uIEFzeW5jaHJvbm91cyBtZXRob2RzIGFyZSBub3QgYWxsb3dlZCBmb3Igc2VydmVyLXNpZGUgYXJ0aWZhY3RzLgotb25ld2F5QXN5bmM9VGhlIGFzeW5jIGxpc3RlbmVyIHByb3BlcnR5IHdhcyBzZXQuICBBIG9uZSB3YXkgaW52b2NhdGlvbiBjYW5ub3QgYmUgcGVyZm9ybWVkIHVzaW5nIGFuIGFzeW5jIHJlc3BvbnNlIGNoYW5uZWwuCi1zb2FwQmluZGluZ1VzZUVuY29kZWQ9VGhlIFNFSSB7MH0gY29udGFpbnMgbWV0aG9kIHsxfSB3aXRoIGFuIHVuc3VwcG9ydGVkIFNPQVBCaW5kaW5nIGFubm90YXRpb24gdmFsdWUuIFNPQVBCaW5kaW5nLlVzZSBmaWVsZCBjYW5ub3QgYmUgc2V0IHRvIEVOQ09ERUQuCi1zb2FwQmluZGluZ1N0eWxlPVRoZSBTRUkgezB9IGNvbnRhaW5zIG1ldGhvZCB7MX0gd2l0aCBhbm5vdGF0aW9uIFNPQVBCaW5kaW5nLlN0eWxlIHNldCB0byBSUEMuCi1oYW5kbGVyU291cmNlRmFpbD1JbnRlcm5hbCBlcnJvci4gTXVsdGlwbGUgc291cmNlcyB3ZXJlIHN1cHBsaWVkIGZvciB0aGUgaGFuZGxlciBjaGFpbiBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGluIHRoZSBjbGFzcyB7MH0uCi1mYWlsdXJlTG9nZ2VyPUEgezB9IHRocm93YWJsZSB3YXMgY2F1Z2h0LiAgVGhlIGRldGFpbCBtZXNzYWdlIGlzOiB7MX0KLWNsaWVudENvbmZpZ0N0eHRFcnI9RXJyb3IgZ2V0dGluZyBDbGllbnQgQ29uZmlndXJhdGlvbiBDb250ZXh0IDogezB9Ci1jcmVhdGVTZXJ2aWNlRGVzY3JFcnI9QSBTZXJ2aWNlRGVzY3JpcHRpb24gd2FzIG5vdCBjcmVhdGVkIGZvciB7MH0KLWNyZWF0ZVNydmNEZXNjckRCQ01hcEVycj1UaGUgU2VydmljZURlc2NyaXB0aW9uIGZhaWxlZCB0byB2YWxpZGF0ZSBkdWUgdG8gdGhlIGZvbGxvd2luZyBlcnJvcnMgLS0gVmFsaWRhdGlvbiBQaGFzZSAyIGZhaWx1cmU6IHswfSwgRmFpbGluZyBjb21wb3NpdGU6IHsxfSwgRmFpbGluZyBTZXJ2aWNlIERlc2NyaXB0aW9uOiB7Mn0KLXJlZ0hhbmRsZXJIZWFkZXJzRXJyPVVuYWJsZSB0byBhZGQgUGFyYW1ldGVyIGZvciBoZWFkZXIgUU5hbWVzIHRvIEF4aXNTZXJ2aWNlIHswfS4gezF9Ci1lbmRwb2ludERlc2NyaXB0aW9uRXJyMT1FbmRwb2ludERlc2NyaXB0aW9uOiBQb3J0UU5hbWUgd2FzIG51bGwgYW5kIGNvdWxkIG5vdCBiZSBkZXRlcm1pbmVkIGJ5IHJ1bnRpbWUgZm9yIGNsYXNzIHswfTsgU2VydmljZURlc2NyaXB0aW9uOiB7MX0KLWVuZHBvaW50RGVzY3JpcHRpb25FcnIyPUNhdWdodCB7MH0gYXR0ZW1wdGluZyB0byBjb21wbGV0ZSBjb25maWd1cmF0aW9uIG9uIEF4aXNTZXJ2aWNlIGZvciBTZXJ2aWNlRGVzcmlwdGlvbjogezF9Ci1lbmRwb2ludERlc2NyaXB0aW9uRXJyMz1FbmRwb2ludERlc2NyaXB0aW9uLkVuZHBvaW50RGVzY3JpcHRpb246IHBhcmVudHMgREJDIGlzIG51bGwKLWVuZHBvaW50RGVzY3JpcHRpb25FcnI0PUVuZHBvaW50RGVzY3JpcHRpb246IFVuYWJsZSB0byBhZGQgcGFyYW1ldGVycyB0byBBeGlzU2VydmljZQotZW5kcG9pbnREZXNjcmlwdGlvbkVycjU9Q2FuJ3QgYWRkIEF4aXNTZXJ2aWNlIHBhcmFtOiB7MH0KLWVuZHBvaW50RGVzY3JpcHRpb25FcnI2PUVpdGhlciBXZWJTZXJ2aWNlIG9yIFdlYlNlcnZpY2VQcm92aWRlciBhbm5vdGF0aW9uIG11c3QgYmUgcHJlc2VudCBvbiB7MH0KLWVuZHBvaW50RGVzY3JpcHRpb25FcnI3PUJvdGggV2ViU2VydmljZSBvciBXZWJTZXJ2aWNlUHJvdmlkZXIgYW5ub3RhdGlvbnMgY2Fubm90IGJlIHByZXNlbnRvbiB7MH0KLWVuZHBvaW50RGVzY3JpcHRpb25FcnI4PUNhbid0IGNyZWF0ZSBTRUkgY2xhc3M6Ci1vcGVyYXRpb25EZXNjcmlwdGlvbkVycjE9T3BlcmF0aW9uRGVzY3JpcHRpb246IFVuYWJsZSB0byBhZGQgcGFyYW1ldGVycyB0byBBeGlzT3BlcmF0aW9uCi11cGRhdGVXaXRoU0VJRXJyMT1DYW4gbm90IHVwZGF0ZSBhbiBTRUkgb24gYSBkeW5hbWljIHBvcnQuICBQb3J0UU5hbWU6IHswfQotdXBkYXRlV2l0aFNFSUVycjI9RW5kcG9pbnREZXNjcmlwdGlvbi51cGRhdGVXaXRoU0VJIHdhcyBwYXNzZWQgYSBudWxsIFNFSS4gIFBvcnRRTmFtZTogezB9Ci1zZXR1cEF4aXNTZXJ2aWNlRXJyMT1VbmFibGUgdG8gY3JlYXRlIEF4aXNTZXJ2aWNlIGZvciB7MH0KLXNldHVwQXhpc1NlcnZpY2VFcnIyPUV4Y2VwdGlvbiB3aGVuIGFkZGluZyBzZXJ2aWNlIHBhcmFtZXRlcnMuCi1ibGRBeGlzU3J2Y0Zyb21XU0RMRXJyPVRoZSBXU0RMIGZpbGUgY291bGQgbm90IGJlIHVzZWQgZHVlIHRvIGFuIGV4Y2VwdGlvbi4gIFRoZSBXU0RMIHdpbGwgYmUgaWdub3JlZCBhbmQgYW5ub3RhdGlvbnMgd2lsbCBiZSB1c2VkLiAgSW1wbGVtZW50YXRpb24gY2xhc3M6IHswfTsgV1NETCBMb2NhdGlvbjogezF9Ci1zZXJ2aWNlRGVzY0VycjM9V1NETCBQb3J0IG5vdCBmb3VuZCBmb3IgcG9ydCB7MH0KLWdlbmVyYXRlV1NETEVycj1FbmRwb2ludERlc2NyaXB0aW9uSW1wbDogV1NETEV4Y2VwdGlvbiB0aHJvd24gd2hlbiBhdHRlbXB0aW5nIHRvIGluc3RhbnRpYXRlIFdTREw0SldyYXBwZXIKLWhhbmRsZXJDaGFpbnNUeXBlRXJyPUVuZHBvaW50RGVzY3JpcHRpb25JbXBsLmdldEhhbmRsZXJDaGFpbjogZmlsZU5hbWU6IHswfTsgY2xhc3NOYW1lOiB7MX0KLWVpRGVzY3JJbXBsRXJyPVVuYWJsZSB0byBidWlsZCBBeGlzT3BlcmF0aW9uIGZvciBnZW5lcmljIFByb3ZpZGVyOyBjYXVnaHQgZXhjZXB0aW9uLgotc2VpTWV0aG9kc0Vycj1TRUkgbWV0aG9kcyBtdXN0IGJlIHB1YmxpYy4KLXNlaVByb2Nlc3NpbmdFcnI9VGhlIHNlaUNsYXNzIGlzIGFscmVhZHkgc2V0OyByZXNldGluZyBpdCBpcyBub3Qgc3VwcG9ydGVkLgotc2VpTm90Rm91bmRFcnI9RW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbkltcGw6IGNhbm5vdCBmaW5kIHN1cGVyIGNsYXNzIHRoYXQgd2FzIHNwZWNpZmllZCBmb3IgdGhpcyBjbGFzcy4KLWNsaWVudEF4aXNPcHJFcnI9Q2F1Z2h0IGV4Y2VwdGlvbiB0cnlpbmcgdG8gY3JlYXRlIEF4aXNPcGVyYXRpb24uCi1jcmVhdGVBeGlzT3ByRXJyMT1Db3VsZCBub3Qgc2V0dXAgRG9jL0xpdC9CYXJlIG9wZXJhdGlvbiBiZWNhdXNlIGlucHV0IG1lc3NhZ2UgaXMgbnVsbC4KLWNyZWF0ZUF4aXNPcHJFcnIyPUNvdWxkIG5vdCBzZXR1cCBEb2MvTGl0L0JhcmUgb3BlcmF0aW9uIGJlY2F1c2UgcGFydCBuYW1lc3BhY2UgaXMgZW1wdHkuCi1jcmVhdGVBeGlzT3ByRXJyMz1Db3VsZCBub3Qgc2V0dXAgRG9jL0xpdC9CYXJlIG9wZXJhdGlvbiBiZWNhdXNlIG5hbWUgaXMgZW1wdHkuCi1zZWlNZXRob2RFcnI9Q2FuIG5vdCBzZXQgYW4gU0VJIG1ldGhvZCBvbmNlIGl0IGhhcyBiZWVuIHNldC4KLXJlZ01VSGVhZGVyc0Vycj1VbmFibGUgdG8gYWRkIFBhcmFtZXRlciBmb3IgaGVhZGVyIFFOYW1lcyB0byBBeGlzT3BlcmF0aW9uIHswfQotZ2VuUGFyYW1UeXBlc0Vycj1PcGVyYXRpb25EZXNjcmlwdGlvbkltcGwuZ2V0UGFyYW1ldGVyQWN0dWFsR2VuZXJpY1R5cGUgbm90IHN1cHBvcnRlZCBmb3IgREJDLgotdXBkYXRlRVBEZXNjckVycjE9U2VydmljZURlc2NyaXB0aW9uLnVwZGF0ZUVuZHBvaW50RGVzY3JpcHRpb246IENhbiBub3QgZG8gYSBnZXRQb3J0IG9uIGEgcG9ydCBhZGRlZCB2aWEgYWRkUG9ydCgpLiAgUG9ydFFOOiB7MH0KLXVwZGF0ZUVQRGVzY3JFcnIyPVNlcnZpY2VEZXNjcmlwdGlvbi51cGRhdGVFbmRwb2ludERlc2NyaXB0aW9uOiBDYW4gbm90IGRvIGEgZ2V0UG9ydCB3aXRoIGEgbnVsbCBTRUkuICBQb3J0UU46IHswfQotdXBkYXRlRVBEZXNjckVycjM9U2VydmljZURlc2NyaXB0aW9uLnVwZGF0ZUVuZHBvaW50RGVzY3JpcHRpb246IENhbid0IGRvIGEgZ2V0UG9ydCgpIHNwZWNpZml5aW5nIGEgZGlmZmVyZW50IFNFSSB0aGFuIHRoZSBwcmV2aW91cyBnZXRQb3J0KCkuICBQb3J0UU46IHswfTsgY3VycmVudCBTRUk6IHsxfTsgcHJldmlvdXMgU0VJOiB7Mn0KLWRiY2xJbnRlZ3JpdHlFcnI9VmFsaWRhdGlvbiBwaGFzZSAxIGZhaWx1cmU6IHswfTsgRmFpbGluZyBjb21wb3NpdGU6IHsxfQotdmFsaWRhdGVJbnRlZ3JpdHlFcnIxPVZhbGlkYXRpb24gZXJyb3I6IFRoaXMgaXMgYSBQcm92aWRlciBiYXNlZCBlbmRwb2ludCB0aGF0IGRvZXMgbm90IGNvbnRhaW4gYSBXZWJTZXJ2aWNlUHJvdmlkZXIgYW5ub3RhdGlvbi4gIFByb3ZpZGVyIGNsYXNzOiB7MH0KLXZhbGlkYXRlSW50ZWdyaXR5RXJyMj1WYWxpZGF0aW9uIGVycm9yOiBXZWJTZXJ2aWNlIGFubm90YXRpb24gYW5kIFdlYlNlcnZpY2VQcm92aWRlciBhbm5vdGF0aW9uIGNhbm5vdCBjb2V4aXN0LiAgSW1wbGVtZW50YXRpb24gY2xhc3M6IHswfQotdmFsaWRhdGVJbnRlZ3JpdHlFcnIzPVZhbGlkYXRpb24gZXJyb3I6IFRoaXMgaXMgYSBQcm92aWRlciB0aGF0IGRvZXMgbm90IHNwZWNpZnkgYSB2YWxpZCBQcm92aWRlciBpbnRlcmZhY2UuICAgSW1wbGVtZW50YXRpb24gY2xhc3M6IHswfQotdmFsaWRhdGVJbnRlZ3JpdHlFcnI0PVZhbGlkYXRpb24gZXJyb3I6IFByb3ZpZGVyIG11c3QgaGF2ZSBhIHB1YmxpYyBkZWZhdWx0IGNvbnN0cnVjdG9yLiAgSW1wbGVtZW50YXRpb24gY2xhc3M6IHswfQotdmFsaWRhdGVJbnRlZ3JpdHlFcnI1PVZhbGlkYXRpb24gZXJyb3I6IFByb3ZpZGVyIG11c3QgaGF2ZSBhIHB1YmxpYyBpbnZva2UgbWV0aG9kLiAgSW1wbGVtZW50YXRpb24gY2xhc3M6IHswfQotdmFsaWRhdGVJbnRlZ3JpdHlFcnI2PVZhbGlkYXRpb24gZXJyb3I6IFNlcnZpY2VNb2RlIGFubm90YXRpb24gY2FuIG9ubHkgYmUgc3BlY2lmaWVkIGZvciBXZWJTZXJ2aWNlUHJvdmlkZXIuICAgSW1wbGVtZW50YXRpb24gY2xhc3M6IHswfQotdmFsaWRhdGVJbnRlZ3JpdHlFcnI3PVZhbGlkYXRpb24gZXJyb3I6IGNhbm5vdCBmaW5kIFdTREwgRGVmaW5pdGlvbiBzcGVjaWZpZWQgYnkgdGhpcyBXZWJTZXJ2aWNlIGFubm90YXRpb24uIEltcGxlbWVudGF0aW9uIGNsYXNzOiB7MH07IFdTREwgbG9jYXRpb246IHsxfQotdmFsaWRhdGVJbnRlZ3JpdHlFcnI4PVZhbGlkYXRpb24gZXJyb3I6IGNhbm5vdCBmaW5kIFNFSSBzcGVjaWZpZWQgYnkgdGhlIFdlYlNlcnZpY2UuZW5kcG9pbnRJbnRlcmZhY2UuICBJbXBsZW1lbnRhaXRvbiBjbGFzczogezB9OyBFbmRwb2ludEludGVyZmFjZTogezF9Ci12YWxpZGF0ZUludGVncml0eUVycjk9VmFsaWRhdGlvbiBlcnJvcjogaW52YWxpZCBhbm5vdGF0aW9ucyBzcGVjaWZpZWQgd2hlbiBXZWJTZXJ2aWNlIGFubm90YXRpb24gc3BlY2lmaWVzIGFuIGVuZHBvaW50IGludGVyZmFjZS4gIEltcGxlbW50YXRpb24gY2xhc3M6IHswfQotdmFsaWRhdGVJbnRlZ3JpdHlFcnIxMD1WYWxpZGF0aW9uIGVycm9yOiBXZWJTZXJ2aWNlLm5hbWUgbXVzdCBub3QgYmUgc3BlY2lmaWVkIHdoZW4gdGhlIGJlYW4gc3BlY2lmaWVzIGFuIGVuZHBvaW50IGludGVyZmFjZS4gIEltcGxlbnRhdGlvbiBjbGFzczogezB9OyBXZWJTZXJ2aWNlLm5hbWU6IHsxfQotdmFsaWRhdGVJbnRlZ3JpdHlFcnIxMT1WYWxpZGF0aW9uIGVycm9yOiBXZWJNZXRob2QgYW5ub3RhdGlvbnMgY2Fubm90IGV4aXN0IG9uIGltcGxlbnRhdGlvbiB3aGVuIFdlYlNlcnZpY2UuZW5kcG9pbnRJbnRlcmZhY2UgaXMgc2V0LiAgSW1wbGVtZW50YXRpb24gY2xhc3M6IHswfQotdmFsaWRhdGVJbnRlZ3JpdHlFcnIxMj1WYWxpZGF0aW9uIGVycm9yOiBJbXByb3BlciB1c2FnZTogY2Fubm90IGludm9rZSB0aGlzIG1ldGhvZCB3aXRoIGFuIGludGVyZmFjZS4gIEltcGxlbWVudGF0aW9uIGNsYXNzOiB7MH0KLXZhbGlkYXRlSW50ZWdyaXR5RXJyMTM9VmFsaWRhdGlvbiBlcnJvcjogVW5zdXBwb3J0ZWQgU09BUEJpbmRpbmcgYW5ub3RhdGlvbiB2YWx1ZS4gVGhlIEVOQ09ERUQgc2V0dGluZyBpcyBub3Qgc3VwcG9ydGVkIGZvciBTT0FQQmluZGluZy5Vc2UuIEltcGxlbWVudGF0aW9uIGNsYXNzOiB7MH0KLXZhbGlkYXRlUElzRXJyMT1WYWxpZGF0aW9uIGVycm9yOiBTT0FQTWVzc2FnZSBhbmQgRGF0YVNvdXJjZSBvYmplY3RzIGNhbm5vdCBiZSB1c2VkIHdoZW4gU2VydmljZU1vZGUgc3BlY2lmaWVzIFBBWUxPQUQuIEltcGxlbWVudGF0aW9uIGNsYXNzOiB7MH0KLXZhbGlkYXRlUElzRXJyMj1WYWxpZGF0aW9uIGVycm9yOiBTT0FQTWVzc2FnZSBvYmplY3RzIGNhbm5vdCBiZSB1c2VkIHdpdGggSFRUUCBiaW5kaW5nIHR5cGUuIEltcGxlbWVudGF0aW9uIGNsYXNzOiB7MH0KLXZhbGlkYXRlUElzRXJyMz1WYWxpZGF0aW9uIGVycm9yOiBEYXRhU291cmNlIG9iamVjdHMgbXVzdCBiZSB1c2VkIHdpdGggSFRUUCBiaW5kaW5nIHR5cGUuIEltcGxlbWVudGF0aW9uIGNsYXNzOiB7MH0KLXZhbGlkYXRlSW1wbEVycj1WYWxpZGF0aW9uIGVycm9yOiBJbXBsZW1lbnRhdGlvbiBzdWJjbGFzcyBkb2VzIG5vdCBpbXBsZW1lbnQgbWV0aG9kIG9uIHNwZWNpZmllZCBpbnRlcmZhY2UuICBJbXBsZW1lbnRhdGlvbiBjbGFzczogezB9OyBtaXNzaW5nIG1ldGhvZCBuYW1lOiB7MX07IGVuZHBvaW50SW50ZXJmYWNlOiB7Mn0KLXZhbGlkYXRlTWV0aG9kUGFyYW1FcnIxPVZhbGlkYXRpb24gZXJyb3I6IFNFSSBpbmRpY2F0ZXMgbm8gcGFyYW1ldGVycyBidXQgaW1wbGVtZW50YXRpb24gbWV0aG9kIHNwZWNpZmllcyBwYXJhbWV0ZXJzOiB7MH07IEltcGxlbWVudGF0aW9uIGNsYXNzOiB7MX07IE1ldGhvZCBuYW1lOiB7Mn07IEVuZHBvaW50IEludGVyZmFjZTogezN9Ci12YWxpZGF0ZU1ldGhvZFBhcmFtRXJyMj1WYWxpZGF0aW9uIGVycm9yOiBTRUkgaW5kaWNhdGVzIHBhcmFtZXRlcnMgezB9IGJ1dCBpbXBsZW1lbnRhdGlvbiBtZXRob2Qgc3BlY2lmaWVzIG5vIHBhcmFtZXRlcnM7IEltcGxlbWVudGF0aW9uIGNsYXNzOiB7MX07IE1ldGhvZCBuYW1lOiB7Mn07IEVuZHBvaW50IEludGVyZmFjZTogezN9Ci12YWxpZGF0ZU1ldGhvZFBhcmFtRXJyMz1WYWxpZGF0aW9uIGVycm9yOiBUaGUgbnVtYmVyIG9mIHBhcmFtZXRlcnMgb24gdGhlIFNFSSBtZXRob2QgKHswfSkgZG9lcyBub3QgbWF0Y2ggdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzIG9uIHRoZSBpbXBsZW1lbnRhdGlvbiAoezF9KTsgSW1wbGVtZW50YXRpb24gY2xhc3M6IHsyfTsgTWV0aG9kIG5hbWU6IHszfTsgRW5kcG9pbnQgSW50ZXJmYWNlOiB7NH0KLXZhbGlkYXRlTWV0aG9kUlZFcnIxPVZhbGlkYXRpb24gZXJyb3I6IFNFSSBpbmRpY2F0ZXMgbm8gcmV0dXJuIHZhbHVlIGJ1dCBpbXBsZW1lbnRhdGlvbiBtZXRob2Qgc3BlY2lmaWVzIHJldHVybiB2YWx1ZTogezB9OyBJbXBsZW1lbnRhdGlvbiBjbGFzczogezF9OyBNZXRob2QgbmFtZTogezJ9OyBFbmRwb2ludCBJbnRlcmZhY2U6IHszfQotdmFsaWRhdGVNZXRob2RSVkVycjI9VmFsaWRhdGlvbiBlcnJvcjogU0VJIGluZGljYXRlcyByZXR1cm4gdmFsdWUgezB9IGJ1dCBpbXBsZW1lbnRhdGlvbiBtZXRob2Qgc3BlY2lmaWVzIG5vIHJldHVybiB2YWx1ZTsgSW1wbGVtZW50YXRpb24gY2xhc3M6IHsxfTsgTWV0aG9kIG5hbWU6IHsyfTsgRW5kcG9pbnQgSW50ZXJmYWNlOiB7M30KLXZhbGlkYXRlTWV0aG9kUlZFcnIzPVZhbGlkYXRpb24gZXJyb3I6IFNFSSByZXR1cm4gdmFsdWUgezB9IGRvZXMgbm90IG1hdGNoIGltcGxlbWVudGF0aW9uIG1ldGhvZCByZXR1cm4gdmFsdWUgezF9OyBJbXBsZW1lbnRhdGlvbiBjbGFzczogezJ9OyBNZXRob2QgbmFtZTogezN9OyBFbmRwb2ludCBJbnRlcmZhY2U6IHs0fQotdmFsaWRhdGVNZXRob2RFeGNlcHRpb25FcnIxPVZhbGlkYXRpb24gZXJyb3I6IEltcGxlbWVudGF0aW9uIG1ldGhvZCBzaWduYXR1cmUgaGFzIG1vcmUgY2hlY2tlZCBleGNlcHRpb25zIHRoYW4gU0VJIG1ldGhvZCBzaWduYXR1cmUgKDApOiBJbXBsZW1lbnRhdGlvbiBjbGFzczogezB9OyBtZXRob2QgbmFtZTogezF9OyBlbmRwb2ludEludGVyZmFjZTogezJ9Ci12YWxpZGF0ZU1ldGhvZEV4Y2VwdGlvbkVycjI9VmFsaWRhdGlvbiBlcnJvcjogSW1wbGVtZW50YXRpb24gbWV0aG9kIHNpZ25hdHVyZSBoYXMgbW9yZSBjaGVja2VkIGV4Y2VwdGlvbnMgKHswfSkgdGhhbiBTRUkgbWV0aG9kIHNpZ25hdHVyZSAoezF9KTogSW1wbGVtZW50YXRpb24gY2xhc3M6IHsyfTsgbWV0aG9kIG5hbWU6IHszfTsgZW5kcG9pbnRJbnRlcmZhY2U6IHs0fQotdmFsaWRhdGVNZXRob2RFeGNlcHRpb25FcnIzPVZhbGlkYXRpb24gZXJyb3I6IEltcGxlbWVudGF0aW9uIG1ldGhvZCBzaWduYXR1cmUgdGhyb3dzIGV4Y2VwdGlvbiB7MH0gd2hpY2ggaXMgbm90IGRlY2xhcmVkIG9uIHRoZSBTRUkgbWV0aG9kIHNpZ25hdHVyZTogSW1wbGVtZW50YXRpb24gY2xhc3M6IHsxfTsgbWV0aG9kIG5hbWU6IHsyfTsgZW5kcG9pbnRJbnRlcmZhY2U6IHszfQotdmFsaWRhdGVTRUlFcnIxPVZhbGlkYXRpb24gZXJyb3I6IFNFSSBkb2VzIG5vdCBjb250YWluIGEgV2ViU2VydmljZSBhbm5vdGF0aW9uLiAgSW1wbGVtZW50YXRpb24gY2xhc3M6IHswfTsgU0VJOiB7MX0KLXZhbGlkYXRlU0VJRXJyMj1WYWxpZGF0aW9uIGVycm9yOiBTRUkgbXVzdCBub3Qgc2V0IGEgdmFsdWUgZm9yIEBXZWJTZXJ2aWNlLmVuZHBvaW50SW50ZXJmYWNlLiAgSW1wbGVtZW50YXRpb24gY2xhc3M6IHswfTsgU0VJOiB7MX07IEludmFsaWQgZW5kcG9pbnRJbnRlcmZhY2UgdmFsdWU6IHsyfQotdmFsaWRhdGVTRUlFcnIzPVZhbGlkYXRpb24gZXJyb3I6IFVuc3VwcG9ydGVkIFNPQVBCaW5kaW5nIGFubm90YXRpb24gdmFsdWUuIFRoZSBFTkNPREVEIHNldHRpbmcgaXMgbm90IHN1cHBvcnRlZCBmb3IgU09BUEJpbmRpbmcuVXNlLiBJbXBsZW1lbnRhdGlvbiBjbGFzczogezB9Ci1oYW5kbGVyQ2hhaW5FcnI9RW5kcG9pbnREZXNjcmlwdGlvbkltcGw6IGdldEhhbmRsZXJDaGFpbjogdGhyb3duIHdoZW4gYXR0ZW1wdGluZyB0byB1bm1hcnNoYWxsIEpBWEIgY29udGVudC4KLWNyZWF0ZURpc3BhdGNoRmFpbDM9U2VydmljZURlc2NyaXB0aW9uLnVwZGF0ZUVuZHBvaW50RGVzY3JpcHRpb246IENhbiBub3Qgc3BlY2lmeSBhbiBTRUkgd2hlbiBjcmVhdGluZyBhIERpc3BhdGNoLiBQb3J0UU46IHswfQotcm9sZVZhbGlkYXRpb0Vycj1UaGUgcm9sZSBvZiAnbm9uZScgaXMgbm90IGFsbG93ZWQuCi10aHJlYWRDbHNMb2FkZXJFcnI9QXR0ZW1waW5nIHRvIHVzZSBDbGFzc0xvYWRlciBvZiB0eXBlIHswfSwgd2hpY2ggaXMgaW5jb21wYXRpYmxlIHdpdGggY3VycmVudCBDbGFzc0xvYWRlciBvZiB0eXBlIHsxfQotZ2V0RXJyPVRoZSB0YXNrIHdhcyBjYW5jZWxsZWQuCi1nZXRFcnIxPVRoZSBjbGllbnQgdGltZWQgb3V0IHdoaWxlIHdhaXRpbmcgZm9yIGFuIGFzeW5jaHJvbm91cyByZXNwb25zZS4KLXByb2Nlc3NSZXNwRXJyPW51bGwgcmVzcG9uc2UuCi1hZGRQcm9wZXJ0aWVzRXJyPVVuYWJsZSB0byBjb252ZXJ0IFdTREwgbG9jYXRpb24gVVJMIHRvIFVSSS4gIFVSTDogezB9OyBTZXJ2aWNlOiB7MX0KLWludm9rZUFzeW5jRXJyPUEgY2xpZW50IG91dGJvdW5kIGhhbmRsZXIgY2F1c2UgYSBtZXNzYWdlIGZsb3cgZGlyZWN0aW9uIHJldmVyc2FsLiAgVGhpcyBjYXNlIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQuCi1jRmF1bHRNc2dFcnI9V2Ugb25seSBzdXBwb3J0IFNPQVAxMSBhbmQgU09BUDEyIGZvciBKQVhXUyBoYW5kbGVycy4KLWdldEhlYWRlcnNFcnI9SW52YWxpZCBRTmFtZSwgUU5hbWUgY2Fubm90IGJlIG51bGwuCi1nZXRIZWFkZXJzRXJyMT1JbnZhbGlkIEpBWEJDb250ZXh0LiBKQVhCQ29udGV4dCBjYW5ub3QgYmUgbnVsbC4KLWlucHV0Q29udmVydGlvbkVycj1DYW5ub3QgY29udmVydCBmcm9tIHswfSB0byBMaXN0PFN0cmluZz4uCi1pbnB1dENvbnZlcnRpb25FcnIxPUNhbm5vdCBjb252ZXJ0IGZyb20gIHswfSB0byBTdHJpbmcuCi1wZEVsZW1lbnRFcnI9U1dBUkVGIGFuZCBNVE9NIGF0dGFjaG1lbnQgcGFyYW1ldGVycyBhcmUgbm90IHN1cHBvcnRlZCBpbiB0aGlzIHN0eWxlL3VzZS4KLW1zZ0Zyb21Nc2dFcnI9RXJyb3Igb2NjdXJyZWQgd2hpbGUgY3JlYXRpbmcgdGhlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBpbmNvbWluZyBtZXNzYWdlLgotcFR5cGVFcnI9UHJvdmlkZXIgY2Fubm90IGhhdmUgbW9yZSB0aGFuIG9uZSBHZW5lcmljIFR5cGVzIGRlZmluZWQgcGVyIEpBWC1XUyBTcGVjaWZpY2F0aW9uLgotYkZhY3RvcnlFcnI9VW5leHBlY3RlZCBFcnJvci4gVW5hYmxlIHRvIGZpbmQgQmxvY2tGYWN0b3J5IGZvciB0eXBlOiB7MH0KLWluaXRFcnI9VGhlIGltcGxlbWVudG9yIG9iamVjdCBjYW5ub3QgYmUgbnVsbC4KLWluamVjdE9uQ2xzRXJyPVdlYlNlcnZpY2VDb250ZXh0IEluamVjdGlvbiBvbiBhIENsYXNzIGlzIG5vdCBzdXBwb3J0ZWQuCi1vcHJEZXNjckVycj1ObyBvcGVyYXRpb24gZm91bmQuICBXU0RMIE9wZXJhdGlvbiBuYW1lOiB7MH0KLW9wckRlc2NyRXJyMT1Nb3JlIHRoYW4gb25lIG9wZXJhdGlvbiBmb3VuZC4gT3ZlcmxvYWRlZCBXU0RMIG9wZXJhdGlvbnMgYXJlIG5vdCBzdXBwb3J0ZWQuICBXU0RMIE9wZXJhdGlvbiBuYW1lOiB7MH0KLWludm9rZUVycj1ObyBkaXNwYXRjaGVyIGZvdW5kLgotbnVsbE1zZ0N0eEVycj1UaGUgTWVzc2FnZUNvbnRleHQgaXMgbnVsbC4gIFRoaXMgaXMgYW4gdW5leHBlY3RlZCBjb25kaXRpb24gdGhhdCBvY2N1cnJlZCBkdXJpbmcgYXBwbGljYXRpb24gcHJvcGVydHkgbWlncmF0aW9uLgotcG9ydEVycj1VbmFibGUgdG8gZ2V0UG9ydCBmb3IgcG9ydCBRTmFtZSB7MH0KLXBvcnRFcnIxPVVuYWJsZSB0byBsb2FkIHByb3h5IGNsYXNzZXMuCi1wRGVzY3JFcnI9TnVsbCBEZXNjcmlwdG9yLiBQcm9wZXJ0eURlc2NyaXB0b3Igbm90IGZvdW5kLgotcERlc2NyRXJyMj1ObyByZWFkIE1ldGhvZCBmb3VuZCB0byByZWFkIHByb3BlcnR5IFZhbHVlIGZyb20gamF4Yk9iamVjdDogezB9IAotcmVzdFdpdGhTT0FQRXJyPUV4cGVjdGVkIGFuIFhNTCBvdmVyIEhUVFAgbWVzc2FnZSwgYnV0IHRoZSBtZXNzYWdlIGFwcGVhcnMgdG8gYmUgYSBTT0FQIG1lc3NhZ2UuICBUaGUgbmFtZXNwYWNlIGlzIHswfQotbm9EYXRhSGFuZGxlcj1BIGRhdGEgaGFuZGxlciB3YXMgbm90IGZvdW5kIGZvciBjb250ZW50IGlkIHswfQotRGVzY3JpcHRpb25CdWlsZGVyRXJyMT1VbmFibGUgdG8gY3JlYXRlIGNvbXBvc2l0ZSBhbm5vdGF0aW9uIHswfSBkdWUgdG8gZXhjZXB0aW9uIHsxfQotRGVzY3JpcHRpb25CdWlsZGVyRXJyMj1VbmFibGUgdG8gY3JlYXRlIHNwYXJzZSBhbm5vdGF0aW9uIHswfSBmcm9tIGJhc2UgYW5ub3RhdGlvbiB7MX0KLXNlcnZpY2VEZXNjRXJyND1VbmFibGUgdG8gYWNjZXNzIHdzZGxMb2NhdGlvbiB7MH0KLXNlcnZpY2VEZXNjRXJyNT1UaGUgZHluYW1pYyBwb3J0IHswfSBjYW4gbm90IHNwZWNpZnkgYSBzcGFyc2UgY29tcG9zaXRlLgotc2VydmljZURlc2NFcnI2PUNhbiBub3Qgc3BlY2lmeSBhIHNwYXJzZSBjb21wb3NpdGUgd2hlbiBjYWxsaW5nIFNlcnZpY2UuY3JlYXRlRGlzcGF0Y2guCi1lbmRwb2ludERlc2NFcnIxPUF4aXNTZXJ2aWNlOiB7MH0gZG9lcyBub3QgY29udGFpbiBhIFNlcnZpY2UgRGVzY3JpcHRpb24KLWNvbnZlcnRVdGlscz1DYW5ub3QgY29udmVydCBmcm9tICB7MH0gdG8gezF9LiAgQ2hlY2sgeW91ciBhcHBsaWNhdGlvbiBmb3IgbWlzbWF0Y2hlZCBjbGFzc2VzLgotc2VydmljZURlbGVnYXRlTm9Qb3J0PUNvdWxkIG5vdCBmaW5kIHRoZSBwb3J0IGZvciBFbmRwb2ludFJlZmVyZW5jZSB7MCkKLXNlcnZpY2VEZWxlZ2F0ZVByb3h5RXJyb3I9VW5hYmxlIHRvIGxvYWQgcHJveHkgY2xhc3NlcyBkdWUgdG8gdGhlIGZvbGxvd2luZyBleGNlcHRpb246IHswfQotc29hcE1lc3NhZ2VDb250ZXh0RXJyMT1JbGxlZ2FsIGFyZ3VtZW50IGVuY291bnRlcmVkLiBUaGUgcW5hbWUgYXJndW1lbnQgZm9yIFNPQVBNZXNzYWdlQ29udGV4dC5nZXRIZWFkZXJzIGlzIG51bGwuCi1zaW5nbGVUaHJlYWRlZEV4ZWN1dG9yRXJyMT1UaGUgUnVubmFibGUgY29tbWFuZCBwcm92aWRlZCB0byB0aGUgU2luZ2xlVGhyZWFkZWRFeGVjdXRvciB3YXMgbnVsbC4gIEEgbm9uLW51bGwgaW5zdGFuY2UgaXMgcmVxdWlyZWQuCi1zZXJ2aWNlRGVzY3JpcHRpb25JbXBsQWRkUG9ydEVycj1BbiBhdHRlbXB0IHdhcyBtYWRlIHRvIGFkZCBhIHBvcnQgd2l0aCBubyBTZXJ2aWNlRGVsZWdhdGUuCi1zZXJ2aWNlRGVzY3JpcHRpb25JbXBsVmFsaWRhdGlvbkVycj1WYWxpZGF0aW9uIGVycm9yOiBTRUkgYW5kIGltcGxlbWVudGF0aW9uIHBhcmFtZXRlcnMgZG8gbm90IG1hdGNoLiAgUGFyYW1ldGVyIG51bWJlciB7MH0gb24gdGhlIFNFSSBpcyB7MX0uICBPbiB0aGUgaW1wbGVtZW50YXRpb24gaXQgaXMgezJ9LiAgVGhlIGltcGxlbWVudGF0aW9uIGNsYXNzIGlzIHszfSwgdGhlIG1ldGhvZCBuYW1lIGlzIHs0fSwgYW5kIHRoZSBlbmRwb2ludCBpbnRlcmZhY2UgbmFtZSBpcyB7NX0uCi1yZXNwZWN0QmluZGluZ05vdFNwZWNpZmllZD1UaGUgUmVzcGVjdEJpbmRpbmcgZmVhdHVyZSB3YXMgbm90IHNwZWNpZmllZC4KLWNyZWF0ZUhhbmRsZXJJbnN0YW5jZUVycj1UaGUgY3JlYXRlSGFuZGxlckluc3RhbmNlIG1ldGhvZCB3YXMgaW52b2tlZCB3aXRob3V0IGEgSGFuZGxlciBjbGFzcy4KLWRlc3Ryb3lIYW5kbGVySW5zdGFuY2VFcnI9VGhlIGRlc3Ryb3lIYW5kbGVySW5zdGFuY2UgbWV0aG9kIHdhcyBpbnZva2VkIHdpdGhvdXQgYSBIYW5kbGVyIGNsYXNzLgotZW5kcG9pbnREZXNjcmlwdGlvblZhbGlkYXRpb249VGhlcmUgaXMgYSBtaXNtYXRjaCBiZXR3ZWVuIHRoZSB3c2RsIGFuZCBhbm5vdGF0aW9uIGluZm9ybWF0aW9uLiAgUGxlYXNlIG1ha2Ugc3VyZSBib3RoIHVzZSB0aGUgc2FtZSBiaW5kaW5nIG5hbWVzcGFjZS4gIFRoZSB3c2RsIGlzIHswfS4gIFRoZSBhbm5vdGF0aW9uIGlzIHsxfS4KLWxvYWRIYW5kbGVyQ2hhaW5FcnI9VGhlIGZvbGxvd2luZyBlcnJvciBvY2N1cnJlZCB3aGlsZSBsb2FkaW5nIHRoZSBoYW5kbGVyIGNoYWluOiB7MH0KLWVuZHBvaW50RGVzY3JpcHRpb25WYWxpZGF0aW9uRXJyb3JzPVRoZSBFbmRwb2ludCB2YWxpZGF0aW9uIGZhaWxlZCB0byB2YWxpZGF0ZSBkdWUgdG8gdGhlIGZvbGxvd2luZyBlcnJvcnM6IHswfQotc2VydmljZU5hbWVNaXNtYXRjaD1UaGUgc2VydmljZSBuYW1lIG9mIHRoZSBlbmRwb2ludCByZWZlcmVuY2UgezB9IGRvZXMgbm90IG1hdGNoIHRoZSBzZXJ2aWNlIG5hbWUgb2YgdGhlIHNlcnZpY2UgY2xpZW50IHsxfS4KLXVwZGF0ZUVuZHBvaW50RXJyb3I9VGhlIGZvbGxvd2luZyBlcnJvciBvY2N1cnJlZCB3aGlsZSB1cGRhdGluZyB0aGUgZW5kcG9pbnQ6IHswfQotREJVQ2xhc3NOb3RGb3VuZD1UaGUgY2xhc3MsIHswfSwgY291bGQgbm90IGJlIGZvdW5kIHdpdGggY2xhc3Nsb2FkZXIgezF9LgotREJVQ2xhc3NOb3RGb3VuZDI9VGhlIGNsYXNzLCB7MH0sIGNvdWxkIG5vdCBiZSBmb3VuZCB3aXRoIHRoZSBjdXJyZW50IGNsYXNzbG9hZGVyLgotV1NETFJlbGF0aXZlRXJyMT1UaGUgcmVsYXRpdmUgbG9jYXRpb24gezB9IGNvdWxkIG5vdCBiZSByZXNvbHZlZC4gIFRoZSBwYXJlbnQgbG9jYXRpb24gaXMgezF9LiAgVGhlIHJlcG9ydGVkIGVycm9yIGlzIHsyfQotV1NETFJlbGF0aXZlRXJyMj1UaGUgcmVsYXRpdmUgbG9jYXRpb24gezB9IGNvdWxkIG5vdCBiZSByZXNvbHZlZC4gIFRoZSBwYXJlbnQgbG9jYXRpb24gaXMgezF9LgotTWlzc2luZ1NlcnZpY2VOYW1lPVRoZSBzZXJ2aWNlIG5hbWUgezB9IHdhcyBub3QgZm91bmQgaW4gdGhpcyB3c2RsIHsxfS4KLU1pc3NpbmdQb3J0TmFtZT1UaGUgcG9ydCBuYW1lIHswfSB3YXMgbm90IGZvdW5kIGluIHRoaXMgd3NkbCB7MX0uCi1GZWF0dXJlTmFtZXNwYWNlTm90U3VwcG9ydGVkPVRoZSBuYW1lc3BhY2Ugb2YgdGhpcyBmZWF0dXJlIHswfSBpcyBub3Qgc3VwcG9ydGVkLgotQWRkcmVzc2luZ0VuZ2FnZW1lbnRFcnJvcj1UaGUgZm9sbG93aW5nIGVycm9yIG9jY3VycmVkIHdoaWxlIGVuZ2FnaW5nIHRoZSBhZGRyZXNzaW5nIG1vZHVsZTogezB9Ci1Ob1dTQWRkcmVzc2luZ0ZlYXR1cmVzPU5vIFdTLUFkZHJlc3NpbmcgZmVhdHVyZXMgd2VyZSBzcGVjaWZpZWQuCi1lbmRwb2ludFFOYW1lU2V0RXJyb3I9IFRoZSBlbmRwb2ludCBxbmFtZSB7MH0gY2Fubm90IGJlIHNldCBiZWZvcmUgdGhlIHNlcnZpY2UgcW5hbWUuCi1yZWZlcmVuY2VQYXJhbWV0ZXJOdWxsRXJyPVRoZSByZWZlcmVuY2UgcGFyYW1ldGVyIG11c3QgYmUgc2V0LgotcmVmZXJlbmNlUHJvcGVydHlOdWxsRXJyPVRoZSByZWZlcmVuY2UgcHJvcGVydHkgbXVzdCBiZSBzZXQuCi1tZXRhRGF0YVBhcmFtZXRlck51bGxFcnI9VGhlIG1ldGEgZGF0YSBlbGVtZW50IHBhcmFtZXRlciBtdXN0IGJlIHNldC4KLWpheGJDb250ZXh0RmFpbHVyZT1UaGUgSkFYQkNvbnRleHQgY291bGQgbm90IGJlIGNvbnN0cnVjdGVkIGR1ZSB0byB0aGUgZm9sbG93aW5nIGVycm9yOiB7MH0KLWVuZHBvaW50UmVmQ29uc3RydWN0aW9uRmFpbHVyZT1VbmFibGUgdG8gY3JlYXRlIHRoZSBXM0MgZW5kcG9pbnQgcmVmZXJlbmNlIGR1ZSB0byB0aGUgZm9sbG93aW5nIGVycm9yIHswfQotZW5kcG9pbnRSZWZDb25zdHJ1Y3Rpb25GYWlsdXJlMj1VbmFibGUgdG8gY3JlYXRlIHRoZSBzdWJtaXNzaW9uIGVuZHBvaW50IHJlZmVyZW5jZSBkdWUgdG8gdGhlIGZvbGxvd2luZyBlcnJvciB7MH0KLWVuZHBvaW50UmVmQ29uc3RydWN0aW9uRmFpbHVyZTM9VW5hYmxlIHRvIGNyZWF0ZSB0aGUgZW5kcG9pbnQgcmVmZXJlbmNlIGR1ZSB0byB0aGUgZm9sbG93aW5nIGVycm9yIHswfQotZW5kcG9pbnRSZWZlcmVuY2VXcml0ZUVycm9yMT1UaGUgdHJhbnNmb3JtIFJlc3VsdCBvYmplY3QgaXMgbnVsbC4gIFRoZSB3cml0ZVRvKCkgbWV0aG9kIGNhbm5vdCBjb250aW51ZS4KLWVuZHBvaW50UmVmZXJlbmNlV3JpdGVFcnJvcjI9VGhlIFczQyBlbmRwb2ludCByZWZlcmVuY2Ugd3JpdGVUbygpIG1ldGhvZCBmYWlsZWQgZHVlIHRvIHRoZSBmb2xsb3dpbmcgZXJyb3I6IHswfQotbXRvbVRocmVzaG9sZEVycj1NVE9NIHRocmVzaG9sZCBzaXplIGNhbm5vdCBiZSBsZXNzIHRoYW4gemVyby4gSXQgd2FzIHswfQotbXRvbUZlYXR1cmVFcnI9VGhlIE1UT01GZWF0dXJlIHdhcyBub3Qgc3BlY2lmaWVkLgotbXRvbUFubm90YXRpb25FcnI9VGhlIEBNVE9NIGFubm90YXRpb24gd2FzIG5vdCBzcGVjaWZpZWQuCi1iaW5kaW5nUHJvdmlkZXJFcnIxPUJpbmRpbmdQcm92aWRlciBoYXMgYmVlbiBjb2ZpZ3VyZWQgZm9yIG5hbWVzcGFjZSB7MH0sIGJ1dCBhIHJlcXVlc3QgaGFzIGJlZW4gbWFkZSBmb3IgbmFtZXNwYWNlIHsxfS4KLWJpbmRpbmdNZXRob2ROb3RTdXBwb3J0ZWQ9VGhlIG1ldGhvZCB7MH0gaXMgbm90IHN1cHBvcnRlZCBmb3IgdGhlIGN1cnJlbnQgYmluZGluZzogezF9Ci13ZWJTZXJ2aWNlQ29udGV4dEVycjE9VGhlIE1lc3NhZ2VDb250ZXh0IG9iamVjdCBpcyBub3QgYXZhaWxhYmxlLgotaW52YWxpZEVuZHBvaW50UmVmZXJlbmNlPUFuIGVuZHBvaW50IHJlZmVyZW5jZSBpcyBpbnZhbGlkLiAgVGhlIHJlcG9ydGVkIGVycm9yIGlzOiB7MH0KLWRpc3BhdGNoTm9FbmRwb2ludFJlZmVyZW5jZT1BbiBhdHRlbXB0IHdhcyBtYWRlIHRvIHBlcmZvcm0gYSBjcmVhdGVEaXNwYXRjaCB3aXRob3V0IGFuIGVuZHBvaW50IHJlZmVyZW5jZS4KLWRpc3BhdGNoTm9FbmRwb2ludFJlZmVyZW5jZTI9QW4gYXR0ZW1wdCB3YXMgbWFkZSB0byBwZXJmb3JtIGEgZ2V0UG9ydCB3aXRob3V0IGFuIGVuZHBvaW50IHJlZmVyZW5jZS4KLWVuZHBvaW50RGVzY3JpcHRpb25Db25zdHJ1Y3Rpb25GYWlsdXJlPVRoZSBjcmVhdGVEaXNwYXRjaCBtZXRob2Qgd2FzIHVuYWJsZSB0byBjcmVhdGUgYW4gZW5kcG9pbnQgZGVzY3JpcHRpb24gZm9yIGVuZHBvaW50IHJlZmVyZW5jZSB7MH0KLWludmFsaWRXU0Fubm90YXRpb249SW52YWxpZCBvciB1bnN1cHBvcnRlZCBXZWJTZXJ2aWNlRmVhdHVyZSBhbm5vdGF0aW9uIHswfQotaW52YWxpZFdTRmVhdHVyZT1JbnZhbGlkIG9yIHVuc3VwcG9ydGVkIFdlYlNlcnZpY2VGZWF0dXJlIGZlYXR1cmUgezB9Ci1yZWZlcmVuY2VQYXJhbWV0ZXJDb25zdHJ1Y3Rpb25FcnI9QSBwcm9ibGVtIG9jY3VyZWQgZHVyaW5nIHRoZSBidWlsZGluZyBvZiB0aGUgcmVmZXJlbmNlIHBhcmFtZXRlciBsaXN0LiBTZWUgdGhlIG5lc3RlZCBleGNlcHRpb24gZm9yIGRldGFpbHMuCi1lbmRwb2ludFVwZGF0ZUVycm9yPUFuIGVycm9yIG9jY3VycmVkIGR1cmluZyB0aGUgZW5kcG9pbnQgdXBkYXRlCi1lbmRwb2ludFJlZkNyZWF0aW9uRXJyb3I9QW4gZXJyb3Igb2NjdXJyZWQgZHVyaW5nIHRoZSBjcmVhdGlvbiBvZiBhbiBlbmRwb2ludCByZWZlcmVuY2UuCi1tdG9tQXR0YWNoRXJyPVVuYWJsZSB0byBkZXRlcm1pbmUgdGhlIHNpemUgb2YgdGhlIGF0dGFjaG1lbnQKLW10b21FbmFibGVFcnI9VW5hYmxlIHRvIGVuYWJsZSBtdG9tLgotbWlzc2luZ0ludm9jYXRpb25Db250cm9sbGVyPUFuIGludm9jYXRpb24gY29udHJvbGxlciBvYmplY3Qgd2FzIG5vdCBmb3VuZC4KLXVua25vd25DbGFzc1R5cGU9VW5rbm93biBjbGFzcyB0eXBlIHswfQotYXhpc0VuZHBvaW50UmVmZXJlbmNlRmFjdG9yeUVycj1DYW5ub3QgY3JlYXRlIGFuIGVuZHBvaW50IHJlZmVyZW5jZSBiZWNhdXNlIHRoZSBzZXJ2aWNlIG5hbWUgaXMgbnVsbCwgYW5kIHRoZSBwb3J0IG5hbWUgaXMgc2V0IHRvIHswfQotYXhpc0VuZHBvaW50UmVmZXJlbmNlRmFjdG9yeUVycjI9Q2Fubm90IGNyZWF0ZSBhbiBlbmRwb2ludCByZWZlcmVuY2UgYmVjYXVzZSB0aGUgYWRkcmVzcywgc2VydmljZSBuYW1lLCBhbmQvb3IgcG9ydCBuYW1lIGFyZSBudWxsLgotZGlzcGF0Y2hJbnZhbGlkVHlwZVdpdGhNb2RlPVVuc3VwcG9ydGVkIERpc3BhdGNoIFR5cGU6IERpc3BhdGNoIHR5cGUgamF2YXgueG1sLnNvYXAuU09BUE1lc3NhZ2UgY2Fubm90IGJlIHVzZWQgd2l0aCBtZXNzYWdlcyBpbiBQYXlsb2FkIG1vZGUuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcmVnaXN0cnkvU2VydmVyQ29uZmlndXJhdG9yUmVnaXN0cnkuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3JlZ2lzdHJ5L1NlcnZlckNvbmZpZ3VyYXRvclJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwNjk1MmYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcmVnaXN0cnkvU2VydmVyQ29uZmlndXJhdG9yUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5yZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuYWRkcmVzc2luZy5TdWJtaXNzaW9uQWRkcmVzc2luZ0ZlYXR1cmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLk1EUUNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmZlYXR1cmUuU2VydmVyQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2VydmVyLmNvbmZpZy5BZGRyZXNzaW5nQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2VydmVyLmNvbmZpZy5NVE9NQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2VydmVyLmNvbmZpZy5SZXNwZWN0QmluZGluZ0NvbmZpZ3VyYXRvcjsKLQotaW1wb3J0IGphdmF4LnhtbC53cy5SZXNwZWN0QmluZGluZ0ZlYXR1cmU7Ci1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuQWRkcmVzc2luZ0ZlYXR1cmU7Ci1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuTVRPTUZlYXR1cmU7Ci1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuU09BUEJpbmRpbmc7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRIYXNoTWFwOwotCi1wdWJsaWMgY2xhc3MgU2VydmVyQ29uZmlndXJhdG9yUmVnaXN0cnkgewotICAgIHByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIFNlcnZlckNvbmZpZ3VyYXRvcj4gbWFwID0KLSAgICAgICAgbmV3IENvbmN1cnJlbnRIYXNoTWFwPFN0cmluZywgU2VydmVyQ29uZmlndXJhdG9yPigpOwotICAgIAotICAgIHN0YXRpYyB7Ci0gICAgICAgIG1hcC5wdXQoQWRkcmVzc2luZ0ZlYXR1cmUuSUQsIG5ldyBBZGRyZXNzaW5nQ29uZmlndXJhdG9yKCkpOwotICAgICAgICBtYXAucHV0KFN1Ym1pc3Npb25BZGRyZXNzaW5nRmVhdHVyZS5JRCwgbmV3IEFkZHJlc3NpbmdDb25maWd1cmF0b3IoKSk7Ci0gICAgICAgIG1hcC5wdXQoTVRPTUZlYXR1cmUuSUQsIG5ldyBNVE9NQ29uZmlndXJhdG9yKCkpOwotICAgICAgICBtYXAucHV0KFJlc3BlY3RCaW5kaW5nRmVhdHVyZS5JRCwgbmV3IFJlc3BlY3RCaW5kaW5nQ29uZmlndXJhdG9yKCkpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0Q29uZmlndXJhdG9yKFN0cmluZyBpZCwgU2VydmVyQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvcikgewotICAgICAgICBtYXAucHV0KGlkLCBjb25maWd1cmF0b3IpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFNlcnZlckNvbmZpZ3VyYXRvciBnZXRDb25maWd1cmF0b3IoU3RyaW5nIGlkKSB7Ci0gICAgICAgIHJldHVybiBtYXAuZ2V0KGlkKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBTZXQ8U3RyaW5nPiBnZXRJZHMoKSB7Ci0gICAgICAgIHJldHVybiBtYXAua2V5U2V0KCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1NPQVBCaW5kaW5nKFN0cmluZyB1cmwpIHsKLSAgICAgICAgaWYgKHVybCAhPSBudWxsICYmICh1cmwuZXF1YWxzKFNPQVBCaW5kaW5nLlNPQVAxMUhUVFBfQklORElORykgfHwKLSAgICAgICAgICAgICAgICB1cmwuZXF1YWxzKFNPQVBCaW5kaW5nLlNPQVAxMUhUVFBfTVRPTV9CSU5ESU5HKSB8fAotICAgICAgICAgICAgICAgIHVybC5lcXVhbHMoU09BUEJpbmRpbmcuU09BUDEySFRUUF9CSU5ESU5HKXx8IAotICAgICAgICAgICAgICAgIHVybC5lcXVhbHMoU09BUEJpbmRpbmcuU09BUDEySFRUUF9NVE9NX0JJTkRJTkcpIHx8Ci0gICAgICAgICAgICAgICAgdXJsLmVxdWFscyhNRFFDb25zdGFudHMuU09BUDExSk1TX0JJTkRJTkcpIHx8Ci0gICAgICAgICAgICAgICAgdXJsLmVxdWFscyhNRFFDb25zdGFudHMuU09BUDExSk1TX01UT01fQklORElORykgfHwKLSAgICAgICAgICAgICAgICB1cmwuZXF1YWxzKE1EUUNvbnN0YW50cy5TT0FQMTJKTVNfQklORElORykgfHwKLSAgICAgICAgICAgICAgICB1cmwuZXF1YWxzKE1EUUNvbnN0YW50cy5TT0FQMTJKTVNfTVRPTV9CSU5ESU5HKSApKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2VydmVyL2NvbmZpZy9BZGRyZXNzaW5nQ29uZmlndXJhdG9yLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zZXJ2ZXIvY29uZmlnL0FkZHJlc3NpbmdDb25maWd1cmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNmZTYwMi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zZXJ2ZXIvY29uZmlnL0FkZHJlc3NpbmdDb25maWd1cmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNlcnZlci5jb25maWc7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuQWRkcmVzc2luZ0NvbnN0YW50czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5QYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLkV4Y2VwdGlvbkZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuYWRkcmVzc2luZy5TdWJtaXNzaW9uQWRkcmVzc2luZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5hZGRyZXNzaW5nLlN1Ym1pc3Npb25BZGRyZXNzaW5nRmVhdHVyZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5FbmRwb2ludERlc2NyaXB0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkVuZHBvaW50RGVzY3JpcHRpb25KYXZhOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLlNlcnZpY2VEZXNjcmlwdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5mZWF0dXJlLlNlcnZlckNvbmZpZ3VyYXRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5pMThuLk1lc3NhZ2VzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnJlZ2lzdHJ5LlNlcnZlckNvbmZpZ3VyYXRvclJlZ2lzdHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuSmF2YVV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuVXRpbHM7DQotDQotaW1wb3J0IGphdmF4LnhtbC53cy5zb2FwLkFkZHJlc3Npbmc7DQotaW1wb3J0IGphdmF4LnhtbC53cy5zb2FwLkFkZHJlc3NpbmdGZWF0dXJlOw0KLQ0KLS8qKg0KLSAqIFRoaXMgY2xhc3Mgd2lsbCBlbmFibGUvZGlzYWJsZSBXUy1BZGRyZXNzaW5nIGZvciBhIEpBWC1XUyAyLjEgd2ViIHNlcnZpY2UNCi0gKiBlbmRwb2ludCwgYmFzZWQgb24gdGhlIGNvbmZpZ3VyYXRpb24gcGFzc2VkIHRvIGl0IHZpYSBhbiA8Y29kZT5BZGRyZXNzaW5nPC9jb2RlPg0KLSAqIGFubm90YXRpb24gYW5kL29yIGEgPGNvZGU+U3VibWlzc2lvbkFkZHJlc3Npbmc8L2NvZGU+IGFubm90YXRpb24gZnJvbSB0aGUNCi0gKiBlbmRwb2ludCBpbXBsZW1lbnRhdGlvbiBiZWFuLg0KLSAqIA0KLSAqIEBzZWUgamF2YXgueG1sLndzLnNvYXAuQWRkcmVzc2luZw0KLSAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5hZGRyZXNzaW5nLlN1Ym1pc3Npb25BZGRyZXNzaW5nDQotICovDQotcHVibGljIGNsYXNzIEFkZHJlc3NpbmdDb25maWd1cmF0b3IgaW1wbGVtZW50cyBTZXJ2ZXJDb25maWd1cmF0b3Igew0KLQ0KLSAgICAvKg0KLSAgICAgKiAgKG5vbi1KYXZhZG9jKQ0KLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZmVhdHVyZS5TZXJ2ZXJDb25maWd1cmF0b3IjY29uZmlndXJlKG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRW5kcG9pbnREZXNjcmlwdGlvbikNCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZShFbmRwb2ludERlc2NyaXB0aW9uIGVuZHBvaW50RGVzY3JpcHRpb24pIHsNCi0gICAgCUFkZHJlc3NpbmcgYWRkcmVzc2luZyA9DQotICAgIAkJKEFkZHJlc3NpbmcpICgoRW5kcG9pbnREZXNjcmlwdGlvbkphdmEpIGVuZHBvaW50RGVzY3JpcHRpb24pLmdldEFubm9GZWF0dXJlKEFkZHJlc3NpbmdGZWF0dXJlLklEKTsNCi0gICAgCVN1Ym1pc3Npb25BZGRyZXNzaW5nIHN1Ym1pc3Npb25BZGRyZXNzaW5nID0NCi0gICAgCQkoU3VibWlzc2lvbkFkZHJlc3NpbmcpICgoRW5kcG9pbnREZXNjcmlwdGlvbkphdmEpIGVuZHBvaW50RGVzY3JpcHRpb24pLmdldEFubm9GZWF0dXJlKFN1Ym1pc3Npb25BZGRyZXNzaW5nRmVhdHVyZS5JRCk7DQotICAgIAlQYXJhbWV0ZXIgbmFtZXNwYWNlID0gbmV3IFBhcmFtZXRlcihBZGRyZXNzaW5nQ29uc3RhbnRzLldTX0FERFJFU1NJTkdfVkVSU0lPTiwgbnVsbCk7DQotICAgIAlQYXJhbWV0ZXIgZGlzYWJsZWQgPSBuZXcgUGFyYW1ldGVyKEFkZHJlc3NpbmdDb25zdGFudHMuRElTQUJMRV9BRERSRVNTSU5HX0ZPUl9JTl9NRVNTQUdFUywgImZhbHNlIik7DQotICAgIAlQYXJhbWV0ZXIgcmVxdWlyZWQgPSBuZXcgUGFyYW1ldGVyKEFkZHJlc3NpbmdDb25zdGFudHMuQUREUkVTU0lOR19SRVFVSVJFTUVOVF9QQVJBTUVURVIsIEFkZHJlc3NpbmdDb25zdGFudHMuQUREUkVTU0lOR19VTlNQRUNJRklFRCk7DQotICAgIAkNCi0gICAgCWlmIChhZGRyZXNzaW5nICE9IG51bGwgJiYgc3VibWlzc2lvbkFkZHJlc3NpbmcgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIC8vQm90aCBhbm5vdGF0aW9ucyBtdXN0IGhhdmUgYmVlbiBzcGVjaWZpZWQuDQotICAgICAgICAgICAgYm9vbGVhbiB3M2NBZGRyZXNzaW5nRW5hYmxlZCA9IGFkZHJlc3NpbmcuZW5hYmxlZCgpOw0KLSAgICAgICAgICAgIGJvb2xlYW4gc3VibWlzc2lvbkFkZHJlc3NpbmdFbmFibGVkID0gc3VibWlzc2lvbkFkZHJlc3NpbmcuZW5hYmxlZCgpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIGlmICh3M2NBZGRyZXNzaW5nRW5hYmxlZCAmJiBzdWJtaXNzaW9uQWRkcmVzc2luZ0VuYWJsZWQpIHsNCi0gICAgICAgICAgICAJbmFtZXNwYWNlLnNldFZhbHVlKG51bGwpOw0KLQ0KLSAgICAgICAgICAgICAgICBib29sZWFuIHczY0FkZHJlc3NpbmdSZXF1aXJlZCA9IGFkZHJlc3NpbmcucmVxdWlyZWQoKTsNCi0gICAgICAgICAgICAgICAgYm9vbGVhbiBzdWJtaXNzaW9uQWRkcmVzc2luZ1JlcXVpcmVkID0gc3VibWlzc2lvbkFkZHJlc3NpbmcucmVxdWlyZWQoKTsNCi0NCi0gICAgICAgICAgICAgICAgaWYgKHczY0FkZHJlc3NpbmdSZXF1aXJlZCB8fCBzdWJtaXNzaW9uQWRkcmVzc2luZ1JlcXVpcmVkKQ0KLSAgICAgICAgICAgICAgICAJcmVxdWlyZWQuc2V0VmFsdWUoQWRkcmVzc2luZ0NvbnN0YW50cy5BRERSRVNTSU5HX1JFUVVJUkVEKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZSBpZiAodzNjQWRkcmVzc2luZ0VuYWJsZWQpIHsNCi0gICAgICAgICAgICAJbmFtZXNwYWNlLnNldFZhbHVlKEFkZHJlc3NpbmdDb25zdGFudHMuRmluYWwuV1NBX05BTUVTUEFDRSk7DQotICAgICAgICAgICAgCQ0KLSAgICAgICAgICAgIAlpZiAoYWRkcmVzc2luZy5yZXF1aXJlZCgpKQ0KLSAgICAgICAgICAgIAkJcmVxdWlyZWQuc2V0VmFsdWUoQWRkcmVzc2luZ0NvbnN0YW50cy5BRERSRVNTSU5HX1JFUVVJUkVEKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZSBpZiAoc3VibWlzc2lvbkFkZHJlc3NpbmdFbmFibGVkKSB7DQotICAgICAgICAgICAgCW5hbWVzcGFjZS5zZXRWYWx1ZShBZGRyZXNzaW5nQ29uc3RhbnRzLlN1Ym1pc3Npb24uV1NBX05BTUVTUEFDRSk7DQotICAgICAgICAgICAgCQ0KLSAgICAgICAgICAgIAlpZiAoc3VibWlzc2lvbkFkZHJlc3NpbmcucmVxdWlyZWQoKSkNCi0gICAgICAgICAgICAJCXJlcXVpcmVkLnNldFZhbHVlKEFkZHJlc3NpbmdDb25zdGFudHMuQUREUkVTU0lOR19SRVFVSVJFRCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2Ugew0KLSAgICAgICAgICAgIAlkaXNhYmxlZC5zZXRWYWx1ZSgidHJ1ZSIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgCX0NCi0gICAgCWVsc2UgaWYgKGFkZHJlc3NpbmcgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIC8vVGhlIEFkZHJlc3NpbmcgYW5ub3RhdGlvbiBtdXN0IGhhdmUgYmVlbiBzcGVjaWZpZWQuDQotICAgICAgICAgICAgYm9vbGVhbiB3M2NBZGRyZXNzaW5nRW5hYmxlZCA9IGFkZHJlc3NpbmcuZW5hYmxlZCgpOw0KLQ0KLSAgICAgICAgICAgIGlmICh3M2NBZGRyZXNzaW5nRW5hYmxlZCkgew0KLSAgICAgICAgICAgIAluYW1lc3BhY2Uuc2V0VmFsdWUoQWRkcmVzc2luZ0NvbnN0YW50cy5GaW5hbC5XU0FfTkFNRVNQQUNFKTsNCi0gICAgICAgICAgICAJDQotICAgICAgICAgICAgCWlmIChhZGRyZXNzaW5nLnJlcXVpcmVkKCkpDQotICAgICAgICAgICAgCQlyZXF1aXJlZC5zZXRWYWx1ZShBZGRyZXNzaW5nQ29uc3RhbnRzLkFERFJFU1NJTkdfUkVRVUlSRUQpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlIHsNCi0gICAgICAgICAgICAJbmFtZXNwYWNlLnNldFZhbHVlKEFkZHJlc3NpbmdDb25zdGFudHMuU3VibWlzc2lvbi5XU0FfTkFNRVNQQUNFKTsNCi0gICAgICAgICAgICB9DQotICAgIAl9DQotICAgIAllbHNlIGlmIChzdWJtaXNzaW9uQWRkcmVzc2luZyAhPSBudWxsKSB7DQotICAgICAgICAgICAgLy9UaGUgU3VibWlzc2lvbkFkZHJlc3NpbmcgYW5ub3RhdGlvbiBtdXN0IGhhdmUgYmVlbiBzcGVjaWZpZWQuDQotICAgICAgICAgICAgYm9vbGVhbiBzdWJtaXNzaW9uQWRkcmVzc2luZ0VuYWJsZWQgPSBzdWJtaXNzaW9uQWRkcmVzc2luZy5lbmFibGVkKCk7DQotDQotICAgICAgICAgICAgaWYgKHN1Ym1pc3Npb25BZGRyZXNzaW5nRW5hYmxlZCkgew0KLSAgICAgICAgICAgIAluYW1lc3BhY2Uuc2V0VmFsdWUoQWRkcmVzc2luZ0NvbnN0YW50cy5TdWJtaXNzaW9uLldTQV9OQU1FU1BBQ0UpOw0KLSAgICAgICAgICAgIAkNCi0gICAgICAgICAgICAJaWYgKHN1Ym1pc3Npb25BZGRyZXNzaW5nLnJlcXVpcmVkKCkpDQotICAgICAgICAgICAgCQlyZXF1aXJlZC5zZXRWYWx1ZShBZGRyZXNzaW5nQ29uc3RhbnRzLkFERFJFU1NJTkdfUkVRVUlSRUQpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlIHsNCi0gICAgICAgICAgICAJbmFtZXNwYWNlLnNldFZhbHVlKEFkZHJlc3NpbmdDb25zdGFudHMuRmluYWwuV1NBX05BTUVTUEFDRSk7DQotICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAJCQ0KLSAgICAJfQ0KLSAgICAJZWxzZSB7DQotICAgICAgICAgICAgLy9JZiBuZWl0aGVyIHdlcmUgc3BlY2lmaWVkIHRoZW4gdGhpcyBjb25maWd1cmF0b3Igc2hvdWxkIG5ldmVyIHJ1bi4NCi0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKA0KLSAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZ2V0TWVzc2FnZSgiTm9XU0FkZHJlc3NpbmdGZWF0dXJlcyIpKTsNCi0gICAgCX0NCi0gICAgCQ0KLSAgICAJdHJ5IHsNCi0gICAgICAgICAgICBBeGlzU2VydmljZSBzZXJ2aWNlID0gZW5kcG9pbnREZXNjcmlwdGlvbi5nZXRBeGlzU2VydmljZSgpOw0KLSAgICAJCXNlcnZpY2UuYWRkUGFyYW1ldGVyKG5hbWVzcGFjZSk7DQotICAgIAkJc2VydmljZS5hZGRQYXJhbWV0ZXIoZGlzYWJsZWQpOw0KLSAgICAJCXNlcnZpY2UuYWRkUGFyYW1ldGVyKHJlcXVpcmVkKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBVdGlscy5nZXRQYXJhbWV0ZXJWYWx1ZShkaXNhYmxlZCk7DQotICAgIAkJaWYgKEphdmFVdGlscy5pc0ZhbHNlRXhwbGljaXRseSh2YWx1ZSkpIHsNCi0gICAgCQkJU2VydmljZURlc2NyaXB0aW9uIHNkID0gZW5kcG9pbnREZXNjcmlwdGlvbi5nZXRTZXJ2aWNlRGVzY3JpcHRpb24oKTsNCi0gICAgCQkJQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZyA9IHNkLmdldEF4aXNDb25maWdDb250ZXh0KCkuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKTsNCi0gICAgCQkJaWYgKCFheGlzQ29uZmlnLmlzRW5nYWdlZChDb25zdGFudHMuTU9EVUxFX0FERFJFU1NJTkcpKQ0KLSAgICAJCQkJYXhpc0NvbmZpZy5lbmdhZ2VNb2R1bGUoQ29uc3RhbnRzLk1PRFVMRV9BRERSRVNTSU5HKTsNCi0gICAgCQl9DQotICAgIAl9DQotICAgIAljYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKA0KLSAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZ2V0TWVzc2FnZSgiQWRkcmVzc2luZ0VuZ2FnZW1lbnRFcnJvciIsIGUudG9TdHJpbmcoKSkpOw0KLSAgICAJfQ0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqICAobm9uLUphdmFkb2MpDQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5mZWF0dXJlLlNlcnZlckNvbmZpZ3VyYXRvciNzdXBwb3J0cyhqYXZhLmxhbmcuU3RyaW5nKQ0KLSAgICAgKi8NCi0gICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoU3RyaW5nIGJpbmRpbmdJZCkgew0KLSAgICAgICAgcmV0dXJuIFNlcnZlckNvbmZpZ3VyYXRvclJlZ2lzdHJ5LmlzU09BUEJpbmRpbmcoYmluZGluZ0lkKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zZXJ2ZXIvY29uZmlnL01UT01Db25maWd1cmF0b3IuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NlcnZlci9jb25maWcvTVRPTUNvbmZpZ3VyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTc3MjE2Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NlcnZlci9jb25maWcvTVRPTUNvbmZpZ3VyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zZXJ2ZXIuY29uZmlnOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5QYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuRXhjZXB0aW9uRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5FbmRwb2ludERlc2NyaXB0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkVuZHBvaW50RGVzY3JpcHRpb25KYXZhOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmZlYXR1cmUuU2VydmVyQ29uZmlndXJhdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmkxOG4uTWVzc2FnZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MucmVnaXN0cnkuU2VydmVyQ29uZmlndXJhdG9yUmVnaXN0cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuTVRPTTsNCi1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuTVRPTUZlYXR1cmU7DQotDQotLyoqDQotICoNCi0gKi8NCi1wdWJsaWMgY2xhc3MgTVRPTUNvbmZpZ3VyYXRvciBpbXBsZW1lbnRzIFNlcnZlckNvbmZpZ3VyYXRvciB7DQotDQotICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhNVE9NQ29uZmlndXJhdG9yLmNsYXNzKTsNCi0gICAgDQotICAgIC8qDQotICAgICAqIChub24tSmF2YWRvYykNCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmZlYXR1cmUuV2ViU2VydmljZUZlYXR1cmVDb25maWd1cmF0b3IjY29uZmlndXJlKG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRW5kcG9pbnREZXNjcmlwdGlvbikNCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZShFbmRwb2ludERlc2NyaXB0aW9uIGVuZHBvaW50RGVzY3JpcHRpb24pIHsNCi0gICAgCU1UT00gbXRvbUFubm9hdGlvbiA9DQotICAgIAkJKE1UT00pICgoRW5kcG9pbnREZXNjcmlwdGlvbkphdmEpIGVuZHBvaW50RGVzY3JpcHRpb24pLmdldEFubm9GZWF0dXJlKE1UT01GZWF0dXJlLklEKTsNCi0gICAgCUF4aXNTZXJ2aWNlIHNlcnZpY2UgPSBlbmRwb2ludERlc2NyaXB0aW9uLmdldEF4aXNTZXJ2aWNlKCk7DQotICAgIAkNCi0gICAgCS8vRGlzYWJsZSBNVE9NDQotICAgIAlQYXJhbWV0ZXIgZW5hYmxlTVRPTSA9IG5ldyBQYXJhbWV0ZXIoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uRU5BQkxFX01UT00sIEJvb2xlYW4uRkFMU0UpOw0KLSAgICAJUGFyYW1ldGVyIHRocmVzaG9sZCA9IG5ldyBQYXJhbWV0ZXIoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uTVRPTV9USFJFU0hPTEQsIDApOw0KLSAgICAgIA0KLSAgICAgICAgaWYgKG10b21Bbm5vYXRpb24gPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkuDQotICAgICAgICAgICAgICBtYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJtdG9tQW5ub3RhdGlvbkVyciIpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgLy9FbmFibGUgTVRPTS4NCi0gICAgCWlmIChtdG9tQW5ub2F0aW9uLmVuYWJsZWQoKSkgew0KLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkVuYWJsaW5nIE1UT00gdmlhIGFubm90YXRpb24uIik7DQotICAgICAgICAgICAgfQ0KLSAgICAJICAgIGVuYWJsZU1UT00uc2V0VmFsdWUoQm9vbGVhbi5UUlVFKTsNCi0gICAgCX0NCi0gICAgICAgIA0KLSAgICAgICAgLy9TZXQgdGhlIHRocmVzaG9sZCB2YWx1ZS4NCi0gICAgICAgIGlmIChtdG9tQW5ub2F0aW9uLnRocmVzaG9sZCgpID4gMCkgew0KLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlNldHRpbmcgTVRPTSB0aHJlc2hvbGQgdG8gWyIgKyBtdG9tQW5ub2F0aW9uLnRocmVzaG9sZCgpICsgIl0uIik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHRocmVzaG9sZC5zZXRWYWx1ZShtdG9tQW5ub2F0aW9uLnRocmVzaG9sZCgpKTsNCi0gICAgICAgIH0NCi0gICAgCQ0KLSAgICAJdHJ5IHsNCi0gICAgCSAgICBzZXJ2aWNlLmFkZFBhcmFtZXRlcihlbmFibGVNVE9NKTsNCi0gICAgICAgICAgICBzZXJ2aWNlLmFkZFBhcmFtZXRlcih0aHJlc2hvbGQpOw0KLSAgICAJfQ0KLSAgICAJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJtdG9tRW5hYmxlRXJyIiksIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSk7ICAgIAkJDQotICAgIAl9DQotICAgIH0gICAgDQotDQotICAgIC8qDQotICAgICAqICAobm9uLUphdmFkb2MpDQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5mZWF0dXJlLlNlcnZlckNvbmZpZ3VyYXRvciNzdXBwb3J0cyhqYXZhLmxhbmcuU3RyaW5nKQ0KLSAgICAgKi8NCi0gICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoU3RyaW5nIGJpbmRpbmdJZCkgew0KLSAgICAgICAgcmV0dXJuIFNlcnZlckNvbmZpZ3VyYXRvclJlZ2lzdHJ5LmlzU09BUEJpbmRpbmcoYmluZGluZ0lkKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zZXJ2ZXIvY29uZmlnL1Jlc3BlY3RCaW5kaW5nQ29uZmlndXJhdG9yLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zZXJ2ZXIvY29uZmlnL1Jlc3BlY3RCaW5kaW5nQ29uZmlndXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlOWNiZjguLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2VydmVyL2NvbmZpZy9SZXNwZWN0QmluZGluZ0NvbmZpZ3VyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2VydmVyLmNvbmZpZzsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5FbmRwb2ludERlc2NyaXB0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkVuZHBvaW50RGVzY3JpcHRpb25KYXZhOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkVuZHBvaW50RGVzY3JpcHRpb25XU0RMOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmZlYXR1cmUuU2VydmVyQ29uZmlndXJhdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZzsNCi1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50Ow0KLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50Ow0KLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQQmluZGluZzsNCi1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAxMi5TT0FQMTJCaW5kaW5nOw0KLWltcG9ydCBqYXZheC54bWwud3MuUmVzcGVjdEJpbmRpbmc7DQotaW1wb3J0IGphdmF4LnhtbC53cy5SZXNwZWN0QmluZGluZ0ZlYXR1cmU7DQotDQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotLyoqDQotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIDxjb2RlPlNlcnZlckNvbmZpZ3VyYXRvcjwvY29kZT4gaW50ZXJmYWNlIHRoYXQgd2lsbA0KLSAqIGNvbmZpZ3VyZSB0aGUgZW5kcG9pbnQgYmFzZWQgb24gdGhlIHByZXNlbmNlIG9mIGEgPGNvZGU+UmVzcGVjdEJpbmRpbmc8L2NvZGU+DQotICogYXR0cmlidXRlLg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBSZXNwZWN0QmluZGluZ0NvbmZpZ3VyYXRvciBpbXBsZW1lbnRzIFNlcnZlckNvbmZpZ3VyYXRvciB7DQotDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhSZXNwZWN0QmluZGluZ0NvbmZpZ3VyYXRvci5jbGFzcyk7IA0KLSAgICANCi0gICAgLyoNCi0gICAgICogKG5vbi1KYXZhZG9jKQ0KLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZmVhdHVyZS5XZWJTZXJ2aWNlRmVhdHVyZUNvbmZpZ3VyYXRvciNjb25maWd1cmUob3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5FbmRwb2ludERlc2NyaXB0aW9uKQ0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgY29uZmlndXJlKEVuZHBvaW50RGVzY3JpcHRpb24gZW5kcG9pbnREZXNjcmlwdGlvbikgew0KLSAgICAJUmVzcGVjdEJpbmRpbmcgYW5ub3RhdGlvbiA9DQotICAgIAkJKFJlc3BlY3RCaW5kaW5nKSAoKEVuZHBvaW50RGVzY3JpcHRpb25KYXZhKSBlbmRwb2ludERlc2NyaXB0aW9uKS5nZXRBbm5vRmVhdHVyZShSZXNwZWN0QmluZGluZ0ZlYXR1cmUuSUQpOw0KLSAgICAJDQotICAgICAgICBpZiAoYW5ub3RhdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiU2V0dGluZyByZXNwZWN0QmluZGluZyB0byAiICsgYW5ub3RhdGlvbi5lbmFibGVkKCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbmRwb2ludERlc2NyaXB0aW9uLnNldFJlc3BlY3RCaW5kaW5nKGFubm90YXRpb24uZW5hYmxlZCgpKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBPbmNlIHdlIGtub3cgdGhhdCBAUmVzcGVjdEJpbmRpbmcgaXMgZW5hYmxlZCwgd2UgaGF2ZSB0byBmaW5kDQotICAgICAgICAgICAgLy8gYW55IGJpbmRpbmcgZXh0ZW5zaWJpbGl0eSBlbGVtZW50cyBhdmFpbGFibGUgYW5kIHNlZSB3aGljaCBvbmVzDQotICAgICAgICAgICAgLy8gaGF2ZSB0aGUgInJlcXVpcmVkIiBmbGFnIHNldCB0byB0cnVlLg0KLSAgICAgICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb25XU0RMIGVkdyA9IChFbmRwb2ludERlc2NyaXB0aW9uV1NETCkgZW5kcG9pbnREZXNjcmlwdGlvbjsNCi0gICAgICAgICAgICBCaW5kaW5nIGJuZCA9IGVkdy5nZXRXU0RMQmluZGluZygpOw0KLSAgICAgICAgICAgIGlmIChibmQgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICBMaXN0IGwgPSBibmQuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7DQotICAgICAgICAgICAgICAgIGlmIChsID09IG51bGwgfHwgbC5zaXplKCkgPT0gMCkgew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJObyBleHRlbnNpYmlsaXR5IGVsZW1lbnRzIGZvdW5kLiIpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJDaGVja2luZyBsaXN0IG9mICIgKyBsLnNpemUoKSArICIgZXh0ZW5zaWJpbGl0eSBlbGVtZW50cyBmb3IgcmVxdWlyZWQgYmluZGluZ3MuIik7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGkgPSBsLml0ZXJhdG9yKCk7DQotICAgICAgICAgICAgICAgICAgICBMaXN0IHVudXNlZEVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOw0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZSA9IChFeHRlbnNpYmlsaXR5RWxlbWVudCkgaS5uZXh0KCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBTT0FQQmluZGluZyB8fCBlIGluc3RhbmNlb2YgU09BUDEyQmluZGluZykNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50IHVlID0gKFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCkgZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlcWQgPSB1ZS5nZXRFbGVtZW50KCkuZ2V0QXR0cmlidXRlKCJyZXF1aXJlZCIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVxZC5lcXVhbHMoInRydWUiKSB8fCByZXFkLmVxdWFscygiVFJVRSIpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkZvdW5kIGEgcmVxdWlyZWQgZWxlbWVudDogIiArIGUuZ2V0RWxlbWVudFR5cGUoKSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRwb2ludERlc2NyaXB0aW9uLmFkZFJlcXVpcmVkQmluZGluZyhlLmdldEVsZW1lbnRUeXBlKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW51c2VkRWxlbWVudHMuYWRkKGUuZ2V0RWxlbWVudFR5cGUoKSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLmdldFJlcXVpcmVkKCkgIT0gbnVsbCAmJiBlLmdldFJlcXVpcmVkKCkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiRm91bmQgYSByZXF1aXJlZCBlbGVtZW50OiAiICsgZS5nZXRFbGVtZW50VHlwZSgpKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZHBvaW50RGVzY3JpcHRpb24uYWRkUmVxdWlyZWRCaW5kaW5nKGUuZ2V0RWxlbWVudFR5cGUoKSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnVzZWRFbGVtZW50cy5hZGQoZS5nZXRFbGVtZW50VHlwZSgpKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiVGhlIGZvbGxvd2luZyBleHRlbnNpYmlsaXR5IGVsZW1lbnRzIHdlcmUgZm91bmQsIGJ1dCB3ZXJlIG5vdCByZXF1aXJlZC4iKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBuID0gMDsgbiA8IHVudXNlZEVsZW1lbnRzLnNpemUoKTsgKytuKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlsiICsgaSArICJdIC0gIiArIHVudXNlZEVsZW1lbnRzLmdldChuKSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBlbHNlIHsNCi0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJObyBAUmVzcGVjdEJpbmRpbmcgYW5ub3RhdGlvbiB3YXMgZm91bmQuIik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICAvKg0KLSAgICAgKiAobm9uLUphdmFkb2MpDQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5mZWF0dXJlLlNlcnZlckNvbmZpZ3VyYXRvciNzdXBwb3J0cyhqYXZhLmxhbmcuU3RyaW5nKQ0KLSAgICAgKi8NCi0gICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoU3RyaW5nIGJpbmRpbmdJZCkgew0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvdXRpbC9CYXNlV1NETExvY2F0b3IuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3V0aWwvQmFzZVdTRExMb2NhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5Zjk4ZDkuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvdXRpbC9CYXNlV1NETExvY2F0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MudXRpbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuRXhjZXB0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmkxOG4uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgdGhlIGJhc2UgZm9yIGFuIGltcGxlbWVudGF0aW9uIG9mIGEgV1NETDRKIGludGVyZmFjZSB0aGF0IAotICogd2lsbCBiZSBzdXBwbGllZCB0byBhIFdTRExSZWFkZXIgaW5zdGFuY2UuIEl0cyBwcmltYXJ5IGdvYWwgaXMgdG8gYXNzaXN0IAotICogd2l0aCBsb2NhdGluZyBpbXBvcnRlZCBXU0RMIGRvY3VtZW50cy4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VXU0RMTG9jYXRvciB7Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEJhc2VXU0RMTG9jYXRvci5jbGFzcyk7Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGJhc2VVUkksIGxhc3Rlc3RJbXBvcnRVUkk7Ci0gICAgcHJvdGVjdGVkIElucHV0U3RyZWFtIGJhc2VJbnB1dFN0cmVhbTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gSW5wdXRTdHJlYW0gcG9pbnRlZCBhdCBhbiBpbXBvcnRlZCB3c2RsIHBhdGhuYW1lIHJlbGF0aXZlCi0gICAgICogdG8gdGhlIHBhcmVudCByZXNvdXJjZSBvciBsb2FkU3RyYXRlZ3kuCi0gICAgICogCi0gICAgICogQHBhcmFtIGltcG9ydFBhdGggaWRlbnRpZmllcyB0aGUgV1NETCBmaWxlIHdpdGhpbiB0aGUgY29udGV4dCAKLSAgICAgKiBAcmV0dXJuIGFuIHN0cmVhbSBvZiB0aGUgV1NETCBmaWxlCi0gICAgICovCi0gICAgYWJzdHJhY3QgcHJvdGVjdGVkIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKFN0cmluZyBpbXBvcnRQYXRoKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBBbGxvd3MgZm9yIGEgbGV2ZWwgb2YgaW5kaXJlY3Rpb24sIHN1Y2ggYXMgYSBjYXRhbG9nLCB3aGVuIGltcG9ydGluZyBVUklzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBpbXBvcnRVUkkgYSBVUkkgc3BlY2lmeWluZyB0aGUgZG9jdW1lbnQgdG8gaW1wb3J0Ci0gICAgICogQHBhcmFtIHBhcmVudCBhIFVSSSBzcGVjaWZ5aW5nIHRoZSBsb2NhdGlvbiBvZiB0aGUgcGFyZW50IGRvY3VtZW50IGRvaW5nCi0gICAgICogdGhlIGltcG9ydGluZwotICAgICAqIEByZXR1cm4gdGhlIHJlc29sdmVkIGltcG9ydCBsb2NhdGlvbiwgb3IgbnVsbCBpZiBubyBpbmRpcmVjdGlvbiBpcyBwZXJmb3JtZWQKLSAgICAgKi8KLSAgICBhYnN0cmFjdCBwcm90ZWN0ZWQgU3RyaW5nIGdldFJlZGlyZWN0ZWRVUkkoU3RyaW5nIGltcG9ydFVSSSwgU3RyaW5nIHBhcmVudCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICAqIFJldHVybnMgYW4gSW5wdXRTb3VyY2UgInBvaW50ZWQgYXQiIHRoZSBiYXNlIGRvY3VtZW50LgotICAgICAgKi8KLSAgICBwdWJsaWMgSW5wdXRTb3VyY2UgZ2V0QmFzZUlucHV0U291cmNlKCkgewotICAgICAgICByZXR1cm4gbmV3IElucHV0U291cmNlKGJhc2VJbnB1dFN0cmVhbSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBJbnB1dFNvdXJjZSBwb2ludGVkIGF0IGFuIGltcG9ydGVkIHdzZGwgZG9jdW1lbnQgd2hvc2UKLSAgICAgKiBwYXJlbnQgZG9jdW1lbnQgd2FzIGxvY2F0ZWQgYXQgcGFyZW50TG9jYXRpb24gYW5kIHdob3NlCi0gICAgICogcmVsYXRpdmUgbG9jYXRpb24gdG8gdGhlIHBhcmVudCBkb2N1bWVudCBpcyBzcGVjaWZpZWQgYnkKLSAgICAgKiByZWxhdGl2ZUxvY2F0aW9uLgotICAgICAqCi0gICAgICogQHBhcmFtIHBhcmVudExvY2F0aW9uIGEgVVJJIHNwZWNpZnlpbmcgdGhlIGxvY2F0aW9uIG9mIHRoZQotICAgICAqIGRvY3VtZW50IGRvaW5nIHRoZSBpbXBvcnRpbmcuCi0gICAgICogQHBhcmFtIHJlbGF0aXZlTG9jYXRpb24gYSBVUkkgc3BlY2lmeWluZyB0aGUgbG9jYXRpb24gb2YgdGhlCi0gICAgICogZG9jdW1lbnQgdG8gaW1wb3J0LCByZWxhdGl2ZSB0byB0aGUgcGFyZW50IGRvY3VtZW50J3MgbG9jYXRpb24uCi0gICAgICovCi0gICAgcHVibGljIElucHV0U291cmNlIGdldEltcG9ydElucHV0U291cmNlKFN0cmluZyBwYXJlbnRMb2NhdGlvbiwgU3RyaW5nIHJlbGF0aXZlTG9jYXRpb24pIHsKLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoImdldEltcG9ydElucHV0U291cmNlLCBwYXJlbnRMb2NhdGlvbj0gIiArIHBhcmVudExvY2F0aW9uICsgCi0gICAgICAgICAgICAgICAgICAgICIgcmVsYXRpdmVMb2NhdGlvbj0gIiArIHJlbGF0aXZlTG9jYXRpb24pOwotICAgICAgICB9Ci0gICAgICAgIElucHV0U3RyZWFtIGlzID0gbnVsbDsKLSAgICAgICAgVVJMIGFic29sdXRlVVJMID0gbnVsbDsKLQotICAgICAgICBTdHJpbmcgcmVkaXJlY3RlZFVSSSA9IGdldFJlZGlyZWN0ZWRVUkkocmVsYXRpdmVMb2NhdGlvbiwgcGFyZW50TG9jYXRpb24pOwotICAgICAgICBpZiAgKHJlZGlyZWN0ZWRVUkkgIT0gbnVsbCkKLSAgICAgICAgCXJlbGF0aXZlTG9jYXRpb24gPSByZWRpcmVjdGVkVVJJOwotICAgICAgICAKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChpc0Fic29sdXRlSW1wb3J0KHJlbGF0aXZlTG9jYXRpb24pKSB7Ci0gICAgICAgICAgICAgICAgdHJ5ewotICAgICAgICAgICAgICAgICAgICBhYnNvbHV0ZVVSTCA9IG5ldyBVUkwocmVsYXRpdmVMb2NhdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIGlzID0gYWJzb2x1dGVVUkwub3BlblN0cmVhbSgpOwotICAgICAgICAgICAgICAgICAgICBsYXN0ZXN0SW1wb3J0VVJJID0gYWJzb2x1dGVVUkwudG9FeHRlcm5hbEZvcm0oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2goVGhyb3dhYmxlIHQpewotICAgICAgICAgICAgICAgICAgICBpZiAocmVsYXRpdmVMb2NhdGlvbi5zdGFydHNXaXRoKCJmaWxlOi8vIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpdmVMb2NhdGlvbiA9ICJmaWxlOi8iICsgcmVsYXRpdmVMb2NhdGlvbi5zdWJzdHJpbmcoImZpbGU6Ly8iLmxlbmd0aCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYnNvbHV0ZVVSTCA9IG5ldyBVUkwocmVsYXRpdmVMb2NhdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgPSBhYnNvbHV0ZVVSTC5vcGVuU3RyZWFtKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdGVzdEltcG9ydFVSSSA9IGFic29sdXRlVVJMLnRvRXh0ZXJuYWxGb3JtKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdDIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZihpcyA9PSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgdHJ5ewotICAgICAgICAgICAgICAgICAgICAgICAgVVJJIGZpbGVVUkkgPSBuZXcgVVJJKHJlbGF0aXZlTG9jYXRpb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgYWJzb2x1dGVVUkwgPSBmaWxlVVJJLnRvVVJMKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpcyA9IGFic29sdXRlVVJMLm9wZW5TdHJlYW0oKTsgIAotICAgICAgICAgICAgICAgICAgICAgICAgbGFzdGVzdEltcG9ydFVSSSA9IGFic29sdXRlVVJMLnRvRXh0ZXJuYWxGb3JtKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2F0Y2goVGhyb3dhYmxlIHQpewotICAgICAgICAgICAgICAgICAgICAgICAgLy9ObyBGRkRDIGNvZGUgbmVlZGVkICAKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZihpcyA9PSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgdHJ5ewotICAgICAgICAgICAgICAgICAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUocmVsYXRpdmVMb2NhdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhYnNvbHV0ZVVSTCA9IGZpbGUudG9VUkwoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlzID0gYWJzb2x1dGVVUkwub3BlblN0cmVhbSgpOyAgCi0gICAgICAgICAgICAgICAgICAgICAgICBsYXN0ZXN0SW1wb3J0VVJJID0gYWJzb2x1dGVVUkwudG9FeHRlcm5hbEZvcm0oKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXRjaChUaHJvd2FibGUgdCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL05vIEZGREMgY29kZSBuZWVkZWQgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgaW1wb3J0UGF0aCA9IG5vcm1hbGl6ZVBhdGgocGFyZW50TG9jYXRpb24sIHJlbGF0aXZlTG9jYXRpb24pOwotICAgICAgICAgICAgICAgIGlzID0gZ2V0SW5wdXRTdHJlYW0oaW1wb3J0UGF0aCk7Ci0gICAgICAgICAgICAgICAgbGFzdGVzdEltcG9ydFVSSSA9IGltcG9ydFBhdGg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRNZXNzYWdlKCJXU0RMUmVsYXRpdmVFcnIxIiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpdmVMb2NhdGlvbiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50TG9jYXRpb24sIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4LnRvU3RyaW5nKCkpKTsKLSAgICAgICAgfQotICAgICAgICBpZihpcyA9PSBudWxsKXsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoIldTRExSZWxhdGl2ZUVycjIiLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGl2ZUxvY2F0aW9uLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRMb2NhdGlvbikpOwotICAgICAgICB9Ci0gICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKXsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiTG9hZGVkIGZpbGU6ICIgKyByZWxhdGl2ZUxvY2F0aW9uKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IElucHV0U291cmNlKGlzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgVVJJIHJlcHJlc2VudGluZyB0aGUgbG9jYXRpb24gb2YgdGhlIGJhc2UgZG9jdW1lbnQuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRCYXNlVVJJKCkgewotICAgICAgICByZXR1cm4gYmFzZVVSSTsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBVUkkgcmVwcmVzZW50aW5nIHRoZSBsb2NhdGlvbiBvZiB0aGUgbGFzdCBpbXBvcnQgZG9jdW1lbnQKLSAgICAgKiB0byBiZSByZXNvbHZlZC4gVGhpcyBpcyB1c2VmdWwgd2hlbiByZXNvbHZpbmcgbmVzdGVkIGltcG9ydHMuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRMYXRlc3RJbXBvcnRVUkkoKSB7Ci0gICAgICAgIHJldHVybiBsYXN0ZXN0SW1wb3J0VVJJOwotICAgIH0KLQotICAgIC8qCi0gICAgICogQHBhcmFtIHJhd1VSSSB0aGUgdXJpIGZvciBiYXNlIHdzZGwgZmlsZSwgd2hpY2ggY291bGQgYmUgdGhlIGZvcm0gb2YKLSAgICAgKiAgICAgICAgICBNRVRBLUlORi9iYXNlLndzZGwgb3IganVzdCBiYXNlLndzZGwsIGJ1dCBpdCBjYW4gYmUgL2Jhc2Uud3NkbCAobm8gbGVhZGluZyBzbGFzaCBhY2NvcmRpbmcgdG8gc3BlYykKLSAgICAgKiBAcmV0dXJuIHRoZSB1cmkgd2hpY2ggaXMgb25lIGxldmVsIHVwIHRoZSByYXcgdXJpIHdpdGggdGhlIHRyYWlsaW5nIHNsYXNoIChpZiBub3QgZW1wdHkpCi0gICAgICogCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBjb252ZXJ0VVJJKFN0cmluZyByYXdVUkkpIHsKLSAgICAJaW50IGlkeCA9IHJhd1VSSS5sYXN0SW5kZXhPZignLycpOwotICAgICAgICBpZihpZHggPiAwKSB7Ci0gICAgICAgIAlyYXdVUkkgPSByYXdVUkkuc3Vic3RyaW5nKDAsIGlkeCArIDEpOwotICAgICAgICAgICAgcmV0dXJuIHJhd1VSSTsKLSAgICAgICAgfQotICAgICAgICAvLyB0aGlzIG1heSBiZSBhbiBhYnNvbHV0ZSBmaWxlIHJlZmVyZW5jZQotICAgICAgICBlbHNlIHsKLSAgICAgICAgCWlkeCA9IHJhd1VSSS5sYXN0SW5kZXhPZignXFwnKTsKLSAgICAgICAgCWlmKGlkeCA+IDApIHsKLSAgICAgICAgCQlyYXdVUkkgPSByYXdVUkkuc3Vic3RyaW5nKDAsIGlkeCArIDEpOwotICAgICAgICAgICAgICAgIHJldHVybiByYXdVUkk7Ci0gICAgICAgIAl9Ci0gICAgICAgIAlyZXR1cm4gIiI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0Fic29sdXRlSW1wb3J0KFN0cmluZyB1cmkpIHsKLSAgICAgICAgYm9vbGVhbiBhYnNvbHV0ZSA9IGZhbHNlOwotICAgICAgICBpZih1cmkgIT0gbnVsbCl7Ci0gICAgICAgICAgICBpZih1cmkuaW5kZXhPZigiOi8iKSAhPSAtMSl7Ci0gICAgICAgICAgICAgICAgYWJzb2x1dGUgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZih1cmkuaW5kZXhPZigiOlxcIikgIT0gLTEpewotICAgICAgICAgICAgICAgIGFic29sdXRlID0gdHJ1ZTsKLSAgICAgICAgICAgIH0gCi0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBhYnNvbHV0ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgWmlwRmlsZSBjYW4gbm90IGhhbmRsZSByZWxhdGl2ZSBpbXBvcnRzIG9mIHRoYXQgaGF2ZSBkaXJlY3RvcnkgY29tcG9uZW50cyAKLSAgICAgKiBvZiB0aGUgZm9ybSAiLi4iLiAgR2l2ZW4gYSAncmVsYXRpdmVMb2NhdGlvbicgcmVsYXRpdmUgdG8gJ3BhcmVudExvY2F0aW9uJywgcmVwbGFjZQotICAgICAqIGFueSAiLi4iIHdpdGggYWN0dWFsIHBhdGggY29tcG9uZW50IG5hbWVzLgotICAgICAqIEBwYXJhbSBwYXJlbnRMb2NhdGlvbiBQYXRoIHJlbGF0aXZlIHRvIHRoZSBtb2R1bGUgcm9vdCBvZiB0aGUgZmlsZSB0aGF0IGlzIGRvaW5nIHRoZQotICAgICAqICAgICAgICAgICAgICAgICAgICAgICBpbXBvcnRpbmcuCi0gICAgICogQHBhcmFtIHJlbGF0aXZlTG9jYXRpb24gUGF0aCByZWxhdGl2ZSB0byB0aGUgcGFyZW50TG9jYXRpb24gb2YgdGhlIGZpbGUgdGhhdCBpcyBiZWluZyBpbXBvcnRlZC4KLSAgICAgKiBAcmV0dXJuIFN0cmluZyBjb250YXRpbmluZyB0aGUgcGF0aCB0byB0aGUgZmlsZSBiZWluZyBpbXBvcnRlZCAoaS5lLiByZWxhdGl2ZUxvY2F0aW9uKSB0aGF0IGlzCi0gICAgICogICAgICAgICByZWxhdGl2ZSB0byB0aGUgbW9kdWxlIHJvb3QgYW5kIGhhcyBhbGwgIi4uIiBhbmQgIi4iIHBhdGggY29tcG9uZW50cyByZW1vdmVkIGFuZCByZXBsYWNlZAotICAgICAqICAgICAgICAgd2l0aCB0aGUgY29ycmVzcG9uZGluZyBhY3R1YWwgZGlyZWN0b3J5IG5hbWUuCi0gICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIFdTRExfUEFUSF9TRVBFUkFUT1JfQ0hBUiA9ICcvJzsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NETF9QQVRIX1NFUEVSQVRPUiA9Ci0gICAgICAgIChDaGFyYWN0ZXIudmFsdWVPZihXU0RMX1BBVEhfU0VQRVJBVE9SX0NIQVIpKS50b1N0cmluZygpOwotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBub3JtYWxpemVQYXRoKFN0cmluZyBwYXJlbnRMb2NhdGlvbiwgU3RyaW5nIHJlbGF0aXZlTG9jYXRpb24pIHsKLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIm5vcm1hbGl6ZVBhdGgsIHBhcmVudExvY2F0aW9uPSAiICsgcGFyZW50TG9jYXRpb24gKyAKLSAgICAgICAgICAgICAgICAgICAgIiByZWxhdGl2ZUxvY2F0aW9uPSAiICsgcmVsYXRpdmVMb2NhdGlvbik7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gR2V0IHRoZSBwYXRoIGZyb20gdGhlIG1vZHVsZSByb290IHRvIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgaW1wb3J0aW5nIFdTREwgZmlsZS4KLSAgICAgICAgLy8gTm90ZSB0aGlzIHBhdGggd2lsbCBlbmQgaW4gYSAiLyIgYW5kIHdpbGwgbm90IGNvbnRhaW4gYW55ICIuLiIgcGF0aCBjb21wb25lbnRzLgotICAgICAgICBTdHJpbmcgcGF0aEZyb21Sb290ID0gY29udmVydFVSSShwYXJlbnRMb2NhdGlvbik7Ci0KLSAgICAgICAgLy8gQ29uc3RydWN0IHRoZSBwYXRoIHRvIHRoZSBsb2NhdGlvbiByZWxhdGl2ZSB0byB0aGUgbW9kdWxlIHJvb3QgYmFzZWQgb24gdGhlIHBhcmVudCBsb2NhdGlvbiwgCi0gICAgICAgIC8vIHJlbW92aW5nIGFueSAiLi4iIG9yICIuIiBwYXRoIGNvbXBvbmVudHMuCi0gICAgICAgIFN0cmluZ0J1ZmZlciBwYXRoVG9SZWxhdGl2ZUxvY2F0aW9uID0gbmV3IFN0cmluZ0J1ZmZlcihwYXRoRnJvbVJvb3QpOwotICAgICAgICBTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVkUmVsYXRpdmVMb2NhdGlvbiA9Ci0gICAgICAgICAgICBuZXcgU3RyaW5nVG9rZW5pemVyKHJlbGF0aXZlTG9jYXRpb24sIFdTRExfUEFUSF9TRVBFUkFUT1IpOwotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygicGF0aEZyb21Sb290ID0gIiArIHBhdGhGcm9tUm9vdCk7Ci0gICAgICAgICAgICBsb2cuZGVidWcoInJlbGF0aXZlTG9jYXRpb24gPSAiICsgcmVsYXRpdmVMb2NhdGlvbik7Ci0gICAgICAgIH0KLSAgICAgICAgd2hpbGUgKHRva2VuaXplZFJlbGF0aXZlTG9jYXRpb24uaGFzTW9yZVRva2VucygpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbmV4dFRva2VuID0gdG9rZW5pemVkUmVsYXRpdmVMb2NhdGlvbi5uZXh0VG9rZW4oKTsKLSAgICAgICAgICAgIGlmIChuZXh0VG9rZW4uZXF1YWxzKCIuLiIpKSB7Ci0gICAgICAgICAgICAgICAgLy8gUmVsYXRpdmUgcGFyZW50IGRpcmVjdG9yeSwgc28gY2hvcCBvZmYgdGhlIGxhc3QgcGF0aCBjb21wb25lbnQgaW4gdGhlIHBhdGggdG8gYmFjawotICAgICAgICAgICAgICAgIC8vIHVwIHRvIHRoZSBwYXJlbnQgZGlyZWN0b3J5LiAgRmlyc3QgZGVsZXRlIHRoZSB0cmFpbGluZyAiLyIgZnJvbSB0aGUgcGF0aCBpZiB0aGVyZSAKLSAgICAgICAgICAgICAgICAvLyBpcyBvbmUsIHRoZW4gZGVsZXRlIGNoYXJhY3RlcnMgZnJvbSB0aGUgZW5kIG9mIHRoZSBwYXRoIHVudGlsIHdlIGZpbmQgdGhlIG5leHQgIi8iLgotICAgICAgICAgICAgICAgIGludCBjaGFyVG9EZWxldGUgPSBwYXRoVG9SZWxhdGl2ZUxvY2F0aW9uLmxlbmd0aCgpIC0gMTsKLSAgICAgICAgICAgICAgICBpZiAocGF0aFRvUmVsYXRpdmVMb2NhdGlvbi5jaGFyQXQoY2hhclRvRGVsZXRlKSA9PSBXU0RMX1BBVEhfU0VQRVJBVE9SX0NIQVIgfHwgCi0gICAgICAgICAgICAgICAgCQlwYXRoVG9SZWxhdGl2ZUxvY2F0aW9uLmNoYXJBdChjaGFyVG9EZWxldGUpID09ICdcXCcpIHsKLSAgICAgICAgICAgICAgICAgICAgcGF0aFRvUmVsYXRpdmVMb2NhdGlvbi5kZWxldGVDaGFyQXQoY2hhclRvRGVsZXRlLS0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB3aGlsZSAocGF0aFRvUmVsYXRpdmVMb2NhdGlvbi5jaGFyQXQoY2hhclRvRGVsZXRlKSAhPSBXU0RMX1BBVEhfU0VQRVJBVE9SX0NIQVIgJiYgCi0gICAgICAgICAgICAgICAgCQlwYXRoVG9SZWxhdGl2ZUxvY2F0aW9uLmNoYXJBdChjaGFyVG9EZWxldGUpICE9ICdcXCcpIHsKLSAgICAgICAgICAgICAgICAgICAgcGF0aFRvUmVsYXRpdmVMb2NhdGlvbi5kZWxldGVDaGFyQXQoY2hhclRvRGVsZXRlLS0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAobmV4dFRva2VuLmVxdWFscygiLiIpKSB7Ci0gICAgICAgICAgICAgICAgLy8gUmVsYXRpdmUgY3VycmVudCBkaXJlY3RvcnksIGRvIG5vdCBhZGQgb3IgZGVsZXRlIGFueSBwYXRoIGNvbXBvbmVudHMKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBjdXJyZW50IHBhdGggZW5kcyBpbiBhICIvIiAgb3IgIlxcIiB0aGVuIGFwcGVuZCB0aGlzIHBhdGggY29tcG9uZW50Ci0gICAgICAgICAgICAJLy8gVGhpcyBoYW5kbGVzIGxvY2F0aW9ucyB3aXRoaW4gdGhlIG1vZHVsZSBhbmQgVVJJcwotICAgICAgICAgICAgICAgIGlmICgocGF0aFRvUmVsYXRpdmVMb2NhdGlvbi5pbmRleE9mKFN0cmluZy52YWx1ZU9mKFdTRExfUEFUSF9TRVBFUkFUT1JfQ0hBUikpIAotICAgICAgICAgICAgICAgIAkJIT0gLTEpICYmIChwYXRoVG9SZWxhdGl2ZUxvY2F0aW9uLmNoYXJBdChwYXRoVG9SZWxhdGl2ZUxvY2F0aW9uLmxlbmd0aCgpIAotICAgICAgICAgICAgICAgIAkJCQktIDEpIT0gV1NETF9QQVRIX1NFUEVSQVRPUl9DSEFSKSkgewotICAgICAgICAgICAgICAgICAgICBwYXRoVG9SZWxhdGl2ZUxvY2F0aW9uLmFwcGVuZChXU0RMX1BBVEhfU0VQRVJBVE9SX0NIQVIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBUaGlzIGhhbmRsZXMgZmlsZSBiYXNlZCBsb2NhdGlvbnMKLSAgICAgICAgICAgICAgICBlbHNlIGlmKChwYXRoVG9SZWxhdGl2ZUxvY2F0aW9uLmluZGV4T2YoIlxcIikgIT0gLTEpICYmIChwYXRoVG9SZWxhdGl2ZUxvY2F0aW9uLgotICAgICAgICAgICAgICAgIAkJY2hhckF0KHBhdGhUb1JlbGF0aXZlTG9jYXRpb24ubGVuZ3RoKCkgLTEpICE9ICdcXCcpKSB7Ci0gICAgICAgICAgICAgICAgCXBhdGhUb1JlbGF0aXZlTG9jYXRpb24uYXBwZW5kKCdcXCcpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwYXRoVG9SZWxhdGl2ZUxvY2F0aW9uLmFwcGVuZChuZXh0VG9rZW4pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJCdWlsdCBwYXRoID0gIiArIHBhdGhUb1JlbGF0aXZlTG9jYXRpb24udG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHBhdGhUb1JlbGF0aXZlTG9jYXRpb24udG9TdHJpbmcoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy91dGlsL0NhdGFsb2dVUklSZXNvbHZlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvdXRpbC9DYXRhbG9nVVJJUmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRhNDNjOS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy91dGlsL0NhdGFsb2dVUklSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51dGlsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY2F0YWxvZy5KQVhXU0NhdGFsb2dNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uaW1wbC5VUklSZXNvbHZlckltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWwucmVzb2x2ZXIuQ2F0YWxvZzsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLQotLyoqCi0gKiBUaGlzIHJlc29sdmVyIHByb3ZpZGVzIHRoZSBtZWFucyBvZiByZXNvbHZpbmcgdGhlIGltcG9ydHMgYW5kIGluY2x1ZGVzIG9mIGEKLSAqIGdpdmVuIHNjaGVtYSBkb2N1bWVudC4gSXQgYWxsb3dzIHRoZSB1c2Ugb2YgdGhlIEFwYWNoZSBDb21tb25zIFJlc29sdmVyIEFQSQotICogdG8gcmVkaXJlY3QgcmVzb3VyY2UgcmVxdWVzdHMgdG8gYWx0ZXJuYXRpdmUgbG9jYXRpb25zLgotICovCi1wdWJsaWMgY2xhc3MgQ2F0YWxvZ1VSSVJlc29sdmVyIGV4dGVuZHMgVVJJUmVzb2x2ZXJJbXBsIHsKLQotICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhDYXRhbG9nV1NETExvY2F0b3IuY2xhc3MpOwotICAgIHByaXZhdGUgQ2F0YWxvZyBjYXRhbG9nUmVzb2x2ZXI7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ2F0YWxvZ1VSSVJlc29sdmVyIGNvbnN0cnVjdG9yLiAgUmVzb2x2ZXMgV1NETCBVUklzIHVzaW5nIEFwYWNoZSBDb21tb25zIFJlc29sdmVyIEFQSS4KLSAgICAgKiBAcGFyYW0gY2F0YWxvZ01hbmFnZXIKLSAgICAgKiAgICAgICAgICAgIHRoZSBPQVNJU0NhdGFsb2dNYW5hZ2VyIHdoaWNoIHdpbGwgZGV0ZXJtaW5lIHRoZSBzZXR0aW5ncyBmb3IgdGhlIFhNTCBjYXRhbG9nCi0gICAgICovCi0gICAgcHVibGljIENhdGFsb2dVUklSZXNvbHZlcihKQVhXU0NhdGFsb2dNYW5hZ2VyIGNhdGFsb2dNYW5hZ2VyKSB7Ci0gICAgICAgIHRoaXMoY2F0YWxvZ01hbmFnZXIsIG51bGwpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDYXRhbG9nVVJJUmVzb2x2ZXIgY29uc3RydWN0b3IuICBSZXNvbHZlcyBXU0RMIFVSSXMgdXNpbmcgQXBhY2hlIENvbW1vbnMgUmVzb2x2ZXIgQVBJLgotICAgICAqIEBwYXJhbSBjYXRhbG9nTWFuYWdlcgotICAgICAqICAgICAgICAgICAgdGhlIE9BU0lTQ2F0YWxvZ01hbmFnZXIgd2hpY2ggd2lsbCBkZXRlcm1pbmUgdGhlIHNldHRpbmdzIGZvciB0aGUgWE1MIGNhdGFsb2cKLSAgICAgKiBAcGFyYW0gY2xhc3NMb2FkZXIKLSAgICAgKi8gICAgCi0gICAgcHVibGljIENhdGFsb2dVUklSZXNvbHZlcihKQVhXU0NhdGFsb2dNYW5hZ2VyIGNhdGFsb2dNYW5hZ2VyLCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikgewotICAgICAgICBzdXBlcihjbGFzc0xvYWRlcik7Ci0gICAgICAgIGlmIChjYXRhbG9nTWFuYWdlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aGlzLmNhdGFsb2dSZXNvbHZlciA9IGNhdGFsb2dNYW5hZ2VyLmdldENhdGFsb2coKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXNvbHZlcyBVUklzIHVzaW5nIEFwYWNoZSBDb21tb25zIFJlc29sdmVyIEFQSS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW1wb3J0VVJJIGEgVVJJIHNwZWNpZnlpbmcgdGhlIGRvY3VtZW50IHRvIGltcG9ydAotICAgICAqIEBwYXJhbSBwYXJlbnQgYSBVUkkgc3BlY2lmeWluZyB0aGUgbG9jYXRpb24gb2YgdGhlIHBhcmVudCBkb2N1bWVudCBkb2luZwotICAgICAqIHRoZSBpbXBvcnRpbmcKLSAgICAgKiBAcmV0dXJuIHRoZSByZXNvbHZlZCBpbXBvcnQgbG9jYXRpb24sIG9yIG51bGwgaWYgbm8gaW5kaXJlY3Rpb24gaXMgcGVyZm9ybWVkCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRSZWRpcmVjdGVkVVJJKFN0cmluZyBuYW1lc3BhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzY2hlbWFMb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGJhc2VVcmkpIHsKLSAgICAgICAgU3RyaW5nIHJlc29sdmVkSW1wb3J0TG9jYXRpb24gPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmVzb2x2ZWRJbXBvcnRMb2NhdGlvbiA9IHRoaXMuY2F0YWxvZ1Jlc29sdmVyLnJlc29sdmVTeXN0ZW0obmFtZXNwYWNlKTsKLSAgICAgICAgICAgIGlmIChyZXNvbHZlZEltcG9ydExvY2F0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXNvbHZlZEltcG9ydExvY2F0aW9uID0gY2F0YWxvZ1Jlc29sdmVyLnJlc29sdmVVUkkoc2NoZW1hTG9jYXRpb24pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHJlc29sdmVkSW1wb3J0TG9jYXRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJlc29sdmVkSW1wb3J0TG9jYXRpb24gPSBjYXRhbG9nUmVzb2x2ZXIucmVzb2x2ZVB1YmxpYyhuYW1lc3BhY2UsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQ2F0YWxvZyByZXNvbHV0aW9uIGZhaWxlZCIsIGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc29sdmVkSW1wb3J0TG9jYXRpb247Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEFzIGZvciB0aGUgcmVzb2x2ZXIgdGhlIHB1YmxpYyBJRCBpcyB0aGUgdGFyZ2V0IG5hbWVzcGFjZSBvZiB0aGUKLSAgICAgKiBzY2hlbWEgYW5kIHRoZSBzY2hlbWFMb2NhdGlvbiBpcyB0aGUgdmFsdWUgb2YgdGhlIHNjaGVtYSBsb2NhdGlvbgotICAgICAqIEBwYXJhbSBuYW1lc3BhY2UKLSAgICAgKiBAcGFyYW0gc2NoZW1hTG9jYXRpb24KLSAgICAgKiBAcGFyYW0gYmFzZVVyaQotICAgICAqLwotICAgIHB1YmxpYyBJbnB1dFNvdXJjZSByZXNvbHZlRW50aXR5KFN0cmluZyBuYW1lc3BhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNjaGVtYUxvY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBiYXNlVXJpKSB7Ci0gICAgICAgIFN0cmluZyBsb2NhdGlvbiA9IHNjaGVtYUxvY2F0aW9uOyAgICAgCi0gICAgICAgIAotICAgICAgICBpZiAodGhpcy5jYXRhbG9nUmVzb2x2ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIHJlZGlyZWN0ZWRVUkkgPSBnZXRSZWRpcmVjdGVkVVJJKG5hbWVzcGFjZSwgc2NoZW1hTG9jYXRpb24sIGJhc2VVcmkpOwotICAgICAgICAgICAgaWYgKHJlZGlyZWN0ZWRVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGxvY2F0aW9uID0gcmVkaXJlY3RlZFVSSTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHN1cGVyLnJlc29sdmVFbnRpdHkobmFtZXNwYWNlLCBsb2NhdGlvbiwgYmFzZVVyaSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy91dGlsL0NhdGFsb2dXU0RMTG9jYXRvci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvdXRpbC9DYXRhbG9nV1NETExvY2F0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTEzMjU1Yy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy91dGlsL0NhdGFsb2dXU0RMTG9jYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51dGlsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jYXRhbG9nLkpBWFdTQ2F0YWxvZ01hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWwucmVzb2x2ZXIuQ2F0YWxvZzsKLQotaW1wb3J0IGphdmF4LndzZGwueG1sLldTRExMb2NhdG9yOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIGEgV1NETDRKIGludGVyZmFjZSBhbmQgaXMgdGhlCi0gKiBpbXBsZW1lbnRhdGlvbiB3ZSBzdXBwbHkgdG8gYSBXU0RMUmVhZGVyIGluc3RhbmNlLiBJdHMgcHJpbWFyeSAKLSAqIGdvYWwgaXMgdG8gYXNzaXN0IHdpdGggbG9jYXRpbmcgaW1wb3J0ZWQgV1NETCBkb2N1bWVudHMuCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIENhdGFsb2dXU0RMTG9jYXRvciBleHRlbmRzIEJhc2VXU0RMTG9jYXRvciBpbXBsZW1lbnRzIFdTRExMb2NhdG9yIHsKLQotICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhDYXRhbG9nV1NETExvY2F0b3IuY2xhc3MpOwotICAgIHByaXZhdGUgQ2F0YWxvZyBjYXRhbG9nUmVzb2x2ZXI7Ci0gICAgcHJpdmF0ZSBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcjsKLQotICAgIC8qKgotICAgICAqIENhdGFsb2dXU0RMTG9jYXRvciBjb25zdHJ1Y3Rvci4gIFJlc29sdmVzIFdTREwgVVJJcyB1c2luZyBBcGFjaGUgQ29tbW9ucyBSZXNvbHZlciBBUEkuCi0gICAgICogQHBhcmFtIHVyaQotICAgICAqICAgICAgICAgICAgdGhlIHBhdGggZm9yIHRoZSBiYXNlIHdzZGwgZmlsZSwgcmVsYXRpdmUgdG8gdGhlIG1vZHVsZSByb290Ci0gICAgICogQHBhcmFtIHN0cmVhbQotICAgICAqICAgICAgICAgICAgdGhlIElucHV0U3RyZWFtIGZvciB0aGUgYmFzZSB3c2RsIGZpbGUKLSAgICAgKiBAcGFyYW0gY2xhc3Nsb2FkZXIKLSAgICAgKiAgICAgICAgICAgIHRoZSBDbGFzc0xvYWRlciBmb3IgdGhlIG1vZHVsZQotICAgICAqIEBwYXJhbSBjYXRhbG9nTWFuYWdlcgotICAgICAqICAgICAgICAgICAgdGhlIE9BU0lTQ2F0YWxvZ01hbmFnZXIgd2hpY2ggd2lsbCBkZXRlcm1pbmUgdGhlIHNldHRpbmdzIGZvciB0aGUgWE1MIGNhdGFsb2cKLSAgICAgKi8KLSAgICBwdWJsaWMgQ2F0YWxvZ1dTRExMb2NhdG9yKFN0cmluZyB1cmksIElucHV0U3RyZWFtIHN0cmVhbSwKLSAgICAgICAgICAgIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyLCBKQVhXU0NhdGFsb2dNYW5hZ2VyIGNhdGFsb2dNYW5hZ2VyKSB7Ci0gICAgICAgIGJhc2VVUkkgPSBjb252ZXJ0VVJJKHVyaSk7Ci0gICAgICAgIGJhc2VJbnB1dFN0cmVhbSA9IHN0cmVhbTsKLSAgICAgICAgdGhpcy5jbGFzc0xvYWRlciA9IGNsYXNzTG9hZGVyOwotICAgICAgICB0aGlzLmNhdGFsb2dSZXNvbHZlciA9IGNhdGFsb2dNYW5hZ2VyLmdldENhdGFsb2coKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXNvbHZlcyBXU0RMIFVSSXMgdXNpbmcgQXBhY2hlIENvbW1vbnMgUmVzb2x2ZXIgQVBJLgotICAgICAqIAotICAgICAqIEBwYXJhbSBpbXBvcnRVUkkgYSBVUkkgc3BlY2lmeWluZyB0aGUgZG9jdW1lbnQgdG8gaW1wb3J0Ci0gICAgICogQHBhcmFtIHBhcmVudCBhIFVSSSBzcGVjaWZ5aW5nIHRoZSBsb2NhdGlvbiBvZiB0aGUgcGFyZW50IGRvY3VtZW50IGRvaW5nCi0gICAgICogdGhlIGltcG9ydGluZwotICAgICAqIEByZXR1cm4gdGhlIHJlc29sdmVkIGltcG9ydCBsb2NhdGlvbiwgb3IgbnVsbCBpZiBubyBpbmRpcmVjdGlvbiBpcyBwZXJmb3JtZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFJlZGlyZWN0ZWRVUkkoU3RyaW5nIGltcG9ydFVSSSwgU3RyaW5nIHBhcmVudCkgewotICAgICAgICBTdHJpbmcgcmVzb2x2ZWRJbXBvcnRMb2NhdGlvbiA9IG51bGw7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJlc29sdmVkSW1wb3J0TG9jYXRpb24gPSB0aGlzLmNhdGFsb2dSZXNvbHZlci5yZXNvbHZlU3lzdGVtKGltcG9ydFVSSSk7Ci0gICAgICAgICAgICBpZiAocmVzb2x2ZWRJbXBvcnRMb2NhdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmVzb2x2ZWRJbXBvcnRMb2NhdGlvbiA9IGNhdGFsb2dSZXNvbHZlci5yZXNvbHZlVVJJKGltcG9ydFVSSSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocmVzb2x2ZWRJbXBvcnRMb2NhdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmVzb2x2ZWRJbXBvcnRMb2NhdGlvbiA9IGNhdGFsb2dSZXNvbHZlci5yZXNvbHZlUHVibGljKGltcG9ydFVSSSwgcGFyZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJDYXRhbG9nIHJlc29sdXRpb24gZmFpbGVkIiwgZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc29sdmVkSW1wb3J0TG9jYXRpb247Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gSW5wdXRTdHJlYW0gcG9pbnRlZCBhdCBhbiBpbXBvcnRlZCB3c2RsIHBhdGhuYW1lIHJlbGF0aXZlIHRvCi0gICAgICogdGhlIHBhcmVudCBkb2N1bWVudC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW1wb3J0UGF0aAotICAgICAqICAgICAgICAgICAgaWRlbnRpZmllcyB0aGUgV1NETCBmaWxlIHdpdGhpbiB0aGUgY29udGV4dAotICAgICAqIEByZXR1cm4gYSBzdHJlYW0gb2YgdGhlIFdTREwgZmlsZQotICAgICAqLwotICAgIHByb3RlY3RlZCBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbShTdHJpbmcgaW1wb3J0UGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgVVJMIGltcG9ydFVSTCA9IG51bGw7Ci0gICAgICAgIElucHV0U3RyZWFtIGlzID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGltcG9ydFVSTCA9IG5ldyBVUkwoaW1wb3J0UGF0aCk7Ci0gICAgICAgICAgICBpcyA9IGltcG9ydFVSTC5vcGVuU3RyZWFtKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0gICAgICAgICAgICAvLyBObyBGRkRDIHJlcXVpcmVkCi0gICAgICAgIH0KLSAgICAgICAgaWYgKGlzID09IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaXMgPSBjbGFzc0xvYWRlci5nZXRSZXNvdXJjZUFzU3RyZWFtKGltcG9ydFBhdGgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0gICAgICAgICAgICAgICAgLy8gTm8gRkZEQyByZXF1aXJlZAotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChpcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGltcG9ydFBhdGgpOwotICAgICAgICAgICAgICAgIGlzID0gZmlsZS50b1VSTCgpLm9wZW5TdHJlYW0oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkgewotICAgICAgICAgICAgICAgIC8vIE5vIEZGREMgcmVxdWlyZWQKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoaXMgPT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBVUkkgdXJpID0gbmV3IFVSSShpbXBvcnRQYXRoKTsKLSAgICAgICAgICAgICAgICBpcyA9IHVyaS50b1VSTCgpLm9wZW5TdHJlYW0oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkgewotICAgICAgICAgICAgICAgIC8vIE5vIEZGREMgcmVxdWlyZWQKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSB3c2RsTG9jYXRpb24gaW4gVVJMIGZvcm0uIFdzZGxMb2NhdGlvbiBjb3VsZCBiZSBVUkwsIHJlbGF0aXZlCi0gICAgICogbW9kdWxlIHBhdGgsIGZ1bGwgYWJzb2x1dGUgcGF0aC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gd3NkbExvY2F0aW9uCi0gICAgICogICAgICAgICAgICB0aGUgbG9jYXRpb24gb2YgYSBXU0RMIGRvY3VtZW50IGluIHRoZSBmb3JtIG9mIGEgVVJMIHN0cmluZywgYQotICAgICAqICAgICAgICAgICAgcmVsYXRpdmUgcGF0aG5hbWUgKHJlbGF0aXZlIHRvIHRoZSByb290IG9mIGEgbW9kdWxlLCBvciBhCi0gICAgICogICAgICAgICAgICBmdWxsLXF1YWxpZmllZCBhYnNvbHV0ZSBwYXRobmFtZQotICAgICAqIEByZXR1cm4gdGhlIGxvY2F0aW9uIG9mIHRoZSBXU0RMIGRvY3VtZW50IGluIHRoZSBmb3JtIG9mIGEgVVJMCi0gICAgICovCi0gICAgcHVibGljIFVSTCBnZXRXc2RsVXJsKFN0cmluZyB3c2RsTG9jYXRpb24pIHsKLSAgICAgICAgVVJMIHN0cmVhbVVSTCA9IG51bGw7Ci0gICAgICAgIElucHV0U3RyZWFtIGlzID0gbnVsbDsKLSAgICAgICAgVVJJIHBhdGhVUkkgPSBudWxsOwotCi0gICAgICAgIC8vIElmIHRoZSBXU0RMIGlzIHByZXNlbnQgaW4gdGhlIGNhdGFsb2csIHVzZSB0aGUgbG9jYXRpb24gc3BlY2lmaWVkIAotICAgICAgICAvLyBpbiB0aGUgY2F0YWxvZy4gIElmIHRoaXMgYXR0ZW1wdCByZXN1bHRzIGluIGZhaWx1cmUsIHVzZSB0aGUgb3JpZ2luYWwKLSAgICAgICAgLy8gbG9jYXRpb24KLSAgICAgICAgLy8gVE9ETzogIFByb3ZpZGUgQWxsb3dhbmNlIGZvciBDYXRhbG9nCi0gICAgICAgIC8vIE5vdGU6ICBUaGlzIG1ldGhvZCBpcyBub3QgY2FsbGVkLgotICAgICAgICAKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHN0cmVhbVVSTCA9IG5ldyBVUkwod3NkbExvY2F0aW9uKTsKLSAgICAgICAgICAgIGlzID0gc3RyZWFtVVJMLm9wZW5TdHJlYW0oKTsKLSAgICAgICAgICAgIGlzLmNsb3NlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0gICAgICAgICAgICAvLyBObyBGRkRDIHJlcXVpcmVkCi0gICAgICAgIH0KLQotICAgICAgICBpZiAoaXMgPT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBwYXRoVVJJID0gbmV3IFVSSSh3c2RsTG9jYXRpb24pOwotICAgICAgICAgICAgICAgIHN0cmVhbVVSTCA9IHBhdGhVUkkudG9VUkwoKTsKLSAgICAgICAgICAgICAgICBpcyA9IHN0cmVhbVVSTC5vcGVuU3RyZWFtKCk7Ci0gICAgICAgICAgICAgICAgaXMuY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkgewotICAgICAgICAgICAgICAgIC8vIE5vIEZGREMgcmVxdWlyZWQKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKHdzZGxMb2NhdGlvbik7Ci0gICAgICAgICAgICAgICAgc3RyZWFtVVJMID0gZmlsZS50b1VSTCgpOwotICAgICAgICAgICAgICAgIGlzID0gc3RyZWFtVVJMLm9wZW5TdHJlYW0oKTsKLSAgICAgICAgICAgICAgICBpcy5jbG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0gICAgICAgICAgICAgICAgLy8gTm8gRkZEQyByZXF1aXJlZAotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpICYmIHN0cmVhbVVSTCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIkFic29sdXRlIHdzZGxMb2NhdGlvbiBjb3VsZCBub3QgYmUgZGV0ZXJtaW5lZDogIgotICAgICAgICAgICAgICAgICAgICArIHdzZGxMb2NhdGlvbik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc3RyZWFtVVJMOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgewotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3V0aWwvQ2xhc3NMb2FkZXJVdGlscy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvdXRpbC9DbGFzc0xvYWRlclV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyNjlhOGIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvdXRpbC9DbGFzc0xvYWRlclV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnV0aWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLkV4Y2VwdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uOwotCi0vKioKLSAqIEBkZXByZWNhdGVkIC0gU2VjdXJpdHkgUmlzay4gUGxlYXNlIGRvbid0IHVzZSB0aGlzIGNsYXNzLCBBcyBhIGdlbmVyYWwgcnVsZQotICogZW5kIHVzZXIgY29kZSBzaG91bGQgbm90IGJlIGFibGUgdG8gYWNjZXNzIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkICAKLSAqLwotcHVibGljIGNsYXNzIENsYXNzTG9hZGVyVXRpbHMgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKENsYXNzTG9hZGVyVXRpbHMuY2xhc3MpOwotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBDbGFzc0xvYWRlcgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQ2xhc3NMb2FkZXIgZ2V0Q2xhc3NMb2FkZXIoZmluYWwgQ2xhc3MgY2xzKSB7Ci0gICAgICAgIENsYXNzTG9hZGVyIGNsID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNsID0gKENsYXNzTG9hZGVyKSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgKLSAgICAgICAgICAgICAgICAgICAgbmV3IFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2xzLmdldENsYXNzTG9hZGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICk7Ci0gICAgICAgIH0gY2F0Y2ggKFByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJFeGNlcHRpb24gdGhyb3duIGZyb20gQWNjZXNzQ29udHJvbGxlcjogIiArIGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlLmdldEV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIENsYXNzTG9hZGVyCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBDbGFzc0xvYWRlciBnZXRDb250ZXh0Q2xhc3NMb2FkZXIoZmluYWwgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpIHsKLSAgICAgICAgQ2xhc3NMb2FkZXIgY2w7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjbCA9IChDbGFzc0xvYWRlcikgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoCi0gICAgICAgICAgICAgICAgICAgIG5ldyBQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNsYXNzTG9hZGVyICE9IG51bGwgPyBjbGFzc0xvYWRlciA6IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICk7Ci0gICAgICAgIH0gY2F0Y2ggKFByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJFeGNlcHRpb24gdGhyb3duIGZyb20gQWNjZXNzQ29udHJvbGxlcjogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZS5nZXRFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gY2w7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBjbGFzcyBmb3IgdGhpcyBuYW1lCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIENsYXNzCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBDbGFzcyBmb3JOYW1lKGZpbmFsIFN0cmluZyBjbGFzc05hbWUsIGZpbmFsIGJvb2xlYW4gaW5pdGlhbGl6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ2xhc3NMb2FkZXIgY2xhc3Nsb2FkZXIpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgQ2xhc3MgY2wgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY2wgPSAoQ2xhc3MpIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAotICAgICAgICAgICAgICAgICAgICBuZXcgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSwgaW5pdGlhbGl6ZSwgY2xhc3Nsb2FkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICApOwotICAgICAgICB9IGNhdGNoIChQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiRXhjZXB0aW9uIHRocm93biBmcm9tIEFjY2Vzc0NvbnRyb2xsZXI6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aHJvdyAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbikgZS5nZXRFeGNlcHRpb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIGNsYXNzIGZvciB0aGlzIG5hbWUKLSAgICAgKgotICAgICAqIEByZXR1cm4gQ2xhc3MKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIENsYXNzIGZvck5hbWUoZmluYWwgU3RyaW5nIGNsYXNzTmFtZSkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICBDbGFzcyBjbCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjbCA9IChDbGFzcykgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoCi0gICAgICAgICAgICAgICAgICAgIG5ldyBQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENsYXNzLmZvck5hbWUoY2xhc3NOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgKTsKLSAgICAgICAgfSBjYXRjaCAoUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkV4Y2VwdGlvbiB0aHJvd24gZnJvbSBBY2Nlc3NDb250cm9sbGVyOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhyb3cgKENsYXNzTm90Rm91bmRFeGNlcHRpb24pIGUuZ2V0RXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gY2w7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy91dGlsL0NvbnN0YW50cy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvdXRpbC9Db25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJlNzYwNi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy91dGlsL0NvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnV0aWw7Ci0KLXB1YmxpYyBjbGFzcyBDb25zdGFudHMgewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVSSV9XU0RMX1NPQVAxMSA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUklfV1NETF9TT0FQMTIgPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwMTIvIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUklfV1NETF9TT0FQMTFfQk9EWSA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUklfV1NETF9TT0FQMTJfQk9EWSA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAxMi8iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVSSV9XU0RMX1NPQVAxMV9IRUFERVIgPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJJX1dTRExfU09BUDEyX0hFQURFUiA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAxMi8iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVSSV9XU0RMX1NPQVAxMV9CSU5ESU5HID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVSSV9XU0RMX1NPQVAxMl9CSU5ESU5HID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcDEyLyI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQT0xJQ1kgPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOS9wb2xpY3kiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBPTElDWV9SRUZFUkVOQ0UgPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOS9wb2xpY3kiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NIRU1BID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEFYSVMyX1JFUE9fUEFUSCA9ICJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnJlcG8ucGF0aCI7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQVhJUzJfQ09ORklHX1BBVEggPSAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb25maWcucGF0aCI7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgVVNFX0FTWU5DX01FUCA9ICJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnVzZS5hc3luYy5tZXAiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEhSRUFEX0NPTlRFWFRfTUlHUkFUT1JfTElTVF9JRCA9ICJKQVhXUy1UaHJlYWRDb250ZXh0TWlncmF0b3ItTGlzdCI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTlZPQ0FUSU9OX1BBVFRFUk4gPSAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5pbnZvY2F0aW9uLnBhdHRlcm4iOwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEFEQVRBX1JFR0lTVFJZX0NPTkZJR19GSUxFID0gCi0gICAgICAgICJNRVRBLUlORi9zZXJ2aWNlcy9vcmcuYXBhY2hlLmF4aXMyLm1ldGFkYXRhLnJlZ2lzdHJ5Lk1ldGFkYXRhRmFjdG9yeVJlZ2lzdHJ5IjsKLSAgICAKLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3V0aWwvTW9kdWxlV1NETExvY2F0b3IuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3V0aWwvTW9kdWxlV1NETExvY2F0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGE0MGRjZC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy91dGlsL01vZHVsZVdTRExMb2NhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnV0aWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LndzZGwueG1sLldTRExMb2NhdG9yOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIGEgV1NETDRKIGludGVyZmFjZSBhbmQgaXMgdGhlCi0gKiBpbXBsZW1lbnRhdGlvbiB3ZSBzdXBwbHkgdG8gYSBXU0RMUmVhZGVyIGluc3RhbmNlLiBJdHMgcHJpbWFyeSAKLSAqIGdvYWwgaXMgdG8gYXNzaXN0IHdpdGggbG9jYXRpbmcgaW1wb3J0ZWQgV1NETCBkb2N1bWVudHMuCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIE1vZHVsZVdTRExMb2NhdG9yIGV4dGVuZHMgQmFzZVdTRExMb2NhdG9yIGltcGxlbWVudHMgV1NETExvY2F0b3IgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKE1vZHVsZVdTRExMb2NhdG9yLmNsYXNzKTsKLSAgICAKLSAgICBwcml2YXRlIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyOwotCi0gICAgLyoqCi0gICAgICogTW9kdWxlV1NETExvY2F0b3IgY29uc3RydWN0b3IuCi0gICAgICogQHBhcmFtIHVyaQotICAgICAqICAgICAgICAgICAgdGhlIHBhdGggZm9yIHRoZSBiYXNlIHdzZGwgZmlsZSwgcmVsYXRpdmUgdG8gdGhlIG1vZHVsZSByb290Ci0gICAgICogQHBhcmFtIHN0cmVhbQotICAgICAqICAgICAgICAgICAgdGhlIElucHV0U3RyZWFtIGZvciB0aGUgYmFzZSB3c2RsIGZpbGUKLSAgICAgKiBAcGFyYW0gc3RyYXRlZ3kKLSAgICAgKiAgICAgICAgICAgIHRoZSBsb2FkIHN0cmF0ZWd5IGZvciB0aGUgbW9kdWxlCi0gICAgICovCi0gICAgcHVibGljIE1vZHVsZVdTRExMb2NhdG9yKFN0cmluZyB1cmksIElucHV0U3RyZWFtIHN0cmVhbSwKLSAgICAgICAgICAgIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKSB7Ci0gICAgICAgIGJhc2VVUkkgPSBjb252ZXJ0VVJJKHVyaSk7Ci0gICAgICAgIGJhc2VJbnB1dFN0cmVhbSA9IHN0cmVhbTsKLSAgICAgICAgdGhpcy5jbGFzc0xvYWRlciA9IGNsYXNzTG9hZGVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgbnVsbCBiZWNhdXNlIG5vIFVSSSBpbmRpcmVjdGlvbiBpcyBwZXJmb3JtZWQgd2hlbiAKLSAgICAgKiB1c2luZyB0aGUgTW9kdWxlV1NETExvY2F0b3IuCi0gICAgICogCi0gICAgICogQHBhcmFtIGltcG9ydFVSSSBhIFVSSSBzcGVjaWZ5aW5nIHRoZSBkb2N1bWVudCB0byBpbXBvcnQKLSAgICAgKiBAcGFyYW0gcGFyZW50IGEgVVJJIHNwZWNpZnlpbmcgdGhlIGxvY2F0aW9uIG9mIHRoZSBwYXJlbnQgZG9jdW1lbnQgZG9pbmcKLSAgICAgKiB0aGUgaW1wb3J0aW5nCi0gICAgICogQHJldHVybiBudWxsCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRSZWRpcmVjdGVkVVJJKFN0cmluZyBpbXBvcnRVUkksIFN0cmluZyBwYXJlbnQpIHsKLSAgICAJcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gSW5wdXRTdHJlYW0gcG9pbnRlZCBhdCBhbiBpbXBvcnRlZCB3c2RsIHBhdGhuYW1lIHJlbGF0aXZlIHRvCi0gICAgICogdGhlIHBhcmVudCBkb2N1bWVudC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW1wb3J0UGF0aAotICAgICAqICAgICAgICAgICAgaWRlbnRpZmllcyB0aGUgV1NETCBmaWxlIHdpdGhpbiB0aGUgY29udGV4dAotICAgICAqIEByZXR1cm4gYSBzdHJlYW0gb2YgdGhlIFdTREwgZmlsZQotICAgICAqLwotICAgIHByb3RlY3RlZCBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbShTdHJpbmcgaW1wb3J0UGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgVVJMIGltcG9ydFVSTCA9IG51bGw7Ci0gICAgICAgIElucHV0U3RyZWFtIGlzID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGltcG9ydFVSTCA9IG5ldyBVUkwoaW1wb3J0UGF0aCk7Ci0gICAgICAgICAgICBpcyA9IGltcG9ydFVSTC5vcGVuU3RyZWFtKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0gICAgICAgICAgICAvLyBObyBGRkRDIHJlcXVpcmVkCi0gICAgICAgIH0KLSAgICAgICAgaWYgKGlzID09IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaXMgPSBjbGFzc0xvYWRlci5nZXRSZXNvdXJjZUFzU3RyZWFtKGltcG9ydFBhdGgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0gICAgICAgICAgICAgICAgLy8gTm8gRkZEQyByZXF1aXJlZAotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChpcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGltcG9ydFBhdGgpOwotICAgICAgICAgICAgICAgIGlzID0gZmlsZS50b1VSTCgpLm9wZW5TdHJlYW0oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkgewotICAgICAgICAgICAgICAgIC8vIE5vIEZGREMgcmVxdWlyZWQKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoaXMgPT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBVUkkgdXJpID0gbmV3IFVSSShpbXBvcnRQYXRoKTsKLSAgICAgICAgICAgICAgICBpcyA9IHVyaS50b1VSTCgpLm9wZW5TdHJlYW0oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkgewotICAgICAgICAgICAgICAgIC8vIE5vIEZGREMgcmVxdWlyZWQKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSB3c2RsTG9jYXRpb24gaW4gVVJMIGZvcm0uIFdzZGxMb2NhdGlvbiBjb3VsZCBiZSBVUkwsIHJlbGF0aXZlCi0gICAgICogbW9kdWxlIHBhdGgsIGZ1bGwgYWJzb2x1dGUgcGF0aC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gd3NkbExvY2F0aW9uCi0gICAgICogICAgICAgICAgICB0aGUgbG9jYXRpb24gb2YgYSBXU0RMIGRvY3VtZW50IGluIHRoZSBmb3JtIG9mIGEgVVJMIHN0cmluZywgYQotICAgICAqICAgICAgICAgICAgcmVsYXRpdmUgcGF0aG5hbWUgKHJlbGF0aXZlIHRvIHRoZSByb290IG9mIGEgbW9kdWxlLCBvciBhCi0gICAgICogICAgICAgICAgICBmdWxsLXF1YWxpZmllZCBhYnNvbHV0ZSBwYXRobmFtZQotICAgICAqIEByZXR1cm4gdGhlIGxvY2F0aW9uIG9mIHRoZSBXU0RMIGRvY3VtZW50IGluIHRoZSBmb3JtIG9mIGEgVVJMCi0gICAgICovCi0gICAgcHVibGljIFVSTCBnZXRXc2RsVXJsKFN0cmluZyB3c2RsTG9jYXRpb24pIHsKLSAgICAgICAgVVJMIHN0cmVhbVVSTCA9IG51bGw7Ci0gICAgICAgIElucHV0U3RyZWFtIGlzID0gbnVsbDsKLSAgICAgICAgVVJJIHBhdGhVUkkgPSBudWxsOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzdHJlYW1VUkwgPSBuZXcgVVJMKHdzZGxMb2NhdGlvbik7Ci0gICAgICAgICAgICBpcyA9IHN0cmVhbVVSTC5vcGVuU3RyZWFtKCk7Ci0gICAgICAgICAgICBpcy5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkgewotICAgICAgICAgICAgLy8gTm8gRkZEQyByZXF1aXJlZAotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGlzID09IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcGF0aFVSSSA9IG5ldyBVUkkod3NkbExvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICBzdHJlYW1VUkwgPSBwYXRoVVJJLnRvVVJMKCk7Ci0gICAgICAgICAgICAgICAgaXMgPSBzdHJlYW1VUkwub3BlblN0cmVhbSgpOwotICAgICAgICAgICAgICAgIGlzLmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgICAgICAgICAvLyBObyBGRkRDIHJlcXVpcmVkCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaXMgPT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZSh3c2RsTG9jYXRpb24pOwotICAgICAgICAgICAgICAgIHN0cmVhbVVSTCA9IGZpbGUudG9VUkwoKTsKLSAgICAgICAgICAgICAgICBpcyA9IHN0cmVhbVVSTC5vcGVuU3RyZWFtKCk7Ci0gICAgICAgICAgICAgICAgaXMuY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkgewotICAgICAgICAgICAgICAgIC8vIE5vIEZGREMgcmVxdWlyZWQKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSAmJiBzdHJlYW1VUkwgPT0gbnVsbCkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJBYnNvbHV0ZSB3c2RsTG9jYXRpb24gY291bGQgbm90IGJlIGRldGVybWluZWQ6ICIKLSAgICAgICAgICAgICAgICAgICAgKyB3c2RsTG9jYXRpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHN0cmVhbVVSTDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvdXRpbC9Tb2FwVXRpbHMuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3V0aWwvU29hcFV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyODVkNGEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvdXRpbC9Tb2FwVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51dGlsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuYnVpbGRlci5TdEFYT01CdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYWN0b3J5OwotCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci0KLXB1YmxpYyBjbGFzcyBTb2FwVXRpbHMgewotCi0KLSAgICBwdWJsaWMgc3RhdGljIE9NRWxlbWVudCBnZXRPTUVsZW1lbnQoU09BUEVudmVsb3BlIHJlc3BvbnNlKSB7Ci0gICAgICAgIFhNTFN0cmVhbVJlYWRlciBwYXJzZXIgPSByZXNwb25zZS5nZXRYTUxTdHJlYW1SZWFkZXIoKTsKLQotICAgICAgICBTdEFYT01CdWlsZGVyIGJ1aWxkZXIgPQotICAgICAgICAgICAgICAgIG5ldyBTdEFYT01CdWlsZGVyKE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpLCBwYXJzZXIpOwotCi0gICAgICAgIHJldHVybiBidWlsZGVyLmdldERvY3VtZW50RWxlbWVudCgpOwotCi0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTT0FQRmFjdG9yeSBnZXRTb2FwRmFjdG9yeShTdHJpbmcgc29hcFZlcnNpb25VUkkpIHsKLSAgICAgICAgaWYgKCJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUiLmVxdWFscyhzb2FwVmVyc2lvblVSSSkpCi0gICAgICAgICAgICByZXR1cm4gT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDEyRmFjdG9yeSgpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDExRmFjdG9yeSgpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvdXRpbC9XU0RMNEpXcmFwcGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy91dGlsL1dTREw0SldyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU3ZTlkZi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy91dGlsL1dTREw0SldyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMTYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnV0aWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5QYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0NvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5FeGNlcHRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY2F0YWxvZy5KQVhXU0NhdGFsb2dNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY2F0YWxvZy5pbXBsLk9BU0lTQ2F0YWxvZ01hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5pMThuLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Mud3NkbC5XU0RMUmVhZGVyQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIubWV0YWRhdGEuZmFjdG9yeS5SZXNvdXJjZUZpbmRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5tZXRhZGF0YS5yZWdpc3RyeS5NZXRhZGF0YUZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLm1ldGFkYXRhLnJlc291cmNlLlJlc291cmNlRmluZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC51dGlsLldTRExEZWZpbml0aW9uV3JhcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZzsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuUG9ydDsKLWltcG9ydCBqYXZheC53c2RsLlNlcnZpY2U7Ci1pbXBvcnQgamF2YXgud3NkbC5XU0RMRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQT3BlcmF0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuZmFjdG9yeS5XU0RMRmFjdG9yeTsKLWltcG9ydCBqYXZheC53c2RsLnhtbC5XU0RMUmVhZGVyOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5Db25uZWN0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5VUkxDbGFzc0xvYWRlcjsKLWltcG9ydCBqYXZhLm5ldC5VUkxDb25uZWN0aW9uOwotaW1wb3J0IGphdmEubmV0LlVua25vd25Ib3N0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5qYXIuSmFyRW50cnk7Ci1pbXBvcnQgamF2YS51dGlsLmphci5KYXJGaWxlOwotCi0KLS8qKgotICogSW1wbGVtZW50YXRpb24gb2YgV1NETFdyYXBwZXIgaW50ZXJmYWNlIHdoaWNoIGNvbnRyb2xzIGFjY2VzcwotICogdG8gdGhlIHVuZGVybHlpbmcgRGVmaW5pdGlvbiAoV1NETERlZmluaXRpb25XcmFwcGVyKS4KLSAqIFRoZSBXU0RMRGVmaW5pdGlvbldyYXBwZXIgaW1wbGVtZW50YXRpb24gdXNlcyB2YXJpb3VzIHN0cmF0ZWdpZXMKLSAqIHRvIGNvbnRyb2wgaXRzIGluLW1lbW9yeSBmb290cHJpbnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0RMNEpXcmFwcGVyIGltcGxlbWVudHMgV1NETFdyYXBwZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhXU0RMNEpXcmFwcGVyLmNsYXNzKTsKLQotICAgIHByaXZhdGUgV1NETERlZmluaXRpb25XcmFwcGVyIHdzZGxEZWZpbml0aW9uID0gbnVsbDsKLQotICAgIHByaXZhdGUgVVJMIHdzZGxVUkw7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgd3NkbEV4cGxpY2l0VVJMOwotICAgIHByaXZhdGUgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ29udGV4dDsKLSAgICBwcml2YXRlIEpBWFdTQ2F0YWxvZ01hbmFnZXIgY2F0YWxvZ01hbmFnZXIgPSBudWxsOwotICAgIAotICAgIC8vIEJ5IGRlZmF1bHQsIHVzZSBhIHJlbG9hZCBzdHJhdGVneSBmb3IgdGhlIFdTRExXcmFwcGVyCi0gICAgcHJpdmF0ZSBib29sZWFuIGxpbWl0TWVtb3J5ID0gdHJ1ZTsKLSAgICBwcml2YXRlIGludCBtZW1vcnlUeXBlID0gMjsKLSAgICAKLSAgIC8qKgotICAgICogQ29uc3RydWN0b3IKLSAgICAqCi0gICAgKiBAcGFyYW0gVVJMICAgVGhlIFVSTCBmb3IgdGhlIFdTREwKLSAgICAqIEBkZXByZWNhdGVkIFVzZSBhIGNvbnN0cnVjdG9yIHRoYXQgcGFzc2VzIGluIHRoZSBDb25maWdDb250ZXh0LCBvciBtZW1vcnlMaW1pdCBwYXJhbWV0ZXIKLSAgICAqLwotICAgIHB1YmxpYyBXU0RMNEpXcmFwcGVyKFVSTCB3c2RsVVJMKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBVbmtub3duSG9zdEV4Y2VwdGlvbiwKLSAgICAgICAgICAgIENvbm5lY3RFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBXU0RMRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgdGhpcy5jb21tb25QYXJ0c1VSTENvbnN0cnVjdG9yKHdzZGxVUkwsIChDb25maWd1cmF0aW9uQ29udGV4dCludWxsKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHdzZGxVUkwKLSAgICAgKiBAcGFyYW0gbGltaXRNZW1vcnkgdHJ1ZSBpZiBtZW1vcnkgc2hvdWxkIGJlIGxpbWl0ZWQKLSAgICAgKiBAdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgVW5rbm93bkhvc3RFeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIENvbm5lY3RFeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBXU0RMRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIFdTREw0SldyYXBwZXIoVVJMIHdzZGxVUkwsIGJvb2xlYW4gbGltaXRNZW1vcnksIGludCBtZW1vcnlUeXBlKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBVbmtub3duSG9zdEV4Y2VwdGlvbiwKLSAgICBDb25uZWN0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgV1NETEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIHRoaXMubGltaXRNZW1vcnkgPSBsaW1pdE1lbW9yeTsKLSAgICAgICAgdGhpcy5tZW1vcnlUeXBlID0gbWVtb3J5VHlwZTsKLSAgICAgICAgdGhpcy5jb21tb25QYXJ0c1VSTENvbnN0cnVjdG9yKHdzZGxVUkwsIChDb25maWd1cmF0aW9uQ29udGV4dCludWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gd3NkbFVSTAotICAgICAqIEBwYXJhbSBjYXRhbG9nTWFuYWdlcgotICAgICAqIEB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBVbmtub3duSG9zdEV4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgQ29ubmVjdEV4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIFdTRExFeGNlcHRpb24KLSAgICAgKiBAZGVwcmVjYXRlZCB1c2UgYSBjb25zdHJ1Y3RvciB3aXRoIGEgQ29uZmlndXJhdGlvbkNvbnRleHQgb3IgbGltaXRNZW1vcnkgcGFyYW1ldGVyCi0gICAgICovCi0gICAgcHVibGljIFdTREw0SldyYXBwZXIoVVJMIHdzZGxVUkwsIEpBWFdTQ2F0YWxvZ01hbmFnZXIgY2F0YWxvZ01hbmFnZXIpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIAotICAgIFVua25vd25Ib3N0RXhjZXB0aW9uLCBDb25uZWN0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgV1NETEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMod3NkbFVSTCwgY2F0YWxvZ01hbmFnZXIsIGZhbHNlLCAwKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFdTREw0SldyYXBwZXIoVVJMIHdzZGxVUkwsIEpBWFdTQ2F0YWxvZ01hbmFnZXIgY2F0YWxvZ01hbmFnZXIsIGJvb2xlYW4gbGltaXRNZW1vcnkpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIAotICAgIFVua25vd25Ib3N0RXhjZXB0aW9uLCBDb25uZWN0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgV1NETEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIHRoaXMuY2F0YWxvZ01hbmFnZXIgPSBjYXRhbG9nTWFuYWdlcjsKLSAgICAgICAgdGhpcy5saW1pdE1lbW9yeSA9IGxpbWl0TWVtb3J5OwotICAgICAgICB0aGlzLmNvbW1vblBhcnRzVVJMQ29uc3RydWN0b3Iod3NkbFVSTCwgKENvbmZpZ3VyYXRpb25Db250ZXh0KW51bGwpOwotICAgIH0KLSAgICBwdWJsaWMgV1NETDRKV3JhcHBlcihVUkwgd3NkbFVSTCwgSkFYV1NDYXRhbG9nTWFuYWdlciBjYXRhbG9nTWFuYWdlciwgYm9vbGVhbiBsaW1pdE1lbW9yeSwgaW50IG1lbW9yeVR5cGUpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIAotICAgIFVua25vd25Ib3N0RXhjZXB0aW9uLCBDb25uZWN0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgV1NETEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIHRoaXMuY2F0YWxvZ01hbmFnZXIgPSBjYXRhbG9nTWFuYWdlcjsKLSAgICAgICAgdGhpcy5saW1pdE1lbW9yeSA9IGxpbWl0TWVtb3J5OwotICAgICAgICB0aGlzLm1lbW9yeVR5cGUgPSBtZW1vcnlUeXBlOwotICAgICAgICB0aGlzLmNvbW1vblBhcnRzVVJMQ29uc3RydWN0b3Iod3NkbFVSTCwgKENvbmZpZ3VyYXRpb25Db250ZXh0KW51bGwpOwotICAgIH0KLSAgICAgICAgCi0gICAgcHVibGljIFdTREw0SldyYXBwZXIoVVJMIHdzZGxVUkwsIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQsIAotICAgICAgICAgICAgSkFYV1NDYXRhbG9nTWFuYWdlciBjYXRhbG9nTWFuYWdlcikgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgCi0gICAgVW5rbm93bkhvc3RFeGNlcHRpb24sIENvbm5lY3RFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBXU0RMRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgdGhpcy5jYXRhbG9nTWFuYWdlciA9IGNhdGFsb2dNYW5hZ2VyOwotICAgICAgICB0aGlzLmNvbW1vblBhcnRzVVJMQ29uc3RydWN0b3Iod3NkbFVSTCwgY29uZmlnQ29udGV4dCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBXU0RMNEpXcmFwcGVyKFVSTCB3c2RsVVJMLCBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0KSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCAKLSAgICBVbmtub3duSG9zdEV4Y2VwdGlvbiwgQ29ubmVjdEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIFdTRExFeGNlcHRpb24gewotICAgICAgICBzdXBlcigpOwotICAgICAgICB0aGlzLmNvbW1vblBhcnRzVVJMQ29uc3RydWN0b3Iod3NkbFVSTCwgY29uZmlnQ29udGV4dCk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBjb21tb25QYXJ0c1VSTENvbnN0cnVjdG9yKFVSTCB3c2RsVVJMLCBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0KSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBVbmtub3duSG9zdEV4Y2VwdGlvbiwKLSAgICAgICAgICAgIENvbm5lY3RFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBXU0RMRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5jb25maWdDb250ZXh0ID0gY29uZmlnQ29udGV4dDsKLSAgICAvLyBkZWJ1Z01lbW9yeVBhcm1zKGNvbmZpZ0NvbnRleHQpOwotICAgICAgICBpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJXU0RMNEpXcmFwcGVyKFVSTCxDb25maWd1cmF0aW9uQ29udGV4dCkgLSBMb29raW5nIGZvciB3c2RsIGZpbGUgb24gY2xpZW50OiAiICsgKHdzZGxVUkwgIT0gbnVsbCA/IAotICAgICAgICAgICAgICAgICAgICB3c2RsVVJMLmdldFBhdGgoKTpudWxsKSk7Ci0gICAgICAgIH0KLSAgICAgICAgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIgPSAoQ2xhc3NMb2FkZXIpIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAotICAgICAgICAgICAgICAgIG5ldyBQcml2aWxlZ2VkQWN0aW9uKCkgewotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgIHRoaXMud3NkbFVSTCA9IHdzZGxVUkw7Ci0gICAgICAgCi0gICAgICAgIFVSTENvbm5lY3Rpb24gdXJsQ29uOwotICAgICAgICB0cnkgeyAgICAgICAgCi0gICAgICAgIAkKLSAgICAgICAgCXVybENvbiA9IGdldFByaXZpbGVnZWRVUkxDb25uZWN0aW9uKHRoaXMud3NkbFVSTCk7Ci0KLSAgICAgICAgCUlucHV0U3RyZWFtIGlzID0gbnVsbDsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpcyA9IGdldElucHV0U3RyZWFtKHVybENvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgaWYobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJDb3VsZCBub3Qgb3BlbiB1cmwgY29ubmVjdGlvbi4gVHJ5aW5nIHRvIHVzZSAiICsKLSAgICAgICAgICAgICAgICAgICAgImNsYXNzbG9hZGVyIHRvIGdldCBhbm90aGVyIFVSTC4iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGZpbGVQYXRoID0gd3NkbFVSTCAhPSBudWxsID8gd3NkbFVSTC5nZXRQYXRoKCkgOiBudWxsOwotICAgICAgICAgICAgICAgIGlmKGZpbGVQYXRoICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgVVJMIHVybCA9IGdldEFic29sdXRlVVJMKGNsYXNzTG9hZGVyLCBmaWxlUGF0aCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmKHVybCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ291bGQgbm90IGxvY2F0ZSBVUkwgZm9yIHdzZGwuIFJlcG9ydGluZyBlcnJvciIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBXU0RMRXhjZXB0aW9uKCJXU0RMNEpXcmFwcGVyIDogIiwgZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVybENvbiA9IG9wZW5Db25uZWN0aW9uKHVybCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkZvdW5kIFVSTCBmb3IgV1NETCBmcm9tIGphciIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJDb3VsZCBub3QgZ2V0IFVSTCBmcm9tIGNsYXNzbG9hZGVyLiBSZXBvcnRpbmcgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiZXJyb3IgZHVlIHRvIG5vIGZpbGUgcGF0aC4iKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV1NETEV4Y2VwdGlvbigiV1NETDRKV3JhcHBlciA6ICIsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZihpcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaXMuY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRoaXMud3NkbEV4cGxpY2l0VVJMID0gdXJsQ29uLmdldFVSTCgpLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICBnZXREZWZpbml0aW9uKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgdGhyb3cgZXg7Ci0gICAgICAgIH0gY2F0Y2ggKFVua25vd25Ib3N0RXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICB0aHJvdyBleDsKLSAgICAgICAgfSBjYXRjaCAoQ29ubmVjdEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgdGhyb3cgZXg7Ci0gICAgICAgIH0gY2F0Y2goSU9FeGNlcHRpb24gZXgpICB7Ci0gICAgICAgICAgICB0aHJvdyBleDsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgV1NETEV4Y2VwdGlvbigiV1NETDRKV3JhcHBlciA6ICIsIGV4LmdldE1lc3NhZ2UoKSwgZXgpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFRoaXMgaXMgYSBoZWxwZXIgbWV0aG9kIHRvIHJldHJpZXZlIGEgVVJMQ29ubmVjdGlvbiBvYmplY3QKLSAgICAgKiBiYXNlZCBvbiBhIFVSTCBmb3IgdGhlIFdTREwgZG9jdW1lbnQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBVUkxDb25uZWN0aW9uIGdldFVSTENvbm5lY3Rpb24oVVJMIHVybCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIGZpbGVQYXRoID0gbnVsbDsKLSAgICAgICAgYm9vbGVhbiBpc0ZpbGVQcm90b2NvbCA9Ci0gICAgICAgICAgICAgICAgKHVybCAhPSBudWxsICYmICJmaWxlIi5lcXVhbHModXJsLmdldFByb3RvY29sKCkpKSA/IHRydWUgOiBmYWxzZTsKLSAgICAgICAgaWYgKGlzRmlsZVByb3RvY29sKSB7Ci0gICAgICAgICAgICBmaWxlUGF0aCA9ICh1cmwgIT0gbnVsbCkgPyB1cmwuZ2V0UGF0aCgpIDogbnVsbDsKLSAgICAgICAgICAgIC8vQ2hlY2sgaXMgdGhlIHVyaSBoYXMgcmVsYXRpdmUgcGF0aCBpLmUgcGF0aCBpcyBub3QgYWJzb2x1dGUgYW5kIGlzIG5vdCBzdGFydGluZyB3aXRoIGEgIi8iCi0gICAgICAgICAgICBib29sZWFuIGlzUmVsYXRpdmVQYXRoID0KLSAgICAgICAgICAgICAgICAgICAgKGZpbGVQYXRoICE9IG51bGwgJiYgIW5ldyBGaWxlKGZpbGVQYXRoKS5pc0Fic29sdXRlKCkpID8gdHJ1ZSA6IGZhbHNlOwotICAgICAgICAgICAgaWYgKGlzUmVsYXRpdmVQYXRoKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiV1NETCBVUkwgaGFzIGEgcmVsYXRpdmUgcGF0aCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvL0xldHMgcmVhZCB0aGUgY29tcGxldGUgV1NETCBVUkwgZm9yIHJlbGF0aXZlIHBhdGggZnJvbSBjbGFzcyBsb2FkZXIKLSAgICAgICAgICAgICAgICAvL1VzZSByZWxhdGl2ZSBwYXRoIG9mIHVybCB0byBmZXRjaCBjb21wbGV0ZSBVUkwuCi0gICAgICAgICAgICAgICAgdXJsID0gZ2V0QWJzb2x1dGVVUkwoZ2V0VGhyZWFkQ2xhc3NMb2FkZXIoKSwgZmlsZVBhdGgpOwotICAgICAgICAgICAgICAgIGlmICh1cmwgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiV1NETCBVUkwgZm9yIHJlbGF0aXZlIHBhdGggbm90IGZvdW5kIGluIENsYXNzTG9hZGVyIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cud2FybigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byByZWFkIFdTREwgZnJvbSByZWxhdGl2ZSBwYXRoLCBjaGVjayB0aGUgcmVsYXRpdmUgcGF0aCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmluZm8oIlJlbGF0aXZlIHBhdGggZXhhbXBsZTogZmlsZTovV0VCLUlORi93c2RsLzx3c2RsZmlsZW5hbWU+Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cud2FybigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVzaW5nIHJlbGF0aXZlIHBhdGggYXMgZGVmYXVsdCB3c2RsIFVSTCB0byBjcmVhdGUgd3NkbCBEZWZpbml0aW9uLiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHVybCA9IHdzZGxVUkw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJXU0RMIFVSTCBmb3VuZCBmb3IgcmVsYXRpdmUgcGF0aDogIiArIGZpbGVQYXRoICsgIiBzY2hlbWU6ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmwuZ2V0UHJvdG9jb2woKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgVVJMQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gbnVsbDsKLSAgICAgICAgaWYodXJsICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJSZXRyaWV2aW5nIFVSTENvbm5lY3Rpb24gZnJvbSBXU0RMIFVSTCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY29ubmVjdGlvbiA9IG9wZW5Db25uZWN0aW9uKHVybCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb247Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgVVJMQ29ubmVjdGlvbiBnZXRQcml2aWxlZ2VkVVJMQ29ubmVjdGlvbihmaW5hbCBVUkwgdXJsKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICB0cnkgewotCi0gICAgICAgIAlyZXR1cm4gKFVSTENvbm5lY3Rpb24pIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKCBuZXcgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbigpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAoZ2V0VVJMQ29ubmVjdGlvbih1cmwpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgCi0gICAgICAgIH0gY2F0Y2ggKFByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgKElPRXhjZXB0aW9uKSBlLmdldEV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBVUkxDb25uZWN0aW9uIG9wZW5Db25uZWN0aW9uKGZpbmFsIFVSTCB1cmwpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gKFVSTENvbm5lY3Rpb24pIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVybC5vcGVuQ29ubmVjdGlvbigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICB9IGNhdGNoIChQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgdGhyb3cgKElPRXhjZXB0aW9uKSBlLmdldEV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgQ2xhc3NMb2FkZXIgZ2V0VGhyZWFkQ2xhc3NMb2FkZXIoKSB7Ci0gICAgICAgIHJldHVybiAoQ2xhc3NMb2FkZXIpIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkQWN0aW9uKCkgewotICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHByaXZhdGUgVVJMIGdldEFic29sdXRlVVJMKGZpbmFsIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyLCBmaW5hbCBTdHJpbmcgZmlsZVBhdGgpewotICAgICAgICBVUkwgdXJsID0gKFVSTCkgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoCi0gICAgICAgICAgICAgICAgbmV3IFByaXZpbGVnZWRBY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNsYXNzTG9hZGVyLmdldFJlc291cmNlKGZpbGVQYXRoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgKTsKLSAgICAgICAgaWYodXJsID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJDb3VsZCBub3QgZ2V0IFVSTCBmcm9tIGNsYXNzbG9hZGVyLiBMb29raW5nIGluIGEgamFyLiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoY2xhc3NMb2FkZXIgaW5zdGFuY2VvZiBVUkxDbGFzc0xvYWRlcil7Ci0gICAgICAgICAgICAgICAgZmluYWwgVVJMQ2xhc3NMb2FkZXIgdXJsTG9hZGVyID0gKFVSTENsYXNzTG9hZGVyKWNsYXNzTG9hZGVyOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHVybCA9IChVUkwpIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKCBuZXcgUHJpdmlsZWdlZEFjdGlvbigpIHsKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChnZXRVUkxGcm9tSkFSKHVybExvYWRlciwgd3NkbFVSTCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSk7Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGZpbmFsIFVSTENsYXNzTG9hZGVyIG5lc3RlZExvYWRlciA9IChVUkxDbGFzc0xvYWRlcikgZ2V0TmVzdGVkQ2xhc3NMb2FkZXIoVVJMQ2xhc3NMb2FkZXIuY2xhc3MsIGNsYXNzTG9hZGVyKTsKLSAgICAgICAgICAgICAgICBpZiAobmVzdGVkTG9hZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdXJsID0gKFVSTCkgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoIG5ldyBQcml2aWxlZ2VkQWN0aW9uKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZ2V0VVJMRnJvbUpBUihuZXN0ZWRMb2FkZXIsIHdzZGxVUkwpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB1cmw7ICAgIAotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIENsYXNzTG9hZGVyIGdldE5lc3RlZENsYXNzTG9hZGVyKENsYXNzIHR5cGUsIENsYXNzTG9hZGVyIHJvb3QpIHsKLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIlNlYXJjaGluZyBmb3IgbmVzdGVkIFVSTENsYXNzTG9hZGVyIik7Ci0gICAgICAgIH0KLSAgICAgICAgd2hpbGUgKCEocm9vdCBpbnN0YW5jZW9mIFVSTENsYXNzTG9hZGVyKSkgewotICAgICAgICAgICAgaWYgKHJvb3QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBmaW5hbCBDbGFzc0xvYWRlciBjdXJyZW50ID0gcm9vdDsKLSAgICAgICAgICAgIHJvb3QgPSAoQ2xhc3NMb2FkZXIpIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAotICAgICAgICAgICAgICAgICAgICBuZXcgUHJpdmlsZWdlZEFjdGlvbigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50LmdldFBhcmVudCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICApOwotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpICYmIHJvb3QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ2hlY2tpbmcgcGFyZW50IENsYXNzTG9hZGVyOiAiICsgcm9vdC5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcm9vdDsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBVUkwgZ2V0VVJMRnJvbUpBUihVUkxDbGFzc0xvYWRlciB1cmxMb2FkZXIsIFVSTCByZWxhdGl2ZVVSTCkgewotICAgICAgICBVUkxbXSB1cmxMaXN0ID0gbnVsbDsKLSAgICAgICAgUmVzb3VyY2VGaW5kZXJGYWN0b3J5IHJmZiA9KFJlc291cmNlRmluZGVyRmFjdG9yeSlNZXRhZGF0YUZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KFJlc291cmNlRmluZGVyRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgIFJlc291cmNlRmluZGVyIGNmID0gcmZmLmdldFJlc291cmNlRmluZGVyKCk7Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJSZXNvdXJjZUZpbmRlckZhY3Rvcnk6ICIgKyByZmYuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgbG9nLmRlYnVnKCJSZXNvdXJjZUZpbmRlcjogIiArIGNmLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgdXJsTGlzdCA9IGNmLmdldFVSTHModXJsTG9hZGVyKTsKLSAgICAgICAgaWYodXJsTGlzdCA9PSBudWxsKXsKLSAgICAgICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKXsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIk5vIFVSTCdzIGZvdW5kIGluIFVSTCBDbGFzc0xvYWRlciIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJXU0RMNEpXcmFwcGVyRXJyMSIpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoVVJMIHVybCA6IHVybExpc3QpIHsKLSAgICAgICAgICAgIGlmICgiZmlsZSIuZXF1YWxzKHVybC5nZXRQcm90b2NvbCgpKSkgewotICAgICAgICAgICAgICAgIGZpbmFsIEZpbGUgZiA9IG5ldyBGaWxlKHVybC5nZXRQYXRoKCkpOwotICAgICAgICAgICAgICAgIC8vIElmIGZpbGUgaXMgbm90IG9mIHR5cGUgZGlyZWN0b3J5IHRoZW4gaXRzIGEgamFyIGZpbGUKLSAgICAgICAgICAgICAgICBpZiAoaXNBRmlsZShmKSkgeyAKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEphckZpbGUgamYgPSAoSmFyRmlsZSkgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSmFyRmlsZShmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEVudW1lcmF0aW9uPEphckVudHJ5PiBlbnRyaWVzID0gamYuZW50cmllcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVhZCBhbGwgZW50cmllcyBpbiBqYXIgZmlsZSBhbmQgcmV0dXJuIHRoZSBmaXJzdAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3NkbCBmaWxlIHRoYXQgbWF0Y2hlcwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJlbGF0aXZlIHBhdGgKLSAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChlbnRyaWVzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSmFyRW50cnkgamUgPSBlbnRyaWVzLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBqZS5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUuZW5kc1dpdGgoIi53c2RsIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlbGF0aXZlUGF0aCA9IHJlbGF0aXZlVVJMLmdldFBhdGgoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlbGF0aXZlUGF0aC5lbmRzV2l0aChuYW1lKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBmLmdldEFic29sdXRlUGF0aCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBjaGVjayBpcyBuZWNlc3NhcnkgYmVjYXVzZSBVbml4L0xpbnV4IGZpbGUgcGF0aHMgYmVnaW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpdGggYSAnLycuIFdoZW4gYWRkaW5nIHRoZSBwcmVmaXggJ2phcjpmaWxlOi8nIHdlIG1heSBlbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVwIHdpdGggJy8vJyBhZnRlciB0aGUgJ2ZpbGU6JyBwYXJ0LiBUaGlzIGNhdXNlcyB0aGUgVVJMIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2JqZWN0IHRvIHRyZWF0IHRoaXMgbGlrZSBhIHJlbW90ZSByZXNvdXJjZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocGF0aCAhPSBudWxsICYmIHBhdGguaW5kZXhPZigiLyIpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoID0gcGF0aC5zdWJzdHJpbmcoMSwgcGF0aC5sZW5ndGgoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTCBhYnNvbHV0ZVVybCA9IG5ldyBVUkwoImphcjpmaWxlOi8iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcGF0aCArICIhLyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBqZS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFic29sdXRlVXJsOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0FGaWxlKGZpbmFsIEZpbGUgZikgewotICAgICAgICBCb29sZWFuIHJldCA9IChCb29sZWFuKSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgKLSAgICAgICAgICAgICAgICBuZXcgUHJpdmlsZWdlZEFjdGlvbigpIHsKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEJvb2xlYW4oZi5leGlzdHMoKSAmJiAhZi5pc0RpcmVjdG9yeSgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgKTsKLSAgICAgICAgcmV0dXJuIHJldC5ib29sZWFuVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBXU0RMUmVhZGVyIGdldFdTRExSZWFkZXIoKSB0aHJvd3MgV1NETEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIEtlZXAgdGhpcyBtZXRob2QgcHJpdmF0ZQotICAgICAgICBXU0RMUmVhZGVyIHJlYWRlcjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJlYWRlciA9IChXU0RMUmVhZGVyKUFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAotICAgICAgICAgICAgICAgICAgICBuZXcgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgdGhyb3dzIFdTRExFeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdTRExGYWN0b3J5IGZhY3RvcnkgPSBXU0RMRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWN0b3J5Lm5ld1dTRExSZWFkZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0gY2F0Y2ggKFByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgKFdTRExFeGNlcHRpb24pZS5nZXRFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgICAgICBXU0RMUmVhZGVyQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvciA9IChXU0RMUmVhZGVyQ29uZmlndXJhdG9yKSBNZXRhZGF0YUZhY3RvcnlSZWdpc3RyeS4KLSAgICAgICAgICAgIGdldEZhY3RvcnkoV1NETFJlYWRlckNvbmZpZ3VyYXRvci5jbGFzcyk7Ci0gICAgICAgIGlmKGNvbmZpZ3VyYXRvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ2FsbGluZyBjb25maWd1cmVSZWFkZXJJbnN0YW5jZSB3aXRoOiAiICsgY29uZmlndXJhdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNvbmZpZ3VyYXRvci5jb25maWd1cmVSZWFkZXJJbnN0YW5jZShyZWFkZXIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZWFkZXI7Ci0gICAgfQotCi0gICAvKioKLSAgICAqIENvbnN0cnVjdG9yCi0gICAgKgotICAgICogQHBhcmFtIFVSTCAgIFRoZSBVUkwgZm9yIHRoZSBXU0RMCi0gICAgKiBAcGFyYW0gRGVmaW5pdGlvbiAgIERlZmluaXRpb24gZm9yIHRoZSBXU0RMCi0gICAgKiBAZGVwcmVjYXRlZCBVc2UgYSBjb25zdHJ1Y3RvciB0aGF0IGhhcyBhIENvbmZpZ0NvbnRleHQgb3IgbWVtb3J5TGltaXQgcGFyYW1ldGVyCi0gICAgKi8KLSAgICBwdWJsaWMgV1NETDRKV3JhcHBlcihVUkwgd3NkbFVSTCwgRGVmaW5pdGlvbiB3c2RsRGVmaW5pdGlvbikgdGhyb3dzIFdTRExFeGNlcHRpb24gewotICAgICAgICB0aGlzKHdzZGxVUkwsIHdzZGxEZWZpbml0aW9uLCBudWxsLCBudWxsKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IKLSAgICAgKgotICAgICAqIEBwYXJhbSBVUkwgICBUaGUgVVJMIGZvciB0aGUgV1NETAotICAgICAqIEBwYXJhbSBEZWZpbml0aW9uICAgRGVmaW5pdGlvbiBmb3IgdGhlIFdTREwKLSAgICAgKiBAcGFyYW0gQ29uZmlndXJhdGlvbkNvbnRleHQKLSAgICAgKi8KLSAgICAgcHVibGljIFdTREw0SldyYXBwZXIoVVJMIHdzZGxVUkwsIERlZmluaXRpb24gd3NkbERlZmluaXRpb24sIAotICAgICAgICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0KSB0aHJvd3MgV1NETEV4Y2VwdGlvbiB7Ci0gICAgICAgICB0aGlzKHdzZGxVUkwsIHdzZGxEZWZpbml0aW9uLCBjb25maWdDb250ZXh0LCBudWxsKTsKLSAgICAgfQotICAgICAKLSAgICAgLyoqCi0gICAgICAqIENvbnN0cnVjdG9yCi0gICAgICAqCi0gICAgICAqIEBwYXJhbSBVUkwgICBUaGUgVVJMIGZvciB0aGUgV1NETAotICAgICAgKiBAcGFyYW0gRGVmaW5pdGlvbiAgIERlZmluaXRpb24gZm9yIHRoZSBXU0RMCi0gICAgICAqIEBwYXJhbSBsaW1pdE1lbW9yeSBib29sZWFuCi0gICAgICAqLwotICAgICAgcHVibGljIFdTREw0SldyYXBwZXIoVVJMIHdzZGxVUkwsIERlZmluaXRpb24gd3NkbERlZmluaXRpb24sIGJvb2xlYW4gbGltaXRNZW1vcnksIGludCBtZW1vcnlUeXBlKSB0aHJvd3MgV1NETEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgdGhpcyh3c2RsVVJMLCB3c2RsRGVmaW5pdGlvbiwgbnVsbCwgbnVsbCwgbGltaXRNZW1vcnksIG1lbW9yeVR5cGUpOwotICAgICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IKLSAgICAgKgotICAgICAqIEBwYXJhbSBVUkwgICBUaGUgVVJMIGZvciB0aGUgV1NETAotICAgICAqIEBwYXJhbSBEZWZpbml0aW9uICAgRGVmaW5pdGlvbiBmb3IgdGhlIFdTREwKLSAgICAgKiBAcGFyYW0gSkFYV1NDYXRhbG9nTWFuYWdlciBDYXRhbG9nIE1hbmFnZXIgdG8gdXNlIGZvciBsb2NhdGluZyBleHRlcm5hbCByZXNvdXJjZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgV1NETDRKV3JhcHBlcihVUkwgd3NkbFVSTCwgRGVmaW5pdGlvbiB3c2RsRGVmaW5pdGlvbiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDYXRhbG9nTWFuYWdlciBjYXRhbG9nTWFuYWdlciwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBsaW1pdE1lbW9yeSwgaW50IG1lbW9yeVR5cGUpIHRocm93cyBXU0RMRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcyh3c2RsVVJMLCB3c2RsRGVmaW5pdGlvbiwgbnVsbCwgY2F0YWxvZ01hbmFnZXIsIGxpbWl0TWVtb3J5LCBtZW1vcnlUeXBlKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IKLSAgICAgKgotICAgICAqIEBwYXJhbSBVUkwgICBUaGUgVVJMIGZvciB0aGUgV1NETAotICAgICAqIEBwYXJhbSBEZWZpbml0aW9uICAgRGVmaW5pdGlvbiBmb3IgdGhlIFdTREwKLSAgICAgKiBAcGFyYW0gSkFYV1NDYXRhbG9nTWFuYWdlciBDYXRhbG9nIE1hbmFnZXIgdG8gdXNlIGZvciBsb2NhdGluZyBleHRlcm5hbCByZXNvdXJjZXMKLSAgICAgKiBAZGVwcmVjYXRlZCBVc2UgYSBjb25zdHJ1Y3RvciB3aXRoIGEgQ29uZmlndXJhdGlvbkNvbnRleHQgb3IgbWVtb3J5IGxpbWl0IHNldHRpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgV1NETDRKV3JhcHBlcihVUkwgd3NkbFVSTCwgRGVmaW5pdGlvbiB3c2RsRGVmaW5pdGlvbiwgSkFYV1NDYXRhbG9nTWFuYWdlciBjYXRhbG9nTWFuYWdlcikgdGhyb3dzIFdTRExFeGNlcHRpb24gewotICAgICAgICB0aGlzKHdzZGxVUkwsIHdzZGxEZWZpbml0aW9uLCBudWxsLCBjYXRhbG9nTWFuYWdlciwgZmFsc2UsIDApOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAqIENvbnN0cnVjdG9yCi0gICAgKgotICAgICogQHBhcmFtIFVSTCAgIFRoZSBVUkwgZm9yIHRoZSBXU0RMCi0gICAgKiBAcGFyYW0gRGVmaW5pdGlvbiAgIERlZmluaXRpb24gZm9yIHRoZSBXU0RMCi0gICAgKiBAcGFyYW0gQ29uZmlndXJhdGlvbkNvbnRleHQgIHRvIGdldCBwYXJhbWV0ZXJzIGZvciBXU0RMIGJ1aWxkaW5nIAotICAgICAqIEBwYXJhbSBKQVhXU0NhdGFsb2dNYW5hZ2VyIENhdGFsb2cgTWFuYWdlciB0byB1c2UgZm9yIGxvY2F0aW5nIGV4dGVybmFsIHJlc291cmNlcwotICAgICovCi0gICAgcHVibGljIFdTREw0SldyYXBwZXIoVVJMIHdzZGxVUkwsIERlZmluaXRpb24gd3NkbERlZmluaXRpb24sIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQsCi0gICAgICAgICAgICBKQVhXU0NhdGFsb2dNYW5hZ2VyIGNhdGFsb2dNYW5hZ2VyKSB0aHJvd3MgV1NETEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMod3NkbFVSTCwgd3NkbERlZmluaXRpb24sIGNvbmZpZ0NvbnRleHQsIGNhdGFsb2dNYW5hZ2VyLCBmYWxzZSwgMCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEZ1bGwgQ29uc3RydWN0b3IKLSAgICAgKi8KLSAgICAgcHJpdmF0ZSBXU0RMNEpXcmFwcGVyKFVSTCB3c2RsVVJMLCBEZWZpbml0aW9uIHdzZGxEZWZpbml0aW9uLCBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0LAotICAgICAgICAgICAgIEpBWFdTQ2F0YWxvZ01hbmFnZXIgY2F0YWxvZ01hbmFnZXIsIGJvb2xlYW4gbGltaXRNZW1vcnksIGludCBtZW1vcnlUeXBlKSB0aHJvd3MgV1NETEV4Y2VwdGlvbiB7Ci0gICAgICAgICBzdXBlcigpOwotICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpICkgeyBsb2cuZGVidWcoIldTREw0SldyYXBwZXIoLi4uKSBlbnRyeSIpOyB9Ci0KLSAgICAgICAgIHRoaXMuY29uZmlnQ29udGV4dCA9IGNvbmZpZ0NvbnRleHQ7Ci0gICAgICAgICB0aGlzLmNhdGFsb2dNYW5hZ2VyID0gY2F0YWxvZ01hbmFnZXI7Ci0gICAgICAgICB0aGlzLndzZGxVUkwgPSB3c2RsVVJMOwotICAgICAgICAgdGhpcy5saW1pdE1lbW9yeSA9IGxpbWl0TWVtb3J5OyAgLy8gT25seSB1c2VkIGlmIGNvbmZpZ0NvbnRleHQgaXMgbm90IHByZXNlbnQKLSAgICAgICAgIHRoaXMubWVtb3J5VHlwZSA9IG1lbW9yeVR5cGU7Ci0gICAgICAgICBpZiAoKHdzZGxEZWZpbml0aW9uICE9IG51bGwpICYmICEod3NkbERlZmluaXRpb24gaW5zdGFuY2VvZiBXU0RMRGVmaW5pdGlvbldyYXBwZXIpKSB7Ci0gICAgICAgICAgICAgaWYgKGNvbmZpZ0NvbnRleHQgIT0gbnVsbCAmJiBjb25maWdDb250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICB0aGlzLndzZGxEZWZpbml0aW9uID0gCi0gICAgICAgICAgICAgICAgICAgICBuZXcgV1NETERlZmluaXRpb25XcmFwcGVyKHdzZGxEZWZpbml0aW9uLCB3c2RsVVJMLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpICk7Ci0gICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgdGhpcy53c2RsRGVmaW5pdGlvbiA9IAotICAgICAgICAgICAgICAgICAgICAgbmV3IFdTRExEZWZpbml0aW9uV3JhcHBlcih3c2RsRGVmaW5pdGlvbiwgd3NkbFVSTCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0TWVtb3J5LCAyKTsKLSAgICAgICAgICAgICB9Ci0gICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgIHRoaXMud3NkbERlZmluaXRpb24gPSAoV1NETERlZmluaXRpb25XcmFwcGVyKSB3c2RsRGVmaW5pdGlvbjsKLSAgICAgICAgIH0KLSAgICAgfQotCi0KLSAgIC8qKgotICAgICogQ29uc3RydWN0b3IKLSAgICAqCi0gICAgKiBAcGFyYW0gRGVmaW5pdGlvbiAgIERlZmluaXRpb24gZm9yIHRoZSBXU0RMCi0gICAgKiBAZGVwcmVjYXRlZCBVc2UgV1NETDRKV3JhcHBlcihEZWZpbml0aW9uLENvbmZpZ3VyYXRpb25Db250ZXh0KQotICAgICovCi0gICAgcHVibGljIFdTREw0SldyYXBwZXIoRGVmaW5pdGlvbiB3c2RsRGVmaW5pdGlvbikgdGhyb3dzIFdTRExFeGNlcHRpb24gewotICAgICAgICB0aGlzKHdzZGxEZWZpbml0aW9uLCBmYWxzZSwgMCk7Ci0gICAgICAgIAotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvcgotICAgICAqCi0gICAgICogQHBhcmFtIERlZmluaXRpb24gICBEZWZpbml0aW9uIGZvciB0aGUgV1NETAotICAgICAqIEBib29sZWFuIGxpbWl0TWVtb3J5Ci0gICAgICovCi0gICAgIHB1YmxpYyBXU0RMNEpXcmFwcGVyKERlZmluaXRpb24gd3NkbERlZmluaXRpb24sIGJvb2xlYW4gbGltaXRNZW1vcnksIGludCBtZW1vcnlUeXBlKSB0aHJvd3MgV1NETEV4Y2VwdGlvbiB7Ci0gICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkgKSB7IGxvZy5kZWJ1ZygiV1NETDRKV3JhcHBlcihEZWZpbml0aW9uLCBib29sZWFuKSBlbnRyeSIpOyB9Ci0KLSAgICAgICAgIHRoaXMubGltaXRNZW1vcnkgPSBsaW1pdE1lbW9yeTsKLSAgICAgICAgIHRoaXMubWVtb3J5VHlwZSA9IG1lbW9yeVR5cGU7Ci0gICAgICAgICBpZiAoKHdzZGxEZWZpbml0aW9uICE9IG51bGwpICYmICEod3NkbERlZmluaXRpb24gaW5zdGFuY2VvZiBXU0RMRGVmaW5pdGlvbldyYXBwZXIpKSB7Ci0gICAgICAgICAgICAgdGhpcy53c2RsRGVmaW5pdGlvbiA9IG5ldyBXU0RMRGVmaW5pdGlvbldyYXBwZXIod3NkbERlZmluaXRpb24sIG51bGwsIGxpbWl0TWVtb3J5LCBtZW1vcnlUeXBlKTsKLSAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgdGhpcy53c2RsRGVmaW5pdGlvbiA9IChXU0RMRGVmaW5pdGlvbldyYXBwZXIpIHdzZGxEZWZpbml0aW9uOwotICAgICAgICAgfQotCi0gICAgICAgICBpZiAodGhpcy53c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgU3RyaW5nIGJhc2VVUkkgPSB3c2RsRGVmaW5pdGlvbi5nZXREb2N1bWVudEJhc2VVUkkoKTsKLSAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICB3c2RsVVJMID0gbmV3IFVSTChiYXNlVVJJKTsKLSAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgLy8ganVzdCBhYnNvcmIgdGhlIGVycm9yCi0gICAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvcgotICAgICAqCi0gICAgICogQHBhcmFtIERlZmluaXRpb24gICBEZWZpbml0aW9uIGZvciB0aGUgV1NETAotICAgICAqIEBwYXJhbSBDb25maWd1cmF0aW9uQ29udGV4dAotICAgICAqLwotICAgICBwdWJsaWMgV1NETDRKV3JhcHBlcihEZWZpbml0aW9uIHdzZGxEZWZpbml0aW9uLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ29udGV4dCkgdGhyb3dzIFdTRExFeGNlcHRpb24gewotICAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSApIHsgbG9nLmRlYnVnKCJXU0RMNEpXcmFwcGVyKERlZmluaXRpb24pIGVudHJ5Iik7IH0KLQotICAgICAgICAgaWYgKCh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSAmJiAhKHdzZGxEZWZpbml0aW9uIGluc3RhbmNlb2YgV1NETERlZmluaXRpb25XcmFwcGVyKSkgewotICAgICAgICAgICAgIHRoaXMud3NkbERlZmluaXRpb24gPSBuZXcgV1NETERlZmluaXRpb25XcmFwcGVyKHdzZGxEZWZpbml0aW9uLCBjb25maWdDb250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCkpOwotICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICB0aGlzLndzZGxEZWZpbml0aW9uID0gKFdTRExEZWZpbml0aW9uV3JhcHBlcikgd3NkbERlZmluaXRpb247Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIGlmICh0aGlzLndzZGxEZWZpbml0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICBTdHJpbmcgYmFzZVVSSSA9IHdzZGxEZWZpbml0aW9uLmdldERvY3VtZW50QmFzZVVSSSgpOwotICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgIHdzZGxVUkwgPSBuZXcgVVJMKGJhc2VVUkkpOwotICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgICAvLyBqdXN0IGFic29yYiB0aGUgZXJyb3IKLSAgICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgIH0KLSAgICAvL1RPRE86IFBlcmZvcm0gdmFsaWRhdGlvbnMgZm9yIGVhY2ggbWV0aG9kIHRvIGNoZWNrIGZvciBudWxsIHBhcmFtZXRlcnMgb24gUU5hbWUuCi0KLSAgICAvKgotICAgICAqIFJldHVybnMgYSB3cmFwcGVkIFdTREw0SiB3U0RMIGRlZmluaXRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgRGVmaW5pdGlvbiBnZXREZWZpbml0aW9uKCkgewotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgRGVmaW5pdGlvbiBkZWYgPSBsb2FkRGVmaW5pdGlvbigpOwotICAgICAgICAgICAgaWYgKGRlZiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbmZpZ0NvbnRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB3c2RsRGVmaW5pdGlvbiA9IG5ldyBXU0RMRGVmaW5pdGlvbldyYXBwZXIoZGVmLCBjb25maWdDb250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCkgKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB3c2RsRGVmaW5pdGlvbiA9IG5ldyBXU0RMRGVmaW5pdGlvbldyYXBwZXIoZGVmLCB3c2RsVVJMLCBsaW1pdE1lbW9yeSwgbWVtb3J5VHlwZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB3c2RsRGVmaW5pdGlvbjsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFJldHVybnMgYW4gdW53cmFwcGVkIFdTREw0SiB3U0RMIGRlZmluaXRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgRGVmaW5pdGlvbiBnZXRVbndyYXBwZWREZWZpbml0aW9uKCkgewotICAgICAgICBEZWZpbml0aW9uIGRlZjsKLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgIGRlZiA9IGxvYWREZWZpbml0aW9uKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAod3NkbERlZmluaXRpb24gaW5zdGFuY2VvZiBXU0RMRGVmaW5pdGlvbldyYXBwZXIpIHsKLSAgICAgICAgICAgIGRlZiA9IHdzZGxEZWZpbml0aW9uLmdldFVud3JhcHBlZERlZmluaXRpb24oKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGRlZiA9IHdzZGxEZWZpbml0aW9uOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBkZWY7Ci0gICAgfQotCi0KLSAgICAvKgotICAgICAqIExvYWQgYSBXU0RMNEogV1NETCBkZWZpbml0aW9uIGZyb20gYSBVUkwKLSAgICAgKi8KLSAgICBwdWJsaWMgRGVmaW5pdGlvbiBsb2FkRGVmaW5pdGlvbigpIHsKLQotICAgICAgICBEZWZpbml0aW9uIGRlZiA9IG51bGw7Ci0KLSAgICAgICAgaWYgKHdzZGxFeHBsaWNpdFVSTCAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotCi0gICAgICAgICAgICAgICAgVVJMQ29ubmVjdGlvbiB1cmxDb25uID0gZ2V0UHJpdmlsZWdlZFVSTENvbm5lY3Rpb24odGhpcy53c2RsVVJMKTsKLSAgICAgICAgICAgICAgICBpZih1cmxDb25uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGlzID0gZ2V0SW5wdXRTdHJlYW0odXJsQ29ubik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZihpcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNhdGFsb2dNYW5hZ2VyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0YWxvZ01hbmFnZXIgPSBuZXcgT0FTSVNDYXRhbG9nTWFuYWdlcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDYXRhbG9nV1NETExvY2F0b3IgbG9jYXRvciA9IG5ldyBDYXRhbG9nV1NETExvY2F0b3Iod3NkbEV4cGxpY2l0VVJMLCBpcywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRUaHJlYWRDbGFzc0xvYWRlcigpLCBjYXRhbG9nTWFuYWdlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJMb2FkaW5nIFdTREwgdXNpbmcgTW9kdWxlV1NETExvY2F0b3IgZnJvbSBiYXNlICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsb2NhdGlvbjogIiArIHdzZGxFeHBsaWNpdFVSTCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZiA9IChEZWZpbml0aW9uKSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB0aHJvd3MgV1NETEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU0RMUmVhZGVyIHJlYWRlciA9IGdldFdTRExSZWFkZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZWFkZXIucmVhZFdTREwobG9jYXRvcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXRjaChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlVzaW5nIE1vZHVsZVdTRExMb2NhdG9yIHdhcyBub3Qgc3VjY2Vzc2Z1bCBmb3IgbG9hZGluZyAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXU0RMIGR1ZSB0byB0aGUgZm9sbG93aW5nIGVycm9yOiAiICsgZS50b1N0cmluZygpICsgIi4gVGhlICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIldTREwgd2lsbCBiZSByZWFkIGZyb20gdGhlIFdTREwgbG9jYXRpb246ICIgKyB3c2RsRXhwbGljaXRVUkwpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmKGRlZiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkxvYWRpbmcgV1NETCBmcm9tIGxvY2F0aW9uOiAiICsgd3NkbEV4cGxpY2l0VVJMKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBkZWYgPSAoRGVmaW5pdGlvbikgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHRocm93cyBXU0RMRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU0RMUmVhZGVyIHJlYWRlciA9IGdldFdTRExSZWFkZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVhZGVyLnJlYWRXU0RMKHdzZGxFeHBsaWNpdFVSTCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIH0gY2F0Y2ggKFByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkV4Y2VwdGlvbiB0aHJvd24gZnJvbSBBY2Nlc3NDb250cm9sbGVyOiAiICsgZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZS5nZXRFeGNlcHRpb24oKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaChJT0V4Y2VwdGlvbiBpb2UpIHsKLSAgICAgICAgICAgICAgICBpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGF0dGVtcHRpbmcgdG8gbG9hZCB0aGUgV1NETCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmlsZSBhdCB0aGUgZm9sbG93aW5nIGxvY2F0aW9uOiAiICsgd3NkbEV4cGxpY2l0VVJMKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihpb2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGlmIChkZWYgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygibG9hZERlZmluaXRpb24oKSByZXR1cm5pbmcgYSBOT04tTlVMTCBkZWZpbml0aW9uIik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygibG9hZERlZmluaXRpb24oKSByZXR1cm5pbmcgYSBOVUxMIGRlZmluaXRpb24iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBkZWY7Ci0gICAgfQotCi0gICAgcHVibGljIEJpbmRpbmcgZ2V0Rmlyc3RQb3J0QmluZGluZyhRTmFtZSBzZXJ2aWNlUW5hbWUpIHsKLSAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gZ2V0U2VydmljZShzZXJ2aWNlUW5hbWUpOwotICAgICAgICBpZiAoc2VydmljZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBNYXAgbWFwID0gZ2V0U2VydmljZShzZXJ2aWNlUW5hbWUpLmdldFBvcnRzKCk7Ci0gICAgICAgIGlmIChtYXAgPT0gbnVsbCB8fCBtYXAuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBmb3IgKE9iamVjdCBsaXN0T2JqZWN0IDogbWFwLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICBQb3J0IHdzZGxQb3J0ID0gKFBvcnQpbGlzdE9iamVjdDsKLSAgICAgICAgICAgIHJldHVybiB3c2RsUG9ydC5nZXRCaW5kaW5nKCk7Ci0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0T3BlcmF0aW9uTmFtZShRTmFtZSBzZXJ2aWNlUW5hbWUsIFFOYW1lIHBvcnRRbmFtZSkgewotICAgICAgICBQb3J0IHBvcnQgPSBnZXRQb3J0KHNlcnZpY2VRbmFtZSwgcG9ydFFuYW1lKTsKLSAgICAgICAgQmluZGluZyBiaW5kaW5nID0gcG9ydC5nZXRCaW5kaW5nKCk7Ci0gICAgICAgIGlmIChiaW5kaW5nID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgTGlzdCBvcGVyYXRpb25zID0gYmluZGluZy5nZXRCaW5kaW5nT3BlcmF0aW9ucygpOwotICAgICAgICBmb3IgKE9iamVjdCBvcE9iaiA6IG9wZXJhdGlvbnMpIHsKLSAgICAgICAgICAgIEJpbmRpbmdPcGVyYXRpb24gb3BlcmF0aW9uID0gKEJpbmRpbmdPcGVyYXRpb24pb3BPYmo7Ci0gICAgICAgICAgICByZXR1cm4gb3BlcmF0aW9uLmdldE5hbWUoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFBvcnQgZ2V0UG9ydChRTmFtZSBzZXJ2aWNlUW5hbWUsIFFOYW1lIGVwclFuYW1lKSB7Ci0gICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IGdldFNlcnZpY2Uoc2VydmljZVFuYW1lKTsKLSAgICAgICAgaWYgKHNlcnZpY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNlcnZpY2UuZ2V0UG9ydChlcHJRbmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgQXJyYXlMaXN0IGdldFBvcnRCaW5kaW5nKFFOYW1lIHNlcnZpY2VRbmFtZSkgewotICAgICAgICBNYXAgbWFwID0gdGhpcy5nZXRTZXJ2aWNlKHNlcnZpY2VRbmFtZSkuZ2V0UG9ydHMoKTsKLSAgICAgICAgaWYgKG1hcCA9PSBudWxsIHx8IG1hcC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIEFycmF5TGlzdDxCaW5kaW5nPiBwb3J0QmluZGluZ3MgPSBuZXcgQXJyYXlMaXN0PEJpbmRpbmc+KCk7Ci0gICAgICAgIGZvciAoT2JqZWN0IGxpc3RPYmplY3QgOiBtYXAudmFsdWVzKCkpIHsKLSAgICAgICAgICAgIFBvcnQgd3NkbFBvcnQgPSAoUG9ydClsaXN0T2JqZWN0OwotICAgICAgICAgICAgQmluZGluZyBiaW5kaW5nID0gd3NkbFBvcnQuZ2V0QmluZGluZygpOwotICAgICAgICAgICAgaWYgKGJpbmRpbmcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHBvcnRCaW5kaW5ncy5hZGQoYmluZGluZyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcG9ydEJpbmRpbmdzOwotCi0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQb3J0QmluZGluZyhRTmFtZSBzZXJ2aWNlUW5hbWUsIFFOYW1lIHBvcnRRbmFtZSkgewotICAgICAgICBQb3J0IHBvcnQgPSBnZXRQb3J0KHNlcnZpY2VRbmFtZSwgcG9ydFFuYW1lKTsKLSAgICAgICAgaWYgKHBvcnQgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgQmluZGluZyBiaW5kaW5nID0gcG9ydC5nZXRCaW5kaW5nKCk7Ci0gICAgICAgIHJldHVybiBiaW5kaW5nLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZ1tdIGdldFBvcnRzKFFOYW1lIHNlcnZpY2VRbmFtZSkgewotICAgICAgICBTdHJpbmdbXSBwb3J0TmFtZXMgPSBudWxsOwotICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSB0aGlzLmdldFNlcnZpY2Uoc2VydmljZVFuYW1lKTsKLSAgICAgICAgaWYgKHNlcnZpY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgTWFwIG1hcCA9IHNlcnZpY2UuZ2V0UG9ydHMoKTsKLSAgICAgICAgaWYgKG1hcCA9PSBudWxsIHx8IG1hcC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHBvcnROYW1lcyA9IG5ldyBTdHJpbmdbbWFwLnZhbHVlcygpLnNpemUoKV07Ci0gICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSBtYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGl0ZXIuaGFzTmV4dCgpOyBpKyspIHsKLSAgICAgICAgICAgIFBvcnQgd3NkbFBvcnQgPSAoUG9ydClpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIGlmICh3c2RsUG9ydCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcG9ydE5hbWVzW2ldID0gd3NkbFBvcnQuZ2V0TmFtZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwb3J0TmFtZXM7Ci0gICAgfQotCi0gICAgcHVibGljIFNlcnZpY2UgZ2V0U2VydmljZShRTmFtZSBzZXJ2aWNlUW5hbWUpIHsKLSAgICAgICAgaWYgKHNlcnZpY2VRbmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIERlZmluaXRpb24gZGVmID0gZ2V0RGVmaW5pdGlvbigpOwotICAgICAgICBpZiAoZGVmICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBkZWYuZ2V0U2VydmljZShzZXJ2aWNlUW5hbWUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNPQVBBY3Rpb24oUU5hbWUgc2VydmljZVFuYW1lKSB7Ci0gICAgICAgIEJpbmRpbmcgYmluZGluZyA9IGdldEZpcnN0UG9ydEJpbmRpbmcoc2VydmljZVFuYW1lKTsKLSAgICAgICAgaWYgKGJpbmRpbmcgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgTGlzdCBvcGVyYXRpb25zID0gYmluZGluZy5nZXRCaW5kaW5nT3BlcmF0aW9ucygpOwotICAgICAgICBmb3IgKE9iamVjdCBvcE9iaiA6IG9wZXJhdGlvbnMpIHsKLSAgICAgICAgICAgIEJpbmRpbmdPcGVyYXRpb24gb3BlcmF0aW9uID0gKEJpbmRpbmdPcGVyYXRpb24pb3BPYmo7Ci0gICAgICAgICAgICBMaXN0IGV4RWxlbWVudHMgPSBvcGVyYXRpb24uZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgICAgICAgICBmb3IgKE9iamVjdCBlbE9iaiA6IGV4RWxlbWVudHMpIHsKLSAgICAgICAgICAgICAgICBFeHRlbnNpYmlsaXR5RWxlbWVudCBleEVsZW1lbnQgPSAoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpZWxPYmo7Ci0gICAgICAgICAgICAgICAgaWYgKGlzU29hcE9wZXJhdGlvbihleEVsZW1lbnQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFNPQVBPcGVyYXRpb24gc29hcE9wZXJhdGlvbiA9IChTT0FQT3BlcmF0aW9uKWV4RWxlbWVudDsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNvYXBPcGVyYXRpb24uZ2V0U29hcEFjdGlvblVSSSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNPQVBBY3Rpb24oUU5hbWUgc2VydmljZVFuYW1lLCBRTmFtZSBwb3J0UW5hbWUpIHsKLSAgICAgICAgUG9ydCBwb3J0ID0gZ2V0UG9ydChzZXJ2aWNlUW5hbWUsIHBvcnRRbmFtZSk7Ci0gICAgICAgIGlmIChwb3J0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIEJpbmRpbmcgYmluZGluZyA9IHBvcnQuZ2V0QmluZGluZygpOwotICAgICAgICBpZiAoYmluZGluZyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBMaXN0IG9wZXJhdGlvbnMgPSBiaW5kaW5nLmdldEJpbmRpbmdPcGVyYXRpb25zKCk7Ci0gICAgICAgIGZvciAoT2JqZWN0IG9wT2JqIDogb3BlcmF0aW9ucykgewotICAgICAgICAgICAgQmluZGluZ09wZXJhdGlvbiBvcGVyYXRpb24gPSAoQmluZGluZ09wZXJhdGlvbilvcE9iajsKLSAgICAgICAgICAgIExpc3QgZXhFbGVtZW50cyA9IG9wZXJhdGlvbi5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICAgICAgICAgIGZvciAoT2JqZWN0IGVsT2JqIDogZXhFbGVtZW50cykgewotICAgICAgICAgICAgICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IGV4RWxlbWVudCA9IChFeHRlbnNpYmlsaXR5RWxlbWVudCllbE9iajsKLSAgICAgICAgICAgICAgICBpZiAoaXNTb2FwT3BlcmF0aW9uKGV4RWxlbWVudCkpIHsKLSAgICAgICAgICAgICAgICAgICAgU09BUE9wZXJhdGlvbiBzb2FwT3BlcmF0aW9uID0gKFNPQVBPcGVyYXRpb24pZXhFbGVtZW50OwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gc29hcE9wZXJhdGlvbi5nZXRTb2FwQWN0aW9uVVJJKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U09BUEFjdGlvbihRTmFtZSBzZXJ2aWNlUW5hbWUsIFFOYW1lIHBvcnRRbmFtZSwgUU5hbWUgb3BlcmF0aW9uUW5hbWUpIHsKLSAgICAgICAgUG9ydCBwb3J0ID0gZ2V0UG9ydChzZXJ2aWNlUW5hbWUsIHBvcnRRbmFtZSk7Ci0gICAgICAgIGlmIChwb3J0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIEJpbmRpbmcgYmluZGluZyA9IHBvcnQuZ2V0QmluZGluZygpOwotICAgICAgICBpZiAoYmluZGluZyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBMaXN0IG9wZXJhdGlvbnMgPSBiaW5kaW5nLmdldEJpbmRpbmdPcGVyYXRpb25zKCk7Ci0gICAgICAgIGlmIChvcGVyYXRpb25zID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIEJpbmRpbmdPcGVyYXRpb24gb3BlcmF0aW9uID0gbnVsbDsKLSAgICAgICAgZm9yIChPYmplY3Qgb3BPYmogOiBvcGVyYXRpb25zKSB7Ci0gICAgICAgICAgICBvcGVyYXRpb24gPSAoQmluZGluZ09wZXJhdGlvbilvcE9iajsKLSAgICAgICAgfQotICAgICAgICBMaXN0IGV4RWxlbWVudHMgPSBvcGVyYXRpb24uZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgICAgIGZvciAoT2JqZWN0IGVsT2JqIDogZXhFbGVtZW50cykgewotICAgICAgICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZXhFbGVtZW50ID0gKEV4dGVuc2liaWxpdHlFbGVtZW50KWVsT2JqOwotICAgICAgICAgICAgaWYgKGlzU29hcE9wZXJhdGlvbihleEVsZW1lbnQpKSB7Ci0gICAgICAgICAgICAgICAgU09BUE9wZXJhdGlvbiBzb2FwT3BlcmF0aW9uID0gKFNPQVBPcGVyYXRpb24pZXhFbGVtZW50OwotICAgICAgICAgICAgICAgIGlmIChzb2FwT3BlcmF0aW9uLmdldEVsZW1lbnRUeXBlKCkuZXF1YWxzKG9wZXJhdGlvblFuYW1lKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gc29hcE9wZXJhdGlvbi5nZXRTb2FwQWN0aW9uVVJJKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIFVSTCBnZXRXU0RMTG9jYXRpb24oKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLndzZGxVUkw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzU29hcE9wZXJhdGlvbihFeHRlbnNpYmlsaXR5RWxlbWVudCBleEVsZW1lbnQpIHsKLSAgICAgICAgcmV0dXJuIFdTRExXcmFwcGVyLlNPQVBfMTFfT1BFUkFUSU9OLmVxdWFscyhleEVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSk7Ci0gICAgICAgIC8vVE9ETzogQWRkIFNvYXAxMiBzdXBwb3J0IGxhdGVyCi0gICAgICAgIC8vIHx8IFdTRExXcmFwcGVyLlNPQVBfMTJfT1BFUkFUSU9OLmVxdWFscyhleEVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRUYXJnZXROYW1lc3BhY2UoKSB7Ci0gICAgICAgIERlZmluaXRpb24gZGVmID0gZ2V0RGVmaW5pdGlvbigpOwotICAgICAgICBpZiAoZGVmICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBkZWYuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCBwcm92aWRlcyBhIEphdmEyIFNlY3VyaXR5IGNvbXBsaWFudCB3YXkgdG8gb2J0YWluIHRoZSBJbnB1dFN0cmVhbQotICAgICAqIGZvciBhIGdpdmVuIFVSTENvbm5lY3Rpb24gb2JqZWN0LiBUaGlzIGlzIG5lZWRlZCBhcyBhIGdpdmVuIFVSTENvbm5lY3Rpb24gb2JqZWN0Ci0gICAgICogbWF5IGJlIGFuIGluc3RhbmNlIG9mIGEgRmlsZVVSTENvbm5lY3Rpb24gb2JqZWN0IHdoaWNoIHdvdWxkIHJlcXVpcmUgYWNjZXNzIAotICAgICAqIHBlcm1pc3Npb25zIGlmIEphdmEyIFNlY3VyaXR5IHdhcyBlbmFibGVkLgotICAgICAqLwotICAgIHByaXZhdGUgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oVVJMQ29ubmVjdGlvbiB1cmxDb24pIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBVUkxDb25uZWN0aW9uIGZpbmFsVVJMQ29uID0gdXJsQ29uOwotICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpcyA9IChJbnB1dFN0cmVhbSkgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoCi0gICAgICAgICAgICAgICAgICAgIG5ldyBQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmaW5hbFVSTENvbi5nZXRJbnB1dFN0cmVhbSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaChQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IGUuZ2V0RXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlzOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBkZWJ1Z01lbW9yeVBhcm1zKENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQpIHsKLSAgICAgICAgaWYgKGNvbmZpZ0NvbnRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NmZyA9IGNvbmZpZ0NvbnRleHQuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKTsKLQotICAgICAgICAgICAgYm9vbGVhbiByZWR1Y2VXU0RMTWVtb3J5Q2FjaGUgPSBmYWxzZTsKLSAgICAgICAgICAgIGludCByZWR1Y2VXU0RMTWVtb3J5VHlwZSA9IDk7Ci0gICAgICAgICAgICAvLyBkZXRlcm1pbmUgd2hhdCB0aGUgc2V0dGluZyBmb3IgdGhlIG1lbW9yeSBvcHRpbWl6YXRpb24gaXMKLSAgICAgICAgICAgIGlmIChheGlzQ2ZnICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBQYXJhbWV0ZXIgcGFyYW0gPSBheGlzQ2ZnLmdldFBhcmFtZXRlcihDb25zdGFudHMuQ29uZmlndXJhdGlvbi5SRURVQ0VfV1NETF9NRU1PUllfQ0FDSEUpOwotCi0gICAgICAgICAgICAgICAgcmVkdWNlV1NETE1lbW9yeUNhY2hlID0KLSAgICAgICAgICAgICAgICAgICAgcGFyYW0gIT0gbnVsbCAmJiAoKFN0cmluZykgcGFyYW0uZ2V0VmFsdWUoKSkuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpOwotCi0KLSAgICAgICAgICAgICAgICBwYXJhbSA9IGF4aXNDZmcuZ2V0UGFyYW1ldGVyKENvbnN0YW50cy5Db25maWd1cmF0aW9uLlJFRFVDRV9XU0RMX01FTU9SWV9UWVBFKTsKLQotICAgICAgICAgICAgICAgIGlmIChwYXJhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IChTdHJpbmcpIHBhcmFtLmdldFZhbHVlKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEludGVnZXIgaSA9IG5ldyBJbnRlZ2VyKHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlZHVjZVdTRExNZW1vcnlUeXBlID0gaS5pbnRWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygicmVkdWNlV1NETE1lbW9yeUNhY2hlOiIrIHJlZHVjZVdTRExNZW1vcnlDYWNoZSArICIsIHJlZHVjZVdTRExNZW1vcnlUeXBlOiIgKyByZWR1Y2VXU0RMTWVtb3J5VHlwZSApOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkF4aXNDb25maWd1cmF0aW9uIGlzIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ29uZmlnQ29udGV4dCBpcyBudWxsIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3V0aWwvV1NETFdyYXBwZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3V0aWwvV1NETFdyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ3MWIxOS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy91dGlsL1dTRExXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MudXRpbDsKLQotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi0vKioKLSAqIERlZmluZXMgV1NETCBBY2Nlc3MgbWV0aG9kcwotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBXU0RMV3JhcHBlciB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBQT0xJQ1kgPSBuZXcgUU5hbWUoQ29uc3RhbnRzLlBPTElDWSwgIlBvbGljeSIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgUE9MSUNZX1JFRkVSRU5DRSA9Ci0gICAgICAgICAgICBuZXcgUU5hbWUoQ29uc3RhbnRzLlBPTElDWV9SRUZFUkVOQ0UsICJQb2xpY3lSZWZlcmVuY2UiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFNDSEVNQSA9IG5ldyBRTmFtZShDb25zdGFudHMuU0NIRU1BLCAic2NoZW1hIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBTT0FQXzExX0JJTkRJTkcgPQotICAgICAgICAgICAgbmV3IFFOYW1lKENvbnN0YW50cy5VUklfV1NETF9TT0FQMTFfQklORElORywgImJpbmRpbmciKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFNPQVBfMTFfQk9EWSA9IG5ldyBRTmFtZShDb25zdGFudHMuVVJJX1dTRExfU09BUDExX0JPRFksICJib2R5Iik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBTT0FQXzExX0hFQURFUiA9Ci0gICAgICAgICAgICBuZXcgUU5hbWUoQ29uc3RhbnRzLlVSSV9XU0RMX1NPQVAxMV9IRUFERVIsICJoZWFkZXIiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFNPQVBfMTFfT1BFUkFUSU9OID0gbmV3IFFOYW1lKENvbnN0YW50cy5VUklfV1NETF9TT0FQMTEsICJvcGVyYXRpb24iKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFNPQVBfMTJfQklORElORyA9Ci0gICAgICAgICAgICBuZXcgUU5hbWUoQ29uc3RhbnRzLlVSSV9XU0RMX1NPQVAxMl9CSU5ESU5HLCAiYmluZGluZyIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgU09BUF8xMl9CT0RZID0gbmV3IFFOYW1lKENvbnN0YW50cy5VUklfV1NETF9TT0FQMTJfQk9EWSwgImJvZHkiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFNPQVBfMTJfSEVBREVSID0KLSAgICAgICAgICAgIG5ldyBRTmFtZShDb25zdGFudHMuVVJJX1dTRExfU09BUDEyX0hFQURFUiwgImhlYWRlciIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgU09BUF8xMl9PUEVSQVRJT04gPSBuZXcgUU5hbWUoQ29uc3RhbnRzLlVSSV9XU0RMX1NPQVAxMSwgIm9wZXJhdGlvbiIpOwotCi0gICAgcHVibGljIE9iamVjdCBnZXRGaXJzdFBvcnRCaW5kaW5nKFFOYW1lIHNlcnZpY2VRbmFtZSk7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE9wZXJhdGlvbk5hbWUoUU5hbWUgc2VydmljZVFuYW1lLCBRTmFtZSBwb3J0UW5hbWUpOwotCi0gICAgcHVibGljIEFycmF5TGlzdCBnZXRQb3J0QmluZGluZyhRTmFtZSBzZXJ2aWNlUW5hbWUpOwotCi0gICAgcHVibGljIFN0cmluZyBnZXRQb3J0QmluZGluZyhRTmFtZSBzZXJ2aWNlUW5hbWUsIFFOYW1lIHBvcnRRbmFtZSk7Ci0KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0UG9ydHMoUU5hbWUgc2VydmljZVFuYW1lKTsKLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0U2VydmljZShRTmFtZSBzZXJ2aWNlUW5hbWUpOwotCi0gICAgcHVibGljIFN0cmluZyBnZXRTT0FQQWN0aW9uKFFOYW1lIHNlcnZpY2VRbmFtZSk7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNPQVBBY3Rpb24oUU5hbWUgc2VydmljZVFuYW1lLCBRTmFtZSBwb3J0UW5hbWUpOwotCi0gICAgcHVibGljIFN0cmluZyBnZXRTT0FQQWN0aW9uKFFOYW1lIHNlcnZpY2VRbmFtZSwgUU5hbWUgcG9ydFFOYW1lLCBRTmFtZSBvcGVyYXRpb25RbmFtZSk7Ci0KLSAgICBwdWJsaWMgVVJMIGdldFdTRExMb2NhdGlvbigpOwotCi0gICAgcHVibGljIFN0cmluZyBnZXRUYXJnZXROYW1lc3BhY2UoKTsKLQotICAgIHB1YmxpYyBEZWZpbml0aW9uIGdldERlZmluaXRpb24oKTsKLQotICAgIHB1YmxpYyBEZWZpbml0aW9uIGdldFVud3JhcHBlZERlZmluaXRpb24oKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy93c2RsL1dTRExSZWFkZXJDb25maWd1cmF0b3IuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3dzZGwvV1NETFJlYWRlckNvbmZpZ3VyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYmU4YTk4Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3dzZGwvV1NETFJlYWRlckNvbmZpZ3VyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy53c2RsOw0KLQ0KLWltcG9ydCBqYXZheC53c2RsLldTRExFeGNlcHRpb247DQotaW1wb3J0IGphdmF4LndzZGwueG1sLldTRExSZWFkZXI7DQotDQotLyoqDQotICogVGhpcyBpbnRlcmZhY2Ugd2lsbCBiZSBpbXBsZW1lbnRlZCBieSBjbGFzc2VzIHRoYXQgd2lzaCB0bw0KLSAqIGNvbmZpZ3VyZSBhbiBpbnN0YW5jZSBvZiBhIFdTRExSZWFkZXIgb2JqZWN0LiBJbXBsZW1lbnRhdGlvbnMNCi0gKiBtYXkgbW9kaWZ5IHRoZSBXU0RMUmVhZGVyIGluc3RhbmNlIGFzIG5lZWRlZCBpbiBvcmRlciB0bw0KLSAqIGNyZWF0ZSBhIFdTREwgRGVmaW5pdGlvbiBvYmplY3QgdGhhdCByZWZsZWN0cyB0aGUgZGVzaXJlZA0KLSAqIG1ldGFkYXRhLg0KLSAqDQotICovDQotcHVibGljIGludGVyZmFjZSBXU0RMUmVhZGVyQ29uZmlndXJhdG9yIHsNCi0JDQotCS8qKg0KLQkgKiBUaGlzIG1ldGhvZCBhY2NlcHRzIGEgV1NETFJlYWRlciBpbnN0YW5jZSBzbyB0aGF0IGltcGxlbWVudG9ycw0KLQkgKiBtYXkgbW9kaWZ5IHRoZSBpbnN0YW5jZSBhcyBuZWNlc3NhcnkuIA0KLQkgKi8NCi0JcHVibGljIHZvaWQgY29uZmlndXJlUmVhZGVySW5zdGFuY2UoV1NETFJlYWRlciByZWFkZXIpIHRocm93cyBXU0RMRXhjZXB0aW9uOw0KLQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy93c2RsL1dTRExSZWFkZXJDb25maWd1cmF0b3JJbXBsLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy93c2RsL1dTRExSZWFkZXJDb25maWd1cmF0b3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjNmVmMDUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvd3NkbC9XU0RMUmVhZGVyQ29uZmlndXJhdG9ySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy53c2RsOw0KLQ0KLWltcG9ydCBqYXZheC53c2RsLldTRExFeGNlcHRpb247DQotaW1wb3J0IGphdmF4LndzZGwueG1sLldTRExSZWFkZXI7DQotDQotLyoqDQotICogQW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB3aWxsIGJlIHJlZ2lzdGVyZWQgd2l0aCB0aGUgTWV0YWRhdGFGYWN0b3J5UmVnaXN0cnkNCi0gKiBhbmQgd2lsbCBiZSByZXRyaWV2ZWQgd2hlbiBhIFdTRExSZWFkZXIgaW5zdGFuY2UgaXMgY3JlYXRlZC4gVGhpcyBpbXBsZW1lbnRhdGlvbg0KLSAqIHdpbGwgYmUgYWJsZSB0byBjb25maWd1cmUgdGhlIGluc3RhbmNlIGFzIG5lZWRlZC4NCi0gKg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBXU0RMUmVhZGVyQ29uZmlndXJhdG9ySW1wbCBpbXBsZW1lbnRzIFdTRExSZWFkZXJDb25maWd1cmF0b3Igew0KLQ0KLQkvKioNCi0JICogVGhpcyB3aWxsIGJlIGNhbGxlZCB0byBjb25maWd1cmUgdGhlIFdTRExSZWFkZXIgaW5zdGFuY2UuDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBjb25maWd1cmVSZWFkZXJJbnN0YW5jZShXU0RMUmVhZGVyIHJlYWRlcikgdGhyb3dzIFdTRExFeGNlcHRpb24gDQotCXsNCi0JCS8vIHByZXZlbnQgdGhlIFdTRExSZWFkZXIgaW5zdGFuY2UgZnJvbSB1c2luZyB0aGUgU3lzdGVtLm91dA0KLQkJLy8gc3RyZWFtIGZvciBtZXNzYWdlcyBhbmQgbG9nZ2luZw0KLQkJcmVhZGVyLnNldEZlYXR1cmUoY29tLmlibS53c2RsLkNvbnN0YW50cy5GRUFUVVJFX1ZFUkJPU0UsIGZhbHNlKTsNCi0JfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9tZXRhZGF0YS9mYWN0b3J5L1Jlc291cmNlRmluZGVyRmFjdG9yeS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvbWV0YWRhdGEvZmFjdG9yeS9SZXNvdXJjZUZpbmRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg3YTdjZi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9tZXRhZGF0YS9mYWN0b3J5L1Jlc291cmNlRmluZGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLm1ldGFkYXRhLmZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLm1ldGFkYXRhLnJlc291cmNlLlJlc291cmNlRmluZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIubWV0YWRhdGEucmVzb3VyY2UuaW1wbC5SZXNvdXJjZUZpbmRlckltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZUZpbmRlckZhY3RvcnkgewotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhSZXNvdXJjZUZpbmRlckZhY3RvcnkuY2xhc3MpOwotCi0gICAgICAgIHByaXZhdGUgUmVzb3VyY2VGaW5kZXIgZmluZGVyID0gbnVsbDsKLQotICAgICAgICBwdWJsaWMgUmVzb3VyY2VGaW5kZXIgZ2V0UmVzb3VyY2VGaW5kZXIoKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGZpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmluZGVyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlRmluZGVySW1wbCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0UmVzb3VyY2VGaW5kZXIoUmVzb3VyY2VGaW5kZXIgZmluZGVyKSB7Ci0gICAgICAgICAgICAgICAgaWYodGhpcy5maW5kZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maW5kZXIgPSBmaW5kZXI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL21ldGFkYXRhL3JlZ2lzdHJ5L01ldGFkYXRhRmFjdG9yeVJlZ2lzdHJ5LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9tZXRhZGF0YS9yZWdpc3RyeS9NZXRhZGF0YUZhY3RvcnlSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNGE1NTg4Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL21ldGFkYXRhL3JlZ2lzdHJ5L01ldGFkYXRhRmFjdG9yeVJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLm1ldGFkYXRhLnJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5DbGllbnRDb25maWd1cmF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLkV4Y2VwdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51dGlsLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLndzZGwuV1NETFJlYWRlckNvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLndzZGwuV1NETFJlYWRlckNvbmZpZ3VyYXRvckltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5tZXRhZGF0YS5mYWN0b3J5LlJlc291cmNlRmluZGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1wdWJsaWMgY2xhc3MgTWV0YWRhdGFGYWN0b3J5UmVnaXN0cnkgewotICAgIAotICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhNZXRhZGF0YUZhY3RvcnlSZWdpc3RyeS5jbGFzcyk7Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNvbmZpZ3VyYXRpb25GaWxlTG9jID0gbnVsbDsKLSAgICAKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBNYXA8Q2xhc3MsT2JqZWN0PiB0YWJsZTsKLSAgICAgICAgc3RhdGljIHsKLSAgICAgICAgICAgICAgICB0YWJsZSA9IG5ldyBIYXNodGFibGU8Q2xhc3MsT2JqZWN0PigpOwotICAgICAgICAgICAgICAgIHRhYmxlLnB1dChSZXNvdXJjZUZpbmRlckZhY3RvcnkuY2xhc3MsIG5ldyBSZXNvdXJjZUZpbmRlckZhY3RvcnkoKSk7Ci0gICAgICAgICAgICAgICAgdGFibGUucHV0KENsaWVudENvbmZpZ3VyYXRpb25GYWN0b3J5LmNsYXNzLCBuZXcgQ2xpZW50Q29uZmlndXJhdGlvbkZhY3RvcnkoKSk7Ci0gICAgICAgICAgICAgICAgdGFibGUucHV0KFdTRExSZWFkZXJDb25maWd1cmF0b3IuY2xhc3MsIG5ldyBXU0RMUmVhZGVyQ29uZmlndXJhdG9ySW1wbCgpKTsKLSAgICAgICAgICAgICAgICBpZihjb25maWd1cmF0aW9uRmlsZUxvYyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkEgY29uZmlndXJhdGlvbiBmaWxlIGxvY2F0aW9uIHdhcyBub3Qgc2V0LiBUaGUgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZvbGxvd2luZyBsb2NhdGlvbiB3aWxsIGJlIHVzZWQ6ICIgKyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuTUVUQURBVEFfUkVHSVNUUllfQ09ORklHX0ZJTEUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb25GaWxlTG9jID0gQ29uc3RhbnRzLk1FVEFEQVRBX1JFR0lTVFJZX0NPTkZJR19GSUxFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBsb2FkQ29uZmlnRnJvbUZpbGUoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIEZhY3RvcnlSZWdpc3RyeSBpcyBjdXJyZW50bHkgYSBzdGF0aWMgc2luZ2xldG9uCi0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIE1ldGFkYXRhRmFjdG9yeVJlZ2lzdHJ5KCkgewotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvKioKLSAgICAgICAgICogZ2V0RmFjdG9yeQotICAgICAgICAgKiBAcGFyYW0gaW50ZmFjZSBvZiB0aGUgRmFjdG9yeQotICAgICAgICAgKiBAcmV0dXJuIE9iamVjdCB0aGF0IGlzIHRoZSBmYWN0b3J5IGltcGxlbWVudGF0aW9uIGZvciB0aGUgaW50ZmFjZQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0RmFjdG9yeShDbGFzcyBpbnRmYWNlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRhYmxlLmdldChpbnRmYWNlKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIHNldEZhY3RvcnkKLSAgICAgICAgICogQHBhcmFtIGludGZhY2UKLSAgICAgICAgICogQHBhcmFtIGZhY3RvcnlPYmplY3QKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRGYWN0b3J5KENsYXNzIGludGZhY2UsIE9iamVjdCBmYWN0b3J5T2JqZWN0KXsKLSAgICAgICAgICAgICAgICB0YWJsZS5wdXQoaW50ZmFjZSwgZmFjdG9yeU9iamVjdCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGxvYWQgYSBmaWxlLCBpZiBpdCBleGlzdHMsIHRoYXQgY29udGFpbnMgYSBsaXN0Ci0gICAgICAgICAqIG9mIGludGVyZmFjZXMgYW5kIGN1c3RvbSBpbXBsZW1lbnRhdGlvbnMuIFRoaXMgYWxsb3dzIGZvciBub24tCi0gICAgICAgICAqIHByb2dyYW1tYXRpYyByZWdpc3RyYXRpb24gb2YgY3VzdG9tIGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbnMKLSAgICAgICAgICogd2l0aCB0aGUgTURRIGxheWVyLgotICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBsb2FkQ29uZmlnRnJvbUZpbGUoKSB7Ci0gICAgICAgICAgICBTdHJpbmcgcGFpclNlcGFyYXRvciA9ICJ8IjsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIgPSBnZXRDb250ZXh0Q2xhc3NMb2FkZXIobnVsbCk7Ci0gICAgICAgICAgICAgICAgVVJMIHVybCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgdXJsID0gY2xhc3NMb2FkZXIuZ2V0UmVzb3VyY2UoY29uZmlndXJhdGlvbkZpbGVMb2MpOwotICAgICAgICAgICAgICAgIGlmKHVybCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGNvbmZpZ3VyYXRpb25GaWxlTG9jKTsKLSAgICAgICAgICAgICAgICAgICAgdXJsID0gZmlsZS50b1VSTCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyB0aGUgcHJlc2VuY2Ugb2YgdGhpcyBmaWxlIGlzIG9wdGlvbmFsCi0gICAgICAgICAgICAgICAgaWYodXJsICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiRm91bmQgVVJMIHRvIE1ldGFkYXRhRmFjdG9yeVJlZ2lzdHJ5IGNvbmZpZ3VyYXRpb24gZmlsZTogIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbkZpbGVMb2MpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIodXJsLm9wZW5TdHJlYW0oKSkpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGluZSA9IHJlYWRlci5yZWFkTGluZSgpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHNlcGFyYXRvciBvZiB0aGUgZmlsZSBpcyB0aGUgJ3wnIGNoYXJhY3RlcgotICAgICAgICAgICAgICAgICAgICAvLyB0byB0aGUgbGVmdCBvZiB0aGUgc2VwYXJhdG9yIHdpbGwgYmUgdGhlIGludGVyZmFjZSBhbmQKLSAgICAgICAgICAgICAgICAgICAgLy8gdG8gdGhlIHJpZ2h0IHdpbGwgYmUgdGhlIGN1c3RvbSBpbXBsZW1lbnRhdGlvbgotICAgICAgICAgICAgICAgICAgICBpZihsaW5lICE9IG51bGwgJiYgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZS5pbmRleE9mKCJ8IikgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBpbnRlcmZhY2VOYW1lID0gbGluZS5zdWJzdHJpbmcoMCwgbGluZS5pbmRleE9mKHBhaXJTZXBhcmF0b3IpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBpbXBsTmFtZSA9IGxpbmUuc3Vic3RyaW5nKGxpbmUuaW5kZXhPZihwYWlyU2VwYXJhdG9yKSArIDEsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lLmxlbmd0aCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJGb3IgcmVnaXN0ZXJlZCBjbGFzczogIiArIGludGVyZmFjZU5hbWUgKyAiIHRoZSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmb2xsb3dpbmcgaW1wbGVtZW50YXRpb24gd2FzIGZvdW5kOiAiICsgaW1wbE5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MgaW50ZiA9IGNsYXNzTG9hZGVyLmxvYWRDbGFzcyhpbnRlcmZhY2VOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzIGltcGwgPSBjbGFzc0xvYWRlci5sb2FkQ2xhc3MoaW1wbE5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB3ZSBjb3VsZCBsb2FkIGJvdGggd2UgbmVlZCB0byByZWdpc3RlciB0aGVtIHdpdGggb3VyCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnRlcm5hbCByZWdpc3RyeQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoaW50ZiAhPSBudWxsICYmIGltcGwgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiTG9hZGVkIGJvdGggaW50ZXJmYWNlIGFuZCBpbXBsZW1lbnRhdGlvbiBjbGFzczogIiArIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZU5hbWUgKyAiOiIgKyBpbXBsTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGltcGwuZ2V0RW5jbG9zaW5nQ2xhc3MoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlLnB1dChpbnRmLCBpbXBsLm5ld0luc3RhbmNlKCkpOyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGxvZy5pc1dhcm5FbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKCJUaGUgaW1wbGVtZW50YXRpb24gY2xhc3M6ICIgKyBpbXBsLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGNvdWxkIG5vdCBiZSBscmVnaXN0ZXJlZCBiZWNhdXNlIGl0IGlzIGFuIGlubmVyIGNsYXNzLiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbiBvcmRlciB0byByZWdpc3RlciBmaWxlLWJhc2VkIG92ZXJyaWRlcywgaW1wbGVtZW50YXRpb25zICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm11c3QgYmUgcHVibGljIG91dGVyIGNsYXNzZXMuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJDb3VsZCBub3QgbG9hZCBib3RoIGludGVyZmFjZSBhbmQgaW1wbGVtZW50YXRpb24gY2xhc3M6ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZU5hbWUgKyAiOiIgKyBpbXBsTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9ZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiRGlkIG5vdCBmaW5kIEZpbGUgZm9yIE1ldGFkYXRhRmFjdG9yeVJlZ2lzdHJ5IGNvbmZpZ3VyYXRpb24gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmlsZTogIiArIGNvbmZpZ3VyYXRpb25GaWxlTG9jKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH1lbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiRGlkIG5vdCBmaW5kIFVSTCBmb3IgTWV0YWRhdGFGYWN0b3J5UmVnaXN0cnkgY29uZmlndXJhdGlvbiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZpbGU6ICIgKyBjb25maWd1cmF0aW9uRmlsZUxvYyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaChUaHJvd2FibGUgdCkgewotICAgICAgICAgICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiVGhlIE1ldGFkYXRhRmFjdG9yeVJlZ2lzdHJ5IGNvdWxkIG5vdCBwcm9jZXNzIHRoZSBjb25maWd1cmF0aW9uIGZpbGU6ICIgKyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbkZpbGVMb2MgKyAiIGJlY2F1c2Ugb2YgdGhlIGZvbGxvd2luZyBlcnJvcjogIiArIHQudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFBhY2thZ2UgcHJvdGVjdGVkIG1ldGhvZCB0byBhbGxvdyB0ZXN0cyB0byBzZXQgdGhlIGxvY2F0aW9uCi0gICAgICAgICAqIG9mIHRoZSBjb25maWd1cmF0aW9uIGZpbGUuCi0gICAgICAgICAqIEBwYXJhbSBjb25maWdGaWxlTmFtZQotICAgICAgICAgKi8KLSAgICAgICAgc3RhdGljIHZvaWQgc2V0Q29uZmlndXJhdGlvbkZpbGVMb2NhdGlvbihTdHJpbmcgY29uZmlnRmlsZUxvYykgewotICAgICAgICAgICAgY29uZmlndXJhdGlvbkZpbGVMb2MgPSBjb25maWdGaWxlTG9jOwotICAgICAgICAgICAgbG9hZENvbmZpZ0Zyb21GaWxlKCk7Ci0gICAgICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIENsYXNzTG9hZGVyIGdldENvbnRleHRDbGFzc0xvYWRlcihmaW5hbCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikgewotICAgICAgICBDbGFzc0xvYWRlciBjbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNsID0gKENsYXNzTG9hZGVyKSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgKLSAgICAgICAgICAgICAgICAgICAgbmV3IFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2xhc3NMb2FkZXIgIT0gbnVsbCA/IGNsYXNzTG9hZGVyIDogVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgKTsKLSAgICAgICAgfSBjYXRjaCAoUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkV4Y2VwdGlvbiB0aHJvd24gZnJvbSBBY2Nlc3NDb250cm9sbGVyOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlLmdldEV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjbDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9tZXRhZGF0YS9yZXNvdXJjZS9SZXNvdXJjZUZpbmRlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvbWV0YWRhdGEvcmVzb3VyY2UvUmVzb3VyY2VGaW5kZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmVlN2FmMS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9tZXRhZGF0YS9yZXNvdXJjZS9SZXNvdXJjZUZpbmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLm1ldGFkYXRhLnJlc291cmNlOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi0vKgotICogUmVzb3VyY2VGaW5kZXIgd2lsbCBiZSB1c2VkIHRvIGZpbmQgUmVzb3VyY2VzIGZyb20gYSBjbGFzc2xvYWRlci4gCi0gKiBmb3IgZXhhbXBsZSBhIFJlc291cmNlRmluZGVyIGNhbiBiZSB1c2VkIHRvIGdldCBhbGwgdGhlIHJlc291cmNlcyBhcyB1cmwgZnJvbSBjbGFzc2xvYWRlcgotICogb3IgaXQgY2FuIGJlIHVzZWQgdG8gZmluZCBhIGNsYXNzIGluIGNsYXNzcGF0aCBmcm9tIENsYXNzbG9hZGVyLiAKLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIFJlc291cmNlRmluZGVyIHsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCByZWFkcyBhbGwgdGhlIHJlc291cmNlIFVSTHMgYXZhaWxhYmxlIHRvIHRoaXMgY2xhc3NMb2FkZXIuCi0gICAgICogQHBhcmFtIGNsCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIFVSTFtdIGdldFVSTHMoQ2xhc3NMb2FkZXIgY2wpOwotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9tZXRhZGF0YS9yZXNvdXJjZS9pbXBsL1Jlc291cmNlRmluZGVySW1wbC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvbWV0YWRhdGEvcmVzb3VyY2UvaW1wbC9SZXNvdXJjZUZpbmRlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDYzMmRkNy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9tZXRhZGF0YS9yZXNvdXJjZS9pbXBsL1Jlc291cmNlRmluZGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLm1ldGFkYXRhLnJlc291cmNlLmltcGw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLm1ldGFkYXRhLnJlc291cmNlLlJlc291cmNlRmluZGVyOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmV0LlVSTENsYXNzTG9hZGVyOwotCi0KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZUZpbmRlckltcGwgaW1wbGVtZW50cyBSZXNvdXJjZUZpbmRlciB7Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLm1ldGFkYXRhLnJlc291cmNlLlJlc291cmNlRmluZGVyI2dldFVSTHMoamF2YS5sYW5nLkNsYXNzTG9hZGVyKQotICAgICAqLwotICAgIHB1YmxpYyBVUkxbXSBnZXRVUkxzKENsYXNzTG9hZGVyIGNsKSB7Ci0gICAgICAgIGlmKGNsIGluc3RhbmNlb2YgVVJMQ2xhc3NMb2FkZXIpewotICAgICAgICAgICAgVVJMQ2xhc3NMb2FkZXIgdXJsTG9hZGVyID0gKFVSTENsYXNzTG9hZGVyKWNsOwotICAgICAgICAgICAgcmV0dXJuIHVybExvYWRlci5nZXRVUkxzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvdGVzdC1yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvb3JnLmFwYWNoZS5heGlzMi5tZXRhZGF0YS5yZWdpc3RyeS5NZXRhZGF0YUZhY3RvcnlSZWdpc3RyeSBiL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3Rlc3QtcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL29yZy5hcGFjaGUuYXhpczIubWV0YWRhdGEucmVnaXN0cnkuTWV0YWRhdGFGYWN0b3J5UmVnaXN0cnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjY2UyOGYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvdGVzdC1yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvb3JnLmFwYWNoZS5heGlzMi5tZXRhZGF0YS5yZWdpc3RyeS5NZXRhZGF0YUZhY3RvcnlSZWdpc3RyeQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLW9yZy5hcGFjaGUuYXhpczIubWV0YWRhdGEucmVnaXN0cnkuTWV0YWRhdGFGYWN0b3J5UmVnaXN0cnlUZXN0cyRUZXN0SW50ZXJmYWNlfG9yZy5hcGFjaGUuYXhpczIubWV0YWRhdGEucmVnaXN0cnkuVGVzdEltcGxlbWVudGF0aW9uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvdGVzdC1yZXNvdXJjZXMvYXhpczIueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvdGVzdC1yZXNvdXJjZXMvYXhpczIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjNkMzFmLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3Rlc3QtcmVzb3VyY2VzL2F4aXMyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTxheGlzY29uZmlnIG5hbWU9IkF4aXNKYXZhMi4wIj4NCi0NCi08cGFyYW1ldGVyIG5hbWU9InJlZHVjZVdTRExNZW1vcnlDYWNoZSI+dHJ1ZTwvcGFyYW1ldGVyPg0KLTxwYXJhbWV0ZXIgbmFtZT0icmVkdWNlV1NETE1lbW9yeVR5cGUiPjI8L3BhcmFtZXRlcj4NCi0NCi0gICAgPG1vZHVsZUNvbmZpZyBuYW1lPSJ0ZXN0TW9kdWxlIj4NCi0gICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0idGVzdE1vZHVsZVBhcmEiPk4vQTwvcGFyYW1ldGVyPg0KLSAgICA8L21vZHVsZUNvbmZpZz4NCi0NCi0gICAgPG1vZHVsZUNvbmZpZyBuYW1lPSJ0ZXN0TW9kdWxlMiI+DQotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9InRlc3RNb2R1bGVQYXJhMiI+Ti9BPC9wYXJhbWV0ZXI+DQotICAgIDwvbW9kdWxlQ29uZmlnPg0KLQ0KLSAgICA8cGhhc2VPcmRlciB0eXBlPSJJbkZsb3ciPg0KLSAgICAgICAgPCEtLSAgU3lzdGVtIHByZSBkZWZpbmVkIHBoYXNlcyAgICAgICAtLT4NCi0gICAgICAgICA8cGhhc2UgbmFtZT0iVHJhbnNwb3J0Ij4NCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJSZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiLz4NCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiLz4NCi0gICAgICAgIDwvcGhhc2U+DQotICAgICAgICA8cGhhc2UgbmFtZT0iU2VjdXJpdHkiLz4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJQcmVEaXNwYXRjaCIvPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9IkRpc3BhdGNoIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuRGlzcGF0Y2hQaGFzZSI+DQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5BZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIi8+DQotDQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciIvPg0KLSAgICAgICAgPC9waGFzZT4NCi0gICAgICAgIDwhLS0gIFN5c3RlbSBwcmUgZGVmaW5lZCBwaGFzZXMgICAgICAgLS0+DQotICAgICAgICA8IS0tICAgQWZ0ZXIgUG9zdGRpc3BhdGNoIHBoYXNlIG1vZHVsZSBhdXRob3Igb3Igb3Igc2VydmljZSBhdXRob3IgY2FuIGFkZCBhbnkgcGhhc2UgaGUgd2FudCAgICAgIC0tPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik9wZXJhdGlvbkluUGhhc2UiLz4NCi0gICAgPC9waGFzZU9yZGVyPg0KLSAgICA8cGhhc2VPcmRlciB0eXBlPSJPdXRGbG93Ij4NCi0gICAgICAgIDwhLS0gICAgICB1c2VyIGNhbiBhZGQgaGlzIG93biBwaGFzZXMgdG8gdGhpcyBhcmVhICAtLT4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJPcGVyYXRpb25PdXRQaGFzZSIvPg0KLSAgICAgICAgPCEtLXN5c3RlbSBwcmVkZWZpbmVkIHBoYXNlLS0+DQotICAgICAgICA8IS0tdGhlc2UgcGhhc2Ugd2lsbCBydW4gaXJyZXNwZWN0aXZlIG9mIHRoZSBzZXJ2aWNlLS0+DQotICAgICAgICA8cGhhc2UgbmFtZT0iUG9saWN5RGV0ZXJtaW5hdGlvbiIvPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik1lc3NhZ2VPdXQiLz4NCi0gICAgPC9waGFzZU9yZGVyPg0KLSAgICA8cGhhc2VPcmRlciB0eXBlPSJJbkZhdWx0RmxvdyI+DQotICAgICAgICA8cGhhc2UgbmFtZT0iUHJlRGlzcGF0Y2giLz4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJEaXNwYXRjaCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkRpc3BhdGNoUGhhc2UiPg0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciIvPg0KLQ0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciIvPg0KLQ0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciIvPg0KLQ0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiLz4NCi0gICAgICAgIDwvcGhhc2U+DQotICAgICAgICA8IS0tICAgICAgdXNlciBjYW4gYWRkIGhpcyBvd24gcGhhc2VzIHRvIHRoaXMgYXJlYSAgLS0+DQotICAgICAgICA8cGhhc2UgbmFtZT0iT3BlcmF0aW9uSW5GYXVsdFBoYXNlIi8+DQotICAgIDwvcGhhc2VPcmRlcj4NCi0gICAgPHBoYXNlT3JkZXIgdHlwZT0iT3V0RmF1bHRGbG93Ij4NCi0gICAgICAgIDwhLS0gICAgICB1c2VyIGNhbiBhZGQgaGlzIG93biBwaGFzZXMgdG8gdGhpcyBhcmVhICAtLT4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJPcGVyYXRpb25PdXRGYXVsdFBoYXNlIi8+DQotICAgICAgICA8cGhhc2UgbmFtZT0iUG9saWN5RGV0ZXJtaW5hdGlvbiIvPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik1lc3NhZ2VPdXQiLz4NCi0gICAgPC9waGFzZU9yZGVyPg0KLTwvYXhpc2NvbmZpZz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS90ZXN0LXJlc291cmNlcy9jb21tb25zLWxvZ2dpbmcucHJvcGVydGllcyBiL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3Rlc3QtcmVzb3VyY2VzL2NvbW1vbnMtbG9nZ2luZy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2I5NWM4Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3Rlc3QtcmVzb3VyY2VzL2NvbW1vbnMtbG9nZ2luZy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotIw0KLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0jDQotDQotIyBUaGlzIGlzIHRoZSBsb2dnaW5nIHByb3BlcnRpZXMgdGhhdCBnb2VzIHRvIHRoZSB3YXIsIHRoZXJlIGFyZSB0d28gbG9nZ2luZyBjb25mIGtlcHQgYXQgdGhlIA0KLSMgc3ZuLCBvbmUgZm9yIGRldmVsb3BlbWVudCAob25lIGF0IHNyYy90ZXN0LXJlc291cmNlcykgYW5kIG90aGVyIGZvciBwcm9kdWNhdGlvbg0KLSANCi0jIFVuY29tbWVudCB0aGUgbmV4dCBsaW5lIHRvIGRpc2FibGUgYWxsIGxvZ2dpbmcuDQotI29yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZz1vcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5pbXBsLk5vT3BMb2cNCi0NCi0jIFVuY29tbWVudCB0aGUgbmV4dCBsaW5lIHRvIGVuYWJsZSB0aGUgc2ltcGxlIGxvZyBiYXNlZCBsb2dnaW5nDQotI29yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZz1vcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5pbXBsLlNpbXBsZUxvZw0KLQ0KLSMgVW5jb21tZW50IHRoZSBuZXh0IGxpbmUgdG8gZW5hYmxlIGxvZzRqIGJhc2VkIGxvZ2dpbmcNCi1vcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c9b3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuaW1wbC5Mb2c0SkxvZ2dlcg0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3Rlc3QtcmVzb3VyY2VzL2xvZzRqLnByb3BlcnRpZXMgYi92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS90ZXN0LXJlc291cmNlcy9sb2c0ai5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjU2ODEyLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3Rlc3QtcmVzb3VyY2VzL2xvZzRqLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0jDQotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSMNCi0NCi0jIFNldCByb290IGNhdGVnb3J5IHByaW9yaXR5IHRvIElORk8gYW5kIGl0cyBvbmx5IGFwcGVuZGVyIHRvIENPTlNPTEUuDQotI2xvZzRqLnJvb3RDYXRlZ29yeT1ERUJVRywgQ09OU09MRQ0KLSNsb2c0ai5yb290Q2F0ZWdvcnk9SU5GTywgQ09OU09MRSwgTE9HRklMRQ0KLSNsb2c0ai5yb290Q2F0ZWdvcnk9SU5GTywgQ09OU09MRQ0KLWxvZzRqLnJvb3RDYXRlZ29yeT1FUlJPUiwgQ09OU09MRQ0KLQ0KLSMgU2V0IHRoZSBlbnRlcnByaXNlIGxvZ2dlciBwcmlvcml0eSB0byBGQVRBTA0KLWxvZzRqLmxvZ2dlci5vcmcuYXBhY2hlLmF4aXMyLmVudGVycHJpc2U9RkFUQUwNCi1sb2c0ai5sb2dnZXIuZGUuaHVuc2lja2VyLmphbG9weS5pbz1GQVRBTA0KLWxvZzRqLmxvZ2dlci5odHRwY2xpZW50LndpcmUuaGVhZGVyPUZBVEFMDQotbG9nNGoubG9nZ2VyLm9yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50PUZBVEFMDQotDQotIyBDT05TT0xFIGlzIHNldCB0byBiZSBhIENvbnNvbGVBcHBlbmRlciB1c2luZyBhIFBhdHRlcm5MYXlvdXQuDQotbG9nNGouYXBwZW5kZXIuQ09OU09MRT1vcmcuYXBhY2hlLmxvZzRqLkNvbnNvbGVBcHBlbmRlcg0KLWxvZzRqLmFwcGVuZGVyLkNPTlNPTEUubGF5b3V0PW9yZy5hcGFjaGUubG9nNGouUGF0dGVybkxheW91dA0KLWxvZzRqLmFwcGVuZGVyLkNPTlNPTEUubGF5b3V0LkNvbnZlcnNpb25QYXR0ZXJuPSVkICUtNXAgJWMgLSAlbSVuDQotDQotIyBMT0dGSUxFIGlzIHNldCB0byBiZSBhIEZpbGUgYXBwZW5kZXIgdXNpbmcgYSBQYXR0ZXJuTGF5b3V0Lg0KLWxvZzRqLmFwcGVuZGVyLkxPR0ZJTEU9b3JnLmFwYWNoZS5sb2c0ai5GaWxlQXBwZW5kZXINCi1sb2c0ai5hcHBlbmRlci5MT0dGSUxFLkZpbGU9YXhpczIubG9nDQotbG9nNGouYXBwZW5kZXIuTE9HRklMRS5BcHBlbmQ9dHJ1ZQ0KLWxvZzRqLmFwcGVuZGVyLkxPR0ZJTEUubGF5b3V0PW9yZy5hcGFjaGUubG9nNGouUGF0dGVybkxheW91dA0KLWxvZzRqLmFwcGVuZGVyLkxPR0ZJTEUubGF5b3V0LkNvbnZlcnNpb25QYXR0ZXJuPSVkIFsldF0gJS01cCAlYyAleCAtICVtJW4NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS90ZXN0LXJlc291cmNlcy90ZXN0LWhhbmRsZXIueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvdGVzdC1yZXNvdXJjZXMvdGVzdC1oYW5kbGVyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg2NTI2Zi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS90ZXN0LXJlc291cmNlcy90ZXN0LWhhbmRsZXIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08andzOmhhbmRsZXItY2hhaW5zIHhtbG5zOmp3cz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIj4NCi0JPGp3czpoYW5kbGVyLWNoYWluIG5hbWU9ImRlbW8iPg0KLQkJPGp3czpoYW5kbGVyPg0KLQkJCTxqd3M6aGFuZGxlci1jbGFzcz4NCi0JCQkJaGFuZGxlci5UZXN0DQotCQkJPC9qd3M6aGFuZGxlci1jbGFzcz4NCi0JCTwvandzOmhhbmRsZXI+DQotCTwvandzOmhhbmRsZXItY2hhaW4+CQ0KLTwvandzOmhhbmRsZXItY2hhaW5zPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3Rlc3QtcmVzb3VyY2VzL3dzZGwvQmluZGluZ05hbWVzcGFjZS53c2RsIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvdGVzdC1yZXNvdXJjZXMvd3NkbC9CaW5kaW5nTmFtZXNwYWNlLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxMDI2ZGIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvdGVzdC1yZXNvdXJjZXMvd3NkbC9CaW5kaW5nTmFtZXNwYWNlLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PiAgPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08ZGVmaW5pdGlvbnMgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vbm9uYW5vbnltb3VzLmNvbXBsZXh0eXBlLnRlc3Qub3JnIiAgICAgICAgeG1sbnM6dG5zPSJodHRwOi8vbm9uYW5vbnltb3VzLmNvbXBsZXh0eXBlLnRlc3Qub3JnIiAgICAgICB4bWxucz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iICAgICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiAgICAgICB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIj4gICAgIAotPHR5cGVzPiAgICAgIAotPHhzZDpzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vbm9uYW5vbnltb3VzLmNvbXBsZXh0eXBlLnRlc3Qub3JnIiB4bWxuczp0cz0iaHR0cDovL25vbmFub255bW91cy5jb21wbGV4dHlwZS50ZXN0Lm9yZy94c2QiICAgICAgICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPiAgICAgICAgICAgCi0JPGNvbXBsZXhUeXBlIG5hbWU9ImVjaG9NZXNzYWdlIj4KLSAgICAgICAgICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InJlcXVlc3QiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICA8L3NlcXVlbmNlPiAgICAgICAgICAKLSAgICAgICA8L2NvbXBsZXhUeXBlPiAgICAgICAgICAgCi0gICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9ImVjaG9NZXNzYWdlUmVzcG9uc2UiPiAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDxzZXF1ZW5jZT4gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InJlc3BvbnNlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+ICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L3NlcXVlbmNlPiAgICAgICAgICAKLSAgICAgICA8L2NvbXBsZXhUeXBlPiAgICAgICAgICAgCi0gICAgICAgPGVsZW1lbnQgbmFtZT0iZWNob01lc3NhZ2UiIHR5cGU9InRuczplY2hvTWVzc2FnZSIvPiAgICAgICAgICAKLSAgICAgICA8ZWxlbWVudCBuYW1lPSJlY2hvTWVzc2FnZVJlc3BvbnNlIiB0eXBlPSJ0bnM6ZWNob01lc3NhZ2VSZXNwb25zZSIvPiAgICAgICAgCi08L3hzZDpzY2hlbWE+ICAgIAotPC90eXBlcz4gICAgIAotCi08bWVzc2FnZSBuYW1lPSJlY2hvTWVzc2FnZSI+ICAgICAgIAotPHBhcnQgbmFtZT0ibWVzc2FnZSIgZWxlbWVudD0idG5zOmVjaG9NZXNzYWdlIi8+ICAgIAotPC9tZXNzYWdlPiAgICAgCi0KLTxtZXNzYWdlIG5hbWU9ImVjaG9NZXNzYWdlUmVzcG9uc2UiPiAgICAgICAKLTxwYXJ0IG5hbWU9InJlc3VsdCIgZWxlbWVudD0idG5zOmVjaG9NZXNzYWdlUmVzcG9uc2UiLz4gICAgCi08L21lc3NhZ2U+ICAgICAKLQotPHBvcnRUeXBlIG5hbWU9IkVjaG9NZXNzYWdlUG9ydFR5cGUiPiAgICAgICAKLSAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9NZXNzYWdlIj4gICAgICAgICAgCi0gICAgICAgICAgICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmVjaG9NZXNzYWdlIiAvPiAgICAgICAgICAKLSAgICAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmVjaG9NZXNzYWdlUmVzcG9uc2UiIC8+ICAgICAgIAotICAgICAgIDwvb3BlcmF0aW9uPiAgICAKLTwvcG9ydFR5cGU+ICAgICAKLQotPGJpbmRpbmcgbmFtZT0iRWNob01lc3NhZ2VCaW5kaW5nIiB0eXBlPSJ0bnM6RWNob01lc3NhZ2VQb3J0VHlwZSI+ICAgICAgIAotICAgICAgICAgICA8c29hcDpiaW5kaW5nIHN0eWxlPSJkb2N1bWVudCIgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiLz4gICAgICAgCi0gICAgICAgICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9NZXNzYWdlIj4gICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4gICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQ+ICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIG5hbWVzcGFjZT0iaHR0cDovL29yZy5hcGFjaGUuYmluZGluZy5ucyIvPiAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2lucHV0PiAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG91dHB1dD4gICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgbmFtZXNwYWNlPSJodHRwOi8vb3JnLmFwYWNoZS5iaW5kaW5nLm5zIi8+ICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vdXRwdXQ+ICAgICAgIAotICAgICAgICAgICAgICA8L29wZXJhdGlvbj4gICAgCi08L2JpbmRpbmc+ICAgICAKLQotPHNlcnZpY2UgbmFtZT0iRWNob01lc3NhZ2VTZXJ2aWNlIj4gICAgICAgCi0gICAgICAgPHBvcnQgYmluZGluZz0idG5zOkVjaG9NZXNzYWdlQmluZGluZyIgbmFtZT0iRWNob01lc3NhZ2VQb3J0Ij4gICAgICAgICAgCi0gICAgICAgICAgICAgIDxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9FY2hvTWVzc2FnZVNlcnZpY2UvRWNob01lc3NhZ2VTZXJ2aWNlIi8+ICAgICAgIAotICAgICAgIDwvcG9ydD4gICAgIAotPC9zZXJ2aWNlPiAgCi0KLTwvZGVmaW5pdGlvbnM+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS90ZXN0LXJlc291cmNlcy93c2RsL0JpbmRpbmdOYW1lc3BhY2VEZWZhdWx0cy53c2RsIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvdGVzdC1yZXNvdXJjZXMvd3NkbC9CaW5kaW5nTmFtZXNwYWNlRGVmYXVsdHMud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE4N2JlNi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS90ZXN0LXJlc291cmNlcy93c2RsL0JpbmRpbmdOYW1lc3BhY2VEZWZhdWx0cy53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4gIDwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGRlZmluaXRpb25zIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL25vbmFub255bW91cy5jb21wbGV4dHlwZS50ZXN0Lm9yZyIgICAgICAgIHhtbG5zOnRucz0iaHR0cDovL25vbmFub255bW91cy5jb21wbGV4dHlwZS50ZXN0Lm9yZyIgICAgICAgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiAgICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgICAgICAgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyI+ICAgICAKLTx0eXBlcz4gICAgICAKLTx4c2Q6c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL25vbmFub255bW91cy5jb21wbGV4dHlwZS50ZXN0Lm9yZyIgeG1sbnM6dHM9Imh0dHA6Ly9ub25hbm9ueW1vdXMuY29tcGxleHR5cGUudGVzdC5vcmcveHNkIiAgICAgICAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIj4gICAgICAgICAgIAotCTxjb21wbGV4VHlwZSBuYW1lPSJlY2hvTWVzc2FnZSI+ICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPHNlcXVlbmNlPiAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0icmVxdWVzdCIgdHlwZT0ieHNkOnN0cmluZyIvPiAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvc2VxdWVuY2U+ICAgICAgICAgIAotICAgICAgIDwvY29tcGxleFR5cGU+ICAgICAgICAgICAKLSAgICAgICA8Y29tcGxleFR5cGUgbmFtZT0iZWNob01lc3NhZ2VSZXNwb25zZSI+ICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPHNlcXVlbmNlPiAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0icmVzcG9uc2UiIHR5cGU9InhzZDpzdHJpbmciLz4gICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvc2VxdWVuY2U+ICAgICAgICAgIAotICAgICAgIDwvY29tcGxleFR5cGU+ICAgICAgICAgICAKLSAgICAgICA8ZWxlbWVudCBuYW1lPSJlY2hvTWVzc2FnZSIgdHlwZT0idG5zOmVjaG9NZXNzYWdlIi8+ICAgICAgICAgIAotICAgICAgIDxlbGVtZW50IG5hbWU9ImVjaG9NZXNzYWdlUmVzcG9uc2UiIHR5cGU9InRuczplY2hvTWVzc2FnZVJlc3BvbnNlIi8+ICAgICAgICAKLTwveHNkOnNjaGVtYT4gICAgCi08L3R5cGVzPiAgICAgCi0KLTxtZXNzYWdlIG5hbWU9ImVjaG9NZXNzYWdlIj4gICAgICAgCi08cGFydCBuYW1lPSJtZXNzYWdlIiBlbGVtZW50PSJ0bnM6ZWNob01lc3NhZ2UiLz4gICAgCi08L21lc3NhZ2U+ICAgICAKLQotPG1lc3NhZ2UgbmFtZT0iZWNob01lc3NhZ2VSZXNwb25zZSI+ICAgICAgIAotPHBhcnQgbmFtZT0icmVzdWx0IiBlbGVtZW50PSJ0bnM6ZWNob01lc3NhZ2VSZXNwb25zZSIvPiAgICAKLTwvbWVzc2FnZT4gICAgIAotCi08cG9ydFR5cGUgbmFtZT0iRWNob01lc3NhZ2VQb3J0VHlwZSI+ICAgICAgIAotICAgICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob01lc3NhZ2UiPiAgICAgICAgICAKLSAgICAgICAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6ZWNob01lc3NhZ2UiIC8+ICAgICAgICAgIAotICAgICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6ZWNob01lc3NhZ2VSZXNwb25zZSIgLz4gICAgICAgCi0gICAgICAgPC9vcGVyYXRpb24+ICAgIAotPC9wb3J0VHlwZT4gICAgIAotCi08YmluZGluZyBuYW1lPSJFY2hvTWVzc2FnZUJpbmRpbmciIHR5cGU9InRuczpFY2hvTWVzc2FnZVBvcnRUeXBlIj4gICAgICAgCi0gICAgICAgICAgIDxzb2FwOmJpbmRpbmcgc3R5bGU9ImRvY3VtZW50IiB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIvPiAgICAgICAKLSAgICAgICAgICAgICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob01lc3NhZ2UiPiAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPiAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dD4gICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4gICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9pbnB1dD4gICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvdXRwdXQ+ICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+ICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vdXRwdXQ+ICAgICAgIAotICAgICAgICAgICAgICAgPC9vcGVyYXRpb24+ICAgIAotPC9iaW5kaW5nPiAgICAgCi0KLTxzZXJ2aWNlIG5hbWU9IkVjaG9NZXNzYWdlU2VydmljZSI+ICAgICAgIAotICAgICAgIDxwb3J0IGJpbmRpbmc9InRuczpFY2hvTWVzc2FnZUJpbmRpbmciIG5hbWU9IkVjaG9NZXNzYWdlUG9ydCI+ICAgICAgICAgIAotICAgICAgICAgICAgICAgIDxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9FY2hvTWVzc2FnZVNlcnZpY2UvRWNob01lc3NhZ2VTZXJ2aWNlIi8+ICAgICAgIAotICAgICAgIDwvcG9ydD4gICAgIAotPC9zZXJ2aWNlPiAgCi0KLTwvZGVmaW5pdGlvbnM+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS90ZXN0LXJlc291cmNlcy93c2RsL0NsaWVudEVuZHBvaW50TWV0YWRhdGEud3NkbCBiL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3Rlc3QtcmVzb3VyY2VzL3dzZGwvQ2xpZW50RW5kcG9pbnRNZXRhZGF0YS53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDg2ZWQyLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3Rlc3QtcmVzb3VyY2VzL3dzZGwvQ2xpZW50RW5kcG9pbnRNZXRhZGF0YS53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4gIA0KLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTxkZWZpbml0aW9ucyB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9vcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmltcGwuQ2xpZW50REJDU3VwcG9ydEVuZHBvaW50VGVzdHMiDQotICAgICAgICAgICAgIHhtbG5zOnRucz0iaHR0cDovL29yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uaW1wbC5DbGllbnREQkNTdXBwb3J0RW5kcG9pbnRUZXN0cyINCi0gICAgICAgICAgICAgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIg0KLSAgICAgICAgICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIg0KLSAgICAgICAgICAgICB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIj4gICAgIA0KLSAgPHR5cGVzPiAgICAgIA0KLSAgICA8eHNkOnNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9kZXNjcmlwdGlvbi5qYXh3cy5heGlzMi5hcGFjaGUub3JnIiANCi0gICAgICAgICAgICAgICAgeG1sbnM6dHM9Imh0dHA6Ly9kZXNjcmlwdGlvbi5qYXh3cy5heGlzMi5hcGFjaGUub3JnL3hzZCINCi0gICAgICAgICAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+ICAgICAgICAgICANCi0gICAgICA8Y29tcGxleFR5cGUgbmFtZT0iZWNob01lc3NhZ2UiPg0KLSAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJyZXF1ZXN0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+DQotICAgICAgICA8L3NlcXVlbmNlPiAgICAgICAgICANCi0gICAgICA8L2NvbXBsZXhUeXBlPiAgICAgICAgICAgDQotICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9ImVjaG9NZXNzYWdlUmVzcG9uc2UiPiAgICAgICAgICAgICANCi0gICAgICAgIDxzZXF1ZW5jZT4gICAgICAgICAgICAgICAgDQotICAgICAgICAgIDxlbGVtZW50IG5hbWU9InJlc3BvbnNlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+ICAgICAgICAgICAgDQotICAgICAgICA8L3NlcXVlbmNlPiAgICAgICAgICANCi0gICAgICA8L2NvbXBsZXhUeXBlPiAgICAgICAgICAgDQotICAgICAgPGVsZW1lbnQgbmFtZT0iZWNob01lc3NhZ2UiIHR5cGU9InRuczplY2hvTWVzc2FnZSIvPiAgICAgICAgICANCi0gICAgICA8ZWxlbWVudCBuYW1lPSJlY2hvTWVzc2FnZVJlc3BvbnNlIiB0eXBlPSJ0bnM6ZWNob01lc3NhZ2VSZXNwb25zZSIvPiAgICAgICAgDQotICAgIDwveHNkOnNjaGVtYT4gICAgDQotICA8L3R5cGVzPiAgICAgDQotDQotICA8bWVzc2FnZSBuYW1lPSJlY2hvTWVzc2FnZSI+ICAgICAgIA0KLSAgICA8cGFydCBuYW1lPSJtZXNzYWdlIiBlbGVtZW50PSJ0bnM6ZWNob01lc3NhZ2UiLz4gICAgDQotICA8L21lc3NhZ2U+ICAgICANCi0NCi0gIDxtZXNzYWdlIG5hbWU9ImVjaG9NZXNzYWdlUmVzcG9uc2UiPiAgICAgICANCi0gICAgPHBhcnQgbmFtZT0icmVzdWx0IiBlbGVtZW50PSJ0bnM6ZWNob01lc3NhZ2VSZXNwb25zZSIvPiAgICANCi0gIDwvbWVzc2FnZT4gICAgIA0KLQ0KLSAgPHBvcnRUeXBlIG5hbWU9IkVjaG9NZXNzYWdlUG9ydFR5cGUiPiAgICAgICANCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvTWVzc2FnZSI+ICAgICAgICAgIA0KLSAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6ZWNob01lc3NhZ2UiIC8+ICAgICAgICAgIA0KLSAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmVjaG9NZXNzYWdlUmVzcG9uc2UiIC8+ICAgICAgIA0KLSAgICA8L29wZXJhdGlvbj4gICAgDQotICA8L3BvcnRUeXBlPiAgICAgDQotDQotICA8YmluZGluZyBuYW1lPSJFY2hvTWVzc2FnZUJpbmRpbmciIHR5cGU9InRuczpFY2hvTWVzc2FnZVBvcnRUeXBlIj4gICAgICAgDQotICAgIDxzb2FwOmJpbmRpbmcgc3R5bGU9ImRvY3VtZW50IiB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIvPiAgICAgICANCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvTWVzc2FnZSI+ICAgICAgICAgIA0KLSAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4gICAgICAgICANCi0gICAgICA8aW5wdXQ+ICAgICAgICAgICAgIA0KLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIG5hbWVzcGFjZT0iaHR0cDovL29yZy5hcGFjaGUuYmluZGluZy5ucyIvPiAgICAgICAgICANCi0gICAgICA8L2lucHV0PiAgICAgICAgICAgDQotICAgICAgPG91dHB1dD4gICAgICAgICAgICAgDQotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgbmFtZXNwYWNlPSJodHRwOi8vb3JnLmFwYWNoZS5iaW5kaW5nLm5zIi8+ICAgICAgICAgDQotICAgICAgPC9vdXRwdXQ+ICAgICAgIA0KLSAgICA8L29wZXJhdGlvbj4gICAgDQotICA8L2JpbmRpbmc+ICAgICANCi0NCi0gIDxzZXJ2aWNlIG5hbWU9InN2Y0xvY2FsUGFydCI+ICAgICAgIA0KLSAgICA8cG9ydCBiaW5kaW5nPSJ0bnM6RWNob01lc3NhZ2VCaW5kaW5nIiBuYW1lPSJwb3J0TG9jYWxQYXJ0Ij4gICAgICAgICAgDQotICAgICAgPHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo4MDgwL0VjaG9NZXNzYWdlU2VydmljZS9FY2hvTWVzc2FnZVNlcnZpY2UiLz4gICAgICAgDQotICAgIDwvcG9ydD4gICAgIA0KLSAgPC9zZXJ2aWNlPiAgDQotPC9kZWZpbml0aW9ucz4NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS90ZXN0LXJlc291cmNlcy93c2RsL0VjaG9NZXNzYWdlU2VydmljZS53c2RsIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvdGVzdC1yZXNvdXJjZXMvd3NkbC9FY2hvTWVzc2FnZVNlcnZpY2Uud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZhNjA4Zi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS90ZXN0LXJlc291cmNlcy93c2RsL0VjaG9NZXNzYWdlU2VydmljZS53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4gIDwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTxkZWZpbml0aW9ucyB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9ub25hbm9ueW1vdXMuY29tcGxleHR5cGUudGVzdC5vcmciICAgICAgICB4bWxuczp0bnM9Imh0dHA6Ly9ub25hbm9ueW1vdXMuY29tcGxleHR5cGUudGVzdC5vcmciICAgICAgIHhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIgICAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiICAgICAgIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iPiAgICAgDQotPHR5cGVzPiAgICAgIA0KLTx4c2Q6c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL25vbmFub255bW91cy5jb21wbGV4dHlwZS50ZXN0Lm9yZyIgeG1sbnM6dHM9Imh0dHA6Ly9ub25hbm9ueW1vdXMuY29tcGxleHR5cGUudGVzdC5vcmcveHNkIiAgICAgICAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIj4gICAgICAgICAgIA0KLQk8Y29tcGxleFR5cGUgbmFtZT0iZWNob01lc3NhZ2UiPiAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICA8c2VxdWVuY2U+ICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0icmVxdWVzdCIgdHlwZT0ieHNkOnN0cmluZyIvPiAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICA8L3NlcXVlbmNlPiAgICAgICAgICANCi0gICAgICAgPC9jb21wbGV4VHlwZT4gICAgICAgICAgIA0KLSAgICAgICA8Y29tcGxleFR5cGUgbmFtZT0iZWNob01lc3NhZ2VSZXNwb25zZSI+ICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgIDxzZXF1ZW5jZT4gICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJyZXNwb25zZSIgdHlwZT0ieHNkOnN0cmluZyIvPiAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgIDwvc2VxdWVuY2U+ICAgICAgICAgIA0KLSAgICAgICA8L2NvbXBsZXhUeXBlPiAgICAgICAgICAgDQotICAgICAgIDxlbGVtZW50IG5hbWU9ImVjaG9NZXNzYWdlIiB0eXBlPSJ0bnM6ZWNob01lc3NhZ2UiLz4gICAgICAgICAgDQotICAgICAgIDxlbGVtZW50IG5hbWU9ImVjaG9NZXNzYWdlUmVzcG9uc2UiIHR5cGU9InRuczplY2hvTWVzc2FnZVJlc3BvbnNlIi8+ICAgICAgICANCi08L3hzZDpzY2hlbWE+ICAgIA0KLTwvdHlwZXM+ICAgICANCi0NCi08bWVzc2FnZSBuYW1lPSJlY2hvTWVzc2FnZSI+ICAgICAgIA0KLTxwYXJ0IG5hbWU9Im1lc3NhZ2UiIGVsZW1lbnQ9InRuczplY2hvTWVzc2FnZSIvPiAgICANCi08L21lc3NhZ2U+ICAgICANCi0NCi08bWVzc2FnZSBuYW1lPSJlY2hvTWVzc2FnZVJlc3BvbnNlIj4gICAgICAgDQotPHBhcnQgbmFtZT0icmVzdWx0IiBlbGVtZW50PSJ0bnM6ZWNob01lc3NhZ2VSZXNwb25zZSIvPiAgICANCi08L21lc3NhZ2U+ICAgICANCi0NCi08cG9ydFR5cGUgbmFtZT0iRWNob01lc3NhZ2VQb3J0VHlwZSI+ICAgICAgIA0KLSAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9NZXNzYWdlIj4gICAgICAgICAgDQotICAgICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczplY2hvTWVzc2FnZSIgLz4gICAgICAgICAgDQotICAgICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6ZWNob01lc3NhZ2VSZXNwb25zZSIgLz4gICAgICAgDQotICAgICAgIDwvb3BlcmF0aW9uPiAgICANCi08L3BvcnRUeXBlPiAgICAgDQotDQotPGJpbmRpbmcgbmFtZT0iRWNob01lc3NhZ2VCaW5kaW5nIiB0eXBlPSJ0bnM6RWNob01lc3NhZ2VQb3J0VHlwZSI+ICAgICAgIA0KLSAgICAgICAgICAgPHNvYXA6YmluZGluZyBzdHlsZT0iZG9jdW1lbnQiIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIi8+ICAgICAgIA0KLSAgICAgICAgICAgICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob01lc3NhZ2UiPiAgICAgICAgICANCi0gICAgICAgICAgICAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4gICAgICAgICANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0PiAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4gICAgICAgICAgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaW5wdXQ+ICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG91dHB1dD4gICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+ICAgICAgICAgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3V0cHV0PiAgICAgICANCi0gICAgICAgICAgICAgICA8L29wZXJhdGlvbj4gICAgDQotPC9iaW5kaW5nPiAgICAgDQotDQotPHNlcnZpY2UgbmFtZT0iRWNob01lc3NhZ2VTZXJ2aWNlIj4gICAgICAgDQotICAgICAgIDxwb3J0IGJpbmRpbmc9InRuczpFY2hvTWVzc2FnZUJpbmRpbmciIG5hbWU9IkVjaG9NZXNzYWdlUG9ydCI+ICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICA8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjgwODAvRWNob01lc3NhZ2VTZXJ2aWNlL0VjaG9NZXNzYWdlU2VydmljZSIvPiAgICAgICANCi0gICAgICAgPC9wb3J0PiAgICAgDQotPC9zZXJ2aWNlPiAgDQotDQotPC9kZWZpbml0aW9ucz4NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS90ZXN0LXJlc291cmNlcy93c2RsL1BhcnRpYWxXU0RMMS53c2RsIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvdGVzdC1yZXNvdXJjZXMvd3NkbC9QYXJ0aWFsV1NETDEud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY0MzQ1Yy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS90ZXN0LXJlc291cmNlcy93c2RsL1BhcnRpYWxXU0RMMS53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxkZWZpbml0aW9ucyB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9zZXJ2ZXJQYXJ0aWFsMS5jaGVja2V4Y2VwdGlvbi53ZWJmYXVsdC5hbm5vdGF0aW9ucy8iIG5hbWU9IkFkZE51bWJlcnNJbXBsUGFydGlhbDFTZXJ2aWNlIiB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczp0bnM9Imh0dHA6Ly9zZXJ2ZXJQYXJ0aWFsMS5jaGVja2V4Y2VwdGlvbi53ZWJmYXVsdC5hbm5vdGF0aW9ucy8iIHhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0gIDx0eXBlcz4KLSAgICA8eHNkOnNjaGVtYT4KLSAgICAgIDx4c2Q6aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3NlcnZlclBhcnRpYWwxLmNoZWNrZXhjZXB0aW9uLndlYmZhdWx0LmFubm90YXRpb25zLyIgc2NoZW1hTG9jYXRpb249IlBhcnRpYWxXU0RMMV9zY2hlbWEueHNkIi8+Ci0gICAgPC94c2Q6c2NoZW1hPgotICA8L3R5cGVzPgotICA8bWVzc2FnZSBuYW1lPSJhZGRUd29OdW1iZXJzIj4KLSAgICA8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJ0bnM6YWRkVHdvTnVtYmVycyIvPgotICA8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIG5hbWU9ImFkZFR3b051bWJlcnNSZXNwb25zZSI+Ci0gICAgPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0idG5zOmFkZFR3b051bWJlcnNSZXNwb25zZSIvPgotICA8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIG5hbWU9IkFkZE5lZ2F0aXZlTnVtYmVyc0V4Y2VwdGlvbiI+Ci0gICAgPHBhcnQgbmFtZT0iZmF1bHQiIGVsZW1lbnQ9InRuczpBZGROZWdhdGl2ZU51bWJlcnNFeGNlcHRpb24iLz4KLSAgPC9tZXNzYWdlPgotICA8cG9ydFR5cGUgbmFtZT0iQWRkTnVtYmVyc0ltcGxQYXJ0aWFsMSI+Ci0gICAgPG9wZXJhdGlvbiBuYW1lPSJhZGRUd29OdW1iZXJzIj4KLSAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6YWRkVHdvTnVtYmVycyIvPgotICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6YWRkVHdvTnVtYmVyc1Jlc3BvbnNlIi8+Ci0gICAgICA8ZmF1bHQgbmFtZT0iQWRkTmVnYXRpdmVOdW1iZXJzRXhjZXB0aW9uIiBtZXNzYWdlPSJ0bnM6QWRkTmVnYXRpdmVOdW1iZXJzRXhjZXB0aW9uIi8+Ci0gICAgPC9vcGVyYXRpb24+Ci0gIDwvcG9ydFR5cGU+Ci0KLTwhLS0gIFBhcnRpYWwgV1NETCAxOiBObyBiaW5kaW5nLCBzZXJ2aWNlLCBvciBwb3J0IGluZm9ybWF0aW9uCi0gICAgPGJpbmRpbmcgbmFtZT0iQWRkTnVtYmVyc0ltcGxQYXJ0aWFsMVBvcnRCaW5kaW5nIiB0eXBlPSJ0bnM6QWRkTnVtYmVyc0ltcGxQYXJ0aWFsMSI+Ci0gICAgPHNvYXA6YmluZGluZyB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgPG9wZXJhdGlvbiBuYW1lPSJhZGRUd29OdW1iZXJzIj4KLSAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4KLSAgICAgIDxpbnB1dD4KLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgIDwvaW5wdXQ+Ci0gICAgICA8b3V0cHV0PgotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgPC9vdXRwdXQ+Ci0gICAgICA8ZmF1bHQgbmFtZT0iQWRkTmVnYXRpdmVOdW1iZXJzRXhjZXB0aW9uIj4KLSAgICAgICAgPHNvYXA6ZmF1bHQgbmFtZT0iQWRkTmVnYXRpdmVOdW1iZXJzRXhjZXB0aW9uIiB1c2U9ImxpdGVyYWwiLz4KLSAgICAgIDwvZmF1bHQ+Ci0gICAgPC9vcGVyYXRpb24+Ci0gIDwvYmluZGluZz4KLSAgPHNlcnZpY2UgbmFtZT0iQWRkTnVtYmVyc0ltcGxQYXJ0aWFsMVNlcnZpY2UiPgotICAgIDxwb3J0IG5hbWU9IkFkZE51bWJlcnNJbXBsUGFydGlhbDFQb3J0IiBiaW5kaW5nPSJ0bnM6QWRkTnVtYmVyc0ltcGxQYXJ0aWFsMVBvcnRCaW5kaW5nIj4KLSAgICAgIDxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9AUkVQTEFDRV9XSVRIX0hPU1RfTkFNRUA6QFJFUExBQ0VfV0lUSF9QT1JUX05VTUAvd2ViZmF1bHRjaGtleGMvd2ViZmF1bHRjaGtleGNwMSIvPgotICAgIDwvcG9ydD4KLSAgPC9zZXJ2aWNlPgotLS0+Ci0gIAotPC9kZWZpbml0aW9ucz4KLQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvdGVzdC1yZXNvdXJjZXMvd3NkbC9QYXJ0aWFsV1NETDFfc2NoZW1hLnhzZCBiL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3Rlc3QtcmVzb3VyY2VzL3dzZGwvUGFydGlhbFdTREwxX3NjaGVtYS54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1OTUwNjEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvdGVzdC1yZXNvdXJjZXMvd3NkbC9QYXJ0aWFsV1NETDFfc2NoZW1hLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08eHM6c2NoZW1hIHZlcnNpb249IjEuMCIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vc2VydmVyUGFydGlhbDEuY2hlY2tleGNlcHRpb24ud2ViZmF1bHQuYW5ub3RhdGlvbnMvIiB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPgotCi0gIDx4czplbGVtZW50IG5hbWU9IkFkZE5lZ2F0aXZlTnVtYmVyc0V4Y2VwdGlvbiIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzOnN0cmluZyIvPgotCi0gIDx4czplbGVtZW50IG5hbWU9ImFkZFR3b051bWJlcnMiIHR5cGU9Im5zMTphZGRUd29OdW1iZXJzIiB4bWxuczpuczE9Imh0dHA6Ly9zZXJ2ZXJQYXJ0aWFsMS5jaGVja2V4Y2VwdGlvbi53ZWJmYXVsdC5hbm5vdGF0aW9ucy8iLz4KLQotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iYWRkVHdvTnVtYmVycyI+Ci0gICAgPHhzOnNlcXVlbmNlPgotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iYXJnMCIgdHlwZT0ieHM6aW50Ii8+Ci0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJhcmcxIiB0eXBlPSJ4czppbnQiLz4KLSAgICA8L3hzOnNlcXVlbmNlPgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9ImFkZFR3b051bWJlcnNSZXNwb25zZSIgdHlwZT0ibnMyOmFkZFR3b051bWJlcnNSZXNwb25zZSIgeG1sbnM6bnMyPSJodHRwOi8vc2VydmVyUGFydGlhbDEuY2hlY2tleGNlcHRpb24ud2ViZmF1bHQuYW5ub3RhdGlvbnMvIi8+Ci0KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImFkZFR3b051bWJlcnNSZXNwb25zZSI+Ci0gICAgPHhzOnNlcXVlbmNlPgotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0icmV0dXJuIiB0eXBlPSJ4czppbnQiLz4KLSAgICA8L3hzOnNlcXVlbmNlPgotICA8L3hzOmNvbXBsZXhUeXBlPgotPC94czpzY2hlbWE+Ci0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3Rlc3QtcmVzb3VyY2VzL3dzZGwvUGFydGlhbFdTREwyLndzZGwgYi92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS90ZXN0LXJlc291cmNlcy93c2RsL1BhcnRpYWxXU0RMMi53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2IwNDY2Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3Rlc3QtcmVzb3VyY2VzL3dzZGwvUGFydGlhbFdTREwyLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ieWVzIj8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGRlZmluaXRpb25zIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3NlcnZlclBhcnRpYWwxLmNoZWNrZXhjZXB0aW9uLndlYmZhdWx0LmFubm90YXRpb25zLyIgbmFtZT0iQWRkTnVtYmVyc0ltcGxQYXJ0aWFsMVNlcnZpY2UiIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOnRucz0iaHR0cDovL3NlcnZlclBhcnRpYWwxLmNoZWNrZXhjZXB0aW9uLndlYmZhdWx0LmFubm90YXRpb25zLyIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLSAgPHR5cGVzPgotICAgIDx4c2Q6c2NoZW1hPgotICAgICAgPHhzZDppbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vc2VydmVyUGFydGlhbDEuY2hlY2tleGNlcHRpb24ud2ViZmF1bHQuYW5ub3RhdGlvbnMvIiBzY2hlbWFMb2NhdGlvbj0iUGFydGlhbFdTREwxX3NjaGVtYS54c2QiLz4KLSAgICA8L3hzZDpzY2hlbWE+Ci0gIDwvdHlwZXM+Ci0KLTwhLS0gIFBhcnRpYWwgV1NETCAyOiBPbmx5IHR5cGVzIHNwZWNpZmllZAotICA8bWVzc2FnZSBuYW1lPSJhZGRUd29OdW1iZXJzIj4KLSAgICA8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJ0bnM6YWRkVHdvTnVtYmVycyIvPgotICA8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIG5hbWU9ImFkZFR3b051bWJlcnNSZXNwb25zZSI+Ci0gICAgPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0idG5zOmFkZFR3b051bWJlcnNSZXNwb25zZSIvPgotICA8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIG5hbWU9IkFkZE5lZ2F0aXZlTnVtYmVyc0V4Y2VwdGlvbiI+Ci0gICAgPHBhcnQgbmFtZT0iZmF1bHQiIGVsZW1lbnQ9InRuczpBZGROZWdhdGl2ZU51bWJlcnNFeGNlcHRpb24iLz4KLSAgPC9tZXNzYWdlPgotICA8cG9ydFR5cGUgbmFtZT0iQWRkTnVtYmVyc0ltcGxQYXJ0aWFsMSI+Ci0gICAgPG9wZXJhdGlvbiBuYW1lPSJhZGRUd29OdW1iZXJzIj4KLSAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6YWRkVHdvTnVtYmVycyIvPgotICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6YWRkVHdvTnVtYmVyc1Jlc3BvbnNlIi8+Ci0gICAgICA8ZmF1bHQgbmFtZT0iQWRkTmVnYXRpdmVOdW1iZXJzRXhjZXB0aW9uIiBtZXNzYWdlPSJ0bnM6QWRkTmVnYXRpdmVOdW1iZXJzRXhjZXB0aW9uIi8+Ci0gICAgPC9vcGVyYXRpb24+Ci0gIDwvcG9ydFR5cGU+Ci0KLSAgICA8YmluZGluZyBuYW1lPSJBZGROdW1iZXJzSW1wbFBhcnRpYWwxUG9ydEJpbmRpbmciIHR5cGU9InRuczpBZGROdW1iZXJzSW1wbFBhcnRpYWwxIj4KLSAgICA8c29hcDpiaW5kaW5nIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICA8b3BlcmF0aW9uIG5hbWU9ImFkZFR3b051bWJlcnMiPgotICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPgotICAgICAgPGlucHV0PgotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgPC9pbnB1dD4KLSAgICAgIDxvdXRwdXQ+Ci0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICA8L291dHB1dD4KLSAgICAgIDxmYXVsdCBuYW1lPSJBZGROZWdhdGl2ZU51bWJlcnNFeGNlcHRpb24iPgotICAgICAgICA8c29hcDpmYXVsdCBuYW1lPSJBZGROZWdhdGl2ZU51bWJlcnNFeGNlcHRpb24iIHVzZT0ibGl0ZXJhbCIvPgotICAgICAgPC9mYXVsdD4KLSAgICA8L29wZXJhdGlvbj4KLSAgPC9iaW5kaW5nPgotICA8c2VydmljZSBuYW1lPSJBZGROdW1iZXJzSW1wbFBhcnRpYWwxU2VydmljZSI+Ci0gICAgPHBvcnQgbmFtZT0iQWRkTnVtYmVyc0ltcGxQYXJ0aWFsMVBvcnQiIGJpbmRpbmc9InRuczpBZGROdW1iZXJzSW1wbFBhcnRpYWwxUG9ydEJpbmRpbmciPgotICAgICAgPHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL0BSRVBMQUNFX1dJVEhfSE9TVF9OQU1FQDpAUkVQTEFDRV9XSVRIX1BPUlRfTlVNQC93ZWJmYXVsdGNoa2V4Yy93ZWJmYXVsdGNoa2V4Y3AxIi8+Ci0gICAgPC9wb3J0PgotICA8L3NlcnZpY2U+Ci0tLT4KLSAgCi08L2RlZmluaXRpb25zPgotCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS90ZXN0LXJlc291cmNlcy93c2RsL1Byb3h5RG9jTGl0V3JhcHBlZC53c2RsIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvdGVzdC1yZXNvdXJjZXMvd3NkbC9Qcm94eURvY0xpdFdyYXBwZWQud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY2ZWZjNy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS90ZXN0LXJlc291cmNlcy93c2RsL1Byb3h5RG9jTGl0V3JhcHBlZC53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsMzAyICswLDAgQEAKLTw/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+Ci0KLTwvd3NkbDpkZWZpbml0aW9ucz4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3Rlc3QtcmVzb3VyY2VzL3dzZGwvUmVzcGVjdEJpbmRpbmcud3NkbCBiL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3Rlc3QtcmVzb3VyY2VzL3dzZGwvUmVzcGVjdEJpbmRpbmcud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFmMTMzYi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS90ZXN0LXJlc291cmNlcy93c2RsL1Jlc3BlY3RCaW5kaW5nLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PiAgPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPGRlZmluaXRpb25zIHhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyINCi0gIHhtbG5zOnRucz0iaHR0cDovL2pheHdzLmF4aXMyLmFwYWNoZS5vcmcvbWV0YWRhdGEvZmVhdHVyZS9yZXNwZWN0YmluZGluZyINCi0gIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiDQotICB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIg0KLSAgeG1sbnM6d3Nhdz0iaHR0cDovL3d3dy53My5vcmcvMjAwNi8wNS9hZGRyZXNzaW5nL3dzZGwiDQotICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9qYXh3cy5heGlzMi5hcGFjaGUub3JnL21ldGFkYXRhL2ZlYXR1cmUvcmVzcGVjdGJpbmRpbmciPiAgICAgDQotPHR5cGVzPiAgICAgIA0KLSAgPHhzZDpzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vamF4d3MuYXhpczIuYXBhY2hlLm9yZy9tZXRhZGF0YS9mZWF0dXJlL3Jlc3BlY3RiaW5kaW5nIiANCi0gICAgeG1sbnM6dG5zPSJodHRwOi8vamF4d3MuYXhpczIuYXBhY2hlLm9yZy9tZXRhZGF0YS9mZWF0dXJlL3Jlc3BlY3RiaW5kaW5nIg0KLSAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIA0KLSAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+ICAgICAgICAgICANCi0JPGNvbXBsZXhUeXBlIG5hbWU9ImVjaG8iPg0KLQkgIDxzZXF1ZW5jZT4NCi0gICAgICAgIDxlbGVtZW50IG5hbWU9InJlcXVlc3QiIHR5cGU9InhzZDpzdHJpbmciLz4NCi0gICAgICA8L3NlcXVlbmNlPiAgICAgICAgICANCi0gICAgPC9jb21wbGV4VHlwZT4gICAgICAgICAgIA0KLSAgICA8Y29tcGxleFR5cGUgbmFtZT0iZWNob1Jlc3BvbnNlIj4gICAgICAgICAgICAgDQotICAgICAgPHNlcXVlbmNlPiAgICAgICAgICAgICAgICANCi0gICAgICAgIDxlbGVtZW50IG5hbWU9InJlc3BvbnNlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+ICAgICAgICAgICAgDQotICAgICAgPC9zZXF1ZW5jZT4gICAgICAgICAgDQotICAgIDwvY29tcGxleFR5cGU+ICAgICAgICAgICANCi0gICAgICAgDQotICAgIDxlbGVtZW50IG5hbWU9ImVjaG8iIHR5cGU9InRuczplY2hvTWVzc2FnZSIvPiAgICAgICAgICANCi0gICAgPGVsZW1lbnQgbmFtZT0iZWNob1Jlc3BvbnNlIiB0eXBlPSJ0bnM6ZWNob01lc3NhZ2VSZXNwb25zZSIvPiAgICAgICAgDQotICA8L3hzZDpzY2hlbWE+ICAgIA0KLTwvdHlwZXM+ICAgICANCi0NCi08bWVzc2FnZSBuYW1lPSJlY2hvIj4gICAgICAgDQotICA8cGFydCBuYW1lPSJtZXNzYWdlIiBlbGVtZW50PSJ0bnM6ZWNob01lc3NhZ2UiLz4gICAgDQotPC9tZXNzYWdlPiAgICAgDQotDQotPG1lc3NhZ2UgbmFtZT0iZWNobyI+IA0KLSAgPHBhcnQgbmFtZT0icmVzdWx0IiBlbGVtZW50PSJ0bnM6ZWNob01lc3NhZ2VSZXNwb25zZSIvPiAgICANCi08L21lc3NhZ2U+ICAgICANCi0NCi08cG9ydFR5cGUgbmFtZT0iRWNob01lc3NhZ2VQb3J0VHlwZSI+ICAgICAgIA0KLSAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvIj4gICAgICAgICAgDQotICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6ZWNobyIgLz4gICAgICAgICAgDQotICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmVjaG9SZXNwb25zZSIgLz4gICAgICAgDQotICA8L29wZXJhdGlvbj4gICAgDQotPC9wb3J0VHlwZT4gICAgIA0KLQ0KLTxiaW5kaW5nIG5hbWU9IkVjaG9NZXNzYWdlQmluZGluZyIgdHlwZT0idG5zOkVjaG9NZXNzYWdlUG9ydFR5cGUiPiAgICAgICANCi0gIDxzb2FwOmJpbmRpbmcgc3R5bGU9ImRvY3VtZW50IiB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIvPiAgICAgICANCi0gIDxvcGVyYXRpb24gbmFtZT0iZWNobyI+ICAgICAgICAgIA0KLSAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+ICAgICAgICAgDQotICAgIDxpbnB1dD4gICAgICAgICAgICAgDQotICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4gICAgICAgICAgDQotICAgIDwvaW5wdXQ+ICAgICAgICAgICANCi0gICAgPG91dHB1dD4gICAgICAgICAgICAgDQotICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+ICAgICAgICAgDQotICAgIDwvb3V0cHV0PiAgICAgICANCi0gIDwvb3BlcmF0aW9uPiAgIA0KLQ0KLSAgPHdzYXc6VXNpbmdBZGRyZXNzaW5nIHJlcXVpcmVkPSJ0cnVlIiAvPiANCi08L2JpbmRpbmc+ICAgICANCi0NCi08c2VydmljZSBuYW1lPSJFY2hvTWVzc2FnZVNlcnZpY2UiPiAgICAgICANCi0gIDxwb3J0IGJpbmRpbmc9InRuczpFY2hvTWVzc2FnZUJpbmRpbmciIG5hbWU9IkRlZmF1bHRTZXJ2aWNlUG9ydCI+ICAgICAgICAgIA0KLSAgICA8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjgwODAvdW5rbm93biIvPiAgICAgICANCi0gIDwvcG9ydD4NCi0gIDxwb3J0IGJpbmRpbmc9InRuczpFY2hvTWVzc2FnZUJpbmRpbmciIG5hbWU9IkRpc2FibGVkU2VydmljZVBvcnQiPiAgICAgICAgICANCi0gICAgPHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo4MDgwL3Vua25vd24iLz4gICAgICAgDQotICA8L3BvcnQ+ICAgICANCi0gIDxwb3J0IGJpbmRpbmc9InRuczpFY2hvTWVzc2FnZUJpbmRpbmciIG5hbWU9IkNvbXBsZXRlU2VydmljZVBvcnQiPiAgICAgICAgICANCi0gICAgPHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo4MDgwL3Vua25vd24iLz4gICAgICAgDQotICA8L3BvcnQ+ICAgICANCi08L3NlcnZpY2U+ICANCi0NCi08L2RlZmluaXRpb25zPg0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3Rlc3QtcmVzb3VyY2VzL3dzZGwvVmFsaWRhdGVXU0RMMS53c2RsIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvdGVzdC1yZXNvdXJjZXMvd3NkbC9WYWxpZGF0ZVdTREwxLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczMjBhMDQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvdGVzdC1yZXNvdXJjZXMvd3NkbC9WYWxpZGF0ZVdTREwxLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ieWVzIj8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGRlZmluaXRpb25zIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3NlcnZlclBhcnRpYWwxLmNoZWNrZXhjZXB0aW9uLndlYmZhdWx0LmFubm90YXRpb25zLyIgbmFtZT0iQWRkTnVtYmVyc0ltcGxQYXJ0aWFsMVNlcnZpY2UiIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOnRucz0iaHR0cDovL3NlcnZlclBhcnRpYWwxLmNoZWNrZXhjZXB0aW9uLndlYmZhdWx0LmFubm90YXRpb25zLyIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLSAgPHR5cGVzPgotICAgIDx4c2Q6c2NoZW1hPgotICAgICAgPHhzZDppbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vc2VydmVyUGFydGlhbDEuY2hlY2tleGNlcHRpb24ud2ViZmF1bHQuYW5ub3RhdGlvbnMvIiBzY2hlbWFMb2NhdGlvbj0iUGFydGlhbFdTREwxX3NjaGVtYS54c2QiLz4KLSAgICA8L3hzZDpzY2hlbWE+Ci0gIDwvdHlwZXM+Ci0gIDxtZXNzYWdlIG5hbWU9ImFkZFR3b051bWJlcnMiPgotICAgIDxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9InRuczphZGRUd29OdW1iZXJzIi8+Ci0gIDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2UgbmFtZT0iYWRkVHdvTnVtYmVyc1Jlc3BvbnNlIj4KLSAgICA8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJ0bnM6YWRkVHdvTnVtYmVyc1Jlc3BvbnNlIi8+Ci0gIDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2UgbmFtZT0iQWRkTmVnYXRpdmVOdW1iZXJzRXhjZXB0aW9uIj4KLSAgICA8cGFydCBuYW1lPSJmYXVsdCIgZWxlbWVudD0idG5zOkFkZE5lZ2F0aXZlTnVtYmVyc0V4Y2VwdGlvbiIvPgotICA8L21lc3NhZ2U+Ci0gIDxwb3J0VHlwZSBuYW1lPSJWYWxpZGF0ZVdTRExJbXBsMSI+Ci0gICAgPG9wZXJhdGlvbiBuYW1lPSJhZGRUd29OdW1iZXJzIj4KLSAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6YWRkVHdvTnVtYmVycyIvPgotICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6YWRkVHdvTnVtYmVyc1Jlc3BvbnNlIi8+Ci0gICAgICA8ZmF1bHQgbmFtZT0iQWRkTmVnYXRpdmVOdW1iZXJzRXhjZXB0aW9uIiBtZXNzYWdlPSJ0bnM6QWRkTmVnYXRpdmVOdW1iZXJzRXhjZXB0aW9uIi8+Ci0gICAgPC9vcGVyYXRpb24+Ci0gICAgPG9wZXJhdGlvbiBuYW1lPSJhZGRUd29OdW1iZXJzMiI+Ci0gICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmFkZFR3b051bWJlcnMiLz4KLSAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmFkZFR3b051bWJlcnNSZXNwb25zZSIvPgotICAgICAgPGZhdWx0IG5hbWU9IkFkZE5lZ2F0aXZlTnVtYmVyc0V4Y2VwdGlvbiIgbWVzc2FnZT0idG5zOkFkZE5lZ2F0aXZlTnVtYmVyc0V4Y2VwdGlvbiIvPgotICAgIDwvb3BlcmF0aW9uPgotICA8L3BvcnRUeXBlPgotCi0gIDxiaW5kaW5nIG5hbWU9IkFkZE51bWJlcnNJbXBsUGFydGlhbDFQb3J0QmluZGluZyIgdHlwZT0idG5zOlZhbGlkYXRlV1NETEltcGwxIj4KLSAgICA8c29hcDpiaW5kaW5nIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICA8b3BlcmF0aW9uIG5hbWU9ImFkZFR3b051bWJlcnMiPgotICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPgotICAgICAgPGlucHV0PgotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgPC9pbnB1dD4KLSAgICAgIDxvdXRwdXQ+Ci0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICA8L291dHB1dD4KLSAgICAgIDxmYXVsdCBuYW1lPSJBZGROZWdhdGl2ZU51bWJlcnNFeGNlcHRpb24iPgotICAgICAgICA8c29hcDpmYXVsdCBuYW1lPSJBZGROZWdhdGl2ZU51bWJlcnNFeGNlcHRpb24iIHVzZT0ibGl0ZXJhbCIvPgotICAgICAgPC9mYXVsdD4KLSAgICA8L29wZXJhdGlvbj4KLSAgICA8b3BlcmF0aW9uIG5hbWU9ImFkZFR3b051bWJlcnMyIj4KLSAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4KLSAgICAgIDxpbnB1dD4KLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgIDwvaW5wdXQ+Ci0gICAgICA8b3V0cHV0PgotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgPC9vdXRwdXQ+Ci0gICAgICA8ZmF1bHQgbmFtZT0iQWRkTmVnYXRpdmVOdW1iZXJzRXhjZXB0aW9uIj4KLSAgICAgICAgPHNvYXA6ZmF1bHQgbmFtZT0iQWRkTmVnYXRpdmVOdW1iZXJzRXhjZXB0aW9uIiB1c2U9ImxpdGVyYWwiLz4KLSAgICAgIDwvZmF1bHQ+Ci0gICAgPC9vcGVyYXRpb24+Ci0gIDwvYmluZGluZz4KLSAgPHNlcnZpY2UgbmFtZT0iVmFsaWRhdGVXU0RMSW1wbDFTZXJ2aWNlSW52YWxpZFBvcnQiPgotICAgIDxwb3J0IG5hbWU9IlZhbGlkYXRlV1NETEltcGwxUG9ydCIgYmluZGluZz0idG5zOkFkZE51bWJlcnNJbXBsUGFydGlhbDFQb3J0QmluZGluZyI+Ci0gICAgICA8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vQFJFUExBQ0VfV0lUSF9IT1NUX05BTUVAOkBSRVBMQUNFX1dJVEhfUE9SVF9OVU1AL3dlYmZhdWx0Y2hrZXhjL3dlYmZhdWx0Y2hrZXhjcDEiLz4KLSAgICA8L3BvcnQ+Ci0gIDwvc2VydmljZT4KLSAgCi08L2RlZmluaXRpb25zPgotCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vQW5ub3RhdGlvblByb3ZpZGVySW1wbERlc2NyaXB0aW9uVGVzdHMuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9Bbm5vdGF0aW9uUHJvdmlkZXJJbXBsRGVzY3JpcHRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWRmZTlkLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9Bbm5vdGF0aW9uUHJvdmlkZXJJbXBsRGVzY3JpcHRpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuTURRQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouQmFzaWNDb25maWd1cmF0b3I7Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQTWVzc2FnZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwud3MuQmluZGluZ1R5cGU7Ci1pbXBvcnQgamF2YXgueG1sLndzLlByb3ZpZGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlOwotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlTW9kZTsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZVByb3ZpZGVyOwotCi1wdWJsaWMgY2xhc3MgQW5ub3RhdGlvblByb3ZpZGVySW1wbERlc2NyaXB0aW9uVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgc3RhdGljIHsKLSAgICAgICAgLy8gTm90ZSB5b3Ugd2lsbCBwcm9iYWJseSBuZWVkIHRvIGluY3JlYXNlIHRoZSBqYXZhIGhlYXAgc2l6ZSwgZm9yIGV4YW1wbGUKLSAgICAgICAgLy8gLVhteDUxMm0uICBUaGlzIGNhbiBiZSBkb25lIGJ5IHNldHRpbmcgbWF2ZW4uanVuaXQuanZtYXJncyBpbiBwcm9qZWN0LnByb3BlcnRpZXMuCi0gICAgICAgIC8vIFRvIGNoYW5nZSB0aGUgc2V0dGluZ3MsIGVkaXQgdGhlIGxvZzRqLnByb3BlcnR5IGZpbGUKLSAgICAgICAgLy8gaW4gdGhlIHRlc3QtcmVzb3VyY2VzIGRpcmVjdG9yeS4KLSAgICAgICAgQmFzaWNDb25maWd1cmF0b3IuY29uZmlndXJlKCk7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QmFzaWNQcm92aWRlcigpIHsKLSAgICAgICAgLy8gVXNlIHRoZSBkZXNjcmlwdGlvbiBmYWN0b3J5IGRpcmVjdGx5OyB0aGlzIHdpbGwgYmUgZG9uZSB3aXRoaW4gdGhlIEpBWC1XUyBydW50aW1lCi0gICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzZXJ2aWNlRGVzYyA9Ci0gICAgICAgICAgICAgICAgRGVzY3JpcHRpb25GYWN0b3J5LmNyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbihCYXNpY1Byb3ZpZGVyVGVzdEltcGwuY2xhc3MpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2VEZXNjKTsKLQotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uW10gZW5kcG9pbnREZXNjID0gc2VydmljZURlc2MuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbnMoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChlbmRwb2ludERlc2MpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgZW5kcG9pbnREZXNjLmxlbmd0aCk7Ci0KLSAgICAgICAgLy8gVE9ETzogSG93IHdpbGwgdGhlIEpBWC1XUyBkaXNwYXRjaGVyIGdldCB0aGUgYXBwcm9wcmlhdGUgcG9ydCAoaS5lLiBlbmRwb2ludCk/ICBDdXJyZW50bHkgYXNzdW1lcyBbMF0KLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbkphdmEgdGVzdEVuZHBvaW50RGVzYyA9IChFbmRwb2ludERlc2NyaXB0aW9uSmF2YSllbmRwb2ludERlc2NbMF07Ci0gICAgICAgIGFzc2VydE5vdE51bGwodGVzdEVuZHBvaW50RGVzYyk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhTZXJ2aWNlLk1vZGUuTUVTU0FHRSwgdGVzdEVuZHBvaW50RGVzYy5nZXRBbm5vU2VydmljZU1vZGVWYWx1ZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAvYmluZGluZ3MvSFRUUC8iLAotICAgICAgICAgICAgICAgICAgICAgdGVzdEVuZHBvaW50RGVzYy5nZXRBbm5vQmluZGluZ1R5cGVWYWx1ZSgpKTsKLSAgICAgICAgLy8gVGhlIFdlYlNlcnZpY2VQcm92aWRlciBhbm5vdGF0aW9uIHNwZWNpZmllZCBubyB2YWx1ZXMgb24gaXQuCi0gICAgICAgIC8vIFRPRE86IFdoZW4gdGhlIERlc2NyaXB0aW9uIHBhY2thZ2UgY2hhbmdlcyB0byBwcm92aWRlIGRlZmF1bHQgdmFsdWVzIHdoZW4gbm8gYW5ub3RhdGlvbiBwcmVzZW50LCB0aGlzIG1heSBuZWVkIHRvIGNoYW5nZS4KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCB0ZXN0RW5kcG9pbnREZXNjLmdldEFubm9XZWJTZXJ2aWNlV1NETExvY2F0aW9uKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkJhc2ljUHJvdmlkZXJUZXN0SW1wbFNlcnZpY2UiLAotICAgICAgICAgICAgICAgICAgICAgdGVzdEVuZHBvaW50RGVzYy5nZXRBbm5vV2ViU2VydmljZVNlcnZpY2VOYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkJhc2ljUHJvdmlkZXJUZXN0SW1wbFBvcnQiLCB0ZXN0RW5kcG9pbnREZXNjLmdldEFubm9XZWJTZXJ2aWNlUG9ydE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiaHR0cDovL2Rlc2NyaXB0aW9uLmpheHdzLmF4aXMyLmFwYWNoZS5vcmcvIiwKLSAgICAgICAgICAgICAgICAgICAgIHRlc3RFbmRwb2ludERlc2MuZ2V0QW5ub1dlYlNlcnZpY2VUYXJnZXROYW1lc3BhY2UoKSk7Ci0gCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEJhc2ljUHJvdmlkZXJXaXRoSk1TKCkgewotICAgICAgICAvLyBVc2UgdGhlIGRlc2NyaXB0aW9uIGZhY3RvcnkgZGlyZWN0bHk7IHRoaXMgd2lsbCBiZSBkb25lIHdpdGhpbiB0aGUgSkFYLVdTIHJ1bnRpbWUKLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNlcnZpY2VEZXNjID0KLSAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkZhY3RvcnkuY3JlYXRlU2VydmljZURlc2NyaXB0aW9uKEJhc2ljUHJvdmlkZXJKTVNUZXN0SW1wbC5jbGFzcyk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZURlc2MpOwotCi0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb25bXSBlbmRwb2ludERlc2MgPSBzZXJ2aWNlRGVzYy5nZXRFbmRwb2ludERlc2NyaXB0aW9ucygpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGVuZHBvaW50RGVzYyk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBlbmRwb2ludERlc2MubGVuZ3RoKTsKLQotICAgICAgICAvLyBUT0RPOiBIb3cgd2lsbCB0aGUgSkFYLVdTIGRpc3BhdGNoZXIgZ2V0IHRoZSBhcHByb3ByaWF0ZSBwb3J0IChpLmUuIGVuZHBvaW50KT8gIEN1cnJlbnRseSBhc3N1bWVzIFswXQotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uSmF2YSB0ZXN0RW5kcG9pbnREZXNjID0gKEVuZHBvaW50RGVzY3JpcHRpb25KYXZhKWVuZHBvaW50RGVzY1swXTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh0ZXN0RW5kcG9pbnREZXNjKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFNlcnZpY2UuTW9kZS5NRVNTQUdFLCB0ZXN0RW5kcG9pbnREZXNjLmdldEFubm9TZXJ2aWNlTW9kZVZhbHVlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoTURRQ29uc3RhbnRzLlNPQVAxMkpNU19CSU5ESU5HLAotICAgICAgICAgICAgICAgICAgICAgdGVzdEVuZHBvaW50RGVzYy5nZXRBbm5vQmluZGluZ1R5cGVWYWx1ZSgpKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFRoZSBXZWJTZXJ2aWNlUHJvdmlkZXIgYW5ub3RhdGlvbiBzcGVjaWZpZWQgbm8gdmFsdWVzIG9uIGl0LgotICAgICAgICAvLyBUT0RPOiBXaGVuIHRoZSBEZXNjcmlwdGlvbiBwYWNrYWdlIGNoYW5nZXMgdG8gcHJvdmlkZSBkZWZhdWx0IHZhbHVlcyB3aGVuIG5vIGFubm90YXRpb24gcHJlc2VudCwgdGhpcyBtYXkgbmVlZCB0byBjaGFuZ2UuCi0gICAgICAgIGFzc2VydEVxdWFscygiIiwgdGVzdEVuZHBvaW50RGVzYy5nZXRBbm5vV2ViU2VydmljZVdTRExMb2NhdGlvbigpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJCYXNpY1Byb3ZpZGVySk1TVGVzdEltcGxTZXJ2aWNlIiwKLSAgICAgICAgICAgICAgICAgICAgIHRlc3RFbmRwb2ludERlc2MuZ2V0QW5ub1dlYlNlcnZpY2VTZXJ2aWNlTmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJCYXNpY1Byb3ZpZGVySk1TVGVzdEltcGxQb3J0IiwgdGVzdEVuZHBvaW50RGVzYy5nZXRBbm5vV2ViU2VydmljZVBvcnROYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly9kZXNjcmlwdGlvbi5qYXh3cy5heGlzMi5hcGFjaGUub3JnLyIsCi0gICAgICAgICAgICAgICAgICAgICB0ZXN0RW5kcG9pbnREZXNjLmdldEFubm9XZWJTZXJ2aWNlVGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RXZWJTZXJ2aWNlUHJvdmlkZXIoKSB7Ci0gICAgICAgIC8vIFVzZSB0aGUgZGVzY3JpcHRpb24gZmFjdG9yeSBkaXJlY3RseTsgdGhpcyB3aWxsIGJlIGRvbmUgd2l0aGluIHRoZSBKQVgtV1MgcnVudGltZQotICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc2VydmljZURlc2MgPQotICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uRmFjdG9yeS5jcmVhdGVTZXJ2aWNlRGVzY3JpcHRpb24oV2ViU2VydmljZVByb3ZpZGVyVGVzdEltcGwuY2xhc3MpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2VEZXNjKTsKLQotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uW10gZW5kcG9pbnREZXNjID0gc2VydmljZURlc2MuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbnMoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChlbmRwb2ludERlc2MpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgZW5kcG9pbnREZXNjLmxlbmd0aCk7Ci0KLSAgICAgICAgLy8gVE9ETzogSG93IHdpbGwgdGhlIEpBWC1XUyBkaXNwYXRjaGVyIGdldCB0aGUgYXBwcm9wcmlhdGUgcG9ydCAoaS5lLiBlbmRwb2ludCk/ICBDdXJyZW50bHkgYXNzdW1lcyBbMF0KLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbkphdmEgdGVzdEVuZHBvaW50RGVzYyA9IChFbmRwb2ludERlc2NyaXB0aW9uSmF2YSllbmRwb2ludERlc2NbMF07Ci0gICAgICAgIGFzc2VydE5vdE51bGwodGVzdEVuZHBvaW50RGVzYyk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhTZXJ2aWNlLk1vZGUuUEFZTE9BRCwgdGVzdEVuZHBvaW50RGVzYy5nZXRBbm5vU2VydmljZU1vZGVWYWx1ZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAvYmluZGluZ3MvSFRUUC8iLAotICAgICAgICAgICAgICAgICAgICAgdGVzdEVuZHBvaW50RGVzYy5nZXRBbm5vQmluZGluZ1R5cGVWYWx1ZSgpKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly93c2RsLnRlc3QiLCB0ZXN0RW5kcG9pbnREZXNjLmdldEFubm9XZWJTZXJ2aWNlV1NETExvY2F0aW9uKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlByb3ZpZGVyU2VydmljZSIsIHRlc3RFbmRwb2ludERlc2MuZ2V0QW5ub1dlYlNlcnZpY2VTZXJ2aWNlTmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJQcm92aWRlclNlcnZpY2VQb3J0IiwgdGVzdEVuZHBvaW50RGVzYy5nZXRBbm5vV2ViU2VydmljZVBvcnROYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly9uYW1lc3BhY2UudGVzdCIsIHRlc3RFbmRwb2ludERlc2MuZ2V0QW5ub1dlYlNlcnZpY2VUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RXZWJTZXJ2aWNlUHJvdmlkZXJXaXRoSk1TKCkgewotICAgICAgICAvLyBVc2UgdGhlIGRlc2NyaXB0aW9uIGZhY3RvcnkgZGlyZWN0bHk7IHRoaXMgd2lsbCBiZSBkb25lIHdpdGhpbiB0aGUgSkFYLVdTIHJ1bnRpbWUKLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNlcnZpY2VEZXNjID0KLSAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkZhY3RvcnkuY3JlYXRlU2VydmljZURlc2NyaXB0aW9uKFdlYlNlcnZpY2VQcm92aWRlckpNU1Rlc3RJbXBsLmNsYXNzKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlRGVzYyk7Ci0KLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbltdIGVuZHBvaW50RGVzYyA9IHNlcnZpY2VEZXNjLmdldEVuZHBvaW50RGVzY3JpcHRpb25zKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZW5kcG9pbnREZXNjKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGVuZHBvaW50RGVzYy5sZW5ndGgpOwotCi0gICAgICAgIC8vIFRPRE86IEhvdyB3aWxsIHRoZSBKQVgtV1MgZGlzcGF0Y2hlciBnZXQgdGhlIGFwcHJvcHJpYXRlIHBvcnQgKGkuZS4gZW5kcG9pbnQpPyAgQ3VycmVudGx5IGFzc3VtZXMgWzBdCi0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb25KYXZhIHRlc3RFbmRwb2ludERlc2MgPSAoRW5kcG9pbnREZXNjcmlwdGlvbkphdmEpZW5kcG9pbnREZXNjWzBdOwotICAgICAgICBhc3NlcnROb3ROdWxsKHRlc3RFbmRwb2ludERlc2MpOwotICAgICAgICBhc3NlcnRFcXVhbHMoU2VydmljZS5Nb2RlLlBBWUxPQUQsIHRlc3RFbmRwb2ludERlc2MuZ2V0QW5ub1NlcnZpY2VNb2RlVmFsdWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhNRFFDb25zdGFudHMuU09BUDEySk1TX0JJTkRJTkcsCi0gICAgICAgICAgICAgICAgICAgICB0ZXN0RW5kcG9pbnREZXNjLmdldEFubm9CaW5kaW5nVHlwZVZhbHVlKCkpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygiaHR0cDovL3dzZGwudGVzdCIsIHRlc3RFbmRwb2ludERlc2MuZ2V0QW5ub1dlYlNlcnZpY2VXU0RMTG9jYXRpb24oKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiUHJvdmlkZXJTZXJ2aWNlIiwgdGVzdEVuZHBvaW50RGVzYy5nZXRBbm5vV2ViU2VydmljZVNlcnZpY2VOYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlByb3ZpZGVyU2VydmljZVBvcnQiLCB0ZXN0RW5kcG9pbnREZXNjLmdldEFubm9XZWJTZXJ2aWNlUG9ydE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiaHR0cDovL25hbWVzcGFjZS50ZXN0IiwgdGVzdEVuZHBvaW50RGVzYy5nZXRBbm5vV2ViU2VydmljZVRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICB9Ci0gICAgCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdFNlcnZpY2VNb2RlUHJvdmlkZXIoKSB7Ci0gICAgICAgIC8vIFVzZSB0aGUgZGVzY3JpcHRpb24gZmFjdG9yeSBkaXJlY3RseTsgdGhpcyB3aWxsIGJlIGRvbmUgd2l0aGluIHRoZSBKQVgtV1MgcnVudGltZQotICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc2VydmljZURlc2MgPQotICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uRmFjdG9yeQotICAgICAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbihEZWZhdWx0U2VydmljZU1vZGVQcm92aWRlclRlc3RJbXBsLmNsYXNzKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlRGVzYyk7Ci0KLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbltdIGVuZHBvaW50RGVzYyA9IHNlcnZpY2VEZXNjLmdldEVuZHBvaW50RGVzY3JpcHRpb25zKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZW5kcG9pbnREZXNjKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGVuZHBvaW50RGVzYy5sZW5ndGgpOwotCi0gICAgICAgIC8vIFRPRE86IEhvdyB3aWxsIHRoZSBKQVgtV1MgZGlzcGF0Y2hlciBnZXQgdGhlIGFwcHJvcHJpYXRlIHBvcnQgKGkuZS4gZW5kcG9pbnQpPyAgQ3VycmVudGx5IGFzc3VtZXMgWzBdCi0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb25KYXZhIHRlc3RFbmRwb2ludERlc2MgPSAoRW5kcG9pbnREZXNjcmlwdGlvbkphdmEpZW5kcG9pbnREZXNjWzBdOwotICAgICAgICAvLyBEZWZhdWx0IFNlcnZpY2VNb2RlIGlzIFBBWUxPQUQgcGVyIEpBWFdTIHAuIDgwCi0gICAgICAgIGFzc2VydEVxdWFscyhTZXJ2aWNlLk1vZGUuUEFZTE9BRCwgdGVzdEVuZHBvaW50RGVzYy5nZXRBbm5vU2VydmljZU1vZGVWYWx1ZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvaHR0cCIsCi0gICAgICAgICAgICAgICAgICAgICB0ZXN0RW5kcG9pbnREZXNjLmdldEFubm9CaW5kaW5nVHlwZVZhbHVlKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3ROb1NlcnZpY2VNb2RlUHJvdmlkZXIoKSB7Ci0gICAgICAgIC8vIFVzZSB0aGUgZGVzY3JpcHRpb24gZmFjdG9yeSBkaXJlY3RseTsgdGhpcyB3aWxsIGJlIGRvbmUgd2l0aGluIHRoZSBKQVgtV1MgcnVudGltZQotICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc2VydmljZURlc2MgPQotICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uRmFjdG9yeS5jcmVhdGVTZXJ2aWNlRGVzY3JpcHRpb24oTm9TZXJ2aWNlTW9kZVByb3ZpZGVyVGVzdEltcGwuY2xhc3MpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2VEZXNjKTsKLQotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uW10gZW5kcG9pbnREZXNjID0gc2VydmljZURlc2MuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbnMoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChlbmRwb2ludERlc2MpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgZW5kcG9pbnREZXNjLmxlbmd0aCk7Ci0KLSAgICAgICAgLy8gVE9ETzogSG93IHdpbGwgdGhlIEpBWC1XUyBkaXNwYXRjaGVyIGdldCB0aGUgYXBwcm9wcmlhdGUgcG9ydCAoaS5lLiBlbmRwb2ludCk/ICBDdXJyZW50bHkgYXNzdW1lcyBbMF0KLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbkphdmEgdGVzdEVuZHBvaW50RGVzYyA9IChFbmRwb2ludERlc2NyaXB0aW9uSmF2YSllbmRwb2ludERlc2NbMF07Ci0gICAgICAgIGFzc2VydEVxdWFscyhqYXZheC54bWwud3MuU2VydmljZS5Nb2RlLlBBWUxPQUQsIHRlc3RFbmRwb2ludERlc2MuZ2V0QW5ub1NlcnZpY2VNb2RlVmFsdWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhqYXZheC54bWwud3Muc29hcC5TT0FQQmluZGluZy5TT0FQMTFIVFRQX0JJTkRJTkcsCi0gICAgICAgICAgICAgICAgICAgICB0ZXN0RW5kcG9pbnREZXNjLmdldEFubm9CaW5kaW5nVHlwZVZhbHVlKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3ROb1dlYlNlcnZpY2VQcm92aWRlcigpIHsKLSAgICAgICAgLy8gVXNlIHRoZSBkZXNjcmlwdGlvbiBmYWN0b3J5IGRpcmVjdGx5OyB0aGlzIHdpbGwgYmUgZG9uZSB3aXRoaW4gdGhlIEpBWC1XUyBydW50aW1lCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBEZXNjcmlwdGlvbkZhY3RvcnkuY3JlYXRlU2VydmljZURlc2NyaXB0aW9uKE5vV2ViU2VydmljZVByb3ZpZGVyVGVzdEltcGwuY2xhc3MpOwotICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgV2ViU2VydmljZUV4Y2VwdGlvbiBub3QgY2F1Z2h0Iik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFdlYlNlcnZpY2VFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgZXhwZWN0ZWQgc3VjY2Vzc2Z1bCB0ZXN0IHBhdGgKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICBmYWlsKCJXcm9uZyBleGNlcHRpb24gY2F1Z2h0LiAgRXhwZWN0ZWQgV2ViU2VydmljZUV4Y2VwdGlvbiBidXQgY2F1Z2h0ICIgKyBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RCb3RoV2ViU2VydmljZUFubm90YXRpb25zKCkgewotICAgICAgICAvLyBVc2UgdGhlIGRlc2NyaXB0aW9uIGZhY3RvcnkgZGlyZWN0bHk7IHRoaXMgd2lsbCBiZSBkb25lIHdpdGhpbiB0aGUgSkFYLVdTIHJ1bnRpbWUKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIERlc2NyaXB0aW9uRmFjdG9yeS5jcmVhdGVTZXJ2aWNlRGVzY3JpcHRpb24oQm90aFdlYlNlcnZpY2VBbm5vdGF0aW9uVGVzdEltcGwuY2xhc3MpOwotICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgV2ViU2VydmljZUV4Y2VwdGlvbiBub3QgY2F1Z2h0Iik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFdlYlNlcnZpY2VFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgZXhwZWN0ZWQgc3VjY2Vzc2Z1bCB0ZXN0IHBhdGgKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIldyb25nIGV4Y2VwdGlvbiBjYXVnaHQuICBFeHBlY3RlZCBXZWJTZXJ2aWNlRXhjZXB0aW9uIGJ1dCBjYXVnaHQgIiArIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNlcnZpY2VNb2RlT25Ob25Qcm92aWRlcigpIHsKLSAgICAgICAgLy8gVXNlIHRoZSBkZXNjcmlwdGlvbiBmYWN0b3J5IGRpcmVjdGx5OyB0aGlzIHdpbGwgYmUgZG9uZSB3aXRoaW4gdGhlIEpBWC1XUyBydW50aW1lCi0gICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzZXJ2aWNlRGVzYyA9Ci0gICAgICAgICAgICAgICAgRGVzY3JpcHRpb25GYWN0b3J5LmNyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbihXZWJTZXJ2aWNlU0VJVGVzdEltcGwuY2xhc3MpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2VEZXNjKTsKLQotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uW10gZW5kcG9pbnREZXNjID0gc2VydmljZURlc2MuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbnMoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChlbmRwb2ludERlc2MpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgZW5kcG9pbnREZXNjLmxlbmd0aCk7Ci0KLSAgICAgICAgLy8gVE9ETzogSG93IHdpbGwgdGhlIEpBWC1XUyBkaXNwYXRjaGVyIGdldCB0aGUgYXBwcm9wcmlhdGUgcG9ydCAoaS5lLiBlbmRwb2ludCk/ICBDdXJyZW50bHkgYXNzdW1lcyBbMF0KLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbkphdmEgdGVzdEVuZHBvaW50RGVzYyA9IChFbmRwb2ludERlc2NyaXB0aW9uSmF2YSllbmRwb2ludERlc2NbMF07Ci0gICAgICAgIGFzc2VydE51bGwodGVzdEVuZHBvaW50RGVzYy5nZXRBbm5vU2VydmljZU1vZGVWYWx1ZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGphdmF4LnhtbC53cy5zb2FwLlNPQVBCaW5kaW5nLlNPQVAxMUhUVFBfQklORElORywKLSAgICAgICAgICAgICAgICAgICAgIHRlc3RFbmRwb2ludERlc2MuZ2V0QW5ub0JpbmRpbmdUeXBlVmFsdWUoKSk7Ci0gICAgfQotfQotCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vL0Jhc2ljIFByb3ZpZGVyIHNlcnZpY2UgaW1wbGVtZW50YXRpb24gY2xhc3MKLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotQFNlcnZpY2VNb2RlKHZhbHVlID0gU2VydmljZS5Nb2RlLk1FU1NBR0UpCi1AV2ViU2VydmljZVByb3ZpZGVyKCkKLUBCaW5kaW5nVHlwZSh2YWx1ZSA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAvYmluZGluZ3MvSFRUUC8iKQotY2xhc3MgQmFzaWNQcm92aWRlclRlc3RJbXBsIGltcGxlbWVudHMgUHJvdmlkZXI8U09BUE1lc3NhZ2U+IHsKLSBwdWJsaWMgQmFzaWNQcm92aWRlclRlc3RJbXBsKCkgewotIH0KLQotIHB1YmxpYyBTT0FQTWVzc2FnZSBpbnZva2UoU09BUE1lc3NhZ2Ugb2JqKSB7Ci0gICAgIHJldHVybiBudWxsOwotIH0KLX0KLQotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy9CYXNpYyBQcm92aWRlciBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIGNsYXNzIHVzaW5nIFNPQVAvSk1TCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUBTZXJ2aWNlTW9kZSh2YWx1ZSA9IFNlcnZpY2UuTW9kZS5NRVNTQUdFKQotQFdlYlNlcnZpY2VQcm92aWRlcigpCi1AQmluZGluZ1R5cGUoTURRQ29uc3RhbnRzLlNPQVAxMkpNU19CSU5ESU5HKQotY2xhc3MgQmFzaWNQcm92aWRlckpNU1Rlc3RJbXBsIGltcGxlbWVudHMgUHJvdmlkZXI8U09BUE1lc3NhZ2U+IHsKLSBwdWJsaWMgQmFzaWNQcm92aWRlckpNU1Rlc3RJbXBsKCkgewotIH0KLQotIHB1YmxpYyBTT0FQTWVzc2FnZSBpbnZva2UoU09BUE1lc3NhZ2Ugb2JqKSB7Ci0gICAgIHJldHVybiBudWxsOwotIH0KLX0KLQotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy9XZWJTZXJ2aWNlUHJvdmlkZXIgc2VydmljZSBpbXBsZW1lbnRhdGlvbiBjbGFzcwotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1AU2VydmljZU1vZGUodmFsdWUgPSBTZXJ2aWNlLk1vZGUuUEFZTE9BRCkKLUBXZWJTZXJ2aWNlUHJvdmlkZXIoc2VydmljZU5hbWUgPSAiUHJvdmlkZXJTZXJ2aWNlIiwgcG9ydE5hbWUgPSAiUHJvdmlkZXJTZXJ2aWNlUG9ydCIsCi0gICAgICAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vbmFtZXNwYWNlLnRlc3QiLCB3c2RsTG9jYXRpb24gPSAiaHR0cDovL3dzZGwudGVzdCIpCi1AQmluZGluZ1R5cGUodmFsdWUgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwL2JpbmRpbmdzL0hUVFAvIikKLWNsYXNzIFdlYlNlcnZpY2VQcm92aWRlclRlc3RJbXBsIGltcGxlbWVudHMgUHJvdmlkZXI8U3RyaW5nPiB7Ci0gcHVibGljIFdlYlNlcnZpY2VQcm92aWRlclRlc3RJbXBsKCkgewotIH0KLQotIHB1YmxpYyBTdHJpbmcgaW52b2tlKFN0cmluZyBvYmopIHsKLSAgICAgcmV0dXJuIG51bGw7Ci0gfQotfQotCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vL1dlYlNlcnZpY2VQcm92aWRlciBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIGNsYXNzCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUBTZXJ2aWNlTW9kZSh2YWx1ZSA9IFNlcnZpY2UuTW9kZS5QQVlMT0FEKQotQFdlYlNlcnZpY2VQcm92aWRlcihzZXJ2aWNlTmFtZSA9ICJQcm92aWRlclNlcnZpY2UiLCBwb3J0TmFtZSA9ICJQcm92aWRlclNlcnZpY2VQb3J0IiwKLSAgICAgICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9uYW1lc3BhY2UudGVzdCIsIHdzZGxMb2NhdGlvbiA9ICJodHRwOi8vd3NkbC50ZXN0IikKLUBCaW5kaW5nVHlwZShNRFFDb25zdGFudHMuU09BUDEySk1TX0JJTkRJTkcpCi1jbGFzcyBXZWJTZXJ2aWNlUHJvdmlkZXJKTVNUZXN0SW1wbCBpbXBsZW1lbnRzIFByb3ZpZGVyPFN0cmluZz4gewotIHB1YmxpYyBXZWJTZXJ2aWNlUHJvdmlkZXJKTVNUZXN0SW1wbCgpIHsKLSB9Ci0KLSBwdWJsaWMgU3RyaW5nIGludm9rZShTdHJpbmcgb2JqKSB7Ci0gICAgIHJldHVybiBudWxsOwotIH0KLX0KLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIERlZmF1bHQgU2VydmljZU1vZGUgYW5kIEJpbmRpbmdUeXBlIFByb3ZpZGVyIHNlcnZpY2UgaW1wbGVtZW50YXRpb24gY2xhc3MKLS8vIERlZmF1bHQgaXMgUEFZTE9BRCBwZXIgSkFYV1MgcC4gODAKLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUBTZXJ2aWNlTW9kZSgpCi1AV2ViU2VydmljZVByb3ZpZGVyKCkKLUBCaW5kaW5nVHlwZSgpCi1jbGFzcyBEZWZhdWx0U2VydmljZU1vZGVQcm92aWRlclRlc3RJbXBsIGltcGxlbWVudHMgUHJvdmlkZXI8U3RyaW5nPiB7Ci0gICAgcHVibGljIERlZmF1bHRTZXJ2aWNlTW9kZVByb3ZpZGVyVGVzdEltcGwoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBpbnZva2UoU3RyaW5nIG9iaikgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci19Ci0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBObyBTZXJ2aWNlTW9kZSBhbmQgbm8gQmluZGluZ1R5cGUgUHJvdmlkZXIgc2VydmljZSBpbXBsZW1lbnRhdGlvbiBjbGFzcwotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotQFdlYlNlcnZpY2VQcm92aWRlcigpCi1jbGFzcyBOb1NlcnZpY2VNb2RlUHJvdmlkZXJUZXN0SW1wbCBpbXBsZW1lbnRzIFByb3ZpZGVyPFNvdXJjZT4gewotICAgIHB1YmxpYyBOb1NlcnZpY2VNb2RlUHJvdmlkZXJUZXN0SW1wbCgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU291cmNlIGludm9rZShTb3VyY2Ugb2JqKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLX0KLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIE5PIFdlYlNlcnZpY2VQcm92aWRlciBQcm92aWRlciBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIGNsYXNzCi0vLyBUaGlzIGlzIGFuIElOVkFMSUQgc2VydmljZSBpbXBsZW1lbnRhdGlvbgotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotQFNlcnZpY2VNb2RlKHZhbHVlID0gU2VydmljZS5Nb2RlLk1FU1NBR0UpCi1AQmluZGluZ1R5cGUodmFsdWUgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwL2JpbmRpbmdzL0hUVFAvIikKLWNsYXNzIE5vV2ViU2VydmljZVByb3ZpZGVyVGVzdEltcGwgaW1wbGVtZW50cyBQcm92aWRlcjxTT0FQTWVzc2FnZT4gewotICAgIHB1YmxpYyBOb1dlYlNlcnZpY2VQcm92aWRlclRlc3RJbXBsKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBTT0FQTWVzc2FnZSBpbnZva2UoU09BUE1lc3NhZ2Ugb2JqKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLX0KLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIEJPVEggV2ViU2VydmljZSBhbmQgV2ViU2VydmljZVByb3ZpZGVyIFByb3ZpZGVyIHNlcnZpY2UgaW1wbGVtZW50YXRpb24gY2xhc3MKLS8vIFRoaXMgaXMgYW4gSU5WQUxJRCBzZXJ2aWNlIGltcGxlbWVudGF0aW9uCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUBTZXJ2aWNlTW9kZSh2YWx1ZSA9IFNlcnZpY2UuTW9kZS5NRVNTQUdFKQotQFdlYlNlcnZpY2UoKQotQFdlYlNlcnZpY2VQcm92aWRlcigpCi1AQmluZGluZ1R5cGUodmFsdWUgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwL2JpbmRpbmdzL0hUVFAvIikKLWNsYXNzIEJvdGhXZWJTZXJ2aWNlQW5ub3RhdGlvblRlc3RJbXBsIGltcGxlbWVudHMgUHJvdmlkZXI8U09BUE1lc3NhZ2U+IHsKLSAgICBwdWJsaWMgQm90aFdlYlNlcnZpY2VBbm5vdGF0aW9uVGVzdEltcGwoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIFNPQVBNZXNzYWdlIGludm9rZShTT0FQTWVzc2FnZSBvYmopIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotfQotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gV2ViU2VydmljZSBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIGNsYXNzOyBub3QgCi0vLyBQcm92aWRlci1iYXNlZAotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotQFdlYlNlcnZpY2UoKQotY2xhc3MgV2ViU2VydmljZVNFSVRlc3RJbXBsIHsKLSAgICBwdWJsaWMgU3RyaW5nIGVjaG8oU3RyaW5nIHMpIHsKLSAgICAgICAgcmV0dXJuICJGcm9tIFdlYlNlcnZpY2VTRUlUZXN0SW1wbCAiICsgInMiOwotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL0Fubm90YXRpb25TZXJ2aWNlSW1wbERlc2NyaXB0aW9uVGVzdHMuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9Bbm5vdGF0aW9uU2VydmljZUltcGxEZXNjcmlwdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3OGNjZDAuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL0Fubm90YXRpb25TZXJ2aWNlSW1wbERlc2NyaXB0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NjQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmVjaG8uRWNob1NlcnZpY2VJbXBsV2l0aFNFSTsKLWltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLkJhc2ljQ29uZmlndXJhdG9yOwotCi1pbXBvcnQgamF2YXguandzLk9uZXdheTsKLWltcG9ydCBqYXZheC5qd3MuV2ViTWV0aG9kOwotaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbTsKLWltcG9ydCBqYXZheC5qd3MuV2ViUmVzdWx0OwotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOwotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nOwotaW1wb3J0IGphdmF4LnhtbC53cy5Ib2xkZXI7Ci1pbXBvcnQgamF2YXgueG1sLndzLlJlcXVlc3RXcmFwcGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5SZXNwb25zZVdyYXBwZXI7Ci0KLS8qKgotICogVGVzdHMgdGhlIGNyZWF0aW9uIG9mIHRoZSBEZXNjcmlwdGlvbiBjbGFzc2VzIGJhc2VkIG9uIGEgc2VydmljZSBpbXBsZW1lbnRhdGlvbiBiZWFuIGFuZCB2YXJpb3VzCi0gKiBjb21iaW5hdGlvbnMgb2YgYW5ub3RhdGlvbnMKLSAqLwotcHVibGljIGNsYXNzIEFubm90YXRpb25TZXJ2aWNlSW1wbERlc2NyaXB0aW9uVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgc3RhdGljIHsKLSAgICAgICAgLy8gTm90ZSB5b3Ugd2lsbCBwcm9iYWJseSBuZWVkIHRvIGluY3JlYXNlIHRoZSBqYXZhIGhlYXAgc2l6ZSwgZm9yIGV4YW1wbGUKLSAgICAgICAgLy8gLVhteDUxMm0uICBUaGlzIGNhbiBiZSBkb25lIGJ5IHNldHRpbmcgbWF2ZW4uanVuaXQuanZtYXJncyBpbiBwcm9qZWN0LnByb3BlcnRpZXMuCi0gICAgICAgIC8vIFRvIGNoYW5nZSB0aGUgc2V0dGluZ3MsIGVkaXQgdGhlIGxvZzRqLnByb3BlcnR5IGZpbGUKLSAgICAgICAgLy8gaW4gdGhlIHRlc3QtcmVzb3VyY2VzIGRpcmVjdG9yeS4KLSAgICAgICAgQmFzaWNDb25maWd1cmF0b3IuY29uZmlndXJlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIHRoZSBkZXNjcmlwdGlvbiBjbGFzc2VzIHdpdGggYSBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIHRoYXQgY29udGFpbnMgdGhlIEBXZWJTZXJ2aWNlCi0gICAgICogSlNSLTE4MSBhbm5vdGF0aW9uIHdoaWNoIHJlZmVyZW5jZXMgYW4gU0VJLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJ2aWNlSW1wbFdpdGhTRUkoKSB7Ci0gICAgICAgIC8vIFVzZSB0aGUgZGVzY3JpcHRpb24gZmFjdG9yeSBkaXJlY3RseTsgdGhpcyB3aWxsIGJlIGRvbmUgd2l0aGluIHRoZSBKQVgtV1MgcnVudGltZQotICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc2VydmljZURlc2MgPQotICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uRmFjdG9yeS5jcmVhdGVTZXJ2aWNlRGVzY3JpcHRpb24oRWNob1NlcnZpY2VJbXBsV2l0aFNFSS5jbGFzcyk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZURlc2MpOwotCi0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb25bXSBlbmRwb2ludERlc2MgPSBzZXJ2aWNlRGVzYy5nZXRFbmRwb2ludERlc2NyaXB0aW9ucygpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGVuZHBvaW50RGVzYyk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhlbmRwb2ludERlc2MubGVuZ3RoLCAxKTsKLQotICAgICAgICBhc3NlcnROb3ROdWxsKGVuZHBvaW50RGVzY1swXS5nZXRBeGlzU2VydmljZSgpKTsKLQotICAgICAgICAvLyBUT0RPOiBIb3cgd2lsbCB0aGUgSkFYLVdTIGRpc3BhdGNoZXIgZ2V0IHRoZSBhcHByb3ByaWF0ZSBwb3J0IChpLmUuIGVuZHBvaW50KT8gIEN1cnJlbnRseSBhc3N1bWVzIFswXQotICAgICAgICBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uIGVuZHBvaW50SW50ZkRlc2MgPQotICAgICAgICAgICAgICAgIGVuZHBvaW50RGVzY1swXS5nZXRFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZW5kcG9pbnRJbnRmRGVzYyk7Ci0KLSAgICAgICAgT3BlcmF0aW9uRGVzY3JpcHRpb25bXSBvcGVyYXRpb25zID0KLSAgICAgICAgICAgICAgICBlbmRwb2ludEludGZEZXNjLmdldE9wZXJhdGlvbkZvckphdmFNZXRob2QoImJhZE1ldGhvZE5hbWUiKTsKLSAgICAgICAgYXNzZXJ0TnVsbChvcGVyYXRpb25zKTsKLSAgICAgICAgb3BlcmF0aW9ucyA9IGVuZHBvaW50SW50ZkRlc2MuZ2V0T3BlcmF0aW9uRm9ySmF2YU1ldGhvZCgiIik7Ci0gICAgICAgIGFzc2VydE51bGwob3BlcmF0aW9ucyk7Ci0gICAgICAgIG9wZXJhdGlvbnMgPSBlbmRwb2ludEludGZEZXNjLmdldE9wZXJhdGlvbkZvckphdmFNZXRob2QoKFN0cmluZyludWxsKTsKLSAgICAgICAgYXNzZXJ0TnVsbChvcGVyYXRpb25zKTsKLSAgICAgICAgb3BlcmF0aW9ucyA9IGVuZHBvaW50SW50ZkRlc2MuZ2V0T3BlcmF0aW9uRm9ySmF2YU1ldGhvZCgiZWNobyIpOwotICAgICAgICBhc3NlcnROb3ROdWxsKG9wZXJhdGlvbnMpOwotICAgICAgICBhc3NlcnRFcXVhbHMob3BlcmF0aW9ucy5sZW5ndGgsIDEpOwotICAgICAgICBhc3NlcnRFcXVhbHMob3BlcmF0aW9uc1swXS5nZXRKYXZhTWV0aG9kTmFtZSgpLCAiZWNobyIpOwotCi0gICAgICAgIFN0cmluZ1tdIHBhcmFtVHlwZXMgPSBvcGVyYXRpb25zWzBdLmdldEphdmFQYXJhbWV0ZXJzKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocGFyYW1UeXBlcyk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhwYXJhbVR5cGVzLmxlbmd0aCwgMSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiamF2YXgueG1sLndzLkhvbGRlcjxqYXZhLmxhbmcuU3RyaW5nPiIsIHBhcmFtVHlwZXNbMF0pOwotCi0gICAgICAgIC8vIFRlc3QgUmVxdWVzdFdyYXBwZXIgYW5ub3RhdGlvbnMKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG9wZXJhdGlvbnNbMF0uZ2V0UmVxdWVzdFdyYXBwZXJMb2NhbE5hbWUoKSwgIkVjaG8iKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG9wZXJhdGlvbnNbMF0uZ2V0UmVxdWVzdFdyYXBwZXJUYXJnZXROYW1lc3BhY2UoKSwKLSAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi90ZXN0cyIpOwotICAgICAgICBhc3NlcnRFcXVhbHMob3BlcmF0aW9uc1swXS5nZXRSZXF1ZXN0V3JhcHBlckNsYXNzTmFtZSgpLCAib3JnLmFwYWNoZS53cy5heGlzMi50ZXN0cy5FY2hvIik7Ci0KLSAgICAgICAgLy8gVGVzdCBSZXNwb25zZVdyYXBwZXIgYW5ub3RhdGlvbnMKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG9wZXJhdGlvbnNbMF0uZ2V0UmVzcG9uc2VXcmFwcGVyTG9jYWxOYW1lKCksICJFY2hvUmVzcG9uc2UiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG9wZXJhdGlvbnNbMF0uZ2V0UmVzcG9uc2VXcmFwcGVyVGFyZ2V0TmFtZXNwYWNlKCksCi0gICAgICAgICAgICAgICAgICAgICAiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvdGVzdHMiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG9wZXJhdGlvbnNbMF0uZ2V0UmVzcG9uc2VXcmFwcGVyQ2xhc3NOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS53cy5heGlzMi50ZXN0cy5FY2hvUmVzcG9uc2UiKTsKLQotICAgICAgICAvLyBUZXN0IFNPQVBCaW5kaW5nIGRlZmF1bHQ7IHRoYXQgYW5ub3RhdGlvbiBpcyBub3QgcHJlc2VudCBpbiB0aGUgU0VJCi0gICAgICAgIC8vIE5vdGUgdGhhdCBhbm5vdGF0aW9uIGNvdWxkIG9jY3VyIG9uIHRoZSBvcGVyYXRpb24gb3IgdGhlIHR5cGUKLSAgICAgICAgLy8gKGFsdGhvdWdoIG9uIHRoaXMgU0VJIGl0IGRvZXNuJ3Qgb2NjdXIgZWl0aGVyIHBsYWNlKS4KLSAgICAgICAgYXNzZXJ0RXF1YWxzKFNPQVBCaW5kaW5nLlN0eWxlLkRPQ1VNRU5ULCBvcGVyYXRpb25zWzBdLmdldFNvYXBCaW5kaW5nU3R5bGUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhTT0FQQmluZGluZy5TdHlsZS5ET0NVTUVOVCwgZW5kcG9pbnRJbnRmRGVzYy5nZXRTb2FwQmluZGluZ1N0eWxlKCkpOwotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE92ZXJsb2FkZWRTZXJ2aWNlSW1wbFdpdGhTRUkoKSB7Ci0gICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzZXJ2aWNlRGVzYyA9Ci0gICAgICAgICAgICAgICAgRGVzY3JpcHRpb25GYWN0b3J5LmNyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbihEb2NMaXRXcmFwcGVkSW1wbFdpdGhTRUkuY2xhc3MpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2VEZXNjKTsKLQotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uW10gZW5kcG9pbnREZXNjID0gc2VydmljZURlc2MuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbnMoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChlbmRwb2ludERlc2MpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZW5kcG9pbnREZXNjLmxlbmd0aCwgMSk7Ci0gICAgICAgIC8vIFRPRE86IFVzaW5nIGhhcmRjb2RlZCBlbmRwb2ludERlc2NbMF0gZnJvbSBTZXJ2aWNlRGVzYwotICAgICAgICBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uIGVuZHBvaW50SW50ZkRlc2MgPQotICAgICAgICAgICAgICAgIGVuZHBvaW50RGVzY1swXS5nZXRFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZW5kcG9pbnRJbnRmRGVzYyk7Ci0KLSAgICAgICAgLy8gVGVzdCBmb3Igb3ZlcmxvYWRlZCBtZXRob2RzCi0gICAgICAgIC8vIFNFSSBkZWZpbmVzIHR3byBKYXZhIG1ldGhvZHMgd2l0aCB0aGlzIG5hbWUKLSAgICAgICAgT3BlcmF0aW9uRGVzY3JpcHRpb25bXSBvcGVyYXRpb25zID0KLSAgICAgICAgICAgICAgICBlbmRwb2ludEludGZEZXNjLmdldE9wZXJhdGlvbkZvckphdmFNZXRob2QoImludm9rZUFzeW5jIik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwob3BlcmF0aW9ucyk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhvcGVyYXRpb25zLmxlbmd0aCwgMik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhvcGVyYXRpb25zWzBdLmdldEphdmFNZXRob2ROYW1lKCksICJpbnZva2VBc3luYyIpOwotICAgICAgICBhc3NlcnRFcXVhbHMob3BlcmF0aW9uc1sxXS5nZXRKYXZhTWV0aG9kTmFtZSgpLCAiaW52b2tlQXN5bmMiKTsKLQotICAgICAgICAvLyBDaGVjayB0aGUgSmF2YSBwYXJhbWV0ZXJzLCBXZWJQYXJhbSBuYW1lcywgYW5kIFdlYlJlc3VsdCAoYWN0dWFsbHkgbGFjayB0aGVyZW9mKSBmb3IgZWFjaCBvZiB0aGVzZSBvcGVyYXRpb25zCi0KLSAgICAgICAgLy8gTm90ZSByZWdhcmRpbmcgV2ViUGFyYW0gbmFtZXM6Ci0gICAgICAgIC8vSW4gdGhlIGNsaWVudCBBc3luYyBDYWxsIHRoZSB0aGUgV2ViUGFyYW0gbmFtZSB3aWxsIG5vdCByZW1vdmUgSkFYLVdTIEFzeW5jSGFuZGxlci4KLSAgICAgICAgLy9Qcm94eSBpbnZva2luZyB0aGUgdGhlIEFzeW5jIENhbGwgd2lsbCBjaGVjayB0aGUgaW5wdXQgbWV0aG9kIG9iamVjdCBhbmQgaWYKLSAgICAgICAgLy9pdHMgb2YgdHlwZSBKQVgtV1MgQXN5bmNIYW5kbGVyIHRoZW4gdGhhdCBXZWJQYXJhbSB3aWxsIGJlIHNraXBwZWQuCi0gICAgICAgIC8vVGhpcyBpcyBkb25lIGJlY2F1c2UgQXN5bmNIYW5kbGVyIGlzIE5PVCBwYXJ0IG9mIHRoZSBjb250cmFjdCwgYW5kIHRodXMgaXQgaXMgTk9UIHBhcnQgb2YKLSAgICAgICAgLy8gdGhlIEpBWEIgb2JqZWN0IGNvbnN0cnVjdGVkIGZvciB0aGUgbWV0aG9kIGludm9jYXRpb24uICBUaGUgQXN5bmNIYW5kbGVyIGlzIHBhcnQgb2YgdGhlIAotICAgICAgICAvLyBKQVgtV1MgcHJvZ3JhbW1pbmcgbW9kZWwgdG8gc3VwcG9ydCBhbiBhc3luY2hyb25vdXMgY2FsbGJhY2sgdG8gcmVjZWl2ZSB0aGUgcmVzcG9uc2UuCi0KLSAgICAgICAgLy8gTm90ZSByZWdhcmRpbmcgV2ViUmVzdWx0IGFubm90YXRpb246Ci0gICAgICAgIC8vIFRoZSBhc3luYyBtZXRob2RzIG9uIHRoaXMgU0VJIGRvIG5vdCBjYXJyeSBhIFdlYlJlc3VsdCBhbm5vdGF0aW9ucy4KLSAgICAgICAgYm9vbGVhbiB0d29BcmdTaWduYXR1cmVDaGVja2VkID0gZmFsc2U7Ci0gICAgICAgIGJvb2xlYW4gb25lQXJnU2lnbmF0dXJlQ2hlY2tlZCA9IGZhbHNlOwotICAgICAgICBmb3IgKE9wZXJhdGlvbkRlc2NyaXB0aW9uIG9wZXJhdGlvbiA6IG9wZXJhdGlvbnMpIHsKLSAgICAgICAgICAgIFN0cmluZ1tdIGNoZWNrUGFyYW1zID0gb3BlcmF0aW9uLmdldEphdmFQYXJhbWV0ZXJzKCk7Ci0gICAgICAgICAgICBTdHJpbmdbXSB3ZWJQYXJhbU5hbWVzID0gb3BlcmF0aW9uLmdldFBhcmFtTmFtZXMoKTsKLSAgICAgICAgICAgIGlmIChjaGVja1BhcmFtcy5sZW5ndGggPT0gMSkgewotICAgICAgICAgICAgICAgIC8vIENoZWNrIHRoZSBvbmUgYXJndWVtZW50IHNpZ25hdHVyZQotICAgICAgICAgICAgICAgIGlmIChvbmVBcmdTaWduYXR1cmVDaGVja2VkKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZhaWwoIk9uZSBBcmcgc2lnbmF0dXJlIG9jY3VyZWQgbW9yZSB0aGFuIG9uY2UiKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBvbmVBcmdTaWduYXR1cmVDaGVja2VkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgdGhlIEphdmEgcGFyYW1ldGVyCi0gICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhjaGVja1BhcmFtc1swXSwgImphdmEubGFuZy5TdHJpbmciKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgdGhlIFdlYlBhcmFtIE5hbWVzIChzZWUgbm90ZSBhYm92ZSkgCi0gICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCB3ZWJQYXJhbU5hbWVzLmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygiaW52b2tlX3N0ciIsIHdlYlBhcmFtTmFtZXNbMF0pOwotICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayB0aGUgbGFjayBvZiBhIFdlYlJlc3VsdCBhbm5vdGF0aW9uIGFuZCB0aGUgZGVmYXVsdCB2YWx1ZXMgZm9yCi0gICAgICAgICAgICAgICAgICAgIC8vIFNPQVBCaW5kaW5nIFN0eWxlPURPQ1VNRU5ULCBVc2U9TElURVJBTCwgUGFyYW1TdHlsZT1XUkFQUEVECi0gICAgICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB0aGUgU09BUEJpbmRpbmcgYW5ub3RhdGlvbiBpcyBhbHNvIG5vdCBwcmVzZW50IGFuZCB0aHVzIGZ1bGx5IGRlZmF1bHRlZC4KLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0TnVsbCgoKE9wZXJhdGlvbkRlc2NyaXB0aW9uSmF2YSlvcGVyYXRpb24pLmdldEFubm9XZWJSZXN1bHQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygicmV0dXJuIiwgb3BlcmF0aW9uLmdldFJlc3VsdE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygicmV0dXJuIiwgb3BlcmF0aW9uLmdldFJlc3VsdFBhcnROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIG9wZXJhdGlvbi5nZXRSZXN1bHRUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydEZhbHNlKG9wZXJhdGlvbi5pc1Jlc3VsdEhlYWRlcigpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGNoZWNrUGFyYW1zLmxlbmd0aCA9PSAyKSB7Ci0gICAgICAgICAgICAgICAgLy8gQ2hlY2sgdGhlIHR3byBhcmd1ZW1lbnQgc2lnbmF0dXJlCi0gICAgICAgICAgICAgICAgaWYgKHR3b0FyZ1NpZ25hdHVyZUNoZWNrZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgZmFpbCgiVHdvIEFyZyBzaWduYXR1cmUgb2NjdXJlZCBtb3JlIHRoYW4gb25jZSIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHR3b0FyZ1NpZ25hdHVyZUNoZWNrZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayB0aGUgSmF2YSBwYXJhbWV0ZXIKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGNoZWNrUGFyYW1zWzBdLCAiamF2YS5sYW5nLlN0cmluZyIpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoY2hlY2tQYXJhbXNbMV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiamF2YXgueG1sLndzLkFzeW5jSGFuZGxlcjxvcmcudGVzdC5wcm94eS5kb2NsaXR3cmFwcGVkLlJldHVyblR5cGU+Iik7Ci0gICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIHRoZSBXZWJQYXJhbSBOYW1lcyAoc2VlIG5vdGUgYWJvdmUpIAotICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMiwgd2ViUGFyYW1OYW1lcy5sZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImludm9rZV9zdHIiLCB3ZWJQYXJhbU5hbWVzWzBdKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgdGhlIGxhY2sgb2YgYSBXZWJSZXN1bHQgYW5ub3RhdGlvbiBhbmQgdGhlIGRlZmF1bHQgdmFsdWVzIGZvcgotICAgICAgICAgICAgICAgICAgICAvLyBTT0FQQmluZGluZyBTdHlsZT1ET0NVTUVOVCwgVXNlPUxJVEVSQUwsIFBhcmFtU3R5bGU9V1JBUFBFRAotICAgICAgICAgICAgICAgICAgICAvLyBOb3RlIHRoYXQgdGhlIFNPQVBCaW5kaW5nIGFubm90YXRpb24gaXMgYWxzbyBub3QgcHJlc2VudCBhbmQgdGh1cyBmdWxseSBkZWZhdWx0ZWQuCi0gICAgICAgICAgICAgICAgICAgIGFzc2VydE51bGwoKChPcGVyYXRpb25EZXNjcmlwdGlvbkphdmEpb3BlcmF0aW9uKS5nZXRBbm5vV2ViUmVzdWx0KCkpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoInJldHVybiIsIG9wZXJhdGlvbi5nZXRSZXN1bHROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoInJldHVybiIsIG9wZXJhdGlvbi5nZXRSZXN1bHRQYXJ0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBvcGVyYXRpb24uZ2V0UmVzdWx0VGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnRGYWxzZShvcGVyYXRpb24uaXNSZXN1bHRIZWFkZXIoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmYWlsKCJXcm9uZyBudW1iZXIgb2YgcGFyYW1ldGVycyByZXR1cm5lZCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVGVzdCBmb3IgYSBtZXRob2Qgd2l0aCBwYXJhbWV0ZXJzIG9mIHByaW1pdGl2ZSB0eXBlcy4gIE5vdGUKLSAgICAgICAgLy8gdGhpcyBtZXRob2QgSVMgb3ZlcmxvYWRlZAotICAgICAgICBvcGVyYXRpb25zID0gZW5kcG9pbnRJbnRmRGVzYy5nZXRPcGVyYXRpb25Gb3JKYXZhTWV0aG9kKCJ0d29XYXlIb2xkZXJBc3luYyIpOwotICAgICAgICBhc3NlcnROb3ROdWxsKG9wZXJhdGlvbnMpOwotICAgICAgICBhc3NlcnRFcXVhbHMob3BlcmF0aW9ucy5sZW5ndGgsIDIpOwotICAgICAgICBhc3NlcnRFcXVhbHMob3BlcmF0aW9uc1swXS5nZXRKYXZhTWV0aG9kTmFtZSgpLCAidHdvV2F5SG9sZGVyQXN5bmMiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG9wZXJhdGlvbnNbMV0uZ2V0SmF2YU1ldGhvZE5hbWUoKSwgInR3b1dheUhvbGRlckFzeW5jIik7Ci0KLSAgICAgICAgLy8gQ2hlY2sgdGhlIHBhcmFtZXRlcnMgZm9yIGVhY2ggb3BlcmF0aW9uCi0gICAgICAgIHR3b0FyZ1NpZ25hdHVyZUNoZWNrZWQgPSBmYWxzZTsKLSAgICAgICAgYm9vbGVhbiB0aHJlZUFyZ1NpZ25hdHVyZUNoZWNrZWQgPSBmYWxzZTsKLSAgICAgICAgZm9yIChPcGVyYXRpb25EZXNjcmlwdGlvbiBvcGVyYXRpb24gOiBvcGVyYXRpb25zKSB7Ci0gICAgICAgICAgICBTdHJpbmdbXSBjaGVja1BhcmFtcyA9IG9wZXJhdGlvbi5nZXRKYXZhUGFyYW1ldGVycygpOwotICAgICAgICAgICAgU3RyaW5nW10gd2ViUGFyYW1OYW1lcyA9IG9wZXJhdGlvbi5nZXRQYXJhbU5hbWVzKCk7Ci0gICAgICAgICAgICBpZiAoY2hlY2tQYXJhbXMubGVuZ3RoID09IDMpIHsKLSAgICAgICAgICAgICAgICAvLyBDaGVjayB0aGUgb25lIGFyZ3VlbWVudCBzaWduYXR1cmUKLSAgICAgICAgICAgICAgICBpZiAodGhyZWVBcmdTaWduYXR1cmVDaGVja2VkKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZhaWwoIlRocmVlIEFyZyBzaWduYXR1cmUgb2NjdXJlZCBtb3JlIHRoYW4gb25jZSIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocmVlQXJnU2lnbmF0dXJlQ2hlY2tlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhjaGVja1BhcmFtc1swXSwgImphdmEubGFuZy5TdHJpbmciKTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGNoZWNrUGFyYW1zWzFdLCAiaW50Iik7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhjaGVja1BhcmFtc1syXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJqYXZheC54bWwud3MuQXN5bmNIYW5kbGVyPG9yZy50ZXN0LnByb3h5LmRvY2xpdHdyYXBwZWQuVHdvV2F5SG9sZGVyPiIpOwotICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayB0aGUgV2ViUGFyYW0gTmFtZXMgKHNlZSBub3RlIGFib3ZlKSAKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIHdlYlBhcmFtTmFtZXMubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0d29XYXlIb2xkZXJfc3RyIiwgd2ViUGFyYW1OYW1lc1swXSk7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygidHdvV2F5SG9sZGVyX2ludCIsIHdlYlBhcmFtTmFtZXNbMV0pOwotICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayB0aGUgbGFjayBvZiBhIFdlYlJlc3VsdCBhbm5vdGF0aW9uIGFuZCB0aGUgZGVmYXVsdCB2YWx1ZXMgZm9yCi0gICAgICAgICAgICAgICAgICAgIC8vIFNPQVBCaW5kaW5nIFN0eWxlPURPQ1VNRU5ULCBVc2U9TElURVJBTCwgUGFyYW1TdHlsZT1XUkFQUEVECi0gICAgICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB0aGUgU09BUEJpbmRpbmcgYW5ub3RhdGlvbiBpcyBhbHNvIG5vdCBwcmVzZW50IGFuZCB0aHVzIGZ1bGx5IGRlZmF1bHRlZC4KLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0TnVsbCgoKE9wZXJhdGlvbkRlc2NyaXB0aW9uSmF2YSlvcGVyYXRpb24pLmdldEFubm9XZWJSZXN1bHQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygicmV0dXJuIiwgb3BlcmF0aW9uLmdldFJlc3VsdE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygicmV0dXJuIiwgb3BlcmF0aW9uLmdldFJlc3VsdFBhcnROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIG9wZXJhdGlvbi5nZXRSZXN1bHRUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydEZhbHNlKG9wZXJhdGlvbi5pc1Jlc3VsdEhlYWRlcigpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGNoZWNrUGFyYW1zLmxlbmd0aCA9PSAyKSB7Ci0gICAgICAgICAgICAgICAgLy8gQ2hlY2sgdGhlIHR3byBhcmd1ZW1lbnQgc2lnbmF0dXJlCi0gICAgICAgICAgICAgICAgaWYgKHR3b0FyZ1NpZ25hdHVyZUNoZWNrZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgZmFpbCgiVHdvIEFyZyBzaWduYXR1cmUgb2NjdXJlZCBtb3JlIHRoYW4gb25jZSIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHR3b0FyZ1NpZ25hdHVyZUNoZWNrZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoY2hlY2tQYXJhbXNbMF0sICJqYXZhLmxhbmcuU3RyaW5nIik7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhjaGVja1BhcmFtc1sxXSwgImludCIpOwotICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayB0aGUgV2ViUGFyYW0gTmFtZXMgKHNlZSBub3RlIGFib3ZlKSAKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHdlYlBhcmFtTmFtZXMubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0d29XYXlIb2xkZXJfc3RyIiwgd2ViUGFyYW1OYW1lc1swXSk7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygidHdvV2F5SG9sZGVyX2ludCIsIHdlYlBhcmFtTmFtZXNbMV0pOwotICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayB0aGUgbGFjayBvZiBhIFdlYlJlc3VsdCBhbm5vdGF0aW9uIGFuZCB0aGUgZGVmYXVsdCB2YWx1ZXMgZm9yCi0gICAgICAgICAgICAgICAgICAgIC8vIFNPQVBCaW5kaW5nIFN0eWxlPURPQ1VNRU5ULCBVc2U9TElURVJBTCwgUGFyYW1TdHlsZT1XUkFQUEVECi0gICAgICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB0aGUgU09BUEJpbmRpbmcgYW5ub3RhdGlvbiBpcyBhbHNvIG5vdCBwcmVzZW50IGFuZCB0aHVzIGZ1bGx5IGRlZmF1bHRlZC4KLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0TnVsbCgoKE9wZXJhdGlvbkRlc2NyaXB0aW9uSmF2YSlvcGVyYXRpb24pLmdldEFubm9XZWJSZXN1bHQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygicmV0dXJuIiwgb3BlcmF0aW9uLmdldFJlc3VsdE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygicmV0dXJuIiwgb3BlcmF0aW9uLmdldFJlc3VsdFBhcnROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIG9wZXJhdGlvbi5nZXRSZXN1bHRUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydEZhbHNlKG9wZXJhdGlvbi5pc1Jlc3VsdEhlYWRlcigpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZhaWwoIldyb25nIG51bWJlciBvZiBwYXJhbWV0ZXJzIHJldHVybmVkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBUZXN0IGZvciBhIG9uZS13YXksIHZvaWQgbWV0aG9kIHdpdGggbm8gcGFyYW1ldGVycyB3aGljaCBhbHNvIGlzIG5vdCBvdmVybG9hZGVkCi0gICAgICAgIG9wZXJhdGlvbnMgPSBlbmRwb2ludEludGZEZXNjLmdldE9wZXJhdGlvbkZvckphdmFNZXRob2QoIm9uZVdheVZvaWQiKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChvcGVyYXRpb25zKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG9wZXJhdGlvbnMubGVuZ3RoLCAxKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG9wZXJhdGlvbnNbMF0uZ2V0SmF2YU1ldGhvZE5hbWUoKSwgIm9uZVdheVZvaWQiKTsKLSAgICAgICAgU3RyaW5nW10gY2hlY2tFbXB0eVBhcmFtcyA9IG9wZXJhdGlvbnNbMF0uZ2V0SmF2YVBhcmFtZXRlcnMoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChjaGVja0VtcHR5UGFyYW1zKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNoZWNrRW1wdHlQYXJhbXMubGVuZ3RoLCAwKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIG9wZXJhdGlvbnNbMF0uaXNPbmVXYXkoKSk7Ci0gICAgICAgIC8vIENoZWNrIHRoZSBsYWNrIG9mIGEgV2ViUmVzdWx0IGFubm90YXRpb24gYW5kIHRoZSBkZWZhdWx0IHZhbHVlcyBmb3IKLSAgICAgICAgLy8gYSBPTkUtV0FZIC8gVk9JRCBvcGVyYXRpb24gd2l0aCBhIFNPQVBCaW5kaW5nIFN0eWxlPURPQ1VNRU5ULCBVc2U9TElURVJBTCwgUGFyYW1TdHlsZT1XUkFQUEVECi0gICAgICAgIC8vIE5vdGUgdGhhdCB0aGUgU09BUEJpbmRpbmcgYW5ub3RhdGlvbiBpcyBhbHNvIG5vdCBwcmVzZW50IGFuZCB0aHVzIGZ1bGx5IGRlZmF1bHRlZC4KLSAgICAgICAgYXNzZXJ0TnVsbCgoKE9wZXJhdGlvbkRlc2NyaXB0aW9uSmF2YSlvcGVyYXRpb25zWzBdKS5nZXRBbm5vV2ViUmVzdWx0KCkpOwotICAgICAgICBhc3NlcnRGYWxzZSgoKE9wZXJhdGlvbkRlc2NyaXB0aW9uSmF2YSlvcGVyYXRpb25zWzBdKS5pc1dlYlJlc3VsdEFubm90YXRpb25TcGVjaWZpZWQoKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKG9wZXJhdGlvbnNbMF0uaXNPcGVyYXRpb25SZXR1cm5pbmdSZXN1bHQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhudWxsLCBvcGVyYXRpb25zWzBdLmdldFJlc3VsdE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhudWxsLCBvcGVyYXRpb25zWzBdLmdldFJlc3VsdFBhcnROYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMobnVsbCwgb3BlcmF0aW9uc1swXS5nZXRSZXN1bHRUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKG9wZXJhdGlvbnNbMF0uaXNSZXN1bHRIZWFkZXIoKSk7Ci0KLSAgICAgICAgLy8gVGVzdCB0d28td2F5IG1ldGhvZCBmb3IgbGFjayBvZiBPbmVXYXkgYW5ub3RhdGlvbiBhbmQgV2ViUmVzdWx0IGFubm90YXRpb24KLSAgICAgICAgb3BlcmF0aW9ucyA9IGVuZHBvaW50SW50ZkRlc2MuZ2V0T3BlcmF0aW9uRm9ySmF2YU1ldGhvZCgiaW52b2tlIik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwob3BlcmF0aW9ucyk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBvcGVyYXRpb25zLmxlbmd0aCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgb3BlcmF0aW9uc1swXS5pc09uZVdheSgpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgoKE9wZXJhdGlvbkRlc2NyaXB0aW9uSmF2YSlvcGVyYXRpb25zWzBdKS5nZXRBbm5vV2ViUmVzdWx0KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInJldHVybl9zdHIiLCBvcGVyYXRpb25zWzBdLmdldFJlc3VsdE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygicmV0dXJuX3N0ciIsIG9wZXJhdGlvbnNbMF0uZ2V0UmVzdWx0UGFydE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiIiwgb3BlcmF0aW9uc1swXS5nZXRSZXN1bHRUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKG9wZXJhdGlvbnNbMF0uaXNSZXN1bHRIZWFkZXIoKSk7Ci0gICAgfQotCi0gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIC8vIFRoZSBmb2xsb3dpbmcgdGVzdHMgdXNlIGltcGxlbWVudGF0aW9uIGNsYXNzZXMgZGVmaW5lZCBiZWxvdwotICAgIC8vIGluIG9yZGVyIHRvIHRlc3QgdmFyaW91cyBzcGVjaWZpYyBhbm5vdGF0aW9uIHNldHRpbmdzCi0gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNPQVBCaW5kaW5nRGVmYXVsdCgpIHsKLSAgICAgICAgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiB0ZXN0RW5kcG9pbnRJbnRlcmZhY2VEZXNjID0KLSAgICAgICAgICAgICAgICBnZXRFbmRwb2ludEludGVyZmFjZURlc2MoU09BUEJpbmRpbmdEZWZhdWx0VGVzdEltcGwuY2xhc3MpOwotCi0gICAgICAgIGFzc2VydE51bGwoCi0gICAgICAgICAgICAgICAgKChFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uSmF2YSl0ZXN0RW5kcG9pbnRJbnRlcmZhY2VEZXNjKS5nZXRBbm5vU29hcEJpbmRpbmcoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5TdHlsZS5ET0NVTUVOVCwKLSAgICAgICAgICAgICAgICAgICAgIHRlc3RFbmRwb2ludEludGVyZmFjZURlc2MuZ2V0U29hcEJpbmRpbmdTdHlsZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlVzZS5MSVRFUkFMLAotICAgICAgICAgICAgICAgICAgICAgdGVzdEVuZHBvaW50SW50ZXJmYWNlRGVzYy5nZXRTb2FwQmluZGluZ1VzZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlBhcmFtZXRlclN0eWxlLldSQVBQRUQsCi0gICAgICAgICAgICAgICAgICAgICB0ZXN0RW5kcG9pbnRJbnRlcmZhY2VEZXNjLmdldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKSk7Ci0KLSAgICAgICAgT3BlcmF0aW9uRGVzY3JpcHRpb24gb3BlcmF0aW9uRGVzYyA9Ci0gICAgICAgICAgICAgICAgdGVzdEVuZHBvaW50SW50ZXJmYWNlRGVzYy5nZXRPcGVyYXRpb25Gb3JKYXZhTWV0aG9kKCJlY2hvU3RyaW5nIilbMF07Ci0gICAgICAgIC8vIFZlcmlmeSBXZWJSZXN1bHQgYW5ub3RhdGlvbiBkZWZhdWx0IHZhbHVlcyBmb3IgRE9DL0xJVC9XUkFQUEVEIGZyb20gYSBkZWZhdWx0ZWQgU09BUEJpbmRpbmcKLSAgICAgICAgYXNzZXJ0TnVsbCgoKE9wZXJhdGlvbkRlc2NyaXB0aW9uSmF2YSlvcGVyYXRpb25EZXNjKS5nZXRBbm5vV2ViUmVzdWx0KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInJldHVybiIsIG9wZXJhdGlvbkRlc2MuZ2V0UmVzdWx0TmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJyZXR1cm4iLCBvcGVyYXRpb25EZXNjLmdldFJlc3VsdFBhcnROYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIG9wZXJhdGlvbkRlc2MuZ2V0UmVzdWx0VGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICBhc3NlcnRGYWxzZShvcGVyYXRpb25EZXNjLmlzUmVzdWx0SGVhZGVyKCkpOwotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNPQVBCaW5kaW5nRG9jRW5jQmFyZSgpIHsKLSAgICAgICAgLy92ZXJpZnkgdGhhdCB3ZSB0aHJvdyBhbiBleGNlcHRpb24gd2hlbiBTT0FQQmluZGluZy5Vc2UgPT0gRU5DT0RFRCBpcyBzcGVjaWZpZWQKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24gdGVzdEVuZHBvaW50SW50ZXJmYWNlRGVzYyA9Ci0gICAgICAgICAgICAgICAgZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjKFNPQVBCaW5kaW5nRG9jRW5jQmFyZVRlc3RJbXBsLmNsYXNzKTsKLSAgICAgICAgICAgIGZhaWwoIlNob3VsZCBoYXZlIGNhdXNlZCBleGNlcHRpb24iKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIEV4cGVjdGVkIHBhdGgsIFNPQVBCaW5kaW5nLlVzZSA9PSBFTkNPREVEIGlzIG5vdCBzdXBwb3J0ZWQKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U09BUEJpbmRpbmdEb2NMaXRCYXJlKCkgewotICAgICAgICBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uIHRlc3RFbmRwb2ludEludGVyZmFjZURlc2MgPQotICAgICAgICAgICAgICAgIGdldEVuZHBvaW50SW50ZXJmYWNlRGVzYyhTT0FQQmluZGluZ0RvY0xpdEJhcmVUZXN0SW1wbC5jbGFzcyk7Ci0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgKLSAgICAgICAgICAgICAgICAoKEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb25KYXZhKXRlc3RFbmRwb2ludEludGVyZmFjZURlc2MpLmdldEFubm9Tb2FwQmluZGluZygpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlN0eWxlLkRPQ1VNRU5ULAotICAgICAgICAgICAgICAgICAgICAgdGVzdEVuZHBvaW50SW50ZXJmYWNlRGVzYy5nZXRTb2FwQmluZGluZ1N0eWxlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuVXNlLkxJVEVSQUwsCi0gICAgICAgICAgICAgICAgICAgICB0ZXN0RW5kcG9pbnRJbnRlcmZhY2VEZXNjLmdldFNvYXBCaW5kaW5nVXNlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuUGFyYW1ldGVyU3R5bGUuQkFSRSwKLSAgICAgICAgICAgICAgICAgICAgIHRlc3RFbmRwb2ludEludGVyZmFjZURlc2MuZ2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U09BUEJpbmRpbmdNZXRob2RBbm5vdGF0aW9uKCkgewotICAgICAgICAvLyBWZXJpZnkgdGhhdCBhbiBpbXBsIHdpdGhvdXQgdGhlIG1ldGhvZCBhbm5vdGF0aW9uIHVzZXMgdGhlIHNldHRpbmdzIGZyb20gdGhlIHR5cGUKLSAgICAgICAgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiB0ZXN0RW5kcG9pbnRJbnRlcmZhY2VEZXNjID0KLSAgICAgICAgICAgICAgICBnZXRFbmRwb2ludEludGVyZmFjZURlc2MoU09BUEJpbmRpbmdEb2NMaXRCYXJlVGVzdEltcGwuY2xhc3MpOwotCi0gICAgICAgIGFzc2VydE5vdE51bGwoCi0gICAgICAgICAgICAgICAgKChFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uSmF2YSl0ZXN0RW5kcG9pbnRJbnRlcmZhY2VEZXNjKS5nZXRBbm5vU29hcEJpbmRpbmcoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5TdHlsZS5ET0NVTUVOVCwKLSAgICAgICAgICAgICAgICAgICAgIHRlc3RFbmRwb2ludEludGVyZmFjZURlc2MuZ2V0U29hcEJpbmRpbmdTdHlsZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlVzZS5MSVRFUkFMLAotICAgICAgICAgICAgICAgICAgICAgdGVzdEVuZHBvaW50SW50ZXJmYWNlRGVzYy5nZXRTb2FwQmluZGluZ1VzZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlBhcmFtZXRlclN0eWxlLkJBUkUsCi0gICAgICAgICAgICAgICAgICAgICB0ZXN0RW5kcG9pbnRJbnRlcmZhY2VEZXNjLmdldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKSk7Ci0KLSAgICAgICAgT3BlcmF0aW9uRGVzY3JpcHRpb24gb3BlcmF0aW9uRGVzYyA9Ci0gICAgICAgICAgICAgICAgdGVzdEVuZHBvaW50SW50ZXJmYWNlRGVzYy5nZXRPcGVyYXRpb25Gb3JKYXZhTWV0aG9kKCJlY2hvU3RyaW5nIilbMF07Ci0gICAgICAgIGFzc2VydE5vdE51bGwob3BlcmF0aW9uRGVzYyk7Ci0gICAgICAgIGFzc2VydE51bGwoKChPcGVyYXRpb25EZXNjcmlwdGlvbkphdmEpb3BlcmF0aW9uRGVzYykuZ2V0QW5ub1NvYXBCaW5kaW5nKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuU3R5bGUuRE9DVU1FTlQsCi0gICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25EZXNjLmdldFNvYXBCaW5kaW5nU3R5bGUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5Vc2UuTElURVJBTCwgb3BlcmF0aW9uRGVzYy5nZXRTb2FwQmluZGluZ1VzZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlBhcmFtZXRlclN0eWxlLkJBUkUsCi0gICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25EZXNjLmdldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKSk7Ci0KLSAgICAgICAgLy8gVmVyaWZ5IHRoYXQgdGhlIG1ldGhvZCBhbm5vdGF0aW9uIHNldHRpbmcgb3ZlcnJpZGVzIHRoZSB0eXBlIGFubm90YXRpbm8gc2V0dGluZwotICAgICAgICB0ZXN0RW5kcG9pbnRJbnRlcmZhY2VEZXNjID0KLSAgICAgICAgICAgICAgICBnZXRFbmRwb2ludEludGVyZmFjZURlc2MoU09BUEJpbmRpbmdEZWZhdWx0TWV0aG9kVGVzdEltcGwuY2xhc3MpOwotCi0gICAgICAgIGFzc2VydE51bGwoCi0gICAgICAgICAgICAgICAgKChFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uSmF2YSl0ZXN0RW5kcG9pbnRJbnRlcmZhY2VEZXNjKS5nZXRBbm5vU29hcEJpbmRpbmcoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5TdHlsZS5ET0NVTUVOVCwKLSAgICAgICAgICAgICAgICAgICAgIHRlc3RFbmRwb2ludEludGVyZmFjZURlc2MuZ2V0U29hcEJpbmRpbmdTdHlsZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlVzZS5MSVRFUkFMLAotICAgICAgICAgICAgICAgICAgICAgdGVzdEVuZHBvaW50SW50ZXJmYWNlRGVzYy5nZXRTb2FwQmluZGluZ1VzZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlBhcmFtZXRlclN0eWxlLldSQVBQRUQsCi0gICAgICAgICAgICAgICAgICAgICB0ZXN0RW5kcG9pbnRJbnRlcmZhY2VEZXNjLmdldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKSk7Ci0KLSAgICAgICAgb3BlcmF0aW9uRGVzYyA9IHRlc3RFbmRwb2ludEludGVyZmFjZURlc2MuZ2V0T3BlcmF0aW9uRm9ySmF2YU1ldGhvZCgiZWNob1N0cmluZyIpWzBdOwotICAgICAgICBhc3NlcnROb3ROdWxsKG9wZXJhdGlvbkRlc2MpOwotICAgICAgICBhc3NlcnROb3ROdWxsKCgoT3BlcmF0aW9uRGVzY3JpcHRpb25KYXZhKW9wZXJhdGlvbkRlc2MpLmdldEFubm9Tb2FwQmluZGluZygpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlN0eWxlLkRPQ1VNRU5ULAotICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uRGVzYy5nZXRTb2FwQmluZGluZ1N0eWxlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuVXNlLkxJVEVSQUwsIG9wZXJhdGlvbkRlc2MuZ2V0U29hcEJpbmRpbmdVc2UoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5QYXJhbWV0ZXJTdHlsZS5CQVJFLAotICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uRGVzYy5nZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3REZWZhdWx0UmVxUnNwV3JhcHBlcigpIHsKLQotICAgICAgICAvLyBUZXN0IHBhcmFtYXRlclN0eWxlID0gV1JBUFBFRCBzZXQgYSB0aGUgdHlwZSBsZXZlbCB3aXRoIHZhcmlvdXMgY29tYmluYXRpb25zIG9mIG1ldGhvZCBhbm5vdGF0aW9uIHNldHRpbmcKLSAgICAgICAgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiB0ZXN0RW5kcG9pbnRJbnRlcmZhY2VEZXNjID0KLSAgICAgICAgICAgICAgICBnZXRFbmRwb2ludEludGVyZmFjZURlc2MoRGVmYXVsdFJlcVJzcFdyYXBwZXJUZXN0SW1wbC5jbGFzcyk7Ci0gICAgICAgIE9wZXJhdGlvbkRlc2NyaXB0aW9uIG9wZXJhdGlvbkRlc2MgPQotICAgICAgICAgICAgICAgIHRlc3RFbmRwb2ludEludGVyZmFjZURlc2MuZ2V0T3BlcmF0aW9uRm9ySmF2YU1ldGhvZCgid3JhcHBlZFBhcmFtcyIpWzBdOwotICAgICAgICBhc3NlcnROb3ROdWxsKG9wZXJhdGlvbkRlc2MpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIndyYXBwZWRQYXJhbXMiLCBvcGVyYXRpb25EZXNjLmdldFJlcXVlc3RXcmFwcGVyTG9jYWxOYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIndyYXBwZWRQYXJhbXNSZXNwb25zZSIsIG9wZXJhdGlvbkRlc2MuZ2V0UmVzcG9uc2VXcmFwcGVyTG9jYWxOYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly9kZXNjcmlwdGlvbi5qYXh3cy5heGlzMi5hcGFjaGUub3JnLyIsCi0gICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25EZXNjLmdldFJlcXVlc3RXcmFwcGVyVGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly9kZXNjcmlwdGlvbi5qYXh3cy5heGlzMi5hcGFjaGUub3JnLyIsCi0gICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25EZXNjLmdldFJlc3BvbnNlV3JhcHBlclRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgYXNzZXJ0TnVsbChvcGVyYXRpb25EZXNjLmdldFJlcXVlc3RXcmFwcGVyQ2xhc3NOYW1lKCkpOwotICAgICAgICBhc3NlcnROdWxsKG9wZXJhdGlvbkRlc2MuZ2V0UmVzcG9uc2VXcmFwcGVyQ2xhc3NOYW1lKCkpOwotICAgICAgICAvLyBUZXN0IFdlYlJlc3VsdCBhbm5vdGF0aW9uIGRlZmF1bHRzCi0gICAgICAgIGFzc2VydE51bGwoKChPcGVyYXRpb25EZXNjcmlwdGlvbkphdmEpb3BlcmF0aW9uRGVzYykuZ2V0QW5ub1dlYlJlc3VsdCgpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoKChPcGVyYXRpb25EZXNjcmlwdGlvbkphdmEpb3BlcmF0aW9uRGVzYykuaXNXZWJSZXN1bHRBbm5vdGF0aW9uU3BlY2lmaWVkKCkpOwotICAgICAgICBhc3NlcnRUcnVlKG9wZXJhdGlvbkRlc2MuaXNPcGVyYXRpb25SZXR1cm5pbmdSZXN1bHQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygicmV0dXJuIiwgb3BlcmF0aW9uRGVzYy5nZXRSZXN1bHROYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInJldHVybiIsIG9wZXJhdGlvbkRlc2MuZ2V0UmVzdWx0UGFydE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiIiwgb3BlcmF0aW9uRGVzYy5nZXRSZXN1bHRUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKG9wZXJhdGlvbkRlc2MuaXNSZXN1bHRIZWFkZXIoKSk7Ci0KLSAgICAgICAgb3BlcmF0aW9uRGVzYyA9IHRlc3RFbmRwb2ludEludGVyZmFjZURlc2MuZ2V0T3BlcmF0aW9uRm9ySmF2YU1ldGhvZCgiYmFyZVBhcmFtcyIpWzBdOwotICAgICAgICBhc3NlcnROb3ROdWxsKG9wZXJhdGlvbkRlc2MpOwotICAgICAgICBhc3NlcnROdWxsKG9wZXJhdGlvbkRlc2MuZ2V0UmVxdWVzdFdyYXBwZXJMb2NhbE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydE51bGwob3BlcmF0aW9uRGVzYy5nZXRSZXNwb25zZVdyYXBwZXJMb2NhbE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydE51bGwob3BlcmF0aW9uRGVzYy5nZXRSZXF1ZXN0V3JhcHBlclRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgYXNzZXJ0TnVsbChvcGVyYXRpb25EZXNjLmdldFJlc3BvbnNlV3JhcHBlclRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgYXNzZXJ0TnVsbChvcGVyYXRpb25EZXNjLmdldFJlcXVlc3RXcmFwcGVyQ2xhc3NOYW1lKCkpOwotICAgICAgICBhc3NlcnROdWxsKG9wZXJhdGlvbkRlc2MuZ2V0UmVzcG9uc2VXcmFwcGVyQ2xhc3NOYW1lKCkpOwotICAgICAgICAvLyBUZXN0IFdlYlJlc3VsdCBhbm5vdGF0aW9uIGRlZmF1bHRzCi0gICAgICAgIGFzc2VydE51bGwoKChPcGVyYXRpb25EZXNjcmlwdGlvbkphdmEpb3BlcmF0aW9uRGVzYykuZ2V0QW5ub1dlYlJlc3VsdCgpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoKChPcGVyYXRpb25EZXNjcmlwdGlvbkphdmEpb3BlcmF0aW9uRGVzYykuaXNXZWJSZXN1bHRBbm5vdGF0aW9uU3BlY2lmaWVkKCkpOwotICAgICAgICBhc3NlcnRUcnVlKG9wZXJhdGlvbkRlc2MuaXNPcGVyYXRpb25SZXR1cm5pbmdSZXN1bHQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiYmFyZVBhcmFtc1Jlc3BvbnNlIiwgb3BlcmF0aW9uRGVzYy5nZXRSZXN1bHROYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImJhcmVQYXJhbXNSZXNwb25zZSIsIG9wZXJhdGlvbkRlc2MuZ2V0UmVzdWx0UGFydE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiaHR0cDovL2Rlc2NyaXB0aW9uLmpheHdzLmF4aXMyLmFwYWNoZS5vcmcvIiwKLSAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbkRlc2MuZ2V0UmVzdWx0VGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICBhc3NlcnRGYWxzZShvcGVyYXRpb25EZXNjLmlzUmVzdWx0SGVhZGVyKCkpOwotCi0gICAgICAgIC8vIFRlc3QgcGFyYW1hdGVyU3R5bGUgPSBCQVJFIHNldCBhIHRoZSB0eXBlIGxldmVsIHdpdGggdmFyaW91cyBjb21iaW5hdGlvbnMgb2YgbWV0aG9kIGFubm90YXRpb24gc2V0dGluZwotICAgICAgICB0ZXN0RW5kcG9pbnRJbnRlcmZhY2VEZXNjID0KLSAgICAgICAgICAgICAgICBnZXRFbmRwb2ludEludGVyZmFjZURlc2MoRGVmYXVsdFJlcVJzcFdyYXBwZXJCYXJlVGVzdEltcGwuY2xhc3MpOwotICAgICAgICBvcGVyYXRpb25EZXNjID0gdGVzdEVuZHBvaW50SW50ZXJmYWNlRGVzYy5nZXRPcGVyYXRpb25Gb3JKYXZhTWV0aG9kKCJ3cmFwcGVkUGFyYW1zIilbMF07Ci0gICAgICAgIGFzc2VydE5vdE51bGwob3BlcmF0aW9uRGVzYyk7Ci0gICAgICAgIGFzc2VydEVxdWFscygid3JhcHBlZFBhcmFtcyIsIG9wZXJhdGlvbkRlc2MuZ2V0UmVxdWVzdFdyYXBwZXJMb2NhbE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygid3JhcHBlZFBhcmFtc1Jlc3BvbnNlIiwgb3BlcmF0aW9uRGVzYy5nZXRSZXNwb25zZVdyYXBwZXJMb2NhbE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiaHR0cDovL2Rlc2NyaXB0aW9uLmpheHdzLmF4aXMyLmFwYWNoZS5vcmcvIiwKLSAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbkRlc2MuZ2V0UmVxdWVzdFdyYXBwZXJUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiaHR0cDovL2Rlc2NyaXB0aW9uLmpheHdzLmF4aXMyLmFwYWNoZS5vcmcvIiwKLSAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbkRlc2MuZ2V0UmVzcG9uc2VXcmFwcGVyVGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICBhc3NlcnROdWxsKG9wZXJhdGlvbkRlc2MuZ2V0UmVxdWVzdFdyYXBwZXJDbGFzc05hbWUoKSk7Ci0gICAgICAgIGFzc2VydE51bGwob3BlcmF0aW9uRGVzYy5nZXRSZXNwb25zZVdyYXBwZXJDbGFzc05hbWUoKSk7Ci0gICAgICAgIG9wZXJhdGlvbkRlc2MgPSB0ZXN0RW5kcG9pbnRJbnRlcmZhY2VEZXNjLmdldE9wZXJhdGlvbkZvckphdmFNZXRob2QoImJhcmVQYXJhbXMiKVswXTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChvcGVyYXRpb25EZXNjKTsKLSAgICAgICAgYXNzZXJ0TnVsbChvcGVyYXRpb25EZXNjLmdldFJlcXVlc3RXcmFwcGVyTG9jYWxOYW1lKCkpOwotICAgICAgICBhc3NlcnROdWxsKG9wZXJhdGlvbkRlc2MuZ2V0UmVzcG9uc2VXcmFwcGVyTG9jYWxOYW1lKCkpOwotICAgICAgICBhc3NlcnROdWxsKG9wZXJhdGlvbkRlc2MuZ2V0UmVxdWVzdFdyYXBwZXJUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgIGFzc2VydE51bGwob3BlcmF0aW9uRGVzYy5nZXRSZXNwb25zZVdyYXBwZXJUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgIGFzc2VydE51bGwob3BlcmF0aW9uRGVzYy5nZXRSZXF1ZXN0V3JhcHBlckNsYXNzTmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0TnVsbChvcGVyYXRpb25EZXNjLmdldFJlc3BvbnNlV3JhcHBlckNsYXNzTmFtZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVxUnNwV3JhcHBlcigpIHsKLSAgICAgICAgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiB0ZXN0RW5kcG9pbnRJbnRlcmZhY2VEZXNjID0KLSAgICAgICAgICAgICAgICBnZXRFbmRwb2ludEludGVyZmFjZURlc2MoUmVxUnNwV3JhcHBlclRlc3RJbXBsLmNsYXNzKTsKLSAgICAgICAgT3BlcmF0aW9uRGVzY3JpcHRpb24gb3BlcmF0aW9uRGVzYyA9Ci0gICAgICAgICAgICAgICAgdGVzdEVuZHBvaW50SW50ZXJmYWNlRGVzYy5nZXRPcGVyYXRpb25Gb3JKYXZhTWV0aG9kKCJtZXRob2QxIilbMF07Ci0gICAgICAgIGFzc2VydE5vdE51bGwob3BlcmF0aW9uRGVzYyk7Ci0gICAgICAgIGFzc2VydEVxdWFscygibWV0aG9kMVJlcVdyYXBwZXIiLCBvcGVyYXRpb25EZXNjLmdldFJlcXVlc3RXcmFwcGVyTG9jYWxOYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIm1ldGhvZDFSc3BXcmFwcGVyIiwgb3BlcmF0aW9uRGVzYy5nZXRSZXNwb25zZVdyYXBwZXJMb2NhbE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiaHR0cDovL2EuYi5jLm1ldGhvZDFSZXFUTlMiLAotICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uRGVzYy5nZXRSZXF1ZXN0V3JhcHBlclRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJodHRwOi8vYS5iLmMubWV0aG9kMVJzcFROUyIsCi0gICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25EZXNjLmdldFJlc3BvbnNlV3JhcHBlclRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkFubm90YXRpb25TZXJ2aWNlSW1wbERlc2NyaXB0aW9uVGVzdHMuUmVxUnNwV3JhcHBlclRlc3RJbXBsLm1ldGhvZDFSZXFXcmFwcGVyIiwKLSAgICAgICAgICAgICAgICBvcGVyYXRpb25EZXNjLmdldFJlcXVlc3RXcmFwcGVyQ2xhc3NOYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uQW5ub3RhdGlvblNlcnZpY2VJbXBsRGVzY3JpcHRpb25UZXN0cy5SZXFSc3BXcmFwcGVyVGVzdEltcGwubWV0aG9kMVJzcFdyYXBwZXIiLAotICAgICAgICAgICAgICAgIG9wZXJhdGlvbkRlc2MuZ2V0UmVzcG9uc2VXcmFwcGVyQ2xhc3NOYW1lKCkpOwotCi0gICAgICAgIG9wZXJhdGlvbkRlc2MgPSB0ZXN0RW5kcG9pbnRJbnRlcmZhY2VEZXNjLmdldE9wZXJhdGlvbkZvckphdmFNZXRob2QoIm1ldGhvZDIiKVswXTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJtZXRob2QyIiwgb3BlcmF0aW9uRGVzYy5nZXRSZXF1ZXN0V3JhcHBlckxvY2FsTmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJtZXRob2QyUnNwV3JhcHBlciIsIG9wZXJhdGlvbkRlc2MuZ2V0UmVzcG9uc2VXcmFwcGVyTG9jYWxOYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly9hLmIuYy5tZXRob2QyUmVxVE5TIiwKLSAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbkRlc2MuZ2V0UmVxdWVzdFdyYXBwZXJUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiaHR0cDovL2EuYi5jLm1ldGhvZDJSc3BUTlMiLAotICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uRGVzYy5nZXRSZXNwb25zZVdyYXBwZXJUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5Bbm5vdGF0aW9uU2VydmljZUltcGxEZXNjcmlwdGlvblRlc3RzLlJlcVJzcFdyYXBwZXJUZXN0SW1wbC5tZXRob2QyUmVxV3JhcHBlciIsCi0gICAgICAgICAgICAgICAgb3BlcmF0aW9uRGVzYy5nZXRSZXF1ZXN0V3JhcHBlckNsYXNzTmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0TnVsbChvcGVyYXRpb25EZXNjLmdldFJlc3BvbnNlV3JhcHBlckNsYXNzTmFtZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0V2ViTWV0aG9kKCkgewotICAgICAgICBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uIHRlc3RFbmRwb2ludEludGVyZmFjZURlc2MgPQotICAgICAgICAgICAgICAgIGdldEVuZHBvaW50SW50ZXJmYWNlRGVzYyhXZWJNZXRob2RUZXN0SW1wbC5jbGFzcyk7Ci0KLSAgICAgICAgLy8gVGVzdCByZXN1bHRzIGZyb20gbWV0aG9kIHdpdGggbm8gYW5ub3RhdGlvbgotICAgICAgICBPcGVyYXRpb25EZXNjcmlwdGlvbltdIG9wZXJhdGlvbkRlc2NzID0KLSAgICAgICAgICAgICAgICB0ZXN0RW5kcG9pbnRJbnRlcmZhY2VEZXNjLmdldE9wZXJhdGlvbkZvckphdmFNZXRob2QoIm1ldGhvZDEiKTsKLSAgICAgICAgYXNzZXJ0TnVsbChvcGVyYXRpb25EZXNjcyk7Ci0KLSAgICAgICAgT3BlcmF0aW9uRGVzY3JpcHRpb24gb3BlcmF0aW9uRGVzYyA9Ci0gICAgICAgICAgICAgICAgdGVzdEVuZHBvaW50SW50ZXJmYWNlRGVzYy5nZXRPcGVyYXRpb25Gb3JKYXZhTWV0aG9kKCJtZXRob2QyIilbMF07Ci0gICAgICAgIGFzc2VydE5vdE51bGwob3BlcmF0aW9uRGVzYyk7Ci0gICAgICAgIGFzc2VydEVxdWFscygicmVuYW1lZE1ldGhvZDIiLCBvcGVyYXRpb25EZXNjLmdldE9wZXJhdGlvbk5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiIiwgb3BlcmF0aW9uRGVzYy5nZXRBY3Rpb24oKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKG9wZXJhdGlvbkRlc2MuaXNFeGNsdWRlZCgpKTsKLQotICAgICAgICBvcGVyYXRpb25EZXNjID0gdGVzdEVuZHBvaW50SW50ZXJmYWNlRGVzYy5nZXRPcGVyYXRpb25Gb3JKYXZhTWV0aG9kKCJtZXRob2QzIilbMF07Ci0gICAgICAgIGFzc2VydE5vdE51bGwob3BlcmF0aW9uRGVzYyk7Ci0gICAgICAgIGFzc2VydEVxdWFscygibWV0aG9kMyIsIG9wZXJhdGlvbkRlc2MuZ2V0T3BlcmF0aW9uTmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJBY3Rpb25NZXRob2QzIiwgb3BlcmF0aW9uRGVzYy5nZXRBY3Rpb24oKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKG9wZXJhdGlvbkRlc2MuaXNFeGNsdWRlZCgpKTsKLQotICAgICAgICBvcGVyYXRpb25EZXNjID0gdGVzdEVuZHBvaW50SW50ZXJmYWNlRGVzYy5nZXRPcGVyYXRpb25Gb3JKYXZhTWV0aG9kKCJtZXRob2Q0IilbMF07Ci0gICAgICAgIGFzc2VydE5vdE51bGwob3BlcmF0aW9uRGVzYyk7Ci0gICAgICAgIGFzc2VydEVxdWFscygicmVuYW1lZE1ldGhvZDQiLCBvcGVyYXRpb25EZXNjLmdldE9wZXJhdGlvbk5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiQWN0aW9uTWV0aG9kNCIsIG9wZXJhdGlvbkRlc2MuZ2V0QWN0aW9uKCkpOwotICAgICAgICBhc3NlcnRGYWxzZShvcGVyYXRpb25EZXNjLmlzRXhjbHVkZWQoKSk7Ci0KLSAgICAgICAgb3BlcmF0aW9uRGVzYyA9IHRlc3RFbmRwb2ludEludGVyZmFjZURlc2MuZ2V0T3BlcmF0aW9uRm9ySmF2YU1ldGhvZCgibWV0aG9kNCIpWzBdOwotICAgICAgICBhc3NlcnROb3ROdWxsKG9wZXJhdGlvbkRlc2MpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInJlbmFtZWRNZXRob2Q0Iiwgb3BlcmF0aW9uRGVzYy5nZXRPcGVyYXRpb25OYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkFjdGlvbk1ldGhvZDQiLCBvcGVyYXRpb25EZXNjLmdldEFjdGlvbigpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2Uob3BlcmF0aW9uRGVzYy5pc0V4Y2x1ZGVkKCkpOwotCi0gICAgICAgIG9wZXJhdGlvbkRlc2NzID0gdGVzdEVuZHBvaW50SW50ZXJmYWNlRGVzYy5nZXRPcGVyYXRpb25Gb3JKYXZhTWV0aG9kKCJtZXRob2Q1Iik7Ci0gICAgICAgIGFzc2VydE51bGwob3BlcmF0aW9uRGVzY3MpOwotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFdlYlJlc3VsdCgpIHsKLSAgICAgICAgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiB0ZXN0RW5kcG9pbnRJbnRlcmZhY2VEZXNjID0KLSAgICAgICAgICAgICAgICBnZXRFbmRwb2ludEludGVyZmFjZURlc2MoV2ViUmVzdWx0VGVzdEltcGwuY2xhc3MpOwotCi0gICAgICAgIC8vIERPQ1VNRU5UIC8gTElURVJBTCAvIFdSQVBQRUQgbWV0aG9kcwotCi0gICAgICAgIE9wZXJhdGlvbkRlc2NyaXB0aW9uW10gb3BlcmF0aW9uRGVzY3MgPQotICAgICAgICAgICAgICAgIHRlc3RFbmRwb2ludEludGVyZmFjZURlc2MuZ2V0T3BlcmF0aW9uRm9ySmF2YU1ldGhvZCgibWV0aG9kMCIpOwotICAgICAgICBhc3NlcnROdWxsKG9wZXJhdGlvbkRlc2NzKTsKLQotICAgICAgICBPcGVyYXRpb25EZXNjcmlwdGlvbiBvcGVyYXRpb25EZXNjID0KLSAgICAgICAgICAgICAgICB0ZXN0RW5kcG9pbnRJbnRlcmZhY2VEZXNjLmdldE9wZXJhdGlvbkZvckphdmFNZXRob2QoIm1ldGhvZDEiKVswXTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChvcGVyYXRpb25EZXNjKTsKLSAgICAgICAgYXNzZXJ0TnVsbCgoKE9wZXJhdGlvbkRlc2NyaXB0aW9uSmF2YSlvcGVyYXRpb25EZXNjKS5nZXRBbm5vV2ViUmVzdWx0KCkpOwotICAgICAgICBhc3NlcnRGYWxzZSgoKE9wZXJhdGlvbkRlc2NyaXB0aW9uSmF2YSlvcGVyYXRpb25EZXNjKS5pc1dlYlJlc3VsdEFubm90YXRpb25TcGVjaWZpZWQoKSk7Ci0gICAgICAgIGFzc2VydFRydWUob3BlcmF0aW9uRGVzYy5pc09wZXJhdGlvblJldHVybmluZ1Jlc3VsdCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJyZXR1cm4iLCBvcGVyYXRpb25EZXNjLmdldFJlc3VsdE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygicmV0dXJuIiwgb3BlcmF0aW9uRGVzYy5nZXRSZXN1bHRQYXJ0TmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBvcGVyYXRpb25EZXNjLmdldFJlc3VsdFRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2Uob3BlcmF0aW9uRGVzYy5pc1Jlc3VsdEhlYWRlcigpKTsKLQotICAgICAgICBvcGVyYXRpb25EZXNjID0gdGVzdEVuZHBvaW50SW50ZXJmYWNlRGVzYy5nZXRPcGVyYXRpb25Gb3JKYXZhTWV0aG9kKCJtZXRob2QyIilbMF07Ci0gICAgICAgIGFzc2VydE5vdE51bGwob3BlcmF0aW9uRGVzYyk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoKChPcGVyYXRpb25EZXNjcmlwdGlvbkphdmEpb3BlcmF0aW9uRGVzYykuZ2V0QW5ub1dlYlJlc3VsdCgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgoKE9wZXJhdGlvbkRlc2NyaXB0aW9uSmF2YSlvcGVyYXRpb25EZXNjKS5pc1dlYlJlc3VsdEFubm90YXRpb25TcGVjaWZpZWQoKSk7Ci0gICAgICAgIGFzc2VydFRydWUob3BlcmF0aW9uRGVzYy5pc09wZXJhdGlvblJldHVybmluZ1Jlc3VsdCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJyZXR1cm4iLCBvcGVyYXRpb25EZXNjLmdldFJlc3VsdE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygicmV0dXJuIiwgb3BlcmF0aW9uRGVzYy5nZXRSZXN1bHRQYXJ0TmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBvcGVyYXRpb25EZXNjLmdldFJlc3VsdFRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2Uob3BlcmF0aW9uRGVzYy5pc1Jlc3VsdEhlYWRlcigpKTsKLQotICAgICAgICBvcGVyYXRpb25EZXNjID0gdGVzdEVuZHBvaW50SW50ZXJmYWNlRGVzYy5nZXRPcGVyYXRpb25Gb3JKYXZhTWV0aG9kKCJtZXRob2QzIilbMF07Ci0gICAgICAgIGFzc2VydE5vdE51bGwob3BlcmF0aW9uRGVzYyk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoKChPcGVyYXRpb25EZXNjcmlwdGlvbkphdmEpb3BlcmF0aW9uRGVzYykuZ2V0QW5ub1dlYlJlc3VsdCgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgoKE9wZXJhdGlvbkRlc2NyaXB0aW9uSmF2YSlvcGVyYXRpb25EZXNjKS5pc1dlYlJlc3VsdEFubm90YXRpb25TcGVjaWZpZWQoKSk7Ci0gICAgICAgIGFzc2VydFRydWUob3BlcmF0aW9uRGVzYy5pc09wZXJhdGlvblJldHVybmluZ1Jlc3VsdCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJyZXN1bHROYW1lIiwgb3BlcmF0aW9uRGVzYy5nZXRSZXN1bHROYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInJlc3VsdE5hbWUiLCBvcGVyYXRpb25EZXNjLmdldFJlc3VsdFBhcnROYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIG9wZXJhdGlvbkRlc2MuZ2V0UmVzdWx0VGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICBhc3NlcnRGYWxzZShvcGVyYXRpb25EZXNjLmlzUmVzdWx0SGVhZGVyKCkpOwotCi0gICAgICAgIG9wZXJhdGlvbkRlc2MgPSB0ZXN0RW5kcG9pbnRJbnRlcmZhY2VEZXNjLmdldE9wZXJhdGlvbkZvckphdmFNZXRob2QoIm1ldGhvZDQiKVswXTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChvcGVyYXRpb25EZXNjKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgoKE9wZXJhdGlvbkRlc2NyaXB0aW9uSmF2YSlvcGVyYXRpb25EZXNjKS5nZXRBbm5vV2ViUmVzdWx0KCkpOwotICAgICAgICBhc3NlcnRUcnVlKCgoT3BlcmF0aW9uRGVzY3JpcHRpb25KYXZhKW9wZXJhdGlvbkRlc2MpLmlzV2ViUmVzdWx0QW5ub3RhdGlvblNwZWNpZmllZCgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShvcGVyYXRpb25EZXNjLmlzT3BlcmF0aW9uUmV0dXJuaW5nUmVzdWx0KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInJlc3VsdE5hbWUiLCBvcGVyYXRpb25EZXNjLmdldFJlc3VsdE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygicGFydE5hbWUiLCBvcGVyYXRpb25EZXNjLmdldFJlc3VsdFBhcnROYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly9yZXN1bHQudGVzdC50YXJnZXQubmFtZXNwYWNlLyIsCi0gICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25EZXNjLmdldFJlc3VsdFRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2Uob3BlcmF0aW9uRGVzYy5pc1Jlc3VsdEhlYWRlcigpKTsKLQotICAgICAgICBvcGVyYXRpb25EZXNjID0gdGVzdEVuZHBvaW50SW50ZXJmYWNlRGVzYy5nZXRPcGVyYXRpb25Gb3JKYXZhTWV0aG9kKCJtZXRob2Q1IilbMF07Ci0gICAgICAgIGFzc2VydE5vdE51bGwob3BlcmF0aW9uRGVzYyk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoKChPcGVyYXRpb25EZXNjcmlwdGlvbkphdmEpb3BlcmF0aW9uRGVzYykuZ2V0QW5ub1dlYlJlc3VsdCgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgoKE9wZXJhdGlvbkRlc2NyaXB0aW9uSmF2YSlvcGVyYXRpb25EZXNjKS5pc1dlYlJlc3VsdEFubm90YXRpb25TcGVjaWZpZWQoKSk7Ci0gICAgICAgIGFzc2VydFRydWUob3BlcmF0aW9uRGVzYy5pc09wZXJhdGlvblJldHVybmluZ1Jlc3VsdCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJyZXN1bHROYW1lNSIsIG9wZXJhdGlvbkRlc2MuZ2V0UmVzdWx0TmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJwYXJ0TmFtZTUiLCBvcGVyYXRpb25EZXNjLmdldFJlc3VsdFBhcnROYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly9yZXN1bHQudGVzdC50YXJnZXQubmFtZXNwYWNlLjUvIiwKLSAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbkRlc2MuZ2V0UmVzdWx0VGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICBhc3NlcnRUcnVlKG9wZXJhdGlvbkRlc2MuaXNSZXN1bHRIZWFkZXIoKSk7Ci0KLSAgICAgICAgb3BlcmF0aW9uRGVzYyA9IHRlc3RFbmRwb2ludEludGVyZmFjZURlc2MuZ2V0T3BlcmF0aW9uRm9ySmF2YU1ldGhvZCgibWV0aG9kNiIpWzBdOwotICAgICAgICBhc3NlcnROb3ROdWxsKG9wZXJhdGlvbkRlc2MpOwotICAgICAgICBhc3NlcnROdWxsKCgoT3BlcmF0aW9uRGVzY3JpcHRpb25KYXZhKW9wZXJhdGlvbkRlc2MpLmdldEFubm9XZWJSZXN1bHQoKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKCgoT3BlcmF0aW9uRGVzY3JpcHRpb25KYXZhKW9wZXJhdGlvbkRlc2MpLmlzV2ViUmVzdWx0QW5ub3RhdGlvblNwZWNpZmllZCgpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2Uob3BlcmF0aW9uRGVzYy5pc09wZXJhdGlvblJldHVybmluZ1Jlc3VsdCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG51bGwsIG9wZXJhdGlvbkRlc2MuZ2V0UmVzdWx0TmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG51bGwsIG9wZXJhdGlvbkRlc2MuZ2V0UmVzdWx0UGFydE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhudWxsLCBvcGVyYXRpb25EZXNjLmdldFJlc3VsdFRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2Uob3BlcmF0aW9uRGVzYy5pc1Jlc3VsdEhlYWRlcigpKTsKLQotICAgICAgICBvcGVyYXRpb25EZXNjID0gdGVzdEVuZHBvaW50SW50ZXJmYWNlRGVzYy5nZXRPcGVyYXRpb25Gb3JKYXZhTWV0aG9kKCJtZXRob2Q3IilbMF07Ci0gICAgICAgIGFzc2VydE5vdE51bGwob3BlcmF0aW9uRGVzYyk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoKChPcGVyYXRpb25EZXNjcmlwdGlvbkphdmEpb3BlcmF0aW9uRGVzYykuZ2V0QW5ub1dlYlJlc3VsdCgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgoKE9wZXJhdGlvbkRlc2NyaXB0aW9uSmF2YSlvcGVyYXRpb25EZXNjKS5pc1dlYlJlc3VsdEFubm90YXRpb25TcGVjaWZpZWQoKSk7Ci0gICAgICAgIGFzc2VydFRydWUob3BlcmF0aW9uRGVzYy5pc09wZXJhdGlvblJldHVybmluZ1Jlc3VsdCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJyZXN1bHROYW1lNyIsIG9wZXJhdGlvbkRlc2MuZ2V0UmVzdWx0TmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJwYXJ0TmFtZTciLCBvcGVyYXRpb25EZXNjLmdldFJlc3VsdFBhcnROYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly9zZXJ2aWNlLnRlc3QudGFyZ2V0Lm5hbWVzcGFjZS8iLAotICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uRGVzYy5nZXRSZXN1bHRUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgIGFzc2VydFRydWUob3BlcmF0aW9uRGVzYy5pc1Jlc3VsdEhlYWRlcigpKTsKLQotICAgICAgICAvLyBET0NVTUVOVCAvIExJVEVSQUwgLyBCQVJFIG1ldGhvZHMKLQotICAgICAgICBvcGVyYXRpb25EZXNjcyA9IHRlc3RFbmRwb2ludEludGVyZmFjZURlc2MuZ2V0T3BlcmF0aW9uRm9ySmF2YU1ldGhvZCgibWV0aG9kMF9iYXJlIik7Ci0gICAgICAgIGFzc2VydE51bGwob3BlcmF0aW9uRGVzY3MpOwotCi0gICAgICAgIG9wZXJhdGlvbkRlc2MgPSB0ZXN0RW5kcG9pbnRJbnRlcmZhY2VEZXNjLmdldE9wZXJhdGlvbkZvckphdmFNZXRob2QoIm1ldGhvZDFfYmFyZSIpWzBdOwotICAgICAgICBhc3NlcnROb3ROdWxsKG9wZXJhdGlvbkRlc2MpOwotICAgICAgICBhc3NlcnROdWxsKCgoT3BlcmF0aW9uRGVzY3JpcHRpb25KYXZhKW9wZXJhdGlvbkRlc2MpLmdldEFubm9XZWJSZXN1bHQoKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKCgoT3BlcmF0aW9uRGVzY3JpcHRpb25KYXZhKW9wZXJhdGlvbkRlc2MpLmlzV2ViUmVzdWx0QW5ub3RhdGlvblNwZWNpZmllZCgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShvcGVyYXRpb25EZXNjLmlzT3BlcmF0aW9uUmV0dXJuaW5nUmVzdWx0KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInJlbmFtZWRNZXRob2QxQmFyZVJlc3BvbnNlIiwgb3BlcmF0aW9uRGVzYy5nZXRSZXN1bHROYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInJlbmFtZWRNZXRob2QxQmFyZVJlc3BvbnNlIiwgb3BlcmF0aW9uRGVzYy5nZXRSZXN1bHRQYXJ0TmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJodHRwOi8vc2VydmljZS50ZXN0LnRhcmdldC5uYW1lc3BhY2UvIiwKLSAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbkRlc2MuZ2V0UmVzdWx0VGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICBhc3NlcnRGYWxzZShvcGVyYXRpb25EZXNjLmlzUmVzdWx0SGVhZGVyKCkpOwotCi0gICAgICAgIG9wZXJhdGlvbkRlc2MgPSB0ZXN0RW5kcG9pbnRJbnRlcmZhY2VEZXNjLmdldE9wZXJhdGlvbkZvckphdmFNZXRob2QoIm1ldGhvZDJfYmFyZSIpWzBdOwotICAgICAgICBhc3NlcnROb3ROdWxsKG9wZXJhdGlvbkRlc2MpOwotICAgICAgICBhc3NlcnROb3ROdWxsKCgoT3BlcmF0aW9uRGVzY3JpcHRpb25KYXZhKW9wZXJhdGlvbkRlc2MpLmdldEFubm9XZWJSZXN1bHQoKSk7Ci0gICAgICAgIGFzc2VydFRydWUoKChPcGVyYXRpb25EZXNjcmlwdGlvbkphdmEpb3BlcmF0aW9uRGVzYykuaXNXZWJSZXN1bHRBbm5vdGF0aW9uU3BlY2lmaWVkKCkpOwotICAgICAgICBhc3NlcnRUcnVlKG9wZXJhdGlvbkRlc2MuaXNPcGVyYXRpb25SZXR1cm5pbmdSZXN1bHQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygicmVuYW1lZE1ldGhvZDJCYXJlUmVzcG9uc2UiLCBvcGVyYXRpb25EZXNjLmdldFJlc3VsdE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygicmVuYW1lZE1ldGhvZDJCYXJlUmVzcG9uc2UiLCBvcGVyYXRpb25EZXNjLmdldFJlc3VsdFBhcnROYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly9zZXJ2aWNlLnRlc3QudGFyZ2V0Lm5hbWVzcGFjZS8iLAotICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uRGVzYy5nZXRSZXN1bHRUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKG9wZXJhdGlvbkRlc2MuaXNSZXN1bHRIZWFkZXIoKSk7Ci0KLSAgICAgICAgb3BlcmF0aW9uRGVzYyA9IHRlc3RFbmRwb2ludEludGVyZmFjZURlc2MuZ2V0T3BlcmF0aW9uRm9ySmF2YU1ldGhvZCgibWV0aG9kM19iYXJlIilbMF07Ci0gICAgICAgIGFzc2VydE5vdE51bGwob3BlcmF0aW9uRGVzYyk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoKChPcGVyYXRpb25EZXNjcmlwdGlvbkphdmEpb3BlcmF0aW9uRGVzYykuZ2V0QW5ub1dlYlJlc3VsdCgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgoKE9wZXJhdGlvbkRlc2NyaXB0aW9uSmF2YSlvcGVyYXRpb25EZXNjKS5pc1dlYlJlc3VsdEFubm90YXRpb25TcGVjaWZpZWQoKSk7Ci0gICAgICAgIGFzc2VydFRydWUob3BlcmF0aW9uRGVzYy5pc09wZXJhdGlvblJldHVybmluZ1Jlc3VsdCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJyZXN1bHROYW1lIiwgb3BlcmF0aW9uRGVzYy5nZXRSZXN1bHROYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInJlc3VsdE5hbWUiLCBvcGVyYXRpb25EZXNjLmdldFJlc3VsdFBhcnROYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly9zZXJ2aWNlLnRlc3QudGFyZ2V0Lm5hbWVzcGFjZS8iLAotICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uRGVzYy5nZXRSZXN1bHRUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKG9wZXJhdGlvbkRlc2MuaXNSZXN1bHRIZWFkZXIoKSk7Ci0KLSAgICAgICAgb3BlcmF0aW9uRGVzYyA9IHRlc3RFbmRwb2ludEludGVyZmFjZURlc2MuZ2V0T3BlcmF0aW9uRm9ySmF2YU1ldGhvZCgibWV0aG9kNF9iYXJlIilbMF07Ci0gICAgICAgIGFzc2VydE5vdE51bGwob3BlcmF0aW9uRGVzYyk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoKChPcGVyYXRpb25EZXNjcmlwdGlvbkphdmEpb3BlcmF0aW9uRGVzYykuZ2V0QW5ub1dlYlJlc3VsdCgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgoKE9wZXJhdGlvbkRlc2NyaXB0aW9uSmF2YSlvcGVyYXRpb25EZXNjKS5pc1dlYlJlc3VsdEFubm90YXRpb25TcGVjaWZpZWQoKSk7Ci0gICAgICAgIGFzc2VydFRydWUob3BlcmF0aW9uRGVzYy5pc09wZXJhdGlvblJldHVybmluZ1Jlc3VsdCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJyZXN1bHROYW1lIiwgb3BlcmF0aW9uRGVzYy5nZXRSZXN1bHROYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInBhcnROYW1lIiwgb3BlcmF0aW9uRGVzYy5nZXRSZXN1bHRQYXJ0TmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJodHRwOi8vcmVzdWx0LmJhcmUudGVzdC50YXJnZXQubmFtZXNwYWNlLyIsCi0gICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25EZXNjLmdldFJlc3VsdFRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2Uob3BlcmF0aW9uRGVzYy5pc1Jlc3VsdEhlYWRlcigpKTsKLQotICAgICAgICBvcGVyYXRpb25EZXNjID0gdGVzdEVuZHBvaW50SW50ZXJmYWNlRGVzYy5nZXRPcGVyYXRpb25Gb3JKYXZhTWV0aG9kKCJtZXRob2Q1X2JhcmUiKVswXTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChvcGVyYXRpb25EZXNjKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgoKE9wZXJhdGlvbkRlc2NyaXB0aW9uSmF2YSlvcGVyYXRpb25EZXNjKS5nZXRBbm5vV2ViUmVzdWx0KCkpOwotICAgICAgICBhc3NlcnRUcnVlKCgoT3BlcmF0aW9uRGVzY3JpcHRpb25KYXZhKW9wZXJhdGlvbkRlc2MpLmlzV2ViUmVzdWx0QW5ub3RhdGlvblNwZWNpZmllZCgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShvcGVyYXRpb25EZXNjLmlzT3BlcmF0aW9uUmV0dXJuaW5nUmVzdWx0KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInJlc3VsdE5hbWU1Iiwgb3BlcmF0aW9uRGVzYy5nZXRSZXN1bHROYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInBhcnROYW1lNSIsIG9wZXJhdGlvbkRlc2MuZ2V0UmVzdWx0UGFydE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiaHR0cDovL3Jlc3VsdC5iYXJlLnRlc3QudGFyZ2V0Lm5hbWVzcGFjZS41LyIsCi0gICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25EZXNjLmdldFJlc3VsdFRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShvcGVyYXRpb25EZXNjLmlzUmVzdWx0SGVhZGVyKCkpOwotCi0gICAgICAgIG9wZXJhdGlvbkRlc2MgPSB0ZXN0RW5kcG9pbnRJbnRlcmZhY2VEZXNjLmdldE9wZXJhdGlvbkZvckphdmFNZXRob2QoIm1ldGhvZDZfYmFyZSIpWzBdOwotICAgICAgICBhc3NlcnROb3ROdWxsKG9wZXJhdGlvbkRlc2MpOwotICAgICAgICBhc3NlcnROdWxsKCgoT3BlcmF0aW9uRGVzY3JpcHRpb25KYXZhKW9wZXJhdGlvbkRlc2MpLmdldEFubm9XZWJSZXN1bHQoKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKCgoT3BlcmF0aW9uRGVzY3JpcHRpb25KYXZhKW9wZXJhdGlvbkRlc2MpLmlzV2ViUmVzdWx0QW5ub3RhdGlvblNwZWNpZmllZCgpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2Uob3BlcmF0aW9uRGVzYy5pc09wZXJhdGlvblJldHVybmluZ1Jlc3VsdCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG51bGwsIG9wZXJhdGlvbkRlc2MuZ2V0UmVzdWx0TmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG51bGwsIG9wZXJhdGlvbkRlc2MuZ2V0UmVzdWx0UGFydE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhudWxsLCBvcGVyYXRpb25EZXNjLmdldFJlc3VsdFRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2Uob3BlcmF0aW9uRGVzYy5pc1Jlc3VsdEhlYWRlcigpKTsKLQotICAgICAgICBvcGVyYXRpb25EZXNjID0gdGVzdEVuZHBvaW50SW50ZXJmYWNlRGVzYy5nZXRPcGVyYXRpb25Gb3JKYXZhTWV0aG9kKCJtZXRob2Q3IilbMF07Ci0gICAgICAgIGFzc2VydE5vdE51bGwob3BlcmF0aW9uRGVzYyk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoKChPcGVyYXRpb25EZXNjcmlwdGlvbkphdmEpb3BlcmF0aW9uRGVzYykuZ2V0QW5ub1dlYlJlc3VsdCgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgoKE9wZXJhdGlvbkRlc2NyaXB0aW9uSmF2YSlvcGVyYXRpb25EZXNjKS5pc1dlYlJlc3VsdEFubm90YXRpb25TcGVjaWZpZWQoKSk7Ci0gICAgICAgIGFzc2VydFRydWUob3BlcmF0aW9uRGVzYy5pc09wZXJhdGlvblJldHVybmluZ1Jlc3VsdCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJyZXN1bHROYW1lNyIsIG9wZXJhdGlvbkRlc2MuZ2V0UmVzdWx0TmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJwYXJ0TmFtZTciLCBvcGVyYXRpb25EZXNjLmdldFJlc3VsdFBhcnROYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly9zZXJ2aWNlLnRlc3QudGFyZ2V0Lm5hbWVzcGFjZS8iLAotICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uRGVzYy5nZXRSZXN1bHRUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgIGFzc2VydFRydWUob3BlcmF0aW9uRGVzYy5pc1Jlc3VsdEhlYWRlcigpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0V2ViUGFyYW1XcmFwcGVkKCkgewotICAgICAgICBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uIHRlc3RFbmRwb2ludEludGVyZmFjZURlc2MgPQotICAgICAgICAgICAgICAgIGdldEVuZHBvaW50SW50ZXJmYWNlRGVzYyhXZWJQYXJhbVRlc3RJbXBsLmNsYXNzKTsKLQotICAgICAgICAvLyBET0NVTUVOVCAvIExJVEVSQUwgLyBXUkFQUEVEIG1ldGhvZHMKLQotICAgICAgICAvLyBtZXRob2QwCi0gICAgICAgIE9wZXJhdGlvbkRlc2NyaXB0aW9uW10gb3BlcmF0aW9uRGVzY3MgPQotICAgICAgICAgICAgICAgIHRlc3RFbmRwb2ludEludGVyZmFjZURlc2MuZ2V0T3BlcmF0aW9uRm9ySmF2YU1ldGhvZCgibWV0aG9kMCIpOwotICAgICAgICBhc3NlcnROdWxsKG9wZXJhdGlvbkRlc2NzKTsKLQotICAgICAgICAvLyBtZXRob2QwMAotICAgICAgICBvcGVyYXRpb25EZXNjcyA9IHRlc3RFbmRwb2ludEludGVyZmFjZURlc2MuZ2V0T3BlcmF0aW9uRm9ySmF2YU1ldGhvZCgibWV0aG9kMDAiKTsKLSAgICAgICAgYXNzZXJ0TnVsbChvcGVyYXRpb25EZXNjcyk7Ci0KLSAgICAgICAgLy8gbWV0aG9kMQotICAgICAgICBPcGVyYXRpb25EZXNjcmlwdGlvbiBvcGVyYXRpb25EZXNjID0KLSAgICAgICAgICAgICAgICB0ZXN0RW5kcG9pbnRJbnRlcmZhY2VEZXNjLmdldE9wZXJhdGlvbkZvckphdmFNZXRob2QoIm1ldGhvZDEiKVswXTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChvcGVyYXRpb25EZXNjKTsKLSAgICAgICAgUGFyYW1ldGVyRGVzY3JpcHRpb25bXSBwYXJhbURlc2MgPSBvcGVyYXRpb25EZXNjLmdldFBhcmFtZXRlckRlc2NyaXB0aW9ucygpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcGFyYW1EZXNjLmxlbmd0aCk7Ci0gICAgICAgIFBhcmFtZXRlckRlc2NyaXB0aW9uIGNoZWNrUGFyYW1EZXNjID0gcGFyYW1EZXNjWzBdOwotICAgICAgICBhc3NlcnROdWxsKCgoUGFyYW1ldGVyRGVzY3JpcHRpb25KYXZhKWNoZWNrUGFyYW1EZXNjKS5nZXRBbm5vV2ViUGFyYW0oKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiYXJnMCIsIGNoZWNrUGFyYW1EZXNjLmdldFBhcmFtZXRlck5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiYXJnMCIsIGNoZWNrUGFyYW1EZXNjLmdldFBhcnROYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoY2hlY2tQYXJhbURlc2MsIG9wZXJhdGlvbkRlc2MuZ2V0UGFyYW1ldGVyRGVzY3JpcHRpb24oMCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoY2hlY2tQYXJhbURlc2MsIG9wZXJhdGlvbkRlc2MuZ2V0UGFyYW1ldGVyRGVzY3JpcHRpb24oImFyZzAiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhTdHJpbmcuY2xhc3MsIGNoZWNrUGFyYW1EZXNjLmdldFBhcmFtZXRlclR5cGUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiIiwgY2hlY2tQYXJhbURlc2MuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoV2ViUGFyYW0uTW9kZS5JTiwgY2hlY2tQYXJhbURlc2MuZ2V0TW9kZSgpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoY2hlY2tQYXJhbURlc2MuaXNIZWFkZXIoKSk7Ci0KLSAgICAgICAgLy8gbWV0aG9kMgotICAgICAgICBvcGVyYXRpb25EZXNjID0gdGVzdEVuZHBvaW50SW50ZXJmYWNlRGVzYy5nZXRPcGVyYXRpb25Gb3JKYXZhTWV0aG9kKCJtZXRob2QyIilbMF07Ci0gICAgICAgIGFzc2VydE5vdE51bGwob3BlcmF0aW9uRGVzYyk7Ci0gICAgICAgIHBhcmFtRGVzYyA9IG9wZXJhdGlvbkRlc2MuZ2V0UGFyYW1ldGVyRGVzY3JpcHRpb25zKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBwYXJhbURlc2MubGVuZ3RoKTsKLSAgICAgICAgY2hlY2tQYXJhbURlc2MgPSBwYXJhbURlc2NbMF07Ci0gICAgICAgIGFzc2VydE5vdE51bGwoKChQYXJhbWV0ZXJEZXNjcmlwdGlvbkphdmEpY2hlY2tQYXJhbURlc2MpLmdldEFubm9XZWJQYXJhbSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJhcmcwIiwgY2hlY2tQYXJhbURlc2MuZ2V0UGFyYW1ldGVyTmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJhcmcwIiwgY2hlY2tQYXJhbURlc2MuZ2V0UGFydE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhjaGVja1BhcmFtRGVzYywgb3BlcmF0aW9uRGVzYy5nZXRQYXJhbWV0ZXJEZXNjcmlwdGlvbigwKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhjaGVja1BhcmFtRGVzYywgb3BlcmF0aW9uRGVzYy5nZXRQYXJhbWV0ZXJEZXNjcmlwdGlvbigiYXJnMCIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFN0cmluZy5jbGFzcywgY2hlY2tQYXJhbURlc2MuZ2V0UGFyYW1ldGVyVHlwZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBjaGVja1BhcmFtRGVzYy5nZXRUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhXZWJQYXJhbS5Nb2RlLklOLCBjaGVja1BhcmFtRGVzYy5nZXRNb2RlKCkpOwotICAgICAgICBhc3NlcnRGYWxzZShjaGVja1BhcmFtRGVzYy5pc0hlYWRlcigpKTsKLQotICAgICAgICAvLyBtZXRob2QzCi0gICAgICAgIG9wZXJhdGlvbkRlc2MgPSB0ZXN0RW5kcG9pbnRJbnRlcmZhY2VEZXNjLmdldE9wZXJhdGlvbkZvckphdmFNZXRob2QoIm1ldGhvZDMiKVswXTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChvcGVyYXRpb25EZXNjKTsKLSAgICAgICAgcGFyYW1EZXNjID0gb3BlcmF0aW9uRGVzYy5nZXRQYXJhbWV0ZXJEZXNjcmlwdGlvbnMoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDUsIHBhcmFtRGVzYy5sZW5ndGgpOwotICAgICAgICBjaGVja1BhcmFtRGVzYyA9IHBhcmFtRGVzY1swXTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgoKFBhcmFtZXRlckRlc2NyaXB0aW9uSmF2YSljaGVja1BhcmFtRGVzYykuZ2V0QW5ub1dlYlBhcmFtKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInBhcmFtME5hbWVNZXRob2QzIiwgY2hlY2tQYXJhbURlc2MuZ2V0UGFyYW1ldGVyTmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJwYXJhbTBOYW1lTWV0aG9kMyIsIGNoZWNrUGFyYW1EZXNjLmdldFBhcnROYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoY2hlY2tQYXJhbURlc2MsIG9wZXJhdGlvbkRlc2MuZ2V0UGFyYW1ldGVyRGVzY3JpcHRpb24oMCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoY2hlY2tQYXJhbURlc2MsIG9wZXJhdGlvbkRlc2MuZ2V0UGFyYW1ldGVyRGVzY3JpcHRpb24oInBhcmFtME5hbWVNZXRob2QzIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoU3RyaW5nLmNsYXNzLCBjaGVja1BhcmFtRGVzYy5nZXRQYXJhbWV0ZXJUeXBlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIGNoZWNrUGFyYW1EZXNjLmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFdlYlBhcmFtLk1vZGUuSU4sIGNoZWNrUGFyYW1EZXNjLmdldE1vZGUoKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKGNoZWNrUGFyYW1EZXNjLmlzSGVhZGVyKCkpOwotCi0gICAgICAgIGNoZWNrUGFyYW1EZXNjID0gcGFyYW1EZXNjWzFdOwotICAgICAgICBhc3NlcnROb3ROdWxsKCgoUGFyYW1ldGVyRGVzY3JpcHRpb25KYXZhKWNoZWNrUGFyYW1EZXNjKS5nZXRBbm5vV2ViUGFyYW0oKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygicGFyYW0xTmFtZU1ldGhvZDMiLCBjaGVja1BhcmFtRGVzYy5nZXRQYXJhbWV0ZXJOYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInBhcmFtMU5hbWVNZXRob2QzIiwgY2hlY2tQYXJhbURlc2MuZ2V0UGFydE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhjaGVja1BhcmFtRGVzYywgb3BlcmF0aW9uRGVzYy5nZXRQYXJhbWV0ZXJEZXNjcmlwdGlvbigxKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhjaGVja1BhcmFtRGVzYywgb3BlcmF0aW9uRGVzYy5nZXRQYXJhbWV0ZXJEZXNjcmlwdGlvbigicGFyYW0xTmFtZU1ldGhvZDMiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhIb2xkZXIuY2xhc3MsIGNoZWNrUGFyYW1EZXNjLmdldFBhcmFtZXRlclR5cGUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhJbnRlZ2VyLmNsYXNzLCBjaGVja1BhcmFtRGVzYy5nZXRQYXJhbWV0ZXJBY3R1YWxUeXBlKCkpOwotICAgICAgICBhc3NlcnRUcnVlKGNoZWNrUGFyYW1EZXNjLmlzSG9sZGVyVHlwZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBjaGVja1BhcmFtRGVzYy5nZXRUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhXZWJQYXJhbS5Nb2RlLklOT1VULCBjaGVja1BhcmFtRGVzYy5nZXRNb2RlKCkpOwotICAgICAgICBhc3NlcnRGYWxzZShjaGVja1BhcmFtRGVzYy5pc0hlYWRlcigpKTsKLQotICAgICAgICBjaGVja1BhcmFtRGVzYyA9IHBhcmFtRGVzY1syXTsKLSAgICAgICAgYXNzZXJ0TnVsbCgoKFBhcmFtZXRlckRlc2NyaXB0aW9uSmF2YSljaGVja1BhcmFtRGVzYykuZ2V0QW5ub1dlYlBhcmFtKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImFyZzIiLCBjaGVja1BhcmFtRGVzYy5nZXRQYXJhbWV0ZXJOYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImFyZzIiLCBjaGVja1BhcmFtRGVzYy5nZXRQYXJ0TmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNoZWNrUGFyYW1EZXNjLCBvcGVyYXRpb25EZXNjLmdldFBhcmFtZXRlckRlc2NyaXB0aW9uKDIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNoZWNrUGFyYW1EZXNjLCBvcGVyYXRpb25EZXNjLmdldFBhcmFtZXRlckRlc2NyaXB0aW9uKCJhcmcyIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoT2JqZWN0LmNsYXNzLCBjaGVja1BhcmFtRGVzYy5nZXRQYXJhbWV0ZXJUeXBlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIGNoZWNrUGFyYW1EZXNjLmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFdlYlBhcmFtLk1vZGUuSU4sIGNoZWNrUGFyYW1EZXNjLmdldE1vZGUoKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKGNoZWNrUGFyYW1EZXNjLmlzSGVhZGVyKCkpOwotCi0gICAgICAgIGNoZWNrUGFyYW1EZXNjID0gcGFyYW1EZXNjWzNdOwotICAgICAgICBhc3NlcnROdWxsKCgoUGFyYW1ldGVyRGVzY3JpcHRpb25KYXZhKWNoZWNrUGFyYW1EZXNjKS5nZXRBbm5vV2ViUGFyYW0oKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiYXJnMyIsIGNoZWNrUGFyYW1EZXNjLmdldFBhcmFtZXRlck5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiYXJnMyIsIGNoZWNrUGFyYW1EZXNjLmdldFBhcnROYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoY2hlY2tQYXJhbURlc2MsIG9wZXJhdGlvbkRlc2MuZ2V0UGFyYW1ldGVyRGVzY3JpcHRpb24oMykpOwotICAgICAgICBhc3NlcnRFcXVhbHMoY2hlY2tQYXJhbURlc2MsIG9wZXJhdGlvbkRlc2MuZ2V0UGFyYW1ldGVyRGVzY3JpcHRpb24oImFyZzMiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhJbnRlZ2VyLlRZUEUsIGNoZWNrUGFyYW1EZXNjLmdldFBhcmFtZXRlclR5cGUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiIiwgY2hlY2tQYXJhbURlc2MuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoV2ViUGFyYW0uTW9kZS5JTiwgY2hlY2tQYXJhbURlc2MuZ2V0TW9kZSgpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoY2hlY2tQYXJhbURlc2MuaXNIZWFkZXIoKSk7Ci0KLSAgICAgICAgY2hlY2tQYXJhbURlc2MgPSBwYXJhbURlc2NbNF07Ci0gICAgICAgIGFzc2VydE5vdE51bGwoKChQYXJhbWV0ZXJEZXNjcmlwdGlvbkphdmEpY2hlY2tQYXJhbURlc2MpLmdldEFubm9XZWJQYXJhbSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJsYXN0UGFyYW1OYW1lTWV0aG9kMyIsIGNoZWNrUGFyYW1EZXNjLmdldFBhcmFtZXRlck5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygibGFzdFBhcmFtTmFtZU1ldGhvZDMiLCBjaGVja1BhcmFtRGVzYy5nZXRQYXJ0TmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNoZWNrUGFyYW1EZXNjLCBvcGVyYXRpb25EZXNjLmdldFBhcmFtZXRlckRlc2NyaXB0aW9uKDQpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNoZWNrUGFyYW1EZXNjLCBvcGVyYXRpb25EZXNjLmdldFBhcmFtZXRlckRlc2NyaXB0aW9uKCJsYXN0UGFyYW1OYW1lTWV0aG9kMyIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFN0cmluZy5jbGFzcywgY2hlY2tQYXJhbURlc2MuZ2V0UGFyYW1ldGVyVHlwZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBjaGVja1BhcmFtRGVzYy5nZXRUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhXZWJQYXJhbS5Nb2RlLklOLCBjaGVja1BhcmFtRGVzYy5nZXRNb2RlKCkpOwotICAgICAgICBhc3NlcnRGYWxzZShjaGVja1BhcmFtRGVzYy5pc0hlYWRlcigpKTsKLQotICAgICAgICAvLyBtZXRob2Q0Ci0gICAgICAgIG9wZXJhdGlvbkRlc2MgPSB0ZXN0RW5kcG9pbnRJbnRlcmZhY2VEZXNjLmdldE9wZXJhdGlvbkZvckphdmFNZXRob2QoIm1ldGhvZDQiKVswXTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChvcGVyYXRpb25EZXNjKTsKLSAgICAgICAgcGFyYW1EZXNjID0gb3BlcmF0aW9uRGVzYy5nZXRQYXJhbWV0ZXJEZXNjcmlwdGlvbnMoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDUsIHBhcmFtRGVzYy5sZW5ndGgpOwotCi0gICAgICAgIGNoZWNrUGFyYW1EZXNjID0gcGFyYW1EZXNjWzBdOwotICAgICAgICBhc3NlcnROb3ROdWxsKCgoUGFyYW1ldGVyRGVzY3JpcHRpb25KYXZhKWNoZWNrUGFyYW1EZXNjKS5nZXRBbm5vV2ViUGFyYW0oKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygicGFyYW0wTmFtZU1ldGhvZDQiLCBjaGVja1BhcmFtRGVzYy5nZXRQYXJhbWV0ZXJOYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInBhcmFtMFBhcnROYW1lIiwgY2hlY2tQYXJhbURlc2MuZ2V0UGFydE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhjaGVja1BhcmFtRGVzYywgb3BlcmF0aW9uRGVzYy5nZXRQYXJhbWV0ZXJEZXNjcmlwdGlvbigwKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhjaGVja1BhcmFtRGVzYywgb3BlcmF0aW9uRGVzYy5nZXRQYXJhbWV0ZXJEZXNjcmlwdGlvbigicGFyYW0wTmFtZU1ldGhvZDQiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhTdHJpbmcuY2xhc3MsIGNoZWNrUGFyYW1EZXNjLmdldFBhcmFtZXRlclR5cGUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiaHR0cDovL3BhcmFtLjQuMC5yZXN1bHQudGVzdC50YXJnZXQubmFtZXNwYWNlLyIsCi0gICAgICAgICAgICAgICAgICAgICBjaGVja1BhcmFtRGVzYy5nZXRUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhXZWJQYXJhbS5Nb2RlLklOLCBjaGVja1BhcmFtRGVzYy5nZXRNb2RlKCkpOwotICAgICAgICBhc3NlcnRGYWxzZShjaGVja1BhcmFtRGVzYy5pc0hlYWRlcigpKTsKLQotICAgICAgICBjaGVja1BhcmFtRGVzYyA9IHBhcmFtRGVzY1sxXTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgoKFBhcmFtZXRlckRlc2NyaXB0aW9uSmF2YSljaGVja1BhcmFtRGVzYykuZ2V0QW5ub1dlYlBhcmFtKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInBhcmFtMU5hbWVNZXRob2Q0IiwgY2hlY2tQYXJhbURlc2MuZ2V0UGFyYW1ldGVyTmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJwYXJhbTFQYXJ0TmFtZSIsIGNoZWNrUGFyYW1EZXNjLmdldFBhcnROYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoY2hlY2tQYXJhbURlc2MsIG9wZXJhdGlvbkRlc2MuZ2V0UGFyYW1ldGVyRGVzY3JpcHRpb24oMSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoY2hlY2tQYXJhbURlc2MsIG9wZXJhdGlvbkRlc2MuZ2V0UGFyYW1ldGVyRGVzY3JpcHRpb24oInBhcmFtMU5hbWVNZXRob2Q0IikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoSW50ZWdlci5UWVBFLCBjaGVja1BhcmFtRGVzYy5nZXRQYXJhbWV0ZXJUeXBlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly9wYXJhbS40LjEucmVzdWx0LnRlc3QudGFyZ2V0Lm5hbWVzcGFjZS8iLAotICAgICAgICAgICAgICAgICAgICAgY2hlY2tQYXJhbURlc2MuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoV2ViUGFyYW0uTW9kZS5JTiwgY2hlY2tQYXJhbURlc2MuZ2V0TW9kZSgpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoY2hlY2tQYXJhbURlc2MuaXNIZWFkZXIoKSk7Ci0KLSAgICAgICAgY2hlY2tQYXJhbURlc2MgPSBwYXJhbURlc2NbMl07Ci0gICAgICAgIGFzc2VydE51bGwoKChQYXJhbWV0ZXJEZXNjcmlwdGlvbkphdmEpY2hlY2tQYXJhbURlc2MpLmdldEFubm9XZWJQYXJhbSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJhcmcyIiwgY2hlY2tQYXJhbURlc2MuZ2V0UGFyYW1ldGVyTmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJhcmcyIiwgY2hlY2tQYXJhbURlc2MuZ2V0UGFydE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhjaGVja1BhcmFtRGVzYywgb3BlcmF0aW9uRGVzYy5nZXRQYXJhbWV0ZXJEZXNjcmlwdGlvbigyKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhjaGVja1BhcmFtRGVzYywgb3BlcmF0aW9uRGVzYy5nZXRQYXJhbWV0ZXJEZXNjcmlwdGlvbigiYXJnMiIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKE9iamVjdC5jbGFzcywgY2hlY2tQYXJhbURlc2MuZ2V0UGFyYW1ldGVyVHlwZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBjaGVja1BhcmFtRGVzYy5nZXRUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhXZWJQYXJhbS5Nb2RlLklOLCBjaGVja1BhcmFtRGVzYy5nZXRNb2RlKCkpOwotICAgICAgICBhc3NlcnRGYWxzZShjaGVja1BhcmFtRGVzYy5pc0hlYWRlcigpKTsKLQotICAgICAgICBjaGVja1BhcmFtRGVzYyA9IHBhcmFtRGVzY1szXTsKLSAgICAgICAgYXNzZXJ0TnVsbCgoKFBhcmFtZXRlckRlc2NyaXB0aW9uSmF2YSljaGVja1BhcmFtRGVzYykuZ2V0QW5ub1dlYlBhcmFtKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImFyZzMiLCBjaGVja1BhcmFtRGVzYy5nZXRQYXJhbWV0ZXJOYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImFyZzMiLCBjaGVja1BhcmFtRGVzYy5nZXRQYXJ0TmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNoZWNrUGFyYW1EZXNjLCBvcGVyYXRpb25EZXNjLmdldFBhcmFtZXRlckRlc2NyaXB0aW9uKDMpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNoZWNrUGFyYW1EZXNjLCBvcGVyYXRpb25EZXNjLmdldFBhcmFtZXRlckRlc2NyaXB0aW9uKCJhcmczIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoSG9sZGVyLmNsYXNzLCBjaGVja1BhcmFtRGVzYy5nZXRQYXJhbWV0ZXJUeXBlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoSW50ZWdlci5jbGFzcywgY2hlY2tQYXJhbURlc2MuZ2V0UGFyYW1ldGVyQWN0dWFsVHlwZSgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShjaGVja1BhcmFtRGVzYy5pc0hvbGRlclR5cGUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiIiwgY2hlY2tQYXJhbURlc2MuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoV2ViUGFyYW0uTW9kZS5JTk9VVCwgY2hlY2tQYXJhbURlc2MuZ2V0TW9kZSgpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoY2hlY2tQYXJhbURlc2MuaXNIZWFkZXIoKSk7Ci0KLSAgICAgICAgY2hlY2tQYXJhbURlc2MgPSBwYXJhbURlc2NbNF07Ci0gICAgICAgIGFzc2VydE5vdE51bGwoKChQYXJhbWV0ZXJEZXNjcmlwdGlvbkphdmEpY2hlY2tQYXJhbURlc2MpLmdldEFubm9XZWJQYXJhbSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJsYXN0UGFyYW1OYW1lTWV0aG9kNCIsIGNoZWNrUGFyYW1EZXNjLmdldFBhcmFtZXRlck5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygibGFzdFBhcmFtTmFtZU1ldGhvZDQiLCBjaGVja1BhcmFtRGVzYy5nZXRQYXJ0TmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNoZWNrUGFyYW1EZXNjLCBvcGVyYXRpb25EZXNjLmdldFBhcmFtZXRlckRlc2NyaXB0aW9uKDQpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNoZWNrUGFyYW1EZXNjLCBvcGVyYXRpb25EZXNjLmdldFBhcmFtZXRlckRlc2NyaXB0aW9uKCJsYXN0UGFyYW1OYW1lTWV0aG9kNCIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFN0cmluZy5jbGFzcywgY2hlY2tQYXJhbURlc2MuZ2V0UGFyYW1ldGVyVHlwZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBjaGVja1BhcmFtRGVzYy5nZXRUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhXZWJQYXJhbS5Nb2RlLklOLCBjaGVja1BhcmFtRGVzYy5nZXRNb2RlKCkpOwotICAgICAgICBhc3NlcnRGYWxzZShjaGVja1BhcmFtRGVzYy5pc0hlYWRlcigpKTsKLQotICAgICAgICAvLyBtZXRob2Q1Ci0gICAgICAgIG9wZXJhdGlvbkRlc2MgPSB0ZXN0RW5kcG9pbnRJbnRlcmZhY2VEZXNjLmdldE9wZXJhdGlvbkZvckphdmFNZXRob2QoIm1ldGhvZDUiKVswXTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChvcGVyYXRpb25EZXNjKTsKLSAgICAgICAgcGFyYW1EZXNjID0gb3BlcmF0aW9uRGVzYy5nZXRQYXJhbWV0ZXJEZXNjcmlwdGlvbnMoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDUsIHBhcmFtRGVzYy5sZW5ndGgpOwotCi0gICAgICAgIGNoZWNrUGFyYW1EZXNjID0gcGFyYW1EZXNjWzBdOwotICAgICAgICBhc3NlcnROb3ROdWxsKCgoUGFyYW1ldGVyRGVzY3JpcHRpb25KYXZhKWNoZWNrUGFyYW1EZXNjKS5nZXRBbm5vV2ViUGFyYW0oKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygicGFyYW0wTmFtZU1ldGhvZDUiLCBjaGVja1BhcmFtRGVzYy5nZXRQYXJhbWV0ZXJOYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInBhcmFtMFBhcnROYW1lIiwgY2hlY2tQYXJhbURlc2MuZ2V0UGFydE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhjaGVja1BhcmFtRGVzYywgb3BlcmF0aW9uRGVzYy5nZXRQYXJhbWV0ZXJEZXNjcmlwdGlvbigwKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhjaGVja1BhcmFtRGVzYywgb3BlcmF0aW9uRGVzYy5nZXRQYXJhbWV0ZXJEZXNjcmlwdGlvbigicGFyYW0wTmFtZU1ldGhvZDUiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhTdHJpbmcuY2xhc3MsIGNoZWNrUGFyYW1EZXNjLmdldFBhcmFtZXRlclR5cGUoKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKGNoZWNrUGFyYW1EZXNjLmlzSG9sZGVyVHlwZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJodHRwOi8vcGFyYW0uNS4wLnJlc3VsdC50ZXN0LnRhcmdldC5uYW1lc3BhY2UvIiwKLSAgICAgICAgICAgICAgICAgICAgIGNoZWNrUGFyYW1EZXNjLmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFdlYlBhcmFtLk1vZGUuSU4sIGNoZWNrUGFyYW1EZXNjLmdldE1vZGUoKSk7Ci0gICAgICAgIGFzc2VydFRydWUoY2hlY2tQYXJhbURlc2MuaXNIZWFkZXIoKSk7Ci0KLSAgICAgICAgY2hlY2tQYXJhbURlc2MgPSBwYXJhbURlc2NbMV07Ci0gICAgICAgIGFzc2VydE5vdE51bGwoKChQYXJhbWV0ZXJEZXNjcmlwdGlvbkphdmEpY2hlY2tQYXJhbURlc2MpLmdldEFubm9XZWJQYXJhbSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJwYXJhbTFOYW1lTWV0aG9kNSIsIGNoZWNrUGFyYW1EZXNjLmdldFBhcmFtZXRlck5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygicGFyYW0xUGFydE5hbWUiLCBjaGVja1BhcmFtRGVzYy5nZXRQYXJ0TmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNoZWNrUGFyYW1EZXNjLCBvcGVyYXRpb25EZXNjLmdldFBhcmFtZXRlckRlc2NyaXB0aW9uKDEpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNoZWNrUGFyYW1EZXNjLCBvcGVyYXRpb25EZXNjLmdldFBhcmFtZXRlckRlc2NyaXB0aW9uKCJwYXJhbTFOYW1lTWV0aG9kNSIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEludGVnZXIuVFlQRSwgY2hlY2tQYXJhbURlc2MuZ2V0UGFyYW1ldGVyVHlwZSgpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoY2hlY2tQYXJhbURlc2MuaXNIb2xkZXJUeXBlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly9wYXJhbS41LjEucmVzdWx0LnRlc3QudGFyZ2V0Lm5hbWVzcGFjZS8iLAotICAgICAgICAgICAgICAgICAgICAgY2hlY2tQYXJhbURlc2MuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoV2ViUGFyYW0uTW9kZS5JTiwgY2hlY2tQYXJhbURlc2MuZ2V0TW9kZSgpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoY2hlY2tQYXJhbURlc2MuaXNIZWFkZXIoKSk7Ci0KLSAgICAgICAgY2hlY2tQYXJhbURlc2MgPSBwYXJhbURlc2NbMl07Ci0gICAgICAgIGFzc2VydE51bGwoKChQYXJhbWV0ZXJEZXNjcmlwdGlvbkphdmEpY2hlY2tQYXJhbURlc2MpLmdldEFubm9XZWJQYXJhbSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJhcmcyIiwgY2hlY2tQYXJhbURlc2MuZ2V0UGFyYW1ldGVyTmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJhcmcyIiwgY2hlY2tQYXJhbURlc2MuZ2V0UGFydE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhjaGVja1BhcmFtRGVzYywgb3BlcmF0aW9uRGVzYy5nZXRQYXJhbWV0ZXJEZXNjcmlwdGlvbigyKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhjaGVja1BhcmFtRGVzYywgb3BlcmF0aW9uRGVzYy5nZXRQYXJhbWV0ZXJEZXNjcmlwdGlvbigiYXJnMiIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEhvbGRlci5jbGFzcywgY2hlY2tQYXJhbURlc2MuZ2V0UGFyYW1ldGVyVHlwZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKE9iamVjdC5jbGFzcywgY2hlY2tQYXJhbURlc2MuZ2V0UGFyYW1ldGVyQWN0dWFsVHlwZSgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShjaGVja1BhcmFtRGVzYy5pc0hvbGRlclR5cGUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiIiwgY2hlY2tQYXJhbURlc2MuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoV2ViUGFyYW0uTW9kZS5JTk9VVCwgY2hlY2tQYXJhbURlc2MuZ2V0TW9kZSgpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoY2hlY2tQYXJhbURlc2MuaXNIZWFkZXIoKSk7Ci0KLSAgICAgICAgY2hlY2tQYXJhbURlc2MgPSBwYXJhbURlc2NbM107Ci0gICAgICAgIGFzc2VydE51bGwoKChQYXJhbWV0ZXJEZXNjcmlwdGlvbkphdmEpY2hlY2tQYXJhbURlc2MpLmdldEFubm9XZWJQYXJhbSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJhcmczIiwgY2hlY2tQYXJhbURlc2MuZ2V0UGFyYW1ldGVyTmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJhcmczIiwgY2hlY2tQYXJhbURlc2MuZ2V0UGFydE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhjaGVja1BhcmFtRGVzYywgb3BlcmF0aW9uRGVzYy5nZXRQYXJhbWV0ZXJEZXNjcmlwdGlvbigzKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhjaGVja1BhcmFtRGVzYywgb3BlcmF0aW9uRGVzYy5nZXRQYXJhbWV0ZXJEZXNjcmlwdGlvbigiYXJnMyIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEludGVnZXIuVFlQRSwgY2hlY2tQYXJhbURlc2MuZ2V0UGFyYW1ldGVyVHlwZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBjaGVja1BhcmFtRGVzYy5nZXRUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhXZWJQYXJhbS5Nb2RlLklOLCBjaGVja1BhcmFtRGVzYy5nZXRNb2RlKCkpOwotICAgICAgICBhc3NlcnRGYWxzZShjaGVja1BhcmFtRGVzYy5pc0hlYWRlcigpKTsKLQotICAgICAgICBjaGVja1BhcmFtRGVzYyA9IHBhcmFtRGVzY1s0XTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgoKFBhcmFtZXRlckRlc2NyaXB0aW9uSmF2YSljaGVja1BhcmFtRGVzYykuZ2V0QW5ub1dlYlBhcmFtKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImxhc3RQYXJhbU5hbWVNZXRob2Q1IiwgY2hlY2tQYXJhbURlc2MuZ2V0UGFyYW1ldGVyTmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJsYXN0UGFyYW1OYW1lTWV0aG9kNSIsIGNoZWNrUGFyYW1EZXNjLmdldFBhcnROYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoY2hlY2tQYXJhbURlc2MsIG9wZXJhdGlvbkRlc2MuZ2V0UGFyYW1ldGVyRGVzY3JpcHRpb24oNCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoY2hlY2tQYXJhbURlc2MsIG9wZXJhdGlvbkRlc2MuZ2V0UGFyYW1ldGVyRGVzY3JpcHRpb24oImxhc3RQYXJhbU5hbWVNZXRob2Q1IikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoSG9sZGVyLmNsYXNzLCBjaGVja1BhcmFtRGVzYy5nZXRQYXJhbWV0ZXJUeXBlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoU3RyaW5nLmNsYXNzLCBjaGVja1BhcmFtRGVzYy5nZXRQYXJhbWV0ZXJBY3R1YWxUeXBlKCkpOwotICAgICAgICBhc3NlcnRUcnVlKGNoZWNrUGFyYW1EZXNjLmlzSG9sZGVyVHlwZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBjaGVja1BhcmFtRGVzYy5nZXRUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhXZWJQYXJhbS5Nb2RlLk9VVCwgY2hlY2tQYXJhbURlc2MuZ2V0TW9kZSgpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoY2hlY2tQYXJhbURlc2MuaXNIZWFkZXIoKSk7Ci0KLSAgICAgICAgLy8gbWV0aG9kNgotICAgICAgICBvcGVyYXRpb25EZXNjID0gdGVzdEVuZHBvaW50SW50ZXJmYWNlRGVzYy5nZXRPcGVyYXRpb25Gb3JKYXZhTWV0aG9kKCJtZXRob2Q2IilbMF07Ci0gICAgICAgIGFzc2VydE5vdE51bGwob3BlcmF0aW9uRGVzYyk7Ci0gICAgICAgIHBhcmFtRGVzYyA9IG9wZXJhdGlvbkRlc2MuZ2V0UGFyYW1ldGVyRGVzY3JpcHRpb25zKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyg1LCBwYXJhbURlc2MubGVuZ3RoKTsKLQotICAgICAgICBjaGVja1BhcmFtRGVzYyA9IHBhcmFtRGVzY1swXTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgoKFBhcmFtZXRlckRlc2NyaXB0aW9uSmF2YSljaGVja1BhcmFtRGVzYykuZ2V0QW5ub1dlYlBhcmFtKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInBhcmFtME5hbWVNZXRob2Q2IiwgY2hlY2tQYXJhbURlc2MuZ2V0UGFyYW1ldGVyTmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJwYXJhbTBQYXJ0TmFtZSIsIGNoZWNrUGFyYW1EZXNjLmdldFBhcnROYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoY2hlY2tQYXJhbURlc2MsIG9wZXJhdGlvbkRlc2MuZ2V0UGFyYW1ldGVyRGVzY3JpcHRpb24oMCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoY2hlY2tQYXJhbURlc2MsIG9wZXJhdGlvbkRlc2MuZ2V0UGFyYW1ldGVyRGVzY3JpcHRpb24oInBhcmFtME5hbWVNZXRob2Q2IikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoU3RyaW5nLmNsYXNzLCBjaGVja1BhcmFtRGVzYy5nZXRQYXJhbWV0ZXJUeXBlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly9wYXJhbS5zZXJ2aWNlLnRlc3QudGFyZ2V0Lm5hbWVzcGFjZS8iLAotICAgICAgICAgICAgICAgICAgICAgY2hlY2tQYXJhbURlc2MuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoV2ViUGFyYW0uTW9kZS5JTiwgY2hlY2tQYXJhbURlc2MuZ2V0TW9kZSgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShjaGVja1BhcmFtRGVzYy5pc0hlYWRlcigpKTsKLQotICAgICAgICBjaGVja1BhcmFtRGVzYyA9IHBhcmFtRGVzY1sxXTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgoKFBhcmFtZXRlckRlc2NyaXB0aW9uSmF2YSljaGVja1BhcmFtRGVzYykuZ2V0QW5ub1dlYlBhcmFtKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInBhcmFtMU5hbWVNZXRob2Q2IiwgY2hlY2tQYXJhbURlc2MuZ2V0UGFyYW1ldGVyTmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJwYXJhbTFQYXJ0TmFtZSIsIGNoZWNrUGFyYW1EZXNjLmdldFBhcnROYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoY2hlY2tQYXJhbURlc2MsIG9wZXJhdGlvbkRlc2MuZ2V0UGFyYW1ldGVyRGVzY3JpcHRpb24oMSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoY2hlY2tQYXJhbURlc2MsIG9wZXJhdGlvbkRlc2MuZ2V0UGFyYW1ldGVyRGVzY3JpcHRpb24oInBhcmFtMU5hbWVNZXRob2Q2IikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoSW50ZWdlci5UWVBFLCBjaGVja1BhcmFtRGVzYy5nZXRQYXJhbWV0ZXJUeXBlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIGNoZWNrUGFyYW1EZXNjLmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFdlYlBhcmFtLk1vZGUuSU4sIGNoZWNrUGFyYW1EZXNjLmdldE1vZGUoKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKGNoZWNrUGFyYW1EZXNjLmlzSGVhZGVyKCkpOwotCi0gICAgICAgIGNoZWNrUGFyYW1EZXNjID0gcGFyYW1EZXNjWzJdOwotICAgICAgICBhc3NlcnROdWxsKCgoUGFyYW1ldGVyRGVzY3JpcHRpb25KYXZhKWNoZWNrUGFyYW1EZXNjKS5nZXRBbm5vV2ViUGFyYW0oKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiYXJnMiIsIGNoZWNrUGFyYW1EZXNjLmdldFBhcmFtZXRlck5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiYXJnMiIsIGNoZWNrUGFyYW1EZXNjLmdldFBhcnROYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoY2hlY2tQYXJhbURlc2MsIG9wZXJhdGlvbkRlc2MuZ2V0UGFyYW1ldGVyRGVzY3JpcHRpb24oMikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoY2hlY2tQYXJhbURlc2MsIG9wZXJhdGlvbkRlc2MuZ2V0UGFyYW1ldGVyRGVzY3JpcHRpb24oImFyZzIiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhPYmplY3QuY2xhc3MsIGNoZWNrUGFyYW1EZXNjLmdldFBhcmFtZXRlclR5cGUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiIiwgY2hlY2tQYXJhbURlc2MuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoV2ViUGFyYW0uTW9kZS5JTiwgY2hlY2tQYXJhbURlc2MuZ2V0TW9kZSgpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoY2hlY2tQYXJhbURlc2MuaXNIZWFkZXIoKSk7Ci0KLSAgICAgICAgY2hlY2tQYXJhbURlc2MgPSBwYXJhbURlc2NbM107Ci0gICAgICAgIGFzc2VydE51bGwoKChQYXJhbWV0ZXJEZXNjcmlwdGlvbkphdmEpY2hlY2tQYXJhbURlc2MpLmdldEFubm9XZWJQYXJhbSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJhcmczIiwgY2hlY2tQYXJhbURlc2MuZ2V0UGFyYW1ldGVyTmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJhcmczIiwgY2hlY2tQYXJhbURlc2MuZ2V0UGFydE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhjaGVja1BhcmFtRGVzYywgb3BlcmF0aW9uRGVzYy5nZXRQYXJhbWV0ZXJEZXNjcmlwdGlvbigzKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhjaGVja1BhcmFtRGVzYywgb3BlcmF0aW9uRGVzYy5nZXRQYXJhbWV0ZXJEZXNjcmlwdGlvbigiYXJnMyIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEludGVnZXIuVFlQRSwgY2hlY2tQYXJhbURlc2MuZ2V0UGFyYW1ldGVyVHlwZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBjaGVja1BhcmFtRGVzYy5nZXRUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhXZWJQYXJhbS5Nb2RlLklOLCBjaGVja1BhcmFtRGVzYy5nZXRNb2RlKCkpOwotICAgICAgICBhc3NlcnRGYWxzZShjaGVja1BhcmFtRGVzYy5pc0hlYWRlcigpKTsKLQotICAgICAgICBjaGVja1BhcmFtRGVzYyA9IHBhcmFtRGVzY1s0XTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgoKFBhcmFtZXRlckRlc2NyaXB0aW9uSmF2YSljaGVja1BhcmFtRGVzYykuZ2V0QW5ub1dlYlBhcmFtKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImxhc3RQYXJhbU5hbWVNZXRob2Q2IiwgY2hlY2tQYXJhbURlc2MuZ2V0UGFyYW1ldGVyTmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJsYXN0UGFyYW1OYW1lTWV0aG9kNiIsIGNoZWNrUGFyYW1EZXNjLmdldFBhcnROYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoY2hlY2tQYXJhbURlc2MsIG9wZXJhdGlvbkRlc2MuZ2V0UGFyYW1ldGVyRGVzY3JpcHRpb24oNCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoY2hlY2tQYXJhbURlc2MsIG9wZXJhdGlvbkRlc2MuZ2V0UGFyYW1ldGVyRGVzY3JpcHRpb24oImxhc3RQYXJhbU5hbWVNZXRob2Q2IikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoU3RyaW5nLmNsYXNzLCBjaGVja1BhcmFtRGVzYy5nZXRQYXJhbWV0ZXJUeXBlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIGNoZWNrUGFyYW1EZXNjLmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFdlYlBhcmFtLk1vZGUuSU4sIGNoZWNrUGFyYW1EZXNjLmdldE1vZGUoKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKGNoZWNrUGFyYW1EZXNjLmlzSGVhZGVyKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RXZWJQYXJhbUJhcmUoKSB7Ci0gICAgICAgIEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24gdGVzdEVuZHBvaW50SW50ZXJmYWNlRGVzYyA9Ci0gICAgICAgICAgICAgICAgZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjKFdlYlBhcmFtVGVzdEltcGwuY2xhc3MpOwotCi0gICAgICAgIC8vIERPQ1VNRU5UIC8gTElURVJBTCAvIEJBUkUgbWV0aG9kcwotICAgICAgICBPcGVyYXRpb25EZXNjcmlwdGlvbltdIG9wZXJhdGlvbkRlc2NzID0KLSAgICAgICAgICAgICAgICB0ZXN0RW5kcG9pbnRJbnRlcmZhY2VEZXNjLmdldE9wZXJhdGlvbkZvckphdmFNZXRob2QoIm1ldGhvZDBfYmFyZSIpOwotICAgICAgICBhc3NlcnROdWxsKG9wZXJhdGlvbkRlc2NzKTsKLQotICAgICAgICAvLyBtZXRob2QwMAotICAgICAgICBvcGVyYXRpb25EZXNjcyA9IHRlc3RFbmRwb2ludEludGVyZmFjZURlc2MuZ2V0T3BlcmF0aW9uRm9ySmF2YU1ldGhvZCgibWV0aG9kMDBfYmFyZSIpOwotICAgICAgICBhc3NlcnROdWxsKG9wZXJhdGlvbkRlc2NzKTsKLQotICAgICAgICAvLyBtZXRob2QxCi0gICAgICAgIE9wZXJhdGlvbkRlc2NyaXB0aW9uIG9wZXJhdGlvbkRlc2MgPQotICAgICAgICAgICAgICAgIHRlc3RFbmRwb2ludEludGVyZmFjZURlc2MuZ2V0T3BlcmF0aW9uRm9ySmF2YU1ldGhvZCgibWV0aG9kMV9iYXJlIilbMF07Ci0gICAgICAgIGFzc2VydE5vdE51bGwob3BlcmF0aW9uRGVzYyk7Ci0gICAgICAgIFBhcmFtZXRlckRlc2NyaXB0aW9uW10gcGFyYW1EZXNjID0gb3BlcmF0aW9uRGVzYy5nZXRQYXJhbWV0ZXJEZXNjcmlwdGlvbnMoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHBhcmFtRGVzYy5sZW5ndGgpOwotICAgICAgICBQYXJhbWV0ZXJEZXNjcmlwdGlvbiBjaGVja1BhcmFtRGVzYyA9IHBhcmFtRGVzY1swXTsKLSAgICAgICAgYXNzZXJ0TnVsbCgoKFBhcmFtZXRlckRlc2NyaXB0aW9uSmF2YSljaGVja1BhcmFtRGVzYykuZ2V0QW5ub1dlYlBhcmFtKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInJlbmFtZWRNZXRob2QxIiwgY2hlY2tQYXJhbURlc2MuZ2V0UGFyYW1ldGVyTmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJyZW5hbWVkTWV0aG9kMSIsIGNoZWNrUGFyYW1EZXNjLmdldFBhcnROYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoY2hlY2tQYXJhbURlc2MsIG9wZXJhdGlvbkRlc2MuZ2V0UGFyYW1ldGVyRGVzY3JpcHRpb24oMCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoY2hlY2tQYXJhbURlc2MsIG9wZXJhdGlvbkRlc2MuZ2V0UGFyYW1ldGVyRGVzY3JpcHRpb24oInJlbmFtZWRNZXRob2QxIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoU3RyaW5nLmNsYXNzLCBjaGVja1BhcmFtRGVzYy5nZXRQYXJhbWV0ZXJUeXBlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly9wYXJhbS5zZXJ2aWNlLnRlc3QudGFyZ2V0Lm5hbWVzcGFjZS8iLAotICAgICAgICAgICAgICAgICAgICAgY2hlY2tQYXJhbURlc2MuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoV2ViUGFyYW0uTW9kZS5JTiwgY2hlY2tQYXJhbURlc2MuZ2V0TW9kZSgpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoY2hlY2tQYXJhbURlc2MuaXNIZWFkZXIoKSk7Ci0KLSAgICAgICAgLy8gbWV0aG9kMgotICAgICAgICBvcGVyYXRpb25EZXNjID0gdGVzdEVuZHBvaW50SW50ZXJmYWNlRGVzYy5nZXRPcGVyYXRpb25Gb3JKYXZhTWV0aG9kKCJtZXRob2QyX2JhcmUiKVswXTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChvcGVyYXRpb25EZXNjKTsKLSAgICAgICAgcGFyYW1EZXNjID0gb3BlcmF0aW9uRGVzYy5nZXRQYXJhbWV0ZXJEZXNjcmlwdGlvbnMoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHBhcmFtRGVzYy5sZW5ndGgpOwotICAgICAgICBjaGVja1BhcmFtRGVzYyA9IHBhcmFtRGVzY1swXTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgoKFBhcmFtZXRlckRlc2NyaXB0aW9uSmF2YSljaGVja1BhcmFtRGVzYykuZ2V0QW5ub1dlYlBhcmFtKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInJlbmFtZWRNZXRob2QyIiwgY2hlY2tQYXJhbURlc2MuZ2V0UGFyYW1ldGVyTmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJyZW5hbWVkTWV0aG9kMiIsIGNoZWNrUGFyYW1EZXNjLmdldFBhcnROYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoY2hlY2tQYXJhbURlc2MsIG9wZXJhdGlvbkRlc2MuZ2V0UGFyYW1ldGVyRGVzY3JpcHRpb24oMCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoY2hlY2tQYXJhbURlc2MsIG9wZXJhdGlvbkRlc2MuZ2V0UGFyYW1ldGVyRGVzY3JpcHRpb24oInJlbmFtZWRNZXRob2QyIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoU3RyaW5nLmNsYXNzLCBjaGVja1BhcmFtRGVzYy5nZXRQYXJhbWV0ZXJUeXBlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly9wYXJhbS5zZXJ2aWNlLnRlc3QudGFyZ2V0Lm5hbWVzcGFjZS8iLAotICAgICAgICAgICAgICAgICAgICAgY2hlY2tQYXJhbURlc2MuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoV2ViUGFyYW0uTW9kZS5JTiwgY2hlY2tQYXJhbURlc2MuZ2V0TW9kZSgpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoY2hlY2tQYXJhbURlc2MuaXNIZWFkZXIoKSk7Ci0KLSAgICAgICAgLy8gbWV0aG9kMwotICAgICAgICBvcGVyYXRpb25EZXNjID0gdGVzdEVuZHBvaW50SW50ZXJmYWNlRGVzYy5nZXRPcGVyYXRpb25Gb3JKYXZhTWV0aG9kKCJtZXRob2QzX2JhcmUiKVswXTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChvcGVyYXRpb25EZXNjKTsKLSAgICAgICAgcGFyYW1EZXNjID0gb3BlcmF0aW9uRGVzYy5nZXRQYXJhbWV0ZXJEZXNjcmlwdGlvbnMoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHBhcmFtRGVzYy5sZW5ndGgpOwotICAgICAgICBjaGVja1BhcmFtRGVzYyA9IHBhcmFtRGVzY1swXTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgoKFBhcmFtZXRlckRlc2NyaXB0aW9uSmF2YSljaGVja1BhcmFtRGVzYykuZ2V0QW5ub1dlYlBhcmFtKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInBhcmFtMU5hbWVNZXRob2QzIiwgY2hlY2tQYXJhbURlc2MuZ2V0UGFyYW1ldGVyTmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJwYXJhbTFOYW1lTWV0aG9kMyIsIGNoZWNrUGFyYW1EZXNjLmdldFBhcnROYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoY2hlY2tQYXJhbURlc2MsIG9wZXJhdGlvbkRlc2MuZ2V0UGFyYW1ldGVyRGVzY3JpcHRpb24oMCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoY2hlY2tQYXJhbURlc2MsIG9wZXJhdGlvbkRlc2MuZ2V0UGFyYW1ldGVyRGVzY3JpcHRpb24oInBhcmFtMU5hbWVNZXRob2QzIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoSG9sZGVyLmNsYXNzLCBjaGVja1BhcmFtRGVzYy5nZXRQYXJhbWV0ZXJUeXBlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoSW50ZWdlci5jbGFzcywgY2hlY2tQYXJhbURlc2MuZ2V0UGFyYW1ldGVyQWN0dWFsVHlwZSgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShjaGVja1BhcmFtRGVzYy5pc0hvbGRlclR5cGUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiaHR0cDovL3BhcmFtLnNlcnZpY2UudGVzdC50YXJnZXQubmFtZXNwYWNlLyIsCi0gICAgICAgICAgICAgICAgICAgICBjaGVja1BhcmFtRGVzYy5nZXRUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhXZWJQYXJhbS5Nb2RlLklOT1VULCBjaGVja1BhcmFtRGVzYy5nZXRNb2RlKCkpOwotICAgICAgICBhc3NlcnRGYWxzZShjaGVja1BhcmFtRGVzYy5pc0hlYWRlcigpKTsKLQotICAgICAgICAvLyBtZXRob2Q0Ci0gICAgICAgIG9wZXJhdGlvbkRlc2MgPSB0ZXN0RW5kcG9pbnRJbnRlcmZhY2VEZXNjLmdldE9wZXJhdGlvbkZvckphdmFNZXRob2QoIm1ldGhvZDRfYmFyZSIpWzBdOwotICAgICAgICBhc3NlcnROb3ROdWxsKG9wZXJhdGlvbkRlc2MpOwotICAgICAgICBwYXJhbURlc2MgPSBvcGVyYXRpb25EZXNjLmdldFBhcmFtZXRlckRlc2NyaXB0aW9ucygpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcGFyYW1EZXNjLmxlbmd0aCk7Ci0KLSAgICAgICAgY2hlY2tQYXJhbURlc2MgPSBwYXJhbURlc2NbMF07Ci0gICAgICAgIGFzc2VydE51bGwoKChQYXJhbWV0ZXJEZXNjcmlwdGlvbkphdmEpY2hlY2tQYXJhbURlc2MpLmdldEFubm9XZWJQYXJhbSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJyZW5hbWVkTWV0aG9kNCIsIGNoZWNrUGFyYW1EZXNjLmdldFBhcmFtZXRlck5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygicmVuYW1lZE1ldGhvZDQiLCBjaGVja1BhcmFtRGVzYy5nZXRQYXJ0TmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNoZWNrUGFyYW1EZXNjLCBvcGVyYXRpb25EZXNjLmdldFBhcmFtZXRlckRlc2NyaXB0aW9uKDApKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNoZWNrUGFyYW1EZXNjLCBvcGVyYXRpb25EZXNjLmdldFBhcmFtZXRlckRlc2NyaXB0aW9uKCJyZW5hbWVkTWV0aG9kNCIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEhvbGRlci5jbGFzcywgY2hlY2tQYXJhbURlc2MuZ2V0UGFyYW1ldGVyVHlwZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEludGVnZXIuY2xhc3MsIGNoZWNrUGFyYW1EZXNjLmdldFBhcmFtZXRlckFjdHVhbFR5cGUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiaHR0cDovL3BhcmFtLnNlcnZpY2UudGVzdC50YXJnZXQubmFtZXNwYWNlLyIsCi0gICAgICAgICAgICAgICAgICAgICBjaGVja1BhcmFtRGVzYy5nZXRUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhXZWJQYXJhbS5Nb2RlLklOT1VULCBjaGVja1BhcmFtRGVzYy5nZXRNb2RlKCkpOwotICAgICAgICBhc3NlcnRGYWxzZShjaGVja1BhcmFtRGVzYy5pc0hlYWRlcigpKTsKLQotICAgICAgICAvLyBtZXRob2Q1Ci0gICAgICAgIG9wZXJhdGlvbkRlc2MgPSB0ZXN0RW5kcG9pbnRJbnRlcmZhY2VEZXNjLmdldE9wZXJhdGlvbkZvckphdmFNZXRob2QoIm1ldGhvZDVfYmFyZSIpWzBdOwotICAgICAgICBhc3NlcnROb3ROdWxsKG9wZXJhdGlvbkRlc2MpOwotICAgICAgICBwYXJhbURlc2MgPSBvcGVyYXRpb25EZXNjLmdldFBhcmFtZXRlckRlc2NyaXB0aW9ucygpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcGFyYW1EZXNjLmxlbmd0aCk7Ci0KLSAgICAgICAgY2hlY2tQYXJhbURlc2MgPSBwYXJhbURlc2NbMF07Ci0gICAgICAgIGFzc2VydE5vdE51bGwoKChQYXJhbWV0ZXJEZXNjcmlwdGlvbkphdmEpY2hlY2tQYXJhbURlc2MpLmdldEFubm9XZWJQYXJhbSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJsYXN0UGFyYW1OYW1lTWV0aG9kNSIsIGNoZWNrUGFyYW1EZXNjLmdldFBhcmFtZXRlck5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygibGFzdFBhcmFtTmFtZU1ldGhvZDUiLCBjaGVja1BhcmFtRGVzYy5nZXRQYXJ0TmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNoZWNrUGFyYW1EZXNjLCBvcGVyYXRpb25EZXNjLmdldFBhcmFtZXRlckRlc2NyaXB0aW9uKDApKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNoZWNrUGFyYW1EZXNjLCBvcGVyYXRpb25EZXNjLmdldFBhcmFtZXRlckRlc2NyaXB0aW9uKCJsYXN0UGFyYW1OYW1lTWV0aG9kNSIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEhvbGRlci5jbGFzcywgY2hlY2tQYXJhbURlc2MuZ2V0UGFyYW1ldGVyVHlwZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFN0cmluZy5jbGFzcywgY2hlY2tQYXJhbURlc2MuZ2V0UGFyYW1ldGVyQWN0dWFsVHlwZSgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShjaGVja1BhcmFtRGVzYy5pc0hvbGRlclR5cGUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiaHR0cDovL21ldGhvZDUuYmFyZS5yZXN1bHQudGVzdC50YXJnZXQubmFtZXNwYWNlLjUvIiwKLSAgICAgICAgICAgICAgICAgICAgIGNoZWNrUGFyYW1EZXNjLmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFdlYlBhcmFtLk1vZGUuT1VULCBjaGVja1BhcmFtRGVzYy5nZXRNb2RlKCkpOwotICAgICAgICBhc3NlcnRGYWxzZShjaGVja1BhcmFtRGVzYy5pc0hlYWRlcigpKTsKLQotICAgICAgICAvLyBtZXRob2Q2Ci0gICAgICAgIG9wZXJhdGlvbkRlc2MgPSB0ZXN0RW5kcG9pbnRJbnRlcmZhY2VEZXNjLmdldE9wZXJhdGlvbkZvckphdmFNZXRob2QoIm1ldGhvZDZfYmFyZSIpWzBdOwotICAgICAgICBhc3NlcnROb3ROdWxsKG9wZXJhdGlvbkRlc2MpOwotICAgICAgICBwYXJhbURlc2MgPSBvcGVyYXRpb25EZXNjLmdldFBhcmFtZXRlckRlc2NyaXB0aW9ucygpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcGFyYW1EZXNjLmxlbmd0aCk7Ci0KLSAgICAgICAgY2hlY2tQYXJhbURlc2MgPSBwYXJhbURlc2NbMF07Ci0gICAgICAgIGFzc2VydE5vdE51bGwoKChQYXJhbWV0ZXJEZXNjcmlwdGlvbkphdmEpY2hlY2tQYXJhbURlc2MpLmdldEFubm9XZWJQYXJhbSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJwYXJhbTBOYW1lTWV0aG9kNiIsIGNoZWNrUGFyYW1EZXNjLmdldFBhcmFtZXRlck5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygicGFyYW0wUGFydE5hbWUiLCBjaGVja1BhcmFtRGVzYy5nZXRQYXJ0TmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNoZWNrUGFyYW1EZXNjLCBvcGVyYXRpb25EZXNjLmdldFBhcmFtZXRlckRlc2NyaXB0aW9uKDApKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNoZWNrUGFyYW1EZXNjLCBvcGVyYXRpb25EZXNjLmdldFBhcmFtZXRlckRlc2NyaXB0aW9uKCJwYXJhbTBOYW1lTWV0aG9kNiIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEhvbGRlci5jbGFzcywgY2hlY2tQYXJhbURlc2MuZ2V0UGFyYW1ldGVyVHlwZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFN0cmluZy5jbGFzcywgY2hlY2tQYXJhbURlc2MuZ2V0UGFyYW1ldGVyQWN0dWFsVHlwZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJodHRwOi8vcGFyYW0uc2VydmljZS50ZXN0LnRhcmdldC5uYW1lc3BhY2UvIiwKLSAgICAgICAgICAgICAgICAgICAgIGNoZWNrUGFyYW1EZXNjLmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFdlYlBhcmFtLk1vZGUuSU5PVVQsIGNoZWNrUGFyYW1EZXNjLmdldE1vZGUoKSk7Ci0gICAgICAgIGFzc2VydFRydWUoY2hlY2tQYXJhbURlc2MuaXNIZWFkZXIoKSk7Ci0gICAgfQotCi0KLSAgICAvKgotICAgICogTWV0aG9kIHRvIHJldHVybiB0aGUgZW5kcG9pbnQgaW50ZXJmYWNlIGRlc2NyaXB0aW9uIGZvciBhIGdpdmVuIGltcGxlbWVudGF0aW9uIGNsYXNzLgotICAgICovCi0gICAgcHJpdmF0ZSBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uIGdldEVuZHBvaW50SW50ZXJmYWNlRGVzYyhDbGFzcyBpbXBsZW1lbnRhdGlvbkNsYXNzKSB7Ci0gICAgICAgIC8vIFVzZSB0aGUgZGVzY3JpcHRpb24gZmFjdG9yeSBkaXJlY3RseTsgdGhpcyB3aWxsIGJlIGRvbmUgd2l0aGluIHRoZSBKQVgtV1MgcnVudGltZQotICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc2VydmljZURlc2MgPQotICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uRmFjdG9yeS5jcmVhdGVTZXJ2aWNlRGVzY3JpcHRpb24oaW1wbGVtZW50YXRpb25DbGFzcyk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZURlc2MpOwotCi0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb25bXSBlbmRwb2ludERlc2MgPSBzZXJ2aWNlRGVzYy5nZXRFbmRwb2ludERlc2NyaXB0aW9ucygpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGVuZHBvaW50RGVzYyk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBlbmRwb2ludERlc2MubGVuZ3RoKTsKLQotICAgICAgICAvLyBUT0RPOiBIb3cgd2lsbCB0aGUgSkFYLVdTIGRpc3BhdGNoZXIgZ2V0IHRoZSBhcHByb3ByaWF0ZSBwb3J0IChpLmUuIGVuZHBvaW50KT8gIEN1cnJlbnRseSBhc3N1bWVzIFswXQotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIHRlc3RFbmRwb2ludERlc2MgPSBlbmRwb2ludERlc2NbMF07Ci0gICAgICAgIEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24gdGVzdEVuZHBvaW50SW50ZXJmYWNlRGVzYyA9Ci0gICAgICAgICAgICAgICAgdGVzdEVuZHBvaW50RGVzYy5nZXRFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwodGVzdEVuZHBvaW50SW50ZXJmYWNlRGVzYyk7Ci0KLSAgICAgICAgcmV0dXJuIHRlc3RFbmRwb2ludEludGVyZmFjZURlc2M7Ci0gICAgfQotfQotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBTT0FQQmluZGluZ0RlZmF1bHRUZXN0IHNlcnZpY2UgaW1wbGVtZW50YXRpb24gY2xhc3MKLS8vIEBTT0FQQmluZGluZyB2YWx1ZXM6IHN0eWxlPURPQ1VNRU5ULCB1c2U9TElURVJBTCwgcGFyYW1hdGVyU3R5bGU9V1JBUFBFRAotLy8gQFdlYlJlc3VsdCB2YWx1ZXM6IGFyZSBhbGwgZGVmYXVsdGVkCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUBXZWJTZXJ2aWNlKCkKLWNsYXNzIFNPQVBCaW5kaW5nRGVmYXVsdFRlc3RJbXBsIHsKLSAgICBwdWJsaWMgU3RyaW5nIGVjaG9TdHJpbmcoU3RyaW5nIHMpIHsKLSAgICAgICAgcmV0dXJuIHM7Ci0gICAgfQotfQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gU09BUEJpbmRpbmdEb2NMaUJhcmVUZXN0SW1wbCBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIGNsYXNzCi0vLyBOb3RlIHRoYXQgU3R5bGUgc2hvdWxkIGRlZmF1bHQKLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotQFdlYlNlcnZpY2UoKQotQFNPQVBCaW5kaW5nKHVzZSA9IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlVzZS5MSVRFUkFMLAotICAgICAgICAgICAgIHBhcmFtZXRlclN0eWxlID0gamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuUGFyYW1ldGVyU3R5bGUuQkFSRSkKLWNsYXNzIFNPQVBCaW5kaW5nRG9jTGl0QmFyZVRlc3RJbXBsIHsKLSAgICBwdWJsaWMgU3RyaW5nIGVjaG9TdHJpbmcoU3RyaW5nIHMpIHsKLSAgICAgICAgcmV0dXJuIHM7Ci0gICAgfQotfQotCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vU09BUEJpbmRpbmdEb2NFbmNCYXJlVGVzdEltcGwgc2VydmljZSBpbXBsZW1lbnRhdGlvbiBjbGFzcwotLy9Ob3RlIHRoYXQgU3R5bGUgc2hvdWxkIGRlZmF1bHQKLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1AV2ViU2VydmljZSgpCi1AU09BUEJpbmRpbmcodXNlID0gamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuVXNlLkVOQ09ERUQsCi0gICAgICAgICAgcGFyYW1ldGVyU3R5bGUgPSBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5QYXJhbWV0ZXJTdHlsZS5CQVJFKQotY2xhc3MgU09BUEJpbmRpbmdEb2NFbmNCYXJlVGVzdEltcGwgewotIHB1YmxpYyBTdHJpbmcgZWNob1N0cmluZyhTdHJpbmcgcykgewotICAgICByZXR1cm4gczsKLSB9Ci19Ci0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBTT0FQQmluZGluZ0RlZmF1bHRNZXRob2RUZXN0IHNlcnZpY2UgaW1wbGVtZW50YXRpb24gY2xhc3MKLS8vIE5vdGUgdGhhdCBzdHlsZSB3aWxsIGRlZmF1bHQgdG8gRE9DVU1FTlQgYmFzZWQgb24gVHlwZSBhbm5vdGF0aW9uCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUBXZWJTZXJ2aWNlKCkKLWNsYXNzIFNPQVBCaW5kaW5nRGVmYXVsdE1ldGhvZFRlc3RJbXBsIHsKLSAgICBAU09BUEJpbmRpbmcodXNlID0gamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuVXNlLkxJVEVSQUwsCi0gICAgICAgICAgICAgICAgIHBhcmFtZXRlclN0eWxlID0gamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuUGFyYW1ldGVyU3R5bGUuQkFSRSkKLSAgICBwdWJsaWMgU3RyaW5nIGVjaG9TdHJpbmcoU3RyaW5nIHMpIHsKLSAgICAgICAgcmV0dXJuIHM7Ci0gICAgfQotfQotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gdGVzdERlZmF1bHRSZXFSc3BXcmFwcGVyIHNlcnZpY2UgaW1wbGVtZW50YXRpb24gY2xhc3NlcwotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotQFdlYlNlcnZpY2UKLS8vTm90ZSB0aGUgZGVmYXVsdCBwYXJhbWV0ZXJTdHlsZSBpcyBXUkFQUEVELCBzbyBubyB0eXBlLWxldmVsIGFubm90YXRpb24gaXMgcmVxdWlyZWQuCi1jbGFzcyBEZWZhdWx0UmVxUnNwV3JhcHBlclRlc3RJbXBsIHsKLSAgICBwdWJsaWMgU3RyaW5nIHdyYXBwZWRQYXJhbXMoU3RyaW5nIHMpIHsKLSAgICAgICAgcmV0dXJuIHM7Ci0gICAgfQotCi0gICAgQFNPQVBCaW5kaW5nKHBhcmFtZXRlclN0eWxlID0gamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuUGFyYW1ldGVyU3R5bGUuQkFSRSkKLSAgICBwdWJsaWMgU3RyaW5nIGJhcmVQYXJhbXMoU3RyaW5nIHMpIHsKLSAgICAgICAgcmV0dXJuIHM7Ci0gICAgfQotfQotCi1AV2ViU2VydmljZQotQFNPQVBCaW5kaW5nKHBhcmFtZXRlclN0eWxlID0gamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuUGFyYW1ldGVyU3R5bGUuQkFSRSkKLWNsYXNzIERlZmF1bHRSZXFSc3BXcmFwcGVyQmFyZVRlc3RJbXBsIHsKLSAgICBAU09BUEJpbmRpbmcocGFyYW1ldGVyU3R5bGUgPSBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5QYXJhbWV0ZXJTdHlsZS5XUkFQUEVEKQotICAgIHB1YmxpYyBTdHJpbmcgd3JhcHBlZFBhcmFtcyhTdHJpbmcgcykgewotICAgICAgICByZXR1cm4gczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGJhcmVQYXJhbXMoU3RyaW5nIHMpIHsKLSAgICAgICAgcmV0dXJuIHM7Ci0gICAgfQotfQotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gdGVzdFJlcVJzcFdyYXBwZXIgc2VydmljZSBpbXBsZW1lbnRhdGlvbiBjbGFzcwotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotQFdlYlNlcnZpY2UKLS8vTm90ZSB0aGUgZGVmYXVsdCBwYXJhbWV0ZXJTdHlsZSBpcyBXUkFQUEVELCBzbyBubyB0eXBlLWxldmVsIGFubm90YXRpb24gaXMgcmVxdWlyZWQuCi1jbGFzcyBSZXFSc3BXcmFwcGVyVGVzdEltcGwgewotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAibWV0aG9kMVJlcVdyYXBwZXIiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL2EuYi5jLm1ldGhvZDFSZXFUTlMiLAotICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5Bbm5vdGF0aW9uU2VydmljZUltcGxEZXNjcmlwdGlvblRlc3RzLlJlcVJzcFdyYXBwZXJUZXN0SW1wbC5tZXRob2QxUmVxV3JhcHBlciIpCi0gICAgQFJlc3BvbnNlV3JhcHBlcihsb2NhbE5hbWUgPSAibWV0aG9kMVJzcFdyYXBwZXIiLAotICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9hLmIuYy5tZXRob2QxUnNwVE5TIiwKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZSA9ICJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkFubm90YXRpb25TZXJ2aWNlSW1wbERlc2NyaXB0aW9uVGVzdHMuUmVxUnNwV3JhcHBlclRlc3RJbXBsLm1ldGhvZDFSc3BXcmFwcGVyIikKLSAgICBwdWJsaWMgU3RyaW5nIG1ldGhvZDEoU3RyaW5nIHMpIHsKLSAgICAgICAgcmV0dXJuIHM7Ci0gICAgfQotCi0gICAgQFJlcXVlc3RXcmFwcGVyKHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vYS5iLmMubWV0aG9kMlJlcVROUyIsCi0gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZSA9ICJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkFubm90YXRpb25TZXJ2aWNlSW1wbERlc2NyaXB0aW9uVGVzdHMuUmVxUnNwV3JhcHBlclRlc3RJbXBsLm1ldGhvZDJSZXFXcmFwcGVyIikKLSAgICBAUmVzcG9uc2VXcmFwcGVyKGxvY2FsTmFtZSA9ICJtZXRob2QyUnNwV3JhcHBlciIsCi0gICAgICAgICAgICAgICAgICAgICB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL2EuYi5jLm1ldGhvZDJSc3BUTlMiKQotICAgIHB1YmxpYyBTdHJpbmcgbWV0aG9kMihTdHJpbmcgcykgewotICAgICAgICByZXR1cm4gczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgY2xhc3MgbWV0aG9kMVJlcVdyYXBwZXIgewotCi0gICAgfQotCi0gICAgcHVibGljIGNsYXNzIG1ldGhvZDJSZXFXcmFwcGVyIHsKLQotICAgIH0KLQotICAgIHB1YmxpYyBjbGFzcyBtZXRob2QxUnNwV3JhcHBlciB7Ci0KLSAgICB9Ci19Ci0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyB0ZXN0V2ViTWV0aG9kIHNlcnZpY2UgaW1wbGVtZW50YWl0b24gY2xhc3MKLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUBXZWJTZXJ2aWNlCi1jbGFzcyBXZWJNZXRob2RUZXN0SW1wbCB7Ci0gICAgLy8gTm8gd2ViIG1ldGhvZCBhbm5vdGF0aW9uCi0gICAgcHVibGljIFN0cmluZyBtZXRob2QxKFN0cmluZyBzKSB7Ci0gICAgICAgIHJldHVybiBzOwotICAgIH0KLQotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJyZW5hbWVkTWV0aG9kMiIpCi0gICAgcHVibGljIFN0cmluZyBtZXRob2QyKFN0cmluZyBzKSB7Ci0gICAgICAgIHJldHVybiBzOwotICAgIH0KLQotICAgIEBXZWJNZXRob2QoYWN0aW9uID0gIkFjdGlvbk1ldGhvZDMiKQotICAgIHB1YmxpYyBTdHJpbmcgbWV0aG9kMyhTdHJpbmcgcykgewotICAgICAgICByZXR1cm4gczsKLSAgICB9Ci0KLSAgICBAV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWUgPSAicmVuYW1lZE1ldGhvZDQiLCBhY3Rpb24gPSAiQWN0aW9uTWV0aG9kNCIpCi0gICAgcHVibGljIFN0cmluZyBtZXRob2Q0KFN0cmluZyBzKSB7Ci0gICAgICAgIHJldHVybiBzOwotICAgIH0KLQotICAgIEBXZWJNZXRob2QoZXhjbHVkZSA9IHRydWUpCi0gICAgcHVibGljIFN0cmluZyBtZXRob2Q1KFN0cmluZyBzKSB7Ci0gICAgICAgIHJldHVybiBzOwotICAgIH0KLX0KLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIFdlYiBSZXN1bHQgCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1AV2ViU2VydmljZSh0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3NlcnZpY2UudGVzdC50YXJnZXQubmFtZXNwYWNlLyIpCi0vLyBEZWZhdWx0IFNPQVBCaW5kaW5nIFN0eWxlPURPQ1VNRU5ULCBVc2U9TElURVJBTCwgUGFyYW1TdHlsZT1XUkFQUEVECi1jbGFzcyBXZWJSZXN1bHRUZXN0SW1wbCB7Ci0gICAgLy8gRE9DVU1FTlQgLyBMSVRFUkFMIC8gV1JBUFBFRCBtZXRob2RzCi0gICAgcHVibGljIFN0cmluZyBtZXRob2QwKFN0cmluZyBzKSB7Ci0gICAgICAgIHJldHVybiBzOwotICAgIH0KLQotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJyZW5hbWVkTWV0aG9kMSIpCi0gICAgcHVibGljIFN0cmluZyBtZXRob2QxKFN0cmluZyBzKSB7Ci0gICAgICAgIHJldHVybiBzOwotICAgIH0KLQotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJyZW5hbWVkTWV0aG9kMiIpCi0gICAgQFdlYlJlc3VsdCgpCi0gICAgcHVibGljIFN0cmluZyBtZXRob2QyKFN0cmluZyBzKSB7Ci0gICAgICAgIHJldHVybiBzOwotICAgIH0KLQotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJyZW5hbWVkTWV0aG9kMyIpCi0gICAgQFdlYlJlc3VsdChuYW1lID0gInJlc3VsdE5hbWUiKQotICAgIHB1YmxpYyBTdHJpbmcgbWV0aG9kMyhTdHJpbmcgcykgewotICAgICAgICByZXR1cm4gczsKLSAgICB9Ci0KLSAgICBAV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWUgPSAicmVuYW1lZE1ldGhvZDQiKQotICAgIEBXZWJSZXN1bHQobmFtZSA9ICJyZXN1bHROYW1lIiwgcGFydE5hbWUgPSAicGFydE5hbWUiLAotICAgICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9yZXN1bHQudGVzdC50YXJnZXQubmFtZXNwYWNlLyIpCi0gICAgcHVibGljIFN0cmluZyBtZXRob2Q0KFN0cmluZyBzKSB7Ci0gICAgICAgIHJldHVybiBzOwotICAgIH0KLQotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJyZW5hbWVkTWV0aG9kNSIpCi0gICAgQFdlYlJlc3VsdChuYW1lID0gInJlc3VsdE5hbWU1IiwgcGFydE5hbWUgPSAicGFydE5hbWU1IiwKLSAgICAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vcmVzdWx0LnRlc3QudGFyZ2V0Lm5hbWVzcGFjZS41LyIsIGhlYWRlciA9IHRydWUpCi0gICAgcHVibGljIFN0cmluZyBtZXRob2Q1KFN0cmluZyBzKSB7Ci0gICAgICAgIHJldHVybiBzOwotICAgIH0KLQotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJyZW5hbWVkTWV0aG9kNiIpCi0gICAgQE9uZXdheQotICAgIHB1YmxpYyB2b2lkIG1ldGhvZDYoU3RyaW5nIHMpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJyZW5hbWVkTWV0aG9kNyIpCi0gICAgQFdlYlJlc3VsdChuYW1lID0gInJlc3VsdE5hbWU3IiwgcGFydE5hbWUgPSAicGFydE5hbWU3IiwgaGVhZGVyID0gdHJ1ZSkKLSAgICBwdWJsaWMgU3RyaW5nIG1ldGhvZDcoU3RyaW5nIHMpIHsKLSAgICAgICAgcmV0dXJuIHM7Ci0gICAgfQotCi0gICAgLy8gRE9DVU1FTlQgLyBMSVRFUkFMIC8gQkFSRSBtZXRob2RzCi0gICAgQFNPQVBCaW5kaW5nKHBhcmFtZXRlclN0eWxlID0gU09BUEJpbmRpbmcuUGFyYW1ldGVyU3R5bGUuQkFSRSkKLSAgICBwdWJsaWMgU3RyaW5nIG1ldGhvZDBfYmFyZShTdHJpbmcgcykgewotICAgICAgICByZXR1cm4gczsKLSAgICB9Ci0KLSAgICBAV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWUgPSAicmVuYW1lZE1ldGhvZDFCYXJlIikKLSAgICBAU09BUEJpbmRpbmcocGFyYW1ldGVyU3R5bGUgPSBTT0FQQmluZGluZy5QYXJhbWV0ZXJTdHlsZS5CQVJFKQotICAgIHB1YmxpYyBTdHJpbmcgbWV0aG9kMV9iYXJlKFN0cmluZyBzKSB7Ci0gICAgICAgIHJldHVybiBzOwotICAgIH0KLQotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJyZW5hbWVkTWV0aG9kMkJhcmUiKQotICAgIEBTT0FQQmluZGluZyhwYXJhbWV0ZXJTdHlsZSA9IFNPQVBCaW5kaW5nLlBhcmFtZXRlclN0eWxlLkJBUkUpCi0gICAgQFdlYlJlc3VsdCgpCi0gICAgcHVibGljIFN0cmluZyBtZXRob2QyX2JhcmUoU3RyaW5nIHMpIHsKLSAgICAgICAgcmV0dXJuIHM7Ci0gICAgfQotCi0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lID0gInJlbmFtZWRNZXRob2QzQmFyZSIpCi0gICAgQFNPQVBCaW5kaW5nKHBhcmFtZXRlclN0eWxlID0gU09BUEJpbmRpbmcuUGFyYW1ldGVyU3R5bGUuQkFSRSkKLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAicmVzdWx0TmFtZSIpCi0gICAgcHVibGljIFN0cmluZyBtZXRob2QzX2JhcmUoU3RyaW5nIHMpIHsKLSAgICAgICAgcmV0dXJuIHM7Ci0gICAgfQotCi0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lID0gInJlbmFtZWRNZXRob2Q0QmFyZSIpCi0gICAgQFNPQVBCaW5kaW5nKHBhcmFtZXRlclN0eWxlID0gU09BUEJpbmRpbmcuUGFyYW1ldGVyU3R5bGUuQkFSRSkKLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAicmVzdWx0TmFtZSIsIHBhcnROYW1lID0gInBhcnROYW1lIiwKLSAgICAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vcmVzdWx0LmJhcmUudGVzdC50YXJnZXQubmFtZXNwYWNlLyIpCi0gICAgcHVibGljIFN0cmluZyBtZXRob2Q0X2JhcmUoU3RyaW5nIHMpIHsKLSAgICAgICAgcmV0dXJuIHM7Ci0gICAgfQotCi0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lID0gInJlbmFtZWRNZXRob2Q1QmFyZSIpCi0gICAgQFNPQVBCaW5kaW5nKHBhcmFtZXRlclN0eWxlID0gU09BUEJpbmRpbmcuUGFyYW1ldGVyU3R5bGUuQkFSRSkKLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAicmVzdWx0TmFtZTUiLCBwYXJ0TmFtZSA9ICJwYXJ0TmFtZTUiLAotICAgICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9yZXN1bHQuYmFyZS50ZXN0LnRhcmdldC5uYW1lc3BhY2UuNS8iLCBoZWFkZXIgPSB0cnVlKQotICAgIHB1YmxpYyBTdHJpbmcgbWV0aG9kNV9iYXJlKFN0cmluZyBzKSB7Ci0gICAgICAgIHJldHVybiBzOwotICAgIH0KLQotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJyZW5hbWVkTWV0aG9kNkJhcmUiKQotICAgIEBTT0FQQmluZGluZyhwYXJhbWV0ZXJTdHlsZSA9IFNPQVBCaW5kaW5nLlBhcmFtZXRlclN0eWxlLkJBUkUpCi0gICAgQE9uZXdheQotICAgIHB1YmxpYyB2b2lkIG1ldGhvZDZfYmFyZShTdHJpbmcgcykgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lID0gInJlbmFtZWRNZXRob2Q3QmFyZSIpCi0gICAgQFNPQVBCaW5kaW5nKHBhcmFtZXRlclN0eWxlID0gU09BUEJpbmRpbmcuUGFyYW1ldGVyU3R5bGUuQkFSRSkKLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAicmVzdWx0TmFtZTciLCBwYXJ0TmFtZSA9ICJwYXJ0TmFtZTciLCBoZWFkZXIgPSB0cnVlKQotICAgIHB1YmxpYyBTdHJpbmcgbWV0aG9kN19iYXJlKFN0cmluZyBzKSB7Ci0gICAgICAgIHJldHVybiBzOwotICAgIH0KLX0KLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIFdlYiBQYXJhbSB0ZXN0IGltcGwKLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUBXZWJTZXJ2aWNlKHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vcGFyYW0uc2VydmljZS50ZXN0LnRhcmdldC5uYW1lc3BhY2UvIikKLS8vRGVmYXVsdCBTT0FQQmluZGluZyBTdHlsZT1ET0NVTUVOVCwgVXNlPUxJVEVSQUwsIFBhcmFtU3R5bGU9V1JBUFBFRAotY2xhc3MgV2ViUGFyYW1UZXN0SW1wbCB7Ci0KLSAgICAvLyBET0NVTUVOVCAvIExJVEVSQUwgLyBXUkFQUEVEIG1ldGhvZHMKLSAgICBwdWJsaWMgU3RyaW5nIG1ldGhvZDAoU3RyaW5nIHMpIHsKLSAgICAgICAgcmV0dXJuIHM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbWV0aG9kMDAoKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBAV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWUgPSAicmVuYW1lZE1ldGhvZDEiKQotICAgIHB1YmxpYyBTdHJpbmcgbWV0aG9kMShTdHJpbmcgcykgewotICAgICAgICByZXR1cm4gczsKLSAgICB9Ci0KLSAgICBAV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWUgPSAicmVuYW1lZE1ldGhvZDIiKQotICAgIEBXZWJSZXN1bHQoKQotICAgIHB1YmxpYyBTdHJpbmcgbWV0aG9kMigKLSAgICAgICAgICAgIEBXZWJQYXJhbSgpIFN0cmluZyBzKSB7Ci0gICAgICAgIHJldHVybiBzOwotICAgIH0KLQotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJyZW5hbWVkTWV0aG9kMyIpCi0gICAgQFdlYlJlc3VsdChuYW1lID0gInJlc3VsdE5hbWUiKQotICAgIHB1YmxpYyBTdHJpbmcgbWV0aG9kMygKLSAgICAgICAgICAgIEBXZWJQYXJhbShuYW1lID0gInBhcmFtME5hbWVNZXRob2QzIikgU3RyaW5nIHMsCi0gICAgICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJwYXJhbTFOYW1lTWV0aG9kMyIpIGphdmF4LnhtbC53cy5Ib2xkZXI8SW50ZWdlcj4gaG9sZGVySW50ZWdlciwKLSAgICAgICAgICAgIE9iamVjdCBvYmpOb1dlYlBhcmFtQW5ubywKLSAgICAgICAgICAgIGludCBpbnROb1dlYlBhcmFtQW5ubywKLSAgICAgICAgICAgIEBXZWJQYXJhbShuYW1lID0gImxhc3RQYXJhbU5hbWVNZXRob2QzIikgU3RyaW5nIGxhc3QpIHsKLSAgICAgICAgcmV0dXJuIHM7Ci0gICAgfQotCi0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lID0gInJlbmFtZWRNZXRob2Q0IikKLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAicmVzdWx0TmFtZSIsIHBhcnROYW1lID0gInBhcnROYW1lIiwKLSAgICAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vcmVzdWx0LnRlc3QudGFyZ2V0Lm5hbWVzcGFjZS8iKQotICAgIHB1YmxpYyBTdHJpbmcgbWV0aG9kNCgKLSAgICAgICAgICAgIEBXZWJQYXJhbShuYW1lID0gInBhcmFtME5hbWVNZXRob2Q0IiwgcGFydE5hbWUgPSAicGFyYW0wUGFydE5hbWUiLAotICAgICAgICAgICAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vcGFyYW0uNC4wLnJlc3VsdC50ZXN0LnRhcmdldC5uYW1lc3BhY2UvIikgU3RyaW5nIHMsCi0gICAgICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJwYXJhbTFOYW1lTWV0aG9kNCIsIHBhcnROYW1lID0gInBhcmFtMVBhcnROYW1lIiwKLSAgICAgICAgICAgICAgICAgICAgICB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3BhcmFtLjQuMS5yZXN1bHQudGVzdC50YXJnZXQubmFtZXNwYWNlLyIpIGludCBpLAotICAgICAgICAgICAgT2JqZWN0IG9iak5vV2ViUGFyYW1Bbm5vLAotICAgICAgICAgICAgamF2YXgueG1sLndzLkhvbGRlcjxJbnRlZ2VyPiBpbnROb1dlYlBhcmFtQW5ubywKLSAgICAgICAgICAgIEBXZWJQYXJhbShuYW1lID0gImxhc3RQYXJhbU5hbWVNZXRob2Q0IikgU3RyaW5nIGxhc3QpIHsKLQotICAgICAgICByZXR1cm4gczsKLSAgICB9Ci0KLSAgICBAV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWUgPSAicmVuYW1lZE1ldGhvZDUiKQotICAgIEBXZWJSZXN1bHQobmFtZSA9ICJyZXN1bHROYW1lNSIsIHBhcnROYW1lID0gInBhcnROYW1lNSIsCi0gICAgICAgICAgICAgICB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3Jlc3VsdC50ZXN0LnRhcmdldC5uYW1lc3BhY2UuNS8iLCBoZWFkZXIgPSB0cnVlKQotICAgIHB1YmxpYyBTdHJpbmcgbWV0aG9kNSgKLSAgICAgICAgICAgIEBXZWJQYXJhbShuYW1lID0gInBhcmFtME5hbWVNZXRob2Q1IiwgcGFydE5hbWUgPSAicGFyYW0wUGFydE5hbWUiLAotICAgICAgICAgICAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vcGFyYW0uNS4wLnJlc3VsdC50ZXN0LnRhcmdldC5uYW1lc3BhY2UvIiwKLSAgICAgICAgICAgICAgICAgICAgICBoZWFkZXIgPSB0cnVlKSBTdHJpbmcgcywKLSAgICAgICAgICAgIEBXZWJQYXJhbShuYW1lID0gInBhcmFtMU5hbWVNZXRob2Q1IiwgcGFydE5hbWUgPSAicGFyYW0xUGFydE5hbWUiLAotICAgICAgICAgICAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vcGFyYW0uNS4xLnJlc3VsdC50ZXN0LnRhcmdldC5uYW1lc3BhY2UvIiwKLSAgICAgICAgICAgICAgICAgICAgICBoZWFkZXIgPSBmYWxzZSkgaW50IGksCi0gICAgICAgICAgICBqYXZheC54bWwud3MuSG9sZGVyPE9iamVjdD4gb2JqTm9XZWJQYXJhbUFubm8sCi0gICAgICAgICAgICBpbnQgaW50Tm9XZWJQYXJhbUFubm8sCi0gICAgICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJsYXN0UGFyYW1OYW1lTWV0aG9kNSIsIG1vZGUgPSBXZWJQYXJhbS5Nb2RlLk9VVCkKLSAgICAgICAgICAgIGphdmF4LnhtbC53cy5Ib2xkZXI8U3RyaW5nPiBsYXN0KSB7Ci0gICAgICAgIHJldHVybiBzOwotICAgIH0KLQotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJyZW5hbWVkTWV0aG9kNiIpCi0gICAgQFdlYlJlc3VsdChuYW1lID0gInJlc3VsdE5hbWU1IiwgcGFydE5hbWUgPSAicGFydE5hbWU1IiwgaGVhZGVyID0gdHJ1ZSkKLSAgICBwdWJsaWMgU3RyaW5nIG1ldGhvZDYoCi0gICAgICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJwYXJhbTBOYW1lTWV0aG9kNiIsIHBhcnROYW1lID0gInBhcmFtMFBhcnROYW1lIiwgaGVhZGVyID0gdHJ1ZSkKLSAgICAgICAgICAgIFN0cmluZyBzLAotICAgICAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAicGFyYW0xTmFtZU1ldGhvZDYiLCBwYXJ0TmFtZSA9ICJwYXJhbTFQYXJ0TmFtZSIsIGhlYWRlciA9IGZhbHNlKQotICAgICAgICAgICAgaW50IGksCi0gICAgICAgICAgICBPYmplY3Qgb2JqTm9XZWJQYXJhbUFubm8sCi0gICAgICAgICAgICBpbnQgaW50Tm9XZWJQYXJhbUFubm8sCi0gICAgICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJsYXN0UGFyYW1OYW1lTWV0aG9kNiIpIFN0cmluZyBsYXN0KSB7Ci0gICAgICAgIHJldHVybiBzOwotICAgIH0KLQotICAgIC8vIERPQ1VNRU5UIC8gTElURVJBTCAvIEJBUkUgbWV0aG9kcwotICAgIEBTT0FQQmluZGluZyhwYXJhbWV0ZXJTdHlsZSA9IFNPQVBCaW5kaW5nLlBhcmFtZXRlclN0eWxlLkJBUkUpCi0gICAgcHVibGljIFN0cmluZyBtZXRob2QwX2JhcmUoU3RyaW5nIHMpIHsKLSAgICAgICAgcmV0dXJuIHM7Ci0gICAgfQotCi0gICAgQFNPQVBCaW5kaW5nKHBhcmFtZXRlclN0eWxlID0gU09BUEJpbmRpbmcuUGFyYW1ldGVyU3R5bGUuQkFSRSkKLSAgICBwdWJsaWMgdm9pZCBtZXRob2QwMF9iYXJlKCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lID0gInJlbmFtZWRNZXRob2QxIikKLSAgICBAU09BUEJpbmRpbmcocGFyYW1ldGVyU3R5bGUgPSBTT0FQQmluZGluZy5QYXJhbWV0ZXJTdHlsZS5CQVJFKQotICAgIHB1YmxpYyBTdHJpbmcgbWV0aG9kMV9iYXJlKFN0cmluZyBzKSB7Ci0gICAgICAgIHJldHVybiBzOwotICAgIH0KLQotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJyZW5hbWVkTWV0aG9kMiIpCi0gICAgQFNPQVBCaW5kaW5nKHBhcmFtZXRlclN0eWxlID0gU09BUEJpbmRpbmcuUGFyYW1ldGVyU3R5bGUuQkFSRSkKLSAgICBAV2ViUmVzdWx0KCkKLSAgICBwdWJsaWMgU3RyaW5nIG1ldGhvZDJfYmFyZSgKLSAgICAgICAgICAgIEBXZWJQYXJhbSgpIFN0cmluZyBzKSB7Ci0gICAgICAgIHJldHVybiBzOwotICAgIH0KLQotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJyZW5hbWVkTWV0aG9kMyIpCi0gICAgQFNPQVBCaW5kaW5nKHBhcmFtZXRlclN0eWxlID0gU09BUEJpbmRpbmcuUGFyYW1ldGVyU3R5bGUuQkFSRSkKLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAicmVzdWx0TmFtZSIpCi0gICAgcHVibGljIFN0cmluZyBtZXRob2QzX2JhcmUoCi0gICAgICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJwYXJhbTFOYW1lTWV0aG9kMyIpIGphdmF4LnhtbC53cy5Ib2xkZXI8SW50ZWdlcj4gaG9sZGVySW50ZWdlcikgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBAV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWUgPSAicmVuYW1lZE1ldGhvZDQiKQotICAgIEBTT0FQQmluZGluZyhwYXJhbWV0ZXJTdHlsZSA9IFNPQVBCaW5kaW5nLlBhcmFtZXRlclN0eWxlLkJBUkUpCi0gICAgQFdlYlJlc3VsdChuYW1lID0gInJlc3VsdE5hbWUiLCBwYXJ0TmFtZSA9ICJwYXJ0TmFtZSIsCi0gICAgICAgICAgICAgICB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3Jlc3VsdC50ZXN0LnRhcmdldC5uYW1lc3BhY2UvIikKLSAgICBwdWJsaWMgU3RyaW5nIG1ldGhvZDRfYmFyZSgKLSAgICAgICAgICAgIGphdmF4LnhtbC53cy5Ib2xkZXI8SW50ZWdlcj4gaW50Tm9XZWJQYXJhbUFubm8pIHsKLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBAV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWUgPSAicmVuYW1lZE1ldGhvZDUiKQotICAgIEBTT0FQQmluZGluZyhwYXJhbWV0ZXJTdHlsZSA9IFNPQVBCaW5kaW5nLlBhcmFtZXRlclN0eWxlLkJBUkUpCi0gICAgQFdlYlJlc3VsdChuYW1lID0gInJlc3VsdE5hbWU1IiwgcGFydE5hbWUgPSAicGFydE5hbWU1IiwKLSAgICAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vcmVzdWx0LnRlc3QudGFyZ2V0Lm5hbWVzcGFjZS41LyIsIGhlYWRlciA9IHRydWUpCi0gICAgcHVibGljIHZvaWQgbWV0aG9kNV9iYXJlKAotICAgICAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAibGFzdFBhcmFtTmFtZU1ldGhvZDUiLCBtb2RlID0gV2ViUGFyYW0uTW9kZS5PVVQsCi0gICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9tZXRob2Q1LmJhcmUucmVzdWx0LnRlc3QudGFyZ2V0Lm5hbWVzcGFjZS41LyIpCi0gICAgICAgICAgICBqYXZheC54bWwud3MuSG9sZGVyPFN0cmluZz4gbGFzdCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lID0gInJlbmFtZWRNZXRob2Q2IikKLSAgICBAU09BUEJpbmRpbmcocGFyYW1ldGVyU3R5bGUgPSBTT0FQQmluZGluZy5QYXJhbWV0ZXJTdHlsZS5CQVJFKQotICAgIEBXZWJSZXN1bHQobmFtZSA9ICJyZXN1bHROYW1lNSIsIHBhcnROYW1lID0gInBhcnROYW1lNSIsIGhlYWRlciA9IHRydWUpCi0gICAgcHVibGljIFN0cmluZyBtZXRob2Q2X2JhcmUoCi0gICAgICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJwYXJhbTBOYW1lTWV0aG9kNiIsIHBhcnROYW1lID0gInBhcmFtMFBhcnROYW1lIiwgaGVhZGVyID0gdHJ1ZSkKLSAgICAgICAgICAgIGphdmF4LnhtbC53cy5Ib2xkZXI8U3RyaW5nPiBzKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9Bbm5vdGF0aW9uU2VydmljZUltcGxXaXRoREJDVGVzdHMuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9Bbm5vdGF0aW9uU2VydmljZUltcGxXaXRoREJDVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2IyN2M5Mi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vQW5ub3RhdGlvblNlcnZpY2VJbXBsV2l0aERCQ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLkRlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLlBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5XZWJNZXRob2RBbm5vdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuV2ViUGFyYW1Bbm5vdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuV2ViU2VydmljZUFubm90OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5jb252ZXJ0ZXIuSmF2YUNsYXNzVG9EQkNDb252ZXJ0ZXI7Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW07Ci1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBUZXN0cyB0aGUgY3JlYXRpb24gb2YgdGhlIERlc2NyaXB0aW9uIGNsYXNzZXMgYmFzZWQgb24gYSBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIGJlYW4gYW5kIHZhcmlvdXMKLSAqIGNvbWJpbmF0aW9ucyBvZiBhbm5vdGF0aW9ucwotICovCi1wdWJsaWMgY2xhc3MgQW5ub3RhdGlvblNlcnZpY2VJbXBsV2l0aERCQ1Rlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotICAgIC8qKgotICAgICAqIENyZWF0ZSB0aGUgZGVzY3JpcHRpb24gY2xhc3NlcyB3aXRoIGEgc2VydmljZSBpbXBsZW1lbnRhdGlvbiB0aGF0IGNvbnRhaW5zIHRoZSBAV2ViU2VydmljZQotICAgICAqIEpTUi0xODEgYW5ub3RhdGlvbiB3aGljaCByZWZlcmVuY2VzIGFuIFNFSS4KLSAgICAgKi8KLQotICAgIC8vVGVzdCBjcmVhdGlvbiBvZiBhIFNlcnZpY2UgRGVzY3JpcHRpb24gZnJvbSBEQkMsIHVzaW5nIGEgYmFzaWMgbGlzdC4KLSAgICAvL0FuIGltcGxpY2l0IFNFSSB0aGF0IGV4dGVuZHMgb25seSBqYXZhLmxhbmcub2JqZWN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFNlcnZpY2VJbXBsQXNJbXBsaWNpdFNFSSgpIHsKLSAgICAgICAgLy9vcmcuYXBhY2hlLmxvZzRqLkJhc2ljQ29uZmlndXJhdG9yLmNvbmZpZ3VyZSgpOwotCi0gICAgICAgIC8vQnVpbGQgYSBIYXNobWFwIG9mIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZXMgdGhhdCBjb250YWlucyB0aGUgc2VydmljZUltcGwgYW5kCi0gICAgICAgIC8vYWxsIG5lY2Vzc2FyeSBhc3NvY2lhdGVkIERCQydzIHBvc3NpYmx5IGluY2x1ZGluZyBTRUkgYW5kIHN1cGVyY2xhc3NlcwotICAgICAgICBIYXNoTWFwPFN0cmluZywgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlPiBkYmNNYXAgPQotICAgICAgICAgICAgICAgIG5ldyBIYXNoTWFwPFN0cmluZywgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlPigpOwotCi0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBkYmMgPSBidWlsZERCQ05vRW5kcG9pbnRJbnRlcmZhY2UoKTsKLQotICAgICAgICBkYmNNYXAucHV0KGRiYy5nZXRDbGFzc05hbWUoKSwgZGJjKTsKLQotICAgICAgICAvLyBUT0RPOiBUaGlzIHRlc3QgaXMgaW52YWxpZCBhcyBpcy4gIEl0IGRvZXMgbm90IHNwZWNpZnkgV1NETCwgYW5kIFdTREwgZ2VuZXJhdG9yIGlzIG5vdCBjdXJyZW50bHkgYXZhaWxhYmxlIGluIE9wZW4gU291cmNlCi0gICAgICAgIC8vICAgICAgIFNvLCBhbiBleGNlcHRpb24gaXMgY3VycmVudGx5IGJlaW5nIHRocm93bi4gIEl0IG1heSBiZSB0aGUgY29ycmVjdCBmaXggaXMgdG8gTk9UIGFsd2F5cyB0cnkgdG8gZ2VuZXJhdGUgV1NETDsgYW5kIG9ubHkKLSAgICAgICAgLy8gICAgICAgdHJ5IHRvIGdlbmVyYXRlIGl0IGlmIGl0IGlzIGFza2VkIGZvci4KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIExpc3Q8U2VydmljZURlc2NyaXB0aW9uPiBzZXJ2aWNlRGVzY0xpc3QgPQotICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkZhY3RvcnkuY3JlYXRlU2VydmljZURlc2NyaXB0aW9uRnJvbURCQ01hcChkYmNNYXApOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlRGVzY0xpc3QuZ2V0KDApKTsKLQotICAgICAgICAgICAgLy9XZSBrbm93IHRoaXMgbGlzdCBjb250YWlucyBvbmx5IG9uZSBTRCwgc28gbm8gbmVlZCB0byBsb29wCi0gICAgICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uW10gZW5kcG9pbnREZXNjID0gc2VydmljZURlc2NMaXN0LmdldCgwKS5nZXRFbmRwb2ludERlc2NyaXB0aW9ucygpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChlbmRwb2ludERlc2MpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGVuZHBvaW50RGVzYy5sZW5ndGgsIDEpOwotCi0gICAgICAgICAgICAvLyBUT0RPOiBIb3cgd2lsbCB0aGUgSkFYLVdTIGRpc3BhdGNoZXIgZ2V0IHRoZSBhcHByb3ByaWF0ZSBwb3J0IChpLmUuIGVuZHBvaW50KT8gIEN1cnJlbnRseSBhc3N1bWVzIFswXQotICAgICAgICAgICAgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiBlbmRwb2ludEludGZEZXNjID0KLSAgICAgICAgICAgICAgICAgICAgZW5kcG9pbnREZXNjWzBdLmdldEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24oKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoZW5kcG9pbnRJbnRmRGVzYyk7Ci0KLSAgICAgICAgfSBjYXRjaCAoV2ViU2VydmljZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAqIERlcHJlY2F0ZWQgLS0gdGhpcyB1c2VkIHRvIGJlIHRoZSB0ZXN0IGZvcgotICAgICAgICAqIEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24uZ2V0T3BlcmF0aW9uRm9ySmF2YU1ldGhvZAotICAgICAgICAqLwotLyoKLSAgICAgICAgT3BlcmF0aW9uRGVzY3JpcHRpb25bXSBvcGVyYXRpb25zID0gZW5kcG9pbnRJbnRmRGVzYy5nZXRPcGVyYXRpb25zKCk7Ci0gICAgICAgIAotICAgICAgICBTdHJpbmdbXSBwYXJhbVR5cGVzID0gb3BlcmF0aW9uc1swXS5nZXRKYXZhUGFyYW1ldGVycygpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHBhcmFtVHlwZXMpOwotICAgICAgICBhc3NlcnRFcXVhbHMocGFyYW1UeXBlcy5sZW5ndGgsIDEpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImphdmF4LnhtbC53cy5Ib2xkZXIiLCBwYXJhbVR5cGVzWzBdKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFRlc3QgUmVxdWVzdFdyYXBwZXIgYW5ub3RhdGlvbnMKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG9wZXJhdGlvbnNbMF0uZ2V0UmVxdWVzdFdyYXBwZXJMb2NhbE5hbWUoKSwgIkVjaG8iKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG9wZXJhdGlvbnNbMF0uZ2V0UmVxdWVzdFdyYXBwZXJUYXJnZXROYW1lc3BhY2UoKSwgImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL3Rlc3RzIik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhvcGVyYXRpb25zWzBdLmdldFJlcXVlc3RXcmFwcGVyQ2xhc3NOYW1lKCksICJvcmcuYXBhY2hlLndzLmF4aXMyLnRlc3RzLkVjaG8iKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFRlc3QgUmVzcG9uc2VXcmFwcGVyIGFubm90YXRpb25zCi0gICAgICAgIGFzc2VydEVxdWFscyhvcGVyYXRpb25zWzBdLmdldFJlc3BvbnNlV3JhcHBlckxvY2FsTmFtZSgpLCAiRWNob1Jlc3BvbnNlIik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhvcGVyYXRpb25zWzBdLmdldFJlc3BvbnNlV3JhcHBlclRhcmdldE5hbWVzcGFjZSgpLCAiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvdGVzdHMiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG9wZXJhdGlvbnNbMF0uZ2V0UmVzcG9uc2VXcmFwcGVyQ2xhc3NOYW1lKCksICJvcmcuYXBhY2hlLndzLmF4aXMyLnRlc3RzLkVjaG9SZXNwb25zZSIpOwotICAgICAgICAKLSAgICAgICAgLy8gVGVzdCBTT0FQQmluZGluZyBkZWZhdWx0OyB0aGF0IGFubm90YXRpb24gaXMgbm90IHByZXNlbnQgaW4gdGhlIFNFSQotICAgICAgICAvLyBOb3RlIHRoYXQgYW5ub3RhdGlvbiBjb3VsZCBvY2N1ciBvbiB0aGUgb3BlcmF0aW9uIG9yIHRoZSB0eXBlCi0gICAgICAgIC8vIChhbHRob3VnaCBvbiB0aGlzIFNFSSBpdCBkb2Vzbid0IG9jY3VyIGVpdGhlciBwbGFjZSkuCi0gICAgICAgIGFzc2VydEVxdWFscyhTT0FQQmluZGluZy5TdHlsZS5ET0NVTUVOVCwgb3BlcmF0aW9uc1swXS5nZXRTb2FwQmluZGluZ1N0eWxlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoU09BUEJpbmRpbmcuU3R5bGUuRE9DVU1FTlQsIGVuZHBvaW50SW50ZkRlc2MuZ2V0U29hcEJpbmRpbmdTdHlsZSgpKTsKLSovCi0gICAgfQotCi0gICAgLy9UT0RPOiBCYXNpYyBUZXN0IHdpdGggRW5kcG9pbnRJbnRlcmZhY2Ugc2V0IHRvIHNvbWV0aGluZyB2YWxpZCwgc28gYW5vdGhlciBEQkMgbXVzdAotICAgIC8vIGV4aXN0IGluIGxpc3QKLQotICAgIC8vVE9ETzogQmFzaWMgVGVzdCBmb3IgUHJvdmlkZXIKLQotICAgIC8vVE9ETzogVmFsaWRhdGlvbiBUZXN0cwotICAgIC8vIC0gU2V0dGluZyBXUyBhbmQgV1NQCi0gICAgLy8gLSBGYWlsIGp1c3Qgb25lIGluIExpc3QsIEJ1dCBhbGxvdyBzdWNjZXNzZnVsIG9uZXMgdG8gcGFzcwotCi0gICAgLyoKLSAgICAqIE1ldGhvZCB0byByZXR1cm4gdGhlIGVuZHBvaW50IGludGVyZmFjZSBkZXNjcmlwdGlvbiBmb3IgYSBnaXZlbiBpbXBsZW1lbnRhdGlvbiBjbGFzcy4KLSAgICAqLwotCi0gICAgLy9wcml2YXRlIEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24gZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjKENsYXNzIGltcGxlbWVudGF0aW9uQ2xhc3MpIHsKLSAgICAvLyAgICAvLyBVc2UgdGhlIGRlc2NyaXB0aW9uIGZhY3RvcnkgZGlyZWN0bHk7IHRoaXMgd2lsbCBiZSBkb25lIHdpdGhpbiB0aGUgSkFYLVdTIHJ1bnRpbWUKLSAgICAvLyAgICByZXR1cm4gKG5ldyBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uKCkpOyAKLSAgICAvLwkvL3JldHVybiB0ZXN0RW5kcG9pbnRJbnRlcmZhY2VEZXNjOwotICAgIC8vfQotCi0gICAgc3RhdGljIHB1YmxpYyBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgYnVpbGREQkNOb0VuZHBvaW50SW50ZXJmYWNlKCkgewotCi0gICAgICAgIC8vQ3JlYXRlIGEgV2ViU2VydmljZUFubm90Ci0gICAgICAgIFN0cmluZyBXU05hbWUgPSAiRWNob1NlcnZpY2VBbm5vdGF0ZWQiOwotICAgICAgICBTdHJpbmcgV1NUYXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL2Rlc2NyaXB0aW9uLmpheHdzLmF4aXMyLmFwYWNoZS5vcmcvIjsKLSAgICAgICAgU3RyaW5nIFdTU2VydmljZU5hbWUgPSAiRWNob1NlcnZpY2VOYW1lIjsKLSAgICAgICAgLy9TdHJpbmcgV1NXc2RsTG9jYXRpb24gPSAiaHR0cDovL0VjaG9TZXJ2aWNlL3dzZGwiOwotICAgICAgICBTdHJpbmcgV1NXc2RsTG9jYXRpb24gPSAiIjsKLSAgICAgICAgU3RyaW5nIFdTRW5kcG9pbnRJbnRlcmZhY2UgPSAiIjsKLSAgICAgICAgU3RyaW5nIFdTUG9ydE5hbWUgPSAiRWNob1NlcnZpY2VBbm5vdGF0ZWRQb3J0IjsKLQotICAgICAgICBXZWJTZXJ2aWNlQW5ub3Qgd2ViU2VydmljZUFubm90ID0KLSAgICAgICAgICAgICAgICBXZWJTZXJ2aWNlQW5ub3QuY3JlYXRlV2ViU2VydmljZUFubm90SW1wbCgKLSAgICAgICAgICAgICAgICAgICAgICAgIFdTTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFdTVGFyZ2V0TmFtZXNwYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgV1NTZXJ2aWNlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFdTV3NkbExvY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgV1NFbmRwb2ludEludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFdTUG9ydE5hbWUpOwotCi0gICAgICAgIC8vQ3JlYXRlIGEgV2ViTWV0aG9kQW5ub3QKLSAgICAgICAgU3RyaW5nIG9wZXJhdGlvbk5hbWUgPSAiZWNob1N0cmluZ01ldGhvZCI7Ci0gICAgICAgIFN0cmluZyBhY3Rpb24gPSAidXJuOkVjaG9TdHJpbmdNZXRob2QiOwotICAgICAgICBib29sZWFuIGV4Y2x1ZGUgPSBmYWxzZTsKLQotICAgICAgICBXZWJNZXRob2RBbm5vdCB3ZWJNZXRob2RBbm5vdCA9IFdlYk1ldGhvZEFubm90LmNyZWF0ZVdlYk1ldGhvZEFubm90SW1wbCgpOwotICAgICAgICB3ZWJNZXRob2RBbm5vdC5zZXRPcGVyYXRpb25OYW1lKG9wZXJhdGlvbk5hbWUpOwotICAgICAgICB3ZWJNZXRob2RBbm5vdC5zZXRBY3Rpb24oYWN0aW9uKTsKLSAgICAgICAgd2ViTWV0aG9kQW5ub3Quc2V0RXhjbHVkZShleGNsdWRlKTsKLQotICAgICAgICAvL0NyZWF0ZSB0aGUgV2ViUGFyYW1Bbm5vdAotICAgICAgICBTdHJpbmcgV1BOYW1lID0gImFyZzAiOwotICAgICAgICBTdHJpbmcgV1BQYXJ0TmFtZSA9ICJza3UiOwotICAgICAgICBTdHJpbmcgV1BUYXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL2Rlc2NyaXB0aW9uLmpheHdzLmF4aXMyLmFwYWNoZS5vcmcvIjsKLSAgICAgICAgV2ViUGFyYW0uTW9kZSBXUE1vZGUgPSBXZWJQYXJhbS5Nb2RlLklOOwotICAgICAgICBib29sZWFuIFdQSGVhZGVyID0gdHJ1ZTsKLQotICAgICAgICBXZWJQYXJhbUFubm90IHdlYlBhcmFtQW5ub3QgPSBXZWJQYXJhbUFubm90LmNyZWF0ZVdlYlBhcmFtQW5ub3RJbXBsKCk7Ci0gICAgICAgIHdlYlBhcmFtQW5ub3Quc2V0TmFtZShXUE5hbWUpOwotICAgICAgICB3ZWJQYXJhbUFubm90LnNldFBhcnROYW1lKFdQUGFydE5hbWUpOwotICAgICAgICB3ZWJQYXJhbUFubm90LnNldE1vZGUoV1BNb2RlKTsKLSAgICAgICAgd2ViUGFyYW1Bbm5vdC5zZXRUYXJnZXROYW1lc3BhY2UoV1BUYXJnZXROYW1lc3BhY2UpOwotICAgICAgICB3ZWJQYXJhbUFubm90LnNldEhlYWRlcihXUEhlYWRlcik7Ci0KLSAgICAgICAgLy9CdWlsZCB1cCB0aGUgdGhlIERCQyBhbmQgYWxsIG5lY2Vzc2FyeSBjb21wb3NpdGVzCi0gICAgICAgIFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlIHBkYyA9IG5ldyBQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZSgpOwotICAgICAgICBwZGMuc2V0UGFyYW1ldGVyVHlwZSgiamF2YS5sYW5nLlN0cmluZyIpOwotICAgICAgICBwZGMuc2V0V2ViUGFyYW1Bbm5vdCh3ZWJQYXJhbUFubm90KTsKLQotICAgICAgICBNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSBtZGMgPSBuZXcgTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUoKTsKLSAgICAgICAgbWRjLnNldFdlYk1ldGhvZEFubm90KHdlYk1ldGhvZEFubm90KTsKLSAgICAgICAgbWRjLnNldE1ldGhvZE5hbWUob3BlcmF0aW9uTmFtZSk7Ci0gICAgICAgIG1kYy5hZGRQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZShwZGMsIDApOwotCi0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBkYmMgPSBuZXcgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCk7Ci0gICAgICAgIGRiYy5zZXRDbGFzc05hbWUoIm9yZy5hcGFjaGUuYXhpczIuc2FtcGxlcy5FY2hvU2VydmljZUFubm90YXRlZCIpOwotICAgICAgICBkYmMuc2V0V2ViU2VydmljZUFubm90KHdlYlNlcnZpY2VBbm5vdCk7Ci0gICAgICAgIGRiYy5hZGRNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZShtZGMpOwotCi0gICAgICAgIHJldHVybiBkYmM7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RMb2FkV1NETEltcGwoKSB7Ci0gICAgICAgIFN0cmluZyB3c2RsTG9jYXRpb24gPSBnZXRFY2hvTWVzc2FnZVNlcnZpY2VXU0RMTG9jYXRpb24oKTsKLQotICAgICAgICAvLyBCdWlsZCB1cCBhIERCQywgaW5jbHVkaW5nIHRoZSBXU0RMIERlZmluaXRpb24gYW5kIHRoZSBhbm5vdGF0aW9uIGluZm9ybWF0aW9uIGZvciAKLSAgICAgICAgLy8gdGhlIGltcGwgY2xhc3MuCi0gICAgICAgIEphdmFDbGFzc1RvREJDQ29udmVydGVyIGNvbnZlcnRlciA9IG5ldyBKYXZhQ2xhc3NUb0RCQ0NvbnZlcnRlcihFY2hvTWVzc2FnZVNlcnZpY2UuY2xhc3MpOwotICAgICAgICBIYXNoTWFwPFN0cmluZywgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlPiBkYmNNYXAgPSBjb252ZXJ0ZXIucHJvZHVjZURCQygpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGRiY01hcCk7Ci0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBkYmMgPSBkYmNNYXAuZ2V0KEVjaG9NZXNzYWdlU2VydmljZS5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGRiYyk7Ci0gICAgICAgIGRiYy5zZXRDbGFzc0xvYWRlcih0aGlzLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSk7Ci0KLSAgICAgICAgV2ViU2VydmljZUFubm90IHdlYlNlcnZpY2VBbm5vdCA9IGRiYy5nZXRXZWJTZXJ2aWNlQW5ub3QoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh3ZWJTZXJ2aWNlQW5ub3QpOwotICAgICAgICB3ZWJTZXJ2aWNlQW5ub3Quc2V0V3NkbExvY2F0aW9uKHdzZGxMb2NhdGlvbik7Ci0gICAgICAgIGRiYy5zZXRXZWJTZXJ2aWNlQW5ub3Qod2ViU2VydmljZUFubm90KTsKLSAgICAgICAgZGJjTWFwLnB1dChFY2hvTWVzc2FnZVNlcnZpY2UuY2xhc3MuZ2V0TmFtZSgpLCBkYmMpOwotICAgICAgICAKLSAgICAgICAgTGlzdDxTZXJ2aWNlRGVzY3JpcHRpb24+IHNlcnZpY2VEZXNjTGlzdCA9Ci0gICAgICAgICAgICBEZXNjcmlwdGlvbkZhY3RvcnkuY3JlYXRlU2VydmljZURlc2NyaXB0aW9uRnJvbURCQ01hcChkYmNNYXApOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgc2VydmljZURlc2NMaXN0LnNpemUoKSk7Ci0gICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzZCA9IHNlcnZpY2VEZXNjTGlzdC5nZXQoMCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2QpOwotICAgICAgICAKLSAgICAgICAgLy8gbWFrZSBzdXJlIHRoZSBXU0RMIGRlZmluaXRpb24gd2FzIHJlYWQgaW4gZnJvbSB0aGUgYXBwcm9wcmlhdGUgbG9jYXRpb24KLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgoKFNlcnZpY2VEZXNjcmlwdGlvbldTREwpIHNkKS5nZXRXU0RMRGVmaW5pdGlvbigpKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdExvYWRXU0RMU0VJKCkgewotICAgICAgICBTdHJpbmcgd3NkbExvY2F0aW9uID0gZ2V0RWNob01lc3NhZ2VTZXJ2aWNlV1NETExvY2F0aW9uKCk7Ci0KLSAgICAgICAgLy8gQnVpbGQgdXAgYSBEQkMsIGluY2x1ZGluZyB0aGUgV1NETCBEZWZpbml0aW9uIGFuZCB0aGUgYW5ub3RhdGlvbiBpbmZvcm1hdGlvbiBmb3IgCi0gICAgICAgIC8vIHRoZSBpbXBsIGNsYXNzLgotICAgICAgICBKYXZhQ2xhc3NUb0RCQ0NvbnZlcnRlciBjb252ZXJ0ZXIgPSBuZXcgSmF2YUNsYXNzVG9EQkNDb252ZXJ0ZXIoRWNob01lc3NhZ2VTZXJ2aWNlU0VJLmNsYXNzKTsKLSAgICAgICAgSGFzaE1hcDxTdHJpbmcsIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZT4gZGJjTWFwID0gY29udmVydGVyLnByb2R1Y2VEQkMoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChkYmNNYXApOwotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgZGJjID0gZGJjTWFwLmdldChFY2hvTWVzc2FnZVNlcnZpY2VTRUkuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChkYmMpOwotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgc2VpREJDID0gZGJjTWFwLmdldChFY2hvTWVzc2FnZVNlcnZpY2VJbnRlcmZhY2UuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZWlEQkMpOwotICAgICAgICBkYmMuc2V0Q2xhc3NMb2FkZXIodGhpcy5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkpOwotCi0gICAgICAgIFdlYlNlcnZpY2VBbm5vdCB3ZWJTZXJ2aWNlQW5ub3QgPSBzZWlEQkMuZ2V0V2ViU2VydmljZUFubm90KCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwod2ViU2VydmljZUFubm90KTsKLSAgICAgICAgd2ViU2VydmljZUFubm90LnNldFdzZGxMb2NhdGlvbih3c2RsTG9jYXRpb24pOwotICAgICAgICBzZWlEQkMuc2V0V2ViU2VydmljZUFubm90KHdlYlNlcnZpY2VBbm5vdCk7Ci0gICAgICAgIGRiY01hcC5wdXQoRWNob01lc3NhZ2VTZXJ2aWNlSW50ZXJmYWNlLmNsYXNzLmdldE5hbWUoKSwgc2VpREJDKTsKLSAgICAgICAgCi0gICAgICAgIExpc3Q8U2VydmljZURlc2NyaXB0aW9uPiBzZXJ2aWNlRGVzY0xpc3QgPQotICAgICAgICAgICAgRGVzY3JpcHRpb25GYWN0b3J5LmNyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbkZyb21EQkNNYXAoZGJjTWFwKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHNlcnZpY2VEZXNjTGlzdC5zaXplKCkpOwotICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc2QgPSBzZXJ2aWNlRGVzY0xpc3QuZ2V0KDApOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNkKTsKLSAgICAgICAgCi0gICAgICAgIC8vIG1ha2Ugc3VyZSB0aGUgV1NETCBkZWZpbml0aW9uIHdhcyByZWFkIGluIGZyb20gdGhlIGFwcHJvcHJpYXRlIGxvY2F0aW9uCi0gICAgICAgIGFzc2VydE5vdE51bGwoKChTZXJ2aWNlRGVzY3JpcHRpb25XU0RMKSBzZCkuZ2V0V1NETERlZmluaXRpb24oKSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFRoaXMgaXMgaW50ZW5kZWQgdG8gdmVyaWZ5ICB0aGF0IHByb3BlcnRpZXMgc2V0IG9uIGEgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlCi0gICAgICogaW5zdGFuY2UgYXJlIGNhcnJpZWQgb3ZlciB0byB0aGUgRW5kcG9pbnREZXNjcmlwdGlvbiBvYmplY3QgdGhhdCBpcyBjcmVhdGVkIAotICAgICAqIGZyb20gdGhlIERCQy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0UHJvcGVydGllcygpIHsKLSAgICAgICAgCi0gICAgICAgIC8vQnVpbGQgYSBIYXNobWFwIG9mIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZXMgdGhhdCBjb250YWlucyB0aGUgc2VydmljZUltcGwgYW5kCi0gICAgICAgIC8vYWxsIG5lY2Vzc2FyeSBhc3NvY2lhdGVkIERCQydzIHBvc3NpYmx5IGluY2x1ZGluZyBTRUkgYW5kIHN1cGVyY2xhc3NlcwotICAgICAgICBIYXNoTWFwPFN0cmluZywgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlPiBkYmNNYXAgPQotICAgICAgICAgICAgICAgIG5ldyBIYXNoTWFwPFN0cmluZywgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlPigpOwotCi0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBkYmMgPSBidWlsZERCQ05vRW5kcG9pbnRJbnRlcmZhY2UoKTsKLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotICAgICAgICBwcm9wcy5wdXQoInByb3AxIiwgInByb3AxIik7Ci0gICAgICAgIHByb3BzLnB1dCgicHJvcDIiLCAicHJvcDIiKTsKLSAgICAgICAgZGJjLnNldFByb3BlcnRpZXMocHJvcHMpOwotCi0gICAgICAgIGRiY01hcC5wdXQoZGJjLmdldENsYXNzTmFtZSgpLCBkYmMpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgTGlzdDxTZXJ2aWNlRGVzY3JpcHRpb24+IHNlcnZpY2VEZXNjTGlzdCA9Ci0gICAgICAgICAgICAgICAgRGVzY3JpcHRpb25GYWN0b3J5LmNyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbkZyb21EQkNNYXAoZGJjTWFwKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZURlc2NMaXN0LmdldCgwKSk7Ci0KLSAgICAgICAgICAgIC8vV2Uga25vdyB0aGlzIGxpc3QgY29udGFpbnMgb25seSBvbmUgU0QsIHNvIG5vIG5lZWQgdG8gbG9vcAotICAgICAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbltdIGVuZHBvaW50RGVzYyA9IHNlcnZpY2VEZXNjTGlzdC5nZXQoMCkuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbnMoKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoZW5kcG9pbnREZXNjKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhlbmRwb2ludERlc2MubGVuZ3RoLCAxKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gZ2V0IHRoZSBFbmRwb2ludERlc2NyaXB0aW9uIHNvIHdlIGNhbiBtYWtlIHN1cmUgdGhlIHByb3BlcnRpZXMgd2VyZQotICAgICAgICAgICAgLy8gcHJvcG9nYXRlZCB0byB0aGUgdW5kZXJseWluZyBBeGlzIHJ1bnRpbWUgb2JqZWN0cwotICAgICAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlZCA9IGVuZHBvaW50RGVzY1swXTsgICAgICAgICAgCi0gICAgICAgICAgICAvLyBtYWtlIHN1cmUgd2UgZmluZCB0aGUgdHdvIHByb3BlcnRpZXMgdGhhdCB3ZXJlIHNldCBvbiB0aGUgREJDCi0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGVkLmdldFByb3BlcnR5KCJwcm9wMSIpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoZWQuZ2V0UHJvcGVydHkoInByb3AxIikuZXF1YWxzKCJwcm9wMSIpKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoZWQuZ2V0UHJvcGVydHkoInByb3AyIikpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShlZC5nZXRQcm9wZXJ0eSgicHJvcDIiKS5lcXVhbHMoInByb3AyIikpOwotICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0RWNob01lc3NhZ2VTZXJ2aWNlV1NETExvY2F0aW9uKCkgewotICAgIAlTdHJpbmcgbG9jID0gbnVsbDsKLSAgICAJU3RyaW5nIHNlcCA9IGphdmEuaW8uRmlsZS5zZXBhcmF0b3I7Ci0gICAgICAgIGxvYyA9IHNlcCArICJ0ZXN0LXJlc291cmNlcyIgKyBzZXAgKyAid3NkbCIgKyBzZXAgKyAiRWNob01lc3NhZ2VTZXJ2aWNlLndzZGwiOwotICAgICAgICB0cnkgewotICAgICAgICAJU3RyaW5nIGJhc2VEaXIgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoImJhc2VkaXIiLCIuIikpLmdldENhbm9uaWNhbFBhdGgoKTsKLSAgICAgICAgICAgIGxvYyA9IGJhc2VEaXIgKyBsb2M7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgIAlpb2UucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLSAgICAJcmV0dXJuIGxvYzsKLSAgICB9Ci0gICAgCi0gICAgQFdlYlNlcnZpY2Uoc2VydmljZU5hbWUgPSAiRWNob01lc3NhZ2VTZXJ2aWNlIiwgcG9ydE5hbWUgPSAiRWNob01lc3NhZ2VQb3J0IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9ub25hbm9ueW1vdXMuY29tcGxleHR5cGUudGVzdC5vcmciLCB3c2RsTG9jYXRpb24gPSAidGVzdC1yZXNvdXJjZXMvd3NkbC9FY2hvTWVzc2FnZVNlcnZpY2Uud3NkbCIpCi0gICAgcHVibGljIGNsYXNzIEVjaG9NZXNzYWdlU2VydmljZSB7Ci0gICAgICAgIHB1YmxpYyBTdHJpbmcgZWNob01lc3NhZ2UoU3RyaW5nIGFyZykgewotICAgICAgICAgICAgcmV0dXJuIGFyZzsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBAV2ViU2VydmljZShzZXJ2aWNlTmFtZSA9ICJFY2hvTWVzc2FnZVNlcnZpY2UiLCBlbmRwb2ludEludGVyZmFjZT0KLSAgICAJCSJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkFubm90YXRpb25TZXJ2aWNlSW1wbFdpdGhEQkNUZXN0cyRFY2hvTWVzc2FnZVNlcnZpY2VJbnRlcmZhY2UiKQotICAgIHB1YmxpYyBjbGFzcyBFY2hvTWVzc2FnZVNlcnZpY2VTRUkgewotICAgICAgICBwdWJsaWMgU3RyaW5nIGVjaG9NZXNzYWdlKFN0cmluZyBhcmcpIHsKLSAgICAgICAgICAgIHJldHVybiBhcmc7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgQFdlYlNlcnZpY2UocG9ydE5hbWUgPSAiRWNob01lc3NhZ2VQb3J0IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9ub25hbm9ueW1vdXMuY29tcGxleHR5cGUudGVzdC5vcmciLCB3c2RsTG9jYXRpb24gPSAidGVzdC1yZXNvdXJjZXMvd3NkbC9FY2hvTWVzc2FnZVNlcnZpY2Uud3NkbCIpCi0gICAgcHVibGljIGludGVyZmFjZSBFY2hvTWVzc2FnZVNlcnZpY2VJbnRlcmZhY2UgewotICAgICAgICBwdWJsaWMgU3RyaW5nIGVjaG9NZXNzYWdlKFN0cmluZyBhcmcpOwotICAgIH0KLX0KLQotCi0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9EQkN3aXRoUmVkdWNlV1NETE1lbW9yeVBhcm1zVGVzdHMuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9EQkN3aXRoUmVkdWNlV1NETE1lbW9yeVBhcm1zVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGY2NmY5Zi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vREJDd2l0aFJlZHVjZVdTRExNZW1vcnlQYXJtc1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbjsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5QYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLldlYlNlcnZpY2VBbm5vdDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51dGlsLldTRExXcmFwcGVyOw0KLQ0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsNCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOw0KLWltcG9ydCBqYXZhLmlvLkZpbGU7DQotaW1wb3J0IGphdmEubmV0LlVSTDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLS8qKg0KLSAqIFRoZXNlIHRlc3RzIGFyZSBpbnRlbmRlZCB0byB0ZXN0IHZhcmlvdXMgYXNwZWN0cyBvZiB0aGUgT3BlcmF0aW9uRGVzY3JpcHRpb24uDQotICovDQotDQotcHVibGljIGNsYXNzIERCQ3dpdGhSZWR1Y2VXU0RMTWVtb3J5UGFybXNUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsNCi0NCi0gICAgLyoqDQotICAgICAqIFRoaXMgdGVzdCB3aWxsIGNvbmZpcm0gdGhhdCB3aGVuIHJlZHVjZVdTRExNZW1vcnlDYWNoZSBpcyB0cnVlIA0KLSAgICAgKiBhbmQgcmVkdWNlV1NETE1lbW9yeVR5cGU9Mg0KLSAgICAgKiAgVGhlIFdzZGxEZWZpbml0aW9uV3JhcHBlciB3aWxsIGNvbnN0cnVjdCBXU0RMV3JhcHBlclJlbG9hZEltcGwgY2xhc3NlcyAgDQotICAgICAqDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBiYXNlZGlyOw0KLSAgICBzdGF0aWMgew0KLSAgICAgICAgYmFzZWRpciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiYmFzZWRpciIpOw0KLSAgICAgICAgaWYgKGJhc2VkaXIgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIGJhc2VkaXIgPSBuZXcgRmlsZSgiLiIpLmdldEFic29sdXRlUGF0aCgpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3REQkN3aXRoUmVkdWNlV1NETE1lbW9yeVBhcm1zKCkgew0KLSAgICAgICAgDQotICAgICAgICAvLyBJIHVzZWQgT3BlcmF0aW9uRGVzY3JpcHRpb25UZXN0cyBhcyBhIHRlbXBsYXRlIGZvciB0aGlzIHRlc3QNCi0NCi0gICAgICAgIFN0cmluZyBheGlzMnhtbCA9IGJhc2VkaXIgKw0KLSAgICAgICAgICAgICIvdGVzdC1yZXNvdXJjZXMvYXhpczIueG1sIjsNCi0gICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNjOw0KLSAgICAgICAgdHJ5IHsNCi0NCi0gICAgICAgICAgICBjYyA9IENvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeQ0KLSAgICAgICAgICAgICAgICAuY3JlYXRlQ29uZmlndXJhdGlvbkNvbnRleHRGcm9tRmlsZVN5c3RlbShudWxsLCBheGlzMnhtbCk7DQotICAgICAgICAgICAgaWYgKGNjICE9bnVsbCkgew0KLSAgICAgICAgICAgICAgICBTdHJpbmcgcGFybSA9IChTdHJpbmcpY2MuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5nZXRQYXJhbWV0ZXJWYWx1ZSgicmVkdWNlV1NETE1lbW9yeUNhY2hlIikgOw0KLSAgICAgICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiY29uZmlnQ29udGV4dCBwYXJtOiIgKyBwYXJtICk7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oImNvbmZpZ0NvbnRleHQ6IGlzIG51bGwiICk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYXhpczJ4bWwpOw0KLQ0KLSAgICAgICAgICAgIFN0cmluZyB3c2RsUmVsYXRpdmVMb2NhdGlvbiA9ICJ0ZXN0LXJlc291cmNlcy93c2RsLyI7DQotICAgICAgICAgICAgU3RyaW5nIHdzZGxGaWxlTmFtZSA9ICJCaW5kaW5nTmFtZXNwYWNlLndzZGwiOw0KLSAgICAgICAgICAgIFN0cmluZyB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL25vbmFub255bW91cy5jb21wbGV4dHlwZS50ZXN0Lm9yZyI7DQotICAgICAgICAgICAgU3RyaW5nIHdzZGxMb2NhdGlvbiA9IHdzZGxSZWxhdGl2ZUxvY2F0aW9uICsgd3NkbEZpbGVOYW1lOw0KLQ0KLSAgICAgICAgICAgIC8vIEJ1aWxkIHVwIGEgREJDLCBpbmNsdWRpbmcgdGhlIFdTREwgRGVmaW5pdGlvbiBhbmQgdGhlIGFubm90YXRpb24gaW5mb3JtYXRpb24gZm9yIA0KLSAgICAgICAgICAgIC8vIHRoZSBpbXBsIGNsYXNzLg0KLSAgICAgICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBkYmMgPSBuZXcgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKGNjKTsNCi0NCi0gICAgICAgICAgICBVUkwgd3NkbFVSTCA9IERlc2NyaXB0aW9uVGVzdFV0aWxzLmdldFdTRExVUkwod3NkbEZpbGVOYW1lKTsNCi0gICAgICAgICAgICBEZWZpbml0aW9uIHdzZGxEZWZuID0gRGVzY3JpcHRpb25UZXN0VXRpbHMuY3JlYXRlV1NETERlZmluaXRpb24od3NkbFVSTCk7DQotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCh3c2RsRGVmbik7DQotDQotICAgICAgICAgICAgV2ViU2VydmljZUFubm90IHdlYlNlcnZpY2VBbm5vdCA9IFdlYlNlcnZpY2VBbm5vdC5jcmVhdGVXZWJTZXJ2aWNlQW5ub3RJbXBsKCk7DQotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCh3ZWJTZXJ2aWNlQW5ub3QpOw0KLSAgICAgICAgICAgIHdlYlNlcnZpY2VBbm5vdC5zZXRXc2RsTG9jYXRpb24od3NkbExvY2F0aW9uKTsNCi0gICAgICAgICAgICB3ZWJTZXJ2aWNlQW5ub3Quc2V0VGFyZ2V0TmFtZXNwYWNlKHRhcmdldE5hbWVzcGFjZSk7DQotICAgICAgICAgICAgd2ViU2VydmljZUFubm90LnNldFNlcnZpY2VOYW1lKCJFY2hvTWVzc2FnZVNlcnZpY2UiKTsNCi0gICAgICAgICAgICB3ZWJTZXJ2aWNlQW5ub3Quc2V0UG9ydE5hbWUoIkVjaG9NZXNzYWdlUG9ydCIpOw0KLQ0KLSAgICAgICAgICAgIE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlIG1kYyA9IG5ldyBNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSgpOw0KLSAgICAgICAgICAgIG1kYy5zZXRNZXRob2ROYW1lKCJlY2hvTWVzc2FnZSIpOw0KLSAgICAgICAgICAgIG1kYy5zZXRSZXR1cm5UeXBlKCJqYXZhLmxhbmcuU3RyaW5nIik7DQotDQotICAgICAgICAgICAgUGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGUgcGRjMSA9IG5ldyBQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZSgpOw0KLSAgICAgICAgICAgIHBkYzEuc2V0UGFyYW1ldGVyVHlwZSgiamF2YS5sYW5nLlN0cmluZyIpOw0KLQ0KLSAgICAgICAgICAgIG1kYy5hZGRQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZShwZGMxKTsNCi0NCi0gICAgICAgICAgICBkYmMuYWRkTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUobWRjKTsNCi0gICAgICAgICAgICBkYmMuc2V0V2ViU2VydmljZUFubm90KHdlYlNlcnZpY2VBbm5vdCk7DQotICAgICAgICAgICAgZGJjLnNldENsYXNzTmFtZShCaW5kaW5nTlNJbXBsLmNsYXNzLmdldE5hbWUoKSk7DQotICAgICAgICAgICAgLy9kYmMuc2V0V3NkbERlZmluaXRpb24od3NkbERlZm4pOw0KLSAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJEQkN3aXRoQ29uZmlnQ29udGV4dFRlc3RzIHNldFdzZGxVUkwiICk7DQotICAgICAgICAgICAgZGJjLnNldHdzZGxVUkwod3NkbFVSTCk7DQotICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIkRCQ3dpdGhDb25maWdDb250ZXh0VGVzdHMgbmV3IEhhc2hNYXAiICk7DQotDQotICAgICAgICAgICAgSGFzaE1hcDxTdHJpbmcsIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZT4gZGJjTWFwID0NCi0gICAgICAgICAgICAgICAgbmV3IEhhc2hNYXA8U3RyaW5nLCBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGU+KCk7DQotICAgICAgICAgICAgZGJjTWFwLnB1dChkYmMuZ2V0Q2xhc3NOYW1lKCksIGRiYyk7DQotICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIioqKiogRGVzY3JpcHRpb25GYWN0b3J5LmNyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbkZyb21EQkNNYXAtREJDLXRvU3RyaW5nIiArIA0KLSAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgIGRiYy50b1N0cmluZygpICsgIiB0b1N0cmluZy1FTkQiICk7DQotICAgICAgICAgICAgTGlzdDxTZXJ2aWNlRGVzY3JpcHRpb24+IHNlcnZpY2VEZXNjTGlzdCA9DQotICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uRmFjdG9yeS5jcmVhdGVTZXJ2aWNlRGVzY3JpcHRpb25Gcm9tREJDTWFwKGRiY01hcCwgY2MpOw0KLSAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCIqKioqIERCQ3dpdGhDb25maWdDb250ZXh0VGVzdHMgdGVzdHM6IiArIGRiYy50b1N0cmluZygpICsiIHRvU3RyaW5nLUVORCIgKTsNCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgc2VydmljZURlc2NMaXN0LnNpemUoKSk7DQotICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIkRCQ3dpdGhDb25maWdDb250ZXh0VGVzdHMgZ2V0IFNlcnZpY2VEZXNjcmlwdGlvbiIgKTsNCi0gICAgICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb25XU0RMIHNkdyA9IChTZXJ2aWNlRGVzY3JpcHRpb25XU0RMKXNlcnZpY2VEZXNjTGlzdC5nZXQoMCk7DQotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChzZHcpOw0KLQ0KLSAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJEQkN3aXRoQ29uZmlnQ29udGV4dFRlc3RzIFNlcnZpY2VEZXNjcmlwdGlvbldTREwgbm90IG51bGwiICk7DQotDQotICAgICAgICAgICAgV1NETFdyYXBwZXIgdyA9IHNkdy5nZXRXU0RMV3JhcHBlcigpOw0KLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwodyk7DQotICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIkRCQ3dpdGhDb25maWdDb250ZXh0VGVzdHMgV1NETFdyYXBwZXIgbm90IG51bGwiICk7DQotDQotICAgICAgICAgICAgRGVmaW5pdGlvbiBkID0gdy5nZXREZWZpbml0aW9uKCk7DQotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChkKTsNCi0gICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiREJDd2l0aENvbmZpZ0NvbnRleHRUZXN0cyBEZWZpbml0aW9uIG5vdCBudWxsIiApOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZC50b1N0cmluZygpLnN0YXJ0c1dpdGgoIm9yZy5hcGFjaGUuYXhpczIud3NkbC51dGlsLldTRExXcmFwcGVyUmVsb2FkSW1wbCIpICk7DQotDQotDQotICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oImQ6IiArIGQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiXG4iICsgZC50b1N0cmluZygpICkgOw0KLQ0KLSAgICAgICAgICAgIC8qDQotICAgICAgICAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbltdIGVkQXJyYXkgPSBzZC5nZXRFbmRwb2ludERlc2NyaXB0aW9ucygpOw0KLSAgICAgICAgICAgICAgIGFzc2VydE5vdE51bGwoZWRBcnJheSk7DQotICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGVkQXJyYXkubGVuZ3RoKTsNCi0gICAgICAgICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVkID0gZWRBcnJheVswXTsNCi0gICAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKGVkKTsNCi0NCi0gICAgICAgICAgICAgICBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uIGVpZCA9IGVkLmdldEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24oKTsNCi0gICAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKGVpZCk7DQotDQotICAgICAgICAgICAgICAgT3BlcmF0aW9uRGVzY3JpcHRpb25bXSBvZEFycmF5ID0gZWlkLmdldE9wZXJhdGlvbnMoKTsNCi0gICAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKG9kQXJyYXkpOw0KLSAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBvZEFycmF5Lmxlbmd0aCk7DQotICAgICAgICAgICAgICAgT3BlcmF0aW9uRGVzY3JpcHRpb24gb2QgPSBvZEFycmF5WzBdOw0KLSAgICAgICAgICAgICAgIGFzc2VydE5vdE51bGwob2QpOw0KLSAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygiaHR0cDovL29yZy5hcGFjaGUuYmluZGluZy5ucyIsIG9kLmdldEJpbmRpbmdJbnB1dE5hbWVzcGFjZSgpKTsNCi0gICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly9vcmcuYXBhY2hlLmJpbmRpbmcubnMiLCBvZC5nZXRCaW5kaW5nT3V0cHV0TmFtZXNwYWNlKCkpOw0KLSAgICAgICAgICAgICAqLw0KLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGUpIHsNCi0gICAgICAgICAgICBmYWlsKCJUaGlzIHNob3VsZCBub3QgZmFpbCB3aXRoIHRoaXMgIiArIGUpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotDQotICAgIEBXZWJTZXJ2aWNlKHNlcnZpY2VOYW1lID0gIkVjaG9NZXNzYWdlU2VydmljZSIsIHBvcnROYW1lID0gIkVjaG9NZXNzYWdlUG9ydCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vbm9uYW5vbnltb3VzLmNvbXBsZXh0eXBlLnRlc3Qub3JnIiwgd3NkbExvY2F0aW9uID0gInRlc3QtcmVzb3VyY2VzL3dzZGwvQmluZGluZ05hbWVzcGFjZS53c2RsIikNCi0gICAgcHVibGljIGNsYXNzIEJpbmRpbmdOU0ltcGwgew0KLSAgICAgICAgcHVibGljIFN0cmluZyBlY2hvTWVzc2FnZShTdHJpbmcgYXJnKSB7DQotICAgICAgICAgICAgcmV0dXJuIGFyZzsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLQ0KLSAgICBAV2ViU2VydmljZShzZXJ2aWNlTmFtZSA9ICJFY2hvTWVzc2FnZVNlcnZpY2UiLCBwb3J0TmFtZSA9ICJFY2hvTWVzc2FnZVBvcnQiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL25vbmFub255bW91cy5jb21wbGV4dHlwZS50ZXN0Lm9yZyIsIHdzZGxMb2NhdGlvbiA9ICJ0ZXN0LXJlc291cmNlcy93c2RsL0JpbmRpbmdOYW1lc3BhY2VEZWZhdWx0cy53c2RsIikNCi0gICAgcHVibGljIGNsYXNzIEJpbmRpbmdOU0RlZmF1bHRzSW1wbCB7DQotICAgICAgICBwdWJsaWMgU3RyaW5nIGVjaG9NZXNzYWdlKFN0cmluZyBhcmcpIHsNCi0gICAgICAgICAgICByZXR1cm4gYXJnOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9EZXNjcmlwdGlvblRlc3RVdGlscy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL0Rlc2NyaXB0aW9uVGVzdFV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmYTEyM2YuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL0Rlc2NyaXB0aW9uVGVzdFV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlOwotCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuZmFjdG9yeS5XU0RMRmFjdG9yeTsKLWltcG9ydCBqYXZheC53c2RsLnhtbC5XU0RMUmVhZGVyOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBEZXNjcmlwdGlvblRlc3RVdGlscyB7Ci0KLSAgICAvKgotICAgICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgKiBUZXN0IHV0aWxpdHkgbWV0aG9kcwotICAgICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgKi8KLQotICAgIHN0YXRpYyBwdWJsaWMgVVJMIGdldFdTRExVUkwoKSB7Ci0gICAgICAgIHJldHVybiBnZXRXU0RMVVJMKCJXU0RMVGVzdHMud3NkbCIpOwotCi0gICAgfQotICAgIAotICAgIHN0YXRpYyBwdWJsaWMgU3RyaW5nIGdldFdTRExMb2NhdGlvbihTdHJpbmcgd3NkbEZpbGVOYW1lKSB7Ci0gICAgICAgIFN0cmluZyBiYXNlZGlyID0gU3lzdGVtLmdldFByb3BlcnR5KCJiYXNlZGlyIiwgIi4iKTsKLSAgICAgICAgU3RyaW5nIHVybFN0cmluZyA9IGJhc2VkaXIgKyAiL3Rlc3QtcmVzb3VyY2VzL3dzZGwvIiArIHdzZGxGaWxlTmFtZTsKLSAgICAgICAgcmV0dXJuIHVybFN0cmluZzsKLSAgICB9Ci0KLSAgICBzdGF0aWMgcHVibGljIFVSTCBnZXRXU0RMVVJMKFN0cmluZyB3c2RsRmlsZU5hbWUpIHsKLSAgICAgICAgVVJMIHdzZGxVUkwgPSBudWxsOwotICAgICAgICBTdHJpbmcgdXJsU3RyaW5nID0gZ2V0V1NETExvY2F0aW9uKHdzZGxGaWxlTmFtZSk7Ci0gICAgICAgIC8vIEdldCB0aGUgVVJMIHRvIHRoZSBXU0RMIGZpbGUuICBOb3RlIHRoYXQgJ2Jhc2VkaXInIGlzIHNldHVwIGJ5IE1hdmVuCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB3c2RsVVJMID0gbmV3IEZpbGUodXJsU3RyaW5nKS5nZXRBYnNvbHV0ZUZpbGUoKS50b1VSTCgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDYXVnaHQgZXhjZXB0aW9uIGNyZWF0aW5nIFdTREwgVVJMIDoiICsgdXJsU3RyaW5nICsKLSAgICAgICAgICAgICAgICAgICAgIjsgZXhjZXB0aW9uOiAiICsgZS50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gd3NkbFVSTDsKLSAgICB9Ci0KLSAgICBzdGF0aWMgRGVmaW5pdGlvbiBjcmVhdGVXU0RMRGVmaW5pdGlvbihVUkwgd3NkbFVSTCkgewotICAgICAgICBEZWZpbml0aW9uIHdzZGxEZWZpbml0aW9uID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFdTRExGYWN0b3J5IGZhY3RvcnkgPSBXU0RMRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgV1NETFJlYWRlciByZWFkZXIgPSBmYWN0b3J5Lm5ld1dTRExSZWFkZXIoKTsKLSAgICAgICAgICAgIHdzZGxEZWZpbml0aW9uID0gcmVhZGVyLnJlYWRXU0RMKHdzZGxVUkwudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB3c2RsRGVmaW5pdGlvbi5zZXREb2N1bWVudEJhc2VVUkkod3NkbFVSTC50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigKLSAgICAgICAgICAgICAgICAgICAgIioqKiBFUlJPUiAqKio6IENhdWdodCBleGNlcHRpb24gdHJ5aW5nIHRvIGNyZWF0ZSBXU0RMIERlZmluaXRpb246ICIgKyBlKTsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gd3NkbERlZmluaXRpb247Ci0gICAgfQotICAgIHN0YXRpYyBwdWJsaWMgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIGdldFNlcnZpY2VEZXNjcmlwdGlvbkNvbXBvc2l0ZShTZXJ2aWNlRGVzY3JpcHRpb24gc3ZjRGVzYykgewotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgcmV0dXJuQ29tcG9zaXRlID0gbnVsbDsKLSAgICAgICAgLy8gTmVlZCB0byBnZXQgdGhlIGNvbXBvc2l0ZSBvZmYgdGhlIGltcGxlbWVudGF0aW9uIHVzaW5nIHRoZSBnZXR0ZXIgbWV0aG9kLCBidXQgaXQgaXMgYWxsCi0gICAgICAgIC8vIHBhY2thZ2VkIHByb3RlY3RlZCBhbmQgbm90IHBhcnQgb2YgdGhlIGludGVyZmFjZS4KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE1ldGhvZCBnZXRDb21wb3NpdGUgPSBzdmNEZXNjLmdldENsYXNzKCkuZ2V0RGVjbGFyZWRNZXRob2QoImdldERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSIpOwotICAgICAgICAgICAgZ2V0Q29tcG9zaXRlLnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0gICAgICAgICAgICByZXR1cm5Db21wb3NpdGUgPSAoRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKSBnZXRDb21wb3NpdGUuaW52b2tlKHN2Y0Rlc2MsIG51bGwpOwotICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gcmV0dXJuQ29tcG9zaXRlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL0RvY0xpdEJhcmVSZXNvbHZlT3BlcmF0aW9uVGVzdHMuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9Eb2NMaXRCYXJlUmVzb2x2ZU9wZXJhdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllNmZjYTkuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL0RvY0xpdEJhcmVSZXNvbHZlT3BlcmF0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW07Ci1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7Ci1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmc7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwud3MuSG9sZGVyOwotCi0vKioKLSAqIFZhbGlkYXRlIHRoYXQgdGhlIGluZm9ybWF0aW9uIG5lZWRlZCB0byByZXNvbHZlIGFuIGluY29taW5nIERvYy9MaXQvQmFyZSBtZXNzYWdlIGlzIHNldHVwCi0gKiBjb3JyZWN0bHkgdmlhIGFubm90YXRpb25zLgotICovCi1wdWJsaWMgY2xhc3MgRG9jTGl0QmFyZVJlc29sdmVPcGVyYXRpb25UZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICBwcml2YXRlIFNlcnZpY2VEZXNjcmlwdGlvbiBzdmNEZXNjOwotICAgIHByaXZhdGUgRW5kcG9pbnREZXNjcmlwdGlvbiBlbmRwb2ludERlc2M7Ci0gICAgcHJpdmF0ZSBBeGlzU2VydmljZSBheGlzU2VydmljZTsKLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotICAgICAgICBpZiAoc3ZjRGVzYyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBzdmNEZXNjID0gRGVzY3JpcHRpb25GYWN0b3J5LmNyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbihETEJSZXNvbHZlT3BlcmF0aW9uLmNsYXNzKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoc3ZjRGVzYyk7Ci0gICAgICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uW10gZXBEZXNjcyA9IHN2Y0Rlc2MuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbnMoKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoZXBEZXNjcyk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgZXBEZXNjcy5sZW5ndGgpOwotICAgICAgICAgICAgZW5kcG9pbnREZXNjID0gZXBEZXNjc1swXTsKLSAgICAgICAgICAgIGF4aXNTZXJ2aWNlID0gZW5kcG9pbnREZXNjLmdldEF4aXNTZXJ2aWNlKCk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGF4aXNTZXJ2aWNlKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgdGVzdERvY0xpdEJhcmVTaW5nbGVJblBhcmFtKCkgewotICAgICAgICBRTmFtZSBvcGVyYXRpb25RTmFtZSA9IG5ldyBRTmFtZSgiIiwgIm9wMSIpOwotICAgICAgICBBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb25Gcm9tT3BOYW1lID0gYXhpc1NlcnZpY2UuZ2V0T3BlcmF0aW9uKG9wZXJhdGlvblFOYW1lKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChheGlzT3BlcmF0aW9uRnJvbU9wTmFtZSk7Ci0KLSAgICAgICAgUU5hbWUgbWVzc2FnZUVsZW1lbnRRTmFtZSA9Ci0gICAgICAgICAgICAgICAgbmV3IFFOYW1lKCJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkRMQlJlc29sdmVPcGVyYXRpb24iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAib3AxcGFyYW0xUGFydE5hbWUiKTsKLSAgICAgICAgQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uRnJvbUVsZW1lbnQgPQotICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlLmdldE9wZXJhdGlvbkJ5TWVzc2FnZUVsZW1lbnRRTmFtZShtZXNzYWdlRWxlbWVudFFOYW1lKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChheGlzT3BlcmF0aW9uRnJvbUVsZW1lbnQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoYXhpc09wZXJhdGlvbkZyb21PcE5hbWUsIGF4aXNPcGVyYXRpb25Gcm9tRWxlbWVudCk7Ci0KLSAgICAgICAgUU5hbWUgd3JvbmdNZXNzYWdlRWxlbWVudFFOYW1lID0KLSAgICAgICAgICAgICAgICBuZXcgUU5hbWUoIm9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRExCUmVzb2x2ZU9wZXJhdGlvbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJ3cm9uZ0VsZW1lbnROYW1lIik7Ci0gICAgICAgIEF4aXNPcGVyYXRpb24gYXhpc09wZXJhdGlvbkZyb21Xcm9uZ0VsZW1lbnQgPQotICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlLmdldE9wZXJhdGlvbkJ5TWVzc2FnZUVsZW1lbnRRTmFtZSh3cm9uZ01lc3NhZ2VFbGVtZW50UU5hbWUpOwotICAgICAgICBhc3NlcnROdWxsKGF4aXNPcGVyYXRpb25Gcm9tV3JvbmdFbGVtZW50KTsKLQotICAgICAgICBRTmFtZSB3cm9uZ01lc3NhZ2VFbGVtZW50TlNRTmFtZSA9IG5ldyBRTmFtZSgid3JvbmcubmFtZXNwYWNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9wMXBhcmFtMVBhcnROYW1lIik7Ci0gICAgICAgIEF4aXNPcGVyYXRpb24gYXhpc09wZXJhdGlvbkZyb21Xcm9uZ0VsZW1lbnROUyA9Ci0gICAgICAgICAgICAgICAgYXhpc1NlcnZpY2UuZ2V0T3BlcmF0aW9uQnlNZXNzYWdlRWxlbWVudFFOYW1lKHdyb25nTWVzc2FnZUVsZW1lbnROU1FOYW1lKTsKLSAgICAgICAgYXNzZXJ0TnVsbChheGlzT3BlcmF0aW9uRnJvbVdyb25nRWxlbWVudE5TKTsKLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3REb2NMaXRCYXJlU2luZ2xlSW5PdXRQYXJhbSgpIHsKLSAgICAgICAgUU5hbWUgb3BlcmF0aW9uUU5hbWUgPSBuZXcgUU5hbWUoIiIsICJvcDIiKTsKLSAgICAgICAgQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uRnJvbU9wTmFtZSA9IGF4aXNTZXJ2aWNlLmdldE9wZXJhdGlvbihvcGVyYXRpb25RTmFtZSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoYXhpc09wZXJhdGlvbkZyb21PcE5hbWUpOwotCi0gICAgICAgIFFOYW1lIG1lc3NhZ2VFbGVtZW50UU5hbWUgPQotICAgICAgICAgICAgICAgIG5ldyBRTmFtZSgib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5ETEJSZXNvbHZlT3BlcmF0aW9uIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIm9wMnBhcmFtMVBhcnROYW1lIik7Ci0gICAgICAgIEF4aXNPcGVyYXRpb24gYXhpc09wZXJhdGlvbkZyb21FbGVtZW50ID0KLSAgICAgICAgICAgICAgICBheGlzU2VydmljZS5nZXRPcGVyYXRpb25CeU1lc3NhZ2VFbGVtZW50UU5hbWUobWVzc2FnZUVsZW1lbnRRTmFtZSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoYXhpc09wZXJhdGlvbkZyb21FbGVtZW50KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGF4aXNPcGVyYXRpb25Gcm9tT3BOYW1lLCBheGlzT3BlcmF0aW9uRnJvbUVsZW1lbnQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3REb2NMaXRCYXJlVHdvSW5QYXJhbXMoKSB7Ci0gICAgICAgIFFOYW1lIG9wZXJhdGlvblFOYW1lID0gbmV3IFFOYW1lKCIiLCAib3AzIik7Ci0gICAgICAgIEF4aXNPcGVyYXRpb24gYXhpc09wZXJhdGlvbkZyb21PcE5hbWUgPSBheGlzU2VydmljZS5nZXRPcGVyYXRpb24ob3BlcmF0aW9uUU5hbWUpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGF4aXNPcGVyYXRpb25Gcm9tT3BOYW1lKTsKLQotICAgICAgICBRTmFtZSBtZXNzYWdlRWxlbWVudFFOYW1lID0KLSAgICAgICAgICAgICAgICBuZXcgUU5hbWUoIm9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRExCUmVzb2x2ZU9wZXJhdGlvbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJvcDNwYXJhbTFQYXJ0TmFtZSIpOwotICAgICAgICBBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb25Gcm9tRWxlbWVudCA9Ci0gICAgICAgICAgICAgICAgYXhpc1NlcnZpY2UuZ2V0T3BlcmF0aW9uQnlNZXNzYWdlRWxlbWVudFFOYW1lKG1lc3NhZ2VFbGVtZW50UU5hbWUpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGF4aXNPcGVyYXRpb25Gcm9tRWxlbWVudCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhheGlzT3BlcmF0aW9uRnJvbU9wTmFtZSwgYXhpc09wZXJhdGlvbkZyb21FbGVtZW50KTsKLQotICAgICAgICBRTmFtZSB3cm9uZ01lc3NhZ2VFbGVtZW50UU5hbWUgPQotICAgICAgICAgICAgICAgIG5ldyBRTmFtZSgib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5ETEJSZXNvbHZlT3BlcmF0aW9uIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIm9wM3BhcmFtMlBhcnROYW1lIik7Ci0gICAgICAgIEF4aXNPcGVyYXRpb24gYXhpc09wZXJhdGlvbkZyb21Xcm9uZ0VsZW1lbnQgPQotICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlLmdldE9wZXJhdGlvbkJ5TWVzc2FnZUVsZW1lbnRRTmFtZSh3cm9uZ01lc3NhZ2VFbGVtZW50UU5hbWUpOwotICAgICAgICBhc3NlcnROdWxsKGF4aXNPcGVyYXRpb25Gcm9tV3JvbmdFbGVtZW50KTsKLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3REb2NMaXRCYXJlT3V0UGFyYW1Pbmx5KCkgewotICAgICAgICBRTmFtZSBvcGVyYXRpb25RTmFtZSA9IG5ldyBRTmFtZSgiIiwgIm9wNCIpOwotICAgICAgICBBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb25Gcm9tT3BOYW1lID0gYXhpc1NlcnZpY2UuZ2V0T3BlcmF0aW9uKG9wZXJhdGlvblFOYW1lKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChheGlzT3BlcmF0aW9uRnJvbU9wTmFtZSk7Ci0KLSAgICAgICAgUU5hbWUgbWVzc2FnZUVsZW1lbnRRTmFtZSA9Ci0gICAgICAgICAgICAgICAgbmV3IFFOYW1lKCJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkRMQlJlc29sdmVPcGVyYXRpb24iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAib3A0cGFyYW0xUGFydE5hbWUiKTsKLSAgICAgICAgQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uRnJvbUVsZW1lbnQgPQotICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlLmdldE9wZXJhdGlvbkJ5TWVzc2FnZUVsZW1lbnRRTmFtZShtZXNzYWdlRWxlbWVudFFOYW1lKTsKLSAgICAgICAgYXNzZXJ0TnVsbChheGlzT3BlcmF0aW9uRnJvbUVsZW1lbnQpOwotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdERvY0xpdEJhcmVPdXRQYXJhbUZpcnN0KCkgewotICAgICAgICBRTmFtZSBvcGVyYXRpb25RTmFtZSA9IG5ldyBRTmFtZSgiIiwgIm9wNSIpOwotICAgICAgICBBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb25Gcm9tT3BOYW1lID0gYXhpc1NlcnZpY2UuZ2V0T3BlcmF0aW9uKG9wZXJhdGlvblFOYW1lKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChheGlzT3BlcmF0aW9uRnJvbU9wTmFtZSk7Ci0KLSAgICAgICAgUU5hbWUgbWVzc2FnZUVsZW1lbnRRTmFtZSA9Ci0gICAgICAgICAgICAgICAgbmV3IFFOYW1lKCJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkRMQlJlc29sdmVPcGVyYXRpb24iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAib3A1cGFyYW0yUGFydE5hbWUiKTsKLSAgICAgICAgQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uRnJvbUVsZW1lbnQgPQotICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlLmdldE9wZXJhdGlvbkJ5TWVzc2FnZUVsZW1lbnRRTmFtZShtZXNzYWdlRWxlbWVudFFOYW1lKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChheGlzT3BlcmF0aW9uRnJvbUVsZW1lbnQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoYXhpc09wZXJhdGlvbkZyb21PcE5hbWUsIGF4aXNPcGVyYXRpb25Gcm9tRWxlbWVudCk7Ci0KLSAgICAgICAgUU5hbWUgd3JvbmdNZXNzYWdlRWxlbWVudFFOYW1lID0KLSAgICAgICAgICAgICAgICBuZXcgUU5hbWUoIm9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRExCUmVzb2x2ZU9wZXJhdGlvbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJvcDVwYXJhbTFQYXJ0TmFtZSIpOwotICAgICAgICBBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb25Gcm9tV3JvbmdFbGVtZW50ID0KLSAgICAgICAgICAgICAgICBheGlzU2VydmljZS5nZXRPcGVyYXRpb25CeU1lc3NhZ2VFbGVtZW50UU5hbWUod3JvbmdNZXNzYWdlRWxlbWVudFFOYW1lKTsKLSAgICAgICAgYXNzZXJ0TnVsbChheGlzT3BlcmF0aW9uRnJvbVdyb25nRWxlbWVudCk7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RG9jTGl0QmFyZURlZmF1bHRQYXJ0QW5ubygpIHsKLSAgICAgICAgUU5hbWUgb3BlcmF0aW9uUU5hbWUgPSBuZXcgUU5hbWUoIiIsICJvcDYiKTsKLSAgICAgICAgQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uRnJvbU9wTmFtZSA9IGF4aXNTZXJ2aWNlLmdldE9wZXJhdGlvbihvcGVyYXRpb25RTmFtZSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoYXhpc09wZXJhdGlvbkZyb21PcE5hbWUpOwotCi0gICAgICAgIFFOYW1lIG1lc3NhZ2VFbGVtZW50UU5hbWUgPSBuZXcgUU5hbWUoImh0dHA6Ly9kZXNjcmlwdGlvbi5qYXh3cy5heGlzMi5hcGFjaGUub3JnLyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9wNiIpOwotICAgICAgICBBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb25Gcm9tRWxlbWVudCA9Ci0gICAgICAgICAgICAgICAgYXhpc1NlcnZpY2UuZ2V0T3BlcmF0aW9uQnlNZXNzYWdlRWxlbWVudFFOYW1lKG1lc3NhZ2VFbGVtZW50UU5hbWUpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGF4aXNPcGVyYXRpb25Gcm9tRWxlbWVudCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhheGlzT3BlcmF0aW9uRnJvbU9wTmFtZSwgYXhpc09wZXJhdGlvbkZyb21FbGVtZW50KTsKLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3REb2NMaXRCYXJlTm9QYXJhbXMoKSB7Ci0gICAgICAgIFFOYW1lIG9wZXJhdGlvblFOYW1lID0gbmV3IFFOYW1lKCIiLCAib3A3Iik7Ci0gICAgICAgIEF4aXNPcGVyYXRpb24gYXhpc09wZXJhdGlvbkZyb21PcE5hbWUgPSBheGlzU2VydmljZS5nZXRPcGVyYXRpb24ob3BlcmF0aW9uUU5hbWUpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGF4aXNPcGVyYXRpb25Gcm9tT3BOYW1lKTsKLQotICAgICAgICBRTmFtZSBtZXNzYWdlRWxlbWVudFFOYW1lID0gbmV3IFFOYW1lKCJodHRwOi8vZGVzY3JpcHRpb24uamF4d3MuYXhpczIuYXBhY2hlLm9yZy8iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcDciKTsKLSAgICAgICAgQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uRnJvbUVsZW1lbnQgPQotICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlLmdldE9wZXJhdGlvbkJ5TWVzc2FnZUVsZW1lbnRRTmFtZShtZXNzYWdlRWxlbWVudFFOYW1lKTsKLSAgICAgICAgYXNzZXJ0TnVsbChheGlzT3BlcmF0aW9uRnJvbUVsZW1lbnQpOwotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdERvY0xpdEJhcmVIZWFkZXJQYXJhbUZpcnN0KCkgewotICAgICAgICBRTmFtZSBvcGVyYXRpb25RTmFtZSA9IG5ldyBRTmFtZSgiIiwgIm9wOCIpOwotICAgICAgICBBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb25Gcm9tT3BOYW1lID0gYXhpc1NlcnZpY2UuZ2V0T3BlcmF0aW9uKG9wZXJhdGlvblFOYW1lKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChheGlzT3BlcmF0aW9uRnJvbU9wTmFtZSk7Ci0KLSAgICAgICAgUU5hbWUgbWVzc2FnZUVsZW1lbnRRTmFtZSA9Ci0gICAgICAgICAgICAgICAgbmV3IFFOYW1lKCJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkRMQlJlc29sdmVPcGVyYXRpb24iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAib3A4cGFyYW0yUGFydE5hbWUiKTsKLSAgICAgICAgQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uRnJvbUVsZW1lbnQgPQotICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlLmdldE9wZXJhdGlvbkJ5TWVzc2FnZUVsZW1lbnRRTmFtZShtZXNzYWdlRWxlbWVudFFOYW1lKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChheGlzT3BlcmF0aW9uRnJvbUVsZW1lbnQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoYXhpc09wZXJhdGlvbkZyb21PcE5hbWUsIGF4aXNPcGVyYXRpb25Gcm9tRWxlbWVudCk7Ci0KLSAgICAgICAgUU5hbWUgd3JvbmdNZXNzYWdlRWxlbWVudFFOYW1lID0KLSAgICAgICAgICAgICAgICBuZXcgUU5hbWUoIm9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRExCUmVzb2x2ZU9wZXJhdGlvbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJvcDhwYXJhbTFQYXJ0TmFtZSIpOwotICAgICAgICBBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb25Gcm9tV3JvbmdFbGVtZW50ID0KLSAgICAgICAgICAgICAgICBheGlzU2VydmljZS5nZXRPcGVyYXRpb25CeU1lc3NhZ2VFbGVtZW50UU5hbWUod3JvbmdNZXNzYWdlRWxlbWVudFFOYW1lKTsKLSAgICAgICAgYXNzZXJ0TnVsbChheGlzT3BlcmF0aW9uRnJvbVdyb25nRWxlbWVudCk7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RG9jTGl0V3JhcHBlZCgpIHsKLSAgICAgICAgUU5hbWUgb3BlcmF0aW9uUU5hbWUgPSBuZXcgUU5hbWUoIiIsICJvcDEwIik7Ci0gICAgICAgIEF4aXNPcGVyYXRpb24gYXhpc09wZXJhdGlvbkZyb21PcE5hbWUgPSBheGlzU2VydmljZS5nZXRPcGVyYXRpb24ob3BlcmF0aW9uUU5hbWUpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGF4aXNPcGVyYXRpb25Gcm9tT3BOYW1lKTsKLQotICAgICAgICBRTmFtZSBtZXNzYWdlRWxlbWVudFFOYW1lID0KLSAgICAgICAgICAgICAgICBuZXcgUU5hbWUoIm9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRExCUmVzb2x2ZU9wZXJhdGlvbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJvcDEwcGFyYW0xUGFydE5hbWUiKTsKLSAgICAgICAgQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uRnJvbUVsZW1lbnQgPQotICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlLmdldE9wZXJhdGlvbkJ5TWVzc2FnZUVsZW1lbnRRTmFtZShtZXNzYWdlRWxlbWVudFFOYW1lKTsKLSAgICAgICAgYXNzZXJ0TnVsbChheGlzT3BlcmF0aW9uRnJvbUVsZW1lbnQpOwotICAgIH0KLX0KLQotQFdlYlNlcnZpY2UKLWNsYXNzIERMQlJlc29sdmVPcGVyYXRpb24gewotCi0gICAgQFNPQVBCaW5kaW5nKHN0eWxlID0gU09BUEJpbmRpbmcuU3R5bGUuRE9DVU1FTlQsIHVzZSA9IFNPQVBCaW5kaW5nLlVzZS5MSVRFUkFMLAotICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJTdHlsZSA9IFNPQVBCaW5kaW5nLlBhcmFtZXRlclN0eWxlLkJBUkUpCi0gICAgcHVibGljIHZvaWQgb3AxKAotICAgICAgICAgICAgQFdlYlBhcmFtKHRhcmdldE5hbWVzcGFjZSA9ICJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkRMQlJlc29sdmVPcGVyYXRpb24iLAotICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSAib3AxcGFyYW0xUGFydE5hbWUiKSBpbnQgcGFyYW0xKSB7Ci0gICAgfQotCi0gICAgQFNPQVBCaW5kaW5nKHN0eWxlID0gU09BUEJpbmRpbmcuU3R5bGUuRE9DVU1FTlQsIHVzZSA9IFNPQVBCaW5kaW5nLlVzZS5MSVRFUkFMLAotICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJTdHlsZSA9IFNPQVBCaW5kaW5nLlBhcmFtZXRlclN0eWxlLkJBUkUpCi0gICAgcHVibGljIHZvaWQgb3AyKAotICAgICAgICAgICAgQFdlYlBhcmFtKHRhcmdldE5hbWVzcGFjZSA9ICJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkRMQlJlc29sdmVPcGVyYXRpb24iLAotICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSAib3AycGFyYW0xUGFydE5hbWUiLAotICAgICAgICAgICAgICAgICAgICAgIG1vZGUgPSBXZWJQYXJhbS5Nb2RlLklOT1VUKSBIb2xkZXI8SW50ZWdlcj4gcGFyYW0xKSB7Ci0gICAgfQotCi0gICAgQFNPQVBCaW5kaW5nKHN0eWxlID0gU09BUEJpbmRpbmcuU3R5bGUuRE9DVU1FTlQsIHVzZSA9IFNPQVBCaW5kaW5nLlVzZS5MSVRFUkFMLAotICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJTdHlsZSA9IFNPQVBCaW5kaW5nLlBhcmFtZXRlclN0eWxlLkJBUkUpCi0gICAgcHVibGljIHZvaWQgb3AzKAotICAgICAgICAgICAgQFdlYlBhcmFtKHRhcmdldE5hbWVzcGFjZSA9ICJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkRMQlJlc29sdmVPcGVyYXRpb24iLAotICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSAib3AzcGFyYW0xUGFydE5hbWUiLAotICAgICAgICAgICAgICAgICAgICAgIG1vZGUgPSBXZWJQYXJhbS5Nb2RlLklOT1VUKSBIb2xkZXI8SW50ZWdlcj4gcGFyYW0xLAotICAgICAgICAgICAgQFdlYlBhcmFtKHRhcmdldE5hbWVzcGFjZSA9ICJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkRMQlJlc29sdmVPcGVyYXRpb24iLAotICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSAib3AzcGFyYW0yUGFydE5hbWUiLAotICAgICAgICAgICAgICAgICAgICAgIG1vZGUgPSBXZWJQYXJhbS5Nb2RlLklOKSBpbnQgcGFyYW0yKSB7Ci0gICAgfQotCi0gICAgQFNPQVBCaW5kaW5nKHN0eWxlID0gU09BUEJpbmRpbmcuU3R5bGUuRE9DVU1FTlQsIHVzZSA9IFNPQVBCaW5kaW5nLlVzZS5MSVRFUkFMLAotICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJTdHlsZSA9IFNPQVBCaW5kaW5nLlBhcmFtZXRlclN0eWxlLkJBUkUpCi0gICAgcHVibGljIHZvaWQgb3A0KAotICAgICAgICAgICAgQFdlYlBhcmFtKHRhcmdldE5hbWVzcGFjZSA9ICJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkRMQlJlc29sdmVPcGVyYXRpb24iLAotICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSAib3A0cGFyYW0xUGFydE5hbWUiLAotICAgICAgICAgICAgICAgICAgICAgIG1vZGUgPSBXZWJQYXJhbS5Nb2RlLk9VVCkgSG9sZGVyPEludGVnZXI+IHBhcmFtMSkgewotICAgIH0KLQotICAgIEBTT0FQQmluZGluZyhzdHlsZSA9IFNPQVBCaW5kaW5nLlN0eWxlLkRPQ1VNRU5ULCB1c2UgPSBTT0FQQmluZGluZy5Vc2UuTElURVJBTCwKLSAgICAgICAgICAgICAgICAgcGFyYW1ldGVyU3R5bGUgPSBTT0FQQmluZGluZy5QYXJhbWV0ZXJTdHlsZS5CQVJFKQotICAgIHB1YmxpYyB2b2lkIG9wNSgKLSAgICAgICAgICAgIEBXZWJQYXJhbSh0YXJnZXROYW1lc3BhY2UgPSAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5ETEJSZXNvbHZlT3BlcmF0aW9uIiwKLSAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gIm9wNXBhcmFtMVBhcnROYW1lIiwKLSAgICAgICAgICAgICAgICAgICAgICBtb2RlID0gV2ViUGFyYW0uTW9kZS5PVVQpIEhvbGRlcjxJbnRlZ2VyPiBwYXJhbTEsCi0gICAgICAgICAgICBAV2ViUGFyYW0odGFyZ2V0TmFtZXNwYWNlID0gIm9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRExCUmVzb2x2ZU9wZXJhdGlvbiIsCi0gICAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICJvcDVwYXJhbTJQYXJ0TmFtZSIsCi0gICAgICAgICAgICAgICAgICAgICAgbW9kZSA9IFdlYlBhcmFtLk1vZGUuSU4pIGludCBwYXJhbTIpIHsKLSAgICB9Ci0KLSAgICBAU09BUEJpbmRpbmcoc3R5bGUgPSBTT0FQQmluZGluZy5TdHlsZS5ET0NVTUVOVCwgdXNlID0gU09BUEJpbmRpbmcuVXNlLkxJVEVSQUwsCi0gICAgICAgICAgICAgICAgIHBhcmFtZXRlclN0eWxlID0gU09BUEJpbmRpbmcuUGFyYW1ldGVyU3R5bGUuQkFSRSkKLSAgICBwdWJsaWMgdm9pZCBvcDYoCi0gICAgICAgICAgICBAV2ViUGFyYW0gaW50IHBhcmFtMSkgewotICAgIH0KLQotICAgIEBTT0FQQmluZGluZyhzdHlsZSA9IFNPQVBCaW5kaW5nLlN0eWxlLkRPQ1VNRU5ULCB1c2UgPSBTT0FQQmluZGluZy5Vc2UuTElURVJBTCwKLSAgICAgICAgICAgICAgICAgcGFyYW1ldGVyU3R5bGUgPSBTT0FQQmluZGluZy5QYXJhbWV0ZXJTdHlsZS5CQVJFKQotICAgIHB1YmxpYyB2b2lkIG9wNygpIHsKLSAgICB9Ci0KLSAgICBAU09BUEJpbmRpbmcoc3R5bGUgPSBTT0FQQmluZGluZy5TdHlsZS5ET0NVTUVOVCwgdXNlID0gU09BUEJpbmRpbmcuVXNlLkxJVEVSQUwsCi0gICAgICAgICAgICAgICAgIHBhcmFtZXRlclN0eWxlID0gU09BUEJpbmRpbmcuUGFyYW1ldGVyU3R5bGUuQkFSRSkKLSAgICBwdWJsaWMgdm9pZCBvcDgoCi0gICAgICAgICAgICBAV2ViUGFyYW0odGFyZ2V0TmFtZXNwYWNlID0gIm9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRExCUmVzb2x2ZU9wZXJhdGlvbiIsCi0gICAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICJvcDhwYXJhbTFQYXJ0TmFtZSIsCi0gICAgICAgICAgICAgICAgICAgICAgbW9kZSA9IFdlYlBhcmFtLk1vZGUuSU4sCi0gICAgICAgICAgICAgICAgICAgICAgaGVhZGVyID0gdHJ1ZSkgSW50ZWdlciBwYXJhbTEsCi0gICAgICAgICAgICBAV2ViUGFyYW0odGFyZ2V0TmFtZXNwYWNlID0gIm9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRExCUmVzb2x2ZU9wZXJhdGlvbiIsCi0gICAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICJvcDhwYXJhbTJQYXJ0TmFtZSIsCi0gICAgICAgICAgICAgICAgICAgICAgbW9kZSA9IFdlYlBhcmFtLk1vZGUuSU4pIGludCBwYXJhbTIpIHsKLSAgICB9Ci0KLSAgICBAU09BUEJpbmRpbmcoc3R5bGUgPSBTT0FQQmluZGluZy5TdHlsZS5ET0NVTUVOVCwgdXNlID0gU09BUEJpbmRpbmcuVXNlLkxJVEVSQUwsCi0gICAgICAgICAgICAgICAgIHBhcmFtZXRlclN0eWxlID0gU09BUEJpbmRpbmcuUGFyYW1ldGVyU3R5bGUuV1JBUFBFRCkKLSAgICBwdWJsaWMgdm9pZCBvcDEwKAotICAgICAgICAgICAgQFdlYlBhcmFtKHRhcmdldE5hbWVzcGFjZSA9ICJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkRMQlJlc29sdmVPcGVyYXRpb24iLAotICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSAib3AxMHBhcmFtMVBhcnROYW1lIikgaW50IHBhcmFtMSkgewotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL0RvY0xpdFdyYXBwZWRJbXBsV2l0aFNFSS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL0RvY0xpdFdyYXBwZWRJbXBsV2l0aFNFSS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjUxYWE0Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9Eb2NMaXRXcmFwcGVkSW1wbFdpdGhTRUkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uOwotCi1pbXBvcnQgb3JnLnRlc3QucHJveHkuZG9jbGl0d3JhcHBlZC5GaW5PcFJlc3BvbnNlOwotaW1wb3J0IG9yZy50ZXN0LnByb3h5LmRvY2xpdHdyYXBwZWQuRmluYW5jaWFsT3BlcmF0aW9uOwotaW1wb3J0IG9yZy50ZXN0LnByb3h5LmRvY2xpdHdyYXBwZWQuUmV0dXJuVHlwZTsKLWltcG9ydCBvcmcudGVzdC5wcm94eS5kb2NsaXR3cmFwcGVkLlR3b1dheUhvbGRlcjsKLQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOwotaW1wb3J0IGphdmF4LnhtbC53cy5Bc3luY0hhbmRsZXI7Ci1pbXBvcnQgamF2YXgueG1sLndzLkhvbGRlcjsKLWltcG9ydCBqYXZheC54bWwud3MuUmVzcG9uc2U7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOwotCi0vKioKLSAqIAotICovCi1AV2ViU2VydmljZShzZXJ2aWNlTmFtZSA9ICJEb2NMaXRXcmFwcGVkU2VydmljZSIsCi0gICAgICAgICAgICBlbmRwb2ludEludGVyZmFjZSA9ICJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkRvY0xpdFdyYXBwZWRQcm94eSIpCi1wdWJsaWMgY2xhc3MgRG9jTGl0V3JhcHBlZEltcGxXaXRoU0VJIHsKLQotICAgIHB1YmxpYyB2b2lkIG9uZVdheVZvaWQoKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBvbmVXYXkoU3RyaW5nIG9uZXdheVN0cikgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgcHVibGljIFJlc3BvbnNlPFR3b1dheUhvbGRlcj4gdHdvV2F5SG9sZGVyQXN5bmMoU3RyaW5nIHR3b1dheUhvbGRlclN0ciwgaW50IHR3b1dheUhvbGRlckludCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRnV0dXJlPD8+IHR3b1dheUhvbGRlckFzeW5jKFN0cmluZyB0d29XYXlIb2xkZXJTdHIsIGludCB0d29XYXlIb2xkZXJJbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBc3luY0hhbmRsZXI8VHdvV2F5SG9sZGVyPiBhc3luY0hhbmRsZXIpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdHdvV2F5SG9sZGVyKEhvbGRlcjxTdHJpbmc+IHR3b1dheUhvbGRlclN0ciwgSG9sZGVyPEludGVnZXI+IHR3b1dheUhvbGRlckludCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgcHVibGljIFJlc3BvbnNlPFJldHVyblR5cGU+IHR3b1dheUFzeW5jKFN0cmluZyB0d293YXlTdHIpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIEZ1dHVyZTw/PiB0d29XYXlBc3luYyhTdHJpbmcgdHdvd2F5U3RyLCBBc3luY0hhbmRsZXI8UmV0dXJuVHlwZT4gYXN5bmNIYW5kbGVyKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdHdvV2F5KFN0cmluZyB0d293YXlTdHIpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIFJlc3BvbnNlPFJldHVyblR5cGU+IGludm9rZUFzeW5jKFN0cmluZyBpbnZva2VTdHIpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIEZ1dHVyZTw/PiBpbnZva2VBc3luYyhTdHJpbmcgaW52b2tlU3RyLCBBc3luY0hhbmRsZXI8UmV0dXJuVHlwZT4gYXN5bmNIYW5kbGVyKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgaW52b2tlKFN0cmluZyBpbnZva2VTdHIpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIFJlc3BvbnNlPEZpbk9wUmVzcG9uc2U+IGZpbk9wQXN5bmMoRmluYW5jaWFsT3BlcmF0aW9uIG9wKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBGdXR1cmU8Pz4gZmluT3BBc3luYyhGaW5hbmNpYWxPcGVyYXRpb24gb3AsIEFzeW5jSGFuZGxlcjxGaW5PcFJlc3BvbnNlPiBhc3luY0hhbmRsZXIpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIEZpbmFuY2lhbE9wZXJhdGlvbiBmaW5PcChGaW5hbmNpYWxPcGVyYXRpb24gb3ApIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vRG9jTGl0V3JhcHBlZFByb3h5LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vRG9jTGl0V3JhcHBlZFByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmMDkyMDUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL0RvY0xpdFdyYXBwZWRQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbjsKLQotaW1wb3J0IG9yZy50ZXN0LnByb3h5LmRvY2xpdHdyYXBwZWQuRmluT3BSZXNwb25zZTsKLWltcG9ydCBvcmcudGVzdC5wcm94eS5kb2NsaXR3cmFwcGVkLkZpbmFuY2lhbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcudGVzdC5wcm94eS5kb2NsaXR3cmFwcGVkLlJldHVyblR5cGU7Ci1pbXBvcnQgb3JnLnRlc3QucHJveHkuZG9jbGl0d3JhcHBlZC5Ud29XYXlIb2xkZXI7Ci0KLWltcG9ydCBqYXZheC5qd3MuT25ld2F5OwotaW1wb3J0IGphdmF4Lmp3cy5XZWJNZXRob2Q7Ci1pbXBvcnQgamF2YXguandzLldlYlBhcmFtOwotaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbS5Nb2RlOwotaW1wb3J0IGphdmF4Lmp3cy5XZWJSZXN1bHQ7Ci1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7Ci1pbXBvcnQgamF2YXgueG1sLndzLkFzeW5jSGFuZGxlcjsKLWltcG9ydCBqYXZheC54bWwud3MuSG9sZGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5SZXF1ZXN0V3JhcHBlcjsKLWltcG9ydCBqYXZheC54bWwud3MuUmVzcG9uc2U7Ci1pbXBvcnQgamF2YXgueG1sLndzLlJlc3BvbnNlV3JhcHBlcjsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU7Ci0KLS8qKiBUaGlzIGNsYXNzIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIEpBWFdTIFNJLiBKQVgtV1MgUkkgMi4wXzAxLWIxNS1mY3MgR2VuZXJhdGVkIHNvdXJjZSB2ZXJzaW9uOiAyLjAgKi8KLUBXZWJTZXJ2aWNlKG5hbWUgPSAiRG9jTGl0V3JhcHBlZFByb3h5IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL3Rlc3RzIikKLXB1YmxpYyBpbnRlcmZhY2UgRG9jTGl0V3JhcHBlZFByb3h5IHsKLQotCi0gICAgLyoqCi0gICAgICogCi0gICAgICovCi0gICAgQFdlYk1ldGhvZChhY3Rpb24gPSAiaHR0cDovL29yZy5hcGFjaGUuYXhpczIucHJveHkuZG9jbGl0d3JhcHBlZC90d29XYXlSZXR1cm4iKQotICAgIEBPbmV3YXkKLSAgICBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gIm9uZVdheVZvaWQiLAotICAgICAgICAgICAgICAgICAgICB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy5hcGFjaGUuYXhpczIucHJveHkuZG9jbGl0d3JhcHBlZCIsCi0gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5wcm94eS5kb2NsaXR3cmFwcGVkLk9uZVdheVZvaWQiKQotICAgIHB1YmxpYyB2b2lkIG9uZVdheVZvaWQoKTsKLQotICAgIC8qKiBAcGFyYW0gb25ld2F5U3RyICAqLwotICAgIEBXZWJNZXRob2QoYWN0aW9uID0gImh0dHA6Ly9vcmcuYXBhY2hlLmF4aXMyLnByb3h5LmRvY2xpdHdyYXBwZWQvdHdvV2F5UmV0dXJuIikKLSAgICBAT25ld2F5Ci0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJvbmVXYXkiLAotICAgICAgICAgICAgICAgICAgICB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy5hcGFjaGUuYXhpczIucHJveHkuZG9jbGl0d3JhcHBlZCIsCi0gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5wcm94eS5kb2NsaXR3cmFwcGVkLnNlaS5PbmVXYXkiKQotICAgIHB1YmxpYyB2b2lkIG9uZVdheSgKLSAgICAgICAgICAgIEBXZWJQYXJhbShuYW1lID0gIm9uZXdheV9zdHIiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikgU3RyaW5nIG9uZXdheVN0cik7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gdHdvV2F5SG9sZGVySW50Ci0gICAgICogQHBhcmFtIHR3b1dheUhvbGRlclN0cgotICAgICAqIEByZXR1cm4gcmV0dXJucyBqYXZheC54bWwud3MuUmVzcG9uc2U8b3JnLmFwYWNoZS5heGlzMi5wcm94eS5kb2NsaXR3cmFwcGVkLnNlaS5Ud29XYXlIb2xkZXI+Ci0gICAgICovCi0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lID0gInR3b1dheUhvbGRlciIsCi0gICAgICAgICAgICAgICBhY3Rpb24gPSAiaHR0cDovL29yZy5hcGFjaGUuYXhpczIucHJveHkuZG9jbGl0d3JhcHBlZC90d29XYXlSZXR1cm4iKQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAidHdvV2F5SG9sZGVyIiwKLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcuYXBhY2hlLmF4aXMyLnByb3h5LmRvY2xpdHdyYXBwZWQiLAotICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSAib3JnLnRlc3QucHJveHkuZG9jbGl0d3JhcHBlZC5Ud29XYXlIb2xkZXIiKQotICAgIEBSZXNwb25zZVdyYXBwZXIobG9jYWxOYW1lID0gInR3b1dheUhvbGRlciIsCi0gICAgICAgICAgICAgICAgICAgICB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy5hcGFjaGUuYXhpczIucHJveHkuZG9jbGl0d3JhcHBlZCIsCi0gICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSAib3JnLnRlc3QucHJveHkuZG9jbGl0d3JhcHBlZC5Ud29XYXlIb2xkZXIiKQotICAgIHB1YmxpYyBSZXNwb25zZTxUd29XYXlIb2xkZXI+IHR3b1dheUhvbGRlckFzeW5jKAotICAgICAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAidHdvV2F5SG9sZGVyX3N0ciIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKSBTdHJpbmcgdHdvV2F5SG9sZGVyU3RyLAotICAgICAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAidHdvV2F5SG9sZGVyX2ludCIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKSBpbnQgdHdvV2F5SG9sZGVySW50KTsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSB0d29XYXlIb2xkZXJJbnQKLSAgICAgKiBAcGFyYW0gYXN5bmNIYW5kbGVyCi0gICAgICogQHBhcmFtIHR3b1dheUhvbGRlclN0cgotICAgICAqIEByZXR1cm4gcmV0dXJucyBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU8PyBleHRlbmRzIGphdmEubGFuZy5PYmplY3Q+Ci0gICAgICovCi0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lID0gInR3b1dheUhvbGRlciIsCi0gICAgICAgICAgICAgICBhY3Rpb24gPSAiaHR0cDovL29yZy5hcGFjaGUuYXhpczIucHJveHkuZG9jbGl0d3JhcHBlZC90d29XYXlSZXR1cm4iKQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAidHdvV2F5SG9sZGVyIiwKLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcuYXBhY2hlLmF4aXMyLnByb3h5LmRvY2xpdHdyYXBwZWQiLAotICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSAib3JnLnRlc3QucHJveHkuZG9jbGl0d3JhcHBlZC5Ud29XYXlIb2xkZXIiKQotICAgIEBSZXNwb25zZVdyYXBwZXIobG9jYWxOYW1lID0gInR3b1dheUhvbGRlciIsCi0gICAgICAgICAgICAgICAgICAgICB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy5hcGFjaGUuYXhpczIucHJveHkuZG9jbGl0d3JhcHBlZCIsCi0gICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSAib3JnLnRlc3QucHJveHkuZG9jbGl0d3JhcHBlZC5Ud29XYXlIb2xkZXIiKQotICAgIHB1YmxpYyBGdXR1cmU8Pz4gdHdvV2F5SG9sZGVyQXN5bmMoCi0gICAgICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJ0d29XYXlIb2xkZXJfc3RyIiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpIFN0cmluZyB0d29XYXlIb2xkZXJTdHIsCi0gICAgICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJ0d29XYXlIb2xkZXJfaW50IiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpIGludCB0d29XYXlIb2xkZXJJbnQsCi0gICAgICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJhc3luY0hhbmRsZXIiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikKLSAgICAgICAgICAgIEFzeW5jSGFuZGxlcjxUd29XYXlIb2xkZXI+IGFzeW5jSGFuZGxlcik7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gdHdvV2F5SG9sZGVySW50Ci0gICAgICogQHBhcmFtIHR3b1dheUhvbGRlclN0cgotICAgICAqLwotICAgIEBXZWJNZXRob2QoYWN0aW9uID0gImh0dHA6Ly9vcmcuYXBhY2hlLmF4aXMyLnByb3h5LmRvY2xpdHdyYXBwZWQvdHdvV2F5UmV0dXJuIikKLSAgICBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gInR3b1dheUhvbGRlciIsCi0gICAgICAgICAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnLmFwYWNoZS5heGlzMi5wcm94eS5kb2NsaXR3cmFwcGVkIiwKLSAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lID0gIm9yZy50ZXN0LnByb3h5LmRvY2xpdHdyYXBwZWQuVHdvV2F5SG9sZGVyIikKLSAgICBAUmVzcG9uc2VXcmFwcGVyKGxvY2FsTmFtZSA9ICJ0d29XYXlIb2xkZXIiLAotICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcuYXBhY2hlLmF4aXMyLnByb3h5LmRvY2xpdHdyYXBwZWQiLAotICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lID0gIm9yZy50ZXN0LnByb3h5LmRvY2xpdHdyYXBwZWQuVHdvV2F5SG9sZGVyIikKLSAgICBwdWJsaWMgdm9pZCB0d29XYXlIb2xkZXIoCi0gICAgICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJ0d29XYXlIb2xkZXJfc3RyIiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIsIG1vZGUgPSBNb2RlLklOT1VUKQotICAgICAgICAgICAgSG9sZGVyPFN0cmluZz4gdHdvV2F5SG9sZGVyU3RyLAotICAgICAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAidHdvV2F5SG9sZGVyX2ludCIsIHRhcmdldE5hbWVzcGFjZSA9ICIiLCBtb2RlID0gTW9kZS5JTk9VVCkKLSAgICAgICAgICAgIEhvbGRlcjxJbnRlZ2VyPiB0d29XYXlIb2xkZXJJbnQpOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHR3b3dheVN0cgotICAgICAqIEByZXR1cm4gcmV0dXJucyBqYXZheC54bWwud3MuUmVzcG9uc2U8b3JnLmFwYWNoZS5heGlzMi5wcm94eS5kb2NsaXR3cmFwcGVkLnNlaS5SZXR1cm5UeXBlPgotICAgICAqLwotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJ0d29XYXkiLAotICAgICAgICAgICAgICAgYWN0aW9uID0gImh0dHA6Ly9vcmcuYXBhY2hlLmF4aXMyLnByb3h5LmRvY2xpdHdyYXBwZWQvdHdvV2F5UmV0dXJuIikKLSAgICBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gInR3b1dheSIsCi0gICAgICAgICAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnLmFwYWNoZS5heGlzMi5wcm94eS5kb2NsaXR3cmFwcGVkIiwKLSAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lID0gIm9yZy50ZXN0LnByb3h5LmRvY2xpdHdyYXBwZWQuVHdvV2F5IikKLSAgICBAUmVzcG9uc2VXcmFwcGVyKGxvY2FsTmFtZSA9ICJSZXR1cm5UeXBlIiwKLSAgICAgICAgICAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnLmFwYWNoZS5heGlzMi5wcm94eS5kb2NsaXR3cmFwcGVkIiwKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5wcm94eS5kb2NsaXR3cmFwcGVkLnNlaS5SZXR1cm5UeXBlIikKLSAgICBwdWJsaWMgUmVzcG9uc2U8UmV0dXJuVHlwZT4gdHdvV2F5QXN5bmMoCi0gICAgICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJ0d293YXlfc3RyIiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpIFN0cmluZyB0d293YXlTdHIpOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHR3b3dheVN0cgotICAgICAqIEBwYXJhbSBhc3luY0hhbmRsZXIKLSAgICAgKiBAcmV0dXJuIHJldHVybnMgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlPD8gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0PgotICAgICAqLwotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJ0d29XYXkiLAotICAgICAgICAgICAgICAgYWN0aW9uID0gImh0dHA6Ly9vcmcuYXBhY2hlLmF4aXMyLnByb3h5LmRvY2xpdHdyYXBwZWQvdHdvV2F5UmV0dXJuIikKLSAgICBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gInR3b1dheSIsCi0gICAgICAgICAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnLmFwYWNoZS5heGlzMi5wcm94eS5kb2NsaXR3cmFwcGVkIiwKLSAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lID0gIm9yZy50ZXN0LnByb3h5LmRvY2xpdHdyYXBwZWQuVHdvV2F5IikKLSAgICBAUmVzcG9uc2VXcmFwcGVyKGxvY2FsTmFtZSA9ICJSZXR1cm5UeXBlIiwKLSAgICAgICAgICAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnLmFwYWNoZS5heGlzMi5wcm94eS5kb2NsaXR3cmFwcGVkIiwKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5wcm94eS5kb2NsaXR3cmFwcGVkLlJldHVyblR5cGUiKQotICAgIHB1YmxpYyBGdXR1cmU8Pz4gdHdvV2F5QXN5bmMoCi0gICAgICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJ0d293YXlfc3RyIiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpIFN0cmluZyB0d293YXlTdHIsCi0gICAgICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJhc3luY0hhbmRsZXIiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikKLSAgICAgICAgICAgIEFzeW5jSGFuZGxlcjxSZXR1cm5UeXBlPiBhc3luY0hhbmRsZXIpOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHR3b3dheVN0cgotICAgICAqIEByZXR1cm4gcmV0dXJucyBqYXZhLmxhbmcuU3RyaW5nCi0gICAgICovCi0gICAgQFdlYk1ldGhvZChhY3Rpb24gPSAiaHR0cDovL29yZy5hcGFjaGUuYXhpczIucHJveHkuZG9jbGl0d3JhcHBlZC90d29XYXlSZXR1cm4iKQotICAgIEBXZWJSZXN1bHQobmFtZSA9ICJyZXR1cm5fc3RyIiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpCi0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJ0d29XYXkiLAotICAgICAgICAgICAgICAgICAgICB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy5hcGFjaGUuYXhpczIucHJveHkuZG9jbGl0d3JhcHBlZCIsCi0gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5wcm94eS5kb2NsaXR3cmFwcGVkLlR3b1dheSIpCi0gICAgQFJlc3BvbnNlV3JhcHBlcihsb2NhbE5hbWUgPSAiUmV0dXJuVHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy5hcGFjaGUuYXhpczIucHJveHkuZG9jbGl0d3JhcHBlZCIsCi0gICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSAib3JnLnRlc3QucHJveHkuZG9jbGl0d3JhcHBlZC5SZXR1cm5UeXBlIikKLSAgICBwdWJsaWMgU3RyaW5nIHR3b1dheSgKLSAgICAgICAgICAgIEBXZWJQYXJhbShuYW1lID0gInR3b3dheV9zdHIiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikgU3RyaW5nIHR3b3dheVN0cik7Ci0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBpbnZva2VTdHIKLSAgICAgKiBAcmV0dXJuIHJldHVybnMgamF2YXgueG1sLndzLlJlc3BvbnNlPG9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJveHkuZG9jbGl0d3JhcHBlZC5zZWkuUmV0dXJuVHlwZT4KLSAgICAgKi8KLSAgICBAV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWUgPSAiaW52b2tlIiwKLSAgICAgICAgICAgICAgIGFjdGlvbiA9ICJodHRwOi8vb3JnLmFwYWNoZS5heGlzMi5wcm94eS5kb2NsaXR3cmFwcGVkL3R3b1dheVJldHVybiIpCi0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJpbnZva2UiLAotICAgICAgICAgICAgICAgICAgICB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy5hcGFjaGUuYXhpczIucHJveHkuZG9jbGl0d3JhcHBlZCIsCi0gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5wcm94eS5kb2NsaXR3cmFwcGVkLkludm9rZSIpCi0gICAgQFJlc3BvbnNlV3JhcHBlcihsb2NhbE5hbWUgPSAiUmV0dXJuVHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy5hcGFjaGUuYXhpczIucHJveHkuZG9jbGl0d3JhcHBlZCIsCi0gICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSAib3JnLnRlc3QucHJveHkuZG9jbGl0d3JhcHBlZC5SZXR1cm5UeXBlIikKLSAgICBwdWJsaWMgUmVzcG9uc2U8UmV0dXJuVHlwZT4gaW52b2tlQXN5bmMoCi0gICAgICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJpbnZva2Vfc3RyIiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpIFN0cmluZyBpbnZva2VTdHIpOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGludm9rZVN0cgotICAgICAqIEBwYXJhbSBhc3luY0hhbmRsZXIKLSAgICAgKiBAcmV0dXJuIHJldHVybnMgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlPD8gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0PgotICAgICAqLwotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJpbnZva2UiLAotICAgICAgICAgICAgICAgYWN0aW9uID0gImh0dHA6Ly9vcmcuYXBhY2hlLmF4aXMyLnByb3h5LmRvY2xpdHdyYXBwZWQvdHdvV2F5UmV0dXJuIikKLSAgICBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gImludm9rZSIsCi0gICAgICAgICAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnLmFwYWNoZS5heGlzMi5wcm94eS5kb2NsaXR3cmFwcGVkIiwKLSAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lID0gIm9yZy50ZXN0LnByb3h5LmRvY2xpdHdyYXBwZWQuSW52b2tlIikKLSAgICBAUmVzcG9uc2VXcmFwcGVyKGxvY2FsTmFtZSA9ICJSZXR1cm5UeXBlIiwKLSAgICAgICAgICAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnLmFwYWNoZS5heGlzMi5wcm94eS5kb2NsaXR3cmFwcGVkIiwKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5wcm94eS5kb2NsaXR3cmFwcGVkLlJldHVyblR5cGUiKQotICAgIHB1YmxpYyBGdXR1cmU8Pz4gaW52b2tlQXN5bmMoCi0gICAgICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJpbnZva2Vfc3RyIiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpIFN0cmluZyBpbnZva2VTdHIsCi0gICAgICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJhc3luY0hhbmRsZXIiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikKLSAgICAgICAgICAgIEFzeW5jSGFuZGxlcjxSZXR1cm5UeXBlPiBhc3luY0hhbmRsZXIpOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGludm9rZVN0cgotICAgICAqIEByZXR1cm4gcmV0dXJucyBqYXZhLmxhbmcuU3RyaW5nCi0gICAgICovCi0gICAgQFdlYk1ldGhvZChhY3Rpb24gPSAiaHR0cDovL29yZy5hcGFjaGUuYXhpczIucHJveHkuZG9jbGl0d3JhcHBlZC90d29XYXlSZXR1cm4iKQotICAgIEBXZWJSZXN1bHQobmFtZSA9ICJyZXR1cm5fc3RyIiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpCi0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJpbnZva2UiLAotICAgICAgICAgICAgICAgICAgICB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy5hcGFjaGUuYXhpczIucHJveHkuZG9jbGl0d3JhcHBlZCIsCi0gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5wcm94eS5kb2NsaXR3cmFwcGVkLkludm9rZSIpCi0gICAgQFJlc3BvbnNlV3JhcHBlcihsb2NhbE5hbWUgPSAiUmV0dXJuVHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy5hcGFjaGUuYXhpczIucHJveHkuZG9jbGl0d3JhcHBlZCIsCi0gICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSAib3JnLnRlc3QucHJveHkuZG9jbGl0d3JhcHBlZC5SZXR1cm5UeXBlIikKLSAgICBwdWJsaWMgU3RyaW5nIGludm9rZSgKLSAgICAgICAgICAgIEBXZWJQYXJhbShuYW1lID0gImludm9rZV9zdHIiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikgU3RyaW5nIGludm9rZVN0cik7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gb3AKLSAgICAgKiBAcmV0dXJuIHJldHVybnMgamF2YXgueG1sLndzLlJlc3BvbnNlPG9yZy5hcGFjaGUuYXhpczIucHJveHkuZG9jbGl0d3JhcHBlZC5zZWkuRmluT3BSZXNwb25zZT4KLSAgICAgKi8KLSAgICBAV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWUgPSAiZmluT3AiLAotICAgICAgICAgICAgICAgYWN0aW9uID0gImh0dHA6Ly9vcmcuYXBhY2hlLmF4aXMyLnByb3h5LmRvY2xpdHdyYXBwZWQvZmluT3AiKQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAiZmluT3AiLAotICAgICAgICAgICAgICAgICAgICB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy5hcGFjaGUuYXhpczIucHJveHkuZG9jbGl0d3JhcHBlZCIsCi0gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5wcm94eS5kb2NsaXR3cmFwcGVkLkZpbk9wIikKLSAgICBAUmVzcG9uc2VXcmFwcGVyKGxvY2FsTmFtZSA9ICJmaW5PcFJlc3BvbnNlIiwKLSAgICAgICAgICAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnLmFwYWNoZS5heGlzMi5wcm94eS5kb2NsaXR3cmFwcGVkIiwKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5wcm94eS5kb2NsaXR3cmFwcGVkLkZpbk9wUmVzcG9uc2UiKQotICAgIHB1YmxpYyBSZXNwb25zZTxGaW5PcFJlc3BvbnNlPiBmaW5PcEFzeW5jKAotICAgICAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAib3AiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikgRmluYW5jaWFsT3BlcmF0aW9uIG9wKTsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBvcAotICAgICAqIEBwYXJhbSBhc3luY0hhbmRsZXIKLSAgICAgKiBAcmV0dXJuIHJldHVybnMgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlPD8gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0PgotICAgICAqLwotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJmaW5PcCIsCi0gICAgICAgICAgICAgICBhY3Rpb24gPSAiaHR0cDovL29yZy5hcGFjaGUuYXhpczIucHJveHkuZG9jbGl0d3JhcHBlZC9maW5PcCIpCi0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJmaW5PcCIsCi0gICAgICAgICAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnLmFwYWNoZS5heGlzMi5wcm94eS5kb2NsaXR3cmFwcGVkIiwKLSAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lID0gIm9yZy50ZXN0LnByb3h5LmRvY2xpdHdyYXBwZWQuRmluT3AiKQotICAgIEBSZXNwb25zZVdyYXBwZXIobG9jYWxOYW1lID0gImZpbk9wUmVzcG9uc2UiLAotICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcuYXBhY2hlLmF4aXMyLnByb3h5LmRvY2xpdHdyYXBwZWQiLAotICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lID0gIm9yZy50ZXN0LnByb3h5LmRvY2xpdHdyYXBwZWQuRmluT3BSZXNwb25zZSIpCi0gICAgcHVibGljIEZ1dHVyZTw/PiBmaW5PcEFzeW5jKAotICAgICAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAib3AiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikgRmluYW5jaWFsT3BlcmF0aW9uIG9wLAotICAgICAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiYXN5bmNIYW5kbGVyIiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpCi0gICAgICAgICAgICBBc3luY0hhbmRsZXI8RmluT3BSZXNwb25zZT4gYXN5bmNIYW5kbGVyKTsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBvcAotICAgICAqIEByZXR1cm4gcmV0dXJucyBvcmcuYXBhY2hlLmF4aXMyLnByb3h5LmRvY2xpdHdyYXBwZWQuc2VpLkZpbmFuY2lhbE9wZXJhdGlvbgotICAgICAqLwotICAgIEBXZWJNZXRob2QoYWN0aW9uID0gImh0dHA6Ly9vcmcuYXBhY2hlLmF4aXMyLnByb3h5LmRvY2xpdHdyYXBwZWQvZmluT3AiKQotICAgIEBXZWJSZXN1bHQobmFtZSA9ICJyZXNwb25zZSIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAiZmluT3AiLAotICAgICAgICAgICAgICAgICAgICB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy5hcGFjaGUuYXhpczIucHJveHkuZG9jbGl0d3JhcHBlZCIsCi0gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5wcm94eS5kb2NsaXR3cmFwcGVkLkZpbk9wIikKLSAgICBAUmVzcG9uc2VXcmFwcGVyKGxvY2FsTmFtZSA9ICJmaW5PcFJlc3BvbnNlIiwKLSAgICAgICAgICAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnLmFwYWNoZS5heGlzMi5wcm94eS5kb2NsaXR3cmFwcGVkIiwKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5wcm94eS5kb2NsaXR3cmFwcGVkLkZpbk9wUmVzcG9uc2UiKQotICAgIHB1YmxpYyBGaW5hbmNpYWxPcGVyYXRpb24gZmluT3AoCi0gICAgICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJvcCIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKSBGaW5hbmNpYWxPcGVyYXRpb24gb3ApOwotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vR2V0U3luY09wZXJhdGlvblRlc3RzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vR2V0U3luY09wZXJhdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViNDEwZDEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL0dldFN5bmNPcGVyYXRpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IGphdmF4Lmp3cy5XZWJNZXRob2Q7Ci1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwud3MuQXN5bmNIYW5kbGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5SZXNwb25zZTsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBHZXRTeW5jT3BlcmF0aW9uVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdE5vU3luY09wZXJhdGlvbigpIHsKLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNEZXNjID0gCi0gICAgICAgICAgICBEZXNjcmlwdGlvbkZhY3RvcnkuY3JlYXRlU2VydmljZURlc2NyaXB0aW9uKG51bGwsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUU5hbWUoIm9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24iLCAic3luY09wZXJhdGlvblRlc3RTZXJ2aWNlMiIpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLndzLlNlcnZpY2UuY2xhc3MpOwotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVEZXNjID0gCi0gICAgICAgICAgICBEZXNjcmlwdGlvbkZhY3RvcnkudXBkYXRlRW5kcG9pbnQoc0Rlc2MsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzeW5jT25seVNFSS5jbGFzcywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFFOYW1lKCJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uIiwgInN5bmNPcGVyYXRpb25UZXN0UG9ydDIiKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb25GYWN0b3J5LlVwZGF0ZVR5cGUuR0VUX1BPUlQpOwotICAgICAgICBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uIGVpRGVzYyA9IGVEZXNjLmdldEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24oKTsKLSAgICAgICAgT3BlcmF0aW9uRGVzY3JpcHRpb24gb3BEZXNjc1tdID0gZWlEZXNjLmdldE9wZXJhdGlvbnMoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChvcERlc2NzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIG9wRGVzY3MubGVuZ3RoKTsKLSAgICAgICAgLy8gTWFrZSBzdXJlIGVhY2ggb2YgdGhlIGFzeW5jIG9wZXJhdGlvbnMgcmVmZXJlbmNlIHRoZSBzeW5jIG9wRGVzYwotICAgICAgICBpbnQgYXN5bmNPcGVyYXRpb25zID0gMDsKLSAgICAgICAgT3BlcmF0aW9uRGVzY3JpcHRpb24gc3luY09wRGVzY3NbXSA9IGVpRGVzYy5nZXRPcGVyYXRpb25Gb3JKYXZhTWV0aG9kKCJlY2hvIik7Ci0gICAgICAgIGFzc2VydE51bGwoc3luY09wRGVzY3MpOwotICAgICAgICBmb3IgKE9wZXJhdGlvbkRlc2NyaXB0aW9uIG9wRGVzYyA6IG9wRGVzY3MpIHsKLSAgICAgICAgICAgIGlmIChvcERlc2MuaXNKQVhXU0FzeW5jQ2xpZW50TWV0aG9kKCkpIHsKLSAgICAgICAgICAgICAgICBhc3luY09wZXJhdGlvbnMrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIFNpbmNlIHRoZXJlIGlzbid0IGEgc3luYyBtZXRob2QgaW4gdGhlIChpbnZhbGlkKSBTRUksIHRoZW4gdGhpcyBzaG91bGQgcmV0dXJuIG51bGwKLSAgICAgICAgICAgIGFzc2VydE51bGwob3BEZXNjLmdldFN5bmNPcGVyYXRpb24oKSk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGFzeW5jT3BlcmF0aW9ucyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFN5bmNPcGVyYXRpb24oKSB7Ci0gICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzRGVzYyA9IAotICAgICAgICAgICAgRGVzY3JpcHRpb25GYWN0b3J5LmNyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbihudWxsLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFFOYW1lKCJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uIiwgInN5bmNPcGVyYXRpb25UZXN0U2VydmljZTEiKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC53cy5TZXJ2aWNlLmNsYXNzKTsKLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlRGVzYyA9IAotICAgICAgICAgICAgRGVzY3JpcHRpb25GYWN0b3J5LnVwZGF0ZUVuZHBvaW50KHNEZXNjLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeW5jQW5kQXN5bmNTRUkuY2xhc3MsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBRTmFtZSgib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbiIsICJzeW5jT3BlcmF0aW9uVGVzdFBvcnQxIiksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uRmFjdG9yeS5VcGRhdGVUeXBlLkdFVF9QT1JUKTsKLSAgICAgICAgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiBlaURlc2MgPSBlRGVzYy5nZXRFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgIE9wZXJhdGlvbkRlc2NyaXB0aW9uIG9wRGVzY3NbXSA9IGVpRGVzYy5nZXRPcGVyYXRpb25zKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwob3BEZXNjcyk7Ci0gICAgICAgIGFzc2VydEVxdWFscygzLCBvcERlc2NzLmxlbmd0aCk7Ci0gICAgICAgIC8vIE1ha2Ugc3VyZSBlYWNoIG9mIHRoZSBhc3luYyBvcGVyYXRpb25zIHJlZmVyZW5jZSB0aGUgc3luYyBvcERlc2MKLSAgICAgICAgaW50IGFzeW5jT3BlcmF0aW9ucyA9IDA7Ci0gICAgICAgIE9wZXJhdGlvbkRlc2NyaXB0aW9uIHN5bmNPcERlc2NzW10gPSBlaURlc2MuZ2V0T3BlcmF0aW9uRm9ySmF2YU1ldGhvZCgiZWNobyIpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHN5bmNPcERlc2NzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHN5bmNPcERlc2NzLmxlbmd0aCk7Ci0gICAgICAgIE9wZXJhdGlvbkRlc2NyaXB0aW9uIHN5bmNPcERlc2MgPSBzeW5jT3BEZXNjc1swXTsKLQotICAgICAgICBmb3IgKE9wZXJhdGlvbkRlc2NyaXB0aW9uIG9wRGVzYyA6IG9wRGVzY3MpIHsKLSAgICAgICAgICAgIGlmIChvcERlc2MuaXNKQVhXU0FzeW5jQ2xpZW50TWV0aG9kKCkpIHsKLSAgICAgICAgICAgICAgICBhc3luY09wZXJhdGlvbnMrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBhbGwgdGhlIG9wZXJhdGlvbnMgcG9pbnQgdG8gdGhlIHN5bmMgb3BlcmF0aW9uCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoc3luY09wRGVzYywgb3BEZXNjLmdldFN5bmNPcGVyYXRpb24oKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGFzc2VydEVxdWFscygyLCBhc3luY09wZXJhdGlvbnMpOwotICAgIH0KLQotCi19Ci0KLUBXZWJTZXJ2aWNlCi1pbnRlcmZhY2UgQXN5bmNPbmx5U0VJIHsKLSAgICAvLyBOb3RlIHRoaXMgaXMgYW4gSU5WQUxJRCBTRUkgc2luY2UgaXQgb25seSBjb250YWlucyB0aGUKLSAgICAvLyBKQVhXUyBjbGllbnQgYXN5bmMgbWV0aG9kcywgYW5kIG5vdCB0aGUgY29ycmVzcG9uZGluZyBzeW5jIAotICAgIC8vIG1ldGhvZC4KLSAgICBAV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWUgPSAiZWNobyIpCi0gICAgcHVibGljIFJlc3BvbnNlPFN0cmluZz4gZWNob0FzeW5jKFN0cmluZyB0b0VjaG8pOwotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJlY2hvIikKLSAgICBwdWJsaWMgRnV0dXJlPD8+IGVjaG9Bc3luYyhTdHJpbmcgdG9FY2hvLCBBc3luY0hhbmRsZXI8U3RyaW5nPiBhc3luY0hhbmRsZXIpOwotfQotCi1AV2ViU2VydmljZQotaW50ZXJmYWNlIFN5bmNBbmRBc3luY1NFSSB7Ci0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lID0gImVjaG8iKQotICAgIHB1YmxpYyBSZXNwb25zZTxTdHJpbmc+IGVjaG9Bc3luYyhTdHJpbmcgdG9FY2hvKTsKLSAgICBAV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWUgPSAiZWNobyIpCi0gICAgcHVibGljIEZ1dHVyZTw/PiBlY2hvQXN5bmMoU3RyaW5nIHRvRWNobywgQXN5bmNIYW5kbGVyPFN0cmluZz4gYXN5bmNIYW5kbGVyKTsKLSAgICBAV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWUgPSAiZWNobyIpCi0gICAgcHVibGljIFN0cmluZyBlY2hvKFN0cmluZyB0b0VjaG8pOwotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL0hhbmRsZXJDaGFpbkNvbmZpZ0ZpbGVUZXN0cy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL0hhbmRsZXJDaGFpbkNvbmZpZ0ZpbGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjZhYjY3Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9IYW5kbGVyQ2hhaW5Db25maWdGaWxlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb247DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi54bWwuaGFuZGxlci5IYW5kbGVyQ2hhaW5zVHlwZTsNCi0NCi1pbXBvcnQgamF2YXguandzLkhhbmRsZXJDaGFpbjsNCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIA0KLSAqLw0KLXB1YmxpYyBjbGFzcyBIYW5kbGVyQ2hhaW5Db25maWdGaWxlVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7DQotICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZENvbmZpZ0ZpbGUoKSB7DQotICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc3ZjRGVzYyA9IERlc2NyaXB0aW9uRmFjdG9yeS5jcmVhdGVTZXJ2aWNlRGVzY3JpcHRpb24oVmFsaWRDb25maWdGaWxlSW1wbC5jbGFzcyk7DQotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uW10gZXBEZXNjcyA9IHN2Y0Rlc2MuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbnMoKTsNCi0gICAgICAgIGFzc2VydEVxdWFscygxLCBlcERlc2NzLmxlbmd0aCk7DQotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVwRGVzYyA9IGVwRGVzY3NbMF07DQotICAgICAgICBIYW5kbGVyQ2hhaW5zVHlwZSBoY3QgPSBlcERlc2MuZ2V0SGFuZGxlckNoYWluKCk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKGhjdCk7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHRlc3RNaXNzaW5nUmVsYXRpdmVDb25maWdGaWxlKCkgew0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc3ZjRGVzYyA9IERlc2NyaXB0aW9uRmFjdG9yeS5jcmVhdGVTZXJ2aWNlRGVzY3JpcHRpb24oSW52YWxpZENvbmZpZ0ZpbGVJbXBsLmNsYXNzKTsNCi0gICAgICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uW10gZXBEZXNjcyA9IHN2Y0Rlc2MuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbnMoKTsNCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgZXBEZXNjcy5sZW5ndGgpOw0KLSAgICAgICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZXBEZXNjID0gZXBEZXNjc1swXTsNCi0gICAgICAgICAgICBIYW5kbGVyQ2hhaW5zVHlwZSBoY3QgPSBlcERlc2MuZ2V0SGFuZGxlckNoYWluKCk7DQotICAgICAgICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgY2F1Z2h0IGV4Y2VwdGlvbiBmb3IgYSBtaXNzaW5nIGhhbmRsZXIgY29uZmlnIGZpbGUiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChXZWJTZXJ2aWNlRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICAvLyBFeHBlY3RlZCBwYXRoICAgICAgICB9DQotICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBlLnRvU3RyaW5nKCk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBhIFdlYlNlcnZpY2VFeGNlcHRpb24sIGJ1dCBjYXVnaHQ6ICIgKyBlKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWlzc2luZ0Fic29sdXRlQ29uZmlnRmlsZSgpIHsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHN2Y0Rlc2MgPSBEZXNjcmlwdGlvbkZhY3RvcnkuY3JlYXRlU2VydmljZURlc2NyaXB0aW9uKEludmFsaWRBYnNvbHV0ZUNvbmZpZ0ZpbGVJbXBsLmNsYXNzKTsNCi0gICAgICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uW10gZXBEZXNjcyA9IHN2Y0Rlc2MuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbnMoKTsNCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgZXBEZXNjcy5sZW5ndGgpOw0KLSAgICAgICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZXBEZXNjID0gZXBEZXNjc1swXTsNCi0gICAgICAgICAgICBIYW5kbGVyQ2hhaW5zVHlwZSBoY3QgPSBlcERlc2MuZ2V0SGFuZGxlckNoYWluKCk7DQotICAgICAgICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgY2F1Z2h0IGV4Y2VwdGlvbiBmb3IgYSBtaXNzaW5nIGhhbmRsZXIgY29uZmlnIGZpbGUiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChXZWJTZXJ2aWNlRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICAvLyBFeHBlY3RlZCBwYXRoLiAgV2UgY2FuJ3QgY2hlY2sgZm9yIGV4cGxpY2l0IGRldGFpbHMgaW4gdGhpcyBjYXNlIGJlY2F1c2Ugd2hpY2ggZmFpbHVyZQ0KLSAgICAgICAgICAgIC8vIG9jY3VycyBkZXBlbmRzIG9uIHRoZSBlbml2cm9ubWVudC4gIFNvbWUgZ2V0ICJDb25uZWN0aW9uUmVmdXNlZCIgYW5kIHNvbWUgZ2V0ICJGaWxlTm90Rm91bmQiLg0KLSAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gZS50b1N0cmluZygpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgYSBXZWJTZXJ2aWNlRXhjZXB0aW9uLCBidXQgY2F1Z2h0OiAiICsgZSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi19DQotDQotQFdlYlNlcnZpY2UoKQ0KLUBIYW5kbGVyQ2hhaW4oZmlsZSA9ICJIYW5kbGVyQ29uZmlnRmlsZS54bWwiKQ0KLWNsYXNzIFZhbGlkQ29uZmlnRmlsZUltcGwgew0KLSAgICANCi19DQotDQotQFdlYlNlcnZpY2UoKQ0KLUBIYW5kbGVyQ2hhaW4oZmlsZSA9ICJNaXNzaW5nSGFuZGxlckNvbmZpZ0ZpbGUueG1sIikNCi1jbGFzcyBJbnZhbGlkQ29uZmlnRmlsZUltcGwgew0KLSAgICANCi19DQotDQotQFdlYlNlcnZpY2UoKQ0KLUBIYW5kbGVyQ2hhaW4oZmlsZSA9ICJodHRwOi8vbG9jYWxob3N0L3dpbGwvbm90L2ZpbmQvTWlzc2luZ0hhbmRsZXJDb25maWdGaWxlLnhtbCIpDQotY2xhc3MgSW52YWxpZEFic29sdXRlQ29uZmlnRmlsZUltcGwgew0KLSAgICANCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL0hhbmRsZXJDb25maWdGaWxlLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9IYW5kbGVyQ29uZmlnRmlsZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2NGY5MzYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL0hhbmRsZXJDb25maWdGaWxlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotDQotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPGp3czpoYW5kbGVyLWNoYWlucyB4bWxuczpqd3M9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSI+DQotDQotCTxqd3M6aGFuZGxlci1jaGFpbiBuYW1lPSJMb2dnaW5nSGFuZGxlckNoYWluIj4NCi0JCTxqd3M6cHJvdG9jb2wtYmluZGluZ3M+IyNTT0FQMTFfSFRUUCAjI3NvbWV0aGluZyBibGFyZzwvandzOnByb3RvY29sLWJpbmRpbmdzPg0KLQkJPGp3czpwb3J0LW5hbWUtcGF0dGVybiANCi0gICAgICAgICAgICAgIHhtbG5zOm5zMT0iaHR0cDovL2FkZG51bWJlcnNoYW5kbGVyLnNhbXBsZS5qYXh3cy5heGlzMi5hcGFjaGUub3JnLyI+bnMxOkFkZE51bWJlcnNIYW5kbGVyUCo8L2p3czpwb3J0LW5hbWUtcGF0dGVybj4NCi0gICAgICAgIDxqd3M6c2VydmljZS1uYW1lLXBhdHRlcm4gDQotICAgICAgICAgICAgICB4bWxuczpuczE9Imh0dHA6Ly9hZGRudW1iZXJzaGFuZGxlci5zYW1wbGUuamF4d3MuYXhpczIuYXBhY2hlLm9yZy8iPm5zMToqPC9qd3M6c2VydmljZS1uYW1lLXBhdHRlcm4+DQotCQk8andzOmhhbmRsZXI+DQotCQkJPGp3czpoYW5kbGVyLWNsYXNzPm9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLmFkZG51bWJlcnNoYW5kbGVyLkFkZE51bWJlcnNMb2dpY2FsSGFuZGxlcjwvandzOmhhbmRsZXItY2xhc3M+DQotCQk8L2p3czpoYW5kbGVyPg0KLQkJPGp3czpoYW5kbGVyPg0KLQkJCTxqd3M6aGFuZGxlci1jbGFzcz5vcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5hZGRudW1iZXJzaGFuZGxlci5BZGROdW1iZXJzUHJvdG9jb2xIYW5kbGVyMjwvandzOmhhbmRsZXItY2xhc3M+DQotCQk8L2p3czpoYW5kbGVyPg0KLQkJPGp3czpoYW5kbGVyPg0KLQkJCTxqd3M6aGFuZGxlci1jbGFzcz5vcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5hZGRudW1iZXJzaGFuZGxlci5BZGROdW1iZXJzTG9naWNhbEhhbmRsZXIyPC9qd3M6aGFuZGxlci1jbGFzcz4NCi0JCTwvandzOmhhbmRsZXI+DQotCQk8andzOmhhbmRsZXI+DQotCQkJPGp3czpoYW5kbGVyLWNsYXNzPm9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLmFkZG51bWJlcnNoYW5kbGVyLkFkZE51bWJlcnNQcm90b2NvbEhhbmRsZXI8L2p3czpoYW5kbGVyLWNsYXNzPg0KLQkJPC9qd3M6aGFuZGxlcj4NCi0JPC9qd3M6aGFuZGxlci1jaGFpbj4NCi0JDQotPC9qd3M6aGFuZGxlci1jaGFpbnM+DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL011c3RVbmRlcnN0YW5kVGVzdHMuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9NdXN0VW5kZXJzdGFuZFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2YmM2MDYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL011c3RVbmRlcnN0YW5kVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb247DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlBhcmFtZXRlcjsNCi0NCi1pbXBvcnQgamF2YXguandzLldlYlBhcmFtOw0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsNCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLkhvbGRlcjsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi0NCi0vKioNCi0gKiANCi0gKi8NCi1wdWJsaWMgY2xhc3MgTXVzdFVuZGVyc3RhbmRUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsNCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHRlc3RIZWFkZXJQYXJhbWV0ZXJzKCkgew0KLSAgICAgICAgLy8gVGVzdCBJTiBhbmQgSU5PVVQgaGVhZGVyIHBhcmFtYXRlcnMgaW4gU0VJDQotICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc3ZjRGVzYyA9IERlc2NyaXB0aW9uRmFjdG9yeS5jcmVhdGVTZXJ2aWNlRGVzY3JpcHRpb24oSGVhZGVyUGFyYW1ldGVycy5jbGFzcyk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHN2Y0Rlc2MpOw0KLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlcERlc2NzW10gPSBzdmNEZXNjLmdldEVuZHBvaW50RGVzY3JpcHRpb25zKCk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKGVwRGVzY3MpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGVwRGVzY3MubGVuZ3RoKTsNCi0gICAgICAgIEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24gZXBpRGVzYyA9IGVwRGVzY3NbMF0uZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbigpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChlcGlEZXNjKTsNCi0gICAgICAgIA0KLSAgICAgICAgT3BlcmF0aW9uRGVzY3JpcHRpb24gb3BEZXNjc1tdID0gZXBpRGVzYy5nZXRPcGVyYXRpb25zKCk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKG9wRGVzY3MpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG9wRGVzY3MubGVuZ3RoKTsNCi0gICAgICAgIE9wZXJhdGlvbkRlc2NyaXB0aW9uIG9wRGVzYyA9IG9wRGVzY3NbMF07DQotICAgICAgICBhc3NlcnRFcXVhbHMoImVjaG9TdHJpbmciLCBvcERlc2MuZ2V0T3BlcmF0aW9uTmFtZSgpKTsNCi0gICAgICAgIA0KLSAgICAgICAgQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uID0gb3BEZXNjLmdldEF4aXNPcGVyYXRpb24oKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwoYXhpc09wZXJhdGlvbik7DQotICAgICAgICBQYXJhbWV0ZXIgdW5kZXJzdG9vZFFOYW1lc1BhcmFtZXRlciA9IGF4aXNPcGVyYXRpb24uZ2V0UGFyYW1ldGVyKE9wZXJhdGlvbkRlc2NyaXB0aW9uLkhFQURFUl9QQVJBTUVURVJfUU5BTUVTKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwodW5kZXJzdG9vZFFOYW1lc1BhcmFtZXRlcik7DQotICAgICAgICBBcnJheUxpc3QgdW5kZXJzdG9vZFFOYW1lcyA9IChBcnJheUxpc3QpIHVuZGVyc3Rvb2RRTmFtZXNQYXJhbWV0ZXIuZ2V0VmFsdWUoKTsNCi0gICAgICAgIGFzc2VydEVxdWFscyg0LCB1bmRlcnN0b29kUU5hbWVzLnNpemUoKSk7DQotICAgICAgICANCi0gICAgICAgIGFzc2VydFRydWUodW5kZXJzdG9vZFFOYW1lcy5jb250YWlucyhuZXcgUU5hbWUoIndlYnNlcnZpY2UubmFtZXNwYWNlIiwgInJlbmFtZWRQYXJhbTEiKSkpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSh1bmRlcnN0b29kUU5hbWVzLmNvbnRhaW5zKG5ldyBRTmFtZSgid2Vic2VydmljZS5uYW1lc3BhY2UiLCAiYXJnMSIpKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHVuZGVyc3Rvb2RRTmFtZXMuY29udGFpbnMobmV3IFFOYW1lKCJ3ZWJwYXJhbS5uYW1lc3BhY2UiLCAiYXJnMiIpKSk7DQotICAgICAgICBhc3NlcnRGYWxzZSh1bmRlcnN0b29kUU5hbWVzLmNvbnRhaW5zKG5ldyBRTmFtZSgid2Vic2VydmljZS5uYW1lc3BhY2UiLCAib3V0T25seSIpKSk7DQotICAgICAgICBhc3NlcnRGYWxzZSh1bmRlcnN0b29kUU5hbWVzLmNvbnRhaW5zKG5ldyBRTmFtZSgid2Vic2VydmljZS5uYW1lc3BhY2UiLCAiYXJnMyIpKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHVuZGVyc3Rvb2RRTmFtZXMuY29udGFpbnMobmV3IFFOYW1lKCJ3ZWJzZXJ2aWNlLm5hbWVzcGFjZSIsICJpbk91dCIpKSk7DQotICAgICAgICBhc3NlcnRGYWxzZSh1bmRlcnN0b29kUU5hbWVzLmNvbnRhaW5zKG5ldyBRTmFtZSgid2Vic2VydmljZS5uYW1lc3BhY2UiLCAiYXJnNCIpKSk7DQotICAgICAgICBhc3NlcnRGYWxzZSh1bmRlcnN0b29kUU5hbWVzLmNvbnRhaW5zKG5ldyBRTmFtZSgid2Vic2VydmljZS5uYW1lc3BhY2UiLCAibm90SW5IZWFkZXIiKSkpOw0KLSAgICAgICAgYXNzZXJ0RmFsc2UodW5kZXJzdG9vZFFOYW1lcy5jb250YWlucyhuZXcgUU5hbWUoIndlYnNlcnZpY2UubmFtZXNwYWNlIiwgImFyZzUiKSkpOw0KLSAgICAgICAgDQotICAgIH0NCi19DQotDQotQFdlYlNlcnZpY2UodGFyZ2V0TmFtZXNwYWNlPSJ3ZWJzZXJ2aWNlLm5hbWVzcGFjZSIpDQotY2xhc3MgSGVhZGVyUGFyYW1ldGVycyB7DQotICAgIHB1YmxpYyBTdHJpbmcgZWNob1N0cmluZygNCi0gICAgICAgICAgICBAV2ViUGFyYW0obmFtZT0icmVuYW1lZFBhcmFtMSIsIGhlYWRlcj10cnVlKSBTdHJpbmcgcGFyYW0xLA0KLSAgICAgICAgICAgIEBXZWJQYXJhbShoZWFkZXI9dHJ1ZSkgU3RyaW5nIHBhcmFtMiwNCi0gICAgICAgICAgICBAV2ViUGFyYW0odGFyZ2V0TmFtZXNwYWNlPSJ3ZWJwYXJhbS5uYW1lc3BhY2UiLCBoZWFkZXI9dHJ1ZSkgU3RyaW5nIHBhcmFtMywNCi0gICAgICAgICAgICBAV2ViUGFyYW0obW9kZT1XZWJQYXJhbS5Nb2RlLk9VVCwgaGVhZGVyPXRydWUpIEhvbGRlcjxTdHJpbmc+IG91dE9ubHksDQotICAgICAgICAgICAgQFdlYlBhcmFtKG5hbWU9ImluT3V0IiwgbW9kZT1XZWJQYXJhbS5Nb2RlLklOT1VULCBoZWFkZXI9dHJ1ZSkgSG9sZGVyPFN0cmluZz4gaW5PdXQsDQotICAgICAgICAgICAgU3RyaW5nIG5vdEluSGVhZGVyKSB7DQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL09wZXJhdGlvbkRlc2NyaXB0aW9uVGVzdHMuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9PcGVyYXRpb25EZXNjcmlwdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmNGM4MTcuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL09wZXJhdGlvbkRlc2NyaXB0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLkRlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLlBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5XZWJTZXJ2aWNlQW5ub3Q7Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0KLS8qKgotICogVGhlc2UgdGVzdHMgYXJlIGludGVuZGVkIHRvIHRlc3QgdmFyaW91cyBhc3BlY3RzIG9mIHRoZSBPcGVyYXRpb25EZXNjcmlwdGlvbi4KLSAqLwotCi1wdWJsaWMgY2xhc3MgT3BlcmF0aW9uRGVzY3JpcHRpb25UZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIC8qKgotICAgICAqIFRoaXMgdGVzdCB3aWxsIGNvbmZpcm0gdGhhdCB0aGUgZ2V0QmluZGluZ0lucHV0TmFtZXNwYWNlIGFuZCBnZXRCaW5kaW5nT3V0cHV0TmFtZXNwYWNlCi0gICAgICogbWV0aG9kcyBvZiB0aGUgT3BlcmF0aW9uRGVzY3JpcHRpb24gZnVuY3Rpb24gY29ycmVjdGx5LgotICAgICAqCi0gICAgICovCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QmluZGluZ05hbWVzcGFjZSgpIHsKLSAgICAgICAgU3RyaW5nIHdzZGxSZWxhdGl2ZUxvY2F0aW9uID0gInRlc3QtcmVzb3VyY2VzL3dzZGwvIjsKLSAgICAgICAgU3RyaW5nIHdzZGxGaWxlTmFtZSA9ICJCaW5kaW5nTmFtZXNwYWNlLndzZGwiOwotICAgICAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9ub25hbm9ueW1vdXMuY29tcGxleHR5cGUudGVzdC5vcmciOwotICAgICAgICBTdHJpbmcgd3NkbExvY2F0aW9uID0gd3NkbFJlbGF0aXZlTG9jYXRpb24gKyB3c2RsRmlsZU5hbWU7Ci0KLSAgICAgICAgLy8gQnVpbGQgdXAgYSBEQkMsIGluY2x1ZGluZyB0aGUgV1NETCBEZWZpbml0aW9uIGFuZCB0aGUgYW5ub3RhdGlvbiBpbmZvcm1hdGlvbiBmb3IgCi0gICAgICAgIC8vIHRoZSBpbXBsIGNsYXNzLgotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgZGJjID0gbmV3IERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSgpOwotCi0gICAgICAgIFVSTCB3c2RsVVJMID0gRGVzY3JpcHRpb25UZXN0VXRpbHMuZ2V0V1NETFVSTCh3c2RsRmlsZU5hbWUpOwotICAgICAgICBEZWZpbml0aW9uIHdzZGxEZWZuID0gRGVzY3JpcHRpb25UZXN0VXRpbHMuY3JlYXRlV1NETERlZmluaXRpb24od3NkbFVSTCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwod3NkbERlZm4pOwotCi0gICAgICAgIFdlYlNlcnZpY2VBbm5vdCB3ZWJTZXJ2aWNlQW5ub3QgPSBXZWJTZXJ2aWNlQW5ub3QuY3JlYXRlV2ViU2VydmljZUFubm90SW1wbCgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHdlYlNlcnZpY2VBbm5vdCk7Ci0gICAgICAgIHdlYlNlcnZpY2VBbm5vdC5zZXRXc2RsTG9jYXRpb24od3NkbExvY2F0aW9uKTsKLSAgICAgICAgd2ViU2VydmljZUFubm90LnNldFRhcmdldE5hbWVzcGFjZSh0YXJnZXROYW1lc3BhY2UpOwotICAgICAgICB3ZWJTZXJ2aWNlQW5ub3Quc2V0U2VydmljZU5hbWUoIkVjaG9NZXNzYWdlU2VydmljZSIpOwotICAgICAgICB3ZWJTZXJ2aWNlQW5ub3Quc2V0UG9ydE5hbWUoIkVjaG9NZXNzYWdlUG9ydCIpOwotCi0gICAgICAgIE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlIG1kYyA9IG5ldyBNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSgpOwotICAgICAgICBtZGMuc2V0TWV0aG9kTmFtZSgiZWNob01lc3NhZ2UiKTsKLSAgICAgICAgbWRjLnNldFJldHVyblR5cGUoImphdmEubGFuZy5TdHJpbmciKTsKLQotICAgICAgICBQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZSBwZGMxID0gbmV3IFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlKCk7Ci0gICAgICAgIHBkYzEuc2V0UGFyYW1ldGVyVHlwZSgiamF2YS5sYW5nLlN0cmluZyIpOwotCi0gICAgICAgIG1kYy5hZGRQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZShwZGMxKTsKLQotICAgICAgICBkYmMuYWRkTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUobWRjKTsKLSAgICAgICAgZGJjLnNldFdlYlNlcnZpY2VBbm5vdCh3ZWJTZXJ2aWNlQW5ub3QpOwotICAgICAgICBkYmMuc2V0Q2xhc3NOYW1lKEJpbmRpbmdOU0ltcGwuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgZGJjLnNldFdzZGxEZWZpbml0aW9uKHdzZGxEZWZuKTsKLSAgICAgICAgZGJjLnNldHdzZGxVUkwod3NkbFVSTCk7Ci0KLSAgICAgICAgSGFzaE1hcDxTdHJpbmcsIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZT4gZGJjTWFwID0KLSAgICAgICAgICAgICAgICBuZXcgSGFzaE1hcDxTdHJpbmcsIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZT4oKTsKLSAgICAgICAgZGJjTWFwLnB1dChkYmMuZ2V0Q2xhc3NOYW1lKCksIGRiYyk7Ci0gICAgICAgIExpc3Q8U2VydmljZURlc2NyaXB0aW9uPiBzZXJ2aWNlRGVzY0xpc3QgPQotICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uRmFjdG9yeS5jcmVhdGVTZXJ2aWNlRGVzY3JpcHRpb25Gcm9tREJDTWFwKGRiY01hcCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBzZXJ2aWNlRGVzY0xpc3Quc2l6ZSgpKTsKLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNkID0gc2VydmljZURlc2NMaXN0LmdldCgwKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZCk7Ci0KLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbltdIGVkQXJyYXkgPSBzZC5nZXRFbmRwb2ludERlc2NyaXB0aW9ucygpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGVkQXJyYXkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgZWRBcnJheS5sZW5ndGgpOwotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVkID0gZWRBcnJheVswXTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChlZCk7Ci0KLSAgICAgICAgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiBlaWQgPSBlZC5nZXRFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZWlkKTsKLQotICAgICAgICBPcGVyYXRpb25EZXNjcmlwdGlvbltdIG9kQXJyYXkgPSBlaWQuZ2V0T3BlcmF0aW9ucygpOwotICAgICAgICBhc3NlcnROb3ROdWxsKG9kQXJyYXkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgb2RBcnJheS5sZW5ndGgpOwotICAgICAgICBPcGVyYXRpb25EZXNjcmlwdGlvbiBvZCA9IG9kQXJyYXlbMF07Ci0gICAgICAgIGFzc2VydE5vdE51bGwob2QpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly9vcmcuYXBhY2hlLmJpbmRpbmcubnMiLCBvZC5nZXRCaW5kaW5nSW5wdXROYW1lc3BhY2UoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiaHR0cDovL29yZy5hcGFjaGUuYmluZGluZy5ucyIsIG9kLmdldEJpbmRpbmdPdXRwdXROYW1lc3BhY2UoKSk7Ci0KLSAgICB9Ci0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RCaW5kaW5nTmFtZXNwYWNlRGVmYXVsdHMoKSB7Ci0gICAgICAgIFN0cmluZyB3c2RsUmVsYXRpdmVMb2NhdGlvbiA9ICJ0ZXN0LXJlc291cmNlcy93c2RsLyI7Ci0gICAgICAgIFN0cmluZyB3c2RsRmlsZU5hbWUgPSAiQmluZGluZ05hbWVzcGFjZURlZmF1bHRzLndzZGwiOwotICAgICAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9ub25hbm9ueW1vdXMuY29tcGxleHR5cGUudGVzdC5vcmciOwotICAgICAgICBTdHJpbmcgd3NkbExvY2F0aW9uID0gd3NkbFJlbGF0aXZlTG9jYXRpb24gKyB3c2RsRmlsZU5hbWU7Ci0KLSAgICAgICAgLy8gQnVpbGQgdXAgYSBEQkMsIGluY2x1ZGluZyB0aGUgV1NETCBEZWZpbml0aW9uIGFuZCB0aGUgYW5ub3RhdGlvbiBpbmZvcm1hdGlvbiBmb3IgCi0gICAgICAgIC8vIHRoZSBpbXBsIGNsYXNzLgotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgZGJjID0gbmV3IERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSgpOwotCi0gICAgICAgIFVSTCB3c2RsVVJMID0gRGVzY3JpcHRpb25UZXN0VXRpbHMuZ2V0V1NETFVSTCh3c2RsRmlsZU5hbWUpOwotICAgICAgICBEZWZpbml0aW9uIHdzZGxEZWZuID0gRGVzY3JpcHRpb25UZXN0VXRpbHMuY3JlYXRlV1NETERlZmluaXRpb24od3NkbFVSTCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwod3NkbERlZm4pOwotCi0gICAgICAgIFdlYlNlcnZpY2VBbm5vdCB3ZWJTZXJ2aWNlQW5ub3QgPSBXZWJTZXJ2aWNlQW5ub3QuY3JlYXRlV2ViU2VydmljZUFubm90SW1wbCgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHdlYlNlcnZpY2VBbm5vdCk7Ci0gICAgICAgIHdlYlNlcnZpY2VBbm5vdC5zZXRXc2RsTG9jYXRpb24od3NkbExvY2F0aW9uKTsKLSAgICAgICAgd2ViU2VydmljZUFubm90LnNldFRhcmdldE5hbWVzcGFjZSh0YXJnZXROYW1lc3BhY2UpOwotICAgICAgICB3ZWJTZXJ2aWNlQW5ub3Quc2V0U2VydmljZU5hbWUoIkVjaG9NZXNzYWdlU2VydmljZSIpOwotICAgICAgICB3ZWJTZXJ2aWNlQW5ub3Quc2V0UG9ydE5hbWUoIkVjaG9NZXNzYWdlUG9ydCIpOwotCi0gICAgICAgIE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlIG1kYyA9IG5ldyBNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSgpOwotICAgICAgICBtZGMuc2V0TWV0aG9kTmFtZSgiZWNob01lc3NhZ2UiKTsKLSAgICAgICAgbWRjLnNldFJldHVyblR5cGUoImphdmEubGFuZy5TdHJpbmciKTsKLQotICAgICAgICBQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZSBwZGMxID0gbmV3IFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlKCk7Ci0gICAgICAgIHBkYzEuc2V0UGFyYW1ldGVyVHlwZSgiamF2YS5sYW5nLlN0cmluZyIpOwotCi0gICAgICAgIG1kYy5hZGRQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZShwZGMxKTsKLQotICAgICAgICBkYmMuYWRkTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUobWRjKTsKLSAgICAgICAgZGJjLnNldFdlYlNlcnZpY2VBbm5vdCh3ZWJTZXJ2aWNlQW5ub3QpOwotICAgICAgICBkYmMuc2V0Q2xhc3NOYW1lKEJpbmRpbmdOU0ltcGwuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgZGJjLnNldFdzZGxEZWZpbml0aW9uKHdzZGxEZWZuKTsKLSAgICAgICAgZGJjLnNldHdzZGxVUkwod3NkbFVSTCk7Ci0gICAgICAgIEhhc2hNYXA8U3RyaW5nLCBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGU+IGRiY01hcCA9Ci0gICAgICAgICAgICAgICAgbmV3IEhhc2hNYXA8U3RyaW5nLCBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGU+KCk7Ci0gICAgICAgIGRiY01hcC5wdXQoZGJjLmdldENsYXNzTmFtZSgpLCBkYmMpOwotICAgICAgICBMaXN0PFNlcnZpY2VEZXNjcmlwdGlvbj4gc2VydmljZURlc2NMaXN0ID0KLSAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkZhY3RvcnkuY3JlYXRlU2VydmljZURlc2NyaXB0aW9uRnJvbURCQ01hcChkYmNNYXApOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgc2VydmljZURlc2NMaXN0LnNpemUoKSk7Ci0gICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzZCA9IHNlcnZpY2VEZXNjTGlzdC5nZXQoMCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2QpOwotCi0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb25bXSBlZEFycmF5ID0gc2QuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbnMoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChlZEFycmF5KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGVkQXJyYXkubGVuZ3RoKTsKLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlZCA9IGVkQXJyYXlbMF07Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZWQpOwotCi0gICAgICAgIEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24gZWlkID0gZWQuZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbigpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGVpZCk7Ci0KLSAgICAgICAgT3BlcmF0aW9uRGVzY3JpcHRpb25bXSBvZEFycmF5ID0gZWlkLmdldE9wZXJhdGlvbnMoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChvZEFycmF5KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG9kQXJyYXkubGVuZ3RoKTsKLSAgICAgICAgT3BlcmF0aW9uRGVzY3JpcHRpb24gb2QgPSBvZEFycmF5WzBdOwotICAgICAgICBhc3NlcnROb3ROdWxsKG9kKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJodHRwOi8vbm9uYW5vbnltb3VzLmNvbXBsZXh0eXBlLnRlc3Qub3JnIiwgb2QuZ2V0QmluZGluZ0lucHV0TmFtZXNwYWNlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly9ub25hbm9ueW1vdXMuY29tcGxleHR5cGUudGVzdC5vcmciLCBvZC5nZXRCaW5kaW5nT3V0cHV0TmFtZXNwYWNlKCkpOwotCi0gICAgfQotCi0KLSAgICBAV2ViU2VydmljZShzZXJ2aWNlTmFtZSA9ICJFY2hvTWVzc2FnZVNlcnZpY2UiLCBwb3J0TmFtZSA9ICJFY2hvTWVzc2FnZVBvcnQiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL25vbmFub255bW91cy5jb21wbGV4dHlwZS50ZXN0Lm9yZyIsIHdzZGxMb2NhdGlvbiA9ICJ0ZXN0LXJlc291cmNlcy93c2RsL0JpbmRpbmdOYW1lc3BhY2Uud3NkbCIpCi0gICAgcHVibGljIGNsYXNzIEJpbmRpbmdOU0ltcGwgewotICAgICAgICBwdWJsaWMgU3RyaW5nIGVjaG9NZXNzYWdlKFN0cmluZyBhcmcpIHsKLSAgICAgICAgICAgIHJldHVybiBhcmc7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIEBXZWJTZXJ2aWNlKHNlcnZpY2VOYW1lID0gIkVjaG9NZXNzYWdlU2VydmljZSIsIHBvcnROYW1lID0gIkVjaG9NZXNzYWdlUG9ydCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vbm9uYW5vbnltb3VzLmNvbXBsZXh0eXBlLnRlc3Qub3JnIiwgd3NkbExvY2F0aW9uID0gInRlc3QtcmVzb3VyY2VzL3dzZGwvQmluZGluZ05hbWVzcGFjZURlZmF1bHRzLndzZGwiKQotICAgIHB1YmxpYyBjbGFzcyBCaW5kaW5nTlNEZWZhdWx0c0ltcGwgewotICAgICAgICBwdWJsaWMgU3RyaW5nIGVjaG9NZXNzYWdlKFN0cmluZyBhcmcpIHsKLSAgICAgICAgICAgIHJldHVybiBhcmc7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9QYXJ0aWFsV1NETFRlc3RzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vUGFydGlhbFdTRExUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2YzZGZjLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9QYXJ0aWFsV1NETFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5QYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5FbmRwb2ludERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5EZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLk1EUUNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLlBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5XZWJTZXJ2aWNlQW5ub3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLldzZGxDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLldzZGxHZW5lcmF0b3I7Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBQYXJ0aWFsV1NETFRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgLyoqCi0gICAgICogVGVzdHMgdGhlIGJpbmRpbmcsIHNlcnZpY2UsIGFuZCBwb3J0IG5vdCBzcGVjaWZpZWQgaW4gdGhlIFdTREwuCi0gICAgICogPHAvPgotICAgICAqIFRoaXMgdGVzdCBpcyBiYXNlZCBvbiB0aGUgRlZUIHRlc3QgQWRkTnVtYmVyc0ltcGxQYXJ0aWFsMQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJ0aWFsV1NETDEoKSB7Ci0gICAgICAgIFN0cmluZyB3c2RsUmVsYXRpdmVMb2NhdGlvbiA9ICJ0ZXN0LXJlc291cmNlcy93c2RsLyI7Ci0gICAgICAgIFN0cmluZyB3c2RsRmlsZU5hbWUgPSAiUGFydGlhbFdTREwxLndzZGwiOwotCi0gICAgICAgIFN0cmluZyB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3NlcnZlclBhcnRpYWwxLmNoZWNrZXhjZXB0aW9uLndlYmZhdWx0LmFubm90YXRpb25zLyI7Ci0gICAgICAgIFN0cmluZyB3c2RsTG9jYXRpb24gPSB3c2RsUmVsYXRpdmVMb2NhdGlvbiArIHdzZGxGaWxlTmFtZTsKLQotICAgICAgICAvLyBCdWlsZCB1cCBhIERCQywgaW5jbHVkaW5nIHRoZSBXU0RMIERlZmluaXRpb24gYW5kIHRoZSBhbm5vdGF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgaW1wbCBjbGFzcy4KLSAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIGRiYyA9IG5ldyBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUoKTsKLQotICAgICAgICBVUkwgd3NkbFVSTCA9IERlc2NyaXB0aW9uVGVzdFV0aWxzLmdldFdTRExVUkwod3NkbEZpbGVOYW1lKTsKLSAgICAgICAgRGVmaW5pdGlvbiB3c2RsRGVmbiA9IERlc2NyaXB0aW9uVGVzdFV0aWxzLmNyZWF0ZVdTRExEZWZpbml0aW9uKHdzZGxVUkwpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHdzZGxEZWZuKTsKLQotICAgICAgICBXZWJTZXJ2aWNlQW5ub3Qgd2ViU2VydmljZUFubm90ID0gV2ViU2VydmljZUFubm90LmNyZWF0ZVdlYlNlcnZpY2VBbm5vdEltcGwoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh3ZWJTZXJ2aWNlQW5ub3QpOwotICAgICAgICB3ZWJTZXJ2aWNlQW5ub3Quc2V0V3NkbExvY2F0aW9uKHdzZGxMb2NhdGlvbik7Ci0gICAgICAgIHdlYlNlcnZpY2VBbm5vdC5zZXRUYXJnZXROYW1lc3BhY2UodGFyZ2V0TmFtZXNwYWNlKTsKLQotICAgICAgICBNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSBtZGMgPSBuZXcgTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUoKTsKLSAgICAgICAgbWRjLnNldE1ldGhvZE5hbWUoImFkZFR3b051bWJlcnMiKTsKLSAgICAgICAgbWRjLnNldFJldHVyblR5cGUoImludCIpOwotCi0gICAgICAgIFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlIHBkYzEgPSBuZXcgUGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGUoKTsKLSAgICAgICAgcGRjMS5zZXRQYXJhbWV0ZXJUeXBlKCJpbnQiKTsKLSAgICAgICAgUGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGUgcGRjMiA9IG5ldyBQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZSgpOwotICAgICAgICBwZGMxLnNldFBhcmFtZXRlclR5cGUoImludCIpOwotCi0gICAgICAgIG1kYy5hZGRQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZShwZGMxKTsKLSAgICAgICAgbWRjLmFkZFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlKHBkYzIpOwotCi0gICAgICAgIGRiYy5hZGRNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZShtZGMpOwotICAgICAgICBkYmMuc2V0V2ViU2VydmljZUFubm90KHdlYlNlcnZpY2VBbm5vdCk7Ci0gICAgICAgIGRiYy5zZXRDbGFzc05hbWUoQWRkTnVtYmVyc0ltcGxQYXJ0aWFsMS5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICBkYmMuc2V0V3NkbERlZmluaXRpb24od3NkbERlZm4pOwotICAgICAgICBkYmMuc2V0d3NkbFVSTCh3c2RsVVJMKTsKLSAgICAgICAgZGJjLnNldEN1c3RvbVdzZGxHZW5lcmF0b3IobmV3IFdTRExHZW5lcmF0b3JJbXBsKHdzZGxEZWZuKSk7Ci0KLSAgICAgICAgSGFzaE1hcDxTdHJpbmcsIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZT4gZGJjTWFwID0KLSAgICAgICAgICAgICAgICBuZXcgSGFzaE1hcDxTdHJpbmcsIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZT4oKTsKLSAgICAgICAgZGJjTWFwLnB1dChBZGROdW1iZXJzSW1wbFBhcnRpYWwxLmNsYXNzLmdldE5hbWUoKSwgZGJjKTsKLQotICAgICAgICBMaXN0PFNlcnZpY2VEZXNjcmlwdGlvbj4gc2VydmljZURlc2NMaXN0ID0KLSAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkZhY3RvcnkuY3JlYXRlU2VydmljZURlc2NyaXB0aW9uRnJvbURCQ01hcChkYmNNYXApOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgc2VydmljZURlc2NMaXN0LnNpemUoKSk7Ci0gICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzZCA9IHNlcnZpY2VEZXNjTGlzdC5nZXQoMCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2QpOwotCi0KLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbltdIGVkQXJyYXkgPSBzZC5nZXRFbmRwb2ludERlc2NyaXB0aW9ucygpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGVkQXJyYXkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgZWRBcnJheS5sZW5ndGgpOwotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVkID0gZWRBcnJheVswXTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChlZCk7Ci0KLSAgICAgICAgLy8gVGVzdCBmb3IgcHJlc2VuY2Ugb2YgZ2VuZXJhdGVkIFdTREwKLSAgICAgICAgQXhpc1NlcnZpY2UgYXMgPSBlZC5nZXRBeGlzU2VydmljZSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGFzKTsKLSAgICAgICAgUGFyYW1ldGVyIGNvbXBvc2l0ZVBhcmFtID0gYXMuZ2V0UGFyYW1ldGVyKE1EUUNvbnN0YW50cy5XU0RMX0NPTVBPU0lURSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoY29tcG9zaXRlUGFyYW0pOwotICAgICAgICBhc3NlcnROb3ROdWxsKGNvbXBvc2l0ZVBhcmFtLmdldFZhbHVlKCkpOwotCi0gICAgICAgIEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24gZWlkID0gZWQuZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbigpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGVpZCk7Ci0KLSAgICAgICAgT3BlcmF0aW9uRGVzY3JpcHRpb25bXSBvZEFycmF5ID0gZWlkLmdldE9wZXJhdGlvbnMoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChvZEFycmF5KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG9kQXJyYXkubGVuZ3RoKTsKLSAgICAgICAgT3BlcmF0aW9uRGVzY3JpcHRpb24gb2QgPSBvZEFycmF5WzBdOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHRoZSBiaW5kaW5nLCBzZXJ2aWNlLCBhbmQgcG9ydCBub3Qgc3BlY2lmaWVkIGluIHRoZSBXU0RMLgotICAgICAqIDxwLz4KLSAgICAgKiBUaGlzIHRlc3QgaXMgYmFzZWQgb24gdGhlIEZWVCB0ZXN0IEFkZE51bWJlcnNJbXBsUGFydGlhbDIKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGFydGlhbFdTREwyKCkgewotICAgICAgICBTdHJpbmcgd3NkbFJlbGF0aXZlTG9jYXRpb24gPSAidGVzdC1yZXNvdXJjZXMvd3NkbC8iOwotICAgICAgICBTdHJpbmcgd3NkbEZpbGVOYW1lID0gIlBhcnRpYWxXU0RMMi53c2RsIjsKLQotICAgICAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9zZXJ2ZXJQYXJ0aWFsMS5jaGVja2V4Y2VwdGlvbi53ZWJmYXVsdC5hbm5vdGF0aW9ucy8iOwotICAgICAgICBTdHJpbmcgd3NkbExvY2F0aW9uID0gd3NkbFJlbGF0aXZlTG9jYXRpb24gKyB3c2RsRmlsZU5hbWU7Ci0KLSAgICAgICAgLy8gQnVpbGQgdXAgYSBEQkMsIGluY2x1ZGluZyB0aGUgV1NETCBEZWZpbml0aW9uIGFuZCB0aGUgYW5ub3RhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIGltcGwgY2xhc3MuCi0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBkYmMgPSBuZXcgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCk7Ci0KLSAgICAgICAgVVJMIHdzZGxVUkwgPSBEZXNjcmlwdGlvblRlc3RVdGlscy5nZXRXU0RMVVJMKHdzZGxGaWxlTmFtZSk7Ci0gICAgICAgIERlZmluaXRpb24gd3NkbERlZm4gPSBEZXNjcmlwdGlvblRlc3RVdGlscy5jcmVhdGVXU0RMRGVmaW5pdGlvbih3c2RsVVJMKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh3c2RsRGVmbik7Ci0KLSAgICAgICAgV2ViU2VydmljZUFubm90IHdlYlNlcnZpY2VBbm5vdCA9IFdlYlNlcnZpY2VBbm5vdC5jcmVhdGVXZWJTZXJ2aWNlQW5ub3RJbXBsKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwod2ViU2VydmljZUFubm90KTsKLSAgICAgICAgd2ViU2VydmljZUFubm90LnNldFdzZGxMb2NhdGlvbih3c2RsTG9jYXRpb24pOwotICAgICAgICB3ZWJTZXJ2aWNlQW5ub3Quc2V0VGFyZ2V0TmFtZXNwYWNlKHRhcmdldE5hbWVzcGFjZSk7Ci0KLSAgICAgICAgTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUgbWRjID0gbmV3IE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlKCk7Ci0gICAgICAgIG1kYy5zZXRNZXRob2ROYW1lKCJhZGRUd29OdW1iZXJzIik7Ci0gICAgICAgIG1kYy5zZXRSZXR1cm5UeXBlKCJpbnQiKTsKLQotICAgICAgICBQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZSBwZGMxID0gbmV3IFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlKCk7Ci0gICAgICAgIHBkYzEuc2V0UGFyYW1ldGVyVHlwZSgiaW50Iik7Ci0gICAgICAgIFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlIHBkYzIgPSBuZXcgUGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGUoKTsKLSAgICAgICAgcGRjMS5zZXRQYXJhbWV0ZXJUeXBlKCJpbnQiKTsKLQotICAgICAgICBtZGMuYWRkUGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGUocGRjMSk7Ci0gICAgICAgIG1kYy5hZGRQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZShwZGMyKTsKLQotICAgICAgICBkYmMuYWRkTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUobWRjKTsKLSAgICAgICAgZGJjLnNldFdlYlNlcnZpY2VBbm5vdCh3ZWJTZXJ2aWNlQW5ub3QpOwotICAgICAgICBkYmMuc2V0Q2xhc3NOYW1lKEFkZE51bWJlcnNJbXBsUGFydGlhbDEuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgZGJjLnNldFdzZGxEZWZpbml0aW9uKHdzZGxEZWZuKTsKLSAgICAgICAgZGJjLnNldHdzZGxVUkwod3NkbFVSTCk7Ci0gICAgICAgIGRiYy5zZXRDdXN0b21Xc2RsR2VuZXJhdG9yKG5ldyBXU0RMR2VuZXJhdG9ySW1wbCh3c2RsRGVmbikpOwotCi0gICAgICAgIEhhc2hNYXA8U3RyaW5nLCBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGU+IGRiY01hcCA9Ci0gICAgICAgICAgICAgICAgbmV3IEhhc2hNYXA8U3RyaW5nLCBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGU+KCk7Ci0gICAgICAgIGRiY01hcC5wdXQoQWRkTnVtYmVyc0ltcGxQYXJ0aWFsMS5jbGFzcy5nZXROYW1lKCksIGRiYyk7Ci0KLSAgICAgICAgTGlzdDxTZXJ2aWNlRGVzY3JpcHRpb24+IHNlcnZpY2VEZXNjTGlzdCA9Ci0gICAgICAgICAgICAgICAgRGVzY3JpcHRpb25GYWN0b3J5LmNyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbkZyb21EQkNNYXAoZGJjTWFwKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHNlcnZpY2VEZXNjTGlzdC5zaXplKCkpOwotICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc2QgPSBzZXJ2aWNlRGVzY0xpc3QuZ2V0KDApOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNkKTsKLQotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uW10gZWRBcnJheSA9IHNkLmdldEVuZHBvaW50RGVzY3JpcHRpb25zKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZWRBcnJheSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBlZEFycmF5Lmxlbmd0aCk7Ci0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZWQgPSBlZEFycmF5WzBdOwotICAgICAgICBhc3NlcnROb3ROdWxsKGVkKTsKLQotICAgICAgICAvLyBUZXN0IGZvciBwcmVzZW5jZSBvZiBnZW5lcmF0ZWQgV1NETAotICAgICAgICBBeGlzU2VydmljZSBhcyA9IGVkLmdldEF4aXNTZXJ2aWNlKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoYXMpOwotICAgICAgICBQYXJhbWV0ZXIgY29tcG9zaXRlUGFyYW0gPSBhcy5nZXRQYXJhbWV0ZXIoTURRQ29uc3RhbnRzLldTRExfQ09NUE9TSVRFKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChjb21wb3NpdGVQYXJhbSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoY29tcG9zaXRlUGFyYW0uZ2V0VmFsdWUoKSk7Ci0KLSAgICAgICAgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiBlaWQgPSBlZC5nZXRFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZWlkKTsKLQotICAgICAgICBPcGVyYXRpb25EZXNjcmlwdGlvbltdIG9kQXJyYXkgPSBlaWQuZ2V0T3BlcmF0aW9ucygpOwotICAgICAgICBhc3NlcnROb3ROdWxsKG9kQXJyYXkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgb2RBcnJheS5sZW5ndGgpOwotICAgICAgICBPcGVyYXRpb25EZXNjcmlwdGlvbiBvZCA9IG9kQXJyYXlbMF07Ci0gICAgfQotfQotCi1AV2ViU2VydmljZSh3c2RsTG9jYXRpb24gPSAidGVzdC1yZXNvdXJjZXMvd3NkbC9QYXJ0aWFsV1NETDIud3NkbCIsCi0gICAgICAgICAgICB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3NlcnZlclBhcnRpYWwxLmNoZWNrZXhjZXB0aW9uLndlYmZhdWx0LmFubm90YXRpb25zLyIpCi1jbGFzcyBBZGROdW1iZXJzSW1wbFBhcnRpYWwxIHsKLSAgICBwdWJsaWMgaW50IGFkZFR3b051bWJlcnMoaW50IG51bWJlcjEsIGludCBudW1iZXIyKSB7Ci0gICAgICAgIHJldHVybiBudW1iZXIxICsgbnVtYmVyMjsKLSAgICB9Ci19Ci0KLWNsYXNzIFdTRExHZW5lcmF0b3JJbXBsIGltcGxlbWVudHMgV3NkbEdlbmVyYXRvciB7Ci0KLSAgICBwcml2YXRlIERlZmluaXRpb24gZGVmOwotCi0gICAgcHVibGljIFdTRExHZW5lcmF0b3JJbXBsKERlZmluaXRpb24gZGVmKSB7Ci0gICAgICAgIHRoaXMuZGVmID0gZGVmOwotICAgIH0KLQotICAgIHB1YmxpYyBXc2RsQ29tcG9zaXRlIGdlbmVyYXRlV3NkbChTdHJpbmcgaW1wbENsYXNzLCBFbmRwb2ludERlc2NyaXB0aW9uIGVuZHBvaW50RGVzYykKLSAgICAgICAgICAgIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gTmVlZCBXU0RMIGdlbmVyYXRpb24gY29kZQotICAgICAgICBXc2RsQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBXc2RsQ29tcG9zaXRlKCk7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRXc2RsRmlsZU5hbWUoaW1wbENsYXNzKTsKLSAgICAgICAgSGFzaE1hcDxTdHJpbmcsIERlZmluaXRpb24+IHRlc3RNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIERlZmluaXRpb24+KCk7Ci0gICAgICAgIHRlc3RNYXAucHV0KGNvbXBvc2l0ZS5nZXRXc2RsRmlsZU5hbWUoKSwgZGVmKTsKLSAgICAgICAgY29tcG9zaXRlLnNldFdzZGxEZWZpbml0aW9uKHRlc3RNYXApOwotICAgICAgICByZXR1cm4gY29tcG9zaXRlOwotICAgIH0KLQotfQotCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vUmVsZWFzZUF4aXNSZXNvdXJjZXNUZXN0cy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL1JlbGVhc2VBeGlzUmVzb3VyY2VzVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdiNDM4Yi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vUmVsZWFzZUF4aXNSZXNvdXJjZXNUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqIA0KLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICogICAgICANCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLkRlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLk1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuUGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5XZWJTZXJ2aWNlQW5ub3Q7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uaW1wbC5EZXNjcmlwdGlvbkZhY3RvcnlJbXBsOw0KLQ0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsNCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOw0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOw0KLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsNCi0NCi1pbXBvcnQgamF2YS5pby5GaWxlOw0KLWltcG9ydCBqYXZhLm5ldC5VUkw7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOw0KLQ0KLS8qKg0KLSAqIFRlc3QgdGhhdCB3aXRoIHRoZSBjb25maWd1cmF0aW9uIHByb3BlcnR5IHNldCBpbiBheGlzMi54bWwsIHRoZSBBeGlzU2VydmljZQ0KLSAqIHJlc291cmNlcyBhcmUgcmVsZWFzZWQgYWZ0ZXIgdGhleSBhcmUgbm8gbG9uZ2VyIG5lZWRlZC4gIFRoZSBjb25maWd1YXRpb24NCi0gKiB2YWx1ZSBpbiBheGlzMi54bWwgaXM6DQotICogICAgIDxwYXJhbWV0ZXIgbmFtZT0icmVkdWNlV1NETE1lbW9yeUNhY2hlIj50cnVlPC9wYXJhbWV0ZXI+DQotICogDQotICogTk9URTogdGhlIHRlc3RzIGN1cnJlbnRseSB1c2UgdGhlIGF4aXMyLnhtbCBmcm9tIG1vZHVsZXMva2VybmVsL2NvbmYgKHNlZQ0KLSAqIGJ1aWxkLnhtbCkuICBUaGVyZSBpcyBhbiBheGlzMi54bWwgaW4gdGhlIHRlc3QtcmVzb3VyY2UgZGlyZWN0b3J5IHdoaWNoDQotICogZW5hYmxlcyB0aGUgbmVjZXNzYXJ5IHByb3BlcnR5LiAgVGhpcyBheGlzMi54bWwgaXMgdXNlZCBieSBleHBsaWNpdGx5IGNyZWF0aW5nIGENCi0gKiBjb25maWd1cmF0aW9uIGNvbnRleHQgdG8gcG9pbnQgdG8gaXQuDQotICogDQotICogQUxTTyBOT1RFOiBUaGUgZGVmYXVsdCBiZWhhdmlvciBzaG91bGQgYmUgT0ZGISAgV2hlbiB0aGUgcmVzb3VyY2VzIGFyZSBjbGVhbmVkIGZyb20NCi0gKiB0aGUgQXhpc1NlcnZpY2UsID94c2Qgd2lsbCBub3Qgd29yay4NCi0gKiANCi0gKiBUaGlzIHRlc3QgaXMgYmFzZWQgaGVhdmlseSBvbiBtb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9EQkN3aXRoUmVkdWNlV1NETE1lbW9yeVBhcm1zVGVzdHMuamF2YQ0KLSAqLw0KLXB1YmxpYyBjbGFzcyBSZWxlYXNlQXhpc1Jlc291cmNlc1Rlc3RzIGV4dGVuZHMgVGVzdENhc2Ugew0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgYmFzZWRpcjsNCi0gICAgDQotICAgIHN0YXRpYyB7DQotICAgICAgICBiYXNlZGlyID0gU3lzdGVtLmdldFByb3BlcnR5KCJiYXNlZGlyIik7DQotICAgICAgICBpZiAoYmFzZWRpciA9PSBudWxsKSB7DQotICAgICAgICAgICAgYmFzZWRpciA9IG5ldyBGaWxlKCIuIikuZ2V0QWJzb2x1dGVQYXRoKCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFRlc3QgdGhhdCB0aGUgZGVmYXVsdCBiZWhhdmlvciBpcyB0byBOT1QgY2xlbnVwIEF4aXNTZXJ2aWNlIHJlc291cmNlcy4gIFRoZSBheGlzMi54bWwNCi0gICAgICogZmlsZSB1c2VkIHdpbGwgYmUgdGhlIGRlZmF1bHQgb25lLCBpbiB0YXJnZXQvcmVwb3NpdG9yeS9jb25mLiAgVGhlIHByb3Blcnkgc2hvdWxkIG5vdA0KLSAgICAgKiBiZSBzZXQgaW4gdGhhdCBmaWxlLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdFNlcnZlclNpZGVSZWxlYXNlX0RlZmF1bHRfT0ZGKCkgew0KLQ0KLSAgICAgICAgLy8gU2luY2Ugd2UgYXJlbid0IGV4cGxpY2x0eSBjcmVhdGluZyBhIENvbmZpZ3VyYXRpb25Db250ZXh0IHVzaW5nIGEgZGlmZmVyZXRuIGF4aXMyLnhtbCwNCi0gICAgICAgIC8vIHRoZSBmaWxlIHRhcmdldC9yZXBvc2l0b3J5L2NvbmYvYXhpczIueG1sIHdpbGwgYmUgdXNlZC4gIFRoaXMgb25lDQotICAgICAgICAvLyB3aWxsIG5vdCBoYXZlIHRoZSBwcm9wZXJ0eSBzZXQgd2hpY2ggY2F1c2VzIEF4aXNTZXJ2aWNlIHJlc291cmNlcyB0byBiZSBjbGVhbmVkIHVwLg0KLSAgICAgICAgDQotICAgICAgICBTdHJpbmcgd3NkbFJlbGF0aXZlTG9jYXRpb24gPSAidGVzdC1yZXNvdXJjZXMvd3NkbC8iOw0KLSAgICAgICAgU3RyaW5nIHdzZGxGaWxlTmFtZSA9ICJCaW5kaW5nTmFtZXNwYWNlLndzZGwiOw0KLSAgICAgICAgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vbm9uYW5vbnltb3VzLmNvbXBsZXh0eXBlLnRlc3Qub3JnIjsNCi0gICAgICAgIFN0cmluZyB3c2RsTG9jYXRpb24gPSB3c2RsUmVsYXRpdmVMb2NhdGlvbiArIHdzZGxGaWxlTmFtZTsNCi0NCi0gICAgICAgIC8vIEJ1aWxkIHVwIGEgREJDLCBpbmNsdWRpbmcgdGhlIFdTREwgRGVmaW5pdGlvbiBhbmQgdGhlIGFubm90YXRpb24gaW5mb3JtYXRpb24gZm9yIA0KLSAgICAgICAgLy8gdGhlIGltcGwgY2xhc3MuDQotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgZGJjID0gbmV3IERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSgvKmNvbmZpZ0NvbnRleHQqLyk7DQotDQotICAgICAgICBVUkwgd3NkbFVSTCA9IERlc2NyaXB0aW9uVGVzdFV0aWxzLmdldFdTRExVUkwod3NkbEZpbGVOYW1lKTsNCi0gICAgICAgIERlZmluaXRpb24gd3NkbERlZm4gPSBEZXNjcmlwdGlvblRlc3RVdGlscy5jcmVhdGVXU0RMRGVmaW5pdGlvbih3c2RsVVJMKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwod3NkbERlZm4pOw0KLQ0KLSAgICAgICAgV2ViU2VydmljZUFubm90IHdlYlNlcnZpY2VBbm5vdCA9IFdlYlNlcnZpY2VBbm5vdC5jcmVhdGVXZWJTZXJ2aWNlQW5ub3RJbXBsKCk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHdlYlNlcnZpY2VBbm5vdCk7DQotICAgICAgICB3ZWJTZXJ2aWNlQW5ub3Quc2V0V3NkbExvY2F0aW9uKHdzZGxMb2NhdGlvbik7DQotICAgICAgICB3ZWJTZXJ2aWNlQW5ub3Quc2V0VGFyZ2V0TmFtZXNwYWNlKHRhcmdldE5hbWVzcGFjZSk7DQotICAgICAgICB3ZWJTZXJ2aWNlQW5ub3Quc2V0U2VydmljZU5hbWUoIkVjaG9NZXNzYWdlU2VydmljZSIpOw0KLSAgICAgICAgd2ViU2VydmljZUFubm90LnNldFBvcnROYW1lKCJFY2hvTWVzc2FnZVBvcnQiKTsNCi0NCi0gICAgICAgIE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlIG1kYyA9IG5ldyBNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSgpOw0KLSAgICAgICAgbWRjLnNldE1ldGhvZE5hbWUoImVjaG9NZXNzYWdlIik7DQotICAgICAgICBtZGMuc2V0UmV0dXJuVHlwZSgiamF2YS5sYW5nLlN0cmluZyIpOw0KLQ0KLSAgICAgICAgUGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGUgcGRjMSA9IG5ldyBQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZSgpOw0KLSAgICAgICAgcGRjMS5zZXRQYXJhbWV0ZXJUeXBlKCJqYXZhLmxhbmcuU3RyaW5nIik7DQotDQotICAgICAgICBtZGMuYWRkUGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGUocGRjMSk7DQotDQotICAgICAgICBkYmMuYWRkTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUobWRjKTsNCi0gICAgICAgIGRiYy5zZXRXZWJTZXJ2aWNlQW5ub3Qod2ViU2VydmljZUFubm90KTsNCi0gICAgICAgIGRiYy5zZXRDbGFzc05hbWUoQmluZGluZ05TSW1wbC5jbGFzcy5nZXROYW1lKCkpOw0KLSAgICAgICAgZGJjLnNldHdzZGxVUkwod3NkbFVSTCk7DQotDQotICAgICAgICBIYXNoTWFwPFN0cmluZywgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlPiBkYmNNYXAgPQ0KLSAgICAgICAgICAgICAgICBuZXcgSGFzaE1hcDxTdHJpbmcsIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZT4oKTsNCi0gICAgICAgIGRiY01hcC5wdXQoZGJjLmdldENsYXNzTmFtZSgpLCBkYmMpOw0KLQ0KLSAgICAgICAgTGlzdDxTZXJ2aWNlRGVzY3JpcHRpb24+IHNlcnZpY2VEZXNjTGlzdCA9DQotICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uRmFjdG9yeS5jcmVhdGVTZXJ2aWNlRGVzY3JpcHRpb25Gcm9tREJDTWFwKGRiY01hcCAvKiwgY29uZmlnQ29udGV4dCovKTsNCi0gICAgICAgIGFzc2VydEVxdWFscygxLCBzZXJ2aWNlRGVzY0xpc3Quc2l6ZSgpKTsNCi0gICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzZXJ2aWNlRGVzYyA9IChTZXJ2aWNlRGVzY3JpcHRpb24pIHNlcnZpY2VEZXNjTGlzdC5nZXQoMCk7DQotDQotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2VEZXNjKTsNCi0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZW5kcG9pbnREZXNjID0gc2VydmljZURlc2MuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbnMoKVswXTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwoZW5kcG9pbnREZXNjKTsNCi0gICAgICAgIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlID0gZW5kcG9pbnREZXNjLmdldEF4aXNTZXJ2aWNlKCk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKGF4aXNTZXJ2aWNlKTsNCi0NCi0gICAgICAgIGFzc2VydE5vdE51bGwoYXhpc1NlcnZpY2UuZ2V0U2NoZW1hKCkpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShheGlzU2VydmljZS5nZXRTY2hlbWEoKS5zaXplKCkgPiAwKTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFRlc3RzIHRoYXQgd2hlbiB0aGUgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIHNldHMgdGhlICdSZWR1Y2UgV1NETCBDYWNoZScgcHJvcGVydHkNCi0gICAgICogdG8gZmFsc2UgdGhhdCB0aGUgQXhpcyByZXNvdXJjZXMgYXJlIG5vdCBjbGVhbmVkIHVwLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdFNlcnZlclNpZGVSZWxlYXNlX0V4cGxpY2l0X09GRigpIHsNCi0NCi0gICAgICAgIA0KLSAgICAgICAgU3RyaW5nIHdzZGxSZWxhdGl2ZUxvY2F0aW9uID0gInRlc3QtcmVzb3VyY2VzL3dzZGwvIjsNCi0gICAgICAgIFN0cmluZyB3c2RsRmlsZU5hbWUgPSAiQmluZGluZ05hbWVzcGFjZS53c2RsIjsNCi0gICAgICAgIFN0cmluZyB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL25vbmFub255bW91cy5jb21wbGV4dHlwZS50ZXN0Lm9yZyI7DQotICAgICAgICBTdHJpbmcgd3NkbExvY2F0aW9uID0gd3NkbFJlbGF0aXZlTG9jYXRpb24gKyB3c2RsRmlsZU5hbWU7DQotDQotICAgICAgICAvLyBCdWlsZCB1cCBhIERCQywgaW5jbHVkaW5nIHRoZSBXU0RMIERlZmluaXRpb24gYW5kIHRoZSBhbm5vdGF0aW9uIGluZm9ybWF0aW9uIGZvciANCi0gICAgICAgIC8vIHRoZSBpbXBsIGNsYXNzLg0KLSAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIGRiYyA9IG5ldyBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUoKTsNCi0gICAgICAgIGRiYy5nZXRQcm9wZXJ0aWVzKCkucHV0KENvbnN0YW50cy5Db25maWd1cmF0aW9uLlJFRFVDRV9XU0RMX01FTU9SWV9DQUNIRSwgZmFsc2UpOw0KLQ0KLSAgICAgICAgVVJMIHdzZGxVUkwgPSBEZXNjcmlwdGlvblRlc3RVdGlscy5nZXRXU0RMVVJMKHdzZGxGaWxlTmFtZSk7DQotICAgICAgICBEZWZpbml0aW9uIHdzZGxEZWZuID0gRGVzY3JpcHRpb25UZXN0VXRpbHMuY3JlYXRlV1NETERlZmluaXRpb24od3NkbFVSTCk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHdzZGxEZWZuKTsNCi0NCi0gICAgICAgIFdlYlNlcnZpY2VBbm5vdCB3ZWJTZXJ2aWNlQW5ub3QgPSBXZWJTZXJ2aWNlQW5ub3QuY3JlYXRlV2ViU2VydmljZUFubm90SW1wbCgpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh3ZWJTZXJ2aWNlQW5ub3QpOw0KLSAgICAgICAgd2ViU2VydmljZUFubm90LnNldFdzZGxMb2NhdGlvbih3c2RsTG9jYXRpb24pOw0KLSAgICAgICAgd2ViU2VydmljZUFubm90LnNldFRhcmdldE5hbWVzcGFjZSh0YXJnZXROYW1lc3BhY2UpOw0KLSAgICAgICAgd2ViU2VydmljZUFubm90LnNldFNlcnZpY2VOYW1lKCJFY2hvTWVzc2FnZVNlcnZpY2UiKTsNCi0gICAgICAgIHdlYlNlcnZpY2VBbm5vdC5zZXRQb3J0TmFtZSgiRWNob01lc3NhZ2VQb3J0Iik7DQotDQotICAgICAgICBNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSBtZGMgPSBuZXcgTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUoKTsNCi0gICAgICAgIG1kYy5zZXRNZXRob2ROYW1lKCJlY2hvTWVzc2FnZSIpOw0KLSAgICAgICAgbWRjLnNldFJldHVyblR5cGUoImphdmEubGFuZy5TdHJpbmciKTsNCi0NCi0gICAgICAgIFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlIHBkYzEgPSBuZXcgUGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGUoKTsNCi0gICAgICAgIHBkYzEuc2V0UGFyYW1ldGVyVHlwZSgiamF2YS5sYW5nLlN0cmluZyIpOw0KLQ0KLSAgICAgICAgbWRjLmFkZFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlKHBkYzEpOw0KLQ0KLSAgICAgICAgZGJjLmFkZE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlKG1kYyk7DQotICAgICAgICBkYmMuc2V0V2ViU2VydmljZUFubm90KHdlYlNlcnZpY2VBbm5vdCk7DQotICAgICAgICBkYmMuc2V0Q2xhc3NOYW1lKEJpbmRpbmdOU0ltcGwuY2xhc3MuZ2V0TmFtZSgpKTsNCi0gICAgICAgIGRiYy5zZXR3c2RsVVJMKHdzZGxVUkwpOw0KLQ0KLSAgICAgICAgSGFzaE1hcDxTdHJpbmcsIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZT4gZGJjTWFwID0NCi0gICAgICAgICAgICAgICAgbmV3IEhhc2hNYXA8U3RyaW5nLCBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGU+KCk7DQotICAgICAgICBkYmNNYXAucHV0KGRiYy5nZXRDbGFzc05hbWUoKSwgZGJjKTsNCi0NCi0gICAgICAgIExpc3Q8U2VydmljZURlc2NyaXB0aW9uPiBzZXJ2aWNlRGVzY0xpc3QgPQ0KLSAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkZhY3RvcnkuY3JlYXRlU2VydmljZURlc2NyaXB0aW9uRnJvbURCQ01hcChkYmNNYXAgLyosIGNvbmZpZ0NvbnRleHQqLyk7DQotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgc2VydmljZURlc2NMaXN0LnNpemUoKSk7DQotICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc2VydmljZURlc2MgPSAoU2VydmljZURlc2NyaXB0aW9uKSBzZXJ2aWNlRGVzY0xpc3QuZ2V0KDApOw0KLQ0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlRGVzYyk7DQotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVuZHBvaW50RGVzYyA9IHNlcnZpY2VEZXNjLmdldEVuZHBvaW50RGVzY3JpcHRpb25zKClbMF07DQotICAgICAgICBhc3NlcnROb3ROdWxsKGVuZHBvaW50RGVzYyk7DQotICAgICAgICBBeGlzU2VydmljZSBheGlzU2VydmljZSA9IGVuZHBvaW50RGVzYy5nZXRBeGlzU2VydmljZSgpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChheGlzU2VydmljZSk7DQotDQotICAgICAgICBhc3NlcnROb3ROdWxsKGF4aXNTZXJ2aWNlLmdldFNjaGVtYSgpKTsNCi0gICAgICAgIGFzc2VydFRydWUoYXhpc1NlcnZpY2UuZ2V0U2NoZW1hKCkuc2l6ZSgpID4gMCk7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJ2ZXJTaWRlUmVsZWFzZSgpIHsNCi0gICAgICAgIFN0cmluZyBheGlzMnhtbCA9IGJhc2VkaXIgKyAiL3Rlc3QtcmVzb3VyY2VzL2F4aXMyLnhtbCI7DQotICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0ID0gbnVsbDsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgY29uZmlnQ29udGV4dCA9DQotICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkuY3JlYXRlQ29uZmlndXJhdGlvbkNvbnRleHRGcm9tRmlsZVN5c3RlbShudWxsLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpczJ4bWwpOw0KLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGUpIHsNCi0gICAgICAgICAgICBmYWlsKCJHb3QgZmF1bHQgdHJ5aW5nIHRvIGNyZWF0ZSBjb25maWcgY29udGV4dCIgKyBlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGFzc2VydE5vdE51bGwoY29uZmlnQ29udGV4dCk7DQotICAgICAgICBTdHJpbmcgcGFyYW0gPQ0KLSAgICAgICAgICAgICAgICAoU3RyaW5nKSBjb25maWdDb250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRQYXJhbWV0ZXJWYWx1ZSgicmVkdWNlV1NETE1lbW9yeUNhY2hlIik7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHBhcmFtKTsNCi0NCi0gICAgICAgIFN0cmluZyB3c2RsUmVsYXRpdmVMb2NhdGlvbiA9ICJ0ZXN0LXJlc291cmNlcy93c2RsLyI7DQotICAgICAgICBTdHJpbmcgd3NkbEZpbGVOYW1lID0gIkJpbmRpbmdOYW1lc3BhY2Uud3NkbCI7DQotICAgICAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9ub25hbm9ueW1vdXMuY29tcGxleHR5cGUudGVzdC5vcmciOw0KLSAgICAgICAgU3RyaW5nIHdzZGxMb2NhdGlvbiA9IHdzZGxSZWxhdGl2ZUxvY2F0aW9uICsgd3NkbEZpbGVOYW1lOw0KLQ0KLSAgICAgICAgLy8gQnVpbGQgdXAgYSBEQkMsIGluY2x1ZGluZyB0aGUgV1NETCBEZWZpbml0aW9uIGFuZCB0aGUgYW5ub3RhdGlvbiBpbmZvcm1hdGlvbiBmb3IgDQotICAgICAgICAvLyB0aGUgaW1wbCBjbGFzcy4NCi0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBkYmMgPSBuZXcgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKGNvbmZpZ0NvbnRleHQpOw0KLQ0KLSAgICAgICAgVVJMIHdzZGxVUkwgPSBEZXNjcmlwdGlvblRlc3RVdGlscy5nZXRXU0RMVVJMKHdzZGxGaWxlTmFtZSk7DQotICAgICAgICBEZWZpbml0aW9uIHdzZGxEZWZuID0gRGVzY3JpcHRpb25UZXN0VXRpbHMuY3JlYXRlV1NETERlZmluaXRpb24od3NkbFVSTCk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHdzZGxEZWZuKTsNCi0NCi0gICAgICAgIFdlYlNlcnZpY2VBbm5vdCB3ZWJTZXJ2aWNlQW5ub3QgPSBXZWJTZXJ2aWNlQW5ub3QuY3JlYXRlV2ViU2VydmljZUFubm90SW1wbCgpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh3ZWJTZXJ2aWNlQW5ub3QpOw0KLSAgICAgICAgd2ViU2VydmljZUFubm90LnNldFdzZGxMb2NhdGlvbih3c2RsTG9jYXRpb24pOw0KLSAgICAgICAgd2ViU2VydmljZUFubm90LnNldFRhcmdldE5hbWVzcGFjZSh0YXJnZXROYW1lc3BhY2UpOw0KLSAgICAgICAgd2ViU2VydmljZUFubm90LnNldFNlcnZpY2VOYW1lKCJFY2hvTWVzc2FnZVNlcnZpY2UiKTsNCi0gICAgICAgIHdlYlNlcnZpY2VBbm5vdC5zZXRQb3J0TmFtZSgiRWNob01lc3NhZ2VQb3J0Iik7DQotDQotICAgICAgICBNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSBtZGMgPSBuZXcgTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUoKTsNCi0gICAgICAgIG1kYy5zZXRNZXRob2ROYW1lKCJlY2hvTWVzc2FnZSIpOw0KLSAgICAgICAgbWRjLnNldFJldHVyblR5cGUoImphdmEubGFuZy5TdHJpbmciKTsNCi0NCi0gICAgICAgIFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlIHBkYzEgPSBuZXcgUGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGUoKTsNCi0gICAgICAgIHBkYzEuc2V0UGFyYW1ldGVyVHlwZSgiamF2YS5sYW5nLlN0cmluZyIpOw0KLQ0KLSAgICAgICAgbWRjLmFkZFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlKHBkYzEpOw0KLQ0KLSAgICAgICAgZGJjLmFkZE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlKG1kYyk7DQotICAgICAgICBkYmMuc2V0V2ViU2VydmljZUFubm90KHdlYlNlcnZpY2VBbm5vdCk7DQotICAgICAgICBkYmMuc2V0Q2xhc3NOYW1lKEJpbmRpbmdOU0ltcGwuY2xhc3MuZ2V0TmFtZSgpKTsNCi0gICAgICAgIGRiYy5zZXR3c2RsVVJMKHdzZGxVUkwpOw0KLQ0KLSAgICAgICAgSGFzaE1hcDxTdHJpbmcsIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZT4gZGJjTWFwID0NCi0gICAgICAgICAgICAgICAgbmV3IEhhc2hNYXA8U3RyaW5nLCBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGU+KCk7DQotICAgICAgICBkYmNNYXAucHV0KGRiYy5nZXRDbGFzc05hbWUoKSwgZGJjKTsNCi0gICAgICAgIExpc3Q8U2VydmljZURlc2NyaXB0aW9uPiBzZXJ2aWNlRGVzY0xpc3QgPQ0KLSAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkZhY3RvcnkuY3JlYXRlU2VydmljZURlc2NyaXB0aW9uRnJvbURCQ01hcChkYmNNYXAsIGNvbmZpZ0NvbnRleHQpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHNlcnZpY2VEZXNjTGlzdC5zaXplKCkpOw0KLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNlcnZpY2VEZXNjID0gKFNlcnZpY2VEZXNjcmlwdGlvbikgc2VydmljZURlc2NMaXN0LmdldCgwKTsNCi0NCi0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZURlc2MpOw0KLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlbmRwb2ludERlc2MgPSBzZXJ2aWNlRGVzYy5nZXRFbmRwb2ludERlc2NyaXB0aW9ucygpWzBdOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChlbmRwb2ludERlc2MpOw0KLSAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UgPSBlbmRwb2ludERlc2MuZ2V0QXhpc1NlcnZpY2UoKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwoYXhpc1NlcnZpY2UpOw0KLQ0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChheGlzU2VydmljZS5nZXRTY2hlbWEoKSk7DQotICAgICAgICBhc3NlcnRUcnVlKGF4aXNTZXJ2aWNlLmdldFNjaGVtYSgpLnNpemUoKSA9PSAwKTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFRoaXMgdGVzdHMgdGhhdCB3aGVuIHRoZSAnUmVkdWNlIFdTREwgY2FjaGUnIHByb3BlcnR5IGlzIHNldCBvbiB0aGUgREJDIHRoYXQNCi0gICAgICogdGhlIEF4aXMgcmVzb3VyY2VzIGFyZSBjbGVhbmVkIHVwLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdFNlcnZlclNpZGVSZWxlYXNlREJDKCkgew0KLQ0KLSAgICAgICAgU3RyaW5nIHdzZGxSZWxhdGl2ZUxvY2F0aW9uID0gInRlc3QtcmVzb3VyY2VzL3dzZGwvIjsNCi0gICAgICAgIFN0cmluZyB3c2RsRmlsZU5hbWUgPSAiQmluZGluZ05hbWVzcGFjZS53c2RsIjsNCi0gICAgICAgIFN0cmluZyB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL25vbmFub255bW91cy5jb21wbGV4dHlwZS50ZXN0Lm9yZyI7DQotICAgICAgICBTdHJpbmcgd3NkbExvY2F0aW9uID0gd3NkbFJlbGF0aXZlTG9jYXRpb24gKyB3c2RsRmlsZU5hbWU7DQotDQotICAgICAgICAvLyBCdWlsZCB1cCBhIERCQywgaW5jbHVkaW5nIHRoZSBXU0RMIERlZmluaXRpb24gYW5kIHRoZSBhbm5vdGF0aW9uIGluZm9ybWF0aW9uIGZvciANCi0gICAgICAgIC8vIHRoZSBpbXBsIGNsYXNzLg0KLSAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIGRiYyA9IG5ldyBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUoKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gc2hvdWxkIGhhdmUgdGhlIHNhbWUgZWZmZWN0IGFzIHRoZSBwYXJhbWV0ZXIgc2V0IHRvICd0cnVlJyBpbiB0aGUgYXhpczIueG1sDQotICAgICAgICBkYmMuZ2V0UHJvcGVydGllcygpLnB1dChDb25zdGFudHMuQ29uZmlndXJhdGlvbi5SRURVQ0VfV1NETF9NRU1PUllfQ0FDSEUsIHRydWUpOw0KLQ0KLSAgICAgICAgVVJMIHdzZGxVUkwgPSBEZXNjcmlwdGlvblRlc3RVdGlscy5nZXRXU0RMVVJMKHdzZGxGaWxlTmFtZSk7DQotICAgICAgICBEZWZpbml0aW9uIHdzZGxEZWZuID0gRGVzY3JpcHRpb25UZXN0VXRpbHMuY3JlYXRlV1NETERlZmluaXRpb24od3NkbFVSTCk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHdzZGxEZWZuKTsNCi0NCi0gICAgICAgIFdlYlNlcnZpY2VBbm5vdCB3ZWJTZXJ2aWNlQW5ub3QgPSBXZWJTZXJ2aWNlQW5ub3QuY3JlYXRlV2ViU2VydmljZUFubm90SW1wbCgpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh3ZWJTZXJ2aWNlQW5ub3QpOw0KLSAgICAgICAgd2ViU2VydmljZUFubm90LnNldFdzZGxMb2NhdGlvbih3c2RsTG9jYXRpb24pOw0KLSAgICAgICAgd2ViU2VydmljZUFubm90LnNldFRhcmdldE5hbWVzcGFjZSh0YXJnZXROYW1lc3BhY2UpOw0KLSAgICAgICAgd2ViU2VydmljZUFubm90LnNldFNlcnZpY2VOYW1lKCJFY2hvTWVzc2FnZVNlcnZpY2UiKTsNCi0gICAgICAgIHdlYlNlcnZpY2VBbm5vdC5zZXRQb3J0TmFtZSgiRWNob01lc3NhZ2VQb3J0Iik7DQotDQotICAgICAgICBNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSBtZGMgPSBuZXcgTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUoKTsNCi0gICAgICAgIG1kYy5zZXRNZXRob2ROYW1lKCJlY2hvTWVzc2FnZSIpOw0KLSAgICAgICAgbWRjLnNldFJldHVyblR5cGUoImphdmEubGFuZy5TdHJpbmciKTsNCi0NCi0gICAgICAgIFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlIHBkYzEgPSBuZXcgUGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGUoKTsNCi0gICAgICAgIHBkYzEuc2V0UGFyYW1ldGVyVHlwZSgiamF2YS5sYW5nLlN0cmluZyIpOw0KLQ0KLSAgICAgICAgbWRjLmFkZFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlKHBkYzEpOw0KLQ0KLSAgICAgICAgZGJjLmFkZE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlKG1kYyk7DQotICAgICAgICBkYmMuc2V0V2ViU2VydmljZUFubm90KHdlYlNlcnZpY2VBbm5vdCk7DQotICAgICAgICBkYmMuc2V0Q2xhc3NOYW1lKEJpbmRpbmdOU0ltcGwuY2xhc3MuZ2V0TmFtZSgpKTsNCi0gICAgICAgIGRiYy5zZXR3c2RsVVJMKHdzZGxVUkwpOw0KLQ0KLSAgICAgICAgSGFzaE1hcDxTdHJpbmcsIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZT4gZGJjTWFwID0NCi0gICAgICAgICAgICAgICAgbmV3IEhhc2hNYXA8U3RyaW5nLCBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGU+KCk7DQotICAgICAgICBkYmNNYXAucHV0KGRiYy5nZXRDbGFzc05hbWUoKSwgZGJjKTsNCi0gICAgICAgIExpc3Q8U2VydmljZURlc2NyaXB0aW9uPiBzZXJ2aWNlRGVzY0xpc3QgPQ0KLSAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkZhY3RvcnkuY3JlYXRlU2VydmljZURlc2NyaXB0aW9uRnJvbURCQ01hcChkYmNNYXApOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHNlcnZpY2VEZXNjTGlzdC5zaXplKCkpOw0KLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNlcnZpY2VEZXNjID0gKFNlcnZpY2VEZXNjcmlwdGlvbikgc2VydmljZURlc2NMaXN0LmdldCgwKTsNCi0NCi0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZURlc2MpOw0KLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlbmRwb2ludERlc2MgPSBzZXJ2aWNlRGVzYy5nZXRFbmRwb2ludERlc2NyaXB0aW9ucygpWzBdOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChlbmRwb2ludERlc2MpOw0KLSAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UgPSBlbmRwb2ludERlc2MuZ2V0QXhpc1NlcnZpY2UoKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwoYXhpc1NlcnZpY2UpOw0KLQ0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChheGlzU2VydmljZS5nZXRTY2hlbWEoKSk7DQotICAgICAgICBhc3NlcnRUcnVlKGF4aXNTZXJ2aWNlLmdldFNjaGVtYSgpLnNpemUoKSA9PSAwKTsNCi0gICAgfQ0KLSAgICANCi0gICAgQFdlYlNlcnZpY2Uoc2VydmljZU5hbWUgPSAiRWNob01lc3NhZ2VTZXJ2aWNlIiwgcG9ydE5hbWUgPSAiRWNob01lc3NhZ2VQb3J0IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9ub25hbm9ueW1vdXMuY29tcGxleHR5cGUudGVzdC5vcmciLCB3c2RsTG9jYXRpb24gPSAidGVzdC1yZXNvdXJjZXMvd3NkbC9CaW5kaW5nTmFtZXNwYWNlLndzZGwiKQ0KLSAgICBwdWJsaWMgY2xhc3MgQmluZGluZ05TSW1wbCB7DQotICAgICAgICBwdWJsaWMgU3RyaW5nIGVjaG9NZXNzYWdlKFN0cmluZyBhcmcpIHsNCi0gICAgICAgICAgICByZXR1cm4gYXJnOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9TZXJ2aWNlQW5ub3RhdGlvblRlc3RzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vU2VydmljZUFubm90YXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjY4Nzg5Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9TZXJ2aWNlQW5ub3RhdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouQmFzaWNDb25maWd1cmF0b3I7Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKLWltcG9ydCBqYXZheC54bWwud3MuUHJvdmlkZXI7Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VQcm92aWRlcjsKLQotcHVibGljIGNsYXNzIFNlcnZpY2VBbm5vdGF0aW9uVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgc3RhdGljIHsKLSAgICAgICAgLy8gTm90ZSB5b3Ugd2lsbCBwcm9iYWJseSBuZWVkIHRvIGluY3JlYXNlIHRoZSBqYXZhIGhlYXAgc2l6ZSwgZm9yIGV4YW1wbGUKLSAgICAgICAgLy8gLVhteDUxMm0uICBUaGlzIGNhbiBiZSBkb25lIGJ5IHNldHRpbmcgbWF2ZW4uanVuaXQuanZtYXJncyBpbiBwcm9qZWN0LnByb3BlcnRpZXMuCi0gICAgICAgIC8vIFRvIGNoYW5nZSB0aGUgc2V0dGluZ3MsIGVkaXQgdGhlIGxvZzRqLnByb3BlcnR5IGZpbGUKLSAgICAgICAgLy8gaW4gdGhlIHRlc3QtcmVzb3VyY2VzIGRpcmVjdG9yeS4KLSAgICAgICAgQmFzaWNDb25maWd1cmF0b3IuY29uZmlndXJlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFdlYlNlcnZpY2VEZWZhdWx0cygpIHsKLSAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9ICJXZWJTZXJ2aWNlRGVmYXVsdFRlc3QiOwotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uSmF2YSB0ZXN0RW5kcG9pbnREZXNjID0gZ2V0RW5kcG9pbnREZXNjKFdlYlNlcnZpY2VEZWZhdWx0VGVzdC5jbGFzcyk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwodGVzdEVuZHBvaW50RGVzYy5nZXRBbm5vV2ViU2VydmljZSgpKTsKLSAgICAgICAgYXNzZXJ0TnVsbCh0ZXN0RW5kcG9pbnREZXNjLmdldEFubm9XZWJTZXJ2aWNlUHJvdmlkZXIoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhjbGFzc05hbWUsIHRlc3RFbmRwb2ludERlc2MuZ2V0QW5ub1dlYlNlcnZpY2VOYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIHRlc3RFbmRwb2ludERlc2MuZ2V0QW5ub1dlYlNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJodHRwOi8vZGVzY3JpcHRpb24uamF4d3MuYXhpczIuYXBhY2hlLm9yZy8iLAotICAgICAgICAgICAgICAgICAgICAgdGVzdEVuZHBvaW50RGVzYy5nZXRBbm5vV2ViU2VydmljZVRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNsYXNzTmFtZSArICJTZXJ2aWNlIiwgdGVzdEVuZHBvaW50RGVzYy5nZXRBbm5vV2ViU2VydmljZVNlcnZpY2VOYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoY2xhc3NOYW1lICsgIlBvcnQiLCB0ZXN0RW5kcG9pbnREZXNjLmdldEFubm9XZWJTZXJ2aWNlUG9ydE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiIiwgdGVzdEVuZHBvaW50RGVzYy5nZXRBbm5vV2ViU2VydmljZVdTRExMb2NhdGlvbigpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0V2ViU2VydmljZVByb3ZpZGVyRGVmYXVsdHMoKSB7Ci0gICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSAiV2ViU2VydmljZVByb3ZpZGVyRGVmYXVsdFRlc3QiOwotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uSmF2YSB0ZXN0RW5kcG9pbnREZXNjID0KLSAgICAgICAgICAgICAgICBnZXRFbmRwb2ludERlc2MoV2ViU2VydmljZVByb3ZpZGVyRGVmYXVsdFRlc3QuY2xhc3MpOwotICAgICAgICBhc3NlcnROdWxsKHRlc3RFbmRwb2ludERlc2MuZ2V0QW5ub1dlYlNlcnZpY2UoKSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwodGVzdEVuZHBvaW50RGVzYy5nZXRBbm5vV2ViU2VydmljZVByb3ZpZGVyKCkpOwotICAgICAgICAvLyBuYW1lIGVsZW1lbnQgbm90IGFsbG93ZWQgb24gV2ViU2VydmljZVByb3ZpZGVyCi0gICAgICAgIGFzc2VydEVxdWFscygiIiwgdGVzdEVuZHBvaW50RGVzYy5nZXRBbm5vV2ViU2VydmljZU5hbWUoKSk7Ci0gICAgICAgIC8vIEVuZHBvaW50SW50ZXJmYWNlIGVsZW1lbnQgbm90IGFsbG93ZWQgb24gV2ViU2VydmljZVByb3ZpZGVyCi0gICAgICAgIGFzc2VydEVxdWFscygiIiwgdGVzdEVuZHBvaW50RGVzYy5nZXRBbm5vV2ViU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly9kZXNjcmlwdGlvbi5qYXh3cy5heGlzMi5hcGFjaGUub3JnLyIsCi0gICAgICAgICAgICAgICAgICAgICB0ZXN0RW5kcG9pbnREZXNjLmdldEFubm9XZWJTZXJ2aWNlVGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoY2xhc3NOYW1lICsgIlNlcnZpY2UiLCB0ZXN0RW5kcG9pbnREZXNjLmdldEFubm9XZWJTZXJ2aWNlU2VydmljZU5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhjbGFzc05hbWUgKyAiUG9ydCIsIHRlc3RFbmRwb2ludERlc2MuZ2V0QW5ub1dlYlNlcnZpY2VQb3J0TmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCB0ZXN0RW5kcG9pbnREZXNjLmdldEFubm9XZWJTZXJ2aWNlV1NETExvY2F0aW9uKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RXZWJTZXJ2aWNlTmFtZSgpIHsKLSAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9ICJXZWJTZXJ2aWNlTmFtZSI7Ci0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb25KYXZhIHRlc3RFbmRwb2ludERlc2MgPSBnZXRFbmRwb2ludERlc2MoV2ViU2VydmljZU5hbWUuY2xhc3MpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHRlc3RFbmRwb2ludERlc2MuZ2V0QW5ub1dlYlNlcnZpY2UoKSk7Ci0gICAgICAgIGFzc2VydE51bGwodGVzdEVuZHBvaW50RGVzYy5nZXRBbm5vV2ViU2VydmljZVByb3ZpZGVyKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIldlYlNlcnZpY2VOYW1lRWxlbWVudCIsIHRlc3RFbmRwb2ludERlc2MuZ2V0QW5ub1dlYlNlcnZpY2VOYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIHRlc3RFbmRwb2ludERlc2MuZ2V0QW5ub1dlYlNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJodHRwOi8vZGVzY3JpcHRpb24uamF4d3MuYXhpczIuYXBhY2hlLm9yZy8iLAotICAgICAgICAgICAgICAgICAgICAgdGVzdEVuZHBvaW50RGVzYy5nZXRBbm5vV2ViU2VydmljZVRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgLy8gTm90ZSB0aGF0IHBlciBKU1ItMTgxIE1SIFNlYyA0LjEgcGcgMTYsIHRoZSBwb3J0TmFtZSB1c2VzIFdlYlNlcnZpY2UubmFtZSwgYnV0IHNlcnZpY2VOYW1lIGRvZXMgbm90IQotICAgICAgICBhc3NlcnRFcXVhbHMoY2xhc3NOYW1lICsgIlNlcnZpY2UiLCB0ZXN0RW5kcG9pbnREZXNjLmdldEFubm9XZWJTZXJ2aWNlU2VydmljZU5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiV2ViU2VydmljZU5hbWVFbGVtZW50UG9ydCIsIHRlc3RFbmRwb2ludERlc2MuZ2V0QW5ub1dlYlNlcnZpY2VQb3J0TmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCB0ZXN0RW5kcG9pbnREZXNjLmdldEFubm9XZWJTZXJ2aWNlV1NETExvY2F0aW9uKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RXZWJTZXJ2aWNlTmFtZUFuZFBvcnQoKSB7Ci0gICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSAiV2ViU2VydmljZU5hbWVBbmRQb3J0IjsKLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbkphdmEgdGVzdEVuZHBvaW50RGVzYyA9IGdldEVuZHBvaW50RGVzYyhXZWJTZXJ2aWNlTmFtZUFuZFBvcnQuY2xhc3MpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHRlc3RFbmRwb2ludERlc2MuZ2V0QW5ub1dlYlNlcnZpY2UoKSk7Ci0gICAgICAgIGFzc2VydE51bGwodGVzdEVuZHBvaW50RGVzYy5nZXRBbm5vV2ViU2VydmljZVByb3ZpZGVyKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIldlYlNlcnZpY2VOYW1lQW5kUG9ydEVsZW1lbnQiLCB0ZXN0RW5kcG9pbnREZXNjLmdldEFubm9XZWJTZXJ2aWNlTmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCB0ZXN0RW5kcG9pbnREZXNjLmdldEFubm9XZWJTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiaHR0cDovL2Rlc2NyaXB0aW9uLmpheHdzLmF4aXMyLmFwYWNoZS5vcmcvIiwKLSAgICAgICAgICAgICAgICAgICAgIHRlc3RFbmRwb2ludERlc2MuZ2V0QW5ub1dlYlNlcnZpY2VUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgIC8vIE5vdGUgdGhhdCBwZXIgSlNSLTE4MSBNUiBTZWMgNC4xIHBnIDE2LCB0aGUgcG9ydE5hbWUgdXNlcyBXZWJTZXJ2aWNlLm5hbWUsIGJ1dCBzZXJ2aWNlTmFtZSBkb2VzIG5vdCEKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNsYXNzTmFtZSArICJTZXJ2aWNlIiwgdGVzdEVuZHBvaW50RGVzYy5nZXRBbm5vV2ViU2VydmljZVNlcnZpY2VOYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIldlYlNlcnZpY2VQb3J0TmFtZSIsIHRlc3RFbmRwb2ludERlc2MuZ2V0QW5ub1dlYlNlcnZpY2VQb3J0TmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCB0ZXN0RW5kcG9pbnREZXNjLmdldEFubm9XZWJTZXJ2aWNlV1NETExvY2F0aW9uKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RXZWJTZXJ2aWNlQWxsKCkgewotICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gIldlYlNlcnZpY2VBbGwiOwotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uSmF2YSB0ZXN0RW5kcG9pbnREZXNjID0gZ2V0RW5kcG9pbnREZXNjKFdlYlNlcnZpY2VBbGwuY2xhc3MpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHRlc3RFbmRwb2ludERlc2MuZ2V0QW5ub1dlYlNlcnZpY2UoKSk7Ci0gICAgICAgIGFzc2VydE51bGwodGVzdEVuZHBvaW50RGVzYy5nZXRBbm5vV2ViU2VydmljZVByb3ZpZGVyKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIldlYlNlcnZpY2VBbGwiLCB0ZXN0RW5kcG9pbnREZXNjLmdldEFubm9XZWJTZXJ2aWNlTmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLk15RW5kcG9pbnRJbnRlcmZhY2UiLAotICAgICAgICAgICAgICAgICAgICAgdGVzdEVuZHBvaW50RGVzYy5nZXRBbm5vV2ViU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly9uYW1lc3BhY2UudGFyZ2V0LmpheHdzLmF4aXMyLmFwYWNoZS5vcmcvIiwKLSAgICAgICAgICAgICAgICAgICAgIHRlc3RFbmRwb2ludERlc2MuZ2V0QW5ub1dlYlNlcnZpY2VUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiV2ViU2VydmljZUFsbFNlcnZpY2VFbGVtZW50IiwKLSAgICAgICAgICAgICAgICAgICAgIHRlc3RFbmRwb2ludERlc2MuZ2V0QW5ub1dlYlNlcnZpY2VTZXJ2aWNlTmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJXZWJTZXJ2aWNlQWxsUG9ydEVsZW1lbnQiLCB0ZXN0RW5kcG9pbnREZXNjLmdldEFubm9XZWJTZXJ2aWNlUG9ydE5hbWUoKSk7Ci0gICAgICAgIC8vIFRPRE86IFdoZW4gdGhlIEphdmFSZWZsZWN0aW9uLXRvLURCQyBjb252ZXJ0ZXIgaXMgZml4ZWQgdG8gcmVhZCBpbiBXU0RMLCB0aGVuIGFkZCB0aGlzIGNoZWNrIGJhY2sgaW4uCi0vLyAgICAgICAgYXNzZXJ0RXF1YWxzKCJodHRwOi8vbXkud3NkbC5sb2NhdGlvbi9mb28ud3NkbCIsIHRlc3RFbmRwb2ludERlc2MuZ2V0QW5ub1dlYlNlcnZpY2VXU0RMTG9jYXRpb24oKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFdlYlNlcnZpY2VQcm92aWRlckFsbCgpIHsKLSAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9ICJXZWJTZXJ2aWNlUHJvdmlkZXJBbGwiOwotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uSmF2YSB0ZXN0RW5kcG9pbnREZXNjID0gZ2V0RW5kcG9pbnREZXNjKFdlYlNlcnZpY2VQcm92aWRlckFsbC5jbGFzcyk7Ci0gICAgICAgIGFzc2VydE51bGwodGVzdEVuZHBvaW50RGVzYy5nZXRBbm5vV2ViU2VydmljZSgpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh0ZXN0RW5kcG9pbnREZXNjLmdldEFubm9XZWJTZXJ2aWNlUHJvdmlkZXIoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiIiwgdGVzdEVuZHBvaW50RGVzYy5nZXRBbm5vV2ViU2VydmljZU5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiIiwgdGVzdEVuZHBvaW50RGVzYy5nZXRBbm5vV2ViU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly9uYW1lc3BhY2UudGFyZ2V0LmpheHdzLmF4aXMyLmFwYWNoZS5vcmcvIiwKLSAgICAgICAgICAgICAgICAgICAgIHRlc3RFbmRwb2ludERlc2MuZ2V0QW5ub1dlYlNlcnZpY2VUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiV2ViU2VydmljZVByb3ZpZGVyQWxsU2VydmljZUVsZW1lbnQiLAotICAgICAgICAgICAgICAgICAgICAgdGVzdEVuZHBvaW50RGVzYy5nZXRBbm5vV2ViU2VydmljZVNlcnZpY2VOYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIldlYlNlcnZpY2VQcm92aWRlckFsbFBvcnRFbGVtZW50IiwKLSAgICAgICAgICAgICAgICAgICAgIHRlc3RFbmRwb2ludERlc2MuZ2V0QW5ub1dlYlNlcnZpY2VQb3J0TmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJodHRwOi8vbXkud3NkbC5vdGhlci5sb2NhdGlvbi9mb28ud3NkbCIsCi0gICAgICAgICAgICAgICAgICAgICB0ZXN0RW5kcG9pbnREZXNjLmdldEFubm9XZWJTZXJ2aWNlV1NETExvY2F0aW9uKCkpOwotCi0gICAgfQotCi0gICAgLyoKLSAgICAqIE1ldGhvZCB0byByZXR1cm4gdGhlIGVuZHBvaW50IGludGVyZmFjZSBkZXNjcmlwdGlvbiBmb3IgYSBnaXZlbiBpbXBsZW1lbnRhdGlvbiBjbGFzcy4KLSAgICAqLwotICAgIHByaXZhdGUgRW5kcG9pbnREZXNjcmlwdGlvbkphdmEgZ2V0RW5kcG9pbnREZXNjKENsYXNzIGltcGxlbWVudGF0aW9uQ2xhc3MpIHsKLSAgICAgICAgLy8gVXNlIHRoZSBkZXNjcmlwdGlvbiBmYWN0b3J5IGRpcmVjdGx5OyB0aGlzIHdpbGwgYmUgZG9uZSB3aXRoaW4gdGhlIEpBWC1XUyBydW50aW1lCi0gICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzZXJ2aWNlRGVzYyA9Ci0gICAgICAgICAgICAgICAgRGVzY3JpcHRpb25GYWN0b3J5LmNyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbihpbXBsZW1lbnRhdGlvbkNsYXNzKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlRGVzYyk7Ci0KLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbltdIGVuZHBvaW50RGVzYyA9IHNlcnZpY2VEZXNjLmdldEVuZHBvaW50RGVzY3JpcHRpb25zKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZW5kcG9pbnREZXNjKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGVuZHBvaW50RGVzYy5sZW5ndGgpOwotCi0gICAgICAgIC8vIFRPRE86IEhvdyB3aWxsIHRoZSBKQVgtV1MgZGlzcGF0Y2hlciBnZXQgdGhlIGFwcHJvcHJpYXRlIHBvcnQgKGkuZS4gZW5kcG9pbnQpPyAgQ3VycmVudGx5IGFzc3VtZXMgWzBdCi0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gdGVzdEVuZHBvaW50RGVzYyA9IGVuZHBvaW50RGVzY1swXTsKLSAgICAgICAgcmV0dXJuIChFbmRwb2ludERlc2NyaXB0aW9uSmF2YSl0ZXN0RW5kcG9pbnREZXNjOwotICAgIH0KLX0KLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIFdlYlNlcnZpY2UgRGVmYXVsdHMgdGVzdCBpbXBsCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1AV2ViU2VydmljZSgpCi1jbGFzcyBXZWJTZXJ2aWNlRGVmYXVsdFRlc3QgewotCi19Ci0KLUBXZWJTZXJ2aWNlUHJvdmlkZXIoKQotY2xhc3MgV2ViU2VydmljZVByb3ZpZGVyRGVmYXVsdFRlc3QgaW1wbGVtZW50cyBQcm92aWRlcjxTdHJpbmc+IHsKLSAgICBwdWJsaWMgV2ViU2VydmljZVByb3ZpZGVyRGVmYXVsdFRlc3QoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBpbnZva2UoU3RyaW5nIG9iaikgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLX0KLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIFdlYlNlcnZpY2UgTmFtZSB0ZXN0IGltcGwKLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBOb3RlIHRoYXQgbmFtZSBpcyBvbmx5IGFsbG93ZWQgb24gQFdlYlNlcnZpY2U7IG5vdCBAV2ViU2VydmljZVByb3ZpZGVyCi0KLUBXZWJTZXJ2aWNlKG5hbWUgPSAiV2ViU2VydmljZU5hbWVFbGVtZW50IikKLWNsYXNzIFdlYlNlcnZpY2VOYW1lIHsKLQotfQotCi1AV2ViU2VydmljZShuYW1lID0gIldlYlNlcnZpY2VOYW1lQW5kUG9ydEVsZW1lbnQiLCBwb3J0TmFtZSA9ICJXZWJTZXJ2aWNlUG9ydE5hbWUiKQotY2xhc3MgV2ViU2VydmljZU5hbWVBbmRQb3J0IHsKLQotfQotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gV2ViU2VydmljZSBBbGwgdGVzdCBpbXBsCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gVE9ETzogV2hlbiB0aGUgSmF2YVJlZmxlY3Rpb24tdG8tREJDIGNvbnZlcnRlciBpcyBmaXhlZCB0byByZWFkIGluIHRoZSBXU0RMLCB0aGVuIHNwZWNpZnkgYSB2YWxpZCBXU0RMIGZpbGUgaGVyZQotCi1AV2ViU2VydmljZSgKLSAgICAgICAgZW5kcG9pbnRJbnRlcmZhY2UgPSAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5NeUVuZHBvaW50SW50ZXJmYWNlIiwKLSAgICAgICAgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9uYW1lc3BhY2UudGFyZ2V0LmpheHdzLmF4aXMyLmFwYWNoZS5vcmcvIiwKLSAgICAgICAgc2VydmljZU5hbWUgPSAiV2ViU2VydmljZUFsbFNlcnZpY2VFbGVtZW50IiwKLSAgICAgICAgcG9ydE5hbWUgPSAiV2ViU2VydmljZUFsbFBvcnRFbGVtZW50IiAvKiwKLSAgICAgICAgd3NkbExvY2F0aW9uPSJodHRwOi8vbXkud3NkbC5sb2NhdGlvbi9mb28ud3NkbCIgKi8pCi1jbGFzcyBXZWJTZXJ2aWNlQWxsIHsKLQotfQotCi1AV2ViU2VydmljZSgpCi1pbnRlcmZhY2UgTXlFbmRwb2ludEludGVyZmFjZSB7Ci0KLX0KLQotQFdlYlNlcnZpY2VQcm92aWRlcigKLSAgICAgICAgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9uYW1lc3BhY2UudGFyZ2V0LmpheHdzLmF4aXMyLmFwYWNoZS5vcmcvIiwKLSAgICAgICAgc2VydmljZU5hbWUgPSAiV2ViU2VydmljZVByb3ZpZGVyQWxsU2VydmljZUVsZW1lbnQiLAotICAgICAgICBwb3J0TmFtZSA9ICJXZWJTZXJ2aWNlUHJvdmlkZXJBbGxQb3J0RWxlbWVudCIsCi0gICAgICAgIHdzZGxMb2NhdGlvbiA9ICJodHRwOi8vbXkud3NkbC5vdGhlci5sb2NhdGlvbi9mb28ud3NkbCIpCi1jbGFzcyBXZWJTZXJ2aWNlUHJvdmlkZXJBbGwgaW1wbGVtZW50cyBQcm92aWRlcjxTdHJpbmc+IHsKLSAgICBwdWJsaWMgV2ViU2VydmljZVByb3ZpZGVyQWxsKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgaW52b2tlKFN0cmluZyBvYmopIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vVmFsaWRhdGVTZXJ2aWNlSW1wbFRlc3RzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vVmFsaWRhdGVTZXJ2aWNlSW1wbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkYjdhNWQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL1ZhbGlkYXRlU2VydmljZUltcGxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5NZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuY29udmVydGVyLkphdmFDbGFzc1RvREJDQ29udmVydGVyOwotCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWxpZGF0ZVNlcnZpY2VJbXBsVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRTZXJ2aWNlSW1wbCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIENsYXNzIHNlcnZpY2VJbXBsQ2xhc3MgPSBTZXJ2aWNlSW1wbC5jbGFzczsKLSAgICAgICAgICAgIEphdmFDbGFzc1RvREJDQ29udmVydGVyIGNvbnZlcnRlciA9IG5ldyBKYXZhQ2xhc3NUb0RCQ0NvbnZlcnRlcihzZXJ2aWNlSW1wbENsYXNzKTsKLSAgICAgICAgICAgIEhhc2hNYXA8U3RyaW5nLCBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGU+IGRiY01hcCA9IGNvbnZlcnRlci5wcm9kdWNlREJDKCk7Ci0gICAgICAgICAgICBMaXN0PFNlcnZpY2VEZXNjcmlwdGlvbj4gc2VydmljZURlc2NMaXN0ID0gIERlc2NyaXB0aW9uRmFjdG9yeS5jcmVhdGVTZXJ2aWNlRGVzY3JpcHRpb25Gcm9tREJDTWFwKGRiY01hcCk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2VEZXNjTGlzdCk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgc2VydmljZURlc2NMaXN0LnNpemUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgZmFpbCgiQ2F1Z2h0IHVuZXhwZWN0ZWQgZXhjZXB0aW9uIiArIGUpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RNaXNzaW5nTWV0aG9kcygpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIENsYXNzIHNlcnZpY2VJbXBsQ2xhc3MgPSBNaXNzaW5nTWV0aG9kc0ltcGwuY2xhc3M7Ci0gICAgICAgICAgICBKYXZhQ2xhc3NUb0RCQ0NvbnZlcnRlciBjb252ZXJ0ZXIgPSBuZXcgSmF2YUNsYXNzVG9EQkNDb252ZXJ0ZXIoc2VydmljZUltcGxDbGFzcyk7Ci0gICAgICAgICAgICBIYXNoTWFwPFN0cmluZywgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlPiBkYmNNYXAgPSBjb252ZXJ0ZXIucHJvZHVjZURCQygpOwotICAgICAgICAgICAgTGlzdDxTZXJ2aWNlRGVzY3JpcHRpb24+IHNlcnZpY2VEZXNjTGlzdCA9ICBEZXNjcmlwdGlvbkZhY3RvcnkuY3JlYXRlU2VydmljZURlc2NyaXB0aW9uRnJvbURCQ01hcChkYmNNYXApOwotICAgICAgICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgY2F1c2VkIGV4Y2VwdGlvbiIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gRXhwZWN0ZWQgcGF0aAotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkVGhyb3dzKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgQ2xhc3Mgc2VydmljZUltcGxDbGFzcyA9IEludmFsaWRUaHJvd3NJbXBsLmNsYXNzOwotICAgICAgICAgICAgSmF2YUNsYXNzVG9EQkNDb252ZXJ0ZXIgY29udmVydGVyID0gbmV3IEphdmFDbGFzc1RvREJDQ29udmVydGVyKHNlcnZpY2VJbXBsQ2xhc3MpOwotICAgICAgICAgICAgSGFzaE1hcDxTdHJpbmcsIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZT4gZGJjTWFwID0gY29udmVydGVyLnByb2R1Y2VEQkMoKTsKLSAgICAgICAgICAgIExpc3Q8U2VydmljZURlc2NyaXB0aW9uPiBzZXJ2aWNlRGVzY0xpc3QgPSAgRGVzY3JpcHRpb25GYWN0b3J5LmNyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbkZyb21EQkNNYXAoZGJjTWFwKTsKLSAgICAgICAgICAgIGZhaWwoIlNob3VsZCBoYXZlIGNhdXNlZCBleGNlcHRpb24iKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIEV4cGVjdGVkIHBhdGgKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWlzbWF0Y2hlZFJldHVyblR5cGVzREJDKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgQ2xhc3Mgc2VydmljZUltcGxDbGFzcyA9IFNlcnZpY2VJbXBsLmNsYXNzOwotICAgICAgICAgICAgSmF2YUNsYXNzVG9EQkNDb252ZXJ0ZXIgY29udmVydGVyID0gbmV3IEphdmFDbGFzc1RvREJDQ29udmVydGVyKHNlcnZpY2VJbXBsQ2xhc3MpOwotICAgICAgICAgICAgSGFzaE1hcDxTdHJpbmcsIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZT4gZGJjTWFwID0gY29udmVydGVyLnByb2R1Y2VEQkMoKTsKLSAgICAgICAgICAgIC8vIFNldCB0aGUgcmV0dXJuIHR5cGVzIGZvciBvbmUgb2YgdGhlIG1ldGhvZHMgb24gdGhlIGltcGwgY2xhc3MgdG8gbWlzbWF0Y2ggdGhlIFNFSQotICAgICAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIGltcGxEQkMgPSBkYmNNYXAuZ2V0KCJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLlNlcnZpY2VJbXBsIik7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGltcGxEQkMpOwotICAgICAgICAgICAgTGlzdDxNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZT4gbTFNRENMaXN0ID0gaW1wbERCQy5nZXRNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSgibWV0aG9kMSIpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChtMU1EQ0xpc3QpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG0xTURDTGlzdC5zaXplKCkpOwotICAgICAgICAgICAgTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUgbTFNREMgPSBtMU1EQ0xpc3QuZ2V0KDApOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuU3RyaW5nIiwgbTFNREMuZ2V0UmV0dXJuVHlwZSgpKTsKLSAgICAgICAgICAgIG0xTURDLnNldFJldHVyblR5cGUoImxhdmEubGFuZy5JbnRlZ2VyIik7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIExpc3Q8U2VydmljZURlc2NyaXB0aW9uPiBzZXJ2aWNlRGVzY0xpc3QgPSAgRGVzY3JpcHRpb25GYWN0b3J5LmNyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbkZyb21EQkNNYXAoZGJjTWFwKTsKLSAgICAgICAgICAgIGZhaWwoIlNob3VsZCBoYXZlIGNhdXNlZCBleGNlcHRpb24iKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIEV4cGVjdGVkIHBhdGgKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNaXNtYXRjaGVkUmV0dXJuVHlwZXMoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBDbGFzcyBzZXJ2aWNlSW1wbENsYXNzID0gTWlzbWF0Y2hlZFJldHVyblR5cGVzSW1wbC5jbGFzczsKLSAgICAgICAgICAgIEphdmFDbGFzc1RvREJDQ29udmVydGVyIGNvbnZlcnRlciA9IG5ldyBKYXZhQ2xhc3NUb0RCQ0NvbnZlcnRlcihzZXJ2aWNlSW1wbENsYXNzKTsKLSAgICAgICAgICAgIEhhc2hNYXA8U3RyaW5nLCBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGU+IGRiY01hcCA9IGNvbnZlcnRlci5wcm9kdWNlREJDKCk7Ci0gICAgICAgICAgICBMaXN0PFNlcnZpY2VEZXNjcmlwdGlvbj4gc2VydmljZURlc2NMaXN0ID0gIERlc2NyaXB0aW9uRmFjdG9yeS5jcmVhdGVTZXJ2aWNlRGVzY3JpcHRpb25Gcm9tREJDTWFwKGRiY01hcCk7Ci0gICAgICAgICAgICBmYWlsKCJTaG91bGQgaGF2ZSBjYXVzZWQgZXhjZXB0aW9uIik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBFeHBlY3RlZCBwYXRoCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWlzbWF0Y2hlZFBhcmFtZXRlck51bWJlcigpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIENsYXNzIHNlcnZpY2VJbXBsQ2xhc3MgPSBNaXNtYXRjaGVkUGFyYW1ldGVyTnVtYmVySW1wbC5jbGFzczsKLSAgICAgICAgICAgIEphdmFDbGFzc1RvREJDQ29udmVydGVyIGNvbnZlcnRlciA9IG5ldyBKYXZhQ2xhc3NUb0RCQ0NvbnZlcnRlcihzZXJ2aWNlSW1wbENsYXNzKTsKLSAgICAgICAgICAgIEhhc2hNYXA8U3RyaW5nLCBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGU+IGRiY01hcCA9IGNvbnZlcnRlci5wcm9kdWNlREJDKCk7Ci0gICAgICAgICAgICBMaXN0PFNlcnZpY2VEZXNjcmlwdGlvbj4gc2VydmljZURlc2NMaXN0ID0gIERlc2NyaXB0aW9uRmFjdG9yeS5jcmVhdGVTZXJ2aWNlRGVzY3JpcHRpb25Gcm9tREJDTWFwKGRiY01hcCk7Ci0gICAgICAgICAgICBmYWlsKCJTaG91bGQgaGF2ZSBjYXVzZWQgZXhjZXB0aW9uIik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBFeHBlY3RlZCBwYXRoCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWlzbWF0Y2hlZFBhcmFtZXRlclR5cGVzKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgQ2xhc3Mgc2VydmljZUltcGxDbGFzcyA9IE1pc21hdGNoZWRQYXJhbWV0ZXJUeXBlc0ltcGwuY2xhc3M7Ci0gICAgICAgICAgICBKYXZhQ2xhc3NUb0RCQ0NvbnZlcnRlciBjb252ZXJ0ZXIgPSBuZXcgSmF2YUNsYXNzVG9EQkNDb252ZXJ0ZXIoc2VydmljZUltcGxDbGFzcyk7Ci0gICAgICAgICAgICBIYXNoTWFwPFN0cmluZywgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlPiBkYmNNYXAgPSBjb252ZXJ0ZXIucHJvZHVjZURCQygpOwotICAgICAgICAgICAgTGlzdDxTZXJ2aWNlRGVzY3JpcHRpb24+IHNlcnZpY2VEZXNjTGlzdCA9ICBEZXNjcmlwdGlvbkZhY3RvcnkuY3JlYXRlU2VydmljZURlc2NyaXB0aW9uRnJvbURCQ01hcChkYmNNYXApOwotICAgICAgICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgY2F1c2VkIGV4Y2VwdGlvbiIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gRXhwZWN0ZWQgcGF0aAotICAgICAgICB9Ci0gICAgfQotCi19Ci0KLUBXZWJTZXJ2aWNlCi1pbnRlcmZhY2UgRW5kcG9pbnRJbnRlcmZhY2UgewotICAgIHB1YmxpYyBTdHJpbmcgbWV0aG9kMShpbnQgcGFyYW0xLCBpbnQgcGFyYW0yKSB0aHJvd3MgTXlFeGNlcHRpb247Ci0gICAgCi0gICAgcHVibGljIHZvaWQgbWV0aG9kMihTdHJpbmcgcGFyYW0xKSB0aHJvd3MgTXlFeGNlcHRpb247Ci0gICAgCi0gICAgcHVibGljIGludCBtZXRob2QzKCk7Ci19Ci0KLWNsYXNzIE15RXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKLSAgICAKLX0KLQotQFdlYlNlcnZpY2UgKGVuZHBvaW50SW50ZXJmYWNlID0gIm9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRW5kcG9pbnRJbnRlcmZhY2UiKQotY2xhc3MgU2VydmljZUltcGwgewotICAgIHB1YmxpYyBTdHJpbmcgbWV0aG9kMShpbnQgcGFyYW0xLCBpbnQgcGFyYW0yKSB0aHJvd3MgTXlFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgLy8gSW50ZW50aW9uYWxseSBkb2Vzbid0IHRocm93IE15RXhjZXB0aW9uLiAgSXQgaXMgdmFsaWQgZm9yIGEgc2VydmljZSBpbXBsIHRvIHRocm93Ci0gICAgLy8gZmV3ZXIgZXhjZXB0aW9ucyB0aGFuIHRoZSBlbmRwb2ludCBpbnRlcmZhY2UKLSAgICBwdWJsaWMgdm9pZCBtZXRob2QyKFN0cmluZyBwYXJhbTEpIHsKLSAgICAgICAgCi0gICAgfQotICAgIAotICAgIHB1YmxpYyBpbnQgbWV0aG9kMygpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotfQotCi1AV2ViU2VydmljZSAoZW5kcG9pbnRJbnRlcmZhY2UgPSAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5FbmRwb2ludEludGVyZmFjZSIpCi1jbGFzcyBNaXNzaW5nTWV0aG9kc0ltcGwgewotICAgIHB1YmxpYyBTdHJpbmcgbWV0aG9kMShpbnQgcGFyYW0xLCBpbnQgcGFyYW0yKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICAKLS8vICAgIHB1YmxpYyB2b2lkIG1ldGhvZDIoU3RyaW5nIHBhcmFtMSkgewotLy8gICAgICAgIAotLy8gICAgfQotICAgIAotICAgIHB1YmxpYyBpbnQgbWV0aG9kMygpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotfQotCi1AV2ViU2VydmljZSAoZW5kcG9pbnRJbnRlcmZhY2UgPSAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5FbmRwb2ludEludGVyZmFjZSIpCi1jbGFzcyBJbnZhbGlkVGhyb3dzSW1wbCB7Ci0gICAgcHVibGljIFN0cmluZyBtZXRob2QxKGludCBwYXJhbTEsIGludCBwYXJhbTIpIHRocm93cyBNeUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAgICAvLyBJbnRlbnRpb25hbGx5IGRvZXNuJ3QgdGhyb3cgTXlFeGNlcHRpb24uICBJdCBpcyB2YWxpZCBmb3IgYSBzZXJ2aWNlIGltcGwgdG8gdGhyb3cKLSAgICAvLyBmZXdlciBleGNlcHRpb25zIHRoYW4gdGhlIGVuZHBvaW50IGludGVyZmFjZQotICAgIHB1YmxpYyB2b2lkIG1ldGhvZDIoU3RyaW5nIHBhcmFtMSkgewotICAgICAgICAKLSAgICB9Ci0gICAgLy8gSXQgaXMgaW52YWxpZCB0byB0aHJvdyBtb3JlIGV4Y2VwdGlvbnMgdGhhbiB0aGUgZW5kcG9pbnQgaW50ZXJmYWNlCi0gICAgcHVibGljIGludCBtZXRob2QzKCkgdGhyb3dzIE15RXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotfQotCi1AV2ViU2VydmljZSAoZW5kcG9pbnRJbnRlcmZhY2UgPSAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5FbmRwb2ludEludGVyZmFjZSIpCi1jbGFzcyBNaXNtYXRjaGVkUmV0dXJuVHlwZXNJbXBsIHsKLSAgICAvLyBSZXR1cm4gdHlwZSBkb2Vzbid0IG1hdGNoIFNFSQotICAgIHB1YmxpYyBJbnRlZ2VyIG1ldGhvZDEoaW50IHBhcmFtMSwgaW50IHBhcmFtMikgdGhyb3dzIE15RXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIG1ldGhvZDIoU3RyaW5nIHBhcmFtMSkgewotICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGludCBtZXRob2QzKCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci19Ci0KLUBXZWJTZXJ2aWNlIChlbmRwb2ludEludGVyZmFjZSA9ICJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkVuZHBvaW50SW50ZXJmYWNlIikKLWNsYXNzIE1pc21hdGNoZWRQYXJhbWV0ZXJOdW1iZXJJbXBsIHsKLSAgICBwdWJsaWMgU3RyaW5nIG1ldGhvZDEoaW50IHBhcmFtMSkgdGhyb3dzIE15RXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIG1ldGhvZDIoU3RyaW5nIHBhcmFtMSkgewotICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGludCBtZXRob2QzKCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci19Ci0KLUBXZWJTZXJ2aWNlIChlbmRwb2ludEludGVyZmFjZSA9ICJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkVuZHBvaW50SW50ZXJmYWNlIikKLWNsYXNzIE1pc21hdGNoZWRQYXJhbWV0ZXJUeXBlc0ltcGwgewotICAgIHB1YmxpYyBTdHJpbmcgbWV0aG9kMShpbnQgcGFyYW0xLCBTdHJpbmcgcGFyYW0yKSB0aHJvd3MgTXlFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgLy8gSW50ZW50aW9uYWxseSBkb2Vzbid0IHRocm93IE15RXhjZXB0aW9uLiAgSXQgaXMgdmFsaWQgZm9yIGEgc2VydmljZSBpbXBsIHRvIHRocm93Ci0gICAgLy8gZmV3ZXIgZXhjZXB0aW9ucyB0aGFuIHRoZSBlbmRwb2ludCBpbnRlcmZhY2UKLSAgICBwdWJsaWMgdm9pZCBtZXRob2QyKFN0cmluZyBwYXJhbTEpIHsKLSAgICAgICAgCi0gICAgfQotICAgIAotICAgIHB1YmxpYyBpbnQgbWV0aG9kMygpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL1ZhbGlkYXRlV1NETFRlc3RzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vVmFsaWRhdGVXU0RMVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI3Njk2Mi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vVmFsaWRhdGVXU0RMVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLkRlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLlBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5XZWJTZXJ2aWNlQW5ub3Q7Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKiogVGVzdHMgdmFsaWRhdGlvbiBhZ2FpbnN0IHRoZSBXU0RMIGZvciBpbnZhbGlkIGNvbmZpZ3VyYXRpb25zICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGVXU0RMVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICAvKiogVGhlIFNFSSB1c2VkIGJ5IHRoZSBzZXJ2aWNlIGltcGwgZG9lcyBub3QgY29udGFpbiBhbGwgdGhlIG1ldGhvZHMgZGVmaW5lZCBvbiB0aGUgUG9ydFR5cGUgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGVQb3J0VHlwZSgpIHsKLSAgICAgICAgU3RyaW5nIHdzZGxSZWxhdGl2ZUxvY2F0aW9uID0KLSAgICAgICAgICAgICAgICBTeXN0ZW0uZ2V0UHJvcGVydHkoImJhc2VkaXIiLCAiLiIpICsgIi8iICsgInRlc3QtcmVzb3VyY2VzL3dzZGwvIjsKLSAgICAgICAgU3RyaW5nIHdzZGxGaWxlTmFtZSA9ICJWYWxpZGF0ZVdTREwxLndzZGwiOwotCi0gICAgICAgIFN0cmluZyB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3NlcnZlclBhcnRpYWwxLmNoZWNrZXhjZXB0aW9uLndlYmZhdWx0LmFubm90YXRpb25zLyI7Ci0gICAgICAgIFN0cmluZyB3c2RsTG9jYXRpb24gPSB3c2RsUmVsYXRpdmVMb2NhdGlvbiArIHdzZGxGaWxlTmFtZTsKLQotICAgICAgICAvLyBCdWlsZCB1cCBhIERCQywgaW5jbHVkaW5nIHRoZSBXU0RMIERlZmluaXRpb24gYW5kIHRoZSBhbm5vdGF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgaW1wbCBjbGFzcy4KLSAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIGRiYyA9IG5ldyBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUoKTsKLQotICAgICAgICBVUkwgd3NkbFVSTCA9IERlc2NyaXB0aW9uVGVzdFV0aWxzLmdldFdTRExVUkwod3NkbEZpbGVOYW1lKTsKLSAgICAgICAgRGVmaW5pdGlvbiB3c2RsRGVmbiA9IERlc2NyaXB0aW9uVGVzdFV0aWxzLmNyZWF0ZVdTRExEZWZpbml0aW9uKHdzZGxVUkwpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHdzZGxEZWZuKTsKLQotICAgICAgICBXZWJTZXJ2aWNlQW5ub3Qgd2ViU2VydmljZUFubm90ID0gV2ViU2VydmljZUFubm90LmNyZWF0ZVdlYlNlcnZpY2VBbm5vdEltcGwoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh3ZWJTZXJ2aWNlQW5ub3QpOwotICAgICAgICB3ZWJTZXJ2aWNlQW5ub3Quc2V0V3NkbExvY2F0aW9uKHdzZGxMb2NhdGlvbik7Ci0gICAgICAgIHdlYlNlcnZpY2VBbm5vdC5zZXRUYXJnZXROYW1lc3BhY2UodGFyZ2V0TmFtZXNwYWNlKTsKLQotICAgICAgICBNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSBtZGMgPSBuZXcgTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUoKTsKLSAgICAgICAgbWRjLnNldE1ldGhvZE5hbWUoImFkZFR3b051bWJlcnMiKTsKLSAgICAgICAgbWRjLnNldFJldHVyblR5cGUoImludCIpOwotCi0gICAgICAgIFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlIHBkYzEgPSBuZXcgUGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGUoKTsKLSAgICAgICAgcGRjMS5zZXRQYXJhbWV0ZXJUeXBlKCJpbnQiKTsKLSAgICAgICAgUGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGUgcGRjMiA9IG5ldyBQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZSgpOwotICAgICAgICBwZGMxLnNldFBhcmFtZXRlclR5cGUoImludCIpOwotCi0gICAgICAgIG1kYy5hZGRQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZShwZGMxKTsKLSAgICAgICAgbWRjLmFkZFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlKHBkYzIpOwotCi0gICAgICAgIGRiYy5hZGRNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZShtZGMpOwotICAgICAgICBkYmMuc2V0V2ViU2VydmljZUFubm90KHdlYlNlcnZpY2VBbm5vdCk7Ci0gICAgICAgIGRiYy5zZXRDbGFzc05hbWUoVmFsaWRhdGVXU0RMSW1wbDEuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgZGJjLnNldFdzZGxEZWZpbml0aW9uKHdzZGxEZWZuKTsKLSAgICAgICAgZGJjLnNldHdzZGxVUkwod3NkbFVSTCk7Ci0KLSAgICAgICAgSGFzaE1hcDxTdHJpbmcsIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZT4gZGJjTWFwID0KLSAgICAgICAgICAgICAgICBuZXcgSGFzaE1hcDxTdHJpbmcsIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZT4oKTsKLSAgICAgICAgZGJjTWFwLnB1dChWYWxpZGF0ZVdTRExJbXBsMS5jbGFzcy5nZXROYW1lKCksIGRiYyk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIExpc3Q8U2VydmljZURlc2NyaXB0aW9uPiBzZXJ2aWNlRGVzY0xpc3QgPQotICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkZhY3RvcnkuY3JlYXRlU2VydmljZURlc2NyaXB0aW9uRnJvbURCQ01hcChkYmNNYXApOwotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChXZWJTZXJ2aWNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIEV4cGVjdGVkIGNvZGUgcGF0aAotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVmZXJlbmNlIGEgUG9ydCAod2hpY2ggZG9lcyBub3QgZXhpc3QpIHVuZGVyIGEgU2VydmljZSB0aGF0IGRvZXMuICBUaGlzIGlzIG5vdCBhIHZhbGlkCi0gICAgICogcGFydGlhbCBXU0RMIGNhc2UgYW5kIHNvIGlzIGFuIGVycm9yLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0ZVBvcnQoKSB7Ci0gICAgICAgIFN0cmluZyB3c2RsUmVsYXRpdmVMb2NhdGlvbiA9ICJ0ZXN0LXJlc291cmNlcy93c2RsLyI7Ci0gICAgICAgIFN0cmluZyB3c2RsRmlsZU5hbWUgPSAiVmFsaWRhdGVXU0RMMS53c2RsIjsKLQotICAgICAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9zZXJ2ZXJQYXJ0aWFsMS5jaGVja2V4Y2VwdGlvbi53ZWJmYXVsdC5hbm5vdGF0aW9ucy8iOwotICAgICAgICBTdHJpbmcgd3NkbExvY2F0aW9uID0gd3NkbFJlbGF0aXZlTG9jYXRpb24gKyB3c2RsRmlsZU5hbWU7Ci0KLSAgICAgICAgLy8gQnVpbGQgdXAgYSBEQkMsIGluY2x1ZGluZyB0aGUgV1NETCBEZWZpbml0aW9uIGFuZCB0aGUgYW5ub3RhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIGltcGwgY2xhc3MuCi0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBkYmMgPSBuZXcgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCk7Ci0KLSAgICAgICAgVVJMIHdzZGxVUkwgPSBEZXNjcmlwdGlvblRlc3RVdGlscy5nZXRXU0RMVVJMKHdzZGxGaWxlTmFtZSk7Ci0gICAgICAgIERlZmluaXRpb24gd3NkbERlZm4gPSBEZXNjcmlwdGlvblRlc3RVdGlscy5jcmVhdGVXU0RMRGVmaW5pdGlvbih3c2RsVVJMKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh3c2RsRGVmbik7Ci0KLSAgICAgICAgV2ViU2VydmljZUFubm90IHdlYlNlcnZpY2VBbm5vdCA9IFdlYlNlcnZpY2VBbm5vdC5jcmVhdGVXZWJTZXJ2aWNlQW5ub3RJbXBsKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwod2ViU2VydmljZUFubm90KTsKLSAgICAgICAgd2ViU2VydmljZUFubm90LnNldFdzZGxMb2NhdGlvbih3c2RsTG9jYXRpb24pOwotICAgICAgICB3ZWJTZXJ2aWNlQW5ub3Quc2V0VGFyZ2V0TmFtZXNwYWNlKHRhcmdldE5hbWVzcGFjZSk7Ci0gICAgICAgIHdlYlNlcnZpY2VBbm5vdC5zZXRTZXJ2aWNlTmFtZSgiVmFsaWRhdGVXU0RMSW1wbDFTZXJ2aWNlSW52YWxpZFBvcnQiKTsKLQotICAgICAgICBNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSBtZGMgPSBuZXcgTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUoKTsKLSAgICAgICAgbWRjLnNldE1ldGhvZE5hbWUoImFkZFR3b051bWJlcnMiKTsKLSAgICAgICAgbWRjLnNldFJldHVyblR5cGUoImludCIpOwotCi0gICAgICAgIFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlIHBkYzEgPSBuZXcgUGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGUoKTsKLSAgICAgICAgcGRjMS5zZXRQYXJhbWV0ZXJUeXBlKCJpbnQiKTsKLSAgICAgICAgUGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGUgcGRjMiA9IG5ldyBQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZSgpOwotICAgICAgICBwZGMxLnNldFBhcmFtZXRlclR5cGUoImludCIpOwotCi0gICAgICAgIG1kYy5hZGRQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZShwZGMxKTsKLSAgICAgICAgbWRjLmFkZFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlKHBkYzIpOwotCi0gICAgICAgIGRiYy5hZGRNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZShtZGMpOwotICAgICAgICBkYmMuc2V0V2ViU2VydmljZUFubm90KHdlYlNlcnZpY2VBbm5vdCk7Ci0gICAgICAgIGRiYy5zZXRDbGFzc05hbWUoVmFsaWRhdGVXU0RMSW1wbDIuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgZGJjLnNldFdzZGxEZWZpbml0aW9uKHdzZGxEZWZuKTsKLSAgICAgICAgZGJjLnNldHdzZGxVUkwod3NkbFVSTCk7Ci0KLSAgICAgICAgSGFzaE1hcDxTdHJpbmcsIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZT4gZGJjTWFwID0KLSAgICAgICAgICAgICAgICBuZXcgSGFzaE1hcDxTdHJpbmcsIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZT4oKTsKLSAgICAgICAgZGJjTWFwLnB1dChWYWxpZGF0ZVdTRExJbXBsMS5jbGFzcy5nZXROYW1lKCksIGRiYyk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIExpc3Q8U2VydmljZURlc2NyaXB0aW9uPiBzZXJ2aWNlRGVzY0xpc3QgPQotICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkZhY3RvcnkuY3JlYXRlU2VydmljZURlc2NyaXB0aW9uRnJvbURCQ01hcChkYmNNYXApOwotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChXZWJTZXJ2aWNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIEV4cGVjdGVkIGNvZGUgcGF0aAotICAgICAgICB9Ci0gICAgfQotfQotCi1AV2ViU2VydmljZSh3c2RsTG9jYXRpb24gPSAidGVzdC1yZXNvdXJjZXMvd3NkbC9WYWxpZGF0ZVdTREwyLndzZGwiLAotICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9zZXJ2ZXJQYXJ0aWFsMS5jaGVja2V4Y2VwdGlvbi53ZWJmYXVsdC5hbm5vdGF0aW9ucy8iKQotY2xhc3MgVmFsaWRhdGVXU0RMSW1wbDEgewotICAgIHB1YmxpYyBpbnQgYWRkVHdvTnVtYmVycyhpbnQgbnVtYmVyMSwgaW50IG51bWJlcjIpIHsKLSAgICAgICAgcmV0dXJuIG51bWJlcjEgKyBudW1iZXIyOwotICAgIH0KLX0KLQotQFdlYlNlcnZpY2Uoc2VydmljZU5hbWUgPSAiVmFsaWRhdGVXU0RMSW1wbDFTZXJ2aWNlSW52YWxpZFBvcnQiLAotICAgICAgICAgICAgd3NkbExvY2F0aW9uID0gInRlc3QtcmVzb3VyY2VzL3dzZGwvVmFsaWRhdGVXU0RMMi53c2RsIiwKLSAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vc2VydmVyUGFydGlhbDEuY2hlY2tleGNlcHRpb24ud2ViZmF1bHQuYW5ub3RhdGlvbnMvIikKLWNsYXNzIFZhbGlkYXRlV1NETEltcGwyIHsKLSAgICBwdWJsaWMgaW50IGFkZFR3b051bWJlcnMoaW50IG51bWJlcjEsIGludCBudW1iZXIyKSB7Ci0gICAgICAgIHJldHVybiBudW1iZXIxICsgbnVtYmVyMjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vV3JhcHBlclBhY2thZ2VUZXN0cy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL1dyYXBwZXJQYWNrYWdlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjYxNjRlMy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vV3JhcHBlclBhY2thZ2VUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLkJhc2ljQ29uZmlndXJhdG9yOwotCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7Ci1pbXBvcnQgamF2YXgueG1sLndzLlJlcXVlc3RXcmFwcGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5SZXNwb25zZVdyYXBwZXI7Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYkZhdWx0OwotCi0vKiogVGVzdHMgdGhlIHJlcXVlc3QgYW5kIHJlc3BvbnNlIHdyYXBwZXJzLiAqLwotcHVibGljIGNsYXNzIFdyYXBwZXJQYWNrYWdlVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgc3RhdGljIHsKLSAgICAgICAgLy8gTm90ZSB5b3Ugd2lsbCBwcm9iYWJseSBuZWVkIHRvIGluY3JlYXNlIHRoZSBqYXZhIGhlYXAgc2l6ZSwgZm9yIGV4YW1wbGUKLSAgICAgICAgLy8gLVhteDUxMm0uICBUaGlzIGNhbiBiZSBkb25lIGJ5IHNldHRpbmcgbWF2ZW4uanVuaXQuanZtYXJncyBpbiBwcm9qZWN0LnByb3BlcnRpZXMuCi0gICAgICAgIC8vIFRvIGNoYW5nZSB0aGUgc2V0dGluZ3MsIGVkaXQgdGhlIGxvZzRqLnByb3BlcnR5IGZpbGUKLSAgICAgICAgLy8gaW4gdGhlIHRlc3QtcmVzb3VyY2VzIGRpcmVjdG9yeS4KLSAgICAgICAgQmFzaWNDb25maWd1cmF0b3IuY29uZmlndXJlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNFSVBhY2thZ2VXcmFwcGVyKCkgewotICAgICAgICBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uIGVpRGVzYyA9IGdldEVuZHBvaW50SW50ZXJmYWNlRGVzYyhTRUlQYWNrYWdlV3JhcHBlci5jbGFzcyk7Ci0gICAgICAgIAotICAgICAgICAvLyBTZWUgaWYgdGhlIG5hbWUgaXMgY29ycmVjdC4uY3VycmVudGx5IHdlIGNhbm5vdCBkbyB0aGlzIGRpcmVjdGx5LCBzbyBJIGFtIHVzaW5nCi0gICAgICAgIC8vIHRoZSBkZWJ1ZyBkdW1wLgotICAgICAgICBTdHJpbmcgZHVtcCA9IGVpRGVzYy50b1N0cmluZygpOwotICAgICAgICBhc3NlcnRUcnVlKGR1bXAuY29udGFpbnMoIk5hbWU6IFNFSVBhY2thZ2VXcmFwcGVyIikpOwotICAgICAgICAKLSAgICAgICAgT3BlcmF0aW9uRGVzY3JpcHRpb24gb3BEZXNjID0gZWlEZXNjLmdldE9wZXJhdGlvbigibWV0aG9kMSIpOwotICAgICAgICBTdHJpbmcgcmVxdWVzdFdyYXBwZXJDbGFzcyA9IG9wRGVzYy5nZXRSZXF1ZXN0V3JhcHBlckNsYXNzTmFtZSgpOwotCi0gICAgICAgIC8vIFRoZSBhbGdvcml0aG0gdG8gZmluZCB0aGUgcmVzcG9uc2Ugd3JhcHBlciBpcyBub3QgZGVmaW5lZCBieSB0aGUgc3BlY2lmaWNhdGlvbi4KLSAgICAgICAgLy8gVGhlIG1hcnNoYWxsaW5nIGxheWVyIChqYXh3cykgY2FuIHVzZSBwcm9wcmlldGFyeSBtZWNoYW5pc21zIHRvIGZpbmQsIGJ1aWxkIG9yIG9wZXJhdGUKLSAgICAgICAgLy8gd2l0aG91dCB0aGUgd3JhcHBlciBjbGFzcy4KLQotICAgICAgICAvL2Fzc2VydEVxdWFscygib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5NZXRob2QxIiwgcmVxdWVzdFdyYXBwZXJDbGFzcyk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhudWxsLCByZXF1ZXN0V3JhcHBlckNsYXNzKTsKLQotICAgICAgICBTdHJpbmcgcmVzcG9uc2VXcmFwcGVyQ2xhc3MgPSBvcERlc2MuZ2V0UmVzcG9uc2VXcmFwcGVyQ2xhc3NOYW1lKCk7Ci0gICAgICAgIC8vYXNzZXJ0RXF1YWxzKCJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLk1ldGhvZDFSZXNwb25zZSIsIHJlc3BvbnNlV3JhcHBlckNsYXNzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG51bGwsIHJlc3BvbnNlV3JhcHBlckNsYXNzKTsKLQotICAgICAgICBGYXVsdERlc2NyaXB0aW9uIGZEZXNjID0gb3BEZXNjLmdldEZhdWx0RGVzY3JpcHRpb25zKClbMF07Ci0gICAgICAgIFN0cmluZyBmYXVsdEV4Y2VwdGlvbkNsYXNzID0gZkRlc2MuZ2V0RXhjZXB0aW9uQ2xhc3NOYW1lKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5NZXRob2QxRXhjZXB0aW9uIiwgZmF1bHRFeGNlcHRpb25DbGFzcyk7Ci0gICAgICAgIFN0cmluZyBmYXVsdEJlYW5DbGFzcyA9IGZEZXNjLmdldEZhdWx0QmVhbigpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIm9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRXhjZXB0aW9uQmVhbiIsIGZhdWx0QmVhbkNsYXNzKTsKLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTRUlTdWJQYWNrYWdlV3JhcHBlcigpIHsKLSAgICAgICAgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiBlaURlc2MgPSBnZXRFbmRwb2ludEludGVyZmFjZURlc2MoU0VJU3ViUGFja2FnZVdyYXBwZXIuY2xhc3MpOwotICAgICAgICBPcGVyYXRpb25EZXNjcmlwdGlvbiBvcERlc2MgPSBlaURlc2MuZ2V0T3BlcmF0aW9uKCJzdWJQYWNrYWdlTWV0aG9kMSIpOwotICAgICAgICAvLyBUaGUgYWxnb3JpdGhtIHRvIGZpbmQgdGhlIHJlc3BvbnNlIHdyYXBwZXIgaXMgbm90IGRlZmluZWQgYnkgdGhlIHNwZWNpZmljYXRpb24uCi0gICAgICAgIC8vIFRoZSBtYXJzaGFsbGluZyBsYXllciAoamF4d3MpIGNhbiB1c2UgcHJvcHJpZXRhcnkgbWVjaGFuaXNtcyB0byBmaW5kLCBidWlsZCBvciBvcGVyYXRlCi0gICAgICAgIC8vIHdpdGhvdXQgdGhlIHdyYXBwZXIgY2xhc3MuCi0KLSAgICAgICAgU3RyaW5nIHJlcXVlc3RXcmFwcGVyQ2xhc3MgPSBvcERlc2MuZ2V0UmVxdWVzdFdyYXBwZXJDbGFzc05hbWUoKTsKLSAgICAgICAgLy9hc3NlcnRFcXVhbHMoIm9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uamF4d3MuU3ViUGFja2FnZU1ldGhvZDEiLCByZXF1ZXN0V3JhcHBlckNsYXNzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG51bGwsIHJlcXVlc3RXcmFwcGVyQ2xhc3MpOwotICAgICAgICBTdHJpbmcgcmVzcG9uc2VXcmFwcGVyQ2xhc3MgPSBvcERlc2MuZ2V0UmVzcG9uc2VXcmFwcGVyQ2xhc3NOYW1lKCk7Ci0gICAgICAgIC8vYXNzZXJ0RXF1YWxzKCJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmpheHdzLlN1YlBhY2thZ2VNZXRob2QxUmVzcG9uc2UiLCByZXNwb25zZVdyYXBwZXJDbGFzcyk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhudWxsLCByZXNwb25zZVdyYXBwZXJDbGFzcyk7Ci0gICAgICAgIEZhdWx0RGVzY3JpcHRpb24gZkRlc2MgPSBvcERlc2MuZ2V0RmF1bHREZXNjcmlwdGlvbnMoKVswXTsKLSAgICAgICAgU3RyaW5nIGZhdWx0RXhjZXB0aW9uQ2xhc3MgPSBmRGVzYy5nZXRFeGNlcHRpb25DbGFzc05hbWUoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLlN1YlBhY2thZ2VFeGNlcHRpb24iLCBmYXVsdEV4Y2VwdGlvbkNsYXNzKTsKLSAgICAgICAgU3RyaW5nIGZhdWx0QmVhbkNsYXNzID0gZkRlc2MuZ2V0RmF1bHRCZWFuKCk7Ci0gICAgICAgIC8vIER1ZSB0byB0aGUgbWlzc2luZyBnZXRGYXVsdEluZm8sIHRoZSBydW50aW1lIG11c3QgZmluZCBvciBidWlsZCBhIGZhdWx0IGJlYW4uCi0gICAgICAgIGFzc2VydEVxdWFscygiIiwgZmF1bHRCZWFuQ2xhc3MpOwotICAgICAgICAvL2Fzc2VydEVxdWFscygib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5qYXh3cy5TdWJQYWNrYWdlRXhjZXB0aW9uQmVhbiIsIGZhdWx0QmVhbkNsYXNzKTsKLQotICAgIH0KLQotICAgIC8qCi0gICAgKiBNZXRob2QgdG8gcmV0dXJuIHRoZSBlbmRwb2ludCBpbnRlcmZhY2UgZGVzY3JpcHRpb24gZm9yIGEgZ2l2ZW4gaW1wbGVtZW50YXRpb24gY2xhc3MuCi0gICAgKi8KLSAgICBwcml2YXRlIEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24gZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjKENsYXNzIGltcGxlbWVudGF0aW9uQ2xhc3MpIHsKLSAgICAgICAgLy8gVXNlIHRoZSBkZXNjcmlwdGlvbiBmYWN0b3J5IGRpcmVjdGx5OyB0aGlzIHdpbGwgYmUgZG9uZSB3aXRoaW4gdGhlIEpBWC1XUyBydW50aW1lCi0gICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzZXJ2aWNlRGVzYyA9Ci0gICAgICAgICAgICAgICAgRGVzY3JpcHRpb25GYWN0b3J5LmNyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbihpbXBsZW1lbnRhdGlvbkNsYXNzKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlRGVzYyk7Ci0KLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbltdIGVuZHBvaW50RGVzYyA9IHNlcnZpY2VEZXNjLmdldEVuZHBvaW50RGVzY3JpcHRpb25zKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZW5kcG9pbnREZXNjKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGVuZHBvaW50RGVzYy5sZW5ndGgpOwotCi0gICAgICAgIC8vIFRPRE86IEhvdyB3aWxsIHRoZSBKQVgtV1MgZGlzcGF0Y2hlciBnZXQgdGhlIGFwcHJvcHJpYXRlIHBvcnQgKGkuZS4gZW5kcG9pbnQpPyAgQ3VycmVudGx5IGFzc3VtZXMgWzBdCi0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gdGVzdEVuZHBvaW50RGVzYyA9IGVuZHBvaW50RGVzY1swXTsKLSAgICAgICAgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiB0ZXN0RW5kcG9pbnRJbnRlcmZhY2VEZXNjID0KLSAgICAgICAgICAgICAgICB0ZXN0RW5kcG9pbnREZXNjLmdldEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24oKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh0ZXN0RW5kcG9pbnRJbnRlcmZhY2VEZXNjKTsKLQotICAgICAgICByZXR1cm4gdGVzdEVuZHBvaW50SW50ZXJmYWNlRGVzYzsKLSAgICB9Ci19Ci0KLUBXZWJTZXJ2aWNlKCkKLWNsYXNzIFNFSVBhY2thZ2VXcmFwcGVyIHsKLSAgICBAUmVxdWVzdFdyYXBwZXIoKQotICAgIEBSZXNwb25zZVdyYXBwZXIoKQotICAgIHB1YmxpYyBTdHJpbmcgbWV0aG9kMShTdHJpbmcgc3RyaW5nKSB0aHJvd3MgTWV0aG9kMUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBzdHJpbmc7Ci0gICAgfQotfQotCi1jbGFzcyBNZXRob2QxIHsKLQotfQotCi1jbGFzcyBNZXRob2QxUmVzcG9uc2UgewotCi19Ci0KLUBXZWJGYXVsdCgpCi1jbGFzcyBNZXRob2QxRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKLSAgICBwdWJsaWMgRXhjZXB0aW9uQmVhbiBnZXRGYXVsdEluZm8oKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLX0KLQotY2xhc3MgRXhjZXB0aW9uQmVhbiB7Ci0KLX0KLQotQFdlYkZhdWx0Ci1jbGFzcyBTdWJQYWNrYWdlRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKLSAgICAvLyBObyBnZXRGYXVsdEluZm8gbWV0aG9kCi19Ci0KLUBXZWJTZXJ2aWNlKCkKLWNsYXNzIFNFSVN1YlBhY2thZ2VXcmFwcGVyIHsKLSAgICBAUmVxdWVzdFdyYXBwZXIoKQotICAgIEBSZXNwb25zZVdyYXBwZXIoKQotICAgIHB1YmxpYyBTdHJpbmcgc3ViUGFja2FnZU1ldGhvZDEoU3RyaW5nIHN0cmluZykgdGhyb3dzIFN1YlBhY2thZ2VFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gc3RyaW5nOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYWRkcmVzc2luZy9BY3Rpb25UZXN0cy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2FkZHJlc3NpbmcvQWN0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Q4NTUxNi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYWRkcmVzc2luZy9BY3Rpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmFkZHJlc3Npbmc7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5EZXNjcmlwdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5FbmRwb2ludERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uU2VydmljZURlc2NyaXB0aW9uOwotCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwud3MuQWN0aW9uOwotaW1wb3J0IGphdmF4LnhtbC53cy5GYXVsdEFjdGlvbjsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViRmF1bHQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgQWN0aW9uVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIG5zID0gImh0dHA6Ly9qYXh3cy5heGlzMi5hcGFjaGUub3JnL21ldGFkYXRhL2FkZHJlc3NpbmcvYWN0aW9uIjsKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGVmYXVsdFNlcnZpY2VQb3J0TmFtZSA9ICJEZWZhdWx0U2VydmljZVBvcnQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBwbGFpblNlcnZpY2VQb3J0TmFtZSA9ICJQbGFpblNlcnZpY2VQb3J0IjsKLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9Bbm5vdGF0aW9uKCkgewotICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc2QgID0gRGVzY3JpcHRpb25GYWN0b3J5LmNyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbihEZWZhdWx0U2VydmljZS5jbGFzcyk7Ci0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZWQgPSBzZC5nZXRFbmRwb2ludERlc2NyaXB0aW9uKG5ldyBRTmFtZShucywgZGVmYXVsdFNlcnZpY2VQb3J0TmFtZSkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGVkKTsKLSAgICAgICAgCi0gICAgICAgIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlID0gZWQuZ2V0QXhpc1NlcnZpY2UoKTsKLSAgICAgICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBheGlzU2VydmljZS5nZXRPcGVyYXRpb25zKCk7Ci0gICAgICAgIAotICAgICAgICBBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb24gPSAoQXhpc09wZXJhdGlvbikgaXRlcmF0b3IubmV4dCgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly9qYXh3cy5heGlzMi5hcGFjaGUub3JnL21ldGFkYXRhL2FkZHJlc3NpbmcvYWN0aW9uL1NlcnZpY2UxL2dldFF1b3RlUmVxdWVzdCIsIGF4aXNPcGVyYXRpb24uZ2V0SW5wdXRBY3Rpb24oKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiaHR0cDovL2pheHdzLmF4aXMyLmFwYWNoZS5vcmcvbWV0YWRhdGEvYWRkcmVzc2luZy9hY3Rpb24vU2VydmljZTEvZ2V0UXVvdGVSZXNwb25zZSIsIGF4aXNPcGVyYXRpb24uZ2V0T3V0cHV0QWN0aW9uKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly9qYXh3cy5heGlzMi5hcGFjaGUub3JnL21ldGFkYXRhL2FkZHJlc3NpbmcvYWN0aW9uL1NlcnZpY2UxL2dldFF1b3RlL0ZhdWx0L1Rlc3RFeGNlcHRpb24iLCBheGlzT3BlcmF0aW9uLmdldEZhdWx0QWN0aW9uKCkpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGxhaW5Bbm5vdGF0aW9uKCkgewotICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc2QgID0gRGVzY3JpcHRpb25GYWN0b3J5LmNyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbihQbGFpblNlcnZpY2UuY2xhc3MpOwotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVkID0gc2QuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbihuZXcgUU5hbWUobnMsIHBsYWluU2VydmljZVBvcnROYW1lKSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZWQpOwotICAgICAgICAKLSAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UgPSBlZC5nZXRBeGlzU2VydmljZSgpOwotICAgICAgICBJdGVyYXRvciBpdGVyYXRvciA9IGF4aXNTZXJ2aWNlLmdldE9wZXJhdGlvbnMoKTsKLSAgICAgICAgCi0gICAgICAgIEF4aXNPcGVyYXRpb24gYXhpc09wZXJhdGlvbiA9IChBeGlzT3BlcmF0aW9uKSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiaHR0cDovL3Rlc3QvaW5wdXQiLCBheGlzT3BlcmF0aW9uLmdldElucHV0QWN0aW9uKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly90ZXN0L291dHB1dCIsIGF4aXNPcGVyYXRpb24uZ2V0T3V0cHV0QWN0aW9uKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly90ZXN0L2ZhdWx0IiwgYXhpc09wZXJhdGlvbi5nZXRGYXVsdEFjdGlvbigpKTsKLSAgICB9Ci0gICAgCi0gICAgQFdlYlNlcnZpY2UobmFtZT0iU2VydmljZTEiLCB0YXJnZXROYW1lc3BhY2U9bnMsIHBvcnROYW1lPWRlZmF1bHRTZXJ2aWNlUG9ydE5hbWUpCi0gICAgY2xhc3MgRGVmYXVsdFNlcnZpY2UgewotICAgICAgICBwdWJsaWMgZG91YmxlIGdldFF1b3RlKFN0cmluZyBzeW1ib2wpIHRocm93cyBUZXN0RXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHJldHVybiAxMDEuMDE7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgQFdlYlNlcnZpY2UobmFtZT0iU2VydmljZTIiLCB0YXJnZXROYW1lc3BhY2U9bnMsIHBvcnROYW1lPXBsYWluU2VydmljZVBvcnROYW1lKQotICAgIGNsYXNzIFBsYWluU2VydmljZSB7Ci0gICAgICAgIAotICAgICAgICBAQWN0aW9uKGlucHV0PSJodHRwOi8vdGVzdC9pbnB1dCIsIG91dHB1dD0iaHR0cDovL3Rlc3Qvb3V0cHV0IiwKLSAgICAgICAgICAgICAgICBmYXVsdD17IEBGYXVsdEFjdGlvbihjbGFzc05hbWU9VGVzdEV4Y2VwdGlvbi5jbGFzcywgdmFsdWU9Imh0dHA6Ly90ZXN0L2ZhdWx0IikgfSkKLSAgICAgICAgcHVibGljIGRvdWJsZSBnZXRRdW90ZShTdHJpbmcgc3ltYm9sKSB0aHJvd3MgVGVzdEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICByZXR1cm4gMTAxLjAxOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIEBXZWJGYXVsdChuYW1lPSJUZXN0RXhjZXB0aW9uIiwgdGFyZ2V0TmFtZXNwYWNlPW5zKQotICAgIGNsYXNzIFRlc3RFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9idWlsZGVyL0Rlc2NyaXB0aW9uQnVpbGRlclRlc3RzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9EZXNjcmlwdGlvbkJ1aWxkZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTZmMDRkLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9idWlsZGVyL0Rlc2NyaXB0aW9uQnVpbGRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkVuZHBvaW50RGVzY3JpcHRpb247Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW0uTW9kZTsKLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogRGlyZWN0bHkgdGVzdCB0aGUgRGVzY3JpcHRpb24gY2xhc3NlcyBidWlsdCB2aWEgYW5ub3RhdGlvbnMgd2l0aG91dCBhIFdTREwgZmlsZS4gVGhlc2UgdGVzdHMKLSAqIGZvY3VzIG9uIGNvbWJpbmF0aW9ucyBvZiB0aGUgZm9sbG93aW5nOiAtIEEgZ2VuZXJpYyBzZXJ2aWNlIChubyBhbm5vdGF0aW9ucykgLSBBIGdlbmVyYXRlZAotICogc2VydmljZSAoYW5ub3RhdGlvbnMpIC0gQW4gU0VJCi0gKi8KLXB1YmxpYyBjbGFzcyBEZXNjcmlwdGlvbkJ1aWxkZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIC8qIAotICAgICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgKiBTZXJ2aWNlRGVzY3JpcHRpb24gVGVzdHMKLSAgICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZVdlYlNlcnZpY2VBbm5vdCgpIHsKLSAgICAgICAgU3RyaW5nIG5hbWUgPSAiRWNob1NlcnZpY2VBbm5vdGF0ZWQiOwotICAgICAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9kZXNjcmlwdGlvbi5qYXh3cy5heGlzMi5hcGFjaGUub3JnLyI7Ci0gICAgICAgIFN0cmluZyBzZXJ2aWNlTmFtZSA9ICJFY2hvU2VydmljZU5hbWUiOwotICAgICAgICBTdHJpbmcgd3NkbExvY2F0aW9uID0gImh0dHA6Ly9FY2hvU2VydmljZS93c2RsIjsKLSAgICAgICAgU3RyaW5nIGVuZHBvaW50SW50ZXJmYWNlID0gIkVjaG9TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UiOwotICAgICAgICBTdHJpbmcgcG9ydE5hbWUgPSAiRWNob1NlcnZpY2VBbm5vdGF0ZWRQb3J0IjsKLQotICAgICAgICBXZWJTZXJ2aWNlQW5ub3Qgd2ViU2VydmljZUFubm90SW1wbDEgPQotICAgICAgICAgICAgICAgIFdlYlNlcnZpY2VBbm5vdC5jcmVhdGVXZWJTZXJ2aWNlQW5ub3RJbXBsKCk7Ci0KLSAgICAgICAgV2ViU2VydmljZUFubm90IHdlYlNlcnZpY2VBbm5vdEltcGwyID0KLSAgICAgICAgICAgICAgICBXZWJTZXJ2aWNlQW5ub3QuY3JlYXRlV2ViU2VydmljZUFubm90SW1wbChuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c2RsTG9jYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kcG9pbnRJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydE5hbWUpOwotCi0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBkZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgPQotICAgICAgICAgICAgICAgIG5ldyBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUoKTsKLQotICAgICAgICBkZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUuc2V0V2ViU2VydmljZUFubm90KHdlYlNlcnZpY2VBbm5vdEltcGwyKTsKLQotCi0gICAgICAgIFdlYlNlcnZpY2Ugd2ViU2VydmljZUFubm90SW1wbDMgPSAKLSAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUuZ2V0V2ViU2VydmljZUFubm90KCk7Ci0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgiV2ViU2VydmljZSBuYW1lIG5vdCBzZXQiLCB3ZWJTZXJ2aWNlQW5ub3RJbXBsMy5uYW1lKCkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKCJXZWJTZXJ2aWNlIHRhcmdldE5hbWVzcGFjZSBub3Qgc2V0Iiwgd2ViU2VydmljZUFubm90SW1wbDMudGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKCJXZWJTZXJ2aWNlIHNlcnZpY2VOYW1lIG5vdCBzZXQiLCB3ZWJTZXJ2aWNlQW5ub3RJbXBsMy5zZXJ2aWNlTmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgiV2ViU2VydmljZSB3c2RsTG9jYXRpb24gbm90IHNldCIsIHdlYlNlcnZpY2VBbm5vdEltcGwzLndzZGxMb2NhdGlvbigpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgiV2ViU2VydmljZSBlbmRwb2ludEludGVyZmFjZSBub3Qgc2V0IiwKLSAgICAgICAgICAgICAgICAgICAgICB3ZWJTZXJ2aWNlQW5ub3RJbXBsMy5lbmRwb2ludEludGVyZmFjZSgpKTsKLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIldlYlNlcnZpY2UgbmFtZToiICsgd2ViU2VydmljZUFubm90SW1wbDMubmFtZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlV2ViU2VydmljZVByb3ZpZGVyQW5ub3QoKSB7Ci0gICAgICAgIFN0cmluZyBuYW1lID0gIkVjaG9TZXJ2aWNlQW5ub3RhdGVkIjsKLSAgICAgICAgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vZGVzY3JpcHRpb24uamF4d3MuYXhpczIuYXBhY2hlLm9yZy8iOwotICAgICAgICBTdHJpbmcgc2VydmljZU5hbWUgPSAiRWNob1NlcnZpY2VOYW1lIjsKLSAgICAgICAgU3RyaW5nIHdzZGxMb2NhdGlvbiA9ICJodHRwOi8vRWNob1NlcnZpY2Uvd3NkbCI7Ci0gICAgICAgIFN0cmluZyBlbmRwb2ludEludGVyZmFjZSA9ICJFY2hvU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIjsKLSAgICAgICAgU3RyaW5nIHBvcnROYW1lID0gIkVjaG9TZXJ2aWNlQW5ub3RhdGVkUG9ydCI7Ci0KLSAgICAgICAgV2ViU2VydmljZVByb3ZpZGVyQW5ub3Qgd2ViU2VydmljZVByb3ZpZGVyQW5ub3QgPQotICAgICAgICAgICAgICAgIFdlYlNlcnZpY2VQcm92aWRlckFubm90LmNyZWF0ZVdlYlNlcnZpY2VBbm5vdEltcGwoKTsKLQotICAgICAgICB3ZWJTZXJ2aWNlUHJvdmlkZXJBbm5vdC5zZXRQb3J0TmFtZShwb3J0TmFtZSk7Ci0gICAgICAgIHdlYlNlcnZpY2VQcm92aWRlckFubm90LnNldFNlcnZpY2VOYW1lKHNlcnZpY2VOYW1lKTsKLSAgICAgICAgd2ViU2VydmljZVByb3ZpZGVyQW5ub3Quc2V0VGFyZ2V0TmFtZXNwYWNlKHRhcmdldE5hbWVzcGFjZSk7Ci0gICAgICAgIHdlYlNlcnZpY2VQcm92aWRlckFubm90LnNldFdzZGxMb2NhdGlvbih3c2RsTG9jYXRpb24pOwotCi0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBkZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgPQotICAgICAgICAgICAgICAgIG5ldyBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUoKTsKLQotICAgICAgICBkZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUuc2V0V2ViU2VydmljZVByb3ZpZGVyQW5ub3Qod2ViU2VydmljZVByb3ZpZGVyQW5ub3QpOwotCi0KLSAgICAgICAgamF2YXgueG1sLndzLldlYlNlcnZpY2VQcm92aWRlciB3ZWJTZXJ2aWNlUHJvdmlkZXJBbm5vdDMgPQotICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZS5nZXRXZWJTZXJ2aWNlUHJvdmlkZXJBbm5vdCgpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygiV2ViU2VydmljZVByb3ZpZGVyIHBvcnQgbmFtZSBub3Qgc2V0IHByb3Blcmx5IiwKLSAgICAgICAgICAgICAgICAgICAgIHdlYlNlcnZpY2VQcm92aWRlckFubm90My5wb3J0TmFtZSgpLCBwb3J0TmFtZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiV2ViU2VydmljZVByb3ZpZGVyIHRhcmdldE5hbWVzcGFjZSBub3Qgc2V0IHByb3Blcmx5IiwKLSAgICAgICAgICAgICAgICAgICAgIHdlYlNlcnZpY2VQcm92aWRlckFubm90My50YXJnZXROYW1lc3BhY2UoKSwgdGFyZ2V0TmFtZXNwYWNlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJXZWJTZXJ2aWNlUHJvdmlkZXIgc2VydmljZU5hbWUgbm90IHNldCBwcm9wZXJseSIsCi0gICAgICAgICAgICAgICAgICAgICB3ZWJTZXJ2aWNlUHJvdmlkZXJBbm5vdDMuc2VydmljZU5hbWUoKSwgc2VydmljZU5hbWUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIldlYlNlcnZpY2VQcm92aWRlciB3c2RsTG9jYXRpb24gbm90IHNldCBwcm9wZXJseSIsCi0gICAgICAgICAgICAgICAgICAgICB3ZWJTZXJ2aWNlUHJvdmlkZXJBbm5vdDMud3NkbExvY2F0aW9uKCksIHdzZGxMb2NhdGlvbik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiV2ViU2VydmljZSBuYW1lOiIgKyB3ZWJTZXJ2aWNlUHJvdmlkZXJBbm5vdDMucG9ydE5hbWUoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZVdlYk1ldGhvZEFubm90KCkgewotICAgICAgICBTdHJpbmcgb3BlcmF0aW9uTmFtZSA9ICJlY2hvU3RyaW5nTWV0aG9kIjsKLSAgICAgICAgU3RyaW5nIGFjdGlvbiA9ICJ1cm46RWNob1N0cmluZ01ldGhvZCI7Ci0gICAgICAgIGJvb2xlYW4gZXhjbHVkZSA9IHRydWU7Ci0KLQotICAgICAgICBXZWJNZXRob2RBbm5vdCB3ZWJNZXRob2RBbm5vdCA9IFdlYk1ldGhvZEFubm90LmNyZWF0ZVdlYk1ldGhvZEFubm90SW1wbCgpOwotCi0gICAgICAgIHdlYk1ldGhvZEFubm90LnNldE9wZXJhdGlvbk5hbWUob3BlcmF0aW9uTmFtZSk7Ci0gICAgICAgIHdlYk1ldGhvZEFubm90LnNldEFjdGlvbihhY3Rpb24pOwotICAgICAgICB3ZWJNZXRob2RBbm5vdC5zZXRFeGNsdWRlKGV4Y2x1ZGUpOwotCi0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBkYmMgPSBuZXcgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCk7Ci0gICAgICAgIE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlIG1kYyA9IG5ldyBNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSgpOwotCi0gICAgICAgIG1kYy5zZXRXZWJNZXRob2RBbm5vdCh3ZWJNZXRob2RBbm5vdCk7Ci0gICAgICAgIG1kYy5zZXRNZXRob2ROYW1lKG9wZXJhdGlvbk5hbWUpOwotICAgICAgICBkYmMuYWRkTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUobWRjKTsKLQotICAgICAgICBXZWJNZXRob2RBbm5vdCB3ZWJNZXRob2RBbm5vdDMgPQotICAgICAgICAgICAgICAgIGRiYy5nZXRNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZShvcGVyYXRpb25OYW1lLCAxKS5nZXRXZWJNZXRob2RBbm5vdCgpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygiV2ViTWV0aG9kIG9wZXJhdGlvbiBuYW1lIG5vdCBzZXQgcHJvcGVybHkiLCB3ZWJNZXRob2RBbm5vdDMub3BlcmF0aW9uTmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uTmFtZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiV2ViTWV0aG9kIGFjdGlvbiBub3Qgc2V0IHByb3Blcmx5Iiwgd2ViTWV0aG9kQW5ub3QzLmFjdGlvbigpLCBhY3Rpb24pOwotICAgICAgICBhc3NlcnRFcXVhbHMoIldlYk1ldGhvZCBleGNsdWRlIGZsYWcgbm90IHNldCBwcm9wZXJseSIsIHdlYk1ldGhvZEFubm90My5leGNsdWRlKCksIGV4Y2x1ZGUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVXZWJQYXJhbUFubm90KCkgewotCi0gICAgICAgIFN0cmluZyBuYW1lID0gImFyZzAiOwotICAgICAgICBTdHJpbmcgcGFydE5hbWUgPSAic2t1IjsKLSAgICAgICAgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vZGVzY3JpcHRpb24uamF4d3MuYXhpczIuYXBhY2hlLm9yZy8iOwotICAgICAgICBNb2RlIG1vZGUgPSBNb2RlLklOOwotICAgICAgICBib29sZWFuIGhlYWRlciA9IHRydWU7Ci0KLSAgICAgICAgV2ViUGFyYW1Bbm5vdCB3ZWJQYXJhbUFubm90ID0gV2ViUGFyYW1Bbm5vdC5jcmVhdGVXZWJQYXJhbUFubm90SW1wbCgpOwotCi0gICAgICAgIHdlYlBhcmFtQW5ub3Quc2V0TmFtZShuYW1lKTsKLSAgICAgICAgd2ViUGFyYW1Bbm5vdC5zZXRQYXJ0TmFtZShwYXJ0TmFtZSk7Ci0gICAgICAgIHdlYlBhcmFtQW5ub3Quc2V0TW9kZShtb2RlKTsKLSAgICAgICAgd2ViUGFyYW1Bbm5vdC5zZXRUYXJnZXROYW1lc3BhY2UodGFyZ2V0TmFtZXNwYWNlKTsKLSAgICAgICAgd2ViUGFyYW1Bbm5vdC5zZXRIZWFkZXIoaGVhZGVyKTsKLQotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgZGJjID0gbmV3IERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSgpOwotCi0gICAgICAgIFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlIHBkYyA9IG5ldyBQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZSgpOwotICAgICAgICBwZGMuc2V0V2ViUGFyYW1Bbm5vdCh3ZWJQYXJhbUFubm90KTsKLSAgICAgICAgcGRjLnNldFBhcmFtZXRlclR5cGUoImludCIpOwotCi0gICAgICAgIE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlIG1kYyA9IG5ldyBNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSgpOwotICAgICAgICBtZGMuc2V0TWV0aG9kTmFtZSgiVGVzdE1ldGhvZDEiKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy9GaXJzdCB0ZXN0IGFkZHMgdGhpcyBwZGMgb3V0IG9mIGJvdW5kcwotICAgICAgICAgICAgbWRjLmFkZFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlKHBkYywgMSk7Ci0gICAgICAgIH0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gRXhwZWN0ZWQgZmxvdwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiQ2F1Z2h0IHVuZXhwZWN0ZWQgZXhjZXB0aW9uIiArIGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vTm93LCBhZGQgaXQgYXQgdGhlIHByb3BlciBwb3NpdGlvbgotICAgICAgICAgICAgbWRjLmFkZFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlKHBkYywgMCk7Ci0gICAgICAgIH0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gRXhwZWN0ZWQgZmxvdwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiQ2F1Z2h0IHVuZXhwZWN0ZWQgZXhjZXB0aW9uIiArIGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgZGJjLmFkZE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlKG1kYyk7Ci0KLSAgICAgICAgV2ViUGFyYW1Bbm5vdCB3ZWJQYXJhbUFubm90MyA9Ci0gICAgICAgICAgICAgICAgZGJjLmdldE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlKCJUZXN0TWV0aG9kMSIsIDEpCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGUoMCkuZ2V0V2ViUGFyYW1Bbm5vdCgpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygiV2ViTWV0aG9kIG5hbWUgbm90IHNldCBwcm9wZXJseSIsIHdlYlBhcmFtQW5ub3QzLm5hbWUoKSwgbmFtZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiV2ViTWV0aG9kIFBhcnROYW1lIG5vdCBzZXQgcHJvcGVybHkiLCB3ZWJQYXJhbUFubm90My5wYXJ0TmFtZSgpLCBwYXJ0TmFtZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiV2ViTWV0aG9kIE1vZGUgZmxhZyBub3Qgc2V0IHByb3Blcmx5Iiwgd2ViUGFyYW1Bbm5vdDMubW9kZSgpLCBtb2RlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJXZWJNZXRob2QgVGFyZ2V0IE5hbWVzcGFjZSBub3Qgc2V0IHByb3Blcmx5IiwKLSAgICAgICAgICAgICAgICAgICAgIHdlYlBhcmFtQW5ub3QzLnRhcmdldE5hbWVzcGFjZSgpLCB0YXJnZXROYW1lc3BhY2UpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIldlYk1ldGhvZCBIZWFkZXIgbm90IHNldCBwcm9wZXJseSIsIHdlYlBhcmFtQW5ub3QzLmhlYWRlcigpLCBoZWFkZXIpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygiVW5hYmxlIHRvIGNvbnZlcnQgc3RyaW5nIHRvIHBhcmFtZXRlclR5cGVDbGFzcyIsCi0gICAgICAgICAgICAgICAgICAgICBwZGMuZ2V0UGFyYW1ldGVyVHlwZUNsYXNzKCkuZ2V0TmFtZSgpLCAiaW50Iik7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RHZW5lcmljQW5ub3RhdGlvbkluc3RhbmNlc0FuZFByb2Nlc3NvcigpIHsKLSAgICAgICAgVGVzdFByb2Nlc3NvciBhbm5vdGF0aW9uUHJvY2Vzc29yID0gbmV3IFRlc3RQcm9jZXNzb3IoKTsKLSAgICAgICAgYW5ub3RhdGlvblByb2Nlc3Nvci5zZXRBbm5vdGF0aW9uSW5zdGFuY2VDbGFzc05hbWUoQ3VzdG9tQW5ub3RhdGlvbi5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgZGJjID0gbmV3IERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSgpOwotICAgICAgICBkYmMuYWRkQ3VzdG9tQW5ub3RhdGlvblByb2Nlc3Nvcihhbm5vdGF0aW9uUHJvY2Vzc29yKTsKLSAgICAgICAgTWFwPFN0cmluZywgQ3VzdG9tQW5ub3RhdGlvblByb2Nlc3Nvcj4gcHJvY2Vzc29ycyA9IGRiYy5nZXRDdXN0b21Bbm5vdGF0aW9uUHJvY2Vzc29ycygpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHByb2Nlc3NvcnMpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHByb2Nlc3NvcnMudmFsdWVzKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMocHJvY2Vzc29ycy52YWx1ZXMoKS5zaXplKCksIDEpOwotICAgICAgICBDdXN0b21Bbm5vdGF0aW9uUHJvY2Vzc29yIGluc3RhbmNlID0gcHJvY2Vzc29ycy5nZXQoQ3VzdG9tQW5ub3RhdGlvbi5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGluc3RhbmNlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGluc3RhbmNlLmdldENsYXNzKCkuZ2V0TmFtZSgpLCBUZXN0UHJvY2Vzc29yLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhpbnN0YW5jZS5nZXRBbm5vdGF0aW9uSW5zdGFuY2VDbGFzc05hbWUoKSwgQ3VzdG9tQW5ub3RhdGlvbi5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICBDdXN0b21Bbm5vdGF0aW9uIGFubm90YXRpb24gPSBuZXcgQ3VzdG9tQW5ub3RhdGlvbigpOwotICAgICAgICBhbm5vdGF0aW9uLnNldEFubm90YXRpb25DbGFzc05hbWUoQ3VzdG9tLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIGFubm90YXRpb24uc2V0VGFyZ2V0KEVsZW1lbnRUeXBlLlRZUEUpOwotICAgICAgICBhbm5vdGF0aW9uLmFkZFBhcmFtZXRlckRhdGEoIm5hbWUiLCBhbm5vdGF0aW9uLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpKTsKLSAgICAgICAgZGJjLmFkZEN1c3RvbUFubm90YXRpb25JbnN0YW5jZShhbm5vdGF0aW9uKTsKLSAgICAgICAgTGlzdDxDdXN0b21Bbm5vdGF0aW9uSW5zdGFuY2U+IGdhaUxpc3QgPSBkYmMuZ2V0Q3VzdG9tQW5ub3RhdGlvbkluc3RhbmNlcygpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGdhaUxpc3QpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgZ2FpTGlzdC5zaXplKCkpOwotICAgICAgICBDdXN0b21Bbm5vdGF0aW9uSW5zdGFuY2UgZ2FpID0gZ2FpTGlzdC5nZXQoMCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZ2FpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGdhaS5nZXRDbGFzcygpLmdldE5hbWUoKSwgQ3VzdG9tQW5ub3RhdGlvbi5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZ2FpLmdldEFubm90YXRpb25DbGFzc05hbWUoKSwgQ3VzdG9tLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhnYWkuZ2V0VGFyZ2V0KCksIEVsZW1lbnRUeXBlLlRZUEUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZ2FpLmdldFBhcmFtZXRlckRhdGEoIm5hbWUiKSwgZ2FpLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpKTsKLSAgICAgICAgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4ID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGdhaS5nZXRQYXJhbWV0ZXJEYXRhKCJ1bmtub3duIik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlhZSkgewotICAgICAgICAgICAgZXggPSBpYWU7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChleCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBnYWkuYWRkUGFyYW1ldGVyRGF0YSgidW5rbm93biIsIG51bGwpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpYWUpIHsKLSAgICAgICAgICAgIGV4ID0gaWFlOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZXgpOwotICAgIH0KLSAgICAKLSAgICBjbGFzcyBUZXN0UHJvY2Vzc29yIGltcGxlbWVudHMgQ3VzdG9tQW5ub3RhdGlvblByb2Nlc3NvciB7Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIFN0cmluZyBhbm5vdGF0aW9uSW5zdGFuY2VDbGFzc05hbWU7Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uSW5zdGFuY2VDbGFzc05hbWUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gYW5ub3RhdGlvbkluc3RhbmNlQ2xhc3NOYW1lOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgdm9pZCBzZXRBbm5vdGF0aW9uSW5zdGFuY2VDbGFzc05hbWUoU3RyaW5nIGFubm90YXRpb25JbnN0YW5jZUNsYXNzTmFtZSkgewotICAgICAgICAgICAgdGhpcy5hbm5vdGF0aW9uSW5zdGFuY2VDbGFzc05hbWUgPSBhbm5vdGF0aW9uSW5zdGFuY2VDbGFzc05hbWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBwcm9jZXNzVHlwZUxldmVsQW5ub3RhdGlvbihFbmRwb2ludERlc2NyaXB0aW9uIGVkLCBDdXN0b21Bbm5vdGF0aW9uSW5zdGFuY2UgYW5ub3RhdGlvbikgewotICAgICAgICAgICAgLy8gZG8gbm90aGluZywgdGVzdGluZyBwdXJwcm9zZXMgb25seQotICAgICAgICB9Ci0gICAgICAgIAotICAgIH0KLSAgICAKLSAgICBjbGFzcyBDdXN0b21Bbm5vdGF0aW9uIGltcGxlbWVudHMgQ3VzdG9tQW5ub3RhdGlvbkluc3RhbmNlIHsKLQotICAgICAgICBwcml2YXRlIE1hcDxTdHJpbmcsIE9iamVjdD4gZGF0YU1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBFbGVtZW50VHlwZSBlbGVtZW50VHlwZTsKLSAgICAgICAgCi0gICAgICAgIExpc3Q8U3RyaW5nPiBrbm93blBhcmFtTmFtZXM7Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIFN0cmluZyBhbm5vdGF0aW9uQ2xhc3NOYW1lOwotICAgICAgICAKLSAgICAgICAgQ3VzdG9tQW5ub3RhdGlvbihMaXN0PFN0cmluZz4ga25vd25QYXJhbU5hbWVzKSB7Ci0gICAgICAgICAgICB0aGlzLmtub3duUGFyYW1OYW1lcyA9IGtub3duUGFyYW1OYW1lczsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgQ3VzdG9tQW5ub3RhdGlvbigpIHsKLSAgICAgICAgICAgIGtub3duUGFyYW1OYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICAgICAga25vd25QYXJhbU5hbWVzLmFkZCgibmFtZSIpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgdm9pZCBzZXRBbm5vdGF0aW9uQ2xhc3NOYW1lKFN0cmluZyBhbm5vdGF0aW9uQ2xhc3NOYW1lKSB7Ci0gICAgICAgICAgICB0aGlzLmFubm90YXRpb25DbGFzc05hbWUgPSBhbm5vdGF0aW9uQ2xhc3NOYW1lOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25DbGFzc05hbWUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gYW5ub3RhdGlvbkNsYXNzTmFtZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIHZvaWQgYWRkUGFyYW1ldGVyRGF0YShTdHJpbmcgcGFyYW1OYW1lLCBPYmplY3QgdmFsdWUpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotICAgICAgICAgICAgY2hlY2tQYXJhbU5hbWUocGFyYW1OYW1lKTsKLSAgICAgICAgICAgIGRhdGFNYXAucHV0KHBhcmFtTmFtZSwgdmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCBnZXRQYXJhbWV0ZXJEYXRhKFN0cmluZyBwYXJhbU5hbWUpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotICAgICAgICAgICAgY2hlY2tQYXJhbU5hbWUocGFyYW1OYW1lKTsKLSAgICAgICAgICAgIHJldHVybiBkYXRhTWFwLmdldChwYXJhbU5hbWUpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgdm9pZCBzZXRUYXJnZXQoRWxlbWVudFR5cGUgZWxlbWVudFR5cGUpIHsKLSAgICAgICAgICAgIHRoaXMuZWxlbWVudFR5cGUgPSBlbGVtZW50VHlwZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBFbGVtZW50VHlwZSBnZXRUYXJnZXQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gZWxlbWVudFR5cGU7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgdm9pZCBjaGVja1BhcmFtTmFtZShTdHJpbmcgcGFyYW1OYW1lKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGlmKGtub3duUGFyYW1OYW1lcyAhPSBudWxsIAotICAgICAgICAgICAgICAgICAgICAmJiAKLSAgICAgICAgICAgICAgICAgICAgIWtub3duUGFyYW1OYW1lcy5pc0VtcHR5KCkgCi0gICAgICAgICAgICAgICAgICAgICYmIAotICAgICAgICAgICAgICAgICAgICAha25vd25QYXJhbU5hbWVzLmNvbnRhaW5zKHBhcmFtTmFtZSkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgcGFyYW1ldGVyICIgKyBwYXJhbU5hbWUgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGlzIGFuIHVua25vd24gcGFyYW1ldGVyIGZvciB0aGUgQ3VzdG9tQW5ub3RhdGlvbiB0eXBlLiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIEBpbnRlcmZhY2UgQ3VzdG9tIHsKLSAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgIH0KLQotICAgIEBXZWJTZXJ2aWNlCi0gICAgQEN1c3RvbQotICAgIGNsYXNzIEFubm90YXRlZFNlcnZpY2UgewotICAgICAgICBwdWJsaWMgU3RyaW5nIGVjaG8oU3RyaW5nIGVjaG9TdHJpbmcpIHsKLSAgICAgICAgICAgIHJldHVybiBlY2hvU3RyaW5nOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2J1aWxkZXIvUGFyYW1ldGVyUGFyc2luZ1Rlc3RzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9QYXJhbWV0ZXJQYXJzaW5nVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzcyZTBjOC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9QYXJhbWV0ZXJQYXJzaW5nVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IGphdmF4LnhtbC53cy5Ib2xkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKiBUZXN0cyB0aGUgcGFyc2luZyBvZiBHZW5lcmljcyB0aGF0IGFyZSB1c2VkIGluIHRoZSBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgcHJvY2Vzc2luZy4gKi8KLXB1YmxpYyBjbGFzcyBQYXJhbWV0ZXJQYXJzaW5nVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SG9sZGVyKCkgewotICAgICAgICBTdHJpbmcgaG9sZGVySW5wdXRTdHJpbmcgPSAiamF2YXgueG1sLndzLkhvbGRlcjxqYXZhLmxhbmcuT2JqZWN0PiI7Ci0gICAgICAgIFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlIHBkYyA9IG5ldyBQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZSgpOwotICAgICAgICBwZGMuc2V0UGFyYW1ldGVyVHlwZShob2xkZXJJbnB1dFN0cmluZyk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiamF2YXgueG1sLndzLkhvbGRlcjxqYXZhLmxhbmcuT2JqZWN0PiIsIHBkYy5nZXRQYXJhbWV0ZXJUeXBlKCkpOwotCi0gICAgICAgIGFzc2VydFRydWUoRGVzY3JpcHRpb25CdWlsZGVyVXRpbHMuaXNIb2xkZXJUeXBlKGhvbGRlcklucHV0U3RyaW5nKSk7Ci0gICAgICAgIGFzc2VydFRydWUocGRjLmlzSG9sZGVyVHlwZSgpKTsKLSAgICAgICAgU3RyaW5nIGhvbGRlclJlc3VsdFN0cmluZyA9IERlc2NyaXB0aW9uQnVpbGRlclV0aWxzLmdldFJhd1R5cGUoaG9sZGVySW5wdXRTdHJpbmcpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImphdmF4LnhtbC53cy5Ib2xkZXIiLCBob2xkZXJSZXN1bHRTdHJpbmcpOwotICAgICAgICBob2xkZXJSZXN1bHRTdHJpbmcgPSBwZGMuZ2V0UmF3VHlwZSgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImphdmF4LnhtbC53cy5Ib2xkZXIiLCBob2xkZXJSZXN1bHRTdHJpbmcpOwotICAgICAgICBqYXZheC54bWwud3MuSG9sZGVyIHZhbGlkYXRlSG9sZGVyID0gbmV3IGphdmF4LnhtbC53cy5Ib2xkZXIoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbGlkYXRlSG9sZGVyLmdldENsYXNzKCksIHBkYy5nZXRQYXJhbWV0ZXJUeXBlQ2xhc3MoKSk7Ci0KLSAgICAgICAgU3RyaW5nIGFjdHVhbFR5cGVSZXN1bHQgPSBEZXNjcmlwdGlvbkJ1aWxkZXJVdGlscy5nZXRIb2xkZXJBY3R1YWxUeXBlKGhvbGRlcklucHV0U3RyaW5nKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuT2JqZWN0IiwgYWN0dWFsVHlwZVJlc3VsdCk7Ci0gICAgICAgIGFjdHVhbFR5cGVSZXN1bHQgPSBwZGMuZ2V0SG9sZGVyQWN0dWFsVHlwZSgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImphdmEubGFuZy5PYmplY3QiLCBhY3R1YWxUeXBlUmVzdWx0KTsKLSAgICAgICAgamF2YS5sYW5nLk9iamVjdCB2YWxpZGF0ZU9iamVjdCA9IG5ldyBqYXZhLmxhbmcuT2JqZWN0KCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyh2YWxpZGF0ZU9iamVjdC5nZXRDbGFzcygpLCBwZGMuZ2V0SG9sZGVyQWN0dWFsVHlwZUNsYXNzKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RIb2xkZXJNeU9iamVjdCgpIHsKLSAgICAgICAgUGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGUgcGRjID0gbmV3IFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlKCk7Ci0gICAgICAgIHBkYy5zZXRQYXJhbWV0ZXJUeXBlKAotICAgICAgICAgICAgICAgICJqYXZheC54bWwud3MuSG9sZGVyPG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5NeU9iamVjdD4iKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJqYXZheC54bWwud3MuSG9sZGVyPG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5NeU9iamVjdD4iLAotICAgICAgICAgICAgICAgICAgICAgcGRjLmdldFBhcmFtZXRlclR5cGUoKSk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZShwZGMuaXNIb2xkZXJUeXBlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImphdmF4LnhtbC53cy5Ib2xkZXIiLCBwZGMuZ2V0UmF3VHlwZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEhvbGRlci5jbGFzcywgcGRjLmdldFBhcmFtZXRlclR5cGVDbGFzcygpKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoIm9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5NeU9iamVjdCIsCi0gICAgICAgICAgICAgICAgICAgICBwZGMuZ2V0SG9sZGVyQWN0dWFsVHlwZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKE15T2JqZWN0LmNsYXNzLCBwZGMuZ2V0SG9sZGVyQWN0dWFsVHlwZUNsYXNzKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3ROb25Ib2xkZXJHZW5yaWMoKSB7Ci0gICAgICAgIFN0cmluZyBpbnB1dFN0cmluZyA9ICJqYXZhLnV0aWwuTGlzdDxvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuTXlPYmplY3Q+IjsKLSAgICAgICAgUGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGUgcGRjID0gbmV3IFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlKCk7Ci0gICAgICAgIHBkYy5zZXRQYXJhbWV0ZXJUeXBlKGlucHV0U3RyaW5nKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJqYXZhLnV0aWwuTGlzdDxvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuTXlPYmplY3Q+IiwKLSAgICAgICAgICAgICAgICAgICAgIHBkYy5nZXRQYXJhbWV0ZXJUeXBlKCkpOwotCi0gICAgICAgIGFzc2VydEZhbHNlKHBkYy5pc0hvbGRlclR5cGUoKSk7Ci0gICAgICAgIFN0cmluZyBnZW5lcmljVHlwZSA9IHBkYy5nZXRSYXdUeXBlKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiamF2YS51dGlsLkxpc3QiLCBnZW5lcmljVHlwZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhqYXZhLnV0aWwuTGlzdC5jbGFzcywgcGRjLmdldFBhcmFtZXRlclR5cGVDbGFzcygpKTsKLQotICAgICAgICAvLyBUaGlzIHNob3VsZCBiZSBudWxsIHNpbmNlIHRoZSBnZW5lcmljIGlzIG5vdCBhIEhvbGRlciB0eXBlCi0gICAgICAgIFN0cmluZyBhY3R1YWxQYXJhbSA9IHBkYy5nZXRIb2xkZXJBY3R1YWxUeXBlKCk7Ci0gICAgICAgIGFzc2VydE51bGwoYWN0dWFsUGFyYW0pOwotICAgICAgICBhc3NlcnROdWxsKHBkYy5nZXRIb2xkZXJBY3R1YWxUeXBlQ2xhc3MoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEhvbGRlckdlbmVyaWMoKSB7Ci0gICAgICAgIFN0cmluZyBob2xkZXJJbnB1dFN0cmluZyA9ICJqYXZheC54bWwud3MuSG9sZGVyPGphdmEudXRpbC5MaXN0PGphdmEubGFuZy5PYmplY3Q+PiI7Ci0gICAgICAgIFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlIHBkYyA9IG5ldyBQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZSgpOwotICAgICAgICBwZGMuc2V0UGFyYW1ldGVyVHlwZShob2xkZXJJbnB1dFN0cmluZyk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiamF2YXgueG1sLndzLkhvbGRlcjxqYXZhLnV0aWwuTGlzdDxqYXZhLmxhbmcuT2JqZWN0Pj4iLAotICAgICAgICAgICAgICAgICAgICAgcGRjLmdldFBhcmFtZXRlclR5cGUoKSk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZShwZGMuaXNIb2xkZXJUeXBlKCkpOwotICAgICAgICBTdHJpbmcgaG9sZGVyUmVzdWx0U3RyaW5nID0gcGRjLmdldFJhd1R5cGUoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJqYXZheC54bWwud3MuSG9sZGVyIiwgaG9sZGVyUmVzdWx0U3RyaW5nKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEhvbGRlci5jbGFzcywgcGRjLmdldFBhcmFtZXRlclR5cGVDbGFzcygpKTsKLQotICAgICAgICBTdHJpbmcgYWN0dWFsVHlwZVJlc3VsdCA9IHBkYy5nZXRIb2xkZXJBY3R1YWxUeXBlKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiamF2YS51dGlsLkxpc3QiLCBhY3R1YWxUeXBlUmVzdWx0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKExpc3QuY2xhc3MsIHBkYy5nZXRIb2xkZXJBY3R1YWxUeXBlQ2xhc3MoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFByaW1pdGl2ZXNFbmNvZGVkKCkgewotICAgICAgICBTdHJpbmdbXSBwcmltaXRpdmVzVG9UZXN0ID0geyAiWiIsICJCIiwgIkMiLCAiRCIsICJGIiwgIkkiLCAiSiIsICJTIiwgIlYiIH07Ci0gICAgICAgIENsYXNzW10gcHJpbWl0aXZlQ2xhc3NlcyA9IHsgYm9vbGVhbi5jbGFzcywgYnl0ZS5jbGFzcywgY2hhci5jbGFzcywgZG91YmxlLmNsYXNzLAotICAgICAgICAgICAgICAgIGZsb2F0LmNsYXNzLCBpbnQuY2xhc3MsIGxvbmcuY2xhc3MsIHNob3J0LmNsYXNzLCB2b2lkLmNsYXNzIH07Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcmltaXRpdmVzVG9UZXN0Lmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBhc3NlcnRGYWxzZShEZXNjcmlwdGlvbkJ1aWxkZXJVdGlscy5pc0hvbGRlclR5cGUocHJpbWl0aXZlc1RvVGVzdFtpXSkpOwotICAgICAgICAgICAgYXNzZXJ0TnVsbChEZXNjcmlwdGlvbkJ1aWxkZXJVdGlscy5nZXRSYXdUeXBlKHByaW1pdGl2ZXNUb1Rlc3RbaV0pKTsKLSAgICAgICAgICAgIFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlIHBkYyA9IG5ldyBQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZSgpOwotICAgICAgICAgICAgcGRjLnNldFBhcmFtZXRlclR5cGUocHJpbWl0aXZlc1RvVGVzdFtpXSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocHJpbWl0aXZlQ2xhc3Nlc1tpXSwgcGRjLmdldFBhcmFtZXRlclR5cGVDbGFzcygpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQcmltaXRpdmVzKCkgewotICAgICAgICBTdHJpbmdbXSBwcmltaXRpdmVzVG9UZXN0ID0KLSAgICAgICAgICAgICAgICB7ICJib29sZWFuIiwgImJ5dGUiLCAiY2hhciIsICJkb3VibGUiLCAiZmxvYXQiLCAiaW50IiwgImxvbmciLCAic2hvcnQiLCAidm9pZCIgfTsKLSAgICAgICAgQ2xhc3NbXSBwcmltaXRpdmVDbGFzc2VzID0geyBib29sZWFuLmNsYXNzLCBieXRlLmNsYXNzLCBjaGFyLmNsYXNzLCBkb3VibGUuY2xhc3MsCi0gICAgICAgICAgICAgICAgZmxvYXQuY2xhc3MsIGludC5jbGFzcywgbG9uZy5jbGFzcywgc2hvcnQuY2xhc3MsIHZvaWQuY2xhc3MgfTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByaW1pdGl2ZXNUb1Rlc3QubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGFzc2VydEZhbHNlKERlc2NyaXB0aW9uQnVpbGRlclV0aWxzLmlzSG9sZGVyVHlwZShwcmltaXRpdmVzVG9UZXN0W2ldKSk7Ci0gICAgICAgICAgICBhc3NlcnROdWxsKERlc2NyaXB0aW9uQnVpbGRlclV0aWxzLmdldFJhd1R5cGUocHJpbWl0aXZlc1RvVGVzdFtpXSkpOwotICAgICAgICAgICAgUGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGUgcGRjID0gbmV3IFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlKCk7Ci0gICAgICAgICAgICBwZGMuc2V0UGFyYW1ldGVyVHlwZShwcmltaXRpdmVzVG9UZXN0W2ldKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhwcmltaXRpdmVDbGFzc2VzW2ldLCBwZGMuZ2V0UGFyYW1ldGVyVHlwZUNsYXNzKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFByaW1pdGl2ZUFycmF5cygpIHsKLSAgICAgICAgU3RyaW5nW10gcHJpbWl0aXZlc1RvVGVzdCA9IHsgImJvb2xlYW5bXSIsICJieXRlW10iLCAiY2hhcltdIiwgImRvdWJsZVtdIiwgImZsb2F0W10iLAotICAgICAgICAgICAgICAgICJpbnRbXSIsICJsb25nW10iLCAic2hvcnRbXSIgfTsKLSAgICAgICAgQ2xhc3NbXSBwcmltaXRpdmVDbGFzc2VzID0geyBib29sZWFuW10uY2xhc3MsIGJ5dGVbXS5jbGFzcywgY2hhcltdLmNsYXNzLCBkb3VibGVbXS5jbGFzcywKLSAgICAgICAgICAgICAgICBmbG9hdFtdLmNsYXNzLCBpbnRbXS5jbGFzcywgbG9uZ1tdLmNsYXNzLCBzaG9ydFtdLmNsYXNzIH07Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcmltaXRpdmVzVG9UZXN0Lmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZSBwZGMgPSBuZXcgUGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGUoKTsKLSAgICAgICAgICAgIHBkYy5zZXRQYXJhbWV0ZXJUeXBlKHByaW1pdGl2ZXNUb1Rlc3RbaV0pOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHByaW1pdGl2ZUNsYXNzZXNbaV0sIHBkYy5nZXRQYXJhbWV0ZXJUeXBlQ2xhc3MoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UHJpbWl0aXZlTXVsdGlEaW1BcnJheXMoKSB7Ci0gICAgICAgIFN0cmluZ1tdIHByaW1pdGl2ZXNUb1Rlc3QgPSB7ICJib29sZWFuW11bXSIsICJieXRlW11bXVtdIiwgImNoYXJbXVtdW11bXSIsCi0gICAgICAgICAgICAgICAgImRvdWJsZVtdW11bXVtdW10iLCAiZmxvYXRbXVtdW11bXVtdW10iLCAiaW50W10iLCAibG9uZ1tdIiwgInNob3J0W10iIH07Ci0gICAgICAgIENsYXNzW10gcHJpbWl0aXZlQ2xhc3NlcyA9IHsgYm9vbGVhbltdW10uY2xhc3MsIGJ5dGVbXVtdW10uY2xhc3MsIGNoYXJbXVtdW11bXS5jbGFzcywKLSAgICAgICAgICAgICAgICBkb3VibGVbXVtdW11bXVtdLmNsYXNzLCBmbG9hdFtdW11bXVtdW11bXS5jbGFzcywgaW50W10uY2xhc3MsIGxvbmdbXS5jbGFzcywKLSAgICAgICAgICAgICAgICBzaG9ydFtdLmNsYXNzIH07Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJpbWl0aXZlc1RvVGVzdC5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgUGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGUgcGRjID0gbmV3IFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlKCk7Ci0gICAgICAgICAgICBwZGMuc2V0UGFyYW1ldGVyVHlwZShwcmltaXRpdmVzVG9UZXN0W2ldKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhwcmltaXRpdmVDbGFzc2VzW2ldLCBwZGMuZ2V0UGFyYW1ldGVyVHlwZUNsYXNzKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEphdmFMYW5nT2JqZWN0QXJyYXlzKCkgewotICAgICAgICBQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZSBwZGNPYmplY3QgPSBuZXcgUGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGUoKTsKLSAgICAgICAgcGRjT2JqZWN0LnNldFBhcmFtZXRlclR5cGUoImphdmEubGFuZy5PYmplY3RbXSIpOwotICAgICAgICBPYmplY3RbXSB2ZXJpZnlPYmplY3QgPSBuZXcgT2JqZWN0WzVdOwotICAgICAgICBhc3NlcnRFcXVhbHModmVyaWZ5T2JqZWN0LmdldENsYXNzKCksIHBkY09iamVjdC5nZXRQYXJhbWV0ZXJUeXBlQ2xhc3MoKSk7Ci0KLSAgICAgICAgUGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGUgcGRjU3RyaW5nID0gbmV3IFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlKCk7Ci0gICAgICAgIHBkY1N0cmluZy5zZXRQYXJhbWV0ZXJUeXBlKCJqYXZhLmxhbmcuU3RyaW5nW11bXVtdIik7Ci0gICAgICAgIFN0cmluZ1tdW11bXSB2ZXJpZnlTdHJpbmcgPSBuZXcgU3RyaW5nWzVdWzFdWzNdOwotICAgICAgICBhc3NlcnRFcXVhbHModmVyaWZ5U3RyaW5nLmdldENsYXNzKCksIHBkY1N0cmluZy5nZXRQYXJhbWV0ZXJUeXBlQ2xhc3MoKSk7Ci0KLSAgICAgICAgUGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGUgcGRjSW50ZWdlciA9IG5ldyBQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZSgpOwotICAgICAgICBwZGNJbnRlZ2VyLnNldFBhcmFtZXRlclR5cGUoImphdmEubGFuZy5JbnRlZ2VyW11bXVtdW10iKTsKLSAgICAgICAgSW50ZWdlcltdW11bXVtdIHZlcmlmeUludGVnZXIgPSBuZXcgSW50ZWdlcls1XVsxXVszXVsxMl07Ci0gICAgICAgIGFzc2VydEVxdWFscyh2ZXJpZnlJbnRlZ2VyLmdldENsYXNzKCksIHBkY0ludGVnZXIuZ2V0UGFyYW1ldGVyVHlwZUNsYXNzKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNeU9iamVjdEFycmF5KCkgewotICAgICAgICBQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZSBwZGMgPSBuZXcgUGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGUoKTsKLSAgICAgICAgcGRjLnNldFBhcmFtZXRlclR5cGUoIm9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5NeU9iamVjdFtdW10iKTsKLSAgICAgICAgTXlPYmplY3RbXVtdIG15T2JqZWN0ID0gbmV3IE15T2JqZWN0WzJdWzNdOwotICAgICAgICBhc3NlcnRFcXVhbHMobXlPYmplY3QuZ2V0Q2xhc3MoKSwgcGRjLmdldFBhcmFtZXRlclR5cGVDbGFzcygpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SG9sZGVyT2ZQcmltaXRpdmVBcnJheSgpIHsKLSAgICAgICAgUGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGUgcGRjID0gbmV3IFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlKCk7Ci0gICAgICAgIHBkYy5zZXRQYXJhbWV0ZXJUeXBlKCJqYXZheC54bWwud3MuSG9sZGVyPGJ5dGVbXT4iKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJqYXZheC54bWwud3MuSG9sZGVyPGJ5dGVbXT4iLCBwZGMuZ2V0UGFyYW1ldGVyVHlwZSgpKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoSG9sZGVyLmNsYXNzLCBwZGMuZ2V0UGFyYW1ldGVyVHlwZUNsYXNzKCkpOwotICAgICAgICBieXRlIFtdIHZhbGlkYXRlQnl0ZUFycmF5ID0gbmV3IGJ5dGVbMTBdOwotICAgICAgICBhc3NlcnRFcXVhbHModmFsaWRhdGVCeXRlQXJyYXkuZ2V0Q2xhc3MoKSwgcGRjLmdldEhvbGRlckFjdHVhbFR5cGVDbGFzcygpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SG9sZGVyT2ZNeU9iamVjdEFycmF5KCkgewotICAgICAgICBQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZSBwZGMgPSBuZXcgUGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGUoKTsKLSAgICAgICAgcGRjLnNldFBhcmFtZXRlclR5cGUoCi0gICAgICAgICAgICAgICAgImphdmF4LnhtbC53cy5Ib2xkZXI8b3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLk15T2JqZWN0W11bXT4iKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJqYXZheC54bWwud3MuSG9sZGVyPG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5NeU9iamVjdFtdW10+IiwKLSAgICAgICAgICAgICAgICAgICAgIHBkYy5nZXRQYXJhbWV0ZXJUeXBlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoSG9sZGVyLmNsYXNzLCBwZGMuZ2V0UGFyYW1ldGVyVHlwZUNsYXNzKCkpOwotICAgICAgICBNeU9iamVjdFtdW10gdmFsaWRhdGVNeU9iamVjdCA9IG5ldyBNeU9iamVjdFs1XVsxMF07Ci0gICAgICAgIGFzc2VydEVxdWFscyh2YWxpZGF0ZU15T2JqZWN0LmdldENsYXNzKCksIHBkYy5nZXRIb2xkZXJBY3R1YWxUeXBlQ2xhc3MoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEhvbGRlck9mU3RyaW5nQXJyYXkoKSB7Ci0gICAgICAgIFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlIHBkYyA9IG5ldyBQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZSgpOwotICAgICAgICBwZGMuc2V0UGFyYW1ldGVyVHlwZSgiamF2YXgueG1sLndzLkhvbGRlcjxqYXZhLmxhbmcuU3RyaW5nW10+Iik7Ci0gICAgICAgIGFzc2VydEVxdWFscygiamF2YXgueG1sLndzLkhvbGRlcjxqYXZhLmxhbmcuU3RyaW5nW10+IiwgcGRjLmdldFBhcmFtZXRlclR5cGUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhTdHJpbmdbXS5jbGFzcywgcGRjLmdldEhvbGRlckFjdHVhbFR5cGVDbGFzcygpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nQXJyYXkoKSB7Ci0gICAgICAgIFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlIHBkYyA9IG5ldyBQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZSgpOwotICAgICAgICBwZGMuc2V0UGFyYW1ldGVyVHlwZSgiamF2YS5sYW5nLlN0cmluZ1tdIik7Ci0gICAgICAgIGFzc2VydEVxdWFscygiamF2YS5sYW5nLlN0cmluZ1tdIiwgcGRjLmdldFBhcmFtZXRlclR5cGUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhTdHJpbmdbXS5jbGFzcywgcGRjLmdldFBhcmFtZXRlclR5cGVDbGFzcygpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SG9sZGVyT2ZHZW5lcmljQXJyYXkoKSB7Ci0gICAgICAgIFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlIHBkYyA9IG5ldyBQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZSgpOwotICAgICAgICBwZGMuc2V0UGFyYW1ldGVyVHlwZSgiamF2YXgueG1sLndzLkhvbGRlcjxqYXZhLnV0aWwuTGlzdDxqYXZhLmxhbmcuU3RyaW5nPltdPiIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImphdmF4LnhtbC53cy5Ib2xkZXI8amF2YS51dGlsLkxpc3Q8amF2YS5sYW5nLlN0cmluZz5bXT4iLAotICAgICAgICAgICAgICAgICAgICAgcGRjLmdldFBhcmFtZXRlclR5cGUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhMaXN0W10uY2xhc3MsIHBkYy5nZXRIb2xkZXJBY3R1YWxUeXBlQ2xhc3MoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEhvbGRlck9mR2VuZXJpY0FycmF5TXVsdGlEaW1lbnNpb24oKSB7Ci0gICAgICAgIFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlIHBkYyA9IG5ldyBQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZSgpOwotICAgICAgICBwZGMuc2V0UGFyYW1ldGVyVHlwZSgiamF2YXgueG1sLndzLkhvbGRlcjxqYXZhLnV0aWwuTGlzdDxqYXZhLmxhbmcuU3RyaW5nPltdW11bXT4iKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJqYXZheC54bWwud3MuSG9sZGVyPGphdmEudXRpbC5MaXN0PGphdmEubGFuZy5TdHJpbmc+W11bXVtdPiIsCi0gICAgICAgICAgICAgICAgICAgICBwZGMuZ2V0UGFyYW1ldGVyVHlwZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKExpc3RbXVtdW10uY2xhc3MsIHBkYy5nZXRIb2xkZXJBY3R1YWxUeXBlQ2xhc3MoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEhvbGRlck9mR2VuZXJpY1dpbGRjYXJkQXJyYXkoKSB7Ci0gICAgICAgIFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlIHBkYyA9IG5ldyBQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZSgpOwotICAgICAgICBwZGMuc2V0UGFyYW1ldGVyVHlwZSgiamF2YXgueG1sLndzLkhvbGRlcjxqYXZhLnV0aWwuTGlzdDw/PltdPiIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImphdmF4LnhtbC53cy5Ib2xkZXI8amF2YS51dGlsLkxpc3Q8Pz5bXT4iLCBwZGMuZ2V0UGFyYW1ldGVyVHlwZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKExpc3RbXS5jbGFzcywgcGRjLmdldEhvbGRlckFjdHVhbFR5cGVDbGFzcygpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2VuZXJpY0FycmF5KCkgewotICAgICAgICBQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZSBwZGMgPSBuZXcgUGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGUoKTsKLSAgICAgICAgcGRjLnNldFBhcmFtZXRlclR5cGUoImphdmEudXRpbC5MaXN0PGphdmEubGFuZy5TdHJpbmc+W10iKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJqYXZhLnV0aWwuTGlzdDxqYXZhLmxhbmcuU3RyaW5nPltdIiwgcGRjLmdldFBhcmFtZXRlclR5cGUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhMaXN0W10uY2xhc3MsIHBkYy5nZXRQYXJhbWV0ZXJUeXBlQ2xhc3MoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEdlbmVyaWNBcnJheU11bHRpRGltZW5zaW9uKCkgewotICAgICAgICBQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZSBwZGMgPSBuZXcgUGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGUoKTsKLSAgICAgICAgcGRjLnNldFBhcmFtZXRlclR5cGUoImphdmEudXRpbC5MaXN0PGphdmEubGFuZy5TdHJpbmc+W11bXSIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImphdmEudXRpbC5MaXN0PGphdmEubGFuZy5TdHJpbmc+W11bXSIsIHBkYy5nZXRQYXJhbWV0ZXJUeXBlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoTGlzdFtdW10uY2xhc3MsIHBkYy5nZXRQYXJhbWV0ZXJUeXBlQ2xhc3MoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEdlbmVyaWNXaWxkQ2FyZEFycmF5KCkgewotICAgICAgICBQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZSBwZGMgPSBuZXcgUGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGUoKTsKLSAgICAgICAgcGRjLnNldFBhcmFtZXRlclR5cGUoImphdmEudXRpbC5MaXN0PD8+W10iKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJqYXZhLnV0aWwuTGlzdDw/PltdIiwgcGRjLmdldFBhcmFtZXRlclR5cGUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhMaXN0W10uY2xhc3MsIHBkYy5nZXRQYXJhbWV0ZXJUeXBlQ2xhc3MoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEdlbmVyaWNBcnJheU9mU3RyaW5nQXJyYXkoKSB7Ci0gICAgICAgIFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlIHBkYyA9IG5ldyBQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZSgpOwotICAgICAgICBwZGMuc2V0UGFyYW1ldGVyVHlwZSgiamF2YS51dGlsLkxpc3Q8amF2YS5sYW5nLlN0cmluZ1tdPltdIik7Ci0gICAgICAgIGFzc2VydEVxdWFscygiamF2YS51dGlsLkxpc3Q8amF2YS5sYW5nLlN0cmluZ1tdPltdIiwgcGRjLmdldFBhcmFtZXRlclR5cGUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhMaXN0W10uY2xhc3MsIHBkYy5nZXRQYXJhbWV0ZXJUeXBlQ2xhc3MoKSk7Ci0gICAgfQotfQotCi1jbGFzcyBNeU9iamVjdCB7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9SZXR1cm5UeXBlUGFyc2luZ1Rlc3RzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9SZXR1cm5UeXBlUGFyc2luZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmY2U0YWIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2J1aWxkZXIvUmV0dXJuVHlwZVBhcnNpbmdUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqIFRlc3RzIHRoZSBwYXJzaW5nIG9mIEdlbmVyaWNzIHRoYXQgYXJlIHVzZWQgaW4gdGhlIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBwcm9jZXNzaW5nLiAqLwotcHVibGljIGNsYXNzIFJldHVyblR5cGVQYXJzaW5nVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9uSG9sZGVyR2VucmljKCkgewotICAgICAgICBTdHJpbmcgaW5wdXRTdHJpbmcgPQotICAgICAgICAgICAgICAgICJqYXZhLnV0aWwuTGlzdDxvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuTXlSZXR1cm5UZXN0T2JqZWN0PiI7Ci0gICAgICAgIE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlIG1kYyA9IG5ldyBNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSgpOwotICAgICAgICBtZGMuc2V0UmV0dXJuVHlwZShpbnB1dFN0cmluZyk7Ci0gICAgICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgICAgICAgICAiamF2YS51dGlsLkxpc3Q8b3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLk15UmV0dXJuVGVzdE9iamVjdD4iLAotICAgICAgICAgICAgICAgIG1kYy5nZXRSZXR1cm5UeXBlKCkpOwotCi0gICAgICAgIGFzc2VydEVxdWFscyhqYXZhLnV0aWwuTGlzdC5jbGFzcywgbWRjLmdldFJldHVyblR5cGVDbGFzcygpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UHJpbWl0aXZlc0VuY29kZWQoKSB7Ci0gICAgICAgIFN0cmluZ1tdIHByaW1pdGl2ZXNUb1Rlc3QgPSB7ICJaIiwgIkIiLCAiQyIsICJEIiwgIkYiLCAiSSIsICJKIiwgIlMiLAotICAgICAgICAgICAgICAgICJWIiB9OwotICAgICAgICBDbGFzc1tdIHByaW1pdGl2ZUNsYXNzZXMgPSB7IGJvb2xlYW4uY2xhc3MsIGJ5dGUuY2xhc3MsIGNoYXIuY2xhc3MsCi0gICAgICAgICAgICAgICAgZG91YmxlLmNsYXNzLCBmbG9hdC5jbGFzcywgaW50LmNsYXNzLCBsb25nLmNsYXNzLCBzaG9ydC5jbGFzcywKLSAgICAgICAgICAgICAgICB2b2lkLmNsYXNzIH07Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcmltaXRpdmVzVG9UZXN0Lmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBhc3NlcnROdWxsKERlc2NyaXB0aW9uQnVpbGRlclV0aWxzLmdldFJhd1R5cGUocHJpbWl0aXZlc1RvVGVzdFtpXSkpOwotICAgICAgICAgICAgTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUgbWRjID0gbmV3IE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlKCk7Ci0gICAgICAgICAgICBtZGMuc2V0UmV0dXJuVHlwZShwcmltaXRpdmVzVG9UZXN0W2ldKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhwcmltaXRpdmVDbGFzc2VzW2ldLCBtZGMuZ2V0UmV0dXJuVHlwZUNsYXNzKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFByaW1pdGl2ZXMoKSB7Ci0gICAgICAgIFN0cmluZ1tdIHByaW1pdGl2ZXNUb1Rlc3QgPSB7ICJib29sZWFuIiwgImJ5dGUiLCAiY2hhciIsICJkb3VibGUiLAotICAgICAgICAgICAgICAgICJmbG9hdCIsICJpbnQiLCAibG9uZyIsICJzaG9ydCIsICJ2b2lkIiB9OwotICAgICAgICBDbGFzc1tdIHByaW1pdGl2ZUNsYXNzZXMgPSB7IGJvb2xlYW4uY2xhc3MsIGJ5dGUuY2xhc3MsIGNoYXIuY2xhc3MsCi0gICAgICAgICAgICAgICAgZG91YmxlLmNsYXNzLCBmbG9hdC5jbGFzcywgaW50LmNsYXNzLCBsb25nLmNsYXNzLCBzaG9ydC5jbGFzcywKLSAgICAgICAgICAgICAgICB2b2lkLmNsYXNzIH07Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcmltaXRpdmVzVG9UZXN0Lmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBhc3NlcnROdWxsKERlc2NyaXB0aW9uQnVpbGRlclV0aWxzLmdldFJhd1R5cGUocHJpbWl0aXZlc1RvVGVzdFtpXSkpOwotICAgICAgICAgICAgTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUgbWRjID0gbmV3IE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlKCk7Ci0gICAgICAgICAgICBtZGMuc2V0UmV0dXJuVHlwZShwcmltaXRpdmVzVG9UZXN0W2ldKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhwcmltaXRpdmVDbGFzc2VzW2ldLCBtZGMuZ2V0UmV0dXJuVHlwZUNsYXNzKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFByaW1pdGl2ZUFycmF5cygpIHsKLSAgICAgICAgU3RyaW5nW10gcHJpbWl0aXZlc1RvVGVzdCA9IHsgImJvb2xlYW5bXSIsICJieXRlW10iLCAiY2hhcltdIiwKLSAgICAgICAgICAgICAgICAiZG91YmxlW10iLCAiZmxvYXRbXSIsICJpbnRbXSIsICJsb25nW10iLCAic2hvcnRbXSIgfTsKLSAgICAgICAgQ2xhc3NbXSBwcmltaXRpdmVDbGFzc2VzID0geyBib29sZWFuW10uY2xhc3MsIGJ5dGVbXS5jbGFzcywKLSAgICAgICAgICAgICAgICBjaGFyW10uY2xhc3MsIGRvdWJsZVtdLmNsYXNzLCBmbG9hdFtdLmNsYXNzLCBpbnRbXS5jbGFzcywKLSAgICAgICAgICAgICAgICBsb25nW10uY2xhc3MsIHNob3J0W10uY2xhc3MgfTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByaW1pdGl2ZXNUb1Rlc3QubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlIG1kYyA9IG5ldyBNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSgpOwotICAgICAgICAgICAgbWRjLnNldFJldHVyblR5cGUocHJpbWl0aXZlc1RvVGVzdFtpXSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocHJpbWl0aXZlQ2xhc3Nlc1tpXSwgbWRjLmdldFJldHVyblR5cGVDbGFzcygpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQcmltaXRpdmVNdWx0aURpbUFycmF5cygpIHsKLSAgICAgICAgU3RyaW5nW10gcHJpbWl0aXZlc1RvVGVzdCA9IHsgImJvb2xlYW5bXVtdIiwgImJ5dGVbXVtdW10iLAotICAgICAgICAgICAgICAgICJjaGFyW11bXVtdW10iLCAiZG91YmxlW11bXVtdW11bXSIsICJmbG9hdFtdW11bXVtdW11bXSIsCi0gICAgICAgICAgICAgICAgImludFtdIiwgImxvbmdbXSIsICJzaG9ydFtdIiB9OwotICAgICAgICBDbGFzc1tdIHByaW1pdGl2ZUNsYXNzZXMgPSB7IGJvb2xlYW5bXVtdLmNsYXNzLCBieXRlW11bXVtdLmNsYXNzLAotICAgICAgICAgICAgICAgIGNoYXJbXVtdW11bXS5jbGFzcywgZG91YmxlW11bXVtdW11bXS5jbGFzcywKLSAgICAgICAgICAgICAgICBmbG9hdFtdW11bXVtdW11bXS5jbGFzcywgaW50W10uY2xhc3MsIGxvbmdbXS5jbGFzcywKLSAgICAgICAgICAgICAgICBzaG9ydFtdLmNsYXNzIH07Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJpbWl0aXZlc1RvVGVzdC5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUgbWRjID0gbmV3IE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlKCk7Ci0gICAgICAgICAgICBtZGMuc2V0UmV0dXJuVHlwZShwcmltaXRpdmVzVG9UZXN0W2ldKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhwcmltaXRpdmVDbGFzc2VzW2ldLCBtZGMuZ2V0UmV0dXJuVHlwZUNsYXNzKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEphdmFMYW5nT2JqZWN0QXJyYXlzKCkgewotICAgICAgICBNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSBwZGNPYmplY3QgPSBuZXcgTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUoKTsKLSAgICAgICAgcGRjT2JqZWN0LnNldFJldHVyblR5cGUoImphdmEubGFuZy5PYmplY3RbXSIpOwotICAgICAgICBPYmplY3RbXSB2ZXJpZnlPYmplY3QgPSBuZXcgT2JqZWN0WzVdOwotICAgICAgICBhc3NlcnRFcXVhbHModmVyaWZ5T2JqZWN0LmdldENsYXNzKCksIHBkY09iamVjdC5nZXRSZXR1cm5UeXBlQ2xhc3MoKSk7Ci0KLSAgICAgICAgTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUgcGRjU3RyaW5nID0gbmV3IE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlKCk7Ci0gICAgICAgIHBkY1N0cmluZy5zZXRSZXR1cm5UeXBlKCJqYXZhLmxhbmcuU3RyaW5nW11bXVtdIik7Ci0gICAgICAgIFN0cmluZ1tdW11bXSB2ZXJpZnlTdHJpbmcgPSBuZXcgU3RyaW5nWzVdWzFdWzNdOwotICAgICAgICBhc3NlcnRFcXVhbHModmVyaWZ5U3RyaW5nLmdldENsYXNzKCksIHBkY1N0cmluZy5nZXRSZXR1cm5UeXBlQ2xhc3MoKSk7Ci0KLSAgICAgICAgTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUgcGRjSW50ZWdlciA9IG5ldyBNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSgpOwotICAgICAgICBwZGNJbnRlZ2VyLnNldFJldHVyblR5cGUoImphdmEubGFuZy5JbnRlZ2VyW11bXVtdW10iKTsKLSAgICAgICAgSW50ZWdlcltdW11bXVtdIHZlcmlmeUludGVnZXIgPSBuZXcgSW50ZWdlcls1XVsxXVszXVsxMl07Ci0gICAgICAgIGFzc2VydEVxdWFscyh2ZXJpZnlJbnRlZ2VyLmdldENsYXNzKCksIHBkY0ludGVnZXIKLSAgICAgICAgICAgICAgICAuZ2V0UmV0dXJuVHlwZUNsYXNzKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNeU9iamVjdEFycmF5KCkgewotICAgICAgICBNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSBtZGMgPSBuZXcgTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUoKTsKLSAgICAgICAgbWRjLnNldFJldHVyblR5cGUoIm9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5NeVJldHVyblRlc3RPYmplY3RbXVtdIik7Ci0gICAgICAgIE15UmV0dXJuVGVzdE9iamVjdFtdW10gbXlPYmplY3QgPSBuZXcgTXlSZXR1cm5UZXN0T2JqZWN0WzJdWzNdOwotICAgICAgICBhc3NlcnRFcXVhbHMobXlPYmplY3QuZ2V0Q2xhc3MoKSwgbWRjLmdldFJldHVyblR5cGVDbGFzcygpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXJyYXlMaXN0T2ZQcmltaXRpdmVBcnJheSgpIHsKLSAgICAgICAgTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUgbWRjID0gbmV3IE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlKCk7Ci0gICAgICAgIG1kYy5zZXRSZXR1cm5UeXBlKCJqYXZhLnV0aWwuQXJyYXlMaXN0PGJ5dGVbXT4iKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJqYXZhLnV0aWwuQXJyYXlMaXN0PGJ5dGVbXT4iLCBtZGMuZ2V0UmV0dXJuVHlwZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEFycmF5TGlzdC5jbGFzcywgbWRjLmdldFJldHVyblR5cGVDbGFzcygpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TGlzdE9mTXlPYmplY3RBcnJheSgpIHsKLSAgICAgICAgTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUgbWRjID0gbmV3IE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlKCk7Ci0gICAgICAgIG1kYy5zZXRSZXR1cm5UeXBlKAotICAgICAgICAgICAgICAgICJqYXZhLnV0aWwuTGlzdDxvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuTXlSZXR1cm5UZXN0T2JqZWN0W11bXT4iKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAgICAgICAgICJqYXZhLnV0aWwuTGlzdDxvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuTXlSZXR1cm5UZXN0T2JqZWN0W11bXT4iLAotICAgICAgICAgICAgICAgIG1kYy5nZXRSZXR1cm5UeXBlKCkpOwotCi0gICAgICAgIGFzc2VydEVxdWFscyhMaXN0LmNsYXNzLCBtZGMuZ2V0UmV0dXJuVHlwZUNsYXNzKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RHZW5lcmljQXJyYXkoKSB7Ci0gICAgICAgIE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlIG1kYyA9IG5ldyBNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSgpOwotICAgICAgICBtZGMuc2V0UmV0dXJuVHlwZSgiamF2YS51dGlsLkxpc3Q8amF2YS5sYW5nLlN0cmluZ1tdPltdIik7Ci0gICAgICAgIGFzc2VydEVxdWFscygiamF2YS51dGlsLkxpc3Q8amF2YS5sYW5nLlN0cmluZ1tdPltdIiwKLSAgICAgICAgICAgICAgICAgICAgIG1kYy5nZXRSZXR1cm5UeXBlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoTGlzdFtdLmNsYXNzLCBtZGMuZ2V0UmV0dXJuVHlwZUNsYXNzKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RHZW5lcmljQXJyYXlNdWx0aURpbWVuc2lvbigpIHsKLSAgICAgICAgTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUgbWRjID0gbmV3IE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlKCk7Ci0gICAgICAgIG1kYy5zZXRSZXR1cm5UeXBlKAotICAgICAgICAgICAgICAgICJqYXZhLnV0aWwuTGlzdDxvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuTXlSZXR1cm5UZXN0T2JqZWN0PltdW10iKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAgICAgICAgICJqYXZhLnV0aWwuTGlzdDxvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuTXlSZXR1cm5UZXN0T2JqZWN0PltdW10iLAotICAgICAgICAgICAgICAgIG1kYy5nZXRSZXR1cm5UeXBlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoTGlzdFtdW10uY2xhc3MsIG1kYy5nZXRSZXR1cm5UeXBlQ2xhc3MoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFdpbGRjYXJkR2VuZXJpY0FycmF5KCkgewotICAgICAgICBNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSBtZGMgPSBuZXcgTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUoKTsKLSAgICAgICAgbWRjLnNldFJldHVyblR5cGUoImphdmEudXRpbC5MaXN0PD8+W10iKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJqYXZhLnV0aWwuTGlzdDw/PltdIiwKLSAgICAgICAgICAgICAgICAgICAgIG1kYy5nZXRSZXR1cm5UeXBlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoTGlzdFtdLmNsYXNzLCBtZGMuZ2V0UmV0dXJuVHlwZUNsYXNzKCkpOwotICAgIH0KLQotfQotCi1jbGFzcyBNeVJldHVyblRlc3RPYmplY3QgewotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2J1aWxkZXIvU3BhcnNlQW5ub3RUZXN0cy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2J1aWxkZXIvU3BhcnNlQW5ub3RUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjUwMGIwLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9idWlsZGVyL1NwYXJzZUFubm90VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXI7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5EZXNjcmlwdGlvbkZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRGVzY3JpcHRpb25UZXN0VXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uU2VydmljZURlc2NyaXB0aW9uOw0KLQ0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOw0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUNsaWVudDsNCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLQ0KLS8qKg0KLSAqIA0KLSAqLw0KLXB1YmxpYyBjbGFzcyBTcGFyc2VBbm5vdFRlc3RzIGV4dGVuZHMgVGVzdENhc2Ugew0KLSAgICBwcml2YXRlIFN0cmluZyBuYW1lc3BhY2VVUkkgPSAiaHR0cDovL29yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5TcGFyc2VBbm5vdFRlc3RzIjsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgc3ZjTG9jYWxQYXJ0ID0gInN2Y0xvY2FsUGFydCI7DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3ROb1NwYXJzZUFubm90KCkgew0KLSAgICAgICAgUU5hbWUgc2VydmljZVFOYW1lID0gbmV3IFFOYW1lKG5hbWVzcGFjZVVSSSwgc3ZjTG9jYWxQYXJ0KTsNCi0gICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzdmNEZXNjID0gDQotICAgICAgICAgICAgRGVzY3JpcHRpb25GYWN0b3J5LmNyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbihudWxsLCBzZXJ2aWNlUU5hbWUsIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3BhcnNlQW5ub3RTZXJ2aWNlU3ViY2xhc3MuY2xhc3MpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzdmNEZXNjKTsNCi0gICAgICAgIC8vIEEgREJDIHdpbGwgYmUgY3JlYXRlZCBmb3IgdXMNCi0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBzdmNEZXNjQ29tcG9zaXRlID0gRGVzY3JpcHRpb25UZXN0VXRpbHMuZ2V0U2VydmljZURlc2NyaXB0aW9uQ29tcG9zaXRlKHN2Y0Rlc2MpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzdmNEZXNjQ29tcG9zaXRlKTsNCi0gICAgICAgIFdlYlNlcnZpY2VDbGllbnQgd3NDbGllbnQgPSBzdmNEZXNjQ29tcG9zaXRlLmdldFdlYlNlcnZpY2VDbGllbnRBbm5vdCgpOw0KLSAgICAgICAgLy8gVGhlcmUgaXMgbm8gREJDIEFubm90IGluIHRoaXMgY2FzZTsgaXQgaXMgdGhlIGNsYXNzIGFubm90YXRpb24gYnV0IGl0IHNob3VsZCBiZSANCi0gICAgICAgIC8vIHJldHVybmVkIGFzIGFuIGluc3RhbmNlIG9mIGEgV2ViU2VydmljZUNsaWVudEFubm90DQotICAgICAgICBhc3NlcnRUcnVlKHdzQ2xpZW50IGluc3RhbmNlb2YgV2ViU2VydmljZUNsaWVudEFubm90KTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIHZvaWQgdGVzdEFzc29jaWF0ZWRDbGFzcygpIHsNCi0gICAgICAgIFFOYW1lIHNlcnZpY2VRTmFtZSA9IG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIHN2Y0xvY2FsUGFydCk7DQotICAgICAgICAvLyBDcmVhdGUgYSBjb21wb3NpdGUgd2l0aCBhIFdlYlNlcnZpY2VDbGllbnQgb3ZlcnJpZGUgb2YgdGhlIFdTREwgbG9jYXRpb24uDQotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSgpOw0KLSAgICAgICAgU3RyaW5nIG92ZXJyaWRlbldzZGxMb2NhdGlvbiA9IERlc2NyaXB0aW9uVGVzdFV0aWxzLmdldFdTRExMb2NhdGlvbigiQ2xpZW50RW5kcG9pbnRNZXRhZGF0YS53c2RsIik7DQotICAgICAgICBXZWJTZXJ2aWNlQ2xpZW50QW5ub3Qgd3NDbGllbnRBbm5vID0gDQotICAgICAgICAgICAgV2ViU2VydmljZUNsaWVudEFubm90LmNyZWF0ZVdlYlNlcnZpY2VDbGllbnRBbm5vdEltcGwobnVsbCwgbnVsbCwgb3ZlcnJpZGVuV3NkbExvY2F0aW9uKTsNCi0gICAgICAgIGNvbXBvc2l0ZS5zZXRXZWJTZXJ2aWNlQ2xpZW50QW5ub3Qod3NDbGllbnRBbm5vKTsNCi0gICAgICAgIE9iamVjdCBjb21wb3NpdGVLZXkgPSAiQ29tcG9zaXRlS2V5IjsNCi0gICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzdmNEZXNjID0gDQotICAgICAgICAgICAgRGVzY3JpcHRpb25GYWN0b3J5LmNyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbihudWxsLCBzZXJ2aWNlUU5hbWUsIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3BhcnNlQW5ub3RTZXJ2aWNlU3ViY2xhc3MuY2xhc3MsIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9zaXRlLCBjb21wb3NpdGVLZXkpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzdmNEZXNjKTsNCi0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBzdmNEZXNjQ29tcG9zaXRlID0gRGVzY3JpcHRpb25UZXN0VXRpbHMuZ2V0U2VydmljZURlc2NyaXB0aW9uQ29tcG9zaXRlKHN2Y0Rlc2MpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzdmNEZXNjQ29tcG9zaXRlKTsNCi0gICAgICAgIGFzc2VydE5vdFNhbWUoY29tcG9zaXRlLCBzdmNEZXNjQ29tcG9zaXRlKTsNCi0gICAgICAgIGFzc2VydFNhbWUoU3BhcnNlQW5ub3RTZXJ2aWNlU3ViY2xhc3MuY2xhc3MsIHN2Y0Rlc2NDb21wb3NpdGUuZ2V0Q29ycmVzcG9uZGluZ0NsYXNzKCkpOw0KLSAgICAgICAgYXNzZXJ0U2FtZShjb21wb3NpdGUsIHN2Y0Rlc2NDb21wb3NpdGUuZ2V0U3BhcnNlQ29tcG9zaXRlKGNvbXBvc2l0ZUtleSkpOw0KLSAgICAgICAgV2ViU2VydmljZUNsaWVudCB3c0NsaWVudCA9IHN2Y0Rlc2NDb21wb3NpdGUuZ2V0V2ViU2VydmljZUNsaWVudEFubm90KCk7DQotICAgICAgICBhc3NlcnRUcnVlKHdzQ2xpZW50IGluc3RhbmNlb2YgV2ViU2VydmljZUNsaWVudEFubm90KTsNCi0gICAgfQ0KLSAgICAvKioNCi0gICAgICogVGhlIFdlYlNlcnZpY2VSZWYgYW5ub3RhdGlvbiBpc24ndCBwcm9jZXNzZWQgYnkgdGhlIEpBWFdTIHJ1bnRpbWUuICBUaGUgY29udGFpbmVyIChpLmUuIHRoZQ0KLSAgICAgKiBjbGllbnQgY29udGFpbmVyLCB3ZWIgY29udGFpbmVyLCBvciBlamIgY29udGFpbmVyKSBwcm9jZXNzZXMgaXQgc2luY2UgaXQgaXMgcmVzcG9uc2libGUgZm9yDQotICAgICAqIGRvaW5nIHJlc291cmNlIGluamVjdGlvbi4gIFRoaXMgbWVhbnMgbm9uZSBvZiB0aGUgb3RoZXIgdGVzdHMgZGVhbCB3aXRoIFdlYlNlcnZpY2VSZWYsIHNvDQotICAgICAqIHRoaXMgc2ltcGxlIHRlc3QgdmFsaWRhdGVzIGEgZmV3IGFzcGVjdHMgb2YgdGhlIGNvbXBvc2l0ZSBhbm5vdGF0aW9uIHByb2Nlc3NpbmcuDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0V2ViU2VydmljZVJlZigpIHsNCi0gICAgICAgIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5XZWJTZXJ2aWNlUmVmQW5ub3Qgd3NyID0gV2ViU2VydmljZVJlZkFubm90LmNyZWF0ZVdlYlNlcnZpY2VSZWZBbm5vdEltcGwoKTsNCi0gICAgICAgIGFzc2VydFRydWUod3NyLm5hbWUoKS5lcXVhbHMoIiIpKTsNCi0gICAgICAgIGFzc2VydFRydWUod3NyLndzZGxMb2NhdGlvbigpLmVxdWFscygiIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiIi5lcXVhbHMod3NyLmdldFR5cGVTdHJpbmcoKSkpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiIi5lcXVhbHMod3NyLmdldFZhbHVlU3RyaW5nKCkpKTsNCi0gICAgICAgIGFzc2VydE51bGwod3NyLnR5cGUoKSk7DQotICAgICAgICBhc3NlcnROdWxsKHdzci52YWx1ZSgpKTsNCi0gICAgICAgIA0KLSAgICAgICAgd3NyID0gV2ViU2VydmljZVJlZkFubm90LmNyZWF0ZVdlYlNlcnZpY2VSZWZBbm5vdEltcGwoIm5hbWUiLCAid3NkbExvY2F0aW9uIiwgU3RyaW5nLmNsYXNzLCBPYmplY3QuY2xhc3MsICJtYXBwZWROYW1lIik7DQotICAgICAgICBhc3NlcnRUcnVlKHdzci5uYW1lKCkuZXF1YWxzKCJuYW1lIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSh3c3Iud3NkbExvY2F0aW9uKCkuZXF1YWxzKCJ3c2RsTG9jYXRpb24iKSk7DQotICAgICAgICBhc3NlcnRUcnVlKCIiLmVxdWFscyh3c3IuZ2V0VHlwZVN0cmluZygpKSk7DQotICAgICAgICBhc3NlcnRUcnVlKCIiLmVxdWFscyh3c3IuZ2V0VmFsdWVTdHJpbmcoKSkpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSh3c3IudHlwZSgpID09IFN0cmluZy5jbGFzcyk7DQotICAgICAgICBhc3NlcnRUcnVlKHdzci52YWx1ZSgpID09IE9iamVjdC5jbGFzcyk7DQotICAgIH0NCi0NCi19DQotDQotQFdlYlNlcnZpY2VDbGllbnQodGFyZ2V0TmFtZXNwYWNlPSJvcmlnaW5hbFROUyIsIHdzZGxMb2NhdGlvbj0ib3JpZ2luYWxXc2RsTG9jYXRpb24iKQ0KLWNsYXNzIFNwYXJzZUFubm90U2VydmljZVN1YmNsYXNzIGV4dGVuZHMgamF2YXgueG1sLndzLlNlcnZpY2Ugew0KLQ0KLSAgICBwcm90ZWN0ZWQgU3BhcnNlQW5ub3RTZXJ2aWNlU3ViY2xhc3MoVVJMIHdzZGxEb2N1bWVudExvY2F0aW9uLCBRTmFtZSBzZXJ2aWNlTmFtZSkgew0KLSAgICAgICAgc3VwZXIod3NkbERvY3VtZW50TG9jYXRpb24sIHNlcnZpY2VOYW1lKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9jb252ZXJ0ZXIvUmVmbGVjdGl2ZUNvbnZlcnRlclRlc3RzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9jb252ZXJ0ZXIvUmVmbGVjdGl2ZUNvbnZlcnRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyZjE3OTkuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2J1aWxkZXIvY29udmVydGVyL1JlZmxlY3RpdmVDb252ZXJ0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLmNvbnZlcnRlcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5NZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuUGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLldlYk1ldGhvZEFubm90OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5XZWJQYXJhbUFubm90OwotaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouQmFzaWNDb25maWd1cmF0b3I7Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViTWV0aG9kOwotaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbTsKLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLQotcHVibGljIGNsYXNzIFJlZmxlY3RpdmVDb252ZXJ0ZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICBzdGF0aWMgewotICAgICAgICAvLyBOb3RlIHlvdSB3aWxsIHByb2JhYmx5IG5lZWQgdG8gaW5jcmVhc2UgdGhlIGphdmEgaGVhcCBzaXplLCBmb3IgZXhhbXBsZQotICAgICAgICAvLyAtWG14NTEybS4gIFRoaXMgY2FuIGJlIGRvbmUgYnkgc2V0dGluZyBtYXZlbi5qdW5pdC5qdm1hcmdzIGluIHByb2plY3QucHJvcGVydGllcy4KLSAgICAgICAgLy8gVG8gY2hhbmdlIHRoZSBzZXR0aW5ncywgZWRpdCB0aGUgbG9nNGoucHJvcGVydHkgZmlsZQotICAgICAgICAvLyBpbiB0aGUgdGVzdC1yZXNvdXJjZXMgZGlyZWN0b3J5LgotICAgICAgICBCYXNpY0NvbmZpZ3VyYXRvci5jb25maWd1cmUoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgaW1wbERCQzsKLSAgICBwcml2YXRlIHN0YXRpYyBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgc2VpREJDOwotCi0gICAgcHVibGljIHZvaWQgc2V0VXAoKSB7Ci0gICAgICAgIEphdmFDbGFzc1RvREJDQ29udmVydGVyIGNvbnZlcnRlciA9IG5ldyBKYXZhQ2xhc3NUb0RCQ0NvbnZlcnRlcihTaW1wbGVTZXJ2aWNlSW1wbC5jbGFzcyk7Ci0gICAgICAgIEhhc2hNYXA8U3RyaW5nLCBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGU+IGRiY01hcCA9IGNvbnZlcnRlci5wcm9kdWNlREJDKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZGJjTWFwKTsKLSAgICAgICAgaW1wbERCQyA9IGRiY01hcC5nZXQoCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5jb252ZXJ0ZXIuU2ltcGxlU2VydmljZUltcGwiKTsKLSAgICAgICAgc2VpREJDID0gZGJjTWFwLmdldCgKLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLmNvbnZlcnRlci5TaW1wbGVTZXJ2aWNlIik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHRlc3RDcmVhdGVJbXBsREJDKCkgewotICAgICAgICBhc3NlcnROb3ROdWxsKGltcGxEQkMpOwotICAgICAgICBXZWJTZXJ2aWNlIHdzQW5ub3QgPSBpbXBsREJDLmdldFdlYlNlcnZpY2VBbm5vdCgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHdzQW5ub3QpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlNpbXBsZVNlcnZpY2UiLCB3c0Fubm90LnNlcnZpY2VOYW1lKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0ZXN0SW1wbE1ldGhvZHMoKSB7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoaW1wbERCQyk7Ci0gICAgICAgIExpc3Q8TWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGU+IG1kY0xpc3QgPSBzb3J0TGlzdChpbXBsREJDLmdldE1ldGhvZERlc2NyaXB0aW9uc0xpc3QoKSk7Ci0gICAgICAgIHNvcnRMaXN0KG1kY0xpc3QpOwotICAgICAgICBhc3NlcnROb3ROdWxsKG1kY0xpc3QpOwotICAgICAgICBhc3NlcnRFcXVhbHMobWRjTGlzdC5zaXplKCksIDMpOwotICAgICAgICBNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSBtZGMgPSBtZGNMaXN0LmdldCgwKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChtZGMpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjxpbml0PiIsIG1kYy5nZXRNZXRob2ROYW1lKCkpOwotICAgICAgICBtZGMgPSBtZGNMaXN0LmdldCgxKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChtZGMpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImludm9rZSIsIG1kYy5nZXRNZXRob2ROYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImphdmEubGFuZy5TdHJpbmciLCBtZGMuZ2V0UmV0dXJuVHlwZSgpKTsKLSAgICAgICAgbWRjID0gbWRjTGlzdC5nZXQoMik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwobWRjKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJpbnZva2UyIiwgbWRjLmdldE1ldGhvZE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiaW50IiwgbWRjLmdldFJldHVyblR5cGUoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHRlc3RJbXBsUGFyYW1zKCkgewotICAgICAgICBhc3NlcnROb3ROdWxsKGltcGxEQkMpOwotICAgICAgICBMaXN0PE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlPiBtZGNMaXN0ID0gc29ydExpc3QoaW1wbERCQy5nZXRNZXRob2REZXNjcmlwdGlvbnNMaXN0KCkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKG1kY0xpc3QpOwotICAgICAgICBhc3NlcnRFcXVhbHMobWRjTGlzdC5zaXplKCksIDMpOwotICAgICAgICBNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSBtZGMgPSBtZGNMaXN0LmdldCgwKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChtZGMpOwotICAgICAgICBMaXN0PFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlPiBwZGNMaXN0ID0gbWRjLmdldFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlTGlzdCgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHBkY0xpc3QpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgcGRjTGlzdC5zaXplKCkpOwotICAgICAgICBtZGMgPSBtZGNMaXN0LmdldCgxKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChtZGMpOwotICAgICAgICBwZGNMaXN0ID0gbWRjLmdldFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlTGlzdCgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHBkY0xpc3QpOwotICAgICAgICBhc3NlcnRFcXVhbHMocGRjTGlzdC5zaXplKCksIDEpOwotICAgICAgICBQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZSBwZGMgPSBwZGNMaXN0LmdldCgwKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJqYXZhLnV0aWwuTGlzdDxqYXZhLmxhbmcuU3RyaW5nPiIsIHBkYy5nZXRQYXJhbWV0ZXJUeXBlKCkpOwotICAgICAgICBtZGMgPSBtZGNMaXN0LmdldCgyKTsKLSAgICAgICAgcGRjTGlzdCA9IG1kYy5nZXRQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZUxpc3QoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChwZGNMaXN0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHBkY0xpc3Quc2l6ZSgpLCAyKTsKLSAgICAgICAgcGRjID0gcGRjTGlzdC5nZXQoMCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiaW50IiwgcGRjLmdldFBhcmFtZXRlclR5cGUoKSk7Ci0gICAgICAgIHBkYyA9IHBkY0xpc3QuZ2V0KDEpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHBkYyk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiaW50IiwgcGRjLmdldFBhcmFtZXRlclR5cGUoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHRlc3RDcmVhdGVTRUlEQkMoKSB7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2VpREJDKTsKLSAgICAgICAgV2ViU2VydmljZSB3c0Fubm90ID0gc2VpREJDLmdldFdlYlNlcnZpY2VBbm5vdCgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHdzQW5ub3QpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlNpbXBsZVNlcnZpY2VQb3J0Iiwgd3NBbm5vdC5uYW1lKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0ZXN0U0VJTWV0aG9kcygpIHsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZWlEQkMpOwotICAgICAgICBMaXN0PE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlPiBtZGNMaXN0ID0gc29ydExpc3Qoc2VpREJDLmdldE1ldGhvZERlc2NyaXB0aW9uc0xpc3QoKSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwobWRjTGlzdCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhtZGNMaXN0LnNpemUoKSwgMik7Ci0gICAgICAgIE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlIG1kYyA9IG1kY0xpc3QuZ2V0KDApOwotICAgICAgICBhc3NlcnRFcXVhbHMoImludm9rZSIsIG1kYy5nZXRNZXRob2ROYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImphdmEubGFuZy5TdHJpbmciLCBtZGMuZ2V0UmV0dXJuVHlwZSgpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChtZGMuZ2V0V2ViTWV0aG9kQW5ub3QoKSk7Ci0gICAgICAgIFdlYk1ldGhvZEFubm90IHdtQW5ub3QgPSBtZGMuZ2V0V2ViTWV0aG9kQW5ub3QoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJpbnZva2UiLCB3bUFubm90Lm9wZXJhdGlvbk5hbWUoKSk7Ci0gICAgICAgIG1kYyA9IG1kY0xpc3QuZ2V0KDEpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImludm9rZTIiLCBtZGMuZ2V0TWV0aG9kTmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJpbnQiLCBtZGMuZ2V0UmV0dXJuVHlwZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdGVzdFNFSVBhcmFtcygpIHsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZWlEQkMpOwotICAgICAgICBMaXN0PE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlPiBtZGNMaXN0ID0gc29ydExpc3Qoc2VpREJDLmdldE1ldGhvZERlc2NyaXB0aW9uc0xpc3QoKSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwobWRjTGlzdCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhtZGNMaXN0LnNpemUoKSwgMik7Ci0gICAgICAgIE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlIG1kYyA9IG1kY0xpc3QuZ2V0KDApOwotICAgICAgICBhc3NlcnROb3ROdWxsKG1kYyk7Ci0gICAgICAgIExpc3Q8UGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGU+IHBkY0xpc3QgPSBtZGMuZ2V0UGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGVMaXN0KCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocGRjTGlzdCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhwZGNMaXN0LnNpemUoKSwgMSk7Ci0gICAgICAgIFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlIHBkYyA9IHBkY0xpc3QuZ2V0KDApOwotICAgICAgICBhc3NlcnROb3ROdWxsKHBkYyk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiamF2YS51dGlsLkxpc3Q8amF2YS5sYW5nLlN0cmluZz4iLCBwZGMuZ2V0UGFyYW1ldGVyVHlwZSgpKTsKLSAgICAgICAgV2ViUGFyYW1Bbm5vdCB3cEFubm90ID0gcGRjLmdldFdlYlBhcmFtQW5ub3QoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh3cEFubm90KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJlY2hvU3RyaW5nIiwgd3BBbm5vdC5uYW1lKCkpOwotICAgICAgICBtZGMgPSBtZGNMaXN0LmdldCgxKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChtZGMpOwotICAgICAgICBwZGNMaXN0ID0gbWRjLmdldFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlTGlzdCgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHBkY0xpc3QpOwotICAgICAgICBhc3NlcnRFcXVhbHMocGRjTGlzdC5zaXplKCksIDIpOwotICAgICAgICBwZGMgPSBwZGNMaXN0LmdldCgwKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChwZGMpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImludCIsIHBkYy5nZXRQYXJhbWV0ZXJUeXBlKCkpOwotICAgICAgICBhc3NlcnROdWxsKHBkYy5nZXRXZWJQYXJhbUFubm90KCkpOwotICAgICAgICBwZGMgPSBwZGNMaXN0LmdldCgxKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChwZGMpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImludCIsIHBkYy5nZXRQYXJhbWV0ZXJUeXBlKCkpOwotICAgICAgICBhc3NlcnROdWxsKHBkYy5nZXRXZWJQYXJhbUFubm90KCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3REQkNIaWVyYXJjaHkoKSB7Ci0gICAgICAgIEphdmFDbGFzc1RvREJDQ29udmVydGVyIGNvbnZlcnRlciA9IG5ldyBKYXZhQ2xhc3NUb0RCQ0NvbnZlcnRlcihDaGlsZENsYXNzLmNsYXNzKTsKLSAgICAgICAgSGFzaE1hcDxTdHJpbmcsIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZT4gZGJjTWFwID0gY29udmVydGVyLnByb2R1Y2VEQkMoKTsKLSAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIGRiYyA9Ci0gICAgICAgICAgICAgICAgZGJjTWFwLmdldCgib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLmNvbnZlcnRlci5DaGlsZENsYXNzIik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZGJjKTsKLSAgICAgICAgTGlzdDxNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZT4gbWRjTGlzdCA9IHNvcnRMaXN0KGRiYy5nZXRNZXRob2REZXNjcmlwdGlvbnNMaXN0KCkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKG1kY0xpc3QpOwotICAgICAgICBhc3NlcnRFcXVhbHMobWRjTGlzdC5zaXplKCksIDMpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjxpbml0PiIsIG1kY0xpc3QuZ2V0KDApLmdldE1ldGhvZE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiZG9BYnN0cmFjdCIsIG1kY0xpc3QuZ2V0KDEpLmdldE1ldGhvZE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiZXh0cmFNZXRob2QiLCBtZGNMaXN0LmdldCgyKS5nZXRNZXRob2ROYW1lKCkpOwotICAgICAgICBkYmMgPSBkYmNNYXAuZ2V0KCJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuY29udmVydGVyLlBhcmVudENsYXNzIik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZGJjKTsKLSAgICAgICAgbWRjTGlzdCA9IHNvcnRMaXN0KGRiYy5nZXRNZXRob2REZXNjcmlwdGlvbnNMaXN0KCkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKG1kY0xpc3QpOwotICAgICAgICBhc3NlcnRFcXVhbHMobWRjTGlzdC5zaXplKCksIDIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjxpbml0PiIsIG1kY0xpc3QuZ2V0KDApLmdldE1ldGhvZE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiZG9QYXJlbnRBYnN0cmFjdCIsIG1kY0xpc3QuZ2V0KDEpLmdldE1ldGhvZE5hbWUoKSk7Ci0gICAgICAgIGRiYyA9IGRiY01hcC5nZXQoIm9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5jb252ZXJ0ZXIuU2VydmljZUludGVyZmFjZSIpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGRiYyk7Ci0gICAgICAgIG1kY0xpc3QgPSBzb3J0TGlzdChkYmMuZ2V0TWV0aG9kRGVzY3JpcHRpb25zTGlzdCgpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChtZGNMaXN0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG1kY0xpc3Quc2l6ZSgpLCAxKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJkb0Fic3RyYWN0IiwgbWRjTGlzdC5nZXQoMCkuZ2V0TWV0aG9kTmFtZSgpKTsKLSAgICAgICAgZGJjID0gZGJjTWFwLmdldCgib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLmNvbnZlcnRlci5Db21tb25TZXJ2aWNlIik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZGJjKTsKLSAgICAgICAgbWRjTGlzdCA9IHNvcnRMaXN0KGRiYy5nZXRNZXRob2REZXNjcmlwdGlvbnNMaXN0KCkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKG1kY0xpc3QpOwotICAgICAgICBhc3NlcnRFcXVhbHMobWRjTGlzdC5zaXplKCksIDEpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImV4dHJhTWV0aG9kIiwgbWRjTGlzdC5nZXQoMCkuZ2V0TWV0aG9kTmFtZSgpKTsKLSAgICAgICAgZGJjID0gZGJjTWFwLmdldCgKLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLmNvbnZlcnRlci5QYXJlbnRTZXJ2aWNlSW50ZXJmYWNlIik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZGJjKTsKLSAgICAgICAgbWRjTGlzdCA9IHNvcnRMaXN0KGRiYy5nZXRNZXRob2REZXNjcmlwdGlvbnNMaXN0KCkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKG1kY0xpc3QpOwotICAgICAgICBhc3NlcnRFcXVhbHMobWRjTGlzdC5zaXplKCksIDEpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImRvUGFyZW50QWJzdHJhY3QiLCBtZGNMaXN0LmdldCgwKS5nZXRNZXRob2ROYW1lKCkpOwotICAgICAgICBkYmMgPSBkYmNNYXAuZ2V0KCJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuY29udmVydGVyLkFic3RyYWN0U2VydmljZSIpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGRiYyk7Ci0gICAgICAgIG1kY0xpc3QgPSBzb3J0TGlzdChkYmMuZ2V0TWV0aG9kRGVzY3JpcHRpb25zTGlzdCgpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChtZGNMaXN0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG1kY0xpc3Quc2l6ZSgpLCAyKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI8aW5pdD4iLCBtZGNMaXN0LmdldCgwKS5nZXRNZXRob2ROYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInNvbWVBYnN0cmFjdE1ldGhvZCIsIG1kY0xpc3QuZ2V0KDEpLmdldE1ldGhvZE5hbWUoKSk7Ci0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlPiBzb3J0TGlzdChMaXN0PE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlPiBtZGMpIHsKLSAgICAgICAgQ29tcGFyYXRvcjxNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZT4gYyA9IG5ldyBDb21wYXJhdG9yPE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlPigpIHsKLSAgICAgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSBtZGMxLCBNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSBvMikgewotICAgICAgICAgICAgICAgIHJldHVybiBtZGMxLmdldE1ldGhvZE5hbWUoKS5jb21wYXJlVG8obzIuZ2V0TWV0aG9kTmFtZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgQ29sbGVjdGlvbnMuc29ydChtZGMsIGMpOwotICAgICAgICByZXR1cm4gbWRjOwotICAgIH0KLX0KLQotQFdlYlNlcnZpY2Uoc2VydmljZU5hbWUgPSAiU2ltcGxlU2VydmljZSIsIGVuZHBvaW50SW50ZXJmYWNlID0gIm9yZy5hcGFjaGUuYXhpczIuamF4d3MuIiArCi0gICAgICAgICJkZXNjcmlwdGlvbi5idWlsZGVyLmNvbnZlcnRlci5TaW1wbGVTZXJ2aWNlIikKLWNsYXNzIFNpbXBsZVNlcnZpY2VJbXBsIHsKLSAgICBwdWJsaWMgU2ltcGxlU2VydmljZUltcGwoKSB7Ci0gICAgfQotCi0gICAgOwotCi0gICAgcHVibGljIFN0cmluZyBpbnZva2UoTGlzdDxTdHJpbmc+IG15UGFyYW0pIHsKLSAgICAgICAgcmV0dXJuIG15UGFyYW0uZ2V0KDApOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgaW52b2tlMihpbnQgbnVtMSwgaW50IG51bTIpIHsKLSAgICAgICAgcmV0dXJuIG51bTEgKyBudW0yOwotICAgIH0KLX0KLQotQFdlYlNlcnZpY2UobmFtZSA9ICJTaW1wbGVTZXJ2aWNlUG9ydCIpCi1pbnRlcmZhY2UgU2ltcGxlU2VydmljZSB7Ci0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lID0gImludm9rZSIpCi0gICAgcHVibGljIFN0cmluZyBpbnZva2UoQFdlYlBhcmFtKG5hbWUgPSAiZWNob1N0cmluZyIpIExpc3Q8U3RyaW5nPiBhcmcxKTsKLQotICAgIHB1YmxpYyBpbnQgaW52b2tlMihpbnQgYXJnMSwgaW50IGFyZzIpOwotfQotCi1AV2ViU2VydmljZShzZXJ2aWNlTmFtZSA9ICJJbmhlcml0YW5jZVRlc3RDaGlsZCIpCi1jbGFzcyBDaGlsZENsYXNzIGV4dGVuZHMgUGFyZW50Q2xhc3MgaW1wbGVtZW50cyBTZXJ2aWNlSW50ZXJmYWNlLCBDb21tb25TZXJ2aWNlIHsKLSAgICBwdWJsaWMgQ2hpbGRDbGFzcygpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkb0Fic3RyYWN0KCkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGV4dHJhTWV0aG9kKCkgewotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm90ZWN0ZWRDaGlsZE1ldGhvZCgpIHsgICAgICAgIAotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgcHJpdmF0ZUNoaWxkTWV0aG9kKCkgeyAgICAgICAgCi0gICAgfQotfQotCi1AV2ViU2VydmljZShzZXJ2aWNlTmFtZSA9ICJJbmhlcnRpYW5jZVRlc3RQYXJlbnQiKQotY2xhc3MgUGFyZW50Q2xhc3MgZXh0ZW5kcyBBYnN0cmFjdFNlcnZpY2UgaW1wbGVtZW50cyBQYXJlbnRTZXJ2aWNlSW50ZXJmYWNlIHsKLSAgICBwdWJsaWMgUGFyZW50Q2xhc3MoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZG9QYXJlbnRBYnN0cmFjdCgpIHsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm90ZWN0ZWRQYXJlbnRNZXRob2QoKSB7ICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIHByaXZhdGVQYXJlbnRNZXRob2QoKSB7ICAgICAgICAKLSAgICB9Ci19Ci0KLWludGVyZmFjZSBTZXJ2aWNlSW50ZXJmYWNlIHsKLSAgICBwdWJsaWMgdm9pZCBkb0Fic3RyYWN0KCk7Ci19Ci0KLWludGVyZmFjZSBDb21tb25TZXJ2aWNlIHsKLSAgICBwdWJsaWMgdm9pZCBleHRyYU1ldGhvZCgpOwotfQotCi1pbnRlcmZhY2UgUGFyZW50U2VydmljZUludGVyZmFjZSB7Ci0gICAgcHVibGljIHZvaWQgZG9QYXJlbnRBYnN0cmFjdCgpOwotfQotCi1jbGFzcyBBYnN0cmFjdFNlcnZpY2UgewotICAgIHB1YmxpYyB2b2lkIHNvbWVBYnN0cmFjdE1ldGhvZCgpIHsKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9lY2hvL0VjaG8uamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9lY2hvL0VjaG8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTgxZTg2NS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vZWNoby9FY2hvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmVjaG87DQotDQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzVHlwZTsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7DQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudDsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlOw0KLQ0KLQ0KLS8qKg0KLSAqIDxwPkphdmEgY2xhc3MgZm9yIGVjaG8gY29tcGxleCB0eXBlLg0KLSAqIDxwLz4NCi0gKiA8cD5UaGUgZm9sbG93aW5nIHNjaGVtYSBmcmFnbWVudCBzcGVjaWZpZXMgdGhlIGV4cGVjdGVkIGNvbnRlbnQgY29udGFpbmVkIHdpdGhpbiB0aGlzIGNsYXNzLg0KLSAqIDxwLz4NCi0gKiA8cHJlPg0KLSAqICZsdDtjb21wbGV4VHlwZSBuYW1lPSJlY2hvIj4NCi0gKiAgICZsdDtjb21wbGV4Q29udGVudD4NCi0gKiAgICAgJmx0O3Jlc3RyaWN0aW9uIGJhc2U9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1hbnlUeXBlIj4NCi0gKiAgICAgICAmbHQ7c2VxdWVuY2U+DQotICogICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJ0ZXh0IiB0eXBlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9c3RyaW5nIi8+DQotICogICAgICAgJmx0Oy9zZXF1ZW5jZT4NCi0gKiAgICAgJmx0Oy9yZXN0cmljdGlvbj4NCi0gKiAgICZsdDsvY29tcGxleENvbnRlbnQ+DQotICogJmx0Oy9jb21wbGV4VHlwZT4NCi0gKiA8L3ByZT4NCi0gKi8NCi1AWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpDQotQFhtbFR5cGUobmFtZSA9ICJlY2hvIiwgcHJvcE9yZGVyID0gew0KLSAgICAgICAgInRleHQiDQotICAgICAgICB9KQ0KLXB1YmxpYyBjbGFzcyBFY2hvIHsNCi0NCi0gICAgQFhtbEVsZW1lbnQocmVxdWlyZWQgPSB0cnVlLCBuaWxsYWJsZSA9IHRydWUpDQotICAgIHByb3RlY3RlZCBTdHJpbmcgdGV4dDsNCi0NCi0gICAgLyoqDQotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSB0ZXh0IHByb3BlcnR5Lg0KLSAgICAgKg0KLSAgICAgKiBAcmV0dXJuIHBvc3NpYmxlIG9iamVjdCBpcyB7QGxpbmsgU3RyaW5nIH0NCi0gICAgICovDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsNCi0gICAgICAgIHJldHVybiB0ZXh0Ow0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgdGV4dCBwcm9wZXJ0eS4NCi0gICAgICoNCi0gICAgICogQHBhcmFtIHZhbHVlIGFsbG93ZWQgb2JqZWN0IGlzIHtAbGluayBTdHJpbmcgfQ0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgdmFsdWUpIHsNCi0gICAgICAgIHRoaXMudGV4dCA9IHZhbHVlOw0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9lY2hvL0VjaG9Qb3J0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vZWNoby9FY2hvUG9ydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTNkNmJmLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9lY2hvL0VjaG9Qb3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmVjaG87DQotDQotaW1wb3J0IGphdmF4Lmp3cy5XZWJNZXRob2Q7DQotaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbTsNCi1pbXBvcnQgamF2YXguandzLldlYlBhcmFtLk1vZGU7DQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuSG9sZGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuUmVxdWVzdFdyYXBwZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5SZXNwb25zZVdyYXBwZXI7DQotDQotDQotLyoqIFRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBieSB0aGUgSkFYV1MgU0kuIEpBWC1XUyBSSSAyLjAtYjI2LWVhMyBHZW5lcmF0ZWQgc291cmNlIHZlcnNpb246IDIuMCAqLw0KLUBXZWJTZXJ2aWNlKG5hbWUgPSAiRWNob1BvcnQiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvdGVzdHMiLA0KLSAgICAgICAgICAgIHdzZGxMb2NhdGlvbiA9ICJcXHdvcmtcXGFwcHNcXGVjbGlwc2VcXHdvcmtzcGFjZVxcYXhpczItbGl2ZVxcbW9kdWxlc1xcamF4d3NcXHRlc3QtcmVzb3VyY2VzXFx3c2RsXFxXU0RMVGVzdHMud3NkbCIpDQotcHVibGljIGludGVyZmFjZSBFY2hvUG9ydCB7DQotDQotDQotICAgIC8qKiBAcGFyYW0gdGV4dCAgKi8NCi0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lID0gIkVjaG8iLCBhY3Rpb24gPSAiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvdGVzdHMvZWNobyIpDQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAiRWNobyIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi90ZXN0cyIsDQotICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSAib3JnLmFwYWNoZS53cy5heGlzMi50ZXN0cy5FY2hvIikNCi0gICAgQFJlc3BvbnNlV3JhcHBlcihsb2NhbE5hbWUgPSAiRWNob1Jlc3BvbnNlIiwNCi0gICAgICAgICAgICAgICAgICAgICB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvdGVzdHMiLA0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZSA9ICJvcmcuYXBhY2hlLndzLmF4aXMyLnRlc3RzLkVjaG9SZXNwb25zZSIpDQotICAgIHB1YmxpYyB2b2lkIGVjaG8oDQotICAgICAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAidGV4dCIsIHRhcmdldE5hbWVzcGFjZSA9ICIiLCBtb2RlID0gTW9kZS5JTk9VVCkgSG9sZGVyPFN0cmluZz4gdGV4dCk7DQotDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9lY2hvL0VjaG9SZXNwb25zZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2VjaG8vRWNob1Jlc3BvbnNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3NzUzMTEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2VjaG8vRWNob1Jlc3BvbnNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmVjaG87DQotDQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzVHlwZTsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7DQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudDsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlOw0KLQ0KLQ0KLS8qKg0KLSAqIDxwPkphdmEgY2xhc3MgZm9yIGVjaG9SZXNwb25zZSBjb21wbGV4IHR5cGUuDQotICogPHAvPg0KLSAqIDxwPlRoZSBmb2xsb3dpbmcgc2NoZW1hIGZyYWdtZW50IHNwZWNpZmllcyB0aGUgZXhwZWN0ZWQgY29udGVudCBjb250YWluZWQgd2l0aGluIHRoaXMgY2xhc3MuDQotICogPHAvPg0KLSAqIDxwcmU+DQotICogJmx0O2NvbXBsZXhUeXBlIG5hbWU9ImVjaG9SZXNwb25zZSI+DQotICogICAmbHQ7Y29tcGxleENvbnRlbnQ+DQotICogICAgICZsdDtyZXN0cmljdGlvbiBiYXNlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9YW55VHlwZSI+DQotICogICAgICAgJmx0O3NlcXVlbmNlPg0KLSAqICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0idGV4dCIgdHlwZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfXN0cmluZyIvPg0KLSAqICAgICAgICZsdDsvc2VxdWVuY2U+DQotICogICAgICZsdDsvcmVzdHJpY3Rpb24+DQotICogICAmbHQ7L2NvbXBsZXhDb250ZW50Pg0KLSAqICZsdDsvY29tcGxleFR5cGU+DQotICogPC9wcmU+DQotICovDQotQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKQ0KLUBYbWxUeXBlKG5hbWUgPSAiZWNob1Jlc3BvbnNlIiwgcHJvcE9yZGVyID0gew0KLSAgICAgICAgInRleHQiDQotICAgICAgICB9KQ0KLXB1YmxpYyBjbGFzcyBFY2hvUmVzcG9uc2Ugew0KLQ0KLSAgICBAWG1sRWxlbWVudChyZXF1aXJlZCA9IHRydWUsIG5pbGxhYmxlID0gdHJ1ZSkNCi0gICAgcHJvdGVjdGVkIFN0cmluZyB0ZXh0Ow0KLQ0KLSAgICAvKioNCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIHRleHQgcHJvcGVydHkuDQotICAgICAqDQotICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzIHtAbGluayBTdHJpbmcgfQ0KLSAgICAgKi8NCi0gICAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkgew0KLSAgICAgICAgcmV0dXJuIHRleHQ7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSB0ZXh0IHByb3BlcnR5Lg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gdmFsdWUgYWxsb3dlZCBvYmplY3QgaXMge0BsaW5rIFN0cmluZyB9DQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBzZXRUZXh0KFN0cmluZyB2YWx1ZSkgew0KLSAgICAgICAgdGhpcy50ZXh0ID0gdmFsdWU7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2VjaG8vRWNob1NlcnZpY2UuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9lY2hvL0VjaG9TZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5OTUwMjcuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2VjaG8vRWNob1NlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uZWNobzsNCi0NCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJFbmRwb2ludDsNCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VDbGllbnQ7DQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLQ0KLS8qKiBUaGlzIGNsYXNzIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIEpBWFdTIFNJLiBKQVgtV1MgUkkgMi4wLWIyNi1lYTMgR2VuZXJhdGVkIHNvdXJjZSB2ZXJzaW9uOiAyLjAgKi8NCi1AV2ViU2VydmljZUNsaWVudChuYW1lID0gIkVjaG9TZXJ2aWNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL3Rlc3RzIiwNCi0gICAgICAgICAgICAgICAgICB3c2RsTG9jYXRpb24gPSAiXFx3b3JrXFxhcHBzXFxlY2xpcHNlXFx3b3Jrc3BhY2VcXGF4aXMyLWxpdmVcXG1vZHVsZXNcXGpheHdzXFx0ZXN0LXJlc291cmNlc1xcd3NkbFxcV1NETFRlc3RzLndzZGwiKQ0KLXB1YmxpYyBjbGFzcyBFY2hvU2VydmljZQ0KLSAgICAgICAgZXh0ZW5kcyBTZXJ2aWNlIHsNCi0NCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgVVJMIFdTRExfTE9DQVRJT047DQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFFOYW1lIEVDSE9TRVJWSUNFID0NCi0gICAgICAgICAgICBuZXcgUU5hbWUoImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL3Rlc3RzIiwgIkVjaG9TZXJ2aWNlIik7DQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFFOYW1lIEVDSE9QT1JUID0gbmV3IFFOYW1lKCJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi90ZXN0cyIsICJFY2hvUG9ydCIpOw0KLQ0KLSAgICBzdGF0aWMgew0KLSAgICAgICAgVVJMIHVybCA9IG51bGw7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIHVybCA9DQotICAgICAgICAgICAgICAgICAgICBuZXcgVVJMKCJmaWxlOi9DOi93b3JrL2FwcHMvZWNsaXBzZS93b3Jrc3BhY2UvYXhpczItbGl2ZS9tb2R1bGVzL2pheHdzL3Rlc3QtcmVzb3VyY2VzL3dzZGwvV1NETFRlc3RzLndzZGwiKTsNCi0gICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIFdTRExfTE9DQVRJT04gPSB1cmw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEVjaG9TZXJ2aWNlKFVSTCB3c2RsTG9jYXRpb24sIFFOYW1lIHNlcnZpY2VOYW1lKSB7DQotICAgICAgICBzdXBlcih3c2RsTG9jYXRpb24sIHNlcnZpY2VOYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgRWNob1NlcnZpY2UoKSB7DQotICAgICAgICBzdXBlcihXU0RMX0xPQ0FUSU9OLCBFQ0hPU0VSVklDRSk7DQotICAgIH0NCi0NCi0gICAgLyoqIEByZXR1cm4gcmV0dXJucyBFY2hvUG9ydCAqLw0KLSAgICBAV2ViRW5kcG9pbnQobmFtZSA9ICJFY2hvUG9ydCIpDQotICAgIHB1YmxpYyBFY2hvUG9ydCBnZXRFY2hvUG9ydCgpIHsNCi0gICAgICAgIHJldHVybiAoRWNob1BvcnQpc3VwZXIuZ2V0UG9ydChFQ0hPUE9SVCwgRWNob1BvcnQuY2xhc3MpOw0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9lY2hvL0VjaG9TZXJ2aWNlSW1wbFdpdGhTRUkuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9lY2hvL0VjaG9TZXJ2aWNlSW1wbFdpdGhTRUkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjg2OTIzZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vZWNoby9FY2hvU2VydmljZUltcGxXaXRoU0VJLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmVjaG87DQotDQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuSG9sZGVyOw0KLQ0KLS8qKg0KLSAqIA0KLSAqLw0KLUBXZWJTZXJ2aWNlKHNlcnZpY2VOYW1lID0gIkVjaG9TZXJ2aWNlIiwgZW5kcG9pbnRJbnRlcmZhY2UgPSAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5lY2hvLkVjaG9Qb3J0IikNCi1wdWJsaWMgY2xhc3MgRWNob1NlcnZpY2VJbXBsV2l0aFNFSSB7DQotICAgIHB1YmxpYyB2b2lkIGVjaG8oSG9sZGVyPFN0cmluZz4gdGV4dCkgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotDQotDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9lY2hvL09iamVjdEZhY3RvcnkuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9lY2hvL09iamVjdEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdjODBkYy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vZWNoby9PYmplY3RGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmVjaG87DQotDQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJFbGVtZW50Ow0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnREZWNsOw0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJlZ2lzdHJ5Ow0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOw0KLQ0KLQ0KLS8qKg0KLSAqIFRoaXMgb2JqZWN0IGNvbnRhaW5zIGZhY3RvcnkgbWV0aG9kcyBmb3IgZWFjaCBKYXZhIGNvbnRlbnQgaW50ZXJmYWNlIGFuZCBKYXZhIGVsZW1lbnQgaW50ZXJmYWNlDQotICogZ2VuZXJhdGVkIGluIHRoZSBvcmcuYXBhY2hlLndzLmF4aXMyLnRlc3RzIHBhY2thZ2UuIDxwPkFuIE9iamVjdEZhY3RvcnkgYWxsb3dzIHlvdSB0bw0KLSAqIHByb2dyYW1hdGljYWxseSBjb25zdHJ1Y3QgbmV3IGluc3RhbmNlcyBvZiB0aGUgSmF2YSByZXByZXNlbnRhdGlvbiBmb3IgWE1MIGNvbnRlbnQuIFRoZSBKYXZhDQotICogcmVwcmVzZW50YXRpb24gb2YgWE1MIGNvbnRlbnQgY2FuIGNvbnNpc3Qgb2Ygc2NoZW1hIGRlcml2ZWQgaW50ZXJmYWNlcyBhbmQgY2xhc3NlcyByZXByZXNlbnRpbmcNCi0gKiB0aGUgYmluZGluZyBvZiBzY2hlbWEgdHlwZSBkZWZpbml0aW9ucywgZWxlbWVudCBkZWNsYXJhdGlvbnMgYW5kIG1vZGVsIGdyb3Vwcy4gIEZhY3RvcnkgbWV0aG9kcw0KLSAqIGZvciBlYWNoIG9mIHRoZXNlIGFyZSBwcm92aWRlZCBpbiB0aGlzIGNsYXNzLg0KLSAqLw0KLUBYbWxSZWdpc3RyeQ0KLXB1YmxpYyBjbGFzcyBPYmplY3RGYWN0b3J5IHsNCi0NCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgUU5hbWUgX0VjaG9SZXNwb25zZV9RTkFNRSA9DQotICAgICAgICAgICAgbmV3IFFOYW1lKCJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi90ZXN0cyIsICJFY2hvUmVzcG9uc2UiKTsNCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgUU5hbWUgX0VjaG9fUU5BTUUgPSBuZXcgUU5hbWUoImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL3Rlc3RzIiwgIkVjaG8iKTsNCi0NCi0gICAgLyoqDQotICAgICAqIENyZWF0ZSBhIG5ldyBPYmplY3RGYWN0b3J5IHRoYXQgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIG5ldyBpbnN0YW5jZXMgb2Ygc2NoZW1hIGRlcml2ZWQgY2xhc3Nlcw0KLSAgICAgKiBmb3IgcGFja2FnZTogb3JnLmFwYWNoZS53cy5heGlzMi50ZXN0cw0KLSAgICAgKi8NCi0gICAgcHVibGljIE9iamVjdEZhY3RvcnkoKSB7DQotICAgIH0NCi0NCi0gICAgLyoqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgRWNob1Jlc3BvbnNlIH0gKi8NCi0gICAgcHVibGljIEVjaG9SZXNwb25zZSBjcmVhdGVFY2hvUmVzcG9uc2UoKSB7DQotICAgICAgICByZXR1cm4gbmV3IEVjaG9SZXNwb25zZSgpOw0KLSAgICB9DQotDQotICAgIC8qKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEVjaG8gfSAqLw0KLSAgICBwdWJsaWMgRWNobyBjcmVhdGVFY2hvKCkgew0KLSAgICAgICAgcmV0dXJuIG5ldyBFY2hvKCk7DQotICAgIH0NCi0NCi0gICAgLyoqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgSkFYQkVsZW1lbnQgfXtAY29kZSA8fXtAbGluayBFY2hvUmVzcG9uc2UgfXtAY29kZSA+fX0gKi8NCi0gICAgQFhtbEVsZW1lbnREZWNsKG5hbWVzcGFjZSA9ICJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi90ZXN0cyIsIG5hbWUgPSAiRWNob1Jlc3BvbnNlIikNCi0gICAgcHVibGljIEpBWEJFbGVtZW50PEVjaG9SZXNwb25zZT4gY3JlYXRlRWNob1Jlc3BvbnNlKEVjaG9SZXNwb25zZSB2YWx1ZSkgew0KLSAgICAgICAgcmV0dXJuIG5ldyBKQVhCRWxlbWVudDxFY2hvUmVzcG9uc2U+KF9FY2hvUmVzcG9uc2VfUU5BTUUsIEVjaG9SZXNwb25zZS5jbGFzcywgbnVsbCwgdmFsdWUpOw0KLSAgICB9DQotDQotICAgIC8qKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEpBWEJFbGVtZW50IH17QGNvZGUgPH17QGxpbmsgRWNobyB9e0Bjb2RlID59fSAqLw0KLSAgICBAWG1sRWxlbWVudERlY2wobmFtZXNwYWNlID0gImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL3Rlc3RzIiwgbmFtZSA9ICJFY2hvIikNCi0gICAgcHVibGljIEpBWEJFbGVtZW50PEVjaG8+IGNyZWF0ZUVjaG8oRWNobyB2YWx1ZSkgew0KLSAgICAgICAgcmV0dXJuIG5ldyBKQVhCRWxlbWVudDxFY2hvPihfRWNob19RTkFNRSwgRWNoby5jbGFzcywgbnVsbCwgdmFsdWUpOw0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9lY2hvL3BhY2thZ2UtaW5mby5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2VjaG8vcGFja2FnZS1pbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViYjdkNDUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2VjaG8vcGFja2FnZS1pbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotQGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sU2NoZW1hKG5hbWVzcGFjZSA9ICJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi90ZXN0cyIpDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmVjaG87DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2ZlYXR1cmUvQWRkcmVzc2luZ0ZlYXR1cmVUZXN0cy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2ZlYXR1cmUvQWRkcmVzc2luZ0ZlYXR1cmVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTkyZjZkLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9mZWF0dXJlL0FkZHJlc3NpbmdGZWF0dXJlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uZmVhdHVyZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuQWRkcmVzc2luZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRGVzY3JpcHRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRW5kcG9pbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLlNlcnZpY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuVXRpbHM7Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC53cy5zb2FwLkFkZHJlc3Npbmc7Ci0KLXB1YmxpYyBjbGFzcyBBZGRyZXNzaW5nRmVhdHVyZVRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBucyA9ICJodHRwOi8vamF4d3MuYXhpczIuYXBhY2hlLm9yZy9tZXRhZGF0YS9mZWF0dXJlL2FkZHJlc3NpbmciOwotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBkZWZhdWx0U2VydmljZVBvcnROYW1lID0gIkRlZmF1bHRTZXJ2aWNlUG9ydCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHBsYWluU2VydmljZVBvcnROYW1lID0gIlBsYWluU2VydmljZVBvcnQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBkaXNhYmxlZFNlcnZpY2VQb3J0TmFtZSA9ICJEaXNhYmxlZFNlcnZpY2VQb3J0IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgcmVxdWlyZWRTZXJ2aWNlUG9ydE5hbWUgPSAiUmVxdWlyZWRTZXJ2aWNlUG9ydCI7Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdE5vQW5ub3RhdGlvbigpIHsKLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNkICA9IERlc2NyaXB0aW9uRmFjdG9yeS5jcmVhdGVTZXJ2aWNlRGVzY3JpcHRpb24oRGVmYXVsdFNlcnZpY2UuY2xhc3MpOwotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVkID0gc2QuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbihuZXcgUU5hbWUobnMsIGRlZmF1bHRTZXJ2aWNlUG9ydE5hbWUpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChlZCk7Ci0gICAgICAgIAotICAgICAgICBBeGlzU2VydmljZSBheGlzU2VydmljZSA9IGVkLmdldEF4aXNTZXJ2aWNlKCk7Ci0gICAgICAgIFBhcmFtZXRlciB2ZXJzaW9uUGFyYW0gID0gYXhpc1NlcnZpY2UuZ2V0UGFyYW1ldGVyKEFkZHJlc3NpbmdDb25zdGFudHMuV1NfQUREUkVTU0lOR19WRVJTSU9OKTsKLSAgICAgICAgUGFyYW1ldGVyIGRpc2FibGVkUGFyYW0gPSBheGlzU2VydmljZS5nZXRQYXJhbWV0ZXIoQWRkcmVzc2luZ0NvbnN0YW50cy5ESVNBQkxFX0FERFJFU1NJTkdfRk9SX0lOX01FU1NBR0VTKTsKLSAgICAgICAgUGFyYW1ldGVyIHJlcXVpcmVkUGFyYW0gPSBheGlzU2VydmljZS5nZXRQYXJhbWV0ZXIoQWRkcmVzc2luZ0NvbnN0YW50cy5BRERSRVNTSU5HX1JFUVVJUkVNRU5UX1BBUkFNRVRFUik7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnROdWxsKHZlcnNpb25QYXJhbSk7Ci0gICAgICAgIGFzc2VydE51bGwoZGlzYWJsZWRQYXJhbSk7Ci0gICAgICAgIGFzc2VydE51bGwocmVxdWlyZWRQYXJhbSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RQbGFpbkFubm90YXRpb24oKSB7Ci0gICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzZCAgPSBEZXNjcmlwdGlvbkZhY3RvcnkuY3JlYXRlU2VydmljZURlc2NyaXB0aW9uKFBsYWluU2VydmljZS5jbGFzcyk7Ci0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZWQgPSBzZC5nZXRFbmRwb2ludERlc2NyaXB0aW9uKG5ldyBRTmFtZShucywgcGxhaW5TZXJ2aWNlUG9ydE5hbWUpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChlZCk7Ci0gICAgICAgIAotICAgICAgICBBeGlzU2VydmljZSBheGlzU2VydmljZSA9IGVkLmdldEF4aXNTZXJ2aWNlKCk7Ci0gICAgICAgIFBhcmFtZXRlciB2ZXJzaW9uUGFyYW0gID0gYXhpc1NlcnZpY2UuZ2V0UGFyYW1ldGVyKEFkZHJlc3NpbmdDb25zdGFudHMuV1NfQUREUkVTU0lOR19WRVJTSU9OKTsKLSAgICAgICAgUGFyYW1ldGVyIGRpc2FibGVkUGFyYW0gPSBheGlzU2VydmljZS5nZXRQYXJhbWV0ZXIoQWRkcmVzc2luZ0NvbnN0YW50cy5ESVNBQkxFX0FERFJFU1NJTkdfRk9SX0lOX01FU1NBR0VTKTsKLSAgICAgICAgUGFyYW1ldGVyIHJlcXVpcmVkUGFyYW0gPSBheGlzU2VydmljZS5nZXRQYXJhbWV0ZXIoQWRkcmVzc2luZ0NvbnN0YW50cy5BRERSRVNTSU5HX1JFUVVJUkVNRU5UX1BBUkFNRVRFUik7Ci0KLSAgICAgICAgU3RyaW5nIHZlcnNpb24gID0gVXRpbHMuZ2V0UGFyYW1ldGVyVmFsdWUodmVyc2lvblBhcmFtKTsKLSAgICAgICAgU3RyaW5nIGRpc2FibGVkID0gVXRpbHMuZ2V0UGFyYW1ldGVyVmFsdWUoZGlzYWJsZWRQYXJhbSk7Ci0gICAgICAgIFN0cmluZyByZXF1aXJlZCA9IFV0aWxzLmdldFBhcmFtZXRlclZhbHVlKHJlcXVpcmVkUGFyYW0pOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEFkZHJlc3NpbmdDb25zdGFudHMuRmluYWwuV1NBX05BTUVTUEFDRSwgdmVyc2lvbik7Ci0gICAgICAgIGFzc2VydEVxdWFscygiZmFsc2UiLCBkaXNhYmxlZCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhBZGRyZXNzaW5nQ29uc3RhbnRzLkFERFJFU1NJTkdfVU5TUEVDSUZJRUQsIHJlcXVpcmVkKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdERpc2FibGVkKCkgewotICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc2QgID0gRGVzY3JpcHRpb25GYWN0b3J5LmNyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbihEaXNhYmxlZFNlcnZpY2UuY2xhc3MpOwotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVkID0gc2QuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbihuZXcgUU5hbWUobnMsIGRpc2FibGVkU2VydmljZVBvcnROYW1lKSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZWQpOwotICAgICAgICAKLSAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UgPSBlZC5nZXRBeGlzU2VydmljZSgpOwotICAgICAgICBQYXJhbWV0ZXIgdmVyc2lvblBhcmFtICA9IGF4aXNTZXJ2aWNlLmdldFBhcmFtZXRlcihBZGRyZXNzaW5nQ29uc3RhbnRzLldTX0FERFJFU1NJTkdfVkVSU0lPTik7Ci0gICAgICAgIFBhcmFtZXRlciBkaXNhYmxlZFBhcmFtID0gYXhpc1NlcnZpY2UuZ2V0UGFyYW1ldGVyKEFkZHJlc3NpbmdDb25zdGFudHMuRElTQUJMRV9BRERSRVNTSU5HX0ZPUl9JTl9NRVNTQUdFUyk7Ci0gICAgICAgIFBhcmFtZXRlciByZXF1aXJlZFBhcmFtID0gYXhpc1NlcnZpY2UuZ2V0UGFyYW1ldGVyKEFkZHJlc3NpbmdDb25zdGFudHMuQUREUkVTU0lOR19SRVFVSVJFTUVOVF9QQVJBTUVURVIpOwotCi0gICAgICAgIFN0cmluZyB2ZXJzaW9uICA9IFV0aWxzLmdldFBhcmFtZXRlclZhbHVlKHZlcnNpb25QYXJhbSk7Ci0gICAgICAgIFN0cmluZyBkaXNhYmxlZCA9IFV0aWxzLmdldFBhcmFtZXRlclZhbHVlKGRpc2FibGVkUGFyYW0pOwotICAgICAgICBTdHJpbmcgcmVxdWlyZWQgPSBVdGlscy5nZXRQYXJhbWV0ZXJWYWx1ZShyZXF1aXJlZFBhcmFtKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydEVxdWFscyhBZGRyZXNzaW5nQ29uc3RhbnRzLlN1Ym1pc3Npb24uV1NBX05BTUVTUEFDRSwgdmVyc2lvbik7Ci0gICAgICAgIGFzc2VydEVxdWFscygiZmFsc2UiLCBkaXNhYmxlZCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhBZGRyZXNzaW5nQ29uc3RhbnRzLkFERFJFU1NJTkdfVU5TUEVDSUZJRUQsIHJlcXVpcmVkKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdFJlcXVpcmVkKCkgewotICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc2QgID0gRGVzY3JpcHRpb25GYWN0b3J5LmNyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbihSZXF1aXJlZFNlcnZpY2UuY2xhc3MpOwotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVkID0gc2QuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbihuZXcgUU5hbWUobnMsIHJlcXVpcmVkU2VydmljZVBvcnROYW1lKSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZWQpOwotICAgICAgICAKLSAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UgPSBlZC5nZXRBeGlzU2VydmljZSgpOwotICAgICAgICBQYXJhbWV0ZXIgdmVyc2lvblBhcmFtICA9IGF4aXNTZXJ2aWNlLmdldFBhcmFtZXRlcihBZGRyZXNzaW5nQ29uc3RhbnRzLldTX0FERFJFU1NJTkdfVkVSU0lPTik7Ci0gICAgICAgIFBhcmFtZXRlciBkaXNhYmxlZFBhcmFtID0gYXhpc1NlcnZpY2UuZ2V0UGFyYW1ldGVyKEFkZHJlc3NpbmdDb25zdGFudHMuRElTQUJMRV9BRERSRVNTSU5HX0ZPUl9JTl9NRVNTQUdFUyk7Ci0gICAgICAgIFBhcmFtZXRlciByZXF1aXJlZFBhcmFtID0gYXhpc1NlcnZpY2UuZ2V0UGFyYW1ldGVyKEFkZHJlc3NpbmdDb25zdGFudHMuQUREUkVTU0lOR19SRVFVSVJFTUVOVF9QQVJBTUVURVIpOwotCi0gICAgICAgIFN0cmluZyB2ZXJzaW9uICA9IFV0aWxzLmdldFBhcmFtZXRlclZhbHVlKHZlcnNpb25QYXJhbSk7Ci0gICAgICAgIFN0cmluZyBkaXNhYmxlZCA9IFV0aWxzLmdldFBhcmFtZXRlclZhbHVlKGRpc2FibGVkUGFyYW0pOwotICAgICAgICBTdHJpbmcgcmVxdWlyZWQgPSBVdGlscy5nZXRQYXJhbWV0ZXJWYWx1ZShyZXF1aXJlZFBhcmFtKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydEVxdWFscyhBZGRyZXNzaW5nQ29uc3RhbnRzLkZpbmFsLldTQV9OQU1FU1BBQ0UsIHZlcnNpb24pOwotICAgICAgICBhc3NlcnRFcXVhbHMoImZhbHNlIiwgZGlzYWJsZWQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoQWRkcmVzc2luZ0NvbnN0YW50cy5BRERSRVNTSU5HX1JFUVVJUkVELCByZXF1aXJlZCk7Ci0gICAgfQotICAgIAotICAgIEBXZWJTZXJ2aWNlKHRhcmdldE5hbWVzcGFjZT1ucywgcG9ydE5hbWU9ZGVmYXVsdFNlcnZpY2VQb3J0TmFtZSkKLSAgICBjbGFzcyBEZWZhdWx0U2VydmljZSB7Ci0gICAgICAgIHB1YmxpYyBkb3VibGUgZ2V0UXVvdGUoU3RyaW5nIHN5bWJvbCkgewotICAgICAgICAgICAgcmV0dXJuIDEwMS4wMTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBAV2ViU2VydmljZSh0YXJnZXROYW1lc3BhY2U9bnMsIHBvcnROYW1lPXBsYWluU2VydmljZVBvcnROYW1lKQotICAgIEBBZGRyZXNzaW5nCi0gICAgY2xhc3MgUGxhaW5TZXJ2aWNlIHsKLSAgICAgICAgcHVibGljIGRvdWJsZSBnZXRRdW90ZShTdHJpbmcgc3ltYm9sKSB7Ci0gICAgICAgICAgICByZXR1cm4gMTAxLjAxOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIEBXZWJTZXJ2aWNlKHRhcmdldE5hbWVzcGFjZT1ucywgcG9ydE5hbWU9ZGlzYWJsZWRTZXJ2aWNlUG9ydE5hbWUpCi0gICAgQEFkZHJlc3NpbmcoZW5hYmxlZD1mYWxzZSkKLSAgICBjbGFzcyBEaXNhYmxlZFNlcnZpY2UgewotICAgICAgICBwdWJsaWMgZG91YmxlIGdldFF1b3RlKFN0cmluZyBzeW1ib2wpIHsKLSAgICAgICAgICAgIHJldHVybiAxMDEuMDE7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgQFdlYlNlcnZpY2UodGFyZ2V0TmFtZXNwYWNlPW5zLCBwb3J0TmFtZT1yZXF1aXJlZFNlcnZpY2VQb3J0TmFtZSkKLSAgICBAQWRkcmVzc2luZyhyZXF1aXJlZD10cnVlKQotICAgIGNsYXNzIFJlcXVpcmVkU2VydmljZSB7Ci0gICAgICAgIHB1YmxpYyBkb3VibGUgZ2V0UXVvdGUoU3RyaW5nIHN5bWJvbCkgewotICAgICAgICAgICAgcmV0dXJuIDEwMS4wMTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9mZWF0dXJlL0JvdGhBZGRyZXNzaW5nRmVhdHVyZXNUZXN0cy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2ZlYXR1cmUvQm90aEFkZHJlc3NpbmdGZWF0dXJlc1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmNDg1ZDIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2ZlYXR1cmUvQm90aEFkZHJlc3NpbmdGZWF0dXJlc1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmZlYXR1cmU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkFkZHJlc3NpbmdDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmFkZHJlc3NpbmcuU3VibWlzc2lvbkFkZHJlc3Npbmc7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5EZXNjcmlwdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5FbmRwb2ludERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uU2VydmljZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5VdGlsczsKLQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuQWRkcmVzc2luZzsKLQotcHVibGljIGNsYXNzIEJvdGhBZGRyZXNzaW5nRmVhdHVyZXNUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgbnMgPSAiaHR0cDovL2pheHdzLmF4aXMyLmFwYWNoZS5vcmcvbWV0YWRhdGEvZmVhdHVyZS9hZGRyZXNzaW5nIjsKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGVmYXVsdFNlcnZpY2VQb3J0TmFtZSA9ICJEZWZhdWx0U2VydmljZVBvcnQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBwbGFpblNlcnZpY2VQb3J0TmFtZSA9ICJQbGFpblNlcnZpY2VQb3J0IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGlzYWJsZWRTZXJ2aWNlUG9ydE5hbWUgPSAiRGlzYWJsZWRTZXJ2aWNlUG9ydCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHJlcXVpcmVkU2VydmljZVBvcnROYW1lID0gIlJlcXVpcmVkU2VydmljZVBvcnQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBtaXhlZFNlcnZpY2VQb3J0TmFtZSA9ICJtaXhlZFNlcnZpY2VQb3J0IjsKLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9Bbm5vdGF0aW9uKCkgewotICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc2QgID0gRGVzY3JpcHRpb25GYWN0b3J5LmNyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbihEZWZhdWx0U2VydmljZS5jbGFzcyk7Ci0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZWQgPSBzZC5nZXRFbmRwb2ludERlc2NyaXB0aW9uKG5ldyBRTmFtZShucywgZGVmYXVsdFNlcnZpY2VQb3J0TmFtZSkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGVkKTsKLSAgICAgICAgCi0gICAgICAgIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlID0gZWQuZ2V0QXhpc1NlcnZpY2UoKTsKLSAgICAgICAgUGFyYW1ldGVyIHZlcnNpb25QYXJhbSAgPSBheGlzU2VydmljZS5nZXRQYXJhbWV0ZXIoQWRkcmVzc2luZ0NvbnN0YW50cy5XU19BRERSRVNTSU5HX1ZFUlNJT04pOwotICAgICAgICBQYXJhbWV0ZXIgZGlzYWJsZWRQYXJhbSA9IGF4aXNTZXJ2aWNlLmdldFBhcmFtZXRlcihBZGRyZXNzaW5nQ29uc3RhbnRzLkRJU0FCTEVfQUREUkVTU0lOR19GT1JfSU5fTUVTU0FHRVMpOwotICAgICAgICBQYXJhbWV0ZXIgcmVxdWlyZWRQYXJhbSA9IGF4aXNTZXJ2aWNlLmdldFBhcmFtZXRlcihBZGRyZXNzaW5nQ29uc3RhbnRzLkFERFJFU1NJTkdfUkVRVUlSRU1FTlRfUEFSQU1FVEVSKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydE51bGwodmVyc2lvblBhcmFtKTsKLSAgICAgICAgYXNzZXJ0TnVsbChkaXNhYmxlZFBhcmFtKTsKLSAgICAgICAgYXNzZXJ0TnVsbChyZXF1aXJlZFBhcmFtKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdFBsYWluQW5ub3RhdGlvbigpIHsKLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNkICA9IERlc2NyaXB0aW9uRmFjdG9yeS5jcmVhdGVTZXJ2aWNlRGVzY3JpcHRpb24oUGxhaW5TZXJ2aWNlLmNsYXNzKTsKLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlZCA9IHNkLmdldEVuZHBvaW50RGVzY3JpcHRpb24obmV3IFFOYW1lKG5zLCBwbGFpblNlcnZpY2VQb3J0TmFtZSkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGVkKTsKLSAgICAgICAgCi0gICAgICAgIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlID0gZWQuZ2V0QXhpc1NlcnZpY2UoKTsKLSAgICAgICAgUGFyYW1ldGVyIHZlcnNpb25QYXJhbSAgPSBheGlzU2VydmljZS5nZXRQYXJhbWV0ZXIoQWRkcmVzc2luZ0NvbnN0YW50cy5XU19BRERSRVNTSU5HX1ZFUlNJT04pOwotICAgICAgICBQYXJhbWV0ZXIgZGlzYWJsZWRQYXJhbSA9IGF4aXNTZXJ2aWNlLmdldFBhcmFtZXRlcihBZGRyZXNzaW5nQ29uc3RhbnRzLkRJU0FCTEVfQUREUkVTU0lOR19GT1JfSU5fTUVTU0FHRVMpOwotICAgICAgICBQYXJhbWV0ZXIgcmVxdWlyZWRQYXJhbSA9IGF4aXNTZXJ2aWNlLmdldFBhcmFtZXRlcihBZGRyZXNzaW5nQ29uc3RhbnRzLkFERFJFU1NJTkdfUkVRVUlSRU1FTlRfUEFSQU1FVEVSKTsKLQotICAgICAgICBTdHJpbmcgdmVyc2lvbiAgPSBVdGlscy5nZXRQYXJhbWV0ZXJWYWx1ZSh2ZXJzaW9uUGFyYW0pOwotICAgICAgICBTdHJpbmcgZGlzYWJsZWQgPSBVdGlscy5nZXRQYXJhbWV0ZXJWYWx1ZShkaXNhYmxlZFBhcmFtKTsKLSAgICAgICAgU3RyaW5nIHJlcXVpcmVkID0gVXRpbHMuZ2V0UGFyYW1ldGVyVmFsdWUocmVxdWlyZWRQYXJhbSk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnROdWxsKHZlcnNpb24pOwotICAgICAgICBhc3NlcnRFcXVhbHMoImZhbHNlIiwgZGlzYWJsZWQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoQWRkcmVzc2luZ0NvbnN0YW50cy5BRERSRVNTSU5HX1VOU1BFQ0lGSUVELCByZXF1aXJlZCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3REaXNhYmxlZCgpIHsKLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNkICA9IERlc2NyaXB0aW9uRmFjdG9yeS5jcmVhdGVTZXJ2aWNlRGVzY3JpcHRpb24oRGlzYWJsZWRTZXJ2aWNlLmNsYXNzKTsKLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlZCA9IHNkLmdldEVuZHBvaW50RGVzY3JpcHRpb24obmV3IFFOYW1lKG5zLCBkaXNhYmxlZFNlcnZpY2VQb3J0TmFtZSkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGVkKTsKLSAgICAgICAgCi0gICAgICAgIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlID0gZWQuZ2V0QXhpc1NlcnZpY2UoKTsKLSAgICAgICAgUGFyYW1ldGVyIHZlcnNpb25QYXJhbSAgPSBheGlzU2VydmljZS5nZXRQYXJhbWV0ZXIoQWRkcmVzc2luZ0NvbnN0YW50cy5XU19BRERSRVNTSU5HX1ZFUlNJT04pOwotICAgICAgICBQYXJhbWV0ZXIgZGlzYWJsZWRQYXJhbSA9IGF4aXNTZXJ2aWNlLmdldFBhcmFtZXRlcihBZGRyZXNzaW5nQ29uc3RhbnRzLkRJU0FCTEVfQUREUkVTU0lOR19GT1JfSU5fTUVTU0FHRVMpOwotICAgICAgICBQYXJhbWV0ZXIgcmVxdWlyZWRQYXJhbSA9IGF4aXNTZXJ2aWNlLmdldFBhcmFtZXRlcihBZGRyZXNzaW5nQ29uc3RhbnRzLkFERFJFU1NJTkdfUkVRVUlSRU1FTlRfUEFSQU1FVEVSKTsKLQotICAgICAgICBTdHJpbmcgdmVyc2lvbiAgPSBVdGlscy5nZXRQYXJhbWV0ZXJWYWx1ZSh2ZXJzaW9uUGFyYW0pOwotICAgICAgICBTdHJpbmcgZGlzYWJsZWQgPSBVdGlscy5nZXRQYXJhbWV0ZXJWYWx1ZShkaXNhYmxlZFBhcmFtKTsKLSAgICAgICAgU3RyaW5nIHJlcXVpcmVkID0gVXRpbHMuZ2V0UGFyYW1ldGVyVmFsdWUocmVxdWlyZWRQYXJhbSk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnROdWxsKHZlcnNpb24pOwotICAgICAgICBhc3NlcnRFcXVhbHMoInRydWUiLCBkaXNhYmxlZCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhBZGRyZXNzaW5nQ29uc3RhbnRzLkFERFJFU1NJTkdfVU5TUEVDSUZJRUQsIHJlcXVpcmVkKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdFJlcXVpcmVkKCkgewotICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc2QgID0gRGVzY3JpcHRpb25GYWN0b3J5LmNyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbihSZXF1aXJlZFNlcnZpY2UuY2xhc3MpOwotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVkID0gc2QuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbihuZXcgUU5hbWUobnMsIHJlcXVpcmVkU2VydmljZVBvcnROYW1lKSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZWQpOwotICAgICAgICAKLSAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UgPSBlZC5nZXRBeGlzU2VydmljZSgpOwotICAgICAgICBQYXJhbWV0ZXIgdmVyc2lvblBhcmFtICA9IGF4aXNTZXJ2aWNlLmdldFBhcmFtZXRlcihBZGRyZXNzaW5nQ29uc3RhbnRzLldTX0FERFJFU1NJTkdfVkVSU0lPTik7Ci0gICAgICAgIFBhcmFtZXRlciBkaXNhYmxlZFBhcmFtID0gYXhpc1NlcnZpY2UuZ2V0UGFyYW1ldGVyKEFkZHJlc3NpbmdDb25zdGFudHMuRElTQUJMRV9BRERSRVNTSU5HX0ZPUl9JTl9NRVNTQUdFUyk7Ci0gICAgICAgIFBhcmFtZXRlciByZXF1aXJlZFBhcmFtID0gYXhpc1NlcnZpY2UuZ2V0UGFyYW1ldGVyKEFkZHJlc3NpbmdDb25zdGFudHMuQUREUkVTU0lOR19SRVFVSVJFTUVOVF9QQVJBTUVURVIpOwotCi0gICAgICAgIFN0cmluZyB2ZXJzaW9uICA9IFV0aWxzLmdldFBhcmFtZXRlclZhbHVlKHZlcnNpb25QYXJhbSk7Ci0gICAgICAgIFN0cmluZyBkaXNhYmxlZCA9IFV0aWxzLmdldFBhcmFtZXRlclZhbHVlKGRpc2FibGVkUGFyYW0pOwotICAgICAgICBTdHJpbmcgcmVxdWlyZWQgPSBVdGlscy5nZXRQYXJhbWV0ZXJWYWx1ZShyZXF1aXJlZFBhcmFtKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydE51bGwodmVyc2lvbik7Ci0gICAgICAgIGFzc2VydEVxdWFscygiZmFsc2UiLCBkaXNhYmxlZCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhBZGRyZXNzaW5nQ29uc3RhbnRzLkFERFJFU1NJTkdfUkVRVUlSRUQsIHJlcXVpcmVkKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdE1peGVkKCkgewotICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc2QgID0gRGVzY3JpcHRpb25GYWN0b3J5LmNyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbihNaXhlZFNlcnZpY2UuY2xhc3MpOwotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVkID0gc2QuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbihuZXcgUU5hbWUobnMsIG1peGVkU2VydmljZVBvcnROYW1lKSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZWQpOwotICAgICAgICAKLSAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UgPSBlZC5nZXRBeGlzU2VydmljZSgpOwotICAgICAgICBQYXJhbWV0ZXIgdmVyc2lvblBhcmFtICA9IGF4aXNTZXJ2aWNlLmdldFBhcmFtZXRlcihBZGRyZXNzaW5nQ29uc3RhbnRzLldTX0FERFJFU1NJTkdfVkVSU0lPTik7Ci0gICAgICAgIFBhcmFtZXRlciBkaXNhYmxlZFBhcmFtID0gYXhpc1NlcnZpY2UuZ2V0UGFyYW1ldGVyKEFkZHJlc3NpbmdDb25zdGFudHMuRElTQUJMRV9BRERSRVNTSU5HX0ZPUl9JTl9NRVNTQUdFUyk7Ci0gICAgICAgIFBhcmFtZXRlciByZXF1aXJlZFBhcmFtID0gYXhpc1NlcnZpY2UuZ2V0UGFyYW1ldGVyKEFkZHJlc3NpbmdDb25zdGFudHMuQUREUkVTU0lOR19SRVFVSVJFTUVOVF9QQVJBTUVURVIpOwotCi0gICAgICAgIFN0cmluZyB2ZXJzaW9uICA9IFV0aWxzLmdldFBhcmFtZXRlclZhbHVlKHZlcnNpb25QYXJhbSk7Ci0gICAgICAgIFN0cmluZyBkaXNhYmxlZCA9IFV0aWxzLmdldFBhcmFtZXRlclZhbHVlKGRpc2FibGVkUGFyYW0pOwotICAgICAgICBTdHJpbmcgcmVxdWlyZWQgPSBVdGlscy5nZXRQYXJhbWV0ZXJWYWx1ZShyZXF1aXJlZFBhcmFtKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydEVxdWFscyhBZGRyZXNzaW5nQ29uc3RhbnRzLkZpbmFsLldTQV9OQU1FU1BBQ0UsIHZlcnNpb24pOwotICAgICAgICBhc3NlcnRFcXVhbHMoImZhbHNlIiwgZGlzYWJsZWQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoQWRkcmVzc2luZ0NvbnN0YW50cy5BRERSRVNTSU5HX1JFUVVJUkVELCByZXF1aXJlZCk7Ci0gICAgfQotICAgIAotICAgIEBXZWJTZXJ2aWNlKHRhcmdldE5hbWVzcGFjZT1ucywgcG9ydE5hbWU9ZGVmYXVsdFNlcnZpY2VQb3J0TmFtZSkKLSAgICBjbGFzcyBEZWZhdWx0U2VydmljZSB7Ci0gICAgICAgIHB1YmxpYyBkb3VibGUgZ2V0UXVvdGUoU3RyaW5nIHN5bWJvbCkgewotICAgICAgICAgICAgcmV0dXJuIDEwMS4wMTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBAV2ViU2VydmljZSh0YXJnZXROYW1lc3BhY2U9bnMsIHBvcnROYW1lPXBsYWluU2VydmljZVBvcnROYW1lKQotICAgIEBBZGRyZXNzaW5nCi0gICAgQFN1Ym1pc3Npb25BZGRyZXNzaW5nCi0gICAgY2xhc3MgUGxhaW5TZXJ2aWNlIHsKLSAgICAgICAgcHVibGljIGRvdWJsZSBnZXRRdW90ZShTdHJpbmcgc3ltYm9sKSB7Ci0gICAgICAgICAgICByZXR1cm4gMTAxLjAxOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIEBXZWJTZXJ2aWNlKHRhcmdldE5hbWVzcGFjZT1ucywgcG9ydE5hbWU9ZGlzYWJsZWRTZXJ2aWNlUG9ydE5hbWUpCi0gICAgQEFkZHJlc3NpbmcoZW5hYmxlZD1mYWxzZSkKLSAgICBAU3VibWlzc2lvbkFkZHJlc3NpbmcoZW5hYmxlZD1mYWxzZSkKLSAgICBjbGFzcyBEaXNhYmxlZFNlcnZpY2UgewotICAgICAgICBwdWJsaWMgZG91YmxlIGdldFF1b3RlKFN0cmluZyBzeW1ib2wpIHsKLSAgICAgICAgICAgIHJldHVybiAxMDEuMDE7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgQFdlYlNlcnZpY2UodGFyZ2V0TmFtZXNwYWNlPW5zLCBwb3J0TmFtZT1yZXF1aXJlZFNlcnZpY2VQb3J0TmFtZSkKLSAgICBAQWRkcmVzc2luZyhyZXF1aXJlZD10cnVlKQotICAgIEBTdWJtaXNzaW9uQWRkcmVzc2luZyhyZXF1aXJlZD10cnVlKQotICAgIGNsYXNzIFJlcXVpcmVkU2VydmljZSB7Ci0gICAgICAgIHB1YmxpYyBkb3VibGUgZ2V0UXVvdGUoU3RyaW5nIHN5bWJvbCkgewotICAgICAgICAgICAgcmV0dXJuIDEwMS4wMTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBAV2ViU2VydmljZSh0YXJnZXROYW1lc3BhY2U9bnMsIHBvcnROYW1lPW1peGVkU2VydmljZVBvcnROYW1lKQotICAgIEBBZGRyZXNzaW5nKHJlcXVpcmVkPXRydWUpCi0gICAgQFN1Ym1pc3Npb25BZGRyZXNzaW5nKGVuYWJsZWQ9ZmFsc2UpCi0gICAgY2xhc3MgTWl4ZWRTZXJ2aWNlIHsKLSAgICAgICAgcHVibGljIGRvdWJsZSBnZXRRdW90ZShTdHJpbmcgc3ltYm9sKSB7Ci0gICAgICAgICAgICByZXR1cm4gMTAxLjAxOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2ZlYXR1cmUvTVRPTUZlYXR1cmVUZXN0cy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2ZlYXR1cmUvTVRPTUZlYXR1cmVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDFjNWM0Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9mZWF0dXJlL01UT01GZWF0dXJlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmZlYXR1cmU7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5EZXNjcmlwdGlvbkZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRW5kcG9pbnREZXNjcmlwdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5TZXJ2aWNlRGVzY3JpcHRpb247DQotDQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOw0KLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5NVE9NOw0KLQ0KLXB1YmxpYyBjbGFzcyBNVE9NRmVhdHVyZVRlc3RzIGV4dGVuZHMgVGVzdENhc2Ugew0KLSAgICANCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIG5zID0gImh0dHA6Ly9qYXh3cy5heGlzMi5hcGFjaGUub3JnL21ldGFkYXRhL2ZlYXR1cmUvbXRvbSI7DQotICAgIA0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGVmYXVsdFNlcnZpY2VQb3J0TmFtZSA9ICJEZWZhdWx0U2VydmljZVBvcnQiOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgcGxhaW5TZXJ2aWNlUG9ydE5hbWUgPSAiUGxhaW5TZXJ2aWNlUG9ydCI7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBkaXNhYmxlZFNlcnZpY2VQb3J0TmFtZSA9ICJEaXNhYmxlZFNlcnZpY2VQb3J0IjsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHRocmVzaG9sZFNlcnZpY2VQb3J0TmFtZSA9ICJUaHJlc2hvbGRTZXJ2aWNlUG9ydCI7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBiYWRUaHJlc2hvbGRTZXJ2aWNlUG9ydE5hbWUgPSAiQmFkVGhyZXNob2xkU2VydmljZVBvcnQiOw0KLSAgICANCi0gICAgcHVibGljIHZvaWQgdGVzdE5vQW5ub3RhdGlvbigpIHsNCi0gICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzZCA9IERlc2NyaXB0aW9uRmFjdG9yeS5jcmVhdGVTZXJ2aWNlRGVzY3JpcHRpb24oRGVmYXVsdFNlcnZpY2UuY2xhc3MpOw0KLSAgICAgICAgDQotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVkID0gc2QuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbihuZXcgUU5hbWUobnMsIGRlZmF1bHRTZXJ2aWNlUG9ydE5hbWUpKTsNCi0gICAgICAgIGFzc2VydFRydWUoIlRoZSBFbmRwb2ludERlc2NyaXB0aW9uIHNob3VsZCBub3QgYmUgbnVsbC4iLCBlZCAhPSBudWxsKTsNCi0gICAgICAgIA0KLSAgICAgICAgYm9vbGVhbiBtdG9tRW5hYmxlZCA9IGVkLmlzTVRPTUVuYWJsZWQoKTsNCi0gICAgICAgIGFzc2VydFRydWUoIk1UT00gc2hvdWxkIG5vdCBiZSBlbmFibGVkIGJ5IGRlZmF1bHQiLCBtdG9tRW5hYmxlZCA9PSBmYWxzZSk7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHRlc3RQbGFpbkFubm90YXRpb24oKSB7DQotICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc2QgPSBEZXNjcmlwdGlvbkZhY3RvcnkuY3JlYXRlU2VydmljZURlc2NyaXB0aW9uKFBsYWluU2VydmljZS5jbGFzcyk7DQotICAgICAgICANCi0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZWQgPSBzZC5nZXRFbmRwb2ludERlc2NyaXB0aW9uKG5ldyBRTmFtZShucywgcGxhaW5TZXJ2aWNlUG9ydE5hbWUpKTsNCi0gICAgICAgIGFzc2VydFRydWUoIlRoZSBFbmRwb2ludERlc2NyaXB0aW9uIHNob3VsZCBub3QgYmUgbnVsbC4iLCBlZCAhPSBudWxsKTsNCi0gICAgICAgIA0KLSAgICAgICAgYm9vbGVhbiBtdG9tRW5hYmxlZCA9IGVkLmlzTVRPTUVuYWJsZWQoKTsNCi0gICAgICAgIGFzc2VydFRydWUoIkBNVE9NIGluY2x1ZGVkLCBidXQgd2FzIG5vdCBlbmFibGVkLiIsIG10b21FbmFibGVkID09IHRydWUpOw0KLSAgICAgICAgDQotICAgICAgICBpbnQgdGhyZXNob2xkID0gZWQuZ2V0TVRPTVRocmVzaG9sZCgpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiTVRPTSB0aHJlc2hvbGQgc2hvdWxkIGJlIDAgb3IgbGVzcy4iLCB0aHJlc2hvbGQgPD0gMCk7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHRlc3REaXNhYmxlZCgpIHsNCi0gICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzZCA9IERlc2NyaXB0aW9uRmFjdG9yeS5jcmVhdGVTZXJ2aWNlRGVzY3JpcHRpb24oRGlzYWJsZWRTZXJ2aWNlLmNsYXNzKTsNCi0gICAgICAgIA0KLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlZCA9IHNkLmdldEVuZHBvaW50RGVzY3JpcHRpb24obmV3IFFOYW1lKG5zLCBkaXNhYmxlZFNlcnZpY2VQb3J0TmFtZSkpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIEVuZHBvaW50RGVzY3JpcHRpb24gc2hvdWxkIG5vdCBiZSBudWxsLiIsIGVkICE9IG51bGwpOw0KLSAgICAgICAgDQotICAgICAgICBib29sZWFuIG10b21FbmFibGVkID0gZWQuaXNNVE9NRW5hYmxlZCgpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiQE1UT00gaW5jbHVkZWQsIGFuZCBzaG91bGQgYmUgZGlzYWJsZWQuIiwgbXRvbUVuYWJsZWQgPT0gZmFsc2UpOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VGhyZXNob2xkKCkgew0KLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNkID0gRGVzY3JpcHRpb25GYWN0b3J5LmNyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbihUaHJlc2hvbGRTZXJ2aWNlLmNsYXNzKTsNCi0gICAgICAgIA0KLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlZCA9IHNkLmdldEVuZHBvaW50RGVzY3JpcHRpb24obmV3IFFOYW1lKG5zLCB0aHJlc2hvbGRTZXJ2aWNlUG9ydE5hbWUpKTsNCi0gICAgICAgIGFzc2VydFRydWUoIlRoZSBFbmRwb2ludERlc2NyaXB0aW9uIHNob3VsZCBub3QgYmUgbnVsbC4iLCBlZCAhPSBudWxsKTsNCi0gICAgICAgIA0KLSAgICAgICAgaW50IHRocmVzaG9sZCA9IGVkLmdldE1UT01UaHJlc2hvbGQoKTsNCi0gICAgICAgIGFzc2VydFRydWUoIk1UT00gdGhyZXNob2xkIHNob3VsZCBiZSAyMDAwLiIsIHRocmVzaG9sZCA9PSAyMDAwMCk7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHRlc3RCYWRUaHJlc2hvbGQoKSB7DQotICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc2QgPSBEZXNjcmlwdGlvbkZhY3RvcnkuY3JlYXRlU2VydmljZURlc2NyaXB0aW9uKEJhZFRocmVzaG9sZFNlcnZpY2UuY2xhc3MpOw0KLSAgICAgICAgDQotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVkID0gc2QuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbihuZXcgUU5hbWUobnMsIGJhZFRocmVzaG9sZFNlcnZpY2VQb3J0TmFtZSkpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIEVuZHBvaW50RGVzY3JpcHRpb24gc2hvdWxkIG5vdCBiZSBudWxsLiIsIGVkICE9IG51bGwpOw0KLSAgICAgICAgDQotICAgICAgICBpbnQgdGhyZXNob2xkID0gZWQuZ2V0TVRPTVRocmVzaG9sZCgpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiTVRPTSB0aHJlc2hvbGQgc2hvdWxkIGJlIFswXSwgYnV0IHdhcyBbIiArIHRocmVzaG9sZCArICJdLiIsIHRocmVzaG9sZCA9PSAwKTsNCi0gICAgfQ0KLSAgICANCi0gICAgQFdlYlNlcnZpY2UodGFyZ2V0TmFtZXNwYWNlPW5zLCBwb3J0TmFtZT1kZWZhdWx0U2VydmljZVBvcnROYW1lKQ0KLSAgICBjbGFzcyBEZWZhdWx0U2VydmljZSB7DQotICAgICAgICBwdWJsaWMgZG91YmxlIGdldFF1b3RlKFN0cmluZyBzeW1ib2wpIHsNCi0gICAgICAgICAgICByZXR1cm4gMTAxLjAxOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICBAV2ViU2VydmljZSh0YXJnZXROYW1lc3BhY2U9bnMsIHBvcnROYW1lPXBsYWluU2VydmljZVBvcnROYW1lKQ0KLSAgICBATVRPTQ0KLSAgICBjbGFzcyBQbGFpblNlcnZpY2Ugew0KLSAgICAgICAgcHVibGljIGRvdWJsZSBnZXRRdW90ZShTdHJpbmcgc3ltYm9sKSB7DQotICAgICAgICAgICAgcmV0dXJuIDEwMS4wMTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICANCi0gICAgQFdlYlNlcnZpY2UodGFyZ2V0TmFtZXNwYWNlPW5zLCBwb3J0TmFtZT1kaXNhYmxlZFNlcnZpY2VQb3J0TmFtZSkNCi0gICAgQE1UT00oZW5hYmxlZD1mYWxzZSkNCi0gICAgY2xhc3MgRGlzYWJsZWRTZXJ2aWNlIHsNCi0gICAgICAgIHB1YmxpYyBkb3VibGUgZ2V0UXVvdGUoU3RyaW5nIHN5bWJvbCkgew0KLSAgICAgICAgICAgIHJldHVybiAxMDEuMDE7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIEBXZWJTZXJ2aWNlKHRhcmdldE5hbWVzcGFjZT1ucywgcG9ydE5hbWU9dGhyZXNob2xkU2VydmljZVBvcnROYW1lKQ0KLSAgICBATVRPTSh0aHJlc2hvbGQ9MjAwMDApDQotICAgIGNsYXNzIFRocmVzaG9sZFNlcnZpY2Ugew0KLSAgICAgICAgcHVibGljIGRvdWJsZSBnZXRRdW90ZShTdHJpbmcgc3ltYm9sKSB7DQotICAgICAgICAgICAgcmV0dXJuIDEwMS4wMTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICANCi0gICAgQFdlYlNlcnZpY2UodGFyZ2V0TmFtZXNwYWNlPW5zLCBwb3J0TmFtZT1iYWRUaHJlc2hvbGRTZXJ2aWNlUG9ydE5hbWUpDQotICAgIEBNVE9NKHRocmVzaG9sZD0tMTAwMCkNCi0gICAgY2xhc3MgQmFkVGhyZXNob2xkU2VydmljZSB7DQotICAgICAgICBwdWJsaWMgZG91YmxlIGdldFF1b3RlKFN0cmluZyBzeW1ib2wpIHsNCi0gICAgICAgICAgICByZXR1cm4gMTAxLjAxOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9mZWF0dXJlL1Jlc3BlY3RCaW5kaW5nRmVhdHVyZVRlc3RzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vZmVhdHVyZS9SZXNwZWN0QmluZGluZ0ZlYXR1cmVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzY3NzhjLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9mZWF0dXJlL1Jlc3BlY3RCaW5kaW5nRmVhdHVyZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5mZWF0dXJlOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRGVzY3JpcHRpb25GYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkVuZHBvaW50RGVzY3JpcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uU2VydmljZURlc2NyaXB0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuY29udmVydGVyLkphdmFDbGFzc1RvREJDQ29udmVydGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnV0aWwuV1NETDRKV3JhcHBlcjsNCi0NCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5SZXNwZWN0QmluZGluZzsNCi1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuQWRkcmVzc2luZzsNCi0NCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotcHVibGljIGNsYXNzIFJlc3BlY3RCaW5kaW5nRmVhdHVyZVRlc3RzIGV4dGVuZHMgVGVzdENhc2Ugew0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgbnMgPSAiaHR0cDovL2pheHdzLmF4aXMyLmFwYWNoZS5vcmcvbWV0YWRhdGEvZmVhdHVyZS9yZXNwZWN0YmluZGluZyI7DQotICAgIA0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgc2VydmljZU5hbWUgPSAiRWNob01lc3NhZ2VTZXJ2aWNlIjsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHBvcnRUeXBlTmFtZSA9ICJFY2hvTWVzc2FnZVBvcnRUeXBlIjsNCi0gICAgDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBwbGFpblNlcnZpY2VQb3J0TmFtZSA9ICJQbGFpblNlcnZpY2VQb3J0IjsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGRpc2FibGVkU2VydmljZVBvcnROYW1lID0gIkRpc2FibGVkU2VydmljZVBvcnQiOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGVmYXVsdFNlcnZpY2VQb3J0TmFtZSA9ICJEZWZhdWx0U2VydmljZVBvcnQiOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29tcGxldGVTZXJ2aWNlUG9ydE5hbWUgPSAiQ29tcGxldGVTZXJ2aWNlUG9ydCI7DQotICAgIA0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgd3NkbExvY2F0aW9uID0gInRlc3QtcmVzb3VyY2VzL3dzZGwvUmVzcGVjdEJpbmRpbmcud3NkbCI7DQotDQotICAgIC8qDQotICAgICAqIFJlc3BlY3RCaW5kaW5nIHByb2Nlc3Npbmcgc2hvdWxkIGZhaWwgYmVjYXVzZSBhIFdTREwgZmlsZSB3YXMgbm90IGluY2x1ZGVkLg0KLSAgICAgKi8NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFBsYWluKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBKYXZhQ2xhc3NUb0RCQ0NvbnZlcnRlciBjb252ZXJ0ZXIgPSBuZXcgSmF2YUNsYXNzVG9EQkNDb252ZXJ0ZXIoUGxhaW5TZXJ2aWNlLmNsYXNzKTsNCi0gICAgICAgIEhhc2hNYXA8U3RyaW5nLCBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGU+IG1hcCA9IGNvbnZlcnRlci5wcm9kdWNlREJDKCk7DQotICAgICAgICANCi0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBjb21wb3NpdGUgPSBtYXAuZ2V0KFBsYWluU2VydmljZS5jbGFzcy5nZXROYW1lKCkpOw0KLSAgICAgICAgDQotICAgICAgICBVUkwgd3NkbFVybCA9IG5ldyBVUkwoImZpbGU6Li8iICsgd3NkbExvY2F0aW9uKTsNCi0gICAgICAgIFdTREw0SldyYXBwZXIgd3JhcHBlciA9IG5ldyBXU0RMNEpXcmFwcGVyKHdzZGxVcmwsIGZhbHNlLCAwKTsNCi0gICAgICAgIA0KLSAgICAgICAgY29tcG9zaXRlLnNldHdzZGxVUkwod3NkbFVybCk7DQotICAgICAgICBjb21wb3NpdGUuc2V0V3NkbERlZmluaXRpb24od3JhcHBlci5nZXREZWZpbml0aW9uKCkpOw0KLSAgICAgICAgDQotICAgICAgICBMaXN0PFNlcnZpY2VEZXNjcmlwdGlvbj4gc2RMaXN0ID0gbnVsbDsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgc2RMaXN0ID0gRGVzY3JpcHRpb25GYWN0b3J5LmNyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbkZyb21EQkNNYXAobWFwKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIC8vIEFuIGV4Y2VwdGlvbiBpcyBleHBlY3RlZC4NCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIFNlcnZpY2VEZXNjcmlwdGlvbnMgc2hvdWxkIG5vdCBoYXZlIGJlZW4gYnVpbHQuIiwgc2RMaXN0ID09IG51bGwpOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzcGVjdEJpbmRpbmdEaXNhYmxlZCgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgSmF2YUNsYXNzVG9EQkNDb252ZXJ0ZXIgY29udmVydGVyID0gbmV3IEphdmFDbGFzc1RvREJDQ29udmVydGVyKERpc2FibGVkU2VydmljZS5jbGFzcyk7DQotICAgICAgICBIYXNoTWFwPFN0cmluZywgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlPiBtYXAgPSBjb252ZXJ0ZXIucHJvZHVjZURCQygpOw0KLSAgICAgICAgDQotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgY29tcG9zaXRlID0gbWFwLmdldChEaXNhYmxlZFNlcnZpY2UuY2xhc3MuZ2V0TmFtZSgpKTsNCi0gICAgICAgIA0KLSAgICAgICAgVVJMIHdzZGxVcmwgPSBuZXcgVVJMKCJmaWxlOi4vIiArIHdzZGxMb2NhdGlvbik7DQotICAgICAgICBXU0RMNEpXcmFwcGVyIHdyYXBwZXIgPSBuZXcgV1NETDRKV3JhcHBlcih3c2RsVXJsLCBmYWxzZSwgMCk7DQotICAgICAgICANCi0gICAgICAgIGNvbXBvc2l0ZS5zZXR3c2RsVVJMKHdzZGxVcmwpOw0KLSAgICAgICAgY29tcG9zaXRlLnNldFdzZGxEZWZpbml0aW9uKHdyYXBwZXIuZ2V0RGVmaW5pdGlvbigpKTsNCi0gICAgICAgIA0KLSAgICAgICAgTGlzdDxTZXJ2aWNlRGVzY3JpcHRpb24+IHNkTGlzdCA9IERlc2NyaXB0aW9uRmFjdG9yeS5jcmVhdGVTZXJ2aWNlRGVzY3JpcHRpb25Gcm9tREJDTWFwKG1hcCk7DQotICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc2QgPSBzZExpc3QuZ2V0KDApOw0KLSAgICAgICAgDQotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVkID0gc2QuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbihuZXcgUU5hbWUobnMsIGRpc2FibGVkU2VydmljZVBvcnROYW1lKSk7DQotICAgICAgICBhc3NlcnRUcnVlKCJUaGUgRW5kcG9pbnREZXNjcmlwdGlvbiBzaG91bGQgbm90IGJlIG51bGwuIiwgZWQgIT0gbnVsbCk7DQotDQotICAgICAgICBib29sZWFuIHJlc3BlY3QgPSBlZC5yZXNwZWN0QmluZGluZygpOw0KLSAgICAgICAgYXNzZXJ0RmFsc2UoIlN0cmljdCBiaW5kaW5nIHN1cHBvcnQgc2hvdWxkIGJlIERJU0FCTEVELiIsIHJlc3BlY3QpOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzcGVjdEJpbmRpbmdEZWZhdWx0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBKYXZhQ2xhc3NUb0RCQ0NvbnZlcnRlciBjb252ZXJ0ZXIgPSBuZXcgSmF2YUNsYXNzVG9EQkNDb252ZXJ0ZXIoRGVmYXVsdFNlcnZpY2UuY2xhc3MpOw0KLSAgICAgICAgSGFzaE1hcDxTdHJpbmcsIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZT4gbWFwID0gY29udmVydGVyLnByb2R1Y2VEQkMoKTsNCi0gICAgICAgIA0KLSAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG1hcC5nZXQoRGVmYXVsdFNlcnZpY2UuY2xhc3MuZ2V0TmFtZSgpKTsNCi0gICAgICAgIA0KLSAgICAgICAgVVJMIHdzZGxVcmwgPSBuZXcgVVJMKCJmaWxlOi4vIiArIHdzZGxMb2NhdGlvbik7DQotICAgICAgICBXU0RMNEpXcmFwcGVyIHdyYXBwZXIgPSBuZXcgV1NETDRKV3JhcHBlcih3c2RsVXJsLCBmYWxzZSwgMCk7DQotICAgICAgICANCi0gICAgICAgIGNvbXBvc2l0ZS5zZXR3c2RsVVJMKHdzZGxVcmwpOw0KLSAgICAgICAgY29tcG9zaXRlLnNldFdzZGxEZWZpbml0aW9uKHdyYXBwZXIuZ2V0RGVmaW5pdGlvbigpKTsNCi0gICAgICAgIA0KLSAgICAgICAgTGlzdDxTZXJ2aWNlRGVzY3JpcHRpb24+IHNkTGlzdCA9IG51bGw7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIHNkTGlzdCA9IERlc2NyaXB0aW9uRmFjdG9yeS5jcmVhdGVTZXJ2aWNlRGVzY3JpcHRpb25Gcm9tREJDTWFwKG1hcCk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICAvLyBBbiBleGNlcHRpb24gaXMgZXhwZWN0ZWQuDQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIGFzc2VydFRydWUoIlRoZSBTZXJ2aWNlRGVzY3JpcHRpb25zIHNob3VsZCBub3QgaGF2ZSBiZWVuIGJ1aWx0LiIsIHNkTGlzdCA9PSBudWxsKTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIHZvaWQgdGVzdFJlc3BlY3RCaW5kaW5nQ29tcGxldGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIEphdmFDbGFzc1RvREJDQ29udmVydGVyIGNvbnZlcnRlciA9IG5ldyBKYXZhQ2xhc3NUb0RCQ0NvbnZlcnRlcihDb21wbGV0ZVNlcnZpY2UuY2xhc3MpOw0KLSAgICAgICAgSGFzaE1hcDxTdHJpbmcsIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZT4gbWFwID0gY29udmVydGVyLnByb2R1Y2VEQkMoKTsNCi0gICAgICAgIA0KLSAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG1hcC5nZXQoQ29tcGxldGVTZXJ2aWNlLmNsYXNzLmdldE5hbWUoKSk7DQotICAgICAgICANCi0gICAgICAgIFVSTCB3c2RsVXJsID0gbmV3IFVSTCgiZmlsZTouLyIgKyB3c2RsTG9jYXRpb24pOw0KLSAgICAgICAgV1NETDRKV3JhcHBlciB3cmFwcGVyID0gbmV3IFdTREw0SldyYXBwZXIod3NkbFVybCwgZmFsc2UsIDApOw0KLSAgICAgICAgDQotICAgICAgICBjb21wb3NpdGUuc2V0d3NkbFVSTCh3c2RsVXJsKTsNCi0gICAgICAgIGNvbXBvc2l0ZS5zZXRXc2RsRGVmaW5pdGlvbih3cmFwcGVyLmdldERlZmluaXRpb24oKSk7DQotICAgICAgICANCi0gICAgICAgIExpc3Q8U2VydmljZURlc2NyaXB0aW9uPiBzZExpc3QgPSBEZXNjcmlwdGlvbkZhY3RvcnkuY3JlYXRlU2VydmljZURlc2NyaXB0aW9uRnJvbURCQ01hcChtYXApOw0KLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNkID0gc2RMaXN0LmdldCgwKTsNCi0gICAgICAgIA0KLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlZCA9IHNkLmdldEVuZHBvaW50RGVzY3JpcHRpb24obmV3IFFOYW1lKG5zLCBjb21wbGV0ZVNlcnZpY2VQb3J0TmFtZSkpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIEVuZHBvaW50RGVzY3JpcHRpb24gc2hvdWxkIG5vdCBiZSBudWxsLiIsIGVkICE9IG51bGwpOw0KLQ0KLSAgICAgICAgYm9vbGVhbiByZXNwZWN0ID0gZWQucmVzcGVjdEJpbmRpbmcoKTsNCi0gICAgICAgIGFzc2VydFRydWUoIlN0cmljdCBiaW5kaW5nIHN1cHBvcnQgc2hvdWxkIGJlIEVOQUJMRUQuIiwgcmVzcGVjdCk7DQotICAgIH0NCi0gICAgDQotICAgIEBXZWJTZXJ2aWNlKHRhcmdldE5hbWVzcGFjZT1ucywgcG9ydE5hbWU9cGxhaW5TZXJ2aWNlUG9ydE5hbWUpDQotICAgIEBSZXNwZWN0QmluZGluZw0KLSAgICBjbGFzcyBQbGFpblNlcnZpY2Ugew0KLSAgICAgICAgcHVibGljIFN0cmluZyBlY2hvKFN0cmluZyBpbnB1dCkgew0KLSAgICAgICAgICAgIHJldHVybiAiIjsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICANCi0gICAgQFdlYlNlcnZpY2UodGFyZ2V0TmFtZXNwYWNlPW5zLCANCi0gICAgICAgIHNlcnZpY2VOYW1lPXNlcnZpY2VOYW1lLA0KLSAgICAgICAgcG9ydE5hbWU9ZGVmYXVsdFNlcnZpY2VQb3J0TmFtZSwgDQotICAgICAgICBuYW1lPXBvcnRUeXBlTmFtZSwgDQotICAgICAgICB3c2RsTG9jYXRpb249d3NkbExvY2F0aW9uKQ0KLSAgICBAUmVzcGVjdEJpbmRpbmcNCi0gICAgY2xhc3MgRGVmYXVsdFNlcnZpY2Ugew0KLSAgICAgICAgcHVibGljIFN0cmluZyBlY2hvKFN0cmluZyBpbnB1dCkgew0KLSAgICAgICAgICAgIHJldHVybiAiIjsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICANCi0gICAgQFdlYlNlcnZpY2UodGFyZ2V0TmFtZXNwYWNlPW5zLA0KLSAgICAgICAgc2VydmljZU5hbWU9c2VydmljZU5hbWUsDQotICAgICAgICBwb3J0TmFtZT1kaXNhYmxlZFNlcnZpY2VQb3J0TmFtZSwNCi0gICAgICAgIG5hbWU9cG9ydFR5cGVOYW1lLA0KLSAgICAgICAgd3NkbExvY2F0aW9uPXdzZGxMb2NhdGlvbikNCi0gICAgQFJlc3BlY3RCaW5kaW5nKGVuYWJsZWQ9ZmFsc2UpDQotICAgIGNsYXNzIERpc2FibGVkU2VydmljZSB7DQotICAgICAgICBwdWJsaWMgU3RyaW5nIGVjaG8oU3RyaW5nIGlucHV0KSB7DQotICAgICAgICAgICAgcmV0dXJuICIiOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICBAV2ViU2VydmljZSh0YXJnZXROYW1lc3BhY2U9bnMsDQotICAgICAgICBzZXJ2aWNlTmFtZT1zZXJ2aWNlTmFtZSwNCi0gICAgICAgIHBvcnROYW1lPWNvbXBsZXRlU2VydmljZVBvcnROYW1lLA0KLSAgICAgICAgbmFtZT1wb3J0VHlwZU5hbWUsDQotICAgICAgICB3c2RsTG9jYXRpb249d3NkbExvY2F0aW9uKQ0KLSAgICBAUmVzcGVjdEJpbmRpbmcNCi0gICAgQEFkZHJlc3NpbmcNCi0gICAgY2xhc3MgQ29tcGxldGVTZXJ2aWNlIHsNCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZWNobyhTdHJpbmcgaW5wdXQpIHsNCi0gICAgICAgICAgICByZXR1cm4gIiI7DQotICAgICAgICB9DQotICAgIH0NCi19DQotDQotDQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2ZlYXR1cmUvU3VibWlzc2lvbkFkZHJlc3NpbmdGZWF0dXJlVGVzdHMuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9mZWF0dXJlL1N1Ym1pc3Npb25BZGRyZXNzaW5nRmVhdHVyZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzNjAxOWUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2ZlYXR1cmUvU3VibWlzc2lvbkFkZHJlc3NpbmdGZWF0dXJlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uZmVhdHVyZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuQWRkcmVzc2luZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuYWRkcmVzc2luZy5TdWJtaXNzaW9uQWRkcmVzc2luZzsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkRlc2NyaXB0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkVuZHBvaW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5TZXJ2aWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLlV0aWxzOwotCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotcHVibGljIGNsYXNzIFN1Ym1pc3Npb25BZGRyZXNzaW5nRmVhdHVyZVRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBucyA9ICJodHRwOi8vamF4d3MuYXhpczIuYXBhY2hlLm9yZy9tZXRhZGF0YS9mZWF0dXJlL2FkZHJlc3NpbmciOwotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBkZWZhdWx0U2VydmljZVBvcnROYW1lID0gIkRlZmF1bHRTZXJ2aWNlUG9ydCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHBsYWluU2VydmljZVBvcnROYW1lID0gIlBsYWluU2VydmljZVBvcnQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBkaXNhYmxlZFNlcnZpY2VQb3J0TmFtZSA9ICJEaXNhYmxlZFNlcnZpY2VQb3J0IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgcmVxdWlyZWRTZXJ2aWNlUG9ydE5hbWUgPSAiUmVxdWlyZWRTZXJ2aWNlUG9ydCI7Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdE5vQW5ub3RhdGlvbigpIHsKLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNkICA9IERlc2NyaXB0aW9uRmFjdG9yeS5jcmVhdGVTZXJ2aWNlRGVzY3JpcHRpb24oRGVmYXVsdFNlcnZpY2UuY2xhc3MpOwotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVkID0gc2QuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbihuZXcgUU5hbWUobnMsIGRlZmF1bHRTZXJ2aWNlUG9ydE5hbWUpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChlZCk7Ci0gICAgICAgIAotICAgICAgICBBeGlzU2VydmljZSBheGlzU2VydmljZSA9IGVkLmdldEF4aXNTZXJ2aWNlKCk7Ci0gICAgICAgIFBhcmFtZXRlciB2ZXJzaW9uUGFyYW0gID0gYXhpc1NlcnZpY2UuZ2V0UGFyYW1ldGVyKEFkZHJlc3NpbmdDb25zdGFudHMuV1NfQUREUkVTU0lOR19WRVJTSU9OKTsKLSAgICAgICAgUGFyYW1ldGVyIGRpc2FibGVkUGFyYW0gPSBheGlzU2VydmljZS5nZXRQYXJhbWV0ZXIoQWRkcmVzc2luZ0NvbnN0YW50cy5ESVNBQkxFX0FERFJFU1NJTkdfRk9SX0lOX01FU1NBR0VTKTsKLSAgICAgICAgUGFyYW1ldGVyIHJlcXVpcmVkUGFyYW0gPSBheGlzU2VydmljZS5nZXRQYXJhbWV0ZXIoQWRkcmVzc2luZ0NvbnN0YW50cy5BRERSRVNTSU5HX1JFUVVJUkVNRU5UX1BBUkFNRVRFUik7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnROdWxsKHZlcnNpb25QYXJhbSk7Ci0gICAgICAgIGFzc2VydE51bGwoZGlzYWJsZWRQYXJhbSk7Ci0gICAgICAgIGFzc2VydE51bGwocmVxdWlyZWRQYXJhbSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RQbGFpbkFubm90YXRpb24oKSB7Ci0gICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzZCAgPSBEZXNjcmlwdGlvbkZhY3RvcnkuY3JlYXRlU2VydmljZURlc2NyaXB0aW9uKFBsYWluU2VydmljZS5jbGFzcyk7Ci0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZWQgPSBzZC5nZXRFbmRwb2ludERlc2NyaXB0aW9uKG5ldyBRTmFtZShucywgcGxhaW5TZXJ2aWNlUG9ydE5hbWUpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChlZCk7Ci0gICAgICAgIAotICAgICAgICBBeGlzU2VydmljZSBheGlzU2VydmljZSA9IGVkLmdldEF4aXNTZXJ2aWNlKCk7Ci0gICAgICAgIFBhcmFtZXRlciB2ZXJzaW9uUGFyYW0gID0gYXhpc1NlcnZpY2UuZ2V0UGFyYW1ldGVyKEFkZHJlc3NpbmdDb25zdGFudHMuV1NfQUREUkVTU0lOR19WRVJTSU9OKTsKLSAgICAgICAgUGFyYW1ldGVyIGRpc2FibGVkUGFyYW0gPSBheGlzU2VydmljZS5nZXRQYXJhbWV0ZXIoQWRkcmVzc2luZ0NvbnN0YW50cy5ESVNBQkxFX0FERFJFU1NJTkdfRk9SX0lOX01FU1NBR0VTKTsKLSAgICAgICAgUGFyYW1ldGVyIHJlcXVpcmVkUGFyYW0gPSBheGlzU2VydmljZS5nZXRQYXJhbWV0ZXIoQWRkcmVzc2luZ0NvbnN0YW50cy5BRERSRVNTSU5HX1JFUVVJUkVNRU5UX1BBUkFNRVRFUik7Ci0KLSAgICAgICAgU3RyaW5nIHZlcnNpb24gID0gVXRpbHMuZ2V0UGFyYW1ldGVyVmFsdWUodmVyc2lvblBhcmFtKTsKLSAgICAgICAgU3RyaW5nIGRpc2FibGVkID0gVXRpbHMuZ2V0UGFyYW1ldGVyVmFsdWUoZGlzYWJsZWRQYXJhbSk7Ci0gICAgICAgIFN0cmluZyByZXF1aXJlZCA9IFV0aWxzLmdldFBhcmFtZXRlclZhbHVlKHJlcXVpcmVkUGFyYW0pOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEFkZHJlc3NpbmdDb25zdGFudHMuU3VibWlzc2lvbi5XU0FfTkFNRVNQQUNFLCB2ZXJzaW9uKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJmYWxzZSIsIGRpc2FibGVkKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEFkZHJlc3NpbmdDb25zdGFudHMuQUREUkVTU0lOR19VTlNQRUNJRklFRCwgcmVxdWlyZWQpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGlzYWJsZWQoKSB7Ci0gICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzZCAgPSBEZXNjcmlwdGlvbkZhY3RvcnkuY3JlYXRlU2VydmljZURlc2NyaXB0aW9uKERpc2FibGVkU2VydmljZS5jbGFzcyk7Ci0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZWQgPSBzZC5nZXRFbmRwb2ludERlc2NyaXB0aW9uKG5ldyBRTmFtZShucywgZGlzYWJsZWRTZXJ2aWNlUG9ydE5hbWUpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChlZCk7Ci0gICAgICAgIAotICAgICAgICBBeGlzU2VydmljZSBheGlzU2VydmljZSA9IGVkLmdldEF4aXNTZXJ2aWNlKCk7Ci0gICAgICAgIFBhcmFtZXRlciB2ZXJzaW9uUGFyYW0gID0gYXhpc1NlcnZpY2UuZ2V0UGFyYW1ldGVyKEFkZHJlc3NpbmdDb25zdGFudHMuV1NfQUREUkVTU0lOR19WRVJTSU9OKTsKLSAgICAgICAgUGFyYW1ldGVyIGRpc2FibGVkUGFyYW0gPSBheGlzU2VydmljZS5nZXRQYXJhbWV0ZXIoQWRkcmVzc2luZ0NvbnN0YW50cy5ESVNBQkxFX0FERFJFU1NJTkdfRk9SX0lOX01FU1NBR0VTKTsKLSAgICAgICAgUGFyYW1ldGVyIHJlcXVpcmVkUGFyYW0gPSBheGlzU2VydmljZS5nZXRQYXJhbWV0ZXIoQWRkcmVzc2luZ0NvbnN0YW50cy5BRERSRVNTSU5HX1JFUVVJUkVNRU5UX1BBUkFNRVRFUik7Ci0KLSAgICAgICAgU3RyaW5nIHZlcnNpb24gID0gVXRpbHMuZ2V0UGFyYW1ldGVyVmFsdWUodmVyc2lvblBhcmFtKTsKLSAgICAgICAgU3RyaW5nIGRpc2FibGVkID0gVXRpbHMuZ2V0UGFyYW1ldGVyVmFsdWUoZGlzYWJsZWRQYXJhbSk7Ci0gICAgICAgIFN0cmluZyByZXF1aXJlZCA9IFV0aWxzLmdldFBhcmFtZXRlclZhbHVlKHJlcXVpcmVkUGFyYW0pOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEFkZHJlc3NpbmdDb25zdGFudHMuRmluYWwuV1NBX05BTUVTUEFDRSwgdmVyc2lvbik7Ci0gICAgICAgIGFzc2VydEVxdWFscygiZmFsc2UiLCBkaXNhYmxlZCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhBZGRyZXNzaW5nQ29uc3RhbnRzLkFERFJFU1NJTkdfVU5TUEVDSUZJRUQsIHJlcXVpcmVkKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdFJlcXVpcmVkKCkgewotICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc2QgID0gRGVzY3JpcHRpb25GYWN0b3J5LmNyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbihSZXF1aXJlZFNlcnZpY2UuY2xhc3MpOwotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVkID0gc2QuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbihuZXcgUU5hbWUobnMsIHJlcXVpcmVkU2VydmljZVBvcnROYW1lKSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZWQpOwotICAgICAgICAKLSAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UgPSBlZC5nZXRBeGlzU2VydmljZSgpOwotICAgICAgICBQYXJhbWV0ZXIgdmVyc2lvblBhcmFtICA9IGF4aXNTZXJ2aWNlLmdldFBhcmFtZXRlcihBZGRyZXNzaW5nQ29uc3RhbnRzLldTX0FERFJFU1NJTkdfVkVSU0lPTik7Ci0gICAgICAgIFBhcmFtZXRlciBkaXNhYmxlZFBhcmFtID0gYXhpc1NlcnZpY2UuZ2V0UGFyYW1ldGVyKEFkZHJlc3NpbmdDb25zdGFudHMuRElTQUJMRV9BRERSRVNTSU5HX0ZPUl9JTl9NRVNTQUdFUyk7Ci0gICAgICAgIFBhcmFtZXRlciByZXF1aXJlZFBhcmFtID0gYXhpc1NlcnZpY2UuZ2V0UGFyYW1ldGVyKEFkZHJlc3NpbmdDb25zdGFudHMuQUREUkVTU0lOR19SRVFVSVJFTUVOVF9QQVJBTUVURVIpOwotCi0gICAgICAgIFN0cmluZyB2ZXJzaW9uICA9IFV0aWxzLmdldFBhcmFtZXRlclZhbHVlKHZlcnNpb25QYXJhbSk7Ci0gICAgICAgIFN0cmluZyBkaXNhYmxlZCA9IFV0aWxzLmdldFBhcmFtZXRlclZhbHVlKGRpc2FibGVkUGFyYW0pOwotICAgICAgICBTdHJpbmcgcmVxdWlyZWQgPSBVdGlscy5nZXRQYXJhbWV0ZXJWYWx1ZShyZXF1aXJlZFBhcmFtKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydEVxdWFscyhBZGRyZXNzaW5nQ29uc3RhbnRzLlN1Ym1pc3Npb24uV1NBX05BTUVTUEFDRSwgdmVyc2lvbik7Ci0gICAgICAgIGFzc2VydEVxdWFscygiZmFsc2UiLCBkaXNhYmxlZCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhBZGRyZXNzaW5nQ29uc3RhbnRzLkFERFJFU1NJTkdfUkVRVUlSRUQsIHJlcXVpcmVkKTsKLSAgICB9Ci0gICAgCi0gICAgQFdlYlNlcnZpY2UodGFyZ2V0TmFtZXNwYWNlPW5zLCBwb3J0TmFtZT1kZWZhdWx0U2VydmljZVBvcnROYW1lKQotICAgIGNsYXNzIERlZmF1bHRTZXJ2aWNlIHsKLSAgICAgICAgcHVibGljIGRvdWJsZSBnZXRRdW90ZShTdHJpbmcgc3ltYm9sKSB7Ci0gICAgICAgICAgICByZXR1cm4gMTAxLjAxOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIEBXZWJTZXJ2aWNlKHRhcmdldE5hbWVzcGFjZT1ucywgcG9ydE5hbWU9cGxhaW5TZXJ2aWNlUG9ydE5hbWUpCi0gICAgQFN1Ym1pc3Npb25BZGRyZXNzaW5nCi0gICAgY2xhc3MgUGxhaW5TZXJ2aWNlIHsKLSAgICAgICAgcHVibGljIGRvdWJsZSBnZXRRdW90ZShTdHJpbmcgc3ltYm9sKSB7Ci0gICAgICAgICAgICByZXR1cm4gMTAxLjAxOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIEBXZWJTZXJ2aWNlKHRhcmdldE5hbWVzcGFjZT1ucywgcG9ydE5hbWU9ZGlzYWJsZWRTZXJ2aWNlUG9ydE5hbWUpCi0gICAgQFN1Ym1pc3Npb25BZGRyZXNzaW5nKGVuYWJsZWQ9ZmFsc2UpCi0gICAgY2xhc3MgRGlzYWJsZWRTZXJ2aWNlIHsKLSAgICAgICAgcHVibGljIGRvdWJsZSBnZXRRdW90ZShTdHJpbmcgc3ltYm9sKSB7Ci0gICAgICAgICAgICByZXR1cm4gMTAxLjAxOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIEBXZWJTZXJ2aWNlKHRhcmdldE5hbWVzcGFjZT1ucywgcG9ydE5hbWU9cmVxdWlyZWRTZXJ2aWNlUG9ydE5hbWUpCi0gICAgQFN1Ym1pc3Npb25BZGRyZXNzaW5nKHJlcXVpcmVkPXRydWUpCi0gICAgY2xhc3MgUmVxdWlyZWRTZXJ2aWNlIHsKLSAgICAgICAgcHVibGljIGRvdWJsZSBnZXRRdW90ZShTdHJpbmcgc3ltYm9sKSB7Ci0gICAgICAgICAgICByZXR1cm4gMTAxLjAxOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2ltcGwvQ2xpZW50REJDU3VwcG9ydEVuZHBvaW50VGVzdHMuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9pbXBsL0NsaWVudERCQ1N1cHBvcnRFbmRwb2ludFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkMTA4NWYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2ltcGwvQ2xpZW50REJDU3VwcG9ydEVuZHBvaW50VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwOCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmltcGw7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5EZXNjcmlwdGlvbkZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRW5kcG9pbnREZXNjcmlwdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5TZXJ2aWNlRGVzY3JpcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5EZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaTE4bi5NZXNzYWdlczsNCi0NCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5Ib2xkZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUNsaWVudDsNCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247DQotaW1wb3J0IGphdmEuaW8uRmlsZTsNCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLm5ldC5VUkw7DQotDQotLyoqDQotICogVGVzdCBjbGllbnQgc3BhcnNlIGNvbXBvc2l0ZSBzdXBwb3J0IGluIHRoZSBNRFEgbGF5ZXIgYXQgdGhlIEVuZHBvaW50IGNyZWF0aW9uIGxldmVsLg0KLSAqLw0KLS8qKg0KLSAqIA0KLSAqLw0KLXB1YmxpYyBjbGFzcyBDbGllbnREQkNTdXBwb3J0RW5kcG9pbnRUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZXNwYWNlVVJJID0gImh0dHA6Ly9vcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmltcGwuQ2xpZW50REJDU3VwcG9ydEVuZHBvaW50VGVzdHMiOw0KLSAgICBwcml2YXRlIFN0cmluZyBzdmNMb2NhbFBhcnQgPSAic3ZjTG9jYWxQYXJ0IjsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgcG9ydExvY2FsUGFydCA9ICJwb3J0TG9jYWxQYXJ0IjsNCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBWZXJpZnkgdGhhdCB0aGUgY29kZSB0aGF0IGRvZXNuJ3QgdXNlIGEgY29tcG9zaXRlIGNvbnRpbnVlcyB0byB3b3JrIGNvcnJlY3RseS4gDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UHJlREJDRnVuY3Rpb25hbGl0eSgpIHsNCi0gICAgICAgIFFOYW1lIHNlcnZpY2VRTmFtZSA9IG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIHN2Y0xvY2FsUGFydCk7DQotICAgICAgICANCi0gICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzdmNEZXNjID0gRGVzY3JpcHRpb25GYWN0b3J5LmNyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbihudWxsLCBzZXJ2aWNlUU5hbWUsIENsaWVudERCQ1N1cHBvcnRFbmRwb2ludFNlcnZpY2VTdWJjbGFzcy5jbGFzcyk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHN2Y0Rlc2MpOw0KLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uSW1wbCBzdmNEZXNjSW1wbCA9IChTZXJ2aWNlRGVzY3JpcHRpb25JbXBsKSBzdmNEZXNjOw0KLSAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIHN2Y0Rlc2NDb21wb3NpdGUgPSBzdmNEZXNjSW1wbC5nZXREZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUoKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwoc3ZjRGVzY0NvbXBvc2l0ZSk7DQotICAgICAgICANCi0gICAgICAgIENsYXNzIHRlc3RTZXJ2aWNlQ2xhc3MgPSBzdmNEZXNjQ29tcG9zaXRlLmdldENvcnJlc3BvbmRpbmdDbGFzcygpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh0ZXN0U2VydmljZUNsYXNzKTsNCi0gICAgICAgIGFzc2VydEVxdWFscyhDbGllbnREQkNTdXBwb3J0RW5kcG9pbnRTZXJ2aWNlU3ViY2xhc3MuY2xhc3MsIHRlc3RTZXJ2aWNlQ2xhc3MpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBOb3cgdXBkYXRlIHdpdGggYW4gU0VJDQotICAgICAgICBRTmFtZSBwb3J0UU5hbWUgPSBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBwb3J0TG9jYWxQYXJ0KTsNCi0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZXBEZXNjID0gDQotICAgICAgICAgICAgRGVzY3JpcHRpb25GYWN0b3J5LnVwZGF0ZUVuZHBvaW50KHN2Y0Rlc2MsIENsaWVudERCQ1N1cHBvcnRFbmRwb2ludFNFSS5jbGFzcywgcG9ydFFOYW1lLCBEZXNjcmlwdGlvbkZhY3RvcnkuVXBkYXRlVHlwZS5HRVRfUE9SVCk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKGVwRGVzYyk7DQotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uSW1wbCBlcERlc2NJbXBsID0gKEVuZHBvaW50RGVzY3JpcHRpb25JbXBsKSBlcERlc2M7DQotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgZXBEZXNjQ29tcG9zaXRlID0gZXBEZXNjSW1wbC5nZXREZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUoKTsNCi0gICAgICAgIENsYXNzIHNlaUNsYXNzID0gZXBEZXNjQ29tcG9zaXRlLmdldENvcnJlc3BvbmRpbmdDbGFzcygpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKENsaWVudERCQ1N1cHBvcnRFbmRwb2ludFNFSS5jbGFzcywgc2VpQ2xhc3MpOw0KLSAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGRpZG4ndCBvdmVyd3JpdGUgdGhlIGNsYXNzIGluIHRoZSBTZXJ2aWNlRGVzYyBjb21wb3NpdGUNCi0gICAgICAgIGFzc2VydEVxdWFscyhDbGllbnREQkNTdXBwb3J0RW5kcG9pbnRTZXJ2aWNlU3ViY2xhc3MuY2xhc3MsIA0KLSAgICAgICAgICAgICAgICAgICAgIHN2Y0Rlc2NDb21wb3NpdGUuZ2V0Q29ycmVzcG9uZGluZ0NsYXNzKCkpOw0KLSAgICAgICAgDQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFZlcmlmeSB0aGF0IHRoZSBjb2RlIHRoYXQgdXNlcyBhIHNpbXBsZSBlbXB0eSBzcGFyc2UgY29tcG9zaXRlIHRvIGNyZWF0ZSBhbiBlbmRwb2ludC4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RTaW1wbGVDb21wb3NpdGUoKSB7DQotICAgICAgICBRTmFtZSBzZXJ2aWNlUU5hbWUgPSBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBzdmNMb2NhbFBhcnQpOw0KLSAgICAgICAgDQotICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc3ZjRGVzYyA9IERlc2NyaXB0aW9uRmFjdG9yeS5jcmVhdGVTZXJ2aWNlRGVzY3JpcHRpb24obnVsbCwgc2VydmljZVFOYW1lLCBDbGllbnREQkNTdXBwb3J0RW5kcG9pbnRTZXJ2aWNlU3ViY2xhc3MuY2xhc3MpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzdmNEZXNjKTsNCi0gICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbkltcGwgc3ZjRGVzY0ltcGwgPSAoU2VydmljZURlc2NyaXB0aW9uSW1wbCkgc3ZjRGVzYzsNCi0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBzdmNEZXNjQ29tcG9zaXRlID0gc3ZjRGVzY0ltcGwuZ2V0RGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHN2Y0Rlc2NDb21wb3NpdGUpOw0KLSAgICAgICAgDQotICAgICAgICBDbGFzcyB0ZXN0U2VydmljZUNsYXNzID0gc3ZjRGVzY0NvbXBvc2l0ZS5nZXRDb3JyZXNwb25kaW5nQ2xhc3MoKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwodGVzdFNlcnZpY2VDbGFzcyk7DQotICAgICAgICBhc3NlcnRFcXVhbHMoQ2xpZW50REJDU3VwcG9ydEVuZHBvaW50U2VydmljZVN1YmNsYXNzLmNsYXNzLCB0ZXN0U2VydmljZUNsYXNzKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gTm93IHVwZGF0ZSB3aXRoIGFuIFNFSQ0KLSAgICAgICAgUU5hbWUgcG9ydFFOYW1lID0gbmV3IFFOYW1lKG5hbWVzcGFjZVVSSSwgcG9ydExvY2FsUGFydCk7DQotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgc2V0RXBEZXNjQ29tcG9zaXRlID0gbmV3IERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSgpOw0KLSAgICAgICAgT2JqZWN0IGNvbXBvc2l0ZUtleSA9ICJLZXkxIjsNCi0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZXBEZXNjID0gDQotICAgICAgICAgICAgRGVzY3JpcHRpb25GYWN0b3J5LnVwZGF0ZUVuZHBvaW50KHN2Y0Rlc2MsIENsaWVudERCQ1N1cHBvcnRFbmRwb2ludFNFSS5jbGFzcywgcG9ydFFOYW1lLCBEZXNjcmlwdGlvbkZhY3RvcnkuVXBkYXRlVHlwZS5HRVRfUE9SVCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RXBEZXNjQ29tcG9zaXRlLCBjb21wb3NpdGVLZXkpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChlcERlc2MpOw0KLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbkltcGwgZXBEZXNjSW1wbCA9IChFbmRwb2ludERlc2NyaXB0aW9uSW1wbCkgZXBEZXNjOw0KLSAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIGVwRGVzY0NvbXBvc2l0ZSA9IGVwRGVzY0ltcGwuZ2V0RGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCk7DQotICAgICAgICAvLyBUaGUgc3BhcnNlIGNvbXBvc2l0ZSBzaG91bGQgTk9UIGJlIGVxdWFsIHRvIHRoZSBjb21wb3NpdGUgaW4gdGhlIEVuZHBvaW50RGVzY3JpcHRpb24NCi0gICAgICAgIC8vIFRoZSBzcGFyc2UgY29tcG9zaXRlIFNIT1VMRCBiZSBlcXVhbCB0byB0aGUgc3BhcnNlIGNvbXBvc2l0ZSBjb250YWluZWQgaW4gdGhlIEVuZHBvaW50RGVzY3JpcHRpb24NCi0gICAgICAgIGFzc2VydE5vdFNhbWUoc2V0RXBEZXNjQ29tcG9zaXRlLCBlcERlc2NDb21wb3NpdGUpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHNldEVwRGVzY0NvbXBvc2l0ZSwgZXBEZXNjQ29tcG9zaXRlLmdldFNwYXJzZUNvbXBvc2l0ZShjb21wb3NpdGVLZXkpKTsNCi0gICAgICAgIENsYXNzIHNlaUNsYXNzID0gZXBEZXNjQ29tcG9zaXRlLmdldENvcnJlc3BvbmRpbmdDbGFzcygpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKENsaWVudERCQ1N1cHBvcnRFbmRwb2ludFNFSS5jbGFzcywgc2VpQ2xhc3MpOw0KLSAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGRpZG4ndCBvdmVyd3JpdGUgdGhlIGNsYXNzIGluIHRoZSBTZXJ2aWNlRGVzYyBjb21wb3NpdGUNCi0gICAgICAgIGFzc2VydEVxdWFscyhDbGllbnREQkNTdXBwb3J0RW5kcG9pbnRTZXJ2aWNlU3ViY2xhc3MuY2xhc3MsIA0KLSAgICAgICAgICAgICAgICAgICAgIHN2Y0Rlc2NDb21wb3NpdGUuZ2V0Q29ycmVzcG9uZGluZ0NsYXNzKCkpOw0KLSAgICAgICAgDQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBBIGNvbXBvc2l0ZSBjYW4gbm90IGJlIHNwZWNpZmllZCB3aGVuIGRvaW5nIGFuIEFkZFBvcnQgDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkUG9ydCgpIHsNCi0gICAgICAgIFFOYW1lIHNlcnZpY2VRTmFtZSA9IG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIHN2Y0xvY2FsUGFydCk7DQotICAgICAgICANCi0gICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzdmNEZXNjID0gRGVzY3JpcHRpb25GYWN0b3J5LmNyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbihudWxsLCBzZXJ2aWNlUU5hbWUsIENsaWVudERCQ1N1cHBvcnRFbmRwb2ludFNlcnZpY2VTdWJjbGFzcy5jbGFzcyk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHN2Y0Rlc2MpOw0KLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uSW1wbCBzdmNEZXNjSW1wbCA9IChTZXJ2aWNlRGVzY3JpcHRpb25JbXBsKSBzdmNEZXNjOw0KLSAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIHN2Y0Rlc2NDb21wb3NpdGUgPSBzdmNEZXNjSW1wbC5nZXREZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUoKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwoc3ZjRGVzY0NvbXBvc2l0ZSk7DQotICAgICAgICANCi0gICAgICAgIENsYXNzIHRlc3RTZXJ2aWNlQ2xhc3MgPSBzdmNEZXNjQ29tcG9zaXRlLmdldENvcnJlc3BvbmRpbmdDbGFzcygpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh0ZXN0U2VydmljZUNsYXNzKTsNCi0gICAgICAgIGFzc2VydEVxdWFscyhDbGllbnREQkNTdXBwb3J0RW5kcG9pbnRTZXJ2aWNlU3ViY2xhc3MuY2xhc3MsIHRlc3RTZXJ2aWNlQ2xhc3MpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBOb3cgdXBkYXRlIHdpdGggYW4gU0VJDQotICAgICAgICBRTmFtZSBwb3J0UU5hbWUgPSBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBwb3J0TG9jYWxQYXJ0KTsNCi0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBzZXRFcERlc2NDb21wb3NpdGUgPSBuZXcgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCk7DQotICAgICAgICBPYmplY3QgY29tcG9zaXRlS2V5ID0gIktleTEiOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVwRGVzYyA9IA0KLSAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkZhY3RvcnkudXBkYXRlRW5kcG9pbnQoc3ZjRGVzYywgQ2xpZW50REJDU3VwcG9ydEVuZHBvaW50U0VJLmNsYXNzLCBwb3J0UU5hbWUsIERlc2NyaXB0aW9uRmFjdG9yeS5VcGRhdGVUeXBlLkFERF9QT1JULA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RXBEZXNjQ29tcG9zaXRlLCBjb21wb3NpdGVLZXkpOw0KLSAgICAgICAgICAgIGZhaWwoIlNob3VsZCBoYXZlIGNhdWdodCBhbiBleGNlcHRpb24iKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChXZWJTZXJ2aWNlRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICAvLyBFeHBlY3RlZCBwYXRoDQotICAgICAgICB9DQotICAgICAgICANCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIENvbXBvc2l0ZSBjYW4gbm90IGJlIHNwZWNpZmllZCB3aXRoIGEgQ1JFQVRFX0RJU1BBVENIDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlRGlzcGF0Y2goKSB7DQotICAgICAgICBRTmFtZSBzZXJ2aWNlUU5hbWUgPSBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBzdmNMb2NhbFBhcnQpOw0KLSAgICAgICAgDQotICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc3ZjRGVzYyA9IERlc2NyaXB0aW9uRmFjdG9yeS5jcmVhdGVTZXJ2aWNlRGVzY3JpcHRpb24obnVsbCwgc2VydmljZVFOYW1lLCBDbGllbnREQkNTdXBwb3J0RW5kcG9pbnRTZXJ2aWNlU3ViY2xhc3MuY2xhc3MpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzdmNEZXNjKTsNCi0gICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbkltcGwgc3ZjRGVzY0ltcGwgPSAoU2VydmljZURlc2NyaXB0aW9uSW1wbCkgc3ZjRGVzYzsNCi0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBzdmNEZXNjQ29tcG9zaXRlID0gc3ZjRGVzY0ltcGwuZ2V0RGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHN2Y0Rlc2NDb21wb3NpdGUpOw0KLSAgICAgICAgDQotICAgICAgICBDbGFzcyB0ZXN0U2VydmljZUNsYXNzID0gc3ZjRGVzY0NvbXBvc2l0ZS5nZXRDb3JyZXNwb25kaW5nQ2xhc3MoKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwodGVzdFNlcnZpY2VDbGFzcyk7DQotICAgICAgICBhc3NlcnRFcXVhbHMoQ2xpZW50REJDU3VwcG9ydEVuZHBvaW50U2VydmljZVN1YmNsYXNzLmNsYXNzLCB0ZXN0U2VydmljZUNsYXNzKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gTm93IHVwZGF0ZSB3aXRoIGFuIFNFSQ0KLSAgICAgICAgUU5hbWUgcG9ydFFOYW1lID0gbmV3IFFOYW1lKG5hbWVzcGFjZVVSSSwgcG9ydExvY2FsUGFydCk7DQotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgc2V0RXBEZXNjQ29tcG9zaXRlID0gbmV3IERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSgpOw0KLSAgICAgICAgT2JqZWN0IGNvbXBvc2l0ZUtleSA9ICJLZXkxIjsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlcERlc2MgPSANCi0gICAgICAgICAgICAgICAgRGVzY3JpcHRpb25GYWN0b3J5LnVwZGF0ZUVuZHBvaW50KHN2Y0Rlc2MsIG51bGwgLyogU0VJIGNhbid0IGJlIHNwZWNpZmllZCAqLywgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0UU5hbWUsIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb25GYWN0b3J5LlVwZGF0ZVR5cGUuQ1JFQVRFX0RJU1BBVENILA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RXBEZXNjQ29tcG9zaXRlLCBjb21wb3NpdGVLZXkpOw0KLSAgICAgICAgICAgIGZhaWwoIlNob3VsZCBoYXZlIGNhdWdodCBhbiBleGNlcHRpb24iKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChXZWJTZXJ2aWNlRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICAvLyBFeHBlY3RlZCBwYXRoDQotICAgICAgICAgICAgU3RyaW5nIG1zZyA9IE1lc3NhZ2VzLmdldE1lc3NhZ2UoInNlcnZpY2VEZXNjRXJyNiIpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZS50b1N0cmluZygpLmNvbnRhaW5zKG1zZykpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogVXBkYXRlIGEgcG9ydCB0aGF0IHdhcyBjcmVhdGVkIGZyb20gV1NETCAoaS5lLiBhIGRlY2xhcmVkIHBvcnQpIHdpdGggYSBjb21wb3NpdGUuICBUbyBnZXQgDQotICAgICAqIGludG8gYSBzdGF0ZSB3aGVyZSBhIGRlY2xhcmVkIHBvcnQgd291bGQgbmVlZCB0byBiZSB1cGRhdGVkOg0KLSAgICAgKiAxKSBEbyBhIENSRUFURV9ESVNQQVRDSCBvbiBhIGRlY2xhcmVkIHdzZGwgcG9ydA0KLSAgICAgKiAyKSBEbyBhIEdFVF9QT1JUIG9uIHRoYXQgcG9ydCwgcHJvdmlkaW5nIGFuIFNFSS4NCi0gICAgICogSW4gdGhpcyBjYXNlLCB0aGUgRW5kcG9pbnREZXNjcmlwdGlvbiBpcyBzaGFyZWQgYmV0d2VlbiB0aGUgdHdvLCBidXQgdGhlIHNwYXJzZSBjb21wb3NpdGUNCi0gICAgICogc3BlY2lmaWVkIG9uIHRoZSBHRVRfUE9SVCBzaG91bGQgYmUgdW5pcXVlIHRvIGl0Lg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlY2xhcmVkUG9ydCgpIHsNCi0gICAgICAgIFFOYW1lIHNlcnZpY2VRTmFtZSA9IG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIHN2Y0xvY2FsUGFydCk7DQotICAgICAgICANCi0gICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzdmNEZXNjID0gRGVzY3JpcHRpb25GYWN0b3J5LmNyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbihnZXRXc2RsVVJMKCksIHNlcnZpY2VRTmFtZSwgU2VydmljZS5jbGFzcyk7DQotDQotICAgICAgICBRTmFtZSBwb3J0UU5hbWUgPSBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBwb3J0TG9jYWxQYXJ0KTsNCi0NCi0gICAgICAgIC8vIEZpcnN0IHdlIGRvIGEgQ1JFQVRFX0RJU1BBVENIIHRvIGNyZWF0ZSB0aGUgRW5kcG9pbnREZXNjcmlwdGlvbiBmb3IgdGhlIFdTREwgcG9ydC4NCi0gICAgICAgIC8vIE5vdGUgdGhhdCB3ZSBkb24ndCBzcGVjaWZ5IGEgY29tcG9zaXRlIChiZWNhdXNlIHRoYXQgaXNuJ3QgYWxsb3dlZCBmb3IgQ1JFQVRFX0RJU1BBVENIKQ0KLSAgICAgICAgLy8gYW5kIG9uZSB3aWxsIGJlIGNyZWF0ZWQgYnkgdGhlIHJ1bnRpbWUNCi0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZXBEZXNjRm9yQ3JlYXRlID0gDQotICAgICAgICAgICAgRGVzY3JpcHRpb25GYWN0b3J5LnVwZGF0ZUVuZHBvaW50KHN2Y0Rlc2MsIG51bGwgLyogU0VJIGNhbid0IGJlIHNwZWNpZmllZCAqLywgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnRRTmFtZSwgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uRmFjdG9yeS5VcGRhdGVUeXBlLkNSRUFURV9ESVNQQVRDSCk7DQotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uSW1wbCBlcERlc2NJbXBsID0gKEVuZHBvaW50RGVzY3JpcHRpb25JbXBsKSBlcERlc2NGb3JDcmVhdGU7DQotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgY3JlYXRlRGlzcGF0Y2hDb21wb3NpdGUgPSBlcERlc2NJbXBsLmdldERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSgpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChjcmVhdGVEaXNwYXRjaENvbXBvc2l0ZSk7DQotICAgICAgICAvLyBUaGVyZSByZWFsbHkgc2hvdWxkbid0IGJlIGFueSBzcGFyc2UgY29tcG9zaXRlcyBhdCB0aGlzIHBvaW50OyBtYWtlIHN1cmUgYnkgY2hlY2tpbmcgYSANCi0gICAgICAgIC8vIGNvdXBsZSBvYnZpb3VzIHRoaW5ncyB0aGF0IG1pZ2h0IGJlIHVzZWQgYXMgYSBrZXkuDQotICAgICAgICBhc3NlcnROdWxsKGVwRGVzY0ltcGwuZ2V0RGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCkuZ2V0U3BhcnNlQ29tcG9zaXRlKGNyZWF0ZURpc3BhdGNoQ29tcG9zaXRlKSk7DQotICAgICAgICBhc3NlcnROdWxsKGVwRGVzY0ltcGwuZ2V0RGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCkuZ2V0U3BhcnNlQ29tcG9zaXRlKG51bGwpKTsNCi0NCi0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSB1cGRhdGVFbmRwb2ludENvbXBvc2l0ZSA9IG5ldyBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUoKTsNCi0gICAgICAgIE9iamVjdCBjb21wb3NpdGVLZXkgPSAiS0VZMSI7DQotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVwRGVzY0ZvckdldFBvcnQgPSANCi0gICAgICAgICAgICBEZXNjcmlwdGlvbkZhY3RvcnkudXBkYXRlRW5kcG9pbnQoc3ZjRGVzYywgQ2xpZW50REJDU3VwcG9ydEVuZHBvaW50U0VJLmNsYXNzLCBwb3J0UU5hbWUsIERlc2NyaXB0aW9uRmFjdG9yeS5VcGRhdGVUeXBlLkdFVF9QT1JULA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVFbmRwb2ludENvbXBvc2l0ZSwgY29tcG9zaXRlS2V5KTsNCi0gICAgICAgIGFzc2VydEVxdWFscyhlcERlc2NGb3JDcmVhdGUsIGVwRGVzY0ZvckdldFBvcnQpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBUaGUgdXBkYXRlIG5lZWRzIHRvIGhhdmUgc2V0IHRoZSBzcGFyc2UgY29tcG9zaXRlIChsaWtlIGZvciBhIGdpdmVuIFNlcnZpY2VEZWxlZ2F0ZQ0KLSAgICAgICAgLy8gaW5zdGFuY2UpIHdpdGhvdXQgaGF2aW5nIGxvc3QgdGhlIGRpZmZlcmVudCBjb21wb3NpdGUgZm9yIHRoZSBjcmVhdGUuICBUaGUgRW5kcG9pbnREZXNjcmlwdG9uIA0KLSAgICAgICAgLy8gY2FuIGJlIHNoYXJlZCwgYnV0IHRoZSBzcGFyc2UgY29tcG9zaXRlIG92ZXJyaWRlcyB0aGV5IGNvbnRhaW4gbmVlZCB0byBiZSB1bmlxdWUgKGxpa2UgdG8gdGhlIFNlcnZpY2VEZWxlZ2F0ZXMpDQotICAgICAgICBhc3NlcnRUcnVlKGNyZWF0ZURpc3BhdGNoQ29tcG9zaXRlICE9IHVwZGF0ZUVuZHBvaW50Q29tcG9zaXRlKTsNCi0gICAgICAgIGFzc2VydEVxdWFscyh1cGRhdGVFbmRwb2ludENvbXBvc2l0ZSwgZXBEZXNjSW1wbC5nZXREZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUoKS5nZXRTcGFyc2VDb21wb3NpdGUoY29tcG9zaXRlS2V5KSk7DQotICAgICAgICAvLyBNYWtlIHN1cmUgdGhpcyBkaWRuJ3QgY2hhbmdlIGFueSBvZiB0aGUgc3BhcnNlIGluZm9ybWF0aW9uICh3aGljaCBpcyBub25lKSBmb3IgdGhlIHByZXZpb3VzIGNyZWF0ZQ0KLSAgICAgICAgYXNzZXJ0TnVsbChlcERlc2NJbXBsLmdldERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSgpLmdldFNwYXJzZUNvbXBvc2l0ZShjcmVhdGVEaXNwYXRjaENvbXBvc2l0ZSkpOw0KLSAgICAgICAgYXNzZXJ0TnVsbChlcERlc2NJbXBsLmdldERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSgpLmdldFNwYXJzZUNvbXBvc2l0ZShudWxsKSk7DQotICAgICAgICANCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIERvIG11bHRpcGxlIEdFVF9QT1JUIG9uIHRoZSBzYW1lIHNlcnZpY2UuICBUaGlzIHNob3VsZCBzaGFyZSB0aGUgc2FtZSBFbmRwb2ludERlc2NyaXB0aW9uDQotICAgICAqIGJ1dCB0aGUgc3BhcnNlIGNvbXBvc2l0ZSBzcGVjaWZpZWQgb24gR0VUX1BPUlQgc2hvdWxkIGJlIHVuaXF1ZSB0byBlYWNoIGtleS4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aXBsZUdldFBvcnQoKSB7DQotICAgICAgICBRTmFtZSBzZXJ2aWNlUU5hbWUgPSBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBzdmNMb2NhbFBhcnQpOw0KLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHN2Y0Rlc2MgPSBEZXNjcmlwdGlvbkZhY3RvcnkuY3JlYXRlU2VydmljZURlc2NyaXB0aW9uKGdldFdzZGxVUkwoKSwgc2VydmljZVFOYW1lLCBTZXJ2aWNlLmNsYXNzKTsNCi0gICAgICAgIFFOYW1lIHBvcnRRTmFtZSA9IG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIHBvcnRMb2NhbFBhcnQpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBEbyB0aGUgZmlyc3QgR2V0UG9ydCB1c2luZyBzZDEgYXMgYSBrZXkgZm9yIHRoZSBzcGFyc2UgY29tcG9zaXRlDQotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgc2QxQ29tcG9zaXRlID0gbmV3IERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSgpOw0KLSAgICAgICAgT2JqZWN0IHNkMSA9ICJTRDEiOw0KLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlcERlc2NGb3JHZXRQb3J0MSA9IA0KLSAgICAgICAgICAgIERlc2NyaXB0aW9uRmFjdG9yeS51cGRhdGVFbmRwb2ludChzdmNEZXNjLCBDbGllbnREQkNTdXBwb3J0RW5kcG9pbnRTRUkuY2xhc3MsIHBvcnRRTmFtZSwgRGVzY3JpcHRpb25GYWN0b3J5LlVwZGF0ZVR5cGUuR0VUX1BPUlQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNkMUNvbXBvc2l0ZSwgc2QxKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwoZXBEZXNjRm9yR2V0UG9ydDEpOw0KLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbkltcGwgZXBEZXNjSW1wbDEgPSAoRW5kcG9pbnREZXNjcmlwdGlvbkltcGwpIGVwRGVzY0ZvckdldFBvcnQxOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHNkMUNvbXBvc2l0ZSwgZXBEZXNjSW1wbDEuZ2V0RGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCkuZ2V0U3BhcnNlQ29tcG9zaXRlKHNkMSkpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBEbyB0aGUgc2Vjb25kIEdldFBvcnQgdXNpbmcgc2QyIGFzIGEga2V5IGZvciB0aGUgc3BhcnNlIGNvbXBvc2l0ZQ0KLSAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIHNkMkNvbXBvc2l0ZSA9IG5ldyBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUoKTsNCi0gICAgICAgIE9iamVjdCBzZDIgPSAiU0QyIjsNCi0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZXBEZXNjRm9yR2V0UG9ydDIgPSANCi0gICAgICAgICAgICBEZXNjcmlwdGlvbkZhY3RvcnkudXBkYXRlRW5kcG9pbnQoc3ZjRGVzYywgQ2xpZW50REJDU3VwcG9ydEVuZHBvaW50U0VJLmNsYXNzLCBwb3J0UU5hbWUsIERlc2NyaXB0aW9uRmFjdG9yeS5VcGRhdGVUeXBlLkdFVF9QT1JULA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZDJDb21wb3NpdGUsIHNkMik7DQotICAgICAgICBhc3NlcnROb3ROdWxsKGVwRGVzY0ZvckdldFBvcnQyKTsNCi0gICAgICAgIGFzc2VydEVxdWFscyhlcERlc2NGb3JHZXRQb3J0MSwgZXBEZXNjRm9yR2V0UG9ydDIpOw0KLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbkltcGwgZXBEZXNjSW1wbDIgPSAoRW5kcG9pbnREZXNjcmlwdGlvbkltcGwpIGVwRGVzY0ZvckdldFBvcnQyOw0KLSAgICAgICAgYXNzZXJ0Tm90U2FtZShzZDFDb21wb3NpdGUsIHNkMkNvbXBvc2l0ZSk7DQotICAgICAgICBhc3NlcnRFcXVhbHMoc2QyQ29tcG9zaXRlLCBlcERlc2NJbXBsMi5nZXREZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUoKS5nZXRTcGFyc2VDb21wb3NpdGUoc2QyKSk7DQotICAgICAgICBhc3NlcnRFcXVhbHMoc2QxQ29tcG9zaXRlLCBlcERlc2NJbXBsMS5nZXREZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUoKS5nZXRTcGFyc2VDb21wb3NpdGUoc2QxKSk7DQotICAgIH0NCi0gICAgDQotICAgIHN0YXRpYyBVUkwgZ2V0V3NkbFVSTCgpIHsNCi0gICAgICAgIFVSTCB1cmwgPSBudWxsOw0KLSAgICAgICAgU3RyaW5nIHdzZGxMb2NhdGlvbiA9IG51bGw7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIHRyeXsNCi0gICAgICAgICAgICAgICAgU3RyaW5nIGJhc2VEaXIgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoImJhc2VkaXIiLCIuIikpLmdldENhbm9uaWNhbFBhdGgoKTsNCi0gICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgIHdzZGxMb2NhdGlvbiA9IG5ldyBGaWxlKGJhc2VEaXIgKyAiL3Rlc3QtcmVzb3VyY2VzL3dzZGwvQ2xpZW50RW5kcG9pbnRNZXRhZGF0YS53c2RsIikuZ2V0QWJzb2x1dGVQYXRoKCk7DQotICAgICAgICAgICAgfWNhdGNoKEV4Y2VwdGlvbiBlKXsNCi0gICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIGNyZWF0aW5nIEZpbGUoV1NETCk6ICIgKyBlLnRvU3RyaW5nKCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZSh3c2RsTG9jYXRpb24pOw0KLSAgICAgICAgICAgIHVybCA9IGZpbGUudG9VUkwoKTsNCi0gICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gY29udmVydGluZyBXU0RMIGZpbGUgdG8gVVJMOiAiICsgZS50b1N0cmluZygpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB1cmw7DQotICAgIH0NCi0NCi19DQotDQotQFdlYlNlcnZpY2VDbGllbnQodGFyZ2V0TmFtZXNwYWNlPSJvcmlnaW5hbFROUyIsIHdzZGxMb2NhdGlvbj0ib3JpZ2luYWxXc2RsTG9jYXRpb24iKQ0KLWNsYXNzIENsaWVudERCQ1N1cHBvcnRFbmRwb2ludFNlcnZpY2VTdWJjbGFzcyBleHRlbmRzIGphdmF4LnhtbC53cy5TZXJ2aWNlIHsNCi0NCi0gICAgcHJvdGVjdGVkIENsaWVudERCQ1N1cHBvcnRFbmRwb2ludFNlcnZpY2VTdWJjbGFzcyhVUkwgd3NkbERvY3VtZW50TG9jYXRpb24sIFFOYW1lIHNlcnZpY2VOYW1lKSB7DQotICAgICAgICBzdXBlcih3c2RsRG9jdW1lbnRMb2NhdGlvbiwgc2VydmljZU5hbWUpOw0KLSAgICB9DQotfQ0KLQ0KLUBXZWJTZXJ2aWNlDQotaW50ZXJmYWNlIENsaWVudERCQ1N1cHBvcnRFbmRwb2ludFNFSSB7DQotICAgIHB1YmxpYyBTdHJpbmcgZWNobyAoU3RyaW5nIHN0cmluZyk7DQotfQ0KLQ0KLUBXZWJTZXJ2aWNlKHNlcnZpY2VOYW1lID0gIkVjaG9TZXJ2aWNlIiwgZW5kcG9pbnRJbnRlcmZhY2U9Im9yZy5hcGFjaGUud3MuYXhpczIudGVzdHMuRWNob1BvcnQiKQ0KLWNsYXNzIENsaWVudERCQ1N1cHBvcnRFbmRwb2ludEVjaG9TZXJ2aWNlSW1wbFdpdGhTRUkgew0KLSAgICBwdWJsaWMgdm9pZCBlY2hvKEhvbGRlcjxTdHJpbmc+IHRleHQpIHsNCi0gICAgICAgIHRleHQudmFsdWUgPSAiRWNobyAiICsgdGV4dC52YWx1ZTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vaW1wbC9DbGllbnREQkNTdXBwb3J0SGFuZGxlcnNUZXN0cy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2ltcGwvQ2xpZW50REJDU3VwcG9ydEhhbmRsZXJzVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFmNjUyYi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vaW1wbC9DbGllbnREQkNTdXBwb3J0SGFuZGxlcnNUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uaW1wbDsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkRlc2NyaXB0aW9uRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5FbmRwb2ludERlc2NyaXB0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLlNlcnZpY2VEZXNjcmlwdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLkRlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi54bWwuaGFuZGxlci5IYW5kbGVyQ2hhaW5zVHlwZTsNCi0NCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlQ2xpZW50Ow0KLWltcG9ydCBqYXZhLmlvLkZpbGU7DQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07DQotaW1wb3J0IGphdmEubmV0LlVSTDsNCi0NCi0vKioNCi0gKiBUZXN0IGNsaWVudCBjb21wb3NpdGUgc3VwcG9ydCBmb3IgaGFuZGxlciBjaGFpbnMgc3BlY2lmaWVkIHZpYSBzcGFyc2UgY29tcG9zaXRlcw0KLSAqIGFwcGxpZWQgdG8gc2VydmljZXMgYW5kIHBvcnRzLg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBDbGllbnREQkNTdXBwb3J0SGFuZGxlcnNUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZXNwYWNlVVJJID0gImh0dHA6Ly9vcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmltcGwuQ2xpZW50REJDU3VwcG9ydEhhbmRsZXJzVGVzdHMiOw0KLSAgICBwcml2YXRlIFN0cmluZyBzdmNMb2NhbFBhcnQgPSAic3ZjTG9jYWxQYXJ0IjsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgc3ZjTG9jYWxQYXJ0MiA9ICJzdmNMb2NhbFBhcnQyIjsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgcG9ydExvY2FsUGFydCA9ICJwb3J0TG9jYWxQYXJ0IjsNCi0NCi0gICAgLyoqDQotICAgICAqIENyZWF0ZSBhIFNlcnZpY2VEZXNjcmlwdGlvbiBzcGVjaWZ5aW5nIGEgSGFuZGxlckNoYWlucyBUeXBlIGluIGEgc3BhcnNlIGNvbXBvc2l0ZQ0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdEhhbmRsZXJzT25TZXJ2aWNlKCkgew0KLSAgICAgICAgUU5hbWUgc2VydmljZVFOYW1lID0gbmV3IFFOYW1lKG5hbWVzcGFjZVVSSSwgc3ZjTG9jYWxQYXJ0KTsNCi0gICAgICAgIC8vIENyZWF0ZSBhIGNvbXBvc2l0ZSB3aXRoIGEgSkFYQiBIYW5kbGVyIENvbmZpZyANCi0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCk7DQotDQotICAgICAgICBIYW5kbGVyQ2hhaW5zVHlwZSBoYW5kbGVyQ2hhaW5zVHlwZSA9IGdldEhhbmRsZXJDaGFpbnNUeXBlKCk7DQotICAgICAgICBjb21wb3NpdGUuc2V0SGFuZGxlckNoYWluc1R5cGUoaGFuZGxlckNoYWluc1R5cGUpOw0KLSAgICAgICAgT2JqZWN0IGNvbXBvc2l0ZUtleSA9ICJDb21wb3NpdGVLZXkiOw0KLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHN2Y0Rlc2MgPSANCi0gICAgICAgICAgICBEZXNjcmlwdGlvbkZhY3RvcnkuY3JlYXRlU2VydmljZURlc2NyaXB0aW9uKG51bGwsIHNlcnZpY2VRTmFtZSwgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xpZW50REJDU3VwcG9ydEhhbmRsZXJzU2VydmljZS5jbGFzcywgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9zaXRlLCBjb21wb3NpdGVLZXkpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzdmNEZXNjKTsNCi0gICAgICAgIC8vIFRoZXJlIHNob3VsZCBvbmx5IGJlIGEgaGFuZGxlciBjaGFpbiBmb3IgdGhlIGdpdmVuIGtleS4NCi0gICAgICAgIGFzc2VydE51bGwoc3ZjRGVzYy5nZXRIYW5kbGVyQ2hhaW4oKSk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHN2Y0Rlc2MuZ2V0SGFuZGxlckNoYWluKCJDb21wb3NpdGVLZXkiKSk7DQotICAgICAgICBhc3NlcnROdWxsKHN2Y0Rlc2MuZ2V0SGFuZGxlckNoYWluKCJXcm9uZ0tleSIpKTsNCi0gICAgICAgIA0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogQ3JlYXRlIGFuIEVuZHBvaW50RGVzY3JpdG9pbiBzcGVjaWZ5aW5nIGEgSGFuZGxlckNoYWluc1R5cGUgaW4gYSBzcGFyc2UgY29tcG9zaXRlLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdEhhbmRsZXJzT25FbmRwb2ludCgpIHsNCi0gICAgICAgIC8vIE5vdGUgdGhhdCBVbml0IHRlc3RzIGluIHRoZSBNYXZlbiBlbnZpcm9ubWVudCBydW4gd2l0aGluIGEgc2luZ2xlIGluc3RhbmNlIG9mIHRoZSBKVk0NCi0gICAgICAgIC8vIHdoaWNoIG1lYW5zIHRoYXQgdGhlIFNlcnZpY2VEZXNjcmlwdGlvbiBjcmF0ZWQgYnkgcHJldmlvdXMgdGVzdHMgc3RpbGwgZXhpc3RzLiAgU28NCi0gICAgICAgIC8vIHdlIGhhdmUgdG8gdXNlIGEgZGlmZmVyZW50IHNlcnZpY2UgUU5hbWUgdG8gYmUgc3VyZSB0byBhbHdheXMgZ2V0IGEgbmV3IFNlcnZpY2VEZXNjcmlwdGlvbg0KLSAgICAgICAgLy8gb3Igd2UgY291bGQgcGljayB1cCBhIHNwYXJzZSBjb21wb3NpdGUgd2l0aCBrZXkgIkNvbXBvc2l0ZUtleSIgc2V0IG9uIGEgU2VydmljZURlc2NyaXB0aW9uDQotICAgICAgICAvLyBieSBhbm90aGVyIHRlc3QsIGNhdXNpbmcgdGhlIGFzc2VydE51bGwoc3ZjRGVzYy5nZXRIYW5kbGVyQ2hhaW4oIkNvbXBvc2l0ZUtleSIpKSBiZWxvdw0KLSAgICAgICAgLy8gdG8gZmFpbA0KLSAgICAgICAgUU5hbWUgc2VydmljZVFOYW1lID0gbmV3IFFOYW1lKG5hbWVzcGFjZVVSSSwgc3ZjTG9jYWxQYXJ0Mik7DQotICAgICAgICBRTmFtZSBwb3J0UU5hbWUgPSBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBwb3J0TG9jYWxQYXJ0KTsNCi0NCi0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCk7DQotDQotICAgICAgICBIYW5kbGVyQ2hhaW5zVHlwZSBoYW5kbGVyQ2hhaW5zVHlwZSA9IGdldEhhbmRsZXJDaGFpbnNUeXBlKCk7DQotICAgICAgICBjb21wb3NpdGUuc2V0SGFuZGxlckNoYWluc1R5cGUoaGFuZGxlckNoYWluc1R5cGUpOw0KLSAgICAgICAgT2JqZWN0IGNvbXBvc2l0ZUtleSA9ICJDb21wb3NpdGVLZXkiOw0KLQ0KLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHN2Y0Rlc2MgPSANCi0gICAgICAgICAgICBEZXNjcmlwdGlvbkZhY3RvcnkuY3JlYXRlU2VydmljZURlc2NyaXB0aW9uKG51bGwsIHNlcnZpY2VRTmFtZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGllbnREQkNTdXBwb3J0SGFuZGxlcnNTZXJ2aWNlLmNsYXNzLCANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBudWxsKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwoc3ZjRGVzYyk7DQotICAgICAgICANCi0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZXBEZXNjID0gDQotICAgICAgICAgICAgRGVzY3JpcHRpb25GYWN0b3J5LnVwZGF0ZUVuZHBvaW50KHN2Y0Rlc2MsIENsaWVudERCQ1N1cHBvcnRIYW5kbGVyc1NFSS5jbGFzcywgcG9ydFFOYW1lLCANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb25GYWN0b3J5LlVwZGF0ZVR5cGUuR0VUX1BPUlQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvc2l0ZSwgY29tcG9zaXRlS2V5KTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwoZXBEZXNjKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gVGhlcmUgc2hvdWxkIGJlIG5vIGhhbmRsZXIgaW5mbyBvbiB0aGUgU2VydmljZSwgYnV0IHRoZXJlIHNob3VsZCBiZSBvbiB0aGUgRW5kcG9pbnQgDQotICAgICAgICBhc3NlcnROdWxsKHN2Y0Rlc2MuZ2V0SGFuZGxlckNoYWluKCkpOw0KLSAgICAgICAgYXNzZXJ0TnVsbChzdmNEZXNjLmdldEhhbmRsZXJDaGFpbigiQ29tcG9zaXRlS2V5IikpOw0KLSAgICAgICAgYXNzZXJ0TnVsbChzdmNEZXNjLmdldEhhbmRsZXJDaGFpbigiV3JvbmdLZXkiKSk7DQotICAgICAgICANCi0gICAgICAgIGFzc2VydE51bGwoZXBEZXNjLmdldEhhbmRsZXJDaGFpbigpKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwoZXBEZXNjLmdldEhhbmRsZXJDaGFpbigiQ29tcG9zaXRlS2V5IikpOw0KLSAgICAgICAgYXNzZXJ0TnVsbChlcERlc2MuZ2V0SGFuZGxlckNoYWluKCJXcm9uZ0tleSIpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIEhhbmRsZXJDaGFpbnNUeXBlIGdldEhhbmRsZXJDaGFpbnNUeXBlKCkgew0KLSAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBnZXRYTUxGaWxlU3RyZWFtKCk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKGlzKTsNCi0gICAgICAgIEhhbmRsZXJDaGFpbnNUeXBlIHJldHVybkhDVCA9IERlc2NyaXB0aW9uVXRpbHMubG9hZEhhbmRsZXJDaGFpbnMoaXMsIHRoaXMuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwocmV0dXJuSENUKTsNCi0gICAgICAgIHJldHVybiByZXR1cm5IQ1Q7DQotICAgIH0NCi0gICAgcHJpdmF0ZSBJbnB1dFN0cmVhbSBnZXRYTUxGaWxlU3RyZWFtKCkgew0KLSAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBudWxsOw0KLSAgICAgICAgU3RyaW5nIGNvbmZpZ0xvYyA9IG51bGw7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIFN0cmluZyBzZXAgPSAiLyI7DQotICAgICAgICAgICAgY29uZmlnTG9jID0gc2VwICsgInRlc3QtcmVzb3VyY2VzIiArIHNlcCArICJ0ZXN0LWhhbmRsZXIueG1sIjsNCi0gICAgICAgICAgICBTdHJpbmcgYmFzZURpciA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiYmFzZWRpciIsIi4iKSkuZ2V0Q2Fub25pY2FsUGF0aCgpOw0KLSAgICAgICAgICAgIGlzID0gbmV3IEZpbGUoYmFzZURpciArIGNvbmZpZ0xvYykudG9VUkwoKS5vcGVuU3RyZWFtKCk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gaXM7DQotICAgIH0NCi0NCi19DQotDQotQFdlYlNlcnZpY2VDbGllbnQNCi1jbGFzcyBDbGllbnREQkNTdXBwb3J0SGFuZGxlcnNTZXJ2aWNlIGV4dGVuZHMgamF2YXgueG1sLndzLlNlcnZpY2Ugew0KLSAgICBwcm90ZWN0ZWQgQ2xpZW50REJDU3VwcG9ydEhhbmRsZXJzU2VydmljZShVUkwgd3NkbERvY3VtZW50TG9jYXRpb24sIFFOYW1lIHNlcnZpY2VOYW1lKSB7DQotICAgICAgICBzdXBlcih3c2RsRG9jdW1lbnRMb2NhdGlvbiwgc2VydmljZU5hbWUpOw0KLSAgICB9DQotfQ0KLQ0KLUBXZWJTZXJ2aWNlDQotaW50ZXJmYWNlIENsaWVudERCQ1N1cHBvcnRIYW5kbGVyc1NFSSB7DQotICAgIHB1YmxpYyBTdHJpbmcgZWNobyhTdHJpbmcgdG9FY2hvKTsNCi19DQotDQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2ltcGwvQ2xpZW50REJDU3VwcG9ydFRlc3RzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vaW1wbC9DbGllbnREQkNTdXBwb3J0VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q5ODlhNi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vaW1wbC9DbGllbnREQkNTdXBwb3J0VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmltcGw7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5EZXNjcmlwdGlvbkZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRGVzY3JpcHRpb25UZXN0VXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRW5kcG9pbnREZXNjcmlwdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5TZXJ2aWNlRGVzY3JpcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5EZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5XZWJTZXJ2aWNlQ2xpZW50QW5ub3Q7DQotDQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOw0KLWltcG9ydCBqYXZheC54bWwud3MuSG9sZGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUNsaWVudDsNCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLQ0KLS8qKg0KLSAqIFRlc3QgY2xpZW50IHNwYXJzZSBjb21wb3NpdGUgc3VwcG9ydCBpbiB0aGUgTURRIGxheWVyIGF0IHRoZSBTZXJ2aWNlIGNyZWF0aW9uIGxldmVsLg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBDbGllbnREQkNTdXBwb3J0VGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7DQotICAgIHByaXZhdGUgU3RyaW5nIG5hbWVzcGFjZVVSSSA9ICJodHRwOi8vb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5pbXBsLkNsaWVudERCQ1N1cHBvcnRUZXN0cyI7DQotICAgIHByaXZhdGUgU3RyaW5nIHN2Y0xvY2FsUGFydCA9ICJzdmNMb2NhbFBhcnQiOw0KLSAgICBwcml2YXRlIFN0cmluZyBwb3J0TG9jYWxQYXJ0ID0gInBvcnRMb2NhbFBhcnQiOw0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFRlc3QgdGhlIHByZXZpb3VzIHdheSBvZiBjb25zdHJ1Y3RpbmcgYSBTZXJ2aWNlRGVzY3JpcHRpb24gYW5kIHRoZW4gdXBkYXRpbmcgaXQgd2l0aCBhbiANCi0gICAgICogRW5kcG9pbnQuICBUaGlzIGlzIHZlcmlmeWluZyB0aGF0IHRoZSBwcmV2aW91cyBBUElzIHdvcmsgYXMgZXhwZWN0ZWQuDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2VydmljZUFuZFNlaUNsYXNzKCkgew0KLSAgICAgICAgDQotICAgICAgICBRTmFtZSBzZXJ2aWNlUU5hbWUgPSBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBzdmNMb2NhbFBhcnQpOw0KLSAgICAgICAgDQotICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc3ZjRGVzYyA9IERlc2NyaXB0aW9uRmFjdG9yeS5jcmVhdGVTZXJ2aWNlRGVzY3JpcHRpb24obnVsbCwgc2VydmljZVFOYW1lLCBDbGllbnREQkNTdXBwb3J0U2VydmljZVN1YmNsYXNzLmNsYXNzKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwoc3ZjRGVzYyk7DQotICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb25JbXBsIHN2Y0Rlc2NJbXBsID0gKFNlcnZpY2VEZXNjcmlwdGlvbkltcGwpIHN2Y0Rlc2M7DQotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgc3ZjRGVzY0NvbXBvc2l0ZSA9IHN2Y0Rlc2NJbXBsLmdldERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSgpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzdmNEZXNjQ29tcG9zaXRlKTsNCi0gICAgICAgIA0KLSAgICAgICAgQ2xhc3MgdGVzdFNlcnZpY2VDbGFzcyA9IHN2Y0Rlc2NDb21wb3NpdGUuZ2V0Q29ycmVzcG9uZGluZ0NsYXNzKCk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHRlc3RTZXJ2aWNlQ2xhc3MpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKENsaWVudERCQ1N1cHBvcnRTZXJ2aWNlU3ViY2xhc3MuY2xhc3MsIHRlc3RTZXJ2aWNlQ2xhc3MpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBOb3cgdXBkYXRlIHdpdGggYW4gU0VJDQotICAgICAgICBRTmFtZSBwb3J0UU5hbWUgPSBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBwb3J0TG9jYWxQYXJ0KTsNCi0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZXBEZXNjID0gDQotICAgICAgICAgICAgRGVzY3JpcHRpb25GYWN0b3J5LnVwZGF0ZUVuZHBvaW50KHN2Y0Rlc2MsIENsaWVudERCQ1N1cHBvcnRTRUkuY2xhc3MsIHBvcnRRTmFtZSwgRGVzY3JpcHRpb25GYWN0b3J5LlVwZGF0ZVR5cGUuR0VUX1BPUlQpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChlcERlc2MpOw0KLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbkltcGwgZXBEZXNjSW1wbCA9IChFbmRwb2ludERlc2NyaXB0aW9uSW1wbCkgZXBEZXNjOw0KLSAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIGVwRGVzY0NvbXBvc2l0ZSA9IGVwRGVzY0ltcGwuZ2V0RGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCk7DQotICAgICAgICBDbGFzcyBzZWlDbGFzcyA9IGVwRGVzY0NvbXBvc2l0ZS5nZXRDb3JyZXNwb25kaW5nQ2xhc3MoKTsNCi0gICAgICAgIGFzc2VydEVxdWFscyhDbGllbnREQkNTdXBwb3J0U0VJLmNsYXNzLCBzZWlDbGFzcyk7DQotICAgICAgICAvLyBNYWtlIHN1cmUgd2UgZGlkbid0IG92ZXJ3cml0ZSB0aGUgY2xhc3MgaW4gdGhlIFNlcnZpY2VEZXNjIGNvbXBvc2l0ZQ0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKENsaWVudERCQ1N1cHBvcnRTZXJ2aWNlU3ViY2xhc3MuY2xhc3MsIA0KLSAgICAgICAgICAgICAgICAgICAgIHN2Y0Rlc2NDb21wb3NpdGUuZ2V0Q29ycmVzcG9uZGluZ0NsYXNzKCkpOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogQ3JlYXRlIGEgU2VydmljZURlc2NyaXB0aW9uIHdpdGggYSBjb21wb3NpdGUuICBOb3RoaW5nIGluIHRoZSBjb21wb3NpdGUgaXMgb3ZlcnJpZGVuOyB2YWxpZGF0ZQ0KLSAgICAgKiB0aGUgdmFsdWVzIGZyb20gdGhlIGFubm90aW9ucyBpbiB0aGUgU2VydmljZSBjbGFzcy4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RDbGllbnRTZXJ2aWNlQ2xhc3NDb21wb3NpdGUoKSB7DQotICAgICAgICBRTmFtZSBzZXJ2aWNlUU5hbWUgPSBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBzdmNMb2NhbFBhcnQpOw0KLSAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUoKTsNCi0gICAgICAgIE9iamVjdCBjb21wb3NpdGVLZXkgPSAiQ29tcG9zaXRlS2V5IjsNCi0gICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzdmNEZXNjID0gDQotICAgICAgICAgICAgbmV3IFNlcnZpY2VEZXNjcmlwdGlvbkltcGwobnVsbCwgc2VydmljZVFOYW1lLCANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGllbnREQkNTdXBwb3J0U2VydmljZVN1YmNsYXNzLmNsYXNzLCANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb3NpdGUsIGNvbXBvc2l0ZUtleSk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHN2Y0Rlc2MpOw0KLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uSW1wbCBzdmNEZXNjSW1wbCA9IChTZXJ2aWNlRGVzY3JpcHRpb25JbXBsKSBzdmNEZXNjOw0KLSAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIHN2Y0Rlc2NDb21wb3NpdGUgPSBzdmNEZXNjSW1wbC5nZXREZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUoKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwoc3ZjRGVzY0NvbXBvc2l0ZSk7DQotICAgICAgICBhc3NlcnROb3RTYW1lKGNvbXBvc2l0ZSwgc3ZjRGVzY0NvbXBvc2l0ZSk7DQotICAgICAgICBhc3NlcnRTYW1lKGNvbXBvc2l0ZSwgc3ZjRGVzY0NvbXBvc2l0ZS5nZXRTcGFyc2VDb21wb3NpdGUoY29tcG9zaXRlS2V5KSk7DQotICAgICAgICANCi0gICAgICAgIFdlYlNlcnZpY2VDbGllbnQgd3NDbGllbnQgPSBzdmNEZXNjQ29tcG9zaXRlLmdldFdlYlNlcnZpY2VDbGllbnRBbm5vdCgpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh3c0NsaWVudCk7DQotICAgICAgICBhc3NlcnRFcXVhbHMoIm9yaWdpbmFsV3NkbExvY2F0aW9uIiwgd3NDbGllbnQud3NkbExvY2F0aW9uKCkpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJvcmlnaW5hbFROUyIsIHdzQ2xpZW50LnRhcmdldE5hbWVzcGFjZSgpKTsNCi0gICAgICAgIC8vIFdlJ3JlIHRlc3RpbmcgdGhlIGNvbXBvc2l0ZSwgbm90IHRoZSBtZXRhZGF0YSBsYXllciwgc28gbm9uZSBvZiB0aGUgZGVmYXVsdGluZyBsb2dpYw0KLSAgICAgICAgLy8gaXMgZXhlcmNpc2VkLg0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCB3c0NsaWVudC5uYW1lKCkpOw0KLSAgICAgICAgDQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBDcmVhdGUgYSBTZXJ2aWNlRGVzY3JpcHRpb24gdXNpbmcgYSBzcGFyc2UgY29tcG9zaXRlIHRoYXQgb3ZlcnJpZGVzIHRoZSB3c2RsTG9jYXRpb24gb24gdGhlDQotICAgICAqIFdlYlNlcnZpY2VDbGllbnQgYW5ub3RhdGlvbi4gIFZhbGlkYXRlIHRoZSBvdmVycmlkZSBvbmx5IGFmZmVjdHMgdGhlIHdzZGxMb2NhdGlvbiBhbmQgbm90DQotICAgICAqIHRoZSBvdGhlciBhbm5vdGF0aW9ucyBtZW1iZXJzLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdFNlcnZpY2VDbGllbnRXU0RMTG9jYXRpb25PdmVycmlkZSgpIHsNCi0gICAgICAgIFFOYW1lIHNlcnZpY2VRTmFtZSA9IG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIHN2Y0xvY2FsUGFydCk7DQotICAgICAgICAvLyBDcmVhdGUgYSBjb21wb3NpdGUgd2l0aCBhIFdlYlNlcnZpY2VDbGllbnQgb3ZlcnJpZGUgb2YgdGhlIFdTREwgbG9jYXRpb24uDQotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSgpOw0KLSAgICAgICAgU3RyaW5nIG92ZXJyaWRlbldzZGxMb2NhdGlvbiA9IERlc2NyaXB0aW9uVGVzdFV0aWxzLmdldFdTRExMb2NhdGlvbigiQ2xpZW50RW5kcG9pbnRNZXRhZGF0YS53c2RsIik7DQotICAgICAgICBXZWJTZXJ2aWNlQ2xpZW50QW5ub3Qgd3NDbGllbnRBbm5vID0gV2ViU2VydmljZUNsaWVudEFubm90LmNyZWF0ZVdlYlNlcnZpY2VDbGllbnRBbm5vdEltcGwobnVsbCwgbnVsbCwgb3ZlcnJpZGVuV3NkbExvY2F0aW9uKTsNCi0gICAgICAgIGNvbXBvc2l0ZS5zZXRXZWJTZXJ2aWNlQ2xpZW50QW5ub3Qod3NDbGllbnRBbm5vKTsNCi0gICAgICAgIE9iamVjdCBjb21wb3NpdGVLZXkgPSAiQ29tcG9zaXRlS2V5IjsNCi0gICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzdmNEZXNjID0gDQotICAgICAgICAgICAgbmV3IFNlcnZpY2VEZXNjcmlwdGlvbkltcGwobnVsbCwgc2VydmljZVFOYW1lLCANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGllbnREQkNTdXBwb3J0U2VydmljZVN1YmNsYXNzLmNsYXNzLCANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb3NpdGUsIGNvbXBvc2l0ZUtleSk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHN2Y0Rlc2MpOw0KLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uSW1wbCBzdmNEZXNjSW1wbCA9IChTZXJ2aWNlRGVzY3JpcHRpb25JbXBsKSBzdmNEZXNjOw0KLSAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIHN2Y0Rlc2NDb21wb3NpdGUgPSBzdmNEZXNjSW1wbC5nZXREZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUoKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwoc3ZjRGVzY0NvbXBvc2l0ZSk7DQotICAgICAgICBhc3NlcnROb3RTYW1lKGNvbXBvc2l0ZSwgc3ZjRGVzY0NvbXBvc2l0ZSk7DQotICAgICAgICBhc3NlcnRTYW1lKGNvbXBvc2l0ZSwgc3ZjRGVzY0NvbXBvc2l0ZS5nZXRTcGFyc2VDb21wb3NpdGUoY29tcG9zaXRlS2V5KSk7DQotICAgICAgICAvLyBUaGUgY2xpZW50IGFubm90IHdlIHNldCBhcyBhIHNwYXJzZSBjb21wb3NpdGUgc2hvdWxkIGJlIHRoZSBzYW1lLg0KLSAgICAgICAgYXNzZXJ0U2FtZSh3c0NsaWVudEFubm8sIHN2Y0Rlc2NDb21wb3NpdGUuZ2V0U3BhcnNlQ29tcG9zaXRlKGNvbXBvc2l0ZUtleSkuZ2V0V2ViU2VydmljZUNsaWVudEFubm90KCkpOw0KLSAgICAgICAgLy8gVGhlIFdlYlNlcnZpY2VDbGllbnQgYW5ub3Qgb24gdGhlIHNlcnZpY2UgZGVzYyBzaG91bGQgcmVwcmVzZW50IHRoZSB3c2RsIG92ZXJyaWRlIGZyb20gdGhlDQotICAgICAgICAvLyBzcGFyc2UgY29tcG9zaXRlIA0KLSAgICAgICAgV2ViU2VydmljZUNsaWVudCB3c0NsaWVudCA9IHN2Y0Rlc2NDb21wb3NpdGUuZ2V0V2ViU2VydmljZUNsaWVudEFubm90KGNvbXBvc2l0ZUtleSk7DQotICAgICAgICBhc3NlcnRFcXVhbHMob3ZlcnJpZGVuV3NkbExvY2F0aW9uLCB3c0NsaWVudC53c2RsTG9jYXRpb24oKSk7DQotICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIG5vbi1vdmVycmlkZGVuIHZhbHVlcyBzdGlsbCBjb21lIGZyb20gdGhlIHNlcnZpY2UgY2xhc3MgYW5ub3RhdGlvbg0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJvcmlnaW5hbFROUyIsIHdzQ2xpZW50LnRhcmdldE5hbWVzcGFjZSgpKTsNCi0gICAgICAgIGFzc2VydEVxdWFscygiIiwgd3NDbGllbnQubmFtZSgpKTsNCi0gICAgICAgIA0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogVGVzdCB0aGUgYWJpbGl0eSB0byBzZXQgYSBwcmVmZXJlZCBwb3J0IG9uIGEgc2VydmljZSBkZXNjcmlwdGlvbiB2aWEgIGEgc3BhcnNlIGNvbXBvc2l0ZS4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RQcmVmZXJyZWRQb3J0KCkgew0KLSAgICAgICAgUU5hbWUgc2VydmljZVFOYW1lID0gbmV3IFFOYW1lKG5hbWVzcGFjZVVSSSwgc3ZjTG9jYWxQYXJ0KTsNCi0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCk7DQotICAgICAgICBRTmFtZSBwcmVmZXJyZWRQb3J0ID0gbmV3IFFOYW1lKCJwcmVmZXJyZWRUTlMiLCAicHJlZmVycmVkTFAiKTsNCi0gICAgICAgIGNvbXBvc2l0ZS5zZXRQcmVmZXJyZWRQb3J0KHByZWZlcnJlZFBvcnQpOw0KLSAgICAgICAgT2JqZWN0IGNvbXBvc2l0ZUtleSA9ICJDb21wb3NpdGVLZXkiOw0KLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHN2Y0Rlc2MgPSANCi0gICAgICAgICAgICBEZXNjcmlwdGlvbkZhY3RvcnkuY3JlYXRlU2VydmljZURlc2NyaXB0aW9uKG51bGwsIHNlcnZpY2VRTmFtZSwgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGllbnREQkNTdXBwb3J0U2VydmljZVN1YmNsYXNzLmNsYXNzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9zaXRlLCBjb21wb3NpdGVLZXkpOw0KLSAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIHN2Y0Rlc2NDb21wb3NpdGUgPSBEZXNjcmlwdGlvblRlc3RVdGlscy5nZXRTZXJ2aWNlRGVzY3JpcHRpb25Db21wb3NpdGUoc3ZjRGVzYyk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHN2Y0Rlc2NDb21wb3NpdGUpOw0KLSAgICAgICAgYXNzZXJ0TnVsbChzdmNEZXNjQ29tcG9zaXRlLmdldFByZWZlcnJlZFBvcnQoKSk7DQotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgc3ZjRGVzY1NwYXJzZUNvbXBvc2l0ZSA9IHN2Y0Rlc2NDb21wb3NpdGUuZ2V0U3BhcnNlQ29tcG9zaXRlKGNvbXBvc2l0ZUtleSk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHN2Y0Rlc2NTcGFyc2VDb21wb3NpdGUpOw0KLSAgICAgICAgYXNzZXJ0U2FtZShwcmVmZXJyZWRQb3J0LCBzdmNEZXNjU3BhcnNlQ29tcG9zaXRlLmdldFByZWZlcnJlZFBvcnQoKSk7DQotICAgICAgICBhc3NlcnRTYW1lKHByZWZlcnJlZFBvcnQsIHN2Y0Rlc2NDb21wb3NpdGUuZ2V0UHJlZmVycmVkUG9ydChjb21wb3NpdGVLZXkpKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogVGVzdCB0aGUgYWJpbGl0eSB0byBzZXQgTVRPTSBlbmFibGVtZW50IG9uIGEgc2VydmljZSBkZXNjcmlwdGlvbiB2aWEgYSBzcGFyc2UgY29tcG9zaXRlLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdE1UT01FbmFibGVtZW50KCkgew0KLSAgICAgICAgUU5hbWUgc2VydmljZVFOYW1lID0gbmV3IFFOYW1lKG5hbWVzcGFjZVVSSSwgc3ZjTG9jYWxQYXJ0KTsNCi0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCk7DQotICAgICAgICBjb21wb3NpdGUuc2V0SXNNVE9NRW5hYmxlZCh0cnVlKTsNCi0gICAgICAgIE9iamVjdCBjb21wb3NpdGVLZXkgPSAiQ29tcG9zaXRlS2V5IjsNCi0gICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzdmNEZXNjID0gDQotICAgICAgICAgICAgRGVzY3JpcHRpb25GYWN0b3J5LmNyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbihudWxsLCBzZXJ2aWNlUU5hbWUsIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xpZW50REJDU3VwcG9ydFNlcnZpY2VTdWJjbGFzcy5jbGFzcywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvc2l0ZSwgY29tcG9zaXRlS2V5KTsNCi0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBzdmNEZXNjQ29tcG9zaXRlID0gRGVzY3JpcHRpb25UZXN0VXRpbHMuZ2V0U2VydmljZURlc2NyaXB0aW9uQ29tcG9zaXRlKHN2Y0Rlc2MpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzdmNEZXNjQ29tcG9zaXRlKTsNCi0gICAgICAgIGFzc2VydEZhbHNlKHN2Y0Rlc2NDb21wb3NpdGUuaXNNVE9NRW5hYmxlZCgpKTsNCi0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBzdmNEZXNjU3BhcnNlQ29tcG9zaXRlID0gc3ZjRGVzY0NvbXBvc2l0ZS5nZXRTcGFyc2VDb21wb3NpdGUoY29tcG9zaXRlS2V5KTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwoc3ZjRGVzY1NwYXJzZUNvbXBvc2l0ZSk7DQotICAgICAgICBhc3NlcnRUcnVlKHN2Y0Rlc2NTcGFyc2VDb21wb3NpdGUuaXNNVE9NRW5hYmxlZCgpKTsNCi0gICAgICAgIGFzc2VydFRydWUoc3ZjRGVzY0NvbXBvc2l0ZS5pc01UT01FbmFibGVkKGNvbXBvc2l0ZUtleSkpOw0KLSAgICB9DQotDQotfQ0KLQ0KLUBXZWJTZXJ2aWNlQ2xpZW50KHRhcmdldE5hbWVzcGFjZT0ib3JpZ2luYWxUTlMiLCB3c2RsTG9jYXRpb249Im9yaWdpbmFsV3NkbExvY2F0aW9uIikNCi1jbGFzcyBDbGllbnREQkNTdXBwb3J0U2VydmljZVN1YmNsYXNzIGV4dGVuZHMgamF2YXgueG1sLndzLlNlcnZpY2Ugew0KLQ0KLSAgICBwcm90ZWN0ZWQgQ2xpZW50REJDU3VwcG9ydFNlcnZpY2VTdWJjbGFzcyhVUkwgd3NkbERvY3VtZW50TG9jYXRpb24sIFFOYW1lIHNlcnZpY2VOYW1lKSB7DQotICAgICAgICBzdXBlcih3c2RsRG9jdW1lbnRMb2NhdGlvbiwgc2VydmljZU5hbWUpOw0KLSAgICB9DQotfQ0KLQ0KLUBXZWJTZXJ2aWNlDQotaW50ZXJmYWNlIENsaWVudERCQ1N1cHBvcnRTRUkgew0KLSAgICBwdWJsaWMgU3RyaW5nIGVjaG8gKFN0cmluZyBzdHJpbmcpOw0KLX0NCi0NCi1AV2ViU2VydmljZShzZXJ2aWNlTmFtZSA9ICJFY2hvU2VydmljZSIsIGVuZHBvaW50SW50ZXJmYWNlPSJvcmcuYXBhY2hlLndzLmF4aXMyLnRlc3RzLkVjaG9Qb3J0IikNCi1jbGFzcyBDbGllbnREQkNTdXBwb3J0RWNob1NlcnZpY2VJbXBsV2l0aFNFSSB7DQotICAgIHB1YmxpYyB2b2lkIGVjaG8oSG9sZGVyPFN0cmluZz4gdGV4dCkgew0KLSAgICAgICAgdGV4dC52YWx1ZSA9ICJFY2hvICIgKyB0ZXh0LnZhbHVlOw0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9pbXBsL0Rlc2NyaXB0aW9uRmFjdG9yeUltcGxUZXN0cy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2ltcGwvRGVzY3JpcHRpb25GYWN0b3J5SW1wbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1YjM3NjQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2ltcGwvRGVzY3JpcHRpb25GYWN0b3J5SW1wbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmltcGw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5DbGllbnRDb25maWd1cmF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkVuZHBvaW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5TZXJ2aWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLkN1c3RvbUFubm90YXRpb25JbnN0YW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuQ3VzdG9tQW5ub3RhdGlvblByb2Nlc3NvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5jb252ZXJ0ZXIuSmF2YUNsYXNzVG9EQkNDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5pbXBsLkRlc2NyaXB0aW9uRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi52YWxpZGF0b3IuRW5kcG9pbnREZXNjcmlwdGlvblZhbGlkYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLnhtbC5oYW5kbGVyLkhhbmRsZXJDaGFpbnNUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIubWV0YWRhdGEucmVnaXN0cnkuTWV0YWRhdGFGYWN0b3J5UmVnaXN0cnk7Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLXB1YmxpYyBjbGFzcyBEZXNjcmlwdGlvbkZhY3RvcnlJbXBsVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIG5hbWVzcGFjZVVSSSA9Ci0gICAgICAgICAgICAiaHR0cDovL29yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uU2VydmljZURlc2NyaXB0aW9uVGVzdHMiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBsb2NhbFBhcnQgPSAiRWNob1NlcnZpY2UiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFFOYW1lIHNlcnZpY2VRTmFtZSA9IG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIGxvY2FsUGFydCk7Ci0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2VydmljZURlc2NyaXB0aW9uQ2FjaGluZygpIHsgICAgICAgIAotICAgICAgICBRTmFtZSB1bmlxdWVRTmFtZSA9IG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIGxvY2FsUGFydCArICJfdGVzdFZhbGlkU2VydmljZVN1YmNsYXNzIik7Ci0gICAgICAgIAotICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gZGVzYzEgPSAKLSAgICAgICAgICAgIERlc2NyaXB0aW9uRmFjdG9yeUltcGwuY3JlYXRlU2VydmljZURlc2NyaXB0aW9uKG51bGwsIHVuaXF1ZVFOYW1lLCBTZXJ2aWNlU3ViY2xhc3MuY2xhc3MpOwotICAgICAgICAgICAgICAgICAgCi0gICAgICAgIC8qCi0gICAgICAgIGludCBzaXplID0gNTsKLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIGRlc2MyOyAKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgICAgIGRlc2MyID0gCi0gICAgICAgICAgICAgICAgRGVzY3JpcHRpb25GYWN0b3J5SW1wbC5jcmVhdGVTZXJ2aWNlRGVzY3JpcHRpb24obnVsbCwgdW5pcXVlUU5hbWUsIFNlcnZpY2VTdWJjbGFzcy5jbGFzcyk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKCJzZXJ2aWNlIGRlc2NyaXB0aW9uIHdhcyBub3QgcmV1c2VkIiwgZGVzYzEgPT0gZGVzYzIpOwotICAgICAgICB9IAotICAgICAgICAqLyAgICAKLSAgICB9ICAgICAgCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xlYXJTZXJ2aWNlRGVzY3JpcHRpb25DYWNoZSgpIHRocm93cyBFeGNlcHRpb24geyAgICAgICAgCi0gICAgICAgIFFOYW1lIHVuaXF1ZVFOYW1lMSA9IG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIGxvY2FsUGFydCArICJfdGVzdENsZWFyQ2FjaGUxIik7Ci0gICAgICAgIFFOYW1lIHVuaXF1ZVFOYW1lMiA9IG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIGxvY2FsUGFydCArICJfdGVzdENsZWFyQ2FjaGUyIik7Ci0gIAotLy8gICAgICAgIC8vIHRoZSBDbGllbnRDb25maWdGYWN0b3J5IGluc3RhbmNlIGlzIHN0b3JlZCBEZXNjcmlwdGlvbkZhY3RvcnlJbXBsIGNsaWVudENvbmZpZ0ZhY3RvcnkgCi0vLyAgICAgICAgLy8gZmllbGQgYW5kIGZvciB0aGlzIHRlc3Qgd2UgbmVlZCB0byBjbGVhciBpdCwgc28gdGhhdCBhIGN1c3RvbSB2ZXJzaW9uIG9mIAotLy8gICAgICAgIC8vIENsaWVudENvbmZpZ3VyYXRpb25GYWN0b3J5IGNhbiBiZSB1c2VkLgotLy8gICAgICAgIHJlc2V0Q2xpZW50Q29uZmlnRmFjdG9yeSgpOwotICAgICAgICAKLSAgICAgICAgLy8gaW5zdGFsbCBjYWNoaW5nIGZhY3RvcnkgICAgICAgIAotICAgICAgICBDbGllbnRDb25maWd1cmF0aW9uRmFjdG9yeSBvbGRGYWN0b3J5ID0gCi0gICAgICAgICAgICAoQ2xpZW50Q29uZmlndXJhdGlvbkZhY3RvcnkpTWV0YWRhdGFGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShDbGllbnRDb25maWd1cmF0aW9uRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgIENhY2hpbmdDbGllbnRDb250ZXh0RmFjdG9yeSBuZXdGYWN0b3J5ID0gbmV3IENhY2hpbmdDbGllbnRDb250ZXh0RmFjdG9yeSgpOwotICAgICAgICBNZXRhZGF0YUZhY3RvcnlSZWdpc3RyeS5zZXRGYWN0b3J5KENsaWVudENvbmZpZ3VyYXRpb25GYWN0b3J5LmNsYXNzLCBuZXdGYWN0b3J5KTsKLSAgICAgICAgCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gZGVzYzEgPSAKLSAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkZhY3RvcnlJbXBsLmNyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbihudWxsLCB1bmlxdWVRTmFtZTEsIFNlcnZpY2VTdWJjbGFzcy5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBkZXNjMiA9IAotICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uRmFjdG9yeUltcGwuY3JlYXRlU2VydmljZURlc2NyaXB0aW9uKG51bGwsIHVuaXF1ZVFOYW1lMSwgU2VydmljZVN1YmNsYXNzLmNsYXNzKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgbmV3RmFjdG9yeS5yZXNldCgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gZGVzYzMgPSAKLSAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkZhY3RvcnlJbXBsLmNyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbihudWxsLCB1bmlxdWVRTmFtZTIsIFNlcnZpY2VTdWJjbGFzcy5jbGFzcyk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGFzc2VydFRydWUoZGVzYzEgPT0gZGVzYzIpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShkZXNjMSAhPSBkZXNjMyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIHNob3VsZCBjbGVhciBvbmUKLSAgICAgICAgICAgIERlc2NyaXB0aW9uRmFjdG9yeUltcGwuY2xlYXJTZXJ2aWNlRGVzY3JpcHRpb25DYWNoZShkZXNjMi5nZXRBeGlzQ29uZmlnQ29udGV4dCgpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIGRlc2M0ID0gCi0gICAgICAgICAgICAgICAgRGVzY3JpcHRpb25GYWN0b3J5SW1wbC5jcmVhdGVTZXJ2aWNlRGVzY3JpcHRpb24obnVsbCwgdW5pcXVlUU5hbWUxLCBTZXJ2aWNlU3ViY2xhc3MuY2xhc3MpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gZGVzYzUgPSAKLSAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkZhY3RvcnlJbXBsLmNyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbihudWxsLCB1bmlxdWVRTmFtZTIsIFNlcnZpY2VTdWJjbGFzcy5jbGFzcyk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGFzc2VydFRydWUoZGVzYzEgIT0gZGVzYzQpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShkZXNjMyA9PSBkZXNjNSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gc2hvdWxkIGNsZWFyIGJvdGgKLSAgICAgICAgICAgIERlc2NyaXB0aW9uRmFjdG9yeUltcGwuY2xlYXJTZXJ2aWNlRGVzY3JpcHRpb25DYWNoZSgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gZGVzYzYgPSAKLSAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkZhY3RvcnlJbXBsLmNyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbihudWxsLCB1bmlxdWVRTmFtZTEsIFNlcnZpY2VTdWJjbGFzcy5jbGFzcyk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBkZXNjNyA9IAotICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uRmFjdG9yeUltcGwuY3JlYXRlU2VydmljZURlc2NyaXB0aW9uKG51bGwsIHVuaXF1ZVFOYW1lMiwgU2VydmljZVN1YmNsYXNzLmNsYXNzKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShkZXNjNCAhPSBkZXNjNik7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGRlc2MzICE9IGRlc2M3KTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gdGhpcyBzaG91bGQgZG8gbm90aGluZwotICAgICAgICAgICAgRGVzY3JpcHRpb25GYWN0b3J5SW1wbC5jbGVhclNlcnZpY2VEZXNjcmlwdGlvbkNhY2hlKG51bGwpOwotICAgICAgICAgICAgCi0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAvLyByZXN0b3JlIG9sZCBmYWN0b3J5IGJ5IHVwZGF0aW5nIHRoZSByZWdpc3RyeSBUSEVOIGNsZWFyaW5nIHRoZSBjYWNoZWQgZmFjdG9yeQotICAgICAgICAgICAgLy8gc28gaXQgaXMgcmV0cmlldmVkIGZyb20gdGhlIHRhYmxlIGFnYWluLgotICAgICAgICAgICAgTWV0YWRhdGFGYWN0b3J5UmVnaXN0cnkuc2V0RmFjdG9yeShDbGllbnRDb25maWd1cmF0aW9uRmFjdG9yeS5jbGFzcywgb2xkRmFjdG9yeSk7Ci0vLyAgICAgICAgICAgIHJlc2V0Q2xpZW50Q29uZmlnRmFjdG9yeSgpOwotICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdEN1c3RvbUFubm90YXRpb25TdXBwb3J0KCkgewotICAgICAgICBKYXZhQ2xhc3NUb0RCQ0NvbnZlcnRlciBjb252ZXJ0ZXIgPSBuZXcgSmF2YUNsYXNzVG9EQkNDb252ZXJ0ZXIoQW5ub3RhdGVkU2VydmljZS5jbGFzcyk7Ci0gICAgICAgIEhhc2hNYXA8U3RyaW5nLCBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGU+IGRiY01hcCA9IGNvbnZlcnRlci5wcm9kdWNlREJDKCk7Ci0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBkYmMgPSBkYmNNYXAuZ2V0KEFubm90YXRlZFNlcnZpY2UuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChkYmMpOwotICAgICAgICBTYW1wbGVBbm5vdGF0aW9uIHNhbXBsZUFubm90YXRpb24gPSBuZXcgU2FtcGxlQW5ub3RhdGlvbigpOwotICAgICAgICBzYW1wbGVBbm5vdGF0aW9uLnNldEFubm90YXRpb25DbGFzc05hbWUoQ3VzdG9tLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIGRiYy5hZGRDdXN0b21Bbm5vdGF0aW9uSW5zdGFuY2Uoc2FtcGxlQW5ub3RhdGlvbik7Ci0gICAgICAgIFNhbXBsZUFubm90YXRpb25Qcm9jZXNzb3Igc2FQcm9jZXNzb3IgPSBuZXcgU2FtcGxlQW5ub3RhdGlvblByb2Nlc3NvcigpOwotICAgICAgICBzYVByb2Nlc3Nvci5zZXRBbm5vdGF0aW9uSW5zdGFuY2VDbGFzc05hbWUoc2FtcGxlQW5ub3RhdGlvbi5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgIGRiYy5hZGRDdXN0b21Bbm5vdGF0aW9uUHJvY2Vzc29yKHNhUHJvY2Vzc29yKTsKLSAgICAgICAgV2ViU2VydmljZSB3ZWJTZXJ2aWNlID0gZGJjLmdldFdlYlNlcnZpY2VBbm5vdCgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHdlYlNlcnZpY2UpOwotICAgICAgICBTdHJpbmcgcG4gPSB3ZWJTZXJ2aWNlLnBvcnROYW1lKCk7Ci0gICAgICAgIFN0cmluZyB0bnMgPSB3ZWJTZXJ2aWNlLnRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHBuKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh0bnMpOwotICAgICAgICBRTmFtZSBwb3J0UU5hbWUgPSBuZXcgUU5hbWUodG5zLCBwbik7Ci0gICAgICAgIExpc3Q8U2VydmljZURlc2NyaXB0aW9uPiBzZExpc3QgPSBEZXNjcmlwdGlvbkZhY3RvcnlJbXBsLmNyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbkZyb21EQkNNYXAoZGJjTWFwLCBudWxsKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZExpc3QpOwotICAgICAgICBhc3NlcnRFcXVhbHMoc2RMaXN0LnNpemUoKSwgMSk7Ci0gICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzZCA9IHNkTGlzdC5nZXQoMCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2QpOwotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVkID0gc2QuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbihwb3J0UU5hbWUpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGVkKTsKLSAgICAgICAgLy8gZm9yIHRlc3RpbmcgcHVycG9zZXMgd2Ugd2FudCB0byBtYWtlIGEgY2FzdCBiL2Mgc29tZSBvZiB0aGUgbWV0aG9kcwotICAgICAgICAvLyB3ZSBhcmUgYWNjZXNzaW5nIGFyZSBwcm90ZWN0ZWQgaW4gRW5kcG9pbnREZXNjcmlwdGlvbkltcGwKLSAgICAgICAgaWYoZWQgaW5zdGFuY2VvZiBFbmRwb2ludERlc2NyaXB0aW9uSW1wbCkgewotICAgICAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbkltcGwgZWRJbXBsID0gKEVuZHBvaW50RGVzY3JpcHRpb25JbXBsKSBlZDsKLSAgICAgICAgICAgIExpc3Q8Q3VzdG9tQW5ub3RhdGlvbkluc3RhbmNlPiBjdXN0b21Bbm5vdGF0aW9uTGlzdCA9IGVkSW1wbC5nZXRDdXN0b21Bbm5vdGF0aW9uSW5zdGFuY2VzKCk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGN1c3RvbUFubm90YXRpb25MaXN0KTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhjdXN0b21Bbm5vdGF0aW9uTGlzdC5zaXplKCksIDEpOwotICAgICAgICAgICAgQ3VzdG9tQW5ub3RhdGlvbkluc3RhbmNlIGFubm90YXRpb25JbnN0YW5jZSA9IGN1c3RvbUFubm90YXRpb25MaXN0LmdldCgwKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYW5ub3RhdGlvbkluc3RhbmNlKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhhbm5vdGF0aW9uSW5zdGFuY2UuZ2V0Q2xhc3MoKS5nZXROYW1lKCksIFNhbXBsZUFubm90YXRpb24uY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIEN1c3RvbUFubm90YXRpb25Qcm9jZXNzb3IgcHJvY2Vzc29yID0gZWRJbXBsLmdldEN1c3RvbUFubm90YXRpb25Qcm9jZXNzb3IoYW5ub3RhdGlvbkluc3RhbmNlLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwocHJvY2Vzc29yKTsKLSAgICAgICAgICAgIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlID0gZWQuZ2V0QXhpc1NlcnZpY2UoKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYXhpc1NlcnZpY2UpOwotICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSBheGlzU2VydmljZS5nZXRQYXJhbWV0ZXJWYWx1ZShTYW1wbGVBbm5vdGF0aW9uLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKG5hbWUpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFNhbXBsZUFubm90YXRpb25Qcm9jZXNzb3IuY2xhc3MuZ2V0TmFtZSgpLCBuYW1lKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0SGFuZGxlckNoYWluVHlwZSgpIHsKLSAgICAJSmF2YUNsYXNzVG9EQkNDb252ZXJ0ZXIgY29udmVydGVyID0gbmV3IEphdmFDbGFzc1RvREJDQ29udmVydGVyKEFubm90YXRlZFNlcnZpY2UuY2xhc3MpOwotICAgICAgICBIYXNoTWFwPFN0cmluZywgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlPiBkYmNNYXAgPSBjb252ZXJ0ZXIucHJvZHVjZURCQygpOwotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgZGJjID0gZGJjTWFwLmdldChBbm5vdGF0ZWRTZXJ2aWNlLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZGJjKTsKLSAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBnZXRYTUxGaWxlU3RyZWFtKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoaXMpOwotICAgICAgICBIYW5kbGVyQ2hhaW5zVHlwZSBoY3QgPSBEZXNjcmlwdGlvblV0aWxzLmxvYWRIYW5kbGVyQ2hhaW5zKGlzLCB0aGlzLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSk7Ci0gICAgICAgIGRiYy5zZXRIYW5kbGVyQ2hhaW5zVHlwZShoY3QpOwotICAgICAgICBMaXN0PFNlcnZpY2VEZXNjcmlwdGlvbj4gc2RMaXN0ID0gRGVzY3JpcHRpb25GYWN0b3J5SW1wbC5jcmVhdGVTZXJ2aWNlRGVzY3JpcHRpb25Gcm9tREJDTWFwKGRiY01hcCwgbnVsbCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2RMaXN0KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShzZExpc3Quc2l6ZSgpID4gMCk7Ci0gICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzZCA9IHNkTGlzdC5nZXQoMCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2QuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbnNfQXNDb2xsZWN0aW9uKCkpOwotICAgICAgICBDb2xsZWN0aW9uPEVuZHBvaW50RGVzY3JpcHRpb24+IGVkQ29sbCA9IHNkLmdldEVuZHBvaW50RGVzY3JpcHRpb25zX0FzQ29sbGVjdGlvbigpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGVkQ29sbCk7Ci0gICAgICAgIGFzc2VydFRydWUoZWRDb2xsLnNpemUoKSA+IDApOwotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVkID0gZWRDb2xsLml0ZXJhdG9yKCkubmV4dCgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGVkKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChlZC5nZXRIYW5kbGVyQ2hhaW4oKSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFRoaXMgd2lsbCB2ZXJpZnkgdGhhdCBwcm9wZXJ0aWVzIGFyZSBjb3JyZWN0bHkgY29waWVkIGZyb20gYSBEQkMgdG8gYW4KLSAgICAgKiBFbmRwb2ludERlc2NyaXB0aW9uIGluc3RhbmNlIGJ5IGEgaGVscGVyIG1ldGhvZCBpbiBEZXNjcmlwdGlvbkZhY3RvcnlJbXBsLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRQcm9wZXJ0aWVzT25FbmRwb2ludERlc2MoKSB7Ci0gICAgICAgIAotICAgICAgICAvLyBmaXJzdCBnZXQgYW4gRW5kcG9pbnREZXNjcmlwdGlvbiBpbnN0YW5jZQotICAgICAgICBKYXZhQ2xhc3NUb0RCQ0NvbnZlcnRlciBjb252ZXJ0ZXIgPSBuZXcgSmF2YUNsYXNzVG9EQkNDb252ZXJ0ZXIoQW5ub3RhdGVkU2VydmljZS5jbGFzcyk7Ci0gICAgICAgIEhhc2hNYXA8U3RyaW5nLCBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGU+IGRiY01hcCA9IGNvbnZlcnRlci5wcm9kdWNlREJDKCk7Ci0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBkYmMgPSBkYmNNYXAuZ2V0KEFubm90YXRlZFNlcnZpY2UuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChkYmMpOwotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLSAgICAgICAgcHJvcGVydGllcy5wdXQoInRlc3RLZXkiLCAidGVzdFZhbHVlIik7Ci0gICAgICAgIGRiYy5zZXRQcm9wZXJ0aWVzKHByb3BlcnRpZXMpOwotICAgICAgICBMaXN0PFNlcnZpY2VEZXNjcmlwdGlvbj4gc2RMaXN0ID0gRGVzY3JpcHRpb25GYWN0b3J5SW1wbC5jcmVhdGVTZXJ2aWNlRGVzY3JpcHRpb25Gcm9tREJDTWFwKGRiY01hcCwgbnVsbCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2RMaXN0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHNkTGlzdC5zaXplKCksIDEpOwotICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc2QgPSBzZExpc3QuZ2V0KDApOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNkKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChkYmMuZ2V0V2ViU2VydmljZUFubm90KCkpOwotICAgICAgICBTdHJpbmcgcG4gPSBkYmMuZ2V0V2ViU2VydmljZUFubm90KCkucG9ydE5hbWUoKTsKLSAgICAgICAgU3RyaW5nIHRucyA9IGRiYy5nZXRXZWJTZXJ2aWNlQW5ub3QoKS50YXJnZXROYW1lc3BhY2UoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChwbik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwodG5zKTsKLSAgICAgICAgUU5hbWUgcG9ydFFOYW1lID0gbmV3IFFOYW1lKHRucywgcG4pOwotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVkID0gc2QuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbihwb3J0UU5hbWUpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGVkKTsKLSAgICAgICAgCi0gICAgICAgIC8vIG5vdyB0ZXN0IHRoZSBzZXRQcm9wZXJ0aWVzT25FbmRwb2ludERlc2MgbWV0aG9kCi0gICAgICAgIERlc2NyaXB0aW9uRmFjdG9yeUltcGwuc2V0UHJvcGVydGllc09uRW5kcG9pbnREZXNjKGVkLCBkYmMpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGVkLmdldFByb3BlcnR5KCJ0ZXN0S2V5IikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZWQuZ2V0UHJvcGVydHkoInRlc3RLZXkiKSwgInRlc3RWYWx1ZSIpOwotICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBJbnB1dFN0cmVhbSBnZXRYTUxGaWxlU3RyZWFtKCkgewotICAgIAlJbnB1dFN0cmVhbSBpcyA9IG51bGw7Ci0gICAgCVN0cmluZyBjb25maWdMb2MgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgU3RyaW5nIHNlcCA9ICIvIjsKLSAgICAgICAgICAgIGNvbmZpZ0xvYyA9IHNlcCArICJ0ZXN0LXJlc291cmNlcyIgKyBzZXAgKyAidGVzdC1oYW5kbGVyLnhtbCI7Ci0gICAgICAgICAgICBTdHJpbmcgYmFzZURpciA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiYmFzZWRpciIsIi4iKSkuZ2V0Q2Fub25pY2FsUGF0aCgpOwotICAgICAgICAgICAgaXMgPSBuZXcgRmlsZShiYXNlRGlyICsgY29uZmlnTG9jKS50b1VSTCgpLm9wZW5TdHJlYW0oKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgIAlyZXR1cm4gaXM7Ci0gICAgfQotICAgIAotICAgIAotICAgIHByaXZhdGUgdm9pZCByZXNldENsaWVudENvbmZpZ0ZhY3RvcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgRmllbGQgZmllbGQgPSBEZXNjcmlwdGlvbkZhY3RvcnlJbXBsLmNsYXNzLmdldERlY2xhcmVkRmllbGQoImNsaWVudENvbmZpZ0ZhY3RvcnkiKTsKLSAgICAgICAgZmllbGQuc2V0QWNjZXNzaWJsZSh0cnVlKTsKLSAgICAgICAgZmllbGQuc2V0KG51bGwsIG51bGwpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTZXJ2aWNlU3ViY2xhc3MgZXh0ZW5kcyBqYXZheC54bWwud3MuU2VydmljZSB7Ci0KLSAgICAgICAgcHJvdGVjdGVkIFNlcnZpY2VTdWJjbGFzcyhVUkwgd3NkbERvY3VtZW50TG9jYXRpb24sIFFOYW1lIHNlcnZpY2VOYW1lKSB7Ci0gICAgICAgICAgICBzdXBlcih3c2RsRG9jdW1lbnRMb2NhdGlvbiwgc2VydmljZU5hbWUpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIENhY2hpbmdDbGllbnRDb250ZXh0RmFjdG9yeSBleHRlbmRzIENsaWVudENvbmZpZ3VyYXRpb25GYWN0b3J5IHsKLSAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHQgY29udGV4dDsKLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBDb25maWd1cmF0aW9uQ29udGV4dCBnZXRDbGllbnRDb25maWd1cmF0aW9uQ29udGV4dCgpIHsKLSAgICAgICAgICAgIGlmIChjb250ZXh0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjb250ZXh0ID0gc3VwZXIuZ2V0Q2xpZW50Q29uZmlndXJhdGlvbkNvbnRleHQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGVzdCB2ZXJzaW9uIG9mIENhY2hpbmdDbGllbnRDb250ZXh0RmFjdG9yeTogIiArIGNvbnRleHQpOwotICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQ7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgewotICAgICAgICAgICAgY29udGV4dCA9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgfQotICAgIAotICAgIGNsYXNzIFNhbXBsZUFubm90YXRpb24gaW1wbGVtZW50cyBDdXN0b21Bbm5vdGF0aW9uSW5zdGFuY2UgewotCi0gICAgICAgIHByaXZhdGUgTWFwPFN0cmluZywgT2JqZWN0PiBkYXRhTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIEVsZW1lbnRUeXBlIGVsZW1lbnRUeXBlOwotICAgICAgICAKLSAgICAgICAgTGlzdDxTdHJpbmc+IGtub3duUGFyYW1OYW1lczsKLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgU3RyaW5nIGFubm90YXRpb25DbGFzc05hbWU7Ci0gICAgICAgIAotICAgICAgICBTYW1wbGVBbm5vdGF0aW9uKExpc3Q8U3RyaW5nPiBrbm93blBhcmFtTmFtZXMpIHsKLSAgICAgICAgICAgIHRoaXMua25vd25QYXJhbU5hbWVzID0ga25vd25QYXJhbU5hbWVzOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgdm9pZCBzZXRBbm5vdGF0aW9uQ2xhc3NOYW1lKFN0cmluZyBhbm5vdGF0aW9uQ2xhc3NOYW1lKSB7Ci0gICAgICAgICAgICB0aGlzLmFubm90YXRpb25DbGFzc05hbWUgPSBhbm5vdGF0aW9uQ2xhc3NOYW1lOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25DbGFzc05hbWUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gYW5ub3RhdGlvbkNsYXNzTmFtZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgU2FtcGxlQW5ub3RhdGlvbigpIHsKLSAgICAgICAgICAgIGtub3duUGFyYW1OYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICAgICAga25vd25QYXJhbU5hbWVzLmFkZCgibmFtZSIpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgdm9pZCBhZGRQYXJhbWV0ZXJEYXRhKFN0cmluZyBwYXJhbU5hbWUsIE9iamVjdCB2YWx1ZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBjaGVja1BhcmFtTmFtZShwYXJhbU5hbWUpOwotICAgICAgICAgICAgZGF0YU1hcC5wdXQocGFyYW1OYW1lLCB2YWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgT2JqZWN0IGdldFBhcmFtZXRlckRhdGEoU3RyaW5nIHBhcmFtTmFtZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBjaGVja1BhcmFtTmFtZShwYXJhbU5hbWUpOwotICAgICAgICAgICAgcmV0dXJuIGRhdGFNYXAuZ2V0KHBhcmFtTmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFRhcmdldChFbGVtZW50VHlwZSBlbGVtZW50VHlwZSkgewotICAgICAgICAgICAgdGhpcy5lbGVtZW50VHlwZSA9IGVsZW1lbnRUeXBlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEVsZW1lbnRUeXBlIGdldFRhcmdldCgpIHsKLSAgICAgICAgICAgIHJldHVybiBlbGVtZW50VHlwZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSB2b2lkIGNoZWNrUGFyYW1OYW1lKFN0cmluZyBwYXJhbU5hbWUpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotICAgICAgICAgICAgaWYoa25vd25QYXJhbU5hbWVzICE9IG51bGwgCi0gICAgICAgICAgICAgICAgICAgICYmIAotICAgICAgICAgICAgICAgICAgICAha25vd25QYXJhbU5hbWVzLmlzRW1wdHkoKSAKLSAgICAgICAgICAgICAgICAgICAgJiYgCi0gICAgICAgICAgICAgICAgICAgICFrbm93blBhcmFtTmFtZXMuY29udGFpbnMocGFyYW1OYW1lKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBwYXJhbWV0ZXIgIiArIHBhcmFtTmFtZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgaXMgYW4gdW5rbm93biBwYXJhbWV0ZXIgZm9yIHRoZSBDdXN0b21Bbm5vdGF0aW9uIHR5cGUuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBjbGFzcyBTYW1wbGVBbm5vdGF0aW9uUHJvY2Vzc29yIGltcGxlbWVudHMgQ3VzdG9tQW5ub3RhdGlvblByb2Nlc3NvciB7Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIFN0cmluZyBhbm5vdGF0aW9uSW5zdGFuY2VDbGFzc05hbWU7Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uSW5zdGFuY2VDbGFzc05hbWUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gYW5ub3RhdGlvbkluc3RhbmNlQ2xhc3NOYW1lOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgdm9pZCBzZXRBbm5vdGF0aW9uSW5zdGFuY2VDbGFzc05hbWUoU3RyaW5nIGFubm90YXRpb25JbnN0YW5jZUNsYXNzTmFtZSkgewotICAgICAgICAgICAgdGhpcy5hbm5vdGF0aW9uSW5zdGFuY2VDbGFzc05hbWUgPSBhbm5vdGF0aW9uSW5zdGFuY2VDbGFzc05hbWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBwcm9jZXNzVHlwZUxldmVsQW5ub3RhdGlvbihFbmRwb2ludERlc2NyaXB0aW9uIGVkLCBDdXN0b21Bbm5vdGF0aW9uSW5zdGFuY2UgYW5ub3RhdGlvbikgewotICAgICAgICAgICAgICAgIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlID0gZWQuZ2V0QXhpc1NlcnZpY2UoKTsKLSAgICAgICAgICAgICAgICBpZihheGlzU2VydmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBheGlzU2VydmljZS5hZGRQYXJhbWV0ZXIoU2FtcGxlQW5ub3RhdGlvbi5jbGFzcy5nZXROYW1lKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhbXBsZUFubm90YXRpb25Qcm9jZXNzb3IuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXRjaChBeGlzRmF1bHQgYWYpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdGhpbmcgaGVyZQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgIH0KLQotICAgIEBpbnRlcmZhY2UgQ3VzdG9tIHsKLSAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgIH0KLQotICAgIEBXZWJTZXJ2aWNlKHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL29yZy5hcGFjaGUuZXhhbXBsZSIsIHNlcnZpY2VOYW1lPSJBbm5vdGF0ZWRTZXJ2aWNlIiwgcG9ydE5hbWU9IkFubm90YXRlZFBvcnQiKQotICAgIEBDdXN0b20obmFtZT0iQW5ub3RhdGVkU2VydmljZSIpCi0gICAgY2xhc3MgQW5ub3RhdGVkU2VydmljZSB7Ci0gICAgICAgIHB1YmxpYyBTdHJpbmcgZWNobyhTdHJpbmcgZWNob1N0cmluZykgewotICAgICAgICAgICAgcmV0dXJuIGVjaG9TdHJpbmc7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vaW1wbC9QYXJhbWV0ZXJEZXNjcmlwdGlvbkltcGxUZXN0cy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2ltcGwvUGFyYW1ldGVyRGVzY3JpcHRpb25JbXBsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTljZGUwYS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vaW1wbC9QYXJhbWV0ZXJEZXNjcmlwdGlvbkltcGxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmltcGw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5QYXJhbWV0ZXJEZXNjcmlwdGlvbjsKLQotaW1wb3J0IGphdmF4LnhtbC53cy5Ib2xkZXI7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1wdWJsaWMgY2xhc3MgUGFyYW1ldGVyRGVzY3JpcHRpb25JbXBsVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0MSgpIHsKLSAgICAgICAgTWV0aG9kW10gbWV0aG9kcyA9IFRlc3RJbnRlcmZhY2UuY2xhc3MuZ2V0TWV0aG9kcygpOwotICAgICAgICBNZXRob2QgbWV0aG9kMSA9IG1ldGhvZHNbMF07Ci0gICAgICAgIFBhcmFtZXRlckRlc2NyaXB0aW9uIHBkYzEgPSBuZXcgUGFyYW1ldGVyRGVzY3JpcHRpb25JbXBsKDAsIG1ldGhvZDEuZ2V0UGFyYW1ldGVyVHlwZXMoKVswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kMS5nZXRHZW5lcmljUGFyYW1ldGVyVHlwZXMoKVswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kMS5nZXRBbm5vdGF0aW9ucygpLCBudWxsKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChwZGMxKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKExpc3RbXS5jbGFzcywgcGRjMS5nZXRQYXJhbWV0ZXJBY3R1YWxUeXBlKCkpOwotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdDIoKSB7Ci0gICAgICAgIE1ldGhvZFtdIG1ldGhvZHMgPSBUZXN0SW50ZXJmYWNlLmNsYXNzLmdldE1ldGhvZHMoKTsKLSAgICAgICAgTWV0aG9kIG1ldGhvZDIgPSBtZXRob2RzWzFdOwotICAgICAgICBQYXJhbWV0ZXJEZXNjcmlwdGlvbiBwZGMyID0gbmV3IFBhcmFtZXRlckRlc2NyaXB0aW9uSW1wbCgwLCBtZXRob2QyLmdldFBhcmFtZXRlclR5cGVzKClbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDIuZ2V0R2VuZXJpY1BhcmFtZXRlclR5cGVzKClbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDIuZ2V0QW5ub3RhdGlvbnMoKSwgbnVsbCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocGRjMik7Ci0gICAgICAgIC8vIEZJWE1FOiBOZWVkIHRvIGNoYXNlIHRoaXMgZG93biB3aXRoIHRoZSBIYXJtb255IGZvbGtzLgotICAgICAgICBpZiAoISJEUkxWTSIuZXF1YWxzKFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS52bS5uYW1lIikpKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoU3RyaW5nW10uY2xhc3MsIHBkYzIuZ2V0UGFyYW1ldGVyQWN0dWFsVHlwZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3QzKCkgewotICAgICAgICBNZXRob2RbXSBtZXRob2RzID0gVGVzdEludGVyZmFjZS5jbGFzcy5nZXRNZXRob2RzKCk7Ci0gICAgICAgIE1ldGhvZCBtZXRob2QzID0gbWV0aG9kc1syXTsKLSAgICAgICAgUGFyYW1ldGVyRGVzY3JpcHRpb24gcGRjMyA9IG5ldyBQYXJhbWV0ZXJEZXNjcmlwdGlvbkltcGwoMCwgbWV0aG9kMy5nZXRQYXJhbWV0ZXJUeXBlcygpWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QzLmdldEdlbmVyaWNQYXJhbWV0ZXJUeXBlcygpWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QzLmdldEFubm90YXRpb25zKCksIG51bGwpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHBkYzMpOwotICAgICAgICBhc3NlcnRFcXVhbHMoTGlzdFtdLmNsYXNzLCBwZGMzLmdldFBhcmFtZXRlckFjdHVhbFR5cGUoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdDQoKSB7Ci0gICAgICAgIE1ldGhvZFtdIG1ldGhvZHMgPSBUZXN0SW50ZXJmYWNlLmNsYXNzLmdldE1ldGhvZHMoKTsKLSAgICAgICAgTWV0aG9kIG1ldGhvZDQgPSBtZXRob2RzWzNdOwotICAgICAgICBQYXJhbWV0ZXJEZXNjcmlwdGlvbiBwZGM0ID0gbmV3IFBhcmFtZXRlckRlc2NyaXB0aW9uSW1wbCgwLCBtZXRob2Q0LmdldFBhcmFtZXRlclR5cGVzKClbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDQuZ2V0R2VuZXJpY1BhcmFtZXRlclR5cGVzKClbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDQuZ2V0QW5ub3RhdGlvbnMoKSwgbnVsbCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocGRjNCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhTdHJpbmdbXS5jbGFzcywgcGRjNC5nZXRQYXJhbWV0ZXJBY3R1YWxUeXBlKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3Q1KCkgewotICAgICAgICBNZXRob2RbXSBtZXRob2RzID0gVGVzdEludGVyZmFjZS5jbGFzcy5nZXRNZXRob2RzKCk7Ci0gICAgICAgIE1ldGhvZCBtZXRob2Q1ID0gbWV0aG9kc1s0XTsKLSAgICAgICAgUGFyYW1ldGVyRGVzY3JpcHRpb24gcGRjID0gbmV3IFBhcmFtZXRlckRlc2NyaXB0aW9uSW1wbCgwLCBtZXRob2Q1LmdldFBhcmFtZXRlclR5cGVzKClbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kNS5nZXRHZW5lcmljUGFyYW1ldGVyVHlwZXMoKVswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q1LmdldEFubm90YXRpb25zKCksIG51bGwpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHBkYyk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhMaXN0W10uY2xhc3MsIHBkYy5nZXRQYXJhbWV0ZXJBY3R1YWxUeXBlKCkpOwotICAgIH0KLX0KLQotaW50ZXJmYWNlIFRlc3RJbnRlcmZhY2UgewotICAgIFN0cmluZyBtZXRob2QxKEhvbGRlcjxMaXN0PFN0cmluZz5bXT4gZm9vKTsKLQotICAgIFN0cmluZyBtZXRob2QyKEhvbGRlcjxTdHJpbmdbXT4gZm9vKTsKLQotICAgIFN0cmluZyBtZXRob2QzKEhvbGRlcjxMaXN0PD8+W10+IGZvbyk7Ci0KLSAgICBTdHJpbmcgbWV0aG9kNChTdHJpbmdbXSBmb28pOwotCi0gICAgU3RyaW5nIG1ldGhvZDUoTGlzdDxTdHJpbmc+W10gZm9vKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vaW1wbC9TZXJ2aWNlRGVzY3JpcHRpb25JbXBsVGVzdHMuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9pbXBsL1NlcnZpY2VEZXNjcmlwdGlvbkltcGxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWRkODc5Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9pbXBsL1NlcnZpY2VEZXNjcmlwdGlvbkltcGxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmltcGw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5TZXJ2aWNlRGVzY3JpcHRpb247Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotLyoqCi0gKiBUaGlzIHRlc3QgdmFsaWRhdGVzIHRoZSBlcnJvciBjaGVja2luZyBhbmQgaW50ZXJuYWwgZnVuY3Rpb25pbmcgb2YgdGhlIFNlcnZpY2VEZXNjcmlwdGlvbiBjbGFzcy4KLSAqIFRoZXNlIHRlc3RzIGFyZSB0aGUgY29uc3RydWN0aW9uIG9mIGEgYSBTZXJ2aWNlRGVzY3JpcHRpb24uICBEaXJlY3QgdGVzdHMgb2YgdGhlIGZ1bmN0aW9uYWxpdHkgb2YKLSAqIGEgU2VydmljZURlc2NyaXB0aW9uIGFuZCBvdGhlciBEZXNjcmlwdGlvbiBjbGFzc2VzIGlzIGRvbmUgaW4gV1NETERlc2NyaXB0aW9uVGVzdHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlRGVzY3JpcHRpb25JbXBsVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIG5hbWVzcGFjZVVSSSA9Ci0gICAgICAgICAgICAiaHR0cDovL29yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uU2VydmljZURlc2NyaXB0aW9uVGVzdHMiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBsb2NhbFBhcnQgPSAiRWNob1NlcnZpY2UiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFFOYW1lIHNlcnZpY2VRTmFtZSA9IG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIGxvY2FsUGFydCk7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TnVsbFdTREwoKSB7Ci0KLSAgICAgICAgUU5hbWUgdW5pcXVlUU5hbWUgPSBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBsb2NhbFBhcnQgKyAiX3Rlc3ROdWxsV1NETCIpOwotICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc2VydmljZURlc2NyaXB0aW9uID0KLSAgICAgICAgICAgICAgICBuZXcgU2VydmljZURlc2NyaXB0aW9uSW1wbChudWxsLCB1bmlxdWVRTmFtZSwgamF2YXgueG1sLndzLlNlcnZpY2UuY2xhc3MpOwotICAgICAgICBhc3NlcnROb3ROdWxsKCJTZXJ2aWNlIGRlc2NyaXB0aW9uIG5vdCBjcmVhdGVkIHdpdGggbnVsbCBXU0RMIiwgc2VydmljZURlc2NyaXB0aW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TnVsbFNlcnZpY2VOYW1lKCkgewotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc2VydmljZURlc2NyaXB0aW9uID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IFNlcnZpY2VEZXNjcmlwdGlvbkltcGwobnVsbCwgbnVsbCwgamF2YXgueG1sLndzLlNlcnZpY2UuY2xhc3MpOwotICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIGZvciBudWxsIFNlcnZpY2UgTmFtZSBub3QgdGhyb3duLiIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChXZWJTZXJ2aWNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIEV4cGVjdGVkIHBhdGgKLSAgICAgICAgICAgIC8vIFRPRE8gTWVzc2FnZSB0ZXh0IGNoYW5nZWQKLSAgICAgICAgICAgIC8vYXNzZXJ0RXF1YWxzKCJEaWQgbm90IHJlY2VpdmUgY29ycmVjdCBleGNlcHRpb24iLCAiSW52YWxpZCBTZXJ2aWNlIGNsYXNzLiAgVGhlIHNlcnZpY2UgUU5hbWUgY2Fubm90IGJlIG51bGwuIiwgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEludmFsaWRTZXJ2aWNlQ2xhc3MoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc2VydmljZURlc2NyaXB0aW9uID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IFNlcnZpY2VEZXNjcmlwdGlvbkltcGwobnVsbCwgc2VydmljZVFOYW1lLCBPYmplY3QuY2xhc3MpOwotICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIGZvciBpbnZhbGlkIFNlcnZpY2UgY2xhc3Mgbm90IHRocm93bi4iKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoV2ViU2VydmljZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBFeHBlY3RlZCBwYXRoCi0gICAgICAgICAgICAvLyBUT0RPIE1lc3NhZ2UgdGV4dCBjaGFuZ2VkCi0gICAgICAgICAgICAvL2Fzc2VydEVxdWFscygiRGlkIG5vdCByZWNlaXZlIGNvcnJlY3QgZXhjZXB0aW9uIiwgIkludmFsaWQgU2VydmljZSBDbGFzczsgbXVzdCBiZSBhc3NpZ25hYmxlIHRvIGphdmF4LnhtbC53cy5TZXJ2aWNlIiwgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE51bGxTZXJ2aWNlQ2xhc3MoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc2VydmljZURlc2NyaXB0aW9uID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IFNlcnZpY2VEZXNjcmlwdGlvbkltcGwobnVsbCwgc2VydmljZVFOYW1lLCBudWxsKTsKLSAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiBmb3IgaW52YWxpZCBTZXJ2aWNlIGNsYXNzIG5vdCB0aHJvd24uIik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFdlYlNlcnZpY2VFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gRXhwZWN0ZWQgcGF0aAotICAgICAgICAgICAgLy8gVE9ETyBNZXNzYWdlIHRleHQgY2hhbmdlZAotICAgICAgICAgICAgLy9hc3NlcnRFcXVhbHMoIkRpZCBub3QgcmVjZWl2ZSBjb3JyZWN0IGV4Y2VwdGlvbiIsICJJbnZhbGlkIFNlcnZpY2UgQ2xhc3M7IGNhbm5vdCBiZSBudWxsIiwgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRTZXJ2aWNlU3ViY2xhc3MoKSB7Ci0gICAgICAgIFFOYW1lIHVuaXF1ZVFOYW1lID0gbmV3IFFOYW1lKG5hbWVzcGFjZVVSSSwgbG9jYWxQYXJ0ICsgIl90ZXN0VmFsaWRTZXJ2aWNlU3ViY2xhc3MiKTsKLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNlcnZpY2VEZXNjcmlwdGlvbiA9Ci0gICAgICAgICAgICAgICAgbmV3IFNlcnZpY2VEZXNjcmlwdGlvbkltcGwobnVsbCwgdW5pcXVlUU5hbWUsIFNlcnZpY2VTdWJjbGFzcy5jbGFzcyk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoIlNlcnZpY2UgZGVzY3JpcHRpb24gbm90IGNyZWF0ZWQgd2l0aCB2YWxpZCBTZXJ2aWNlIHN1YmNsYXNzIiwKLSAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlRGVzY3JpcHRpb24pOwotICAgIH0KLX0KLQotY2xhc3MgU2VydmljZVN1YmNsYXNzIGV4dGVuZHMgamF2YXgueG1sLndzLlNlcnZpY2UgewotCi0gICAgcHJvdGVjdGVkIFNlcnZpY2VTdWJjbGFzcyhVUkwgd3NkbERvY3VtZW50TG9jYXRpb24sIFFOYW1lIHNlcnZpY2VOYW1lKSB7Ci0gICAgICAgIHN1cGVyKHdzZGxEb2N1bWVudExvY2F0aW9uLCBzZXJ2aWNlTmFtZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2ltcGwvU2VydmljZURlc2NyaXB0aW9uSW1wbFZhbGlkYXRpb25UZXN0cy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2ltcGwvU2VydmljZURlc2NyaXB0aW9uSW1wbFZhbGlkYXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2QyYWU5Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9pbXBsL1NlcnZpY2VEZXNjcmlwdGlvbkltcGxWYWxpZGF0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uaW1wbDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5NZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuUGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLldlYlNlcnZpY2VBbm5vdDsKLQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgU2VydmljZURlc2NyaXB0aW9uSW1wbFZhbGlkYXRpb25UZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0ZUltcGxNZXRob2RzVnNTRUkoKSB7Ci0KLSAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIHNlaUNvbXBvc2l0ZSA9IG5ldyBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUoKTsKLSAgICAgICAgc2VpQ29tcG9zaXRlLnNldENsYXNzTmFtZSgib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5pbXBsLk15U0VJIik7Ci0gICAgICAgIE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlIHNlaU1EQyA9IG5ldyBNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSgpOwotICAgICAgICBzZWlNREMuc2V0TWV0aG9kTmFtZSgic2VpTWV0aG9kIik7Ci0gICAgICAgIHNlaUNvbXBvc2l0ZS5hZGRNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZShzZWlNREMpOwotICAgICAgICBXZWJTZXJ2aWNlQW5ub3Qgc2VpV2ViU2VydmljZUFubm90ID0gV2ViU2VydmljZUFubm90LmNyZWF0ZVdlYlNlcnZpY2VBbm5vdEltcGwoKTsKLSAgICAgICAgc2VpV2ViU2VydmljZUFubm90LnNldE5hbWUobnVsbCk7Ci0gICAgICAgIHNlaUNvbXBvc2l0ZS5zZXRXZWJTZXJ2aWNlQW5ub3Qoc2VpV2ViU2VydmljZUFubm90KTsKLQotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgaW1wbENvbXBvc2l0ZSA9IG5ldyBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUoKTsKLSAgICAgICAgaW1wbENvbXBvc2l0ZS5zZXRDbGFzc05hbWUoIm9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uaW1wbC5NeUltcGwiKTsKLSAgICAgICAgTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUgaW1wbE1EQyA9IG5ldyBNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSgpOwotICAgICAgICBpbXBsTURDLnNldE1ldGhvZE5hbWUoIm5vdFNlaU1ldGhvZCIpOwotICAgICAgICBpbXBsQ29tcG9zaXRlLmFkZE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlKGltcGxNREMpOwotICAgICAgICBXZWJTZXJ2aWNlQW5ub3Qgd2ViU2VydmljZUFubm90ID0gV2ViU2VydmljZUFubm90LmNyZWF0ZVdlYlNlcnZpY2VBbm5vdEltcGwoKTsKLSAgICAgICAgd2ViU2VydmljZUFubm90LnNldE5hbWUobnVsbCk7Ci0gICAgICAgIHdlYlNlcnZpY2VBbm5vdC5zZXRFbmRwb2ludEludGVyZmFjZSgib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5pbXBsLk15U0VJIik7Ci0gICAgICAgIGltcGxDb21wb3NpdGUuc2V0V2ViU2VydmljZUFubm90KHdlYlNlcnZpY2VBbm5vdCk7Ci0gICAgICAgIGltcGxDb21wb3NpdGUuc2V0SXNJbnRlcmZhY2UoZmFsc2UpOwotCi0gICAgICAgIEhhc2hNYXA8U3RyaW5nLCBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGU+IGRiY0xpc3QgPQotICAgICAgICAgICAgICAgIG5ldyBIYXNoTWFwPFN0cmluZywgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlPigpOwotICAgICAgICBkYmNMaXN0LnB1dChzZWlDb21wb3NpdGUuZ2V0Q2xhc3NOYW1lKCksIHNlaUNvbXBvc2l0ZSk7Ci0gICAgICAgIGRiY0xpc3QucHV0KGltcGxDb21wb3NpdGUuZ2V0Q2xhc3NOYW1lKCksIGltcGxDb21wb3NpdGUpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb25JbXBsIHNlcnZpY2VEZXNjSW1wbCA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBTZXJ2aWNlRGVzY3JpcHRpb25JbXBsKGRiY0xpc3QsIGltcGxDb21wb3NpdGUpOwotICAgICAgICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgY2F1Z2h0IGV4Y2VwdGlvbiBmb3IgdmFsaWRhdGlvbiBlcnJvcnMiKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoV2ViU2VydmljZUV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgLy8gRXhwZWN0ZWQgcGF0aAotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIGZhaWwoIkNhdWdodCB3cm9uZyB0eXBlIG9mIGV4Y2VwdGlvbiAiICsgZXgudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLQotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFZhbGlkYXRlT3ZlcmxvYWRlZEltcGxNZXRob2RzVnNTRUkoKSB7Ci0gICAgICAgIAotICAgICAgICAvLyBUZXN0cyB0aGF0IG92ZXJsb2FkZWQgbWV0aG9kcyB2YWxpZGF0ZSBjb3JyZWN0bHkuICBOb3RlIHRoYXQgdGhlIG1ldGhvZHMgYXJlIAotICAgICAgICAvLyBpbnRlbnRpb25hbGx5IGFkZGVkIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBhbmQgc2VpIGluIGEgZGlmZmVyZW50IG9yZGVyIHNvIHRoYXQgdGhleQotICAgICAgICAvLyBkb24ndCBjb2luY2lkZW50bHkgcGFzcyB2YWxpZGF0aW9uIGp1c3QgYmVjYXVzZSB0aGV5IGFyZSBpbiB0aGUgc2FtZSBvcmRlciBpbiBib3RoCi0gICAgICAgIC8vIGNvbGxlY3Rpb25zLgotICAgICAgICAvLyAgIHNlaU1ldGhvZCgpCi0gICAgICAgIC8vICAgc2VpTWV0aG9kKFN0cmluZykKLSAgICAgICAgCi0gICAgICAgIC8vIEJ1aWxkIHVwIHRoZSBTRUkKLSAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIHNlaUNvbXBvc2l0ZSA9IG5ldyBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUoKTsKLSAgICAgICAgc2VpQ29tcG9zaXRlLnNldENsYXNzTmFtZSgib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5pbXBsLk15U0VJIik7Ci0KLSAgICAgICAgTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUgc2VpTURDID0gbmV3IE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlKCk7Ci0gICAgICAgIHNlaU1EQy5zZXRNZXRob2ROYW1lKCJzZWlNZXRob2QiKTsKLSAgICAgICAgc2VpQ29tcG9zaXRlLmFkZE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlKHNlaU1EQyk7Ci0gICAgICAgIAotICAgICAgICBNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSBzZWlNREMyID0gbmV3IE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlKCk7Ci0gICAgICAgIHNlaU1EQzIuc2V0TWV0aG9kTmFtZSgic2VpTWV0aG9kIik7Ci0gICAgICAgIFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlIHNlaVBEQyA9IG5ldyBQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZSgpOwotICAgICAgICBzZWlQREMuc2V0UGFyYW1ldGVyVHlwZSgiamF2YS5sYW5nLlN0cmluZyIpOwotICAgICAgICBzZWlNREMyLmFkZFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlKHNlaVBEQyk7Ci0gICAgICAgIHNlaUNvbXBvc2l0ZS5hZGRNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZShzZWlNREMyKTsKLSAgICAgICAgCi0gICAgICAgIFdlYlNlcnZpY2VBbm5vdCBzZWlXZWJTZXJ2aWNlQW5ub3QgPSBXZWJTZXJ2aWNlQW5ub3QuY3JlYXRlV2ViU2VydmljZUFubm90SW1wbCgpOwotICAgICAgICBzZWlXZWJTZXJ2aWNlQW5ub3Quc2V0TmFtZShudWxsKTsKLSAgICAgICAgc2VpQ29tcG9zaXRlLnNldFdlYlNlcnZpY2VBbm5vdChzZWlXZWJTZXJ2aWNlQW5ub3QpOwotCi0gICAgICAgIC8vIEJ1aWxkIHVwIHRoZSBJbXBsLCBidXQgcHV0IHRoZSBvdmVybG9hZGVkIE1EQ3Mgb24gaW4gYSBkaWZmZXJlbnQgb3JkZXIgdGhhbiB0aGUgU0VJIAotICAgICAgICAvLyBzbyB0aGV5IGRvbid0IGp1c3QgaGFwcGVuIHRvIHBhc3MgdmFsaWRhdGlvbgotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgaW1wbENvbXBvc2l0ZSA9IG5ldyBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUoKTsKLSAgICAgICAgaW1wbENvbXBvc2l0ZS5zZXRDbGFzc05hbWUoIm9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uaW1wbC5NeUltcGwiKTsKLQotICAgICAgICBNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSBpbXBsTURDID0gbmV3IE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlKCk7Ci0gICAgICAgIGltcGxNREMuc2V0TWV0aG9kTmFtZSgic2VpTWV0aG9kIik7Ci0gICAgICAgIFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlIGltcGxQREMgPSBuZXcgUGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGUoKTsKLSAgICAgICAgaW1wbFBEQy5zZXRQYXJhbWV0ZXJUeXBlKCJqYXZhLmxhbmcuU3RyaW5nIik7Ci0gICAgICAgIGltcGxNREMuYWRkUGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGUoaW1wbFBEQyk7Ci0gICAgICAgIGltcGxDb21wb3NpdGUuYWRkTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUoaW1wbE1EQyk7Ci0KLSAgICAgICAgTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUgaW1wbE1EQzIgPSBuZXcgTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUoKTsKLSAgICAgICAgaW1wbE1EQzIuc2V0TWV0aG9kTmFtZSgic2VpTWV0aG9kIik7Ci0gICAgICAgIGltcGxDb21wb3NpdGUuYWRkTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUoaW1wbE1EQzIpOwotICAgICAgICAKLSAgICAgICAgV2ViU2VydmljZUFubm90IHdlYlNlcnZpY2VBbm5vdCA9IFdlYlNlcnZpY2VBbm5vdC5jcmVhdGVXZWJTZXJ2aWNlQW5ub3RJbXBsKCk7Ci0gICAgICAgIHdlYlNlcnZpY2VBbm5vdC5zZXROYW1lKG51bGwpOwotICAgICAgICB3ZWJTZXJ2aWNlQW5ub3Quc2V0RW5kcG9pbnRJbnRlcmZhY2UoIm9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uaW1wbC5NeVNFSSIpOwotICAgICAgICBpbXBsQ29tcG9zaXRlLnNldFdlYlNlcnZpY2VBbm5vdCh3ZWJTZXJ2aWNlQW5ub3QpOwotICAgICAgICBpbXBsQ29tcG9zaXRlLnNldElzSW50ZXJmYWNlKGZhbHNlKTsKLQotICAgICAgICBIYXNoTWFwPFN0cmluZywgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlPiBkYmNMaXN0ID0KLSAgICAgICAgICAgICAgICBuZXcgSGFzaE1hcDxTdHJpbmcsIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZT4oKTsKLSAgICAgICAgZGJjTGlzdC5wdXQoc2VpQ29tcG9zaXRlLmdldENsYXNzTmFtZSgpLCBzZWlDb21wb3NpdGUpOwotICAgICAgICBkYmNMaXN0LnB1dChpbXBsQ29tcG9zaXRlLmdldENsYXNzTmFtZSgpLCBpbXBsQ29tcG9zaXRlKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgU2VydmljZURlc2NyaXB0aW9uSW1wbCBzZXJ2aWNlRGVzY0ltcGwgPQotICAgICAgICAgICAgICAgICAgICBuZXcgU2VydmljZURlc2NyaXB0aW9uSW1wbChkYmNMaXN0LCBpbXBsQ29tcG9zaXRlKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoV2ViU2VydmljZUV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgZmFpbCgiU2hvdWxkIE5PVCBoYXZlIGNhdWdodCBleGNlcHRpb24gZm9yIHZhbGlkYXRpb24gZXJyb3JzOiAiICsgZXgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIGZhaWwoIkNhdWdodCB3cm9uZyB0eXBlIG9mIGV4Y2VwdGlvbiAiICsgZXgudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLQotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFZhbGlkYXRlSW1wbE1ldGhvZHNWc1NFSUluaGVyaXRlbmNlKCkgewotCi0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBzdXBlclNlaUNvbXBvc2l0ZSA9IG5ldyBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUoKTsKLSAgICAgICAgc3VwZXJTZWlDb21wb3NpdGUuc2V0Q2xhc3NOYW1lKCJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmltcGwuTXlTdXBlclNFSSIpOwotICAgICAgICBNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSBzdXBlclNlaU1EQyA9IG5ldyBNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSgpOwotICAgICAgICBzdXBlclNlaU1EQy5zZXRNZXRob2ROYW1lKCJzdXBlclNlaU1ldGhvZCIpOwotICAgICAgICBzdXBlclNlaUNvbXBvc2l0ZS5hZGRNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZShzdXBlclNlaU1EQyk7Ci0KLSAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIHNlaUNvbXBvc2l0ZSA9IG5ldyBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUoKTsKLSAgICAgICAgc2VpQ29tcG9zaXRlLnNldENsYXNzTmFtZSgib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5pbXBsLk15U0VJIik7Ci0gICAgICAgIE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlIHNlaU1EQyA9IG5ldyBNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSgpOwotICAgICAgICBzZWlNREMuc2V0TWV0aG9kTmFtZSgic2VpTWV0aG9kIik7Ci0gICAgICAgIHNlaUNvbXBvc2l0ZS5hZGRNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZShzZWlNREMpOwotICAgICAgICBzZWlDb21wb3NpdGUuc2V0U3VwZXJDbGFzc05hbWUoIm9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uaW1wbC5NeVN1cGVyU0VJIik7Ci0KLSAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIGltcGxDb21wb3NpdGUgPSBuZXcgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCk7Ci0gICAgICAgIGltcGxDb21wb3NpdGUuc2V0Q2xhc3NOYW1lKCJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmltcGwuTXlJbXBsIik7Ci0gICAgICAgIE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlIGltcGxNREMgPSBuZXcgTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUoKTsKLSAgICAgICAgaW1wbE1EQy5zZXRNZXRob2ROYW1lKCJzdXBlclNlaU1ldGhvZCIpOwotICAgICAgICBpbXBsQ29tcG9zaXRlLmFkZE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlKGltcGxNREMpOwotICAgICAgICBXZWJTZXJ2aWNlQW5ub3Qgd2ViU2VydmljZUFubm90ID0gV2ViU2VydmljZUFubm90LmNyZWF0ZVdlYlNlcnZpY2VBbm5vdEltcGwoKTsKLSAgICAgICAgd2ViU2VydmljZUFubm90LnNldE5hbWUobnVsbCk7Ci0gICAgICAgIHdlYlNlcnZpY2VBbm5vdC5zZXRFbmRwb2ludEludGVyZmFjZSgib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5pbXBsLk15U0VJIik7Ci0gICAgICAgIGltcGxDb21wb3NpdGUuc2V0V2ViU2VydmljZUFubm90KHdlYlNlcnZpY2VBbm5vdCk7Ci0gICAgICAgIGltcGxDb21wb3NpdGUuc2V0SXNJbnRlcmZhY2UoZmFsc2UpOwotCi0gICAgICAgIEhhc2hNYXA8U3RyaW5nLCBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGU+IGRiY0xpc3QgPQotICAgICAgICAgICAgICAgIG5ldyBIYXNoTWFwPFN0cmluZywgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlPigpOwotICAgICAgICBkYmNMaXN0LnB1dChzZWlDb21wb3NpdGUuZ2V0Q2xhc3NOYW1lKCksIHNlaUNvbXBvc2l0ZSk7Ci0gICAgICAgIGRiY0xpc3QucHV0KHN1cGVyU2VpQ29tcG9zaXRlLmdldENsYXNzTmFtZSgpLCBzdXBlclNlaUNvbXBvc2l0ZSk7Ci0gICAgICAgIGRiY0xpc3QucHV0KGltcGxDb21wb3NpdGUuZ2V0Q2xhc3NOYW1lKCksIGltcGxDb21wb3NpdGUpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb25JbXBsIHNlcnZpY2VEZXNjSW1wbCA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBTZXJ2aWNlRGVzY3JpcHRpb25JbXBsKGRiY0xpc3QsIGltcGxDb21wb3NpdGUpOwotICAgICAgICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgY2F1Z2h0IHZhbGlkYXRpb24gZmFpbHVyZSBleGNlcHRpb24iKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoV2ViU2VydmljZUV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgLy8gRXhwZWN0ZWQgcGF0aAotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIGZhaWwoIkNhdWdodCB3cm9uZyBleGNlcHRpb24gIiArIGV4LnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gVGhlIHRlc3RzIGJlbG93IHByb2dyZXNzaXZlbHkgc2V0dXAgYW4gaWRlbnRpY2FsIERCQywgZ3JhZHVhbGx5IHNldHRpbmcgbW9yZSB2YWx1ZXMgdW50aWwKLSAgICAvLyB0aGUgbGFzdCBvbmUgZG9lcyBub3QgY2F1c2UgYSB2YWxpZGF0aW9uIGVycm9yLgotCi0gICAgLy8gRkFJTFVSRSAjMTogTm8gV2ViTWV0aG9kIGFubm90YXRpb24gc2V0IG9uIHRoZSBTRUkKLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZERCQzEoKSB7Ci0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBzZWlDb21wb3NpdGUgPSBuZXcgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCk7Ci0gICAgICAgIHNlaUNvbXBvc2l0ZS5zZXRDbGFzc05hbWUoIm9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uaW1wbC5NeVNFSSIpOwotICAgICAgICBNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSBzZWlNREMgPSBuZXcgTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUoKTsKLSAgICAgICAgc2VpTURDLnNldE1ldGhvZE5hbWUoInNlaU1ldGhvZCIpOwotICAgICAgICBzZWlDb21wb3NpdGUuYWRkTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUoc2VpTURDKTsKLQotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgc3VwZXJJbXBsQ29tcG9zaXRlID0gbmV3IERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSgpOwotICAgICAgICBzdXBlckltcGxDb21wb3NpdGUuc2V0Q2xhc3NOYW1lKCJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmltcGwuTXlTdXBlckltcGwiKTsKLSAgICAgICAgTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUgc3VwZXJJbXBsTURDID0gbmV3IE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlKCk7Ci0gICAgICAgIHN1cGVySW1wbE1EQy5zZXRNZXRob2ROYW1lKCJzZWlNZXRob2QiKTsKLSAgICAgICAgc3VwZXJJbXBsQ29tcG9zaXRlLmFkZE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlKHN1cGVySW1wbE1EQyk7Ci0KLSAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIGltcGxDb21wb3NpdGUgPSBuZXcgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCk7Ci0gICAgICAgIGltcGxDb21wb3NpdGUuc2V0Q2xhc3NOYW1lKCJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmltcGwuTXlJbXBsIik7Ci0gICAgICAgIE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlIGltcGxNREMgPSBuZXcgTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUoKTsKLSAgICAgICAgaW1wbE1EQy5zZXRNZXRob2ROYW1lKCJub3RTZWlNZXRob2QiKTsKLSAgICAgICAgaW1wbENvbXBvc2l0ZS5hZGRNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZShpbXBsTURDKTsKLSAgICAgICAgV2ViU2VydmljZUFubm90IHdlYlNlcnZpY2VBbm5vdCA9IFdlYlNlcnZpY2VBbm5vdC5jcmVhdGVXZWJTZXJ2aWNlQW5ub3RJbXBsKCk7Ci0gICAgICAgIHdlYlNlcnZpY2VBbm5vdC5zZXROYW1lKG51bGwpOwotICAgICAgICB3ZWJTZXJ2aWNlQW5ub3Quc2V0RW5kcG9pbnRJbnRlcmZhY2UoIm9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uaW1wbC5NeVNFSSIpOwotICAgICAgICBpbXBsQ29tcG9zaXRlLnNldFdlYlNlcnZpY2VBbm5vdCh3ZWJTZXJ2aWNlQW5ub3QpOwotICAgICAgICBpbXBsQ29tcG9zaXRlLnNldElzSW50ZXJmYWNlKGZhbHNlKTsKLSAgICAgICAgaW1wbENvbXBvc2l0ZS5zZXRTdXBlckNsYXNzTmFtZSgib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5pbXBsLk15U3VwZXJJbXBsIik7Ci0KLSAgICAgICAgSGFzaE1hcDxTdHJpbmcsIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZT4gZGJjTGlzdCA9Ci0gICAgICAgICAgICAgICAgbmV3IEhhc2hNYXA8U3RyaW5nLCBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGU+KCk7Ci0gICAgICAgIGRiY0xpc3QucHV0KHNlaUNvbXBvc2l0ZS5nZXRDbGFzc05hbWUoKSwgc2VpQ29tcG9zaXRlKTsKLSAgICAgICAgZGJjTGlzdC5wdXQoaW1wbENvbXBvc2l0ZS5nZXRDbGFzc05hbWUoKSwgaW1wbENvbXBvc2l0ZSk7Ci0gICAgICAgIGRiY0xpc3QucHV0KHN1cGVySW1wbENvbXBvc2l0ZS5nZXRDbGFzc05hbWUoKSwgc3VwZXJJbXBsQ29tcG9zaXRlKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgU2VydmljZURlc2NyaXB0aW9uSW1wbCBzZXJ2aWNlRGVzY0ltcGwgPQotICAgICAgICAgICAgICAgICAgICBuZXcgU2VydmljZURlc2NyaXB0aW9uSW1wbChkYmNMaXN0LCBpbXBsQ29tcG9zaXRlKTsKLSAgICAgICAgICAgIGZhaWwoIkRpZCBub3QgY2F0Y2ggZXhwZWN0ZWQgZXhjZXB0aW9uIik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFdlYlNlcnZpY2VFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIC8vIEV4cGVjdGVkIHBhdGgKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIGV4Y2VwdGlvbiByZWNlaXZlZCAiICsgZXgudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2pheHdzL1N1YlBhY2thZ2VFeGNlcHRpb25CZWFuLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vamF4d3MvU3ViUGFja2FnZUV4Y2VwdGlvbkJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ4ZWNkOS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vamF4d3MvU3ViUGFja2FnZUV4Y2VwdGlvbkJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5qYXh3czsKLQotLyoqIFVzZWQgYnkgV3JhcHBlZFBhY2thZ2VUZXN0cyAqLwotcHVibGljIGNsYXNzIFN1YlBhY2thZ2VFeGNlcHRpb25CZWFuIHsKLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2pheHdzL1N1YlBhY2thZ2VNZXRob2QxLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vamF4d3MvU3ViUGFja2FnZU1ldGhvZDEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE0NWYxNS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vamF4d3MvU3ViUGFja2FnZU1ldGhvZDEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5qYXh3czsKLQotLyoqIFVzZWQgYnkgV3JhcHBlZFBhY2thZ2VUZXN0cyAqLwotcHVibGljIGNsYXNzIFN1YlBhY2thZ2VNZXRob2QxIHsKLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2pheHdzL1N1YlBhY2thZ2VNZXRob2QxUmVzcG9uc2UuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9qYXh3cy9TdWJQYWNrYWdlTWV0aG9kMVJlc3BvbnNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0NTIwYjIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2pheHdzL1N1YlBhY2thZ2VNZXRob2QxUmVzcG9uc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5qYXh3czsKLQotLyoqIFVzZWQgYnkgV3JhcHBlZFBhY2thZ2VUZXN0cyAqLwotcHVibGljIGNsYXNzIFN1YlBhY2thZ2VNZXRob2QxUmVzcG9uc2UgewotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS90ZXN0L29yZy9hcGFjaGUvYXhpczIvbWV0YWRhdGEvcmVnaXN0cnkvTWV0YWRhdGFGYWN0b3J5UmVnaXN0cnlUZXN0cy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL21ldGFkYXRhL3JlZ2lzdHJ5L01ldGFkYXRhRmFjdG9yeVJlZ2lzdHJ5VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmMwYjE5Zi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS90ZXN0L29yZy9hcGFjaGUvYXhpczIvbWV0YWRhdGEvcmVnaXN0cnkvTWV0YWRhdGFGYWN0b3J5UmVnaXN0cnlUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5tZXRhZGF0YS5yZWdpc3RyeTsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLndzZGwuV1NETFJlYWRlckNvbmZpZ3VyYXRvcjsNCi0NCi1pbXBvcnQgamF2YXgud3NkbC5mYWN0b3J5LldTRExGYWN0b3J5Ow0KLWltcG9ydCBqYXZheC53c2RsLnhtbC5XU0RMUmVhZGVyOw0KLWltcG9ydCBqYXZhLmlvLkZpbGU7DQotDQotDQotcHVibGljIGNsYXNzIE1ldGFkYXRhRmFjdG9yeVJlZ2lzdHJ5VGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uZmlndXJhdGlvbkZpbGUoKSB7DQotICAgICAgICBTdHJpbmcgY29uZmlnTG9jID0gbnVsbDsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgU3RyaW5nIHNlcCA9ICIvIjsNCi0gICAgICAgICAgICBjb25maWdMb2MgPSBzZXAgKyAidGVzdC1yZXNvdXJjZXMiICsgc2VwICsgIk1FVEEtSU5GIiArIHNlcCArICJzZXJ2aWNlcyIgKw0KLSAgICAgICAgICAgIHNlcCArICJvcmcuYXBhY2hlLmF4aXMyLm1ldGFkYXRhLnJlZ2lzdHJ5Lk1ldGFkYXRhRmFjdG9yeVJlZ2lzdHJ5IjsNCi0gICAgICAgICAgICBTdHJpbmcgYmFzZURpciA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiYmFzZWRpciIsIi4iKSkuZ2V0Q2Fub25pY2FsUGF0aCgpOw0KLSAgICAgICAgICAgIGNvbmZpZ0xvYyA9IG5ldyBGaWxlKGJhc2VEaXIgKyBjb25maWdMb2MpLmdldEFic29sdXRlUGF0aCgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2goRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYoY29uZmlnTG9jICE9IG51bGwpIHsNCi0gICAgICAgICAgICBNZXRhZGF0YUZhY3RvcnlSZWdpc3RyeS5zZXRDb25maWd1cmF0aW9uRmlsZUxvY2F0aW9uKGNvbmZpZ0xvYyk7DQotICAgICAgICAgICAgT2JqZWN0IG9iaiA9IE1ldGFkYXRhRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoVGVzdEludGVyZmFjZS5jbGFzcyk7DQotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChvYmopOw0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhvYmouZ2V0Q2xhc3MoKS5nZXROYW1lKCksIFRlc3RJbXBsZW1lbnRhdGlvbi5jbGFzcy5nZXROYW1lKCkpOyANCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIHZvaWQgdGVzdFJlZ2lzdGVyV1NETFJlYWRlckNvbmZpZ3VyYXRvcigpIHsNCi0gICAgCUV4Y2VwdGlvbiBlID0gbnVsbDsNCi0gICAgCVdTRExSZWFkZXIgcmVhZGVyID0gbnVsbDsNCi0gICAgCXRyeSB7DQotICAgIAkJV1NETEZhY3RvcnkgZmFjdG9yeSA9IFdTRExGYWN0b3J5Lm5ld0luc3RhbmNlKCk7DQotICAgICAgICAJcmVhZGVyID0gZmFjdG9yeS5uZXdXU0RMUmVhZGVyKCk7DQotICAgIAl9DQotICAgIAljYXRjaChFeGNlcHRpb24gZTIpIHsNCi0gICAgCQllLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAJCWUgPSBlMjsNCi0gICAgCX0NCi0gICAgCWFzc2VydE51bGwoZSk7DQotICAgIAlhc3NlcnROb3ROdWxsKHJlYWRlcik7DQotICAgIAlXU0RMUmVhZGVyQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvciA9IChXU0RMUmVhZGVyQ29uZmlndXJhdG9yKSBNZXRhZGF0YUZhY3RvcnlSZWdpc3RyeS4NCi0gICAgCQlnZXRGYWN0b3J5KFdTRExSZWFkZXJDb25maWd1cmF0b3IuY2xhc3MpOw0KLSAgICAJYXNzZXJ0Tm90TnVsbChjb25maWd1cmF0b3IpOw0KLSAgICAJdHJ5IHsNCi0gICAgCQljb25maWd1cmF0b3IuY29uZmlndXJlUmVhZGVySW5zdGFuY2UocmVhZGVyKTsNCi0gICAgCX0NCi0gICAgCWNhdGNoKEV4Y2VwdGlvbiBlMikgew0KLSAgICAJCWUgPSBlMjsNCi0gICAgCX0NCi0gICAgCWFzc2VydE51bGwoZSk7DQotICAgIAlhc3NlcnRFcXVhbHMocmVhZGVyLmdldEZlYXR1cmUoY29tLmlibS53c2RsLkNvbnN0YW50cy5GRUFUVVJFX1ZFUkJPU0UpLCBmYWxzZSk7DQotICAgIH0NCi0NCi0gICAgLy8gVGhpcyBpbnRlcmZhY2UgY2xhc3Mgd2lsbCBiZSB1c2VkIHRvIHRlc3QgdGhlIGZpbGUgYmFzZWQgcmVnaXN0cmF0aW9uDQotICAgIC8vIG9mIGN1c3RvbSBpbXBsZW1lbnRhdGlvbnMgd2l0aCB0aGUgTWV0YWRhdGFGYWN0b3J5UmVnaXN0cnkNCi0gICAgcHVibGljIGludGVyZmFjZSBUZXN0SW50ZXJmYWNlIHsNCi0gICAgICAgIHB1YmxpYyB2b2lkIGRvU29tZXRoaW5nKCk7DQotICAgIH0NCi0gICAgDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9tZXRhZGF0YS9yZWdpc3RyeS9UZXN0SW1wbGVtZW50YXRpb24uamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9tZXRhZGF0YS9yZWdpc3RyeS9UZXN0SW1wbGVtZW50YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmVmNTIyYS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXRhZGF0YS90ZXN0L29yZy9hcGFjaGUvYXhpczIvbWV0YWRhdGEvcmVnaXN0cnkvVGVzdEltcGxlbWVudGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLm1ldGFkYXRhLnJlZ2lzdHJ5Ow0KLQ0KLS8qKg0KLSAqIFRoaXMgaXMgYSBtb2NrIGltcGVsZW1lbnRhdGlvbiBjbGFzcyB0aGF0IHdpbGwgYmUgdXNlZCB0bw0KLSAqIHRlc3QgdGhlIGZpbGUtYmFzZWQgcmVnaXN0cmF0aW9uIG9mIGNsYXNzZXMgd2l0aCB0aGUNCi0gKiBNZXRhZGF0YUZhY3RvcnlSZWdpc3RyeS4gVGhlIGZpbGUtYmFzZWQgcmVnaXN0cmF0aW9uIGRvZXMNCi0gKiBub3Qgc3VwcG9ydCBpbm5lciBpbXBsZW1lbnRhdGlvbiBjbGFzc2VzLCB0aHVzIHRoZSBuZWVkIGZvciANCi0gKiB0aGlzIG91dGVyIGNsYXNzLg0KLSAqDQotICovDQotcHVibGljIGNsYXNzIFRlc3RJbXBsZW1lbnRhdGlvbiB7DQotDQotICAgIHB1YmxpYyBUZXN0SW1wbGVtZW50YXRpb24oKSB7DQotICAgICAgICANCi0gICAgfQ0KLSAgICANCi19DQotDQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV4L3BvbS54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9tZXgvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjYxZjY1NC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXgvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItcGFyZW50PC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4xLjUuMTwvdmVyc2lvbj4KLSAgICAgICAgPHJlbGF0aXZlUGF0aD4uLi9wYXJlbnQvcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgotICAgIDwvcGFyZW50PgotICAgIDxhcnRpZmFjdElkPm1leDwvYXJ0aWZhY3RJZD4KLSAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgotICAgIDxuYW1lPkFwYWNoZSBBeGlzMiAtIE1FWDwvbmFtZT4KLSAgICA8ZGVzY3JpcHRpb24+V1MtTWV0YWRhdGEgRXhjaGFuZ2UgaW1wbGVtZW50YXRpb248L2Rlc2NyaXB0aW9uPgotICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLWtlcm5lbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7dmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8L2RlcGVuZGVuY2llcz4KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxzb3VyY2VEaXJlY3Rvcnk+c3JjPC9zb3VyY2VEaXJlY3Rvcnk+Ci0gICAgICAgIDx0ZXN0U291cmNlRGlyZWN0b3J5PnRlc3Q8L3Rlc3RTb3VyY2VEaXJlY3Rvcnk+Ci0gICAgICAgIDxyZXNvdXJjZXM+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT4uLi8uLjwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+Tk9USUNFLnR4dDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+TElDRU5TRS50eHQ8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgICAgICA8ZmlsdGVyaW5nPmZhbHNlPC9maWx0ZXJpbmc+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+Y29uZjwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxleGNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovKi5wcm9wZXJ0aWVzPC9leGNsdWRlPgotICAgICAgICAgICAgICAgIDwvZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgPGZpbHRlcmluZz5mYWxzZTwvZmlsdGVyaW5nPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYzwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxleGNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovKi5qYXZhPC9leGNsdWRlPgotICAgICAgICAgICAgICAgIDwvZXhjbHVkZXM+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICA8L3Jlc291cmNlcz4KLSAgICAgICAgPHRlc3RSZXNvdXJjZXM+Ci0gICAgICAgICAgICA8dGVzdFJlc291cmNlPgotICAgICAgICAgICAgICAgIDx0YXJnZXRQYXRoPi4uL3Rlc3QtcmVzb3VyY2VzPC90YXJnZXRQYXRoPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+dGVzdC1yZXNvdXJjZXM8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLyoqPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICA8L3Rlc3RSZXNvdXJjZT4KLSAgICAgICAgPC90ZXN0UmVzb3VyY2VzPgotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1tYXItbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7dmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPGV4dGVuc2lvbnM+dHJ1ZTwvZXh0ZW5zaW9ucz4KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5nZW5lcmF0ZS1tYXI8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnZlcmlmeTwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+bWFyPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlRGVwZW5kZW5jaWVzPmZhbHNlPC9pbmNsdWRlRGVwZW5kZW5jaWVzPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphci1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5qYXI8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc2lmaWVyPmltcGw8L2NsYXNzaWZpZXI+Ci0gICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxza2lwPmZhbHNlPC9za2lwPgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgPC9idWlsZD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL21leC9zcmMvTUVUQS1JTkYvbW9kdWxlLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL21leC9zcmMvTUVUQS1JTkYvbW9kdWxlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA0NjAxOC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXgvc3JjL01FVEEtSU5GL21vZHVsZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08bW9kdWxlIG5hbWU9Im1ldGFkYXRhRXhjaGFuZ2UiIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLm1leC5NZXRhZGF0YUV4Y2hhbmdlTW9kdWxlIj4NCi0gICA8b3BlcmF0aW9uIG5hbWU9ImdldE1ldGFkYXRhIiBtZXA9Imh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgvd3NkbC9pbi1vdXQiPg0KLSAgICAgICAgIDxtZXNzYWdlUmVjZWl2ZXIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIubWV4Lk1leE1lc3NhZ2VSZWNlaXZlciIvPg0KLQ0KLSAgICAgICAgPCEtLSBuYW1lc3BhY2VzIGZvciB0aGUgMjAwNC0wOSBzcGVjIC0tPg0KLSAgICAgICAgDQotICAgICAgICAgPGFjdGlvbk1hcHBpbmc+aHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOS9tZXgvR2V0TWV0YWRhdGEvUmVxdWVzdDwvYWN0aW9uTWFwcGluZz4NCi0gICAgICAgICA8b3V0cHV0QWN0aW9uTWFwcGluZz5odHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA5L21leC9HZXRNZXRhZGF0YS9SZXNwb25zZTwvb3V0cHV0QWN0aW9uTWFwcGluZz4NCi0gICAgICAgDQotICAgICAgICA8L29wZXJhdGlvbj4NCi0NCi08L21vZHVsZT4NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9tZXgvc3JjL29yZy9hcGFjaGUvYXhpczIvbWV4L01ldGFkYXRhRXhjaGFuZ2VNb2R1bGUuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL21leC9zcmMvb3JnL2FwYWNoZS9heGlzMi9tZXgvTWV0YWRhdGFFeGNoYW5nZU1vZHVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2RlMDdjLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL21leC9zcmMvb3JnL2FwYWNoZS9heGlzMi9tZXgvTWV0YWRhdGFFeGNoYW5nZU1vZHVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLm1leDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNNb2R1bGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5tb2R1bGVzLk1vZHVsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm5lZXRoaS5Bc3NlcnRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5uZWV0aGkuUG9saWN5OwotCi0vKioKLSAqIE1ldGFkYXRhIEV4Y2hhbmdlIE1vZHVsZSB0byBzdXBwb3J0IFdTLU1FWCBzcGVjaWZpY2F0aW9uCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIE1ldGFkYXRhRXhjaGFuZ2VNb2R1bGUgaW1wbGVtZW50cyBNb2R1bGUgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKE1ldGFkYXRhRXhjaGFuZ2VNb2R1bGUuY2xhc3MpOwotCi0JcHVibGljIHZvaWQgZW5nYWdlTm90aWZ5KEF4aXNEZXNjcmlwdGlvbiBheGlzRGVzY3JpcHRpb24pIHRocm93cyBBeGlzRmF1bHQgewotCQlpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSl7Ci0JCQlsb2cuZGVidWcoIm1ldGFkYXRhRXhjaGFuZ2UgbW9kdWxlIGhhcyBiZWVuIGVuZ2FnZWQgdG8gU2VydmljZS4iICk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQsIEF4aXNNb2R1bGUgbW9kdWxlKQotCQkJdGhyb3dzIEF4aXNGYXVsdCB7Ci0JCi0JfQotCi0JcHVibGljIHZvaWQgc2h1dGRvd24oQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlndXJhdGlvbkNvbnRleHQpCi0JCQl0aHJvd3MgQXhpc0ZhdWx0IHsKLQkKLQotCX0KLQotCXB1YmxpYyB2b2lkIGFwcGx5UG9saWN5KFBvbGljeSBwb2xpY3ksIEF4aXNEZXNjcmlwdGlvbiBheGlzRGVzY3JpcHRpb24pIHRocm93cyBBeGlzRmF1bHQgewotCQkJCi0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuU3VwcG9ydEFzc2VydGlvbihBc3NlcnRpb24gYXNzZXJ0aW9uKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL21leC9zcmMvb3JnL2FwYWNoZS9heGlzMi9tZXgvTWV4Q29uc3RhbnRzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9tZXgvc3JjL29yZy9hcGFjaGUvYXhpczIvbWV4L01leENvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDgzZDM5Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL21leC9zcmMvb3JnL2FwYWNoZS9heGlzMi9tZXgvTWV4Q29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLm1leDsKLQotLyoqCi0gKiBDb250YWlucyBhbGwgdGhlIE1ldGFkYXRhRXhjaGFuZ2UgY29uc3RhbnRzIGZvciBXUy1NZXguCi0gKiAKLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIE1leENvbnN0YW50cyB7Ci0JcHVibGljIGludGVyZmFjZSBTUEVDX1ZFUlNJT05TIHsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgdjFfMCA9ICJTcGVjXzIwMDRfMDkiOwotCX0KLSAgICBwdWJsaWMgaW50ZXJmYWNlIFNwZWNfMjAwNF8wOSB7Ci0JCQotICAgIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOU19VUkkgPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOS9tZXgiOwotCi0JICAgIHB1YmxpYyBpbnRlcmZhY2UgQWN0aW9ucyB7Ci0JICAgIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRVRfTUVUQURBVEFfUkVRVUVTVCA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA5L21leC9HZXRNZXRhZGF0YS9SZXF1ZXN0IjsKLQkgICAgCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdFVF9NRVRBREFUQV9SRVNQT05TRSA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA5L21leC9HZXRNZXRhZGF0YS9SZXNwb25zZSI7Ci0JCQkKLQkgICAgfQotICAgIH0KLSAgICAKLSAgCi0gICAgcHVibGljIGludGVyZmFjZSBTT0FQVmVyc2lvbiB7Ci0gICAgCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHYxXzEgPSAxOwotCi0gICAgCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHYxXzIgPSAyOwotICAgIAotCX0KLSAgICAKLSAgICAKLSAgICBwdWJsaWMgaW50ZXJmYWNlIFNQRUMgewotICAgIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOU19QUkVGSVggPSAibWV4IjsKLSAgICAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VUX01FVEFEQVRBID0gIkdldE1ldGFkYXRhIjsKLSAgICAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElBTEVDVCA9ICJEaWFsZWN0IjsKLSAgICAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURFTlRJRklFUiA9ICJJZGVudGlmaWVyIjsKLSAgICAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUQURBVEEgPSAiTWV0YWRhdGEiOwotICAgIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRBREFUQV9TRUNUSU9OID0gIk1ldGFkYXRhU2VjdGlvbiI7Ci0gICAgCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEFEQVRBX1JFRkVSRU5DRSA9ICJNZXRhZGF0YVJlZmVyZW5jZSI7Ci0gICAgCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPQ0FUSU9OID0gIkxvY2F0aW9uIjsKLSAgICAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRSA9ICJ0eXBlIjsKLQkJCi0gICAgCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJQUxFQ1RfVFlQRV9XU0RMID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIjsKLSAgICAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElBTEVDVF9UWVBFX1BPTElDWSA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA5L3BvbGljeSI7Ci0gICAgCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJQUxFQ1RfVFlQRV9TQ0hFTUEgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiOwotICAgIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESUFMRUNUX1RZUEVfTUVYID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDkvbWV4IjsKLQkJCi0JfQotICAgIAotCi0gICAgLyoqCi0gICAgICogTUVYIENvbmZpZ3VyYXRpb24gCi0gICAgICogCi0gICAgICogU2FtcGxlIG1leCBjb25maWd1cmF0aW9uOgotICAgICAqIDxwYXJhbWV0ZXIgbmFtZT0ibWV0YWRhdGFleGNoYW5nZSI+Ci0gICAgICogICAgIDxvdXRwdXRmb3JtIGRpYWxlY3Q9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiBmb3Jtcz0ibG9jYXRpb24iIC8+Ci0gICAgICogICAgIDxvdXRwdXRmb3JtIGZvcm1zPSJpbmxpbmUscmVmZXJlbmNlLGxvY2F0aW9uIiAvPgotICAgICAqIDwvcGFyYW1ldGVyPiAKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50ZXJmYWNlIE1FWF9DT05GSUd7Ci0gICAgCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FWF9QQVJNID0gIm1ldGFkYXRhRXhjaGFuZ2UiOwotICAgIAkKLSAgICAJLy8gQWxsb3cgdG8gZGlzYWJsZSBNRVggZm9yIGEgU2VydmljZSBpZiBNRVggaXMgZW5nYWdlZCBnbG9iYWxseS4gCi0gICAgCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOQUJMRV9NRVggPSAiZW5hYmxlIjsgCi0gICAgICAgIAotICAgIAkvLyBPbmUgb3IgbW9yZSBvdXRwdXRmb3JtIGVsZW1lbnQgY2FuIGJlIHNwZWNpZmllZCBpbiB0aGUgbWV4IGNvbmZpZ3VyYXRpb24KLSAgICAJLy8gb3V0cHV0Zm9ybSBlbGVtZW50IGNvbnRhaW5zIGFuIG9wdGlvbmFsICJkaWFsZWN0IiBhdHRyaWJ1dGUgYW5kIGFuCi0gICAgCS8vIHJlcXVpcmVkIGZvcm1zIGF0dHJpYnV0ZS4gCi0gICAgCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9VVFBVVF9GT1JNX1BBUk0gPSAib3V0cHV0Zm9ybSI7Ci0gICAgCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJQUxFQ1RfUEFSTSA9ICJkaWFsZWN0IjsKLSAgICAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STVNfUEFSTSA9ICJmb3JtcyI7Ci0gICAgCQotICAgIAkvLyBjb25maWd1cmFibGUgcGFyYW1ldGVyIHZhbHVlcwotICAgIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUxJTUlURVIgPSAiLCI7Ci0gICAgCS8vIHBvc3NpYmxlICJmb3JtcyIgYXR0cmlidXRlIHZhbHVlcwotICAgIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NBVElPTiA9ICJsb2NhdGlvbiI7Ci0gICAgCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOTElORSA9ICJpbmxpbmUiOwotICAgIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUZFUkVOQ0UgPSAicmVmZXJlbmNlIjsKLSAgICAJCi0gICAgfQotICAKLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL21leC9zcmMvb3JnL2FwYWNoZS9heGlzMi9tZXgvTWV4RGlzYWJsZWRFeGNlcHRpb24uamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL21leC9zcmMvb3JnL2FwYWNoZS9heGlzMi9tZXgvTWV4RGlzYWJsZWRFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDI0M2EwOC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXgvc3JjL29yZy9hcGFjaGUvYXhpczIvbWV4L01leERpc2FibGVkRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIubWV4OwotCi1wdWJsaWMgY2xhc3MgTWV4RGlzYWJsZWRFeGNlcHRpb24gZXh0ZW5kcyBNZXhFeGNlcHRpb24gewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gODkwOTUyODcxODY3ODgwNjA2TDsKLQotICAgIHB1YmxpYyBNZXhEaXNhYmxlZEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgewotCQlzdXBlcihtZXNzYWdlKTsKLQl9Ci0KLSAgfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV4L3NyYy9vcmcvYXBhY2hlL2F4aXMyL21leC9NZXhFeGNlcHRpb24uamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL21leC9zcmMvb3JnL2FwYWNoZS9heGlzMi9tZXgvTWV4RXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViN2M5ZGYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvbWV4L3NyYy9vcmcvYXBhY2hlL2F4aXMyL21leC9NZXhFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5tZXg7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLQotLyoqCi0gKiBCYXNlIEV4Y2VwdGlvbiB0byByZXBvcnQgcHJvYmxlbSBmcm9tIGltcGxlbWVudGF0aW9uIGNsYXNzZXMgb2YgCi0gKiBXUy1NZXRhZGF0YUV4Y2hhbmdlLgotICoKLSAqLwotcHVibGljIGNsYXNzIE1leEV4Y2VwdGlvbiBleHRlbmRzIEF4aXNGYXVsdCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzMzk4NjkyMzQ0MjY2ODM3NjkwTDsKLQotICAgIHB1YmxpYyBNZXhFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKLQkJc3VwZXIobWVzc2FnZSk7Ci0JfQotCi0JcHVibGljIE1leEV4Y2VwdGlvbihUaHJvd2FibGUgZSkgewotCQlzdXBlcihlKTsKLQl9Ci0KLSAgICBwdWJsaWMgTWV4RXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZSkgewotCQlzdXBlcihtZXNzYWdlLCBlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL21leC9zcmMvb3JnL2FwYWNoZS9heGlzMi9tZXgvTWV4TWVzc2FnZVJlY2VpdmVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9tZXgvc3JjL29yZy9hcGFjaGUvYXhpczIvbWV4L01leE1lc3NhZ2VSZWNlaXZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWQxYzRhLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL21leC9zcmMvb3JnL2FwYWNoZS9heGlzMi9tZXgvTWV4TWVzc2FnZVJlY2VpdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLm1leDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQQm9keTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhcmV0cmlldmFsLkRhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhcmV0cmlldmFsLkRhdGFSZXRyaWV2YWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhcmV0cmlldmFsLkRhdGFSZXRyaWV2YWxSZXF1ZXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YXJldHJpZXZhbC5PdXRwdXRGb3JtOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5QYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5tZXgub20uTG9jYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5tZXgub20uTWV0YWRhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5tZXgub20uTWV0YWRhdGFSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5tZXgub20uTWV0YWRhdGFTZWN0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIubWV4Lm9tLk1leE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIubWV4LnV0aWwuTWV4VXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5BYnN0cmFjdEluT3V0TWVzc2FnZVJlY2VpdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIE1lc3NhZ2UgUmVjZWl2ZXIgZm9yIHByb2Nlc3NpbmcgV1MtTUVYIEdldE1ldGFkYXRhIHJlcXVlc3QuIAotICoKLSAqLwotcHVibGljIGNsYXNzIE1leE1lc3NhZ2VSZWNlaXZlciBleHRlbmRzIEFic3RyYWN0SW5PdXRNZXNzYWdlUmVjZWl2ZXIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhNZXhNZXNzYWdlUmVjZWl2ZXIuY2xhc3MpOwotCVBhcmFtZXRlciBheGlzQ29uZmlnTUVYUGFybSA9IG51bGw7Ci0gICAgUGFyYW1ldGVyIHNlcnZpY2VDb25maWdNRVhQYXJtID0gbnVsbDsKLQlTdHJpbmcgbWV4TmFtZXNwYWNlVmFsdWUgPSBudWxsOwotCi0JLyoqCi0JICogUHJvY2VzcyBHZXRNZXRhZGF0YSByZXF1ZXN0Ci0gICAgICAgICovCi0JcHVibGljIHZvaWQgaW52b2tlQnVzaW5lc3NMb2dpYyhNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0LAotCQkJTWVzc2FnZUNvbnRleHQgbmV3bXNnQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0JCUF4aXNTZXJ2aWNlIHRoZVNlcnZpY2UgPSBtc2dDb250ZXh0LmdldEF4aXNTZXJ2aWNlKCk7ICAgICAgIAotCQlheGlzQ29uZmlnTUVYUGFybSA9IG1zZ0NvbnRleHQuZ2V0Q29uZmlndXJhdGlvbkNvbnRleHQoKS5nZXRBeGlzQ29uZmlndXJhdGlvbigpLmdldFBhcmFtZXRlcihNZXhDb25zdGFudHMuTUVYX0NPTkZJRy5NRVhfUEFSTSk7Ci0JCXNlcnZpY2VDb25maWdNRVhQYXJtID0gdGhlU2VydmljZS5nZXRQYXJhbWV0ZXIoTWV4Q29uc3RhbnRzLk1FWF9DT05GSUcuTUVYX1BBUk0pOwotCQkKLQkJY2hlY2tfTUVYX2Rpc2FibGVkKHNlcnZpY2VDb25maWdNRVhQYXJtKTsKLQkJCi0JCXRyeSB7Ci0JCQlNZXRhZGF0YSBtZXRhZGF0YSA9IGhhbmRsZVJlcXVlc3QobXNnQ29udGV4dCk7Ci0JCSAgICAgICAgdGhlU2VydmljZS5zZXRFbmRwb2ludFVSTChtc2dDb250ZXh0LmdldFRvKCkuZ2V0QWRkcmVzcygpKTsKLQotCQkJaWYgKG1ldGFkYXRhICE9IG51bGwpIHsKLQkJCQlTT0FQRW52ZWxvcGUgZW52ZWxvcGUgPSBuZXdtc2dDb250ZXh0LmdldEVudmVsb3BlKCk7Ci0JCQkJaWYgKGVudmVsb3BlID09IG51bGwpIHsKLQkJCQkJU09BUEZhY3RvcnkgZmFjID0gZ2V0U09BUEZhY3RvcnkobXNnQ29udGV4dCk7Ci0JCQkJCWVudmVsb3BlID0gZmFjLmdldERlZmF1bHRFbnZlbG9wZSgpOwotCQkJCX0KLSAgICAgICAgICAgCi0JCQkJT01FbGVtZW50IHJlc3VsdCA9IG1ldGFkYXRhLnRvT00oKTsKLQkJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCQkJQXhpc1NlcnZpY2Ugc2VydmljZSA9IG1zZ0NvbnRleHQuZ2V0QXhpc1NlcnZpY2UoKTsKLQkJCQkJcmVzdWx0LmRlY2xhcmVOYW1lc3BhY2Uoc2VydmljZS5nZXRUYXJnZXROYW1lc3BhY2UoKSwKLQkJCQkJCQlzZXJ2aWNlLmdldFRhcmdldE5hbWVzcGFjZVByZWZpeCgpKTsKLQkJCQkJZW52ZWxvcGUuZ2V0Qm9keSgpLmFkZENoaWxkKHJlc3VsdCk7Ci0JCQkJfQotCi0JCQkJbmV3bXNnQ29udGV4dC5zZXRFbnZlbG9wZShlbnZlbG9wZSk7Ci0JCQl9Ci0JCQkvLyBBeGlzU2VydmljZSBzZXJ2aWNlID0gbXNnQ29udGV4dC5nZXRBeGlzU2VydmljZSgpOwotCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlsb2cuaW5mbyhlKTsKLQkJCWlmIChlIGluc3RhbmNlb2YgTWV4RXhjZXB0aW9uKSB7Ci0JCQkJdGhyb3cgKE1leEV4Y2VwdGlvbikgZTsKLQkJCX0KLQkJCXRocm93IG5ldyBNZXhFeGNlcHRpb24oZSk7Ci0JCX0KLQotCX0KLQotCi0JLyoKLQkgKiBIYW5kbGUgR2V0TWV0YWRhdGEgUmVxdWVzdCAKLQkgKiBJbnRlcnByZXRlIEdldE1ldGFkYXRhIHJlcXVlc3QgYW5kIHByb2Nlc3MgcmVxdWVzdC4KLQkgKiBAcmV0dXJucyBNZXRhZGF0YSBvYmplY3QKLQkgKi8KLQlwcml2YXRlIE1ldGFkYXRhIGhhbmRsZVJlcXVlc3QoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0JCU1ldGFkYXRhIG1ldGFkYXRhID0gbnVsbDsKLQkJU09BUEVudmVsb3BlIGVudmVsb3BlID0gbXNnQ29udGV4dC5nZXRFbnZlbG9wZSgpOwotCi0JCVNPQVBCb2R5IGJvZHkgPSBlbnZlbG9wZS5nZXRCb2R5KCk7Ci0JCU9NRWxlbWVudCBhUmVxID0gYm9keS5nZXRGaXJzdENoaWxkV2l0aE5hbWUobmV3IFFOYW1lKAotICAgICAgICAgICAgICAgIE1leENvbnN0YW50cy5TcGVjXzIwMDRfMDkuTlNfVVJJLAotCQkJCU1leENvbnN0YW50cy5TUEVDLkdFVF9NRVRBREFUQSkpOwotICAgICAgICAKLQkJTGlzdCBtZXRhZGF0YV9yZXF1ZXN0X2xpc3Q7Ci0JCWlmIChhUmVxICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1leE5hbWVzcGFjZVZhbHVlID0gTWV4Q29uc3RhbnRzLlNwZWNfMjAwNF8wOS5OU19VUkk7Ci0JCQltZXRhZGF0YV9yZXF1ZXN0X2xpc3QgPSBkZXRlcm1pbmVNZXRhZGF0YVR5cGVzKGFSZXEpOwotCi0JCX0gZWxzZSB7Ci0JCQl0aHJvdyBuZXcgTWV4RXhjZXB0aW9uKCJJbnZhbGlkIE1ldGFkYXRhIHJlcXVlc3QiKTsKLQkJfQotCi0JCW1ldGFkYXRhID0gcHJvY2Vzc1JlcXVlc3QobWV0YWRhdGFfcmVxdWVzdF9saXN0LCBtc2dDb250ZXh0LCBhUmVxKTsKLQotCQlyZXR1cm4gbWV0YWRhdGE7Ci0JfQotCi0JLyoKLQkgKiBQcm9jZXNzIHRoZSByZXF1ZXN0cwotCSAqIAotCSAqIEBwYXJhbSBtZXRhZGF0YV9yZXF1ZXN0X2xpc3QgbGlzdCBvZiBtZXggRGlhbGVjdCBmb3IgcmVxdWVzdGluZyBkYXRhCi0JICogQG1zZ0NvbnRleHQgTWVzc2FnZUNvbnRleHQKLQkgKiBAYVJlcSBHZXRNZXRhZGF0YSByZXF1ZXN0IAotICAgICAqLwotCQotCXB1YmxpYyBNZXRhZGF0YSBwcm9jZXNzUmVxdWVzdChMaXN0IG1ldGFkYXRhX3JlcXVlc3RfbGlzdCwKLQkJCU1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQsIE9NRWxlbWVudCBhUmVxKSB0aHJvd3MgTWV4RXhjZXB0aW9uIHsKLQkJCi0JICAgIC8vICBJbnN0YW50aWF0ZSBNZXRhZGF0YSBpbnN0YW5jZSB0byBidWlsZCB0aGUgV1MtTWV4IE1ldGFkYXRhIGVsZW1lbnQKLSAgICAgICAgU09BUEVudmVsb3BlIGVudmVsb3BlID0gbXNnQ29udGV4dC5nZXRFbnZlbG9wZSgpOwotICAgICAgICBTdHJpbmcgc29hcE5hbWVzcGFjZVVSSSA9IGVudmVsb3BlLmdldE5hbWVzcGFjZSgpLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICBTT0FQRmFjdG9yeSBmYWN0b3J5ID0gTWV4VXRpbC5nZXRTT0FQRmFjdG9yeShzb2FwTmFtZXNwYWNlVVJJKTsKLSAgICAgICAgCi0gICAgICAgIE1ldGFkYXRhIG1ldGFkYXRhID0gbmV3IE1ldGFkYXRhKGZhY3RvcnksIG1leE5hbWVzcGFjZVZhbHVlKTsKLQkJRGF0YVJldHJpZXZhbFJlcXVlc3QgcmVxdWVzdE9wdGlvbnMgPSBuZXcgRGF0YVJldHJpZXZhbFJlcXVlc3QoKTsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBpZGVudGlmaWVyX3ZhbHVlID0gbnVsbDsKLQkJLy8gQ2hlY2sgaWYgSWRlbnRpZmllciBlbGVtZW50IGluY2x1ZGVkIGluIHJlcXVlc3QKLSAgICAgICAgT01FbGVtZW50IGRpYWxlY3RFbGVtID0gYVJlcS5nZXRGaXJzdENoaWxkV2l0aE5hbWUobmV3IFFOYW1lKAotICAgICAgICAgICAgICAgIG1leE5hbWVzcGFjZVZhbHVlLCBNZXhDb25zdGFudHMuU1BFQy5ESUFMRUNUKSk7Ci0gICAgICAgIAotICAgICAgICBpZiAoZGlhbGVjdEVsZW0gIT0gbnVsbCkgIHsKLSAgICAJCU9NRWxlbWVudCBpZGVudGlmaWVyID0gZGlhbGVjdEVsZW0uZ2V0Rmlyc3RDaGlsZFdpdGhOYW1lKG5ldyBRTmFtZSgKLSAgICAgICAgICAgICAgICAgICAgbWV4TmFtZXNwYWNlVmFsdWUsIE1leENvbnN0YW50cy5TUEVDLklERU5USUZJRVIpKTsKLSAgICAgICAgICAgIAotICAgIAkJaWYgKGlkZW50aWZpZXIgIT0gbnVsbCkgewotICAgIAkJCWlkZW50aWZpZXJfdmFsdWUgPSBpZGVudGlmaWVyLmdldFRleHQoKTsKLSAgICAJCQlpZiAoaWRlbnRpZmllcl92YWx1ZSAhPSBudWxsICYmIGlkZW50aWZpZXJfdmFsdWUubGVuZ3RoKCkgPiAwKSB7Ci0gICAgCQkJCXJlcXVlc3RPcHRpb25zLnB1dElkZW50aWZpZXIoaWRlbnRpZmllcl92YWx1ZSk7Ci0gICAgCQkJfQotICAgIAkJfQotICAgICAgICB9Ci0gICAgICAgIAotCQkvLyBQcm9jZXNzIHRoZSByZXF1ZXN0IGFuZCBhcHBlbmQgTWV0YWRhdGFTZWN0aW9uIHRvIE1ldGFkYXRhCi0JCS8vIExvb3AgdGhyb3VnaCB0aGUgbWV0YWRhdGFfcmVxdWVzdF9saXN0IGZvciBEaWFsZWN0KHMpKSwgYW5kIHNldHVwIHJlcXVlc3RPcHRpb25zLgotCQkvLyBCYXNpY2FsbHksIG9uZSByZXF1ZXN0T3B0aW9ucyBpcyBzZXR1cCBmb3IgZWFjaCBzdXBwb3J0ZWQgb3V0cHV0Rm9ybSBmb3IgdGhlIERpYWxlY3QKLQkJLy8gYW5kIElkZW50aWZpZXIgc3BlY2lmaWVkIGluIHRoZSBHZXRNZXRhZGF0YSByZXF1ZXN0LgotCQlpbnQgbGVuID0gbWV0YWRhdGFfcmVxdWVzdF9saXN0LnNpemUoKTsKLQkJT3V0cHV0Rm9ybVtdIG91dHB1dGZvcm1zOwotCQkKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgeyAvLyBtZXRhZGF0YSByZXF1ZXN0Ci0KLSAgICAgICAgICAgIFN0cmluZyBkaWFsZWN0ID0gIiI7Ci0JCQl0cnkgewotCQkJCWRpYWxlY3QgPSAoU3RyaW5nKSBtZXRhZGF0YV9yZXF1ZXN0X2xpc3QuZ2V0KGkpOwotCi0JCQkJcmVxdWVzdE9wdGlvbnMucHV0RGlhbGVjdChkaWFsZWN0KTsKLQotCQkJCW91dHB1dGZvcm1zID0gTWV4VXRpbC5kZXRlcm1pbmVPdXRwdXRGb3JtKGRpYWxlY3QsIGF4aXNDb25maWdNRVhQYXJtLCBzZXJ2aWNlQ29uZmlnTUVYUGFybSk7Ci0JCQkJLy8gTG9vcCB0byBjYWxsIEF4aXNTZXJ2aWNlOjpnZXREYXRhIEFQSSB0byByZXRyaWV2ZSBkYXRhCi0JCQkJLy8gZm9yIHRoZSBEaWFsZWN0IGFuZCBJZGVudGlmaWVyKGlmIHNwZWNpZmllZCkgaW4gdGhlIHJlcXVlc3QKLQkJCQkvLyBmb3IgZWFjaAotCQkJCS8vIHN1cHBvcnRlZCBvdXRwdXQgZm9ybS4KLQkJCQkKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IG91dHB1dGZvcm1zLmxlbmd0aDsgaisrKSB7IC8vIG91dHB1dCBmb3JtCi0JCQkJCXJlcXVlc3RPcHRpb25zLnB1dE91dHB1dEZvcm0ob3V0cHV0Zm9ybXNbal0pOwotCi0JCQkJCURhdGFbXSByZXN1bHQgPSAgbXNnQ29udGV4dC5nZXRBeGlzU2VydmljZSgpLmdldERhdGEocmVxdWVzdE9wdGlvbnMsCi0JCQkJCQkJbXNnQ29udGV4dCk7Ci0KLQkJCQkJQXJyYXlMaXN0IHNlY3Rpb25zID0gcHJvY2Vzc0RhdGEocmVzdWx0LCBvdXRwdXRmb3Jtc1tqXSwgZGlhbGVjdCwKLQkJCQkJCQkgICBpZGVudGlmaWVyX3ZhbHVlLCBmYWN0b3J5KTsKLQkJCQkJbWV0YWRhdGEuYWRkTWV0YWRhdFNlY3Rpb25zKHNlY3Rpb25zKTsKLQkJCQl9Ci0KLQkJCX0gY2F0Y2ggKERhdGFSZXRyaWV2YWxFeGNlcHRpb24gZSkgewotCQkJCWxvZy5lcnJvcigiRGF0YSBSZXRyaWV2YWwgZXhjZXB0aW9uIGRldGVjdGVkIGZvciBkaWFsZWN0LCAiICsgZGlhbGVjdCwgZSk7Ci0JCQkJCi0JCQkJdGhyb3cgbmV3IE1leEV4Y2VwdGlvbihlKTsKLQkJCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0JCQkJCi0JCQkJbG9nLmVycm9yKCJUaHJvd2FibGUgZGV0ZWN0ZWQgZm9yIGRpYWxlY3QsICIgKyBkaWFsZWN0ICwgZSk7Ci0gICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLQotCQkJCXRocm93IG5ldyBNZXhFeGNlcHRpb24oZSk7Ci0JCQl9Ci0KLQkJfQotCQlyZXR1cm4gbWV0YWRhdGE7Ci0JfQotCi0JLyoKLQkgKiBDcmVhdGUgTWV0YWRhdGFTZWN0aW9uIGZvciBlYWNoIERhdGEgZWxlbWVudCwgYW5kIGFkZCB0aGUKLQkgKiBNZXRhZGF0YVNlY3Rpb25zIHRvIE1ldGFkYXRhLgotCSAqLwotCXByaXZhdGUgQXJyYXlMaXN0IHByb2Nlc3NEYXRhKERhdGFbXSBkYXRhLCBPdXRwdXRGb3JtIG91dHB1dEZvcm0sCi0JCQlTdHJpbmcgZGlhbGVjdCwgU3RyaW5nIGlkZW50aWZpZXJfdmFsdWUsIFNPQVBGYWN0b3J5IGZhY3RvcnkpIHRocm93cyBNZXhFeGNlcHRpb24gewotCQlNZXRhZGF0YVNlY3Rpb24gc2VjdGlvbj1udWxsOwotCQlBcnJheUxpc3Qgc2VjdGlvbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmIChkYXRhID09IG51bGwgfHwgZGF0YS5sZW5ndGggPT0gMCkgewotCQkJaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQotCQkJCWxvZwotCQkJCQkJLmRlYnVnKCJObyByZXN1bHQgd2FzIHJldHVybmVkIGZyb20gZ2V0RGF0YSByZXF1ZXN0IGZvciBkaWFsZWN0LCIKLQkJCQkJCQkJKyBkaWFsZWN0Ci0JCQkJCQkJCSsgIiBGb3JtOiAiCi0JCQkJCQkJCSsgb3V0cHV0Rm9ybS5nZXRUeXBlKCkKLQkJCQkJCQkJKyAiLiBObyBNZXRhZGF0YVNlY3Rpb24gd2lsbCBiZSBhZGRlZCEiKTsKLQotCQl9IGVsc2UgewotCQkJZm9yIChpbnQgayA9IDA7IGsgPCBkYXRhLmxlbmd0aDsgaysrKSB7Ci0KLQkJCQlzZWN0aW9uID0gY3JlYXRlTWV0YWRhdGFTZWN0aW9uKG91dHB1dEZvcm0sIGRhdGFba10uZ2V0RGF0YSgpLAotCQkJCQkJZmFjdG9yeSwgbWV4TmFtZXNwYWNlVmFsdWUpOwotCi0JCQkJc2VjdGlvbi5zZXREaWFsZWN0KGRpYWxlY3QpOwotCQkJCWlkZW50aWZpZXJfdmFsdWUgPSBkYXRhW2tdLmdldElkZW50aWZpZXIoKTsKLQotCQkJCWlmIChpZGVudGlmaWVyX3ZhbHVlICE9IG51bGwpIHsKLQkJCQkJc2VjdGlvbi5zZXRJZGVudGlmaWVyKGlkZW50aWZpZXJfdmFsdWUpOwotCQkJCX0KLQkJCQlzZWN0aW9ucy5hZGQoc2VjdGlvbik7Ci0KLQkJCX0KLQkJfQotCQlyZXR1cm4gc2VjdGlvbnM7Ci0JfQotCi0JcHJpdmF0ZSBNZXRhZGF0YVNlY3Rpb24gY3JlYXRlTWV0YWRhdGFTZWN0aW9uKE91dHB1dEZvcm0gb3V0cHV0Rm9ybSwKLQkJCU9iamVjdCByZXN1bHQsIFNPQVBGYWN0b3J5IGZhY3RvcnksIFN0cmluZyBtZXhOYW1lc3BhY2VWYWx1ZSkKLQkJCXRocm93cyBNZXhPTUV4Y2VwdGlvbiB7Ci0JCU1ldGFkYXRhU2VjdGlvbiBzZWN0aW9uID0gbmV3IE1ldGFkYXRhU2VjdGlvbihmYWN0b3J5LAotCQkJCW1leE5hbWVzcGFjZVZhbHVlKTsKLQotCQlpZiAob3V0cHV0Rm9ybSA9PSBPdXRwdXRGb3JtLklOTElORV9GT1JNKQotCQkJc2VjdGlvbi5zZXRpbmxpbmVEYXRhKHJlc3VsdCk7Ci0JCWVsc2UgaWYgKG91dHB1dEZvcm0gPT0gT3V0cHV0Rm9ybS5MT0NBVElPTl9GT1JNKQotCQkJc2VjdGlvbi5zZXRMb2NhdGlvbihuZXcgTG9jYXRpb24oZmFjdG9yeSwgbWV4TmFtZXNwYWNlVmFsdWUsCi0JCQkJCShTdHJpbmcpIHJlc3VsdCkpOwotCQllbHNlIGlmIChvdXRwdXRGb3JtID09IE91dHB1dEZvcm0uUkVGRVJFTkNFX0ZPUk0pIHsKLQkJCU1ldGFkYXRhUmVmZXJlbmNlIHJlZiA9IG5ldyBNZXRhZGF0YVJlZmVyZW5jZShmYWN0b3J5LAotCQkJCQltZXhOYW1lc3BhY2VWYWx1ZSk7Ci0JCQkKLQkJCXJlZi5zZXRFUFIoKE9NRWxlbWVudCkgcmVzdWx0KTsKLQkJCXNlY3Rpb24uc2V0TWV0YWRhdGFSZWZlcmVuY2UocmVmKTsKLQkJfSBlbHNlIHsKLQotCQkJc2VjdGlvbi5zZXRpbmxpbmVEYXRhKChPTUVsZW1lbnQpIHJlc3VsdCk7Ci0JCX0KLQotCQlyZXR1cm4gc2VjdGlvbjsKLQl9Ci0KLQkvKgotCSAqIFRyYXZlcnNlIGFuZCBpbnRlcnByZXRlIHRoZSBHZXRNZXRhZGF0YSBPTUVsZW1lbnQgZm9yIERpYWxlY3QgZWxlbWVudAotCSAqIHRoYXQgc3BlY2lmaWVkIGluIHRoZSByZXF1ZXN0LiBAcmV0dXJucyBhIExpc3Qgd2l0aCBEaWFsZWN0KHMpIG9mCi0JICogbWV0YWRhdGEgcmVxdWVzdGVkLgotCSAqIAotCSAqLwotCXByaXZhdGUgTGlzdCBkZXRlcm1pbmVNZXRhZGF0YVR5cGVzKE9NRWxlbWVudCBhUmVxKSB7Ci0JCUxpc3QgbWV0YWRhdGFfcmVxdWVzdF9saXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCWJvb2xlYW4gYWxsVHlwZXMgPSBmYWxzZTsKLQotCQlPTUVsZW1lbnQgZGlhbGVjdCA9IGFSZXEuZ2V0Rmlyc3RDaGlsZFdpdGhOYW1lKG5ldyBRTmFtZShtZXhOYW1lc3BhY2VWYWx1ZSwKLQkJCQlNZXhDb25zdGFudHMuU1BFQy5ESUFMRUNUKSk7Ci0JCWlmIChkaWFsZWN0ICE9IG51bGwpIHsKLQkJCVN0cmluZyBkaWFsZWN0VGV4dCA9IGRpYWxlY3QuZ2V0VGV4dCgpOwotCQkJaWYgKGRpYWxlY3RUZXh0ICE9IG51bGwgJiYgZGlhbGVjdFRleHQubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJbWV0YWRhdGFfcmVxdWVzdF9saXN0LmFkZChkaWFsZWN0VGV4dC50cmltKCkpOwotCQkJfSBlbHNlIHsKLQkJCQlhbGxUeXBlcyA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0JCX0gZWxzZSB7Ci0JCQlhbGxUeXBlcyA9IHRydWU7Ci0gICAgICAgIH0KLQotCQlpZiAoYWxsVHlwZXMpIHsgLy8gcmV0cmlldmUgYWxsIG1ldGFkYXRhCi0JCQltZXRhZGF0YV9yZXF1ZXN0X2xpc3QuYWRkKE1leENvbnN0YW50cy5TUEVDLkRJQUxFQ1RfVFlQRV9QT0xJQ1kpOwotCQkJbWV0YWRhdGFfcmVxdWVzdF9saXN0LmFkZChNZXhDb25zdGFudHMuU1BFQy5ESUFMRUNUX1RZUEVfU0NIRU1BKTsKLQkJCW1ldGFkYXRhX3JlcXVlc3RfbGlzdC5hZGQoTWV4Q29uc3RhbnRzLlNQRUMuRElBTEVDVF9UWVBFX1dTREwpOwotCQl9Ci0JCXJldHVybiBtZXRhZGF0YV9yZXF1ZXN0X2xpc3Q7Ci0JfQotCi0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tfTUVYX2Rpc2FibGVkIChQYXJhbWV0ZXIgbWV4Q29uZmlnKSB0aHJvd3MgTWV4RGlzYWJsZWRFeGNlcHRpb257Ci0gICAgICAgIGlmIChNZXhVdGlsLmlzTWV4RGlzYWJsZWQobWV4Q29uZmlnKSl7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTWV4RGlzYWJsZWRFeGNlcHRpb24oIidtZXRhZGF0YWV4Y2hhbmdlJyBwYXJhbWV0ZXIgY29uZmlndXJlZCB0byBkaXNhYmxlIE1FWCBmb3IgdGhlIHNlcnZpY2UuIik7Ci0gICAgICAgIH0KLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV4L3NyYy9vcmcvYXBhY2hlL2F4aXMyL21leC9vbS9BbnlVUklUeXBlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9tZXgvc3JjL29yZy9hcGFjaGUvYXhpczIvbWV4L29tL0FueVVSSVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVjNzE3NS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXgvc3JjL29yZy9hcGFjaGUvYXhpczIvbWV4L29tL0FueVVSSVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5tZXgub207Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIubWV4Lk1leENvbnN0YW50czsKLQotLyoqCi0gKiBCYXNlIENsYXNzIGltcGxlbWVudGVkIGZvciBlbGVtZW50KHMpIHRoYXQgb2YgdHlwZT0neHM6YW55VVJJJyBkZWZpbmVkIGluIAotICogdGhlIFdTLU1FWCBzcGVjLgotICoKLSAqLwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQW55VVJJVHlwZSBleHRlbmRzIE1leE9NIGltcGxlbWVudHMgSU1leE9NIHsKLSAgICBwcml2YXRlIFN0cmluZyB1cmkgPSBudWxsOwotCXByaXZhdGUgT01GYWN0b3J5IGRlZmF1bHRGYWN0b3J5OwotCQotCXByaXZhdGUgU3RyaW5nIG5hbWVzcGFjZVZhbHVlID0gbnVsbDsKLQkKLQlwdWJsaWMgQW55VVJJVHlwZShPTUZhY3RvcnkgZGVmYXVsdEZhY3RvcnksIFN0cmluZyBuYW1lc3BhY2VWYWx1ZSwgU3RyaW5nIHVyaSkgdGhyb3dzIE1leE9NRXhjZXB0aW9uIHsKLQkJaWYgKCFpc05hbWVzcGFjZVN1cHBvcnRlZChuYW1lc3BhY2VWYWx1ZSkpCi0JCQl0aHJvdyBuZXcgTWV4T01FeGNlcHRpb24gKCJVbnN1cHBvcnRlZCBuYW1lc3BhY2UiKTsKLQkJCi0JCXRoaXMuZGVmYXVsdEZhY3RvcnkgPSBkZWZhdWx0RmFjdG9yeTsKLQkJdGhpcy5uYW1lc3BhY2VWYWx1ZSA9IG5hbWVzcGFjZVZhbHVlOwotCQl0aGlzLnVyaSA9IHVyaTsKLQl9Ci0JCi0KLQkvKioKLQkgKiBDb252ZXJ0IG9iamVjdCBjb250ZW50IHRvIHRoZSBPTUVsZW1lbnQgcmVwcmVzZW50YXRpb24uCi0JICogQHJldHVybiBPTUVsZW1lbnQgcmVwcmVzZW50YXRpb24gb2Ygc3ViLWNsYXNzIG9mIEFueVVSSVR5cGUuCi0JICogQHRocm93cyBNZXhPTUV4Y2VwdGlvbgotCSAqLwotCQotCXB1YmxpYyBPTUVsZW1lbnQgdG9PTSgpIHRocm93cyBNZXhPTUV4Y2VwdGlvbiB7Ci0JCWlmICh1cmkgPT0gbnVsbCB8fCB1cmkgPT0gIiIpIHsKLQkJCXRocm93IG5ldyBNZXhPTUV4Y2VwdGlvbigiRXhwZWN0ZWQgVVJJIHR5cGUgaXMgbm90IHNldCAuLiAiKTsKLQkJfQotCQkJCi0JCU9NTmFtZXNwYWNlIG1leE5hbWVzcGFjZSA9IGRlZmF1bHRGYWN0b3J5LmNyZWF0ZU9NTmFtZXNwYWNlKG5hbWVzcGFjZVZhbHVlLE1leENvbnN0YW50cy5TUEVDLk5TX1BSRUZJWCk7Ci0JCU9NRWxlbWVudCAgZWxlbWVudCA9IGRlZmF1bHRGYWN0b3J5LmNyZWF0ZU9NRWxlbWVudChnZXRFbGVtZW50TmFtZSgpLCBtZXhOYW1lc3BhY2UpOwkKLQkJZWxlbWVudC5zZXRUZXh0KHVyaSk7Ci0JCXJldHVybiBlbGVtZW50OwotCX0KLQkKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVUkkoU3RyaW5nIHVyaSl7Ci0JICAgICB0aGlzLnVyaSA9IHVyaTsJCi0JfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VVJJKCl7Ci0JICAgcmV0dXJuIHVyaTsJCi0JfQotCS8qCi0JICogQ2hpbGQgY2xhc3MgbXVzdCBpbXBsZW1lbnQgdG8gYW5zd2VyIHRoZSBlbGVtZW50IG5hbWUuCi0JICovCi0gIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0RWxlbWVudE5hbWUoKTsKLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL21leC9zcmMvb3JnL2FwYWNoZS9heGlzMi9tZXgvb20vRGlhbGVjdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV4L3NyYy9vcmcvYXBhY2hlL2F4aXMyL21leC9vbS9EaWFsZWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3MTUzNTEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvbWV4L3NyYy9vcmcvYXBhY2hlL2F4aXMyL21leC9vbS9EaWFsZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIubWV4Lm9tOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5tZXguTWV4Q29uc3RhbnRzOwotCi0vKioKLSAqIENsYXNzIGltcGxlbWVudGVkIGZvciBEaWFsZWN0IGVsZW1lbnQgZGVmaW5lZCBpbiAKLSAqIHRoZSBXUy1NRVggc3BlYy4KLSAqCi0gKi8KLQotcHVibGljIGNsYXNzIERpYWxlY3QgZXh0ZW5kcyBBbnlVUklUeXBlIHsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yCi0JICogQHBhcmFtIGRlZmF1bHRGYWN0b3J5Ci0JICogQHBhcmFtIG5hbWVzcGFjZVZhbHVlIG5hbWVzcGFjZSBpbmZvCi0JICogQHBhcmFtIGRpYWxlY3QgRGlhbGVjdCBpbiBVUkkgcmVwcmVzZW50YXRpb24KLQkgKiBAdGhyb3dzIE1leE9NRXhjZXB0aW9uCi0JICovCi0JcHVibGljIERpYWxlY3QoT01GYWN0b3J5IGRlZmF1bHRGYWN0b3J5LCBTdHJpbmcgbmFtZXNwYWNlVmFsdWUsIFN0cmluZyBkaWFsZWN0KSB0aHJvd3MgTWV4T01FeGNlcHRpb24gewotCQlzdXBlcihkZWZhdWx0RmFjdG9yeSwgbmFtZXNwYWNlVmFsdWUsIGRpYWxlY3QpOwotCX0KLQkKLQkvKioKLQkgKiBDb25zdHJ1Y3RvciB3aXRoIGRlZmF1bHQgbmFtZXNwYWNlCi0JICogQHBhcmFtIGRlZmF1bHRGYWN0b3J5Ci0JICogQHBhcmFtIGRpYWxlY3QgIERpYWxlY3QgaW4gVVJJIHJlcHJlc2VudGF0aW9uCi0JICogQHRocm93cyBNZXhPTUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBEaWFsZWN0KE9NRmFjdG9yeSBkZWZhdWx0RmFjdG9yeSwgU3RyaW5nIGRpYWxlY3QpIHRocm93cyBNZXhPTUV4Y2VwdGlvbiB7Ci0JCXN1cGVyKGRlZmF1bHRGYWN0b3J5LCBNZXhDb25zdGFudHMuU3BlY18yMDA0XzA5Lk5TX1VSSSwgZGlhbGVjdCApOwotCX0KLQotCS8qCi0JICogUmV0dXJuIG5hbWUgb2YgdGhpcyBlbGVtZW50Ci0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5NZXguT00uQW55VVJJVHlwZSNnZXRFbGVtZW50TmFtZSgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRFbGVtZW50TmFtZSgpewotCQlyZXR1cm4gTWV4Q29uc3RhbnRzLlNQRUMuRElBTEVDVDsKLQl9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9tZXgvc3JjL29yZy9hcGFjaGUvYXhpczIvbWV4L29tL0lNZXhPTS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV4L3NyYy9vcmcvYXBhY2hlL2F4aXMyL21leC9vbS9JTWV4T00uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZhZTdiZi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXgvc3JjL29yZy9hcGFjaGUvYXhpczIvbWV4L29tL0lNZXhPTS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLm1leC5vbTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotCi0vKioKLSAqIEJhc2UgaW50ZXJmYWNlIGZvciBvYmplY3RzIGltcGxlbWVudGVkIGZvciBlbGVtZW50cyBkZWZpbmVkIGluIAotICogdGhlIFdTLU1FWCBzcGVjLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNZXhPTSB7Ci0gICAgcHVibGljIE9NRWxlbWVudCB0b09NKCkgdGhyb3dzIE1leE9NRXhjZXB0aW9uOwotICAgCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VWYWx1ZSgpOwotCi0gICAgcHVibGljIGJvb2xlYW4gaXNOYW1lc3BhY2VTdXBwb3J0ZWQgKFN0cmluZyBuYW1lc3BhY2VOYW1lKTsKLX0KLQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV4L3NyYy9vcmcvYXBhY2hlL2F4aXMyL21leC9vbS9JZGVudGlmaWVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9tZXgvc3JjL29yZy9hcGFjaGUvYXhpczIvbWV4L29tL0lkZW50aWZpZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDlhYjQ3OC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXgvc3JjL29yZy9hcGFjaGUvYXhpczIvbWV4L29tL0lkZW50aWZpZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5tZXgub207Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLm1leC5NZXhDb25zdGFudHM7Ci0KLS8qKgotICogQ2xhc3MgaW1wbGVtZW50ZWQgZm9yIElkZW50aWZpZXIgZWxlbWVudCBkZWZpbmVkIGluIAotICogdGhlIFdTLU1FWCBzcGVjLgotICoKLSAqLwotCi1wdWJsaWMgY2xhc3MgSWRlbnRpZmllciBleHRlbmRzIEFueVVSSVR5cGUgewotCi0JcHVibGljIElkZW50aWZpZXIoT01GYWN0b3J5IGRlZmF1bHRGYWN0b3J5LCBTdHJpbmcgbmFtZXNwYWNlVmFsdWUsIFN0cmluZyB1cmkpIHRocm93cyBNZXhPTUV4Y2VwdGlvbiB7Ci0JCXN1cGVyKGRlZmF1bHRGYWN0b3J5LCBuYW1lc3BhY2VWYWx1ZSwgdXJpKTsKLQl9Ci0JcHVibGljIElkZW50aWZpZXIoT01GYWN0b3J5IGRlZmF1bHRGYWN0b3J5LCBTdHJpbmcgdXJpKSB0aHJvd3MgTWV4T01FeGNlcHRpb24gewotCQlzdXBlcihkZWZhdWx0RmFjdG9yeSwgTWV4Q29uc3RhbnRzLlNwZWNfMjAwNF8wOS5OU19VUkksIHVyaSApOwotCX0KLQotCS8qCi0JICogUmV0dXJuIG5hbWUgb2YgdGhpcyBlbGVtZW50Ci0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5NZXguT00uQW55VVJJVHlwZSNnZXRFbGVtZW50TmFtZSgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRFbGVtZW50TmFtZSgpewotCQlyZXR1cm4gTWV4Q29uc3RhbnRzLlNQRUMuSURFTlRJRklFUjsKLQl9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9tZXgvc3JjL29yZy9hcGFjaGUvYXhpczIvbWV4L29tL0xvY2F0aW9uLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9tZXgvc3JjL29yZy9hcGFjaGUvYXhpczIvbWV4L29tL0xvY2F0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4NWE5MmYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvbWV4L3NyYy9vcmcvYXBhY2hlL2F4aXMyL21leC9vbS9Mb2NhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLm1leC5vbTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQMTJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5tZXguTWV4Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIubWV4Lk1leEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLm1leC51dGlsLk1leFV0aWw7Ci0KLS8qKgotICogQ2xhc3MgaW1wbGVtZW50ZWQgZm9yIExvY2F0aW9uIGVsZW1lbnQgZGVmaW5lZCBpbiAKLSAqIHRoZSBXUy1NRVggc3BlYy4KLSAqCi0gKi8KLQotcHVibGljIGNsYXNzIExvY2F0aW9uIGV4dGVuZHMgQW55VVJJVHlwZSB7Ci0KLQkKLQkvKioKLQkgKiBAcGFyYW0gdXJpICB2YWxpZCBVUkwgdG8gcmV0cmlldmUgdGhlIG1ldGFkYXRhIHVzaW5nIEhUVFAgR2V0Ci0JICogQHRocm93cyBNZXhFeGNlcHRpb24gCi0gICAgICAgICAqCi0JICovCi0JcHVibGljIExvY2F0aW9uKFN0cmluZyB1cmkpIHRocm93cyBNZXhFeGNlcHRpb24gewotCQlzdXBlcihNZXhVdGlsLmdldFNPQVBGYWN0b3J5KFNPQVAxMkNvbnN0YW50cy5TT0FQX0VOVkVMT1BFX05BTUVTUEFDRV9VUkkpLCBNZXhDb25zdGFudHMuU3BlY18yMDA0XzA5Lk5TX1VSSSwgdXJpKTsKLQl9Ci0JCi0JcHVibGljIExvY2F0aW9uKE9NRmFjdG9yeSBkZWZhdWx0RmFjdG9yeSwgU3RyaW5nIG5hbWVzcGFjZVZhbHVlLCBTdHJpbmcgdXJpKSB0aHJvd3MgTWV4T01FeGNlcHRpb24gewotCQlzdXBlcihkZWZhdWx0RmFjdG9yeSwgbmFtZXNwYWNlVmFsdWUsIHVyaSk7Ci0JfQotCi0JcHVibGljIExvY2F0aW9uKE9NRmFjdG9yeSBkZWZhdWx0RmFjdG9yeSwgU3RyaW5nIHVyaSkgdGhyb3dzIE1leE9NRXhjZXB0aW9uIHsKLQkJc3VwZXIoZGVmYXVsdEZhY3RvcnksIE1leENvbnN0YW50cy5TcGVjXzIwMDRfMDkuTlNfVVJJLCB1cmkgKTsKLQl9Ci0JCi0JcHVibGljIExvY2F0aW9uIGZyb21PTShPTUVsZW1lbnQgZWxlbWVudCkgdGhyb3dzIE1leE9NRXhjZXB0aW9uewotCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTWV4T01FeGNlcHRpb24oIk51bGwgZWxlbWVudCBwYXNzZWQuIik7Ci0JCX0KLQkJaWYgKCFlbGVtZW50LmdldExvY2FsTmFtZSgpLmVxdWFscyhNZXhDb25zdGFudHMuU1BFQy5MT0NBVElPTikpIHsKLQkJCXRocm93IG5ldyBNZXhPTUV4Y2VwdGlvbigiSW52YWxpZCBlbGVtZW50IHBhc3NlZC4iKTsKLQkJfQotCQlzdXBlci5zZXRVUkkoZWxlbWVudC5nZXRUZXh0KCkpOwotCQkJCi0JCXJldHVybiB0aGlzOwotCX0KLQkKLQkvKgotCSAqIFJldHVybiBuYW1lIG9mIHRoaXMgZWxlbWVudAotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuTWV4Lk9NLkFueVVSSVR5cGUjZ2V0RWxlbWVudE5hbWUoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RWxlbWVudE5hbWUoKXsKLQkJcmV0dXJuIE1leENvbnN0YW50cy5TUEVDLkxPQ0FUSU9OOwotCX0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL21leC9zcmMvb3JnL2FwYWNoZS9heGlzMi9tZXgvb20vTWV0YWRhdGEuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL21leC9zcmMvb3JnL2FwYWNoZS9heGlzMi9tZXgvb20vTWV0YWRhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDUzOTE0Mi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXgvc3JjL29yZy9hcGFjaGUvYXhpczIvbWV4L29tL01ldGFkYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLm1leC5vbTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUDEyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhcmV0cmlldmFsLk91dHB1dEZvcm07Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5tZXguTWV4Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIubWV4Lk1leEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLm1leC51dGlsLk1leFV0aWw7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIAotICogQ2xhc3MgaW1wbGVtZW50aW5nICBtZXg6TWV0YWRhdGEgZWxlbWVudCAKLSAqCi0gKi8KLQotcHVibGljIGNsYXNzIE1ldGFkYXRhIGV4dGVuZHMgTWV4T00gaW1wbGVtZW50cyBJTWV4T00gewotCXByaXZhdGUgU3RyaW5nIG5hbWVzcGFjZVZhbHVlID0gbnVsbDsKLQlwcml2YXRlIE9NRmFjdG9yeSBmYWN0b3J5OwotCXByaXZhdGUgTGlzdCAgbWV0YWRhdGFTZWN0aW9ucyA9IG5ldyBBcnJheUxpc3QoKTsgCi0JcHJpdmF0ZSBPTUF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSBudWxsOwotCQotICAgICAgICAvKioKLQkgKiBDb25zdHJ1Y3RvcgotCSAqIEB0aHJvd3MgTWV4RXhjZXB0aW9uIAotCSAqLwotCi0JcHVibGljIE1ldGFkYXRhKCkgdGhyb3dzIE1leEV4Y2VwdGlvbiAgewotCQkKLQkJdGhpcy5mYWN0b3J5ID0gTWV4VXRpbC5nZXRTT0FQRmFjdG9yeShTT0FQMTJDb25zdGFudHMuU09BUF9FTlZFTE9QRV9OQU1FU1BBQ0VfVVJJKTs7Ci0JCXRoaXMubmFtZXNwYWNlVmFsdWUgPSBNZXhDb25zdGFudHMuU3BlY18yMDA0XzA5Lk5TX1VSSTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gZGVmYXVsdEZhY3RvcnkKLQkgKiBAcGFyYW0gbmFtZXNwYWNlVmFsdWUKLQkgKiBAdGhyb3dzIE1leE9NRXhjZXB0aW9uCi0JICovCi0KLQlwdWJsaWMgTWV0YWRhdGEoT01GYWN0b3J5IGRlZmF1bHRGYWN0b3J5LCBTdHJpbmcgbmFtZXNwYWNlVmFsdWUpIHRocm93cyBNZXhPTUV4Y2VwdGlvbiAgewotCQl0aGlzLmZhY3RvcnkgPSBkZWZhdWx0RmFjdG9yeTsKLQkJdGhpcy5uYW1lc3BhY2VWYWx1ZSA9IG5hbWVzcGFjZVZhbHVlOwotCX0KLQotICAgICAgICAvKioKLSAgICAgICAgICogCi0gICAgICAgICAqIEByZXR1cm4gQXJyYXkgb2YgTWV0YWRhdGFTZWN0aW9uIG9mIG1ldGFkYXRhIHVuaXRzCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgTWV0YWRhdGFTZWN0aW9uW10gZ2V0TWV0YWRhdFNlY3Rpb25zKCkgewotCQlyZXR1cm4gKE1ldGFkYXRhU2VjdGlvbltdKW1ldGFkYXRhU2VjdGlvbnMudG9BcnJheShuZXcgTWV0YWRhdGFTZWN0aW9uWzBdKTsKLQl9Ci0KLSAgICAgICAgIC8qKgotICAgICAqIAotICAgICAqIEBwYXJhbSBkaWFsZWN0Ci0gICAgICogQHBhcmFtIGlkZW50aWZpZXIKLSAgICAgKiBAcmV0dXJuIEFycmF5IG9mIE1ldGFkYXRhU2VjdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBkaWFsZWN0IG1ldGFkYXRhIHR5cGUgYW5kIGlkZW50aWZpZXIgIAotICAgICAqLwotICAgIHB1YmxpYyBNZXRhZGF0YVNlY3Rpb25bXSBnZXRNZXRhZGF0YVNlY3Rpb24oU3RyaW5nIGRpYWxlY3QsIFN0cmluZyBpZGVudGlmaWVyKXsKLSAgICAJTWV0YWRhdGFTZWN0aW9uW10gc2VjdGlvbnMgPSBnZXRNZXRhZGF0YVNlY3Rpb24oZGlhbGVjdCwgaWRlbnRpZmllciwgbnVsbCk7Ci0gICAgCXJldHVybiBzZWN0aW9uczsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQW5zd2VycyB0aGUgTWV0YWRhdGEgU2VjdGlvbnMgdGhhdCBtZXQgdGhlIGNyaXRlcmlhIHNwZWNpZmllZCBpbiB0aGUgZGlhbGVjdCwgaWRlbnRpZmllciwgYW5kIGZvcm0uCi0gICAgICogTm90ZTogTnVsbCB2YWx1ZSBwYXJhbWV0ZXIgd2lsbCBiZSB0cmVhdGVkIGFzIHdpbGQgY2FyZC4KLSAgICAgKiBAcGFyYW0gZGlhbGVjdAotICAgICAqIEBwYXJhbSBpZGVudGlmaWVyCi0gICAgICogQHBhcmFtIGZvcm0gc3BlY2lmeSB0aGUgZm9ybSBvZiBtZXRhZGF0YTogaW5saW5lIG9yIGJ5IHJlZmVyZW5jZQotICAgICAqICAgICAgICBTZWUgPGNvZGU+T3V0cHV0Rm9ybTwvY29kZT4gZm9yIHZhbGlkIG91dHB1dCBmb3Jtcy4KLSAgICAgKiBAcmV0dXJuIEFycmF5IG9mIE1ldGFkYXRhU2VjdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBkaWFsZWN0IG1ldGFkYXRhIHR5cGUgYW5kIGlkZW50aWZpZXIgb2YKLSAgICAgKiAgICAgICAgIHRoZSBmb3JtIHNwZWNpZmllZC4KLSAgICAgKgotICAgICAqLwotICAgIHB1YmxpYyBNZXRhZGF0YVNlY3Rpb25bXSBnZXRNZXRhZGF0YVNlY3Rpb24oU3RyaW5nIGRpYWxlY3QsIFN0cmluZyBpZGVudGlmaWVyLCBPdXRwdXRGb3JtIGZvcm0gKXsKLSAgICAgICAgCi0gICAgCUl0ZXJhdG9yIHNlY3Rpb25zID0gbWV0YWRhdGFTZWN0aW9ucy5pdGVyYXRvcigpOwotICAgIAlMaXN0IGZvdW5kU2VjdGlvbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgCXdoaWxlIChzZWN0aW9ucy5oYXNOZXh0KCkpewotICAgIAkJTWV0YWRhdGFTZWN0aW9uIGFTZWN0aW9uID0gKE1ldGFkYXRhU2VjdGlvbikgc2VjdGlvbnMubmV4dCgpOwotICAgIAkJaWYgKChkaWFsZWN0ID09IG51bGwgfHwgZGlhbGVjdC5lcXVhbHMoYVNlY3Rpb24uZ2V0RGlhbGVjdCgpKSkgJiYKLSAgICAJCQkoaWRlbnRpZmllciA9PSBudWxsIHx8IGRpYWxlY3QuZXF1YWxzKGFTZWN0aW9uLmdldElkZW50aWZpZXIoKSkpICYmCi0gICAgCQkJbWF0Y2hPdXRwdXRGb3JtKGFTZWN0aW9uLCBmb3JtKSl7Ci0gICAgCQkJZm91bmRTZWN0aW9ucy5hZGQoYVNlY3Rpb24pOwotICAgIAkJfQkKLSAgICAJCQotICAgIAl9Ci0gICAgCXJldHVybiAoTWV0YWRhdGFTZWN0aW9uW10pZm91bmRTZWN0aW9ucy50b0FycmF5KG5ldyBNZXRhZGF0YVNlY3Rpb25bMF0pOwotICAgIH0KLSAgICAKLSAgICAvKioKLQkgKiBQb3B1bGF0ZXMgYW4gTWV0YWRhdGEgb2JqZWN0IGJhc2VkIG9uIHRoZSA8Y29kZT5PTUVsZW1lbnQ8L2NvZGU+IHBhc3NlZC4gCi0JICogQHBhcmFtIGluRWxlbWVudCBtZXg6TWV0YWRhdGEgZWxlbWVudCBvciBlbGVtZW50IGNvbnRhaW5zIG1leDpNZXRhZGF0YSBlbGVtZW50Ci0JICogQHJldHVybiBNZXRhZGF0YSAKLQkgKiBAdGhyb3dzIE1leE9NRXhjZXB0aW9uCi0JICovCi0JcHVibGljIE1ldGFkYXRhIGZyb21PTShPTUVsZW1lbnQgaW5FbGVtZW50KSB0aHJvd3MgTWV4T01FeGNlcHRpb24gewotCQkJCi0JCU9NRWxlbWVudCBtZXhFbGVtZW50ID0gbnVsbDsKLSAgICAgICAgaWYgKGluRWxlbWVudCA9PSBudWxsICl7Ci0gICAgICAgIAl0aHJvdyBuZXcgTWV4T01FeGNlcHRpb24oIk51bGwgZWxlbWVudCBwYXNzZWQuIik7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmIChpbkVsZW1lbnQuZ2V0TG9jYWxOYW1lKCkuZXF1YWxzKE1leENvbnN0YW50cy5TUEVDLk1FVEFEQVRBKSl7Ci0gICAgICAgIAltZXhFbGVtZW50ID0gaW5FbGVtZW50OwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbkVsZW1lbnQuZ2V0TG9jYWxOYW1lKCkuZXF1YWxzKCJFbmRwb2ludFJlZmVyZW5jZSIpKXsKLSAgICAgICAgICAgIHRyeSB7Ci0JICAgIAkgIEVuZHBvaW50UmVmZXJlbmNlIGVwciA9IEVuZHBvaW50UmVmZXJlbmNlSGVscGVyLmZyb21PTShpbkVsZW1lbnQpOwotCQkJCQotCQkgIEFycmF5TGlzdCBtZXRhZGF0YSA9IGVwci5nZXRNZXRhRGF0YSgpOwotCQkgIGlmIChtZXRhZGF0YSAhPSBudWxsKQotCQkgICAgICBtZXhFbGVtZW50ID0gKE9NRWxlbWVudCltZXRhZGF0YS5nZXQoMCk7Ci0JCSAgZWxzZSB7Ci0JCSAgICAgIEFycmF5TGlzdCByZWZQYXJtID0gZXByLmdldEV4dGVuc2libGVFbGVtZW50cygpOwotCQkgICAgICBmb3IgKGludCBpPTA7IGk8cmVmUGFybS5zaXplKCk7IGkrKyl7Ci0JCSAgICAgICAgICBPTUVsZW1lbnQgZWxlbSA9IChPTUVsZW1lbnQpcmVmUGFybS5nZXQoaSk7Ci0JCQkgIGlmIChlbGVtLmdldExvY2FsTmFtZSgpLmVxdWFscyhNZXhDb25zdGFudHMuU1BFQy5NRVRBREFUQSkpewotCQkJICAgICAgbWV4RWxlbWVudCA9IGVsZW07Ci0JCQkgICAgICBicmVhazsKLQkJCSAgIH0KLQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoQXhpc0ZhdWx0IGUpIHsKLQkJICAgdGhyb3cgbmV3IE1leE9NRXhjZXB0aW9uKGUpOwotCQl9Ci0gICAgICAgIAkKLQkgICAgICAgIGlmIChtZXhFbGVtZW50ID09IG51bGwpIHsKLQkJICAgIHRocm93IG5ldyBNZXhPTUV4Y2VwdGlvbigiTWlzc2luZyBleHBlY3RlZCBNZXRhZGF0YSBlbGVtZW50IGluIGVsZW1lbnQgcGFzc2VkLiIpOwotCQl9Ci0JICAgfQotICAgICAgICAgIGVsc2UgbWV4RWxlbWVudCA9IGluRWxlbWVudDsKLSAgICAgICAgCi0JICBPTUZhY3RvcnkgYUZhY3RvcnkgPSBtZXhFbGVtZW50LmdldE9NRmFjdG9yeSgpOwotCSAgaWYgKGFGYWN0b3J5ID09IG51bGwpIHsKLQkgICAgIGFGYWN0b3J5ID0gZmFjdG9yeTsKLQkgICB9Ci0JICAgSXRlcmF0b3IgbWV4U2VjdGlvbnMgPSBtZXhFbGVtZW50LmdldENoaWxkcmVuV2l0aE5hbWUobmV3IFFOYW1lKG5hbWVzcGFjZVZhbHVlLCBNZXhDb25zdGFudHMuU1BFQy5NRVRBREFUQV9TRUNUSU9OKSk7Ci0gICAgICAgIAotICAgICAgICAgICBpZiAobWV4U2VjdGlvbnMgPT0gbnVsbCl7Ci0gICAgICAgICAJdGhyb3cgbmV3IE1leE9NRXhjZXB0aW9uKCJNZXRhZGF0YSBlbGVtZW50IGRvZXMgbm90IGNvbnRhaW4gTWV0YWRhdGFTZWN0aW9uIGVsZW1lbnQuIik7Ci0gICAgICAgICB9Ci0gICAgICAgIHdoaWxlIChtZXhTZWN0aW9ucy5oYXNOZXh0KCkpewotICAgICAgICAJT01FbGVtZW50IGFTZWN0aW9uID0gKE9NRWxlbWVudCkgbWV4U2VjdGlvbnMubmV4dCgpOwotICAgICAgICAgICAgTWV0YWRhdGFTZWN0aW9uIG1ldGFkYXRhU2VjdGlvbiA9IG5ldyBNZXRhZGF0YVNlY3Rpb24oYUZhY3RvcnksIG5hbWVzcGFjZVZhbHVlKTsKLSAgICAgICAgICAgIGFkZE1ldGFkYXRTZWN0aW9uKG1ldGFkYXRhU2VjdGlvbi5mcm9tT00oYVNlY3Rpb24pKTsgCi0gICAgICAgIH0KLSAgICAgICAgCi0JCXJldHVybiB0aGlzOwotCX0KLQkKLQkKLSAgICAgICAvKioKLSAgICAgICAgKiAKLSAgICAgICAgKiBAcmV0dXJuIEFycmF5IG9mIE1ldGFkYXRhU2VjdGlvbiBvZiBtZXRhZGF0YSB1bml0cwotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgT01FbGVtZW50IHRvT00oKSB0aHJvd3MgTWV4T01FeGNlcHRpb24KLQl7Ci0JCU9NTmFtZXNwYWNlIG1leE5hbWVzcGFjZSA9IGZhY3RvcnkuY3JlYXRlT01OYW1lc3BhY2UobmFtZXNwYWNlVmFsdWUsTWV4Q29uc3RhbnRzLlNQRUMuTlNfUFJFRklYKTsKLQkJT01FbGVtZW50IG1ldGFkYXRhID0gZmFjdG9yeS5jcmVhdGVPTUVsZW1lbnQoTWV4Q29uc3RhbnRzLlNQRUMuTUVUQURBVEEsIG1leE5hbWVzcGFjZSk7Ci0KLQkJSXRlcmF0b3Igc2VjdGlvbnMgPSBtZXRhZGF0YVNlY3Rpb25zLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChzZWN0aW9ucy5oYXNOZXh0KCkpIHsKLQkJCU1ldGFkYXRhU2VjdGlvbiBhU2VjdGlvbiA9IChNZXRhZGF0YVNlY3Rpb24pIHNlY3Rpb25zLm5leHQoKTsKLQkJCW1ldGFkYXRhLmFkZENoaWxkKGFTZWN0aW9uLnRvT00oKSk7Ci0JCX0KLQkJaWYgKGF0dHJpYnV0ZSAhPSBudWxsKXsKLQkJCW1ldGFkYXRhLmFkZEF0dHJpYnV0ZShhdHRyaWJ1dGUpOyAvLz8/PwotCQl9Ci0JCXJldHVybiBtZXRhZGF0YTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TWV0YWRhdFNlY3Rpb25zKExpc3QgaW5fbWV0YWRhdGFTZWN0aW9ucykgewotCQltZXRhZGF0YVNlY3Rpb25zID0gaW5fbWV0YWRhdGFTZWN0aW9uczsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYWRkTWV0YWRhdFNlY3Rpb25zKExpc3QgaW5fbWV0YWRhdGFTZWN0aW9ucykgewotCQlJdGVyYXRvciBzZWN0aW9ucyA9IGluX21ldGFkYXRhU2VjdGlvbnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKHNlY3Rpb25zLmhhc05leHQoKSkgewotCQkJYWRkTWV0YWRhdFNlY3Rpb24oKE1ldGFkYXRhU2VjdGlvbikgc2VjdGlvbnMubmV4dCgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGFkZE1ldGFkYXRTZWN0aW9uKE1ldGFkYXRhU2VjdGlvbiBzZWN0aW9uKSB7Ci0JCW1ldGFkYXRhU2VjdGlvbnMuYWRkKHNlY3Rpb24pOwotCX0KLQkKLSAgICAgICAJCi0JcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKE9NQXR0cmlidXRlIGluX2F0dHJpYnV0ZSkgewotCQlhdHRyaWJ1dGUgPSBpbl9hdHRyaWJ1dGU7Ci0JfQotCi0gIAotICAgIC8vIGNoZWNrIGlmIHNlY3Rpb24gY29udGFpbnMgZGF0YSBtYXRjaGluZyB0aGUgb3V0cHV0IGZvcm0gcmVxdWVzdGVkCi0gICAgcHJpdmF0ZSBib29sZWFuIG1hdGNoT3V0cHV0Rm9ybShNZXRhZGF0YVNlY3Rpb24gc2VjdGlvbiwKLQkJCU91dHB1dEZvcm0gb3V0cHV0Rm9ybSkgewotCQlib29sZWFuIG1hdGNoID0gKG91dHB1dEZvcm0gPT0gbnVsbCk7ICAvLyBubyBtYXRjaGluZyBuZWVkZWQgaW4gbnVsbCBvdXRwdXRGb3JtIGlzIHBhc3NlZAotCi0JCWlmICghbWF0Y2gpIHsKLQkJCWlmIChvdXRwdXRGb3JtID09IE91dHB1dEZvcm0uTE9DQVRJT05fRk9STSkgewotCQkJCW1hdGNoID0gKHNlY3Rpb24uZ2V0TG9jYXRpb24oKSAhPSBudWxsKTsKLQkJCX0gZWxzZSBpZiAob3V0cHV0Rm9ybSA9PSBPdXRwdXRGb3JtLlJFRkVSRU5DRV9GT1JNKSB7Ci0JCQkJbWF0Y2ggPSAoc2VjdGlvbi5nZXRNZXRhZGF0YVJlZmVyZW5jZSgpICE9IG51bGwpOwotCQkJfSBlbHNlIGlmIChvdXRwdXRGb3JtID09IE91dHB1dEZvcm0uSU5MSU5FX0ZPUk0pIHsKLQkJCQltYXRjaCA9IChzZWN0aW9uLmdldElubGluZURhdGEoKSAhPSBudWxsKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBtYXRjaDsKLQl9Ci0JCi0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL21leC9zcmMvb3JnL2FwYWNoZS9heGlzMi9tZXgvb20vTWV0YWRhdGFSZWZlcmVuY2UuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL21leC9zcmMvb3JnL2FwYWNoZS9heGlzMi9tZXgvb20vTWV0YWRhdGFSZWZlcmVuY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjYzNDA4Zi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXgvc3JjL29yZy9hcGFjaGUvYXhpczIvbWV4L29tL01ldGFkYXRhUmVmZXJlbmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLm1leC5vbTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQMTJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZUhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLm1leC5NZXhDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5tZXguTWV4RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIubWV4LnV0aWwuTWV4VXRpbDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLS8qKgotICogQ2xhc3MgaW1wbGVtZW50ZWQgZm9yIE1ldGFkYXRhUmVmZXJlbmNlIGVsZW1lbnQgZGVmaW5lZCBpbiAKLSAqIHRoZSBXUy1NZXRhZGF0YUV4Y2hhbmdlIHNwZWMuCi0gKgotICovCi0KLXB1YmxpYyBjbGFzcyBNZXRhZGF0YVJlZmVyZW5jZSBleHRlbmRzIE1leE9NIGltcGxlbWVudHMgSU1leE9NIHsKLQotCXByaXZhdGUgT01GYWN0b3J5IGZhY3Rvcnk7Ci0JcHJpdmF0ZSBPTUVsZW1lbnQgZXByRWxlbWVudCA9IG51bGw7IAotICAgICAgICBwcml2YXRlIEVuZHBvaW50UmVmZXJlbmNlIGVwciA9IG51bGw7Ci0gCXByaXZhdGUgU3RyaW5nIG5hbWVzcGFjZVZhbHVlID0gbnVsbDsKLQotCSAvKioKLQkgKiBDb25zdHJ1Y3RvcgotCSAqIEB0aHJvd3MgTWV4RXhjZXB0aW9uIAotCSAqLwotCi0JcHVibGljIE1ldGFkYXRhUmVmZXJlbmNlKCkgdGhyb3dzIE1leEV4Y2VwdGlvbiAgewotCQkKLQkJdGhpcy5mYWN0b3J5ID0gTWV4VXRpbC5nZXRTT0FQRmFjdG9yeShTT0FQMTJDb25zdGFudHMuU09BUF9FTlZFTE9QRV9OQU1FU1BBQ0VfVVJJKTsKLQkJdGhpcy5uYW1lc3BhY2VWYWx1ZSA9IE1leENvbnN0YW50cy5TcGVjXzIwMDRfMDkuTlNfVVJJOwotCX0KLQkKLQkvKioKLQkgKiBDb25zdHJ1Y3RvcgotCSAqIEBwYXJhbSBkZWZhdWx0RmFjdG9yeQotCSAqIEBwYXJhbSBuYW1lc3BhY2VWYWx1ZQotCSAqIEB0aHJvd3MgTWV4T01FeGNlcHRpb24KLQkgKi8KLQotCXB1YmxpYyBNZXRhZGF0YVJlZmVyZW5jZShPTUZhY3RvcnkgZGVmYXVsdEZhY3RvcnksIFN0cmluZyBuYW1lc3BhY2VWYWx1ZSkKLQkgdGhyb3dzIE1leE9NRXhjZXB0aW9uIHsKLQkJaWYgKCFpc05hbWVzcGFjZVN1cHBvcnRlZChuYW1lc3BhY2VWYWx1ZSkpCi0JCQl0aHJvdyBuZXcgTWV4T01FeGNlcHRpb24oIlVuc3VwcG9ydGVkIG5hbWVzcGFjZSIpOwotCi0JCXRoaXMuZmFjdG9yeSA9IGRlZmF1bHRGYWN0b3J5OwotCQl0aGlzLm5hbWVzcGFjZVZhbHVlID0gbmFtZXNwYWNlVmFsdWU7Ci0JCX0KLQotCSBwdWJsaWMgT01FbGVtZW50IGdldEVQUkVsZW1lbnQoKSB7Ci0JCQlyZXR1cm4gZXByRWxlbWVudDsKLQkJfQotCSAgCi0JcHVibGljIEVuZHBvaW50UmVmZXJlbmNlIGdldEVQUigpIHsKLQkJCXJldHVybiBlcHI7Ci0JfQotCi0KLQkvKioKLQkgKiBQb3B1bGF0ZXMgYW4gTWV0YWRhdGFSZWZlcmVuY2Ugb2JqZWN0IGJhc2VkIG9uIHRoZSBlbmRwb2ludCByZWZlcmVuY2UgdHlwZSA8Y29kZT5PTUVsZW1lbnQ8L2NvZGU+IHBhc3NlZC4gCi0JICogQHBhcmFtIGluRWxlbWVudCBNZXRhZGF0YVJlZmVyZW5jZSBlbGVtZW50Ci0JICogQHJldHVybiBNZXRhZGF0YVJlZmVyZW5jZSAKLQkgKiBAdGhyb3dzIE1leE9NRXhjZXB0aW9uCi0JICovCi0JCi0JcHVibGljIE1ldGFkYXRhUmVmZXJlbmNlIGZyb21PTShPTUVsZW1lbnQgZWxlbWVudCkgdGhyb3dzIE1leE9NRXhjZXB0aW9uewotCQkKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE1leE9NRXhjZXB0aW9uKCJOdWxsIGVsZW1lbnQgcGFzc2VkLiIpOwotCQl9Ci0JCWlmICghZWxlbWVudC5nZXRMb2NhbE5hbWUoKS5lcXVhbHMoTWV4Q29uc3RhbnRzLlNQRUMuTUVUQURBVEFfUkVGRVJFTkNFKSkgewotCQkJdGhyb3cgbmV3IE1leE9NRXhjZXB0aW9uKCJJbnZhbGlkIGVsZW1lbnQgcGFzc2VkLiIpOwotCQl9Ci0JCWVwckVsZW1lbnQgPSBlbGVtZW50OwotCQl0cnkgewotCQkJZXByID0gRW5kcG9pbnRSZWZlcmVuY2VIZWxwZXIuZnJvbU9NKGVsZW1lbnQpOwotCQl9IGNhdGNoIChBeGlzRmF1bHQgZSkgewotCQkJdGhyb3cgbmV3IE1leE9NRXhjZXB0aW9uIChlKTsKLQkJfQotCQkKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCS8qKgotCSAqIENvbnZlcnQgTWV0YWRhdFJlZmVyZW5jZSBvYmplY3QgY29udGVudCB0byB0aGUgT01FbGVtZW50IHJlcHJlc2VudGF0aW9uLgotCSAqIEByZXR1cm4gT01FbGVtZW50IHJlcHJlc2VudGF0aW9uIG9mIE1ldGFkYXRSZWZlcmVuY2UuCi0JICogQHRocm93cyBNZXhPTUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBPTUVsZW1lbnQgdG9PTSgpIHRocm93cyBNZXhPTUV4Y2VwdGlvbiB7Ci0JCWlmIChlcHJFbGVtZW50ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBNZXhPTUV4Y2VwdGlvbigKLQkJCQkJIk11c3QgaGF2ZSBFbmRwb2ludFJlZmVyZW5jZSBlbGVtZW50IGluIE1ldGFkYXRhUmVmZXJlbmNlIik7Ci0JCX0KLQotCQlPTUVsZW1lbnQgbWV0YWRhdGFSZWYgPSBudWxsOwotCQl0cnkgewotCQkJbWV0YWRhdGFSZWYgPSBFbmRwb2ludFJlZmVyZW5jZUhlbHBlci50b09NKGZhY3RvcnksIGVwciwgbmV3IFFOYW1lKAotCQkJCQluYW1lc3BhY2VWYWx1ZSwgTWV4Q29uc3RhbnRzLlNQRUMuTUVUQURBVEFfUkVGRVJFTkNFLAotCQkJCQlNZXhDb25zdGFudHMuU1BFQy5OU19QUkVGSVgpLCBlcHJFbGVtZW50LmdldE5hbWVzcGFjZSgpCi0JCQkJCS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0JCi0JCX0gY2F0Y2ggKEF4aXNGYXVsdCBlKSB7Ci0JCQl0aHJvdyBuZXcgTWV4T01FeGNlcHRpb24oZSk7Ci0JCX0KLQkJCi0KLQkJcmV0dXJuIG1ldGFkYXRhUmVmOwotCX0KLQkKLQkvKioKLQkgKiBTZXQgRVBSIAotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50IEVuZHBvaW50IFJlZmVyZW5jZSBUeXBlIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFUFIoT01FbGVtZW50IGVsZW1lbnQpIHRocm93cyBNZXhPTUV4Y2VwdGlvbiB7Ci0JCWVwckVsZW1lbnQgPSBlbGVtZW50OwotCQl0cnkgewotCQkJZXByID0gRW5kcG9pbnRSZWZlcmVuY2VIZWxwZXIuZnJvbU9NKGVwckVsZW1lbnQpOwotCQl9IGNhdGNoIChBeGlzRmF1bHQgZSkgewotCQkJdGhyb3cgbmV3IE1leE9NRXhjZXB0aW9uIChlKTsKLQkJfQotCQkKLQl9Ci0JCi0JLyoqCi0JICogU2V0IEVQUiAKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCBFbmRwb2ludCBSZWZlcmVuY2UgVHlwZSBlbGVtCi0JICovCi0JcHVibGljIHZvaWQgc2V0RVBSKEVuZHBvaW50UmVmZXJlbmNlIGVuZFJlZikgdGhyb3dzIE1leE9NRXhjZXB0aW9uIHsKLQkJZXByID0gZW5kUmVmOwotCQkKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9tZXgvc3JjL29yZy9hcGFjaGUvYXhpczIvbWV4L29tL01ldGFkYXRhU2VjdGlvbi5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV4L3NyYy9vcmcvYXBhY2hlL2F4aXMyL21leC9vbS9NZXRhZGF0YVNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjk3NmQ0OS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tZXgvc3JjL29yZy9hcGFjaGUvYXhpczIvbWV4L29tL01ldGFkYXRhU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5tZXgub207Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQXR0cmlidXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01OYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5vZGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVAxMkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLm1leC5NZXhDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5tZXguTWV4RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIubWV4LnV0aWwuTWV4VXRpbDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLQotLyoqCi0gKiBDbGFzcyBpbXBsZW1lbnRlZCBmb3IgTWV0YWRhdGFTZWN0aW9uIGVsZW1lbnQgZGVmaW5lZCBpbiAKLSAqIHRoZSBXUy1NRVggc3BlYy4gQSB1bml0IG9mIG1ldGRhdGEgaS5lLiBhIE1ldGFkYXRhU2VjdGlvbiBtYXkgYmUgaW5jbHVkZWQgaW4tbGluZSBkYXRhLCAKLSAqIG9yIG1heSBiZSBieSByZWZlcmVuY2UgYXMgYW4gZW5kcG9pbnQgcmVmZXJlbmNlIChNZXRhZGF0YVJlZmVyZW5jZSkgb3IgYSBVUkwgKExvY2F0aW9uKS4KLSAqIEFuIGluc3RhbmNlIG9mIE1ldGFkYXRhU2VjdGlvbiBjYW4gaGF2ZSBvbmUgZm9ybSBvZiBkYXRhOiBpbmxpbmUsIGxvY2F0aW9uLCBvciByZWZlcmVuY2UuCi0gKgotICovCi0KLXB1YmxpYyAgY2xhc3MgTWV0YWRhdGFTZWN0aW9uIGV4dGVuZHMgTWV4T00gaW1wbGVtZW50cyBJTWV4T00gewotCXByaXZhdGUgU3RyaW5nIG5hbWVzcGFjZVZhbHVlID0gbnVsbDsKLQlwcml2YXRlIE9NRmFjdG9yeSBmYWN0b3J5OwotCS8vIENob2ljZXMgb2YgY29udGVudDogaW5saW5lIG1ldGFkYXRhLCBNZXRhZGF0YVJlZmVyZW5jZSwgTG9jYXRpb24KLQlwcml2YXRlIFN0cmluZyBhbnlBdHRyaWJ1dGUgPSBudWxsOwotCXByaXZhdGUgT01Ob2RlIGlubGluZURhdGEgPSBudWxsOwotCS8vcHJpdmF0ZSBTdHJpbmcgaW5saW5lRGF0YSA9IG51bGw7Ci0JcHJpdmF0ZSBMb2NhdGlvbiBsb2NhdGlvbiA9IG51bGw7Ci0JcHJpdmF0ZSBNZXRhZGF0YVJlZmVyZW5jZSByZWYgPSBudWxsOwotCQotICAgIC8vIEF0dHJpYnV0ZXMKLSAgICBwcml2YXRlIFN0cmluZyBkaWFsZWN0OwotICAgIHByaXZhdGUgU3RyaW5nIGlkZW50aWZpZXI7Ci0gICAgCi0gICAgCi0gICAgLyoqCi0JICogQ29uc3RydWN0b3IKLQkgKiBAdGhyb3dzIE1leEV4Y2VwdGlvbiAKLQkgKi8KLQotCXB1YmxpYyBNZXRhZGF0YVNlY3Rpb24oKSB0aHJvd3MgTWV4RXhjZXB0aW9uICB7Ci0JCQotCQl0aGlzLmZhY3RvcnkgPSBNZXhVdGlsLmdldFNPQVBGYWN0b3J5KFNPQVAxMkNvbnN0YW50cy5TT0FQX0VOVkVMT1BFX05BTUVTUEFDRV9VUkkpOzsKLQkJdGhpcy5uYW1lc3BhY2VWYWx1ZSA9IE1leENvbnN0YW50cy5TcGVjXzIwMDRfMDkuTlNfVVJJOwotCX0KLQkKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvcgotICAgICAqIEBwYXJhbSBkZWZhdWx0RmFjdG9yeQotICAgICAqIEBwYXJhbSBuYW1lc3BhY2VWYWx1ZQotICAgICAqIEB0aHJvd3MgTWV4T01FeGNlcHRpb24KLSAgICAgKi8KLQlwdWJsaWMgTWV0YWRhdGFTZWN0aW9uKE9NRmFjdG9yeSBkZWZhdWx0RmFjdG9yeSwgU3RyaW5nIG5hbWVzcGFjZVZhbHVlKSB0aHJvd3MgTWV4T01FeGNlcHRpb24gIHsKLQkJdGhpcy5mYWN0b3J5ID0gZGVmYXVsdEZhY3Rvcnk7Ci0JCXRoaXMubmFtZXNwYWNlVmFsdWUgPSBuYW1lc3BhY2VWYWx1ZTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogUG9wdWxhdGVzIGFuIE1ldGFkYXRhU2VjdGlvbiBvYmplY3QgYmFzZWQgb24gdGhlIDxjb2RlPk9NRWxlbWVudDwvY29kZT4gcGFzc2VkLiAKLQkgKiBAcGFyYW0gaW5FbGVtZW50IG1leDpNZXRhZGF0YVNlY3Rpb24gZWxlbWVudAotCSAqIEByZXR1cm4gTWV0YWRhdGFTZWN0aW9uIAotCSAqIEB0aHJvd3MgTWV4T01FeGNlcHRpb24KLQkgKi8KLQkKLQlwdWJsaWMgTWV0YWRhdGFTZWN0aW9uIGZyb21PTShPTUVsZW1lbnQgZWxlbWVudCkgdGhyb3dzIE1leE9NRXhjZXB0aW9uIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE1leE9NRXhjZXB0aW9uKCJOdWxsIGVsZW1lbnQgcGFzc2VkLiIpOwotCQl9Ci0JCWlmICghZWxlbWVudC5nZXRMb2NhbE5hbWUoKS5lcXVhbHMoTWV4Q29uc3RhbnRzLlNQRUMuTUVUQURBVEFfU0VDVElPTikpIHsKLQkJCXRocm93IG5ldyBNZXhPTUV4Y2VwdGlvbigiSW52YWxpZCBlbGVtZW50IHBhc3NlZC4iKTsKLQkJfQotCQlPTUF0dHJpYnV0ZSBkaWFsZWN0QXR0ciAgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShuZXcgUU5hbWUoTWV4Q29uc3RhbnRzLlNQRUMuRElBTEVDVCkpOwotCQlpZiAoZGlhbGVjdEF0dHIgPT0gbnVsbCl7Ci0JCQl0aHJvdyBuZXcgTWV4T01FeGNlcHRpb24oIk1pc3NpbmcgRGlhbGVjdCBBdHRyaWJ1dGUgaW4gTWV0YWRhdGFTZWN0aW9uLiIpOwotCQl9Ci0JCXNldERpYWxlY3QoZGlhbGVjdEF0dHIuZ2V0QXR0cmlidXRlVmFsdWUoKSk7Ci0JCU9NQXR0cmlidXRlIGlkZW50aWZpZXJBdHRyICA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKG5ldyBRTmFtZShNZXhDb25zdGFudHMuU1BFQy5JREVOVElGSUVSKSk7Ci0JCWlmIChpZGVudGlmaWVyQXR0ciAhPSBudWxsKXsKLQkJCXNldElkZW50aWZpZXIoaWRlbnRpZmllckF0dHIuZ2V0QXR0cmlidXRlVmFsdWUoKSk7CQkKLQkJfQotCQkvLyB2YWxpZGF0ZSBvbmUgb2YgdGhlIGZvbGxvd2luZyBlbGVtZW50IG11c3QgZXhpc3Q6IExvY2F0aW9uLCBNZXRhZGF0YVJlZmVyZW5jZSwgaW5saW5lIGRhdGEKLQkJT01FbGVtZW50IGxvY2F0aW9uRWxlbSA9IGVsZW1lbnQuZ2V0Rmlyc3RDaGlsZFdpdGhOYW1lKG5ldyBRTmFtZShuYW1lc3BhY2VWYWx1ZSwgTWV4Q29uc3RhbnRzLlNQRUMuTE9DQVRJT04pKTsKLQkJTG9jYXRpb24gbG9jYXRpb24gPSBudWxsOwotCQlNZXRhZGF0YVJlZmVyZW5jZSByZWYgPSBudWxsOwotCQkKLQkJaWYgKGxvY2F0aW9uRWxlbSAhPSBudWxsKXsKLQkJCWxvY2F0aW9uID0gbmV3IExvY2F0aW9uKGZhY3RvcnksIG5hbWVzcGFjZVZhbHVlKTsKLQkJICAgIHNldExvY2F0aW9uKGxvY2F0aW9uLmZyb21PTShsb2NhdGlvbkVsZW0pKTsJCi0JCX0KLQkJZWxzZSB7IC8vIGNoZWNrIGZvciBNZXRhZGF0YVJlZmVyZW5jZQotCQkJT01FbGVtZW50IHJlZkVsZW0gPSBlbGVtZW50LmdldEZpcnN0Q2hpbGRXaXRoTmFtZShuZXcgUU5hbWUobmFtZXNwYWNlVmFsdWUsIE1leENvbnN0YW50cy5TUEVDLk1FVEFEQVRBX1JFRkVSRU5DRSkpOwotCQkJaWYgKHJlZkVsZW0gIT0gbnVsbCApewotCQkJCXJlZiA9IG5ldyBNZXRhZGF0YVJlZmVyZW5jZShmYWN0b3J5LCBuYW1lc3BhY2VWYWx1ZSk7Ci0JCQkJc2V0TWV0YWRhdGFSZWZlcmVuY2UocmVmLmZyb21PTShyZWZFbGVtKSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGxvY2F0aW9uID09IG51bGwgJiYgcmVmID09IG51bGwpIHsgLy8gY2hlY2sgZm9yIGlubGluZSBjb250ZW50Ci0JCQlPTU5vZGUgaW5saW5lID0gZWxlbWVudC5nZXRGaXJzdE9NQ2hpbGQoKTsKLQkJICAgIGlmIChpbmxpbmUgIT0gbnVsbCkKLQkJICAgIAlzZXRpbmxpbmVEYXRhKGlubGluZSk7Ci0JCSAgICBlbHNlIHsKLQkJICAgIAl0aHJvdyBuZXcgTWV4T01FeGNlcHRpb24oIkludmFsaWQgZW1wdHkgTWV0YWRhdGFTZWN0aW9uLiIpOwotCQkgICAgfQotCQkgICAgCi0JCX0KLQotCQlyZXR1cm4gdGhpczsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVydCBNZXRhZGF0U2VjdGlvbiBjb250ZW50IHRvIHRoZSBPTUVsZW1lbnQgcmVwcmVzZW50YXRpb24uCi0JICogCi0JICogQHJldHVybiBPTUVsZW1lbnQgcmVwcmVzZW50YXRpb24gb2YgTWV0YWRhdGFTZWN0aW9uLgotCSAqIEB0aHJvd3MgTWV4T01FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgT01FbGVtZW50IHRvT00oKSB0aHJvd3MgTWV4T01FeGNlcHRpb24gewotCQlPTU5hbWVzcGFjZSBtZXhOYW1lc3BhY2UgPSBmYWN0b3J5LmNyZWF0ZU9NTmFtZXNwYWNlKG5hbWVzcGFjZVZhbHVlLAotCQkJCU1leENvbnN0YW50cy5TUEVDLk5TX1BSRUZJWCk7Ci0JCU9NRWxlbWVudCBtZXRhZGF0YVNlY3Rpb24gPSBmYWN0b3J5LmNyZWF0ZU9NRWxlbWVudCgKLQkJCQlNZXhDb25zdGFudHMuU1BFQy5NRVRBREFUQV9TRUNUSU9OLCBtZXhOYW1lc3BhY2UpOwotCi0JCS8vIGRpYWxldCBpcyByZXF1aXJlZAotCQlpZiAoZGlhbGVjdCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTWV4T01FeGNlcHRpb24oIkRpYWxldCB3YXMgbm90IHNldC4gRGlhbGV0IG11c3QgYmUgc2V0LiIpOwotCQl9Ci0JCU9NQXR0cmlidXRlIGRpYWxldEF0dHJpYiA9IGZhY3RvcnkuY3JlYXRlT01BdHRyaWJ1dGUoCi0JCQkJTWV4Q29uc3RhbnRzLlNQRUMuRElBTEVDVCwgbnVsbCwgZGlhbGVjdCk7Ci0KLQkJbWV0YWRhdGFTZWN0aW9uLmFkZEF0dHJpYnV0ZShkaWFsZXRBdHRyaWIpOwotCi0JCWlmIChpZGVudGlmaWVyICE9IG51bGwgJiYgaWRlbnRpZmllci50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQlPTUF0dHJpYnV0ZSBpZGVudGlmaWVyQXR0cmliID0gZmFjdG9yeS5jcmVhdGVPTUF0dHJpYnV0ZSgKLQkJCQkJTWV4Q29uc3RhbnRzLlNQRUMuSURFTlRJRklFUiwgbnVsbCwgaWRlbnRpZmllcik7Ci0KLQkJCW1ldGFkYXRhU2VjdGlvbi5hZGRBdHRyaWJ1dGUoaWRlbnRpZmllckF0dHJpYik7Ci0JCX0KLQkJaWYgKGFueUF0dHJpYnV0ZSAhPSBudWxsKSB7Ci0JCQlPTUF0dHJpYnV0ZSBhbnlBdHRyaWIgPSBmYWN0b3J5LmNyZWF0ZU9NQXR0cmlidXRlKCJBbnlBdHRyaWJ1dGUiLAotCQkJCQludWxsLCBhbnlBdHRyaWJ1dGUpOwotCi0JCQltZXRhZGF0YVNlY3Rpb24uYWRkQXR0cmlidXRlKGFueUF0dHJpYik7Ci0JCX0KLQotCQlpZiAoaW5saW5lRGF0YSAhPSBudWxsKSB7Ci0JCQltZXRhZGF0YVNlY3Rpb24uYWRkQ2hpbGQoaW5saW5lRGF0YSk7Ci0JCQkKLQkJfQotCi0JCWlmIChsb2NhdGlvbiAhPSBudWxsKSB7Ci0JCQltZXRhZGF0YVNlY3Rpb24uYWRkQ2hpbGQobG9jYXRpb24udG9PTSgpKTsKLQkJfQotCi0JCWlmIChyZWYgIT0gbnVsbCkgewotCQkJbWV0YWRhdGFTZWN0aW9uLmFkZENoaWxkKHJlZi50b09NKCkpOwotCQl9Ci0JCXJldHVybiBtZXRhZGF0YVNlY3Rpb247Ci0KLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXREaWFsZWN0KCkgewotCQlyZXR1cm4gZGlhbGVjdDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRJZGVudGlmaWVyKCkgewotCQlyZXR1cm4gaWRlbnRpZmllcjsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRhbnlBdHRyaWJ1dGUoKSB7Ci0JCXJldHVybiBhbnlBdHRyaWJ1dGU7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBtZXRhZGF0YSB1bml0IGluIFVSTCBmb3JtIGkuZS4gbWV4OkxvY2F0aW9uCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBMb2NhdGlvbiBnZXRMb2NhdGlvbigpIHsKLQkJcmV0dXJuIGxvY2F0aW9uOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gbWV0YWRhdGEgdW5pdCBpbiBpbmxpbmUgZm9ybSBzdWNoIGFzIFdTREwgZGVmaW5pdGlvbnMsIFhNTCBzY2hlbWEgZG9jdW1lbnQsIGV0Yy4KLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIE9NTm9kZSBnZXRJbmxpbmVEYXRhKCkgewotCQlyZXR1cm4gaW5saW5lRGF0YTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIG1ldGFkYXRhIHVuaXQgaW4gZW5kcG9pbnQgcmVmZXJlbmNlIGZvcm0gaS5lLiBtZXg6TWV0YWRhdGFSZWZlcmVuY2UuCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBNZXRhZGF0YVJlZmVyZW5jZSBnZXRNZXRhZGF0YVJlZmVyZW5jZSgpIHsKLQkJcmV0dXJuIHJlZjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0SWRlbnRpZmllcihTdHJpbmcgaW5faWRlbnRpZmllcikgewotCQlpZGVudGlmaWVyID1pbl9pZGVudGlmaWVyOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXREaWFsZWN0KFN0cmluZyBpbl9kaWFsZWN0KSB7Ci0JCWRpYWxlY3QgPSBpbl9kaWFsZWN0OwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCBzZXRMb2NhdGlvbihMb2NhdGlvbiBpbl9sb2NhdGlvbikgewotCQlsb2NhdGlvbiA9IGluX2xvY2F0aW9uOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRpbmxpbmVEYXRhKE9iamVjdCBpbl9pbmxpbmVEYXRhKSB7Ci0JCWlubGluZURhdGEgPSAoT01Ob2RlKWluX2lubGluZURhdGE7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldE1ldGFkYXRhUmVmZXJlbmNlKE1ldGFkYXRhUmVmZXJlbmNlIGluX3JlZikgewotCQlyZWYgPSBpbl9yZWY7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV4L3NyYy9vcmcvYXBhY2hlL2F4aXMyL21leC9vbS9NZXhPTS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV4L3NyYy9vcmcvYXBhY2hlL2F4aXMyL21leC9vbS9NZXhPTS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjA3ZjUzLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL21leC9zcmMvb3JnL2FwYWNoZS9heGlzMi9tZXgvb20vTWV4T00uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5tZXgub207Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLm1leC5NZXhDb25zdGFudHM7Ci0KLS8qKgotICogQmFzZSBjbGFzcyBmb3Igb2JqZWN0cyBpbXBsZW1lbnRlZCBmb3IgZWxlbWVudHMgZGVmaW5lZCBpbiAKLSAqIHRoZSBXUy1NRVggc3BlYy4KLSAqLwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTWV4T00gaW1wbGVtZW50cyBJTWV4T00gewotCi0JCi0JcHVibGljIE9NRWxlbWVudCB0b09NKCkgdGhyb3dzIE1leE9NRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVmFsdWUoKXsKLQkJcmV0dXJuIE1leENvbnN0YW50cy5TcGVjXzIwMDRfMDkuTlNfVVJJOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTmFtZXNwYWNlU3VwcG9ydGVkIChTdHJpbmcgbmFtZXNwYWNlTmFtZSkgewotCQlib29sZWFuIHN1cHBvcnRlZCA9IGZhbHNlOwotCQlzdXBwb3J0ZWQgPSBNZXhDb25zdGFudHMuU3BlY18yMDA0XzA5Lk5TX1VSSS5lcXVhbHMobmFtZXNwYWNlTmFtZSk7Ci0JCXJldHVybiBzdXBwb3J0ZWQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbWV4L3NyYy9vcmcvYXBhY2hlL2F4aXMyL21leC9vbS9NZXhPTUV4Y2VwdGlvbi5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvbWV4L3NyYy9vcmcvYXBhY2hlL2F4aXMyL21leC9vbS9NZXhPTUV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGIwNzg1Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL21leC9zcmMvb3JnL2FwYWNoZS9heGlzMi9tZXgvb20vTWV4T01FeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5tZXgub207Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5tZXguTWV4RXhjZXB0aW9uOwotLyoqCi0gKiBBbiBFeGNlcHRpb24gdG8gcmVwb3J0IHByb2JsZW0gZnJvbSBpbXBsZW1lbnRhdGlvbiBjbGFzc2VzIGZvciB0aGUgCi0gKiBXUy1NZXRhZGF0YUV4Y2hhbmdlIGRhdGEgZWxlbWVudHMuCi0gKgotICovCi1wdWJsaWMgY2xhc3MgTWV4T01FeGNlcHRpb24gZXh0ZW5kcyBNZXhFeGNlcHRpb24gewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCXByb3RlY3RlZCBNZXhPTUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgewotCQlzdXBlcihtZXNzYWdlKTsKLQl9Ci0JcHJvdGVjdGVkIE1leE9NRXhjZXB0aW9uKEV4Y2VwdGlvbiBlKSB7Ci0JCXN1cGVyKGUpOwotCX0KLQlwcm90ZWN0ZWQgTWV4T01FeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIEV4Y2VwdGlvbiBlKSB7Ci0JCXN1cGVyKG1lc3NhZ2UsIGUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL21leC9zcmMvb3JnL2FwYWNoZS9heGlzMi9tZXgvdXRpbC9NZXhVdGlsLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9tZXgvc3JjL29yZy9hcGFjaGUvYXhpczIvbWV4L3V0aWwvTWV4VXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzZkNTAxLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL21leC9zcmMvb3JnL2FwYWNoZS9heGlzMi9tZXgvdXRpbC9NZXhVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLm1leC51dGlsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuT01OYW1lc3BhY2VJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQMTFDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVAxMkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhcmV0cmlldmFsLk91dHB1dEZvcm07Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5QYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5tZXguTWV4Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIubWV4Lk1leEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLm1leC5vbS5NZXRhZGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotcHVibGljIGNsYXNzIE1leFV0aWwgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhNZXhVdGlsLmNsYXNzKTsKLQkvKioKLQkgKiBBbnN3ZXIgU09BUFZlcnNpb24gZm9yIHNwZWNpZmllZCBlbnZlbG9wZQotCSAqIEBwYXJhbSBlbnZlbG9wZSBTT0FQIEVudmVsb3BlCi0JICogQHJldHVybiB2ZXJzaW9uIG9mIFNPQVAKLQkgKiBAdGhyb3dzIE1leEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGdldFNPQVBWZXJzaW9uKFNPQVBFbnZlbG9wZSBlbnZlbG9wZSkgdGhyb3dzIE1leEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBuYW1lc3BhY2VOYW1lID0gZW52ZWxvcGUuZ2V0TmFtZXNwYWNlKCkuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0JCWlmIChuYW1lc3BhY2VOYW1lLmVxdWFscyhTT0FQMTFDb25zdGFudHMuU09BUF9FTlZFTE9QRV9OQU1FU1BBQ0VfVVJJKSkKLQkJCXJldHVybiBNZXhDb25zdGFudHMuU09BUFZlcnNpb24udjFfMTsKLQkJZWxzZSBpZiAobmFtZXNwYWNlTmFtZS5lcXVhbHMoU09BUDEyQ29uc3RhbnRzLlNPQVBfRU5WRUxPUEVfTkFNRVNQQUNFX1VSSSkpCi0JCQlyZXR1cm4gTWV4Q29uc3RhbnRzLlNPQVBWZXJzaW9uLnYxXzI7Ci0JCWVsc2UKLQkJCXRocm93IG5ldyBNZXhFeGNlcHRpb24oIlVua25vd24gU09BUCB2ZXJzaW9uIik7Ci0JfQotCi0JLyoqCi0JICogQW5zd2VyIFNPQVBGYWN0b3J5IGNvcnJlc3BvbmRpbmcgdG8gc3BlY2lmaWVkIFNPQVAgbmFtZXNwYWNlIFVSSQotCSAqIEBwYXJhbSBzb2FwTmFtZVNwYWNlVVJJIHNvYXAgbmFtZXNwYWNlIHVyaQotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIE1leEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU09BUEZhY3RvcnkgZ2V0U09BUEZhY3RvcnkoU3RyaW5nIHNvYXBOYW1lU3BhY2VVUkkpIHRocm93cyBNZXhFeGNlcHRpb24gewotCQkJaWYgKHNvYXBOYW1lU3BhY2VVUkkuZXF1YWxzKFNPQVAxMUNvbnN0YW50cy5TT0FQX0VOVkVMT1BFX05BTUVTUEFDRV9VUkkpKQotCQkJcmV0dXJuICBPTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTFGYWN0b3J5KCk7Ci0JCWVsc2UgaWYgKHNvYXBOYW1lU3BhY2VVUkkuZXF1YWxzKFNPQVAxMkNvbnN0YW50cy5TT0FQX0VOVkVMT1BFX05BTUVTUEFDRV9VUkkpKQotCQkJcmV0dXJuIE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMkZhY3RvcnkoKTsKLQkJZWxzZQotCQkJdGhyb3cgbmV3IE1leEV4Y2VwdGlvbigiVW5rbm93biBTT0FQIHNvYXBOYW1lU3BhY2VVUkkiKTsKLQl9Ci0KLQkvKioKLQkgKiBBbnN3ZXJzIFNPQVBGYWN0b3J5IGNvcnJlc3BvbmRpbmcgdG8gc3BlY2lmaWVkIFNPQVAgVmVyc2lvbgotCSAqIEBwYXJhbSBTT0FQVmVyc2lvbiBTT0FQIHZlcnNpb24KLQkgKiBAcmV0dXJuIFNPQVBGYWN0b3J5Ci0JICovCi0JcHVibGljIHN0YXRpYyBTT0FQRmFjdG9yeSBnZXRTT0FQRmFjdG9yeShpbnQgU09BUFZlcnNpb24pIHsKLQotCQlpZiAoU09BUFZlcnNpb24gPT0gTWV4Q29uc3RhbnRzLlNPQVBWZXJzaW9uLnYxXzEpCi0JCQlyZXR1cm4gT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDExRmFjdG9yeSgpOwotCQllbHNlCi0JCQlyZXR1cm4gT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDEyRmFjdG9yeSgpOwotCi0JfQotCQotCQotCS8vIFJldHVybiBhbGwgc3VwcG9ydGVkIG91dHB1dCBmb3JtcwotCXB1YmxpYyBzdGF0aWMgT3V0cHV0Rm9ybVtdIGFsbFN1cHBvcnRlZE91dHB1dEZvcm1zKCl7Ci0JCU91dHB1dEZvcm1bXW91dHB1dGZvcm1zID0gbmV3IE91dHB1dEZvcm1bXSB7Ci0JCU91dHB1dEZvcm0uSU5MSU5FX0ZPUk0sCi0JCU91dHB1dEZvcm0uTE9DQVRJT05fRk9STSwgCi0JCU91dHB1dEZvcm0uUkVGRVJFTkNFX0ZPUk19OwotCQlyZXR1cm4gb3V0cHV0Zm9ybXM7Ci0JfQotCQotCSBwdWJsaWMgc3RhdGljIE1ldGFkYXRhIGZyb21FUFIoRW5kcG9pbnRSZWZlcmVuY2UgZXByKSB0aHJvd3MgTWV4RXhjZXB0aW9uIHsKLQkJQXJyYXlMaXN0IGVwck1ldGRhdGEgPSBlcHIuZ2V0TWV0YURhdGEoKTsKLQkJT01FbGVtZW50IG1leEVsZW1lbnQgPSBudWxsOwotCQlNZXRhZGF0YSBtZXRhZGF0YSA9IG51bGw7Ci0JCWlmIChlcHJNZXRkYXRhICE9IG51bGwpIHsKLQkJCW1leEVsZW1lbnQgPSAoT01FbGVtZW50KSBlcHJNZXRkYXRhLmdldCgwKTsKLQkJfSBlbHNlIHsKLQkJCUFycmF5TGlzdCByZWZQYXJtID0gZXByLmdldEV4dGVuc2libGVFbGVtZW50cygpOwotCQkJaWYgKHJlZlBhcm0gIT0gbnVsbCkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVmUGFybS5zaXplKCk7IGkrKykgewotCQkJCQlPTUVsZW1lbnQgZWxlbSA9IChPTUVsZW1lbnQpIHJlZlBhcm0uZ2V0KGkpOwotCQkJCQlpZiAoZWxlbS5nZXRMb2NhbE5hbWUoKS5lcXVhbHMoTWV4Q29uc3RhbnRzLlNQRUMuTUVUQURBVEEpKSB7Ci0JCQkJCQltZXhFbGVtZW50ID0gZWxlbTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChtZXhFbGVtZW50ICE9IG51bGwpCi0JCQltZXRhZGF0YSA9IGZyb21PTShtZXhFbGVtZW50LCBNZXhDb25zdGFudHMuU3BlY18yMDA0XzA5Lk5TX1VSSSk7Ci0JCXJldHVybiBtZXRhZGF0YTsKLQl9CQotCSAKLQkvKioKLQkgKiBBbnN3ZXJzIFdTLUFkZHJlc3NpbmcgbmFtZXNwYWNlCi0JICogCi0JICogQHBhcmFtIHRvQWRkcmVzcwotCSAqICAgICAgICAgICAgVG8gQWRkcmVzcyBlbGVtZW50Ci0JICogQHJldHVybiBPTU5hbWVzcGFjZUltcGwgV1MtQWRkcmVzc2luZyBuYW1lc3BhY2UKLQkgKiBAdGhyb3dzIEF4aXNGYXVsdAotCSAqLwotCQotCSBwdWJsaWMgc3RhdGljIE9NTmFtZXNwYWNlSW1wbCBnZXRBZGRyZXNzaW5nTmFtZVNwYWNlKE9NRWxlbWVudCB0b0FkZHJlc3MpCi0JCQl0aHJvd3MgTWV4RXhjZXB0aW9uIHsKLQkJT01GYWN0b3J5IGZhY3RvcnkgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKTsKLQkJT01OYW1lc3BhY2VJbXBsIHdzYSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgcHJlZml4ID0gdG9BZGRyZXNzLmdldE5hbWVzcGFjZSgpLmdldFByZWZpeCgpOwotCQkJU3RyaW5nIG5zVVJJID0gdG9BZGRyZXNzLmdldE5hbWVzcGFjZSgpLmdldE5hbWVzcGFjZVVSSSgpOwotCQkJd3NhID0gKE9NTmFtZXNwYWNlSW1wbCkgZmFjdG9yeS5jcmVhdGVPTU5hbWVzcGFjZShuc1VSSSwgcHJlZml4KTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJICAgIHRocm93IG5ldyBNZXhFeGNlcHRpb24oZSk7Ci0JCX0KLQkJcmV0dXJuIHdzYTsKLQotCX0KLQotICAgICAgIC8qKgotCSAqIEFQSSB0byBtYXAgbWV4Ok1ldGFkYXRhIGVsZW1lbnQgdG8gYSBNZXRhZGF0YSBvYmplY3QgcmVwcmVzZW50YXRpb24uIERhdGEgdmFsaWRhdGlvbiB3aWxsIAotCSAqIGJlIHBlcmZvcm1lZCBvbiBvbUVsZW1lbnQgY29udGVudC4gU2VlIHtAbGluayBNZXRhZGF0YX0gZm9yIEFQSXMgdG8gYWNjZXNzIG1ldGFkYXRhIHNlY3Rpb24uCi0JICogCi0JICogQHBhcmFtIG9tRWxlbWVudCBhbiBlbGVtZW50IHN1Y2ggYXMgZW5kcG9pbnQgcmVmZXJlbmNlIHR5cGUgdGhhdCBjb250YWlucyBtZXg6TWV0YWRhdGEgb3IKLQkgKiAgICAgICAgICAgICAgICAgIGFuIG1leDpNZXRhZGF0YSBlbGVtZW50IAotCSAqIEByZXR1cm4gTWV0YWRhdGEgb2JqZWN0IHJlcHJlc2VudGF0aW9uIG9mIG1leDpNZXRhZGF0YSBlbGVtZW50IHBhc3NlZC4KLQkgKiBAdGhyb3dzIE1leEV4Y2VwdGlvbiBpZiBpbnZhbGlkIG1leDpNZXRhZGF0YSBlbGVtZW50IGNvbnRlbnQgaXMgZGV0ZWN0ZWQgCi0JICovIAotCi0JIAotICAgIHB1YmxpYyBzdGF0aWMgTWV0YWRhdGEgZnJvbU9NKE9NRWxlbWVudCBvbUVsZW1lbnQpIHRocm93cyBNZXhFeGNlcHRpb257Ci0JICAgICAgTWV0YWRhdGEgbWV0YWRhdGEgPSBmcm9tT00ob21FbGVtZW50LCBNZXhDb25zdGFudHMuU3BlY18yMDA0XzA5Lk5TX1VSSSk7Ci0JICAgICAgcmV0dXJuIG1ldGFkYXRhOwotCX0JCi0JCi0gICAgICAgIC8qKgotCSAqIEFQSSB0byBtYXAgbWV4Ok1ldGFkYXRhIGVsZW1lbnQgdG8gYSBNZXRhZGF0YSBvYmplY3QgcmVwcmVzZW50YXRpb24uIERhdGEgdmFsaWRhdGlvbiB3aWxsIAotCSAqIGJlIHBlcmZvcm1lZCBvbiBvbUVsZW1lbnQgY29udGVudC4gU2VlIHtAbGluayBNZXRhZGF0YX0gZm9yIEFQSXMgdG8gYWNjZXNzIG1ldGFkYXRhIHNlY3Rpb24uCi0JICogCi0JICogQHBhcmFtIG9tRWxlbWVudCBhbiBlbGVtZW50IHN1Y2ggYXMgZW5kcG9pbnQgcmVmZXJlbmNlIHR5cGUgdGhhdCBjb250YWlucyBtZXg6TWV0YWRhdGEgb3IKLQkgKiAgICAgICAgICAgICAgICAgIGFuIG1leDpNZXRhZGF0YSBlbGVtZW50IAotCSAqIEBwYXJhbSBtZXhOYW1lc3BhY2VWYWx1ZSAgdGhlIG5hbWVzcGFjZSBvZiB0aGUgV1MtTUVYIHNwZWMgdG8gY29tcGx5IHdpdGguCi0JICogQHJldHVybiBNZXRhZGF0YSBvYmplY3QgcmVwcmVzZW50YXRpb24gb2YgbWV4Ok1ldGFkYXRhIGVsZW1lbnQgcGFzc2VkLgotCSAqIEB0aHJvd3MgTWV4RXhjZXB0aW9uIGlmIGludmFsaWQgbWV4Ok1ldGFkYXRhIGVsZW1lbnQgY29udGVudCBpcyBkZXRlY3RlZCAKLQkgKi8gCQotCXB1YmxpYyBzdGF0aWMgTWV0YWRhdGEgZnJvbU9NKE9NRWxlbWVudCBvbUVsZW1lbnQsIFN0cmluZyBtZXhOYW1lc3BhY2VWYWx1ZSkgdGhyb3dzIE1leEV4Y2VwdGlvbnsKLQkJCi0JCVNPQVBGYWN0b3J5IGZhY3RvcnkgPSBNZXhVdGlsLmdldFNPQVBGYWN0b3J5KFNPQVAxMkNvbnN0YW50cy5TT0FQX0VOVkVMT1BFX05BTUVTUEFDRV9VUkkpOwotCQlNZXRhZGF0YSBtZXRhZGF0YSA9IG5ldyBNZXRhZGF0YShmYWN0b3J5LCBtZXhOYW1lc3BhY2VWYWx1ZSk7Ci0JCW1ldGFkYXRhID0gbWV0YWRhdGEuZnJvbU9NKG9tRWxlbWVudCk7Ci0JCXJldHVybiBtZXRhZGF0YTsKLQl9Ci0JCi0KLSAgICAgICAKLSAgICAvKioKLQkgKiBDaGVjayBpZiBtZXRhZGF0YSBleGNoYW5nZSBoYXMgYmVlbiBkaXNhYmxlZCBmb3IgYSBzZXJ2aWNlLiAKLQkgKiBAcGFyYW0gc2VydmljZUNvbmZpZ01FWFBhcm0gbWV0YWRhdGFleGNoYW5nZSBjb25maWd1cmVkIGluIHNlcnZpY2VzLnhtbAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNNZXhEaXNhYmxlZChQYXJhbWV0ZXIgc2VydmljZUNvbmZpZ01FWFBhcm0pIHsKLQkJYm9vbGVhbiBkaXNhYmxlZCA9IGZhbHNlOwotCQlpZiAoc2VydmljZUNvbmZpZ01FWFBhcm0gIT0gbnVsbCkgewotCQkJT01FbGVtZW50IG1leENvbmZpZyA9IHNlcnZpY2VDb25maWdNRVhQYXJtLmdldFBhcmFtZXRlckVsZW1lbnQoKTsKLQkJCVN0cmluZyBkaXNhYmxlID0gbWV4Q29uZmlnLmdldEF0dHJpYnV0ZVZhbHVlKG5ldyBRTmFtZSgKLQkJCQkJTWV4Q29uc3RhbnRzLk1FWF9DT05GSUcuRU5BQkxFX01FWCkpOwotCQkJaWYgKGRpc2FibGUgIT0gbnVsbCAmJiBkaXNhYmxlLmVxdWFscygiZmFsc2UiKSkKLQkJCQlkaXNhYmxlZCA9IHRydWU7Ci0JCX0KLQkJcmV0dXJuIGRpc2FibGVkOwotCX0KLQkKLQkvKioKLQkgKiBEZXRlcm1pbmUgb3V0cHV0IGZvcm1zIGZvciBzcGVjaWZpZWQgZGlhbGVjdCBiYXNlZCBvbiAibWV0YWRhdGFleGNoYW5nZSIgY29uZmlndXJlZCBpbiAKLQkgKiBheGlzMi54bWwgYW5kIHNlcnZpY2VzLnhtbC4KLQkgKiBUaGUgb3JkZXIgb2YgcHJlY2VkZW5jZSBpbiBkZXRlcm1pbmluZyAgb3V0cHV0IGZvcm0gY29uZmlndXJlZDogIAotCSAqICAgYS4gZGlhbGVjdCBzcGVjaWZpYyBhdCBzZXJ2aWNlIGxldmVsLgotCSAqICAgYi4gc2VydmljZSBsZXZlbCAgaS5lLiB3aXRob3V0IGRpYWxlY3QgYXR0cmlidXRlIHNwZWNpZmllZAotCSAqICAgYy4gZGlhbGVjdCBzcGVjaWZpYyBhdCBnbG9iYWwgbGV2ZWwgaSxlLCBjb25maWd1cmVkIGluIGF4aXMyLnhtbAotCSAqICAgZC4gc2VydmljZSBsZXZlbCAgaS5lLiB3aXRob3V0IGRpYWxlY3QgYXR0cmlidXRlIHNwZWNpZmllZAotCSAqICAgZS4gZGVmYXVsdCBvdXRwdXQgZm9ybXMgdG8gYWxsOiBpbmxpbmUsIGxvY2F0aW9uLCByZWZlcmVuY2UKLQkgKiAgIAotCSAqIEBwYXJhbSBkaWFsZWN0Ci0JICogQHBhcmFtIGF4aXNDb25maWdNRVhQYXJtICJtZXRhZGF0YWV4Y2hhbmdlIiBwYXJhbWV0ZXIgY29uZmlndXJlZCBpbiBheGlzMi54bWwKLQkgKiBAcGFyYW0gc2VydmljZUNvbmZpZ01FWFBhcm0gICJtZXRhZGF0YWV4Y2hhbmdlIiBwYXJhbWV0ZXIgY29uZmlndXJlZCBpbiBzZXJ2aWNlcy54bWwKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBPdXRwdXRGb3JtW10gZGV0ZXJtaW5lT3V0cHV0Rm9ybShTdHJpbmcgZGlhbGVjdCwgUGFyYW1ldGVyIGF4aXNDb25maWdNRVhQYXJtLCBQYXJhbWV0ZXIgc2VydmljZUNvbmZpZ01FWFBhcm0pewotCQkKLQkJaWYgKGF4aXNDb25maWdNRVhQYXJtID09IG51bGwgJiYgc2VydmljZUNvbmZpZ01FWFBhcm0gPT0gbnVsbCl7Ci0JCQlyZXR1cm4gYWxsU3VwcG9ydGVkT3V0cHV0Rm9ybXMoKTsKLQkJfQotCSAgICBPdXRwdXRGb3JtW10gb3V0cHV0Zm9ybSA9IG5ldyBPdXRwdXRGb3JtWzBdOwotCSAgICBvdXRwdXRmb3JtID0gZGV0ZXJtaW5lT3V0cHV0Rm9ybShkaWFsZWN0LCBzZXJ2aWNlQ29uZmlnTUVYUGFybSk7Ci0JICAgIAotCSAgICBpZiAob3V0cHV0Zm9ybS5sZW5ndGggPT0gMCkgeyAvLyBvdXRwdXQgZm9ybSBub3QgY29uZmlndXJlZCBpbiBzZXJ2aWNlIGxldmVsIGNvbmZpZwotCSAgICAJb3V0cHV0Zm9ybSA9IGRldGVybWluZU91dHB1dEZvcm0oZGlhbGVjdCwgYXhpc0NvbmZpZ01FWFBhcm0pOwotCSAgICB9Ci0JCQotCSAgICBpZiAob3V0cHV0Zm9ybS5sZW5ndGggPT0gMCl7Ci0JICAgIAlsb2cuZGVidWcoIk5vIG91dHB1dGZvcm0gY29uZmlndXJlZCwgdXNlIGRlZmF1bHQgb3V0cHV0IGZvcm1zIik7Ci0JICAgIAlvdXRwdXRmb3JtID0gYWxsU3VwcG9ydGVkT3V0cHV0Rm9ybXMoKTsKLQkgICAgfQotCQlyZXR1cm4gb3V0cHV0Zm9ybTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBzdGF0aWMgT3V0cHV0Rm9ybVtdIGRldGVybWluZU91dHB1dEZvcm0oU3RyaW5nIGRpYWxlY3QsIFBhcmFtZXRlciBtZXhQYXJtKSB7Ci0JCU91dHB1dEZvcm1bXSBmb3JtcyA9IG5ldyBPdXRwdXRGb3JtWzBdOwotCQlpZiAobWV4UGFybSA9PSBudWxsKQotCQkJcmV0dXJuIGZvcm1zOwotCQkKLQkJT01FbGVtZW50IG1leENvbmZpZyA9IG1leFBhcm0uZ2V0UGFyYW1ldGVyRWxlbWVudCgpOwotCQlJdGVyYXRvciBpdGUgPSBtZXhDb25maWcuZ2V0Q2hpbGRyZW5XaXRoTmFtZShuZXcgUU5hbWUoCi0JCQkJTWV4Q29uc3RhbnRzLk1FWF9DT05GSUcuT1VUUFVUX0ZPUk1fUEFSTSkpOwotCQlTdHJpbmcgZGlhbGVjdEZvcm1fY29uZmlndXJlZCA9IG51bGw7Ci0JCVN0cmluZyBzZXJ2aWNlRm9ybV9jb25maWd1cmVkID0gbnVsbDsKLQkJd2hpbGUgKGl0ZS5oYXNOZXh0KCkpIHsKLQkJCU9NRWxlbWVudCBlbGVtID0gKE9NRWxlbWVudCkgaXRlLm5leHQoKTsKLQkJCVN0cmluZyBmb3JtX3ZhbHVlID0gZWxlbS5nZXRBdHRyaWJ1dGVWYWx1ZShuZXcgUU5hbWUoCi0JCQkJCU1leENvbnN0YW50cy5NRVhfQ09ORklHLkZPUk1TX1BBUk0pKTsKLQkJCVN0cmluZyBkaWFsZWN0X3ZhbHVlID0gZWxlbS5nZXRBdHRyaWJ1dGVWYWx1ZShuZXcgUU5hbWUoCi0JCQkJCU1leENvbnN0YW50cy5NRVhfQ09ORklHLkRJQUxFQ1RfUEFSTSkpOwotCQkJaWYgKGRpYWxlY3RfdmFsdWUgPT0gbnVsbCl7Ci0JCQkJc2VydmljZUZvcm1fY29uZmlndXJlZCA9IGZvcm1fdmFsdWU7Ci0JCQl9CQotCQkJZWxzZSBpZiAoZGlhbGVjdF92YWx1ZSAhPSBudWxsCi0JCQkJCSYmIGRpYWxlY3RfdmFsdWUuZXF1YWxzKGRpYWxlY3QpKSB7Ci0JCQkJZGlhbGVjdEZvcm1fY29uZmlndXJlZCA9IGZvcm1fdmFsdWU7Ci0JCQl9CQotCSAgICAgfQotCQkJCi0JCWlmIChkaWFsZWN0Rm9ybV9jb25maWd1cmVkICE9IG51bGwpewotCQkJZm9ybXMgPSBwYXJzZUZvcm1zKGRpYWxlY3RGb3JtX2NvbmZpZ3VyZWQpOwotCQl9Ci0JCWVsc2UgaWYgKHNlcnZpY2VGb3JtX2NvbmZpZ3VyZWQgIT0gbnVsbCl7Ci0JCQlmb3JtcyA9IHBhcnNlRm9ybXMoc2VydmljZUZvcm1fY29uZmlndXJlZCk7Ci0JCX0KLQkJCi0JCXJldHVybiBmb3JtczsKLQl9CQotCQotCQotCXByaXZhdGUgc3RhdGljIE91dHB1dEZvcm1bXSBwYXJzZUZvcm1zKFN0cmluZyBmb3JtX3ZhbHVlcykgewotCQlMaXN0IGZvcm1zID0gbmV3IEFycmF5TGlzdCgpOwotCQlTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGZvcm1fdmFsdWVzLAotCQkJCU1leENvbnN0YW50cy5NRVhfQ09ORklHLkRFTElNSVRFUik7Ci0JCXdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCVN0cmluZyB0b2tlbiA9IHN0Lm5leHRUb2tlbigpOwotCQkJaWYgKHRva2VuLmVxdWFscyhNZXhDb25zdGFudHMuTUVYX0NPTkZJRy5JTkxJTkUpKQotCQkJCWZvcm1zLmFkZChPdXRwdXRGb3JtLklOTElORV9GT1JNKTsKLQkJCWVsc2UgaWYgKHRva2VuLmVxdWFscyhNZXhDb25zdGFudHMuTUVYX0NPTkZJRy5MT0NBVElPTikpCi0JCQkJZm9ybXMuYWRkKE91dHB1dEZvcm0uTE9DQVRJT05fRk9STSk7Ci0JCQllbHNlIGlmICh0b2tlbi5lcXVhbHMoTWV4Q29uc3RhbnRzLk1FWF9DT05GSUcuUkVGRVJFTkNFKSkKLQkJCQlmb3Jtcy5hZGQoT3V0cHV0Rm9ybS5SRUZFUkVOQ0VfRk9STSk7Ci0JCQllbHNlIHsKLSAgICAgICAgICAgICAgbG9nLmRlYnVnKCJJbnZhbGlkIGZvcm0gY29uZmlndXJlZCwgIiArIGZvcm1fdmFsdWVzKTsKLQkJCX0KLQotCQl9Ci0KLQkJcmV0dXJuIChPdXRwdXRGb3JtW10pIGZvcm1zLnRvQXJyYXkobmV3IE91dHB1dEZvcm1bMF0pOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbXRvbXBvbGljeS1tYXIvcG9tLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL210b21wb2xpY3ktbWFyL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzN2Q1ODIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvbXRvbXBvbGljeS1tYXIvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjEuNS4xPC92ZXJzaW9uPgotICAgICAgICA8cmVsYXRpdmVQYXRoPi4uL3BhcmVudC9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+Ci0gICAgPC9wYXJlbnQ+Ci0gICAgPGFydGlmYWN0SWQ+bXRvbXBvbGljeTwvYXJ0aWZhY3RJZD4KLSAgICA8bmFtZT5BcGFjaGUgQXhpczIgLSBNVE9NIFBvbGljeSBtb2R1bGU8L25hbWU+Ci0gICAgPGRlc2NyaXB0aW9uPkF4aXMyIDogTVRPTSBQb2xpY3kgbW9kdWxlPC9kZXNjcmlwdGlvbj4KLSAgICA8cGFja2FnaW5nPm1hcjwvcGFja2FnaW5nPgotICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLWtlcm5lbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7dmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItbXRvbXBvbGljeTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7dmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm5lZXRoaTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm5lZXRoaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgIDwvZGVwZW5kZW5jaWVzPgotICAgIDxidWlsZD4KLSAgICAgICAgPHNvdXJjZURpcmVjdG9yeT5zcmM8L3NvdXJjZURpcmVjdG9yeT4KLSAgICAgICAgPHJlc291cmNlcz4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5Pi4uLy4uPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5OT1RJQ0UudHh0PC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5MSUNFTlNFLnR4dDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgICAgIDxmaWx0ZXJpbmc+ZmFsc2U8L2ZpbHRlcmluZz4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmM8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqLyouamF2YTwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1ZGVzPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgPC9yZXNvdXJjZXM+Ci0gICAgICAgIDx0ZXN0U291cmNlRGlyZWN0b3J5PnRlc3Q8L3Rlc3RTb3VyY2VEaXJlY3Rvcnk+Ci0gICAgICAgIDx0ZXN0UmVzb3VyY2VzPgotICAgICAgICAgICAgPHRlc3RSZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnRlc3QtcmVzb3VyY2VzPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICA8L3Rlc3RSZXNvdXJjZT4KLSAgICAgICAgPC90ZXN0UmVzb3VyY2VzPgotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8c2tpcD5mYWxzZTwvc2tpcD4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1tYXItbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7dmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPGV4dGVuc2lvbnM+dHJ1ZTwvZXh0ZW5zaW9ucz4KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGVEZXBlbmRlbmNpZXM+ZmFsc2U8L2luY2x1ZGVEZXBlbmRlbmNpZXM+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgIDwvcGx1Z2lucz4KLSAgICA8L2J1aWxkPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbXRvbXBvbGljeS1tYXIvc3JjL01FVEEtSU5GL21vZHVsZS54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9tdG9tcG9saWN5LW1hci9zcmMvTUVUQS1JTkYvbW9kdWxlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM1YjBmYS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tdG9tcG9saWN5LW1hci9zcmMvTUVUQS1JTkYvbW9kdWxlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLTxtb2R1bGUgbmFtZT0ibXRvbXBvbGljeSIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIubXRvbXBvbGljeS5NVE9NUG9saWN5Ij4KLSAgICA8RGVzY3JpcHRpb24+Ci0gICAgICBUaGlzIGlzIHRoZSBNVE9NIHBvbGljeSBtb2R1bGUuIEl0IGlzIGVuZ2FnZWQgd2hlbiB3ZSBoYXZlIE1UT00gcG9saWN5IGFzc2VydGlvbi4KLSAgICA8L0Rlc2NyaXB0aW9uPgotICAgIDxzdXBwb3J0ZWQtcG9saWN5LW5hbWVzcGFjZXMgbmFtZXNwYWNlcz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOS9wb2xpY3kvb3B0aW1pemVkbWltZXNlcmlhbGl6YXRpb24gaHR0cDovL3d3dy53My5vcmcvMjAwNy8wOC9zb2FwMTItbXRvbS1wb2xpY3kiLz4KLSAgICA8SW5GbG93PgotICAgICAgICA8aGFuZGxlciBuYW1lPSJNVE9NSW5IYW5kbGVyIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5tdG9tcG9saWN5Lk1UT01JbkhhbmRsZXIiPgotICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJQcmVEaXNwYXRjaCIvPgotICAgICAgICA8L2hhbmRsZXI+Ci0gICAgPC9JbkZsb3c+Ci0gICAgPE91dEZsb3c+Ci0gICAgICAgIDxoYW5kbGVyIG5hbWU9Ik1UT01PdXRIYW5kbGVyIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5tdG9tcG9saWN5Lk1UT01PdXRIYW5kbGVyIj4KLSAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iTWVzc2FnZU91dCIvPgotICAgICAgICA8L2hhbmRsZXI+Ci0gICAgPC9PdXRGbG93PiAgICAKLTwvbW9kdWxlPgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvbXRvbXBvbGljeS1tYXIvc3JjL29yZy9hcGFjaGUvYXhpczIvbXRvbXBvbGljeS9NVE9NSW5IYW5kbGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9tdG9tcG9saWN5LW1hci9zcmMvb3JnL2FwYWNoZS9heGlzMi9tdG9tcG9saWN5L01UT01JbkhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFjMTk5OS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tdG9tcG9saWN5LW1hci9zcmMvb3JnL2FwYWNoZS9heGlzMi9tdG9tcG9saWN5L01UT01JbkhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLm10b21wb2xpY3k7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5NVE9NQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmhhbmRsZXJzLkFic3RyYWN0SGFuZGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnBvbGljeS5tb2RlbC5NVE9NQXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubmVldGhpLkFzc2VydGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm5lZXRoaS5Qb2xpY3k7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBkb2VzIGEgTVRPTSB2YWxpZGF0aW9uIG9mIHRoZSBtZXNzYWdlLiBJdCBjaGVja3MgaWYgaXQgc2hvdWxkIGJlIE1UT01pc2VkLCBvciA8L2JyPgotICogaWYgdGhlIG1lc3NhZ2UgaXMgY29tcGxpYW50IHdpdGggdGhlIE1UT00gcG9saWN5IHNldC4gCi0gKi8KLXB1YmxpYyBjbGFzcyBNVE9NSW5IYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyIHsKLQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgbWVzc2FnZSBzaG91bGQgYmUgTVRPTWlzZWQuIElmIGl0IGlzIG5vdCBidXQgdGhlIHBvbGljeSBzdGF0ZXMgdGhhdCBpdCBzaG91bGQgYmUgPC9icj4KLQkgKiB0aGVuIGFuIHtAbGluayBBeGlzRmF1bHR9IGlzIHRocm93bi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbXNnQ3R4IHRoZSB7QGxpbmsgTWVzc2FnZUNvbnRleHR9Ci0gICAgICogCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQgaWYgdGhlIG1lc3NhZ2UgaXMgbm90IE1UT01pc2VkLCBidXQgdGhlIHBvbGljeSBzdGF0ZXMgc28uCi0JICovCi0gICAgcHVibGljIEludm9jYXRpb25SZXNwb25zZSBpbnZva2UoTWVzc2FnZUNvbnRleHQgbXNnQ3R4KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgUG9saWN5IHBvbGljeSA9IG1zZ0N0eC5nZXRFZmZlY3RpdmVQb2xpY3koKTsKLSAgICAgICAgaWYgKHBvbGljeSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gSW52b2NhdGlvblJlc3BvbnNlLkNPTlRJTlVFOwotICAgICAgICB9Ci0gICAgICAgIExpc3Q8QXNzZXJ0aW9uPiBsaXN0ID0gKExpc3Q8QXNzZXJ0aW9uPikgcG9saWN5LmdldEFsdGVybmF0aXZlcygpCi0gICAgICAgICAgICAgICAgLm5leHQoKTsKLSAgICAgICAgZm9yIChBc3NlcnRpb24gYXNzZXJ0aW9uIDogbGlzdCkgewotICAgICAgICAgICAgaWYgKGFzc2VydGlvbiBpbnN0YW5jZW9mIE1UT01Bc3NlcnRpb24pIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgY29udGVudFR5cGUgPSAoU3RyaW5nKSBtc2dDdHguZ2V0UHJvcGVydHkoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uQ09OVEVOVF9UWVBFKTsKLSAgICAgICAgICAgICAgICBpZiAoIWFzc2VydGlvbi5pc09wdGlvbmFsKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRUeXBlID09IG51bGwgfHwgY29udGVudFR5cGUuaW5kZXhPZihNVE9NQ29uc3RhbnRzLk1UT01fVFlQRSkgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtc2dDdHguaXNTZXJ2ZXJTaWRlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgU09BUCBSRVFVRVNUIHNlbnQgYnkgdGhlIGNsaWVudCBJUyBOT1QgTVRPTWl6ZWQhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSBTT0FQIFJFU1BPTlNFIHNlbnQgYnkgdGhlIHNlcnZpY2UgSVMgTk9UIE1UT01pemVkISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBJbnZvY2F0aW9uUmVzcG9uc2UuQ09OVElOVUU7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9tdG9tcG9saWN5LW1hci9zcmMvb3JnL2FwYWNoZS9heGlzMi9tdG9tcG9saWN5L01UT01PdXRIYW5kbGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9tdG9tcG9saWN5LW1hci9zcmMvb3JnL2FwYWNoZS9heGlzMi9tdG9tcG9saWN5L01UT01PdXRIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxYWY1MjQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvbXRvbXBvbGljeS1tYXIvc3JjL29yZy9hcGFjaGUvYXhpczIvbXRvbXBvbGljeS9NVE9NT3V0SGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLm10b21wb2xpY3k7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmhhbmRsZXJzLkFic3RyYWN0SGFuZGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnBvbGljeS5tb2RlbC5NVE9NQXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubmVldGhpLkFzc2VydGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm5lZXRoaS5Qb2xpY3k7Ci0KLS8qKgotICogVGhpcyBvdXQgaGFuZGxlciBkb2VzIGEgY2hlY2sgb2YgdGhlIGVmZmVjdGl2ZSBwb2xpY3kgc2V0LiBCYXNlZCBvbiB0aGF0IHRoZSBjb3JyZXNwb25kaW5nIE1UT00gcHJvcGVydHkgPC9icj4KLSAqIHZhbHVlIGlzIHNldC4KLSAqLwotcHVibGljIGNsYXNzIE1UT01PdXRIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyIHsKLQotCS8qKgotCSAqIENoZWNrcyB0aGUgZWZmZWN0aXZlIHBvbGljeSBzZXQgYW5kIGJhc2VkIG9uIGl0IHRoZSA8Y29kZT5lbmFibGVNVE9NPC9jb2RlPiBpcyBzZXQgdG8gdGhlIGFwcHJvcHJpYXRlIHZhbHVlLjwvYnI+Ci0JICogRS5nLiBpZiB0aGUgcG9saWN5IHN0YXRlcyB0aGF0IE1UT00gaXMgPGNvZGU+b3B0aW9uYWw8L2NvZGU+IHRoZW4gdGhlIDxjb2RlPmVuYWJsZU1UT008L2NvZGU+IGlzIHNldCB0byB0aGlzIHZhbHVlLiAgCi0JICogCi0JICogQHBhcmFtIG1zZ0N0eCB0aGUge0BsaW5rIE1lc3NhZ2VDb250ZXh0fQotICAgICAqIAotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0Ci0JICovCi0gICAgcHVibGljIEludm9jYXRpb25SZXNwb25zZSBpbnZva2UoTWVzc2FnZUNvbnRleHQgbXNnQ3R4KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLQotICAgICAgICBQb2xpY3kgcG9saWN5ID0gbXNnQ3R4LmdldEVmZmVjdGl2ZVBvbGljeSgpOwotCi0gICAgICAgIGlmIChwb2xpY3kgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIEludm9jYXRpb25SZXNwb25zZS5DT05USU5VRTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFRPRE8gV2hlbiB3ZSBoYXZlIHBvbGljeSBhbHRlcm5hdGl2ZXMgc3VwcG9ydCB3ZSB3aWxsIGhhdmUgdG8gY2hhbmdlCi0gICAgICAgIC8vIHRoZSBpbXBsZW1lbnRhdGlvbi4KLSAgICAgICAgTGlzdDxBc3NlcnRpb24+IGxpc3QgPSAoTGlzdDxBc3NlcnRpb24+KSBwb2xpY3kuZ2V0QWx0ZXJuYXRpdmVzKCkubmV4dCgpOwotCi0gICAgICAgIGZvciAoQXNzZXJ0aW9uIGFzc2VydGlvbiA6IGxpc3QpIHsKLSAgICAgICAgICAgIGlmIChhc3NlcnRpb24gaW5zdGFuY2VvZiBNVE9NQXNzZXJ0aW9uKSB7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBpc09wdGlvbmFsID0gYXNzZXJ0aW9uLmlzT3B0aW9uYWwoKTsKLQotICAgICAgICAgICAgICAgIGlmIChpc09wdGlvbmFsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1zZ0N0eC5zZXRQcm9wZXJ0eShDb25zdGFudHMuQ29uZmlndXJhdGlvbi5FTkFCTEVfTVRPTSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuVkFMVUVfT1BUSU9OQUwpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1zZ0N0eC5zZXRQcm9wZXJ0eShDb25zdGFudHMuQ29uZmlndXJhdGlvbi5FTkFCTEVfTVRPTSwgQ29uc3RhbnRzLlZBTFVFX1RSVUUpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIEludm9jYXRpb25SZXNwb25zZS5DT05USU5VRTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL210b21wb2xpY3ktbWFyL3NyYy9vcmcvYXBhY2hlL2F4aXMyL210b21wb2xpY3kvTVRPTVBvbGljeS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvbXRvbXBvbGljeS1tYXIvc3JjL29yZy9hcGFjaGUvYXhpczIvbXRvbXBvbGljeS9NVE9NUG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjNDBlN2YuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvbXRvbXBvbGljeS1tYXIvc3JjL29yZy9hcGFjaGUvYXhpczIvbXRvbXBvbGljeS9NVE9NUG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLm10b21wb2xpY3k7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzTW9kdWxlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5QYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5tb2R1bGVzLk1vZHVsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnBvbGljeS5tb2RlbC5NVE9NQXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubmVldGhpLkFzc2VydGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm5lZXRoaS5Qb2xpY3k7Ci0KLS8qKgotICogVGhlIG1vZHVsZSBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgdGhlIE1UT00gbW9kdWxlLgotICoKLSAqLwotcHVibGljIGNsYXNzIE1UT01Qb2xpY3kgaW1wbGVtZW50cyBNb2R1bGUgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKE1UT01Qb2xpY3kuY2xhc3MpOwotCi0gICAgcHVibGljIHZvaWQgYXBwbHlQb2xpY3koUG9saWN5IHBvbGljeSwgQXhpc0Rlc2NyaXB0aW9uIGF4aXNEZXNjcmlwdGlvbikKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiYXBwbHlQb2xpY3koKSBjYWxsZWQgb24gTVRPTVBvbGljeSBtb2R1bGUiKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBjYW5TdXBwb3J0QXNzZXJ0aW9uKEFzc2VydGlvbiBhc3NlcnRpb24pIHsKLQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiY2FuU3VwcG9ydEFzc2VydGlvbiBjYWxsZWQgb24gTVRPTVBvbGljeSBtb2R1bGUgd2l0aCAiCi0gICAgICAgICAgICAgICAgICAgICsgYXNzZXJ0aW9uLmdldE5hbWUoKS50b1N0cmluZygpICsgIiBhc3NlcnRpb24iKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChhc3NlcnRpb24gaW5zdGFuY2VvZiBNVE9NQXNzZXJ0aW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBlbmdhZ2VOb3RpZnkoQXhpc0Rlc2NyaXB0aW9uIGF4aXNEZXNjcmlwdGlvbikgdGhyb3dzIEF4aXNGYXVsdCB7Ci0KLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIk1UT01Qb2xpY3kgbW9kdWxlIGhhcyBiZWVuIGVuZ2FnZWQgdG8gIgotICAgICAgICAgICAgICAgICAgICArIGF4aXNEZXNjcmlwdGlvbi5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBBeGlzU2VydmljZSBheGlzU2VydmljZSA9IFV0aWxzLmxvY2F0ZUF4aXNTZXJ2aWNlKGF4aXNEZXNjcmlwdGlvbik7Ci0KLSAgICAgICAgaWYgKGF4aXNTZXJ2aWNlID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiTVRPTVBvbGljeSBtb2R1bGUgY291bGRuJ3QgZmluZCB0aGUgQXhpcyBTZXJ2aWNlICIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgUGFyYW1ldGVyIHBhcmFtID0gYXhpc1NlcnZpY2UKLSAgICAgICAgICAgICAgICAuZ2V0UGFyYW1ldGVyKENvbnN0YW50cy5Db25maWd1cmF0aW9uLkVOQUJMRV9NVE9NKTsKLQotICAgICAgICBQb2xpY3kgbXRvbVBvbGljeSA9IFV0aWxzLmdldE1UT01Qb2xpY3kocGFyYW0pOwotCi0gICAgICAgIGlmIChtdG9tUG9saWN5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIFV0aWxzLmFwcGx5UG9saWN5VG9TT0FQQmluZGluZ3MoYXhpc1NlcnZpY2UsIG10b21Qb2xpY3kpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbml0KENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQsIEF4aXNNb2R1bGUgbW9kdWxlKQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJpbml0KCkgY2FsbGVkIG9uIE1UT01Qb2xpY3kgbW9kdWxlIik7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNodXRkb3duKENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ3VyYXRpb25Db250ZXh0KQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJzaHV0ZG93bigpIGNhbGxlZCBvbiBNVE9NUG9saWN5IG1vZHVsZSIpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL210b21wb2xpY3ktbWFyL3NyYy9vcmcvYXBhY2hlL2F4aXMyL210b21wb2xpY3kvVXRpbHMuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL210b21wb2xpY3ktbWFyL3NyYy9vcmcvYXBhY2hlL2F4aXMyL210b21wb2xpY3kvVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc5MDkwNy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tdG9tcG9saWN5LW1hci9zcmMvb3JnL2FwYWNoZS9heGlzMi9tdG9tcG9saWN5L1V0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLm10b21wb2xpY3k7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzQmluZGluZzsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNFbmRwb2ludDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uV1NETDJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5qYXZhMndzZGwuSmF2YTJXU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucG9saWN5Lm1vZGVsLk1UT00xMEFzc2VydGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnBvbGljeS5tb2RlbC5NVE9NQXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5Qb2xpY3lVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubmVldGhpLkFzc2VydGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm5lZXRoaS5Qb2xpY3k7Ci0KLS8qKgotICogVGhpcyBpcyBhIE1UT00gbW9kdWxlIHV0aWxpdHkgY2xhc3MuIEl0IGNvbnRhaW5zIHNvbWUgdXNlZnVsIG1ldGhvZHMgdXNlZCBpbnRvIHRoZSBNVE9NIG1vZHVsZS4gCi0gKi8KLXB1YmxpYyBjbGFzcyBVdGlscyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coVXRpbHMuY2xhc3MpOwotCQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNVE9NX0FTU0VSVElPTl9BUFBMSUVEID0gIk1UT01fQVNTRVJUSU9OX0FQUExJRUQiOwotCi0gICAgLyoqCi0gICAgICogRXh0cmFjdHMgdGhlIE1UT00gYXNzZXJ0aW9uIG9iamVjdCBpZiBpdCBpcyBleGlzdHMgaW50byB0aGUgcG9saWN5IGJhc2VkIG9uIGEgZ2l2ZW4ge0BsaW5rIEF4aXNEZXNjcmlwdGlvbn0uCi0gICAgICogCi0gICAgICogQHBhcmFtIGF4aXNEZXNjcmlwdGlvbiB0aGUge0BsaW5rIEF4aXNEZXNjcmlwdGlvbn0gb2JqZWN0IHRoYXQgc2hvdWxkIGJlIHNlYXJjaGVkLgotICAgICAqIEByZXR1cm4ge0BsaW5rIE1UT01Bc3NlcnRpb259ICB0aGUge0BsaW5rIE1UT01Bc3NlcnRpb259IGZvdW5kLiBJZiBpdCBpcyBub3QgZm91bmQgIm51bGwiIGlzIHJldHVybmVkLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTVRPTUFzc2VydGlvbiBnZXRNVE9NQXNzZXJ0aW9uKEF4aXNEZXNjcmlwdGlvbiBheGlzRGVzY3JpcHRpb24pIHsKLQotICAgICAgICBpZiAoYXhpc0Rlc2NyaXB0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQXhpc0Rlc2NyaXB0aW9uIHBhc3NlZCBhcyBwYXJhbWV0ZXIgaGFzIGEgXCJudWxsXCIgdmFsdWUuIik7Ci0gICAgICAgICAgICB9ICAgICAgICAJCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIEFycmF5TGlzdCBwb2xpY3lMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBwb2xpY3lMaXN0LmFkZEFsbChheGlzRGVzY3JpcHRpb24uZ2V0UG9saWN5U3ViamVjdCgpCi0gICAgICAgICAgICAgICAgLmdldEF0dGFjaGVkUG9saWN5Q29tcG9uZW50cygpKTsKLQotICAgICAgICBQb2xpY3kgcG9saWN5ID0gUG9saWN5VXRpbC5nZXRNZXJnZWRQb2xpY3kocG9saWN5TGlzdCwgYXhpc0Rlc2NyaXB0aW9uKTsKLQotICAgICAgICBpZiAocG9saWN5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgTGlzdDxBc3NlcnRpb24+IGxpc3QgPSAoTGlzdDxBc3NlcnRpb24+KSBwb2xpY3kuZ2V0QWx0ZXJuYXRpdmVzKCkKLSAgICAgICAgICAgICAgICAubmV4dCgpOwotCi0gICAgICAgIGZvciAoQXNzZXJ0aW9uIGFzc2VydGlvbiA6IGxpc3QpIHsKLSAgICAgICAgICAgIGlmIChhc3NlcnRpb24gaW5zdGFuY2VvZiBNVE9NQXNzZXJ0aW9uKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChNVE9NQXNzZXJ0aW9uKSBhc3NlcnRpb247Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIExvY2F0ZXMgdGhlIHtAbGluayBBeGlzU2VydmljZX0gb2JqZWN0IHNlYXJjaGluZyB1cCBpbiB0aGUgaGllcmFyY2h5IHJlY3Vyc2l2ZWx5IDwvYnI+Ci0gICAgICogdGhlIHtAbGluayBBeGlzRGVzY3JpcHRpb259IG9iamVjdCBwYXNzZWQuCi0gICAgICogICAKLSAgICAgKiBAcGFyYW0gYXhpc0Rlc2NyaXB0aW9uIHRoZSB7QGxpbmsgQXhpc0Rlc2NyaXB0aW9ufSBvYmplY3QgdGhhdCBzaG91bGQgYmUgY2hlY2tlZC4KLSAgICAgKiBAcmV0dXJuIHRoZSB7QGxpbmsgQXhpc1NlcnZpY2V9IG9iamVjdCBmb3VuZCBvciAibnVsbCIuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBBeGlzU2VydmljZSBsb2NhdGVBeGlzU2VydmljZShBeGlzRGVzY3JpcHRpb24gYXhpc0Rlc2NyaXB0aW9uKSB7Ci0KLSAgICAgICAgaWYgKGF4aXNEZXNjcmlwdGlvbiA9PSBudWxsIHx8IGF4aXNEZXNjcmlwdGlvbiBpbnN0YW5jZW9mIEF4aXNTZXJ2aWNlKSB7Ci0gICAgICAgICAgICByZXR1cm4gKEF4aXNTZXJ2aWNlKSBheGlzRGVzY3JpcHRpb247Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbG9jYXRlQXhpc1NlcnZpY2UoYXhpc0Rlc2NyaXB0aW9uLmdldFBhcmVudCgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEJhc2VkIG9uIHRoZSBwYXJhbWV0ZXIgcGFzc2VkIGEge0BsaW5rIE1UT00xMEFzc2VydGlvbn0gb2JqZWN0IGlzIGNyZWF0ZWQgYnkgZGVmYXVsdC4gPC9icj4KLSAgICAgKiBUaGVuIGl0IGlzIGFkZGVkIHRvIGEge0BsaW5rIFBvbGljeX0gb2JqZWN0IGFuZCByZXR1cm5lZC4gCi0gICAgICogCi0gICAgICogQHBhcmFtIHBhcmFtIHRoZSB7QGxpbmsgUGFyYW1ldGVyfSBvYmplY3QgdGhhdCBjb250YWlucyB0aGUgdmFsdWUgb2YgdGhlICJlbmFibGVNVE9NIiBwYXJhbWV0ZXI6IDwvYnI+Ci0gICAgICogInRydWUiIG9yICJvcHRpb25hbCIuCi0gICAgICogQHJldHVybiBUaGUge0BsaW5rIFBvbGljeX0gb2JqZWN0IGZvciB0aGUgTVRPTSBhc3NlcnRpb24uIAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgUG9saWN5IGdldE1UT01Qb2xpY3koUGFyYW1ldGVyIHBhcmFtKSB7Ci0KLSAgICAgICAgaWYgKHBhcmFtID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVE9ETyBXZSBuZWVkIHRvIGdpdmUgdGhlIHVzZXIgdGhlIGFiaWxpdHkgdG8gc3BlY2lmeSBpZiBNVE9NIDEuMCBvciBNVE9NIDEuMSBzaG91bGQgYmUgdXNlZC4KLSAgICAgICAgTVRPTUFzc2VydGlvbiBtdG9tMTA7Ci0KLSAgICAgICAgaWYgKENvbnN0YW50cy5WQUxVRV9UUlVFLmVxdWFscyhwYXJhbS5nZXRWYWx1ZSgpKSkgewotICAgICAgICAgICAgbXRvbTEwID0gbmV3IE1UT00xMEFzc2VydGlvbigpOwotICAgICAgICB9IGVsc2UgaWYgKENvbnN0YW50cy5WQUxVRV9PUFRJT05BTC5lcXVhbHMocGFyYW0uZ2V0VmFsdWUoKSkpIHsKLSAgICAgICAgICAgIG10b20xMCA9IG5ldyBNVE9NMTBBc3NlcnRpb24oKTsKLSAgICAgICAgICAgIG10b20xMC5zZXRPcHRpb25hbCh0cnVlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgUG9saWN5IHBvbGljeSA9IG5ldyBQb2xpY3koKTsKLSAgICAgICAgcG9saWN5LmFkZEFzc2VydGlvbihtdG9tMTApOwotCi0gICAgICAgIHJldHVybiBwb2xpY3k7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBcHBsaWVzIHRoZSBNVE9NIHBvbGljeSB0byB0aGUgYmluZGluZyBsZXZlbCBvZiB0aGUgd2ViIHNlcnZpY2UuCi0gICAgICogCi0gICAgICogQHBhcmFtIGF4aXNTZXJ2aWNlIHRoZSB7QGxpbmsgQXhpc1NlcnZpY2V9IHRvIHdob20gYmluZGluZyBsZXZlbCB0aGUgTVRPTSBwb2xpY3kgc2hvdWxkIGJlIGF0dGFjaGVkLgotICAgICAqIEBwYXJhbSBwb2xpY3kgdGhlIHtAbGluayBQb2xpY3l9IG9iamVjdCB0aGF0IGNvbnRhaW5zIHRoZSBNVE9NIGFzc2VydGlvbi4KLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdCB0aHJvd24gaWYgdGhlIHBhcmFtZXRlciBpcyBsb2NrZWQgb24gYSBwYXJlbnQgbGV2ZWwgLSB0aHVzIGl0IGNvdWxkIG5vdCBiZSBhZGRlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYXBwbHlQb2xpY3lUb1NPQVBCaW5kaW5ncyhBeGlzU2VydmljZSBheGlzU2VydmljZSwKLSAgICAgICAgICAgIFBvbGljeSBwb2xpY3kpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICAKLSAgICAgICAgUGFyYW1ldGVyIHBhcmFtID0gYXhpc1NlcnZpY2UuZ2V0UGFyYW1ldGVyKE1UT01fQVNTRVJUSU9OX0FQUExJRUQpOwotCi0gICAgICAgIGlmICggcG9saWN5ID09IG51bGwgfHwgKHBhcmFtICE9IG51bGwgJiYgQ29uc3RhbnRzLlZBTFVFX1RSVUUuZXF1YWxzKHBhcmFtLmdldFZhbHVlKCkpKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChPYmplY3Qgb2JqIDogYXhpc1NlcnZpY2UuZ2V0RW5kcG9pbnRzKCkudmFsdWVzKCkpIHsKLQotICAgICAgICAgICAgQXhpc0VuZHBvaW50IGVuZHBvaW50ID0gKEF4aXNFbmRwb2ludCkgb2JqOwotICAgICAgICAgICAgQXhpc0JpbmRpbmcgYmluZGluZyA9IGVuZHBvaW50LmdldEJpbmRpbmcoKTsgCi0gICAgICAgICAgICBpZiAoSmF2YTJXU0RMQ29uc3RhbnRzLlRSQU5TUE9SVF9VUkkuZXF1YWxzKGJpbmRpbmcuZ2V0VHlwZSgpKQotICAgICAgICAgICAgICAgICAgICB8fCBXU0RMMkNvbnN0YW50cy5VUklfV1NETDJfU09BUC5lcXVhbHMoYmluZGluZy5nZXRUeXBlKCkpKSB7Ci0gICAgICAgICAgICAgICAgYmluZGluZy5nZXRQb2xpY3lTdWJqZWN0KCkuYXR0YWNoUG9saWN5KHBvbGljeSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBheGlzU2VydmljZQotICAgICAgICAgICAgICAgIC5hZGRQYXJhbWV0ZXIoIk1UT01fQVNTRVJUSU9OX0FQUExJRUQiLCBDb25zdGFudHMuVkFMVUVfVFJVRSk7Ci0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL210b21wb2xpY3kvcG9tLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL210b21wb2xpY3kvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZlOWFkMS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tdG9tcG9saWN5L3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItcGFyZW50PC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4xLjUuMTwvdmVyc2lvbj4KLSAgICAgICAgPHJlbGF0aXZlUGF0aD4uLi9wYXJlbnQvcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgotICAgIDwvcGFyZW50PgotICAgIDxhcnRpZmFjdElkPmF4aXMyLW10b21wb2xpY3k8L2FydGlmYWN0SWQ+Ci0gICAgPG5hbWU+QXBhY2hlIEF4aXMyIC0gTVRPTSBQb2xpY3k8L25hbWU+Ci0gICAgPGRlc2NyaXB0aW9uPkF4aXMyIDogTVRPTSBQb2xpY3k8L2Rlc2NyaXB0aW9uPgotICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLWtlcm5lbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7dmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm5lZXRoaTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm5lZXRoaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgIDwvZGVwZW5kZW5jaWVzPgotICAgIDxidWlsZD4KLSAgICAgICAgPHNvdXJjZURpcmVjdG9yeT5zcmM8L3NvdXJjZURpcmVjdG9yeT4KLSAgICAgICAgPHJlc291cmNlcz4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5Pi4uLy4uPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5OT1RJQ0UudHh0PC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5MSUNFTlNFLnR4dDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgICAgIDxmaWx0ZXJpbmc+ZmFsc2U8L2ZpbHRlcmluZz4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmM8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqLyouamF2YTwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1ZGVzPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgPC9yZXNvdXJjZXM+Ci0gICAgICAgIDx0ZXN0U291cmNlRGlyZWN0b3J5PnRlc3Q8L3Rlc3RTb3VyY2VEaXJlY3Rvcnk+Ci0gICAgICAgIDx0ZXN0UmVzb3VyY2VzPgotICAgICAgICAgICAgPHRlc3RSZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnRlc3QtcmVzb3VyY2VzPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICA8L3Rlc3RSZXNvdXJjZT4KLSAgICAgICAgPC90ZXN0UmVzb3VyY2VzPgotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8c2tpcD5mYWxzZTwvc2tpcD4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvYnVpbGQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9tdG9tcG9saWN5L3NyYy9NRVRBLUlORi9zZXJ2aWNlcy9vcmcuYXBhY2hlLm5lZXRoaS5idWlsZGVycy5Bc3NlcnRpb25CdWlsZGVyIGIvdjEuNS4xUkMzL21vZHVsZXMvbXRvbXBvbGljeS9zcmMvTUVUQS1JTkYvc2VydmljZXMvb3JnLmFwYWNoZS5uZWV0aGkuYnVpbGRlcnMuQXNzZXJ0aW9uQnVpbGRlcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjgyZTQ0Zi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tdG9tcG9saWN5L3NyYy9NRVRBLUlORi9zZXJ2aWNlcy9vcmcuYXBhY2hlLm5lZXRoaS5idWlsZGVycy5Bc3NlcnRpb25CdWlsZGVyCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1vcmcuYXBhY2hlLmF4aXMyLnBvbGljeS5idWlsZGVycy5NVE9NMTBBc3NlcnRpb25CdWlsZGVyCi1vcmcuYXBhY2hlLmF4aXMyLnBvbGljeS5idWlsZGVycy5NVE9NMTFBc3NlcnRpb25CdWlsZGVyCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9tdG9tcG9saWN5L3NyYy9vcmcvYXBhY2hlL2F4aXMyL3BvbGljeS9idWlsZGVycy9NVE9NMTBBc3NlcnRpb25CdWlsZGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9tdG9tcG9saWN5L3NyYy9vcmcvYXBhY2hlL2F4aXMyL3BvbGljeS9idWlsZGVycy9NVE9NMTBBc3NlcnRpb25CdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0NmU5MWMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvbXRvbXBvbGljeS9zcmMvb3JnL2FwYWNoZS9heGlzMi9wb2xpY3kvYnVpbGRlcnMvTVRPTTEwQXNzZXJ0aW9uQnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnBvbGljeS5idWlsZGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucG9saWN5Lm1vZGVsLk1UT00xMEFzc2VydGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnBvbGljeS5tb2RlbC5NVE9NQXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5KYXZhVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5uZWV0aGkuQXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubmVldGhpLkFzc2VydGlvbkJ1aWxkZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubmVldGhpLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLm5lZXRoaS5Qb2xpY3k7Ci1pbXBvcnQgb3JnLmFwYWNoZS5uZWV0aGkuUG9saWN5RW5naW5lOwotaW1wb3J0IG9yZy5hcGFjaGUubmVldGhpLmJ1aWxkZXJzLkFzc2VydGlvbkJ1aWxkZXI7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi0vKioKLSAqIFRoaXMgYnVpbGRlciBpcyByZXNwb25zaWJsZSBmb3IgdGhlIGNyZWF0aW9uIG9mIGEgTVRPTSBhc3NlcnRpb24gb2JqZWN0IDwvYnI+Ci0gKiAoY29tcGxpYW50IHdpdGggdGhlIFdTLU1UT01Qb2xpY3kgdmVyaW9uIDEuMCkuCi0gKiBUaGUgYnVpbGRlciB3aWxsIGJlIHBpY2tlZCBieSB0aGUKLSAqICJvcmcuYXBhY2hlLm5lZXRoaS5Bc3NlcnRpb25CdWlsZGVyRmFjdG9yeSIuCi0gKi8KLXB1YmxpYyBjbGFzcyBNVE9NMTBBc3NlcnRpb25CdWlsZGVyIGltcGxlbWVudHMgQXNzZXJ0aW9uQnVpbGRlciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coTVRPTTEwQXNzZXJ0aW9uQnVpbGRlci5jbGFzcyk7Ci0KLSAgICBwdWJsaWMgQXNzZXJ0aW9uIGJ1aWxkKE9NRWxlbWVudCBlbGVtZW50LCBBc3NlcnRpb25CdWlsZGVyRmFjdG9yeSBmYWN0b3J5KQotICAgICAgICAgICAgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgTVRPTTEwQXNzZXJ0aW9uIG10b21Bc3NlcnRpb24gPSBuZXcgTVRPTTEwQXNzZXJ0aW9uKCk7Ci0KLSAgICAgICAgcHJvY2Vzc01UT00xMEFzc2VydGlvbihlbGVtZW50LCBtdG9tQXNzZXJ0aW9uKTsKLQotICAgICAgICByZXR1cm4gbXRvbUFzc2VydGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUU5hbWVbXSBnZXRLbm93bkVsZW1lbnRzKCkgewotICAgICAgICByZXR1cm4gbmV3IFFOYW1lW10geyBuZXcgUU5hbWUoTVRPTTEwQXNzZXJ0aW9uLk5TLAotICAgICAgICAgICAgICAgIE1UT00xMEFzc2VydGlvbi5NVE9NX1NFUklBTElaQVRJT05fQ09ORklHX0xOKSB9OwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzTVRPTTEwQXNzZXJ0aW9uKE9NRWxlbWVudCBlbGVtZW50LAotICAgICAgICAgICAgTVRPTTEwQXNzZXJ0aW9uIG10b21Bc3NlcnRpb24pIHsKLQotICAgICAgICAvLyBDaGVja2luZyB3c3A6T3B0aW9uYWwgYXR0cmlidXRlCi0gICAgICAgIFN0cmluZyB2YWx1ZSA9IGVsZW1lbnQKLSAgICAgICAgICAgICAgICAuZ2V0QXR0cmlidXRlVmFsdWUoQ29uc3RhbnRzLlFfRUxFTV9PUFRJT05BTF9BVFRSKTsKLSAgICAgICAgYm9vbGVhbiBpc09wdGlvbmFsID0gSmF2YVV0aWxzLmlzVHJ1ZUV4cGxpY2l0bHkodmFsdWUpOwotCi0gICAgICAgIG10b21Bc3NlcnRpb24uc2V0T3B0aW9uYWwoaXNPcHRpb25hbCk7Ci0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL210b21wb2xpY3kvc3JjL29yZy9hcGFjaGUvYXhpczIvcG9saWN5L2J1aWxkZXJzL01UT00xMUFzc2VydGlvbkJ1aWxkZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL210b21wb2xpY3kvc3JjL29yZy9hcGFjaGUvYXhpczIvcG9saWN5L2J1aWxkZXJzL01UT00xMUFzc2VydGlvbkJ1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJhNzlkNy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tdG9tcG9saWN5L3NyYy9vcmcvYXBhY2hlL2F4aXMyL3BvbGljeS9idWlsZGVycy9NVE9NMTFBc3NlcnRpb25CdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnBvbGljeS5idWlsZGVyczsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnBvbGljeS5tb2RlbC5NVE9NMTBBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5wb2xpY3kubW9kZWwuTVRPTTExQXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucG9saWN5Lm1vZGVsLk1UT01Bc3NlcnRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLkphdmFVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm5lZXRoaS5Bc3NlcnRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5uZWV0aGkuQXNzZXJ0aW9uQnVpbGRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5uZWV0aGkuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUubmVldGhpLmJ1aWxkZXJzLkFzc2VydGlvbkJ1aWxkZXI7Ci0KLS8qKgotICogVGhpcyBidWlsZGVyIGlzIHJlc3BvbnNpYmxlIGZvciB0aGUgY3JlYXRpb24gb2YgYSBNVE9NIGFzc2VydGlvbiBvYmplY3QgPC9icj4KLSAqIChjb21wbGlhbnQgd2l0aCB0aGUgV1MtTVRPTVBvbGljeSB2ZXJpb24gMS4xKS4KLSAqIFRoZSBidWlsZGVyIHdpbGwgYmUgcGlja2VkIGJ5IHRoZQotICogIm9yZy5hcGFjaGUubmVldGhpLkFzc2VydGlvbkJ1aWxkZXJGYWN0b3J5Ii4KLSAqLwotCi1wdWJsaWMgY2xhc3MgTVRPTTExQXNzZXJ0aW9uQnVpbGRlciBpbXBsZW1lbnRzIEFzc2VydGlvbkJ1aWxkZXJ7Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKE1UT00xMEFzc2VydGlvbkJ1aWxkZXIuY2xhc3MpOwotCi0gICAgcHVibGljIEFzc2VydGlvbiBidWlsZChPTUVsZW1lbnQgZWxlbWVudCwgQXNzZXJ0aW9uQnVpbGRlckZhY3RvcnkgZmFjdG9yeSkKLSAgICAgICAgICAgIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotCi0gICAgICAgIE1UT00xMUFzc2VydGlvbiBtdG9tQXNzZXJ0aW9uID0gbmV3IE1UT00xMUFzc2VydGlvbigpOwotCi0gICAgICAgIHByb2Nlc3NNVE9NMTFBc3NlcnRpb24oZWxlbWVudCwgbXRvbUFzc2VydGlvbik7Ci0KLSAgICAgICAgcmV0dXJuIG10b21Bc3NlcnRpb247Ci0gICAgfQotCi0gICAgcHVibGljIFFOYW1lW10gZ2V0S25vd25FbGVtZW50cygpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBRTmFtZVtdIHsgbmV3IFFOYW1lKE1UT00xMUFzc2VydGlvbi5OUywKLSAgICAgICAgICAgICAgICBNVE9NMTFBc3NlcnRpb24uTVRPTV9MTikgfTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc01UT00xMUFzc2VydGlvbihPTUVsZW1lbnQgZWxlbWVudCwKLSAgICAgICAgICAgIE1UT00xMUFzc2VydGlvbiBtdG9tQXNzZXJ0aW9uKSB7Ci0KLSAgICAgICAgLy8gQ2hlY2tpbmcgd3NwOk9wdGlvbmFsIGF0dHJpYnV0ZQotICAgICAgICBTdHJpbmcgdmFsdWUgPSBlbGVtZW50Ci0gICAgICAgICAgICAgICAgLmdldEF0dHJpYnV0ZVZhbHVlKENvbnN0YW50cy5RX0VMRU1fT1BUSU9OQUxfQVRUUik7Ci0gICAgICAgIGJvb2xlYW4gaXNPcHRpb25hbCA9IEphdmFVdGlscy5pc1RydWVFeHBsaWNpdGx5KHZhbHVlKTsKLQotICAgICAgICBtdG9tQXNzZXJ0aW9uLnNldE9wdGlvbmFsKGlzT3B0aW9uYWwpOwotCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9tdG9tcG9saWN5L3NyYy9vcmcvYXBhY2hlL2F4aXMyL3BvbGljeS9tb2RlbC9NVE9NMTBBc3NlcnRpb24uamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL210b21wb2xpY3kvc3JjL29yZy9hcGFjaGUvYXhpczIvcG9saWN5L21vZGVsL01UT00xMEFzc2VydGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjdmMThmLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL210b21wb2xpY3kvc3JjL29yZy9hcGFjaGUvYXhpczIvcG9saWN5L21vZGVsL01UT00xMEFzc2VydGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5wb2xpY3kubW9kZWw7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5uZWV0aGkuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUubmVldGhpLlBvbGljeUNvbXBvbmVudDsKLQotLyoqCi0gKiBBc3NlcnRpb24gdG8gcGljayB1cCB0aGUgUU5hbWUgJmx0d3NvbWE6T3B0aW1pemVkTWltZVNlcmlhbGl6YXRpb24KLSAqIHhtbG5zOndzb21hPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA5L3BvbGljeS9vcHRpbWl6ZWRtaW1lc2VyaWFsaXphdGlvbiIvJmd0ICB3aGljaCBpcyBjb21wbGlhbnQgPGJyPgotICogd2l0aCB0aGUgV1MtTVRPTVBvbGljeSB2ZXJpb24gMS4wLgotICovCi1wdWJsaWMgY2xhc3MgTVRPTTEwQXNzZXJ0aW9uIGV4dGVuZHMgTVRPTUFzc2VydGlvbiB7Ci0KLSAgICAvLyBjcmVhdGluZyBhIGxvZ2dlciBpbnN0YW5jZQotICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhNVE9NMTBBc3NlcnRpb24uY2xhc3MpOwotCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTlMgPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOS9wb2xpY3kvb3B0aW1pemVkbWltZXNlcmlhbGl6YXRpb24iOwotCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTVRPTV9TRVJJQUxJWkFUSU9OX0NPTkZJR19MTiA9ICJPcHRpbWl6ZWRNaW1lU2VyaWFsaXphdGlvbiI7Ci0KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQUkVGSVggPSAid3NvbWEiOwotCi0gICAgcHVibGljIFFOYW1lIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgUU5hbWUoTlMsIE1UT01fU0VSSUFMSVpBVElPTl9DT05GSUdfTE4pOwotICAgIH0KLQotICAgIHB1YmxpYyBzaG9ydCBnZXRUeXBlKCkgewotICAgICAgICByZXR1cm4gQ29uc3RhbnRzLlRZUEVfQVNTRVJUSU9OOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFsKFBvbGljeUNvbXBvbmVudCBwb2xpY3lDb21wb25lbnQpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJUT0RPIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2VyaWFsaXplKFhNTFN0cmVhbVdyaXRlciB3cml0ZXIpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgcHJlZml4ID0gd3JpdGVyLmdldFByZWZpeChOUyk7Ci0KLSAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBwcmVmaXggPSBQUkVGSVg7Ci0gICAgICAgICAgICB3cml0ZXIuc2V0UHJlZml4KFBSRUZJWCwgTlMpOwotICAgICAgICB9Ci0KLSAgICAgICAgd3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KFBSRUZJWCwgTVRPTV9TRVJJQUxJWkFUSU9OX0NPTkZJR19MTiwgTlMpOwotCi0gICAgICAgIGlmIChvcHRpb25hbCkgewotICAgICAgICAgICAgd3JpdGVyLndyaXRlQXR0cmlidXRlKENvbnN0YW50cy5BVFRSX1dTUCwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLlFfRUxFTV9PUFRJT05BTF9BVFRSLmdldExvY2FsUGFydCgpLCAidHJ1ZSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgd3JpdGVyLndyaXRlTmFtZXNwYWNlKFBSRUZJWCwgTlMpOwotICAgICAgICB3cml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgUG9saWN5Q29tcG9uZW50IG5vcm1hbGl6ZSgpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJUT0RPIik7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9tdG9tcG9saWN5L3NyYy9vcmcvYXBhY2hlL2F4aXMyL3BvbGljeS9tb2RlbC9NVE9NMTFBc3NlcnRpb24uamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL210b21wb2xpY3kvc3JjL29yZy9hcGFjaGUvYXhpczIvcG9saWN5L21vZGVsL01UT00xMUFzc2VydGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjczODI0Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL210b21wb2xpY3kvc3JjL29yZy9hcGFjaGUvYXhpczIvcG9saWN5L21vZGVsL01UT00xMUFzc2VydGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5wb2xpY3kubW9kZWw7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5uZWV0aGkuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUubmVldGhpLlBvbGljeUNvbXBvbmVudDsKLQotLyoqCi0gKiBBc3NlcnRpb24gdG8gcGljayB1cCB0aGUgUU5hbWUgJmx0d3NvbWE6TVRPTQotICogeG1sbnM6d3NvbWE9Imh0dHA6Ly93d3cudzMub3JnLzIwMDcvMDgvc29hcDEyLW10b20tcG9saWN5Ii8mZ3Qgd2hpY2ggaXMgY29tcGxpYW50IDwvYnI+Ci0gKiB3aXRoIHRoZSBXUy1NVE9NUG9saWN5IHZlcmlvbiAxLjEuCi0gKi8KLQotcHVibGljIGNsYXNzIE1UT00xMUFzc2VydGlvbiBleHRlbmRzIE1UT01Bc3NlcnRpb24gewotCi0gICAgLy8gY3JlYXRpbmcgYSBsb2dnZXIgaW5zdGFuY2UKLSAgICBwcml2YXRlIHN0YXRpYyBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coTVRPTTExQXNzZXJ0aW9uLmNsYXNzKTsKLQotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE5TID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDcvMDgvc29hcDEyLW10b20tcG9saWN5IjsKLQotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE1UT01fTE4gPSAiTVRPTSI7Ci0KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQUkVGSVggPSAid3NvbWEiOwotCi0gICAgcHVibGljIFFOYW1lIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgUU5hbWUoTlMsIE1UT01fTE4pOwotICAgIH0KLQotICAgIHB1YmxpYyBQb2xpY3lDb21wb25lbnQgbm9ybWFsaXplKCkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlRPRE8iKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoWE1MU3RyZWFtV3JpdGVyIHdyaXRlcikgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBwcmVmaXggPSB3cml0ZXIuZ2V0UHJlZml4KE5TKTsKLQotICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgIHByZWZpeCA9IFBSRUZJWDsKLSAgICAgICAgICAgIHdyaXRlci5zZXRQcmVmaXgoUFJFRklYLCBOUyk7Ci0gICAgICAgIH0KLQotICAgICAgICB3cml0ZXIud3JpdGVTdGFydEVsZW1lbnQoUFJFRklYLCBNVE9NX0xOLCBOUyk7Ci0KLSAgICAgICAgaWYgKG9wdGlvbmFsKSB7Ci0gICAgICAgICAgICB3cml0ZXIud3JpdGVBdHRyaWJ1dGUoQ29uc3RhbnRzLkFUVFJfV1NQLCBudWxsLAotICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuUV9FTEVNX09QVElPTkFMX0FUVFIuZ2V0TG9jYWxQYXJ0KCksICJ0cnVlIik7Ci0gICAgICAgIH0KLQotICAgICAgICB3cml0ZXIud3JpdGVOYW1lc3BhY2UoUFJFRklYLCBOUyk7Ci0gICAgICAgIHdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKLQotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFsKFBvbGljeUNvbXBvbmVudCBwb2xpY3lDb21wb25lbnQpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJUT0RPIik7Ci0gICAgfQotCi0gICAgcHVibGljIHNob3J0IGdldFR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBDb25zdGFudHMuVFlQRV9BU1NFUlRJT047Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9tdG9tcG9saWN5L3NyYy9vcmcvYXBhY2hlL2F4aXMyL3BvbGljeS9tb2RlbC9NVE9NQXNzZXJ0aW9uLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9tdG9tcG9saWN5L3NyYy9vcmcvYXBhY2hlL2F4aXMyL3BvbGljeS9tb2RlbC9NVE9NQXNzZXJ0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1MTY0ZTMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvbXRvbXBvbGljeS9zcmMvb3JnL2FwYWNoZS9heGlzMi9wb2xpY3kvbW9kZWwvTVRPTUFzc2VydGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnBvbGljeS5tb2RlbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubmVldGhpLkFzc2VydGlvbjsKLQotLyoqCi0gKiAKLSAqIFRoaXMgYWJzdHJhY3QgY2xhc3Mgc3BlY2lmaWVzIHRoZSBjb21tb24gZmVhdHVyZXMgb2YgYSBNVE9NIGFzc2VydGlvbi4gCi0gKgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTVRPTUFzc2VydGlvbiBpbXBsZW1lbnRzIEFzc2VydGlvbiB7Ci0KLQkvKiogU3BlY2lmaWVzIGlmIHRoZSBNVE9NIGFzc2VydGlvbiBpcyBvcHRpb25hbC4gVGhlIHJlcXVlc3QgY2FuIGJlIE1UT01pc2VkIG9yIG5vbi1NVE9NaXNlZCw8L2JyPgotCSAqICBidXQgdGhlIHJlc3BvbnNlIHdpbGwgYmUgTVRPTWlzZWQgb25seSBpZiByZXF1ZXN0IGlzIE1UT01pc2VkLiAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIG9wdGlvbmFsID0gZmFsc2U7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIGlmIHRoZSBNVE9NIGFzc2VydGlvbiBpcyBvcHRpb25hbC4gVGhlIHJlcXVlc3QgY2FuIGJlIE1UT01pc2VkIG9yIG5vbi1NVE9NaXNlZCw8L2JyPgotCSAqIGJ1dCB0aGUgcmVzcG9uc2Ugd2lsbCBiZSBNVE9NaXNlZCBvbmx5IGlmIHJlcXVlc3QgaXMgTVRPTWlzZWQuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgTVRPTSBhc3NlcnRpb24gaXMgb3B0aW9uYWwsIG90aGVyd2lzZSByZXR1cm5zIDxjb2RlPmZhbHNlPC9jb2RlPi4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc09wdGlvbmFsKCkgewotICAgICAgICByZXR1cm4gb3B0aW9uYWw7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFNldHMgdGhlIDxjb2RlPm9wdGlvbmFsPC9jb2RlPiBwYXJhbWV0ZXIuICAKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaXNPcHRpb25hbCBzZXRzIGlmIHRoZSBNVE9NIGFzc2VydGlvbiBpcyBvcHRpb25hbCBvciBub3QuIElmIHNldCB0byA8Y29kZT50cnVlPC9jb2RlPiA8L2JyPgotICAgICAqIHRoZW4gaWYgdGhlIHJlcXVlc3QgaXMgTVRPTWlzZWQgdGhlbiB0aGUgcmVzcG9uc2Ugc2hvdWxkIGJlIE1UT01pc2VkLCB0b28uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0T3B0aW9uYWwoYm9vbGVhbiBpc09wdGlvbmFsKSB7Ci0gICAgICAgIHRoaXMub3B0aW9uYWwgPSBpc09wdGlvbmFsOwotICAgIH0KLQotfQotCQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL210b21wb2xpY3kvdGVzdC1yZXNvdXJjZXMvcG9saWN5LW10b20tb3B0aW9uYWwueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvbXRvbXBvbGljeS90ZXN0LXJlc291cmNlcy9wb2xpY3ktbXRvbS1vcHRpb25hbC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2YjAxYTUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvbXRvbXBvbGljeS90ZXN0LXJlc291cmNlcy9wb2xpY3ktbXRvbS1vcHRpb25hbC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotIAotPHdzcDpQb2xpY3kgd3N1OklkPSJTaWdFbmNyIiB4bWxuczp3c3U9Imh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzcy8yMDA0LzAxL29hc2lzLTIwMDQwMS13c3Mtd3NzZWN1cml0eS11dGlsaXR5LTEuMC54c2QiIHhtbG5zOndzcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOS9wb2xpY3kiPgotCTx3c3A6RXhhY3RseU9uZT4KLQkJPHdzcDpBbGw+Ci0JCQk8d3NvbWE6T3B0aW1pemVkTWltZVNlcmlhbGl6YXRpb24geG1sbnM6d3NvbWE9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDkvcG9saWN5L29wdGltaXplZG1pbWVzZXJpYWxpemF0aW9uIiB3c3A6T3B0aW9uYWw9InRydWUiLz4KLQkJPC93c3A6QWxsPgotCTwvd3NwOkV4YWN0bHlPbmU+Ci08L3dzcDpQb2xpY3k+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9tdG9tcG9saWN5L3Rlc3QtcmVzb3VyY2VzL3BvbGljeS1tdG9tLXNlY3VyaXR5LnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL210b21wb2xpY3kvdGVzdC1yZXNvdXJjZXMvcG9saWN5LW10b20tc2VjdXJpdHkueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGQ5MzlhLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL210b21wb2xpY3kvdGVzdC1yZXNvdXJjZXMvcG9saWN5LW10b20tc2VjdXJpdHkueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+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+Ci0JPC93c3A6RXhhY3RseU9uZT4KLTwvd3NwOlBvbGljeT4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL210b21wb2xpY3kvdGVzdC1yZXNvdXJjZXMvcG9saWN5LW10b20xMS1vcHRpb25hbC54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9tdG9tcG9saWN5L3Rlc3QtcmVzb3VyY2VzL3BvbGljeS1tdG9tMTEtb3B0aW9uYWwueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWI1Yjc4Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL210b21wb2xpY3kvdGVzdC1yZXNvdXJjZXMvcG9saWN5LW10b20xMS1vcHRpb25hbC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotIAotPHdzcDpQb2xpY3kgd3N1OklkPSJNdG9tMTFPcHRpb25hbCIgeG1sbnM6d3N1PSJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c3MvMjAwNC8wMS9vYXNpcy0yMDA0MDEtd3NzLXdzc2VjdXJpdHktdXRpbGl0eS0xLjAueHNkIiB4bWxuczp3c3A9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDkvcG9saWN5Ij4KLSAgICA8d3NwOkV4YWN0bHlPbmU+Ci0gICAgICAgIDx3c3A6QWxsPgotICAgICAgICAgICAgPHdzb21hOk1UT00geG1sbnM6d3NvbWE9Imh0dHA6Ly93d3cudzMub3JnLzIwMDcvMDgvc29hcDEyLW10b20tcG9saWN5IiB3c3A6T3B0aW9uYWw9InRydWUiLz4KLSAgICAgICAgPC93c3A6QWxsPgotICAgIDwvd3NwOkV4YWN0bHlPbmU+Ci08L3dzcDpQb2xpY3k+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9tdG9tcG9saWN5L3Rlc3QtcmVzb3VyY2VzL3BvbGljeS1tdG9tMTEueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvbXRvbXBvbGljeS90ZXN0LXJlc291cmNlcy9wb2xpY3ktbXRvbTExLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQ0ODA3Ni4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9tdG9tcG9saWN5L3Rlc3QtcmVzb3VyY2VzL3BvbGljeS1tdG9tMTEueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLSAKLTx3c3A6UG9saWN5IHdzdTpJZD0iTXRvbTExIiB4bWxuczp3c3U9Imh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzcy8yMDA0LzAxL29hc2lzLTIwMDQwMS13c3Mtd3NzZWN1cml0eS11dGlsaXR5LTEuMC54c2QiIHhtbG5zOndzcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOS9wb2xpY3kiPgotICAgIDx3c3A6RXhhY3RseU9uZT4KLSAgICAgICAgPHdzcDpBbGw+Ci0gICAgICAgICAgICA8d3NvbWE6TVRPTSB4bWxuczp3c29tYT0iaHR0cDovL3d3dy53My5vcmcvMjAwNy8wOC9zb2FwMTItbXRvbS1wb2xpY3kiLz4KLSAgICAgICAgPC93c3A6QWxsPgotICAgIDwvd3NwOkV4YWN0bHlPbmU+Ci08L3dzcDpQb2xpY3k+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9tdG9tcG9saWN5L3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9wb2xpY3kvbW9kZWwvTVRPTUFzc2VydGlvblRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL210b21wb2xpY3kvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3BvbGljeS9tb2RlbC9NVE9NQXNzZXJ0aW9uVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjA4NzlmLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL210b21wb2xpY3kvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3BvbGljeS9tb2RlbC9NVE9NQXNzZXJ0aW9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5wb2xpY3kubW9kZWw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmJ1aWxkZXIuU3RBWE9NQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm5lZXRoaS5Bc3NlcnRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5uZWV0aGkuUG9saWN5OwotaW1wb3J0IG9yZy5hcGFjaGUubmVldGhpLlBvbGljeUVuZ2luZTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGNsYXNzIE1UT01Bc3NlcnRpb25UZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3ltbUJpbmRpbmcoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBQb2xpY3kgcCA9IHRoaXMuZ2V0UG9saWN5KFN5c3RlbS5nZXRQcm9wZXJ0eSgiYmFzZWRpciIsICIuIikgKwotICAgICAgICAgICAgICAgICAgICAiL3Rlc3QtcmVzb3VyY2VzL3BvbGljeS1tdG9tLXNlY3VyaXR5LnhtbCIpOwotICAgICAgICAgICAgTGlzdCBhc3NlcnRpb25zID0gKExpc3QpcC5nZXRBbHRlcm5hdGl2ZXMoKS5uZXh0KCk7Ci0KLSAgICAgICAgICAgIGJvb2xlYW4gaXNNVE9NQXNzZXJ0aW9uRm91bmQgPSBmYWxzZTsKLQotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gYXNzZXJ0aW9ucy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICBBc3NlcnRpb24gYXNzZXJ0aW9uID0gKEFzc2VydGlvbilpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBpZiAoYXNzZXJ0aW9uIGluc3RhbmNlb2YgTVRPTTEwQXNzZXJ0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlzTVRPTUFzc2VydGlvbkZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgTVRPTTEwQXNzZXJ0aW9uIG10b21Nb2RlbCA9IChNVE9NMTBBc3NlcnRpb24pYXNzZXJ0aW9uOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIk1JTUUgU2VyaWFsaXphdGlvbiBhc3NlcnRpb24gbm90IHByb2Nlc3NlZCIsIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXRvbU1vZGVsLmlzT3B0aW9uYWwoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvL1RoZSBBc3ltbSBiaW5kaW5nIG1lYW4gaXMgbm90IGJ1aWx0IGluIHRoZSBwb2xpY3kgcHJvY2Vzc2luZyA6LSgKLSAgICAgICAgICAgIGFzc2VydFRydWUoIk1UT00xMCBBc3NlcnRpb24gbm90IGZvdW5kLiIsIGlzTVRPTUFzc2VydGlvbkZvdW5kKTsKLQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RNVE9NMTBPcHRpb25hbCgpIHsKLSAgICAgICAgLy9UZXN0aW5nIHRoZSB3c3A6T3B0aW9uYWwgYXR0cmlidXRlIGluIFdTLU1UT01Qb2xpY3kgMS4wIGFzc2VydGlvbgotICAgICAgICB0cnkgewotICAgICAgICAgICAgUG9saWN5IHAgPSB0aGlzLmdldFBvbGljeShTeXN0ZW0uZ2V0UHJvcGVydHkoImJhc2VkaXIiLCAiLiIpICsKLSAgICAgICAgICAgICAgICAgICAgIi90ZXN0LXJlc291cmNlcy9wb2xpY3ktbXRvbS1vcHRpb25hbC54bWwiKTsKLSAgICAgICAgICAgIExpc3QgYXNzZXJ0aW9ucyA9IChMaXN0KXAuZ2V0QWx0ZXJuYXRpdmVzKCkubmV4dCgpOwotCi0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhc3NlcnRpb25zLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIEFzc2VydGlvbiBhc3NlcnRpb24gPSAoQXNzZXJ0aW9uKWl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgIGlmIChhc3NlcnRpb24gaW5zdGFuY2VvZiBNVE9NMTBBc3NlcnRpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgTVRPTTEwQXNzZXJ0aW9uIG10b21Nb2RlbCA9IChNVE9NMTBBc3NlcnRpb24pYXNzZXJ0aW9uOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIndzcDpPcHRpb25hbCBhdHRyaWJ1dGUgaXMgbm90IHByb2Nlc3NlZCIsIHRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdG9tTW9kZWwuaXNPcHRpb25hbCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdE1UT00xMUFzc2VydGlvbiAoKSB7Ci0gICAgICAgIC8vIFRlc3RpbmcgdGhlIFdTLU1UT01Qb2xpY3kgMS4xIGFzc2VydGlvbgotICAgICAgICB0cnkgewotICAgICAgICAgICAgUG9saWN5IHAgPSB0aGlzLmdldFBvbGljeShTeXN0ZW0uZ2V0UHJvcGVydHkoImJhc2VkaXIiLCAiLiIpICsKLSAgICAgICAgICAgICAgICAgICAgIi90ZXN0LXJlc291cmNlcy9wb2xpY3ktbXRvbTExLnhtbCIpOwotICAgICAgICAgICAgTGlzdCBhc3NlcnRpb25zID0gKExpc3QpcC5nZXRBbHRlcm5hdGl2ZXMoKS5uZXh0KCk7Ci0KLSAgICAgICAgICAgIGJvb2xlYW4gaXNNVE9NQXNzZXJ0aW9uRm91bmQgPSBmYWxzZTsKLQotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gYXNzZXJ0aW9ucy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICBBc3NlcnRpb24gYXNzZXJ0aW9uID0gKEFzc2VydGlvbilpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBpZiAoYXNzZXJ0aW9uIGluc3RhbmNlb2YgTVRPTTExQXNzZXJ0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlzTVRPTUFzc2VydGlvbkZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgTVRPTTExQXNzZXJ0aW9uIG10b21Nb2RlbCA9IChNVE9NMTFBc3NlcnRpb24pYXNzZXJ0aW9uOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiTVRPTTExIEFzc2VydGlvbiBub3QgZm91bmQuIiwgaXNNVE9NQXNzZXJ0aW9uRm91bmQpOwotCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RNVE9NMTFBc3NlcnRpb25PcHRpb25hbCgpIHsKLSAgICAgIC8vVGVzdGluZyB0aGUgd3NwOk9wdGlvbmFsIGF0dHJpYnV0ZSBpbiBXUy1NVE9NUG9saWN5IDEuMCBhc3NlcnRpb24KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFBvbGljeSBwID0gdGhpcy5nZXRQb2xpY3koU3lzdGVtLmdldFByb3BlcnR5KCJiYXNlZGlyIiwgIi4iKSArCi0gICAgICAgICAgICAgICAgICAgICIvdGVzdC1yZXNvdXJjZXMvcG9saWN5LW10b20xMS1vcHRpb25hbC54bWwiKTsKLSAgICAgICAgICAgIExpc3QgYXNzZXJ0aW9ucyA9IChMaXN0KXAuZ2V0QWx0ZXJuYXRpdmVzKCkubmV4dCgpOwotCi0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhc3NlcnRpb25zLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIEFzc2VydGlvbiBhc3NlcnRpb24gPSAoQXNzZXJ0aW9uKWl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgIGlmIChhc3NlcnRpb24gaW5zdGFuY2VvZiBNVE9NMTBBc3NlcnRpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgTVRPTTEwQXNzZXJ0aW9uIG10b21Nb2RlbCA9IChNVE9NMTBBc3NlcnRpb24pYXNzZXJ0aW9uOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIndzcDpPcHRpb25hbCBhdHRyaWJ1dGUgaXMgbm90IHByb2Nlc3NlZCIsIHRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdG9tTW9kZWwuaXNPcHRpb25hbCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RNVE9NQXNzZXJ0aW9uSW5oZXJpdGFuY2UoKSB7Ci0gICAgICAgIAotICAgICAgICAvL1Rlc3RpbmcgdGhlIE1UT00xMEFzc2VydGlvbiwgTVRPTTExQXNzZXJ0aW9uIHNob3VsZCBiZSBzdWIgY2xhc3NlcyBvZiBNVE9NQXNzZXJ0aW9uCi0gICAgICAgIAotICAgICAgICBib29sZWFuIGlzU3ViY2xhc3M7Ci0gICAgICAgIAotICAgICAgICBNVE9NMTBBc3NlcnRpb24gbXRvbTEwID0gbmV3IE1UT00xMEFzc2VydGlvbigpOwotICAgICAgICBpc1N1YmNsYXNzID0gbXRvbTEwIGluc3RhbmNlb2YgTVRPTUFzc2VydGlvbjsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydEVxdWFscygiTVRPTTEwQXNzZXJ0aW9ucyBpcyBub3Qgc3ViY2xhc3Mgb2YgTVRPTUFzc2VydGlvbiIsdHJ1ZSwgaXNTdWJjbGFzcyk7Ci0gICAgICAgIAotICAgICAgICBNVE9NMTFBc3NlcnRpb24gbXRvbTExID0gbmV3IE1UT00xMUFzc2VydGlvbigpOwotICAgICAgICBpc1N1YmNsYXNzID0gbXRvbTExIGluc3RhbmNlb2YgTVRPTUFzc2VydGlvbjsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydEVxdWFscygiTVRPTTEwQXNzZXJ0aW9ucyBpcyBub3Qgc3ViY2xhc3Mgb2YgTVRPTUFzc2VydGlvbiIsdHJ1ZSwgaXNTdWJjbGFzcyk7Ci0KLSAgICB9Ci0gICAgCi0KLSAgICBwcml2YXRlIFBvbGljeSBnZXRQb2xpY3koU3RyaW5nIGZpbGVQYXRoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RBWE9NQnVpbGRlciBidWlsZGVyID0gbmV3IFN0QVhPTUJ1aWxkZXIoZmlsZVBhdGgpOwotICAgICAgICBPTUVsZW1lbnQgZWxlbSA9IGJ1aWxkZXIuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0gICAgICAgIHJldHVybiBQb2xpY3lFbmdpbmUuZ2V0UG9saWN5KGVsZW0pOwotICAgIH0KLSAgICAKLSAgICAKLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL29zZ2kvcG9tLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL29zZ2kvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE4MWVmOS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9vc2dpL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIgotICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotCi0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItcGFyZW50PC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4xLjUuMTwvdmVyc2lvbj4KLSAgICAgICAgPHJlbGF0aXZlUGF0aD4uLi9wYXJlbnQvcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgotICAgIDwvcGFyZW50PgotCi0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICAgIDxhcnRpZmFjdElkPm9yZy5hcGFjaGUuYXhpczIub3NnaTwvYXJ0aWZhY3RJZD4KLSAgICA8cGFja2FnaW5nPmJ1bmRsZTwvcGFja2FnaW5nPgotICAgIDxuYW1lPkFwYWNoZSBBeGlzMiAtIE9TR2kgSW50ZWdyYXRpb248L25hbWU+Ci0gICAgPGRlc2NyaXB0aW9uPkFwYWNoZSBBeGlzMiBPU0dpIEludGVncmF0aW9uPC9kZXNjcmlwdGlvbj4KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxzb3VyY2VEaXJlY3Rvcnk+c3JjPC9zb3VyY2VEaXJlY3Rvcnk+Ci0gICAgICAgIDxyZXNvdXJjZXM+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5yZXNvdXJjZXM8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8ZmlsdGVyaW5nPmZhbHNlPC9maWx0ZXJpbmc+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+Li4vLi48L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPk5PVElDRS50eHQ8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPkxJQ0VOU0UudHh0PC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgPGZpbHRlcmluZz5mYWxzZTwvZmlsdGVyaW5nPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgPC9yZXNvdXJjZXM+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmZlbGl4PC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWJ1bmRsZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+MS40LjA8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPGV4dGVuc2lvbnM+dHJ1ZTwvZXh0ZW5zaW9ucz4KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGluc3RydWN0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxCdW5kbGUtVmVyc2lvbj4xLjAuMC4ke3BvbS52ZXJzaW9ufTwvQnVuZGxlLVZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8QnVuZGxlLU5hbWU+JHtwb20uYXJ0aWZhY3RJZH08L0J1bmRsZS1OYW1lPgotICAgICAgICAgICAgICAgICAgICAgICAgPEJ1bmRsZS1WZW5kb3I+QXBhY2hlIEF4aXMyLCAyMDA4PC9CdW5kbGUtVmVuZG9yPgotICAgICAgICAgICAgICAgICAgICAgICAgPEJ1bmRsZS1EZXNjcmlwdGlvbj4ke3BvbS5kZXNjcmlwdGlvbn08L0J1bmRsZS1EZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxCdW5kbGUtU3ltYm9saWNOYW1lPiR7cG9tLmFydGlmYWN0SWR9PC9CdW5kbGUtU3ltYm9saWNOYW1lPgotICAgICAgICAgICAgICAgICAgICAgICAgPEV4cG9ydC1QYWNrYWdlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICFvcmcuYXBhY2hlLmF4aXMyLm9zZ2kuaW50ZXJuYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5vc2dpLio7IHZlcnNpb249MS4wLjAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi4qOy1zcGxpdC1wYWNrYWdlOj1tZXJnZS1sYXN0OyB2ZXJzaW9uPTEuNSwKLSAgICAgICAgICAgICAgICAgICAgICAgIDwvRXhwb3J0LVBhY2thZ2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8SW1wb3J0LVBhY2thZ2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIWphdmF4LnhtbC5uYW1lc3BhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIW9yZy5hcGFjaGUuYXhpczIuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwubmFtZXNwYWNlOyB2ZXJzaW9uPTAuMC4wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnNlcnZsZXQ7IHZlcnNpb249Mi40LjAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXguc2VydmxldC5odHRwOyB2ZXJzaW9uPTIuNC4wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnRyYW5zYWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuY29tbW9ucy5pbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcub3NnaS5mcmFtZXdvcms7IHZlcnNpb249MS4zLjAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLm9zZ2kuc2VydmljZS5odHRwOyB2ZXJzaW9uPTEuMi4wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5vc2dpLnV0aWwudHJhY2tlcjsgdmVyc2lvbj0xLjMuMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcub3NnaS5zZXJ2aWNlLmxvZzsgdmVyc2lvbj0xLjMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLm9zZ2kuc2VydmljZS5jbTsgdmVyc2lvbj0xLjIuMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb20uaWJtLndzZGwudXRpbC54bWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXguYWN0aXZhdGlvbjt2ZXJzaW9uPSIxLjEiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4Lmp3czt2ZXJzaW9uPSIyLjAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4Lmptczt2ZXJzaW9uPSIxLjEiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4Lm1haWw7dmVyc2lvbj0iMS40IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC5tYW5hZ2VtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4Lm1haWwuaW50ZXJuZXQ7dmVyc2lvbj0iMS40IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC5tYWlsLnV0aWw7dmVyc2lvbj0iMS40IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC5uYW1pbmc7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgucm1pO3Jlc29sdXRpb246PW9wdGlvbmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LndzZGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgud3NkbC5leHRlbnNpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgud3NkbC5mYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LndzZGwueG1sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5wYXJzZXJzO3Jlc29sdXRpb246PW9wdGlvbmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW07cmVzb2x1dGlvbjo9b3B0aW9uYWw7dmVyc2lvbj0iMS4wIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwudHJhbnNmb3JtO3Jlc29sdXRpb246PW9wdGlvbmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tO3Jlc29sdXRpb246PW9wdGlvbmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtO3Jlc29sdXRpb246PW9wdGlvbmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20uKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmNvbW1vbnMuZmlsZXVwbG9hZC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50LiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5jb21tb25zLmxhbmc7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5odHRwO3Jlc29sdXRpb246PW9wdGlvbmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuaHR0cC5lbnRpdHk7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5odHRwLmltcGw7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5odHRwLmltcGwuZW50aXR5O3Jlc29sdXRpb246PW9wdGlvbmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuaHR0cC5pbXBsLmlvO3Jlc29sdXRpb246PW9wdGlvbmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuaHR0cC5pbztyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmh0dHAubWVzc2FnZTtyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmh0dHAucGFyYW1zO3Jlc29sdXRpb246PW9wdGlvbmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuaHR0cC5wcm90b2NvbDtyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmh0dHAudXRpbDtyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLm5lZXRoaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLndvZGVuLio7dmVyc2lvbj0iMC4wLjAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuaml2ZXNvZnR3YXJlLnNtYWNrLio7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLnczYy5kb207cmVzb2x1dGlvbjo9b3B0aW9uYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLnhtbC5zYXg7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICA8L0ltcG9ydC1QYWNrYWdlPgotICAgICAgICAgICAgICAgICAgICAgICAgPFByaXZhdGUtUGFja2FnZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLm9zZ2kuaW50ZXJuYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICA8L1ByaXZhdGUtUGFja2FnZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxCdW5kbGUtQWN0aXZhdG9yPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIub3NnaS5pbnRlcm5hbC5BY3RpdmF0b3IKLSAgICAgICAgICAgICAgICAgICAgICAgIDwvQnVuZGxlLUFjdGl2YXRvcj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxFeHBvcnQtU2VydmljZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgICAgIDwvRXhwb3J0LVNlcnZpY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8QnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSjJTRS0xLjUKLSAgICAgICAgICAgICAgICAgICAgICAgIDwvQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDwvaW5zdHJ1Y3Rpb25zPgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxzb3VyY2U+MS41PC9zb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx0YXJnZXQ+MS41PC90YXJnZXQ+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgIDwvcGx1Z2lucz4KLSAgICA8L2J1aWxkPgotCi0gICAgPGRlcGVuZGVuY2llcz4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5zZXJ2bGV0PC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2VydmxldC1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4yLjQ8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLWFkYjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7dmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczIta2VybmVsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHt2ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZmVsaXg8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5vcmcub3NnaS5jb3JlPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MS4wLjA8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi10cmFuc3BvcnQtaHR0cDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7dmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLXRyYW5zcG9ydC1sb2NhbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7dmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmZlbGl4PC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+b3JnLm9zZ2kuY29tcGVuZGl1bTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMC4wPC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KLSAgICAgICAgICAgIDxleGNsdXNpb25zPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZmVsaXg8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmphdmF4LnNlcnZsZXQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5mZWxpeDwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+b3JnLm9zZ2kuZm91bmRhdGlvbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgIDwvZXhjbHVzaW9ucz4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgIDwvZGVwZW5kZW5jaWVzPgotCi0KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL29zZ2kvcmVzb3VyY2VzL29yZy9hcGFjaGUvYXhpczIvb3NnaS9kZXBsb3ltZW50L2F4aXMyLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL29zZ2kvcmVzb3VyY2VzL29yZy9hcGFjaGUvYXhpczIvb3NnaS9kZXBsb3ltZW50L2F4aXMyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjJmNDdkMy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9vc2dpL3Jlc291cmNlcy9vcmcvYXBhY2hlL2F4aXMyL29zZ2kvZGVwbG95bWVudC9heGlzMi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMzcgKzAsMCBAQAotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+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+DQotDQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvb3NnaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9leHRlbnNpb25zL29zZ2kvdXRpbC9Mb2dnZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL29zZ2kvc3JjL29yZy9hcGFjaGUvYXhpczIvZXh0ZW5zaW9ucy9vc2dpL3V0aWwvTG9nZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczNGNkMjMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvb3NnaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9leHRlbnNpb25zL29zZ2kvdXRpbC9Mb2dnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5leHRlbnNpb25zLm9zZ2kudXRpbDsNCi0NCi1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7DQotaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UubG9nLkxvZ1NlcnZpY2U7DQotaW1wb3J0IG9yZy5vc2dpLnV0aWwudHJhY2tlci5TZXJ2aWNlVHJhY2tlcjsNCi0NCi1wdWJsaWMgY2xhc3MgTG9nZ2VyIGV4dGVuZHMgU2VydmljZVRyYWNrZXIgew0KLSAgICBwdWJsaWMgTG9nZ2VyKEJ1bmRsZUNvbnRleHQgY29udGV4dCl7DQotICAgICAgICBzdXBlcihjb250ZXh0LCBMb2dTZXJ2aWNlLmNsYXNzLmdldE5hbWUoKSwgbnVsbCk7DQotICAgICAgICBvcGVuKCk7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyBMb2dTZXJ2aWNlIGdldExvZ1NlcnZpY2UoKXsNCi0gICAgICAgIHJldHVybiAoTG9nU2VydmljZSl0aGlzLmdldFNlcnZpY2UoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBsb2coaW50IGksIGphdmEubGFuZy5TdHJpbmcgcykgew0KLSAgICAgICAgTG9nU2VydmljZSBzZXJ2aWNlID0gZ2V0TG9nU2VydmljZSgpOw0KLSAgICAgICAgaWYoc2VydmljZSAhPSBudWxsKXsNCi0gICAgICAgICAgICBzZXJ2aWNlLmxvZyhpLCBzKTsNCi0gICAgICAgICAgICAvL3JldHVybjsNCi0gICAgICAgIH0NCi0gICAgICAgIHByaW50KGksIHMpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBwcmludChpbnQgaSwgU3RyaW5nIHMpIHsNCi0gICAgICAgIHN3aXRjaChpKXsNCi0gICAgICAgICAgICAgICAgY2FzZSBMb2dTZXJ2aWNlLkxPR19FUlJPUjogDQotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIltFUlJPUl0gICAiKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBMb2dTZXJ2aWNlLkxPR19JTkZPOiANCi0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiW0lORk9dICAgICIpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIExvZ1NlcnZpY2UuTE9HX1dBUk5JTkc6IA0KLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJbV0FSTklOR10iKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBMb2dTZXJ2aWNlLkxPR19ERUJVRzogDQotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIltERUJVR10gICAiKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICB9DQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiA6ICIgKyBzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBsb2coaW50IGksIGphdmEubGFuZy5TdHJpbmcgcywgamF2YS5sYW5nLlRocm93YWJsZSB0aHJvd2FibGUpIHsNCi0gICAgICAgIExvZ1NlcnZpY2Ugc2VydmljZSA9IGdldExvZ1NlcnZpY2UoKTsNCi0gICAgICAgIGlmKHNlcnZpY2UgIT0gbnVsbCl7DQotICAgICAgICAgICAgc2VydmljZS5sb2coaSwgcywgdGhyb3dhYmxlKTsNCi0gICAgICAgICAgICAvL3JldHVybjsNCi0gICAgICAgIH0NCi0gICAgICAgIHByaW50KGksIHMpOw0KLSAgICAgICAgdGhyb3dhYmxlLnByaW50U3RhY2tUcmFjZShTeXN0ZW0ub3V0KTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9vc2dpL3NyYy9vcmcvYXBhY2hlL2F4aXMyL29zZ2kvT1NHaUF4aXNTZXJ2bGV0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9vc2dpL3NyYy9vcmcvYXBhY2hlL2F4aXMyL29zZ2kvT1NHaUF4aXNTZXJ2bGV0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkYWNhNGIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvb3NnaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9vc2dpL09TR2lBeGlzU2VydmxldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA0LDIwMDUgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLm9zZ2k7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0NvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLm9zZ2kuZGVwbG95bWVudC5PU0dpQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuQXhpc1NlcnZsZXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5MaXN0aW5nQWdlbnQ7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlNlcnZpY2VSZWZlcmVuY2U7Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb25maWc7Ci1pbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dDsKLWltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247Ci0KLS8qKgotICogVGhpcyBzZXJ2bGV0IGlzIHVzZWQgd2l0aCB0aGUgYXNzb2NpYXRpb24gb2YgSHR0cFNlcnZpY2UuCi0gKiBUaGlzIGlzIHRoZSBlbnRyeSBwb2ludCB0byBhbGwgcmVxdWVzdHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBPU0dpQXhpc1NlcnZsZXQgZXh0ZW5kcyBBeGlzU2VydmxldCB7Ci0KLSAgICBwcml2YXRlIEJ1bmRsZUNvbnRleHQgY29udGV4dDsKLQotICAgIC8qKgotICAgICAqIE9TR2lBeGlzU2VydmxldCBuZWVkcyBhbiByZWZlcmVuYyB0byBPU0dpIGVudmlyb25tZW50YgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbnRleHQgQnVuZGxlQ29udGV4dAotICAgICAqLwotICAgIHB1YmxpYyBPU0dpQXhpc1NlcnZsZXQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCBpbml0KFNlcnZsZXRDb25maWcgc2VydmxldENvbmZpZykgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24gewotICAgICAgICB0aGlzLnNlcnZsZXRDb25maWcgPSBzZXJ2bGV0Q29uZmlnOwotICAgICAgICBTZXJ2aWNlUmVmZXJlbmNlIHJlZmVyZW5jZSA9Ci0gICAgICAgICAgICAgICAgY29udGV4dC5nZXRTZXJ2aWNlUmVmZXJlbmNlKENvbmZpZ3VyYXRpb25Db250ZXh0LmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIGlmIChyZWZlcmVuY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICJBbiBpbnN0YW5jZSBvZiBDb25maWd1cmF0aW9uQ29udGV4dCBpcyBub3QgYXZhaWxhYmxlIHRvIGNvbnRpbnVlIHRoZSBwcm9jY2Vzcy4iKTsKLSAgICAgICAgfQotICAgICAgICBjb25maWdDb250ZXh0ID0gKENvbmZpZ3VyYXRpb25Db250ZXh0KSBjb250ZXh0LmdldFNlcnZpY2UocmVmZXJlbmNlKTsKLSAgICAgICAgYXhpc0NvbmZpZ3VyYXRpb24gPSBjb25maWdDb250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgIGFnZW50ID0gbmV3IExpc3RpbmdBZ2VudChjb25maWdDb250ZXh0KTsKLSAgICAgICAgaW5pdFBhcmFtcygpOwotICAgICAgICBTZXJ2bGV0Q29udGV4dCBzZXJ2bGV0Q29udGV4dCA9IHNlcnZsZXRDb25maWcuZ2V0U2VydmxldENvbnRleHQoKTsKLSAgICAgICAgaWYgKHNlcnZsZXRDb250ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNlcnZsZXRDb250ZXh0LnNldEF0dHJpYnV0ZSh0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpLCB0aGlzKTsKLSAgICAgICAgfQotCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvb3NnaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9vc2dpL2NvcmUvU09BUFByb3ZpZGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9vc2dpL3NyYy9vcmcvYXBhY2hlL2F4aXMyL29zZ2kvY29yZS9TT0FQUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTgzZjJjNy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9vc2dpL3NyYy9vcmcvYXBhY2hlL2F4aXMyL29zZ2kvY29yZS9TT0FQUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIub3NnaS5jb3JlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5vc2dpLmNvcmUud2ViLldlYkFwcDsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSAqIFNPQVBQcm92aWRlciBpcyBhbiBpbnRlcmZhY2UgZm9yIGdlbmVyaWMgU09BUCBmdW5jdGlvbmFsaXR5LgotICogVXNlIHRoaXMgaW50ZXJmYWNlIHRvIHJlZ2lzdGVyIFNPQVBQcm92aWRlciBzZXJ2aWNlcyB3aXRoIHRoZSBPU0dpCi0gKiBydW50aW1lIHVzaW5nIHRoZSA8Y29kZT5CdW5kbGVDb250ZXh0LnJlZ2lzdGVyU2VydmljZSgpPC9jb2RlPiBtZXRob2RzLgotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgU09BUFByb3ZpZGVyIHsKLQotICAgIC8qKgotICAgICAqIFRoZSBuYW1lIG9mIHRoZSBTT0FQUHJvdmlkZXIgaW1wbGVtZW50YXRpb24uIFVzZSB0aGlzIGFzIHRoZSBrZXkgd2hlbiBjb25zdHJ1Y3RpbmcKLSAgICAgKiB0aGUgc2VydmljZSdzIHByb3BlcnRpZXMgZm9yIHJlZ2lzdHJhdGlvbiB3aXRoIHRoZSBPU0dpIHJ1bnRpbWUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPVklERVJfTkFNRSA9ICJOYW1lIjsKLQotICAgIC8qKgotICAgICAqIFRoZSBtYWpvciB2ZXJzaW9uIG9mIHRoZSBTT0FQUHJvdmlkZXIgaW1wbGVtZW50YXRpb24uIFVzZSB0aGlzIGFzIHRoZSBrZXkgd2hlbiBjb25zdHJ1Y3RpbmcKLSAgICAgKiB0aGUgc2VydmljZSdzIHByb3BlcnRpZXMgZm9yIHJlZ2lzdHJhdGlvbiB3aXRoIHRoZSBPU0dpIHJ1bnRpbWUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPVklERVJfTUFKT1JfVkVSU0lPTiA9ICJNYWpvclZlcnNpb24iOwotCi0gICAgLyoqCi0gICAgICogVGhlIG1pbm9yIHZlcnNpb24gb2YgdGhlIFNPQVBQcm92aWRlciBpbXBsZW1lbnRhdGlvbi4gVXNlIHRoaXMgYXMgdGhlIGtleSB3aGVuIGNvbnN0cnVjdGluZwotICAgICAqIHRoZSBzZXJ2aWNlJ3MgcHJvcGVydGllcyBmb3IgcmVnaXN0cmF0aW9uIHdpdGggdGhlIE9TR2kgcnVudGltZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9WSURFUl9NSU5PUl9WRVJTSU9OID0gIk1pbm9yVmVyc2lvbiI7Ci0KLSAgICAvKioKLSAgICAgKiBHZXR0ZXIgbWV0aG9kIGZvciB0aGUgaW1wbGVtZW50YXRpb24ncyBwcm92aWRlciBuYW1lLiBUaGlzIG5hbWUgc2hvdWxkIGJlIHRoZSBzYW1lCi0gICAgICogYXMgdGhlIG9uZSB1c2VkIGR1cmluZyB0aGUgcmVnaXN0cmF0aW9uIG9mIHRoZSBTT0FQUHJvdmlkZXIgc2VydmljZQotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgUHJvdmlkZXIgTmFtZQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvdmlkZXJOYW1lKCk7Ci0KLSAgICAvKioKLSAgICAgKiBHZXR0ZXIgbWV0aG9kIGZvciB0aGUgaW1wbGVtZW50YXRpb24ncyB2ZXJzaW9uLiBUaGlzIG5hbWUgc2hvdWxkIGJlIGNvbnN0cnVjdGVkCi0gICAgICogZnJvbSB0aGUgbWFqb3IgYW5kIG1pbm9yIHZlcnNpb25zIHVzZWQgZHVyaW5nIHJlZ2lzdHJhdGlvbiBvZiB0aGUgU09BUFByb3ZpZGVyIHNlcnZpY2UuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBQcm92aWRlciBWZXJzaW9uCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm92aWRlclZlcnNpb24oKTsKLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvdmlkZXJFbmdpbmUoKTsKLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvdmlkZXJEZXBsb3llcigpOwotCi0gICAgcHVibGljIE9iamVjdCBnZXRQcm92aWRlckRlcGxveWVyKFdlYkFwcCB3ZWJBcHApOwotCi0gICAgLyoqCi0gICAgICogRGVwbG95cyBhbiBPYmplY3QgYXMgYSBXZWJTZXJ2aWNlIHVzaW5nIHRoZSBpbXBsZW1lbnRhdGlvbidzIGRlZmF1bHQgYmluZGluZyB0eXBlLgotICAgICAqIFRoZSBzZXJ2aWNlIGlzIGRlcGxveWVkIGludG8gdGhlIHByb3ZpZGVyJ3MgZGVmYXVsdCBhcHBsaWNhdGlvbiBjb250ZXh0LgotICAgICAqCi0gICAgICogQHBhcmFtIHNydk5hbWUgICB0aGUgZGlzcGxheSBuYW1lIG9mIHRoZSBzZXJ2aWNlCi0gICAgICogQHBhcmFtIHNydkNsYXNzICB0aGUgY2xhc3Mgb3IgaW50ZXJmYWNlIHRoYXQgc2hvdWxkIGJlIGV4cG9zZWQuIFNwZWNpZnlpbmcgYW4gaW50ZXJmYWNlCi0gICAgICogICAgICAgICAgICAgICAgICBhbGxvd3Mgb25seSB0aGUgZGVzaXJlZCBtZXRob2RzIG9mIHRoZSBzZXJ2aWNlIG9iamVjdCB0byBiZSBwdWJsaXNoZWQuCi0gICAgICogQHBhcmFtIHNydk9iamVjdCB0aGUgYWN0dWFsIGltcGxlbWVudGF0aW9uCi0gICAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkZXBsb3lTZXJ2aWNlKFN0cmluZyBzcnZOYW1lLCBDbGFzcyBzcnZDbGFzcywgT2JqZWN0IHNydk9iamVjdCwgU3RyaW5nIGhhbmRsZXJDaGFpbikgdGhyb3dzIEV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIERlcGxveXMgYW4gT2JqZWN0IGFzIGEgV2ViU2VydmljZSB1c2luZyBhIHNwZWNpZmllZCBiaW5kaW5nIHR5cGUKLSAgICAgKiBUaGUgc2VydmljZSBpcyBkZXBsb3llZCBpbnRvIHRoZSBwcm92aWRlcidzIGRlZmF1bHQgYXBwbGljYXRpb24gY29udGV4dC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzcnZOYW1lICAgICB0aGUgZGlzcGxheSBuYW1lIG9mIHRoZSBzZXJ2aWNlCi0gICAgICogQHBhcmFtIGJpbmRpbmdUeXBlIHRoZSBuYW1lIG9mIHRoZSBkZXNpcmVkIGJpbmRpbmcgdHlwZQotICAgICAqIEBwYXJhbSBzcnZDbGFzcyAgICB0aGUgY2xhc3Mgb3IgaW50ZXJmYWNlIHRoYXQgc2hvdWxkIGJlIGV4cG9zZWQuIFNwZWNpZnlpbmcgYW4gaW50ZXJmYWNlCi0gICAgICogICAgICAgICAgICAgICAgICAgIGFsbG93cyBvbmx5IHRoZSBkZXNpcmVkIG1ldGhvZHMgb2YgdGhlIHNlcnZpY2Ugb2JqZWN0IHRvIGJlIHB1Ymxpc2hlZC4KLSAgICAgKiBAcGFyYW0gc3J2T2JqZWN0ICAgdGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbgotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGVwbG95U2VydmljZShTdHJpbmcgc3J2TmFtZSwgU3RyaW5nIGJpbmRpbmdUeXBlLCBDbGFzcyBzcnZDbGFzcywgT2JqZWN0IHNydk9iamVjdCwgU3RyaW5nIGhhbmRsZXJDaGFpbikgdGhyb3dzIEV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIERlcGxveXMgYW4gT2JqZWN0IGFzIGEgV2ViU2VydmljZSB1c2luZyB0aGUgcHJvdmlkZXIncyBkZWZhdWx0IGJpbmRpbmcgdHlwZS4KLSAgICAgKiBUaGUgc2VydmljZSBpcyBkZXBsb3llZCBpbnRvIHRoZSBzcGVjaWZpZWQgPGNvZGU+V2ViQXBwPC9jb2RlPiBjb250ZXh0Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gd2ViQXBwICAgIHRoZSB0YXJnZXQgd2ViIGFwcGxpY2F0aW9uIGNvbnRleHQKLSAgICAgKiBAcGFyYW0gc3J2TmFtZSAgIHRoZSBkaXNwbGF5IG5hbWUgb2YgdGhlIHNlcnZpY2UKLSAgICAgKiBAcGFyYW0gc3J2Q2xhc3MgIHRoZSBjbGFzcyBvciBpbnRlcmZhY2UgdGhhdCBzaG91bGQgYmUgZXhwb3NlZC4gU3BlY2lmeWluZyBhbiBpbnRlcmZhY2UKLSAgICAgKiAgICAgICAgICAgICAgICAgIGFsbG93cyBvbmx5IHRoZSBkZXNpcmVkIG1ldGhvZHMgb2YgdGhlIHNlcnZpY2Ugb2JqZWN0IHRvIGJlIHB1Ymxpc2hlZC4KLSAgICAgKiBAcGFyYW0gc3J2T2JqZWN0IHRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb24KLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRlcGxveVNlcnZpY2UoV2ViQXBwIHdlYkFwcCwgU3RyaW5nIHNydk5hbWUsIENsYXNzIHNydkNsYXNzLCBPYmplY3Qgc3J2T2JqZWN0LCBTdHJpbmcgaGFuZGxlckNoYWluKSB0aHJvd3MgRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogRGVwbG95cyBhbiBPYmplY3QgYXMgYSBXZWJTZXJ2aWNlIHVzaW5nIGEgc3BlY2lmaWVkIGJpbmRpbmcgdHlwZQotICAgICAqIFRoZSBzZXJ2aWNlIGlzIGRlcGxveWVkIGludG8gdGhlIHNwZWNpZmllZCA8Y29kZT5XZWJBcHA8L2NvZGU+IGNvbnRleHQKLSAgICAgKgotICAgICAqIEBwYXJhbSB3ZWJBcHAgICAgICB0aGUgdGFyZ2V0IHdlYiBhcHBsaWNhdGlvbiBjb250ZXh0Ci0gICAgICogQHBhcmFtIHNydk5hbWUgICAgIHRoZSBkaXNwbGF5IG5hbWUgb2YgdGhlIHNlcnZpY2UKLSAgICAgKiBAcGFyYW0gYmluZGluZ1R5cGUgdGhlIG5hbWUgb2YgdGhlIGRlc2lyZWQgYmluZGluZyB0eXBlCi0gICAgICogQHBhcmFtIHNydkNsYXNzICAgIHRoZSBjbGFzcyBvciBpbnRlcmZhY2UgdGhhdCBzaG91bGQgYmUgZXhwb3NlZC4gU3BlY2lmeWluZyBhbiBpbnRlcmZhY2UKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgYWxsb3dzIG9ubHkgdGhlIGRlc2lyZWQgbWV0aG9kcyBvZiB0aGUgc2VydmljZSBvYmplY3QgdG8gYmUgcHVibGlzaGVkLgotICAgICAqIEBwYXJhbSBzcnZPYmplY3QgICB0aGUgYWN0dWFsIGltcGxlbWVudGF0aW9uCi0gICAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkZXBsb3lTZXJ2aWNlKFdlYkFwcCB3ZWJBcHAsIFN0cmluZyBzcnZOYW1lLCBTdHJpbmcgYmluZGluZ1R5cGUsIENsYXNzIHNydkNsYXNzLCBPYmplY3Qgc3J2T2JqZWN0LCBTdHJpbmcgaGFuZGxlckNoYWluKSB0aHJvd3MgRXhjZXB0aW9uOwotCi0gICAgcHVibGljIHZvaWQgdW5kZXBsb3lTZXJ2aWNlKFN0cmluZyBzcnZOYW1lLCBDbGFzcyBzcnZDbGFzcykgdGhyb3dzIEV4Y2VwdGlvbjsKLQotICAgIHB1YmxpYyB2b2lkIHVuZGVwbG95U2VydmljZShXZWJBcHAgd2ViQXBwLCBTdHJpbmcgc3J2TmFtZSwgQ2xhc3Mgc3J2Q2xhc3MpIHRocm93cyBFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGEgd2ViIGFwcGxpY2F0aW9uIGZyb20gdGhlIHByb3ZpZGVyIGZvciB0aGUgZ2l2ZW4gY29udGV4dCBwYXRoLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbnRleHRQYXRoIHRoZSBjb250ZXh0IHBhdGggb2YgdGhlIGRlc2lyZWQgV2ViQXBwCi0gICAgICogQHBhcmFtIGNyZWF0ZSAgICAgIGlmIDxjb2RlPnRydWU8L2NvZGU+LCBjcmVhdGUgdGhlIFdlYkFwcCBpZiBpdCBkb2VzIG5vdCBleGl0cy4KLSAgICAgKiBAcmV0dXJuIHJldHVybiB0aGUgV2ViQXBwCi0gICAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgV2ViQXBwIGdldFdlYkFwcChTdHJpbmcgY29udGV4dFBhdGgsIGJvb2xlYW4gY3JlYXRlKSB0aHJvd3MgRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogR2V0cyBhIHdlYiBhcHBsaWNhdGlvbiBmcm9tIHRoZSBwcm92aWRlciBmb3IgdGhlIGdpdmVuIGNvbnRleHQgcGF0aCwgdXNpbmcKLSAgICAgKiB0aGUgcHJvdmlkZWQgYnVuZGxlIGFzIHRoZSBsb2NhdGlvbiBmb3IgdGhlIGVuZ2luZSdzIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb250ZXh0UGF0aCB0aGUgY29udGV4dCBwYXRoIG9mIHRoZSBkZXNpcmVkIFdlYkFwcAotICAgICAqIEBwYXJhbSBjcmVhdGUgICAgICBpZiA8Y29kZT50cnVlPC9jb2RlPiwgY3JlYXRlIHRoZSBXZWJBcHAgaWYgaXQgZG9lcyBub3QgZXhpdHMuCi0gICAgICogQHJldHVybiByZXR1cm4gdGhlIFdlYkFwcAotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAgICovCi0JcHVibGljIFdlYkFwcCBnZXRXZWJBcHAoQnVuZGxlIGJ1bmRsZSwgU3RyaW5nIGNvbnRleHRQYXRoLCBib29sZWFuIGNyZWF0ZSkgdGhyb3dzIEV4Y2VwdGlvbjsKLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvb3NnaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9vc2dpL2NvcmUvd2ViL1NlcnZsZXREZXNjcmlwdG9yLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9vc2dpL3NyYy9vcmcvYXBhY2hlL2F4aXMyL29zZ2kvY29yZS93ZWIvU2VydmxldERlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNhZGMwNC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9vc2dpL3NyYy9vcmcvYXBhY2hlL2F4aXMyL29zZ2kvY29yZS93ZWIvU2VydmxldERlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5vc2dpLmNvcmUud2ViOwotCi1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0OwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLS8qKgotICoKLSAqIFNlcnZsZXREZXNjcmlwdG9yIGEgdXRpbGl0eSBjbGFzcyBmb3IgZGVzY3JpYmluZyBTZXJ2bGV0cyB0byBiZSBkZXBsb3llZCBpbnRvIGEgV2ViQXBwCi0gKi8KLQotcHVibGljIGNsYXNzIFNlcnZsZXREZXNjcmlwdG9yIHsKLQlwcm90ZWN0ZWQgSGFzaHRhYmxlIGluaXRQYXJhbWV0ZXJzOwotCi0JcHJvdGVjdGVkIEh0dHBTZXJ2bGV0IHNlcnZsZXQ7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHN1YkNvbnRleHQ7Ci0KLQlwdWJsaWMgU2VydmxldERlc2NyaXB0b3IoU3RyaW5nIHN1YkNvbnRleHQsIEh0dHBTZXJ2bGV0IHNlcnZsZXQpIHsKLQkJdGhpcy5zdWJDb250ZXh0ID0gc3ViQ29udGV4dDsKLQkJdGhpcy5zZXJ2bGV0ID0gc2VydmxldDsKLQl9Ci0KLSAgICBwdWJsaWMgSGFzaHRhYmxlIGdldEluaXRQYXJhbWV0ZXJzKCkgewotICAgICAgICByZXR1cm4gaW5pdFBhcmFtZXRlcnM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SW5pdFBhcmFtZXRlcnMoSGFzaHRhYmxlIGluaXRQYXJhbWV0ZXJzKSB7Ci0gICAgICAgIHRoaXMuaW5pdFBhcmFtZXRlcnMgPSBpbml0UGFyYW1ldGVyczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSHR0cFNlcnZsZXQgZ2V0U2VydmxldCgpIHsKLSAgICAgICAgcmV0dXJuIHNlcnZsZXQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2VydmxldChIdHRwU2VydmxldCBzZXJ2bGV0KSB7Ci0gICAgICAgIHRoaXMuc2VydmxldCA9IHNlcnZsZXQ7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRTdWJDb250ZXh0KCkgewotICAgICAgICByZXR1cm4gc3ViQ29udGV4dDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTdWJDb250ZXh0KFN0cmluZyBzdWJDb250ZXh0KSB7Ci0gICAgICAgIHRoaXMuc3ViQ29udGV4dCA9IHN1YkNvbnRleHQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvb3NnaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9vc2dpL2NvcmUvd2ViL1dlYkFwcC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvb3NnaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9vc2dpL2NvcmUvd2ViL1dlYkFwcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2NhNDI4Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL29zZ2kvc3JjL29yZy9hcGFjaGUvYXhpczIvb3NnaS9jb3JlL3dlYi9XZWJBcHAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIub3NnaS5jb3JlLndlYjsKLQotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlNlcnZpY2VSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5odHRwLkh0dHBDb250ZXh0OwotaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UuaHR0cC5IdHRwU2VydmljZTsKLQotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7Ci1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi0vKioKLSAqCi0gKiBXZWJBcHAgaXMgYSB1dGlsaXR5IGNsYXNzIGZvciBkZXNjcmliaW5nIGEgV2ViQXBwbGljYXRpb24gdG8gYmUgZGVwbG95ZWQgaW50byBhbiBPU0dpCi0gKiBIVFRQIFNlcnZpY2UgaW1wbGVtZW50YXRpb24uIFRoZSBXZWJBcHAgaW1wbGVtZW50YXRpb24gZXh0ZW5kcyB0aGUgT1NHaSA8Y29kZT5IdHRwQ29udGV4dDwvY29kZT4uCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJBcHAgaW1wbGVtZW50cyBIdHRwQ29udGV4dCB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBXZWJBcHBEZXNjcmlwdG9yIHdlYkFwcERlc2NyaXB0b3IgPSBudWxsOwotCi0JcHJvdGVjdGVkIEh0dHBTZXJ2aWNlIGh0dHBTZXJ2aWNlOwotCi0JcHJvdGVjdGVkIFNlcnZpY2VSZWZlcmVuY2Ugc1JlZjsKLQotCXB1YmxpYyBXZWJBcHAoV2ViQXBwRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0JCXdlYkFwcERlc2NyaXB0b3IgPSBkZXNjcmlwdG9yOwotCX0KLQotCS8vIFJldHVybiBudWxsIGFuZCBsZXQgdGhlIEhUVFAgZGV0ZXJtaW5lIHRoZSB0eXBlCi0JcHVibGljIFN0cmluZyBnZXRNaW1lVHlwZShTdHJpbmcgcmVxRW50cnkpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLy8gR2V0IHRoZSByZXNvdXJjZSBmcm9tIHRoZSBqYXIgZmlsZSwgdXNlIHRoZSBjbGFzcyBsb2FkZXIgdG8gZG8gaXQKLQlwdWJsaWMgVVJMIGdldFJlc291cmNlKFN0cmluZyBuYW1lKSB7Ci0JCVVSTCB1cmwgPSBnZXRDbGFzcygpLmdldFJlc291cmNlKG5hbWUpOwotCi0JCXJldHVybiB1cmw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFuZGxlU2VjdXJpdHkoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCi0JCQlIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFN0YXJ0cyB0aGUgV2ViQXBwCi0JICogQHBhcmFtIGJjIHRoZSBCdW5kbGVDb250ZXh0IG9mIHRoZSBXZWJBcHAgaG9zdAotCSAqIEB0aHJvd3MgQnVuZGxlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBiYykgdGhyb3dzIEJ1bmRsZUV4Y2VwdGlvbiB7Ci0JCWlmICgoc1JlZiA9IGJjLmdldFNlcnZpY2VSZWZlcmVuY2UoIm9yZy5vc2dpLnNlcnZpY2UuaHR0cC5IdHRwU2VydmljZSIpKSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IEJ1bmRsZUV4Y2VwdGlvbigiRmFpbGVkIHRvIGdldCBIdHRwU2VydmljZVJlZmVyZW5jZSIpOwotCQlpZiAoKGh0dHBTZXJ2aWNlID0gKEh0dHBTZXJ2aWNlKSBiYy5nZXRTZXJ2aWNlKHNSZWYpKSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IEJ1bmRsZUV4Y2VwdGlvbigiRmFpbGVkIHRvIGdldCBIdHRwU2VydmljZSIpOwotCQl0cnkgewotCQkJV2ViQXBwRGVzY3JpcHRvciB3YWQgPSB3ZWJBcHBEZXNjcmlwdG9yOwotCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHdhZC5zZXJ2bGV0Lmxlbmd0aDsgaSsrKSB7Ci0JCQkJU2VydmxldERlc2NyaXB0b3Igc2VydmxldCA9IHdhZC5zZXJ2bGV0W2ldOwotCi0JCQkJaHR0cFNlcnZpY2UucmVnaXN0ZXJTZXJ2bGV0KHdhZC5jb250ZXh0ICsgc2VydmxldC5zdWJDb250ZXh0LAotCQkJCQkJc2VydmxldC5zZXJ2bGV0LCBzZXJ2bGV0LmluaXRQYXJhbWV0ZXJzLCB0aGlzKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl0aHJvdyBuZXcgQnVuZGxlRXhjZXB0aW9uKCJGYWlsZWQgdG8gcmVnaXN0ZXIgc2VydmxldHMiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFN0b3BzIHRoZSBXZWJBcHAKLQkgKiBAcGFyYW0gYmMgdGhlIEJ1bmRsZUNvbnRleHQgb2YgdGhlIFdlYkFwcCBob3N0Ci0JICogQHRocm93cyBCdW5kbGVFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgYmMpIHRocm93cyBCdW5kbGVFeGNlcHRpb24gewotCQl0cnkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB3ZWJBcHBEZXNjcmlwdG9yLnNlcnZsZXQubGVuZ3RoOyBpKyspIHsKLQkJCQlTZXJ2bGV0RGVzY3JpcHRvciBzZXJ2bGV0ID0gd2ViQXBwRGVzY3JpcHRvci5zZXJ2bGV0W2ldOwotCi0JCQkJaHR0cFNlcnZpY2UudW5yZWdpc3Rlcih3ZWJBcHBEZXNjcmlwdG9yLmNvbnRleHQKLQkJCQkJCSsgc2VydmxldC5zdWJDb250ZXh0KTsKLQkJCX0KLQkJCWJjLnVuZ2V0U2VydmljZShzUmVmKTsKLQkJCWh0dHBTZXJ2aWNlID0gbnVsbDsKLQkJCXdlYkFwcERlc2NyaXB0b3IgPSBudWxsOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IEJ1bmRsZUV4Y2VwdGlvbigiRmFpbGVkIHRvIHVucmVnaXN0ZXIgcmVzb3VyY2VzIiwgZSk7Ci0JCX0KLQl9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFdlYkFwcERlc2NyaXB0b3IgZ2V0V2ViQXBwRGVzY3JpcHRvcigpIHsKLSAgICAgICAgcmV0dXJuIHdlYkFwcERlc2NyaXB0b3I7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFdlYkFwcERlc2NyaXB0b3IoV2ViQXBwRGVzY3JpcHRvciB3ZWJBcHBEZXNjcmlwdG9yKSB7Ci0gICAgICAgIFdlYkFwcC53ZWJBcHBEZXNjcmlwdG9yID0gd2ViQXBwRGVzY3JpcHRvcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSHR0cFNlcnZpY2UgZ2V0SHR0cFNlcnZpY2UoKSB7Ci0gICAgICAgIHJldHVybiBodHRwU2VydmljZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRIdHRwU2VydmljZShIdHRwU2VydmljZSBodHRwU2VydmljZSkgewotICAgICAgICB0aGlzLmh0dHBTZXJ2aWNlID0gaHR0cFNlcnZpY2U7Ci0gICAgfQotCi0gICAgcHVibGljIFNlcnZpY2VSZWZlcmVuY2UgZ2V0U1JlZigpIHsKLSAgICAgICAgcmV0dXJuIHNSZWY7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U1JlZihTZXJ2aWNlUmVmZXJlbmNlIHNSZWYpIHsKLSAgICAgICAgdGhpcy5zUmVmID0gc1JlZjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9vc2dpL3NyYy9vcmcvYXBhY2hlL2F4aXMyL29zZ2kvY29yZS93ZWIvV2ViQXBwRGVzY3JpcHRvci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvb3NnaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9vc2dpL2NvcmUvd2ViL1dlYkFwcERlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQxNTYxNS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9vc2dpL3NyYy9vcmcvYXBhY2hlL2F4aXMyL29zZ2kvY29yZS93ZWIvV2ViQXBwRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLm9zZ2kuY29yZS53ZWI7Ci0KLS8qKgotICoKLSAqIFdlYkFwcERlc2NyaXB0b3IgaXMgYSB1dGlsaXR5IGNsYXNzIGZvciBjb250YWluaW5nIHRoZSBzdGF0aWMgaW5mb3JtYXRpb24KLSAqIHJlcXVpcmVkIGJ5IHRoZSBXZWJBcHAgY2xhc3MKLSAqLwotCi1wdWJsaWMgY2xhc3MgV2ViQXBwRGVzY3JpcHRvciB7Ci0JcHJvdGVjdGVkIFN0cmluZyBjb250ZXh0OwotCi0JcHJvdGVjdGVkIFNlcnZsZXREZXNjcmlwdG9yW10gc2VydmxldDsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIGNvbnRleHQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q29udGV4dChTdHJpbmcgY29udGV4dCkgewotICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0OwotICAgIH0KLQotICAgIHB1YmxpYyBTZXJ2bGV0RGVzY3JpcHRvcltdIGdldFNlcnZsZXQoKSB7Ci0gICAgICAgIHJldHVybiBzZXJ2bGV0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFNlcnZsZXQoU2VydmxldERlc2NyaXB0b3JbXSBzZXJ2bGV0KSB7Ci0gICAgICAgIHRoaXMuc2VydmxldCA9IHNlcnZsZXQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvb3NnaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9vc2dpL2RlcGxveW1lbnQvQWJzdHJhY3RSZWdpc3RyeS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvb3NnaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9vc2dpL2RlcGxveW1lbnQvQWJzdHJhY3RSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTRhMmZiLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL29zZ2kvc3JjL29yZy9hcGFjaGUvYXhpczIvb3NnaS9kZXBsb3ltZW50L0Fic3RyYWN0UmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNCwyMDA1IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5vc2dpLmRlcGxveW1lbnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlRXZlbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudEhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuTG9jazsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5SZWVudHJhbnRMb2NrOwotCi0vKioKLSAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5vc2dpLmRlcGxveW1lbnQuUmVnaXN0cnkKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UmVnaXN0cnk8Vj4gaW1wbGVtZW50cyBSZWdpc3RyeSB7Ci0KLSAgICBwcm90ZWN0ZWQgTWFwPEJ1bmRsZSwgTGlzdDxWPj4gcmVzb2x2ZWRCdW5kbGVzID0gbmV3IENvbmN1cnJlbnRIYXNoTWFwPEJ1bmRsZSwgTGlzdDxWPj4oKTsKLQotICAgIHByb3RlY3RlZCBMaXN0PEJ1bmRsZT4gdW5yZXNsb3ZlZEJ1bmRsZXMgPSBuZXcgQXJyYXlMaXN0PEJ1bmRsZT4oKTsKLQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2NrIGxvY2sgPSBuZXcgUmVlbnRyYW50TG9jaygpOwotCi0gICAgcHJvdGVjdGVkIEJ1bmRsZUNvbnRleHQgY29udGV4dDsKLQotICAgIHByb3RlY3RlZCBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDdHg7Ci0KLSAgICBwdWJsaWMgQWJzdHJhY3RSZWdpc3RyeShCdW5kbGVDb250ZXh0IGNvbnRleHQsIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0N0eCkgewotICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0OwotICAgICAgICB0aGlzLmNvbmZpZ0N0eCA9IGNvbmZpZ0N0eDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZXNvbHZlKCkgewotICAgICAgICAvL3RvIGF2b2lkIGNvbmN1cnJlbnQgbW9kaWZpY2F0aW9uCi0gICAgICAgIEJ1bmRsZVtdIGJ1bmRsZXMgPSB1bnJlc2xvdmVkQnVuZGxlcy50b0FycmF5KG5ldyBCdW5kbGVbdW5yZXNsb3ZlZEJ1bmRsZXMuc2l6ZSgpXSk7Ci0gICAgICAgIGZvciAoQnVuZGxlIGJ1bmRsZSA6IGJ1bmRsZXMpIHsKLSAgICAgICAgICAgIHJlZ2lzdGVyKGJ1bmRsZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9vc2dpL3NyYy9vcmcvYXBhY2hlL2F4aXMyL29zZ2kvZGVwbG95bWVudC9CdW5kbGVDbGFzc0xvYWRlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvb3NnaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9vc2dpL2RlcGxveW1lbnQvQnVuZGxlQ2xhc3NMb2FkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc0MDk3YS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9vc2dpL3NyYy9vcmcvYXBhY2hlL2F4aXMyL29zZ2kvZGVwbG95bWVudC9CdW5kbGVDbGFzc0xvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA0LDIwMDUgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLm9zZ2kuZGVwbG95bWVudDsKLQotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLS8qKgotICogVGhpcyBjbGFzc2xvYWRlciB3aWxsIGJlIHVzZWQgd2l0aCBBeGlzU2VydmljZSwgQXhpc01vZHVsZSBldGMKLSAqLwotcHVibGljIGNsYXNzIEJ1bmRsZUNsYXNzTG9hZGVyIGV4dGVuZHMgQ2xhc3NMb2FkZXIgewotCi0gICAgcHJpdmF0ZSBmaW5hbCBCdW5kbGUgYnVuZGxlOwotCi0gICAgcHVibGljIEJ1bmRsZUNsYXNzTG9hZGVyKEJ1bmRsZSBidW5kbGUsIENsYXNzTG9hZGVyIHBhcmVudCkgewotICAgICAgICBzdXBlcihwYXJlbnQpOwotICAgICAgICB0aGlzLmJ1bmRsZSA9IGJ1bmRsZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgQ2xhc3MgZmluZENsYXNzKFN0cmluZyBuYW1lKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gYnVuZGxlLmxvYWRDbGFzcyhuYW1lKTsKLSAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvL1RPRE86IGFkZCB0aGUgcHJvcGVyIGxvZ2dpbmcKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFVSTCBmaW5kUmVzb3VyY2UoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgcmV0dXJuIGJ1bmRsZS5nZXRSZXNvdXJjZShuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRW51bWVyYXRpb24gZmluZFJlc291cmNlcyhTdHJpbmcgbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGJ1bmRsZS5nZXRSZXNvdXJjZXMobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFVSTCBnZXRSZXNvdXJjZShTdHJpbmcgbmFtZSkgewotICAgICAgICByZXR1cm4gZmluZFJlc291cmNlKG5hbWUpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBDbGFzcyBsb2FkQ2xhc3MoU3RyaW5nIG5hbWUsIGJvb2xlYW4gcmVzb2x2ZSkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICBDbGFzcyBjbGF6ejsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNsYXp6ID0gZmluZENsYXNzKG5hbWUpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChyZXNvbHZlKSB7Ci0gICAgICAgICAgICByZXNvbHZlQ2xhc3MoY2xhenopOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjbGF6ejsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2xhc3MgbG9hZENsYXNzKFN0cmluZyBuYW1lKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIENsYXNzIGNsYXp6OwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY2xhenogPSBmaW5kQ2xhc3MobmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNsYXp6OwotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvb3NnaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9vc2dpL2RlcGxveW1lbnQvTW9kdWxlUmVnaXN0cnkuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL29zZ2kvc3JjL29yZy9hcGFjaGUvYXhpczIvb3NnaS9kZXBsb3ltZW50L01vZHVsZVJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1MjU4YjQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvb3NnaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9vc2dpL2RlcGxveW1lbnQvTW9kdWxlUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDQsMjAwNSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIub3NnaS5kZXBsb3ltZW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLlV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQuRGVwbG95bWVudEVuZ2luZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQuTW9kdWxlQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNNb2R1bGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZUdyb3VwOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uVmVyc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLm1vZHVsZXMuTW9kdWxlOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmF4aXMyLm9zZ2kuZGVwbG95bWVudC5PU0dpQXhpczJDb25zdGFudHMuT1NHaV9CVU5ETEVfSUQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi0vKioKLSAqIEBzZWUgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUxpc3RlbmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2R1bGVSZWdpc3RyeSBleHRlbmRzIEFic3RyYWN0UmVnaXN0cnk8QXhpc01vZHVsZT4gewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKE1vZHVsZVJlZ2lzdHJ5LmNsYXNzKTsKLQotICAgIHByaXZhdGUgUmVnaXN0cnkgc2VydmljZVJlZ2lzdHJ5OwotCi0gICAgcHVibGljIE1vZHVsZVJlZ2lzdHJ5KEJ1bmRsZUNvbnRleHQgY29udGV4dCwgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdpc3RyeSBzZXJ2aWNlUmVnaXN0cnkpIHsKLSAgICAgICAgc3VwZXIoY29udGV4dCwgY29uZmlnQ3R4KTsKLSAgICAgICAgdGhpcy5zZXJ2aWNlUmVnaXN0cnkgPSBzZXJ2aWNlUmVnaXN0cnk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVnaXN0ZXIoQnVuZGxlIGJ1bmRsZSkgewotICAgICAgICBsb2NrLmxvY2soKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFkZE1vZHVsZXMoYnVuZGxlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGxvY2sudW5sb2NrKCk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHVuUmVnaXN0ZXIoQnVuZGxlIGJ1bmRsZSwgYm9vbGVhbiB1bmluc3RhbGwpIHsKLSAgICAgICAgbG9jay5sb2NrKCk7Ci0gICAgICAgIHRyeSB7Ci0KLSAgICAgICAgICAgIExpc3Q8QXhpc01vZHVsZT4gbW9kdWxlTGlzdCA9IHJlc29sdmVkQnVuZGxlcy5nZXQoYnVuZGxlKTsKLSAgICAgICAgICAgIGlmIChtb2R1bGVMaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMaXN0PExvbmc+IHN0b3BCdW5kbGVMaXN0ID0gbmV3IEFycmF5TGlzdDxMb25nPigpOwotICAgICAgICAgICAgICAgIGZvciAoQXhpc01vZHVsZSBtb2R1bGUgOiBtb2R1bGVMaXN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIEF4aXNDb25maWd1cmF0aW9uIGF4aXNDb25maWcgPSBjb25maWdDdHguZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGF4aXNDb25maWcuZ2V0U2VydmljZUdyb3VwcygpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBeGlzU2VydmljZUdyb3VwIGF4aXNTZXJ2aWNlR3JvdXAgPSAoQXhpc1NlcnZpY2VHcm91cCkgaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF4aXNTZXJ2aWNlR3JvdXAuaXNFbmdhZ2VkKG1vZHVsZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb25nIHZhbHVlID0gKExvbmcpIGF4aXNTZXJ2aWNlR3JvdXAuZ2V0UGFyYW1ldGVyVmFsdWUoT1NHaV9CVU5ETEVfSUQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3BCdW5kbGVMaXN0LmFkZCh2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgICAgICAgIEhhc2hNYXAgc2VydmljZU1hcCA9IGF4aXNDb25maWcuZ2V0U2VydmljZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbiB2YWx1ZXMgPSBzZXJ2aWNlTWFwLnZhbHVlcygpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKE9iamVjdCB2YWx1ZTEgOiB2YWx1ZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlID0gKEF4aXNTZXJ2aWNlKSB2YWx1ZTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXhpc1NlcnZpY2UuaXNFbmdhZ2VkKG1vZHVsZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb25nIHZhbHVlID0gKExvbmcpIGF4aXNTZXJ2aWNlLmdldFBhcmFtZXRlclZhbHVlKE9TR2lfQlVORExFX0lEKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiAhc3RvcEJ1bmRsZUxpc3QuY29udGFpbnModmFsdWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3BCdW5kbGVMaXN0LmFkZCh2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyYXRvcjEgPSBheGlzU2VydmljZS5nZXRPcGVyYXRpb25zKCk7IGl0ZXJhdG9yMS5oYXNOZXh0KCk7KQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF4aXNPcGVyYXRpb24gYXhpc09wZXJhdGlvbiA9IChBeGlzT3BlcmF0aW9uKSBpdGVyYXRvcjEubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChheGlzT3BlcmF0aW9uLmlzRW5nYWdlZChtb2R1bGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvbmcgdmFsdWUgPSAoTG9uZykgYXhpc09wZXJhdGlvbi5nZXRQYXJhbWV0ZXJWYWx1ZShPU0dpX0JVTkRMRV9JRCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsICYmICFzdG9wQnVuZGxlTGlzdC5jb250YWlucyh2YWx1ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3BCdW5kbGVMaXN0LmFkZCh2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgTW9kdWxlIG1vZHVsZUludGVyZmFjZSA9IG1vZHVsZS5nZXRNb2R1bGUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1vZHVsZUludGVyZmFjZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZUludGVyZmFjZS5zaHV0ZG93bihjb25maWdDdHgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbXNnID0gIkVycm9yIHdoaWxlIHNodXR0aW5nIGRvd24gdGhlIG1vZHVsZSA6ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGUuZ2V0TmFtZSgpICsgIiA6ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGUuZ2V0VmVyc2lvbigpICsgIiBtb2R1ZWwgaW4gQnVuZGxlIC0gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1bmRsZS5nZXRTeW1ib2xpY05hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3IobXNnLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBheGlzQ29uZmlnLnJlbW92ZU1vZHVsZShtb2R1bGUuZ2V0TmFtZSgpLCBtb2R1bGUuZ2V0VmVyc2lvbigpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlc29sdmVkQnVuZGxlcy5jb250YWluc0tleShidW5kbGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlZEJ1bmRsZXMucmVtb3ZlKGJ1bmRsZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbG9nLmluZm8oIltBeGlzMi9PU0dpXSBTdG9wcGluZyA6IiArIG1vZHVsZS5nZXROYW1lKCkgKyAiIDogIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZS5nZXRWZXJzaW9uKCkgKyAiIG1vZHVlbCBpbiBCdW5kbGUgLSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVuZGxlLmdldFN5bWJvbGljTmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZm9yIChMb25nIGJ1bmRsZUlkIDogc3RvcEJ1bmRsZUxpc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgQnVuZGxlIHVuUmVnQnVuZGxlID0gY29udGV4dC5nZXRCdW5kbGUoYnVuZGxlSWQpOwotICAgICAgICAgICAgICAgICAgICBpZiAodW5SZWdCdW5kbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZVJlZ2lzdHJ5LnVuUmVnaXN0ZXIodW5SZWdCdW5kbGUsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGxvY2sudW5sb2NrKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXaGVuIHRoZSBidW5kbGUgaXMgYWN0aXZhdGVkLCB0aGlzIG1ldGhvZCB3aWxsIGxvb2sgZm9yIHhtbCBmaWxlcyB0aGF0IGVuZHMgd2l0aCAibW9kdWxlLnhtbCIuCi0gICAgICogVGh1cywgYSBnaXZlbiBidW5kbGUgY2FuIGhhdmUgbiBudW1iZXIgb2YgQXhpczIgbW9kdWxlcyB3aXRoIGRpZmZlcmVuIG5hbWVzIHN1ZmZpeGVkIHdpdGggbW9kdWxlLnhtbC4KLSAgICAgKiBFeDogcmFtcGFydF9tb2R1bGUueG1sOyByYWhhc19tb2R1bGUueG1sIGFkZHJlc3Npbmdtb2R1bGUueG1sCi0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBJZiB0aGVyZSBhcmUgbiBudW1iZXIgb2YgKm1vZHVsZS54bWwgYW5kIG91dCBvZiB3aGljaCBmYWlsZWQgbW9kdWxlcyB3aWxsIGJlIGlnbm9yZWQgYW5kIGFuZCBhbGwgdGhlCi0gICAgICogc3VjY2Vzc2Z1bCAqbW9kdWxlLnhtbCBmaWxlcyB3aWxsIHVzZSB0byBjcmF0ZSB0aGUgcHJvcGVyIEF4aXNNb2R1bGUuIEl0IGlzIHV0bW9zdCBpbXBvcnRhbnQgdGhhdAotICAgICAqIHRoYXQgaWYgbiBudW1iZXIgb2YgKm1vZHVsZS54bWwgZmlsZXMgYXJlIHByZXNlbnQsIG1vZHVsZSBzaG91bGQgYmUgZ2l2ZSBhIHByb3BlciBuYW1lLgotICAgICAqCi0gICAgICogQHBhcmFtIGJ1bmRsZSBzdGFydGVkIGJ1bmRsZQotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBhZGRNb2R1bGVzKEJ1bmRsZSBidW5kbGUpIHsKLSAgICAgICAgaWYgKCFyZXNvbHZlZEJ1bmRsZXMuY29udGFpbnNLZXkoYnVuZGxlKSkgewotICAgICAgICAgICAgRW51bWVyYXRpb24gZW51bWVyYXRpb24gPSBidW5kbGUuZmluZEVudHJpZXMoIk1FVEEtSU5GIiwgIiptb2R1bGUueG1sIiwgZmFsc2UpOwotICAgICAgICAgICAgTGlzdDxBeGlzTW9kdWxlPiBtb2R1bGVMaXN0ID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChlbnVtZXJhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbW9kdWxlTGlzdCA9IG5ldyBBcnJheUxpc3Q8QXhpc01vZHVsZT4oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHdoaWxlIChlbnVtZXJhdGlvbiAhPSBudWxsICYmIGVudW1lcmF0aW9uLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgVVJMIHVybCA9IChVUkwpIGVudW1lcmF0aW9uLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIEF4aXNNb2R1bGUgYXhpc21vZHVsZSA9IG5ldyBBeGlzTW9kdWxlKCk7Ci0gICAgICAgICAgICAgICAgICAgIENsYXNzTG9hZGVyIGxvYWRlciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJ1bmRsZUNsYXNzTG9hZGVyKGJ1bmRsZSwgUmVnaXN0cnkuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGF4aXNtb2R1bGUuc2V0TW9kdWxlQ2xhc3NMb2FkZXIobG9hZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZyA9IGNvbmZpZ0N0eC5nZXRBeGlzQ29uZmlndXJhdGlvbigpOwotICAgICAgICAgICAgICAgICAgICBNb2R1bGVCdWlsZGVyIGJ1aWxkZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBNb2R1bGVCdWlsZGVyKHVybC5vcGVuU3RyZWFtKCksIGF4aXNtb2R1bGUsIGF4aXNDb25maWcpOwotICAgICAgICAgICAgICAgICAgICBEaWN0aW9uYXJ5IGhlYWRlcnMgPSBidW5kbGUuZ2V0SGVhZGVycygpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYnVuZGxlU3ltYm9saWNOYW1lID0gKFN0cmluZykgaGVhZGVycy5nZXQoIkJ1bmRsZS1TeW1ib2xpY05hbWUiKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGJ1bmRsZVN5bWJvbGljTmFtZSAhPSBudWxsICYmIGJ1bmRsZVN5bWJvbGljTmFtZS5sZW5ndGgoKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBheGlzbW9kdWxlLnNldE5hbWUoYnVuZGxlU3ltYm9saWNOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYnVuZGxlVmVyc2lvbiA9IChTdHJpbmcpIGhlYWRlcnMuZ2V0KCJCdW5kbGUtVmVyc2lvbiIpOwotICAgICAgICAgICAgICAgICAgICBpZiAoYnVuZGxlVmVyc2lvbiAhPSBudWxsICYmIGJ1bmRsZVZlcnNpb24ubGVuZ3RoKCkgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdW5kbGUgdmVyc2lvbiBpcyBkZWZpbmVkIGFzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbiA6Oj0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFqb3IoICcuJyBtaW5vciAoICcuJyBtaWNybyAoICcuJyBxdWFsaWZpZXIgKT8gKT8gKT8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFqb3IgOjo9IG51bWJlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5vciA6Oj0gbnVtYmVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pY3JvIDo6PSBudW1iZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbGlmaWVyIDo6PSAoIGFscGhhbnVtIHwg4oCZX+KAmSB8ICctJyApKwotICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSB2ZXJzaW9uU3BsaXQgPSBidW5kbGVWZXJzaW9uLnNwbGl0KCJcXC4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludFtdIGNvbXBvbmVudHMgPSBuZXcgaW50W01hdGgubWluKHZlcnNpb25TcGxpdC5sZW5ndGgsIDMpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxjb21wb25lbnRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50c1tpXSA9IEludGVnZXIucGFyc2VJbnQodmVyc2lvblNwbGl0W2ldKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNtb2R1bGUuc2V0VmVyc2lvbihuZXcgVmVyc2lvbihjb21wb25lbnRzLCB2ZXJzaW9uU3BsaXQubGVuZ3RoID4gMyA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb25TcGxpdFszXSA6IG51bGwpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLnBvcHVsYXRlTW9kdWxlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGF4aXNtb2R1bGUuc2V0UGFyZW50KGF4aXNDb25maWcpOwotICAgICAgICAgICAgICAgICAgICBBeGlzTW9kdWxlIG1vZHVsZSA9IGF4aXNDb25maWcuZ2V0TW9kdWxlKGF4aXNtb2R1bGUuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1vZHVsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBEZXBsb3ltZW50RW5naW5lLmFkZE5ld01vZHVsZShheGlzbW9kdWxlLCBheGlzQ29uZmlnKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vaW5pdGlhbHplIHRoZSBtb2R1bGUgaWYgdGhlIG1vZHVsZSBjb250YWlucyBNb2R1bGUgaW50ZXJmYWNlLgotICAgICAgICAgICAgICAgICAgICAgICAgTW9kdWxlIG1vZHVsZU9iaiA9IGF4aXNtb2R1bGUuZ2V0TW9kdWxlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobW9kdWxlT2JqICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVPYmouaW5pdChjb25maWdDdHgsIGF4aXNtb2R1bGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlTGlzdC5hZGQoYXhpc21vZHVsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuaW5mbygiW0F4aXMyL09TR2ldIFN0YXJ0aW5nIGFueSBtb2R1bGVzIGluIEJ1bmRsZSAtICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVuZGxlLmdldFN5bWJvbGljTmFtZSgpICsgIiAtIE1vZHVsZSBOYW1lIDogIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzbW9kdWxlLmdldE5hbWUoKSArICIgLSBNb2R1bGUgVmVyc2lvbiA6ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpc21vZHVsZS5nZXRWZXJzaW9uKCkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmluZm8oIltNb2R1bGVSZWdpc3RyeV0gTW9kdWxlIDogIiArIGF4aXNtb2R1bGUuZ2V0TmFtZSgpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgaXMgYWxyZWFkeSBhdmFpbGFibGUuIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gc2V0IGluIGRlZmF1bHQgbWFwIGlmIG5lY2Vzc2FyeQotICAgICAgICAgICAgICAgICAgICBVdGlscy5jYWxjdWxhdGVEZWZhdWx0TW9kdWxlVmVyc2lvbihheGlzQ29uZmlnLmdldE1vZHVsZXMoKSwgYXhpc0NvbmZpZyk7Ci0gICAgICAgICAgICAgICAgICAgIHNlcnZpY2VSZWdpc3RyeS5yZXNvbHZlKCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbXNnID0gIkVycm9yIHdoaWxlIHJlYWRpbmcgbW9kdWxlLnhtbCI7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcihtc2csIGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtb2R1bGVMaXN0ICE9IG51bGwgJiYgbW9kdWxlTGlzdC5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgcmVzb2x2ZWRCdW5kbGVzLnB1dChidW5kbGUsIG1vZHVsZUxpc3QpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZShCdW5kbGUgYnVuZGxlKSB7Ci0gICAgICAgIHVuUmVnaXN0ZXIoYnVuZGxlLCB0cnVlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9vc2dpL3NyYy9vcmcvYXBhY2hlL2F4aXMyL29zZ2kvZGVwbG95bWVudC9PU0dpQXhpczJDb25zdGFudHMuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL29zZ2kvc3JjL29yZy9hcGFjaGUvYXhpczIvb3NnaS9kZXBsb3ltZW50L09TR2lBeGlzMkNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTQxMWNlLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL29zZ2kvc3JjL29yZy9hcGFjaGUvYXhpczIvb3NnaS9kZXBsb3ltZW50L09TR2lBeGlzMkNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA0LDIwMDUgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLm9zZ2kuZGVwbG95bWVudDsKLQotLyoqCi0gKiAgQ29udGFpbnMgdGhlIGxpc3Qgb2YgY29uc3RhbnRzCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBPU0dpQXhpczJDb25zdGFudHMgewotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgTU9EVUxFX05PVF9GT1VORF9FUlJPUiA9ICJFcnJvciAxOiBSZXF1aXJlZCBtb2R1bGUgaXMgbm90IGZvdW5kLiBNb2R1bGUgbmFtZSA6ICI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBQUk9UT0NPTCA9ICJwcm90b2NvbCI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBDT05URU5UX1RZUEUgPSAiY29udGVudFR5cGUiOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgTUVQID0gIm1lcCI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyAgQVhJUzJfT1NHaV9ST09UX0NPTlRFWFQgPSAib3JnLmF4aXMyLm9zZ2kuc2VydmljZS5jb250ZXh0LnJvb3QiOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgT1NHaV9CVU5ETEVfSUQgPSAiX09TR2lfQlVORExFX0lEXyI7Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9vc2dpL3NyYy9vcmcvYXBhY2hlL2F4aXMyL29zZ2kvZGVwbG95bWVudC9PU0dpQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9vc2dpL3NyYy9vcmcvYXBhY2hlL2F4aXMyL29zZ2kvZGVwbG95bWVudC9PU0dpQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkMzliYWIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvb3NnaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9vc2dpL2RlcGxveW1lbnQvT1NHaUNvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNCwyMDA1IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5vc2dpLmRlcGxveW1lbnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmJ1aWxkZXIuQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQuRGVwbG95ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LnV0aWwuVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlRyYW5zcG9ydEluRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuKjsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5heGlzMi5vc2dpLmRlcGxveW1lbnQuT1NHaUF4aXMyQ29uc3RhbnRzLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5vc2dpLmRlcGxveW1lbnQudHJhY2tlci5CdW5kbGVUcmFja2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIub3NnaS5kZXBsb3ltZW50LnRyYWNrZXIuV1NUcmFja2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIub3NnaS50eC5IdHRwTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuTWVzc2FnZUZvcm1hdHRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5UcmFuc3BvcnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5UcmFuc3BvcnRTZW5kZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLio7Ci1pbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5jbS5Db25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UuY20uTWFuYWdlZFNlcnZpY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRGljdGlvbmFyeTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuTG9jazsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5SZWVudHJhbnRMb2NrOwotCi0vKioKLSAqIE9TR2lDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkgY3JlYXRlcyBDb25maWd1cmF0aW9uQ29udGV4dCwgd2hpY2ggaXMgdGhlIHVsdGltYXRlIEF4aXMyIGVudmlyb25tZW50LgotICogVGhpcyBjcmVhdGlvbiBpcyBoYW5kbGVkIGFzIGEgTWFuYWdlZFNlcnZpY2Ugc2VydmljZSwgdGh1cywgQ29uZmlndXJhaXRvbiBBZG1pbiBoYXMgY29udHJvbCBvdmVyIGl0LgotICovCi1wdWJsaWMgY2xhc3MgT1NHaUNvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeSBpbXBsZW1lbnRzIE1hbmFnZWRTZXJ2aWNlIHsKLQotICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhPU0dpQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5LmNsYXNzKTsKLQotICAgIHByaXZhdGUgQnVuZGxlQ29udGV4dCBjb250ZXh0OwotCi0gICAgcHJpdmF0ZSBTZXJ2aWNlUmVnaXN0cmF0aW9uIG1uZ1NlcnZpY2VSZWdpc3RyYXRpb247Ci0KLSAgICBwcml2YXRlIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0N0eDsKLQotICAgIHByaXZhdGUgU2VydmljZVJlZ2lzdHJhdGlvbiBjb25maWdDdHhTZXJ2aWNlUmVnaXN0cmF0aW9uOwotCi0gICAgcHJpdmF0ZSBCdW5kbGVUcmFja2VyIGJ1bmRsZVRyYWNrZXI7Ci0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7Ci0gICAgICAgIGJ1bmRsZVRyYWNrZXIgPSBuZXcgQnVuZGxlVHJhY2tlcihjb250ZXh0KTsKLSAgICAgICAgRGljdGlvbmFyeSBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0gICAgICAgIHByb3BzLnB1dChDb25zdGFudHMuU0VSVklDRV9QSUQsICJvcmcuYXBhY2hlLmF4aXMyLm9zZ2kiKTsKLSAgICAgICAgbW5nU2VydmljZVJlZ2lzdHJhdGlvbiA9Ci0gICAgICAgICAgICAgICAgY29udGV4dC5yZWdpc3RlclNlcnZpY2UoTWFuYWdlZFNlcnZpY2UuY2xhc3MuZ2V0TmFtZSgpLCB0aGlzLCBwcm9wcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHN0b3AoKSB7Ci0gICAgICAgIGlmIChtbmdTZXJ2aWNlUmVnaXN0cmF0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1uZ1NlcnZpY2VSZWdpc3RyYXRpb24udW5yZWdpc3RlcigpOwotICAgICAgICB9Ci0gICAgICAgIGJ1bmRsZVRyYWNrZXIuY2xvc2UoKTsKLSAgICAgICAgaWYgKGNvbmZpZ0N0eCAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGNvbmZpZ0N0eC50ZXJtaW5hdGUoKTsKLSAgICAgICAgICAgICAgICBjb25maWdDdHggPSBudWxsOwotICAgICAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGUpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbXNnID0gIkVycm9yIHdoaWxlIENvbmZpZ3VyYXRpb25Db250ZXh0IGlzIHRlcm1pbmF0ZWQiOwotICAgICAgICAgICAgICAgIGxvZy5lcnJvcihtc2csIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGxvZy5pbmZvKCJBeGlzMiBlbnZpcm9ubWVudCBoYXMgc3RvcHBlZCIpOwotICAgIH0KLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdGFydENvbmZpZ3VyYXRpb25Db250ZXh0KERpY3Rpb25hcnkgZGljdGlvbmFyeSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIEF4aXNDb25maWd1cmF0b3IgY29uZmlndXJhdG9yID0gbmV3IE9TR2lTZXJ2ZXJDb25maWd1cmF0b3IoY29udGV4dCk7Ci0gICAgICAgIGNvbmZpZ0N0eCA9IENvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeS5jcmVhdGVDb25maWd1cmF0aW9uQ29udGV4dChjb25maWd1cmF0b3IpOwotICAgICAgICBMaXN0ZW5lck1hbmFnZXIgbGlzdGVuZXJNYW5hZ2VyID0gbmV3IExpc3RlbmVyTWFuYWdlcigpOwotICAgICAgICBsaXN0ZW5lck1hbmFnZXIuaW5pdChjb25maWdDdHgpOwotICAgICAgICBsaXN0ZW5lck1hbmFnZXIuc3RhcnQoKTsKLSAgICAgICAgTGlzdGVuZXJNYW5hZ2VyLmRlZmF1bHRDb25maWd1cmF0aW9uQ29udGV4dCA9IGNvbmZpZ0N0eDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB1cGRhdGVkKERpY3Rpb25hcnkgZGljdGlvbmFyeSkgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgc3RhcnRDb25maWd1cmF0aW9uQ29udGV4dChkaWN0aW9uYXJ5KTsKLSAgICAgICAgICAgIGlmIChjb25maWdDdHhTZXJ2aWNlUmVnaXN0cmF0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjb25maWdDdHhTZXJ2aWNlUmVnaXN0cmF0aW9uLnVucmVnaXN0ZXIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vcmVnaXN0ZXIgQ29uZmlndXJhdGlvbkNvbnRleHQgYXMgYSBPU0dpIHNlcml2Y2UKLSAgICAgICAgICAgIGNvbmZpZ0N0eFNlcnZpY2VSZWdpc3RyYXRpb24gPQotICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnJlZ2lzdGVyU2VydmljZShDb25maWd1cmF0aW9uQ29udGV4dC5jbGFzcy5nZXROYW1lKCksIGNvbmZpZ0N0eCwgbnVsbCk7Ci0KLSAgICAgICAgICAgIFJlZ2lzdHJ5IHNlcnZpY2VzUmVnaXN0cnkgPSBuZXcgU2VydmljZVJlZ2lzdHJ5KGNvbnRleHQsIGNvbmZpZ0N0eCk7Ci0gICAgICAgICAgICBSZWdpc3RyeSBtb2R1bGVSZWdpc3RyeSA9IG5ldyBNb2R1bGVSZWdpc3RyeShjb250ZXh0LCBjb25maWdDdHgsIHNlcnZpY2VzUmVnaXN0cnkpOwotICAgICAgICAgICAgYnVuZGxlVHJhY2tlci5hZGRSZWdpc3RyeShzZXJ2aWNlc1JlZ2lzdHJ5KTsKLSAgICAgICAgICAgIGJ1bmRsZVRyYWNrZXIuYWRkUmVnaXN0cnkobW9kdWxlUmVnaXN0cnkpOwotICAgICAgICAgICAgYnVuZGxlVHJhY2tlci5vcGVuKCk7Ci0KLSAgICAgICAgICAgIG5ldyBXU1RyYWNrZXIoY29uZmlnQ3R4LCBjb250ZXh0KS5vcGVuKCk7Ci0KLSAgICAgICAgICAgIGNvbnRleHQuYWRkU2VydmljZUxpc3RlbmVyKG5ldyBBeGlzQ29uZmlnU2VydmljZUxpc3RlbmVyKGNvbmZpZ0N0eCwgY29udGV4dCkpOwotCi0gICAgICAgICAgICBEaWN0aW9uYXJ5IHByb3AgPSBuZXcgUHJvcGVydGllcygpOwotICAgICAgICAgICAgcHJvcC5wdXQoUFJPVE9DT0wsICJodHRwIik7Ci0gICAgICAgICAgICAvL2FkZGluZyB0aGUgZGVmYXVsdCBsaXN0ZW5lcgotICAgICAgICAgICAgY29udGV4dC5yZWdpc3RlclNlcnZpY2UoVHJhbnNwb3J0TGlzdGVuZXIuY2xhc3MuZ2V0TmFtZSgpLCBuZXcgSHR0cExpc3RlbmVyKGNvbnRleHQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcCk7Ci0gICAgICAgICAgICBsb2cuaW5mbygiQXhpczIgZW52aXJvbm1lbnQgaGFzIHN0YXJ0ZWQuIik7Ci0gICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBlKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbXNnID0gIkVycm9yIHdoaWxlIGNyZWF0aW5nIENvbmZpZ3VyYXRpb25Db250ZXh0IjsKLSAgICAgICAgICAgIGxvZy5lcnJvcihtc2csIGUpOwotICAgICAgICAgICAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FeGNlcHRpb24obXNnLCBtc2csIGUpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5vc2dpLmZyYW1ld29yay5TZXJ2aWNlTGlzdGVuZXIKLSAgICAgKiAgICAgIDxwLz4KLSAgICAgKiAgICAgIEF4aXNDb25maWdTZXJ2aWNlTGlzdGVuZXIgaXMgYSBTZXJ2aWNlTGlzdGVuZXIuIFRoaXMgY2xhc3MgbGlzdGVuIHRvIE9TR2kgc2VydmljZXMgYW5kCi0gICAgICogICAgICBidWlsZCB0aGUgYXBwcm9wcmlhdGUgQXhpc0NvbmZpZ3VyYXRpb24gcGx1Z2lucy4gVGhlc2UgcGx1Z2lucyBpbmNsdWRlLCBtZXNzYWdlIHJlY2VpdmVycywKLSAgICAgKiAgICAgIHRyYW5zcG9ydCBsaXN0ZW5lcnMsIHRyYW5zcG9ydCBzZW5kZXJzLCBtZXNzYWdlIGZvcm1hdHRlcnMgJiBidWlsZGVycywgZXRjLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEF4aXNDb25maWdTZXJ2aWNlTGlzdGVuZXIgaW1wbGVtZW50cyBTZXJ2aWNlTGlzdGVuZXIgewotCi0gICAgICAgIHByaXZhdGUgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ3R4OwotCi0gICAgICAgIHByaXZhdGUgQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZzsKLQotICAgICAgICBwcml2YXRlIEJ1bmRsZUNvbnRleHQgY29udGV4dDsKLQotICAgICAgICBwcml2YXRlIExvY2sgbG9jayA9IG5ldyBSZWVudHJhbnRMb2NrKCk7Ci0KLSAgICAgICAgcHVibGljIEF4aXNDb25maWdTZXJ2aWNlTGlzdGVuZXIoQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ3R4LCBCdW5kbGVDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgICAgIHRoaXMuY29uZmlnQ3R4ID0gY29uZmlnQ3R4OwotICAgICAgICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDsKLSAgICAgICAgICAgIHRoaXMuYXhpc0NvbmZpZyA9IGNvbmZpZ0N0eC5nZXRBeGlzQ29uZmlndXJhdGlvbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2VydmljZUNoYW5nZWQoU2VydmljZUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICBTZXJ2aWNlUmVmZXJlbmNlIHJlZmVyZW5jZSA9IGV2ZW50LmdldFNlcnZpY2VSZWZlcmVuY2UoKTsKLSAgICAgICAgICAgIE9iamVjdCBzZXJ2aWNlID0gY29udGV4dC5nZXRTZXJ2aWNlKHJlZmVyZW5jZSk7Ci0gICAgICAgICAgICBpZiAoc2VydmljZSBpbnN0YW5jZW9mIFRyYW5zcG9ydExpc3RlbmVyKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHByb3RvY29sID0gKFN0cmluZykgcmVmZXJlbmNlLmdldFByb3BlcnR5KFBST1RPQ09MKTsKLSAgICAgICAgICAgICAgICBpZiAocHJvdG9jb2wgPT0gbnVsbCB8fCBwcm90b2NvbC5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiUHJvdG9jb2wgaXMgbm90IGZvdW5kIGZvciB0aGUgdHJuYXNwb3J0IG9iamVjdCI7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcihtc2cpOwotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihtc2cpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoZXZlbnQuZ2V0VHlwZSgpID09IFNlcnZpY2VFdmVudC5SRUdJU1RFUkVEKSB7Ci0gICAgICAgICAgICAgICAgICAgIFRyYW5zcG9ydExpc3RlbmVyIHR4TGlzdGVuZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChUcmFuc3BvcnRMaXN0ZW5lcikgc2VydmljZTsKLQotICAgICAgICAgICAgICAgICAgICBUcmFuc3BvcnRJbkRlc2NyaXB0aW9uIHR4SW5EZXMgPSBuZXcgVHJhbnNwb3J0SW5EZXNjcmlwdGlvbihwcm90b2NvbCk7Ci0gICAgICAgICAgICAgICAgICAgIHR4SW5EZXMuc2V0UmVjZWl2ZXIodHhMaXN0ZW5lcik7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIGtleXMgPSByZWZlcmVuY2UuZ2V0UHJvcGVydHlLZXlzKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChrZXlzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGtleSA6IGtleXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoa2V5LmVxdWFscyhQUk9UT0NPTCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vVE9ETzogYXNzdW1lIFN0cmluZyBwcm9wZXJ0aWVzIGF0IHRoaXMgbW9tZW50LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBwcm9wT2JqID0gcmVmZXJlbmNlLmdldFByb3BlcnR5KGtleSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wT2JqIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKSBwcm9wT2JqOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1ldGVyIHBhcmFtID0gbmV3IFBhcmFtZXRlcihrZXksIHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR4SW5EZXMuYWRkUGFyYW1ldGVyKHBhcmFtKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiRXJyb3Igd2hpbGUgcmVhZGluZyB0cmFuc3BvcnQgcHJvcGVydGllcyBmcm9tIDoiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR4TGlzdGVuZXIudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKG1zZywgZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKG1zZywgZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb25maWdDdHguZ2V0TGlzdGVuZXJNYW5hZ2VyKCkuYWRkTGlzdGVuZXIodHhJbkRlcywgZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgLy9Ob3cgdXBkYXRlIHRoZSBBeGlzU2VydmljZSBlbmRwb2ludCBtYXAKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvY2subG9jaygpOwotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gYXhpc0NvbmZpZy5nZXRTZXJ2aWNlcygpLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZXJ2aWNlTmFtZSA9IChTdHJpbmcpIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UgPSBheGlzQ29uZmlnLmdldFNlcnZpY2Uoc2VydmljZU5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVdGlscy5hZGRFbmRwb2ludHNUb1NlcnZpY2UoYXhpc1NlcnZpY2UsIGF4aXNDb25maWcpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jay51bmxvY2soKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiRXJyb3Igd2hpbGUgaW50aWF0aW5nIGFuZCBzdGFydGluZyB0aGUgbGlzdGVuZXIiOwotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKG1zZywgZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihtc2csIGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IGVsc2UgaWYgKHNlcnZpY2UgaW5zdGFuY2VvZiBCdWlsZGVyKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGNvbnRleHRUeXBlID0gKFN0cmluZykgcmVmZXJlbmNlLmdldFByb3BlcnR5KENPTlRFTlRfVFlQRSk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbnRleHRUeXBlID09IG51bGwgfHwgY29udGV4dFR5cGUubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbXNnID0gQ09OVEVOVF9UWVBFICsgIiBpcyBtaXNzaW5nIGZyb20gYnVpbGRlciBvYmplY3QiOwotICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3IobXNnKTsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24obXNnKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGV2ZW50LmdldFR5cGUoKSA9PSBTZXJ2aWNlRXZlbnQuUkVHSVNURVJFRCB8fCBldmVudC5nZXRUeXBlKCkgPT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZpY2VFdmVudC5NT0RJRklFRCkgewotICAgICAgICAgICAgICAgICAgICBCdWlsZGVyIGJ1aWxkZXIgPSAoQnVpbGRlcikgc2VydmljZTsKLSAgICAgICAgICAgICAgICAgICAgbG9jay5sb2NrKCk7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBheGlzQ29uZmlnLmFkZE1lc3NhZ2VCdWlsZGVyKGNvbnRleHRUeXBlLCBidWlsZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvY2sudW5sb2NrKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHNlcnZpY2UgaW5zdGFuY2VvZiBNZXNzYWdlRm9ybWF0dGVyKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGNvbnRleHRUeXBlID0gKFN0cmluZykgcmVmZXJlbmNlLmdldFByb3BlcnR5KENPTlRFTlRfVFlQRSk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbnRleHRUeXBlID09IG51bGwgfHwgY29udGV4dFR5cGUubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbXNnID0gQ09OVEVOVF9UWVBFICsgIiBpcyBtaXNzaW5nIGZyb20gZm9ybWF0dGVyIG9iamVjdCI7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcihtc2cpOwotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihtc2cpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoZXZlbnQuZ2V0VHlwZSgpID09IFNlcnZpY2VFdmVudC5SRUdJU1RFUkVEIHx8IGV2ZW50LmdldFR5cGUoKSA9PQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VydmljZUV2ZW50Lk1PRElGSUVEKSB7Ci0gICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VGb3JtYXR0ZXIgZm9ybWF0dGVyID0gKE1lc3NhZ2VGb3JtYXR0ZXIpIHNlcnZpY2U7Ci0gICAgICAgICAgICAgICAgICAgIGxvY2subG9jaygpOwotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgYXhpc0NvbmZpZy5hZGRNZXNzYWdlRm9ybWF0dGVyKGNvbnRleHRUeXBlLCBmb3JtYXR0ZXIpOwotICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9jay51bmxvY2soKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VydmljZSBpbnN0YW5jZW9mIE1lc3NhZ2VSZWNlaXZlcikgewotICAgICAgICAgICAgICAgIFN0cmluZyBtZXAgPSAoU3RyaW5nKSByZWZlcmVuY2UuZ2V0UHJvcGVydHkoTUVQKTsKLSAgICAgICAgICAgICAgICBpZiAobWVwID09IG51bGwgfHwgbWVwLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1zZyA9IE1FUCArICIgaXMgbWlzc2luZyBmcm9tIG1lc3NhZ2UgcmVjZWl2ZXIgb2JqZWN0IjsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKG1zZyk7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKG1zZyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChldmVudC5nZXRUeXBlKCkgPT0gU2VydmljZUV2ZW50LlJFR0lTVEVSRUQgfHwgZXZlbnQuZ2V0VHlwZSgpID09Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlRXZlbnQuTU9ESUZJRUQpIHsKLSAgICAgICAgICAgICAgICAgICAgTWVzc2FnZVJlY2VpdmVyIG1yID0gKE1lc3NhZ2VSZWNlaXZlcikgc2VydmljZTsKLSAgICAgICAgICAgICAgICAgICAgbG9jay5sb2NrKCk7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBheGlzQ29uZmlnLmFkZE1lc3NhZ2VSZWNlaXZlcihtZXAsIG1yKTsKLSAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvY2sudW5sb2NrKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHNlcnZpY2UgaW5zdGFuY2VvZiBBeGlzT2JzZXJ2ZXIpIHsKLSAgICAgICAgICAgICAgICBpZiAoZXZlbnQuZ2V0VHlwZSgpID09IFNlcnZpY2VFdmVudC5SRUdJU1RFUkVEIHx8IGV2ZW50LmdldFR5cGUoKSA9PQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VydmljZUV2ZW50Lk1PRElGSUVEKSB7Ci0gICAgICAgICAgICAgICAgICAgIEF4aXNPYnNlcnZlciBheGlzT2JzZXJ2ZXIgPSAoQXhpc09ic2VydmVyKSBzZXJ2aWNlOwotICAgICAgICAgICAgICAgICAgICBsb2NrLmxvY2soKTsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNPYnNlcnZlci5pbml0KGF4aXNDb25maWcpOwotICAgICAgICAgICAgICAgICAgICAgICAgYXhpc0NvbmZpZy5hZGRPYnNlcnZlcnMoYXhpc09ic2VydmVyKTsKLSAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvY2sudW5sb2NrKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHNlcnZpY2UgaW5zdGFuY2VvZiBUcmFuc3BvcnRTZW5kZXIpIHsKLSAgICAgICAgICAgICAgICAvL1RPRE86IFRCRAotICAgICAgICAgICAgfSBlbHNlIGlmIChzZXJ2aWNlIGluc3RhbmNlb2YgRGVwbG95ZXIpIHsKLSAgICAgICAgICAgICAgICAvLyBUT0RPOiBUQkQsIHRoZXJlIGlzIG5vIEF4aXMyIEFQSSB5ZXQgYXZhaWxhYmxlIHRvIGFkZCBkZXBsb3llcnMuCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL29zZ2kvc3JjL29yZy9hcGFjaGUvYXhpczIvb3NnaS9kZXBsb3ltZW50L09TR2lTZXJ2ZXJDb25maWd1cmF0b3IuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL29zZ2kvc3JjL29yZy9hcGFjaGUvYXhpczIvb3NnaS9kZXBsb3ltZW50L09TR2lTZXJ2ZXJDb25maWd1cmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDEwMmIwMS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9vc2dpL3NyYy9vcmcvYXBhY2hlL2F4aXMyL29zZ2kvZGVwbG95bWVudC9PU0dpU2VydmVyQ29uZmlndXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDQsMjAwNSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIub3NnaS5kZXBsb3ltZW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LkRlcGxveW1lbnRFbmdpbmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LkRlcGxveW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LkF4aXNDb25maWdCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBoZWFydCBvZiB0aGUgT1NHaSBkZXBsb3ltZW50LgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBPU0dpU2VydmVyQ29uZmlndXJhdG9yIGV4dGVuZHMgRGVwbG95bWVudEVuZ2luZSBpbXBsZW1lbnRzIEF4aXNDb25maWd1cmF0b3IgewotCi0gICAgcHJpdmF0ZSBCdW5kbGVDb250ZXh0IGNvbnRleHQ7Ci0KLSAgICBwcml2YXRlIFVSTCBheGlzMlhtbFVybDsKLQotICAgIHB1YmxpYyBPU0dpU2VydmVyQ29uZmlndXJhdG9yKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgewotICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0OwotICAgICAgICBFbnVtZXJhdGlvbiBlbnRyaWVzID0gdGhpcy5jb250ZXh0LmdldEJ1bmRsZSgpCi0gICAgICAgICAgICAgICAgLmZpbmRFbnRyaWVzKCJvcmcvYXBhY2hlL2F4aXMyL29zZ2kvZGVwbG95bWVudCIsICJheGlzMi54bWwiLCBmYWxzZSk7Ci0gICAgICAgIGlmIChlbnRyaWVzICE9IG51bGwgJiYgZW50cmllcy5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgYXhpczJYbWxVcmwgPSAoVVJMKWVudHJpZXMubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIE9TR2lTZXJ2ZXJDb25maWd1cmF0b3Igd2lsbCBjcmVhdGUgYW4gc3BlY2lmaWN0IEF4aXNDb25maWd1cmF0aW9uIGJhc2VkIG9uIGF4aXMyLnhtbCB3aGljaAotICAgICAqIGlzIGF2YWlsYWJsZSBpbiBvcmcvYXBhY2hlL2F4aXMyLm9zZ2kvZGVwbG95bWVudCBkaXJlY3RvcnkuIFRoaXMgYXhpczIueG1sIGRvZXNuJ3QgY29udGFpbgotICAgICAqIGFueSBsaXN0ZW5lcnMuIExpc3RlbmVycyBzaG91bGQgYmUgYWRkZWQgYXMgc2VydmljZXMgdG8gQXhpc0NvbmZpZ3VyYXRpb24gc2VydmljZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gQXhpc0NvbmZpZ3VyYXRpb247IGFuIGluc3RhbmNlIG9mIEF4aXNDb25maWd1cmF0aW9uIGlzIHJldHVybgotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0OyBBeGlzRmF1bHQgd2lsbCBiZSB0aHJvd24gd3JhcHBpbmcgYW55IG9mIElPRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIEF4aXNDb25maWd1cmF0aW9uIGdldEF4aXNDb25maWd1cmF0aW9uKCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IGF4aXMyWG1sVXJsLm9wZW5TdHJlYW0oKTsKLSAgICAgICAgICAgIHBvcHVsYXRlQXhpc0NvbmZpZ3VyYXRpb24oaW5wdXRTdHJlYW0pOwotICAgICAgICAgICAgYXhpc0NvbmZpZy52YWxpZGF0ZVN5c3RlbVByZWRlZmluZWRQaGFzZXMoKTsKLSAgICAgICAgICAgIHJldHVybiBheGlzQ29uZmlnOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbXNnID0gIkVycm9yIG9jY3VyZWQgd2hpbGUgY3JlYXRpbmcgYXhpc0NvbmZpZ3VyYXRpb24iOwotICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdChtc2csIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCBlbmdhZ2VHbG9iYWxNb2R1bGVzKCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIC8vVE9ETzsgVEJECi0gICAgfQotCi0gICAgcHVibGljIEF4aXNDb25maWd1cmF0aW9uIHBvcHVsYXRlQXhpc0NvbmZpZ3VyYXRpb24oSW5wdXRTdHJlYW0gaW4pIHRocm93cyBEZXBsb3ltZW50RXhjZXB0aW9uIHsKLSAgICAgICAgYXhpc0NvbmZpZyA9IG5ldyBBeGlzQ29uZmlndXJhdGlvbigpOwotICAgICAgICBBeGlzQ29uZmlnQnVpbGRlciBidWlsZGVyID0KLSAgICAgICAgICAgICAgICBuZXcgQXhpc0NvbmZpZ0J1aWxkZXIoaW4sIGF4aXNDb25maWcsIHRoaXMpOwotICAgICAgICBidWlsZGVyLnBvcHVsYXRlQ29uZmlnKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoaW4gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGluLmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiRXJyb3IgaW4gY2xvc2luZyBpbnB1dCBzdHJlYW0iOwotICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24obXNnLCBlKTsKLSAgICAgICAgfQotICAgICAgICAvL1RPRE86IGlmIG1vZHVsZSBkZXBsb3llciBuZWVkZSB0byBzZXQgaXQgc2hvdWxkIGJlIHNldCBoZXJlLgotICAgICAgICByZXR1cm4gYXhpc0NvbmZpZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBsb2FkU2VydmljZXMoKSB7Ci0gICAgICAgIC8vVE9ETzsgVEJECi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvb3NnaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9vc2dpL2RlcGxveW1lbnQvT1NHaVNlcnZpY2VCdWlsZGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9vc2dpL3NyYy9vcmcvYXBhY2hlL2F4aXMyL29zZ2kvZGVwbG95bWVudC9PU0dpU2VydmljZUJ1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYwMDIyOC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9vc2dpL3NyYy9vcmcvYXBhY2hlL2F4aXMyL29zZ2kvZGVwbG95bWVudC9PU0dpU2VydmljZUJ1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDQsMjAwNSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIub3NnaS5kZXBsb3ltZW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LkRlcGxveW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LlNlcnZpY2VCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmF4aXMyLm9zZ2kuZGVwbG95bWVudC5PU0dpQXhpczJDb25zdGFudHMuTU9EVUxFX05PVF9GT1VORF9FUlJPUjsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLS8qKgotICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQuU2VydmljZUJ1aWxkZXIKLSAqICAgICAgT1NHaVNlcnZpY2VCdWlsZGVyIGJ1aWxkcyBBeGlzU2VydmljZSBmcm9tIHNlcnZpY2VzLnhtbCBmb3VuZAotICogICAgICBpbiBhIGJ1bmRsZS4gQnVpbGRlciB3b3VsZCBvbmx5IHN1Y2Nlc3MgaWYgdGhlIHJlbGVhdGlvbnNoaXAgYmV0d2VlbiBtb2R1ZWxzIGFuZCBzZXJ2aWNlcwotICogICAgICB3b3VsZCBtZWV0LgotICovCi1wdWJsaWMgY2xhc3MgT1NHaVNlcnZpY2VCdWlsZGVyIGV4dGVuZHMgU2VydmljZUJ1aWxkZXIgewotCi0gICAgcHJpdmF0ZSBBeGlzU2VydmljZSBzZXJ2aWNlOwotCi0gICAgcHVibGljIE9TR2lTZXJ2aWNlQnVpbGRlcihDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDdHgsIEF4aXNTZXJ2aWNlIHNlcnZpY2UpIHsKLSAgICAgICAgc3VwZXIoY29uZmlnQ3R4LCBzZXJ2aWNlKTsKLSAgICAgICAgdGhpcy5zZXJ2aWNlID0gc2VydmljZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT1NHaVNlcnZpY2VCdWlsZGVyKElucHV0U3RyZWFtIHNlcnZpY2VJbnB1dFN0cmVhbSwgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSkgewotICAgICAgICBzdXBlcihzZXJ2aWNlSW5wdXRTdHJlYW0sIGNvbmZpZ0N0eCwgc2VydmljZSk7Ci0gICAgICAgIHRoaXMuc2VydmljZSA9IHNlcnZpY2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbGlzdCBvZiBtb2R1bGVzIHRoYXQgaXMgcmVxdWlyZWQgdG8gYmUgZW5nYWdlZCBnbG9iYWxseS4KLSAgICAgKiBJZiB0aGUgcmVxdWlyZWQgbW9kdWxlIGlzIG5vdCBmb3VuZCB0aGlzIHdpbGwgcmV0dXJuIHRoZSBlcnJvciBjb2RlIDE6IHdoaWNoIGlzCi0gICAgICogIkVycm9yIDE6IFJlcXVpcmVkIG1vZHVsZSBpcyBub3QgZm91bmQiCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbW9kdWxlUmVmcyA8Y29kZT5qYXZhLnV0aWwuSXRlcmF0b3I8L2NvZGU+Ci0gICAgICogQHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQuRGVwbG95bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgIDxjb2RlPkRlcGxveW1lbnRFeGNlcHRpb248L2NvZGU+Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc01vZHVsZVJlZnMoSXRlcmF0b3IgbW9kdWxlUmVmcykKLSAgICAgICAgICAgIHRocm93cyBEZXBsb3ltZW50RXhjZXB0aW9uIHsKLSAgICAgICAgd2hpbGUgKG1vZHVsZVJlZnMuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgbW9kdWxlcmVmID0gKE9NRWxlbWVudCkgbW9kdWxlUmVmcy5uZXh0KCk7Ci0gICAgICAgICAgICBPTUF0dHJpYnV0ZSBtb2R1bGVSZWZBdHRyaWJ1dGUgPSBtb2R1bGVyZWYKLSAgICAgICAgICAgICAgICAgICAgLmdldEF0dHJpYnV0ZShuZXcgUU5hbWUoVEFHX1JFRkVSRU5DRSkpOwotCi0gICAgICAgICAgICBpZiAobW9kdWxlUmVmQXR0cmlidXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcmVmTmFtZSA9IG1vZHVsZVJlZkF0dHJpYnV0ZS5nZXRBdHRyaWJ1dGVWYWx1ZSgpOwotCi0gICAgICAgICAgICAgICAgaWYgKGF4aXNDb25maWcuZ2V0TW9kdWxlKHJlZk5hbWUpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oTU9EVUxFX05PVF9GT1VORF9FUlJPUik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgc2VydmljZS5hZGRNb2R1bGVyZWYocmVmTmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSWYgdGhlIHJlcXVpcmVkIG1vZHVsZSBpcyBub3QgZm91bmQgdGhpcyB3aWxsIHJldHVybiB0aGUgZXJyb3IgY29kZSAxOiB3aGljaCBpcwotICAgICAqICJFcnJvciAxOiBSZXF1aXJlZCBtb2R1bGUgaXMgbm90IGZvdW5kIgotICAgICAqCi0gICAgICogQHBhcmFtIG1vZHVsZVJlZnMgbW9kdWxlUmVmcwotICAgICAqIEBwYXJhbSBvcGVyYXRpb24gIG9wZXJhdGlvbgotICAgICAqIEB0aHJvd3MgRGVwbG95bWVudEV4Y2VwdGlvbiBEZXBsb3ltZW50RXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc09wZXJhdGlvbk1vZHVsZVJlZnMoSXRlcmF0b3IgbW9kdWxlUmVmcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBeGlzT3BlcmF0aW9uIG9wZXJhdGlvbikgdGhyb3dzIERlcGxveW1lbnRFeGNlcHRpb24gewotICAgICAgICB3aGlsZSAobW9kdWxlUmVmcy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBtb2R1bGVyZWYgPSAoT01FbGVtZW50KSBtb2R1bGVSZWZzLm5leHQoKTsKLSAgICAgICAgICAgIE9NQXR0cmlidXRlIG1vZHVsZVJlZkF0dHJpYnV0ZSA9IG1vZHVsZXJlZgotICAgICAgICAgICAgICAgICAgICAuZ2V0QXR0cmlidXRlKG5ldyBRTmFtZShUQUdfUkVGRVJFTkNFKSk7Ci0KLSAgICAgICAgICAgIGlmIChtb2R1bGVSZWZBdHRyaWJ1dGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFN0cmluZyByZWZOYW1lID0gbW9kdWxlUmVmQXR0cmlidXRlLmdldEF0dHJpYnV0ZVZhbHVlKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoYXhpc0NvbmZpZy5nZXRNb2R1bGUocmVmTmFtZSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEV4Y2VwdGlvbihNT0RVTEVfTk9UX0ZPVU5EX0VSUk9SICsgcmVmTmFtZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uLmFkZE1vZHVsZShyZWZOYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvb3NnaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9vc2dpL2RlcGxveW1lbnQvT1NHaVNlcnZpY2VHcm91cEJ1aWxkZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL29zZ2kvc3JjL29yZy9hcGFjaGUvYXhpczIvb3NnaS9kZXBsb3ltZW50L09TR2lTZXJ2aWNlR3JvdXBCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1MzBkZmUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvb3NnaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9vc2dpL2RlcGxveW1lbnQvT1NHaVNlcnZpY2VHcm91cEJ1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDQsMjAwNSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIub3NnaS5kZXBsb3ltZW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LkRlcGxveW1lbnRFcnJvck1zZ3M7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LkRlcGxveW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LlNlcnZpY2VCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC5TZXJ2aWNlR3JvdXBCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZUdyb3VwOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaTE4bi5NZXNzYWdlczsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5heGlzMi5vc2dpLmRlcGxveW1lbnQuT1NHaUF4aXMyQ29uc3RhbnRzLk1PRFVMRV9OT1RfRk9VTkRfRVJST1I7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQuU2VydmljZUdyb3VwQnVpbGRlcgotICogICAgICBPU0dpU2VydmljZUdyb3VwQnVpbGRlciBidWlsZHMgQXhpc1NlcnZpY2VHcm91cCBmcm9tIHNlcnZpY2VzLnhtbCBmb3VuZAotICogICAgICBpbiBhIGJ1bmRsZS4gQnVpbGRlciB3b3VsZCBvbmx5IHN1Y2Nlc3MgaWYgdGhlIHJlbGVhdGlvbnNoaXAgYmV0d2VlbiBtb2R1ZWxzIGFuZCBzZXJ2aWNlcwotICogICAgICB3b3VsZCBtZWV0LgotICovCi1wdWJsaWMgY2xhc3MgT1NHaVNlcnZpY2VHcm91cEJ1aWxkZXIgZXh0ZW5kcyBTZXJ2aWNlR3JvdXBCdWlsZGVyIHsKLQotICAgIHByaXZhdGUgT01FbGVtZW50IHNlcnZpY2VFbGVtZW50OwotCi0gICAgcHJpdmF0ZSBNYXAgd3NkbFNlcnZpY2VzOwotCi0gICAgcHVibGljIE9TR2lTZXJ2aWNlR3JvdXBCdWlsZGVyKE9NRWxlbWVudCBzZXJ2aWNlRWxlbWVudCwgSGFzaE1hcCB3c2RsU2VydmljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0N0eCkgewotICAgICAgICBzdXBlcihzZXJ2aWNlRWxlbWVudCwgd3NkbFNlcnZpY2VzLCBjb25maWdDdHgpOwotICAgICAgICB0aGlzLnNlcnZpY2VFbGVtZW50ID0gc2VydmljZUVsZW1lbnQ7Ci0gICAgICAgIHRoaXMud3NkbFNlcnZpY2VzID0gd3NkbFNlcnZpY2VzOwotICAgIH0KLQotICAgIHB1YmxpYyBBcnJheUxpc3QgcG9wdWxhdGVTZXJ2aWNlR3JvdXAoQXhpc1NlcnZpY2VHcm91cCBheGlzU2VydmljZUdyb3VwKQotICAgICAgICAgICAgdGhyb3dzIERlcGxveW1lbnRFeGNlcHRpb24gewotICAgICAgICBBcnJheUxpc3Qgc2VydmljZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgdHJ5IHsKLQotICAgICAgICAgICAgLy8gUHJvY2Vzc2luZyBzZXJ2aWNlIGxldmVsIHBhcmFtZXRlcnMKLSAgICAgICAgICAgIEl0ZXJhdG9yIGl0ciA9IHNlcnZpY2VFbGVtZW50LmdldENoaWxkcmVuV2l0aE5hbWUobmV3IFFOYW1lKFRBR19QQVJBTUVURVIpKTsKLQotICAgICAgICAgICAgcHJvY2Vzc1BhcmFtZXRlcnMoaXRyLCBheGlzU2VydmljZUdyb3VwLCBheGlzU2VydmljZUdyb3VwLmdldFBhcmVudCgpKTsKLQotICAgICAgICAgICAgSXRlcmF0b3IgbW9kdWxlQ29uZmlncyA9Ci0gICAgICAgICAgICAgICAgICAgIHNlcnZpY2VFbGVtZW50LmdldENoaWxkcmVuV2l0aE5hbWUobmV3IFFOYW1lKFRBR19NT0RVTEVfQ09ORklHKSk7Ci0KLSAgICAgICAgICAgIHByb2Nlc3NTZXJ2aWNlTW9kdWxlQ29uZmlnKG1vZHVsZUNvbmZpZ3MsIGF4aXNTZXJ2aWNlR3JvdXAuZ2V0UGFyZW50KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzU2VydmljZUdyb3VwKTsKLQotICAgICAgICAgICAgLy8gcHJvY2Vzc2luZyBzZXJ2aWNlLXdpZGUgbW9kdWxlcyB3aGljaCByZXF1aXJlZCB0byBlbmdhZ2UgZ2xvYmFsbHkKLSAgICAgICAgICAgIEl0ZXJhdG9yIG1vZHVsZVJlZnMgPSBzZXJ2aWNlRWxlbWVudC5nZXRDaGlsZHJlbldpdGhOYW1lKG5ldyBRTmFtZShUQUdfTU9EVUxFKSk7Ci0KLSAgICAgICAgICAgIHByb2Nlc3NNb2R1bGVSZWZzKG1vZHVsZVJlZnMsIGF4aXNTZXJ2aWNlR3JvdXApOwotCi0gICAgICAgICAgICBJdGVyYXRvciBzZXJ2aWNlaXRyID0gc2VydmljZUVsZW1lbnQuZ2V0Q2hpbGRyZW5XaXRoTmFtZShuZXcgUU5hbWUoVEFHX1NFUlZJQ0UpKTsKLQotICAgICAgICAgICAgd2hpbGUgKHNlcnZpY2VpdHIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgT01FbGVtZW50IHNlcnZpY2UgPSAoT01FbGVtZW50KSBzZXJ2aWNlaXRyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBPTUF0dHJpYnV0ZSBzZXJ2aWNlTmFtZWF0dCA9IHNlcnZpY2UuZ2V0QXR0cmlidXRlKG5ldyBRTmFtZShBVFRSSUJVVEVfTkFNRSkpOwotICAgICAgICAgICAgICAgIGlmIChzZXJ2aWNlTmFtZWF0dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoRGVwbG95bWVudEVycm9yTXNncy5TRVJWSUNFX05BTUVfRVJST1IpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHNlcnZpY2VOYW1lID0gc2VydmljZU5hbWVhdHQuZ2V0QXR0cmlidXRlVmFsdWUoKTsKLQotICAgICAgICAgICAgICAgIGlmIChzZXJ2aWNlTmFtZSA9PSBudWxsIHx8ICIiLmVxdWFscyhzZXJ2aWNlTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZ2V0TWVzc2FnZShEZXBsb3ltZW50RXJyb3JNc2dzLlNFUlZJQ0VfTkFNRV9FUlJPUikpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlID0gKEF4aXNTZXJ2aWNlKSB3c2RsU2VydmljZXMuZ2V0KHNlcnZpY2VOYW1lKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoYXhpc1NlcnZpY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgYXhpc1NlcnZpY2UgPSBuZXcgQXhpc1NlcnZpY2Uoc2VydmljZU5hbWUpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgYXhpc1NlcnZpY2Uuc2V0V3NkbEZvdW5kKHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgYXhpc1NlcnZpY2Uuc2V0Q3VzdG9tV3NkbCh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzZXJ2aWNlIHRoYXQgaGFzIHRvIGJlIGRlcGxveWVkCi0gICAgICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlLnNldFBhcmVudChheGlzU2VydmljZUdyb3VwKTsKLSAgICAgICAgICAgICAgICAgICAgYXhpc1NlcnZpY2Uuc2V0Q2xhc3NMb2FkZXIoYXhpc1NlcnZpY2VHcm91cC5nZXRTZXJ2aWNlR3JvdXBDbGFzc0xvYWRlcigpKTsKLQotICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlQnVpbGRlciBzZXJ2aWNlQnVpbGRlciA9IG5ldyBPU0dpU2VydmljZUJ1aWxkZXIoY29uZmlnQ3R4LCBheGlzU2VydmljZSk7Ci0gICAgICAgICAgICAgICAgICAgIEF4aXNTZXJ2aWNlIGFzID0gc2VydmljZUJ1aWxkZXIucG9wdWxhdGVTZXJ2aWNlKHNlcnZpY2UpOwotICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlTGlzdC5hZGQoYXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHNlcnZpY2VMaXN0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGxpc3Qgb2YgbW9kdWxlcyB0aGF0IGlzIHJlcXVpcmVkIHRvIGJlIGVuZ2FnZWQgZ2xvYmFsbHkuCi0gICAgICogSWYgdGhlIHJlcXVpcmVkIG1vZHVsZSBpcyBub3QgZm91bmQgdGhpcyB3aWxsIHJldHVybiB0aGUgZXJyb3IgY29kZSAxOiB3aGljaCBpcwotICAgICAqICJFcnJvciAxOiBSZXF1aXJlZCBtb2R1bGUgaXMgbm90IGZvdW5kIgotICAgICAqCi0gICAgICogQHBhcmFtIG1vZHVsZVJlZnMgPGNvZGU+amF2YS51dGlsLkl0ZXJhdG9yPC9jb2RlPgotICAgICAqIEB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LkRlcGxveW1lbnRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICA8Y29kZT5EZXBsb3ltZW50RXhjZXB0aW9uPC9jb2RlPgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NNb2R1bGVSZWZzKEl0ZXJhdG9yIG1vZHVsZVJlZnMsIEF4aXNTZXJ2aWNlR3JvdXAgYXhpc1NlcnZpY2VHcm91cCkKLSAgICAgICAgICAgIHRocm93cyBEZXBsb3ltZW50RXhjZXB0aW9uIHsKLSAgICAgICAgd2hpbGUgKG1vZHVsZVJlZnMuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgbW9kdWxlcmVmID0gKE9NRWxlbWVudCkgbW9kdWxlUmVmcy5uZXh0KCk7Ci0gICAgICAgICAgICBPTUF0dHJpYnV0ZSBtb2R1bGVSZWZBdHRyaWJ1dGUgPSBtb2R1bGVyZWYuZ2V0QXR0cmlidXRlKG5ldyBRTmFtZShUQUdfUkVGRVJFTkNFKSk7Ci0KLSAgICAgICAgICAgIGlmIChtb2R1bGVSZWZBdHRyaWJ1dGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFN0cmluZyByZWZOYW1lID0gbW9kdWxlUmVmQXR0cmlidXRlLmdldEF0dHJpYnV0ZVZhbHVlKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoYXhpc0NvbmZpZy5nZXRNb2R1bGUocmVmTmFtZSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEV4Y2VwdGlvbihNT0RVTEVfTk9UX0ZPVU5EX0VSUk9SICsgcmVmTmFtZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYXhpc1NlcnZpY2VHcm91cC5hZGRNb2R1bGVyZWYocmVmTmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvb3NnaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9vc2dpL2RlcGxveW1lbnQvUmVnaXN0cnkuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL29zZ2kvc3JjL29yZy9hcGFjaGUvYXhpczIvb3NnaS9kZXBsb3ltZW50L1JlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmZjQxNDcuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvb3NnaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9vc2dpL2RlcGxveW1lbnQvUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNCwyMDA1IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5vc2dpLmRlcGxveW1lbnQ7Ci0KLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSAqICBUaGlzIGludGVyZmFjZSB3aWxsIGJlIHVzZWQgdG8gcmVnaXN0ZXIgdGhlIGV4dGVuc2lvbi9maWxlCi0gKiB0aGF0IG5lZWRlZCBiZSBwcm9jZXNzZWQgYW5kIGNyZWF0ZSB0aGUgcmVsZXZhbnQgQXhpcyogb2JqZWN0LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJlZ2lzdHJ5ewotCi0gICAgdm9pZCByZWdpc3RlcihCdW5kbGUgYnVuZGxlKTsKLQotICAgIHZvaWQgdW5SZWdpc3RlcihCdW5kbGUgYnVuZGxlLCBib29sZWFuIHVuaW5zdGFsbCk7Ci0KLSAgICB2b2lkIHJlc29sdmUoKTsKLQotICAgIHZvaWQgcmVtb3ZlKEJ1bmRsZSBidW5kbGUpOwotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvb3NnaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9vc2dpL2RlcGxveW1lbnQvU2VydmljZVJlZ2lzdHJ5LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9vc2dpL3NyYy9vcmcvYXBhY2hlL2F4aXMyL29zZ2kvZGVwbG95bWVudC9TZXJ2aWNlUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjYzZWNkMy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9vc2dpL3NyYy9vcmcvYXBhY2hlL2F4aXMyL29zZ2kvZGVwbG95bWVudC9TZXJ2aWNlUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDQsMjAwNSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIub3NnaS5kZXBsb3ltZW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC4qOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZUdyb3VwOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmF4aXMyLm9zZ2kuZGVwbG95bWVudC5PU0dpQXhpczJDb25zdGFudHMuTU9EVUxFX05PVF9GT1VORF9FUlJPUjsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5heGlzMi5vc2dpLmRlcGxveW1lbnQuT1NHaUF4aXMyQ29uc3RhbnRzLk9TR2lfQlVORExFX0lEOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotLyoqCi0gKiBDcmVhdGVzIHByb3BlciBBeGlzU2VydmljZUdyb3VwL0F4aXNTZXJ2aWNlIGxvb2tpbmcgaW50byBidW5kbGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlUmVnaXN0cnkgZXh0ZW5kcyBBYnN0cmFjdFJlZ2lzdHJ5PEF4aXNTZXJ2aWNlR3JvdXA+IHsKLQotICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhTZXJ2aWNlUmVnaXN0cnkuY2xhc3MpOwotCi0gICAgcHVibGljIFNlcnZpY2VSZWdpc3RyeShCdW5kbGVDb250ZXh0IGNvbnRleHQsIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0N0eCkgewotICAgICAgICBzdXBlcihjb250ZXh0LCBjb25maWdDdHgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyKEJ1bmRsZSBidW5kbGUpIHsKLSAgICAgICAgbG9jay5sb2NrKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhZGRTZXJ2aWNlcyhidW5kbGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgbG9jay51bmxvY2soKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdoZW4gYSBidW5kbGUgaXMgc3RhcnRlZCB0aGlzIG1ldGhvZCB3aWxsIGxvb2sgZm9yIHhtbCBmaWxlcyB0aGF0IHN1ZmZpeCB3aXRoICJzZXJ2aWNlcy54bWwiLgotICAgICAqIFRodXMsIGEgZ2l2ZW4gYnVuZGxlIGNhbiBoYXZlIG4gbnVtYmVyIG9mICpzZXJ2aWNlcy54bWwuCi0gICAgICogRXg6IG15MXNlcnZpY2VzLnhtbCBhbmQgbXkyX3NlcnZpY2VzLnhtbC4KLSAgICAgKiA8cC8+Ci0gICAgICogRHVlIHRvIHNlY3VyaXR5IGNvbnNpZGVyYXRpb24sIGlmIG9uZSAqc2VydmljZXMueG1sIGZhaWwsIGFsbCB0aGUgc2VydmljZXMgd2lsbCB0cmVhdGVkIGFzIGZhaWwuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYnVuZGxlIHJlZ2lzdGVyZWQgYnVuZGxlCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGFkZFNlcnZpY2VzKEJ1bmRsZSBidW5kbGUpIHsKLSAgICAgICAgaWYgKCFyZXNvbHZlZEJ1bmRsZXMuY29udGFpbnNLZXkoYnVuZGxlKSkgewotICAgICAgICAgICAgRW51bWVyYXRpb24gZW51bWVyYXRpb24gPSBidW5kbGUuZmluZEVudHJpZXMoIk1FVEEtSU5GIiwgIipzZXJ2aWNlcy54bWwiLCBmYWxzZSk7Ci0gICAgICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgICAgICBMaXN0PEF4aXNTZXJ2aWNlR3JvdXA+IGF4aXNTZXJ2aWNlR3JvdXBMaXN0ID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChlbnVtZXJhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYXhpc1NlcnZpY2VHcm91cExpc3QgPSBuZXcgQXJyYXlMaXN0PEF4aXNTZXJ2aWNlR3JvdXA+KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB3aGlsZSAoZW51bWVyYXRpb24gIT0gbnVsbCAmJiBlbnVtZXJhdGlvbi5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIFVSTCB1cmwgPSAoVVJMKSBlbnVtZXJhdGlvbi5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgICAgICAgICBBeGlzU2VydmljZUdyb3VwIHNlcnZpY2VHcm91cCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEF4aXNTZXJ2aWNlR3JvdXAoY29uZmlnQ3R4LmdldEF4aXNDb25maWd1cmF0aW9uKCkpOwotICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlR3JvdXAuYWRkUGFyYW1ldGVyKCJsYXN0LnVwZGF0ZWQiLCBidW5kbGUuZ2V0TGFzdE1vZGlmaWVkKCkpOwotICAgICAgICAgICAgICAgICAgICBDbGFzc0xvYWRlciBsb2FkZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCdW5kbGVDbGFzc0xvYWRlcihidW5kbGUsIFJlZ2lzdHJ5LmNsYXNzLmdldENsYXNzTG9hZGVyKCkpOwotICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlR3JvdXAuc2V0U2VydmljZUdyb3VwQ2xhc3NMb2FkZXIobG9hZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSB1cmwub3BlblN0cmVhbSgpOwotICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBEZXNjcmlwdGlvbkJ1aWxkZXIoaW5wdXRTdHJlYW0sIGNvbmZpZ0N0eCk7Ci0gICAgICAgICAgICAgICAgICAgIE9NRWxlbWVudCByb290RWxlbWVudCA9IGJ1aWxkZXIuYnVpbGRPTSgpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZWxlbWVudE5hbWUgPSByb290RWxlbWVudC5nZXRMb2NhbE5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgRGljdGlvbmFyeSBoZWFkZXJzID0gYnVuZGxlLmdldEhlYWRlcnMoKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGJ1bmRsZVN5bWJvbGljTmFtZSA9IChTdHJpbmcpIGhlYWRlcnMuZ2V0KCJCdW5kbGUtU3ltYm9saWNOYW1lIik7Ci0gICAgICAgICAgICAgICAgICAgIGJ1bmRsZVN5bWJvbGljTmFtZSA9IGJ1bmRsZVN5bWJvbGljTmFtZSArICJfIiArIGk7Ci0gICAgICAgICAgICAgICAgICAgIHNlcnZpY2VHcm91cC5zZXRTZXJ2aWNlR3JvdXBOYW1lKGJ1bmRsZVN5bWJvbGljTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIEhhc2hNYXAgd3NkbFNlcnZpY2VzTWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERlcGxveW1lbnRDb25zdGFudHMuVEFHX1NFUlZJQ0UuZXF1YWxzKGVsZW1lbnROYW1lKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UgPSBuZXcgQXhpc1NlcnZpY2UoYnVuZGxlU3ltYm9saWNOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlLnNldFBhcmVudChzZXJ2aWNlR3JvdXApOwotICAgICAgICAgICAgICAgICAgICAgICAgYXhpc1NlcnZpY2Uuc2V0Q2xhc3NMb2FkZXIobG9hZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZpY2VCdWlsZGVyIHNlcnZpY2VCdWlsZGVyID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9TR2lTZXJ2aWNlQnVpbGRlcihjb25maWdDdHgsIGF4aXNTZXJ2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VCdWlsZGVyLnNldFdzZGxTZXJ2aWNlTWFwKHdzZGxTZXJ2aWNlc01hcCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBeGlzU2VydmljZSBzZXJ2aWNlID0gc2VydmljZUJ1aWxkZXIucG9wdWxhdGVTZXJ2aWNlKHJvb3RFbGVtZW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5TGlzdDxBeGlzU2VydmljZT4gc2VydmljZUxpc3QgPSBuZXcgQXJyYXlMaXN0PEF4aXNTZXJ2aWNlPigpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZUxpc3QuYWRkKHNlcnZpY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgRGVwbG95bWVudEVuZ2luZS5hZGRTZXJ2aWNlR3JvdXAoc2VydmljZUdyb3VwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZUxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ0N0eC5nZXRBeGlzQ29uZmlndXJhdGlvbigpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJbQXhpczIvT1NHaV0gRGVwbG95ZWQgYXhpczIgc2VydmljZToiICsgc2VydmljZS5nZXROYW1lKCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBpbiBCdW5kbGU6ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVuZGxlLmdldFN5bWJvbGljTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChEZXBsb3ltZW50Q29uc3RhbnRzLlRBR19TRVJWSUNFX0dST1VQLmVxdWFscyhlbGVtZW50TmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZpY2VHcm91cEJ1aWxkZXIgZ3JvdXBCdWlsZGVyID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9TR2lTZXJ2aWNlR3JvdXBCdWlsZGVyKHJvb3RFbGVtZW50LCB3c2RsU2VydmljZXNNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWdDdHgpOwotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlMaXN0IHNlcnZpY2VMaXN0ID0gZ3JvdXBCdWlsZGVyLnBvcHVsYXRlU2VydmljZUdyb3VwKHNlcnZpY2VHcm91cCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBEZXBsb3ltZW50RW5naW5lLmFkZFNlcnZpY2VHcm91cChzZXJ2aWNlR3JvdXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlTGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnQ3R4LmdldEF4aXNDb25maWd1cmF0aW9uKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmluZm8oIltBeGlzMi9PU0dpXSBEZXBsb3llZCBheGlzMiBzZXJ2aWNlIGdyb3VwOiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZUdyb3VwLmdldFNlcnZpY2VHcm91cE5hbWUoKSArICIgaW4gQnVuZGxlOiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1bmRsZS5nZXRTeW1ib2xpY05hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy9idW5kbGUgSWQga2VlcHMgdGhlIGFzc29jaWF0aW9uIGJldHdlZW4gYnVuZGxlIGFuZCBheGlzU2VydmljZSBncm91cCBmb3IgbGF0ZXIgdXNlCi0gICAgICAgICAgICAgICAgICAgIHNlcnZpY2VHcm91cC5hZGRQYXJhbWV0ZXIoT1NHaV9CVU5ETEVfSUQsIGJ1bmRsZS5nZXRCdW5kbGVJZCgpKTsKLSAgICAgICAgICAgICAgICAgICAgYXhpc1NlcnZpY2VHcm91cExpc3QuYWRkKHNlcnZpY2VHcm91cCk7Ci0gICAgICAgICAgICAgICAgICAgIC8vbWFya2VkIGFzIHJlc29sdmVkLgotICAgICAgICAgICAgICAgICAgICBpZiAodW5yZXNsb3ZlZEJ1bmRsZXMuY29udGFpbnMoYnVuZGxlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdW5yZXNsb3ZlZEJ1bmRsZXMucmVtb3ZlKGJ1bmRsZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiRXJyb3Igd2hpbGUgcmVhZGluZyBmcm9tIHRoZSBidW5kbGUiOwotICAgICAgICAgICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIERlcGxveW1lbnRFeGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gZS5nZXRNZXNzYWdlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZSAhPSBudWxsICYmIG1lc3NhZ2UubGVuZ3RoKCkgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLmluZGV4T2YoTU9EVUxFX05PVF9GT1VORF9FUlJPUikgPiAtMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXVucmVzbG92ZWRCdW5kbGVzLmNvbnRhaW5zKGJ1bmRsZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJBIHNlcnZpY2UgYmVpbmcgZm91bmQgd2l0aCB1bm1lYW50IG1vZHVsZSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXBlbmRlbmN5LiBIZW5jZSwgbW92ZWQgaXQgdG8gVU5SRVNPTFZFRCBzdGF0ZS4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVucmVzbG92ZWRCdW5kbGVzLmFkZChidW5kbGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmluZm8oIkEgc2VydmljZSBiZWluZyBmb3VuZCBpbiBVTlJFU09MVkVEIHN0YXRlLiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKG1zZywgZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKG1zZywgZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3IobXNnLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGF4aXNTZXJ2aWNlR3JvdXBMaXN0ICE9IG51bGwgJiYgYXhpc1NlcnZpY2VHcm91cExpc3Quc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgICAgIHJlc29sdmVkQnVuZGxlcy5wdXQoYnVuZGxlLCBheGlzU2VydmljZUdyb3VwTGlzdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHVuUmVnaXN0ZXIoQnVuZGxlIGJ1bmRsZSwgYm9vbGVhbiB1bmluc3RhbGwpIHsKLSAgICAgICAgbG9jay5sb2NrKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBMaXN0PEF4aXNTZXJ2aWNlR3JvdXA+IGF4aXNTZXJ2aWNlR3JvdXBMaXN0ID0gcmVzb2x2ZWRCdW5kbGVzLmdldChidW5kbGUpOwotICAgICAgICAgICAgaWYgKGF4aXNTZXJ2aWNlR3JvdXBMaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb3IgKEF4aXNTZXJ2aWNlR3JvdXAgYXhpc1NlcnZpY2VHcm91cCA6IGF4aXNTZXJ2aWNlR3JvdXBMaXN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlZEJ1bmRsZXMuY29udGFpbnNLZXkoYnVuZGxlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZWRCdW5kbGVzLnJlbW92ZShidW5kbGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmICghdW5yZXNsb3ZlZEJ1bmRsZXMuY29udGFpbnMoYnVuZGxlKSAmJiAhdW5pbnN0YWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1bnJlc2xvdmVkQnVuZGxlcy5hZGQoYnVuZGxlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGF4aXNTZXJ2aWNlR3JvdXAuZ2V0U2VydmljZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2UgPSAoQXhpc1NlcnZpY2UpIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuaW5mbygiW0F4aXMyL09TR2ldIFNlcnZpY2UgLSAiICsgc2VydmljZS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnQ3R4LmdldEF4aXNDb25maWd1cmF0aW9uKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlbW92ZVNlcnZpY2VHcm91cChheGlzU2VydmljZUdyb3VwLmdldFNlcnZpY2VHcm91cE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuaW5mbygiW0F4aXMyL09TR2ldIFN0b3BwaW5nICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpc1NlcnZpY2VHcm91cC5nZXRTZXJ2aWNlR3JvdXBOYW1lKCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBzZXJ2aWNlIGdyb3VwIGluIEJ1bmRsZSAtICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVuZGxlLmdldFN5bWJvbGljTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiRXJyb3Igd2hpbGUgcmVtb3ZpbmcgdGhlIHNlcnZpY2UgZ3JvdXAiOwotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKG1zZywgZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGxvY2sudW5sb2NrKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmUoQnVuZGxlIGJ1bmRsZSkgewotICAgICAgICB1blJlZ2lzdGVyKGJ1bmRsZSwgdHJ1ZSk7Ci0gICAgICAgIGxvY2subG9jaygpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKHJlc29sdmVkQnVuZGxlcy5jb250YWluc0tleShidW5kbGUpKSB7Ci0gICAgICAgICAgICAgICAgcmVzb2x2ZWRCdW5kbGVzLnJlbW92ZShidW5kbGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHVucmVzbG92ZWRCdW5kbGVzLmNvbnRhaW5zKGJ1bmRsZSkpIHsKLSAgICAgICAgICAgICAgICB1bnJlc2xvdmVkQnVuZGxlcy5yZW1vdmUoYnVuZGxlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGxvY2sudW5sb2NrKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9vc2dpL3NyYy9vcmcvYXBhY2hlL2F4aXMyL29zZ2kvZGVwbG95bWVudC90cmFja2VyL0J1bmRsZVRyYWNrZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL29zZ2kvc3JjL29yZy9hcGFjaGUvYXhpczIvb3NnaS9kZXBsb3ltZW50L3RyYWNrZXIvQnVuZGxlVHJhY2tlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOWUxNjNkLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL29zZ2kvc3JjL29yZy9hcGFjaGUvYXhpczIvb3NnaS9kZXBsb3ltZW50L3RyYWNrZXIvQnVuZGxlVHJhY2tlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNCwyMDA1IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5vc2dpLmRlcGxveW1lbnQudHJhY2tlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIub3NnaS5kZXBsb3ltZW50LlJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUV2ZW50OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVMaXN0ZW5lcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuTG9jazsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5SZWVudHJhbnRMb2NrOwotCi0vKioKLSAqIEJ1bmRsZVRyYWNrZXIgbGlzdGVuIHRvIGJ1bmRsZSBldmVudHMgYW5kIGNsYXNzIHRoZSByZWdpc3RlcmVkIFJlZ2lzdHJ5Ci0gKiBvYmplY3RzIHRvIGRlYWwgd2l0aCB0aGVtLiBPbmUgYmUgYWJsZSB0byBhZGQgUmVnaXN0cnkgb2JqZWN0cyB0byBCdW5kbGVUcmFja2VyIGFuZCByZW1vdmUKLSAqIHRoZW0gYXMgbmVjZXNzYXJ5LiBXaGVuIG9wZW4oKSBpcyBjYWxsZWQgQnVuZGxlVHJhY2tlciB3aWxsIG9wZW4gdGhlIHRyYWNraW5nIGFuZCB3aGVuIGNsb3NlKCkKLSAqIGlzIGNhbGxlZCBjbG9zZSB0aGUgdHJhY2tpbmcuCi0gKi8KLXB1YmxpYyBjbGFzcyBCdW5kbGVUcmFja2VyIHsKLQotICAgIHByaXZhdGUgTGlzdDxSZWdpc3RyeT4gcmVnaXN0cnlMaXN0ID0gbmV3IEFycmF5TGlzdDxSZWdpc3RyeT4oKTsKLQotICAgIHByaXZhdGUgTGlzdDxCdW5kbGU+IGJ1bmRsZUxpc3QgPSBuZXcgQXJyYXlMaXN0PEJ1bmRsZT4oKTsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBvcGVuOwotCi0gICAgcHJpdmF0ZSBCdW5kbGVDb250ZXh0IGNvbnRleHQ7Ci0KLSAgICBwcml2YXRlIEJ1bmRsZUxpc3RlbmVyIGJ1bmRsZUxpc3RlbmVyOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEJ1bmRsZVRyYWNrZXIuY2xhc3MpOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBMb2NrIGxvY2sgPSBuZXcgUmVlbnRyYW50TG9jaygpOwotCi0gICAgcHVibGljIEJ1bmRsZVRyYWNrZXIoZmluYWwgQnVuZGxlQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7Ci0gICAgICAgIGJ1bmRsZUxpc3RlbmVyID0gbmV3IEJ1bmRsZUxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgYnVuZGxlQ2hhbmdlZChCdW5kbGVFdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIGxvY2subG9jaygpOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghb3BlbikgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIEJ1bmRsZSBidW5kbGUgPSBldmVudC5nZXRCdW5kbGUoKTsKLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChldmVudC5nZXRUeXBlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQnVuZGxlRXZlbnQuU1RBUlRFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWJ1bmRsZUxpc3QuY29udGFpbnMoZXZlbnQuZ2V0QnVuZGxlKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1bmRsZUxpc3QuYWRkKGV2ZW50LmdldEJ1bmRsZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9naWMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChSZWdpc3RyeSByZWdpc3RyeSA6IHJlZ2lzdHJ5TGlzdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0cnkucmVnaXN0ZXIoYnVuZGxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQnVuZGxlRXZlbnQuU1RPUFBFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGV4dC5nZXRCdW5kbGUoKSAhPSBidW5kbGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ1bmRsZUxpc3QuY29udGFpbnMoZXZlbnQuZ2V0QnVuZGxlKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidW5kbGVMaXN0LnJlbW92ZShldmVudC5nZXRCdW5kbGUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2xvZ2ljCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKFJlZ2lzdHJ5IHJlZ2lzdHJ5IDogcmVnaXN0cnlMaXN0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0cnkudW5SZWdpc3RlcihidW5kbGUsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCdW5kbGVFdmVudC5VTklOU1RBTExFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGV4dC5nZXRCdW5kbGUoKSAhPSBidW5kbGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ1bmRsZUxpc3QuY29udGFpbnMoZXZlbnQuZ2V0QnVuZGxlKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidW5kbGVMaXN0LnJlbW92ZShldmVudC5nZXRCdW5kbGUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2xvZ2ljCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKFJlZ2lzdHJ5IHJlZ2lzdHJ5IDogcmVnaXN0cnlMaXN0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0cnkucmVtb3ZlKGJ1bmRsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICBsb2NrLnVubG9jaygpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfQotICAgICAgICB9OwotCi0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRSZWdpc3RyeShSZWdpc3RyeSByZWdpc3RyeSkgewotICAgICAgICByZWdpc3RyeUxpc3QuYWRkKHJlZ2lzdHJ5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBvcGVuKCkgewotICAgICAgICBsb2NrLmxvY2soKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmICghb3BlbikgewotICAgICAgICAgICAgICAgIG9wZW4gPSB0cnVlOwotICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJCdW5kbGUgdHJhY2tlciBpcyBvcGVuZWQiKTsKLSAgICAgICAgICAgICAgICBCdW5kbGVbXSBidW5kbGVzID0gY29udGV4dC5nZXRCdW5kbGVzKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChCdW5kbGUgYnVuZGxlIDogYnVuZGxlcykgewotICAgICAgICAgICAgICAgICAgICBpZiAoYnVuZGxlLmdldFN0YXRlKCkgPT0gQnVuZGxlLkFDVElWRSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYnVuZGxlTGlzdC5hZGQoYnVuZGxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoUmVnaXN0cnkgcmVnaXN0cnkgOiByZWdpc3RyeUxpc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RyeS5yZWdpc3RlcihidW5kbGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNvbnRleHQuYWRkQnVuZGxlTGlzdGVuZXIoYnVuZGxlTGlzdGVuZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgbG9jay51bmxvY2soKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgewotICAgICAgICBsb2NrLmxvY2soKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChvcGVuKSB7Ci0gICAgICAgICAgICAgICAgb3BlbiA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGNvbnRleHQucmVtb3ZlQnVuZGxlTGlzdGVuZXIoYnVuZGxlTGlzdGVuZXIpOwotICAgICAgICAgICAgICAgIEJ1bmRsZVtdIGJ1bmRsZXMgPSBidW5kbGVMaXN0LnRvQXJyYXkobmV3IEJ1bmRsZVtidW5kbGVMaXN0LnNpemUoKV0pOwotICAgICAgICAgICAgICAgIGZvciAoQnVuZGxlIGJ1bmRsZSA6IGJ1bmRsZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGJ1bmRsZUxpc3QucmVtb3ZlKGJ1bmRsZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoUmVnaXN0cnkgcmVnaXN0cnkgOiByZWdpc3RyeUxpc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RyeS5yZW1vdmUoYnVuZGxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBsb2cuaW5mbygiQnVuZGxlIHRyYWNrZXIgaXMgY2xvc2VkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBsb2NrLnVubG9jaygpOwotICAgICAgICB9Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL29zZ2kvc3JjL29yZy9hcGFjaGUvYXhpczIvb3NnaS9kZXBsb3ltZW50L3RyYWNrZXIvV1NUcmFja2VyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9vc2dpL3NyYy9vcmcvYXBhY2hlL2F4aXMyL29zZ2kvZGVwbG95bWVudC90cmFja2VyL1dTVHJhY2tlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTQ3YzUxLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL29zZ2kvc3JjL29yZy9hcGFjaGUvYXhpczIvb3NnaS9kZXBsb3ltZW50L3RyYWNrZXIvV1NUcmFja2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA0LDIwMDUgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLm9zZ2kuZGVwbG95bWVudC50cmFja2VyOwotCi1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuTWVzc2FnZVJlY2VpdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uV1NETDJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLm9zZ2kuZGVwbG95bWVudC5CdW5kbGVDbGFzc0xvYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ycGMucmVjZWl2ZXJzLlJQQ0luT25seU1lc3NhZ2VSZWNlaXZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJwYy5yZWNlaXZlcnMuUlBDTWVzc2FnZVJlY2VpdmVyOwotCi1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuTG9jazsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5SZWVudHJhbnRMb2NrOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotLyoqCi0gKiBXU1RyYWNrZXIgd2lsbCBsaXN0ZW4gdG8gcmVnaXN0ZXJlZCBzZXJ2aWNlcyBhbmQgZXhwb3NlIHRoZW0gYXMgV2ViIFNlcnZpY2VzIChBeGlzU2VydmljZSkKLSAqIGlmIGFuZCBvbmx5IGlmIHRoZSBhdHRhY2hlZCBEaXJlY3Rvcnkgb2JqZWN0IGNvbnRhaW5zIHRoZSBuYW1lL3ZhbHVlIHBhaXIgIm9yZy5hcGFjaGUuYXhpczIud3MiLgotICogSW4gYWRkaXRpb24gdG8gdGhpcyBXU1RyYWNrZXIgdXNlcyBkaWZmZXJlbnQgbmFtZS92YWx1ZSBwYWlycyB0byBtYW5pcHVsYXRlIEF4aXNTZXJ2aWNlIGFzIHJlcXVpcmVkLgotICovCi1wdWJsaWMgY2xhc3MgV1NUcmFja2VyIHsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBvcGVuOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBMb2NrIGxvY2sgPSBuZXcgUmVlbnRyYW50TG9jaygpOwotCi0gICAgcHJpdmF0ZSBCdW5kbGVDb250ZXh0IGNvbnRleHQ7Ci0KLSAgICBwcml2YXRlIFNlcnZpY2VMaXN0ZW5lciBzZXJ2aWNlTGlzdGVuZXI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coV1NUcmFja2VyLmNsYXNzKTsKLQotICAgIHByaXZhdGUgTGlzdDxCdW5kbGU+IGJ1bmRsZUxpc3QgPSBuZXcgQXJyYXlMaXN0PEJ1bmRsZT4oKTsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEFYSVMyX1dTID0gIm9yZy5hcGFjaGUuYXhpczIub3NnaS53cyI7Ci0KLSAgICBwcml2YXRlIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0N0eDsKLQotICAgIHB1YmxpYyBXU1RyYWNrZXIoQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ3R4LCBCdW5kbGVDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDsKLSAgICAgICAgdGhpcy5jb25maWdDdHggPSBjb25maWdDdHg7Ci0gICAgICAgIHRoaXMuc2VydmljZUxpc3RlbmVyID0gbmV3IFNlcnZpY2VMaXN0ZW5lcigpIHsKLQotICAgICAgICAgICAgcHVibGljIHZvaWQgc2VydmljZUNoYW5nZWQoU2VydmljZUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgaW50IHNlcnZpY2VUeXBlID0gZXZlbnQuZ2V0VHlwZSgpOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc2VydmljZVR5cGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU2VydmljZUV2ZW50LlJFR0lTVEVSRUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VydmljZVJlZmVyZW5jZSByZWZlcmVuY2UgPSBldmVudC5nZXRTZXJ2aWNlUmVmZXJlbmNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlV1MocmVmZXJlbmNlLmdldEJ1bmRsZSgpLCBldmVudC5nZXRTZXJ2aWNlUmVmZXJlbmNlKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTZXJ2aWNlRXZlbnQuVU5SRUdJU1RFUklORzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1RPRE8gcmVtb3ZlIHdlYiBzZXJ2aWNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgZSkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbXNnID0gIkVycm9yIHdoaWxlIGNyZWF0aW5nIEF4aXNTZXJ2aWNlIjsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKG1zZywgZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9OwotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb3BlbigpIHsKLSAgICAgICAgaWYgKG9wZW4pIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBvcGVuID0gdHJ1ZTsKLSAgICAgICAgZm9yIChCdW5kbGUgYnVuZGxlIDogY29udGV4dC5nZXRCdW5kbGVzKCkpIHsKLSAgICAgICAgICAgIGlmIChidW5kbGUgIT0gY29udGV4dC5nZXRCdW5kbGUoKSkgewotICAgICAgICAgICAgICAgIFNlcnZpY2VSZWZlcmVuY2VbXSByZWZlcmVuY2VzID0gYnVuZGxlLmdldFJlZ2lzdGVyZWRTZXJ2aWNlcygpOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGNyZWF0ZVdTKGJ1bmRsZSwgcmVmZXJlbmNlcyk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGUpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJFcnJvciB3aGlsZSBjcmVhdGluZyBBeGlzU2VydmljZSBmcm9tIGJ1bmRsZSA6ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVuZGxlLmdldEJ1bmRsZUlkKCk7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcihtc2csIGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBidW5kbGVMaXN0LmFkZChidW5kbGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNvbnRleHQuYWRkU2VydmljZUxpc3RlbmVyKHNlcnZpY2VMaXN0ZW5lcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VydmljZVJlZmVyZWNlIHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgdGhlIHdlYiBzZXJ2aWNlIGJhc2VkIG9uIERpcmVjdG9yeSBvYmplY3RzLgotICAgICAqCi0gICAgICogQHBhcmFtIGJ1bmRsZTsgICAgIGFzc29jaWF0ZWQgYnVuZGxlIHRvIG9idGFpbiBtZXRhIGluZm9ybWF0aW9uCi0gICAgICogQHBhcmFtIHJlZmVyZW5jZXM7IFNlcnZpY2VSZWZlcmVuY2VzIGFycmF5Ci0gICAgICogQHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdCB3aWxsIGJlIHRocm93bgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVXUyhCdW5kbGUgYnVuZGxlLCBTZXJ2aWNlUmVmZXJlbmNlW10gcmVmZXJlbmNlcykgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIGlmIChidW5kbGUgIT0gbnVsbCAmJiByZWZlcmVuY2VzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoU2VydmljZVJlZmVyZW5jZSByZWZlcmVuY2UgOiByZWZlcmVuY2VzKSB7Ci0gICAgICAgICAgICAgICAgY3JlYXRlV1MoYnVuZGxlLCByZWZlcmVuY2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVE9ETzogVGhpcyBtZXRob2QgbmVlZCBtb3JlIG1vZGlmaWNhdGlvbnMKLSAgICAgKgotICAgICAqIEBwYXJhbSBidW5kbGUgICAgYnVuZGxlCi0gICAgICogQHBhcmFtIHJlZmVyZW5jZSByZWZlcmVuY2UKLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdCB3aWxsIGJlIHRocm93bgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVXUyhCdW5kbGUgYnVuZGxlLCBTZXJ2aWNlUmVmZXJlbmNlIHJlZmVyZW5jZSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIGlmIChidW5kbGUgIT0gbnVsbCAmJiByZWZlcmVuY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgT2JqZWN0IGF4aXMyV3MgPSByZWZlcmVuY2UuZ2V0UHJvcGVydHkoQVhJUzJfV1MpOwotICAgICAgICAgICAgaWYgKGF4aXMyV3MgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFN0cmluZyB3c05hbWUgPSBheGlzMldzLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICBsb2NrLmxvY2soKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IHNlcnZpY2UgPSBjb250ZXh0LmdldFNlcnZpY2UocmVmZXJlbmNlKTsKLSAgICAgICAgICAgICAgICBBeGlzU2VydmljZSBheGlzU2VydmljZSA9IEF4aXNTZXJ2aWNlLmNyZWF0ZVNlcnZpY2UoCi0gICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLmdldENsYXNzKCkuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnQ3R4LmdldEF4aXNDb25maWd1cmF0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVEZWZhdWx0TWVzc2FnZVJlY2VpdmVycygpLAotICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgQnVuZGxlQ2xhc3NMb2FkZXIoYnVuZGxlLCBXU1RyYWNrZXIuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSkpOwotICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlLnNldE5hbWUod3NOYW1lKTsKLSAgICAgICAgICAgICAgICBjb25maWdDdHguZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5hZGRTZXJ2aWNlKGF4aXNTZXJ2aWNlKTsKLSAgICAgICAgICAgICAgICBsb2cuaW5mbygiQWRkZWQgbmV3IFdTIGZyb20gU2VydmljZVJlZmVyZW5jZSA6ICIgKyBzZXJ2aWNlLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgbG9jay51bmxvY2soKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgTWFwIGNyZWF0ZURlZmF1bHRNZXNzYWdlUmVjZWl2ZXJzKCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIE1hcDxTdHJpbmcsIE1lc3NhZ2VSZWNlaXZlcj4gbWVzc2FnZVJlY2l2ZXJNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE1lc3NhZ2VSZWNlaXZlcj4oKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE1lc3NhZ2VSZWNlaXZlciBtZXNzYWdlUmVjZWl2ZXIgPSBSUENJbk9ubHlNZXNzYWdlUmVjZWl2ZXIuY2xhc3MubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIG1lc3NhZ2VSZWNpdmVyTWFwLnB1dChXU0RMMkNvbnN0YW50cy5NRVBfVVJJX0lOX09OTFksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVJlY2VpdmVyKTsKLSAgICAgICAgICAgIE1lc3NhZ2VSZWNlaXZlciBpbk91dG1lc3NhZ2VSZWNlaXZlciA9IFJQQ01lc3NhZ2VSZWNlaXZlci5jbGFzcy5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgbWVzc2FnZVJlY2l2ZXJNYXAucHV0KFdTREwyQ29uc3RhbnRzLk1FUF9VUklfSU5fT1VULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluT3V0bWVzc2FnZVJlY2VpdmVyKTsKLSAgICAgICAgICAgIG1lc3NhZ2VSZWNpdmVyTWFwLnB1dChXU0RMMkNvbnN0YW50cy5NRVBfVVJJX1JPQlVTVF9JTl9PTkxZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluT3V0bWVzc2FnZVJlY2VpdmVyKTsKLSAgICAgICAgfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbXNnID0gIk1lc3NhZ2UgcmVjZWl2ZXJzIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQiOwotICAgICAgICAgICAgbG9nLmVycm9yKG1zZywgZSk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KG1zZywgZSk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJJbGxlZ2FsIGFjY2VzcyI7Ci0gICAgICAgICAgICBsb2cuZXJyb3IobXNnLCBlKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQobXNnLCBlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbWVzc2FnZVJlY2l2ZXJNYXA7Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL29zZ2kvc3JjL29yZy9hcGFjaGUvYXhpczIvb3NnaS9pbnRlcm5hbC9BY3RpdmF0b3IuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL29zZ2kvc3JjL29yZy9hcGFjaGUvYXhpczIvb3NnaS9pbnRlcm5hbC9BY3RpdmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJmOTdjOS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9vc2dpL3NyYy9vcmcvYXBhY2hlL2F4aXMyL29zZ2kvaW50ZXJuYWwvQWN0aXZhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA0LDIwMDUgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLm9zZ2kuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5vc2dpLk9TR2lBeGlzU2VydmxldDsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5heGlzMi5vc2dpLmRlcGxveW1lbnQuT1NHaUF4aXMyQ29uc3RhbnRzLkFYSVMyX09TR2lfUk9PVF9DT05URVhUOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIub3NnaS5kZXBsb3ltZW50Lk9TR2lDb25maWd1cmF0aW9uQ29udGV4dEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLio7Ci1pbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5odHRwLkh0dHBTZXJ2aWNlOwotaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UuaHR0cC5OYW1lc3BhY2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLm9zZ2kudXRpbC50cmFja2VyLlNlcnZpY2VUcmFja2VyOwotCi1pbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOwotCi0vKioKLSAqIEFjdGl2YXRvciB3aWxsIHNldCB0aGUgbmVjZXNzYXJ5IHBhcmFtZXRlcnMgdGhhdCBpbml0aWF0ZSBBeGlzMiBPU0dpIGludGVncmF0aW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3RpdmF0b3IgaW1wbGVtZW50cyBCdW5kbGVBY3RpdmF0b3J7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coQWN0aXZhdG9yLmNsYXNzKTsKLQotICAgIHByaXZhdGUgSHR0cFNlcnZpY2VUcmFja2VyIHRyYWNrZXI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIE9TR2lDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkgbWFuYWdlZFNlcnZpY2U7Ci0KLSAgICBwdWJsaWMgQWN0aXZhdG9yKCkgewotICAgICAgICBtYW5hZ2VkU2VydmljZSA9IG5ldyBPU0dpQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbWFuYWdlZFNlcnZpY2Uuc3RhcnQoY29udGV4dCk7Ci0gICAgICAgIG1hbmFnZWRTZXJ2aWNlLnVwZGF0ZWQobnVsbCk7Ci0gICAgICAgIHRyYWNrZXIgPSBuZXcgSHR0cFNlcnZpY2VUcmFja2VyKGNvbnRleHQpOwotICAgICAgICB0cmFja2VyLm9wZW4oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgewotICAgICAgICB0cmFja2VyLmNsb3NlKCk7Ci0gICAgICAgIG1hbmFnZWRTZXJ2aWNlLnN0b3AoKTsKLSAgICAgICAgLy91bmdldFNlcnZpY2UgQ29uZmlndXJhdGlvbkNvbnRleHQuY2xhc3MuZ2V0TmFtZSgpCi0gICAgICAgIFNlcnZpY2VSZWZlcmVuY2UgY29uZmlnQ3R4UmVmID0KLSAgICAgICAgICAgICAgICBjb250ZXh0LmdldFNlcnZpY2VSZWZlcmVuY2UoQ29uZmlndXJhdGlvbkNvbnRleHQuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgaWYgKGNvbmZpZ0N0eFJlZiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjb250ZXh0LnVuZ2V0U2VydmljZShjb25maWdDdHhSZWYpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy9IdHRwU2VydmljZVRyYWNrZXIKLQotICAgIGNsYXNzIEh0dHBTZXJ2aWNlVHJhY2tlciBleHRlbmRzIFNlcnZpY2VUcmFja2VyIHsKLQotICAgICAgICBwdWJsaWMgSHR0cFNlcnZpY2VUcmFja2VyKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgewotICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgSHR0cFNlcnZpY2UuY2xhc3MuZ2V0TmFtZSgpLCBudWxsKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBPYmplY3QgYWRkaW5nU2VydmljZShTZXJ2aWNlUmVmZXJlbmNlIHNlcnZpY2VSZWZlcmVuY2UpIHsKLQotICAgICAgICAgICAgSHR0cFNlcnZpY2UgaHR0cFNlcnZpY2UgPSAoSHR0cFNlcnZpY2UpIGNvbnRleHQuZ2V0U2VydmljZShzZXJ2aWNlUmVmZXJlbmNlKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgT1NHaUF4aXNTZXJ2bGV0IGF4aXNTZXJ2bGV0ID0gbmV3IE9TR2lBeGlzU2VydmxldChjb250ZXh0KTsKLSAgICAgICAgICAgICAgICBTZXJ2aWNlUmVmZXJlbmNlIGNvbmZpZ0N0eFJlZiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmdldFNlcnZpY2VSZWZlcmVuY2UoQ29uZmlndXJhdGlvbkNvbnRleHQuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDdHggPQotICAgICAgICAgICAgICAgICAgICAgICAgKENvbmZpZ3VyYXRpb25Db250ZXh0KSBjb250ZXh0LmdldFNlcnZpY2UoY29uZmlnQ3R4UmVmKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcHJvcFNlcnZpY2VDb250ZXh0Um9vdCA9IGNvbnRleHQuZ2V0UHJvcGVydHkoQVhJUzJfT1NHaV9ST09UX0NPTlRFWFQpOwotICAgICAgICAgICAgICAgIFN0cmluZyBzZXJ2aWNlQ29udGV4dFJvb3QgPSAic2VydmljZXMiOwotICAgICAgICAgICAgICAgIGlmIChwcm9wU2VydmljZUNvbnRleHRSb290ICE9IG51bGwgJiYgcHJvcFNlcnZpY2VDb250ZXh0Um9vdC5sZW5ndGgoKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wU2VydmljZUNvbnRleHRSb290LnN0YXJ0c1dpdGgoIi8iKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZUNvbnRleHRSb290ID0gcHJvcFNlcnZpY2VDb250ZXh0Um9vdC5zdWJzdHJpbmcoMSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlQ29udGV4dFJvb3QgPSBwcm9wU2VydmljZUNvbnRleHRSb290OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNvbmZpZ0N0eC5zZXRTZXJ2aWNlUGF0aChzZXJ2aWNlQ29udGV4dFJvb3QpOwotICAgICAgICAgICAgICAgIFN0cmluZyBjb250ZXh0Um9vdCA9ICIvIiArIHNlcnZpY2VDb250ZXh0Um9vdDsKLSAgICAgICAgICAgICAgICBsb2cuaW5mbygiUmVnaXN0ZXJpbmcgU09BUCBtZXNzYWdlIGxpc3RlbmVyIHNlcnZsZXQgdG8gY29udGV4dCA6ICIgKyBjb250ZXh0Um9vdCk7Ci0gICAgICAgICAgICAgICAgaHR0cFNlcnZpY2UucmVnaXN0ZXJTZXJ2bGV0KGNvbnRleHRSb290LCBheGlzU2VydmxldCwgbnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChTZXJ2bGV0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbXNnID0gIkVycm9yIHdoaWxlIHJlZ2lzdGVyaW5nIHNlcnZsZXRzIjsKLSAgICAgICAgICAgICAgICBsb2cuZXJyb3IobXNnLCBlKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKE5hbWVzcGFjZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJOYW1lc3BhY2UgbWlzc21hdGNoIHdoZW4gcmVnaXN0ZXJpbmcgc2VydmxldHMiOwotICAgICAgICAgICAgICAgIGxvZy5lcnJvcihtc2csIGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGh0dHBTZXJ2aWNlOwotICAgICAgICB9Ci0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9vc2dpL3NyYy9vcmcvYXBhY2hlL2F4aXMyL29zZ2kvdHgvSHR0cExpc3RlbmVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9vc2dpL3NyYy9vcmcvYXBhY2hlL2F4aXMyL29zZ2kvdHgvSHR0cExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmMTNlNWEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvb3NnaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9vc2dpL3R4L0h0dHBMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA0LDIwMDUgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLm9zZ2kudHg7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5UcmFuc3BvcnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LlNlc3Npb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlRyYW5zcG9ydEluRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIERlZmF1bHQgSHR0cExpc3RlbmVyIHRoYXQgc3luY2ggd2l0aCB0aGUgdW5kZXJseWluZyBsaXN0ZXJuZXIgZnJhbWV3b3Jrcy4KLSAqIFRoaXMgaW1wbGVtZW5hdGlvbiB1c2VzIG9yZy5vc2dpLnNlcnZpY2UuaHR0cC5wb3J0IHByb3BlcnR5IHRvIGZpbmQgdGhlIHBvcnQuCi0gKiA8cC8+Ci0gKiBBdCB0aGUgbW9tZW50IHRoaXMgd2lsbCBhc3N1bWUgdGhlIHVuZGVybHlpbmcgZXZuIGlzIEVxdWlub3guIGlmIHRoZSBwcmlvciBwcm9wZXJ0eSBpcyBub3Qgc2V0Ci0gKiB0aGlzIHdpbGwgZGVmYXVsdCB0byA4MC4KLSAqLwotcHVibGljIGNsYXNzIEh0dHBMaXN0ZW5lciBpbXBsZW1lbnRzIFRyYW5zcG9ydExpc3RlbmVyIHsKLQotICAgIHByaXZhdGUgQnVuZGxlQ29udGV4dCBjb250ZXh0OwotCi0gICAgcHJpdmF0ZSBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDdHg7Ci0KLSAgICBwdWJsaWMgSHR0cExpc3RlbmVyKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgewotICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGluaXQoQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ3R4LCBUcmFuc3BvcnRJbkRlc2NyaXB0aW9uIHRyYW5zcHJ0SW4pCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgdGhpcy5jb25maWdDdHggPSBjb25maWdDdHg7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RhcnQoKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgLy9pZ25vcmUKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdG9wKCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIC8vaWdub3JlCi0gICAgfQotCi0gICAgcHVibGljIEVuZHBvaW50UmVmZXJlbmNlIGdldEVQUkZvclNlcnZpY2UoU3RyaW5nIHNlcnZpY2VOYW1lLCBTdHJpbmcgaXApIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICByZXR1cm4gY2FsY3VsYXRlRW5kcG9pbnQoImh0dHAiLCBzZXJ2aWNlTmFtZSwgaXApOwotICAgIH0KLQotICAgIHB1YmxpYyBFbmRwb2ludFJlZmVyZW5jZVtdIGdldEVQUnNGb3JTZXJ2aWNlKFN0cmluZyBzZXJ2aWNlTmFtZSwgU3RyaW5nIGlwKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgcmV0dXJuIG5ldyBFbmRwb2ludFJlZmVyZW5jZVtde2NhbGN1bGF0ZUVuZHBvaW50KCJodHRwIiwgc2VydmljZU5hbWUsIGlwKX07Ci0gICAgfQotCi0gICAgcHVibGljIFNlc3Npb25Db250ZXh0IGdldFNlc3Npb25Db250ZXh0KE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0KSB7Ci0gICAgICAgIC8vaWdub3JlIGZvciB0aGUgbW9tZW50LiBUaGlzIHNob3VsZCBiZSBhYmxlIHRvIHRha2UgdGhlIEh0dHBTZXJ2aWNlIGFuZCBhdHRhY2hlZCB0byBpdC4KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGVzdHJveSgpIHsKLQotICAgIH0KLQotICAgIHByaXZhdGUgRW5kcG9pbnRSZWZlcmVuY2UgY2FsY3VsYXRlRW5kcG9pbnQoU3RyaW5nIHByb3RvY29sLCBTdHJpbmcgc2VydmljZU5hbWUsIFN0cmluZyBpcCkgewotICAgICAgICBTdHJpbmcgcG9ydFMgPSBjb250ZXh0LmdldFByb3BlcnR5KCJvcmcub3NnaS5zZXJ2aWNlLmh0dHAucG9ydCIpOwotICAgICAgICBpbnQgcG9ydCA9IDgwOwotICAgICAgICBpZiAocG9ydFMgIT0gbnVsbCAmJiBwb3J0Uy5sZW5ndGgoKSAhPSAwKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHBvcnQgPSBJbnRlZ2VyLnBhcnNlSW50KHBvcnRTKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ly9pZ25vcmUKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgc2VydmljZVBhdGggPSBjb25maWdDdHguZ2V0U2VydmljZVBhdGgoKTsKLSAgICAgICAgaWYgKHNlcnZpY2VQYXRoLnN0YXJ0c1dpdGgoIi8iKSkgewotICAgICAgICAgICAgc2VydmljZVBhdGggPSBzZXJ2aWNlUGF0aC5zdWJzdHJpbmcoMSk7Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nIGNvbnRleHRSb290ID0gY29uZmlnQ3R4LmdldENvbnRleHRSb290KCk7Ci0gICAgICAgIGlmIChjb250ZXh0Um9vdC5lcXVhbHMoIi8iKSB8fCBjb250ZXh0Um9vdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBjb250ZXh0Um9vdCA9ICIiOyAKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IEVuZHBvaW50UmVmZXJlbmNlKHByb3RvY29sICsgIjovLyIgKyBpcCArICI6IiArIHBvcnQgKyBjb250ZXh0Um9vdCArICIvIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZVBhdGggKyAiLyIgKyBzZXJ2aWNlTmFtZSArICIvIik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvcGFyZW50L3BvbS54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9wYXJlbnQvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ4NDg5My4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9wYXJlbnQvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzMjkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIgotICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGU8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPmFwYWNoZTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+MzwvdmVyc2lvbj4KLSAgICA8L3BhcmVudD4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5heGlzMi1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+MS41LjE8L3ZlcnNpb24+Ci0gICAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KLSAgICA8bmFtZT5BcGFjaGUgQXhpczIgLSBQYXJlbnQ8L25hbWU+Ci0gICAgPGluY2VwdGlvblllYXI+MjAwNDwvaW5jZXB0aW9uWWVhcj4KLSAgICA8ZGVzY3JpcHRpb24+QXhpczIgaXMgYW4gZWZmb3J0IHRvIHJlLWRlc2lnbiBhbmQgdG90YWxseSByZS1pbXBsZW1lbnQgYm90aCBBeGlzL0phdmEgYW5kCi0gICAgICAgIChldmVudHVhbGx5KSBBeGlzL0MrKyBvbiBhIG5ldyBhcmNoaXRlY3R1cmUuIEV2b2x2aW5nIGZyb20gdGhlIG5vdyBzdGFuZGFyZCAiaGFuZGxlciBjaGFpbiIKLSAgICAgICAgbW9kZWwgd2hpY2ggQXhpczEgcGlvbmVlcmVkLCBBeGlzMiBpcyBkZXZlbG9waW5nIGEgbW9yZSBmbGV4aWJsZSBwaXBlbGluZSBhcmNoaXRlY3R1cmUgd2hpY2gKLSAgICAgICAgY2FuIHlldCBiZSBtYW5hZ2VkIGFuZCBwYWNrYWdlZCBpbiBhIG1vcmUgb3JnYW5pemVkIG1hbm5lci4gVGhpcyBuZXcgZGVzaWduIGFja25vd2xlZGdlcyB0aGUKLSAgICAgICAgbWF0dXJpbmcgb2YgdGhlIFdlYiBzZXJ2aWNlcyBzcGFjZSBpbiB0ZXJtcyBvZiBuZXcgcHJvdG9jb2xzIHN1Y2ggYXMgV1MtUmVsaWFibGVNZXNzYWdpbmcsCi0gICAgICAgIFdTLVNlY3VyaXR5IGFuZCBXUy1BZGRyZXNzaW5nIHRoYXQgYXJlIGJ1aWx0IG9uIHRvcCBvZiB0aGUgYmFzZSBTT0FQIHN5c3RlbS4gQXQgdGhlIHRpbWUKLSAgICAgICAgQXhpczEgd2FzIGRlc2lnbmVkLCB3aGlsZSBpdCB3YXMgZnVsbHkgZXhwZWN0ZWQgdGhhdCBvdGhlciBwcm90b2NvbHMgc3VjaCBhcwotICAgICAgICBXUy1SZWxpYWJsZU1lc3NhZ2luZyB3b3VsZCBiZSBidWlsdCBvbiB0b3Agb2YgaXQsIHRoZXJlIHdhcyBub3QgYSBwcm9wZXIgZXh0ZW5zaW9uCi0gICAgICAgIGFyY2hpdGVjdHVyZSBkZWZpbmVkIHRvIGVuYWJsZSBjbGVhbiBjb21wb3NpdGlvbiBvZiBzdWNoIGxheWVycy4gVGh1cywgb25lIG9mIHRoZSBrZXkKLSAgICAgICAgbW90aXZhdGlvbnMgZm9yIEF4aXMyIGlzIHRvIHByb3ZpZGUgYSBjbGVhbiBhbmQgc2ltcGxlIGVudmlyb25tZW50IGZvciBsaWtlIEFwYWNoZSBTYW5kZXNoYQotICAgICAgICBhbmQgQXBhY2hlIFdTUzRKIHRvIGxheWVyIG9uIHRvcCBvZiB0aGUgYmFzZSBTT0FQIHN5c3RlbS4gQW5vdGhlciBkcml2aW5nIGZvcmNlIGZvciBBeGlzMiBhcwotICAgICAgICB3ZWxsIGFzIHRoZSBtb3ZlIGF3YXkgZnJvbSBSUEMgb3JpZW50ZWQgV2ViIHNlcnZpY2VzIHRvd2FyZHMgbW9yZSBkb2N1bWVudC1vcmllbnRlZCwgbWVzc2FnZQotICAgICAgICBzdHlsZSBhc3luY2hyb25vdXMgc2VydmljZSBpbnRlcmFjdGlvbnMuIFRoZSBBeGlzMiBwcm9qZWN0IGlzIGNlbnRlcmVkIG9uIGEgbmV3Ci0gICAgICAgIHJlcHJlc2VudGF0aW9uIGZvciBTT0FQIG1lc3NhZ2VzIGNhbGxlZCBBWElPTSAoQVhJcyBPYmplY3QgTW9kZWwpLiBBWElPTSBjb25zaXN0cyBvZiB0d28KLSAgICAgICAgcGFydHM6IGEgY29tcGxldGUgWE1MIEluZm9zZXQgcmVwcmVzZW50YXRpb24gYW5kIGEgU09BUCBJbmZvc2V0IHJlcHJlc2VudGF0aW9uIG9uIHRvcCBvZgotICAgICAgICB0aGF0LiBUaGUgWE1MIEluZm9zZXQgcmVwcmVzZW50YXRpb24gcHJvdmlkZXMgYSBKRE9NLWxpa2Ugc2ltcGxlIEFQSSBidXQgaXMgYnVpbHQgb24gYQotICAgICAgICBkZWZlcnJlZCBtb2RlbCB2aWEgYSBTdEFYLWJhc2VkIChTdHJlYW1pbmcgQVBJIGZvciBYTUwpIHB1bGwgcGFyc2luZyBBUEkuIEEga2V5IGZlYXR1cmUgb2YKLSAgICAgICAgQVhJT00gaXMgdGhhdCBpdCBhbGxvd3Mgb25lIHRvIHN0b3AgYnVpbGRpbmcgdGhlIFhNTCB0cmVlIGFuZCBqdXN0IGFjY2VzcyB0aGUgcHVsbCBzdHJlYW0KLSAgICAgICAgZGlyZWN0bHk7IHRodXMgZW5hYmxpbmcgYm90aCBtYXhpbXVtIGZsZXhpYmlsaXR5IGFuZCBtYXhpbXVtIHBlcmZvcm1hbmNlLiBUaGlzIGFwcHJvYWNoCi0gICAgICAgIGFsbG93cyB1cyB0byBzdXBwb3J0IG11bHRpcGxlIGxldmVscyBvZiBhYnN0cmFjdGlvbiBmb3IgY29uc3VtaW5nIGFuZCBvZmZlcmluZyBXZWIgc2VydmljZXM6Ci0gICAgICAgIHVzaW5nIHBsYWluIEFYSU9NLCB1c2luZyBnZW5lcmF0ZWQgY29kZSBhbmQgc3RhdGljYWxseSBkYXRhLWJvdW5kIGRhdGEgdHlwZXMgYW5kIHNvIG9uLiBBdAotICAgICAgICB0aGUgdGltZSBvZiBBeGlzMSdzIGRlc2lnbiwgUlBDLXN0eWxlLCBzeW5jaHJvbm91cywgcmVxdWVzdC1yZXNwb25zZSBpbnRlcmFjdGlvbnMgd2VyZSB0aGUKLSAgICAgICAgb3JkZXIgb2YgdGhlIGRheSBmb3IgV2ViIHNlcnZpY2VzLiBUb2RheSBzZXJ2aWNlIGludGVyYWN0aW9ucyBhcmUgbXVjaCBtb3JlIG1lc3NhZ2UKLSAgICAgICAgLW9yaWVudGVkIGFuZCBleHBsb2l0IG1hbnkgZGlmZmVyZW50IG1lc3NhZ2UgZXhjaGFuZ2UgcGF0dGVybnMuIFRoZSBBeGlzMiBlbmdpbmUKLSAgICAgICAgYXJjaGl0ZWN0dXJlIGlzIGNhcmVmdWwgdG8gbm90IGJ1aWxkIGluIGFueSBhc3N1bXB0aW9ucyBvZiByZXF1ZXN0LXJlc3BvbnNlIHBhdHRlcm5zIHRvCi0gICAgICAgIGVuc3VyZSB0aGF0IGl0IGNhbiBiZSB1c2VkIGVhc2lseSB0byBzdXBwb3J0IGFyYml0cmFyeSBtZXNzYWdlIGV4Y2hhbmdlCi0gICAgICAgIHBhdHRlcm5zLgotICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgPHVybD5odHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi88L3VybD4KLSAgICA8b3JnYW5pemF0aW9uPgotICAgICAgICA8bmFtZT5BcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbjwvbmFtZT4KLSAgICAgICAgPHVybD5odHRwOi8vd3d3LmFwYWNoZS5vcmcvPC91cmw+Ci0gICAgPC9vcmdhbml6YXRpb24+Ci0gICAgPGlzc3VlTWFuYWdlbWVudD4KLSAgICAgICAgPHN5c3RlbT5qaXJhPC9zeXN0ZW0+Ci0gICAgICAgIDx1cmw+aHR0cDovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0FYSVMyPC91cmw+Ci0gICAgPC9pc3N1ZU1hbmFnZW1lbnQ+Ci0gICAgPHByb3BlcnRpZXM+Ci0gICAgICAgIDwhLS0KLSAgICAgICAgTk9URTogUHJvamVjdCB2ZXJzaW9uLCB0byBiZSB1c2VkIGluc3RlYWQgb2YgJHtwb20udmVyc2lvbn0gc2luY2UgdGhhdAotICAgICAgICAgICAgICB2YWx1ZSBtYWdpY2FsbHkgY2hhbmdlcyB3aGVuIHVzaW5nIFNOQVBTSE9UIHZlcnNpb25zLgotCi0gICAgICAgICAgICAgIFRoaXMgdmFsdWUgKm11c3QqIGJlIGtlcHQgaW4gc3luYyB3aXRoIHRoZSB2YWx1ZSBvZiB0aGUgPHZlcnNpb24+Ci0gICAgICAgICAgICAgIGVsZW1lbnQsIGFuZCBpdCB3aWxsIG5lZWQgdG8gYmUgY2hhbmdlZCBtYW51YWxseSBiZWZvcmUgYSByZWxlYXNlLAotICAgICAgICAgICAgICBhcyB0aGUgbWF2ZW4tcmVsZWFzZS1wbHVnaW4gd2lsbCBub3QgdXBkYXRlIHRoaXMgdmFsdWUuCi0gICAgICAgIC0tPgotICAgICAgICA8dmVyc2lvbj4xLjUuMTwvdmVyc2lvbj4KLQotICAgICAgICA8IS0tIFZlcnNpb24gIydzIGZvciB0aGUgbWFycyB0aGF0IHdlIGdlbmVyYXRlIC0tPgotICAgICAgICA8YWRkcmVzc2luZy5tYXIudmVyc2lvbj4xLjUuMTwvYWRkcmVzc2luZy5tYXIudmVyc2lvbj4KLSAgICAgICAgPHNvYXBtb25pdG9yLm1hci52ZXJzaW9uPjEuNS4xPC9zb2FwbW9uaXRvci5tYXIudmVyc2lvbj4KLSAgICAgICAgPG1leC5tYXIudmVyc2lvbj4xLjUuMTwvbWV4Lm1hci52ZXJzaW9uPgotICAgICAgICA8cGluZy5tYXIudmVyc2lvbj4xLjUuMTwvcGluZy5tYXIudmVyc2lvbj4KLSAgICAgICAgPHNjcmlwdGluZy5tYXIudmVyc2lvbj4xLjUuMTwvc2NyaXB0aW5nLm1hci52ZXJzaW9uPgotICAgICAgICA8bXRvbXBvbGljeS5tYXIudmVyc2lvbj4xLjUuMTwvbXRvbXBvbGljeS5tYXIudmVyc2lvbj4KLQotICAgICAgICA8YW50LnZlcnNpb24+MS43LjA8L2FudC52ZXJzaW9uPgotICAgICAgICA8YW50bHIudmVyc2lvbj4yLjcuNzwvYW50bHIudmVyc2lvbj4KLSAgICAgICAgPGF4aW9tLnZlcnNpb24+MS4yLjg8L2F4aW9tLnZlcnNpb24+Ci0gICAgICAgIDxiY2VsLnZlcnNpb24+NS4yPC9iY2VsLnZlcnNpb24+Ci0gICAgICAgIDxic2YudmVyc2lvbj4yLjQuMDwvYnNmLnZlcnNpb24+Ci0gICAgICAgIDxjb21tb25zLmNvZGVjLnZlcnNpb24+MS4zPC9jb21tb25zLmNvZGVjLnZlcnNpb24+Ci0gICAgICAgIDxjb21tb25zLmZpbGV1cGxvYWQudmVyc2lvbj4xLjI8L2NvbW1vbnMuZmlsZXVwbG9hZC52ZXJzaW9uPgotICAgICAgICA8Y29tbW9ucy5odHRwY2xpZW50LnZlcnNpb24+My4xPC9jb21tb25zLmh0dHBjbGllbnQudmVyc2lvbj4KLSAgICAgICAgPGNvbW1vbnMuaW8udmVyc2lvbj4xLjQ8L2NvbW1vbnMuaW8udmVyc2lvbj4KLSAgICAgICAgPGNvbW1vbnMubG9nZ2luZy52ZXJzaW9uPjEuMS4xPC9jb21tb25zLmxvZ2dpbmcudmVyc2lvbj4KLSAgICAgICAgPGVjbGlwc2UucGx1Z2lucy52ZXJzaW9uPjEuNC4wPC9lY2xpcHNlLnBsdWdpbnMudmVyc2lvbj4KLSAgICAgICAgPGVjbGlwc2UudmVyc2lvbj4zLjIuMDwvZWNsaXBzZS52ZXJzaW9uPgotICAgICAgICA8ZmkudmVyc2lvbj4xLjEuODwvZmkudmVyc2lvbj4KLSAgICAgICAgPGdlcm9uaW1vLnNwZWMuYWN0aXZhdGlvbi52ZXJzaW9uPjEuMC4xPC9nZXJvbmltby5zcGVjLmFjdGl2YXRpb24udmVyc2lvbj4KLSAgICAgICAgPGdlcm9uaW1vLnNwZWMuYW5ub3RhdGlvbi52ZXJzaW9uPjEuMTwvZ2Vyb25pbW8uc3BlYy5hbm5vdGF0aW9uLnZlcnNpb24+Ci0gICAgICAgIDxnZXJvbmltby5zcGVjLmphdmFtYWlsLnZlcnNpb24+MS42PC9nZXJvbmltby5zcGVjLmphdmFtYWlsLnZlcnNpb24+Ci0gICAgICAgIDxnZXJvbmltby5zcGVjLnN0YXgudmVyc2lvbj4xLjAuMTwvZ2Vyb25pbW8uc3BlYy5zdGF4LnZlcnNpb24+Ci0gICAgICAgIDxnZXJvbmltby5zcGVjLm1ldGFkYXRhLnZlcnNpb24+MS4xLjI8L2dlcm9uaW1vLnNwZWMubWV0YWRhdGEudmVyc2lvbj4KLSAgICAgICAgPGdlcm9uaW1vLnNwZWMuc2Fhai52ZXJzaW9uPjEuMC4xPC9nZXJvbmltby5zcGVjLnNhYWoudmVyc2lvbj4KLSAgICAgICAgPGdlcm9uaW1vLnNwZWMuamF4d3MudmVyc2lvbj4xLjA8L2dlcm9uaW1vLnNwZWMuamF4d3MudmVyc2lvbj4KLSAgICAgICAgPGh0dHBjb3JlLnZlcnNpb24+NC4wPC9odHRwY29yZS52ZXJzaW9uPgotICAgICAgICA8aW50ZWxsaWoudmVyc2lvbj41LjA8L2ludGVsbGlqLnZlcnNpb24+Ci0gICAgICAgIDxqYWxvcHkudmVyc2lvbj4xLjVyYzM8L2phbG9weS52ZXJzaW9uPgotICAgICAgICA8amF4Yi5hcGkudmVyc2lvbj4yLjE8L2pheGIuYXBpLnZlcnNpb24+Ci0gICAgICAgIDxqYXhicmkudmVyc2lvbj4yLjEuNzwvamF4YnJpLnZlcnNpb24+Ci0gICAgICAgIDxqYXhlbi52ZXJzaW9uPjEuMS4xPC9qYXhlbi52ZXJzaW9uPgotICAgICAgICA8amV0dGlzb24udmVyc2lvbj4xLjAtUkMyPC9qZXR0aXNvbi52ZXJzaW9uPgotICAgICAgICA8amlieC52ZXJzaW9uPjEuMi4xPC9qaWJ4LnZlcnNpb24+Ci0gICAgICAgIDxqdW5pdC52ZXJzaW9uLWpkazEuND4zLjguMjwvanVuaXQudmVyc2lvbi1qZGsxLjQ+Ci0gICAgICAgIDxqdW5pdC52ZXJzaW9uPjQuNDwvanVuaXQudmVyc2lvbj4KLSAgICAgICAgPGxvZzRqLnZlcnNpb24+MS4yLjE1PC9sb2c0ai52ZXJzaW9uPgotICAgICAgICA8bWF2ZW4uYW50cnVuLnZlcnNpb24+MS4xPC9tYXZlbi5hbnRydW4udmVyc2lvbj4KLSAgICAgICAgPG1hdmVuLmFyY2hpdmVyLnZlcnNpb24+Mi4yPC9tYXZlbi5hcmNoaXZlci52ZXJzaW9uPgotICAgICAgICA8bWF2ZW4uYXJ0aWZhY3QudmVyc2lvbj4yLjAuODwvbWF2ZW4uYXJ0aWZhY3QudmVyc2lvbj4KLSAgICAgICAgPG1hdmVuLmFzc2VtYmx5LnZlcnNpb24+Mi4yLWJldGEtMjwvbWF2ZW4uYXNzZW1ibHkudmVyc2lvbj4KLSAgICAgICAgPG1hdmVuLnBsdWdpbi52ZXJzaW9uPjIuMzwvbWF2ZW4ucGx1Z2luLnZlcnNpb24+Ci0gICAgICAgIDxtYXZlbi5wbHVnaW4udGVzdGluZy52ZXJzaW9uPjEuMTwvbWF2ZW4ucGx1Z2luLnRlc3RpbmcudmVyc2lvbj4KLSAgICAgICAgPG1hdmVuLnZlcnNpb24+Mi4wLjc8L21hdmVuLnZlcnNpb24+Ci0gICAgICAgIDxtYXZlbi53YXIudmVyc2lvbj4yLjAuMjwvbWF2ZW4ud2FyLnZlcnNpb24+Ci0gICAgICAgIDxuZWV0aGkudmVyc2lvbj4yLjAuNDwvbmVldGhpLnZlcnNpb24+Ci0gICAgICAgIDxwbGV4dXMudXRpbHMudmVyc2lvbj4xLjQuOTwvcGxleHVzLnV0aWxzLnZlcnNpb24+Ci0gICAgICAgIDxyaGluby52ZXJzaW9uPjEuNlI3PC9yaGluby52ZXJzaW9uPgotICAgICAgICA8c2VydmxldC5hcGkudmVyc2lvbj4yLjM8L3NlcnZsZXQuYXBpLnZlcnNpb24+Ci0gICAgICAgIDxzcHJpbmcudmVyc2lvbj4yLjUuMTwvc3ByaW5nLnZlcnNpb24+Ci0gICAgICAgIDxzdGF4LmFwaS52ZXJzaW9uPjEuMC4xPC9zdGF4LmFwaS52ZXJzaW9uPgotICAgICAgICA8c3RheC5pbXBsLmFydGlmYWN0PndzdHgtYXNsPC9zdGF4LmltcGwuYXJ0aWZhY3Q+Ci0gICAgICAgIDxzdGF4LmltcGwuZ3JvdXBpZD5vcmcuY29kZWhhdXMud29vZHN0b3g8L3N0YXguaW1wbC5ncm91cGlkPgotICAgICAgICA8c3RheC5pbXBsLnZlcnNpb24+My4yLjQ8L3N0YXguaW1wbC52ZXJzaW9uPgotICAgICAgICA8dG9tY2F0LnZlcnNpb24+Ni4wLjE2PC90b21jYXQudmVyc2lvbj4KLSAgICAgICAgPHdvZGVuLnZlcnNpb24+MS4wTTg8L3dvZGVuLnZlcnNpb24+Ci0gICAgICAgIDx3c2RsNGoudmVyc2lvbj4xLjYuMjwvd3NkbDRqLnZlcnNpb24+Ci0gICAgICAgIDx4YWxhbi52ZXJzaW9uPjIuNy4wPC94YWxhbi52ZXJzaW9uPgotICAgICAgICA8eG1sYmVhbnMudmVyc2lvbj4yLjMuMDwveG1sYmVhbnMudmVyc2lvbj4KLSAgICAgICAgPHhtbF9yZXNvbHZlci52ZXJzaW9uPjEuMjwveG1sX3Jlc29sdmVyLnZlcnNpb24+Ci0gICAgICAgIDx4bWxzY2hlbWEudmVyc2lvbj4xLjQuMzwveG1sc2NoZW1hLnZlcnNpb24+Ci0gICAgICAgIDx4bWx1bml0LnZlcnNpb24+MS4xPC94bWx1bml0LnZlcnNpb24+Ci0gICAgICAgIDxzbWFjay52ZXJzaW9uPjMuMC40PC9zbWFjay52ZXJzaW9uPgotICAgICAgICA8Y29tbW9ucy5sYW5nLnZlcnNpb24+Mi4zPC9jb21tb25zLmxhbmcudmVyc2lvbj4KLSAgICAgICAgPGphdmF4Lm1haWwudmVyc2lvbj4xLjQ8L2phdmF4Lm1haWwudmVyc2lvbj4KLSAgICAgICAgPCEtLSBUaGUgYnVpbGQgZmFpbGluZyBpZiB0ZXN0cyBhcmUgc2tpcHBlZCBpcyB2ZXJ5IGFubm95aW5nIC0tPgotICAgICAgICA8ZmFpbElmTm9UZXN0cz5mYWxzZTwvZmFpbElmTm9UZXN0cz4KLSAgICAgICAgPG0yUmVwb3NpdG9yeT4nJHtzZXR0aW5ncy5sb2NhbFJlcG9zaXRvcnl9JzwvbTJSZXBvc2l0b3J5PgotICAgICAgICA8Z2Vyb25pbW8tc3BlYy5qdGEudmVyc2lvbj4xLjE8L2dlcm9uaW1vLXNwZWMuanRhLnZlcnNpb24+Ci0gICAgPC9wcm9wZXJ0aWVzPgotICAgIDxtYWlsaW5nTGlzdHM+Ci0gICAgICAgIDxtYWlsaW5nTGlzdD4KLSAgICAgICAgICAgIDxuYW1lPkF4aXMgRGV2ZWxvcGVyIExpc3Q8L25hbWU+Ci0gICAgICAgICAgICA8c3Vic2NyaWJlPmF4aXMtZGV2LXN1YnNjcmliZUB3cy5hcGFjaGUub3JnPC9zdWJzY3JpYmU+Ci0gICAgICAgICAgICA8dW5zdWJzY3JpYmU+YXhpcy1kZXYtdW5zdWJzY3JpYmVAd3MuYXBhY2hlLm9yZzwvdW5zdWJzY3JpYmU+Ci0gICAgICAgICAgICA8cG9zdD5heGlzLWRldkB3cy5hcGFjaGUub3JnPC9wb3N0PgotICAgICAgICAgICAgPGFyY2hpdmU+aHR0cDovL21hcmMudGhlYWltc2dyb3VwLmNvbS8/bD1heGlzLWRldjwvYXJjaGl2ZT4KLSAgICAgICAgICAgIDxvdGhlckFyY2hpdmVzPgotICAgICAgICAgICAgICAgIDxvdGhlckFyY2hpdmU+aHR0cDovL21hcmttYWlsLm9yZy9zZWFyY2gvbGlzdDpvcmcuYXBhY2hlLndzLmF4aXMtZGV2PC9vdGhlckFyY2hpdmU+Ci0gICAgICAgICAgICA8L290aGVyQXJjaGl2ZXM+Ci0gICAgICAgIDwvbWFpbGluZ0xpc3Q+Ci0gICAgICAgIDxtYWlsaW5nTGlzdD4KLSAgICAgICAgICAgIDxuYW1lPkF4aXMgVXNlciBMaXN0PC9uYW1lPgotICAgICAgICAgICAgPHN1YnNjcmliZT5heGlzLXVzZXItc3Vic2NyaWJlQHdzLmFwYWNoZS5vcmc8L3N1YnNjcmliZT4KLSAgICAgICAgICAgIDx1bnN1YnNjcmliZT5heGlzLXVzZXItdW5zdWJzY3JpYmVAd3MuYXBhY2hlLm9yZzwvdW5zdWJzY3JpYmU+Ci0gICAgICAgICAgICA8cG9zdD5heGlzLXVzZXJAd3MuYXBhY2hlLm9yZzwvcG9zdD4KLSAgICAgICAgICAgIDxhcmNoaXZlPmh0dHA6Ly9tYXJjLnRoZWFpbXNncm91cC5jb20vP2w9YXhpcy11c2VyPC9hcmNoaXZlPgotICAgICAgICAgICAgPG90aGVyQXJjaGl2ZXM+Ci0gICAgICAgICAgICAgICAgPG90aGVyQXJjaGl2ZT5odHRwOi8vbWFya21haWwub3JnL3NlYXJjaC9saXN0Om9yZy5hcGFjaGUud3MuYXhpcy11c2VyPC9vdGhlckFyY2hpdmU+Ci0gICAgICAgICAgICA8L290aGVyQXJjaGl2ZXM+Ci0gICAgICAgIDwvbWFpbGluZ0xpc3Q+Ci0gICAgICAgIDxtYWlsaW5nTGlzdD4KLSAgICAgICAgICAgIDxuYW1lPkNWUyBDb21taXQgTWVzc2FnZSBMaXN0PC9uYW1lPgotICAgICAgICAgICAgPHN1YnNjcmliZT5heGlzLWN2cy1zdWJzY3JpYmVAd3MuYXBhY2hlLm9yZzwvc3Vic2NyaWJlPgotICAgICAgICAgICAgPHVuc3Vic2NyaWJlPmF4aXMtY3ZzLXVuc3Vic2NyaWJlQHdzLmFwYWNoZS5vcmc8L3Vuc3Vic2NyaWJlPgotICAgICAgICAgICAgPHBvc3Q+YXhpcy1jdnNAd3MuYXBhY2hlLm9yZzwvcG9zdD4KLSAgICAgICAgICAgIDxhcmNoaXZlPmh0dHA6Ly9tYXJrbWFpbC5vcmcvc2VhcmNoL2xpc3Q6b3JnLmFwYWNoZS53cy5heGlzLWN2czwvYXJjaGl2ZT4KLSAgICAgICAgPC9tYWlsaW5nTGlzdD4KLSAgICA8L21haWxpbmdMaXN0cz4KLSAgICA8ZGV2ZWxvcGVycz4KLSAgICAgICAgPGRldmVsb3Blcj4KLSAgICAgICAgICAgIDxuYW1lPlNhbWluZGEgQWJleXJ1d2FuPC9uYW1lPgotICAgICAgICAgICAgPGlkPnNhbWluZGE8L2lkPgotICAgICAgICAgICAgPGVtYWlsPnNhbWluZGEgQVQgd3NvMi5jb208L2VtYWlsPgotICAgICAgICAgICAgPG9yZ2FuaXphdGlvbj5XU08yPC9vcmdhbml6YXRpb24+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+ZGF2YW51bSBBVCBnbWFpbC5jb208L2VtYWlsPgotICAgICAgICAgICAgPG9yZ2FuaXphdGlvbj48L29yZ2FuaXphdGlvbj4KLSAgICAgICAgPC9kZXZlbG9wZXI+Ci0gICAgICAgIDxkZXZlbG9wZXI+Ci0gICAgICAgICAgICA8bmFtZT5KYXlhY2hhbmRyYSBTZWtoYXJhIFJhbyBTdW5rYXJhPC9uYW1lPgotICAgICAgICAgICAgPGlkPmpheWE8L2lkPgotICAgICAgICAgICAgPGVtYWlsPmpheWFjaGFuZHJhIEFUIGdtYWlsLmNvbTwvZW1haWw+Ci0gICAgICAgICAgICA8b3JnYW5pemF0aW9uPkNvbXB1dGVyIEFzc29jaWF0ZXM8L29yZ2FuaXphdGlvbj4KLSAgICAgICAgPC9kZXZlbG9wZXI+Ci0gICAgICAgIDxkZXZlbG9wZXI+Ci0gICAgICAgICAgICA8bmFtZT5OYW5kYW5hIE1paGluZHVrdWxhc29vcml5YTwvbmFtZT4KLSAgICAgICAgICAgIDxpZD5uYW5kYW5hPC9pZD4KLSAgICAgICAgICAgIDxlbWFpbD5uYW5kYW5hIEFUIHdzbzIuY29tPC9lbWFpbD4KLSAgICAgICAgICAgIDxvcmdhbml6YXRpb24+V1NPMjwvb3JnYW5pemF0aW9uPgotICAgICAgICA8L2RldmVsb3Blcj4KLSAgICAgICAgPGRldmVsb3Blcj4KLSAgICAgICAgICAgIDxuYW1lPk5pa2hpbCBUaGFrZXI8L25hbWU+Ci0gICAgICAgICAgICA8b3JnYW5pemF0aW9uPklCTTwvb3JnYW5pemF0aW9uPgotICAgICAgICA8L2RldmVsb3Blcj4KLSAgICAgICAgPGRldmVsb3Blcj4KLSAgICAgICAgICAgIDxuYW1lPkNoYW1pbCBUaGFudGhyaW11ZGFsaWdlPC9uYW1lPgotICAgICAgICAgICAgPGlkPmNoYW1pbDwvaWQ+Ci0gICAgICAgICAgICA8ZW1haWw+Y2hhbWlsIEFUIHdzbzIuY29tPC9lbWFpbD4KLSAgICAgICAgICAgIDxvcmdhbml6YXRpb24+V1NPMjwvb3JnYW5pemF0aW9uPgotICAgICAgICA8L2RldmVsb3Blcj4KLSAgICAgICAgPGRldmVsb3Blcj4KLSAgICAgICAgICAgIDxuYW1lPkRhc2FyYXRoIFdlZXJhdGh1bmdhPC9uYW1lPgotICAgICAgICAgICAgPGlkPmRhc2FyYXRoPC9pZD4KLSAgICAgICAgICAgIDxlbWFpbD5kYXNhcmF0aCBBVCBvcGVuc291cmNlLmxrPC9lbWFpbD4KLSAgICAgICAgICAgIDxvcmdhbml6YXRpb24+UHVyZHVlIFVuaXZlcnNpdHksIFVTQTwvb3JnYW5pemF0aW9uPgotICAgICAgICA8L2RldmVsb3Blcj4KLSAgICAgICAgPGRldmVsb3Blcj4KLSAgICAgICAgICAgIDxuYW1lPkVyYW5nYSBKYXlhc3VuZGVyYTwvbmFtZT4KLSAgICAgICAgICAgIDxpZD5lcmFuZ2E8L2lkPgotICAgICAgICAgICAgPGVtYWlsPmVyYW5nYSBBVCBhcGFjaGUub3JnPC9lbWFpbD4KLSAgICAgICAgICAgIDxvcmdhbml6YXRpb24+PC9vcmdhbml6YXRpb24+Ci0gICAgICAgIDwvZGV2ZWxvcGVyPgotICAgICAgICA8ZGV2ZWxvcGVyPgotICAgICAgICAgICAgPG5hbWU+U2Fuaml2YSBXZWVyYXdhcmFuYTwvbmFtZT4KLSAgICAgICAgICAgIDxpZD5zYW5qaXZhPC9pZD4KLSAgICAgICAgICAgIDxlbWFpbD5zYW5qaXZhIEFUIHdzbzIuY29tPC9lbWFpbD4KLSAgICAgICAgICAgIDxvcmdhbml6YXRpb24+V1NPMjwvb3JnYW5pemF0aW9uPgotICAgICAgICA8L2RldmVsb3Blcj4KLSAgICAgICAgPGRldmVsb3Blcj4KLSAgICAgICAgICAgIDxuYW1lPktlaXRoIENoYXBtYW48L25hbWU+Ci0gICAgICAgICAgICA8aWQ+a2VpdGhjPC9pZD4KLSAgICAgICAgICAgIDxlbWFpbD5rZWl0aCBBVCB3c28yLmNvbTwvZW1haWw+Ci0gICAgICAgICAgICA8b3JnYW5pemF0aW9uPldTTzI8L29yZ2FuaXphdGlvbj4KLSAgICAgICAgPC9kZXZlbG9wZXI+Ci0gICAgICAgIDxkZXZlbG9wZXI+Ci0gICAgICAgICAgICA8bmFtZT5BbmRyZWFzIFZlaXRoZW48L25hbWU+Ci0gICAgICAgICAgICA8aWQ+dmVpdGhlbjwvaWQ+Ci0gICAgICAgICAgICA8ZW1haWw+dmVpdGhlbiBBVCBhcGFjaGUub3JnPC9lbWFpbD4KLSAgICAgICAgICAgIDx1cmw+aHR0cDovL3d3dy5saW5rZWRpbi5jb20vaW4vYXZlaXRoZW48L3VybD4KLSAgICAgICAgPC9kZXZlbG9wZXI+Ci0gICAgPC9kZXZlbG9wZXJzPgotICAgIDxjb250cmlidXRvcnM+Ci0gICAgICAgIDxjb250cmlidXRvcj4KLSAgICAgICAgICAgIDxuYW1lPkdheWFuIEFzYW5rYTwvbmFtZT4KLSAgICAgICAgICAgIDxlbWFpbD5nYXlhbiBBVCBvcGVuc291cmNlLmxrPC9lbWFpbD4KLSAgICAgICAgICAgIDxvcmdhbml6YXRpb24+TGFua2EgU29mdHdhcmUgRm91bmRhdGlvbjwvb3JnYW5pemF0aW9uPgotICAgICAgICA8L2NvbnRyaWJ1dG9yPgotICAgICAgICA8Y29udHJpYnV0b3I+Ci0gICAgICAgICAgICA8bmFtZT5EaGFyc2hhbmEgRGlhczwvbmFtZT4KLSAgICAgICAgICAgIDxlbWFpbC8+Ci0gICAgICAgICAgICA8b3JnYW5pemF0aW9uPkxhbmthIFNvZnR3YXJlIEZvdW5kYXRpb24gLyBVbml2ZXJzaXR5IG9mIE1vcmF0dXdhPC9vcmdhbml6YXRpb24+Ci0gICAgICAgIDwvY29udHJpYnV0b3I+Ci0gICAgICAgIDxjb250cmlidXRvcj4KLSAgICAgICAgICAgIDxuYW1lPk5hZGFuYSBHdW5hcmF0aG5hPC9uYW1lPgotICAgICAgICAgICAgPGVtYWlsPm5hZGFuYSBBVCBvcGVuc291cmNlLmxrPC9lbWFpbD4KLSAgICAgICAgICAgIDxvcmdhbml6YXRpb24+TGFua2EgU29mdHdhcmUgRm91bmRhdGlvbjwvb3JnYW5pemF0aW9uPgotICAgICAgICA8L2NvbnRyaWJ1dG9yPgotICAgICAgICA8Y29udHJpYnV0b3I+Ci0gICAgICAgICAgICA8bmFtZT5UaGlsaW5pIEd1bmF3YXJkaGFuYTwvbmFtZT4KLSAgICAgICAgICAgIDxlbWFpbD50aGlsaW5pIEFUIFdTTzIuY29tPC9lbWFpbD4KLSAgICAgICAgICAgIDxvcmdhbml6YXRpb24+V1NPMjwvb3JnYW5pemF0aW9uPgotICAgICAgICA8L2NvbnRyaWJ1dG9yPgotICAgICAgICA8Y29udHJpYnV0b3I+Ci0gICAgICAgICAgICA8bmFtZT5BbnVzaGthIEt1bWFyYTwvbmFtZT4KLSAgICAgICAgICAgIDxlbWFpbD5hbnVzaGtha3VtYXIgQVQgZ21haWwuY29tPC9lbWFpbD4KLSAgICAgICAgICAgIDxvcmdhbml6YXRpb24+TGFua2EgU29mdHdhcmUgRm91bmRhdGlvbiAvIFVuaXZlcnNpdHkgb2YgTW9yYXR1d2E8L29yZ2FuaXphdGlvbj4KLSAgICAgICAgPC9jb250cmlidXRvcj4KLSAgICAgICAgPGNvbnRyaWJ1dG9yPgotICAgICAgICAgICAgPG5hbWU+RmFyaGFhbiBNb2hpZGVlbjwvbmFtZT4KLSAgICAgICAgICAgIDxlbWFpbD5mbW9oaWRlZW4gQVQgdmFsaXN0YS5jb208L2VtYWlsPgotICAgICAgICAgICAgPG9yZ2FuaXphdGlvbj5MYW5rYSBTb2Z0d2FyZSBGb3VuZGF0aW9uPC9vcmdhbml6YXRpb24+Ci0gICAgICAgIDwvY29udHJpYnV0b3I+Ci0gICAgICAgIDxjb250cmlidXRvcj4KLSAgICAgICAgICAgIDxuYW1lPkNoaW50aGFrYSBUaGlsYWthcmF0aG5lPC9uYW1lPgotICAgICAgICAgICAgPGVtYWlsLz4KLSAgICAgICAgICAgIDxvcmdhbml6YXRpb24+TGFua2EgU29mdHdhcmUgRm91bmRhdGlvbiAvIFVuaXZlcnNpdHkgb2YgTW9yYXR1d2E8L29yZ2FuaXphdGlvbj4KLSAgICAgICAgPC9jb250cmlidXRvcj4KLQotICAgICAgICA8Y29udHJpYnV0b3I+Ci0gICAgICAgICAgICA8bmFtZT5TaGl2YW50aGEgSHVydWdnYW11d2E8L25hbWU+Ci0gICAgICAgICAgICA8ZW1haWw+c2hpdmFudGhhaCBBVCBnbWFpbC5jb208L2VtYWlsPgotICAgICAgICAgICAgPG9yZ2FuaXphdGlvbj5Vbml2ZXJzaXR5IE9mIFBlcmFkZW5peWEgLCBTcmkgTGFua2E8L29yZ2FuaXphdGlvbj4KLSAgICAgICAgPC9jb250cmlidXRvcj4KLQotICAgIDwvY29udHJpYnV0b3JzPgotICAgIDxyZXBvc2l0b3JpZXM+Ci0gICAgICAgIDwhLS0KLSAgICAgICAgICBDaGVja2luZyByZXBvc2l0b3JlcyB0YWtlcyBsb3RzIG9mIHRpbWUuCi0gICAgICAgICAgUmVwb3NpdG9yaWVzIHdoaWNoIHNob3VsZCBOT1QgYmUgcHV0IGluIGhlcmUuCi0KLSAgICAgICAgICAgaHR0cDovL3Blb3BsZS5hcGFjaGUub3JnL3JlcG8vbTItc25hcHNob3QtcmVwb3NpdG9yeS8KLSAgICAgICAgICAgICAgIEV4aXN0cyBpbiB0aGUgb3JnLmFwYWNoZS5hcGFjaGUgcGFyZW50IHBvbQotCi0gICAgICAgICAgIGh0dHA6Ly9yZXBvMS5tYXZlbi5vcmcvbWF2ZW4yLyBha2EgJ0NlbnRyYWwnCi0gICAgICAgICAgICAgICBFeGlzdHMgaW4gdGhlIG1hdmVuICdTdXBlciBQT00nIHdoaWNoIGFsbCBwb21zIGV4dGVuZAotCi0gICAgICAgICAgIGh0dHA6Ly9wZW9wbGUuYXBhY2hlLm9yZy9yZXBvL20yLWliaWJsaW8tcnN5bmMtcmVwb3NpdG9yeS8KLSAgICAgICAgICAgICAgIEV2ZXJ5dGhpbmcgaW4gaGVyZSBzaG91bGQgYmUgaW4gJ0NlbnRyYWwnCi0KLSAgICAgICAgICBDaGVja3N1bSBwb2xpY3kgd2hlbiBub3Qgc3BlY2lmaWVkIGFsd2F5cyBkZWZhdWx0cyB0byAnd2FybicKLSAgICAgICAgICB3aGljaCBpcyB3aGF0IHdlIHdhbnQuCi0gICAgICAgLS0+Ci0gICAgICAgIDxyZXBvc2l0b3J5PgotICAgICAgICAgICAgPHJlbGVhc2VzPgotICAgICAgICAgICAgICAgIDxlbmFibGVkPnRydWU8L2VuYWJsZWQ+Ci0gICAgICAgICAgICAgICAgPHVwZGF0ZVBvbGljeT5hbHdheXM8L3VwZGF0ZVBvbGljeT4KLSAgICAgICAgICAgIDwvcmVsZWFzZXM+Ci0gICAgICAgICAgICA8c25hcHNob3RzPgotICAgICAgICAgICAgICAgIDxlbmFibGVkPnRydWU8L2VuYWJsZWQ+Ci0gICAgICAgICAgICAgICAgPHVwZGF0ZVBvbGljeT5uZXZlcjwvdXBkYXRlUG9saWN5PgotICAgICAgICAgICAgPC9zbmFwc2hvdHM+Ci0gICAgICAgICAgICA8aWQ+YXBhY2hlLXdzLXNuYXBzaG90czI8L2lkPgotICAgICAgICAgICAgPG5hbWU+QXBhY2hlIHdzLnpvbmVzIC0gMjwvbmFtZT4KLSAgICAgICAgICAgIDx1cmw+aHR0cDovL3dzLnpvbmVzLmFwYWNoZS5vcmcvcmVwb3NpdG9yeTI8L3VybD4KLSAgICAgICAgPC9yZXBvc2l0b3J5PgotICAgICAgICA8cmVwb3NpdG9yeT4KLSAgICAgICAgICAgIDxpZD50b21jYXQtcmVwb3NpdG9yeTwvaWQ+Ci0gICAgICAgICAgICA8dXJsPmh0dHA6Ly90b21jYXQuYXBhY2hlLm9yZy9kZXYvZGlzdC9tMi1yZXBvc2l0b3J5PC91cmw+Ci0gICAgICAgICAgICA8cmVsZWFzZXM+Ci0gICAgICAgICAgICAgICAgPGVuYWJsZWQ+dHJ1ZTwvZW5hYmxlZD4KLSAgICAgICAgICAgICAgICA8dXBkYXRlUG9saWN5PmFsd2F5czwvdXBkYXRlUG9saWN5PgotICAgICAgICAgICAgPC9yZWxlYXNlcz4KLSAgICAgICAgICAgIDxzbmFwc2hvdHM+Ci0gICAgICAgICAgICAgICAgPGVuYWJsZWQ+ZmFsc2U8L2VuYWJsZWQ+Ci0gICAgICAgICAgICA8L3NuYXBzaG90cz4KLSAgICAgICAgPC9yZXBvc2l0b3J5PgotICAgICAgICA8cmVwb3NpdG9yeT4KLSAgICAgICAgICAgIDxpZD5lY2xpcHNlLXJlcG88L2lkPgotICAgICAgICAgICAgPG5hbWU+ZWNsaXBzZSBtYXZlbiByZXBvc2l0b3J5PC9uYW1lPgotICAgICAgICAgICAgPHVybD5odHRwOi8vcmVwbzEubWF2ZW4ub3JnL2VjbGlwc2U8L3VybD4KLSAgICAgICAgICAgIDxyZWxlYXNlcz4KLSAgICAgICAgICAgICAgICA8ZW5hYmxlZD50cnVlPC9lbmFibGVkPgotICAgICAgICAgICAgICAgIDx1cGRhdGVQb2xpY3k+YWx3YXlzPC91cGRhdGVQb2xpY3k+Ci0gICAgICAgICAgICA8L3JlbGVhc2VzPgotICAgICAgICAgICAgPHNuYXBzaG90cz4KLSAgICAgICAgICAgICAgICA8ZW5hYmxlZD5mYWxzZTwvZW5hYmxlZD4KLSAgICAgICAgICAgIDwvc25hcHNob3RzPgotICAgICAgICA8L3JlcG9zaXRvcnk+Ci0gICAgICAgIDxyZXBvc2l0b3J5PgotICAgICAgICAgICAgPGlkPmphdmEubmV0PC9pZD4KLSAgICAgICAgICAgIDx1cmw+aHR0cHM6Ly9tYXZlbi1yZXBvc2l0b3J5LmRldi5qYXZhLm5ldC9ub25hdi9yZXBvc2l0b3J5LzwvdXJsPgotICAgICAgICAgICAgPGxheW91dD5sZWdhY3k8L2xheW91dD4KLSAgICAgICAgICAgIDxzbmFwc2hvdHM+Ci0gICAgICAgICAgICAgICAgPGVuYWJsZWQ+ZmFsc2U8L2VuYWJsZWQ+Ci0gICAgICAgICAgICA8L3NuYXBzaG90cz4KLSAgICAgICAgICAgIDxyZWxlYXNlcz4KLSAgICAgICAgICAgICAgICA8ZW5hYmxlZD50cnVlPC9lbmFibGVkPgotICAgICAgICAgICAgPC9yZWxlYXNlcz4KLSAgICAgICAgPC9yZXBvc2l0b3J5PgotICAgIDwvcmVwb3NpdG9yaWVzPgotICAgIDxwbHVnaW5SZXBvc2l0b3JpZXM+Ci0gICAgICAgIDxwbHVnaW5SZXBvc2l0b3J5PgotICAgICAgICAgICAgPGlkPmFwYWNoZS1zbmFwc2hvdHM8L2lkPgotICAgICAgICAgICAgPG5hbWU+QXBhY2hlIFNuYXBzaG90cyBSZXBvc2l0b3J5PC9uYW1lPgotICAgICAgICAgICAgPHVybD5odHRwOi8vcGVvcGxlLmFwYWNoZS5vcmcvcmVwby9tMi1zbmFwc2hvdC1yZXBvc2l0b3J5PC91cmw+Ci0gICAgICAgICAgICA8bGF5b3V0PmRlZmF1bHQ8L2xheW91dD4KLSAgICAgICAgICAgIDxzbmFwc2hvdHM+Ci0gICAgICAgICAgICAgICAgPGVuYWJsZWQ+dHJ1ZTwvZW5hYmxlZD4KLSAgICAgICAgICAgICAgICA8dXBkYXRlUG9saWN5PmRhaWx5PC91cGRhdGVQb2xpY3k+Ci0gICAgICAgICAgICA8L3NuYXBzaG90cz4KLSAgICAgICAgICAgIDxyZWxlYXNlcz4KLSAgICAgICAgICAgICAgICA8ZW5hYmxlZD5mYWxzZTwvZW5hYmxlZD4KLSAgICAgICAgICAgIDwvcmVsZWFzZXM+Ci0gICAgICAgIDwvcGx1Z2luUmVwb3NpdG9yeT4KLSAgICAgICAgPHBsdWdpblJlcG9zaXRvcnk+Ci0gICAgICAgICAgICA8aWQ+d3Mtem9uZXM8L2lkPgotICAgICAgICAgICAgPG5hbWU+QXBhY2hlIFdTIFpvbmVzIFJlcG9zaXRvcnk8L25hbWU+Ci0gICAgICAgICAgICA8dXJsPmh0dHA6Ly93cy56b25lcy5hcGFjaGUub3JnL3JlcG9zaXRvcnkyPC91cmw+Ci0gICAgICAgICAgICA8bGF5b3V0PmRlZmF1bHQ8L2xheW91dD4KLSAgICAgICAgICAgIDxzbmFwc2hvdHM+Ci0gICAgICAgICAgICAgICAgPGVuYWJsZWQ+dHJ1ZTwvZW5hYmxlZD4KLSAgICAgICAgICAgICAgICA8dXBkYXRlUG9saWN5PmRhaWx5PC91cGRhdGVQb2xpY3k+Ci0gICAgICAgICAgICA8L3NuYXBzaG90cz4KLSAgICAgICAgICAgIDxyZWxlYXNlcz4KLSAgICAgICAgICAgICAgICA8ZW5hYmxlZD50cnVlPC9lbmFibGVkPgotICAgICAgICAgICAgPC9yZWxlYXNlcz4KLSAgICAgICAgPC9wbHVnaW5SZXBvc2l0b3J5PgotICAgIDwvcGx1Z2luUmVwb3NpdG9yaWVzPgotCi0gICAgPGRlcGVuZGVuY3lNYW5hZ2VtZW50PgotICAgICAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLnN1bi54bWwuZmFzdGluZm9zZXQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+RmFzdEluZm9zZXQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+JHtmaS52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUudG9tY2F0PC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnRyaWJlczwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3RvbWNhdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUudG9tY2F0PC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmp1bGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+JHt0b21jYXQudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD54bWwtcmVzb2x2ZXI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+eG1sLXJlc29sdmVyPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7eG1sX3Jlc29sdmVyLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+eGFsYW48L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+eGFsYW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+JHt4YWxhbi52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPnhtbC1hcGlzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+eG1sLWFwaXM8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9ucz4KLSAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgIDxncm91cElkPmNvbS5zdW4ueG1sLmJpbmQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF4Yi1pbXBsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7amF4YnJpLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLnN1bi54bWwuYmluZDwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXhiLXhqYzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2pheGJyaS52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgIDxncm91cElkPmphdmF4LnhtbC5iaW5kPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpheGItYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7amF4Yi5hcGkudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC54bWwuc3RyZWFtPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+c3RheC1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguYWN0aXZhdGlvbjwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmFjdGl2YXRpb248L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9ucz4KLSAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5zcHJpbmdmcmFtZXdvcms8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+c3ByaW5nLWNvcmU8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+JHtzcHJpbmcudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuc3ByaW5nZnJhbWV3b3JrPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnNwcmluZy1iZWFuczwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3NwcmluZy52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5zcHJpbmdmcmFtZXdvcms8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+c3ByaW5nLWNvbnRleHQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+JHtzcHJpbmcudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuc3ByaW5nZnJhbWV3b3JrPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnNwcmluZy13ZWI8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+JHtzcHJpbmcudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5zZXJ2bGV0PC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnNlcnZsZXQtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7c2VydmxldC5hcGkudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMuamV0dGlzb248L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amV0dGlzb248L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+JHtqZXR0aXNvbi52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPnN0YXg8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zdGF4LWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb25zPgotICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmppYng8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amlieC1iaW5kPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7amlieC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5qaWJ4PC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmppYngtcnVuPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7amlieC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy53b29kc3RveDwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPndzdHgtYXNsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbnM+Ci0gICAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmFudDwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5hbnQtbGF1bmNoZXI8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+JHthbnQudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLndzLmNvbW1vbnMuYXhpb208L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpb20tYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7YXhpb20udmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD54bWwtYXBpczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnhtbC1hcGlzPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPnhlcmNlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnhlcmNlc0ltcGw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9ucz4KLSAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUud3MuY29tbW9ucy5heGlvbTwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlvbS1pbXBsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7YXhpb20udmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLndzLmNvbW1vbnMuYXhpb208L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpb20tZG9tPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7YXhpb20udmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPlhtbFNjaGVtYTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3htbHNjaGVtYS52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubmVldGhpPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm5lZXRoaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke25lZXRoaS52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYW50PC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmFudDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2FudC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYmNlbDwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5iY2VsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7YmNlbC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgIDxncm91cElkPmNvbW1vbnMtbG9nZ2luZzwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWxvZ2dpbmc8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+JHtjb21tb25zLmxvZ2dpbmcudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5jb21tb25zLWNvZGVjPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtY29kZWM8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+JHtjb21tb25zLmNvZGVjLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+JHtzdGF4LmltcGwuZ3JvdXBpZH08L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+JHtzdGF4LmltcGwuYXJ0aWZhY3R9PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7c3RheC5pbXBsLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+c3RheDwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnN0YXgtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbnM+Ci0gICAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZ2Vyb25pbW8uc3BlY3M8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+Z2Vyb25pbW8tc3RheC1hcGlfMS4wX3NwZWM8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+JHtnZXJvbmltby5zcGVjLnN0YXgudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmdlcm9uaW1vLnNwZWNzPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmdlcm9uaW1vLWFjdGl2YXRpb25fMS4xX3NwZWM8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+JHtnZXJvbmltby5zcGVjLmFjdGl2YXRpb24udmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmdlcm9uaW1vLnNwZWNzPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmdlcm9uaW1vLWphdmFtYWlsXzEuNF9zcGVjPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7Z2Vyb25pbW8uc3BlYy5qYXZhbWFpbC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZ2Vyb25pbW8uc3BlY3M8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+Z2Vyb25pbW8tYW5ub3RhdGlvbl8xLjBfc3BlYzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2dlcm9uaW1vLnNwZWMuYW5ub3RhdGlvbi52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZ2Vyb25pbW8uc3BlY3M8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+Z2Vyb25pbW8td3MtbWV0YWRhdGFfMi4wX3NwZWM8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+JHtnZXJvbmltby5zcGVjLm1ldGFkYXRhLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5nZXJvbmltby5zcGVjczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5nZXJvbmltby1zYWFqXzEuM19zcGVjPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7Z2Vyb25pbW8uc3BlYy5zYWFqLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5nZXJvbmltby5zcGVjczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5nZXJvbmltby1qYXh3c18yLjFfc3BlYzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2dlcm9uaW1vLnNwZWMuamF4d3MudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgIDxncm91cElkPmpheGVuPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpheGVuPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7amF4ZW4udmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5jb21tb25zLWh0dHBjbGllbnQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1odHRwY2xpZW50PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7Y29tbW9ucy5odHRwY2xpZW50LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1pbzwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWlvPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7Y29tbW9ucy5pby52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+aHR0cGNvcmU8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+JHtodHRwY29yZS52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgIDxncm91cElkPmNvbW1vbnMtZmlsZXVwbG9hZDwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWZpbGV1cGxvYWQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+JHtjb21tb25zLmZpbGV1cGxvYWQudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD53c2RsNGo8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+d3NkbDRqPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7d3NkbDRqLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS53b2RlbjwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD53b2Rlbi1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+JHt3b2Rlbi52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy53b29kc3RveDwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPndzdHgtYXNsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPnhlcmNlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnhtbFBhcnNlckFQSXM8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9ucz4KLSAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUud29kZW48L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+d29kZW4taW1wbC1kb208L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+JHt3b2Rlbi52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy53b29kc3RveDwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPndzdHgtYXNsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPnhlcmNlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnhtbFBhcnNlckFQSXM8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9ucz4KLSAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgIDxncm91cElkPnhtbHVuaXQ8L2dyb3VwSWQ+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+Ci0gICAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuaWduaXRlcmVhbHRpbWU8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+c21hY2s8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+JHtzbWFjay52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5pZ25pdGVyZWFsdGltZTwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zbWFja3g8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+JHtzbWFjay52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgIDxncm91cElkPmNvbW1vbnMtbGFuZzwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWxhbmc8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+JHtjb21tb25zLmxhbmcudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmdlcm9uaW1vLnNwZWNzPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmdlcm9uaW1vLWp0YV8xLjFfc3BlYzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2dlcm9uaW1vLXNwZWMuanRhLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0KLSAgICAgICAgPC9kZXBlbmRlbmNpZXM+Ci0gICAgPC9kZXBlbmRlbmN5TWFuYWdlbWVudD4KLSAgICA8IS0tIFRvcCBsZXZlbCBkZXBlbmRlbmNpZXMgdGhhdCB3aWxsIGJlIG5lZWRlZCBpbiBhbGwgc3ViIG12biBtb2R1bGVzIC0tPgotICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS53cy5jb21tb25zLmF4aW9tPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpb20tYXBpPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS53cy5jb21tb25zLmF4aW9tPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpb20taW1wbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUud3MuY29tbW9ucy5heGlvbTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aW9tLWRvbTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8IS0tIFdoeSB3b3VsZCB3ZSB3YW50IHRvIGFkZCB0aGlzIC0tPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmphdmF4Lm1haWw8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYWlsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MS40PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD54bWx1bml0PC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+eG1sdW5pdDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+eGFsYW48L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD54YWxhbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDwhLS0gU3RheCBpbXBsZW1lbnRhdGlvbiBjbGFzcyAtLT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD4ke3N0YXguaW1wbC5ncm91cGlkfTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPiR7c3RheC5pbXBsLmFydGlmYWN0fTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZ2Vyb25pbW8uc3BlY3M8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5nZXJvbmltby1zdGF4LWFwaV8xLjBfc3BlYzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5odHRwY29yZTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmNvbW1vbnMtaW88L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWlvPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPC9kZXBlbmRlbmNpZXM+Ci0KLSAgICA8cHJvZmlsZXM+Ci0gICAgICAgIDxwcm9maWxlPgotICAgICAgICAgIDxpZD5yZWxlYXNlPC9pZD4KLSAgICAgICAgICA8YnVpbGQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDxwbHVnaW5zPgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tPHBsdWdpbj4tLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPi0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS08YXJ0aWZhY3RJZD5tYXZlbi1yZWxlYXNlLXBsdWdpbjwvYXJ0aWZhY3RJZD4tLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tPGNvbmZpZ3VyYXRpb24+LS0+Ci0JCQkJICAgICAgPCEtLTx0YWdCYXNlPmh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL3dlYnNlcnZpY2VzL2F4aXMyL3RhZ3MvamF2YS88L3RhZ0Jhc2U+LS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS08dXNlUmVsZWFzZVByb2ZpbGU+ZmFsc2U8L3VzZVJlbGVhc2VQcm9maWxlPi0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tPGdvYWxzPmRlcGxveTwvZ29hbHM+LS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS08YXJndW1lbnRzPi1QcmVsZWFzZTwvYXJndW1lbnRzPi0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS08L2NvbmZpZ3VyYXRpb24+LS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tPC9wbHVnaW4+LS0+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gV2Ugd2FudCBhIHNvdXJjZSBqYXIgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zb3VyY2UtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmphcjwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFdlIHdhbnQgdG8gc2lnbiB0aGUgYXJ0aWZhY3QsIHRoZSBQT00sIGFuZCBhbGwgYXR0YWNoZWQgYXJ0aWZhY3RzIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZ3BnLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhc3NwaHJhc2U+JHtncGcucGFzc3BocmFzZX08L3Bhc3NwaHJhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnNpZ248L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBXZSB3YW50IHRvIGRlcGxveSB0aGUgYXJ0aWZhY3QgdG8gYSBzdGFnaW5nIGxvY2F0aW9uIGZvciBwZXJ1c2FsIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZGVwbG95LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFsdERlcGxveW1lbnRSZXBvc2l0b3J5PiR7ZGVwbG95LmFsdFJlcG9zaXRvcnl9PC9hbHREZXBsb3ltZW50UmVwb3NpdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVwZGF0ZVJlbGVhc2VJbmZvPnRydWU8L3VwZGF0ZVJlbGVhc2VJbmZvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFdlIHdhbnQgdGhlIEphdmFEb2MgSkFSIHB1Ymxpc2hlZCB3aXRoIHRoZSByZWxlYXNlIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamF2YWRvYy1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzb3VyY2U+MS41PC9zb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmF0dGFjaC1qYXZhZG9jczwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+amFyPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGx1Z2lucz4KLSAgICAgICAgICAgICAgICAgICAgICA8L2J1aWxkPgotICAgICAgICA8L3Byb2ZpbGU+Ci0gICAgICAgIDxwcm9maWxlPgotICAgICAgICAgICAgPGlkPmphdmExNTwvaWQ+Ci0gICAgICAgICAgICA8YWN0aXZhdGlvbj4KLSAgICAgICAgICAgICAgICA8amRrPjEuNTwvamRrPgotICAgICAgICAgICAgPC9hY3RpdmF0aW9uPgotICAgICAgICAgICAgPGRlcGVuZGVuY2llcz4KLSAgICAgICAgICAgICAgICA8IS0tIEp1bml0IHRlc3RpbmcgZW52aXJvbm1lbnQtLT4KLSAgICAgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2p1bml0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDwvZGVwZW5kZW5jaWVzPgotICAgICAgICA8L3Byb2ZpbGU+Ci0gICAgICAgIDxwcm9maWxlPgotICAgICAgICAgICAgPGlkPmphdmExNjwvaWQ+Ci0gICAgICAgICAgICA8YWN0aXZhdGlvbj4KLSAgICAgICAgICAgICAgICA8amRrPjEuNjwvamRrPgotICAgICAgICAgICAgPC9hY3RpdmF0aW9uPgotICAgICAgICAgICAgPGRlcGVuZGVuY2llcz4KLSAgICAgICAgICAgICAgICA8IS0tIEp1bml0IHRlc3RpbmcgZW52aXJvbm1lbnQtLT4KLSAgICAgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2p1bml0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDwvZGVwZW5kZW5jaWVzPgotICAgICAgICA8L3Byb2ZpbGU+Ci0gICAgICAgIDxwcm9maWxlPgotICAgICAgICAgICAgPGlkPnNpZ248L2lkPgotICAgICAgICAgICAgPGFjdGl2YXRpb24+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5PgotICAgICAgICAgICAgICAgICAgICA8bmFtZT5zaWduPC9uYW1lPgotICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+Ci0gICAgICAgICAgICA8L2FjdGl2YXRpb24+Ci0gICAgICAgICAgICA8YnVpbGQ+Ci0gICAgICAgICAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1ncGctcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+MS4wLWFscGhhLTM8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+c2lnbi1hcnRpZmFjdHM8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+dmVyaWZ5PC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+c2lnbjwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICAgICAgPC9wbHVnaW5zPgotICAgICAgICAgICAgPC9idWlsZD4KLSAgICAgICAgPC9wcm9maWxlPgotICAgIDwvcHJvZmlsZXM+Ci0gIDxzY20+Ci0gICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL3dlYnNlcnZpY2VzL2F4aXMyL2JyYW5jaGVzL2phdmEvMV81PC9jb25uZWN0aW9uPgotICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPgotICAgICAgc2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi93ZWJzZXJ2aWNlcy9heGlzMi9icmFuY2hlcy9qYXZhLzFfNQotICAgIDwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4KLSAgICA8dXJsPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3Y3ZzLmNnaS93ZWJzZXJ2aWNlcy9heGlzMi9icmFuY2hlcy9qYXZhLzFfNTwvdXJsPgotICA8L3NjbT4KLQotICAgIDxkaXN0cmlidXRpb25NYW5hZ2VtZW50PgotICAgICAgICA8cmVwb3NpdG9yeT4KLSAgICAgICAgICAgIDxpZD5hcGFjaGUtcmVwbzwvaWQ+Ci0gICAgICAgICAgICA8bmFtZT5NYXZlbiBDZW50cmFsIFJlcG9zaXRvcnk8L25hbWU+Ci0gICAgICAgICAgICA8dXJsPgotICAgICAgICAgICAgICAgIHNjcGV4ZTovL3Blb3BsZS5hcGFjaGUub3JnLy93d3cvcGVvcGxlLmFwYWNoZS5vcmcvcmVwby9tMi1pYmlibGlvLXJzeW5jLXJlcG9zaXRvcnkKLSAgICAgICAgICAgIDwvdXJsPgotICAgICAgICA8L3JlcG9zaXRvcnk+Ci0gICAgICAgIDxzbmFwc2hvdFJlcG9zaXRvcnk+Ci0gICAgICAgICAgICA8aWQ+YXBhY2hlLXNuYXBzaG90czwvaWQ+Ci0gICAgICAgICAgICA8bmFtZT5BcGFjaGUgRGV2ZWxvcG1lbnQgUmVwb3NpdG9yeTwvbmFtZT4KLSAgICAgICAgICAgIDx1cmw+c2NwZXhlOi8vcGVvcGxlLmFwYWNoZS5vcmcvL3d3dy9wZW9wbGUuYXBhY2hlLm9yZy9yZXBvL20yLXNuYXBzaG90LXJlcG9zaXRvcnk8L3VybD4KLSAgICAgICAgICAgIDx1bmlxdWVWZXJzaW9uPmZhbHNlPC91bmlxdWVWZXJzaW9uPgotICAgICAgICA8L3NuYXBzaG90UmVwb3NpdG9yeT4KLSAgICA8L2Rpc3RyaWJ1dGlvbk1hbmFnZW1lbnQ+Ci0gICAgPGJ1aWxkPgotICAgICAgICA8cGx1Z2luTWFuYWdlbWVudD4KLSAgICAgICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFudHJ1bi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjEuMTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMi1iZXRhLTE8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY2xlYW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjI8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjAuMjwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1kZXBlbmRlbmN5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4wPC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWRlcGxveS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMzwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1lYXItcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjMuMTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1lamItcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjE8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4taW5zdGFsbC1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMjwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qYXItcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjI8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamF2YWRvYy1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuNDwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wbHVnaW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjM8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcmFyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4yPC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXJlbGVhc2UtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjAtYmV0YS03PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXJlc291cmNlcy1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMjwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zaXRlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4wLWJldGEtNjwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zb3VyY2UtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjAuNDwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuNC4yPC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXdhci1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMS1hbHBoYS0xPC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPC9wbHVnaW5zPgotICAgICAgICA8L3BsdWdpbk1hbmFnZW1lbnQ+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxzb3VyY2U+MS41PC9zb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx0YXJnZXQ+MS41PC90YXJnZXQ+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wbHVnaW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7bWF2ZW4ucGx1Z2luLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHNraXA+dHJ1ZTwvc2tpcD4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY2xlYW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8ZmFpbE9uRXJyb3I+ZmFsc2U8L2ZhaWxPbkVycm9yPgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgPC9idWlsZD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3BpbmcvcG9tLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL3BpbmcvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTlmNjhmYS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9waW5nL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItcGFyZW50PC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4xLjUuMTwvdmVyc2lvbj4KLSAgICAgICAgPHJlbGF0aXZlUGF0aD4uLi9wYXJlbnQvcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgotICAgIDwvcGFyZW50PgotICAgIDxhcnRpZmFjdElkPnBpbmc8L2FydGlmYWN0SWQ+Ci0gICAgPHBhY2thZ2luZz5tYXI8L3BhY2thZ2luZz4KLSAgICA8bmFtZT5BcGFjaGUgQXhpczIgLSBQaW5nPC9uYW1lPgotICAgIDxkZXNjcmlwdGlvbj5QaW5naW5nIGNhcGFiaWxpdHkgdG8gc2VydmljZXMgZGVwbG95ZWQgaW4gQXhpczI8L2Rlc2NyaXB0aW9uPgotICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLWtlcm5lbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7dmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8L2RlcGVuZGVuY2llcz4KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxzb3VyY2VEaXJlY3Rvcnk+c3JjPC9zb3VyY2VEaXJlY3Rvcnk+Ci0gICAgICAgIDx0ZXN0U291cmNlRGlyZWN0b3J5PnRlc3Q8L3Rlc3RTb3VyY2VEaXJlY3Rvcnk+Ci0gICAgICAgIDxyZXNvdXJjZXM+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT4uLi8uLjwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+Tk9USUNFLnR4dDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+TElDRU5TRS50eHQ8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgICAgICA8ZmlsdGVyaW5nPmZhbHNlPC9maWx0ZXJpbmc+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+Y29uZjwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxleGNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovKi5wcm9wZXJ0aWVzPC9leGNsdWRlPgotICAgICAgICAgICAgICAgIDwvZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgPGZpbHRlcmluZz5mYWxzZTwvZmlsdGVyaW5nPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYzwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxleGNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovKi5qYXZhPC9leGNsdWRlPgotICAgICAgICAgICAgICAgIDwvZXhjbHVkZXM+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICA8L3Jlc291cmNlcz4KLSAgICAgICAgPHRlc3RSZXNvdXJjZXM+Ci0gICAgICAgICAgICA8dGVzdFJlc291cmNlPgotICAgICAgICAgICAgICAgIDx0YXJnZXRQYXRoPi4uL3Rlc3QtcmVzb3VyY2VzPC90YXJnZXRQYXRoPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+dGVzdC1yZXNvdXJjZXM8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLyoqPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICA8L3Rlc3RSZXNvdXJjZT4KLSAgICAgICAgPC90ZXN0UmVzb3VyY2VzPgotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8c2tpcD5mYWxzZTwvc2tpcD4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1tYXItbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7dmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPGV4dGVuc2lvbnM+dHJ1ZTwvZXh0ZW5zaW9ucz4KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGVEZXBlbmRlbmNpZXM+ZmFsc2U8L2luY2x1ZGVEZXBlbmRlbmNpZXM+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgIDwvcGx1Z2lucz4KLSAgICA8L2J1aWxkPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvcGluZy9zcmMvTUVUQS1JTkYvbW9kdWxlLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL3Bpbmcvc3JjL01FVEEtSU5GL21vZHVsZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1ODU5NjAuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvcGluZy9zcmMvTUVUQS1JTkYvbW9kdWxlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPG1vZHVsZSBuYW1lPSJwaW5nIj4KLSAgIDxvcGVyYXRpb24gbmFtZT0icGluZ1NlcnZpY2UiIG1lcD0iaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC93c2RsL2luLW91dCI+Ci0gICAgICAgIDxhY3Rpb25NYXBwaW5nPmh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL21vZHVsZXMvcGluZzwvYWN0aW9uTWFwcGluZz4KLSAgICAgICAgPG1lc3NhZ2VSZWNlaXZlciBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5waW5nLlBpbmdNZXNzYWdlUmVjZWl2ZXIiLz4KLSAgICA8L29wZXJhdGlvbj4KLTwvbW9kdWxlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3Bpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvcGluZy9QaW5nQ29uc3RhbnRzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9waW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3BpbmcvUGluZ0NvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2I4NGNlLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3Bpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvcGluZy9QaW5nQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucGluZzsKLQotcHVibGljIGludGVyZmFjZSBQaW5nQ29uc3RhbnRzIHsKLSAgICBTdHJpbmcgUElOR19TT0FQQUNUSU9OID0gImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL21vZHVsZXMvcGluZyI7Ci0gICAgU3RyaW5nIFBJTkdfTUVUSE9EX05BTUUgPSAicGluZyI7Ci0gICAgU3RyaW5nIFBJTkdfTkFNRVNQQUNFID0gImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL21vZHVsZXMvcGluZy94c2QiOwotCi0gICAgU3RyaW5nIFRZUEVfUElOR19SRVFVRVNUID0gInBpbmdSZXF1ZXN0IjsKLSAgICBTdHJpbmcgVFlQRV9QSU5HX1JFU1BPTlNFID0gInBpbmdSZXNwb25zZSI7Ci0KLSAgICBTdHJpbmcgVEFHX1NFUlZJQ0UgPSAic2VydmljZSI7Ci0gICAgU3RyaW5nIFRBR19PUEVSQVRJT04gPSAib3BlcmF0aW9uIjsKLSAgICBTdHJpbmcgVEFHX09QRVJBVElPTl9TVEFUVVMgPSAib3BlcmF0aW9uU3RhdHVzIjsKLSAgICBTdHJpbmcgVEFHX0RFU0NSSVBUSU9OID0gImRlc2NyaXB0aW9uIjsKLSAgICBTdHJpbmcgVEFHX1NUQVRVUyA9ICJzdGF0dXMiOwotCi0gICAgU3RyaW5nIEFUVFJJQlVURV9OQU1FID0gIm5hbWUiOwotCi0gICAgU3RyaW5nIFBJTkdfRkFJTERfU1RSID0gIkZhaWxlZCB0byBwaW5nIHRoZSBvcGVyYXRpb24iOwotICAgIFN0cmluZyBQSU5HX01PRFVMRV9MRVZFTF9TVFIgPSAiU3VjY2Vzc2Z1bCB3aXRoaW4gdGhlIG1vZHVsZSBsZXZlbC4gUGluZ2FibGUgaW50ZXJmYWNlICIgKwotICAgICAgICAgICAgIm1heSBub3QgYmUgaW1wbGVtZW50ZWQgYnkgdGhlIE1lc3NhZ2VSZWNlaXZlciBvZiB0aGUgb3BlcmF0aW9uIjsKLSAgICBTdHJpbmcgUElOR19NUl9MRVZFTF9TVFIgPSAiU3VjY2Vzc2Z1bCB3aXRoaW4gdGhlIE1lc3NhZ2VSZWNlaXZlciBvZiB0aGUgb3BlcmF0aW9uLiBQaW5nYWJsZSAiICsKLSAgICAgICAgICAgICJpbnRlcmZhY2UgbWF5IG5vdCBiZSBpbXBsZW1lbnRlZCBieSB0aGUgU2VydmljZSBjbGFzcyBvZiB0aGUgb3BlcmF0aW9uIjsKLSAgICBTdHJpbmcgUElOR19TVUNDRVNTRlVMX1NUUiA9ICJQaW5nIGlzIHN1Y2Nlc3NmdWwgZm9yIHRoZSBvcGVyYXRpb24iOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3Bpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvcGluZy9QaW5nTWVzc2FnZVJlY2VpdmVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9waW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3BpbmcvUGluZ01lc3NhZ2VSZWNlaXZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzM2MwMGQyLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3Bpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvcGluZy9QaW5nTWVzc2FnZVJlY2VpdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnBpbmc7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuTWVzc2FnZVJlY2VpdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLlBpbmdhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLkFic3RyYWN0SW5PdXRTeW5jTWVzc2FnZVJlY2VpdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIFBpbmdNZXNzYWdlUmVjZWl2ZXIgZXh0ZW5kcyBBYnN0cmFjdEluT3V0U3luY01lc3NhZ2VSZWNlaXZlciBpbXBsZW1lbnRzIFBpbmdDb25zdGFudHMgewotICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhQaW5nTWVzc2FnZVJlY2VpdmVyLmNsYXNzKTsKLQotICAgIHB1YmxpYyB2b2lkIGludm9rZUJ1c2luZXNzTG9naWMoTWVzc2FnZUNvbnRleHQgaW5NZXNzYWdlLCBNZXNzYWdlQ29udGV4dCBvdXRNZXNzYWdlKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaW50IG9wZXJhdGlvblN0YXR1czsKLSAgICAgICAgICAgIEF4aXNPcGVyYXRpb24gYXhpc09wZXJhdGlvbjsKLSAgICAgICAgICAgIFBpbmdSZXNwb25zZSBwaW5nUmVzcG9uc2UgPSBuZXcgUGluZ1Jlc3BvbnNlKCk7Ci0gICAgICAgICAgICBwaW5nUmVzcG9uc2UuaW5pdFBpbmdSZXNwb25zZShpbk1lc3NhZ2UpOwotICAgICAgICAgICAgSXRlcmF0b3Igb3BMaXN0SXRlcmF0b3IgPSBnZXRBeGlzT3BlcmF0aW9ucyhpbk1lc3NhZ2UpOwotCi0gICAgICAgICAgICB3aGlsZSAob3BMaXN0SXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgYXhpc09wZXJhdGlvbiA9IChBeGlzT3BlcmF0aW9uKSBvcExpc3RJdGVyYXRvci5uZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoIVBJTkdfTUVUSE9EX05BTUUuZXF1YWxzKGF4aXNPcGVyYXRpb24uZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpKSkgewotICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25TdGF0dXMgPSBpbnZva2VQaW5nYWJsZU1SKGluTWVzc2FnZSwgYXhpc09wZXJhdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIHBpbmdSZXNwb25zZS5hZGRPcGVyYXRpb25TdGF0dXMoYXhpc09wZXJhdGlvbiwgb3BlcmF0aW9uU3RhdHVzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFNPQVBFbnZlbG9wZSBlbnZlbG9wZSA9IHBpbmdSZXNwb25zZS5nZXRSZXNwb3NlRW52ZWxvcGUoKTsKLSAgICAgICAgICAgIG91dE1lc3NhZ2Uuc2V0RW52ZWxvcGUoZW52ZWxvcGUpOwotCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbXNnID0gIkV4Y2VwdGlvbiBvY2N1cnJlZCB3aGlsZSB0cnlpbmcgdG8gcGluZyB0aGUgc2VydmljZSIgKwotICAgICAgICAgICAgICAgICAgICBpbk1lc3NhZ2UuZ2V0QXhpc1NlcnZpY2UoKS5nZXROYW1lKCk7Ci0KLSAgICAgICAgICAgIGxvZy5lcnJvcihtc2csIGUpOwotICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdChtc2cpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgaWRlbnRpZmllcyB3aGV0aGVyIHRoZSBwaW5nIHJlcXVlc3QgaXMgYW4gb3BlcmF0aW9uIGxldmVsIG9yIGEgc2VydmljZSBsZXZlbCBvbmUuCi0gICAgICogSWYgaXQgaXMgc2VydmljZWwgbGV2ZWwsIHJldHVybnMgdGhlIG9wZXJhdGlvbiBpdGVyYXRvciBmcm9tIHRoZSBBeGlzU2VydmljZQotICAgICAqCi0gICAgICogQHBhcmFtIGluTWVzc2FnZQotICAgICAqIEByZXR1cm4gSXRlcmF0b3IgZm9yIHRoZSBsaXN0IG9mIEF4aXNPcGVyYXRpb25zCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQKLSAgICAgKi8KLSAgICBwcml2YXRlIEl0ZXJhdG9yIGdldEF4aXNPcGVyYXRpb25zKE1lc3NhZ2VDb250ZXh0IGluTWVzc2FnZSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIGJvb2xlYW4gc2VydmljZUxldmVsID0gZmFsc2U7Ci0gICAgICAgIEl0ZXJhdG9yIG9wZXJhdGlvbnNJdGVyYXRvcjsKLQotICAgICAgICBPTUVsZW1lbnQgZWxlbWVudCA9IG51bGw7Ci0gICAgICAgIE9NRWxlbWVudCBwaW5nUmVxdWVzdEVsZW1lbnQgPSBpbk1lc3NhZ2UuZ2V0RW52ZWxvcGUoKS4KLSAgICAgICAgICAgICAgICBnZXRCb2R5KCkuZ2V0Rmlyc3RDaGlsZFdpdGhOYW1lKG5ldyBRTmFtZShUWVBFX1BJTkdfUkVRVUVTVCkpOwotCi0gICAgICAgIGlmIChwaW5nUmVxdWVzdEVsZW1lbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgLy90aHJvdyBuZXcgQXhpc0ZhdWx0KCJQaW5nIFJlcXVlc3QgaXMgbm90IHNwZWNpZmllZCIpOwotICAgICAgICAgICAgLy9TT0FQIGJvZHkgaXMgbnVsbCBvciBwaW5nIHJlcXVlc3QgaXMgbm90IHNwZWNpZmllZAotICAgICAgICAgICAgLy9UaGlzIGlzIGNvbnNpZGVyZWQgYXMgYSBzZXJ2aWNlIGxldmVsIHBpbmcuCi0gICAgICAgICAgICBzZXJ2aWNlTGV2ZWwgPSB0cnVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZWxlbWVudCA9IHBpbmdSZXF1ZXN0RWxlbWVudC5nZXRGaXJzdENoaWxkV2l0aE5hbWUobmV3IFFOYW1lKFRBR19PUEVSQVRJT04pKTsKLSAgICAgICAgfQotCi0KLSAgICAgICAgaWYgKCFzZXJ2aWNlTGV2ZWwgJiYgZWxlbWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvL09wZXJhdGlvbnMgdG8gYmUgcGluZ2VkIGhhcyBiZWVuIHNwZWNpZmllZCBpbiB0aGUgcGluZyByZXF1ZXN0Ci0gICAgICAgICAgICBJdGVyYXRvciBlbGVtZW50SXRlcmF0b3IgPSBwaW5nUmVxdWVzdEVsZW1lbnQuZ2V0Q2hpbGRyZW5XaXRoTmFtZShuZXcgUU5hbWUoVEFHX09QRVJBVElPTikpOwotICAgICAgICAgICAgQXJyYXlMaXN0IG9wZXJhdGlvbkxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICBBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb247Ci0KLSAgICAgICAgICAgIHdoaWxlIChlbGVtZW50SXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgT01FbGVtZW50IG9wRWxlbWVudCA9IChPTUVsZW1lbnQpIGVsZW1lbnRJdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG9wZXJhdGlvbk5hbWUgPSBvcEVsZW1lbnQuZ2V0VGV4dCgpOwotICAgICAgICAgICAgICAgIGF4aXNPcGVyYXRpb24gPSBpbk1lc3NhZ2UuZ2V0QXhpc1NlcnZpY2UoKS5nZXRPcGVyYXRpb24obmV3IFFOYW1lKG9wZXJhdGlvbk5hbWUpKTsKLQotICAgICAgICAgICAgICAgIGlmIChheGlzT3BlcmF0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uTGlzdC5hZGQoYXhpc09wZXJhdGlvbik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJPcGVyYXRpb24gbm90IGZvdW5kOiAiICsgb3BlcmF0aW9uTmFtZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBzcGVjaWZpZWQgaW4gdGhlIHBpbmcgcmVxdWVzdCBmb3IgdGhlIHNlcnZpY2UiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbk1lc3NhZ2UuZ2V0QXhpc1NlcnZpY2UoKS5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcihtc2cpOwotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KG1zZyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgb3BlcmF0aW9uc0l0ZXJhdG9yID0gb3BlcmF0aW9uTGlzdC5pdGVyYXRvcigpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy9ObyBvcGVyYXRpb24gaXMgbWVudGlvbmVkIGluIHRoZSByZXF1ZXN0Li4gU28gdGhpcyBpcyBhIHNlcnZpY2UgbGV2ZWwgcGluZwotICAgICAgICAgICAgb3BlcmF0aW9uc0l0ZXJhdG9yID0gaW5NZXNzYWdlLmdldEF4aXNTZXJ2aWNlKCkuZ2V0T3BlcmF0aW9ucygpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBvcGVyYXRpb25zSXRlcmF0b3I7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgY2hlY2tzIHdoZXRoZXIgdGhlIE1lc3NhZ2VSZWNlaXZlciBpcyBQaW5nYWJsZQotICAgICAqIElmIGl0IGlzIFBpbmdhYmxlIGludm9rZSB0aGUgcGluZygpIG1ldGhvZCBhZnRlciBzZXR0aW5nIHRoZSBvcGVyYXRpb24gbmFtZSB0byBiZSBwaW5nZWQgYXMgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYXhpc09wZXJhdGlvbgotICAgICAqIEByZXR1cm4KLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdAotICAgICAqLwotICAgIHByaXZhdGUgaW50IGludm9rZVBpbmdhYmxlTVIoTWVzc2FnZUNvbnRleHQgaW5NZXNzYWdlLCBBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb24pIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBNZXNzYWdlUmVjZWl2ZXIgbXNnUmVjZWl2ZXIgPSBheGlzT3BlcmF0aW9uLmdldE1lc3NhZ2VSZWNlaXZlcigpOwotCi0gICAgICAgIGlmIChtc2dSZWNlaXZlciAhPSBudWxsICYmIG1zZ1JlY2VpdmVyIGluc3RhbmNlb2YgUGluZ2FibGUpIHsKLSAgICAgICAgICAgIFBpbmdhYmxlIHBpbmdhYmxlTVIgPSAoUGluZ2FibGUpIG1zZ1JlY2VpdmVyOwotICAgICAgICAgICAgLy9BZGRpbmcgdGhlIG9wZXJhdGlvbiBuYW1lIHRvIGJlIHBpbmdlZCBhcyBhIHByb3BlcnR5Ci0gICAgICAgICAgICBpbk1lc3NhZ2Uuc2V0UHJvcGVydHkoUGluZ2FibGUuT1BFUkFUSU9OX1RPX1BJTkcsIGF4aXNPcGVyYXRpb24uZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgIHJldHVybiBwaW5nYWJsZU1SLnBpbmcoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBQaW5nYWJsZS5QSU5HX01PRFVMRV9MRVZFTDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9waW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3BpbmcvUGluZ1Jlc3BvbnNlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9waW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3BpbmcvUGluZ1Jlc3BvbnNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzNzAyYTguLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvcGluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9waW5nL1BpbmdSZXNwb25zZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnBpbmc7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01OYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbjsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLXB1YmxpYyBjbGFzcyBQaW5nUmVzcG9uc2UgaW1wbGVtZW50cyBQaW5nQ29uc3RhbnRzIHsKLQotICAgIHByaXZhdGUgT01FbGVtZW50IHBpbmdSZXNwb25zZTsKLSAgICBwcml2YXRlIFNPQVBGYWN0b3J5IHNvYXBGYWN0b3J5OwotICAgIHByaXZhdGUgT01OYW1lc3BhY2UgcGluZ05hbWVzcGFjZTsKLQotICAgIHB1YmxpYyBQaW5nUmVzcG9uc2UoKSB7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbml0UGluZ1Jlc3BvbnNlKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHsKLSAgICAgICAgaWYgKG1zZ0NvbnRleHQuaXNTT0FQMTEoKSkgewotICAgICAgICAgICAgc29hcEZhY3RvcnkgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTFGYWN0b3J5KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzb2FwRmFjdG9yeSA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMkZhY3RvcnkoKTsKLSAgICAgICAgfQotCi0gICAgICAgIE9NRWxlbWVudCBwaW5nUmVxdWVzdEVsZW1lbnQgPSBtc2dDb250ZXh0LmdldEVudmVsb3BlKCkuCi0gICAgICAgICAgICAgICAgZ2V0Qm9keSgpLmdldEZpcnN0Q2hpbGRXaXRoTmFtZShuZXcgUU5hbWUoVFlQRV9QSU5HX1JFUVVFU1QpKTsKLQotICAgICAgICBpZiAocGluZ1JlcXVlc3RFbGVtZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHBpbmdOYW1lc3BhY2UgPSBwaW5nUmVxdWVzdEVsZW1lbnQuZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwaW5nTmFtZXNwYWNlID0gc29hcEZhY3RvcnkuY3JlYXRlT01OYW1lc3BhY2UoUElOR19OQU1FU1BBQ0UsIiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcGluZ1Jlc3BvbnNlID0gc29hcEZhY3RvcnkuY3JlYXRlT01FbGVtZW50KFRZUEVfUElOR19SRVNQT05TRSwgcGluZ05hbWVzcGFjZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkT3BlcmF0aW9uU3RhdHVzKFN0cmluZyBvcGVyYXRpb25OYW1lLCBpbnQgb3BTdGF0dXMpIHsKLSAgICAgICAgT01FbGVtZW50IHN0YXR1cyA9IHNvYXBGYWN0b3J5LmNyZWF0ZU9NRWxlbWVudChUQUdfU1RBVFVTLCBwaW5nTmFtZXNwYWNlKTsKLSAgICAgICAgLy9UT0RPIFNlbmQgdGhlIGludGVnZXIgdmFsdWUgb3IgdGhlIHN0cmluZyBkZXNjcmlwdGlvbgotICAgICAgICBzdGF0dXMuYWRkQ2hpbGQoc29hcEZhY3RvcnkuY3JlYXRlT01UZXh0KEludGVnZXIudG9TdHJpbmcob3BTdGF0dXMpKSk7Ci0KLSAgICAgICAgT01FbGVtZW50IG9wZXJhdGlvbiA9IHNvYXBGYWN0b3J5LmNyZWF0ZU9NRWxlbWVudChUQUdfT1BFUkFUSU9OX1NUQVRVUywgcGluZ05hbWVzcGFjZSk7Ci0gICAgICAgIG9wZXJhdGlvbi5hZGRBdHRyaWJ1dGUoQVRUUklCVVRFX05BTUUsIG9wZXJhdGlvbk5hbWUsIHBpbmdOYW1lc3BhY2UpOwotICAgICAgICBvcGVyYXRpb24uYWRkQ2hpbGQoc3RhdHVzKTsKLQotICAgICAgICBwaW5nUmVzcG9uc2UuYWRkQ2hpbGQob3BlcmF0aW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRPcGVyYXRpb25TdGF0dXMoQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uLCBpbnQgb3BTdGF0dXMpIHsKLSAgICAgICAgYWRkT3BlcmF0aW9uU3RhdHVzKGF4aXNPcGVyYXRpb24uZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpLCBvcFN0YXR1cyk7Ci0gICAgfQotCi0gICAgcHVibGljIFNPQVBFbnZlbG9wZSBnZXRSZXNwb3NlRW52ZWxvcGUoKSB7Ci0gICAgICAgIFNPQVBFbnZlbG9wZSBlbnZlbG9wZSA9IHNvYXBGYWN0b3J5LmdldERlZmF1bHRFbnZlbG9wZSgpOwotICAgICAgICBlbnZlbG9wZS5nZXRCb2R5KCkuYWRkQ2hpbGQocGluZ1Jlc3BvbnNlKTsKLSAgICAgICAgcmV0dXJuIGVudmVsb3BlOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9ybWkvcG9tLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjhjZDQ3Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08cHJvamVjdAotICAgICAgICB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIgotICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItcGFyZW50PC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4xLjUuMTwvdmVyc2lvbj4KLSAgICAgICAgPHJlbGF0aXZlUGF0aD4uLi9wYXJlbnQvcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgotICAgIDwvcGFyZW50PgotCi0gICAgPGFydGlmYWN0SWQ+YXhpczItcm1pPC9hcnRpZmFjdElkPgotICAgIDxuYW1lPkFwYWNoZSBBeGlzMiAtIFJlbW90ZSBNZXRob2QgSW52b2NhdGlvbjwvbmFtZT4KLSAgICA8ZGVzY3JpcHRpb24+QXhpczIgUmVtb3RlIE1ldGhvZCBJbnZvY2F0aW9uPC9kZXNjcmlwdGlvbj4KLSAgICA8c2NtPgotICAgICAgICA8Y29ubmVjdGlvbj4KLSAgICAgICAgICAgIHNjbTpzdm46aHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi93ZWJzZXJ2aWNlcy9heGlzMi90cnVuay9qYXZhL21vZHVsZXMvcm1pCi0gICAgICAgIDwvY29ubmVjdGlvbj4KLSAgICAgICAgPGRldmVsb3BlckNvbm5lY3Rpb24+Ci0gICAgICAgICAgICBzY206c3ZuOmh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL3dlYnNlcnZpY2VzL2F4aXMyL3RydW5rL2phdmEvbW9kdWxlcy9ybWkKLSAgICAgICAgPC9kZXZlbG9wZXJDb25uZWN0aW9uPgotICAgICAgICA8dXJsPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3dmMvd2Vic2VydmljZXMvYXhpczIvdHJ1bmsvamF2YS9tb2R1bGVzL3JtaTwvdXJsPgotICAgIDwvc2NtPgotICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+JHtwcm9qZWN0Lmdyb3VwSWR9PC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczIta2VybmVsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHt2ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPiR7cHJvamVjdC5ncm91cElkfTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLWFkYjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7dmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8L2RlcGVuZGVuY2llcz4KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxzb3VyY2VEaXJlY3Rvcnk+c3JjPC9zb3VyY2VEaXJlY3Rvcnk+Ci0gICAgICAgIDx0ZXN0U291cmNlRGlyZWN0b3J5PnRlc3Q8L3Rlc3RTb3VyY2VEaXJlY3Rvcnk+Ci0gICAgICAgIDxyZXNvdXJjZXM+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmM8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqLyouamF2YTwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1ZGVzPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgPC9yZXNvdXJjZXM+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxza2lwPmZhbHNlPC9za2lwPgotICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi9STUlDbGllbnRTZXJ2aWNlMVRlc3QuamF2YTwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqL1NlcnZlclRlc3QuamF2YTwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqL0RhdGFCaW5kVGVzdC5qYXZhPC9leGNsdWRlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovUmVxdWVzdFJlc3BvbnNlVGVzdC5qYXZhPC9leGNsdWRlPgotICAgICAgICAgICAgICAgICAgICA8L2V4Y2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qVGVzdC5qYXZhPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgPC9idWlsZD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS9zcmMvbG9nNGoucHJvcGVydGllcyBiL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS9zcmMvbG9nNGoucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjljOGYzYS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9ybWkvc3JjL2xvZzRqLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0jCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLSMgU2V0IHJvb3QgY2F0ZWdvcnkgcHJpb3JpdHkgdG8gSU5GTyBhbmQgaXRzIG9ubHkgYXBwZW5kZXIgdG8gQ09OU09MRS4KLWxvZzRqLnJvb3RDYXRlZ29yeT1JTkZPLCBDT05TT0xFCi0jbG9nNGoucm9vdENhdGVnb3J5PUlORk8sIENPTlNPTEUsIExPR0ZJTEUKLQotIyBTZXQgdGhlIGVudGVycHJpc2UgbG9nZ2VyIHByaW9yaXR5IHRvIEZBVEFMCi1sb2c0ai5sb2dnZXIub3JnLmFwYWNoZS5heGlzMi5lbnRlcnByaXNlPUZBVEFMCi1sb2c0ai5sb2dnZXIuZGUuaHVuc2lja2VyLmphbG9weS5pbz1GQVRBTAotbG9nNGoubG9nZ2VyLmh0dHBjbGllbnQud2lyZS5oZWFkZXI9RkFUQUwKLWxvZzRqLmxvZ2dlci5vcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudD1GQVRBTAotCi0jIENPTlNPTEUgaXMgc2V0IHRvIGJlIGEgQ29uc29sZUFwcGVuZGVyIHVzaW5nIGEgUGF0dGVybkxheW91dC4KLWxvZzRqLmFwcGVuZGVyLkNPTlNPTEU9b3JnLmFwYWNoZS5sb2c0ai5Db25zb2xlQXBwZW5kZXIKLWxvZzRqLmFwcGVuZGVyLkNPTlNPTEUubGF5b3V0PW9yZy5hcGFjaGUubG9nNGouUGF0dGVybkxheW91dAotbG9nNGouYXBwZW5kZXIuQ09OU09MRS5sYXlvdXQuQ29udmVyc2lvblBhdHRlcm49JWQgJS01cCAlYyAtICVtJW4KLQotIyBMT0dGSUxFIGlzIHNldCB0byBiZSBhIEZpbGUgYXBwZW5kZXIgdXNpbmcgYSBQYXR0ZXJuTGF5b3V0LgotbG9nNGouYXBwZW5kZXIuTE9HRklMRT1vcmcuYXBhY2hlLmxvZzRqLkZpbGVBcHBlbmRlcgotbG9nNGouYXBwZW5kZXIuTE9HRklMRS5GaWxlPWF4aXMyLmxvZwotbG9nNGouYXBwZW5kZXIuTE9HRklMRS5BcHBlbmQ9dHJ1ZQotbG9nNGouYXBwZW5kZXIuTE9HRklMRS5sYXlvdXQ9b3JnLmFwYWNoZS5sb2c0ai5QYXR0ZXJuTGF5b3V0Ci1sb2c0ai5hcHBlbmRlci5MT0dGSUxFLmxheW91dC5Db252ZXJzaW9uUGF0dGVybj0lZCBbJXRdICUtNXAgJWMgJXggLSAlbSVuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9Db25maWd1cmF0b3IuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvQ29uZmlndXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlOWVjNTQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9Db25maWd1cmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuY29uZmlnLkNsYXNzSW5mbzsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5kYXRhYmluZC5TaW1wbGVUeXBlSGFuZGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS51dGlsLkNvbnN0YW50czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiB0aGlzIGNsYXNzIGlzIHVzZWQgdG8ga2VlcCBhbGwgdGhlCi0gKiB1c2VyIGRlZmluZWQgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWd1cmF0b3IgewotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzQmFyZTsKLSAgICBwcml2YXRlIExpc3QgZXh0ZW5zaW9uQ2xhc3NlczsKLSAgICBwcml2YXRlIE1hcCBwYWNrYWdlVG9OYW1lc3BhY2VNYXA7Ci0gICAgcHJpdmF0ZSBTaW1wbGVUeXBlSGFuZGxlciBzaW1wbGVUeXBlSGFuZGxlcjsKLSAgICAvKioKLSAgICAgKiB0aGlzIG1hcCBjb250YWlucyBjdXN0b20gZGV0YWlscyBvZiB0aGUgY2xhc3NlcwotICAgICAqLwotICAgIHByaXZhdGUgTWFwIGNsYXNzSW5mb01hcDsKLQotICAgIHB1YmxpYyBDb25maWd1cmF0b3IoKSB7Ci0gICAgICAgIHRoaXMuZXh0ZW5zaW9uQ2xhc3NlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgdGhpcy5wYWNrYWdlVG9OYW1lc3BhY2VNYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICB0aGlzLmNsYXNzSW5mb01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICAgICAgcG9wdWxhdGVEZWZ1YWx0VmFsdWVzKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHBvcHVsYXRlRGVmdWFsdFZhbHVlcygpewotICAgICAgICAvLyB3ZSB3YW50IHRvIGtlZXAga2V5IGFuZCB2YWx1ZSBhdHRyaWJ1dGVzIGluIG51bGwgbmFtZXMgcGFjZS4KLSAgICAgICAgdGhpcy5wYWNrYWdlVG9OYW1lc3BhY2VNYXAucHV0KCJvcmcuYXBhY2hlLmF4aXMyLnJtaS50eXBlcyIsIENvbnN0YW50cy5STUlfVFlQRV9OQU1TUEFDRSk7Ci0gICAgICAgIHRoaXMuc2ltcGxlVHlwZUhhbmRsZXIgPSBuZXcgU2ltcGxlVHlwZUhhbmRsZXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZShTdHJpbmcgcGFja2FnZU5hbWUpewotICAgICAgIGlmICh0aGlzLnBhY2thZ2VUb05hbWVzcGFjZU1hcC5jb250YWluc0tleShwYWNrYWdlTmFtZSkpewotICAgICAgICAgICByZXR1cm4gKFN0cmluZykgdGhpcy5wYWNrYWdlVG9OYW1lc3BhY2VNYXAuZ2V0KHBhY2thZ2VOYW1lKTsKLSAgICAgICB9IGVsc2UgewotICAgICAgICAgICByZXR1cm4gInVybjoiICsgcGFja2FnZU5hbWU7Ci0gICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZEV4dGVuc2lvbihDbGFzcyBleHRlbnNpb25DbGFzcyl7Ci0gICAgICAgIHRoaXMuZXh0ZW5zaW9uQ2xhc3Nlcy5hZGQoZXh0ZW5zaW9uQ2xhc3MpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFBhY2thZ2VUb05hbWVzcGFjZU1hcGluZyhTdHJpbmcgcGFja2FnZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lc3BhY2UpewotICAgICAgICB0aGlzLnBhY2thZ2VUb05hbWVzcGFjZU1hcC5wdXQocGFja2FnZU5hbWUsbmFtZXNwYWNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRDbGFzc0luZm8oQ2xhc3NJbmZvIGNsYXNzSW5mbyl7Ci0gICAgICAgIHRoaXMuY2xhc3NJbmZvTWFwLnB1dChjbGFzc0luZm8uZ2V0SmF2YUNsYXNzKCksY2xhc3NJbmZvKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2xhc3NJbmZvIGdldENsYXNzSW5mbyhDbGFzcyBqYXZhQ2xhc3MpewotICAgICAgICByZXR1cm4gKENsYXNzSW5mbykgdGhpcy5jbGFzc0luZm9NYXAuZ2V0KGphdmFDbGFzcyk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNCYXJlKCkgewotICAgICAgICByZXR1cm4gaXNCYXJlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEJhcmUoYm9vbGVhbiBiYXJlKSB7Ci0gICAgICAgIGlzQmFyZSA9IGJhcmU7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3QgZ2V0RXh0ZW5zaW9uQ2xhc3NlcygpIHsKLSAgICAgICAgcmV0dXJuIGV4dGVuc2lvbkNsYXNzZXM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RXh0ZW5zaW9uQ2xhc3NlcyhMaXN0IGV4dGVuc2lvbkNsYXNzZXMpIHsKLSAgICAgICAgdGhpcy5leHRlbnNpb25DbGFzc2VzID0gZXh0ZW5zaW9uQ2xhc3NlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2ltcGxlVHlwZUhhbmRsZXIgZ2V0U2ltcGxlVHlwZUhhbmRsZXIoKSB7Ci0gICAgICAgIHJldHVybiBzaW1wbGVUeXBlSGFuZGxlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTaW1wbGVUeXBlSGFuZGxlcihTaW1wbGVUeXBlSGFuZGxlciBzaW1wbGVUeXBlSGFuZGxlcikgewotICAgICAgICB0aGlzLnNpbXBsZVR5cGVIYW5kbGVyID0gc2ltcGxlVHlwZUhhbmRsZXI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9jbGllbnQvUHJveHlJbnZvY2F0aW9uSGFuZGxlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9jbGllbnQvUHJveHlJbnZvY2F0aW9uSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTI3ZDY5Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvY2xpZW50L1Byb3h5SW52b2NhdGlvbkhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5ybWkuY2xpZW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuQ29uZmlndXJhdG9yOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvbkhhbmRsZXI7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotCi0KLXB1YmxpYyBjbGFzcyBQcm94eUludm9jYXRpb25IYW5kbGVyIGltcGxlbWVudHMgSW52b2NhdGlvbkhhbmRsZXIgewotCi0gICAgcHJpdmF0ZSBSTUlDbGllbnQgcm1pQ2xpZW50OwotCi0gICAgcHVibGljIFByb3h5SW52b2NhdGlvbkhhbmRsZXIoQ2xhc3MgaW50ZXJmYWNlQ2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZXByKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgdGhpcy5ybWlDbGllbnQgPSBuZXcgUk1JQ2xpZW50KGludGVyZmFjZUNsYXNzLGNvbmZpZ3VyYXRvcixlcHIpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgaW52b2tlKE9iamVjdCBwcm94eSwgTWV0aG9kIG1ldGhvZCwgT2JqZWN0W10gYXJncykgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIC8vIGludm9rZSB0aGUgcm1pY2xpZW50IG9iamVjdAotICAgICAgICByZXR1cm4gdGhpcy5ybWlDbGllbnQuaW52b2tlTWV0aG9kKG1ldGhvZC5nZXROYW1lKCksYXJncyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9jbGllbnQvUk1JQ2xpZW50LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL2NsaWVudC9STUlDbGllbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWIwMjllOS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL2NsaWVudC9STUlDbGllbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLmNsaWVudDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTURhdGFTb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmxsb20uT01Tb3VyY2VkRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50LlNlcnZpY2VDbGllbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLkNvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5kYXRhYmluZC5KYXZhT2JqZWN0U2VyaWFsaXplcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5kYXRhYmluZC5STUlEYXRhU291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmRhdGFiaW5kLlhtbFN0cmVhbVBhcnNlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5leGNlcHRpb24uTWV0YURhdGFQb3B1bGF0ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5leGNlcHRpb24uU2NoZW1hR2VuZXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5leGNlcHRpb24uWG1sUGFyc2luZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5leGNlcHRpb24uWG1sU2VyaWFsaXppbmdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEuT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLm1ldGFkYXRhLlBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS5TZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLm1ldGFkYXRhLnhtbC5YbWxFbGVtZW50OwotCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi0KLXB1YmxpYyBjbGFzcyBSTUlDbGllbnQgZXh0ZW5kcyBTZXJ2aWNlQ2xpZW50IHsKLQotICAgIHByaXZhdGUgU2VydmljZSBzZXJ2aWNlOwotICAgIHByaXZhdGUgSmF2YU9iamVjdFNlcmlhbGl6ZXIgamF2YU9iamVjdFNlcmlhbGl6ZXI7Ci0gICAgcHJpdmF0ZSBYbWxTdHJlYW1QYXJzZXIgeG1sU3RyZWFtUGFyc2VyOwotCi0gICAgcHVibGljIFJNSUNsaWVudChDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UpCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgc3VwZXIoY29uZmlnQ29udGV4dCwgYXhpc1NlcnZpY2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBSTUlDbGllbnQoQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgIERlZmluaXRpb24gd3NkbDRqRGVmaW5pdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgIFFOYW1lIHdzZGxTZXJ2aWNlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwb3J0TmFtZSkKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBzdXBlcihjb25maWdDb250ZXh0LCB3c2RsNGpEZWZpbml0aW9uLCB3c2RsU2VydmljZU5hbWUsIHBvcnROYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUk1JQ2xpZW50KENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICBVUkwgd3NkbFVSTCwKLSAgICAgICAgICAgICAgICAgICAgIFFOYW1lIHdzZGxTZXJ2aWNlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwb3J0TmFtZSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIHN1cGVyKGNvbmZpZ0NvbnRleHQsIHdzZGxVUkwsIHdzZGxTZXJ2aWNlTmFtZSwgcG9ydE5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBSTUlDbGllbnQoQ2xhc3Mgc2VydmljZUNsYXNzLAotICAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBlcHIpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICB0aGlzLnNlcnZpY2UgPSBuZXcgU2VydmljZShzZXJ2aWNlQ2xhc3MsIGNvbmZpZ3VyYXRvcik7Ci0gICAgICAgIHRoaXMuc2V0VGFyZ2V0RVBSKG5ldyBFbmRwb2ludFJlZmVyZW5jZShlcHIpKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHRoaXMuc2VydmljZS5wb3B1bGF0ZU1ldGFEYXRhKCk7Ci0gICAgICAgICAgICB0aGlzLnNlcnZpY2UuZ2VuZXJhdGVTY2hlbWEoKTsKLSAgICAgICAgICAgIHRoaXMuamF2YU9iamVjdFNlcmlhbGl6ZXIgPSBuZXcgSmF2YU9iamVjdFNlcmlhbGl6ZXIoCi0gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VydmljZS5nZXRQcm9jZXNzZWRUeXBlTWFwKCksCi0gICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXJ2aWNlLmdldFNjaGVtYU1hcCgpKTsKLSAgICAgICAgICAgIHRoaXMueG1sU3RyZWFtUGFyc2VyID0gbmV3IFhtbFN0cmVhbVBhcnNlcigKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXJ2aWNlLmdldFByb2Nlc3NlZFR5cGVNYXAoKSwKLSAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdG9yLAotICAgICAgICAgICAgICAgICAgICB0aGlzLnNlcnZpY2UuZ2V0U2NoZW1hTWFwKCkpOwotICAgICAgICB9IGNhdGNoIChNZXRhRGF0YVBvcHVsYXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEF4aXNGYXVsdC5tYWtlRmF1bHQoZSk7Ci0gICAgICAgIH0gY2F0Y2ggKFNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBSTUlDbGllbnQoQ2xhc3Mgc2VydmljZUNsYXNzLAotICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGVwcikgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIHRoaXMoc2VydmljZUNsYXNzLCBuZXcgQ29uZmlndXJhdG9yKCksIGVwcik7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBpbnZva2VNZXRob2QoU3RyaW5nIG9wZXJhdGlvbk5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0W10gaW5wdXRPYmplY3RzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICBPcGVyYXRpb24gb3BlcmF0aW9uID0gdGhpcy5zZXJ2aWNlLmdldE9wZXJhdGlvbihvcGVyYXRpb25OYW1lKTsKLSAgICAgICAgT01FbGVtZW50IGlucHV0T01FbGVtZW50ID0gZ2V0SW5wdXRPTUVsZW1lbnQoaW5wdXRPYmplY3RzLAotICAgICAgICAgICAgICAgIG9wZXJhdGlvbiwKLSAgICAgICAgICAgICAgICB0aGlzLmphdmFPYmplY3RTZXJpYWxpemVyLAotICAgICAgICAgICAgICAgIE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgdGhpcy5nZXRPcHRpb25zKCkuc2V0QWN0aW9uKCJ1cm46IiArIG9wZXJhdGlvbk5hbWUpOwotICAgICAgICBPYmplY3QgcmV0dXJuT2JqZWN0ID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLQotICAgICAgICAgICAgT01FbGVtZW50IHJldHVybk9NRWxlbWVudCA9IHRoaXMuc2VuZFJlY2VpdmUoaW5wdXRPTUVsZW1lbnQpOwotICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gdGhpcy54bWxTdHJlYW1QYXJzZXIuZ2V0T3V0cHV0T2JqZWN0KAotICAgICAgICAgICAgICAgICAgICByZXR1cm5PTUVsZW1lbnQuZ2V0WE1MU3RyZWFtUmVhZGVyV2l0aG91dENhY2hpbmcoKSwKLSAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEF4aXNGYXVsdC5tYWtlRmF1bHQoZSk7Ci0gICAgICAgIH0gY2F0Y2ggKFhtbFBhcnNpbmdFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKTsKLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGF4aXNGYXVsdCl7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgZGV0YWlsRWxlbWVudCA9IGF4aXNGYXVsdC5nZXREZXRhaWwoKTsKLSAgICAgICAgICAgIGlmIChkZXRhaWxFbGVtZW50ICE9IG51bGwpewotICAgICAgICAgICAgICAgUU5hbWUgZWxlbWVudFFOYW1lID0gZGV0YWlsRWxlbWVudC5nZXRRTmFtZSgpOwotICAgICAgICAgICAgICAgUGFyYW1ldGVyIHBhcmFtZXRlciA9IHRoaXMuc2VydmljZS5nZXRFeGNlcHRpb25QYXJhbWV0ZXIoZWxlbWVudFFOYW1lKTsKLSAgICAgICAgICAgICAgIGlmIChwYXJhbWV0ZXIgIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgRXhjZXB0aW9uIGN1c3RvbUV4Y2VwdGlvbiA9IChFeGNlcHRpb24pIHRoaXMueG1sU3RyZWFtUGFyc2VyLmdldE9iamVjdEZvclBhcmFtZXRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbEVsZW1lbnQuZ2V0WE1MU3RyZWFtUmVhZGVyV2l0aG91dENhY2hpbmcoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcik7Ci0gICAgICAgICAgICAgICAgICAgdGhyb3cgY3VzdG9tRXhjZXB0aW9uOwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgdGhyb3cgYXhpc0ZhdWx0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhyb3cgYXhpc0ZhdWx0OwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJldHVybk9iamVjdDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE9NRWxlbWVudCBnZXRJbnB1dE9NRWxlbWVudChmaW5hbCBPYmplY3RbXSBpbnB1dE9iamVjdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT3BlcmF0aW9uIG9wZXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBKYXZhT2JqZWN0U2VyaWFsaXplciBqYXZhT2JqZWN0U2VyaWFsaXplciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTUZhY3Rvcnkgb21GYWN0b3J5KSB7Ci0gICAgICAgIE9NRGF0YVNvdXJjZSBvbURhdGFTb3VyY2UgPSBuZXcgUk1JRGF0YVNvdXJjZSgpIHsKLQotICAgICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKE1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGphdmFPYmplY3RTZXJpYWxpemVyLnNlcmlhbGl6ZUlucHV0RWxlbWVudChpbnB1dE9iamVjdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uLmdldElucHV0RWxlbWVudCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbi5nZXRJbnB1dFBhcmFtZXRlcnMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFhtbFNlcmlhbGl6aW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgbmV3IFhNTFN0cmVhbUV4Y2VwdGlvbigiUHJvYmxlbSBpbiBzZXJpYWxpemluZyB0aGUgcmV0dXJuIG9iamVjdCIsIGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgWG1sRWxlbWVudCBpbnB1dFhtbEVsZW1lbnQgPSBvcGVyYXRpb24uZ2V0SW5wdXRFbGVtZW50KCk7Ci0gICAgICAgIFFOYW1lIGlucHV0RWxlbWVudFFOYW1lID0gbmV3IFFOYW1lKGlucHV0WG1sRWxlbWVudC5nZXROYW1lc3BhY2UoKSwgaW5wdXRYbWxFbGVtZW50LmdldE5hbWUoKSk7Ci0gICAgICAgIHJldHVybiBuZXcgT01Tb3VyY2VkRWxlbWVudEltcGwoaW5wdXRFbGVtZW50UU5hbWUsIG9tRmFjdG9yeSwgb21EYXRhU291cmNlKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvY2xpZW50L1JNSUNsaWVudFByb3h5LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL2NsaWVudC9STUlDbGllbnRQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzIxMjAwLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvY2xpZW50L1JNSUNsaWVudFByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLmNsaWVudDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLkNvbmZpZ3VyYXRvcjsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25IYW5kbGVyOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlByb3h5OwotCi0vKioKLSAqIHRoaXMgY2xhc3MgaXMgdXNlZCB0byBnZW5lcmF0ZSB0aGUgcHJveHkgY2xpZW50cy4KLSAqLwotCi1wdWJsaWMgY2xhc3MgUk1JQ2xpZW50UHJveHkgewotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGNyZWF0ZVByb3h5KENsYXNzIGludGVyZmFjZUNsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRvciBjb25maWd1cmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGVwcikgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIEludm9jYXRpb25IYW5kbGVyIGludm9jYXRpb25IYW5kbGVyID0gbmV3IFByb3h5SW52b2NhdGlvbkhhbmRsZXIoaW50ZXJmYWNlQ2xhc3MsY29uZmlndXJhdG9yLGVwcik7Ci0gICAgICAgIE9iamVjdCBwcm94eSA9IFByb3h5Lm5ld1Byb3h5SW5zdGFuY2UoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXXtpbnRlcmZhY2VDbGFzc30sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52b2NhdGlvbkhhbmRsZXIpOwotICAgICAgICByZXR1cm4gcHJveHk7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBjcmVhdGVQcm94eShDbGFzcyBpbnRlcmZhY2VDbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZXByKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZVByb3h5KGludGVyZmFjZUNsYXNzLG5ldyBDb25maWd1cmF0b3IoKSxlcHIpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvY29uZmlnL0NsYXNzSW5mby5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9jb25maWcvQ2xhc3NJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4MTZhOTYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9jb25maWcvQ2xhc3NJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLmNvbmZpZzsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogdGhpcyBpcyB1c2VkIHRvIGtlZXAgdGhlIGN1c3RvbWUgaW5mb3JtYXRpb24KLSAqIGFib3V0IHRoZSBjbGFzcwotICovCi1wdWJsaWMgY2xhc3MgQ2xhc3NJbmZvIHsKLQotICAgIHByaXZhdGUgTWFwIGZpZWxkSW5mb01hcDsKLSAgICBwcml2YXRlIENsYXNzIGphdmFDbGFzczsKLQotICAgIHB1YmxpYyBDbGFzc0luZm8oQ2xhc3MgamF2YUNsYXNzKSB7Ci0gICAgICAgIHRoaXMoKTsKLSAgICAgICAgdGhpcy5qYXZhQ2xhc3MgPSBqYXZhQ2xhc3M7Ci0gICAgfQotCi0gICAgcHVibGljIENsYXNzSW5mbygpIHsKLSAgICAgICAgZmllbGRJbmZvTWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRGaWVsZEluZm8oRmllbGRJbmZvIGZpZWxkSW5mbyl7Ci0gICAgICAgIGZpZWxkSW5mb01hcC5wdXQoZmllbGRJbmZvLmdldEphdmFOYW1lKCksZmllbGRJbmZvKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRmllbGRJbmZvIGdldEZpZWxkSW5mbyhTdHJpbmcgamF2YU5hbWUpewotICAgICAgICByZXR1cm4gKEZpZWxkSW5mbykgZmllbGRJbmZvTWFwLmdldChqYXZhTmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIENsYXNzIGdldEphdmFDbGFzcygpIHsKLSAgICAgICAgcmV0dXJuIGphdmFDbGFzczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRKYXZhQ2xhc3MoQ2xhc3MgamF2YUNsYXNzKSB7Ci0gICAgICAgIHRoaXMuamF2YUNsYXNzID0gamF2YUNsYXNzOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvY29uZmlnL0ZpZWxkSW5mby5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9jb25maWcvRmllbGRJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwOTZkOTAuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9jb25maWcvRmllbGRJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLmNvbmZpZzsKLQotLyoqCi0gKiB0aGlzIGNsYXNzIGlzIHVzZWQgdG8ga2VlcCB0aGUgaW5mb3JtYXRpb24gYWJvdXQKLSAqIHRoZSBjbGFzcyBmaWxlZAotICovCi1wdWJsaWMgY2xhc3MgRmllbGRJbmZvIHsKLQotICAgIHByaXZhdGUgU3RyaW5nIGphdmFOYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIHhtbE5hbWU7Ci0gICAgLy8gc2V0IHRoZSBkZWZhdWx0IGVsZW1lbnQgdmFsdWUgdG8gdHJ1ZQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0VsZW1lbnQgPSB0cnVlOwotCi0gICAgcHVibGljIEZpZWxkSW5mbygpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRmllbGRJbmZvKFN0cmluZyBqYXZhTmFtZSkgewotICAgICAgICB0aGlzLmphdmFOYW1lID0gamF2YU5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIEZpZWxkSW5mbyhTdHJpbmcgamF2YU5hbWUsIFN0cmluZyB4bWxOYW1lLCBib29sZWFuIGVsZW1lbnQpIHsKLSAgICAgICAgdGhpcy5qYXZhTmFtZSA9IGphdmFOYW1lOwotICAgICAgICB0aGlzLnhtbE5hbWUgPSB4bWxOYW1lOwotICAgICAgICBpc0VsZW1lbnQgPSBlbGVtZW50OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SmF2YU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBqYXZhTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRKYXZhTmFtZShTdHJpbmcgamF2YU5hbWUpIHsKLSAgICAgICAgdGhpcy5qYXZhTmFtZSA9IGphdmFOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0WG1sTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHhtbE5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0WG1sTmFtZShTdHJpbmcgeG1sTmFtZSkgewotICAgICAgICB0aGlzLnhtbE5hbWUgPSB4bWxOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRWxlbWVudCgpIHsKLSAgICAgICAgcmV0dXJuIGlzRWxlbWVudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRFbGVtZW50KGJvb2xlYW4gZWxlbWVudCkgewotICAgICAgICBpc0VsZW1lbnQgPSBlbGVtZW50OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvY3VzdG9tYmVhbnMvRG9tRWxlbWVudEJlYW4uamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvY3VzdG9tYmVhbnMvRG9tRWxlbWVudEJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ2YjUwNC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL2N1c3RvbWJlYW5zL0RvbUVsZW1lbnRCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJtaS5jdXN0b21iZWFuczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmRhdGFiaW5kLkFic3RyYWN0Uk1JQmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5kYXRhYmluZC5KYXZhT2JqZWN0U2VyaWFsaXplcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5kYXRhYmluZC5YbWxTdHJlYW1QYXJzZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZXhjZXB0aW9uLlhtbFBhcnNpbmdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZXhjZXB0aW9uLlhtbFNlcmlhbGl6aW5nRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLnV0aWwuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLnV0aWwuTmFtZXNwYWNlUHJlZml4OwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtQ29uc3RhbnRzOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogdGhpcyBjbGFzcyBpcyB1c2VkIHRvIGhhbmRsZSBkb20gZWxlbWVudCByZWxhdGVkIHRoaW5ncy4KLSAqLwotCi1wdWJsaWMgY2xhc3MgRG9tRWxlbWVudEJlYW4gZXh0ZW5kcyBBYnN0cmFjdFJNSUJlYW4gewotCi0gICAgcHJpdmF0ZSBFbGVtZW50IGRvbUVsZW1lbnQ7Ci0KLSAgICBwdWJsaWMgRG9tRWxlbWVudEJlYW4oRWxlbWVudCBkb21FbGVtZW50KSB7Ci0gICAgICAgIHRoaXMuZG9tRWxlbWVudCA9IGRvbUVsZW1lbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2VyaWFsaXplKFhNTFN0cmVhbVdyaXRlciB3cml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEphdmFPYmplY3RTZXJpYWxpemVyIHNlcmlhbGl6ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lc3BhY2VQcmVmaXggbmFtZXNwYWNlUHJlZml4KQotICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgWG1sU2VyaWFsaXppbmdFeGNlcHRpb24gewotICAgICAgICAvLyBmaXJzdCB3cml0ZSB0aGUgc3RhcnQgZWxlbWVudCBmb3IgcGFyZW50Ci0gICAgICAgIHdyaXRlU3RhcnRFbGVtZW50KHdyaXRlciwKLSAgICAgICAgICAgICAgICBwYXJlbnRRTmFtZS5nZXROYW1lc3BhY2VVUkkoKSwKLSAgICAgICAgICAgICAgICBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSwKLSAgICAgICAgICAgICAgICBuYW1lc3BhY2VQcmVmaXgpOwotICAgICAgICBzZXJpYWxpemVEb21FbGVtZW50KHRoaXMuZG9tRWxlbWVudCx3cml0ZXIsbmFtZXNwYWNlUHJlZml4KTsKLSAgICAgICAgd3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotCi0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgcGFyc2UoWE1MU3RyZWFtUmVhZGVyIHJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYbWxTdHJlYW1QYXJzZXIgcGFyc2VyKQotICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgWG1sUGFyc2luZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIHRoaXMgbXVzdCBiZSBpbiB0aGUgc3RhcnQgc3RhdGUKLSAgICAgICAgd2hpbGUoIXJlYWRlci5pc1N0YXJ0RWxlbWVudCgpKXsKLSAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGRvY3VtZW50QnVpbGRlckZhY3RvcnkgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIGRvY3VtZW50QnVpbGRlckZhY3Rvcnkuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7Ci0gICAgICAgIEVsZW1lbnQgZG9tRWxlbWVudCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBEb2N1bWVudEJ1aWxkZXIgZG9jdW1lbnRCdWlsZGVyID0gZG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKLSAgICAgICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gZG9jdW1lbnRCdWlsZGVyLm5ld0RvY3VtZW50KCk7Ci0gICAgICAgICAgICAvLyBjaGVjayB3aGV0aGVyIHRoZSBlbGVtZW50IGlzIG51bGwgb3Igbm90Ci0gICAgICAgICAgICBTdHJpbmcgbmlsbGFibGUgPSByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoQ29uc3RhbnRzLlVSSV9ERUZBVUxUX1NDSEVNQV9YU0ksIm5pbCIpOwotICAgICAgICAgICAgaWYgKCJ0cnVlIi5lcXVhbHMobmlsbGFibGUpIHx8ICIxIi5lcXVhbHMobmlsbGFibGUpKXsKLSAgICAgICAgICAgICAgICB3aGlsZSghcmVhZGVyLmlzRW5kRWxlbWVudCgpKXsKLSAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgLy8gcG9pbnQgdG8gdGhlIG5leHQgZWxlbWVudAotICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgIC8vIHNpbmNlIHRoaXMgaXMgYSBkb2N1bWVudCBlbGVtZW50IHJlYWRlciBtdXN0IGJlIGF0IHRoZSBzdGFydCBlbGVtZW50IG9mIHRoZQotICAgICAgICAgICAgICAgLy8gZG9tIGRvY3VtZW50Ci0gICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkpewotICAgICAgICAgICAgICAgICAgZG9tRWxlbWVudCA9IGdldERPTUVsZW1lbnQocmVhZGVyLGRvY3VtZW50LG5ldyBIYXNoTWFwKCksbmV3IE5hbWVzcGFjZVByZWZpeCgpKTsKLSAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sUGFyc2luZ0V4Y2VwdGlvbigiRG9tIGVsZW1lbnQgaXMgbm90IHBvaW50IHRvIGEgc3RhcnQgZWxlbWVudCIpOwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBYbWxQYXJzaW5nRXhjZXB0aW9uKCJFcnJvciB3aGlsZSBjcmVhdGluZyB0aGUgZG9jdW1lbnQgZmFjdG9yeSAiLGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBkb21FbGVtZW50OwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljICBFbGVtZW50IGdldERPTUVsZW1lbnQoWE1MU3RyZWFtUmVhZGVyIHJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERvY3VtZW50IGRvY3VtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwIG5hbWVzcGFjZVRvUHJlZml4TWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZXNwYWNlUHJlZml4IG5hbWVzcGFjZVByZWZpeCkKLSAgICAgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sIFhtbFBhcnNpbmdFeGNlcHRpb24gewotICAgICAgICAvLyByZWFkZXIgbXVzdCBiZSBhdCBhIHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgd2hpbGUoIXJlYWRlci5pc1N0YXJ0RWxlbWVudCgpKXsKLSAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFuYW1lc3BhY2VUb1ByZWZpeE1hcC5jb250YWluc0tleShyZWFkZXIuZ2V0TmFtZXNwYWNlVVJJKCkpKXsKLSAgICAgICAgICAgIG5hbWVzcGFjZVRvUHJlZml4TWFwLnB1dChyZWFkZXIuZ2V0TmFtZXNwYWNlVVJJKCksCi0gICAgICAgICAgICAgICAgICAgICJucyIgKyBuYW1lc3BhY2VQcmVmaXguZ2V0TmFtZXNhcGNlUHJlZml4KCkpOwotICAgICAgICB9Ci0gICAgICAgIFFOYW1lIGVsZW1lbnRRTmFtZSA9IHJlYWRlci5nZXROYW1lKCk7Ci0gICAgICAgIFN0cmluZyBwcmVmaXggPSAoU3RyaW5nKSBuYW1lc3BhY2VUb1ByZWZpeE1hcC5nZXQocmVhZGVyLmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICAgICAgRWxlbWVudCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHJlYWRlci5nZXROYW1lc3BhY2VVUkkoKSwKLSAgICAgICAgICAgICAgICBwcmVmaXggKyAiOiIgKyByZWFkZXIuZ2V0TG9jYWxOYW1lKCkpOwotCi0gICAgICAgIC8vIHNldCB0aGUgYXR0cmlidXRlcwotICAgICAgICBBdHRyIGF0dHJpYnV0ZSA9IG51bGw7Ci0gICAgICAgIFN0cmluZyBhdHRyaWJ1dGVOYW1lc3BhY2UgPSBudWxsOwotICAgICAgICBTdHJpbmcgYXR0cmlidXRlUHJlZml4ID0gbnVsbDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZWFkZXIuZ2V0QXR0cmlidXRlQ291bnQoKTsgaSsrKSB7Ci0gICAgICAgICAgICBhdHRyaWJ1dGVOYW1lc3BhY2UgPSByZWFkZXIuZ2V0QXR0cmlidXRlTmFtZXNwYWNlKGkpOwotICAgICAgICAgICAgaWYgKChhdHRyaWJ1dGVOYW1lc3BhY2UgPT0gbnVsbCkgfHwgYXR0cmlidXRlTmFtZXNwYWNlLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICAvLyB0aGlzIGF0dHJpYnV0ZSBoYXMgbm8gbmFtZXNwYWNlCi0gICAgICAgICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUocmVhZGVyLmdldEF0dHJpYnV0ZUxvY2FsTmFtZShpKSxyZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoaSkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBhdHRyaWJ1dGVOYW1lc3BhY2UgPSByZWFkZXIuZ2V0QXR0cmlidXRlTmFtZXNwYWNlKGkpOwotICAgICAgICAgICAgICAgIGlmICghbmFtZXNwYWNlVG9QcmVmaXhNYXAuY29udGFpbnNLZXkoYXR0cmlidXRlTmFtZXNwYWNlKSkgewotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VUb1ByZWZpeE1hcC5wdXQoYXR0cmlidXRlTmFtZXNwYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJucyIgKyBuYW1lc3BhY2VQcmVmaXguZ2V0TmFtZXNhcGNlUHJlZml4KCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBhdHRyaWJ1dGVQcmVmaXggPSAoU3RyaW5nKSBuYW1lc3BhY2VUb1ByZWZpeE1hcC5nZXQoYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZU5TKGF0dHJpYnV0ZU5hbWVzcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVByZWZpeCArICI6IiArIHJlYWRlci5nZXRBdHRyaWJ1dGVMb2NhbE5hbWUoaSksCi0gICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoaSkpOwotCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgaW50IHN0YXRlOwotICAgICAgICAvLyBhdCB0aGUgZW5kIHdlIGhhdmUgdG8gcG9pbnQgdGhlIHJlYWRlciB0byBlbmQgb2YgdGhpcyBlbGVtZW50LgotICAgICAgICB3aGlsZSAoIXJlYWRlci5pc0VuZEVsZW1lbnQoKSB8fCAhcmVhZGVyLmdldE5hbWUoKS5lcXVhbHMoZWxlbWVudFFOYW1lKSkgewotICAgICAgICAgICAgc3RhdGUgPSByZWFkZXIuZ2V0RXZlbnRUeXBlKCk7Ci0gICAgICAgICAgICBpZiAoc3RhdGUgPT0gWE1MU3RyZWFtQ29uc3RhbnRzLlNUQVJUX0VMRU1FTlQpIHsKLSAgICAgICAgICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxkKGdldERPTUVsZW1lbnQocmVhZGVyLCBkb2N1bWVudCwgbmFtZXNwYWNlVG9QcmVmaXhNYXAsIG5hbWVzcGFjZVByZWZpeCkpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PSBYTUxTdHJlYW1Db25zdGFudHMuQ0hBUkFDVEVSUykgewotICAgICAgICAgICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUocmVhZGVyLmdldFRleHQoKSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZWxlbWVudDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2VyaWFsaXplRG9tRWxlbWVudChFbGVtZW50IGRvbUVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MU3RyZWFtV3JpdGVyIHdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lc3BhY2VQcmVmaXggbmFtZXNwYWNlUHJlZml4KSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uLCBYbWxTZXJpYWxpemluZ0V4Y2VwdGlvbiB7Ci0KLSAgICAgICAgLy8gZmlyc3Qgd3JpdGUgdGhlIHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgd3JpdGVTdGFydEVsZW1lbnQod3JpdGVyLGRvbUVsZW1lbnQuZ2V0TmFtZXNwYWNlVVJJKCksZG9tRWxlbWVudC5nZXRMb2NhbE5hbWUoKSxuYW1lc3BhY2VQcmVmaXgpOwotICAgICAgICAvLyB3cml0ZSB0aGUgYXR0cmlidXRlcyB3cml0ZXIgbm93IGF0IHRoZSBzdGFydCBlbGVtZW50Ci0gICAgICAgIE5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzID0gZG9tRWxlbWVudC5nZXRBdHRyaWJ1dGVzKCk7Ci0gICAgICAgIEF0dHIgYXR0cmlidXRlOwotICAgICAgICBRTmFtZSBhdHRyaWJ1dGVRTmFtZTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzLmdldExlbmd0aCgpOyBpKyspIHsKLSAgICAgICAgICAgIGF0dHJpYnV0ZSA9IChBdHRyKSBhdHRyaWJ1dGVzLml0ZW0oaSk7Ci0gICAgICAgICAgICBhdHRyaWJ1dGVRTmFtZSA9IG5ldyBRTmFtZShhdHRyaWJ1dGUuZ2V0TmFtZXNwYWNlVVJJKCksIGF0dHJpYnV0ZS5nZXROYW1lKCkpOwotICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUod3JpdGVyLCBhdHRyaWJ1dGUuZ2V0VmFsdWUoKSwgYXR0cmlidXRlUU5hbWUsIG5hbWVzcGFjZVByZWZpeCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyB3cml0ZSB0aGUgb3RoZXIgY2hpbGRyZW4KLSAgICAgICAgTm9kZUxpc3Qgbm9kZUxpc3QgPSBkb21FbGVtZW50LmdldENoaWxkTm9kZXMoKTsKLSAgICAgICAgTm9kZSBub2RlOwotICAgICAgICBUZXh0IHRleHROb2RlOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5vZGVMaXN0LmdldExlbmd0aCgpOyBpKyspIHsKLSAgICAgICAgICAgIG5vZGUgPSBub2RlTGlzdC5pdGVtKGkpOwotICAgICAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0gICAgICAgICAgICAgICAgLy8gd3JpdGUgdGhlIGVsZW1lbnQKLSAgICAgICAgICAgICAgICBzZXJpYWxpemVEb21FbGVtZW50KChFbGVtZW50KSBub2RlLCB3cml0ZXIsIG5hbWVzcGFjZVByZWZpeCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBUZXh0KSB7Ci0gICAgICAgICAgICAgICAgdGV4dE5vZGUgPSAoVGV4dCkgbm9kZTsKLSAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVDaGFyYWN0ZXJzKHRleHROb2RlLmdldE5vZGVWYWx1ZSgpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFNlcmlhbGl6aW5nRXhjZXB0aW9uKCJVbmtub3duIGRvbSBlbGVtZW50IG5vZGUgZm91bmQgbm9kZSB0eXBlID09PiIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgbm9kZS5nZXROb2RlVHlwZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB3cml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kYXRhYmluZC9BYnN0cmFjdFJNSUJlYW4uamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvQWJzdHJhY3RSTUlCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4OGVkMWIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kYXRhYmluZC9BYnN0cmFjdFJNSUJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLmRhdGFiaW5kOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZXhjZXB0aW9uLlhtbFNlcmlhbGl6aW5nRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLnV0aWwuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLnV0aWwuTmFtZXNwYWNlUHJlZml4OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlcjsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RSTUlCZWFuIGltcGxlbWVudHMgUk1JQmVhbiB7Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXJpYWxpemUoWE1MU3RyZWFtV3JpdGVyIHdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSmF2YU9iamVjdFNlcmlhbGl6ZXIgc2VyaWFsaXplciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWVzcGFjZVByZWZpeCBuYW1lc3BhY2VQcmVmaXgpCi0gICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uLCBYbWxTZXJpYWxpemluZ0V4Y2VwdGlvbjsKLQotICAgIHByb3RlY3RlZCB2b2lkIHdyaXRlU3RhcnRFbGVtZW50KFhNTFN0cmVhbVdyaXRlciB3cml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWVzcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbG9jYWxQYXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWVzcGFjZVByZWZpeCBuYW1lc3BhY2VQcmVmaXgpCi0gICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFuYW1lc3BhY2UuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgU3RyaW5nIHByZWZpeCA9IHdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHByZWZpeCA9ICJucyIgKyBuYW1lc3BhY2VQcmVmaXguZ2V0TmFtZXNhcGNlUHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHByZWZpeCwgbG9jYWxQYXJ0LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgd3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChuYW1lc3BhY2UsIGxvY2FsUGFydCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB3cml0ZXIud3JpdGVTdGFydEVsZW1lbnQobG9jYWxQYXJ0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHdyaXRlVHlwZUF0dHJpYnV0ZShYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRTmFtZSB0eXBlUW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWVzcGFjZVByZWZpeCBuYW1lc3BhY2VQcmVmaXgpCi0gICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHhzaVByZWZpeCA9IHdyaXRlci5nZXRQcmVmaXgoQ29uc3RhbnRzLlVSSV9ERUZBVUxUX1NDSEVNQV9YU0kpOwotICAgICAgICBpZiAoeHNpUHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgIHhzaVByZWZpeCA9ICJucyIgKyBuYW1lc3BhY2VQcmVmaXguZ2V0TmFtZXNhcGNlUHJlZml4KCk7Ci0gICAgICAgICAgICB3cml0ZXIud3JpdGVOYW1lc3BhY2UoeHNpUHJlZml4LCBDb25zdGFudHMuVVJJX0RFRkFVTFRfU0NIRU1BX1hTSSk7Ci0gICAgICAgICAgICB3cml0ZXIuc2V0UHJlZml4KHhzaVByZWZpeCwgQ29uc3RhbnRzLlVSSV9ERUZBVUxUX1NDSEVNQV9YU0kpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIHR5cGVQcmVmaXggPSB3cml0ZXIuZ2V0UHJlZml4KHR5cGVRbmFtZS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgIGlmICh0eXBlUHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgIHR5cGVQcmVmaXggPSAibnMiICsgbmFtZXNwYWNlUHJlZml4LmdldE5hbWVzYXBjZVByZWZpeCgpOwotICAgICAgICAgICAgd3JpdGVyLndyaXRlTmFtZXNwYWNlKHR5cGVQcmVmaXgsIHR5cGVRbmFtZS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgICAgICB3cml0ZXIuc2V0UHJlZml4KHR5cGVQcmVmaXgsIHR5cGVRbmFtZS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgYXR0cmlidXRlVmFsdWUgPSB0eXBlUW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgIGlmICghdHlwZVByZWZpeC5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IHR5cGVQcmVmaXggKyAiOiIgKyBhdHRyaWJ1dGVWYWx1ZTsKLSAgICAgICAgfQotICAgICAgICB3cml0ZXIud3JpdGVBdHRyaWJ1dGUoQ29uc3RhbnRzLlVSSV9ERUZBVUxUX1NDSEVNQV9YU0ksICJ0eXBlIiwgYXR0cmlidXRlVmFsdWUpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHdyaXRlTnVsbEF0dHJpYnV0ZShYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lc3BhY2VQcmVmaXggbmFtZXNwYWNlUHJlZml4KQotICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIFFOYW1lIGF0dHJpYnV0ZVFOYW1lID0gbmV3IFFOYW1lKENvbnN0YW50cy5VUklfREVGQVVMVF9TQ0hFTUFfWFNJLCAibmlsIik7Ci0gICAgICAgIHdyaXRlQXR0cmlidXRlKHdyaXRlciwgIjEiLCBhdHRyaWJ1dGVRTmFtZSwgbmFtZXNwYWNlUHJlZml4KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB0aGlzIG1ldGhvZCB3cnRlcyB0aGUgc2ltcGxlIGF0dHJpYnV0ZSB0byB0aGUgd3JpdGVyLgotICAgICAqCi0gICAgICogQHBhcmFtIHdyaXRlcgotICAgICAqIEBwYXJhbSBhdHRyaWJ1dGVWYWx1ZQotICAgICAqIEBwYXJhbSBhdHRyaWJ1dGVRTmFtZQotICAgICAqIEBwYXJhbSBuYW1lc3BhY2VQcmVmaXgKLSAgICAgKiBAdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHdyaXRlQXR0cmlidXRlKFhNTFN0cmVhbVdyaXRlciB3cml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZVZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFOYW1lIGF0dHJpYnV0ZVFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWVzcGFjZVByZWZpeCBuYW1lc3BhY2VQcmVmaXgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBpZiAoKGF0dHJpYnV0ZVFOYW1lLmdldE5hbWVzcGFjZVVSSSgpICE9IG51bGwpICYmICFhdHRyaWJ1dGVRTmFtZS5nZXROYW1lc3BhY2VVUkkoKS50cmltKCkuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgU3RyaW5nIHByZWZpeCA9IHdyaXRlci5nZXRQcmVmaXgoYXR0cmlidXRlUU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcHJlZml4ID0gIm5zIiArIG5hbWVzcGFjZVByZWZpeC5nZXROYW1lc2FwY2VQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBhdHRyaWJ1dGVRTmFtZS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgICAgICAgICAgd3JpdGVyLnNldFByZWZpeChwcmVmaXgsIGF0dHJpYnV0ZVFOYW1lLmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHRyaWJ1dGVRTmFtZS5nZXROYW1lc3BhY2VVUkkoKSwKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlUU5hbWUuZ2V0TG9jYWxQYXJ0KCksCi0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlKTsKLQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgd3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dHJpYnV0ZVFOYW1lLmdldExvY2FsUGFydCgpLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB3cml0ZUF0dHJpYnV0ZShYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFOYW1lIGF0dHJpYnV0ZVZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFOYW1lIGF0dHJpYnV0ZVFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWVzcGFjZVByZWZpeCBuYW1lc3BhY2VQcmVmaXgpCi0gICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICBTdHJpbmcgYXR0cmlidXRlU3RyaW5nVmF1bGUgPSBhdHRyaWJ1dGVWYWx1ZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgaWYgKChhdHRyaWJ1dGVWYWx1ZS5nZXROYW1lc3BhY2VVUkkoKSAhPSBudWxsKSAmJiAoYXR0cmlidXRlVmFsdWUuZ2V0TmFtZXNwYWNlVVJJKCkudHJpbSgpLmVxdWFscygiIikpKXsKLSAgICAgICAgICAgIC8vIGkuZS4gdGhpcyBpcyBhIHFuYW1lCi0gICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gd3JpdGVyLmdldFByZWZpeChhdHRyaWJ1dGVWYWx1ZS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpewotICAgICAgICAgICAgICAgIHByZWZpeCA9ICJucyIgKyBuYW1lc3BhY2VQcmVmaXguZ2V0TmFtZXNhcGNlUHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCxhdHRyaWJ1dGVWYWx1ZS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgICAgICAgICAgd3JpdGVyLnNldFByZWZpeChwcmVmaXgsYXR0cmlidXRlVmFsdWUuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICBpZiAoISIiLmVxdWFscyhwcmVmaXgpKXsKLSAgICAgICAgICAgICAgYXR0cmlidXRlU3RyaW5nVmF1bGUgPSBwcmVmaXggKyAiOiIgKyBhdHRyaWJ1dGVTdHJpbmdWYXVsZTsKLSAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKChhdHRyaWJ1dGVRTmFtZS5nZXROYW1lc3BhY2VVUkkoKSAhPSBudWxsKSAmJiAhYXR0cmlidXRlUU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkudHJpbSgpLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSB3cml0ZXIuZ2V0UHJlZml4KGF0dHJpYnV0ZVFOYW1lLmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHByZWZpeCA9ICJucyIgKyBuYW1lc3BhY2VQcmVmaXguZ2V0TmFtZXNhcGNlUHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgYXR0cmlidXRlUU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgICAgICAgICAgICAgIHdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBhdHRyaWJ1dGVRTmFtZS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB3cml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0cmlidXRlUU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCksCi0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVFOYW1lLmdldExvY2FsUGFydCgpLAotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVTdHJpbmdWYXVsZSk7Ci0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHRyaWJ1dGVRTmFtZS5nZXRMb2NhbFBhcnQoKSwgYXR0cmlidXRlU3RyaW5nVmF1bGUpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kYXRhYmluZC9KYXZhT2JqZWN0U2VyaWFsaXplci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kYXRhYmluZC9KYXZhT2JqZWN0U2VyaWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiN2IyMDVkLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvSmF2YU9iamVjdFNlcmlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLmRhdGFiaW5kOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmV4Y2VwdGlvbi5NZXRhRGF0YVBvcHVsYXRlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmV4Y2VwdGlvbi5TY2hlbWFHZW5lcmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmV4Y2VwdGlvbi5YbWxTZXJpYWxpemluZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS5BdHRyaWJ1dGVGaWVsZDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS5FbGVtZW50RmllbGQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEuUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLm1ldGFkYXRhLlR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEuaW1wbC5UeXBlSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS54bWwuWG1sRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS50eXBlcy5NYXBUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLnV0aWwuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLnV0aWwuTmFtZXNwYWNlUHJlZml4OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5BcnJheTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiB0aGlzIGNsYXNzIHNlcmlhbGl6ZXMgYSBnaXZlbiBqYXZhIG9iamVjdCB3aXRoIGl0cyBjb3JyZXNwb25kaW5nCi0gKiB0eXBlIG9iamVjdAotICovCi1wdWJsaWMgY2xhc3MgSmF2YU9iamVjdFNlcmlhbGl6ZXIgewotCi0gICAgcHJpdmF0ZSBNYXAgcHJvY2Vzc2VkVHlwZU1hcDsKLSAgICBwcml2YXRlIENvbmZpZ3VyYXRvciBjb25maWd1cmF0b3I7Ci0gICAgcHJpdmF0ZSBNYXAgc2NoZW1hTWFwOwotICAgIHByaXZhdGUgU2ltcGxlVHlwZUhhbmRsZXIgc2ltcGxlVHlwZUhhbmRsZXI7Ci0gICAgcHJpdmF0ZSBDbGFzcyBzaW1wbGVUeXBlSGFuZGxlckNsYXNzOwotCi0gICAgcHVibGljIEphdmFPYmplY3RTZXJpYWxpemVyKE1hcCBwcm9jZXNzZWRUeXBlTWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0b3IgY29uZmlndXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXAgc2NoZW1hTWFwKSB7Ci0gICAgICAgIHRoaXMucHJvY2Vzc2VkVHlwZU1hcCA9IHByb2Nlc3NlZFR5cGVNYXA7Ci0gICAgICAgIHRoaXMuY29uZmlndXJhdG9yID0gY29uZmlndXJhdG9yOwotICAgICAgICB0aGlzLnNjaGVtYU1hcCA9IHNjaGVtYU1hcDsKLSAgICAgICAgdGhpcy5zaW1wbGVUeXBlSGFuZGxlciA9IHRoaXMuY29uZmlndXJhdG9yLmdldFNpbXBsZVR5cGVIYW5kbGVyKCk7Ci0gICAgICAgIHRoaXMuc2ltcGxlVHlwZUhhbmRsZXJDbGFzcyA9IHRoaXMuc2ltcGxlVHlwZUhhbmRsZXIuZ2V0Q2xhc3MoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBzZXJpYWxpemUgYWxsIHRoZSBpbnB1dCBwYXJhbWV0ZXJzCi0gICAgICogQHBhcmFtIG9iamVjdHMKLSAgICAgKiBAcGFyYW0gaW5wdXRYbWxFbGVtZW50Ci0gICAgICogQHBhcmFtIGlucHV0UGFyYW1ldGVycwotICAgICAqIEBwYXJhbSB3cml0ZXIKLSAgICAgKiBAdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgWG1sU2VyaWFsaXppbmdFeGNlcHRpb24KLSAgICAgKi8KLQotICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZUlucHV0RWxlbWVudChPYmplY3RbXSBvYmplY3RzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYbWxFbGVtZW50IGlucHV0WG1sRWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdCBpbnB1dFBhcmFtZXRlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTFN0cmVhbVdyaXRlciB3cml0ZXIpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sCi0gICAgICAgICAgICBYbWxTZXJpYWxpemluZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIE5hbWVzcGFjZVByZWZpeCBuYW1lc3BhY2VQcmVmaXggPSBuZXcgTmFtZXNwYWNlUHJlZml4KCk7Ci0gICAgICAgIHdyaXRlU3RhcnRFbGVtZW50KHdyaXRlciwKLSAgICAgICAgICAgICAgICBpbnB1dFhtbEVsZW1lbnQuZ2V0TmFtZXNwYWNlKCksCi0gICAgICAgICAgICAgICAgaW5wdXRYbWxFbGVtZW50LmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICBuYW1lc3BhY2VQcmVmaXgpOwotICAgICAgICAvLyBpbnB1dCBvYmplY3RzIG51bGwgbWVhbnMgbm8gcGFyYW1ldGVycwotICAgICAgICBpZiAob2JqZWN0cyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG9iamVjdHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBzZXJpYWxpemVQYXJhbWV0ZXIob2JqZWN0c1tpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChQYXJhbWV0ZXIpIGlucHV0UGFyYW1ldGVycy5nZXQoaSksCi0gICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VQcmVmaXgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgd3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHNlcmlhbGl6ZSB0aGUgb3V0IHB1dCBwYXJhbWV0ZXIKLSAgICAgKiBAcGFyYW0gb2JqZWN0Ci0gICAgICogQHBhcmFtIG91dHB1dFhtbEVsZW1lbnQKLSAgICAgKiBAcGFyYW0gb3V0cHV0UGFyYW1ldGVyCi0gICAgICogQHBhcmFtIHdyaXRlcgotICAgICAqIEB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBYbWxTZXJpYWxpemluZ0V4Y2VwdGlvbgotICAgICAqLwotCi0gICAgcHVibGljIHZvaWQgc2VyaWFsaXplT3V0cHV0RWxlbWVudChPYmplY3Qgb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWG1sRWxlbWVudCBvdXRwdXRYbWxFbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1ldGVyIG91dHB1dFBhcmFtZXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTFN0cmVhbVdyaXRlciB3cml0ZXIpCi0gICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uLCBYbWxTZXJpYWxpemluZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIE5hbWVzcGFjZVByZWZpeCBuYW1lc3BhY2VQcmVmaXggPSBuZXcgTmFtZXNwYWNlUHJlZml4KCk7Ci0gICAgICAgIC8vd3JpdGUgb3V0cHV0IHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgd3JpdGVTdGFydEVsZW1lbnQod3JpdGVyLAotICAgICAgICAgICAgICAgIG91dHB1dFhtbEVsZW1lbnQuZ2V0TmFtZXNwYWNlKCksCi0gICAgICAgICAgICAgICAgb3V0cHV0WG1sRWxlbWVudC5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgbmFtZXNwYWNlUHJlZml4KTsKLSAgICAgICAgaWYgKG91dHB1dFBhcmFtZXRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBudWxsIG1lYW5zIHRoaXMgaXMgdGhlIHZvaWQgdHlwZQotICAgICAgICAgICAgc2VyaWFsaXplUGFyYW1ldGVyKG9iamVjdCwgb3V0cHV0UGFyYW1ldGVyLCB3cml0ZXIsIG5hbWVzcGFjZVByZWZpeCk7Ci0gICAgICAgIH0KLSAgICAgICAgd3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHNlcmFpbGl6ZSB0aGUgcGFyYW1ldGVyIG9iamVjdC4gcGFyYW1ldGVyIHJlcHJlc2VudHMgYW4geG1sIGVsZW1lbnQuCi0gICAgICogc28gaXQgYmFzaWNhbGx5IGNhbGxzIHRvIHRoZSBzZXJpYWxpemUgZWxlbWVudCBtZXRob2QuCi0gICAgICogQHBhcmFtIHBhcmFtZXRlclZhbHVlCi0gICAgICogQHBhcmFtIHBhcmFtZXRlcgotICAgICAqIEBwYXJhbSB3cml0ZXIKLSAgICAgKiBAcGFyYW0gbmFtZXNwYWNlUHJlZml4Ci0gICAgICogQHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIFhtbFNlcmlhbGl6aW5nRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2VyaWFsaXplUGFyYW1ldGVyKE9iamVjdCBwYXJhbWV0ZXJWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1ldGVyIHBhcmFtZXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MU3RyZWFtV3JpdGVyIHdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZXNwYWNlUHJlZml4IG5hbWVzcGFjZVByZWZpeCkKLSAgICAgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sCi0gICAgICAgICAgICBYbWxTZXJpYWxpemluZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIFFOYW1lIHBhcmFtZXRlclFOYW1lID0gbmV3IFFOYW1lKHBhcmFtZXRlci5nZXROYW1lc3BhY2UoKSwgcGFyYW1ldGVyLmdldE5hbWUoKSk7Ci0gICAgICAgIHNlcmlhbGl6ZUVsZW1lbnQocGFyYW1ldGVyVmFsdWUsCi0gICAgICAgICAgICAgICAgcGFyYW1ldGVyUU5hbWUsCi0gICAgICAgICAgICAgICAgcGFyYW1ldGVyLmdldFR5cGUoKSwKLSAgICAgICAgICAgICAgICB3cml0ZXIsCi0gICAgICAgICAgICAgICAgbmFtZXNwYWNlUHJlZml4LAotICAgICAgICAgICAgICAgIHBhcmFtZXRlci5pc0FycmF5KCksCi0gICAgICAgICAgICAgICAgcGFyYW1ldGVyLmdldENsYXNzVHlwZSgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBzZXJhaWxpemVzIGFuIGVsZW1lbnQuIGVsZW1lbnRzIGNhbiBlaXRoZXIgYmUgcGFyYW1ldGVyIG9yIGFuIGF0dHJpYnV0ZS4KLSAgICAgKiBAcGFyYW0gZWxlbWVudFZhbHVlCi0gICAgICogQHBhcmFtIGVsZW1lbnRRTmFtZQotICAgICAqIEBwYXJhbSBlbGVtZW50VHlwZQotICAgICAqIEBwYXJhbSB3cml0ZXIKLSAgICAgKiBAcGFyYW0gbmFtZXNwYWNlUHJlZml4Ci0gICAgICogQHBhcmFtIGlzQXJyYXkKLSAgICAgKiBAcGFyYW0gY2xhc3NUeXBlCi0gICAgICogQHRocm93cyBYbWxTZXJpYWxpemluZ0V4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uCi0gICAgICovCi0KLSAgICBwcml2YXRlIHZvaWQgc2VyaWFsaXplRWxlbWVudChPYmplY3QgZWxlbWVudFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFOYW1lIGVsZW1lbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlIGVsZW1lbnRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTFN0cmVhbVdyaXRlciB3cml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZXNwYWNlUHJlZml4IG5hbWVzcGFjZVByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzQXJyYXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsYXNzVHlwZSkKLSAgICAgICAgICAgIHRocm93cyBYbWxTZXJpYWxpemluZ0V4Y2VwdGlvbiwgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKChlbGVtZW50VmFsdWUgPT0gbnVsbCkgfHwgIWlzQXJyYXkpIHsKLSAgICAgICAgICAgIC8vIHRoZW4gd2UgY2FuIHNlcmlhbGl6ZUlucHV0RWxlbWVudCBpdCBkaXJlY3RseSBlaXRoZXIgaXQgaXMgYXJyYXkgb3Igbm90Ci0gICAgICAgICAgICBzZXJpYWxpemUoZWxlbWVudFZhbHVlLAotICAgICAgICAgICAgICAgICAgICBlbGVtZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRUeXBlLAotICAgICAgICAgICAgICAgICAgICB3cml0ZXIsCi0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVByZWZpeCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0KLSAgICAgICAgICAgIGlmICgoY2xhc3NUeXBlICYgQ29uc3RhbnRzLk1BUF9UWVBFKSA9PSBDb25zdGFudHMuTUFQX1RZUEUpIHsKLSAgICAgICAgICAgICAgICBNYXAgZWxlbWVudE1hcCA9IChNYXApIGVsZW1lbnRWYWx1ZTsKLSAgICAgICAgICAgICAgICBPYmplY3Qga2V5ID0gbnVsbDsKLSAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50TWFwLmtleVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgICAgICBrZXkgPSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplKG5ldyBNYXBUeXBlKGtleSwgZWxlbWVudE1hcC5nZXQoa2V5KSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VQcmVmaXgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoKGNsYXNzVHlwZSAmIENvbnN0YW50cy5DT0xMRUNUSU9OX1RZUEUpID09IENvbnN0YW50cy5DT0xMRUNUSU9OX1RZUEUpIHsKLSAgICAgICAgICAgICAgICAvLyBpZiB0aGlzIGlzIGEgTGlzdCB3ZSBjb252ZXJ0IHRoaXMgdG8gYW4gT2JqZWN0IGFycmF5Ci0gICAgICAgICAgICAgICAgQ29sbGVjdGlvbiBlbGVtZW50Q29sbGVjdGlvbiA9IChDb2xsZWN0aW9uKSBlbGVtZW50VmFsdWU7Ci0gICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudENvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZShpdGVyLm5leHQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVByZWZpeCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoID0gQXJyYXkuZ2V0TGVuZ3RoKGVsZW1lbnRWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IG9iamVjdDsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9iamVjdCA9IEFycmF5LmdldChlbGVtZW50VmFsdWUsIGkpOwotICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemUob2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlUHJlZml4KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIHRoaXMgbWV0aG9kIHNlcmFpbGl6ZXMgdGhlIGdpdmVuIG9iamVjdCBhY2NvcmRpbmcgdG8gdGhlIHR5cGUgaW5mb3JtYXRpb24KLSAgICAgKiBnaXZlbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvYmplY3QKLSAgICAgKiBAcGFyYW0gdHlwZQotICAgICAqIEBwYXJhbSB3cml0ZXIKLSAgICAgKi8KLQotICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShPYmplY3Qgb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBRTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lc3BhY2VQcmVmaXggbmFtZXNwYWNlUHJlZml4KQotICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwKLSAgICAgICAgICAgIFhtbFNlcmlhbGl6aW5nRXhjZXB0aW9uIHsKLQotICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgUk1JQmVhbikgewotICAgICAgICAgICAgUk1JQmVhbiBybWlCZWFuID0gKFJNSUJlYW4pIG9iamVjdDsKLSAgICAgICAgICAgIHJtaUJlYW4uc2VyaWFsaXplKHdyaXRlciwgdGhpcywgcGFyZW50UU5hbWUsIG5hbWVzcGFjZVByZWZpeCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBmaXJzdCB3cml0ZSB0aGUgc3RhcnQgZWxlbWVudAotICAgICAgICAgICAgd3JpdGVTdGFydEVsZW1lbnQod3JpdGVyLAotICAgICAgICAgICAgICAgICAgICBwYXJlbnRRTmFtZS5nZXROYW1lc3BhY2VVUkkoKSwKLSAgICAgICAgICAgICAgICAgICAgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCksCi0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVByZWZpeCk7Ci0gICAgICAgICAgICBpZiAob2JqZWN0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB3cml0ZU51bGxBdHRyaWJ1dGUod3JpdGVyLCBuYW1lc3BhY2VQcmVmaXgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBoYW5kbGUgZXh0ZW5zaW9ucyBoZXJlLgotICAgICAgICAgICAgICAgIC8vIHByaW1pdGl2ZSBjYW4gbm90IGhhdmUgZXhjZW50ZWQgdHlwZXMKLSAgICAgICAgICAgICAgICBpZiAoIW9iamVjdC5nZXRDbGFzcygpLmVxdWFscyh0eXBlLmdldEphdmFDbGFzcygpKSAmJiAhdHlwZS5nZXRKYXZhQ2xhc3MoKS5pc1ByaW1pdGl2ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGkuZSB0aGlzIGlzIGFuIGV4dGVuc2lvbgotICAgICAgICAgICAgICAgICAgICBpZiAoIXByb2Nlc3NlZFR5cGVNYXAuY29udGFpbnNLZXkob2JqZWN0LmdldENsYXNzKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBUeXBlIG5ld1R5cGUgPSBuZXcgVHlwZUltcGwob2JqZWN0LmdldENsYXNzKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2VkVHlwZU1hcC5wdXQob2JqZWN0LmdldENsYXNzKCksIG5ld1R5cGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdUeXBlLnBvcHVsYXRlTWV0YURhdGEodGhpcy5jb25maWd1cmF0b3IsIHRoaXMucHJvY2Vzc2VkVHlwZU1hcCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3VHlwZS5nZW5lcmF0ZVNjaGVtYSh0aGlzLmNvbmZpZ3VyYXRvciwgdGhpcy5zY2hlbWFNYXApOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoTWV0YURhdGFQb3B1bGF0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhtbFNlcmlhbGl6aW5nRXhjZXB0aW9uKCJQcm9ibGVtIGluIHByb2Nlc3NpbmcgbmV3IHR5cGUiLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYbWxTZXJpYWxpemluZ0V4Y2VwdGlvbigiUHJvYmxlbSBpbiBwcm9jZXNzaW5nIG5ldyB0eXBlIiwgZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgdHlwZSA9IChUeXBlKSBwcm9jZXNzZWRUeXBlTWFwLmdldChvYmplY3QuZ2V0Q2xhc3MoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHdyaXRlVHlwZUF0dHJpYnV0ZSh3cml0ZXIsIHR5cGUuZ2V0WG1sVHlwZSgpLmdldFFuYW1lKCksIG5hbWVzcGFjZVByZWZpeCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHR5cGUuZ2V0WG1sVHlwZSgpLmlzU2ltcGxlVHlwZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgYSBrbm93IHR5cGUgZm9yIHVzCi0gICAgICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgc3RyaW5nIHJlcHJlc2VuYXRpb24gb2YgdGhpcyBvYmplY3QgdXNpbmcgY29udmVydGVyIHV0aWwgY2xhc3MuCi0gICAgICAgICAgICAgICAgICAgIGlmICghdHlwZS5nZXRKYXZhQ2xhc3MoKS5lcXVhbHMoT2JqZWN0LmNsYXNzKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlQ2hhcmFjdGVycyhnZXRTaW1wbGVUeXBlU3RyaW5nVmFsdWUodHlwZSwgb2JqZWN0KSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgYSBjb21wbGV4IHR5cGUKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlRmllbGQgYXR0cmlidXRlRmllbGQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNZXRob2QgZ2V0dGVyTWV0aG9kOwotICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGF0dHJpYnV0ZUZpZWxkVmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBRTmFtZSBhdHRyaWJ1dGVRTmFtZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHR5cGUuZ2V0QWxsQXR0cmlidXRlRmllbGRzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlRmllbGQgPSAoQXR0cmlidXRlRmllbGQpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldHRlck1ldGhvZCA9IGF0dHJpYnV0ZUZpZWxkLmdldEdldHRlck1ldGhvZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZUZpZWxkVmFsdWUgPSBnZXR0ZXJNZXRob2QuaW52b2tlKG9iamVjdCwgbmV3IE9iamVjdFtde30pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVFOYW1lID0gbmV3IFFOYW1lKGF0dHJpYnV0ZUZpZWxkLmdldE5hbWVzcGFjZSgpLCBhdHRyaWJ1dGVGaWVsZC5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbGxzIHRvIHdyaXRlIGF0dHJpYnV0ZS4gZm9yIGF0dHJpYnV0ZXMgd2UgY2FuIGhhdmUgb25seSBzaW1wbGUgdHlwZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlRmllbGRWYWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKHdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRTaW1wbGVUeXBlU3RyaW5nVmFsdWUoYXR0cmlidXRlRmllbGQuZ2V0VHlwZSgpLCBhdHRyaWJ1dGVGaWVsZFZhbHVlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VQcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYXR0cmlidXRlRmllbGQuaXNSZXF1cmllZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBYbWxTZXJpYWxpemluZ0V4Y2VwdGlvbigiQXR0cmlidXRlIHZhbHVlIGZvciBhdHRyaWJ1dGUgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgYXR0cmlidXRlRmllbGQuZ2V0TmFtZSgpICsgIiBpcyByZXF1aXJlZCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZSB0aGUgZWxlbWVudCBmaWVsZHMKLSAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnRGaWVsZCBlbGVtZW50RmllbGQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgZWxlbWVudEZpZWxkVmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0eXBlLmdldEFsbEVsZW1lbnRGaWVsZHMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50RmllbGQgPSAoRWxlbWVudEZpZWxkKSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXR0ZXJNZXRob2QgPSBlbGVtZW50RmllbGQuZ2V0R2V0dGVyTWV0aG9kKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudEZpZWxkVmFsdWUgPSBnZXR0ZXJNZXRob2QuaW52b2tlKG9iamVjdCwgbmV3IE9iamVjdFtde30pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZUVsZW1lbnRGaWVsZChlbGVtZW50RmllbGRWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRGaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVByZWZpeCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sU2VyaWFsaXppbmdFeGNlcHRpb24oInByb2JsZW0gd2l0aCBtZXRob2QgaW5vdm9jYXRpb24gIiArIHR5cGUuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sU2VyaWFsaXppbmdFeGNlcHRpb24oInByb2JsZW0gd2l0aCBtZXRob2QgaW5vdm9jYXRpb24gIiArIHR5cGUuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgd3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0U2ltcGxlVHlwZVN0cmluZ1ZhbHVlKFR5cGUgdHlwZSwgT2JqZWN0IG9iamVjdCkgdGhyb3dzIFhtbFNlcmlhbGl6aW5nRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE1ldGhvZCBtZXRob2RUb0ludm9rZSA9IHRoaXMuc2ltcGxlVHlwZUhhbmRsZXJDbGFzcy5nZXRNZXRob2QoImNvbnZlcnRUb1N0cmluZyIsIG5ldyBDbGFzc1tde3R5cGUuZ2V0SmF2YUNsYXNzKCl9KTsKLSAgICAgICAgICAgIC8vIHRoZXNlIG1ldGhvZHMgYXJlIHN0YXRpYyBzbyB1c2UgbnVsbCBhcyB0aGUgb2JqZWN0IGFyZ3VtZW50Ci0gICAgICAgICAgICByZXR1cm4gKFN0cmluZykgbWV0aG9kVG9JbnZva2UuaW52b2tlKHRoaXMuc2ltcGxlVHlwZUhhbmRsZXIsIG5ldyBPYmplY3RbXXtvYmplY3R9KTsKLSAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBYbWxTZXJpYWxpemluZ0V4Y2VwdGlvbigiQ2FuIG5vdCBpbnZva2UgY29udmVydGVyIHV0aWwgbWV0aG9kIGNvbnZlcnRUb1N0cmluZyBmb3IgY2xhc3MgIgotICAgICAgICAgICAgICAgICAgICArIHR5cGUuZ2V0SmF2YUNsYXNzKCkuZ2V0TmFtZSgpLCBlKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgWG1sU2VyaWFsaXppbmdFeGNlcHRpb24oIkNhbiBub3QgaW52b2tlIGNvbnZlcnRlciB1dGlsIG1ldGhvZCBjb252ZXJ0VG9TdHJpbmcgZm9yIGNsYXNzICIKLSAgICAgICAgICAgICAgICAgICAgKyB0eXBlLmdldEphdmFDbGFzcygpLmdldE5hbWUoKSwgZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFNlcmlhbGl6aW5nRXhjZXB0aW9uKCJDYW4gbm90IGludm9rZSBjb252ZXJ0ZXIgdXRpbCBtZXRob2QgY29udmVydFRvU3RyaW5nIGZvciBjbGFzcyAiCi0gICAgICAgICAgICAgICAgICAgICsgdHlwZS5nZXRKYXZhQ2xhc3MoKS5nZXROYW1lKCksIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogdGhpcyBtZXRob2Qgc2VyaWFsaXplcyB0aGUgYXR0cmlidXRlcyBieSBjYWxsaW5nIHRvIHNlcmlhbGl6ZSBlbGVtZW50IG1ldGhvZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBlbGVtZW50RmllbGRWYWx1ZQotICAgICAqIEBwYXJhbSBlbGVtZW50RmllbGQKLSAgICAgKiBAcGFyYW0gd3JpdGVyCi0gICAgICogQHBhcmFtIG5hbWVzcGFjZVByZWZpeAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzZXJpYWxpemVFbGVtZW50RmllbGQoT2JqZWN0IGVsZW1lbnRGaWVsZFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWxlbWVudEZpZWxkIGVsZW1lbnRGaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTFN0cmVhbVdyaXRlciB3cml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lc3BhY2VQcmVmaXggbmFtZXNwYWNlUHJlZml4KQotICAgICAgICAgICAgdGhyb3dzIFhtbFNlcmlhbGl6aW5nRXhjZXB0aW9uLCBYTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgIFFOYW1lIGVsZW1lbnRGaWVsZFFOYW1lID0gbmV3IFFOYW1lKGVsZW1lbnRGaWVsZC5nZXRFbGVtZW50KCkuZ2V0TmFtZXNwYWNlKCksCi0gICAgICAgICAgICAgICAgZWxlbWVudEZpZWxkLmdldEVsZW1lbnQoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIHNlcmlhbGl6ZUVsZW1lbnQoZWxlbWVudEZpZWxkVmFsdWUsCi0gICAgICAgICAgICAgICAgZWxlbWVudEZpZWxkUU5hbWUsCi0gICAgICAgICAgICAgICAgZWxlbWVudEZpZWxkLmdldFR5cGUoKSwKLSAgICAgICAgICAgICAgICB3cml0ZXIsCi0gICAgICAgICAgICAgICAgbmFtZXNwYWNlUHJlZml4LAotICAgICAgICAgICAgICAgIGVsZW1lbnRGaWVsZC5pc0FycmF5KCksCi0gICAgICAgICAgICAgICAgZWxlbWVudEZpZWxkLmdldENsYXNzVHlwZSgpKTsKLQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB3cml0ZVN0YXJ0RWxlbWVudChYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZXNwYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbG9jYWxQYXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lc3BhY2VQcmVmaXggbmFtZXNwYWNlUHJlZml4KQotICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghbmFtZXNwYWNlLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSB3cml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBwcmVmaXggPSAibnMiICsgbmFtZXNwYWNlUHJlZml4LmdldE5hbWVzYXBjZVByZWZpeCgpOwotICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwcmVmaXgsIGxvY2FsUGFydCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIHdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVTdGFydEVsZW1lbnQobmFtZXNwYWNlLCBsb2NhbFBhcnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgd3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KGxvY2FsUGFydCk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB3cml0ZVR5cGVBdHRyaWJ1dGUoWE1MU3RyZWFtV3JpdGVyIHdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFOYW1lIHR5cGVRbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWVzcGFjZVByZWZpeCBuYW1lc3BhY2VQcmVmaXgpCi0gICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHhzaVByZWZpeCA9IHdyaXRlci5nZXRQcmVmaXgoQ29uc3RhbnRzLlVSSV9ERUZBVUxUX1NDSEVNQV9YU0kpOwotICAgICAgICBpZiAoeHNpUHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgIHhzaVByZWZpeCA9ICJucyIgKyBuYW1lc3BhY2VQcmVmaXguZ2V0TmFtZXNhcGNlUHJlZml4KCk7Ci0gICAgICAgICAgICB3cml0ZXIud3JpdGVOYW1lc3BhY2UoeHNpUHJlZml4LCBDb25zdGFudHMuVVJJX0RFRkFVTFRfU0NIRU1BX1hTSSk7Ci0gICAgICAgICAgICB3cml0ZXIuc2V0UHJlZml4KHhzaVByZWZpeCwgQ29uc3RhbnRzLlVSSV9ERUZBVUxUX1NDSEVNQV9YU0kpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIHR5cGVQcmVmaXggPSB3cml0ZXIuZ2V0UHJlZml4KHR5cGVRbmFtZS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgIGlmICh0eXBlUHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgIHR5cGVQcmVmaXggPSAibnMiICsgbmFtZXNwYWNlUHJlZml4LmdldE5hbWVzYXBjZVByZWZpeCgpOwotICAgICAgICAgICAgd3JpdGVyLndyaXRlTmFtZXNwYWNlKHR5cGVQcmVmaXgsIHR5cGVRbmFtZS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgICAgICB3cml0ZXIuc2V0UHJlZml4KHR5cGVQcmVmaXgsIHR5cGVRbmFtZS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgYXR0cmlidXRlVmFsdWUgPSB0eXBlUW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgIGlmICghdHlwZVByZWZpeC5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IHR5cGVQcmVmaXggKyAiOiIgKyBhdHRyaWJ1dGVWYWx1ZTsKLSAgICAgICAgfQotICAgICAgICB3cml0ZXIud3JpdGVBdHRyaWJ1dGUoQ29uc3RhbnRzLlVSSV9ERUZBVUxUX1NDSEVNQV9YU0ksICJ0eXBlIiwgYXR0cmlidXRlVmFsdWUpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB3cml0ZU51bGxBdHRyaWJ1dGUoWE1MU3RyZWFtV3JpdGVyIHdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWVzcGFjZVByZWZpeCBuYW1lc3BhY2VQcmVmaXgpCi0gICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgUU5hbWUgYXR0cmlidXRlUU5hbWUgPSBuZXcgUU5hbWUoQ29uc3RhbnRzLlVSSV9ERUZBVUxUX1NDSEVNQV9YU0ksIm5pbCIpOwotICAgICAgICB3cml0ZUF0dHJpYnV0ZSh3cml0ZXIsIjEiLGF0dHJpYnV0ZVFOYW1lLG5hbWVzcGFjZVByZWZpeCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogdGhpcyBtZXRob2Qgd3J0ZXMgdGhlIHNpbXBsZSBhdHRyaWJ1dGUgdG8gdGhlIHdyaXRlci4KLSAgICAgKiBAcGFyYW0gd3JpdGVyCi0gICAgICogQHBhcmFtIGF0dHJpYnV0ZVZhbHVlCi0gICAgICogQHBhcmFtIGF0dHJpYnV0ZVFOYW1lCi0gICAgICogQHBhcmFtIG5hbWVzcGFjZVByZWZpeAotICAgICAqIEB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKFhNTFN0cmVhbVdyaXRlciB3cml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhdHRyaWJ1dGVWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUU5hbWUgYXR0cmlidXRlUU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWVzcGFjZVByZWZpeCBuYW1lc3BhY2VQcmVmaXgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBpZiAoKGF0dHJpYnV0ZVFOYW1lLmdldE5hbWVzcGFjZVVSSSgpICE9IG51bGwpICYmICFhdHRyaWJ1dGVRTmFtZS5nZXROYW1lc3BhY2VVUkkoKS50cmltKCkuZXF1YWxzKCIiKSl7Ci0gICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gd3JpdGVyLmdldFByZWZpeChhdHRyaWJ1dGVRTmFtZS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpewotICAgICAgICAgICAgICAgIHByZWZpeCA9ICJucyIgKyBuYW1lc3BhY2VQcmVmaXguZ2V0TmFtZXNhcGNlUHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgYXR0cmlidXRlUU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgICAgICAgICAgICAgIHdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBhdHRyaWJ1dGVRTmFtZS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB3cml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0cmlidXRlUU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCksCi0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVFOYW1lLmdldExvY2FsUGFydCgpLAotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSk7Ci0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHRyaWJ1dGVRTmFtZS5nZXRMb2NhbFBhcnQoKSxhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgIH0KLQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvT01FbGVtZW50Q3JlYXRvci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kYXRhYmluZC9PTUVsZW1lbnRDcmVhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyZDQyYzcuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kYXRhYmluZC9PTUVsZW1lbnRDcmVhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLmRhdGFiaW5kOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5PTVNvdXJjZWRFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmV4Y2VwdGlvbi5NZXRhRGF0YVBvcHVsYXRlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmV4Y2VwdGlvbi5PTUVsZW1lbnRDcmVhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5leGNlcHRpb24uU2NoZW1hR2VuZXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5leGNlcHRpb24uWG1sU2VyaWFsaXppbmdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEuUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLnV0aWwuTmFtZXNwYWNlUHJlZml4OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIHRoaXMgY2xhc3MgaXMgdXNlZCB0byBjcmVhdGUgb21FbGVtZW50cyBmcm9tIHRoZQotICogZGlmZmVyZXQgdHlwZXMgb2YgamF2YSBiZWFucwotICovCi1wdWJsaWMgY2xhc3MgT01FbGVtZW50Q3JlYXRvciB7Ci0KLSAgICBwdWJsaWMgT01FbGVtZW50IGdldE9NRWxlbWVudChmaW5hbCBPYmplY3QgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUGFyYW1ldGVyIHBhcmFtZXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDb25maWd1cmF0b3IgY29uZmlndXJhdG9yKSB0aHJvd3MgT01FbGVtZW50Q3JlYXRpb25FeGNlcHRpb24gewotCi0gICAgICAgIE9NRWxlbWVudCByZXR1cm5PTUVsZW1lbnQgPSBudWxsOwotICAgICAgICBNYXAgcHJvY2Vzc2VkVHlwZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIE1hcCBwcm9jZXNzZWRTY2hlbWFNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBwYXJhbWV0ZXIucG9wdWxhdGVNZXRhRGF0YShjb25maWd1cmF0b3IsIHByb2Nlc3NlZFR5cGVNYXApOwotICAgICAgICAgICAgcGFyYW1ldGVyLmdlbmVyYXRlU2NoZW1hKGNvbmZpZ3VyYXRvciwgcHJvY2Vzc2VkU2NoZW1hTWFwKTsKLQotICAgICAgICAgICAgZmluYWwgSmF2YU9iamVjdFNlcmlhbGl6ZXIgamF2YU9iamVjdFNlcmlhbGl6ZXIgPQotICAgICAgICAgICAgICAgICAgICBuZXcgSmF2YU9iamVjdFNlcmlhbGl6ZXIocHJvY2Vzc2VkU2NoZW1hTWFwLCBjb25maWd1cmF0b3IsIHByb2Nlc3NlZFNjaGVtYU1hcCk7Ci0KLSAgICAgICAgICAgIE9NRGF0YVNvdXJjZSBvbURhdGFTb3VyY2UgPSBuZXcgUk1JRGF0YVNvdXJjZSgpIHsKLQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShNVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmFPYmplY3RTZXJpYWxpemVyLnNlcmlhbGl6ZVBhcmFtZXRlcih2YWx1ZSwgcGFyYW1ldGVyLCB4bWxXcml0ZXIsIG5ldyBOYW1lc3BhY2VQcmVmaXgoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFhtbFNlcmlhbGl6aW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBYTUxTdHJlYW1FeGNlcHRpb24oIlByb2JsZW0gaW4gcGFyc2luZyB0aGUgeG1sIHN0cmVhbSIsIGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLQotICAgICAgICAgICAgUU5hbWUgcW5hbWUgPSBuZXcgUU5hbWUocGFyYW1ldGVyLmdldE5hbWVzcGFjZSgpLCBwYXJhbWV0ZXIuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIHJldHVybk9NRWxlbWVudCA9IG5ldyBPTVNvdXJjZWRFbGVtZW50SW1wbChxbmFtZSwgT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCksIG9tRGF0YVNvdXJjZSk7Ci0KLSAgICAgICAgfSBjYXRjaCAoTWV0YURhdGFQb3B1bGF0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgT01FbGVtZW50Q3JlYXRpb25FeGNlcHRpb24oIlByb2JsZW0gaW4gbWV0YSBkYXRhIHBvcHVsYXRpb24iLCBlKTsKLSAgICAgICAgfSBjYXRjaCAoU2NoZW1hR2VuZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgT01FbGVtZW50Q3JlYXRpb25FeGNlcHRpb24oIlByb2JsZW0gaW4gU2NoZW1hIGdlbmVyYXRpb24iLCBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXR1cm5PTUVsZW1lbnQ7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL1JNSUJlYW4uamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvUk1JQmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzY5NjMxLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvUk1JQmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJtaS5kYXRhYmluZDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmV4Y2VwdGlvbi5YbWxTZXJpYWxpemluZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS51dGlsLk5hbWVzcGFjZVByZWZpeDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXI7Ci0KLS8qKgotICogdGhpcyBpbnRlcmZhY2UgaXMgdXNlZCB0byBjdXN0b21pemUgdGhlCi0gKiB0aGUgZGVmYXVsdCB3YXkgYXhpczIgcm1pIHdvcmtzCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUk1JQmVhbiB7Ci0KLSAgICAvKioKLSAgICAgKiBzZXJpYWxpemUgdGhlIGNsYXNzIGFjY29yZGluZ2x5LgotICAgICAqIHRoaXMgbWV0aG9kIHN1cHBvc2VkIHRvIHNlcmlhbGl6ZSB0aGlzIG9iamVjdCB0byB0aGUKLSAgICAgKiB3cml0ZXIuIFBhcmVudFFuYW1lIGlzIHBhc3NlZCBzbyB0aGF0IHRoaXMgbWV0aG9kIHNob3VsZCB3aXJ0ZQotICAgICAqIHRoZSBzdGFydCBhbmQgZW5kIGVsZW1lbnRzIGZvciB0aGUgYmVhbiBhcyB3ZWxsLgotICAgICAqIEBwYXJhbSB3cml0ZXIKLSAgICAgKiBAcGFyYW0gcGFyZW50UU5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoWE1MU3RyZWFtV3JpdGVyIHdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBKYXZhT2JqZWN0U2VyaWFsaXplciBzZXJpYWxpemVyLAotICAgICAgICAgICAgICAgICAgICAgICAgIFFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWVzcGFjZVByZWZpeCBuYW1lc3BhY2VQcmVmaXgpCi0gICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uLCBYbWxTZXJpYWxpemluZ0V4Y2VwdGlvbjsKLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kYXRhYmluZC9STUlEYXRhU291cmNlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL1JNSURhdGFTb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc4NTkzNi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL1JNSURhdGFTb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5ybWkuZGF0YWJpbmQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NT3V0cHV0Rm9ybWF0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5TdEFYVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlT01CdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFNlcmlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyOwotCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFJNSURhdGFTb3VyY2UgaW1wbGVtZW50cyBPTURhdGFTb3VyY2UgewotICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICBPTU91dHB1dEZvcm1hdCBvbU91dHB1dEZvcm1hdCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIFhNTFN0cmVhbVdyaXRlciB4bWxTdHJlYW1Xcml0ZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtV3JpdGVyKG91dHB1dFN0cmVhbSk7Ci0gICAgICAgIHNlcmlhbGl6ZSh4bWxTdHJlYW1Xcml0ZXIpOwotICAgICAgICB4bWxTdHJlYW1Xcml0ZXIuZmx1c2goKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoV3JpdGVyIHdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgT01PdXRwdXRGb3JtYXQgb21PdXRwdXRGb3JtYXQpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBzZXJpYWxpemUoU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVdyaXRlcih3cml0ZXIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoWE1MU3RyZWFtV3JpdGVyIHhtbFN0cmVhbVdyaXRlcikgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIE1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciBtdG9tQXdhcmVYTUxTdHJlYW1Xcml0ZXIgPSBuZXcgTVRPTUF3YXJlWE1MU2VyaWFsaXplcih4bWxTdHJlYW1Xcml0ZXIpOwotICAgICAgICBzZXJpYWxpemUobXRvbUF3YXJlWE1MU3RyZWFtV3JpdGVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgWE1MU3RyZWFtUmVhZGVyIGdldFJlYWRlcigpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAvLyBzaW5jZSBvbmx5IEFEQkJlYW5zIHJlbGF0ZWQgdG8gZWxlbWVudHMgY2FuIGJlIHNlcmlhbGl6ZWQKLSAgICAgICAgLy8gd2UgYXJlIHNhZmUgaW4gcGFzc2luZyBudWxsIGhlcmUuCi0gICAgICAgIE1UT01Bd2FyZU9NQnVpbGRlciBtdG9tQXdhcmVPTUJ1aWxkZXIgPSBuZXcgTVRPTUF3YXJlT01CdWlsZGVyKCk7Ci0gICAgICAgIHNlcmlhbGl6ZShtdG9tQXdhcmVPTUJ1aWxkZXIpOwotICAgICAgICByZXR1cm4gbXRvbUF3YXJlT01CdWlsZGVyLmdldE9NRWxlbWVudCgpLmdldFhNTFN0cmVhbVJlYWRlcigpOwotICAgIH0KLQotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNlcmlhbGl6ZShNVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kYXRhYmluZC9TaW1wbGVUeXBlSGFuZGxlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kYXRhYmluZC9TaW1wbGVUeXBlSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMmQxMWI0Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvU2ltcGxlVHlwZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLmRhdGFiaW5kOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotCi0vKioKLSAqIHRoaXMgY2xhc3MgaXMgdXNlZCB0byBoYW5kbGUgc2ltcGxlIHR5cGVzIHNlcmlhbGl6aW5nIGFuZCBkZXNlcmlhbGl6aW5nCi0gKi8KLXB1YmxpYyBjbGFzcyBTaW1wbGVUeXBlSGFuZGxlciB7Ci0KLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgLy8KLSAgICAvLyAgY29udmVydFRvU3RyaW5nIG1laHRvZHMKLSAgICAvLwotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgIHB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKGludCBpKSB7Ci0gICAgICAgIHJldHVybiBDb252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhmbG9hdCBpKSB7Ci0gICAgICAgIHJldHVybiBDb252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhsb25nIGkpIHsKLSAgICAgICAgcmV0dXJuIENvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGkpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKGRvdWJsZSBpKSB7Ci0gICAgICAgIHJldHVybiBDb252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhieXRlIGkpIHsKLSAgICAgICAgcmV0dXJuIENvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGkpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKGNoYXIgaSkgewotICAgICAgICByZXR1cm4gQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcoaSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoc2hvcnQgaSkgewotICAgICAgICByZXR1cm4gQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcoaSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoYm9vbGVhbiBpKSB7Ci0gICAgICAgIHJldHVybiBDb252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhEYXRlIHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBDb252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyh2YWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoQ2FsZW5kYXIgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIENvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhCeXRlIG8pIHsKLSAgICAgICAgcmV0dXJuIENvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKG8pOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKEludGVnZXIgbykgewotICAgICAgICByZXR1cm4gQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobyk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoTG9uZyBvKSB7Ci0gICAgICAgIHJldHVybiBDb252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhvKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhTaG9ydCBvKSB7Ci0gICAgICAgIHJldHVybiBDb252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhvKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhEb3VibGUgbykgewotICAgICAgICByZXR1cm4gQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobyk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoRmxvYXQgbykgewotICAgICAgICByZXR1cm4gQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobyk7Ci0gICAgfQotCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIC8vCi0gICAgLy8gIGNvbnZlcnRGcm9tU3RyaW5nIG1laHRvZHMKLSAgICAvLwotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgIHB1YmxpYyBpbnQgY29udmVydFRvSW50KFN0cmluZyBzKSB7Ci0gICAgICAgIHJldHVybiBDb252ZXJ0ZXJVdGlsLmNvbnZlcnRUb0ludChzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZG91YmxlIGNvbnZlcnRUb0RvdWJsZShTdHJpbmcgcykgewotICAgICAgICByZXR1cm4gQ29udmVydGVyVXRpbC5jb252ZXJ0VG9Eb3VibGUocyk7Ci0gICAgfQotCi0gICAgcHVibGljIGZsb2F0IGNvbnZlcnRUb0Zsb2F0KFN0cmluZyBzKSB7Ci0gICAgICAgIHJldHVybiBDb252ZXJ0ZXJVdGlsLmNvbnZlcnRUb0Zsb2F0KHMpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKFN0cmluZyBzKSB7Ci0gICAgICAgIHJldHVybiBDb252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgbG9uZyBjb252ZXJ0VG9Mb25nKFN0cmluZyBzKSB7Ci0gICAgICAgIHJldHVybiBDb252ZXJ0ZXJVdGlsLmNvbnZlcnRUb0xvbmcocyk7Ci0gICAgfQotCi0gICAgcHVibGljIHNob3J0IGNvbnZlcnRUb1Nob3J0KFN0cmluZyBzKSB7Ci0gICAgICAgIHJldHVybiBDb252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1Nob3J0KHMpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGNvbnZlcnRUb0Jvb2xlYW4oU3RyaW5nIHMpIHsKLSAgICAgICAgcmV0dXJuIENvbnZlcnRlclV0aWwuY29udmVydFRvQm9vbGVhbihzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYnl0ZSBjb252ZXJ0VG9CeXRlKFN0cmluZyBzKSB7Ci0gICAgICAgIHJldHVybiBDb252ZXJ0ZXJVdGlsLmNvbnZlcnRUb0J5dGUocyk7Ci0gICAgfQotCi0gICAgcHVibGljIERhdGUgY29udmVydFRvRGF0ZShTdHJpbmcgcykgewotICAgICAgICByZXR1cm4gQ29udmVydGVyVXRpbC5jb252ZXJ0VG9EYXRlKHMpOwotICAgIH0KLQotICAgIHB1YmxpYyBDYWxlbmRhciBjb252ZXJ0VG9EYXRlVGltZShTdHJpbmcgcykgewotICAgICAgICByZXR1cm4gQ29udmVydGVyVXRpbC5jb252ZXJ0VG9EYXRlVGltZShzKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvU3RhdGVmdWxYTUxTdHJlYW1SZWFkZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvU3RhdGVmdWxYTUxTdHJlYW1SZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU0OTE2Ny4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL1N0YXRlZnVsWE1MU3RyZWFtUmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5ybWkuZGF0YWJpbmQ7DQotDQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuTmFtZXNwYWNlQ29udGV4dDsNCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5Mb2NhdGlvbjsNCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247DQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOw0KLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7DQotDQotLyoqDQotICogU3RhdGVmdWxYTUxTdHJlYW1SZWFkZXIgY2xhc3MgdGhhdCBwcmltYXJpbHkgZGVsZWdhdGVzIHRvIHRoZSBpbml0aWFsIHJlYWRlci4gSG93ZXZlciwgaW4gDQotICogYWRkaXRpb24gdG8gdGhlIG5vcm1hbCBmdW5jdGlvbnMgcGVyZm9ybWVkIGJ5IHRoZSBpbml0aWFsIHJlYWRlciwgYSBzdGFjayBpcyBhbHNvIG1haW50YWluZWQNCi0gKiB0byBkZXRlcm1pbmUgdGhlIGN1cnJlbnQgc3RhdGUuDQotICovDQotcHVibGljIGNsYXNzIFN0YXRlZnVsWE1MU3RyZWFtUmVhZGVyIGltcGxlbWVudHMgWE1MU3RyZWFtUmVhZGVyIHsNCi0NCi0gICAgcHJvdGVjdGVkIFhNTFN0cmVhbVJlYWRlciBkZWxlZ2F0ZTsNCi0gICAgcHJpdmF0ZSBTdGFjayB0YWdTdGFjazsNCi0gICAgcHJpdmF0ZSBib29sZWFuIHByaW9yQWNjZXNzOw0KLQ0KLSAgICAvKioNCi0gICAgICogQ29uc3RydWN0IGEgU3RhdGVmdWxYTUxTdHJlYW1SZWFkZXIuICBEbyBub3QgYXNzdW1lIHRoYXQgdGhlIHJlYWRlciBpcyBiZWluZw0KLSAgICAgKiBjb252ZXJ0ZWQgcHJpb3IgdG8gYWNjZXNzZWQuDQotICAgICAqDQotICAgICAqIEBwYXJhbSByZWFkZXIgWE1MU3RyZWFtUmVhZGVyIGZvciB3aGljaCBhIHN0YXRlIGlzIGFsc28gbmVlZGVkLg0KLSAgICAgKi8NCi0gICAgcHVibGljIFN0YXRlZnVsWE1MU3RyZWFtUmVhZGVyKFhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsNCi0gICAgICAgIGRlbGVnYXRlID0gcmVhZGVyOw0KLSAgICAgICAgdGFnU3RhY2sgPSBuZXcgU3RhY2soKTsNCi0gICAgICAgIHByaW9yQWNjZXNzID0gdHJ1ZTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIENvbnN0cnVjdCBhIFN0YXRlZnVsWE1MU3RyZWFtUmVhZGVyLg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gcmVhZGVyIFhNTFN0cmVhbVJlYWRlciBmb3Igd2hpY2ggYSBzdGF0ZSBpcyBhbHNvIG5lZWRlZC4NCi0gICAgICogQHBhcmFtIGF0MCBpbmRpY2F0ZXMgd2hldGhlciByZWFkZXIgaGFzIGJlZW4gYWR2YW5jZWQsIHdoaWNoIGluIHR1cm4gDQotICAgICAqICAgICAgICBpbmRpY2F0ZXMgd2hldGhlciB0aGUgWE1MIHBhcnNpbmcgaXMgYXQgYW4gaW50ZXJtZWRpYXRlIHN0YXRlDQotICAgICAqICAgICAgICBwcmlvciB0byBiZWluZyBjb252ZXJ0ZWQgdG8gYSBTdGF0ZWZ1bFhNTFN0cmVhbVJlYWRlcg0KLSAgICAgKi8NCi0gICAgcHVibGljIFN0YXRlZnVsWE1MU3RyZWFtUmVhZGVyKFhNTFN0cmVhbVJlYWRlciByZWFkZXIsIGJvb2xlYW4gYXQwKSB7DQotICAgICAgICBkZWxlZ2F0ZSA9IHJlYWRlcjsNCi0gICAgICAgIHRhZ1N0YWNrID0gbmV3IFN0YWNrKCk7DQotICAgICAgICBwcmlvckFjY2VzcyA9ICFhdDA7DQotICAgIH0gICAgDQotDQotICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7DQotICAgICAgICBkZWxlZ2F0ZS5jbG9zZSgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBpbnQgZ2V0QXR0cmlidXRlQ291bnQoKSB7DQotICAgICAgICByZXR1cm4gZGVsZWdhdGUuZ2V0QXR0cmlidXRlQ291bnQoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZUxvY2FsTmFtZShpbnQgYXJnMCkgew0KLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldEF0dHJpYnV0ZUxvY2FsTmFtZShhcmcwKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUU5hbWUgZ2V0QXR0cmlidXRlTmFtZShpbnQgYXJnMCkgew0KLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldEF0dHJpYnV0ZU5hbWUoYXJnMCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVOYW1lc3BhY2UoaW50IGFyZzApIHsNCi0gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXRBdHRyaWJ1dGVOYW1lc3BhY2UoYXJnMCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVQcmVmaXgoaW50IGFyZzApIHsNCi0gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXRBdHRyaWJ1dGVQcmVmaXgoYXJnMCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVUeXBlKGludCBhcmcwKSB7DQotICAgICAgICByZXR1cm4gZGVsZWdhdGUuZ2V0QXR0cmlidXRlVHlwZShhcmcwKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZVZhbHVlKGludCBhcmcwKSB7DQotICAgICAgICByZXR1cm4gZGVsZWdhdGUuZ2V0QXR0cmlidXRlVmFsdWUoYXJnMCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVWYWx1ZShTdHJpbmcgYXJnMCwgU3RyaW5nIGFyZzEpIHsNCi0gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXRBdHRyaWJ1dGVWYWx1ZShhcmcwLCBhcmcxKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENoYXJhY3RlckVuY29kaW5nU2NoZW1lKCkgew0KLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldENoYXJhY3RlckVuY29kaW5nU2NoZW1lKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRFbGVtZW50VGV4dCgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gew0KLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldEVsZW1lbnRUZXh0KCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRFbmNvZGluZygpIHsNCi0gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXRFbmNvZGluZygpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBpbnQgZ2V0RXZlbnRUeXBlKCkgew0KLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldEV2ZW50VHlwZSgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxOYW1lKCkgew0KLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldExvY2FsTmFtZSgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBMb2NhdGlvbiBnZXRMb2NhdGlvbigpIHsNCi0gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXRMb2NhdGlvbigpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBRTmFtZSBnZXROYW1lKCkgew0KLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldE5hbWUoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTmFtZXNwYWNlQ29udGV4dCBnZXROYW1lc3BhY2VDb250ZXh0KCkgew0KLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldE5hbWVzcGFjZUNvbnRleHQoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgaW50IGdldE5hbWVzcGFjZUNvdW50KCkgew0KLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldE5hbWVzcGFjZUNvdW50KCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VQcmVmaXgoaW50IGFyZzApIHsNCi0gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXROYW1lc3BhY2VQcmVmaXgoYXJnMCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VVUkkoKSB7DQotICAgICAgICByZXR1cm4gZGVsZWdhdGUuZ2V0TmFtZXNwYWNlVVJJKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VVUkkoaW50IGFyZzApIHsNCi0gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXROYW1lc3BhY2VVUkkoYXJnMCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VVUkkoU3RyaW5nIGFyZzApIHsNCi0gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXROYW1lc3BhY2VVUkkoYXJnMCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRQSURhdGEoKSB7DQotICAgICAgICByZXR1cm4gZGVsZWdhdGUuZ2V0UElEYXRhKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRQSVRhcmdldCgpIHsNCi0gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXRQSVRhcmdldCgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KCkgew0KLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldFByZWZpeCgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIGFyZzApIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gew0KLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldFByb3BlcnR5KGFyZzApOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsNCi0gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXRUZXh0KCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGNoYXJbXSBnZXRUZXh0Q2hhcmFjdGVycygpIHsNCi0gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXRUZXh0Q2hhcmFjdGVycygpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBpbnQgZ2V0VGV4dENoYXJhY3RlcnMoaW50IGFyZzAsIGNoYXJbXSBhcmcxLCBpbnQgYXJnMiwgaW50IGFyZzMpDQotICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7DQotICAgICAgICByZXR1cm4gZGVsZWdhdGUuZ2V0VGV4dENoYXJhY3RlcnMoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGludCBnZXRUZXh0TGVuZ3RoKCkgew0KLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldFRleHRMZW5ndGgoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgaW50IGdldFRleHRTdGFydCgpIHsNCi0gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXRUZXh0U3RhcnQoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFZlcnNpb24oKSB7DQotICAgICAgICByZXR1cm4gZGVsZWdhdGUuZ2V0VmVyc2lvbigpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGhhc05hbWUoKSB7DQotICAgICAgICByZXR1cm4gZGVsZWdhdGUuaGFzTmFtZSgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsNCi0gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5oYXNOZXh0KCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaGFzVGV4dCgpIHsNCi0gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5oYXNUZXh0KCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaXNBdHRyaWJ1dGVTcGVjaWZpZWQoaW50IGFyZzApIHsNCi0gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5pc0F0dHJpYnV0ZVNwZWNpZmllZChhcmcwKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0NoYXJhY3RlcnMoKSB7DQotICAgICAgICByZXR1cm4gZGVsZWdhdGUuaXNDaGFyYWN0ZXJzKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbmRFbGVtZW50KCkgew0KLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmlzRW5kRWxlbWVudCgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzU3RhbmRhbG9uZSgpIHsNCi0gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5pc1N0YW5kYWxvbmUoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1N0YXJ0RWxlbWVudCgpIHsNCi0gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5pc1N0YXJ0RWxlbWVudCgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzV2hpdGVTcGFjZSgpIHsNCi0gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5pc1doaXRlU3BhY2UoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgaW50IG5leHQoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsNCi0gICAgICAgIGludCByZXR1cm5WYWx1ZSA9IGRlbGVnYXRlLm5leHQoKTsNCi0gICAgICAgIA0KLSAgICAgICAgaWYgKGRlbGVnYXRlLmlzRW5kRWxlbWVudCgpKSB7DQotICAgICAgICAgICAgUU5hbWUgdG9wID0gKFFOYW1lKSB0YWdTdGFjay5wZWVrKCk7DQotICAgICAgICAgICAgaWYgKCEoZGVsZWdhdGUuZ2V0TmFtZSgpLmVxdWFscyh0b3ApKSAmJiAhcHJpb3JBY2Nlc3MpIHsNCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGhlIGVuZCBlbGVtZW50ICgiICsgZGVsZWdhdGUuZ2V0TmFtZSgpICsgIikgZG9lcyBub3QgIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICsgImNvcnJlc3BvbmQgdG8gdGhlIGN1cnJlbnQgc3RhcnQgZWxlbWVudCAoIiArIHRvcCArICIpLiIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZiAodGFnU3RhY2suc2l6ZSgpID4gMCkgew0KLSAgICAgICAgICAgICAgICB0YWdTdGFjay5wb3AoKTsgICAgICAgIA0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIXByaW9yQWNjZXNzKSB7DQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkFuIGVuZCBlbGVtZW50IHdhcyBlbmNvdW50ZXJlZCBmb3Igd2hpY2ggIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICsgInRoZXJlIHdhcyBub3QgYSBjb3JyZXNwb25kaW5nIHN0YXJ0IGVsZW1lbnQuIik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSBlbHNlIGlmIChkZWxlZ2F0ZS5pc1N0YXJ0RWxlbWVudCgpKSB7DQotICAgICAgICAgICAgdGFnU3RhY2sucHVzaChkZWxlZ2F0ZS5nZXROYW1lKCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBpbnQgbmV4dFRhZygpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gew0KLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlLm5leHRUYWcoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCByZXF1aXJlKGludCBhcmcwLCBTdHJpbmcgYXJnMSwgU3RyaW5nIGFyZzIpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gew0KLSAgICAgICAgZGVsZWdhdGUucmVxdWlyZShhcmcwLCBhcmcxLCBhcmcyKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBzdGFuZGFsb25lU2V0KCkgew0KLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlLnN0YW5kYWxvbmVTZXQoKTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIGludCBnZXREZXB0aCgpIHsNCi0gICAgICAgIHJldHVybiB0YWdTdGFjay5zaXplKCk7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kYXRhYmluZC9YbWxTdHJlYW1QYXJzZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvWG1sU3RyZWFtUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3Y2E4OWYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kYXRhYmluZC9YbWxTdHJlYW1QYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczOCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJtaS5kYXRhYmluZDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuQ29uZmlndXJhdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5leGNlcHRpb24uTWV0YURhdGFQb3B1bGF0ZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZXhjZXB0aW9uLlNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmV4Y2VwdGlvbi5YbWxQYXJzaW5nRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS5BdHRyaWJ1dGVGaWVsZDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEuRWxlbWVudEZpZWxkOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS5PcGVyYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLm1ldGFkYXRhLlBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEuVHlwZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEuaW1wbC5UeXBlSW1wbDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkudHlwZXMuTWFwVHlwZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkudXRpbC5Db25zdGFudHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLnV0aWwuSmF2YVR5cGVUb1FOYW1lTWFwOw0KLQ0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOw0KLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7DQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkFycmF5Ow0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsNCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsNCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLlNldDsNCi0NCi1wdWJsaWMgY2xhc3MgWG1sU3RyZWFtUGFyc2VyIHsNCi0NCi0gICAgcHJpdmF0ZSBDb25maWd1cmF0b3IgY29uZmlndXJhdG9yOw0KLSAgICBwcml2YXRlIE1hcCBxTmFtZVRvVHlwZU1hcDsNCi0gICAgcHJpdmF0ZSBTaW1wbGVUeXBlSGFuZGxlciBzaW1wbGVUeXBlSGFuZGxlcjsNCi0gICAgcHJpdmF0ZSBDbGFzcyBzaW1wbGVUeXBlSGFuZGxlckNsYXNzOw0KLSAgICBwcml2YXRlIGJvb2xlYW4gcmVhZGVyUHJpb3JBY2Nlc3M7DQotICAgIHByaXZhdGUgYm9vbGVhbiBwcmlvckFjY2Vzc0RldGVybWluZWQgPSBmYWxzZTsNCi0NCi0gICAgcHVibGljIFhtbFN0cmVhbVBhcnNlcihNYXAgcHJvY2Vzc2VkVHlwZU1hcCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0b3IgY29uZmlndXJhdG9yLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcCBzY2hlbWFNYXApIHsNCi0gICAgICAgIHRoaXMuY29uZmlndXJhdG9yID0gY29uZmlndXJhdG9yOw0KLSAgICAgICAgdGhpcy5zaW1wbGVUeXBlSGFuZGxlciA9IHRoaXMuY29uZmlndXJhdG9yLmdldFNpbXBsZVR5cGVIYW5kbGVyKCk7DQotICAgICAgICB0aGlzLnNpbXBsZVR5cGVIYW5kbGVyQ2xhc3MgPSB0aGlzLnNpbXBsZVR5cGVIYW5kbGVyLmdldENsYXNzKCk7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIHBvcHVsYXRlUU5hbWVUb1R5cGVNYXAocHJvY2Vzc2VkVHlwZU1hcCwgc2NoZW1hTWFwKTsNCi0gICAgICAgIH0gY2F0Y2ggKE1ldGFEYXRhUG9wdWxhdGVFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIC8vIFRPRE86IHdoYXQgdG8gZG8gdGhpcyBleGNlcHRpb25zIGlzIG5vdCBnb2luZyB0byBoYXBwZW4NCi0gICAgICAgIH0gY2F0Y2ggKFNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIC8vIFRPRE86IHdoYXQgdG8gZG8gdGhpcyBleGNlcHRpb25zIGlzIG5vdCBnb2luZyB0byBoYXBwZW4NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgcG9wdWxhdGVRTmFtZVRvVHlwZU1hcChNYXAgcHJvY2Vzc2VkVHlwZU1hcCwgTWFwIHNjaGVtYU1hcCkNCi0gICAgICAgICAgICB0aHJvd3MgTWV0YURhdGFQb3B1bGF0ZUV4Y2VwdGlvbiwNCi0gICAgICAgICAgICBTY2hlbWFHZW5lcmF0aW9uRXhjZXB0aW9uIHsNCi0gICAgICAgIC8vIGZpcnN0IGFkZCBhbGwgdGhlIHByb2NlY2VkIHR5cGUgbWFwIHZhbHVlcw0KLSAgICAgICAgU2V0IGRlZmF1bHRUeXBlTWFwS2V5cyA9IEphdmFUeXBlVG9RTmFtZU1hcC5nZXRLZXlzKCk7DQotICAgICAgICBDbGFzcyB0eXBlQ2xhc3M7DQotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkZWZhdWx0VHlwZU1hcEtleXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7DQotICAgICAgICAgICAgdHlwZUNsYXNzID0gKENsYXNzKSBpdGVyLm5leHQoKTsNCi0gICAgICAgICAgICBpZiAoIXByb2Nlc3NlZFR5cGVNYXAuY29udGFpbnNLZXkodHlwZUNsYXNzKSkgew0KLSAgICAgICAgICAgICAgICBUeXBlIG5ld1R5cGUgPSBuZXcgVHlwZUltcGwodHlwZUNsYXNzKTsNCi0gICAgICAgICAgICAgICAgcHJvY2Vzc2VkVHlwZU1hcC5wdXQodHlwZUNsYXNzLCBuZXdUeXBlKTsNCi0gICAgICAgICAgICAgICAgbmV3VHlwZS5wb3B1bGF0ZU1ldGFEYXRhKHRoaXMuY29uZmlndXJhdG9yLCBwcm9jZXNzZWRUeXBlTWFwKTsNCi0gICAgICAgICAgICAgICAgbmV3VHlwZS5nZW5lcmF0ZVNjaGVtYSh0aGlzLmNvbmZpZ3VyYXRvciwgc2NoZW1hTWFwKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICB0aGlzLnFOYW1lVG9UeXBlTWFwID0gbmV3IEhhc2hNYXAoKTsNCi0gICAgICAgIFR5cGUgdHlwZSA9IG51bGw7DQotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwcm9jZXNzZWRUeXBlTWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgew0KLSAgICAgICAgICAgIHR5cGUgPSAoVHlwZSkgaXRlci5uZXh0KCk7DQotICAgICAgICAgICAgdGhpcy5xTmFtZVRvVHlwZU1hcC5wdXQodHlwZS5nZXRYbWxUeXBlKCkuZ2V0UW5hbWUoKSwgdHlwZSk7DQotICAgICAgICB9DQotDQotICAgIH0NCi0NCi0gICAgcHVibGljIE9iamVjdCBnZXRPdXRwdXRPYmplY3QoWE1MU3RyZWFtUmVhZGVyIHJlYWRlcl9pbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmF0aW9uIG9wZXJhdGlvbikNCi0gICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uLCBYbWxQYXJzaW5nRXhjZXB0aW9uIHsNCi0gICAgICAgIE9iamVjdCByZXR1cm5PYmplY3QgPSBudWxsOw0KLSAgICAgICAgDQotICAgICAgICBkZXRlcm1pbmVQcmlvckFjY2VzcyhyZWFkZXJfaW4pOw0KLSAgICAgICAgU3RhdGVmdWxYTUxTdHJlYW1SZWFkZXIgcmVhZGVyID0gZ2V0U3RhdGVmdWxSZWFkZXIocmVhZGVyX2luKTsNCi0gICAgICAgIA0KLSAgICAgICAgYWR2YW5jZVRvRmlyc3RFbGVtZW50KHJlYWRlcik7DQotDQotICAgICAgICAvLyBmaXJzdCBjaGVjayB3aGV0aGVyIHdlIGhhdmUgZ290IHRoZSBjb3JyZWN0IGlucHV0IGVsZW1lbnQgb3Igbm90DQotICAgICAgICBpZiAocmVhZGVyLmdldExvY2FsTmFtZSgpLmVxdWFscyhvcGVyYXRpb24uZ2V0T3V0UHV0RWxlbWVudCgpLmdldE5hbWUoKSkgJiYNCi0gICAgICAgICAgICAgICAgcmVhZGVyLmdldE5hbWVzcGFjZVVSSSgpLmVxdWFscyhvcGVyYXRpb24uZ2V0T3V0UHV0RWxlbWVudCgpLmdldE5hbWVzcGFjZSgpKSkgew0KLSAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7DQotICAgICAgICAgICAgaWYgKG9wZXJhdGlvbi5nZXRPdXRwdXRQYXJhbWV0ZXIoKSAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgIC8vIGkuZSB0aGlzIGlzIG5vdCBhIHZvaWQgcmV0dXJuIHR5cGUNCi0gICAgICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gZ2V0T2JqZWN0Rm9yUGFyYW1ldGVyKHJlYWRlciwgb3BlcmF0aW9uLmdldE91dHB1dFBhcmFtZXRlcigpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gcmV0dXJuT2JqZWN0Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBPYmplY3RbXSBnZXRJbnB1dFBhcmFtZXRlcnMoWE1MU3RyZWFtUmVhZGVyIHJlYWRlcl9pbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYXRpb24gb3BlcmF0aW9uKQ0KLSAgICAgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sDQotICAgICAgICAgICAgWG1sUGFyc2luZ0V4Y2VwdGlvbiB7DQotDQotICAgICAgICBkZXRlcm1pbmVQcmlvckFjY2VzcyhyZWFkZXJfaW4pOw0KLSAgICAgICAgU3RhdGVmdWxYTUxTdHJlYW1SZWFkZXIgcmVhZGVyID0gZ2V0U3RhdGVmdWxSZWFkZXIocmVhZGVyX2luKTsNCi0gICAgICAgIA0KLSAgICAgICAgTGlzdCByZXR1cm5PYmplY3RzID0gbmV3IEFycmF5TGlzdCgpOw0KLSAgICAgICAgYWR2YW5jZVRvRmlyc3RFbGVtZW50KHJlYWRlcik7DQotDQotICAgICAgICAvLyBmaXJzdCBjaGVjayB3aGV0aGVyIHdlIGhhdmUgZ290IHRoZSBjb3JyZWN0IGlucHV0IGVsZW1lbnQgb3Igbm90DQotICAgICAgICBpZiAocmVhZGVyLmdldExvY2FsTmFtZSgpLmVxdWFscyhvcGVyYXRpb24uZ2V0SW5wdXRFbGVtZW50KCkuZ2V0TmFtZSgpKSAmJg0KLSAgICAgICAgICAgICAgICByZWFkZXIuZ2V0TmFtZXNwYWNlVVJJKCkuZXF1YWxzKG9wZXJhdGlvbi5nZXRJbnB1dEVsZW1lbnQoKS5nZXROYW1lc3BhY2UoKSkpIHsNCi0gICAgICAgICAgICAvLyBwb2ludCB0aGUgcmVhZGVyIHRvIHBhcmFtZXRlcnMNCi0gICAgICAgICAgICByZWFkZXIubmV4dCgpOw0KLSAgICAgICAgICAgIFBhcmFtZXRlciBwYXJhbWV0ZXIgPSBudWxsOw0KLSAgICAgICAgICAgIExpc3QgaW5wdXRQYXJhbWV0ZXJzID0gb3BlcmF0aW9uLmdldElucHV0UGFyYW1ldGVycygpOw0KLSAgICAgICAgICAgIFFOYW1lIHBhcmFtZXRlclFOYW1lID0gbnVsbDsNCi0gICAgICAgICAgICBpbnQgc3RhcnREZXB0aCA9IHJlYWRlci5nZXREZXB0aCgpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGlucHV0UGFyYW1ldGVycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsNCi0gICAgICAgICAgICAgICAgcGFyYW1ldGVyID0gKFBhcmFtZXRlcikgaXRlci5uZXh0KCk7DQotICAgICAgICAgICAgICAgIHBhcmFtZXRlclFOYW1lID0gbmV3IFFOYW1lKHBhcmFtZXRlci5nZXROYW1lc3BhY2UoKSwgcGFyYW1ldGVyLmdldE5hbWUoKSk7DQotICAgICAgICAgICAgICAgIHJldHVybk9iamVjdHMuYWRkKGdldE9iamVjdEZvclBhcmFtZXRlcihyZWFkZXIsIHBhcmFtZXRlcikpOw0KLSAgICAgICAgICAgICAgICAvLyBpZiB0aGUgcmVhZGVyIGlzIGF0IHRoZSBlbmQgb2YgdGhpcyBwYXJhbWV0ZXINCi0gICAgICAgICAgICAgICAgLy8gdGhlbiB3ZSBtb3ZlIGl0IHRvIG5leHQgZWxlbWVudC4NCi0gICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc0VuZEVsZW1lbnQoKSAmJiByZWFkZXIuZ2V0TmFtZSgpLmVxdWFscyhwYXJhbWV0ZXJRTmFtZSkNCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAocmVhZGVyUHJpb3JBY2Nlc3MgfHwgcmVhZGVyLmdldERlcHRoKCkgPT0gc3RhcnREZXB0aCAtIDEpKXsNCi0gICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotDQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIHRocm93IG5ldyBYbWxQYXJzaW5nRXhjZXB0aW9uKCJVbmV4cGVjdGVkIFN1YmVsZW1lbnQgIiArIHJlYWRlci5nZXROYW1lKCkgKyAiIGJ1dCAiICsNCi0gICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCAiICsgb3BlcmF0aW9uLmdldElucHV0RWxlbWVudCgpLmdldE5hbWUoKSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gcmV0dXJuT2JqZWN0cy50b0FycmF5KCk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIHBhcmFtZXRlciBoYXMgdGhlIHNhbWUgbG9naWMgYXMgdGhlIGF0dHJpYnV0ZS4gc28gcmVhZGVyIHByZSBhbmQgcG9zdCBjb25kaXRpb25zIHNhbWUuDQotICAgICAqDQotICAgICAqIEBwYXJhbSByZWFkZXINCi0gICAgICogQHBhcmFtIHBhcmFtZXRlcg0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqIEB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uDQotICAgICAqIEB0aHJvd3MgWG1sUGFyc2luZ0V4Y2VwdGlvbg0KLSAgICAgKi8NCi0NCi0gICAgcHVibGljIE9iamVjdCBnZXRPYmplY3RGb3JQYXJhbWV0ZXIoWE1MU3RyZWFtUmVhZGVyIHJlYWRlcl9pbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1ldGVyIHBhcmFtZXRlcikNCi0gICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uLA0KLSAgICAgICAgICAgIFhtbFBhcnNpbmdFeGNlcHRpb24gew0KLQ0KLSAgICAgICAgUU5hbWUgcGFyYW1ldGVyUU5hbWUgPSBuZXcgUU5hbWUocGFyYW1ldGVyLmdldE5hbWVzcGFjZSgpLCBwYXJhbWV0ZXIuZ2V0TmFtZSgpKTsNCi0gICAgICAgIA0KLSAgICAgICAgZGV0ZXJtaW5lUHJpb3JBY2Nlc3MocmVhZGVyX2luKTsNCi0gICAgICAgIFN0YXRlZnVsWE1MU3RyZWFtUmVhZGVyIHJlYWRlciA9IGdldFN0YXRlZnVsUmVhZGVyKHJlYWRlcl9pbik7DQotICAgICAgICANCi0gICAgICAgIHJldHVybiBnZXRPYmplY3RGb3JFbGVtZW50KHJlYWRlciwNCi0gICAgICAgICAgICAgICAgcGFyYW1ldGVyUU5hbWUsDQotICAgICAgICAgICAgICAgIHBhcmFtZXRlci5nZXRUeXBlKCksDQotICAgICAgICAgICAgICAgIHBhcmFtZXRlci5pc0FycmF5KCksDQotICAgICAgICAgICAgICAgIHBhcmFtZXRlci5nZXRFbGVtZW50KCkuaXNOaWxsYWJsZSgpLA0KLSAgICAgICAgICAgICAgICBwYXJhbWV0ZXIuZ2V0RWxlbWVudCgpLmlzTWluT2NjdXJzMCgpLA0KLSAgICAgICAgICAgICAgICBwYXJhbWV0ZXIuZ2V0Q2xhc3NUeXBlKCksDQotICAgICAgICAgICAgICAgIHBhcmFtZXRlci5nZXRKYXZhQ2xhc3MoKSk7DQotDQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIHdoZW4gY2FsbHMgdG8gdGhpcyBtZXRob2QgcmVhZGVyIG11c3QgcG9pbnQgdG8gdGhlIHN0YXJ0IG9mIHRoZSB0eXBlLg0KLSAgICAgKiBpZiBpdCBpcyBhIHNpbXBsZSB0eXBlIGl0IHBvaW50cyB0aGUgdGhlIHRleHQNCi0gICAgICogaWYgaXQgaXMgYSBjb21wbGV4IHR5cGUgaXQgcG9pbnRzIHRvIHRoZSBzdGFydCBlbGVtZW50IG9mIHRoZSBmaXJzdCBhdHRyaWJ1dGUuIGFuZCB3ZSByZXR1cm5pbmcNCi0gICAgICogZnJvbSB0aGUgbWV0aG9kIGl0IHNob3VsZCBwb2ludCB0byB0aGUgZW5kIGVsZW1lbnQgb2YgdGhlIGxhc3QgcGFyYW1ldGVyLg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gcmVhZGVyDQotICAgICAqIEBwYXJhbSB0eXBlDQotICAgICAqIEByZXR1cm4NCi0gICAgICogQHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24NCi0gICAgICogQHRocm93cyBYbWxQYXJzaW5nRXhjZXB0aW9uDQotICAgICAqLw0KLQ0KLQ0KLSAgICBwdWJsaWMgT2JqZWN0IGdldE9iamVjdEZvclR5cGUoWE1MU3RyZWFtUmVhZGVyIHJlYWRlcl9pbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgdHlwZSkNCi0gICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uLA0KLSAgICAgICAgICAgIFhtbFBhcnNpbmdFeGNlcHRpb24gew0KLQ0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBkZXRlcm1pbmVQcmlvckFjY2VzcyhyZWFkZXJfaW4pOw0KLSAgICAgICAgICAgIFN0YXRlZnVsWE1MU3RyZWFtUmVhZGVyIHJlYWRlciA9IGdldFN0YXRlZnVsUmVhZGVyKHJlYWRlcl9pbik7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgT2JqZWN0IHJldHVybk9iamVjdCA9IG51bGw7DQotICAgICAgICAgICAgaWYgKHR5cGUuZ2V0WG1sVHlwZSgpLmlzU2ltcGxlVHlwZSgpKSB7DQotICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgYSBzaW1wbGUga25vd24gdHlwZSBmb3IgdXMNCi0gICAgICAgICAgICAgICAgLy8gY29uc3RydWN0b3Igc2hvdWxkIGJlIGFibGUgdG8gaW52b2tlIHdpdGggdGhlIHN0cmluZy4NCi0gICAgICAgICAgICAgICAgaWYgKHR5cGUuZ2V0SmF2YUNsYXNzKCkuZXF1YWxzKE9iamVjdC5jbGFzcykpIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybk9iamVjdCA9IG5ldyBPYmplY3QoKTsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgIC8vIGZpbmQgdGhlIG9iamVjdCBmb3IgdGhpcyBzdHJpbmcgdXNpbmcgY29udmVydGVyIHV0aWwgY2xhc3Nlcw0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gZ2V0U2ltcGxlVHlwZU9iamVjdCh0eXBlLCByZWFkZXIsIHJlYWRlci5nZXRUZXh0KCkpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgLy8gZmlyc3Qgd2UgaGF2ZSB0byBwb2ludCB0byB0aGUgcmVhZGVyIHRvIHRoZSBiZWdpbm5pbmcgZm9yIHRoZSBlbGVtZW50DQotICAgICAgICAgICAgICAgIHdoaWxlICghcmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgJiYgIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBpbnQgc3RhcnREZXB0aCA9IHJlYWRlci5nZXREZXB0aCgpOw0KLSAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIGEgY29tcGxleCB0eXBlDQotICAgICAgICAgICAgICAgIHJldHVybk9iamVjdCA9IHR5cGUuZ2V0SmF2YUNsYXNzKCkubmV3SW5zdGFuY2UoKTsNCi0gICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBnZXQgYWxsIHRoZSBlbGVtZW50RmllbGQgYW5kIHBvcHVsYXRlIHRoZW0NCi0gICAgICAgICAgICAgICAgTGlzdCBlbGVtZW50RmllbGRzID0gdHlwZS5nZXRBbGxFbGVtZW50RmllbGRzKCk7DQotICAgICAgICAgICAgICAgIEVsZW1lbnRGaWVsZCBlbGVtZW50RmllbGQ7DQotICAgICAgICAgICAgICAgIE9iamVjdCBlbGVtZW50RmllbGRPYmplY3Q7DQotICAgICAgICAgICAgICAgIFFOYW1lIGVsZW1lbnRGaWVsZFFOYW1lID0gbnVsbDsNCi0NCi0gICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudEZpZWxkcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsNCi0gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRGaWVsZCA9IChFbGVtZW50RmllbGQpIGl0ZXIubmV4dCgpOw0KLSAgICAgICAgICAgICAgICAgICAgZWxlbWVudEZpZWxkT2JqZWN0ID0gZ2V0T2JqZWN0Rm9yRWxlbWVudEZpZWxkKHJlYWRlciwgZWxlbWVudEZpZWxkKTsNCi0gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRGaWVsZFFOYW1lID0gbmV3IFFOYW1lKGVsZW1lbnRGaWVsZC5nZXROYW1lc3BhY2UoKSwgZWxlbWVudEZpZWxkLmdldE5hbWUoKSk7DQotICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudEZpZWxkT2JqZWN0ICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50RmllbGQuZ2V0U2V0dGVyTWV0aG9kKCkuaW52b2tlKHJldHVybk9iamVjdCwgbmV3IE9iamVjdFtde2VsZW1lbnRGaWVsZE9iamVjdH0pOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHJlYWRlciBpcyBhdCB0aGUgZW5kIG9mIHRoaXMgZWxlbWVudEZpZWxkDQotICAgICAgICAgICAgICAgICAgICAvLyB0aGVuIHdlIG1vdmUgaXQgdG8gbmV4dCBlbGVtZW50Lg0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc0VuZEVsZW1lbnQoKSAmJiByZWFkZXIuZ2V0TmFtZSgpLmVxdWFscyhlbGVtZW50RmllbGRRTmFtZSkgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChyZWFkZXJQcmlvckFjY2VzcyB8fCByZWFkZXIuZ2V0RGVwdGgoKSA9PSBzdGFydERlcHRoIC0gMSkpew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7DQotICAgICAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIHJldHVybk9iamVjdDsNCi0gICAgICAgIH0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBYbWxQYXJzaW5nRXhjZXB0aW9uKCJDb25zdHJ1Y3RvciBpbnZva2luZyBleGNlcHRpb24gZm9yIHR5cGUgIiArIHR5cGUuZ2V0TmFtZSgpKTsNCi0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBYbWxQYXJzaW5nRXhjZXB0aW9uKCJDb25zdHJ1Y3RvciBpbnZva2luZyBleGNlcHRpb24gZm9yIHR5cGUgIiArIHR5cGUuZ2V0TmFtZSgpKTsNCi0gICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFBhcnNpbmdFeGNlcHRpb24oIkNvbnN0cnVjdG9yIGludm9raW5nIGV4Y2VwdGlvbiBmb3IgdHlwZSAiICsgdHlwZS5nZXROYW1lKCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgT2JqZWN0IGdldFNpbXBsZVR5cGVPYmplY3QoVHlwZSB0eXBlLCBTdGF0ZWZ1bFhNTFN0cmVhbVJlYWRlciByZWFkZXIsIFN0cmluZyB2YWx1ZSkNCi0gICAgICAgICAgICB0aHJvd3MgIFhtbFBhcnNpbmdFeGNlcHRpb24gew0KLSAgICAgICAgT2JqZWN0IHJldHVybk9iamVjdDsNCi0gICAgICAgIFN0cmluZyBtZXRob2ROYW1lID0gbnVsbDsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgbWV0aG9kTmFtZSA9IGdldE1ldGhvZE5hbWUodHlwZS5nZXRKYXZhQ2xhc3MoKS5nZXROYW1lKCkpOw0KLSAgICAgICAgICAgIE1ldGhvZCAgbWV0aG9kVG9JbnZva2UgPSB0aGlzLnNpbXBsZVR5cGVIYW5kbGVyQ2xhc3MuZ2V0TWV0aG9kKG1ldGhvZE5hbWUsbmV3IENsYXNzW117U3RyaW5nLmNsYXNzfSk7DQotICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gbWV0aG9kVG9JbnZva2UuaW52b2tlKHRoaXMuc2ltcGxlVHlwZUhhbmRsZXIsbmV3IE9iamVjdFtde3ZhbHVlfSk7DQotICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBYbWxQYXJzaW5nRXhjZXB0aW9uKCJDYW4gbm90IGludm9rZSB0aGUgY29udmVydGVyIHV0aWwgY2xhc3MgbWV0aG9kICIgKyBtZXRob2ROYW1lLCBlKTsNCi0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBYbWxQYXJzaW5nRXhjZXB0aW9uKCJDYW4gbm90IGludm9rZSB0aGUgY29udmVydGVyIHV0aWwgY2xhc3MgbWV0aG9kICIgKyBtZXRob2ROYW1lLCBlKTsNCi0gICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBYbWxQYXJzaW5nRXhjZXB0aW9uKCJDYW4gbm90IGludm9rZSB0aGUgY29udmVydGVyIHV0aWwgY2xhc3MgbWV0aG9kICIgKyBtZXRob2ROYW1lLCBlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiByZXR1cm5PYmplY3Q7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0TWV0aG9kTmFtZShTdHJpbmcgY2xhc3NOYW1lKSB7DQotICAgICAgICAvLyBmaXJzdCBoYW5kbGUgc29tZSBleGNlcHRpb25hbCBjbGFzc2VzDQotICAgICAgICBpZiAoY2xhc3NOYW1lLmVxdWFscyhJbnRlZ2VyLmNsYXNzLmdldE5hbWUoKSkpIHsNCi0gICAgICAgICAgICByZXR1cm4gImNvbnZlcnRUb0ludCI7DQotICAgICAgICB9IGVsc2UgaWYgKGNsYXNzTmFtZS5lcXVhbHMoQ2FsZW5kYXIuY2xhc3MuZ2V0TmFtZSgpKSkgew0KLSAgICAgICAgICAgIHJldHVybiAiY29udmVydFRvRGF0ZVRpbWUiOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKGNsYXNzTmFtZS5pbmRleE9mKCIuIikgPiAtMSkgew0KLSAgICAgICAgICAgIGNsYXNzTmFtZSA9IGNsYXNzTmFtZS5zdWJzdHJpbmcoY2xhc3NOYW1lLmxhc3RJbmRleE9mKCIuIikgKyAxKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgLy8gdGhpcyBpcyBhIHByaW1pdGl2ZSB0eXBlIGNsYXNzDQotICAgICAgICAgICAgLy8gc28gY2FwaXRhbGl6ZSB0aGUgZmlyc3QgbGV0dGVyDQotICAgICAgICAgICAgY2xhc3NOYW1lID0gY2xhc3NOYW1lLnN1YnN0cmluZygwLCAxKS50b1VwcGVyQ2FzZSgpICsgY2xhc3NOYW1lLnN1YnN0cmluZygxKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiAiY29udmVydFRvIiArIGNsYXNzTmFtZTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogZ2l2ZSB0aGUgcmVsZXZhbnQgb2JqZWN0IGZvciBlbGVtZW50RmllbGQuDQotICAgICAqDQotICAgICAqIEBwYXJhbSByZWFkZXINCi0gICAgICogQHBhcmFtIGVsZW1lbnRGaWVsZA0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqIEB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uDQotICAgICAqIEB0aHJvd3MgWG1sUGFyc2luZ0V4Y2VwdGlvbg0KLSAgICAgKi8NCi0NCi0gICAgcHJpdmF0ZSBPYmplY3QgZ2V0T2JqZWN0Rm9yRWxlbWVudEZpZWxkKFN0YXRlZnVsWE1MU3RyZWFtUmVhZGVyIHJlYWRlciwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnRGaWVsZCBlbGVtZW50RmllbGQpDQotICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwNCi0gICAgICAgICAgICBYbWxQYXJzaW5nRXhjZXB0aW9uIHsNCi0gICAgICAgIFFOYW1lIGVsZW1lbnRGaWVsZFFOYW1lID0gbmV3IFFOYW1lKGVsZW1lbnRGaWVsZC5nZXROYW1lc3BhY2UoKSwgZWxlbWVudEZpZWxkLmdldE5hbWUoKSk7DQotICAgICAgICByZXR1cm4gZ2V0T2JqZWN0Rm9yRWxlbWVudChyZWFkZXIsDQotICAgICAgICAgICAgICAgIGVsZW1lbnRGaWVsZFFOYW1lLA0KLSAgICAgICAgICAgICAgICBlbGVtZW50RmllbGQuZ2V0VHlwZSgpLA0KLSAgICAgICAgICAgICAgICBlbGVtZW50RmllbGQuaXNBcnJheSgpLA0KLSAgICAgICAgICAgICAgICBlbGVtZW50RmllbGQuZ2V0RWxlbWVudCgpLmlzTmlsbGFibGUoKSwNCi0gICAgICAgICAgICAgICAgZWxlbWVudEZpZWxkLmdldEVsZW1lbnQoKS5pc01pbk9jY3VyczAoKSwNCi0gICAgICAgICAgICAgICAgZWxlbWVudEZpZWxkLmdldENsYXNzVHlwZSgpLA0KLSAgICAgICAgICAgICAgICBlbGVtZW50RmllbGQuZ2V0UHJvcGVydHlEZXNjcmlwdG9yKCkuZ2V0UHJvcGVydHlUeXBlKCkpOw0KLQ0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBlbGVtZW50IHBhcnNlciBjb3JyZXNwb25kcyB0byBwYXJzZSB0aGUgZWxlbWVudCAoZm9yIGFuIGF0dHJpYnV0ZSBvciBwYXJhbWV0ZXIpIGNvcnJlY3RseS4NCi0gICAgICogd2hlbiBjYWxsaW5nIHRvIHRoaXMgbWV0aG9kIHJlYWRlciBtdXN0IHBvaW50IHRvIHRoZSBzdGFydCBlbGVtZW50IG9mIHRoZSBlbGVtZW50LiBhbmQgd2hlbiByZXR1cm5pbmcNCi0gICAgICogaXQgc2hvdWxkIHBvaW50IHRvIHRoZSBjb3JyZXNwb25kaW5nIGVuZCBlbGVtZW50IG9mIHRoZSBlbGVtZW50Lg0KLSAgICAgKiBpZiB0aGUgZWxlbWVudCBpcyBhbiBhcnJheSBpdCBtYXkgcG9pbnQgdG8gdGhlIHN0YXJ0IGVsZW1lbnQgb2YgdGhlIG5leHQgZWxlbWVudC4NCi0gICAgICoNCi0gICAgICogQHBhcmFtIHJlYWRlcg0KLSAgICAgKiBAcGFyYW0gZWxlbWVudFFOYW1lDQotICAgICAqIEBwYXJhbSBlbGVtZW50VHlwZQ0KLSAgICAgKiBAcGFyYW0gaXNBcnJheQ0KLSAgICAgKiBAcGFyYW0gY2xhc3NUeXBlDQotICAgICAqIEBwYXJhbSBqYXZhQ2xhc3MgLSBpZiB0aGlzIGlzIGEgbGlzdCBqYXZhQ2xhc3MgZm9yIHRoZSBsaXN0DQotICAgICAqIEByZXR1cm4NCi0gICAgICogQHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24NCi0gICAgICogQHRocm93cyBYbWxQYXJzaW5nRXhjZXB0aW9uDQotICAgICAqLw0KLQ0KLSAgICBwcml2YXRlIE9iamVjdCBnZXRPYmplY3RGb3JFbGVtZW50KFN0YXRlZnVsWE1MU3RyZWFtUmVhZGVyIHJlYWRlciwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRTmFtZSBlbGVtZW50UU5hbWUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSBlbGVtZW50VHlwZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzQXJyYXksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc05pbGxhYmxlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNNaW5PY2N1cnMwLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGFzc1R5cGUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MgamF2YUNsYXNzKQ0KLSAgICAgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sDQotICAgICAgICAgICAgWG1sUGFyc2luZ0V4Y2VwdGlvbiB7DQotICAgICAgICAvLyBmaXJzdCB3ZSBoYXZlIHRvIHBvaW50IHRvIHRoZSByZWFkZXIgdG8gdGhlIGJlZ2lubmluZyBmb3IgdGhlIGVsZW1lbnQNCi0gICAgICAgIHdoaWxlICghcmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgJiYgIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkgew0KLSAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7DQotICAgICAgICB9DQotDQotICAgICAgICAvLyBmaXJzdCB2YWxpZGF0ZSB0aGUgYXR0cmlidXRlDQotICAgICAgICBpZiAocmVhZGVyLmdldE5hbWUoKS5lcXVhbHMoZWxlbWVudFFOYW1lKSkgew0KLQ0KLSAgICAgICAgICAgIFN0cmluZyBuaWxsYmxlID0gcmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKENvbnN0YW50cy5VUklfREVGQVVMVF9TQ0hFTUFfWFNJLCAibmlsIik7DQotICAgICAgICAgICAgLy8gYWN0dWFsIGVsZW1lbnQgdHlwZSBtYXkgYmUgZGlmZmVyZW50IGZyb20gdGhlIGVsZW1lbnQgdHlwZSBnaXZlbg0KLSAgICAgICAgICAgIC8vIGlmIGV4dGVuc2lvbnMgaGFzIHVzZWQuDQotICAgICAgICAgICAgVHlwZSBhY3R1YWxFbGVtZW50VHlwZSA9IGVsZW1lbnRUeXBlOw0KLSAgICAgICAgICAgIFFOYW1lIHR5cGVRTmFtZSA9IGdldFR5cGVRTmFtZShyZWFkZXIpOw0KLSAgICAgICAgICAgIGlmICgodHlwZVFOYW1lICE9IG51bGwpICYmICFlbGVtZW50VHlwZS5nZXRYbWxUeXBlKCkuZ2V0UW5hbWUoKS5lcXVhbHModHlwZVFOYW1lKSkgew0KLSAgICAgICAgICAgICAgICAvLyBpLmUgdGhpcyBpcyBhbiBleHRlbnNpb24gdHlwZQ0KLSAgICAgICAgICAgICAgICBpZiAodGhpcy5xTmFtZVRvVHlwZU1hcC5jb250YWluc0tleSh0eXBlUU5hbWUpKSB7DQotICAgICAgICAgICAgICAgICAgICBhY3R1YWxFbGVtZW50VHlwZSA9IChUeXBlKSB0aGlzLnFOYW1lVG9UeXBlTWFwLmdldCh0eXBlUU5hbWUpOw0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFBhcnNpbmdFeGNlcHRpb24oIlVua25vd24gdHlwZSBmb3VuZCA9PT4gIiArIHR5cGVRTmFtZSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgLy8gcG9pbnQgdG8gdGhlIGNvbXBsZXggdHlwZSBlbGVtZW50cw0KLSAgICAgICAgICAgIGlmIChpc0FycmF5KSB7DQotICAgICAgICAgICAgICAgIENvbGxlY3Rpb24gb2JqZWN0c0NvbGxlY3Rpb24gPSBnZXRDb2xsZWN0aW9uT2JqZWN0KGNsYXNzVHlwZSwgamF2YUNsYXNzKTsNCi0NCi0gICAgICAgICAgICAgICAgLy8gcmVhZCB0aGUgZmlyc3QgZWxlbWVudA0KLSAgICAgICAgICAgICAgICBpZiAoInRydWUiLmVxdWFscyhuaWxsYmxlKSB8fCAiMSIuZXF1YWxzKG5pbGxibGUpKSB7DQotICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIGEgbmlsbCBhdHRyaWJ1dGUNCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlICghcmVhZGVyLmlzRW5kRWxlbWVudCgpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGlmIChpc05pbGxhYmxlKXsNCi0gICAgICAgICAgICAgICAgICAgICAgIG9iamVjdHNDb2xsZWN0aW9uLmFkZChudWxsKTsNCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sUGFyc2luZ0V4Y2VwdGlvbigiRWxlbWVudCAiICsgZWxlbWVudFFOYW1lICsgIiBjYW4gbm90IGJlIG51bGwiKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0NCi0gICAgICAgICAgICAgICAgICAgIE9iamVjdCByZXR1cm5PYmplY3QgPSBnZXRFbGVtZW50T2JqZWN0RnJvbVJlYWRlcihhY3R1YWxFbGVtZW50VHlwZSwgcmVhZGVyKTsNCi0gICAgICAgICAgICAgICAgICAgIG9iamVjdHNDb2xsZWN0aW9uLmFkZChyZXR1cm5PYmplY3QpOw0KLQ0KLSAgICAgICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBtb3ZlIHRoZSBjdXJzb3IgdW50aWwgdGhlIGVuZCBlbGVtZW50IG9mIHRoaXMgYXR0cmlidXRlDQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoIXJlYWRlci5pc0VuZEVsZW1lbnQoKSB8fCAhcmVhZGVyLmdldE5hbWUoKS5lcXVhbHMoZWxlbWVudFFOYW1lKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYm9vbGVhbiBsb29wID0gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgd2hpbGUgKGxvb3ApIHsNCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlICghcmVhZGVyLmlzRW5kRWxlbWVudCgpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7DQotICAgICAgICAgICAgICAgICAgICAvLyBub3cgd2UgYXJlIGF0IHRoZSBlbmQgZWxlbWVudCBvZiB0aGUgZmlyc3QgZWxlbWVudA0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCFyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAmJiAhcmVhZGVyLmlzRW5kRWxlbWVudCgpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgIC8vIGluIHRoaXMgc3RlcCBpZiBpdCBpcyBhbiBlbmQgZWxlbWVudCB3ZSBoYXZlIGZvdW5kIGFuIGVuZCBlbGVtZW50DQotICAgICAgICAgICAgICAgICAgICAvLyBzbyBoYXZlIHRvIGV4aXQgZnJvbSB0aGUgbG9vcA0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc0VuZEVsZW1lbnQoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AgPSBmYWxzZTsNCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm93IGl0IHNob3VsZCBiZSBpbiBhIHN0YXJ0IGVsZW1lbnQNCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayB3aGV0aGVyIHN0aWxsIHdlIHJlYWQgdGhlIG9yaWdpbmFsIGVsZW1lbnQgYXR0cmlidXRlcy4gb3RoZXJ3aXNlIHJldHVybg0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuZ2V0TmFtZSgpLmVxdWFscyhlbGVtZW50UU5hbWUpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5pbGxibGUgPSByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoQ29uc3RhbnRzLlVSSV9ERUZBVUxUX1NDSEVNQV9YU0ksICJuaWwiKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2luY2UgdGhpcyBpcyBhIG5ldyBlbGVtZW50IHdlIGNoZWNrIGZvciBleHRlbnNpb25zDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbEVsZW1lbnRUeXBlID0gZWxlbWVudFR5cGU7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVRTmFtZSA9IGdldFR5cGVRTmFtZShyZWFkZXIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHR5cGVRTmFtZSAhPSBudWxsKSAmJiAhZWxlbWVudFR5cGUuZ2V0WG1sVHlwZSgpLmdldFFuYW1lKCkuZXF1YWxzKHR5cGVRTmFtZSkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGkuZSB0aGlzIGlzIGFuIGV4dGVuc2lvbiB0eXBlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5xTmFtZVRvVHlwZU1hcC5jb250YWluc0tleSh0eXBlUU5hbWUpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsRWxlbWVudFR5cGUgPSAoVHlwZSkgdGhpcy5xTmFtZVRvVHlwZU1hcC5nZXQodHlwZVFOYW1lKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFBhcnNpbmdFeGNlcHRpb24oIlVua25vd24gdHlwZSBmb3VuZCA9PT4gIiArIHR5cGVRTmFtZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCJ0cnVlIi5lcXVhbHMobmlsbGJsZSkgfHwgIjEiLmVxdWFscyhuaWxsYmxlKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBhIG5pbGwgYXR0cmlidXRlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNOaWxsYWJsZSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdHNDb2xsZWN0aW9uLmFkZChudWxsKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFBhcnNpbmdFeGNlcHRpb24oIkVsZW1lbnQgIiArIGVsZW1lbnRRTmFtZSArICIgY2FuIG5vdCBiZSBudWxsIik7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgcmV0dXJuT2JqZWN0ID0gZ2V0RWxlbWVudE9iamVjdEZyb21SZWFkZXIoYWN0dWFsRWxlbWVudFR5cGUsIHJlYWRlcik7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RzQ29sbGVjdGlvbi5hZGQocmV0dXJuT2JqZWN0KTsNCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gbW92ZSB0aGUgY3Vyc29yIHVudGlsIHRoZSBlbmQgZWxlbWVudCBvZiB0aGlzIGF0dHJpYnV0ZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCFyZWFkZXIuaXNFbmRFbGVtZW50KCkgfHwgIXJlYWRlci5nZXROYW1lKCkuZXF1YWxzKGVsZW1lbnRRTmFtZSkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcCA9IGZhbHNlOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIHZlcnkgaW1wb3J0YW50IGluIGhhbmRsaW5nIHByaW1pdGl2ZXMNCi0gICAgICAgICAgICAgICAgLy8gdGhleSBjYW4gbm90IGhhdmUgbnVsbCB2YWx1ZXMgc28gaWYgYXJyYXkgdGhlbiB3ZSBoYXZlIHRvIHJldHVybiB0aGUNCi0gICAgICAgICAgICAgICAgLy8gYXJyYXkgb2JqZWN0IGlzIG51bGwNCi0gICAgICAgICAgICAgICAgLy8gZm9yIG90aGVyIGFsc28gaXQgaXMgY29udmVuaWVudCB0byBhc3N1bWUgbGlrZSB0aGF0Lg0KLSAgICAgICAgICAgICAgICBpZiAoKENvbnN0YW50cy5PVEhFUl9UWVBFICYgY2xhc3NUeXBlKSA9PSBDb25zdGFudHMuT1RIRVJfVFlQRSl7DQotICAgICAgICAgICAgICAgICAgICAvLyBpLmUgdGhpcyBpcyBub3QgYSBjb2xsZWN0aW9uIHR5cGUNCi0gICAgICAgICAgICAgICAgICAgIExpc3Qgb2JqZWN0c0xpc3QgPSAoTGlzdCkgb2JqZWN0c0NvbGxlY3Rpb247DQotICAgICAgICAgICAgICAgICAgICBpZiAoKG9iamVjdHNDb2xsZWN0aW9uLnNpemUoKSA9PSAwKSB8fA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKG9iamVjdHNDb2xsZWN0aW9uLnNpemUoKSA9PSAxKSAmJiAob2JqZWN0c0xpc3QuZ2V0KDApID09IG51bGwpKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgYW4gYXJyYXkgd2l0aCB0aGUgb3JpZ2luYWwgZWxlbWVudCB0eXBlDQotICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IG9iamVjdEFycmF5ID0gQXJyYXkubmV3SW5zdGFuY2UoZWxlbWVudFR5cGUuZ2V0SmF2YUNsYXNzKCksIG9iamVjdHNDb2xsZWN0aW9uLnNpemUoKSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvYmplY3RzQ29sbGVjdGlvbi5zaXplKCk7IGkrKykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheS5zZXQob2JqZWN0QXJyYXksIGksIG9iamVjdHNMaXN0LmdldChpKSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvYmplY3RBcnJheTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgoQ29uc3RhbnRzLkNPTExFQ1RJT05fVFlQRSAmIGNsYXNzVHlwZSkgPT0gQ29uc3RhbnRzLkNPTExFQ1RJT05fVFlQRSl7DQotICAgICAgICAgICAgICAgICAgICAgaWYgKChvYmplY3RzQ29sbGVjdGlvbi5zaXplKCkgPT0gMCkgfHwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgob2JqZWN0c0NvbGxlY3Rpb24uc2l6ZSgpID09IDEpICYmIChvYmplY3RzQ29sbGVjdGlvbi5pdGVyYXRvcigpLm5leHQoKSA9PSBudWxsKSkpew0KLSAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2JqZWN0c0NvbGxlY3Rpb247DQotICAgICAgICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChDb25zdGFudHMuTUFQX1RZUEUgJiBjbGFzc1R5cGUpID09IENvbnN0YW50cy5NQVBfVFlQRSl7DQotDQotICAgICAgICAgICAgICAgICAgICBpZiAoKG9iamVjdHNDb2xsZWN0aW9uLnNpemUoKSA9PSAwKSB8fA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKG9iamVjdHNDb2xsZWN0aW9uLnNpemUoKSA9PSAxKSAmJiAob2JqZWN0c0NvbGxlY3Rpb24uaXRlcmF0b3IoKS5uZXh0KCkgPT0gbnVsbCkpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotDQotICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgIExpc3QgbWFwT2JqZWN0c0xpc3QgPSAoTGlzdCkgb2JqZWN0c0NvbGxlY3Rpb247DQotICAgICAgICAgICAgICAgICAgICAgICAgTWFwVHlwZSBtYXBUeXBlID0gbnVsbDsNCi0gICAgICAgICAgICAgICAgICAgICAgICBNYXAgbWFwT2JqZWN0ID0gbnVsbDsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoamF2YUNsYXNzLmlzSW50ZXJmYWNlKCkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwT2JqZWN0ID0gbmV3IEhhc2hNYXAoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwT2JqZWN0ID0gKE1hcCkgamF2YUNsYXNzLm5ld0luc3RhbmNlKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFBhcnNpbmdFeGNlcHRpb24oIkNhbiBub3QgaW5zdGFudGlhdGUgdGhlIGphdmEgY2xhc3MgIiArIGphdmFDbGFzcy5nZXROYW1lKCksIGUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBYbWxQYXJzaW5nRXhjZXB0aW9uKCJDYW4gbm90IGluc3RhbnRpYXRlIHRoZSBqYXZhIGNsYXNzICIgKyBqYXZhQ2xhc3MuZ2V0TmFtZSgpLCBlKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBtYXBPYmplY3RzTGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwVHlwZSA9IChNYXBUeXBlKSBpdGVyLm5leHQoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwT2JqZWN0LnB1dChtYXBUeXBlLmdldEtleSgpLCBtYXBUeXBlLmdldFZhbHVlKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWFwT2JqZWN0Ow0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFBhcnNpbmdFeGNlcHRpb24oIlVua25vdyBjbGFzcyB0eXBlICIgKyBjbGFzc1R5cGUpOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgaWYgKCJ0cnVlIi5lcXVhbHMobmlsbGJsZSkgfHwgIjEiLmVxdWFscyhuaWxsYmxlKSkgew0KLSAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBhIG5pbGwgYXR0cmlidXRlDQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzTmlsbGFibGUpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFBhcnNpbmdFeGNlcHRpb24oIkVsZW1lbnQgIiArIGVsZW1lbnRRTmFtZSArICIgY2FuIG5vdCBiZSBudWxsIik7DQotICAgICAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotDQotICAgICAgICAgICAgICAgICAgICBPYmplY3QgcmV0dXJuT2JqZWN0ID0gZ2V0RWxlbWVudE9iamVjdEZyb21SZWFkZXIoYWN0dWFsRWxlbWVudFR5cGUsIHJlYWRlcik7DQotICAgICAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHRvIG1vdmUgdGhlIGN1cnNvciB1bnRpbCB0aGUgZW5kIGVsZW1lbnQgb2YgdGhpcyBhdHRyaWJ1dGUNCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlICghcmVhZGVyLmlzRW5kRWxlbWVudCgpIHx8ICFyZWFkZXIuZ2V0TmFtZSgpLmVxdWFscyhlbGVtZW50UU5hbWUpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5PYmplY3Q7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGlmIChpc01pbk9jY3VyczApIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFBhcnNpbmdFeGNlcHRpb24oIlVuZXhwZWN0ZWQgU3ViZWxlbWVudCAiICsgcmVhZGVyLmdldE5hbWUoKSArICIgYnV0ICIgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCAiICsgZWxlbWVudFFOYW1lLmdldExvY2FsUGFydCgpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBPYmplY3QgZ2V0RWxlbWVudE9iamVjdEZyb21SZWFkZXIoVHlwZSBlbGVtZW50VHlwZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdGVmdWxYTUxTdHJlYW1SZWFkZXIgcmVhZGVyKQ0KLSAgICAgICAgICAgIHRocm93cyBYbWxQYXJzaW5nRXhjZXB0aW9uLCBYTUxTdHJlYW1FeGNlcHRpb24gew0KLSAgICAgICAgT2JqZWN0IHJldHVybk9iamVjdCA9IG51bGw7DQotICAgICAgICBpZiAoUk1JQmVhbi5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGVsZW1lbnRUeXBlLmdldEphdmFDbGFzcygpKSkgew0KLSAgICAgICAgICAgIC8vIHRoaXMgaXMgYW4gcm1pIGJlYW4NCi0gICAgICAgICAgICAvLyBzbyBpbnZva2UgdGhlIHN0YXRpYyBwYXJzZSBtZXRob2QNCi0gICAgICAgICAgICB0cnkgew0KLSAgICAgICAgICAgICAgICBNZXRob2QgcGFyc2VNZXRob2QgPSBlbGVtZW50VHlwZS5nZXRKYXZhQ2xhc3MoKS5nZXRNZXRob2QoInBhcnNlIiwgbmV3IENsYXNzW117WE1MU3RyZWFtUmVhZGVyLmNsYXNzLCBYbWxTdHJlYW1QYXJzZXIuY2xhc3N9KTsNCi0gICAgICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gcGFyc2VNZXRob2QuaW52b2tlKG51bGwsIG5ldyBPYmplY3RbXXtyZWFkZXIsIHRoaXN9KTsNCi0gICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sUGFyc2luZ0V4Y2VwdGlvbigicGFyc2UgbWV0aG9kIGhhcyBub3QgYmVlbiBpbXBsZW1lbnRlZCBjb3JyZWN0bHkgZm9yIHRoZSBybWkgYmVhbiAiDQotICAgICAgICAgICAgICAgICAgICAgICAgKyBlbGVtZW50VHlwZS5nZXRKYXZhQ2xhc3MoKS5nZXROYW1lKCksIGUpOw0KLSAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sUGFyc2luZ0V4Y2VwdGlvbigiY2FuIG5vdCBhY2Nlc3MgcGFyc2UgbWV0aG9kIG9mIHRoZSBybWkgYmVhbiAiDQotICAgICAgICAgICAgICAgICAgICAgICAgKyBlbGVtZW50VHlwZS5nZXRKYXZhQ2xhc3MoKS5nZXROYW1lKCksIGUpOw0KLSAgICAgICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sUGFyc2luZ0V4Y2VwdGlvbigiY2FuIG5vdCBpbnZva2UgcGFyc2UgbWV0aG9kIG9mIHRoZSBybWkgYmVhbiAiDQotICAgICAgICAgICAgICAgICAgICAgICAgKyBlbGVtZW50VHlwZS5nZXRKYXZhQ2xhc3MoKS5nZXROYW1lKCksIGUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgLy8gcmVhZCB0aGUgYXR0cmlidXRlcy4NCi0gICAgICAgICAgICBNYXAgamF2YU1ldGhvZFRvVmFsdWVNYXAgPSBnZXRKYXZhTWV0aG9kVmFsdWVIYXNoTWFwKGVsZW1lbnRUeXBlLCByZWFkZXIpOw0KLSAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7DQotICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gZ2V0T2JqZWN0Rm9yVHlwZShyZWFkZXIsIGVsZW1lbnRUeXBlKTsNCi0gICAgICAgICAgICBwb3B1bGF0ZU9iamVjdEF0dHJpYnV0ZXMoamF2YU1ldGhvZFRvVmFsdWVNYXAsIHJldHVybk9iamVjdCk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmV0dXJuT2JqZWN0Ow0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBwb3B1bGF0ZU9iamVjdEF0dHJpYnV0ZXMoTWFwIGphdmFNZXRob2RUb1ZhbHVlTWFwLCBPYmplY3QgcmV0dXJuT2JqZWN0KSB0aHJvd3MgWG1sUGFyc2luZ0V4Y2VwdGlvbiB7DQotICAgICAgICBNZXRob2QgamF2YU1laHRvZDsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gamF2YU1ldGhvZFRvVmFsdWVNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTtpdGVyLmhhc05leHQoKTspew0KLSAgICAgICAgICAgICAgICBqYXZhTWVodG9kID0gKE1ldGhvZCkgaXRlci5uZXh0KCk7DQotICAgICAgICAgICAgICAgIGphdmFNZWh0b2QuaW52b2tlKHJldHVybk9iamVjdCxuZXcgT2JqZWN0W117amF2YU1ldGhvZFRvVmFsdWVNYXAuZ2V0KGphdmFNZWh0b2QpfSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFBhcnNpbmdFeGNlcHRpb24oIkNhbiBub3Qgc2V0IHRoZSBhdHRyaWJ1dGUgdmFsdWUiKTsNCi0gICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBYbWxQYXJzaW5nRXhjZXB0aW9uKCJDYW4gbm90IHNldCB0aGUgYXR0cmlidXRlIHZhbHVlIik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBNYXAgZ2V0SmF2YU1ldGhvZFZhbHVlSGFzaE1hcChUeXBlIGFjdHVhbEVsZW1lbnRUeXBlLCBTdGF0ZWZ1bFhNTFN0cmVhbVJlYWRlciByZWFkZXIpDQotICAgICAgICAgICAgdGhyb3dzIFhtbFBhcnNpbmdFeGNlcHRpb24gew0KLSAgICAgICAgQXR0cmlidXRlRmllbGQgYXR0cmlidXRlRmllbGQ7DQotICAgICAgICBTdHJpbmcgYXR0cmlidXRlVmxhdWU7DQotICAgICAgICBPYmplY3QgYXR0cmlidXRlT2JqZWN0Ow0KLSAgICAgICAgTWFwIGphdmFNZXRob2RUb1ZhbHVlTWFwID0gbmV3IEhhc2hNYXAoKTsNCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGFjdHVhbEVsZW1lbnRUeXBlLmdldEFsbEF0dHJpYnV0ZUZpZWxkcygpLml0ZXJhdG9yKCk7aXRlci5oYXNOZXh0KCk7KXsNCi0gICAgICAgICAgICBhdHRyaWJ1dGVGaWVsZCA9IChBdHRyaWJ1dGVGaWVsZCkgaXRlci5uZXh0KCk7DQotICAgICAgICAgICAgYXR0cmlidXRlVmxhdWUgPSByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoYXR0cmlidXRlRmllbGQuZ2V0TmFtZXNwYWNlKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZUZpZWxkLmdldE5hbWUoKSk7DQotICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVZsYXVlICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgYXR0cmlidXRlT2JqZWN0ID0gZ2V0U2ltcGxlVHlwZU9iamVjdChhdHRyaWJ1dGVGaWVsZC5nZXRUeXBlKCksIHJlYWRlciwgYXR0cmlidXRlVmxhdWUpOw0KLSAgICAgICAgICAgICAgICBqYXZhTWV0aG9kVG9WYWx1ZU1hcC5wdXQoYXR0cmlidXRlRmllbGQuZ2V0U2V0dGVyTWV0aG9kKCksIGF0dHJpYnV0ZU9iamVjdCk7DQotICAgICAgICAgICAgfSBlbHNlIGlmIChhdHRyaWJ1dGVGaWVsZC5pc1JlcXVyaWVkKCkpew0KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sUGFyc2luZ0V4Y2VwdGlvbigiUmVxdWlyZWQgYXR0cmlidXRlICIgKyBhdHRyaWJ1dGVGaWVsZC5nZXROYW1lKCkgKyAiIGlzIG1pc3NpbmciKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gamF2YU1ldGhvZFRvVmFsdWVNYXA7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIHJldHVybnMgdGhlIGNvbGxlY3Rpb24gb2JqZWN0IGFjY29yZGluZyB0byB0aGUgdHlwZS4NCi0gICAgICogQHBhcmFtIGNsYXNzVHlwZQ0KLSAgICAgKiBAcGFyYW0gamF2YUNsYXNzDQotICAgICAqIEByZXR1cm4NCi0gICAgICogQHRocm93cyBYbWxQYXJzaW5nRXhjZXB0aW9uDQotICAgICAqLw0KLQ0KLSAgICBwcml2YXRlIENvbGxlY3Rpb24gZ2V0Q29sbGVjdGlvbk9iamVjdChpbnQgY2xhc3NUeXBlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyBqYXZhQ2xhc3MpDQotICAgICAgICAgICAgdGhyb3dzIFhtbFBhcnNpbmdFeGNlcHRpb24gew0KLQ0KLSAgICAgICAgQ29sbGVjdGlvbiBvYmplY3RzQ29sbGVjdGlvbiA9IG51bGw7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIGlmICgoQ29uc3RhbnRzLk9USEVSX1RZUEUgJiBjbGFzc1R5cGUpID09IENvbnN0YW50cy5PVEhFUl9UWVBFKSB7DQotICAgICAgICAgICAgICAgIC8vIGkuZSB0aGlzIGlzIG5vdCBhIGxpc3Qgb3IgYSBtYXANCi0gICAgICAgICAgICAgICAgb2JqZWN0c0NvbGxlY3Rpb24gPSBuZXcgQXJyYXlMaXN0KCk7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgaWYgKGphdmFDbGFzcy5pc0ludGVyZmFjZSgpKSB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoKENvbnN0YW50cy5MSVNUX1RZUEUgJiBjbGFzc1R5cGUpID09IENvbnN0YW50cy5MSVNUX1RZUEUpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgIG9iamVjdHNDb2xsZWN0aW9uID0gbmV3IEFycmF5TGlzdCgpOw0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgoQ29uc3RhbnRzLlNFVF9UWVBFICYgY2xhc3NUeXBlKSA9PSBDb25zdGFudHMuU0VUX1RZUEUpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgIG9iamVjdHNDb2xsZWN0aW9uID0gbmV3IEhhc2hTZXQoKTsNCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKENvbnN0YW50cy5DT0xMRUNUSU9OX1RZUEUgJiBjbGFzc1R5cGUpID09IENvbnN0YW50cy5DT0xMRUNUSU9OX1RZUEUpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgIG9iamVjdHNDb2xsZWN0aW9uID0gbmV3IEFycmF5TGlzdCgpOw0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgoQ29uc3RhbnRzLk1BUF9UWVBFICYgY2xhc3NUeXBlKSA9PSBDb25zdGFudHMuTUFQX1RZUEUpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgIG9iamVjdHNDb2xsZWN0aW9uID0gbmV3IEFycmF5TGlzdCgpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChDb25zdGFudHMuQ09MTEVDVElPTl9UWVBFICYgY2xhc3NUeXBlKSA9PSBDb25zdGFudHMuQ09MTEVDVElPTl9UWVBFKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0c0NvbGxlY3Rpb24gPSAoQ29sbGVjdGlvbikgamF2YUNsYXNzLm5ld0luc3RhbmNlKCk7DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChDb25zdGFudHMuTUFQX1RZUEUgJiBjbGFzc1R5cGUpID09IENvbnN0YW50cy5NQVBfVFlQRSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdHNDb2xsZWN0aW9uID0gbmV3IEFycmF5TGlzdCgpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFBhcnNpbmdFeGNlcHRpb24oIlByb2JsZW0gd2l0aCBpbnN0YW5jaWF0aW5nIHRoZSBlbGVtZW50IGNsYXNzICIgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmFDbGFzcy5nZXROYW1lKCkgLCBlKTsNCi0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBYbWxQYXJzaW5nRXhjZXB0aW9uKCJQcm9ibGVtIHdpdGggaW5zdGFuY2lhdGluZyB0aGUgZWxlbWVudCBjbGFzcyAiICsNCi0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhQ2xhc3MuZ2V0TmFtZSgpICwgZSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gb2JqZWN0c0NvbGxlY3Rpb247DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIHJlYWRlciBtdXN0IGJlIGF0IHRoZSBzdGFydCBvZiB0aGUgZWxlbWVudA0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gcmVhZGVyDQotICAgICAqIEByZXR1cm4gcU5hbWUgZm9yIHRoZSB0eXBlIGF0dHJpYnV0ZQ0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBRTmFtZSBnZXRUeXBlUU5hbWUoU3RhdGVmdWxYTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7DQotICAgICAgICBRTmFtZSB0eXBlUU5hbWUgPSBudWxsOw0KLSAgICAgICAgU3RyaW5nIHR5cGVWYWx1ZSA9IHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZShDb25zdGFudHMuVVJJXzIwMDFfU0NIRU1BX1hTSSwgInR5cGUiKTsNCi0gICAgICAgIGlmICgodHlwZVZhbHVlICE9IG51bGwpICYmICF0eXBlVmFsdWUuZXF1YWxzKCIiKSkgew0KLSAgICAgICAgICAgIGludCBpbmRleCA9IHR5cGVWYWx1ZS5pbmRleE9mKCI6Iik7DQotICAgICAgICAgICAgU3RyaW5nIG5zUHJlZml4ID0gIiI7DQotICAgICAgICAgICAgaWYgKGluZGV4ID4gLTEpIHsNCi0gICAgICAgICAgICAgICAgbnNQcmVmaXggPSB0eXBlVmFsdWUuc3Vic3RyaW5nKDAsIGluZGV4KTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgU3RyaW5nIGxvY2FsUGFydCA9IHR5cGVWYWx1ZS5zdWJzdHJpbmcoaW5kZXggKyAxKTsNCi0gICAgICAgICAgICB0eXBlUU5hbWUgPSBuZXcgUU5hbWUocmVhZGVyLmdldE5hbWVzcGFjZVVSSShuc1ByZWZpeCksIGxvY2FsUGFydCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gdHlwZVFOYW1lOw0KLSAgICB9DQotDQotICAgIC8qKiANCi0gICAgICogRGV0ZXJtaW5lIGlmIHRoZSByZWFkZXIgaGFzIGJlZW4gYWR2YW5jZWQgYmV5b25kIGl0cyBpbml0aWFsIGxvY2F0aW9uLCBwcmlvciANCi0gICAgICogdG8gdGhlIG1ldGhvZHMgd2l0aGluIFhtbFN0cmVhbVBhcnNlciBiZWluZyBjYWxsZWQuDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gcmVhZGVyIFRoZSBYTUxTdHJlYW1SZWFkZXIgb24gd2hpY2ggdGhlIFhtbFN0cmVhbVBhcnNlciBpcyBhY3RpbmcuDQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVhZGVyIGhhcyBiZWVuIGFkdmFuY2VkIGJleW9uZCBpdHMgaW5pdGlhbCBsb2NhdGlvbiwgZmFsc2Ugb3RoZXJ3aXNlDQotICAgICAqLw0KLSAgICBwcml2YXRlIGJvb2xlYW4gZGV0ZXJtaW5lUHJpb3JBY2Nlc3MoWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgew0KLSAgICAgICAgaWYgKCFwcmlvckFjY2Vzc0RldGVybWluZWQpIHsNCi0gICAgICAgICAgICBpZiAocmVhZGVyLmdldExvY2F0aW9uKCkuZ2V0Q2hhcmFjdGVyT2Zmc2V0KCkgPT0gMCkNCi0gICAgICAgICAgICAgICAgcmVhZGVyUHJpb3JBY2Nlc3MgPSBmYWxzZTsNCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgICAgIHJlYWRlclByaW9yQWNjZXNzID0gdHJ1ZTsNCi0NCi0gICAgICAgICAgICBwcmlvckFjY2Vzc0RldGVybWluZWQgPSB0cnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHJlYWRlclByaW9yQWNjZXNzOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBQcm92aWRlIGEgbWVjaGFuaXNtIChhIHN0YWNrKSB0byB0cmFjayB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgWE1MU3RyZWFtDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gcmVhZGVyX2luIHRoZSBYTUxTdHJlYW1SZWFkZXIgdGhhdCB0aGUgWG1sU3RyZWFtUGFyc2VyIGlzIGFjdGluZyBvbg0KLSAgICAgKiBAcmV0dXJuIGEgU3RhdGVmdWxYTUxTdHJlYW1SZWFkZXIgdG8gbW9uaXRvciB0aGUgc3RhdGUgb2YgdGhlIFhNTFN0cmVhbVJlYWRlcg0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBTdGF0ZWZ1bFhNTFN0cmVhbVJlYWRlciBnZXRTdGF0ZWZ1bFJlYWRlcihYTUxTdHJlYW1SZWFkZXIgcmVhZGVyX2luKSB7DQotICAgICAgICBpZiAocmVhZGVyX2luIGluc3RhbmNlb2YgU3RhdGVmdWxYTUxTdHJlYW1SZWFkZXIpICAgICAgICAgICAgDQotICAgICAgICAgICAgcmV0dXJuIChTdGF0ZWZ1bFhNTFN0cmVhbVJlYWRlcikgcmVhZGVyX2luOw0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHJldHVybiBuZXcgU3RhdGVmdWxYTUxTdHJlYW1SZWFkZXIocmVhZGVyX2luLCByZWFkZXJQcmlvckFjY2Vzcyk7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBBZHZhbmNlIHRoZSByZWFkZXIgdG8gcG9pbnQgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgZWxlbWVudA0KLSAgICAgKiBAcGFyYW0gcmVhZGVyIHRoZSBTdGF0ZWZ1bFhNTFN0cmVhbVJlYWRlciB3ZSBhcmUgdXNpbmcgdG8gcGFyc2UgdGhlIFhNTFN0cmVhbQ0KLSAgICAgKi8NCi0gICAgDQotICAgIHByaXZhdGUgdm9pZCBhZHZhbmNlVG9GaXJzdEVsZW1lbnQoU3RhdGVmdWxYTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsNCi0gICAgDQotICAgICAgICBpZiAocmVhZGVyUHJpb3JBY2Nlc3MpIHsNCi0gICAgICAgICAgICB3aGlsZSAoIXJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICYmICFyZWFkZXIuaXNFbmRFbGVtZW50KCkgJiYgcmVhZGVyLmhhc05leHQoKSkgew0KLSAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgd2hpbGUgKHJlYWRlci5nZXREZXB0aCgpID09IDAgJiYgcmVhZGVyLmhhc05leHQoKSkgew0KLSAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL2RlcGxveS9DbGFzc0RlcGxveWVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL2RlcGxveS9DbGFzc0RlcGxveWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjODY4NTIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kZXBsb3kvQ2xhc3NEZXBsb3llci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5ybWkuZGVwbG95OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uV1NETDExVG9BeGlzU2VydmljZUJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmV4Y2VwdGlvbi5NZXRhRGF0YVBvcHVsYXRlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmV4Y2VwdGlvbi5TY2hlbWFHZW5lcmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLm1ldGFkYXRhLk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS5TZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLnJlY2VpdmVyLlJNSU1lc3NhZ2VSZWNpZXZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS53c2RsLldTREwxMURlZmluaXRpb25CdWlsZGVyOwotCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0KLXB1YmxpYyBjbGFzcyBDbGFzc0RlcGxveWVyIHsKLQotICAgIHByaXZhdGUgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlndXJhdGlvbkNvbnRleHQ7Ci0gICAgcHJpdmF0ZSBDb25maWd1cmF0b3IgY29uZmlndXJhdG9yOwotICAgIHByaXZhdGUgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXI7Ci0KLSAgICBwdWJsaWMgQ2xhc3NEZXBsb3llcihDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWd1cmF0aW9uQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikgewotICAgICAgICB0aGlzKGNvbmZpZ3VyYXRpb25Db250ZXh0LCBjbGFzc0xvYWRlciwgbmV3IENvbmZpZ3VyYXRvcigpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2xhc3NEZXBsb3llcihDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWd1cmF0aW9uQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc0xvYWRlciBjbGFzc0xvYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0b3IgY29uZmlndXJhdG9yKSB7Ci0gICAgICAgIHRoaXMuY29uZmlndXJhdGlvbkNvbnRleHQgPSBjb25maWd1cmF0aW9uQ29udGV4dDsKLSAgICAgICAgdGhpcy5jbGFzc0xvYWRlciA9IGNsYXNzTG9hZGVyOwotICAgICAgICB0aGlzLmNvbmZpZ3VyYXRvciA9IGNvbmZpZ3VyYXRvcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2xhc3NEZXBsb3llcihDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWd1cmF0aW9uQ29udGV4dCkgewotICAgICAgICB0aGlzKGNvbmZpZ3VyYXRpb25Db250ZXh0LCBuZXcgQ29uZmlndXJhdG9yKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBDbGFzc0RlcGxveWVyKENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ3VyYXRpb25Db250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRvciBjb25maWd1cmF0b3IpIHsKLSAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uQ29udGV4dCA9IGNvbmZpZ3VyYXRpb25Db250ZXh0OwotICAgICAgICB0aGlzLmNvbmZpZ3VyYXRvciA9IGNvbmZpZ3VyYXRvcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkZXBsb3lDbGFzcyhDbGFzcyBzZXJ2aWNlQ2xhc3MpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgU2VydmljZShzZXJ2aWNlQ2xhc3MsIHRoaXMuY29uZmlndXJhdG9yKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNlcnZpY2UucG9wdWxhdGVNZXRhRGF0YSgpOwotICAgICAgICAgICAgc2VydmljZS5nZW5lcmF0ZVNjaGVtYSgpOwotICAgICAgICAgICAgV1NETDExRGVmaW5pdGlvbkJ1aWxkZXIgZGVmaW5pdGlvbkJ1aWxkZXIgPSBuZXcgV1NETDExRGVmaW5pdGlvbkJ1aWxkZXIoc2VydmljZSk7Ci0gICAgICAgICAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSBkZWZpbml0aW9uQnVpbGRlci5nZW5lcmF0ZVdTREwoKTsKLQotICAgICAgICAgICAgV1NETDExVG9BeGlzU2VydmljZUJ1aWxkZXIgYnVpbGRlciA9IG5ldyBXU0RMMTFUb0F4aXNTZXJ2aWNlQnVpbGRlcihkZWZpbml0aW9uLCBudWxsLCBudWxsKTsKLSAgICAgICAgICAgIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlID0gYnVpbGRlci5wb3B1bGF0ZVNlcnZpY2UoKTsKLSAgICAgICAgICAgIGF4aXNTZXJ2aWNlLnNldENsYXNzTG9hZGVyKHRoaXMuY2xhc3NMb2FkZXIpOwotICAgICAgICAgICAgYXhpc1NlcnZpY2UuYWRkUGFyYW1ldGVyKG5ldyBQYXJhbWV0ZXIoInVzZU9yaWdpbmFsd3NkbCIsICJ0cnVlIikpOwotICAgICAgICAgICAgYXhpc1NlcnZpY2UuYWRkUGFyYW1ldGVyKG5ldyBQYXJhbWV0ZXIoIm1vZGlmeVVzZXJXU0RMUG9ydEFkZHJlc3MiLCAidHJ1ZSIpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgTGlzdCBvcGVyYXRpb25zID0gc2VydmljZS5nZXRPcGVyYXRpb25zKCk7Ci0gICAgICAgICAgICBPcGVyYXRpb24gb3BlcmF0aW9uID0gbnVsbDsKLSAgICAgICAgICAgIFFOYW1lIHFOYW1lID0gbnVsbDsKLSAgICAgICAgICAgIEF4aXNPcGVyYXRpb24gYXhpc09wZXJhdGlvbiA9IG51bGw7Ci0gICAgICAgICAgICBSTUlNZXNzYWdlUmVjaWV2ZXIgbWVzc2FnZVJlY2lldmVyID0gbmV3IFJNSU1lc3NhZ2VSZWNpZXZlcihzZXJ2aWNlKTsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IG9wZXJhdGlvbnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgb3BlcmF0aW9uID0gKE9wZXJhdGlvbikgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgcU5hbWUgPSBuZXcgUU5hbWUob3BlcmF0aW9uLmdldE5hbWVzcGFjZSgpLCBvcGVyYXRpb24uZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICBheGlzT3BlcmF0aW9uID0gYXhpc1NlcnZpY2UuZ2V0T3BlcmF0aW9uKHFOYW1lKTsKLSAgICAgICAgICAgICAgICBheGlzT3BlcmF0aW9uLnNldE1lc3NhZ2VSZWNlaXZlcihtZXNzYWdlUmVjaWV2ZXIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjb25maWd1cmF0aW9uQ29udGV4dC5kZXBsb3lTZXJ2aWNlKGF4aXNTZXJ2aWNlKTsKLSAgICAgICAgfSBjYXRjaCAoTWV0YURhdGFQb3B1bGF0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBBeGlzRmF1bHQubWFrZUZhdWx0KGUpOwotICAgICAgICB9IGNhdGNoIChTY2hlbWFHZW5lcmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEF4aXNGYXVsdC5tYWtlRmF1bHQoZSk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kZXBsb3kvUk1JU2VydmljZURlcGxveWVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL2RlcGxveS9STUlTZXJ2aWNlRGVwbG95ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY1MmI0ZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL2RlcGxveS9STUlTZXJ2aWNlRGVwbG95ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLmRlcGxveTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5TdEFYVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC5EZXBsb3llcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQuRGVwbG95bWVudEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQucmVwb3NpdG9yeS51dGlsLkRlcGxveW1lbnRGaWxlRGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5Db25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZGF0YWJpbmQuU2ltcGxlVHlwZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZGF0YWJpbmQuWG1sU3RyZWFtUGFyc2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmRlcGxveS5jb25maWcuQ2xhc3NJbmZvOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmRlcGxveS5jb25maWcuQ29uZmlnOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmRlcGxveS5jb25maWcuQ3VzdG9tQ2xhc3NJbmZvOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmRlcGxveS5jb25maWcuRmllbGRJbmZvOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmRlcGxveS5jb25maWcuUGFja2FnZVRvTmFtZXNwYWNlTWFwOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmRlcGxveS5jb25maWcuU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5leGNlcHRpb24uQ29uZmlnRmlsZVJlYWRpbmdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZXhjZXB0aW9uLk1ldGFEYXRhUG9wdWxhdGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZXhjZXB0aW9uLlNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZXhjZXB0aW9uLlhtbFBhcnNpbmdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEuUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5Mb2FkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5OwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwSW5wdXRTdHJlYW07Ci0KLQotcHVibGljIGNsYXNzIFJNSVNlcnZpY2VEZXBsb3llciBpbXBsZW1lbnRzIERlcGxveWVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhSTUlTZXJ2aWNlRGVwbG95ZXIuY2xhc3MpOwotICAgIHByaXZhdGUgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlndXJhdGlvbkNvbnRleHQ7Ci0gICAgcHJpdmF0ZSBBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlndXJhdGlvbjsKLQotICAgIHB1YmxpYyB2b2lkIGluaXQoQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ3R4KSB7Ci0gICAgICAgIHRoaXMuY29uZmlndXJhdGlvbkNvbnRleHQgPSBjb25maWdDdHg7Ci0gICAgICAgIHRoaXMuYXhpc0NvbmZpZ3VyYXRpb24gPSB0aGlzLmNvbmZpZ3VyYXRpb25Db250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCk7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkZXBsb3koRGVwbG95bWVudEZpbGVEYXRhIGRlcGxveW1lbnRGaWxlRGF0YSkgdGhyb3dzIERlcGxveW1lbnRFeGNlcHRpb24gewotICAgICAgICBib29sZWFuIGlzRGlyZWN0b3J5ID0gZGVwbG95bWVudEZpbGVEYXRhLmdldEZpbGUoKS5pc0RpcmVjdG9yeSgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZGVwbG95bWVudEZpbGVEYXRhLnNldENsYXNzTG9hZGVyKGlzRGlyZWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXhpc0NvbmZpZ3VyYXRpb24uZ2V0U2VydmljZUNsYXNzTG9hZGVyKCksCi0gICAgICAgICAgICAgICAgICAgIChGaWxlKXRoaXMuYXhpc0NvbmZpZ3VyYXRpb24uZ2V0UGFyYW1ldGVyVmFsdWUoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uQVJUSUZBQ1RTX1RFTVBfRElSKSk7Ci0KLSAgICAgICAgICAgIENsYXNzTG9hZGVyIGRlcGxveW1lbnRDbGFzc0xvYWRlciA9IGRlcGxveW1lbnRGaWxlRGF0YS5nZXRDbGFzc0xvYWRlcigpOwotICAgICAgICAgICAgU3RyaW5nIGFic29sdXRlUGF0aCA9IGRlcGxveW1lbnRGaWxlRGF0YS5nZXRGaWxlKCkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0KLSAgICAgICAgICAgIC8vIGdldHR0aW5nIHRoZSBmaWxlIHJlYWRlciBmb3IgemlwaW5wdXQgc3RyZWFtCi0gICAgICAgICAgICBDb25maWcgY29uZmlnT2JqZWN0ID0gZ2V0Q29uZmlnKGFic29sdXRlUGF0aCk7Ci0KLSAgICAgICAgICAgIENvbmZpZ3VyYXRvciBjb25maWd1cmF0b3IgPSBnZXRDb25maWd1cmF0b3IoY29uZmlnT2JqZWN0LCBkZXBsb3ltZW50Q2xhc3NMb2FkZXIpOwotCi0gICAgICAgICAgICBTZXJ2aWNlW10gc2VydmljZXMgPSBjb25maWdPYmplY3QuZ2V0U2VydmljZXMoKS5nZXRTZXJ2aWNlKCk7Ci0gICAgICAgICAgICBDbGFzc0RlcGxveWVyIGNsYXNzRGVwbG95ZXIgPQotICAgICAgICAgICAgICAgICAgICBuZXcgQ2xhc3NEZXBsb3llcihjb25maWd1cmF0aW9uQ29udGV4dCwgZGVwbG95bWVudENsYXNzTG9hZGVyLCBjb25maWd1cmF0b3IpOwotICAgICAgICAgICAgQ2xhc3Mgc2VydmljZUNsYXNzOwotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlcnZpY2VzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgc2VydmljZUNsYXNzID0gTG9hZGVyLmxvYWRDbGFzcyhkZXBsb3ltZW50Q2xhc3NMb2FkZXIsIHNlcnZpY2VzW2ldLmdldFNlcnZpY2VDbGFzcygpKTsKLSAgICAgICAgICAgICAgICBjbGFzc0RlcGxveWVyLmRlcGxveUNsYXNzKHNlcnZpY2VDbGFzcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBsb2cuaW5mbygiRGVwbG95ZWQgUk1JIFNlcnZpY2VzIHdpdGggZGVwbG95bWVudCBmaWxlICIgKyBkZXBsb3ltZW50RmlsZURhdGEuZ2V0TmFtZSgpKTsKLQotICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKCJTZXJ2aWNlIGNsYXNzIG5vdCBmb3VuZCIsIGUpOwotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgYXhpc0ZhdWx0KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEV4Y2VwdGlvbigiYXhpcyBmYXVsdCIsIGF4aXNGYXVsdCk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKCJ6aXAgZmlsZSBub3QgZm91bmQiLCBlKTsKLSAgICAgICAgfSBjYXRjaCAoQ29uZmlnRmlsZVJlYWRpbmdFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oImNvbmZpZyBmaWxlIHJlYWRpbmcgcHJvYmxlbSIsIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBDb25maWd1cmF0b3IgZ2V0Q29uZmlndXJhdG9yKENvbmZpZyBjb25maWdPYmplY3QsIENsYXNzTG9hZGVyIGRlcGxveW1lbnRDbGFzc0xvYWRlcikKLSAgICAgICAgICAgIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLCBEZXBsb3ltZW50RXhjZXB0aW9uIHsKLSAgICAgICAgQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvciA9IG5ldyBDb25maWd1cmF0b3IoKTsKLQotICAgICAgICBpZiAoY29uZmlnT2JqZWN0LmdldEV4dGVuc2lvbkNsYXNzZXMoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmdbXSBleHRlbnNpb25DbGFzc2VzID0gY29uZmlnT2JqZWN0LmdldEV4dGVuc2lvbkNsYXNzZXMoKS5nZXRFeHRlbnNpb25DbGFzcygpOwotICAgICAgICAgICAgaWYgKGV4dGVuc2lvbkNsYXNzZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIENsYXNzIGV4dGVuc2lvbkNsYXNzOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9uQ2xhc3Nlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25DbGFzcyA9IExvYWRlci5sb2FkQ2xhc3MoZGVwbG95bWVudENsYXNzTG9hZGVyLCBleHRlbnNpb25DbGFzc2VzW2ldKTsKLSAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdG9yLmFkZEV4dGVuc2lvbihleHRlbnNpb25DbGFzcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNvbmZpZ09iamVjdC5nZXRQYWNrYWdlVG9OYW1lc3BhY2VNYXBpbmdzKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgUGFja2FnZVRvTmFtZXNwYWNlTWFwW10gcGFja2FnZVRvTmFtZXNwYWNlTWFwaW5ncyA9Ci0gICAgICAgICAgICAgICAgICAgIGNvbmZpZ09iamVjdC5nZXRQYWNrYWdlVG9OYW1lc3BhY2VNYXBpbmdzKCkuZ2V0UGFja2FnZVRvTmFtZXNwYWNlTWFwKCk7Ci0gICAgICAgICAgICBpZiAocGFja2FnZVRvTmFtZXNwYWNlTWFwaW5ncyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYWNrYWdlVG9OYW1lc3BhY2VNYXBpbmdzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRvci5hZGRQYWNrYWdlVG9OYW1lc3BhY2VNYXBpbmcocGFja2FnZVRvTmFtZXNwYWNlTWFwaW5nc1tpXS5nZXRQYWNrYWdlTmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VUb05hbWVzcGFjZU1hcGluZ3NbaV0uZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIHNldCB0aGUgc2ltcGxlIHR5cGUgZGF0YSBoYW5kbGVyIGlmIGl0IGlzIHNldAotICAgICAgICBpZiAoKGNvbmZpZ09iamVjdC5nZXRTaW1wbGVEYXRhSGFuZGxlckNsYXNzKCkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAmJiAoY29uZmlnT2JqZWN0LmdldFNpbXBsZURhdGFIYW5kbGVyQ2xhc3MoKS50cmltKCkubGVuZ3RoKCkgPiAwKSl7Ci0gICAgICAgICAgICBDbGFzcyBzaW1wbGVUeXBlSGFuZGxlckNsYXNzID0KLSAgICAgICAgICAgICAgICAgICAgTG9hZGVyLmxvYWRDbGFzcyhkZXBsb3ltZW50Q2xhc3NMb2FkZXIsY29uZmlnT2JqZWN0LmdldFNpbXBsZURhdGFIYW5kbGVyQ2xhc3MoKSk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIFNpbXBsZVR5cGVIYW5kbGVyIHNpbXBsZVR5cGVIYW5kbGVyID0gKFNpbXBsZVR5cGVIYW5kbGVyKSBzaW1wbGVUeXBlSGFuZGxlckNsYXNzLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICAgICAgY29uZmlndXJhdG9yLnNldFNpbXBsZVR5cGVIYW5kbGVyKHNpbXBsZVR5cGVIYW5kbGVyKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKCJDYW4gbm90IGluc3RhbnRpYXRlIHNpbXBsZSB0eXBlIGhhbmRsZXIiLGUpOwotICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oIkNhbiBub3QgaW5zdGFudGlhdGUgc2ltcGxlIHR5cGUgaGFuZGxlciIsZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBzZXR0aW5nIHRoZSBjdXN0b20gY2xhc3MgaW5mbwotICAgICAgICBDbGFzc0luZm9bXSBjbGFzc0luZm9zID0gbnVsbDsKLSAgICAgICAgRmllbGRJbmZvW10gZmlsc0luZm9zID0gbnVsbDsKLSAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5ybWkuY29uZmlnLkNsYXNzSW5mbyBjbGFzc0luZm87Ci0gICAgICAgIENsYXNzIGN1c3RvbUNsYXNzID0gbnVsbDsKLSAgICAgICAgaWYgKGNvbmZpZ09iamVjdC5nZXRDdXN0b21DbGFzc0luZm8oKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBDdXN0b21DbGFzc0luZm8gY3VzdG9tQ2xhc3NJbmZvID0gY29uZmlnT2JqZWN0LmdldEN1c3RvbUNsYXNzSW5mbygpOwotICAgICAgICAgICAgaWYgKChjdXN0b21DbGFzc0luZm8uZ2V0Q2xhc3NJbmZvKCkgIT0gbnVsbCkgJiYgKGN1c3RvbUNsYXNzSW5mby5nZXRDbGFzc0luZm8oKS5sZW5ndGggPiAwKSkgewotICAgICAgICAgICAgICAgIGNsYXNzSW5mb3MgPSBjdXN0b21DbGFzc0luZm8uZ2V0Q2xhc3NJbmZvKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjbGFzc0luZm9zLmxlbmd0aDsgaSsrKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChjbGFzc0luZm9zW2ldLmdldEZpZWxkSW5mbygpICE9IG51bGwpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsYXNzSW5mb3NbaV0uZ2V0RmllbGRJbmZvKCkubGVuZ3RoID4gMCkpewotICAgICAgICAgICAgICAgICAgICAgICAgY3VzdG9tQ2xhc3MgPSBMb2FkZXIubG9hZENsYXNzKGRlcGxveW1lbnRDbGFzc0xvYWRlcixjbGFzc0luZm9zW2ldLmdldENsYXNzTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzSW5mbyA9IG5ldyBvcmcuYXBhY2hlLmF4aXMyLnJtaS5jb25maWcuQ2xhc3NJbmZvKGN1c3RvbUNsYXNzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbHNJbmZvcyA9IGNsYXNzSW5mb3NbaV0uZ2V0RmllbGRJbmZvKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGZpbHNJbmZvcy5sZW5ndGg7IGorKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NJbmZvLmFkZEZpZWxkSW5mbygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUuYXhpczIucm1pLmNvbmZpZy5GaWVsZEluZm8oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsc0luZm9zW2pdLmdldEphdmFOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsc0luZm9zW2pdLmdldFhtbE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxzSW5mb3Nbal0uaXNFbGVtZW50KCkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRvci5hZGRDbGFzc0luZm8oY2xhc3NJbmZvKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY29uZmlndXJhdG9yOwotICAgIH0KLQotICAgIHByaXZhdGUgQ29uZmlnIGdldENvbmZpZyhTdHJpbmcgemlwRmlsZVBhdGgpIHRocm93cyBDb25maWdGaWxlUmVhZGluZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJbnB1dFN0cmVhbSBjb25maWdGaWxlSW5wdXRTdHJlYW0gPSBnZXRDb25maWdGaWxlSW5wdXRTdHJlYW0oemlwRmlsZVBhdGgpOwotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoY29uZmlnRmlsZUlucHV0U3RyZWFtKTsKLQotICAgICAgICAgICAgQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvciA9IG5ldyBDb25maWd1cmF0b3IoKTsKLSAgICAgICAgICAgIGNvbmZpZ3VyYXRvci5hZGRQYWNrYWdlVG9OYW1lc3BhY2VNYXBpbmcoIm9yZy5hcGFjaGUuYXhpczIucm1pLmRlcGxveS5jb25maWciLAotICAgICAgICAgICAgICAgICAgICAiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvcm1pIik7Ci0KLSAgICAgICAgICAgIC8vIGFkZCBjb25maWd1cmF0b3IgZGV0YWlscyB0byBoYW5kbGUgY3VzdG9tIGNsYXNzIGluZm8KLSAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIucm1pLmNvbmZpZy5DbGFzc0luZm8gY2xhc3NJbmZvID0gbmV3IG9yZy5hcGFjaGUuYXhpczIucm1pLmNvbmZpZy5DbGFzc0luZm8oRmllbGRJbmZvLmNsYXNzKTsKLSAgICAgICAgICAgIGNsYXNzSW5mby5hZGRGaWVsZEluZm8obmV3IG9yZy5hcGFjaGUuYXhpczIucm1pLmNvbmZpZy5GaWVsZEluZm8oImphdmFOYW1lIiwgbnVsbCwgZmFsc2UpKTsKLSAgICAgICAgICAgIGNsYXNzSW5mby5hZGRGaWVsZEluZm8obmV3IG9yZy5hcGFjaGUuYXhpczIucm1pLmNvbmZpZy5GaWVsZEluZm8oInhtbE5hbWUiLCBudWxsLCBmYWxzZSkpOwotICAgICAgICAgICAgY2xhc3NJbmZvLmFkZEZpZWxkSW5mbyhuZXcgb3JnLmFwYWNoZS5heGlzMi5ybWkuY29uZmlnLkZpZWxkSW5mbygiZWxlbWVudCIsICJpc0VsZW1lbnQiLCBmYWxzZSkpOwotICAgICAgICAgICAgY29uZmlndXJhdG9yLmFkZENsYXNzSW5mbyhjbGFzc0luZm8pOwotCi0gICAgICAgICAgICBjbGFzc0luZm8gPSBuZXcgb3JnLmFwYWNoZS5heGlzMi5ybWkuY29uZmlnLkNsYXNzSW5mbyhDbGFzc0luZm8uY2xhc3MpOwotICAgICAgICAgICAgY2xhc3NJbmZvLmFkZEZpZWxkSW5mbyhuZXcgb3JnLmFwYWNoZS5heGlzMi5ybWkuY29uZmlnLkZpZWxkSW5mbygiY2xhc3NOYW1lIiwgbnVsbCwgZmFsc2UpKTsKLSAgICAgICAgICAgIGNvbmZpZ3VyYXRvci5hZGRDbGFzc0luZm8oY2xhc3NJbmZvKTsKLQotCi0gICAgICAgICAgICBNYXAgcHJvY2Vzc2VkVHlwZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgICAgICBNYXAgcHJvY2Vzc2VkU2NoZW1hTWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgICAgIFBhcmFtZXRlciBwYXJhbWV0ZXIgPSBuZXcgUGFyYW1ldGVyKENvbmZpZy5jbGFzcywgImNvbmZpZyIpOwotICAgICAgICAgICAgcGFyYW1ldGVyLnNldE5hbWVzcGFjZSgiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvcm1pIik7Ci0gICAgICAgICAgICBwYXJhbWV0ZXIucG9wdWxhdGVNZXRhRGF0YShjb25maWd1cmF0b3IsIHByb2Nlc3NlZFR5cGVNYXApOwotICAgICAgICAgICAgcGFyYW1ldGVyLmdlbmVyYXRlU2NoZW1hKGNvbmZpZ3VyYXRvciwgcHJvY2Vzc2VkU2NoZW1hTWFwKTsKLQotICAgICAgICAgICAgWG1sU3RyZWFtUGFyc2VyIHhtbFN0cmVhbVBhcnNlciA9IG5ldyBYbWxTdHJlYW1QYXJzZXIocHJvY2Vzc2VkVHlwZU1hcCwgY29uZmlndXJhdG9yLCBwcm9jZXNzZWRTY2hlbWFNYXApOwotICAgICAgICAgICAgcmV0dXJuIChDb25maWcpIHhtbFN0cmVhbVBhcnNlci5nZXRPYmplY3RGb3JQYXJhbWV0ZXIoeG1sUmVhZGVyLCBwYXJhbWV0ZXIpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlnRmlsZVJlYWRpbmdFeGNlcHRpb24oIkNhbiBub3QgcmVhZCBjb25maWd1cmF0aW9uIGZpbGUiLCBlKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDb25maWdGaWxlUmVhZGluZ0V4Y2VwdGlvbigieG1sIHN0cmVhbSBleGNlcHRpb24gd2l0aCBjb25maWd1cmF0aW9uIGZpbGUiLCBlKTsKLSAgICAgICAgfSBjYXRjaCAoTWV0YURhdGFQb3B1bGF0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlnRmlsZVJlYWRpbmdFeGNlcHRpb24oIm1ldGFkYXRhIHBvcHVsYXRpb24gcHJvYmxlbSB3aXRoIGNvbmZpZ3VyYXRpb24gZmlsZSIsIGUpOwotICAgICAgICB9IGNhdGNoIChYbWxQYXJzaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDb25maWdGaWxlUmVhZGluZ0V4Y2VwdGlvbigieG1sIHN0cmVhbSByZWFkaW5nIHByb2JsZW0gd2l0aCBjb25maWd1cmF0aW9uIGZpbGUiLCBlKTsKLSAgICAgICAgfSBjYXRjaCAoU2NoZW1hR2VuZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlnRmlsZVJlYWRpbmdFeGNlcHRpb24oInByb2JsZW0gaW4gZ2VuZXJhdGluZyBzY2hlbWEiLCBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgSW5wdXRTdHJlYW0gZ2V0Q29uZmlnRmlsZUlucHV0U3RyZWFtKFN0cmluZyB6aXBGaWxlUGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQotICAgICAgICBaaXBJbnB1dFN0cmVhbSB6aXBJbnB1dFN0cmVhbSA9IG5ldyBaaXBJbnB1dFN0cmVhbShuZXcgRmlsZUlucHV0U3RyZWFtKHppcEZpbGVQYXRoKSk7Ci0gICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBieXRlQXJyYXlPdXRwdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgIFppcEVudHJ5IHppcEVudHJ5OwotICAgICAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbMTAyNF07Ci0gICAgICAgIGludCByZWFkOwotICAgICAgICB3aGlsZSAoKHppcEVudHJ5ID0gemlwSW5wdXRTdHJlYW0uZ2V0TmV4dEVudHJ5KCkpICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmICh6aXBFbnRyeS5nZXROYW1lKCkuZXF1YWxzKCJNRVRBLUlORiIgKyBGaWxlLnNlcGFyYXRvciArICJjb25maWcueG1sIikpIHsKLSAgICAgICAgICAgICAgICB3aGlsZSAoKHJlYWQgPSB6aXBJbnB1dFN0cmVhbS5yZWFkKGJ1ZmZlcikpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBieXRlQXJyYXlPdXRwdXRTdHJlYW0ud3JpdGUoYnVmZmVyLCAwLCByZWFkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVBcnJheU91dHB1dFN0cmVhbS50b0J5dGVBcnJheSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREaXJlY3RvcnkoU3RyaW5nIGRpcmVjdG9yeSkgewotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RXh0ZW5zaW9uKFN0cmluZyBleHRlbnNpb24pIHsKLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHVuRGVwbG95KFN0cmluZyBmaWxlTmFtZSkgdGhyb3dzIERlcGxveW1lbnRFeGNlcHRpb24gewotICAgICAgIC8vVE9ETzogaW1wbGVtZW50IHVuZGVwbG95Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kZXBsb3kvY29uZmlnL0NsYXNzSW5mby5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kZXBsb3kvY29uZmlnL0NsYXNzSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4N2JlY2ZkLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGVwbG95L2NvbmZpZy9DbGFzc0luZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5ybWkuZGVwbG95LmNvbmZpZzsKLQotCi1wdWJsaWMgY2xhc3MgQ2xhc3NJbmZvIHsKLQotICAgIHByaXZhdGUgU3RyaW5nIGNsYXNzTmFtZTsKLSAgICBwcml2YXRlIEZpZWxkSW5mb1tdIGZpZWxkSW5mbzsKLQotICAgIHB1YmxpYyBGaWVsZEluZm9bXSBnZXRGaWVsZEluZm8oKSB7Ci0gICAgICAgIHJldHVybiBmaWVsZEluZm87Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RmllbGRJbmZvKEZpZWxkSW5mb1tdIGZpZWxkSW5mbykgewotICAgICAgICB0aGlzLmZpZWxkSW5mbyA9IGZpZWxkSW5mbzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGNsYXNzTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc05hbWUoU3RyaW5nIGNsYXNzTmFtZSkgewotICAgICAgICB0aGlzLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL2RlcGxveS9jb25maWcvQ29uZmlnLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL2RlcGxveS9jb25maWcvQ29uZmlnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3NzA3ZGIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kZXBsb3kvY29uZmlnL0NvbmZpZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJtaS5kZXBsb3kuY29uZmlnOwotCi1wdWJsaWMgY2xhc3MgQ29uZmlnIHsKLQotICAgcHJpdmF0ZSBTZXJ2aWNlcyBzZXJ2aWNlczsKLSAgIHByaXZhdGUgRXh0ZW5zaW9uQ2xhc3NlcyBleHRlbnNpb25DbGFzc2VzOwotICAgcHJpdmF0ZSBQYWNrYWdlVG9OYW1lc3BhY2VNYXBpbmdzIHBhY2thZ2VUb05hbWVzcGFjZU1hcGluZ3M7Ci0gICBwcml2YXRlIFN0cmluZyBzaW1wbGVEYXRhSGFuZGxlckNsYXNzOwotICAgcHJpdmF0ZSBDdXN0b21DbGFzc0luZm8gY3VzdG9tQ2xhc3NJbmZvOwotCi0gICAgcHVibGljIFNlcnZpY2VzIGdldFNlcnZpY2VzKCkgewotICAgICAgICByZXR1cm4gc2VydmljZXM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2VydmljZXMoU2VydmljZXMgc2VydmljZXMpIHsKLSAgICAgICAgdGhpcy5zZXJ2aWNlcyA9IHNlcnZpY2VzOwotICAgIH0KLQotICAgIHB1YmxpYyBFeHRlbnNpb25DbGFzc2VzIGdldEV4dGVuc2lvbkNsYXNzZXMoKSB7Ci0gICAgICAgIHJldHVybiBleHRlbnNpb25DbGFzc2VzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEV4dGVuc2lvbkNsYXNzZXMoRXh0ZW5zaW9uQ2xhc3NlcyBleHRlbnNpb25DbGFzc2VzKSB7Ci0gICAgICAgIHRoaXMuZXh0ZW5zaW9uQ2xhc3NlcyA9IGV4dGVuc2lvbkNsYXNzZXM7Ci0gICAgfQotCi0gICAgcHVibGljIFBhY2thZ2VUb05hbWVzcGFjZU1hcGluZ3MgZ2V0UGFja2FnZVRvTmFtZXNwYWNlTWFwaW5ncygpIHsKLSAgICAgICAgcmV0dXJuIHBhY2thZ2VUb05hbWVzcGFjZU1hcGluZ3M7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGFja2FnZVRvTmFtZXNwYWNlTWFwaW5ncyhQYWNrYWdlVG9OYW1lc3BhY2VNYXBpbmdzIHBhY2thZ2VUb05hbWVzcGFjZU1hcGluZ3MpIHsKLSAgICAgICAgdGhpcy5wYWNrYWdlVG9OYW1lc3BhY2VNYXBpbmdzID0gcGFja2FnZVRvTmFtZXNwYWNlTWFwaW5nczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNpbXBsZURhdGFIYW5kbGVyQ2xhc3MoKSB7Ci0gICAgICAgIHJldHVybiBzaW1wbGVEYXRhSGFuZGxlckNsYXNzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFNpbXBsZURhdGFIYW5kbGVyQ2xhc3MoU3RyaW5nIHNpbXBsZURhdGFIYW5kbGVyQ2xhc3MpIHsKLSAgICAgICAgdGhpcy5zaW1wbGVEYXRhSGFuZGxlckNsYXNzID0gc2ltcGxlRGF0YUhhbmRsZXJDbGFzczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ3VzdG9tQ2xhc3NJbmZvIGdldEN1c3RvbUNsYXNzSW5mbygpIHsKLSAgICAgICAgcmV0dXJuIGN1c3RvbUNsYXNzSW5mbzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDdXN0b21DbGFzc0luZm8oQ3VzdG9tQ2xhc3NJbmZvIGN1c3RvbUNsYXNzSW5mbykgewotICAgICAgICB0aGlzLmN1c3RvbUNsYXNzSW5mbyA9IGN1c3RvbUNsYXNzSW5mbzsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGVwbG95L2NvbmZpZy9DdXN0b21DbGFzc0luZm8uamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGVwbG95L2NvbmZpZy9DdXN0b21DbGFzc0luZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdjNDA0MS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL2RlcGxveS9jb25maWcvQ3VzdG9tQ2xhc3NJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLmRlcGxveS5jb25maWc7Ci0KLQotcHVibGljIGNsYXNzIEN1c3RvbUNsYXNzSW5mbyB7Ci0KLSAgICBwcml2YXRlIENsYXNzSW5mb1tdIGNsYXNzSW5mbzsKLQotICAgIHB1YmxpYyBDbGFzc0luZm9bXSBnZXRDbGFzc0luZm8oKSB7Ci0gICAgICAgIHJldHVybiBjbGFzc0luZm87Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q2xhc3NJbmZvKENsYXNzSW5mb1tdIGNsYXNzSW5mbykgewotICAgICAgICB0aGlzLmNsYXNzSW5mbyA9IGNsYXNzSW5mbzsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGVwbG95L2NvbmZpZy9FeHRlbnNpb25DbGFzc2VzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL2RlcGxveS9jb25maWcvRXh0ZW5zaW9uQ2xhc3Nlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmFkZGQxLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGVwbG95L2NvbmZpZy9FeHRlbnNpb25DbGFzc2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLmRlcGxveS5jb25maWc7Ci0KLQotcHVibGljIGNsYXNzIEV4dGVuc2lvbkNsYXNzZXMgewotCi0gICAgcHJpdmF0ZSBTdHJpbmdbXSBleHRlbnNpb25DbGFzczsKLQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRFeHRlbnNpb25DbGFzcygpIHsKLSAgICAgICAgcmV0dXJuIGV4dGVuc2lvbkNsYXNzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEV4dGVuc2lvbkNsYXNzKFN0cmluZ1tdIGV4dGVuc2lvbkNsYXNzKSB7Ci0gICAgICAgIHRoaXMuZXh0ZW5zaW9uQ2xhc3MgPSBleHRlbnNpb25DbGFzczsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL2RlcGxveS9jb25maWcvRmllbGRJbmZvLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL2RlcGxveS9jb25maWcvRmllbGRJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjNzE5ZTEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kZXBsb3kvY29uZmlnL0ZpZWxkSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJtaS5kZXBsb3kuY29uZmlnOwotCi0KLXB1YmxpYyBjbGFzcyBGaWVsZEluZm8gewotCi0gICAgcHJpdmF0ZSBTdHJpbmcgamF2YU5hbWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgeG1sTmFtZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gaXNFbGVtZW50ID0gdHJ1ZTsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SmF2YU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBqYXZhTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRKYXZhTmFtZShTdHJpbmcgamF2YU5hbWUpIHsKLSAgICAgICAgdGhpcy5qYXZhTmFtZSA9IGphdmFOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0WG1sTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHhtbE5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0WG1sTmFtZShTdHJpbmcgeG1sTmFtZSkgewotICAgICAgICB0aGlzLnhtbE5hbWUgPSB4bWxOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRWxlbWVudCgpIHsKLSAgICAgICAgcmV0dXJuIGlzRWxlbWVudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRFbGVtZW50KGJvb2xlYW4gZWxlbWVudCkgewotICAgICAgICBpc0VsZW1lbnQgPSBlbGVtZW50OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGVwbG95L2NvbmZpZy9QYWNrYWdlVG9OYW1lc3BhY2VNYXAuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGVwbG95L2NvbmZpZy9QYWNrYWdlVG9OYW1lc3BhY2VNYXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjJmOGZlYi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL2RlcGxveS9jb25maWcvUGFja2FnZVRvTmFtZXNwYWNlTWFwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLmRlcGxveS5jb25maWc7Ci0KLQotcHVibGljIGNsYXNzIFBhY2thZ2VUb05hbWVzcGFjZU1hcCB7Ci0gICAgCi0gICAgcHJpdmF0ZSBTdHJpbmcgcGFja2FnZU5hbWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZXNwYWNlOwotCi0gICAgcHVibGljIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHBhY2thZ2VOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBhY2thZ2VOYW1lKFN0cmluZyBwYWNrYWdlTmFtZSkgewotICAgICAgICB0aGlzLnBhY2thZ2VOYW1lID0gcGFja2FnZU5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2UoKSB7Ci0gICAgICAgIHJldHVybiBuYW1lc3BhY2U7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZXNwYWNlKFN0cmluZyBuYW1lc3BhY2UpIHsKLSAgICAgICAgdGhpcy5uYW1lc3BhY2UgPSBuYW1lc3BhY2U7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kZXBsb3kvY29uZmlnL1BhY2thZ2VUb05hbWVzcGFjZU1hcGluZ3MuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGVwbG95L2NvbmZpZy9QYWNrYWdlVG9OYW1lc3BhY2VNYXBpbmdzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2MDYzMWIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kZXBsb3kvY29uZmlnL1BhY2thZ2VUb05hbWVzcGFjZU1hcGluZ3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5ybWkuZGVwbG95LmNvbmZpZzsKLQotCi1wdWJsaWMgY2xhc3MgUGFja2FnZVRvTmFtZXNwYWNlTWFwaW5ncyB7Ci0gICAgCi0gICAgcHJpdmF0ZSBQYWNrYWdlVG9OYW1lc3BhY2VNYXBbXSBwYWNrYWdlVG9OYW1lc3BhY2VNYXA7Ci0KLSAgICBwdWJsaWMgUGFja2FnZVRvTmFtZXNwYWNlTWFwW10gZ2V0UGFja2FnZVRvTmFtZXNwYWNlTWFwKCkgewotICAgICAgICByZXR1cm4gcGFja2FnZVRvTmFtZXNwYWNlTWFwOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBhY2thZ2VUb05hbWVzcGFjZU1hcChQYWNrYWdlVG9OYW1lc3BhY2VNYXBbXSBwYWNrYWdlVG9OYW1lc3BhY2VNYXApIHsKLSAgICAgICAgdGhpcy5wYWNrYWdlVG9OYW1lc3BhY2VNYXAgPSBwYWNrYWdlVG9OYW1lc3BhY2VNYXA7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kZXBsb3kvY29uZmlnL1JNSUJlYW5JbmZvLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL2RlcGxveS9jb25maWcvUk1JQmVhbkluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA1NjE5OS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL2RlcGxveS9jb25maWcvUk1JQmVhbkluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5ybWkuZGVwbG95LmNvbmZpZzsKLQotCi1wdWJsaWMgY2xhc3MgUk1JQmVhbkluZm8gewotCi0gICAgcHJpdmF0ZSBTdHJpbmcgYmVhbkNsYXNzOwotICAgIHByaXZhdGUgU3RyaW5nIGJlYW5UeXBlQ2xhc3M7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEJlYW5DbGFzcygpIHsKLSAgICAgICAgcmV0dXJuIGJlYW5DbGFzczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRCZWFuQ2xhc3MoU3RyaW5nIGJlYW5DbGFzcykgewotICAgICAgICB0aGlzLmJlYW5DbGFzcyA9IGJlYW5DbGFzczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEJlYW5UeXBlQ2xhc3MoKSB7Ci0gICAgICAgIHJldHVybiBiZWFuVHlwZUNsYXNzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEJlYW5UeXBlQ2xhc3MoU3RyaW5nIGJlYW5UeXBlQ2xhc3MpIHsKLSAgICAgICAgdGhpcy5iZWFuVHlwZUNsYXNzID0gYmVhblR5cGVDbGFzczsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL2RlcGxveS9jb25maWcvU2VydmljZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kZXBsb3kvY29uZmlnL1NlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU0Y2E0Zi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL2RlcGxveS9jb25maWcvU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJtaS5kZXBsb3kuY29uZmlnOwotCi0KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlIHsKLQotICAgIHByaXZhdGUgU3RyaW5nIHNlcnZpY2VDbGFzczsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmljZUNsYXNzKCkgewotICAgICAgICByZXR1cm4gc2VydmljZUNsYXNzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VDbGFzcyhTdHJpbmcgc2VydmljZUNsYXNzKSB7Ci0gICAgICAgIHRoaXMuc2VydmljZUNsYXNzID0gc2VydmljZUNsYXNzOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kZXBsb3kvY29uZmlnL1NlcnZpY2VzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL2RlcGxveS9jb25maWcvU2VydmljZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTIyNDVkMC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL2RlcGxveS9jb25maWcvU2VydmljZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5ybWkuZGVwbG95LmNvbmZpZzsKLQotcHVibGljIGNsYXNzIFNlcnZpY2VzIHsKLQotICAgcHJpdmF0ZSBTZXJ2aWNlW10gc2VydmljZTsKLQotICAgIHB1YmxpYyBTZXJ2aWNlW10gZ2V0U2VydmljZSgpIHsKLSAgICAgICAgcmV0dXJuIHNlcnZpY2U7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2VydmljZShTZXJ2aWNlW10gc2VydmljZSkgewotICAgICAgICB0aGlzLnNlcnZpY2UgPSBzZXJ2aWNlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvZXhjZXB0aW9uL0NvbmZpZ0ZpbGVSZWFkaW5nRXhjZXB0aW9uLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL2V4Y2VwdGlvbi9Db25maWdGaWxlUmVhZGluZ0V4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDhlMDI0Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvZXhjZXB0aW9uL0NvbmZpZ0ZpbGVSZWFkaW5nRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLmV4Y2VwdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgQ29uZmlnRmlsZVJlYWRpbmdFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewotCi0gICAgcHVibGljIENvbmZpZ0ZpbGVSZWFkaW5nRXhjZXB0aW9uKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIHB1YmxpYyBDb25maWdGaWxlUmVhZGluZ0V4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29uZmlnRmlsZVJlYWRpbmdFeGNlcHRpb24oVGhyb3dhYmxlIGNhdXNlKSB7Ci0gICAgICAgIHN1cGVyKGNhdXNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29uZmlnRmlsZVJlYWRpbmdFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlLCBjYXVzZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9leGNlcHRpb24vTWV0YURhdGFQb3B1bGF0ZUV4Y2VwdGlvbi5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9leGNlcHRpb24vTWV0YURhdGFQb3B1bGF0ZUV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTk5ZDQ1Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvZXhjZXB0aW9uL01ldGFEYXRhUG9wdWxhdGVFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5ybWkuZXhjZXB0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBNZXRhRGF0YVBvcHVsYXRlRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKLSAgICBwdWJsaWMgTWV0YURhdGFQb3B1bGF0ZUV4Y2VwdGlvbigpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWV0YURhdGFQb3B1bGF0ZUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWV0YURhdGFQb3B1bGF0ZUV4Y2VwdGlvbihUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIoY2F1c2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBNZXRhRGF0YVBvcHVsYXRlRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvZXhjZXB0aW9uL09NRWxlbWVudENyZWF0aW9uRXhjZXB0aW9uLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL2V4Y2VwdGlvbi9PTUVsZW1lbnRDcmVhdGlvbkV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjAxYWRmLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvZXhjZXB0aW9uL09NRWxlbWVudENyZWF0aW9uRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLmV4Y2VwdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgT01FbGVtZW50Q3JlYXRpb25FeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewotICAgIAotICAgIHB1YmxpYyBPTUVsZW1lbnRDcmVhdGlvbkV4Y2VwdGlvbigpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT01FbGVtZW50Q3JlYXRpb25FeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSk7Ci0gICAgfQotCi0gICAgcHVibGljIE9NRWxlbWVudENyZWF0aW9uRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBPTUVsZW1lbnRDcmVhdGlvbkV4Y2VwdGlvbihUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIoY2F1c2UpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvZXhjZXB0aW9uL1NjaGVtYUdlbmVyYXRpb25FeGNlcHRpb24uamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvZXhjZXB0aW9uL1NjaGVtYUdlbmVyYXRpb25FeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE1Mjc5OC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL2V4Y2VwdGlvbi9TY2hlbWFHZW5lcmF0aW9uRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLmV4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIFNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewotCi0gICAgcHVibGljIFNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb24oKSB7Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb24oVGhyb3dhYmxlIGNhdXNlKSB7Ci0gICAgICAgIHN1cGVyKGNhdXNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hR2VuZXJhdGlvbkV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGNhdXNlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UsIGNhdXNlKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvZXhjZXB0aW9uL1htbFBhcnNpbmdFeGNlcHRpb24uamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvZXhjZXB0aW9uL1htbFBhcnNpbmdFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmIxYjU3OC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL2V4Y2VwdGlvbi9YbWxQYXJzaW5nRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLmV4Y2VwdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgWG1sUGFyc2luZ0V4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7Ci0gICAgCi0gICAgcHVibGljIFhtbFBhcnNpbmdFeGNlcHRpb24oKSB7Ci0gICAgfQotCi0gICAgcHVibGljIFhtbFBhcnNpbmdFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFhtbFBhcnNpbmdFeGNlcHRpb24oVGhyb3dhYmxlIGNhdXNlKSB7Ci0gICAgICAgIHN1cGVyKGNhdXNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgWG1sUGFyc2luZ0V4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGNhdXNlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UsIGNhdXNlKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvZXhjZXB0aW9uL1htbFNlcmlhbGl6aW5nRXhjZXB0aW9uLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL2V4Y2VwdGlvbi9YbWxTZXJpYWxpemluZ0V4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWYwMjBlLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvZXhjZXB0aW9uL1htbFNlcmlhbGl6aW5nRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLmV4Y2VwdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgWG1sU2VyaWFsaXppbmdFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewotCi0gICAgcHVibGljIFhtbFNlcmlhbGl6aW5nRXhjZXB0aW9uKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBYbWxTZXJpYWxpemluZ0V4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgWG1sU2VyaWFsaXppbmdFeGNlcHRpb24oVGhyb3dhYmxlIGNhdXNlKSB7Ci0gICAgICAgIHN1cGVyKGNhdXNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgWG1sU2VyaWFsaXppbmdFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlLCBjYXVzZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9tZXRhZGF0YS9BYnN0cmFjdFR5cGUuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvbWV0YWRhdGEvQWJzdHJhY3RUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiMjhmMGUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9tZXRhZGF0YS9BYnN0cmFjdFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLm1ldGFkYXRhOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmV4Y2VwdGlvbi5NZXRhRGF0YVBvcHVsYXRlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmV4Y2VwdGlvbi5TY2hlbWFHZW5lcmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLm1ldGFkYXRhLnhtbC5YbWxTY2hlbWE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEueG1sLlhtbFR5cGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFR5cGUgaW1wbGVtZW50cyBUeXBlIHsKLQotICAgIC8qKgotICAgICAqIGphdmEgY2xhc3MgY29ycmVzcG9uZHMgdG8gdGhpcyBYbWxUeXBlIG9iamVjdAotICAgICAqLwotICAgIHByb3RlY3RlZCBDbGFzcyBqYXZhQ2xhc3M7Ci0KLSAgICAvKioKLSAgICAgKiBsaXN0IG9mIGVsZW1lbnQgRmllbGQgb2JqZWN0cyBmb3IgdGhpcyBqYXZhIGNsYXNzCi0gICAgICovCi0gICAgcHJvdGVjdGVkIExpc3QgZWxlbWVudEZpZWxkczsKLQotICAgIC8qKgotICAgICAqIGxpc3Qgb2YgYXR0cmlidXRlIEZpZWxkIG9iamVjdHMgZm9yIHRoaXMgamF2YSBjbGFzcwotICAgICAqLwotICAgIHByb3RlY3RlZCBMaXN0IGF0dHJpYnV0ZUZpZWxkczsKLQotICAgIC8qKgotICAgICAqIG5hbWUgb2YgdGhlIFR5cGUgOiBjbGFzcyBuYW1lCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBuYW1lOwotCi0gICAgLyoqCi0gICAgICogbmFtZXNwYWNlIG9mIHRoZSB0eXBlIDogZGVwZW5kcyBvbiB0aGUgcGFja2FnZQotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgbmFtZXNwYWNlOwotCi0gICAgLyoqCi0gICAgICogcGFyZW50IHR5cGUgZm9yIHRoaXMgdHlwZQotICAgICAqLwotICAgIHByb3RlY3RlZCBUeXBlIHBhcmVudFR5cGU7Ci0KLSAgICAvKioKLSAgICAgKiB4bWwgbWV0YWRhdGEgdHlwZSBjb3JyZXBvbmRpbmcgdG8gdGhpcyB0eXBlIG9iamVjdAotICAgICAqLwotICAgIHByb3RlY3RlZCBYbWxUeXBlIHhtbFR5cGU7Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1NjaGVtYUdlbmVyYXRlZDsKLQotCi0gICAgLyoqCi0gICAgICogcG9wdWFsYXRlIHRoZSBtZXRhIGRhdGEgY29ycmVzcG9uZGluZyB0byB0aGlzIHR5cGUKLSAgICAgKiBAcGFyYW0gY29uZmlndXJhdG9yCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IHZvaWQgcG9wdWxhdGVNZXRhRGF0YShDb25maWd1cmF0b3IgY29uZmlndXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwIHByb2Nlc3NlZFR5cGVNYXApCi0gICAgICAgICAgICB0aHJvd3MgTWV0YURhdGFQb3B1bGF0ZUV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIHRoaXMgbWV0aG9kIHNldHMgdGhlIHhtbFR5cGUgY29ycmVjdGx5LiB0aGlzIG1ldGhvZCBzaG91bGQgb25seSBiZSBpbnZva2VkCi0gICAgICogaWYgaXQgaGFzIG5vdCBhbHJlYWR5IHByb2Nlc3NlZAotICAgICAqIEBwYXJhbSBjb25maWd1cmF0b3IKLSAgICAgKiBAcGFyYW0gc2NoZW1hTWFwCi0gICAgICovCi0KLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBnZW5lcmF0ZVNjaGVtYShDb25maWd1cmF0b3IgY29uZmlndXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcCBzY2hlbWFNYXApCi0gICAgICAgICAgICB0aHJvd3MgU2NoZW1hR2VuZXJhdGlvbkV4Y2VwdGlvbjsKLQotICAgIHB1YmxpYyB2b2lkIHBvcHVsYXRlQWxsRWxlbWVudEZpZWxkcyhMaXN0IGVsZW1lbnRGaWVsZHNMaXN0KXsKLSAgICAgICAgLy8gd2UgaGF2ZSB0byBmaXJzdCBhZGQgdGhlIHBhcmVudCBkZXRhaWxzIHRvIGtlZXAgdGhlIG9yZGVyLgotICAgICAgICBpZiAodGhpcy5wYXJlbnRUeXBlICE9IG51bGwpewotICAgICAgICAgICAgdGhpcy5wYXJlbnRUeXBlLnBvcHVsYXRlQWxsRWxlbWVudEZpZWxkcyhlbGVtZW50RmllbGRzTGlzdCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxlbWVudEZpZWxkc0xpc3QuYWRkQWxsKHRoaXMuZWxlbWVudEZpZWxkcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcG9wdWxhdGVBbGxBdHRyaWJ1dGVGaWVsZHMoTGlzdCBhdHRyaWJ1dGVGaWVsZHNMaXN0KSB7Ci0gICAgICAgIC8vIHdlIGhhdmUgdG8gZmlyc3QgYWRkIHRoZSBwYXJlbnQgZGV0YWlscyB0byBrZWVwIHRoZSBvcmRlci4KLSAgICAgICAgaWYgKHRoaXMucGFyZW50VHlwZSAhPSBudWxsKXsKLSAgICAgICAgICAgIHRoaXMucGFyZW50VHlwZS5wb3B1bGF0ZUFsbEF0dHJpYnV0ZUZpZWxkcyhhdHRyaWJ1dGVGaWVsZHNMaXN0KTsKLSAgICAgICAgfQotICAgICAgICBhdHRyaWJ1dGVGaWVsZHNMaXN0LmFkZEFsbCh0aGlzLmF0dHJpYnV0ZUZpZWxkcyk7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3QgZ2V0QWxsRWxlbWVudEZpZWxkcygpewotICAgICAgICBMaXN0IGFsbEVsZW1lbnRzTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgcG9wdWxhdGVBbGxFbGVtZW50RmllbGRzKGFsbEVsZW1lbnRzTGlzdCk7Ci0gICAgICAgIHJldHVybiBhbGxFbGVtZW50c0xpc3Q7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3QgZ2V0QWxsQXR0cmlidXRlRmllbGRzKCkgewotICAgICAgICBMaXN0IGFsbEF0dHJpYnV0ZXNMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBwb3B1bGF0ZUFsbEF0dHJpYnV0ZUZpZWxkcyhhbGxBdHRyaWJ1dGVzTGlzdCk7Ci0gICAgICAgIHJldHVybiBhbGxBdHRyaWJ1dGVzTGlzdDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCByZWdpc3RlclhtbFR5cGUoTWFwIHNjaGVtYU1hcCkgewotICAgICAgICBpZiAoc2NoZW1hTWFwLmdldCh0aGlzLm5hbWVzcGFjZSkgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gY3JlYXRlIGEgbmV3IG5hbWVzcGFjZSBmb3IgdGhpcyBzY2hlbWEKLSAgICAgICAgICAgIHNjaGVtYU1hcC5wdXQodGhpcy5uYW1lc3BhY2UsIG5ldyBYbWxTY2hlbWEodGhpcy5uYW1lc3BhY2UpKTsKLSAgICAgICAgfQotICAgICAgICBYbWxTY2hlbWEgeG1sU2NoZW1hID0gKFhtbFNjaGVtYSkgc2NoZW1hTWFwLmdldCh0aGlzLm5hbWVzcGFjZSk7Ci0gICAgICAgIHhtbFNjaGVtYS5hZGRDb21wbGV4VHlwZSh0aGlzLnhtbFR5cGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzU2NoZW1hR2VuZXJhdGVkKCkgewotICAgICAgICByZXR1cm4gaXNTY2hlbWFHZW5lcmF0ZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2NoZW1hR2VuZXJhdGVkKGJvb2xlYW4gc2NoZW1hR2VuZXJhdGVkKSB7Ci0gICAgICAgIGlzU2NoZW1hR2VuZXJhdGVkID0gc2NoZW1hR2VuZXJhdGVkOwotICAgIH0KLQotICAgIHB1YmxpYyBDbGFzcyBnZXRKYXZhQ2xhc3MoKSB7Ci0gICAgICAgIHJldHVybiBqYXZhQ2xhc3M7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SmF2YUNsYXNzKENsYXNzIGphdmFDbGFzcykgewotICAgICAgICB0aGlzLmphdmFDbGFzcyA9IGphdmFDbGFzczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdCBnZXRFbGVtZW50RmllbGRzKCkgewotICAgICAgICByZXR1cm4gZWxlbWVudEZpZWxkczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRFbGVtZW50RmllbGRzKExpc3QgZWxlbWVudEZpZWxkcykgewotICAgICAgICB0aGlzLmVsZW1lbnRGaWVsZHMgPSBlbGVtZW50RmllbGRzOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlKCkgewotICAgICAgICByZXR1cm4gbmFtZXNwYWNlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE5hbWVzcGFjZShTdHJpbmcgbmFtZXNwYWNlKSB7Ci0gICAgICAgIHRoaXMubmFtZXNwYWNlID0gbmFtZXNwYWNlOwotICAgIH0KLQotICAgIHB1YmxpYyBYbWxUeXBlIGdldFhtbFR5cGUoKSB7Ci0gICAgICAgIHJldHVybiB4bWxUeXBlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFhtbFR5cGUoWG1sVHlwZSB4bWxUeXBlKSB7Ci0gICAgICAgIHRoaXMueG1sVHlwZSA9IHhtbFR5cGU7Ci0gICAgfQotCi0gICAgcHVibGljIFR5cGUgZ2V0UGFyZW50VHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIHBhcmVudFR5cGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGFyZW50VHlwZShUeXBlIHBhcmVudFR5cGUpIHsKLSAgICAgICAgdGhpcy5wYXJlbnRUeXBlID0gcGFyZW50VHlwZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdCBnZXRBdHRyaWJ1dGVGaWVsZHMoKSB7Ci0gICAgICAgIHJldHVybiBhdHRyaWJ1dGVGaWVsZHM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QXR0cmlidXRlRmllbGRzKExpc3QgYXR0cmlidXRlRmllbGRzKSB7Ci0gICAgICAgIHRoaXMuYXR0cmlidXRlRmllbGRzID0gYXR0cmlidXRlRmllbGRzOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvbWV0YWRhdGEvQXR0cmlidXRlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL21ldGFkYXRhL0F0dHJpYnV0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmI5YWRiLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvbWV0YWRhdGEvQXR0cmlidXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLkNvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5leGNlcHRpb24uTWV0YURhdGFQb3B1bGF0ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5leGNlcHRpb24uU2NoZW1hR2VuZXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS5pbXBsLlR5cGVJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLm1ldGFkYXRhLnhtbC5YbWxFbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLm1ldGFkYXRhLnhtbC5pbXBsLlhtbEVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLnR5cGVzLk1hcFR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkudXRpbC5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkudXRpbC5VdGlsOwotCi1pbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLXB1YmxpYyBjbGFzcyBBdHRyaWJ1dGUgewotCi0gICAgLyoqCi0gICAgICogcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhpcyBhdHRyaWJ1dGUKLSAgICAgKi8KLSAgICBwcml2YXRlIFByb3BlcnR5RGVzY3JpcHRvciBwcm9wZXJ0eURlc2NyaXB0b3I7Ci0gICAgLyoqCi0gICAgICogbmFtZSBvZiB0aGUgYXR0cmlidXRlIHRoaXMgaXMgdGhlIG5hbWUgb2YgdGhlIFhtbEVsZW1lbnQgYXMgd2VsbAotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0KLSAgICAvKioKLSAgICAgKiBuYW1lc3BjZSBvZiB0aGlzIGF0dHJpYnV0ZQotICAgICAqIHRoaXMgaXMgYWx3YXlzIHRoZSBuYW1lc3BhY2Ugb2YgdGhlIHBhcmVudCB0eXBlCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZXNwYWNlOwotCi0gICAgLyoqCi0gICAgICogZ2V0dGVyIG1ldGhvZCBvZiB0aGUgYXR0cmlidXRlCi0gICAgICovCi0gICAgcHJpdmF0ZSBNZXRob2QgZ2V0dGVyTWV0aG9kOwotCi0gICAgLyoqCi0gICAgICogc2V0dGVyIG1ldGhvZCBvZiB0aGUgYXR0cmlidXRlCi0gICAgICovCi0gICAgcHJpdmF0ZSBNZXRob2Qgc2V0dGVyTWV0aG9kOwotCi0gICAgLyoqCi0gICAgICogYXR0cmlidXRlIG1ldGFkYXRhIHR5cGUKLSAgICAgKi8KLSAgICBwcml2YXRlIFR5cGUgdHlwZTsKLQotICAgIC8qKgotICAgICAqIGlzIHRoaXMgYXR0cmlidXRlIGFuIGFycmF5Ci0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzQXJyYXk7Ci0KLSAgICAvKioKLSAgICAgKiBzY2htZW1hIGVsZW1lbnQgY29ycmVzcG9uZGluZyB0byB0aGlzIGF0dHJpYnV0ZQotICAgICAqIGFsd2F5cyBhbiBhdHRyaWJ1dGUgcmVmZXIgdG8gYW5kIHNjaGVtYSBYbWxFbGVtZW50Ci0gICAgICovCi0gICAgcHJpdmF0ZSBYbWxFbGVtZW50IGVsZW1lbnQ7Ci0KLSAgICAvKioKLSAgICAgKiBib29sZWFuIHZhcmlhYmxlIHRvIGNoZWNrIHRvIHNlZSB3aGV0aGVyIHdlIGdlbmVyYXRlZCB0aGUKLSAgICAgKiBlbGVtZW50IGZvciB0aGlzIHNjaGVtYS4KLSAgICAgKiBhbHRob3VnaCB3ZSBjYW4gY2hlY2sgZm9yIG51bGwgdmFsdWUgb2YgdGhlIGVsZW1lbnQgd2UgcHJlZmVyCi0gICAgICogdG8ga2VlcCBhIHNlcGVyYXRlIHZhcmlhYmxlLgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBpc1NjaGVtYUdlbmVyYXRlZDsKLQotICAgIC8qKgotICAgICAqIGNsYXNzIHR5cGUgb2YgdGhlIGF0dHJpYnV0ZSBjbGFzcwotICAgICAqLwotICAgIHByaXZhdGUgaW50IGNsYXNzVHlwZTsKLQotICAgIC8qKgotICAgICAqIGRlZmF1bHQgY29uc3RydWN0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgQXR0cmlidXRlKCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIGNvbnN0cnVjdG9yIHdpdGggdGhlIHByb3BlcnR5IGRlc2NyaXB0b3IKLSAgICAgKgotICAgICAqIEBwYXJhbSBwcm9wZXJ0eURlc2NyaXB0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgQXR0cmlidXRlKFByb3BlcnR5RGVzY3JpcHRvciBwcm9wZXJ0eURlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZXNwYWNlKSB7Ci0gICAgICAgIHRoaXMucHJvcGVydHlEZXNjcmlwdG9yID0gcHJvcGVydHlEZXNjcmlwdG9yOwotICAgICAgICBpZiAoQ29uc3RhbnRzLlJNSV9UWVBFX05BTVNQQUNFLmVxdWFscyhuYW1lc3BhY2UpKXsKLSAgICAgICAgICAgIC8vIGZvciBybWkgZGVmaW5lZCB0eXBlIGVsZW1lbnRzIHdlIGtlZXAgYXR0cmlidXRlcyBhcyB1bnF1YWxpZmllZAotICAgICAgICAgICAgdGhpcy5uYW1lc3BhY2UgPSBudWxsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICB0aGlzLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcG9wdWxhdGVNZXRhRGF0YShDb25maWd1cmF0b3IgY29uZmlndXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwIHByb2Nlc3NlZFR5cGVNYXApCi0gICAgICAgICAgICB0aHJvd3MgTWV0YURhdGFQb3B1bGF0ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMubmFtZSA9IHRoaXMucHJvcGVydHlEZXNjcmlwdG9yLmdldE5hbWUoKTsKLSAgICAgICAgdGhpcy5nZXR0ZXJNZXRob2QgPSB0aGlzLnByb3BlcnR5RGVzY3JpcHRvci5nZXRSZWFkTWV0aG9kKCk7Ci0gICAgICAgIHRoaXMuc2V0dGVyTWV0aG9kID0gdGhpcy5wcm9wZXJ0eURlc2NyaXB0b3IuZ2V0V3JpdGVNZXRob2QoKTsKLSAgICAgICAgQ2xhc3MgYmFzZUNsYXNzID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHRoaXMuY2xhc3NUeXBlID0gVXRpbC5nZXRDbGFzc1R5cGUodGhpcy5wcm9wZXJ0eURlc2NyaXB0b3IuZ2V0UHJvcGVydHlUeXBlKCkpOwotCi0gICAgICAgICAgICBpZiAoKHRoaXMuY2xhc3NUeXBlICYgQ29uc3RhbnRzLkNPTExFQ1RJT05fVFlQRSkgPT0gQ29uc3RhbnRzLkNPTExFQ1RJT05fVFlQRSl7Ci0gICAgICAgICAgICAgICAvLyBpLmUuIGlmIHRoaXMgaXMgY29sbGVjdGlvbiB0eXBlCi0gICAgICAgICAgICAgICB0aGlzLmlzQXJyYXkgPSB0cnVlOwotICAgICAgICAgICAgICAgYmFzZUNsYXNzID0gT2JqZWN0LmNsYXNzOwotICAgICAgICAgICAgfSBlbHNlIGlmICgodGhpcy5jbGFzc1R5cGUgJiBDb25zdGFudHMuTUFQX1RZUEUpID09IENvbnN0YW50cy5NQVBfVFlQRSl7Ci0gICAgICAgICAgICAgICAvLyBpZiB0aGUgYXR0cmlidXRlIGlzIG1lcCB0eXBlIHdlIHNldCBhIGN1c3RvbSB0eXBlIGZvciBpdC4KLSAgICAgICAgICAgICAgIHRoaXMuaXNBcnJheSA9IHRydWU7Ci0gICAgICAgICAgICAgICBiYXNlQ2xhc3MgPSBNYXBUeXBlLmNsYXNzOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aGlzLmlzQXJyYXkgPSB0aGlzLnByb3BlcnR5RGVzY3JpcHRvci5nZXRQcm9wZXJ0eVR5cGUoKS5pc0FycmF5KCk7Ci0gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNBcnJheSkgewotICAgICAgICAgICAgICAgICAgICBiYXNlQ2xhc3MgPSB0aGlzLnByb3BlcnR5RGVzY3JpcHRvci5nZXRQcm9wZXJ0eVR5cGUoKS5nZXRDb21wb25lbnRUeXBlKCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYmFzZUNsYXNzID0gdGhpcy5wcm9wZXJ0eURlc2NyaXB0b3IuZ2V0UHJvcGVydHlUeXBlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocHJvY2Vzc2VkVHlwZU1hcC5jb250YWluc0tleShiYXNlQ2xhc3MpKXsKLSAgICAgICAgICAgICAgICB0aGlzLnR5cGUgPSAoVHlwZSkgcHJvY2Vzc2VkVHlwZU1hcC5nZXQoYmFzZUNsYXNzKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhpcy50eXBlID0gbmV3IFR5cGVJbXBsKGJhc2VDbGFzcyk7Ci0gICAgICAgICAgICAgICAgcHJvY2Vzc2VkVHlwZU1hcC5wdXQoYmFzZUNsYXNzLCB0aGlzLnR5cGUpOwotICAgICAgICAgICAgICAgIHRoaXMudHlwZS5wb3B1bGF0ZU1ldGFEYXRhKGNvbmZpZ3VyYXRvciwgcHJvY2Vzc2VkVHlwZU1hcCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhUG9wdWxhdGVFeGNlcHRpb24oIkNhbiBub3QgaW5zdGF0YWl0ZSBjbGFzcyAiCi0gICAgICAgICAgICAgICAgICAgICsgdGhpcy5wcm9wZXJ0eURlc2NyaXB0b3IuZ2V0UHJvcGVydHlUeXBlKCkuZ2V0TmFtZSgpLCBlKTsKLSAgICAgICAgfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTWV0YURhdGFQb3B1bGF0ZUV4Y2VwdGlvbigiQ2FuIG5vdCBpbnN0YXRhaXRlIGNsYXNzICIKLSAgICAgICAgICAgICAgICAgICAgKyB0aGlzLnByb3BlcnR5RGVzY3JpcHRvci5nZXRQcm9wZXJ0eVR5cGUoKS5nZXROYW1lKCksIGUpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIHRoaXMgbWV0aG9kIHNldHMgdGhlIFhNTEVsZW1lbnQgY29ycmVjdGx5LiB0aGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIG9ubHkKLSAgICAgKiBpZiB0aGlzIGlzIG5vdCBwcm9jZXNzZWQKLSAgICAgKiBAcGFyYW0gY29uZmlndXJhdG9yCi0gICAgICogQHBhcmFtIHNjaGVtYU1hcAotICAgICAqIEB0aHJvd3MgU2NoZW1hR2VuZXJhdGlvbkV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGdlbmVyYXRlU2NoZW1hKENvbmZpZ3VyYXRvciBjb25maWd1cmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwIHNjaGVtYU1hcCkKLSAgICAgICAgICAgIHRocm93cyBTY2hlbWFHZW5lcmF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gaGVyZSB3ZSBoYXZlIHRvIHNlbmQgdGhlIFhtbEVsZW1lbnQgY29ycmVjdGx5Ci0gICAgICAgdGhpcy5pc1NjaGVtYUdlbmVyYXRlZCA9IHRydWU7Ci0gICAgICAgdGhpcy5lbGVtZW50ID0gbmV3IFhtbEVsZW1lbnRJbXBsKCF0aGlzLmlzQXJyYXkgJiYgdGhpcy50eXBlLmdldEphdmFDbGFzcygpLmlzUHJpbWl0aXZlKCkpOwotICAgICAgIHRoaXMuZWxlbWVudC5zZXROYW1lKHRoaXMubmFtZSk7Ci0gICAgICAgdGhpcy5lbGVtZW50LnNldE5hbWVzcGFjZSh0aGlzLm5hbWVzcGFjZSk7Ci0gICAgICAgdGhpcy5lbGVtZW50LnNldFRvcEVsZW1lbnQoZmFsc2UpOwotCi0gICAgICAgaWYgKCF0aGlzLnR5cGUuaXNTY2hlbWFHZW5lcmF0ZWQoKSl7Ci0gICAgICAgICAgdGhpcy50eXBlLmdlbmVyYXRlU2NoZW1hKGNvbmZpZ3VyYXRvcixzY2hlbWFNYXApOwotICAgICAgIH0KLSAgICAgICB0aGlzLmVsZW1lbnQuc2V0VHlwZSh0aGlzLnR5cGUuZ2V0WG1sVHlwZSgpKTsKLSAgICAgICB0aGlzLmVsZW1lbnQuc2V0QXJyYXkodGhpcy5pc0FycmF5KTsKLQotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0eURlc2NyaXB0b3IgZ2V0UHJvcGVydHlEZXNjcmlwdG9yKCkgewotICAgICAgICByZXR1cm4gcHJvcGVydHlEZXNjcmlwdG9yOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5RGVzY3JpcHRvcihQcm9wZXJ0eURlc2NyaXB0b3IgcHJvcGVydHlEZXNjcmlwdG9yKSB7Ci0gICAgICAgIHRoaXMucHJvcGVydHlEZXNjcmlwdG9yID0gcHJvcGVydHlEZXNjcmlwdG9yOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBNZXRob2QgZ2V0R2V0dGVyTWV0aG9kKCkgewotICAgICAgICByZXR1cm4gZ2V0dGVyTWV0aG9kOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEdldHRlck1ldGhvZChNZXRob2QgZ2V0dGVyTWV0aG9kKSB7Ci0gICAgICAgIHRoaXMuZ2V0dGVyTWV0aG9kID0gZ2V0dGVyTWV0aG9kOwotICAgIH0KLQotICAgIHB1YmxpYyBNZXRob2QgZ2V0U2V0dGVyTWV0aG9kKCkgewotICAgICAgICByZXR1cm4gc2V0dGVyTWV0aG9kOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFNldHRlck1ldGhvZChNZXRob2Qgc2V0dGVyTWV0aG9kKSB7Ci0gICAgICAgIHRoaXMuc2V0dGVyTWV0aG9kID0gc2V0dGVyTWV0aG9kOwotICAgIH0KLQotICAgIHB1YmxpYyBUeXBlIGdldFR5cGUoKSB7Ci0gICAgICAgIHJldHVybiB0eXBlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFR5cGUoVHlwZSB0eXBlKSB7Ci0gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNBcnJheSgpIHsKLSAgICAgICAgcmV0dXJuIGlzQXJyYXk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QXJyYXkoYm9vbGVhbiBhcnJheSkgewotICAgICAgICBpc0FycmF5ID0gYXJyYXk7Ci0gICAgfQotCi0gICAgcHVibGljIFhtbEVsZW1lbnQgZ2V0RWxlbWVudCgpIHsKLSAgICAgICAgcmV0dXJuIGVsZW1lbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RWxlbWVudChYbWxFbGVtZW50IGVsZW1lbnQpIHsKLSAgICAgICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1NjaGVtYUdlbmVyYXRlZCgpIHsKLSAgICAgICAgcmV0dXJuIGlzU2NoZW1hR2VuZXJhdGVkOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFNjaGVtYUdlbmVyYXRlZChib29sZWFuIHNjaGVtYUdlbmVyYXRlZCkgewotICAgICAgICBpc1NjaGVtYUdlbmVyYXRlZCA9IHNjaGVtYUdlbmVyYXRlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZSgpIHsKLSAgICAgICAgcmV0dXJuIG5hbWVzcGFjZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lc3BhY2UoU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICB0aGlzLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldENsYXNzVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIGNsYXNzVHlwZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc1R5cGUoaW50IGNsYXNzVHlwZSkgewotICAgICAgICB0aGlzLmNsYXNzVHlwZSA9IGNsYXNzVHlwZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvbWV0YWRhdGEvQXR0cmlidXRlRmllbGQuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvbWV0YWRhdGEvQXR0cmlidXRlRmllbGQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE4ZjNhYi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL21ldGFkYXRhL0F0dHJpYnV0ZUZpZWxkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLkNvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5kYXRhYmluZC5STUlCZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmV4Y2VwdGlvbi5NZXRhRGF0YVBvcHVsYXRlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmV4Y2VwdGlvbi5TY2hlbWFHZW5lcmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLm1ldGFkYXRhLmltcGwuVHlwZUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEueG1sLlhtbEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS54bWwuaW1wbC5YbWxBdHRyaWJ1dGVJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLnV0aWwuSmF2YVR5cGVUb1FOYW1lTWFwOwotCi1pbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotCi1wdWJsaWMgY2xhc3MgQXR0cmlidXRlRmllbGQgZXh0ZW5kcyBGaWVsZCB7Ci0KLSAgICAvKioKLSAgICAgKiB4bWwgYXR0cmlidXRlIHJlcHJlc2VudGluZyB0aGlzIGF0dHJpYnV0ZQotICAgICAqLwotICAgIHByb3RlY3RlZCBYbWxBdHRyaWJ1dGUgYXR0cmlidXRlOwotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzUmVxdXJpZWQ7Ci0KLSAgICBwdWJsaWMgQXR0cmlidXRlRmllbGQoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIEF0dHJpYnV0ZUZpZWxkKFByb3BlcnR5RGVzY3JpcHRvciBwcm9wZXJ0eURlc2NyaXB0b3IsIFN0cmluZyBuYW1lc3BhY2UpIHsKLSAgICAgICAgc3VwZXIocHJvcGVydHlEZXNjcmlwdG9yLCBuYW1lc3BhY2UpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHBvcHVsYXRlTWV0YURhdGEoQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvciwgTWFwIHByb2Nlc3NlZFR5cGVNYXApCi0gICAgICAgICAgICB0aHJvd3MgTWV0YURhdGFQb3B1bGF0ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnBvcHVsYXRlTWV0YURhdGEoY29uZmlndXJhdG9yLCBwcm9jZXNzZWRUeXBlTWFwKTsKLSAgICAgICAgaWYgKCF0aGlzLnByb3BlcnR5RGVzY3JpcHRvci5nZXRQcm9wZXJ0eVR5cGUoKS5pc0FycmF5KCkpIHsKLSAgICAgICAgICAgIENsYXNzIGJhc2VDbGFzcyA9IHRoaXMucHJvcGVydHlEZXNjcmlwdG9yLmdldFByb3BlcnR5VHlwZSgpOwotICAgICAgICAgICAgaWYgKEphdmFUeXBlVG9RTmFtZU1hcC5jb250YWluc0tleShiYXNlQ2xhc3MpIHx8Ci0gICAgICAgICAgICAgICAgICAgIFJNSUJlYW4uY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShiYXNlQ2xhc3MpKSB7Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJvY2Vzc2VkVHlwZU1hcC5jb250YWluc0tleShiYXNlQ2xhc3MpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMudHlwZSA9IChUeXBlKSBwcm9jZXNzZWRUeXBlTWFwLmdldChiYXNlQ2xhc3MpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoUk1JQmVhbi5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGJhc2VDbGFzcykpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhpcyBiZWFuIGlzIGFuIFJNSUJlYW4gd2UgaGF2ZSB0byB1c2UgdGhlIHR5cGUgcmV0dXJuCi0gICAgICAgICAgICAgICAgICAgIC8vIGZyb20gdGhhdCBiZWFuLgotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kIGdldEJlYW5DbGFzc01ldGhvZCA9IGJhc2VDbGFzcy5nZXRNZXRob2QoImdldEJlYW5DbGFzcyIsIG5ldyBDbGFzc1tde30pOwotICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3Mgcm1pQmVhblR5cGUgPSAoQ2xhc3MpIGdldEJlYW5DbGFzc01ldGhvZC5pbnZva2UobnVsbCwgbmV3IE9iamVjdFtde30pOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJtaUJlYW5UeXBlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnR5cGUgPSAoVHlwZSkgcm1pQmVhblR5cGUubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzZWRUeXBlTWFwLnB1dChiYXNlQ2xhc3MsIHRoaXMudHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50eXBlLnBvcHVsYXRlTWV0YURhdGEoY29uZmlndXJhdG9yLCBwcm9jZXNzZWRUeXBlTWFwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhUG9wdWxhdGVFeGNlcHRpb24oInRoZXJlIGlzIG5vIHR5cGUgY2xhc3MgZm9yIHJtaSBjbGFzcyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGJhc2VDbGFzcy5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhUG9wdWxhdGVFeGNlcHRpb24oIk5vIGdldEJlYW5DbGFzcyBtZXRob2QgaXMgbm90IGRlZmluZWQgZm9yICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHJtaSBiZWFuIGNsYXNzICIgKyBiYXNlQ2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWV0YURhdGFQb3B1bGF0ZUV4Y2VwdGlvbigiTm8gZ2V0QmVhbkNsYXNzIG1ldGhvZCBpcyBub3QgZGVmaW5lZCBmb3IgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgcm1pIGJlYW4gY2xhc3MgIiArIGJhc2VDbGFzcy5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBNZXRhRGF0YVBvcHVsYXRlRXhjZXB0aW9uKCJDYW4gbm90IGludm9rZSBybWkgYmVhbiBjbGFzcyAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZUNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhUG9wdWxhdGVFeGNlcHRpb24oIkNhbiBub3QgaW5zdGFudGlhdGUgUk1JIGJlYW4gY2xhc3MgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VDbGFzcy5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy50eXBlID0gbmV3IFR5cGVJbXBsKGJhc2VDbGFzcyk7Ci0gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZFR5cGVNYXAucHV0KGJhc2VDbGFzcywgdGhpcy50eXBlKTsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy50eXBlLnBvcHVsYXRlTWV0YURhdGEoY29uZmlndXJhdG9yLCBwcm9jZXNzZWRUeXBlTWFwKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBNZXRhRGF0YVBvcHVsYXRlRXhjZXB0aW9uKCJBdHRyaWJ1dGUgZWxlbWVudCBtdXN0IGhhdmUgYSBrbm93biBzaW1wZSB0eXBlIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNZXRhRGF0YVBvcHVsYXRlRXhjZXB0aW9uKCJBdHRyaWJ1dGUgZWxlbWVudCBjYW4gbm90IGJlIGFuIGFycmF5IHR5cGUiKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZ2VuZXJhdGVTY2hlbWEoQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvciwgTWFwIHNjaGVtYU1hcCkKLSAgICAgICAgICAgIHRocm93cyBTY2hlbWFHZW5lcmF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuZ2VuZXJhdGVTY2hlbWEoY29uZmlndXJhdG9yLCBzY2hlbWFNYXApOwotICAgICAgICB0aGlzLmF0dHJpYnV0ZSA9IG5ldyBYbWxBdHRyaWJ1dGVJbXBsKHRoaXMuZ2V0UHJvcGVydHlEZXNjcmlwdG9yKCkuZ2V0UHJvcGVydHlUeXBlKCkuaXNQcmltaXRpdmUoKSk7Ci0gICAgICAgIHRoaXMuYXR0cmlidXRlLnNldE5hbWUodGhpcy5uYW1lKTsKLSAgICAgICAgdGhpcy5hdHRyaWJ1dGUuc2V0TmFtZXNwYWNlKHRoaXMubmFtZXNwYWNlKTsKLSAgICAgICAgdGhpcy5hdHRyaWJ1dGUuc2V0VHlwZSh0aGlzLnR5cGUuZ2V0WG1sVHlwZSgpKTsKLSAgICAgICAgdGhpcy5hdHRyaWJ1dGUuc2V0UmVxdWlyZWQodGhpcy5pc1JlcXVyaWVkKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgWG1sQXR0cmlidXRlIGdldEF0dHJpYnV0ZSgpIHsKLSAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoWG1sQXR0cmlidXRlIGF0dHJpYnV0ZSkgewotICAgICAgICB0aGlzLmF0dHJpYnV0ZSA9IGF0dHJpYnV0ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1JlcXVyaWVkKCkgewotICAgICAgICByZXR1cm4gaXNSZXF1cmllZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRSZXF1cmllZChib29sZWFuIHJlcXVyaWVkKSB7Ci0gICAgICAgIGlzUmVxdXJpZWQgPSByZXF1cmllZDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvbWV0YWRhdGEvRWxlbWVudEZpZWxkLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL21ldGFkYXRhL0VsZW1lbnRGaWVsZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGM1YTMxLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvbWV0YWRhdGEvRWxlbWVudEZpZWxkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLkNvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5kYXRhYmluZC5STUlCZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmV4Y2VwdGlvbi5NZXRhRGF0YVBvcHVsYXRlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmV4Y2VwdGlvbi5TY2hlbWFHZW5lcmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLm1ldGFkYXRhLmltcGwuVHlwZUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEueG1sLlhtbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEueG1sLmltcGwuWG1sRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkudHlwZXMuTWFwVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS51dGlsLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS51dGlsLlV0aWw7Ci0KLWltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0KLXB1YmxpYyBjbGFzcyBFbGVtZW50RmllbGQgZXh0ZW5kcyBGaWVsZCB7Ci0KLSAgICAvKioKLSAgICAgKiBpcyB0aGlzIGF0dHJpYnV0ZSBhbiBhcnJheQotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGlzQXJyYXk7Ci0KLSAgICAvKioKLSAgICAgKiBjbGFzcyB0eXBlIG9mIHRoZSBhdHRyaWJ1dGUgY2xhc3MKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgaW50IGNsYXNzVHlwZTsKLQotICAgIC8qKgotICAgICAqIHNjaG1lbWEgZWxlbWVudCBjb3JyZXNwb25kaW5nIHRvIHRoaXMgYXR0cmlidXRlCi0gICAgICogYWx3YXlzIGFuIGF0dHJpYnV0ZSByZWZlciB0byBhbmQgc2NoZW1hIFhtbEVsZW1lbnQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgWG1sRWxlbWVudCBlbGVtZW50OwotCi0KLSAgICBwdWJsaWMgRWxlbWVudEZpZWxkKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBFbGVtZW50RmllbGQoUHJvcGVydHlEZXNjcmlwdG9yIHByb3BlcnR5RGVzY3JpcHRvciwgU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICBzdXBlcihwcm9wZXJ0eURlc2NyaXB0b3IsIG5hbWVzcGFjZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcG9wdWxhdGVNZXRhRGF0YShDb25maWd1cmF0b3IgY29uZmlndXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwIHByb2Nlc3NlZFR5cGVNYXApCi0gICAgICAgICAgICB0aHJvd3MgTWV0YURhdGFQb3B1bGF0ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnBvcHVsYXRlTWV0YURhdGEoY29uZmlndXJhdG9yLCBwcm9jZXNzZWRUeXBlTWFwKTsKLSAgICAgICAgQ2xhc3MgYmFzZUNsYXNzID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHRoaXMuY2xhc3NUeXBlID0gVXRpbC5nZXRDbGFzc1R5cGUodGhpcy5wcm9wZXJ0eURlc2NyaXB0b3IuZ2V0UHJvcGVydHlUeXBlKCkpOwotCi0gICAgICAgICAgICBpZiAoKHRoaXMuY2xhc3NUeXBlICYgQ29uc3RhbnRzLkNPTExFQ1RJT05fVFlQRSkgPT0gQ29uc3RhbnRzLkNPTExFQ1RJT05fVFlQRSkgewotICAgICAgICAgICAgICAgIC8vIGkuZS4gaWYgdGhpcyBpcyBjb2xsZWN0aW9uIHR5cGUKLSAgICAgICAgICAgICAgICB0aGlzLmlzQXJyYXkgPSB0cnVlOwotICAgICAgICAgICAgICAgIGJhc2VDbGFzcyA9IE9iamVjdC5jbGFzczsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoKHRoaXMuY2xhc3NUeXBlICYgQ29uc3RhbnRzLk1BUF9UWVBFKSA9PSBDb25zdGFudHMuTUFQX1RZUEUpIHsKLSAgICAgICAgICAgICAgICAvLyBpZiB0aGUgYXR0cmlidXRlIGlzIG1lcCB0eXBlIHdlIHNldCBhIGN1c3RvbSB0eXBlIGZvciBpdC4KLSAgICAgICAgICAgICAgICB0aGlzLmlzQXJyYXkgPSB0cnVlOwotICAgICAgICAgICAgICAgIGJhc2VDbGFzcyA9IE1hcFR5cGUuY2xhc3M7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRoaXMuaXNBcnJheSA9IHRoaXMucHJvcGVydHlEZXNjcmlwdG9yLmdldFByb3BlcnR5VHlwZSgpLmlzQXJyYXkoKTsKLSAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0FycmF5KSB7Ci0gICAgICAgICAgICAgICAgICAgIGJhc2VDbGFzcyA9IHRoaXMucHJvcGVydHlEZXNjcmlwdG9yLmdldFByb3BlcnR5VHlwZSgpLmdldENvbXBvbmVudFR5cGUoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBiYXNlQ2xhc3MgPSB0aGlzLnByb3BlcnR5RGVzY3JpcHRvci5nZXRQcm9wZXJ0eVR5cGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChwcm9jZXNzZWRUeXBlTWFwLmNvbnRhaW5zS2V5KGJhc2VDbGFzcykpIHsKLSAgICAgICAgICAgICAgICB0aGlzLnR5cGUgPSAoVHlwZSkgcHJvY2Vzc2VkVHlwZU1hcC5nZXQoYmFzZUNsYXNzKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoUk1JQmVhbi5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGJhc2VDbGFzcykpewotICAgICAgICAgICAgICAgIC8vIGlmIHRoaXMgYmVhbiBpcyBhbiBSTUlCZWFuIHdlIGhhdmUgdG8gdXNlIHRoZSB0eXBlIHJldHVybgotICAgICAgICAgICAgICAgIC8vIGZyb20gdGhhdCBiZWFuLgotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIE1ldGhvZCBnZXRCZWFuQ2xhc3NNZXRob2QgPSBiYXNlQ2xhc3MuZ2V0TWV0aG9kKCJnZXRCZWFuQ2xhc3MiLCBuZXcgQ2xhc3NbXXt9KTsKLSAgICAgICAgICAgICAgICAgICAgQ2xhc3Mgcm1pQmVhblR5cGUgPSAoQ2xhc3MpIGdldEJlYW5DbGFzc01ldGhvZC5pbnZva2UobnVsbCwgbmV3IE9iamVjdFtde30pOwotICAgICAgICAgICAgICAgICAgICBpZiAocm1pQmVhblR5cGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50eXBlID0gKFR5cGUpIHJtaUJlYW5UeXBlLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzZWRUeXBlTWFwLnB1dChiYXNlQ2xhc3MsIHRoaXMudHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnR5cGUucG9wdWxhdGVNZXRhRGF0YShjb25maWd1cmF0b3IsIHByb2Nlc3NlZFR5cGVNYXApOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhUG9wdWxhdGVFeGNlcHRpb24oInRoZXJlIGlzIG5vIHR5cGUgY2xhc3MgZm9yIHJtaSBjbGFzcyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgYmFzZUNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWV0YURhdGFQb3B1bGF0ZUV4Y2VwdGlvbigiTm8gZ2V0QmVhbkNsYXNzIG1ldGhvZCBpcyBub3QgZGVmaW5lZCBmb3IgIiArCi0gICAgICAgICAgICAgICAgICAgICIgcm1pIGJlYW4gY2xhc3MgIiArIGJhc2VDbGFzcy5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWV0YURhdGFQb3B1bGF0ZUV4Y2VwdGlvbigiTm8gZ2V0QmVhbkNsYXNzIG1ldGhvZCBpcyBub3QgZGVmaW5lZCBmb3IgIiArCi0gICAgICAgICAgICAgICAgICAgICIgcm1pIGJlYW4gY2xhc3MgIiArIGJhc2VDbGFzcy5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aGlzLnR5cGUgPSBuZXcgVHlwZUltcGwoYmFzZUNsYXNzKTsKLSAgICAgICAgICAgICAgICBwcm9jZXNzZWRUeXBlTWFwLnB1dChiYXNlQ2xhc3MsIHRoaXMudHlwZSk7Ci0gICAgICAgICAgICAgICAgdGhpcy50eXBlLnBvcHVsYXRlTWV0YURhdGEoY29uZmlndXJhdG9yLCBwcm9jZXNzZWRUeXBlTWFwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTWV0YURhdGFQb3B1bGF0ZUV4Y2VwdGlvbigiQ2FuIG5vdCBpbnN0YXRhaXRlIGNsYXNzICIKLSAgICAgICAgICAgICAgICAgICAgKyB0aGlzLnByb3BlcnR5RGVzY3JpcHRvci5nZXRQcm9wZXJ0eVR5cGUoKS5nZXROYW1lKCksIGUpOwotICAgICAgICB9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNZXRhRGF0YVBvcHVsYXRlRXhjZXB0aW9uKCJDYW4gbm90IGluc3RhdGFpdGUgY2xhc3MgIgotICAgICAgICAgICAgICAgICAgICArIHRoaXMucHJvcGVydHlEZXNjcmlwdG9yLmdldFByb3BlcnR5VHlwZSgpLmdldE5hbWUoKSwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBnZW5lcmF0ZVNjaGVtYShDb25maWd1cmF0b3IgY29uZmlndXJhdG9yLCBNYXAgc2NoZW1hTWFwKSB0aHJvd3MgU2NoZW1hR2VuZXJhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLmdlbmVyYXRlU2NoZW1hKGNvbmZpZ3VyYXRvciwgc2NoZW1hTWFwKTsKLSAgICAgICAgdGhpcy5lbGVtZW50ID0gbmV3IFhtbEVsZW1lbnRJbXBsKCF0aGlzLmlzQXJyYXkgJiYgdGhpcy50eXBlLmdldEphdmFDbGFzcygpLmlzUHJpbWl0aXZlKCkpOwotICAgICAgICB0aGlzLmVsZW1lbnQuc2V0TmFtZSh0aGlzLm5hbWUpOwotICAgICAgICB0aGlzLmVsZW1lbnQuc2V0TmFtZXNwYWNlKHRoaXMubmFtZXNwYWNlKTsKLSAgICAgICAgdGhpcy5lbGVtZW50LnNldFRvcEVsZW1lbnQoZmFsc2UpOwotICAgICAgICB0aGlzLmVsZW1lbnQuc2V0VHlwZSh0aGlzLnR5cGUuZ2V0WG1sVHlwZSgpKTsKLSAgICAgICAgdGhpcy5lbGVtZW50LnNldEFycmF5KHRoaXMuaXNBcnJheSk7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0FycmF5KCkgewotICAgICAgICByZXR1cm4gaXNBcnJheTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRBcnJheShib29sZWFuIGFycmF5KSB7Ci0gICAgICAgIGlzQXJyYXkgPSBhcnJheTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgWG1sRWxlbWVudCBnZXRFbGVtZW50KCkgewotICAgICAgICByZXR1cm4gZWxlbWVudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRFbGVtZW50KFhtbEVsZW1lbnQgZWxlbWVudCkgewotICAgICAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0Q2xhc3NUeXBlKCkgewotICAgICAgICByZXR1cm4gY2xhc3NUeXBlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENsYXNzVHlwZShpbnQgY2xhc3NUeXBlKSB7Ci0gICAgICAgIHRoaXMuY2xhc3NUeXBlID0gY2xhc3NUeXBlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9tZXRhZGF0YS9GaWVsZC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9tZXRhZGF0YS9GaWVsZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDMxZjhiLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvbWV0YWRhdGEvRmllbGQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLm1ldGFkYXRhOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmV4Y2VwdGlvbi5NZXRhRGF0YVBvcHVsYXRlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmV4Y2VwdGlvbi5TY2hlbWFHZW5lcmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLnV0aWwuQ29uc3RhbnRzOwotCi1pbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEZpZWxkIHsKLQotICAgIC8qKgotICAgICAqIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoaXMgYXR0cmlidXRlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFByb3BlcnR5RGVzY3JpcHRvciBwcm9wZXJ0eURlc2NyaXB0b3I7Ci0gICAgLyoqCi0gICAgICogbmFtZSBvZiB0aGUgYXR0cmlidXRlIHRoaXMgaXMgdGhlIG5hbWUgb2YgdGhlIFhtbEVsZW1lbnQgYXMgd2VsbAotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgbmFtZTsKLQotICAgIC8qKgotICAgICAqIG5hbWVzcGNlIG9mIHRoaXMgYXR0cmlidXRlCi0gICAgICogdGhpcyBpcyBhbHdheXMgdGhlIG5hbWVzcGFjZSBvZiB0aGUgcGFyZW50IHR5cGUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIG5hbWVzcGFjZTsKLQotICAgIC8qKgotICAgICAqIGdldHRlciBtZXRob2Qgb2YgdGhlIGF0dHJpYnV0ZQotICAgICAqLwotICAgIHByb3RlY3RlZCBNZXRob2QgZ2V0dGVyTWV0aG9kOwotCi0gICAgLyoqCi0gICAgICogc2V0dGVyIG1ldGhvZCBvZiB0aGUgYXR0cmlidXRlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIE1ldGhvZCBzZXR0ZXJNZXRob2Q7Ci0KLSAgICAvKioKLSAgICAgKiBhdHRyaWJ1dGUgbWV0YWRhdGEgdHlwZQotICAgICAqLwotICAgIHByb3RlY3RlZCBUeXBlIHR5cGU7Ci0KLSAgICAvKioKLSAgICAgKiBib29sZWFuIHZhcmlhYmxlIHRvIGNoZWNrIHRvIHNlZSB3aGV0aGVyIHdlIGdlbmVyYXRlZCB0aGUKLSAgICAgKiBlbGVtZW50IGZvciB0aGlzIHNjaGVtYS4KLSAgICAgKiBhbHRob3VnaCB3ZSBjYW4gY2hlY2sgZm9yIG51bGwgdmFsdWUgb2YgdGhlIGVsZW1lbnQgd2UgcHJlZmVyCi0gICAgICogdG8ga2VlcCBhIHNlcGVyYXRlIHZhcmlhYmxlLgotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGlzU2NoZW1hR2VuZXJhdGVkOwotCi0gICAgLyoqCi0gICAgICogZGVmYXVsdCBjb25zdHJ1Y3RvcgotICAgICAqLwotICAgIHB1YmxpYyBGaWVsZCgpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBjb25zdHJ1Y3RvciB3aXRoIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9yCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcHJvcGVydHlEZXNjcmlwdG9yCi0gICAgICovCi0gICAgcHVibGljIEZpZWxkKFByb3BlcnR5RGVzY3JpcHRvciBwcm9wZXJ0eURlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lc3BhY2UpIHsKLSAgICAgICAgdGhpcy5wcm9wZXJ0eURlc2NyaXB0b3IgPSBwcm9wZXJ0eURlc2NyaXB0b3I7Ci0gICAgICAgIGlmIChDb25zdGFudHMuUk1JX1RZUEVfTkFNU1BBQ0UuZXF1YWxzKG5hbWVzcGFjZSkpIHsKLSAgICAgICAgICAgIC8vIGZvciBybWkgZGVmaW5lZCB0eXBlIGVsZW1lbnRzIHdlIGtlZXAgYXR0cmlidXRlcyBhcyB1bnF1YWxpZmllZAotICAgICAgICAgICAgdGhpcy5uYW1lc3BhY2UgPSBudWxsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhpcy5uYW1lc3BhY2UgPSBuYW1lc3BhY2U7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHBvcHVsYXRlTWV0YURhdGEoQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcCBwcm9jZXNzZWRUeXBlTWFwKQotICAgICAgICAgICAgdGhyb3dzIE1ldGFEYXRhUG9wdWxhdGVFeGNlcHRpb24gewotICAgICAgICB0aGlzLm5hbWUgPSB0aGlzLnByb3BlcnR5RGVzY3JpcHRvci5nZXROYW1lKCk7Ci0gICAgICAgIHRoaXMuZ2V0dGVyTWV0aG9kID0gdGhpcy5wcm9wZXJ0eURlc2NyaXB0b3IuZ2V0UmVhZE1ldGhvZCgpOwotICAgICAgICB0aGlzLnNldHRlck1ldGhvZCA9IHRoaXMucHJvcGVydHlEZXNjcmlwdG9yLmdldFdyaXRlTWV0aG9kKCk7Ci0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIHRoaXMgbWV0aG9kIHNldHMgdGhlIFhNTEVsZW1lbnQgY29ycmVjdGx5LiB0aGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIG9ubHkKLSAgICAgKiBpZiB0aGlzIGlzIG5vdCBwcm9jZXNzZWQKLSAgICAgKgotICAgICAqIEBwYXJhbSBjb25maWd1cmF0b3IKLSAgICAgKiBAcGFyYW0gc2NoZW1hTWFwCi0gICAgICogQHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLnJtaS5leGNlcHRpb24uU2NoZW1hR2VuZXJhdGlvbkV4Y2VwdGlvbgotICAgICAqCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZ2VuZXJhdGVTY2hlbWEoQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXAgc2NoZW1hTWFwKQotICAgICAgICAgICAgdGhyb3dzIFNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb24gewotICAgICAgICAvLyBoZXJlIHdlIGhhdmUgdG8gc2VuZCB0aGUgWG1sRWxlbWVudCBjb3JyZWN0bHkKLSAgICAgICAgdGhpcy5pc1NjaGVtYUdlbmVyYXRlZCA9IHRydWU7Ci0KLSAgICAgICAgaWYgKCF0aGlzLnR5cGUuaXNTY2hlbWFHZW5lcmF0ZWQoKSkgewotICAgICAgICAgICAgdGhpcy50eXBlLmdlbmVyYXRlU2NoZW1hKGNvbmZpZ3VyYXRvciwgc2NoZW1hTWFwKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHVibGljIFByb3BlcnR5RGVzY3JpcHRvciBnZXRQcm9wZXJ0eURlc2NyaXB0b3IoKSB7Ci0gICAgICAgIHJldHVybiBwcm9wZXJ0eURlc2NyaXB0b3I7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHlEZXNjcmlwdG9yKFByb3BlcnR5RGVzY3JpcHRvciBwcm9wZXJ0eURlc2NyaXB0b3IpIHsKLSAgICAgICAgdGhpcy5wcm9wZXJ0eURlc2NyaXB0b3IgPSBwcm9wZXJ0eURlc2NyaXB0b3I7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIE1ldGhvZCBnZXRHZXR0ZXJNZXRob2QoKSB7Ci0gICAgICAgIHJldHVybiBnZXR0ZXJNZXRob2Q7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0R2V0dGVyTWV0aG9kKE1ldGhvZCBnZXR0ZXJNZXRob2QpIHsKLSAgICAgICAgdGhpcy5nZXR0ZXJNZXRob2QgPSBnZXR0ZXJNZXRob2Q7Ci0gICAgfQotCi0gICAgcHVibGljIE1ldGhvZCBnZXRTZXR0ZXJNZXRob2QoKSB7Ci0gICAgICAgIHJldHVybiBzZXR0ZXJNZXRob2Q7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2V0dGVyTWV0aG9kKE1ldGhvZCBzZXR0ZXJNZXRob2QpIHsKLSAgICAgICAgdGhpcy5zZXR0ZXJNZXRob2QgPSBzZXR0ZXJNZXRob2Q7Ci0gICAgfQotCi0gICAgcHVibGljIFR5cGUgZ2V0VHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIHR5cGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VHlwZShUeXBlIHR5cGUpIHsKLSAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1NjaGVtYUdlbmVyYXRlZCgpIHsKLSAgICAgICAgcmV0dXJuIGlzU2NoZW1hR2VuZXJhdGVkOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFNjaGVtYUdlbmVyYXRlZChib29sZWFuIHNjaGVtYUdlbmVyYXRlZCkgewotICAgICAgICBpc1NjaGVtYUdlbmVyYXRlZCA9IHNjaGVtYUdlbmVyYXRlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZSgpIHsKLSAgICAgICAgcmV0dXJuIG5hbWVzcGFjZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lc3BhY2UoU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICB0aGlzLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvbWV0YWRhdGEvT3BlcmF0aW9uLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL21ldGFkYXRhL09wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmI3NzgwLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvbWV0YWRhdGEvT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLkNvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5leGNlcHRpb24uTWV0YURhdGFQb3B1bGF0ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5leGNlcHRpb24uU2NoZW1hR2VuZXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS54bWwuWG1sRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS54bWwuWG1sSW1wb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLm1ldGFkYXRhLnhtbC5YbWxTY2hlbWE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEueG1sLlhtbFR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEueG1sLmltcGwuWG1sRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEueG1sLmltcGwuWG1sVHlwZUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkudXRpbC5Db25zdGFudHM7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1wdWJsaWMgY2xhc3MgT3BlcmF0aW9uIHsKLQotICAgIC8qKgotICAgICAqIGphdmFNZXRob2QgbmFtZQotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0KLSAgICAvKioKLSAgICAgKiBuYW1lc3BhY2UgdG8gd2hpY2ggamF2YU1ldGhvZCBiZWxvbmdzCi0gICAgICogbW9zdCBvZiB0aGUgdGltZSB0aGlzIGlzIHNhbWUgYXMgdGhlIHNlcnZpY2UgbmFtZXNwYWNlCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZXNwYWNlOwotICAgIC8qKgotICAgICAqIHNlcnZpY2UgY2xhc3MgbWV0aG9kIGZvciB0aGlzIGphdmFNZXRob2QKLSAgICAgKi8KLSAgICBwcml2YXRlIE1ldGhvZCBqYXZhTWV0aG9kOwotCi0gICAgLyoqCi0gICAgICogaW5wdXQgcGFyYW1ldGVycyBsaXN0IGZvciB0aGlzIG1ldGhvZChqYXZhTWV0aG9kKQotICAgICAqIHRoaXMgY29uc2lzdHMgb2YgYSBsaXN0IG9mIFBhcmFtZXRlciBvYmplY3RzCi0gICAgICovCi0gICAgcHJpdmF0ZSBMaXN0IGlucHV0UGFyYW1ldGVyczsKLQotICAgIC8qKgotICAgICAqIHJldHVybiB0eXBlIG9mIHRoZSBqYXZhTWV0aG9kCi0gICAgICovCi0gICAgcHJpdmF0ZSBQYXJhbWV0ZXIgb3V0cHV0UGFyYW1ldGVyOwotCi0gICAgLyoqCi0gICAgICogZ2VuZXJhdGVkIFhtbEVsZW1lbnQgZm9yIHRoZSBpbnB1dAotICAgICAqLwotICAgIHByaXZhdGUgWG1sRWxlbWVudCBpbnB1dEVsZW1lbnQ7Ci0KLSAgICAvKioKLSAgICAgKiBnZW5lcmF0ZWQgWG1sRWxlbWVudCBmb3IgdGhlIG91dHB1dAotICAgICAqLwotICAgIHByaXZhdGUgWG1sRWxlbWVudCBvdXRQdXRFbGVtZW50OwotCi0KLQotICAgIC8qKgotICAgICAqIGRlZmF1bHQgY29uc3RydWN0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgT3BlcmF0aW9uKCkgewotICAgICAgICB0aGlzLmlucHV0UGFyYW1ldGVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIGNvbnN0cnVjdG9yIHdpdGggdGhlIGphdmEgbWV0aG9kIGZvciB0aGlzIGphdmFNZXRob2QKLSAgICAgKgotICAgICAqIEBwYXJhbSBvcGVyYXRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgT3BlcmF0aW9uKE1ldGhvZCBvcGVyYXRpb24pIHsKLSAgICAgICAgdGhpcygpOwotICAgICAgICB0aGlzLmphdmFNZXRob2QgPSBvcGVyYXRpb247Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcG9wdWxhdGVNZXRhRGF0YShDb25maWd1cmF0b3IgY29uZmlndXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwIHByb2Nlc3NlZFR5cGVNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXAgZXhjZXB0aW9uQ2xhc3NUb1BhcmFtZXRlck1hcCkKLSAgICAgICAgICAgIHRocm93cyBNZXRhRGF0YVBvcHVsYXRlRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gc2V0IHRoZSBuYW1lLiBuYW1lc3BhY2Ugc2hvdWxkIGFscmVhZHkgaGF2ZSBzZXQgYnkgdGhlIHNlcnZpY2UKLSAgICAgICAgdGhpcy5uYW1lID0gdGhpcy5qYXZhTWV0aG9kLmdldE5hbWUoKTsKLQotICAgICAgICAvL3BvcHVsYXRlIGlucHV0IHBhcmFtZXRlcnMKLSAgICAgICAgQ2xhc3NbXSBpbnB1dFR5cGVzID0gdGhpcy5qYXZhTWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCk7Ci0gICAgICAgIFBhcmFtZXRlciBwYXJhbWV0ZXI7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5wdXRUeXBlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgcGFyYW1ldGVyID0gbmV3IFBhcmFtZXRlcihpbnB1dFR5cGVzW2ldLCJwYXJhbSIgKyBpKTsKLSAgICAgICAgICAgIHBhcmFtZXRlci5wb3B1bGF0ZU1ldGFEYXRhKGNvbmZpZ3VyYXRvciwgcHJvY2Vzc2VkVHlwZU1hcCk7Ci0gICAgICAgICAgICB0aGlzLmlucHV0UGFyYW1ldGVycy5hZGQocGFyYW1ldGVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHBvcHVsYXRlIG91dHB1dCBwYXJhbWV0ZXIKLSAgICAgICAgQ2xhc3MgcmV0dXJuVHlwZSA9IHRoaXMuamF2YU1ldGhvZC5nZXRSZXR1cm5UeXBlKCk7Ci0gICAgICAgIGlmICghcmV0dXJuVHlwZS5lcXVhbHModm9pZC5jbGFzcykpIHsKLSAgICAgICAgICAgIC8vIGkuZS4gd2UgaGF2ZSBhIHJldHVybiB0eXBlCi0gICAgICAgICAgICB0aGlzLm91dHB1dFBhcmFtZXRlciA9IG5ldyBQYXJhbWV0ZXIocmV0dXJuVHlwZSwgInJldHVybiIpOwotICAgICAgICAgICAgdGhpcy5vdXRwdXRQYXJhbWV0ZXIucG9wdWxhdGVNZXRhRGF0YShjb25maWd1cmF0b3IsIHByb2Nlc3NlZFR5cGVNYXApOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gcG9wdWxhdGUgZXhjZXB0aW9uIGRhdGEKLSAgICAgICAgQ2xhc3NbXSBleGNlcHRpb25UeXBlID0gdGhpcy5qYXZhTWV0aG9kLmdldEV4Y2VwdGlvblR5cGVzKCk7Ci0gICAgICAgIFN0cmluZyBleGNlcHRpb25OYW1lOwotICAgICAgICBTdHJpbmcgbmFtZXNwYWNlOwotICAgICAgICBmb3IgKGludCBpPTA7aTxleGNlcHRpb25UeXBlLmxlbmd0aDtpKyspewotICAgICAgICAgICAgZXhjZXB0aW9uTmFtZSA9IGV4Y2VwdGlvblR5cGVbaV0uZ2V0TmFtZSgpOwotICAgICAgICAgICAgZXhjZXB0aW9uTmFtZSA9IGV4Y2VwdGlvbk5hbWUuc3Vic3RyaW5nKGV4Y2VwdGlvbk5hbWUubGFzdEluZGV4T2YoIi4iKSArIDEpOwotICAgICAgICAgICAgbmFtZXNwYWNlID0gY29uZmlndXJhdG9yLmdldE5hbWVzcGFjZShleGNlcHRpb25UeXBlW2ldLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgcGFyYW1ldGVyID0gbmV3IFBhcmFtZXRlcihleGNlcHRpb25UeXBlW2ldLGV4Y2VwdGlvbk5hbWUsbmFtZXNwYWNlKTsKLSAgICAgICAgICAgIHBhcmFtZXRlci5wb3B1bGF0ZU1ldGFEYXRhKGNvbmZpZ3VyYXRvcixwcm9jZXNzZWRUeXBlTWFwKTsKLSAgICAgICAgICAgIGlmICghZXhjZXB0aW9uQ2xhc3NUb1BhcmFtZXRlck1hcC5jb250YWluc0tleShleGNlcHRpb25UeXBlW2ldKSl7Ci0gICAgICAgICAgICAgICAgZXhjZXB0aW9uQ2xhc3NUb1BhcmFtZXRlck1hcC5wdXQoZXhjZXB0aW9uVHlwZVtpXSxwYXJhbWV0ZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZ2VuZXJhdGVTY2hlbWEoQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXAgc2NoZW1hTWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcCBleGNlcHRpb25DbGFzc1RvUGFyYW1ldGVyTWFwKQotICAgICAgICAgICAgdGhyb3dzIFNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb24gewotICAgICAgICAvLyBoZXJlIHdlIGhhdmUgdG8gZ2VuZXJhdGUgdGhlIGlucHV0IGVsZW1lbnQgYW5kIG91dCBwdXQgZWxlbWVudHMKLSAgICAgICAgLy8gcHV0dGluZyB0aGUgb3RoZXIgcmVsYXZlbnQgc2NoZW1hIHBhcnRzIHRvIHRoZSBzY2hlbWFNYXAKLQotICAgICAgICAvLyBnZXQgdGhlIHNjaGVtYSB0byBhZGQgdGhlIGNvbXBsZXggdHlwZQotICAgICAgICBpZiAoc2NoZW1hTWFwLmdldCh0aGlzLm5hbWVzcGFjZSkgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gY3JlYXRlIGEgbmV3IG5hbWVzcGFjZSBmb3IgdGhpcyBzY2hlbWEKLSAgICAgICAgICAgIHNjaGVtYU1hcC5wdXQodGhpcy5uYW1lc3BhY2UsIG5ldyBYbWxTY2hlbWEodGhpcy5uYW1lc3BhY2UpKTsKLSAgICAgICAgfQotICAgICAgICBYbWxTY2hlbWEgeG1sU2NoZW1hID0gKFhtbFNjaGVtYSkgc2NoZW1hTWFwLmdldCh0aGlzLm5hbWVzcGFjZSk7Ci0KLQotICAgICAgICBpZiAoIWNvbmZpZ3VyYXRvci5pc0JhcmUoKSkgewotCi0gICAgICAgICAgICAvLyBnZW5lcmF0aW5nIHRoZSBpbnB1dCBlbGVtZW50Ci0gICAgICAgICAgICB0aGlzLmlucHV0RWxlbWVudCA9IG5ldyBYbWxFbGVtZW50SW1wbChmYWxzZSk7Ci0gICAgICAgICAgICB0aGlzLmlucHV0RWxlbWVudC5zZXROYW1lKHRoaXMubmFtZSk7Ci0gICAgICAgICAgICB0aGlzLmlucHV0RWxlbWVudC5zZXROYW1lc3BhY2UodGhpcy5uYW1lc3BhY2UpOwotICAgICAgICAgICAgdGhpcy5pbnB1dEVsZW1lbnQuc2V0VG9wRWxlbWVudCh0cnVlKTsKLSAgICAgICAgICAgIHhtbFNjaGVtYS5hZGRFbGVtZW50KHRoaXMuaW5wdXRFbGVtZW50KTsKLQotICAgICAgICAgICAgLy8gc2V0IHRoZSBjb21wbGV4IHR5cGUgZm9yIHRoaXMgZWxlbWVudAotICAgICAgICAgICAgWG1sVHlwZSB4bWxUeXBlID0gbmV3IFhtbFR5cGVJbXBsKCk7Ci0gICAgICAgICAgICB4bWxUeXBlLnNldEFub255bW91cyh0cnVlKTsKLSAgICAgICAgICAgIHhtbFR5cGUuc2V0U2ltcGxlVHlwZShmYWxzZSk7Ci0KLSAgICAgICAgICAgIFBhcmFtZXRlciBwYXJhbWV0ZXI7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0aGlzLmlucHV0UGFyYW1ldGVycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICBwYXJhbWV0ZXIgPSAoUGFyYW1ldGVyKSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBpZiAoIXBhcmFtZXRlci5pc1NjaGVtYUdlbmVyYXRlZCgpKXsKLSAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIuZ2VuZXJhdGVTY2hlbWEoY29uZmlndXJhdG9yLHNjaGVtYU1hcCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBhcmFtZXRlci5nZXRFbGVtZW50KCkuc2V0VG9wRWxlbWVudChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgeG1sVHlwZS5hZGRFbGVtZW50KHBhcmFtZXRlci5nZXRFbGVtZW50KCkpOwotICAgICAgICAgICAgICAgIFFOYW1lIGVsZW1lbnRUeXBlUU5hbWUgPSBwYXJhbWV0ZXIuZ2V0RWxlbWVudCgpLmdldFR5cGUoKS5nZXRRbmFtZSgpOwotICAgICAgICAgICAgICAgIGlmICgheG1sU2NoZW1hLmNvbnRhaW5zTmFtZXNwYWNlKGVsZW1lbnRUeXBlUU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBlbGVtZW50IG5hbWVzcGFjZSBkb2VzIG5vdCBleGlzdHMgd2UgaGF2ZSB0byBhZGQgaXQKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFlbGVtZW50VHlwZVFOYW1lLmdldE5hbWVzcGFjZVVSSSgpLmVxdWFscyhDb25zdGFudHMuVVJJXzIwMDFfU0NIRU1BX1hTRCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFhtbEltcG9ydCB4bWxJbXBvcnQgPSBuZXcgWG1sSW1wb3J0KGVsZW1lbnRUeXBlUU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgeG1sU2NoZW1hLmFkZEltcG9ydCh4bWxJbXBvcnQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHhtbFNjaGVtYS5hZGROYW1lc3BhY2UoZWxlbWVudFR5cGVRTmFtZS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0aGlzLmlucHV0RWxlbWVudC5zZXRUeXBlKHhtbFR5cGUpOwotCi0gICAgICAgICAgICAvLyBnZW5lcmF0ZSB0aGUgb3V0cHV0IEVsZW1lbnQKLSAgICAgICAgICAgIHRoaXMub3V0UHV0RWxlbWVudCA9IG5ldyBYbWxFbGVtZW50SW1wbChmYWxzZSk7Ci0gICAgICAgICAgICB0aGlzLm91dFB1dEVsZW1lbnQuc2V0TmFtZSh0aGlzLm5hbWUgKyAiUmVzcG9uc2UiKTsKLSAgICAgICAgICAgIHRoaXMub3V0UHV0RWxlbWVudC5zZXROYW1lc3BhY2UodGhpcy5uYW1lc3BhY2UpOwotICAgICAgICAgICAgdGhpcy5vdXRQdXRFbGVtZW50LnNldFRvcEVsZW1lbnQodHJ1ZSk7Ci0gICAgICAgICAgICB4bWxTY2hlbWEuYWRkRWxlbWVudCh0aGlzLm91dFB1dEVsZW1lbnQpOwotCi0gICAgICAgICAgICB4bWxUeXBlID0gbmV3IFhtbFR5cGVJbXBsKCk7Ci0gICAgICAgICAgICB4bWxUeXBlLnNldEFub255bW91cyh0cnVlKTsKLSAgICAgICAgICAgIHhtbFR5cGUuc2V0U2ltcGxlVHlwZShmYWxzZSk7Ci0gICAgICAgICAgICBpZiAodGhpcy5vdXRwdXRQYXJhbWV0ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmICghdGhpcy5vdXRwdXRQYXJhbWV0ZXIuaXNTY2hlbWFHZW5lcmF0ZWQoKSl7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMub3V0cHV0UGFyYW1ldGVyLmdlbmVyYXRlU2NoZW1hKGNvbmZpZ3VyYXRvcixzY2hlbWFNYXApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB4bWxUeXBlLmFkZEVsZW1lbnQodGhpcy5vdXRwdXRQYXJhbWV0ZXIuZ2V0RWxlbWVudCgpKTsKLSAgICAgICAgICAgICAgICBRTmFtZSBlbGVtZW50VHlwZVFOYW1lID0gdGhpcy5vdXRwdXRQYXJhbWV0ZXIuZ2V0RWxlbWVudCgpLmdldFR5cGUoKS5nZXRRbmFtZSgpOwotICAgICAgICAgICAgICAgIGlmICgheG1sU2NoZW1hLmNvbnRhaW5zTmFtZXNwYWNlKGVsZW1lbnRUeXBlUU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBlbGVtZW50IG5hbWVzcGFjZSBkb2VzIG5vdCBleGlzdHMgd2UgaGF2ZSB0byBhZGQgaXQKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFlbGVtZW50VHlwZVFOYW1lLmdldE5hbWVzcGFjZVVSSSgpLmVxdWFscyhDb25zdGFudHMuVVJJXzIwMDFfU0NIRU1BX1hTRCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFhtbEltcG9ydCB4bWxJbXBvcnQgPSBuZXcgWG1sSW1wb3J0KGVsZW1lbnRUeXBlUU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgeG1sU2NoZW1hLmFkZEltcG9ydCh4bWxJbXBvcnQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHhtbFNjaGVtYS5hZGROYW1lc3BhY2UoZWxlbWVudFR5cGVRTmFtZS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhpcy5vdXRQdXRFbGVtZW50LnNldFR5cGUoeG1sVHlwZSk7Ci0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vVE9ETzogZ2VuZXJhdGUgdGhlIGNvZGUgZm9yIGJhcmUgY2FzZQotICAgICAgICB9Ci0KLSAgICB9Ci0KLQotICAgIHB1YmxpYyBQYXJhbWV0ZXIgZ2V0T3V0cHV0UGFyYW1ldGVyKCkgewotICAgICAgICByZXR1cm4gb3V0cHV0UGFyYW1ldGVyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE91dHB1dFBhcmFtZXRlcihQYXJhbWV0ZXIgb3V0cHV0UGFyYW1ldGVyKSB7Ci0gICAgICAgIHRoaXMub3V0cHV0UGFyYW1ldGVyID0gb3V0cHV0UGFyYW1ldGVyOwotICAgIH0KLQotICAgIHB1YmxpYyBYbWxFbGVtZW50IGdldElucHV0RWxlbWVudCgpIHsKLSAgICAgICAgcmV0dXJuIGlucHV0RWxlbWVudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRJbnB1dEVsZW1lbnQoWG1sRWxlbWVudCBpbnB1dEVsZW1lbnQpIHsKLSAgICAgICAgdGhpcy5pbnB1dEVsZW1lbnQgPSBpbnB1dEVsZW1lbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIFhtbEVsZW1lbnQgZ2V0T3V0UHV0RWxlbWVudCgpIHsKLSAgICAgICAgcmV0dXJuIG91dFB1dEVsZW1lbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0T3V0UHV0RWxlbWVudChYbWxFbGVtZW50IG91dFB1dEVsZW1lbnQpIHsKLSAgICAgICAgdGhpcy5vdXRQdXRFbGVtZW50ID0gb3V0UHV0RWxlbWVudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWV0aG9kIGdldEphdmFNZXRob2QoKSB7Ci0gICAgICAgIHJldHVybiBqYXZhTWV0aG9kOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEphdmFNZXRob2QoTWV0aG9kIGphdmFNZXRob2QpIHsKLSAgICAgICAgdGhpcy5qYXZhTWV0aG9kID0gamF2YU1ldGhvZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZSgpIHsKLSAgICAgICAgcmV0dXJuIG5hbWVzcGFjZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lc3BhY2UoU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICB0aGlzLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdCBnZXRJbnB1dFBhcmFtZXRlcnMoKSB7Ci0gICAgICAgIHJldHVybiBpbnB1dFBhcmFtZXRlcnM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SW5wdXRQYXJhbWV0ZXJzKExpc3QgaW5wdXRQYXJhbWV0ZXJzKSB7Ci0gICAgICAgIHRoaXMuaW5wdXRQYXJhbWV0ZXJzID0gaW5wdXRQYXJhbWV0ZXJzOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9tZXRhZGF0YS9QYXJhbWV0ZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvbWV0YWRhdGEvUGFyYW1ldGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhNjM3MmIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9tZXRhZGF0YS9QYXJhbWV0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLm1ldGFkYXRhOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmRhdGFiaW5kLlJNSUJlYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZXhjZXB0aW9uLk1ldGFEYXRhUG9wdWxhdGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZXhjZXB0aW9uLlNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEuaW1wbC5UeXBlSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS54bWwuWG1sRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS54bWwuaW1wbC5YbWxFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS50eXBlcy5NYXBUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLnV0aWwuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLnV0aWwuVXRpbDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogdGhpcyBjbGFzcyBpcyB1c2VkIHRvIGtlZXAgdGhlIFBhcmFtZXRlciBkZXRhaWxzIG9mIGEgamF2YSBtZXRob2QKLSAqLwotcHVibGljIGNsYXNzIFBhcmFtZXRlciB7Ci0KLSAgICAvKioKLSAgICAgKiBqYXZhIGNsYXNzIHJlcHJlc2VudHMgdGhpcyBwYXJhbWV0ZXIKLSAgICAgKi8KLSAgICBwcml2YXRlIENsYXNzIGphdmFDbGFzczsKLSAgICAvKioKLSAgICAgKiBwYXJhbWV0ZXIgbmFtZQotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0KLSAgICAvKioKLSAgICAgKiBuYW1lc3BhY2Ugb2YgdGhpcyBwYXJhbWV0ZXIKLSAgICAgKiB0aGlzIHNob3VsZCBhbHdheXMgbnVsbC4gaS5lIG5vIG5hbWVzcGFjZSBmb3IgYW4gcGFyYW1ldGVyCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZXNwYWNlOwotCi0gICAgLyoqCi0gICAgICogWG1sVHlwZSBvZiB0aGUgcGFyYW1ldGVyCi0gICAgICovCi0gICAgcHJpdmF0ZSBUeXBlIHR5cGU7Ci0KLSAgICAvKioKLSAgICAgKiBpcyB0aGlzIHBhcmFtZXRlciBpcyBhcnJheSB0eXBlCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzQXJyYXk7Ci0KLSAgICAvKioKLSAgICAgKiB4bWwgRWxlbWVudCBjb3JyZXNwb25kaW5nIHRvIHRoaXMgcGFyYW1ldGVyCi0gICAgICovCi0gICAgcHJpdmF0ZSBYbWxFbGVtZW50IGVsZW1lbnQ7Ci0KLSAgICAvKioKLSAgICAgKiB3aGV0aGVyIHRoZSBzY2hlbWEgaXMgZ2VuZXJhdGVkIG9yIG5vdAotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBpc1NjaGVtYUdlbmVyYXRlZDsKLQotICAgIC8qKgotICAgICAqIHR5cGUgb2YgdGhlIHBhcmFtZXRlciBjbGFzcwotICAgICAqLwotICAgIHByaXZhdGUgaW50IGNsYXNzVHlwZTsKLQotCi0gICAgLyoqCi0gICAgICogZGVmYXVsdCBjb25zdHJ1Y3RvcgotICAgICAqLwotICAgIHB1YmxpYyBQYXJhbWV0ZXIoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIFBhcmFtZXRlcihDbGFzcyBqYXZhQ2xhc3MsIFN0cmluZyBuYW1lLCBTdHJpbmcgbmFtZXNwYWNlKSB7Ci0gICAgICAgIHRoaXMuamF2YUNsYXNzID0gamF2YUNsYXNzOwotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgICAgICB0aGlzLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyBQYXJhbWV0ZXIoQ2xhc3MgamF2YUNsYXNzLCBTdHJpbmcgbmFtZSkgewotICAgICAgICB0aGlzKGphdmFDbGFzcywgbmFtZSwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcG9wdWxhdGVNZXRhRGF0YShDb25maWd1cmF0b3IgY29uZmlndXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwIHByb2Nlc3NlZFR5cGVNYXApCi0gICAgICAgICAgICB0aHJvd3MgTWV0YURhdGFQb3B1bGF0ZUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgQ2xhc3MgYmFzZUNsYXNzOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgdGhpcy5jbGFzc1R5cGUgPSBVdGlsLmdldENsYXNzVHlwZSh0aGlzLmphdmFDbGFzcyk7Ci0gICAgICAgICAgICBpZiAoKHRoaXMuY2xhc3NUeXBlICYgQ29uc3RhbnRzLkNPTExFQ1RJT05fVFlQRSkgPT0gQ29uc3RhbnRzLkNPTExFQ1RJT05fVFlQRSkgewotICAgICAgICAgICAgICAgIC8vIGkuZSB0aGlzIGlzIGEgY29sbGVjdGlvbiBjbGFzcwotICAgICAgICAgICAgICAgIHRoaXMuaXNBcnJheSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYmFzZUNsYXNzID0gT2JqZWN0LmNsYXNzOwotICAgICAgICAgICAgfSBlbHNlIGlmICgodGhpcy5jbGFzc1R5cGUgJiBDb25zdGFudHMuTUFQX1RZUEUpID09IENvbnN0YW50cy5NQVBfVFlQRSkgewotICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBhdHRyaWJ1dGUgaXMgbWVwIHR5cGUgd2Ugc2V0IGEgY3VzdG9tIHR5cGUgZm9yIGl0LgotICAgICAgICAgICAgICAgIHRoaXMuaXNBcnJheSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYmFzZUNsYXNzID0gTWFwVHlwZS5jbGFzczsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gcG9wdWxhdGUgdGhlIHR5cGUgZm9yIHRoaXMgcGFyYW1ldGVyCi0gICAgICAgICAgICAgICAgdGhpcy5pc0FycmF5ID0gdGhpcy5qYXZhQ2xhc3MuaXNBcnJheSgpOwotCi0gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNBcnJheSkgewotICAgICAgICAgICAgICAgICAgICBiYXNlQ2xhc3MgPSB0aGlzLmphdmFDbGFzcy5nZXRDb21wb25lbnRUeXBlKCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYmFzZUNsYXNzID0gdGhpcy5qYXZhQ2xhc3M7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocHJvY2Vzc2VkVHlwZU1hcC5jb250YWluc0tleShiYXNlQ2xhc3MpKSB7Ci0gICAgICAgICAgICAgICAgLy8gaS5lIHdlIGhhdmUgYWxyZWFkeSBwcm9jZXNzIHRoaXMgdHlwZQotICAgICAgICAgICAgICAgIHRoaXMudHlwZSA9IChUeXBlKSBwcm9jZXNzZWRUeXBlTWFwLmdldChiYXNlQ2xhc3MpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChSTUlCZWFuLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oYmFzZUNsYXNzKSkgewotICAgICAgICAgICAgICAgIC8vIGlmIHRoaXMgYmVhbiBpcyBhbiBSTUlCZWFuIHdlIGhhdmUgdG8gdXNlIHRoZSB0eXBlIHJldHVybgotICAgICAgICAgICAgICAgIC8vIGZyb20gdGhhdCBiZWFuLgotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIE1ldGhvZCBnZXRCZWFuQ2xhc3NNZXRob2QgPSBiYXNlQ2xhc3MuZ2V0TWV0aG9kKCJnZXRCZWFuQ2xhc3MiLCBuZXcgQ2xhc3NbXXt9KTsKLSAgICAgICAgICAgICAgICAgICAgQ2xhc3Mgcm1pQmVhblR5cGUgPSAoQ2xhc3MpIGdldEJlYW5DbGFzc01ldGhvZC5pbnZva2UobnVsbCwgbmV3IE9iamVjdFtde30pOwotICAgICAgICAgICAgICAgICAgICBpZiAocm1pQmVhblR5cGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50eXBlID0gKFR5cGUpIHJtaUJlYW5UeXBlLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzZWRUeXBlTWFwLnB1dChiYXNlQ2xhc3MsIHRoaXMudHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnR5cGUucG9wdWxhdGVNZXRhRGF0YShjb25maWd1cmF0b3IsIHByb2Nlc3NlZFR5cGVNYXApOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhUG9wdWxhdGVFeGNlcHRpb24oInRoZXJlIGlzIG5vIHR5cGUgY2xhc3MgZm9yIHJtaSBjbGFzcyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgYmFzZUNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWV0YURhdGFQb3B1bGF0ZUV4Y2VwdGlvbigiTm8gZ2V0QmVhbkNsYXNzIG1ldGhvZCBpcyBub3QgZGVmaW5lZCBmb3IgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBybWkgYmVhbiBjbGFzcyAiICsgYmFzZUNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBNZXRhRGF0YVBvcHVsYXRlRXhjZXB0aW9uKCJObyBnZXRCZWFuQ2xhc3MgbWV0aG9kIGlzIG5vdCBkZWZpbmVkIGZvciAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHJtaSBiZWFuIGNsYXNzICIgKyBiYXNlQ2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRoaXMudHlwZSA9IG5ldyBUeXBlSW1wbChiYXNlQ2xhc3MpOwotICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gZG8gdGhpcyBiZWZvcmUgY2FsbGluZyB0byBwb3B1bGF0ZSBtZXRhIGRhdGEKLSAgICAgICAgICAgICAgICAvLyB0byBhdm9pZCBjaXJlY3VsYXIgcmVmZXJlbmNlcwotICAgICAgICAgICAgICAgIHByb2Nlc3NlZFR5cGVNYXAucHV0KGJhc2VDbGFzcywgdGhpcy50eXBlKTsKLSAgICAgICAgICAgICAgICB0aGlzLnR5cGUucG9wdWxhdGVNZXRhRGF0YShjb25maWd1cmF0b3IsIHByb2Nlc3NlZFR5cGVNYXApOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNZXRhRGF0YVBvcHVsYXRlRXhjZXB0aW9uKCJDYW4gbm90IGluc3RhdGFpdGUgY2xhc3MgIgotICAgICAgICAgICAgICAgICAgICArIHRoaXMuamF2YUNsYXNzLmdldE5hbWUoKSwgZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhUG9wdWxhdGVFeGNlcHRpb24oIkNhbiBub3QgaW5zdGF0YWl0ZSBjbGFzcyAiCi0gICAgICAgICAgICAgICAgICAgICsgdGhpcy5qYXZhQ2xhc3MuZ2V0TmFtZSgpLCBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIHRoaXMgbWV0aG9kIHNldHMgdGhlIFhNTEVsZW1lbnQgY29ycmVjdGx5LiB0aGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIG9ubHkKLSAgICAgKiBpZiB0aGlzIGlzIG5vdCBwcm9jZXNzZWQKLSAgICAgKgotICAgICAqIEBwYXJhbSBjb25maWd1cmF0b3IKLSAgICAgKiBAcGFyYW0gc2NoZW1hTWFwCi0gICAgICogQHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLnJtaS5leGNlcHRpb24uU2NoZW1hR2VuZXJhdGlvbkV4Y2VwdGlvbgotICAgICAqCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZ2VuZXJhdGVTY2hlbWEoQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXAgc2NoZW1hTWFwKQotICAgICAgICAgICAgdGhyb3dzIFNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb24gewotICAgICAgICAvLyBoZXJlIHdlIGhhdmUgdG8gc2VuZCB0aGUgWG1sRWxlbWVudCBjb3JyZWN0bHkKLQotICAgICAgICB0aGlzLmlzU2NoZW1hR2VuZXJhdGVkID0gdHJ1ZTsKLQotICAgICAgICBpZiAoIXRoaXMudHlwZS5pc1NjaGVtYUdlbmVyYXRlZCgpKSB7Ci0gICAgICAgICAgICB0aGlzLnR5cGUuZ2VuZXJhdGVTY2hlbWEoY29uZmlndXJhdG9yLCBzY2hlbWFNYXApOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy5lbGVtZW50ID0gbmV3IFhtbEVsZW1lbnRJbXBsKCF0aGlzLmlzQXJyYXkgJiYgdGhpcy50eXBlLmdldEphdmFDbGFzcygpLmlzUHJpbWl0aXZlKCkpOwotICAgICAgICB0aGlzLmVsZW1lbnQuc2V0TmFtZSh0aGlzLm5hbWUpOwotICAgICAgICB0aGlzLmVsZW1lbnQuc2V0TmFtZXNwYWNlKHRoaXMubmFtZXNwYWNlKTsKLSAgICAgICAgdGhpcy5lbGVtZW50LnNldFR5cGUodGhpcy50eXBlLmdldFhtbFR5cGUoKSk7Ci0gICAgICAgIHRoaXMuZWxlbWVudC5zZXRBcnJheSh0aGlzLmlzQXJyYXkpOwotCi0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFR5cGUgZ2V0VHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIHR5cGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VHlwZShUeXBlIHR5cGUpIHsKLSAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2xhc3MgZ2V0SmF2YUNsYXNzKCkgewotICAgICAgICByZXR1cm4gamF2YUNsYXNzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEphdmFDbGFzcyhDbGFzcyBqYXZhQ2xhc3MpIHsKLSAgICAgICAgdGhpcy5qYXZhQ2xhc3MgPSBqYXZhQ2xhc3M7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNBcnJheSgpIHsKLSAgICAgICAgcmV0dXJuIGlzQXJyYXk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QXJyYXkoYm9vbGVhbiBhcnJheSkgewotICAgICAgICBpc0FycmF5ID0gYXJyYXk7Ci0gICAgfQotCi0gICAgcHVibGljIFhtbEVsZW1lbnQgZ2V0RWxlbWVudCgpIHsKLSAgICAgICAgcmV0dXJuIGVsZW1lbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RWxlbWVudChYbWxFbGVtZW50IGVsZW1lbnQpIHsKLSAgICAgICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1NjaGVtYUdlbmVyYXRlZCgpIHsKLSAgICAgICAgcmV0dXJuIGlzU2NoZW1hR2VuZXJhdGVkOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFNjaGVtYUdlbmVyYXRlZChib29sZWFuIHNjaGVtYUdlbmVyYXRlZCkgewotICAgICAgICBpc1NjaGVtYUdlbmVyYXRlZCA9IHNjaGVtYUdlbmVyYXRlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZSgpIHsKLSAgICAgICAgcmV0dXJuIG5hbWVzcGFjZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lc3BhY2UoU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICB0aGlzLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldENsYXNzVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIGNsYXNzVHlwZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc1R5cGUoaW50IGNsYXNzVHlwZSkgewotICAgICAgICB0aGlzLmNsYXNzVHlwZSA9IGNsYXNzVHlwZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL21ldGFkYXRhL1NlcnZpY2UuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvbWV0YWRhdGEvU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjMwMDZlLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvbWV0YWRhdGEvU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGE7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5Db25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZXhjZXB0aW9uLk1ldGFEYXRhUG9wdWxhdGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZXhjZXB0aW9uLlNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEuaW1wbC5UeXBlSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS54bWwuWG1sSW1wb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLm1ldGFkYXRhLnhtbC5YbWxTY2hlbWE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkudXRpbC5Db25zdGFudHM7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlIHsKLQotICAgIC8qKgotICAgICAqIG5hbWUgb2YgdGhlIHNlcnZpY2UKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBuYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIG5hbWVzcGFjZTsKLSAgICAvKioKLSAgICAgKiBqYXZhIGNsYXNzIGZvciB3aGljaCB3ZSBnb2luZyB0byBjcmVhdGUgdGhlIHNlcnZpY2UKLSAgICAgKi8KLSAgICBwcml2YXRlIENsYXNzIGphdmFDbGFzczsKLQotICAgIC8qKgotICAgICAqIHRoaXMgbGlzdCBjb250YWlucyBhIExpc3Qgb2YgT3BlcmF0aW9uIG9iamVjdHMgcmVwcmVzZW50aW5nCi0gICAgICogb3BlcmF0aW9ucyBvZiB0aGUgamF2YSBjbGFzcwotICAgICAqLwotICAgIHByaXZhdGUgTGlzdCBvcGVyYXRpb25zOwotCi0gICAgcHJpdmF0ZSBNYXAgcHJvY2Vzc2VkVHlwZU1hcDsKLSAgICBwcml2YXRlIENvbmZpZ3VyYXRvciBjb25maWd1cmF0b3I7Ci0gICAgcHJpdmF0ZSBNYXAgc2NoZW1hTWFwOwotCi0gICAgLyoqCi0gICAgICogdGhpcyBtYXAga2VlcHMgdGhlIGV4Y2VwdGlvbiBjbGFzcyBuYW1lIGFuZCBleGNlcHRpb24gcmVsYXZlbnQgcGFyYW1ldGVyCi0gICAgICogdXNlZCBpbiBzZXJpYWxpemF0aW9uLiB3ZSBuZWVkIHRvIGtlZXAgdGhlIG1lc3NhZ2UgbmFtZSB1bmlxdWUgd2l0aGluIHRoZQotICAgICAqIHNlcnZpY2UuIHNvIGV4Y2VwdGlvbmNsYXNzIG1hcCBzaG91bGQgYmUgZ2xvYmFsCi0gICAgICovCi0gICAgcHJpdmF0ZSBNYXAgZXhjZXB0aW9uQ2xhc3NUb1BhcmFtZXRlck1hcDsKLQotICAgIC8qKgotICAgICAqIHRoaXMgbWFwIGtlZXBzIHRoZSBleGNlcHRpb24gUU5hbWUgYW5kIGV4Y2VwdGlvbiByZWxhdmVudCBwYXJhbWV0ZXIKLSAgICAgKi8KLSAgICBwcml2YXRlIE1hcCBleGNlcHRpb25RTmFtZVRvUGFyYW1ldGVyTWFwOwotCi0gICAgLyoqCi0gICAgICogZGVmYXVsdCBjb25zdHJ1Y3RvcgotICAgICAqLwotICAgIHB1YmxpYyBTZXJ2aWNlKCkgewotICAgICAgICB0aGlzLm9wZXJhdGlvbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIHRoaXMuZXhjZXB0aW9uQ2xhc3NUb1BhcmFtZXRlck1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIHRoaXMuZXhjZXB0aW9uUU5hbWVUb1BhcmFtZXRlck1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogY29uc3RyYWN1dG9yIHdpdGggdGhlIGphdmEgY2xhc3MgbmFtZQotICAgICAqCi0gICAgICogQHBhcmFtIGphdmFDbGFzcwotICAgICAqLwotICAgIHB1YmxpYyBTZXJ2aWNlKENsYXNzIGphdmFDbGFzcywgQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvcikgewotICAgICAgICB0aGlzKCk7Ci0gICAgICAgIHRoaXMuamF2YUNsYXNzID0gamF2YUNsYXNzOwotICAgICAgICB0aGlzLmNvbmZpZ3VyYXRvciA9IGNvbmZpZ3VyYXRvcjsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIHRoaXMgbWV0aG9kIHN1cHBvc2UgdG8gZmlsbCBhbGwgdGhlIG9wZXJhdGlvbnMgZGF0YSB1c2luZyB0aGUgamF2YQotICAgICAqIGNsYXNzIGdpdmVuLiBoZXJlIHdlIGFzc3VtZSB0aGF0IHRoZSBqYXZhQ2xhc3MgaXMgcHJvcGVybHkgc2V0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHBvcHVsYXRlTWV0YURhdGEoKSB0aHJvd3MgTWV0YURhdGFQb3B1bGF0ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIHNldCB0aGUgc2VydmljZSBuYW1lIHVzaW5nIHRoZSBqYXZhIGNsYXNzIG5hbWUKLSAgICAgICAgdGhpcy5uYW1lID0gamF2YUNsYXNzLmdldE5hbWUoKTsKLSAgICAgICAgLy8gcmVtb3ZlIHRoZSBwYWNrYWdlIHBhcnQKLSAgICAgICAgdGhpcy5uYW1lID0gdGhpcy5uYW1lLnN1YnN0cmluZyh0aGlzLm5hbWUubGFzdEluZGV4T2YoIi4iKSArIDEpOwotICAgICAgICB0aGlzLm5hbWVzcGFjZSA9IGNvbmZpZ3VyYXRvci5nZXROYW1lc3BhY2UoamF2YUNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOwotICAgICAgICB0aGlzLnByb2Nlc3NlZFR5cGVNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgICAgIC8vIHBvcHVsYXRlIG9wZXJhdGlvbnMKLSAgICAgICAgLy9UT0RPOiB0aGlzIG1ldGhvZCByZXR1cm5zIHVuaW5oZXJpdGVkIG1ldGhvZHMgZmluZCBhIHdheSB0byBnZXQgdGhlbSBhcyB3ZWxsCi0gICAgICAgIE1ldGhvZFtdIGphdmFNZXRob2RzID0gdGhpcy5qYXZhQ2xhc3MuZ2V0RGVjbGFyZWRNZXRob2RzKCk7Ci0gICAgICAgIE1ldGhvZCBqYXZhTWV0aG9kOwotICAgICAgICBPcGVyYXRpb24gb3BlcmF0aW9uOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGphdmFNZXRob2RzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBqYXZhTWV0aG9kID0gamF2YU1ldGhvZHNbaV07Ci0gICAgICAgICAgICAvLyB3ZSBnZW5lcmF0ZSBvcHJhdGlvbnMgb25seSBmcm9tIHRoZSBwdWJsaWMgbWV0aG9kcwotICAgICAgICAgICAgLy9UT0RPIDogcmVtb3ZlIG92ZXJsb2FkIG1ldGhvZHMKLSAgICAgICAgICAgIGlmICh0aGlzLmphdmFDbGFzcy5pc0ludGVyZmFjZSgpIHx8IChNb2RpZmllci5pc1B1YmxpYyhqYXZhTWV0aG9kLmdldE1vZGlmaWVycygpKSAmJgotICAgICAgICAgICAgICAgICAgICAhTW9kaWZpZXIuaXNBYnN0cmFjdChqYXZhTWV0aG9kLmdldE1vZGlmaWVycygpKSkpIHsKLSAgICAgICAgICAgICAgICBvcGVyYXRpb24gPSBuZXcgT3BlcmF0aW9uKGphdmFNZXRob2QpOwotICAgICAgICAgICAgICAgIG9wZXJhdGlvbi5zZXROYW1lc3BhY2UodGhpcy5uYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIG9wZXJhdGlvbi5wb3B1bGF0ZU1ldGFEYXRhKGNvbmZpZ3VyYXRvciwgdGhpcy5wcm9jZXNzZWRUeXBlTWFwLCB0aGlzLmV4Y2VwdGlvbkNsYXNzVG9QYXJhbWV0ZXJNYXApOwotICAgICAgICAgICAgICAgIHRoaXMub3BlcmF0aW9ucy5hZGQob3BlcmF0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGFkZCB0aGUgZXh0ZW5zaW9uIGNsYXNzZXMgaWYgdGhleSBoYXZlIG5vdCBhbHJlYWR5IHBvcHVsYXRlZAotICAgICAgICBDbGFzcyBleHRlbnNpb25DbGFzcyA9IG51bGw7Ci0gICAgICAgIFR5cGUgZXh0ZW5zaW9uVHlwZSA9IG51bGw7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHRoaXMuY29uZmlndXJhdG9yLmdldEV4dGVuc2lvbkNsYXNzZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIGV4dGVuc2lvbkNsYXNzID0gKENsYXNzKSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIGlmICghdGhpcy5wcm9jZXNzZWRUeXBlTWFwLmNvbnRhaW5zS2V5KGV4dGVuc2lvbkNsYXNzKSkgewotICAgICAgICAgICAgICAgIGV4dGVuc2lvblR5cGUgPSBuZXcgVHlwZUltcGwoZXh0ZW5zaW9uQ2xhc3MpOwotICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc2VkVHlwZU1hcC5wdXQoZXh0ZW5zaW9uQ2xhc3MsIGV4dGVuc2lvblR5cGUpOwotICAgICAgICAgICAgICAgIGV4dGVuc2lvblR5cGUucG9wdWxhdGVNZXRhRGF0YSh0aGlzLmNvbmZpZ3VyYXRvciwgdGhpcy5wcm9jZXNzZWRUeXBlTWFwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGdlbmVyYXRlU2NoZW1hKCkgdGhyb3dzIFNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb24gewotICAgICAgICAvL2ZpcnN0IHdlIGhhdmUgdG8gZ2VuZXJhdGUgdGhlIGlucHV0IGFuZCBvdXRwdXQgZWxlbWVudHMKLSAgICAgICAgLy8gdG8gb3BlcmF0aW9ucwotCi0gICAgICAgIC8vIGNyZWF0ZSBzY2hlbWEgbWFwIG9iamVjdCBhbmQgYWRkIHRoZSB0YXJnZXQgbmFtZXNwYWNlIG9iamVjdAotICAgICAgICB0aGlzLnNjaGVtYU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIHRoaXMuc2NoZW1hTWFwLnB1dCh0aGlzLm5hbWVzcGFjZSwgbmV3IFhtbFNjaGVtYSh0aGlzLm5hbWVzcGFjZSkpOwotICAgICAgICBPcGVyYXRpb24gb3BlcmF0aW9uOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0aGlzLm9wZXJhdGlvbnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBvcGVyYXRpb24gPSAoT3BlcmF0aW9uKSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIG9wZXJhdGlvbi5nZW5lcmF0ZVNjaGVtYShjb25maWd1cmF0b3IsCi0gICAgICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hTWFwLAotICAgICAgICAgICAgICAgICAgICB0aGlzLmV4Y2VwdGlvbkNsYXNzVG9QYXJhbWV0ZXJNYXApOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gYWRkIGV4Y2VwdGlvbiBjbGFzcyBlbGVtZW50cyB0byB0aGUgc2NoZW1hCi0gICAgICAgIGdlbmVyYXRlU2NoZW1hRm9yRXhjZXB0aW9uUGFyYW1ldGVycygpOwotCi0gICAgICAgIC8vIGdlbmVyYXRlIHRoZSBzY2hlbWEgZm9yIG90aGVyIGV4dGVuc2lvbiBjbGFzc2VzCi0gICAgICAgIENsYXNzIGV4dGVuc2lvbkNsYXNzID0gbnVsbDsKLSAgICAgICAgVHlwZSBleHRlbnNpb25UeXBlID0gbnVsbDsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gdGhpcy5jb25maWd1cmF0b3IuZ2V0RXh0ZW5zaW9uQ2xhc3NlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgZXh0ZW5zaW9uQ2xhc3MgPSAoQ2xhc3MpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgZXh0ZW5zaW9uVHlwZSA9IChUeXBlKSB0aGlzLnByb2Nlc3NlZFR5cGVNYXAuZ2V0KGV4dGVuc2lvbkNsYXNzKTsKLSAgICAgICAgICAgIGlmICghZXh0ZW5zaW9uVHlwZS5pc1NjaGVtYUdlbmVyYXRlZCgpKSB7Ci0gICAgICAgICAgICAgICAgZXh0ZW5zaW9uVHlwZS5nZW5lcmF0ZVNjaGVtYSh0aGlzLmNvbmZpZ3VyYXRvciwgdGhpcy5zY2hlbWFNYXApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZ2VuZXJhdGVTY2hlbWFGb3JFeGNlcHRpb25QYXJhbWV0ZXJzKCkgdGhyb3dzIFNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb24gewotICAgICAgICBQYXJhbWV0ZXIgcGFyYW1ldGVyOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0aGlzLmV4Y2VwdGlvbkNsYXNzVG9QYXJhbWV0ZXJNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBwYXJhbWV0ZXIgPSAoUGFyYW1ldGVyKSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIGlmICghcGFyYW1ldGVyLmlzU2NoZW1hR2VuZXJhdGVkKCkpIHsKLSAgICAgICAgICAgICAgICBwYXJhbWV0ZXIuZ2VuZXJhdGVTY2hlbWEoY29uZmlndXJhdG9yLCBzY2hlbWFNYXApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgUU5hbWUgZWxlbWVudFR5cGVRTmFtZSA9IHBhcmFtZXRlci5nZXRFbGVtZW50KCkuZ2V0VHlwZSgpLmdldFFuYW1lKCk7Ci0gICAgICAgICAgICAvLyBnZXQgdGhlIHNjaGVtYSB0byBhZGQgdGhlIGNvbXBsZXggdHlwZQotICAgICAgICAgICAgaWYgKHNjaGVtYU1hcC5nZXQoZWxlbWVudFR5cGVRTmFtZS5nZXROYW1lc3BhY2VVUkkoKSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBhIG5ldyBuYW1lc3BhY2UgZm9yIHRoaXMgc2NoZW1hCi0gICAgICAgICAgICAgICAgc2NoZW1hTWFwLnB1dChlbGVtZW50VHlwZVFOYW1lLmdldE5hbWVzcGFjZVVSSSgpLCBuZXcgWG1sU2NoZW1hKGVsZW1lbnRUeXBlUU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFhtbFNjaGVtYSB4bWxTY2hlbWEgPSAoWG1sU2NoZW1hKSBzY2hlbWFNYXAuZ2V0KGVsZW1lbnRUeXBlUU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgICAgICAgICAgaWYgKCF4bWxTY2hlbWEuY29udGFpbnNOYW1lc3BhY2UoZWxlbWVudFR5cGVRTmFtZS5nZXROYW1lc3BhY2VVUkkoKSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoIWVsZW1lbnRUeXBlUU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkuZXF1YWxzKENvbnN0YW50cy5VUklfMjAwMV9TQ0hFTUFfWFNEKSkgewotICAgICAgICAgICAgICAgICAgICBYbWxJbXBvcnQgeG1sSW1wb3J0ID0gbmV3IFhtbEltcG9ydChlbGVtZW50VHlwZVFOYW1lLmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sU2NoZW1hLmFkZEltcG9ydCh4bWxJbXBvcnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB4bWxTY2hlbWEuYWRkTmFtZXNwYWNlKGVsZW1lbnRUeXBlUU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcGFyYW1ldGVyLmdldEVsZW1lbnQoKS5zZXRUb3BFbGVtZW50KHRydWUpOwotICAgICAgICAgICAgeG1sU2NoZW1hLmFkZEVsZW1lbnQocGFyYW1ldGVyLmdldEVsZW1lbnQoKSk7Ci0gICAgICAgICAgICB0aGlzLmV4Y2VwdGlvblFOYW1lVG9QYXJhbWV0ZXJNYXAucHV0KGVsZW1lbnRUeXBlUU5hbWUsIHBhcmFtZXRlcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB0aGlzIG1ldGhvZCByZXR1cm5zIHRoZSBvcGVyYXRpb24gZm9yIHRoZSBnaXZlbiBuYW1lIGlmIGZvdW5kCi0gICAgICogb3RoZXJ3aXNlIHJldHVybiBudWxsCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb3BlcmF0aW9uTmFtZQotICAgICAqIEByZXR1cm4gb3BlcmF0aW9uCi0gICAgICovCi0KLSAgICBwdWJsaWMgT3BlcmF0aW9uIGdldE9wZXJhdGlvbihTdHJpbmcgb3BlcmF0aW9uTmFtZSkgewotICAgICAgICBPcGVyYXRpb24gb3BlcmF0aW9uID0gbnVsbDsKLSAgICAgICAgYm9vbGVhbiBvcGVyYXRpb25Gb3VuZCA9IGZhbHNlOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0aGlzLm9wZXJhdGlvbnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBvcGVyYXRpb24gPSAoT3BlcmF0aW9uKSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIGlmIChvcGVyYXRpb24uZ2V0TmFtZSgpLmVxdWFscyhvcGVyYXRpb25OYW1lKSkgewotICAgICAgICAgICAgICAgIG9wZXJhdGlvbkZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAob3BlcmF0aW9uRm91bmQpIHsKLSAgICAgICAgICAgIHJldHVybiBvcGVyYXRpb247Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBQYXJhbWV0ZXIgZ2V0RXhjZXB0aW9uUGFyYW1ldGVyKENsYXNzIGV4Y2VwdGlvbkNsYXNzKSB7Ci0gICAgICAgIHJldHVybiAoUGFyYW1ldGVyKSB0aGlzLmV4Y2VwdGlvbkNsYXNzVG9QYXJhbWV0ZXJNYXAuZ2V0KGV4Y2VwdGlvbkNsYXNzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUGFyYW1ldGVyIGdldEV4Y2VwdGlvblBhcmFtZXRlcihRTmFtZSBleGNlcHRpb25FbGVtZW50UW5hbWUpIHsKLSAgICAgICAgcmV0dXJuIChQYXJhbWV0ZXIpIHRoaXMuZXhjZXB0aW9uUU5hbWVUb1BhcmFtZXRlck1hcC5nZXQoZXhjZXB0aW9uRWxlbWVudFFuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZSgpIHsKLSAgICAgICAgcmV0dXJuIG5hbWVzcGFjZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lc3BhY2UoU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICB0aGlzLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2xhc3MgZ2V0SmF2YUNsYXNzKCkgewotICAgICAgICByZXR1cm4gamF2YUNsYXNzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEphdmFDbGFzcyhDbGFzcyBqYXZhQ2xhc3MpIHsKLSAgICAgICAgdGhpcy5qYXZhQ2xhc3MgPSBqYXZhQ2xhc3M7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3QgZ2V0T3BlcmF0aW9ucygpIHsKLSAgICAgICAgcmV0dXJuIG9wZXJhdGlvbnM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0T3BlcmF0aW9ucyhMaXN0IG9wZXJhdGlvbnMpIHsKLSAgICAgICAgdGhpcy5vcGVyYXRpb25zID0gb3BlcmF0aW9uczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWFwIGdldFByb2Nlc3NlZFR5cGVNYXAoKSB7Ci0gICAgICAgIHJldHVybiBwcm9jZXNzZWRUeXBlTWFwOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFByb2Nlc3NlZFR5cGVNYXAoTWFwIHByb2Nlc3NlZFR5cGVNYXApIHsKLSAgICAgICAgdGhpcy5wcm9jZXNzZWRUeXBlTWFwID0gcHJvY2Vzc2VkVHlwZU1hcDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29uZmlndXJhdG9yIGdldENvbmZpZ3VyYXRvcigpIHsKLSAgICAgICAgcmV0dXJuIGNvbmZpZ3VyYXRvcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb25maWd1cmF0b3IoQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvcikgewotICAgICAgICB0aGlzLmNvbmZpZ3VyYXRvciA9IGNvbmZpZ3VyYXRvcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWFwIGdldFNjaGVtYU1hcCgpIHsKLSAgICAgICAgcmV0dXJuIHNjaGVtYU1hcDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTY2hlbWFNYXAoTWFwIHNjaGVtYU1hcCkgewotICAgICAgICB0aGlzLnNjaGVtYU1hcCA9IHNjaGVtYU1hcDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWFwIGdldEV4Y2VwdGlvbkNsYXNzVG9QYXJhbWV0ZXJNYXAoKSB7Ci0gICAgICAgIHJldHVybiBleGNlcHRpb25DbGFzc1RvUGFyYW1ldGVyTWFwOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEV4Y2VwdGlvbkNsYXNzVG9QYXJhbWV0ZXJNYXAoTWFwIGV4Y2VwdGlvbkNsYXNzVG9QYXJhbWV0ZXJNYXApIHsKLSAgICAgICAgdGhpcy5leGNlcHRpb25DbGFzc1RvUGFyYW1ldGVyTWFwID0gZXhjZXB0aW9uQ2xhc3NUb1BhcmFtZXRlck1hcDsKLSAgICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9tZXRhZGF0YS9UeXBlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL21ldGFkYXRhL1R5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBlYzAxMi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL21ldGFkYXRhL1R5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGE7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5Db25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZXhjZXB0aW9uLk1ldGFEYXRhUG9wdWxhdGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZXhjZXB0aW9uLlNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEueG1sLlhtbFR5cGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1wdWJsaWMgaW50ZXJmYWNlIFR5cGUgewotCi0gICAgLyoqCi0gICAgICogcG9wdWFsYXRlIHRoZSBtZXRhIGRhdGEgY29ycmVzcG9uZGluZyB0byB0aGlzIHR5cGUKLSAgICAgKiBAcGFyYW0gY29uZmlndXJhdG9yCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcG9wdWxhdGVNZXRhRGF0YShDb25maWd1cmF0b3IgY29uZmlndXJhdG9yLCBNYXAgcHJvY2Vzc2VkVHlwZU1hcCkgdGhyb3dzIE1ldGFEYXRhUG9wdWxhdGVFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiB0aGlzIG1ldGhvZCBzZXRzIHRoZSB4bWxUeXBlIGNvcnJlY3RseS4gdGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgaW52b2tlZAotICAgICAqIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBwcm9jZXNzZWQKLSAgICAgKiBAcGFyYW0gY29uZmlndXJhdG9yCi0gICAgICogQHBhcmFtIHNjaGVtYU1hcAotICAgICAqLwotCi0gICAgcHVibGljIHZvaWQgZ2VuZXJhdGVTY2hlbWEoQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvciwgTWFwIHNjaGVtYU1hcCkgdGhyb3dzIFNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb247Ci0KLSAgICBwdWJsaWMgdm9pZCBwb3B1bGF0ZUFsbEVsZW1lbnRGaWVsZHMoTGlzdCBlbGVtZW50RmllbGRzTGlzdCk7Ci0KLSAgICBwdWJsaWMgdm9pZCBwb3B1bGF0ZUFsbEF0dHJpYnV0ZUZpZWxkcyhMaXN0IGF0dHJpYnV0ZUZpZWxkc0xpc3QpOwotCi0gICAgcHVibGljIExpc3QgZ2V0QWxsRWxlbWVudEZpZWxkcygpOwotCi0gICAgcHVibGljIExpc3QgZ2V0QWxsQXR0cmlidXRlRmllbGRzKCk7Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1NjaGVtYUdlbmVyYXRlZCgpOwotCi0gICAgcHVibGljIHZvaWQgc2V0U2NoZW1hR2VuZXJhdGVkKGJvb2xlYW4gc2NoZW1hR2VuZXJhdGVkKTsKLQotICAgIHB1YmxpYyBDbGFzcyBnZXRKYXZhQ2xhc3MoKTsKLQotICAgIHB1YmxpYyB2b2lkIHNldEphdmFDbGFzcyhDbGFzcyBqYXZhQ2xhc3MpOwotCi0gICAgcHVibGljIExpc3QgZ2V0RWxlbWVudEZpZWxkcygpOwotCi0gICAgcHVibGljIHZvaWQgc2V0RWxlbWVudEZpZWxkcyhMaXN0IGVsZW1lbnRGaWVsZHMpOwotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCk7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKTsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlKCk7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lc3BhY2UoU3RyaW5nIG5hbWVzcGFjZSk7Ci0KLSAgICBwdWJsaWMgWG1sVHlwZSBnZXRYbWxUeXBlKCk7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRYbWxUeXBlKFhtbFR5cGUgeG1sVHlwZSk7Ci0KLSAgICBwdWJsaWMgVHlwZSBnZXRQYXJlbnRUeXBlKCk7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJlbnRUeXBlKFR5cGUgcGFyZW50VHlwZSk7Ci0KLSAgICBwdWJsaWMgTGlzdCBnZXRBdHRyaWJ1dGVGaWVsZHMoKTsKLQotICAgIHB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZUZpZWxkcyhMaXN0IGF0dHJpYnV0ZUZpZWxkcyk7Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvbWV0YWRhdGEvaW1wbC9UeXBlSW1wbC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9tZXRhZGF0YS9pbXBsL1R5cGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWJlZjYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9tZXRhZGF0YS9pbXBsL1R5cGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS5pbXBsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmNvbmZpZy5DbGFzc0luZm87Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuY29uZmlnLkZpZWxkSW5mbzsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5leGNlcHRpb24uTWV0YURhdGFQb3B1bGF0ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5leGNlcHRpb24uU2NoZW1hR2VuZXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS5BdHRyaWJ1dGVGaWVsZDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS5FbGVtZW50RmllbGQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEuRmllbGQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEuVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS54bWwuWG1sSW1wb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLm1ldGFkYXRhLnhtbC5YbWxTY2hlbWE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEueG1sLlhtbFR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEueG1sLmltcGwuWG1sVHlwZUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkudXRpbC5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkudXRpbC5KYXZhVHlwZVRvUU5hbWVNYXA7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEuYmVhbnMuQmVhbkluZm87Ci1pbXBvcnQgamF2YS5iZWFucy5JbnRyb3NwZWN0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuYmVhbnMuSW50cm9zcGVjdG9yOwotaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLQotcHVibGljIGNsYXNzIFR5cGVJbXBsIGltcGxlbWVudHMgVHlwZSB7Ci0gICAgLyoqCi0gICAgICogamF2YSBjbGFzcyBjb3JyZXNwb25kcyB0byB0aGlzIFhtbFR5cGUgb2JqZWN0Ci0gICAgICovCi0gICAgcHJpdmF0ZSBDbGFzcyBqYXZhQ2xhc3M7Ci0KLSAgICAvKioKLSAgICAgKiBsaXN0IG9mIGVsZW1lbnQgRmllbGQgb2JqZWN0cyBmb3IgdGhpcyBqYXZhIGNsYXNzCi0gICAgICovCi0gICAgcHJpdmF0ZSBMaXN0IGVsZW1lbnRGaWVsZHM7Ci0KLSAgICAvKioKLSAgICAgKiBsaXN0IG9mIGF0dHJpYnV0ZSBGaWVsZCBvYmplY3RzIGZvciB0aGlzIGphdmEgY2xhc3MKLSAgICAgKi8KLSAgICBwcml2YXRlIExpc3QgYXR0cmlidXRlRmllbGRzOwotCi0gICAgLyoqCi0gICAgICogbmFtZSBvZiB0aGUgVHlwZSA6IGNsYXNzIG5hbWUKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBuYW1lOwotCi0gICAgLyoqCi0gICAgICogbmFtZXNwYWNlIG9mIHRoZSB0eXBlIDogZGVwZW5kcyBvbiB0aGUgcGFja2FnZQotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIG5hbWVzcGFjZTsKLQotICAgIC8qKgotICAgICAqIHBhcmVudCB0eXBlIGZvciB0aGlzIHR5cGUKLSAgICAgKi8KLSAgICBwcml2YXRlIFR5cGUgcGFyZW50VHlwZTsKLQotICAgIC8qKgotICAgICAqIHhtbCBtZXRhZGF0YSB0eXBlIGNvcnJlcG9uZGluZyB0byB0aGlzIHR5cGUgb2JqZWN0Ci0gICAgICovCi0gICAgcHJpdmF0ZSBYbWxUeXBlIHhtbFR5cGU7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNTY2hlbWFHZW5lcmF0ZWQ7Ci0KLQotICAgIHB1YmxpYyBUeXBlSW1wbCgpIHsKLSAgICAgICAgdGhpcy5lbGVtZW50RmllbGRzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICB0aGlzLmF0dHJpYnV0ZUZpZWxkcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVHlwZUltcGwoQ2xhc3MgamF2YUNsYXNzKSB7Ci0gICAgICAgIHRoaXMoKTsKLSAgICAgICAgdGhpcy5qYXZhQ2xhc3MgPSBqYXZhQ2xhc3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogcG9wdWFsYXRlIHRoZSBtZXRhIGRhdGEgY29ycmVzcG9uZGluZyB0byB0aGlzIHR5cGUKLSAgICAgKiBAcGFyYW0gY29uZmlndXJhdG9yCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcG9wdWxhdGVNZXRhRGF0YShDb25maWd1cmF0b3IgY29uZmlndXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwIHByb2Nlc3NlZFR5cGVNYXApCi0gICAgICAgICAgICB0aHJvd3MgTWV0YURhdGFQb3B1bGF0ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIGphdmEgY2xhc3Mgc2hvdWxkIGFscmFkeSBoYXZlIHBvcHVsYXRlZC4KLQotICAgICAgICAvLyBpZiBqYXZhVHlwZVRvUU5hbWVNYXAgY29udGFpbnMgdGhpcyBrZXkgdGhlbiB0aGlzIGlzIGFuIGVpdGhlcgotICAgICAgICAvLyBwcmltaXRpdmUgdHlwZSBvciBhIFNpbXBsZSBrbm93biB0eXBlLiB3ZSBkb24ndCBoYXZlIHRvIHBvcHVsYXRlCi0gICAgICAgIC8vIHRoZSBhdHRyaWJ1ZXMKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmICghSmF2YVR5cGVUb1FOYW1lTWFwLmNvbnRhaW5zS2V5KHRoaXMuamF2YUNsYXNzKSkgewotICAgICAgICAgICAgICAgIHRoaXMubmFtZSA9IHRoaXMuamF2YUNsYXNzLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICB0aGlzLm5hbWUgPSB0aGlzLm5hbWUuc3Vic3RyaW5nKHRoaXMubmFtZS5sYXN0SW5kZXhPZigiLiIpICsgMSk7Ci0gICAgICAgICAgICAgICAgdGhpcy5uYW1lc3BhY2UgPSBjb25maWd1cmF0b3IuZ2V0TmFtZXNwYWNlKHRoaXMuamF2YUNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOwotCi0gICAgICAgICAgICAgICAgQ2xhc3Mgc3VwZXJDbGFzcyA9IHRoaXMuamF2YUNsYXNzLmdldFN1cGVyY2xhc3MoKTsKLQotICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBzdXBwZXIgY2xhc3MgaXMgT2JqZWN0IGNsYXNzIG5vdGhpbmcgdG8gd2FycnkKLSAgICAgICAgICAgICAgICBpZiAoIXN1cGVyQ2xhc3MuZXF1YWxzKE9iamVjdC5jbGFzcykgJiYgIXN1cGVyQ2xhc3MuZXF1YWxzKEV4Y2VwdGlvbi5jbGFzcykpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gdGhlbiB0aGlzIGlzIGFuIGV4dGVuc2lvbiBjbGFzcyBhbmQgd2UgaGF2ZSB0byBwcm9jZXNzaXQKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFwcm9jZXNzZWRUeXBlTWFwLmNvbnRhaW5zS2V5KHN1cGVyQ2xhc3MpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBUeXBlIHN1cGVyQ2xhc3NUeXBlID0gbmV3IFR5cGVJbXBsKHN1cGVyQ2xhc3MpOwotICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2VkVHlwZU1hcC5wdXQoc3VwZXJDbGFzcywgc3VwZXJDbGFzc1R5cGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXJDbGFzc1R5cGUucG9wdWxhdGVNZXRhRGF0YShjb25maWd1cmF0b3IsIHByb2Nlc3NlZFR5cGVNYXApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0UGFyZW50VHlwZSgoVHlwZSkgcHJvY2Vzc2VkVHlwZU1hcC5nZXQoc3VwZXJDbGFzcykpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIHdlIG5lZWQgaW5mb3JtYXRpbiBvbmx5IGFib3V0IHRoaXMgY2xhc3MKLSAgICAgICAgICAgICAgICAvLyBzdXBwZXIgY2xhc3MgaW5mb3JtYXRpb24gaXMgcHJvY2Vzc2VkIGluIHRoZSBzdXBlciBjbGFzcyB0eXBlCi0gICAgICAgICAgICAgICAgQ2xhc3NJbmZvIGN1c3RvbUNsYXNzSW5mbyA9IGNvbmZpZ3VyYXRvci5nZXRDbGFzc0luZm8odGhpcy5qYXZhQ2xhc3MpOwotICAgICAgICAgICAgICAgIEJlYW5JbmZvIGJlYW5JbmZvID0gSW50cm9zcGVjdG9yLmdldEJlYW5JbmZvKHRoaXMuamF2YUNsYXNzLCB0aGlzLmphdmFDbGFzcy5nZXRTdXBlcmNsYXNzKCkpOwotICAgICAgICAgICAgICAgIFByb3BlcnR5RGVzY3JpcHRvcltdIHByb3BlcnR5RGVzY3JpcHRvcnMgPSBiZWFuSW5mby5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKCk7Ci0gICAgICAgICAgICAgICAgRmllbGQgZmllbGQ7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9wZXJ0eURlc2NyaXB0b3JzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSB0aGUgY2xhc3MgZGVzY3JpcHRvcgotICAgICAgICAgICAgICAgICAgICBpZiAoKGN1c3RvbUNsYXNzSW5mbyAhPSBudWxsKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjdXN0b21DbGFzc0luZm8uZ2V0RmllbGRJbmZvKHByb3BlcnR5RGVzY3JpcHRvcnNbaV0uZ2V0TmFtZSgpKSAhPSBudWxsKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgRmllbGRJbmZvIGZpZWxkSW5mbyA9IGN1c3RvbUNsYXNzSW5mby5nZXRGaWVsZEluZm8ocHJvcGVydHlEZXNjcmlwdG9yc1tpXS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkSW5mby5pc0VsZW1lbnQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkID0gbmV3IEVsZW1lbnRGaWVsZChwcm9wZXJ0eURlc2NyaXB0b3JzW2ldLCB0aGlzLm5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQucG9wdWxhdGVNZXRhRGF0YShjb25maWd1cmF0b3IsIHByb2Nlc3NlZFR5cGVNYXApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudEZpZWxkcy5hZGQoZmllbGQpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSB1c2UgdGhlIGF0dHJpYnV0ZSBuYW1lIHNwYWNlIGFzIG51bGwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZCA9IG5ldyBBdHRyaWJ1dGVGaWVsZChwcm9wZXJ0eURlc2NyaXB0b3JzW2ldLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5wb3B1bGF0ZU1ldGFEYXRhKGNvbmZpZ3VyYXRvciwgcHJvY2Vzc2VkVHlwZU1hcCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hdHRyaWJ1dGVGaWVsZHMuYWRkKGZpZWxkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZEluZm8uZ2V0WG1sTmFtZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5zZXROYW1lKGZpZWxkSW5mby5nZXRYbWxOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQgPSBuZXcgRWxlbWVudEZpZWxkKHByb3BlcnR5RGVzY3JpcHRvcnNbaV0sIHRoaXMubmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLnBvcHVsYXRlTWV0YURhdGEoY29uZmlndXJhdG9yLCBwcm9jZXNzZWRUeXBlTWFwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudEZpZWxkcy5hZGQoZmllbGQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChJbnRyb3NwZWN0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNZXRhRGF0YVBvcHVsYXRlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiRXJyb3IgT2NjdXJlZCB3aGlsZSBnZXR0aW5nIHRoZSBCZWFuIGluZm8gb2YgdGhlIGNsYXNzICIgKyB0aGlzLmphdmFDbGFzcy5nZXROYW1lKCksIGUpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB0aGlzIG1ldGhvZCBzZXRzIHRoZSB4bWxUeXBlIGNvcnJlY3RseS4gdGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgaW52b2tlZAotICAgICAqIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBwcm9jZXNzZWQKLSAgICAgKiBAcGFyYW0gY29uZmlndXJhdG9yCi0gICAgICogQHBhcmFtIHNjaGVtYU1hcAotICAgICAqLwotCi0gICAgcHVibGljIHZvaWQgZ2VuZXJhdGVTY2hlbWEoQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXAgc2NoZW1hTWFwKQotICAgICAgICAgICAgdGhyb3dzIFNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb24gewotCi0gICAgICAgIC8vIGhlcmUgd2UgaGF2ZSB0byBwb3B1bGF0ZSB0aGUgeG1sVHlwZSBvYmplY3QgcHJvcGVybHkKLSAgICAgICAgdGhpcy5pc1NjaGVtYUdlbmVyYXRlZCA9IHRydWU7Ci0gICAgICAgIGlmIChKYXZhVHlwZVRvUU5hbWVNYXAuY29udGFpbnNLZXkodGhpcy5qYXZhQ2xhc3MpKXsKLSAgICAgICAgICAgIC8vIGkuZS4gdGhpcyBpcyBhIGJhc2ljIHR5cGUKLSAgICAgICAgICAgIC8vIG5vIG5lZWQgdG8gcHJvY2VzcyBvciBhZGQgdGhpcyB0byBzY2hlbWEgbGlzdAotICAgICAgICAgICAgdGhpcy54bWxUeXBlID0gbmV3IFhtbFR5cGVJbXBsKEphdmFUeXBlVG9RTmFtZU1hcC5nZXRUeXBlUU5hbWUodGhpcy5qYXZhQ2xhc3MpKTsKLSAgICAgICAgICAgIHRoaXMueG1sVHlwZS5zZXRTaW1wbGVUeXBlKHRydWUpOwotICAgICAgICB9IGVsc2UgewotCi0gICAgICAgICAgICAvLyBnZXQgdGhlIHNjaGVtYSB0byBhZGQgdGhlIGNvbXBsZXggdHlwZQotICAgICAgICAgICAgaWYgKHNjaGVtYU1hcC5nZXQodGhpcy5uYW1lc3BhY2UpID09IG51bGwpewotICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBhIG5ldyBuYW1lc3BhY2UgZm9yIHRoaXMgc2NoZW1hCi0gICAgICAgICAgICAgICAgc2NoZW1hTWFwLnB1dCh0aGlzLm5hbWVzcGFjZSwgbmV3IFhtbFNjaGVtYSh0aGlzLm5hbWVzcGFjZSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgWG1sU2NoZW1hIHhtbFNjaGVtYSA9IChYbWxTY2hlbWEpIHNjaGVtYU1hcC5nZXQodGhpcy5uYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAvLyB3ZSBoYXZlIHRvIGdlbmVyYXRlIGEgY29tcGxleCB0eXBlIGZvciB0aGlzCi0gICAgICAgICAgICB0aGlzLnhtbFR5cGUgPSBuZXcgWG1sVHlwZUltcGwobmV3IFFOYW1lKHRoaXMubmFtZXNwYWNlLHRoaXMubmFtZSkpOwotICAgICAgICAgICAgdGhpcy54bWxUeXBlLnNldFNpbXBsZVR5cGUoZmFsc2UpOwotCi0gICAgICAgICAgICAgLy8gc2V0IHRoZSBwYXJlbnQgdHlwZSBmb3IgdGhpcyB0eXBlCi0gICAgICAgICAgICBpZiAodGhpcy5wYXJlbnRUeXBlICE9IG51bGwpewotICAgICAgICAgICAgICAgIFR5cGUgcGFyZW50VHlwZSA9IHRoaXMucGFyZW50VHlwZTsKLSAgICAgICAgICAgICAgICBpZiAoIXBhcmVudFR5cGUuaXNTY2hlbWFHZW5lcmF0ZWQoKSl7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmVudFR5cGUuZ2VuZXJhdGVTY2hlbWEoY29uZmlndXJhdG9yLHNjaGVtYU1hcCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRoaXMueG1sVHlwZS5zZXRQYXJlbnRUeXBlKHBhcmVudFR5cGUuZ2V0WG1sVHlwZSgpKTsKLSAgICAgICAgICAgICAgICAvLyBpbXBvcnQgdGhlIGNvbXBsZXggdHlwZSBuYW1lc3BhY2UgaWYgbmVlZGVkLgotICAgICAgICAgICAgICAgIGlmICgheG1sU2NoZW1hLmNvbnRhaW5zTmFtZXNwYWNlKHRoaXMueG1sVHlwZS5nZXRQYXJlbnRUeXBlKCkuZ2V0UW5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKSkpewotICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgZWxlbWVudCBuYW1lc3BhY2UgZG9lcyBub3QgZXhpc3RzIHdlIGhhdmUgdG8gYWRkIGl0Ci0gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy54bWxUeXBlLmdldFBhcmVudFR5cGUoKS5nZXRRbmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpLmVxdWFscyhDb25zdGFudHMuVVJJXzIwMDFfU0NIRU1BX1hTRCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFhtbEltcG9ydCB4bWxJbXBvcnQgPSBuZXcgWG1sSW1wb3J0KHRoaXMueG1sVHlwZS5nZXRQYXJlbnRUeXBlKCkuZ2V0UW5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4bWxTY2hlbWEuYWRkSW1wb3J0KHhtbEltcG9ydCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgeG1sU2NoZW1hLmFkZE5hbWVzcGFjZSh0aGlzLnhtbFR5cGUuZ2V0UGFyZW50VHlwZSgpLmdldFFuYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBhZGQgZWxlbWVudHMgb2YgdGhlIGVsZW1lbnRGaWVsZHMKLSAgICAgICAgICAgIEVsZW1lbnRGaWVsZCBlbGVtZW50RmllbGQ7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0aGlzLmVsZW1lbnRGaWVsZHMuaXRlcmF0b3IoKTtpdGVyLmhhc05leHQoKTspewotICAgICAgICAgICAgICAgIGVsZW1lbnRGaWVsZCA9IChFbGVtZW50RmllbGQpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgIGlmICghZWxlbWVudEZpZWxkLmlzU2NoZW1hR2VuZXJhdGVkKCkpewotICAgICAgICAgICAgICAgICAgICAvLyBpZiBpdCBpcyBub3QgYWxyZWFkeSBwcm9jZXNzZWQgcHJvY2VzcyBpdC4KLSAgICAgICAgICAgICAgICAgICAgZWxlbWVudEZpZWxkLmdlbmVyYXRlU2NoZW1hKGNvbmZpZ3VyYXRvcixzY2hlbWFNYXApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0aGlzLnhtbFR5cGUuYWRkRWxlbWVudChlbGVtZW50RmllbGQuZ2V0RWxlbWVudCgpKTsKLSAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHRvIHNldCB0aGUgbmFtZXNwYWNlcyBvZiB0aGVzZSBlbGVtZW50IGNvbXBsZXggdHlwZXMgcHJvcGVybHkKLSAgICAgICAgICAgICAgICBRTmFtZSBlbGVtZW50VHlwZVFOYW1lID0gZWxlbWVudEZpZWxkLmdldEVsZW1lbnQoKS5nZXRUeXBlKCkuZ2V0UW5hbWUoKTsKLSAgICAgICAgICAgICAgICBpZiAoIXhtbFNjaGVtYS5jb250YWluc05hbWVzcGFjZShlbGVtZW50VHlwZVFOYW1lLmdldE5hbWVzcGFjZVVSSSgpKSl7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBlbGVtZW50IG5hbWVzcGFjZSBkb2VzIG5vdCBleGlzdHMgd2UgaGF2ZSB0byBhZGQgaXQKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFlbGVtZW50VHlwZVFOYW1lLmdldE5hbWVzcGFjZVVSSSgpLmVxdWFscyhDb25zdGFudHMuVVJJXzIwMDFfU0NIRU1BX1hTRCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFhtbEltcG9ydCB4bWxJbXBvcnQgPSBuZXcgWG1sSW1wb3J0KGVsZW1lbnRUeXBlUU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgeG1sU2NoZW1hLmFkZEltcG9ydCh4bWxJbXBvcnQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHhtbFNjaGVtYS5hZGROYW1lc3BhY2UoZWxlbWVudFR5cGVRTmFtZS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vYWRkIGF0dHJpYnV0ZSBmaWVsZHMKLSAgICAgICAgICAgIEF0dHJpYnV0ZUZpZWxkIGF0dHJpYnV0ZUZpZWxkOwotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gdGhpcy5hdHRyaWJ1dGVGaWVsZHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KXsKLSAgICAgICAgICAgICAgICBhdHRyaWJ1dGVGaWVsZCA9IChBdHRyaWJ1dGVGaWVsZCkgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFhdHRyaWJ1dGVGaWVsZC5pc1NjaGVtYUdlbmVyYXRlZCgpKXsKLSAgICAgICAgICAgICAgICAgICAgLy8gaWYgaXQgaXMgbm90IGFscmVhZHkgcHJvY2Vzc2VkIHByb2Nlc3MgaXQuCi0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZUZpZWxkLmdlbmVyYXRlU2NoZW1hKGNvbmZpZ3VyYXRvcixzY2hlbWFNYXApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0aGlzLnhtbFR5cGUuYWRkQXR0cmlidXRlKGF0dHJpYnV0ZUZpZWxkLmdldEF0dHJpYnV0ZSgpKTsKLSAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHRvIHNldCB0aGUgbmFtZXNwYWNlcyBvZiB0aGVzZSBlbGVtZW50IGNvbXBsZXggdHlwZXMgcHJvcGVybHkKLSAgICAgICAgICAgICAgICBRTmFtZSBhdHRyaWJ1dGVUeXBlUU5hbWUgPSBhdHRyaWJ1dGVGaWVsZC5nZXRBdHRyaWJ1dGUoKS5nZXRUeXBlKCkuZ2V0UW5hbWUoKTsKLSAgICAgICAgICAgICAgICBpZiAoIXhtbFNjaGVtYS5jb250YWluc05hbWVzcGFjZShhdHRyaWJ1dGVUeXBlUU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpKXsKLSAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGVsZW1lbnQgbmFtZXNwYWNlIGRvZXMgbm90IGV4aXN0cyB3ZSBoYXZlIHRvIGFkZCBpdAotICAgICAgICAgICAgICAgICAgICBpZiAoIWF0dHJpYnV0ZVR5cGVRTmFtZS5nZXROYW1lc3BhY2VVUkkoKS5lcXVhbHMoQ29uc3RhbnRzLlVSSV8yMDAxX1NDSEVNQV9YU0QpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBYbWxJbXBvcnQgeG1sSW1wb3J0ID0gbmV3IFhtbEltcG9ydChhdHRyaWJ1dGVUeXBlUU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgeG1sU2NoZW1hLmFkZEltcG9ydCh4bWxJbXBvcnQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHhtbFNjaGVtYS5hZGROYW1lc3BhY2UoYXR0cmlidXRlVHlwZVFOYW1lLmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIGZpbmFsbHkgYWRkIHRoaXMgY29tcGxleCB0eXBlIHRvIHNjaGVtYSBtYXAKLSAgICAgICAgICAgIHhtbFNjaGVtYS5hZGRDb21wbGV4VHlwZSh0aGlzLnhtbFR5cGUpOwotCi0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHBvcHVsYXRlQWxsRWxlbWVudEZpZWxkcyhMaXN0IGVsZW1lbnRGaWVsZHNMaXN0KXsKLSAgICAgICAgLy8gd2UgaGF2ZSB0byBmaXJzdCBhZGQgdGhlIHBhcmVudCBkZXRhaWxzIHRvIGtlZXAgdGhlIG9yZGVyLgotICAgICAgICBpZiAodGhpcy5wYXJlbnRUeXBlICE9IG51bGwpewotICAgICAgICAgICAgdGhpcy5wYXJlbnRUeXBlLnBvcHVsYXRlQWxsRWxlbWVudEZpZWxkcyhlbGVtZW50RmllbGRzTGlzdCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxlbWVudEZpZWxkc0xpc3QuYWRkQWxsKHRoaXMuZWxlbWVudEZpZWxkcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcG9wdWxhdGVBbGxBdHRyaWJ1dGVGaWVsZHMoTGlzdCBhdHRyaWJ1dGVGaWVsZHNMaXN0KSB7Ci0gICAgICAgIC8vIHdlIGhhdmUgdG8gZmlyc3QgYWRkIHRoZSBwYXJlbnQgZGV0YWlscyB0byBrZWVwIHRoZSBvcmRlci4KLSAgICAgICAgaWYgKHRoaXMucGFyZW50VHlwZSAhPSBudWxsKXsKLSAgICAgICAgICAgIHRoaXMucGFyZW50VHlwZS5wb3B1bGF0ZUFsbEF0dHJpYnV0ZUZpZWxkcyhhdHRyaWJ1dGVGaWVsZHNMaXN0KTsKLSAgICAgICAgfQotICAgICAgICBhdHRyaWJ1dGVGaWVsZHNMaXN0LmFkZEFsbCh0aGlzLmF0dHJpYnV0ZUZpZWxkcyk7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3QgZ2V0QWxsRWxlbWVudEZpZWxkcygpewotICAgICAgICBMaXN0IGFsbEVsZW1lbnRzTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgcG9wdWxhdGVBbGxFbGVtZW50RmllbGRzKGFsbEVsZW1lbnRzTGlzdCk7Ci0gICAgICAgIHJldHVybiBhbGxFbGVtZW50c0xpc3Q7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3QgZ2V0QWxsQXR0cmlidXRlRmllbGRzKCkgewotICAgICAgICBMaXN0IGFsbEF0dHJpYnV0ZXNMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBwb3B1bGF0ZUFsbEF0dHJpYnV0ZUZpZWxkcyhhbGxBdHRyaWJ1dGVzTGlzdCk7Ci0gICAgICAgIHJldHVybiBhbGxBdHRyaWJ1dGVzTGlzdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1NjaGVtYUdlbmVyYXRlZCgpIHsKLSAgICAgICAgcmV0dXJuIGlzU2NoZW1hR2VuZXJhdGVkOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFNjaGVtYUdlbmVyYXRlZChib29sZWFuIHNjaGVtYUdlbmVyYXRlZCkgewotICAgICAgICBpc1NjaGVtYUdlbmVyYXRlZCA9IHNjaGVtYUdlbmVyYXRlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2xhc3MgZ2V0SmF2YUNsYXNzKCkgewotICAgICAgICByZXR1cm4gamF2YUNsYXNzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEphdmFDbGFzcyhDbGFzcyBqYXZhQ2xhc3MpIHsKLSAgICAgICAgdGhpcy5qYXZhQ2xhc3MgPSBqYXZhQ2xhc3M7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3QgZ2V0RWxlbWVudEZpZWxkcygpIHsKLSAgICAgICAgcmV0dXJuIGVsZW1lbnRGaWVsZHM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RWxlbWVudEZpZWxkcyhMaXN0IGVsZW1lbnRGaWVsZHMpIHsKLSAgICAgICAgdGhpcy5lbGVtZW50RmllbGRzID0gZWxlbWVudEZpZWxkczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZSgpIHsKLSAgICAgICAgcmV0dXJuIG5hbWVzcGFjZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lc3BhY2UoU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICB0aGlzLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgWG1sVHlwZSBnZXRYbWxUeXBlKCkgewotICAgICAgICByZXR1cm4geG1sVHlwZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRYbWxUeXBlKFhtbFR5cGUgeG1sVHlwZSkgewotICAgICAgICB0aGlzLnhtbFR5cGUgPSB4bWxUeXBlOwotICAgIH0KLQotICAgIHB1YmxpYyBUeXBlIGdldFBhcmVudFR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBwYXJlbnRUeXBlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBhcmVudFR5cGUoVHlwZSBwYXJlbnRUeXBlKSB7Ci0gICAgICAgIHRoaXMucGFyZW50VHlwZSA9IHBhcmVudFR5cGU7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3QgZ2V0QXR0cmlidXRlRmllbGRzKCkgewotICAgICAgICByZXR1cm4gYXR0cmlidXRlRmllbGRzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZUZpZWxkcyhMaXN0IGF0dHJpYnV0ZUZpZWxkcykgewotICAgICAgICB0aGlzLmF0dHJpYnV0ZUZpZWxkcyA9IGF0dHJpYnV0ZUZpZWxkczsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL21ldGFkYXRhL3htbC9BYnN0cmFjdFhtbFR5cGUuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvbWV0YWRhdGEveG1sL0Fic3RyYWN0WG1sVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTViOTg3Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvbWV0YWRhdGEveG1sL0Fic3RyYWN0WG1sVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEueG1sOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZXhjZXB0aW9uLlNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RYbWxUeXBlIGltcGxlbWVudHMgWG1sVHlwZXsKLQotICAgIC8qKgotICAgICAqIFF1YWxpZmllZCBuYW1lIG9mIHRoZSB4bWxUeXBlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFFOYW1lIHFuYW1lOwotCi0gICAgLyoqCi0gICAgICogaXMgdGhpcyBhbiBhbkFub255bW91cyB0eXBlIHRoaXMgY2FzZSBxbmFtZSBjYW4gYmUgbnVsbAotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGlzQW5vbnltb3VzOwotCi0gICAgLyoqCi0gICAgICogaXMgdGhpcyBpcyBhIGJhc2ljIHR5cGUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1NpbXBsZVR5cGU7Ci0KLSAgICAvKioKLSAgICAgKiBsaXN0IG9mIGNoaWxkIGVsZW1lbnRzCi0gICAgICovCi0gICAgcHJvdGVjdGVkIExpc3QgZWxlbWVudHM7Ci0KLSAgICAvKioKLSAgICAgKiBsaXN0IG9mIGNoaWxkIGF0dHJpYnV0ZXMKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTGlzdCBhdHRyaWJ1dGVzOwotCi0gICAgLyoqCi0gICAgICogY29tcGxleCB0eXBlIGVsZW1lbnQgZm9yIHRoaXMgWG1sVHlwZQotICAgICAqLwotICAgIHByb3RlY3RlZCBFbGVtZW50IHR5cGVFbGVtZW50OwotCi0gICAgLyoqCi0gICAgICogcGFyZW50IHR5cGUgZm9yIHRoaXMgeG1sIHR5cGUgaWYgaXQgaXMgYW4gZXh0ZW5zaW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFhtbFR5cGUgcGFyZW50VHlwZTsKLQotICAgIHB1YmxpYyB2b2lkIGFkZEVsZW1lbnQoWG1sRWxlbWVudCB4bWxFbGVtZW50KSB7Ci0gICAgICAgIHRoaXMuZWxlbWVudHMuYWRkKHhtbEVsZW1lbnQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZEF0dHJpYnV0ZShYbWxBdHRyaWJ1dGUgeG1sQXR0cmlidXRlKSB7Ci0gICAgICAgIHRoaXMuYXR0cmlidXRlcy5hZGQoeG1sQXR0cmlidXRlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB0aGlzIGdlbmVyYXRlcyB0aGUgY29tcGxleCB0eXBlIG9ubHkgaWYgaXQgaXMgYW5ub255bW91cyBhbmQKLSAgICAgKiBpcyBub3QgYSBzaW1wbGUgdHlwZQotICAgICAqCi0gICAgICogQHBhcmFtIGRvY3VtZW50Ci0gICAgICogQHBhcmFtIG5hbWVzcGFjZXNUb1ByZWZpeE1hcAotICAgICAqIEB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5ybWkuZXhjZXB0aW9uLlNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb24KLSAgICAgKgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGdlbmVyYXRlV1NETFNjaGVtYShEb2N1bWVudCBkb2N1bWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwIG5hbWVzcGFjZXNUb1ByZWZpeE1hcCkKLSAgICAgICAgICAgIHRocm93cyBTY2hlbWFHZW5lcmF0aW9uRXhjZXB0aW9uOwotCi0gICAgcHVibGljIFFOYW1lIGdldFFuYW1lKCkgewotICAgICAgICByZXR1cm4gcW5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UW5hbWUoUU5hbWUgcW5hbWUpIHsKLSAgICAgICAgdGhpcy5xbmFtZSA9IHFuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQW5vbnltb3VzKCkgewotICAgICAgICByZXR1cm4gaXNBbm9ueW1vdXM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QW5vbnltb3VzKGJvb2xlYW4gYW5vbnltb3VzKSB7Ci0gICAgICAgIGlzQW5vbnltb3VzID0gYW5vbnltb3VzOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzU2ltcGxlVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIGlzU2ltcGxlVHlwZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTaW1wbGVUeXBlKGJvb2xlYW4gc2ltcGxlVHlwZSkgewotICAgICAgICBpc1NpbXBsZVR5cGUgPSBzaW1wbGVUeXBlOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0IGdldEVsZW1lbnRzKCkgewotICAgICAgICByZXR1cm4gZWxlbWVudHM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RWxlbWVudHMoTGlzdCBlbGVtZW50cykgewotICAgICAgICB0aGlzLmVsZW1lbnRzID0gZWxlbWVudHM7Ci0gICAgfQotCi0gICAgcHVibGljIEVsZW1lbnQgZ2V0VHlwZUVsZW1lbnQoKSB7Ci0gICAgICAgIHJldHVybiB0eXBlRWxlbWVudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRUeXBlRWxlbWVudChFbGVtZW50IHR5cGVFbGVtZW50KSB7Ci0gICAgICAgIHRoaXMudHlwZUVsZW1lbnQgPSB0eXBlRWxlbWVudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgWG1sVHlwZSBnZXRQYXJlbnRUeXBlKCkgewotICAgICAgICByZXR1cm4gcGFyZW50VHlwZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJlbnRUeXBlKFhtbFR5cGUgcGFyZW50VHlwZSkgewotICAgICAgICB0aGlzLnBhcmVudFR5cGUgPSBwYXJlbnRUeXBlOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0IGdldEF0dHJpYnV0ZXMoKSB7Ci0gICAgICAgIHJldHVybiBhdHRyaWJ1dGVzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZXMoTGlzdCBhdHRyaWJ1dGVzKSB7Ci0gICAgICAgIHRoaXMuYXR0cmlidXRlcyA9IGF0dHJpYnV0ZXM7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9tZXRhZGF0YS94bWwvWG1sQXR0cmlidXRlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL21ldGFkYXRhL3htbC9YbWxBdHRyaWJ1dGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjYxNDBlZi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL21ldGFkYXRhL3htbC9YbWxBdHRyaWJ1dGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEueG1sOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZXhjZXB0aW9uLlNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogdGhpcyBjbGFzcyByZXByZXNlbnRzIGFuZCB4bWwgYXR0cmlidXRlCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sQXR0cmlidXRlIHsKLQotICAgIHB1YmxpYyB2b2lkIGdlbmVyYXRlV1NETFNjaGVtYShEb2N1bWVudCBkb2N1bWVudCwgTWFwIG5hbWVzcGFjZXNUb1ByZWZpeE1hcCkgdGhyb3dzIFNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb247Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZSgpOwotCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZXNwYWNlKFN0cmluZyBuYW1lc3BhY2UpOwotCi0gICAgcHVibGljIGJvb2xlYW4gaXNSZXF1aXJlZCgpOwotCi0gICAgcHVibGljIHZvaWQgc2V0UmVxdWlyZWQoYm9vbGVhbiByZXF1aXJlZCk7Ci0KLSAgICBwdWJsaWMgWG1sVHlwZSBnZXRUeXBlKCk7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRUeXBlKFhtbFR5cGUgdHlwZSk7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsKLQotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpOwotCi0gICAgcHVibGljIEVsZW1lbnQgZ2V0QXR0cmlidXRlKCk7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoRWxlbWVudCBhdHRyaWJ1dGUpOwotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL21ldGFkYXRhL3htbC9YbWxFbGVtZW50LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL21ldGFkYXRhL3htbC9YbWxFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4Mzg3NjMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9tZXRhZGF0YS94bWwvWG1sRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS54bWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5leGNlcHRpb24uU2NoZW1hR2VuZXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotcHVibGljIGludGVyZmFjZSBYbWxFbGVtZW50IHsKLQotICAgIHB1YmxpYyB2b2lkIGdlbmVyYXRlV1NETFNjaGVtYShEb2N1bWVudCBkb2N1bWVudCwgTWFwIG5hbWVzcGFjZXNUb1ByZWZpeE1hcCkgdGhyb3dzIFNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb247Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZSgpOwotCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZXNwYWNlKFN0cmluZyBuYW1lc3BhY2UpOwotCi0gICAgcHVibGljIGJvb2xlYW4gaXNOaWxsYWJsZSgpOwotCi0gICAgcHVibGljIHZvaWQgc2V0TmlsbGFibGUoYm9vbGVhbiBuaWxsYWJsZSk7Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0FycmF5KCk7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRBcnJheShib29sZWFuIGFycmF5KTsKLQotICAgIHB1YmxpYyBib29sZWFuIGlzVG9wRWxlbWVudCgpOwotCi0gICAgcHVibGljIHZvaWQgc2V0VG9wRWxlbWVudChib29sZWFuIHRvcEVsZW1lbnQpOwotCi0gICAgcHVibGljIFhtbFR5cGUgZ2V0VHlwZSgpOwotCi0gICAgcHVibGljIHZvaWQgc2V0VHlwZShYbWxUeXBlIHR5cGUpOwotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCk7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKTsKLQotICAgIHB1YmxpYyBFbGVtZW50IGdldEVsZW1lbnQoKTsKLQotICAgIHB1YmxpYyB2b2lkIHNldEVsZW1lbnQoRWxlbWVudCBlbGVtZW50KTsKLQotICAgIHB1YmxpYyBib29sZWFuIGlzTWluT2NjdXJzMCgpOwotCi0gICAgcHVibGljIHZvaWQgc2V0TWluT2NjdXJzMChib29sZWFuIG1pbk9jY3VyczApOwotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL21ldGFkYXRhL3htbC9YbWxJbXBvcnQuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvbWV0YWRhdGEveG1sL1htbEltcG9ydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYWY2ZGNiLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvbWV0YWRhdGEveG1sL1htbEltcG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS54bWw7Ci0KLXB1YmxpYyBjbGFzcyBYbWxJbXBvcnQgewotCi0gICAgLyoqCi0gICAgICogbmFtZXNwYWNlIHRvIGltcG9ydAotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIG5hbWVzcGFjZTsKLQotICAgIC8qKgotICAgICAqIHNjaGVtYSBsb2NhdGlvbiBmb3IgaW1wb3J0IHNjaGVtYQotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIHNjaGVtYUxvY2F0aW9uOwotCi0gICAgcHVibGljIFhtbEltcG9ydCgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgWG1sSW1wb3J0KFN0cmluZyBuYW1lc3BhY2UpIHsKLSAgICAgICAgdGhpcy5uYW1lc3BhY2UgPSBuYW1lc3BhY2U7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2UoKSB7Ci0gICAgICAgIHJldHVybiBuYW1lc3BhY2U7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZXNwYWNlKFN0cmluZyBuYW1lc3BhY2UpIHsKLSAgICAgICAgdGhpcy5uYW1lc3BhY2UgPSBuYW1lc3BhY2U7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRTY2hlbWFMb2NhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIHNjaGVtYUxvY2F0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFNjaGVtYUxvY2F0aW9uKFN0cmluZyBzY2hlbWFMb2NhdGlvbikgewotICAgICAgICB0aGlzLnNjaGVtYUxvY2F0aW9uID0gc2NoZW1hTG9jYXRpb247Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9tZXRhZGF0YS94bWwvWG1sU2NoZW1hLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL21ldGFkYXRhL3htbC9YbWxTY2hlbWEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDEzZGNiOC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL21ldGFkYXRhL3htbC9YbWxTY2hlbWEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLm1ldGFkYXRhLnhtbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmV4Y2VwdGlvbi5TY2hlbWFHZW5lcmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLnV0aWwuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLnV0aWwuVXRpbDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1pbXBvcnQgamF2YXgud3NkbC5UeXBlczsKLWltcG9ydCBqYXZheC53c2RsLldTRExFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zY2hlbWEuU2NoZW1hOwotaW1wb3J0IGphdmF4LndzZGwuZmFjdG9yeS5XU0RMRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotcHVibGljIGNsYXNzIFhtbFNjaGVtYSB7Ci0KLSAgICAvKioKLSAgICAgKiB0YXJnZXQgbmFtZXNwYWNlIG9mIHRoZSBzY2hlbWEKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyB0YXJnZXROYW1lc3BhY2U7Ci0KLSAgICAvKioKLSAgICAgKiBvdGhlciBkZWNsYXJlZCBuYW1lc3BhY2VzCi0gICAgICovCi0gICAgcHJpdmF0ZSBMaXN0IG5hbWVzcGFjZXM7Ci0KLSAgICAvKioKLSAgICAgKiB0b3AgbGV2ZWwgZWxlbWVudHMgZm9yIHRoaXMgc2NoZW1hCi0gICAgICovCi0gICAgcHJpdmF0ZSBMaXN0IGVsZW1lbnRzOwotCi0gICAgLyoqCi0gICAgICogdG9wIGxldmVsIGNvbXBsZXggdHlwZXMgZm9yIHRoaXMgc2NoZW1hCi0gICAgICovCi0gICAgcHJpdmF0ZSBMaXN0IGNvbXBsZXhUeXBlczsKLQotICAgIC8qKgotICAgICAqIG90aGVyIHNjaGVtYSBpbXBvcnRzCi0gICAgICovCi0gICAgcHJpdmF0ZSBMaXN0IGltcG9ydHM7Ci0KLSAgICAvKioKLSAgICAgKiB3c2RsIHNjaGVtYSBlbGVtZW50IGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBzY2hlbWEgZWxlbWVudAotICAgICAqLwotICAgIHByaXZhdGUgU2NoZW1hIHdzZGxTY2hlbWE7Ci0KLSAgICAvKioKLSAgICAgKiBkZWZhdWx0IGNvbnN0cnVjdG9yCi0gICAgICovCi0gICAgcHVibGljIFhtbFNjaGVtYSgpIHsKLSAgICAgICAgdGhpcy5lbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgdGhpcy5jb21wbGV4VHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIHRoaXMubmFtZXNwYWNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgdGhpcy5pbXBvcnRzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGNvbnN0cnVjdG9yIHdpdGggdGFyZ2V0IG5hbWVzcGFjZQotICAgICAqIEBwYXJhbSB0YXJnZXROYW1lc3BhY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgWG1sU2NoZW1hKFN0cmluZyB0YXJnZXROYW1lc3BhY2UpIHsKLSAgICAgICAgdGhpcygpOwotICAgICAgICB0aGlzLnRhcmdldE5hbWVzcGFjZSA9IHRhcmdldE5hbWVzcGFjZTsKLSAgICAgICAgdGhpcy5uYW1lc3BhY2VzLmFkZCh0aGlzLnRhcmdldE5hbWVzcGFjZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogc2V0cyB0aGUgd3NkbCBzY2hlbWEgZm9yIHRoaXMgc2NoZW1hIG9iamVjdAotICAgICAqIEB0aHJvd3MgU2NoZW1hR2VuZXJhdGlvbkV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGdlbmVyYXRlV1NETFNjaGVtYSgpCi0gICAgICAgICAgICB0aHJvd3MgU2NoZW1hR2VuZXJhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSA9IFdTRExGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3UG9wdWxhdGVkRXh0ZW5zaW9uUmVnaXN0cnkoKTsKLSAgICAgICAgICAgIHRoaXMud3NkbFNjaGVtYSA9IChTY2hlbWEpIGV4dGVuc2lvblJlZ2lzdHJ5LmNyZWF0ZUV4dGVuc2lvbigKLSAgICAgICAgICAgICAgICAgICAgVHlwZXMuY2xhc3MsIG5ldyBRTmFtZShDb25zdGFudHMuVVJJXzIwMDFfU0NIRU1BX1hTRCwgInNjaGVtYSIpKTsKLQotICAgICAgICAgICAgLy8gY3JlYXRlIHRoZSBzY2hlbWEgZWxlbWVudAotICAgICAgICAgICAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBkb2N1bWVudEJ1aWxkZXJGYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgZG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKLSAgICAgICAgICAgIERvY3VtZW50QnVpbGRlciBkb2N1bWVudEJ1aWxkZXIgPSBkb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpOwotICAgICAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBkb2N1bWVudEJ1aWxkZXIubmV3RG9jdW1lbnQoKTsKLQotICAgICAgICAgICAgRWxlbWVudCBzY2hlbWFFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKENvbnN0YW50cy5VUklfMjAwMV9TQ0hFTUFfWFNELCAieHNkOnNjaGVtYSIpOwotCi0gICAgICAgICAgICBzY2hlbWFFbGVtZW50LnNldEF0dHJpYnV0ZU5TKENvbnN0YW50cy5YTUxOU19BVFRSSUJVVEVfTlNfVVJJLCJ4bWxuczp4c2QiLENvbnN0YW50cy5VUklfMjAwMV9TQ0hFTUFfWFNEKTsKLQotICAgICAgICAgICAgTWFwIG5hbWVzcGFjZXNUb1ByZWZpeE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgICAgICBuYW1lc3BhY2VzVG9QcmVmaXhNYXAucHV0KENvbnN0YW50cy5VUklfMjAwMV9TQ0hFTUFfWFNELCJ4c2QiKTsKLSAgICAgICAgICAgIC8vIHNldCBkZWZhdWx0IG5hbWVzcGFjZSBhdHRyaWJ1dGUKLQotICAgICAgICAgICAgdGhpcy53c2RsU2NoZW1hLnNldEVsZW1lbnQoc2NoZW1hRWxlbWVudCk7Ci0KLSAgICAgICAgICAgIC8vc2V0IHRoZSB0YXJnZXQgbmFtZXNhcGNlIGFuZCBvdGhlciBuYW1lc3BhY2VzCi0gICAgICAgICAgICBzY2hlbWFFbGVtZW50LnNldEF0dHJpYnV0ZSgidGFyZ2V0TmFtZXNwYWNlIiwgdGhpcy50YXJnZXROYW1lc3BhY2UpOwotICAgICAgICAgICAgc2NoZW1hRWxlbWVudC5zZXRBdHRyaWJ1dGUoImVsZW1lbnRGb3JtRGVmYXVsdCIsICJxdWFsaWZpZWQiKTsKLQotICAgICAgICAgICAgLy8gYWRkIG90aGVyIG5hbWVzYXBjZXMKLSAgICAgICAgICAgIFN0cmluZyBuYW1lc3BhY2U7Ci0gICAgICAgICAgICBTdHJpbmcgcHJlZml4OwotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gdGhpcy5uYW1lc3BhY2VzLml0ZXJhdG9yKCk7aXRlci5oYXNOZXh0KCk7KXsKLSAgICAgICAgICAgICAgICBuYW1lc3BhY2UgPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBpZiAoIW5hbWVzcGFjZXNUb1ByZWZpeE1hcC5jb250YWluc0tleShuYW1lc3BhY2UpKXsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gVXRpbC5nZXROZXh0TmFtZXNwYWNlUHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIHNjaGVtYUVsZW1lbnQuc2V0QXR0cmlidXRlTlMoQ29uc3RhbnRzLlhNTE5TX0FUVFJJQlVURV9OU19VUkksInhtbG5zOiIgKyBwcmVmaXgsbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlc1RvUHJlZml4TWFwLnB1dChuYW1lc3BhY2UscHJlZml4KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGFkZCBpbXBvcnRzCi0gICAgICAgICAgICBYbWxJbXBvcnQgeG1sSW1wb3J0OwotICAgICAgICAgICAgRWxlbWVudCBpbXBvcnRFbGVtZW50OwotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gdGhpcy5pbXBvcnRzLml0ZXJhdG9yKCk7aXRlci5oYXNOZXh0KCk7KXsKLSAgICAgICAgICAgICAgICB4bWxJbXBvcnQgPSAoWG1sSW1wb3J0KSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBpbXBvcnRFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKENvbnN0YW50cy5VUklfMjAwMV9TQ0hFTUFfWFNELCAieHNkOmltcG9ydCIpOwotICAgICAgICAgICAgICAgIGltcG9ydEVsZW1lbnQuc2V0QXR0cmlidXRlKCJuYW1lc3BhY2UiLCB4bWxJbXBvcnQuZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICAgICAgICAgIHNjaGVtYUVsZW1lbnQuYXBwZW5kQ2hpbGQoaW1wb3J0RWxlbWVudCk7Ci0gICAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAgLy8gY3JlYXRlIGNvbXBsZXggdHlwZSBlbGVtZW50cwotICAgICAgICAgICAgWG1sVHlwZSB4bWxUeXBlOwotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gdGhpcy5jb21wbGV4VHlwZXMuaXRlcmF0b3IoKTtpdGVyLmhhc05leHQoKTspewotICAgICAgICAgICAgICAgICB4bWxUeXBlID0gKFhtbFR5cGUpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICBpZiAoIXhtbFR5cGUuaXNBbm9ueW1vdXMoKSAmJiAheG1sVHlwZS5pc1NpbXBsZVR5cGUoKSl7Ci0gICAgICAgICAgICAgICAgICAgICB4bWxUeXBlLmdlbmVyYXRlV1NETFNjaGVtYShkb2N1bWVudCwgbmFtZXNwYWNlc1RvUHJlZml4TWFwKTsKLSAgICAgICAgICAgICAgICAgICAgIHNjaGVtYUVsZW1lbnQuYXBwZW5kQ2hpbGQoeG1sVHlwZS5nZXRUeXBlRWxlbWVudCgpKTsKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBjcmVhdGUgZWxlbWVudHMKLSAgICAgICAgICAgIFhtbEVsZW1lbnQgeG1sRWxlbWVudDsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHRoaXMuZWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KXsKLSAgICAgICAgICAgICAgICAgeG1sRWxlbWVudCA9IChYbWxFbGVtZW50KSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgeG1sRWxlbWVudC5nZW5lcmF0ZVdTRExTY2hlbWEoZG9jdW1lbnQsIG5hbWVzcGFjZXNUb1ByZWZpeE1hcCk7Ci0gICAgICAgICAgICAgICAgIHNjaGVtYUVsZW1lbnQuYXBwZW5kQ2hpbGQoeG1sRWxlbWVudC5nZXRFbGVtZW50KCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gY2F0Y2ggKFdTRExFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb24oIkVycm9yIHdoaWxlIGNyZWF0aW5nIHRoZSBleHRlbnNpb24gcmVnaXN0cnkiLGUpOwotICAgICAgICB9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7ICAvL1RvIGNoYW5nZSBib2R5IG9mIGNhdGNoIHN0YXRlbWVudCB1c2UgRmlsZSB8IFNldHRpbmdzIHwgRmlsZSBUZW1wbGF0ZXMuCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRFbGVtZW50KFhtbEVsZW1lbnQgeG1sRWxlbWVudCl7Ci0gICAgICAgIHRoaXMuZWxlbWVudHMuYWRkKHhtbEVsZW1lbnQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZENvbXBsZXhUeXBlKFhtbFR5cGUgeG1sVHlwZSl7Ci0gICAgICAgIHRoaXMuY29tcGxleFR5cGVzLmFkZCh4bWxUeXBlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGROYW1lc3BhY2UoU3RyaW5nIG5hbWVzcGFjZSl7Ci0gICAgICAgIHRoaXMubmFtZXNwYWNlcy5hZGQobmFtZXNwYWNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRJbXBvcnQoWG1sSW1wb3J0IHhtbEltcG9ydCl7Ci0gICAgICAgIHRoaXMuaW1wb3J0cy5hZGQoeG1sSW1wb3J0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc05hbWVzcGFjZShTdHJpbmcgbmFtZXNwYWNlKXsKLSAgICAgICAgcmV0dXJuIHRoaXMubmFtZXNwYWNlcy5jb250YWlucyhuYW1lc3BhY2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0TmFtZXNwYWNlKCkgewotICAgICAgICByZXR1cm4gdGFyZ2V0TmFtZXNwYWNlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFRhcmdldE5hbWVzcGFjZShTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlKSB7Ci0gICAgICAgIHRoaXMudGFyZ2V0TmFtZXNwYWNlID0gdGFyZ2V0TmFtZXNwYWNlOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0IGdldE5hbWVzcGFjZXMoKSB7Ci0gICAgICAgIHJldHVybiBuYW1lc3BhY2VzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE5hbWVzcGFjZXMoTGlzdCBuYW1lc3BhY2VzKSB7Ci0gICAgICAgIHRoaXMubmFtZXNwYWNlcyA9IG5hbWVzcGFjZXM7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3QgZ2V0RWxlbWVudHMoKSB7Ci0gICAgICAgIHJldHVybiBlbGVtZW50czsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRFbGVtZW50cyhMaXN0IGVsZW1lbnRzKSB7Ci0gICAgICAgIHRoaXMuZWxlbWVudHMgPSBlbGVtZW50czsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdCBnZXRDb21wbGV4VHlwZXMoKSB7Ci0gICAgICAgIHJldHVybiBjb21wbGV4VHlwZXM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q29tcGxleFR5cGVzKExpc3QgY29tcGxleFR5cGVzKSB7Ci0gICAgICAgIHRoaXMuY29tcGxleFR5cGVzID0gY29tcGxleFR5cGVzOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0IGdldEltcG9ydHMoKSB7Ci0gICAgICAgIHJldHVybiBpbXBvcnRzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEltcG9ydHMoTGlzdCBpbXBvcnRzKSB7Ci0gICAgICAgIHRoaXMuaW1wb3J0cyA9IGltcG9ydHM7Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYSBnZXRXc2RsU2NoZW1hKCkgewotICAgICAgICByZXR1cm4gd3NkbFNjaGVtYTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRXc2RsU2NoZW1hKFNjaGVtYSB3c2RsU2NoZW1hKSB7Ci0gICAgICAgIHRoaXMud3NkbFNjaGVtYSA9IHdzZGxTY2hlbWE7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9tZXRhZGF0YS94bWwvWG1sVHlwZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9tZXRhZGF0YS94bWwvWG1sVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDRkMWY1Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvbWV0YWRhdGEveG1sL1htbFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEueG1sOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZXhjZXB0aW9uLlNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIFhtbFR5cGUgewotCi0gICAgcHVibGljIHZvaWQgYWRkRWxlbWVudChYbWxFbGVtZW50IHhtbEVsZW1lbnQpOwotCi0gICAgcHVibGljIHZvaWQgYWRkQXR0cmlidXRlKFhtbEF0dHJpYnV0ZSB4bWxBdHRyaWJ1dGUpOwotCi0gICAgLyoqCi0gICAgICogdGhpcyBnZW5lcmF0ZXMgdGhlIGNvbXBsZXggdHlwZSBvbmx5IGlmIGl0IGlzIGFubm9ueW1vdXMgYW5kCi0gICAgICogaXMgbm90IGEgc2ltcGxlIHR5cGUKLSAgICAgKiBAcGFyYW0gZG9jdW1lbnQKLSAgICAgKiBAcGFyYW0gbmFtZXNwYWNlc1RvUHJlZml4TWFwCi0gICAgICogQHRocm93cyBTY2hlbWFHZW5lcmF0aW9uRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZ2VuZXJhdGVXU0RMU2NoZW1hKERvY3VtZW50IGRvY3VtZW50LCBNYXAgbmFtZXNwYWNlc1RvUHJlZml4TWFwKSB0aHJvd3MgU2NoZW1hR2VuZXJhdGlvbkV4Y2VwdGlvbjsKLQotICAgIHB1YmxpYyBRTmFtZSBnZXRRbmFtZSgpOwotCi0gICAgcHVibGljIHZvaWQgc2V0UW5hbWUoUU5hbWUgcW5hbWUpOwotCi0gICAgcHVibGljIGJvb2xlYW4gaXNBbm9ueW1vdXMoKTsKLQotICAgIHB1YmxpYyB2b2lkIHNldEFub255bW91cyhib29sZWFuIGFub255bW91cyk7Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1NpbXBsZVR5cGUoKTsKLQotICAgIHB1YmxpYyB2b2lkIHNldFNpbXBsZVR5cGUoYm9vbGVhbiBzaW1wbGVUeXBlKTsKLQotICAgIHB1YmxpYyBMaXN0IGdldEVsZW1lbnRzKCk7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRFbGVtZW50cyhMaXN0IGVsZW1lbnRzKTsKLQotICAgIHB1YmxpYyBFbGVtZW50IGdldFR5cGVFbGVtZW50KCk7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRUeXBlRWxlbWVudChFbGVtZW50IHR5cGVFbGVtZW50KTsKLQotICAgIHB1YmxpYyBYbWxUeXBlIGdldFBhcmVudFR5cGUoKTsKLQotICAgIHB1YmxpYyB2b2lkIHNldFBhcmVudFR5cGUoWG1sVHlwZSBwYXJlbnRUeXBlKTsKLQotICAgIHB1YmxpYyBMaXN0IGdldEF0dHJpYnV0ZXMoKTsKLQotICAgIHB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZXMoTGlzdCBhdHRyaWJ1dGVzKTsKLSAgICAKLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvbWV0YWRhdGEveG1sL2ltcGwvWG1sQXR0cmlidXRlSW1wbC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9tZXRhZGF0YS94bWwvaW1wbC9YbWxBdHRyaWJ1dGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmMmYzNzYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9tZXRhZGF0YS94bWwvaW1wbC9YbWxBdHRyaWJ1dGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS54bWwuaW1wbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmV4Y2VwdGlvbi5TY2hlbWFHZW5lcmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLm1ldGFkYXRhLnhtbC5YbWxBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEueG1sLlhtbFR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkudXRpbC5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLXB1YmxpYyBjbGFzcyBYbWxBdHRyaWJ1dGVJbXBsIGltcGxlbWVudHMgWG1sQXR0cmlidXRlIHsKLSAgICAvKioKLSAgICAgKiBuYW1lc3BhY2UgZm9yIHRoaXMgYXR0cmlidXRlIGlmIGl0IGlzIGFuIHRvcCBsZXZlbCBhdHRyaWJ1dGUKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBuYW1lc3BhY2U7Ci0KLSAgICAvKioKLSAgICAgKiBuYW1lIG9mIHRoaXMgYXR0cmlidXRlCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQotICAgIC8qKgotICAgICAqIGlzIHRoaXMgYXR0cmlidXRlIG5pbGxhYmxlCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzUmVxdWlyZWQ7Ci0KLSAgICAvKioKLSAgICAgKiB4bWxUeXBlIG9mIHRoaXMgYXR0cmlidXRlCi0gICAgICovCi0gICAgcHJpdmF0ZSBYbWxUeXBlIHR5cGU7Ci0KLSAgICAvKioKLSAgICAgKiBzY2hlbWEgYXR0cmlidXRlIGZvciB0aGlzIGF0dHJpYnV0ZQotICAgICAqLwotICAgIHByaXZhdGUgRWxlbWVudCBhdHRyaWJ1dGU7Ci0KLSAgICBwdWJsaWMgWG1sQXR0cmlidXRlSW1wbChib29sZWFuIGlzUHJpbWl0aXZlKSB7Ci0gICAgICAgIC8vIHNldCB0aGUgbmlsbGFibGUgdmFsdWUgdG8gdHJ1ZQotICAgICAgICB0aGlzLmlzUmVxdWlyZWQgPSBpc1ByaW1pdGl2ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBnZW5lcmF0ZVdTRExTY2hlbWEoRG9jdW1lbnQgZG9jdW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcCBuYW1lc3BhY2VzVG9QcmVmaXhNYXApCi0gICAgICAgICAgICB0aHJvd3MgU2NoZW1hR2VuZXJhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyB4c2RQcmVmaXggPSAoU3RyaW5nKSBuYW1lc3BhY2VzVG9QcmVmaXhNYXAuZ2V0KENvbnN0YW50cy5VUklfMjAwMV9TQ0hFTUFfWFNEKTsKLSAgICAgICAgdGhpcy5hdHRyaWJ1dGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoQ29uc3RhbnRzLlVSSV8yMDAxX1NDSEVNQV9YU0QsICJhdHRyaWJ1dGUiKTsKLSAgICAgICAgdGhpcy5hdHRyaWJ1dGUuc2V0UHJlZml4KHhzZFByZWZpeCk7Ci0gICAgICAgIHRoaXMuYXR0cmlidXRlLnNldEF0dHJpYnV0ZSgibmFtZSIsIHRoaXMubmFtZSk7Ci0KLQotICAgICAgICBpZiAodGhpcy5pc1JlcXVpcmVkKSB7Ci0gICAgICAgICAgICB0aGlzLmF0dHJpYnV0ZS5zZXRBdHRyaWJ1dGUoInVzZSIsICJyZXF1aXJlZCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHRoaXMudHlwZSAhPSBudWxsKXsKLSAgICAgICAgICAgIGlmICh0eXBlLmlzU2ltcGxlVHlwZSgpKXsKLSAgICAgICAgICAgICAgICB0aGlzLmF0dHJpYnV0ZS5zZXRBdHRyaWJ1dGUoInR5cGUiLCB4c2RQcmVmaXggKyAiOiIgKyB0eXBlLmdldFFuYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hR2VuZXJhdGlvbkV4Y2VwdGlvbigiQXR0cmlidXRlIHR5cGUgbXVzdCBiZSBhIHNpbXBsZSB0eXBlIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hR2VuZXJhdGlvbkV4Y2VwdGlvbigiVHlwZSBjYW4gbm90IGJlIG51bGwgZm9yIGFuIGF0dHJpYnV0ZSIpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZSgpIHsKLSAgICAgICAgcmV0dXJuIG5hbWVzcGFjZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lc3BhY2UoU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICB0aGlzLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1JlcXVpcmVkKCkgewotICAgICAgICByZXR1cm4gaXNSZXF1aXJlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRSZXF1aXJlZChib29sZWFuIHJlcXVpcmVkKSB7Ci0gICAgICAgIGlzUmVxdWlyZWQgPSByZXF1aXJlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgWG1sVHlwZSBnZXRUeXBlKCkgewotICAgICAgICByZXR1cm4gdHlwZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRUeXBlKFhtbFR5cGUgdHlwZSkgewotICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBFbGVtZW50IGdldEF0dHJpYnV0ZSgpIHsKLSAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoRWxlbWVudCBhdHRyaWJ1dGUpIHsKLSAgICAgICAgdGhpcy5hdHRyaWJ1dGUgPSBhdHRyaWJ1dGU7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL21ldGFkYXRhL3htbC9pbXBsL1htbEVsZW1lbnRJbXBsLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL21ldGFkYXRhL3htbC9pbXBsL1htbEVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmZmJlNWEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9tZXRhZGF0YS94bWwvaW1wbC9YbWxFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEueG1sLmltcGw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5leGNlcHRpb24uU2NoZW1hR2VuZXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS54bWwuWG1sRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS54bWwuWG1sVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS51dGlsLkNvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotCi1wdWJsaWMgY2xhc3MgWG1sRWxlbWVudEltcGwgaW1wbGVtZW50cyBYbWxFbGVtZW50IHsKLSAgICAvKioKLSAgICAgKiBuYW1lc3BhY2UgZm9yIHRoaXMgZWxlbWVudCBpZiBpdCBpcyBhbiB0b3AgbGV2ZWwgZWxlbWVudAotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIG5hbWVzcGFjZTsKLQotICAgIC8qKgotICAgICAqIG5hbWUgb2YgdGhpcyBlbGVtZW50Ci0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQotICAgIC8qKgotICAgICAqIGlzIHRoaXMgZWxlbWVudCBuaWxsYWJsZQotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBpc05pbGxhYmxlOwotCi0gICAgLyoqCi0gICAgICogaXMgbWluT2NjdXJlcyB6ZXJvIGZvciB0aGlzIGVsZW1lbnQKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNNaW5PY2N1cnMwOwotCi0gICAgLyoqCi0gICAgICogaXMgQXJyYXkKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNBcnJheTsKLQotICAgIC8qKgotICAgICAqIGlmIHRoaXMgaXMgYW4gc2NoZW1hIHRvcCBsZXZlbCBlbGVtZW50Ci0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzVG9wRWxlbWVudDsKLQotICAgIC8qKgotICAgICAqIHhtbFR5cGUgb2YgdGhpcyBlbGVtZW50Ci0gICAgICovCi0gICAgcHJpdmF0ZSBYbWxUeXBlIHR5cGU7Ci0KLSAgICAvKioKLSAgICAgKiBzY2hlbWEgZWxlbWVudCBmb3IgdGhpcyBlbGVtZW50Ci0gICAgICovCi0gICAgcHJpdmF0ZSBFbGVtZW50IGVsZW1lbnQ7Ci0KLSAgICBwdWJsaWMgWG1sRWxlbWVudEltcGwoYm9vbGVhbiBpc1ByaW1pdGl2ZVR5cGUpIHsKLSAgICAgICAgLy8gc2V0IHRoZSBuaWxsYWJsZSB2YWx1ZSB0byB0cnVlCi0gICAgICAgIHRoaXMuaXNOaWxsYWJsZSA9ICFpc1ByaW1pdGl2ZVR5cGU7Ci0gICAgICAgIHRoaXMuaXNNaW5PY2N1cnMwID0gIWlzUHJpbWl0aXZlVHlwZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBnZW5lcmF0ZVdTRExTY2hlbWEoRG9jdW1lbnQgZG9jdW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcCBuYW1lc3BhY2VzVG9QcmVmaXhNYXApCi0gICAgICAgICAgICB0aHJvd3MgU2NoZW1hR2VuZXJhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyB4c2RQcmVmaXggPSAoU3RyaW5nKSBuYW1lc3BhY2VzVG9QcmVmaXhNYXAuZ2V0KENvbnN0YW50cy5VUklfMjAwMV9TQ0hFTUFfWFNEKTsKLSAgICAgICAgdGhpcy5lbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKENvbnN0YW50cy5VUklfMjAwMV9TQ0hFTUFfWFNELCAiZWxlbWVudCIpOwotICAgICAgICB0aGlzLmVsZW1lbnQuc2V0UHJlZml4KHhzZFByZWZpeCk7Ci0gICAgICAgIHRoaXMuZWxlbWVudC5zZXRBdHRyaWJ1dGUoIm5hbWUiLCB0aGlzLm5hbWUpOwotCi0KLSAgICAgICAgaWYgKHRoaXMuaXNBcnJheSAmJiAhdGhpcy5pc1RvcEVsZW1lbnQpIHsKLSAgICAgICAgICAgIHRoaXMuZWxlbWVudC5zZXRBdHRyaWJ1dGUoIm1heE9jY3VycyIsICJ1bmJvdW5kZWQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh0aGlzLm5hbWVzcGFjZSA9PSBudWxsKXsKLSAgICAgICAgICAgIHRoaXMuZWxlbWVudC5zZXRBdHRyaWJ1dGUoImZvcm0iLCAidW5xdWFsaWZpZWQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHNldHRpbmcgdGhlIHR5cGUKLSAgICAgICAgaWYgKHR5cGUgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gaS5lIHRoaXMgaXMgY29ycmVzcG9uZHMgdG8gYW4gdm9pZCB0eXBlIHNvIGdlbmVyYXRlIGEgZW1wdHkgYW5ub255IG1vdXMgY29tcGxleCB0eXBlCi0gICAgICAgICAgICBFbGVtZW50IGNvbXBsZXhFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKENvbnN0YW50cy5VUklfMjAwMV9TQ0hFTUFfWFNELCAiY29tcGxleFR5cGUiKTsKLSAgICAgICAgICAgIGNvbXBsZXhFbGVtZW50LnNldFByZWZpeCh4c2RQcmVmaXgpOwotCi0gICAgICAgICAgICBFbGVtZW50IHNlcXVlbmNlRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhDb25zdGFudHMuVVJJXzIwMDFfU0NIRU1BX1hTRCwgInNlcXVlbmNlIik7Ci0gICAgICAgICAgICBzZXF1ZW5jZUVsZW1lbnQuc2V0UHJlZml4KHhzZFByZWZpeCk7Ci0gICAgICAgICAgICBjb21wbGV4RWxlbWVudC5hcHBlbmRDaGlsZChzZXF1ZW5jZUVsZW1lbnQpOwotICAgICAgICAgICAgdGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKGNvbXBsZXhFbGVtZW50KTsKLSAgICAgICAgfSBlbHNlIGlmICh0eXBlLmlzU2ltcGxlVHlwZSgpKSB7Ci0gICAgICAgICAgICAvLyB0aGlzIGlzIGFuIHNpbXBsZSB0eXBlIGVsZW1lbnQKLSAgICAgICAgICAgIHRoaXMuZWxlbWVudC5zZXRBdHRyaWJ1dGUoInR5cGUiLCB4c2RQcmVmaXggKyAiOiIgKyB0eXBlLmdldFFuYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgaWYgKHRoaXMuaXNOaWxsYWJsZSkgewotICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5zZXRBdHRyaWJ1dGUoIm5pbGxhYmxlIiwgInRydWUiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh0aGlzLmlzTWluT2NjdXJzMCAmJiAhdGhpcy5pc1RvcEVsZW1lbnQpewotICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5zZXRBdHRyaWJ1dGUoIm1pbk9jY3VycyIsIjAiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmICghdHlwZS5pc0Fub255bW91cygpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gKFN0cmluZykgbmFtZXNwYWNlc1RvUHJlZml4TWFwLmdldCh0eXBlLmdldFFuYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgICAgICAgICAgdGhpcy5lbGVtZW50LnNldEF0dHJpYnV0ZSgidHlwZSIsIHByZWZpeCArICI6IiArIHR5cGUuZ2V0UW5hbWUoKS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICBpZiAodGhpcy5pc05pbGxhYmxlKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50LnNldEF0dHJpYnV0ZSgibmlsbGFibGUiLCAidHJ1ZSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHRoaXMuaXNNaW5PY2N1cnMwICYmICF0aGlzLmlzVG9wRWxlbWVudCl7Ci0gICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50LnNldEF0dHJpYnV0ZSgibWluT2NjdXJzIiwiMCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gaS5lIHRoaXMgaXMgYW5kIGFubm9ueW1vdXMgY29tcGxleCB0eXBlCi0gICAgICAgICAgICB0eXBlLmdlbmVyYXRlV1NETFNjaGVtYShkb2N1bWVudCwgbmFtZXNwYWNlc1RvUHJlZml4TWFwKTsKLSAgICAgICAgICAgIHRoaXMuZWxlbWVudC5hcHBlbmRDaGlsZCh0eXBlLmdldFR5cGVFbGVtZW50KCkpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZSgpIHsKLSAgICAgICAgcmV0dXJuIG5hbWVzcGFjZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lc3BhY2UoU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICB0aGlzLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc05pbGxhYmxlKCkgewotICAgICAgICByZXR1cm4gaXNOaWxsYWJsZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXROaWxsYWJsZShib29sZWFuIG5pbGxhYmxlKSB7Ci0gICAgICAgIGlzTmlsbGFibGUgPSBuaWxsYWJsZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0FycmF5KCkgewotICAgICAgICByZXR1cm4gaXNBcnJheTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRBcnJheShib29sZWFuIGFycmF5KSB7Ci0gICAgICAgIGlzQXJyYXkgPSBhcnJheTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1RvcEVsZW1lbnQoKSB7Ci0gICAgICAgIHJldHVybiBpc1RvcEVsZW1lbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VG9wRWxlbWVudChib29sZWFuIHRvcEVsZW1lbnQpIHsKLSAgICAgICAgaXNUb3BFbGVtZW50ID0gdG9wRWxlbWVudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgWG1sVHlwZSBnZXRUeXBlKCkgewotICAgICAgICByZXR1cm4gdHlwZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRUeXBlKFhtbFR5cGUgdHlwZSkgewotICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBFbGVtZW50IGdldEVsZW1lbnQoKSB7Ci0gICAgICAgIHJldHVybiBlbGVtZW50OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEVsZW1lbnQoRWxlbWVudCBlbGVtZW50KSB7Ci0gICAgICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNNaW5PY2N1cnMwKCkgewotICAgICAgICByZXR1cm4gaXNNaW5PY2N1cnMwOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE1pbk9jY3VyczAoYm9vbGVhbiBtaW5PY2N1cnMwKSB7Ci0gICAgICAgIGlzTWluT2NjdXJzMCA9IG1pbk9jY3VyczA7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9tZXRhZGF0YS94bWwvaW1wbC9YbWxUeXBlSW1wbC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9tZXRhZGF0YS94bWwvaW1wbC9YbWxUeXBlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzAzODJmLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvbWV0YWRhdGEveG1sL2ltcGwvWG1sVHlwZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLm1ldGFkYXRhLnhtbC5pbXBsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZXhjZXB0aW9uLlNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEueG1sLlhtbEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS54bWwuWG1sRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS54bWwuWG1sVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS51dGlsLkNvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0KLXB1YmxpYyBjbGFzcyBYbWxUeXBlSW1wbCBpbXBsZW1lbnRzIFhtbFR5cGUgewotICAgIC8qKgotICAgICAqIFF1YWxpZmllZCBuYW1lIG9mIHRoZSB4bWxUeXBlCi0gICAgICovCi0gICAgcHJpdmF0ZSBRTmFtZSBxbmFtZTsKLQotICAgIC8qKgotICAgICAqIGlzIHRoaXMgYW4gYW5Bbm9ueW1vdXMgdHlwZSB0aGlzIGNhc2UgcW5hbWUgY2FuIGJlIG51bGwKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNBbm9ueW1vdXM7Ci0KLSAgICAvKioKLSAgICAgKiBpcyB0aGlzIGlzIGEgYmFzaWMgdHlwZQotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBpc1NpbXBsZVR5cGU7Ci0KLSAgICAvKioKLSAgICAgKiBsaXN0IG9mIGNoaWxkIGVsZW1lbnRzCi0gICAgICovCi0gICAgcHJpdmF0ZSBMaXN0IGVsZW1lbnRzOwotCi0gICAgLyoqCi0gICAgICogbGlzdCBvZiBjaGlsZCBhdHRyaWJ1dGVzCi0gICAgICovCi0gICAgcHJpdmF0ZSBMaXN0IGF0dHJpYnV0ZXM7Ci0KLSAgICAvKioKLSAgICAgKiBjb21wbGV4IHR5cGUgZWxlbWVudCBmb3IgdGhpcyBYbWxUeXBlCi0gICAgICovCi0gICAgcHJpdmF0ZSBFbGVtZW50IHR5cGVFbGVtZW50OwotCi0gICAgLyoqCi0gICAgICogcGFyZW50IHR5cGUgZm9yIHRoaXMgeG1sIHR5cGUgaWYgaXQgaXMgYW4gZXh0ZW5zaW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSBYbWxUeXBlIHBhcmVudFR5cGU7Ci0KLSAgICBwdWJsaWMgWG1sVHlwZUltcGwoKSB7Ci0gICAgICAgIHRoaXMuZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIHRoaXMuYXR0cmlidXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRFbGVtZW50KFhtbEVsZW1lbnQgeG1sRWxlbWVudCkgewotICAgICAgICB0aGlzLmVsZW1lbnRzLmFkZCh4bWxFbGVtZW50KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRBdHRyaWJ1dGUoWG1sQXR0cmlidXRlIHhtbEF0dHJpYnV0ZSkgewotICAgICAgICB0aGlzLmF0dHJpYnV0ZXMuYWRkKHhtbEF0dHJpYnV0ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogdGhpcyBnZW5lcmF0ZXMgdGhlIGNvbXBsZXggdHlwZSBvbmx5IGlmIGl0IGlzIGFubm9ueW1vdXMgYW5kCi0gICAgICogaXMgbm90IGEgc2ltcGxlIHR5cGUKLSAgICAgKgotICAgICAqIEBwYXJhbSBkb2N1bWVudAotICAgICAqIEBwYXJhbSBuYW1lc3BhY2VzVG9QcmVmaXhNYXAKLSAgICAgKiBAdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIucm1pLmV4Y2VwdGlvbi5TY2hlbWFHZW5lcmF0aW9uRXhjZXB0aW9uCi0gICAgICoKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBnZW5lcmF0ZVdTRExTY2hlbWEoRG9jdW1lbnQgZG9jdW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcCBuYW1lc3BhY2VzVG9QcmVmaXhNYXApCi0gICAgICAgICAgICB0aHJvd3MgU2NoZW1hR2VuZXJhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIGhlcmUgd2UgaGF2ZSB0byBnZW5lcmF0ZSB0aGUgY29tcGxleCB0eXBlIGVsZW1lbnQgZm9yIHRoaXMgeG1sVHlwZQotICAgICAgICBpZiAoIXRoaXMuaXNTaW1wbGVUeXBlKSB7Ci0gICAgICAgICAgICBTdHJpbmcgeHNkUHJlZml4ID0gKFN0cmluZykgbmFtZXNwYWNlc1RvUHJlZml4TWFwLmdldChDb25zdGFudHMuVVJJXzIwMDFfU0NIRU1BX1hTRCk7Ci0gICAgICAgICAgICB0aGlzLnR5cGVFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKENvbnN0YW50cy5VUklfMjAwMV9TQ0hFTUFfWFNELCAiY29tcGxleFR5cGUiKTsKLSAgICAgICAgICAgIHRoaXMudHlwZUVsZW1lbnQuc2V0UHJlZml4KHhzZFByZWZpeCk7Ci0gICAgICAgICAgICBpZiAoIXRoaXMuaXNBbm9ueW1vdXMpIHsKLSAgICAgICAgICAgICAgICB0aGlzLnR5cGVFbGVtZW50LnNldEF0dHJpYnV0ZSgibmFtZSIsIHRoaXMucW5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBFbGVtZW50IHNlcXVlbmNlRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhDb25zdGFudHMuVVJJXzIwMDFfU0NIRU1BX1hTRCwgInNlcXVlbmNlIik7Ci0gICAgICAgICAgICBzZXF1ZW5jZUVsZW1lbnQuc2V0UHJlZml4KHhzZFByZWZpeCk7Ci0KLSAgICAgICAgICAgIC8vIHNldCB0aGUgZXh0ZW5zaW9uIGRldGFpbHMgaWYgdGhlcmUgYXJlCi0gICAgICAgICAgICBpZiAodGhpcy5wYXJlbnRUeXBlICE9IG51bGwpIHsKLQotICAgICAgICAgICAgICAgIC8vIGkuZSB0aGlzIGlzIGFuIGV4dGVuc2lvbiB0eXBlCi0gICAgICAgICAgICAgICAgRWxlbWVudCBjb21wbGV4Q29udGVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhDb25zdGFudHMuVVJJXzIwMDFfU0NIRU1BX1hTRCwgImNvbXBsZXhDb250ZW50Iik7Ci0gICAgICAgICAgICAgICAgY29tcGxleENvbnRlbnQuc2V0UHJlZml4KHhzZFByZWZpeCk7Ci0gICAgICAgICAgICAgICAgdGhpcy50eXBlRWxlbWVudC5hcHBlbmRDaGlsZChjb21wbGV4Q29udGVudCk7Ci0KLSAgICAgICAgICAgICAgICBFbGVtZW50IGV4dGVuc2lvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhDb25zdGFudHMuVVJJXzIwMDFfU0NIRU1BX1hTRCwgImV4dGVuc2lvbiIpOwotICAgICAgICAgICAgICAgIGV4dGVuc2lvbi5zZXRQcmVmaXgoeHNkUHJlZml4KTsKLSAgICAgICAgICAgICAgICBjb21wbGV4Q29udGVudC5hcHBlbmRDaGlsZChleHRlbnNpb24pOwotCi0gICAgICAgICAgICAgICAgU3RyaW5nIGV4dGVuc2lvblByZWZpeCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoU3RyaW5nKSBuYW1lc3BhY2VzVG9QcmVmaXhNYXAuZ2V0KHRoaXMucGFyZW50VHlwZS5nZXRRbmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbG9jYWxQYXJ0ID0gdGhpcy5wYXJlbnRUeXBlLmdldFFuYW1lKCkuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKChleHRlbnNpb25QcmVmaXggPT0gbnVsbCkgfHwgZXh0ZW5zaW9uUHJlZml4LmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uLnNldEF0dHJpYnV0ZSgiYmFzZSIsIGxvY2FsUGFydCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uLnNldEF0dHJpYnV0ZSgiYmFzZSIsIGV4dGVuc2lvblByZWZpeCArICI6IiArIGxvY2FsUGFydCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGV4dGVuc2lvbi5hcHBlbmRDaGlsZChzZXF1ZW5jZUVsZW1lbnQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aGlzLnR5cGVFbGVtZW50LmFwcGVuZENoaWxkKHNlcXVlbmNlRWxlbWVudCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGFkZCB0aGUgb3RoZXIgZWxlbWVudCBjaGlsZHJlbgotICAgICAgICAgICAgWG1sRWxlbWVudCB4bWxFbGVtZW50OwotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gdGhpcy5lbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICB4bWxFbGVtZW50ID0gKFhtbEVsZW1lbnQpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgIHhtbEVsZW1lbnQuZ2VuZXJhdGVXU0RMU2NoZW1hKGRvY3VtZW50LCBuYW1lc3BhY2VzVG9QcmVmaXhNYXApOwotICAgICAgICAgICAgICAgIHNlcXVlbmNlRWxlbWVudC5hcHBlbmRDaGlsZCh4bWxFbGVtZW50LmdldEVsZW1lbnQoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGFkZCB0aGUgYXR0cmlidXRlcwotICAgICAgICAgICAgWG1sQXR0cmlidXRlIHhtbEF0dHJpYnV0ZTsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHRoaXMuYXR0cmlidXRlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICB4bWxBdHRyaWJ1dGUgPSAoWG1sQXR0cmlidXRlKSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICB4bWxBdHRyaWJ1dGUuZ2VuZXJhdGVXU0RMU2NoZW1hKGRvY3VtZW50LCBuYW1lc3BhY2VzVG9QcmVmaXhNYXApOwotICAgICAgICAgICAgICAgIHRoaXMudHlwZUVsZW1lbnQuYXBwZW5kQ2hpbGQoeG1sQXR0cmlidXRlLmdldEF0dHJpYnV0ZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBYbWxUeXBlSW1wbChRTmFtZSBxbmFtZSkgewotICAgICAgICB0aGlzKCk7Ci0gICAgICAgIHRoaXMucW5hbWUgPSBxbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUU5hbWUgZ2V0UW5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBxbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRRbmFtZShRTmFtZSBxbmFtZSkgewotICAgICAgICB0aGlzLnFuYW1lID0gcW5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNBbm9ueW1vdXMoKSB7Ci0gICAgICAgIHJldHVybiBpc0Fub255bW91czsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRBbm9ueW1vdXMoYm9vbGVhbiBhbm9ueW1vdXMpIHsKLSAgICAgICAgaXNBbm9ueW1vdXMgPSBhbm9ueW1vdXM7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNTaW1wbGVUeXBlKCkgewotICAgICAgICByZXR1cm4gaXNTaW1wbGVUeXBlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFNpbXBsZVR5cGUoYm9vbGVhbiBzaW1wbGVUeXBlKSB7Ci0gICAgICAgIGlzU2ltcGxlVHlwZSA9IHNpbXBsZVR5cGU7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3QgZ2V0RWxlbWVudHMoKSB7Ci0gICAgICAgIHJldHVybiBlbGVtZW50czsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRFbGVtZW50cyhMaXN0IGVsZW1lbnRzKSB7Ci0gICAgICAgIHRoaXMuZWxlbWVudHMgPSBlbGVtZW50czsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRWxlbWVudCBnZXRUeXBlRWxlbWVudCgpIHsKLSAgICAgICAgcmV0dXJuIHR5cGVFbGVtZW50OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFR5cGVFbGVtZW50KEVsZW1lbnQgdHlwZUVsZW1lbnQpIHsKLSAgICAgICAgdGhpcy50eXBlRWxlbWVudCA9IHR5cGVFbGVtZW50OwotICAgIH0KLQotICAgIHB1YmxpYyBYbWxUeXBlIGdldFBhcmVudFR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBwYXJlbnRUeXBlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBhcmVudFR5cGUoWG1sVHlwZSBwYXJlbnRUeXBlKSB7Ci0gICAgICAgIHRoaXMucGFyZW50VHlwZSA9IHBhcmVudFR5cGU7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3QgZ2V0QXR0cmlidXRlcygpIHsKLSAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZXM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QXR0cmlidXRlcyhMaXN0IGF0dHJpYnV0ZXMpIHsKLSAgICAgICAgdGhpcy5hdHRyaWJ1dGVzID0gYXR0cmlidXRlczsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL3JlY2VpdmVyL1JNSU1lc3NhZ2VSZWNpZXZlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9yZWNlaXZlci9STUlNZXNzYWdlUmVjaWV2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY4ZDY4NC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL3JlY2VpdmVyL1JNSU1lc3NhZ2VSZWNpZXZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5ybWkucmVjZWl2ZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5PTVNvdXJjZWRFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLkFic3RyYWN0SW5PdXRNZXNzYWdlUmVjZWl2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZGF0YWJpbmQuSmF2YU9iamVjdFNlcmlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZGF0YWJpbmQuUk1JRGF0YVNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5kYXRhYmluZC5YbWxTdHJlYW1QYXJzZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZXhjZXB0aW9uLlhtbFBhcnNpbmdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZXhjZXB0aW9uLlhtbFNlcmlhbGl6aW5nRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLm1ldGFkYXRhLk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS5QYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEuU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS54bWwuWG1sRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS51dGlsLk5hbWVzcGFjZVByZWZpeDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci0KLQotcHVibGljIGNsYXNzIFJNSU1lc3NhZ2VSZWNpZXZlciBleHRlbmRzIEFic3RyYWN0SW5PdXRNZXNzYWdlUmVjZWl2ZXIgewotCi0gICAgLy8gdGhpcyBjb250YWlucyBhbGwgdGhlIGRhdGEgcmVnYXJkaW5nIHRoZSBzZXJ2aWNlLgotICAgIHByaXZhdGUgU2VydmljZSBzZXJ2aWNlOwotICAgIHByaXZhdGUgSmF2YU9iamVjdFNlcmlhbGl6ZXIgamF2YU9iamVjdFNlcmlhbGl6ZXI7Ci0gICAgcHJpdmF0ZSBYbWxTdHJlYW1QYXJzZXIgeG1sU3RyZWFtUGFyc2VyOwotCi0gICAgcHVibGljIFJNSU1lc3NhZ2VSZWNpZXZlcihTZXJ2aWNlIHNlcnZpY2UpIHsKLSAgICAgICAgdGhpcy5zZXJ2aWNlID0gc2VydmljZTsKLSAgICAgICAgdGhpcy5qYXZhT2JqZWN0U2VyaWFsaXplciA9IG5ldyBKYXZhT2JqZWN0U2VyaWFsaXplcigKLSAgICAgICAgICAgICAgICBzZXJ2aWNlLmdldFByb2Nlc3NlZFR5cGVNYXAoKSwKLSAgICAgICAgICAgICAgICBzZXJ2aWNlLmdldENvbmZpZ3VyYXRvcigpLAotICAgICAgICAgICAgICAgIHNlcnZpY2UuZ2V0U2NoZW1hTWFwKCkpOwotICAgICAgICB0aGlzLnhtbFN0cmVhbVBhcnNlciA9IG5ldyBYbWxTdHJlYW1QYXJzZXIoCi0gICAgICAgICAgICAgICAgc2VydmljZS5nZXRQcm9jZXNzZWRUeXBlTWFwKCksCi0gICAgICAgICAgICAgICAgc2VydmljZS5nZXRDb25maWd1cmF0b3IoKSwKLSAgICAgICAgICAgICAgICBzZXJ2aWNlLmdldFNjaGVtYU1hcCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbnZva2VCdXNpbmVzc0xvZ2ljKE1lc3NhZ2VDb250ZXh0IGlucHV0TWVzc2FnZUNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlQ29udGV4dCBvdXRwdXRNZXNzYWdlQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0KLSAgICAgICAgU3RyaW5nIG9wZXJhdGlvbk5hbWUgPSBpbnB1dE1lc3NhZ2VDb250ZXh0LmdldE9wZXJhdGlvbkNvbnRleHQoKS5nZXRBeGlzT3BlcmF0aW9uKCkuZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpOwotICAgICAgICBPcGVyYXRpb24gb3BlcmF0aW9uID0gc2VydmljZS5nZXRPcGVyYXRpb24ob3BlcmF0aW9uTmFtZSk7Ci0gICAgICAgIFhNTFN0cmVhbVJlYWRlciByZWFkZXIgPSBpbnB1dE1lc3NhZ2VDb250ZXh0LmdldEVudmVsb3BlKCkuZ2V0Qm9keSgpLmdldEZpcnN0RWxlbWVudCgpLmdldFhNTFN0cmVhbVJlYWRlcldpdGhvdXRDYWNoaW5nKCk7Ci0gICAgICAgIFNPQVBGYWN0b3J5IHNvYXBGYWN0b3J5ID0gZ2V0U09BUEZhY3RvcnkoaW5wdXRNZXNzYWdlQ29udGV4dCk7Ci0gICAgICAgIGlmIChvcGVyYXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gaW52b2tlIHRoZSBtZXRob2QKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IHNlcnZpY2VPYmplY3QgPSBzZXJ2aWNlLmdldEphdmFDbGFzcygpLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICAgICAgTWV0aG9kIGphdmFPcGVyYXRpb24gPSBvcGVyYXRpb24uZ2V0SmF2YU1ldGhvZCgpOwotICAgICAgICAgICAgICAgIE9iamVjdCByZXR1cm5PYmplY3QgPSBqYXZhT3BlcmF0aW9uLmludm9rZShzZXJ2aWNlT2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy54bWxTdHJlYW1QYXJzZXIuZ2V0SW5wdXRQYXJhbWV0ZXJzKHJlYWRlciwgb3BlcmF0aW9uKSk7Ci0gICAgICAgICAgICAgICAgT01FbGVtZW50IHJldHVybk9NRWxlbWVudCA9IGdldE91dHB1dE9NRWxlbWVudChyZXR1cm5PYmplY3QsIG9wZXJhdGlvbiwgdGhpcy5qYXZhT2JqZWN0U2VyaWFsaXplciwgc29hcEZhY3RvcnkpOwotICAgICAgICAgICAgICAgIFNPQVBFbnZlbG9wZSBzb2FwRW52ZWxvcGUgPSBzb2FwRmFjdG9yeS5nZXREZWZhdWx0RW52ZWxvcGUoKTsKLSAgICAgICAgICAgICAgICBzb2FwRW52ZWxvcGUuZ2V0Qm9keSgpLmFkZENoaWxkKHJldHVybk9NRWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgb3V0cHV0TWVzc2FnZUNvbnRleHQuc2V0RW52ZWxvcGUoc29hcEVudmVsb3BlKTsKLSAgICAgICAgICAgICAgICAvLyBzZXQgdGhlIG91dCBwdXQgZWxlbWVudCB0byBtZXNzYWdlIGNvbnRleHQKLQotICAgICAgICAgICAgfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IEF4aXNGYXVsdC5tYWtlRmF1bHQoZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBUaHJvd2FibGUgdGFyZ2V0RXhjZXB0aW9uID0gZS5nZXRUYXJnZXRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICBpZiAodGFyZ2V0RXhjZXB0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgUGFyYW1ldGVyIHBhcmFtZXRlciA9IHRoaXMuc2VydmljZS5nZXRFeGNlcHRpb25QYXJhbWV0ZXIodGFyZ2V0RXhjZXB0aW9uLmdldENsYXNzKCkpOwotICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1ldGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEF4aXNGYXVsdCBheGlzRmF1bHQgPSBuZXcgQXhpc0ZhdWx0KHRhcmdldEV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgYXhpc0ZhdWx0LnNldERldGFpbChnZXRQYXJhbWV0ZXJPTUVsZW1lbnQodGFyZ2V0RXhjZXB0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5qYXZhT2JqZWN0U2VyaWFsaXplciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvYXBGYWN0b3J5KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBheGlzRmF1bHQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdGhyb3cgQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFhtbFBhcnNpbmdFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IEF4aXNGYXVsdC5tYWtlRmF1bHQoZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IEF4aXNGYXVsdC5tYWtlRmF1bHQoZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoIkNhbiBub3QgZmluZCB0aGUgb3BlcmF0aW9uIik7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHB1YmxpYyBPTUVsZW1lbnQgZ2V0T3V0cHV0T01FbGVtZW50KGZpbmFsIE9iamVjdCByZXR1cm5PYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT3BlcmF0aW9uIG9wZXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBKYXZhT2JqZWN0U2VyaWFsaXplciBqYXZhT2JqZWN0U2VyaWFsaXplciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT0FQRmFjdG9yeSBzb2FwRmFjdG9yeSkgewotICAgICAgICBPTURhdGFTb3VyY2Ugb21EYXRhU291cmNlID0gbmV3IFJNSURhdGFTb3VyY2UoKSB7Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShNVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBqYXZhT2JqZWN0U2VyaWFsaXplci5zZXJpYWxpemVPdXRwdXRFbGVtZW50KHJldHVybk9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24uZ2V0T3V0UHV0RWxlbWVudCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbi5nZXRPdXRwdXRQYXJhbWV0ZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFhtbFNlcmlhbGl6aW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgbmV3IFhNTFN0cmVhbUV4Y2VwdGlvbigiUHJvYmxlbSBpbiBzZXJpYWxpemluZyB0aGUgcmV0dXJuIG9iamVjdCIsIGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgWG1sRWxlbWVudCBvdXRYbWxFbGVtZW50ID0gb3BlcmF0aW9uLmdldE91dFB1dEVsZW1lbnQoKTsKLSAgICAgICAgUU5hbWUgb3V0RWxlbWVudFFOYW1lID0gbmV3IFFOYW1lKG91dFhtbEVsZW1lbnQuZ2V0TmFtZXNwYWNlKCksIG91dFhtbEVsZW1lbnQuZ2V0TmFtZSgpKTsKLSAgICAgICAgcmV0dXJuIG5ldyBPTVNvdXJjZWRFbGVtZW50SW1wbChvdXRFbGVtZW50UU5hbWUsIHNvYXBGYWN0b3J5LCBvbURhdGFTb3VyY2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBPTUVsZW1lbnQgZ2V0UGFyYW1ldGVyT01FbGVtZW50KGZpbmFsIE9iamVjdCBleGNlcHRpb25PYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUGFyYW1ldGVyIHBhcmFtZXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBKYXZhT2JqZWN0U2VyaWFsaXplciBqYXZhT2JqZWN0U2VyaWFsaXplciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT0FQRmFjdG9yeSBzb2FwRmFjdG9yeSl7Ci0gICAgICAgIE9NRGF0YVNvdXJjZSBvbURhdGFTb3VyY2UgPSBuZXcgUk1JRGF0YVNvdXJjZSgpewotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgamF2YU9iamVjdFNlcmlhbGl6ZXIuc2VyaWFsaXplUGFyYW1ldGVyKGV4Y2VwdGlvbk9iamVjdCxwYXJhbWV0ZXIseG1sV3JpdGVyLCBuZXcgTmFtZXNwYWNlUHJlZml4KCkpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFhtbFNlcmlhbGl6aW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhNTFN0cmVhbUV4Y2VwdGlvbigicHJvYmxlbSBpbiBzZXJpYWxpemluZyB0aGUgZXhjZXB0aW9uIG9iamVjdCAiLGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgWG1sRWxlbWVudCBleGNlcHRpb25FbGVtZW50ID0gcGFyYW1ldGVyLmdldEVsZW1lbnQoKTsKLSAgICAgICAgUU5hbWUgb3V0RWxlbWVudFFOYW1lID0gbmV3IFFOYW1lKGV4Y2VwdGlvbkVsZW1lbnQuZ2V0TmFtZXNwYWNlKCksIGV4Y2VwdGlvbkVsZW1lbnQuZ2V0TmFtZSgpKTsKLSAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IG5ldyBPTVNvdXJjZWRFbGVtZW50SW1wbChvdXRFbGVtZW50UU5hbWUsIHNvYXBGYWN0b3J5LCBvbURhdGFTb3VyY2UpOwotICAgICAgICByZXR1cm4gb21FbGVtZW50OwotICAgIH0KLQotCi0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS90eXBlcy9Eb21UeXBlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL3R5cGVzL0RvbVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjkzMmIzOC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL3R5cGVzL0RvbVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5ybWkudHlwZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5Db25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZXhjZXB0aW9uLk1ldGFEYXRhUG9wdWxhdGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZXhjZXB0aW9uLlNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEuQWJzdHJhY3RUeXBlOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiB0aGlzIGNsYXNzIGlzIHVzZWQgYXMgdGhlIHR5cGUgZm9yIGRvbSBkb2N1bWVudHMKLSAqLwotcHVibGljIGNsYXNzIERvbVR5cGUgZXh0ZW5kcyBBYnN0cmFjdFR5cGUgewotICAgIHB1YmxpYyB2b2lkIHBvcHVsYXRlTWV0YURhdGEoQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcCBwcm9jZXNzZWRUeXBlTWFwKQotICAgICAgICAgICAgdGhyb3dzIE1ldGFEYXRhUG9wdWxhdGVFeGNlcHRpb24gewotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZ2VuZXJhdGVTY2hlbWEoQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXAgc2NoZW1hTWFwKQotICAgICAgICAgICAgdGhyb3dzIFNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb24gewotICAgICAgICAKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL3R5cGVzL01hcFR5cGUuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvdHlwZXMvTWFwVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZmE4NzhlLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvdHlwZXMvTWFwVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJtaS50eXBlczsKLQotLyoqCi0gKiB0aGlzIGNsYXNzIGlzIHVlc2QgdG8gcmVwcmVzZW50IGEgbWFwIHR5cGUgYXR0cmlidXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBNYXBUeXBlIHsKLQotICAgIHB1YmxpYyBPYmplY3Qga2V5OwotICAgIHB1YmxpYyBPYmplY3QgdmFsdWU7Ci0KLSAgICBwdWJsaWMgTWFwVHlwZSgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWFwVHlwZShPYmplY3Qga2V5LCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5rZXkgPSBrZXk7Ci0gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldEtleSgpIHsKLSAgICAgICAgcmV0dXJuIGtleTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRLZXkoT2JqZWN0IGtleSkgewotICAgICAgICB0aGlzLmtleSA9IGtleTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldFZhbHVlKCkgewotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWUoT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL3V0aWwvQ29uc3RhbnRzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL3V0aWwvQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmZjNiZDQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS91dGlsL0NvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJtaS51dGlsOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIENvbnN0YW50cyB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxOU19BVFRSSUJVVEVfTlNfVVJJID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDAveG1sbnMvIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVSSV8yMDAxX1NDSEVNQV9YU0QgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVSSV8yMDAxX1NDSEVNQV9YU0kgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJJX0RFRkFVTFRfU0NIRU1BX1hTRCA9IENvbnN0YW50cy5VUklfMjAwMV9TQ0hFTUFfWFNEOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVSSV9ERUZBVUxUX1NDSEVNQV9YU0kgPSBDb25zdGFudHMuVVJJXzIwMDFfU0NIRU1BX1hTSTsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgWFNEX1NUUklORyA9IG5ldyBRTmFtZShVUklfREVGQVVMVF9TQ0hFTUFfWFNELCAic3RyaW5nIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBYU0RfQk9PTEVBTiA9IG5ldyBRTmFtZShVUklfREVGQVVMVF9TQ0hFTUFfWFNELCAiYm9vbGVhbiIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgWFNEX0RPVUJMRSA9IG5ldyBRTmFtZShVUklfREVGQVVMVF9TQ0hFTUFfWFNELCAiZG91YmxlIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBYU0RfRkxPQVQgPSBuZXcgUU5hbWUoVVJJX0RFRkFVTFRfU0NIRU1BX1hTRCwgImZsb2F0Iik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBYU0RfSU5UID0gbmV3IFFOYW1lKFVSSV9ERUZBVUxUX1NDSEVNQV9YU0QsICJpbnQiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9JTlRFR0VSID0gbmV3IFFOYW1lKFVSSV9ERUZBVUxUX1NDSEVNQV9YU0QsICJpbnRlZ2VyIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBYU0RfTE9ORyA9IG5ldyBRTmFtZShVUklfREVGQVVMVF9TQ0hFTUFfWFNELCAibG9uZyIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgWFNEX1NIT1JUID0gbmV3IFFOYW1lKFVSSV9ERUZBVUxUX1NDSEVNQV9YU0QsICJzaG9ydCIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgWFNEX0JZVEUgPSBuZXcgUU5hbWUoVVJJX0RFRkFVTFRfU0NIRU1BX1hTRCwgImJ5dGUiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9ERUNJTUFMID0gbmV3IFFOYW1lKFVSSV9ERUZBVUxUX1NDSEVNQV9YU0QsICJkZWNpbWFsIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBYU0RfQkFTRTY0ID0gbmV3IFFOYW1lKFVSSV9ERUZBVUxUX1NDSEVNQV9YU0QsICJiYXNlNjRCaW5hcnkiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9IRVhCSU4gPSBuZXcgUU5hbWUoVVJJX0RFRkFVTFRfU0NIRU1BX1hTRCwgImhleEJpbmFyeSIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgWFNEX0FOWVNJTVBMRVRZUEUgPSBuZXcgUU5hbWUoVVJJX0RFRkFVTFRfU0NIRU1BX1hTRCwgImFueVNpbXBsZVR5cGUiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9BTllUWVBFID0gbmV3IFFOYW1lKFVSSV9ERUZBVUxUX1NDSEVNQV9YU0QsICJhbnlUeXBlIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBYU0RfQU5ZID0gbmV3IFFOYW1lKFVSSV9ERUZBVUxUX1NDSEVNQV9YU0QsICJhbnkiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9RTkFNRSA9IG5ldyBRTmFtZShVUklfREVGQVVMVF9TQ0hFTUFfWFNELCAiUU5hbWUiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9EQVRFVElNRSA9IG5ldyBRTmFtZShVUklfREVGQVVMVF9TQ0hFTUFfWFNELCAiZGF0ZVRpbWUiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9EQVRFID0gbmV3IFFOYW1lKFVSSV9ERUZBVUxUX1NDSEVNQV9YU0QsICJkYXRlIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBYU0RfVElNRSA9IG5ldyBRTmFtZShVUklfREVGQVVMVF9TQ0hFTUFfWFNELCAidGltZSIpOwotCi0gICAgLy8gYXR0cmlidXRlIHR5cGVzIHVzZWQgaW4gY29sbGVjdGlvbiBhcGkKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT0xMRUNUSU9OX1RZUEUgPSAweDAwMDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTElTVF9UWVBFID0gMHgwMDAyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFVF9UWVBFID0gMHgwMDA0OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BUF9UWVBFID0gMHgwMDA4OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9USEVSX1RZUEUgPSAweDAwMTA7Ci0KLSAgICAvL3JtaSBuYW1lc3BhY2VzCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk1JX1RZUEVfTkFNU1BBQ0UgPSAiaHR0cDovL3dzLmFwYWNoZS5vcmcvcm1pL3R5cGVzIjsKLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS91dGlsL0phdmFUeXBlVG9Db25zdHJ1Y3Rvck1hcC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS91dGlsL0phdmFUeXBlVG9Db25zdHJ1Y3Rvck1hcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDhkZWZjLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvdXRpbC9KYXZhVHlwZVRvQ29uc3RydWN0b3JNYXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5ybWkudXRpbDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOwotaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1wdWJsaWMgY2xhc3MgSmF2YVR5cGVUb0NvbnN0cnVjdG9yTWFwIHsKLQotICAgIHByaXZhdGUgc3RhdGljIE1hcCBqYXZhVHlwZVRvQ29uc3RydWN0b3JNYXA7Ci0KLSAgICBwdWJsaWMgc3RhdGljIENvbnN0cnVjdG9yIGdldENvbnN0cnVjdG9yKENsYXNzIGtleSkgewotICAgICAgICByZXR1cm4gKENvbnN0cnVjdG9yKSBqYXZhVHlwZVRvQ29uc3RydWN0b3JNYXAuZ2V0KGtleSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zS2V5KENsYXNzIGtleSkgewotICAgICAgICByZXR1cm4gamF2YVR5cGVUb0NvbnN0cnVjdG9yTWFwLmNvbnRhaW5zS2V5KGtleSk7Ci0gICAgfQotCi0gICAgc3RhdGljIHsKLSAgICAgICAgamF2YVR5cGVUb0NvbnN0cnVjdG9yTWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgLy8gcHVwdWFsdGUgdGhlIG1hcAotICAgICAgICB0cnkgewotICAgICAgICAgICAgamF2YVR5cGVUb0NvbnN0cnVjdG9yTWFwLnB1dChTdHJpbmcuY2xhc3MsIFN0cmluZy5jbGFzcy5nZXRDb25zdHJ1Y3RvcihuZXcgQ2xhc3NbXXtTdHJpbmcuY2xhc3N9KSk7Ci0gICAgICAgICAgICBqYXZhVHlwZVRvQ29uc3RydWN0b3JNYXAucHV0KGJvb2xlYW4uY2xhc3MsIEJvb2xlYW4uY2xhc3MuZ2V0Q29uc3RydWN0b3IobmV3IENsYXNzW117U3RyaW5nLmNsYXNzfSkpOwotICAgICAgICAgICAgamF2YVR5cGVUb0NvbnN0cnVjdG9yTWFwLnB1dChCb29sZWFuLmNsYXNzLCBCb29sZWFuLmNsYXNzLmdldENvbnN0cnVjdG9yKG5ldyBDbGFzc1tde1N0cmluZy5jbGFzc30pKTsKLSAgICAgICAgICAgIGphdmFUeXBlVG9Db25zdHJ1Y3Rvck1hcC5wdXQoZG91YmxlLmNsYXNzLCBEb3VibGUuY2xhc3MuZ2V0Q29uc3RydWN0b3IobmV3IENsYXNzW117U3RyaW5nLmNsYXNzfSkpOwotICAgICAgICAgICAgamF2YVR5cGVUb0NvbnN0cnVjdG9yTWFwLnB1dChEb3VibGUuY2xhc3MsIERvdWJsZS5jbGFzcy5nZXRDb25zdHJ1Y3RvcihuZXcgQ2xhc3NbXXtTdHJpbmcuY2xhc3N9KSk7Ci0gICAgICAgICAgICBqYXZhVHlwZVRvQ29uc3RydWN0b3JNYXAucHV0KGZsb2F0LmNsYXNzLCBGbG9hdC5jbGFzcy5nZXRDb25zdHJ1Y3RvcihuZXcgQ2xhc3NbXXtTdHJpbmcuY2xhc3N9KSk7Ci0gICAgICAgICAgICBqYXZhVHlwZVRvQ29uc3RydWN0b3JNYXAucHV0KEZsb2F0LmNsYXNzLCBGbG9hdC5jbGFzcy5nZXRDb25zdHJ1Y3RvcihuZXcgQ2xhc3NbXXtTdHJpbmcuY2xhc3N9KSk7Ci0gICAgICAgICAgICBqYXZhVHlwZVRvQ29uc3RydWN0b3JNYXAucHV0KGludC5jbGFzcywgSW50ZWdlci5jbGFzcy5nZXRDb25zdHJ1Y3RvcihuZXcgQ2xhc3NbXXtTdHJpbmcuY2xhc3N9KSk7Ci0gICAgICAgICAgICBqYXZhVHlwZVRvQ29uc3RydWN0b3JNYXAucHV0KEludGVnZXIuY2xhc3MsIEludGVnZXIuY2xhc3MuZ2V0Q29uc3RydWN0b3IobmV3IENsYXNzW117U3RyaW5nLmNsYXNzfSkpOwotICAgICAgICAgICAgamF2YVR5cGVUb0NvbnN0cnVjdG9yTWFwLnB1dChsb25nLmNsYXNzLCBMb25nLmNsYXNzLmdldENvbnN0cnVjdG9yKG5ldyBDbGFzc1tde1N0cmluZy5jbGFzc30pKTsKLSAgICAgICAgICAgIGphdmFUeXBlVG9Db25zdHJ1Y3Rvck1hcC5wdXQoTG9uZy5jbGFzcywgTG9uZy5jbGFzcy5nZXRDb25zdHJ1Y3RvcihuZXcgQ2xhc3NbXXtTdHJpbmcuY2xhc3N9KSk7Ci0gICAgICAgICAgICBqYXZhVHlwZVRvQ29uc3RydWN0b3JNYXAucHV0KHNob3J0LmNsYXNzLCBTaG9ydC5jbGFzcy5nZXRDb25zdHJ1Y3RvcihuZXcgQ2xhc3NbXXtTdHJpbmcuY2xhc3N9KSk7Ci0gICAgICAgICAgICBqYXZhVHlwZVRvQ29uc3RydWN0b3JNYXAucHV0KFNob3J0LmNsYXNzLCBTaG9ydC5jbGFzcy5nZXRDb25zdHJ1Y3RvcihuZXcgQ2xhc3NbXXtTdHJpbmcuY2xhc3N9KSk7Ci0gICAgICAgICAgICBqYXZhVHlwZVRvQ29uc3RydWN0b3JNYXAucHV0KGJ5dGUuY2xhc3MsIEJ5dGUuY2xhc3MuZ2V0Q29uc3RydWN0b3IobmV3IENsYXNzW117U3RyaW5nLmNsYXNzfSkpOwotICAgICAgICAgICAgamF2YVR5cGVUb0NvbnN0cnVjdG9yTWFwLnB1dChCeXRlLmNsYXNzLCBCeXRlLmNsYXNzLmdldENvbnN0cnVjdG9yKG5ldyBDbGFzc1tde1N0cmluZy5jbGFzc30pKTsKLSAgICAgICAgICAgIGphdmFUeXBlVG9Db25zdHJ1Y3Rvck1hcC5wdXQoQ2FsZW5kYXIuY2xhc3MsIENvbnN0YW50cy5YU0RfREFURVRJTUUpOwotICAgICAgICAgICAgamF2YVR5cGVUb0NvbnN0cnVjdG9yTWFwLnB1dChEYXRlLmNsYXNzLCBDb25zdGFudHMuWFNEX0RBVEUpOwotICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gdGhpcyBleGNlcHRpb24gc2hvdWxkIG5vdCBvY2N1ciBzaW5jZSB3ZSBkZWFsaW5nIHdpdGgga25vdyBjbGFzcwotICAgICAgICAgICAgLy8gcHJpbnQgdGhlIHN0YWNrdHJhY2UgZm9yIGRlYnVnaW5nIHB1cnBvc2VzCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvdXRpbC9KYXZhVHlwZVRvUU5hbWVNYXAuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvdXRpbC9KYXZhVHlwZVRvUU5hbWVNYXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMThjODlmOS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL3V0aWwvSmF2YVR5cGVUb1FOYW1lTWFwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLnV0aWw7Ci0KLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotCi1wdWJsaWMgY2xhc3MgSmF2YVR5cGVUb1FOYW1lTWFwIHsKLQotICAgIHByaXZhdGUgc3RhdGljIE1hcCBqYXZhVHlwZVRvUU5hbWVNYXA7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFFOYW1lIGdldFR5cGVRTmFtZShDbGFzcyBrZXkpIHsKLSAgICAgICAgcmV0dXJuIChRTmFtZSkgamF2YVR5cGVUb1FOYW1lTWFwLmdldChrZXkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWluc0tleShDbGFzcyBrZXkpIHsKLSAgICAgICAgcmV0dXJuIGphdmFUeXBlVG9RTmFtZU1hcC5jb250YWluc0tleShrZXkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU2V0IGdldEtleXMoKXsKLSAgICAgICAgcmV0dXJuIGphdmFUeXBlVG9RTmFtZU1hcC5rZXlTZXQoKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgewotICAgICAgICBqYXZhVHlwZVRvUU5hbWVNYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICAvLyBwdXB1YWx0ZSB0aGUgbWFwCi0gICAgICAgIGphdmFUeXBlVG9RTmFtZU1hcC5wdXQoU3RyaW5nLmNsYXNzLCBDb25zdGFudHMuWFNEX1NUUklORyk7Ci0gICAgICAgIGphdmFUeXBlVG9RTmFtZU1hcC5wdXQoYm9vbGVhbi5jbGFzcywgQ29uc3RhbnRzLlhTRF9CT09MRUFOKTsKLSAgICAgICAgamF2YVR5cGVUb1FOYW1lTWFwLnB1dChCb29sZWFuLmNsYXNzLCBDb25zdGFudHMuWFNEX0JPT0xFQU4pOwotICAgICAgICBqYXZhVHlwZVRvUU5hbWVNYXAucHV0KGRvdWJsZS5jbGFzcywgQ29uc3RhbnRzLlhTRF9ET1VCTEUpOwotICAgICAgICBqYXZhVHlwZVRvUU5hbWVNYXAucHV0KERvdWJsZS5jbGFzcywgQ29uc3RhbnRzLlhTRF9ET1VCTEUpOwotICAgICAgICBqYXZhVHlwZVRvUU5hbWVNYXAucHV0KGZsb2F0LmNsYXNzLCBDb25zdGFudHMuWFNEX0ZMT0FUKTsKLSAgICAgICAgamF2YVR5cGVUb1FOYW1lTWFwLnB1dChGbG9hdC5jbGFzcywgQ29uc3RhbnRzLlhTRF9GTE9BVCk7Ci0gICAgICAgIGphdmFUeXBlVG9RTmFtZU1hcC5wdXQoaW50LmNsYXNzLCBDb25zdGFudHMuWFNEX0lOVCk7Ci0gICAgICAgIGphdmFUeXBlVG9RTmFtZU1hcC5wdXQoSW50ZWdlci5jbGFzcywgQ29uc3RhbnRzLlhTRF9JTlQpOwotICAgICAgICBqYXZhVHlwZVRvUU5hbWVNYXAucHV0KGxvbmcuY2xhc3MsIENvbnN0YW50cy5YU0RfTE9ORyk7Ci0gICAgICAgIGphdmFUeXBlVG9RTmFtZU1hcC5wdXQoTG9uZy5jbGFzcywgQ29uc3RhbnRzLlhTRF9MT05HKTsKLSAgICAgICAgamF2YVR5cGVUb1FOYW1lTWFwLnB1dChzaG9ydC5jbGFzcywgQ29uc3RhbnRzLlhTRF9TSE9SVCk7Ci0gICAgICAgIGphdmFUeXBlVG9RTmFtZU1hcC5wdXQoU2hvcnQuY2xhc3MsIENvbnN0YW50cy5YU0RfU0hPUlQpOwotICAgICAgICBqYXZhVHlwZVRvUU5hbWVNYXAucHV0KGJ5dGUuY2xhc3MsIENvbnN0YW50cy5YU0RfQllURSk7Ci0gICAgICAgIGphdmFUeXBlVG9RTmFtZU1hcC5wdXQoQnl0ZS5jbGFzcywgQ29uc3RhbnRzLlhTRF9CWVRFKTsKLSAgICAgICAgamF2YVR5cGVUb1FOYW1lTWFwLnB1dChDYWxlbmRhci5jbGFzcywgQ29uc3RhbnRzLlhTRF9EQVRFVElNRSk7Ci0gICAgICAgIGphdmFUeXBlVG9RTmFtZU1hcC5wdXQoRGF0ZS5jbGFzcywgQ29uc3RhbnRzLlhTRF9EQVRFKTsKLSAgICAgICAgamF2YVR5cGVUb1FOYW1lTWFwLnB1dChPYmplY3QuY2xhc3MsIENvbnN0YW50cy5YU0RfQU5ZVFlQRSk7Ci0KLQotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL3V0aWwvTmFtZXNwYWNlUHJlZml4LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL3V0aWwvTmFtZXNwYWNlUHJlZml4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkMjk1ZWYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS91dGlsL05hbWVzcGFjZVByZWZpeC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJtaS51dGlsOwotCi0vKioKLSAqIHVzZWQgdG8ga2VlcCB0aGUgbmFtZXNwYWNlIHByZWZpeGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBOYW1lc3BhY2VQcmVmaXggewotCi0gICAgcHJpdmF0ZSBpbnQgbmFtZXNwYWNlUHJlZml4ID0gMDsKLQotICAgIHB1YmxpYyBpbnQgZ2V0TmFtZXNhcGNlUHJlZml4KCl7Ci0gICAgICAgIHJldHVybiArK25hbWVzcGFjZVByZWZpeDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL3V0aWwvVXRpbC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS91dGlsL1V0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJjZTgxOS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL3V0aWwvVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJtaS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0KLXB1YmxpYyBjbGFzcyBVdGlsIHsKLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgaSA9IDA7Ci0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBTdHJpbmcgZ2V0TmV4dE5hbWVzcGFjZVByZWZpeCgpIHsKLSAgICAgICAgaWYgKGkgPiAxMDAwKSB7Ci0gICAgICAgICAgICBpID0gMDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gIm5zIiArICsraTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTZXQgcHJpbWl0aXZlczsKLQotICAgIHN0YXRpYyB7Ci0gICAgICAgIHByaW1pdGl2ZXMgPSBuZXcgSGFzaFNldCgpOwotICAgICAgICBwcmltaXRpdmVzLmFkZChpbnQuY2xhc3MpOwotICAgICAgICBwcmltaXRpdmVzLmFkZChsb25nLmNsYXNzKTsKLSAgICAgICAgcHJpbWl0aXZlcy5hZGQoZmxvYXQuY2xhc3MpOwotICAgICAgICBwcmltaXRpdmVzLmFkZChkb3VibGUuY2xhc3MpOwotICAgICAgICBwcmltaXRpdmVzLmFkZChzaG9ydC5jbGFzcyk7Ci0gICAgICAgIHByaW1pdGl2ZXMuYWRkKGJ5dGUuY2xhc3MpOwotICAgICAgICBwcmltaXRpdmVzLmFkZChib29sZWFuLmNsYXNzKTsKLSAgICAgICAgcHJpbWl0aXZlcy5hZGQoY2hhci5jbGFzcyk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNQcmltaXRpdmUoQ2xhc3MgdHlwZSkgewotICAgICAgICByZXR1cm4gcHJpbWl0aXZlcy5jb250YWlucyh0eXBlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGludCBnZXRDbGFzc1R5cGUoQ2xhc3MgY2xhc3NOYW1lKQotICAgICAgICAgICAgdGhyb3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sCi0gICAgICAgICAgICBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgaW50IHR5cGUgPSBDb25zdGFudHMuT1RIRVJfVFlQRTsKLSAgICAgICAgLy8gaWYgaXQgaXMgYW4gYXJyYXkgdGhlbiBpdCBjYW4gbm90IGJlIGEgY29sbGVjdGlvbiB0eXBlCi0gICAgICAgIGlmIChMaXN0LmNsYXNzLmlzQXNzaWduYWJsZUZyb20oY2xhc3NOYW1lKSkgewotICAgICAgICAgICAgdHlwZSA9IENvbnN0YW50cy5MSVNUX1RZUEUgfCBDb25zdGFudHMuQ09MTEVDVElPTl9UWVBFOwotICAgICAgICB9IGVsc2UgaWYgKFNldC5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGNsYXNzTmFtZSkpIHsKLSAgICAgICAgICAgIHR5cGUgPSBDb25zdGFudHMuU0VUX1RZUEUgfCBDb25zdGFudHMuQ09MTEVDVElPTl9UWVBFOwotICAgICAgICB9IGVsc2UgaWYgKE1hcC5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGNsYXNzTmFtZSkpIHsKLSAgICAgICAgICAgIHR5cGUgPSBDb25zdGFudHMuTUFQX1RZUEU7Ci0gICAgICAgIH0gZWxzZSBpZiAoQ29sbGVjdGlvbi5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGNsYXNzTmFtZSkpIHsKLSAgICAgICAgICAgIHR5cGUgPSBDb25zdGFudHMuQ09MTEVDVElPTl9UWVBFOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0eXBlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvd3NkbC9XU0RMMTFEZWZpbml0aW9uQnVpbGRlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS93c2RsL1dTREwxMURlZmluaXRpb25CdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiNjY2YmMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS93c2RsL1dTREwxMURlZmluaXRpb25CdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJtaS53c2RsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZXhjZXB0aW9uLlNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEuT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLm1ldGFkYXRhLlBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS5TZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLm1ldGFkYXRhLnhtbC5YbWxTY2hlbWE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkudXRpbC5VdGlsOwotCi1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nOwotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ0ZhdWx0OwotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ0lucHV0OwotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ09wZXJhdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdPdXRwdXQ7Ci1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuRmF1bHQ7Ci1pbXBvcnQgamF2YXgud3NkbC5JbnB1dDsKLWltcG9ydCBqYXZheC53c2RsLk1lc3NhZ2U7Ci1pbXBvcnQgamF2YXgud3NkbC5PcGVyYXRpb25UeXBlOwotaW1wb3J0IGphdmF4LndzZGwuT3V0cHV0OwotaW1wb3J0IGphdmF4LndzZGwuUGFydDsKLWltcG9ydCBqYXZheC53c2RsLlBvcnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5Qb3J0VHlwZTsKLWltcG9ydCBqYXZheC53c2RsLlR5cGVzOwotaW1wb3J0IGphdmF4LndzZGwuV1NETEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEFkZHJlc3M7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEJpbmRpbmc7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEJvZHk7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEZhdWx0OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBPcGVyYXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5mYWN0b3J5LldTRExGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogdGhpcyBjbGFzcyBpcyB1c2VkIHRvIGNyZWF0ZSB0aGUgd3NkbDExIG9iamVjdCBzdHVyY3R1cmUgZnJvbSB0aGUKLSAqIHNlcnZpY2Ugb2JqZWN0IHN0cnVjdHVyZS4KLSAqLwotcHVibGljIGNsYXNzIFdTREwxMURlZmluaXRpb25CdWlsZGVyIHsKLQotICAgIC8qKgotICAgICAqIHNlcnZpY2UgdG8gZ2VuZXJhdGUgdGhlCi0gICAgICovCi0gICAgcHJpdmF0ZSBTZXJ2aWNlIHNlcnZpY2U7Ci0KLSAgICAvKioKLSAgICAgKiB3c2RsIGRlZmluaXRpb24gb2JqZWN0IHRvIHBvcHVsYXRlCi0gICAgICovCi0gICAgcHJpdmF0ZSBEZWZpbml0aW9uIHdzZGxEZWZpbml0aW9uOwotCi0gICAgLyoqCi0gICAgICogcG9ydCB0eXBlIGZvciB0aGlzIHdzZGwKLSAgICAgKi8KLSAgICBwcml2YXRlIFBvcnRUeXBlIHBvcnRUeXBlOwotCi0gICAgcHJpdmF0ZSBCaW5kaW5nIGh0dHBTb2FwQmluZGluZzsKLQotICAgIC8vVE9ETzogZ2VuZXJhdGUgY29kZSBmb3IgdGhpcyBiaW5kaW5nLgotICAgIHByaXZhdGUgQmluZGluZyBodHRwU29hcDEyQmluZGluZzsKLQotCi0gICAgcHVibGljIFdTREwxMURlZmluaXRpb25CdWlsZGVyKFNlcnZpY2Ugc2VydmljZSkgewotICAgICAgICB0aGlzLnNlcnZpY2UgPSBzZXJ2aWNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGdlbmVyYXRlcyB0aGUgd3NkbCBmb3IgdGhpcyBzZXJ2aWNlCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIFNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgRGVmaW5pdGlvbiBnZW5lcmF0ZVdTREwoKSB0aHJvd3MgU2NoZW1hR2VuZXJhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB0aGlzLndzZGxEZWZpbml0aW9uID0gV1NETEZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdEZWZpbml0aW9uKCk7Ci0gICAgICAgICAgICAvL1RPRE86IGtlZXAgdGhlIG5hbWVzcGFjZSBwcmVmaXggbWFwIGlmIG5lZWRlZAotICAgICAgICAgICAgdGhpcy53c2RsRGVmaW5pdGlvbi5hZGROYW1lc3BhY2UoVXRpbC5nZXROZXh0TmFtZXNwYWNlUHJlZml4KCksIHRoaXMuc2VydmljZS5nZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgICAgICB0aGlzLndzZGxEZWZpbml0aW9uLmFkZE5hbWVzcGFjZShVdGlsLmdldE5leHROYW1lc3BhY2VQcmVmaXgoKSwgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iKTsKLSAgICAgICAgICAgIHRoaXMud3NkbERlZmluaXRpb24uc2V0VGFyZ2V0TmFtZXNwYWNlKHRoaXMuc2VydmljZS5nZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgICAgICAvLyBmaXJzdCBnZW5lcmF0ZSB0aGUgc2NoZW1hcwotICAgICAgICAgICAgZ2VuZXJhdGVUeXBlcygpOwotICAgICAgICAgICAgZ2VuZXJhdGVQb3J0VHlwZSgpOwotICAgICAgICAgICAgZ2VuZXJhdGVCaW5kaW5ncygpOwotICAgICAgICAgICAgZ2VuZXJhdGVTZXJ2aWNlKCk7Ci0gICAgICAgICAgICBnZW5lcmF0ZU9wZXJhdGlvbnNBbmRNZXNzYWdlcygpOwotICAgICAgICAgICAgcmV0dXJuIHRoaXMud3NkbERlZmluaXRpb247Ci0gICAgICAgIH0gY2F0Y2ggKFdTRExFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb24oIkVycm9yIGluIGNyZWF0aW5nIGEgbmV3IHdzZGwgZGVmaW5pdGlvbiIsIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogZ2VuZXJhdGVzIHRoZSBzY2hlbWFzIGZvciB0aGUgd3NkbAotICAgICAqCi0gICAgICogQHRocm93cyBTY2hlbWFHZW5lcmF0aW9uRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGdlbmVyYXRlVHlwZXMoKSB0aHJvd3MgU2NoZW1hR2VuZXJhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIFR5cGVzIHR5cGVzID0gdGhpcy53c2RsRGVmaW5pdGlvbi5jcmVhdGVUeXBlcygpOwotICAgICAgICB0aGlzLndzZGxEZWZpbml0aW9uLnNldFR5cGVzKHR5cGVzKTsKLSAgICAgICAgWG1sU2NoZW1hIHhtbFNjaGVtYTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gdGhpcy5zZXJ2aWNlLmdldFNjaGVtYU1hcCgpLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgeG1sU2NoZW1hID0gKFhtbFNjaGVtYSkgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICB4bWxTY2hlbWEuZ2VuZXJhdGVXU0RMU2NoZW1hKCk7Ci0gICAgICAgICAgICB0eXBlcy5hZGRFeHRlbnNpYmlsaXR5RWxlbWVudCh4bWxTY2hlbWEuZ2V0V3NkbFNjaGVtYSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIGdlbmVyYXRlcyB0aGUgcG9ydCB0eXBlIGZvciB0aGUgd3NkbAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBnZW5lcmF0ZVBvcnRUeXBlKCkgewotICAgICAgICB0aGlzLnBvcnRUeXBlID0gdGhpcy53c2RsRGVmaW5pdGlvbi5jcmVhdGVQb3J0VHlwZSgpOwotICAgICAgICB0aGlzLnBvcnRUeXBlLnNldFVuZGVmaW5lZChmYWxzZSk7Ci0gICAgICAgIHRoaXMucG9ydFR5cGUuc2V0UU5hbWUobmV3IFFOYW1lKHRoaXMuc2VydmljZS5nZXROYW1lc3BhY2UoKSwgdGhpcy5zZXJ2aWNlLmdldE5hbWUoKSArICJQb3J0VHlwZSIpKTsKLSAgICAgICAgdGhpcy53c2RsRGVmaW5pdGlvbi5hZGRQb3J0VHlwZShwb3J0VHlwZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGdlbmVyYXRlQmluZGluZ3MoKSB0aHJvd3MgU2NoZW1hR2VuZXJhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMuaHR0cFNvYXBCaW5kaW5nID0gdGhpcy53c2RsRGVmaW5pdGlvbi5jcmVhdGVCaW5kaW5nKCk7Ci0gICAgICAgIHRoaXMuaHR0cFNvYXBCaW5kaW5nLnNldFVuZGVmaW5lZChmYWxzZSk7Ci0gICAgICAgIHRoaXMuaHR0cFNvYXBCaW5kaW5nLnNldFFOYW1lKG5ldyBRTmFtZSh0aGlzLnNlcnZpY2UuZ2V0TmFtZXNwYWNlKCksCi0gICAgICAgICAgICAgICAgdGhpcy5zZXJ2aWNlLmdldE5hbWUoKSArICJIdHRwU29hcEJpbmRpbmciKSk7Ci0gICAgICAgIHRoaXMuaHR0cFNvYXBCaW5kaW5nLnNldFBvcnRUeXBlKHRoaXMucG9ydFR5cGUpOwotICAgICAgICAvLyBhZGQgc29hcCB0cmFuc3BvcnQgcGFydHMKLSAgICAgICAgRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZXh0ZW5zaW9uUmVnaXN0cnkgPSBXU0RMRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1BvcHVsYXRlZEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0gICAgICAgICAgICBTT0FQQmluZGluZyBzb2FwQmluZGluZyA9IChTT0FQQmluZGluZykgZXh0ZW5zaW9uUmVnaXN0cnkuY3JlYXRlRXh0ZW5zaW9uKAotICAgICAgICAgICAgICAgICAgICBCaW5kaW5nLmNsYXNzLCBuZXcgUU5hbWUoImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iLCAiYmluZGluZyIpKTsKLSAgICAgICAgICAgIHNvYXBCaW5kaW5nLnNldFRyYW5zcG9ydFVSSSgiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIik7Ci0gICAgICAgICAgICBzb2FwQmluZGluZy5zZXRTdHlsZSgiZG9jdW1lbnQiKTsKLSAgICAgICAgICAgIHRoaXMuaHR0cFNvYXBCaW5kaW5nLmFkZEV4dGVuc2liaWxpdHlFbGVtZW50KHNvYXBCaW5kaW5nKTsKLSAgICAgICAgfSBjYXRjaCAoV1NETEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hR2VuZXJhdGlvbkV4Y2VwdGlvbigiQ2FuIG5vdCBjcmV0ZSBhIHdzZGwgZmFjdG9yeSIpOwotICAgICAgICB9Ci0gICAgICAgIHRoaXMud3NkbERlZmluaXRpb24uYWRkQmluZGluZyh0aGlzLmh0dHBTb2FwQmluZGluZyk7Ci0gICAgICAgIHRoaXMud3NkbERlZmluaXRpb24uZ2V0QmluZGluZ3MoKS5wdXQodGhpcy5odHRwU29hcEJpbmRpbmcuZ2V0UU5hbWUoKSwKLSAgICAgICAgICAgICAgICB0aGlzLmh0dHBTb2FwQmluZGluZyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGdlbmVyYXRlU2VydmljZSgpCi0gICAgICAgICAgICB0aHJvd3MgU2NoZW1hR2VuZXJhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIG5vdyBhZGQgdGhlIGJpbmRpbmcgcG9ydFR5cGUgYW5kIG1lc3NhZ2VzIGNvcnJlc3BvbmRpbmcgdG8gZXZlcnkgb3BlcmF0aW9uCi0gICAgICAgIGphdmF4LndzZGwuU2VydmljZSBzZXJ2aWNlID0gdGhpcy53c2RsRGVmaW5pdGlvbi5jcmVhdGVTZXJ2aWNlKCk7Ci0gICAgICAgIHNlcnZpY2Uuc2V0UU5hbWUobmV3IFFOYW1lKHRoaXMuc2VydmljZS5nZXROYW1lc3BhY2UoKSwgdGhpcy5zZXJ2aWNlLmdldE5hbWUoKSkpOwotCi0gICAgICAgIFBvcnQgcG9ydCA9IHRoaXMud3NkbERlZmluaXRpb24uY3JlYXRlUG9ydCgpOwotICAgICAgICBwb3J0LnNldE5hbWUodGhpcy5zZXJ2aWNlLmdldE5hbWUoKSArICJIdHRwU29hcFBvcnQiKTsKLSAgICAgICAgcG9ydC5zZXRCaW5kaW5nKHRoaXMuaHR0cFNvYXBCaW5kaW5nKTsKLSAgICAgICAgRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZXh0ZW5zaW9uUmVnaXN0cnkgPSBXU0RMRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1BvcHVsYXRlZEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0gICAgICAgICAgICBTT0FQQWRkcmVzcyBzb2FwQWRkcmVzcyA9IChTT0FQQWRkcmVzcykgZXh0ZW5zaW9uUmVnaXN0cnkuY3JlYXRlRXh0ZW5zaW9uKAotICAgICAgICAgICAgICAgICAgICBQb3J0LmNsYXNzLCBuZXcgUU5hbWUoImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iLCAiYWRkcmVzcyIpKTsKLSAgICAgICAgICAgIHNvYXBBZGRyZXNzLnNldExvY2F0aW9uVVJJKCJodHRwOi8vbG9jYWxob3N0OjgwODAvYXhpczIvc2VydmljZXMvIiArIHRoaXMuc2VydmljZS5nZXROYW1lKCkpOwotICAgICAgICAgICAgcG9ydC5hZGRFeHRlbnNpYmlsaXR5RWxlbWVudChzb2FwQWRkcmVzcyk7Ci0gICAgICAgIH0gY2F0Y2ggKFdTRExFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb24oIkNhbiBub3QgY3JldGUgYSB3c2RsIGZhY3RvcnkiKTsKLSAgICAgICAgfQotICAgICAgICBzZXJ2aWNlLmFkZFBvcnQocG9ydCk7Ci0gICAgICAgIHRoaXMud3NkbERlZmluaXRpb24uYWRkU2VydmljZShzZXJ2aWNlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZ2VuZXJhdGVPcGVyYXRpb25zQW5kTWVzc2FnZXMoKQotICAgICAgICAgICAgdGhyb3dzIFNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb24gewotCi0gICAgICAgIG9yZy5hcGFjaGUuYXhpczIucm1pLm1ldGFkYXRhLk9wZXJhdGlvbiBvcGVyYXRpb247Ci0gICAgICAgIE1lc3NhZ2UgaW5wdXRNZXNzYWdlOwotICAgICAgICBNZXNzYWdlIG91dHB1dE1lc3NhZ2U7Ci0gICAgICAgIGphdmF4LndzZGwuT3BlcmF0aW9uIHdzZGxPcGVyYXRpb247Ci0gICAgICAgIEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbjsKLQotICAgICAgICAvL2dlbmVyYXRlIG1lc3NhZ2VzIGZvciBleGNlcHRpb25zCi0gICAgICAgIE1hcCBleGNlcHRpb25NZXNzYWdlc01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIENsYXNzIGV4Y2VwdGlvbkNsYXNzOwotICAgICAgICBQYXJhbWV0ZXIgcGFyYW1ldGVyOwotICAgICAgICBNZXNzYWdlIGZhdWx0TWVzc2FnZTsKLSAgICAgICAgU3RyaW5nIG1lc3NhZ2VOYW1lOwotICAgICAgICBQYXJ0IHBhcnQ7Ci0KLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gdGhpcy5zZXJ2aWNlLmdldEV4Y2VwdGlvbkNsYXNzVG9QYXJhbWV0ZXJNYXAoKS5rZXlTZXQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIGV4Y2VwdGlvbkNsYXNzID0gKENsYXNzKSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIHBhcmFtZXRlciA9IChQYXJhbWV0ZXIpIHRoaXMuc2VydmljZS5nZXRFeGNlcHRpb25DbGFzc1RvUGFyYW1ldGVyTWFwKCkuZ2V0KGV4Y2VwdGlvbkNsYXNzKTsKLSAgICAgICAgICAgIG1lc3NhZ2VOYW1lID0gZXhjZXB0aW9uQ2xhc3MuZ2V0TmFtZSgpOwotICAgICAgICAgICAgbWVzc2FnZU5hbWUgPSBtZXNzYWdlTmFtZS5zdWJzdHJpbmcobWVzc2FnZU5hbWUubGFzdEluZGV4T2YoIi4iKSArIDEpOwotICAgICAgICAgICAgZmF1bHRNZXNzYWdlID0gdGhpcy53c2RsRGVmaW5pdGlvbi5jcmVhdGVNZXNzYWdlKCk7Ci0gICAgICAgICAgICBmYXVsdE1lc3NhZ2Uuc2V0VW5kZWZpbmVkKGZhbHNlKTsKLSAgICAgICAgICAgIGZhdWx0TWVzc2FnZS5zZXRRTmFtZShuZXcgUU5hbWUodGhpcy5zZXJ2aWNlLmdldE5hbWVzcGFjZSgpLCBtZXNzYWdlTmFtZSkpOwotCi0gICAgICAgICAgICBwYXJ0ID0gdGhpcy53c2RsRGVmaW5pdGlvbi5jcmVhdGVQYXJ0KCk7Ci0gICAgICAgICAgICBwYXJ0LnNldE5hbWUoImZhdWx0Iik7Ci0gICAgICAgICAgICAvLyBhZGQgdGhpcyBlbGVtZW50IG5hbWVzcGFjZSB0byB0aGUgZGVmaW5pdGlvbgotICAgICAgICAgICAgaWYgKHRoaXMud3NkbERlZmluaXRpb24uZ2V0UHJlZml4KHBhcmFtZXRlci5nZXRFbGVtZW50KCkuZ2V0TmFtZXNwYWNlKCkpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aGlzLndzZGxEZWZpbml0aW9uLmFkZE5hbWVzcGFjZShVdGlsLmdldE5leHROYW1lc3BhY2VQcmVmaXgoKSwgcGFyYW1ldGVyLmdldEVsZW1lbnQoKS5nZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwYXJ0LnNldEVsZW1lbnROYW1lKHBhcmFtZXRlci5nZXRFbGVtZW50KCkuZ2V0VHlwZSgpLmdldFFuYW1lKCkpOwotICAgICAgICAgICAgZmF1bHRNZXNzYWdlLmFkZFBhcnQocGFydCk7Ci0gICAgICAgICAgICBleGNlcHRpb25NZXNzYWdlc01hcC5wdXQoZXhjZXB0aW9uQ2xhc3MsIGZhdWx0TWVzc2FnZSk7Ci0gICAgICAgICAgICB0aGlzLndzZGxEZWZpbml0aW9uLmFkZE1lc3NhZ2UoZmF1bHRNZXNzYWdlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHRoaXMuc2VydmljZS5nZXRPcGVyYXRpb25zKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBvcGVyYXRpb24gPSAob3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEuT3BlcmF0aW9uKSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIC8vIGFkZCBpbnB1dCBhbmQgb3V0IHB1dCBtZXNzYWdlcwotICAgICAgICAgICAgaW5wdXRNZXNzYWdlID0gZ2V0V1NETElucHV0TWVzc2FnZSh0aGlzLndzZGxEZWZpbml0aW9uLCBvcGVyYXRpb24pOwotICAgICAgICAgICAgb3V0cHV0TWVzc2FnZSA9IGdldFdTRExPdXRwdXRNZXNzYWdlKHRoaXMud3NkbERlZmluaXRpb24sIG9wZXJhdGlvbik7Ci0gICAgICAgICAgICB0aGlzLndzZGxEZWZpbml0aW9uLmFkZE1lc3NhZ2UoaW5wdXRNZXNzYWdlKTsKLSAgICAgICAgICAgIHRoaXMud3NkbERlZmluaXRpb24uYWRkTWVzc2FnZShvdXRwdXRNZXNzYWdlKTsKLQotICAgICAgICAgICAgd3NkbE9wZXJhdGlvbiA9IGdldFdTRExPcGVyYXRpb24odGhpcy53c2RsRGVmaW5pdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgaW5wdXRNZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICBvdXRwdXRNZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICBleGNlcHRpb25NZXNzYWdlc01hcCwKLSAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uKTsKLSAgICAgICAgICAgIHRoaXMucG9ydFR5cGUuYWRkT3BlcmF0aW9uKHdzZGxPcGVyYXRpb24pOwotICAgICAgICAgICAgYmluZGluZ09wZXJhdGlvbiA9IGdldFdTRExCaW5kaW5nT3BlcmF0aW9uKHRoaXMud3NkbERlZmluaXRpb24sCi0gICAgICAgICAgICAgICAgICAgIHdzZGxPcGVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbik7Ci0gICAgICAgICAgICB0aGlzLmh0dHBTb2FwQmluZGluZy5hZGRCaW5kaW5nT3BlcmF0aW9uKGJpbmRpbmdPcGVyYXRpb24pOwotCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBjcmVhdGVzIHRoZSBjb3JyZXNwb25kaW5nIHdzZGwgbWVzc2FnZSBmb3IgaW5wdXQKLSAgICAgKgotICAgICAqIEBwYXJhbSBkZWZpbml0aW9uCi0gICAgICogQHJldHVybiBpbnB1dCBtZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIE1lc3NhZ2UgZ2V0V1NETElucHV0TWVzc2FnZShEZWZpbml0aW9uIGRlZmluaXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYXRpb24gb3BlcmF0aW9uKSB7Ci0gICAgICAgIE1lc3NhZ2UgaW5wdXRNZXNzYWdlID0gZGVmaW5pdGlvbi5jcmVhdGVNZXNzYWdlKCk7Ci0gICAgICAgIGlucHV0TWVzc2FnZS5zZXRVbmRlZmluZWQoZmFsc2UpOwotICAgICAgICBpbnB1dE1lc3NhZ2Uuc2V0UU5hbWUobmV3IFFOYW1lKG9wZXJhdGlvbi5nZXROYW1lc3BhY2UoKSwgb3BlcmF0aW9uLmdldE5hbWUoKSArICJSZXF1ZXN0TWVzc2FnZSIpKTsKLSAgICAgICAgUGFydCBwYXJ0ID0gZGVmaW5pdGlvbi5jcmVhdGVQYXJ0KCk7Ci0gICAgICAgIHBhcnQuc2V0TmFtZSgiaW5wdXQiKTsKLSAgICAgICAgcGFydC5zZXRFbGVtZW50TmFtZShuZXcgUU5hbWUob3BlcmF0aW9uLmdldElucHV0RWxlbWVudCgpLmdldE5hbWVzcGFjZSgpLCBvcGVyYXRpb24uZ2V0SW5wdXRFbGVtZW50KCkuZ2V0TmFtZSgpKSk7Ci0gICAgICAgIGlucHV0TWVzc2FnZS5hZGRQYXJ0KHBhcnQpOwotICAgICAgICByZXR1cm4gaW5wdXRNZXNzYWdlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGNyZWF0ZXMgdGhlIGNvcnJlc3BvbmRpbmcgd3NkbCBtZXNzYWdlIGZvciBvdXRwdXQKLSAgICAgKgotICAgICAqIEBwYXJhbSBkZWZpbml0aW9uCi0gICAgICogQHJldHVybiBvdXRwdXQgbWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyBNZXNzYWdlIGdldFdTRExPdXRwdXRNZXNzYWdlKERlZmluaXRpb24gZGVmaW5pdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYXRpb24gb3BlcmF0aW9uKSB7Ci0gICAgICAgIE1lc3NhZ2Ugb3V0cHV0TWVzc2FnZSA9IGRlZmluaXRpb24uY3JlYXRlTWVzc2FnZSgpOwotICAgICAgICBvdXRwdXRNZXNzYWdlLnNldFVuZGVmaW5lZChmYWxzZSk7Ci0gICAgICAgIG91dHB1dE1lc3NhZ2Uuc2V0UU5hbWUobmV3IFFOYW1lKG9wZXJhdGlvbi5nZXROYW1lc3BhY2UoKSwgb3BlcmF0aW9uLmdldE5hbWUoKSArICJSZXNwb25zZU1lc3NhZ2UiKSk7Ci0gICAgICAgIFBhcnQgcGFydCA9IGRlZmluaXRpb24uY3JlYXRlUGFydCgpOwotICAgICAgICBwYXJ0LnNldE5hbWUoIm91dHB1dCIpOwotICAgICAgICBwYXJ0LnNldEVsZW1lbnROYW1lKG5ldyBRTmFtZShvcGVyYXRpb24uZ2V0T3V0UHV0RWxlbWVudCgpLmdldE5hbWVzcGFjZSgpLCBvcGVyYXRpb24uZ2V0T3V0UHV0RWxlbWVudCgpLmdldE5hbWUoKSkpOwotICAgICAgICBvdXRwdXRNZXNzYWdlLmFkZFBhcnQocGFydCk7Ci0gICAgICAgIHJldHVybiBvdXRwdXRNZXNzYWdlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGdlbmVyYXRlcyB0aGUgd3NkbCBvcGVyYXRpb24gZm9yIHRoZSBybWkgb3BlcmF0aW9uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZGVmaW5pdGlvbgotICAgICAqIEBwYXJhbSBpbnB1dE1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gb3V0cHV0TWVzc2FnZQotICAgICAqIEBwYXJhbSBmYXVsdE1lc3NhZ2VNYXAKLSAgICAgKiBAcGFyYW0gb3BlcmF0aW9uCi0gICAgICogQHJldHVybiB3c2RsIG9wZXJhdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBqYXZheC53c2RsLk9wZXJhdGlvbiBnZXRXU0RMT3BlcmF0aW9uKERlZmluaXRpb24gZGVmaW5pdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlIGlucHV0TWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlIG91dHB1dE1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwIGZhdWx0TWVzc2FnZU1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYXRpb24gb3BlcmF0aW9uKSB7Ci0gICAgICAgIGphdmF4LndzZGwuT3BlcmF0aW9uIHdzZGxPcGVyYXRpb24gPSBkZWZpbml0aW9uLmNyZWF0ZU9wZXJhdGlvbigpOwotICAgICAgICB3c2RsT3BlcmF0aW9uLnNldFVuZGVmaW5lZChmYWxzZSk7Ci0gICAgICAgIHdzZGxPcGVyYXRpb24uc2V0TmFtZShvcGVyYXRpb24uZ2V0TmFtZSgpKTsKLSAgICAgICAgSW5wdXQgaW5wdXQgPSBkZWZpbml0aW9uLmNyZWF0ZUlucHV0KCk7Ci0gICAgICAgIGlucHV0LnNldE1lc3NhZ2UoaW5wdXRNZXNzYWdlKTsKLSAgICAgICAgaW5wdXQuc2V0TmFtZSgiaW5wdXQiKTsKLQotICAgICAgICBPdXRwdXQgb3V0cHV0ID0gZGVmaW5pdGlvbi5jcmVhdGVPdXRwdXQoKTsKLSAgICAgICAgb3V0cHV0LnNldE1lc3NhZ2Uob3V0cHV0TWVzc2FnZSk7Ci0gICAgICAgIG91dHB1dC5zZXROYW1lKCJvdXRwdXQiKTsKLSAgICAgICAgd3NkbE9wZXJhdGlvbi5zZXRJbnB1dChpbnB1dCk7Ci0gICAgICAgIHdzZGxPcGVyYXRpb24uc2V0T3V0cHV0KG91dHB1dCk7Ci0gICAgICAgIHdzZGxPcGVyYXRpb24uc2V0U3R5bGUoT3BlcmF0aW9uVHlwZS5SRVFVRVNUX1JFU1BPTlNFKTsKLQotICAgICAgICAvLyBhZGQgZmF1bHQgbWVzc2FnZXMKLSAgICAgICAgQ2xhc3NbXSBleGNlcHRpb25DbGFzc2VzID0gb3BlcmF0aW9uLmdldEphdmFNZXRob2QoKS5nZXRFeGNlcHRpb25UeXBlcygpOwotICAgICAgICBNZXNzYWdlIGZhdWx0TWVzc2FnZTsKLSAgICAgICAgRmF1bHQgZmF1bHQ7Ci0gICAgICAgIFN0cmluZyBmYXVsdE5hbWU7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXhjZXB0aW9uQ2xhc3Nlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgZmF1bHROYW1lID0gZXhjZXB0aW9uQ2xhc3Nlc1tpXS5nZXROYW1lKCk7Ci0gICAgICAgICAgICBmYXVsdE5hbWUgPSBmYXVsdE5hbWUuc3Vic3RyaW5nKGZhdWx0TmFtZS5sYXN0SW5kZXhPZigiLiIpICsgMSk7Ci0gICAgICAgICAgICBmYXVsdE1lc3NhZ2UgPSAoTWVzc2FnZSkgZmF1bHRNZXNzYWdlTWFwLmdldChleGNlcHRpb25DbGFzc2VzW2ldKTsKLSAgICAgICAgICAgIGZhdWx0ID0gZGVmaW5pdGlvbi5jcmVhdGVGYXVsdCgpOwotICAgICAgICAgICAgZmF1bHQuc2V0TWVzc2FnZShmYXVsdE1lc3NhZ2UpOwotICAgICAgICAgICAgZmF1bHQuc2V0TmFtZSgiZmF1bHQiICsgZmF1bHROYW1lKTsKLSAgICAgICAgICAgIHdzZGxPcGVyYXRpb24uYWRkRmF1bHQoZmF1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHdzZGxPcGVyYXRpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogZ2VuZXJhdGVzIHRoZSBzb2FwMTEgYmluZGluZyBvcGVyYXRpb24gZm9yIHRoZSBzb2FwIDExIGJpbmRpbmcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZGVmaW5pdGlvbgotICAgICAqIEBwYXJhbSB3c2RsT3BlcmF0aW9uCi0gICAgICogQHBhcmFtIG9wZXJhdGlvbgotICAgICAqIEByZXR1cm4KLSAgICAgKiBAdGhyb3dzIFNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgQmluZGluZ09wZXJhdGlvbiBnZXRXU0RMQmluZGluZ09wZXJhdGlvbihEZWZpbml0aW9uIGRlZmluaXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgud3NkbC5PcGVyYXRpb24gd3NkbE9wZXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYXRpb24gb3BlcmF0aW9uKQotICAgICAgICAgICAgdGhyb3dzIFNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb24gewotICAgICAgICBCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24gPSBkZWZpbml0aW9uLmNyZWF0ZUJpbmRpbmdPcGVyYXRpb24oKTsKLSAgICAgICAgYmluZGluZ09wZXJhdGlvbi5zZXROYW1lKG9wZXJhdGlvbi5nZXROYW1lKCkpOwotICAgICAgICBiaW5kaW5nT3BlcmF0aW9uLnNldE9wZXJhdGlvbih3c2RsT3BlcmF0aW9uKTsKLQotICAgICAgICBCaW5kaW5nSW5wdXQgYmluZGluZ0lucHV0ID0gZGVmaW5pdGlvbi5jcmVhdGVCaW5kaW5nSW5wdXQoKTsKLSAgICAgICAgYmluZGluZ09wZXJhdGlvbi5zZXRCaW5kaW5nSW5wdXQoYmluZGluZ0lucHV0KTsKLQotICAgICAgICBCaW5kaW5nT3V0cHV0IGJpbmRpbmdPdXRwdXQgPSBkZWZpbml0aW9uLmNyZWF0ZUJpbmRpbmdPdXRwdXQoKTsKLSAgICAgICAgYmluZGluZ09wZXJhdGlvbi5zZXRCaW5kaW5nT3V0cHV0KGJpbmRpbmdPdXRwdXQpOwotCi0gICAgICAgIEV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5ID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGV4dGVuc2lvblJlZ2lzdHJ5ID0gV1NETEZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdQb3B1bGF0ZWRFeHRlbnNpb25SZWdpc3RyeSgpOwotICAgICAgICAgICAgU09BUE9wZXJhdGlvbiBzb2FwT3BlcmF0aW9uID0gKFNPQVBPcGVyYXRpb24pIGV4dGVuc2lvblJlZ2lzdHJ5LmNyZWF0ZUV4dGVuc2lvbigKLSAgICAgICAgICAgICAgICAgICAgQmluZGluZ09wZXJhdGlvbi5jbGFzcywgbmV3IFFOYW1lKCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiwgIm9wZXJhdGlvbiIpKTsKLSAgICAgICAgICAgIHNvYXBPcGVyYXRpb24uc2V0U29hcEFjdGlvblVSSSgidXJuOiIgKyBvcGVyYXRpb24uZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIHNvYXBPcGVyYXRpb24uc2V0U3R5bGUoImRvY3VtZW50Iik7Ci0gICAgICAgICAgICBiaW5kaW5nT3BlcmF0aW9uLmFkZEV4dGVuc2liaWxpdHlFbGVtZW50KHNvYXBPcGVyYXRpb24pOwotCi0gICAgICAgICAgICBTT0FQQm9keSBpbnB1dFNvYXBCb2R5ID0gKFNPQVBCb2R5KSBleHRlbnNpb25SZWdpc3RyeS5jcmVhdGVFeHRlbnNpb24oCi0gICAgICAgICAgICAgICAgICAgIEJpbmRpbmdJbnB1dC5jbGFzcywgbmV3IFFOYW1lKCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiwgImJvZHkiKSk7Ci0gICAgICAgICAgICBpbnB1dFNvYXBCb2R5LnNldFVzZSgibGl0ZXJhbCIpOwotICAgICAgICAgICAgYmluZGluZ0lucHV0LmFkZEV4dGVuc2liaWxpdHlFbGVtZW50KGlucHV0U29hcEJvZHkpOwotCi0gICAgICAgICAgICBTT0FQQm9keSBvdXRwdXRTb2FwQm9keSA9IChTT0FQQm9keSkgZXh0ZW5zaW9uUmVnaXN0cnkuY3JlYXRlRXh0ZW5zaW9uKAotICAgICAgICAgICAgICAgICAgICBCaW5kaW5nT3V0cHV0LmNsYXNzLCBuZXcgUU5hbWUoImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iLCAiYm9keSIpKTsKLSAgICAgICAgICAgIG91dHB1dFNvYXBCb2R5LnNldFVzZSgibGl0ZXJhbCIpOwotICAgICAgICAgICAgYmluZGluZ091dHB1dC5hZGRFeHRlbnNpYmlsaXR5RWxlbWVudChvdXRwdXRTb2FwQm9keSk7Ci0KLSAgICAgICAgICAgIC8vIGFkZGluZyBmYXVsdCBtZXNzYWdlcwotICAgICAgICAgICAgQ2xhc3NbXSBleGNlcHRpb25DbGFzc2VzID0gb3BlcmF0aW9uLmdldEphdmFNZXRob2QoKS5nZXRFeGNlcHRpb25UeXBlcygpOwotICAgICAgICAgICAgQmluZGluZ0ZhdWx0IGJpbmRpbmdGYXVsdDsKLSAgICAgICAgICAgIFN0cmluZyBmYXVsdE5hbWU7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4Y2VwdGlvbkNsYXNzZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBmYXVsdE5hbWUgPSBleGNlcHRpb25DbGFzc2VzW2ldLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICBmYXVsdE5hbWUgPSBmYXVsdE5hbWUuc3Vic3RyaW5nKGZhdWx0TmFtZS5sYXN0SW5kZXhPZigiLiIpICsgMSk7Ci0gICAgICAgICAgICAgICAgYmluZGluZ0ZhdWx0ID0gZGVmaW5pdGlvbi5jcmVhdGVCaW5kaW5nRmF1bHQoKTsKLSAgICAgICAgICAgICAgICBiaW5kaW5nRmF1bHQuc2V0TmFtZSgiZmF1bHQiICsgZmF1bHROYW1lKTsKLSAgICAgICAgICAgICAgICBiaW5kaW5nT3BlcmF0aW9uLmFkZEJpbmRpbmdGYXVsdChiaW5kaW5nRmF1bHQpOwotCi0gICAgICAgICAgICAgICAgU09BUEZhdWx0IHNvYXBGYXVsdCA9IChTT0FQRmF1bHQpIGV4dGVuc2lvblJlZ2lzdHJ5LmNyZWF0ZUV4dGVuc2lvbigKLSAgICAgICAgICAgICAgICAgICAgICAgIEJpbmRpbmdGYXVsdC5jbGFzcywgbmV3IFFOYW1lKCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiwgImZhdWx0IikpOwotICAgICAgICAgICAgICAgIHNvYXBGYXVsdC5zZXRVc2UoImxpdGVyYWwiKTsKLSAgICAgICAgICAgICAgICBzb2FwRmF1bHQuc2V0TmFtZSgiZmF1bHQiICsgZmF1bHROYW1lKTsKLSAgICAgICAgICAgICAgICBiaW5kaW5nRmF1bHQuYWRkRXh0ZW5zaWJpbGl0eUVsZW1lbnQoc29hcEZhdWx0KTsKLSAgICAgICAgICAgIH0KLQotCi0gICAgICAgIH0gY2F0Y2ggKFdTRExFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb24oIkNhbiBub3QgY3JldGUgYSB3c2RsIGZhY3RvcnkiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBiaW5kaW5nT3BlcmF0aW9uOwotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9jbGllbnQvUk1JQ2xpZW50U2VydmljZTFUZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9jbGllbnQvUk1JQ2xpZW50U2VydmljZTFUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlYmM4ZjcuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvY2xpZW50L1JNSUNsaWVudFNlcnZpY2UxVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5ybWkuY2xpZW50OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLnNlcnZlci5zZXJ2aWNlcy5TZXJ2aWNlMUludGVyZmFjZTsKLQotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLQotcHVibGljIGNsYXNzIFJNSUNsaWVudFNlcnZpY2UxVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNZXRob2QxMSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNlcnZpY2UxSW50ZXJmYWNlIHByb3h5ID0gKFNlcnZpY2UxSW50ZXJmYWNlKSBSTUlDbGllbnRQcm94eS5jcmVhdGVQcm94eShTZXJ2aWNlMUludGVyZmFjZS5jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly9sb2NhbGhvc3Q6ODA4NS9heGlzMi9zZXJ2aWNlcy9TZXJ2aWNlMSIpOwotICAgICAgICAgICAgU3RyaW5nIHJlc3VsdCA9IHByb3h5Lm1ldGhvZDEoIkhlbGxvdyB3b3JsZCIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdCwgIkhlbGxvdyB3b3JsZCIpOwotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgYXhpc0ZhdWx0KSB7Ci0gICAgICAgICAgICBheGlzRmF1bHQucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNZXRob2QxMigpIHsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgU2VydmljZTFJbnRlcmZhY2UgcHJveHkgPSAoU2VydmljZTFJbnRlcmZhY2UpIFJNSUNsaWVudFByb3h5LmNyZWF0ZVByb3h5KFNlcnZpY2UxSW50ZXJmYWNlLmNsYXNzLAotICAgICAgICAgICAgICAgICAgICAiaHR0cDovL2xvY2FsaG9zdDo4MDg1L2F4aXMyL3NlcnZpY2VzL1NlcnZpY2UxIik7Ci0gICAgICAgICAgICBTdHJpbmcgcmVzdWx0ID0gcHJveHkubWV0aG9kMShudWxsKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQsIG51bGwpOwotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgYXhpc0ZhdWx0KSB7Ci0gICAgICAgICAgICBheGlzRmF1bHQucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNZXRob2QyKCkgewotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTZXJ2aWNlMUludGVyZmFjZSBwcm94eSA9IChTZXJ2aWNlMUludGVyZmFjZSkgUk1JQ2xpZW50UHJveHkuY3JlYXRlUHJveHkoU2VydmljZTFJbnRlcmZhY2UuY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICJodHRwOi8vbG9jYWxob3N0OjgwODUvYXhpczIvc2VydmljZXMvU2VydmljZTEiKTsKLSAgICAgICAgICAgIFN0cmluZ1tdIHJlc3VsdCA9IHByb3h5Lm1ldGhvZDIobmV3IFN0cmluZ1tdeyJwYXJhbTEiLCJwYXJhbTIifSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0WzBdLCAicGFyYW0xIik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0WzFdLCAicGFyYW0yIik7Ci0gICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBheGlzRmF1bHQpIHsKLSAgICAgICAgICAgIGF4aXNGYXVsdC5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE1ldGhvZDUoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTZXJ2aWNlMUludGVyZmFjZSBwcm94eSA9IChTZXJ2aWNlMUludGVyZmFjZSkgUk1JQ2xpZW50UHJveHkuY3JlYXRlUHJveHkoU2VydmljZTFJbnRlcmZhY2UuY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICJodHRwOi8vbG9jYWxob3N0OjgwODUvYXhpczIvc2VydmljZXMvU2VydmljZTEiKTsKLSAgICAgICAgICAgIE1hcCBwYXJhbTEgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICAgICAgcGFyYW0xLnB1dCgia2V5MSIsICJ2YWx1ZTEiKTsKLSAgICAgICAgICAgIHBhcmFtMS5wdXQoImtleTIiLCAidmFsdWUyIik7Ci0gICAgICAgICAgICBNYXAgcmVzdWx0ID0gcHJveHkubWV0aG9kNShwYXJhbTEpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHQuY29udGFpbnNLZXkoImtleTEiKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdC5jb250YWluc0tleSgia2V5MiIpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0KCJrZXkxIiksICJ2YWx1ZTEiKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0KCJrZXkyIiksICJ2YWx1ZTIiKTsKLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGF4aXNGYXVsdCkgewotICAgICAgICAgICAgYXhpc0ZhdWx0LnByaW50U3RhY2tUcmFjZSgpOyAgLy9UbyBjaGFuZ2UgYm9keSBvZiBjYXRjaCBzdGF0ZW1lbnQgdXNlIEZpbGUgfCBTZXR0aW5ncyB8IEZpbGUgVGVtcGxhdGVzLgotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE1ldGhvZDYoKXsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNlcnZpY2UxSW50ZXJmYWNlIHByb3h5ID0gKFNlcnZpY2UxSW50ZXJmYWNlKSBSTUlDbGllbnRQcm94eS5jcmVhdGVQcm94eShTZXJ2aWNlMUludGVyZmFjZS5jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly9sb2NhbGhvc3Q6ODA4NS9heGlzMi9zZXJ2aWNlcy9TZXJ2aWNlMSIpOwotCi0gICAgICAgICAgICBEYXRlIGRhdGUgPSBuZXcgRGF0ZSgpOwotICAgICAgICAgICAgRGF0ZSByZXN1bHQgPSBwcm94eS5tZXRob2Q2KGRhdGUpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGRhdGUuZ2V0RGF0ZSgpLCByZXN1bHQuZ2V0RGF0ZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGF4aXNGYXVsdCkgewotICAgICAgICAgICAgYXhpc0ZhdWx0LnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvY3VzdG9tYmVhbnMvRG9tRWxlbWVudEJlYW5UZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9jdXN0b21iZWFucy9Eb21FbGVtZW50QmVhblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWYyYWI5Ni4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9jdXN0b21iZWFucy9Eb21FbGVtZW50QmVhblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5ybWkuY3VzdG9tYmVhbnM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS51dGlsLlN0QVhVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5leGNlcHRpb24uWG1sUGFyc2luZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5leGNlcHRpb24uWG1sU2VyaWFsaXppbmdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkudXRpbC5OYW1lc3BhY2VQcmVmaXg7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLQotCi1wdWJsaWMgY2xhc3MgRG9tRWxlbWVudEJlYW5UZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHVibGljIHZvaWQgdGVzdFBhcnNlKCl7Ci0gICAgICAgICBTdHJpbmcgeG1sU3RyaW5nID0gIjxzdGFydHRhZz48eHNkOnNjaGVtYSB0YXJnZXROYW1lc3BhY2U9XCJodHRwOi8vd3MuYXBhY2hlLm9yZy9ybWkvdHlwZXNcIiB4bWxuczp4c2Q9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYVwiPiIgKwotICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPVwiTWFwVHlwZVwiPiIgKwotICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+IiArCi0gICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBmb3JtPVwidW5xdWFsaWZpZWRcIiBtaW5PY2N1cnM9XCIwXCIgbmFtZT1cImtleVwiIG5pbGxhYmxlPVwidHJ1ZVwiIHR5cGU9XCJ4c2Q6YW55VHlwZVwiLz4iICsKLSAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IGZvcm09XCJ1bnF1YWxpZmllZFwiIG1pbk9jY3Vycz1cIjBcIiBuYW1lPVwidmFsdWVcIiBuaWxsYWJsZT1cInRydWVcIiB0eXBlPVwieHNkOmFueVR5cGVcIi8+IiArCi0gICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+IiArCi0gICAgICAgICAgICAgICAgICIgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4iICsKLSAgICAgICAgICAgICAgICAgIiAgICAgICAgPC94c2Q6c2NoZW1hPjwvc3RhcnR0YWc+IjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciByZWFkZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSh4bWxTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotCi0gICAgICAgICAgICBFbGVtZW50IGRvbUVsZW1lbnQgPSAoRWxlbWVudCkgRG9tRWxlbWVudEJlYW4ucGFyc2UocmVhZGVyLG51bGwpOwotCi0gICAgICAgICAgICAvLyBzZXJpYWxpemluZyB0aGUgZG9jdW1lbnQKLSAgICAgICAgICAgIFN0cmluZ1dyaXRlciBzdHJpbmdXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1Xcml0ZXIgeG1sU3RyZWFtV3JpdGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVdyaXRlcihzdHJpbmdXcml0ZXIpOwotICAgICAgICAgICAgRG9tRWxlbWVudEJlYW4gZG9tRWxlbWVudEJlYW4gPSBuZXcgRG9tRWxlbWVudEJlYW4oZG9tRWxlbWVudCk7Ci0gICAgICAgICAgICBkb21FbGVtZW50QmVhbi5zZXJpYWxpemUoeG1sU3RyZWFtV3JpdGVyLG51bGwsbmV3IFFOYW1lKCJodHRwOi8vdGVzdCIsInN0YXJ0dGFnIiksbmV3IE5hbWVzcGFjZVByZWZpeCgpKTsKLSAgICAgICAgICAgIHhtbFN0cmVhbVdyaXRlci5mbHVzaCgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJ4bWwgc3RyaW5nID09PiIgKyBzdHJpbmdXcml0ZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9LIik7Ci0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOyAgLy9UbyBjaGFuZ2UgYm9keSBvZiBjYXRjaCBzdGF0ZW1lbnQgdXNlIEZpbGUgfCBTZXR0aW5ncyB8IEZpbGUgVGVtcGxhdGVzLgotICAgICAgICB9IGNhdGNoIChYbWxQYXJzaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7ICAvL1RvIGNoYW5nZSBib2R5IG9mIGNhdGNoIHN0YXRlbWVudCB1c2UgRmlsZSB8IFNldHRpbmdzIHwgRmlsZSBUZW1wbGF0ZXMuCi0gICAgICAgIH0gY2F0Y2ggKFhtbFNlcmlhbGl6aW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7ICAvL1RvIGNoYW5nZSBib2R5IG9mIGNhdGNoIHN0YXRlbWVudCB1c2UgRmlsZSB8IFNldHRpbmdzIHwgRmlsZSBUZW1wbGF0ZXMuCi0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kYXRhYmluZC9Db2xsZWN0aW9uVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvQ29sbGVjdGlvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGEyZjYzMS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kYXRhYmluZC9Db2xsZWN0aW9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5ybWkuZGF0YWJpbmQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5kYXRhYmluZC5kdG8uVGVzdENsYXNzMTE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEuUGFyYW1ldGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0KLXB1YmxpYyBjbGFzcyBDb2xsZWN0aW9uVGVzdCBleHRlbmRzIERhdGFCaW5kVGVzdCB7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VGVzdENsYXNzMTExKCl7Ci0KLSAgICAgICAgQ2xhc3MgdGVzdENsYXNzID0gVGVzdENsYXNzMTEuY2xhc3M7Ci0gICAgICAgIFBhcmFtZXRlciBwYXJhbWV0ZXIgPSBuZXcgUGFyYW1ldGVyKHRlc3RDbGFzcywgIlBhcmFtMSIpOwotICAgICAgICBUZXN0Q2xhc3MxMSB0ZXN0T2JqZWN0ID0gbmV3IFRlc3RDbGFzczExKCk7Ci0gICAgICAgIExpc3QgdGVzdExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIHRlc3RMaXN0LmFkZCgiVGVzdCBTdHJpbmciKTsKLSAgICAgICAgdGVzdE9iamVjdC5zZXRQYXJhbTEodGVzdExpc3QpOwotICAgICAgICBUZXN0Q2xhc3MxMSByZXN1bHQgPSAoVGVzdENsYXNzMTEpIGdldFJldHVybk9iamVjdChwYXJhbWV0ZXIsIHRlc3RPYmplY3QpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtMSgpLmdldCgwKSwgIlRlc3QgU3RyaW5nIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFRlc3RDbGFzczExMigpewotCi0gICAgICAgIENsYXNzIHRlc3RDbGFzcyA9IFRlc3RDbGFzczExLmNsYXNzOwotICAgICAgICBQYXJhbWV0ZXIgcGFyYW1ldGVyID0gbmV3IFBhcmFtZXRlcih0ZXN0Q2xhc3MsICJQYXJhbTEiKTsKLSAgICAgICAgVGVzdENsYXNzMTEgdGVzdE9iamVjdCA9IG5ldyBUZXN0Q2xhc3MxMSgpOwotICAgICAgICBMaXN0IHRlc3RMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICB0ZXN0TGlzdC5hZGQoIlRlc3QgU3RyaW5nMCIpOwotICAgICAgICB0ZXN0TGlzdC5hZGQoIlRlc3QgU3RyaW5nMSIpOwotICAgICAgICB0ZXN0TGlzdC5hZGQobnVsbCk7Ci0gICAgICAgIHRlc3RMaXN0LmFkZCgiVGVzdCBTdHJpbmczIik7Ci0gICAgICAgIHRlc3RMaXN0LmFkZChudWxsKTsKLQotICAgICAgICB0ZXN0T2JqZWN0LnNldFBhcmFtMSh0ZXN0TGlzdCk7Ci0gICAgICAgIFRlc3RDbGFzczExIHJlc3VsdCA9IChUZXN0Q2xhc3MxMSkgZ2V0UmV0dXJuT2JqZWN0KHBhcmFtZXRlciwgdGVzdE9iamVjdCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UGFyYW0xKCkuZ2V0KDApLCAiVGVzdCBTdHJpbmcwIik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UGFyYW0xKCkuZ2V0KDEpLCAiVGVzdCBTdHJpbmcxIik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UGFyYW0xKCkuZ2V0KDIpLCBudWxsKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTEoKS5nZXQoMyksICJUZXN0IFN0cmluZzMiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTEoKS5nZXQoNCksIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RUZXN0Q2xhc3MxMTMoKXsKLQotICAgICAgICBDbGFzcyB0ZXN0Q2xhc3MgPSBUZXN0Q2xhc3MxMS5jbGFzczsKLSAgICAgICAgUGFyYW1ldGVyIHBhcmFtZXRlciA9IG5ldyBQYXJhbWV0ZXIodGVzdENsYXNzLCAiUGFyYW0xIik7Ci0gICAgICAgIFRlc3RDbGFzczExIHRlc3RPYmplY3QgPSBuZXcgVGVzdENsYXNzMTEoKTsKLSAgICAgICAgTGlzdCB0ZXN0TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgdGVzdE9iamVjdC5zZXRQYXJhbTEodGVzdExpc3QpOwotICAgICAgICBUZXN0Q2xhc3MxMSByZXN1bHQgPSAoVGVzdENsYXNzMTEpIGdldFJldHVybk9iamVjdChwYXJhbWV0ZXIsIHRlc3RPYmplY3QpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtMSgpLCBudWxsKTsKLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RUZXN0Q2xhc3MxMTQoKXsKLQotICAgICAgICBDbGFzcyB0ZXN0Q2xhc3MgPSBUZXN0Q2xhc3MxMS5jbGFzczsKLSAgICAgICAgUGFyYW1ldGVyIHBhcmFtZXRlciA9IG5ldyBQYXJhbWV0ZXIodGVzdENsYXNzLCAiUGFyYW0xIik7Ci0gICAgICAgIFRlc3RDbGFzczExIHRlc3RPYmplY3QgPSBuZXcgVGVzdENsYXNzMTEoKTsKLSAgICAgICAgdGVzdE9iamVjdC5zZXRQYXJhbTEobnVsbCk7Ci0gICAgICAgIFRlc3RDbGFzczExIHJlc3VsdCA9IChUZXN0Q2xhc3MxMSkgZ2V0UmV0dXJuT2JqZWN0KHBhcmFtZXRlciwgdGVzdE9iamVjdCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UGFyYW0xKCksIG51bGwpOwotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFRlc3RDbGFzczExNSgpewotCi0gICAgICAgIENsYXNzIHRlc3RDbGFzcyA9IFRlc3RDbGFzczExLmNsYXNzOwotICAgICAgICBQYXJhbWV0ZXIgcGFyYW1ldGVyID0gbmV3IFBhcmFtZXRlcih0ZXN0Q2xhc3MsICJQYXJhbTEiKTsKLSAgICAgICAgVGVzdENsYXNzMTEgdGVzdE9iamVjdCA9IG5ldyBUZXN0Q2xhc3MxMSgpOwotICAgICAgICBBcnJheUxpc3QgdGVzdExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIHRlc3RMaXN0LmFkZCgiVGVzdCBTdHJpbmciKTsKLSAgICAgICAgdGVzdE9iamVjdC5zZXRQYXJhbTIodGVzdExpc3QpOwotICAgICAgICBUZXN0Q2xhc3MxMSByZXN1bHQgPSAoVGVzdENsYXNzMTEpIGdldFJldHVybk9iamVjdChwYXJhbWV0ZXIsIHRlc3RPYmplY3QpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtMigpLmdldCgwKSwgIlRlc3QgU3RyaW5nIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFRlc3RDbGFzczExNigpewotCi0gICAgICAgIENsYXNzIHRlc3RDbGFzcyA9IFRlc3RDbGFzczExLmNsYXNzOwotICAgICAgICBQYXJhbWV0ZXIgcGFyYW1ldGVyID0gbmV3IFBhcmFtZXRlcih0ZXN0Q2xhc3MsICJQYXJhbTEiKTsKLSAgICAgICAgVGVzdENsYXNzMTEgdGVzdE9iamVjdCA9IG5ldyBUZXN0Q2xhc3MxMSgpOwotICAgICAgICBBcnJheUxpc3QgdGVzdExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIHRlc3RMaXN0LmFkZCgiVGVzdCBTdHJpbmcwIik7Ci0gICAgICAgIHRlc3RMaXN0LmFkZCgiVGVzdCBTdHJpbmcxIik7Ci0gICAgICAgIHRlc3RMaXN0LmFkZChudWxsKTsKLSAgICAgICAgdGVzdExpc3QuYWRkKCJUZXN0IFN0cmluZzMiKTsKLSAgICAgICAgdGVzdExpc3QuYWRkKG51bGwpOwotCi0gICAgICAgIHRlc3RPYmplY3Quc2V0UGFyYW0yKHRlc3RMaXN0KTsKLSAgICAgICAgVGVzdENsYXNzMTEgcmVzdWx0ID0gKFRlc3RDbGFzczExKSBnZXRSZXR1cm5PYmplY3QocGFyYW1ldGVyLCB0ZXN0T2JqZWN0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTIoKS5nZXQoMCksICJUZXN0IFN0cmluZzAiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTIoKS5nZXQoMSksICJUZXN0IFN0cmluZzEiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTIoKS5nZXQoMiksIG51bGwpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtMigpLmdldCgzKSwgIlRlc3QgU3RyaW5nMyIpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtMigpLmdldCg0KSwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFRlc3RDbGFzczExNygpewotCi0gICAgICAgIENsYXNzIHRlc3RDbGFzcyA9IFRlc3RDbGFzczExLmNsYXNzOwotICAgICAgICBQYXJhbWV0ZXIgcGFyYW1ldGVyID0gbmV3IFBhcmFtZXRlcih0ZXN0Q2xhc3MsICJQYXJhbTEiKTsKLSAgICAgICAgVGVzdENsYXNzMTEgdGVzdE9iamVjdCA9IG5ldyBUZXN0Q2xhc3MxMSgpOwotICAgICAgICBBcnJheUxpc3QgdGVzdExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIHRlc3RPYmplY3Quc2V0UGFyYW0yKHRlc3RMaXN0KTsKLSAgICAgICAgVGVzdENsYXNzMTEgcmVzdWx0ID0gKFRlc3RDbGFzczExKSBnZXRSZXR1cm5PYmplY3QocGFyYW1ldGVyLCB0ZXN0T2JqZWN0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTIoKSwgbnVsbCk7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VGVzdENsYXNzMTE4KCl7Ci0KLSAgICAgICAgQ2xhc3MgdGVzdENsYXNzID0gVGVzdENsYXNzMTEuY2xhc3M7Ci0gICAgICAgIFBhcmFtZXRlciBwYXJhbWV0ZXIgPSBuZXcgUGFyYW1ldGVyKHRlc3RDbGFzcywgIlBhcmFtMSIpOwotICAgICAgICBUZXN0Q2xhc3MxMSB0ZXN0T2JqZWN0ID0gbmV3IFRlc3RDbGFzczExKCk7Ci0gICAgICAgIHRlc3RPYmplY3Quc2V0UGFyYW0yKG51bGwpOwotICAgICAgICBUZXN0Q2xhc3MxMSByZXN1bHQgPSAoVGVzdENsYXNzMTEpIGdldFJldHVybk9iamVjdChwYXJhbWV0ZXIsIHRlc3RPYmplY3QpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtMigpLCBudWxsKTsKLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RUZXN0Q2xhc3MxMTkoKXsKLQotICAgICAgICBDbGFzcyB0ZXN0Q2xhc3MgPSBUZXN0Q2xhc3MxMS5jbGFzczsKLSAgICAgICAgUGFyYW1ldGVyIHBhcmFtZXRlciA9IG5ldyBQYXJhbWV0ZXIodGVzdENsYXNzLCAiUGFyYW0xIik7Ci0KLSAgICAgICAgVGVzdENsYXNzMTEgdGVzdE9iamVjdCA9IG5ldyBUZXN0Q2xhc3MxMSgpOwotICAgICAgICBMaXN0IHRlc3RMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICB0ZXN0TGlzdC5hZGQoInRlc3Qgc3RyaW5nIik7Ci0gICAgICAgIHRlc3RMaXN0LmFkZChudWxsKTsKLSAgICAgICAgdGVzdE9iamVjdC5zZXRQYXJhbTEodGVzdExpc3QpOwotCi0gICAgICAgIFNldCB0ZXN0U2V0ID0gbmV3IEhhc2hTZXQoKTsKLSAgICAgICAgdGVzdFNldC5hZGQoInRlc3Qgc3RyaW5nIik7Ci0gICAgICAgIHRlc3RTZXQuYWRkKG51bGwpOwotICAgICAgICB0ZXN0T2JqZWN0LnNldFBhcmFtMyh0ZXN0U2V0KTsKLQotICAgICAgICBUZXN0Q2xhc3MxMSByZXN1bHQgPSAoVGVzdENsYXNzMTEpIGdldFJldHVybk9iamVjdChwYXJhbWV0ZXIsIHRlc3RPYmplY3QpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtMSgpLmdldCgwKSwidGVzdCBzdHJpbmciKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTEoKS5nZXQoMSksIG51bGwpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtMigpLCBudWxsKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHQuZ2V0UGFyYW0zKCkuY29udGFpbnMoInRlc3Qgc3RyaW5nIikpOwotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdC5nZXRQYXJhbTMoKS5jb250YWlucyhudWxsKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvQ29tcGxleEFycmF5VGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvQ29tcGxleEFycmF5VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWE3NTgwLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL0NvbXBsZXhBcnJheVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLmRhdGFiaW5kOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZGF0YWJpbmQuZHRvLlRlc3RDbGFzczI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZGF0YWJpbmQuZHRvLlRlc3RDbGFzczM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZGF0YWJpbmQuZHRvLlRlc3RDbGFzczQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZGF0YWJpbmQuZHRvLlRlc3RDbGFzczc7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZGF0YWJpbmQuZHRvLlRlc3RDbGFzczk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEuUGFyYW1ldGVyOwotCi0KLXB1YmxpYyBjbGFzcyBDb21wbGV4QXJyYXlUZXN0IGV4dGVuZHMgRGF0YUJpbmRUZXN0IHsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RUZXN0Q2xhc3M3KCkgewotICAgICAgICBDbGFzcyB0ZXN0Q2xhc3MgPSBUZXN0Q2xhc3M3LmNsYXNzOwotICAgICAgICBQYXJhbWV0ZXIgcGFyYW1ldGVyID0gbmV3IFBhcmFtZXRlcih0ZXN0Q2xhc3MsICJQYXJhbTEiKTsKLSAgICAgICAgVGVzdENsYXNzNyB0ZXN0T2JqZWN0ID0gbnVsbDsKLSAgICAgICAgVGVzdENsYXNzNyByZXN1bHQgPSBudWxsOwotCi0gICAgICAgIHRlc3RPYmplY3QgPSBuZXcgVGVzdENsYXNzNygpOwotICAgICAgICByZXN1bHQgPSAoVGVzdENsYXNzNykgZ2V0UmV0dXJuT2JqZWN0KHBhcmFtZXRlciwgdGVzdE9iamVjdCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UGFyYW0xKCksIG51bGwpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtMigpLCBudWxsKTsKLQotICAgICAgICB0ZXN0T2JqZWN0ID0gbmV3IFRlc3RDbGFzczcoKTsKLSAgICAgICAgdGVzdE9iamVjdC5zZXRQYXJhbTEobmV3IFRlc3RDbGFzczRbXXtudWxsLCBudWxsfSk7Ci0gICAgICAgIHJlc3VsdCA9IChUZXN0Q2xhc3M3KSBnZXRSZXR1cm5PYmplY3QocGFyYW1ldGVyLCB0ZXN0T2JqZWN0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTEoKVswXSwgbnVsbCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UGFyYW0xKClbMV0sIG51bGwpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtMigpLCBudWxsKTsKLQotICAgICAgICBUZXN0Q2xhc3M0W10gdGVzZUNsYXNzQXJyYXkgPSBuZXcgVGVzdENsYXNzNFszXTsKLSAgICAgICAgdGVzZUNsYXNzQXJyYXlbMF0gPSBuZXcgVGVzdENsYXNzNCgpOwotICAgICAgICB0ZXNlQ2xhc3NBcnJheVswXS5zZXRQYXJhbTEobmV3IGludFtdezUsIDZ9KTsKLSAgICAgICAgdGVzZUNsYXNzQXJyYXlbMF0uc2V0UGFyYW0yKG5ldyBJbnRlZ2VyW117bmV3IEludGVnZXIoMiksIG5ldyBJbnRlZ2VyKDMpfSk7Ci0gICAgICAgIHRlc2VDbGFzc0FycmF5WzBdLnNldFBhcmFtMyhuZXcgU3RyaW5nW117InRlc3QgU3RyaW5nIn0pOwotICAgICAgICB0ZXNlQ2xhc3NBcnJheVswXS5zZXRQYXJhbTQobmV3IGZsb2F0W117NS41NmZ9KTsKLQotICAgICAgICB0ZXNlQ2xhc3NBcnJheVsxXSA9IG51bGw7Ci0KLSAgICAgICAgdGVzZUNsYXNzQXJyYXlbMl0gPSBuZXcgVGVzdENsYXNzNCgpOwotICAgICAgICB0ZXNlQ2xhc3NBcnJheVsyXS5zZXRQYXJhbTEobmV3IGludFtdezUsIDZ9KTsKLSAgICAgICAgdGVzZUNsYXNzQXJyYXlbMl0uc2V0UGFyYW0yKG5ldyBJbnRlZ2VyW117bmV3IEludGVnZXIoMiksIG5ldyBJbnRlZ2VyKDMpfSk7Ci0gICAgICAgIHRlc2VDbGFzc0FycmF5WzJdLnNldFBhcmFtMyhuZXcgU3RyaW5nW117InRlc3QgU3RyaW5nIn0pOwotICAgICAgICB0ZXNlQ2xhc3NBcnJheVsyXS5zZXRQYXJhbTQobmV3IGZsb2F0W117NS41NmZ9KTsKLQotICAgICAgICBUZXN0Q2xhc3MzIHRlc3RDbGFzczMgPSBuZXcgVGVzdENsYXNzMygpOwotICAgICAgICB0ZXN0Q2xhc3MzLnNldFBhcmFtMShuZXcgSW50ZWdlcigyKSk7Ci0gICAgICAgIHRlc3RDbGFzczMuc2V0UGFyYW0yKG5ldyBGbG9hdCg0NS42KSk7Ci0gICAgICAgIHRlc3RDbGFzczMuc2V0UGFyYW0zKG5ldyBEb3VibGUoMykpOwotICAgICAgICB0ZXN0Q2xhc3MzLnNldFBhcmFtNCgidGVzdCBTdHJpbmciKTsKLQotCi0gICAgICAgIHRlc3RPYmplY3QgPSBuZXcgVGVzdENsYXNzNygpOwotICAgICAgICB0ZXN0T2JqZWN0LnNldFBhcmFtMSh0ZXNlQ2xhc3NBcnJheSk7Ci0gICAgICAgIHRlc3RPYmplY3Quc2V0UGFyYW0yKHRlc3RDbGFzczMpOwotICAgICAgICByZXN1bHQgPSAoVGVzdENsYXNzNykgZ2V0UmV0dXJuT2JqZWN0KHBhcmFtZXRlciwgdGVzdE9iamVjdCk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTEoKVswXS5nZXRQYXJhbTEoKVswXSwgNSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UGFyYW0xKClbMF0uZ2V0UGFyYW0xKClbMV0sIDYpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtMSgpWzBdLmdldFBhcmFtMigpWzBdLmludFZhbHVlKCksIDIpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtMSgpWzBdLmdldFBhcmFtMigpWzFdLmludFZhbHVlKCksIDMpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtMSgpWzBdLmdldFBhcmFtMygpWzBdLCAidGVzdCBTdHJpbmciKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHQuZ2V0UGFyYW0xKClbMF0uZ2V0UGFyYW00KClbMF0gPT0gNS41NmYpOwotCi0gICAgICAgIGFzc2VydE51bGwocmVzdWx0LmdldFBhcmFtMSgpWzFdKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtMSgpWzJdLmdldFBhcmFtMSgpWzBdLCA1KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTEoKVsyXS5nZXRQYXJhbTEoKVsxXSwgNik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UGFyYW0xKClbMl0uZ2V0UGFyYW0yKClbMF0uaW50VmFsdWUoKSwgMik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UGFyYW0xKClbMl0uZ2V0UGFyYW0yKClbMV0uaW50VmFsdWUoKSwgMyk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UGFyYW0xKClbMl0uZ2V0UGFyYW0zKClbMF0sICJ0ZXN0IFN0cmluZyIpOwotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdC5nZXRQYXJhbTEoKVsyXS5nZXRQYXJhbTQoKVswXSA9PSA1LjU2Zik7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTIoKS5nZXRQYXJhbTEoKS5pbnRWYWx1ZSgpLCAyKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHQuZ2V0UGFyYW0yKCkuZ2V0UGFyYW0yKCkuZmxvYXRWYWx1ZSgpID09IDQ1LjZmKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHQuZ2V0UGFyYW0yKCkuZ2V0UGFyYW0zKCkuZG91YmxlVmFsdWUoKSA9PSAzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTIoKS5nZXRQYXJhbTQoKSwgInRlc3QgU3RyaW5nIik7Ci0KLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDbGFzczkxKCkgewotICAgICAgICBDbGFzcyB0ZXN0Q2xhc3MgPSBUZXN0Q2xhc3M5LmNsYXNzOwotICAgICAgICBQYXJhbWV0ZXIgcGFyYW1ldGVyID0gbmV3IFBhcmFtZXRlcih0ZXN0Q2xhc3MsICJQYXJhbTEiKTsKLQotICAgICAgICBUZXN0Q2xhc3M5IHRlc3RDbGFzczkgPSBuZXcgVGVzdENsYXNzOSgpOwotCi0gICAgICAgIFRlc3RDbGFzczJbXSB0ZXN0Q2xhc3MyID0gbmV3IFRlc3RDbGFzczJbM107Ci0gICAgICAgIHRlc3RDbGFzczJbMF0gPSBuZXcgVGVzdENsYXNzMigpOwotICAgICAgICB0ZXN0Q2xhc3MyWzBdLnNldFBhcmFtMSg1KTsKLSAgICAgICAgdGVzdENsYXNzMlswXS5zZXRQYXJhbTIoMjMuNDVmKTsKLSAgICAgICAgdGVzdENsYXNzMlswXS5zZXRQYXJhbTMoNDUpOwotCi0gICAgICAgIHRlc3RDbGFzczJbMV0gPSBuZXcgVGVzdENsYXNzMigpOwotICAgICAgICB0ZXN0Q2xhc3MyWzFdLnNldFBhcmFtMSg1KTsKLSAgICAgICAgdGVzdENsYXNzMlsxXS5zZXRQYXJhbTIoMjMuNDVmKTsKLSAgICAgICAgdGVzdENsYXNzMlsxXS5zZXRQYXJhbTMoNDUpOwotCi0gICAgICAgIHRlc3RDbGFzczJbMl0gPSBuZXcgVGVzdENsYXNzMigpOwotICAgICAgICB0ZXN0Q2xhc3MyWzJdLnNldFBhcmFtMSg1KTsKLSAgICAgICAgdGVzdENsYXNzMlsyXS5zZXRQYXJhbTIoMjMuNDVmKTsKLSAgICAgICAgdGVzdENsYXNzMlsyXS5zZXRQYXJhbTMoNDUpOwotCi0gICAgICAgIHRlc3RDbGFzczkuc2V0UGFyYW0xKHRlc3RDbGFzczIpOwotCi0gICAgICAgIFRlc3RDbGFzczkgcmV0dXJuT2JqZWN0ID0gKFRlc3RDbGFzczkpIGdldFJldHVybk9iamVjdChwYXJhbWV0ZXIsIHRlc3RDbGFzczkpOwotCi0gICAgICAgIGFzc2VydEVxdWFscyhyZXR1cm5PYmplY3QuZ2V0UGFyYW0xKClbMF0uZ2V0UGFyYW0xKCksIDUpOwotICAgICAgICBhc3NlcnRUcnVlKHJldHVybk9iamVjdC5nZXRQYXJhbTEoKVswXS5nZXRQYXJhbTIoKSA9PSAyMy40NWYpOwotICAgICAgICBhc3NlcnRUcnVlKHJldHVybk9iamVjdC5nZXRQYXJhbTEoKVswXS5nZXRQYXJhbTMoKSA9PSA0NSk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldHVybk9iamVjdC5nZXRQYXJhbTEoKVsxXS5nZXRQYXJhbTEoKSwgNSk7Ci0gICAgICAgIGFzc2VydFRydWUocmV0dXJuT2JqZWN0LmdldFBhcmFtMSgpWzFdLmdldFBhcmFtMigpID09IDIzLjQ1Zik7Ci0gICAgICAgIGFzc2VydFRydWUocmV0dXJuT2JqZWN0LmdldFBhcmFtMSgpWzFdLmdldFBhcmFtMygpID09IDQ1LjBkKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMocmV0dXJuT2JqZWN0LmdldFBhcmFtMSgpWzJdLmdldFBhcmFtMSgpLCA1KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXR1cm5PYmplY3QuZ2V0UGFyYW0xKClbMl0uZ2V0UGFyYW0yKCkgPT0gMjMuNDVmKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXR1cm5PYmplY3QuZ2V0UGFyYW0xKClbMl0uZ2V0UGFyYW0zKCkgPT0gNDUuMGQpOwotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENsYXNzOTIoKSB7Ci0gICAgICAgIENsYXNzIHRlc3RDbGFzcyA9IFRlc3RDbGFzczkuY2xhc3M7Ci0gICAgICAgIFBhcmFtZXRlciBwYXJhbWV0ZXIgPSBuZXcgUGFyYW1ldGVyKHRlc3RDbGFzcywgIlBhcmFtMSIpOwotCi0gICAgICAgIFRlc3RDbGFzczkgdGVzdENsYXNzOSA9IG5ldyBUZXN0Q2xhc3M5KCk7Ci0KLSAgICAgICAgVGVzdENsYXNzMltdIHRlc3RDbGFzczIgPSBuZXcgVGVzdENsYXNzMlszXTsKLSAgICAgICAgdGVzdENsYXNzMlswXSA9IG5ldyBUZXN0Q2xhc3MyKCk7Ci0gICAgICAgIHRlc3RDbGFzczJbMF0uc2V0UGFyYW0xKDUpOwotICAgICAgICB0ZXN0Q2xhc3MyWzBdLnNldFBhcmFtMigyMy40NWYpOwotICAgICAgICB0ZXN0Q2xhc3MyWzBdLnNldFBhcmFtMyg0NSk7Ci0KLSAgICAgICAgdGVzdENsYXNzMlsxXSA9IG51bGw7Ci0KLSAgICAgICAgdGVzdENsYXNzMlsyXSA9IG5ldyBUZXN0Q2xhc3MyKCk7Ci0gICAgICAgIHRlc3RDbGFzczJbMl0uc2V0UGFyYW0xKDUpOwotICAgICAgICB0ZXN0Q2xhc3MyWzJdLnNldFBhcmFtMigyMy40NWYpOwotICAgICAgICB0ZXN0Q2xhc3MyWzJdLnNldFBhcmFtMyg0NSk7Ci0KLSAgICAgICAgdGVzdENsYXNzOS5zZXRQYXJhbTEodGVzdENsYXNzMik7Ci0KLSAgICAgICAgVGVzdENsYXNzOSByZXR1cm5PYmplY3QgPSAoVGVzdENsYXNzOSkgZ2V0UmV0dXJuT2JqZWN0KHBhcmFtZXRlciwgdGVzdENsYXNzOSk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldHVybk9iamVjdC5nZXRQYXJhbTEoKVswXS5nZXRQYXJhbTEoKSwgNSk7Ci0gICAgICAgIGFzc2VydFRydWUocmV0dXJuT2JqZWN0LmdldFBhcmFtMSgpWzBdLmdldFBhcmFtMigpID09IDIzLjQ1Zik7Ci0gICAgICAgIGFzc2VydFRydWUocmV0dXJuT2JqZWN0LmdldFBhcmFtMSgpWzBdLmdldFBhcmFtMygpID09IDQ1KTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMocmV0dXJuT2JqZWN0LmdldFBhcmFtMSgpWzFdLG51bGwpOwotCi0gICAgICAgIGFzc2VydEVxdWFscyhyZXR1cm5PYmplY3QuZ2V0UGFyYW0xKClbMl0uZ2V0UGFyYW0xKCksIDUpOwotICAgICAgICBhc3NlcnRUcnVlKHJldHVybk9iamVjdC5nZXRQYXJhbTEoKVsyXS5nZXRQYXJhbTIoKSA9PSAyMy40NWYpOwotICAgICAgICBhc3NlcnRUcnVlKHJldHVybk9iamVjdC5nZXRQYXJhbTEoKVsyXS5nZXRQYXJhbTMoKSA9PSA0NS4wZCk7Ci0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL0NvbXBsZXhEYXRhQmluZFRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL0NvbXBsZXhEYXRhQmluZFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjI2MGM4Ni4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kYXRhYmluZC9Db21wbGV4RGF0YUJpbmRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLmRhdGFiaW5kOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZGF0YWJpbmQuZHRvLlRlc3RDbGFzczE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZGF0YWJpbmQuZHRvLlRlc3RDbGFzczI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZGF0YWJpbmQuZHRvLlRlc3RDbGFzczU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZGF0YWJpbmQuZHRvLlRlc3RDbGFzczY7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEuUGFyYW1ldGVyOwotCi0KLXB1YmxpYyBjbGFzcyBDb21wbGV4RGF0YUJpbmRUZXN0IGV4dGVuZHMgRGF0YUJpbmRUZXN0IHsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDbGFzczUoKXsKLQotICAgICAgICBDbGFzcyB0ZXN0Q2xhc3MgPSBUZXN0Q2xhc3M1LmNsYXNzOwotICAgICAgICBQYXJhbWV0ZXIgcGFyYW1ldGVyID0gbmV3IFBhcmFtZXRlcih0ZXN0Q2xhc3MsIlBhcmFtMSIpOwotICAgICAgICBUZXN0Q2xhc3M1IHRlc3RPYmplY3QgPSBuZXcgVGVzdENsYXNzNSgpOwotCi0gICAgICAgIFRlc3RDbGFzczUgcmVzdWx0ID0gbnVsbDsKLSAgICAgICAgcmVzdWx0ID0gKFRlc3RDbGFzczUpIGdldFJldHVybk9iamVjdChwYXJhbWV0ZXIsdGVzdE9iamVjdCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UGFyYW0xKCksbnVsbCk7Ci0KLSAgICAgICAgdGVzdE9iamVjdC5zZXRQYXJhbTEobmV3IFRlc3RDbGFzczEoKSk7Ci0gICAgICAgIHJlc3VsdCA9IChUZXN0Q2xhc3M1KSBnZXRSZXR1cm5PYmplY3QocGFyYW1ldGVyLHRlc3RPYmplY3QpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3VsdC5nZXRQYXJhbTEoKSk7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xhc3M2KCl7Ci0gICAgICAgIENsYXNzIHRlc3RDbGFzcyA9IFRlc3RDbGFzczYuY2xhc3M7Ci0gICAgICAgIFBhcmFtZXRlciBwYXJhbWV0ZXIgPSBuZXcgUGFyYW1ldGVyKHRlc3RDbGFzcywiUGFyYW0xIik7Ci0KLSAgICAgICAgVGVzdENsYXNzNiByZXN1bHQgPSBudWxsOwotCi0gICAgICAgIFRlc3RDbGFzczYgdGVzdE9iamVjdCA9IG5ldyBUZXN0Q2xhc3M2KCk7Ci0gICAgICAgIHJlc3VsdCA9IChUZXN0Q2xhc3M2KSBnZXRSZXR1cm5PYmplY3QocGFyYW1ldGVyLHRlc3RPYmplY3QpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtMSgpLG51bGwpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtMigpLG51bGwpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtMygpLDApOwotCi0gICAgICAgIHRlc3RPYmplY3QgPSBuZXcgVGVzdENsYXNzNigpOwotICAgICAgICB0ZXN0T2JqZWN0LnNldFBhcmFtMShuZXcgVGVzdENsYXNzMigpKTsKLSAgICAgICAgdGVzdE9iamVjdC5zZXRQYXJhbTIoInRlc3QgU3RyaW5nIik7Ci0gICAgICAgIHRlc3RPYmplY3Quc2V0UGFyYW0zKDUpOwotICAgICAgICByZXN1bHQgPSAoVGVzdENsYXNzNikgZ2V0UmV0dXJuT2JqZWN0KHBhcmFtZXRlcix0ZXN0T2JqZWN0KTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXN1bHQuZ2V0UGFyYW0xKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtMigpLCJ0ZXN0IFN0cmluZyIpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtMygpLDUpOwotCi0gICAgICAgIHRlc3RPYmplY3QgPSBuZXcgVGVzdENsYXNzNigpOwotCi0gICAgICAgIHRlc3RPYmplY3Quc2V0UGFyYW0xKG5ldyBUZXN0Q2xhc3MyKCkpOwotICAgICAgICB0ZXN0T2JqZWN0LmdldFBhcmFtMSgpLnNldFBhcmFtMSg1KTsKLSAgICAgICAgdGVzdE9iamVjdC5nZXRQYXJhbTEoKS5zZXRQYXJhbTIoMzQuNWYpOwotICAgICAgICB0ZXN0T2JqZWN0LmdldFBhcmFtMSgpLnNldFBhcmFtMygzMi41KTsKLSAgICAgICAgdGVzdE9iamVjdC5zZXRQYXJhbTIoInRlc3QgU3RyaW5nIik7Ci0gICAgICAgIHRlc3RPYmplY3Quc2V0UGFyYW0zKDUpOwotICAgICAgICByZXN1bHQgPSAoVGVzdENsYXNzNikgZ2V0UmV0dXJuT2JqZWN0KHBhcmFtZXRlcix0ZXN0T2JqZWN0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTEoKS5nZXRQYXJhbTEoKSw1KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHQuZ2V0UGFyYW0xKCkuZ2V0UGFyYW0yKCkgPT0gMzQuNWYpOwotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdC5nZXRQYXJhbTEoKS5nZXRQYXJhbTMoKSA9PSAzMi41KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTIoKSwidGVzdCBTdHJpbmciKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTMoKSw1KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kYXRhYmluZC9Db21wbGV4UmVxdWVzdFJlc3BvbnNlVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvQ29tcGxleFJlcXVlc3RSZXNwb25zZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjEwYzc3YS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kYXRhYmluZC9Db21wbGV4UmVxdWVzdFJlc3BvbnNlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5ybWkuZGF0YWJpbmQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5kYXRhYmluZC5kdG8uVGVzdENsYXNzMTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5kYXRhYmluZC5kdG8uVGVzdENsYXNzMjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5kYXRhYmluZC5zZXJ2aWNlLlNlcnZpY2UyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLm1ldGFkYXRhLk9wZXJhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLQotcHVibGljIGNsYXNzIENvbXBsZXhSZXF1ZXN0UmVzcG9uc2VUZXN0IGV4dGVuZHMgUmVxdWVzdFJlc3BvbnNlVGVzdCB7Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0aGlzLnNlcnZpY2VDbGFzcyA9IFNlcnZpY2UyLmNsYXNzOwotICAgICAgICB0aGlzLnNlcnZpY2VPYmplY3QgPSBuZXcgU2VydmljZTIoKTsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kMSgpIHsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gZmlyc3QgY3JlYXRlIHNlcnZpY2UgZGF0YQotCi0gICAgICAgICAgICBPcGVyYXRpb24gb3BlcmF0aW9uID0gdGhpcy5zZXJ2aWNlLmdldE9wZXJhdGlvbigibWV0aG9kMSIpOwotICAgICAgICAgICAgLy8gZ2V0IG9iamVjdHMgYWZ0ZXIgc2VyaWFsaXphdGlvbiBhbmQgZGVzZXJpYWxpemF0aW9uLgotICAgICAgICAgICAgLy8gdGhpcyByZXR1cm5lZCBvYmplY3RzIG11c3RiZSBpZGVudGljYWwgd2l0aCB0aGUgb3JpZ2luYWwgYXJyYXkgbGlzdCBlbGVtZW50cwotICAgICAgICAgICAgTGlzdCBpbnB1dE9iamVjdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICBpbnB1dE9iamVjdHMuYWRkKG5ldyBUZXN0Q2xhc3MxKCkpOwotICAgICAgICAgICAgT2JqZWN0W10gb2JqZWN0cyA9IGdldElucHV0T2JqZWN0KGlucHV0T2JqZWN0cywgb3BlcmF0aW9uKTsKLQotICAgICAgICAgICAgVGVzdENsYXNzMSBvYmplY3QgPSAoVGVzdENsYXNzMSkgb3BlcmF0aW9uLmdldEphdmFNZXRob2QoKS5pbnZva2UodGhpcy5zZXJ2aWNlT2JqZWN0LCBvYmplY3RzKTsKLSAgICAgICAgICAgIFRlc3RDbGFzczEgcmV0dXJuT2JqZWN0ID0gKFRlc3RDbGFzczEpIGdldFJldHVybk9iamVjdChvYmplY3QsIG9wZXJhdGlvbik7Ci0KLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwocmV0dXJuT2JqZWN0KTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNZXRob2QyMSgpIHsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gZmlyc3QgY3JlYXRlIHNlcnZpY2UgZGF0YQotCi0gICAgICAgICAgICBPcGVyYXRpb24gb3BlcmF0aW9uID0gdGhpcy5zZXJ2aWNlLmdldE9wZXJhdGlvbigibWV0aG9kMiIpOwotICAgICAgICAgICAgLy8gZ2V0IG9iamVjdHMgYWZ0ZXIgc2VyaWFsaXphdGlvbiBhbmQgZGVzZXJpYWxpemF0aW9uLgotICAgICAgICAgICAgLy8gdGhpcyByZXR1cm5lZCBvYmplY3RzIG11c3RiZSBpZGVudGljYWwgd2l0aCB0aGUgb3JpZ2luYWwgYXJyYXkgbGlzdCBlbGVtZW50cwotICAgICAgICAgICAgTGlzdCBpbnB1dE9iamVjdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICBpbnB1dE9iamVjdHMuYWRkKG5ldyBUZXN0Q2xhc3MxW117bmV3IFRlc3RDbGFzczEoKSwgbmV3IFRlc3RDbGFzczEoKX0pOwotICAgICAgICAgICAgT2JqZWN0W10gb2JqZWN0cyA9IGdldElucHV0T2JqZWN0KGlucHV0T2JqZWN0cywgb3BlcmF0aW9uKTsKLQotICAgICAgICAgICAgVGVzdENsYXNzMVtdIG9iamVjdCA9IChUZXN0Q2xhc3MxW10pIG9wZXJhdGlvbi5nZXRKYXZhTWV0aG9kKCkuaW52b2tlKHRoaXMuc2VydmljZU9iamVjdCwgb2JqZWN0cyk7Ci0gICAgICAgICAgICBUZXN0Q2xhc3MxW10gcmV0dXJuT2JqZWN0ID0gKFRlc3RDbGFzczFbXSkgZ2V0UmV0dXJuT2JqZWN0KG9iamVjdCwgb3BlcmF0aW9uKTsKLQotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXR1cm5PYmplY3RbMF0pOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXR1cm5PYmplY3RbMV0pOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNZXRob2QyMigpIHsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gZmlyc3QgY3JlYXRlIHNlcnZpY2UgZGF0YQotCi0gICAgICAgICAgICBPcGVyYXRpb24gb3BlcmF0aW9uID0gdGhpcy5zZXJ2aWNlLmdldE9wZXJhdGlvbigibWV0aG9kMiIpOwotICAgICAgICAgICAgLy8gZ2V0IG9iamVjdHMgYWZ0ZXIgc2VyaWFsaXphdGlvbiBhbmQgZGVzZXJpYWxpemF0aW9uLgotICAgICAgICAgICAgLy8gdGhpcyByZXR1cm5lZCBvYmplY3RzIG11c3RiZSBpZGVudGljYWwgd2l0aCB0aGUgb3JpZ2luYWwgYXJyYXkgbGlzdCBlbGVtZW50cwotICAgICAgICAgICAgTGlzdCBpbnB1dE9iamVjdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICBpbnB1dE9iamVjdHMuYWRkKG5ldyBUZXN0Q2xhc3MxW117bmV3IFRlc3RDbGFzczEoKSwgbnVsbCwgbmV3IFRlc3RDbGFzczEoKX0pOwotICAgICAgICAgICAgT2JqZWN0W10gb2JqZWN0cyA9IGdldElucHV0T2JqZWN0KGlucHV0T2JqZWN0cywgb3BlcmF0aW9uKTsKLQotICAgICAgICAgICAgVGVzdENsYXNzMVtdIG9iamVjdCA9IChUZXN0Q2xhc3MxW10pIG9wZXJhdGlvbi5nZXRKYXZhTWV0aG9kKCkuaW52b2tlKHRoaXMuc2VydmljZU9iamVjdCwgb2JqZWN0cyk7Ci0gICAgICAgICAgICBUZXN0Q2xhc3MxW10gcmV0dXJuT2JqZWN0ID0gKFRlc3RDbGFzczFbXSkgZ2V0UmV0dXJuT2JqZWN0KG9iamVjdCwgb3BlcmF0aW9uKTsKLQotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXR1cm5PYmplY3RbMF0pOwotICAgICAgICAgICAgYXNzZXJ0TnVsbChyZXR1cm5PYmplY3RbMV0pOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXR1cm5PYmplY3RbMl0pOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNZXRob2QzMSgpIHsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gZmlyc3QgY3JlYXRlIHNlcnZpY2UgZGF0YQotCi0gICAgICAgICAgICBPcGVyYXRpb24gb3BlcmF0aW9uID0gdGhpcy5zZXJ2aWNlLmdldE9wZXJhdGlvbigibWV0aG9kMyIpOwotICAgICAgICAgICAgLy8gZ2V0IG9iamVjdHMgYWZ0ZXIgc2VyaWFsaXphdGlvbiBhbmQgZGVzZXJpYWxpemF0aW9uLgotICAgICAgICAgICAgLy8gdGhpcyByZXR1cm5lZCBvYmplY3RzIG11c3RiZSBpZGVudGljYWwgd2l0aCB0aGUgb3JpZ2luYWwgYXJyYXkgbGlzdCBlbGVtZW50cwotICAgICAgICAgICAgTGlzdCBpbnB1dE9iamVjdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICBUZXN0Q2xhc3MyIHRlc3RDbGFzczIgPSBuZXcgVGVzdENsYXNzMigpOwotICAgICAgICAgICAgdGVzdENsYXNzMi5zZXRQYXJhbTEoMSk7Ci0gICAgICAgICAgICB0ZXN0Q2xhc3MyLnNldFBhcmFtMigzNC41Zik7Ci0gICAgICAgICAgICB0ZXN0Q2xhc3MyLnNldFBhcmFtMygyMy41KTsKLSAgICAgICAgICAgIGlucHV0T2JqZWN0cy5hZGQodGVzdENsYXNzMik7Ci0gICAgICAgICAgICBPYmplY3RbXSBvYmplY3RzID0gZ2V0SW5wdXRPYmplY3QoaW5wdXRPYmplY3RzLCBvcGVyYXRpb24pOwotCi0gICAgICAgICAgICBUZXN0Q2xhc3MyIG9iamVjdCA9IChUZXN0Q2xhc3MyKSBvcGVyYXRpb24uZ2V0SmF2YU1ldGhvZCgpLmludm9rZSh0aGlzLnNlcnZpY2VPYmplY3QsIG9iamVjdHMpOwotICAgICAgICAgICAgVGVzdENsYXNzMiByZXR1cm5PYmplY3QgPSAoVGVzdENsYXNzMikgZ2V0UmV0dXJuT2JqZWN0KG9iamVjdCwgb3BlcmF0aW9uKTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJldHVybk9iamVjdC5nZXRQYXJhbTEoKSwgMSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHJldHVybk9iamVjdC5nZXRQYXJhbTIoKSA9PSAzNC41Zik7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHJldHVybk9iamVjdC5nZXRQYXJhbTMoKSA9PSAyMy41KTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNZXRob2QzMigpIHsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gZmlyc3QgY3JlYXRlIHNlcnZpY2UgZGF0YQotCi0gICAgICAgICAgICBPcGVyYXRpb24gb3BlcmF0aW9uID0gdGhpcy5zZXJ2aWNlLmdldE9wZXJhdGlvbigibWV0aG9kMyIpOwotICAgICAgICAgICAgLy8gZ2V0IG9iamVjdHMgYWZ0ZXIgc2VyaWFsaXphdGlvbiBhbmQgZGVzZXJpYWxpemF0aW9uLgotICAgICAgICAgICAgLy8gdGhpcyByZXR1cm5lZCBvYmplY3RzIG11c3RiZSBpZGVudGljYWwgd2l0aCB0aGUgb3JpZ2luYWwgYXJyYXkgbGlzdCBlbGVtZW50cwotICAgICAgICAgICAgTGlzdCBpbnB1dE9iamVjdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICBpbnB1dE9iamVjdHMuYWRkKG51bGwpOwotICAgICAgICAgICAgT2JqZWN0W10gb2JqZWN0cyA9IGdldElucHV0T2JqZWN0KGlucHV0T2JqZWN0cywgb3BlcmF0aW9uKTsKLQotICAgICAgICAgICAgVGVzdENsYXNzMiBvYmplY3QgPSAoVGVzdENsYXNzMikgb3BlcmF0aW9uLmdldEphdmFNZXRob2QoKS5pbnZva2UodGhpcy5zZXJ2aWNlT2JqZWN0LCBvYmplY3RzKTsKLSAgICAgICAgICAgIFRlc3RDbGFzczIgcmV0dXJuT2JqZWN0ID0gKFRlc3RDbGFzczIpIGdldFJldHVybk9iamVjdChvYmplY3QsIG9wZXJhdGlvbik7Ci0KLSAgICAgICAgICAgIGFzc2VydE51bGwocmV0dXJuT2JqZWN0KTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNZXRob2Q0MSgpIHsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gZmlyc3QgY3JlYXRlIHNlcnZpY2UgZGF0YQotCi0gICAgICAgICAgICBPcGVyYXRpb24gb3BlcmF0aW9uID0gdGhpcy5zZXJ2aWNlLmdldE9wZXJhdGlvbigibWV0aG9kNCIpOwotICAgICAgICAgICAgLy8gZ2V0IG9iamVjdHMgYWZ0ZXIgc2VyaWFsaXphdGlvbiBhbmQgZGVzZXJpYWxpemF0aW9uLgotICAgICAgICAgICAgLy8gdGhpcyByZXR1cm5lZCBvYmplY3RzIG11c3RiZSBpZGVudGljYWwgd2l0aCB0aGUgb3JpZ2luYWwgYXJyYXkgbGlzdCBlbGVtZW50cwotICAgICAgICAgICAgTGlzdCBpbnB1dE9iamVjdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgICAgIFRlc3RDbGFzczIgdGVzdENsYXNzMjEgPSBuZXcgVGVzdENsYXNzMigpOwotICAgICAgICAgICAgdGVzdENsYXNzMjEuc2V0UGFyYW0xKDEpOwotICAgICAgICAgICAgdGVzdENsYXNzMjEuc2V0UGFyYW0yKDM0LjVmKTsKLSAgICAgICAgICAgIHRlc3RDbGFzczIxLnNldFBhcmFtMygyMy41KTsKLQotICAgICAgICAgICAgVGVzdENsYXNzMiB0ZXN0Q2xhc3MyMiA9IG5ldyBUZXN0Q2xhc3MyKCk7Ci0gICAgICAgICAgICB0ZXN0Q2xhc3MyMi5zZXRQYXJhbTEoMSk7Ci0gICAgICAgICAgICB0ZXN0Q2xhc3MyMi5zZXRQYXJhbTIoMzQuNWYpOwotICAgICAgICAgICAgdGVzdENsYXNzMjIuc2V0UGFyYW0zKDIzLjUpOwotCi0gICAgICAgICAgICBUZXN0Q2xhc3MyIHRlc3RDbGFzczIzID0gbmV3IFRlc3RDbGFzczIoKTsKLSAgICAgICAgICAgIHRlc3RDbGFzczIzLnNldFBhcmFtMSgxKTsKLSAgICAgICAgICAgIHRlc3RDbGFzczIzLnNldFBhcmFtMigzNC41Zik7Ci0gICAgICAgICAgICB0ZXN0Q2xhc3MyMy5zZXRQYXJhbTMoMjMuNSk7Ci0KLSAgICAgICAgICAgIGlucHV0T2JqZWN0cy5hZGQobmV3IFRlc3RDbGFzczJbXXt0ZXN0Q2xhc3MyMSx0ZXN0Q2xhc3MyMix0ZXN0Q2xhc3MyM30pOwotICAgICAgICAgICAgT2JqZWN0W10gb2JqZWN0cyA9IGdldElucHV0T2JqZWN0KGlucHV0T2JqZWN0cywgb3BlcmF0aW9uKTsKLQotICAgICAgICAgICAgVGVzdENsYXNzMltdIG9iamVjdCA9IChUZXN0Q2xhc3MyW10pIG9wZXJhdGlvbi5nZXRKYXZhTWV0aG9kKCkuaW52b2tlKHRoaXMuc2VydmljZU9iamVjdCwgb2JqZWN0cyk7Ci0gICAgICAgICAgICBUZXN0Q2xhc3MyW10gcmV0dXJuT2JqZWN0ID0gKFRlc3RDbGFzczJbXSkgZ2V0UmV0dXJuT2JqZWN0KG9iamVjdCwgb3BlcmF0aW9uKTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJldHVybk9iamVjdFswXS5nZXRQYXJhbTEoKSwgMSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHJldHVybk9iamVjdFswXS5nZXRQYXJhbTIoKSA9PSAzNC41Zik7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHJldHVybk9iamVjdFswXS5nZXRQYXJhbTMoKSA9PSAyMy41KTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJldHVybk9iamVjdFsxXS5nZXRQYXJhbTEoKSwgMSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHJldHVybk9iamVjdFsxXS5nZXRQYXJhbTIoKSA9PSAzNC41Zik7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHJldHVybk9iamVjdFsxXS5nZXRQYXJhbTMoKSA9PSAyMy41KTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJldHVybk9iamVjdFsyXS5nZXRQYXJhbTEoKSwgMSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHJldHVybk9iamVjdFsyXS5nZXRQYXJhbTIoKSA9PSAzNC41Zik7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHJldHVybk9iamVjdFsyXS5nZXRQYXJhbTMoKSA9PSAyMy41KTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvQ29uZmlnT2JqZWN0VGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvQ29uZmlnT2JqZWN0VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjkzNzAwLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL0NvbmZpZ09iamVjdFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLmRhdGFiaW5kOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS51dGlsLlN0QVhVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5kZXBsb3kuY29uZmlnLkNsYXNzSW5mbzsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5kZXBsb3kuY29uZmlnLkNvbmZpZzsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5kZXBsb3kuY29uZmlnLkN1c3RvbUNsYXNzSW5mbzsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5kZXBsb3kuY29uZmlnLkV4dGVuc2lvbkNsYXNzZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZGVwbG95LmNvbmZpZy5GaWVsZEluZm87Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZGVwbG95LmNvbmZpZy5QYWNrYWdlVG9OYW1lc3BhY2VNYXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZGVwbG95LmNvbmZpZy5QYWNrYWdlVG9OYW1lc3BhY2VNYXBpbmdzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmRlcGxveS5jb25maWcuU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5kZXBsb3kuY29uZmlnLlNlcnZpY2VzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmV4Y2VwdGlvbi5NZXRhRGF0YVBvcHVsYXRlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmV4Y2VwdGlvbi5TY2hlbWFHZW5lcmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmV4Y2VwdGlvbi5YbWxQYXJzaW5nRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmV4Y2VwdGlvbi5YbWxTZXJpYWxpemluZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS5QYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkudXRpbC5OYW1lc3BhY2VQcmVmaXg7Ci0KLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotCi0KLXB1YmxpYyBjbGFzcyBDb25maWdPYmplY3RUZXN0IGV4dGVuZHMgRGF0YUJpbmRUZXN0IHsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDb25maWdPYmplY3QoKSB7Ci0KLSAgICAgICAgQ29uZmlnIGNvbmZpZyA9IG5ldyBDb25maWcoKTsKLQotICAgICAgICAvLyBhZGRpbmcgdXN0b20gbWFwcGluZ3MKLSAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5ybWkuY29uZmlnLkNsYXNzSW5mbyBjbGFzc0luZm8gPSBuZXcgb3JnLmFwYWNoZS5heGlzMi5ybWkuY29uZmlnLkNsYXNzSW5mbyhGaWVsZEluZm8uY2xhc3MpOwotICAgICAgICBjbGFzc0luZm8uYWRkRmllbGRJbmZvKG5ldyBvcmcuYXBhY2hlLmF4aXMyLnJtaS5jb25maWcuRmllbGRJbmZvKCJqYXZhTmFtZSIsbnVsbCxmYWxzZSkpOwotICAgICAgICBjbGFzc0luZm8uYWRkRmllbGRJbmZvKG5ldyBvcmcuYXBhY2hlLmF4aXMyLnJtaS5jb25maWcuRmllbGRJbmZvKCJ4bWxOYW1lIixudWxsLGZhbHNlKSk7Ci0gICAgICAgIGNsYXNzSW5mby5hZGRGaWVsZEluZm8obmV3IG9yZy5hcGFjaGUuYXhpczIucm1pLmNvbmZpZy5GaWVsZEluZm8oImVsZW1lbnQiLCJpc0VsZW1lbnQiLGZhbHNlKSk7Ci0gICAgICAgIGNvbmZpZ3VyYXRvci5hZGRDbGFzc0luZm8oY2xhc3NJbmZvKTsKLQotICAgICAgICBjbGFzc0luZm8gPSBuZXcgb3JnLmFwYWNoZS5heGlzMi5ybWkuY29uZmlnLkNsYXNzSW5mbyhDbGFzc0luZm8uY2xhc3MpOwotICAgICAgICBjbGFzc0luZm8uYWRkRmllbGRJbmZvKG5ldyBvcmcuYXBhY2hlLmF4aXMyLnJtaS5jb25maWcuRmllbGRJbmZvKCJjbGFzc05hbWUiLG51bGwsZmFsc2UpKTsKLSAgICAgICAgY29uZmlndXJhdG9yLmFkZENsYXNzSW5mbyhjbGFzc0luZm8pOwotCi0KLQotICAgICAgICBTZXJ2aWNlW10gc2VydmljZXMgPSBuZXcgU2VydmljZVsyXTsKLSAgICAgICAgc2VydmljZXNbMF0gPSBuZXcgU2VydmljZSgpOwotICAgICAgICBzZXJ2aWNlc1swXS5zZXRTZXJ2aWNlQ2xhc3MoIlNlcnZpY2UxIik7Ci0KLSAgICAgICAgc2VydmljZXNbMV0gPSBuZXcgU2VydmljZSgpOwotICAgICAgICBzZXJ2aWNlc1sxXS5zZXRTZXJ2aWNlQ2xhc3MoIlNlcnZpY2UyIik7Ci0KLSAgICAgICAgU2VydmljZXMgdGVzdFNlcnZpY2VzID0gbmV3IFNlcnZpY2VzKCk7Ci0gICAgICAgIHRlc3RTZXJ2aWNlcy5zZXRTZXJ2aWNlKHNlcnZpY2VzKTsKLSAgICAgICAgY29uZmlnLnNldFNlcnZpY2VzKHRlc3RTZXJ2aWNlcyk7Ci0KLSAgICAgICAgRXh0ZW5zaW9uQ2xhc3NlcyBleHRlbnNpb25DbGFzc2VzID0gbmV3IEV4dGVuc2lvbkNsYXNzZXMoKTsKLSAgICAgICAgZXh0ZW5zaW9uQ2xhc3Nlcy5zZXRFeHRlbnNpb25DbGFzcyhuZXcgU3RyaW5nW117ImV4dGVuc2lvbjEiLCAiZXh0ZW5zaW9uMiJ9KTsKLSAgICAgICAgY29uZmlnLnNldEV4dGVuc2lvbkNsYXNzZXMoZXh0ZW5zaW9uQ2xhc3Nlcyk7Ci0KLSAgICAgICAgUGFja2FnZVRvTmFtZXNwYWNlTWFwaW5ncyBwYWNrYWdlVG9OYW1lc3BhY2VNYXBpbmdzID0gbmV3IFBhY2thZ2VUb05hbWVzcGFjZU1hcGluZ3MoKTsKLQotICAgICAgICBQYWNrYWdlVG9OYW1lc3BhY2VNYXBbXSBwYWNrYWdlVG9OYW1lc3BhY2VNYXBzID0gbmV3IFBhY2thZ2VUb05hbWVzcGFjZU1hcFsyXTsKLSAgICAgICAgcGFja2FnZVRvTmFtZXNwYWNlTWFwc1swXSA9IG5ldyBQYWNrYWdlVG9OYW1lc3BhY2VNYXAoKTsKLSAgICAgICAgcGFja2FnZVRvTmFtZXNwYWNlTWFwc1swXS5zZXROYW1lc3BhY2UoIm5zMSIpOwotICAgICAgICBwYWNrYWdlVG9OYW1lc3BhY2VNYXBzWzBdLnNldFBhY2thZ2VOYW1lKCJwYWNrYWdlMSIpOwotCi0gICAgICAgIHBhY2thZ2VUb05hbWVzcGFjZU1hcHNbMV0gPSBuZXcgUGFja2FnZVRvTmFtZXNwYWNlTWFwKCk7Ci0gICAgICAgIHBhY2thZ2VUb05hbWVzcGFjZU1hcHNbMV0uc2V0TmFtZXNwYWNlKCJuczIiKTsKLSAgICAgICAgcGFja2FnZVRvTmFtZXNwYWNlTWFwc1sxXS5zZXRQYWNrYWdlTmFtZSgicGFja2FnZTIiKTsKLSAgICAgICAgcGFja2FnZVRvTmFtZXNwYWNlTWFwaW5ncy5zZXRQYWNrYWdlVG9OYW1lc3BhY2VNYXAocGFja2FnZVRvTmFtZXNwYWNlTWFwcyk7Ci0gICAgICAgIGNvbmZpZy5zZXRQYWNrYWdlVG9OYW1lc3BhY2VNYXBpbmdzKHBhY2thZ2VUb05hbWVzcGFjZU1hcGluZ3MpOwotICAgICAgICBjb25maWcuc2V0U2ltcGxlRGF0YUhhbmRsZXJDbGFzcygidGVzdCIpOwotCi0gICAgICAgIC8vYWRkaW5nIGN1c3RvbWNsYXNzIGluZm8KLSAgICAgICAgQ3VzdG9tQ2xhc3NJbmZvIGN1c3RvbUNsYXNzSW5mbyA9IG5ldyBDdXN0b21DbGFzc0luZm8oKTsKLSAgICAgICAgQ2xhc3NJbmZvW10gY2xhc3NJbmZvcyA9IG5ldyBDbGFzc0luZm9bMV07Ci0gICAgICAgIGNsYXNzSW5mb3NbMF0gPSBuZXcgQ2xhc3NJbmZvKCk7Ci0KLSAgICAgICAgRmllbGRJbmZvW10gZmlsZWRJbmZvcyA9IG5ldyBGaWVsZEluZm9bMV07Ci0gICAgICAgIGZpbGVkSW5mb3NbMF0gPSBuZXcgRmllbGRJbmZvKCk7Ci0gICAgICAgIGZpbGVkSW5mb3NbMF0uc2V0RWxlbWVudChmYWxzZSk7Ci0gICAgICAgIGZpbGVkSW5mb3NbMF0uc2V0SmF2YU5hbWUoInBhcmFtMSIpOwotICAgICAgICBmaWxlZEluZm9zWzBdLnNldFhtbE5hbWUoInhtbFBhcmFtMSIpOwotCi0gICAgICAgIGNsYXNzSW5mb3NbMF0uc2V0RmllbGRJbmZvKGZpbGVkSW5mb3MpOwotICAgICAgICBjbGFzc0luZm9zWzBdLnNldENsYXNzTmFtZSgidGVzdCIpOwotCi0gICAgICAgIGN1c3RvbUNsYXNzSW5mby5zZXRDbGFzc0luZm8oY2xhc3NJbmZvcyk7Ci0KLSAgICAgICAgY29uZmlnLnNldEN1c3RvbUNsYXNzSW5mbyhjdXN0b21DbGFzc0luZm8pOwotCi0KLQotCi0gICAgICAgIFBhcmFtZXRlciBwYXJhbWV0ZXIgPSBuZXcgUGFyYW1ldGVyKENvbmZpZy5jbGFzcywgImNvbmZpZyIpOwotICAgICAgICBwYXJhbWV0ZXIuc2V0TmFtZXNwYWNlKCJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi9ybWkiKTsKLQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRvci5hZGRQYWNrYWdlVG9OYW1lc3BhY2VNYXBpbmcoIm9yZy5hcGFjaGUuYXhpczIucm1pLmRlcGxveS5jb25maWciLAotICAgICAgICAgICAgICAgICAgICAiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvcm1pIik7Ci0gICAgICAgICAgICBwYXJhbWV0ZXIucG9wdWxhdGVNZXRhRGF0YShjb25maWd1cmF0b3IsIHByb2Nlc3NlZE1hcCk7Ci0gICAgICAgICAgICBwYXJhbWV0ZXIuZ2VuZXJhdGVTY2hlbWEoY29uZmlndXJhdG9yLCBzY2hlbWFNYXApOwotICAgICAgICAgICAgU3RyaW5nV3JpdGVyIGNvbmZpZ1htbFdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICAgICAgICAgIFhNTFN0cmVhbVdyaXRlciB3cml0ZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtV3JpdGVyKGNvbmZpZ1htbFdyaXRlcik7Ci0gICAgICAgICAgICBKYXZhT2JqZWN0U2VyaWFsaXplciBqYXZhT2JqZWN0U2VyaWFsaXplciA9IG5ldyBKYXZhT2JqZWN0U2VyaWFsaXplcih0aGlzLnByb2Nlc3NlZE1hcCwgdGhpcy5jb25maWd1cmF0b3IsIHRoaXMuc2NoZW1hTWFwKTsKLSAgICAgICAgICAgIGphdmFPYmplY3RTZXJpYWxpemVyLnNlcmlhbGl6ZVBhcmFtZXRlcihjb25maWcsIHBhcmFtZXRlciwgd3JpdGVyLCBuZXcgTmFtZXNwYWNlUHJlZml4KCkpOwotICAgICAgICAgICAgd3JpdGVyLmZsdXNoKCk7Ci0KLSAgICAgICAgICAgIFN0cmluZyBjb25maWdYbWxTdHJpbmcgPSBjb25maWdYbWxXcml0ZXIudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiY29uZmlnID09PiAiICsgY29uZmlnWG1sU3RyaW5nKTsKLQotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGNvbmZpZ1htbFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICBYbWxTdHJlYW1QYXJzZXIgeG1sU3RyZWFtUGFyc2VyID0gbmV3IFhtbFN0cmVhbVBhcnNlcih0aGlzLnByb2Nlc3NlZE1hcCwgdGhpcy5jb25maWd1cmF0b3IsIHRoaXMuc2NoZW1hTWFwKTsKLSAgICAgICAgICAgIENvbmZpZyByZXN1bHQgPSAoQ29uZmlnKSB4bWxTdHJlYW1QYXJzZXIuZ2V0T2JqZWN0Rm9yUGFyYW1ldGVyKHhtbFJlYWRlciwgcGFyYW1ldGVyKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT0siKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoU2NoZW1hR2VuZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKE1ldGFEYXRhUG9wdWxhdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChYbWxTZXJpYWxpemluZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFhtbFBhcnNpbmdFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL0N1c3RvbU1hcHBpbmdzVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvQ3VzdG9tTWFwcGluZ3NUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2NDAwZGEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvQ3VzdG9tTWFwcGluZ3NUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJtaS5kYXRhYmluZDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmNvbmZpZy5DbGFzc0luZm87Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuY29uZmlnLkZpZWxkSW5mbzsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5kYXRhYmluZC5kdG8uVGVzdENsYXNzMjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5kYXRhYmluZC5kdG8uVGVzdENsYXNzOTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS5QYXJhbWV0ZXI7Ci0KLQotcHVibGljIGNsYXNzIEN1c3RvbU1hcHBpbmdzVGVzdCBleHRlbmRzIERhdGFCaW5kVGVzdCB7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VGVzdENsYXNzMigpewotCi0gICAgICAgIENsYXNzSW5mbyBjbGFzc0luZm8gPSBuZXcgQ2xhc3NJbmZvKFRlc3RDbGFzczIuY2xhc3MpOwotICAgICAgICBjbGFzc0luZm8uYWRkRmllbGRJbmZvKG5ldyBGaWVsZEluZm8oInBhcmFtMSIsInhtbHBhcmFtMSIsZmFsc2UpKTsKLSAgICAgICAgY2xhc3NJbmZvLmFkZEZpZWxkSW5mbyhuZXcgRmllbGRJbmZvKCJwYXJhbTIiLCJ4bWxwYXJhbTIiLGZhbHNlKSk7Ci0gICAgICAgIGNvbmZpZ3VyYXRvci5hZGRDbGFzc0luZm8oY2xhc3NJbmZvKTsKLQotICAgICAgICBUZXN0Q2xhc3MyIHRlc3RPYmplY3QgPSBuZXcgVGVzdENsYXNzMigpOwotICAgICAgICB0ZXN0T2JqZWN0LnNldFBhcmFtMSg1KTsKLSAgICAgICAgdGVzdE9iamVjdC5zZXRQYXJhbTIoMzQuNWYpOwotICAgICAgICB0ZXN0T2JqZWN0LnNldFBhcmFtMygzNC41KTsKLQotICAgICAgICBQYXJhbWV0ZXIgcGFyYW1ldGVyID0gbmV3IFBhcmFtZXRlcihUZXN0Q2xhc3MyLmNsYXNzLCJQYXJhbTEiKTsKLSAgICAgICAgVGVzdENsYXNzMiByZXN1bHQgPSAoVGVzdENsYXNzMikgZ2V0UmV0dXJuT2JqZWN0KHBhcmFtZXRlcix0ZXN0T2JqZWN0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTEoKSw1KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHQuZ2V0UGFyYW0yKCkgPT0gMzQuNWYpOwotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdC5nZXRQYXJhbTMoKSA9PSAzNC41KTsKLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RUZXN0Q2xhc3M5KCl7Ci0gICAgICAgIAotICAgICAgICBDbGFzc0luZm8gY2xhc3NJbmZvID0gbmV3IENsYXNzSW5mbyhUZXN0Q2xhc3MyLmNsYXNzKTsKLSAgICAgICAgY2xhc3NJbmZvLmFkZEZpZWxkSW5mbyhuZXcgRmllbGRJbmZvKCJwYXJhbTEiLCJ4bWxwYXJhbTEiLGZhbHNlKSk7Ci0gICAgICAgIGNsYXNzSW5mby5hZGRGaWVsZEluZm8obmV3IEZpZWxkSW5mbygicGFyYW0yIiwieG1scGFyYW0yIixmYWxzZSkpOwotICAgICAgICBjbGFzc0luZm8uYWRkRmllbGRJbmZvKG5ldyBGaWVsZEluZm8oInBhcmFtMyIsInhtbHBhcmFtMyIsdHJ1ZSkpOwotICAgICAgICBjb25maWd1cmF0b3IuYWRkQ2xhc3NJbmZvKGNsYXNzSW5mbyk7Ci0KLSAgICAgICAgY2xhc3NJbmZvID0gbmV3IENsYXNzSW5mbyhUZXN0Q2xhc3M5LmNsYXNzKTsKLSAgICAgICAgY2xhc3NJbmZvLmFkZEZpZWxkSW5mbyhuZXcgRmllbGRJbmZvKCJwYXJhbTEiLCJ4bWxwYXJhbTEiLHRydWUpKTsKLQotICAgICAgICBjb25maWd1cmF0b3IuYWRkQ2xhc3NJbmZvKGNsYXNzSW5mbyk7Ci0KLSAgICAgICAgVGVzdENsYXNzOSB0ZXN0Q2xhc3M5ID0gbmV3IFRlc3RDbGFzczkoKTsKLQotICAgICAgICBUZXN0Q2xhc3MyW10gdGVzdENsYXNzMiA9IG5ldyBUZXN0Q2xhc3MyWzNdOwotICAgICAgICB0ZXN0Q2xhc3MyWzBdID0gbmV3IFRlc3RDbGFzczIoKTsKLSAgICAgICAgdGVzdENsYXNzMlswXS5zZXRQYXJhbTEoNik7Ci0gICAgICAgIHRlc3RDbGFzczJbMF0uc2V0UGFyYW0yKDQuNWYpOwotICAgICAgICB0ZXN0Q2xhc3MyWzBdLnNldFBhcmFtMyg1Ni41KTsKLQotICAgICAgICB0ZXN0Q2xhc3MyWzFdID0gbmV3IFRlc3RDbGFzczIoKTsKLSAgICAgICAgdGVzdENsYXNzMlsxXS5zZXRQYXJhbTEoNik7Ci0gICAgICAgIHRlc3RDbGFzczJbMV0uc2V0UGFyYW0yKDQuNWYpOwotICAgICAgICB0ZXN0Q2xhc3MyWzFdLnNldFBhcmFtMyg1Ni41KTsKLQotICAgICAgICB0ZXN0Q2xhc3MyWzJdID0gbmV3IFRlc3RDbGFzczIoKTsKLSAgICAgICAgdGVzdENsYXNzMlsyXS5zZXRQYXJhbTEoNik7Ci0gICAgICAgIHRlc3RDbGFzczJbMl0uc2V0UGFyYW0yKDQuNWYpOwotICAgICAgICB0ZXN0Q2xhc3MyWzJdLnNldFBhcmFtMyg1Ni41KTsKLQotICAgICAgICB0ZXN0Q2xhc3M5LnNldFBhcmFtMSh0ZXN0Q2xhc3MyKTsKLQotICAgICAgICBQYXJhbWV0ZXIgcGFyYW1ldGVyID0gbmV3IFBhcmFtZXRlcihUZXN0Q2xhc3M5LmNsYXNzLCJQYXJhbTEiKTsKLSAgICAgICAgVGVzdENsYXNzOSByZXN1bHQgPSAoVGVzdENsYXNzOSkgZ2V0UmV0dXJuT2JqZWN0KHBhcmFtZXRlcix0ZXN0Q2xhc3M5KTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtMSgpWzBdLmdldFBhcmFtMSgpLDYpOwotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdC5nZXRQYXJhbTEoKVswXS5nZXRQYXJhbTIoKSA9PSA0LjVmKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHQuZ2V0UGFyYW0xKClbMF0uZ2V0UGFyYW0zKCkgPT0gNTYuNSk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTEoKVsxXS5nZXRQYXJhbTEoKSw2KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHQuZ2V0UGFyYW0xKClbMV0uZ2V0UGFyYW0yKCkgPT0gNC41Zik7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0LmdldFBhcmFtMSgpWzFdLmdldFBhcmFtMygpID09IDU2LjUpOwotCi0gICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UGFyYW0xKClbMl0uZ2V0UGFyYW0xKCksNik7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0LmdldFBhcmFtMSgpWzJdLmdldFBhcmFtMigpID09IDQuNWYpOwotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdC5nZXRQYXJhbTEoKVsyXS5nZXRQYXJhbTMoKSA9PSA1Ni41KTsKLQotCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kYXRhYmluZC9DdXN0b21UeXBlVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvQ3VzdG9tVHlwZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWVmZDZjMC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kYXRhYmluZC9DdXN0b21UeXBlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJtaS5kYXRhYmluZDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmRhdGFiaW5kLmR0by5UZXN0Q2xhc3MxMzsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5kYXRhYmluZC5kdG8uVGVzdFJlc3RyaWN0aW9uQmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS5QYXJhbWV0ZXI7Ci0KLQotcHVibGljIGNsYXNzIEN1c3RvbVR5cGVUZXN0IGV4dGVuZHMgRGF0YUJpbmRUZXN0IHsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RUZXN0Q2xhc3MxMzEoKSB7Ci0KLSAgICAgICAgVGVzdENsYXNzMTMgdGVzdENsYXNzMTMgPSBuZXcgVGVzdENsYXNzMTMoKTsKLSAgICAgICAgVGVzdFJlc3RyaWN0aW9uQmVhbiB0ZXN0UmVzdHJpY3Rpb25CZWFuID0gbmV3IFRlc3RSZXN0cmljdGlvbkJlYW4oInRlc3Qgc3RyaW5nIik7Ci0gICAgICAgIHRlc3RDbGFzczEzLnNldFBhcmFtMSh0ZXN0UmVzdHJpY3Rpb25CZWFuKTsKLQotICAgICAgICBQYXJhbWV0ZXIgcGFyYW1ldGVyID0gbmV3IFBhcmFtZXRlcihUZXN0Q2xhc3MxMy5jbGFzcywgIlBhcmFtMSIpOwotCi0gICAgICAgIFRlc3RDbGFzczEzIHJlc3VsdCA9IChUZXN0Q2xhc3MxMykgZ2V0UmV0dXJuT2JqZWN0KHBhcmFtZXRlciwgdGVzdENsYXNzMTMpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtMSgpLmdldFBhcmFtMSgpLCAidGVzdCBzdHJpbmciKTsKLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RUZXN0Q2xhc3MxMzIoKSB7Ci0KLSAgICAgICAgVGVzdENsYXNzMTMgdGVzdENsYXNzMTMgPSBuZXcgVGVzdENsYXNzMTMoKTsKLSAgICAgICAgVGVzdFJlc3RyaWN0aW9uQmVhbltdIHRlc3RSZXN0cmljdGlvbkJlYW5zID0gbmV3IFRlc3RSZXN0cmljdGlvbkJlYW5bM107Ci0gICAgICAgIHRlc3RSZXN0cmljdGlvbkJlYW5zWzBdID0gbmV3IFRlc3RSZXN0cmljdGlvbkJlYW4oInRlc3Qgc3RyaW5nIDEiKTsKLSAgICAgICAgdGVzdFJlc3RyaWN0aW9uQmVhbnNbMV0gPSBuZXcgVGVzdFJlc3RyaWN0aW9uQmVhbigidGVzdCBzdHJpbmcgMiIpOwotICAgICAgICB0ZXN0UmVzdHJpY3Rpb25CZWFuc1syXSA9IG5ldyBUZXN0UmVzdHJpY3Rpb25CZWFuKCJ0ZXN0IHN0cmluZyAzIik7Ci0gICAgICAgIHRlc3RDbGFzczEzLnNldFBhcmFtMih0ZXN0UmVzdHJpY3Rpb25CZWFucyk7Ci0KLSAgICAgICAgUGFyYW1ldGVyIHBhcmFtZXRlciA9IG5ldyBQYXJhbWV0ZXIoVGVzdENsYXNzMTMuY2xhc3MsICJQYXJhbTEiKTsKLQotICAgICAgICBUZXN0Q2xhc3MxMyByZXN1bHQgPSAoVGVzdENsYXNzMTMpIGdldFJldHVybk9iamVjdChwYXJhbWV0ZXIsIHRlc3RDbGFzczEzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTIoKVswXS5nZXRQYXJhbTEoKSwgInRlc3Qgc3RyaW5nIDEiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTIoKVsxXS5nZXRQYXJhbTEoKSwgInRlc3Qgc3RyaW5nIDIiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTIoKVsyXS5nZXRQYXJhbTEoKSwgInRlc3Qgc3RyaW5nIDMiKTsKLQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL0RhdGFCaW5kVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvRGF0YUJpbmRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlMWMxOGUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvRGF0YUJpbmRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLmRhdGFiaW5kOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5TdEFYVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmV4Y2VwdGlvbi5NZXRhRGF0YVBvcHVsYXRlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmV4Y2VwdGlvbi5TY2hlbWFHZW5lcmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmV4Y2VwdGlvbi5YbWxQYXJzaW5nRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmV4Y2VwdGlvbi5YbWxTZXJpYWxpemluZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS5QYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkudXRpbC5OYW1lc3BhY2VQcmVmaXg7Ci0KLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLXB1YmxpYyBjbGFzcyBEYXRhQmluZFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwcm90ZWN0ZWQgSmF2YU9iamVjdFNlcmlhbGl6ZXIgamF2YU9iamVjdFNlcmlhbGl6ZXI7Ci0gICAgcHJvdGVjdGVkIFhtbFN0cmVhbVBhcnNlciB4bWxTdHJlYW1QYXJzZXI7Ci0gICAgcHJvdGVjdGVkIENvbmZpZ3VyYXRvciBjb25maWd1cmF0b3I7Ci0gICAgcHJvdGVjdGVkIE1hcCBwcm9jZXNzZWRNYXA7Ci0gICAgcHJvdGVjdGVkIE1hcCBzY2hlbWFNYXA7Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0aGlzLmNvbmZpZ3VyYXRvciA9IG5ldyBDb25maWd1cmF0b3IoKTsKLSAgICAgICAgdGhpcy5wcm9jZXNzZWRNYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICB0aGlzLnNjaGVtYU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIHRoaXMuamF2YU9iamVjdFNlcmlhbGl6ZXIgPSBuZXcgSmF2YU9iamVjdFNlcmlhbGl6ZXIodGhpcy5wcm9jZXNzZWRNYXAsdGhpcy5jb25maWd1cmF0b3IsdGhpcy5zY2hlbWFNYXApOwotICAgICAgICB0aGlzLnhtbFN0cmVhbVBhcnNlciA9IG5ldyBYbWxTdHJlYW1QYXJzZXIodGhpcy5wcm9jZXNzZWRNYXAsdGhpcy5jb25maWd1cmF0b3IsdGhpcy5zY2hlbWFNYXApOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBPYmplY3QgZ2V0UmV0dXJuT2JqZWN0KFBhcmFtZXRlciBwYXJhbWV0ZXIsIE9iamVjdCBpbnB1dE9iamVjdCkgewotCi0gICAgICAgIE9iamVjdCByZXV0bk9iamVjdCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBwYXJhbWV0ZXIucG9wdWxhdGVNZXRhRGF0YShjb25maWd1cmF0b3IsIHByb2Nlc3NlZE1hcCk7Ci0gICAgICAgICAgICBwYXJhbWV0ZXIuZ2VuZXJhdGVTY2hlbWEoY29uZmlndXJhdG9yLCBzY2hlbWFNYXApOwotCi0gICAgICAgICAgICBTdHJpbmdXcml0ZXIgc3RyaW5nV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgICAgICAgICAgWE1MU3RyZWFtV3JpdGVyIHhtbFN0cmVhbVdyaXRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1Xcml0ZXIoc3RyaW5nV3JpdGVyKTsKLSAgICAgICAgICAgIGphdmFPYmplY3RTZXJpYWxpemVyLnNlcmlhbGl6ZVBhcmFtZXRlcihpbnB1dE9iamVjdCwgcGFyYW1ldGVyLCB4bWxTdHJlYW1Xcml0ZXIsIG5ldyBOYW1lc3BhY2VQcmVmaXgoKSk7Ci0gICAgICAgICAgICB4bWxTdHJlYW1Xcml0ZXIuZmx1c2goKTsKLSAgICAgICAgICAgIFN0cmluZyB4bWxTdHJpbmcgPSBzdHJpbmdXcml0ZXIudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiWG1sIFN0cmluZyA9PT4gIiArIHhtbFN0cmluZyk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oeG1sU3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIHJldXRuT2JqZWN0ID0geG1sU3RyZWFtUGFyc2VyLmdldE9iamVjdEZvclBhcmFtZXRlcihyZWFkZXIsIHBhcmFtZXRlcik7Ci0gICAgICAgIH0gY2F0Y2ggKE1ldGFEYXRhUG9wdWxhdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChTY2hlbWFHZW5lcmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoWG1sU2VyaWFsaXppbmdFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChYbWxQYXJzaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldXRuT2JqZWN0OwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvRXh0ZW5zaW9uUmVxdWVzdFJlc3BvbnNlVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvRXh0ZW5zaW9uUmVxdWVzdFJlc3BvbnNlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjQyMWE0Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL0V4dGVuc2lvblJlcXVlc3RSZXNwb25zZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLmRhdGFiaW5kOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmRhdGFiaW5kLmR0by5DaGlsZENsYXNzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmRhdGFiaW5kLnNlcnZpY2UuU2VydmljZTM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEuT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLm1ldGFkYXRhLlNlcnZpY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0KLXB1YmxpYyBjbGFzcyBFeHRlbnNpb25SZXF1ZXN0UmVzcG9uc2VUZXN0IGV4dGVuZHMgUmVxdWVzdFJlc3BvbnNlVGVzdCB7Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0aGlzLnNlcnZpY2VDbGFzcyA9IFNlcnZpY2UzLmNsYXNzOwotICAgICAgICB0aGlzLnNlcnZpY2VPYmplY3QgPSBuZXcgU2VydmljZTMoKTsKLQotICAgICAgICB0aGlzLmNvbmZpZ3VyYXRvciA9IG5ldyBDb25maWd1cmF0b3IoKTsKLSAgICAgICAgdGhpcy5jb25maWd1cmF0b3IuYWRkRXh0ZW5zaW9uKENoaWxkQ2xhc3MuY2xhc3MpOwotCi0gICAgICAgIHRoaXMucHJvY2Vzc2VkTWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgdGhpcy5zY2hlbWFNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgICAgIHRoaXMuc2VydmljZSA9IG5ldyBTZXJ2aWNlKHRoaXMuc2VydmljZUNsYXNzLCB0aGlzLmNvbmZpZ3VyYXRvcik7Ci0gICAgICAgIHRoaXMuc2VydmljZS5wb3B1bGF0ZU1ldGFEYXRhKCk7Ci0gICAgICAgIHRoaXMuc2VydmljZS5nZW5lcmF0ZVNjaGVtYSgpOwotICAgICAgICB0aGlzLmphdmFPYmplY3RTZXJpYWxpemVyID0gbmV3IEphdmFPYmplY3RTZXJpYWxpemVyKHNlcnZpY2UuZ2V0UHJvY2Vzc2VkVHlwZU1hcCgpLAotICAgICAgICAgICAgICAgIHRoaXMuc2VydmljZS5nZXRDb25maWd1cmF0b3IoKSwKLSAgICAgICAgICAgICAgICB0aGlzLnNlcnZpY2UuZ2V0U2NoZW1hTWFwKCkpOwotICAgICAgICB0aGlzLnhtbFN0cmVhbVBhcnNlciA9IG5ldyBYbWxTdHJlYW1QYXJzZXIoc2VydmljZS5nZXRQcm9jZXNzZWRUeXBlTWFwKCksCi0gICAgICAgICAgICAgICAgdGhpcy5zZXJ2aWNlLmdldENvbmZpZ3VyYXRvcigpLAotICAgICAgICAgICAgICAgIHRoaXMuc2VydmljZS5nZXRTY2hlbWFNYXAoKSk7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kMSgpewotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gZmlyc3QgY3JlYXRlIHNlcnZpY2UgZGF0YQotCi0gICAgICAgICAgICBPcGVyYXRpb24gb3BlcmF0aW9uID0gdGhpcy5zZXJ2aWNlLmdldE9wZXJhdGlvbigibWV0aG9kMSIpOwotICAgICAgICAgICAgLy8gZ2V0IG9iamVjdHMgYWZ0ZXIgc2VyaWFsaXphdGlvbiBhbmQgZGVzZXJpYWxpemF0aW9uLgotICAgICAgICAgICAgLy8gdGhpcyByZXR1cm5lZCBvYmplY3RzIG11c3RiZSBpZGVudGljYWwgd2l0aCB0aGUgb3JpZ2luYWwgYXJyYXkgbGlzdCBlbGVtZW50cwotICAgICAgICAgICAgTGlzdCBpbnB1dE9iamVjdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICBDaGlsZENsYXNzIGNoaWxkQ2xhc3MgPSBuZXcgQ2hpbGRDbGFzcygpOwotICAgICAgICAgICAgY2hpbGRDbGFzcy5zZXRQYXJhbTEoInRlc3QgcGFyYW0xIik7Ci0gICAgICAgICAgICBjaGlsZENsYXNzLnNldFBhcmFtMig1KTsKLSAgICAgICAgICAgIGNoaWxkQ2xhc3Muc2V0UGFyYW0zKDIzLjQ1Zik7Ci0gICAgICAgICAgICBjaGlsZENsYXNzLnNldFBhcmFtNCgzNC41KTsKLSAgICAgICAgICAgIGlucHV0T2JqZWN0cy5hZGQoY2hpbGRDbGFzcyk7Ci0gICAgICAgICAgICBPYmplY3RbXSBvYmplY3RzID0gZ2V0SW5wdXRPYmplY3QoaW5wdXRPYmplY3RzLCBvcGVyYXRpb24pOwotCi0gICAgICAgICAgICBDaGlsZENsYXNzIG9iamVjdCA9IChDaGlsZENsYXNzKSBvcGVyYXRpb24uZ2V0SmF2YU1ldGhvZCgpLmludm9rZSh0aGlzLnNlcnZpY2VPYmplY3QsIG9iamVjdHMpOwotICAgICAgICAgICAgQ2hpbGRDbGFzcyByZXR1cm5PYmplY3QgPSAoQ2hpbGRDbGFzcykgZ2V0UmV0dXJuT2JqZWN0KG9iamVjdCwgb3BlcmF0aW9uKTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJldHVybk9iamVjdC5nZXRQYXJhbTEoKSwidGVzdCBwYXJhbTEiKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXR1cm5PYmplY3QuZ2V0UGFyYW0yKCksNSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGNoaWxkQ2xhc3MuZ2V0UGFyYW0zKCkgPT0gMjMuNDVmKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoY2hpbGRDbGFzcy5nZXRQYXJhbTQoKSA9PSAzNC41KTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNZXRob2QyMSgpewotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gZmlyc3QgY3JlYXRlIHNlcnZpY2UgZGF0YQotCi0gICAgICAgICAgICBPcGVyYXRpb24gb3BlcmF0aW9uID0gdGhpcy5zZXJ2aWNlLmdldE9wZXJhdGlvbigibWV0aG9kMiIpOwotICAgICAgICAgICAgLy8gZ2V0IG9iamVjdHMgYWZ0ZXIgc2VyaWFsaXphdGlvbiBhbmQgZGVzZXJpYWxpemF0aW9uLgotICAgICAgICAgICAgLy8gdGhpcyByZXR1cm5lZCBvYmplY3RzIG11c3RiZSBpZGVudGljYWwgd2l0aCB0aGUgb3JpZ2luYWwgYXJyYXkgbGlzdCBlbGVtZW50cwotICAgICAgICAgICAgTGlzdCBpbnB1dE9iamVjdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICBpbnB1dE9iamVjdHMuYWRkKG5ldyBPYmplY3QoKSk7Ci0gICAgICAgICAgICBPYmplY3RbXSBvYmplY3RzID0gZ2V0SW5wdXRPYmplY3QoaW5wdXRPYmplY3RzLCBvcGVyYXRpb24pOwotCi0gICAgICAgICAgICBPYmplY3Qgb2JqZWN0ID0gb3BlcmF0aW9uLmdldEphdmFNZXRob2QoKS5pbnZva2UodGhpcy5zZXJ2aWNlT2JqZWN0LCBvYmplY3RzKTsKLSAgICAgICAgICAgIE9iamVjdCByZXR1cm5PYmplY3QgPSBnZXRSZXR1cm5PYmplY3Qob2JqZWN0LCBvcGVyYXRpb24pOwotCi0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHJldHVybk9iamVjdCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kMjIoKXsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIGZpcnN0IGNyZWF0ZSBzZXJ2aWNlIGRhdGEKLQotICAgICAgICAgICAgT3BlcmF0aW9uIG9wZXJhdGlvbiA9IHRoaXMuc2VydmljZS5nZXRPcGVyYXRpb24oIm1ldGhvZDIiKTsKLSAgICAgICAgICAgIC8vIGdldCBvYmplY3RzIGFmdGVyIHNlcmlhbGl6YXRpb24gYW5kIGRlc2VyaWFsaXphdGlvbi4KLSAgICAgICAgICAgIC8vIHRoaXMgcmV0dXJuZWQgb2JqZWN0cyBtdXN0YmUgaWRlbnRpY2FsIHdpdGggdGhlIG9yaWdpbmFsIGFycmF5IGxpc3QgZWxlbWVudHMKLSAgICAgICAgICAgIExpc3QgaW5wdXRPYmplY3RzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgRGF0ZSBkYXRlID0gbmV3IERhdGUoKTsKLSAgICAgICAgICAgIGlucHV0T2JqZWN0cy5hZGQoZGF0ZSk7Ci0gICAgICAgICAgICBPYmplY3RbXSBvYmplY3RzID0gZ2V0SW5wdXRPYmplY3QoaW5wdXRPYmplY3RzLCBvcGVyYXRpb24pOwotCi0gICAgICAgICAgICBEYXRlIG9iamVjdCA9IChEYXRlKSBvcGVyYXRpb24uZ2V0SmF2YU1ldGhvZCgpLmludm9rZSh0aGlzLnNlcnZpY2VPYmplY3QsIG9iamVjdHMpOwotICAgICAgICAgICAgRGF0ZSByZXR1cm5PYmplY3QgPSAoRGF0ZSkgZ2V0UmV0dXJuT2JqZWN0KG9iamVjdCwgb3BlcmF0aW9uKTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJldHVybk9iamVjdC5nZXREYXRlKCksZGF0ZS5nZXREYXRlKCkpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvRXh0ZW5zaW9uVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvRXh0ZW5zaW9uVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmYyODEwLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL0V4dGVuc2lvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5ybWkuZGF0YWJpbmQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5kYXRhYmluZC5kdG8uVGVzdENsYXNzMTA7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEuUGFyYW1ldGVyOwotCi0KLXB1YmxpYyBjbGFzcyBFeHRlbnNpb25UZXN0IGV4dGVuZHMgRGF0YUJpbmRUZXN0IHsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RUZXN0Q2xhc3MxMDEoKSB7Ci0KLSAgICAgICAgQ2xhc3MgdGVzdENsYXNzID0gVGVzdENsYXNzMTAuY2xhc3M7Ci0gICAgICAgIFBhcmFtZXRlciBwYXJhbWV0ZXIgPSBuZXcgUGFyYW1ldGVyKHRlc3RDbGFzcywgIlBhcmFtMSIpOwotICAgICAgICBUZXN0Q2xhc3MxMCB0ZXN0T2JqZWN0ID0gbmV3IFRlc3RDbGFzczEwKCk7Ci0gICAgICAgIHRlc3RPYmplY3Quc2V0UGFyYW0xKCJUZXN0IFN0cmluZyIpOwotICAgICAgICBUZXN0Q2xhc3MxMCByZXN1bHQgPSAoVGVzdENsYXNzMTApIGdldFJldHVybk9iamVjdChwYXJhbWV0ZXIsIHRlc3RPYmplY3QpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtMSgpLCAiVGVzdCBTdHJpbmciKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VGVzdENsYXNzMTAyKCkgewotCi0gICAgICAgIENsYXNzIHRlc3RDbGFzcyA9IFRlc3RDbGFzczEwLmNsYXNzOwotICAgICAgICBQYXJhbWV0ZXIgcGFyYW1ldGVyID0gbmV3IFBhcmFtZXRlcih0ZXN0Q2xhc3MsICJQYXJhbTEiKTsKLSAgICAgICAgVGVzdENsYXNzMTAgdGVzdE9iamVjdCA9IG5ldyBUZXN0Q2xhc3MxMCgpOwotICAgICAgICB0ZXN0T2JqZWN0LnNldFBhcmFtMShuZXcgSW50ZWdlcig1KSk7Ci0gICAgICAgIFRlc3RDbGFzczEwIHJlc3VsdCA9IChUZXN0Q2xhc3MxMCkgZ2V0UmV0dXJuT2JqZWN0KHBhcmFtZXRlciwgdGVzdE9iamVjdCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UGFyYW0xKCksIG5ldyBJbnRlZ2VyKDUpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VGVzdENsYXNzMTAzKCkgewotCi0gICAgICAgIENsYXNzIHRlc3RDbGFzcyA9IFRlc3RDbGFzczEwLmNsYXNzOwotICAgICAgICBQYXJhbWV0ZXIgcGFyYW1ldGVyID0gbmV3IFBhcmFtZXRlcih0ZXN0Q2xhc3MsICJQYXJhbTEiKTsKLSAgICAgICAgVGVzdENsYXNzMTAgdGVzdE9iamVjdCA9IG5ldyBUZXN0Q2xhc3MxMCgpOwotICAgICAgICB0ZXN0T2JqZWN0LnNldFBhcmFtMihuZXcgT2JqZWN0W117InRlc3QgU3RyaW5nIiwgbmV3IEludGVnZXIoNSl9KTsKLSAgICAgICAgVGVzdENsYXNzMTAgcmVzdWx0ID0gKFRlc3RDbGFzczEwKSBnZXRSZXR1cm5PYmplY3QocGFyYW1ldGVyLCB0ZXN0T2JqZWN0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTIoKVswXSwgInRlc3QgU3RyaW5nIik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UGFyYW0yKClbMV0sIG5ldyBJbnRlZ2VyKDUpKTsKLQotICAgIH0KLQotICAgIAotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvTWFwVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvTWFwVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzRmZTU0Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL01hcFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5ybWkuZGF0YWJpbmQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5kYXRhYmluZC5kdG8uVGVzdENsYXNzMTI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEuUGFyYW1ldGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0KLXB1YmxpYyBjbGFzcyBNYXBUZXN0IGV4dGVuZHMgRGF0YUJpbmRUZXN0IHsKLQotICAgICBwdWJsaWMgdm9pZCB0ZXN0VGVzdENsYXNzMTIxKCl7Ci0KLSAgICAgICAgQ2xhc3MgdGVzdENsYXNzID0gVGVzdENsYXNzMTIuY2xhc3M7Ci0gICAgICAgIFBhcmFtZXRlciBwYXJhbWV0ZXIgPSBuZXcgUGFyYW1ldGVyKHRlc3RDbGFzcywgIlBhcmFtMSIpOwotICAgICAgICBUZXN0Q2xhc3MxMiB0ZXN0T2JqZWN0ID0gbmV3IFRlc3RDbGFzczEyKCk7Ci0gICAgICAgIE1hcCBwYXJhbTEgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICBwYXJhbTEucHV0KCJrZXkxIiwidmFsdWUxIik7Ci0gICAgICAgIHBhcmFtMS5wdXQoImtleTIiLCJ2YWx1ZTIiKTsKLSAgICAgICAgdGVzdE9iamVjdC5zZXRQYXJhbTEocGFyYW0xKTsKLSAgICAgICAgVGVzdENsYXNzMTIgcmVzdWx0ID0gKFRlc3RDbGFzczEyKSBnZXRSZXR1cm5PYmplY3QocGFyYW1ldGVyLCB0ZXN0T2JqZWN0KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHQuZ2V0UGFyYW0xKCkuY29udGFpbnNLZXkoImtleTEiKSk7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0LmdldFBhcmFtMSgpLmNvbnRhaW5zS2V5KCJrZXkyIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtMSgpLmdldCgia2V5MSIpLCJ2YWx1ZTEiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTEoKS5nZXQoImtleTIiKSwidmFsdWUyIik7Ci0gICAgfQotCi0gICAgIHB1YmxpYyB2b2lkIHRlc3RUZXN0Q2xhc3MxMjIoKXsKLQotICAgICAgICBDbGFzcyB0ZXN0Q2xhc3MgPSBUZXN0Q2xhc3MxMi5jbGFzczsKLSAgICAgICAgUGFyYW1ldGVyIHBhcmFtZXRlciA9IG5ldyBQYXJhbWV0ZXIodGVzdENsYXNzLCAiUGFyYW0xIik7Ci0gICAgICAgIFRlc3RDbGFzczEyIHRlc3RPYmplY3QgPSBuZXcgVGVzdENsYXNzMTIoKTsKLSAgICAgICAgSGFzaHRhYmxlIHBhcmFtMiA9IG5ldyBIYXNodGFibGUoKTsKLSAgICAgICAgcGFyYW0yLnB1dCgia2V5MSIsInZhbHVlMSIpOwotICAgICAgICBwYXJhbTIucHV0KCJrZXkyIiwidmFsdWUyIik7Ci0gICAgICAgIHRlc3RPYmplY3Quc2V0UGFyYW0yKHBhcmFtMik7Ci0gICAgICAgIFRlc3RDbGFzczEyIHJlc3VsdCA9IChUZXN0Q2xhc3MxMikgZ2V0UmV0dXJuT2JqZWN0KHBhcmFtZXRlciwgdGVzdE9iamVjdCk7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0LmdldFBhcmFtMigpLmNvbnRhaW5zS2V5KCJrZXkxIikpOwotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdC5nZXRQYXJhbTIoKS5jb250YWluc0tleSgia2V5MiIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTIoKS5nZXQoImtleTEiKSwidmFsdWUxIik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UGFyYW0yKCkuZ2V0KCJrZXkyIiksInZhbHVlMiIpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvT01FbGVtZW50Q3JlYXRvclRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL09NRWxlbWVudENyZWF0b3JUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkYmZjMGMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvT01FbGVtZW50Q3JlYXRvclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5ybWkuZGF0YWJpbmQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmRhdGFiaW5kLmR0by5BY3RpdmF0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5kYXRhYmluZC5kdG8uQ2FuY2VsV29ya2Zsb3dSZXF1ZXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmV4Y2VwdGlvbi5PTUVsZW1lbnRDcmVhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS5QYXJhbWV0ZXI7Ci0KLQotcHVibGljIGNsYXNzIE9NRWxlbWVudENyZWF0b3JUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVBY3RpdmF0ZU9iamVjdCgpewotICAgICAgICBBY3RpdmF0ZSBhY3RpdmF0ZSA9IG5ldyBBY3RpdmF0ZSgpOwotICAgICAgICBDYW5jZWxXb3JrZmxvd1JlcXVlc3QgY2FuY2VsV29ya2Zsb3dSZXF1ZXN0ID0gbmV3IENhbmNlbFdvcmtmbG93UmVxdWVzdCgpOwotICAgICAgICBjYW5jZWxXb3JrZmxvd1JlcXVlc3Quc2V0SVdGSUQoNSk7Ci0gICAgICAgIGNhbmNlbFdvcmtmbG93UmVxdWVzdC5zZXRSZXN0YXJ0KDEwKTsKLQotICAgICAgICBhY3RpdmF0ZS5zZXRDYW5jZWxXb3JrZmxvd1JlcXVlc3QoY2FuY2VsV29ya2Zsb3dSZXF1ZXN0KTsKLQotICAgICAgICBDb25maWd1cmF0b3IgY29uZmlndXJhdG9yID0gbmV3IENvbmZpZ3VyYXRvcigpOwotCi0gICAgICAgIGNvbmZpZ3VyYXRvci5hZGRQYWNrYWdlVG9OYW1lc3BhY2VNYXBpbmcoIm9yZy5hcGFjaGUuYXhpczIucm1pLmRhdGFiaW5kLmR0byIsCi0gICAgICAgICAgICAgICAgImh0dHA6Ly9waG9lbml4LmVzYi5pbmZyYXN0cnVjdHVyZS5iaXp0YWxrLnNjaGVtYXMuY2FuY2Vsd29ya2Zsb3dyZXF1ZXN0LyIpOwotCi0gICAgICAgIFBhcmFtZXRlciBwYXJhbWV0ZXIgPSBuZXcgUGFyYW1ldGVyKEFjdGl2YXRlLmNsYXNzLCAiQWN0aXZhdGUiKTsKLSAgICAgICAgcGFyYW1ldGVyLnNldE5hbWVzcGFjZSgiaHR0cDovL3Bob2VuaXguY28uaWwvRVNCL0luZnJhc3RydWN0dXJlIik7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9NRWxlbWVudENyZWF0b3Igb21FbGVtZW50Q3JlYXRvciA9IG5ldyBPTUVsZW1lbnRDcmVhdG9yKCk7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gb21FbGVtZW50Q3JlYXRvci5nZXRPTUVsZW1lbnQoYWN0aXZhdGUscGFyYW1ldGVyLGNvbmZpZ3VyYXRvcik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NIEVsZW1lbnQgPT0+ICIgKyBvbUVsZW1lbnQudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKE9NRWxlbWVudENyZWF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7ICAvL1RvIGNoYW5nZSBib2R5IG9mIGNhdGNoIHN0YXRlbWVudCB1c2UgRmlsZSB8IFNldHRpbmdzIHwgRmlsZSBUZW1wbGF0ZXMuCi0gICAgICAgIH0KLSAgICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvUmVxdWVzdFJlc3BvbnNlVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvUmVxdWVzdFJlc3BvbnNlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmNhOTVkLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL1JlcXVlc3RSZXNwb25zZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5ybWkuZGF0YWJpbmQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLnV0aWwuU3RBWFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmV4Y2VwdGlvbi5YbWxQYXJzaW5nRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmV4Y2VwdGlvbi5YbWxTZXJpYWxpemluZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS5PcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEuU2VydmljZTsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBSZXF1ZXN0UmVzcG9uc2VUZXN0IGV4dGVuZHMgRGF0YUJpbmRUZXN0IHsKLQotICAgIHByb3RlY3RlZCBTZXJ2aWNlIHNlcnZpY2U7Ci0gICAgcHJvdGVjdGVkIE9iamVjdCBzZXJ2aWNlT2JqZWN0OwotICAgIHByb3RlY3RlZCBDbGFzcyBzZXJ2aWNlQ2xhc3M7Ci0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgICAgIHRoaXMuc2VydmljZSA9IG5ldyBTZXJ2aWNlKHRoaXMuc2VydmljZUNsYXNzLHRoaXMuY29uZmlndXJhdG9yKTsKLSAgICAgICAgdGhpcy5zZXJ2aWNlLnBvcHVsYXRlTWV0YURhdGEoKTsKLSAgICAgICAgdGhpcy5zZXJ2aWNlLmdlbmVyYXRlU2NoZW1hKCk7Ci0gICAgICAgIHRoaXMuamF2YU9iamVjdFNlcmlhbGl6ZXIgPSBuZXcgSmF2YU9iamVjdFNlcmlhbGl6ZXIoc2VydmljZS5nZXRQcm9jZXNzZWRUeXBlTWFwKCksCi0gICAgICAgICAgICAgICAgdGhpcy5zZXJ2aWNlLmdldENvbmZpZ3VyYXRvcigpLAotICAgICAgICAgICAgICAgIHRoaXMuc2VydmljZS5nZXRTY2hlbWFNYXAoKSk7Ci0gICAgICAgIHRoaXMueG1sU3RyZWFtUGFyc2VyID0gbmV3IFhtbFN0cmVhbVBhcnNlcihzZXJ2aWNlLmdldFByb2Nlc3NlZFR5cGVNYXAoKSwKLSAgICAgICAgICAgICAgICB0aGlzLnNlcnZpY2UuZ2V0Q29uZmlndXJhdG9yKCksCi0gICAgICAgICAgICAgICAgdGhpcy5zZXJ2aWNlLmdldFNjaGVtYU1hcCgpKTsKLQotICAgIH0KLQotICAgIHByb3RlY3RlZCBPYmplY3RbXSBnZXRJbnB1dE9iamVjdChMaXN0IGlucHV0T2JqZWN0cywgT3BlcmF0aW9uIG9wZXJhdGlvbikKLSAgICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgWG1sU2VyaWFsaXppbmdFeGNlcHRpb24sIFhtbFBhcnNpbmdFeGNlcHRpb24gewotICAgICAgICAgIFN0cmluZ1dyaXRlciBpbnB1dFN0cmluZ1dyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICAgICAgICBYTUxTdHJlYW1Xcml0ZXIgaW5wdXRYbWxTdHJlYW1Xcml0ZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtV3JpdGVyKGlucHV0U3RyaW5nV3JpdGVyKTsKLSAgICAgICAgICB0aGlzLmphdmFPYmplY3RTZXJpYWxpemVyLnNlcmlhbGl6ZUlucHV0RWxlbWVudChpbnB1dE9iamVjdHMudG9BcnJheSgpLAotICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uLmdldElucHV0RWxlbWVudCgpLAotICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uLmdldElucHV0UGFyYW1ldGVycygpLAotICAgICAgICAgICAgICAgICAgaW5wdXRYbWxTdHJlYW1Xcml0ZXIpOwotICAgICAgICAgIGlucHV0WG1sU3RyZWFtV3JpdGVyLmZsdXNoKCk7Ci0gICAgICAgICAgU3RyaW5nIGlucHV0WG1sU3RyaW5nID0gaW5wdXRTdHJpbmdXcml0ZXIudG9TdHJpbmcoKTsKLQotICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiaW5wdXQgWG1sIFN0cmluZyA9PT4gIiArIGlucHV0WG1sU3RyaW5nKTsKLQotICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShpbnB1dFhtbFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgT2JqZWN0W10gb2JqZWN0cyA9IHRoaXMueG1sU3RyZWFtUGFyc2VyLmdldElucHV0UGFyYW1ldGVycyh4bWxSZWFkZXIsIG9wZXJhdGlvbik7Ci0gICAgICAgICAgcmV0dXJuIG9iamVjdHM7Ci0gICAgICB9Ci0KLSAgICAgIHByb3RlY3RlZCBPYmplY3QgZ2V0UmV0dXJuT2JqZWN0KE9iamVjdCByZXR1cm5PYmplY3QsIE9wZXJhdGlvbiBvcGVyYXRpb24pCi0gICAgICAgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sIFhtbFNlcmlhbGl6aW5nRXhjZXB0aW9uLCBYbWxQYXJzaW5nRXhjZXB0aW9uIHsKLSAgICAgICAgICAvLyBnZXQgdGhlIHJlc3BvbnNlIHhtbCBzZXJpYWxpemVyCi0gICAgICAgICAgU3RyaW5nV3JpdGVyIG91dHB1dFN0cmluZ1dyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICAgICAgICBYTUxTdHJlYW1Xcml0ZXIgb3V0cHV0WE1MU3RyaW5nV3JpdGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVdyaXRlcihvdXRwdXRTdHJpbmdXcml0ZXIpOwotCi0gICAgICAgICAgdGhpcy5qYXZhT2JqZWN0U2VyaWFsaXplci5zZXJpYWxpemVPdXRwdXRFbGVtZW50KHJldHVybk9iamVjdCwKLSAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbi5nZXRPdXRQdXRFbGVtZW50KCksCi0gICAgICAgICAgICAgICAgICBvcGVyYXRpb24uZ2V0T3V0cHV0UGFyYW1ldGVyKCksCi0gICAgICAgICAgICAgICAgICBvdXRwdXRYTUxTdHJpbmdXcml0ZXIpOwotICAgICAgICAgIG91dHB1dFhNTFN0cmluZ1dyaXRlci5mbHVzaCgpOwotICAgICAgICAgIFN0cmluZyBvdXRwdXRYbWxTdHJpbmcgPSBvdXRwdXRTdHJpbmdXcml0ZXIudG9TdHJpbmcoKTsKLSAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIm91dHB1dCBYbWwgU3RyaW5nID09PiAiICsgb3V0cHV0WG1sU3RyaW5nKTsKLQotICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciBvdXRwdXRYbWxSZWFkZXIgPQotICAgICAgICAgICAgICAgICAgU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob3V0cHV0WG1sU3RyaW5nLmdldEJ5dGVzKCkpKTsKLQotICAgICAgICAgIHJldHVybiB0aGlzLnhtbFN0cmVhbVBhcnNlci5nZXRPdXRwdXRPYmplY3Qob3V0cHV0WG1sUmVhZGVyLCBvcGVyYXRpb24pOwotICAgICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL1NhbWVQYXJhbU5hbWVUZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kYXRhYmluZC9TYW1lUGFyYW1OYW1lVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTYzNGM2Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL1NhbWVQYXJhbU5hbWVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5ybWkuZGF0YWJpbmQ7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmRhdGFiaW5kLmR0by5UZXN0Q2xhc3MxNDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZGF0YWJpbmQuZHRvLlRlc3RDbGFzczE1Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5kYXRhYmluZC5kdG8uVGVzdENsYXNzMjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZGF0YWJpbmQuZHRvLlRlc3RDbGFzczk7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLm1ldGFkYXRhLlBhcmFtZXRlcjsNCi0NCi1wdWJsaWMgY2xhc3MgU2FtZVBhcmFtTmFtZVRlc3QgZXh0ZW5kcyBEYXRhQmluZFRlc3Qgew0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RWxlbWVudEFycmF5KCkgew0KLSAgICAgICAgQ2xhc3MgdGVzdENsYXNzID0gVGVzdENsYXNzMTQuY2xhc3M7DQotICAgICAgICBQYXJhbWV0ZXIgcGFyYW1ldGVyID0gbmV3IFBhcmFtZXRlcih0ZXN0Q2xhc3MsICJQYXJhbTEiKTsNCi0gICAgICAgIFRlc3RDbGFzczE0IHRlc3RPYmplY3QgPSBudWxsOw0KLSAgICAgICAgVGVzdENsYXNzMTQgcmVzdWx0ID0gbnVsbDsNCi0NCi0gICAgICAgIHRlc3RPYmplY3QgPSBuZXcgVGVzdENsYXNzMTQoKTsNCi0gICAgICAgIHJlc3VsdCA9IChUZXN0Q2xhc3MxNCkgZ2V0UmV0dXJuT2JqZWN0KHBhcmFtZXRlciwgdGVzdE9iamVjdCk7DQotICAgICAgICBhc3NlcnROdWxsKHJlc3VsdC5nZXRQYXJhbTEoKSk7DQotDQotICAgICAgICB0ZXN0T2JqZWN0ID0gbmV3IFRlc3RDbGFzczE0KCk7DQotICAgICAgICB0ZXN0T2JqZWN0LnNldFBhcmFtMShuZXcgVGVzdENsYXNzOSgpKTsNCi0gICAgICAgIHJlc3VsdCA9IChUZXN0Q2xhc3MxNCkgZ2V0UmV0dXJuT2JqZWN0KHBhcmFtZXRlciwgdGVzdE9iamVjdCk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3VsdC5nZXRQYXJhbTEoKSk7DQotDQotICAgICAgICB0ZXN0T2JqZWN0ID0gbmV3IFRlc3RDbGFzczE0KCk7DQotICAgICAgICBUZXN0Q2xhc3MyW10gdGVzdENsYXNzMkFycmF5ID0gbmV3IFRlc3RDbGFzczJbMl07DQotDQotICAgICAgICB0ZXN0Q2xhc3MyQXJyYXlbMF0gPSBuZXcgVGVzdENsYXNzMigpOw0KLSAgICAgICAgdGVzdENsYXNzMkFycmF5WzBdLnNldFBhcmFtMSg1KTsgICANCi0gICAgICAgIHRlc3RDbGFzczJBcnJheVswXS5zZXRQYXJhbTIoKGZsb2F0KSA2LjEpOw0KLSAgICAgICAgdGVzdENsYXNzMkFycmF5WzBdLnNldFBhcmFtMyg3LjIpOw0KLSAgICAgIA0KLSAgICAgICAgdGVzdENsYXNzMkFycmF5WzFdID0gbmV3IFRlc3RDbGFzczIoKTsNCi0gICAgICAgIHRlc3RDbGFzczJBcnJheVsxXS5zZXRQYXJhbTEoMSk7ICAgDQotICAgICAgICB0ZXN0Q2xhc3MyQXJyYXlbMV0uc2V0UGFyYW0yKChmbG9hdCkgMi4xKTsNCi0gICAgICAgIHRlc3RDbGFzczJBcnJheVsxXS5zZXRQYXJhbTMoMy4yKTsNCi0gICAgICAgIA0KLSAgICAgICAgVGVzdENsYXNzOSB0ZXN0Q2xhc3M5T2JqZWN0ID0gbmV3IFRlc3RDbGFzczkoKTsNCi0gICAgICAgIA0KLSAgICAgICAgdGVzdENsYXNzOU9iamVjdC5zZXRQYXJhbTEodGVzdENsYXNzMkFycmF5KTsNCi0gICAgICAgIA0KLSAgICAgICAgdGVzdE9iamVjdC5zZXRQYXJhbTEodGVzdENsYXNzOU9iamVjdCk7DQotICAgICAgICANCi0gICAgICAgIHJlc3VsdCA9IChUZXN0Q2xhc3MxNCkgZ2V0UmV0dXJuT2JqZWN0KHBhcmFtZXRlciwgdGVzdE9iamVjdCk7DQotICAgICAgICANCi0gICAgICAgIGFzc2VydFRydWUocmVzdWx0LmdldFBhcmFtMSgpLmdldFBhcmFtMSgpWzBdLmdldFBhcmFtMSgpID09IDUpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHQuZ2V0UGFyYW0xKCkuZ2V0UGFyYW0xKClbMF0uZ2V0UGFyYW0yKCkgPT0gNi4xZik7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdC5nZXRQYXJhbTEoKS5nZXRQYXJhbTEoKVswXS5nZXRQYXJhbTMoKSA9PSA3LjIpOw0KLSAgICAgICAgDQotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdC5nZXRQYXJhbTEoKS5nZXRQYXJhbTEoKVsxXS5nZXRQYXJhbTEoKSA9PSAxKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzdWx0LmdldFBhcmFtMSgpLmdldFBhcmFtMSgpWzFdLmdldFBhcmFtMigpID09IDIuMWYpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHQuZ2V0UGFyYW0xKCkuZ2V0UGFyYW0xKClbMV0uZ2V0UGFyYW0zKCkgPT0gMy4yKTsNCi0gICAgICAgIA0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RWxlbWVudEVsZW1lbnQoKSB7DQotICAgIAlDbGFzcyB0ZXN0Q2xhc3MgPSBUZXN0Q2xhc3MxNS5jbGFzczsNCi0gICAgICAgIFBhcmFtZXRlciBwYXJhbWV0ZXIgPSBuZXcgUGFyYW1ldGVyKHRlc3RDbGFzcywgIlBhcmFtMSIpOw0KLSAgICAgICAgVGVzdENsYXNzMTUgdGVzdE9iamVjdCA9IG51bGw7DQotICAgICAgICBUZXN0Q2xhc3MxNSByZXN1bHQgPSBudWxsOw0KLQ0KLSAgICAgICAgdGVzdE9iamVjdCA9IG5ldyBUZXN0Q2xhc3MxNSgpOw0KLSAgICAgICAgcmVzdWx0ID0gKFRlc3RDbGFzczE1KSBnZXRSZXR1cm5PYmplY3QocGFyYW1ldGVyLCB0ZXN0T2JqZWN0KTsNCi0gICAgICAgIGFzc2VydE51bGwocmVzdWx0LmdldFBhcmFtMSgpKTsNCi0NCi0gICAgICAgIHRlc3RPYmplY3QgPSBuZXcgVGVzdENsYXNzMTUoKTsNCi0gICAgICAgIHRlc3RPYmplY3Quc2V0UGFyYW0xKG5ldyBUZXN0Q2xhc3MxNCgpKTsNCi0gICAgICAgIHJlc3VsdCA9IChUZXN0Q2xhc3MxNSkgZ2V0UmV0dXJuT2JqZWN0KHBhcmFtZXRlciwgdGVzdE9iamVjdCk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3VsdC5nZXRQYXJhbTEoKSk7DQotDQotICAgICAgICB0ZXN0T2JqZWN0ID0gbmV3IFRlc3RDbGFzczE1KCk7DQotICAgICAgICBUZXN0Q2xhc3MyW10gdGVzdENsYXNzMkFycmF5ID0gbmV3IFRlc3RDbGFzczJbMl07DQotDQotICAgICAgICB0ZXN0Q2xhc3MyQXJyYXlbMF0gPSBuZXcgVGVzdENsYXNzMigpOw0KLSAgICAgICAgdGVzdENsYXNzMkFycmF5WzBdLnNldFBhcmFtMSg1KTsgICANCi0gICAgICAgIHRlc3RDbGFzczJBcnJheVswXS5zZXRQYXJhbTIoKGZsb2F0KSA2LjEpOw0KLSAgICAgICAgdGVzdENsYXNzMkFycmF5WzBdLnNldFBhcmFtMyg3LjIpOw0KLSAgICAgIA0KLSAgICAgICAgdGVzdENsYXNzMkFycmF5WzFdID0gbmV3IFRlc3RDbGFzczIoKTsNCi0gICAgICAgIHRlc3RDbGFzczJBcnJheVsxXS5zZXRQYXJhbTEoMSk7ICAgDQotICAgICAgICB0ZXN0Q2xhc3MyQXJyYXlbMV0uc2V0UGFyYW0yKChmbG9hdCkgMi4xKTsNCi0gICAgICAgIHRlc3RDbGFzczJBcnJheVsxXS5zZXRQYXJhbTMoMy4yKTsNCi0gICAgICAgIA0KLSAgICAgICAgVGVzdENsYXNzOSB0ZXN0Q2xhc3M5T2JqZWN0ID0gbmV3IFRlc3RDbGFzczkoKTsNCi0gICAgICAgIA0KLSAgICAgICAgdGVzdENsYXNzOU9iamVjdC5zZXRQYXJhbTEodGVzdENsYXNzMkFycmF5KTsNCi0gICAgICAgIA0KLSAgICAgICAgVGVzdENsYXNzMTQgdGVzdENsYXNzMTRPYmplY3QgPSBuZXcgVGVzdENsYXNzMTQoKTsNCi0gICAgICAgIHRlc3RDbGFzczE0T2JqZWN0LnNldFBhcmFtMSh0ZXN0Q2xhc3M5T2JqZWN0KTsNCi0gICAgICAgIA0KLSAgICAgICAgdGVzdE9iamVjdC5zZXRQYXJhbTEodGVzdENsYXNzMTRPYmplY3QpOw0KLSAgICAgICAgDQotICAgICAgICByZXN1bHQgPSAoVGVzdENsYXNzMTUpIGdldFJldHVybk9iamVjdChwYXJhbWV0ZXIsIHRlc3RPYmplY3QpOw0KLSAgICAgICAgDQotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdC5nZXRQYXJhbTEoKS5nZXRQYXJhbTEoKS5nZXRQYXJhbTEoKVswXS5nZXRQYXJhbTEoKSA9PSA1KTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzdWx0LmdldFBhcmFtMSgpLmdldFBhcmFtMSgpLmdldFBhcmFtMSgpWzBdLmdldFBhcmFtMigpID09IDYuMWYpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHQuZ2V0UGFyYW0xKCkuZ2V0UGFyYW0xKCkuZ2V0UGFyYW0xKClbMF0uZ2V0UGFyYW0zKCkgPT0gNy4yKTsNCi0gICAgICAgIA0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHQuZ2V0UGFyYW0xKCkuZ2V0UGFyYW0xKCkuZ2V0UGFyYW0xKClbMV0uZ2V0UGFyYW0xKCkgPT0gMSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdC5nZXRQYXJhbTEoKS5nZXRQYXJhbTEoKS5nZXRQYXJhbTEoKVsxXS5nZXRQYXJhbTIoKSA9PSAyLjFmKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzdWx0LmdldFBhcmFtMSgpLmdldFBhcmFtMSgpLmdldFBhcmFtMSgpWzFdLmdldFBhcmFtMygpID09IDMuMik7DQotICAgICAgICANCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kYXRhYmluZC9TaW1wbGVBcnJheXNUZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kYXRhYmluZC9TaW1wbGVBcnJheXNUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3OTBlZWQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvU2ltcGxlQXJyYXlzVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5ybWkuZGF0YWJpbmQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5kYXRhYmluZC5kdG8uVGVzdENsYXNzNDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5kYXRhYmluZC5kdG8uVGVzdENsYXNzODsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS5QYXJhbWV0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBTaW1wbGVBcnJheXNUZXN0IGV4dGVuZHMgRGF0YUJpbmRUZXN0IHsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDbGFzczQxKCkgewotICAgICAgICBDbGFzcyB0ZXN0Q2xhc3MgPSBUZXN0Q2xhc3M0LmNsYXNzOwotICAgICAgICBQYXJhbWV0ZXIgcGFyYW1ldGVyID0gbmV3IFBhcmFtZXRlcih0ZXN0Q2xhc3MsICJQYXJhbTEiKTsKLSAgICAgICAgVGVzdENsYXNzNCB0ZXN0T2JqZWN0ID0gbmV3IFRlc3RDbGFzczQoKTsKLSAgICAgICAgVGVzdENsYXNzNCByZXN1bHQgPSAoVGVzdENsYXNzNCkgZ2V0UmV0dXJuT2JqZWN0KHBhcmFtZXRlciwgdGVzdE9iamVjdCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UGFyYW0xKCksIG51bGwpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtMigpLCBudWxsKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTMoKSwgbnVsbCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UGFyYW00KCksIG51bGwpOwotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENsYXNzNDIoKSB7Ci0gICAgICAgIENsYXNzIHRlc3RDbGFzcyA9IFRlc3RDbGFzczQuY2xhc3M7Ci0gICAgICAgIFBhcmFtZXRlciBwYXJhbWV0ZXIgPSBuZXcgUGFyYW1ldGVyKHRlc3RDbGFzcywgIlBhcmFtMSIpOwotICAgICAgICBUZXN0Q2xhc3M0IHRlc3RPYmplY3QgPSBuZXcgVGVzdENsYXNzNCgpOwotICAgICAgICB0ZXN0T2JqZWN0LnNldFBhcmFtMShuZXcgaW50W117MiwgM30pOwotICAgICAgICBUZXN0Q2xhc3M0IHJlc3VsdCA9IChUZXN0Q2xhc3M0KSBnZXRSZXR1cm5PYmplY3QocGFyYW1ldGVyLCB0ZXN0T2JqZWN0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTEoKVswXSwgMik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UGFyYW0xKClbMV0sIDMpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtMigpLCBudWxsKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTMoKSwgbnVsbCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UGFyYW00KCksIG51bGwpOwotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENsYXNzNDMoKSB7Ci0gICAgICAgIENsYXNzIHRlc3RDbGFzcyA9IFRlc3RDbGFzczQuY2xhc3M7Ci0gICAgICAgIFBhcmFtZXRlciBwYXJhbWV0ZXIgPSBuZXcgUGFyYW1ldGVyKHRlc3RDbGFzcywgIlBhcmFtMSIpOwotICAgICAgICBUZXN0Q2xhc3M0IHRlc3RPYmplY3QgPSBuZXcgVGVzdENsYXNzNCgpOwotICAgICAgICB0ZXN0T2JqZWN0LnNldFBhcmFtMihuZXcgSW50ZWdlcltde25ldyBJbnRlZ2VyKDIpLCBuZXcgSW50ZWdlcigzKSwgbnVsbCwgbmV3IEludGVnZXIoNCl9KTsKLSAgICAgICAgVGVzdENsYXNzNCByZXN1bHQgPSAoVGVzdENsYXNzNCkgZ2V0UmV0dXJuT2JqZWN0KHBhcmFtZXRlciwgdGVzdE9iamVjdCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UGFyYW0xKCksIG51bGwpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtMigpWzBdLCBuZXcgSW50ZWdlcigyKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UGFyYW0yKClbMV0sIG5ldyBJbnRlZ2VyKDMpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTIoKVsyXSwgbnVsbCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UGFyYW0yKClbM10sIG5ldyBJbnRlZ2VyKDQpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTMoKSwgbnVsbCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UGFyYW00KCksIG51bGwpOwotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENsYXNzNDMyKCkgewotICAgICAgICBDbGFzcyB0ZXN0Q2xhc3MgPSBUZXN0Q2xhc3M4LmNsYXNzOwotICAgICAgICBQYXJhbWV0ZXIgcGFyYW1ldGVyID0gbmV3IFBhcmFtZXRlcih0ZXN0Q2xhc3MsICJQYXJhbTEiKTsKLSAgICAgICAgVGVzdENsYXNzOCB0ZXN0T2JqZWN0ID0gbmV3IFRlc3RDbGFzczgoKTsKLSAgICAgICAgdGVzdE9iamVjdC5zZXRQYXJhbTEobmV3IEludGVnZXJbXXtudWxsLCBudWxsfSk7Ci0gICAgICAgIFRlc3RDbGFzczggcmVzdWx0ID0gKFRlc3RDbGFzczgpIGdldFJldHVybk9iamVjdChwYXJhbWV0ZXIsIHRlc3RPYmplY3QpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtMSgpWzBdLCBudWxsKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTEoKVsxXSwgbnVsbCk7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xhc3M0MzMoKSB7Ci0gICAgICAgIENsYXNzIHRlc3RDbGFzcyA9IFRlc3RDbGFzczguY2xhc3M7Ci0gICAgICAgIFBhcmFtZXRlciBwYXJhbWV0ZXIgPSBuZXcgUGFyYW1ldGVyKHRlc3RDbGFzcywgIlBhcmFtMSIpOwotICAgICAgICBUZXN0Q2xhc3M4IHRlc3RPYmplY3QgPSBuZXcgVGVzdENsYXNzOCgpOwotICAgICAgICBUZXN0Q2xhc3M4IHJlc3VsdCA9IChUZXN0Q2xhc3M4KSBnZXRSZXR1cm5PYmplY3QocGFyYW1ldGVyLCB0ZXN0T2JqZWN0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTEoKSwgbnVsbCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UGFyYW0yKCksIG51bGwpOwotCi0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xhc3M0NCgpIHsKLSAgICAgICAgQ2xhc3MgdGVzdENsYXNzID0gVGVzdENsYXNzNC5jbGFzczsKLSAgICAgICAgUGFyYW1ldGVyIHBhcmFtZXRlciA9IG5ldyBQYXJhbWV0ZXIodGVzdENsYXNzLCAiUGFyYW0xIik7Ci0gICAgICAgIFRlc3RDbGFzczQgdGVzdE9iamVjdCA9IG5ldyBUZXN0Q2xhc3M0KCk7Ci0gICAgICAgIHRlc3RPYmplY3Quc2V0UGFyYW0zKG5ldyBTdHJpbmdbXXsidGVzdCBTdHJpbmcxIiwgbnVsbCxudWxsLCAidGVzdCBTdHJpbmcyIn0pOwotICAgICAgICBUZXN0Q2xhc3M0IHJlc3VsdCA9IChUZXN0Q2xhc3M0KSBnZXRSZXR1cm5PYmplY3QocGFyYW1ldGVyLCB0ZXN0T2JqZWN0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTEoKSwgbnVsbCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UGFyYW0yKCksIG51bGwpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtMygpWzBdLCAidGVzdCBTdHJpbmcxIik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UGFyYW0zKClbMV0sIG51bGwpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtMygpWzJdLCBudWxsKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTMoKVszXSwgInRlc3QgU3RyaW5nMiIpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtNCgpLCBudWxsKTsKLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDbGFzczQ1KCkgewotICAgICAgICBDbGFzcyB0ZXN0Q2xhc3MgPSBUZXN0Q2xhc3M0LmNsYXNzOwotICAgICAgICBQYXJhbWV0ZXIgcGFyYW1ldGVyID0gbmV3IFBhcmFtZXRlcih0ZXN0Q2xhc3MsICJQYXJhbTEiKTsKLSAgICAgICAgVGVzdENsYXNzNCB0ZXN0T2JqZWN0ID0gbmV3IFRlc3RDbGFzczQoKTsKLSAgICAgICAgdGVzdE9iamVjdC5zZXRQYXJhbTQobmV3IGZsb2F0W117MzQuNWYsIDQ0LjVmfSk7Ci0gICAgICAgIFRlc3RDbGFzczQgcmVzdWx0ID0gKFRlc3RDbGFzczQpIGdldFJldHVybk9iamVjdChwYXJhbWV0ZXIsIHRlc3RPYmplY3QpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtMSgpLCBudWxsKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTIoKSwgbnVsbCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UGFyYW0zKCksIG51bGwpOwotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdC5nZXRQYXJhbTQoKVswXSA9PSAzNC41KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHQuZ2V0UGFyYW00KClbMV0gPT0gNDQuNSk7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xhc3M0NigpIHsKLSAgICAgICAgQ2xhc3MgdGVzdENsYXNzID0gVGVzdENsYXNzNC5jbGFzczsKLSAgICAgICAgUGFyYW1ldGVyIHBhcmFtZXRlciA9IG5ldyBQYXJhbWV0ZXIodGVzdENsYXNzLCAiUGFyYW0xIik7Ci0gICAgICAgIFRlc3RDbGFzczQgdGVzdE9iamVjdCA9IG5ldyBUZXN0Q2xhc3M0KCk7Ci0gICAgICAgIHRlc3RPYmplY3Quc2V0UGFyYW0xKG5ldyBpbnRbXXsyLCAzfSk7Ci0gICAgICAgIHRlc3RPYmplY3Quc2V0UGFyYW0yKG5ldyBJbnRlZ2VyW117bmV3IEludGVnZXIoMiksIG5ldyBJbnRlZ2VyKDMpfSk7Ci0gICAgICAgIHRlc3RPYmplY3Quc2V0UGFyYW0zKG5ldyBTdHJpbmdbXXsidGVzdCBTdHJpbmcxIiwgInRlc3QgU3RyaW5nMiJ9KTsKLSAgICAgICAgdGVzdE9iamVjdC5zZXRQYXJhbTQobmV3IGZsb2F0W117MzQuNWYsIDQ0LjVmfSk7Ci0gICAgICAgIFRlc3RDbGFzczQgcmVzdWx0ID0gKFRlc3RDbGFzczQpIGdldFJldHVybk9iamVjdChwYXJhbWV0ZXIsIHRlc3RPYmplY3QpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtMSgpWzBdLCAyKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTEoKVsxXSwgMyk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UGFyYW0yKClbMF0sIG5ldyBJbnRlZ2VyKDIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTIoKVsxXSwgbmV3IEludGVnZXIoMykpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtMygpWzBdLCAidGVzdCBTdHJpbmcxIik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UGFyYW0zKClbMV0sICJ0ZXN0IFN0cmluZzIiKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHQuZ2V0UGFyYW00KClbMF0gPT0gMzQuNSk7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0LmdldFBhcmFtNCgpWzFdID09IDQ0LjUpOwotCi0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL1NpbXBsZURhdGFCaW5kVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvU2ltcGxlRGF0YUJpbmRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2ZTFhNTEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvU2ltcGxlRGF0YUJpbmRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLmRhdGFiaW5kOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZGF0YWJpbmQuZHRvLlRlc3RDbGFzczE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZGF0YWJpbmQuZHRvLlRlc3RDbGFzczI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZGF0YWJpbmQuZHRvLlRlc3RDbGFzczM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEuUGFyYW1ldGVyOwotCi1wdWJsaWMgY2xhc3MgU2ltcGxlRGF0YUJpbmRUZXN0IGV4dGVuZHMgRGF0YUJpbmRUZXN0IHsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RUZXN0Q2xhc3MxKCkgewotCi0gICAgICAgIENsYXNzIHRlc3RDbGFzcyA9IFRlc3RDbGFzczEuY2xhc3M7Ci0gICAgICAgIFBhcmFtZXRlciBwYXJhbWV0ZXIgPSBuZXcgUGFyYW1ldGVyKHRlc3RDbGFzcywgIlBhcmFtMSIpOwotICAgICAgICBUZXN0Q2xhc3MxIHRlc3RPYmplY3QgPSBuZXcgVGVzdENsYXNzMSgpOwotICAgICAgICBUZXN0Q2xhc3MxIHJlc3VsdCA9IChUZXN0Q2xhc3MxKSBnZXRSZXR1cm5PYmplY3QocGFyYW1ldGVyLCB0ZXN0T2JqZWN0KTsKLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RUZXN0SW50KCkgewotCi0gICAgICAgIFBhcmFtZXRlciBwYXJhbWV0ZXIgPSBuZXcgUGFyYW1ldGVyKGludC5jbGFzcywgIlBhcmFtMSIpOwotICAgICAgICBJbnRlZ2VyIHJlc3VsdCA9IChJbnRlZ2VyKSBnZXRSZXR1cm5PYmplY3QocGFyYW1ldGVyLCBuZXcgSW50ZWdlcigzKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQsIG5ldyBJbnRlZ2VyKDMpKTsKLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RUZXN0U3RyaW5nKCkgewotCi0gICAgICAgIFBhcmFtZXRlciBwYXJhbWV0ZXIgPSBuZXcgUGFyYW1ldGVyKFN0cmluZy5jbGFzcywgIlBhcmFtMSIpOwotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gKFN0cmluZykgZ2V0UmV0dXJuT2JqZWN0KHBhcmFtZXRlciwgInRlc3QgU3RyaW5nIik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQsICJ0ZXN0IFN0cmluZyIpOwotICAgICAgICByZXN1bHQgPSAoU3RyaW5nKSBnZXRSZXR1cm5PYmplY3QocGFyYW1ldGVyLCBudWxsKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdCwgbnVsbCk7Ci0KLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RUZXN0Q2xhc3MyKCkgewotICAgICAgICBDbGFzcyB0ZXN0Q2xhc3MgPSBUZXN0Q2xhc3MyLmNsYXNzOwotICAgICAgICBQYXJhbWV0ZXIgcGFyYW1ldGVyID0gbmV3IFBhcmFtZXRlcih0ZXN0Q2xhc3MsICJQYXJhbWV0ZXIxIik7Ci0gICAgICAgIFRlc3RDbGFzczIgdGVzdE9iamVjdCA9IG5ldyBUZXN0Q2xhc3MyKCk7Ci0gICAgICAgIHRlc3RPYmplY3Quc2V0UGFyYW0xKDMpOwotICAgICAgICB0ZXN0T2JqZWN0LnNldFBhcmFtMigzLjQ1Zik7Ci0gICAgICAgIHRlc3RPYmplY3Quc2V0UGFyYW0zKDQuNTY3OCk7Ci0KLSAgICAgICAgVGVzdENsYXNzMiByZXN1bHQgPSAoVGVzdENsYXNzMikgZ2V0UmV0dXJuT2JqZWN0KHBhcmFtZXRlciwgdGVzdE9iamVjdCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UGFyYW0xKCksIDMpOwotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdC5nZXRQYXJhbTIoKSA9PSAzLjQ1Zik7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0LmdldFBhcmFtMygpID09IDQuNTY3OCk7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VGVzdENsYXNzMygpIHsKLSAgICAgICAgQ2xhc3MgdGVzdENsYXNzID0gVGVzdENsYXNzMy5jbGFzczsKLSAgICAgICAgUGFyYW1ldGVyIHBhcmFtZXRlciA9IG5ldyBQYXJhbWV0ZXIodGVzdENsYXNzLCAiUGFyYW0xIik7Ci0gICAgICAgIFRlc3RDbGFzczMgdGVzdE9iamVjdCA9IG5ldyBUZXN0Q2xhc3MzKCk7Ci0KLSAgICAgICAgdGVzdE9iamVjdC5zZXRQYXJhbTEobmV3IEludGVnZXIoMykpOwotICAgICAgICB0ZXN0T2JqZWN0LnNldFBhcmFtMihuZXcgRmxvYXQoMzQuNWYpKTsKLSAgICAgICAgdGVzdE9iamVjdC5zZXRQYXJhbTMobmV3IERvdWJsZSgyMy40KSk7Ci0gICAgICAgIHRlc3RPYmplY3Quc2V0UGFyYW00KCJ0ZXN0IFN0cmluZyIpOwotCi0gICAgICAgIFRlc3RDbGFzczMgcmVzdWx0OwotICAgICAgICByZXN1bHQgPSAoVGVzdENsYXNzMykgZ2V0UmV0dXJuT2JqZWN0KHBhcmFtZXRlciwgdGVzdE9iamVjdCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UGFyYW0xKCksIG5ldyBJbnRlZ2VyKDMpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTIoKSwgbmV3IEZsb2F0KDM0LjVmKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UGFyYW0zKCksIG5ldyBEb3VibGUoMjMuNCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtNCgpLCAidGVzdCBTdHJpbmciKTsKLQotICAgICAgICB0ZXN0T2JqZWN0ID0gbmV3IFRlc3RDbGFzczMoKTsKLSAgICAgICAgcmVzdWx0ID0gKFRlc3RDbGFzczMpIGdldFJldHVybk9iamVjdChwYXJhbWV0ZXIsIHRlc3RPYmplY3QpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtMSgpLCBudWxsKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTIoKSwgbnVsbCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UGFyYW0zKCksIG51bGwpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtNCgpLCBudWxsKTsKLQotCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvU2ltcGxlUmVxdWVzdFJlc3BvbnNlVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvU2ltcGxlUmVxdWVzdFJlc3BvbnNlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTgwMGFmLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL1NpbXBsZVJlcXVlc3RSZXNwb25zZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLmRhdGFiaW5kOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZGF0YWJpbmQuc2VydmljZS5TZXJ2aWNlMTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS5PcGVyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0KLXB1YmxpYyBjbGFzcyBTaW1wbGVSZXF1ZXN0UmVzcG9uc2VUZXN0IGV4dGVuZHMgUmVxdWVzdFJlc3BvbnNlVGVzdCB7Ci0KLQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICB0aGlzLnNlcnZpY2VDbGFzcyA9IFNlcnZpY2UxLmNsYXNzOwotICAgICAgIHRoaXMuc2VydmljZU9iamVjdCA9IG5ldyBTZXJ2aWNlMSgpOwotICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE1ldGhvZDEoKSB7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIGZpcnN0IGNyZWF0ZSBzZXJ2aWNlIGRhdGEKLQotICAgICAgICAgICAgT3BlcmF0aW9uIG9wZXJhdGlvbiA9IHRoaXMuc2VydmljZS5nZXRPcGVyYXRpb24oIm1ldGhvZDEiKTsKLSAgICAgICAgICAgIC8vIGdldCBvYmplY3RzIGFmdGVyIHNlcmlhbGl6YXRpb24gYW5kIGRlc2VyaWFsaXphdGlvbi4KLSAgICAgICAgICAgIC8vIHRoaXMgcmV0dXJuZWQgb2JqZWN0cyBtdXN0YmUgaWRlbnRpY2FsIHdpdGggdGhlIG9yaWdpbmFsIGFycmF5IGxpc3QgZWxlbWVudHMKLSAgICAgICAgICAgIExpc3QgaW5wdXRPYmplY3RzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgT2JqZWN0W10gb2JqZWN0cyA9IGdldElucHV0T2JqZWN0KGlucHV0T2JqZWN0cywgb3BlcmF0aW9uKTsKLQotICAgICAgICAgICAgT2JqZWN0IG9iamVjdCA9IG9wZXJhdGlvbi5nZXRKYXZhTWV0aG9kKCkuaW52b2tlKHRoaXMuc2VydmljZU9iamVjdCwgb2JqZWN0cyk7Ci0gICAgICAgICAgICBPYmplY3QgcmV0dXJuT2JqZWN0ID0gZ2V0UmV0dXJuT2JqZWN0KG9iamVjdCwgb3BlcmF0aW9uKTsKLQotICAgICAgICAgICAgYXNzZXJ0TnVsbChyZXR1cm5PYmplY3QpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE1ldGhvZDIoKSB7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIGZpcnN0IGNyZWF0ZSBzZXJ2aWNlIGRhdGEKLQotICAgICAgICAgICAgT3BlcmF0aW9uIG9wZXJhdGlvbiA9IHRoaXMuc2VydmljZS5nZXRPcGVyYXRpb24oIm1ldGhvZDIiKTsKLSAgICAgICAgICAgIC8vIGdldCBvYmplY3RzIGFmdGVyIHNlcmlhbGl6YXRpb24gYW5kIGRlc2VyaWFsaXphdGlvbi4KLSAgICAgICAgICAgIC8vIHRoaXMgcmV0dXJuZWQgb2JqZWN0cyBtdXN0YmUgaWRlbnRpY2FsIHdpdGggdGhlIG9yaWdpbmFsIGFycmF5IGxpc3QgZWxlbWVudHMKLSAgICAgICAgICAgIExpc3QgaW5wdXRPYmplY3RzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgaW5wdXRPYmplY3RzLmFkZChuZXcgSW50ZWdlcigzKSk7Ci0gICAgICAgICAgICBPYmplY3RbXSBvYmplY3RzID0gZ2V0SW5wdXRPYmplY3QoaW5wdXRPYmplY3RzLCBvcGVyYXRpb24pOwotCi0gICAgICAgICAgICBJbnRlZ2VyIG9iamVjdCA9IChJbnRlZ2VyKSBvcGVyYXRpb24uZ2V0SmF2YU1ldGhvZCgpLmludm9rZSh0aGlzLnNlcnZpY2VPYmplY3QsIG9iamVjdHMpOwotICAgICAgICAgICAgSW50ZWdlciByZXR1cm5PYmplY3QgPSAoSW50ZWdlcikgZ2V0UmV0dXJuT2JqZWN0KG9iamVjdCwgb3BlcmF0aW9uKTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJldHVybk9iamVjdC5pbnRWYWx1ZSgpLCAzKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNZXRob2QzMSgpIHsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gZmlyc3QgY3JlYXRlIHNlcnZpY2UgZGF0YQotCi0gICAgICAgICAgICBPcGVyYXRpb24gb3BlcmF0aW9uID0gdGhpcy5zZXJ2aWNlLmdldE9wZXJhdGlvbigibWV0aG9kMyIpOwotICAgICAgICAgICAgLy8gZ2V0IG9iamVjdHMgYWZ0ZXIgc2VyaWFsaXphdGlvbiBhbmQgZGVzZXJpYWxpemF0aW9uLgotICAgICAgICAgICAgLy8gdGhpcyByZXR1cm5lZCBvYmplY3RzIG11c3RiZSBpZGVudGljYWwgd2l0aCB0aGUgb3JpZ2luYWwgYXJyYXkgbGlzdCBlbGVtZW50cwotICAgICAgICAgICAgTGlzdCBpbnB1dE9iamVjdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICBpbnB1dE9iamVjdHMuYWRkKG51bGwpOwotICAgICAgICAgICAgT2JqZWN0W10gb2JqZWN0cyA9IGdldElucHV0T2JqZWN0KGlucHV0T2JqZWN0cywgb3BlcmF0aW9uKTsKLQotICAgICAgICAgICAgT2JqZWN0IG9iamVjdCA9IG9wZXJhdGlvbi5nZXRKYXZhTWV0aG9kKCkuaW52b2tlKHRoaXMuc2VydmljZU9iamVjdCwgb2JqZWN0cyk7Ci0gICAgICAgICAgICBPYmplY3QgcmV0dXJuT2JqZWN0ID0gZ2V0UmV0dXJuT2JqZWN0KG9iamVjdCwgb3BlcmF0aW9uKTsKLQotICAgICAgICAgICAgYXNzZXJ0TnVsbChyZXR1cm5PYmplY3QpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE1ldGhvZDMyKCkgewotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBmaXJzdCBjcmVhdGUgc2VydmljZSBkYXRhCi0KLSAgICAgICAgICAgIE9wZXJhdGlvbiBvcGVyYXRpb24gPSB0aGlzLnNlcnZpY2UuZ2V0T3BlcmF0aW9uKCJtZXRob2QzIik7Ci0gICAgICAgICAgICAvLyBnZXQgb2JqZWN0cyBhZnRlciBzZXJpYWxpemF0aW9uIGFuZCBkZXNlcmlhbGl6YXRpb24uCi0gICAgICAgICAgICAvLyB0aGlzIHJldHVybmVkIG9iamVjdHMgbXVzdGJlIGlkZW50aWNhbCB3aXRoIHRoZSBvcmlnaW5hbCBhcnJheSBsaXN0IGVsZW1lbnRzCi0gICAgICAgICAgICBMaXN0IGlucHV0T2JqZWN0cyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgIGlucHV0T2JqZWN0cy5hZGQoInRlc3QgU3RyaW5nIik7Ci0gICAgICAgICAgICBPYmplY3RbXSBvYmplY3RzID0gZ2V0SW5wdXRPYmplY3QoaW5wdXRPYmplY3RzLCBvcGVyYXRpb24pOwotCi0gICAgICAgICAgICBTdHJpbmcgb2JqZWN0ID0gKFN0cmluZykgb3BlcmF0aW9uLmdldEphdmFNZXRob2QoKS5pbnZva2UodGhpcy5zZXJ2aWNlT2JqZWN0LCBvYmplY3RzKTsKLSAgICAgICAgICAgIFN0cmluZyByZXR1cm5PYmplY3QgPSAoU3RyaW5nKSBnZXRSZXR1cm5PYmplY3Qob2JqZWN0LCBvcGVyYXRpb24pOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmV0dXJuT2JqZWN0LCAidGVzdCBTdHJpbmciKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNZXRob2Q0MSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIGZpcnN0IGNyZWF0ZSBzZXJ2aWNlIGRhdGEKLQotICAgICAgICAgICAgT3BlcmF0aW9uIG9wZXJhdGlvbiA9IHRoaXMuc2VydmljZS5nZXRPcGVyYXRpb24oIm1ldGhvZDQiKTsKLSAgICAgICAgICAgIC8vIGdldCBvYmplY3RzIGFmdGVyIHNlcmlhbGl6YXRpb24gYW5kIGRlc2VyaWFsaXphdGlvbi4KLSAgICAgICAgICAgIC8vIHRoaXMgcmV0dXJuZWQgb2JqZWN0cyBtdXN0YmUgaWRlbnRpY2FsIHdpdGggdGhlIG9yaWdpbmFsIGFycmF5IGxpc3QgZWxlbWVudHMKLSAgICAgICAgICAgIExpc3QgaW5wdXRPYmplY3RzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgaW5wdXRPYmplY3RzLmFkZChuZXcgaW50W117MiwgMywgNX0pOwotICAgICAgICAgICAgT2JqZWN0W10gb2JqZWN0cyA9IGdldElucHV0T2JqZWN0KGlucHV0T2JqZWN0cywgb3BlcmF0aW9uKTsKLQotICAgICAgICAgICAgaW50W10gb2JqZWN0ID0gKGludFtdKSBvcGVyYXRpb24uZ2V0SmF2YU1ldGhvZCgpLmludm9rZSh0aGlzLnNlcnZpY2VPYmplY3QsIG9iamVjdHMpOwotICAgICAgICAgICAgaW50W10gcmV0dXJuT2JqZWN0ID0gKGludFtdKSBnZXRSZXR1cm5PYmplY3Qob2JqZWN0LCBvcGVyYXRpb24pOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmV0dXJuT2JqZWN0WzBdLCAyKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXR1cm5PYmplY3RbMV0sIDMpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJldHVybk9iamVjdFsyXSwgNSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kNDIoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBmaXJzdCBjcmVhdGUgc2VydmljZSBkYXRhCi0KLSAgICAgICAgICAgIE9wZXJhdGlvbiBvcGVyYXRpb24gPSB0aGlzLnNlcnZpY2UuZ2V0T3BlcmF0aW9uKCJtZXRob2Q0Iik7Ci0gICAgICAgICAgICAvLyBnZXQgb2JqZWN0cyBhZnRlciBzZXJpYWxpemF0aW9uIGFuZCBkZXNlcmlhbGl6YXRpb24uCi0gICAgICAgICAgICAvLyB0aGlzIHJldHVybmVkIG9iamVjdHMgbXVzdGJlIGlkZW50aWNhbCB3aXRoIHRoZSBvcmlnaW5hbCBhcnJheSBsaXN0IGVsZW1lbnRzCi0gICAgICAgICAgICBMaXN0IGlucHV0T2JqZWN0cyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgIGlucHV0T2JqZWN0cy5hZGQobnVsbCk7Ci0gICAgICAgICAgICBPYmplY3RbXSBvYmplY3RzID0gZ2V0SW5wdXRPYmplY3QoaW5wdXRPYmplY3RzLCBvcGVyYXRpb24pOwotCi0gICAgICAgICAgICBpbnRbXSBvYmplY3QgPSAoaW50W10pIG9wZXJhdGlvbi5nZXRKYXZhTWV0aG9kKCkuaW52b2tlKHRoaXMuc2VydmljZU9iamVjdCwgb2JqZWN0cyk7Ci0gICAgICAgICAgICBpbnRbXSByZXR1cm5PYmplY3QgPSAoaW50W10pIGdldFJldHVybk9iamVjdChvYmplY3QsIG9wZXJhdGlvbik7Ci0KLSAgICAgICAgICAgIGFzc2VydE51bGwocmV0dXJuT2JqZWN0KTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNZXRob2Q1MSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIGZpcnN0IGNyZWF0ZSBzZXJ2aWNlIGRhdGEKLQotICAgICAgICAgICAgT3BlcmF0aW9uIG9wZXJhdGlvbiA9IHRoaXMuc2VydmljZS5nZXRPcGVyYXRpb24oIm1ldGhvZDUiKTsKLSAgICAgICAgICAgIC8vIGdldCBvYmplY3RzIGFmdGVyIHNlcmlhbGl6YXRpb24gYW5kIGRlc2VyaWFsaXphdGlvbi4KLSAgICAgICAgICAgIC8vIHRoaXMgcmV0dXJuZWQgb2JqZWN0cyBtdXN0YmUgaWRlbnRpY2FsIHdpdGggdGhlIG9yaWdpbmFsIGFycmF5IGxpc3QgZWxlbWVudHMKLSAgICAgICAgICAgIExpc3QgaW5wdXRPYmplY3RzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgaW5wdXRPYmplY3RzLmFkZChuZXcgU3RyaW5nW117InN0cmluZzEiLCAic3RyaW5nMiIsICJzdHJpbmczIn0pOwotICAgICAgICAgICAgT2JqZWN0W10gb2JqZWN0cyA9IGdldElucHV0T2JqZWN0KGlucHV0T2JqZWN0cywgb3BlcmF0aW9uKTsKLQotICAgICAgICAgICAgU3RyaW5nW10gb2JqZWN0ID0gKFN0cmluZ1tdKSBvcGVyYXRpb24uZ2V0SmF2YU1ldGhvZCgpLmludm9rZSh0aGlzLnNlcnZpY2VPYmplY3QsIG9iamVjdHMpOwotICAgICAgICAgICAgU3RyaW5nW10gcmV0dXJuT2JqZWN0ID0gKFN0cmluZ1tdKSBnZXRSZXR1cm5PYmplY3Qob2JqZWN0LCBvcGVyYXRpb24pOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmV0dXJuT2JqZWN0WzBdLCAic3RyaW5nMSIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJldHVybk9iamVjdFsxXSwgInN0cmluZzIiKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXR1cm5PYmplY3RbMl0sICJzdHJpbmczIik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE1ldGhvZDUyKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gZmlyc3QgY3JlYXRlIHNlcnZpY2UgZGF0YQotCi0gICAgICAgICAgICBPcGVyYXRpb24gb3BlcmF0aW9uID0gdGhpcy5zZXJ2aWNlLmdldE9wZXJhdGlvbigibWV0aG9kNSIpOwotICAgICAgICAgICAgLy8gZ2V0IG9iamVjdHMgYWZ0ZXIgc2VyaWFsaXphdGlvbiBhbmQgZGVzZXJpYWxpemF0aW9uLgotICAgICAgICAgICAgLy8gdGhpcyByZXR1cm5lZCBvYmplY3RzIG11c3RiZSBpZGVudGljYWwgd2l0aCB0aGUgb3JpZ2luYWwgYXJyYXkgbGlzdCBlbGVtZW50cwotICAgICAgICAgICAgTGlzdCBpbnB1dE9iamVjdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICBpbnB1dE9iamVjdHMuYWRkKG5ldyBTdHJpbmdbXXtudWxsLCAic3RyaW5nMiIsIG51bGwsICJzdHJpbmc0In0pOwotICAgICAgICAgICAgT2JqZWN0W10gb2JqZWN0cyA9IGdldElucHV0T2JqZWN0KGlucHV0T2JqZWN0cywgb3BlcmF0aW9uKTsKLQotICAgICAgICAgICAgU3RyaW5nW10gb2JqZWN0ID0gKFN0cmluZ1tdKSBvcGVyYXRpb24uZ2V0SmF2YU1ldGhvZCgpLmludm9rZSh0aGlzLnNlcnZpY2VPYmplY3QsIG9iamVjdHMpOwotICAgICAgICAgICAgU3RyaW5nW10gcmV0dXJuT2JqZWN0ID0gKFN0cmluZ1tdKSBnZXRSZXR1cm5PYmplY3Qob2JqZWN0LCBvcGVyYXRpb24pOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmV0dXJuT2JqZWN0WzBdLCBudWxsKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXR1cm5PYmplY3RbMV0sICJzdHJpbmcyIik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmV0dXJuT2JqZWN0WzJdLCBudWxsKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXR1cm5PYmplY3RbM10sICJzdHJpbmc0Iik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kYXRhYmluZC9kdG8vQWN0aXZhdGUuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL2R0by9BY3RpdmF0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODUzYzU4Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL2R0by9BY3RpdmF0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJtaS5kYXRhYmluZC5kdG87Ci0KLQotcHVibGljIGNsYXNzIEFjdGl2YXRlIHsKLQotICAgIHByaXZhdGUgQ2FuY2VsV29ya2Zsb3dSZXF1ZXN0IENhbmNlbFdvcmtmbG93UmVxdWVzdDsKLQotICAgIHB1YmxpYyBDYW5jZWxXb3JrZmxvd1JlcXVlc3QgZ2V0Q2FuY2VsV29ya2Zsb3dSZXF1ZXN0KCkgewotICAgICAgICByZXR1cm4gQ2FuY2VsV29ya2Zsb3dSZXF1ZXN0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENhbmNlbFdvcmtmbG93UmVxdWVzdChDYW5jZWxXb3JrZmxvd1JlcXVlc3QgY2FuY2VsV29ya2Zsb3dSZXF1ZXN0KSB7Ci0gICAgICAgIENhbmNlbFdvcmtmbG93UmVxdWVzdCA9IGNhbmNlbFdvcmtmbG93UmVxdWVzdDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kYXRhYmluZC9kdG8vQ2FuY2VsV29ya2Zsb3dSZXF1ZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kYXRhYmluZC9kdG8vQ2FuY2VsV29ya2Zsb3dSZXF1ZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2YzY5YTUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvZHRvL0NhbmNlbFdvcmtmbG93UmVxdWVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJtaS5kYXRhYmluZC5kdG87Ci0KLQotcHVibGljIGNsYXNzIENhbmNlbFdvcmtmbG93UmVxdWVzdCB7Ci0KLSAgICBwcml2YXRlIGludCBJV0ZJRDsKLSAgICBwcml2YXRlIGludCBSZXN0YXJ0OwotCi0gICAgcHVibGljIGludCBnZXRJV0ZJRCgpIHsKLSAgICAgICAgcmV0dXJuIElXRklEOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldElXRklEKGludCBJV0ZJRCkgewotICAgICAgICB0aGlzLklXRklEID0gSVdGSUQ7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRSZXN0YXJ0KCkgewotICAgICAgICByZXR1cm4gUmVzdGFydDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRSZXN0YXJ0KGludCByZXN0YXJ0KSB7Ci0gICAgICAgIFJlc3RhcnQgPSByZXN0YXJ0OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL2R0by9DaGlsZENsYXNzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kYXRhYmluZC9kdG8vQ2hpbGRDbGFzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTk3YjViLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL2R0by9DaGlsZENsYXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLmRhdGFiaW5kLmR0bzsKLQotCi1wdWJsaWMgY2xhc3MgQ2hpbGRDbGFzcyBleHRlbmRzIFBhcmVudENsYXNzewotCi0gICAgcHJpdmF0ZSBmbG9hdCBwYXJhbTM7Ci0gICAgcHJpdmF0ZSBkb3VibGUgcGFyYW00OwotCi0gICAgcHVibGljIGZsb2F0IGdldFBhcmFtMygpIHsKLSAgICAgICAgcmV0dXJuIHBhcmFtMzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJhbTMoZmxvYXQgcGFyYW0zKSB7Ci0gICAgICAgIHRoaXMucGFyYW0zID0gcGFyYW0zOwotICAgIH0KLQotICAgIHB1YmxpYyBkb3VibGUgZ2V0UGFyYW00KCkgewotICAgICAgICByZXR1cm4gcGFyYW00OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBhcmFtNChkb3VibGUgcGFyYW00KSB7Ci0gICAgICAgIHRoaXMucGFyYW00ID0gcGFyYW00OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL2R0by9QYXJlbnRDbGFzcy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvZHRvL1BhcmVudENsYXNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxY2M3ZmEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvZHRvL1BhcmVudENsYXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLmRhdGFiaW5kLmR0bzsKLQotCi1wdWJsaWMgY2xhc3MgUGFyZW50Q2xhc3MgewotCi0gICAgcHJpdmF0ZSBTdHJpbmcgcGFyYW0xOwotICAgIHByaXZhdGUgaW50IHBhcmFtMjsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFyYW0xKCkgewotICAgICAgICByZXR1cm4gcGFyYW0xOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBhcmFtMShTdHJpbmcgcGFyYW0xKSB7Ci0gICAgICAgIHRoaXMucGFyYW0xID0gcGFyYW0xOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0UGFyYW0yKCkgewotICAgICAgICByZXR1cm4gcGFyYW0yOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBhcmFtMihpbnQgcGFyYW0yKSB7Ci0gICAgICAgIHRoaXMucGFyYW0yID0gcGFyYW0yOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL2R0by9UZXN0Q2xhc3MxLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kYXRhYmluZC9kdG8vVGVzdENsYXNzMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzVlZDJmLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL2R0by9UZXN0Q2xhc3MxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLmRhdGFiaW5kLmR0bzsKLQotCi1wdWJsaWMgY2xhc3MgVGVzdENsYXNzMSB7Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kYXRhYmluZC9kdG8vVGVzdENsYXNzMTAuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL2R0by9UZXN0Q2xhc3MxMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWRhYWE2Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL2R0by9UZXN0Q2xhc3MxMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJtaS5kYXRhYmluZC5kdG87Ci0KLQotcHVibGljIGNsYXNzIFRlc3RDbGFzczEwIHsKLQotICAgIHByaXZhdGUgT2JqZWN0IHBhcmFtMTsKLSAgICBwcml2YXRlIE9iamVjdFtdIHBhcmFtMjsKLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0UGFyYW0xKCkgewotICAgICAgICByZXR1cm4gcGFyYW0xOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBhcmFtMShPYmplY3QgcGFyYW0xKSB7Ci0gICAgICAgIHRoaXMucGFyYW0xID0gcGFyYW0xOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3RbXSBnZXRQYXJhbTIoKSB7Ci0gICAgICAgIHJldHVybiBwYXJhbTI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGFyYW0yKE9iamVjdFtdIHBhcmFtMikgewotICAgICAgICB0aGlzLnBhcmFtMiA9IHBhcmFtMjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kYXRhYmluZC9kdG8vVGVzdENsYXNzMTEuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL2R0by9UZXN0Q2xhc3MxMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTc1ODg3Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL2R0by9UZXN0Q2xhc3MxMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJtaS5kYXRhYmluZC5kdG87Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLQotcHVibGljIGNsYXNzIFRlc3RDbGFzczExIHsKLQotICAgIHByaXZhdGUgTGlzdCBwYXJhbTE7Ci0gICAgcHJpdmF0ZSBBcnJheUxpc3QgcGFyYW0yOwotICAgIHByaXZhdGUgU2V0IHBhcmFtMzsKLQotICAgIHB1YmxpYyBMaXN0IGdldFBhcmFtMSgpIHsKLSAgICAgICAgcmV0dXJuIHBhcmFtMTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJhbTEoTGlzdCBwYXJhbTEpIHsKLSAgICAgICAgdGhpcy5wYXJhbTEgPSBwYXJhbTE7Ci0gICAgfQotCi0gICAgcHVibGljIEFycmF5TGlzdCBnZXRQYXJhbTIoKSB7Ci0gICAgICAgIHJldHVybiBwYXJhbTI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGFyYW0yKEFycmF5TGlzdCBwYXJhbTIpIHsKLSAgICAgICAgdGhpcy5wYXJhbTIgPSBwYXJhbTI7Ci0gICAgfQotCi0gICAgcHVibGljIFNldCBnZXRQYXJhbTMoKSB7Ci0gICAgICAgIHJldHVybiBwYXJhbTM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGFyYW0zKFNldCBwYXJhbTMpIHsKLSAgICAgICAgdGhpcy5wYXJhbTMgPSBwYXJhbTM7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvZHRvL1Rlc3RDbGFzczEyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kYXRhYmluZC9kdG8vVGVzdENsYXNzMTIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQxN2ZkNy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kYXRhYmluZC9kdG8vVGVzdENsYXNzMTIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5ybWkuZGF0YWJpbmQuZHRvOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0KLXB1YmxpYyBjbGFzcyBUZXN0Q2xhc3MxMiB7Ci0KLSAgICBwcml2YXRlIE1hcCBwYXJhbTE7Ci0gICAgcHJpdmF0ZSBIYXNodGFibGUgcGFyYW0yOwotCi0gICAgcHVibGljIE1hcCBnZXRQYXJhbTEoKSB7Ci0gICAgICAgIHJldHVybiBwYXJhbTE7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGFyYW0xKE1hcCBwYXJhbTEpIHsKLSAgICAgICAgdGhpcy5wYXJhbTEgPSBwYXJhbTE7Ci0gICAgfQotCi0gICAgcHVibGljIEhhc2h0YWJsZSBnZXRQYXJhbTIoKSB7Ci0gICAgICAgIHJldHVybiBwYXJhbTI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGFyYW0yKEhhc2h0YWJsZSBwYXJhbTIpIHsKLSAgICAgICAgdGhpcy5wYXJhbTIgPSBwYXJhbTI7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kYXRhYmluZC9kdG8vVGVzdENsYXNzMTMuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL2R0by9UZXN0Q2xhc3MxMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNWMwN2YyLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL2R0by9UZXN0Q2xhc3MxMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJtaS5kYXRhYmluZC5kdG87Ci0KLQotcHVibGljIGNsYXNzIFRlc3RDbGFzczEzIHsKLQotICAgIHByaXZhdGUgVGVzdFJlc3RyaWN0aW9uQmVhbiBwYXJhbTE7Ci0gICAgcHJpdmF0ZSBUZXN0UmVzdHJpY3Rpb25CZWFuW10gcGFyYW0yOwotCi0gICAgcHVibGljIFRlc3RSZXN0cmljdGlvbkJlYW4gZ2V0UGFyYW0xKCkgewotICAgICAgICByZXR1cm4gcGFyYW0xOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBhcmFtMShUZXN0UmVzdHJpY3Rpb25CZWFuIHBhcmFtMSkgewotICAgICAgICB0aGlzLnBhcmFtMSA9IHBhcmFtMTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVGVzdFJlc3RyaWN0aW9uQmVhbltdIGdldFBhcmFtMigpIHsKLSAgICAgICAgcmV0dXJuIHBhcmFtMjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJhbTIoVGVzdFJlc3RyaWN0aW9uQmVhbltdIHBhcmFtMikgewotICAgICAgICB0aGlzLnBhcmFtMiA9IHBhcmFtMjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kYXRhYmluZC9kdG8vVGVzdENsYXNzMTQuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL2R0by9UZXN0Q2xhc3MxNC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTc0NGUwLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL2R0by9UZXN0Q2xhc3MxNC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5ybWkuZGF0YWJpbmQuZHRvOw0KLQ0KLXB1YmxpYyBjbGFzcyBUZXN0Q2xhc3MxNCB7DQotICAgIA0KLSAgICBwcml2YXRlIFRlc3RDbGFzczkgcGFyYW0xOw0KLQ0KLSAgICBwdWJsaWMgVGVzdENsYXNzOSBnZXRQYXJhbTEoKSB7DQotICAgICAgICByZXR1cm4gcGFyYW0xOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFBhcmFtMShUZXN0Q2xhc3M5IHBhcmFtMSkgew0KLSAgICAgICAgdGhpcy5wYXJhbTEgPSBwYXJhbTE7DQotICAgIH0gICAgDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL2R0by9UZXN0Q2xhc3MxNS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvZHRvL1Rlc3RDbGFzczE1LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmMzI2NTIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvZHRvL1Rlc3RDbGFzczE1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJtaS5kYXRhYmluZC5kdG87DQotDQotcHVibGljIGNsYXNzIFRlc3RDbGFzczE1IHsNCi0gICAgDQotICAgIHByaXZhdGUgVGVzdENsYXNzMTQgcGFyYW0xOw0KLQ0KLSAgICBwdWJsaWMgVGVzdENsYXNzMTQgZ2V0UGFyYW0xKCkgew0KLSAgICAgICAgcmV0dXJuIHBhcmFtMTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJhbTEoVGVzdENsYXNzMTQgcGFyYW0xKSB7DQotICAgICAgICB0aGlzLnBhcmFtMSA9IHBhcmFtMTsNCi0gICAgfSAgICANCi19DQotDQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvZHRvL1Rlc3RDbGFzczIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL2R0by9UZXN0Q2xhc3MyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwY2E1NGIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvZHRvL1Rlc3RDbGFzczIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5ybWkuZGF0YWJpbmQuZHRvOwotCi1wdWJsaWMgY2xhc3MgVGVzdENsYXNzMiB7Ci0gICAgCi0gICAgcHJpdmF0ZSBpbnQgcGFyYW0xOwotICAgIHByaXZhdGUgZmxvYXQgcGFyYW0yOwotICAgIHByaXZhdGUgZG91YmxlIHBhcmFtMzsKLQotICAgIHB1YmxpYyBpbnQgZ2V0UGFyYW0xKCkgewotICAgICAgICByZXR1cm4gcGFyYW0xOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBhcmFtMShpbnQgcGFyYW0xKSB7Ci0gICAgICAgIHRoaXMucGFyYW0xID0gcGFyYW0xOwotICAgIH0KLQotICAgIHB1YmxpYyBmbG9hdCBnZXRQYXJhbTIoKSB7Ci0gICAgICAgIHJldHVybiBwYXJhbTI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGFyYW0yKGZsb2F0IHBhcmFtMikgewotICAgICAgICB0aGlzLnBhcmFtMiA9IHBhcmFtMjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZG91YmxlIGdldFBhcmFtMygpIHsKLSAgICAgICAgcmV0dXJuIHBhcmFtMzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJhbTMoZG91YmxlIHBhcmFtMykgewotICAgICAgICB0aGlzLnBhcmFtMyA9IHBhcmFtMzsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kYXRhYmluZC9kdG8vVGVzdENsYXNzMy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvZHRvL1Rlc3RDbGFzczMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFkYzM2MC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kYXRhYmluZC9kdG8vVGVzdENsYXNzMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJtaS5kYXRhYmluZC5kdG87Ci0KLQotcHVibGljIGNsYXNzIFRlc3RDbGFzczMgewotCi0gICAgcHJpdmF0ZSBJbnRlZ2VyIHBhcmFtMTsKLSAgICBwcml2YXRlIEZsb2F0IHBhcmFtMjsKLSAgICBwcml2YXRlIERvdWJsZSBwYXJhbTM7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgcGFyYW00OwotCi0gICAgcHVibGljIEludGVnZXIgZ2V0UGFyYW0xKCkgewotICAgICAgICByZXR1cm4gcGFyYW0xOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBhcmFtMShJbnRlZ2VyIHBhcmFtMSkgewotICAgICAgICB0aGlzLnBhcmFtMSA9IHBhcmFtMTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRmxvYXQgZ2V0UGFyYW0yKCkgewotICAgICAgICByZXR1cm4gcGFyYW0yOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBhcmFtMihGbG9hdCBwYXJhbTIpIHsKLSAgICAgICAgdGhpcy5wYXJhbTIgPSBwYXJhbTI7Ci0gICAgfQotCi0gICAgcHVibGljIERvdWJsZSBnZXRQYXJhbTMoKSB7Ci0gICAgICAgIHJldHVybiBwYXJhbTM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGFyYW0zKERvdWJsZSBwYXJhbTMpIHsKLSAgICAgICAgdGhpcy5wYXJhbTMgPSBwYXJhbTM7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQYXJhbTQoKSB7Ci0gICAgICAgIHJldHVybiBwYXJhbTQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGFyYW00KFN0cmluZyBwYXJhbTQpIHsKLSAgICAgICAgdGhpcy5wYXJhbTQgPSBwYXJhbTQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvZHRvL1Rlc3RDbGFzczQuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL2R0by9UZXN0Q2xhc3M0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5YzlmODguLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvZHRvL1Rlc3RDbGFzczQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5ybWkuZGF0YWJpbmQuZHRvOwotCi1wdWJsaWMgY2xhc3MgVGVzdENsYXNzNCB7Ci0KLSAgICBwcml2YXRlIGludFtdIHBhcmFtMTsKLSAgICBwcml2YXRlIEludGVnZXJbXSBwYXJhbTI7Ci0gICAgcHJpdmF0ZSBTdHJpbmdbXSBwYXJhbTM7Ci0gICAgcHJpdmF0ZSBmbG9hdFtdIHBhcmFtNDsKLQotICAgIHB1YmxpYyBpbnRbXSBnZXRQYXJhbTEoKSB7Ci0gICAgICAgIHJldHVybiBwYXJhbTE7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGFyYW0xKGludFtdIHBhcmFtMSkgewotICAgICAgICB0aGlzLnBhcmFtMSA9IHBhcmFtMTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSW50ZWdlcltdIGdldFBhcmFtMigpIHsKLSAgICAgICAgcmV0dXJuIHBhcmFtMjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJhbTIoSW50ZWdlcltdIHBhcmFtMikgewotICAgICAgICB0aGlzLnBhcmFtMiA9IHBhcmFtMjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0UGFyYW0zKCkgewotICAgICAgICByZXR1cm4gcGFyYW0zOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBhcmFtMyhTdHJpbmdbXSBwYXJhbTMpIHsKLSAgICAgICAgdGhpcy5wYXJhbTMgPSBwYXJhbTM7Ci0gICAgfQotCi0gICAgcHVibGljIGZsb2F0W10gZ2V0UGFyYW00KCkgewotICAgICAgICByZXR1cm4gcGFyYW00OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBhcmFtNChmbG9hdFtdIHBhcmFtNCkgewotICAgICAgICB0aGlzLnBhcmFtNCA9IHBhcmFtNDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kYXRhYmluZC9kdG8vVGVzdENsYXNzNS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvZHRvL1Rlc3RDbGFzczUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JmNGQ1ZC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kYXRhYmluZC9kdG8vVGVzdENsYXNzNS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJtaS5kYXRhYmluZC5kdG87Ci0KLXB1YmxpYyBjbGFzcyBUZXN0Q2xhc3M1IHsKLQotICAgIHByaXZhdGUgVGVzdENsYXNzMSBwYXJhbTE7Ci0KLSAgICBwdWJsaWMgVGVzdENsYXNzMSBnZXRQYXJhbTEoKSB7Ci0gICAgICAgIHJldHVybiBwYXJhbTE7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGFyYW0xKFRlc3RDbGFzczEgcGFyYW0xKSB7Ci0gICAgICAgIHRoaXMucGFyYW0xID0gcGFyYW0xOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL2R0by9UZXN0Q2xhc3M2LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kYXRhYmluZC9kdG8vVGVzdENsYXNzNi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDEzNGZjLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL2R0by9UZXN0Q2xhc3M2LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLmRhdGFiaW5kLmR0bzsKLQotCi1wdWJsaWMgY2xhc3MgVGVzdENsYXNzNiB7Ci0KLSAgICBwcml2YXRlIFRlc3RDbGFzczIgcGFyYW0xOwotICAgIHByaXZhdGUgU3RyaW5nIHBhcmFtMjsKLSAgICBwcml2YXRlIGludCBwYXJhbTM7Ci0KLSAgICBwdWJsaWMgVGVzdENsYXNzMiBnZXRQYXJhbTEoKSB7Ci0gICAgICAgIHJldHVybiBwYXJhbTE7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGFyYW0xKFRlc3RDbGFzczIgcGFyYW0xKSB7Ci0gICAgICAgIHRoaXMucGFyYW0xID0gcGFyYW0xOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFyYW0yKCkgewotICAgICAgICByZXR1cm4gcGFyYW0yOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBhcmFtMihTdHJpbmcgcGFyYW0yKSB7Ci0gICAgICAgIHRoaXMucGFyYW0yID0gcGFyYW0yOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0UGFyYW0zKCkgewotICAgICAgICByZXR1cm4gcGFyYW0zOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBhcmFtMyhpbnQgcGFyYW0zKSB7Ci0gICAgICAgIHRoaXMucGFyYW0zID0gcGFyYW0zOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL2R0by9UZXN0Q2xhc3M3LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kYXRhYmluZC9kdG8vVGVzdENsYXNzNy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTFlYWQzLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL2R0by9UZXN0Q2xhc3M3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLmRhdGFiaW5kLmR0bzsKLQotcHVibGljIGNsYXNzIFRlc3RDbGFzczcgewotCi0gICAgcHJpdmF0ZSBUZXN0Q2xhc3M0W10gcGFyYW0xOwotICAgIHByaXZhdGUgVGVzdENsYXNzMyBwYXJhbTI7Ci0KLSAgICBwdWJsaWMgVGVzdENsYXNzNFtdIGdldFBhcmFtMSgpIHsKLSAgICAgICAgcmV0dXJuIHBhcmFtMTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJhbTEoVGVzdENsYXNzNFtdIHBhcmFtMSkgewotICAgICAgICB0aGlzLnBhcmFtMSA9IHBhcmFtMTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVGVzdENsYXNzMyBnZXRQYXJhbTIoKSB7Ci0gICAgICAgIHJldHVybiBwYXJhbTI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGFyYW0yKFRlc3RDbGFzczMgcGFyYW0yKSB7Ci0gICAgICAgIHRoaXMucGFyYW0yID0gcGFyYW0yOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL2R0by9UZXN0Q2xhc3M4LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kYXRhYmluZC9kdG8vVGVzdENsYXNzOC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTQxZjY4Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL2R0by9UZXN0Q2xhc3M4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLmRhdGFiaW5kLmR0bzsKLQotcHVibGljIGNsYXNzIFRlc3RDbGFzczggewotCi0gICAgcHJpdmF0ZSBJbnRlZ2VyW10gcGFyYW0xOwotICAgIHByaXZhdGUgU3RyaW5nW10gcGFyYW0yOwotCi0gICAgcHVibGljIEludGVnZXJbXSBnZXRQYXJhbTEoKSB7Ci0gICAgICAgIHJldHVybiBwYXJhbTE7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGFyYW0xKEludGVnZXJbXSBwYXJhbTEpIHsKLSAgICAgICAgdGhpcy5wYXJhbTEgPSBwYXJhbTE7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZ1tdIGdldFBhcmFtMigpIHsKLSAgICAgICAgcmV0dXJuIHBhcmFtMjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJhbTIoU3RyaW5nW10gcGFyYW0yKSB7Ci0gICAgICAgIHRoaXMucGFyYW0yID0gcGFyYW0yOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL2R0by9UZXN0Q2xhc3M5LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kYXRhYmluZC9kdG8vVGVzdENsYXNzOS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YWIzMWE2Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL2R0by9UZXN0Q2xhc3M5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLmRhdGFiaW5kLmR0bzsKLQotCi1wdWJsaWMgY2xhc3MgVGVzdENsYXNzOSB7Ci0KLSAgICBwcml2YXRlIFRlc3RDbGFzczJbXSBwYXJhbTE7Ci0KLSAgICBwdWJsaWMgVGVzdENsYXNzMltdIGdldFBhcmFtMSgpIHsKLSAgICAgICAgcmV0dXJuIHBhcmFtMTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJhbTEoVGVzdENsYXNzMltdIHBhcmFtMSkgewotICAgICAgICB0aGlzLnBhcmFtMSA9IHBhcmFtMTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kYXRhYmluZC9kdG8vVGVzdFJlc3RyaWN0aW9uQmVhbi5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvZHRvL1Rlc3RSZXN0cmljdGlvbkJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE1Njg3MS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kYXRhYmluZC9kdG8vVGVzdFJlc3RyaWN0aW9uQmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJtaS5kYXRhYmluZC5kdG87Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5kYXRhYmluZC5BYnN0cmFjdFJNSUJlYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZGF0YWJpbmQuSmF2YU9iamVjdFNlcmlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZGF0YWJpbmQuWG1sU3RyZWFtUGFyc2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmRhdGFiaW5kLnR5cGUuVGVzdFJlc3RyaWN0aW9uVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5leGNlcHRpb24uWG1sUGFyc2luZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5leGNlcHRpb24uWG1sU2VyaWFsaXppbmdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkudXRpbC5OYW1lc3BhY2VQcmVmaXg7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyOwotCi0KLXB1YmxpYyBjbGFzcyBUZXN0UmVzdHJpY3Rpb25CZWFuIGV4dGVuZHMgQWJzdHJhY3RSTUlCZWFuIHsKLQotICAgIHByaXZhdGUgU3RyaW5nIHBhcmFtMTsKLQotICAgIHB1YmxpYyBUZXN0UmVzdHJpY3Rpb25CZWFuKFN0cmluZyBwYXJhbTEpIHsKLSAgICAgICAgdGhpcy5wYXJhbTEgPSBwYXJhbTE7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2VyaWFsaXplKFhNTFN0cmVhbVdyaXRlciB3cml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEphdmFPYmplY3RTZXJpYWxpemVyIHNlcmlhbGl6ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lc3BhY2VQcmVmaXggbmFtZXNwYWNlUHJlZml4KQotICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgWG1sU2VyaWFsaXppbmdFeGNlcHRpb24gewotICAgICAgICB3cml0ZVN0YXJ0RWxlbWVudCh3cml0ZXIsIHBhcmVudFFOYW1lLmdldE5hbWVzcGFjZVVSSSgpLCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSwgbmFtZXNwYWNlUHJlZml4KTsKLSAgICAgICAgd3JpdGVyLndyaXRlQ2hhcmFjdGVycyhwYXJhbTEpOwotICAgICAgICB3cml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBDbGFzcyBnZXRCZWFuQ2xhc3MoKXsKLSAgICAgICAgcmV0dXJuIFRlc3RSZXN0cmljdGlvblR5cGUuY2xhc3M7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgcGFyc2UoWE1MU3RyZWFtUmVhZGVyIHJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYbWxTdHJlYW1QYXJzZXIgcGFyc2VyKQotICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgWG1sUGFyc2luZ0V4Y2VwdGlvbiB7Ci0KLSAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgIFRlc3RSZXN0cmljdGlvbkJlYW4gdGVzdFJlc3RyaWN0aW9uQmVhbiA9IG5ldyBUZXN0UmVzdHJpY3Rpb25CZWFuKHJlYWRlci5nZXRUZXh0KCkpOwotICAgICAgIHdoaWxlIChyZWFkZXIuaXNFbmRFbGVtZW50KCkpewotICAgICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgIH0KLSAgICAgICByZXR1cm4gdGVzdFJlc3RyaWN0aW9uQmVhbjsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFyYW0xKCkgewotICAgICAgICByZXR1cm4gcGFyYW0xOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBhcmFtMShTdHJpbmcgcGFyYW0xKSB7Ci0gICAgICAgIHRoaXMucGFyYW0xID0gcGFyYW0xOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL3NlcnZpY2UvU2VydmljZTEuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL3NlcnZpY2UvU2VydmljZTEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQxOTY2OC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kYXRhYmluZC9zZXJ2aWNlL1NlcnZpY2UxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLmRhdGFiaW5kLnNlcnZpY2U7Ci0KLQotcHVibGljIGNsYXNzIFNlcnZpY2UxIHsKLQotICAgIHB1YmxpYyB2b2lkIG1ldGhvZDEoKSB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigibWV0aG9kMSBpbnZva2VkIik7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBtZXRob2QyKGludCBwYXJhbTEpIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJHb3QgaW50ID09PiAiICsgcGFyYW0xKTsKLSAgICAgICAgcmV0dXJuIHBhcmFtMTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIG1ldGhvZDMoU3RyaW5nIHBhcmFtMSkgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkdvdCBTdHJpbmcgPT0+ICIgKyBwYXJhbTEpOwotICAgICAgICByZXR1cm4gcGFyYW0xOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnRbXSBtZXRob2Q0KGludFtdIHBhcmFtMSkgewotICAgICAgICBpZiAocGFyYW0xICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiR290IGludCA9PT4gIiArIHBhcmFtMS5sZW5ndGgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJHb3QgYSBudWxsIik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcGFyYW0xOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmdbXSBtZXRob2Q1KFN0cmluZ1tdIHBhcmFtMSkgewotICAgICAgICBpZiAocGFyYW0xICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiR290IFN0cmluZyA9PT4gIiArIHBhcmFtMS5sZW5ndGgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJHb3QgYSBudWxsIik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcGFyYW0xOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL3NlcnZpY2UvU2VydmljZTIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL3NlcnZpY2UvU2VydmljZTIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDAzZDAyMi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kYXRhYmluZC9zZXJ2aWNlL1NlcnZpY2UyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLmRhdGFiaW5kLnNlcnZpY2U7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5kYXRhYmluZC5kdG8uVGVzdENsYXNzMTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5kYXRhYmluZC5kdG8uVGVzdENsYXNzMjsKLQotCi1wdWJsaWMgY2xhc3MgU2VydmljZTIgewotCi0gICAgcHVibGljIFRlc3RDbGFzczEgbWV0aG9kMShUZXN0Q2xhc3MxIHBhcmFtMSl7Ci0gICAgICAgIHJldHVybiBwYXJhbTE7Ci0gICAgfQotCi0gICAgcHVibGljIFRlc3RDbGFzczFbXSBtZXRob2QyKFRlc3RDbGFzczFbXSBwYXJhbTEpewotICAgICAgICByZXR1cm4gcGFyYW0xOwotICAgIH0KLQotICAgIHB1YmxpYyBUZXN0Q2xhc3MyIG1ldGhvZDMoVGVzdENsYXNzMiBwYXJhbTEpewotICAgICAgICByZXR1cm4gcGFyYW0xOwotICAgIH0KLQotICAgIHB1YmxpYyBUZXN0Q2xhc3MyW10gbWV0aG9kNChUZXN0Q2xhc3MyW10gcGFyYW0xKXsKLSAgICAgICAgcmV0dXJuIHBhcmFtMTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kYXRhYmluZC9zZXJ2aWNlL1NlcnZpY2UzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kYXRhYmluZC9zZXJ2aWNlL1NlcnZpY2UzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkNThmMmIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvc2VydmljZS9TZXJ2aWNlMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJtaS5kYXRhYmluZC5zZXJ2aWNlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZGF0YWJpbmQuZHRvLlBhcmVudENsYXNzOwotCi0KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlMyB7Ci0KLSAgICBwdWJsaWMgUGFyZW50Q2xhc3MgbWV0aG9kMShQYXJlbnRDbGFzcyBwYXJhbTEpewotICAgICAgICByZXR1cm4gcGFyYW0xOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgbWV0aG9kMihPYmplY3QgcGFyYW0xKXsKLSAgICAgICAgcmV0dXJuIHBhcmFtMTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kYXRhYmluZC90eXBlL1Rlc3RSZXN0cmljdGlvblR5cGUuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL3R5cGUvVGVzdFJlc3RyaWN0aW9uVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDkzZDQ1Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL3R5cGUvVGVzdFJlc3RyaWN0aW9uVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJtaS5kYXRhYmluZC50eXBlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmRhdGFiaW5kLmR0by5UZXN0UmVzdHJpY3Rpb25CZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmV4Y2VwdGlvbi5NZXRhRGF0YVBvcHVsYXRlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmV4Y2VwdGlvbi5TY2hlbWFHZW5lcmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLm1ldGFkYXRhLkFic3RyYWN0VHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS50eXBlLnhtbC5TaW1wbGVSZXN0cmljdGlvblhtbFR5cGU7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLQotcHVibGljIGNsYXNzIFRlc3RSZXN0cmljdGlvblR5cGUgZXh0ZW5kcyBBYnN0cmFjdFR5cGUgewotCi0gICAgcHVibGljIHZvaWQgcG9wdWxhdGVNZXRhRGF0YShDb25maWd1cmF0b3IgY29uZmlndXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwIHByb2Nlc3NlZFR5cGVNYXApCi0gICAgICAgICAgICB0aHJvd3MgTWV0YURhdGFQb3B1bGF0ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMuamF2YUNsYXNzID0gVGVzdFJlc3RyaWN0aW9uQmVhbi5jbGFzczsKLSAgICAgICAgdGhpcy5uYW1lc3BhY2UgPSAiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvcm1pL3NpbXBsZXR5cGVzIjsKLSAgICAgICAgdGhpcy5uYW1lID0gInNpbXBsZVJlc3RyaWN0aW9uIjsKLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGdlbmVyYXRlU2NoZW1hKENvbmZpZ3VyYXRvciBjb25maWd1cmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwIHNjaGVtYU1hcCkKLSAgICAgICAgICAgIHRocm93cyBTY2hlbWFHZW5lcmF0aW9uRXhjZXB0aW9uIHsKLQotICAgICAgICB0aGlzLmlzU2NoZW1hR2VuZXJhdGVkID0gdHJ1ZTsKLSAgICAgICAgdGhpcy54bWxUeXBlID0gbmV3IFNpbXBsZVJlc3RyaWN0aW9uWG1sVHlwZSgpOwotICAgICAgICB0aGlzLnhtbFR5cGUuc2V0UW5hbWUobmV3IFFOYW1lKHRoaXMubmFtZXNwYWNlLCB0aGlzLm5hbWUpKTsKLSAgICAgICAgLy8gYWRkIHRoaXMgdG8gdGhlIHNjaGVtYSBtYXAKLSAgICAgICAgLy8gZ2V0IHRoZSBzY2hlbWEgdG8gYWRkIHRoZSBjb21wbGV4IHR5cGUKLSAgICAgICAgcmVnaXN0ZXJYbWxUeXBlKHNjaGVtYU1hcCk7Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL3R5cGUvVGVzdFJlc3RyaWN0aW9uWG1sVHlwZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvdHlwZS9UZXN0UmVzdHJpY3Rpb25YbWxUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzMzhlZTUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvdHlwZS9UZXN0UmVzdHJpY3Rpb25YbWxUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLmRhdGFiaW5kLnR5cGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5leGNlcHRpb24uU2NoZW1hR2VuZXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS54bWwuQWJzdHJhY3RYbWxUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLnV0aWwuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0KLXB1YmxpYyBjbGFzcyBUZXN0UmVzdHJpY3Rpb25YbWxUeXBlIGV4dGVuZHMgQWJzdHJhY3RYbWxUeXBlIHsKLQotICAgIHB1YmxpYyB2b2lkIGdlbmVyYXRlV1NETFNjaGVtYShEb2N1bWVudCBkb2N1bWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwIG5hbWVzcGFjZXNUb1ByZWZpeE1hcCkKLSAgICAgICAgICAgIHRocm93cyBTY2hlbWFHZW5lcmF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gZ2VuZXJhdGUgdGhlIHNpbXBsZSB0eXBlIEVsZW1lbnQgaGVyZQotICAgICAgICBTdHJpbmcgeHNkUHJlZml4ID0gKFN0cmluZykgbmFtZXNwYWNlc1RvUHJlZml4TWFwLmdldChDb25zdGFudHMuVVJJXzIwMDFfU0NIRU1BX1hTRCk7Ci0gICAgICAgIHRoaXMudHlwZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoQ29uc3RhbnRzLlVSSV8yMDAxX1NDSEVNQV9YU0QsICJzaW1wbGVUeXBlIik7Ci0gICAgICAgIHRoaXMudHlwZUVsZW1lbnQuc2V0UHJlZml4KHhzZFByZWZpeCk7Ci0gICAgICAgIHRoaXMudHlwZUVsZW1lbnQuc2V0QXR0cmlidXRlKCJuYW1lIiwgdGhpcy5xbmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0KLSAgICAgICAgRWxlbWVudCByZXN0cmljdGlvbkVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoQ29uc3RhbnRzLlVSSV8yMDAxX1NDSEVNQV9YU0QsICJyZXN0cmljdGlvbiIpOwotICAgICAgICByZXN0cmljdGlvbkVsZW1lbnQuc2V0UHJlZml4KHhzZFByZWZpeCk7Ci0gICAgICAgIHJlc3RyaWN0aW9uRWxlbWVudC5zZXRBdHRyaWJ1dGUoImJhc2UiLCB4c2RQcmVmaXggKyAiOnN0cmluZyIpOwotICAgICAgICB0aGlzLnR5cGVFbGVtZW50LmFwcGVuZENoaWxkKHJlc3RyaWN0aW9uRWxlbWVudCk7Ci0KLSAgICAgICAgRWxlbWVudCBlbnVtZXJhdGlvbkVsZW1lbnQgPSBudWxsOwotICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IDU7IGkrKykgewotICAgICAgICAgICAgZW51bWVyYXRpb25FbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKENvbnN0YW50cy5VUklfMjAwMV9TQ0hFTUFfWFNELCAiZW51bWVyYXRpb24iKTsKLSAgICAgICAgICAgIGVudW1lcmF0aW9uRWxlbWVudC5zZXRQcmVmaXgoeHNkUHJlZml4KTsKLSAgICAgICAgICAgIGVudW1lcmF0aW9uRWxlbWVudC5zZXRBdHRyaWJ1dGUoInZhbHVlIiwgInRlc3RWYWx1ZSIgKyBpKTsKLSAgICAgICAgICAgIHJlc3RyaWN0aW9uRWxlbWVudC5hcHBlbmRDaGlsZChlbnVtZXJhdGlvbkVsZW1lbnQpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvdXRpbC9DdXN0b21TaW1wbGVUeXBlSGFuZGxlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvdXRpbC9DdXN0b21TaW1wbGVUeXBlSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmZkYWJkLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL3V0aWwvQ3VzdG9tU2ltcGxlVHlwZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5ybWkuZGF0YWJpbmQudXRpbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmRhdGFiaW5kLlNpbXBsZVR5cGVIYW5kbGVyOwotCi1pbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci0KLXB1YmxpYyBjbGFzcyBDdXN0b21TaW1wbGVUeXBlSGFuZGxlciBleHRlbmRzIFNpbXBsZVR5cGVIYW5kbGVyIHsKLSAgICBwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhEYXRlIHZhbHVlKSB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ29udmVydGluZyBkYXRlID09PiAiICsgdmFsdWUpOwotICAgICAgICBTaW1wbGVEYXRlRm9ybWF0IHNpbXBsZURhdGVGb3JtYXQgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgieXl5eS1NTS1kZFoiKTsKLSAgICAgICAgcmV0dXJuIHNpbXBsZURhdGVGb3JtYXQuZm9ybWF0KHZhbHVlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9tZXRhZGF0YS9CYXNpY1NlcnZpY2VUZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9tZXRhZGF0YS9CYXNpY1NlcnZpY2VUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3ZWMwMWYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvbWV0YWRhdGEvQmFzaWNTZXJ2aWNlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGE7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5XU0RMMTFUb0F4aXNTZXJ2aWNlQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5Db25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZXhjZXB0aW9uLk1ldGFEYXRhUG9wdWxhdGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZXhjZXB0aW9uLlNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEuc2VydmljZS5CYXNpY1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkud3NkbC5XU0RMMTFEZWZpbml0aW9uQnVpbGRlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuVHlwZXM7Ci1pbXBvcnQgamF2YXgud3NkbC5XU0RMRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc2NoZW1hLlNjaGVtYTsKLWltcG9ydCBqYXZheC53c2RsLmZhY3RvcnkuV1NETEZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgud3NkbC54bWwuV1NETFdyaXRlcjsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIEJhc2ljU2VydmljZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UG9wdWxhdGVNZXRhRGF0YSgpewotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBDb25maWd1cmF0b3IgY29uZmlndXJhdG9yID0gbmV3IENvbmZpZ3VyYXRvcigpOwotICAgICAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gbmV3IFNlcnZpY2UoQmFzaWNTZXJ2aWNlLmNsYXNzLGNvbmZpZ3VyYXRvcik7Ci0gICAgICAgICAgICBzZXJ2aWNlLnBvcHVsYXRlTWV0YURhdGEoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT0siKTsKLSAgICAgICAgfSBjYXRjaCAoTWV0YURhdGFQb3B1bGF0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RHZW5lcmF0ZVNjaGVtYSgpewotICAgICAgICBDb25maWd1cmF0b3IgY29uZmlndXJhdG9yID0gbmV3IENvbmZpZ3VyYXRvcigpOwotICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgU2VydmljZShCYXNpY1NlcnZpY2UuY2xhc3MsY29uZmlndXJhdG9yKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNlcnZpY2UucG9wdWxhdGVNZXRhRGF0YSgpOwotICAgICAgICAgICAgc2VydmljZS5nZW5lcmF0ZVNjaGVtYSgpOwotICAgICAgICAgICAgV1NETDExRGVmaW5pdGlvbkJ1aWxkZXIgZGVmaW5pdGlvbkJ1aWxkZXIgPSBuZXcgV1NETDExRGVmaW5pdGlvbkJ1aWxkZXIoc2VydmljZSk7Ci0gICAgICAgICAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSBkZWZpbml0aW9uQnVpbGRlci5nZW5lcmF0ZVdTREwoKTsKLQotICAgICAgICAgICAgV1NETDExVG9BeGlzU2VydmljZUJ1aWxkZXIgYnVsZGVyID0gbmV3IFdTREwxMVRvQXhpc1NlcnZpY2VCdWlsZGVyKGRlZmluaXRpb24sbnVsbCxudWxsKTsKLSAgICAgICAgICAgIGJ1bGRlci5wb3B1bGF0ZVNlcnZpY2UoKTsKLQotICAgICAgICB9IGNhdGNoIChNZXRhRGF0YVBvcHVsYXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoU2NoZW1hR2VuZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RXU0RMRGVmaW5pdGlvbk9iamVjdHMoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSBXU0RMRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld0RlZmluaXRpb24oKTsKLQotICAgICAgICAgICAgRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkgPQotICAgICAgICAgICAgICAgICAgICBXU0RMRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1BvcHVsYXRlZEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0gICAgICAgICAgICBkZWZpbml0aW9uLnNldEV4dGVuc2lvblJlZ2lzdHJ5KGV4dGVuc2lvblJlZ2lzdHJ5KTsKLSAgICAgICAgICAgIFNjaGVtYSBzY2hlbWEgPSAoU2NoZW1hKSBleHRlbnNpb25SZWdpc3RyeS5jcmVhdGVFeHRlbnNpb24oVHlwZXMuY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgIG5ldyBRTmFtZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiLCJzY2hlbWEiKSk7Ci0gICAgICAgICAgICBzY2hlbWEuc2V0RG9jdW1lbnRCYXNlVVJJKCJ1cm46dGVzdCIpOwotICAgICAgICAgICAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBkb2N1bWVudEJ1aWxkZXJGYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgZG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKLQotICAgICAgICAgICAgRG9jdW1lbnRCdWlsZGVyIGRvY3VtZW50QnVpbGRlciA9IGRvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0gICAgICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IGRvY3VtZW50QnVpbGRlci5uZXdEb2N1bWVudCgpOwotICAgICAgICAgICAgRWxlbWVudCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIsInNjaGVtYSIpOwotICAgICAgICAgICAgZWxlbWVudC5zZXRQcmVmaXgoInRzdCIpOwotICAgICAgICAgICAgc2NoZW1hLnNldEVsZW1lbnQoZWxlbWVudCk7Ci0gICAgICAgICAgICBzY2hlbWEuc2V0RWxlbWVudFR5cGUobmV3IFFOYW1lKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIsInNjaGVtYSIpKTsKLSAgICAgICAgICAgIFR5cGVzIHR5cGVzID0gZGVmaW5pdGlvbi5jcmVhdGVUeXBlcygpOwotICAgICAgICAgICAgZGVmaW5pdGlvbi5zZXRUeXBlcyh0eXBlcyk7Ci0gICAgICAgICAgICBkZWZpbml0aW9uLmdldFR5cGVzKCkuYWRkRXh0ZW5zaWJpbGl0eUVsZW1lbnQoc2NoZW1hKTsKLQotICAgICAgICAgICAgV1NETFdyaXRlciB3c2RsV3JpdGVyID0gV1NETEZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdXU0RMV3JpdGVyKCk7Ci0gICAgICAgICAgICB3c2RsV3JpdGVyLndyaXRlV1NETChkZWZpbml0aW9uLCBTeXN0ZW0ub3V0KTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT0siKTsKLSAgICAgICAgfSBjYXRjaCAoV1NETEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9tZXRhZGF0YS9DdXN0b21CZWFuVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvbWV0YWRhdGEvQ3VzdG9tQmVhblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGM1MzVkOC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9tZXRhZGF0YS9DdXN0b21CZWFuVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLldTREwxMVRvQXhpc1NlcnZpY2VCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLkNvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5leGNlcHRpb24uTWV0YURhdGFQb3B1bGF0ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5leGNlcHRpb24uU2NoZW1hR2VuZXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS5zZXJ2aWNlLkN1c3RvbUJlYW5TZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLndzZGwuV1NETDExRGVmaW5pdGlvbkJ1aWxkZXI7Ci0KLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgQ3VzdG9tQmVhblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2VuZXJhdGVTY2hlbWEoKSB7Ci0gICAgICAgIENvbmZpZ3VyYXRvciBjb25maWd1cmF0b3IgPSBuZXcgQ29uZmlndXJhdG9yKCk7Ci0KLSAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gbmV3IFNlcnZpY2UoQ3VzdG9tQmVhblNlcnZpY2UuY2xhc3MsIGNvbmZpZ3VyYXRvcik7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzZXJ2aWNlLnBvcHVsYXRlTWV0YURhdGEoKTsKLSAgICAgICAgICAgIHNlcnZpY2UuZ2VuZXJhdGVTY2hlbWEoKTsKLSAgICAgICAgICAgIFdTREwxMURlZmluaXRpb25CdWlsZGVyIGRlZmluaXRpb25CdWlsZGVyID0gbmV3IFdTREwxMURlZmluaXRpb25CdWlsZGVyKHNlcnZpY2UpOwotICAgICAgICAgICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gZGVmaW5pdGlvbkJ1aWxkZXIuZ2VuZXJhdGVXU0RMKCk7Ci0KLS8vICAgICAgICAgICAgV1NETFdyaXRlciB3c2RsV3JpdGVyID0gV1NETEZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdXU0RMV3JpdGVyKCk7Ci0vLyAgICAgICAgICAgIHdzZGxXcml0ZXIud3JpdGVXU0RMKGRlZmluaXRpb24sIFN5c3RlbS5vdXQpOwotCi0gICAgICAgICAgICBXU0RMMTFUb0F4aXNTZXJ2aWNlQnVpbGRlciBidWxkZXIgPSBuZXcgV1NETDExVG9BeGlzU2VydmljZUJ1aWxkZXIoZGVmaW5pdGlvbiwgbnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICBidWxkZXIucG9wdWxhdGVTZXJ2aWNlKCk7Ci0KLSAgICAgICAgfSBjYXRjaCAoTWV0YURhdGFQb3B1bGF0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL21ldGFkYXRhL0N1c3RvbU1hcHBpbmdTZXJ2aWNlVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvbWV0YWRhdGEvQ3VzdG9tTWFwcGluZ1NlcnZpY2VUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyNjJmMDAuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvbWV0YWRhdGEvQ3VzdG9tTWFwcGluZ1NlcnZpY2VUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLm1ldGFkYXRhOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uV1NETDExVG9BeGlzU2VydmljZUJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmNvbmZpZy5DbGFzc0luZm87Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuY29uZmlnLkZpZWxkSW5mbzsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5leGNlcHRpb24uTWV0YURhdGFQb3B1bGF0ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5leGNlcHRpb24uU2NoZW1hR2VuZXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS5zZXJ2aWNlLkN1c3RvbU1hcHBpbmdTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLm1ldGFkYXRhLnNlcnZpY2UuZHRvLkNvbXBsZXhUeXBlMzsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS53c2RsLldTREwxMURlZmluaXRpb25CdWlsZGVyOwotCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLQotcHVibGljIGNsYXNzIEN1c3RvbU1hcHBpbmdTZXJ2aWNlVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RHZW5lcmF0ZVNjaGVtYSgpIHsKLQotICAgICAgICBDb25maWd1cmF0b3IgY29uZmlndXJhdG9yID0gbmV3IENvbmZpZ3VyYXRvcigpOwotCi0gICAgICAgIENsYXNzSW5mbyBjbGFzc0luZm8gPSBuZXcgQ2xhc3NJbmZvKENvbXBsZXhUeXBlMy5jbGFzcyk7Ci0gICAgICAgIEZpZWxkSW5mbyBmaWVsZEluZm8gPSBuZXcgRmllbGRJbmZvKCJwYXJhbTEiLCJ4bWxwYXJhbTEiLGZhbHNlKTsKLSAgICAgICAgY2xhc3NJbmZvLmFkZEZpZWxkSW5mbyhmaWVsZEluZm8pOwotICAgICAgICBjb25maWd1cmF0b3IuYWRkQ2xhc3NJbmZvKGNsYXNzSW5mbyk7Ci0KLSAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gbmV3IFNlcnZpY2UoQ3VzdG9tTWFwcGluZ1NlcnZpY2UuY2xhc3MsIGNvbmZpZ3VyYXRvcik7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzZXJ2aWNlLnBvcHVsYXRlTWV0YURhdGEoKTsKLSAgICAgICAgICAgIHNlcnZpY2UuZ2VuZXJhdGVTY2hlbWEoKTsKLSAgICAgICAgICAgIFdTREwxMURlZmluaXRpb25CdWlsZGVyIGRlZmluaXRpb25CdWlsZGVyID0gbmV3IFdTREwxMURlZmluaXRpb25CdWlsZGVyKHNlcnZpY2UpOwotICAgICAgICAgICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gZGVmaW5pdGlvbkJ1aWxkZXIuZ2VuZXJhdGVXU0RMKCk7Ci0KLS8vICAgICAgICAgICAgV1NETFdyaXRlciB3c2RsV3JpdGVyID0gV1NETEZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdXU0RMV3JpdGVyKCk7Ci0vLyAgICAgICAgICAgIHdzZGxXcml0ZXIud3JpdGVXU0RMKGRlZmluaXRpb24sIFN5c3RlbS5vdXQpOwotCi0gICAgICAgICAgICBXU0RMMTFUb0F4aXNTZXJ2aWNlQnVpbGRlciBidWxkZXIgPSBuZXcgV1NETDExVG9BeGlzU2VydmljZUJ1aWxkZXIoZGVmaW5pdGlvbiwgbnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICBidWxkZXIucG9wdWxhdGVTZXJ2aWNlKCk7Ci0KLSAgICAgICAgfSBjYXRjaCAoTWV0YURhdGFQb3B1bGF0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL21ldGFkYXRhL0V4dGVuc2lvblNlcnZpY2VUZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9tZXRhZGF0YS9FeHRlbnNpb25TZXJ2aWNlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTg3MTgzLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL21ldGFkYXRhL0V4dGVuc2lvblNlcnZpY2VUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLm1ldGFkYXRhOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uV1NETDExVG9BeGlzU2VydmljZUJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmV4Y2VwdGlvbi5NZXRhRGF0YVBvcHVsYXRlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmV4Y2VwdGlvbi5TY2hlbWFHZW5lcmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLm1ldGFkYXRhLnNlcnZpY2UuRXh0ZW5zaW9uU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS5zZXJ2aWNlLmR0by5DaGlsZENsYXNzMjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS53c2RsLldTREwxMURlZmluaXRpb25CdWlsZGVyOwotCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLQotcHVibGljIGNsYXNzIEV4dGVuc2lvblNlcnZpY2VUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHVibGljIHZvaWQgdGVzdEdlbmVyYXRlU2NoZW1hKCkgewotICAgICAgICBDb25maWd1cmF0b3IgY29uZmlndXJhdG9yID0gbmV3IENvbmZpZ3VyYXRvcigpOwotICAgICAgICBjb25maWd1cmF0b3IuYWRkRXh0ZW5zaW9uKENoaWxkQ2xhc3MyLmNsYXNzKTsKLSAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gbmV3IFNlcnZpY2UoRXh0ZW5zaW9uU2VydmljZS5jbGFzcywgY29uZmlndXJhdG9yKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNlcnZpY2UucG9wdWxhdGVNZXRhRGF0YSgpOwotICAgICAgICAgICAgc2VydmljZS5nZW5lcmF0ZVNjaGVtYSgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBXU0RMMTFEZWZpbml0aW9uQnVpbGRlciBkZWZpbml0aW9uQnVpbGRlciA9IG5ldyBXU0RMMTFEZWZpbml0aW9uQnVpbGRlcihzZXJ2aWNlKTsKLSAgICAgICAgICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IGRlZmluaXRpb25CdWlsZGVyLmdlbmVyYXRlV1NETCgpOwotCi0gICAgICAgICAgICBXU0RMMTFUb0F4aXNTZXJ2aWNlQnVpbGRlciBidWxkZXIgPSBuZXcgV1NETDExVG9BeGlzU2VydmljZUJ1aWxkZXIoZGVmaW5pdGlvbiwgbnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICBidWxkZXIucG9wdWxhdGVTZXJ2aWNlKCk7Ci0KLSAgICAgICAgfSBjYXRjaCAoTWV0YURhdGFQb3B1bGF0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9tZXRhZGF0YS9GYXVsdFNlcnZpY2VUZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9tZXRhZGF0YS9GYXVsdFNlcnZpY2VUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwNTIzMGQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvbWV0YWRhdGEvRmF1bHRTZXJ2aWNlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLldTREwxMVRvQXhpc1NlcnZpY2VCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLkNvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5leGNlcHRpb24uTWV0YURhdGFQb3B1bGF0ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5leGNlcHRpb24uU2NoZW1hR2VuZXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS5zZXJ2aWNlLkZhdWx0U2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS53c2RsLldTREwxMURlZmluaXRpb25CdWlsZGVyOwotCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLQotcHVibGljIGNsYXNzIEZhdWx0U2VydmljZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2VuZXJhdGVTY2hlbWEoKSB7Ci0gICAgICAgIENvbmZpZ3VyYXRvciBjb25maWd1cmF0b3IgPSBuZXcgQ29uZmlndXJhdG9yKCk7Ci0gICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IG5ldyBTZXJ2aWNlKEZhdWx0U2VydmljZS5jbGFzcywgY29uZmlndXJhdG9yKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNlcnZpY2UucG9wdWxhdGVNZXRhRGF0YSgpOwotICAgICAgICAgICAgc2VydmljZS5nZW5lcmF0ZVNjaGVtYSgpOwotICAgICAgICAgICAgV1NETDExRGVmaW5pdGlvbkJ1aWxkZXIgZGVmaW5pdGlvbkJ1aWxkZXIgPSBuZXcgV1NETDExRGVmaW5pdGlvbkJ1aWxkZXIoc2VydmljZSk7Ci0gICAgICAgICAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSBkZWZpbml0aW9uQnVpbGRlci5nZW5lcmF0ZVdTREwoKTsKLQotICAgICAgICAgICAgV1NETDExVG9BeGlzU2VydmljZUJ1aWxkZXIgYnVsZGVyID0gbmV3IFdTREwxMVRvQXhpc1NlcnZpY2VCdWlsZGVyKGRlZmluaXRpb24sIG51bGwsIG51bGwpOwotICAgICAgICAgICAgYnVsZGVyLnBvcHVsYXRlU2VydmljZSgpOwotCi0gICAgICAgIH0gY2F0Y2ggKE1ldGFEYXRhUG9wdWxhdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChTY2hlbWFHZW5lcmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvbWV0YWRhdGEvTWFwU2VydmljZVRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL21ldGFkYXRhL01hcFNlcnZpY2VUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwMzk1YzcuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvbWV0YWRhdGEvTWFwU2VydmljZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGE7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5XU0RMMTFUb0F4aXNTZXJ2aWNlQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5Db25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZXhjZXB0aW9uLk1ldGFEYXRhUG9wdWxhdGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZXhjZXB0aW9uLlNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEuc2VydmljZS5NYXBTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLndzZGwuV1NETDExRGVmaW5pdGlvbkJ1aWxkZXI7Ci0KLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgTWFwU2VydmljZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2VuZXJhdGVTY2hlbWEoKSB7Ci0gICAgICAgIENvbmZpZ3VyYXRvciBjb25maWd1cmF0b3IgPSBuZXcgQ29uZmlndXJhdG9yKCk7Ci0gICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IG5ldyBTZXJ2aWNlKE1hcFNlcnZpY2UuY2xhc3MsIGNvbmZpZ3VyYXRvcik7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzZXJ2aWNlLnBvcHVsYXRlTWV0YURhdGEoKTsKLSAgICAgICAgICAgIHNlcnZpY2UuZ2VuZXJhdGVTY2hlbWEoKTsKLSAgICAgICAgICAgIFdTREwxMURlZmluaXRpb25CdWlsZGVyIGRlZmluaXRpb25CdWlsZGVyID0gbmV3IFdTREwxMURlZmluaXRpb25CdWlsZGVyKHNlcnZpY2UpOwotICAgICAgICAgICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gZGVmaW5pdGlvbkJ1aWxkZXIuZ2VuZXJhdGVXU0RMKCk7Ci0KLSAgICAgICAgICAgIFdTREwxMVRvQXhpc1NlcnZpY2VCdWlsZGVyIGJ1bGRlciA9IG5ldyBXU0RMMTFUb0F4aXNTZXJ2aWNlQnVpbGRlcihkZWZpbml0aW9uLCBudWxsLCBudWxsKTsKLSAgICAgICAgICAgIGJ1bGRlci5wb3B1bGF0ZVNlcnZpY2UoKTsKLQotICAgICAgICB9IGNhdGNoIChNZXRhRGF0YVBvcHVsYXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoU2NoZW1hR2VuZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvbWV0YWRhdGEvVGVzdFJlZmxlY3Rpb24uamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL21ldGFkYXRhL1Rlc3RSZWZsZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNWIyNDQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvbWV0YWRhdGEvVGVzdFJlZmxlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGE7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEuc2VydmljZS5CYXNpY1NlcnZpY2U7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLQotCi1wdWJsaWMgY2xhc3MgVGVzdFJlZmxlY3Rpb24gZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW52b2tlKCl7Ci0gICAgICAgIENsYXNzIGJhc2ljU2VydmljZUNsYXNzID0gQmFzaWNTZXJ2aWNlLmNsYXNzOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBNZXRob2QgbWV0aG9kMiA9IGJhc2ljU2VydmljZUNsYXNzLmdldE1ldGhvZCgibWV0aG9kMiIsbmV3IENsYXNzW117aW50LmNsYXNzfSk7Ci0gICAgICAgICAgICBPYmplY3QgYmFzaWNTZXJ2aWNlID0gYmFzaWNTZXJ2aWNlQ2xhc3MubmV3SW5zdGFuY2UoKTsKLQotICAgICAgICAgICAgbWV0aG9kMi5pbnZva2UoYmFzaWNTZXJ2aWNlLG5ldyBPYmplY3RbXXtuZXcgSW50ZWdlcigxKX0pOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPSyIpOwotCi0gICAgICAgICAgICBDbGFzcyBpbnRlZ2VyQ2xhc3MgPSBJbnRlZ2VyLmNsYXNzOwotICAgICAgICAgICAgQ29uc3RydWN0b3IgY29uc3RydWN0b3IgPSBpbnRlZ2VyQ2xhc3MuZ2V0Q29uc3RydWN0b3IobmV3IENsYXNzW117U3RyaW5nLmNsYXNzfSk7Ci0gICAgICAgICAgICBPYmplY3QgaW50ZWdlck9iamVjdCA9IGNvbnN0cnVjdG9yLm5ld0luc3RhbmNlKG5ldyBPYmplY3RbXXsiNSJ9KTsKLSAgICAgICAgICAgIE9iamVjdCBpbnRlZ2VyID0gaW50ZWdlckNsYXNzLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9tZXRhZGF0YS9UeXBlVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvbWV0YWRhdGEvVHlwZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY0YTkwOC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9tZXRhZGF0YS9UeXBlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5Db25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZXhjZXB0aW9uLk1ldGFEYXRhUG9wdWxhdGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEuaW1wbC5UeXBlSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS5zZXJ2aWNlLmR0by5DaGlsZENsYXNzOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotCi1wdWJsaWMgY2xhc3MgVHlwZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2hpbGRDbGFzcygpIHsKLQotICAgICAgICBDb25maWd1cmF0b3IgY29uZmlndXJhdG9yID0gbmV3IENvbmZpZ3VyYXRvcigpOwotICAgICAgICBNYXAgcHJvY2Vzc2VkVHlwZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICAgICAgVHlwZSB0eXBlID0gbmV3IFR5cGVJbXBsKENoaWxkQ2xhc3MuY2xhc3MpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgdHlwZS5wb3B1bGF0ZU1ldGFEYXRhKGNvbmZpZ3VyYXRvcixwcm9jZXNzZWRUeXBlTWFwKTsKLSAgICAgICAgfSBjYXRjaCAoTWV0YURhdGFQb3B1bGF0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9tZXRhZGF0YS9zZXJ2aWNlL0Jhc2ljU2VydmljZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvbWV0YWRhdGEvc2VydmljZS9CYXNpY1NlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg4NmNjYS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9tZXRhZGF0YS9zZXJ2aWNlL0Jhc2ljU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS5zZXJ2aWNlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEuc2VydmljZS5kdG8uQ29tcGxleFR5cGUxOwotCi1wdWJsaWMgY2xhc3MgQmFzaWNTZXJ2aWNlIHsKLQotICAgIHB1YmxpYyB2b2lkIG1ldGhvZDEoKSB7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBtZXRob2QyKGludCBwYXJhbTEpIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJJdm9rZWQgd2l0aCAiICsgcGFyYW0xKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBtZXRob2QzKFN0cmluZyBwYXJhbTEpIHsKLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG1ldGhvZDQoQ29tcGxleFR5cGUxIGNvbXBsZXhUeXBlMSkgewotCi0gICAgfQotCi0gICAgcHVibGljIGludCBtZXRob2Q1KGludCBwYXJhbTEpIHsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBtZXRob2Q2KFN0cmluZyBwYXJhbTEpIHsKLSAgICAgICAgcmV0dXJuICIiOwotICAgIH0KLQotICAgIHB1YmxpYyBDb21wbGV4VHlwZTEgbWV0aG9kNyhDb21wbGV4VHlwZTEgY29tcGxleFR5cGUxKSB7Ci0gICAgICAgIHJldHVybiBuZXcgQ29tcGxleFR5cGUxKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGludFtdIG1ldGhvZDgoaW50W10gcGFyYW0xKSB7Ci0gICAgICAgIHJldHVybiBuZXcgaW50WzBdOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmdbXSBtZXRob2Q5KFN0cmluZ1tdIHBhcmFtMSkgewotICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1swXTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29tcGxleFR5cGUxW10gbWV0aG9kMTAoQ29tcGxleFR5cGUxW10gY29tcGxleFR5cGUxKSB7Ci0gICAgICAgIHJldHVybiBuZXcgQ29tcGxleFR5cGUxWzBdOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG1ldGhvZDExKGludCBwYXJhbTEsIFN0cmluZyBwYXJhbTIsIENvbXBsZXhUeXBlMSBjb21wbGV4VHlwZTEpIHsKLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG1ldGhvZDEyKGludFtdIHBhcmFtMSwgU3RyaW5nW10gcGFyYW0yLCBDb21wbGV4VHlwZTFbXSBjb21wbGV4VHlwZTEpIHsKLQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvbWV0YWRhdGEvc2VydmljZS9DdXN0b21CZWFuU2VydmljZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvbWV0YWRhdGEvc2VydmljZS9DdXN0b21CZWFuU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOWUzNTc0Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL21ldGFkYXRhL3NlcnZpY2UvQ3VzdG9tQmVhblNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEuc2VydmljZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLm1ldGFkYXRhLnNlcnZpY2UuZHRvLkN1c3RvbUJlYW5DbGFzczsKLQotCi1wdWJsaWMgY2xhc3MgQ3VzdG9tQmVhblNlcnZpY2UgewotICAgIAotICAgICBwdWJsaWMgQ3VzdG9tQmVhbkNsYXNzIG1ldGhvZDEoQ3VzdG9tQmVhbkNsYXNzIHBhcmFtMSl7Ci0gICAgICAgICByZXR1cm4gcGFyYW0xOwotICAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9tZXRhZGF0YS9zZXJ2aWNlL0N1c3RvbU1hcHBpbmdTZXJ2aWNlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9tZXRhZGF0YS9zZXJ2aWNlL0N1c3RvbU1hcHBpbmdTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1M2EwZTMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvbWV0YWRhdGEvc2VydmljZS9DdXN0b21NYXBwaW5nU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS5zZXJ2aWNlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEuc2VydmljZS5kdG8uQ29tcGxleFR5cGUzOwotCi0KLXB1YmxpYyBjbGFzcyBDdXN0b21NYXBwaW5nU2VydmljZSB7Ci0KLSAgICBwdWJsaWMgQ29tcGxleFR5cGUzIG1ldGhvZDEoQ29tcGxleFR5cGUzIHBhcmFtMSl7Ci0gICAgICAgIHJldHVybiBwYXJhbTE7Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL21ldGFkYXRhL3NlcnZpY2UvRXh0ZW5zaW9uU2VydmljZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvbWV0YWRhdGEvc2VydmljZS9FeHRlbnNpb25TZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1NGEyMDYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvbWV0YWRhdGEvc2VydmljZS9FeHRlbnNpb25TZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLm1ldGFkYXRhLnNlcnZpY2U7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS5zZXJ2aWNlLmR0by5DaGlsZENsYXNzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLm1ldGFkYXRhLnNlcnZpY2UuZHRvLlBhcmVudENsYXNzOwotCi0KLXB1YmxpYyBjbGFzcyBFeHRlbnNpb25TZXJ2aWNlIHsKLQotICAgIHB1YmxpYyBPYmplY3QgbWV0aG9kMShPYmplY3QgcGFyYW0xKSB7Ci0gICAgICAgIHJldHVybiBwYXJhbTE7Ci0gICAgfQotCi0gICAgcHVibGljIFBhcmVudENsYXNzIG1ldGhvZDIoUGFyZW50Q2xhc3MgcGFyYW0xKSB7Ci0gICAgICAgIHJldHVybiBwYXJhbTE7Ci0gICAgfQotCi0gICAgcHVibGljIENoaWxkQ2xhc3MgbWV0aG9kMyhDaGlsZENsYXNzIHBhcmFtMSkgewotICAgICAgICByZXR1cm4gcGFyYW0xOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL21ldGFkYXRhL3NlcnZpY2UvRmF1bHRTZXJ2aWNlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9tZXRhZGF0YS9zZXJ2aWNlL0ZhdWx0U2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmU5M2YzLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL21ldGFkYXRhL3NlcnZpY2UvRmF1bHRTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLm1ldGFkYXRhLnNlcnZpY2U7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS5zZXJ2aWNlLmV4Y2VwdGlvbi5FeGNlcHRpb24xOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLm1ldGFkYXRhLnNlcnZpY2UuZXhjZXB0aW9uLkV4Y2VwdGlvbjI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEuc2VydmljZS5leGNlcHRpb24uRXhjZXB0aW9uMzsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS5zZXJ2aWNlLmV4Y2VwdGlvbi5FeGNlcHRpb240OwotCi0KLXB1YmxpYyBjbGFzcyBGYXVsdFNlcnZpY2UgewotCi0gICAgcHVibGljIHZvaWQgbWV0aG9kMSgpCi0gICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uMSB7Ci0gICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24xKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBtZXRob2QyKFN0cmluZyBwYXJhbTEpCi0gICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uMiB7Ci0gICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24yKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBtZXRob2QzKGludCBwYXJhbTEpCi0gICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uMSwgRXhjZXB0aW9uMiB7Ci0gICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24xKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbWV0aG9kNChpbnQgcGFyYW0xKQotICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbjEsIEV4Y2VwdGlvbjIsIEV4Y2VwdGlvbjMsIEV4Y2VwdGlvbjQgewotICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uMygpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvbWV0YWRhdGEvc2VydmljZS9NYXBTZXJ2aWNlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9tZXRhZGF0YS9zZXJ2aWNlL01hcFNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2FjNDJhMC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9tZXRhZGF0YS9zZXJ2aWNlL01hcFNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEuc2VydmljZTsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLQotcHVibGljIGNsYXNzIE1hcFNlcnZpY2UgewotCi0gICAgcHVibGljIHZvaWQgbWV0aG9kMShNYXAgcGFyYW0xKXsKLQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL21ldGFkYXRhL3NlcnZpY2UvZHRvL0NoaWxkQ2xhc3MuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL21ldGFkYXRhL3NlcnZpY2UvZHRvL0NoaWxkQ2xhc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGVjNTZkNC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9tZXRhZGF0YS9zZXJ2aWNlL2R0by9DaGlsZENsYXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLm1ldGFkYXRhLnNlcnZpY2UuZHRvOwotCi0KLXB1YmxpYyBjbGFzcyBDaGlsZENsYXNzIGV4dGVuZHMgUGFyZW50Q2xhc3MgewotCi0gICAgcHJpdmF0ZSBJbnRlZ2VyIHBhcmFtMzsKLSAgICBwcml2YXRlIFN0cmluZyBwYXJhbTQ7Ci0KLSAgICBwdWJsaWMgSW50ZWdlciBnZXRQYXJhbTMoKSB7Ci0gICAgICAgIHJldHVybiBwYXJhbTM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGFyYW0zKEludGVnZXIgcGFyYW0zKSB7Ci0gICAgICAgIHRoaXMucGFyYW0zID0gcGFyYW0zOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFyYW00KCkgewotICAgICAgICByZXR1cm4gcGFyYW00OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBhcmFtNChTdHJpbmcgcGFyYW00KSB7Ci0gICAgICAgIHRoaXMucGFyYW00ID0gcGFyYW00OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL21ldGFkYXRhL3NlcnZpY2UvZHRvL0NoaWxkQ2xhc3MyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9tZXRhZGF0YS9zZXJ2aWNlL2R0by9DaGlsZENsYXNzMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjY3ZGU5Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL21ldGFkYXRhL3NlcnZpY2UvZHRvL0NoaWxkQ2xhc3MyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLm1ldGFkYXRhLnNlcnZpY2UuZHRvOwotCi0KLXB1YmxpYyBjbGFzcyBDaGlsZENsYXNzMiBleHRlbmRzIFBhcmVudENsYXNzIHsKLQotICAgIHByaXZhdGUgU3RyaW5nIHBhcmFtMzsKLSAgICBwcml2YXRlIFN0cmluZyBwYXJhbTQ7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhcmFtMygpIHsKLSAgICAgICAgcmV0dXJuIHBhcmFtMzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJhbTMoU3RyaW5nIHBhcmFtMykgewotICAgICAgICB0aGlzLnBhcmFtMyA9IHBhcmFtMzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhcmFtNCgpIHsKLSAgICAgICAgcmV0dXJuIHBhcmFtNDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJhbTQoU3RyaW5nIHBhcmFtNCkgewotICAgICAgICB0aGlzLnBhcmFtNCA9IHBhcmFtNDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9tZXRhZGF0YS9zZXJ2aWNlL2R0by9Db21wbGV4VHlwZTEuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL21ldGFkYXRhL3NlcnZpY2UvZHRvL0NvbXBsZXhUeXBlMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjk4ZGNkLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL21ldGFkYXRhL3NlcnZpY2UvZHRvL0NvbXBsZXhUeXBlMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS5zZXJ2aWNlLmR0bzsKLQotCi1wdWJsaWMgY2xhc3MgQ29tcGxleFR5cGUxIHsKLQotICAgIHByaXZhdGUgaW50IHBhcmFtMTsKLSAgICBwcml2YXRlIFN0cmluZyBwYXJhbTI7Ci0gICAgcHJpdmF0ZSBDb21wbGV4VHlwZTIgcGFyYW0zOwotICAgIHByaXZhdGUgaW50W10gcGFyYW00OwotICAgIHByaXZhdGUgU3RyaW5nW10gcGFyYW01OwotICAgIHByaXZhdGUgQ29tcGxleFR5cGUyW10gcGFyYW02OwotCi0gICAgcHVibGljIGludCBnZXRQYXJhbTEoKSB7Ci0gICAgICAgIHJldHVybiBwYXJhbTE7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGFyYW0xKGludCBwYXJhbTEpIHsKLSAgICAgICAgdGhpcy5wYXJhbTEgPSBwYXJhbTE7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQYXJhbTIoKSB7Ci0gICAgICAgIHJldHVybiBwYXJhbTI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGFyYW0yKFN0cmluZyBwYXJhbTIpIHsKLSAgICAgICAgdGhpcy5wYXJhbTIgPSBwYXJhbTI7Ci0gICAgfQotCi0gICAgcHVibGljIENvbXBsZXhUeXBlMiBnZXRQYXJhbTMoKSB7Ci0gICAgICAgIHJldHVybiBwYXJhbTM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGFyYW0zKENvbXBsZXhUeXBlMiBwYXJhbTMpIHsKLSAgICAgICAgdGhpcy5wYXJhbTMgPSBwYXJhbTM7Ci0gICAgfQotCi0gICAgcHVibGljIGludFtdIGdldFBhcmFtNCgpIHsKLSAgICAgICAgcmV0dXJuIHBhcmFtNDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJhbTQoaW50W10gcGFyYW00KSB7Ci0gICAgICAgIHRoaXMucGFyYW00ID0gcGFyYW00OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRQYXJhbTUoKSB7Ci0gICAgICAgIHJldHVybiBwYXJhbTU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGFyYW01KFN0cmluZ1tdIHBhcmFtNSkgewotICAgICAgICB0aGlzLnBhcmFtNSA9IHBhcmFtNTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29tcGxleFR5cGUyW10gZ2V0UGFyYW02KCkgewotICAgICAgICByZXR1cm4gcGFyYW02OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBhcmFtNihDb21wbGV4VHlwZTJbXSBwYXJhbTYpIHsKLSAgICAgICAgdGhpcy5wYXJhbTYgPSBwYXJhbTY7Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL21ldGFkYXRhL3NlcnZpY2UvZHRvL0NvbXBsZXhUeXBlMi5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvbWV0YWRhdGEvc2VydmljZS9kdG8vQ29tcGxleFR5cGUyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxMTJjOGYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvbWV0YWRhdGEvc2VydmljZS9kdG8vQ29tcGxleFR5cGUyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLm1ldGFkYXRhLnNlcnZpY2UuZHRvOwotCi1wdWJsaWMgY2xhc3MgQ29tcGxleFR5cGUyIHsKLQotICAgIHByaXZhdGUgaW50IHBhcmFtMTsKLSAgICBwcml2YXRlIFN0cmluZyBwYXJhbTI7Ci0gICAgcHJpdmF0ZSBpbnRbXSBwYXJhbTM7Ci0gICAgcHJpdmF0ZSBTdHJpbmdbXSBwYXJhbTQ7Ci0gICAgcHJpdmF0ZSBDb21wbGV4VHlwZTIgcGFyYW01OwotICAgIHByaXZhdGUgQ29tcGxleFR5cGUyW10gcGFyYW02OwotCi0gICAgcHVibGljIGludCBnZXRQYXJhbTEoKSB7Ci0gICAgICAgIHJldHVybiBwYXJhbTE7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGFyYW0xKGludCBwYXJhbTEpIHsKLSAgICAgICAgdGhpcy5wYXJhbTEgPSBwYXJhbTE7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQYXJhbTIoKSB7Ci0gICAgICAgIHJldHVybiBwYXJhbTI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGFyYW0yKFN0cmluZyBwYXJhbTIpIHsKLSAgICAgICAgdGhpcy5wYXJhbTIgPSBwYXJhbTI7Ci0gICAgfQotCi0gICAgcHVibGljIGludFtdIGdldFBhcmFtMygpIHsKLSAgICAgICAgcmV0dXJuIHBhcmFtMzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJhbTMoaW50W10gcGFyYW0zKSB7Ci0gICAgICAgIHRoaXMucGFyYW0zID0gcGFyYW0zOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRQYXJhbTQoKSB7Ci0gICAgICAgIHJldHVybiBwYXJhbTQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGFyYW00KFN0cmluZ1tdIHBhcmFtNCkgewotICAgICAgICB0aGlzLnBhcmFtNCA9IHBhcmFtNDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29tcGxleFR5cGUyIGdldFBhcmFtNSgpIHsKLSAgICAgICAgcmV0dXJuIHBhcmFtNTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJhbTUoQ29tcGxleFR5cGUyIHBhcmFtNSkgewotICAgICAgICB0aGlzLnBhcmFtNSA9IHBhcmFtNTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29tcGxleFR5cGUyW10gZ2V0UGFyYW02KCkgewotICAgICAgICByZXR1cm4gcGFyYW02OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBhcmFtNihDb21wbGV4VHlwZTJbXSBwYXJhbTYpIHsKLSAgICAgICAgdGhpcy5wYXJhbTYgPSBwYXJhbTY7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvbWV0YWRhdGEvc2VydmljZS9kdG8vQ29tcGxleFR5cGUzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9tZXRhZGF0YS9zZXJ2aWNlL2R0by9Db21wbGV4VHlwZTMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QzZTBlNi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9tZXRhZGF0YS9zZXJ2aWNlL2R0by9Db21wbGV4VHlwZTMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEuc2VydmljZS5kdG87Ci0KLQotcHVibGljIGNsYXNzIENvbXBsZXhUeXBlMyB7Ci0KLSAgICBwcml2YXRlIGludCBwYXJhbTE7Ci0KLSAgICBwdWJsaWMgaW50IGdldFBhcmFtMSgpIHsKLSAgICAgICAgcmV0dXJuIHBhcmFtMTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJhbTEoaW50IHBhcmFtMSkgewotICAgICAgICB0aGlzLnBhcmFtMSA9IHBhcmFtMTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9tZXRhZGF0YS9zZXJ2aWNlL2R0by9DdXN0b21CZWFuQ2xhc3MuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL21ldGFkYXRhL3NlcnZpY2UvZHRvL0N1c3RvbUJlYW5DbGFzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjFjZWRlLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL21ldGFkYXRhL3NlcnZpY2UvZHRvL0N1c3RvbUJlYW5DbGFzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS5zZXJ2aWNlLmR0bzsKLQotCi1wdWJsaWMgY2xhc3MgQ3VzdG9tQmVhbkNsYXNzIHsKLQotICAgIHByaXZhdGUgU2ltcGxlUmVzdHJpY3Rpb24gcGFyYW0xOwotCi0gICAgcHVibGljIFNpbXBsZVJlc3RyaWN0aW9uIGdldFBhcmFtMSgpIHsKLSAgICAgICAgcmV0dXJuIHBhcmFtMTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJhbTEoU2ltcGxlUmVzdHJpY3Rpb24gcGFyYW0xKSB7Ci0gICAgICAgIHRoaXMucGFyYW0xID0gcGFyYW0xOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL21ldGFkYXRhL3NlcnZpY2UvZHRvL1BhcmVudENsYXNzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9tZXRhZGF0YS9zZXJ2aWNlL2R0by9QYXJlbnRDbGFzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzAzMThmLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL21ldGFkYXRhL3NlcnZpY2UvZHRvL1BhcmVudENsYXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLm1ldGFkYXRhLnNlcnZpY2UuZHRvOwotCi0KLXB1YmxpYyBjbGFzcyBQYXJlbnRDbGFzcyB7Ci0KLSAgICBwcml2YXRlIGludCBwYXJhbTE7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgcGFyYW0yOwotCi0gICAgcHVibGljIGludCBnZXRQYXJhbTEoKSB7Ci0gICAgICAgIHJldHVybiBwYXJhbTE7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGFyYW0xKGludCBwYXJhbTEpIHsKLSAgICAgICAgdGhpcy5wYXJhbTEgPSBwYXJhbTE7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQYXJhbTIoKSB7Ci0gICAgICAgIHJldHVybiBwYXJhbTI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGFyYW0yKFN0cmluZyBwYXJhbTIpIHsKLSAgICAgICAgdGhpcy5wYXJhbTIgPSBwYXJhbTI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvbWV0YWRhdGEvc2VydmljZS9kdG8vU2ltcGxlUmVzdHJpY3Rpb24uamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL21ldGFkYXRhL3NlcnZpY2UvZHRvL1NpbXBsZVJlc3RyaWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxZTYyMGMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvbWV0YWRhdGEvc2VydmljZS9kdG8vU2ltcGxlUmVzdHJpY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEuc2VydmljZS5kdG87Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5kYXRhYmluZC5BYnN0cmFjdFJNSUJlYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZGF0YWJpbmQuSmF2YU9iamVjdFNlcmlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZGF0YWJpbmQuWG1sU3RyZWFtUGFyc2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmV4Y2VwdGlvbi5YbWxQYXJzaW5nRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmV4Y2VwdGlvbi5YbWxTZXJpYWxpemluZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS50eXBlLlNpbXBsZVJlc3RyaWN0aW9uVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS51dGlsLk5hbWVzcGFjZVByZWZpeDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXI7Ci0KLQotcHVibGljIGNsYXNzIFNpbXBsZVJlc3RyaWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RSTUlCZWFuCi17Ci0KLSAgICBwcml2YXRlIFN0cmluZyBwYXJhbTE7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoWE1MU3RyZWFtV3JpdGVyIHdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgSmF2YU9iamVjdFNlcmlhbGl6ZXIgc2VyaWFsaXplciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWVzcGFjZVByZWZpeCBuYW1lc3BhY2VQcmVmaXgpCi0gICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uLCBYbWxTZXJpYWxpemluZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIC8vd3JpdGUgdGhlIHN0YXIgZWxlbWVudAotICAgICAgICB3cml0ZVN0YXJ0RWxlbWVudCh3cml0ZXIscGFyZW50UU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkscGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCksbmFtZXNwYWNlUHJlZml4KTsKLSAgICAgICAgd3JpdGVyLndyaXRlQ2hhcmFjdGVycyhwYXJhbTEpOwotICAgICAgICB3cml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIENsYXNzIGdldEJlYW5DbGFzcygpewotICAgICAgICByZXR1cm4gU2ltcGxlUmVzdHJpY3Rpb25UeXBlLmNsYXNzOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IHBhcnNlKFhNTFN0cmVhbVJlYWRlciByZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWG1sU3RyZWFtUGFyc2VyIHBhcnNlcikKLSAgICAgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sIFhtbFBhcnNpbmdFeGNlcHRpb24gewotCi0gICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICBTaW1wbGVSZXN0cmljdGlvbiBzaW1wbGVSZXN0cmljdGlvbiA9IG5ldyBTaW1wbGVSZXN0cmljdGlvbigpOwotICAgICAgIHNpbXBsZVJlc3RyaWN0aW9uLnNldFBhcmFtMShyZWFkZXIuZ2V0VGV4dCgpKTsKLSAgICAgICB3aGlsZSAocmVhZGVyLmlzRW5kRWxlbWVudCgpKXsKLSAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICB9Ci0gICAgICAgcmV0dXJuIHNpbXBsZVJlc3RyaWN0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFyYW0xKCkgewotICAgICAgICByZXR1cm4gcGFyYW0xOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBhcmFtMShTdHJpbmcgcGFyYW0xKSB7Ci0gICAgICAgIHRoaXMucGFyYW0xID0gcGFyYW0xOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL21ldGFkYXRhL3NlcnZpY2UvZXhjZXB0aW9uL0V4Y2VwdGlvbjEuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL21ldGFkYXRhL3NlcnZpY2UvZXhjZXB0aW9uL0V4Y2VwdGlvbjEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJlMDg0Ni4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9tZXRhZGF0YS9zZXJ2aWNlL2V4Y2VwdGlvbi9FeGNlcHRpb24xLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLm1ldGFkYXRhLnNlcnZpY2UuZXhjZXB0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBFeGNlcHRpb24xIGV4dGVuZHMgRXhjZXB0aW9uIHsKLSAgICAKLSAgICBwdWJsaWMgRXhjZXB0aW9uMSgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRXhjZXB0aW9uMShTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRXhjZXB0aW9uMShUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIoY2F1c2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBFeGNlcHRpb24xKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL21ldGFkYXRhL3NlcnZpY2UvZXhjZXB0aW9uL0V4Y2VwdGlvbjIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL21ldGFkYXRhL3NlcnZpY2UvZXhjZXB0aW9uL0V4Y2VwdGlvbjIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NlZmE2OC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9tZXRhZGF0YS9zZXJ2aWNlL2V4Y2VwdGlvbi9FeGNlcHRpb24yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLm1ldGFkYXRhLnNlcnZpY2UuZXhjZXB0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBFeGNlcHRpb24yIGV4dGVuZHMgRXhjZXB0aW9uewotCi0gICAgcHVibGljIEV4Y2VwdGlvbjIoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIEV4Y2VwdGlvbjIoU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSk7Ci0gICAgfQotCi0gICAgcHVibGljIEV4Y2VwdGlvbjIoVGhyb3dhYmxlIGNhdXNlKSB7Ci0gICAgICAgIHN1cGVyKGNhdXNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRXhjZXB0aW9uMihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGNhdXNlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UsIGNhdXNlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9tZXRhZGF0YS9zZXJ2aWNlL2V4Y2VwdGlvbi9FeGNlcHRpb24zLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9tZXRhZGF0YS9zZXJ2aWNlL2V4Y2VwdGlvbi9FeGNlcHRpb24zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiYjk4M2IuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvbWV0YWRhdGEvc2VydmljZS9leGNlcHRpb24vRXhjZXB0aW9uMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS5zZXJ2aWNlLmV4Y2VwdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgRXhjZXB0aW9uMyBleHRlbmRzIEV4Y2VwdGlvbiB7Ci0KLSAgICBwdWJsaWMgRXhjZXB0aW9uMygpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRXhjZXB0aW9uMyhTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRXhjZXB0aW9uMyhUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIoY2F1c2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBFeGNlcHRpb24zKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL21ldGFkYXRhL3NlcnZpY2UvZXhjZXB0aW9uL0V4Y2VwdGlvbjQuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL21ldGFkYXRhL3NlcnZpY2UvZXhjZXB0aW9uL0V4Y2VwdGlvbjQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODRiMjJiNS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9tZXRhZGF0YS9zZXJ2aWNlL2V4Y2VwdGlvbi9FeGNlcHRpb240LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLm1ldGFkYXRhLnNlcnZpY2UuZXhjZXB0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBFeGNlcHRpb240IGV4dGVuZHMgRXhjZXB0aW9uIHsKLQotICAgIHB1YmxpYyBFeGNlcHRpb240KCkgewotICAgIH0KLQotICAgIHB1YmxpYyBFeGNlcHRpb240KFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBFeGNlcHRpb240KFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICBzdXBlcihjYXVzZSk7Ci0gICAgfQotCi0gICAgcHVibGljIEV4Y2VwdGlvbjQoU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlLCBjYXVzZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvbWV0YWRhdGEvdHlwZS9TaW1wbGVSZXN0cmljdGlvblR5cGUuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL21ldGFkYXRhL3R5cGUvU2ltcGxlUmVzdHJpY3Rpb25UeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhNzBlYTUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvbWV0YWRhdGEvdHlwZS9TaW1wbGVSZXN0cmljdGlvblR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEudHlwZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLkNvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5leGNlcHRpb24uTWV0YURhdGFQb3B1bGF0ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5leGNlcHRpb24uU2NoZW1hR2VuZXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS5BYnN0cmFjdFR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEuc2VydmljZS5kdG8uU2ltcGxlUmVzdHJpY3Rpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEudHlwZS54bWwuU2ltcGxlUmVzdHJpY3Rpb25YbWxUeXBlOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0KLXB1YmxpYyBjbGFzcyBTaW1wbGVSZXN0cmljdGlvblR5cGUgZXh0ZW5kcyBBYnN0cmFjdFR5cGUgewotCi0gICAgcHVibGljIHZvaWQgcG9wdWxhdGVNZXRhRGF0YShDb25maWd1cmF0b3IgY29uZmlndXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwIHByb2Nlc3NlZFR5cGVNYXApCi0gICAgICAgICAgICB0aHJvd3MgTWV0YURhdGFQb3B1bGF0ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMuamF2YUNsYXNzID0gU2ltcGxlUmVzdHJpY3Rpb24uY2xhc3M7Ci0gICAgICAgIHRoaXMubmFtZXNwYWNlID0gImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL3JtaS9zaW1wbGV0eXBlcyI7Ci0gICAgICAgIHRoaXMubmFtZSA9ICJzaW1wbGVSZXN0cmljdGlvbiI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZ2VuZXJhdGVTY2hlbWEoQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXAgc2NoZW1hTWFwKSB0aHJvd3MgU2NoZW1hR2VuZXJhdGlvbkV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgdGhpcy5pc1NjaGVtYUdlbmVyYXRlZCA9IHRydWU7Ci0gICAgICAgIHRoaXMueG1sVHlwZSA9IG5ldyBTaW1wbGVSZXN0cmljdGlvblhtbFR5cGUoKTsKLSAgICAgICAgdGhpcy54bWxUeXBlLnNldFFuYW1lKG5ldyBRTmFtZSh0aGlzLm5hbWVzcGFjZSx0aGlzLm5hbWUpKTsKLSAgICAgICAgcmVnaXN0ZXJYbWxUeXBlKHNjaGVtYU1hcCk7Ci0gICAgICAgIAotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvbWV0YWRhdGEvdHlwZS94bWwvU2ltcGxlUmVzdHJpY3Rpb25YbWxUeXBlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9tZXRhZGF0YS90eXBlL3htbC9TaW1wbGVSZXN0cmljdGlvblhtbFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmYzYzJmMS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9tZXRhZGF0YS90eXBlL3htbC9TaW1wbGVSZXN0cmljdGlvblhtbFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEudHlwZS54bWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5leGNlcHRpb24uU2NoZW1hR2VuZXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS54bWwuQWJzdHJhY3RYbWxUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLnV0aWwuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0KLXB1YmxpYyBjbGFzcyBTaW1wbGVSZXN0cmljdGlvblhtbFR5cGUgZXh0ZW5kcyBBYnN0cmFjdFhtbFR5cGUgewotCi0gICAgcHVibGljIHZvaWQgZ2VuZXJhdGVXU0RMU2NoZW1hKERvY3VtZW50IGRvY3VtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXAgbmFtZXNwYWNlc1RvUHJlZml4TWFwKSB0aHJvd3MgU2NoZW1hR2VuZXJhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIAotICAgICAgICAvLyBnZW5lcmF0ZSB0aGUgc2ltcGxlIHR5cGUgRWxlbWVudCBoZXJlCi0gICAgICAgIFN0cmluZyB4c2RQcmVmaXggPSAoU3RyaW5nKSBuYW1lc3BhY2VzVG9QcmVmaXhNYXAuZ2V0KENvbnN0YW50cy5VUklfMjAwMV9TQ0hFTUFfWFNEKTsKLSAgICAgICAgdGhpcy50eXBlRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhDb25zdGFudHMuVVJJXzIwMDFfU0NIRU1BX1hTRCwgInNpbXBsZVR5cGUiKTsKLSAgICAgICAgdGhpcy50eXBlRWxlbWVudC5zZXRQcmVmaXgoeHNkUHJlZml4KTsKLSAgICAgICAgdGhpcy50eXBlRWxlbWVudC5zZXRBdHRyaWJ1dGUoIm5hbWUiLHRoaXMucW5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotCi0gICAgICAgIEVsZW1lbnQgcmVzdHJpY3Rpb25FbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKENvbnN0YW50cy5VUklfMjAwMV9TQ0hFTUFfWFNELCJyZXN0cmljdGlvbiIpOwotICAgICAgICByZXN0cmljdGlvbkVsZW1lbnQuc2V0UHJlZml4KHhzZFByZWZpeCk7Ci0gICAgICAgIHJlc3RyaWN0aW9uRWxlbWVudC5zZXRBdHRyaWJ1dGUoImJhc2UiLHhzZFByZWZpeCArICI6c3RyaW5nIik7Ci0gICAgICAgIHRoaXMudHlwZUVsZW1lbnQuYXBwZW5kQ2hpbGQocmVzdHJpY3Rpb25FbGVtZW50KTsKLQotICAgICAgICBFbGVtZW50IGVudW1lcmF0aW9uRWxlbWVudCA9IG51bGw7Ci0gICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgNTsgaSsrKSB7Ci0gICAgICAgICAgICBlbnVtZXJhdGlvbkVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoQ29uc3RhbnRzLlVSSV8yMDAxX1NDSEVNQV9YU0QsICJlbnVtZXJhdGlvbiIpOwotICAgICAgICAgICAgZW51bWVyYXRpb25FbGVtZW50LnNldFByZWZpeCh4c2RQcmVmaXgpOwotICAgICAgICAgICAgZW51bWVyYXRpb25FbGVtZW50LnNldEF0dHJpYnV0ZSgidmFsdWUiLCAidGVzdFZhbHVlIiArIGkpOwotICAgICAgICAgICAgcmVzdHJpY3Rpb25FbGVtZW50LmFwcGVuZENoaWxkKGVudW1lcmF0aW9uRWxlbWVudCk7Ci0gICAgICAgIH0KLQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL3NlcnZlci9TZXJ2ZXJUZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9zZXJ2ZXIvU2VydmVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjVhN2M2Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL3NlcnZlci9TZXJ2ZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLnNlcnZlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLkNvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5leGNlcHRpb24uTWV0YURhdGFQb3B1bGF0ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5leGNlcHRpb24uU2NoZW1hR2VuZXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS5TZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLnNlcnZlci5zZXJ2aWNlcy5TZXJ2aWNlMTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS53c2RsLldTREwxMURlZmluaXRpb25CdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuU2ltcGxlSFRUUFNlcnZlcjsKLQotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLldTRExFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5mYWN0b3J5LldTRExGYWN0b3J5OwotaW1wb3J0IGphdmF4LndzZGwueG1sLldTRExXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLQotcHVibGljIGNsYXNzIFNlcnZlclRlc3QgewotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVhJUzJfQ09ORklHX0ZJTEUgPSAibW9kdWxlcy9ybWkvY29uZi9heGlzMi54bWwiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFYSVMyX1JFUE9TSVRPUllfTE9DQVRJT04gPSAibW9kdWxlcy9ybWkvcmVwb3NpdG9yeSI7Ci0KLSAgICBwdWJsaWMgdm9pZCBkZXBsb3lBbmRTdGFydFNlcnZpY2UoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBjb25mQ29udGV4dCA9Ci0gICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeS5jcmVhdGVDb25maWd1cmF0aW9uQ29udGV4dEZyb21GaWxlU3lzdGVtKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFYSVMyX1JFUE9TSVRPUllfTE9DQVRJT04sIEFYSVMyX0NPTkZJR19GSUxFKTsKLSAgICAgICAgICAgIC8vIGFkZCB0aGUgc2VydmljZQotLy8gICAgICAgICAgICBDb25maWd1cmF0b3IgY29uZmlndXJhdG9yID0gbmV3IENvbmZpZ3VyYXRvcigpOwotLy8gICAgICAgICAgICBDbGFzc0RlcGxveWVyIGNsYXNzRGVwbG95ZXIgPSBuZXcgQ2xhc3NEZXBsb3llcihjb25mQ29udGV4dCwgY29uZmlndXJhdG9yKTsKLS8vICAgICAgICAgICAgY2xhc3NEZXBsb3llci5kZXBsb3lDbGFzcyhTZXJ2aWNlMi5jbGFzcyk7Ci0KLSAgICAgICAgICAgIFNpbXBsZUhUVFBTZXJ2ZXIgc2ltcGxlSHR0cFNlcnZlciA9IG5ldyBTaW1wbGVIVFRQU2VydmVyKGNvbmZDb250ZXh0LCA1NTU1KTsKLSAgICAgICAgICAgIHNpbXBsZUh0dHBTZXJ2ZXIuc3RhcnQoKTsKLQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTZXJ2ZXIgc3RhcnRlZCBvbiBwb3J0IDU1NTUgIik7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgyMDAwKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGF4aXNGYXVsdCkgewotICAgICAgICAgICAgYXhpc0ZhdWx0LnByaW50U3RhY2tUcmFjZSgpOyAgLy9UbyBjaGFuZ2UgYm9keSBvZiBjYXRjaCBzdGF0ZW1lbnQgdXNlIEZpbGUgfCBTZXR0aW5ncyB8IEZpbGUgVGVtcGxhdGVzLgotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RXU0RMKCkgewotICAgICAgICBDb25maWd1cmF0b3IgY29uZmlndXJhdG9yID0gbmV3IENvbmZpZ3VyYXRvcigpOwotICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgU2VydmljZShTZXJ2aWNlMS5jbGFzcywgY29uZmlndXJhdG9yKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNlcnZpY2UucG9wdWxhdGVNZXRhRGF0YSgpOwotICAgICAgICAgICAgc2VydmljZS5nZW5lcmF0ZVNjaGVtYSgpOwotICAgICAgICAgICAgV1NETDExRGVmaW5pdGlvbkJ1aWxkZXIgZGVmaW5pdGlvbkJ1aWxkZXIgPSBuZXcgV1NETDExRGVmaW5pdGlvbkJ1aWxkZXIoc2VydmljZSk7Ci0gICAgICAgICAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSBkZWZpbml0aW9uQnVpbGRlci5nZW5lcmF0ZVdTREwoKTsKLQotICAgICAgICAgICAgV1NETFdyaXRlciB3c2RsV3JpdGVyID0gV1NETEZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdXU0RMV3JpdGVyKCk7Ci0gICAgICAgICAgICBGaWxlV3JpdGVyIGZpbGVXcml0ZXIgPSBuZXcgRmlsZVdyaXRlcigidGVzdC53c2RsIik7Ci0gICAgICAgICAgICB3c2RsV3JpdGVyLndyaXRlV1NETChkZWZpbml0aW9uLCBmaWxlV3JpdGVyKTsKLQotICAgICAgICB9IGNhdGNoIChNZXRhRGF0YVBvcHVsYXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfSBjYXRjaCAoV1NETEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0gICAgICAgIG5ldyBTZXJ2ZXJUZXN0KCkuZGVwbG95QW5kU3RhcnRTZXJ2aWNlKCk7Ci0vLyAgICAgICAgbmV3IFNlcnZlclRlc3QoKS50ZXN0V1NETCgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL3NlcnZlci9zZXJ2aWNlcy9TZXJ2aWNlMS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvc2VydmVyL3NlcnZpY2VzL1NlcnZpY2UxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlY2E2MzcuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvc2VydmVyL3NlcnZpY2VzL1NlcnZpY2UxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLnNlcnZlci5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLQotcHVibGljIGNsYXNzIFNlcnZpY2UxIGltcGxlbWVudHMgU2VydmljZTFJbnRlcmZhY2UgewotCi0gICAgcHVibGljIFN0cmluZyBtZXRob2QxKFN0cmluZyBwYXJhbTEpIHsKLSAgICAgICAgcmV0dXJuIHBhcmFtMTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nW10gbWV0aG9kMihTdHJpbmdbXSBwYXJhbTEpIHsKLSAgICAgICAgcmV0dXJuIHBhcmFtMTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IG1laHRvZDMoaW50IHBhcmFtMSkgewotICAgICAgICByZXR1cm4gcGFyYW0xOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnRbXSBtZWh0b2Q0KGludFtdIHBhcmFtMSkgewotICAgICAgICByZXR1cm4gcGFyYW0xOwotICAgIH0KLQotICAgIHB1YmxpYyBNYXAgbWV0aG9kNShNYXAgcGFyYW0xKSB7Ci0gICAgICAgIHJldHVybiBwYXJhbTE7Ci0gICAgfQotCi0gICAgcHVibGljIERhdGUgbWV0aG9kNihEYXRlIHBhcmFtMSl7Ci0gICAgICAgIHJldHVybiBwYXJhbTE7Ci0gICAgfQotCi0gICAgCi0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL3NlcnZlci9zZXJ2aWNlcy9TZXJ2aWNlMUludGVyZmFjZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvc2VydmVyL3NlcnZpY2VzL1NlcnZpY2UxSW50ZXJmYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3MWU3Y2IuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvc2VydmVyL3NlcnZpY2VzL1NlcnZpY2UxSW50ZXJmYWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLnNlcnZlci5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgU2VydmljZTFJbnRlcmZhY2UgewotCi0gICAgcHVibGljIFN0cmluZyBtZXRob2QxKFN0cmluZyBwYXJhbTEpOwotCi0gICAgcHVibGljIFN0cmluZ1tdIG1ldGhvZDIoU3RyaW5nW10gcGFyYW0xKTsKLQotICAgIHB1YmxpYyBpbnQgbWVodG9kMyhpbnQgcGFyYW0xKTsKLQotICAgIHB1YmxpYyBpbnRbXSBtZWh0b2Q0KGludFtdIHBhcmFtMSk7Ci0KLSAgICBwdWJsaWMgTWFwIG1ldGhvZDUoTWFwIHBhcmFtMSk7Ci0KLSAgICBwdWJsaWMgRGF0ZSBtZXRob2Q2KERhdGUgcGFyYW0xKTsKLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL3NlcnZlci9zZXJ2aWNlcy9TZXJ2aWNlMi5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvc2VydmVyL3NlcnZpY2VzL1NlcnZpY2UyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiMThlZjYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvc2VydmVyL3NlcnZpY2VzL1NlcnZpY2UyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLnNlcnZlci5zZXJ2aWNlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmRhdGFiaW5kLmR0by5UZXN0UmVzdHJpY3Rpb25CZWFuOwotCi0KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlMiB7Ci0gICAgCi0gICAgcHVibGljIFRlc3RSZXN0cmljdGlvbkJlYW4gbWV0aG9kNyhUZXN0UmVzdHJpY3Rpb25CZWFuIHBhcmFtMSkgewotICAgICAgICByZXR1cm4gcGFyYW0xOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhYWovY29uZi9NRVRBLUlORi9zZXJ2aWNlcy9qYXZheC54bWwuc29hcC5NZXNzYWdlRmFjdG9yeSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhYWovY29uZi9NRVRBLUlORi9zZXJ2aWNlcy9qYXZheC54bWwuc29hcC5NZXNzYWdlRmFjdG9yeQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQzNTIzOS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYWFqL2NvbmYvTUVUQS1JTkYvc2VydmljZXMvamF2YXgueG1sLnNvYXAuTWVzc2FnZUZhY3RvcnkKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1vcmcuYXBhY2hlLmF4aXMyLnNhYWouTWVzc2FnZUZhY3RvcnlJbXBsCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYWFqL2NvbmYvTUVUQS1JTkYvc2VydmljZXMvamF2YXgueG1sLnNvYXAuTWV0YUZhY3RvcnkgYi92MS41LjFSQzMvbW9kdWxlcy9zYWFqL2NvbmYvTUVUQS1JTkYvc2VydmljZXMvamF2YXgueG1sLnNvYXAuTWV0YUZhY3RvcnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmNmQzMDIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2Fhai9jb25mL01FVEEtSU5GL3NlcnZpY2VzL2phdmF4LnhtbC5zb2FwLk1ldGFGYWN0b3J5CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotb3JnLmFwYWNoZS5heGlzMi5zYWFqLlNBQUpNZXRhRmFjdG9yeUltcGwKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhYWovY29uZi9NRVRBLUlORi9zZXJ2aWNlcy9qYXZheC54bWwuc29hcC5TT0FQQ29ubmVjdGlvbkZhY3RvcnkgYi92MS41LjFSQzMvbW9kdWxlcy9zYWFqL2NvbmYvTUVUQS1JTkYvc2VydmljZXMvamF2YXgueG1sLnNvYXAuU09BUENvbm5lY3Rpb25GYWN0b3J5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjhiZmI0Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhYWovY29uZi9NRVRBLUlORi9zZXJ2aWNlcy9qYXZheC54bWwuc29hcC5TT0FQQ29ubmVjdGlvbkZhY3RvcnkKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1vcmcuYXBhY2hlLmF4aXMyLnNhYWouU09BUENvbm5lY3Rpb25GYWN0b3J5SW1wbApkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2Fhai9jb25mL01FVEEtSU5GL3NlcnZpY2VzL2phdmF4LnhtbC5zb2FwLlNPQVBGYWN0b3J5IGIvdjEuNS4xUkMzL21vZHVsZXMvc2Fhai9jb25mL01FVEEtSU5GL3NlcnZpY2VzL2phdmF4LnhtbC5zb2FwLlNPQVBGYWN0b3J5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzEyNWVlLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhYWovY29uZi9NRVRBLUlORi9zZXJ2aWNlcy9qYXZheC54bWwuc29hcC5TT0FQRmFjdG9yeQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLW9yZy5hcGFjaGUuYXhpczIuc2Fhai5TT0FQRmFjdG9yeUltcGwKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhYWovcG9tLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhYWovcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJkM2MxMC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYWFqL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+MS41LjE8L3ZlcnNpb24+Ci0gICAgICAgIDxyZWxhdGl2ZVBhdGg+Li4vcGFyZW50L3BvbS54bWw8L3JlbGF0aXZlUGF0aD4KLSAgICA8L3BhcmVudD4KLSAgICA8YXJ0aWZhY3RJZD5heGlzMi1zYWFqPC9hcnRpZmFjdElkPgotICAgIDxuYW1lPkFwYWNoZSBBeGlzMiAtIFNBQUo8L25hbWU+Ci0gICAgPGRlc2NyaXB0aW9uPkF4aXMyIFNBQUogaW1wbGVtZW50YXRpb248L2Rlc2NyaXB0aW9uPgotICAgIDxzY20+Ci0gICAgICAgIDxjb25uZWN0aW9uPnNjbTpzdm46aHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi93ZWJzZXJ2aWNlcy9heGlzMi90cnVuay9qYXZhL21vZHVsZXMvc2FhajwvY29ubmVjdGlvbj4KLSAgICAgICAgPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi93ZWJzZXJ2aWNlcy9heGlzMi90cnVuay9qYXZhL21vZHVsZXMvc2FhagotICAgICAgICA8L2RldmVsb3BlckNvbm5lY3Rpb24+Ci0gICAgICAgIDx1cmw+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXd2Yy93ZWJzZXJ2aWNlcy9heGlzMi90cnVuay9qYXZhL21vZHVsZXMvc2FhajwvdXJsPgotICAgIDwvc2NtPgotICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5nZXJvbmltby5zcGVjczwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmdlcm9uaW1vLXNhYWpfMS4zX3NwZWM8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLXRyYW5zcG9ydC1odHRwPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHt2ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItdHJhbnNwb3J0LWxvY2FsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHt2ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1rZXJuZWw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3ZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPGV4Y2x1c2lvbnM+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5nZXJvbmltby5zcGVjczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+Z2Vyb25pbW8tYWN0aXZhdGlvbl8xLjFfc3BlYzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmdlcm9uaW1vLnNwZWNzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5nZXJvbmltby1qYXZhbWFpbF8xLjRfc3BlYzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgIDwvZXhjbHVzaW9ucz4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmxvZzRqPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bG9nNGo8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8L2RlcGVuZGVuY2llcz4KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxzb3VyY2VEaXJlY3Rvcnk+c3JjPC9zb3VyY2VEaXJlY3Rvcnk+Ci0gICAgICAgIDx0ZXN0U291cmNlRGlyZWN0b3J5PnRlc3Q8L3Rlc3RTb3VyY2VEaXJlY3Rvcnk+Ci0gICAgICAgIDxyZXNvdXJjZXM+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT4uLi8uLjwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+Tk9USUNFLnR4dDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+TElDRU5TRS50eHQ8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgICAgICA8ZmlsdGVyaW5nPmZhbHNlPC9maWx0ZXJpbmc+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+Y29uZjwvZGlyZWN0b3J5PgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgPC9yZXNvdXJjZXM+Ci0gICAgICAgIDx0ZXN0UmVzb3VyY2VzPgotICAgICAgICAgICAgPHRlc3RSZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnRlc3QtcmVzb3VyY2VzPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5heGlzMi54bWw8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0UGF0aD4uLi90ZXN0LXJlc291cmNlcy9zYWFqLXJlcG88L3RhcmdldFBhdGg+Ci0gICAgICAgICAgICA8L3Rlc3RSZXNvdXJjZT4KLSAgICAgICAgICAgIDx0ZXN0UmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPHRhcmdldFBhdGg+Li4vdGVzdC1yZXNvdXJjZXM8L3RhcmdldFBhdGg+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT50ZXN0LXJlc291cmNlczwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKi4qPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICA8L3Rlc3RSZXNvdXJjZT4KLSAgICAgICAgICAgIDx0ZXN0UmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPHRhcmdldFBhdGg+Li4vdGVzdC1yZXNvdXJjZXM8L3RhcmdldFBhdGg+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT50ZXN0LXJlc291cmNlczwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKi5wcm9wZXJ0aWVzPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICA8L3Rlc3RSZXNvdXJjZT4KLSAgICAgICAgPC90ZXN0UmVzb3VyY2VzPgotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphci1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgIDxhcmNoaXZlPiAgCi0gICAgICAgICAgICAgICAgICA8bWFuaWZlc3RGaWxlPnJlc291cmNlcy9NRVRBLUlORi9NQU5JRkVTVC5NRjwvbWFuaWZlc3RGaWxlPgotICAgICAgICAgICAgICAgIDwvYXJjaGl2ZT4gCi0gICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPiAgCi0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHNvdXJjZT4xLjU8L3NvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgPHRhcmdldD4xLjU8L3RhcmdldD4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHNraXA+ZmFsc2U8L3NraXA+Ci0gICAgICAgICAgICAgICAgICAgIDxmb3JrTW9kZT5vbmNlPC9mb3JrTW9kZT4KLSAgICAgICAgICAgICAgICAgICAgPGFyZ0xpbmU+LURqYXZhLmVuZG9yc2VkLmRpcnM9JHttMlJlcG9zaXRvcnl9L29yZy9hcGFjaGUvZ2Vyb25pbW8vc3BlY3MvZ2Vyb25pbW8tc2Fhal8xLjNfc3BlYy8ke2dlcm9uaW1vLnNwZWMuc2Fhai52ZXJzaW9ufS88L2FyZ0xpbmU+Ci0gICAgICAgICAgICAgICAgICAgIDxzeXN0ZW1Qcm9wZXJ0aWVzPgotICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPmphdmF4LnhtbC5zb2FwLk1lc3NhZ2VGYWN0b3J5PC9uYW1lPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2YWx1ZT5vcmcuYXBhY2hlLmF4aXMyLnNhYWouTWVzc2FnZUZhY3RvcnlJbXBsPC92YWx1ZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+amF2YXgueG1sLnNvYXAuU09BUEZhY3Rvcnk8L25hbWU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZhbHVlPm9yZy5hcGFjaGUuYXhpczIuc2Fhai5TT0FQRmFjdG9yeUltcGw8L3ZhbHVlPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5qYXZheC54bWwuc29hcC5TT0FQQ29ubmVjdGlvbkZhY3Rvcnk8L25hbWU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZhbHVlPm9yZy5hcGFjaGUuYXhpczIuc2Fhai5TT0FQQ29ubmVjdGlvbkZhY3RvcnlJbXBsPC92YWx1ZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+amF2YXgueG1sLnNvYXAuTWV0YUZhY3Rvcnk8L25hbWU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZhbHVlPm9yZy5hcGFjaGUuYXhpczIuc2Fhai5TQUFKTWV0YUZhY3RvcnlJbXBsPC92YWx1ZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+Ci0gICAgICAgICAgICAgICAgICAgIDwvc3lzdGVtUHJvcGVydGllcz4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvYnVpbGQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYWFqL3Jlc291cmNlcy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhYWovcmVzb3VyY2VzL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDZkNjU1Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhYWovcmVzb3VyY2VzL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wDQotQnVuZGxlLUxpY2Vuc2U6IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMC50eHQNCi1JbXBvcnQtUGFja2FnZTogDQotIGphdmF4LmFjdGl2YXRpb24sDQotIGphdmF4LnhtbC5uYW1lc3BhY2UsDQotIGphdmF4LnhtbC5wYXJzZXJzLA0KLSBqYXZheC54bWwuc29hcCwNCi0gamF2YXgueG1sLnN0cmVhbSwNCi0gamF2YXgueG1sLnRyYW5zZm9ybSwNCi0gamF2YXgueG1sLnRyYW5zZm9ybS5kb20sDQotIGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLA0KLSBvcmcuYXBhY2hlLmF4aW9tLmF0dGFjaG1lbnRzLA0KLSBvcmcuYXBhY2hlLmF4aW9tLm9tLA0KLSBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwsDQotIG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5kb20sDQotIG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5kb20uZmFjdG9yeSwNCi0gb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmxsb20sDQotIG9yZy5hcGFjaGUuYXhpb20ub20udXRpbCwNCi0gb3JnLmFwYWNoZS5heGlvbS5zb2FwLA0KLSBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuaW1wbC5idWlsZGVyLA0KLSBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuaW1wbC5kb20sDQotIG9yZy5hcGFjaGUuYXhpb20uc29hcC5pbXBsLmRvbS5zb2FwMTEsDQotIG9yZy5hcGFjaGUuYXhpb20uc29hcC5pbXBsLmRvbS5zb2FwMTIsDQotIG9yZy5hcGFjaGUuYXhpczIsDQotIG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZywNCi0gb3JnLmFwYWNoZS5heGlzMi5idWlsZGVyLA0KLSBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudCwNCi0gb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LA0KLSBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLA0KLSBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZSwNCi0gb3JnLmFwYWNoZS5heGlzMi5oYW5kbGVycywNCi0gb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcsDQotIG9yZy53M2MuZG9tDQotRXhwb3J0LVBhY2thZ2U6IA0KLSBvcmcuYXBhY2hlLmF4aXMyLnNhYWosDQotIG9yZy5hcGFjaGUuYXhpczIuc2Fhai51dGlsDQotQnVuZGxlLVZlcnNpb246IDEuNA0KLUJ1bmRsZS1OYW1lOiBBeGlzMiBTQUFKDQotQnVuZGxlLURvY1VSTDogaHR0cDovL3d3dy5hcGFjaGUub3JnLw0KLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDINCi1CdW5kbGUtVmVuZG9yOiBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbg0KLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5hcGFjaGUuYXhpczIuc2Fhag0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhYWovc3JjL29yZy9hcGFjaGUvYXhpczIvc2Fhai9BdHRhY2htZW50UGFydEltcGwuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhYWovc3JjL29yZy9hcGFjaGUvYXhpczIvc2Fhai9BdHRhY2htZW50UGFydEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDMxZDZlNC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYWFqL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NhYWovQXR0YWNobWVudFBhcnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNhYWo7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NVGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuZG9tLkRPT01BYnN0cmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmRvbS5Eb2N1bWVudEltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmRvbS5UZXh0SW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLnV0aWwuQmFzZTY0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuc2Fhai51dGlsLlNBQUpEYXRhU291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuSFRUUENvbnN0YW50czsKLQotaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXI7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuQXR0YWNobWVudFBhcnQ7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuTWltZUhlYWRlcjsKLWltcG9ydCBqYXZheC54bWwuc29hcC5NaW1lSGVhZGVyczsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVNvdXJjZTsKLWltcG9ydCBqYXZhLmF3dC5pbWFnZS5CdWZmZXJlZEltYWdlOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEF0dGFjaG1lbnRQYXJ0SW1wbCBleHRlbmRzIEF0dGFjaG1lbnRQYXJ0IHsKLSAgICBwcml2YXRlIERhdGFIYW5kbGVyIGRhdGFIYW5kbGVyOwotCi0gICAgcHJpdmF0ZSBNaW1lSGVhZGVycyBtaW1lSGVhZGVycyA9IG5ldyBNaW1lSGVhZGVycygpOwotICAgIHByaXZhdGUgU3RyaW5nIGF0dGFjaG1lbnRGaWxlOwotCi0gICAgcHJpdmF0ZSBPTVRleHQgb21UZXh0OwotICAgIHByaXZhdGUgYm9vbGVhbiBpc0F0dGFjaG1lbnRSZWZlcmVuY2VkOwotCi0gICAgLyoqCi0gICAgICogQ2hlY2sgd2hldGhlciBhdCBsZWFzdCBvbmUgb2YgdGhlIGhlYWRlcnMgb2YgdGhpcyBvYmplY3QgbWF0Y2hlcyBhIHByb3ZpZGVkIGhlYWRlcgotICAgICAqCi0gICAgICogQHBhcmFtIGhlYWRlcnMKLSAgICAgKiBAcmV0dXJuIDxiPnRydWU8L2I+IGlmIGF0IGxlYXN0IG9uZSBoZWFkZXIgb2YgdGhpcyBBdHRhY2htZW50UGFydCBtYXRjaGVzIGEgaGVhZGVyIGluIHRoZQotICAgICAqICAgICAgICAgcHJvdmlkZWQgPGNvZGU+aGVhZGVyczwvY29kZT4gcGFyYW1ldGVyLCA8Yj5mYWxzZTwvYj4gaWYgbm9uZSBvZiB0aGUgaGVhZGVycyBvZiB0aGlzCi0gICAgICogICAgICAgICBBdHRhY2htZW50UGFydCBtYXRjaGVzIGF0IGxlYXN0IG9uZSBvZiB0aGUgaGVhZGVyIGluIHRoZSBwcm92aWRlZAotICAgICAqICAgICAgICAgPGNvZGU+aGVhZGVyczwvY29kZT4gcGFyYW1ldGVyCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhNaW1lSGVhZGVycyBoZWFkZXJzKSB7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGhlYWRlcnMuZ2V0QWxsSGVhZGVycygpOyBpLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIE1pbWVIZWFkZXIgaGRyID0gKGphdmF4LnhtbC5zb2FwLk1pbWVIZWFkZXIpaS5uZXh0KCk7Ci0gICAgICAgICAgICBTdHJpbmcgdmFsdWVzW10gPSBtaW1lSGVhZGVycy5nZXRIZWFkZXIoaGRyLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICBib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0gICAgICAgICAgICBpZiAodmFsdWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHZhbHVlcy5sZW5ndGg7IGorKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoIWhkci5nZXRWYWx1ZSgpLmVxdWFsc0lnbm9yZUNhc2UodmFsdWVzW2pdKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWZvdW5kKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQXR0YWNobWVudFJlZmVyZW5jZWQoKSB7Ci0gICAgICAgIHJldHVybiBpc0F0dGFjaG1lbnRSZWZlcmVuY2VkOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEF0dGFjaG1lbnRSZWZlcmVuY2VkKGJvb2xlYW4gYXR0YWNobWVudFJlZmVyZW5jZWQpIHsKLSAgICAgICAgaXNBdHRhY2htZW50UmVmZXJlbmNlZCA9IGF0dGFjaG1lbnRSZWZlcmVuY2VkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBpbiB0aGlzIDxDT0RFPiBBdHRhY2htZW50UGFydDwvQ09ERT4gb2JqZWN0LgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgc2l6ZSBvZiB0aGlzIDxDT0RFPkF0dGFjaG1lbnRQYXJ0PC9DT0RFPiBvYmplY3QgaW4gYnl0ZXMgb3IgLTEgaWYgdGhlIHNpemUgY2Fubm90Ci0gICAgICogICAgICAgICBiZSBkZXRlcm1pbmVkCi0gICAgICogQHRocm93cyBqYXZheC54bWwuc29hcC5TT0FQRXhjZXB0aW9uIGlmIHRoZSBjb250ZW50IG9mIHRoaXMgYXR0YWNobWVudCBpcyBjb3JydXB0ZWQgb2YgaWYKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlcmUgd2FzIGFuIGV4Y2VwdGlvbiB3aGlsZSB0cnlpbmcgdG8gZGV0ZXJtaW5lIHRoZQotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0U2l6ZSgpIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGRhdGFIYW5kbGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBib3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZGF0YUhhbmRsZXIud3JpdGVUbyhib3V0KTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU09BUEV4Y2VwdGlvbihleCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJvdXQuc2l6ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENsZWFycyBvdXQgdGhlIGNvbnRlbnQgb2YgdGhpcyA8Q09ERT4gQXR0YWNobWVudFBhcnQ8L0NPREU+IG9iamVjdC4gVGhlIE1JTUUgaGVhZGVyIHBvcnRpb24KLSAgICAgKiBpcyBsZWZ0IHVudG91Y2hlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjbGVhckNvbnRlbnQoKSB7Ci0gICAgICAgIGRhdGFIYW5kbGVyID0gbnVsbDsKLSAgICAgICAgb21UZXh0ID0gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBjb250ZW50IG9mIHRoaXMgPGNvZGU+QXR0YWNobWVudFBhcnQ8L2NvZGU+IG9iamVjdCBhcyBhIEphdmEgb2JqZWN0LiBUaGUgdHlwZSBvZiB0aGUKLSAgICAgKiByZXR1cm5lZCBKYXZhIG9iamVjdCBkZXBlbmRzIG9uIDxvbD4gPGxpPiB0aGUgPGNvZGU+RGF0YUNvbnRlbnRIYW5kbGVyPC9jb2RlPiBvYmplY3QgdGhhdCBpcwotICAgICAqIHVzZWQgdG8gaW50ZXJwcmV0IHRoZSBieXRlcyA8L2xpPiA8bGk+IHRoZSA8Y29kZT5Db250ZW50LVR5cGU8L2NvZGU+IGdpdmVuIGluIHRoZSBoZWFkZXI8L2xpPgotICAgICAqIDwvb2w+Ci0gICAgICogPHAvPgotICAgICAqIEZvciB0aGUgTUlNRSBjb250ZW50IHR5cGVzICJ0ZXh0L3BsYWluIiwgInRleHQvaHRtbCIgYW5kICJ0ZXh0L3htbCIsIHRoZQotICAgICAqIDxjb2RlPkRhdGFDb250ZW50SGFuZGxlcjwvY29kZT4gb2JqZWN0IGRvZXMgdGhlIGNvbnZlcnNpb25zIHRvIGFuZCBmcm9tIHRoZSBKYXZhIHR5cGVzCi0gICAgICogY29ycmVzcG9uZGluZyB0byB0aGUgTUlNRSB0eXBlcy4gRm9yIG90aGVyIE1JTUUgdHlwZXMsdGhlIDxjb2RlPkRhdGFDb250ZW50SGFuZGxlcjwvY29kZT4KLSAgICAgKiBvYmplY3QgY2FuIHJldHVybiBhbiA8Y29kZT5JbnB1dFN0cmVhbTwvY29kZT4gb2JqZWN0IHRoYXQgY29udGFpbnMgdGhlIGNvbnRlbnQgZGF0YSBhcyByYXcKLSAgICAgKiBieXRlcy4KLSAgICAgKiA8cC8+Ci0gICAgICogQSBKQVhNLWNvbXBsaWFudCBpbXBsZW1lbnRhdGlvbiBtdXN0LCBhcyBhIG1pbmltdW0sIHJldHVybiBhIDxjb2RlPmphdmEubGFuZy5TdHJpbmc8L2NvZGU+Ci0gICAgICogb2JqZWN0IGNvcnJlc3BvbmRpbmcgdG8gYW55IGNvbnRlbnQgc3RyZWFtIHdpdGggYSA8Y29kZT5Db250ZW50LVR5cGU8L2NvZGU+IHZhbHVlIG9mCi0gICAgICogPGNvZGU+dGV4dC9wbGFpbjwvY29kZT4sIGEgPGNvZGU+amF2YXgueG1sLnRyYW5zZm9ybS5TdHJlYW1Tb3VyY2U8L2NvZGU+IG9iamVjdCBjb3JyZXNwb25kaW5nCi0gICAgICogdG8gYSBjb250ZW50IHN0cmVhbSB3aXRoIGEgPGNvZGU+Q29udGVudC1UeXBlPC9jb2RlPiB2YWx1ZSBvZiA8Y29kZT50ZXh0L3htbDwvY29kZT4sIGEKLSAgICAgKiA8Y29kZT5qYXZhLmF3dC5JbWFnZTwvY29kZT4gb2JqZWN0IGNvcnJlc3BvbmRpbmcgdG8gYSBjb250ZW50IHN0cmVhbSB3aXRoIGEKLSAgICAgKiA8Y29kZT5Db250ZW50LVR5cGU8L2NvZGU+IHZhbHVlIG9mIDxjb2RlPmltYWdlL2dpZjwvY29kZT4gb3IgPGNvZGU+aW1hZ2UvanBlZzwvY29kZT4uICBGb3IKLSAgICAgKiB0aG9zZSBjb250ZW50IHR5cGVzIHRoYXQgYW4gaW5zdGFsbGVkIDxjb2RlPkRhdGFDb250ZW50SGFuZGxlcjwvY29kZT4gb2JqZWN0IGRvZXMgbm90Ci0gICAgICogdW5kZXJzdGFuZCwgdGhlIDxjb2RlPkRhdGFDb250ZW50SGFuZGxlcjwvY29kZT4gb2JqZWN0IGlzIHJlcXVpcmVkIHRvIHJldHVybiBhCi0gICAgICogPGNvZGU+amF2YS5pby5JbnB1dFN0cmVhbTwvY29kZT4gb2JqZWN0IHdpdGggdGhlIHJhdyBieXRlcy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYSBKYXZhIG9iamVjdCB3aXRoIHRoZSBjb250ZW50IG9mIHRoaXMgPENPREU+IEF0dGFjaG1lbnRQYXJ0PC9DT0RFPiBvYmplY3QKLSAgICAgKiBAdGhyb3dzIGphdmF4LnhtbC5zb2FwLlNPQVBFeGNlcHRpb24gaWYgdGhlcmUgaXMgbm8gY29udGVudCBzZXQgaW50byB0aGlzIDxDT0RFPkF0dGFjaG1lbnRQYXJ0PC9DT0RFPgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Qgb3IgaWYgdGhlcmUgd2FzIGEgZGF0YSB0cmFuc2Zvcm1hdGlvbiBlcnJvcgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0Q29udGVudCgpIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGRhdGFIYW5kbGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTT0FQRXhjZXB0aW9uKCJObyBjb250ZW50IGlzIHByZXNlbnQgaW4gdGhpcyBBdHRhY2htZW50UGFydCIpOwotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTdHJpbmcgY29udGVudFR5cGUgPSBkYXRhSGFuZGxlci5nZXRDb250ZW50VHlwZSgpOwotICAgICAgICAgICAgaWYgKGNvbnRlbnRUeXBlLmVxdWFscyhIVFRQQ29uc3RhbnRzLk1FRElBX1RZUEVfVEVYVF9YTUwpIHx8Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlLmVxdWFscyhIVFRQQ29uc3RhbnRzLk1FRElBX1RZUEVfQVBQTElDQVRJT05fWE1MKSkgewotICAgICAgICAgICAgICAgIFN0cmVhbVNvdXJjZSBzdHJlYW1Tb3VyY2UgPSBuZXcgU3RyZWFtU291cmNlKCk7Ci0gICAgICAgICAgICAgICAgc3RyZWFtU291cmNlLnNldElucHV0U3RyZWFtKGRhdGFIYW5kbGVyLmdldElucHV0U3RyZWFtKCkpOwotICAgICAgICAgICAgICAgIHJldHVybiBzdHJlYW1Tb3VyY2U7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGNvbnRlbnRUeXBlLmVxdWFscygidGV4dC9wbGFpbiIpIHx8Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlLmVxdWFscygidGV4dC9odG1sIikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKFN0cmluZylkYXRhSGFuZGxlci5nZXRDb250ZW50KCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBkYXRhSGFuZGxlci5nZXRDb250ZW50KCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy9JZiB0aGUgdW5kZXJseWluZyBEYXRhQ29udGVudEhhbmRsZXIgY2FuJ3QgaGFuZGxlIHRoZSBvYmplY3QgY29udGVudHMsCi0gICAgICAgICAgICAgICAgICAgIC8vd2Ugd2lsbCByZXR1cm4gYW4gaW5wdXRzdHJlYW0gb2YgcmF3IGJ5dGVzIHJlcHJlc2VudGluZyB0aGUgY29udGVudCBkYXRhCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBkYXRhSGFuZGxlci5nZXREYXRhU291cmNlKCkuZ2V0SW5wdXRTdHJlYW0oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTT0FQRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGNvbnRlbnQgb2YgdGhpcyBhdHRhY2htZW50IHBhcnQgdG8gdGhhdCBvZiB0aGUgZ2l2ZW4gPENPREU+T2JqZWN0PC9DT0RFPiBhbmQgc2V0cwotICAgICAqIHRoZSB2YWx1ZSBvZiB0aGUgPENPREU+IENvbnRlbnQtVHlwZTwvQ09ERT4gaGVhZGVyIHRvIHRoZSBnaXZlbiB0eXBlLiBUaGUgdHlwZSBvZiB0aGUKLSAgICAgKiA8Q09ERT5PYmplY3Q8L0NPREU+IHNob3VsZCBjb3JyZXNwb25kIHRvIHRoZSB2YWx1ZSBnaXZlbiBmb3IgdGhlIDxDT0RFPkNvbnRlbnQtVHlwZTwvQ09ERT4uCi0gICAgICogVGhpcyBkZXBlbmRzIG9uIHRoZSBwYXJ0aWN1bGFyIHNldCBvZiA8Q09ERT5EYXRhQ29udGVudEhhbmRsZXI8L0NPREU+IG9iamVjdHMgaW4gdXNlLgotICAgICAqCi0gICAgICogQHBhcmFtIG9iamVjdCAgICAgIHRoZSBKYXZhIG9iamVjdCB0aGF0IG1ha2VzIHVwIHRoZSBjb250ZW50IGZvciB0aGlzIGF0dGFjaG1lbnQgcGFydAotICAgICAqIEBwYXJhbSBjb250ZW50VHlwZSB0aGUgTUlNRSBzdHJpbmcgdGhhdCBzcGVjaWZpZXMgdGhlIHR5cGUgb2YgdGhlIGNvbnRlbnQKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgY29udGVudFR5cGUgZG9lcyBub3QgbWF0Y2ggdGhlIHR5cGUgb2YgdGhlIGNvbnRlbnQKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3QsIG9yIGlmIHRoZXJlIHdhcyBubyA8Q09ERT4gRGF0YUNvbnRlbnRIYW5kbGVyPC9DT0RFPgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdCBmb3IgdGhpcyBjb250ZW50IG9iamVjdAotICAgICAqIEBzZWUgI2dldENvbnRlbnQoKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENvbnRlbnQoT2JqZWN0IG9iamVjdCwgU3RyaW5nIGNvbnRlbnRUeXBlKSB7Ci0gICAgICAgIFNBQUpEYXRhU291cmNlIHNvdXJjZTsKLSAgICAgICAgc2V0TWltZUhlYWRlcihIVFRQQ29uc3RhbnRzLkhFQURFUl9DT05URU5UX1RZUEUsIGNvbnRlbnRUeXBlKTsKLSAgICAgICAgT2JqZWN0IGNvbnRlbnRPYmplY3Q7Ci0gICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHMgPSAoU3RyaW5nKW9iamVjdDsKLSAgICAgICAgICAgICAgICBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtIGJhaXMgPSBuZXcgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbShzLmdldEJ5dGVzKCkpOwotICAgICAgICAgICAgICAgIHNvdXJjZSA9IG5ldyBTQUFKRGF0YVNvdXJjZShiYWlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQUFKRGF0YVNvdXJjZS5NQVhfTUVNT1JZX0RJU0tfQ0FDSEVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50VHlwZSwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgZXh0cmFjdEZpbGVuYW1lKHNvdXJjZSk7Ci0gICAgICAgICAgICAgICAgdGhpcy5kYXRhSGFuZGxlciA9IG5ldyBEYXRhSGFuZGxlcihzb3VyY2UpOwotICAgICAgICAgICAgICAgIGNvbnRlbnRPYmplY3QgPSBvYmplY3Q7Ci0gICAgICAgICAgICB9IGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGlvKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIklsbGVnYWwgQXJndW1lbnQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBqYXZhLmlvLklucHV0U3RyZWFtKSB7Ci0gICAgICAgICAgICB0cnkgewotCi0gICAgICAgICAgICAgICAgc291cmNlID0gbmV3IFNBQUpEYXRhU291cmNlKChqYXZhLmlvLklucHV0U3RyZWFtKW9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0FBSkRhdGFTb3VyY2UuTUlOX01FTU9SWV9ESVNLX0NBQ0hFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFR5cGUsIHRydWUpOwotICAgICAgICAgICAgICAgIGV4dHJhY3RGaWxlbmFtZShzb3VyY2UpOwotICAgICAgICAgICAgICAgIHRoaXMuZGF0YUhhbmRsZXIgPSBuZXcgRGF0YUhhbmRsZXIoc291cmNlKTsKLSAgICAgICAgICAgICAgICBjb250ZW50T2JqZWN0ID0gbnVsbDsgLy8gdGhlIHN0cmVhbSBoYXMgYmVlbiBjb25zdW1lZAotICAgICAgICAgICAgfSBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBpbykgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbGxlZ2FsIEFyZ3VtZW50Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgU3RyZWFtU291cmNlKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHNvdXJjZSA9IG5ldyBTQUFKRGF0YVNvdXJjZSgoKFN0cmVhbVNvdXJjZSlvYmplY3QpLmdldElucHV0U3RyZWFtKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNBQUpEYXRhU291cmNlLk1BWF9NRU1PUllfRElTS19DQUNIRUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlLCB0cnVlKTsKLSAgICAgICAgICAgICAgICBleHRyYWN0RmlsZW5hbWUoc291cmNlKTsKLSAgICAgICAgICAgICAgICB0aGlzLmRhdGFIYW5kbGVyID0gbmV3IERhdGFIYW5kbGVyKHNvdXJjZSk7Ci0gICAgICAgICAgICAgICAgY29udGVudE9iamVjdCA9IG51bGw7IC8vIHRoZSBzdHJlYW0gaGFzIGJlZW4gY29uc3VtZWQKLSAgICAgICAgICAgIH0gY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gaW8pIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSWxsZWdhbCBBcmd1bWVudCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEJ1ZmZlcmVkSW1hZ2UpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5kYXRhSGFuZGxlciA9IG5ldyBEYXRhSGFuZGxlcihvYmplY3QsIGNvbnRlbnRUeXBlKTsKLSAgICAgICAgICAgICAgICBjb250ZW50T2JqZWN0ID0gbnVsbDsgLy8gdGhlIHN0cmVhbSBoYXMgYmVlbiBjb25zdW1lZAotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgYnl0ZVtdKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGNvbnRlbnRPYmplY3QgPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmFpcyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbSgoYnl0ZVtdKW9iamVjdCk7Ci0gICAgICAgICAgICAgICAgc291cmNlID0gbmV3IFNBQUpEYXRhU291cmNlKGJhaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNBQUpEYXRhU291cmNlLk1BWF9NRU1PUllfRElTS19DQUNIRUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlLCB0cnVlKTsKLSAgICAgICAgICAgICAgICBleHRyYWN0RmlsZW5hbWUoc291cmNlKTsKLQotICAgICAgICAgICAgICAgIHRoaXMuZGF0YUhhbmRsZXIgPSBuZXcgRGF0YUhhbmRsZXIoc291cmNlKTsKLSAgICAgICAgICAgICAgICBjb250ZW50T2JqZWN0ID0gb2JqZWN0OwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSWxsZWdhbCBBcmd1bWVudCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgPENPREU+RGF0YUhhbmRsZXI8L0NPREU+IG9iamVjdCBmb3IgdGhpcyA8Q09ERT4gQXR0YWNobWVudFBhcnQ8L0NPREU+IG9iamVjdC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIDxDT0RFPkRhdGFIYW5kbGVyPC9DT0RFPiBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMgPENPREU+QXR0YWNobWVudFBhcnQ8L0NPREU+Ci0gICAgICogICAgICAgICBvYmplY3QKLSAgICAgKiBAdGhyb3dzIGphdmF4LnhtbC5zb2FwLlNPQVBFeGNlcHRpb24gaWYgdGhlcmUgaXMgbm8gZGF0YSBpbiB0aGlzIDxDT0RFPkF0dGFjaG1lbnRQYXJ0PC9DT0RFPgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3QKLSAgICAgKi8KLSAgICBwdWJsaWMgRGF0YUhhbmRsZXIgZ2V0RGF0YUhhbmRsZXIoKSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vaWYgKGdldENvbnRlbnQoKSA9PSBudWxsKSB7Ci0gICAgICAgIC8vICAgIHRocm93IG5ldyBTT0FQRXhjZXB0aW9uKCJObyBDb250ZW50IHByZXNlbnQgaW4gdGhlIEF0dGFjaG1lbnQgcGFydCIpOwotICAgICAgICAvL30KLSAgICAgICAgLy9jb21tZW50ZWQgdG8gZml4IEFYSVMyLTc3OAotICAgICAgICBpZiAoZGF0YUhhbmRsZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNPQVBFeGNlcHRpb24oIk5vIENvbnRlbnQgcHJlc2VudCBpbiB0aGUgQXR0YWNobWVudCBwYXJ0Iik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZGF0YUhhbmRsZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZ2l2ZW4gPENPREU+RGF0YUhhbmRsZXI8L0NPREU+IG9iamVjdCBhcyB0aGUgZGF0YSBoYW5kbGVyIGZvciB0aGlzCi0gICAgICogPENPREU+QXR0YWNobWVudFBhcnQ8L0NPREU+IG9iamVjdC4gVHlwaWNhbGx5LCBvbiBhbiBpbmNvbWluZyBtZXNzYWdlLCB0aGUgZGF0YSBoYW5kbGVyIGlzCi0gICAgICogYXV0b21hdGljYWxseSBzZXQuIFdoZW4gYSBtZXNzYWdlIGlzIGJlaW5nIGNyZWF0ZWQgYW5kIHBvcHVsYXRlZCB3aXRoIGNvbnRlbnQsIHRoZQotICAgICAqIDxDT0RFPnNldERhdGFIYW5kbGVyPC9DT0RFPiBtZXRob2QgY2FuIGJlIHVzZWQgdG8gZ2V0IGRhdGEgZnJvbSB2YXJpb3VzIGRhdGEgc291cmNlcyBpbnRvIHRoZQotICAgICAqIG1lc3NhZ2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZGF0YWhhbmRsZXIgPENPREU+RGF0YUhhbmRsZXI8L0NPREU+IG9iamVjdCB0byBiZSBzZXQKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGVyZSB3YXMgYSBwcm9ibGVtIHdpdGggdGhlIHNwZWNpZmllZCA8Q09ERT4KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhSGFuZGxlcjwvQ09ERT4gb2JqZWN0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RGF0YUhhbmRsZXIoRGF0YUhhbmRsZXIgZGF0YWhhbmRsZXIpIHsKLSAgICAgICAgaWYgKGRhdGFoYW5kbGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRoaXMuZGF0YUhhbmRsZXIgPSBkYXRhaGFuZGxlcjsKLSAgICAgICAgICAgIHNldE1pbWVIZWFkZXIoSFRUUENvbnN0YW50cy5IRUFERVJfQ09OVEVOVF9UWVBFLCBkYXRhaGFuZGxlci5nZXRDb250ZW50VHlwZSgpKTsKLSAgICAgICAgICAgIG9tVGV4dCA9IERPT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCkuY3JlYXRlT01UZXh0KGRhdGFoYW5kbGVyLCB0cnVlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbm5vdCBzZXQgbnVsbCBEYXRhSGFuZGxlciIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyBhbGwgTUlNRSBoZWFkZXJzIHRoYXQgbWF0Y2ggdGhlIGdpdmVuIG5hbWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaGVhZGVyIC0gdGhlIHN0cmluZyBuYW1lIG9mIHRoZSBNSU1FIGhlYWRlci9zIHRvIGJlIHJlbW92ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVNaW1lSGVhZGVyKFN0cmluZyBoZWFkZXIpIHsKLSAgICAgICAgbWltZUhlYWRlcnMucmVtb3ZlSGVhZGVyKGhlYWRlcik7Ci0gICAgfQotCi0gICAgLyoqIFJlbW92ZXMgYWxsIHRoZSBNSU1FIGhlYWRlciBlbnRyaWVzLiAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZUFsbE1pbWVIZWFkZXJzKCkgewotICAgICAgICBtaW1lSGVhZGVycy5yZW1vdmVBbGxIZWFkZXJzKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhbGwgdGhlIHZhbHVlcyBvZiB0aGUgaGVhZGVyIGlkZW50aWZpZWQgYnkgdGhlIGdpdmVuIDxDT0RFPlN0cmluZzwvQ09ERT4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgaGVhZGVyOyBleGFtcGxlOiAiQ29udGVudC1UeXBlIgotICAgICAqIEByZXR1cm4gYSA8Q09ERT5TdHJpbmc8L0NPREU+IGFycmF5IGdpdmluZyB0aGUgdmFsdWUgZm9yIHRoZSBzcGVjaWZpZWQgaGVhZGVyCi0gICAgICogQHNlZSAjc2V0TWltZUhlYWRlcihTdHJpbmcsIFN0cmluZykgc2V0TWltZUhlYWRlcihqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRNaW1lSGVhZGVyKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHJldHVybiBtaW1lSGVhZGVycy5nZXRIZWFkZXIobmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hhbmdlcyB0aGUgZmlyc3QgaGVhZGVyIGVudHJ5IHRoYXQgbWF0Y2hlcyB0aGUgZ2l2ZW4gbmFtZSB0byB0aGUgZ2l2ZW4gdmFsdWUsIGFkZGluZyBhIG5ldwotICAgICAqIGhlYWRlciBpZiBubyBleGlzdGluZyBoZWFkZXIgbWF0Y2hlcy4gVGhpcyBtZXRob2QgYWxzbyByZW1vdmVzIGFsbCBtYXRjaGluZyBoZWFkZXJzIGJ1dCB0aGUKLSAgICAgKiBmaXJzdC4KLSAgICAgKiA8cC8+Ci0gICAgICogPFA+Tm90ZSB0aGF0IFJGQzgyMiBoZWFkZXJzIGNhbiBvbmx5IGNvbnRhaW4gVVMtQVNDSUkgY2hhcmFjdGVycy48L1A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSAgYSA8Q09ERT5TdHJpbmc8L0NPREU+IGdpdmluZyB0aGUgbmFtZSBvZiB0aGUgaGVhZGVyIGZvciB3aGljaCB0byBzZWFyY2gKLSAgICAgKiBAcGFyYW0gdmFsdWUgYSA8Q09ERT5TdHJpbmc8L0NPREU+IGdpdmluZyB0aGUgdmFsdWUgdG8gYmUgc2V0IGZvciB0aGUgaGVhZGVyIHdob3NlIG5hbWUKLSAgICAgKiAgICAgICAgICAgICAgbWF0Y2hlcyB0aGUgZ2l2ZW4gbmFtZQotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZXJlIHdhcyBhIHByb2JsZW0gd2l0aCB0aGUgc3BlY2lmaWVkIG1pbWUgaGVhZGVyIG5hbWUKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciB2YWx1ZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE1pbWVIZWFkZXIoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgewotICAgICAgICBtaW1lSGVhZGVycy5zZXRIZWFkZXIobmFtZSwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSBNSU1FIGhlYWRlciB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBhbmQgdmFsdWUgdG8gdGhpcyA8Q09ERT5BdHRhY2htZW50UGFydDwvQ09ERT4KLSAgICAgKiBvYmplY3QuCi0gICAgICogPHAvPgotICAgICAqIDxQPk5vdGUgdGhhdCBSRkM4MjIgaGVhZGVycyBjYW4gY29udGFpbiBvbmx5IFVTLUFTQ0lJIGNoYXJhY3RlcnMuPC9QPgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgIGEgPENPREU+U3RyaW5nPC9DT0RFPiBnaXZpbmcgdGhlIG5hbWUgb2YgdGhlIGhlYWRlciB0byBiZSBhZGRlZAotICAgICAqIEBwYXJhbSB2YWx1ZSBhIDxDT0RFPlN0cmluZzwvQ09ERT4gZ2l2aW5nIHRoZSB2YWx1ZSBvZiB0aGUgaGVhZGVyIHRvIGJlIGFkZGVkCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlcmUgd2FzIGEgcHJvYmxlbSB3aXRoIHRoZSBzcGVjaWZpZWQgbWltZSBoZWFkZXIgbmFtZQotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIHZhbHVlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkTWltZUhlYWRlcihTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIG1pbWVIZWFkZXJzLmFkZEhlYWRlcihuYW1lLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0cmlldmVzIGFsbCB0aGUgaGVhZGVycyBmb3IgdGhpcyA8Q09ERT4gQXR0YWNobWVudFBhcnQ8L0NPREU+IG9iamVjdCBhcyBhbiBpdGVyYXRvciBvdmVyCi0gICAgICogdGhlIDxDT0RFPiBNaW1lSGVhZGVyPC9DT0RFPiBvYmplY3RzLgotICAgICAqCi0gICAgICogQHJldHVybiBhbiA8Q09ERT5JdGVyYXRvcjwvQ09ERT4gb2JqZWN0IHdpdGggYWxsIG9mIHRoZSBNaW1lIGhlYWRlcnMgZm9yIHRoaXMKLSAgICAgKiAgICAgICAgIDxDT0RFPkF0dGFjaG1lbnRQYXJ0PC9DT0RFPiBvYmplY3QKLSAgICAgKi8KLSAgICBwdWJsaWMgSXRlcmF0b3IgZ2V0QWxsTWltZUhlYWRlcnMoKSB7Ci0gICAgICAgIHJldHVybiBtaW1lSGVhZGVycy5nZXRBbGxIZWFkZXJzKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0cmlldmVzIGFsbCA8Q09ERT5NaW1lSGVhZGVyPC9DT0RFPiBvYmplY3RzIHRoYXQgbWF0Y2ggYSBuYW1lIGluIHRoZSBnaXZlbiBhcnJheS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lcyBhIDxDT0RFPlN0cmluZzwvQ09ERT4gYXJyYXkgd2l0aCB0aGUgbmFtZShzKSBvZiB0aGUgTUlNRSBoZWFkZXJzIHRvIGJlIHJldHVybmVkCi0gICAgICogQHJldHVybiBhbGwgb2YgdGhlIE1JTUUgaGVhZGVycyB0aGF0IG1hdGNoIG9uZSBvZiB0aGUgbmFtZXMgaW4gdGhlIGdpdmVuIGFycmF5IGFzIGFuCi0gICAgICogICAgICAgICA8Q09ERT5JdGVyYXRvcjwvQ09ERT4gb2JqZWN0Ci0gICAgICovCi0gICAgcHVibGljIEl0ZXJhdG9yIGdldE1hdGNoaW5nTWltZUhlYWRlcnMoU3RyaW5nIG5hbWVzW10pIHsKLSAgICAgICAgcmV0dXJuIG1pbWVIZWFkZXJzLmdldE1hdGNoaW5nSGVhZGVycyhuYW1lcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0cmlldmVzIGFsbCA8Q09ERT5NaW1lSGVhZGVyPC9DT0RFPiBvYmplY3RzIHdob3NlIG5hbWUgZG9lcyBub3QgbWF0Y2ggYSBuYW1lIGluIHRoZSBnaXZlbgotICAgICAqIGFycmF5LgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWVzIGEgPENPREU+U3RyaW5nPC9DT0RFPiBhcnJheSB3aXRoIHRoZSBuYW1lKHMpIG9mIHRoZSBNSU1FIGhlYWRlcnMgbm90IHRvIGJlCi0gICAgICogICAgICAgICAgICAgIHJldHVybmVkCi0gICAgICogQHJldHVybiBhbGwgb2YgdGhlIE1JTUUgaGVhZGVycyBpbiB0aGlzIDxDT0RFPiBBdHRhY2htZW50UGFydDwvQ09ERT4gb2JqZWN0IGV4Y2VwdCB0aG9zZSB0aGF0Ci0gICAgICogICAgICAgICBtYXRjaCBvbmUgb2YgdGhlIG5hbWVzIGluIHRoZSBnaXZlbiBhcnJheS4gVGhlIG5vbm1hdGNoaW5nIE1JTUUgaGVhZGVycyBhcmUgcmV0dXJuZWQKLSAgICAgKiAgICAgICAgIGFzIGFuIDxDT0RFPkl0ZXJhdG9yPC9DT0RFPiBvYmplY3QuCi0gICAgICovCi0gICAgcHVibGljIEl0ZXJhdG9yIGdldE5vbk1hdGNoaW5nTWltZUhlYWRlcnMoU3RyaW5nIG5hbWVzW10pIHsKLSAgICAgICAgcmV0dXJuIG1pbWVIZWFkZXJzLmdldE5vbk1hdGNoaW5nSGVhZGVycyhuYW1lcyk7Ci0gICAgfQotCi0gICAgcHVibGljIElucHV0U3RyZWFtIGdldEJhc2U2NENvbnRlbnQoKSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7Ci0gICAgICAgIGJ5dGVbXSByYXdEYXRhID0gZ2V0UmF3Q29udGVudEJ5dGVzKCk7Ci0gICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBCYXNlNjQuZW5jb2RlKHJhd0RhdGEsIDAsIHJhd0RhdGEubGVuZ3RoLCBvdXQpOwotICAgICAgICAgICAgcmV0dXJuIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvdXQudG9CeXRlQXJyYXkoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTT0FQRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBjb250ZW50IG9mIHRoaXMgQXR0YWNobWVudFBhcnQgb2JqZWN0IGFzIGFuIElucHV0U3RyZWFtIGFzIGlmIGEgY2FsbCBoYWQgYmVlbiBtYWRlCi0gICAgICogdG8gZ2V0Q29udGVudCBhbmQgbm8gRGF0YUNvbnRlbnRIYW5kbGVyIGhhZCBiZWVuIHJlZ2lzdGVyZWQgZm9yIHRoZSBjb250ZW50LXR5cGUgb2YgdGhpcwotICAgICAqIEF0dGFjaG1lbnRQYXJ0Lk5vdGUgdGhhdCByZWFkaW5nIGZyb20gdGhlIHJldHVybmVkIElucHV0U3RyZWFtIHdvdWxkIHJlc3VsdCBpbiBjb25zdW1pbmcgdGhlCi0gICAgICogZGF0YSBpbiB0aGUgc3RyZWFtLiBJdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIGNhbGxlciB0byByZXNldCB0aGUgSW5wdXRTdHJlYW0KLSAgICAgKiBhcHByb3ByaWF0ZWx5IGJlZm9yZSBjYWxsaW5nIGEgU3Vic2VxdWVudCBBUEkuIElmIGEgY29weSBvZiB0aGUgcmF3IGF0dGFjaG1lbnQgY29udGVudCBpcwotICAgICAqIHJlcXVpcmVkIHRoZW4gdGhlIGdldFJhd0NvbnRlbnRCeXRlcygpIEFQSSBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkLgotICAgICAqCi0gICAgICogQHJldHVybiBhbiBJbnB1dFN0cmVhbSBmcm9tIHdoaWNoIHRoZSByYXcgZGF0YSBjb250YWluZWQgYnkgdGhlIEF0dGFjaG1lbnRQYXJ0IGNhbiBiZQotICAgICAqICAgICAgICAgYWNjZXNzZWQuCi0gICAgICogQHRocm93cyBTT0FQRXhjZXB0aW9uIC0gaWYgdGhlcmUgaXMgbm8gY29udGVudCBzZXQgaW50byB0aGlzIEF0dGFjaG1lbnRQYXJ0IG9iamVjdCBvciBpZgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICB0aGVyZSB3YXMgYSBkYXRhIHRyYW5zZm9ybWF0aW9uIGVycm9yLgotICAgICAqIEBzaW5jZSBTQUFKIDEuMwotICAgICAqLwotICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRSYXdDb250ZW50KCkgdGhyb3dzIFNPQVBFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKGRhdGFIYW5kbGVyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU09BUEV4Y2VwdGlvbigiTm8gY29udGVudCBzZXQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBkYXRhSGFuZGxlci5nZXRJbnB1dFN0cmVhbSgpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU09BUEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGNvbnRlbnQgb2YgdGhpcyBBdHRhY2htZW50UGFydCBvYmplY3QgYXMgYSBieXRlW10gYXJyYXkgYXMgaWYgYSBjYWxsIGhhZCBiZWVuIG1hZGUKLSAgICAgKiB0byBnZXRDb250ZW50IGFuZCBubyBEYXRhQ29udGVudEhhbmRsZXIgaGFkIGJlZW4gcmVnaXN0ZXJlZCBmb3IgdGhlIGNvbnRlbnQtdHlwZSBvZiB0aGlzCi0gICAgICogQXR0YWNobWVudFBhcnQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGEgYnl0ZVtdIGFycmF5IGNvbnRhaW5pbmcgdGhlIHJhdyBkYXRhIG9mIHRoZSBBdHRhY2htZW50UGFydC4KLSAgICAgKiBAdGhyb3dzIFNPQVBFeGNlcHRpb24gLSBpZiB0aGVyZSBpcyBubyBjb250ZW50IHNldCBpbnRvIHRoaXMgQXR0YWNobWVudFBhcnQgb2JqZWN0IG9yIGlmCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgIHRoZXJlIHdhcyBhIGRhdGEgdHJhbnNmb3JtYXRpb24gZXJyb3IuCi0gICAgICogQHNpbmNlIFNBQUogMS4zCi0gICAgICovCi0gICAgcHVibGljIGJ5dGVbXSBnZXRSYXdDb250ZW50Qnl0ZXMoKSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChkYXRhSGFuZGxlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU09BUEV4Y2VwdGlvbigiQ29udGVudCBpcyBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBkYXRhSGFuZGxlci53cml0ZVRvKGJvdXQpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTT0FQRXhjZXB0aW9uKGV4KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYm91dC50b0J5dGVBcnJheSgpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgY29udGVudCBvZiB0aGlzIGF0dGFjaG1lbnQgcGFydCBmcm9tIHRoZSBCYXNlNjQgc291cmNlIElucHV0U3RyZWFtIGFuZCBzZXRzIHRoZQotICAgICAqIHZhbHVlIG9mIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyIHRvIHRoZSB2YWx1ZSBjb250YWluZWQgaW4gY29udGVudFR5cGUsIFRoaXMgbWV0aG9kIHdvdWxkCi0gICAgICogZmlyc3QgZGVjb2RlIHRoZSBiYXNlNjQgaW5wdXQgYW5kIHdyaXRlIHRoZSByZXN1bHRpbmcgcmF3IGJ5dGVzIHRvIHRoZSBhdHRhY2htZW50LiBBCi0gICAgICogc3Vic2VxdWVudCBjYWxsIHRvIGdldFNpemUoKSBtYXkgbm90IGJlIGFuIGV4YWN0IG1lYXN1cmUgb2YgdGhlIGNvbnRlbnQgc2l6ZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb250ZW50IC0gdGhlIGJhc2U2NCBlbmNvZGVkIGRhdGEgdG8gYWRkIHRvIHRoZSBhdHRhY2htZW50IHBhcnQgY29udGVudFR5cGUgLSB0aGUKLSAgICAgKiAgICAgICAgICAgICAgICB2YWx1ZSB0byBzZXQgaW50byB0aGUgQ29udGVudC1UeXBlIGhlYWRlcgotICAgICAqIEB0aHJvd3MgU09BUEV4Y2VwdGlvbiAtIGlmIHRoZXJlIGlzIGFuIGVycm9yIGluIHNldHRpbmcgdGhlIGNvbnRlbnQgamF2YS5sYW5nLk51bGxQb2ludGVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgIC0gaWYgY29udGVudCBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0QmFzZTY0Q29udGVudChJbnB1dFN0cmVhbSBjb250ZW50LCBTdHJpbmcgY29udGVudFR5cGUpIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGNvbnRlbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNPQVBFeGNlcHRpb24oIkNvbnRlbnQgaXMgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVsxMDI0XTsKLSAgICAgICAgaW50IHJlYWQ7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB3aGlsZSAoKHJlYWQgPSBjb250ZW50LnJlYWQoYnVmZmVyLCAwLCBidWZmZXIubGVuZ3RoKSkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtLndyaXRlKGJ1ZmZlciwgMCwgcmVhZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTdHJpbmcgY29udGVudFN0cmluZyA9IG91dHB1dFN0cmVhbS50b1N0cmluZygpOwotICAgICAgICAgICAgaWYgKEJhc2U2NC5pc1ZhbGlkQmFzZTY0RW5jb2RpbmcoY29udGVudFN0cmluZykpIHsKLSAgICAgICAgICAgICAgICBzZXRDb250ZW50KEJhc2U2NC5kZWNvZGUoY29udGVudFN0cmluZyksIGNvbnRlbnRUeXBlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNPQVBFeGNlcHRpb24oIk5vdCBhIHZhbGlkIEJhc2U2NCBlbmNvZGluZyIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNPQVBFeGNlcHRpb24oZXgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgY29udGVudCBvZiB0aGlzIGF0dGFjaG1lbnQgcGFydCB0byB0aGF0IGNvbnRhaW5lZCBieSB0aGUgSW5wdXRTdHJlYW0gY29udGVudCBhbmQKLSAgICAgKiBzZXRzIHRoZSB2YWx1ZSBvZiB0aGUgQ29udGVudC1UeXBlIGhlYWRlciB0byB0aGUgdmFsdWUgY29udGFpbmVkIGluIGNvbnRlbnRUeXBlLkEgc3Vic2VxdWVudAotICAgICAqIGNhbGwgdG8gZ2V0U2l6ZSgpIG1heSBub3QgYmUgYW4gZXhhY3QgbWVhc3VyZSBvZiB0aGUgY29udGVudCBzaXplLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbnRlbnQgLSB0aGUgcmF3IGRhdGEgdG8gYWRkIHRvIHRoZSBhdHRhY2htZW50IHBhcnQgY29udGVudFR5cGUgLSB0aGUgdmFsdWUgdG8gc2V0Ci0gICAgICogICAgICAgICAgICAgICAgaW50byB0aGUgQ29udGVudC1UeXBlIGhlYWRlcgotICAgICAqIEB0aHJvd3MgU09BUEV4Y2VwdGlvbiAtIGlmIHRoZXJlIGlzIGFuIGVycm9yIGluIHNldHRpbmcgdGhlIGNvbnRlbnQgamF2YS5sYW5nLk51bGxQb2ludGVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgIC0gaWYgY29udGVudCBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UmF3Q29udGVudChJbnB1dFN0cmVhbSBjb250ZW50LCBTdHJpbmcgY29udGVudFR5cGUpIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGNvbnRlbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNPQVBFeGNlcHRpb24oImNvbnRlbnQgaXMgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIHNldENvbnRlbnQoY29udGVudCwgY29udGVudFR5cGUpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgY29udGVudCBvZiB0aGlzIGF0dGFjaG1lbnQgcGFydCB0byB0aGF0IGNvbnRhaW5lZCBieSB0aGUgYnl0ZVtdIGFycmF5IGNvbnRlbnQgYW5kCi0gICAgICogc2V0cyB0aGUgdmFsdWUgb2YgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXIgdG8gdGhlIHZhbHVlIGNvbnRhaW5lZCBpbiBjb250ZW50VHlwZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb250ZW50IC0gdGhlIHJhdyBkYXRhIHRvIGFkZCB0byB0aGUgYXR0YWNobWVudCBwYXJ0IGNvbnRlbnRUeXBlIC0gdGhlIHZhbHVlIHRvIHNldAotICAgICAqICAgICAgICAgICAgICAgIGludG8gdGhlIENvbnRlbnQtVHlwZSBoZWFkZXIgb2Zmc2V0IC0gdGhlIG9mZnNldCBpbiB0aGUgYnl0ZSBhcnJheSBvZiB0aGUKLSAgICAgKiAgICAgICAgICAgICAgICBjb250ZW50IGxlbiAtIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBmb3JtIHRoZSBjb250ZW50Ci0gICAgICogQHRocm93cyBTT0FQRXhjZXB0aW9uIC0gaWYgYW4gdGhlcmUgaXMgYW4gZXJyb3IgaW4gc2V0dGluZyB0aGUgY29udGVudCBvciBjb250ZW50IGlzIG51bGwKLSAgICAgKiBAc2luY2UgU0FBSiAxLjMKLSAgICAgKi8KLQotICAgIHB1YmxpYyB2b2lkIHNldFJhd0NvbnRlbnRCeXRlcyhieXRlW10gY29udGVudCwgaW50IG9mZnNldCwgaW50IGxlbiwgU3RyaW5nIGNvbnRlbnRUeXBlKQotICAgICAgICAgICAgdGhyb3dzIFNPQVBFeGNlcHRpb24gewotICAgICAgICAvL1RPRE8gLSBob3cgdG8gdXNlIG9mZnNldCAmIGxlbj8KLSAgICAgICAgaWYgKGNvbnRlbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNPQVBFeGNlcHRpb24oIkNvbnRlbnQgaXMgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIHNldENvbnRlbnQoY29udGVudCwgY29udGVudFR5cGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHJpZXZlIHRoZSBPTVRleHQKLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIE9NVGV4dAotICAgICAqIEB0aHJvd3MgU09BUEV4Y2VwdGlvbiBJZiBvbVRleHQgaXMgbm90IGF2YWlsYWJsZQotICAgICAqLwotICAgIHB1YmxpYyBPTVRleHQgZ2V0T01UZXh0KCkgdGhyb3dzIFNPQVBFeGNlcHRpb24gewotICAgICAgICBpZiAob21UZXh0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTT0FQRXhjZXB0aW9uKCJPTVRleHQgc2V0IHRvIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gb21UZXh0OwotICAgIH0KLQotICAgIHB1YmxpYyBUZXh0SW1wbCBnZXRUZXh0KERvY3VtZW50SW1wbCBkb2MpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBUZXh0SW1wbChkb2MsIG9tVGV4dC5nZXRUZXh0KCksIGRvYy5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBmaWxlbmFtZSBvZiB0aGlzIGF0dGFjaG1lbnQgcGFydC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXRoIHRoZSBuZXcgZmlsZSBwYXRoCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0QXR0YWNobWVudEZpbGUoU3RyaW5nIHBhdGgpIHsKLSAgICAgICAgYXR0YWNobWVudEZpbGUgPSBwYXRoOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERldGFjaCB0aGUgYXR0YWNobWVudCBmaWxlIGZyb20gdGhpcyBjbGFzcywgc28gaXQgaXMgbm90IGNsZWFuZWQgdXAuIFRoaXMgaGFzIHRoZSBzaWRlLWVmZmVjdAotICAgICAqIG9mIG1ha2luZyBzdWJzZXF1ZW50IGNhbGxzIHRvIGdldEF0dGFjaG1lbnRGaWxlKCkgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRldGFjaEF0dGFjaG1lbnRGaWxlKCkgewotICAgICAgICBhdHRhY2htZW50RmlsZSA9IG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBmaWxlbmFtZSBvZiB0aGlzIGF0dGFjaG1lbnQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBmaWxlbmFtZSBvciBudWxsIGZvciBhbiB1bmNhY2hlZCBmaWxlCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRBdHRhY2htZW50RmlsZSgpIHsKLSAgICAgICAgcmV0dXJuIGF0dGFjaG1lbnRGaWxlOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBleHRyYWN0RmlsZW5hbWUoU0FBSkRhdGFTb3VyY2Ugc291cmNlKSB7Ci0gICAgICAgIGlmIChzb3VyY2UuZ2V0RGlza0NhY2hlRmlsZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyBwYXRoID0gc291cmNlLmdldERpc2tDYWNoZUZpbGUoKS5nZXRBYnNvbHV0ZVBhdGgoKTsKLSAgICAgICAgICAgIHNldEF0dGFjaG1lbnRGaWxlKHBhdGgpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2Fhai9zcmMvb3JnL2FwYWNoZS9heGlzMi9zYWFqL0NvbW1lbnRJbXBsLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9zYWFqL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NhYWovQ29tbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRkMDA0YS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYWFqL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NhYWovQ29tbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2FhajsKLQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBFbGVtZW50OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlRleHQ7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5Db21tZW50OwotCi1wdWJsaWMgY2xhc3MgQ29tbWVudEltcGwgZXh0ZW5kcyBUZXh0SW1wbEV4IGltcGxlbWVudHMgQ29tbWVudCB7Ci0KLSAgICBwdWJsaWMgQ29tbWVudEltcGwoU3RyaW5nIGRhdGEsIFNPQVBFbGVtZW50IHBhcmVudCkgewotICAgICAgICBzdXBlcihkYXRhLCBwYXJlbnQpOwotICAgIH0KLQotICAgIHB1YmxpYyBDb21tZW50SW1wbChTdHJpbmcgZGF0YSwgU09BUEVsZW1lbnQgcGFyZW50LAotICAgICAgICAgICAgICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlIHByZXZTaWJsaW5nLCBvcmcudzNjLmRvbS5Ob2RlIG5leHRTaWJsaW5nKSB7Ci0gICAgICAgIHN1cGVyKGRhdGEsIHBhcmVudCwgcHJldlNpYmxpbmcsIG5leHRTaWJsaW5nKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0NvbW1lbnQoKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiI2NvbW1lbnQiOwotICAgIH0KLQotICAgIHB1YmxpYyBzaG9ydCBnZXROb2RlVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIFRleHQuQ09NTUVOVF9OT0RFOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhYWovc3JjL29yZy9hcGFjaGUvYXhpczIvc2Fhai9EZXRhaWxFbnRyeUltcGwuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhYWovc3JjL29yZy9hcGFjaGUvYXhpczIvc2Fhai9EZXRhaWxFbnRyeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODRkMWQwZC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYWFqL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NhYWovRGV0YWlsRW50cnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2FhajsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5kb20uRWxlbWVudEltcGw7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLkRldGFpbEVudHJ5OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBFbGVtZW50OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi0vKioKLSAqIFRoZSBjb250ZW50IGZvciBhIERldGFpbCBvYmplY3QsIGdpdmluZyBkZXRhaWxzIGZvciBhIFNPQVBGYXVsdCBvYmplY3QuIEEgRGV0YWlsRW50cnkgb2JqZWN0LAotICogd2hpY2ggY2FycmllcyBpbmZvcm1hdGlvbiBhYm91dCBlcnJvcnMgcmVsYXRlZCB0byB0aGUgU09BUEJvZHkgIG9iamVjdCB0aGF0IGNvbnRhaW5zIGl0LCBpcwotICogYXBwbGljYXRpb24tc3BlY2lmaWMuCi0gKi8KLXB1YmxpYyBjbGFzcyBEZXRhaWxFbnRyeUltcGwgZXh0ZW5kcyBTT0FQRWxlbWVudEltcGwgaW1wbGVtZW50cyBEZXRhaWxFbnRyeSB7Ci0KLSAgICAvKiogQHBhcmFtIGVsZW1lbnQgICovCi0gICAgcHVibGljIERldGFpbEVudHJ5SW1wbChFbGVtZW50SW1wbCBlbGVtZW50KSB7Ci0gICAgICAgIHN1cGVyKGVsZW1lbnQpOwotICAgIH0KLQotICAgIHB1YmxpYyBTT0FQRWxlbWVudCBhZGRBdHRyaWJ1dGUoUU5hbWUgcW5hbWUsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIFNPQVBFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gc3VwZXIuYWRkQXR0cmlidXRlKHFuYW1lLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFNPQVBFbGVtZW50IGFkZENoaWxkRWxlbWVudChRTmFtZSBxbmFtZSkgdGhyb3dzIFNPQVBFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gc3VwZXIuYWRkQ2hpbGRFbGVtZW50KHFuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUU5hbWUgY3JlYXRlUU5hbWUoU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHByZWZpeCkgdGhyb3dzIFNPQVBFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gc3VwZXIuY3JlYXRlUU5hbWUobG9jYWxOYW1lLCBwcmVmaXgpOwotICAgIH0KLQotICAgIHB1YmxpYyBJdGVyYXRvciBnZXRBbGxBdHRyaWJ1dGVzQXNRTmFtZXMoKSB7Ci0gICAgICAgIHJldHVybiBzdXBlci5nZXRBbGxBdHRyaWJ1dGVzQXNRTmFtZXMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZVZhbHVlKFFOYW1lIHFuYW1lKSB7Ci0gICAgICAgIHJldHVybiBzdXBlci5nZXRBdHRyaWJ1dGVWYWx1ZShxbmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIEl0ZXJhdG9yIGdldENoaWxkRWxlbWVudHMoUU5hbWUgcW5hbWUpIHsKLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldENoaWxkRWxlbWVudHMocW5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBRTmFtZSBnZXRFbGVtZW50UU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBzdXBlci5nZXRFbGVtZW50UU5hbWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmVBdHRyaWJ1dGUoUU5hbWUgcW5hbWUpIHsKLSAgICAgICAgcmV0dXJuIHN1cGVyLnJlbW92ZUF0dHJpYnV0ZShxbmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFNPQVBFbGVtZW50IHNldEVsZW1lbnRRTmFtZShRTmFtZSBuZXdOYW1lKSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBzdXBlci5zZXRFbGVtZW50UU5hbWUobmV3TmFtZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2Fhai9zcmMvb3JnL2FwYWNoZS9heGlzMi9zYWFqL0RldGFpbEltcGwuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhYWovc3JjL29yZy9hcGFjaGUvYXhpczIvc2Fhai9EZXRhaWxJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyMDU1ZWYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2Fhai9zcmMvb3JnL2FwYWNoZS9heGlzMi9zYWFqL0RldGFpbEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2FhajsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5kb20uRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYXVsdERldGFpbDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuRGV0YWlsOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLkRldGFpbEVudHJ5OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLk5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotLyoqCi0gKiBBIGNvbnRhaW5lciBmb3IgPGNvZGU+RGV0YWlsRW50cnk8L2NvZGU+IG9iamVjdHMuIDxjb2RlPkRldGFpbEVudHJ5PC9jb2RlPiBvYmplY3RzIGdpdmUgZGV0YWlsZWQKLSAqIGVycm9yIGluZm9ybWF0aW9uIHRoYXQgaXMgYXBwbGljYXRpb24tc3BlY2lmaWMgYW5kIHJlbGF0ZWQgdG8gdGhlIDxjb2RlPlNPQVBCb2R5PC9jb2RlPiBvYmplY3QKLSAqIHRoYXQgY29udGFpbnMgaXQuCi0gKiA8cC8+Ci0gKiBBIDxjb2RlPkRldGFpbDwvY29kZT4gb2JqZWN0LCB3aGljaCBpcyBwYXJ0IG9mIGEgPGNvZGU+U09BUEZhdWx0PC9jb2RlPiBvYmplY3QsIGNhbiBiZSByZXRyaWV2ZWQKLSAqIHVzaW5nIHRoZSBtZXRob2QgPGNvZGU+U09BUEZhdWx0LmdldERldGFpbDwvY29kZT4uIFRoZSA8Y29kZT5EZXRhaWw8L2NvZGU+IGludGVyZmFjZSBwcm92aWRlcyB0d28KLSAqIG1ldGhvZHMuIE9uZSBjcmVhdGVzIGEgbmV3IDxjb2RlPkRldGFpbEVudHJ5PC9jb2RlPiBvYmplY3QgYW5kIGFsc28gYXV0b21hdGljYWxseSBhZGRzIGl0IHRvIHRoZQotICogPGNvZGU+RGV0YWlsPC9jb2RlPiBvYmplY3QuIFRoZSBzZWNvbmQgbWV0aG9kIGdldHMgYSBsaXN0IG9mIHRoZSA8Y29kZT5EZXRhaWxFbnRyeTwvY29kZT4gb2JqZWN0cwotICogY29udGFpbmVkIGluIGEgPGNvZGU+RGV0YWlsPC9jb2RlPiBvYmplY3QuCi0gKiA8cC8+Ci0gKiBUaGUgZm9sbG93aW5nIGNvZGUgZnJhZ21lbnQsIGluIHdoaWNoIDxpPnNmPC9pPiBpcyBhIDxjb2RlPlNPQVBGYXVsdDwvY29kZT4gb2JqZWN0LCBnZXRzIGl0cwotICogPGNvZGU+RGV0YWlsPC9jb2RlPiBvYmplY3QgKDxpPmQ8L2k+KSwgYWRkcyBhIG5ldyA8Y29kZT5EZXRhaWxFbnRyeTwvY29kZT4gb2JqZWN0IHRvIDxpPmQ8L2k+LAotICogYW5kIHRoZW4gZ2V0cyBhIGxpc3Qgb2YgYWxsIHRoZSA8Y29kZT5EZXRhaWxFbnRyeTwvY29kZT4gb2JqZWN0cyBpbiA8aT5kPC9pPi4gVGhlIGNvZGUgYWxzbwotICogY3JlYXRlcyBhIDxjb2RlPk5hbWU8L2NvZGU+IG9iamVjdCB0byBwYXNzIHRvIHRoZSBtZXRob2QgPGNvZGU+YWRkRGV0YWlsRW50cnk8L2NvZGU+LiBUaGUKLSAqIHZhcmlhYmxlIDxpPnNlPC9pPiwgdXNlZCB0byBjcmVhdGUgdGhlIDxjb2RlPk5hbWU8L2NvZGU+IG9iamVjdCwgaXMgYSA8Y29kZT5TT0FQRW52ZWxvcGU8L2NvZGU+Ci0gKiBvYmplY3QuIDxQUkU+IERldGFpbCBkID0gc2YuZ2V0RGV0YWlsKCk7IE5hbWUgbmFtZSA9IHNlLmNyZWF0ZU5hbWUoIkdldExhc3RUcmFkZVByaWNlIiwgIldPTUJBVCIsCi0gKiAiaHR0cDovL3d3dy53b21iYXQub3JnL3RyYWRlciIpOyBkLmFkZERldGFpbEVudHJ5KG5hbWUpOyBJdGVyYXRvciBpdCA9IGQuZ2V0RGV0YWlsRW50cmllcygpOwotICogPC9QUkU+Ci0gKi8KLXB1YmxpYyBjbGFzcyBEZXRhaWxJbXBsIGV4dGVuZHMgU09BUEZhdWx0RWxlbWVudEltcGwgaW1wbGVtZW50cyBEZXRhaWwgewotCi0vLyAgICBwcml2YXRlIFNPQVBGYXVsdERldGFpbCBmYXVsdERldGFpbDsKLQotICAgIC8qKiBAcGFyYW0gZWxlbWVudCAgKi8KLSAgICBwdWJsaWMgRGV0YWlsSW1wbChTT0FQRmF1bHREZXRhaWwgZWxlbWVudCkgewotICAgICAgICBzdXBlcigoRWxlbWVudEltcGwpZWxlbWVudCk7Ci0vLyAgICAgICAgZmF1bHREZXRhaWwgPSBlbGVtZW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RGV0YWlsRW50cnk8L2NvZGU+IG9iamVjdCB3aXRoIHRoZSBnaXZlbiBuYW1lIGFuZCBhZGRzIGl0IHRvIHRoaXMKLSAgICAgKiA8Y29kZT5EZXRhaWw8L2NvZGU+IG9iamVjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIGEgPGNvZGU+TmFtZTwvY29kZT4gb2JqZWN0IGlkZW50aWZ5aW5nIHRoZSBuZXcgPGNvZGU+RGV0YWlsRW50cnk8L2NvZGU+IG9iamVjdAotICAgICAqIEByZXR1cm4gRGV0YWlsRW50cnkuCi0gICAgICogQHRocm93cyBTT0FQRXhjZXB0aW9uIHRocm93biB3aGVuIHRoZXJlIGlzIGEgcHJvYmxlbSBpbiBhZGRpbmcgYSBEZXRhaWxFbnRyeSBvYmplY3QgdG8gdGhpcwotICAgICAqICAgICAgICAgICAgICAgICAgICAgICBEZXRhaWwgb2JqZWN0LgotICAgICAqLwotICAgIHB1YmxpYyBEZXRhaWxFbnRyeSBhZGREZXRhaWxFbnRyeShOYW1lIG5hbWUpIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLSAgICAgICAgU09BUEVsZW1lbnRJbXBsIGNoaWxkRWxlbWVudCA9IChTT0FQRWxlbWVudEltcGwpYWRkQ2hpbGRFbGVtZW50KG5hbWUpOwotICAgICAgICBEZXRhaWxFbnRyeUltcGwgZGV0YWlsRW50cnkgPSBuZXcgRGV0YWlsRW50cnlJbXBsKGNoaWxkRWxlbWVudC5lbGVtZW50KTsKLSAgICAgICAgY2hpbGRFbGVtZW50LmVsZW1lbnQuc2V0VXNlckRhdGEoU0FBSl9OT0RFLCBkZXRhaWxFbnRyeSwgbnVsbCk7Ci0gICAgICAgIHJldHVybiBkZXRhaWxFbnRyeTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGEgbGlzdCBvZiB0aGUgZGV0YWlsIGVudHJpZXMgaW4gdGhpcyA8Y29kZT5EZXRhaWw8L2NvZGU+IG9iamVjdC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYW4gPGNvZGU+SXRlcmF0b3I8L2NvZGU+IG9iamVjdCBvdmVyIHRoZSA8Y29kZT5EZXRhaWxFbnRyeTwvY29kZT4gb2JqZWN0cyBpbiB0aGlzCi0gICAgICogICAgICAgICA8Y29kZT5EZXRhaWw8L2NvZGU+IG9iamVjdAotICAgICAqLwotICAgIHB1YmxpYyBJdGVyYXRvciBnZXREZXRhaWxFbnRyaWVzKCkgewotICAgICAgICBmaW5hbCBJdGVyYXRvciBkZXRhaWxFbnRyaWVzSXRlciA9IGVsZW1lbnQuZ2V0Q2hpbGRFbGVtZW50cygpOwotICAgICAgICBDb2xsZWN0aW9uIGRldGFpbHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIHdoaWxlIChkZXRhaWxFbnRyaWVzSXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIGRldGFpbHMuYWRkKG5ldyBEZXRhaWxFbnRyeUltcGwoKEVsZW1lbnRJbXBsKWRldGFpbEVudHJpZXNJdGVyLm5leHQoKSkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBkZXRhaWxzLml0ZXJhdG9yKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBEZXRhaWxFbnRyeSBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBhbmQgYWRkcyBpdCB0byB0aGlzIERldGFpbCBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSAtIGEgTmFtZSBvYmplY3QgaWRlbnRpZnlpbmcgdGhlIG5ldyBEZXRhaWxFbnRyeSBvYmplY3QKLSAgICAgKiBAdGhyb3dzIFNPQVBFeGNlcHRpb24gLSB0aHJvd24gd2hlbiB0aGVyZSBpcyBhIHByb2JsZW0gaW4gYWRkaW5nIGEgRGV0YWlsRW50cnkgb2JqZWN0IHRvIHRoaXMKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgRGV0YWlsIG9iamVjdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgRGV0YWlsRW50cnkgYWRkRGV0YWlsRW50cnkoUU5hbWUgcW5hbWUpIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLSAgICAgICAgU09BUEVsZW1lbnRJbXBsIGNoaWxkRWxlbWVudCA9IChTT0FQRWxlbWVudEltcGwpYWRkQ2hpbGRFbGVtZW50KHFuYW1lKTsKLSAgICAgICAgRGV0YWlsRW50cnlJbXBsIGRldGFpbEVudHJ5ID0gbmV3IERldGFpbEVudHJ5SW1wbChjaGlsZEVsZW1lbnQuZWxlbWVudCk7Ci0gICAgICAgIGNoaWxkRWxlbWVudC5lbGVtZW50LnNldFVzZXJEYXRhKFNBQUpfTk9ERSwgZGV0YWlsRW50cnksIG51bGwpOwotICAgICAgICByZXR1cm4gZGV0YWlsRW50cnk7Ci0gICAgfQotCi0gICAgcHVibGljIFNPQVBFbGVtZW50IGFkZEF0dHJpYnV0ZShRTmFtZSBxbmFtZSwgU3RyaW5nIHZhbHVlKSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBzdXBlci5hZGRBdHRyaWJ1dGUocW5hbWUsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU09BUEVsZW1lbnQgYWRkQ2hpbGRFbGVtZW50KFFOYW1lIHFuYW1lKSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBzdXBlci5hZGRDaGlsZEVsZW1lbnQocW5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBRTmFtZSBjcmVhdGVRTmFtZShTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcHJlZml4KSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBzdXBlci5jcmVhdGVRTmFtZShsb2NhbE5hbWUsIHByZWZpeCk7Ci0gICAgfQotCi0gICAgcHVibGljIEl0ZXJhdG9yIGdldEFsbEF0dHJpYnV0ZXNBc1FOYW1lcygpIHsKLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldEFsbEF0dHJpYnV0ZXNBc1FOYW1lcygpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlVmFsdWUoUU5hbWUgcW5hbWUpIHsKLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldEF0dHJpYnV0ZVZhbHVlKHFuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSXRlcmF0b3IgZ2V0Q2hpbGRFbGVtZW50cyhRTmFtZSBxbmFtZSkgewotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0Q2hpbGRFbGVtZW50cyhxbmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFFOYW1lIGdldEVsZW1lbnRRTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldEVsZW1lbnRRTmFtZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZUF0dHJpYnV0ZShRTmFtZSBxbmFtZSkgewotICAgICAgICByZXR1cm4gc3VwZXIucmVtb3ZlQXR0cmlidXRlKHFuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU09BUEVsZW1lbnQgc2V0RWxlbWVudFFOYW1lKFFOYW1lIG5ld05hbWUpIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIHN1cGVyLnNldEVsZW1lbnRRTmFtZShuZXdOYW1lKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYWFqL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NhYWovTWVzc2FnZUZhY3RvcnlJbXBsLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9zYWFqL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NhYWovTWVzc2FnZUZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwYTRkYTYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2Fhai9zcmMvb3JnL2FwYWNoZS9heGlzMi9zYWFqL01lc3NhZ2VGYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zYWFqOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLmltcGwuZG9tLnNvYXAxMS5TT0FQMTFGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5pbXBsLmRvbS5zb2FwMTIuU09BUDEyRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLk1lc3NhZ2VGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLk1pbWVIZWFkZXJzOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBDb25zdGFudHM7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQTWVzc2FnZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLS8qKgotICogPFA+QSBmYWN0b3J5IGZvciBjcmVhdGluZyA8Q09ERT5TT0FQTWVzc2FnZTwvQ09ERT4gb2JqZWN0cy48L1A+Ci0gKiA8cC8+Ci0gKiA8UD5BIEpBWE0gY2xpZW50IHBlcmZvcm1zIHRoZSBmb2xsb3dpbmcgc3RlcHMgdG8gY3JlYXRlIGEgbWVzc2FnZS48L1A+Ci0gKiA8cC8+Ci0gKiA8VUw+IDxMST4gQ3JlYXRlcyBhIDxDT0RFPk1lc3NhZ2VGYWN0b3J5PC9DT0RFPiBvYmplY3QgZnJvbSBhIDxDT0RFPiBQcm92aWRlckNvbm5lY3Rpb248L0NPREU+Ci0gKiBvYmplY3QgKDxDT0RFPmNvbjwvQ09ERT4gaW4gdGhlIGZvbGxvd2luZyBsaW5lIG9mIGNvZGUpLiBUaGUgPENPREU+U3RyaW5nPC9DT0RFPiBwYXNzZWQgdG8gdGhlCi0gKiA8Q09ERT5jcmVhdGVNZXNzYWdlRmFjdG9yeTwvQ09ERT4gbWV0aG9kIGlzIHRoZSBuYW1lIG9mIG9mIGEgbWVzc2FnaW5nIHByb2ZpbGUsIHdoaWNoIG11c3QgYmUgdGhlCi0gKiBVUkwgZm9yIHRoZSBzY2hlbWEuIDxQUkU+IE1lc3NhZ2VGYWN0b3J5IG1mID0gY29uLmNyZWF0ZU1lc3NhZ2VGYWN0b3J5KHNjaGVtYVVSTCk7IDwvUFJFPiA8L0xJPgotICogPHAvPgotICogPExJPiBDYWxscyB0aGUgbWV0aG9kIDxDT0RFPmNyZWF0ZU1lc3NhZ2U8L0NPREU+IG9uIHRoZSA8Q09ERT4gTWVzc2FnZUZhY3Rvcnk8L0NPREU+IG9iamVjdC4gQWxsCi0gKiBtZXNzYWdlcyBwcm9kdWNlZCBieSB0aGlzIDxDT0RFPk1lc3NhZ2VGYWN0b3J5PC9DT0RFPiBvYmplY3Qgd2lsbCBoYXZlIHRoZSBoZWFkZXIgaW5mb3JtYXRpb24KLSAqIGFwcHJvcHJpYXRlIGZvciB0aGUgbWVzc2FnaW5nIHByb2ZpbGUgdGhhdCB3YXMgc3BlY2lmaWVkIHdoZW4gdGhlIDxDT0RFPk1lc3NhZ2VGYWN0b3J5PC9DT0RFPgotICogb2JqZWN0IHdhcyBjcmVhdGVkLiA8UFJFPiBTT0FQTWVzc2FnZSBtID0gbWYuY3JlYXRlTWVzc2FnZSgpOyA8L1BSRT4gPC9MST4gPC9VTD4gSXQgaXMgYWxzbwotICogcG9zc2libGUgdG8gY3JlYXRlIGEgPENPREU+TWVzc2FnZUZhY3Rvcnk8L0NPREU+IG9iamVjdCB1c2luZyB0aGUgbWV0aG9kCi0gKiA8Q09ERT5uZXdJbnN0YW5jZTwvQ09ERT4sIGFzIHNob3duIGluIHRoZSBmb2xsb3dpbmcgbGluZSBvZiBjb2RlLiA8UFJFPiBNZXNzYWdlRmFjdG9yeSBtZiA9Ci0gKiBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpOyA8L1BSRT4gQSBzdGFuZGFsb25lIGNsaWVudCAoYSBjbGllbnQgdGhhdCBpcyBub3QgcnVubmluZyBpbiBhCi0gKiBjb250YWluZXIpIGNhbiB1c2UgdGhlIDxDT0RFPm5ld0luc3RhbmNlPC9DT0RFPiBtZXRob2QgdG8gY3JlYXRlIGEgPENPREU+TWVzc2FnZUZhY3Rvcnk8L0NPREU+Ci0gKiBvYmplY3QuCi0gKiA8cC8+Ci0gKiA8UD5BbGwgPENPREU+TWVzc2FnZUZhY3Rvcnk8L0NPREU+IG9iamVjdHMsIHJlZ2FyZGxlc3Mgb2YgaG93IHRoZXkgYXJlIGNyZWF0ZWQsIHdpbGwgcHJvZHVjZQotICogPENPREU+U09BUE1lc3NhZ2U8L0NPREU+IG9iamVjdHMgdGhhdCBoYXZlIHRoZSBmb2xsb3dpbmcgZWxlbWVudHMgYnkgZGVmYXVsdDo8L1A+Ci0gKiA8cC8+Ci0gKiA8VUw+IDxMST5BIDxDT0RFPlNPQVBQYXJ0PC9DT0RFPiBvYmplY3Q8L0xJPgotICogPHAvPgotICogPExJPkEgPENPREU+U09BUEVudmVsb3BlPC9DT0RFPiBvYmplY3Q8L0xJPgotICogPHAvPgotICogPExJPkEgPENPREU+U09BUEJvZHk8L0NPREU+IG9iamVjdDwvTEk+Ci0gKiA8cC8+Ci0gKiA8TEk+QSA8Q09ERT5TT0FQSGVhZGVyPC9DT0RFPiBvYmplY3Q8L0xJPiA8L1VMPiBJZiBhIDxDT0RFPk1lc3NhZ2VGYWN0b3J5PC9DT0RFPiBvYmplY3Qgd2FzCi0gKiBjcmVhdGVkIHVzaW5nIGEgPENPREU+UHJvdmlkZXJDb25uZWN0aW9uPC9DT0RFPiBvYmplY3QsIHdoaWNoIG1lYW5zIHRoYXQgaXQgd2FzIGluaXRpYWxpemVkIHdpdGgKLSAqIGEgc3BlY2lmaWVkIHByb2ZpbGUsIGl0IHdpbGwgcHJvZHVjZSBtZXNzYWdlcyB0aGF0IGFsc28gY29tZSBwcmVwb3B1bGF0ZWQgd2l0aCBhZGRpdGlvbmFsIGVudHJpZXMKLSAqIGluIHRoZSA8Q09ERT5TT0FQSGVhZGVyPC9DT0RFPiBvYmplY3QgYW5kIHRoZSA8Q09ERT5TT0FQQm9keTwvQ09ERT4gb2JqZWN0LiBUaGUgY29udGVudCBvZiBhIG5ldwotICogPENPREU+U09BUE1lc3NhZ2U8L0NPREU+IG9iamVjdCBkZXBlbmRzIG9uIHdoaWNoIG9mIHRoZSB0d28gPENPREU+TWVzc2FnZUZhY3Rvcnk8L0NPREU+IG1ldGhvZHMKLSAqIGlzIHVzZWQgdG8gY3JlYXRlIGl0LgotICogPHAvPgotICogPFVMPiA8TEk+PENPREU+Y3JlYXRlTWVzc2FnZSgpPC9DT0RFPiAtLSBtZXNzYWdlIGhhcyBubyBjb250ZW50PEJSPiBUaGlzIGlzIHRoZSBtZXRob2QgY2xpZW50cwotICogd291bGQgbm9ybWFsbHkgdXNlIHRvIGNyZWF0ZSBhIHJlcXVlc3QgbWVzc2FnZS48L0xJPgotICogPHAvPgotICogPExJPjxDT0RFPmNyZWF0ZU1lc3NhZ2UoTWltZUhlYWRlcnMsIGphdmEuaW8uSW5wdXRTdHJlYW0pPC9DT0RFPiAtLSBtZXNzYWdlIGhhcyBjb250ZW50IGZyb20gdGhlCi0gKiA8Q09ERT5JbnB1dFN0cmVhbTwvQ09ERT4gb2JqZWN0IGFuZCBoZWFkZXJzIGZyb20gdGhlIDxDT0RFPiBNaW1lSGVhZGVyczwvQ09ERT4gb2JqZWN0PEJSPiBUaGlzCi0gKiBtZXRob2QgY2FuIGJlIHVzZWQgaW50ZXJuYWxseSBieSBhIHNlcnZpY2UgaW1wbGVtZW50YXRpb24gdG8gY3JlYXRlIGEgbWVzc2FnZSB0aGF0IGlzIGEgcmVzcG9uc2UKLSAqIHRvIGEgcmVxdWVzdC48L0xJPiA8L1VMPgotICovCi1wdWJsaWMgY2xhc3MgTWVzc2FnZUZhY3RvcnlJbXBsIGV4dGVuZHMgTWVzc2FnZUZhY3RvcnkgewotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBzb2FwVmVyc2lvbiA9IFNPQVBDb25zdGFudHMuU09BUF8xXzFfUFJPVE9DT0w7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IDxDT0RFPlNPQVBNZXNzYWdlPC9DT0RFPiBvYmplY3Qgd2l0aCB0aGUgZGVmYXVsdCA8Q09ERT5TT0FQUGFydDwvQ09ERT4sCi0gICAgICogPENPREU+U09BUEVudmVsb3BlPC9DT0RFPiwgPENPREU+U09BUEJvZHk8L0NPREU+LCBhbmQgPENPREU+U09BUEhlYWRlcjwvQ09ERT4gb2JqZWN0cy4KLSAgICAgKiBQcm9maWxlLXNwZWNpZmljIG1lc3NhZ2UgZmFjdG9yaWVzIGNhbiBjaG9vc2UgdG8gcHJlcG9wdWxhdGUgdGhlIDxDT0RFPlNPQVBNZXNzYWdlPC9DT0RFPgotICAgICAqIG9iamVjdCB3aXRoIHByb2ZpbGUtc3BlY2lmaWMgaGVhZGVycy4KLSAgICAgKiA8cC8+Ci0gICAgICogPFA+Q29udGVudCBjYW4gYmUgYWRkZWQgdG8gdGhpcyBtZXNzYWdlJ3MgPENPREU+IFNPQVBQYXJ0PC9DT0RFPiBvYmplY3QsIGFuZCB0aGUgbWVzc2FnZSBjYW4KLSAgICAgKiBiZSBzZW50ICJhcyBpcyIgd2hlbiBhIG1lc3NhZ2UgY29udGFpbmluZyBvbmx5IGEgU09BUCBwYXJ0IGlzIHN1ZmZpY2llbnQuIE90aGVyd2lzZSwgdGhlCi0gICAgICogPENPREU+U09BUE1lc3NhZ2U8L0NPREU+IG9iamVjdCBuZWVkcyB0byBjcmVhdGUgb25lIG9yIG1vcmUgPENPREU+QXR0YWNobWVudFBhcnQ8L0NPREU+Ci0gICAgICogb2JqZWN0cyBhbmQgYWRkIHRoZW0gdG8gaXRzZWxmLiBBbnkgY29udGVudCB0aGF0IGlzIG5vdCBpbiBYTUwgZm9ybWF0IG11c3QgYmUgaW4gYW4KLSAgICAgKiA8Q09ERT5BdHRhY2htZW50UGFydDwvQ09ERT4gb2JqZWN0LjwvUD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYSBuZXcgPENPREU+U09BUE1lc3NhZ2U8L0NPREU+IG9iamVjdAotICAgICAqIEB0aHJvd3MgU09BUEV4Y2VwdGlvbiBpZiBhIFNPQVAgZXJyb3Igb2NjdXJzIGphdmEubGFuZy5VbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiAtIGlmIHRoZQotICAgICAqICAgICAgICAgICAgICAgICAgICAgICBwcm90b2NvbCBvZiB0aGlzIE1lc3NhZ2VGYWN0b3J5IGluc3RhbmNlIGlzIERZTkFNSUNfU09BUF9QUk9UT0NPTAotICAgICAqLwotICAgIHB1YmxpYyBTT0FQTWVzc2FnZSBjcmVhdGVNZXNzYWdlKCkgdGhyb3dzIFNPQVBFeGNlcHRpb24gewotICAgICAgICBTT0FQRW52ZWxvcGVJbXBsIHNvYXBFbnZlbG9wZTsKLSAgICAgICAgaWYgKHNvYXBWZXJzaW9uLmVxdWFscyhTT0FQQ29uc3RhbnRzLlNPQVBfMV8yX1BST1RPQ09MKSkgewotICAgICAgICAgICAgc29hcEVudmVsb3BlID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IFNPQVBFbnZlbG9wZUltcGwoKG9yZy5hcGFjaGUuYXhpb20uc29hcC5pbXBsLmRvbS5TT0FQRW52ZWxvcGVJbXBsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTT0FQMTJGYWN0b3J5KCkuZ2V0RGVmYXVsdEVudmVsb3BlKCkpOwotICAgICAgICB9IGVsc2UgaWYgKHNvYXBWZXJzaW9uLmVxdWFscyhTT0FQQ29uc3RhbnRzLkRZTkFNSUNfU09BUF9QUk9UT0NPTCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY3JlYXRlTWVzc2FnZSgpIGlzIG5vdCBzdXBwb3J0ZWQgZm9yICIgKwotICAgICAgICAgICAgICAgICAgICAiRFlOQU1JQ19TT0FQX1BST1RPQ09MIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvL1NPQVAgMS4xCi0gICAgICAgICAgICBzb2FwRW52ZWxvcGUgPQotICAgICAgICAgICAgICAgICAgICBuZXcgU09BUEVudmVsb3BlSW1wbCgob3JnLmFwYWNoZS5heGlvbS5zb2FwLmltcGwuZG9tLlNPQVBFbnZlbG9wZUltcGwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFNPQVAxMUZhY3RvcnkoKS5nZXREZWZhdWx0RW52ZWxvcGUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgU09BUE1lc3NhZ2VJbXBsIHNvYXBNZXNzYWdlID0gbmV3IFNPQVBNZXNzYWdlSW1wbChzb2FwRW52ZWxvcGUpOwotICAgICAgICBzb2FwTWVzc2FnZS5zZXRTYXZlUmVxdWlyZWQoKTsKLSAgICAgICAgcmV0dXJuIHNvYXBNZXNzYWdlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEludGVybmFsaXplcyB0aGUgY29udGVudHMgb2YgdGhlIGdpdmVuIDxDT0RFPiBJbnB1dFN0cmVhbTwvQ09ERT4gb2JqZWN0IGludG8gYSBuZXcKLSAgICAgKiA8Q09ERT5TT0FQTWVzc2FnZTwvQ09ERT4gb2JqZWN0IGFuZCByZXR1cm5zIHRoZSA8Q09ERT5TT0FQTWVzc2FnZTwvQ09ERT4gb2JqZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIG1pbWVoZWFkZXJzIHRoZSB0cmFuc3BvcnQtc3BlY2lmaWMgaGVhZGVycyBwYXNzZWQgdG8gdGhlIG1lc3NhZ2UgaW4gYQotICAgICAqICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnQtaW5kZXBlbmRlbnQgZmFzaGlvbiBmb3IgY3JlYXRpb24gb2YgdGhlIG1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gaW5wdXRzdHJlYW0gdGhlIDxDT0RFPklucHV0U3RyZWFtPC9DT0RFPiBvYmplY3QgdGhhdCBjb250YWlucyB0aGUgZGF0YSBmb3IgYSBtZXNzYWdlCi0gICAgICogQHJldHVybiBhIG5ldyA8Q09ERT5TT0FQTWVzc2FnZTwvQ09ERT4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGRhdGEgZnJvbSB0aGUgZ2l2ZW4KLSAgICAgKiAgICAgICAgIDxDT0RFPklucHV0U3RyZWFtPC9DT0RFPiBvYmplY3QKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uICAgaWYgdGhlcmUgaXMgYSBwcm9ibGVtIGluIHJlYWRpbmcgZGF0YSBmcm9tIHRoZSBpbnB1dCBzdHJlYW0KLSAgICAgKiBAdGhyb3dzIFNPQVBFeGNlcHRpb24gaWYgdGhlIG1lc3NhZ2UgaXMgaW52YWxpZAotICAgICAqLwotICAgIHB1YmxpYyBTT0FQTWVzc2FnZSBjcmVhdGVNZXNzYWdlKE1pbWVIZWFkZXJzIG1pbWVoZWFkZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGlucHV0c3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24sIFNPQVBFeGNlcHRpb24gewotICAgICAgICBTT0FQTWVzc2FnZUltcGwgc29hcE1lc3NhZ2UgPSBuZXcgU09BUE1lc3NhZ2VJbXBsKGlucHV0c3RyZWFtLCBtaW1laGVhZGVycyk7Ci0gICAgICAgIHNvYXBNZXNzYWdlLnNldFNhdmVSZXF1aXJlZCgpOwotICAgICAgICByZXR1cm4gc29hcE1lc3NhZ2U7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U09BUFZlcnNpb24oU3RyaW5nIHNvYXBWZXJzaW9uKSB7Ci0gICAgICAgIHRoaXMuc29hcFZlcnNpb24gPSBzb2FwVmVyc2lvbjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYWFqL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NhYWovTWltZUhlYWRlcnNFeC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvc2Fhai9zcmMvb3JnL2FwYWNoZS9heGlzMi9zYWFqL01pbWVIZWFkZXJzRXguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFiNmIzOS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYWFqL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NhYWovTWltZUhlYWRlcnNFeC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNhYWo7Ci0KLWltcG9ydCBqYXZheC54bWwuc29hcC5NaW1lSGVhZGVyOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIE1pbWVIZWFkZXJzRXggZXh0ZW5kcyBqYXZheC54bWwuc29hcC5NaW1lSGVhZGVycyB7Ci0gICAgcHVibGljIE1pbWVIZWFkZXJzRXgoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIE1pbWVIZWFkZXJzRXgoamF2YXgueG1sLnNvYXAuTWltZUhlYWRlcnMgbWltZUhlYWRlcnMpIHsKLSAgICAgICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBtaW1lSGVhZGVycy5nZXRBbGxIZWFkZXJzKCk7Ci0gICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIE1pbWVIZWFkZXIgaGRyID0gKE1pbWVIZWFkZXIpaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgYWRkSGVhZGVyKGhkci5nZXROYW1lKCksIGhkci5nZXRWYWx1ZSgpKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhYWovc3JjL29yZy9hcGFjaGUvYXhpczIvc2Fhai9Ob2RlSW1wbEV4LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9zYWFqL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NhYWovTm9kZUltcGxFeC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjlkM2MwLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhYWovc3JjL29yZy9hcGFjaGUvYXhpczIvc2Fhai9Ob2RlSW1wbEV4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNhYWo7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQ29udGFpbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5vZGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmRvbS5FbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuZG9tLk5vZGVJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5pbXBsLmRvbS5TT0FQQm9keUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLmltcGwuZG9tLlNPQVBFbnZlbG9wZUltcGw7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5Db21tZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotaW1wb3J0IG9yZy53M2MuZG9tLlR5cGVJbmZvOwotCi1pbXBvcnQgamF2YXgueG1sLnNvYXAuTm9kZTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRXhjZXB0aW9uOwotCi0vKioKLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgYSBub2RlIChlbGVtZW50KSBpbiBhIERPTSByZXByZXNlbnRhdGlvbiBvZiBhbiBYTUwgZG9jdW1lbnQgdGhhdCBwcm92aWRlcwotICogc29tZSB0cmVlIG1hbmlwdWxhdGlvbiBtZXRob2RzLiBUaGlzIGludGVyZmFjZSBwcm92aWRlcyBtZXRob2RzIGZvciBnZXR0aW5nIHRoZSB2YWx1ZSBvZiBhIG5vZGUsCi0gKiBmb3IgZ2V0dGluZyBhbmQgc2V0dGluZyB0aGUgcGFyZW50IG9mIGEgbm9kZSwgYW5kIGZvciByZW1vdmluZyBhIG5vZGUuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBOb2RlSW1wbEV4IGV4dGVuZHMgTm9kZUltcGwgaW1wbGVtZW50cyBOb2RlIHsKLQotICAgIC8qKiBAcGFyYW0gZmFjdG9yeSAgKi8KLSAgICBwcm90ZWN0ZWQgTm9kZUltcGxFeChPTUZhY3RvcnkgZmFjdG9yeSkgewotICAgICAgICBzdXBlcihmYWN0b3J5KTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU09BUEVsZW1lbnQgcGFyZW50RWxlbWVudDsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFNBQUpfTk9ERSA9ICJzYWFqLm5vZGUiOwotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyB0aGlzIDxjb2RlPk5vZGU8L2NvZGU+IG9iamVjdCBmcm9tIHRoZSB0cmVlLiBPbmNlIHJlbW92ZWQsIHRoaXMgbm9kZSBjYW4gYmUgZ2FyYmFnZQotICAgICAqIGNvbGxlY3RlZCBpZiB0aGVyZSBhcmUgbm8gYXBwbGljYXRpb24gcmVmZXJlbmNlcyB0byBpdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkZXRhY2hOb2RlKCkgewotICAgICAgICB0aGlzLmRldGFjaCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBPTU5vZGUgZGV0YWNoKCkgewotICAgICAgICBwYXJlbnRFbGVtZW50ID0gbnVsbDsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyB0aGlzIDxjb2RlPk5vZGU8L2NvZGU+IG9iamVjdCBmcm9tIHRoZSB0cmVlLiBPbmNlIHJlbW92ZWQsIHRoaXMgbm9kZSBjYW4gYmUgZ2FyYmFnZQotICAgICAqIGNvbGxlY3RlZCBpZiB0aGVyZSBhcmUgbm8gYXBwbGljYXRpb24gcmVmZXJlbmNlcyB0byBpdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU09BUEVsZW1lbnQgZ2V0UGFyZW50RWxlbWVudCgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucGFyZW50RWxlbWVudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT01Db250YWluZXIgZ2V0UGFyZW50KCkgewotICAgICAgICByZXR1cm4gKE9NQ29udGFpbmVyKXRoaXMucGFyZW50RWxlbWVudDsKLSAgICB9Ci0KLSAgICAvKiBwdWJsaWMgT01Ob2RlIGdldE9NTm9kZSgpIHsKLSAgICAgICAgcmV0dXJuIG9tTm9kZTsKLSAgICB9Ki8KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHRoZSB2YWx1ZSBvZiB0aGUgaW1tZWRpYXRlIGNoaWxkIG9mIHRoaXMgPGNvZGU+Tm9kZTwvY29kZT4gb2JqZWN0IGlmIGEgY2hpbGQKLSAgICAgKiBleGlzdHMgYW5kIGl0cyB2YWx1IGUgaXMgdGV4dC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHdpdGggdGhlIHRleHQgb2YgdGhlIGltbWVkaWF0ZSBjaGlsZCBvZiB0aGlzIDxjb2RlPk5vZGU8L2NvZGU+Ci0gICAgICogICAgICAgICBvYmplY3QgaWYgKDEpIHRoZXJlIGlzIGEgY2hpbGQgYW5kICgyKSB0aGUgY2hpbGQgaXMgYSA8Y29kZT5UZXh0PC9jb2RlPiBvYmplY3Q7Ci0gICAgICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotICAgICAgICBpZiAodGhpcy5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXROb2RlVmFsdWUoKTsKLSAgICAgICAgfSBlbHNlIGlmICh0aGlzLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLSAgICAgICAgICAgIHJldHVybiAoKE5vZGVJbXBsRXgpKCgoT01FbGVtZW50KXRoaXMpLmdldEZpcnN0T01DaGlsZCgpKSkuZ2V0VmFsdWUoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBOb3RpZmllcyB0aGUgaW1wbGVtZW50YXRpb24gdGhhdCB0aGlzIDxjb2RlPk5vZGU8L2NvZGU+IG9iamVjdCBpcyBubyBsb25nZXIgYmVpbmcgdXNlZCBieSB0aGUKLSAgICAgKiBhcHBsaWNhdGlvbiBhbmQgdGhhdCB0aGUgaW1wbGVtZW50YXRpb24gaXMgZnJlZSB0byByZXVzZSB0aGlzIG9iamVjdCBmb3Igbm9kZXMgdGhhdCBtYXkgYmUKLSAgICAgKiBjcmVhdGVkIGxhdGVyLgotICAgICAqIDxwLz4KLSAgICAgKiBDYWxsaW5nIHRoZSBtZXRob2QgPGNvZGU+cmVjeWNsZU5vZGU8L2NvZGU+IGltcGxpZXMgdGhhdCB0aGUgbWV0aG9kIDxjb2RlPmRldGFjaE5vZGU8L2NvZGU+Ci0gICAgICogaGFzIGJlZW4gY2FsbGVkIHByZXZpb3VzbHkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVjeWNsZU5vZGUoKSB7Ci0gICAgICAgIC8vIE5vIGNvcnJlc3BvbmRpbmcgaW1wbGVtZW50YXRpb24gaW4gT00KLSAgICAgICAgLy8gVGhlcmUgaXMgbm8gaW1wbGVtZW50YXRpb24gaW4gQXhpcyAxLjIgYWxzbwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHBhcmVudCBvZiB0aGlzIDxjb2RlPk5vZGU8L2NvZGU+IG9iamVjdCB0byB0aGUgZ2l2ZW4gPGNvZGU+U09BUEVsZW1lbnQ8L2NvZGU+Ci0gICAgICogb2JqZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIHBhcmVudCB0aGUgPGNvZGU+U09BUEVsZW1lbnQ8L2NvZGU+IG9iamVjdCB0byBiZSBzZXQgYXMgdGhlIHBhcmVudCBvZiB0aGlzCi0gICAgICogICAgICAgICAgICAgICA8Y29kZT5Ob2RlPC9jb2RlPiBvYmplY3QKLSAgICAgKiBAdGhyb3dzIFNPQVBFeGNlcHRpb24gaWYgdGhlcmUgaXMgYSBwcm9ibGVtIGluIHNldHRpbmcgdGhlIHBhcmVudCB0byB0aGUgZ2l2ZW4gZWxlbWVudAotICAgICAqIEBzZWUgI2dldFBhcmVudEVsZW1lbnQoKSBnZXRQYXJlbnRFbGVtZW50KCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJlbnRFbGVtZW50KFNPQVBFbGVtZW50IHBhcmVudCkgdGhyb3dzIFNPQVBFeGNlcHRpb24gewotICAgICAgICB0aGlzLnBhcmVudEVsZW1lbnQgPSBwYXJlbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VHlwZShpbnQgbm9kZVR5cGUpIHRocm93cyBPTUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiVE9ETyIpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Tm9kZVR5cGUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVHlwZUluZm8gZ2V0U2NoZW1hVHlwZUluZm8oKSB7Ci0gICAgICAgIC8vIFRPRE8gLSBGaXhtZS4KLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJUT0RPIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SWRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIGJvb2xlYW4gaXNJZCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFRPRE8gLSBGaXhtZS4KLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJUT0RPIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SWRBdHRyaWJ1dGVOUyhTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgbG9jYWxOYW1lLCBib29sZWFuIGlzSWQpCi0gICAgICAgICAgICB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gVE9ETyAtIEZpeG1lLgotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlRPRE8iKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRJZEF0dHJpYnV0ZU5vZGUoQXR0ciBpZEF0dHIsIGJvb2xlYW4gaXNJZCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFRPRE8gLSBGaXhtZS4KLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJUT0RPIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgb3IgZXh0cmFjdHMgdGhlIFNBQUogbm9kZSBmcm9tIHRoZSBnaXZlbiBET00gTm9kZSAoZG9tTm9kZSkKLSAgICAgKgotICAgICAqIEBwYXJhbSBkb21Ob2RlCi0gICAgICogQHJldHVybiB0aGUgU0FBSiBOb2RlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGRvbU5vZGUKLSAgICAgKi8KLSAgICBqYXZheC54bWwuc29hcC5Ob2RlIHRvU0FBSk5vZGUob3JnLnczYy5kb20uTm9kZSBkb21Ob2RlKSB7Ci0gICAgICAgIHJldHVybiB0b1NBQUpOb2RlKGRvbU5vZGUsIHRoaXMpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyBvciBleHRyYWN0cyB0aGUgU0FBSiBub2RlIGZyb20gdGhlIGdpdmVuIERPTSBOb2RlIChkb21Ob2RlKQotICAgICAqCi0gICAgICogQHBhcmFtIGRvbU5vZGUKLSAgICAgKiBAcmV0dXJuIHRoZSBTQUFKIE5vZGUgY29ycmVzcG9uZGluZyB0byB0aGUgZG9tTm9kZQotICAgICAqLwotICAgIHN0YXRpYyBqYXZheC54bWwuc29hcC5Ob2RlIHRvU0FBSk5vZGUob3JnLnczYy5kb20uTm9kZSBkb21Ob2RlLCBOb2RlIHBhcmVudE5vZGUpIHsKLSAgICAgICAgaWYgKGRvbU5vZGUgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgTm9kZSBzYWFqTm9kZSA9IChOb2RlKSgoTm9kZUltcGwpZG9tTm9kZSkuZ2V0VXNlckRhdGEoU0FBSl9OT0RFKTsKLSAgICAgICAgaWYgKHNhYWpOb2RlID09IG51bGwpIHsgIC8vIGlmIFNBQUogbm9kZSBoYXMgbm90IGJlZW4gc2V0IGluIHVzZXJEYXRhLCB0cnkgdG8gY29uc3RydWN0IGl0Ci0gICAgICAgICAgICByZXR1cm4gdG9TQUFKTm9kZTIoZG9tTm9kZSwgcGFyZW50Tm9kZSk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gdXBkYXRlIHNpYmxpbmdzIGZvciB0ZXh0IG5vZGVzCi0gICAgICAgIGlmIChkb21Ob2RlIGluc3RhbmNlb2Ygb3JnLnczYy5kb20uVGV4dCB8fCBkb21Ob2RlIGluc3RhbmNlb2Ygb3JnLnczYy5kb20uQ29tbWVudCkgewotICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZSBwcmV2U2libGluZ0RPTU5vZGUgPSBkb21Ob2RlLmdldFByZXZpb3VzU2libGluZygpOwotICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZSBuZXh0U2libGluZ0RPTU5vZGUgPSBkb21Ob2RlLmdldE5leHRTaWJsaW5nKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFRleHRJbXBsRXggc2FhalRleHROb2RlID0gKFRleHRJbXBsRXgpc2Fhak5vZGU7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHNhYWpUZXh0Tm9kZS5zZXRQcmV2aW91c1NpYmxpbmcocHJldlNpYmxpbmdET01Ob2RlKTsKLSAgICAgICAgICAgIHNhYWpUZXh0Tm9kZS5zZXROZXh0U2libGluZyhuZXh0U2libGluZ0RPTU5vZGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzYWFqTm9kZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBqYXZheC54bWwuc29hcC5Ob2RlIHRvU0FBSk5vZGUyKG9yZy53M2MuZG9tLk5vZGUgZG9tTm9kZSwgTm9kZSBwYXJlbnROb2RlKSB7Ci0gICAgICAgIGlmIChkb21Ob2RlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGlmIChkb21Ob2RlIGluc3RhbmNlb2Ygb3JnLnczYy5kb20uVGV4dCkgewotICAgICAgICAgICAgVGV4dCB0ZXh0ID0gKFRleHQpZG9tTm9kZTsKLSAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUgcHJldlNpYmxpbmdET01Ob2RlID0gdGV4dC5nZXRQcmV2aW91c1NpYmxpbmcoKTsKLSAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUgbmV4dFNpYmxpbmdET01Ob2RlID0gdGV4dC5nZXROZXh0U2libGluZygpOwotICAgICAgICAgICAgU09BUEVsZW1lbnRJbXBsIHBhcmVudCA9IG5ldyBTT0FQRWxlbWVudEltcGwoKEVsZW1lbnRJbXBsKWRvbU5vZGUuZ2V0UGFyZW50Tm9kZSgpKTsKLSAgICAgICAgICAgIFRleHRJbXBsRXggc2FhalRleHROb2RlID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IFRleHRJbXBsRXgodGV4dC5nZXREYXRhKCksIHBhcmVudCwgcHJldlNpYmxpbmdET01Ob2RlLCBuZXh0U2libGluZ0RPTU5vZGUpOwotICAgICAgICAgICAgKChOb2RlSW1wbClkb21Ob2RlKS5zZXRVc2VyRGF0YShTQUFKX05PREUsIHNhYWpUZXh0Tm9kZSwgbnVsbCk7Ci0gICAgICAgICAgICByZXR1cm4gc2FhalRleHROb2RlOwotICAgICAgICB9IGVsc2UgaWYgKGRvbU5vZGUgaW5zdGFuY2VvZiBvcmcudzNjLmRvbS5Db21tZW50KSB7Ci0gICAgICAgICAgICBDb21tZW50IGNvbW1lbnQgPSAoQ29tbWVudClkb21Ob2RlOwotICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZSBwcmV2U2libGluZ0RPTU5vZGUgPSBjb21tZW50LmdldFByZXZpb3VzU2libGluZygpOwotICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZSBuZXh0U2libGluZ0RPTU5vZGUgPSBjb21tZW50LmdldE5leHRTaWJsaW5nKCk7Ci0gICAgICAgICAgICBTT0FQRWxlbWVudEltcGwgcGFyZW50ID0gbmV3IFNPQVBFbGVtZW50SW1wbCgoRWxlbWVudEltcGwpZG9tTm9kZS5nZXRQYXJlbnROb2RlKCkpOwotICAgICAgICAgICAgQ29tbWVudEltcGwgc2FhalRleHROb2RlID0gbmV3IENvbW1lbnRJbXBsKGNvbW1lbnQuZ2V0RGF0YSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQsIHByZXZTaWJsaW5nRE9NTm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dFNpYmxpbmdET01Ob2RlKTsKLSAgICAgICAgICAgICgoTm9kZUltcGwpZG9tTm9kZSkuc2V0VXNlckRhdGEoU0FBSl9OT0RFLCBzYWFqVGV4dE5vZGUsIG51bGwpOwotICAgICAgICAgICAgcmV0dXJuIHNhYWpUZXh0Tm9kZTsKLSAgICAgICAgfSBlbHNlIGlmIChkb21Ob2RlIGluc3RhbmNlb2Ygb3JnLmFwYWNoZS5heGlvbS5zb2FwLmltcGwuZG9tLlNPQVBCb2R5SW1wbCkgewotICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5zb2FwLmltcGwuZG9tLlNPQVBCb2R5SW1wbCBkb29tU09BUEJvZHkgPSAoU09BUEJvZHlJbXBsKWRvbU5vZGU7Ci0gICAgICAgICAgICBqYXZheC54bWwuc29hcC5TT0FQQm9keSBzYWFqU09BUEJvZHkgPQotICAgICAgICAgICAgICAgICAgICBuZXcgb3JnLmFwYWNoZS5heGlzMi5zYWFqLlNPQVBCb2R5SW1wbChkb29tU09BUEJvZHkpOwotICAgICAgICAgICAgZG9vbVNPQVBCb2R5LnNldFVzZXJEYXRhKFNBQUpfTk9ERSwgc2FhalNPQVBCb2R5LCBudWxsKTsKLSAgICAgICAgICAgIHJldHVybiBzYWFqU09BUEJvZHk7Ci0gICAgICAgIH0gZWxzZSBpZiAoZG9tTm9kZSBpbnN0YW5jZW9mIG9yZy5hcGFjaGUuYXhpb20uc29hcC5pbXBsLmRvbS5TT0FQRW52ZWxvcGVJbXBsKSB7Ci0gICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuaW1wbC5kb20uU09BUEVudmVsb3BlSW1wbCBkb29tU09BUEVudgotICAgICAgICAgICAgICAgICAgICA9IChTT0FQRW52ZWxvcGVJbXBsKWRvbU5vZGU7Ci0gICAgICAgICAgICBqYXZheC54bWwuc29hcC5TT0FQRW52ZWxvcGUgc2FhakVudmVsb3BlCi0gICAgICAgICAgICAgICAgICAgID0gbmV3IG9yZy5hcGFjaGUuYXhpczIuc2Fhai5TT0FQRW52ZWxvcGVJbXBsKGRvb21TT0FQRW52KTsKLSAgICAgICAgICAgIGRvb21TT0FQRW52LnNldFVzZXJEYXRhKFNBQUpfTk9ERSwgc2FhakVudmVsb3BlLCBudWxsKTsKLSAgICAgICAgICAgIHJldHVybiBzYWFqRW52ZWxvcGU7Ci0gICAgICAgIH0gZWxzZSBpZiAoZG9tTm9kZSBpbnN0YW5jZW9mIG9yZy5hcGFjaGUuYXhpb20uc29hcC5pbXBsLmRvbS5TT0FQRmF1bHROb2RlSW1wbCkgewotICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5zb2FwLmltcGwuZG9tLlNPQVBGYXVsdE5vZGVJbXBsIGRvb21TT0FQRmF1bHROb2RlCi0gICAgICAgICAgICAgICAgICAgID0gKG9yZy5hcGFjaGUuYXhpb20uc29hcC5pbXBsLmRvbS5TT0FQRmF1bHROb2RlSW1wbClkb21Ob2RlOwotICAgICAgICAgICAgamF2YXgueG1sLnNvYXAuU09BUEZhdWx0RWxlbWVudCBzYWFqU09BUEZhdWx0RWxlCi0gICAgICAgICAgICAgICAgICAgID0gbmV3IG9yZy5hcGFjaGUuYXhpczIuc2Fhai5TT0FQRmF1bHRFbGVtZW50SW1wbChkb29tU09BUEZhdWx0Tm9kZSk7Ci0gICAgICAgICAgICBkb29tU09BUEZhdWx0Tm9kZS5zZXRVc2VyRGF0YShTQUFKX05PREUsIHNhYWpTT0FQRmF1bHRFbGUsIG51bGwpOwotICAgICAgICAgICAgcmV0dXJuIHNhYWpTT0FQRmF1bHRFbGU7Ci0gICAgICAgIH0gZWxzZSBpZiAoZG9tTm9kZSBpbnN0YW5jZW9mIG9yZy5hcGFjaGUuYXhpb20uc29hcC5pbXBsLmRvbS5TT0FQRmF1bHREZXRhaWxJbXBsKSB7Ci0gICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuaW1wbC5kb20uU09BUEZhdWx0RGV0YWlsSW1wbCBkb29tU09BUEZhdWx0RGV0YWlsCi0gICAgICAgICAgICAgICAgICAgID0gKG9yZy5hcGFjaGUuYXhpb20uc29hcC5pbXBsLmRvbS5TT0FQRmF1bHREZXRhaWxJbXBsKWRvbU5vZGU7Ci0gICAgICAgICAgICBqYXZheC54bWwuc29hcC5EZXRhaWwgc2FhakRldGFpbAotICAgICAgICAgICAgICAgICAgICA9IG5ldyBvcmcuYXBhY2hlLmF4aXMyLnNhYWouRGV0YWlsSW1wbChkb29tU09BUEZhdWx0RGV0YWlsKTsKLSAgICAgICAgICAgIGRvb21TT0FQRmF1bHREZXRhaWwuc2V0VXNlckRhdGEoU0FBSl9OT0RFLCBzYWFqRGV0YWlsLCBudWxsKTsKLSAgICAgICAgICAgIHJldHVybiBzYWFqRGV0YWlsOwotICAgICAgICB9IGVsc2UgaWYgKGRvbU5vZGUgaW5zdGFuY2VvZiBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuaW1wbC5kb20uU09BUEZhdWx0SW1wbCkgewotICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5zb2FwLmltcGwuZG9tLlNPQVBGYXVsdEltcGwgZG9vbVNPQVBGYXVsdAotICAgICAgICAgICAgICAgICAgICA9IChvcmcuYXBhY2hlLmF4aW9tLnNvYXAuaW1wbC5kb20uU09BUEZhdWx0SW1wbClkb21Ob2RlOwotICAgICAgICAgICAgamF2YXgueG1sLnNvYXAuU09BUEZhdWx0IHNhYWpTT0FQRmF1bHQKLSAgICAgICAgICAgICAgICAgICAgPSBuZXcgb3JnLmFwYWNoZS5heGlzMi5zYWFqLlNPQVBGYXVsdEltcGwoZG9vbVNPQVBGYXVsdCk7Ci0gICAgICAgICAgICBkb29tU09BUEZhdWx0LnNldFVzZXJEYXRhKFNBQUpfTk9ERSwgc2FhalNPQVBGYXVsdCwgbnVsbCk7Ci0gICAgICAgICAgICByZXR1cm4gc2FhalNPQVBGYXVsdDsKLSAgICAgICAgfSBlbHNlIGlmIChkb21Ob2RlIGluc3RhbmNlb2Ygb3JnLmFwYWNoZS5heGlvbS5zb2FwLmltcGwuZG9tLlNPQVBIZWFkZXJCbG9ja0ltcGwpIHsKLSAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20uc29hcC5pbXBsLmRvbS5TT0FQSGVhZGVyQmxvY2tJbXBsIGRvb21TT0FQSGVhZGVyQmxvY2sKLSAgICAgICAgICAgICAgICAgICAgPSAob3JnLmFwYWNoZS5heGlvbS5zb2FwLmltcGwuZG9tLlNPQVBIZWFkZXJCbG9ja0ltcGwpZG9tTm9kZTsKLSAgICAgICAgICAgIGphdmF4LnhtbC5zb2FwLlNPQVBIZWFkZXJFbGVtZW50IHNhYWpTT0FQSGVhZGVyRWxlCi0gICAgICAgICAgICAgICAgICAgID0gbmV3IG9yZy5hcGFjaGUuYXhpczIuc2Fhai5TT0FQSGVhZGVyRWxlbWVudEltcGwoZG9vbVNPQVBIZWFkZXJCbG9jayk7Ci0gICAgICAgICAgICBkb29tU09BUEhlYWRlckJsb2NrLnNldFVzZXJEYXRhKFNBQUpfTk9ERSwgc2FhalNPQVBIZWFkZXJFbGUsIG51bGwpOwotICAgICAgICAgICAgcmV0dXJuIHNhYWpTT0FQSGVhZGVyRWxlOwotICAgICAgICB9IGVsc2UgaWYgKGRvbU5vZGUgaW5zdGFuY2VvZiBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuaW1wbC5kb20uU09BUEhlYWRlckltcGwpIHsKLSAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20uc29hcC5pbXBsLmRvbS5TT0FQSGVhZGVySW1wbCBkb29tU09BUEhlYWRlcgotICAgICAgICAgICAgICAgICAgICA9IChvcmcuYXBhY2hlLmF4aW9tLnNvYXAuaW1wbC5kb20uU09BUEhlYWRlckltcGwpZG9tTm9kZTsKLSAgICAgICAgICAgIGphdmF4LnhtbC5zb2FwLlNPQVBIZWFkZXIgc2FhalNPQVBIZWFkZXIKLSAgICAgICAgICAgICAgICAgICAgPSBuZXcgb3JnLmFwYWNoZS5heGlzMi5zYWFqLlNPQVBIZWFkZXJJbXBsKGRvb21TT0FQSGVhZGVyKTsKLSAgICAgICAgICAgIGRvb21TT0FQSGVhZGVyLnNldFVzZXJEYXRhKFNBQUpfTk9ERSwgc2FhalNPQVBIZWFkZXIsIG51bGwpOwotICAgICAgICAgICAgcmV0dXJuIHNhYWpTT0FQSGVhZGVyOwotICAgICAgICB9IGVsc2UgaWYgKGRvbU5vZGUgaW5zdGFuY2VvZiBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuZG9tLkRvY3VtZW50SW1wbCkgewotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBNdXN0IGJlIGEgU09BUEVudmVsb3BlCi0gICAgICAgICAgICBpZiAoIShwYXJlbnROb2RlIGluc3RhbmNlb2Ygb3JnLmFwYWNoZS5heGlzMi5zYWFqLlNPQVBFbnZlbG9wZUltcGwpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuZG9tLkRvY3VtZW50SW1wbCBkb29tRG9jdW1lbnQKLSAgICAgICAgICAgICAgICA9IChvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuZG9tLkRvY3VtZW50SW1wbClkb21Ob2RlOwotICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5zYWFqLlNPQVBFbnZlbG9wZUltcGwgc2FhakVudiA9IAotICAgICAgICAgICAgICAgIChvcmcuYXBhY2hlLmF4aXMyLnNhYWouU09BUEVudmVsb3BlSW1wbCkgcGFyZW50Tm9kZTsKLSAgICAgICAgICAgIGphdmF4LnhtbC5zb2FwLlNPQVBQYXJ0IHNhYWpTT0FQUGFydCA9IG51bGw7Ci0gICAgICAgICAgICBpZiAoc2FhakVudi5nZXRTT0FQUGFydFBhcmVudCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyByZXR1cm4gZXhpc3RpbmcgU09BUFBhcnQKLSAgICAgICAgICAgICAgICBzYWFqU09BUFBhcnQgPSBzYWFqRW52LmdldFNPQVBQYXJ0UGFyZW50KCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBNZXNzYWdlIGFuZCBTT0FQUGFydAotICAgICAgICAgICAgICAgIFNPQVBNZXNzYWdlSW1wbCBzYWFqU09BUE1lc3NhZ2UgPSAKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTT0FQTWVzc2FnZUltcGwoc2FhakVudik7Ci0gICAgICAgICAgICAgICAgc2FhalNPQVBQYXJ0ID0gc2FhalNPQVBNZXNzYWdlLmdldFNPQVBQYXJ0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGRvbU5vZGUuc2V0VXNlckRhdGEoU0FBSl9OT0RFLCBzYWFqU09BUFBhcnQsIG51bGwpOwotICAgICAgICAgICAgcmV0dXJuIHNhYWpTT0FQUGFydDsKLSAgICAgICAgfSBlbHNlIHsgLy8gaW5zdGFuY2VvZiBvcmcuYXBhY2hlLmF4aXMyLm9tLmltcGwuZG9tLkVsZW1lbnRJbXBsCi0gICAgICAgICAgICBFbGVtZW50SW1wbCBkb29tRWxlbWVudCA9IChFbGVtZW50SW1wbClkb21Ob2RlOwotICAgICAgICAgICAgU09BUEVsZW1lbnRJbXBsIHNhYWpTT0FQRWxlbWVudCA9IG5ldyBTT0FQRWxlbWVudEltcGwoZG9vbUVsZW1lbnQpOwotICAgICAgICAgICAgZG9vbUVsZW1lbnQuc2V0VXNlckRhdGEoU0FBSl9OT0RFLCBzYWFqU09BUEVsZW1lbnQsIG51bGwpOwotICAgICAgICAgICAgcmV0dXJuIHNhYWpTT0FQRWxlbWVudDsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhYWovc3JjL29yZy9hcGFjaGUvYXhpczIvc2Fhai9Ob2RlTGlzdEltcGwuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhYWovc3JjL29yZy9hcGFjaGUvYXhpczIvc2Fhai9Ob2RlTGlzdEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVjZGJmYS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYWFqL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NhYWovTm9kZUxpc3RJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2FhajsKLQotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBUaGUgPGNvZGU+Tm9kZUxpc3Q8L2NvZGU+IGludGVyZmFjZSBwcm92aWRlcyB0aGUgYWJzdHJhY3Rpb24gb2YgYW4gb3JkZXJlZCBjb2xsZWN0aW9uIG9mIG5vZGVzLAotICogd2l0aG91dCBkZWZpbmluZyBvciBjb25zdHJhaW5pbmcgaG93IHRoaXMgY29sbGVjdGlvbiBpcyBpbXBsZW1lbnRlZC4gPGNvZGU+Tm9kZUxpc3Q8L2NvZGU+Ci0gKiBvYmplY3RzIGluIHRoZSBET00gYXJlIGxpdmUuIDxwPlRoZSBpdGVtcyBpbiB0aGUgPGNvZGU+Tm9kZUxpc3Q8L2NvZGU+IGFyZSBhY2Nlc3NpYmxlIHZpYSBhbgotICogaW50ZWdyYWwgaW5kZXgsIHN0YXJ0aW5nIGZyb20gMC4gPHA+U2VlIGFsc28gdGhlIDxhIGhyZWY9J2h0dHA6Ly93d3cudzMub3JnL1RSLzIwMDAvUkVDLURPTS1MZXZlbC0yLUNvcmUtMjAwMDExMTMnPkRvY3VtZW50Ci0gKiBPYmplY3QgTW9kZWwgKERPTSkgTGV2ZWwgMiBDb3JlIFNwZWNpZmljYXRpb248L2E+LgotICovCi1wdWJsaWMgY2xhc3MgTm9kZUxpc3RJbXBsIGltcGxlbWVudHMgTm9kZUxpc3QgewotCi0gICAgTGlzdCBtTm9kZXM7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE5vZGVMaXN0IEVNUFRZX05PREVMSVNUID0gbmV3IE5vZGVMaXN0SW1wbCgKLSAgICAgICAgICAgIENvbGxlY3Rpb25zLkVNUFRZX0xJU1QpOwotCi0gICAgLyoqIENvbnN0cnVjdG9yIGFuZCBTZXR0ZXIgaXMgaW50ZW5zaW9uYWxseSBtYWRlIHBhY2thZ2UgYWNjZXNzIG9ubHkuICovCi0gICAgTm9kZUxpc3RJbXBsKCkgewotICAgICAgICBtTm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgfQotCi0gICAgTm9kZUxpc3RJbXBsKExpc3Qgbm9kZXMpIHsKLSAgICAgICAgdGhpcygpOwotICAgICAgICBtTm9kZXMuYWRkQWxsKG5vZGVzKTsKLSAgICB9Ci0KLSAgICB2b2lkIGFkZE5vZGUob3JnLnczYy5kb20uTm9kZSBub2RlKSB7Ci0gICAgICAgIG1Ob2Rlcy5hZGQobm9kZSk7Ci0gICAgfQotCi0gICAgdm9pZCBhZGROb2RlTGlzdChvcmcudzNjLmRvbS5Ob2RlTGlzdCBub2RlcykgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLmdldExlbmd0aCgpOyBpKyspIHsKLSAgICAgICAgICAgIG1Ob2Rlcy5hZGQobm9kZXMuaXRlbShpKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSA8Y29kZT5pbmRleDwvY29kZT50aCBpdGVtIGluIHRoZSBjb2xsZWN0aW9uLiBJZiA8Y29kZT5pbmRleDwvY29kZT4gaXMgZ3JlYXRlcgotICAgICAqIHRoYW4gb3IgZXF1YWwgdG8gdGhlIG51bWJlciBvZiBub2RlcyBpbiB0aGUgbGlzdCwgdGhpcyByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqCi0gICAgICogQHBhcmFtIGluZGV4IEluZGV4IGludG8gdGhlIGNvbGxlY3Rpb24uCi0gICAgICogQHJldHVybiBUaGUgbm9kZSBhdCB0aGUgPGNvZGU+aW5kZXg8L2NvZGU+dGggcG9zaXRpb24gaW4gdGhlIDxjb2RlPk5vZGVMaXN0PC9jb2RlPiwgb3IKLSAgICAgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoYXQgaXMgbm90IGEgdmFsaWQgaW5kZXguCi0gICAgICovCi0gICAgcHVibGljIE5vZGUgaXRlbShpbnQgaW5kZXgpIHsKLSAgICAgICAgaWYgKG1Ob2RlcyAhPSBudWxsICYmIG1Ob2Rlcy5zaXplKCkgPiBpbmRleCkgewotICAgICAgICAgICAgcmV0dXJuIChOb2RlKW1Ob2Rlcy5nZXQoaW5kZXgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbnVtYmVyIG9mIG5vZGVzIGluIHRoZSBsaXN0LiBUaGUgcmFuZ2Ugb2YgdmFsaWQgY2hpbGQgbm9kZSBpbmRpY2VzIGlzIDAgdG8KLSAgICAgKiA8Y29kZT5sZW5ndGgtMTwvY29kZT4gaW5jbHVzaXZlLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotICAgICAgICByZXR1cm4gbU5vZGVzLnNpemUoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhYWovc3JjL29yZy9hcGFjaGUvYXhpczIvc2Fhai9QcmVmaXhlZFFOYW1lLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9zYWFqL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NhYWovUHJlZml4ZWRRTmFtZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDY5YWU1Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhYWovc3JjL29yZy9hcGFjaGUvYXhpczIvc2Fhai9QcmVmaXhlZFFOYW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNhYWo7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLk5hbWU7Ci0KLS8qKgotICogQ2xhc3MgUHJlZml4ZWQgUU5hbWUKLSAqIDxwLz4KLSAqIFRvb2sgdGhpcyBpbXBsZW1lbnRhdGlvbiBmcm9tIEF4aXMgMS4yIGNvZGUKLSAqLwotcHVibGljIGNsYXNzIFByZWZpeGVkUU5hbWUgaW1wbGVtZW50cyBOYW1lIHsKLSAgICAvKiogY29tbWVudC9zaGFyZWQgZW1wdHkgc3RyaW5nICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVNUFRZX1NUUklORyA9ICIiLmludGVybigpOwotCi0gICAgLyoqIEZpZWxkIHByZWZpeCAqLwotICAgIHByaXZhdGUgU3RyaW5nIHByZWZpeDsKLSAgICAvKiogRmllbGQgcU5hbWUgKi8KLSAgICBwcml2YXRlIFFOYW1lIHFOYW1lOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgUHJlZml4ZWRRTmFtZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB1cmkKLSAgICAgKiBAcGFyYW0gbG9jYWxOYW1lCi0gICAgICogQHBhcmFtIHByZWZpeAotICAgICAqLwotICAgIHB1YmxpYyBQcmVmaXhlZFFOYW1lKFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBwcmVmaXgpIHsKLSAgICAgICAgcU5hbWUgPSBuZXcgUU5hbWUodXJpLCBsb2NhbE5hbWUpOwotICAgICAgICB0aGlzLnByZWZpeCA9IChwcmVmaXggPT0gbnVsbCkKLSAgICAgICAgICAgICAgICA/IEVNUFRZX1NUUklORwotICAgICAgICAgICAgICAgIDogcHJlZml4LmludGVybigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIFByZWZpeGVkUU5hbWUKLSAgICAgKgotICAgICAqIEBwYXJhbSBxbmFtZQotICAgICAqLwotICAgIHB1YmxpYyBQcmVmaXhlZFFOYW1lKFFOYW1lIHFuYW1lKSB7Ci0gICAgICAgIHRoaXMucU5hbWUgPSBxbmFtZTsKLSAgICAgICAgdGhpcy5wcmVmaXggPSAocW5hbWUuZ2V0UHJlZml4KCkgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICA/IEVNUFRZX1NUUklORwotICAgICAgICAgICAgICAgIDogcW5hbWUuZ2V0UHJlZml4KCkuaW50ZXJuKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbG9jYWwgbmFtZSBwYXJ0IG9mIHRoZSBYTUwgbmFtZSB0aGF0IHRoaXMgPGNvZGU+TmFtZTwvY29kZT4gb2JqZWN0IHJlcHJlc2VudHMuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGxvY2FsIG5hbWUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRMb2NhbE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBxTmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBuYW1lc3BhY2UtcXVhbGlmaWVkIG5hbWUgb2YgdGhlIFhNTCBuYW1lIHRoYXQgdGhpcyA8Y29kZT5OYW1lPC9jb2RlPiBvYmplY3QKLSAgICAgKiByZXByZXNlbnRzLgotICAgICAqCi0gICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBuYW1lc3BhY2UtcXVhbGlmaWVkIG5hbWUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRRdWFsaWZpZWROYW1lKCkgewotICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcihwcmVmaXgpOwotICAgICAgICBpZiAoIXByZWZpeC5lcXVhbHMoRU1QVFlfU1RSSU5HKSkKLSAgICAgICAgICAgIGJ1Zi5hcHBlbmQoJzonKTsKLSAgICAgICAgYnVmLmFwcGVuZChxTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBVUkkgb2YgdGhlIG5hbWVzcGFjZSBmb3IgdGhlIFhNTCBuYW1lIHRoYXQgdGhpcyA8Y29kZT5OYW1lPC9jb2RlPiBvYmplY3QKLSAgICAgKiByZXByZXNlbnRzLgotICAgICAqCi0gICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBVUkkgYXMgYSBzdHJpbmcuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRVUkkoKSB7Ci0gICAgICAgIHJldHVybiBxTmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBwcmVmaXggYXNzb2NpYXRlZCB3aXRoIHRoZSBuYW1lc3BhY2UgZm9yIHRoZSBYTUwgbmFtZSB0aGF0IHRoaXMgPGNvZGU+TmFtZTwvY29kZT4KLSAgICAgKiBvYmplY3QgcmVwcmVzZW50cy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgcHJlZml4IGFzIGEgc3RyaW5nLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KCkgewotICAgICAgICByZXR1cm4gcHJlZml4OwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0gICAgICAgIGlmIChvYmogPT0gdGhpcykgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgUHJlZml4ZWRRTmFtZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIXFOYW1lLmVxdWFscygoKFByZWZpeGVkUU5hbWUpb2JqKS5xTmFtZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgLy9JcyB0aGlzIGNvcnJlY3Q/Ci0gICAgICAgIC8vcmV0dXJuIHByZWZpeC5lcXVhbHMoKChQcmVmaXhlZFFOYW1lKSBvYmopLnByZWZpeCk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICAgICAgcmV0dXJuIHByZWZpeC5oYXNoQ29kZSgpICsgcU5hbWUuaGFzaENvZGUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gcU5hbWUudG9TdHJpbmcoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYWFqL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NhYWovU0FBSk1ldGFGYWN0b3J5SW1wbC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvc2Fhai9zcmMvb3JnL2FwYWNoZS9heGlzMi9zYWFqL1NBQUpNZXRhRmFjdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhmNDhlOS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYWFqL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NhYWovU0FBSk1ldGFGYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNhYWo7Ci0KLWltcG9ydCBqYXZheC54bWwuc29hcC5NZXNzYWdlRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TQUFKTWV0YUZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUENvbnN0YW50czsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgU0FBSk1ldGFGYWN0b3J5SW1wbCBleHRlbmRzIFNBQUpNZXRhRmFjdG9yeSB7Ci0gICAgcHJvdGVjdGVkIE1lc3NhZ2VGYWN0b3J5IG5ld01lc3NhZ2VGYWN0b3J5KFN0cmluZyBzb2FwVmVyc2lvbikgdGhyb3dzIFNPQVBFeGNlcHRpb24gewotICAgICAgICBpZiAoIShTT0FQQ29uc3RhbnRzLlNPQVBfMV8xX1BST1RPQ09MLmVxdWFscyhzb2FwVmVyc2lvbikgfHwKLSAgICAgICAgICAgICAgICBTT0FQQ29uc3RhbnRzLlNPQVBfMV8yX1BST1RPQ09MLmVxdWFscyhzb2FwVmVyc2lvbikgfHwKLSAgICAgICAgICAgICAgICBTT0FQQ29uc3RhbnRzLkRZTkFNSUNfU09BUF9QUk9UT0NPTC5lcXVhbHMoc29hcFZlcnNpb24pKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNPQVBFeGNlcHRpb24oIkludmFsaWQgU09BUCBQcm90b2NvbCBWZXJzaW9uIik7Ci0gICAgICAgIH0KLSAgICAgICAgTWVzc2FnZUZhY3RvcnlJbXBsIGZhY3RvcnkgPSBuZXcgTWVzc2FnZUZhY3RvcnlJbXBsKCk7Ci0gICAgICAgIGZhY3Rvcnkuc2V0U09BUFZlcnNpb24oc29hcFZlcnNpb24pOwotICAgICAgICByZXR1cm4gZmFjdG9yeTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU09BUEZhY3RvcnkgbmV3U09BUEZhY3RvcnkoU3RyaW5nIHNvYXBWZXJzaW9uKSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghKFNPQVBDb25zdGFudHMuU09BUF8xXzFfUFJPVE9DT0wuZXF1YWxzKHNvYXBWZXJzaW9uKSB8fAotICAgICAgICAgICAgICAgIFNPQVBDb25zdGFudHMuU09BUF8xXzJfUFJPVE9DT0wuZXF1YWxzKHNvYXBWZXJzaW9uKSB8fAotICAgICAgICAgICAgICAgIFNPQVBDb25zdGFudHMuRFlOQU1JQ19TT0FQX1BST1RPQ09MLmVxdWFscyhzb2FwVmVyc2lvbikpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU09BUEV4Y2VwdGlvbigiSW52YWxpZCBTT0FQIFByb3RvY29sIFZlcnNpb24iKTsKLSAgICAgICAgfQotICAgICAgICBTT0FQRmFjdG9yeUltcGwgZmFjdG9yeSA9IG5ldyBTT0FQRmFjdG9yeUltcGwoKTsKLSAgICAgICAgZmFjdG9yeS5zZXRTT0FQVmVyc2lvbihzb2FwVmVyc2lvbik7Ci0gICAgICAgIHJldHVybiBmYWN0b3J5OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhYWovc3JjL29yZy9hcGFjaGUvYXhpczIvc2Fhai9TT0FQQm9keUVsZW1lbnRJbXBsLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9zYWFqL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NhYWovU09BUEJvZHlFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjc3ODI5Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhYWovc3JjL29yZy9hcGFjaGUvYXhpczIvc2Fhai9TT0FQQm9keUVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2FhajsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5kb20uRWxlbWVudEltcGw7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBCb2R5OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBCb2R5RWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIFNPQVBCb2R5RWxlbWVudEltcGwgZXh0ZW5kcyBTT0FQRWxlbWVudEltcGwgaW1wbGVtZW50cyBTT0FQQm9keUVsZW1lbnQgewotCi0gICAgLyoqIEBwYXJhbSBlbGVtZW50ICAqLwotICAgIHB1YmxpYyBTT0FQQm9keUVsZW1lbnRJbXBsKEVsZW1lbnRJbXBsIGVsZW1lbnQpIHsKLSAgICAgICAgc3VwZXIoZWxlbWVudCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGFyZW50RWxlbWVudChTT0FQRWxlbWVudCBwYXJlbnQpIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCEocGFyZW50IGluc3RhbmNlb2YgU09BUEJvZHkpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJQYXJlbnQgaXMgbm90IGEgU09BUEJvZHkiKTsKLSAgICAgICAgfQotICAgICAgICB0aGlzLnBhcmVudEVsZW1lbnQgPSBwYXJlbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIFNPQVBFbGVtZW50IGFkZEF0dHJpYnV0ZShRTmFtZSBxbmFtZSwgU3RyaW5nIHZhbHVlKSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBzdXBlci5hZGRBdHRyaWJ1dGUocW5hbWUsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU09BUEVsZW1lbnQgYWRkQ2hpbGRFbGVtZW50KFFOYW1lIHFuYW1lKSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBzdXBlci5hZGRDaGlsZEVsZW1lbnQocW5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBRTmFtZSBjcmVhdGVRTmFtZShTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcHJlZml4KSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBzdXBlci5jcmVhdGVRTmFtZShsb2NhbE5hbWUsIHByZWZpeCk7Ci0gICAgfQotCi0gICAgcHVibGljIEl0ZXJhdG9yIGdldEFsbEF0dHJpYnV0ZXNBc1FOYW1lcygpIHsKLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldEFsbEF0dHJpYnV0ZXNBc1FOYW1lcygpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlVmFsdWUoUU5hbWUgcW5hbWUpIHsKLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldEF0dHJpYnV0ZVZhbHVlKHFuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSXRlcmF0b3IgZ2V0Q2hpbGRFbGVtZW50cyhRTmFtZSBxbmFtZSkgewotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0Q2hpbGRFbGVtZW50cyhxbmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFFOYW1lIGdldEVsZW1lbnRRTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldEVsZW1lbnRRTmFtZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZUF0dHJpYnV0ZShRTmFtZSBxbmFtZSkgewotICAgICAgICByZXR1cm4gc3VwZXIucmVtb3ZlQXR0cmlidXRlKHFuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU09BUEVsZW1lbnQgc2V0RWxlbWVudFFOYW1lKFFOYW1lIG5ld05hbWUpIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIHN1cGVyLnNldEVsZW1lbnRRTmFtZShuZXdOYW1lKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYWFqL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NhYWovU09BUEJvZHlJbXBsLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9zYWFqL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NhYWovU09BUEJvZHlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2ZWQzZDAuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2Fhai9zcmMvb3JnL2FwYWNoZS9heGlzMi9zYWFqL1NPQVBCb2R5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zYWFqOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTm9kZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuZG9tLkRvY3VtZW50SW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuZG9tLkVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5kb20uTmFtZXNwYWNlSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuZG9tLk5vZGVJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuaW1wbC5kb20uc29hcDExLlNPQVAxMUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLmltcGwuZG9tLnNvYXAxMS5TT0FQMTFGYXVsdEltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLmltcGwuZG9tLnNvYXAxMi5TT0FQMTJGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5pbXBsLmRvbS5zb2FwMTIuU09BUDEyRmF1bHRJbXBsOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuTmFtZTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5Ob2RlOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBCb2R5OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBCb2R5RWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBGYXVsdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotCi1wdWJsaWMgY2xhc3MgU09BUEJvZHlJbXBsIGV4dGVuZHMgU09BUEVsZW1lbnRJbXBsIGltcGxlbWVudHMgU09BUEJvZHkgewotCi0gICAgcHJpdmF0ZSBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEJvZHkgb21TT0FQQm9keTsKLSAgICBwcml2YXRlIGJvb2xlYW4gaXNCb2R5RWxlbWVudEFkZGVkOwotCi0gICAgLyoqIEBwYXJhbSBvbVNPQVBCb2R5ICAqLwotICAgIHB1YmxpYyBTT0FQQm9keUltcGwob3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBCb2R5IG9tU09BUEJvZHkpIHsKLSAgICAgICAgc3VwZXIoKEVsZW1lbnRJbXBsKW9tU09BUEJvZHkpOwotICAgICAgICB0aGlzLm9tU09BUEJvZHkgPSBvbVNPQVBCb2R5OwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAqIEBzZWUgamF2YXgueG1sLnNvYXAuU09BUEVsZW1lbnQjYWRkQ2hpbGRFbGVtZW50KGphdmEubGFuZy5TdHJpbmcpCi0gICAgKi8KLSAgICBwdWJsaWMgU09BUEVsZW1lbnQgYWRkQ2hpbGRFbGVtZW50KFN0cmluZyBsb2NhbE5hbWUpIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKG9tU09BUEJvZHkuaGFzRmF1bHQoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNPQVBFeGNlcHRpb24oIkEgU09BUEZhdWx0IGhhcyBiZWVuIGFscmVhZHkgYWRkZWQgdG8gdGhpcyBTT0FQQm9keSIpOwotICAgICAgICB9Ci0gICAgICAgIFNPQVBCb2R5RWxlbWVudEltcGwgY2hpbGRFbGUgPQotICAgICAgICAgICAgICAgIG5ldyBTT0FQQm9keUVsZW1lbnRJbXBsKChFbGVtZW50SW1wbClnZXRPd25lckRvY3VtZW50KCkuY3JlYXRlRWxlbWVudChsb2NhbE5hbWUpKTsKLSAgICAgICAgY2hpbGRFbGUuZWxlbWVudC5zZXRVc2VyRGF0YShTQUFKX05PREUsIGNoaWxkRWxlLCBudWxsKTsKLSAgICAgICAgZWxlbWVudC5hcHBlbmRDaGlsZChjaGlsZEVsZS5lbGVtZW50KTsKLSAgICAgICAgKChOb2RlSW1wbCljaGlsZEVsZS5lbGVtZW50LmdldFBhcmVudE5vZGUoKSkuc2V0VXNlckRhdGEoU0FBSl9OT0RFLCB0aGlzLCBudWxsKTsKLSAgICAgICAgaXNCb2R5RWxlbWVudEFkZGVkID0gdHJ1ZTsKLSAgICAgICAgcmV0dXJuIGNoaWxkRWxlOwotICAgIH0KLQotICAgIHB1YmxpYyBTT0FQRWxlbWVudCBhZGRDaGlsZEVsZW1lbnQoU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHByZWZpeCkgdGhyb3dzIFNPQVBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgbmFtZXNwYWNlVVJJID0gZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCk7Ci0KLSAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU09BUEV4Y2VwdGlvbigiTmFtZXNwYWNlIG5vdCBkZWNsYXJlZCBmb3IgdGhlIGdpdmUgcHJlZml4OiAiICsgcHJlZml4KTsKLSAgICAgICAgfQotICAgICAgICBTT0FQQm9keUVsZW1lbnRJbXBsIGNoaWxkRWxlID0KLSAgICAgICAgICAgICAgICBuZXcgU09BUEJvZHlFbGVtZW50SW1wbCgKLSAgICAgICAgICAgICAgICAgICAgICAgIChFbGVtZW50SW1wbClnZXRPd25lckRvY3VtZW50KCkuY3JlYXRlRWxlbWVudE5TKG5hbWVzcGFjZVVSSSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsTmFtZSkpOwotICAgICAgICBjaGlsZEVsZS5lbGVtZW50LnNldFVzZXJEYXRhKFNBQUpfTk9ERSwgY2hpbGRFbGUsIG51bGwpOwotICAgICAgICBjaGlsZEVsZS5lbGVtZW50LnNldE5hbWVzcGFjZShjaGlsZEVsZS5lbGVtZW50LmRlY2xhcmVOYW1lc3BhY2UobmFtZXNwYWNlVVJJLCBwcmVmaXgpKTsKLSAgICAgICAgZWxlbWVudC5hcHBlbmRDaGlsZChjaGlsZEVsZS5lbGVtZW50KTsKLSAgICAgICAgKChOb2RlSW1wbCljaGlsZEVsZS5lbGVtZW50LmdldFBhcmVudE5vZGUoKSkuc2V0VXNlckRhdGEoU0FBSl9OT0RFLCB0aGlzLCBudWxsKTsKLSAgICAgICAgY2hpbGRFbGUuc2V0UGFyZW50RWxlbWVudCh0aGlzKTsKLSAgICAgICAgcmV0dXJuIGNoaWxkRWxlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBFbGVtZW50IGFwcGVuZEVsZW1lbnQoRWxlbWVudEltcGwgY2hpbGQpIHRocm93cyBTT0FQRXhjZXB0aW9uIHsgICAgCi0gICAgICAgIFN0cmluZyBuYW1lc3BhY2VVUkkgPSBjaGlsZC5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgU3RyaW5nIHByZWZpeCA9IGNoaWxkLmdldFByZWZpeCgpOwotCi0gICAgICAgIFNPQVBCb2R5RWxlbWVudEltcGwgY2hpbGRFbGUgPSBuZXcgU09BUEJvZHlFbGVtZW50SW1wbChjaGlsZCk7Ci0KLSAgICAgICAgY2hpbGRFbGUuZWxlbWVudC5zZXRVc2VyRGF0YShTQUFKX05PREUsIGNoaWxkRWxlLCBudWxsKTsKLSAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsICYmIG5hbWVzcGFjZVVSSS50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICBjaGlsZEVsZS5lbGVtZW50LnNldE5hbWVzcGFjZShjaGlsZEVsZS5lbGVtZW50LmRlY2xhcmVOYW1lc3BhY2UobmFtZXNwYWNlVVJJLCBwcmVmaXgpKTsKLSAgICAgICAgfQotICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxkKGNoaWxkRWxlLmVsZW1lbnQpOwotICAgICAgICAoKE5vZGVJbXBsKWNoaWxkRWxlLmVsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpKS5zZXRVc2VyRGF0YShTQUFKX05PREUsIHRoaXMsIG51bGwpOwotICAgICAgICBjaGlsZEVsZS5zZXRQYXJlbnRFbGVtZW50KHRoaXMpOwotICAgICAgICByZXR1cm4gY2hpbGRFbGU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTT0FQRWxlbWVudCBhZGRDaGlsZEVsZW1lbnQoU09BUEVsZW1lbnQgc29hcEVsZW1lbnQpIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIG5hbWVzcGFjZVVSSSA9IHNvYXBFbGVtZW50LmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICBTdHJpbmcgcHJlZml4ID0gc29hcEVsZW1lbnQuZ2V0UHJlZml4KCk7Ci0gICAgICAgIFN0cmluZyBsb2NhbE5hbWUgPSBzb2FwRWxlbWVudC5nZXRMb2NhbE5hbWUoKTsKLQotICAgICAgICBTT0FQQm9keUVsZW1lbnRJbXBsIGNoaWxkRWxlOwotICAgICAgICBpZiAobmFtZXNwYWNlVVJJID09IG51bGwgfHwgbmFtZXNwYWNlVVJJLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICBjaGlsZEVsZSA9Ci0gICAgICAgICAgICAgICAgbmV3IFNPQVBCb2R5RWxlbWVudEltcGwoCi0gICAgICAgICAgICAgICAgICAgICAgICAoRWxlbWVudEltcGwpZ2V0T3duZXJEb2N1bWVudCgpLmNyZWF0ZUVsZW1lbnQobG9jYWxOYW1lKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBlbGVtZW50LmRlY2xhcmVOYW1lc3BhY2UobmFtZXNwYWNlVVJJLCBwcmVmaXgpOwotICAgICAgICAgICAgY2hpbGRFbGUgPQotICAgICAgICAgICAgICAgIG5ldyBTT0FQQm9keUVsZW1lbnRJbXBsKAotICAgICAgICAgICAgICAgICAgICAgICAgKEVsZW1lbnRJbXBsKWdldE93bmVyRG9jdW1lbnQoKS5jcmVhdGVFbGVtZW50TlMobmFtZXNwYWNlVVJJLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxOYW1lKSk7ICAgICAgICAgICAgCi0gICAgICAgIH0KLQotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzb2FwRWxlbWVudC5nZXRBbGxBdHRyaWJ1dGVzKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgTmFtZSBuYW1lID0gKE5hbWUpaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBjaGlsZEVsZS5hZGRBdHRyaWJ1dGUobmFtZSwgc29hcEVsZW1lbnQuZ2V0QXR0cmlidXRlVmFsdWUobmFtZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gc29hcEVsZW1lbnQuZ2V0Q2hpbGRFbGVtZW50cygpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIE9iamVjdCBvID0gaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAobyBpbnN0YW5jZW9mIFRleHQpIHsKLSAgICAgICAgICAgICAgICBjaGlsZEVsZS5hZGRUZXh0Tm9kZSgoKFRleHQpbykuZ2V0RGF0YSgpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgY2hpbGRFbGUuYWRkQ2hpbGRFbGVtZW50KChTT0FQRWxlbWVudClvKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGNoaWxkRWxlLmVsZW1lbnQuc2V0VXNlckRhdGEoU0FBSl9OT0RFLCBjaGlsZEVsZSwgbnVsbCk7Ci0gICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCAmJiBuYW1lc3BhY2VVUkkudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgY2hpbGRFbGUuZWxlbWVudC5zZXROYW1lc3BhY2UoY2hpbGRFbGUuZWxlbWVudC5kZWNsYXJlTmFtZXNwYWNlKG5hbWVzcGFjZVVSSSwgcHJlZml4KSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxlbWVudC5hcHBlbmRDaGlsZChjaGlsZEVsZS5lbGVtZW50KTsKLSAgICAgICAgKChOb2RlSW1wbCljaGlsZEVsZS5lbGVtZW50LmdldFBhcmVudE5vZGUoKSkuc2V0VXNlckRhdGEoU0FBSl9OT0RFLCB0aGlzLCBudWxsKTsKLSAgICAgICAgY2hpbGRFbGUuc2V0UGFyZW50RWxlbWVudCh0aGlzKTsKLSAgICAgICAgcmV0dXJuIGNoaWxkRWxlOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAqIEBzZWUgamF2YXgueG1sLnNvYXAuU09BUEVsZW1lbnQjYWRkQ2hpbGRFbGVtZW50KGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0gICAgKi8KLSAgICBwdWJsaWMgU09BUEVsZW1lbnQgYWRkQ2hpbGRFbGVtZW50KFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBwcmVmaXgsIFN0cmluZyB1cmkpCi0gICAgICAgICAgICB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChvbVNPQVBCb2R5Lmhhc0ZhdWx0KCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTT0FQRXhjZXB0aW9uKCJBIFNPQVBGYXVsdCBoYXMgYmVlbiBhbHJlYWR5IGFkZGVkIHRvIHRoaXMgU09BUEJvZHkiKTsKLSAgICAgICAgfQotICAgICAgICBTT0FQQm9keUVsZW1lbnRJbXBsIGNoaWxkRWxlOwotICAgICAgICBpZiAodXJpID09IG51bGwgfHwgIiIuZXF1YWxzKHVyaSkpIHsKLSAgICAgICAgICAgIGNoaWxkRWxlID0gbmV3IFNPQVBCb2R5RWxlbWVudEltcGwoCi0gICAgICAgICAgICAgICAgICAgIChFbGVtZW50SW1wbClnZXRPd25lckRvY3VtZW50KCkuY3JlYXRlRWxlbWVudChsb2NhbE5hbWUpKTsKLSAgICAgICAgfSBlbHNlIGlmIChwcmVmaXggPT0gbnVsbCB8fCAiIi5lcXVhbHMocHJlZml4KSkgewotICAgICAgICAgICAgY2hpbGRFbGUgPSBuZXcgU09BUEJvZHlFbGVtZW50SW1wbCgKLSAgICAgICAgICAgICAgICAoRWxlbWVudEltcGwpZ2V0T3duZXJEb2N1bWVudCgpLmNyZWF0ZUVsZW1lbnROUyh1cmksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxOYW1lKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjaGlsZEVsZSA9IG5ldyBTT0FQQm9keUVsZW1lbnRJbXBsKAotICAgICAgICAgICAgICAgICAgICAoRWxlbWVudEltcGwpZ2V0T3duZXJEb2N1bWVudCgpLmNyZWF0ZUVsZW1lbnROUyh1cmksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCArICI6IiArIGxvY2FsTmFtZSkpOwotICAgICAgICB9Ci0gICAgICAgIGNoaWxkRWxlLmVsZW1lbnQuc2V0VXNlckRhdGEoU0FBSl9OT0RFLCBjaGlsZEVsZSwgbnVsbCk7Ci0gICAgICAgIGNoaWxkRWxlLmVsZW1lbnQuc2V0TmFtZXNwYWNlKGNoaWxkRWxlLmVsZW1lbnQuZGVjbGFyZU5hbWVzcGFjZSh1cmksIHByZWZpeCkpOwotICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxkKGNoaWxkRWxlLmVsZW1lbnQpOwotICAgICAgICAoKE5vZGVJbXBsKWNoaWxkRWxlLmVsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpKS5zZXRVc2VyRGF0YShTQUFKX05PREUsIHRoaXMsIG51bGwpOwotICAgICAgICBpc0JvZHlFbGVtZW50QWRkZWQgPSB0cnVlOwotICAgICAgICBjaGlsZEVsZS5zZXRQYXJlbnRFbGVtZW50KHRoaXMpOwotICAgICAgICByZXR1cm4gY2hpbGRFbGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5TT0FQRmF1bHQ8L2NvZGU+IG9iamVjdCBhbmQgYWRkcyBpdCB0byB0aGlzIDxjb2RlPlNPQVBCb2R5PC9jb2RlPgotICAgICAqIG9iamVjdC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIG5ldyA8Y29kZT5TT0FQRmF1bHQ8L2NvZGU+IG9iamVjdAotICAgICAqIEB0aHJvd3MgU09BUEV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIFNPQVAgZXJyb3IKLSAgICAgKi8KLSAgICBwdWJsaWMgU09BUEZhdWx0IGFkZEZhdWx0KCkgdGhyb3dzIFNPQVBFeGNlcHRpb24gewotICAgICAgICBpZiAoaXNCb2R5RWxlbWVudEFkZGVkKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU09BUEV4Y2VwdGlvbigiQSBTT0FQQm9keUVsZW1lbnQgaGFzIGJlZW4gYWxyZWFkeSBhZGRlZCB0byB0aGlzIFNPQVBCb2R5Iik7Ci0gICAgICAgIH0KLSAgICAgICAgU09BUEZhdWx0SW1wbCBzYWFqU09BUEZhdWx0ID0gbnVsbDsKLQotICAgICAgICBpZiAodGhpcy5lbGVtZW50LmdldE9NRmFjdG9yeSgpIGluc3RhbmNlb2YgU09BUDExRmFjdG9yeSkgewotICAgICAgICAgICAgU09BUDExRmF1bHRJbXBsIGZhdWx0ID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IFNPQVAxMUZhdWx0SW1wbChvbVNPQVBCb2R5LCAoU09BUEZhY3RvcnkpdGhpcy5lbGVtZW50LmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgICAgIHNhYWpTT0FQRmF1bHQgPSBuZXcgU09BUEZhdWx0SW1wbChmYXVsdCk7Ci0gICAgICAgIH0gZWxzZSBpZiAodGhpcy5lbGVtZW50LmdldE9NRmFjdG9yeSgpIGluc3RhbmNlb2YgU09BUDEyRmFjdG9yeSkgewotICAgICAgICAgICAgU09BUDEyRmF1bHRJbXBsIGZhdWx0ID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IFNPQVAxMkZhdWx0SW1wbChvbVNPQVBCb2R5LCAoU09BUEZhY3RvcnkpdGhpcy5lbGVtZW50LmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgICAgIHNhYWpTT0FQRmF1bHQgPSBuZXcgU09BUEZhdWx0SW1wbChmYXVsdCk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gc2V0IGRlZmF1bHQgZmF1bHQgY29kZSBhbmQgc3RyaW5nCi0gICAgICAgIHNhYWpTT0FQRmF1bHQuc2V0RGVmYXVsdHMoKTsKLSAgICAgICAgCi0gICAgICAgICgoTm9kZUltcGwpb21TT0FQQm9keS5nZXRGYXVsdCgpKS5zZXRVc2VyRGF0YShTQUFKX05PREUsIHNhYWpTT0FQRmF1bHQsIG51bGwpOwotICAgICAgICByZXR1cm4gc2FhalNPQVBGYXVsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciBhIDxjb2RlPlNPQVBGYXVsdDwvY29kZT4gb2JqZWN0IGV4aXN0cyBpbiB0aGlzIDxjb2RlPlNPQVBCb2R5PC9jb2RlPgotICAgICAqIG9iamVjdC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYSA8Y29kZT5TT0FQRmF1bHQ8L2NvZGU+IG9iamVjdCBleGlzdHMgaW4gdGhpcwotICAgICAqICAgICAgICAgPGNvZGU+U09BUEJvZHk8L2NvZGU+IG9iamVjdDsgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGhhc0ZhdWx0KCkgewotICAgICAgICByZXR1cm4gb21TT0FQQm9keS5oYXNGYXVsdCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIDxjb2RlPlNPQVBGYXVsdDwvY29kZT4gb2JqZWN0IGluIHRoaXMgPGNvZGU+U09BUEJvZHk8L2NvZGU+IG9iamVjdC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIDxjb2RlPlNPQVBGYXVsdDwvY29kZT4gb2JqZWN0IGluIHRoaXMgPGNvZGU+U09BUEJvZHk8L2NvZGU+IG9iamVjdAotICAgICAqLwotICAgIHB1YmxpYyBTT0FQRmF1bHQgZ2V0RmF1bHQoKSB7Ci0gICAgICAgIGlmIChvbVNPQVBCb2R5Lmhhc0ZhdWx0KCkpIHsKLSAgICAgICAgICAgIHJldHVybiAoU09BUEZhdWx0KXRvU0FBSk5vZGUoKG9yZy53M2MuZG9tLk5vZGUpb21TT0FQQm9keS5nZXRGYXVsdCgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlNPQVBCb2R5RWxlbWVudDwvY29kZT4gb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGFuZCBhZGRzIGl0IHRvIHRoaXMKLSAgICAgKiA8Y29kZT5TT0FQQm9keTwvY29kZT4gb2JqZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgYSA8Y29kZT5OYW1lPC9jb2RlPiBvYmplY3Qgd2l0aCB0aGUgbmFtZSBmb3IgdGhlIG5ldyA8Y29kZT5TT0FQQm9keUVsZW1lbnQ8L2NvZGU+Ci0gICAgICogICAgICAgICAgICAgb2JqZWN0Ci0gICAgICogQHJldHVybiB0aGUgbmV3IDxjb2RlPlNPQVBCb2R5RWxlbWVudDwvY29kZT4gb2JqZWN0Ci0gICAgICogQHRocm93cyBTT0FQRXhjZXB0aW9uIGlmIGEgU09BUCBlcnJvciBvY2N1cnMKLSAgICAgKi8KLSAgICBwdWJsaWMgU09BUEJvZHlFbGVtZW50IGFkZEJvZHlFbGVtZW50KE5hbWUgbmFtZSkgdGhyb3dzIFNPQVBFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gKFNPQVBCb2R5RWxlbWVudClhZGRDaGlsZEVsZW1lbnQobmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5TT0FQRmF1bHQ8L2NvZGU+IG9iamVjdCBhbmQgYWRkcyBpdCB0byB0aGlzIDxjb2RlPlNPQVBCb2R5PC9jb2RlPiBvYmplY3QuCi0gICAgICogVGhlIG5ldyA8Y29kZT5TT0FQRmF1bHQ8L2NvZGU+IHdpbGwgaGF2ZSBhIDxjb2RlPmZhdWx0Y29kZTwvY29kZT4gZWxlbWVudCB0aGF0IGlzIHNldCB0byB0aGUKLSAgICAgKiA8Y29kZT5mYXVsdENvZGU8L2NvZGU+IHBhcmFtZXRlciBhbmQgYSA8Y29kZT5mYXVsdHN0cmluZzwvY29kZT4gc2V0IHRvCi0gICAgICogPGNvZGU+ZmF1bHRzdHJpbmc8L2NvZGU+IGFuZCBsb2NhbGl6ZWQgdG8gPGNvZGU+bG9jYWxlPC9jb2RlPi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmYXVsdENvZGUgICBhIDxjb2RlPk5hbWU8L2NvZGU+IG9iamVjdCBnaXZpbmcgdGhlIGZhdWx0IGNvZGUgdG8gYmUgc2V0OyBtdXN0IGJlIG9uZSBvZgotICAgICAqICAgICAgICAgICAgICAgICAgICB0aGUgZmF1bHQgY29kZXMgZGVmaW5lZCBpbiB0aGUgU09BUCAxLjEgc3BlY2lmaWNhdGlvbiBhbmQgb2YgdHlwZSBRTmFtZQotICAgICAqIEBwYXJhbSBmYXVsdFN0cmluZyBhIDxjb2RlPlN0cmluZzwvY29kZT4gZ2l2aW5nIGFuIGV4cGxhbmF0aW9uIG9mIHRoZSBmYXVsdAotICAgICAqIEBwYXJhbSBsb2NhbGUgICAgICBhIDxjb2RlPkxvY2FsZTwvY29kZT4gb2JqZWN0IGluZGljYXRpbmcgdGhlIG5hdGl2ZSBsYW5ndWFnZSBvZiB0aGUKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgPG9jZGU+ZmF1bHRTdHJpbmc8L2NvZGU+Ci0gICAgICogQHJldHVybiB0aGUgbmV3IDxjb2RlPlNPQVBGYXVsdDwvY29kZT4gb2JqZWN0Ci0gICAgICogQHRocm93cyBTT0FQRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgU09BUCBlcnJvcgotICAgICAqLwotICAgIHB1YmxpYyBTT0FQRmF1bHQgYWRkRmF1bHQoTmFtZSBmYXVsdENvZGUsIFN0cmluZyBmYXVsdFN0cmluZywgTG9jYWxlIGxvY2FsZSkKLSAgICAgICAgICAgIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLSAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYXVsdCBmYXVsdDsKLSAgICAgICAgaWYgKHRoaXMuZWxlbWVudC5nZXRPTUZhY3RvcnkoKSBpbnN0YW5jZW9mIFNPQVAxMUZhY3RvcnkpIHsKLSAgICAgICAgICAgIGZhdWx0ID0gbmV3IFNPQVAxMUZhdWx0SW1wbChvbVNPQVBCb2R5LCBuZXcgRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICBmYXVsdFN0cmluZyksIChTT0FQRmFjdG9yeSl0aGlzLmVsZW1lbnQuZ2V0T01GYWN0b3J5KCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZmF1bHQgPSBuZXcgU09BUDEyRmF1bHRJbXBsKG9tU09BUEJvZHksIG5ldyBFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIGZhdWx0U3RyaW5nKSwgKFNPQVBGYWN0b3J5KXRoaXMuZWxlbWVudC5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgU09BUEZhdWx0SW1wbCBmYXVsdEltcGwgPSBuZXcgU09BUEZhdWx0SW1wbChmYXVsdCk7Ci0gICAgICAgIGZhdWx0SW1wbC5zZXRGYXVsdENvZGUoZmF1bHRDb2RlKTsKLQotICAgICAgICBpZiAobG9jYWxlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZhdWx0SW1wbC5zZXRGYXVsdFN0cmluZyhmYXVsdFN0cmluZywgbG9jYWxlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZhdWx0SW1wbC5zZXRGYXVsdFN0cmluZyhmYXVsdFN0cmluZyk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmF1bHRJbXBsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+U09BUEZhdWx0PC9jb2RlPiBvYmplY3QgYW5kIGFkZHMgaXQgdG8gdGhpcyA8Y29kZT5TT0FQQm9keTwvY29kZT4gb2JqZWN0LgotICAgICAqIFRoZSBuZXcgPGNvZGU+U09BUEZhdWx0PC9jb2RlPiB3aWxsIGhhdmUgYSA8Y29kZT5mYXVsdGNvZGU8L2NvZGU+IGVsZW1lbnQgdGhhdCBpcyBzZXQgdG8gdGhlCi0gICAgICogPGNvZGU+ZmF1bHRDb2RlPC9jb2RlPiBwYXJhbWV0ZXIgYW5kIGEgPGNvZGU+ZmF1bHRzdHJpbmc8L2NvZGU+IHNldCB0bwotICAgICAqIDxjb2RlPmZhdWx0c3RyaW5nPC9jb2RlPi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmYXVsdENvZGUgICBhIDxjb2RlPk5hbWU8L2NvZGU+IG9iamVjdCBnaXZpbmcgdGhlIGZhdWx0IGNvZGUgdG8gYmUgc2V0OyBtdXN0IGJlIG9uZSBvZgotICAgICAqICAgICAgICAgICAgICAgICAgICB0aGUgZmF1bHQgY29kZXMgZGVmaW5lZCBpbiB0aGUgU09BUCAxLjEgc3BlY2lmaWNhdGlvbiBhbmQgb2YgdHlwZSBRTmFtZQotICAgICAqIEBwYXJhbSBmYXVsdFN0cmluZyBhIDxjb2RlPlN0cmluZzwvY29kZT4gZ2l2aW5nIGFuIGV4cGxhbmF0aW9uIG9mIHRoZSBmYXVsdAotICAgICAqIEByZXR1cm4gdGhlIG5ldyA8Y29kZT5TT0FQRmF1bHQ8L2NvZGU+IG9iamVjdAotICAgICAqIEB0aHJvd3MgU09BUEV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIFNPQVAgZXJyb3IKLSAgICAgKi8KLSAgICBwdWJsaWMgU09BUEZhdWx0IGFkZEZhdWx0KE5hbWUgZmF1bHRDb2RlLCBTdHJpbmcgZmF1bHRTdHJpbmcpIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGFkZEZhdWx0KGZhdWx0Q29kZSwgZmF1bHRTdHJpbmcsIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgdGhlIHJvb3Qgbm9kZSBvZiB0aGUgRE9NIDxjb2RlPkRvY3VtZW50PC9jb2RlPiB0byB0aGlzIDxjb2RlPlNPQVBCb2R5PC9jb2RlPiBvYmplY3QuCi0gICAgICogPHAvPgotICAgICAqIENhbGxpbmcgdGhpcyBtZXRob2QgaW52YWxpZGF0ZXMgdGhlIDxjb2RlPmRvY3VtZW50PC9jb2RlPiBwYXJhbWV0ZXIuIFRoZSBjbGllbnQgYXBwbGljYXRpb24KLSAgICAgKiBzaG91bGQgZGlzY2FyZCBhbGwgcmVmZXJlbmNlcyB0byB0aGlzIDxjb2RlPkRvY3VtZW50PC9jb2RlPiBhbmQgaXRzIGNvbnRlbnRzIHVwb24gY2FsbGluZwotICAgICAqIDxjb2RlPmFkZERvY3VtZW50PC9jb2RlPi4gVGhlIGJlaGF2aW9yIG9mIGFuIGFwcGxpY2F0aW9uIHRoYXQgY29udGludWVzIHRvIHVzZSBzdWNoCi0gICAgICogcmVmZXJlbmNlcyBpcyB1bmRlZmluZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZG9jdW1lbnQgdGhlIDxjb2RlPkRvY3VtZW50PC9jb2RlPiBvYmplY3Qgd2hvc2Ugcm9vdCBub2RlIHdpbGwgYmUgYWRkZWQgdG8gdGhpcwotICAgICAqICAgICAgICAgICAgICAgICA8Y29kZT5TT0FQQm9keTwvY29kZT4KLSAgICAgKiBAcmV0dXJuIHRoZSA8Y29kZT5TT0FQQm9keUVsZW1lbnQ8L2NvZGU+IHRoYXQgcmVwcmVzZW50cyB0aGUgcm9vdCBub2RlIHRoYXQgd2FzIGFkZGVkCi0gICAgICogQHRocm93cyBTT0FQRXhjZXB0aW9uIGlmIHRoZSA8Y29kZT5Eb2N1bWVudDwvY29kZT4gY2Fubm90IGJlIGFkZGVkCi0gICAgICovCi0gICAgcHVibGljIFNPQVBCb2R5RWxlbWVudCBhZGREb2N1bWVudChEb2N1bWVudCBkb2N1bWVudCkgdGhyb3dzIFNPQVBFeGNlcHRpb24gewotICAgICAgICBFbGVtZW50IGRvY0VsZSA9IGRvY3VtZW50LmdldERvY3VtZW50RWxlbWVudCgpOwotCi0gICAgICAgIFNPQVBFbGVtZW50IHNhYWpTT0FQRWxlID0gKFNPQVBFbGVtZW50KXRvU0FBSk5vZGUoZG9jRWxlLCB0aGlzKTsKLSAgICAgICAgU09BUEJvZHlFbGVtZW50SW1wbCBib2R5RWxlID0KLSAgICAgICAgICAgICAgICBuZXcgU09BUEJvZHlFbGVtZW50SW1wbCgoKFNPQVBFbGVtZW50SW1wbClzYWFqU09BUEVsZSkuZWxlbWVudCk7Ci0gICAgICAgIGFkZENoaWxkRWxlbWVudChib2R5RWxlKTsKLSAgICAgICAgcmV0dXJuIGJvZHlFbGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5TT0FQQm9keUVsZW1lbnQ8L2NvZGU+IG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBhbmQgYWRkcyBpdCB0byB0aGlzCi0gICAgICogPGNvZGU+U09BUEJvZHk8L2NvZGU+IG9iamVjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBxbmFtZSBhIDxjb2RlPlFOYW1lPC9jb2RlPiBvYmplY3Qgd2l0aCB0aGUgbmFtZSBmb3IgdGhlIG5ldyA8Y29kZT5TT0FQQm9keUVsZW1lbnQ8L2NvZGU+Ci0gICAgICogICAgICAgICAgICAgIG9iamVjdAotICAgICAqIEByZXR1cm4gdGhlIG5ldyA8Y29kZT5TT0FQQm9keUVsZW1lbnQ8L2NvZGU+IG9iamVjdAotICAgICAqIEB0aHJvd3MgU09BUEV4Y2VwdGlvbiBpZiBhIFNPQVAgZXJyb3Igb2NjdXJzCi0gICAgICovCi0gICAgcHVibGljIFNPQVBCb2R5RWxlbWVudCBhZGRCb2R5RWxlbWVudChRTmFtZSBxbmFtZSkgdGhyb3dzIFNPQVBFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gKFNPQVBCb2R5RWxlbWVudClhZGRDaGlsZEVsZW1lbnQocW5hbWUpOwotICAgIH0KLQotCi0gICAgcHVibGljIFNPQVBGYXVsdCBhZGRGYXVsdChRTmFtZSBmYXVsdGNvZGUsIFN0cmluZyBmYXVsdFN0cmluZykgdGhyb3dzIFNPQVBFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gYWRkRmF1bHQoZmF1bHRjb2RlLCBmYXVsdFN0cmluZywgbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5TT0FQRmF1bHQ8L2NvZGU+IG9iamVjdCBhbmQgYWRkcyBpdCB0byB0aGlzIDxjb2RlPlNPQVBCb2R5PC9jb2RlPiBvYmplY3QuCi0gICAgICogVGhlIG5ldyA8Y29kZT5TT0FQRmF1bHQ8L2NvZGU+IHdpbGwgaGF2ZSBhIDxjb2RlPmZhdWx0Y29kZTwvY29kZT4gZWxlbWVudCB0aGF0IGlzIHNldCB0byB0aGUKLSAgICAgKiA8Y29kZT5mYXVsdENvZGU8L2NvZGU+IHBhcmFtZXRlciBhbmQgYSA8Y29kZT5mYXVsdHN0cmluZzwvY29kZT4gc2V0IHRvCi0gICAgICogPGNvZGU+ZmF1bHRzdHJpbmc8L2NvZGU+IGFuZCBsb2NhbGl6ZWQgdG8gPGNvZGU+bG9jYWxlPC9jb2RlPi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmYXVsdENvZGUgICBhIDxjb2RlPlFOYW1lPC9jb2RlPiBvYmplY3QgZ2l2aW5nIHRoZSBmYXVsdCBjb2RlIHRvIGJlCi0gICAgICogQHBhcmFtIGZhdWx0U3RyaW5nIGEgPGNvZGU+U3RyaW5nPC9jb2RlPiBnaXZpbmcgYW4gZXhwbGFuYXRpb24gb2YgdGhlIGZhdWx0Ci0gICAgICogQHBhcmFtIGxvY2FsZSAgICAgIGEgPGNvZGU+TG9jYWxlPC9jb2RlPiBvYmplY3QgaW5kaWNhdGluZyB0aGUgbmF0aXZlIGxhbmd1YWdlIG9mIHRoZQotICAgICAqICAgICAgICAgICAgICAgICAgICA8b2NkZT5mYXVsdFN0cmluZzwvY29kZT4KLSAgICAgKiBAcmV0dXJuIHRoZSBuZXcgPGNvZGU+U09BUEZhdWx0PC9jb2RlPiBvYmplY3QKLSAgICAgKiBAdGhyb3dzIFNPQVBFeGNlcHRpb24gaWYgdGhlcmUgaXMgYSBTT0FQIGVycm9yCi0gICAgICovCi0gICAgcHVibGljIFNPQVBGYXVsdCBhZGRGYXVsdChRTmFtZSBmYXVsdENvZGUsIFN0cmluZyBmYXVsdFN0cmluZywgTG9jYWxlIGxvY2FsZSkKLSAgICAgICAgICAgIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLSAgICAgICAgU09BUEZhdWx0SW1wbCBmYXVsdEltcGwgPSBudWxsOwotCi0gICAgICAgIGlmICh0aGlzLmVsZW1lbnQuZ2V0T01GYWN0b3J5KCkgaW5zdGFuY2VvZiBTT0FQMTFGYWN0b3J5KSB7Ci0gICAgICAgICAgICBTT0FQMTFGYXVsdEltcGwgZmF1bHQgPSBuZXcgU09BUDExRmF1bHRJbXBsKG9tU09BUEJvZHksIG5ldyBFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIGZhdWx0U3RyaW5nKSwgKFNPQVBGYWN0b3J5KXRoaXMuZWxlbWVudC5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICBmYXVsdEltcGwgPSBuZXcgU09BUEZhdWx0SW1wbChmYXVsdCk7Ci0gICAgICAgIH0gZWxzZSBpZiAodGhpcy5lbGVtZW50LmdldE9NRmFjdG9yeSgpIGluc3RhbmNlb2YgU09BUDEyRmFjdG9yeSkgewotICAgICAgICAgICAgU09BUDEyRmF1bHRJbXBsIGZhdWx0ID0gbmV3IFNPQVAxMkZhdWx0SW1wbChvbVNPQVBCb2R5LCBuZXcgRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICBmYXVsdFN0cmluZyksIChTT0FQRmFjdG9yeSl0aGlzLmVsZW1lbnQuZ2V0T01GYWN0b3J5KCkpOwotICAgICAgICAgICAgZmF1bHRJbXBsID0gbmV3IFNPQVBGYXVsdEltcGwoZmF1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGZhdWx0SW1wbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmYXVsdEltcGwuc2V0RmF1bHRDb2RlKGZhdWx0Q29kZSk7Ci0gICAgICAgICAgICBpZiAobG9jYWxlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmYXVsdEltcGwuc2V0RmF1bHRTdHJpbmcoZmF1bHRTdHJpbmcsIGxvY2FsZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZhdWx0SW1wbC5zZXRGYXVsdFN0cmluZyhmYXVsdFN0cmluZyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhdWx0SW1wbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IERPTSBvcmcudzNjLmRvbS5Eb2N1bWVudCBhbmQgc2V0cyB0aGUgZmlyc3QgY2hpbGQgb2YgdGhpcyBTT0FQQm9keSBhcyBpdHMKLSAgICAgKiBkb2N1bWVudCBlbGVtZW50LiBUaGUgY2hpbGQgU09BUEVsZW1lbnQgaXMgcmVtb3ZlZCBhcyBwYXJ0IG9mIHRoZSBwcm9jZXNzLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgb3JnLnczYy5kb20uRG9jdW1lbnQgcmVwcmVzZW50YXRpb24gb2YgdGhlIFNPQVBCb2R5IGNvbnRlbnQuCi0gICAgICogQHRocm93cyBTT0FQRXhjZXB0aW9uIC0gaWYgdGhlcmUgaXMgbm90IGV4YWN0bHkgb25lIGNoaWxkIFNPQVBFbGVtZW50IG9mIHRoZSBTT0FQQm9keS4KLSAgICAgKi8KLSAgICBwdWJsaWMgRG9jdW1lbnQgZXh0cmFjdENvbnRlbnRBc0RvY3VtZW50KCkgdGhyb3dzIFNPQVBFeGNlcHRpb24gewotICAgICAgICBJdGVyYXRvciBjaGlsZEVsZW1lbnRzID0gdGhpcy5nZXRDaGlsZEVsZW1lbnRzKCk7Ci0gICAgICAgIG9yZy53M2MuZG9tLk5vZGUgZG9tTm9kZSA9IG51bGw7Ci0gICAgICAgIGludCBjaGlsZENvdW50ID0gMDsKLSAgICAgICAgd2hpbGUgKGNoaWxkRWxlbWVudHMuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBkb21Ob2RlID0gKG9yZy53M2MuZG9tLk5vZGUpY2hpbGRFbGVtZW50cy5uZXh0KCk7Ci0gICAgICAgICAgICBjaGlsZENvdW50Kys7Ci0gICAgICAgICAgICBpZiAoY2hpbGRDb3VudCA+IDEpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU09BUEV4Y2VwdGlvbigiU09BUEJvZHkgY29udGFpbnMgbW9yZSB0aGFuIG9uZSBjaGlsZCBlbGVtZW50Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy9UaGUgY2hpbGQgU09BUEVsZW1lbnQgaXMgcmVtb3ZlZCBhcyBwYXJ0IG9mIHRoZSBwcm9jZXNzCi0gICAgICAgIHRoaXMucmVtb3ZlQ29udGVudHMoKTsKLQotCi0gICAgICAgIERvY3VtZW50IGRvY3VtZW50OwotICAgICAgICBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGZhY3RvcnkgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIGZhY3Rvcnkuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIERvY3VtZW50QnVpbGRlciBidWlsZGVyID0gZmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKLSAgICAgICAgICAgIGRvY3VtZW50ID0gYnVpbGRlci5uZXdEb2N1bWVudCgpOwotICAgICAgICAgICAgRWxlbWVudCBlbGVtZW50ID0KLSAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKGRvbU5vZGUuZ2V0TmFtZXNwYWNlVVJJKCksIGRvbU5vZGUuZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICAgICAgZWxlbWVudC5zZXROb2RlVmFsdWUoZG9tTm9kZS5nZXROb2RlVmFsdWUoKSk7Ci0gICAgICAgICAgICBkb2N1bWVudC5hcHBlbmRDaGlsZChlbGVtZW50KTsKLSAgICAgICAgfSBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU09BUEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZG9jdW1lbnQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBqYXZheC54bWwuc29hcC5Ob2RlIHRvU0FBSk5vZGUob3JnLnczYy5kb20uTm9kZSBub2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPQVBFbGVtZW50IHBhcmVudCkgdGhyb3dzIFNPQVBFeGNlcHRpb24gewotICAgICAgICBpZiAobm9kZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIG9yZy53M2MuZG9tLlRleHQpIHsKLSAgICAgICAgICAgIG9yZy53M2MuZG9tLlRleHQgZG9tVGV4dCA9IChvcmcudzNjLmRvbS5UZXh0KW5vZGU7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFRleHRJbXBsRXgoZG9tVGV4dC5nZXREYXRhKCksIHBhcmVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBvcmcudzNjLmRvbS5Db21tZW50KSB7Ci0gICAgICAgICAgICBvcmcudzNjLmRvbS5Db21tZW50IGRvbVRleHQgPSAob3JnLnczYy5kb20uQ29tbWVudClub2RlOwotICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21tZW50SW1wbChkb21UZXh0LmdldERhdGEoKSwgcGFyZW50KTsKLSAgICAgICAgfQotICAgICAgICBFbGVtZW50IGRvbUVsZSA9ICgoRWxlbWVudClub2RlKTsKLSAgICAgICAgaW50IGluZGV4T2ZDb2xvbiA9IGRvbUVsZS5nZXRUYWdOYW1lKCkuaW5kZXhPZigiOiIpOwotICAgICAgICBOYW1lc3BhY2VJbXBsIG5zOwotICAgICAgICBTdHJpbmcgbG9jYWxOYW1lOwotICAgICAgICBpZiAoaW5kZXhPZkNvbG9uICE9IC0xKSB7Ci0gICAgICAgICAgICBsb2NhbE5hbWUgPSBkb21FbGUuZ2V0VGFnTmFtZSgpLnN1YnN0cmluZyhpbmRleE9mQ29sb24gKyAxKTsKLSAgICAgICAgICAgIG5zID0gbmV3IE5hbWVzcGFjZUltcGwoZG9tRWxlLmdldE5hbWVzcGFjZVVSSSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb21FbGUuZ2V0VGFnTmFtZSgpLnN1YnN0cmluZygwLCBpbmRleE9mQ29sb24pKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGxvY2FsTmFtZSA9IGRvbUVsZS5nZXRMb2NhbE5hbWUoKTsKLSAgICAgICAgICAgIGlmIChsb2NhbE5hbWUgPT0gbnVsbCkgeyAgLy9pdCBpcyBwb3NzaWJsZSB0aGF0IGxvY2FsbmFtZSBpc24ndCBzZXQgYnV0IG5hbWUgaXMgc2V0Ci0gICAgICAgICAgICAgICAgbG9jYWxOYW1lID0gZG9tRWxlLmdldFRhZ05hbWUoKTsKLSAgICAgICAgICAgIH0gICAgIAotICAgICAgICAgICAgCi0gICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gZG9tRWxlLmdldFByZWZpeCgpOwotICAgICAgICAgICAgaWYocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBwcmVmaXggPSAiIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChkb21FbGUuZ2V0TmFtZXNwYWNlVVJJKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG5zID0gbmV3IE5hbWVzcGFjZUltcGwoZG9tRWxlLmdldE5hbWVzcGFjZVVSSSgpLCBwcmVmaXgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbnMgPSBuZXcgTmFtZXNwYWNlSW1wbCgiIiwgcHJlZml4KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBucyA9IG5ldyBOYW1lc3BhY2VJbXBsKCIiLCAiIik7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBFbGVtZW50SW1wbCBlbGVJbXBsID0KLSAgICAgICAgICAgICAgICBuZXcgRWxlbWVudEltcGwoKERvY3VtZW50SW1wbCl0aGlzLmdldE93bmVyRG9jdW1lbnQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxOYW1lLCBucywgdGhpcy5lbGVtZW50LmdldE9NRmFjdG9yeSgpKTsKLQotICAgICAgICBTT0FQRWxlbWVudEltcGwgc2FhakVsZSA9IG5ldyBTT0FQRWxlbWVudEltcGwoZWxlSW1wbCk7Ci0KLSAgICAgICAgc2FhakVsZS5zZXRQYXJlbnRFbGVtZW50KHBhcmVudCk7Ci0gICAgICAgIE5hbWVkTm9kZU1hcCBkb21BdHRycyA9IGRvbUVsZS5nZXRBdHRyaWJ1dGVzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZG9tQXR0cnMuZ2V0TGVuZ3RoKCk7IGkrKykgewotICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZSBhdHRyTm9kZSA9IGRvbUF0dHJzLml0ZW0oaSk7Ci0gICAgICAgICAgICBTdHJpbmcgYXR0ckxvY2FsTmFtZSA9IGF0dHJOb2RlLmdldExvY2FsTmFtZSgpOwotICAgICAgICAgICAgaWYgKGF0dHJMb2NhbE5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGF0dHJMb2NhbE5hbWUgPSBhdHRyTm9kZS5nZXROb2RlTmFtZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGF0dHJMb2NhbE5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vbG9jYWwgcGFydCBpcyByZXF1aXJlZC4gICIiIGlzIGFsbG93ZWQgdG8gcHJlc2VydmUgY29tcGF0aWJpbGl0eSB3aXRoIFFOYW1lIDEuMAotICAgICAgICAgICAgICAgIGF0dHJMb2NhbE5hbWUgPSAiIjsKLSAgICAgICAgICAgIH0gCi0gICAgICAgICAgICBzYWFqRWxlLmFkZEF0dHJpYnV0ZShuZXcgUHJlZml4ZWRRTmFtZShhdHRyTm9kZS5nZXROYW1lc3BhY2VVUkkoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJMb2NhbE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyTm9kZS5nZXRQcmVmaXgoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyTm9kZS5nZXROb2RlVmFsdWUoKSk7ICAgICAgICAgICAgICAgIAotICAgICAgICB9Ci0KLSAgICAgICAgTm9kZUxpc3QgY2hpbGROb2RlcyA9IG5vZGUuZ2V0Q2hpbGROb2RlcygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkTm9kZXMuZ2V0TGVuZ3RoKCk7IGkrKykgewotICAgICAgICAgICAgTm9kZSBjaGlsZFNBQUpOb2RlID0gdG9TQUFKTm9kZShjaGlsZE5vZGVzLml0ZW0oaSksIHNhYWpFbGUpOwotICAgICAgICAgICAgaWYgKGNoaWxkU0FBSk5vZGUgaW5zdGFuY2VvZiBqYXZheC54bWwuc29hcC5UZXh0KSB7Ci0gICAgICAgICAgICAgICAgc2FhakVsZS5hZGRUZXh0Tm9kZShjaGlsZFNBQUpOb2RlLmdldFZhbHVlKCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzYWFqRWxlLmFkZENoaWxkRWxlbWVudCgoamF2YXgueG1sLnNvYXAuU09BUEVsZW1lbnQpY2hpbGRTQUFKTm9kZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNhYWpFbGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGV0YWNoTm9kZSgpIHsKLSAgICAgICAgdGhpcy5kZXRhY2goKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT01Ob2RlIGRldGFjaCgpIHsKLSAgICAgICAgdGhpcy5wYXJlbnRFbGVtZW50ID0gbnVsbDsKLSAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudC5kZXRhY2goKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSXRlcmF0b3IgZ2V0Q2hpbGRFbGVtZW50cyhOYW1lIG5hbWUpIHsKLSAgICAgICAgUU5hbWUgcU5hbWUgPSBuZXcgUU5hbWUobmFtZS5nZXRVUkkoKSwgbmFtZS5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgIHJldHVybiBnZXRDaGlsZHJlbihlbGVtZW50LmdldENoaWxkcmVuV2l0aE5hbWUocU5hbWUpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU09BUEVsZW1lbnQgYWRkQXR0cmlidXRlKFFOYW1lIHFuYW1lLCBTdHJpbmcgdmFsdWUpIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLSAgICAgICAgT01OYW1lc3BhY2Ugb21OYW1lc3BhY2UgPSBudWxsOwotICAgICAgICBTT0FQRmFjdG9yeSBzb2FwRmFjdG9yeTsKLSAgICAgICAgaWYgKHRoaXMuZWxlbWVudC5nZXRPTUZhY3RvcnkoKSBpbnN0YW5jZW9mIFNPQVAxMUZhY3RvcnkpIHsKLSAgICAgICAgICAgIHNvYXBGYWN0b3J5ID0gbmV3IFNPQVAxMUZhY3RvcnkoKTsKLSAgICAgICAgICAgIG9tTmFtZXNwYWNlID0gc29hcEZhY3RvcnkuY3JlYXRlT01OYW1lc3BhY2UocW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCksIHFuYW1lLmdldFByZWZpeCgpKTsKLSAgICAgICAgfSBlbHNlIGlmICh0aGlzLmVsZW1lbnQuZ2V0T01GYWN0b3J5KCkgaW5zdGFuY2VvZiBTT0FQMTJGYWN0b3J5KSB7Ci0gICAgICAgICAgICBzb2FwRmFjdG9yeSA9IG5ldyBTT0FQMTJGYWN0b3J5KCk7Ci0gICAgICAgICAgICBvbU5hbWVzcGFjZSA9IHNvYXBGYWN0b3J5LmNyZWF0ZU9NTmFtZXNwYWNlKHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpLCBxbmFtZS5nZXRQcmVmaXgoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy5lbGVtZW50LmFkZEF0dHJpYnV0ZShxbmFtZS5nZXRMb2NhbFBhcnQoKSwgdmFsdWUsIG9tTmFtZXNwYWNlKTsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgcHVibGljIFNPQVBFbGVtZW50IGFkZENoaWxkRWxlbWVudChRTmFtZSBxbmFtZSkgdGhyb3dzIFNPQVBFeGNlcHRpb24gewotICAgICAgICBpZiAob21TT0FQQm9keS5oYXNGYXVsdCgpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU09BUEV4Y2VwdGlvbigiQSBTT0FQRmF1bHQgaGFzIGJlZW4gYWxyZWFkeSBhZGRlZCB0byB0aGlzIFNPQVBCb2R5Iik7Ci0gICAgICAgIH0KLSAgICAgICAgU09BUEJvZHlFbGVtZW50SW1wbCBjaGlsZEVsZTsKLSAgICAgICAgaWYgKHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpID09IG51bGwgfHwgIiIuZXF1YWxzKHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpKSkgewotICAgICAgICAgICAgY2hpbGRFbGUgPSBuZXcgU09BUEJvZHlFbGVtZW50SW1wbCgKLSAgICAgICAgICAgICAgICAgICAgKEVsZW1lbnRJbXBsKWdldE93bmVyRG9jdW1lbnQoKS5jcmVhdGVFbGVtZW50KHFuYW1lLmdldExvY2FsUGFydCgpKSk7Ci0gICAgICAgIH1lbHNlIGlmKG51bGwgPT0gcW5hbWUuZ2V0UHJlZml4KCkgfHwgIiIuZXF1YWxzKHFuYW1lLmdldFByZWZpeCgpLnRyaW0oKSkpIHsKLSAgICAgICAgICAgIGNoaWxkRWxlID0gbmV3IFNPQVBCb2R5RWxlbWVudEltcGwoCi0gICAgICAgICAgICAgICAgICAgIChFbGVtZW50SW1wbClnZXRPd25lckRvY3VtZW50KCkuY3JlYXRlRWxlbWVudE5TKHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFuYW1lLmdldExvY2FsUGFydCgpKSk7Ci0gICAgICAgIH1lbHNlIHsKLSAgICAgICAgICAgIGNoaWxkRWxlID0gbmV3IFNPQVBCb2R5RWxlbWVudEltcGwoCi0gICAgICAgICAgICAgICAgICAgIChFbGVtZW50SW1wbClnZXRPd25lckRvY3VtZW50KCkuY3JlYXRlRWxlbWVudE5TKHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxbmFtZS5nZXRQcmVmaXgoKSArICI6IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcW5hbWUuZ2V0TG9jYWxQYXJ0KCkpKTsKLSAgICAgICAgfQotICAgICAgICBjaGlsZEVsZS5lbGVtZW50LnNldFVzZXJEYXRhKFNBQUpfTk9ERSwgY2hpbGRFbGUsIG51bGwpOwotICAgICAgICBjaGlsZEVsZS5lbGVtZW50LnNldE5hbWVzcGFjZShjaGlsZEVsZS5lbGVtZW50LmRlY2xhcmVOYW1lc3BhY2UoCi0gICAgICAgICAgICAgICAgcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCksIHFuYW1lLmdldFByZWZpeCgpKSk7Ci0KLSAgICAgICAgZWxlbWVudC5hcHBlbmRDaGlsZChjaGlsZEVsZS5lbGVtZW50KTsKLSAgICAgICAgKChOb2RlSW1wbCljaGlsZEVsZS5lbGVtZW50LmdldFBhcmVudE5vZGUoKSkuc2V0VXNlckRhdGEoU0FBSl9OT0RFLCB0aGlzLCBudWxsKTsKLSAgICAgICAgaXNCb2R5RWxlbWVudEFkZGVkID0gdHJ1ZTsKLSAgICAgICAgY2hpbGRFbGUuc2V0UGFyZW50RWxlbWVudCh0aGlzKTsKLSAgICAgICAgcmV0dXJuIGNoaWxkRWxlOwotICAgIH0KLQotICAgIHB1YmxpYyBRTmFtZSBjcmVhdGVRTmFtZShTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcHJlZml4KSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICh0aGlzLmVsZW1lbnQuZ2V0T01GYWN0b3J5KCkgaW5zdGFuY2VvZiBTT0FQMTFGYWN0b3J5KSB7Ci0gICAgICAgICAgICByZXR1cm4gc3VwZXIuY3JlYXRlUU5hbWUobG9jYWxOYW1lLCBwcmVmaXgpOwotICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZWxlbWVudC5nZXRPTUZhY3RvcnkoKSBpbnN0YW5jZW9mIFNPQVAxMkZhY3RvcnkpIHsKLSAgICAgICAgICAgIGlmICh0aGlzLmVsZW1lbnQuZmluZE5hbWVzcGFjZVVSSShwcmVmaXgpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU09BUEV4Y2VwdGlvbigiT25seSBOYW1lc3BhY2UgUXVhbGlmaWVkIGVsZW1lbnRzIGFyZSBhbGxvd2VkIik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBzdXBlci5jcmVhdGVRTmFtZShsb2NhbE5hbWUsIHByZWZpeCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgcHVibGljIEl0ZXJhdG9yIGdldEFsbEF0dHJpYnV0ZXNBc1FOYW1lcygpIHsKLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldEFsbEF0dHJpYnV0ZXNBc1FOYW1lcygpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlVmFsdWUoUU5hbWUgcW5hbWUpIHsKLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldEF0dHJpYnV0ZVZhbHVlKHFuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSXRlcmF0b3IgZ2V0Q2hpbGRFbGVtZW50cyhRTmFtZSBxbmFtZSkgewotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0Q2hpbGRFbGVtZW50cyhxbmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFFOYW1lIGdldEVsZW1lbnRRTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldEVsZW1lbnRRTmFtZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZUF0dHJpYnV0ZShRTmFtZSBxbmFtZSkgewotICAgICAgICByZXR1cm4gc3VwZXIucmVtb3ZlQXR0cmlidXRlKHFuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU09BUEVsZW1lbnQgc2V0RWxlbWVudFFOYW1lKFFOYW1lIHFuYW1lKSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBzdXBlci5zZXRFbGVtZW50UU5hbWUocW5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBJdGVyYXRvciBnZXRDaGlsZEVsZW1lbnRzKCkgewotICAgICAgICByZXR1cm4gZ2V0Q2hpbGRyZW4oZWxlbWVudC5nZXRDaGlsZHJlbigpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU09BUEVsZW1lbnQgYWRkVGV4dE5vZGUoU3RyaW5nIHRleHQpIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIHN1cGVyLmFkZFRleHROb2RlKHRleHQpOwotICAgIH0KLQotICAgIHByaXZhdGUgSXRlcmF0b3IgZ2V0Q2hpbGRyZW4oSXRlcmF0b3IgY2hpbGRJdGVyKSB7Ci0gICAgICAgIENvbGxlY3Rpb24gY2hpbGRFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgd2hpbGUgKGNoaWxkSXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUgZG9tTm9kZSA9IChvcmcudzNjLmRvbS5Ob2RlKWNoaWxkSXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBOb2RlIHNhYWpOb2RlID0gdG9TQUFKTm9kZShkb21Ob2RlKTsKLSAgICAgICAgICAgIGlmIChzYWFqTm9kZSBpbnN0YW5jZW9mIGphdmF4LnhtbC5zb2FwLlRleHQpIHsKLSAgICAgICAgICAgICAgICBjaGlsZEVsZW1lbnRzLmFkZChzYWFqTm9kZSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCEoc2Fhak5vZGUgaW5zdGFuY2VvZiBTT0FQQm9keUVsZW1lbnQpKSB7Ci0gICAgICAgICAgICAgICAgLy8gc2lsZW50bHkgcmVwbGFjZSBub2RlLCBhcyBwZXIgc2FhaiAxLjIgc3BlYwotICAgICAgICAgICAgICAgIGlmIChkb21Ob2RlIGluc3RhbmNlb2YgRWxlbWVudEltcGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG9tU09BUEJvZHkuaGFzRmF1bHQoKSkgewotCi0gICAgICAgICAgICAgICAgICAgICAgICBTT0FQRmFjdG9yeSBvbUZhY3RvcnkgPSAoU09BUEZhY3RvcnkpdGhpcy5lbGVtZW50LmdldE9NRmFjdG9yeSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYXVsdCBmYXVsdDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvbUZhY3RvcnkgaW5zdGFuY2VvZiBTT0FQMTFGYWN0b3J5KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmF1bHQgPSBuZXcgU09BUDExRmF1bHRJbXBsKG9tU09BUEJvZHksIG9tRmFjdG9yeSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhdWx0ID0gbmV3IFNPQVAxMkZhdWx0SW1wbChvbVNPQVBCb2R5LCBvbUZhY3RvcnkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgU09BUEZhdWx0SW1wbCBzYWFqU09BUEZhdWx0ID0gbmV3IFNPQVBGYXVsdEltcGwoZmF1bHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgKChOb2RlSW1wbClvbVNPQVBCb2R5LmdldEZhdWx0KCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRVc2VyRGF0YShTQUFKX05PREUsIHNhYWpTT0FQRmF1bHQsIG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRFbGVtZW50cy5hZGQoc2FhalNPQVBGYXVsdCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTT0FQQm9keUVsZW1lbnQgc2FhakJvZHlFbGUgPSBuZXcgU09BUEJvZHlFbGVtZW50SW1wbCgoRWxlbWVudEltcGwpZG9tTm9kZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAoKE5vZGVJbXBsKWRvbU5vZGUpLnNldFVzZXJEYXRhKFNBQUpfTk9ERSwgc2FhakJvZHlFbGUsIG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRFbGVtZW50cy5hZGQoc2FhakJvZHlFbGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBjaGlsZEVsZW1lbnRzLmFkZChzYWFqTm9kZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNoaWxkRWxlbWVudHMuaXRlcmF0b3IoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYWFqL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NhYWovU09BUENvbm5lY3Rpb25GYWN0b3J5SW1wbC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvc2Fhai9zcmMvb3JnL2FwYWNoZS9heGlzMi9zYWFqL1NPQVBDb25uZWN0aW9uRmFjdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM0M2VkMC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYWFqL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NhYWovU09BUENvbm5lY3Rpb25GYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNhYWo7Ci0KLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQQ29ubmVjdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQQ29ubmVjdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEV4Y2VwdGlvbjsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFNPQVBDb25uZWN0aW9uRmFjdG9yeUltcGwgZXh0ZW5kcyBTT0FQQ29ubmVjdGlvbkZhY3RvcnkgewotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyA8Q09ERT5TT0FQQ29ubmVjdGlvbjwvQ09ERT4uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXcgPENPREU+U09BUENvbm5lY3Rpb248L0NPREU+IG9iamVjdC4KLSAgICAgKiBAdGhyb3dzIGphdmF4LnhtbC5zb2FwLlNPQVBFeGNlcHRpb24gaWYgdGhlcmUgd2FzIGFuIGV4Y2VwdGlvbiBjcmVhdGluZyB0aGUKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPENPREU+U09BUENvbm5lY3Rpb248L0NPREU+IG9iamVjdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU09BUENvbm5lY3Rpb24gY3JlYXRlQ29ubmVjdGlvbigpIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTT0FQQ29ubmVjdGlvbkltcGwoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYWFqL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NhYWovU09BUENvbm5lY3Rpb25JbXBsLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9zYWFqL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NhYWovU09BUENvbm5lY3Rpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlZTUzYjMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2Fhai9zcmMvb3JnL2FwYWNoZS9heGlzMi9zYWFqL1NPQVBDb25uZWN0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTI4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zYWFqOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTm9kZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NVGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5PTVRleHRJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5PcGVyYXRpb25DbGllbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuT3B0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5TZXJ2aWNlQ2xpZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5EaXNwYXRjaFBoYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuc2Fhai51dGlsLklER2VuZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuc2Fhai51dGlsLlNBQUpVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuc2Fhai51dGlsLlVuZGVyc3RhbmRBbGxIZWFkZXJzSGFuZGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuV1NETENvbnN0YW50czsKLQotaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXI7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5BdHRhY2htZW50UGFydDsKLWltcG9ydCBqYXZheC54bWwuc29hcC5NZXNzYWdlRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5NaW1lSGVhZGVyczsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQQm9keTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQQ29ubmVjdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBIZWFkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEhlYWRlckVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUE1lc3NhZ2U7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUFBhcnQ7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0Lkh0dHBVUkxDb25uZWN0aW9uOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi0KLS8qKgotICoKLSAqLwotcHVibGljIGNsYXNzIFNPQVBDb25uZWN0aW9uSW1wbCBleHRlbmRzIFNPQVBDb25uZWN0aW9uIHsKLQotICAgIC8qKiBBdHRyaWJ1dGUgd2hpY2gga2VlcHMgdHJhY2sgb2Ygd2hldGhlciB0aGlzIGNvbm5lY3Rpb24gaGFzIGJlZW4gY2xvc2VkICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGNsb3NlZCA9IGZhbHNlOwotCi0gICAgcHJpdmF0ZSBTZXJ2aWNlQ2xpZW50IHNlcnZpY2VDbGllbnQ7Ci0gICAgcHJpdmF0ZSBIYXNoTWFwIHVuYWNjZXNzZWRBdHRhY2htZW50cyA9IG5ldyBIYXNoTWFwKCk7Ci0KLQotICAgIC8qKgotICAgICAqIFNlbmRzIHRoZSBnaXZlbiBtZXNzYWdlIHRvIHRoZSBzcGVjaWZpZWQgZW5kcG9pbnQgYW5kIGJsb2NrcyB1bnRpbCBpdCBoYXMgcmV0dXJuZWQgdGhlCi0gICAgICogcmVzcG9uc2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVxdWVzdCAgdGhlIDxDT0RFPlNPQVBNZXNzYWdlPC9DT0RFPiBvYmplY3QgdG8gYmUgc2VudAotICAgICAqIEBwYXJhbSBlbmRwb2ludCBhbiA8Y29kZT5PYmplY3Q8L2NvZGU+IHRoYXQgaWRlbnRpZmllcyB3aGVyZSB0aGUgbWVzc2FnZSBzaG91bGQgYmUgc2VudC4gSXQKLSAgICAgKiAgICAgICAgICAgICAgICAgaXMgcmVxdWlyZWQgdG8gc3VwcG9ydCBPYmplY3RzIG9mIHR5cGUgPGNvZGU+amF2YS5sYW5nLlN0cmluZzwvY29kZT4sCi0gICAgICogICAgICAgICAgICAgICAgIDxjb2RlPmphdmEubmV0LlVSTDwvY29kZT4sIGFuZCB3aGVuIEpBWE0gaXMgcHJlc2VudCA8Y29kZT5qYXZheC54bWwubWVzc2FnaW5nLlVSTEVuZHBvaW50PC9jb2RlPgotICAgICAqIEByZXR1cm4gdGhlIDxDT0RFPlNPQVBNZXNzYWdlPC9DT0RFPiBvYmplY3QgdGhhdCBpcyB0aGUgcmVzcG9uc2UgdG8gdGhlIG1lc3NhZ2UgdGhhdCB3YXMKLSAgICAgKiAgICAgICAgIHNlbnQKLSAgICAgKiBAdGhyb3dzIGphdmF4LnhtbC5zb2FwLlNPQVBFeGNlcHRpb24gaWYgdGhlcmUgaXMgYSBTT0FQIGVycm9yLCBvciB0aGlzIFNPQVBDb25uZWN0aW9uIGlzCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscmVhZHkgY2xvc2VkCi0gICAgICovCi0gICAgcHVibGljIFNPQVBNZXNzYWdlIGNhbGwoU09BUE1lc3NhZ2UgcmVxdWVzdCwgT2JqZWN0IGVuZHBvaW50KSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChjbG9zZWQpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTT0FQRXhjZXB0aW9uKCJTT0FQQ29ubmVjdGlvbiBjbG9zZWQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGluaXRpYWxpemUgVVJMCi0gICAgICAgIFVSTCB1cmw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB1cmwgPSAoZW5kcG9pbnQgaW5zdGFuY2VvZiBVUkwpID8gKFVSTCllbmRwb2ludCA6IG5ldyBVUkwoZW5kcG9pbnQudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU09BUEV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBpbml0aWFsaXplIGFuZCBzZXQgT3B0aW9ucwotICAgICAgICBPcHRpb25zIG9wdGlvbnMgPSBuZXcgT3B0aW9ucygpOwotICAgICAgICBvcHRpb25zLnNldFRvKG5ldyBFbmRwb2ludFJlZmVyZW5jZSh1cmwudG9TdHJpbmcoKSkpOwotCi0gICAgICAgIC8vIGluaXRpYWxpemUgdGhlIFNlbmRlcgotICAgICAgICBPcGVyYXRpb25DbGllbnQgb3BDbGllbnQ7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzZXJ2aWNlQ2xpZW50ID0gbmV3IFNlcnZpY2VDbGllbnQoKTsgICAKLSAgICAgICAgICAgIGRpc2FibGVNdXN0VW5kZXJzdGFuZFByb2Nlc3Npbmcoc2VydmljZUNsaWVudC5nZXRBeGlzQ29uZmlndXJhdGlvbigpKTsgICAgICAgICAgICAKLSAgICAgICAgICAgIG9wQ2xpZW50ID0gc2VydmljZUNsaWVudC5jcmVhdGVDbGllbnQoU2VydmljZUNsaWVudC5BTk9OX09VVF9JTl9PUCk7Ci0gICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU09BUEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotCi0gICAgICAgIG9wdGlvbnMuc2V0UHJvcGVydHkoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uQ0hBUkFDVEVSX1NFVF9FTkNPRElORywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5nZXRQcm9wZXJ0eShTT0FQTWVzc2FnZS5DSEFSQUNURVJfU0VUX0VOQ09ESU5HKSk7Ci0KLSAgICAgICAgb3BDbGllbnQuc2V0T3B0aW9ucyhvcHRpb25zKTsKLQotICAgICAgICBpZiAocmVxdWVzdC5jb3VudEF0dGFjaG1lbnRzKCkgIT0gMCkgeyAvLyBTT0FQTWVzc2FnZSB3aXRoIGF0dGFjaG1lbnRzCi0gICAgICAgICAgICBvcENsaWVudC5nZXRPcHRpb25zKCkuc2V0UHJvcGVydHkoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uRU5BQkxFX01UT00sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLlZBTFVFX1RSVUUpOwotICAgICAgICAgICAgcmV0dXJuIGhhbmRsZVNPQVBNZXNzYWdlKHJlcXVlc3QsIG9wQ2xpZW50KTsKLSAgICAgICAgfSBlbHNlIHsgLy8gc2ltcGxlIFNPQVBNZXNzYWdlCi0gICAgICAgICAgICByZXR1cm4gaGFuZGxlU09BUE1lc3NhZ2UocmVxdWVzdCwgb3BDbGllbnQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBJbnN0YWxscyBVbmRlcnN0YW5kQWxsSGVhZGVyc0hhbmRsZXIgdGhhdCBtYXJrcyBhbGwgaGVhZGVycyBhcyBwcm9jZXNzZWQgCi0gICAgICogYmVjYXVzZSBNVSB2YWxpZGF0aW9uIHNob3VsZCBub3QgYmUgZG9uZSBmb3IgU0FBSiBjbGllbnRzLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBkaXNhYmxlTXVzdFVuZGVyc3RhbmRQcm9jZXNzaW5nKEF4aXNDb25maWd1cmF0aW9uIGNvbmZpZykgewotICAgICAgICBEaXNwYXRjaFBoYXNlIHBoYXNlOwotICAgICAgICBwaGFzZSA9IGdldERpc3BhdGNoUGhhc2Uoc2VydmljZUNsaWVudC5nZXRBeGlzQ29uZmlndXJhdGlvbigpLmdldEluRmxvd1BoYXNlcygpKTsKLSAgICAgICAgaWYgKHBoYXNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHBoYXNlLmFkZEhhbmRsZXIobmV3IFVuZGVyc3RhbmRBbGxIZWFkZXJzSGFuZGxlcigpKTsKLSAgICAgICAgfQotICAgICAgICBwaGFzZSA9IGdldERpc3BhdGNoUGhhc2Uoc2VydmljZUNsaWVudC5nZXRBeGlzQ29uZmlndXJhdGlvbigpLmdldEluRmF1bHRGbG93UGhhc2VzKCkpOwotICAgICAgICBpZiAocGhhc2UgIT0gbnVsbCkgewotICAgICAgICAgICAgcGhhc2UuYWRkSGFuZGxlcihuZXcgVW5kZXJzdGFuZEFsbEhlYWRlcnNIYW5kbGVyKCkpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIERpc3BhdGNoUGhhc2UgZ2V0RGlzcGF0Y2hQaGFzZShMaXN0IHBoYXNlcykgewotICAgICAgICBJdGVyYXRvciBpdGVyID0gcGhhc2VzLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlKGl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBPYmplY3QgcGhhc2UgPSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIGlmIChwaGFzZSBpbnN0YW5jZW9mIERpc3BhdGNoUGhhc2UpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKERpc3BhdGNoUGhhc2UpcGhhc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7ICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ2xvc2VzIHRoaXMgPENPREU+U09BUENvbm5lY3Rpb248L0NPREU+IG9iamVjdC4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgamF2YXgueG1sLnNvYXAuU09BUEV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIFNPQVAgZXJyb3IsIG9yIHRoaXMgU09BUENvbm5lY3Rpb24gaXMKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxyZWFkeSBjbG9zZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHNlcnZpY2VDbGllbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBzZXJ2aWNlQ2xpZW50LmNsZWFudXAoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBheGlzRmF1bHQpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU09BUEV4Y2VwdGlvbihheGlzRmF1bHQuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoY2xvc2VkKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU09BUEV4Y2VwdGlvbigiU09BUENvbm5lY3Rpb24gQ2xvc2VkIik7Ci0gICAgICAgIH0KLSAgICAgICAgY2xvc2VkID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFNPQVBNZXNzYWdlIGhhbmRsZVNPQVBNZXNzYWdlKFNPQVBNZXNzYWdlIHJlcXVlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYXRpb25DbGllbnQgb3BDbGllbnQpIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLQotICAgICAgICBNZXNzYWdlQ29udGV4dCByZXF1ZXN0TXNnQ3R4ID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXF1ZXN0TXNnQ3R4LnNldEVudmVsb3BlKHRvT01TT0FQRW52ZWxvcGUocmVxdWVzdCkpOwotICAgICAgICAgICAgb3BDbGllbnQuYWRkTWVzc2FnZUNvbnRleHQocmVxdWVzdE1zZ0N0eCk7Ci0gICAgICAgICAgICBvcENsaWVudC5leGVjdXRlKHRydWUpOwotCi0gICAgICAgICAgICBNZXNzYWdlQ29udGV4dCBtc2dDdHggPQotICAgICAgICAgICAgICAgICAgICBvcENsaWVudC5nZXRNZXNzYWdlQ29udGV4dChXU0RMQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfSU5fVkFMVUUpOwotICAgICAgICAgICAgcmV0dXJuIGdldFNPQVBNZXNzYWdlKG1zZ0N0eC5nZXRFbnZlbG9wZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTT0FQRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIGhhbmRsZXMgdGhlIGNvbnZlcnNpb24gb2YgYW4gT00gU09BUCBFbnZlbG9wZSB0byBhIFNBQUogU09BUE1lc3NhZ2UKLSAgICAgKgotICAgICAqIEBwYXJhbSByZXNwT01Tb2FwRW52Ci0gICAgICogQHJldHVybiB0aGUgU0FBSiBTT0FQTWVzc2FnZQotICAgICAqIEB0aHJvd3MgU09BUEV4Y2VwdGlvbiBJZiBhbiBleGNlcHRpb24gb2NjdXJzIGR1cmluZyB0aGlzIGNvbnZlcnNpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIFNPQVBNZXNzYWdlIGdldFNPQVBNZXNzYWdlKG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGUgcmVzcE9NU29hcEVudikKLSAgICAgICAgICAgIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLQotICAgICAgICAvLyBDcmVhdGUgdGhlIGJhc2ljIFNPQVAgTWVzc2FnZQotICAgICAgICBNZXNzYWdlRmFjdG9yeSBtZiA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIFNPQVBNZXNzYWdlIHJlc3BvbnNlID0gbWYuY3JlYXRlTWVzc2FnZSgpOwotICAgICAgICBTT0FQUGFydCBzUGFydCA9IHJlc3BvbnNlLmdldFNPQVBQYXJ0KCk7Ci0gICAgICAgIGphdmF4LnhtbC5zb2FwLlNPQVBFbnZlbG9wZSBlbnYgPSBzUGFydC5nZXRFbnZlbG9wZSgpOwotICAgICAgICBTT0FQQm9keSBib2R5ID0gZW52LmdldEJvZHkoKTsKLSAgICAgICAgU09BUEhlYWRlciBoZWFkZXIgPSBlbnYuZ2V0SGVhZGVyKCk7Ci0KLSAgICAgICAgLy8gQ29udmVydCBhbGwgaGVhZGVyIGJsb2NrcwotICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEhlYWRlciBoZWFkZXIyID0gcmVzcE9NU29hcEVudi5nZXRIZWFkZXIoKTsKLSAgICAgICAgaWYgKGhlYWRlcjIgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBoYkl0ZXIgPSBoZWFkZXIyLmV4YW1pbmVBbGxIZWFkZXJCbG9ja3MoKTsgaGJJdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICAvLyBDb252ZXJ0aW5nIGEgc2luZ2xlIE9NIFNPQVAgSGVhZGVyQmxvY2sgdG8gYSBTQUFKIFNPQVAKLSAgICAgICAgICAgICAgICAvLyBIZWFkZXJCbG9jawotICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQSGVhZGVyQmxvY2sgaGIgPSAob3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBIZWFkZXJCbG9jaykKLSAgICAgICAgICAgICAgICAgICAgICAgIGhiSXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgUU5hbWUgaGJRTmFtZSA9IGhiLmdldFFOYW1lKCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgU09BUEhlYWRlckVsZW1lbnQgaGVhZGVyRWxlID0gaGVhZGVyLmFkZEhlYWRlckVsZW1lbnQoZW52LmNyZWF0ZU5hbWUoaGJRTmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldExvY2FsUGFydCgpLCBoYlFOYW1lLmdldFByZWZpeCgpLCBoYlFOYW1lLmdldE5hbWVzcGFjZVVSSSgpKSk7Ci0gICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBhdHRyaWJJdGVyID0gaGIuZ2V0QWxsQXR0cmlidXRlcygpOyBhdHRyaWJJdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICAgICAgT01BdHRyaWJ1dGUgYXR0ciA9IChPTUF0dHJpYnV0ZSlhdHRyaWJJdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgUU5hbWUgYXR0clFOYW1lID0gYXR0ci5nZXRRTmFtZSgpOwotICAgICAgICAgICAgICAgICAgICBoZWFkZXJFbGUuYWRkQXR0cmlidXRlKGVudi5jcmVhdGVOYW1lKGF0dHJRTmFtZS5nZXRMb2NhbFBhcnQoKSwgYXR0clFOYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFByZWZpeCgpLCBhdHRyUU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpLCBhdHRyLmdldEF0dHJpYnV0ZVZhbHVlKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcm9sZSA9IGhiLmdldFJvbGUoKTsKLSAgICAgICAgICAgICAgICBpZiAocm9sZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGhlYWRlckVsZS5zZXRBY3Rvcihyb2xlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaGVhZGVyRWxlLnNldE11c3RVbmRlcnN0YW5kKGhiLmdldE11c3RVbmRlcnN0YW5kKCkpOwotCi0gICAgICAgICAgICAgICAgdG9TQUFKRWxlbWVudChoZWFkZXJFbGUsIGhiLCByZXNwb25zZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBDb252ZXJ0IHRoZSBib2R5Ci0gICAgICAgIHRvU0FBSkVsZW1lbnQoYm9keSwgcmVzcE9NU29hcEVudi5nZXRCb2R5KCksIHJlc3BvbnNlKTsKLSAgICAgICAgLy8gaWYgdGhlcmUgYXJlIHVucmVmZmVyZW5jZWQgYXR0YWNobWVudHMsIGFkZCB0aGF0IHRvIHJlc3BvbnNlCi0gICAgICAgIGlmICghdW5hY2Nlc3NlZEF0dGFjaG1lbnRzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgQ29sbGVjdGlvbiBhdHRhY2htZW50cyA9IHVuYWNjZXNzZWRBdHRhY2htZW50cy52YWx1ZXMoKTsKLSAgICAgICAgICAgIEl0ZXJhdG9yIGF0dGFjaGVtZW50c0l0ZXJhdG9yID0gYXR0YWNobWVudHMuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIHdoaWxlIChhdHRhY2hlbWVudHNJdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBBdHRhY2htZW50UGFydCBhdHRhY2htZW50ID0gKEF0dGFjaG1lbnRQYXJ0KWF0dGFjaGVtZW50c0l0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgICAgICByZXNwb25zZS5hZGRBdHRhY2htZW50UGFydChhdHRhY2htZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXNwb25zZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyBhbiBPTU5vZGUgaW50byBhIFNBQUogU09BUEVsZW1lbnQKLSAgICAgKgotICAgICAqIEBwYXJhbSBzYWFqRWxlCi0gICAgICogQHBhcmFtIG9tTm9kZQotICAgICAqIEBwYXJhbSBzYWFqU09BUE1zZwotICAgICAqIEB0aHJvd3MgU09BUEV4Y2VwdGlvbiBJZiBjb252ZXJzaW9uIGZhaWxzCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHRvU0FBSkVsZW1lbnQoU09BUEVsZW1lbnQgc2FhakVsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTU5vZGUgb21Ob2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zb2FwLlNPQVBNZXNzYWdlIHNhYWpTT0FQTXNnKSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgaWYgKG9tTm9kZSBpbnN0YW5jZW9mIE9NVGV4dCkgewotICAgICAgICAgICAgcmV0dXJuOyAvLyBzaW1wbHkgcmV0dXJuIHNpbmNlIHRoZSB0ZXh0IGhhcyBhbHJlYWR5IGJlZW4gYWRkZWQgdG8gc2FhakVsZQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG9tTm9kZSBpbnN0YW5jZW9mIE9NRWxlbWVudCkgewotICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlID0gKE9NRWxlbWVudClvbU5vZGU7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGNoaWxkSXRlciA9IG9tRWxlLmdldENoaWxkcmVuKCk7IGNoaWxkSXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgT01Ob2RlIG9tQ2hpbGROb2RlID0gKE9NTm9kZSljaGlsZEl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgIFNPQVBFbGVtZW50IHNhYWpDaGlsZEVsZSA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICBpZiAob21DaGlsZE5vZGUgaW5zdGFuY2VvZiBPTVRleHQpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgd2hldGhlciB0aGUgb210ZXh0IHJlZmVycyB0byBhbiBhdHRhY2htZW50Ci0KLSAgICAgICAgICAgICAgICAgICAgZmluYWwgT01UZXh0IG9tVGV4dCA9IChPTVRleHQpb21DaGlsZE5vZGU7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvbVRleHQuaXNPcHRpbWl6ZWQoKSkgeyAvLyBpcyB0aGlzIGFuIGF0dGFjaG1lbnQ/Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBEYXRhSGFuZGxlciBkYXRhaGFuZGxlciA9IChEYXRhSGFuZGxlcilvbVRleHQuZ2V0RGF0YUhhbmRsZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEF0dGFjaG1lbnRQYXJ0IGF0dGFjaG1lbnQgPSBzYWFqU09BUE1zZy5jcmVhdGVBdHRhY2htZW50UGFydChkYXRhaGFuZGxlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgaWQgPSBJREdlbmVyYXRvci5nZW5lcmF0ZUlEKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhdHRhY2htZW50LnNldENvbnRlbnRJZChpZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhdHRhY2htZW50LnNldENvbnRlbnRUeXBlKGRhdGFoYW5kbGVyLmdldENvbnRlbnRUeXBlKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2FhalNPQVBNc2cuYWRkQXR0YWNobWVudFBhcnQoYXR0YWNobWVudCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHNhYWpFbGUuYWRkQXR0cmlidXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYWFqU09BUE1zZy5nZXRTT0FQUGFydCgpLmdldEVudmVsb3BlKCkuY3JlYXRlTmFtZSgiaHJlZiIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2lkOiIgKyBpZCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzYWFqQ2hpbGRFbGUgPSBzYWFqRWxlLmFkZFRleHROb2RlKG9tVGV4dC5nZXRUZXh0KCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvbUNoaWxkTm9kZSBpbnN0YW5jZW9mIE9NRWxlbWVudCkgewotICAgICAgICAgICAgICAgICAgICBPTUVsZW1lbnQgb21DaGlsZEVsZSA9IChPTUVsZW1lbnQpb21DaGlsZE5vZGU7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFFOYW1lIG9tQ2hpbGRRTmFtZSA9IG9tQ2hpbGRFbGUuZ2V0UU5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgc2FhakNoaWxkRWxlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYWFqRWxlLmFkZENoaWxkRWxlbWVudChvbUNoaWxkUU5hbWUuZ2V0TG9jYWxQYXJ0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb21DaGlsZFFOYW1lLmdldFByZWZpeCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9tQ2hpbGRRTmFtZS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgYXR0cmliSXRlciA9IG9tQ2hpbGRFbGUuZ2V0QWxsQXR0cmlidXRlcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYkl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgICAgICAgICAgT01BdHRyaWJ1dGUgYXR0ciA9IChPTUF0dHJpYnV0ZSlhdHRyaWJJdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFFOYW1lIGF0dHJRTmFtZSA9IGF0dHIuZ2V0UU5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNhYWpDaGlsZEVsZS5hZGRBdHRyaWJ1dGUoc2FhalNPQVBNc2cuZ2V0U09BUFBhcnQoKS5nZXRFbnZlbG9wZSgpLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVOYW1lKGF0dHJRTmFtZS5nZXRMb2NhbFBhcnQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyUU5hbWUuZ2V0UHJlZml4KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0clFOYW1lLmdldE5hbWVzcGFjZVVSSSgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ci5nZXRBdHRyaWJ1dGVWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIGdvIGRvd24gdGhlIHRyZWUgYWRkaW5nIGNoaWxkIGVsZW1lbnRzLCB0aWxsIHUgcmVhY2ggYSBsZWFmKGkuZS4gdGV4dCBlbGVtZW50KQotICAgICAgICAgICAgICAgIHRvU0FBSkVsZW1lbnQoc2FhakNoaWxkRWxlLCBvbUNoaWxkTm9kZSwgc2FhalNPQVBNc2cpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgYSBTQUFKIFNPQVBNZXNzYWdlIHRvIGFuIE9NIFNPQVBFbnZlbG9wZQotICAgICAqCi0gICAgICogQHBhcmFtIHNhYWpTT0FQTXNnCi0gICAgICogQHJldHVybgotICAgICAqIEB0aHJvd3MgU09BUEV4Y2VwdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlIHRvT01TT0FQRW52ZWxvcGUoU09BUE1lc3NhZ2Ugc2FhalNPQVBNc2cpCi0gICAgICAgICAgICB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZSBvbVNPQVBFbnYgPQotICAgICAgICAgICAgICAgIFNBQUpVdGlsLnRvT01TT0FQRW52ZWxvcGUoc2FhalNPQVBNc2cuZ2V0U09BUFBhcnQoKS5nZXREb2N1bWVudEVsZW1lbnQoKSk7Ci0KLQotICAgICAgICBNYXAgYXR0YWNobWVudE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIGZpbmFsIEl0ZXJhdG9yIGF0dGFjaG1lbnRzID0gc2FhalNPQVBNc2cuZ2V0QXR0YWNobWVudHMoKTsKLSAgICAgICAgd2hpbGUgKGF0dGFjaG1lbnRzLmhhc05leHQoKSkgewotICAgICAgICAgICAgZmluYWwgQXR0YWNobWVudFBhcnQgYXR0YWNobWVudCA9IChBdHRhY2htZW50UGFydClhdHRhY2htZW50cy5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAoYXR0YWNobWVudC5nZXRDb250ZW50SWQoKSA9PSBudWxsIHx8Ci0gICAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnQuZ2V0Q29udGVudElkKCkudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICBhdHRhY2htZW50LnNldENvbnRlbnRJZChJREdlbmVyYXRvci5nZW5lcmF0ZUlEKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGF0dGFjaG1lbnQuZ2V0RGF0YUhhbmRsZXIoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNPQVBFeGNlcHRpb24oIkF0dGFjaG1lbnQgd2l0aCBOVUxMIERhdGFIYW5kbGVyIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhdHRhY2htZW50TWFwLnB1dChhdHRhY2htZW50LmdldENvbnRlbnRJZCgpLCBhdHRhY2htZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vR2V0IGtleXMgb2YgYXR0YWNobWVudHMgdG8gYSBoYXNobWFwCi0gICAgICAgIC8vVGhpcyBoYXNobWFwIHdpbGwgYmUgdXBkYXRlZCB3aGVuIGF0dGFjaG1lbnQgaXMgYWNjZXNzZWQgYXRsZWFzdCBvbmNlLgotICAgICAgICAvL0RvaW5nIHRoaXMgaGVyZSBpbnN0ZWFkIG9mIGluc2lkZSBpbnNlcnRBdHRhY2htZW50Tm9kZXMoKWlzIG11Y2ggc2ltcGxlcgotICAgICAgICAvL2FzIGluc2VydEF0dGFjaG1lbnROb2RlcygpIGhhcyByZWN1cnNpdmUgY2FsbHMKLSAgICAgICAgU2V0IGtleVNldCA9IGF0dGFjaG1lbnRNYXAua2V5U2V0KCk7Ci0gICAgICAgIEl0ZXJhdG9yIGtleVNldEl0ciA9IGtleVNldC5pdGVyYXRvcigpOwotICAgICAgICBIYXNoTWFwIGtleUFjY2Vzc1N0YXR1cyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIHdoaWxlIChrZXlTZXRJdHIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBTdHJpbmcga2V5ID0gKFN0cmluZylrZXlTZXRJdHIubmV4dCgpOwotICAgICAgICAgICAga2V5QWNjZXNzU3RhdHVzLnB1dChrZXksICJub3QtYWNjZXNzZWQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGluc2VydEF0dGFjaG1lbnROb2RlcyhhdHRhY2htZW50TWFwLCBvbVNPQVBFbnYsIGtleUFjY2Vzc1N0YXR1cyk7Ci0gICAgICAgIHVuYWNjZXNzZWRBdHRhY2htZW50cyA9Ci0gICAgICAgICAgICAgICAgZ2V0VW5SZWZlcmVuY2VkQXR0YWNobWVudE5vZGVzKGF0dGFjaG1lbnRNYXAsIG9tU09BUEVudiwga2V5QWNjZXNzU3RhdHVzKTsKLQotICAgICAgICByZXR1cm4gb21TT0FQRW52OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluc2VydHMgdGhlIGF0dGFjaG1lbnRzIGluIHRoZSBwcm9wZXIgcGxhY2VzCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYXR0YWNobWVudHMKLSAgICAgKiBAcGFyYW0gb21FbnZlbG9wZQotICAgICAqIEB0aHJvd3MgU09BUEV4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBpbnNlcnRBdHRhY2htZW50Tm9kZXMoTWFwIGF0dGFjaG1lbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01FbGVtZW50IG9tRW52ZWxvcGUsIEhhc2hNYXAga2V5QWNjZXNzU3RhdHVzKQotICAgICAgICAgICAgdGhyb3dzIFNPQVBFeGNlcHRpb24gewotCi0gICAgICAgIEl0ZXJhdG9yIGNoaWxkSXRlciA9IG9tRW52ZWxvcGUuZ2V0Q2hpbGRFbGVtZW50cygpOwotICAgICAgICB3aGlsZSAoY2hpbGRJdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgT01FbGVtZW50IGNoaWxkID0gKE9NRWxlbWVudCljaGlsZEl0ZXIubmV4dCgpOwotICAgICAgICAgICAgZmluYWwgT01BdHRyaWJ1dGUgaHJlZkF0dHIgPSBjaGlsZC5nZXRBdHRyaWJ1dGUobmV3IFFOYW1lKCJocmVmIikpOwotICAgICAgICAgICAgU3RyaW5nIGNvbnRlbnRJRCA9IGdldENvbnRlbnRJRChocmVmQXR0cik7Ci0KLSAgICAgICAgICAgIGlmIChjb250ZW50SUQgIT0gbnVsbCkgey8vVGhpcyBpcyBhbiBvbUVudmVsb3BlIHJlZmVyZW5jaW5nIGFuIGF0dGFjaG1lbnQKLSAgICAgICAgICAgICAgICBjaGlsZC5idWlsZCgpOwotICAgICAgICAgICAgICAgIEF0dGFjaG1lbnRQYXJ0IGFwID0gKChBdHRhY2htZW50UGFydClhdHRhY2htZW50cy5nZXQoY29udGVudElELnRyaW0oKSkpOwotICAgICAgICAgICAgICAgIC8vdXBkYXRlIHRoZSBrZXkgc3RhdHVzIGFzIGFjY2Vzc2VkCi0gICAgICAgICAgICAgICAga2V5QWNjZXNzU3RhdHVzLnB1dChjb250ZW50SUQudHJpbSgpLCAiYWNjZXNzZWQiKTsKLSAgICAgICAgICAgICAgICBPTVRleHQgdGV4dCA9IG5ldyBPTVRleHRJbXBsKGFwLmdldERhdGFIYW5kbGVyKCksIHRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbUVudmVsb3BlLmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgICAgICAgICBjaGlsZC5yZW1vdmVBdHRyaWJ1dGUoaHJlZkF0dHIpOwotICAgICAgICAgICAgICAgIGNoaWxkLmFkZENoaWxkKHRleHQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvL3Bvc3NpYmx5IHRoZXJlIGNhbiBiZSByZWZlcmVuY2VzIGluIHRoZSBjaGlsZHJlbiBvZiB0aGlzIG9tRW52ZWxvcGUKLSAgICAgICAgICAgICAgICAvL3NvIHJlY3Vyc2UgdGhyb3VnaC4KLSAgICAgICAgICAgICAgICBpbnNlcnRBdHRhY2htZW50Tm9kZXMoYXR0YWNobWVudHMsIGNoaWxkLCBrZXlBY2Nlc3NTdGF0dXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICBwcml2YXRlIEhhc2hNYXAgZ2V0VW5SZWZlcmVuY2VkQXR0YWNobWVudE5vZGVzKE1hcCBhdHRhY2htZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NRWxlbWVudCBvbUVudmVsb3BlLCBIYXNoTWFwIGtleUFjY2Vzc1N0YXR1cykKLSAgICAgICAgICAgIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLQotICAgICAgICBIYXNoTWFwIHVuYWNjZXNzZWRBdHRhY2htZW50cyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIC8vbm93IGNoZWNrIGZvciB1bmFjY2Vzc2VkIGtleXMKLSAgICAgICAgU2V0IGtleVNldCA9IGtleUFjY2Vzc1N0YXR1cy5rZXlTZXQoKTsKLSAgICAgICAgSXRlcmF0b3Iga2V5U2V0SXRyID0ga2V5U2V0Lml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChrZXlTZXRJdHIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBTdHJpbmcga2V5ID0gKFN0cmluZylrZXlTZXRJdHIubmV4dCgpOwotICAgICAgICAgICAgU3RyaW5nIGtleVN0YXR1cyA9IChTdHJpbmcpa2V5QWNjZXNzU3RhdHVzLmdldChrZXkpOwotICAgICAgICAgICAgaWYgKCJub3QtYWNjZXNzZWQiLmVxdWFscyhrZXlTdGF0dXMpKSB7Ci0gICAgICAgICAgICAgICAgLy9UaGUgdmFsdWUgZm9yIHRoaXMga2V5IGhhcyBub3QgYmVlbiBhY2Nlc3NlZCBpbiB0aGUKLSAgICAgICAgICAgICAgICAvL3JlZmVyZW5jaW5nIGF0dGFjaG1lbnQgc2NlbmFyaW8uSGVuY2UgaXQgbXVzdCBiZSBhbgotICAgICAgICAgICAgICAgIC8vdW5yZWZlcmVuY2VkIG9uZS4KLSAgICAgICAgICAgICAgICBBdHRhY2htZW50UGFydCBhcCA9ICgoQXR0YWNobWVudFBhcnQpYXR0YWNobWVudHMuZ2V0KGtleSkpOwotICAgICAgICAgICAgICAgIHVuYWNjZXNzZWRBdHRhY2htZW50cy5wdXQoa2V5LCBhcCk7Ci0gICAgICAgICAgICAgICAga2V5QWNjZXNzU3RhdHVzLnB1dChrZXksICJhY2Nlc3NlZCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB1bmFjY2Vzc2VkQXR0YWNobWVudHM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgY2hlY2tzIHRoZSB2YWx1ZSBvZiBhdHRyaWJ1dGUgYW5kIGlmIGl0IGlzIGEgdmFsaWQgQ0lEIHRoZW4gcmV0dXJucyB0aGUgY29udGVudElECi0gICAgICogKHdpdGggY2lkOiBwcmVmaXggc3RyaXBwZWQgb2ZmKSBvciBlbHNlIHJldHVybnMgbnVsbC4gQSBudWxsIHJldHVybiB2YWx1ZSBjYW4gYmUgYXNzdW1lZCB0aGF0Ci0gICAgICogdGhpcyBhdHRyaWJ1dGUgaXMgbm90IGFuIGF0dGFjaG1lbnQgcmVmZXJlbmNpbmcgYXR0cmlidXRlCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBDb250ZW50SUQKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBnZXRDb250ZW50SUQoT01BdHRyaWJ1dGUgYXR0cikgewotICAgICAgICBTdHJpbmcgY29udGVudElkOwotICAgICAgICBpZiAoYXR0ciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjb250ZW50SWQgPSBhdHRyLmdldEF0dHJpYnV0ZVZhbHVlKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjb250ZW50SWQuc3RhcnRzV2l0aCgiY2lkOiIpKSB7Ci0gICAgICAgICAgICBjb250ZW50SWQgPSBjb250ZW50SWQuc3Vic3RyaW5nKDQpOwotICAgICAgICAgICAgcmV0dXJuIGNvbnRlbnRJZDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKiogb3ZlcnJpZGVkIFNPQVBDb25uZWN0aW9uJ3MgZ2V0KCkgbWV0aG9kICovCi0KLSAgICBwdWJsaWMgU09BUE1lc3NhZ2UgZ2V0KE9iamVjdCB0bykgdGhyb3dzIFNPQVBFeGNlcHRpb24gewotICAgICAgICBVUkwgdXJsID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHVybCA9ICh0byBpbnN0YW5jZW9mIFVSTCkgPyAoVVJMKXRvIDogbmV3IFVSTCh0by50b1N0cmluZygpKTsKLSAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTT0FQRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IHJlc3BvbnNlQ29kZTsKLSAgICAgICAgYm9vbGVhbiBpc0ZhaWx1cmUgPSBmYWxzZTsKLSAgICAgICAgSHR0cFVSTENvbm5lY3Rpb24gaHR0cENvbiA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBodHRwQ29uID0gKEh0dHBVUkxDb25uZWN0aW9uKXVybC5vcGVuQ29ubmVjdGlvbigpOwotICAgICAgICAgICAgaHR0cENvbi5zZXREb091dHB1dCh0cnVlKTsKLSAgICAgICAgICAgIGh0dHBDb24uc2V0RG9JbnB1dCh0cnVlKTsKLSAgICAgICAgICAgIGh0dHBDb24uc2V0VXNlQ2FjaGVzKGZhbHNlKTsKLSAgICAgICAgICAgIGh0dHBDb24uc2V0UmVxdWVzdE1ldGhvZCgiR0VUIik7Ci0gICAgICAgICAgICBIdHRwVVJMQ29ubmVjdGlvbi5zZXRGb2xsb3dSZWRpcmVjdHModHJ1ZSk7Ci0KLSAgICAgICAgICAgIGh0dHBDb24uY29ubmVjdCgpOwotICAgICAgICAgICAgcmVzcG9uc2VDb2RlID0gaHR0cENvbi5nZXRSZXNwb25zZUNvZGUoKTsKLSAgICAgICAgICAgIC8vIDUwMCBpcyBhbGxvd2VkIGZvciBTT0FQIGZhdWx0cwotICAgICAgICAgICAgaWYgKHJlc3BvbnNlQ29kZSA9PSBIdHRwVVJMQ29ubmVjdGlvbi5IVFRQX0lOVEVSTkFMX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgaXNGYWlsdXJlID0gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoKHJlc3BvbnNlQ29kZSAvIDEwMCkgIT0gMikgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBTT0FQRXhjZXB0aW9uKCJFcnJvciByZXNwb25zZTogKCIgKyByZXNwb25zZUNvZGUKLSAgICAgICAgICAgICAgICAgICAgICAgICsgaHR0cENvbi5nZXRSZXNwb25zZU1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTT0FQRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy9Db25zdHJ1Y3QgdGhlIHNvYXBtZXNzYWdlIGZyb20gaHR0cCByZXNwb25zZQotICAgICAgICBTT0FQTWVzc2FnZSBzb2FwTWVzc2FnZSA9IG51bGw7Ci0gICAgICAgIGlmIChyZXNwb25zZUNvZGUgPT0gSHR0cFVSTENvbm5lY3Rpb24uSFRUUF9PSykgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAvL3JlYWQgaHR0cCBoZWFkZXJzICYgbG9hZCBtaW1laGVhZGVycwotICAgICAgICAgICAgICAgIE1pbWVIZWFkZXJzIG1pbWVIZWFkZXJzID0gbmV3IE1pbWVIZWFkZXJzKCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGtleSwgdmFsdWU7Ci0gICAgICAgICAgICAgICAgLy8gc2tpcCBzdGF0dXMgbGluZQotICAgICAgICAgICAgICAgIGludCBpID0gMTsKLSAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgICAgICAgICBrZXkgPSBodHRwQ29uLmdldEhlYWRlckZpZWxkS2V5KGkpOwotICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGh0dHBDb24uZ2V0SGVhZGVyRmllbGQoaSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChrZXkgPT0gbnVsbCAmJiB2YWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChrZXkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nVG9rZW5pemVyIHZhbHVlcyA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodmFsdWUsICIsIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAodmFsdWVzLmhhc01vcmVUb2tlbnMoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbWVIZWFkZXJzLmFkZEhlYWRlcihrZXksIHZhbHVlcy5uZXh0VG9rZW4oKS50cmltKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gaHR0cElucHV0U3RyZWFtOwotICAgICAgICAgICAgICAgIGlmIChpc0ZhaWx1cmUpIHsKLSAgICAgICAgICAgICAgICAgICAgaHR0cElucHV0U3RyZWFtID0gaHR0cENvbi5nZXRFcnJvclN0cmVhbSgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGh0dHBJbnB1dFN0cmVhbSA9IGh0dHBDb24uZ2V0SW5wdXRTdHJlYW0oKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBzb2FwTWVzc2FnZSA9IG5ldyBTT0FQTWVzc2FnZUltcGwoaHR0cElucHV0U3RyZWFtLCBtaW1lSGVhZGVycyk7Ci0gICAgICAgICAgICAgICAgaHR0cElucHV0U3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgaHR0cENvbi5kaXNjb25uZWN0KCk7Ci0KLSAgICAgICAgICAgIH0gY2F0Y2ggKFNPQVBFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBTT0FQRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc29hcE1lc3NhZ2U7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYWFqL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NhYWovU09BUEVsZW1lbnRJbXBsLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9zYWFqL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NhYWovU09BUEVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0OGY5OWQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2Fhai9zcmMvb3JnL2FwYWNoZS9heGlzMi9zYWFqL1NPQVBFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQ1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zYWFqOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQ29udGFpbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTm9kZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuT01OYW1lc3BhY2VJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5kb20uRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmRvbS5Ob2RlSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuZG9tLlRleHRJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQMTFDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVAxMkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuaW1wbC5kb20uc29hcDExLlNPQVAxMUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLmltcGwuZG9tLnNvYXAxMi5TT0FQMTJGYWN0b3J5OwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuRGV0YWlsOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLk5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEJvZHk7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUENvbnN0YW50czsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRW52ZWxvcGU7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRmF1bHQ7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEZhdWx0RWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQSGVhZGVyOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBTT0FQRWxlbWVudEltcGwgZXh0ZW5kcyBOb2RlSW1wbEV4IGltcGxlbWVudHMgU09BUEVsZW1lbnQgewotCi0gICAgLyoqCi0gICAgICogVXNpbmcgYSBkZWxlZ2F0ZSBiZWNhdXNlIHdlIGNhbid0IGV4dGVuZCBmcm9tIG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5kb20uRWxlbWVudEltcGwgc2luY2UKLSAgICAgKiB0aGlzIGNsYXNzIG11c3QgZXh0ZW5kIFNOb2RlSW1wbAotICAgICAqLwotICAgIHByb3RlY3RlZCBFbGVtZW50SW1wbCBlbGVtZW50OwotICAgIHByaXZhdGUgU3RyaW5nIGVuY29kaW5nU3R5bGU7Ci0KLSAgICBwdWJsaWMgU09BUEVsZW1lbnRJbXBsKEVsZW1lbnRJbXBsIGVsZW1lbnQpIHsKLSAgICAgICAgc3VwZXIoZWxlbWVudC5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpb20ub20uT01Ob2RlI2Rpc2NhcmQoKQotICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkaXNjYXJkKCkgdGhyb3dzIE9NRXhjZXB0aW9uIHsKLSAgICAgICAgZWxlbWVudC5kaXNjYXJkKCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbnRlcm5hbFNlcmlhbGl6ZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB3cml0ZXIpCi0gICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgZWxlbWVudC5pbnRlcm5hbFNlcmlhbGl6ZSh3cml0ZXIpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTm9kZSNzZXJpYWxpemVBbmRDb25zdW1lKG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5PTU91dHB1dEltcGwpCi0gICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGludGVybmFsU2VyaWFsaXplQW5kQ29uc3VtZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB3cml0ZXIpCi0gICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgZWxlbWVudC5pbnRlcm5hbFNlcmlhbGl6ZUFuZENvbnN1bWUod3JpdGVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGFuIGF0dHJpYnV0ZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBhbmQgdmFsdWUgdG8gdGhpcyA8Y29kZT5TT0FQRWxlbWVudDwvY29kZT4gb2JqZWN0LgotICAgICAqIDxwLz4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lICBhIDxjb2RlPk5hbWU8L2NvZGU+IG9iamVjdCB3aXRoIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUKLSAgICAgKiBAcGFyYW0gdmFsdWUgYSA8Y29kZT5TdHJpbmc8L2NvZGU+IGdpdmluZyB0aGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZQotICAgICAqIEByZXR1cm4gdGhlIDxjb2RlPlNPQVBFbGVtZW50PC9jb2RlPiBvYmplY3QgaW50byB3aGljaCB0aGUgYXR0cmlidXRlIHdhcyBpbnNlcnRlZAotICAgICAqIEB0aHJvd3MgU09BUEV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhbiBlcnJvciBpbiBjcmVhdGluZyB0aGUgQXR0cmlidXRlCi0gICAgICovCi0gICAgcHVibGljIFNPQVBFbGVtZW50IGFkZEF0dHJpYnV0ZShOYW1lIG5hbWUsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIFNPQVBFeGNlcHRpb24gewotICAgICAgICBpZiAobmFtZS5nZXRVUkkoKSA9PSBudWxsIHx8IG5hbWUuZ2V0VVJJKCkudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKG5hbWUuZ2V0TG9jYWxOYW1lKCksIHZhbHVlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlTlMobmFtZS5nZXRVUkkoKSwgbmFtZS5nZXRQcmVmaXgoKSArICI6IiArIG5hbWUuZ2V0TG9jYWxOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgamF2YXgueG1sLnNvYXAuU09BUEVsZW1lbnQjYWRkQ2hpbGRFbGVtZW50KGphdmF4LnhtbC5zb2FwLk5hbWUpCi0gICAgICAqLwotICAgIHB1YmxpYyBTT0FQRWxlbWVudCBhZGRDaGlsZEVsZW1lbnQoTmFtZSBuYW1lKSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBwcmVmaXggPSBuYW1lLmdldFByZWZpeCgpOwotICAgICAgICByZXR1cm4gYWRkQ2hpbGRFbGVtZW50KG5hbWUuZ2V0TG9jYWxOYW1lKCksICIiLmVxdWFscyhwcmVmaXgpID8gbnVsbCA6IHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLmdldFVSSSgpKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgamF2YXgueG1sLnNvYXAuU09BUEVsZW1lbnQjYWRkQ2hpbGRFbGVtZW50KGphdmF4LnhtbC5zb2FwLlNPQVBFbGVtZW50KQotICAgICAgKi8KLSAgICBwdWJsaWMgU09BUEVsZW1lbnQgYWRkQ2hpbGRFbGVtZW50KFNPQVBFbGVtZW50IHNvYXBFbGVtZW50KSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBuYW1lc3BhY2VVUkkgPSBzb2FwRWxlbWVudC5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgU3RyaW5nIHByZWZpeCA9IHNvYXBFbGVtZW50LmdldFByZWZpeCgpOwotICAgICAgICBTdHJpbmcgbG9jYWxOYW1lID0gc29hcEVsZW1lbnQuZ2V0TG9jYWxOYW1lKCk7Ci0KLSAgICAgICAgU09BUEVsZW1lbnRJbXBsIGNoaWxkRWxlOyAgICAgICAgCi0gICAgICAgIGlmIChuYW1lc3BhY2VVUkkgPT0gbnVsbCB8fCBuYW1lc3BhY2VVUkkudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIGNoaWxkRWxlID0gIG5ldyBTT0FQRWxlbWVudEltcGwoKEVsZW1lbnRJbXBsKWdldE93bmVyRG9jdW1lbnQoKS5jcmVhdGVFbGVtZW50KGxvY2FsTmFtZSkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZWxlbWVudC5kZWNsYXJlTmFtZXNwYWNlKG5hbWVzcGFjZVVSSSwgcHJlZml4KTsKLSAgICAgICAgICAgIGNoaWxkRWxlID0KLSAgICAgICAgICAgICAgICBuZXcgU09BUEVsZW1lbnRJbXBsKChFbGVtZW50SW1wbClnZXRPd25lckRvY3VtZW50KCkuY3JlYXRlRWxlbWVudE5TKG5hbWVzcGFjZVVSSSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsTmFtZSkpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzb2FwRWxlbWVudC5nZXRBbGxBdHRyaWJ1dGVzKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgTmFtZSBuYW1lID0gKE5hbWUpaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBjaGlsZEVsZS5hZGRBdHRyaWJ1dGUobmFtZSwgc29hcEVsZW1lbnQuZ2V0QXR0cmlidXRlVmFsdWUobmFtZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gc29hcEVsZW1lbnQuZ2V0Q2hpbGRFbGVtZW50cygpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIE9iamVjdCBvID0gaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAobyBpbnN0YW5jZW9mIFRleHQpIHsKLSAgICAgICAgICAgICAgICBjaGlsZEVsZS5hZGRUZXh0Tm9kZSgoKFRleHQpbykuZ2V0RGF0YSgpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgY2hpbGRFbGUuYWRkQ2hpbGRFbGVtZW50KChTT0FQRWxlbWVudClvKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGNoaWxkRWxlLmVsZW1lbnQuc2V0VXNlckRhdGEoU0FBSl9OT0RFLCBjaGlsZEVsZSwgbnVsbCk7Ci0gICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCAmJiBuYW1lc3BhY2VVUkkudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgY2hpbGRFbGUuZWxlbWVudC5zZXROYW1lc3BhY2UoY2hpbGRFbGUuZWxlbWVudC5kZWNsYXJlTmFtZXNwYWNlKG5hbWVzcGFjZVVSSSwgcHJlZml4KSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxlbWVudC5hcHBlbmRDaGlsZChjaGlsZEVsZS5lbGVtZW50KTsKLSAgICAgICAgKChOb2RlSW1wbCljaGlsZEVsZS5lbGVtZW50LmdldFBhcmVudE5vZGUoKSkuc2V0VXNlckRhdGEoU0FBSl9OT0RFLCB0aGlzLCBudWxsKTsKLSAgICAgICAgY2hpbGRFbGUuc2V0UGFyZW50RWxlbWVudCh0aGlzKTsKLSAgICAgICAgcmV0dXJuIGNoaWxkRWxlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxOYW1lKCkgewotICAgICAgICByZXR1cm4gZWxlbWVudC5nZXRMb2NhbE5hbWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVVSSSgpIHsKLSAgICAgICAgcmV0dXJuIGVsZW1lbnQuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAqIE92ZXJpZGRlbiBpbiBFbGVtZW50SW1wbCBhbmQgQXR0ckltcGwuCi0gICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByZWZpeCgpIHsKLSAgICAgICAgcmV0dXJuIGVsZW1lbnQuZ2V0UHJlZml4KCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICogQHNlZSBqYXZheC54bWwuc29hcC5TT0FQRWxlbWVudCNhZGRDaGlsZEVsZW1lbnQoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLSAgICAqLwotICAgIHB1YmxpYyBTT0FQRWxlbWVudCBhZGRDaGlsZEVsZW1lbnQoU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHByZWZpeCwgU3RyaW5nIHVyaSkKLSAgICAgICAgICAgIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLSAgICAgICAgT01OYW1lc3BhY2Ugb21OYW1lc3BhY2UgPSBlbGVtZW50LmRlY2xhcmVOYW1lc3BhY2UodXJpLCBwcmVmaXgpOwotICAgICAgICByZXR1cm4gYWRkQ2hpbGRFbGVtZW50KGxvY2FsTmFtZSwgb21OYW1lc3BhY2UuZ2V0UHJlZml4KCkpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBqYXZheC54bWwuc29hcC5TT0FQRWxlbWVudCNhZGRDaGlsZEVsZW1lbnQoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLSAgICAgICovCi0gICAgcHVibGljIFNPQVBFbGVtZW50IGFkZENoaWxkRWxlbWVudChTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcHJlZml4KSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBuYW1lc3BhY2VVUkkgPSBnZXROYW1lc3BhY2VVUkkocHJlZml4KTsKLQotICAgICAgICBpZiAobmFtZXNwYWNlVVJJID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTT0FQRXhjZXB0aW9uKCJOYW1lc3BhY2Ugbm90IGRlY2xhcmVkIGZvciB0aGUgZ2l2ZSBwcmVmaXg6ICIgKyBwcmVmaXgpOwotICAgICAgICB9Ci0KLSAgICAgICAgU09BUEVsZW1lbnRJbXBsIGNoaWxkRWxlID0KLSAgICAgICAgICAgICAgICBuZXcgU09BUEVsZW1lbnRJbXBsKChFbGVtZW50SW1wbClnZXRPd25lckRvY3VtZW50KCkuCi0gICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVFbGVtZW50TlMobmFtZXNwYWNlVVJJLCBwcmVmaXggKyAiOiIgKyBsb2NhbE5hbWUpKTsKLQotICAgICAgICBjaGlsZEVsZS5lbGVtZW50LnNldFVzZXJEYXRhKFNBQUpfTk9ERSwgY2hpbGRFbGUsIG51bGwpOwotICAgICAgICBjaGlsZEVsZS5lbGVtZW50LnNldE5hbWVzcGFjZShjaGlsZEVsZS5lbGVtZW50LmRlY2xhcmVOYW1lc3BhY2UobmFtZXNwYWNlVVJJLCBwcmVmaXgpKTsKLSAgICAgICAgZWxlbWVudC5hcHBlbmRDaGlsZChjaGlsZEVsZS5lbGVtZW50KTsKLSAgICAgICAgKChOb2RlSW1wbCljaGlsZEVsZS5lbGVtZW50LmdldFBhcmVudE5vZGUoKSkuc2V0VXNlckRhdGEoU0FBSl9OT0RFLCB0aGlzLCBudWxsKTsKLSAgICAgICAgY2hpbGRFbGUuc2V0UGFyZW50RWxlbWVudCh0aGlzKTsKLSAgICAgICAgcmV0dXJuIGNoaWxkRWxlOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBqYXZheC54bWwuc29hcC5TT0FQRWxlbWVudCNhZGRDaGlsZEVsZW1lbnQoamF2YS5sYW5nLlN0cmluZykKLSAgICAgICovCi0gICAgcHVibGljIFNPQVBFbGVtZW50IGFkZENoaWxkRWxlbWVudChTdHJpbmcgbG9jYWxOYW1lKSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7Ci0gICAgICAgIFNPQVBFbGVtZW50SW1wbCBjaGlsZEVsZSA9Ci0gICAgICAgICAgICAgICAgbmV3IFNPQVBFbGVtZW50SW1wbCgoRWxlbWVudEltcGwpZ2V0T3duZXJEb2N1bWVudCgpLmNyZWF0ZUVsZW1lbnQobG9jYWxOYW1lKSk7Ci0gICAgICAgIGNoaWxkRWxlLmVsZW1lbnQuc2V0VXNlckRhdGEoU0FBSl9OT0RFLCBjaGlsZEVsZSwgbnVsbCk7Ci0gICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQoY2hpbGRFbGUuZWxlbWVudCk7Ci0gICAgICAgICgoTm9kZUltcGwpY2hpbGRFbGUuZWxlbWVudC5nZXRQYXJlbnROb2RlKCkpLnNldFVzZXJEYXRhKFNBQUpfTk9ERSwgdGhpcywgbnVsbCk7Ci0gICAgICAgIGNoaWxkRWxlLnNldFBhcmVudEVsZW1lbnQodGhpcyk7Ci0gICAgICAgIHJldHVybiBjaGlsZEVsZTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgamF2YXgueG1sLnNvYXAuU09BUEVsZW1lbnQjYWRkTmFtZXNwYWNlRGVjbGFyYXRpb24oamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLSAgICAgICovCi0gICAgcHVibGljIFNPQVBFbGVtZW50IGFkZE5hbWVzcGFjZURlY2xhcmF0aW9uKFN0cmluZyBwcmVmaXgsIFN0cmluZyB1cmkpIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLSAgICAgICAgZWxlbWVudC5kZWNsYXJlTmFtZXNwYWNlKHVyaSwgcHJlZml4KTsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5UZXh0PC9jb2RlPiBvYmplY3QgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgZ2l2ZW4gPGNvZGU+U3RyaW5nPC9jb2RlPiBhbmQKLSAgICAgKiBhZGRzIGl0IHRvIHRoaXMgPGNvZGU+U09BUEVsZW1lbnQ8L2NvZGU+IG9iamVjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0ZXh0IGEgPGNvZGU+U3RyaW5nPC9jb2RlPiBvYmplY3Qgd2l0aCB0aGUgdGV4dHVhbCBjb250ZW50IHRvIGJlIGFkZGVkCi0gICAgICogQHJldHVybiB0aGUgPGNvZGU+U09BUEVsZW1lbnQ8L2NvZGU+IG9iamVjdCBpbnRvIHdoaWNoIHRoZSBuZXcgPGNvZGU+VGV4dDwvY29kZT4gb2JqZWN0IHdhcwotICAgICAqICAgICAgICAgaW5zZXJ0ZWQKLSAgICAgKiBAdGhyb3dzIFNPQVBFeGNlcHRpb24gaWYgdGhlcmUgaXMgYW4gZXJyb3IgaW4gY3JlYXRpbmcgdGhlIG5ldyA8Y29kZT5UZXh0PC9jb2RlPiBvYmplY3QKLSAgICAgKi8KLSAgICBwdWJsaWMgU09BUEVsZW1lbnQgYWRkVGV4dE5vZGUoU3RyaW5nIHRleHQpIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLSAgICAgICAgLy9PbUVsZW1lbnQuc2V0VGV4dCgpIHdpbGwgcmVtb3ZlIGFsbCB0aGUgb3RoZXIgdGV4dCBub2RlcyB0aGF0IGl0IGNvbnRhaW5zCi0gICAgICAgIC8vVGhlcmVmb3JlIGNyZWF0ZSBhIHRleHQgbm9kZSBhbmQgYWRkIGl0Ci0gICAgICAgIC8vVE9ETzogTWF5IG5lZWQgdG8gYWRkcmVzcyB0aGUgc2l0dWF0aW9uIHdoZXJlIHRoZSBwcmV2IHNpYmxpbmcgb2YgdGhlIHRleHRub2RlIGl0c2VsZiBpcyBhIHRleHRub2RlCi0gICAgICAgIFRleHQgdGV4dE5vZGUgPSBnZXRPd25lckRvY3VtZW50KCkuY3JlYXRlVGV4dE5vZGUodGV4dCk7Ci0gICAgICAgIE5vZGVJbXBsIG5vZGUgPSAoKE5vZGVJbXBsKWVsZW1lbnQuYXBwZW5kQ2hpbGQodGV4dE5vZGUpKTsKLSAgICAgICAgVGV4dEltcGxFeCBzYWFqVGV4dE5vZGUgPSBuZXcgVGV4dEltcGxFeCh0ZXh0LCB0aGlzKTsKLSAgICAgICAgbm9kZS5zZXRVc2VyRGF0YShTQUFKX05PREUsIHNhYWpUZXh0Tm9kZSwgbnVsbCk7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gaXRlcmF0b3Igb3ZlciBhbGwgb2YgdGhlIGF0dHJpYnV0ZSBuYW1lcyBpbiB0aGlzIDxDT0RFPlNPQVBFbGVtZW50PC9DT0RFPiBvYmplY3QuCi0gICAgICogVGhlIGl0ZXJhdG9yIGNhbiBiZSB1c2VkIHRvIGdldCB0aGUgYXR0cmlidXRlIG5hbWVzLCB3aGljaCBjYW4gdGhlbiBiZSBwYXNzZWQgdG8gdGhlIG1ldGhvZAotICAgICAqIDxDT0RFPmdldEF0dHJpYnV0ZVZhbHVlPC9DT0RFPiB0byByZXRyaWV2ZSB0aGUgdmFsdWUgb2YgZWFjaCBhdHRyaWJ1dGUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIG5hbWVzIG9mIHRoZSBhdHRyaWJ1dGVzCi0gICAgICovCi0gICAgcHVibGljIEl0ZXJhdG9yIGdldEFsbEF0dHJpYnV0ZXMoKSB7Ci0gICAgICAgIGZpbmFsIEl0ZXJhdG9yIGF0dHJpYkl0ZXIgPSBlbGVtZW50LmdldEFsbEF0dHJpYnV0ZXMoKTsKLSAgICAgICAgQ29sbGVjdGlvbiBhdHRyaWJOYW1lID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBBdHRyIGF0dHI7Ci0gICAgICAgIHdoaWxlIChhdHRyaWJJdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgYXR0ciA9IChBdHRyKWF0dHJpYkl0ZXIubmV4dCgpOwotICAgICAgICAgICAgUHJlZml4ZWRRTmFtZSBxbmFtZTsKLSAgICAgICAgICAgIGlmIChhdHRyLmdldE5hbWVzcGFjZVVSSSgpID09IG51bGwgfHwgYXR0ci5nZXROYW1lc3BhY2VVUkkoKS50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgIHFuYW1lID0gbmV3IFByZWZpeGVkUU5hbWUoYXR0ci5nZXROYW1lc3BhY2VVUkkoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHIuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ci5nZXRQcmVmaXgoKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHFuYW1lID0gbmV3IFByZWZpeGVkUU5hbWUoYXR0ci5nZXROYW1lc3BhY2VVUkkoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHIuZ2V0TG9jYWxOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyLmdldFByZWZpeCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGF0dHJpYk5hbWUuYWRkKHFuYW1lKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYXR0cmliTmFtZS5pdGVyYXRvcigpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBqYXZheC54bWwuc29hcC5TT0FQRWxlbWVudCNnZXRBdHRyaWJ1dGVWYWx1ZShqYXZheC54bWwuc29hcC5OYW1lKQotICAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZVZhbHVlKE5hbWUgbmFtZSkgewotICAgICAgICAvL1RoaXMgbWV0aG9kIGlzIHdhaXRpbmcgb24gdGhlIGZpbmFsaXphdGlvbiBvZiB0aGUgbmFtZSBmb3IgYSBtZXRob2QKLSAgICAgICAgLy9pbiBPTUVsZW1lbnQgdGhhdCByZXR1cm5zIGEgT01BdHRyaWJ1dGUgZnJvbSBhbiBpbnB1dCBRTmFtZQotICAgICAgICBmaW5hbCBPTUF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShuZXcgUU5hbWUobmFtZS5nZXRVUkkoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUuZ2V0TG9jYWxOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLmdldFByZWZpeCgpKSk7Ci0gICAgICAgIGlmIChhdHRyaWJ1dGUgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZS5nZXRBdHRyaWJ1dGVWYWx1ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gaXRlcmF0b3Igb3ZlciBhbGwgdGhlIGltbWVkaWF0ZSBjb250ZW50IG9mIHRoaXMgZWxlbWVudC4gVGhpcyBpbmNsdWRlcwotICAgICAqIDxDT0RFPlRleHQ8L0NPREU+IG9iamVjdHMgYXMgd2VsbCBhcyA8Q09ERT5TT0FQRWxlbWVudDwvQ09ERT4gb2JqZWN0cy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYW4gaXRlcmF0b3Igb3ZlciA8Q09ERT5UZXh0PC9DT0RFPiBhbmQgPENPREU+U09BUEVsZW1lbnQ8L0NPREU+IGNvbnRhaW5lZCB3aXRoaW4gdGhpcwotICAgICAqICAgICAgICAgPENPREU+U09BUEVsZW1lbnQ8L0NPREU+IG9iamVjdAotICAgICAqLwotICAgIHB1YmxpYyBJdGVyYXRvciBnZXRDaGlsZEVsZW1lbnRzKCkgewotICAgICAgICBJdGVyYXRvciBjaGlsZEl0ZXIgPSBlbGVtZW50LmdldENoaWxkcmVuKCk7Ci0gICAgICAgIENvbGxlY3Rpb24gY2hpbGRFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgd2hpbGUgKGNoaWxkSXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIGNoaWxkRWxlbWVudHMuYWRkKHRvU0FBSk5vZGUoKG9yZy53M2MuZG9tLk5vZGUpY2hpbGRJdGVyLm5leHQoKSkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjaGlsZEVsZW1lbnRzLml0ZXJhdG9yKCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIGphdmF4LnhtbC5zb2FwLlNPQVBFbGVtZW50I2dldENoaWxkRWxlbWVudHMoamF2YXgueG1sLnNvYXAuTmFtZSkKLSAgICAgICovCi0gICAgcHVibGljIEl0ZXJhdG9yIGdldENoaWxkRWxlbWVudHMoTmFtZSBuYW1lKSB7Ci0gICAgICAgIFFOYW1lIHFOYW1lID0gbmV3IFFOYW1lKG5hbWUuZ2V0VVJJKCksIG5hbWUuZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICBJdGVyYXRvciBjaGlsZEl0ZXIgPSBlbGVtZW50LmdldENoaWxkcmVuV2l0aE5hbWUocU5hbWUpOwotICAgICAgICBDb2xsZWN0aW9uIGNoaWxkRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIHdoaWxlIChjaGlsZEl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBjaGlsZEVsZW1lbnRzLmFkZCh0b1NBQUpOb2RlKChvcmcudzNjLmRvbS5Ob2RlKWNoaWxkSXRlci5uZXh0KCkpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY2hpbGRFbGVtZW50cy5pdGVyYXRvcigpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBqYXZheC54bWwuc29hcC5TT0FQRWxlbWVudCNnZXRFbGVtZW50TmFtZSgpCi0gICAgICAqLwotICAgIHB1YmxpYyBOYW1lIGdldEVsZW1lbnROYW1lKCkgewotICAgICAgICBRTmFtZSBxTmFtZSA9IGVsZW1lbnQuZ2V0UU5hbWUoKTsKLSAgICAgICAgcmV0dXJuIG5ldyBQcmVmaXhlZFFOYW1lKHFOYW1lLmdldE5hbWVzcGFjZVVSSSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcU5hbWUuZ2V0TG9jYWxQYXJ0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxTmFtZS5nZXRQcmVmaXgoKSk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIGphdmF4LnhtbC5zb2FwLlNPQVBFbGVtZW50I2dldEVuY29kaW5nU3R5bGUoKQotICAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEVuY29kaW5nU3R5bGUoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmVuY29kaW5nU3R5bGU7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIGphdmF4LnhtbC5zb2FwLlNPQVBFbGVtZW50I2dldE5hbWVzcGFjZVByZWZpeGVzKCkKLSAgICAgICovCi0gICAgcHVibGljIEl0ZXJhdG9yIGdldE5hbWVzcGFjZVByZWZpeGVzKCkgewotICAgICAgICAvL0dldCBhbGwgZGVjbGFyZWQgbmFtZXNwYWNlLCBtYWtlIGEgbGlzdCBvZiB0aGVpciBwcmVmaXhlcyBhbmQgcmV0dXJuIGFuIGl0ZXJhdG9yIG92ZXIgdGhhdCBsaXN0Ci0gICAgICAgIEFycmF5TGlzdCBwcmVmaXhMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBJdGVyYXRvciBuc0l0ZXIgPSBlbGVtZW50LmdldEFsbERlY2xhcmVkTmFtZXNwYWNlcygpOwotICAgICAgICB3aGlsZSAobnNJdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgT2JqZWN0IG8gPSBuc0l0ZXIubmV4dCgpOwotICAgICAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTmFtZXNwYWNlKSB7Ci0gICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5hbWVzcGFjZSBucyA9IChvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTmFtZXNwYWNlKW87Ci0gICAgICAgICAgICAgICAgcHJlZml4TGlzdC5hZGQobnMuZ2V0UHJlZml4KCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwcmVmaXhMaXN0Lml0ZXJhdG9yKCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIGphdmF4LnhtbC5zb2FwLlNPQVBFbGVtZW50I2dldE5hbWVzcGFjZVVSSShqYXZhLmxhbmcuU3RyaW5nKQotICAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVVSSShTdHJpbmcgcHJlZml4KSB7Ci0gICAgICAgIHJldHVybiBlbGVtZW50LmdldE5hbWVzcGFjZVVSSShwcmVmaXgpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBqYXZheC54bWwuc29hcC5TT0FQRWxlbWVudCNnZXRWaXNpYmxlTmFtZXNwYWNlUHJlZml4ZXMoKQotICAgICAgKi8KLSAgICBwdWJsaWMgSXRlcmF0b3IgZ2V0VmlzaWJsZU5hbWVzcGFjZVByZWZpeGVzKCkgewotICAgICAgICAvL0knbGwgcmVjdXJzaXZlbHkgcmV0dXJuIGFsbCB0aGUgZGVjbGFyZWQgbmFtZXNwYWNlcyB0aWxsIHRoaXMgbm9kZSwgaW5jbHVkaW5nIGl0cyBwYXJlbnRzIGV0Yy4KLSAgICAgICAgSXRlcmF0b3IgbmFtZXNwYWNlc0l0ZXIgPSBlbGVtZW50LmdldEFsbERlY2xhcmVkTmFtZXNwYWNlcygpOwotICAgICAgICBBcnJheUxpc3QgcmV0dXJuTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgd2hpbGUgKG5hbWVzcGFjZXNJdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgT2JqZWN0IG8gPSBuYW1lc3BhY2VzSXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAobyBpbnN0YW5jZW9mIE9NTmFtZXNwYWNlKSB7Ci0gICAgICAgICAgICAgICAgT01OYW1lc3BhY2UgbnMgPSAoT01OYW1lc3BhY2UpbzsKLSAgICAgICAgICAgICAgICBpZiAobnMuZ2V0UHJlZml4KCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm5MaXN0LmFkZChucy5nZXRQcmVmaXgoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vdGFrZW4gY2FyZSBvZiBhZGRpbmcgbmFtZXNwYWNlcyBvZiB0aGlzIG5vZGUuCi0gICAgICAgIC8vbm93IHdlIGhhdmUgdG8gdGFrZSBjYXJlIG9mIGFkZGluZyB0aGUgbmFtZXNwYWNlcyB0aGF0IGFyZSBpbiB0aGUgc2NvcGUgdGlsbCB0aGUgbGV2ZWwgb2YKLSAgICAgICAgLy90aGlzIG5vZGVzJyBwYXJlbnQuCi0gICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01Db250YWluZXIgcGFyZW50ID0gZWxlbWVudC5nZXRQYXJlbnQoKTsKLSAgICAgICAgaWYgKHBhcmVudCAhPSBudWxsICYmIHBhcmVudCBpbnN0YW5jZW9mIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50KSB7Ci0gICAgICAgICAgICBJdGVyYXRvciBwYXJlbnRTY29wZU5hbWVzcGFjZXNJdGVyID0KLSAgICAgICAgICAgICAgICAgICAgKChvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudClwYXJlbnQpLmdldEFsbERlY2xhcmVkTmFtZXNwYWNlcygpOwotICAgICAgICAgICAgd2hpbGUgKHBhcmVudFNjb3BlTmFtZXNwYWNlc0l0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IG8gPSBwYXJlbnRTY29wZU5hbWVzcGFjZXNJdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBpZiAobyBpbnN0YW5jZW9mIE9NTmFtZXNwYWNlKSB7Ci0gICAgICAgICAgICAgICAgICAgIE9NTmFtZXNwYWNlIG5zID0gKE9NTmFtZXNwYWNlKW87Ci0gICAgICAgICAgICAgICAgICAgIGlmIChucy5nZXRQcmVmaXgoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5MaXN0LmFkZChucy5nZXRQcmVmaXgoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldHVybkxpc3QuaXRlcmF0b3IoKTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyBTT0FQRWxlbWVudCBhZGRBdHRyaWJ1dGUoUU5hbWUgcW5hbWUsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIFNPQVBFeGNlcHRpb24gewotICAgICAgICBpZiAocW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkgPT0gbnVsbCB8fCBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKS50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUocW5hbWUuZ2V0TG9jYWxQYXJ0KCksIHZhbHVlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlTlMocW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCksIHFuYW1lLmdldFByZWZpeCgpICsgIjoiICsKLSAgICAgICAgICAgICAgICAgICAgcW5hbWUuZ2V0TG9jYWxQYXJ0KCksIHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU09BUEVsZW1lbnQgYWRkQ2hpbGRFbGVtZW50KFFOYW1lIHFuYW1lKSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBwcmVmaXggPSBxbmFtZS5nZXRQcmVmaXgoKTsKLSAgICAgICAgcmV0dXJuIGFkZENoaWxkRWxlbWVudChxbmFtZS5nZXRMb2NhbFBhcnQoKSwgIiIuZXF1YWxzKHByZWZpeCkgPwotICAgICAgICAgICAgICAgIG51bGwgOiBwcmVmaXgsIHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgUU5hbWUgd2hvc2UgbmFtZXNwYWNlIFVSSSBpcyB0aGUgb25lIGFzc29jaWF0ZWQgd2l0aCB0aGUgcGFyYW1ldGVyLCBwcmVmaXgsIGluIHRoZQotICAgICAqIGNvbnRleHQgb2YgdGhpcyBTT0FQRWxlbWVudC4gVGhlIHJlbWFpbmluZyBlbGVtZW50cyBvZiB0aGUgbmV3IFFOYW1lIGFyZSB0YWtlbiBkaXJlY3RseSBmcm9tCi0gICAgICogdGhlIHBhcmFtZXRlcnMsIGxvY2FsTmFtZSBhbmQgcHJlZml4LgotICAgICAqCi0gICAgICogQHBhcmFtIGxvY2FsTmFtZSAtIGEgU3RyaW5nIGNvbnRhaW5pbmcgdGhlIGxvY2FsIHBhcnQgb2YgdGhlIG5hbWUuIHByZWZpeCAtIGEgU3RyaW5nCi0gICAgICogICAgICAgICAgICAgICAgICBjb250YWluaW5nIHRoZSBwcmVmaXggZm9yIHRoZSBuYW1lLgotICAgICAqIEByZXR1cm4gYSBRTmFtZSB3aXRoIHRoZSBzcGVjaWZpZWQgbG9jYWxOYW1lIGFuZCBwcmVmaXgsIGFuZCB3aXRoIGEgbmFtZXNwYWNlIHRoYXQgaXMKLSAgICAgKiAgICAgICAgIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJlZml4IGluIHRoZSBjb250ZXh0IG9mIHRoaXMgU09BUEVsZW1lbnQuIFRoaXMgbmFtZXNwYWNlIHdpbGwgYmUKLSAgICAgKiAgICAgICAgIHRoZSBzYW1lIGFzIHRoZSBvbmUgdGhhdCB3b3VsZCBiZSByZXR1cm5lZCBieSBnZXROYW1lc3BhY2VVUkkoU3RyaW5nKSBpZiBpdCB3ZXJlCi0gICAgICogICAgICAgICBnaXZlbiBwcmVmaXggYXMgaXRzIHBhcmFtZXRlci4KLSAgICAgKiBAdGhyb3dzIFNPQVBFeGNlcHRpb24gLSBpZiB0aGUgUU5hbWUgY2Fubm90IGJlIGNyZWF0ZWQuCi0gICAgICogQHNpbmNlIFNBQUogMS4zCi0gICAgICovCi0gICAgcHVibGljIFFOYW1lIGNyZWF0ZVFOYW1lKFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBwcmVmaXgpIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHRoaXMuZWxlbWVudC5nZXROYW1lc3BhY2VVUkkocHJlZml4KSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU09BUEV4Y2VwdGlvbigiSW52YWxpZCBwcmVmaXgiKTsKLSAgICAgICAgfQotICAgICAgICBRTmFtZSBxbmFtZSA9IG51bGw7Ci0gICAgICAgIGlmICh0aGlzLmVsZW1lbnQuZ2V0T01GYWN0b3J5KCkgaW5zdGFuY2VvZiBTT0FQMTFGYWN0b3J5KSB7Ci0gICAgICAgICAgICBxbmFtZSA9IG5ldyBRTmFtZShTT0FQMTFDb25zdGFudHMuU09BUF9FTlZFTE9QRV9OQU1FU1BBQ0VfVVJJLCBsb2NhbE5hbWUsIHByZWZpeCk7Ci0gICAgICAgIH0gZWxzZSBpZiAodGhpcy5lbGVtZW50LmdldE9NRmFjdG9yeSgpIGluc3RhbmNlb2YgU09BUDEyRmFjdG9yeSkgewotICAgICAgICAgICAgcW5hbWUgPSBuZXcgUU5hbWUoU09BUDEyQ29uc3RhbnRzLlNPQVBfRU5WRUxPUEVfTkFNRVNQQUNFX1VSSSwgbG9jYWxOYW1lLCBwcmVmaXgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBxbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSXRlcmF0b3IgZ2V0QWxsQXR0cmlidXRlc0FzUU5hbWVzKCkgewotICAgICAgICBmaW5hbCBJdGVyYXRvciBhdHRyaWJJdGVyID0gZWxlbWVudC5nZXRBbGxBdHRyaWJ1dGVzKCk7Ci0gICAgICAgIENvbGxlY3Rpb24gYXR0cmlidXRlc0FzUU5hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBBdHRyIGF0dHI7Ci0gICAgICAgIFFOYW1lIHFuYW1lOwotICAgICAgICB3aGlsZSAoYXR0cmliSXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIGF0dHIgPSAoQXR0cilhdHRyaWJJdGVyLm5leHQoKTsKLSAgICAgICAgICAgIC8vQ2hlY2sgOiBhdHRyLmdldExvY2FsTmFtZSgpIHwgYXR0ci5nZXROYW1lKCkKLSAgICAgICAgICAgIHFuYW1lID0gbmV3IFFOYW1lKGF0dHIuZ2V0TmFtZXNwYWNlVVJJKCksIGF0dHIuZ2V0TmFtZSgpLCBhdHRyLmdldFByZWZpeCgpKTsKLSAgICAgICAgICAgIGF0dHJpYnV0ZXNBc1FOYW1lcy5hZGQocW5hbWUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBhdHRyaWJ1dGVzQXNRTmFtZXMuaXRlcmF0b3IoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZVZhbHVlKFFOYW1lIHFuYW1lKSB7Ci0gICAgICAgIGZpbmFsIE9NQXR0cmlidXRlIGF0dHJpYnV0ZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKHFuYW1lKTsKLSAgICAgICAgaWYgKGF0dHJpYnV0ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYXR0cmlidXRlLmdldEF0dHJpYnV0ZVZhbHVlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIEl0ZXJhdG9yIGdldENoaWxkRWxlbWVudHMoUU5hbWUgcW5hbWUpIHsKLSAgICAgICAgSXRlcmF0b3IgY2hpbGRJdGVyID0gZWxlbWVudC5nZXRDaGlsZHJlbldpdGhOYW1lKHFuYW1lKTsKLSAgICAgICAgQ29sbGVjdGlvbiBjaGlsZEVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICB3aGlsZSAoY2hpbGRJdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgY2hpbGRFbGVtZW50cy5hZGQodG9TQUFKTm9kZSgob3JnLnczYy5kb20uTm9kZSljaGlsZEl0ZXIubmV4dCgpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNoaWxkRWxlbWVudHMuaXRlcmF0b3IoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUU5hbWUgZ2V0RWxlbWVudFFOYW1lKCkgewotICAgICAgICByZXR1cm4gZWxlbWVudC5nZXRRTmFtZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZUF0dHJpYnV0ZShRTmFtZSBxbmFtZSkgewotICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQXR0cmlidXRlIGF0dHIgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShxbmFtZSk7Ci0gICAgICAgIGlmIChhdHRyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKGF0dHIpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBTT0FQRWxlbWVudCBzZXRFbGVtZW50UU5hbWUoUU5hbWUgbmV3TmFtZSkgdGhyb3dzIFNPQVBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgbG9jYWxOYW1lID0gdGhpcy5lbGVtZW50LmdldExvY2FsTmFtZSgpOwotICAgICAgICBpZiAob3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBDb25zdGFudHMuQk9EWV9MT0NBTF9OQU1FLmVxdWFscyhsb2NhbE5hbWUpCi0gICAgICAgICAgICAgICAgfHwgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBDb25zdGFudHMuSEVBREVSX0xPQ0FMX05BTUUuZXF1YWxzKGxvY2FsTmFtZSkKLSAgICAgICAgICAgICAgICB8fCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUENvbnN0YW50cy5TT0FQRU5WRUxPUEVfTE9DQUxfTkFNRSAuZXF1YWxzKGxvY2FsTmFtZSkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTT0FQRXhjZXB0aW9uKCJjaGFuZ2luZyB0aGlzIGVsZW1lbnQgbmFtZSBpcyBub3QgYWxsb3dlZCIpOwotICAgICAgICB9Ci0gICAgICAgIE9NTmFtZXNwYWNlIG9tTmFtZXNwYWNlID0KLSAgICAgICAgICAgICAgICBuZXcgT01OYW1lc3BhY2VJbXBsKG5ld05hbWUuZ2V0TmFtZXNwYWNlVVJJKCksIG5ld05hbWUuZ2V0UHJlZml4KCkpOwotICAgICAgICB0aGlzLmVsZW1lbnQuc2V0TmFtZXNwYWNlKG9tTmFtZXNwYWNlKTsKLSAgICAgICAgdGhpcy5lbGVtZW50LnNldExvY2FsTmFtZShuZXdOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIGphdmF4LnhtbC5zb2FwLlNPQVBFbGVtZW50I3JlbW92ZUF0dHJpYnV0ZShqYXZheC54bWwuc29hcC5OYW1lKQotICAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmVBdHRyaWJ1dGUoTmFtZSBuYW1lKSB7Ci0gICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01BdHRyaWJ1dGUgYXR0ciA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKG5ldyBRTmFtZShuYW1lLmdldFVSSSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZS5nZXRMb2NhbE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUuZ2V0UHJlZml4KCkpKTsKLSAgICAgICAgaWYgKGF0dHIgIT0gbnVsbCkgewotICAgICAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoYXR0cik7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIGphdmF4LnhtbC5zb2FwLlNPQVBFbGVtZW50I3JlbW92ZUNvbnRlbnRzKCkKLSAgICAgICovCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlQ29udGVudHMoKSB7Ci0gICAgICAgIC8vV2Ugd2lsbCBnZXQgYWxsIHRoZSBjaGlsZHJlbiBhbmQgaXRlcmF0aXZlbHkgY2FsbCB0aGUgZGV0YWNoKCkgb24gYWxsIG9mICdlbS4KLSAgICAgICAgSXRlcmF0b3IgY2hpbGRJdGVyID0gZWxlbWVudC5nZXRDaGlsZEVsZW1lbnRzKCk7Ci0gICAgICAgIHdoaWxlIChjaGlsZEl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBPYmplY3QgbyA9IGNoaWxkSXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAobyBpbnN0YW5jZW9mIG9yZy5hcGFjaGUuYXhpb20ub20uT01Ob2RlKSB7Ci0gICAgICAgICAgICAgICAgKChvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTm9kZSlvKS5kZXRhY2goKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBqYXZheC54bWwuc29hcC5TT0FQRWxlbWVudCNyZW1vdmVOYW1lc3BhY2VEZWNsYXJhdGlvbihqYXZhLmxhbmcuU3RyaW5nKQotICAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmVOYW1lc3BhY2VEZWNsYXJhdGlvbihTdHJpbmcgcHJlZml4KSB7Ci0gICAgICAgIHJldHVybiBlbGVtZW50LnJlbW92ZU5hbWVzcGFjZShwcmVmaXgpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZW5jb2Rpbmcgc3R5bGUgZm9yIHRoaXMgU09BUEVsZW1lbnQgb2JqZWN0IHRvIG9uZSBzcGVjaWZpZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZW5jb2RpbmdTdHlsZSAtIGEgU3RyaW5nIGdpdmluZyB0aGUgZW5jb2Rpbmcgc3R5bGUKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgIC0gaWYgdGhlcmUgd2FzIGEgcHJvYmxlbSBpbiB0aGUgZW5jb2Rpbmcgc3R5bGUgYmVpbmcgc2V0LiBTT0FQRXhjZXB0aW9uIC0gaWYgc2V0dGluZwotICAgICAqICAgICAgICAgIHRoZSBlbmNvZGluZ1N0eWxlIGlzIGludmFsaWQgZm9yIHRoaXMgU09BUEVsZW1lbnQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RW5jb2RpbmdTdHlsZShTdHJpbmcgZW5jb2RpbmdTdHlsZSkgdGhyb3dzIFNPQVBFeGNlcHRpb24gewotICAgICAgICBpZiAodGhpcy5lbGVtZW50LmdldE9NRmFjdG9yeSgpIGluc3RhbmNlb2YgU09BUDExRmFjdG9yeSkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBVUkkgdXJpID0gbmV3IFVSSShlbmNvZGluZ1N0eWxlKTsKLSAgICAgICAgICAgICAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgU09BUEVudmVsb3BlKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoIWVuY29kaW5nU3R5bGUuZXF1YWxzKFNPQVBDb25zdGFudHMuVVJJX05TX1NPQVBfRU5DT0RJTkcpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBFbmNvZGluZyBzdHlsZSA6ICIgKyBlbmNvZGluZ1N0eWxlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0aGlzLmVuY29kaW5nU3R5bGUgPSBlbmNvZGluZ1N0eWxlOwotICAgICAgICAgICAgfSBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIEVuY29kaW5nIHN0eWxlIDogIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBlbmNvZGluZ1N0eWxlICsgIjoiICsgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAodGhpcy5lbGVtZW50LmdldE9NRmFjdG9yeSgpIGluc3RhbmNlb2YgU09BUDEyRmFjdG9yeSkgewotICAgICAgICAgICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBTT0FQSGVhZGVyIHx8IHRoaXMgaW5zdGFuY2VvZiBTT0FQQm9keSB8fAotICAgICAgICAgICAgICAgICAgICB0aGlzIGluc3RhbmNlb2YgU09BUEZhdWx0IHx8Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMgaW5zdGFuY2VvZiBTT0FQRmF1bHRFbGVtZW50IHx8IHRoaXMgaW5zdGFuY2VvZiBTT0FQRW52ZWxvcGUgfHwKLSAgICAgICAgICAgICAgICAgICAgdGhpcyBpbnN0YW5jZW9mIERldGFpbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBTT0FQRXhjZXB0aW9uKCJFbmNvZGluZ1N0eWxlIGF0dHJpYnV0ZSBjYW5ub3QgYXBwZWFyIGluIDogIiArIHRoaXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5PTU5vZGVFeCNzZXRQYXJlbnQob3JnLmFwYWNoZS5heGlvbS5vbS5PTUNvbnRhaW5lcikKLSAgICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UGFyZW50KE9NQ29udGFpbmVyIHBhcmVudEVsZW1lbnQpIHsKLSAgICAgICAgZWxlbWVudC5zZXRQYXJlbnQocGFyZW50RWxlbWVudCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIG9yZy53M2MuZG9tLkVsZW1lbnQjZ2V0QXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcpCi0gICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZShuYW1lKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgb3JnLnczYy5kb20uRWxlbWVudCNnZXRBdHRyaWJ1dGVOb2RlKGphdmEubGFuZy5TdHJpbmcpCi0gICAgICAqLwotICAgIHB1YmxpYyBBdHRyIGdldEF0dHJpYnV0ZU5vZGUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlTm9kZShuYW1lKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgb3JnLnczYy5kb20uRWxlbWVudCNnZXRBdHRyaWJ1dGVOb2RlTlMoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLSAgICAgICovCi0gICAgcHVibGljIEF0dHIgZ2V0QXR0cmlidXRlTm9kZU5TKFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBsb2NhbE5hbWUpIHsKLSAgICAgICAgcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlTm9kZU5TKG5hbWVzcGFjZVVSSSwgbG9jYWxOYW1lKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgb3JnLnczYy5kb20uRWxlbWVudCNnZXRBdHRyaWJ1dGVOUyhqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotICAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZU5TKFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBsb2NhbE5hbWUpIHsKLSAgICAgICAgcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlTlMobmFtZXNwYWNlVVJJLCBsb2NhbE5hbWUpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBvcmcudzNjLmRvbS5FbGVtZW50I2dldEVsZW1lbnRzQnlUYWdOYW1lKGphdmEubGFuZy5TdHJpbmcpCi0gICAgICAqLwotICAgIHB1YmxpYyBOb2RlTGlzdCBnZXRFbGVtZW50c0J5VGFnTmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICByZXR1cm4gZWxlbWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShuYW1lKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgb3JnLnczYy5kb20uRWxlbWVudCNnZXRFbGVtZW50c0J5VGFnTmFtZU5TKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0gICAgICAqLwotICAgIHB1YmxpYyBOb2RlTGlzdCBnZXRFbGVtZW50c0J5VGFnTmFtZU5TKFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBsb2NhbE5hbWUpIHsKLSAgICAgICAgcmV0dXJuIGVsZW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWVOUyhuYW1lc3BhY2VVUkksIGxvY2FsTmFtZSk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIG9yZy53M2MuZG9tLkVsZW1lbnQjZ2V0VGFnTmFtZSgpCi0gICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGFnTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGVsZW1lbnQuZ2V0VGFnTmFtZSgpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBvcmcudzNjLmRvbS5FbGVtZW50I2hhc0F0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nKQotICAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgcmV0dXJuIGVsZW1lbnQuaGFzQXR0cmlidXRlKG5hbWUpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBvcmcudzNjLmRvbS5FbGVtZW50I2hhc0F0dHJpYnV0ZU5TKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0gICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGhhc0F0dHJpYnV0ZU5TKFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBsb2NhbE5hbWUpIHsKLSAgICAgICAgcmV0dXJuIGVsZW1lbnQuaGFzQXR0cmlidXRlTlMobmFtZXNwYWNlVVJJLCBsb2NhbE5hbWUpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBvcmcudzNjLmRvbS5FbGVtZW50I3JlbW92ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nKQotICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpIHRocm93cyBET01FeGNlcHRpb24gewotICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShuYW1lKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgb3JnLnczYy5kb20uRWxlbWVudCNyZW1vdmVBdHRyaWJ1dGVOb2RlKG9yZy53M2MuZG9tLkF0dHIpCi0gICAgICAqLwotICAgIHB1YmxpYyBBdHRyIHJlbW92ZUF0dHJpYnV0ZU5vZGUoQXR0ciBhdHRyKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlTm9kZShhdHRyKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgb3JnLnczYy5kb20uRWxlbWVudCNyZW1vdmVBdHRyaWJ1dGVOUyhqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVBdHRyaWJ1dGVOUyhTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgbG9jYWxOYW1lKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLSAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGVOUyhuYW1lc3BhY2VVUkksIGxvY2FsTmFtZSk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIG9yZy53M2MuZG9tLkVsZW1lbnQjc2V0QXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0gICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLSAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUobmFtZSwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBvcmcudzNjLmRvbS5FbGVtZW50I3NldEF0dHJpYnV0ZU5vZGUob3JnLnczYy5kb20uQXR0cikKLSAgICAgICovCi0gICAgcHVibGljIEF0dHIgc2V0QXR0cmlidXRlTm9kZShBdHRyIGF0dHIpIHRocm93cyBET01FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZWxlbWVudC5zZXRBdHRyaWJ1dGVOb2RlKGF0dHIpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBvcmcudzNjLmRvbS5FbGVtZW50I3NldEF0dHJpYnV0ZU5vZGVOUyhvcmcudzNjLmRvbS5BdHRyKQotICAgICAgKi8KLSAgICBwdWJsaWMgQXR0ciBzZXRBdHRyaWJ1dGVOb2RlTlMoQXR0ciBhdHRyKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGVsZW1lbnQuc2V0QXR0cmlidXRlTm9kZU5TKGF0dHIpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBvcmcudzNjLmRvbS5FbGVtZW50I3NldEF0dHJpYnV0ZU5TKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0gICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZU5TKFN0cmluZyBuYW1lc3BhY2VVUkksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHF1YWxpZmllZE5hbWUsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0gICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlTlMobmFtZXNwYWNlVVJJLCBxdWFsaWZpZWROYW1lLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIG9yZy53M2MuZG9tLk5vZGUjZ2V0Tm9kZU5hbWUoKQotICAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkgewotICAgICAgICByZXR1cm4gZWxlbWVudC5nZXROb2RlTmFtZSgpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBvcmcudzNjLmRvbS5Ob2RlI2dldE5vZGVUeXBlKCkKLSAgICAgICovCi0gICAgcHVibGljIHNob3J0IGdldE5vZGVUeXBlKCkgewotICAgICAgICByZXR1cm4gTm9kZS5FTEVNRU5UX05PREU7Ci0gICAgfQotCi0gICAgcHVibGljIEVsZW1lbnRJbXBsIGdldEVsZW1lbnQoKSB7Ci0gICAgICAgIHJldHVybiBlbGVtZW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHBhcmVudCBlbGVtZW50IG9mIHRoaXMgPGNvZGU+Tm9kZTwvY29kZT4gb2JqZWN0LiBUaGlzIG1ldGhvZCBjYW4gdGhyb3cgYW4KLSAgICAgKiA8Y29kZT5VbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbjwvY29kZT4gaWYgdGhlIHRyZWUgaXMgbm90IGtlcHQgaW4gbWVtb3J5LgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgPGNvZGU+U09BUEVsZW1lbnQ8L2NvZGU+IG9iamVjdCB0aGF0IGlzIHRoZSBwYXJlbnQgb2YgdGhpcyA8Y29kZT5Ob2RlPC9jb2RlPgotICAgICAqICAgICAgICAgb2JqZWN0IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoaXMgPGNvZGU+Tm9kZTwvY29kZT4gb2JqZWN0IGlzIHJvb3QKLSAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHRoZSB3aG9sZSB0cmVlIGlzIG5vdCBrZXB0IGluIG1lbW9yeQotICAgICAqIEBzZWUgI3NldFBhcmVudEVsZW1lbnQoamF2YXgueG1sLnNvYXAuU09BUEVsZW1lbnQpIHNldFBhcmVudEVsZW1lbnQoamF2YXgueG1sLnNvYXAuU09BUEVsZW1lbnQpCi0gICAgICovCi0gICAgcHVibGljIFNPQVBFbGVtZW50IGdldFBhcmVudEVsZW1lbnQoKSB7Ci0gICAgICAgIGlmICh0aGlzLnBhcmVudEVsZW1lbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgamF2YXgueG1sLnNvYXAuTm9kZSBwYXJlbnROb2RlID0gdG9TQUFKTm9kZShlbGVtZW50LmdldFBhcmVudE5vZGUoKSk7Ci0gICAgICAgICAgICBpZiAocGFyZW50Tm9kZSBpbnN0YW5jZW9mIFNPQVBFbGVtZW50KSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5wYXJlbnRFbGVtZW50ID0gKFNPQVBFbGVtZW50KSBwYXJlbnROb2RlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzLnBhcmVudEVsZW1lbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGFyZW50RWxlbWVudChTT0FQRWxlbWVudCBwYXJlbnQpIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5wYXJlbnRFbGVtZW50ID0gcGFyZW50OwotICAgICAgICB0aGlzLmVsZW1lbnQuc2V0UGFyZW50KCgoU09BUEVsZW1lbnRJbXBsKXBhcmVudCkuZWxlbWVudCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmluZCB0aGUgRG9jdW1lbnQgdGhhdCB0aGlzIE5vZGUgYmVsb25ncyB0byAodGhlIGRvY3VtZW50IGluIHdob3NlIGNvbnRleHQgdGhlIE5vZGUgd2FzCi0gICAgICogY3JlYXRlZCkuIFRoZSBOb2RlIG1heSBvciBtYXkgbm90Ci0gICAgICovCi0gICAgcHVibGljIERvY3VtZW50IGdldE93bmVyRG9jdW1lbnQoKSB7Ci0gICAgICAgIHJldHVybiBlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0aGUgdmFsdWUgb2YgdGhlIGltbWVkaWF0ZSBjaGlsZCBvZiB0aGlzIDxjb2RlPk5vZGU8L2NvZGU+IG9iamVjdCBpZiBhIGNoaWxkCi0gICAgICogZXhpc3RzIGFuZCBpdHMgdmFsdWUgaXMgdGV4dC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHdpdGggdGhlIHRleHQgb2YgdGhlIGltbWVkaWF0ZSBjaGlsZCBvZiB0aGlzIDxjb2RlPk5vZGU8L2NvZGU+Ci0gICAgICogICAgICAgICBvYmplY3QgaWYgKDEpIHRoZXJlIGlzIGEgY2hpbGQgYW5kICgyKSB0aGUgY2hpbGQgaXMgYSA8Y29kZT5UZXh0PC9jb2RlPiBvYmplY3Q7Ci0gICAgICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotICAgICAgICBpZiAoZWxlbWVudC5nZXRUeXBlKCkgPT0gT01Ob2RlLlRFWFRfTk9ERSkgewotICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuZ2V0VGV4dCgpOwotICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnQuZ2V0VHlwZSgpID09IE9NTm9kZS5FTEVNRU5UX05PREUpIHsKLSAgICAgICAgICAgIGZpbmFsIE9NTm9kZSBmaXJzdE9NQ2hpbGQgPSBlbGVtZW50LmdldEZpcnN0T01DaGlsZCgpOwotICAgICAgICAgICAgaWYgKGZpcnN0T01DaGlsZCBpbnN0YW5jZW9mIFRleHRJbXBsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICgoVGV4dEltcGwpZmlyc3RPTUNoaWxkKS5nZXREYXRhKCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGZpcnN0T01DaGlsZCBpbnN0YW5jZW9mIFNPQVBFbGVtZW50SW1wbCkgewotICAgICAgICAgICAgICAgIHJldHVybiAoKFNPQVBFbGVtZW50SW1wbClmaXJzdE9NQ2hpbGQpLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgb3JnLnczYy5kb20uTm9kZSBnZXRGaXJzdENoaWxkKCkgewotICAgICAgICByZXR1cm4gdG9TQUFKTm9kZShlbGVtZW50LmdldEZpcnN0Q2hpbGQoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWV0aG9kIGdldExhc3RDaGlsZAotICAgICAqCi0gICAgICogQHNlZSBvcmcudzNjLmRvbS5Ob2RlI2dldExhc3RDaGlsZCgpCi0gICAgICovCi0gICAgcHVibGljIG9yZy53M2MuZG9tLk5vZGUgZ2V0TGFzdENoaWxkKCkgewotICAgICAgICByZXR1cm4gdG9TQUFKTm9kZShlbGVtZW50LmdldExhc3RDaGlsZCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTm9kZSBnZXRQYXJlbnROb2RlKCkgewotICAgICAgICBOb2RlIHBhcmVudE5vZGUgPSBudWxsOwotICAgICAgICBpZiAodGhpcy5wYXJlbnRFbGVtZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgIHBhcmVudE5vZGUgPSB0b1NBQUpOb2RlKGVsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpKTsKLSAgICAgICAgICAgIGlmIChwYXJlbnROb2RlIGluc3RhbmNlb2YgU09BUEVsZW1lbnQpIHsKLSAgICAgICAgICAgICAgICB0aGlzLnBhcmVudEVsZW1lbnQgPSAoU09BUEVsZW1lbnQpIHBhcmVudE5vZGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwYXJlbnROb2RlID0gdGhpcy5wYXJlbnRFbGVtZW50OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwYXJlbnROb2RlOwotICAgIH0KLQotICAgIC8qKiBkb20gTm9kZSBtZXRob2QgKi8KLSAgICBwdWJsaWMgb3JnLnczYy5kb20uTm9kZSBnZXROZXh0U2libGluZygpIHsKLSAgICAgICAgcmV0dXJuIHRvU0FBSk5vZGUoZWxlbWVudC5nZXROZXh0U2libGluZygpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTm9kZSBnZXRQcmV2aW91c1NpYmxpbmcoKSB7Ci0gICAgICAgIHJldHVybiB0b1NBQUpOb2RlKGVsZW1lbnQuZ2V0UHJldmlvdXNTaWJsaW5nKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBOb2RlTGlzdCBnZXRDaGlsZE5vZGVzKCkgewotICAgICAgICBOb2RlTGlzdCBjaGlsZE5vZGVzID0gZWxlbWVudC5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgICAgIE5vZGVMaXN0SW1wbCBub2RlcyA9IG5ldyBOb2RlTGlzdEltcGwoKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkTm9kZXMuZ2V0TGVuZ3RoKCk7IGkrKykgewotICAgICAgICAgICAgbm9kZXMuYWRkTm9kZSh0b1NBQUpOb2RlKGNoaWxkTm9kZXMuaXRlbShpKSkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBub2RlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZE5vZGVzKCkgewotICAgICAgICByZXR1cm4gZWxlbWVudC5oYXNDaGlsZE5vZGVzKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSWYgdGhpcyBpcyBhIFRleHQgbm9kZSB0aGVuIHRoaXMgbWV0aG9kIHdpbGwgc2V0IGl0cyB2YWx1ZSwgb3RoZXJ3aXNlIGl0IHNldHMgdGhlIHZhbHVlIG9mCi0gICAgICogdGhlIGltbWVkaWF0ZSAoVGV4dCkgY2hpbGQgb2YgdGhpcyBub2RlLiBUaGUgdmFsdWUgb2YgdGhlIGltbWVkaWF0ZSBjaGlsZCBvZiB0aGlzIG5vZGUgY2FuIGJlCi0gICAgICogc2V0IG9ubHkgaWYsIHRoZXJlIGlzIG9uZSBjaGlsZCBub2RlIGFuZCB0aGF0IG5vZGUgaXMgYSBUZXh0IG5vZGUsIG9yIGlmIHRoZXJlIGFyZSBubwotICAgICAqIGNoaWxkcmVuIGluIHdoaWNoIGNhc2UgYSBjaGlsZCBUZXh0IG5vZGUgd2lsbCBiZSBjcmVhdGVkLgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSB0ZXh0IHRvIHNldAotICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZSBub2RlIGlzIG5vdCBhIFRleHQgIG5vZGUgYW5kIGVpdGhlciBoYXMgbW9yZSB0aGFuIG9uZQotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkIG5vZGUgb3IgaGFzIGEgY2hpbGQgbm9kZSB0aGF0IGlzIG5vdCBhIFRleHQgbm9kZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgewotICAgICAgICBPTU5vZGUgZmlyc3RDaGlsZCA9IGVsZW1lbnQuZ2V0Rmlyc3RPTUNoaWxkKCk7Ci0gICAgICAgIGlmIChmaXJzdENoaWxkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5hZGRUZXh0Tm9kZSh2YWx1ZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChTT0FQRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQ2Fubm90IGFkZCB0ZXh0IG5vZGUiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmICgoKG9yZy53M2MuZG9tLk5vZGUpZmlyc3RDaGlsZCkuZ2V0Tm9kZVR5cGUoKSA9PSBqYXZheC54bWwuc29hcC5Ob2RlLlRFWFRfTk9ERQotICAgICAgICAgICAgICAgICYmIGZpcnN0Q2hpbGQuZ2V0TmV4dE9NU2libGluZygpID09IG51bGwpIHsKLSAgICAgICAgICAgICgob3JnLnczYy5kb20uVGV4dClmaXJzdENoaWxkKS5zZXREYXRhKHZhbHVlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRoaXMgbm9kZSBpcyBub3QgYSBUZXh0ICBub2RlIGFuZCAiICsKLSAgICAgICAgICAgICAgICAgICAgImVpdGhlciBoYXMgbW9yZSB0aGFuIG9uZSBjaGlsZCBub2RlIG9yIGhhcyBhIGNoaWxkICIgKwotICAgICAgICAgICAgICAgICAgICAibm9kZSB0aGF0IGlzIG5vdCBhIFRleHQgbm9kZSIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGV0YWNoTm9kZSgpIHsKLSAgICAgICAgdGhpcy5kZXRhY2goKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT01Ob2RlIGRldGFjaCgpIHsKLSAgICAgICAgT01Ob2RlIG9tTm9kZSA9IHRoaXMuZWxlbWVudC5kZXRhY2goKTsKLSAgICAgICAgdGhpcy5wYXJlbnRFbGVtZW50ID0gbnVsbDsKLSAgICAgICAgcmV0dXJuIG9tTm9kZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjb2xsZWN0aW9uIG9mIGF0dHJpYnV0ZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbm9kZSwgb3IgbnVsbCBpZiBub25lLiBBdCB0aGlzCi0gICAgICogd3JpdGluZywgRWxlbWVudCBpcyB0aGUgb25seSB0eXBlIG9mIG5vZGUgd2hpY2ggd2lsbCBldmVyIGhhdmUgYXR0cmlidXRlcy4KLSAgICAgKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmRvbS5FbGVtZW50SW1wbAotICAgICAqLwotICAgIHB1YmxpYyBOYW1lZE5vZGVNYXAgZ2V0QXR0cmlidXRlcygpIHsKLSAgICAgICAgcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlcygpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gZWxlbWVudC50b1N0cmluZygpOwotICAgIH0KLSAgICAgICAgCi0gICAgcHVibGljIE5vZGUgcmVtb3ZlQ2hpbGQoTm9kZSBvbGRDaGlsZCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChvbGRDaGlsZCBpbnN0YW5jZW9mIFNPQVBFbGVtZW50SW1wbCkgewotICAgICAgICAgICAgb2xkQ2hpbGQgPSAoKFNPQVBFbGVtZW50SW1wbClvbGRDaGlsZCkuZ2V0RWxlbWVudCgpOwotICAgICAgICB9IGVsc2UgaWYgKG9sZENoaWxkIGluc3RhbmNlb2YgVGV4dEltcGxFeCkgewotICAgICAgICAgICAgLy8gVE9ETzogaGFuZGxlIHRleHQgbm9kZXMgc29tZWhvdwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBlbGVtZW50LnJlbW92ZUNoaWxkKG9sZENoaWxkKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIE5vZGUgYXBwZW5kQ2hpbGQoTm9kZSBjaGlsZCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7ICAgICAgICAKLSAgICAgICAgaWYgKGdldE93bmVyRG9jdW1lbnQoKSAhPSBjaGlsZC5nZXRPd25lckRvY3VtZW50KCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLldST05HX0RPQ1VNRU5UX0VSUiwgIldyb25nIGRvY3VtZW50Iik7Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChjaGlsZCBpbnN0YW5jZW9mIFRleHQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gYXBwZW5kVGV4dCgoVGV4dCljaGlsZCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGNoaWxkIGluc3RhbmNlb2YgRWxlbWVudEltcGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gYXBwZW5kRWxlbWVudCgoRWxlbWVudEltcGwpY2hpbGQpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChTT0FQRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIERPTUV4Y2VwdGlvbiBleCA9IAotICAgICAgICAgICAgICAgIG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLkhJRVJBUkNIWV9SRVFVRVNUX0VSUiwgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgZXguaW5pdENhdXNlKGUpOwotICAgICAgICAgICAgdGhyb3cgZXg7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBzdXBlci5hcHBlbmRDaGlsZChjaGlsZCk7ICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIFRleHQgYXBwZW5kVGV4dChUZXh0IGNoaWxkKSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyB0ZXh0ID0gY2hpbGQuZ2V0RGF0YSgpOwotICAgICAgICBUZXh0IHRleHROb2RlID0gZ2V0T3duZXJEb2N1bWVudCgpLmNyZWF0ZVRleHROb2RlKHRleHQpOwotICAgICAgICBOb2RlSW1wbCBub2RlID0gKChOb2RlSW1wbCllbGVtZW50LmFwcGVuZENoaWxkKHRleHROb2RlKSk7Ci0gICAgICAgIFRleHRJbXBsRXggc2FhalRleHROb2RlID0gbmV3IFRleHRJbXBsRXgodGV4dCwgdGhpcyk7Ci0gICAgICAgIG5vZGUuc2V0VXNlckRhdGEoU0FBSl9OT0RFLCBzYWFqVGV4dE5vZGUsIG51bGwpOwotICAgICAgICByZXR1cm4gc2FhalRleHROb2RlOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgRWxlbWVudCBhcHBlbmRFbGVtZW50KEVsZW1lbnRJbXBsIGNoaWxkKSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBuYW1lc3BhY2VVUkkgPSBjaGlsZC5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgU3RyaW5nIHByZWZpeCA9IGNoaWxkLmdldFByZWZpeCgpOwotCi0gICAgICAgIFNPQVBFbGVtZW50SW1wbCBjaGlsZEVsZSA9IG5ldyBTT0FQRWxlbWVudEltcGwoY2hpbGQpOwotICAgICAgICAKLSAgICAgICAgY2hpbGRFbGUuZWxlbWVudC5zZXRVc2VyRGF0YShTQUFKX05PREUsIGNoaWxkRWxlLCBudWxsKTsKLSAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsICYmIG5hbWVzcGFjZVVSSS50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICBjaGlsZEVsZS5lbGVtZW50LnNldE5hbWVzcGFjZShjaGlsZEVsZS5lbGVtZW50LmRlY2xhcmVOYW1lc3BhY2UobmFtZXNwYWNlVVJJLCBwcmVmaXgpKTsKLSAgICAgICAgfQotICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxkKGNoaWxkRWxlLmVsZW1lbnQpOwotICAgICAgICAoKE5vZGVJbXBsKWNoaWxkRWxlLmVsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpKS5zZXRVc2VyRGF0YShTQUFKX05PREUsIHRoaXMsIG51bGwpOwotICAgICAgICBjaGlsZEVsZS5zZXRQYXJlbnRFbGVtZW50KHRoaXMpOwotICAgICAgICByZXR1cm4gY2hpbGRFbGU7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIGNvcHlDb250ZW50cyhTT0FQRWxlbWVudEltcGwgY2hpbGRFbGUsIE5vZGUgY2hpbGQpIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLSAgICAgICAgTmFtZWROb2RlTWFwIGF0dHJpYnV0ZXMgPSBjaGlsZC5nZXRBdHRyaWJ1dGVzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAgICAgICBBdHRyIG5vZGUgPSAoQXR0cilhdHRyaWJ1dGVzLml0ZW0oaSk7Ci0gICAgICAgICAgICBRTmFtZSBuYW1lOwotICAgICAgICAgICAgaWYgKG5vZGUuZ2V0UHJlZml4KCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG5hbWUgPSBuZXcgUU5hbWUobm9kZS5nZXROYW1lc3BhY2VVUkkoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbmFtZSA9IG5ldyBRTmFtZShub2RlLmdldE5hbWVzcGFjZVVSSSgpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuZ2V0TG9jYWxOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLmdldFByZWZpeCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNoaWxkRWxlLmFkZEF0dHJpYnV0ZShuYW1lLCBub2RlLmdldFZhbHVlKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgTm9kZUxpc3QgY2hpbGRyZW4gPSBjaGlsZC5nZXRDaGlsZE5vZGVzKCk7ICAgICAgICAKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAgICAgICBOb2RlIG5vZGUgPSBjaGlsZHJlbi5pdGVtKGkpOwotICAgICAgICAgICAgY2hpbGRFbGUuYXBwZW5kQ2hpbGQobm9kZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYWFqL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NhYWovU09BUEVudmVsb3BlSW1wbC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvc2Fhai9zcmMvb3JnL2FwYWNoZS9heGlzMi9zYWFqL1NPQVBFbnZlbG9wZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ0NTMyYS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYWFqL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NhYWovU09BUEVudmVsb3BlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zYWFqOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmRvbS5Eb2N1bWVudEltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmRvbS5Ob2RlSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuZG9tLlRleHRJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuaW1wbC5kb20uc29hcDExLlNPQVAxMUJvZHlJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5pbXBsLmRvbS5zb2FwMTEuU09BUDExRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuaW1wbC5kb20uc29hcDExLlNPQVAxMUhlYWRlckltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLmltcGwuZG9tLnNvYXAxMi5TT0FQMTJGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5pbXBsLmRvbS5zb2FwMTIuU09BUDEySGVhZGVySW1wbDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1pbXBvcnQgamF2YXgueG1sLnNvYXAuTmFtZTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQQm9keTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBIZWFkZXI7Ci0KLS8qKgotICoKLSAqLwotcHVibGljIGNsYXNzIFNPQVBFbnZlbG9wZUltcGwgZXh0ZW5kcyBTT0FQRWxlbWVudEltcGwgaW1wbGVtZW50cyBqYXZheC54bWwuc29hcC5TT0FQRW52ZWxvcGUgewotCi0gICAgcHJpdmF0ZSBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuaW1wbC5kb20uU09BUEVudmVsb3BlSW1wbCBvbVNPQVBFbnZlbG9wZTsKLSAgICBwcml2YXRlIFNPQVBQYXJ0SW1wbCBzb2FwUGFydDsKLQotICAgIHB1YmxpYyBTT0FQRW52ZWxvcGVJbXBsKGZpbmFsIG9yZy5hcGFjaGUuYXhpb20uc29hcC5pbXBsLmRvbS5TT0FQRW52ZWxvcGVJbXBsIGVudmVsb3BlKSB7Ci0gICAgICAgIHN1cGVyKGVudmVsb3BlKTsKLSAgICAgICAgb21TT0FQRW52ZWxvcGUgPSBlbnZlbG9wZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRPd25lckRvY3VtZW50KERvY3VtZW50IGRvY3VtZW50KSB7Ci0gICAgICAgIHN1cGVyLnNldE93bmVyRG9jdW1lbnQoKERvY3VtZW50SW1wbClkb2N1bWVudCk7Ci0gICAgfQotCi0gICAgcHVibGljIG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGUgZ2V0T01FbnZlbG9wZSgpIHsKLSAgICAgICAgcmV0dXJuIG9tU09BUEVudmVsb3BlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgPENPREU+TmFtZTwvQ09ERT4gb2JqZWN0IGluaXRpYWxpemVkIHdpdGggdGhlIGdpdmVuIGxvY2FsIG5hbWUsIG5hbWVzcGFjZQotICAgICAqIHByZWZpeCwgYW5kIG5hbWVzcGFjZSBVUkkuCi0gICAgICogPHAvPgotICAgICAqIDxQPlRoaXMgZmFjdG9yeSBtZXRob2QgY3JlYXRlcyA8Q09ERT5OYW1lPC9DT0RFPiBvYmplY3RzIGZvciB1c2UgaW4gdGhlIFNPQVAvWE1MIGRvY3VtZW50LgotICAgICAqCi0gICAgICogQHBhcmFtIGxvY2FsTmFtZSBhIDxDT0RFPlN0cmluZzwvQ09ERT4gZ2l2aW5nIHRoZSBsb2NhbCBuYW1lCi0gICAgICogQHBhcmFtIHByZWZpeCAgICBhIDxDT0RFPlN0cmluZzwvQ09ERT4gZ2l2aW5nIHRoZSBwcmVmaXggb2YgdGhlIG5hbWVzcGFjZQotICAgICAqIEBwYXJhbSB1cmkgICAgICAgYSA8Q09ERT5TdHJpbmc8L0NPREU+IGdpdmluZyB0aGUgVVJJIG9mIHRoZSBuYW1lc3BhY2UKLSAgICAgKiBAcmV0dXJuIGEgPENPREU+TmFtZTwvQ09ERT4gb2JqZWN0IGluaXRpYWxpemVkIHdpdGggdGhlIGdpdmVuIGxvY2FsIG5hbWUsIG5hbWVzcGFjZSBwcmVmaXgsCi0gICAgICogICAgICAgICBhbmQgbmFtZXNwYWNlIFVSSQotICAgICAqIEB0aHJvd3MgamF2YXgueG1sLnNvYXAuU09BUEV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIFNPQVAgZXJyb3IKLSAgICAgKi8KLSAgICBwdWJsaWMgTmFtZSBjcmVhdGVOYW1lKFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBwcmVmaXgsIFN0cmluZyB1cmkpIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgUHJlZml4ZWRRTmFtZSh1cmksIGxvY2FsTmFtZSwgcHJlZml4KTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTT0FQRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyA8Q09ERT5OYW1lPC9DT0RFPiBvYmplY3QgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgZ2l2ZW4gbG9jYWwgbmFtZS4KLSAgICAgKiA8cC8+Ci0gICAgICogPFA+VGhpcyBmYWN0b3J5IG1ldGhvZCBjcmVhdGVzIDxDT0RFPk5hbWU8L0NPREU+IG9iamVjdHMgZm9yIHVzZSBpbiB0aGUgU09BUC9YTUwgZG9jdW1lbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbG9jYWxOYW1lIGEgPENPREU+U3RyaW5nPC9DT0RFPiBnaXZpbmcgdGhlIGxvY2FsIG5hbWUKLSAgICAgKiBAcmV0dXJuIGEgPENPREU+TmFtZTwvQ09ERT4gb2JqZWN0IGluaXRpYWxpemVkIHdpdGggdGhlIGdpdmVuIGxvY2FsIG5hbWUKLSAgICAgKiBAdGhyb3dzIGphdmF4LnhtbC5zb2FwLlNPQVBFeGNlcHRpb24gaWYgdGhlcmUgaXMgYSBTT0FQIGVycm9yCi0gICAgICovCi0gICAgcHVibGljIE5hbWUgY3JlYXRlTmFtZShTdHJpbmcgbG9jYWxOYW1lKSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFByZWZpeGVkUU5hbWUobnVsbCwgbG9jYWxOYW1lLCBudWxsKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTT0FQRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgPENPREU+U09BUEhlYWRlcjwvQ09ERT4gb2JqZWN0IGZvciB0aGlzIDxDT0RFPiBTT0FQRW52ZWxvcGU8L0NPREU+IG9iamVjdC4KLSAgICAgKiA8cC8+Ci0gICAgICogPFA+QSBuZXcgPENPREU+U09BUE1lc3NhZ2U8L0NPREU+IG9iamVjdCBpcyBieSBkZWZhdWx0IGNyZWF0ZWQgd2l0aCBhCi0gICAgICogPENPREU+U09BUEVudmVsb3BlPC9DT0RFPiBvYmplY3QgdGhhdCBjb250YWlucyBhbiBlbXB0eSA8Q09ERT5TT0FQSGVhZGVyPC9DT0RFPiBvYmplY3QuIEFzIGEKLSAgICAgKiByZXN1bHQsIHRoZSBtZXRob2QgPENPREU+Z2V0SGVhZGVyPC9DT0RFPiB3aWxsIGFsd2F5cyByZXR1cm4gYSA8Q09ERT5TT0FQSGVhZGVyPC9DT0RFPiBvYmplY3QKLSAgICAgKiB1bmxlc3MgdGhlIGhlYWRlciBoYXMgYmVlbiByZW1vdmVkIGFuZCBhIG5ldyBvbmUgaGFzIG5vdCBiZWVuIGFkZGVkLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgPENPREU+U09BUEhlYWRlcjwvQ09ERT4gb2JqZWN0IG9yIDxDT0RFPiBudWxsPC9DT0RFPiBpZiB0aGVyZSBpcyBub25lCi0gICAgICogQHRocm93cyBqYXZheC54bWwuc29hcC5TT0FQRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSBvYnRhaW5pbmcgdGhlIDxDT0RFPlNPQVBIZWFkZXI8L0NPREU+Ci0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdAotICAgICAqLwotICAgIHB1YmxpYyBTT0FQSGVhZGVyIGdldEhlYWRlcigpIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIChTT0FQSGVhZGVyKXRvU0FBSk5vZGUoKG9yZy53M2MuZG9tLk5vZGUpb21TT0FQRW52ZWxvcGUuZ2V0SGVhZGVyKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIDxDT0RFPlNPQVBCb2R5PC9DT0RFPiBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMgPENPREU+U09BUEVudmVsb3BlPC9DT0RFPgotICAgICAqIG9iamVjdC4KLSAgICAgKiA8cC8+Ci0gICAgICogPFA+QSBuZXcgPENPREU+U09BUE1lc3NhZ2U8L0NPREU+IG9iamVjdCBpcyBieSBkZWZhdWx0IGNyZWF0ZWQgd2l0aCBhCi0gICAgICogPENPREU+U09BUEVudmVsb3BlPC9DT0RFPiBvYmplY3QgdGhhdCBjb250YWlucyBhbiBlbXB0eSA8Q09ERT5TT0FQQm9keTwvQ09ERT4gb2JqZWN0LiBBcyBhCi0gICAgICogcmVzdWx0LCB0aGUgbWV0aG9kIDxDT0RFPmdldEJvZHk8L0NPREU+IHdpbGwgYWx3YXlzIHJldHVybiBhIDxDT0RFPlNPQVBCb2R5PC9DT0RFPiBvYmplY3QKLSAgICAgKiB1bmxlc3MgdGhlIGJvZHkgaGFzIGJlZW4gcmVtb3ZlZCBhbmQgYSBuZXcgb25lIGhhcyBub3QgYmVlbiBhZGRlZC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIDxDT0RFPlNPQVBCb2R5PC9DT0RFPiBvYmplY3QgZm9yIHRoaXMgPENPREU+IFNPQVBFbnZlbG9wZTwvQ09ERT4gb2JqZWN0IG9yCi0gICAgICogICAgICAgICA8Q09ERT5udWxsPC9DT0RFPiBpZiB0aGVyZSBpcyBub25lCi0gICAgICogQHRocm93cyBqYXZheC54bWwuc29hcC5TT0FQRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSBvYnRhaW5pbmcgdGhlIDxDT0RFPlNPQVBCb2R5PC9DT0RFPgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3QKLSAgICAgKi8KLSAgICBwdWJsaWMgU09BUEJvZHkgZ2V0Qm9keSgpIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIChTT0FQQm9keSl0b1NBQUpOb2RlKChvcmcudzNjLmRvbS5Ob2RlKW9tU09BUEVudmVsb3BlLmdldEJvZHkoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIDxDT0RFPlNPQVBIZWFkZXI8L0NPREU+IG9iamVjdCBhbmQgc2V0cyBpdCBhcyB0aGUgPENPREU+U09BUEhlYWRlcjwvQ09ERT4gb2JqZWN0Ci0gICAgICogZm9yIHRoaXMgPENPREU+IFNPQVBFbnZlbG9wZTwvQ09ERT4gb2JqZWN0LgotICAgICAqIDxwLz4KLSAgICAgKiA8UD5JdCBpcyBpbGxlZ2FsIHRvIGFkZCBhIGhlYWRlciB3aGVuIHRoZSBlbnZlbG9wZSBhbHJlYWR5IGNvbnRhaW5zIGEgaGVhZGVyLiBUaGVyZWZvcmUsIHRoaXMKLSAgICAgKiBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBvbmx5IGFmdGVyIHRoZSBleGlzdGluZyBoZWFkZXIgaGFzIGJlZW4gcmVtb3ZlZC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIG5ldyA8Q09ERT5TT0FQSGVhZGVyPC9DT0RFPiBvYmplY3QKLSAgICAgKiBAdGhyb3dzIGphdmF4LnhtbC5zb2FwLlNPQVBFeGNlcHRpb24gaWYgdGhpcyA8Q09ERT4gU09BUEVudmVsb3BlPC9DT0RFPiBvYmplY3QgYWxyZWFkeQotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWlucyBhIHZhbGlkIDxDT0RFPlNPQVBIZWFkZXI8L0NPREU+IG9iamVjdAotICAgICAqLwotICAgIHB1YmxpYyBTT0FQSGVhZGVyIGFkZEhlYWRlcigpIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLSAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBIZWFkZXIgaGVhZGVyID0gb21TT0FQRW52ZWxvcGUuZ2V0SGVhZGVyKCk7Ci0gICAgICAgIGlmIChoZWFkZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgU09BUEhlYWRlckltcGwgc2FhalNPQVBIZWFkZXI7Ci0gICAgICAgICAgICBpZiAodGhpcy5lbGVtZW50LmdldE9NRmFjdG9yeSgpIGluc3RhbmNlb2YgU09BUDExRmFjdG9yeSkgewotICAgICAgICAgICAgICAgIGhlYWRlciA9IG5ldyBTT0FQMTFIZWFkZXJJbXBsKG9tU09BUEVudmVsb3BlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTT0FQRmFjdG9yeSl0aGlzLmVsZW1lbnQuZ2V0T01GYWN0b3J5KCkpOwotICAgICAgICAgICAgICAgIHNhYWpTT0FQSGVhZGVyID0gbmV3IFNPQVBIZWFkZXJJbXBsKGhlYWRlcik7Ci0gICAgICAgICAgICAgICAgc2FhalNPQVBIZWFkZXIuc2V0UGFyZW50RWxlbWVudCh0aGlzKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaGVhZGVyID0gbmV3IFNPQVAxMkhlYWRlckltcGwob21TT0FQRW52ZWxvcGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFNPQVBGYWN0b3J5KXRoaXMuZWxlbWVudC5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICAgICAgc2FhalNPQVBIZWFkZXIgPSBuZXcgU09BUEhlYWRlckltcGwoaGVhZGVyKTsKLSAgICAgICAgICAgICAgICBzYWFqU09BUEhlYWRlci5zZXRQYXJlbnRFbGVtZW50KHRoaXMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgKChOb2RlSW1wbClvbVNPQVBFbnZlbG9wZS5nZXRIZWFkZXIoKSkuc2V0VXNlckRhdGEoU0FBSl9OT0RFLCBzYWFqU09BUEhlYWRlciwgbnVsbCk7Ci0gICAgICAgICAgICByZXR1cm4gc2FhalNPQVBIZWFkZXI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU09BUEV4Y2VwdGlvbigiSGVhZGVyIGFscmVhZHkgcHJlc2VudCwgY2FuJ3Qgc2V0IGhlYWRlciBhZ2FpbiB3aXRob3V0ICIgKwotICAgICAgICAgICAgICAgICAgICAiZGVsZXRpbmcgdGhlIGV4aXN0aW5nIGhlYWRlci4gIiArCi0gICAgICAgICAgICAgICAgICAgICJVc2UgZ2V0SGVhZGVyKCkgbWV0aG9kIGFuZCBkZXRhY2ggdGhlIGhlYWRlciBpbnN0ZWFkLiIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIDxDT0RFPlNPQVBCb2R5PC9DT0RFPiBvYmplY3QgYW5kIHNldHMgaXQgYXMgdGhlIDxDT0RFPlNPQVBCb2R5PC9DT0RFPiBvYmplY3QgZm9yCi0gICAgICogdGhpcyA8Q09ERT4gU09BUEVudmVsb3BlPC9DT0RFPiBvYmplY3QuCi0gICAgICogPHAvPgotICAgICAqIDxQPkl0IGlzIGlsbGVnYWwgdG8gYWRkIGEgYm9keSB3aGVuIHRoZSBlbnZlbG9wZSBhbHJlYWR5IGNvbnRhaW5zIGEgYm9keS4gVGhlcmVmb3JlLCB0aGlzCi0gICAgICogbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgb25seSBhZnRlciB0aGUgZXhpc3RpbmcgYm9keSBoYXMgYmVlbiByZW1vdmVkLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgbmV3IDxDT0RFPlNPQVBCb2R5PC9DT0RFPiBvYmplY3QKLSAgICAgKiBAdGhyb3dzIGphdmF4LnhtbC5zb2FwLlNPQVBFeGNlcHRpb24gaWYgdGhpcyA8Q09ERT4gU09BUEVudmVsb3BlPC9DT0RFPiBvYmplY3QgYWxyZWFkeQotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWlucyBhIHZhbGlkIDxDT0RFPlNPQVBCb2R5PC9DT0RFPiBvYmplY3QKLSAgICAgKi8KLSAgICBwdWJsaWMgU09BUEJvZHkgYWRkQm9keSgpIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLSAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBCb2R5IGJvZHkgPSBvbVNPQVBFbnZlbG9wZS5nZXRCb2R5KCk7Ci0gICAgICAgIGlmIChib2R5ID09IG51bGwpIHsKLSAgICAgICAgICAgIGJvZHkgPSBuZXcgU09BUDExQm9keUltcGwob21TT0FQRW52ZWxvcGUsIChTT0FQRmFjdG9yeSl0aGlzLmVsZW1lbnQuZ2V0T01GYWN0b3J5KCkpOwotICAgICAgICAgICAgU09BUEJvZHlJbXBsIHNhYWpTT0FQQm9keSA9IG5ldyBTT0FQQm9keUltcGwoYm9keSk7Ci0gICAgICAgICAgICBzYWFqU09BUEJvZHkuc2V0UGFyZW50RWxlbWVudCh0aGlzKTsKLSAgICAgICAgICAgICgoTm9kZUltcGwpb21TT0FQRW52ZWxvcGUuZ2V0Qm9keSgpKS5zZXRVc2VyRGF0YShTQUFKX05PREUsIHNhYWpTT0FQQm9keSwgbnVsbCk7Ci0gICAgICAgICAgICByZXR1cm4gc2FhalNPQVBCb2R5OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNPQVBFeGNlcHRpb24oIkJvZHkgYWxyZWFkeSBwcmVzZW50LCBjYW4ndCBzZXQgYm9keSBhZ2FpbiB3aXRob3V0ICIgKwotICAgICAgICAgICAgICAgICAgICAiZGVsZXRpbmcgdGhlIGV4aXN0aW5nIGJvZHkuIFVzZSBnZXRCb2R5KCkgbWV0aG9kIGluc3RlYWQuIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU09BUEVsZW1lbnQgYWRkVGV4dE5vZGUoU3RyaW5nIHRleHQpIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLSAgICAgICAgTm9kZSBmaXJzdENoaWxkID0gZWxlbWVudC5nZXRGaXJzdENoaWxkKCk7Ci0gICAgICAgIGlmIChmaXJzdENoaWxkIGluc3RhbmNlb2Ygb3JnLnczYy5kb20uVGV4dCkgewotICAgICAgICAgICAgKChvcmcudzNjLmRvbS5UZXh0KWZpcnN0Q2hpbGQpLnNldERhdGEodGV4dCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBFbHNlIHRoaXMgaXMgYSBoZWFkZXIKLSAgICAgICAgICAgIFRleHRJbXBsIGRvb21UZXh0ID0gbmV3IFRleHRJbXBsKHRleHQsIHRoaXMuZWxlbWVudC5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICBkb29tVGV4dC5zZXROZXh0T01TaWJsaW5nKChOb2RlSW1wbClmaXJzdENoaWxkKTsKLSAgICAgICAgICAgIGRvb21UZXh0LnNldFByZXZpb3VzT01TaWJsaW5nKG51bGwpOwotICAgICAgICAgICAgZWxlbWVudC5zZXRGaXJzdENoaWxkKGRvb21UZXh0KTsKLSAgICAgICAgICAgICgoTm9kZUltcGwpZmlyc3RDaGlsZCkuc2V0UHJldmlvdXNPTVNpYmxpbmcoZG9vbVRleHQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE92ZXJyaWRlIFNPQVBFbGVtZW50LmFkZEF0dHJpYnV0ZSBTT0FQMS4yIHNob3VsZCBub3QgYWxsb3cgZW5jb2RpbmdTdHlsZSBhdHRyaWJ1dGUgdG8gYmUgc2V0Ci0gICAgICogb24gRW52ZWxvcAotICAgICAqLwotICAgIHB1YmxpYyBTT0FQRWxlbWVudCBhZGRBdHRyaWJ1dGUoTmFtZSBuYW1lLCBTdHJpbmcgdmFsdWUpIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHRoaXMuZWxlbWVudC5nZXRPTUZhY3RvcnkoKSBpbnN0YW5jZW9mIFNPQVAxMkZhY3RvcnkpIHsKLSAgICAgICAgICAgIGlmICgiZW5jb2RpbmdTdHlsZSIuZXF1YWxzKG5hbWUuZ2V0TG9jYWxOYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNPQVBFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAiU09BUDEuMiBkb2VzIG5vdCBhbGxvdyBlbmNvZGluZ1N0eWxlIGF0dHJpYnV0ZSB0byBiZSBzZXQgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvbiBFbnZlbG9wZSIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdXBlci5hZGRBdHRyaWJ1dGUobmFtZSwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE92ZXJyaWRlIFNPQVBFbGVtZW50LmFkZENoaWxkRWxlbWVudCBTT0FQIDEuMiBzaG91bGQgbm90IGFsbG93IGVsZW1lbnQgdG8gYmUgYWRkZWQgYWZ0ZXIgYm9keQotICAgICAqIGVsZW1lbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgU09BUEVsZW1lbnQgYWRkQ2hpbGRFbGVtZW50KE5hbWUgbmFtZSkgdGhyb3dzIFNPQVBFeGNlcHRpb24gewotICAgICAgICBpZiAodGhpcy5lbGVtZW50LmdldE9NRmFjdG9yeSgpIGluc3RhbmNlb2YgU09BUDEyRmFjdG9yeSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNPQVBFeGNlcHRpb24oIkNhbm5vdCBhZGQgZWxlbWVudHMgYWZ0ZXIgYm9keSBlbGVtZW50Iik7Ci0gICAgICAgIH0gZWxzZSBpZiAodGhpcy5lbGVtZW50LmdldE9NRmFjdG9yeSgpIGluc3RhbmNlb2YgU09BUDExRmFjdG9yeSkgewotICAgICAgICAgICAgLy9MZXQgZWxlbWVudHMgdG8gYmUgYWRkZWQgYW55IHdoZXJlLgotICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmFkZENoaWxkRWxlbWVudChuYW1lKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2V0IFNPQVBQYXJ0IHBhcmVudAotICAgICAqIEBwYXJhbSBzcAotICAgICAqLwotICAgIHZvaWQgc2V0U09BUFBhcnRQYXJlbnQoU09BUFBhcnRJbXBsIHNwKSB7Ci0gICAgICAgIHRoaXMuc29hcFBhcnQgPSBzcDsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHJldHVybiBTT0FQUGFydAotICAgICAqLwotICAgIFNPQVBQYXJ0SW1wbCBnZXRTT0FQUGFydFBhcmVudCgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuc29hcFBhcnQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2Fhai9zcmMvb3JnL2FwYWNoZS9heGlzMi9zYWFqL1NPQVBGYWN0b3J5SW1wbC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvc2Fhai9zcmMvb3JnL2FwYWNoZS9heGlzMi9zYWFqL1NPQVBGYWN0b3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjhhZjYyLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhYWovc3JjL29yZy9hcGFjaGUvYXhpczIvc2Fhai9TT0FQRmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2FhajsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01OYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmRvbS5ET09NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5kb20uRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmRvbS5mYWN0b3J5Lk9NRE9NRmFjdG9yeTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5EZXRhaWw7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuTmFtZTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQQ29uc3RhbnRzOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBFbGVtZW50OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEZhdWx0OwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBTT0FQRmFjdG9yeUltcGwgZXh0ZW5kcyBTT0FQRmFjdG9yeSB7Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHNvYXBWZXJzaW9uID0gU09BUENvbnN0YW50cy5TT0FQXzFfMV9QUk9UT0NPTDsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIDxjb2RlPlNPQVBFbGVtZW50PC9jb2RlPiBvYmplY3QgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgZ2l2ZW4gPGNvZGU+TmFtZTwvY29kZT4KLSAgICAgKiBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSBhIDxjb2RlPk5hbWU8L2NvZGU+IG9iamVjdCB3aXRoIHRoZSBYTUwgbmFtZSBmb3IgdGhlIG5ldyBlbGVtZW50Ci0gICAgICogQHJldHVybiB0aGUgbmV3IDxjb2RlPlNPQVBFbGVtZW50PC9jb2RlPiBvYmplY3QgdGhhdCB3YXMgY3JlYXRlZAotICAgICAqIEB0aHJvd3MgamF2YXgueG1sLnNvYXAuU09BUEV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhbiBlcnJvciBpbiBjcmVhdGluZyB0aGUgPGNvZGU+U09BUEVsZW1lbnQ8L2NvZGU+Ci0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdAotICAgICAqLwotICAgIHB1YmxpYyBTT0FQRWxlbWVudCBjcmVhdGVFbGVtZW50KE5hbWUgbmFtZSkgdGhyb3dzIFNPQVBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgbG9jYWxOYW1lID0gbmFtZS5nZXRMb2NhbE5hbWUoKTsKLSAgICAgICAgU3RyaW5nIHByZWZpeCA9IG5hbWUuZ2V0UHJlZml4KCk7Ci0gICAgICAgIFN0cmluZyB1cmkgPSBuYW1lLmdldFVSSSgpOwotICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gbnVsbDsKLSAgICAgICAgaWYgKHNvYXBWZXJzaW9uLmVxdWFscyhTT0FQQ29uc3RhbnRzLlNPQVBfMV8yX1BST1RPQ09MKSkgewotICAgICAgICAgICAgb21FbGVtZW50ID0gRE9PTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTJGYWN0b3J5KCkuY3JlYXRlT01FbGVtZW50KGxvY2FsTmFtZQotICAgICAgICAgICAgICAgICAgICAsIHVyaSwgcHJlZml4KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG9tRWxlbWVudCA9IERPT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDExRmFjdG9yeSgpLmNyZWF0ZU9NRWxlbWVudChsb2NhbE5hbWUKLSAgICAgICAgICAgICAgICAgICAgLCB1cmksIHByZWZpeCk7Ci0gICAgICAgIH0KLSAgICAgICAgRE9PTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKS5jcmVhdGVPTUVsZW1lbnQobG9jYWxOYW1lLCB1cmksIHByZWZpeCk7Ci0gICAgICAgIHJldHVybiBuZXcgU09BUEVsZW1lbnRJbXBsKChFbGVtZW50SW1wbClvbUVsZW1lbnQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIDxjb2RlPlNPQVBFbGVtZW50PC9jb2RlPiBvYmplY3QgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgZ2l2ZW4gbG9jYWwgbmFtZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBsb2NhbE5hbWUgYSA8Y29kZT5TdHJpbmc8L2NvZGU+IGdpdmluZyB0aGUgbG9jYWwgbmFtZSBmb3IgdGhlIG5ldyBlbGVtZW50Ci0gICAgICogQHJldHVybiB0aGUgbmV3IDxjb2RlPlNPQVBFbGVtZW50PC9jb2RlPiBvYmplY3QgdGhhdCB3YXMgY3JlYXRlZAotICAgICAqIEB0aHJvd3MgamF2YXgueG1sLnNvYXAuU09BUEV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhbiBlcnJvciBpbiBjcmVhdGluZyB0aGUgPGNvZGU+U09BUEVsZW1lbnQ8L2NvZGU+Ci0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdAotICAgICAqLwotICAgIHB1YmxpYyBTT0FQRWxlbWVudCBjcmVhdGVFbGVtZW50KFN0cmluZyBsb2NhbE5hbWUpIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLSAgICAgICAgT01ET01GYWN0b3J5IG9tZG9tRmFjdG9yeSA9IG51bGw7Ci0gICAgICAgIGlmIChzb2FwVmVyc2lvbi5lcXVhbHMoU09BUENvbnN0YW50cy5TT0FQXzFfMl9QUk9UT0NPTCkpIHsKLSAgICAgICAgICAgIG9tZG9tRmFjdG9yeSA9IChPTURPTUZhY3RvcnkpRE9PTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTJGYWN0b3J5KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBvbWRvbUZhY3RvcnkgPSAoT01ET01GYWN0b3J5KURPT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDExRmFjdG9yeSgpOwotICAgICAgICB9Ci0gICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSBvbWRvbUZhY3RvcnkuY3JlYXRlT01FbGVtZW50KG5ldyBRTmFtZShsb2NhbE5hbWUpKTsKLSAgICAgICAgcmV0dXJuIG5ldyBTT0FQRWxlbWVudEltcGwoKEVsZW1lbnRJbXBsKW9tRWxlbWVudCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbmV3IDxjb2RlPlNPQVBFbGVtZW50PC9jb2RlPiBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4gbG9jYWwgbmFtZSwgcHJlZml4IGFuZCB1cmkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbG9jYWxOYW1lIGEgPGNvZGU+U3RyaW5nPC9jb2RlPiBnaXZpbmcgdGhlIGxvY2FsIG5hbWUgZm9yIHRoZSBuZXcgZWxlbWVudAotICAgICAqIEBwYXJhbSBwcmVmaXggICAgdGhlIHByZWZpeCBmb3IgdGhpcyA8Y29kZT5TT0FQRWxlbWVudDwvY29kZT4KLSAgICAgKiBAcGFyYW0gdXJpICAgICAgIGEgPGNvZGU+U3RyaW5nPC9jb2RlPiBnaXZpbmcgdGhlIFVSSSBvZiB0aGUgbmFtZXNwYWNlIHRvIHdoaWNoIHRoZSBuZXcKLSAgICAgKiAgICAgICAgICAgICAgICAgIGVsZW1lbnQgYmVsb25ncwotICAgICAqIEByZXR1cm4gdGhlIG5ldyA8Y29kZT5TT0FQRWxlbWVudDwvY29kZT4gb2JqZWN0IHRoYXQgd2FzIGNyZWF0ZWQKLSAgICAgKiBAdGhyb3dzIGphdmF4LnhtbC5zb2FwLlNPQVBFeGNlcHRpb24gaWYgdGhlcmUgaXMgYW4gZXJyb3IgaW4gY3JlYXRpbmcgdGhlIDxjb2RlPlNPQVBFbGVtZW50PC9jb2RlPgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3QKLSAgICAgKi8KLSAgICBwdWJsaWMgU09BUEVsZW1lbnQgY3JlYXRlRWxlbWVudChTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcHJlZml4LCBTdHJpbmcgdXJpKQotICAgICAgICAgICAgdGhyb3dzIFNPQVBFeGNlcHRpb24gewotICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gbnVsbDsKLSAgICAgICAgaWYgKHNvYXBWZXJzaW9uLmVxdWFscyhTT0FQQ29uc3RhbnRzLlNPQVBfMV8yX1BST1RPQ09MKSkgewotICAgICAgICAgICAgb21FbGVtZW50ID0gRE9PTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTJGYWN0b3J5KCkuY3JlYXRlT01FbGVtZW50KGxvY2FsTmFtZQotICAgICAgICAgICAgICAgICAgICAsIHVyaSwgcHJlZml4KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG9tRWxlbWVudCA9IERPT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDExRmFjdG9yeSgpLmNyZWF0ZU9NRWxlbWVudChsb2NhbE5hbWUKLSAgICAgICAgICAgICAgICAgICAgLCB1cmksIHByZWZpeCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBTT0FQRWxlbWVudEltcGwoKEVsZW1lbnRJbXBsKW9tRWxlbWVudCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5EZXRhaWw8L2NvZGU+IG9iamVjdCB3aGljaCBzZXJ2ZXMgYXMgYSBjb250YWluZXIgZm9yCi0gICAgICogPGNvZGU+RGV0YWlsRW50cnk8L2NvZGU+IG9iamVjdHMuCi0gICAgICogPHAvPgotICAgICAqIFRoaXMgZmFjdG9yeSBtZXRob2QgY3JlYXRlcyA8Y29kZT5EZXRhaWw8L2NvZGU+IG9iamVjdHMgZm9yIHVzZSBpbiBzaXR1YXRpb25zIHdoZXJlIGl0IGlzIG5vdAotICAgICAqIHByYWN0aWNhbCB0byB1c2UgdGhlIDxjb2RlPlNPQVBGYXVsdDwvY29kZT4gYWJzdHJhY3Rpb24uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGEgPGNvZGU+RGV0YWlsPC9jb2RlPiBvYmplY3QKLSAgICAgKiBAdGhyb3dzIGphdmF4LnhtbC5zb2FwLlNPQVBFeGNlcHRpb24gaWYgdGhlcmUgaXMgYSBTT0FQIGVycm9yCi0gICAgICovCi0gICAgcHVibGljIERldGFpbCBjcmVhdGVEZXRhaWwoKSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChzb2FwVmVyc2lvbi5lcXVhbHMoU09BUENvbnN0YW50cy5TT0FQXzFfMl9QUk9UT0NPTCkpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgRGV0YWlsSW1wbChET09NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMkZhY3RvcnkoKS5jcmVhdGVTT0FQRmF1bHREZXRhaWwoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IERldGFpbEltcGwoRE9PTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTFGYWN0b3J5KCkuY3JlYXRlU09BUEZhdWx0RGV0YWlsKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5OYW1lPC9jb2RlPiBvYmplY3QgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgZ2l2ZW4gbG9jYWwgbmFtZSwgbmFtZXNwYWNlCi0gICAgICogcHJlZml4LCBhbmQgbmFtZXNwYWNlIFVSSS4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhpcyBmYWN0b3J5IG1ldGhvZCBjcmVhdGVzIDxjb2RlPk5hbWU8L2NvZGU+IG9iamVjdHMgZm9yIHVzZSBpbiBzaXR1YXRpb25zIHdoZXJlIGl0IGlzIG5vdAotICAgICAqIHByYWN0aWNhbCB0byB1c2UgdGhlIDxjb2RlPlNPQVBFbnZlbG9wZTwvY29kZT4gYWJzdHJhY3Rpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbG9jYWxOYW1lIGEgPGNvZGU+U3RyaW5nPC9jb2RlPiBnaXZpbmcgdGhlIGxvY2FsIG5hbWUKLSAgICAgKiBAcGFyYW0gcHJlZml4ICAgIGEgPGNvZGU+U3RyaW5nPC9jb2RlPiBnaXZpbmcgdGhlIHByZWZpeCBvZiB0aGUgbmFtZXNwYWNlCi0gICAgICogQHBhcmFtIHVyaSAgICAgICBhIDxjb2RlPlN0cmluZzwvY29kZT4gZ2l2aW5nIHRoZSBVUkkgb2YgdGhlIG5hbWVzcGFjZQotICAgICAqIEByZXR1cm4gYSA8Y29kZT5OYW1lPC9jb2RlPiBvYmplY3QgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgZ2l2ZW4gbG9jYWwgbmFtZSwgbmFtZXNwYWNlIHByZWZpeCwKLSAgICAgKiAgICAgICAgIGFuZCBuYW1lc3BhY2UgVVJJCi0gICAgICogQHRocm93cyBqYXZheC54bWwuc29hcC5TT0FQRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgU09BUCBlcnJvcgotICAgICAqLwotICAgIHB1YmxpYyBOYW1lIGNyZWF0ZU5hbWUoU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHByZWZpeCwgU3RyaW5nIHVyaSkgdGhyb3dzIFNPQVBFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbmV3IFByZWZpeGVkUU5hbWUodXJpLCBsb2NhbE5hbWUsIHByZWZpeCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5OYW1lPC9jb2RlPiBvYmplY3QgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgZ2l2ZW4gbG9jYWwgbmFtZS4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhpcyBmYWN0b3J5IG1ldGhvZCBjcmVhdGVzIDxjb2RlPk5hbWU8L2NvZGU+IG9iamVjdHMgZm9yIHVzZSBpbiBzaXR1YXRpb25zIHdoZXJlIGl0IGlzIG5vdAotICAgICAqIHByYWN0aWNhbCB0byB1c2UgdGhlIDxjb2RlPlNPQVBFbnZlbG9wZTwvY29kZT4gYWJzdHJhY3Rpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbG9jYWxOYW1lIGEgPGNvZGU+U3RyaW5nPC9jb2RlPiBnaXZpbmcgdGhlIGxvY2FsIG5hbWUKLSAgICAgKiBAcmV0dXJuIGEgPGNvZGU+TmFtZTwvY29kZT4gb2JqZWN0IGluaXRpYWxpemVkIHdpdGggdGhlIGdpdmVuIGxvY2FsIG5hbWUKLSAgICAgKiBAdGhyb3dzIGphdmF4LnhtbC5zb2FwLlNPQVBFeGNlcHRpb24gaWYgdGhlcmUgaXMgYSBTT0FQIGVycm9yCi0gICAgICovCi0gICAgcHVibGljIE5hbWUgY3JlYXRlTmFtZShTdHJpbmcgbG9jYWxOYW1lKSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBuZXcgUHJlZml4ZWRRTmFtZShudWxsLCBsb2NhbE5hbWUsIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgZGVmYXVsdCBTT0FQRmF1bHQgb2JqZWN0Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIGEgU09BUEZhdWx0IG9iamVjdAotICAgICAqIEB0aHJvd3MgU09BUEV4Y2VwdGlvbiAtIGlmIHRoZXJlIGlzIGEgU09BUCBlcnJvcgotICAgICAqLwotICAgIHB1YmxpYyBTT0FQRmF1bHQgY3JlYXRlRmF1bHQoKSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7Ci0gICAgICAgIG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmFjdG9yeSBzb2FwRmFjdG9yeTsKLSAgICAgICAgaWYgKHNvYXBWZXJzaW9uLmVxdWFscyhTT0FQQ29uc3RhbnRzLlNPQVBfMV8yX1BST1RPQ09MKSkgewotICAgICAgICAgICAgc29hcEZhY3RvcnkgPSBET09NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMkZhY3RvcnkoKTsKLSAgICAgICAgICAgIHJldHVybiBuZXcgU09BUEZhdWx0SW1wbChzb2FwRmFjdG9yeS5jcmVhdGVTT0FQRmF1bHQoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzb2FwRmFjdG9yeSA9IERPT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDExRmFjdG9yeSgpOwotICAgICAgICAgICAgcmV0dXJuIG5ldyBTT0FQRmF1bHRJbXBsKHNvYXBGYWN0b3J5LmNyZWF0ZVNPQVBGYXVsdCgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgU09BUEZhdWx0IG9iamVjdCBpbml0aWFsaXplZCB3aXRoIHRoZSBnaXZlbiByZWFzb25UZXh0IGFuZCBmYXVsdENvZGUKLSAgICAgKgotICAgICAqIEBwYXJhbSByZWFzb25UZXh0IC0gdGhlIFJlYXNvblRleHQvRmF1bHRTdHJpbmcgZm9yIHRoZSBmYXVsdCBmYXVsdENvZGUgLSB0aGUgRmF1bHRDb2RlIGZvcgotICAgICAqICAgICAgICAgICAgICAgICAgIHRoZSBmYXVsdAotICAgICAqIEByZXR1cm46IGEgU09BUEZhdWx0IG9iamVjdAotICAgICAqIEB0aHJvd3M6IFNPQVBFeGNlcHRpb24gLSBpZiB0aGVyZSBpcyBhIFNPQVAgZXJyb3IKLSAgICAgKi8KLSAgICBwdWJsaWMgU09BUEZhdWx0IGNyZWF0ZUZhdWx0KFN0cmluZyByZWFzb25UZXh0LCBRTmFtZSBmYXVsdENvZGUpIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLSAgICAgICAgU09BUEZhdWx0IHNvYXBGYXVsdDsKLSAgICAgICAgaWYgKHNvYXBWZXJzaW9uLmVxdWFscyhTT0FQQ29uc3RhbnRzLlNPQVBfMV8yX1BST1RPQ09MKSkgewotICAgICAgICAgICAgc29hcEZhdWx0ID0gbmV3IFNPQVBGYXVsdEltcGwoRE9PTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTJGYWN0b3J5KCkKLSAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZVNPQVBGYXVsdCgpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNvYXBGYXVsdCA9IG5ldyBTT0FQRmF1bHRJbXBsKERPT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDExRmFjdG9yeSgpCi0gICAgICAgICAgICAgICAgICAgIC5jcmVhdGVTT0FQRmF1bHQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgc29hcEZhdWx0LnNldEZhdWx0Q29kZShmYXVsdENvZGUpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgc29hcEZhdWx0LmFkZEZhdWx0UmVhc29uVGV4dChyZWFzb25UZXh0LCBMb2NhbGUuZ2V0RGVmYXVsdCgpKTsKLSAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNPQVBFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHNvYXBGYXVsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTT0FQVmVyc2lvbihTdHJpbmcgc29hcFZlcnNpb24pIHsKLSAgICAgICAgdGhpcy5zb2FwVmVyc2lvbiA9IHNvYXBWZXJzaW9uOwotICAgIH0KLQotCi0gICAgcHVibGljIFNPQVBFbGVtZW50IGNyZWF0ZUVsZW1lbnQoUU5hbWUgcW5hbWUpIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIGxvY2FsTmFtZSA9IHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICBTdHJpbmcgcHJlZml4ID0gcW5hbWUuZ2V0UHJlZml4KCk7Ci0gICAgICAgIFN0cmluZyB1cmkgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IERPT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCkuY3JlYXRlT01FbGVtZW50KGxvY2FsTmFtZQotICAgICAgICAgICAgICAgICwgdXJpLCBwcmVmaXgpOwotICAgICAgICByZXR1cm4gbmV3IFNPQVBFbGVtZW50SW1wbCgoRWxlbWVudEltcGwpb21FbGVtZW50KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU09BUEVsZW1lbnQgY3JlYXRlRWxlbWVudChFbGVtZW50IGVsZW1lbnQpIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLSAgICAgICAgT01ET01GYWN0b3J5IG9tZG9tRmFjdG9yeSA9IG51bGw7Ci0gICAgICAgIGlmIChzb2FwVmVyc2lvbi5lcXVhbHMoU09BUENvbnN0YW50cy5TT0FQXzFfMl9QUk9UT0NPTCkpIHsKLSAgICAgICAgICAgIG9tZG9tRmFjdG9yeSA9IChPTURPTUZhY3RvcnkpRE9PTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTJGYWN0b3J5KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBvbWRvbUZhY3RvcnkgPSAoT01ET01GYWN0b3J5KURPT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDExRmFjdG9yeSgpOwotICAgICAgICB9Ci0gICAgICAgIE9NTmFtZXNwYWNlIG5zID0gb21kb21GYWN0b3J5LmNyZWF0ZU9NTmFtZXNwYWNlKGVsZW1lbnQuZ2V0TmFtZXNwYWNlVVJJKCkKLSAgICAgICAgICAgICAgICAsIGVsZW1lbnQuZ2V0UHJlZml4KCkpOwotICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gb21kb21GYWN0b3J5LmNyZWF0ZU9NRWxlbWVudChlbGVtZW50LmdldExvY2FsTmFtZSgpLCBucyk7Ci0gICAgICAgIHJldHVybiBuZXcgU09BUEVsZW1lbnRJbXBsKChFbGVtZW50SW1wbClvbUVsZW1lbnQpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2Fhai9zcmMvb3JnL2FwYWNoZS9heGlzMi9zYWFqL1NPQVBGYXVsdEVsZW1lbnRJbXBsLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9zYWFqL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NhYWovU09BUEZhdWx0RWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzViMTUyNy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYWFqL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NhYWovU09BUEZhdWx0RWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zYWFqOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmRvbS5FbGVtZW50SW1wbDsKLQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBGYXVsdEVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBTT0FQRmF1bHRFbGVtZW50SW1wbCBleHRlbmRzIFNPQVBFbGVtZW50SW1wbCBpbXBsZW1lbnRzCi0gICAgICAgIFNPQVBGYXVsdEVsZW1lbnQgewotCi0gICAgLyoqIEBwYXJhbSBlbGVtZW50ICAqLwotICAgIHB1YmxpYyBTT0FQRmF1bHRFbGVtZW50SW1wbChFbGVtZW50SW1wbCBlbGVtZW50KSB7Ci0gICAgICAgIHN1cGVyKGVsZW1lbnQpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2Fhai9zcmMvb3JnL2FwYWNoZS9heGlzMi9zYWFqL1NPQVBGYXVsdEltcGwuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhYWovc3JjL29yZy9hcGFjaGUvYXhpczIvc2Fhai9TT0FQRmF1bHRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExMzExYjYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2Fhai9zcmMvb3JnL2FwYWNoZS9heGlzMi9zYWFqL1NPQVBGYXVsdEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2FhajsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01OYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLk9NTmFtZXNwYWNlSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuZG9tLkRPT01BYnN0cmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmRvbS5FbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuZG9tLk5vZGVJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQMTFDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVAxMkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYXVsdENvZGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYXVsdERldGFpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhdWx0Tm9kZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhdWx0UmVhc29uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmF1bHRSb2xlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmF1bHRTdWJDb2RlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmF1bHRUZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmF1bHRWYWx1ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuaW1wbC5kb20uU09BUEZhdWx0VmFsdWVJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5pbXBsLmRvbS5zb2FwMTEuU09BUDExRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuaW1wbC5kb20uc29hcDExLlNPQVAxMUZhdWx0RGV0YWlsSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuaW1wbC5kb20uc29hcDExLlNPQVAxMUZhdWx0UmVhc29uSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuaW1wbC5kb20uc29hcDExLlNPQVAxMUZhdWx0Um9sZUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLmltcGwuZG9tLnNvYXAxMi5TT0FQMTJGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5pbXBsLmRvbS5zb2FwMTIuU09BUDEyRmF1bHREZXRhaWxJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5pbXBsLmRvbS5zb2FwMTIuU09BUDEyRmF1bHRSb2xlSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuaW1wbC5kb20uc29hcDEyLlNPQVAxMkZhdWx0VmFsdWVJbXBsOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5EZXRhaWw7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuTmFtZTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5Ob2RlOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBDb25zdGFudHM7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRmF1bHQ7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEZhdWx0RWxlbWVudDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotCi1wdWJsaWMgY2xhc3MgU09BUEZhdWx0SW1wbCBleHRlbmRzIFNPQVBCb2R5RWxlbWVudEltcGwgaW1wbGVtZW50cyBTT0FQRmF1bHQgewotCi0gICAgcHJvdGVjdGVkIG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmF1bHQgZmF1bHQ7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGlzRGV0YWlsQWRkZWQ7Ci0gICAgcHJpdmF0ZSBMb2NhbGUgZmF1bHRSZWFzb25Mb2NhbGU7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGRlZmF1bHRzU2V0OwotCi0gICAgLyoqIEBwYXJhbSBmYXVsdCAgKi8KLSAgICBwdWJsaWMgU09BUEZhdWx0SW1wbChvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhdWx0IGZhdWx0KSB7Ci0gICAgICAgIHN1cGVyKChFbGVtZW50SW1wbClmYXVsdCk7Ci0gICAgICAgIHRoaXMuZmF1bHQgPSBmYXVsdDsKLSAgICB9Ci0KLSAgICB2b2lkIHNldERlZmF1bHRzKCkgdGhyb3dzIFNPQVBFeGNlcHRpb24gewotICAgICAgICBpZiAodGhpcy5lbGVtZW50LmdldE9NRmFjdG9yeSgpIGluc3RhbmNlb2YgU09BUDExRmFjdG9yeSkgewotICAgICAgICAgICAgc2V0RmF1bHRDb2RlKFNPQVAxMUNvbnN0YW50cy5RTkFNRV9TRU5ERVJfRkFVTFRDT0RFKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNldEZhdWx0Q29kZShTT0FQMTJDb25zdGFudHMuUU5BTUVfU0VOREVSX0ZBVUxUQ09ERSk7Ci0gICAgICAgIH0KLSAgICAgICAgc2V0RmF1bHRTdHJpbmcoIkZhdWx0IHN0cmluZywgYW5kIHBvc3NpYmx5IGZhdWx0IGNvZGUsIG5vdCBzZXQiKTsKLSAgICAgICAgZGVmYXVsdHNTZXQgPSB0cnVlOwotICAgIH0KLSAgICAKLSAgICB2b2lkIHJlbW92ZURlZmF1bHRzKCkgewotICAgICAgICBpZiAoZGVmYXVsdHNTZXQpIHsKLSAgICAgICAgICAgIFNPQVBGYXVsdFJlYXNvbiByZWFzb24gPSB0aGlzLmZhdWx0LmdldFJlYXNvbigpOwotICAgICAgICAgICAgaWYgKHJlYXNvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmVhc29uLmRldGFjaCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGVmYXVsdHNTZXQgPSBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoaXMgPENPREU+U09BUEZhdWx0PC9DT0RFPiBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4gZmF1bHQgY29kZS4KLSAgICAgKiA8cC8+Ci0gICAgICogRmF1bHQgY29kZXMsIHdoaWNoIGdpdmVuIGluZm9ybWF0aW9uIGFib3V0IHRoZSBmYXVsdCwgYXJlIGRlZmluZWQgaW4gdGhlIFNPQVAgMS4xCi0gICAgICogc3BlY2lmaWNhdGlvbi4gVGhpcyBlbGVtZW50IGlzIG1hbmRhdG9yeSBpbiBTT0FQIDEuMS4gQmVjYXVzZSB0aGUgZmF1bHQgY29kZSBpcyByZXF1aXJlZCB0bwotICAgICAqIGJlIGEgUU5hbWUgaXQgaXMgcHJlZmVyYWJsZSB0byB1c2UgdGhlIHNldEZhdWx0Q29kZShOYW1lKWZvcm0gb2YgdGhpcyBtZXRob2QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZmF1bHRDb2RlIC0gYSBTdHJpbmcgZ2l2aW5nIHRoZSBmYXVsdCBjb2RlIHRvIGJlIHNldC4gSXQgbXVzdCBiZSBvZiB0aGUgZm9ybQotICAgICAqICAgICAgICAgICAgICAgICAgInByZWZpeDpsb2NhbE5hbWUiIHdoZXJlIHRoZSBwcmVmaXggaGFzIGJlZW4gZGVmaW5lZCBpbiBhIG5hbWVzcGFjZQotICAgICAqICAgICAgICAgICAgICAgICAgZGVjbGFyYXRpb24uCi0gICAgICogQHRocm93cyBTT0FQRXhjZXB0aW9uIC0gaWYgdGhlcmUgd2FzIGFuIGVycm9yIGluIGFkZGluZyB0aGUgZmF1bHRDb2RlIHRvIHRoZSB1bmRlcmx5aW5nIFhNTAotICAgICAqICAgICAgICAgICAgICAgICAgICAgICB0cmVlLgotICAgICAqIEBzZWUgc2V0RmF1bHRDb2RlKE5hbWUpLCBnZXRGYXVsdENvZGUoKSxTT0FQRWxlbWVudC5hZGROYW1lc3BhY2VEZWNsYXJhdGlvbihTdHJpbmcsIFN0cmluZykKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRGYXVsdENvZGUoU3RyaW5nIGZhdWx0Q29kZSkgdGhyb3dzIFNPQVBFeGNlcHRpb24gewotICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhY3Rvcnkgc29hcEZhY3RvcnkgPSBudWxsOwotICAgICAgICBTT0FQRmF1bHRDb2RlIHNvYXBGYXVsdENvZGUgPSBudWxsOwotCi0gICAgICAgIC8vSXQgbXVzdCBiZSBvZiB0aGUgZm9ybSAicHJlZml4OmxvY2FsTmFtZSIgd2hlcmUgdGhlIHByZWZpeCBoYXMgYmVlbiBkZWZpbmVkIGluIGEKLSAgICAgICAgLy9uYW1lc3BhY2UgZGVjbGFyYXRpb24uCi0gICAgICAgIGlmIChmYXVsdENvZGUuaW5kZXhPZigiOiIpID09IC0xKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU09BUEV4Y2VwdGlvbigiZmF1bHRDb2RlIG11c3QgYmUgb2YgdGhlIGZvcm0gcHJlZml4OmxvY2FsTmFtZSIpOwotICAgICAgICB9Ci0vLyAgICAgICAgCWVsc2V7Ci0vLyAgICAgICAgICAgIAlTdHJpbmcgcHJlZml4LGxvY2FsTmFtZSA9IiI7Ci0vLyAgICAgICAgCQlwcmVmaXggPSBmYXVsdENvZGUuc3Vic3RyaW5nKDAsIGZhdWx0Q29kZS5pbmRleE9mKCI6IikpOwotLy8gICAgICAgIAkJbG9jYWxOYW1lID0gZmF1bHRDb2RlLnN1YnN0cmluZyhmYXVsdENvZGUuaW5kZXhPZigiOiIpKzEpOwotLy8gICAgICAgIAl9Ci0KLSAgICAgICAgaWYgKHRoaXMuZWxlbWVudC5nZXRPTUZhY3RvcnkoKSBpbnN0YW5jZW9mIFNPQVAxMUZhY3RvcnkpIHsKLSAgICAgICAgICAgIHNvYXBGYWN0b3J5ID0gKFNPQVAxMUZhY3RvcnkpdGhpcy5lbGVtZW50LmdldE9NRmFjdG9yeSgpOwotICAgICAgICAgICAgc29hcEZhdWx0Q29kZSA9IHNvYXBGYWN0b3J5LmNyZWF0ZVNPQVBGYXVsdENvZGUoZmF1bHQpOwotICAgICAgICAgICAgc29hcEZhdWx0Q29kZS5zZXRUZXh0KGZhdWx0Q29kZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAodGhpcy5lbGVtZW50LmdldE9NRmFjdG9yeSgpIGluc3RhbmNlb2YgU09BUDEyRmFjdG9yeSkgewotICAgICAgICAgICAgc29hcEZhY3RvcnkgPSAoU09BUDEyRmFjdG9yeSl0aGlzLmVsZW1lbnQuZ2V0T01GYWN0b3J5KCk7Ci0gICAgICAgICAgICBzb2FwRmF1bHRDb2RlID0gc29hcEZhY3RvcnkuY3JlYXRlU09BUEZhdWx0Q29kZShmYXVsdCk7Ci0gICAgICAgICAgICBTT0FQRmF1bHRWYWx1ZSBzb2FwRmF1bHRWYWx1ZSA9IHNvYXBGYWN0b3J5LmNyZWF0ZVNPQVBGYXVsdFZhbHVlKHNvYXBGYXVsdENvZGUpOwotICAgICAgICAgICAgc29hcEZhdWx0Q29kZS5zZXRWYWx1ZShzb2FwRmF1bHRWYWx1ZSk7Ci0gICAgICAgICAgICBzb2FwRmF1bHRWYWx1ZS5zZXRUZXh0KGZhdWx0Q29kZSk7Ci0gICAgICAgIH0KLQotICAgICAgICB0aGlzLmZhdWx0LnNldENvZGUoc29hcEZhdWx0Q29kZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgZmF1bHQgY29kZSBmb3IgdGhpcyA8Q09ERT5TT0FQRmF1bHQ8L0NPREU+IG9iamVjdC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYSA8Q09ERT5TdHJpbmc8L0NPREU+IHdpdGggdGhlIGZhdWx0IGNvZGUKLSAgICAgKiBAc2VlICNzZXRGYXVsdENvZGUoU3RyaW5nKSBzZXRGYXVsdENvZGUoamF2YS5sYW5nLlN0cmluZykKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZhdWx0Q29kZSgpIHsKLSAgICAgICAgaWYgKGZhdWx0ICE9IG51bGwgJiYgZmF1bHQuZ2V0Q29kZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmICh0aGlzLmVsZW1lbnQuZ2V0T01GYWN0b3J5KCkgaW5zdGFuY2VvZiBTT0FQMTFGYWN0b3J5KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhdWx0LmdldENvZGUoKS5nZXRUZXh0KCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZWxlbWVudC5nZXRPTUZhY3RvcnkoKSBpbnN0YW5jZW9mIFNPQVAxMkZhY3RvcnkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmF1bHQuZ2V0Q29kZSgpLmdldFZhbHVlKCkuZ2V0VGV4dCgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoaXMgU09BUEZhdWx0IG9iamVjdCB3aXRoIHRoZSBnaXZlbiBmYXVsdCBhY3Rvci5UaGUgZmF1bHQgYWN0b3IgaXMgdGhlIHJlY2lwaWVudCBpbiB0aGUKLSAgICAgKiBtZXNzYWdlIHBhdGggd2hvIGNhdXNlZCB0aGUgZmF1bHQgdG8gaGFwcGVuLiBJZiB0aGlzIFNPQVBGYXVsdCBzdXBwb3J0cyBTT0FQIDEuMiB0aGVuIHRoaXMKLSAgICAgKiBjYWxsIGlzIGVxdWl2YWxlbnQgdG8gc2V0RmF1bHRSb2xlKFN0cmluZykKLSAgICAgKgotICAgICAqIEBwYXJhbSBmYXVsdEFjdG9yIC0gYSBTdHJpbmcgaWRlbnRpZnlpbmcgdGhlIGFjdG9yIHRoYXQgY2F1c2VkIHRoaXMgU09BUEZhdWx0IG9iamVjdAotICAgICAqIEB0aHJvd3MgU09BUEV4Y2VwdGlvbiAtIGlmIHRoZXJlIHdhcyBhbiBlcnJvciBpbiBhZGRpbmcgdGhlIGZhdWx0QWN0b3IgdG8gdGhlIHVuZGVybHlpbmcgWE1MCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgIHRyZWUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RmF1bHRBY3RvcihTdHJpbmcgZmF1bHRBY3RvcikgdGhyb3dzIFNPQVBFeGNlcHRpb24gewotCi0gICAgICAgIGlmICh0aGlzLmVsZW1lbnQuZ2V0T01GYWN0b3J5KCkgaW5zdGFuY2VvZiBTT0FQMTFGYWN0b3J5KSB7Ci0gICAgICAgICAgICBpZiAodGhpcy5mYXVsdC5nZXRSb2xlKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFNPQVAxMUZhdWx0Um9sZUltcGwgZmF1bHRSb2xlSW1wbCA9IG5ldyBTT0FQMTFGYXVsdFJvbGVJbXBsKAotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mYXVsdCwgKFNPQVBGYWN0b3J5KXRoaXMuZWxlbWVudC5nZXRPTUZhY3RvcnkoKSk7Ci0KLSAgICAgICAgICAgICAgICBmYXVsdFJvbGVJbXBsLnNldFJvbGVWYWx1ZShmYXVsdEFjdG9yKTsKLSAgICAgICAgICAgICAgICB0aGlzLmZhdWx0LnNldFJvbGUoZmF1bHRSb2xlSW1wbCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFNPQVBGYXVsdFJvbGUgcm9sZSA9IHRoaXMuZmF1bHQuZ2V0Um9sZSgpOwotICAgICAgICAgICAgICAgIHJvbGUuc2V0Um9sZVZhbHVlKGZhdWx0QWN0b3IpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZWxlbWVudC5nZXRPTUZhY3RvcnkoKSBpbnN0YW5jZW9mIFNPQVAxMkZhY3RvcnkpIHsKLSAgICAgICAgICAgIGlmICh0aGlzLmZhdWx0LmdldFJvbGUoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgU09BUDEyRmF1bHRSb2xlSW1wbCBmYXVsdFJvbGVJbXBsID0gbmV3IFNPQVAxMkZhdWx0Um9sZUltcGwoCi0gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZhdWx0LCAoU09BUEZhY3RvcnkpdGhpcy5lbGVtZW50LmdldE9NRmFjdG9yeSgpKTsKLQotICAgICAgICAgICAgICAgIGZhdWx0Um9sZUltcGwuc2V0Um9sZVZhbHVlKGZhdWx0QWN0b3IpOwotICAgICAgICAgICAgICAgIHRoaXMuZmF1bHQuc2V0Um9sZShmYXVsdFJvbGVJbXBsKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgU09BUEZhdWx0Um9sZSByb2xlID0gdGhpcy5mYXVsdC5nZXRSb2xlKCk7Ci0gICAgICAgICAgICAgICAgcm9sZS5zZXRSb2xlVmFsdWUoZmF1bHRBY3Rvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgamF2YXgueG1sLnNvYXAuU09BUEZhdWx0I2dldEZhdWx0QWN0b3IoKQotICAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZhdWx0QWN0b3IoKSB7Ci0gICAgICAgIGlmICh0aGlzLmZhdWx0LmdldFJvbGUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5mYXVsdC5nZXRSb2xlKCkuZ2V0Um9sZVZhbHVlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZmF1bHQgc3RyaW5nIGZvciB0aGlzIDxDT0RFPlNPQVBGYXVsdDwvQ09ERT4gb2JqZWN0IHRvIHRoZSBnaXZlbiBzdHJpbmcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZmF1bHRTdHJpbmcgYSA8Q09ERT5TdHJpbmc8L0NPREU+IGdpdmluZyBhbiBleHBsYW5hdGlvbiBvZiB0aGUgZmF1bHQKLSAgICAgKiBAdGhyb3dzIFNPQVBFeGNlcHRpb24gaWYgdGhlcmUgd2FzIGFuIGVycm9yIGluIGFkZGluZyB0aGUgPENPREU+ZmF1bHRTdHJpbmc8L0NPREU+IHRvIHRoZQotICAgICAqICAgICAgICAgICAgICAgICAgICAgICB1bmRlcmx5aW5nIFhNTCB0cmVlLgotICAgICAqIEBzZWUgI2dldEZhdWx0U3RyaW5nKCkgZ2V0RmF1bHRTdHJpbmcoKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEZhdWx0U3RyaW5nKFN0cmluZyBmYXVsdFN0cmluZykgdGhyb3dzIFNPQVBFeGNlcHRpb24gewotICAgICAgICBpZiAodGhpcy5lbGVtZW50LmdldE9NRmFjdG9yeSgpIGluc3RhbmNlb2YgU09BUDExRmFjdG9yeSkgewotICAgICAgICAgICAgc2V0RmF1bHRTdHJpbmcoZmF1bHRTdHJpbmcsIG51bGwpOwotICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZWxlbWVudC5nZXRPTUZhY3RvcnkoKSBpbnN0YW5jZW9mIFNPQVAxMkZhY3RvcnkpIHsKLSAgICAgICAgICAgIHNldEZhdWx0U3RyaW5nKGZhdWx0U3RyaW5nLCBMb2NhbGUuZ2V0RGVmYXVsdCgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBqYXZheC54bWwuc29hcC5TT0FQRmF1bHQjZ2V0RmF1bHRTdHJpbmcoKQotICAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZhdWx0U3RyaW5nKCkgewotCi0gICAgICAgIGlmICh0aGlzLmZhdWx0LmdldE5hbWVzcGFjZSgpLmdldE5hbWVzcGFjZVVSSSgpLmVxdWFscygKLSAgICAgICAgICAgICAgICBTT0FQMTFDb25zdGFudHMuU09BUF9FTlZFTE9QRV9OQU1FU1BBQ0VfVVJJKSkgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmF1bHQuZ2V0UmVhc29uKCkuZ2V0VGV4dCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKHRoaXMuZmF1bHQuZ2V0UmVhc29uKCkgIT0gbnVsbCAmJiB0aGlzLmZhdWx0LmdldFJlYXNvbigpLmdldEZpcnN0U09BUFRleHQoKSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmZhdWx0LmdldFJlYXNvbigpLmdldEZpcnN0U09BUFRleHQoKS5nZXRUZXh0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIGphdmF4LnhtbC5zb2FwLlNPQVBGYXVsdCNnZXREZXRhaWwoKQotICAgICAgKi8KLSAgICBwdWJsaWMgRGV0YWlsIGdldERldGFpbCgpIHsKLSAgICAgICAgcmV0dXJuIChEZXRhaWwpdG9TQUFKTm9kZSgob3JnLnczYy5kb20uTm9kZSlmYXVsdC5nZXREZXRhaWwoKSk7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoaXMgU09BUEZhdWx0IG9iamVjdCB3aXRoIHRoZSBnaXZlbiBmYXVsdCBjb2RlLkZhdWx0IGNvZGVzLCB3aGljaCBnaXZlIGluZm9ybWF0aW9uCi0gICAgICogYWJvdXQgdGhlIGZhdWx0LCBhcmUgZGVmaW5lZCBpbiB0aGUgU09BUCAxLjEgc3BlY2lmaWNhdGlvbi4gQSBmYXVsdCBjb2RlIGlzIG1hbmRhdG9yeSBhbmQKLSAgICAgKiBtdXN0IGJlIG9mIHR5cGUgUU5hbWUuIFRoaXMgbWV0aG9kIHByb3ZpZGVzIGEgY29udmVuaWVudCB3YXkgdG8gc2V0IGEgZmF1bHQgY29kZS4gRm9yCi0gICAgICogZXhhbXBsZSwKLSAgICAgKiA8cC8+Ci0gICAgICogU09BUEVudmVsb3BlIHNlID0gLi4uOyAvLyBDcmVhdGUgYSBxdWFsaWZpZWQgbmFtZSBpbiB0aGUgU09BUCBuYW1lc3BhY2Ugd2l0aCBhIGxvY2FsTmFtZSAvLwotICAgICAqIG9mIENsaWVudC4gTm90ZSB0aGF0IHByZWZpeCBwYXJhbWV0ZXIgaXMgb3B0aW9uYWwgYW5kIGlzIG51bGwgLy8gaGVyZSB3aGljaCBjYXVzZXMgdGhlCi0gICAgICogaW1wbGVtZW50YXRpb24gdG8gdXNlIGFuIGFwcHJvcHJpYXRlIHByZWZpeC4gTmFtZSBxbmFtZSA9IHNlLmNyZWF0ZU5hbWUoQ2xpZW50LAotICAgICAqIG51bGwsU09BUENvbnN0YW50cy5VUklfTlNfU09BUF9FTlZFTE9QRSk7IFNPQVBGYXVsdCBmYXVsdCA9IC4uLjsgZmF1bHQuc2V0RmF1bHRDb2RlKHFuYW1lKTsKLSAgICAgKiA8cC8+Ci0gICAgICogSXQgaXMgcHJlZmVyYWJsZSB0byB1c2UgdGhpcyBtZXRob2Qgb3ZlciBzZXRGYXVsdENvZGUoU3RyaW5nKS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmYXVsdENvZGVRTmFtZSAtIGEgTmFtZSBvYmplY3QgZ2l2aW5nIHRoZSBmYXVsdCBjb2RlIHRvIGJlIHNldC4gSXQgbXVzdCBiZSBuYW1lc3BhY2UKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgcXVhbGlmaWVkLgotICAgICAqIEB0aHJvd3MgU09BUEV4Y2VwdGlvbiAtIGlmIHRoZXJlIHdhcyBhbiBlcnJvciBpbiBhZGRpbmcgdGhlIGZhdWx0Y29kZSBlbGVtZW50IHRvIHRoZQotICAgICAqICAgICAgICAgICAgICAgICAgICAgICB1bmRlcmx5aW5nIFhNTCB0cmVlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEZhdWx0Q29kZShOYW1lIGZhdWx0Q29kZU5hbWUpIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGZhdWx0Q29kZU5hbWUuZ2V0VVJJKCkgPT0gbnVsbCB8fCBmYXVsdENvZGVOYW1lLmdldFVSSSgpLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU09BUEV4Y2VwdGlvbigiZmF1bHRDb2RlUU5hbWUgbXVzdCBiZSBuYW1lc3BhY2UgcXVhbGlmaWVkLiIpOwotICAgICAgICB9Ci0gICAgICAgIFFOYW1lIGZhdWx0Q29kZVFOYW1lID0gCi0gICAgICAgICAgICBuZXcgUU5hbWUoZmF1bHRDb2RlTmFtZS5nZXRVUkkoKSwgZmF1bHRDb2RlTmFtZS5nZXRMb2NhbE5hbWUoKSwgZmF1bHRDb2RlTmFtZS5nZXRQcmVmaXgoKSk7Ci0gICAgICAgIHNldEZhdWx0Q29kZShmYXVsdENvZGVRTmFtZSk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIGphdmF4LnhtbC5zb2FwLlNPQVBGYXVsdCNhZGREZXRhaWwoKQotICAgICAgKi8KLSAgICBwdWJsaWMgRGV0YWlsIGFkZERldGFpbCgpIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGlzRGV0YWlsQWRkZWQpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTT0FQRXhjZXB0aW9uKCJUaGlzIFNPQVBGYXVsdCBhbHJlYWR5IGNvbnRhaW5zIGEgRGV0YWlsIGVsZW1lbnQuICIgKwotICAgICAgICAgICAgICAgICAgICAiUGxlYXNlIHJlbW92ZSB0aGUgZXhpc3RpbmcgRGV0YWlsIGVsZW1lbnQgYmVmb3JlICIgKwotICAgICAgICAgICAgICAgICAgICAiY2FsbGluZyBhZGREZXRhaWwoKSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgU09BUEZhdWx0RGV0YWlsIG9tRGV0YWlsOwotICAgICAgICBTT0FQRmFjdG9yeSBmYWN0b3J5ID0gKFNPQVBGYWN0b3J5KXRoaXMuZWxlbWVudC5nZXRPTUZhY3RvcnkoKTsKLSAgICAgICAgaWYgKGZhY3RvcnkgaW5zdGFuY2VvZiBTT0FQMTFGYWN0b3J5KSB7Ci0gICAgICAgICAgICBvbURldGFpbCA9IG5ldyBTT0FQMTFGYXVsdERldGFpbEltcGwodGhpcy5mYXVsdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3J5KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG9tRGV0YWlsID0gbmV3IFNPQVAxMkZhdWx0RGV0YWlsSW1wbCh0aGlzLmZhdWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3RvcnkpOwotICAgICAgICB9Ci0gICAgICAgIERldGFpbCBzYWFqRGV0YWlsID0gbmV3IERldGFpbEltcGwob21EZXRhaWwpOwotICAgICAgICAoKE5vZGVJbXBsKWZhdWx0LmdldERldGFpbCgpKS5zZXRVc2VyRGF0YShTQUFKX05PREUsIHNhYWpEZXRhaWwsIG51bGwpOwotICAgICAgICBpc0RldGFpbEFkZGVkID0gdHJ1ZTsKLSAgICAgICAgcmV0dXJuIHNhYWpEZXRhaWw7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIGphdmF4LnhtbC5zb2FwLlNPQVBGYXVsdCNnZXRGYXVsdENvZGVBc05hbWUoKQotICAgICAgKi8KLSAgICBwdWJsaWMgTmFtZSBnZXRGYXVsdENvZGVBc05hbWUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgUHJlZml4ZWRRTmFtZShnZXRGYXVsdENvZGVBc1FOYW1lKCkpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZmF1bHQgc3RyaW5nIGZvciB0aGlzIFNPQVBGYXVsdCBvYmplY3QgdG8gdGhlIGdpdmVuIHN0cmluZy4gSWYgdGhpcyBTT0FQRmF1bHQgaXMKLSAgICAgKiBwYXJ0IG9mIGEgbWVzc2FnZSB0aGF0IHN1cHBvcnRzIFNPQVAgMS4yIHRoZW4gdGhpcyBjYWxsIGlzIGVxdWl2YWxlbnQgdG86Ci0gICAgICogYWRkRmF1bHRSZWFzb25UZXh0KGZhdWx0U3RyaW5nLCBMb2NhbGUuZ2V0RGVmYXVsdCgpKTsKLSAgICAgKgotICAgICAqIEBwYXJhbSBmYXVsdFN0cmluZyAtIGEgU3RyaW5nIGdpdmluZyBhbiBleHBsYW5hdGlvbiBvZiB0aGUgZmF1bHQKLSAgICAgKiBAdGhyb3dzIFNPQVBFeGNlcHRpb24gLSBpZiB0aGVyZSB3YXMgYW4gZXJyb3IgaW4gYWRkaW5nIHRoZSBmYXVsdFN0cmluZyB0byB0aGUgdW5kZXJseWluZyBYTUwKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgdHJlZS4KLSAgICAgKiBAc2VlIGdldEZhdWx0U3RyaW5nKCkKLSAgICAgKi8KLQotICAgIHB1YmxpYyB2b2lkIHNldEZhdWx0U3RyaW5nKFN0cmluZyBmYXVsdFN0cmluZywgTG9jYWxlIGxvY2FsZSkgdGhyb3dzIFNPQVBFeGNlcHRpb24gewotICAgICAgICBpZiAodGhpcy5mYXVsdC5nZXRSZWFzb24oKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTT0FQRmF1bHRSZWFzb24gcmVhc29uID0gdGhpcy5mYXVsdC5nZXRSZWFzb24oKTsKLSAgICAgICAgICAgIGlmICh0aGlzLmVsZW1lbnQuZ2V0T01GYWN0b3J5KCkgaW5zdGFuY2VvZiBTT0FQMTFGYWN0b3J5KSB7Ci0gICAgICAgICAgICAgICAgcmVhc29uLnNldFRleHQoZmF1bHRTdHJpbmcpOwotICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmVsZW1lbnQuZ2V0T01GYWN0b3J5KCkgaW5zdGFuY2VvZiBTT0FQMTJGYWN0b3J5KSB7Ci0gICAgICAgICAgICAgICAgYWRkRmF1bHRSZWFzb25UZXh0KGZhdWx0U3RyaW5nLCBsb2NhbGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKHRoaXMuZWxlbWVudC5nZXRPTUZhY3RvcnkoKSBpbnN0YW5jZW9mIFNPQVAxMUZhY3RvcnkpIHsKLSAgICAgICAgICAgICAgICBTT0FQRmF1bHRSZWFzb24gcmVhc29uID0gbmV3IFNPQVAxMUZhdWx0UmVhc29uSW1wbCh0aGlzLmZhdWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTT0FQRmFjdG9yeSl0aGlzLmVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICAgICAgcmVhc29uLnNldFRleHQoZmF1bHRTdHJpbmcpOwotICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmVsZW1lbnQuZ2V0T01GYWN0b3J5KCkgaW5zdGFuY2VvZiBTT0FQMTJGYWN0b3J5KSB7Ci0gICAgICAgICAgICAgICAgYWRkRmF1bHRSZWFzb25UZXh0KGZhdWx0U3RyaW5nLCBsb2NhbGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHRoaXMuZmF1bHRSZWFzb25Mb2NhbGUgPSBsb2NhbGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbG9jYWxlIG9mIHRoZSBmYXVsdCBzdHJpbmcgZm9yIHRoaXMgU09BUEZhdWx0IG9iamVjdC4gSWYgdGhpcyBTT0FQRmF1bHQgaXMgcGFydCBvZiBhCi0gICAgICogbWVzc2FnZSB0aGF0IHN1cHBvcnRzIFNPQVAgMS4yIHRoZW4gdGhpcyBjYWxsIGlzIGVxdWl2YWxlbnQgdG86Ci0gICAgICogPHAvPgotICAgICAqIExvY2FsZSBsb2NhbGUgPSBudWxsOyB0cnkgeyBsb2NhbGUgPSAoTG9jYWxlKSBnZXRGYXVsdFJlYXNvbkxvY2FsZXMoKS5uZXh0KCk7IH0gY2F0Y2gKLSAgICAgKiAoU09BUEV4Y2VwdGlvbiBlKSB7fSByZXR1cm4gbG9jYWxlOwotICAgICAqCi0gICAgICogQHJldHVybiBhIExvY2FsZSBvYmplY3QgaW5kaWNhdGluZyB0aGUgbmF0aXZlIGxhbmd1YWdlIG9mIHRoZSBmYXVsdCBzdHJpbmcgb3IgbnVsbCBpZiBubwotICAgICAqICAgICAgICAgbG9jYWxlIHdhcyBzcGVjaWZpZWQKLSAgICAgKiBAc2VlIHNldEZhdWx0U3RyaW5nKFN0cmluZywgTG9jYWxlKQotICAgICAqIEBzaW5jZSBTQUFKIDEuMgotICAgICAqLwotICAgIHB1YmxpYyBMb2NhbGUgZ2V0RmF1bHRTdHJpbmdMb2NhbGUoKSB7Ci0gICAgICAgIGlmICh0aGlzLmVsZW1lbnQuZ2V0T01GYWN0b3J5KCkgaW5zdGFuY2VvZiBTT0FQMTFGYWN0b3J5KSB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5mYXVsdFJlYXNvbkxvY2FsZTsKLSAgICAgICAgfSBlbHNlIGlmICh0aGlzLmVsZW1lbnQuZ2V0T01GYWN0b3J5KCkgaW5zdGFuY2VvZiBTT0FQMTJGYWN0b3J5KSB7Ci0gICAgICAgICAgICBMb2NhbGUgbG9jYWxlID0gbnVsbDsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaWYgKGdldEZhdWx0UmVhc29uTG9jYWxlcygpLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2NhbGUgPSAoTG9jYWxlKWdldEZhdWx0UmVhc29uTG9jYWxlcygpLm5leHQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoU09BUEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBsb2NhbGU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXBwZW5kcyBvciByZXBsYWNlcyBhIFJlYXNvbiBUZXh0IGl0ZW0gY29udGFpbmluZyB0aGUgc3BlY2lmaWVkIHRleHQgbWVzc2FnZSBhbmQgYW4geG1sOmxhbmcKLSAgICAgKiBkZXJpdmVkIGZyb20gbG9jYWxlLiBJZiBhIFJlYXNvbiBUZXh0IGl0ZW0gd2l0aCB0aGlzIHhtbDpsYW5nIGFscmVhZHkgZXhpc3RzIGl0cyB0ZXh0IHZhbHVlCi0gICAgICogd2lsbCBiZSByZXBsYWNlZCB3aXRoIHRleHQuIFRoZSBsb2NhbGUgcGFyYW1ldGVyIHNob3VsZCBub3QgYmUgbnVsbCBDb2RlIHNhbXBsZTogU09BUEZhdWx0Ci0gICAgICogZmF1bHQgPSAuLi47IGZhdWx0LmFkZEZhdWx0UmVhc29uVGV4dChWZXJzaW9uIE1pc21hdGNoLCBMb2NhbGUuRU5HTElTSCk7Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gdGV4dCAtIHJlYXNvbiBtZXNzYWdlIHN0cmluZyBsb2NhbGUgLSBMb2NhbGUgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgbG9jYWxlIG9mIHRoZQotICAgICAqICAgICAgICAgICAgIG1lc3NhZ2UKLSAgICAgKiBAdGhyb3dzIFNPQVBFeGNlcHRpb24gLSBpZiB0aGVyZSB3YXMgYW4gZXJyb3IgaW4gYWRkaW5nIHRoZSBSZWFzb24gdGV4dCBvciB0aGUgbG9jYWxlIHBhc3NlZAotICAgICAqICAgICAgICAgICAgICAgICAgICAgICB3YXMgbnVsbC4gamF2YS5sYW5nLlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIC0gaWYgdGhpcyBtZXNzYWdlCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgIGRvZXMgbm90IHN1cHBvcnQgdGhlIFNPQVAgMS4yIGNvbmNlcHQgb2YgRmF1bHQgUmVhc29uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZEZhdWx0UmVhc29uVGV4dChTdHJpbmcgdGV4dCwgTG9jYWxlIGxvY2FsZSkgdGhyb3dzIFNPQVBFeGNlcHRpb24gewotICAgICAgICBpZiAobG9jYWxlID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTT0FQRXhjZXB0aW9uKCJSZWNlaXZlZCBudWxsIGZvciBsb2NhbGUiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAodGhpcy5lbGVtZW50LmdldE9NRmFjdG9yeSgpIGluc3RhbmNlb2YgU09BUDExRmFjdG9yeSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJOb3Qgc3VwcG9ydGVkIGluIFNPQVAgMS4xIik7Ci0gICAgICAgIH0gZWxzZSBpZiAodGhpcy5lbGVtZW50LmdldE9NRmFjdG9yeSgpIGluc3RhbmNlb2YgU09BUDEyRmFjdG9yeSkgewotICAgICAgICAgICAgcmVtb3ZlRGVmYXVsdHMoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgU3RyaW5nIGV4aXN0aW5nUmVhc29uVGV4dCA9IGdldEZhdWx0UmVhc29uVGV4dChsb2NhbGUpOwotICAgICAgICAgICAgaWYgKGV4aXN0aW5nUmVhc29uVGV4dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYWN0b3J5IHNvYXBGYWN0b3J5ID0gbnVsbDsKLSAgICAgICAgICAgICAgICBzb2FwRmFjdG9yeSA9IChTT0FQMTJGYWN0b3J5KXRoaXMuZWxlbWVudC5nZXRPTUZhY3RvcnkoKTsKLSAgICAgICAgICAgICAgICBpZiAodGhpcy5mYXVsdC5nZXRSZWFzb24oKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIFNPQVBGYXVsdFJlYXNvbiBzb2FwRmF1bHRSZWFzb24gPSBzb2FwRmFjdG9yeS5jcmVhdGVTT0FQRmF1bHRSZWFzb24odGhpcy5mYXVsdCk7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMuZmF1bHQuc2V0UmVhc29uKHNvYXBGYXVsdFJlYXNvbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFNPQVBGYXVsdFRleHQgc29hcEZhdWx0VGV4dCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBzb2FwRmFjdG9yeS5jcmVhdGVTT0FQRmF1bHRUZXh0KHRoaXMuZmF1bHQuZ2V0UmVhc29uKCkpOwotICAgICAgICAgICAgICAgIHNvYXBGYXVsdFRleHQuc2V0VGV4dCh0ZXh0KTsKLSAgICAgICAgICAgICAgICBzb2FwRmF1bHRUZXh0LnNldExhbmcobG9jYWxlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvL3VwZGF0ZSB0aGUgdGV4dAotICAgICAgICAgICAgICAgIEl0ZXJhdG9yIHNvYXBUZXh0c0l0ciA9IHRoaXMuZmF1bHQuZ2V0UmVhc29uKCkuZ2V0QWxsU29hcFRleHRzKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAoc29hcFRleHRzSXRyLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICBTT0FQRmF1bHRUZXh0IHNvYXBGYXVsdFRleHQgPSAoU09BUEZhdWx0VGV4dClzb2FwVGV4dHNJdHIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoc29hcEZhdWx0VGV4dC5nZXRMYW5nKCkuZXF1YWxzKGxvY2FsZS50b1N0cmluZygpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgc29hcEZhdWx0VGV4dC5zZXRUZXh0KHRleHQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSBTdWJjb2RlIHRvIHRoZSBlbmQgb2YgdGhlIHNlcXVlbmNlIG9mIFN1YmNvZGVzIGNvbnRhaW5lZCBieSB0aGlzIFNPQVBGYXVsdC4gU3ViY29kZXMsCi0gICAgICogd2hpY2ggd2VyZSBpbnRyb2R1Y2VkIGluIFNPQVAgMS4yLCBhcmUgcmVwcmVzZW50ZWQgYnkgYSByZWN1cnNpdmUgc2VxdWVuY2Ugb2Ygc3ViZWxlbWVudHMKLSAgICAgKiByb290ZWQgaW4gdGhlIG1hbmRhdG9yeSBDb2RlIHN1YmVsZW1lbnQgb2YgYSBTT0FQIEZhdWx0LgotICAgICAqCi0gICAgICogQHBhcmFtIHN1YmNvZGUgLSBhIFFOYW1lIGNvbnRhaW5pbmcgdGhlIFZhbHVlIG9mIHRoZSBTdWJjb2RlLgotICAgICAqIEB0aHJvd3MgU09BUEV4Y2VwdGlvbiAtIGlmIHRoZXJlIHdhcyBhbiBlcnJvciBpbiBzZXR0aW5nIHRoZSBTdWJjb2RlIGphdmEubGFuZy5VbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAtIGlmIHRoaXMgbWVzc2FnZSBkb2VzIG5vdCBzdXBwb3J0IHRoZSBTT0FQIDEuMiBjb25jZXB0IG9mIFN1YmNvZGUuCi0gICAgICovCi0KLSAgICBwdWJsaWMgdm9pZCBhcHBlbmRGYXVsdFN1YmNvZGUoUU5hbWUgc3ViY29kZSkgdGhyb3dzIFNPQVBFeGNlcHRpb24gewotICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhY3Rvcnkgc29hcEZhY3RvcnkgPSBudWxsOwotICAgICAgICBTT0FQRmF1bHRTdWJDb2RlIHNvYXBGYXVsdFN1YkNvZGUgPSBudWxsOwotCi0gICAgICAgIGlmIChzdWJjb2RlLmdldE5hbWVzcGFjZVVSSSgpID09IG51bGwgfHwgc3ViY29kZS5nZXROYW1lc3BhY2VVUkkoKS50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNPQVBFeGNlcHRpb24oIlVucXVhbGlmaWVkIFFOYW1lIG9iamVjdCA6ICIgKyBzdWJjb2RlKTsKLSAgICAgICAgfQotICAgICAgICBpZiAodGhpcy5lbGVtZW50LmdldE9NRmFjdG9yeSgpIGluc3RhbmNlb2YgU09BUDExRmFjdG9yeSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAodGhpcy5lbGVtZW50LmdldE9NRmFjdG9yeSgpIGluc3RhbmNlb2YgU09BUDEyRmFjdG9yeSkgewotICAgICAgICAgICAgc29hcEZhY3RvcnkgPSBET09NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMkZhY3RvcnkoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh0aGlzLmZhdWx0LmdldENvZGUoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBzb2FwRmFjdG9yeS5jcmVhdGVTT0FQRmF1bHRDb2RlKHRoaXMuZmF1bHQpOwotICAgICAgICAgICAgLy9pZiBTT0FQRmF1bHQgaXMgbnVsbCwgdGhlcmUgY2Fubm90IGJlIGEgc3ViY29kZS4KLSAgICAgICAgICAgIC8vSGVuY2Ugc2hvdWxkIGNyZWF0ZSBvbmUKLSAgICAgICAgICAgIHNvYXBGYXVsdFN1YkNvZGUgPSBzb2FwRmFjdG9yeS5jcmVhdGVTT0FQRmF1bHRTdWJDb2RlKHRoaXMuZmF1bHQuZ2V0Q29kZSgpKTsKLSAgICAgICAgfSBlbHNlIGlmICh0aGlzLmZhdWx0LmdldENvZGUoKS5nZXRTdWJDb2RlKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgLy9maW5kIHRoZSBsYXN0IHN1YmNvZGUucGFyZW50IG9mIHRoZSBuZXcgc3ViY29kZSBzaG91bGQgYmUgdGhlIHRoaXMgbGFzdCBzdWJjb2RlCi0gICAgICAgICAgICBzb2FwRmF1bHRTdWJDb2RlID0gc29hcEZhY3RvcnkuY3JlYXRlU09BUEZhdWx0U3ViQ29kZSgKLSAgICAgICAgICAgICAgICAgICAgZ2V0TGFzdFN1YkNvZGUodGhpcy5mYXVsdC5nZXRDb2RlKCkuZ2V0U3ViQ29kZSgpKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvL0ZhdWx0Q29kZSBpcyB0aGVyZSwgYnV0IG5vIEZhdWx0U3ViQ29kZQotICAgICAgICAgICAgc29hcEZhdWx0U3ViQ29kZSA9IHNvYXBGYWN0b3J5LmNyZWF0ZVNPQVBGYXVsdFN1YkNvZGUodGhpcy5mYXVsdC5nZXRDb2RlKCkpOwotICAgICAgICB9Ci0KLQotICAgICAgICBpZiAoc29hcEZhdWx0U3ViQ29kZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTT0FQRmF1bHRWYWx1ZUltcGwgc29hcEZhdWx0VmFsdWVpbXBsID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IFNPQVAxMkZhdWx0VmFsdWVJbXBsKHNvYXBGYXVsdFN1YkNvZGUsIHNvYXBGYWN0b3J5KTsKLSAgICAgICAgICAgIHNvYXBGYXVsdFZhbHVlaW1wbC5zZXRUZXh0KHN1YmNvZGUuZ2V0UHJlZml4KCkgKyAiOiIgKyBzdWJjb2RlLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgIHNvYXBGYXVsdFZhbHVlaW1wbC5kZWNsYXJlTmFtZXNwYWNlKHN1YmNvZGUuZ2V0TmFtZXNwYWNlVVJJKCksIHN1YmNvZGUuZ2V0UHJlZml4KCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTT0FQRmF1bHRTdWJDb2RlIGdldExhc3RTdWJDb2RlKFNPQVBGYXVsdFN1YkNvZGUgZmlyc3RTdWJDb2RlRWxlbWVudCkgewotICAgICAgICBTT0FQRmF1bHRTdWJDb2RlIHNvYXBGYXVsdFN1YkNvZGUgPSBmaXJzdFN1YkNvZGVFbGVtZW50LmdldFN1YkNvZGUoKTsKLSAgICAgICAgaWYgKHNvYXBGYXVsdFN1YkNvZGUgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGdldExhc3RTdWJDb2RlKHNvYXBGYXVsdFN1YkNvZGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmaXJzdFN1YkNvZGVFbGVtZW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGZhdWx0IGNvZGUgZm9yIHRoaXMgU09BUEZhdWx0IG9iamVjdCBhcyBhIDxDT0RFPlFOYW1lPC9DT0RFPiBvYmplY3QuCi0gICAgICogPHAvPgotICAgICAqLwotICAgIHB1YmxpYyBRTmFtZSBnZXRGYXVsdENvZGVBc1FOYW1lKCkgewotICAgICAgICBTT0FQRmF1bHRDb2RlIHNvYXBGYXVsdENvZGUgPSB0aGlzLmZhdWx0LmdldENvZGUoKTsKLSAgICAgICAgaWYgKHNvYXBGYXVsdENvZGUgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKHRoaXMuZWxlbWVudC5nZXRPTUZhY3RvcnkoKSBpbnN0YW5jZW9mIFNPQVAxMUZhY3RvcnkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gc29hcEZhdWx0Q29kZS5nZXRUZXh0QXNRTmFtZSgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gc29hcEZhdWx0Q29kZS5nZXRWYWx1ZSgpLmdldFRleHRBc1FOYW1lKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgb3B0aW9uYWwgTm9kZSBlbGVtZW50IHZhbHVlIGZvciB0aGlzIFNPQVBGYXVsdCBvYmplY3QuIFRoZSBOb2RlIGVsZW1lbnQgaXMKLSAgICAgKiBvcHRpb25hbCBpbiBTT0FQIDEuMi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gQ29udGVudCBvZiB0aGUgZW52OkZhdWx0L2VudjpOb2RlIGVsZW1lbnQgYXMgYSBTdHJpbmcgb3IgbnVsbCBpZiBub25lCi0gICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgotICAgICAqICAgICAgICAgIC0gaWYgdGhpcyBtZXNzYWdlIGRvZXMgbm90IHN1cHBvcnQgdGhlIFNPQVAgMS4yIGNvbmNlcHQgb2YgRmF1bHQgTm9kZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZhdWx0Tm9kZSgpIHsKLSAgICAgICAgaWYgKHRoaXMuZWxlbWVudC5nZXRPTUZhY3RvcnkoKSBpbnN0YW5jZW9mIFNPQVAxMUZhY3RvcnkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTWVzc2FnZSBkb2VzIG5vdCBzdXBwb3J0IHRoZSAiICsKLSAgICAgICAgICAgICAgICAgICAgIlNPQVAgMS4yIGNvbmNlcHQgb2YgRmF1bHQgTm9kZSIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGZhdWx0ICE9IG51bGwgJiYgZmF1bHQuZ2V0Tm9kZSgpICE9IG51bGwgJiYgZmF1bHQuZ2V0Tm9kZSgpLmdldFRleHQoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhdWx0LmdldE5vZGUoKS5nZXRUZXh0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIEl0ZXJhdG9yIG92ZXIgYSBkaXN0aW5jdCBzZXF1ZW5jZSBvZiBMb2NhbGVzIGZvciB3aGljaCB0aGVyZSBhcmUgYXNzb2NpYXRlZCBSZWFzb24KLSAgICAgKiBUZXh0IGl0ZW1zLiBBbnkgb2YgdGhlc2UgTG9jYWxlcyBjYW4gYmUgdXNlZCBpbiBhIGNhbGwgdG8gZ2V0RmF1bHRSZWFzb25UZXh0IGluIG9yZGVyIHRvCi0gICAgICogb2J0YWluIGEgbG9jYWxpemVkIHZlcnNpb24gb2YgdGhlIFJlYXNvbiBUZXh0IHN0cmluZy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYW4gSXRlcmF0b3Igb3ZlciBhIHNlcXVlbmNlIG9mIExvY2FsZSBvYmplY3RzIGZvciB3aGljaCB0aGVyZSBhcmUgYXNzb2NpYXRlZCBSZWFzb24KLSAgICAgKiAgICAgICAgIFRleHQgaXRlbXMuCi0gICAgICogQHRocm93cyBTT0FQRXhjZXB0aW9uIC0gaWYgdGhlcmUgd2FzIGFuIGVycm9yIGluIHJldHJpZXZpbmcgdGhlIGZhdWx0IFJlYXNvbiBsb2NhbGVzLgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gLSBpZiB0aGlzIG1lc3NhZ2UgZG9lcyBub3QKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydCB0aGUgU09BUCAxLjIgY29uY2VwdCBvZiBGYXVsdCBSZWFzb24uCi0gICAgICogQHNpbmNlIFNBQUogMS4zCi0gICAgICovCi0gICAgcHVibGljIEl0ZXJhdG9yIGdldEZhdWx0UmVhc29uTG9jYWxlcygpIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHRoaXMuZWxlbWVudC5nZXRPTUZhY3RvcnkoKSBpbnN0YW5jZW9mIFNPQVAxMUZhY3RvcnkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTWVzc2FnZSBkb2VzIG5vdCBzdXBwb3J0IHRoZSAiICsKLSAgICAgICAgICAgICAgICAgICAgIlNPQVAgMS4yIGNvbmNlcHQgb2YgRmF1bHQgUmVhc29uIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBcnJheUxpc3QgZmF1bHRSZWFzb25Mb2NhbGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgTGlzdCBzb2FwVGV4dExpc3QgPSB0aGlzLmZhdWx0LmdldFJlYXNvbigpLmdldEFsbFNvYXBUZXh0cygpOwotICAgICAgICAgICAgaWYgKHNvYXBUZXh0TGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgSXRlcmF0b3IgZmF1bHRSZWFzb25zID0gc29hcFRleHRMaXN0Lml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGZhdWx0UmVhc29ucy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgU09BUEZhdWx0VGV4dCBzb2FwRmF1bHRUZXh0ID0gKFNPQVBGYXVsdFRleHQpZmF1bHRSZWFzb25zLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxhbmcgPSBzb2FwRmF1bHRUZXh0LmdldExhbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxhbmcgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZmF1bHRSZWFzb25Mb2NhbGVzLmFkZChMb2NhbGUuZ2V0RGVmYXVsdCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsYW5nLmluZGV4T2YoIl8iKSAhPSAtMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsYW5ndWFnZSA9IGxhbmcuc3Vic3RyaW5nKDAsIGxhbmcuaW5kZXhPZigiXyIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY291bnRyeSA9IGxhbmcuc3Vic3RyaW5nKGxhbmcuaW5kZXhPZigiXyIpICsgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmF1bHRSZWFzb25Mb2NhbGVzLmFkZChuZXcgTG9jYWxlKGxhbmd1YWdlLCBjb3VudHJ5KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhdWx0UmVhc29uTG9jYWxlcy5hZGQobmV3IExvY2FsZShsYW5nKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmF1bHRSZWFzb25Mb2NhbGVzLml0ZXJhdG9yKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBSZWFzb24gVGV4dCBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIExvY2FsZS4gSWYgbW9yZSB0aGFuIG9uZSBzdWNoIFJlYXNvbiBUZXh0Ci0gICAgICogZXhpc3RzIHRoZSBmaXJzdCBtYXRjaGluZyBUZXh0IGlzIHJldHVybmVkCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbG9jYWxlIC0gdGhlIExvY2FsZSBmb3Igd2hpY2ggYSBsb2NhbGl6ZWQgUmVhc29uIFRleHQgaXMgZGVzaXJlZAotICAgICAqIEByZXR1cm4gdGhlIFJlYXNvbiBUZXh0IGFzc29jaWF0ZWQgd2l0aCBsb2NhbGUKLSAgICAgKiBAdGhyb3dzIFNPQVBFeGNlcHRpb24gLSBpZiB0aGVyZSB3YXMgYW4gZXJyb3IgaW4gcmV0cmlldmluZyB0aGUgZmF1bHQgUmVhc29uIHRleHQgZm9yIHRoZQotICAgICAqICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZWQgbG9jYWxlLiBqYXZhLmxhbmcuVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gLSBpZiB0aGlzCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgZG9lcyBub3Qgc3VwcG9ydCB0aGUgU09BUCAxLjIgY29uY2VwdCBvZiBGYXVsdCBSZWFzb24uCi0gICAgICogQHNpbmNlIFNBQUogMS4zCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRGYXVsdFJlYXNvblRleHQoTG9jYWxlIGxvY2FsZSkgdGhyb3dzIFNPQVBFeGNlcHRpb24gewotICAgICAgICBpZiAodGhpcy5lbGVtZW50LmdldE9NRmFjdG9yeSgpIGluc3RhbmNlb2YgU09BUDExRmFjdG9yeSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJNZXNzYWdlIGRvZXMgbm90IHN1cHBvcnQgdGhlICIgKwotICAgICAgICAgICAgICAgICAgICAiU09BUCAxLjIgY29uY2VwdCBvZiBGYXVsdCBSZWFzb24iKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEl0ZXJhdG9yIHNvYXBUZXh0c0l0ciA9IG51bGw7Ci0gICAgICAgICAgICBTT0FQRmF1bHRSZWFzb24gc29hcEZhdWx0UmVhc29uID0gdGhpcy5mYXVsdC5nZXRSZWFzb24oKTsKLSAgICAgICAgICAgIGlmIChzb2FwRmF1bHRSZWFzb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIExpc3Qgc29hcFRleHRzID0gc29hcEZhdWx0UmVhc29uLmdldEFsbFNvYXBUZXh0cygpOwotICAgICAgICAgICAgICAgIGlmIChzb2FwVGV4dHMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBzb2FwVGV4dHNJdHIgPSBzb2FwVGV4dHMuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHNvYXBUZXh0c0l0ci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNPQVBGYXVsdFRleHQgc29hcEZhdWx0VGV4dCA9IChTT0FQRmF1bHRUZXh0KXNvYXBUZXh0c0l0ci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc29hcEZhdWx0VGV4dC5nZXRMYW5nKCkuZXF1YWxzKGxvY2FsZS50b1N0cmluZygpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzb2FwRmF1bHRUZXh0LmdldFRleHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIEl0ZXJhdG9yIG92ZXIgYSBzZXF1ZW5jZSBvZiBTdHJpbmcgb2JqZWN0cyBjb250YWluaW5nIGFsbCBvZiB0aGUgUmVhc29uIFRleHQgaXRlbXMKLSAgICAgKiBmb3IgdGhpcyBTT0FQRmF1bHQuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIFNPQVBFeGNlcHRpb24gaWYgdGhlcmUgaXMgYW4gZXJyb3IgaW4gcmV0cmlldmluZyB0ZXh0cyBmb3IgUmVhc29uIG9iamVjdHMKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIC0gaWYgdGhpcyBtZXNzYWdlIGRvZXMgbm90Ci0gICAgICogICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnQgdGhlIFNPQVAgMS4yIGNvbmNlcHQgb2YgRmF1bHQgUmVhc29uLgotICAgICAqLwotCi0gICAgcHVibGljIEl0ZXJhdG9yIGdldEZhdWx0UmVhc29uVGV4dHMoKSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICh0aGlzLmVsZW1lbnQuZ2V0T01GYWN0b3J5KCkgaW5zdGFuY2VvZiBTT0FQMTFGYWN0b3J5KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIEl0ZXJhdG9yIHNvYXBUZXh0c0l0ciA9IHRoaXMuZmF1bHQuZ2V0UmVhc29uKCkuZ2V0QWxsU29hcFRleHRzKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgQXJyYXlMaXN0IHJlYXNvblRleHRzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICB3aGlsZSAoc29hcFRleHRzSXRyLmhhc05leHQoKSkgewotICAgICAgICAgICAgU09BUEZhdWx0VGV4dCBzb2FwRmF1bHRUZXh0ID0gKFNPQVBGYXVsdFRleHQpc29hcFRleHRzSXRyLm5leHQoKTsKLSAgICAgICAgICAgIHJlYXNvblRleHRzLmFkZChzb2FwRmF1bHRUZXh0LmdldFRleHQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlYXNvblRleHRzLml0ZXJhdG9yKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgb3B0aW9uYWwgUm9sZSBlbGVtZW50IHZhbHVlIGZvciB0aGlzIFNPQVBGYXVsdCBvYmplY3QuIFRoZSBSb2xlIGVsZW1lbnQgaXMKLSAgICAgKiBvcHRpb25hbCBpbiBTT0FQIDEuMi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gQ29udGVudCBvZiB0aGUgZW52OkZhdWx0L2VudjpSb2xlIGVsZW1lbnQgYXMgYSBTdHJpbmcgb3IgbnVsbCBpZiBub25lCi0gICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgotICAgICAqICAgICAgICAgIC0gaWYgdGhpcyBtZXNzYWdlIGRvZXMgbm90IHN1cHBvcnQgdGhlIFNPQVAgMS4yIGNvbmNlcHQgb2YgRmF1bHQgUm9sZS4KLSAgICAgKiBAc2luY2UgU0FBSiAxLjMKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZhdWx0Um9sZSgpIHsKLSAgICAgICAgaWYgKHRoaXMuZWxlbWVudC5nZXRPTUZhY3RvcnkoKSBpbnN0YW5jZW9mIFNPQVAxMUZhY3RvcnkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTWVzc2FnZSBkb2VzIG5vdCBzdXBwb3J0IHRoZSAiICsKLSAgICAgICAgICAgICAgICAgICAgIlNPQVAgMS4yIGNvbmNlcHQgb2YgRmF1bHQgUmVhc29uIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAodGhpcy5mYXVsdC5nZXRSb2xlKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmZhdWx0LmdldFJvbGUoKS5nZXRUZXh0KCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgU3ViY29kZXMgZm9yIHRoaXMgU09BUEZhdWx0IGFzIGFuIGl0ZXJhdG9yIG92ZXIgUU5hbWVzLgotICAgICAqCi0gICAgICogQHJldHVybiBhbiBJdGVyYXRvciB0aGF0IGFjY2Vzc2VzIGEgc2VxdWVuY2Ugb2YgUU5hbWVzLiBUaGlzIEl0ZXJhdG9yIHNob3VsZCBub3Qgc3VwcG9ydCB0aGUKLSAgICAgKiAgICAgICAgIG9wdGlvbmFsIHJlbW92ZSBtZXRob2QuIFRoZSBvcmRlciBpbiB3aGljaCB0aGUgU3ViY29kZXMgYXJlIHJldHVybmVkIHJlZmxlY3RzIHRoZQotICAgICAqICAgICAgICAgaGllcmFyY2h5IG9mIFN1YmNvZGVzIHByZXNlbnQgaW4gdGhlIGZhdWx0IGZyb20gdG9wIHRvIGJvdHRvbS4KLSAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgLSBpZiB0aGlzIG1lc3NhZ2UgZG9lcyBub3Qgc3VwcG9ydCB0aGUgU09BUCAxLjIgY29uY2VwdCBvZiBTdWJjb2RlLgotICAgICAqLwotICAgIHB1YmxpYyBJdGVyYXRvciBnZXRGYXVsdFN1YmNvZGVzKCkgewotICAgICAgICBpZiAodGhpcy5lbGVtZW50LmdldE9NRmFjdG9yeSgpIGluc3RhbmNlb2YgU09BUDExRmFjdG9yeSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgQXJyYXlMaXN0IGZhdWx0U3ViY29kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIFNPQVBGYXVsdFN1YkNvZGUgc3ViQ29kZUVsZW1lbnQgPSB0aGlzLmZhdWx0LmdldENvZGUoKS5nZXRTdWJDb2RlKCk7Ci0gICAgICAgIHdoaWxlIChzdWJDb2RlRWxlbWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBRTmFtZSBxbmFtZSA9IHN1YkNvZGVFbGVtZW50LmdldFZhbHVlKCkuZ2V0VGV4dEFzUU5hbWUoKTsKLSAgICAgICAgICAgIGZhdWx0U3ViY29kZXMuYWRkKHFuYW1lKTsKLSAgICAgICAgICAgIHN1YkNvZGVFbGVtZW50ID0gc3ViQ29kZUVsZW1lbnQuZ2V0U3ViQ29kZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYXVsdFN1YmNvZGVzLml0ZXJhdG9yKCk7Ci0gICAgfQotCi0gICAgLyoqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIFNPQVBGYXVsdCBoYXMgYSBEZXRhaWwgc3ViZWxlbWVudCBhbmQgZmFsc2Ugb3RoZXJ3aXNlLiAqLwotICAgIHB1YmxpYyBib29sZWFuIGhhc0RldGFpbCgpIHsKLSAgICAgICAgaWYgKHRoaXMuZmF1bHQuZ2V0RGV0YWlsKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgYW55IFN1YmNvZGVzIHRoYXQgbWF5IGJlIGNvbnRhaW5lZCBieSB0aGlzIFNPQVBGYXVsdC4gU3Vic2VxdWVudCBjYWxscyB0bwotICAgICAqIGdldEZhdWx0U3ViY29kZXMgd2lsbCByZXR1cm4gYW4gZW1wdHkgaXRlcmF0b3IgdW50aWwgYSBjYWxsIHRvIGFwcGVuZEZhdWx0U3ViY29kZSBpcyBtYWRlLgotICAgICAqCi0gICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgotICAgICAqICAgICAgICAgIC0gaWYgdGhpcyBtZXNzYWdlIGRvZXMgbm90IHN1cHBvcnQgdGhlIFNPQVAgMS4yIGNvbmNlcHQgb2YgU3ViY29kZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVBbGxGYXVsdFN1YmNvZGVzKCkgewotICAgICAgICBpZiAoZmFjdG9yeSBpbnN0YW5jZW9mIFNPQVAxMUZhY3RvcnkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZmF1bHQuZ2V0Q29kZSgpLmdldFN1YkNvZGUoKS5kZXRhY2goKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGlzIFNPQVBGYXVsdCBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4gZmF1bHQgY29kZS4gSXQgaXMgcHJlZmVyYWJsZSB0byB1c2UgdGhpcyBtZXRob2QKLSAgICAgKiBvdmVyIHNldEZhdWx0Q29kZShOYW1lKQotICAgICAqCi0gICAgICogQHBhcmFtIGZhdWx0Q29kZVFOYW1lIC0gYSBRTmFtZSBvYmplY3QgZ2l2aW5nIHRoZSBmYXVsdCBjb2RlIHRvIGJlIHNldC4gSXQgbXVzdCBiZSBuYW1lc3BhY2UKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgcXVhbGlmaWVkLgotICAgICAqIEB0aHJvd3MgU09BUEV4Y2VwdGlvbiAtIGlmIHRoZXJlIHdhcyBhbiBlcnJvciBpbiBhZGRpbmcgdGhlIGZhdWx0Y29kZSBlbGVtZW50IHRvIHRoZQotICAgICAqICAgICAgICAgICAgICAgICAgICAgICB1bmRlcmx5aW5nIFhNTCB0cmVlLgotICAgICAqIEBzZWUgZ2V0RmF1bHRDb2RlQXNRTmFtZSgpLCBzZXRGYXVsdENvZGUoTmFtZSksIGdldEZhdWx0Q29kZUFzUU5hbWUoKQotICAgICAqIEBzaW5jZSBTQUFKIDEuMwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEZhdWx0Q29kZShRTmFtZSBxbmFtZSkgdGhyb3dzIFNPQVBFeGNlcHRpb24gewotICAgICAgICBpZiAocW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkgPT0gbnVsbAotICAgICAgICAgICAgICAgIHx8IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU09BUEV4Y2VwdGlvbigiVW5xdWFsaWZpZWQgUU5hbWUgb2JqZWN0IDogIiArIHFuYW1lKTsKLSAgICAgICAgfQotCi0gICAgICAgIG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmFjdG9yeSBzb2FwRmFjdG9yeSA9IG51bGw7Ci0gICAgICAgIGlmICh0aGlzLmVsZW1lbnQuZ2V0T01GYWN0b3J5KCkgaW5zdGFuY2VvZiBTT0FQMTFGYWN0b3J5KSB7Ci0gICAgICAgICAgICBzb2FwRmFjdG9yeSA9IChTT0FQRmFjdG9yeSl0aGlzLmVsZW1lbnQuZ2V0T01GYWN0b3J5KCk7Ci0gICAgICAgIH0gZWxzZSBpZiAodGhpcy5lbGVtZW50LmdldE9NRmFjdG9yeSgpIGluc3RhbmNlb2YgU09BUDEyRmFjdG9yeSkgewotICAgICAgICAgICAgaWYgKCEocW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkKLSAgICAgICAgICAgICAgICAgICAgLmVxdWFscyhTT0FQQ29uc3RhbnRzLlVSSV9OU19TT0FQXzFfMl9FTlZFTE9QRSkpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNPQVBFeGNlcHRpb24oIkluY29ycmVjdCBVUkkiCi0gICAgICAgICAgICAgICAgICAgICAgICArIHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNvYXBGYWN0b3J5ID0gKFNPQVBGYWN0b3J5KXRoaXMuZWxlbWVudC5nZXRPTUZhY3RvcnkoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTT0FQRXhjZXB0aW9uKCJJbnZhbGlkIFNPQVAgdmVyc2lvbiIpOwotICAgICAgICB9Ci0gICAgICAgIFNPQVBGYXVsdENvZGUgc29hcEZhdWx0Q29kZSA9IHNvYXBGYWN0b3J5LmNyZWF0ZVNPQVBGYXVsdENvZGUodGhpcy5mYXVsdCk7Ci0KLSAgICAgICAgU3RyaW5nIHByZWZpeCA9ICgocW5hbWUuZ2V0UHJlZml4KCkgIT0gbnVsbCkgJiYgIXFuYW1lLmdldFByZWZpeCgpCi0gICAgICAgICAgICAgICAgLmVxdWFscygiIikpID8gcW5hbWUuZ2V0UHJlZml4KCkgOiB0aGlzLmZhdWx0LmdldFFOYW1lKCkKLSAgICAgICAgICAgICAgICAuZ2V0UHJlZml4KCk7Ci0KLSAgICAgICAgaWYgKHRoaXMuZWxlbWVudC5nZXRPTUZhY3RvcnkoKSBpbnN0YW5jZW9mIFNPQVAxMUZhY3RvcnkpIHsKLSAgICAgICAgICAgIHNvYXBGYXVsdENvZGUuc2V0VGV4dChwcmVmaXggKyAiOiIgKyBxbmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICBPTU5hbWVzcGFjZSBvbU5hbWVzcGFjZSA9IG5ldyBPTU5hbWVzcGFjZUltcGwocW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcW5hbWUuZ2V0UHJlZml4KCkpOwotICAgICAgICAgICAgc29hcEZhdWx0Q29kZS5kZWNsYXJlTmFtZXNwYWNlKG9tTmFtZXNwYWNlKTsKLSAgICAgICAgfSBlbHNlIGlmICh0aGlzLmVsZW1lbnQuZ2V0T01GYWN0b3J5KCkgaW5zdGFuY2VvZiBTT0FQMTJGYWN0b3J5KSB7Ci0gICAgICAgICAgICBTT0FQRmF1bHRWYWx1ZSBzb2FwRmF1bHRWYWx1ZSA9IHNvYXBGYWN0b3J5LmNyZWF0ZVNPQVBGYXVsdFZhbHVlKHNvYXBGYXVsdENvZGUpOwotICAgICAgICAgICAgLy8gZG9uJ3QganVzdCB1c2UgdGhlIGRlZmF1bHQgcHJlZml4LCB1c2UgdGhlIHBhc3NlZCBvbmUgb3IgdGhlIHBhcmVudCdzCi0gICAgICAgICAgICBzb2FwRmF1bHRWYWx1ZS5zZXRUZXh0KHByZWZpeCArICI6IiArIHFuYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgIE9NTmFtZXNwYWNlIG9tTmFtZXNwYWNlID0gbmV3IE9NTmFtZXNwYWNlSW1wbChxbmFtZS5nZXROYW1lc3BhY2VVUkkoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxbmFtZS5nZXRQcmVmaXgoKSk7Ci0gICAgICAgICAgICBzb2FwRmF1bHRWYWx1ZS5kZWNsYXJlTmFtZXNwYWNlKG9tTmFtZXNwYWNlKTsKLSAgICAgICAgICAgIHNvYXBGYXVsdENvZGUuc2V0VmFsdWUoc29hcEZhdWx0VmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICB0aGlzLmZhdWx0LnNldENvZGUoc29hcEZhdWx0Q29kZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBvciByZXBsYWNlcyBhbnkgZXhpc3RpbmcgTm9kZSBlbGVtZW50IHZhbHVlIGZvciB0aGlzIFNPQVBGYXVsdCBvYmplY3QuIFRoZSBOb2RlCi0gICAgICogZWxlbWVudCBpcyBvcHRpb25hbCBpbiBTT0FQIDEuMi4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgU09BUEV4Y2VwdGlvbiAtIGlmIHRoZXJlIHdhcyBhbiBlcnJvciBpbiBzZXR0aW5nIHRoZSBOb2RlIGZvciB0aGlzIFNPQVBGYXVsdCBvYmplY3QuCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5VbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiAtIGlmIHRoaXMgbWVzc2FnZSBkb2VzIG5vdAotICAgICAqICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0IHRoZSBTT0FQIDEuMiBjb25jZXB0IG9mIEZhdWx0IE5vZGUuCi0gICAgICogQHNpbmNlIFNBQUogMS4zCi0gICAgICovCi0KLSAgICBwdWJsaWMgdm9pZCBzZXRGYXVsdE5vZGUoU3RyaW5nIHMpIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLSAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYWN0b3J5IHNvYXBGYWN0b3J5ID0gbnVsbDsKLSAgICAgICAgaWYgKHRoaXMuZWxlbWVudC5nZXRPTUZhY3RvcnkoKSBpbnN0YW5jZW9mIFNPQVAxMUZhY3RvcnkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigibWVzc2FnZSBkb2VzIG5vdCBzdXBwb3J0ICIgKwotICAgICAgICAgICAgICAgICAgICAidGhlIFNPQVAgMS4yIGNvbmNlcHQgb2YgRmF1bHQgTm9kZSIpOwotICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZWxlbWVudC5nZXRPTUZhY3RvcnkoKSBpbnN0YW5jZW9mIFNPQVAxMkZhY3RvcnkpIHsKLSAgICAgICAgICAgIHNvYXBGYWN0b3J5ID0gRE9PTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTJGYWN0b3J5KCk7Ci0gICAgICAgIH0KLSAgICAgICAgU09BUEZhdWx0Tm9kZSBzb2FwRmF1bHROb2RlID0gc29hcEZhY3RvcnkuY3JlYXRlU09BUEZhdWx0Tm9kZSh0aGlzLmZhdWx0KTsKLSAgICAgICAgc29hcEZhdWx0Tm9kZS5zZXRUZXh0KHMpOwotICAgICAgICB0aGlzLmZhdWx0LnNldE5vZGUoc29hcEZhdWx0Tm9kZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBvciByZXBsYWNlcyBhbnkgZXhpc3RpbmcgUm9sZSBlbGVtZW50IHZhbHVlIGZvciB0aGlzIFNPQVBGYXVsdCBvYmplY3QuIFRoZSBSb2xlCi0gICAgICogZWxlbWVudCBpcyBvcHRpb25hbCBpbiBTT0FQIDEuMi4KLSAgICAgKgotICAgICAqIEBwYXJhbSB1cmkgLSB0aGUgVVJJIG9mIHRoZSBSb2xlCi0gICAgICogQHRocm93cyBTT0FQRXhjZXB0aW9uIC0gaWYgdGhlcmUgd2FzIGFuIGVycm9yIGluIHNldHRpbmcgdGhlIFJvbGUgZm9yIHRoaXMgU09BUEZhdWx0IG9iamVjdAotICAgICAqICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gLSBpZiB0aGlzIG1lc3NhZ2UgZG9lcyBub3QKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydCB0aGUgU09BUCAxLjIgY29uY2VwdCBvZiBGYXVsdCBSb2xlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEZhdWx0Um9sZShTdHJpbmcgdXJpKSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7Ci0gICAgICAgIG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmFjdG9yeSBzb2FwRmFjdG9yeSA9IG51bGw7Ci0gICAgICAgIGlmICh0aGlzLmVsZW1lbnQuZ2V0T01GYWN0b3J5KCkgaW5zdGFuY2VvZiBTT0FQMTFGYWN0b3J5KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIm1lc3NhZ2UgZG9lcyBub3Qgc3VwcG9ydCB0aGUgIiArCi0gICAgICAgICAgICAgICAgICAgICJTT0FQIDEuMiBjb25jZXB0IG9mIEZhdWx0IFJvbGUiKTsKLSAgICAgICAgfSBlbHNlIGlmICh0aGlzLmVsZW1lbnQuZ2V0T01GYWN0b3J5KCkgaW5zdGFuY2VvZiBTT0FQMTJGYWN0b3J5KSB7Ci0gICAgICAgICAgICBzb2FwRmFjdG9yeSA9IERPT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDEyRmFjdG9yeSgpOwotICAgICAgICB9Ci0gICAgICAgIFNPQVBGYXVsdFJvbGUgc29hcEZhdWx0Um9sZSA9IHNvYXBGYWN0b3J5LmNyZWF0ZVNPQVBGYXVsdFJvbGUodGhpcy5mYXVsdCk7Ci0gICAgICAgIHNvYXBGYXVsdFJvbGUuc2V0Um9sZVZhbHVlKHVyaSk7Ci0gICAgICAgIHRoaXMuZmF1bHQuc2V0Um9sZShzb2FwRmF1bHRSb2xlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSXRlcmF0b3IgZ2V0Q2hpbGRFbGVtZW50cyhOYW1lIG5hbWUpIHsKLSAgICAgICAgUU5hbWUgcU5hbWUgPSBuZXcgUU5hbWUobmFtZS5nZXRVUkkoKSwgbmFtZS5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgIHJldHVybiBnZXRDaGlsZHJlbihlbGVtZW50LmdldENoaWxkcmVuV2l0aE5hbWUocU5hbWUpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSXRlcmF0b3IgZ2V0Q2hpbGRFbGVtZW50cygpIHsKLSAgICAgICAgcmV0dXJuIGdldENoaWxkcmVuKGVsZW1lbnQuZ2V0Q2hpbGRyZW4oKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBJdGVyYXRvciBnZXRDaGlsZHJlbihJdGVyYXRvciBjaGlsZEl0ZXIpIHsKLSAgICAgICAgQ29sbGVjdGlvbiBjaGlsZEVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICB3aGlsZSAoY2hpbGRJdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZSBkb21Ob2RlID0gKG9yZy53M2MuZG9tLk5vZGUpY2hpbGRJdGVyLm5leHQoKTsKLSAgICAgICAgICAgIE5vZGUgc2Fhak5vZGUgPSB0b1NBQUpOb2RlKGRvbU5vZGUpOwotICAgICAgICAgICAgaWYgKCEoc2Fhak5vZGUgaW5zdGFuY2VvZiBTT0FQRmF1bHRFbGVtZW50KSkgewotICAgICAgICAgICAgICAgIC8vIHNpbGVudGx5IHJlcGxhY2Ugbm9kZSwgYXMgcGVyIHNhYWogMS4yIHNwZWMKLSAgICAgICAgICAgICAgICBTT0FQRmF1bHRFbGVtZW50IGJvZHlFbGUgPSBuZXcgU09BUEZhdWx0RWxlbWVudEltcGwoKEVsZW1lbnRJbXBsKWRvbU5vZGUpOwotICAgICAgICAgICAgICAgICgoTm9kZUltcGwpZG9tTm9kZSkuc2V0VXNlckRhdGEoU0FBSl9OT0RFLCBib2R5RWxlLCBudWxsKTsKLSAgICAgICAgICAgICAgICBjaGlsZEVsZW1lbnRzLmFkZChib2R5RWxlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgY2hpbGRFbGVtZW50cy5hZGQoc2Fhak5vZGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjaGlsZEVsZW1lbnRzLml0ZXJhdG9yKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYWFqL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NhYWovU09BUEhlYWRlckVsZW1lbnRJbXBsLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9zYWFqL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NhYWovU09BUEhlYWRlckVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjODM3OWQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2Fhai9zcmMvb3JnL2FwYWNoZS9heGlzMi9zYWFqL1NPQVBIZWFkZXJFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zYWFqOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmRvbS5FbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEhlYWRlckJsb2NrOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5pbXBsLmRvbS5zb2FwMTEuU09BUDExRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBFbGVtZW50OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEhlYWRlcjsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQSGVhZGVyRWxlbWVudDsKLQotcHVibGljIGNsYXNzIFNPQVBIZWFkZXJFbGVtZW50SW1wbCBleHRlbmRzIFNPQVBFbGVtZW50SW1wbCBpbXBsZW1lbnRzIFNPQVBIZWFkZXJFbGVtZW50IHsKLQotICAgIHByaXZhdGUgU09BUEhlYWRlckJsb2NrIGhlYWRlckVsZW07Ci0KLSAgICAvKiogQHBhcmFtIGVsZW1lbnQgICovCi0gICAgcHVibGljIFNPQVBIZWFkZXJFbGVtZW50SW1wbChTT0FQSGVhZGVyQmxvY2sgZWxlbWVudCkgewotICAgICAgICBzdXBlcigoRWxlbWVudEltcGwpZWxlbWVudCk7Ci0gICAgICAgIHRoaXMuaGVhZGVyRWxlbSA9IGVsZW1lbnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgYWN0b3IgYXNzb2NpYXRlZCB3aXRoIHRoaXMgPENPREU+IFNPQVBIZWFkZXJFbGVtZW50PC9DT0RFPiBvYmplY3QgdG8gdGhlIHNwZWNpZmllZAotICAgICAqIGFjdG9yLiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiBhbiBhY3RvciBpczogPENPREU+IFNPQVBDb25zdGFudHMuVVJJX1NPQVBfQUNUT1JfTkVYVDwvQ09ERT4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhY3RvclVSSSBhIDxDT0RFPlN0cmluZzwvQ09ERT4gZ2l2aW5nIHRoZSBVUkkgb2YgdGhlIGFjdG9yIHRvIHNldAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgaWYgdGhlcmUgaXMgYSBwcm9ibGVtIGluIHNldHRpbmcgdGhlIGFjdG9yLgotICAgICAqIEBzZWUgI2dldEFjdG9yKCkgZ2V0QWN0b3IoKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEFjdG9yKFN0cmluZyBhY3RvclVSSSkgewotICAgICAgICB0aGlzLmhlYWRlckVsZW0uc2V0Um9sZShhY3RvclVSSSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdXJpIG9mIHRoZSBhY3RvciBhc3NvY2lhdGVkIHdpdGggdGhpcyA8Q09ERT4gU09BUEhlYWRlckVsZW1lbnQ8L0NPREU+IG9iamVjdC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYSA8Q09ERT5TdHJpbmc8L0NPREU+IGdpdmluZyB0aGUgVVJJIG9mIHRoZSBhY3RvcgotICAgICAqIEBzZWUgI3NldEFjdG9yKFN0cmluZykgc2V0QWN0b3IoamF2YS5sYW5nLlN0cmluZykKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEFjdG9yKCkgewotICAgICAgICByZXR1cm4gdGhpcy5oZWFkZXJFbGVtLmdldFJvbGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBtdXN0VW5kZXJzdGFuZCBhdHRyaWJ1dGUgZm9yIHRoaXMgPENPREU+IFNPQVBIZWFkZXJFbGVtZW50PC9DT0RFPiBvYmplY3QgdG8gYmUgb24gb3IKLSAgICAgKiBvZmYuCi0gICAgICogPHAvPgotICAgICAqIDxQPklmIHRoZSBtdXN0VW5kZXJzdGFuZCBhdHRyaWJ1dGUgaXMgb24sIHRoZSBhY3RvciB3aG8gcmVjZWl2ZXMgdGhlCi0gICAgICogPENPREU+U09BUEhlYWRlckVsZW1lbnQ8L0NPREU+IG11c3QgcHJvY2VzcyBpdCBjb3JyZWN0bHkuIFRoaXMgZW5zdXJlcywgZm9yIGV4YW1wbGUsIHRoYXQgaWYKLSAgICAgKiB0aGUgPENPREU+IFNPQVBIZWFkZXJFbGVtZW50PC9DT0RFPiBvYmplY3QgbW9kaWZpZXMgdGhlIG1lc3NhZ2UsIHRoYXQgdGhlIG1lc3NhZ2UgaXMgYmVpbmcKLSAgICAgKiBtb2RpZmllZCBjb3JyZWN0bHkuPC9QPgotICAgICAqCi0gICAgICogQHBhcmFtIG11c3RVbmRlcnN0YW5kIDxDT0RFPnRydWU8L0NPREU+IHRvIHNldCB0aGUgbXVzdFVuZGVyc3RhbmQgYXR0cmlidXRlIG9uOwotICAgICAqICAgICAgICAgICAgICAgICAgICAgICA8Q09ERT5mYWxzZTwvQ09ERT4gdG8gdHVybiBpZiBvZmYKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSBpbiBzZXR0aW5nIHRoZSBhY3Rvci4KLSAgICAgKiBAc2VlICNnZXRNdXN0VW5kZXJzdGFuZCgpIGdldE11c3RVbmRlcnN0YW5kKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRNdXN0VW5kZXJzdGFuZChib29sZWFuIG11c3RVbmRlcnN0YW5kKSB7Ci0gICAgICAgIHRoaXMuaGVhZGVyRWxlbS5zZXRNdXN0VW5kZXJzdGFuZChtdXN0VW5kZXJzdGFuZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBtdXN0VW5kZXJzdGFuZCBhdHRyaWJ1dGUgZm9yIHRoaXMgPENPREU+U09BUEhlYWRlckVsZW1lbnQ8L0NPREU+IG9iamVjdAotICAgICAqIGlzIHR1cm5lZCBvbi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gPENPREU+dHJ1ZTwvQ09ERT4gaWYgdGhlIG11c3RVbmRlcnN0YW5kIGF0dHJpYnV0ZSBvZiB0aGlzCi0gICAgICogICAgICAgICA8Q09ERT5TT0FQSGVhZGVyRWxlbWVudDwvQ09ERT4gb2JqZWN0IGlzIHR1cm5lZCBvbjsgPENPREU+ZmFsc2U8L0NPREU+IG90aGVyd2lzZQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGdldE11c3RVbmRlcnN0YW5kKCkgewotICAgICAgICByZXR1cm4gdGhpcy5oZWFkZXJFbGVtLmdldE11c3RVbmRlcnN0YW5kKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgUm9sZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBTT0FQSGVhZGVyRWxlbWVudCBvYmplY3QgdG8gdGhlIHNwZWNpZmllZCBSb2xlLgotICAgICAqCi0gICAgICogQHBhcmFtIHVyaSAtIHRoZSBVUkkgb2YgdGhlIFJvbGUKLSAgICAgKiBAdGhyb3dzIFNPQVBFeGNlcHRpb24gLSBpZiB0aGVyZSBpcyBhbiBlcnJvciBpbiBzZXR0aW5nIHRoZSByb2xlIGphdmEubGFuZy5VbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAtIGlmIHRoaXMgbWVzc2FnZSBkb2VzIG5vdCBzdXBwb3J0IHRoZSBTT0FQIDEuMiBjb25jZXB0IG9mIEZhdWx0IFJvbGUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Um9sZShTdHJpbmcgdXJpKSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICh0aGlzLmVsZW1lbnQuZ2V0T01GYWN0b3J5KCkgaW5zdGFuY2VvZiBTT0FQMTFGYWN0b3J5KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRoaXMuaGVhZGVyRWxlbS5zZXRSb2xlKHVyaSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFJvbGUoKSB7Ci0gICAgICAgIGlmICh0aGlzLmVsZW1lbnQuZ2V0T01GYWN0b3J5KCkgaW5zdGFuY2VvZiBTT0FQMTFGYWN0b3J5KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLmhlYWRlckVsZW0uZ2V0Um9sZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgcmVsYXkgYXR0cmlidXRlIGZvciB0aGlzIFNPQVBIZWFkZXJFbGVtZW50IHRvIGJlIGVpdGhlciB0cnVlIG9yIGZhbHNlLiBUaGUgU09BUAotICAgICAqIHJlbGF5IGF0dHJpYnV0ZSBpcyBzZXQgdG8gdHJ1ZSB0byBpbmRpY2F0ZSB0aGF0IHRoZSBTT0FQIGhlYWRlciBibG9jayBtdXN0IGJlIHJlbGF5ZWQgYnkgYW55Ci0gICAgICogbm9kZSB0aGF0IGlzIHRhcmdldGVkIGJ5IHRoZSBoZWFkZXIgYmxvY2sgYnV0IG5vdCBhY3R1YWxseSBwcm9jZXNzIGl0LiBUaGlzIGF0dHJpYnV0ZSBpcwotICAgICAqIGlnbm9yZWQgb24gaGVhZGVyIGJsb2NrcyB3aG9zZSBtdXN0VW5kZXJzdGFuZCBhdHRyaWJ1dGUgaXMgc2V0IHRvIHRydWUgb3IgdGhhdCBhcmUgdGFyZ2V0ZWQKLSAgICAgKiBhdCB0aGUgdWx0aW1hdGUgcmVjaWV2ZXIgKHdoaWNoIGlzIHRoZSBkZWZhdWx0KS4gVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhpcyBhdHRyaWJ1dGUgaXMKLSAgICAgKiBmYWxzZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSByZWxheSAtIHRoZSBuZXcgdmFsdWUgb2YgdGhlIHJlbGF5IGF0dHJpYnV0ZQotICAgICAqIEB0aHJvd3MgU09BUEV4Y2VwdGlvbiAtIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSBpbiBzZXR0aW5nIHRoZSByZWxheSBhdHRyaWJ1dGUuCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5VbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiAtIGlmIHRoaXMgbWVzc2FnZSBkb2VzIG5vdAotICAgICAqICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0IHRoZSBTT0FQIDEuMiBjb25jZXB0IG9mIFJlbGF5IGF0dHJpYnV0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRSZWxheShib29sZWFuIGZsYWcpIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHRoaXMuZWxlbWVudC5nZXRPTUZhY3RvcnkoKSBpbnN0YW5jZW9mIFNPQVAxMUZhY3RvcnkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhpcy5oZWFkZXJFbGVtLnNldFJlbGF5KGZsYWcpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0UmVsYXkoKSB7Ci0gICAgICAgIGlmICh0aGlzLmVsZW1lbnQuZ2V0T01GYWN0b3J5KCkgaW5zdGFuY2VvZiBTT0FQMTFGYWN0b3J5KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLmhlYWRlckVsZW0uZ2V0UmVsYXkoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBhcmVudEVsZW1lbnQoU09BUEVsZW1lbnQgcGFyZW50KSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghKHBhcmVudCBpbnN0YW5jZW9mIFNPQVBIZWFkZXIpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJQYXJlbnQgaXMgbm90IGEgU09BUEhlYWRlciIpOwotICAgICAgICB9Ci0gICAgICAgIHN1cGVyLnNldFBhcmVudEVsZW1lbnQocGFyZW50KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYWFqL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NhYWovU09BUEhlYWRlckltcGwuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhYWovc3JjL29yZy9hcGFjaGUvYXhpczIvc2Fhai9TT0FQSGVhZGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGJiMDRmLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhYWovc3JjL29yZy9hcGFjaGUvYXhpczIvc2Fhai9TT0FQSGVhZGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDI1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zYWFqOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTm9kZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuZG9tLkVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5kb20uTmFtZXNwYWNlSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuZG9tLk5vZGVJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEhlYWRlckJsb2NrOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5pbXBsLmRvbS5zb2FwMTEuU09BUDExRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuaW1wbC5kb20uc29hcDExLlNPQVAxMUhlYWRlckJsb2NrSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuaW1wbC5kb20uc29hcDEyLlNPQVAxMkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLmltcGwuZG9tLnNvYXAxMi5TT0FQMTJIZWFkZXJCbG9ja0ltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5uYW1lc3BhY2UuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLk5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuTm9kZTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBIZWFkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEhlYWRlckVsZW1lbnQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBTT0FQSGVhZGVySW1wbCBleHRlbmRzIFNPQVBFbGVtZW50SW1wbCBpbXBsZW1lbnRzIFNPQVBIZWFkZXIgewotCi0gICAgcHJpdmF0ZSBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEhlYWRlciBvbVNPQVBIZWFkZXI7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvcgotICAgICAqCi0gICAgICogQHBhcmFtIGhlYWRlcgotICAgICAqLwotICAgIHB1YmxpYyBTT0FQSGVhZGVySW1wbChvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEhlYWRlciBoZWFkZXIpIHsKLSAgICAgICAgc3VwZXIoKEVsZW1lbnRJbXBsKWhlYWRlcik7Ci0gICAgICAgIG9tU09BUEhlYWRlciA9IGhlYWRlcjsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgKiBAc2VlIGphdmF4LnhtbC5zb2FwLlNPQVBFbGVtZW50I2FkZENoaWxkRWxlbWVudChqYXZhLmxhbmcuU3RyaW5nKQotICAgICovCi0gICAgcHVibGljIFNPQVBFbGVtZW50IGFkZENoaWxkRWxlbWVudChTdHJpbmcgbG9jYWxOYW1lKSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBhZGRIZWFkZXJFbGVtZW50KG5ldyBQcmVmaXhlZFFOYW1lKG51bGwsIGxvY2FsTmFtZSwgbnVsbCkpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAqIEBzZWUgamF2YXgueG1sLnNvYXAuU09BUEVsZW1lbnQjYWRkQ2hpbGRFbGVtZW50KGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0gICAgKi8KLSAgICBwdWJsaWMgU09BUEVsZW1lbnQgYWRkQ2hpbGRFbGVtZW50KFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBwcmVmaXgpIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIG5hbWVzcGFjZVVSSSA9IGdldE5hbWVzcGFjZVVSSShwcmVmaXgpOwotCi0gICAgICAgIGlmIChuYW1lc3BhY2VVUkkgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNPQVBFeGNlcHRpb24oIk5hbWVzcGFjZSBub3QgZGVjbGFyZWQgZm9yIHRoZSBnaXZlIHByZWZpeDogIiArIHByZWZpeCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGFkZENoaWxkRWxlbWVudChsb2NhbE5hbWUsIHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgKiBAc2VlIGphdmF4LnhtbC5zb2FwLlNPQVBFbGVtZW50I2FkZENoaWxkRWxlbWVudChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotICAgICovCi0gICAgcHVibGljIFNPQVBFbGVtZW50IGFkZENoaWxkRWxlbWVudChTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcHJlZml4LCBTdHJpbmcgdXJpKQotICAgICAgICAgICAgdGhyb3dzIFNPQVBFeGNlcHRpb24gewotICAgICAgICBPTU5hbWVzcGFjZSBucyA9IG5ldyBOYW1lc3BhY2VJbXBsKHVyaSwgcHJlZml4KTsKLSAgICAgICAgU09BUEhlYWRlckJsb2NrIGhlYWRlckJsb2NrID0gbnVsbDsKLSAgICAgICAgaWYgKHRoaXMuZWxlbWVudC5nZXRPTUZhY3RvcnkoKSBpbnN0YW5jZW9mIFNPQVAxMUZhY3RvcnkpIHsKLSAgICAgICAgICAgIGhlYWRlckJsb2NrID0gbmV3IFNPQVAxMUhlYWRlckJsb2NrSW1wbChsb2NhbE5hbWUsIG5zLCBvbVNPQVBIZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFNPQVBGYWN0b3J5KXRoaXMuZWxlbWVudC5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBoZWFkZXJCbG9jayA9IG5ldyBTT0FQMTJIZWFkZXJCbG9ja0ltcGwobG9jYWxOYW1lLCBucywgb21TT0FQSGVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTT0FQRmFjdG9yeSl0aGlzLmVsZW1lbnQuZ2V0T01GYWN0b3J5KCkpOwotICAgICAgICB9Ci0gICAgICAgIFNPQVBIZWFkZXJFbGVtZW50SW1wbCBzb2FwSGVhZGVyRWxlbWVudCA9IG5ldyBTT0FQSGVhZGVyRWxlbWVudEltcGwoaGVhZGVyQmxvY2spOwotICAgICAgICBlbGVtZW50LnNldFVzZXJEYXRhKFNBQUpfTk9ERSwgdGhpcywgbnVsbCk7Ci0gICAgICAgIHNvYXBIZWFkZXJFbGVtZW50LmVsZW1lbnQuc2V0VXNlckRhdGEoU0FBSl9OT0RFLCBzb2FwSGVhZGVyRWxlbWVudCwgbnVsbCk7Ci0gICAgICAgIHNvYXBIZWFkZXJFbGVtZW50LnNldFBhcmVudEVsZW1lbnQodGhpcyk7Ci0gICAgICAgIHJldHVybiBzb2FwSGVhZGVyRWxlbWVudDsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgKiBAc2VlIGphdmF4LnhtbC5zb2FwLlNPQVBFbGVtZW50I2FkZENoaWxkRWxlbWVudChqYXZheC54bWwuc29hcC5OYW1lKQotICAgICovCi0gICAgcHVibGljIFNPQVBFbGVtZW50IGFkZENoaWxkRWxlbWVudChOYW1lIG5hbWUpIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGFkZEhlYWRlckVsZW1lbnQobmFtZSk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICogQHNlZSBqYXZheC54bWwuc29hcC5TT0FQRWxlbWVudCNhZGRDaGlsZEVsZW1lbnQoamF2YXgueG1sLnNvYXAuU09BUEVsZW1lbnQpCi0gICAgKi8KLSAgICBwdWJsaWMgU09BUEVsZW1lbnQgYWRkQ2hpbGRFbGVtZW50KFNPQVBFbGVtZW50IHNvYXBFbGVtZW50KSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7Ci0gICAgICAgIE9NTmFtZXNwYWNlIG5zID0gbmV3IE5hbWVzcGFjZUltcGwoc29hcEVsZW1lbnQuZ2V0TmFtZXNwYWNlVVJJKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29hcEVsZW1lbnQuZ2V0UHJlZml4KCkpOwotICAgICAgICBTT0FQSGVhZGVyQmxvY2sgaGVhZGVyQmxvY2sgPSBudWxsOwotICAgICAgICBpZiAodGhpcy5lbGVtZW50LmdldE9NRmFjdG9yeSgpIGluc3RhbmNlb2YgU09BUDExRmFjdG9yeSkgewotICAgICAgICAgICAgaGVhZGVyQmxvY2sgPSBuZXcgU09BUDExSGVhZGVyQmxvY2tJbXBsKHNvYXBFbGVtZW50LmdldExvY2FsTmFtZSgpLCBucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbVNPQVBIZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFNPQVBGYWN0b3J5KXRoaXMuZWxlbWVudC5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBoZWFkZXJCbG9jayA9IG5ldyBTT0FQMTJIZWFkZXJCbG9ja0ltcGwoc29hcEVsZW1lbnQuZ2V0TG9jYWxOYW1lKCksIG5zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9tU09BUEhlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU09BUEZhY3RvcnkpdGhpcy5lbGVtZW50LmdldE9NRmFjdG9yeSgpKTsKLQotICAgICAgICB9Ci0gICAgICAgIFNPQVBIZWFkZXJFbGVtZW50SW1wbCBzb2FwSGVhZGVyRWxlbWVudCA9IG5ldyBTT0FQSGVhZGVyRWxlbWVudEltcGwoaGVhZGVyQmxvY2spOwotICAgICAgICBlbGVtZW50LnNldFVzZXJEYXRhKFNBQUpfTk9ERSwgdGhpcywgbnVsbCk7Ci0gICAgICAgIHNvYXBIZWFkZXJFbGVtZW50LmVsZW1lbnQuc2V0VXNlckRhdGEoU0FBSl9OT0RFLCBzb2FwSGVhZGVyRWxlbWVudCwgbnVsbCk7Ci0gICAgICAgIHNvYXBIZWFkZXJFbGVtZW50LnNldFBhcmVudEVsZW1lbnQodGhpcyk7Ci0gICAgICAgIHJldHVybiBzb2FwSGVhZGVyRWxlbWVudDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgRWxlbWVudCBhcHBlbmRFbGVtZW50KEVsZW1lbnRJbXBsIGNoaWxkKSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7ICAgICAKLSAgICAgICAgT01OYW1lc3BhY2UgbnMgPSBuZXcgTmFtZXNwYWNlSW1wbChjaGlsZC5nZXROYW1lc3BhY2VVUkkoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5nZXRQcmVmaXgoKSk7Ci0gICAgICAgIFNPQVBIZWFkZXJCbG9jayBoZWFkZXJCbG9jayA9IG51bGw7Ci0gICAgICAgIGlmICh0aGlzLmVsZW1lbnQuZ2V0T01GYWN0b3J5KCkgaW5zdGFuY2VvZiBTT0FQMTFGYWN0b3J5KSB7Ci0gICAgICAgICAgICBoZWFkZXJCbG9jayA9IG5ldyBTT0FQMTFIZWFkZXJCbG9ja0ltcGwoY2hpbGQuZ2V0TG9jYWxOYW1lKCksIG5zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9tU09BUEhlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU09BUEZhY3RvcnkpdGhpcy5lbGVtZW50LmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGhlYWRlckJsb2NrID0gbmV3IFNPQVAxMkhlYWRlckJsb2NrSW1wbChjaGlsZC5nZXRMb2NhbE5hbWUoKSwgbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb21TT0FQSGVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTT0FQRmFjdG9yeSl0aGlzLmVsZW1lbnQuZ2V0T01GYWN0b3J5KCkpOwotCi0gICAgICAgIH0KLSAgICAgCi0gICAgICAgIGVsZW1lbnQuc2V0VXNlckRhdGEoU0FBSl9OT0RFLCB0aGlzLCBudWxsKTsKLSAgICAgICAgCi0gICAgICAgIFNPQVBIZWFkZXJFbGVtZW50SW1wbCBzb2FwSGVhZGVyRWxlbWVudCA9IG5ldyBTT0FQSGVhZGVyRWxlbWVudEltcGwoaGVhZGVyQmxvY2spOwotICAgICAgICBjb3B5Q29udGVudHMoc29hcEhlYWRlckVsZW1lbnQsIGNoaWxkKTsKLSAgICAgICAgc29hcEhlYWRlckVsZW1lbnQuZWxlbWVudC5zZXRVc2VyRGF0YShTQUFKX05PREUsIHNvYXBIZWFkZXJFbGVtZW50LCBudWxsKTsKLSAgICAgICAgc29hcEhlYWRlckVsZW1lbnQuc2V0UGFyZW50RWxlbWVudCh0aGlzKTsKLSAgICAgICAgcmV0dXJuIHNvYXBIZWFkZXJFbGVtZW50OwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IDxDT0RFPlNPQVBIZWFkZXJFbGVtZW50PC9DT0RFPiBvYmplY3QgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgYW5kCi0gICAgICogYWRkcyBpdCB0byB0aGlzIDxDT0RFPlNPQVBIZWFkZXI8L0NPREU+IG9iamVjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIGEgPENPREU+TmFtZTwvQ09ERT4gb2JqZWN0IHdpdGggdGhlIG5hbWUgb2YgdGhlIG5ldyA8Q09ERT5TT0FQSGVhZGVyRWxlbWVudDwvQ09ERT4KLSAgICAgKiAgICAgICAgICAgICBvYmplY3QKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXcgPENPREU+U09BUEhlYWRlckVsZW1lbnQ8L0NPREU+IG9iamVjdCB0aGF0IHdhcyBpbnNlcnRlZCBpbnRvIHRoaXMKLSAgICAgKiAgICAgICAgIDxDT0RFPlNPQVBIZWFkZXI8L0NPREU+IG9iamVjdAotICAgICAqIEB0aHJvd3MgU09BUEV4Y2VwdGlvbiBpZiBhIFNPQVAgZXJyb3Igb2NjdXJzCi0gICAgICovCi0gICAgcHVibGljIFNPQVBIZWFkZXJFbGVtZW50IGFkZEhlYWRlckVsZW1lbnQoTmFtZSBuYW1lKSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7Ci0gICAgICAgIAotICAgICAgICBpZiAobmFtZS5nZXRVUkkoKSA9PSBudWxsCi0gICAgICAgICAgICAgICAgfHwgbmFtZS5nZXRVUkkoKS50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNPQVBFeGNlcHRpb24oIlNPQVAxLjEgYW5kIFNPQVAxLjIgcmVxdWlyZXMgYWxsIEhlYWRlckVsZW1lbnRzIHRvIGhhdmUgIiArCi0gICAgICAgICAgICAgICAgICAgICJhIG5hbWVzcGFjZS4iKTsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgcHJlZml4ID0gbmFtZS5nZXRQcmVmaXgoKSA9PSBudWxsID8gIiIgOiBuYW1lLmdldFByZWZpeCgpOwotICAgICAgICBPTU5hbWVzcGFjZSBucyA9IG5ldyBOYW1lc3BhY2VJbXBsKG5hbWUuZ2V0VVJJKCksIHByZWZpeCk7Ci0KLSAgICAgICAgU09BUEhlYWRlckJsb2NrIGhlYWRlckJsb2NrID0gbnVsbDsKLSAgICAgICAgaWYgKHRoaXMuZWxlbWVudC5nZXRPTUZhY3RvcnkoKSBpbnN0YW5jZW9mIFNPQVAxMUZhY3RvcnkpIHsKLSAgICAgICAgICAgIGhlYWRlckJsb2NrID0gbmV3IFNPQVAxMUhlYWRlckJsb2NrSW1wbChuYW1lLmdldExvY2FsTmFtZSgpLCBucywgb21TT0FQSGVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTT0FQRmFjdG9yeSl0aGlzLmVsZW1lbnQuZ2V0T01GYWN0b3J5KCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaGVhZGVyQmxvY2sgPSBuZXcgU09BUDEySGVhZGVyQmxvY2tJbXBsKG5hbWUuZ2V0TG9jYWxOYW1lKCksIG5zLCBvbVNPQVBIZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFNPQVBGYWN0b3J5KXRoaXMuZWxlbWVudC5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBTT0FQSGVhZGVyRWxlbWVudEltcGwgc29hcEhlYWRlckVsZW1lbnQgPSBuZXcgU09BUEhlYWRlckVsZW1lbnRJbXBsKGhlYWRlckJsb2NrKTsKLSAgICAgICAgZWxlbWVudC5zZXRVc2VyRGF0YShTQUFKX05PREUsIHRoaXMsIG51bGwpOwotICAgICAgICBzb2FwSGVhZGVyRWxlbWVudC5lbGVtZW50LnNldFVzZXJEYXRhKFNBQUpfTk9ERSwgc29hcEhlYWRlckVsZW1lbnQsIG51bGwpOwotICAgICAgICBzb2FwSGVhZGVyRWxlbWVudC5zZXRQYXJlbnRFbGVtZW50KHRoaXMpOwotICAgICAgICByZXR1cm4gc29hcEhlYWRlckVsZW1lbnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGxpc3Qgb2YgYWxsIHRoZSA8Q09ERT5TT0FQSGVhZGVyRWxlbWVudDwvQ09ERT4gb2JqZWN0cyBpbiB0aGlzCi0gICAgICogPENPREU+U09BUEhlYWRlcjwvQ09ERT4gb2JqZWN0IHRoYXQgaGF2ZSB0aGUgdGhlIHNwZWNpZmllZCBhY3Rvci4gQW4gYWN0b3IgaXMgYSBnbG9iYWwKLSAgICAgKiBhdHRyaWJ1dGUgdGhhdCBpbmRpY2F0ZXMgdGhlIGludGVybWVkaWF0ZSBwYXJ0aWVzIHRvIHdob20gdGhlIG1lc3NhZ2Ugc2hvdWxkIGJlIHNlbnQuIEFuCi0gICAgICogYWN0b3IgcmVjZWl2ZXMgdGhlIG1lc3NhZ2UgYW5kIHRoZW4gc2VuZHMgaXQgdG8gdGhlIG5leHQgYWN0b3IuIFRoZSBkZWZhdWx0IGFjdG9yIGlzIHRoZQotICAgICAqIHVsdGltYXRlIGludGVuZGVkIHJlY2lwaWVudCBmb3IgdGhlIG1lc3NhZ2UsIHNvIGlmIG5vIGFjdG9yIGF0dHJpYnV0ZSBpcyBpbmNsdWRlZCBpbiBhCi0gICAgICogPENPREU+U09BUEhlYWRlcjwvQ09ERT4gb2JqZWN0LCB0aGUgbWVzc2FnZSBpcyBzZW50IHRvIGl0cyB1bHRpbWF0ZSBkZXN0aW5hdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhY3RvciBhIDxDT0RFPlN0cmluZzwvQ09ERT4gZ2l2aW5nIHRoZSBVUkkgb2YgdGhlIGFjdG9yIGZvciB3aGljaCB0byBzZWFyY2gKLSAgICAgKiBAcmV0dXJuIGFuIDxDT0RFPkl0ZXJhdG9yPC9DT0RFPiBvYmplY3Qgb3ZlciBhbGwgdGhlIDxDT0RFPiBTT0FQSGVhZGVyRWxlbWVudDwvQ09ERT4gb2JqZWN0cwotICAgICAqICAgICAgICAgdGhhdCBjb250YWluIHRoZSBzcGVjaWZpZWQgYWN0b3IKLSAgICAgKiBAc2VlICNleHRyYWN0SGVhZGVyRWxlbWVudHMoU3RyaW5nKSBleHRyYWN0SGVhZGVyRWxlbWVudHMoamF2YS5sYW5nLlN0cmluZykKLSAgICAgKi8KLSAgICBwdWJsaWMgSXRlcmF0b3IgZXhhbWluZUhlYWRlckVsZW1lbnRzKFN0cmluZyBhY3RvcikgewotICAgICAgICBDb2xsZWN0aW9uIGVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gb21TT0FQSGVhZGVyLmV4YW1pbmVIZWFkZXJCbG9ja3MoYWN0b3IpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBlbGVtZW50cy5hZGQodG9TQUFKTm9kZSgoTm9kZUltcGwpaXRlcmF0b3IubmV4dCgpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVsZW1lbnRzLml0ZXJhdG9yKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGxpc3Qgb2YgYWxsIHRoZSA8Q09ERT5TT0FQSGVhZGVyRWxlbWVudDwvQ09ERT4gb2JqZWN0cyBpbiB0aGlzCi0gICAgICogPENPREU+U09BUEhlYWRlcjwvQ09ERT4gb2JqZWN0IHRoYXQgaGF2ZSB0aGUgdGhlIHNwZWNpZmllZCBhY3RvciBhbmQgZGV0YWNoZXMgdGhlbSBmcm9tIHRoaXMKLSAgICAgKiA8Q09ERT4gU09BUEhlYWRlcjwvQ09ERT4gb2JqZWN0LgotICAgICAqIDxwLz4KLSAgICAgKiA8UD5UaGlzIG1ldGhvZCBhbGxvd3MgYW4gYWN0b3IgdG8gcHJvY2VzcyBvbmx5IHRoZSBwYXJ0cyBvZiB0aGUgPENPREU+U09BUEhlYWRlcjwvQ09ERT4KLSAgICAgKiBvYmplY3QgdGhhdCBhcHBseSB0byBpdCBhbmQgdG8gcmVtb3ZlIHRoZW0gYmVmb3JlIHBhc3NpbmcgdGhlIG1lc3NhZ2Ugb24gdG8gdGhlIG5leHQgYWN0b3IuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYWN0b3IgYSA8Q09ERT5TdHJpbmc8L0NPREU+IGdpdmluZyB0aGUgVVJJIG9mIHRoZSBhY3RvciBmb3Igd2hpY2ggdG8gc2VhcmNoCi0gICAgICogQHJldHVybiBhbiA8Q09ERT5JdGVyYXRvcjwvQ09ERT4gb2JqZWN0IG92ZXIgYWxsIHRoZSA8Q09ERT4gU09BUEhlYWRlckVsZW1lbnQ8L0NPREU+IG9iamVjdHMKLSAgICAgKiAgICAgICAgIHRoYXQgY29udGFpbiB0aGUgc3BlY2lmaWVkIGFjdG9yCi0gICAgICogQHNlZSAjZXhhbWluZUhlYWRlckVsZW1lbnRzKFN0cmluZykgZXhhbWluZUhlYWRlckVsZW1lbnRzKGphdmEubGFuZy5TdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIEl0ZXJhdG9yIGV4dHJhY3RIZWFkZXJFbGVtZW50cyhTdHJpbmcgYWN0b3IpIHsKLSAgICAgICAgQ29sbGVjdGlvbiBlbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IG9tU09BUEhlYWRlci5leHRyYWN0SGVhZGVyQmxvY2tzKGFjdG9yKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgZWxlbWVudHMuYWRkKHRvU0FBSk5vZGUoKE5vZGVJbXBsKWl0ZXJhdG9yLm5leHQoKSkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBlbGVtZW50cy5pdGVyYXRvcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gPGNvZGU+SXRlcmF0b3I8L2NvZGU+IG92ZXIgYWxsIHRoZSA8Y29kZT5TT0FQSGVhZGVyRWxlbWVudDwvY29kZT4gb2JqZWN0cyBpbiB0aGlzCi0gICAgICogPGNvZGU+U09BUEhlYWRlcjwvY29kZT4gb2JqZWN0IHRoYXQgaGF2ZSB0aGUgc3BlY2lmaWVkIGFjdG9yIGFuZCB0aGF0IGhhdmUgYSBNdXN0VW5kZXJzdGFuZAotICAgICAqIGF0dHJpYnV0ZSB3aG9zZSB2YWx1ZSBpcyBlcXVpdmFsZW50IHRvIDxjb2RlPnRydWU8L2NvZGU+LgotICAgICAqCi0gICAgICogQHBhcmFtIGFjdG9yIGEgPGNvZGU+U3RyaW5nPC9jb2RlPiBnaXZpbmcgdGhlIFVSSSBvZiB0aGUgYWN0b3IgZm9yIHdoaWNoIHRvIHNlYXJjaAotICAgICAqIEByZXR1cm4gYW4gPGNvZGU+SXRlcmF0b3I8L2NvZGU+IG9iamVjdCBvdmVyIGFsbCB0aGUgPGNvZGU+U09BUEhlYWRlckVsZW1lbnQ8L2NvZGU+IG9iamVjdHMKLSAgICAgKiAgICAgICAgIHRoYXQgY29udGFpbiB0aGUgc3BlY2lmaWVkIGFjdG9yIGFuZCBhcmUgbWFya2VkIGFzIE11c3RVbmRlcnN0YW5kCi0gICAgICovCi0gICAgcHVibGljIEl0ZXJhdG9yIGV4YW1pbmVNdXN0VW5kZXJzdGFuZEhlYWRlckVsZW1lbnRzKFN0cmluZyBhY3RvcikgewotICAgICAgICBDb2xsZWN0aW9uIGVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gb21TT0FQSGVhZGVyLmV4YW1pbmVNdXN0VW5kZXJzdGFuZEhlYWRlckJsb2NrcyhhY3Rvcik7Ci0gICAgICAgICAgICAgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgZWxlbWVudHMuYWRkKHRvU0FBSk5vZGUoKE5vZGVJbXBsKWl0ZXJhdG9yLm5leHQoKSkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBlbGVtZW50cy5pdGVyYXRvcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gPGNvZGU+SXRlcmF0b3I8L2NvZGU+IG92ZXIgYWxsIHRoZSA8Y29kZT5TT0FQSGVhZGVyRWxlbWVudDwvY29kZT4gb2JqZWN0cyBpbiB0aGlzCi0gICAgICogPGNvZGU+U09BUEhlYWRlcjwvY29kZT4gb2JqZWN0LgotICAgICAqCi0gICAgICogQHJldHVybiBhbiA8Y29kZT5JdGVyYXRvcjwvY29kZT4gb2JqZWN0IG92ZXIgYWxsIHRoZSA8Y29kZT5TT0FQSGVhZGVyRWxlbWVudDwvY29kZT4gb2JqZWN0cwotICAgICAqICAgICAgICAgY29udGFpbmVkIGJ5IHRoaXMgPGNvZGU+U09BUEhlYWRlcjwvY29kZT4KLSAgICAgKi8KLSAgICBwdWJsaWMgSXRlcmF0b3IgZXhhbWluZUFsbEhlYWRlckVsZW1lbnRzKCkgewotICAgICAgICBDb2xsZWN0aW9uIGVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gb21TT0FQSGVhZGVyLmV4YW1pbmVBbGxIZWFkZXJCbG9ja3MoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgZWxlbWVudHMuYWRkKHRvU0FBSk5vZGUoKE5vZGVJbXBsKWl0ZXJhdG9yLm5leHQoKSkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBlbGVtZW50cy5pdGVyYXRvcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gPGNvZGU+SXRlcmF0b3I8L2NvZGU+IG92ZXIgYWxsIHRoZSA8Y29kZT5TT0FQSGVhZGVyRWxlbWVudDwvY29kZT4gb2JqZWN0cyBpbiB0aGlzCi0gICAgICogPGNvZGU+U09BUEhlYWRlciA8L2NvZGU+IG9iamVjdCBhbmQgZGV0YWNoZXMgdGhlbSBmcm9tIHRoaXMgPGNvZGU+U09BUEhlYWRlcjwvY29kZT4gb2JqZWN0LgotICAgICAqCi0gICAgICogQHJldHVybiBhbiA8Y29kZT5JdGVyYXRvcjwvY29kZT4gb2JqZWN0IG92ZXIgYWxsIHRoZSA8Y29kZT5TT0FQSGVhZGVyRWxlbWVudDwvY29kZT4gb2JqZWN0cwotICAgICAqICAgICAgICAgY29udGFpbmVkIGJ5IHRoaXMgPGNvZGU+U09BUEhlYWRlcjwvY29kZT4KLSAgICAgKi8KLSAgICBwdWJsaWMgSXRlcmF0b3IgZXh0cmFjdEFsbEhlYWRlckVsZW1lbnRzKCkgewotICAgICAgICBDb2xsZWN0aW9uIGVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gb21TT0FQSGVhZGVyLmV4dHJhY3RBbGxIZWFkZXJCbG9ja3MoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgZWxlbWVudHMuYWRkKHRvU0FBSk5vZGUoKE5vZGVJbXBsKWl0ZXJhdG9yLm5leHQoKSkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBlbGVtZW50cy5pdGVyYXRvcigpOwotICAgIH0KLQotICAgIHB1YmxpYyBTT0FQSGVhZGVyRWxlbWVudCBhZGRIZWFkZXJFbGVtZW50KFFOYW1lIHFuYW1lKSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiAoU09BUEhlYWRlckVsZW1lbnQpYWRkQ2hpbGRFbGVtZW50KHFuYW1lLmdldExvY2FsUGFydCgpLCBxbmFtZS5nZXRQcmVmaXgoKQotICAgICAgICAgICAgICAgICwgcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBOb3RVbmRlcnN0b29kIFNPQVBIZWFkZXJFbGVtZW50IG9iamVjdCBpbml0aWFsaXplZCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBhbmQKLSAgICAgKiBhZGRzIGl0IHRvIHRoaXMgU09BUEhlYWRlciBvYmplY3QuIFRoaXMgb3BlcmF0aW9uIGlzIHN1cHBvcnRlZCBvbmx5IGJ5IFNPQVAgMS4yCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSAtIGEgUU5hbWUgb2JqZWN0IHdpdGggdGhlIG5hbWUgb2YgdGhlIFNPQVBIZWFkZXJFbGVtZW50IG9iamVjdCB0aGF0IHdhcyBub3QKLSAgICAgKiAgICAgICAgICAgICB1bmRlcnN0b29kLgotICAgICAqIEByZXR1cm4gdGhlIG5ldyBTT0FQSGVhZGVyRWxlbWVudCBvYmplY3QgdGhhdCB3YXMgaW5zZXJ0ZWQgaW50byB0aGlzIFNPQVBIZWFkZXIgb2JqZWN0Ci0gICAgICogQHRocm93cyBTT0FQRXhjZXB0aW9uLSBpZiBhIFNPQVAgZXJyb3Igb2NjdXJzLiBqYXZhLmxhbmcuVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gLSBpZgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBpcyBhIFNPQVAgMS4xIEhlYWRlci4KLSAgICAgKi8KLQotICAgIHB1YmxpYyBTT0FQSGVhZGVyRWxlbWVudCBhZGROb3RVbmRlcnN0b29kSGVhZGVyRWxlbWVudChRTmFtZSBxbmFtZSkgdGhyb3dzIFNPQVBFeGNlcHRpb24gewotICAgICAgICBTT0FQSGVhZGVyQmxvY2sgc29hcEhlYWRlckJsb2NrID0gbnVsbDsKLSAgICAgICAgT01OYW1lc3BhY2UgbnMgPSBuZXcgTmFtZXNwYWNlSW1wbChxbmFtZS5nZXROYW1lc3BhY2VVUkkoKSwgcW5hbWUuZ2V0UHJlZml4KCkpOwotICAgICAgICBpZiAodGhpcy5lbGVtZW50LmdldE9NRmFjdG9yeSgpIGluc3RhbmNlb2YgU09BUDExRmFjdG9yeSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzb2FwSGVhZGVyQmxvY2sgPSB0aGlzLm9tU09BUEhlYWRlci5hZGRIZWFkZXJCbG9jaygKLSAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLkVMRU1fTk9UVU5ERVJTVE9PRCwgdGhpcy5lbGVtZW50LmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgICAgIHNvYXBIZWFkZXJCbG9jay5hZGRBdHRyaWJ1dGUocW5hbWUuZ2V0TG9jYWxQYXJ0KCksIHFuYW1lLmdldFByZWZpeCgpLCBucyk7Ci0gICAgICAgIH0KLSAgICAgICAgU09BUEhlYWRlckVsZW1lbnRJbXBsIHNvYXBIZWFkZXJFbGVtZW50SW1wbCA9IG5ldyBTT0FQSGVhZGVyRWxlbWVudEltcGwoc29hcEhlYWRlckJsb2NrKTsKLSAgICAgICAgcmV0dXJuIHNvYXBIZWFkZXJFbGVtZW50SW1wbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IFVwZ3JhZGUgU09BUEhlYWRlckVsZW1lbnQgb2JqZWN0IGluaXRpYWxpemVkIHdpdGggdGhlIHNwZWNpZmllZCBMaXN0IG9mCi0gICAgICogc3VwcG9ydGVkIFNPQVAgVVJJcyBhbmQgYWRkcyBpdCB0byB0aGlzIFNPQVBIZWFkZXIgb2JqZWN0LiBUaGlzIG9wZXJhdGlvbiBpcyBzdXBwb3J0ZWQgb24KLSAgICAgKiBib3RoIFNPQVAgMS4xIGFuZCBTT0FQIDEuMiBoZWFkZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3VwcG9ydGVkU09BUFVSSXMgLSBhbiBJdGVyYXRvciBvYmplY3Qgd2l0aCB0aGUgVVJJcyBvZiBTT0FQIHZlcnNpb25zIHN1cHBvcnRlZC4KLSAgICAgKiBAcmV0dXJuIHRoZSBuZXcgU09BUEhlYWRlckVsZW1lbnQgb2JqZWN0IHRoYXQgd2FzIGluc2VydGVkIGludG8gdGhpcyBTT0FQSGVhZGVyIG9iamVjdAotICAgICAqIEB0aHJvd3MgU09BUEV4Y2VwdGlvbiAtIGlmIGEgU09BUCBlcnJvciBvY2N1cnMuCi0gICAgICovCi0gICAgcHVibGljIFNPQVBIZWFkZXJFbGVtZW50IGFkZFVwZ3JhZGVIZWFkZXJFbGVtZW50KEl0ZXJhdG9yIGl0ZXJhdG9yKSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7Ci0gICAgICAgIFNPQVBIZWFkZXJCbG9jayB1cGdyYWRlID0gdGhpcy5vbVNPQVBIZWFkZXIuYWRkSGVhZGVyQmxvY2soCi0gICAgICAgICAgICAgICAgQ29uc3RhbnRzLkVMRU1fVVBHUkFERSwgdGhpcy5lbGVtZW50LmdldE5hbWVzcGFjZSgpKTsKLQotICAgICAgICBpbnQgaW5kZXggPSAwOwotICAgICAgICBTdHJpbmcgcHJlZml4ID0gIm5zIjsKLSAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgaW5kZXgrKzsKLSAgICAgICAgICAgIFN0cmluZyBzdXBwb3J0ZWQgPSAoU3RyaW5nKWl0ZXJhdG9yLm5leHQoKTsKLQotICAgICAgICAgICAgT01OYW1lc3BhY2UgbmFtZXNwYWNlID0gbmV3IE5hbWVzcGFjZUltcGwoc3VwcG9ydGVkLCBwcmVmaXggKyBpbmRleCk7Ci0KLSAgICAgICAgICAgIGlmICh0aGlzLmVsZW1lbnQuZ2V0T01GYWN0b3J5KCkgaW5zdGFuY2VvZiBTT0FQMTFGYWN0b3J5KSB7Ci0gICAgICAgICAgICAgICAgU09BUDExSGVhZGVyQmxvY2tJbXBsIHN1cHBvcnRlZEVudmVsb3AgPQotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFNPQVAxMUhlYWRlckJsb2NrSW1wbChDb25zdGFudHMuRUxFTV9TVVBQT1JURURFTlZFTE9QRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU09BUEZhY3RvcnkpdGhpcy5lbGVtZW50LmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgICAgICAgICBzdXBwb3J0ZWRFbnZlbG9wLmFkZEF0dHJpYnV0ZShDb25zdGFudHMuQVRUUl9RTkFNRSwgcHJlZml4ICsgaW5kZXggKyAiOiIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgQ29uc3RhbnRzLkVMRU1fRU5WRUxPUEUsIG51bGwpOwotICAgICAgICAgICAgICAgIHVwZ3JhZGUuYWRkQ2hpbGQoc3VwcG9ydGVkRW52ZWxvcCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFNPQVAxMkhlYWRlckJsb2NrSW1wbCBzdXBwb3J0ZWRFbnZlbG9wID0KLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTT0FQMTJIZWFkZXJCbG9ja0ltcGwoQ29uc3RhbnRzLkVMRU1fU1VQUE9SVEVERU5WRUxPUEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFNPQVBGYWN0b3J5KXRoaXMuZWxlbWVudC5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICAgICAgc3VwcG9ydGVkRW52ZWxvcC5hZGRBdHRyaWJ1dGUoQ29uc3RhbnRzLkFUVFJfUU5BTUUsIHByZWZpeCArIGluZGV4ICsgIjoiCi0gICAgICAgICAgICAgICAgICAgICAgICArIENvbnN0YW50cy5FTEVNX0VOVkVMT1BFLCBudWxsKTsKLSAgICAgICAgICAgICAgICB1cGdyYWRlLmFkZENoaWxkKHN1cHBvcnRlZEVudmVsb3ApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIFNPQVBIZWFkZXJFbGVtZW50SW1wbCBzb2FwSGVhZGVyRWxlbWVudEltcGwgPSBuZXcgU09BUEhlYWRlckVsZW1lbnRJbXBsKHVwZ3JhZGUpOwotICAgICAgICByZXR1cm4gc29hcEhlYWRlckVsZW1lbnRJbXBsOwotICAgIH0KLQotICAgIHB1YmxpYyBTT0FQSGVhZGVyRWxlbWVudCBhZGRVcGdyYWRlSGVhZGVyRWxlbWVudChTdHJpbmdbXSBhcykgdGhyb3dzIFNPQVBFeGNlcHRpb24gewotICAgICAgICBBcnJheUxpc3Qgc3VwcG9ydGVkRW52ZWxvcHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGZvciAoaW50IGEgPSAwOyBhIDwgYXMubGVuZ3RoOyBhKyspIHsKLSAgICAgICAgICAgIFN0cmluZyBzdXBwb3J0ZWQgPSAoU3RyaW5nKWFzW2FdOwotICAgICAgICAgICAgc3VwcG9ydGVkRW52ZWxvcHMuYWRkKHN1cHBvcnRlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHN1cHBvcnRlZEVudmVsb3BzLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIHJldHVybiBhZGRVcGdyYWRlSGVhZGVyRWxlbWVudChzdXBwb3J0ZWRFbnZlbG9wcy5pdGVyYXRvcigpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU09BUEhlYWRlckVsZW1lbnQgYWRkVXBncmFkZUhlYWRlckVsZW1lbnQoU3RyaW5nIHMpIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHMgPT0gbnVsbCAmJiBzLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIEFycmF5TGlzdCBzdXBwb3J0ZWRFbnZlbG9wcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgc3VwcG9ydGVkRW52ZWxvcHMuYWRkKHMpOwotICAgICAgICByZXR1cm4gYWRkVXBncmFkZUhlYWRlckVsZW1lbnQoc3VwcG9ydGVkRW52ZWxvcHMuaXRlcmF0b3IoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIFNPQVBFbGVtZW50IGFkZFRleHROb2RlKFN0cmluZyB0ZXh0KSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICh0aGlzLmVsZW1lbnQuZ2V0T01GYWN0b3J5KCkgaW5zdGFuY2VvZiBTT0FQMTFGYWN0b3J5KSB7Ci0gICAgICAgICAgICByZXR1cm4gc3VwZXIuYWRkVGV4dE5vZGUodGV4dCk7Ci0gICAgICAgIH0gZWxzZSBpZiAodGhpcy5lbGVtZW50LmdldE9NRmFjdG9yeSgpIGluc3RhbmNlb2YgU09BUDEyRmFjdG9yeSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNPQVBFeGNlcHRpb24oIkNhbm5vdCBhZGQgdGV4dCBub2RlIHRvIFNPQVBIZWFkZXIiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIEl0ZXJhdG9yIGdldENoaWxkRWxlbWVudHMoTmFtZSBuYW1lKSB7Ci0gICAgICAgIFFOYW1lIHFOYW1lID0gbmV3IFFOYW1lKG5hbWUuZ2V0VVJJKCksIG5hbWUuZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICByZXR1cm4gZ2V0Q2hpbGRyZW4oZWxlbWVudC5nZXRDaGlsZHJlbldpdGhOYW1lKHFOYW1lKSk7Ci0gICAgfQotCi0gICAgcHVibGljIEl0ZXJhdG9yIGdldENoaWxkRWxlbWVudHMoKSB7Ci0gICAgICAgIHJldHVybiBnZXRDaGlsZHJlbihlbGVtZW50LmdldENoaWxkcmVuKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgSXRlcmF0b3IgZ2V0Q2hpbGRyZW4oSXRlcmF0b3IgY2hpbGRJdGVyKSB7Ci0gICAgICAgIENvbGxlY3Rpb24gY2hpbGRFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgd2hpbGUgKGNoaWxkSXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUgZG9tTm9kZSA9IChvcmcudzNjLmRvbS5Ob2RlKWNoaWxkSXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBOb2RlIHNhYWpOb2RlID0gdG9TQUFKTm9kZShkb21Ob2RlKTsKLSAgICAgICAgICAgIGlmIChzYWFqTm9kZSBpbnN0YW5jZW9mIGphdmF4LnhtbC5zb2FwLlRleHQpIHsKLSAgICAgICAgICAgICAgICBjaGlsZEVsZW1lbnRzLmFkZChzYWFqTm9kZSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCEoc2Fhak5vZGUgaW5zdGFuY2VvZiBTT0FQSGVhZGVyRWxlbWVudCkpIHsKLSAgICAgICAgICAgICAgICAvLyBzaWxlbnRseSByZXBsYWNlIG5vZGUsIGFzIHBlciBzYWFqIDEuMiBzcGVjCi0gICAgICAgICAgICAgICAgU09BUEhlYWRlckVsZW1lbnQgaGVhZGVyRWxlID0gbmV3IFNPQVBIZWFkZXJFbGVtZW50SW1wbCgoU09BUEhlYWRlckJsb2NrKWRvbU5vZGUpOwotICAgICAgICAgICAgICAgICgoTm9kZUltcGwpZG9tTm9kZSkuc2V0VXNlckRhdGEoU0FBSl9OT0RFLCBoZWFkZXJFbGUsIG51bGwpOwotICAgICAgICAgICAgICAgIGNoaWxkRWxlbWVudHMuYWRkKGhlYWRlckVsZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGNoaWxkRWxlbWVudHMuYWRkKHNhYWpOb2RlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY2hpbGRFbGVtZW50cy5pdGVyYXRvcigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRldGFjaE5vZGUoKSB7Ci0gICAgICAgIHRoaXMuZGV0YWNoKCk7Ci0gICAgfQotCi0gICAgcHVibGljIE9NTm9kZSBkZXRhY2goKSB7Ci0gICAgICAgIE9NTm9kZSBvbU5vZGUgPSBvbVNPQVBIZWFkZXIuZGV0YWNoKCk7Ci0gICAgICAgIHBhcmVudEVsZW1lbnQgPSBudWxsOwotICAgICAgICByZXR1cm4gb21Ob2RlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhYWovc3JjL29yZy9hcGFjaGUvYXhpczIvc2Fhai9TT0FQTWVzc2FnZUltcGwuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhYWovc3JjL29yZy9hcGFjaGUvYXhpczIvc2Fhai9TT0FQTWVzc2FnZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM1NDQwNS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYWFqL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NhYWovU09BUE1lc3NhZ2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MTEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNhYWo7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLmF0dGFjaG1lbnRzLkJ5dGVBcnJheURhdGFTb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU91dHB1dEZvcm1hdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuTUlNRU91dHB1dFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQMTFDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVAxMkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5pbXBsLmRvbS5zb2FwMTEuU09BUDExRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuaW1wbC5kb20uc29hcDEyLlNPQVAxMkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5IVFRQQ29uc3RhbnRzOwotCi1pbXBvcnQgamF2YXguYWN0aXZhdGlvbi5EYXRhSGFuZGxlcjsKLWltcG9ydCBqYXZheC54bWwuc29hcC5BdHRhY2htZW50UGFydDsKLWltcG9ydCBqYXZheC54bWwuc29hcC5NaW1lSGVhZGVyOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLk1pbWVIZWFkZXJzOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBCb2R5OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBFbGVtZW50OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEhlYWRlcjsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQTWVzc2FnZTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQUGFydDsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLXB1YmxpYyBjbGFzcyBTT0FQTWVzc2FnZUltcGwgZXh0ZW5kcyBTT0FQTWVzc2FnZSB7Ci0KLSAgICBwcml2YXRlIFNPQVBQYXJ0IHNvYXBQYXJ0OwotICAgIHByaXZhdGUgQ29sbGVjdGlvbjxBdHRhY2htZW50UGFydD4gYXR0YWNobWVudFBhcnRzID0gbmV3IEFycmF5TGlzdDxBdHRhY2htZW50UGFydD4oKTsKLSAgICBwcml2YXRlIE1pbWVIZWFkZXJzRXggbWltZUhlYWRlcnM7Ci0KLSAgICBwcml2YXRlIE1hcCBwcm9wcyA9IG5ldyBIYXNodGFibGUoKTsKLSAgICBwcml2YXRlIGJvb2xlYW4gc2F2ZVJlcXVpcmVkOwotCi0gICAgcHVibGljIFNPQVBNZXNzYWdlSW1wbChTT0FQRW52ZWxvcGVJbXBsIHNvYXBFbnZlbG9wZSkgewotICAgICAgICBTdHJpbmcgY29udGVudFR5cGUgPSBudWxsOwotCi0KLSAgICAgICAgaWYgKG1pbWVIZWFkZXJzICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyBjb250ZW50VHlwZXNbXSA9IG1pbWVIZWFkZXJzLmdldEhlYWRlcihIVFRQQ29uc3RhbnRzLkNPTlRFTlRfVFlQRSk7Ci0gICAgICAgICAgICBjb250ZW50VHlwZSA9IChjb250ZW50VHlwZXMgIT0gbnVsbCkgPyBjb250ZW50VHlwZXNbMF0gOiBudWxsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhpcy5taW1lSGVhZGVycyA9IG5ldyBNaW1lSGVhZGVyc0V4KCk7Ci0gICAgICAgICAgICBpZiAoc29hcEVudmVsb3BlLmdldE9NRmFjdG9yeSgpIGluc3RhbmNlb2YgU09BUDExRmFjdG9yeSkgewotICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlID0gSFRUUENvbnN0YW50cy5NRURJQV9UWVBFX1RFWFRfWE1MOwotICAgICAgICAgICAgICAgIHRoaXMubWltZUhlYWRlcnMuYWRkSGVhZGVyKCJjb250ZW50LXR5cGUiLCBjb250ZW50VHlwZSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHNvYXBFbnZlbG9wZS5nZXRPTUZhY3RvcnkoKSBpbnN0YW5jZW9mIFNPQVAxMkZhY3RvcnkpIHsKLSAgICAgICAgICAgICAgICBjb250ZW50VHlwZSA9IEhUVFBDb25zdGFudHMuTUVESUFfVFlQRV9BUFBMSUNBVElPTl9TT0FQX1hNTDsKLSAgICAgICAgICAgICAgICB0aGlzLm1pbWVIZWFkZXJzLmFkZEhlYWRlcigiY29udGVudC10eXBlIiwgY29udGVudFR5cGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgc2V0Q2hhcnNldEVuY29kaW5nKGNvbnRlbnRUeXBlKTsKLSAgICAgICAgc29hcFBhcnQgPSBuZXcgU09BUFBhcnRJbXBsKHRoaXMsIHNvYXBFbnZlbG9wZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFNPQVBNZXNzYWdlSW1wbChJbnB1dFN0cmVhbSBpbnB1dHN0cmVhbSwgamF2YXgueG1sLnNvYXAuTWltZUhlYWRlcnMgbWltZUhlYWRlcnMpCi0gICAgICAgICAgICB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBjb250ZW50VHlwZSA9IG51bGw7Ci0gICAgICAgIFN0cmluZyB0bXBDb250ZW50VHlwZSA9ICIiOwotICAgICAgICBpZiAobWltZUhlYWRlcnMgIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIGNvbnRlbnRUeXBlc1tdID0gbWltZUhlYWRlcnMuZ2V0SGVhZGVyKEhUVFBDb25zdGFudHMuQ09OVEVOVF9UWVBFKTsKLSAgICAgICAgICAgIGlmIChjb250ZW50VHlwZXMgIT0gbnVsbCAmJiBjb250ZW50VHlwZXMubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgICAgIHRtcENvbnRlbnRUeXBlID0gY29udGVudFR5cGVzWzBdOwotICAgICAgICAgICAgICAgIC8vdG1wQ29udGVudFR5cGUgY2FuIGJlIGxpa2UgJ2FwcGxpY2F0aW9uL3NvYXAreG1sOyBjaGFyc2V0PVVURi04OycKLSAgICAgICAgICAgICAgICAvL09ubHkgdGhlIGZpcnN0IHBhcnQgaXMgaW1wb3J0YW50Ci0gICAgICAgICAgICAgICAgaWYgKHRtcENvbnRlbnRUeXBlLmluZGV4T2YoIjsiKSA+IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlID0gdG1wQ29udGVudFR5cGUuc3Vic3RyaW5nKDAsIHRtcENvbnRlbnRUeXBlLmluZGV4T2YoIjsiKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGVudFR5cGUgPSB0bXBDb250ZW50VHlwZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy9TZXR0aW5nIHRoZSB3aG9sZSBjb250ZW50LXR5cGUgc3RyaW5nIHRvIENoYXJzZXRFbmNvZGluZy4KLSAgICAgICAgLy9JcyB0aGlzIGNvcnJlY3Q/Ci0gICAgICAgIHNldENoYXJzZXRFbmNvZGluZyh0bXBDb250ZW50VHlwZSk7Ci0gICAgICAgIGlmIChjb250ZW50VHlwZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzb2FwUGFydCA9IG5ldyBTT0FQUGFydEltcGwodGhpcywgaW5wdXRzdHJlYW0sIG1pbWVIZWFkZXJzKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNvYXBQYXJ0ID0gbmV3IFNPQVBQYXJ0SW1wbCh0aGlzLCBpbnB1dHN0cmVhbSk7Ci0gICAgICAgIH0KLQotICAgICAgICB0aGlzLm1pbWVIZWFkZXJzID0gKG1pbWVIZWFkZXJzID09IG51bGwpID8KLSAgICAgICAgICAgICAgICBuZXcgTWltZUhlYWRlcnNFeCgpIDoKLSAgICAgICAgICAgICAgICBuZXcgTWltZUhlYWRlcnNFeChtaW1lSGVhZGVycyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0cmlldmVzIGEgZGVzY3JpcHRpb24gb2YgdGhpcyA8Q09ERT5TT0FQTWVzc2FnZTwvQ09ERT4gb2JqZWN0J3MgY29udGVudC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYSA8Q09ERT5TdHJpbmc8L0NPREU+IGRlc2NyaWJpbmcgdGhlIGNvbnRlbnQgb2YgdGhpcyBtZXNzYWdlIG9yIDxDT0RFPm51bGw8L0NPREU+IGlmCi0gICAgICogICAgICAgICBubyBkZXNjcmlwdGlvbiBoYXMgYmVlbiBzZXQKLSAgICAgKiBAc2VlICNzZXRDb250ZW50RGVzY3JpcHRpb24oU3RyaW5nKSBzZXRDb250ZW50RGVzY3JpcHRpb24oamF2YS5sYW5nLlN0cmluZykKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldENvbnRlbnREZXNjcmlwdGlvbigpIHsKLSAgICAgICAgU3RyaW5nIHZhbHVlc1tdID0gbWltZUhlYWRlcnMuZ2V0SGVhZGVyKEhUVFBDb25zdGFudHMuSEVBREVSX0NPTlRFTlRfREVTQ1JJUFRJT04pOwotICAgICAgICBpZiAodmFsdWVzICE9IG51bGwgJiYgdmFsdWVzLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgIHJldHVybiB2YWx1ZXNbMF07Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZGVzY3JpcHRpb24gb2YgdGhpcyA8Q09ERT5TT0FQTWVzc2FnZTwvQ09ERT4gb2JqZWN0J3MgY29udGVudCB3aXRoIHRoZSBnaXZlbgotICAgICAqIGRlc2NyaXB0aW9uLgotICAgICAqCi0gICAgICogQHBhcmFtIGRlc2NyaXB0aW9uIGEgPENPREU+U3RyaW5nPC9DT0RFPiBkZXNjcmliaW5nIHRoZSBjb250ZW50IG9mIHRoaXMgbWVzc2FnZQotICAgICAqIEBzZWUgI2dldENvbnRlbnREZXNjcmlwdGlvbigpIGdldENvbnRlbnREZXNjcmlwdGlvbigpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q29udGVudERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikgewotICAgICAgICBtaW1lSGVhZGVycy5zZXRIZWFkZXIoSFRUUENvbnN0YW50cy5IRUFERVJfQ09OVEVOVF9ERVNDUklQVElPTiwgZGVzY3JpcHRpb24pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIFNPQVAgcGFydCBvZiB0aGlzIDxDT0RFPlNPQVBNZXNzYWdlPC9DT0RFPiBvYmplY3QuCi0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiA8UD5JZiBhIDxDT0RFPlNPQVBNZXNzYWdlPC9DT0RFPiBvYmplY3QgY29udGFpbnMgb25lIG9yIG1vcmUgYXR0YWNobWVudHMsIHRoZSBTT0FQIFBhcnQgbXVzdAotICAgICAqIGJlIHRoZSBmaXJzdCBNSU1FIGJvZHkgcGFydCBpbiB0aGUgbWVzc2FnZS48L1A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSA8Q09ERT5TT0FQUGFydDwvQ09ERT4gb2JqZWN0IGZvciB0aGlzIDxDT0RFPiBTT0FQTWVzc2FnZTwvQ09ERT4gb2JqZWN0Ci0gICAgICovCi0gICAgcHVibGljIFNPQVBQYXJ0IGdldFNPQVBQYXJ0KCkgewotICAgICAgICByZXR1cm4gc29hcFBhcnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyBhbGwgPENPREU+QXR0YWNobWVudFBhcnQ8L0NPREU+IG9iamVjdHMgdGhhdCBoYXZlIGJlZW4gYWRkZWQgdG8gdGhpcwotICAgICAqIDxDT0RFPlNPQVBNZXNzYWdlPC9DT0RFPiBvYmplY3QuCi0gICAgICogPHAvPgotICAgICAqIDxQPlRoaXMgbWV0aG9kIGRvZXMgbm90IHRvdWNoIHRoZSBTT0FQIHBhcnQuPC9QPgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZUFsbEF0dGFjaG1lbnRzKCkgewotICAgICAgICBhdHRhY2htZW50UGFydHMuY2xlYXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGEgY291bnQgb2YgdGhlIG51bWJlciBvZiBhdHRhY2htZW50cyBpbiB0aGlzIG1lc3NhZ2UuIFRoaXMgY291bnQgZG9lcyBub3QgaW5jbHVkZSB0aGUKLSAgICAgKiBTT0FQIHBhcnQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgPENPREU+QXR0YWNobWVudFBhcnQ8L0NPREU+IG9iamVjdHMgdGhhdCBhcmUgcGFydCBvZiB0aGlzCi0gICAgICogICAgICAgICA8Q09ERT5TT0FQTWVzc2FnZTwvQ09ERT4gb2JqZWN0Ci0gICAgICovCi0gICAgcHVibGljIGludCBjb3VudEF0dGFjaG1lbnRzKCkgewotICAgICAgICByZXR1cm4gYXR0YWNobWVudFBhcnRzLnNpemUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXRyaWV2ZXMgYWxsIHRoZSA8Q09ERT5BdHRhY2htZW50UGFydDwvQ09ERT4gb2JqZWN0cyB0aGF0IGFyZSBwYXJ0IG9mIHRoaXMKLSAgICAgKiA8Q09ERT5TT0FQTWVzc2FnZTwvQ09ERT4gb2JqZWN0LgotICAgICAqCi0gICAgICogQHJldHVybiBhbiBpdGVyYXRvciBvdmVyIGFsbCB0aGUgYXR0YWNobWVudHMgaW4gdGhpcyBtZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIEl0ZXJhdG9yIGdldEF0dGFjaG1lbnRzKCkgewotICAgICAgICByZXR1cm4gYXR0YWNobWVudFBhcnRzLml0ZXJhdG9yKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0cmlldmVzIGFsbCB0aGUgQXR0YWNobWVudFBhcnQgb2JqZWN0cyB0aGF0IGhhdmUgaGVhZGVyIGVudHJpZXMgdGhhdCBtYXRjaCB0aGUgc3BlY2lmaWVkCi0gICAgICogaGVhZGVycy4gTm90ZSB0aGF0IGEgcmV0dXJuZWQgYXR0YWNobWVudCBjb3VsZCBoYXZlIGhlYWRlcnMgaW4gYWRkaXRpb24gdG8gdGhvc2Ugc3BlY2lmaWVkLgotICAgICAqCi0gICAgICogQHBhcmFtIGhlYWRlcnMgYSB7QGxpbmsgamF2YXgueG1sLnNvYXAuTWltZUhlYWRlcnN9IG9iamVjdCBjb250YWluaW5nIHRoZSBNSU1FIGhlYWRlcnMgZm9yCi0gICAgICogICAgICAgICAgICAgICAgd2hpY2ggdG8gc2VhcmNoCi0gICAgICogQHJldHVybiBhbiBpdGVyYXRvciBvdmVyIGFsbCBhdHRhY2htZW50cyh7QGxpbmsgamF2YXgueG1sLnNvYXAuQXR0YWNobWVudFBhcnR9KSB0aGF0IGhhdmUgYQotICAgICAqICAgICAgICAgaGVhZGVyIHRoYXQgbWF0Y2hlcyBvbmUgb2YgdGhlIGdpdmVuIGhlYWRlcnMKLSAgICAgKi8KLSAgICBwdWJsaWMgSXRlcmF0b3IgZ2V0QXR0YWNobWVudHMoamF2YXgueG1sLnNvYXAuTWltZUhlYWRlcnMgaGVhZGVycykgewotICAgICAgICBDb2xsZWN0aW9uIG1hdGNoaW5nQXR0YWNobWVudFBhcnRzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBJdGVyYXRvciBpdGVyYXRvciA9IGdldEF0dGFjaG1lbnRzKCk7Ci0gICAgICAgIHsKLSAgICAgICAgICAgIEF0dGFjaG1lbnRQYXJ0SW1wbCBwYXJ0OwotICAgICAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIHBhcnQgPSAoQXR0YWNobWVudFBhcnRJbXBsKWl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgICAgICBpZiAocGFydC5tYXRjaGVzKGhlYWRlcnMpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1hdGNoaW5nQXR0YWNobWVudFBhcnRzLmFkZChwYXJ0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1hdGNoaW5nQXR0YWNobWVudFBhcnRzLml0ZXJhdG9yKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyB0aGUgZ2l2ZW4gPENPREU+QXR0YWNobWVudFBhcnQ8L0NPREU+IG9iamVjdCB0byB0aGlzIDxDT0RFPlNPQVBNZXNzYWdlPC9DT0RFPiBvYmplY3QuIEFuCi0gICAgICogPENPREU+IEF0dGFjaG1lbnRQYXJ0PC9DT0RFPiBvYmplY3QgbXVzdCBiZSBjcmVhdGVkIGJlZm9yZSBpdCBjYW4gYmUgYWRkZWQgdG8gYSBtZXNzYWdlLgotICAgICAqCi0gICAgICogQHBhcmFtIGF0dGFjaG1lbnRQYXJ0IGFuIDxDT0RFPiBBdHRhY2htZW50UGFydDwvQ09ERT4gb2JqZWN0IHRoYXQgaXMgdG8gYmVjb21lIHBhcnQgb2YgdGhpcwotICAgICAqICAgICAgICAgICAgICAgICAgICAgICA8Q09ERT5TT0FQTWVzc2FnZTwvQ09ERT4gb2JqZWN0Ci0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgICAgKgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZEF0dGFjaG1lbnRQYXJ0KEF0dGFjaG1lbnRQYXJ0IGF0dGFjaG1lbnRQYXJ0KSB7Ci0gICAgICAgIGlmIChhdHRhY2htZW50UGFydCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBhdHRhY2htZW50UGFydHMuYWRkKGF0dGFjaG1lbnRQYXJ0KTsKLSAgICAgICAgICAgIG1pbWVIZWFkZXJzLnNldEhlYWRlcihIVFRQQ29uc3RhbnRzLkNPTlRFTlRfVFlQRSwgIm11bHRpcGFydC9yZWxhdGVkIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGVtcHR5IDxDT0RFPkF0dGFjaG1lbnRQYXJ0PC9DT0RFPiBvYmplY3QuIE5vdGUgdGhhdCB0aGUgbWV0aG9kCi0gICAgICogPENPREU+YWRkQXR0YWNobWVudFBhcnQ8L0NPREU+IG11c3QgYmUgY2FsbGVkIHdpdGggdGhpcyBuZXcgPENPREU+QXR0YWNobWVudFBhcnQ8L0NPREU+Ci0gICAgICogb2JqZWN0IGFzIHRoZSBwYXJhbWV0ZXIgaW4gb3JkZXIgZm9yIGl0IHRvIGJlY29tZSBhbiBhdHRhY2htZW50IHRvIHRoaXMKLSAgICAgKiA8Q09ERT5TT0FQTWVzc2FnZTwvQ09ERT4gb2JqZWN0LgotICAgICAqCi0gICAgICogQHJldHVybiBhIG5ldyA8Q09ERT5BdHRhY2htZW50UGFydDwvQ09ERT4gb2JqZWN0IHRoYXQgY2FuIGJlIHBvcHVsYXRlZCBhbmQgYWRkZWQgdG8gdGhpcwotICAgICAqICAgICAgICAgPENPREU+U09BUE1lc3NhZ2U8L0NPREU+IG9iamVjdAotICAgICAqLwotICAgIHB1YmxpYyBBdHRhY2htZW50UGFydCBjcmVhdGVBdHRhY2htZW50UGFydCgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBBdHRhY2htZW50UGFydEltcGwoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFsbCB0aGUgdHJhbnNwb3J0LXNwZWNpZmljIE1JTUUgaGVhZGVycyBmb3IgdGhpcyA8Q09ERT5TT0FQTWVzc2FnZTwvQ09ERT4gb2JqZWN0IGluIGEKLSAgICAgKiB0cmFuc3BvcnQtaW5kZXBlbmRlbnQgZmFzaGlvbi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYSA8Q09ERT5NaW1lSGVhZGVyczwvQ09ERT4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIDxDT0RFPk1pbWVIZWFkZXI8L0NPREU+IG9iamVjdHMKLSAgICAgKi8KLSAgICBwdWJsaWMgamF2YXgueG1sLnNvYXAuTWltZUhlYWRlcnMgZ2V0TWltZUhlYWRlcnMoKSB7Ci0gICAgICAgIHJldHVybiBtaW1lSGVhZGVyczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVcGRhdGVzIHRoaXMgPENPREU+U09BUE1lc3NhZ2U8L0NPREU+IG9iamVjdCB3aXRoIGFsbCB0aGUgY2hhbmdlcyB0aGF0IGhhdmUgYmVlbiBtYWRlIHRvIGl0LgotICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhdXRvbWF0aWNhbGx5IHdoZW4gYSBtZXNzYWdlIGlzIHNlbnQgb3Igd3JpdHRlbiB0byBieSB0aGUgbWV0aG9kcwotICAgICAqIDxDT0RFPlByb3ZpZGVyQ29ubmVjdGlvbi5zZW5kPC9DT0RFPiwgPENPREU+IFNPQVBDb25uZWN0aW9uLmNhbGw8L0NPREU+LCBvciA8Q09ERT4KLSAgICAgKiBTT0FQTWVzc2FnZS53cml0ZVRvPC9DT0RFPi4gSG93ZXZlciwgaWYgY2hhbmdlcyBhcmUgbWFkZSB0byBhIG1lc3NhZ2UgdGhhdCB3YXMgcmVjZWl2ZWQgb3IgdG8KLSAgICAgKiBvbmUgdGhhdCBoYXMgYWxyZWFkeSBiZWVuIHNlbnQsIHRoZSBtZXRob2QgPENPREU+c2F2ZUNoYW5nZXM8L0NPREU+IG5lZWRzIHRvIGJlIGNhbGxlZAotICAgICAqIGV4cGxpY2l0bHkgaW4gb3JkZXIgdG8gc2F2ZSB0aGUgY2hhbmdlcy4gVGhlIG1ldGhvZCA8Q09ERT5zYXZlQ2hhbmdlczwvQ09ERT4gYWxzbyBnZW5lcmF0ZXMKLSAgICAgKiBhbnkgY2hhbmdlcyB0aGF0IGNhbiBiZSByZWFkIGJhY2sgKGZvciBleGFtcGxlLCBhIE1lc3NhZ2VJZCBpbiBwcm9maWxlcyB0aGF0IHN1cHBvcnQgYQotICAgICAqIG1lc3NhZ2UgaWQpLiBBbGwgTUlNRSBoZWFkZXJzIGluIGEgbWVzc2FnZSB0aGF0IGlzIGNyZWF0ZWQgZm9yIHNlbmRpbmcgcHVycG9zZXMgYXJlCi0gICAgICogZ3VhcmFudGVlZCB0byBoYXZlIHZhbGlkIHZhbHVlcyBvbmx5IGFmdGVyIDxDT0RFPnNhdmVDaGFuZ2VzPC9DT0RFPiBoYXMgYmVlbiBjYWxsZWQuCi0gICAgICogPHAvPgotICAgICAqIDxQPkluIGFkZGl0aW9uLCB0aGlzIG1ldGhvZCBtYXJrcyB0aGUgcG9pbnQgYXQgd2hpY2ggdGhlIGRhdGEgZnJvbSBhbGwgY29uc3RpdHVlbnQKLSAgICAgKiA8Q09ERT5BdHRhY2htZW50UGFydDwvQ09ERT4gb2JqZWN0cyBhcmUgcHVsbGVkIGludG8gdGhlIG1lc3NhZ2UuPC9QPgotICAgICAqCi0gICAgICogQHRocm93cyBTT0FQRXhjZXB0aW9uIGlmIHRoZXJlIHdhcyBhIHByb2JsZW0gc2F2aW5nIGNoYW5nZXMgdG8gdGhpcyBtZXNzYWdlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNhdmVDaGFuZ2VzKCkgdGhyb3dzIFNPQVBFeGNlcHRpb24gewotICAgICAgICBzYXZlUmVxdWlyZWQgPSBmYWxzZTsKLSAgICAgICAgLy8gVE9ETyBub3Qgc3VyZSBvZiB0aGUgaW1wbGVtZW50YXRpb24KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTYXZlUmVxdWlyZWQoKSB7Ci0gICAgICAgIHRoaXMuc2F2ZVJlcXVpcmVkID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIDxDT0RFPlNPQVBNZXNzYWdlPC9DT0RFPiBvYmplY3QgaGFzIGhhZCB0aGUgbWV0aG9kIHtAbGluawotICAgICAqICNzYXZlQ2hhbmdlcygpfSBjYWxsZWQgb24gaXQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIDxDT0RFPnRydWU8L0NPREU+IGlmIDxDT0RFPnNhdmVDaGFuZ2VzPC9DT0RFPiBoYXMgYmVlbiBjYWxsZWQgb24gdGhpcyBtZXNzYWdlIGF0Ci0gICAgICogICAgICAgICBsZWFzdCBvbmNlOyA8Q09ERT4gZmFsc2U8L0NPREU+IG90aGVyd2lzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBzYXZlUmVxdWlyZWQoKSB7Ci0gICAgICAgIHJldHVybiBzYXZlUmVxdWlyZWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV3JpdGVzIHRoaXMgPENPREU+U09BUE1lc3NhZ2U8L0NPREU+IG9iamVjdCB0byB0aGUgZ2l2ZW4gb3V0cHV0IHN0cmVhbS4gVGhlIGV4dGVybmFsaXphdGlvbgotICAgICAqIGZvcm1hdCBpcyBhcyBkZWZpbmVkIGJ5IHRoZSBTT0FQIDEuMSB3aXRoIEF0dGFjaG1lbnRzIHNwZWNpZmljYXRpb24uCi0gICAgICogPHAvPgotICAgICAqIDxQPklmIHRoZXJlIGFyZSBubyBhdHRhY2htZW50cywganVzdCBhbiBYTUwgc3RyZWFtIGlzIHdyaXR0ZW4gb3V0LiBGb3IgdGhvc2UgbWVzc2FnZXMgdGhhdAotICAgICAqIGhhdmUgYXR0YWNobWVudHMsIDxDT0RFPndyaXRlVG88L0NPREU+IHdyaXRlcyBhIE1JTUUtZW5jb2RlZCBieXRlIHN0cmVhbS48L1A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gb3V0IHRoZSA8Q09ERT5PdXRwdXRTdHJlYW08L0NPREU+IG9iamVjdCB0byB3aGljaCB0aGlzIDxDT0RFPlNPQVBNZXNzYWdlPC9DT0RFPiBvYmplY3QKLSAgICAgKiAgICAgICAgICAgIHdpbGwgYmUgd3JpdHRlbgotICAgICAqIEB0aHJvd3MgU09BUEV4Y2VwdGlvbiBpZiB0aGVyZSB3YXMgYSBwcm9ibGVtIGluIGV4dGVybmFsaXppbmcgdGhpcyBTT0FQIG1lc3NhZ2UKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uICAgaWYgYW4gSS9PIGVycm9yIG9jY3VycwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIFNPQVBFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9NT3V0cHV0Rm9ybWF0IGZvcm1hdCA9IG5ldyBPTU91dHB1dEZvcm1hdCgpOwotICAgICAgICAgICAgU3RyaW5nIGVuYyA9IChTdHJpbmcpZ2V0UHJvcGVydHkoQ0hBUkFDVEVSX1NFVF9FTkNPRElORyk7Ci0gICAgICAgICAgICBmb3JtYXQuc2V0Q2hhclNldEVuY29kaW5nKGVuYyAhPSBudWxsID8gZW5jIDogT01PdXRwdXRGb3JtYXQuREVGQVVMVF9DSEFSX1NFVF9FTkNPRElORyk7Ci0gICAgICAgICAgICBTdHJpbmcgd3JpdGVYbWxEZWNsID0gKFN0cmluZylnZXRQcm9wZXJ0eShXUklURV9YTUxfREVDTEFSQVRJT04pOwotICAgICAgICAgICAgaWYgKHdyaXRlWG1sRGVjbCA9PSBudWxsIHx8IHdyaXRlWG1sRGVjbC5lcXVhbHMoImZhbHNlIikpIHsKLQotICAgICAgICAgICAgICAgIC8vU0FBSiBkZWZhdWx0IGNhc2UgZG9lc24ndCBzZW5kIFhNTCBkZWNsCi0gICAgICAgICAgICAgICAgZm9ybWF0LnNldElnbm9yZVhNTERlY2xhcmF0aW9uKHRydWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTT0FQRW52ZWxvcGUgZW52ZWxvcGUgPSAoKFNPQVBFbnZlbG9wZUltcGwpc29hcFBhcnQuZ2V0RW52ZWxvcGUoKSkuZ2V0T01FbnZlbG9wZSgpOwotICAgICAgICAgICAgaWYgKGF0dGFjaG1lbnRQYXJ0cy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBlbnZlbG9wZS5zZXJpYWxpemUob3V0LCBmb3JtYXQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmb3JtYXQuc2V0U09BUDExKCgoU09BUEVudmVsb3BlSW1wbClzb2FwUGFydC5nZXRFbnZlbG9wZSgpKS5nZXRPTUZhY3RvcnkoKQotICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VvZiBTT0FQMTFGYWN0b3J5KTsKLSAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLERhdGFIYW5kbGVyPiBhdHRhY2htZW50c01hcCA9IG5ldyBMaW5rZWRIYXNoTWFwPFN0cmluZyxEYXRhSGFuZGxlcj4oKTsKLSAgICAgICAgICAgICAgICBmb3IgKEF0dGFjaG1lbnRQYXJ0IGFwIDogYXR0YWNobWVudFBhcnRzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRzTWFwLnB1dChhcC5nZXRDb250ZW50SWQoKSwgYXAuZ2V0RGF0YUhhbmRsZXIoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICAgICAgICAgIGVudmVsb3BlLnNlcmlhbGl6ZShiYW9zKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgY29udGVudFR5cGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgKGZvcm1hdC5pc1NPQVAxMSgpID8gU09BUDExQ29uc3RhbnRzLlNPQVBfMTFfQ09OVEVOVF9UWVBFIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPQVAxMkNvbnN0YW50cy5TT0FQXzEyX0NPTlRFTlRfVFlQRSkKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIjsgY2hhcnNldD0iICsgZm9ybWF0LmdldENoYXJTZXRFbmNvZGluZygpOwotICAgICAgICAgICAgICAgIERhdGFIYW5kbGVyIHJvb3REYXRhSGFuZGxlciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgRGF0YUhhbmRsZXIobmV3IEJ5dGVBcnJheURhdGFTb3VyY2UoYmFvcy50b0J5dGVBcnJheSgpLCBjb250ZW50VHlwZSkpOwotICAgICAgICAgICAgICAgIE1JTUVPdXRwdXRVdGlscy53cml0ZURhdGFIYW5kbGVyV2l0aEF0dGFjaG1lbnRzTWVzc2FnZShyb290RGF0YUhhbmRsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50VHlwZSwgb3V0LCBhdHRhY2htZW50c01hcCwgZm9ybWF0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNhdmVDaGFuZ2VzKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU09BUEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFzc29jaWF0ZXMgdGhlIHNwZWNpZmllZCB2YWx1ZSB3aXRoIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkuIElmIHRoZXJlIHdhcyBhbHJlYWR5IGEgdmFsdWUKLSAgICAgKiBhc3NvY2lhdGVkIHdpdGggdGhpcyBwcm9wZXJ0eSwgdGhlIG9sZCB2YWx1ZSBpcyByZXBsYWNlZC4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhlIHZhbGlkIHByb3BlcnR5IG5hbWVzIGluY2x1ZGUgPGNvZGU+V1JJVEVfWE1MX0RFQ0xBUkFUSU9OPC9jb2RlPiBhbmQKLSAgICAgKiA8Y29kZT5DSEFSQUNURVJfU0VUX0VOQ09ESU5HPC9jb2RlPi4gQWxsIG9mIHRoZXNlIHN0YW5kYXJkIFNBQUogcHJvcGVydGllcyBhcmUgcHJlZml4ZWQgYnkKLSAgICAgKiAiamF2YXgueG1sLnNvYXAiLiBWZW5kb3JzIG1heSBhbHNvIGFkZCBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyBwcm9wZXJ0aWVzLiBUaGVzZSBwcm9wZXJ0aWVzCi0gICAgICogbXVzdCBiZSBwcmVmaXhlZCB3aXRoIHBhY2thZ2UgbmFtZXMgdGhhdCBhcmUgdW5pcXVlIHRvIHRoZSB2ZW5kb3IuCi0gICAgICogPHAvPgotICAgICAqIFNldHRpbmcgdGhlIHByb3BlcnR5IDxjb2RlPldSSVRFX1hNTF9ERUNMQVJBVElPTjwvY29kZT4gdG8gPGNvZGU+InRydWUiPC9jb2RlPiB3aWxsIGNhdXNlIGFuCi0gICAgICogWE1MIERlY2xhcmF0aW9uIHRvIGJlIHdyaXR0ZW4gb3V0IGF0IHRoZSBzdGFydCBvZiB0aGUgU09BUCBtZXNzYWdlLiBUaGUgZGVmYXVsdCB2YWx1ZSBvZgotICAgICAqICJmYWxzZSIgc3VwcHJlc3NlcyB0aGlzIGRlY2xhcmF0aW9uLgotICAgICAqIDxwLz4KLSAgICAgKiBUaGUgcHJvcGVydHkgPGNvZGU+Q0hBUkFDVEVSX1NFVF9FTkNPRElORzwvY29kZT4gZGVmYXVsdHMgdG8gdGhlIHZhbHVlIDxjb2RlPiJ1dGYtOCI8L2NvZGU+Ci0gICAgICogd2hpY2ggY2F1c2VzIHRoZSBTT0FQIG1lc3NhZ2UgdG8gYmUgZW5jb2RlZCB1c2luZyBVVEYtOC4gU2V0dGluZwotICAgICAqIDxjb2RlPkNIQVJBQ1RFUl9TRVRfRU5DT0RJTkc8L2NvZGU+IHRvIDxjb2RlPiJ1dGYtMTYiPC9jb2RlPiBjYXVzZXMgdGhlIFNPQVAgbWVzc2FnZSB0byBiZQotICAgICAqIGVuY29kZWQgdXNpbmcgVVRGLTE2LgotICAgICAqIDxwLz4KLSAgICAgKiBTb21lIGltcGxlbWVudGF0aW9ucyBtYXkgYWxsb3cgZW5jb2RpbmdzIGluIGFkZGl0aW9uIHRvIFVURi04IGFuZCBVVEYtMTYuIFJlZmVyIHRvIHlvdXIKLSAgICAgKiB2ZW5kb3IncyBkb2N1bWVudGF0aW9uIGZvciBkZXRhaWxzLgotICAgICAqCi0gICAgICogQHBhcmFtIHByb3BlcnR5IHRoZSBwcm9wZXJ0eSB3aXRoIHdoaWNoIHRoZSBzcGVjaWZpZWQgdmFsdWUgaXMgdG8gYmUgYXNzb2NpYXRlZAotICAgICAqIEBwYXJhbSB2YWx1ZSAgICB0aGUgdmFsdWUgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHksIE9iamVjdCB2YWx1ZSkgewotICAgICAgICBwcm9wcy5wdXQocHJvcGVydHksIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXRyaWV2ZXMgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwcm9wZXJ0eSB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gcmV0cmlldmUKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gc3VjaCBwcm9wZXJ0eSBleGlzdHMKLSAgICAgKiBAdGhyb3dzIFNPQVBFeGNlcHRpb24gaWYgdGhlIHByb3BlcnR5IG5hbWUgaXMgbm90IHJlY29nbml6ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eSkgdGhyb3dzIFNPQVBFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gcHJvcHMuZ2V0KHByb3BlcnR5KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIEF0dGFjaG1lbnRQYXJ0IG9iamVjdCB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCBhbiBhdHRhY2htZW50IHRoYXQgaXMgcmVmZXJlbmNlZCBieQotICAgICAqIHRoaXMgU09BUEVsZW1lbnQgb3IgbnVsbCBpZiBubyBzdWNoIGF0dGFjaG1lbnQgZXhpc3RzLiBSZWZlcmVuY2VzIGNhbiBiZSBtYWRlIHZpYSBhbiBocmVmCi0gICAgICogYXR0cmlidXRlIGFzIGRlc2NyaWJlZCBpbiBTT0FQIE1lc3NhZ2VzIHdpdGggQXR0YWNobWVudHMgKGh0dHA6Ly93d3cudzMub3JnL1RSL1NPQVBhdHRhY2htZW50cyNTT0FQUmVmZXJlbmNlVG9BdHRhY2hlbWVudHMpCi0gICAgICogLCBvciB2aWEgYSBzaW5nbGUgVGV4dCBjaGlsZCBub2RlIGNvbnRhaW5pbmcgYSBVUkkgYXMgZGVzY3JpYmVkIGluIHRoZSBXUy1JIEF0dGFjaG1lbnRzCi0gICAgICogUHJvZmlsZSAxLjAgZm9yIGVsZW1lbnRzIG9mIHNjaGVtYSB0eXBlIHJlZjpzd2FSZWYocmVmOnN3YVJlZiAoaHR0cDovL3d3dy53c2kub3JnL1Byb2ZpbGVzL0F0dGFjaG1lbnRzUHJvZmlsZS0xLjAtMjAwNC0wOC0yNC5odG1sIikKLSAgICAgKiApLiBUaGVzZSB0d28gbWVjaGFuaXNtcyBtdXN0IGJlIHN1cHBvcnRlZC4gVGhlIHN1cHBvcnQgZm9yIHJlZmVyZW5jZXMgdmlhIGhyZWYgYXR0cmlidXRlIGFsc28KLSAgICAgKiBpbXBsaWVzIHRoYXQgdGhpcyBtZXRob2Qgc2hvdWxkIGFsc28gYmUgc3VwcG9ydGVkIG9uIGFuIGVsZW1lbnQgdGhhdCBpcyBhbiB4b3A6SW5jbHVkZQotICAgICAqIGVsZW1lbnQgKFhPUCAoaHR0cDovL3d3dy53My5vcmcvMjAwMC94cC9Hcm91cC8zLzA2L0F0dGFjaG1lbnRzL1hPUC5odG1sKSApLiBvdGhlciByZWZlcmVuY2UKLSAgICAgKiBtZWNoYW5pc21zIG1heSBiZSBzdXBwb3J0ZWQgYnkgaW5kaXZpZHVhbCBpbXBsZW1lbnRhdGlvbnMgb2YgdGhpcyBzdGFuZGFyZC4gQ29udGFjdCB5b3VyCi0gICAgICogdmVuZG9yIGZvciBkZXRhaWxzLgotICAgICAqCi0gICAgICogQHBhcmFtIGVsZW1lbnQgLSBUaGUgU09BUEVsZW1lbnQgY29udGFpbmluZyB0aGUgcmVmZXJlbmNlIHRvIGFuIEF0dGFjaG1lbnQKLSAgICAgKiBAcmV0dXJuIHRoZSByZWZlcmVuY2VkIEF0dGFjaG1lbnRQYXJ0IG9yIG51bGwgaWYgbm8gc3VjaCBBdHRhY2htZW50UGFydCBleGlzdHMgb3Igbm8KLSAgICAgKiAgICAgICAgIHJlZmVyZW5jZSBjYW4gYmUgZm91bmQgaW4gdGhpcyBTT0FQRWxlbWVudC4KLSAgICAgKiBAdGhyb3dzIFNPQVBFeGNlcHRpb24gLSBpZiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgYXR0ZW1wdCB0byBhY2Nlc3MgdGhlIGF0dGFjaG1lbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgQXR0YWNobWVudFBhcnQgZ2V0QXR0YWNobWVudChTT0FQRWxlbWVudCBzb2FwZWxlbWVudCkgdGhyb3dzIFNPQVBFeGNlcHRpb24gewotICAgICAgICAvL1RPRE8gcmVhZCBzdHJpbmdzIGZyb20gY29uc3RhbnRzCi0gICAgICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gZ2V0QXR0YWNobWVudHMoKTsKLSAgICAgICAgewotICAgICAgICAgICAgQXR0YWNobWVudFBhcnRJbXBsIGF0dGFjaG1lbnRQYXJ0OwotICAgICAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRQYXJ0ID0gKEF0dGFjaG1lbnRQYXJ0SW1wbClpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nW10gY29udGVudElkcyA9IGF0dGFjaG1lbnRQYXJ0LmdldE1pbWVIZWFkZXIoIkNvbnRlbnQtSWQiKTsKLQotICAgICAgICAgICAgICAgIC8vUmVmZXJlbmNlcyBjYW4gYmUgbWFkZSB2aWEgYW4gaHJlZiBhdHRyaWJ1dGUgYXMgZGVzY3JpYmVkIGluIFNPQVAgTWVzc2FnZXMKLSAgICAgICAgICAgICAgICAvL3dpdGggQXR0YWNobWVudHMgb3IgdmlhIGEgc2luZ2xlIFRleHQgY2hpbGQgbm9kZSBjb250YWluaW5nIGEgVVJJCi0gICAgICAgICAgICAgICAgU3RyaW5nIHJlZmVyZW5jZSA9IHNvYXBlbGVtZW50LmdldEF0dHJpYnV0ZSgiaHJlZiIpOwotICAgICAgICAgICAgICAgIGlmIChyZWZlcmVuY2UgPT0gbnVsbCB8fCByZWZlcmVuY2UudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlID0gc29hcGVsZW1lbnQuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlZmVyZW5jZSA9PSBudWxsIHx8IHJlZmVyZW5jZS50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBhID0gMDsgYSA8IGNvbnRlbnRJZHMubGVuZ3RoOyBhKyspIHsKLSAgICAgICAgICAgICAgICAgICAgLy9lZzogY2lkOmdpZkltYWdlIHNjZW5hcmlvCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBpZFBhcnQgPSByZWZlcmVuY2Uuc3Vic3RyaW5nKHJlZmVyZW5jZS5pbmRleE9mKCI6IikgKyAxKTsKLSAgICAgICAgICAgICAgICAgICAgaWRQYXJ0ID0gIjwiICsgaWRQYXJ0ICsgIj4iOwotICAgICAgICAgICAgICAgICAgICBpZiAoaWRQYXJ0LmVxdWFscyhjb250ZW50SWRzW2FdKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF0dGFjaG1lbnRQYXJ0OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgU3RyaW5nW10gY29udGVudExvY2F0aW9ucyA9IGF0dGFjaG1lbnRQYXJ0LmdldE1pbWVIZWFkZXIoIkNvbnRlbnQtTG9jYXRpb24iKTsKLSAgICAgICAgICAgICAgICBpZiAoIShjb250ZW50TG9jYXRpb25zID09IG51bGwpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vdXJpIHNjZW5hcmlvCi0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGIgPSAwOyBiIDwgY29udGVudExvY2F0aW9ucy5sZW5ndGg7IGIrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlZmVyZW5jZS5lcXVhbHMoY29udGVudExvY2F0aW9uc1tiXSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXR0YWNobWVudFBhcnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyBhbGwgdGhlIEF0dGFjaG1lbnRQYXJ0IG9iamVjdHMgdGhhdCBoYXZlIGhlYWRlciBlbnRyaWVzIHRoYXQgbWF0Y2ggdGhlIHNwZWNpZmllZAotICAgICAqIGhlYWRlcnMuIE5vdGUgdGhhdCB0aGUgcmVtb3ZlZCBhdHRhY2htZW50IGNvdWxkIGhhdmUgaGVhZGVycyBpbiBhZGRpdGlvbiB0byB0aG9zZSBzcGVjaWZpZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaGVhZGVycyAtIGEgTWltZUhlYWRlcnMgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIE1JTUUgaGVhZGVycyBmb3Igd2hpY2ggdG8gc2VhcmNoCi0gICAgICogQHNpbmNlIFNBQUogMS4zCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlQXR0YWNobWVudHMoTWltZUhlYWRlcnMgaGVhZGVycykgewotICAgICAgICBDb2xsZWN0aW9uIG5ld0F0dGFjaG1lbnRQYXJ0cyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgSXRlcmF0b3IgYXR0YWNobWVudFBhcnRzSXRyID0gYXR0YWNobWVudFBhcnRzLml0ZXJhdG9yKCk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGF0dGFjaG1lbnRQYXJ0c0l0cjsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBBdHRhY2htZW50UGFydCBhdHRhY2htZW50UGFydCA9IChBdHRhY2htZW50UGFydClpdGVyLm5leHQoKTsKLQotICAgICAgICAgICAgLy9HZXQgYWxsIHRoZSBoZWFkZXJzCi0gICAgICAgICAgICBJdGVyYXRvciBhbGxNSU1FSGVhZGVycyA9IGhlYWRlcnMuZ2V0QWxsSGVhZGVycygpOwotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGFsbE1JTUVIZWFkZXJzOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgTWltZUhlYWRlciBtaW1lSGVhZGVyID0gKE1pbWVIZWFkZXIpaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgIFN0cmluZ1tdIGhlYWRlclZhbHVlcyA9IGF0dGFjaG1lbnRQYXJ0LmdldE1pbWVIZWFkZXIobWltZUhlYWRlci5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIC8vaWYgdmFsdWVzIGZvciB0aGlzIGhlYWRlciBuYW1lLCBkbyBub3QgcmVtb3ZlIGl0Ci0gICAgICAgICAgICAgICAgaWYgKGhlYWRlclZhbHVlcy5sZW5ndGggIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoIShoZWFkZXJWYWx1ZXNbMF0uZXF1YWxzKG1pbWVIZWFkZXIuZ2V0VmFsdWUoKSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZXdBdHRhY2htZW50UGFydHMuYWRkKGF0dGFjaG1lbnRQYXJ0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBhdHRhY2htZW50UGFydHMuY2xlYXIoKTsKLSAgICAgICAgdGhpcy5hdHRhY2htZW50UGFydHMgPSBuZXdBdHRhY2htZW50UGFydHM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgU09BUCBIZWFkZXIgY29udGFpbmVkIGluIHRoaXMgPGNvZGU+U09BUE1lc3NhZ2U8L2NvZGU+IG9iamVjdC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIDxjb2RlPlNPQVBIZWFkZXI8L2NvZGU+IG9iamVjdCBjb250YWluZWQgYnkgdGhpcyA8Y29kZT5TT0FQTWVzc2FnZTwvY29kZT4gb2JqZWN0Ci0gICAgICogQHRocm93cyBqYXZheC54bWwuc29hcC5TT0FQRXhjZXB0aW9uIGlmIHRoZSBTT0FQIEhlYWRlciBkb2VzIG5vdCBleGlzdCBvciBjYW5ub3QgYmUKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0cmlldmVkCi0gICAgICovCi0gICAgcHVibGljIFNPQVBIZWFkZXIgZ2V0U09BUEhlYWRlcigpIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuc29hcFBhcnQuZ2V0RW52ZWxvcGUoKS5nZXRIZWFkZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBTT0FQIEJvZHkgY29udGFpbmVkIGluIHRoaXMgPGNvZGU+U09BUE1lc3NhZ2U8L2NvZGU+IG9iamVjdC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIDxjb2RlPlNPQVBCb2R5PC9jb2RlPiBvYmplY3QgY29udGFpbmVkIGJ5IHRoaXMgPGNvZGU+U09BUE1lc3NhZ2U8L2NvZGU+IG9iamVjdAotICAgICAqIEB0aHJvd3MgamF2YXgueG1sLnNvYXAuU09BUEV4Y2VwdGlvbiBpZiB0aGUgU09BUCBCb2R5IGRvZXMgbm90IGV4aXN0IG9yIGNhbm5vdCBiZSByZXRyaWV2ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgU09BUEJvZHkgZ2V0U09BUEJvZHkoKSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiB0aGlzLnNvYXBQYXJ0LmdldEVudmVsb3BlKCkuZ2V0Qm9keSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgY2hhcmFjdGVyIGVuY29kaW5nIGJhc2VkIG9uIHRoZSA8Y29kZT5jb250ZW50VHlwZTwvY29kZT4gcGFyYW1ldGVyCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29udGVudFR5cGUKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2V0Q2hhcnNldEVuY29kaW5nKGZpbmFsIFN0cmluZyBjb250ZW50VHlwZSkgewotICAgICAgICBpZiAoY29udGVudFR5cGUgIT0gbnVsbCkgewotICAgICAgICAgICAgaW50IGRlbGltaXRlckluZGV4ID0gY29udGVudFR5cGUubGFzdEluZGV4T2YoImNoYXJzZXQiKTsKLSAgICAgICAgICAgIGlmIChkZWxpbWl0ZXJJbmRleCA+IDApIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgY2hhcnNldFBhcnQgPSBjb250ZW50VHlwZS5zdWJzdHJpbmcoZGVsaW1pdGVySW5kZXgpOwotICAgICAgICAgICAgICAgIGludCBjaGFyc2V0SW5kZXggPSBjaGFyc2V0UGFydC5pbmRleE9mKCc9Jyk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGNoYXJzZXQgPSBjaGFyc2V0UGFydC5zdWJzdHJpbmcoY2hhcnNldEluZGV4ICsgMSkudHJpbSgpOwotICAgICAgICAgICAgICAgIGlmICgoY2hhcnNldC5zdGFydHNXaXRoKCJcIiIpIHx8IGNoYXJzZXQuc3RhcnRzV2l0aCgiXCciKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgY2hhcnNldCA9IGNoYXJzZXQuc3Vic3RyaW5nKDEsIGNoYXJzZXQubGVuZ3RoKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoKGNoYXJzZXQuZW5kc1dpdGgoIlwiIikgfHwgY2hhcnNldC5lbmRzV2l0aCgiXCciKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgY2hhcnNldCA9IGNoYXJzZXQuc3Vic3RyaW5nKDAsIGNoYXJzZXQubGVuZ3RoKCkgLSAxKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaW50IGluZGV4ID0gY2hhcnNldC5pbmRleE9mKCc7Jyk7Ci0gICAgICAgICAgICAgICAgaWYgKGluZGV4ICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNoYXJzZXQgPSBjaGFyc2V0LnN1YnN0cmluZygwLCBpbmRleCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNldFByb3BlcnR5KFNPQVBNZXNzYWdlLkNIQVJBQ1RFUl9TRVRfRU5DT0RJTkcsIGNoYXJzZXQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2Fhai9zcmMvb3JnL2FwYWNoZS9heGlzMi9zYWFqL1NPQVBQYXJ0SW1wbC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvc2Fhai9zcmMvb3JnL2FwYWNoZS9heGlzMi9zYWFqL1NPQVBQYXJ0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OGY3NjkxLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhYWovc3JjL29yZy9hcGFjaGUvYXhpczIvc2Fhai9TT0FQUGFydEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNDIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNhYWo7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLmF0dGFjaG1lbnRzLkF0dGFjaG1lbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5NVE9NQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5TdEFYVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVAxMUNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUDEyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuaW1wbC5idWlsZGVyLk1UT01TdEFYU09BUE1vZGVsQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuaW1wbC5idWlsZGVyLlN0QVhTT0FQTW9kZWxCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5pbXBsLmRvbS5zb2FwMTEuU09BUDExRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuaW1wbC5kb20uc29hcDEyLlNPQVAxMkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5idWlsZGVyLkJ1aWxkZXJVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuc2Fhai51dGlsLklER2VuZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuSFRUUENvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkNEQVRBU2VjdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Db21tZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUltcGxlbWVudGF0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50RnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRUeXBlOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRW50aXR5UmVmZXJlbmNlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotaW1wb3J0IG9yZy53M2MuZG9tLlByb2Nlc3NpbmdJbnN0cnVjdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotaW1wb3J0IG9yZy53M2MuZG9tLlVzZXJEYXRhSGFuZGxlcjsKLQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLk1pbWVIZWFkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuTWltZUhlYWRlcnM7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEVudmVsb3BlOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUE1lc3NhZ2U7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUFBhcnQ7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxJbnB1dEZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5SZXN1bHQ7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLmRvbS5ET01Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVNvdXJjZTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBTT0FQUGFydEltcGwgZXh0ZW5kcyBTT0FQUGFydCB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coU09BUFBhcnRJbXBsLmNsYXNzKTsKLQotICAgIHByaXZhdGUgRG9jdW1lbnQgZG9jdW1lbnQ7Ci0gICAgcHJpdmF0ZSBTT0FQTWVzc2FnZSBzb2FwTWVzc2FnZTsKLSAgICBwcml2YXRlIFNPQVBFbnZlbG9wZUltcGwgZW52ZWxvcGU7Ci0gICAgcHJpdmF0ZSBNaW1lSGVhZGVyc0V4IG1pbWVIZWFkZXJzID0gbmV3IE1pbWVIZWFkZXJzRXgoKTsKLQotICAgIHByaXZhdGUgU291cmNlIHNvdXJjZTsKLQotICAgIHB1YmxpYyBTT0FQUGFydEltcGwoU09BUE1lc3NhZ2VJbXBsIHBhcmVudFNvYXBNc2csCi0gICAgICAgICAgICAgICAgICAgICAgICBTT0FQRW52ZWxvcGVJbXBsIHNvYXBFbnZlbG9wZSkgewotICAgICAgICAvL3NldE1pbWVIZWFkZXIoSFRUUENvbnN0YW50cy5IRUFERVJfQ09OVEVOVF9JRCwgSURHZW5lcmF0b3IuZ2VuZXJhdGVJRCgpKTsKLSAgICAgICAgLy9zZXRNaW1lSGVhZGVyKEhUVFBDb25zdGFudHMuSEVBREVSX0NPTlRFTlRfVFlQRSwgInRleHQveG1sIik7Ci0gICAgICAgIHRoaXMubWltZUhlYWRlcnMgPSAoTWltZUhlYWRlcnNFeClwYXJlbnRTb2FwTXNnLmdldE1pbWVIZWFkZXJzKCk7Ci0gICAgICAgIHNvYXBNZXNzYWdlID0gcGFyZW50U29hcE1zZzsKLSAgICAgICAgZW52ZWxvcGUgPSBzb2FwRW52ZWxvcGU7Ci0gICAgICAgIGRvY3VtZW50ID0gc29hcEVudmVsb3BlLmdldE93bmVyRG9jdW1lbnQoKTsKLSAgICAgICAgZW52ZWxvcGUuc2V0U09BUFBhcnRQYXJlbnQodGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIFNPQVBQYXJ0SW1wbChTT0FQTWVzc2FnZUltcGwgcGFyZW50U29hcE1zZywKLSAgICAgICAgICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBqYXZheC54bWwuc29hcC5NaW1lSGVhZGVycyBtaW1lSGVhZGVycwotICAgICkgdGhyb3dzIFNPQVBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgY29udGVudFR5cGUgPSAiIjsKLSAgICAgICAgU3RyaW5nIGZ1bGxDb250ZW50VHlwZVN0ciA9ICIiOwotICAgICAgICBpZiAobWltZUhlYWRlcnMgPT0gbnVsbCkgewotICAgICAgICAgICAgLy9UT0RPIDogcmVhZCBzdHJpbmcgZnJvbSBjb25zdGFudHMKLSAgICAgICAgICAgIG1pbWVIZWFkZXJzID0gbmV3IE1pbWVIZWFkZXJzKCk7Ci0gICAgICAgICAgICBtaW1lSGVhZGVycy5hZGRIZWFkZXIoIkNvbnRlbnQtSUQiLCBJREdlbmVyYXRvci5nZW5lcmF0ZUlEKCkpOwotICAgICAgICAgICAgbWltZUhlYWRlcnMuYWRkSGVhZGVyKCJjb250ZW50LXR5cGUiLCBIVFRQQ29uc3RhbnRzLk1FRElBX1RZUEVfQVBQTElDQVRJT05fU09BUF9YTUwpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgU3RyaW5nIGNvbnRlbnRUeXBlc1tdID0gbWltZUhlYWRlcnMuZ2V0SGVhZGVyKEhUVFBDb25zdGFudHMuQ09OVEVOVF9UWVBFKTsKLSAgICAgICAgICAgIGlmIChjb250ZW50VHlwZXMgIT0gbnVsbCAmJiBjb250ZW50VHlwZXMubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgICAgIGZ1bGxDb250ZW50VHlwZVN0ciA9IGNvbnRlbnRUeXBlc1swXTsKLSAgICAgICAgICAgICAgICBjb250ZW50VHlwZSA9IGV4dHJhY3RGaXJzdFBhcnQoZnVsbENvbnRlbnRUeXBlU3RyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEl0ZXJhdG9yIG1pbWVIZWFkZXJJdGVyYXRvciA9IG1pbWVIZWFkZXJzLmdldEFsbEhlYWRlcnMoKTsKLSAgICAgICAgd2hpbGUgKG1pbWVIZWFkZXJJdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIE1pbWVIZWFkZXIgbWltZUhlYWRlciA9IChNaW1lSGVhZGVyKW1pbWVIZWFkZXJJdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBtaW1lSGVhZGVyLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICBzZXRNaW1lSGVhZGVyKG1pbWVIZWFkZXIuZ2V0TmFtZSgpLCB2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgc29hcE1lc3NhZ2UgPSBwYXJlbnRTb2FwTXNnOwotCi0gICAgICAgIFN0cmluZyBrbm93bkVuY29kaW5nID0gKFN0cmluZykgc29hcE1lc3NhZ2UuZ2V0UHJvcGVydHkoU09BUE1lc3NhZ2UuQ0hBUkFDVEVSX1NFVF9FTkNPRElORyk7Ci0gICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPSBudWxsOwotICAgICAgCi0gICAgICAgIAotICAgICAgICBJbnB1dFN0cmVhbSBtb2RpZmllZElucHV0U3RyZWFtID0gbnVsbDsKLSAgICAgICAgU3RBWFNPQVBNb2RlbEJ1aWxkZXIgYnVpbGRlciA9IG51bGw7Ci0gICAgICAgIElucHV0U3RyZWFtUmVhZGVyIGlzUmVhZGVyID0gbnVsbDsKLQotICAgICAgICBpZiAoY29udGVudFR5cGUuaW5kZXhPZigibXVsdGlwYXJ0L3JlbGF0ZWQiKSA9PSAwKSB7Ci0gICAgICAgICAgICAvL1RoaXMgY29udGFpbnMgYXR0YWNoZW1lbnRzCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIEF0dGFjaG1lbnRzIGF0dGFjaG1lbnRzID0KLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBdHRhY2htZW50cyhpbnB1dFN0cmVhbSwgZnVsbENvbnRlbnRUeXBlU3RyLCBmYWxzZSwgIiIsICIiKTsKLSAgICAgICAgICAgICAgICBtb2RpZmllZElucHV0U3RyZWFtID0gYXR0YWNobWVudHMuZ2V0U09BUFBhcnRJbnB1dFN0cmVhbSgpOwotICAgICAgICAgICAgICAgCWlzUmVhZGVyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKG1vZGlmaWVkSW5wdXRTdHJlYW0pOwotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICBTdHJpbmcgc29hcEVudmVsb3BlTmFtZXNwYWNlVVJJID0KLSAgICAgICAgICAgICAgICAgICAgICAgIEJ1aWxkZXJVdGlsLmdldEVudmVsb3BlTmFtZXNwYWNlKGZ1bGxDb250ZW50VHlwZVN0cik7Ci0KLSAgICAgICAgICAgICAgICBTdHJpbmcgY2hhclNldEVuY29kaW5nID0KLSAgICAgICAgICAgICAgICAgICAgICAgIEJ1aWxkZXJVdGlsLmdldENoYXJTZXRFbmNvZGluZyhhdHRhY2htZW50cy5nZXRTT0FQUGFydENvbnRlbnRUeXBlKCkpOwotCi0gICAgICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHN0cmVhbVJlYWRlciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKEJ1aWxkZXJVdGlsLmdldFJlYWRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0YWNobWVudHMuZ2V0U09BUFBhcnRJbnB1dFN0cmVhbSgpLCBjaGFyU2V0RW5jb2RpbmcpKTsKLQotICAgICAgICAgICAgICAgIFNPQVBGYWN0b3J5IGZhY3Rvcnk7Ci0gICAgICAgICAgICAgICAgaWYgKFNPQVAxMUNvbnN0YW50cy5TT0FQX0VOVkVMT1BFX05BTUVTUEFDRV9VUkkuZXF1YWxzKHNvYXBFbnZlbG9wZU5hbWVzcGFjZVVSSSkpIHsKLSAgICAgICAgICAgICAgICAgICAgZmFjdG9yeSA9IG5ldyBTT0FQMTFGYWN0b3J5KCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZmFjdG9yeSA9IG5ldyBTT0FQMTJGYWN0b3J5KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChhdHRhY2htZW50cy5nZXRBdHRhY2htZW50U3BlY1R5cGUoKS5lcXVhbHMoCi0gICAgICAgICAgICAgICAgICAgICAgICBNVE9NQ29uc3RhbnRzLk1UT01fVFlQRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy9DcmVhdGVzIHRoZSBNVE9NIHNwZWNpZmljIE1UT01TdEFYU09BUE1vZGVsQnVpbGRlcgotICAgICAgICAgICAgICAgICAgICBidWlsZGVyID0gbmV3IE1UT01TdEFYU09BUE1vZGVsQnVpbGRlcihzdHJlYW1SZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2FwRW52ZWxvcGVOYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYXR0YWNobWVudHMuZ2V0QXR0YWNobWVudFNwZWNUeXBlKCkuZXF1YWxzKAotICAgICAgICAgICAgICAgICAgICAgICAgTVRPTUNvbnN0YW50cy5TV0FfVFlQRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlciA9IG5ldyBTdEFYU09BUE1vZGVsQnVpbGRlcihzdHJlYW1SZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2FwRW52ZWxvcGVOYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYXR0YWNobWVudHMuZ2V0QXR0YWNobWVudFNwZWNUeXBlKCkuZXF1YWxzKAotICAgICAgICAgICAgICAgICAgICAgICAgTVRPTUNvbnN0YW50cy5TV0FfVFlQRV8xMikpIHsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlciA9IG5ldyBTdEFYU09BUE1vZGVsQnVpbGRlcihzdHJlYW1SZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2FwRW52ZWxvcGVOYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU09BUEV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1vZGlmaWVkSW5wdXRTdHJlYW0gPSBpbnB1dFN0cmVhbTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaXNSZWFkZXIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIobW9kaWZpZWRJbnB1dFN0cmVhbSk7Ci0gICAgICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHN0cmVhbVJlYWRlciA9IG51bGw7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYoa25vd25FbmNvZGluZyAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICAJc3RyZWFtUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihtb2RpZmllZElucHV0U3RyZWFtLCBrbm93bkVuY29kaW5nKTsKLSAgICAgICAgICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgICAgICAJc3RyZWFtUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihtb2RpZmllZElucHV0U3RyZWFtKTsgICAgICAgICAgICAgICAgCQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChIVFRQQ29uc3RhbnRzLk1FRElBX1RZUEVfVEVYVF9YTUwuZXF1YWxzKGNvbnRlbnRUeXBlKSkgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyID0gbmV3IFN0QVhTT0FQTW9kZWxCdWlsZGVyKHN0cmVhbVJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU09BUDExRmFjdG9yeSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPQVAxMUNvbnN0YW50cy5TT0FQX0VOVkVMT1BFX05BTUVTUEFDRV9VUkkpOwotCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChIVFRQQ29uc3RhbnRzLk1FRElBX1RZUEVfQVBQTElDQVRJT05fU09BUF9YTUwuZXF1YWxzKGNvbnRlbnRUeXBlKSkgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyID0gbmV3IFN0QVhTT0FQTW9kZWxCdWlsZGVyKHN0cmVhbVJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU09BUDEyRmFjdG9yeSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPQVAxMkNvbnN0YW50cy5TT0FQX0VOVkVMT1BFX05BTUVTUEFDRV9VUkkpOwotCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChIVFRQQ29uc3RhbnRzLk1FRElBX1RZUEVfTVVMVElQQVJUX1JFTEFURUQuZXF1YWxzKGNvbnRlbnRUeXBlKSkgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyID0gbmV3IFN0QVhTT0FQTW9kZWxCdWlsZGVyKHN0cmVhbVJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU09BUDExRmFjdG9yeSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSBuZXcgU3RBWFNPQVBNb2RlbEJ1aWxkZXIoc3RyZWFtUmVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTT0FQMTFGYWN0b3J5KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU09BUEV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZSBzb2FwRW52ZWxvcGUgPSBidWlsZGVyLmdldFNPQVBFbnZlbG9wZSgpOwotICAgICAgICAgICAgZW52ZWxvcGUgPSBuZXcgU09BUEVudmVsb3BlSW1wbCgKLSAgICAgICAgICAgICAgICAgICAgKG9yZy5hcGFjaGUuYXhpb20uc29hcC5pbXBsLmRvbS5TT0FQRW52ZWxvcGVJbXBsKXNvYXBFbnZlbG9wZSk7Ci0gICAgICAgICAgICBlbnZlbG9wZS5lbGVtZW50LmJ1aWxkKCk7Ci0gICAgICAgICAgICB0aGlzLmRvY3VtZW50ID0gZW52ZWxvcGUuZ2V0T3duZXJEb2N1bWVudCgpOwotICAgICAgICAgICAgZW52ZWxvcGUuc2V0U09BUFBhcnRQYXJlbnQodGhpcyk7Ci0gICAgICAgICAgICBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZSB4bWxTb3VyY2UgPQotICAgICAgICAgICAgICAgICAgICBuZXcgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtU291cmNlKCBpc1JlYWRlcik7Ci0gICAgICAgICAgICB0aGlzLnNvdXJjZSA9IHhtbFNvdXJjZTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTT0FQRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZXh0cmFjdEZpcnN0UGFydChTdHJpbmcgZnVsbENvbnRlbnRUeXBlU3RyKSB7Ci0gICAgICAgIFN0cmluZyBjb250ZW50VHlwZTsvL3RtcENvbnRlbnRUeXBlIGNhbiBiZSBsaWtlICdhcHBsaWNhdGlvbi9zb2FwK3htbDsgY2hhcnNldD1VVEYtODsnCi0gICAgICAgIC8vT25seSB0aGUgZmlyc3QgcGFydCBpcyBpbXBvcnRhbnQKLSAgICAgICAgaWYgKGZ1bGxDb250ZW50VHlwZVN0ci5pbmRleE9mKCI7IikgPiAtMSkgewotICAgICAgICAgICAgY29udGVudFR5cGUgPSBmdWxsQ29udGVudFR5cGVTdHIuc3Vic3RyaW5nKDAsIGZ1bGxDb250ZW50VHlwZVN0ci5pbmRleE9mKCI7IikpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY29udGVudFR5cGUgPSBmdWxsQ29udGVudFR5cGVTdHI7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNvbnRlbnRUeXBlOwotICAgIH0KLQotCi0gICAgcHVibGljIFNPQVBQYXJ0SW1wbChTT0FQTWVzc2FnZUltcGwgcGFyZW50U29hcE1zZywKLSAgICAgICAgICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMocGFyZW50U29hcE1zZywgaW5wdXRTdHJlYW0sIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE9idGFpbiB0aGUgU09BUE1lc3NhZ2UKLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHJlbGF0ZWQgU09BUE1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgU09BUE1lc3NhZ2UgZ2V0U29hcE1lc3NhZ2UoKSB7Ci0gICAgICAgIHJldHVybiBzb2FwTWVzc2FnZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSA8Q09ERT5TT0FQRW52ZWxvcGU8L0NPREU+IG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcyA8Q09ERT5TT0FQUGFydDwvQ09ERT4gb2JqZWN0LgotICAgICAqIE9uY2UgdGhlIFNPQVAgZW52ZWxvcGUgaXMgb2J0YWluZWQsIGl0IGNhbiBiZSB1c2VkIHRvIGdldCBpdHMgY29udGVudHMuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSA8Q09ERT5TT0FQRW52ZWxvcGU8L0NPREU+IG9iamVjdCBmb3IgdGhpcyA8Q09ERT4gU09BUFBhcnQ8L0NPREU+IG9iamVjdAotICAgICAqIEB0aHJvd3MgU09BUEV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIFNPQVAgZXJyb3IKLSAgICAgKi8KLSAgICBwdWJsaWMgU09BUEVudmVsb3BlIGdldEVudmVsb3BlKCkgdGhyb3dzIFNPQVBFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZW52ZWxvcGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyBhbGwgTUlNRSBoZWFkZXJzIHRoYXQgbWF0Y2ggdGhlIGdpdmVuIG5hbWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaGVhZGVyIGEgPENPREU+U3RyaW5nPC9DT0RFPiBnaXZpbmcgdGhlIG5hbWUgb2YgdGhlIE1JTUUgaGVhZGVyKHMpIHRvIGJlIHJlbW92ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVNaW1lSGVhZGVyKFN0cmluZyBoZWFkZXIpIHsKLSAgICAgICAgbWltZUhlYWRlcnMucmVtb3ZlSGVhZGVyKGhlYWRlcik7Ci0gICAgfQotCi0gICAgLyoqIFJlbW92ZXMgYWxsIHRoZSA8Q09ERT5NaW1lSGVhZGVyPC9DT0RFPiBvYmplY3RzIGZvciB0aGlzIDxDT0RFPlNPQVBFbnZlbG9wZTwvQ09ERT4gb2JqZWN0LiAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZUFsbE1pbWVIZWFkZXJzKCkgewotICAgICAgICBtaW1lSGVhZGVycy5yZW1vdmVBbGxIZWFkZXJzKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhbGwgdGhlIHZhbHVlcyBvZiB0aGUgPENPREU+TWltZUhlYWRlcjwvQ09ERT4gb2JqZWN0IGluIHRoaXMgPENPREU+U09BUFBhcnQ8L0NPREU+Ci0gICAgICogb2JqZWN0IHRoYXQgaXMgaWRlbnRpZmllZCBieSB0aGUgZ2l2ZW4gPENPREU+U3RyaW5nPC9DT0RFPi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBoZWFkZXI7IGV4YW1wbGU6ICJDb250ZW50LVR5cGUiCi0gICAgICogQHJldHVybiBhIDxDT0RFPlN0cmluZzwvQ09ERT4gYXJyYXkgZ2l2aW5nIGFsbCB0aGUgdmFsdWVzIGZvciB0aGUgc3BlY2lmaWVkIGhlYWRlcgotICAgICAqIEBzZWUgI3NldE1pbWVIZWFkZXIoU3RyaW5nLCBTdHJpbmcpIHNldE1pbWVIZWFkZXIoamF2YS5sYW5nLlN0cmluZywKLSAgICAgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZ1tdIGdldE1pbWVIZWFkZXIoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgcmV0dXJuIG1pbWVIZWFkZXJzLmdldEhlYWRlcihuYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGFuZ2VzIHRoZSBmaXJzdCBoZWFkZXIgZW50cnkgdGhhdCBtYXRjaGVzIHRoZSBnaXZlbiBoZWFkZXIgbmFtZSBzbyB0aGF0IGl0cyB2YWx1ZSBpcyB0aGUKLSAgICAgKiBnaXZlbiB2YWx1ZSwgYWRkaW5nIGEgbmV3IGhlYWRlciB3aXRoIHRoZSBnaXZlbiBuYW1lIGFuZCB2YWx1ZSBpZiBubyBleGlzdGluZyBoZWFkZXIgaXMgYQotICAgICAqIG1hdGNoLiBJZiB0aGVyZSBpcyBhIG1hdGNoLCB0aGlzIG1ldGhvZCBjbGVhcnMgYWxsIGV4aXN0aW5nIHZhbHVlcyBmb3IgdGhlIGZpcnN0IGhlYWRlciB0aGF0Ci0gICAgICogbWF0Y2hlcyBhbmQgc2V0cyB0aGUgZ2l2ZW4gdmFsdWUgaW5zdGVhZC4gSWYgbW9yZSB0aGFuIG9uZSBoZWFkZXIgaGFzIHRoZSBnaXZlbiBuYW1lLCB0aGlzCi0gICAgICogbWV0aG9kIHJlbW92ZXMgYWxsIG9mIHRoZSBtYXRjaGluZyBoZWFkZXJzIGFmdGVyIHRoZSBmaXJzdCBvbmUuCi0gICAgICogPHAvPgotICAgICAqIDxQPk5vdGUgdGhhdCBSRkM4MjIgaGVhZGVycyBjYW4gY29udGFpbiBvbmx5IFVTLUFTQ0lJIGNoYXJhY3RlcnMuPC9QPgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgIGEgPENPREU+U3RyaW5nPC9DT0RFPiBnaXZpbmcgdGhlIGhlYWRlciBuYW1lIGZvciB3aGljaCB0byBzZWFyY2gKLSAgICAgKiBAcGFyYW0gdmFsdWUgYSA8Q09ERT5TdHJpbmc8L0NPREU+IGdpdmluZyB0aGUgdmFsdWUgdG8gYmUgc2V0LiBUaGlzIHZhbHVlIHdpbGwgYmUgc3Vic3RpdHV0ZWQKLSAgICAgKiAgICAgICAgICAgICAgZm9yIHRoZSBjdXJyZW50IHZhbHVlKHMpIG9mIHRoZSBmaXJzdCBoZWFkZXIgdGhhdCBpcyBhIG1hdGNoIGlmIHRoZXJlIGlzIG9uZS4gSWYKLSAgICAgKiAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gbWF0Y2gsIHRoaXMgdmFsdWUgd2lsbCBiZSB0aGUgdmFsdWUgZm9yIGEgbmV3Ci0gICAgICogICAgICAgICAgICAgIDxDT0RFPk1pbWVIZWFkZXI8L0NPREU+IG9iamVjdC4KLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgIGlmIHRoZXJlIHdhcyBhIHByb2JsZW0gd2l0aCB0aGUgc3BlY2lmaWVkIG1pbWUgaGVhZGVyIG5hbWUgb3IgdmFsdWUKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgIGlmIHRoZXJlIHdhcyBhIHByb2JsZW0gd2l0aCB0aGUgc3BlY2lmaWVkIG1pbWUgaGVhZGVyIG5hbWUgb3IgdmFsdWUKLSAgICAgKiBAc2VlICNnZXRNaW1lSGVhZGVyKFN0cmluZykgZ2V0TWltZUhlYWRlcihqYXZhLmxhbmcuU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE1pbWVIZWFkZXIoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgewotICAgICAgICBtaW1lSGVhZGVycy5zZXRIZWFkZXIobmFtZSwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSA8Q09ERT5NaW1lSGVhZGVyPC9DT0RFPiBvYmplY3Qgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgYW5kIHZhbHVlIGFuZCBhZGRzIGl0IHRvCi0gICAgICogdGhpcyA8Q09ERT5TT0FQUGFydDwvQ09ERT4gb2JqZWN0LiBJZiBhIDxDT0RFPk1pbWVIZWFkZXI8L0NPREU+IHdpdGggdGhlIHNwZWNpZmllZCBuYW1lCi0gICAgICogYWxyZWFkeSBleGlzdHMsIHRoaXMgbWV0aG9kIGFkZHMgdGhlIHNwZWNpZmllZCB2YWx1ZSB0byB0aGUgYWxyZWFkeSBleGlzdGluZyB2YWx1ZShzKS4KLSAgICAgKiA8cC8+Ci0gICAgICogPFA+Tm90ZSB0aGF0IFJGQzgyMiBoZWFkZXJzIGNhbiBjb250YWluIG9ubHkgVVMtQVNDSUkgY2hhcmFjdGVycy48L1A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gaGVhZGVyIGEgPENPREU+U3RyaW5nPC9DT0RFPiBnaXZpbmcgdGhlIGhlYWRlciBuYW1lCi0gICAgICogQHBhcmFtIHZhbHVlICBhIDxDT0RFPlN0cmluZzwvQ09ERT4gZ2l2aW5nIHRoZSB2YWx1ZSB0byBiZSBzZXQgb3IgYWRkZWQKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGVyZSB3YXMgYSBwcm9ibGVtIHdpdGggdGhlIHNwZWNpZmllZCBtaW1lIGhlYWRlciBuYW1lCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgdmFsdWUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRNaW1lSGVhZGVyKFN0cmluZyBoZWFkZXIsIFN0cmluZyB2YWx1ZSkgewotICAgICAgICBtaW1lSGVhZGVycy5hZGRIZWFkZXIoaGVhZGVyLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0cmlldmVzIGFsbCB0aGUgaGVhZGVycyBmb3IgdGhpcyA8Q09ERT5TT0FQUGFydDwvQ09ERT4gb2JqZWN0IGFzIGFuIGl0ZXJhdG9yIG92ZXIgdGhlCi0gICAgICogPENPREU+TWltZUhlYWRlcjwvQ09ERT4gb2JqZWN0cy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYW4gPENPREU+SXRlcmF0b3I8L0NPREU+IG9iamVjdCB3aXRoIGFsbCBvZiB0aGUgTWltZSBoZWFkZXJzIGZvciB0aGlzCi0gICAgICogICAgICAgICA8Q09ERT5TT0FQUGFydDwvQ09ERT4gb2JqZWN0Ci0gICAgICovCi0gICAgcHVibGljIEl0ZXJhdG9yIGdldEFsbE1pbWVIZWFkZXJzKCkgewotICAgICAgICByZXR1cm4gbWltZUhlYWRlcnMuZ2V0QWxsSGVhZGVycygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHJpZXZlcyBhbGwgPENPREU+TWltZUhlYWRlcjwvQ09ERT4gb2JqZWN0cyB0aGF0IG1hdGNoIGEgbmFtZSBpbiB0aGUgZ2l2ZW4gYXJyYXkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZXMgYSA8Q09ERT5TdHJpbmc8L0NPREU+IGFycmF5IHdpdGggdGhlIG5hbWUocykgb2YgdGhlIE1JTUUgaGVhZGVycyB0byBiZSByZXR1cm5lZAotICAgICAqIEByZXR1cm4gYWxsIG9mIHRoZSBNSU1FIGhlYWRlcnMgdGhhdCBtYXRjaCBvbmUgb2YgdGhlIG5hbWVzIGluIHRoZSBnaXZlbiBhcnJheSwgcmV0dXJuZWQgYXMKLSAgICAgKiAgICAgICAgIGFuIDxDT0RFPkl0ZXJhdG9yPC9DT0RFPiBvYmplY3QKLSAgICAgKi8KLSAgICBwdWJsaWMgSXRlcmF0b3IgZ2V0TWF0Y2hpbmdNaW1lSGVhZGVycyhTdHJpbmdbXSBuYW1lcykgewotICAgICAgICByZXR1cm4gbWltZUhlYWRlcnMuZ2V0TWF0Y2hpbmdIZWFkZXJzKG5hbWVzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXRyaWV2ZXMgYWxsIDxDT0RFPk1pbWVIZWFkZXI8L0NPREU+IG9iamVjdHMgd2hvc2UgbmFtZSBkb2VzIG5vdCBtYXRjaCBhIG5hbWUgaW4gdGhlIGdpdmVuCi0gICAgICogYXJyYXkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZXMgYSA8Q09ERT5TdHJpbmc8L0NPREU+IGFycmF5IHdpdGggdGhlIG5hbWUocykgb2YgdGhlIE1JTUUgaGVhZGVycyBub3QgdG8gYmUKLSAgICAgKiAgICAgICAgICAgICAgcmV0dXJuZWQKLSAgICAgKiBAcmV0dXJuIGFsbCBvZiB0aGUgTUlNRSBoZWFkZXJzIGluIHRoaXMgPENPREU+U09BUFBhcnQ8L0NPREU+IG9iamVjdCBleGNlcHQgdGhvc2UgdGhhdCBtYXRjaAotICAgICAqICAgICAgICAgb25lIG9mIHRoZSBuYW1lcyBpbiB0aGUgZ2l2ZW4gYXJyYXkuIFRoZSBub25tYXRjaGluZyBNSU1FIGhlYWRlcnMgYXJlIHJldHVybmVkIGFzIGFuCi0gICAgICogICAgICAgICA8Q09ERT5JdGVyYXRvcjwvQ09ERT4gb2JqZWN0LgotICAgICAqLwotICAgIHB1YmxpYyBJdGVyYXRvciBnZXROb25NYXRjaGluZ01pbWVIZWFkZXJzKFN0cmluZ1tdIG5hbWVzKSB7Ci0gICAgICAgIHJldHVybiBtaW1lSGVhZGVycy5nZXROb25NYXRjaGluZ0hlYWRlcnMobmFtZXMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENvbnRlbnQoU291cmNlIHNvdXJjZSkgdGhyb3dzIFNPQVBFeGNlcHRpb24gewotICAgICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCi0gICAgICAgICAgICBYTUxJbnB1dEZhY3RvcnkgaW5wdXRGYWN0b3J5ID0gWE1MSW5wdXRGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyOwotCi0gICAgICAgICAgICBpZiAoc291cmNlIGluc3RhbmNlb2YgU3RyZWFtU291cmNlKSB7Ci0gICAgICAgICAgICAgICAgcmVhZGVyID0gaW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihzb3VyY2UpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBSZXN1bHQgcmVzdWx0ID0gbmV3IFN0cmVhbVJlc3VsdChiYW9zKTsKLSAgICAgICAgICAgICAgICBUcmFuc2Zvcm1lciB4Zm9ybWVyID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3VHJhbnNmb3JtZXIoKTsKLSAgICAgICAgICAgICAgICB4Zm9ybWVyLnRyYW5zZm9ybShzb3VyY2UsIHJlc3VsdCk7Ci0gICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKTsKLSAgICAgICAgICAgICAgICByZWFkZXIgPSBpbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKGlzKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3RBWFNPQVBNb2RlbEJ1aWxkZXIgYnVpbGRlcjEgPSBudWxsOwotICAgICAgICAgICAgaWYgKHRoaXMuZW52ZWxvcGUuZWxlbWVudC5nZXRPTUZhY3RvcnkoKSBpbnN0YW5jZW9mIFNPQVAxMUZhY3RvcnkpIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyMSA9IG5ldyBTdEFYU09BUE1vZGVsQnVpbGRlcihyZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFNPQVAxMUZhY3RvcnkpdGhpcy5lbnZlbG9wZS5lbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0T01GYWN0b3J5KCksIG51bGwpOwotICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmVudmVsb3BlLmVsZW1lbnQuZ2V0T01GYWN0b3J5KCkgaW5zdGFuY2VvZiBTT0FQMTJGYWN0b3J5KSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlcjEgPSBuZXcgU3RBWFNPQVBNb2RlbEJ1aWxkZXIocmVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTT0FQMTJGYWN0b3J5KXRoaXMuZW52ZWxvcGUuZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldE9NRmFjdG9yeSgpLCBudWxsKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZSBzb2FwRW52ZWxvcGUgPSBidWlsZGVyMS5nZXRTT0FQRW52ZWxvcGUoKTsKLSAgICAgICAgICAgIGVudmVsb3BlID0gbmV3IFNPQVBFbnZlbG9wZUltcGwoCi0gICAgICAgICAgICAgICAgICAgIChvcmcuYXBhY2hlLmF4aW9tLnNvYXAuaW1wbC5kb20uU09BUEVudmVsb3BlSW1wbClzb2FwRW52ZWxvcGUpOwotICAgICAgICAgICAgZW52ZWxvcGUuZWxlbWVudC5idWlsZCgpOwotICAgICAgICAgICAgdGhpcy5kb2N1bWVudCA9IGVudmVsb3BlLmdldE93bmVyRG9jdW1lbnQoKTsKLSAgICAgICAgICAgIGVudmVsb3BlLnNldFNPQVBQYXJ0UGFyZW50KHRoaXMpOwotICAgICAgICB9IGNhdGNoIChUcmFuc2Zvcm1lckZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3IgZSkgewotICAgICAgICAgICAgbG9nLmVycm9yKGUpOwotICAgICAgICAgICAgdGhyb3cgbmV3IFNPQVBFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBsb2cuZXJyb3IoZSk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU09BUEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNvbnRlbnQgb2YgdGhlIFNPQVBFbnZlbG9wZSBhcyBhIEpBWFAgPENPREU+IFNvdXJjZTwvQ09ERT4gb2JqZWN0LgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgY29udGVudCBhcyBhIDxDT0RFPiBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTwvQ09ERT4gb2JqZWN0Ci0gICAgICogQHRocm93cyBTT0FQRXhjZXB0aW9uIGlmIHRoZSBpbXBsZW1lbnRhdGlvbiBjYW5ub3QgY29udmVydCB0aGUgc3BlY2lmaWVkIDxDT0RFPlNvdXJjZTwvQ09ERT4KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0Ci0gICAgICogQHNlZSAjc2V0Q29udGVudChqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZSkgc2V0Q29udGVudChqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgU291cmNlIGdldENvbnRlbnQoKSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7Ci0gICAgICAgIERPTVNvdXJjZSBkb21Tb3VyY2UgPSBuZXcgRE9NU291cmNlKHRoaXMuZG9jdW1lbnQpOwotICAgICAgICB0aGlzLnNvdXJjZSA9IGRvbVNvdXJjZTsKLSAgICAgICAgcmV0dXJuIHNvdXJjZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgRG9jdW1lbnQgVHlwZSBEZWNsYXJhdGlvbiAoc2VlIDxjb2RlPkRvY3VtZW50VHlwZTwvY29kZT4pIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGRvY3VtZW50LgotICAgICAqIEZvciBIVE1MIGRvY3VtZW50cyBhcyB3ZWxsIGFzIFhNTCBkb2N1bWVudHMgd2l0aG91dCBhIGRvY3VtZW50IHR5cGUgZGVjbGFyYXRpb24gdGhpcyByZXR1cm5zCi0gICAgICogPGNvZGU+bnVsbDwvY29kZT4uIFRoZSBET00gTGV2ZWwgMiBkb2VzIG5vdCBzdXBwb3J0IGVkaXRpbmcgdGhlIERvY3VtZW50IFR5cGUgRGVjbGFyYXRpb24uCi0gICAgICogPGNvZGU+ZG9jVHlwZTwvY29kZT4gY2Fubm90IGJlIGFsdGVyZWQgaW4gYW55IHdheSwgaW5jbHVkaW5nIHRocm91Z2ggdGhlIHVzZSBvZiBtZXRob2RzCi0gICAgICogaW5oZXJpdGVkIGZyb20gdGhlIDxjb2RlPk5vZGU8L2NvZGU+IGludGVyZmFjZSwgc3VjaCBhcyA8Y29kZT5pbnNlcnROb2RlPC9jb2RlPiBvcgotICAgICAqIDxjb2RlPnJlbW92ZU5vZGU8L2NvZGU+LgotICAgICAqLwotICAgIHB1YmxpYyBEb2N1bWVudFR5cGUgZ2V0RG9jdHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIGRvY3VtZW50LmdldERvY3R5cGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgPGNvZGU+RE9NSW1wbGVtZW50YXRpb248L2NvZGU+IG9iamVjdCB0aGF0IGhhbmRsZXMgdGhpcyBkb2N1bWVudC4gQSBET00gYXBwbGljYXRpb24gbWF5Ci0gICAgICogdXNlIG9iamVjdHMgZnJvbSBtdWx0aXBsZSBpbXBsZW1lbnRhdGlvbnMuCi0gICAgICovCi0gICAgcHVibGljIERPTUltcGxlbWVudGF0aW9uIGdldEltcGxlbWVudGF0aW9uKCkgewotICAgICAgICByZXR1cm4gZG9jdW1lbnQuZ2V0SW1wbGVtZW50YXRpb24oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIGlzIGEgY29udmVuaWVuY2UgYXR0cmlidXRlIHRoYXQgYWxsb3dzIGRpcmVjdCBhY2Nlc3MgdG8gdGhlIGNoaWxkIG5vZGUgdGhhdCBpcyB0aGUgcm9vdAotICAgICAqIGVsZW1lbnQgb2YgdGhlIGRvY3VtZW50LiBGb3IgSFRNTCBkb2N1bWVudHMsIHRoaXMgaXMgdGhlIGVsZW1lbnQgd2l0aCB0aGUgdGFnTmFtZSAiSFRNTCIuCi0gICAgICovCi0gICAgcHVibGljIEVsZW1lbnQgZ2V0RG9jdW1lbnRFbGVtZW50KCkgewotICAgICAgICByZXR1cm4gZG9jdW1lbnQuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBlbGVtZW50IG9mIHRoZSB0eXBlIHNwZWNpZmllZC4gTm90ZSB0aGF0IHRoZSBpbnN0YW5jZSByZXR1cm5lZCBpbXBsZW1lbnRzIHRoZQotICAgICAqIDxjb2RlPkVsZW1lbnQ8L2NvZGU+IGludGVyZmFjZSwgc28gYXR0cmlidXRlcyBjYW4gYmUgc3BlY2lmaWVkIGRpcmVjdGx5IG9uIHRoZSByZXR1cm5lZAotICAgICAqIG9iamVjdC4gPGJyPkluIGFkZGl0aW9uLCBpZiB0aGVyZSBhcmUga25vd24gYXR0cmlidXRlcyB3aXRoIGRlZmF1bHQgdmFsdWVzLCA8Y29kZT5BdHRyPC9jb2RlPgotICAgICAqIG5vZGVzIHJlcHJlc2VudGluZyB0aGVtIGFyZSBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgYW5kIGF0dGFjaGVkIHRvIHRoZSBlbGVtZW50LiA8YnI+VG8gY3JlYXRlCi0gICAgICogYW4gZWxlbWVudCB3aXRoIGEgcXVhbGlmaWVkIG5hbWUgYW5kIG5hbWVzcGFjZSBVUkksIHVzZSB0aGUgPGNvZGU+Y3JlYXRlRWxlbWVudE5TPC9jb2RlPgotICAgICAqIG1ldGhvZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0YWdOYW1lIFRoZSBuYW1lIG9mIHRoZSBlbGVtZW50IHR5cGUgdG8gaW5zdGFudGlhdGUuIEZvciBYTUwsIHRoaXMgaXMgY2FzZS1zZW5zaXRpdmUuCi0gICAgICogICAgICAgICAgICAgICAgRm9yIEhUTUwsIHRoZSA8Y29kZT50YWdOYW1lPC9jb2RlPiBwYXJhbWV0ZXIgbWF5IGJlIHByb3ZpZGVkIGluIGFueSBjYXNlLCBidXQKLSAgICAgKiAgICAgICAgICAgICAgICBpdCBtdXN0IGJlIG1hcHBlZCB0byB0aGUgY2Fub25pY2FsIHVwcGVyY2FzZSBmb3JtIGJ5IHRoZSBET00gaW1wbGVtZW50YXRpb24uCi0gICAgICogQHJldHVybiBBIG5ldyA8Y29kZT5FbGVtZW50PC9jb2RlPiBvYmplY3Qgd2l0aCB0aGUgPGNvZGU+bm9kZU5hbWU8L2NvZGU+IGF0dHJpYnV0ZSBzZXQgdG8KLSAgICAgKiAgICAgICAgIDxjb2RlPnRhZ05hbWU8L2NvZGU+LCBhbmQgPGNvZGU+bG9jYWxOYW1lPC9jb2RlPiwgPGNvZGU+cHJlZml4PC9jb2RlPiwgYW5kCi0gICAgICogICAgICAgICA8Y29kZT5uYW1lc3BhY2VVUkk8L2NvZGU+IHNldCB0byA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgKiBAdGhyb3dzIERPTUV4Y2VwdGlvbiBJTlZBTElEX0NIQVJBQ1RFUl9FUlI6IFJhaXNlZCBpZiB0aGUgc3BlY2lmaWVkIG5hbWUgY29udGFpbnMgYW4gaWxsZWdhbAotICAgICAqICAgICAgICAgICAgICAgICAgICAgIGNoYXJhY3Rlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgRWxlbWVudCBjcmVhdGVFbGVtZW50KFN0cmluZyB0YWdOYW1lKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnTmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBlbXB0eSA8Y29kZT5Eb2N1bWVudEZyYWdtZW50PC9jb2RlPiBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkRvY3VtZW50RnJhZ21lbnQ8L2NvZGU+LgotICAgICAqLwotICAgIHB1YmxpYyBEb2N1bWVudEZyYWdtZW50IGNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSB7Ci0gICAgICAgIHJldHVybiBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIDxjb2RlPlRleHQ8L2NvZGU+IG5vZGUgZ2l2ZW4gdGhlIHNwZWNpZmllZCBzdHJpbmcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZGF0YSBUaGUgZGF0YSBmb3IgdGhlIG5vZGUuCi0gICAgICogQHJldHVybiBUaGUgbmV3IDxjb2RlPlRleHQ8L2NvZGU+IG9iamVjdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgVGV4dCBjcmVhdGVUZXh0Tm9kZShTdHJpbmcgZGF0YSkgewotICAgICAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoZGF0YSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIDxjb2RlPkNEQVRBU2VjdGlvbjwvY29kZT4gbm9kZSB3aG9zZSB2YWx1ZSBpcyB0aGUgc3BlY2lmaWVkIHN0cmluZy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBkYXRhIFRoZSBkYXRhIGZvciB0aGUgPGNvZGU+Q0RBVEFTZWN0aW9uPC9jb2RlPiBjb250ZW50cy4KLSAgICAgKiBAcmV0dXJuIFRoZSBuZXcgPGNvZGU+Q0RBVEFTZWN0aW9uPC9jb2RlPiBvYmplY3QuCi0gICAgICogQHRocm93cyBET01FeGNlcHRpb24gTk9UX1NVUFBPUlRFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIGRvY3VtZW50IGlzIGFuIEhUTUwgZG9jdW1lbnQuCi0gICAgICovCi0gICAgcHVibGljIENvbW1lbnQgY3JlYXRlQ29tbWVudChTdHJpbmcgZGF0YSkgewotICAgICAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlQ29tbWVudChkYXRhKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgPGNvZGU+Q0RBVEFTZWN0aW9uPC9jb2RlPiBub2RlIHdob3NlIHZhbHVlIGlzIHRoZSBzcGVjaWZpZWQgc3RyaW5nLgotICAgICAqCi0gICAgICogQHBhcmFtIGRhdGEgVGhlIGRhdGEgZm9yIHRoZSA8Y29kZT5DREFUQVNlY3Rpb248L2NvZGU+IGNvbnRlbnRzLgotICAgICAqIEByZXR1cm4gVGhlIG5ldyA8Y29kZT5DREFUQVNlY3Rpb248L2NvZGU+IG9iamVjdC4KLSAgICAgKiBAdGhyb3dzIERPTUV4Y2VwdGlvbiBOT1RfU1VQUE9SVEVEX0VSUjogUmFpc2VkIGlmIHRoaXMgZG9jdW1lbnQgaXMgYW4gSFRNTCBkb2N1bWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ0RBVEFTZWN0aW9uIGNyZWF0ZUNEQVRBU2VjdGlvbihTdHJpbmcgZGF0YSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBkb2N1bWVudC5jcmVhdGVDREFUQVNlY3Rpb24oZGF0YSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIDxjb2RlPlByb2Nlc3NpbmdJbnN0cnVjdGlvbjwvY29kZT4gbm9kZSBnaXZlbiB0aGUgc3BlY2lmaWVkIG5hbWUgYW5kIGRhdGEgc3RyaW5ncy4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBwYXJ0IG9mIHRoZSBwcm9jZXNzaW5nIGluc3RydWN0aW9uLgotICAgICAqIEBwYXJhbSBkYXRhICAgVGhlIGRhdGEgZm9yIHRoZSBub2RlLgotICAgICAqIEByZXR1cm4gVGhlIG5ldyA8Y29kZT5Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb248L2NvZGU+IG9iamVjdC4KLSAgICAgKiBAdGhyb3dzIERPTUV4Y2VwdGlvbiBJTlZBTElEX0NIQVJBQ1RFUl9FUlI6IFJhaXNlZCBpZiB0aGUgc3BlY2lmaWVkIHRhcmdldCBjb250YWlucyBhbgotICAgICAqICAgICAgICAgICAgICAgICAgICAgIGlsbGVnYWwgY2hhcmFjdGVyLiA8YnI+Tk9UX1NVUFBPUlRFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIGRvY3VtZW50IGlzIGFuCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgSFRNTCBkb2N1bWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgUHJvY2Vzc2luZ0luc3RydWN0aW9uIGNyZWF0ZVByb2Nlc3NpbmdJbnN0cnVjdGlvbihTdHJpbmcgdGFyZ2V0LCBTdHJpbmcgZGF0YSkKLSAgICAgICAgICAgIHRocm93cyBET01FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlUHJvY2Vzc2luZ0luc3RydWN0aW9uKHRhcmdldCwgZGF0YSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiA8Y29kZT5BdHRyPC9jb2RlPiBvZiB0aGUgZ2l2ZW4gbmFtZS4gTm90ZSB0aGF0IHRoZSA8Y29kZT5BdHRyPC9jb2RlPiBpbnN0YW5jZSBjYW4KLSAgICAgKiB0aGVuIGJlIHNldCBvbiBhbiA8Y29kZT5FbGVtZW50PC9jb2RlPiB1c2luZyB0aGUgPGNvZGU+c2V0QXR0cmlidXRlTm9kZTwvY29kZT4gbWV0aG9kLiA8YnI+VG8KLSAgICAgKiBjcmVhdGUgYW4gYXR0cmlidXRlIHdpdGggYSBxdWFsaWZpZWQgbmFtZSBhbmQgbmFtZXNwYWNlIFVSSSwgdXNlIHRoZQotICAgICAqIDxjb2RlPmNyZWF0ZUF0dHJpYnV0ZU5TPC9jb2RlPiBtZXRob2QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlLgotICAgICAqIEByZXR1cm4gQSBuZXcgPGNvZGU+QXR0cjwvY29kZT4gb2JqZWN0IHdpdGggdGhlIDxjb2RlPm5vZGVOYW1lPC9jb2RlPiBhdHRyaWJ1dGUgc2V0IHRvCi0gICAgICogICAgICAgICA8Y29kZT5uYW1lPC9jb2RlPiwgYW5kIDxjb2RlPmxvY2FsTmFtZTwvY29kZT4sIDxjb2RlPnByZWZpeDwvY29kZT4sIGFuZAotICAgICAqICAgICAgICAgPGNvZGU+bmFtZXNwYWNlVVJJPC9jb2RlPiBzZXQgdG8gPGNvZGU+bnVsbDwvY29kZT4uIFRoZSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlIGlzIHRoZQotICAgICAqICAgICAgICAgZW1wdHkgc3RyaW5nLgotICAgICAqIEB0aHJvd3MgRE9NRXhjZXB0aW9uIElOVkFMSURfQ0hBUkFDVEVSX0VSUjogUmFpc2VkIGlmIHRoZSBzcGVjaWZpZWQgbmFtZSBjb250YWlucyBhbiBpbGxlZ2FsCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyLgotICAgICAqLwotICAgIHB1YmxpYyBBdHRyIGNyZWF0ZUF0dHJpYnV0ZShTdHJpbmcgbmFtZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBkb2N1bWVudC5jcmVhdGVBdHRyaWJ1dGUobmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiA8Y29kZT5FbnRpdHlSZWZlcmVuY2U8L2NvZGU+IG9iamVjdC4gSW4gYWRkaXRpb24sIGlmIHRoZSByZWZlcmVuY2VkIGVudGl0eSBpcwotICAgICAqIGtub3duLCB0aGUgY2hpbGQgbGlzdCBvZiB0aGUgPGNvZGU+RW50aXR5UmVmZXJlbmNlPC9jb2RlPiBub2RlIGlzIG1hZGUgdGhlIHNhbWUgYXMgdGhhdCBvZgotICAgICAqIHRoZSBjb3JyZXNwb25kaW5nIDxjb2RlPkVudGl0eTwvY29kZT4gbm9kZS5JZiBhbnkgZGVzY2VuZGFudCBvZiB0aGUgPGNvZGU+RW50aXR5PC9jb2RlPiBub2RlCi0gICAgICogaGFzIGFuIHVuYm91bmQgbmFtZXNwYWNlIHByZWZpeCwgdGhlIGNvcnJlc3BvbmRpbmcgZGVzY2VuZGFudCBvZiB0aGUgY3JlYXRlZAotICAgICAqIDxjb2RlPkVudGl0eVJlZmVyZW5jZTwvY29kZT4gbm9kZSBpcyBhbHNvIHVuYm91bmQ7IChpdHMgPGNvZGU+bmFtZXNwYWNlVVJJPC9jb2RlPiBpcwotICAgICAqIDxjb2RlPm51bGw8L2NvZGU+KS4gVGhlIERPTSBMZXZlbCAyIGRvZXMgbm90IHN1cHBvcnQgYW55IG1lY2hhbmlzbSB0byByZXNvbHZlIG5hbWVzcGFjZQotICAgICAqIHByZWZpeGVzLgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIGVudGl0eSB0byByZWZlcmVuY2UuCi0gICAgICogQHJldHVybiBUaGUgbmV3IDxjb2RlPkVudGl0eVJlZmVyZW5jZTwvY29kZT4gb2JqZWN0LgotICAgICAqIEB0aHJvd3MgRE9NRXhjZXB0aW9uIElOVkFMSURfQ0hBUkFDVEVSX0VSUjogUmFpc2VkIGlmIHRoZSBzcGVjaWZpZWQgbmFtZSBjb250YWlucyBhbiBpbGxlZ2FsCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyLiA8YnI+Tk9UX1NVUFBPUlRFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIGRvY3VtZW50IGlzIGFuIEhUTUwKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgRW50aXR5UmVmZXJlbmNlIGNyZWF0ZUVudGl0eVJlZmVyZW5jZShTdHJpbmcgbmFtZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBkb2N1bWVudC5jcmVhdGVFbnRpdHlSZWZlcmVuY2UobmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIDxjb2RlPk5vZGVMaXN0PC9jb2RlPiBvZiBhbGwgdGhlIDxjb2RlPkVsZW1lbnRzPC9jb2RlPiB3aXRoIGEgZ2l2ZW4gdGFnIG5hbWUgaW4gdGhlCi0gICAgICogb3JkZXIgaW4gd2hpY2ggdGhleSBhcmUgZW5jb3VudGVyZWQgaW4gYSBwcmVvcmRlciB0cmF2ZXJzYWwgb2YgdGhlIDxjb2RlPkRvY3VtZW50PC9jb2RlPgotICAgICAqIHRyZWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdGFnbmFtZSBUaGUgbmFtZSBvZiB0aGUgdGFnIHRvIG1hdGNoIG9uLiBUaGUgc3BlY2lhbCB2YWx1ZSAiKiIgbWF0Y2hlcyBhbGwgdGFncy4KLSAgICAgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPk5vZGVMaXN0PC9jb2RlPiBvYmplY3QgY29udGFpbmluZyBhbGwgdGhlIG1hdGNoZWQgPGNvZGU+RWxlbWVudHM8L2NvZGU+LgotICAgICAqLwotICAgIHB1YmxpYyBOb2RlTGlzdCBnZXRFbGVtZW50c0J5VGFnTmFtZShTdHJpbmcgdGFnbmFtZSkgewotICAgICAgICByZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUodGFnbmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW1wb3J0cyBhIG5vZGUgZnJvbSBhbm90aGVyIGRvY3VtZW50IHRvIHRoaXMgZG9jdW1lbnQuIFRoZSByZXR1cm5lZCBub2RlIGhhcyBubyBwYXJlbnQ7Ci0gICAgICogKDxjb2RlPnBhcmVudE5vZGU8L2NvZGU+IGlzIDxjb2RlPm51bGw8L2NvZGU+KS4gVGhlIHNvdXJjZSBub2RlIGlzIG5vdCBhbHRlcmVkIG9yIHJlbW92ZWQKLSAgICAgKiBmcm9tIHRoZSBvcmlnaW5hbCBkb2N1bWVudDsgdGhpcyBtZXRob2QgY3JlYXRlcyBhIG5ldyBjb3B5IG9mIHRoZSBzb3VyY2Ugbm9kZS4gPGJyPkZvciBhbGwKLSAgICAgKiBub2RlcywgaW1wb3J0aW5nIGEgbm9kZSBjcmVhdGVzIGEgbm9kZSBvYmplY3Qgb3duZWQgYnkgdGhlIGltcG9ydGluZyBkb2N1bWVudCwgd2l0aCBhdHRyaWJ1dGUKLSAgICAgKiB2YWx1ZXMgaWRlbnRpY2FsIHRvIHRoZSBzb3VyY2Ugbm9kZSdzIDxjb2RlPm5vZGVOYW1lPC9jb2RlPiBhbmQgPGNvZGU+bm9kZVR5cGU8L2NvZGU+LCBwbHVzCi0gICAgICogdGhlIGF0dHJpYnV0ZXMgcmVsYXRlZCB0byBuYW1lc3BhY2VzICg8Y29kZT5wcmVmaXg8L2NvZGU+LCA8Y29kZT5sb2NhbE5hbWU8L2NvZGU+LCBhbmQKLSAgICAgKiA8Y29kZT5uYW1lc3BhY2VVUkk8L2NvZGU+KS4gQXMgaW4gdGhlIDxjb2RlPmNsb25lTm9kZTwvY29kZT4gb3BlcmF0aW9uIG9uIGEKLSAgICAgKiA8Y29kZT5Ob2RlPC9jb2RlPiwgdGhlIHNvdXJjZSBub2RlIGlzIG5vdCBhbHRlcmVkLiA8YnI+QWRkaXRpb25hbCBpbmZvcm1hdGlvbiBpcyBjb3BpZWQgYXMKLSAgICAgKiBhcHByb3ByaWF0ZSB0byB0aGUgPGNvZGU+bm9kZVR5cGU8L2NvZGU+LCBhdHRlbXB0aW5nIHRvIG1pcnJvciB0aGUgYmVoYXZpb3IgZXhwZWN0ZWQgaWYgYQotICAgICAqIGZyYWdtZW50IG9mIFhNTCBvciBIVE1MIHNvdXJjZSB3YXMgY29waWVkIGZyb20gb25lIGRvY3VtZW50IHRvIGFub3RoZXIsIHJlY29nbml6aW5nIHRoYXQgdGhlCi0gICAgICogdHdvIGRvY3VtZW50cyBtYXkgaGF2ZSBkaWZmZXJlbnQgRFREcyBpbiB0aGUgWE1MIGNhc2UuIFRoZSBmb2xsb3dpbmcgbGlzdCBkZXNjcmliZXMgdGhlCi0gICAgICogc3BlY2lmaWNzIGZvciBlYWNoIHR5cGUgb2Ygbm9kZS4gPGRsPiA8ZHQ+QVRUUklCVVRFX05PREU8L2R0PiA8ZGQ+VGhlCi0gICAgICogPGNvZGU+b3duZXJFbGVtZW50PC9jb2RlPiBhdHRyaWJ1dGUgaXMgc2V0IHRvIDxjb2RlPm51bGw8L2NvZGU+IGFuZCB0aGUKLSAgICAgKiA8Y29kZT5zcGVjaWZpZWQ8L2NvZGU+IGZsYWcgaXMgc2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+IG9uIHRoZSBnZW5lcmF0ZWQgPGNvZGU+QXR0cjwvY29kZT4uCi0gICAgICogVGhlIGRlc2NlbmRhbnRzIG9mIHRoZSBzb3VyY2UgPGNvZGU+QXR0cjwvY29kZT4gYXJlIHJlY3Vyc2l2ZWx5IGltcG9ydGVkIGFuZCB0aGUgcmVzdWx0aW5nCi0gICAgICogbm9kZXMgcmVhc3NlbWJsZWQgdG8gZm9ybSB0aGUgY29ycmVzcG9uZGluZyBzdWJ0cmVlLiBOb3RlIHRoYXQgdGhlIDxjb2RlPmRlZXA8L2NvZGU+Ci0gICAgICogcGFyYW1ldGVyIGhhcyBubyBlZmZlY3Qgb24gPGNvZGU+QXR0cjwvY29kZT4gbm9kZXM7IHRoZXkgYWx3YXlzIGNhcnJ5IHRoZWlyIGNoaWxkcmVuIHdpdGgKLSAgICAgKiB0aGVtIHdoZW4gaW1wb3J0ZWQuPC9kZD4gPGR0PkRPQ1VNRU5UX0ZSQUdNRU5UX05PREU8L2R0PiA8ZGQ+SWYgdGhlIDxjb2RlPmRlZXA8L2NvZGU+IG9wdGlvbgotICAgICAqIHdhcyBzZXQgdG8gPGNvZGU+dHJ1ZTwvY29kZT4sIHRoZSBkZXNjZW5kYW50cyBvZiB0aGUgc291cmNlIGVsZW1lbnQgYXJlIHJlY3Vyc2l2ZWx5IGltcG9ydGVkCi0gICAgICogYW5kIHRoZSByZXN1bHRpbmcgbm9kZXMgcmVhc3NlbWJsZWQgdG8gZm9ybSB0aGUgY29ycmVzcG9uZGluZyBzdWJ0cmVlLiBPdGhlcndpc2UsIHRoaXMgc2ltcGx5Ci0gICAgICogZ2VuZXJhdGVzIGFuIGVtcHR5IDxjb2RlPkRvY3VtZW50RnJhZ21lbnQ8L2NvZGU+LjwvZGQ+IDxkdD5ET0NVTUVOVF9OT0RFPC9kdD4KLSAgICAgKiA8ZGQ+PGNvZGU+RG9jdW1lbnQ8L2NvZGU+IG5vZGVzIGNhbm5vdCBiZSBpbXBvcnRlZC48L2RkPiA8ZHQ+RE9DVU1FTlRfVFlQRV9OT0RFPC9kdD4KLSAgICAgKiA8ZGQ+PGNvZGU+RG9jdW1lbnRUeXBlPC9jb2RlPiBub2RlcyBjYW5ub3QgYmUgaW1wb3J0ZWQuPC9kZD4gPGR0PkVMRU1FTlRfTk9ERTwvZHQ+Ci0gICAgICogPGRkPlNwZWNpZmllZCBhdHRyaWJ1dGUgbm9kZXMgb2YgdGhlIHNvdXJjZSBlbGVtZW50IGFyZSBpbXBvcnRlZCwgYW5kIHRoZSBnZW5lcmF0ZWQKLSAgICAgKiA8Y29kZT5BdHRyPC9jb2RlPiBub2RlcyBhcmUgYXR0YWNoZWQgdG8gdGhlIGdlbmVyYXRlZCA8Y29kZT5FbGVtZW50PC9jb2RlPi4gRGVmYXVsdAotICAgICAqIGF0dHJpYnV0ZXMgYXJlIG5vdCBjb3BpZWQsIHRob3VnaCBpZiB0aGUgZG9jdW1lbnQgYmVpbmcgaW1wb3J0ZWQgaW50byBkZWZpbmVzIGRlZmF1bHQKLSAgICAgKiBhdHRyaWJ1dGVzIGZvciB0aGlzIGVsZW1lbnQgbmFtZSwgdGhvc2UgYXJlIGFzc2lnbmVkLiBJZiB0aGUgPGNvZGU+aW1wb3J0Tm9kZTwvY29kZT4KLSAgICAgKiA8Y29kZT5kZWVwPC9jb2RlPiBwYXJhbWV0ZXIgd2FzIHNldCB0byA8Y29kZT50cnVlPC9jb2RlPiwgdGhlIGRlc2NlbmRhbnRzIG9mIHRoZSBzb3VyY2UKLSAgICAgKiBlbGVtZW50IGFyZSByZWN1cnNpdmVseSBpbXBvcnRlZCBhbmQgdGhlIHJlc3VsdGluZyBub2RlcyByZWFzc2VtYmxlZCB0byBmb3JtIHRoZQotICAgICAqIGNvcnJlc3BvbmRpbmcgc3VidHJlZS48L2RkPiA8ZHQ+RU5USVRZX05PREU8L2R0PiA8ZGQ+PGNvZGU+RW50aXR5PC9jb2RlPiBub2RlcyBjYW4gYmUKLSAgICAgKiBpbXBvcnRlZCwgaG93ZXZlciBpbiB0aGUgY3VycmVudCByZWxlYXNlIG9mIHRoZSBET00gdGhlIDxjb2RlPkRvY3VtZW50VHlwZTwvY29kZT4gaXMKLSAgICAgKiByZWFkb25seS4gQWJpbGl0eSB0byBhZGQgdGhlc2UgaW1wb3J0ZWQgbm9kZXMgdG8gYSA8Y29kZT5Eb2N1bWVudFR5cGU8L2NvZGU+IHdpbGwgYmUKLSAgICAgKiBjb25zaWRlcmVkIGZvciBhZGRpdGlvbiB0byBhIGZ1dHVyZSByZWxlYXNlIG9mIHRoZSBET00uT24gaW1wb3J0LCB0aGUgPGNvZGU+cHVibGljSWQ8L2NvZGU+LAotICAgICAqIDxjb2RlPnN5c3RlbUlkPC9jb2RlPiwgYW5kIDxjb2RlPm5vdGF0aW9uTmFtZTwvY29kZT4gYXR0cmlidXRlcyBhcmUgY29waWVkLiBJZiBhCi0gICAgICogPGNvZGU+ZGVlcDwvY29kZT4gaW1wb3J0IGlzIHJlcXVlc3RlZCwgdGhlIGRlc2NlbmRhbnRzIG9mIHRoZSB0aGUgc291cmNlIDxjb2RlPkVudGl0eTwvY29kZT4KLSAgICAgKiBhcmUgcmVjdXJzaXZlbHkgaW1wb3J0ZWQgYW5kIHRoZSByZXN1bHRpbmcgbm9kZXMgcmVhc3NlbWJsZWQgdG8gZm9ybSB0aGUgY29ycmVzcG9uZGluZwotICAgICAqIHN1YnRyZWUuPC9kZD4gPGR0PiBFTlRJVFlfUkVGRVJFTkNFX05PREU8L2R0PiA8ZGQ+T25seSB0aGUgPGNvZGU+RW50aXR5UmVmZXJlbmNlPC9jb2RlPgotICAgICAqIGl0c2VsZiBpcyBjb3BpZWQsIGV2ZW4gaWYgYSA8Y29kZT5kZWVwPC9jb2RlPiBpbXBvcnQgaXMgcmVxdWVzdGVkLCBzaW5jZSB0aGUgc291cmNlIGFuZAotICAgICAqIGRlc3RpbmF0aW9uIGRvY3VtZW50cyBtaWdodCBoYXZlIGRlZmluZWQgdGhlIGVudGl0eSBkaWZmZXJlbnRseS4gSWYgdGhlIGRvY3VtZW50IGJlaW5nCi0gICAgICogaW1wb3J0ZWQgaW50byBwcm92aWRlcyBhIGRlZmluaXRpb24gZm9yIHRoaXMgZW50aXR5IG5hbWUsIGl0cyB2YWx1ZSBpcyBhc3NpZ25lZC48L2RkPgotICAgICAqIDxkdD5OT1RBVElPTl9OT0RFPC9kdD4gPGRkPiA8Y29kZT5Ob3RhdGlvbjwvY29kZT4gbm9kZXMgY2FuIGJlIGltcG9ydGVkLCBob3dldmVyIGluIHRoZQotICAgICAqIGN1cnJlbnQgcmVsZWFzZSBvZiB0aGUgRE9NIHRoZSA8Y29kZT5Eb2N1bWVudFR5cGU8L2NvZGU+IGlzIHJlYWRvbmx5LiBBYmlsaXR5IHRvIGFkZCB0aGVzZQotICAgICAqIGltcG9ydGVkIG5vZGVzIHRvIGEgPGNvZGU+RG9jdW1lbnRUeXBlPC9jb2RlPiB3aWxsIGJlIGNvbnNpZGVyZWQgZm9yIGFkZGl0aW9uIHRvIGEgZnV0dXJlCi0gICAgICogcmVsZWFzZSBvZiB0aGUgRE9NLk9uIGltcG9ydCwgdGhlIDxjb2RlPnB1YmxpY0lkPC9jb2RlPiBhbmQgPGNvZGU+c3lzdGVtSWQ8L2NvZGU+IGF0dHJpYnV0ZXMKLSAgICAgKiBhcmUgY29waWVkLiBOb3RlIHRoYXQgdGhlIDxjb2RlPmRlZXA8L2NvZGU+IHBhcmFtZXRlciBoYXMgbm8gZWZmZWN0IG9uIDxjb2RlPk5vdGF0aW9uPC9jb2RlPgotICAgICAqIG5vZGVzIHNpbmNlIHRoZXkgbmV2ZXIgaGF2ZSBhbnkgY2hpbGRyZW4uPC9kZD4gPGR0PiBQUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREU8L2R0PiA8ZGQ+VGhlCi0gICAgICogaW1wb3J0ZWQgbm9kZSBjb3BpZXMgaXRzIDxjb2RlPnRhcmdldDwvY29kZT4gYW5kIDxjb2RlPmRhdGE8L2NvZGU+IHZhbHVlcyBmcm9tIHRob3NlIG9mIHRoZQotICAgICAqIHNvdXJjZSBub2RlLjwvZGQ+IDxkdD5URVhUX05PREUsIENEQVRBX1NFQ1RJT05fTk9ERSwgQ09NTUVOVF9OT0RFPC9kdD4gPGRkPlRoZXNlIHRocmVlIHR5cGVzCi0gICAgICogb2Ygbm9kZXMgaW5oZXJpdGluZyBmcm9tIDxjb2RlPkNoYXJhY3RlckRhdGE8L2NvZGU+IGNvcHkgdGhlaXIgPGNvZGU+ZGF0YTwvY29kZT4gYW5kCi0gICAgICogPGNvZGU+bGVuZ3RoPC9jb2RlPiBhdHRyaWJ1dGVzIGZyb20gdGhvc2Ugb2YgdGhlIHNvdXJjZSBub2RlLjwvZGQ+IDwvZGw+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gaW1wb3J0ZWROb2RlIFRoZSBub2RlIHRvIGltcG9ydC4KLSAgICAgKiBAcGFyYW0gZGVlcCAgICAgICAgIElmIDxjb2RlPnRydWU8L2NvZGU+LCByZWN1cnNpdmVseSBpbXBvcnQgdGhlIHN1YnRyZWUgdW5kZXIgdGhlIHNwZWNpZmllZAotICAgICAqICAgICAgICAgICAgICAgICAgICAgbm9kZTsgaWYgPGNvZGU+ZmFsc2U8L2NvZGU+LCBpbXBvcnQgb25seSB0aGUgbm9kZSBpdHNlbGYsIGFzIGV4cGxhaW5lZAotICAgICAqICAgICAgICAgICAgICAgICAgICAgYWJvdmUuIFRoaXMgaGFzIG5vIGVmZmVjdCBvbiA8Y29kZT5BdHRyPC9jb2RlPiAsIDxjb2RlPkVudGl0eVJlZmVyZW5jZTwvY29kZT4sCi0gICAgICogICAgICAgICAgICAgICAgICAgICBhbmQgPGNvZGU+Tm90YXRpb248L2NvZGU+IG5vZGVzLgotICAgICAqIEByZXR1cm4gVGhlIGltcG9ydGVkIG5vZGUgdGhhdCBiZWxvbmdzIHRvIHRoaXMgPGNvZGU+RG9jdW1lbnQ8L2NvZGU+LgotICAgICAqIEB0aHJvd3MgRE9NRXhjZXB0aW9uIE5PVF9TVVBQT1JURURfRVJSOiBSYWlzZWQgaWYgdGhlIHR5cGUgb2Ygbm9kZSBiZWluZyBpbXBvcnRlZCBpcyBub3QKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0ZWQuCi0gICAgICogQHNpbmNlIERPTSBMZXZlbCAyCi0gICAgICovCi0gICAgcHVibGljIE5vZGUgaW1wb3J0Tm9kZShOb2RlIGltcG9ydGVkTm9kZSwgYm9vbGVhbiBkZWVwKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGRvY3VtZW50LmltcG9ydE5vZGUoaW1wb3J0ZWROb2RlLCBkZWVwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIGVsZW1lbnQgb2YgdGhlIGdpdmVuIHF1YWxpZmllZCBuYW1lIGFuZCBuYW1lc3BhY2UgVVJJLgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWVzcGFjZVVSSSAgVGhlIG5hbWVzcGFjZSBVUkkgb2YgdGhlIGVsZW1lbnQgdG8gY3JlYXRlLgotICAgICAqIEBwYXJhbSBxdWFsaWZpZWROYW1lIFRoZSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgZWxlbWVudCB0eXBlIHRvIGluc3RhbnRpYXRlLgotICAgICAqIEByZXR1cm4gQSBuZXcgPGNvZGU+RWxlbWVudDwvY29kZT4gb2JqZWN0IHdpdGggdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOiA8dGFibGUgYm9yZGVyPScxJwotICAgICAqICAgICAgICAgc3VtbWFyeT0iRGVzY3JpcHRpb24gb2YgYXR0cmlidXRlcyBhbmQgdmFsdWVzIGZvciB0aGUgbmV3IEVsZW1lbnQgb2JqZWN0Ij4gPHRyPgotICAgICAqICAgICAgICAgPHRoPkF0dHJpYnV0ZTwvdGg+IDx0aD5WYWx1ZTwvdGg+IDwvdHI+IDx0cj4gPHRkIHZhbGlnbj0ndG9wJz48Y29kZT5Ob2RlLm5vZGVOYW1lPC9jb2RlPjwvdGQ+Ci0gICAgICogICAgICAgICA8dGQgdmFsaWduPSd0b3AnPiA8Y29kZT5xdWFsaWZpZWROYW1lPC9jb2RlPjwvdGQ+IDwvdHI+IDx0cj4gPHRkCi0gICAgICogICAgICAgICB2YWxpZ249J3RvcCc+PGNvZGU+Tm9kZS5uYW1lc3BhY2VVUkk8L2NvZGU+PC90ZD4gPHRkIHZhbGlnbj0ndG9wJz4KLSAgICAgKiAgICAgICAgIDxjb2RlPm5hbWVzcGFjZVVSSTwvY29kZT48L3RkPiA8L3RyPiA8dHI+IDx0ZCB2YWxpZ249J3RvcCc+PGNvZGU+Tm9kZS5wcmVmaXg8L2NvZGU+PC90ZD4KLSAgICAgKiAgICAgICAgIDx0ZCB2YWxpZ249J3RvcCc+cHJlZml4LCBleHRyYWN0ZWQgZnJvbSA8Y29kZT5xdWFsaWZpZWROYW1lPC9jb2RlPiwgb3IKLSAgICAgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzIG5vIHByZWZpeDwvdGQ+IDwvdHI+IDx0cj4gPHRkCi0gICAgICogICAgICAgICB2YWxpZ249J3RvcCc+PGNvZGU+Tm9kZS5sb2NhbE5hbWU8L2NvZGU+PC90ZD4gPHRkIHZhbGlnbj0ndG9wJz5sb2NhbCBuYW1lLCBleHRyYWN0ZWQKLSAgICAgKiAgICAgICAgIGZyb20gPGNvZGU+cXVhbGlmaWVkTmFtZTwvY29kZT48L3RkPiA8L3RyPiA8dHI+IDx0ZCB2YWxpZ249J3RvcCc+PGNvZGU+RWxlbWVudC50YWdOYW1lPC9jb2RlPjwvdGQ+Ci0gICAgICogICAgICAgICA8dGQgdmFsaWduPSd0b3AnPiA8Y29kZT5xdWFsaWZpZWROYW1lPC9jb2RlPjwvdGQ+IDwvdHI+IDwvdGFibGU+Ci0gICAgICogQHRocm93cyBET01FeGNlcHRpb24gSU5WQUxJRF9DSEFSQUNURVJfRVJSOiBSYWlzZWQgaWYgdGhlIHNwZWNpZmllZCBxdWFsaWZpZWQgbmFtZSBjb250YWlucwotICAgICAqICAgICAgICAgICAgICAgICAgICAgIGFuIGlsbGVnYWwgY2hhcmFjdGVyLCBwZXIgdGhlIFhNTCAxLjAgc3BlY2lmaWNhdGlvbiAuIDxicj5OQU1FU1BBQ0VfRVJSOgotICAgICAqICAgICAgICAgICAgICAgICAgICAgIFJhaXNlZCBpZiB0aGUgPGNvZGU+cXVhbGlmaWVkTmFtZTwvY29kZT4gaXMgbWFsZm9ybWVkIHBlciB0aGUgTmFtZXNwYWNlcwotICAgICAqICAgICAgICAgICAgICAgICAgICAgIGluIFhNTCBzcGVjaWZpY2F0aW9uLCBpZiB0aGUgPGNvZGU+cXVhbGlmaWVkTmFtZTwvY29kZT4gaGFzIGEgcHJlZml4IGFuZAotICAgICAqICAgICAgICAgICAgICAgICAgICAgIHRoZSA8Y29kZT5uYW1lc3BhY2VVUkk8L2NvZGU+IGlzIDxjb2RlPm51bGw8L2NvZGU+LCBvciBpZiB0aGUKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICA8Y29kZT5xdWFsaWZpZWROYW1lPC9jb2RlPiBoYXMgYSBwcmVmaXggdGhhdCBpcyAieG1sIiBhbmQgdGhlCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgPGNvZGU+bmFtZXNwYWNlVVJJPC9jb2RlPiBpcyBkaWZmZXJlbnQgZnJvbSAiIGh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAuIDxicj5OT1RfU1VQUE9SVEVEX0VSUjogQWx3YXlzIHRocm93biBpZiB0aGUgY3VycmVudCBkb2N1bWVudCBkb2VzIG5vdAotICAgICAqICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnQgdGhlIDxjb2RlPiJYTUwiPC9jb2RlPiBmZWF0dXJlLCBzaW5jZSBuYW1lc3BhY2VzIHdlcmUgZGVmaW5lZCBieQotICAgICAqICAgICAgICAgICAgICAgICAgICAgIFhNTC4KLSAgICAgKiBAc2luY2UgRE9NIExldmVsIDIKLSAgICAgKi8KLSAgICBwdWJsaWMgRWxlbWVudCBjcmVhdGVFbGVtZW50TlMoU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIHF1YWxpZmllZE5hbWUpIHRocm93cyBET01FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKG5hbWVzcGFjZVVSSSwgcXVhbGlmaWVkTmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBhdHRyaWJ1dGUgb2YgdGhlIGdpdmVuIHF1YWxpZmllZCBuYW1lIGFuZCBuYW1lc3BhY2UgVVJJLgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWVzcGFjZVVSSSAgVGhlIG5hbWVzcGFjZSBVUkkgb2YgdGhlIGF0dHJpYnV0ZSB0byBjcmVhdGUuCi0gICAgICogQHBhcmFtIHF1YWxpZmllZE5hbWUgVGhlIHF1YWxpZmllZCBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdG8gaW5zdGFudGlhdGUuCi0gICAgICogQHJldHVybiBBIG5ldyA8Y29kZT5BdHRyPC9jb2RlPiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6IDx0YWJsZSBib3JkZXI9JzEnCi0gICAgICogICAgICAgICBzdW1tYXJ5PSJEZXNjcmlwdGlvbiBvZiBhdHRyaWJ1dGVzIGFuZCB2YWx1ZXMgZm9yIHRoZSBuZXcgQXR0ciBvYmplY3QiPiA8dHI+IDx0aD4KLSAgICAgKiAgICAgICAgIEF0dHJpYnV0ZTwvdGg+IDx0aD5WYWx1ZTwvdGg+IDwvdHI+IDx0cj4gPHRkIHZhbGlnbj0ndG9wJz48Y29kZT5Ob2RlLm5vZGVOYW1lPC9jb2RlPjwvdGQ+Ci0gICAgICogICAgICAgICA8dGQgdmFsaWduPSd0b3AnPnF1YWxpZmllZE5hbWU8L3RkPiA8L3RyPiA8dHI+IDx0ZCB2YWxpZ249J3RvcCc+Ci0gICAgICogICAgICAgICA8Y29kZT5Ob2RlLm5hbWVzcGFjZVVSSTwvY29kZT48L3RkPiA8dGQgdmFsaWduPSd0b3AnPjxjb2RlPm5hbWVzcGFjZVVSSTwvY29kZT48L3RkPgotICAgICAqICAgICAgICAgPC90cj4gPHRyPiA8dGQgdmFsaWduPSd0b3AnPiA8Y29kZT5Ob2RlLnByZWZpeDwvY29kZT48L3RkPiA8dGQgdmFsaWduPSd0b3AnPnByZWZpeCwKLSAgICAgKiAgICAgICAgIGV4dHJhY3RlZCBmcm9tIDxjb2RlPnF1YWxpZmllZE5hbWU8L2NvZGU+LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpcyBubwotICAgICAqICAgICAgICAgcHJlZml4PC90ZD4gPC90cj4gPHRyPiA8dGQgdmFsaWduPSd0b3AnPjxjb2RlPk5vZGUubG9jYWxOYW1lPC9jb2RlPjwvdGQ+IDx0ZAotICAgICAqICAgICAgICAgdmFsaWduPSd0b3AnPmxvY2FsIG5hbWUsIGV4dHJhY3RlZCBmcm9tIDxjb2RlPnF1YWxpZmllZE5hbWU8L2NvZGU+PC90ZD4gPC90cj4gPHRyPgotICAgICAqICAgICAgICAgPHRkIHZhbGlnbj0ndG9wJz48Y29kZT5BdHRyLm5hbWU8L2NvZGU+PC90ZD4gPHRkIHZhbGlnbj0ndG9wJz4KLSAgICAgKiAgICAgICAgIDxjb2RlPnF1YWxpZmllZE5hbWU8L2NvZGU+PC90ZD4gPC90cj4gPHRyPiA8dGQgdmFsaWduPSd0b3AnPjxjb2RlPk5vZGUubm9kZVZhbHVlPC9jb2RlPjwvdGQ+Ci0gICAgICogICAgICAgICA8dGQgdmFsaWduPSd0b3AnPnRoZSBlbXB0eSBzdHJpbmc8L3RkPiA8L3RyPiA8L3RhYmxlPgotICAgICAqIEB0aHJvd3MgRE9NRXhjZXB0aW9uIElOVkFMSURfQ0hBUkFDVEVSX0VSUjogUmFpc2VkIGlmIHRoZSBzcGVjaWZpZWQgcXVhbGlmaWVkIG5hbWUgY29udGFpbnMKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBhbiBpbGxlZ2FsIGNoYXJhY3RlciwgcGVyIHRoZSBYTUwgMS4wIHNwZWNpZmljYXRpb24gLiA8YnI+TkFNRVNQQUNFX0VSUjoKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBSYWlzZWQgaWYgdGhlIDxjb2RlPnF1YWxpZmllZE5hbWU8L2NvZGU+IGlzIG1hbGZvcm1lZCBwZXIgdGhlIE5hbWVzcGFjZXMKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBpbiBYTUwgc3BlY2lmaWNhdGlvbiwgaWYgdGhlIDxjb2RlPnF1YWxpZmllZE5hbWU8L2NvZGU+IGhhcyBhIHByZWZpeCBhbmQKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICB0aGUgPGNvZGU+bmFtZXNwYWNlVVJJPC9jb2RlPiBpcyA8Y29kZT5udWxsPC9jb2RlPiwgaWYgdGhlCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgPGNvZGU+cXVhbGlmaWVkTmFtZTwvY29kZT4gaGFzIGEgcHJlZml4IHRoYXQgaXMgInhtbCIgYW5kIHRoZQotICAgICAqICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPm5hbWVzcGFjZVVSSTwvY29kZT4gaXMgZGlmZmVyZW50IGZyb20gIiBodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiLAotICAgICAqICAgICAgICAgICAgICAgICAgICAgIG9yIGlmIHRoZSA8Y29kZT5xdWFsaWZpZWROYW1lPC9jb2RlPiwgb3IgaXRzIHByZWZpeCwgaXMgInhtbG5zIiBhbmQgdGhlCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgPGNvZGU+bmFtZXNwYWNlVVJJPC9jb2RlPiBpcyBkaWZmZXJlbnQgZnJvbSAiIGh0dHA6Ly93d3cudzMub3JnLzIwMDAveG1sbnMvIi4KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICA8YnI+Tk9UX1NVUFBPUlRFRF9FUlI6IEFsd2F5cyB0aHJvd24gaWYgdGhlIGN1cnJlbnQgZG9jdW1lbnQgZG9lcyBub3QKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0IHRoZSA8Y29kZT4iWE1MIjwvY29kZT4gZmVhdHVyZSwgc2luY2UgbmFtZXNwYWNlcyB3ZXJlIGRlZmluZWQgYnkKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBYTUwuCi0gICAgICogQHNpbmNlIERPTSBMZXZlbCAyCi0gICAgICovCi0gICAgcHVibGljIEF0dHIgY3JlYXRlQXR0cmlidXRlTlMoU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIHF1YWxpZmllZE5hbWUpIHRocm93cyBET01FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlQXR0cmlidXRlTlMobmFtZXNwYWNlVVJJLCBxdWFsaWZpZWROYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgPGNvZGU+Tm9kZUxpc3Q8L2NvZGU+IG9mIGFsbCB0aGUgPGNvZGU+RWxlbWVudHM8L2NvZGU+IHdpdGggYSBnaXZlbiBsb2NhbCBuYW1lIGFuZAotICAgICAqIG5hbWVzcGFjZSBVUkkgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgYXJlIGVuY291bnRlcmVkIGluIGEgcHJlb3JkZXIgdHJhdmVyc2FsIG9mIHRoZQotICAgICAqIDxjb2RlPkRvY3VtZW50PC9jb2RlPiB0cmVlLgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWVzcGFjZVVSSSBUaGUgbmFtZXNwYWNlIFVSSSBvZiB0aGUgZWxlbWVudHMgdG8gbWF0Y2ggb24uIFRoZSBzcGVjaWFsIHZhbHVlICIqIgotICAgICAqICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlcyBhbGwgbmFtZXNwYWNlcy4KLSAgICAgKiBAcGFyYW0gbG9jYWxOYW1lICAgIFRoZSBsb2NhbCBuYW1lIG9mIHRoZSBlbGVtZW50cyB0byBtYXRjaCBvbi4gVGhlIHNwZWNpYWwgdmFsdWUgIioiIG1hdGNoZXMKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgIGFsbCBsb2NhbCBuYW1lcy4KLSAgICAgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPk5vZGVMaXN0PC9jb2RlPiBvYmplY3QgY29udGFpbmluZyBhbGwgdGhlIG1hdGNoZWQgPGNvZGU+RWxlbWVudHM8L2NvZGU+LgotICAgICAqIEBzaW5jZSBET00gTGV2ZWwgMgotICAgICAqLwotICAgIHB1YmxpYyBOb2RlTGlzdCBnZXRFbGVtZW50c0J5VGFnTmFtZU5TKFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBsb2NhbE5hbWUpIHsKLSAgICAgICAgcmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lTlMobmFtZXNwYWNlVVJJLCBsb2NhbE5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIDxjb2RlPkVsZW1lbnQ8L2NvZGU+IHdob3NlIDxjb2RlPklEPC9jb2RlPiBpcyBnaXZlbiBieSA8Y29kZT5lbGVtZW50SWQ8L2NvZGU+LiBJZgotICAgICAqIG5vIHN1Y2ggZWxlbWVudCBleGlzdHMsIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4uIEJlaGF2aW9yIGlzIG5vdCBkZWZpbmVkIGlmIG1vcmUgdGhhbiBvbmUKLSAgICAgKiBlbGVtZW50IGhhcyB0aGlzIDxjb2RlPklEPC9jb2RlPi4gVGhlIERPTSBpbXBsZW1lbnRhdGlvbiBtdXN0IGhhdmUgaW5mb3JtYXRpb24gdGhhdCBzYXlzCi0gICAgICogd2hpY2ggYXR0cmlidXRlcyBhcmUgb2YgdHlwZSBJRC4gQXR0cmlidXRlcyB3aXRoIHRoZSBuYW1lICJJRCIgYXJlIG5vdCBvZiB0eXBlIElEIHVubGVzcyBzbwotICAgICAqIGRlZmluZWQuIEltcGxlbWVudGF0aW9ucyB0aGF0IGRvIG5vdCBrbm93IHdoZXRoZXIgYXR0cmlidXRlcyBhcmUgb2YgdHlwZSBJRCBvciBub3QgYXJlCi0gICAgICogZXhwZWN0ZWQgdG8gcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqCi0gICAgICogQHBhcmFtIGVsZW1lbnRJZCBUaGUgdW5pcXVlIDxjb2RlPmlkPC9jb2RlPiB2YWx1ZSBmb3IgYW4gZWxlbWVudC4KLSAgICAgKiBAcmV0dXJuIFRoZSBtYXRjaGluZyBlbGVtZW50LgotICAgICAqIEBzaW5jZSBET00gTGV2ZWwgMgotICAgICAqLwotICAgIHB1YmxpYyBFbGVtZW50IGdldEVsZW1lbnRCeUlkKFN0cmluZyBlbGVtZW50SWQpIHsKLSAgICAgICAgcmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsZW1lbnRJZCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRJbnB1dEVuY29kaW5nKCkgewotICAgICAgICAvL3JldHVybiAoKERlZmVycmVkRG9jdW1lbnRJbXBsKSgoKERPTVNvdXJjZSl0aGlzLnNvdXJjZSkuZ2V0Tm9kZSgpKSkuZ2V0SW5wdXRFbmNvZGluZygpOwotICAgICAgICByZXR1cm4gdGhpcy5lbnZlbG9wZS5nZXRFbmNvZGluZ1N0eWxlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRYbWxFbmNvZGluZygpIHsKLSAgICAgICAgcmV0dXJuIGRvY3VtZW50LmdldFhtbEVuY29kaW5nKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0WG1sU3RhbmRhbG9uZSgpIHsKLSAgICAgICAgcmV0dXJuIGRvY3VtZW50LmdldFhtbFN0YW5kYWxvbmUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRYbWxTdGFuZGFsb25lKGJvb2xlYW4geG1sU3RhbmRhbG9uZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0gICAgICAgIGRvY3VtZW50LnNldFhtbFN0YW5kYWxvbmUoeG1sU3RhbmRhbG9uZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRYbWxWZXJzaW9uKCkgewotICAgICAgICByZXR1cm4gZG9jdW1lbnQuZ2V0WG1sVmVyc2lvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFhtbFZlcnNpb24oU3RyaW5nIHhtbFZlcnNpb24pIHRocm93cyBET01FeGNlcHRpb24gewotICAgICAgICBkb2N1bWVudC5zZXRYbWxWZXJzaW9uKHhtbFZlcnNpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGdldFN0cmljdEVycm9yQ2hlY2tpbmcoKSB7Ci0gICAgICAgIHJldHVybiBkb2N1bWVudC5nZXRTdHJpY3RFcnJvckNoZWNraW5nKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U3RyaWN0RXJyb3JDaGVja2luZyhib29sZWFuIHN0cmljdEVycm9yQ2hlY2tpbmcpIHsKLSAgICAgICAgZG9jdW1lbnQuc2V0U3RyaWN0RXJyb3JDaGVja2luZyhzdHJpY3RFcnJvckNoZWNraW5nKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldERvY3VtZW50VVJJKCkgewotICAgICAgICByZXR1cm4gZG9jdW1lbnQuZ2V0RG9jdW1lbnRVUkkoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREb2N1bWVudFVSSShTdHJpbmcgZG9jdW1lbnRVUkkpIHsKLSAgICAgICAgZG9jdW1lbnQuc2V0RG9jdW1lbnRVUkkoZG9jdW1lbnRVUkkpOwotICAgIH0KLQotICAgIHB1YmxpYyBOb2RlIGFkb3B0Tm9kZShOb2RlIHNvdXJjZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBkb2N1bWVudC5hZG9wdE5vZGUoc291cmNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRE9NQ29uZmlndXJhdGlvbiBnZXREb21Db25maWcoKSB7Ci0gICAgICAgIHJldHVybiBkb2N1bWVudC5nZXREb21Db25maWcoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBub3JtYWxpemVEb2N1bWVudCgpIHsKLSAgICAgICAgZG9jdW1lbnQubm9ybWFsaXplRG9jdW1lbnQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTm9kZSByZW5hbWVOb2RlKE5vZGUgbiwgU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIHF1YWxpZmllZE5hbWUpIHRocm93cyBET01FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZG9jdW1lbnQucmVuYW1lTm9kZShuLCBuYW1lc3BhY2VVUkksIHF1YWxpZmllZE5hbWUpOwotICAgIH0KLQotICAgIC8qKiBUaGUgbmFtZSBvZiB0aGlzIG5vZGUsIGRlcGVuZGluZyBvbiBpdHMgdHlwZTsgc2VlIHRoZSB0YWJsZSBhYm92ZS4gKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkgewotICAgICAgICByZXR1cm4gZG9jdW1lbnQuZ2V0Tm9kZU5hbWUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgdmFsdWUgb2YgdGhpcyBub2RlLCBkZXBlbmRpbmcgb24gaXRzIHR5cGU7IHNlZSB0aGUgdGFibGUgYWJvdmUuIFdoZW4gaXQgaXMgZGVmaW5lZCB0byBiZQotICAgICAqIDxjb2RlPm51bGw8L2NvZGU+LCBzZXR0aW5nIGl0IGhhcyBubyBlZmZlY3QuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIERPTUV4Y2VwdGlvbiBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCB3aGVuIHRoZSBub2RlIGlzIHJlYWRvbmx5LgotICAgICAqIEB0aHJvd3MgRE9NRXhjZXB0aW9uIERPTVNUUklOR19TSVpFX0VSUjogUmFpc2VkIHdoZW4gaXQgd291bGQgcmV0dXJuIG1vcmUgY2hhcmFjdGVycyB0aGFuIGZpdAotICAgICAqICAgICAgICAgICAgICAgICAgICAgIGluIGEgPGNvZGU+RE9NU3RyaW5nPC9jb2RlPiB2YXJpYWJsZSBvbiB0aGUgaW1wbGVtZW50YXRpb24gcGxhdGZvcm0uCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXROb2RlVmFsdWUoKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGRvY3VtZW50LmdldE5vZGVWYWx1ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSB2YWx1ZSBvZiB0aGlzIG5vZGUsIGRlcGVuZGluZyBvbiBpdHMgdHlwZTsgc2VlIHRoZSB0YWJsZSBhYm92ZS4gV2hlbiBpdCBpcyBkZWZpbmVkIHRvIGJlCi0gICAgICogPGNvZGU+bnVsbDwvY29kZT4sIHNldHRpbmcgaXQgaGFzIG5vIGVmZmVjdC4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgRE9NRXhjZXB0aW9uIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIHdoZW4gdGhlIG5vZGUgaXMgcmVhZG9ubHkuCi0gICAgICogQHRocm93cyBET01FeGNlcHRpb24gRE9NU1RSSU5HX1NJWkVfRVJSOiBSYWlzZWQgd2hlbiBpdCB3b3VsZCByZXR1cm4gbW9yZSBjaGFyYWN0ZXJzIHRoYW4gZml0Ci0gICAgICogICAgICAgICAgICAgICAgICAgICAgaW4gYSA8Y29kZT5ET01TdHJpbmc8L2NvZGU+IHZhcmlhYmxlIG9uIHRoZSBpbXBsZW1lbnRhdGlvbiBwbGF0Zm9ybS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXROb2RlVmFsdWUoU3RyaW5nIGFyZzApIHRocm93cyBET01FeGNlcHRpb24gewotICAgICAgICBkb2N1bWVudC5zZXROb2RlVmFsdWUoYXJnMCk7Ci0gICAgfQotCi0gICAgLyoqIEEgY29kZSByZXByZXNlbnRpbmcgdGhlIHR5cGUgb2YgdGhlIHVuZGVybHlpbmcgb2JqZWN0LCBhcyBkZWZpbmVkIGFib3ZlLiAqLwotICAgIHB1YmxpYyBzaG9ydCBnZXROb2RlVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIGRvY3VtZW50LmdldE5vZGVUeXBlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIHBhcmVudCBvZiB0aGlzIG5vZGUuIEFsbCBub2RlcywgZXhjZXB0IDxjb2RlPkF0dHI8L2NvZGU+LCA8Y29kZT5Eb2N1bWVudDwvY29kZT4sCi0gICAgICogPGNvZGU+RG9jdW1lbnRGcmFnbWVudDwvY29kZT4sIDxjb2RlPkVudGl0eTwvY29kZT4sIGFuZCA8Y29kZT5Ob3RhdGlvbjwvY29kZT4gbWF5IGhhdmUgYQotICAgICAqIHBhcmVudC4gSG93ZXZlciwgaWYgYSBub2RlIGhhcyBqdXN0IGJlZW4gY3JlYXRlZCBhbmQgbm90IHlldCBhZGRlZCB0byB0aGUgdHJlZSwgb3IgaWYgaXQgaGFzCi0gICAgICogYmVlbiByZW1vdmVkIGZyb20gdGhlIHRyZWUsIHRoaXMgaXMgPGNvZGU+bnVsbDwvY29kZT4uCi0gICAgICovCi0gICAgcHVibGljIE5vZGUgZ2V0UGFyZW50Tm9kZSgpIHsKLSAgICAgICAgcmV0dXJuIHRvU0FBSk5vZGUoZG9jdW1lbnQuZ2V0UGFyZW50Tm9kZSgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBIDxjb2RlPk5vZGVMaXN0PC9jb2RlPiB0aGF0IGNvbnRhaW5zIGFsbCBjaGlsZHJlbiBvZiB0aGlzIG5vZGUuIElmIHRoZXJlIGFyZSBubyBjaGlsZHJlbiwKLSAgICAgKiB0aGlzIGlzIGEgPGNvZGU+Tm9kZUxpc3Q8L2NvZGU+IGNvbnRhaW5pbmcgbm8gbm9kZXMuCi0gICAgICovCi0gICAgcHVibGljIE5vZGVMaXN0IGdldENoaWxkTm9kZXMoKSB7Ci0gICAgICAgIE5vZGVMaXN0IGNoaWxkTm9kZXMgPSBkb2N1bWVudC5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgICAgIE5vZGVMaXN0SW1wbCBub2RlcyA9IG5ldyBOb2RlTGlzdEltcGwoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZE5vZGVzLmdldExlbmd0aCgpOyBpKyspIHsKLSAgICAgICAgICAgIG5vZGVzLmFkZE5vZGUodG9TQUFKTm9kZShjaGlsZE5vZGVzLml0ZW0oaSkpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbm9kZXM7Ci0gICAgfQotCi0gICAgLyoqIFRoZSBmaXJzdCBjaGlsZCBvZiB0aGlzIG5vZGUuIElmIHRoZXJlIGlzIG5vIHN1Y2ggbm9kZSwgdGhpcyByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+LiAqLwotICAgIHB1YmxpYyBOb2RlIGdldEZpcnN0Q2hpbGQoKSB7Ci0gICAgICAgIHJldHVybiB0b1NBQUpOb2RlKGRvY3VtZW50LmdldEZpcnN0Q2hpbGQoKSk7Ci0gICAgfQotCi0gICAgLyoqIFRoZSBsYXN0IGNoaWxkIG9mIHRoaXMgbm9kZS4gSWYgdGhlcmUgaXMgbm8gc3VjaCBub2RlLCB0aGlzIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4uICovCi0gICAgcHVibGljIE5vZGUgZ2V0TGFzdENoaWxkKCkgewotICAgICAgICByZXR1cm4gdG9TQUFKTm9kZShkb2N1bWVudC5nZXRMYXN0Q2hpbGQoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIG5vZGUgaW1tZWRpYXRlbHkgcHJlY2VkaW5nIHRoaXMgbm9kZS4gSWYgdGhlcmUgaXMgbm8gc3VjaCBub2RlLCB0aGlzIHJldHVybnMKLSAgICAgKiA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgKi8KLSAgICBwdWJsaWMgTm9kZSBnZXRQcmV2aW91c1NpYmxpbmcoKSB7Ci0gICAgICAgIHJldHVybiB0b1NBQUpOb2RlKGRvY3VtZW50LmdldFByZXZpb3VzU2libGluZygpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbm9kZSBpbW1lZGlhdGVseSBmb2xsb3dpbmcgdGhpcyBub2RlLiBJZiB0aGVyZSBpcyBubyBzdWNoIG5vZGUsIHRoaXMgcmV0dXJucwotICAgICAqIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqLwotICAgIHB1YmxpYyBOb2RlIGdldE5leHRTaWJsaW5nKCkgewotICAgICAgICByZXR1cm4gdG9TQUFKTm9kZShkb2N1bWVudC5nZXROZXh0U2libGluZygpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBIDxjb2RlPk5hbWVkTm9kZU1hcDwvY29kZT4gY29udGFpbmluZyB0aGUgYXR0cmlidXRlcyBvZiB0aGlzIG5vZGUgKGlmIGl0IGlzIGFuCi0gICAgICogPGNvZGU+RWxlbWVudDwvY29kZT4pIG9yIDxjb2RlPm51bGw8L2NvZGU+IG90aGVyd2lzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgTmFtZWROb2RlTWFwIGdldEF0dHJpYnV0ZXMoKSB7Ci0gICAgICAgIHJldHVybiBkb2N1bWVudC5nZXRBdHRyaWJ1dGVzKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIDxjb2RlPkRvY3VtZW50PC9jb2RlPiBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbm9kZS4gVGhpcyBpcyBhbHNvIHRoZQotICAgICAqIDxjb2RlPkRvY3VtZW50PC9jb2RlPiBvYmplY3QgdXNlZCB0byBjcmVhdGUgbmV3IG5vZGVzLiBXaGVuIHRoaXMgbm9kZSBpcyBhCi0gICAgICogPGNvZGU+RG9jdW1lbnQ8L2NvZGU+IG9yIGEgPGNvZGU+RG9jdW1lbnRUeXBlPC9jb2RlPiB3aGljaCBpcyBub3QgdXNlZCB3aXRoIGFueQotICAgICAqIDxjb2RlPkRvY3VtZW50PC9jb2RlPiB5ZXQsIHRoaXMgaXMgPGNvZGU+bnVsbDwvY29kZT4uCi0gICAgICovCi0gICAgcHVibGljIERvY3VtZW50IGdldE93bmVyRG9jdW1lbnQoKSB7Ci0gICAgICAgIHJldHVybiBkb2N1bWVudC5nZXRPd25lckRvY3VtZW50KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5zZXJ0cyB0aGUgbm9kZSA8Y29kZT5uZXdDaGlsZDwvY29kZT4gYmVmb3JlIHRoZSBleGlzdGluZyBjaGlsZCBub2RlIDxjb2RlPnJlZkNoaWxkPC9jb2RlPi4KLSAgICAgKiBJZiA8Y29kZT5yZWZDaGlsZDwvY29kZT4gaXMgPGNvZGU+bnVsbDwvY29kZT4sIGluc2VydCA8Y29kZT5uZXdDaGlsZDwvY29kZT4gYXQgdGhlIGVuZCBvZiB0aGUKLSAgICAgKiBsaXN0IG9mIGNoaWxkcmVuLiA8YnI+SWYgPGNvZGU+bmV3Q2hpbGQ8L2NvZGU+IGlzIGEgPGNvZGU+RG9jdW1lbnRGcmFnbWVudDwvY29kZT4gb2JqZWN0LCBhbGwKLSAgICAgKiBvZiBpdHMgY2hpbGRyZW4gYXJlIGluc2VydGVkLCBpbiB0aGUgc2FtZSBvcmRlciwgYmVmb3JlIDxjb2RlPnJlZkNoaWxkPC9jb2RlPi4gSWYgdGhlCi0gICAgICogPGNvZGU+bmV3Q2hpbGQ8L2NvZGU+IGlzIGFscmVhZHkgaW4gdGhlIHRyZWUsIGl0IGlzIGZpcnN0IHJlbW92ZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmV3Q2hpbGQgVGhlIG5vZGUgdG8gaW5zZXJ0LgotICAgICAqIEBwYXJhbSByZWZDaGlsZCBUaGUgcmVmZXJlbmNlIG5vZGUsIGkuZS4sIHRoZSBub2RlIGJlZm9yZSB3aGljaCB0aGUgbmV3IG5vZGUgbXVzdCBiZQotICAgICAqICAgICAgICAgICAgICAgICBpbnNlcnRlZC4KLSAgICAgKiBAcmV0dXJuIFRoZSBub2RlIGJlaW5nIGluc2VydGVkLgotICAgICAqIEB0aHJvd3MgRE9NRXhjZXB0aW9uIEhJRVJBUkNIWV9SRVFVRVNUX0VSUjogUmFpc2VkIGlmIHRoaXMgbm9kZSBpcyBvZiBhIHR5cGUgdGhhdCBkb2VzIG5vdAotICAgICAqICAgICAgICAgICAgICAgICAgICAgIGFsbG93IGNoaWxkcmVuIG9mIHRoZSB0eXBlIG9mIHRoZSA8Y29kZT5uZXdDaGlsZDwvY29kZT4gbm9kZSwgb3IgaWYgdGhlCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgbm9kZSB0byBpbnNlcnQgaXMgb25lIG9mIHRoaXMgbm9kZSdzIGFuY2VzdG9ycyBvciB0aGlzIG5vZGUgaXRzZWxmLgotICAgICAqICAgICAgICAgICAgICAgICAgICAgIDxicj5XUk9OR19ET0NVTUVOVF9FUlI6IFJhaXNlZCBpZiA8Y29kZT5uZXdDaGlsZDwvY29kZT4gd2FzIGNyZWF0ZWQgZnJvbQotICAgICAqICAgICAgICAgICAgICAgICAgICAgIGEgZGlmZmVyZW50IGRvY3VtZW50IHRoYW4gdGhlIG9uZSB0aGF0IGNyZWF0ZWQgdGhpcyBub2RlLgotICAgICAqICAgICAgICAgICAgICAgICAgICAgIDxicj5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIG5vZGUgaXMgcmVhZG9ubHkgb3IgaWYKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICB0aGUgcGFyZW50IG9mIHRoZSBub2RlIGJlaW5nIGluc2VydGVkIGlzIHJlYWRvbmx5LiA8YnI+Tk9UX0ZPVU5EX0VSUjoKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBSYWlzZWQgaWYgPGNvZGU+cmVmQ2hpbGQ8L2NvZGU+IGlzIG5vdCBhIGNoaWxkIG9mIHRoaXMgbm9kZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgTm9kZSBpbnNlcnRCZWZvcmUoTm9kZSBuZXdDaGlsZCwgTm9kZSByZWZDaGlsZCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBkb2N1bWVudC5pbnNlcnRCZWZvcmUobmV3Q2hpbGQsIHJlZkNoaWxkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXBsYWNlcyB0aGUgY2hpbGQgbm9kZSA8Y29kZT5vbGRDaGlsZDwvY29kZT4gd2l0aCA8Y29kZT5uZXdDaGlsZDwvY29kZT4gaW4gdGhlIGxpc3Qgb2YKLSAgICAgKiBjaGlsZHJlbiwgYW5kIHJldHVybnMgdGhlIDxjb2RlPm9sZENoaWxkPC9jb2RlPiBub2RlLiA8YnI+SWYgPGNvZGU+bmV3Q2hpbGQ8L2NvZGU+IGlzIGEKLSAgICAgKiA8Y29kZT5Eb2N1bWVudEZyYWdtZW50PC9jb2RlPiBvYmplY3QsIDxjb2RlPm9sZENoaWxkPC9jb2RlPiBpcyByZXBsYWNlZCBieSBhbGwgb2YgdGhlCi0gICAgICogPGNvZGU+RG9jdW1lbnRGcmFnbWVudDwvY29kZT4gY2hpbGRyZW4sIHdoaWNoIGFyZSBpbnNlcnRlZCBpbiB0aGUgc2FtZSBvcmRlci4gSWYgdGhlCi0gICAgICogPGNvZGU+bmV3Q2hpbGQ8L2NvZGU+IGlzIGFscmVhZHkgaW4gdGhlIHRyZWUsIGl0IGlzIGZpcnN0IHJlbW92ZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmV3Q2hpbGQgVGhlIG5ldyBub2RlIHRvIHB1dCBpbiB0aGUgY2hpbGQgbGlzdC4KLSAgICAgKiBAcGFyYW0gb2xkQ2hpbGQgVGhlIG5vZGUgYmVpbmcgcmVwbGFjZWQgaW4gdGhlIGxpc3QuCi0gICAgICogQHJldHVybiBUaGUgbm9kZSByZXBsYWNlZC4KLSAgICAgKiBAdGhyb3dzIERPTUV4Y2VwdGlvbiBISUVSQVJDSFlfUkVRVUVTVF9FUlI6IFJhaXNlZCBpZiB0aGlzIG5vZGUgaXMgb2YgYSB0eXBlIHRoYXQgZG9lcyBub3QKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBhbGxvdyBjaGlsZHJlbiBvZiB0aGUgdHlwZSBvZiB0aGUgPGNvZGU+bmV3Q2hpbGQ8L2NvZGU+IG5vZGUsIG9yIGlmIHRoZQotICAgICAqICAgICAgICAgICAgICAgICAgICAgIG5vZGUgdG8gcHV0IGluIGlzIG9uZSBvZiB0aGlzIG5vZGUncyBhbmNlc3RvcnMgb3IgdGhpcyBub2RlIGl0c2VsZi4KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICA8YnI+V1JPTkdfRE9DVU1FTlRfRVJSOiBSYWlzZWQgaWYgPGNvZGU+bmV3Q2hpbGQ8L2NvZGU+IHdhcyBjcmVhdGVkIGZyb20KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBhIGRpZmZlcmVudCBkb2N1bWVudCB0aGFuIHRoZSBvbmUgdGhhdCBjcmVhdGVkIHRoaXMgbm9kZS4KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICA8YnI+Tk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBub2RlIG9yIHRoZSBwYXJlbnQgb2YKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICB0aGUgbmV3IG5vZGUgaXMgcmVhZG9ubHkuIDxicj5OT1RfRk9VTkRfRVJSOiBSYWlzZWQgaWYKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICA8Y29kZT5vbGRDaGlsZDwvY29kZT4gaXMgbm90IGEgY2hpbGQgb2YgdGhpcyBub2RlLgotICAgICAqLwotICAgIHB1YmxpYyBOb2RlIHJlcGxhY2VDaGlsZChOb2RlIG5ld0NoaWxkLCBOb2RlIG9sZENoaWxkKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGRvY3VtZW50LnJlcGxhY2VDaGlsZChuZXdDaGlsZCwgb2xkQ2hpbGQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgdGhlIGNoaWxkIG5vZGUgaW5kaWNhdGVkIGJ5IDxjb2RlPm9sZENoaWxkPC9jb2RlPiBmcm9tIHRoZSBsaXN0IG9mIGNoaWxkcmVuLCBhbmQKLSAgICAgKiByZXR1cm5zIGl0LgotICAgICAqCi0gICAgICogQHBhcmFtIG9sZENoaWxkIFRoZSBub2RlIGJlaW5nIHJlbW92ZWQuCi0gICAgICogQHJldHVybiBUaGUgbm9kZSByZW1vdmVkLgotICAgICAqIEB0aHJvd3MgRE9NRXhjZXB0aW9uIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgbm9kZSBpcyByZWFkb25seS4KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICA8YnI+Tk9UX0ZPVU5EX0VSUjogUmFpc2VkIGlmIDxjb2RlPm9sZENoaWxkPC9jb2RlPiBpcyBub3QgYSBjaGlsZCBvZgotICAgICAqICAgICAgICAgICAgICAgICAgICAgIHRoaXMgbm9kZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgTm9kZSByZW1vdmVDaGlsZChOb2RlIG9sZENoaWxkKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKG9sZENoaWxkIGluc3RhbmNlb2YgU09BUEVsZW1lbnRJbXBsKSB7Ci0gICAgICAgICAgICBvbGRDaGlsZCA9ICgoU09BUEVsZW1lbnRJbXBsKW9sZENoaWxkKS5nZXRFbGVtZW50KCk7Ci0gICAgICAgIH0gZWxzZSBpZiAob2xkQ2hpbGQgaW5zdGFuY2VvZiBUZXh0SW1wbEV4KSB7Ci0gICAgICAgICAgICAvLyBUT0RPOiBoYW5kbGUgdGV4dCBub2RlcyBzb21laG93Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGRvY3VtZW50LnJlbW92ZUNoaWxkKG9sZENoaWxkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIHRoZSBub2RlIDxjb2RlPm5ld0NoaWxkPC9jb2RlPiB0byB0aGUgZW5kIG9mIHRoZSBsaXN0IG9mIGNoaWxkcmVuIG9mIHRoaXMgbm9kZS4gSWYgdGhlCi0gICAgICogPGNvZGU+bmV3Q2hpbGQ8L2NvZGU+IGlzIGFscmVhZHkgaW4gdGhlIHRyZWUsIGl0IGlzIGZpcnN0IHJlbW92ZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmV3Q2hpbGQgVGhlIG5vZGUgdG8gYWRkLklmIGl0IGlzIGEgPGNvZGU+RG9jdW1lbnRGcmFnbWVudDwvY29kZT4gb2JqZWN0LCB0aGUgZW50aXJlCi0gICAgICogICAgICAgICAgICAgICAgIGNvbnRlbnRzIG9mIHRoZSBkb2N1bWVudCBmcmFnbWVudCBhcmUgbW92ZWQgaW50byB0aGUgY2hpbGQgbGlzdCBvZiB0aGlzIG5vZGUKLSAgICAgKiBAcmV0dXJuIFRoZSBub2RlIGFkZGVkLgotICAgICAqIEB0aHJvd3MgRE9NRXhjZXB0aW9uIEhJRVJBUkNIWV9SRVFVRVNUX0VSUjogUmFpc2VkIGlmIHRoaXMgbm9kZSBpcyBvZiBhIHR5cGUgdGhhdCBkb2VzIG5vdAotICAgICAqICAgICAgICAgICAgICAgICAgICAgIGFsbG93IGNoaWxkcmVuIG9mIHRoZSB0eXBlIG9mIHRoZSA8Y29kZT5uZXdDaGlsZDwvY29kZT4gbm9kZSwgb3IgaWYgdGhlCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgbm9kZSB0byBhcHBlbmQgaXMgb25lIG9mIHRoaXMgbm9kZSdzIGFuY2VzdG9ycyBvciB0aGlzIG5vZGUgaXRzZWxmLgotICAgICAqICAgICAgICAgICAgICAgICAgICAgIDxicj5XUk9OR19ET0NVTUVOVF9FUlI6IFJhaXNlZCBpZiA8Y29kZT5uZXdDaGlsZDwvY29kZT4gd2FzIGNyZWF0ZWQgZnJvbQotICAgICAqICAgICAgICAgICAgICAgICAgICAgIGEgZGlmZmVyZW50IGRvY3VtZW50IHRoYW4gdGhlIG9uZSB0aGF0IGNyZWF0ZWQgdGhpcyBub2RlLgotICAgICAqICAgICAgICAgICAgICAgICAgICAgIDxicj5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIG5vZGUgaXMgcmVhZG9ubHkgb3IgaWYKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICB0aGUgcHJldmlvdXMgcGFyZW50IG9mIHRoZSBub2RlIGJlaW5nIGluc2VydGVkIGlzIHJlYWRvbmx5LgotICAgICAqLwotICAgIHB1YmxpYyBOb2RlIGFwcGVuZENoaWxkKE5vZGUgbmV3Q2hpbGQpIHRocm93cyBET01FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZG9jdW1lbnQuYXBwZW5kQ2hpbGQobmV3Q2hpbGQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIG5vZGUgaGFzIGFueSBjaGlsZHJlbi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBub2RlIGhhcyBhbnkgY2hpbGRyZW4sIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaGFzQ2hpbGROb2RlcygpIHsKLSAgICAgICAgcmV0dXJuIGRvY3VtZW50Lmhhc0NoaWxkTm9kZXMoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgZHVwbGljYXRlIG9mIHRoaXMgbm9kZSwgaS5lLiwgc2VydmVzIGFzIGEgZ2VuZXJpYyBjb3B5IGNvbnN0cnVjdG9yIGZvciBub2Rlcy4gVGhlCi0gICAgICogZHVwbGljYXRlIG5vZGUgaGFzIG5vIHBhcmVudDsgKCA8Y29kZT5wYXJlbnROb2RlPC9jb2RlPiBpcyA8Y29kZT5udWxsPC9jb2RlPi4pLiA8YnI+Q2xvbmluZwotICAgICAqIGFuIDxjb2RlPkVsZW1lbnQ8L2NvZGU+IGNvcGllcyBhbGwgYXR0cmlidXRlcyBhbmQgdGhlaXIgdmFsdWVzLCBpbmNsdWRpbmcgdGhvc2UgZ2VuZXJhdGVkIGJ5Ci0gICAgICogdGhlIFhNTCBwcm9jZXNzb3IgdG8gcmVwcmVzZW50IGRlZmF1bHRlZCBhdHRyaWJ1dGVzLCBidXQgdGhpcyBtZXRob2QgZG9lcyBub3QgY29weSBhbnkgdGV4dAotICAgICAqIGl0IGNvbnRhaW5zIHVubGVzcyBpdCBpcyBhIGRlZXAgY2xvbmUsIHNpbmNlIHRoZSB0ZXh0IGlzIGNvbnRhaW5lZCBpbiBhIGNoaWxkCi0gICAgICogPGNvZGU+VGV4dDwvY29kZT4gbm9kZS4gQ2xvbmluZyBhbiA8Y29kZT5BdHRyaWJ1dGU8L2NvZGU+IGRpcmVjdGx5LCBhcyBvcHBvc2VkIHRvIGJlIGNsb25lZAotICAgICAqIGFzIHBhcnQgb2YgYW4gPGNvZGU+RWxlbWVudDwvY29kZT4gY2xvbmluZyBvcGVyYXRpb24sIHJldHVybnMgYSBzcGVjaWZpZWQgYXR0cmlidXRlICgKLSAgICAgKiA8Y29kZT5zcGVjaWZpZWQ8L2NvZGU+IGlzIDxjb2RlPnRydWU8L2NvZGU+KS4gQ2xvbmluZyBhbnkgb3RoZXIgdHlwZSBvZiBub2RlIHNpbXBseSByZXR1cm5zIGEKLSAgICAgKiBjb3B5IG9mIHRoaXMgbm9kZS4gPGJyPk5vdGUgdGhhdCBjbG9uaW5nIGFuIGltbXV0YWJsZSBzdWJ0cmVlIHJlc3VsdHMgaW4gYSBtdXRhYmxlIGNvcHksIGJ1dAotICAgICAqIHRoZSBjaGlsZHJlbiBvZiBhbiA8Y29kZT5FbnRpdHlSZWZlcmVuY2U8L2NvZGU+IGNsb25lIGFyZSByZWFkb25seSAuIEluIGFkZGl0aW9uLCBjbG9uZXMgb2YKLSAgICAgKiB1bnNwZWNpZmllZCA8Y29kZT5BdHRyPC9jb2RlPiBub2RlcyBhcmUgc3BlY2lmaWVkLiBBbmQsIGNsb25pbmcgPGNvZGU+RG9jdW1lbnQ8L2NvZGU+LAotICAgICAqIDxjb2RlPkRvY3VtZW50VHlwZTwvY29kZT4sIDxjb2RlPkVudGl0eTwvY29kZT4sIGFuZCA8Y29kZT5Ob3RhdGlvbjwvY29kZT4gbm9kZXMgaXMKLSAgICAgKiBpbXBsZW1lbnRhdGlvbiBkZXBlbmRlbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZGVlcCBJZiA8Y29kZT50cnVlPC9jb2RlPiwgcmVjdXJzaXZlbHkgY2xvbmUgdGhlIHN1YnRyZWUgdW5kZXIgdGhlIHNwZWNpZmllZCBub2RlOyBpZgotICAgICAqICAgICAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiwgY2xvbmUgb25seSB0aGUgbm9kZSBpdHNlbGYgKGFuZCBpdHMgYXR0cmlidXRlcywgaWYgaXQgaXMgYW4KLSAgICAgKiAgICAgICAgICAgICA8Y29kZT5FbGVtZW50PC9jb2RlPikuCi0gICAgICogQHJldHVybiBUaGUgZHVwbGljYXRlIG5vZGUuCi0gICAgICovCi0gICAgcHVibGljIE5vZGUgY2xvbmVOb2RlKGJvb2xlYW4gZGVlcCkgewotICAgICAgICByZXR1cm4gZG9jdW1lbnQuY2xvbmVOb2RlKGRlZXApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFB1dHMgYWxsIDxjb2RlPlRleHQ8L2NvZGU+IG5vZGVzIGluIHRoZSBmdWxsIGRlcHRoIG9mIHRoZSBzdWItdHJlZSB1bmRlcm5lYXRoIHRoaXMKLSAgICAgKiA8Y29kZT5Ob2RlPC9jb2RlPiwgaW5jbHVkaW5nIGF0dHJpYnV0ZSBub2RlcywgaW50byBhICJub3JtYWwiIGZvcm0gd2hlcmUgb25seSBzdHJ1Y3R1cmUKLSAgICAgKiAoZS5nLiwgZWxlbWVudHMsIGNvbW1lbnRzLCBwcm9jZXNzaW5nIGluc3RydWN0aW9ucywgQ0RBVEEgc2VjdGlvbnMsIGFuZCBlbnRpdHkgcmVmZXJlbmNlcykKLSAgICAgKiBzZXBhcmF0ZXMgPGNvZGU+VGV4dDwvY29kZT4gbm9kZXMsIGkuZS4sIHRoZXJlIGFyZSBuZWl0aGVyIGFkamFjZW50IDxjb2RlPlRleHQ8L2NvZGU+IG5vZGVzCi0gICAgICogbm9yIGVtcHR5IDxjb2RlPlRleHQ8L2NvZGU+IG5vZGVzLiBUaGlzIGNhbiBiZSB1c2VkIHRvIGVuc3VyZSB0aGF0IHRoZSBET00gdmlldyBvZiBhIGRvY3VtZW50Ci0gICAgICogaXMgdGhlIHNhbWUgYXMgaWYgaXQgd2VyZSBzYXZlZCBhbmQgcmUtbG9hZGVkLCBhbmQgaXMgdXNlZnVsIHdoZW4gb3BlcmF0aW9ucyAoc3VjaCBhcwotICAgICAqIFhQb2ludGVyICBsb29rdXBzKSB0aGF0IGRlcGVuZCBvbiBhIHBhcnRpY3VsYXIgZG9jdW1lbnQgdHJlZSBzdHJ1Y3R1cmUgYXJlIHRvIGJlIHVzZWQuSW4KLSAgICAgKiBjYXNlcyB3aGVyZSB0aGUgZG9jdW1lbnQgY29udGFpbnMgPGNvZGU+Q0RBVEFTZWN0aW9uczwvY29kZT4sIHRoZSBub3JtYWxpemUgb3BlcmF0aW9uIGFsb25lCi0gICAgICogbWF5IG5vdCBiZSBzdWZmaWNpZW50LCBzaW5jZSBYUG9pbnRlcnMgZG8gbm90IGRpZmZlcmVudGlhdGUgYmV0d2VlbiA8Y29kZT5UZXh0PC9jb2RlPiBub2RlcwotICAgICAqIGFuZCA8Y29kZT5DREFUQVNlY3Rpb248L2NvZGU+IG5vZGVzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG5vcm1hbGl6ZSgpIHsKLSAgICAgICAgZG9jdW1lbnQubm9ybWFsaXplKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgd2hldGhlciB0aGUgRE9NIGltcGxlbWVudGF0aW9uIGltcGxlbWVudHMgYSBzcGVjaWZpYyBmZWF0dXJlIGFuZCB0aGF0IGZlYXR1cmUgaXMKLSAgICAgKiBzdXBwb3J0ZWQgYnkgdGhpcyBub2RlLgotICAgICAqCi0gICAgICogQHBhcmFtIGZlYXR1cmUgVGhlIG5hbWUgb2YgdGhlIGZlYXR1cmUgdG8gdGVzdC4gVGhpcyBpcyB0aGUgc2FtZSBuYW1lIHdoaWNoIGNhbiBiZSBwYXNzZWQgdG8KLSAgICAgKiAgICAgICAgICAgICAgICB0aGUgbWV0aG9kIDxjb2RlPmhhc0ZlYXR1cmU8L2NvZGU+IG9uIDxjb2RlPkRPTUltcGxlbWVudGF0aW9uPC9jb2RlPi4KLSAgICAgKiBAcGFyYW0gdmVyc2lvbiBUaGlzIGlzIHRoZSB2ZXJzaW9uIG51bWJlciBvZiB0aGUgZmVhdHVyZSB0byB0ZXN0LiBJbiBMZXZlbCAyLCB2ZXJzaW9uIDEsIHRoaXMKLSAgICAgKiAgICAgICAgICAgICAgICBpcyB0aGUgc3RyaW5nICIyLjAiLiBJZiB0aGUgdmVyc2lvbiBpcyBub3Qgc3BlY2lmaWVkLCBzdXBwb3J0aW5nIGFueSB2ZXJzaW9uCi0gICAgICogICAgICAgICAgICAgICAgb2YgdGhlIGZlYXR1cmUgd2lsbCBjYXVzZSB0aGUgbWV0aG9kIHRvIHJldHVybiA8Y29kZT50cnVlPC9jb2RlPi4KLSAgICAgKiBAcmV0dXJuIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNwZWNpZmllZCBmZWF0dXJlIGlzIHN1cHBvcnRlZCBvbiB0aGlzIG5vZGUsCi0gICAgICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotICAgICAqIEBzaW5jZSBET00gTGV2ZWwgMgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzU3VwcG9ydGVkKFN0cmluZyBmZWF0dXJlLCBTdHJpbmcgdmVyc2lvbikgewotICAgICAgICByZXR1cm4gZG9jdW1lbnQuaXNTdXBwb3J0ZWQoZmVhdHVyZSwgdmVyc2lvbik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIG5hbWVzcGFjZSBVUkkgb2YgdGhpcyBub2RlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBpdCBpcyB1bnNwZWNpZmllZC4gPGJyPlRoaXMgaXMgbm90IGEKLSAgICAgKiBjb21wdXRlZCB2YWx1ZSB0aGF0IGlzIHRoZSByZXN1bHQgb2YgYSBuYW1lc3BhY2UgbG9va3VwIGJhc2VkIG9uIGFuIGV4YW1pbmF0aW9uIG9mIHRoZQotICAgICAqIG5hbWVzcGFjZSBkZWNsYXJhdGlvbnMgaW4gc2NvcGUuIEl0IGlzIG1lcmVseSB0aGUgbmFtZXNwYWNlIFVSSSBnaXZlbiBhdCBjcmVhdGlvbiB0aW1lLgotICAgICAqIDxicj5Gb3Igbm9kZXMgb2YgYW55IHR5cGUgb3RoZXIgdGhhbiA8Y29kZT5FTEVNRU5UX05PREU8L2NvZGU+IGFuZAotICAgICAqIDxjb2RlPkFUVFJJQlVURV9OT0RFPC9jb2RlPiBhbmQgbm9kZXMgY3JlYXRlZCB3aXRoIGEgRE9NIExldmVsIDEgbWV0aG9kLCBzdWNoIGFzCi0gICAgICogPGNvZGU+Y3JlYXRlRWxlbWVudDwvY29kZT4gZnJvbSB0aGUgPGNvZGU+RG9jdW1lbnQ8L2NvZGU+IGludGVyZmFjZSwgdGhpcyBpcyBhbHdheXMKLSAgICAgKiA8Y29kZT5udWxsPC9jb2RlPi5QZXIgdGhlIE5hbWVzcGFjZXMgaW4gWE1MIFNwZWNpZmljYXRpb24gIGFuIGF0dHJpYnV0ZSBkb2VzIG5vdCBpbmhlcml0IGl0cwotICAgICAqIG5hbWVzcGFjZSBmcm9tIHRoZSBlbGVtZW50IGl0IGlzIGF0dGFjaGVkIHRvLiBJZiBhbiBhdHRyaWJ1dGUgaXMgbm90IGV4cGxpY2l0bHkgZ2l2ZW4gYQotICAgICAqIG5hbWVzcGFjZSwgaXQgc2ltcGx5IGhhcyBubyBuYW1lc3BhY2UuCi0gICAgICoKLSAgICAgKiBAc2luY2UgRE9NIExldmVsIDIKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVVSSSgpIHsKLSAgICAgICAgcmV0dXJuIGRvY3VtZW50LmdldE5hbWVzcGFjZVVSSSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSBuYW1lc3BhY2UgcHJlZml4IG9mIHRoaXMgbm9kZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgaXQgaXMgdW5zcGVjaWZpZWQuIDxicj5Ob3RlIHRoYXQKLSAgICAgKiBzZXR0aW5nIHRoaXMgYXR0cmlidXRlLCB3aGVuIHBlcm1pdHRlZCwgY2hhbmdlcyB0aGUgPGNvZGU+bm9kZU5hbWU8L2NvZGU+IGF0dHJpYnV0ZSwgd2hpY2gKLSAgICAgKiBob2xkcyB0aGUgcXVhbGlmaWVkIG5hbWUsIGFzIHdlbGwgYXMgdGhlIDxjb2RlPnRhZ05hbWU8L2NvZGU+IGFuZCA8Y29kZT5uYW1lPC9jb2RlPgotICAgICAqIGF0dHJpYnV0ZXMgb2YgdGhlIDxjb2RlPkVsZW1lbnQ8L2NvZGU+IGFuZCA8Y29kZT5BdHRyPC9jb2RlPiBpbnRlcmZhY2VzLCB3aGVuIGFwcGxpY2FibGUuCi0gICAgICogPGJyPk5vdGUgYWxzbyB0aGF0IGNoYW5naW5nIHRoZSBwcmVmaXggb2YgYW4gYXR0cmlidXRlIHRoYXQgaXMga25vd24gdG8gaGF2ZSBhIGRlZmF1bHQgdmFsdWUsCi0gICAgICogZG9lcyBub3QgbWFrZSBhIG5ldyBhdHRyaWJ1dGUgd2l0aCB0aGUgZGVmYXVsdCB2YWx1ZSBhbmQgdGhlIG9yaWdpbmFsIHByZWZpeCBhcHBlYXIsIHNpbmNlCi0gICAgICogdGhlIDxjb2RlPm5hbWVzcGFjZVVSSTwvY29kZT4gYW5kIDxjb2RlPmxvY2FsTmFtZTwvY29kZT4gZG8gbm90IGNoYW5nZS4gPGJyPkZvciBub2RlcyBvZiBhbnkKLSAgICAgKiB0eXBlIG90aGVyIHRoYW4gPGNvZGU+RUxFTUVOVF9OT0RFPC9jb2RlPiBhbmQgPGNvZGU+QVRUUklCVVRFX05PREU8L2NvZGU+IGFuZCBub2RlcyBjcmVhdGVkCi0gICAgICogd2l0aCBhIERPTSBMZXZlbCAxIG1ldGhvZCwgc3VjaCBhcyA8Y29kZT5jcmVhdGVFbGVtZW50PC9jb2RlPiBmcm9tIHRoZSA8Y29kZT5Eb2N1bWVudDwvY29kZT4KLSAgICAgKiBpbnRlcmZhY2UsIHRoaXMgaXMgYWx3YXlzIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqCi0gICAgICogQHRocm93cyBET01FeGNlcHRpb24gSU5WQUxJRF9DSEFSQUNURVJfRVJSOiBSYWlzZWQgaWYgdGhlIHNwZWNpZmllZCBwcmVmaXggY29udGFpbnMgYW4KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBpbGxlZ2FsIGNoYXJhY3RlciwgcGVyIHRoZSBYTUwgMS4wIHNwZWNpZmljYXRpb24gLgotICAgICAqICAgICAgICAgICAgICAgICAgICAgIDxicj5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIG5vZGUgaXMgcmVhZG9ubHkuCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgPGJyPk5BTUVTUEFDRV9FUlI6IFJhaXNlZCBpZiB0aGUgc3BlY2lmaWVkIDxjb2RlPnByZWZpeDwvY29kZT4gaXMKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBtYWxmb3JtZWQgcGVyIHRoZSBOYW1lc3BhY2VzIGluIFhNTCBzcGVjaWZpY2F0aW9uLCBpZiB0aGUKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICA8Y29kZT5uYW1lc3BhY2VVUkk8L2NvZGU+IG9mIHRoaXMgbm9kZSBpcyA8Y29kZT5udWxsPC9jb2RlPiwgaWYgdGhlCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVkIHByZWZpeCBpcyAieG1sIiBhbmQgdGhlIDxjb2RlPm5hbWVzcGFjZVVSSTwvY29kZT4gb2YgdGhpcyBub2RlCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgaXMgZGlmZmVyZW50IGZyb20gImh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIsIGlmIHRoaXMgbm9kZQotICAgICAqICAgICAgICAgICAgICAgICAgICAgIGlzIGFuIGF0dHJpYnV0ZSBhbmQgdGhlIHNwZWNpZmllZCBwcmVmaXggaXMgInhtbG5zIiBhbmQgdGhlCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgPGNvZGU+bmFtZXNwYWNlVVJJPC9jb2RlPiBvZiB0aGlzIG5vZGUgaXMgZGlmZmVyZW50IGZyb20gIgotICAgICAqICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cudzMub3JnLzIwMDAveG1sbnMvIiwgb3IgaWYgdGhpcyBub2RlIGlzIGFuIGF0dHJpYnV0ZSBhbmQgdGhlCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgPGNvZGU+cXVhbGlmaWVkTmFtZTwvY29kZT4gb2YgdGhpcyBub2RlIGlzICJ4bWxucyIgLgotICAgICAqIEBzaW5jZSBET00gTGV2ZWwgMgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KCkgewotICAgICAgICByZXR1cm4gZG9jdW1lbnQuZ2V0UHJlZml4KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIG5hbWVzcGFjZSBwcmVmaXggb2YgdGhpcyBub2RlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBpdCBpcyB1bnNwZWNpZmllZC4gPGJyPk5vdGUgdGhhdAotICAgICAqIHNldHRpbmcgdGhpcyBhdHRyaWJ1dGUsIHdoZW4gcGVybWl0dGVkLCBjaGFuZ2VzIHRoZSA8Y29kZT5ub2RlTmFtZTwvY29kZT4gYXR0cmlidXRlLCB3aGljaAotICAgICAqIGhvbGRzIHRoZSBxdWFsaWZpZWQgbmFtZSwgYXMgd2VsbCBhcyB0aGUgPGNvZGU+dGFnTmFtZTwvY29kZT4gYW5kIDxjb2RlPm5hbWU8L2NvZGU+Ci0gICAgICogYXR0cmlidXRlcyBvZiB0aGUgPGNvZGU+RWxlbWVudDwvY29kZT4gYW5kIDxjb2RlPkF0dHI8L2NvZGU+IGludGVyZmFjZXMsIHdoZW4gYXBwbGljYWJsZS4KLSAgICAgKiA8YnI+Tm90ZSBhbHNvIHRoYXQgY2hhbmdpbmcgdGhlIHByZWZpeCBvZiBhbiBhdHRyaWJ1dGUgdGhhdCBpcyBrbm93biB0byBoYXZlIGEgZGVmYXVsdCB2YWx1ZSwKLSAgICAgKiBkb2VzIG5vdCBtYWtlIGEgbmV3IGF0dHJpYnV0ZSB3aXRoIHRoZSBkZWZhdWx0IHZhbHVlIGFuZCB0aGUgb3JpZ2luYWwgcHJlZml4IGFwcGVhciwgc2luY2UKLSAgICAgKiB0aGUgPGNvZGU+bmFtZXNwYWNlVVJJPC9jb2RlPiBhbmQgPGNvZGU+bG9jYWxOYW1lPC9jb2RlPiBkbyBub3QgY2hhbmdlLiA8YnI+Rm9yIG5vZGVzIG9mIGFueQotICAgICAqIHR5cGUgb3RoZXIgdGhhbiA8Y29kZT5FTEVNRU5UX05PREU8L2NvZGU+IGFuZCA8Y29kZT5BVFRSSUJVVEVfTk9ERTwvY29kZT4gYW5kIG5vZGVzIGNyZWF0ZWQKLSAgICAgKiB3aXRoIGEgRE9NIExldmVsIDEgbWV0aG9kLCBzdWNoIGFzIDxjb2RlPmNyZWF0ZUVsZW1lbnQ8L2NvZGU+IGZyb20gdGhlIDxjb2RlPkRvY3VtZW50PC9jb2RlPgotICAgICAqIGludGVyZmFjZSwgdGhpcyBpcyBhbHdheXMgPGNvZGU+bnVsbDwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIERPTUV4Y2VwdGlvbiBJTlZBTElEX0NIQVJBQ1RFUl9FUlI6IFJhaXNlZCBpZiB0aGUgc3BlY2lmaWVkIHByZWZpeCBjb250YWlucyBhbgotICAgICAqICAgICAgICAgICAgICAgICAgICAgIGlsbGVnYWwgY2hhcmFjdGVyLCBwZXIgdGhlIFhNTCAxLjAgc3BlY2lmaWNhdGlvbiAuCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgPGJyPk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgbm9kZSBpcyByZWFkb25seS4KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICA8YnI+TkFNRVNQQUNFX0VSUjogUmFpc2VkIGlmIHRoZSBzcGVjaWZpZWQgPGNvZGU+cHJlZml4PC9jb2RlPiBpcwotICAgICAqICAgICAgICAgICAgICAgICAgICAgIG1hbGZvcm1lZCBwZXIgdGhlIE5hbWVzcGFjZXMgaW4gWE1MIHNwZWNpZmljYXRpb24sIGlmIHRoZQotICAgICAqICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPm5hbWVzcGFjZVVSSTwvY29kZT4gb2YgdGhpcyBub2RlIGlzIDxjb2RlPm51bGw8L2NvZGU+LCBpZiB0aGUKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZWQgcHJlZml4IGlzICJ4bWwiIGFuZCB0aGUgPGNvZGU+bmFtZXNwYWNlVVJJPC9jb2RlPiBvZiB0aGlzIG5vZGUKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBpcyBkaWZmZXJlbnQgZnJvbSAiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIiwgaWYgdGhpcyBub2RlCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgaXMgYW4gYXR0cmlidXRlIGFuZCB0aGUgc3BlY2lmaWVkIHByZWZpeCBpcyAieG1sbnMiIGFuZCB0aGUKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICA8Y29kZT5uYW1lc3BhY2VVUkk8L2NvZGU+IG9mIHRoaXMgbm9kZSBpcyBkaWZmZXJlbnQgZnJvbSAiCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy53My5vcmcvMjAwMC94bWxucy8iLCBvciBpZiB0aGlzIG5vZGUgaXMgYW4gYXR0cmlidXRlIGFuZCB0aGUKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICA8Y29kZT5xdWFsaWZpZWROYW1lPC9jb2RlPiBvZiB0aGlzIG5vZGUgaXMgInhtbG5zIiAuCi0gICAgICogQHNpbmNlIERPTSBMZXZlbCAyCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UHJlZml4KFN0cmluZyBhcmcwKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLSAgICAgICAgZG9jdW1lbnQuc2V0UHJlZml4KGFyZzApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGxvY2FsIHBhcnQgb2YgdGhlIHF1YWxpZmllZCBuYW1lIG9mIHRoaXMgbm9kZS4gPGJyPkZvciBub2RlcyBvZiBhbnkgdHlwZSBvdGhlcgotICAgICAqIHRoYW4gPGNvZGU+RUxFTUVOVF9OT0RFPC9jb2RlPiBhbmQgPGNvZGU+QVRUUklCVVRFX05PREU8L2NvZGU+IGFuZCBub2RlcyBjcmVhdGVkIHdpdGggYSBET00KLSAgICAgKiBMZXZlbCAxIG1ldGhvZCwgc3VjaCBhcyA8Y29kZT5jcmVhdGVFbGVtZW50PC9jb2RlPiBmcm9tIHRoZSA8Y29kZT5Eb2N1bWVudDwvY29kZT4gaW50ZXJmYWNlLAotICAgICAqIHRoaXMgaXMgYWx3YXlzIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqCi0gICAgICogQHNpbmNlIERPTSBMZXZlbCAyCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRMb2NhbE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBkb2N1bWVudC5nZXRMb2NhbE5hbWUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBub2RlIChpZiBpdCBpcyBhbiBlbGVtZW50KSBoYXMgYW55IGF0dHJpYnV0ZXMuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgbm9kZSBoYXMgYW55IGF0dHJpYnV0ZXMsIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0gICAgICogQHNpbmNlIERPTSBMZXZlbCAyCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaGFzQXR0cmlidXRlcygpIHsKLSAgICAgICAgcmV0dXJuIGRvY3VtZW50Lmhhc0F0dHJpYnV0ZXMoKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRNZXNzYWdlKFNPQVBNZXNzYWdlSW1wbCBtZXNzYWdlKSB7Ci0gICAgICAgIHNvYXBNZXNzYWdlID0gbWVzc2FnZTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIERPTS1MZXZlbCAzIG1ldGhvZHMKLSAgICAgKi8KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QmFzZVVSSSgpIHsKLSAgICAgICAgcmV0dXJuIGRvY3VtZW50LmdldEJhc2VVUkkoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc2hvcnQgY29tcGFyZURvY3VtZW50UG9zaXRpb24oTm9kZSBub2RlKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGRvY3VtZW50LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKG5vZGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dENvbnRlbnQoKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGRvY3VtZW50LmdldFRleHRDb250ZW50KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VGV4dENvbnRlbnQoU3RyaW5nIHRleHRDb250ZW50KSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLSAgICAgICAgZG9jdW1lbnQuc2V0VGV4dENvbnRlbnQodGV4dENvbnRlbnQpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzU2FtZU5vZGUoTm9kZSBvdGhlcikgewotICAgICAgICByZXR1cm4gZG9jdW1lbnQuaXNTYW1lTm9kZShvdGhlcik7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBsb29rdXBQcmVmaXgoU3RyaW5nIG5hbWVzcGFjZVVSSSkgewotICAgICAgICByZXR1cm4gZG9jdW1lbnQubG9va3VwUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0TmFtZXNwYWNlKFN0cmluZyBuYW1lc3BhY2VVUkkpIHsKLSAgICAgICAgcmV0dXJuIGRvY3VtZW50LmlzRGVmYXVsdE5hbWVzcGFjZShuYW1lc3BhY2VVUkkpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgbG9va3VwTmFtZXNwYWNlVVJJKFN0cmluZyBwcmVmaXgpIHsKLSAgICAgICAgcmV0dXJuIGRvY3VtZW50Lmxvb2t1cE5hbWVzcGFjZVVSSShwcmVmaXgpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRXF1YWxOb2RlKE5vZGUgbm9kZSkgewotICAgICAgICByZXR1cm4gZG9jdW1lbnQuaXNFcXVhbE5vZGUobm9kZSk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRGZWF0dXJlKFN0cmluZyBmZWF0dXJlLCBTdHJpbmcgdmVyc2lvbikgewotICAgICAgICByZXR1cm4gZG9jdW1lbnQuZ2V0RmVhdHVyZShmZWF0dXJlLCB2ZXJzaW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IHNldFVzZXJEYXRhKFN0cmluZyBrZXksIE9iamVjdCBkYXRhLCBVc2VyRGF0YUhhbmRsZXIgaGFuZGxlcikgewotICAgICAgICByZXR1cm4gZG9jdW1lbnQuc2V0VXNlckRhdGEoa2V5LCBkYXRhLCBoYW5kbGVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldFVzZXJEYXRhKFN0cmluZyBrZXkpIHsKLSAgICAgICAgcmV0dXJuIGRvY3VtZW50LmdldFVzZXJEYXRhKGtleSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLSAgICAJLy9UaGVyZSBhcmUgbm8gaW1tZWRpYXRlIGNoaWxkIHRleHQgbm9kZXMgdG8gc29hcCBwYXJ0Ci0gICAgICAgIHJldHVybiBudWxsOyAgICAgICAgCi0gICAgfSAgICAgICAgCi0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBhcmVudEVsZW1lbnQoU09BUEVsZW1lbnQgcGFyZW50KSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7Ci0gICAgCXRocm93IG5ldyBTT0FQRXhjZXB0aW9uKCJDYW5ub3Qgc2V0IHRoZSBwYXJlbnQgZWxlbWVudCBvZiBTT0FQUGFydCIpOwotICAgIH0KLQotICAgIHB1YmxpYyBTT0FQRWxlbWVudCBnZXRQYXJlbnRFbGVtZW50KCkgewotICAgICAgICByZXR1cm4gbnVsbDsgIC8vU09BUCBwYXJ0IGlzIHRoZSByb290IGVsZW1lbnQKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkZXRhY2hOb2RlKCkgewotICAgICAgICAvL25vdGhpbmcgdG8gZG8gaGVyZQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlY3ljbGVOb2RlKCkgewotICAgICAgICAvL25vdGhpbmcgdG8gZG8gaGVyZQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgewotICAgIAl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDYW5ub3Qgc2V0IHZhbHVlIG9mIFNPQVBQYXJ0LiIpOwotICAgIH0KLSAgICAKLSAgICBqYXZheC54bWwuc29hcC5Ob2RlIHRvU0FBSk5vZGUob3JnLnczYy5kb20uTm9kZSBkb21Ob2RlKSB7Ci0gICAgICAgIHJldHVybiBOb2RlSW1wbEV4LnRvU0FBSk5vZGUoZG9tTm9kZSwgdGhpcyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2Fhai9zcmMvb3JnL2FwYWNoZS9heGlzMi9zYWFqL1RleHRJbXBsRXguamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhYWovc3JjL29yZy9hcGFjaGUvYXhpczIvc2Fhai9UZXh0SW1wbEV4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyNTljNGIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2Fhai9zcmMvb3JnL2FwYWNoZS9heGlzMi9zYWFqL1RleHRJbXBsRXguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2FhajsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01Db250YWluZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuZG9tLkRPT01BYnN0cmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmRvbS5UZXh0SW1wbDsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci0KLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwuc29hcC5UZXh0OwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgVGV4dEltcGxFeCBleHRlbmRzIE5vZGVJbXBsRXggaW1wbGVtZW50cyBUZXh0IHsKLQotICAgIC8vVE9ETzogYXNzaWduIHRleHROb2RlCi0KLSAgICBwcml2YXRlIFRleHRJbXBsIHRleHROb2RlOwotCi0gICAgcHJpdmF0ZSBvcmcudzNjLmRvbS5Ob2RlIHByZXZpb3VzU2libGluZzsKLSAgICBwcml2YXRlIG9yZy53M2MuZG9tLk5vZGUgbmV4dFNpYmxpbmc7Ci0KLSAgICBwdWJsaWMgVGV4dEltcGxFeChTdHJpbmcgZGF0YSwgU09BUEVsZW1lbnQgcGFyZW50KSB7Ci0gICAgICAgIHN1cGVyKCgoU09BUEVsZW1lbnRJbXBsKXBhcmVudCkuZ2V0T01GYWN0b3J5KCkpOwotICAgICAgICB0ZXh0Tm9kZSA9IChUZXh0SW1wbClET09NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpLmNyZWF0ZU9NVGV4dChkYXRhKTsKLSAgICAgICAgdGhpcy5wYXJlbnRFbGVtZW50ID0gcGFyZW50OwotICAgIH0KLQotICAgIHB1YmxpYyBUZXh0SW1wbEV4KFN0cmluZyBkYXRhLCBTT0FQRWxlbWVudCBwYXJlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZSBwcmV2U2libGluZywgb3JnLnczYy5kb20uTm9kZSBuZXh0U2libGluZykgewotICAgICAgICBzdXBlcigoKFNPQVBFbGVtZW50SW1wbClwYXJlbnQpLmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgdGV4dE5vZGUgPSAoVGV4dEltcGwpRE9PTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKS5jcmVhdGVPTVRleHQoZGF0YSk7Ci0gICAgICAgIHRoaXMucGFyZW50RWxlbWVudCA9IHBhcmVudDsKLSAgICAgICAgdGhpcy5wcmV2aW91c1NpYmxpbmcgPSBwcmV2U2libGluZzsKLSAgICAgICAgdGhpcy5uZXh0U2libGluZyA9IG5leHRTaWJsaW5nOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE5leHRTaWJsaW5nKG9yZy53M2MuZG9tLk5vZGUgbmV4dFNpYmxpbmcpIHsKLSAgICAgICAgdGhpcy5uZXh0U2libGluZyA9IG5leHRTaWJsaW5nOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFByZXZpb3VzU2libGluZyhvcmcudzNjLmRvbS5Ob2RlIHByZXZpb3VzU2libGluZykgewotICAgICAgICB0aGlzLnByZXZpb3VzU2libGluZyA9IHByZXZpb3VzU2libGluZzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXRyaWV2ZXMgd2hldGhlciB0aGlzIDxDT0RFPlRleHQ8L0NPREU+IG9iamVjdCByZXByZXNlbnRzIGEgY29tbWVudC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gPENPREU+dHJ1ZTwvQ09ERT4gaWYgdGhpcyA8Q09ERT5UZXh0PC9DT0RFPiBvYmplY3QgaXMgYSBjb21tZW50OyA8Q09ERT5mYWxzZTwvQ09ERT4KLSAgICAgKiAgICAgICAgIG90aGVyd2lzZQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzQ29tbWVudCgpIHsKLSAgICAgICAgU3RyaW5nIHZhbHVlID0gdGV4dE5vZGUuZ2V0VGV4dCgpOwotICAgICAgICByZXR1cm4gdmFsdWUuc3RhcnRzV2l0aCgiPCEtLSIpICYmIHZhbHVlLmVuZHNXaXRoKCItLT4iKTsKLSAgICB9Ci0KLSAgICAvKiogVGhlIG5hbWUgb2YgdGhpcyBub2RlLCBkZXBlbmRpbmcgb24gaXRzIHR5cGU7IHNlZSB0aGUgdGFibGUgYWJvdmUuICovCi0gICAgcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHRleHROb2RlLmdldE5vZGVOYW1lKCk7Ci0gICAgfQotCi0gICAgLyoqIEEgY29kZSByZXByZXNlbnRpbmcgdGhlIHR5cGUgb2YgdGhlIHVuZGVybHlpbmcgb2JqZWN0LCBhcyBkZWZpbmVkIGFib3ZlLiAqLwotICAgIHB1YmxpYyBzaG9ydCBnZXROb2RlVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIHRleHROb2RlLmdldE5vZGVUeXBlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQnJlYWtzIHRoaXMgbm9kZSBpbnRvIHR3byBub2RlcyBhdCB0aGUgc3BlY2lmaWVkIDxjb2RlPm9mZnNldDwvY29kZT4sIGtlZXBpbmcgYm90aCBpbiB0aGUKLSAgICAgKiB0cmVlIGFzIHNpYmxpbmdzLiBBZnRlciBiZWluZyBzcGxpdCwgdGhpcyBub2RlIHdpbGwgY29udGFpbiBhbGwgdGhlIGNvbnRlbnQgdXAgdG8gdGhlCi0gICAgICogPGNvZGU+b2Zmc2V0PC9jb2RlPiBwb2ludC4gQSBuZXcgbm9kZSBvZiB0aGUgc2FtZSB0eXBlLCB3aGljaCBjb250YWlucyBhbGwgdGhlIGNvbnRlbnQgYXQgYW5kCi0gICAgICogYWZ0ZXIgdGhlIDxjb2RlPm9mZnNldDwvY29kZT4gcG9pbnQsIGlzIHJldHVybmVkLiBJZiB0aGUgb3JpZ2luYWwgbm9kZSBoYWQgYSBwYXJlbnQgbm9kZSwgdGhlCi0gICAgICogbmV3IG5vZGUgaXMgaW5zZXJ0ZWQgYXMgdGhlIG5leHQgc2libGluZyBvZiB0aGUgb3JpZ2luYWwgbm9kZS4gV2hlbiB0aGUgPGNvZGU+b2Zmc2V0PC9jb2RlPgotICAgICAqIGlzIGVxdWFsIHRvIHRoZSBsZW5ndGggb2YgdGhpcyBub2RlLCB0aGUgbmV3IG5vZGUgaGFzIG5vIGRhdGEuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb2Zmc2V0IFRoZSAxNi1iaXQgdW5pdCBvZmZzZXQgYXQgd2hpY2ggdG8gc3BsaXQsIHN0YXJ0aW5nIGZyb20gPGNvZGU+MDwvY29kZT4uCi0gICAgICogQHJldHVybiBUaGUgbmV3IG5vZGUsIG9mIHRoZSBzYW1lIHR5cGUgYXMgdGhpcyBub2RlLgotICAgICAqIEB0aHJvd3MgRE9NRXhjZXB0aW9uIElOREVYX1NJWkVfRVJSOiBSYWlzZWQgaWYgdGhlIHNwZWNpZmllZCBvZmZzZXQgaXMgbmVnYXRpdmUgb3IgZ3JlYXRlcgotICAgICAqICAgICAgICAgICAgICAgICAgICAgIHRoYW4gdGhlIG51bWJlciBvZiAxNi1iaXQgdW5pdHMgaW4gPGNvZGU+ZGF0YTwvY29kZT4uCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgPGJyPk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgbm9kZSBpcyByZWFkb25seS4KLSAgICAgKi8KLSAgICBwdWJsaWMgb3JnLnczYy5kb20uVGV4dCBzcGxpdFRleHQoaW50IG9mZnNldCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiB0ZXh0Tm9kZS5zcGxpdFRleHQob2Zmc2V0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VsZW1lbnRDb250ZW50V2hpdGVzcGFjZSgpIHsKLSAgICAgICAgLy8gVE9ETyAtIEZpeG1lLgotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlRPRE8iKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFdob2xlVGV4dCgpIHsKLSAgICAgICAgLy8gVE9ETyAtIEZpeG1lLgotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlRPRE8iKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgb3JnLnczYy5kb20uVGV4dCByZXBsYWNlV2hvbGVUZXh0KFN0cmluZyBjb250ZW50KSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gVE9ETyAtIEZpeG1lLgotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlRPRE8iKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2hhcmFjdGVyIGRhdGEgb2YgdGhlIG5vZGUgdGhhdCBpbXBsZW1lbnRzIHRoaXMgaW50ZXJmYWNlLiBUaGUgRE9NIGltcGxlbWVudGF0aW9uIG1heSBub3QKLSAgICAgKiBwdXQgYXJiaXRyYXJ5IGxpbWl0cyBvbiB0aGUgYW1vdW50IG9mIGRhdGEgdGhhdCBtYXkgYmUgc3RvcmVkIGluIGEgPGNvZGU+Q2hhcmFjdGVyRGF0YTwvY29kZT4KLSAgICAgKiBub2RlLiBIb3dldmVyLCBpbXBsZW1lbnRhdGlvbiBsaW1pdHMgbWF5IG1lYW4gdGhhdCB0aGUgZW50aXJldHkgb2YgYSBub2RlJ3MgZGF0YSBtYXkgbm90IGZpdAotICAgICAqIGludG8gYSBzaW5nbGUgPGNvZGU+RE9NU3RyaW5nPC9jb2RlPi4gSW4gc3VjaCBjYXNlcywgdGhlIHVzZXIgbWF5IGNhbGwKLSAgICAgKiA8Y29kZT5zdWJzdHJpbmdEYXRhPC9jb2RlPiB0byByZXRyaWV2ZSB0aGUgZGF0YSBpbiBhcHByb3ByaWF0ZWx5IHNpemVkIHBpZWNlcy4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgRE9NRXhjZXB0aW9uIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIHdoZW4gdGhlIG5vZGUgaXMgcmVhZG9ubHkuCi0gICAgICogQHRocm93cyBET01FeGNlcHRpb24gRE9NU1RSSU5HX1NJWkVfRVJSOiBSYWlzZWQgd2hlbiBpdCB3b3VsZCByZXR1cm4gbW9yZSBjaGFyYWN0ZXJzIHRoYW4gZml0Ci0gICAgICogICAgICAgICAgICAgICAgICAgICAgaW4gYSA8Y29kZT5ET01TdHJpbmc8L2NvZGU+IHZhcmlhYmxlIG9uIHRoZSBpbXBsZW1lbnRhdGlvbiBwbGF0Zm9ybS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldERhdGEoKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIHRleHROb2RlLmdldERhdGEoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2hhcmFjdGVyIGRhdGEgb2YgdGhlIG5vZGUgdGhhdCBpbXBsZW1lbnRzIHRoaXMgaW50ZXJmYWNlLiBUaGUgRE9NIGltcGxlbWVudGF0aW9uIG1heSBub3QKLSAgICAgKiBwdXQgYXJiaXRyYXJ5IGxpbWl0cyBvbiB0aGUgYW1vdW50IG9mIGRhdGEgdGhhdCBtYXkgYmUgc3RvcmVkIGluIGEgPGNvZGU+Q2hhcmFjdGVyRGF0YTwvY29kZT4KLSAgICAgKiBub2RlLiBIb3dldmVyLCBpbXBsZW1lbnRhdGlvbiBsaW1pdHMgbWF5IG1lYW4gdGhhdCB0aGUgZW50aXJldHkgb2YgYSBub2RlJ3MgZGF0YSBtYXkgbm90IGZpdAotICAgICAqIGludG8gYSBzaW5nbGUgPGNvZGU+RE9NU3RyaW5nPC9jb2RlPi4gSW4gc3VjaCBjYXNlcywgdGhlIHVzZXIgbWF5IGNhbGwKLSAgICAgKiA8Y29kZT5zdWJzdHJpbmdEYXRhPC9jb2RlPiB0byByZXRyaWV2ZSB0aGUgZGF0YSBpbiBhcHByb3ByaWF0ZWx5IHNpemVkIHBpZWNlcy4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgRE9NRXhjZXB0aW9uIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIHdoZW4gdGhlIG5vZGUgaXMgcmVhZG9ubHkuCi0gICAgICogQHRocm93cyBET01FeGNlcHRpb24gRE9NU1RSSU5HX1NJWkVfRVJSOiBSYWlzZWQgd2hlbiBpdCB3b3VsZCByZXR1cm4gbW9yZSBjaGFyYWN0ZXJzIHRoYW4gZml0Ci0gICAgICogICAgICAgICAgICAgICAgICAgICAgaW4gYSA8Y29kZT5ET01TdHJpbmc8L2NvZGU+IHZhcmlhYmxlIG9uIHRoZSBpbXBsZW1lbnRhdGlvbiBwbGF0Zm9ybS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREYXRhKFN0cmluZyBkYXRhKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLSAgICAgICAgdGV4dE5vZGUuc2V0RGF0YShkYXRhKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFeHRyYWN0cyBhIHJhbmdlIG9mIGRhdGEgZnJvbSB0aGUgbm9kZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvZmZzZXQgU3RhcnQgb2Zmc2V0IG9mIHN1YnN0cmluZyB0byBleHRyYWN0LgotICAgICAqIEBwYXJhbSBjb3VudCAgVGhlIG51bWJlciBvZiAxNi1iaXQgdW5pdHMgdG8gZXh0cmFjdC4KLSAgICAgKiBAcmV0dXJuIFRoZSBzcGVjaWZpZWQgc3Vic3RyaW5nLiBJZiB0aGUgc3VtIG9mIDxjb2RlPm9mZnNldDwvY29kZT4gYW5kIDxjb2RlPmNvdW50PC9jb2RlPgotICAgICAqICAgICAgICAgZXhjZWVkcyB0aGUgPGNvZGU+bGVuZ3RoPC9jb2RlPiwgdGhlbiBhbGwgMTYtYml0IHVuaXRzIHRvIHRoZSBlbmQgb2YgdGhlIGRhdGEgYXJlCi0gICAgICogICAgICAgICByZXR1cm5lZC4KLSAgICAgKiBAdGhyb3dzIERPTUV4Y2VwdGlvbiBJTkRFWF9TSVpFX0VSUjogUmFpc2VkIGlmIHRoZSBzcGVjaWZpZWQgPGNvZGU+b2Zmc2V0PC9jb2RlPiBpcyBuZWdhdGl2ZQotICAgICAqICAgICAgICAgICAgICAgICAgICAgIG9yIGdyZWF0ZXIgdGhhbiB0aGUgbnVtYmVyIG9mIDE2LWJpdCB1bml0cyBpbiA8Y29kZT5kYXRhPC9jb2RlPiwgb3IgaWYKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICB0aGUgc3BlY2lmaWVkIDxjb2RlPmNvdW50PC9jb2RlPiBpcyBuZWdhdGl2ZS4gPGJyPkRPTVNUUklOR19TSVpFX0VSUjoKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBSYWlzZWQgaWYgdGhlIHNwZWNpZmllZCByYW5nZSBvZiB0ZXh0IGRvZXMgbm90IGZpdCBpbnRvIGEKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICA8Y29kZT5ET01TdHJpbmc8L2NvZGU+LgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgc3Vic3RyaW5nRGF0YShpbnQgb2Zmc2V0LCBpbnQgY291bnQpIHRocm93cyBET01FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gdGV4dE5vZGUuc3Vic3RyaW5nRGF0YShvZmZzZXQsIGNvdW50KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBcHBlbmQgdGhlIHN0cmluZyB0byB0aGUgZW5kIG9mIHRoZSBjaGFyYWN0ZXIgZGF0YSBvZiB0aGUgbm9kZS4gVXBvbiBzdWNjZXNzLAotICAgICAqIDxjb2RlPmRhdGE8L2NvZGU+IHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgY29uY2F0ZW5hdGlvbiBvZiA8Y29kZT5kYXRhPC9jb2RlPiBhbmQgdGhlCi0gICAgICogPGNvZGU+RE9NU3RyaW5nPC9jb2RlPiBzcGVjaWZpZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIDxjb2RlPkRPTVN0cmluZzwvY29kZT4gdG8gYXBwZW5kLgotICAgICAqIEB0aHJvd3MgRE9NRXhjZXB0aW9uIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgbm9kZSBpcyByZWFkb25seS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhcHBlbmREYXRhKFN0cmluZyB2YWx1ZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRleHROb2RlLmFwcGVuZERhdGEodmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluc2VydCBhIHN0cmluZyBhdCB0aGUgc3BlY2lmaWVkIDE2LWJpdCB1bml0IG9mZnNldC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvZmZzZXQgVGhlIGNoYXJhY3RlciBvZmZzZXQgYXQgd2hpY2ggdG8gaW5zZXJ0LgotICAgICAqIEBwYXJhbSBkYXRhICAgVGhlIDxjb2RlPkRPTVN0cmluZzwvY29kZT4gdG8gaW5zZXJ0LgotICAgICAqIEB0aHJvd3MgRE9NRXhjZXB0aW9uIElOREVYX1NJWkVfRVJSOiBSYWlzZWQgaWYgdGhlIHNwZWNpZmllZCA8Y29kZT5vZmZzZXQ8L2NvZGU+IGlzIG5lZ2F0aXZlCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgb3IgZ3JlYXRlciB0aGFuIHRoZSBudW1iZXIgb2YgMTYtYml0IHVuaXRzIGluIDxjb2RlPmRhdGE8L2NvZGU+LgotICAgICAqICAgICAgICAgICAgICAgICAgICAgIDxicj5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIG5vZGUgaXMgcmVhZG9ubHkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW5zZXJ0RGF0YShpbnQgb2Zmc2V0LCBTdHJpbmcgZGF0YSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRleHROb2RlLmluc2VydERhdGEob2Zmc2V0LCBkYXRhKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmUgYSByYW5nZSBvZiAxNi1iaXQgdW5pdHMgZnJvbSB0aGUgbm9kZS4gVXBvbiBzdWNjZXNzLCA8Y29kZT5kYXRhPC9jb2RlPiBhbmQKLSAgICAgKiA8Y29kZT5sZW5ndGg8L2NvZGU+IHJlZmxlY3QgdGhlIGNoYW5nZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvZmZzZXQgVGhlIG9mZnNldCBmcm9tIHdoaWNoIHRvIHN0YXJ0IHJlbW92aW5nLgotICAgICAqIEBwYXJhbSBjb3VudCAgVGhlIG51bWJlciBvZiAxNi1iaXQgdW5pdHMgdG8gZGVsZXRlLiBJZiB0aGUgc3VtIG9mIDxjb2RlPm9mZnNldDwvY29kZT4gYW5kCi0gICAgICogICAgICAgICAgICAgICA8Y29kZT5jb3VudDwvY29kZT4gZXhjZWVkcyA8Y29kZT5sZW5ndGg8L2NvZGU+IHRoZW4gYWxsIDE2LWJpdCB1bml0cyBmcm9tCi0gICAgICogICAgICAgICAgICAgICA8Y29kZT5vZmZzZXQ8L2NvZGU+IHRvIHRoZSBlbmQgb2YgdGhlIGRhdGEgYXJlIGRlbGV0ZWQuCi0gICAgICogQHRocm93cyBET01FeGNlcHRpb24gSU5ERVhfU0laRV9FUlI6IFJhaXNlZCBpZiB0aGUgc3BlY2lmaWVkIDxjb2RlPm9mZnNldDwvY29kZT4gaXMgbmVnYXRpdmUKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBvciBncmVhdGVyIHRoYW4gdGhlIG51bWJlciBvZiAxNi1iaXQgdW5pdHMgaW4gPGNvZGU+ZGF0YTwvY29kZT4sIG9yIGlmCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgdGhlIHNwZWNpZmllZCA8Y29kZT5jb3VudDwvY29kZT4gaXMgbmVnYXRpdmUuIDxicj5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6Ci0gICAgICogICAgICAgICAgICAgICAgICAgICAgUmFpc2VkIGlmIHRoaXMgbm9kZSBpcyByZWFkb25seS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkZWxldGVEYXRhKGludCBvZmZzZXQsIGludCBjb3VudCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRleHROb2RlLmRlbGV0ZURhdGEob2Zmc2V0LCBjb3VudCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVwbGFjZSB0aGUgY2hhcmFjdGVycyBzdGFydGluZyBhdCB0aGUgc3BlY2lmaWVkIDE2LWJpdCB1bml0IG9mZnNldCB3aXRoIHRoZSBzcGVjaWZpZWQKLSAgICAgKiBzdHJpbmcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb2Zmc2V0IFRoZSBvZmZzZXQgZnJvbSB3aGljaCB0byBzdGFydCByZXBsYWNpbmcuCi0gICAgICogQHBhcmFtIGNvdW50ICBUaGUgbnVtYmVyIG9mIDE2LWJpdCB1bml0cyB0byByZXBsYWNlLiBJZiB0aGUgc3VtIG9mIDxjb2RlPm9mZnNldDwvY29kZT4gYW5kCi0gICAgICogICAgICAgICAgICAgICA8Y29kZT5jb3VudDwvY29kZT4gZXhjZWVkcyA8Y29kZT5sZW5ndGg8L2NvZGU+LCB0aGVuIGFsbCAxNi1iaXQgdW5pdHMgdG8gdGhlCi0gICAgICogICAgICAgICAgICAgICBlbmQgb2YgdGhlIGRhdGEgYXJlIHJlcGxhY2VkOyAoaS5lLiwgdGhlIGVmZmVjdCBpcyB0aGUgc2FtZSBhcyBhCi0gICAgICogICAgICAgICAgICAgICA8Y29kZT5yZW1vdmU8L2NvZGU+IG1ldGhvZCBjYWxsIHdpdGggdGhlIHNhbWUgcmFuZ2UsIGZvbGxvd2VkIGJ5IGFuCi0gICAgICogICAgICAgICAgICAgICA8Y29kZT5hcHBlbmQ8L2NvZGU+IG1ldGhvZCBpbnZvY2F0aW9uKS4KLSAgICAgKiBAcGFyYW0gZGF0YSAgIFRoZSA8Y29kZT5ET01TdHJpbmc8L2NvZGU+IHdpdGggd2hpY2ggdGhlIHJhbmdlIG11c3QgYmUgcmVwbGFjZWQuCi0gICAgICogQHRocm93cyBET01FeGNlcHRpb24gSU5ERVhfU0laRV9FUlI6IFJhaXNlZCBpZiB0aGUgc3BlY2lmaWVkIDxjb2RlPm9mZnNldDwvY29kZT4gaXMgbmVnYXRpdmUKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBvciBncmVhdGVyIHRoYW4gdGhlIG51bWJlciBvZiAxNi1iaXQgdW5pdHMgaW4gPGNvZGU+ZGF0YTwvY29kZT4sIG9yIGlmCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgdGhlIHNwZWNpZmllZCA8Y29kZT5jb3VudDwvY29kZT4gaXMgbmVnYXRpdmUuIDxicj5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6Ci0gICAgICogICAgICAgICAgICAgICAgICAgICAgUmFpc2VkIGlmIHRoaXMgbm9kZSBpcyByZWFkb25seS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZXBsYWNlRGF0YShpbnQgb2Zmc2V0LCBpbnQgY291bnQsIFN0cmluZyBkYXRhKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLSAgICAgICAgdGV4dE5vZGUucmVwbGFjZURhdGEob2Zmc2V0LCBjb3VudCwgZGF0YSk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5PTU5vZGVFeCNzZXRQYXJlbnQob3JnLmFwYWNoZS5heGlvbS5vbS5PTUNvbnRhaW5lcikKLSAgICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UGFyZW50KE9NQ29udGFpbmVyIGVsZW1lbnQpIHsKLSAgICAgICAgdGV4dE5vZGUuc2V0UGFyZW50KGVsZW1lbnQpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTm9kZSNnZXRQYXJlbnQoKQotICAgICAgKi8KLSAgICBwdWJsaWMgT01Db250YWluZXIgZ2V0UGFyZW50KCkgewotICAgICAgICByZXR1cm4gdGV4dE5vZGUuZ2V0UGFyZW50KCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpb20ub20uT01Ob2RlI2Rpc2NhcmQoKQotICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkaXNjYXJkKCkgdGhyb3dzIE9NRXhjZXB0aW9uIHsKLSAgICAgICAgdGV4dE5vZGUuZGlzY2FyZCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGludGVybmFsU2VyaWFsaXplKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHdyaXRlcikKLSAgICAgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICB0ZXh0Tm9kZS5pbnRlcm5hbFNlcmlhbGl6ZSh3cml0ZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGludGVybmFsU2VyaWFsaXplQW5kQ29uc3VtZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB3cml0ZXIpCi0gICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgdGV4dE5vZGUuaW50ZXJuYWxTZXJpYWxpemVBbmRDb25zdW1lKHdyaXRlcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0cmlldmUgdGhlIHRleHQgdmFsdWUgKGRhdGEpIG9mIHRoaXMKLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIHRleHQgdmFsdWUgKGRhdGEpIG9mIHRoaXMKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotICAgICAgICByZXR1cm4gdGV4dE5vZGUuZ2V0RGF0YSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Tm9kZVZhbHVlKCkgewotICAgICAgICByZXR1cm4gdGV4dE5vZGUuZ2V0RGF0YSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIElmIHRoaXMgaXMgYSBUZXh0IG5vZGUgdGhlbiB0aGlzIG1ldGhvZCB3aWxsIHNldCBpdHMgdmFsdWUsIG90aGVyd2lzZSBpdCBzZXRzIHRoZSB2YWx1ZSBvZgotICAgICAqIHRoZSBpbW1lZGlhdGUgKFRleHQpIGNoaWxkIG9mIHRoaXMgbm9kZS4gVGhlIHZhbHVlIG9mIHRoZSBpbW1lZGlhdGUgY2hpbGQgb2YgdGhpcyBub2RlIGNhbiBiZQotICAgICAqIHNldCBvbmx5IGlmLCB0aGVyZSBpcyBvbmUgY2hpbGQgbm9kZSBhbmQgdGhhdCBub2RlIGlzIGEgVGV4dCBub2RlLCBvciBpZiB0aGVyZSBhcmUgbm8KLSAgICAgKiBjaGlsZHJlbiBpbiB3aGljaCBjYXNlIGEgY2hpbGQgVGV4dCBub2RlIHdpbGwgYmUgY3JlYXRlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgdGV4dCB0byBzZXQKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGUgbm9kZSBpcyBub3QgYSBUZXh0ICBub2RlIGFuZCBlaXRoZXIgaGFzIG1vcmUgdGhhbiBvbmUKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZCBub2RlIG9yIGhhcyBhIGNoaWxkIG5vZGUgdGhhdCBpcyBub3QgYSBUZXh0IG5vZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgdGV4dE5vZGUuc2V0RGF0YSh2YWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Tm9kZVZhbHVlKFN0cmluZyB2YWx1ZSkgewotICAgICAgICB0ZXh0Tm9kZS5zZXREYXRhKHZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gZ2V0VmFsdWUoKTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyBvcmcudzNjLmRvbS5Ob2RlIGdldE5leHRTaWJsaW5nKCkgewotICAgICAgICByZXR1cm4gdG9TQUFKTm9kZShuZXh0U2libGluZyk7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgb3JnLnczYy5kb20uTm9kZSBnZXRQcmV2aW91c1NpYmxpbmcoKSB7Ci0gICAgICAgIHJldHVybiB0b1NBQUpOb2RlKHByZXZpb3VzU2libGluZyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2Fhai9zcmMvb3JnL2FwYWNoZS9heGlzMi9zYWFqL3V0aWwvSURHZW5lcmF0b3IuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhYWovc3JjL29yZy9hcGFjaGUvYXhpczIvc2Fhai91dGlsL0lER2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkZTE4ODAuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2Fhai9zcmMvb3JnL2FwYWNoZS9heGlzMi9zYWFqL3V0aWwvSURHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zYWFqLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOwotCi0vKiogQ29kZSBib3Jyb3dlZCBmcm9tIEF1dGhlbnRpY2F0b3JCYXNlLmphdmEgZm9yIGdlbmVyYXRpbmcgYSBzZWN1cmUgaWQncy4gKi8KLXB1YmxpYyBjbGFzcyBJREdlbmVyYXRvciB7Ci0KLSAgICAvKiogVGhlIG51bWJlciBvZiByYW5kb20gYnl0ZXMgdG8gaW5jbHVkZSB3aGVuIGdlbmVyYXRpbmcgYSBzZXNzaW9uIGlkZW50aWZpZXIuICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgU0VTU0lPTl9JRF9CWVRFUyA9IDE2OwotCi0gICAgLyoqIEEgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgdG8gdXNlIHdoZW4gZ2VuZXJhdGluZyBzZXNzaW9uIGlkZW50aWZpZXJzLiAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgUmFuZG9tIHJhbmRvbSA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgSmF2YSBjbGFzcyBuYW1lIG9mIHRoZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBjbGFzcyB0byBiZSB1c2VkIHdoZW4gZ2VuZXJhdGluZyBzZXNzaW9uCi0gICAgICogaWRlbnRpZmllcnMuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgcmFuZG9tQ2xhc3MgPSAiamF2YS5zZWN1cml0eS5TZWN1cmVSYW5kb20iOwotCi0gICAgLyoqCi0gICAgICogR2VuZXJhdGUgYW5kIHJldHVybiBhIG5ldyBzZXNzaW9uIGlkZW50aWZpZXIuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGEgbmV3IHNlc3Npb24gaWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCBTdHJpbmcgZ2VuZXJhdGVJRCgpIHsKLSAgICAgICAgLy8gR2VuZXJhdGUgYSBieXRlIGFycmF5IGNvbnRhaW5pbmcgYSBzZXNzaW9uIGlkZW50aWZpZXIKLSAgICAgICAgYnl0ZSBieXRlc1tdID0gbmV3IGJ5dGVbU0VTU0lPTl9JRF9CWVRFU107Ci0KLSAgICAgICAgZ2V0UmFuZG9tKCkubmV4dEJ5dGVzKGJ5dGVzKTsKLQotICAgICAgICAvLyBSZW5kZXIgdGhlIHJlc3VsdCBhcyBhIFN0cmluZyBvZiBoZXhhZGVjaW1hbCBkaWdpdHMKLSAgICAgICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBieXRlIGIxID0gKGJ5dGUpKChieXRlc1tpXSAmIDB4ZjApID4+IDQpOwotICAgICAgICAgICAgYnl0ZSBiMiA9IChieXRlKShieXRlc1tpXSAmIDB4MGYpOwotCi0gICAgICAgICAgICBpZiAoYjEgPCAxMCkgewotICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoKGNoYXIpKCcwJyArIGIxKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoKGNoYXIpKCdBJyArIChiMSAtIDEwKSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGIyIDwgMTApIHsKLSAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKChjaGFyKSgnMCcgKyBiMikpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKChjaGFyKSgnQScgKyAoYjIgLSAxMCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKHJlc3VsdC50b1N0cmluZygpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGluc3RhbmNlIHdlIHNob3VsZCB1c2UgZm9yIGdlbmVyYXRpbmcgc2Vzc2lvbiBpZGVudGlmaWVycy4KLSAgICAgKiBJZiB0aGVyZSBpcyBubyBzdWNoIGdlbmVyYXRvciBjdXJyZW50bHkgZGVmaW5lZCwgY29uc3RydWN0IGFuZCBzZWVkIGEgbmV3IG9uZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gUmFuZG9tIG9iamVjdAotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCBSYW5kb20gZ2V0UmFuZG9tKCkgewotICAgICAgICBpZiAocmFuZG9tID09IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgQ2xhc3MgY2xhenogPSBDbGFzcy5mb3JOYW1lKHJhbmRvbUNsYXNzKTsKLSAgICAgICAgICAgICAgICByYW5kb20gPSAoUmFuZG9tKWNsYXp6Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHJhbmRvbSA9IG5ldyBqYXZhLnV0aWwuUmFuZG9tKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIChyYW5kb20pOwotICAgIH0KLQotfQotCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYWFqL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NhYWovdXRpbC9TQUFKRGF0YVNvdXJjZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvc2Fhai9zcmMvb3JnL2FwYWNoZS9heGlzMi9zYWFqL3V0aWwvU0FBSkRhdGFTb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFkNWU5OS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYWFqL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NhYWovdXRpbC9TQUFKRGF0YVNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zYWFqLnV0aWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5QYXJhbWV0ZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CdWZmZXJlZE91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFNBQUpEYXRhU291cmNlIGltcGxlbWVudHMgamF2YXguYWN0aXZhdGlvbi5EYXRhU291cmNlIHsKLQotICAgIC8qKiBUaGUgY29udGVudCB0eXBlLiBUaGlzIGRlZmF1bHRzIHRvIDxjb2RlPmFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbTwvY29kZT4uICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBjb250ZW50VHlwZSA9ICJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iOwotCi0gICAgLyoqIFRoZSBpbmNvbWluZyBzb3VyY2Ugc3RyZWFtLiAqLwotICAgIHByaXZhdGUgSW5wdXRTdHJlYW0gc3M7Ci0KLSAgICAvKiogRmllbGQgTUlOX01FTU9SWV9ESVNLX0NBQ0hFRCAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1JTl9NRU1PUllfRElTS19DQUNIRUQgPSAtMTsKLQotICAgIC8qKiBGaWVsZCBNQVhfTUVNT1JZX0RJU0tfQ0FDSEVEICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFYX01FTU9SWV9ESVNLX0NBQ0hFRCA9IDE2ICogMTAyNDsKLQotICAgIC8qKiBGaWVsZCBtYXhDYWNoZWQgKi8KLSAgICBwcm90ZWN0ZWQgaW50IG1heENhY2hlZCA9IE1BWF9NRU1PUllfRElTS19DQUNIRUQ7ICAgICAgIC8vIG1heCBpbiBtZW1vcnkgY2FjaGVkLiBEZWZhdWx0LgotCi0gICAgLyoqIEZpZWxkIGRpc2tDYWNoZUZpbGUgKi8KLSAgICBwcm90ZWN0ZWQgamF2YS5pby5GaWxlIGRpc2tDYWNoZUZpbGUgPSBudWxsOwotCi0gICAgLy8gQSBsaXN0IG9mIG9wZW4gaW5wdXQgU3RyZWFtcy4KLQotICAgIC8qKiBGaWVsZCByZWFkZXJzICovCi0gICAgcHJvdGVjdGVkIGphdmEudXRpbC5XZWFrSGFzaE1hcCByZWFkZXJzID0gbmV3IGphdmEudXRpbC5XZWFrSGFzaE1hcCgpOwotCi0gICAgLyoqIEZsYWcgdG8gc2hvdyBpZiB0aGUgcmVzb3VyY2VzIGJlaGluZCB0aGlzIGhhdmUgYmVlbiBkZWxldGVkLiAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGRlbGV0ZWQ7Ci0KLSAgICAvKiogRmllbGQgUkVBRF9DSFVOS19TWiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFQURfQ0hVTktfU1ogPSAzMiAqIDEwMjQ7Ci0KLQotICAgIC8qKiBUaGUgbGlua2VkIGxpc3QgdG8gaG9sZCB0aGUgaW4gbWVtb3J5IGJ1ZmZlcnMuICovCi0gICAgcHJvdGVjdGVkIGphdmEudXRpbC5MaW5rZWRMaXN0IG1lbW9yeWJ1Zmxpc3QgPSBuZXcgamF2YS51dGlsLkxpbmtlZExpc3QoKTsKLQotICAgIC8qKiBIb2xkIHRoZSBsYXN0IG1lbW9yeSBidWZmZXIuICovCi0gICAgcHJvdGVjdGVkIGJ5dGVbXSBjdXJyZW50TWVtb3J5QnVmID0gbnVsbDsKLQotICAgIC8qKiBUaGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gdG8gdGhlIGFib3ZlIGJ1ZmZlci4gKi8KLSAgICBwcm90ZWN0ZWQgaW50IGN1cnJlbnRNZW1vcnlCdWZTejsKLQotICAgIC8qKiBUaGUgdG90YWwgc2l6ZSBpbiBieXRlcyBpbiB0aGlzIGRhdGEgc291cmNlLiAqLwotICAgIHByb3RlY3RlZCBsb25nIHRvdGFsc3o7Ci0KLSAgICAvKiogVGhpcyBpcyB0aGUgY2FjaGVkIGRpc2sgc3RyZWFtLiAqLwotICAgIHByb3RlY3RlZCBqYXZhLmlvLkJ1ZmZlcmVkT3V0cHV0U3RyZWFtIGNhY2hlZGlza3N0cmVhbTsKLQotICAgIC8qKiBJZiB0cnVlIHRoZSBzb3VyY2UgaW5wdXQgc3RyZWFtIGlzIG5vdyBjbG9zZWQuICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gY2xvc2VkID0gZmFsc2U7Ci0KLSAgICAvKiogQ29uc3RydWN0b3IgU0FBSkRhdGFTb3VyY2UuICovCi0gICAgcHJvdGVjdGVkIFNBQUpEYXRhU291cmNlKCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyBib3VuZGFyeSBzdHJlYW0uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3MgICAgICAgICAgaXMgdGhlIHNvdXJjZSBpbnB1dCBzdHJlYW0gdGhhdCBpcyB1c2VkIHRvIGNyZWF0ZSB0aGlzIGRhdGEgc291cmNlLgotICAgICAqIEBwYXJhbSBtYXhDYWNoZWQgICBUaGlzIGlzIHRoZSBtYXggbWVtb3J5IHRoYXQgaXMgdG8gYmUgdXNlZCB0byBjYWNoZSB0aGUgZGF0YS4KLSAgICAgKiBAcGFyYW0gY29udGVudFR5cGUgdGhlIG1pbWUgdHlwZSBmb3IgdGhpcyBkYXRhIHN0cmVhbS4gYnkgYnVmZmVyaW5nIHlvdSBjYW4gc29tZSBlZmZpZW5jeSBpbgotICAgICAqICAgICAgICAgICAgICAgICAgICBzZWFyY2hpbmcuCi0gICAgICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIFNBQUpEYXRhU291cmNlKElucHV0U3RyZWFtIHNzLCBpbnQgbWF4Q2FjaGVkLCBTdHJpbmcgY29udGVudFR5cGUpCi0gICAgICAgICAgICB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMoc3MsIG1heENhY2hlZCwgY29udGVudFR5cGUsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBuZXcgYm91bmRhcnkgc3RyZWFtLgotICAgICAqCi0gICAgICogQHBhcmFtIHNzICAgICAgICAgIGlzIHRoZSBzb3VyY2UgaW5wdXQgc3RyZWFtIHRoYXQgaXMgdXNlZCB0byBjcmVhdGUgdGhpcyBkYXRhIHNvdXJjZS4KLSAgICAgKiBAcGFyYW0gbWF4Q2FjaGVkICAgVGhpcyBpcyB0aGUgbWF4IG1lbW9yeSB0aGF0IGlzIHRvIGJlIHVzZWQgdG8gY2FjaGUgdGhlIGRhdGEuCi0gICAgICogQHBhcmFtIGNvbnRlbnRUeXBlIHRoZSBtaW1lIHR5cGUgZm9yIHRoaXMgZGF0YSBzdHJlYW0uIGJ5IGJ1ZmZlcmluZyB5b3UgY2FuIHNvbWUgZWZmaWVuY3kgaW4KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgc2VhcmNoaW5nLgotICAgICAqIEBwYXJhbSByZWFkYWxsICAgICBpZiB0cnVlIHdpbGwgcmVhZCBpbiB0aGUgd2hvbGUgc291cmNlLgotICAgICAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBTQUFKRGF0YVNvdXJjZShJbnB1dFN0cmVhbSBzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1heENhY2hlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNvbnRlbnRUeXBlLCBib29sZWFuIHJlYWRhbGwpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQotICAgICAgICBpZiAoc3MgaW5zdGFuY2VvZiBCdWZmZXJlZElucHV0U3RyZWFtKSB7Ci0gICAgICAgICAgICB0aGlzLnNzID0gc3M7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aGlzLnNzID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oc3MpOwotICAgICAgICB9Ci0gICAgICAgIHRoaXMubWF4Q2FjaGVkID0gbWF4Q2FjaGVkOwotICAgICAgICBpZiAoKG51bGwgIT0gY29udGVudFR5cGUpICYmIChjb250ZW50VHlwZS5sZW5ndGgoKSAhPSAwKSkgewotICAgICAgICAgICAgdGhpcy5jb250ZW50VHlwZSA9IGNvbnRlbnRUeXBlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtYXhDYWNoZWQgPCBNSU5fTUVNT1JZX0RJU0tfQ0FDSEVEKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJiYWRNYXhDYWNoZWQgIiArIG1heENhY2hlZCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBmb3Igbm93IHJlYWQgYWxsIGluIHRvIGRpc2suCi0gICAgICAgIGlmIChyZWFkYWxsKSB7Ci0gICAgICAgICAgICBieXRlW10gcmVhZGJ1ZmZlciA9IG5ldyBieXRlW1JFQURfQ0hVTktfU1pdOwotCi0gICAgICAgICAgICBpbnQgcmVhZCA9IDA7Ci0gICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgcmVhZCA9IHNzLnJlYWQocmVhZGJ1ZmZlcik7Ci0KLSAgICAgICAgICAgICAgICBpZiAocmVhZCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVUb01lbW9yeShyZWFkYnVmZmVyLCByZWFkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IHdoaWxlIChyZWFkID4gLTEpOwotICAgICAgICAgICAgY2xvc2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIGlzIGEgbG93IGxldmVsIHdyaXRlLiBDbG9zZSB0aGUgc3RyZWFtLgotICAgICAqCi0gICAgICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIGNsb3NlKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCi0gICAgICAgIGlmICghY2xvc2VkKSB7Ci0gICAgICAgICAgICBjbG9zZWQgPSB0cnVlOyAgICAgICAgICAgICAgICAgICAgLy8gTWFya2l0IGFzIGNsb3NlZC4KLSAgICAgICAgICAgIGlmIChudWxsICE9IGNhY2hlZGlza3N0cmVhbSkgeyAgICAvLyBjbG9zZSB0aGUgZGlzayBjYWNoZS4KLSAgICAgICAgICAgICAgICBjYWNoZWRpc2tzdHJlYW0uY2xvc2UoKTsKLQotICAgICAgICAgICAgICAgIGNhY2hlZGlza3N0cmVhbSA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobnVsbCAhPSBtZW1vcnlidWZsaXN0KSB7ICAgICAgLy8gVGhlcmUgaXMgYSBtZW1vcnkgYnVmZmVyLgotICAgICAgICAgICAgICAgIGlmIChjdXJyZW50TWVtb3J5QnVmU3ogPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ5dGVbXSB0bXAgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBieXRlW2N1cnJlbnRNZW1vcnlCdWZTel07ICAgIC8vIEdldCB0aGUgbGFzdCBidWZmZXIgYW5kIG1ha2UgaXQgdGhlIHNpemVvZiB0aGUgYWN0dWFsIGRhdGEuCi0KLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShjdXJyZW50TWVtb3J5QnVmLCAwLCB0bXAsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE1lbW9yeUJ1ZlN6KTsKLSAgICAgICAgICAgICAgICAgICAgbWVtb3J5YnVmbGlzdC5zZXQobWVtb3J5YnVmbGlzdC5zaXplKCkgLSAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXApOyAgICAgICAgICAgICAgICAgLy8gTm93IHJlcGxhY2UgdGhlIGxhc3QgYnVmZmVyIHdpdGggdGhpcyBzaXplLgotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjdXJyZW50TWVtb3J5QnVmID0gbnVsbDsgICAgICAvLyBObyBuZWVkIGZvciB0aGlzIGFueW1vcmUuCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSb3V0aW5lIHRvIGZsdXNoIGRhdGEgdG8gZGlzayBpZiBpcyBpbiBtZW1vcnkuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZmx1c2hUb0Rpc2soKSB0aHJvd3MgSU9FeGNlcHRpb24sIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIExpbmtlZExpc3QgbWwgPSBtZW1vcnlidWZsaXN0OwotICAgICAgICBpZiAobWwgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKG51bGwgPT0gY2FjaGVkaXNrc3RyZWFtKSB7ICAgIC8vIE5lZWQgdG8gY3JlYXRlIGEgZGlzayBjYWNoZQotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIE1lc3NhZ2VDb250ZXh0IG1jID0gTWVzc2FnZUNvbnRleHQuZ2V0Q3VycmVudENvbnRleHQoKTsKLSAgICAgICAgICAgIFN0cmluZyBhdHRkaXIgPSAobWMgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IG51bGwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG1jLmdldFN0clByb3AoCi0gICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VDb250ZXh0LkFUVEFDSE1FTlRTX0RJUik7Ki8KLQotCi0gICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0ID0gTWVzc2FnZUNvbnRleHQuZ2V0Q3VycmVudE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBhdHRhY2hlbWVudERpciA9ICIiOwotICAgICAgICAgICAgICAgICAgICBhdHRhY2hlbWVudERpciA9IChTdHJpbmcpbWVzc2FnZUNvbnRleHQuZ2V0UHJvcGVydHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uQVRUQUNITUVOVF9URU1QX0RJUik7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGF0dGFjaGVtZW50RGlyLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtZXRlciBwYXJhbSA9IChQYXJhbWV0ZXIpbWVzc2FnZUNvbnRleHQuZ2V0UGFyYW1ldGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDb25zdGFudHMuQ29uZmlndXJhdGlvbi5BVFRBQ0hNRU5UX1RFTVBfRElSKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0YWNoZW1lbnREaXIgPSAoU3RyaW5nKXBhcmFtLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBkaXNrQ2FjaGVGaWxlID0gamF2YS5pby5GaWxlLmNyZWF0ZVRlbXBGaWxlKCJBeGlzIiwgIi5hdHQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhdHRhY2hlbWVudERpciA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBudWxsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG5ldyBGaWxlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0YWNoZW1lbnREaXIpKTsKLSAgICAgICAgICAgICAgICAgICAgY2FjaGVkaXNrc3RyZWFtID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKGRpc2tDYWNoZUZpbGUpKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGxpc3RzeiA9IG1sLnNpemUoKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBXcml0ZSBvdXQgdGhlIGVudGlyZSBtZW1vcnkgaGVsZCBzdG9yZSB0byBkaXNrLgotICAgICAgICAgICAgICAgICAgICBmb3IgKGphdmEudXRpbC5JdGVyYXRvciBpdCA9IG1sLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgaXQuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIHJidWYgPSAoYnl0ZVtdKWl0Lm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBid3JpdGUgPSAobGlzdHN6LS0gPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBjdXJyZW50TWVtb3J5QnVmU3oKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiByYnVmLmxlbmd0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlZGlza3N0cmVhbS53cml0ZShyYnVmLCAwLCBid3JpdGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsb3NlZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlZGlza3N0cmVhbS5jbG9zZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlZGlza3N0cmVhbSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbWVtb3J5YnVmbGlzdCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoamF2YS5sYW5nLlNlY3VyaXR5RXhjZXB0aW9uIHNlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRpc2tDYWNoZUZpbGUgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBjYWNoZWRpc2tzdHJlYW0gPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBtYXhDYWNoZWQgPSBqYXZhLmxhbmcuSW50ZWdlci5NQVhfVkFMVUU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV3JpdGUgYnl0ZXMgdG8gdGhlIHN0cmVhbS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBkYXRhIGFsbCBieXRlcyBvZiB0aGlzIGFycmF5IGFyZSB3cml0dGVuIHRvIHRoZSBzdHJlYW0KLSAgICAgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gaWYgdGhlcmUgd2FzIGEgcHJvYmxlbSB3cml0aW5nIHRoZSBkYXRhCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgd3JpdGUoYnl0ZVtdIGRhdGEpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgd3JpdGUoZGF0YSwgZGF0YS5sZW5ndGgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIGlzIGEgbG93IGxldmVsIHdyaXRlLiBOb3RlIGl0IGlzIGRlc2lnbmVkIHRvIGluIHRoZSBmdXR1cmUgdG8gYWxsb3cgc3RyZWFtaW5nIHRvCi0gICAgICogYm90aCBtZW1vcnkgQU5EIHRvIGRpc2sgc2ltdWx0YW5lb3VzbHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZGF0YQotICAgICAqIEBwYXJhbSBsZW5ndGgKLSAgICAgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgd3JpdGUoYnl0ZVtdIGRhdGEsIGludCBsZW5ndGgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQotICAgICAgICBpZiAoY2xvc2VkKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5pby5JT0V4Y2VwdGlvbigic3RyZWFtQ2xvc2VkIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgYnl0ZXN3cml0dGVuID0gMDsKLQotICAgICAgICBpZiAoKG51bGwgIT0gbWVtb3J5YnVmbGlzdCkKLSAgICAgICAgICAgICAgICAmJiAodG90YWxzeiArIGxlbmd0aCA+IG1heENhY2hlZCkpIHsgICAgLy8gQ2FjaGUgdG8gZGlzay4KLSAgICAgICAgICAgIGlmIChudWxsID09IGNhY2hlZGlza3N0cmVhbSkgeyAgICAgICAgICAgICAgIC8vIE5lZWQgdG8gY3JlYXRlIGEgZGlzayBjYWNoZQotICAgICAgICAgICAgICAgIGZsdXNoVG9EaXNrKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobWVtb3J5YnVmbGlzdCAhPSBudWxsKSB7ICAgIC8vIENhbiB3cml0ZSB0byBtZW1vcnkuCi0gICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgaWYgKG51bGwgPT0gY3VycmVudE1lbW9yeUJ1ZikgewotICAgICAgICAgICAgICAgICAgICBjdXJyZW50TWVtb3J5QnVmID0gbmV3IGJ5dGVbUkVBRF9DSFVOS19TWl07Ci0gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRNZW1vcnlCdWZTeiA9IDA7Ci0KLSAgICAgICAgICAgICAgICAgICAgbWVtb3J5YnVmbGlzdC5hZGQoY3VycmVudE1lbW9yeUJ1Zik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gYnl0ZXMgdG8gd3JpdGUgaXMgdGhlIG1pbi4gYmV0d2VlbiB0aGUgcmVtYWluaW5nIGJ5dGVzIGFuZCB3aGF0IGlzIGxlZnQgaW4gdGhpcyBidWZmZXIuCi0gICAgICAgICAgICAgICAgaW50IGJ5dGVzMndyaXRlID0gTWF0aC5taW4oKGxlbmd0aCAtIGJ5dGVzd3JpdHRlbiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGN1cnJlbnRNZW1vcnlCdWYubGVuZ3RoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIGN1cnJlbnRNZW1vcnlCdWZTeikpOwotCi0gICAgICAgICAgICAgICAgLy8gY29weSB0aGUgZGF0YS4KLSAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGRhdGEsIGJ5dGVzd3JpdHRlbiwgY3VycmVudE1lbW9yeUJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRNZW1vcnlCdWZTeiwgYnl0ZXMyd3JpdGUpOwotCi0gICAgICAgICAgICAgICAgYnl0ZXN3cml0dGVuICs9IGJ5dGVzMndyaXRlOwotICAgICAgICAgICAgICAgIGN1cnJlbnRNZW1vcnlCdWZTeiArPSBieXRlczJ3cml0ZTsKLQotICAgICAgICAgICAgICAgIGlmIChieXRlc3dyaXR0ZW4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwgbGVuZ3RoKSB7ICAgIC8vIG9ubHkgZ2V0IG1vcmUgaWYgd2UgcmVhbGx5IG5lZWQgaXQuCi0gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRNZW1vcnlCdWYgPSBuZXcgYnl0ZVtSRUFEX0NIVU5LX1NaXTsKLSAgICAgICAgICAgICAgICAgICAgY3VycmVudE1lbW9yeUJ1ZlN6ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgbWVtb3J5YnVmbGlzdC5hZGQoY3VycmVudE1lbW9yeUJ1Zik7ICAgIC8vIGFkZCBpdCB0byB0aGUgY2hhaW4uCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSB3aGlsZSAoYnl0ZXN3cml0dGVuIDwgbGVuZ3RoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChudWxsICE9IGNhY2hlZGlza3N0cmVhbSkgeyAgICAvLyBXcml0ZSB0byB0aGUgb3V0IGdvaW5nIHN0cmVhbS4KLSAgICAgICAgICAgIGNhY2hlZGlza3N0cmVhbS53cml0ZShkYXRhLCAwLCBsZW5ndGgpOwotICAgICAgICB9Ci0gICAgICAgIHRvdGFsc3ogKz0gbGVuZ3RoOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgaXMgYSBsb3cgbGV2ZWwgd3JpdGUuIFdyaXRlcyBvbmx5IHRvIG1lbW9yeQotICAgICAqCi0gICAgICogQHBhcmFtIGRhdGEKLSAgICAgKiBAcGFyYW0gbGVuZ3RoCi0gICAgICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIHdyaXRlVG9NZW1vcnkoYnl0ZVtdIGRhdGEsIGludCBsZW5ndGgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQotICAgICAgICBpZiAoY2xvc2VkKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5pby5JT0V4Y2VwdGlvbigic3RyZWFtQ2xvc2VkIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgYnl0ZXN3cml0dGVuID0gMDsKLSAgICAgICAgaWYgKG1lbW9yeWJ1Zmxpc3QgIT0gbnVsbCkgeyAgICAvLyBDYW4gd3JpdGUgdG8gbWVtb3J5LgotICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIGlmIChudWxsID09IGN1cnJlbnRNZW1vcnlCdWYpIHsKLSAgICAgICAgICAgICAgICAgICAgY3VycmVudE1lbW9yeUJ1ZiA9IG5ldyBieXRlW1JFQURfQ0hVTktfU1pdOwotICAgICAgICAgICAgICAgICAgICBjdXJyZW50TWVtb3J5QnVmU3ogPSAwOwotCi0gICAgICAgICAgICAgICAgICAgIG1lbW9yeWJ1Zmxpc3QuYWRkKGN1cnJlbnRNZW1vcnlCdWYpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIGJ5dGVzIHRvIHdyaXRlIGlzIHRoZSBtaW4uIGJldHdlZW4gdGhlIHJlbWFpbmluZyBieXRlcyBhbmQgd2hhdCBpcyBsZWZ0IGluIHRoaXMgYnVmZmVyLgotICAgICAgICAgICAgICAgIGludCBieXRlczJ3cml0ZSA9IE1hdGgubWluKChsZW5ndGggLSBieXRlc3dyaXR0ZW4pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjdXJyZW50TWVtb3J5QnVmLmxlbmd0aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBjdXJyZW50TWVtb3J5QnVmU3opKTsKLQotICAgICAgICAgICAgICAgIC8vIGNvcHkgdGhlIGRhdGEuCi0gICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShkYXRhLCBieXRlc3dyaXR0ZW4sIGN1cnJlbnRNZW1vcnlCdWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50TWVtb3J5QnVmU3osIGJ5dGVzMndyaXRlKTsKLQotICAgICAgICAgICAgICAgIGJ5dGVzd3JpdHRlbiArPSBieXRlczJ3cml0ZTsKLSAgICAgICAgICAgICAgICBjdXJyZW50TWVtb3J5QnVmU3ogKz0gYnl0ZXMyd3JpdGU7Ci0KLSAgICAgICAgICAgICAgICBpZiAoYnl0ZXN3cml0dGVuCi0gICAgICAgICAgICAgICAgICAgICAgICA8IGxlbmd0aCkgeyAgICAvLyBvbmx5IGdldCBtb3JlIGlmIHdlIHJlYWxseSBuZWVkIGl0LgotICAgICAgICAgICAgICAgICAgICBjdXJyZW50TWVtb3J5QnVmID0gbmV3IGJ5dGVbUkVBRF9DSFVOS19TWl07Ci0gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRNZW1vcnlCdWZTeiA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIG1lbW9yeWJ1Zmxpc3QuYWRkKGN1cnJlbnRNZW1vcnlCdWYpOyAgICAvLyBhZGQgaXQgdG8gdGhlIGNoYWluLgotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gd2hpbGUgKGJ5dGVzd3JpdHRlbiA8IGxlbmd0aCk7Ci0gICAgICAgIH0KLSAgICAgICAgdG90YWxzeiArPSBsZW5ndGg7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogZ2V0IHRoZSBmaWxlbmFtZSBvZiB0aGUgY29udGVudCBpZiBpdCBpcyBjYWNoZWQgdG8gZGlzay4KLSAgICAgKgotICAgICAqIEByZXR1cm4gZmlsZSBvYmplY3QgcG9pbnRpbmcgdG8gZmlsZSwgb3IgbnVsbCBmb3IgbWVtb3J5LXN0b3JlZCBjb250ZW50Ci0gICAgICovCi0gICAgcHVibGljIEZpbGUgZ2V0RGlza0NhY2hlRmlsZSgpIHsKLSAgICAgICAgcmV0dXJuIGRpc2tDYWNoZUZpbGU7Ci0gICAgfQotCi0gICAgcHVibGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTQUFKSW5wdXRTdHJlYW0oKTsgICAgLy8gUmV0dXJuIHRoZSBtZW1vcnkgaGVsZCBzdHJlYW0uCi0gICAgfQotCi0gICAgcHVibGljIE91dHB1dFN0cmVhbSBnZXRPdXRwdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAvL1RPRE86IE1ldGhvZCBpbXBsZW1lbnRhdGlvbgotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRUeXBlKCkgewotICAgICAgICByZXR1cm4gY29udGVudFR5cGU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICBTdHJpbmcgcmV0ID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZsdXNoVG9EaXNrKCk7Ci0gICAgICAgICAgICBpZiAoZGlza0NhY2hlRmlsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0ID0gZGlza0NhY2hlRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGRpc2tDYWNoZUZpbGUgPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBJbm5lciBjbGFzcyB0byBoYW5kbGUgZ2V0dGluZyBhbiBpbnB1dCBzdHJlYW0gdG8gdGhpcyBkYXRhIHNvdXJjZSBIYW5kbGVzIGNyZWF0aW5nIGFuIGlucHV0Ci0gICAgICogc3RyZWFtIHRvIHRoZSBzb3VyY2UuCi0gICAgICovCi0gICAgcHJpdmF0ZSBjbGFzcyBTQUFKSW5wdXRTdHJlYW0gZXh0ZW5kcyBqYXZhLmlvLklucHV0U3RyZWFtIHsKLQotICAgICAgICAvKiogYnl0ZXMgcmVhZC4gKi8KLSAgICAgICAgcHJvdGVjdGVkIGxvbmcgYnJlYWQgPSAwOwotCi0gICAgICAgIC8qKiBUaGUgcmVhbCBzdHJlYW0uICovCi0gICAgICAgIHByaXZhdGUgRmlsZUlucHV0U3RyZWFtIGZpbGVJUzsKLQotICAgICAgICAvKiogVGhlIHBvc2l0aW9uIGluIHRoZSBsaXN0IHdlcmUgd2UgYXJlIHJlYWRpbmcgZnJvbS4gKi8KLSAgICAgICAgaW50IGN1cnJlbnRJbmRleDsKLQotICAgICAgICAvKiogdGhlIGJ1ZmZlciB3ZSBhcmUgY3VycmVudGx5IHJlYWRpbmcgZnJvbS4gKi8KLSAgICAgICAgYnl0ZVtdIGN1cnJlbnRCdWY7Ci0KLSAgICAgICAgLyoqIFRoZSBjdXJyZW50IHBvc2l0aW9uIGluIHRoZXJlLiAqLwotICAgICAgICBpbnQgY3VycmVudEJ1ZlBvczsKLQotICAgICAgICAvKiogVGhlIHJlYWQgc3RyZWFtIGhhcyBiZWVuIGNsb3NlZC4gKi8KLSAgICAgICAgYm9vbGVhbiByZWFkQ2xvc2VkOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDb25zdHJ1Y3RvciBJbnN0cmVhbS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIGlmIHRoZSBJbnN0cmVhbSBjb3VsZCBub3QgYmUgY3JlYXRlZCBvciBpZiB0aGUgZGF0YSBzb3VyY2UKLSAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhcyBiZWVuIGRlbGV0ZWQKLSAgICAgICAgICovCi0gICAgICAgIHByb3RlY3RlZCBTQUFKSW5wdXRTdHJlYW0oKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBpZiAoZGVsZXRlZCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLmlvLklPRXhjZXB0aW9uKCJyZXNvdXJjZURlbGV0ZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJlYWRlcnMucHV0KHRoaXMsIG51bGwpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFF1ZXJ5IGZvciB0aGUgbnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZSBmb3IgcmVhZGluZy4KLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGxlZnQKLSAgICAgICAgICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIGlmIHRoaXMgc3RyZWFtIGlzIG5vdCBpbiBhIHN0YXRlIHRoYXQgc3VwcG9ydHMgcmVhZGluZwotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGludCBhdmFpbGFibGUoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBpZiAoZGVsZXRlZCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLmlvLklPRXhjZXB0aW9uKCJyZXNvdXJjZURlbGV0ZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChyZWFkQ2xvc2VkKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEuaW8uSU9FeGNlcHRpb24oInN0cmVhbUNsb3NlZCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG5ldyBMb25nKE1hdGgubWluKEludGVnZXIuTUFYX1ZBTFVFLCB0b3RhbHN6IC0gYnJlYWQpKS5pbnRWYWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJlYWQgYSBieXRlIGZyb20gdGhlIHN0cmVhbS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiBieXRlIHJlYWQgb3IgLTEgaWYgbm8gbW9yZSBkYXRhLgotICAgICAgICAgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBpbnQgcmVhZCgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAoU0FBSkRhdGFTb3VyY2UudGhpcykgewotICAgICAgICAgICAgICAgIGJ5dGVbXSByZXRiID0gbmV3IGJ5dGVbMV07Ci0gICAgICAgICAgICAgICAgaW50IGJyID0gcmVhZChyZXRiLCAwLCAxKTsKLSAgICAgICAgICAgICAgICBpZiAoYnIgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gMHhGRiAmIHJldGJbMF07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKiogTm90IHN1cHBvcnRlZC4gKi8KLSAgICAgICAgcHVibGljIGJvb2xlYW4gbWFya1N1cHBvcnRlZCgpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBOb3Qgc3VwcG9ydGVkLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gcmVhZGxpbWl0Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBtYXJrKGludCByZWFkbGltaXQpIHsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBOb3Qgc3VwcG9ydGVkLgotICAgICAgICAgKgotICAgICAgICAgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigibm9SZXNldE1hcmsiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBsb25nIHNraXAobG9uZyBza2lwcGVkKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCi0gICAgICAgICAgICBpZiAoZGVsZXRlZCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigicmVzb3VyY2VEZWxldGVkIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChyZWFkQ2xvc2VkKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJzdHJlYW1DbG9zZWQiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHNraXBwZWQgPCAxKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7ICAgIC8vIG5vdGhpbmcgdG8gc2tpcC4KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3luY2hyb25pemVkIChTQUFKRGF0YVNvdXJjZS50aGlzKSB7Ci0gICAgICAgICAgICAgICAgc2tpcHBlZCA9IE1hdGgubWluKHNraXBwZWQsIHRvdGFsc3ogLSBicmVhZCk7ICAgIC8vIG9ubHkgc2tpcCB3aGF0IHdlJ3ZlIHJlYWQuCi0gICAgICAgICAgICAgICAgaWYgKHNraXBwZWQgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgTGlzdCBtbCA9IG1lbW9yeWJ1Zmxpc3Q7ICAgIC8vIGhvbGQgdGhlIG1lbW9yeSBsaXN0LgotICAgICAgICAgICAgICAgIGludCBid3JpdHRlbiA9IDA7Ci0gICAgICAgICAgICAgICAgaWYgKG1sICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgPT0gY3VycmVudEJ1ZikgeyAgICAvLyBnZXQgdGhlIGJ1ZmZlciB3ZSBuZWVkIHRvIHJlYWQgZnJvbS4KLSAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRCdWYgPSAoYnl0ZVtdKW1sLmdldChjdXJyZW50SW5kZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEJ1ZlBvcyA9IDA7ICAgIC8vIHN0YXJ0IHJlYWRpbmcgZnJvbSB0aGUgYmVnaW5pbmcuCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBiY29weSA9IE1hdGgubWluKGN1cnJlbnRCdWYubGVuZ3RoIC0gY3VycmVudEJ1ZlBvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwcGVkIC0gYndyaXR0ZW4pOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBid3JpdHRlbiArPSBiY29weTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRCdWZQb3MgKz0gYmNvcHk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYndyaXR0ZW4gPCBza2lwcGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEJ1ZiA9IChieXRlW10pbWwuZ2V0KCsrY3VycmVudEluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50QnVmUG9zID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoYndyaXR0ZW4gPCBza2lwcGVkKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSBmaWxlSVMpIHsKLSAgICAgICAgICAgICAgICAgICAgZmlsZUlTLnNraXAoc2tpcHBlZCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgYnJlYWQgKz0gc2tpcHBlZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBza2lwcGVkOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCByZWFkKGJ5dGVbXSBiLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgaWYgKGRlbGV0ZWQpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oInJlc291cmNlRGVsZXRlZCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocmVhZENsb3NlZCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigic3RyZWFtQ2xvc2VkIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChiID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigibnVsbElucHV0Iik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChvZmYgPCAwKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oIm5lZ09mZnNldCAiICsgb2ZmKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGxlbiA8IDApIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigibGVuZ3RoICIgKyBsZW4pOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobGVuICsgb2ZmID4gYi5sZW5ndGgpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigid3JpdGVCZXlvbmQiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGxlbiA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGludCBid3JpdHRlbiA9IDA7Ci0KLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAoU0FBSkRhdGFTb3VyY2UudGhpcykgewotICAgICAgICAgICAgICAgIGlmIChicmVhZCA9PSB0b3RhbHN6KSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgTGlzdCBtbCA9IG1lbW9yeWJ1Zmxpc3Q7Ci0gICAgICAgICAgICAgICAgbG9uZyBsb25nbGVuID0gbGVuOwotICAgICAgICAgICAgICAgIGxvbmdsZW4gPSBNYXRoLm1pbihsb25nbGVuLCB0b3RhbHN6IC0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFkKTsgICAgLy8gT25seSByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBpbiB0aGUgZGF0YSBzdG9yZSB0aGF0IGlzIGxlZnQuCi0gICAgICAgICAgICAgICAgbGVuID0gbmV3IExvbmcobG9uZ2xlbikuaW50VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBpZiAobWwgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCA9PSBjdXJyZW50QnVmKSB7ICAgIC8vIEdldCB0aGUgYnVmZmVyIHdlIG5lZWQgdG8gcmVhZCBmcm9tLgotICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEJ1ZiA9IChieXRlW10pbWwuZ2V0KGN1cnJlbnRJbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50QnVmUG9zID0gMDsgICAgLy8gTmV3IGJ1ZmZlciBzdGFydCBmcm9tIHRoZSBiZWdpbmluZy4KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBkbyB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBieXRlcyB0byBjb3B5LCB0aGUgbWluaW11bSBvZiB0aGUgYnl0ZXMgbGVmdCBpbiB0aGlzIGJ1ZmZlciBvciBieXRlcyByZW1haW5pbmcuCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmNvcHkgPSBNYXRoLm1pbihjdXJyZW50QnVmLmxlbmd0aCAtIGN1cnJlbnRCdWZQb3MsIGxlbiAtIGJ3cml0dGVuKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29weSB0aGUgZGF0YS4KLSAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoY3VycmVudEJ1ZiwgY3VycmVudEJ1ZlBvcywgYiwgb2ZmICsgYndyaXR0ZW4sIGJjb3B5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ3cml0dGVuICs9IGJjb3B5OwotICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEJ1ZlBvcyArPSBiY29weTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChid3JpdHRlbiA8IGxlbikgeyAgICAvLyBHZXQgdGhlIG5leHQgYnVmZmVyLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRCdWYgPSAoYnl0ZVtdKW1sLmdldCgrK2N1cnJlbnRJbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEJ1ZlBvcyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKGJ3cml0dGVuIDwgbGVuKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoKGJ3cml0dGVuID09IDApICYmIChudWxsICE9IGRpc2tDYWNoZUZpbGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChudWxsID09IGZpbGVJUykgeyAgICAgICAgICAgLy8gd2UgYXJlIG5vdyByZWFkaW5nIGZyb20gZGlzay4KLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVJUyA9IG5ldyBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbShkaXNrQ2FjaGVGaWxlKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJyZWFkID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVJUy5za2lwKGJyZWFkKTsgICAgIC8vIFNraXAgd2hhdCB3ZSd2ZSByZWFkIHNvIGZhci4KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChjYWNoZWRpc2tzdHJlYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVkaXNrc3RyZWFtLmZsdXNoKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYndyaXR0ZW4gPSBmaWxlSVMucmVhZChiLCBvZmYsIGxlbik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGJ3cml0dGVuID4gMCkgewotICAgICAgICAgICAgICAgICAgICBicmVhZCArPSBid3JpdHRlbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gYndyaXR0ZW47Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogY2xvc2UgdGhlIHN0cmVhbS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGlmICghcmVhZENsb3NlZCkgewotICAgICAgICAgICAgICAgIHJlYWRlcnMucmVtb3ZlKHRoaXMpOwotICAgICAgICAgICAgICAgIHJlYWRDbG9zZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIGlmIChmaWxlSVMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBmaWxlSVMuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBmaWxlSVMgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgICAgIHN1cGVyLmZpbmFsaXplKCk7Ci0gICAgICAgICAgICBjbG9zZSgpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2Fhai9zcmMvb3JnL2FwYWNoZS9heGlzMi9zYWFqL3V0aWwvU0FBSlV0aWwuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhYWovc3JjL29yZy9hcGFjaGUvYXhpczIvc2Fhai91dGlsL1NBQUpVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3ZGU3OTMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2Fhai9zcmMvb3JnL2FwYWNoZS9heGlzMi9zYWFqL3V0aWwvU0FBSlV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2Fhai51dGlsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmRvbS5ET09NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQMTFDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVAxMkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuaW1wbC5idWlsZGVyLlN0QVhTT0FQTW9kZWxCdWlsZGVyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci0KLS8qKiBVdGlsaXR5IGNsYXNzIGZvciB0aGUgQXhpczItV1NTNEogTW9kdWxlICovCi1wdWJsaWMgY2xhc3MgU0FBSlV0aWwgewotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgRE9NIERvY3VtZW50IHVzaW5nIHRoZSBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZW52IEFuIG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGUgaW5zdGFuY2UKLSAgICAgKiBAcmV0dXJuIHRoZSBET00gRG9jdW1lbnQgb2YgdGhlIGdpdmVuIFNPQVAgRW52ZWxvcGUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIERvY3VtZW50IGdldERvY3VtZW50RnJvbVNPQVBFbnZlbG9wZShvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlIGVudikgewotICAgICAgICBlbnYuYnVpbGQoKTsKLQotICAgICAgICAvL0NoZWNrIHRoZSBuYW1lc3BhY2UgYW5kIGZpbmQgU09BUCB2ZXJzaW9uIGFuZCBmYWN0b3J5Ci0gICAgICAgIFN0cmluZyBuc1VSSTsKLSAgICAgICAgU09BUEZhY3RvcnkgZmFjdG9yeTsKLSAgICAgICAgaWYgKGVudi5nZXROYW1lc3BhY2UoKS5nZXROYW1lc3BhY2VVUkkoKQotICAgICAgICAgICAgICAgIC5lcXVhbHMoU09BUDExQ29uc3RhbnRzLlNPQVBfRU5WRUxPUEVfTkFNRVNQQUNFX1VSSSkpIHsKLSAgICAgICAgICAgIG5zVVJJID0gU09BUDExQ29uc3RhbnRzLlNPQVBfRU5WRUxPUEVfTkFNRVNQQUNFX1VSSTsKLSAgICAgICAgICAgIGZhY3RvcnkgPSBET09NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMUZhY3RvcnkoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG5zVVJJID0gU09BUDEyQ29uc3RhbnRzLlNPQVBfRU5WRUxPUEVfTkFNRVNQQUNFX1VSSTsKLSAgICAgICAgICAgIGZhY3RvcnkgPSBET09NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMUZhY3RvcnkoKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0QVhTT0FQTW9kZWxCdWlsZGVyIHN0QVhTT0FQTW9kZWxCdWlsZGVyID0KLSAgICAgICAgICAgICAgICBuZXcgU3RBWFNPQVBNb2RlbEJ1aWxkZXIoZW52LmdldFhNTFN0cmVhbVJlYWRlcigpLCBmYWN0b3J5LCBuc1VSSSk7Ci0gICAgICAgIFNPQVBFbnZlbG9wZSBlbnZlbG9wZSA9IChzdEFYU09BUE1vZGVsQnVpbGRlcikuZ2V0U09BUEVudmVsb3BlKCk7Ci0gICAgICAgIGVudmVsb3BlLmJ1aWxkKCk7Ci0KLSAgICAgICAgRWxlbWVudCBlbnZFbGVtID0gKEVsZW1lbnQpZW52ZWxvcGU7Ci0gICAgICAgIHJldHVybiBlbnZFbGVtLmdldE93bmVyRG9jdW1lbnQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBET00gRG9jdW1lbnQgdXNpbmcgdGhlIG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGUKLSAgICAgKgotICAgICAqIEBwYXJhbSBlbnYgQW4gb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZSBpbnN0YW5jZQotICAgICAqIEByZXR1cm4gdGhlIG9yZy5hcGFjaGUuYXhpczIuc29hcC5pbXBsLmRvbS5TT0FQRW52ZWxvcGVJbXBsIG9mIHRoZSBnaXZlbiBTT0FQIEVudmVsb3BlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuaW1wbC5kb20uU09BUEVudmVsb3BlSW1wbAotICAgICAgICAgICAgdG9ET09NU09BUEVudmVsb3BlKG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGUgZW52KSB7Ci0gICAgICAgIGVudi5idWlsZCgpOwotCi0gICAgICAgIC8vQ2hlY2sgdGhlIG5hbWVzcGFjZSBhbmQgZmluZCBTT0FQIHZlcnNpb24gYW5kIGZhY3RvcnkKLSAgICAgICAgU3RyaW5nIG5zVVJJOwotICAgICAgICBTT0FQRmFjdG9yeSBmYWN0b3J5OwotICAgICAgICBpZiAoZW52LmdldE5hbWVzcGFjZSgpLmdldE5hbWVzcGFjZVVSSSgpCi0gICAgICAgICAgICAgICAgLmVxdWFscyhTT0FQMTFDb25zdGFudHMuU09BUF9FTlZFTE9QRV9OQU1FU1BBQ0VfVVJJKSkgewotICAgICAgICAgICAgbnNVUkkgPSBTT0FQMTFDb25zdGFudHMuU09BUF9FTlZFTE9QRV9OQU1FU1BBQ0VfVVJJOwotICAgICAgICAgICAgZmFjdG9yeSA9IERPT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDExRmFjdG9yeSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbnNVUkkgPSBTT0FQMTJDb25zdGFudHMuU09BUF9FTlZFTE9QRV9OQU1FU1BBQ0VfVVJJOwotICAgICAgICAgICAgZmFjdG9yeSA9IERPT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDExRmFjdG9yeSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RBWFNPQVBNb2RlbEJ1aWxkZXIgc3RBWFNPQVBNb2RlbEJ1aWxkZXIgPQotICAgICAgICAgICAgICAgIG5ldyBTdEFYU09BUE1vZGVsQnVpbGRlcihlbnYuZ2V0WE1MU3RyZWFtUmVhZGVyKCksIGZhY3RvcnksIG5zVVJJKTsKLSAgICAgICAgU09BUEVudmVsb3BlIGVudmVsb3BlID0gKHN0QVhTT0FQTW9kZWxCdWlsZGVyKS5nZXRTT0FQRW52ZWxvcGUoKTsKLSAgICAgICAgZW52ZWxvcGUuYnVpbGQoKTsKLQotICAgICAgICByZXR1cm4gKG9yZy5hcGFjaGUuYXhpb20uc29hcC5pbXBsLmRvbS5TT0FQRW52ZWxvcGVJbXBsKWVudmVsb3BlOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZQotICAgICAgICAgICAgZ2V0U09BUEVudmVsb3BlRnJvbURPT01Eb2N1bWVudChvcmcudzNjLmRvbS5Eb2N1bWVudCBkb2MpIHsKLQotICAgICAgICBPTUVsZW1lbnQgZG9jRWxlbSA9IChPTUVsZW1lbnQpZG9jLmdldERvY3VtZW50RWxlbWVudCgpOwotICAgICAgICBTdEFYU09BUE1vZGVsQnVpbGRlciBzdEFYU09BUE1vZGVsQnVpbGRlciA9Ci0gICAgICAgICAgICAgICAgbmV3IFN0QVhTT0FQTW9kZWxCdWlsZGVyKGRvY0VsZW0uZ2V0WE1MU3RyZWFtUmVhZGVyKCksIG51bGwpOwotICAgICAgICByZXR1cm4gc3RBWFNPQVBNb2RlbEJ1aWxkZXIuZ2V0U09BUEVudmVsb3BlKCk7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGUKLSAgICAgICAgICAgIHRvT01TT0FQRW52ZWxvcGUob3JnLnczYy5kb20uRWxlbWVudCBlbGVtKSB7Ci0KLSAgICAgICAgT01FbGVtZW50IGRvY0VsZW0gPSAoT01FbGVtZW50KWVsZW07Ci0gICAgICAgIFN0QVhTT0FQTW9kZWxCdWlsZGVyIHN0QVhTT0FQTW9kZWxCdWlsZGVyID0KLSAgICAgICAgICAgICAgICBuZXcgU3RBWFNPQVBNb2RlbEJ1aWxkZXIoZG9jRWxlbS5nZXRYTUxTdHJlYW1SZWFkZXIoKSwgbnVsbCk7Ci0gICAgICAgIHJldHVybiBzdEFYU09BUE1vZGVsQnVpbGRlci5nZXRTT0FQRW52ZWxvcGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0IGEgZ2l2ZW4gT01FbGVtZW50IHRvIGEgRE9NIEVsZW1lbnQKLSAgICAgKgotICAgICAqIEBwYXJhbSBlbGVtZW50Ci0gICAgICogQHJldHVybiBET00gRWxlbWVudAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgb3JnLnczYy5kb20uRWxlbWVudCB0b0RPTShPTUVsZW1lbnQgZWxlbWVudCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgIGVsZW1lbnQuc2VyaWFsaXplKGJhb3MpOwotICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBiYWlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSk7Ci0KLSAgICAgICAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBmYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICBmYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOwotICAgICAgICByZXR1cm4gZmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKS5wYXJzZShiYWlzKS5nZXREb2N1bWVudEVsZW1lbnQoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYWFqL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NhYWovdXRpbC9VbmRlcnN0YW5kQWxsSGVhZGVyc0hhbmRsZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhYWovc3JjL29yZy9hcGFjaGUvYXhpczIvc2Fhai91dGlsL1VuZGVyc3RhbmRBbGxIZWFkZXJzSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGMyMGFkLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhYWovc3JjL29yZy9hcGFjaGUvYXhpczIvc2Fhai91dGlsL1VuZGVyc3RhbmRBbGxIZWFkZXJzSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNhYWoudXRpbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBIZWFkZXJCbG9jazsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5oYW5kbGVycy5BYnN0cmFjdEhhbmRsZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLS8qKgotICogTWFya3MgYWxsIFNPQVAgaGVhZGVycyBhcyBwcm9jZXNzZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBVbmRlcnN0YW5kQWxsSGVhZGVyc0hhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIgewotCi0gICAgcHVibGljIEludm9jYXRpb25SZXNwb25zZSBpbnZva2UoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIGlmIChtc2dDb250ZXh0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBJbnZvY2F0aW9uUmVzcG9uc2UuQ09OVElOVUU7Ci0gICAgICAgIH0gCi0gICAgICAgICAgICAgICAgCi0gICAgICAgIFNPQVBFbnZlbG9wZSBlbnZlbG9wZSA9IG1zZ0NvbnRleHQuZ2V0RW52ZWxvcGUoKTsKLSAgICAgICAgaWYgKGVudmVsb3BlLmdldEhlYWRlcigpID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBJbnZvY2F0aW9uUmVzcG9uc2UuQ09OVElOVUU7ICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBQYXNzaW5nIGluIG51bGwgd2lsbCBnZXQgaGVhZGVycyB0YXJnZXRlZCBmb3IgTkVYVCBhbmQgVUxUSU1BVEUgUkVDRUlWRVIKLSAgICAgICAgSXRlcmF0b3IgaGVhZGVyQmxvY2tzID0gZW52ZWxvcGUuZ2V0SGVhZGVyKCkuZ2V0SGVhZGVyc1RvUHJvY2VzcyhudWxsKTsKLSAgICAgICAgd2hpbGUgKGhlYWRlckJsb2Nrcy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIFNPQVBIZWFkZXJCbG9jayBoZWFkZXJCbG9jayA9IChTT0FQSGVhZGVyQmxvY2spIGhlYWRlckJsb2Nrcy5uZXh0KCk7Ci0gICAgICAgICAgICBoZWFkZXJCbG9jay5zZXRQcm9jZXNzZWQoKTsgICAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gSW52b2NhdGlvblJlc3BvbnNlLkNPTlRJTlVFOyAgICAgICAgCi0gICAgfQotICAKLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhYWovdGVzdC1yZXNvdXJjZXMvYXR0YWNoLmdpZiBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhYWovdGVzdC1yZXNvdXJjZXMvYXR0YWNoLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI0MDMyOC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYWFqL3Rlc3QtcmVzb3VyY2VzL2F0dGFjaC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYWFqL3Rlc3QtcmVzb3VyY2VzL2F0dGFjaC50eHQgYi92MS41LjFSQzMvbW9kdWxlcy9zYWFqL3Rlc3QtcmVzb3VyY2VzL2F0dGFjaC50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5NDRhOWYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2Fhai90ZXN0LXJlc291cmNlcy9hdHRhY2gudHh0CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotVGhpcyBpcyBhIHRlc3QgZmlsZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhYWovdGVzdC1yZXNvdXJjZXMvYXR0YWNoLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhYWovdGVzdC1yZXNvdXJjZXMvYXR0YWNoLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNlZmRmYi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYWFqL3Rlc3QtcmVzb3VyY2VzL2F0dGFjaC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNjAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTwhRE9DVFlQRSBQcm92aWRlckNvbmZpZwotICAgIFBVQkxJQyAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEpBWE0gUHJvdmlkZXIvL0VOIgotICAgICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9kdGRzL2pheG1fcHJvdmlkZXJfMV8wLmR0ZCI+Ci0KLTxQcm92aWRlckNvbmZpZz4KLSAgPFByb2ZpbGUgcHJvZmlsZUlkPSJlYnhtbCI+Ci0gICAgPFRyYW5zcG9ydD4KLSAgICAgIDxQcm90b2NvbD4KLSAgICAgICAgICBodHRwCi0gICAgICA8L1Byb3RvY29sPgotCi0gICAgICA8RW5kcG9pbnQ+Ci0JICA8VVJJPgotCSAgICAgaHR0cDovL3d3dy53b21iYXRzLmNvbS9yZW1vdGUvc2VuZGVyCi0JICA8L1VSST4KLQkgIDxVUkw+Ci0JICAgICBodHRwOi8vMTI3LjAuMC4xOjgwODEvamF4bS1wcm92aWRlci9yZWNlaXZlci9lYnhtbAotCSAgPC9VUkw+Ci0gICAgICA8L0VuZHBvaW50PgotCi0gICAgIDxFcnJvckhhbmRsaW5nPgotICAgICAgICA8UmV0cnk+Ci0gICAgICAgICAgIDxNYXhSZXRyaWVzPgotCQk1Ci0gICAgICAgCSAgIDwvTWF4UmV0cmllcz4KLSAgCSAgIDxSZXRyeUludGVydmFsPgotCQkyMDAwCi0JICAgPC9SZXRyeUludGVydmFsPgotICAgICAgICA8L1JldHJ5PgotICAgIDwvRXJyb3JIYW5kbGluZz4KLQotICAgIDxQZXJzaXN0ZW5jZT4KLSAgICAgIDxEaXJlY3Rvcnk+Ci0gICAgICAgICBlYnhtbC8KLSAgICAgIDwvRGlyZWN0b3J5PgotICAgICAgPFJlY29yZHNQZXJGaWxlPgotICAgICAgICAgICAxMAotICAgICAgPC9SZWNvcmRzUGVyRmlsZT4KLSAgICA8L1BlcnNpc3RlbmNlPgotICAgIDwvVHJhbnNwb3J0PgotCi0gICAgPFRyYW5zcG9ydD4KLSAgICAgIDxQcm90b2NvbD4KLSAgICAgICAgICBodHRwcwotICAgICAgPC9Qcm90b2NvbD4KLQotICAgICAgPEVuZHBvaW50PgotCSAgPFVSST4KLQkgICAgIGpheG0uZHVtbXkudXJpCi0JICA8L1VSST4KLQkgIDxVUkw+Ci0JICAgICBodHRwczovLzEyNy4wLjAuMTo4NDQzL2pheG0vZHVtbXkvCi0JICA8L1VSTD4KLSAgICAgIDwvRW5kcG9pbnQ+Ci0KLSAgICA8UGVyc2lzdGVuY2U+Ci0gICAgICA8RGlyZWN0b3J5PgotICAgICAgICAgZWJ4bWwtaHR0cHMvCi0gICAgICA8L0RpcmVjdG9yeT4KLSAgICAgIDxSZWNvcmRzUGVyRmlsZT4KLSAgICAgICAgICAgMTAKLSAgICAgIDwvUmVjb3Jkc1BlckZpbGU+Ci0gICAgPC9QZXJzaXN0ZW5jZT4KLQotICAgIDwvVHJhbnNwb3J0PgotICA8L1Byb2ZpbGU+Ci0KLSAgPFByb2ZpbGUgcHJvZmlsZUlkPSJzb2FwcnAiPgotICAgIDxUcmFuc3BvcnQ+Ci0gICAgICA8UHJvdG9jb2w+Ci0gICAgICAgICAgaHR0cAotICAgICAgPC9Qcm90b2NvbD4KLQotICAgICAgPEVuZHBvaW50PgotCSAgPFVSST4KLQkgICAgIGh0dHA6Ly93d3cud29tYmF0cy5jb20vc29hcHJwL3NlbmRlcgotCSAgPC9VUkk+Ci0JICA8VVJMPgotCSAgICAgaHR0cDovLzEyNy4wLjAuMTo4MDgxL2pheG0tcHJvdmlkZXIvcmVjZWl2ZXIvc29hcHJwCi0JICA8L1VSTD4KLSAgICAgIDwvRW5kcG9pbnQ+Ci0KLSAgICAgPEVycm9ySGFuZGxpbmc+Ci0gICAgICAgIDxSZXRyeT4KLSAgICAgICAgICAgPE1heFJldHJpZXM+Ci0JCTMKLSAgICAgICAJICAgPC9NYXhSZXRyaWVzPgotICAJICAgPFJldHJ5SW50ZXJ2YWw+Ci0JCTIwMDAKLQkgICA8L1JldHJ5SW50ZXJ2YWw+Ci0gICAgICAgIDwvUmV0cnk+Ci0gICAgPC9FcnJvckhhbmRsaW5nPgotCi0gICAgICA8UGVyc2lzdGVuY2U+Ci0gICAgICAgIDxEaXJlY3Rvcnk+Ci0gICAgICAgICAgIHNvYXBycC8KLSAgICAgICAgPC9EaXJlY3Rvcnk+Ci0gICAgICAgIDxSZWNvcmRzUGVyRmlsZT4KLSAgICAgICAgICAgIDIwCi0gICAgICAgIDwvUmVjb3Jkc1BlckZpbGU+Ci0gICAgICA8L1BlcnNpc3RlbmNlPgotICAgIDwvVHJhbnNwb3J0PgotCi0gICAgPFRyYW5zcG9ydD4KLSAgICAgIDxQcm90b2NvbD4KLSAgICAgICAgICBodHRwcwotICAgICAgPC9Qcm90b2NvbD4KLQotICAgIDxFbmRwb2ludD4KLQkgIDxVUkk+Ci0JICAgICBqYXhtLmR1bW15LnVyaQotCSAgPC9VUkk+Ci0JICA8VVJMPgotCSAgICAgaHR0cHM6Ly8xMjcuMC4wLjE6ODQ0My9qYXhtL2R1bW15Ci0JICA8L1VSTD4KLSAgICAgIDwvRW5kcG9pbnQ+Ci0gICAgPC9UcmFuc3BvcnQ+Ci0gIDwvUHJvZmlsZT4KLQotICAgICA8RXJyb3JIYW5kbGluZz4KLSAgICAgICAgPFJldHJ5PgotICAgICAgICAgICA8TWF4UmV0cmllcz4KLQkJMwotICAgICAgIAkgICA8L01heFJldHJpZXM+Ci0gIAkgICA8UmV0cnlJbnRlcnZhbD4KLQkJMjAwMAotCSAgIDwvUmV0cnlJbnRlcnZhbD4KLSAgICAgICAgPC9SZXRyeT4KLSAgICA8L0Vycm9ySGFuZGxpbmc+Ci0KLSAgICA8UGVyc2lzdGVuY2U+Ci0gICAgICA8RGlyZWN0b3J5PgotICAgICAgICAgdGVtcGRpci8KLSAgICAgIDwvRGlyZWN0b3J5PgotICAgICAgPFJlY29yZHNQZXJGaWxlPgotICAgICAgICAgICAxMQotICAgICAgPC9SZWNvcmRzUGVyRmlsZT4KLSAgICA8L1BlcnNpc3RlbmNlPgotPC9Qcm92aWRlckNvbmZpZz4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhYWovdGVzdC1yZXNvdXJjZXMvYXhpczIuanBnIGIvdjEuNS4xUkMzL21vZHVsZXMvc2Fhai90ZXN0LXJlc291cmNlcy9heGlzMi5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3N2VmOGMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2Fhai90ZXN0LXJlc291cmNlcy9heGlzMi5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYWFqL3Rlc3QtcmVzb3VyY2VzL2F4aXMyLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhYWovdGVzdC1yZXNvdXJjZXMvYXhpczIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2ZhYWIxLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhYWovdGVzdC1yZXNvdXJjZXMvYXhpczIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGF4aXNjb25maWcgbmFtZT0iQXhpc0phdmEyLjAiPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIFBhcmFtZXRlcnMgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iaG90ZGVwbG95bWVudCI+dHJ1ZTwvcGFyYW1ldGVyPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iaG90dXBkYXRlIj5mYWxzZTwvcGFyYW1ldGVyPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iZW5hYmxlTVRPTSI+dHJ1ZTwvcGFyYW1ldGVyPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iY2FjaGVBdHRhY2htZW50cyI+ZmFsc2U8L3BhcmFtZXRlcj4KLSAgICA8IS0tIFVuY29tbWVudCB0aGlzIHRvIGVuYWJsZSBSRVNUIHN1cHBvcnQgLS0+Ci0gICAgPCEtLSAgICA8cGFyYW1ldGVyIG5hbWU9ImVhbmJsZVJFU1QiPnRydWU8L3BhcmFtZXRlcj4tLT4KLQotCi0gICAgPHBhcmFtZXRlciBuYW1lPSJ1c2VyTmFtZSI+YWRtaW48L3BhcmFtZXRlcj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9InBhc3N3b3JkIj5heGlzMjwvcGFyYW1ldGVyPgotCi0KLQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIE1lc3NhZ2UgUmVjZWl2ZXJzIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIFRoaXMgaXMgdGhlIERlYWZ1bHQgTWVzc2FnZSBSZWNlaXZlciBmb3IgdGhlIFJlcXVlc3QgUmVzcG9uc2Ugc3R5bGUgT3BlcmF0aW9ucyAtLT4KLSAgICA8bWVzc2FnZVJlY2VpdmVyIG1lcD0iSU5PVVQiIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5SYXdYTUxJTk91dE1lc3NhZ2VSZWNlaXZlciIvPgotCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gVHJhbnNwb3J0IElucyAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPHRyYW5zcG9ydFJlY2VpdmVyIG5hbWU9Imh0dHAiIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLlNpbXBsZUhUVFBTZXJ2ZXIiPgotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9InBvcnQiPjYwNjA8L3BhcmFtZXRlcj4KLSAgICA8L3RyYW5zcG9ydFJlY2VpdmVyPgotCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gVHJhbnNwb3J0IE91dHMgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi0gIDx0cmFuc3BvcnRTZW5kZXIgbmFtZT0iaHR0cCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuQ29tbW9uc0hUVFBUcmFuc3BvcnRTZW5kZXIiPgotICAgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJQUk9UT0NPTCI+SFRUUC8xLjE8L3BhcmFtZXRlcj4KLSAgICA8L3RyYW5zcG9ydFNlbmRlcj4KLSAgICA8dHJhbnNwb3J0U2VuZGVyIG5hbWU9ImxvY2FsIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQubG9jYWwuTG9jYWxUcmFuc3BvcnRTZW5kZXIiLz4KLQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIEdsb2JhbCBNb2R1bGVzICAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBVbmNvbW1lbnQgdGhpcyB0byBlbmFibGUgQWRkcmVzc2luZwotICAgIDxtb2R1bGUgcmVmPSJhZGRyZXNzaW5nIi8+IC0tPgotCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gUGhhc2VzICAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPHBoYXNlT3JkZXIgdHlwZT0iSW5GbG93Ij4KLSAgICAgICAgPCEtLSAgU3lzdGVtIHByZSBkZWZpbmVkIHBoYXNlcyAgICAgICAtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlRyYW5zcG9ydEluIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJQcmVEaXNwYXRjaCIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iRGlzcGF0Y2giIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5EaXNwYXRjaFBoYXNlIj4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5BZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIi8+Ci0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5SZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIi8+Ci0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIi8+Ci0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciIvPgotICAgICAgICA8L3BoYXNlPgotICAgICAgICA8IS0tICBTeXN0ZW0gcHJlIGRlZmluZWQgcGhhc2VzICAgICAgIC0tPgotICAgICAgICA8IS0tICAgQWZ0ZXIgUG9zdGRpc3BhdGNoIHBoYXNlIG1vZHVsZSBhdXRob3Igb3Igb3Igc2VydmljZSBhdXRob3IgY2FuIGFkZCBhbnkgcGhhc2UgaGUgd2FudCAgICAgIC0tPgotICAgICAgICA8cGhhc2UgbmFtZT0idXNlcnBoYXNlMSIvPgotICAgIDwvcGhhc2VPcmRlcj4KLSAgICA8cGhhc2VPcmRlciB0eXBlPSJPdXRGbG93Ij4KLSAgICAgICAgPCEtLSAgICAgIHVzZXIgY2FuIGFkZCBoaXMgb3duIHBoYXNlcyB0byB0aGlzIGFyZWEgIC0tPgotICAgICAgICA8cGhhc2UgbmFtZT0idXNlcnBoYXNlMSIvPgotICAgICAgICA8IS0tc3lzdGVtIHByZWRlZmluZWQgcGhhc2UtLT4KLSAgICAgICAgPCEtLXRoZXNlIHBoYXNlIHdpbGwgcnVuIGlycmVzcGVjdGl2ZSBvZiB0aGUgc2VydmljZS0tPgotICAgICAgICA8cGhhc2UgbmFtZT0iUG9saWN5RGV0ZXJtaW5hdGlvbiIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iTWVzc2FnZU91dCIvPgotICAgIDwvcGhhc2VPcmRlcj4KLSAgICA8cGhhc2VPcmRlciB0eXBlPSJJbkZhdWx0RmxvdyI+Ci0gICAgICAgIDwhLS0gICAgICB1c2VyIGNhbiBhZGQgaGlzIG93biBwaGFzZXMgdG8gdGhpcyBhcmVhICAtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9InVzZXJwaGFzZTEiLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9IkRpc3BhdGNoIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuRGlzcGF0Y2hQaGFzZSI+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJSZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciIvPgotCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciIvPgotCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJBZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciIvPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iUmVxdWVzdFVSSU9wZXJhdGlvbkRpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5SZXF1ZXN0VVJJT3BlcmF0aW9uRGlzcGF0Y2hlciIvPgotCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiLz4KLQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iSFRUUExvY2F0aW9uQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuSFRUUExvY2F0aW9uQmFzZWREaXNwYXRjaGVyIi8+Ci0gICAgICAgIDwvcGhhc2U+Ci0gICAgPC9waGFzZU9yZGVyPgotICAgIDxwaGFzZU9yZGVyIHR5cGU9Ik91dEZhdWx0RmxvdyI+Ci0gICAgICAgIDwhLS0gICAgICB1c2VyIGNhbiBhZGQgaGlzIG93biBwaGFzZXMgdG8gdGhpcyBhcmVhICAtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9InVzZXJwaGFzZTEiLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlBvbGljeURldGVybWluYXRpb24iLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik1lc3NhZ2VPdXQiLz4KLSAgICA8L3BoYXNlT3JkZXI+Ci08L2F4aXNjb25maWc+Ci0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhYWovdGVzdC1yZXNvdXJjZXMvY29tbW9ucy1sb2dnaW5nLnByb3BlcnRpZXMgYi92MS41LjFSQzMvbW9kdWxlcy9zYWFqL3Rlc3QtcmVzb3VyY2VzL2NvbW1vbnMtbG9nZ2luZy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWZkZDBhLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhYWovdGVzdC1yZXNvdXJjZXMvY29tbW9ucy1sb2dnaW5nLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jDQotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSMNCi0NCi0NCi0jIFRoaXMgaXMgdGhlIGxvZ2dpbmcgcHJvcGVydGllcyB0aGF0IGdvZXMgdG8gdGhlIHdhciwgdGhlcmUgYXJlIHR3byBsb2dnaW5nIGNvbmYga2VwdCBhdCB0aGUgDQotIyBzdm4sIG9uZSBmb3IgZGV2ZWxvcGVtZW50IChvbmUgYXQgc3JjL3Rlc3QtcmVzb3VyY2VzKSBhbmQgb3RoZXIgZm9yIHByb2R1Y2F0aW9uDQotIA0KLSMgVW5jb21tZW50IHRoZSBuZXh0IGxpbmUgdG8gZGlzYWJsZSBhbGwgbG9nZ2luZy4NCi0jb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nPW9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLmltcGwuTm9PcExvZw0KLQ0KLSMgVW5jb21tZW50IHRoZSBuZXh0IGxpbmUgdG8gZW5hYmxlIHRoZSBzaW1wbGUgbG9nIGJhc2VkIGxvZ2dpbmcNCi0jb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nPW9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLmltcGwuU2ltcGxlTG9nDQotDQotIyBVbmNvbW1lbnQgdGhlIG5leHQgbGluZSB0byBlbmFibGUgbG9nNGogYmFzZWQgbG9nZ2luZw0KLW9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZz1vcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5pbXBsLkxvZzRKTG9nZ2VyDQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2Fhai90ZXN0LXJlc291cmNlcy9sb2c0ai5wcm9wZXJ0aWVzIGIvdjEuNS4xUkMzL21vZHVsZXMvc2Fhai90ZXN0LXJlc291cmNlcy9sb2c0ai5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTdmMDQ2Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhYWovdGVzdC1yZXNvdXJjZXMvbG9nNGoucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLSMNCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotIw0KLQ0KLSMgU2V0IHJvb3QgY2F0ZWdvcnkgcHJpb3JpdHkgdG8gSU5GTyBhbmQgaXRzIG9ubHkgYXBwZW5kZXIgdG8gQ09OU09MRS4NCi0jbG9nNGoucm9vdENhdGVnb3J5PURFQlVHLCBDT05TT0xFDQotI2xvZzRqLnJvb3RDYXRlZ29yeT1JTkZPLCBDT05TT0xFLCBMT0dGSUxFDQotI2xvZzRqLnJvb3RDYXRlZ29yeT1ERUJVRywgTE9HRklMRQ0KLWxvZzRqLnJvb3RDYXRlZ29yeT1FUlJPUiwgQ09OU09MRQ0KLQ0KLQ0KLSMgU2V0IHRoZSBlbnRlcnByaXNlIGxvZ2dlciBwcmlvcml0eSB0byBGQVRBTA0KLWxvZzRqLmxvZ2dlci5vcmcuYXBhY2hlLmF4aXMyLmVudGVycHJpc2U9RkFUQUwNCi1sb2c0ai5sb2dnZXIuZGUuaHVuc2lja2VyLmphbG9weS5pbz1GQVRBTA0KLWxvZzRqLmxvZ2dlci5odHRwY2xpZW50LndpcmUuaGVhZGVyPUZBVEFMDQotbG9nNGoubG9nZ2VyLm9yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50PUZBVEFMDQotDQotIyBDT05TT0xFIGlzIHNldCB0byBiZSBhIENvbnNvbGVBcHBlbmRlciB1c2luZyBhIFBhdHRlcm5MYXlvdXQuDQotbG9nNGouYXBwZW5kZXIuQ09OU09MRT1vcmcuYXBhY2hlLmxvZzRqLkNvbnNvbGVBcHBlbmRlcg0KLWxvZzRqLmFwcGVuZGVyLkNPTlNPTEUubGF5b3V0PW9yZy5hcGFjaGUubG9nNGouUGF0dGVybkxheW91dA0KLWxvZzRqLmFwcGVuZGVyLkNPTlNPTEUubGF5b3V0LkNvbnZlcnNpb25QYXR0ZXJuPSVkICUtNXAgJWMgLSAlbSVuDQotDQotIyBMT0dGSUxFIGlzIHNldCB0byBiZSBhIEZpbGUgYXBwZW5kZXIgdXNpbmcgYSBQYXR0ZXJuTGF5b3V0Lg0KLWxvZzRqLmFwcGVuZGVyLkxPR0ZJTEU9b3JnLmFwYWNoZS5sb2c0ai5GaWxlQXBwZW5kZXINCi1sb2c0ai5hcHBlbmRlci5MT0dGSUxFLkZpbGU9YXhpczIubG9nDQotbG9nNGouYXBwZW5kZXIuTE9HRklMRS5BcHBlbmQ9dHJ1ZQ0KLWxvZzRqLmFwcGVuZGVyLkxPR0ZJTEUubGF5b3V0PW9yZy5hcGFjaGUubG9nNGouUGF0dGVybkxheW91dA0KLWxvZzRqLmFwcGVuZGVyLkxPR0ZJTEUubGF5b3V0LkNvbnZlcnNpb25QYXR0ZXJuPSVkIFsldF0gJS01cCAlYyAleCAtICVtJW4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYWFqL3Rlc3QtcmVzb3VyY2VzL21lc3NhZ2UuYmluIGIvdjEuNS4xUkMzL21vZHVsZXMvc2Fhai90ZXN0LXJlc291cmNlcy9tZXNzYWdlLmJpbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGRjZWQ5Zi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYWFqL3Rlc3QtcmVzb3VyY2VzL21lc3NhZ2UuYmluCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotLS1NSU1FQm91bmRhcnl1cm46dXVpZDpGMDJFQ0MxODg3M0NGQjczRTIxMTQxMjc0ODkwOTMwNwotY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi94b3AreG1sOyBjaGFyc2V0PVVURi04OyB0eXBlPSJ0ZXh0L3htbCI7Ci1jb250ZW50LXRyYW5zZmVyLWVuY29kaW5nOiBiaW5hcnkKLWNvbnRlbnQtaWQ6IDwwLnVybjp1dWlkOkYwMkVDQzE4ODczQ0ZCNzNFMjExNDEyNzQ4OTA5MzA4QGFwYWNoZS5vcmc+Ci0KLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+PHNvYXBlbnY6RW52ZWxvcGUgeG1sbnM6c29hcGVudj0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iPjxzb2FwZW52OkhlYWRlcj48bnMtcHJlZml4OkhlYWRlcjEgeG1sbnM6bnMtcHJlZml4PSJucy11cmkiIHhtbG5zOm11c3RVbmRlcnN0YW5kPSIxIiBzb2FwZW52Om11c3RVbmRlcnN0YW5kPSIxIj5UaGlzIGlzIEhlYWRlcjE8L25zLXByZWZpeDpIZWFkZXIxPjxucy1wcmVmaXg6SGVhZGVyMiB4bWxuczpucy1wcmVmaXg9Im5zLXVyaSIgeG1sbnM6bXVzdFVuZGVyc3RhbmQ9IjAiIHNvYXBlbnY6bXVzdFVuZGVyc3RhbmQ9IjAiPlRoaXMgaXMgSGVhZGVyMjwvbnMtcHJlZml4OkhlYWRlcjI+PG5zLXByZWZpeDpIZWFkZXIzIHhtbG5zOm5zLXByZWZpeD0ibnMtdXJpIiB4bWxuczptdXN0VW5kZXJzdGFuZD0iMSIgc29hcGVudjptdXN0VW5kZXJzdGFuZD0iMSI+VGhpcyBpcyBIZWFkZXIzPC9ucy1wcmVmaXg6SGVhZGVyMz48bnMtcHJlZml4OkhlYWRlcjQgeG1sbnM6bnMtcHJlZml4PSJucy11cmkiIHhtbG5zOm11c3RVbmRlcnN0YW5kPSIwIiBzb2FwZW52Om11c3RVbmRlcnN0YW5kPSIwIj5UaGlzIGlzIEhlYWRlcjQ8L25zLXByZWZpeDpIZWFkZXI0Pjwvc29hcGVudjpIZWFkZXI+PHNvYXBlbnY6Qm9keT48bnMtcHJlZml4OkJvZHkxIHhtbG5zOm5zLXByZWZpeD0ibnMtdXJpIj48bnMtcHJlZml4OkNoaWxkMT5UaGlzIGlzIENoaWxkMTwvbnMtcHJlZml4OkNoaWxkMT48bnMtcHJlZml4OkNoaWxkMj5UaGlzIGlzIENoaWxkMjwvbnMtcHJlZml4OkNoaWxkMj48L25zLXByZWZpeDpCb2R5MT48c3dhOmVjaG8geG1sbnM6c3dhPSJodHRwOi8vZmFrZU5hbWVzcGFjZS5vcmciPjxpbnRlcm5hbCB4bWxucz0iIj48dGV4dCB4bWxucz0iIj48eG9wOkluY2x1ZGUgaHJlZj0iY2lkOjEudXJuOnV1aWQ6RjAyRUNDMTg4NzNDRkI3M0UyMTE0MTI3NDg5MDkzNDlAYXBhY2hlLm9yZyIgeG1sbnM6eG9wPSJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3hvcC9pbmNsdWRlIiAvPjwvdGV4dD48L2ludGVybmFsPjwvc3dhOmVjaG8+PC9zb2FwZW52OkJvZHk+PC9zb2FwZW52OkVudmVsb3BlPgotLS1NSU1FQm91bmRhcnl1cm46dXVpZDpGMDJFQ0MxODg3M0NGQjczRTIxMTQxMjc0ODkwOTMwNwotY29udGVudC10eXBlOiB0ZXh0L3htbAotY29udGVudC10cmFuc2Zlci1lbmNvZGluZzogYmluYXJ5Ci1jb250ZW50LWlkOiA8MS51cm46dXVpZDpGMDJFQ0MxODg3M0NGQjczRTIxMTQxMjc0ODkwOTM0OUBhcGFjaGUub3JnPgotCi1UQVRBCi0KLS0tTUlNRUJvdW5kYXJ5dXJuOnV1aWQ6RjAyRUNDMTg4NzNDRkI3M0UyMTE0MTI3NDg5MDkzMDctLQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2Fhai90ZXN0LXJlc291cmNlcy9zb2FwLWJvZHkueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvc2Fhai90ZXN0LXJlc291cmNlcy9zb2FwLWJvZHkueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDYyMmRmLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhYWovdGVzdC1yZXNvdXJjZXMvc29hcC1ib2R5LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHNodzpBZGRyZXNzIHNodzp0PSd0ZXN0JyB4bWxuczpzaHc9Imh0dHA6Ly93d3cuamNvbW1lcmNlLm5ldC9zb2FwL25zL1NPQVBIZWxsb1dvcmxkIj4KLSAgICA8c2h3Ok51bWJlcj4xMjwvc2h3Ok51bWJlcj4KLSAgICA8c2h3OkNpdHk+Ci0gICAgICAgIDxzaHc6ej5EZWhpd2VsYTwvc2h3Ono+Ci0gICAgPC9zaHc6Q2l0eT4KLSAgICA8c2h3OkNvdW50cnk+Ci0gICAgICAgIDxzaHc6eT5TcmkgTGFua2E8L3Nodzp5PgotICAgIDwvc2h3OkNvdW50cnk+Ci08L3NodzpBZGRyZXNzPgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2Fhai90ZXN0LXJlc291cmNlcy9zb2FwLXBhcnQtaXNvLTg4NTktMS54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9zYWFqL3Rlc3QtcmVzb3VyY2VzL3NvYXAtcGFydC1pc28tODg1OS0xLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTJhZDhmNy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYWFqL3Rlc3QtcmVzb3VyY2VzL3NvYXAtcGFydC1pc28tODg1OS0xLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9Imlzby04ODU5LTEiPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08c29hcGVudjpFbnZlbG9wZSB4bWxuczpzb2FwZW52PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyIKLSAgICAgICAgICAgICAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgICAgICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIj4KLQk8c29hcGVudjpIZWFkZXI+Ci0JCTxwcmVmOkhlYWRlcjEgeG1sbnM6cHJlZj0iaHR0cDovL3Rlc3QuYXBhY2gub3JnL3Rlc3QiPlRoaXMgaXMgaGVhZGVyMTwvcHJlZjpIZWFkZXIxPgotCTwvc29hcGVudjpIZWFkZXI+Ci0JPHNvYXBlbnY6Qm9keT4KLQkJPHN3YTI6ZWNobyB4bWxuczpzd2EyPSJodHRwOi8vZmFrZU5hbWVzcGFjZTIub3JnIj4KLQkJCTxzb21ldGhpbmc+VGhpcyBpcyBzb21lIHRleHQuSGVyZSBhcmUgc29tZSBzcGVjaWFsIGNoYXJzIDog9sbarqQ8L3NvbWV0aGluZz4KLQkJPC9zd2EyOmVjaG8+Ci0JPC9zb2FwZW52OkJvZHk+Ci08L3NvYXBlbnY6RW52ZWxvcGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2Fhai90ZXN0LXJlc291cmNlcy9zb2FwLXBhcnQueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvc2Fhai90ZXN0LXJlc291cmNlcy9zb2FwLXBhcnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTZjNjQyLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhYWovdGVzdC1yZXNvdXJjZXMvc29hcC1wYXJ0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHNvYXBlbnY6RW52ZWxvcGUgeG1sbnM6c29hcGVudj0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iCi0gICAgICAgICAgICAgICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICAgICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI+Ci0gICAgPHNvYXBlbnY6SGVhZGVyPgotICAgICAgICA8c2h3OkhlbGxvIHhtbG5zOnNodz0iaHR0cDovL3d3dy5qY29tbWVyY2UubmV0L3NvYXAvbnMvU09BUEhlbGxvV29ybGQiPgotICAgICAgICAgICAgPHNodzpNeW5hbWU+VG9ueTwvc2h3Ok15bmFtZT4KLSAgICAgICAgPC9zaHc6SGVsbG8+Ci0gICAgPC9zb2FwZW52OkhlYWRlcj4KLSAgICA8c29hcGVudjpCb2R5PgotICAgICAgICA8c2h3OkFkZHJlc3Mgc2h3OnQ9J3Rlc3QnIHhtbG5zOnNodz0iaHR0cDovL3d3dy5qY29tbWVyY2UubmV0L3NvYXAvbnMvU09BUEhlbGxvV29ybGQiPgotICAgICAgICAgICAgPHNodzpDaXR5PkdFTlQ8L3NodzpDaXR5PgotICAgICAgICA8L3NodzpBZGRyZXNzPgotICAgIDwvc29hcGVudjpCb2R5PgotPC9zb2FwZW52OkVudmVsb3BlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhYWovdGVzdC1yZXNvdXJjZXMvc29hcC1wYXJ0My54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9zYWFqL3Rlc3QtcmVzb3VyY2VzL3NvYXAtcGFydDMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiYTE5NzhkLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhYWovdGVzdC1yZXNvdXJjZXMvc29hcC1wYXJ0My54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSd1dGYtOCc/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzb2FwZW52OkVudmVsb3BlIHhtbG5zOnNvYXBlbnY9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIj4KLTxzb2FwZW52OkhlYWRlcj4KLTxucy1wcmVmaXg6SGVhZGVyMSB4bWxuczpucy1wcmVmaXg9Im5zLXVyaSIgc29hcGVudjptdXN0VW5kZXJzdGFuZD0iMSI+VGhpcyBpcyBIZWFkZXIxPC9ucy1wcmVmaXg6SGVhZGVyMT4KLTxucy1wcmVmaXg6SGVhZGVyMiB4bWxuczpucy1wcmVmaXg9Im5zLXVyaSIgc29hcGVudjptdXN0VW5kZXJzdGFuZD0iMCI+VGhpcyBpcyBIZWFkZXIyPC9ucy1wcmVmaXg6SGVhZGVyMj4KLTxucy1wcmVmaXg6SGVhZGVyMyB4bWxuczpucy1wcmVmaXg9Im5zLXVyaSIgc29hcGVudjptdXN0VW5kZXJzdGFuZD0iMSI+VGhpcyBpcyBIZWFkZXIzPC9ucy1wcmVmaXg6SGVhZGVyMz4KLTxucy1wcmVmaXg6SGVhZGVyNCB4bWxuczpucy1wcmVmaXg9Im5zLXVyaSIgc29hcGVudjptdXN0VW5kZXJzdGFuZD0iMCI+VGhpcyBpcyBIZWFkZXI0PC9ucy1wcmVmaXg6SGVhZGVyND4KLTwvc29hcGVudjpIZWFkZXI+Ci08c29hcGVudjpCb2R5PgotPG5zLXByZWZpeDpCb2R5MSB4bWxuczpucy1wcmVmaXg9Im5zLXVyaSI+Ci08bnMtcHJlZml4OkNoaWxkMT5UaGlzIGlzIENoaWxkMTwvbnMtcHJlZml4OkNoaWxkMT4KLTxucy1wcmVmaXg6Q2hpbGQyPlRoaXMgaXMgQ2hpbGQyPC9ucy1wcmVmaXg6Q2hpbGQyPgotPC9ucy1wcmVmaXg6Qm9keTE+Ci08L3NvYXBlbnY6Qm9keT4KLTwvc29hcGVudjpFbnZlbG9wZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYWFqL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zYWFqL0F0dGFjaG1lbnRTZXJpYWxpemF0aW9uVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvc2Fhai90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2Fhai9BdHRhY2htZW50U2VyaWFsaXphdGlvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI2Y2ZjZC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYWFqL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zYWFqL0F0dGFjaG1lbnRTZXJpYWxpemF0aW9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zYWFqOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgamF2YXguYWN0aXZhdGlvbi5EYXRhSGFuZGxlcjsKLWltcG9ydCBqYXZheC5hY3RpdmF0aW9uLkZpbGVEYXRhU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLkF0dGFjaG1lbnRQYXJ0OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLk1lc3NhZ2VGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLk1pbWVIZWFkZXJzOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBCb2R5OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBFbGVtZW50OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBFbnZlbG9wZTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQSGVhZGVyOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBNZXNzYWdlOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBQYXJ0OwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBBdHRhY2htZW50U2VyaWFsaXphdGlvblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNSU1FX01VTFRJUEFSVF9SRUxBVEVEID0gIm11bHRpcGFydC9yZWxhdGVkIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNSU1FX0FQUExJQ0FUSU9OX0RJTUUgPSAiYXBwbGljYXRpb24vZGltZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlNfUFJFRklYID0gImpheG10c3QiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5TX1VSSSA9ICJodHRwOi8vd3d3Lmpjb21tZXJjZS5uZXQvc29hcC9qYXhtL1Rlc3RKYXhtIjsKLQotICAgIHB1YmxpYyBBdHRhY2htZW50U2VyaWFsaXphdGlvblRlc3QoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEF0dGFjaG1lbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFpcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgICAgIGludCBjb3VudCA9IHNhdmVNc2dXaXRoQXR0YWNobWVudHMoYmFpcyk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoY291bnQsIDIpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgRXhjZXB0aW9uIDogIiArIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGludCBzYXZlTXNnV2l0aEF0dGFjaG1lbnRzKE91dHB1dFN0cmVhbSBvcykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE1lc3NhZ2VGYWN0b3J5IG1mID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgU09BUE1lc3NhZ2UgbXNnID0gbWYuY3JlYXRlTWVzc2FnZSgpOwotCi0gICAgICAgIFNPQVBQYXJ0IHNvYXBQYXJ0ID0gbXNnLmdldFNPQVBQYXJ0KCk7Ci0gICAgICAgIFNPQVBFbnZlbG9wZSBlbnZlbG9wZSA9IHNvYXBQYXJ0LmdldEVudmVsb3BlKCk7Ci0gICAgICAgIFNPQVBIZWFkZXIgaGVhZGVyID0gZW52ZWxvcGUuZ2V0SGVhZGVyKCk7Ci0gICAgICAgIFNPQVBCb2R5IGJvZHkgPSBlbnZlbG9wZS5nZXRCb2R5KCk7Ci0KLSAgICAgICAgU09BUEVsZW1lbnQgZWwgPSBoZWFkZXIuYWRkSGVhZGVyRWxlbWVudChlbnZlbG9wZS5jcmVhdGVOYW1lKCJmaWVsZDQiLCBOU19QUkVGSVgsIE5TX1VSSSkpOwotCi0gICAgICAgIFNPQVBFbGVtZW50IGVsMiA9IGVsLmFkZENoaWxkRWxlbWVudCgiZmllbGQ0YiIsIE5TX1BSRUZJWCk7Ci0gICAgICAgIGVsMi5hZGRUZXh0Tm9kZSgiZmllbGQ0dmFsdWUiKTsKLQotICAgICAgICBlbCA9IGJvZHkuYWRkQm9keUVsZW1lbnQoZW52ZWxvcGUuY3JlYXRlTmFtZSgiYm9keWZpZWxkMyIsIE5TX1BSRUZJWCwgTlNfVVJJKSk7Ci0gICAgICAgIGVsMiA9IGVsLmFkZENoaWxkRWxlbWVudCgiYm9keWZpZWxkM2EiLCBOU19QUkVGSVgpOwotICAgICAgICBlbDIuYWRkVGV4dE5vZGUoImJvZHl2YWx1ZTNhIik7Ci0gICAgICAgIGVsMiA9IGVsLmFkZENoaWxkRWxlbWVudCgiYm9keWZpZWxkM2IiLCBOU19QUkVGSVgpOwotICAgICAgICBlbDIuYWRkVGV4dE5vZGUoImJvZHl2YWx1ZTNiIik7Ci0gICAgICAgIGVsLmFkZENoaWxkRWxlbWVudCgiZGF0ZWZpZWxkIiwgTlNfUFJFRklYKTsKLQotICAgICAgICAvLyBGaXJzdCBBdHRhY2htZW50Ci0gICAgICAgIEF0dGFjaG1lbnRQYXJ0IGFwID0gbXNnLmNyZWF0ZUF0dGFjaG1lbnRQYXJ0KCk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyB0ZXN0VGV4dCA9ICJzb21lIGF0dGFjaG1lbnQgdGV4dC4uLiI7Ci0gICAgICAgIGFwLnNldENvbnRlbnQodGVzdFRleHQsICJ0ZXh0L3BsYWluIik7Ci0gICAgICAgIG1zZy5hZGRBdHRhY2htZW50UGFydChhcCk7Ci0KLSAgICAgICAgLy8gU2Vjb25kIGF0dGFjaG1lbnQKLSAgICAgICAgU3RyaW5nIGpwZ2ZpbGVuYW1lID0gU3lzdGVtLmdldFByb3BlcnR5KCJiYXNlZGlyIiwgIi4iKSArICIvIiArICJ0ZXN0LXJlc291cmNlcy9heGlzMi5qcGciOwotICAgICAgICBGaWxlIG15ZmlsZSA9IG5ldyBGaWxlKGpwZ2ZpbGVuYW1lKTsKLSAgICAgICAgRmlsZURhdGFTb3VyY2UgZmRzID0gbmV3IEZpbGVEYXRhU291cmNlKG15ZmlsZSk7Ci0gICAgICAgIERhdGFIYW5kbGVyIGRoID0gbmV3IERhdGFIYW5kbGVyKGZkcyk7Ci0gICAgICAgIEF0dGFjaG1lbnRQYXJ0IGFwMiA9IG1zZy5jcmVhdGVBdHRhY2htZW50UGFydChkaCk7Ci0gICAgICAgIGFwMi5zZXRDb250ZW50VHlwZSgiaW1hZ2UvanBnIik7Ci0gICAgICAgIG1zZy5hZGRBdHRhY2htZW50UGFydChhcDIpOwotCi0gICAgICAgIE1pbWVIZWFkZXJzIGhlYWRlcnMgPSBtc2cuZ2V0TWltZUhlYWRlcnMoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShoZWFkZXJzICE9IG51bGwpOwotICAgICAgICBTdHJpbmcgW10gY29udGVudFR5cGUgPSBoZWFkZXJzLmdldEhlYWRlcigiQ29udGVudC1UeXBlIik7Ci0gICAgICAgIGFzc2VydFRydWUoY29udGVudFR5cGUgIT0gbnVsbCk7Ci0KLSAgICAgICAgaW50IGkgPSAwOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBtc2cuZ2V0QXR0YWNobWVudHMoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBBdHRhY2htZW50UGFydCBhdHRhY2htZW50UGFydCA9IChBdHRhY2htZW50UGFydClpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIGZpbmFsIE9iamVjdCBjb250ZW50ID0gYXR0YWNobWVudFBhcnQuZ2V0RGF0YUhhbmRsZXIoKS5nZXRDb250ZW50KCk7Ci0gICAgICAgICAgICBpZiAoY29udGVudCBpbnN0YW5jZW9mIFN0cmluZykgewotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyh0ZXN0VGV4dCwgKFN0cmluZyljb250ZW50KTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoY29udGVudCBpbnN0YW5jZW9mIEZpbGVJbnB1dFN0cmVhbSkgewotCi0gICAgICAgICAgICAgICAgLy8gdHJ5IHRvIHdyaXRlIHRvIGEgRmlsZSBhbmQgY2hlY2sgd2hldGhlciBpdCBpcyBvawotICAgICAgICAgICAgICAgIGZpbmFsIEZpbGVJbnB1dFN0cmVhbSBmaXMgPSAoRmlsZUlucHV0U3RyZWFtKWNvbnRlbnQ7Ci0gICAgICAgICAgICAgICAgYnl0ZVtdIGIgPSBuZXcgYnl0ZVsxNTAwMF07Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IGxlbmd0aFJlYWQgPSBmaXMucmVhZChiKTsKLSAgICAgICAgICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIGZvcyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZU91dHB1dFN0cmVhbShuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoImJhc2VkaXIiLCAiLiIpICsgIi8iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhcmdldC90ZXN0LXJlc291cmNlcy9hdHRzLW9wIiArIChpKyspICsgIi5qcGciKSk7Ci0gICAgICAgICAgICAgICAgZm9zLndyaXRlKGIsIDAsIGxlbmd0aFJlYWQpOwotICAgICAgICAgICAgICAgIGZvcy5mbHVzaCgpOwotICAgICAgICAgICAgICAgIGZvcy5jbG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgbXNnLndyaXRlVG8ob3MpOwotICAgICAgICBvcy5mbHVzaCgpOwotICAgICAgICByZXR1cm4gbXNnLmNvdW50QXR0YWNobWVudHMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGxvYWRNc2dXaXRoQXR0YWNobWVudHMoSW5wdXRTdHJlYW0gaXMpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBNaW1lSGVhZGVycyBoZWFkZXJzID0gbmV3IE1pbWVIZWFkZXJzKCk7Ci0gICAgICAgIGhlYWRlcnMuc2V0SGVhZGVyKCJDb250ZW50LVR5cGUiLCBNSU1FX01VTFRJUEFSVF9SRUxBVEVEKTsKLSAgICAgICAgTWVzc2FnZUZhY3RvcnkgbWYgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICBTT0FQTWVzc2FnZSBtc2cgPSBtZi5jcmVhdGVNZXNzYWdlKGhlYWRlcnMsIGlzKTsKLQotICAgICAgICBTT0FQUGFydCBzcCA9IG1zZy5nZXRTT0FQUGFydCgpOwotICAgICAgICBhc3NlcnRUcnVlKHNwICE9IG51bGwpOwotCi0gICAgICAgIFNPQVBFbnZlbG9wZSBlbnZlbG9wZSA9IHNwLmdldEVudmVsb3BlKCk7Ci0gICAgICAgIGFzc2VydFRydWUoZW52ZWxvcGUgIT0gbnVsbCk7Ci0gICAgICAgIHJldHVybiBtc2cuY291bnRBdHRhY2htZW50cygpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhYWovdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NhYWovQXR0YWNobWVudFRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhYWovdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NhYWovQXR0YWNobWVudFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmMyOTlkMi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYWFqL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zYWFqL0F0dGFjaG1lbnRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNhYWo7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5hdHRhY2htZW50cy51dGlscy5JT1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5CYXNlNjQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQuRGVmYXVsdEh0dHBNZXRob2RSZXRyeUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQuSHR0cENsaWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5IdHRwRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50Lkh0dHBTdGF0dXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQubWV0aG9kcy5HZXRNZXRob2Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQucGFyYW1zLkh0dHBNZXRob2RQYXJhbXM7Ci0KLWltcG9ydCBqYXZheC5hY3RpdmF0aW9uLkRhdGFIYW5kbGVyOwotaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRGF0YVNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5BdHRhY2htZW50UGFydDsKLWltcG9ydCBqYXZheC54bWwuc29hcC5NZXNzYWdlRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5NaW1lSGVhZGVyOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUE1lc3NhZ2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtU291cmNlOwotaW1wb3J0IGphdmEuYXd0Lio7Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBBdHRhY2htZW50VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHB1YmxpYyBBdHRhY2htZW50VGVzdChTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpbmdBdHRhY2htZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgTWVzc2FnZUZhY3RvcnkgZmFjdG9yeSA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIFNPQVBNZXNzYWdlIG1lc3NhZ2UgPSBmYWN0b3J5LmNyZWF0ZU1lc3NhZ2UoKTsKLSAgICAgICAgQXR0YWNobWVudFBhcnQgYXR0YWNobWVudCA9IG1lc3NhZ2UuY3JlYXRlQXR0YWNobWVudFBhcnQoKTsKLSAgICAgICAgU3RyaW5nIHN0cmluZ0NvbnRlbnQgPSAiVXBkYXRlIGFkZHJlc3MgZm9yIFN1bm55IFNraWVzICIgKwotICAgICAgICAgICAgICAgICJJbmMuLCB0byAxMCBVcGJlYXQgU3RyZWV0LCBQbGVhc2FudCBHcm92ZSwgQ0EgOTU0MzkiOwotCi0gICAgICAgIGF0dGFjaG1lbnQuc2V0Q29udGVudChzdHJpbmdDb250ZW50LCAidGV4dC9wbGFpbiIpOwotICAgICAgICBhdHRhY2htZW50LnNldENvbnRlbnRJZCgidXBkYXRlX2FkZHJlc3MiKTsKLSAgICAgICAgbWVzc2FnZS5hZGRBdHRhY2htZW50UGFydChhdHRhY2htZW50KTsKLQotICAgICAgICBhc3NlcnRUcnVlKG1lc3NhZ2UuY291bnRBdHRhY2htZW50cygpID09IDEpOwotCi0gICAgICAgIGphdmEudXRpbC5JdGVyYXRvciBpdCA9IG1lc3NhZ2UuZ2V0QXR0YWNobWVudHMoKTsKLSAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgYXR0YWNobWVudCA9IChBdHRhY2htZW50UGFydClpdC5uZXh0KCk7Ci0gICAgICAgICAgICBPYmplY3QgY29udGVudCA9IGF0dGFjaG1lbnQuZ2V0Q29udGVudCgpOwotICAgICAgICAgICAgU3RyaW5nIGlkID0gYXR0YWNobWVudC5nZXRDb250ZW50SWQoKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhjb250ZW50LCBzdHJpbmdDb250ZW50KTsKLSAgICAgICAgfQotICAgICAgICBtZXNzYWdlLnJlbW92ZUFsbEF0dGFjaG1lbnRzKCk7Ci0gICAgICAgIGFzc2VydFRydWUobWVzc2FnZS5jb3VudEF0dGFjaG1lbnRzKCkgPT0gMCk7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVBdHRhY2htZW50cygpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIE1lc3NhZ2VGYWN0b3J5IGZhY3RvcnkgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICBTT0FQTWVzc2FnZSBtc2cgPSBmYWN0b3J5LmNyZWF0ZU1lc3NhZ2UoKTsKLSAgICAgICAgamF2YS5uZXQuVVJMIHVybDEgPSBuZXcgamF2YS5uZXQuVVJMKCJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAuaHRtbCIpOwotICAgICAgICBqYXZhLm5ldC5VUkwgdXJsMiA9IG5ldyBqYXZhLm5ldC5VUkwoImh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMC50eHQiKTsKLQotICAgICAgICBBdHRhY2htZW50UGFydCBhMSA9IG1zZy5jcmVhdGVBdHRhY2htZW50UGFydChuZXcgamF2YXguYWN0aXZhdGlvbi5EYXRhSGFuZGxlcih1cmwxKSk7Ci0gICAgICAgIGExLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3htbCIpOwotICAgICAgICBtc2cuYWRkQXR0YWNobWVudFBhcnQoYTEpOwotICAgICAgICBBdHRhY2htZW50UGFydCBhMiA9IG1zZy5jcmVhdGVBdHRhY2htZW50UGFydChuZXcgamF2YXguYWN0aXZhdGlvbi5EYXRhSGFuZGxlcih1cmwxKSk7Ci0gICAgICAgIGEyLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3htbCIpOwotICAgICAgICBtc2cuYWRkQXR0YWNobWVudFBhcnQoYTIpOwotICAgICAgICBBdHRhY2htZW50UGFydCBhMyA9IG1zZy5jcmVhdGVBdHRhY2htZW50UGFydChuZXcgamF2YXguYWN0aXZhdGlvbi5EYXRhSGFuZGxlcih1cmwyKSk7Ci0gICAgICAgIGEzLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3BsYWluIik7Ci0gICAgICAgIG1zZy5hZGRBdHRhY2htZW50UGFydChhMyk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZShtc2cuY291bnRBdHRhY2htZW50cygpID09IDMpOwotCi0gICAgICAgIGphdmF4LnhtbC5zb2FwLk1pbWVIZWFkZXJzIG1pbWVIZWFkZXJzID0gbmV3IGphdmF4LnhtbC5zb2FwLk1pbWVIZWFkZXJzKCk7Ci0gICAgICAgIG1pbWVIZWFkZXJzLmFkZEhlYWRlcigiQ29udGVudC1UeXBlIiwgInRleHQveG1sIik7Ci0KLSAgICAgICAgaW50IG5BdHRhY2htZW50cyA9IDA7Ci0gICAgICAgIGphdmEudXRpbC5JdGVyYXRvciBpdGVyYXRvciA9IG1zZy5nZXRBdHRhY2htZW50cyhtaW1lSGVhZGVycyk7Ci0gICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIG5BdHRhY2htZW50cysrOwotICAgICAgICAgICAgQXR0YWNobWVudFBhcnQgYXAgPSAoQXR0YWNobWVudFBhcnQpaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhcC5lcXVhbHMoYTEpIHx8IGFwLmVxdWFscyhhMikpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUobkF0dGFjaG1lbnRzID09IDIpOwotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgdGVzdE11bHRpcGxlQXR0YWNobWVudHMyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE1lc3NhZ2VGYWN0b3J5IGZhY3RvcnkgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICBTT0FQTWVzc2FnZSBtc2cgPSBmYWN0b3J5LmNyZWF0ZU1lc3NhZ2UoKTsKLSAgICAgICAgamF2YS5uZXQuVVJMIHVybDEgPSBuZXcgamF2YS5uZXQuVVJMKCJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAuaHRtbCIpOwotICAgICAgICBqYXZhLm5ldC5VUkwgdXJsMiA9IG5ldyBqYXZhLm5ldC5VUkwoImh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMC50eHQiKTsKLQotICAgICAgICBBdHRhY2htZW50UGFydCBhMSA9IG1zZy5jcmVhdGVBdHRhY2htZW50UGFydChuZXcgamF2YXguYWN0aXZhdGlvbi5EYXRhSGFuZGxlcih1cmwxKSk7Ci0gICAgICAgIGExLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3htbCIpOwotICAgICAgICBtc2cuYWRkQXR0YWNobWVudFBhcnQoYTEpOwotICAgICAgICBBdHRhY2htZW50UGFydCBhMiA9IG1zZy5jcmVhdGVBdHRhY2htZW50UGFydChuZXcgamF2YXguYWN0aXZhdGlvbi5EYXRhSGFuZGxlcih1cmwxKSk7Ci0gICAgICAgIGEyLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3htbCIpOwotICAgICAgICBtc2cuYWRkQXR0YWNobWVudFBhcnQoYTIpOwotICAgICAgICBBdHRhY2htZW50UGFydCBhMyA9IG1zZy5jcmVhdGVBdHRhY2htZW50UGFydChuZXcgamF2YXguYWN0aXZhdGlvbi5EYXRhSGFuZGxlcih1cmwyKSk7Ci0gICAgICAgIGEzLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3BsYWluIik7Ci0gICAgICAgIG1zZy5hZGRBdHRhY2htZW50UGFydChhMyk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZShtc2cuY291bnRBdHRhY2htZW50cygpID09IDMpOwotCi0gICAgICAgIGphdmF4LnhtbC5zb2FwLk1pbWVIZWFkZXJzIG1pbWVIZWFkZXJzID0gbmV3IGphdmF4LnhtbC5zb2FwLk1pbWVIZWFkZXJzKCk7Ci0gICAgICAgIG1pbWVIZWFkZXJzLmFkZEhlYWRlcigiQ29udGVudC1UeXBlIiwgInRleHQveG1sIik7Ci0KLSAgICAgICAgaW50IG5BdHRhY2htZW50cyA9IDA7Ci0gICAgICAgIGphdmEudXRpbC5JdGVyYXRvciBpdGVyYXRvciA9IG1zZy5nZXRBdHRhY2htZW50cyhtaW1lSGVhZGVycyk7Ci0gICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIG5BdHRhY2htZW50cysrOwotICAgICAgICAgICAgQXR0YWNobWVudFBhcnQgYXAgPSAoQXR0YWNobWVudFBhcnQpaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhcC5lcXVhbHMoYTEpIHx8IGFwLmVxdWFscyhhMikpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUobkF0dGFjaG1lbnRzID09IDIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RCYWRBdHRTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE1lc3NhZ2VGYWN0b3J5IGZhY3RvcnkgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICBTT0FQTWVzc2FnZSBtZXNzYWdlID0gZmFjdG9yeS5jcmVhdGVNZXNzYWdlKCk7Ci0KLSAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gaW5zID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG5ldyBieXRlWzVdKTsKLSAgICAgICAgRGF0YUhhbmRsZXIgZGggPSBuZXcgRGF0YUhhbmRsZXIobmV3IFNyYyhpbnMsICJ0ZXh0L3BsYWluIikpOwotICAgICAgICBBdHRhY2htZW50UGFydCBwYXJ0ID0gbWVzc2FnZS5jcmVhdGVBdHRhY2htZW50UGFydChkaCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiU2l6ZSBzaG91bGQgbWF0Y2giLCA1LCBwYXJ0LmdldFNpemUoKSk7Ci0gICAgfQotCi0gICAgY2xhc3MgU3JjIGltcGxlbWVudHMgRGF0YVNvdXJjZSB7Ci0gICAgICAgIElucHV0U3RyZWFtIG1fc3JjOwotICAgICAgICBTdHJpbmcgbV90eXBlOwotCi0gICAgICAgIHB1YmxpYyBTcmMoSW5wdXRTdHJlYW0gZGF0YSwgU3RyaW5nIHR5cGUpIHsKLSAgICAgICAgICAgIG1fc3JjID0gZGF0YTsKLSAgICAgICAgICAgIG1fdHlwZSA9IHR5cGU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRUeXBlKCkgewotICAgICAgICAgICAgcmV0dXJuIG1fdHlwZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBtX3NyYy5yZXNldCgpOwotICAgICAgICAgICAgcmV0dXJuIG1fc3JjOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICAgICAgcmV0dXJuICJTb21lLURhdGEiOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE91dHB1dFN0cmVhbSBnZXRPdXRwdXRTdHJlYW0oKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIkkgZG9uJ3QgZ2l2ZSBvdXRwdXQgc3RyZWFtcyIpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xlYXJDb250ZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJbnB1dFN0cmVhbSBpbjEgPSBuZXcgRmlsZUlucHV0U3RyZWFtKG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiYmFzZWRpciIsICIuIikgKwotICAgICAgICAgICAgICAgICAgICAiL3Rlc3QtcmVzb3VyY2VzIiArIEZpbGUuc2VwYXJhdG9yICsgImF0dGFjaC54bWwiKSk7Ci0KLSAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5IGZhY3RvcnkgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgU09BUE1lc3NhZ2UgbWVzc2FnZSA9IGZhY3RvcnkuY3JlYXRlTWVzc2FnZSgpOwotICAgICAgICAgICAgQXR0YWNobWVudFBhcnQgYXAgPSBtZXNzYWdlLmNyZWF0ZUF0dGFjaG1lbnRQYXJ0KCk7Ci0gICAgICAgICAgICBNaW1lSGVhZGVyIG1oID0gbnVsbDsKLQotICAgICAgICAgICAgLy9TZXR0aW5nIE1pbWUgSGVhZGVyCi0gICAgICAgICAgICBhcC5zZXRNaW1lSGVhZGVyKCJDb250ZW50LURlc2NyaXB0aW9uIiwgInNvbWUgdGV4dCIpOwotCi0gICAgICAgICAgICAvL1NldHRpbmcgQ29udGVudCBJZCBIZWFkZXIKLSAgICAgICAgICAgIGFwLnNldENvbnRlbnRJZCgiaWRAYWJjLmNvbSIpOwotCi0gICAgICAgICAgICAvL1NldHRpbmcgQ29udGVudAotICAgICAgICAgICAgYXAuc2V0Q29udGVudChuZXcgU3RyZWFtU291cmNlKGluMSksICJ0ZXh0L3htbCIpOwotCi0gICAgICAgICAgICAvL0NsZWFyaW5nIENvbnRlbnQKLSAgICAgICAgICAgIGFwLmNsZWFyQ29udGVudCgpOwotCi0gICAgICAgICAgICB0cnkgewotCi0gICAgICAgICAgICAgICAgLy9HZXR0aW5nIENvbnRlbnQKLSAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IChJbnB1dFN0cmVhbSlhcC5nZXRDb250ZW50KCk7Ci0gICAgICAgICAgICAgICAgZmFpbCgiRXJyb3I6IFNPQVBFeGNlcHRpb24gc2hvdWxkIGhhdmUgYmVlbiB0aHJvd24iKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFNPQVBFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vRXJyb3IgdGhyb3duLihleHBlY3RlZCkKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBhcC5nZXRBbGxNaW1lSGVhZGVycygpOwotICAgICAgICAgICAgaW50IGNudCA9IDA7Ci0gICAgICAgICAgICBib29sZWFuIGZvdW5kSGVhZGVyMSA9IGZhbHNlOwotICAgICAgICAgICAgYm9vbGVhbiBmb3VuZEhlYWRlcjIgPSBmYWxzZTsKLSAgICAgICAgICAgIGJvb2xlYW4gZm91bmREZWZhdWx0SGVhZGVyID0gZmFsc2U7Ci0gICAgICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgY250Kys7Ci0gICAgICAgICAgICAgICAgbWggPSAoTWltZUhlYWRlcilpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBtaC5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gbWguZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBpZiAobmFtZS5lcXVhbHMoIkNvbnRlbnQtRGVzY3JpcHRpb24iKSAmJiB2YWx1ZS5lcXVhbHMoInNvbWUgdGV4dCIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghZm91bmRIZWFkZXIxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3VuZEhlYWRlcjEgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgLy9NaW1lSGVhZGVycyBkbyBtYXRjaCBmb3IgaGVhZGVyMQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgZmFpbCgiRXJyb3I6IFJlY2VpdmVkIHRoZSBzYW1lIGhlYWRlcjEgaGVhZGVyIHR3aWNlIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiQ29udGVudC1JZCIpICYmIHZhbHVlLmVxdWFscygiaWRAYWJjLmNvbSIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghZm91bmRIZWFkZXIyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3VuZEhlYWRlcjIgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgLy9NaW1lSGVhZGVycyBkbyBtYXRjaCBmb3IgaGVhZGVyMgotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgZmFpbCgiRXJyb3I6IFJlY2VpdmVkIHRoZSBzYW1lIGhlYWRlcjIgaGVhZGVyIHR3aWNlIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKCJDb250ZW50LVR5cGUiKSAmJiB2YWx1ZS5lcXVhbHMoInRleHQveG1sIikpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZERlZmF1bHRIZWFkZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kRGVmYXVsdEhlYWRlciA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL01pbWVIZWFkZXJzIGRvIG1hdGNoIGZvciBkZWZhdWx0IGhlYWRlcgotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgZmFpbCgiRXJyb3I6IFJlY2VpdmVkIHRoZSBzYW1lIGRlZmF1bHQgaGVhZGVyIGhlYWRlciB0d2ljZSIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZmFpbCgiRXJyb3I6IFJlY2VpdmVkIGFuIGludmFsaWQgaGVhZGVyIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIShmb3VuZEhlYWRlcjEgJiYgZm91bmRIZWFkZXIyKSkgewotICAgICAgICAgICAgICAgIGZhaWwoIkVycm9yOiBkaWQgbm90IHJlY2VpdmUgYm90aCBoZWFkZXJzIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbjogIiArIGUpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRDb250ZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBNZXNzYWdlRmFjdG9yeSBmYWN0b3J5ID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIFNPQVBNZXNzYWdlIG1zZyA9IGZhY3RvcnkuY3JlYXRlTWVzc2FnZSgpOwotICAgICAgICAgICAgQXR0YWNobWVudFBhcnQgYXAgPSBtc2cuY3JlYXRlQXR0YWNobWVudFBhcnQoKTsKLSAgICAgICAgICAgIEltYWdlIGltYWdlID0gamF2YXguaW1hZ2Vpby5JbWFnZUlPLnJlYWQobmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJiYXNlZGlyIiwgIi4iKSArCi0gICAgICAgICAgICAgICAgICAgICIvdGVzdC1yZXNvdXJjZXMiICsgRmlsZS5zZXBhcmF0b3IgKyAiYXR0YWNoLmdpZiIpKTsKLSAgICAgICAgICAgIGFwID0gbXNnLmNyZWF0ZUF0dGFjaG1lbnRQYXJ0KGltYWdlLCAiaW1hZ2UvZ2lmIik7Ci0KLSAgICAgICAgICAgIC8vR2V0dGluZyBDb250ZW50IHNob3VsZCByZXR1cm4gYW4gSW1hZ2Ugb2JqZWN0Ci0gICAgICAgICAgICBPYmplY3QgbyA9IGFwLmdldENvbnRlbnQoKTsKLSAgICAgICAgICAgIGlmIChvICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAobyBpbnN0YW5jZW9mIEltYWdlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vSW1hZ2Ugb2JqZWN0IHdhcyByZXR1cm5lZCAob2spCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBvYmplY3Qgd2FzIHJldHVybmVkIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uOiAiICsgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UmF3Q29udGVudHMoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBNZXNzYWdlRmFjdG9yeSBmYWN0b3J5ID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIFNPQVBNZXNzYWdlIG1zZyA9IGZhY3RvcnkuY3JlYXRlTWVzc2FnZSgpOwotICAgICAgICAgICAgQXR0YWNobWVudFBhcnQgYXAgPSBtc2cuY3JlYXRlQXR0YWNobWVudFBhcnQoKTsKLSAgICAgICAgICAgIGFwID0gbXNnLmNyZWF0ZUF0dGFjaG1lbnRQYXJ0KCk7Ci0gICAgICAgICAgICBieXRlIGRhdGExW10gPSBudWxsOwotICAgICAgICAgICAgZGF0YTEgPSBhcC5nZXRSYXdDb250ZW50Qnl0ZXMoKTsKLQotICAgICAgICB9IGNhdGNoIChTT0FQRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vQ2F1Z2h0IGV4cGVjdGVkIFNPQVBFeGNlcHRpb24KLSAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy9DYXVnaHQgZXhwZWN0ZWQgTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNldEJhc2U2NENvbnRlbnQoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBNZXNzYWdlRmFjdG9yeSBmYWN0b3J5ID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIFNPQVBNZXNzYWdlIG1zZyA9IGZhY3RvcnkuY3JlYXRlTWVzc2FnZSgpOwotICAgICAgICAgICAgQXR0YWNobWVudFBhcnQgYXAgPSBtc2cuY3JlYXRlQXR0YWNobWVudFBhcnQoKTsKLQotICAgICAgICAgICAgU3RyaW5nIHVybFN0cmluZyA9ICJodHRwOi8vd3MuYXBhY2hlLm9yZy9pbWFnZXMvcHJvamVjdC1sb2dvLmpwZyI7Ci0gICAgICAgICAgICBpZiAoaXNOZXR3b3JrZWRSZXNvdXJjZUF2YWlsYWJsZSh1cmxTdHJpbmcpKSB7Ci0gICAgICAgICAgICAgICAgVVJMIHVybCA9IG5ldyBVUkwodXJsU3RyaW5nKTsKLSAgICAgICAgICAgICAgICBEYXRhSGFuZGxlciBkaCA9IG5ldyBEYXRhSGFuZGxlcih1cmwpOwotICAgICAgICAgICAgICAgIC8vQ3JlYXRlIElucHV0U3RyZWFtIGZyb20gRGF0YUhhbmRsZXIncyBJbnB1dFN0cmVhbQotICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGlzID0gZGguZ2V0SW5wdXRTdHJlYW0oKTsKLQotICAgICAgICAgICAgICAgIGJ5dGUgYnVmW10gPSBJT1V0aWxzLmdldFN0cmVhbUFzQnl0ZUFycmF5KGlzKTsKLSAgICAgICAgICAgICAgICAvL1NldHRpbmcgQ29udGVudCB2aWEgSW5wdXRTdHJlYW0gZm9yIGltYWdlL2pwZWcgbWltZSB0eXBlCi0gICAgICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgICAgICAgICBCYXNlNjQuZW5jb2RlKGJ1ZiwgMCwgYnVmLmxlbmd0aCwgYm9zKTsKLSAgICAgICAgICAgICAgICBidWYgPSBib3MudG9CeXRlQXJyYXkoKTsKLSAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBzdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnVmKTsKLSAgICAgICAgICAgICAgICBhcC5zZXRCYXNlNjRDb250ZW50KHN0cmVhbSwgImltYWdlL2pwZWciKTsKLQotICAgICAgICAgICAgICAgIC8vR2V0dGluZyBDb250ZW50Li4gc2hvdWxkIHJldHVybiBJbnB1dFN0cmVhbSBvYmplY3QKLSAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSByID0gYXAuZ2V0QmFzZTY0Q29udGVudCgpOwotICAgICAgICAgICAgICAgIGlmIChyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHIgaW5zdGFuY2VvZiBJbnB1dFN0cmVhbSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy9JbnB1dFN0cmVhbSBvYmplY3Qgd2FzIHJldHVybmVkIChvaykKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgb2JqZWN0IHdhcyByZXR1cm5lZCIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uOiAiICsgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNOZXR3b3JrZWRSZXNvdXJjZUF2YWlsYWJsZShTdHJpbmcgdXJsKSB7Ci0gICAgICAgIEh0dHBDbGllbnQgY2xpZW50ID0gbmV3IEh0dHBDbGllbnQoKTsKLSAgICAgICAgR2V0TWV0aG9kIG1ldGhvZCA9IG5ldyBHZXRNZXRob2QodXJsKTsKLSAgICAgICAgY2xpZW50LmdldEh0dHBDb25uZWN0aW9uTWFuYWdlcigpLmdldFBhcmFtcygpLnNldENvbm5lY3Rpb25UaW1lb3V0KDEwMDApOwotICAgICAgICAgICAgICAgIG1ldGhvZC5nZXRQYXJhbXMoKS5zZXRQYXJhbWV0ZXIoSHR0cE1ldGhvZFBhcmFtcy5SRVRSWV9IQU5ETEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBEZWZhdWx0SHR0cE1ldGhvZFJldHJ5SGFuZGxlcigxLCBmYWxzZSkpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpbnQgc3RhdHVzQ29kZSA9IGNsaWVudC5leGVjdXRlTWV0aG9kKG1ldGhvZCk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzQ29kZSAhPSBIdHRwU3RhdHVzLlNDX09LKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy9ieXRlW10gcmVzcG9uc2VCb2R5ID0gbWV0aG9kLmdldFJlc3BvbnNlQm9keSgpOwotICAgICAgICB9IGNhdGNoIChIdHRwRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBtZXRob2QucmVsZWFzZUNvbm5lY3Rpb24oKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2Fhai90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2Fhai9NZXNzYWdlRmFjdG9yeVRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhYWovdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NhYWovTWVzc2FnZUZhY3RvcnlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjNGQ0MjAuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2Fhai90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2Fhai9NZXNzYWdlRmFjdG9yeVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2FhajsKLQotaW1wb3J0IG9yZy5jdXN0b21tb25rZXkueG1sdW5pdC5YTUxUZXN0Q2FzZTsKLQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLk1lc3NhZ2VGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLk1pbWVIZWFkZXJzOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBNZXNzYWdlOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXNzYWdlRmFjdG9yeVRlc3QgZXh0ZW5kcyBYTUxUZXN0Q2FzZSB7Ci0gICAgcHJpdmF0ZSBNZXNzYWdlRmFjdG9yeSBtZiA9IG51bGw7Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBtZiA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZU1lc3NhZ2UoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvczEgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvczIgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0KLSAgICAgICAgICAgIFNPQVBNZXNzYWdlIG1zZzEgPSBtZi5jcmVhdGVNZXNzYWdlKCk7Ci0gICAgICAgICAgICBtc2cxLndyaXRlVG8oYmFvczEpOwotCi0gICAgICAgICAgICBNaW1lSGVhZGVycyBoZWFkZXJzID0gbmV3IE1pbWVIZWFkZXJzKCk7Ci0gICAgICAgICAgICBoZWFkZXJzLmFkZEhlYWRlcigiQ29udGVudC1UeXBlIiwgInRleHQveG1sIik7Ci0KLSAgICAgICAgICAgIC8vIENyZWF0ZSBTT0FQTWVzc2FnZSBmcm9tIE1lc3NhZ2VGYWN0b3J5IG9iamVjdCB1c2luZyBJbnB1dFN0cmVhbQotICAgICAgICAgICAgU09BUE1lc3NhZ2UgbXNnMiA9IG1mLmNyZWF0ZU1lc3NhZ2UoaGVhZGVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFvczEudG9TdHJpbmcoKS5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICBpZiAobXNnMiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbXNnMi53cml0ZVRvKGJhb3MyKTsKLQotICAgICAgICAgICAgaWYgKCEoYmFvczEudG9TdHJpbmcoKS5lcXVhbHMoYmFvczIudG9TdHJpbmcoKSkpKSB7Ci0gICAgICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZU1lc3NhZ2UyKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MxID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MyID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgWE1MX1NUUklORyA9Ci0gICAgICAgICAgICAgICAgICAgICI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz5cbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8c29hcGVudjpFbnZlbG9wZSB4bWxuczpzb2FwZW52PVwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS9cIlxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICB4bWxuczp4c2Q9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYVwiXG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgIHhtbG5zOnhzaT1cImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlXCI+XG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIDxzb2FwZW52OkhlYWRlcj5cbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIDxzaHc6SGVsbG8geG1sbnM6c2h3PVwiaHR0cDovL3d3dy5qY29tbWVyY2UubmV0L3NvYXAvbnMvU09BUEhlbGxvV29ybGRcIj5cbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgPHNodzpNeW5hbWU+VG9ueTwvc2h3Ok15bmFtZT5cbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIDwvc2h3OkhlbGxvPlxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIiA8L3NvYXBlbnY6SGVhZGVyPlxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIiA8c29hcGVudjpCb2R5PlxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxzaHc6QWRkcmVzcyBzaHc6dD0ndGVzdCcgeG1sbnM6c2h3PVwiaHR0cDovL3d3dy5qY29tbWVyY2UubmV0L3NvYXAvbnMvU09BUEhlbGxvV29ybGRcIj5cbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8c2h3OkNpdHk+R0VOVDwvc2h3OkNpdHk+XG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPC9zaHc6QWRkcmVzcz5cbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8L3NvYXBlbnY6Qm9keT5cbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8L3NvYXBlbnY6RW52ZWxvcGU+IjsKLQotICAgICAgICAgICAgTWltZUhlYWRlcnMgaGVhZGVycyA9IG5ldyBNaW1lSGVhZGVycygpOwotICAgICAgICAgICAgaGVhZGVycy5hZGRIZWFkZXIoIkNvbnRlbnQtVHlwZSIsICJ0ZXh0L3htbCIpOwotCi0gICAgICAgICAgICBTT0FQTWVzc2FnZSBtc2cxID0KLSAgICAgICAgICAgICAgICAgICAgbWYuY3JlYXRlTWVzc2FnZShoZWFkZXJzLCBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oWE1MX1NUUklORy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICBtc2cxLndyaXRlVG8oYmFvczEpOwotCi0gICAgICAgICAgICAvLyBDcmVhdGUgU09BUE1lc3NhZ2UgZnJvbSBNZXNzYWdlRmFjdG9yeSBvYmplY3QgdXNpbmcgSW5wdXRTdHJlYW0KLSAgICAgICAgICAgIFNPQVBNZXNzYWdlIG1zZzIgPSBtZi5jcmVhdGVNZXNzYWdlKGhlYWRlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhb3MxLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgaWYgKG1zZzIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1zZzIud3JpdGVUbyhiYW9zMik7Ci0KLSAgICAgICAgICAgIHRoaXMuYXNzZXJ0WE1MRXF1YWwoYmFvczEudG9TdHJpbmcoKSwgYmFvczIudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TmV3SW5zdGFuZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5IG1mID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwobWYpOwotICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MxID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCi0gICAgICAgICAgICBTT0FQTWVzc2FnZSBtc2cxID0gbWYuY3JlYXRlTWVzc2FnZSgpOwotICAgICAgICAgICAgbXNnMS53cml0ZVRvKGJhb3MxKTsKLQotICAgICAgICAgICAgTWltZUhlYWRlcnMgaGVhZGVycyA9IG5ldyBNaW1lSGVhZGVycygpOwotICAgICAgICAgICAgaGVhZGVycy5hZGRIZWFkZXIoIkNvbnRlbnQtVHlwZSIsICJ0ZXh0L3htbCIpOwotCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJFeGNlcHRpb246ICIgKyBlKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhYWovdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NhYWovTm9kZVRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhYWovdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NhYWovTm9kZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjcwMGM2Zi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYWFqL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zYWFqL05vZGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNhYWo7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBqYXZheC54bWwuc29hcC5NZXNzYWdlRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQQm9keTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRW52ZWxvcGU7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEhlYWRlcjsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQSGVhZGVyRWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQTWVzc2FnZTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQUGFydDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBOb2RlVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICBwcml2YXRlIFNPQVBNZXNzYWdlIG1zZyA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTT0FQUGFydCBzcCA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTT0FQQm9keSBib2R5ID0gbnVsbDsKLSAgICBwcml2YXRlIFNPQVBFbnZlbG9wZSBlbnZlbG9wZSA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTT0FQSGVhZGVyIGhlYWRlciA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTT0FQSGVhZGVyRWxlbWVudCBoZWFkZXJFbGUgPSBudWxsOwotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbXNnID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoKS5jcmVhdGVNZXNzYWdlKCk7Ci0gICAgICAgIHNwID0gbXNnLmdldFNPQVBQYXJ0KCk7Ci0gICAgICAgIGVudmVsb3BlID0gc3AuZ2V0RW52ZWxvcGUoKTsKLSAgICAgICAgYm9keSA9IGVudmVsb3BlLmdldEJvZHkoKTsKLSAgICAgICAgaGVhZGVyID0gZW52ZWxvcGUuZ2V0SGVhZGVyKCk7Ci0gICAgICAgIGhlYWRlckVsZSA9IGhlYWRlci5hZGRIZWFkZXJFbGVtZW50KGVudmVsb3BlLmNyZWF0ZU5hbWUoImZvbyIsICJmIiwgImZvby1VUkkiKSk7Ci0gICAgICAgIGhlYWRlckVsZS5zZXRBY3RvcigiYWN0b3ItVVJJIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdERldGFjaE5vZGUoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBoZWFkZXJFbGUuZGV0YWNoTm9kZSgpOwotICAgICAgICAgICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBoZWFkZXIuZXhhbWluZUhlYWRlckVsZW1lbnRzKCJhY3Rvci1VUkkiKTsKLSAgICAgICAgICAgIGFzc2VydEZhbHNlKCJTT0FQSGVhZGVyIGVsZW1lbnQgaXMgbm90IGRldGFjaGVkIC0gdW5leHBlY3RlZCIsIGl0ZXJhdG9yLmhhc05leHQoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJFeGNlcHRpb246ICIgKyBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJlbnRFbGVtZW50KCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgaGVhZGVyRWxlLmRldGFjaE5vZGUoKTsKLSAgICAgICAgICAgIFNPQVBFbGVtZW50IHBhcmVudEVsZW1lbnQgPSBoZWFkZXJFbGUuZ2V0UGFyZW50RWxlbWVudCgpOwotICAgICAgICAgICAgYXNzZXJ0TnVsbCgiUGFyZW50IGlzIG5vdCBudWxsIDogIiArIHBhcmVudEVsZW1lbnQsIHBhcmVudEVsZW1lbnQpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uOiAiICsgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0UGFyZW50RWxlbWVudDEoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBoZWFkZXJFbGUuZGV0YWNoTm9kZSgpOwotICAgICAgICAgICAgaGVhZGVyRWxlLnNldFBhcmVudEVsZW1lbnQoaGVhZGVyKTsKLSAgICAgICAgICAgIFNPQVBFbGVtZW50IHNlID0gaGVhZGVyRWxlLmdldFBhcmVudEVsZW1lbnQoKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoIlNPQVBIZWFkZXIgZWxlbWVudCBub3QgcmV0dXJuZWQgLSB1bmV4cGVjdGVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgc2UgaW5zdGFuY2VvZiBTT0FQSGVhZGVyKTsKLSAgICAgICAgICAgIFNPQVBIZWFkZXIgc2ggPSAoU09BUEhlYWRlcilzZTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoIlNPQVBIZWFkZXIgZWxlbWVudCBkb2VzIG5vdCBtYXRjaCIsIHNoLmVxdWFscyhoZWFkZXIpKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbjogIiArIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNldFBhcmVudEVsZW1lbnQyKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBoZWFkZXJFbGUuc2V0UGFyZW50RWxlbWVudChib2R5KTsKLSAgICAgICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZGlkIG5vdCBvY2N1ciIpOwotICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJFeHBlY3RlZCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gb2NjdXJyZWQiLCB0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbjogIiArIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNldFZhbHVlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgaGVhZGVyRWxlLmFkZFRleHROb2RlKCJmb28tYmFyIik7Ci0gICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBoZWFkZXJFbGUuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwodmFsdWUpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJmb28tYmFyIiwgdmFsdWUpOwotCi0gICAgICAgICAgICBoZWFkZXJFbGUuc2V0VmFsdWUoImZvby1iYXIyIik7Ci0gICAgICAgICAgICB2YWx1ZSA9IGhlYWRlckVsZS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCh2YWx1ZSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoImZvby1iYXIyIiwgdmFsdWUpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbjogIiArIGUpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2Fhai90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2Fhai9QcmVmaXhlc1Rlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhYWovdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NhYWovUHJlZml4ZXNUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiY2EwZDguLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2Fhai90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2Fhai9QcmVmaXhlc1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2FhajsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLk1lc3NhZ2VGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLk1pbWVIZWFkZXJzOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLk5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEJvZHk7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEVudmVsb3BlOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBIZWFkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUE1lc3NhZ2U7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUFBhcnQ7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuVGV4dDsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIFByZWZpeGVzVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHB1YmxpYyBQcmVmaXhlc1Rlc3QoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEFkZGluZ1ByZWZpeGVzRm9yQ2hpbGRFbGVtZW50cygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBNZXNzYWdlRmFjdG9yeSBmYWN0b3J5ID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgU09BUE1lc3NhZ2UgbXNnID0gZmFjdG9yeS5jcmVhdGVNZXNzYWdlKCk7Ci0gICAgICAgIFNPQVBQYXJ0IHNwID0gbXNnLmdldFNPQVBQYXJ0KCk7Ci0gICAgICAgIFNPQVBFbnZlbG9wZSBzZSA9IHNwLmdldEVudmVsb3BlKCk7Ci0gICAgICAgIFNPQVBCb2R5IHNiID0gc2UuZ2V0Qm9keSgpOwotICAgICAgICBTT0FQRWxlbWVudCBlbDEgPSBzYi5hZGRCb2R5RWxlbWVudChzZS5jcmVhdGVOYW1lKCJlbGVtZW50MSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInByZWZpeDEiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vd3d3LnN1bi5jb20iKSk7Ci0gICAgICAgIGVsMS5hZGRDaGlsZEVsZW1lbnQoc2UuY3JlYXRlTmFtZSgiZWxlbWVudDIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInByZWZpeDIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly93d3cuYXBhY2hlLm9yZyIpKTsKLQotICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgbXNnLndyaXRlVG8oYmFvcyk7Ci0KLSAgICAgICAgU3RyaW5nIHhtbCA9IG5ldyBTdHJpbmcoYmFvcy50b0J5dGVBcnJheSgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSh4bWwuaW5kZXhPZigicHJlZml4MSIpICE9IC0xKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSh4bWwuaW5kZXhPZigicHJlZml4MiIpICE9IC0xKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSh4bWwuaW5kZXhPZigiaHR0cDovL3d3dy5zdW4uY29tIikgIT0gLTEpOwotICAgICAgICBhc3NlcnRUcnVlKHhtbC5pbmRleE9mKCJodHRwOi8vd3d3LmFwYWNoZS5vcmciKSAhPSAtMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgc29hcHBhY2tldCA9Ci0gICAgICAgICAgICAgICAgIjxzb2FwZW52OkVudmVsb3BlIHhtbG5zOnNvYXBlbnYgPVwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS9cIlxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgIHhtbG5zOnhzZD1cImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hXCJcbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICB4bWxuczp4c2k9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZVwiPlxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiICAgPHNvYXBlbnY6Qm9keT5cbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICA8dDpoZWxsb3dvcmxkIHQ6bmFtZT1cInRlc3RcIiB4bWxuczp0PSdodHRwOi8vdGVzdC5vcmcvVGVzdCc+SGVsbG88L3Q6aGVsbG93b3JsZD5cbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIiAgIDwvc29hcGVudjpCb2R5PlxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiPC9zb2FwZW52OkVudmVsb3BlPiI7Ci0KLSAgICAgICAgU09BUE1lc3NhZ2UgbXNnID0KLSAgICAgICAgICAgICAgICBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpLmNyZWF0ZU1lc3NhZ2UobmV3IE1pbWVIZWFkZXJzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2FwcGFja2V0LmdldEJ5dGVzKCkpKTsKLSAgICAgICAgU09BUEJvZHkgYm9keSA9IG1zZy5nZXRTT0FQUGFydCgpLmdldEVudmVsb3BlKCkuZ2V0Qm9keSgpOwotICAgICAgICB2YWxpZGF0ZUJvZHkoYm9keS5nZXRDaGlsZEVsZW1lbnRzKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZUJvZHkoSXRlcmF0b3IgaXRlcikgewotICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIGZpbmFsIE9iamVjdCBvYmogPSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBUZXh0KSB7Ci0gICAgICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIlxuLSBUZXh0IElnbm9yZWQuIik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZpbmFsIFNPQVBFbGVtZW50IHNvYXBFbGVtZW50ID0gKFNPQVBFbGVtZW50KW9iajsKLSAgICAgICAgICAgICAgICBmaW5hbCBJdGVyYXRvciBhdHRJdGVyID0gc29hcEVsZW1lbnQuZ2V0QWxsQXR0cmlidXRlcygpOwotICAgICAgICAgICAgICAgIHdoaWxlIChhdHRJdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBOYW1lIG5hbWUgPSAoTmFtZSlhdHRJdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXN0Iiwgc29hcEVsZW1lbnQuZ2V0QXR0cmlidXRlVmFsdWUobmFtZSkpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoInQiLCBuYW1lLmdldFByZWZpeCgpKTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0Om5hbWUiLCBuYW1lLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygibmFtZSIsIG5hbWUuZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly90ZXN0Lm9yZy9UZXN0IiwgbmFtZS5nZXRVUkkoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZmluYWwgSXRlcmF0b3IgY2hpbGRFbGVtZW50SXRlciA9IHNvYXBFbGVtZW50LmdldENoaWxkRWxlbWVudHMoKTsKLSAgICAgICAgICAgICAgICBpZiAoY2hpbGRFbGVtZW50SXRlciA9PSBudWxsKSByZXR1cm47Ci0gICAgICAgICAgICAgICAgdmFsaWRhdGVCb2R5KGNoaWxkRWxlbWVudEl0ZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEF0dHJQcmlmaXgoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBNZXNzYWdlRmFjdG9yeSBmYWMgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCi0gICAgICAgICAgICBTT0FQTWVzc2FnZSBtc2cgPSBmYWMuY3JlYXRlTWVzc2FnZSgpOwotICAgICAgICAgICAgU09BUEVudmVsb3BlIGVudiA9IG1zZy5nZXRTT0FQUGFydCgpLmdldEVudmVsb3BlKCk7Ci0gICAgICAgICAgICBTT0FQSGVhZGVyIGhlYWRlciA9IG1zZy5nZXRTT0FQSGVhZGVyKCk7Ci0KLSAgICAgICAgICAgIE5hbWUgbmFtZSA9IGVudi5jcmVhdGVOYW1lKCJMb2NhbCIsICJwcmUxIiwgImh0dHA6Ly90ZXN0MSIpOwotICAgICAgICAgICAgU09BUEVsZW1lbnQgbG9jYWwgPSBoZWFkZXIuYWRkQ2hpbGRFbGVtZW50KG5hbWUpOwotCi0gICAgICAgICAgICBOYW1lIG5hbWUyID0gZW52LmNyZWF0ZU5hbWUoIkxvY2FsMSIsICJwcmUxIiwgImh0dHA6Ly90ZXN0MSIpOwotICAgICAgICAgICAgU09BUEVsZW1lbnQgbG9jYWwyID0gbG9jYWwuYWRkQ2hpbGRFbGVtZW50KG5hbWUyKTsKLQotICAgICAgICAgICAgTmFtZSBhTmFtZSA9IGVudi5jcmVhdGVOYW1lKCJhdHRyaWIiLCAicHJlMSIsICJodHRwOi8vdGVzdDEiKTsKLSAgICAgICAgICAgIGxvY2FsMi5hZGRBdHRyaWJ1dGUoYU5hbWUsICJ2YWx1ZSIpOwotCi0gICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgICAgIG1zZy53cml0ZVRvKGJhb3MpOwotCi0gICAgICAgICAgICBTdHJpbmcgeG1sID0gbmV3IFN0cmluZyhiYW9zLnRvQnl0ZUFycmF5KCkpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHhtbC5pbmRleE9mKCJ4bWxuczpodHRwOi8vdGVzdDEiKSA9PSAtMSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHhtbC5pbmRleE9mKCJwcmUxOmF0dHJpYj1cInZhbHVlXCIiKSA+IDApOwotCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYWFqL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zYWFqL1NBQUpEZXRhaWxUZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9zYWFqL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zYWFqL1NBQUpEZXRhaWxUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZkZDY2ZjMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2Fhai90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2Fhai9TQUFKRGV0YWlsVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNhYWo7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLkRldGFpbDsKLWltcG9ydCBqYXZheC54bWwuc29hcC5EZXRhaWxFbnRyeTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5NZXNzYWdlRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQQm9keTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQQ29uc3RhbnRzOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBFbnZlbG9wZTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRmF1bHQ7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEhlYWRlcjsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQSGVhZGVyRWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQTWVzc2FnZTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQUGFydDsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFNBQUpEZXRhaWxUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotICAgIHByaXZhdGUgU09BUE1lc3NhZ2UgbXNnID0gbnVsbDsKLSAgICBwcml2YXRlIFNPQVBQYXJ0IHNwID0gbnVsbDsKLSAgICBwcml2YXRlIFNPQVBCb2R5IGJvZHkgPSBudWxsOwotICAgIHByaXZhdGUgU09BUEVudmVsb3BlIGVudmVsb3BlID0gbnVsbDsKLSAgICBwcml2YXRlIFNPQVBIZWFkZXIgaGVhZGVyID0gbnVsbDsKLSAgICBwcml2YXRlIFNPQVBIZWFkZXJFbGVtZW50IGhlYWRlckVsZSA9IG51bGw7Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBtc2cgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpLmNyZWF0ZU1lc3NhZ2UoKTsKLSAgICAgICAgc3AgPSBtc2cuZ2V0U09BUFBhcnQoKTsKLSAgICAgICAgZW52ZWxvcGUgPSBzcC5nZXRFbnZlbG9wZSgpOwotICAgICAgICBib2R5ID0gZW52ZWxvcGUuZ2V0Qm9keSgpOwotICAgICAgICBoZWFkZXIgPSBlbnZlbG9wZS5nZXRIZWFkZXIoKTsKLSAgICAgICAgaGVhZGVyRWxlID0gaGVhZGVyLmFkZEhlYWRlckVsZW1lbnQoZW52ZWxvcGUuY3JlYXRlTmFtZSgiZm9vIiwgImYiLCAiZm9vLVVSSSIpKTsKLSAgICAgICAgaGVhZGVyRWxlLnNldEFjdG9yKCJhY3Rvci1VUkkiKTsKLSAgICB9Ci0KLQotICAgIC8qCi0gICAgKiBmb3Igc29hcCB2ZXJzaW9uIDEuMQotICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEFkZERldGFpbEVudHJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vQWRkIGEgU09BUEZhdWx0IG9iamVjdCB0byB0aGUgU09BUEJvZHkKLSAgICAgICAgU09BUEZhdWx0IHNmID0gYm9keS5hZGRGYXVsdCgpOwotICAgICAgICAvL0FkZCBhIERldGFpbCBvYmplY3QgdG8gdGhlIFNPQVBGYXVsdCBvYmplY3QKLSAgICAgICAgRGV0YWlsIGQgPSBzZi5hZGREZXRhaWwoKTsKLSAgICAgICAgUU5hbWUgbmFtZSA9IG5ldyBRTmFtZSgiaHR0cDovL3d3dy53b21iYXQub3JnL3RyYWRlciIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdldExhc3RUcmFkZVByaWNlIiwgIldPTUJBVCIpOwotICAgICAgICAvL0FkZCBhIERldGFpbEVudHJ5IG9iamVjdCB0byB0aGUgRGV0YWlsIG9iamVjdAotICAgICAgICBEZXRhaWxFbnRyeSBkZSA9IGQuYWRkRGV0YWlsRW50cnkobmFtZSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZGUpOwotICAgICAgICBhc3NlcnRUcnVlKGRlIGluc3RhbmNlb2YgRGV0YWlsRW50cnkpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogZm9yIHNvYXAgdmVyc2lvbiAxLjIKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkRGV0YWlsRW50cnkyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIG1zZyA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKFNPQVBDb25zdGFudHMuU09BUF8xXzJfUFJPVE9DT0wpLmNyZWF0ZU1lc3NhZ2UoKTsKLSAgICAgICAgc3AgPSBtc2cuZ2V0U09BUFBhcnQoKTsKLSAgICAgICAgZW52ZWxvcGUgPSBzcC5nZXRFbnZlbG9wZSgpOwotICAgICAgICBib2R5ID0gZW52ZWxvcGUuZ2V0Qm9keSgpOwotCi0gICAgICAgIC8vQWRkIGEgU09BUEZhdWx0IG9iamVjdCB0byB0aGUgU09BUEJvZHkKLSAgICAgICAgU09BUEZhdWx0IHNmID0gYm9keS5hZGRGYXVsdCgpOwotICAgICAgICAvL0FkZCBhIERldGFpbCBvYmplY3QgdG8gdGhlIFNPQVBGYXVsdCBvYmplY3QKLSAgICAgICAgRGV0YWlsIGQgPSBzZi5hZGREZXRhaWwoKTsKLSAgICAgICAgUU5hbWUgbmFtZSA9IG5ldyBRTmFtZSgiaHR0cDovL3d3dy53b21iYXQub3JnL3RyYWRlciIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdldExhc3RUcmFkZVByaWNlIiwgIldPTUJBVCIpOwotICAgICAgICAvL0FkZCBhIERldGFpbEVudHJ5IG9iamVjdCB0byB0aGUgRGV0YWlsIG9iamVjdAotICAgICAgICBEZXRhaWxFbnRyeSBkZSA9IGQuYWRkRGV0YWlsRW50cnkobmFtZSk7Ci0gICAgICAgIC8vU3VjY2Vzc2Z1bGx5IGNyZWF0ZWQgRGV0YWlsRW50cnkgb2JqZWN0Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZGUpOwotICAgICAgICBhc3NlcnRUcnVlKGRlIGluc3RhbmNlb2YgRGV0YWlsRW50cnkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhYWovdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NhYWovU0FBSlJlc3VsdFRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhYWovdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NhYWovU0FBSlJlc3VsdFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmJiODk4Mi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYWFqL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zYWFqL1NBQUpSZXN1bHRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2FhajsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLk1lc3NhZ2VGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLk5vZGU7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU0FBSlJlc3VsdDsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQQm9keTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRW52ZWxvcGU7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEhlYWRlcjsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQSGVhZGVyRWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQTWVzc2FnZTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQUGFydDsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFNBQUpSZXN1bHRUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotICAgIHByaXZhdGUgU09BUE1lc3NhZ2UgbXNnID0gbnVsbDsKLSAgICBwcml2YXRlIFNPQVBQYXJ0IHNwID0gbnVsbDsKLSAgICBwcml2YXRlIFNPQVBCb2R5IGJvZHkgPSBudWxsOwotICAgIHByaXZhdGUgU09BUEVudmVsb3BlIGVudmVsb3BlID0gbnVsbDsKLSAgICBwcml2YXRlIFNPQVBIZWFkZXIgaGVhZGVyID0gbnVsbDsKLSAgICBwcml2YXRlIFNPQVBIZWFkZXJFbGVtZW50IGhlYWRlckVsZSA9IG51bGw7Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBtc2cgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpLmNyZWF0ZU1lc3NhZ2UoKTsKLSAgICAgICAgc3AgPSBtc2cuZ2V0U09BUFBhcnQoKTsKLSAgICAgICAgZW52ZWxvcGUgPSBzcC5nZXRFbnZlbG9wZSgpOwotICAgICAgICBib2R5ID0gZW52ZWxvcGUuZ2V0Qm9keSgpOwotICAgICAgICBoZWFkZXIgPSBlbnZlbG9wZS5nZXRIZWFkZXIoKTsKLSAgICAgICAgaGVhZGVyRWxlID0gaGVhZGVyLmFkZEhlYWRlckVsZW1lbnQoZW52ZWxvcGUuY3JlYXRlTmFtZSgiZm9vIiwgImYiLCAiZm9vLVVSSSIpKTsKLSAgICAgICAgaGVhZGVyRWxlLnNldEFjdG9yKCJhY3Rvci1VUkkiKTsKLSAgICB9Ci0KLSAgICAvKgotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRSZXN1bHQoKSB0aHJvd3MgRXhjZXB0aW9uewotICAgICAgICBTQUFKUmVzdWx0IHNyID0gbmV3IFNBQUpSZXN1bHQoKTsKLSAgICAgICAgTm9kZSBub2RlID0gc3IuZ2V0UmVzdWx0KCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwobm9kZSk7Ci0gICAgfQotICAgICovCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UmVzdWx0U09BUE1lc3NhZ2UoKSB0aHJvd3MgRXhjZXB0aW9uewotICAgIAlTQUFKUmVzdWx0IHNyID0gbmV3IFNBQUpSZXN1bHQobXNnKTsKLSAgICAJTm9kZSBub2RlID0gc3IuZ2V0UmVzdWx0KCk7Ci0gICAgCWFzc2VydE5vdE51bGwobm9kZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2Fhai90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2Fhai9TT0FQQm9keVRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhYWovdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NhYWovU09BUEJvZHlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4N2VlMmYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2Fhai90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2Fhai9TT0FQQm9keVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2FhajsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5NZXNzYWdlRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5OYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLk5vZGU7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEJvZHk7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEJvZHlFbGVtZW50OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBDb25zdGFudHM7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEVudmVsb3BlOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBGYXVsdDsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQSGVhZGVyOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBNZXNzYWdlOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBQYXJ0OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlRleHQ7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIFNPQVBCb2R5VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIC8qKgotICAgICAqIE1ldGhvZCBzdWl0ZQotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIC8qICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUodGVzdC5tZXNzYWdlLlRlc3RTT0FQQm9keS5jbGFzcyk7Ci0gICAgICB9Ci0gICAgKi8KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIFRlc3RTT0FQQm9keQotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgU09BUEJvZHlUZXN0KFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ldGhvZCB0ZXN0U29hcEJvZHlCVUcKLSAgICAgKgotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFNvYXBCb2R5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgTWVzc2FnZUZhY3RvcnkgZmFjdCA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIFNPQVBNZXNzYWdlIG1lc3NhZ2UgPSBmYWN0LmNyZWF0ZU1lc3NhZ2UoKTsKLSAgICAgICAgU09BUFBhcnQgc29hcFBhcnQgPSBtZXNzYWdlLmdldFNPQVBQYXJ0KCk7Ci0gICAgICAgIFNPQVBFbnZlbG9wZUltcGwgZW52ID0gKFNPQVBFbnZlbG9wZUltcGwpc29hcFBhcnQuZ2V0RW52ZWxvcGUoKTsKLSAgICAgICAgU09BUEhlYWRlciBoZWFkZXIgPSBlbnYuZ2V0SGVhZGVyKCk7Ci0gICAgICAgIE5hbWUgaG5zID0gZW52LmNyZWF0ZU5hbWUoIkhlbGxvIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2h3IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL3d3dy5qY29tbWVyY2UubmV0L3NvYXAvbnMvU09BUEhlbGxvV29ybGQiKTsKLSAgICAgICAgU09BUEVsZW1lbnQgaGVhZEVsbW50ID0gaGVhZGVyLmFkZEhlYWRlckVsZW1lbnQoaG5zKTsKLSAgICAgICAgTmFtZSBobnMxID0gZW52LmNyZWF0ZU5hbWUoIk15bmFtZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzaHciLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL3d3dy5qY29tbWVyY2UubmV0L3NvYXAvbnMvU09BUEhlbGxvV29ybGQiKTsKLSAgICAgICAgU09BUEVsZW1lbnQgbXlOYW1lID0gaGVhZEVsbW50LmFkZENoaWxkRWxlbWVudChobnMxKTsKLSAgICAgICAgbXlOYW1lLmFkZFRleHROb2RlKCJUb255Iik7Ci0gICAgICAgIE5hbWUgbnMgPSBlbnYuY3JlYXRlTmFtZSgiQWRkcmVzcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2h3IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vd3d3Lmpjb21tZXJjZS5uZXQvc29hcC9ucy9TT0FQSGVsbG9Xb3JsZCIpOwotICAgICAgICBTT0FQQm9keSBib2R5ID0gZW52LmdldEJvZHkoKTsKLSAgICAgICAgU09BUEVsZW1lbnQgYm9keUVsbW50ID0gYm9keS5hZGRCb2R5RWxlbWVudChucyk7Ci0gICAgICAgIE5hbWUgbnMxID0gZW52LmNyZWF0ZU5hbWUoIkNpdHkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzaHciLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vd3d3Lmpjb21tZXJjZS5uZXQvc29hcC9ucy9TT0FQSGVsbG9Xb3JsZCIpOwotICAgICAgICBTT0FQRWxlbWVudCBjaXR5ID0gYm9keUVsbW50LmFkZENoaWxkRWxlbWVudChuczEpOwotICAgICAgICBjaXR5LmFkZFRleHROb2RlKCJHRU5UIik7Ci0KLSAgICAgICAgU09BUEVsZW1lbnQgY2l0eTIgPSBib2R5LmFkZENoaWxkRWxlbWVudChuczEpOwotICAgICAgICBhc3NlcnRUcnVlKGNpdHkyIGluc3RhbmNlb2YgU09BUEJvZHlFbGVtZW50KTsKLSAgICAgICAgY2l0eTIuYWRkVGV4dE5vZGUoIkNJVDIiKTsKLQotICAgICAgICBJdGVyYXRvciBpdCA9IGJvZHkuZ2V0Q2hpbGRFbGVtZW50cygpOwotICAgICAgICBpbnQgY291bnQgPSAwOwotCi0gICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIE9iamVjdCBvID0gaXQubmV4dCgpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShvIGluc3RhbmNlb2YgU09BUEJvZHlFbGVtZW50KTsKLSAgICAgICAgICAgIFNPQVBCb2R5RWxlbWVudCBib2R5RWxlbWVudCA9IChTT0FQQm9keUVsZW1lbnQpbzsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiaHR0cDovL3d3dy5qY29tbWVyY2UubmV0L3NvYXAvbnMvU09BUEhlbGxvV29ybGQiLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJvZHlFbGVtZW50LmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygic2h3IiwgYm9keUVsZW1lbnQuZ2V0UHJlZml4KCkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShib2R5RWxlbWVudC5nZXRMb2NhbE5hbWUoKS5lcXVhbHMoIkNpdHkiKSB8fAotICAgICAgICAgICAgICAgICAgICBib2R5RWxlbWVudC5nZXRMb2NhbE5hbWUoKS5lcXVhbHMoIkFkZHJlc3MiKSk7Ci0gICAgICAgICAgICBjb3VudCsrOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydEVxdWFscygyLCBjb3VudCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgX3Rlc3RBZGREb2N1bWVudCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKLSAgICAgICAgICAgIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIGZhY3Rvcnkuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7Ci0KLSAgICAgICAgICAgIERvY3VtZW50QnVpbGRlciBidWlsZGVyID0gZmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKLSAgICAgICAgICAgIGRvY3VtZW50ID0gYnVpbGRlci5wYXJzZShuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoImJhc2VkaXIiLCAiLiIpICsgIi8iICsKLSAgICAgICAgICAgICAgICAgICAgInRlc3QtcmVzb3VyY2VzIiArIEZpbGUuc2VwYXJhdG9yICsgInNvYXAtYm9keS54bWwiKSk7Ci0gICAgICAgICAgICBNZXNzYWdlRmFjdG9yeSBmYWN0ID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIFNPQVBNZXNzYWdlIG1lc3NhZ2UgPSBmYWN0LmNyZWF0ZU1lc3NhZ2UoKTsKLQotICAgICAgICAgICAgbWVzc2FnZS5nZXRTT0FQSGVhZGVyKCkuZGV0YWNoTm9kZSgpOwotICAgICAgICAgICAgLy8gYXNzZXJ0TnVsbChtZXNzYWdlLmdldFNPQVBIZWFkZXIoKSk7ICAgIAotICAgICAgICAgICAgLy8gVE9ETzp0aGlzIGZhaWxzLiBIZWFkZXIgaXMgYWx3YXlzIGJlaW5nIGNyZWF0ZWQgaWYgaXQgZG9lc250IGV4aXN0IGluIERPT00KLQotICAgICAgICAgICAgU09BUEJvZHkgc29hcEJvZHkgPSBtZXNzYWdlLmdldFNPQVBCb2R5KCk7Ci0gICAgICAgICAgICBzb2FwQm9keS5hZGREb2N1bWVudChkb2N1bWVudCk7Ci0gICAgICAgICAgICBtZXNzYWdlLnNhdmVDaGFuZ2VzKCk7Ci0KLSAgICAgICAgICAgIC8vIEdldCBjb250ZW50cyB1c2luZyBTQUFKIEFQSXMKLSAgICAgICAgICAgIEl0ZXJhdG9yIGl0ZXIxID0gc29hcEJvZHkuZ2V0Q2hpbGRFbGVtZW50cygpOwotICAgICAgICAgICAgZ2V0Q29udGVudHMoaXRlcjEsICIiKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIEV4Y2VwdGlvbiA6ICIgKyBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBnZXRDb250ZW50cyhJdGVyYXRvciBpdGVyYXRvciwgU3RyaW5nIGluZGVudCkgewotICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBOb2RlIG5vZGUgPSAoTm9kZSlpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICBTT0FQRWxlbWVudCBlbGVtZW50ID0gbnVsbDsKLSAgICAgICAgICAgIFRleHQgdGV4dCA9IG51bGw7Ci0KLSAgICAgICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgU09BUEVsZW1lbnQpIHsKLSAgICAgICAgICAgICAgICBlbGVtZW50ID0gKFNPQVBFbGVtZW50KW5vZGU7Ci0gICAgICAgICAgICAgICAgTmFtZSBuYW1lID0gZWxlbWVudC5nZXRFbGVtZW50TmFtZSgpOwotICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGF0dHJzID0gZWxlbWVudC5nZXRBbGxBdHRyaWJ1dGVzKCk7Ci0KLSAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgIHdoaWxlIChhdHRycy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgTmFtZSBhdHRyTmFtZSA9IChOYW1lKSBhdHRycy5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihpbmRlbnQgKyAiIEF0dHJpYnV0ZSBuYW1lIGlzICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ck5hbWUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGluZGVudCArICIgQXR0cmlidXRlIHZhbHVlIGlzICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5nZXRBdHRyaWJ1dGVWYWx1ZShhdHRyTmFtZSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgSXRlcmF0b3IgaXRlcjIgPSBlbGVtZW50LmdldENoaWxkRWxlbWVudHMoKTsKLSAgICAgICAgICAgICAgICBnZXRDb250ZW50cyhpdGVyMiwgaW5kZW50ICsgIiAiKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGV4dCA9IChUZXh0KW5vZGU7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCh0ZXh0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vVE9ETyA6IGZpeAotICAgIHB1YmxpYyB2b2lkIHRlc3RFeHRyYWN0Q29udGVudEFzRG9jdW1lbnQoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBNZXNzYWdlRmFjdG9yeSBmYWN0ID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIFNPQVBNZXNzYWdlIG1lc3NhZ2UgPSBmYWN0LmNyZWF0ZU1lc3NhZ2UoKTsKLSAgICAgICAgICAgIFNPQVBCb2R5IHNvYXBCb2R5ID0gbWVzc2FnZS5nZXRTT0FQQm9keSgpOwotCi0gICAgICAgICAgICBRTmFtZSBxbmFtZTEgPSBuZXcgUU5hbWUoImh0dHA6Ly93b21iYXQuenRyYWRlLmNvbSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdldExhc3RUcmFkZVByaWNlIiwgInp0cmFkZSIpOwotICAgICAgICAgICAgU09BUEVsZW1lbnQgY2hpbGQxID0gc29hcEJvZHkuYWRkQ2hpbGRFbGVtZW50KHFuYW1lMSk7Ci0gICAgICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IHNvYXBCb2R5LmV4dHJhY3RDb250ZW50QXNEb2N1bWVudCgpOwotCi0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGRvY3VtZW50KTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoZG9jdW1lbnQgaW5zdGFuY2VvZiBEb2N1bWVudCk7Ci0gICAgICAgICAgICBFbGVtZW50IGVsZW1lbnQgPSBkb2N1bWVudC5nZXREb2N1bWVudEVsZW1lbnQoKTsKLSAgICAgICAgICAgIFN0cmluZyBlbGVtZW50TmFtZSA9IGVsZW1lbnQuZ2V0VGFnTmFtZSgpOwotCi0gICAgICAgICAgICAvL1JldHJlaXZlIHRoZSBjaGlsZHJlbiBvZiB0aGUgU09BUEJvZHkgKHNob3VsZCBiZSBub25lKQotICAgICAgICAgICAgSXRlcmF0b3IgY2hpbGRFbGVtZW50cyA9IHNvYXBCb2R5LmdldENoaWxkRWxlbWVudHMoKTsKLSAgICAgICAgICAgIGludCBjaGlsZENvdW50ID0gMDsKLSAgICAgICAgICAgIHdoaWxlIChjaGlsZEVsZW1lbnRzLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIE9iamVjdCBvYmplY3QgPSBjaGlsZEVsZW1lbnRzLm5leHQoKTsKLSAgICAgICAgICAgICAgICBjaGlsZENvdW50Kys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoY2hpbGRDb3VudCwgMCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIEV4Y2VwdGlvbiA6ICIgKyBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogRm9yIFNPQVAgMS4xIG1lc3NhZ2UgCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEFkZEF0dHJpYnV0ZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5IGZhY3QgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgU09BUE1lc3NhZ2UgbWVzc2FnZSA9IGZhY3QuY3JlYXRlTWVzc2FnZSgpOwotICAgICAgICAgICAgU09BUEJvZHkgc29hcEJvZHkgPSBtZXNzYWdlLmdldFNPQVBCb2R5KCk7Ci0gICAgICAgICAgICBRTmFtZSBxbmFtZSA9IG5ldyBRTmFtZSgiaHR0cDovL3Rlc3QuYXBhY2hlLm9yZy8iLCAiQ2hpbGQxIiwgImNoIik7Ci0gICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSAiTXlWYWx1ZTEiOwotICAgICAgICAgICAgc29hcEJvZHkuYWRkQXR0cmlidXRlKHFuYW1lLCB2YWx1ZSk7Ci0gICAgICAgICAgICBtZXNzYWdlLnNhdmVDaGFuZ2VzKCk7Ci0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgRXhjZXB0aW9uIDogIiArIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBGb3IgU09BUCAxLjIgbWVzc2FnZSAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkQXR0cmlidXRlMigpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5IGZhY3QgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZShTT0FQQ29uc3RhbnRzLlNPQVBfMV8yX1BST1RPQ09MKTsKLSAgICAgICAgICAgIFNPQVBNZXNzYWdlIG1lc3NhZ2UgPSBmYWN0LmNyZWF0ZU1lc3NhZ2UoKTsKLSAgICAgICAgICAgIFNPQVBCb2R5IHNvYXBCb2R5ID0gbWVzc2FnZS5nZXRTT0FQQm9keSgpOwotICAgICAgICAgICAgUU5hbWUgcW5hbWUgPSBuZXcgUU5hbWUoImh0dHA6Ly90ZXN0LmFwYWNoZS5vcmcvIiwgIkNoaWxkMSIsICJjaCIpOwotICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gIk15VmFsdWUxIjsKLSAgICAgICAgICAgIHNvYXBCb2R5LmFkZEF0dHJpYnV0ZShxbmFtZSwgdmFsdWUpOwotICAgICAgICAgICAgbWVzc2FnZS5zYXZlQ2hhbmdlcygpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBFeGNlcHRpb24gOiAiICsgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICogRm9yIFNPQVAgMS4yIG1lc3NhZ2UKLSAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRGYXVsdCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5IGZhY3QgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgU09BUE1lc3NhZ2UgbWVzc2FnZSA9IGZhY3QuY3JlYXRlTWVzc2FnZSgpOwotICAgICAgICAgICAgU09BUFBhcnQgc29hcFBhcnQgPSBtZXNzYWdlLmdldFNPQVBQYXJ0KCk7Ci0gICAgICAgICAgICBTT0FQRW52ZWxvcGUgc29hcEVudmVsb3BlID0gc29hcFBhcnQuZ2V0RW52ZWxvcGUoKTsKLSAgICAgICAgICAgIFNPQVBCb2R5IHNvYXBCb2R5ID0gc29hcEVudmVsb3BlLmdldEJvZHkoKTsKLQotICAgICAgICAgICAgUU5hbWUgcW5hbWUgPSBuZXcgUU5hbWUoImh0dHA6Ly90ZXN0LmFwYWNoZS5vcmcvIiwgIkNoaWxkMSIsICJjaCIpOwotICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gIk15RmF1bHQiOwotICAgICAgICAgICAgU09BUEZhdWx0IHNvYXBGYXVsdCA9IHNvYXBCb2R5LmFkZEZhdWx0KHFuYW1lLCB2YWx1ZSk7Ci0gICAgICAgICAgICBtZXNzYWdlLnNhdmVDaGFuZ2VzKCk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHNvYXBGYXVsdCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHNvYXBGYXVsdCBpbnN0YW5jZW9mIFNPQVBGYXVsdCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIEV4Y2VwdGlvbiA6ICIgKyBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBcHBlbmRDaGlsZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBNZXNzYWdlRmFjdG9yeSBmYWN0ID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgU09BUE1lc3NhZ2UgbWVzc2FnZSA9IGZhY3QuY3JlYXRlTWVzc2FnZSgpOwotICAgICAgICBTT0FQQm9keSBzb2FwQm9keSA9IG1lc3NhZ2UuZ2V0U09BUEJvZHkoKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydEVxdWFscygwLCBzb2FwQm9keS5nZXRDaGlsZE5vZGVzKCkuZ2V0TGVuZ3RoKCkpOwotICAgICAgICBhc3NlcnRGYWxzZShzb2FwQm9keS5nZXRDaGlsZEVsZW1lbnRzKCkuaGFzTmV4dCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgRG9jdW1lbnQgZG9jID0gc29hcEJvZHkuZ2V0T3duZXJEb2N1bWVudCgpOyAgICAgICAgCi0gICAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSAiaHR0cDovL2V4YW1wbGUuY29tIjsKLSAgICAgICAgU3RyaW5nIGxvY2FsTmFtZSA9ICJHZXRMYXN0VHJhZGVQcmljZSI7Ci0gICAgICAgIEVsZW1lbnQgZ2V0TGFzdFRyYWRlUHJpY2UgPSBkb2MuY3JlYXRlRWxlbWVudE5TKG5hbWVzcGFjZSwgbG9jYWxOYW1lKTsgICAgICAgIAotICAgICAgICBFbGVtZW50IHN5bWJvbCA9IGRvYy5jcmVhdGVFbGVtZW50KCJzeW1ib2wiKTsKLSAgICAgICAgc3ltYm9sLnNldEF0dHJpYnV0ZSgiZm9vIiwgImJhciIpOwotICAgICAgICBnZXRMYXN0VHJhZGVQcmljZS5hcHBlbmRDaGlsZChzeW1ib2wpOwotICAgICAgICBvcmcudzNjLmRvbS5UZXh0IGRlZiA9IGRvYy5jcmVhdGVUZXh0Tm9kZSgiREVGIik7Ci0gICAgICAgIHN5bWJvbC5hcHBlbmRDaGlsZChkZWYpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIHNvYXBCb2R5LmFwcGVuZENoaWxkKGdldExhc3RUcmFkZVByaWNlKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydEVxdWFscygxLCBzb2FwQm9keS5nZXRDaGlsZE5vZGVzKCkuZ2V0TGVuZ3RoKCkpOwotICAgICAgICBJdGVyYXRvciBpdGVyID0gc29hcEJvZHkuZ2V0Q2hpbGRFbGVtZW50cygpOwotICAgICAgICBhc3NlcnRUcnVlKGl0ZXIuaGFzTmV4dCgpKTsgCi0gICAgICAgIE9iamVjdCBvYmogPSBpdGVyLm5leHQoKTsKLSAgICAgICAgLy8gbXVzdCBiZSBTT0FQQm9keUVsZW1lbnQKLSAgICAgICAgYXNzZXJ0VHJ1ZShvYmogaW5zdGFuY2VvZiBTT0FQQm9keUVsZW1lbnQpOyAgCi0gICAgICAgIFNPQVBFbGVtZW50IHNvYXBFbGVtZW50ID0gKFNPQVBFbGVtZW50KW9iajsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG5hbWVzcGFjZSwgc29hcEVsZW1lbnQuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMobG9jYWxOYW1lLCBzb2FwRWxlbWVudC5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKGl0ZXIuaGFzTmV4dCgpKTsKLSAgICAgICAgCi0gICAgICAgIGl0ZXIgPSBzb2FwRWxlbWVudC5nZXRDaGlsZEVsZW1lbnRzKCk7Ci0gICAgICAgIGFzc2VydFRydWUoaXRlci5oYXNOZXh0KCkpOyAKLSAgICAgICAgb2JqID0gaXRlci5uZXh0KCk7Ci0gICAgICAgIGFzc2VydFRydWUob2JqIGluc3RhbmNlb2YgU09BUEVsZW1lbnQpOyAgCi0gICAgICAgIHNvYXBFbGVtZW50ID0gKFNPQVBFbGVtZW50KW9iajsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG51bGwsIHNvYXBFbGVtZW50LmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJzeW1ib2wiLCBzb2FwRWxlbWVudC5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKGl0ZXIuaGFzTmV4dCgpKTsKLSAgICAgICAgCi0gICAgICAgIGl0ZXIgPSBzb2FwRWxlbWVudC5nZXRDaGlsZEVsZW1lbnRzKCk7Ci0gICAgICAgIGFzc2VydFRydWUoaXRlci5oYXNOZXh0KCkpOyAKLSAgICAgICAgb2JqID0gaXRlci5uZXh0KCk7Ci0gICAgICAgIGFzc2VydFRydWUob2JqIGluc3RhbmNlb2YgVGV4dCk7ICAKLSAgICAgICAgVGV4dCB0ZXh0ID0gKFRleHQpb2JqOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkRFRiIsIHRleHQuZ2V0RGF0YSgpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoaXRlci5oYXNOZXh0KCkpOyAgIAotICAgIH0KLSAgICAgICAgCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYWFqL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zYWFqL1NPQVBDb25uZWN0aW9uVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvc2Fhai90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2Fhai9TT0FQQ29ubmVjdGlvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDMxZmZmZi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYWFqL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zYWFqL1NPQVBDb25uZWN0aW9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zYWFqOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50LkRlZmF1bHRIdHRwTWV0aG9kUmV0cnlIYW5kbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50Lkh0dHBDbGllbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQuSHR0cEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5IdHRwU3RhdHVzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50Lm1ldGhvZHMuR2V0TWV0aG9kOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50LnBhcmFtcy5IdHRwTWV0aG9kUGFyYW1zOwotCi1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUENvbm5lY3Rpb247Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUENvbm5lY3Rpb25GYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUE1lc3NhZ2U7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBTT0FQQ29ubmVjdGlvblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgcHVibGljIHZvaWQgdGVzdENsb3NlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgU09BUENvbm5lY3Rpb24gc0NvbiA9IFNPQVBDb25uZWN0aW9uRmFjdG9yeS5uZXdJbnN0YW5jZSgpLmNyZWF0ZUNvbm5lY3Rpb24oKTsKLSAgICAgICAgICAgIHNDb24uY2xvc2UoKTsKLSAgICAgICAgfSBjYXRjaCAoU09BUEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIEV4Y2VwdGlvbiAiICsgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xvc2VUd2ljZSgpIHsKLSAgICAgICAgU09BUENvbm5lY3Rpb25GYWN0b3J5IHNvYXBDb25uZWN0aW9uRmFjdG9yeSA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzb2FwQ29ubmVjdGlvbkZhY3RvcnkgPSBTT0FQQ29ubmVjdGlvbkZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgfSBjYXRjaCAoU09BUEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIEV4Y2VwdGlvbiAiICsgZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBTT0FQQ29ubmVjdGlvbiBzQ29uID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNDb24gPSBzb2FwQ29ubmVjdGlvbkZhY3RvcnkuY3JlYXRlQ29ubmVjdGlvbigpOwotICAgICAgICAgICAgc0Nvbi5jbG9zZSgpOwotICAgICAgICB9IGNhdGNoIChTT0FQRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgRXhjZXB0aW9uICIgKyBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzQ29uLmNsb3NlKCk7Ci0gICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBFeGNlcHRpb24gZGlkIG5vdCBvY2N1ciIpOwotICAgICAgICB9IGNhdGNoIChTT0FQRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUodHJ1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FsbE9uQ2xvc2VDb25uZWN0aW9uKCkgewotICAgICAgICBTT0FQQ29ubmVjdGlvbkZhY3Rvcnkgc29hcENvbm5lY3Rpb25GYWN0b3J5ID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNvYXBDb25uZWN0aW9uRmFjdG9yeSA9IFNPQVBDb25uZWN0aW9uRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICB9IGNhdGNoIChTT0FQRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgRXhjZXB0aW9uICIgKyBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIFNPQVBDb25uZWN0aW9uIHNDb24gPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgc0NvbiA9IHNvYXBDb25uZWN0aW9uRmFjdG9yeS5jcmVhdGVDb25uZWN0aW9uKCk7Ci0gICAgICAgICAgICBzQ29uLmNsb3NlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFNPQVBFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBFeGNlcHRpb24gIiArIGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNDb24uY2FsbChudWxsLCBuZXcgT2JqZWN0KCkpOwotICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgRXhjZXB0aW9uIGRpZCBub3Qgb2NjdXIiKTsKLSAgICAgICAgfSBjYXRjaCAoU09BUEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHRydWUpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0KCkgewotICAgIAlpZihpc05ldHdvcmtlZFJlc291cmNlQXZhaWxhYmxlKCJodHRwOi8vamF2YS5zdW4uY29tL2luZGV4Lmh0bWwiKSl7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIFNPQVBDb25uZWN0aW9uRmFjdG9yeSBzZiA9IG5ldyBTT0FQQ29ubmVjdGlvbkZhY3RvcnlJbXBsKCk7Ci0gICAgICAgICAgICAgICAgU09BUENvbm5lY3Rpb24gY29uID0gc2YuY3JlYXRlQ29ubmVjdGlvbigpOwotICAgICAgICAgICAgICAgIC8vQ3JlYXRlIGEgdmFsaWQgbm9uIHdlYnNlcnZpY2UgZW5kcG9pbnQgZm9yIGludm9raW5nIEhUVFAtR0VUCi0gICAgICAgICAgICAgICAgVVJMIHVybEVuZHBvaW50ID0gbmV3IFVSTCgiaHR0cCIsICJqYXZhLnN1bi5jb20iLCA4MCwgIi9pbmRleC5odG1sIik7Ci0gICAgICAgICAgICAgICAgLy9pbnZva2luZyBIVFRQLUdFVCB3aXRoIGEgdmFsaWQgbm9uIHdlYnNlcnZpY2UgZW5kcG9pbnQgc2hvdWxkIHRocm93IGEgU09BUEV4Y2VwdGlvbgotICAgICAgICAgICAgICAgIFNPQVBNZXNzYWdlIHJlcGx5ID0gY29uLmdldCh1cmxFbmRwb2ludCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoZSBpbnN0YW5jZW9mIFNPQVBFeGNlcHRpb24pOwotICAgICAgICAgICAgfQotICAgIAl9ZWxzZXsKLSAgICAJCS8vSWYgcmVzb3VyY2UgaXMgbm90IGF2YWlsYWJsZSBvbmxpbmUsIGRvIGEgbW9jayB0ZXN0Ci0gICAgCQlhc3NlcnRUcnVlKHRydWUpOwotICAgIAl9Ci0gICAgfQotICAgIAotICAgIAotICAgIHByaXZhdGUgYm9vbGVhbiBpc05ldHdvcmtlZFJlc291cmNlQXZhaWxhYmxlKFN0cmluZyB1cmwpIHsKLSAgICAgICAgSHR0cENsaWVudCBjbGllbnQgPSBuZXcgSHR0cENsaWVudCgpOwotICAgICAgICBHZXRNZXRob2QgbWV0aG9kID0gbmV3IEdldE1ldGhvZCh1cmwpOwotICAgICAgICBjbGllbnQuZ2V0SHR0cENvbm5lY3Rpb25NYW5hZ2VyKCkuZ2V0UGFyYW1zKCkuc2V0Q29ubmVjdGlvblRpbWVvdXQoMTAwMCk7Ci0gICAgICAgIG1ldGhvZC5nZXRQYXJhbXMoKS5zZXRQYXJhbWV0ZXIoSHR0cE1ldGhvZFBhcmFtcy5SRVRSWV9IQU5ETEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBEZWZhdWx0SHR0cE1ldGhvZFJldHJ5SGFuZGxlcigxLCBmYWxzZSkpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpbnQgc3RhdHVzQ29kZSA9IGNsaWVudC5leGVjdXRlTWV0aG9kKG1ldGhvZCk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzQ29kZSAhPSBIdHRwU3RhdHVzLlNDX09LKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gY2F0Y2ggKEh0dHBFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIG1ldGhvZC5yZWxlYXNlQ29ubmVjdGlvbigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0gICAgIAotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2Fhai90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2Fhai9TT0FQRWxlbWVudFRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhYWovdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NhYWovU09BUEVsZW1lbnRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhMTFmOTguLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2Fhai90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2Fhai9TT0FQRWxlbWVudFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2FhajsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuZG9tLk5vZGVJbXBsOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLk1lc3NhZ2VGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLk5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuTm9kZTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQQm9keTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQQ29uc3RhbnRzOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBFbGVtZW50OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBFbnZlbG9wZTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBIZWFkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUE1lc3NhZ2U7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUFBhcnQ7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuVGV4dDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBTT0FQRWxlbWVudFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwcml2YXRlIFNPQVBFbGVtZW50IHNvYXBFbGU7Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzb2FwRWxlID0KLSAgICAgICAgICAgICAgICBTT0FQRmFjdG9yeUltcGwubmV3SW5zdGFuY2UoKS5jcmVhdGVFbGVtZW50KCJUZXN0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXN0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vdGVzdC5hcGFjaGUub3JnLyIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRUZXh0Tm9kZSgpIHsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzb2FwRWxlKTsKLSAgICAgICAgU3RyaW5nIHZhbHVlID0gImZvbyI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzb2FwRWxlLmFkZFRleHROb2RlKHZhbHVlKTsKLSAgICAgICAgfSBjYXRjaCAoU09BUEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIEV4Y2VwdGlvbiAiICsgZSk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbHVlLCBzb2FwRWxlLmdldFZhbHVlKCkpOwotICAgICAgICBUZXh0SW1wbEV4IHRleHQgPSBhc3NlcnRDb250YWluc1RleHQoc29hcEVsZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyh2YWx1ZSwgdGV4dC5nZXRWYWx1ZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2hpbGRyZW4oKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzb2FwRWxlLmFkZFRleHROb2RlKCJmb28iKTsKLSAgICAgICAgICAgIFNPQVBFbGVtZW50IGNoaWxkRWxlMSA9Ci0gICAgICAgICAgICAgICAgICAgIFNPQVBGYWN0b3J5SW1wbC5uZXdJbnN0YW5jZSgpLmNyZWF0ZUVsZW1lbnQoIkNoaWxkMSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNoIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL3Rlc3QuYXBhY2hlLm9yZy8iKTsKLSAgICAgICAgICAgIFNPQVBFbGVtZW50IGNoaWxkRWxlMiA9Ci0gICAgICAgICAgICAgICAgICAgIFNPQVBGYWN0b3J5SW1wbC5uZXdJbnN0YW5jZSgpLmNyZWF0ZUVsZW1lbnQoIkNoaWxkMiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNoIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL3Rlc3QuYXBhY2hlLm9yZy8iKTsKLSAgICAgICAgICAgIHNvYXBFbGUuYWRkQ2hpbGRFbGVtZW50KGNoaWxkRWxlMSk7Ci0gICAgICAgICAgICBzb2FwRWxlLmFkZENoaWxkRWxlbWVudChjaGlsZEVsZTIpOwotICAgICAgICB9IGNhdGNoIChTT0FQRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgRXhjZXB0aW9uICIgKyBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIE9iamVjdCBvID0gc29hcEVsZS5nZXRDaGlsZEVsZW1lbnRzKCkubmV4dCgpOwotICAgICAgICBPYmplY3QgbzIgPSBzb2FwRWxlLmdldENoaWxkRWxlbWVudHMoKS5uZXh0KCk7Ci0KLSAgICAgICAgYXNzZXJ0U2FtZShvLCBvMik7IC8vIGJvdGggZWxlbWVudHMgc2hvdWxkIGJlIHRoZSBzYW1lIFNBQUogTm9kZQotICAgICAgICBhc3NlcnRFcXVhbHMoKChqYXZheC54bWwuc29hcC5UZXh0KW8pLmdldFZhbHVlKCksCi0gICAgICAgICAgICAgICAgICAgICAoKGphdmF4LnhtbC5zb2FwLlRleHQpbzIpLmdldFZhbHVlKCkpOwotCi0gICAgICAgIGludCBjaGlsZHJlbkNvdW50ID0gMDsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gc29hcEVsZS5nZXRDaGlsZEVsZW1lbnRzKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBjaGlsZHJlbkNvdW50ICsrOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydEVxdWFscygzLCBjaGlsZHJlbkNvdW50KTsKLQotICAgICAgICBPYmplY3QgejEgPSBzb2FwRWxlLmdldENoaWxkTm9kZXMoKS5pdGVtKDApOwotICAgICAgICBPYmplY3QgejIgPSBzb2FwRWxlLmdldEZpcnN0Q2hpbGQoKTsKLQotICAgICAgICBhc3NlcnRTYW1lKG8sIHoxKTsgICAvLyBzaG91bGQgYmUgc2FtZSBTQUFKIE5vZGUKLSAgICAgICAgYXNzZXJ0U2FtZSh6MSwgejIpOyAgLy8gc2hvdWxkIGJlIHNhbWUgU0FBSiBOb2RlCi0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCgoamF2YXgueG1sLnNvYXAuVGV4dCl6MSkuZ2V0VmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICgoamF2YXgueG1sLnNvYXAuVGV4dCl6MikuZ2V0VmFsdWUoKSk7Ci0KLSAgICAgICAgTm9kZSBsYXN0Q2hpbGROb2RlID0gKE5vZGUpc29hcEVsZS5nZXRMYXN0Q2hpbGQoKTsKLSAgICAgICAgU09BUEVsZW1lbnQgbGFzdENoaWxkU09BUEVsZSA9IChTT0FQRWxlbWVudClsYXN0Q2hpbGROb2RlOwotCi0gICAgICAgIGFzc2VydEVxdWFscygiQ2hpbGQyIiwgbGFzdENoaWxkU09BUEVsZS5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiaHR0cDovL3Rlc3QuYXBhY2hlLm9yZy8iLCBsYXN0Q2hpbGRTT0FQRWxlLmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJjaCIsIGxhc3RDaGlsZFNPQVBFbGUuZ2V0UHJlZml4KCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDaGlsZHJlbkFuZFNpYmxpbmdzKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgc29hcEVsZS5hZGRUZXh0Tm9kZSgiZm9vIik7Ci0gICAgICAgICAgICBzb2FwRWxlLmFkZENoaWxkRWxlbWVudCgiQ2hpbGQxIiwgImNoIiwgImh0dHA6Ly90ZXN0LmFwYWNoZS5vcmcvIik7Ci0gICAgICAgICAgICBzb2FwRWxlLmFkZENoaWxkRWxlbWVudCgiQ2hpbGQyIiwgImNoIiwgImh0dHA6Ly90ZXN0LmFwYWNoZS5vcmcvIik7Ci0gICAgICAgIH0gY2F0Y2ggKFNPQVBFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBFeGNlcHRpb24gIiArIGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgT2JqZWN0IG8gPSBzb2FwRWxlLmdldENoaWxkRWxlbWVudHMoKS5uZXh0KCk7Ci0gICAgICAgIE9iamVjdCBvMiA9IHNvYXBFbGUuZ2V0Q2hpbGRFbGVtZW50cygpLm5leHQoKTsKLSAgICAgICAgYXNzZXJ0U2FtZShvLCBvMik7IC8vIGJvdGggZWxlbWVudHMgc2hvdWxkIGJlIHRoZSBzYW1lIFNBQUogTm9kZQotICAgICAgICBhc3NlcnRFcXVhbHMoKChqYXZheC54bWwuc29hcC5UZXh0KW8pLmdldFZhbHVlKCksCi0gICAgICAgICAgICAgICAgICAgICAoKGphdmF4LnhtbC5zb2FwLlRleHQpbzIpLmdldFZhbHVlKCkpOwotCi0gICAgICAgIGludCBjaGlsZHJlbkNvdW50ID0gMDsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gc29hcEVsZS5nZXRDaGlsZEVsZW1lbnRzKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBjaGlsZHJlbkNvdW50ICsrOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydEVxdWFscygzLCBjaGlsZHJlbkNvdW50KTsKLQotICAgICAgICBPYmplY3QgejEgPSBzb2FwRWxlLmdldENoaWxkTm9kZXMoKS5pdGVtKDApOwotICAgICAgICBPYmplY3QgejIgPSBzb2FwRWxlLmdldEZpcnN0Q2hpbGQoKTsKLSAgICAgICAgYXNzZXJ0U2FtZShvLCB6MSk7ICAgLy8gc2hvdWxkIGJlIHNhbWUgU0FBSiBOb2RlCi0gICAgICAgIGFzc2VydFNhbWUoejEsIHoyKTsgIC8vIHNob3VsZCBiZSBzYW1lIFNBQUogTm9kZQotICAgICAgICBhc3NlcnRFcXVhbHMoKChqYXZheC54bWwuc29hcC5UZXh0KXoxKS5nZXRWYWx1ZSgpLAotICAgICAgICAgICAgICAgICAgICAgKChqYXZheC54bWwuc29hcC5UZXh0KXoyKS5nZXRWYWx1ZSgpKTsKLQotICAgICAgICBTT0FQRWxlbWVudCBsYXN0Q2hpbGRTT0FQRWxlID0gKFNPQVBFbGVtZW50KXNvYXBFbGUuZ2V0TGFzdENoaWxkKCk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJDaGlsZDIiLCBsYXN0Q2hpbGRTT0FQRWxlLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJjaDpDaGlsZDIiLCBsYXN0Q2hpbGRTT0FQRWxlLmdldE5vZGVOYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly90ZXN0LmFwYWNoZS5vcmcvIiwgbGFzdENoaWxkU09BUEVsZS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiY2giLCBsYXN0Q2hpbGRTT0FQRWxlLmdldFByZWZpeCgpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChsYXN0Q2hpbGRTT0FQRWxlLmdldFBhcmVudE5vZGUoKSk7Ci0gICAgICAgIGFzc2VydFRydWUobGFzdENoaWxkU09BUEVsZS5nZXRQcmV2aW91c1NpYmxpbmcoKSBpbnN0YW5jZW9mIGphdmF4LnhtbC5zb2FwLlNPQVBFbGVtZW50KTsKLSAgICAgICAgYXNzZXJ0TnVsbChsYXN0Q2hpbGRTT0FQRWxlLmdldE5leHRTaWJsaW5nKCkpOwotCi0gICAgICAgIGphdmF4LnhtbC5zb2FwLk5vZGUgZmlyc3RDaGlsZCA9IChqYXZheC54bWwuc29hcC5Ob2RlKXNvYXBFbGUuZ2V0Rmlyc3RDaGlsZCgpOwotICAgICAgICBqYXZheC54bWwuc29hcC5Ob2RlIG5leHRTaWJsaW5nID0gKGphdmF4LnhtbC5zb2FwLk5vZGUpKGZpcnN0Q2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSk7Ci0gICAgICAgIGFzc2VydE51bGwoZmlyc3RDaGlsZC5nZXRQcmV2aW91c1NpYmxpbmcoKSk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZShmaXJzdENoaWxkIGluc3RhbmNlb2YgamF2YXgueG1sLnNvYXAuVGV4dCk7Ci0gICAgICAgIGFzc2VydFRydWUobmV4dFNpYmxpbmcgaW5zdGFuY2VvZiBqYXZheC54bWwuc29hcC5TT0FQRWxlbWVudCk7Ci0gICAgICAgIGFzc2VydFRydWUobmV4dFNpYmxpbmcuZ2V0UHJldmlvdXNTaWJsaW5nKCkgaW5zdGFuY2VvZiBqYXZheC54bWwuc29hcC5UZXh0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJDaGlsZDEiLCBuZXh0U2libGluZy5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiY2g6Q2hpbGQxIiwgbmV4dFNpYmxpbmcuZ2V0Tm9kZU5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiaHR0cDovL3Rlc3QuYXBhY2hlLm9yZy8iLCBuZXh0U2libGluZy5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiY2giLCBuZXh0U2libGluZy5nZXRQcmVmaXgoKSk7Ci0KLSAgICAgICAgamF2YXgueG1sLnNvYXAuTm9kZSBuZXh0U2libGluZzIgPSAoamF2YXgueG1sLnNvYXAuTm9kZSluZXh0U2libGluZy5nZXROZXh0U2libGluZygpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkNoaWxkMiIsIG5leHRTaWJsaW5nMi5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiY2g6Q2hpbGQyIiwgbmV4dFNpYmxpbmcyLmdldE5vZGVOYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly90ZXN0LmFwYWNoZS5vcmcvIiwgbGFzdENoaWxkU09BUEVsZS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiY2giLCBuZXh0U2libGluZzIuZ2V0UHJlZml4KCkpOwotICAgICAgICBhc3NlcnROdWxsKG5leHRTaWJsaW5nMi5nZXROZXh0U2libGluZygpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tbWVudFNpYmxpbmcoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzb2FwRWxlLmFkZFRleHROb2RlKCJmb28iKTsKLSAgICAgICAgICAgIHNvYXBFbGUuYWRkQ2hpbGRFbGVtZW50KCJDaGlsZDEiLCAiY2giLCAiaHR0cDovL3Rlc3QuYXBhY2hlLm9yZy8iKTsKLSAgICAgICAgICAgIHNvYXBFbGUuYWRkVGV4dE5vZGUoIjwhLS0gVGhpcyBpcyBhIENvbW1lbnQtLT4iKTsKLSAgICAgICAgICAgIHNvYXBFbGUuYWRkQ2hpbGRFbGVtZW50KCJDaGlsZDIiLCAiY2giLCAiaHR0cDovL3Rlc3QuYXBhY2hlLm9yZy8iKTsKLSAgICAgICAgfSBjYXRjaCAoU09BUEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIEV4Y2VwdGlvbiAiICsgZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBhc3NlcnRUcnVlKCgoVGV4dClzb2FwRWxlLmdldEZpcnN0Q2hpbGQoKS5nZXROZXh0U2libGluZygpLmdldE5leHRTaWJsaW5nKCkpLmlzQ29tbWVudCgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgoKFRleHQpc29hcEVsZS5nZXRMYXN0Q2hpbGQoKS5nZXRQcmV2aW91c1NpYmxpbmcoKSkuaXNDb21tZW50KCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDb21tZW50U2libGluZzIoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzb2FwRWxlLmFkZFRleHROb2RlKCJmb28iKTsKLSAgICAgICAgICAgIHNvYXBFbGUuYWRkVGV4dE5vZGUoIjwhLS0gVGhpcyBpcyBhIENvbW1lbnQtLT4iKTsKLSAgICAgICAgICAgIHNvYXBFbGUuYWRkVGV4dE5vZGUoImJhciIpOwotICAgICAgICAgICAgc29hcEVsZS5hZGRDaGlsZEVsZW1lbnQoIkNoaWxkMSIsICJjaCIsICJodHRwOi8vdGVzdC5hcGFjaGUub3JnLyIpOwotICAgICAgICAgICAgc29hcEVsZS5hZGRDaGlsZEVsZW1lbnQoIkNoaWxkMiIsICJjaCIsICJodHRwOi8vdGVzdC5hcGFjaGUub3JnLyIpOwotICAgICAgICB9IGNhdGNoIChTT0FQRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgRXhjZXB0aW9uICIgKyBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGFzc2VydFRydWUoKChUZXh0KXNvYXBFbGUuZ2V0Rmlyc3RDaGlsZCgpLmdldE5leHRTaWJsaW5nKCkpLmlzQ29tbWVudCgpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoKChUZXh0KXNvYXBFbGUuZ2V0TGFzdENoaWxkKCkuZ2V0UHJldmlvdXNTaWJsaW5nKCkKLSAgICAgICAgICAgICAgICAuZ2V0UHJldmlvdXNTaWJsaW5nKCkpLmlzQ29tbWVudCgpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoKChUZXh0KXNvYXBFbGUuZ2V0TGFzdENoaWxkKCkuZ2V0UHJldmlvdXNTaWJsaW5nKCkKLSAgICAgICAgICAgICAgICAuZ2V0UHJldmlvdXNTaWJsaW5nKCkpLmlzQ29tbWVudCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkQ2hpbGRFbGVtZW50KCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgU3RyaW5nIHMgPSAiTXlOYW1lMSI7Ci0gICAgICAgICAgICBTdHJpbmcgcCA9ICJNeVByZWZpeDEiOwotICAgICAgICAgICAgU3RyaW5nIHUgPSAibXlVUkkiOwotICAgICAgICAgICAgU09BUEJvZHkgYm9keSA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKCkuY3JlYXRlTWVzc2FnZSgpLmdldFNPQVBCb2R5KCk7Ci0gICAgICAgICAgICBTT0FQRWxlbWVudCBteXNlID0gYm9keS5hZGROYW1lc3BhY2VEZWNsYXJhdGlvbihwLCB1KTsKLSAgICAgICAgICAgIFNPQVBFbGVtZW50IHNlID0gYm9keS5hZGRDaGlsZEVsZW1lbnQocywgcCk7Ci0gICAgICAgICAgICBpZiAoc2UgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZhaWwoIlNPQVBFbGVtZW50IHdhcyBudWxsIik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGkgPSBib2R5LmdldENoaWxkRWxlbWVudHMoKTsKLSAgICAgICAgICAgICAgICBpbnQgY291bnQgPSBnZXRJdGVyYXRvckNvdW50KGkpOwotICAgICAgICAgICAgICAgIGkgPSBib2R5LmdldENoaWxkRWxlbWVudHMoKTsKLSAgICAgICAgICAgICAgICBpZiAoY291bnQgIT0gMSkgewotICAgICAgICAgICAgICAgICAgICBmYWlsKCJXcm9uZyBpdGVyYXRvciBjb3VudCByZXR1cm5lZCBvZiAiICsgY291bnQgKyAiLCBleHBlY3RlZCAxIik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgU09BUEVsZW1lbnQgc2UyID0gKFNPQVBFbGVtZW50KWkubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIXNlLmVxdWFscyhzZTIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmYWlsKCJFbGVtZW50cyBub3QgZXF1YWwiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IHNlLmdldEVsZW1lbnROYW1lKCkuZ2V0TG9jYWxOYW1lKCk7Ci0gICAgICAgICAgICAgICAgTmFtZSBuID0gc2UuZ2V0RWxlbWVudE5hbWUoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gc2UuZ2V0RWxlbWVudE5hbWUoKS5nZXRQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICBpZiAoIW5hbWUuZXF1YWxzKHMpIHx8ICFwcmVmaXguZXF1YWxzKHApKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZhaWwoImFkZENoaWxkRWxlbWVudCgpIGRpZCBub3QgcmV0dXJuIGNvcnJlY3QgbG9jYWwgbmFtZSBhbmQgcHJlZml4Iik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbjogIiArIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEFkZENoaWxkRWxlbWVudDIoKSB7Ci0gICAgICAgIGJvb2xlYW4gcGFzcyA9IHRydWU7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTT0FQTWVzc2FnZSBtc2cgPQotICAgICAgICAgICAgICAgICAgICBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZShTT0FQQ29uc3RhbnRzLlNPQVBfMV8yX1BST1RPQ09MKS5jcmVhdGVNZXNzYWdlKCk7Ci0gICAgICAgICAgICBTT0FQRW52ZWxvcGUgc29hcEVudmVsb3BlID0gbXNnLmdldFNPQVBQYXJ0KCkuZ2V0RW52ZWxvcGUoKTsKLSAgICAgICAgICAgIFNPQVBCb2R5IGJvZHkgPSBtc2cuZ2V0U09BUEJvZHkoKTsKLQotICAgICAgICAgICAgTmFtZSBuYW1lID0gc29hcEVudmVsb3BlLmNyZWF0ZU5hbWUoIk15Q2hpbGQxIik7Ci0gICAgICAgICAgICAvL0FkZCBjaGlsZCBlbGVtZW50IE5hbWUgb2JqZWN0IHdpdGggbG9jYWxOYW1lPU15Q2hpbGQxCi0gICAgICAgICAgICBTT0FQRWxlbWVudCBzZSA9IGJvZHkuYWRkQ2hpbGRFbGVtZW50KG5hbWUpOwotICAgICAgICAgICAgaWYgKHNlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmYWlsKCJhZGRDaGlsZEVsZW1lbnQoKSBkaWQgbm90IHJldHVybiBTT0FQRWxlbWVudCIpOwotICAgICAgICAgICAgICAgIC8vcGFzcyA9IGZhbHNlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvL0ZpbmQgdGhlIGNoaWxkIGVsZW1lbnQganVzdCBhZGRlZAotICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGNoaWxkcyA9IGJvZHkuZ2V0Q2hpbGRFbGVtZW50cyhuYW1lKTsKLSAgICAgICAgICAgICAgICBpbnQgY291bnQgPSAwOwotICAgICAgICAgICAgICAgIHdoaWxlIChjaGlsZHMuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIE9iamVjdCBvYmogPSAoT2JqZWN0KWNoaWxkcy5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGNvdW50Kys7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgY2hpbGRzID0gYm9keS5nZXRDaGlsZEVsZW1lbnRzKG5hbWUpOwotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoY291bnQgPT0gMSk7Ci0KLSAgICAgICAgICAgICAgICBTT0FQRWxlbWVudCBzZTIgPSAoU09BUEVsZW1lbnQpY2hpbGRzLm5leHQoKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoc2UsIHNlMik7Ci0gICAgICAgICAgICAgICAgLy9zZSA9IHNlMiAoZXhwZWN0ZWQpCi0KLSAgICAgICAgICAgICAgICAvL1JldHJpZXZlIHRoZSBTT0FQRWxlbWVudCBOYW1lCi0gICAgICAgICAgICAgICAgTmFtZSBuID0gc2UuZ2V0RWxlbWVudE5hbWUoKTsKLSAgICAgICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigibG9jYWxOYW1lPSIrbi5nZXRMb2NhbE5hbWUoKSsiIHByZWZpeD0iCi0gICAgICAgICAgICAgICAgLy8JCQkrbi5nZXRQcmVmaXgoKSsiIFVSST0iK24uZ2V0VVJJKCkrIiBxdWFsaWZpZWROYW1lPSIKLSAgICAgICAgICAgICAgICAvLwkJCStuLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG4sIG5hbWUpOwotICAgICAgICAgICAgICAgIC8vaWYgKCFuLmVxdWFscyhuYW1lKSkgewotICAgICAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJOYW1lIG9iamVjdHMgYXJlIG5vdCBlcXVhbCAodW5leHBlY3RlZCkiKTsKLSAgICAgICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiYWRkQ2hpbGRFbGVtZW50KCkgZGlkIG5vdCByZXR1cm4gIiArCi0gICAgICAgICAgICAgICAgLy8iY29ycmVjdCBOYW1lIG9iamVjdCBleHBlY3RlZCBsb2NhbE5hbWU9IiArCi0gICAgICAgICAgICAgICAgLy9uYW1lLmdldExvY2FsTmFtZSgpICsgIiwgZ290IGxvY2FsTmFtZT0iCi0gICAgICAgICAgICAgICAgLy8rIG4uZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICAgICAgICAgIC8vfQotCi0gICAgICAgICAgICAgICAgLy9OYW1lIG9iamVjdHMgYXJlIGVxdWFsIChleHBlY3RlZCkKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uOiAiICsgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkVGV4dE5vZGUyKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgU09BUE1lc3NhZ2UgbXNnID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoKS5jcmVhdGVNZXNzYWdlKCk7Ci0gICAgICAgICAgICBTT0FQRW52ZWxvcGUgZW52ZWxvcGUgPSBtc2cuZ2V0U09BUFBhcnQoKS5nZXRFbnZlbG9wZSgpOwotICAgICAgICAgICAgU09BUEJvZHkgYm9keSA9IGVudmVsb3BlLmdldEJvZHkoKTsKLSAgICAgICAgICAgIEl0ZXJhdG9yIGlTdGFydCA9IGVudmVsb3BlLmdldENoaWxkRWxlbWVudHMoKTsKLSAgICAgICAgICAgIGludCBjb3VudFN0YXJ0ID0gZ2V0SXRlcmF0b3JDb3VudChpU3RhcnQpOwotICAgICAgICAgICAgU09BUEVsZW1lbnQgc2UgPSBlbnZlbG9wZS5hZGRUZXh0Tm9kZSgiPHR4dD5UaGlzIGlzIHRleHQ8L3R4dD4iKTsKLSAgICAgICAgICAgIGlmIChzZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZmFpbCgiYWRkVGV4dE5vZGUoKSBkaWQgbm90IHJldHVybiBTT0FQRWxlbWVudCIpOwotICAgICAgICAgICAgfSBlbHNlIGlmICghZW52ZWxvcGUuZ2V0VmFsdWUoKS5lcXVhbHMoIjx0eHQ+VGhpcyBpcyB0ZXh0PC90eHQ+IikpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcyA9IGJvZHkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBmYWlsKCJhZGRUZXh0Tm9kZSgpIGRpZCBub3QgcmV0dXJuIGV4cGVjdGVkIHRleHQsIFJldHVybmVkICIgKyBzICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIsIEV4cGVjdGVkIDx0eHQ+VGhpcyBpcyB0ZXh0PC90eHQ+Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBJdGVyYXRvciBpID0gZW52ZWxvcGUuZ2V0Q2hpbGRFbGVtZW50cygpOwotICAgICAgICAgICAgaW50IGNvdW50ID0gZ2V0SXRlcmF0b3JDb3VudChpKTsKLSAgICAgICAgICAgIGkgPSBlbnZlbG9wZS5nZXRDaGlsZEVsZW1lbnRzKCk7Ci0gICAgICAgICAgICBpZiAoY291bnQgIT0gKytjb3VudFN0YXJ0KSB7Ci0gICAgICAgICAgICAgICAgZmFpbCgiV3JvbmcgaXRlcmF0b3IgY291bnQgcmV0dXJuZWQgb2YgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICBjb3VudCArICIsIGV4cGVjdGVkICIgKyBjb3VudFN0YXJ0KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IG9iaiA9IG51bGw7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9iaiA9IGkubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgVGV4dCkgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgVGV4dCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZmFpbCgib2JqIGlzIG5vdCBpbnN0YW5jZW9mIFRleHQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJFeGNlcHRpb246ICIgKyBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBdHRyaWJ1dGUoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTT0FQTWVzc2FnZSBtc2cgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpLmNyZWF0ZU1lc3NhZ2UoKTsKLSAgICAgICAgICAgIFNPQVBFbnZlbG9wZSBlbnZlbG9wZSA9IG1zZy5nZXRTT0FQUGFydCgpLmdldEVudmVsb3BlKCk7Ci0gICAgICAgICAgICBTT0FQQm9keSBib2R5ID0gZW52ZWxvcGUuZ2V0Qm9keSgpOwotICAgICAgICAgICAgTmFtZSBuYW1lID0gZW52ZWxvcGUuY3JlYXRlTmFtZSgiTXlBdHRyMSIpOwotICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gIk15VmFsdWUxIjsKLSAgICAgICAgICAgIGJvZHkuYWRkQXR0cmlidXRlKG5hbWUsIHZhbHVlKTsKLSAgICAgICAgICAgIGJvb2xlYW4gYiA9IGJvZHkucmVtb3ZlQXR0cmlidXRlKG5hbWUpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgicmVtb3ZlQXR0cmlidXRlKCkgZGlkIG5vdCByZXR1cm4gdHJ1ZSIsIGIpOwotICAgICAgICAgICAgYiA9IGJvZHkucmVtb3ZlQXR0cmlidXRlKG5hbWUpOwotICAgICAgICAgICAgYXNzZXJ0RmFsc2UoInJlbW92ZUF0dHJpYnV0ZSgpIGRpZCBub3QgcmV0dXJuIGZhbHNlIiwgYik7Ci0gICAgICAgICAgICBhc3NlcnROdWxsKGJvZHkuZ2V0QXR0cmlidXRlVmFsdWUobmFtZSkpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uOiAiICsgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQXR0cmlidXRlMigpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNPQVBNZXNzYWdlIG1zZyA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKCkuY3JlYXRlTWVzc2FnZSgpOwotICAgICAgICAgICAgU09BUEVudmVsb3BlIGVudmVsb3BlID0gbXNnLmdldFNPQVBQYXJ0KCkuZ2V0RW52ZWxvcGUoKTsKLSAgICAgICAgICAgIFNPQVBCb2R5IGJvZHkgPSBlbnZlbG9wZS5nZXRCb2R5KCk7Ci0KLSAgICAgICAgICAgIFFOYW1lIG5hbWUgPSBuZXcgUU5hbWUoIk15QXR0cjEiKTsKLSAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9ICJNeVZhbHVlMSI7Ci0gICAgICAgICAgICBib2R5LmFkZEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7Ci0gICAgICAgICAgICBib29sZWFuIGIgPSBib2R5LnJlbW92ZUF0dHJpYnV0ZShuYW1lKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoYik7Ci0KLSAgICAgICAgICAgIGIgPSBib2R5LnJlbW92ZUF0dHJpYnV0ZShuYW1lKTsKLSAgICAgICAgICAgIGlmIChiKSB7Ci0gICAgICAgICAgICAgICAgLy9yZW1vdmVBdHRyaWJ1dGUoKSBkaWQgbm90IHJldHVybiBmYWxzZQotICAgICAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vZ2V0QXR0cmlidXRlVmFsdWUgc2hvdWxkIHJldHVybiBudWxsCi0gICAgICAgICAgICBhc3NlcnROdWxsKGJvZHkuZ2V0QXR0cmlidXRlVmFsdWUobmFtZSkpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiRXJyb3IgOiAiICsgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQXR0cmlidXRlTmFtZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNPQVBNZXNzYWdlIG1zZyA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKCkuY3JlYXRlTWVzc2FnZSgpOwotICAgICAgICAgICAgU09BUEVudmVsb3BlIGVudmVsb3BlID0gbXNnLmdldFNPQVBQYXJ0KCkuZ2V0RW52ZWxvcGUoKTsKLSAgICAgICAgICAgIFNPQVBCb2R5IGJvZHkgPSBlbnZlbG9wZS5nZXRCb2R5KCk7Ci0KLSAgICAgICAgICAgIE5hbWUgbmFtZSA9IGVudmVsb3BlLmNyZWF0ZU5hbWUoIk15QXR0cjEiKTsKLSAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9ICJNeVZhbHVlMSI7Ci0gICAgICAgICAgICBib2R5LmFkZEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7Ci0gICAgICAgICAgICBib29sZWFuIGIgPSBib2R5LnJlbW92ZUF0dHJpYnV0ZShuYW1lKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoYik7Ci0KLSAgICAgICAgICAgIGIgPSBib2R5LnJlbW92ZUF0dHJpYnV0ZShuYW1lKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoIWIpOwotCi0gICAgICAgICAgICBTdHJpbmcgcyA9IGJvZHkuZ2V0QXR0cmlidXRlVmFsdWUobmFtZSk7Ci0gICAgICAgICAgICBhc3NlcnROdWxsKHMpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiRmFpbGVkIDogIiArIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCBfdGVzdFJlbW92ZUF0dHJpYnV0ZVFOYW1lKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgU09BUE1lc3NhZ2UgbXNnID0KLSAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoU09BUENvbnN0YW50cy5TT0FQXzFfMl9QUk9UT0NPTCkuY3JlYXRlTWVzc2FnZSgpOwotICAgICAgICAgICAgU09BUEVudmVsb3BlIGVudmVsb3BlID0gbXNnLmdldFNPQVBQYXJ0KCkuZ2V0RW52ZWxvcGUoKTsKLSAgICAgICAgICAgIFNPQVBCb2R5IGJvZHkgPSBlbnZlbG9wZS5nZXRCb2R5KCk7Ci0KLSAgICAgICAgICAgIFFOYW1lIG5hbWUgPSBuZXcgUU5hbWUoIk15QXR0cjEiKTsKLSAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9ICJNeVZhbHVlMSI7Ci0gICAgICAgICAgICBib2R5LmFkZEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7Ci0gICAgICAgICAgICBib29sZWFuIGIgPSBib2R5LnJlbW92ZUF0dHJpYnV0ZShuYW1lKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoYik7Ci0gICAgICAgICAgICBiID0gYm9keS5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKCFiKTsKLQotICAgICAgICAgICAgYXNzZXJ0TnVsbChib2R5LmdldEF0dHJpYnV0ZVZhbHVlKG5hbWUpKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFJlbW92ZU5hbWVzcGFjZURlY2xhcmF0aW9uKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgU3RyaW5nIHByZWZpeCA9ICJteVByZWZpeCI7Ci0gICAgICAgICAgICBTdHJpbmcgdXJpID0gIm15VVJJIjsKLSAgICAgICAgICAgIFNPQVBNZXNzYWdlIG1zZyA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKCkuY3JlYXRlTWVzc2FnZSgpOwotICAgICAgICAgICAgU09BUEVudmVsb3BlIGVudmVsb3BlID0gbXNnLmdldFNPQVBQYXJ0KCkuZ2V0RW52ZWxvcGUoKTsKLSAgICAgICAgICAgIFNPQVBCb2R5IGJvZHkgPSBlbnZlbG9wZS5nZXRCb2R5KCk7Ci0gICAgICAgICAgICBib2R5LmFkZE5hbWVzcGFjZURlY2xhcmF0aW9uKHByZWZpeCwgdXJpKTsKLSAgICAgICAgICAgIGJvb2xlYW4gYiA9IGJvZHkucmVtb3ZlTmFtZXNwYWNlRGVjbGFyYXRpb24ocHJlZml4KTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoInJlbW92ZU5hbWVzcGFjZURlY2xhcmF0aW9uKCkgZGlkIG5vdCByZXR1cm4gdHJ1ZSIsIGIpOwotICAgICAgICAgICAgYiA9IGJvZHkucmVtb3ZlTmFtZXNwYWNlRGVjbGFyYXRpb24ocHJlZml4KTsKLSAgICAgICAgICAgIGFzc2VydEZhbHNlKCJyZW1vdmVOYW1lc3BhY2VEZWNsYXJhdGlvbigpIGRpZCBub3QgcmV0dXJuIGZhbHNlIiwgYik7Ci0gICAgICAgICAgICBhc3NlcnROdWxsKGJvZHkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCkpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uOiAiICsgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBfdGVzdFNldEVuY29kaW5nU3R5bGUoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTT0FQTWVzc2FnZSBtc2cgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpLmNyZWF0ZU1lc3NhZ2UoKTsKLSAgICAgICAgICAgIFNPQVBFbnZlbG9wZSBlbnZlbG9wZSA9IG1zZy5nZXRTT0FQUGFydCgpLmdldEVudmVsb3BlKCk7Ci0gICAgICAgICAgICBTT0FQQm9keSBib2R5ID0gZW52ZWxvcGUuZ2V0Qm9keSgpOwotICAgICAgICAgICAgYm9keS5zZXRFbmNvZGluZ1N0eWxlKFNPQVBDb25zdGFudHMuVVJJX05TX1NPQVBfRU5DT0RJTkcpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBib2R5LnNldEVuY29kaW5nU3R5bGUoIkJPR1VTIik7Ci0gICAgICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgRXhjZXB0aW9uIGRpZCBub3Qgb2NjdXIiKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgRXhjZXB0aW9uIG9jY3VycmVkIiwgdHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJFeGNlcHRpb246ICIgKyBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgaW50IGdldEl0ZXJhdG9yQ291bnQoSXRlcmF0b3IgaXRlcikgewotICAgICAgICBpbnQgY291bnQgPSAwOwotICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgY291bnQgKys7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNvdW50OwotICAgIH0KLQotICAgIHByaXZhdGUgVGV4dEltcGxFeCBhc3NlcnRDb250YWluc1RleHQoU09BUEVsZW1lbnQgc29hcEVsZW0pIHsKLSAgICAgICAgYXNzZXJ0VHJ1ZShzb2FwRWxlbS5oYXNDaGlsZE5vZGVzKCkpOwotICAgICAgICBMaXN0IGNoaWxkRWxlbXMgPSB0b0xpc3Qoc29hcEVsZW0uZ2V0Q2hpbGRFbGVtZW50cygpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShjaGlsZEVsZW1zLnNpemUoKSA9PSAxKTsKLSAgICAgICAgTm9kZUltcGwgbm9kZSA9IChOb2RlSW1wbCljaGlsZEVsZW1zLmdldCgwKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShub2RlIGluc3RhbmNlb2YgVGV4dEltcGxFeCk7Ci0gICAgICAgIHJldHVybiAoVGV4dEltcGxFeClub2RlOwotICAgIH0KLQotICAgIHByaXZhdGUgTGlzdCB0b0xpc3QoamF2YS51dGlsLkl0ZXJhdG9yIGl0ZXIpIHsKLSAgICAgICAgTGlzdCBsaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLSAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBsaXN0LmFkZChpdGVyLm5leHQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGxpc3Q7Ci0gICAgfQotCi0KLSAgICAvKgotICAgICogdGVzdCBmb3IgYWRkQ2hpbGRFbGVtZW50KFFOYW1lIHFuYW1lKQotICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEFkZENoaWxkRWxlbWVudDMoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBRTmFtZSBxbmFtZSA9IG5ldyBRTmFtZSgiaHR0cDovL3NhbXBsZS5hcGFjaGUub3JnL3RyYWRlciIsICJHZXRTdG9ja1F1b3RlIiwgInciKTsKLSAgICAgICAgICAgIHNvYXBFbGUuYWRkQ2hpbGRFbGVtZW50KHFuYW1lKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoc29hcEVsZSk7Ci0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbjogIiArIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QXR0cmlidXRlVmFsdWUoKSB7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc29hcEVsZSk7Ci0gICAgICAgIFN0cmluZyB2YWx1ZSA9ICIyMzQuNTAiOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgUU5hbWUgcW5hbWUgPSBuZXcgUU5hbWUoImh0dHA6Ly9zYW1wbGUuYXBhY2hlLm9yZy90cmFkZXIiLCAiR2V0U3RvY2tRdW90ZSIsICJ3Iik7Ci0gICAgICAgICAgICBzb2FwRWxlLmFkZEF0dHJpYnV0ZShxbmFtZSwgdmFsdWUpOwotICAgICAgICAgICAgU3RyaW5nIHZhbHVlUmV0dXJuZWQgPSBzb2FwRWxlLmdldEF0dHJpYnV0ZVZhbHVlKHFuYW1lKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyh2YWx1ZSwgdmFsdWVSZXR1cm5lZCk7Ci0KLSAgICAgICAgfSBjYXRjaCAoU09BUEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIEV4Y2VwdGlvbiAiICsgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIHB1YmxpYyB2b2lkIF90ZXN0R2V0Q2hpbGRFbGVtZW50cygpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNPQVBFbGVtZW50IGNoaWxkRWxlMSA9Ci0gICAgICAgICAgICAgICAgICAgIFNPQVBGYWN0b3J5SW1wbC5uZXdJbnN0YW5jZSgpLmNyZWF0ZUVsZW1lbnQoIkNoaWxkMSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNoIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL3Rlc3QuYXBhY2hlLm9yZy8iKTsKLSAgICAgICAgICAgIFNPQVBFbGVtZW50IGNoaWxkRWxlMiA9Ci0gICAgICAgICAgICAgICAgICAgIFNPQVBGYWN0b3J5SW1wbC5uZXdJbnN0YW5jZSgpLmNyZWF0ZUVsZW1lbnQoIkNoaWxkMiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNoIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL3Rlc3QuYXBhY2hlLm9yZy8iKTsKLSAgICAgICAgICAgIGNoaWxkRWxlMS5hZGRDaGlsZEVsZW1lbnQoY2hpbGRFbGUyKTsKLSAgICAgICAgICAgIHNvYXBFbGUuYWRkQ2hpbGRFbGVtZW50KGNoaWxkRWxlMSk7Ci0KLSAgICAgICAgICAgIFFOYW1lIHFuYW1lID0gbmV3IFFOYW1lKCJodHRwOi8vdGVzdC5hcGFjaGUub3JnLyIsICJDaGlsZDEiLCAiY2giKTsKLSAgICAgICAgICAgIEl0ZXJhdG9yIGNoaWxkRWxlbWVudHMgPSBzb2FwRWxlLmdldENoaWxkRWxlbWVudHMocW5hbWUpOwotCi0KLSAgICAgICAgICAgIGludCBjaGlsZENvdW50ID0gMDsKLSAgICAgICAgICAgIHdoaWxlIChjaGlsZEVsZW1lbnRzLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIE5vZGUgbm9kZSA9IChOb2RlKWNoaWxkRWxlbWVudHMubmV4dCgpOwotICAgICAgICAgICAgICAgIGNoaWxkQ291bnQrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhjaGlsZENvdW50LCAyKTsKLSAgICAgICAgfSBjYXRjaCAoU09BUEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIEV4Y2VwdGlvbiAiICsgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvL1RPRE8gOiBjaGVjayB3aHkgdGhpcyBpcyBmYWlsaW5nCi0gICAgcHVibGljIHZvaWQgX3Rlc3RHZXRDaGlsZEVsZW1lbnRzMigpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5IGZhY3QgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgU09BUE1lc3NhZ2UgbWVzc2FnZSA9IGZhY3QuY3JlYXRlTWVzc2FnZSgpOwotICAgICAgICAgICAgU09BUFBhcnQgc29hcFBhcnQgPSBtZXNzYWdlLmdldFNPQVBQYXJ0KCk7Ci0gICAgICAgICAgICBTT0FQRW52ZWxvcGUgc29hcEVudmVsb3BlID0gc29hcFBhcnQuZ2V0RW52ZWxvcGUoKTsKLSAgICAgICAgICAgIFNPQVBCb2R5IHNvYXBCb2R5ID0gc29hcEVudmVsb3BlLmdldEJvZHkoKTsKLQotICAgICAgICAgICAgTmFtZSBuYW1lID0gc29hcEVudmVsb3BlLmNyZWF0ZU5hbWUoIk15Q2hpbGQxIik7Ci0gICAgICAgICAgICBTT0FQRWxlbWVudCBzZSA9IHNvYXBCb2R5LmFkZENoaWxkRWxlbWVudChuYW1lKTsKLSAgICAgICAgICAgIEl0ZXJhdG9yIGNoaWxkRWxlbWVudHNDb3VudCA9IHNvYXBCb2R5LmdldENoaWxkRWxlbWVudHMoKTsKLSAgICAgICAgICAgIEl0ZXJhdG9yIGNoaWxkRWxlbWVudHMgPSBzb2FwQm9keS5nZXRDaGlsZEVsZW1lbnRzKCk7Ci0KLSAgICAgICAgICAgIGludCBjaGlsZENvdW50ID0gMDsKLSAgICAgICAgICAgIHdoaWxlIChjaGlsZEVsZW1lbnRzQ291bnQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgTm9kZSBub2RlID0gKE5vZGUpY2hpbGRFbGVtZW50c0NvdW50Lm5leHQoKTsKLSAgICAgICAgICAgICAgICBjaGlsZENvdW50Kys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoY2hpbGRDb3VudCwgMSk7Ci0gICAgICAgICAgICBTT0FQRWxlbWVudCBzZTIgPSAoU09BUEVsZW1lbnQpY2hpbGRFbGVtZW50cy5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAoIXNlLmVxdWFscyhzZTIpKSB7Ci0gICAgICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlNPQVBFbGVtZW50IHNlID0gc2UyIChleHBlY3RlZCkiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgTmFtZSBuID0gc2UuZ2V0RWxlbWVudE5hbWUoKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhuLCBuYW1lKTsKLSAgICAgICAgfSBjYXRjaCAoU09BUEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIEV4Y2VwdGlvbiAiICsgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0Q2hpbGRFbGVtZW50czMoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBNZXNzYWdlRmFjdG9yeSBmYWN0ID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIFNPQVBNZXNzYWdlIG1lc3NhZ2UgPSBmYWN0LmNyZWF0ZU1lc3NhZ2UoKTsKLSAgICAgICAgICAgIFNPQVBQYXJ0IHNvYXBQYXJ0ID0gbWVzc2FnZS5nZXRTT0FQUGFydCgpOwotICAgICAgICAgICAgU09BUEVudmVsb3BlIHNvYXBFbnZlbG9wZSA9IHNvYXBQYXJ0LmdldEVudmVsb3BlKCk7Ci0gICAgICAgICAgICBTT0FQQm9keSBzb2FwQm9keSA9IHNvYXBFbnZlbG9wZS5nZXRCb2R5KCk7Ci0KLSAgICAgICAgICAgIC8vTmFtZSBuYW1lID0gc29hcEVudmVsb3BlLmNyZWF0ZU5hbWUoIk15Q2hpbGQxIik7Ci0gICAgICAgICAgICBRTmFtZSBuYW1lID0gbmV3IFFOYW1lKCJNeUNoaWxkMSIpOwotICAgICAgICAgICAgU09BUEVsZW1lbnQgc2UgPSBzb2FwQm9keS5hZGRDaGlsZEVsZW1lbnQobmFtZSk7Ci0gICAgICAgICAgICBJdGVyYXRvciBjaGlsZEVsZW1lbnRzQ291bnQgPSBzb2FwQm9keS5nZXRDaGlsZEVsZW1lbnRzKCk7Ci0gICAgICAgICAgICBJdGVyYXRvciBjaGlsZEVsZW1lbnRzID0gc29hcEJvZHkuZ2V0Q2hpbGRFbGVtZW50cygpOwotCi0gICAgICAgICAgICBpbnQgY2hpbGRDb3VudCA9IDA7Ci0gICAgICAgICAgICB3aGlsZSAoY2hpbGRFbGVtZW50c0NvdW50Lmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIE5vZGUgbm9kZSA9IChOb2RlKWNoaWxkRWxlbWVudHNDb3VudC5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgY2hpbGRDb3VudCsrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGNoaWxkQ291bnQsIDEpOwotICAgICAgICAgICAgU09BUEVsZW1lbnQgc2UyID0gKFNPQVBFbGVtZW50KWNoaWxkRWxlbWVudHMubmV4dCgpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHNlLCBzZTIpOwotCi0gICAgICAgICAgICBRTmFtZSBuID0gc2UuZ2V0RWxlbWVudFFOYW1lKCk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMobiwgbmFtZSk7Ci0gICAgICAgIH0gY2F0Y2ggKFNPQVBFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBFeGNlcHRpb24gIiArIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgX3Rlc3RSZW1vdmVBdHRyaWJ1dGUyKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgUU5hbWUgcW5hbWUgPSBuZXcgUU5hbWUoImh0dHA6Ly9jaGlsZDEuYXBhY2hlLm9yZy8iLCAiQ2hpbGQxIiwgImNoIik7Ci0gICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSAiTXlWYWx1ZTEiOwotICAgICAgICAgICAgc29hcEVsZS5hZGRBdHRyaWJ1dGUocW5hbWUsIHZhbHVlKTsKLSAgICAgICAgICAgIGJvb2xlYW4gYiA9IHNvYXBFbGUucmVtb3ZlQXR0cmlidXRlKHFuYW1lKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoInJlbW92ZUF0dHJpYnV0ZSgpIGRpZCBub3QgcmV0dXJuIHRydWUiLCBiKTsKLSAgICAgICAgICAgIGIgPSBzb2FwRWxlLnJlbW92ZUF0dHJpYnV0ZShxbmFtZSk7Ci0gICAgICAgICAgICBhc3NlcnRGYWxzZSgicmVtb3ZlQXR0cmlidXRlKCkgZGlkIG5vdCByZXR1cm4gZmFsc2UiLCBiKTsKLSAgICAgICAgICAgIGFzc2VydE51bGwoc29hcEVsZS5nZXRBdHRyaWJ1dGVWYWx1ZShxbmFtZSkpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbjogIiArIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgX3Rlc3RTZXRFbGVtZW50UU5hbWUoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBRTmFtZSBxbmFtZSA9IG5ldyBRTmFtZSgiaHR0cDovL2NoaWxkMS5hcGFjaGUub3JnLyIsICJuZXdOYW1lIiwgImNoIik7Ci0gICAgICAgICAgICBzb2FwRWxlLnNldEVsZW1lbnRRTmFtZShxbmFtZSk7Ci0gICAgICAgICAgICBhc3NlcnROdWxsKHNvYXBFbGUuZ2V0RWxlbWVudE5hbWUoKS5nZXRMb2NhbE5hbWUoKSwgIm5ld05hbWUiKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICBmYWlsKCJFeGNlcHRpb246ICIgKyBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIF90ZXN0Q3JlYXRlUU5hbWUoKSB7Ci0gICAgICAgIFN0cmluZyBwcmVmaXggPSAiIjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vU09BUE1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKCkuY3JlYXRlTWVzc2FnZSgpOwotICAgICAgICAgICAgU09BUE1lc3NhZ2UgbWVzc2FnZSA9Ci0gICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKFNPQVBDb25zdGFudHMuU09BUF8xXzJfUFJPVE9DT0wpLmNyZWF0ZU1lc3NhZ2UoKTsKLSAgICAgICAgICAgIFNPQVBQYXJ0IHNvYXBQYXJ0ID0gbWVzc2FnZS5nZXRTT0FQUGFydCgpOwotICAgICAgICAgICAgU09BUEVudmVsb3BlIGVudmVsb3BlID0gc29hcFBhcnQuZ2V0RW52ZWxvcGUoKTsKLSAgICAgICAgICAgIFNPQVBCb2R5IGJvZHkgPSBlbnZlbG9wZS5nZXRCb2R5KCk7Ci0KLSAgICAgICAgICAgIFFOYW1lIHFuYW1lID0gZW52ZWxvcGUuY3JlYXRlUU5hbWUoInFuYW1lIiwgcHJlZml4KTsKLSAgICAgICAgICAgIFN0cmluZyB0cHJlZml4ID0gcW5hbWUuZ2V0UHJlZml4KCk7Ci0gICAgICAgICAgICBTdHJpbmcgdHVyaSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgU3RyaW5nIHRuYW1lID0gcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICBpZiAoIXRwcmVmaXguZXF1YWxzKHByZWZpeCkgfHwgIXR1cmkuZXF1YWxzKGVudmVsb3BlLmdldEVsZW1lbnROYW1lKCkuZ2V0VVJJKCkpKSB7Ci0gICAgICAgICAgICAgICAgZmFpbCgiY3JlYXRlUU5hbWUoKSBkaWQgbm90IGNyZWF0ZSBjb3JyZWN0IHFuYW1lXG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZDogPHVyaT0iICsgZW52ZWxvcGUuZ2V0RWxlbWVudE5hbWUoKS5nZXRVUkkoKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAiLCBwcmVmaXg9IiArIHByZWZpeCArICIsIGxvY2FscGFydD1xbmFtZT5cbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgImdvdDogICAgICA8dXJpPSIgKyB0dXJpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIsIHByZWZpeD0iICsgdHByZWZpeCArICIsIGxvY2FscGFydD0iICsgdG5hbWUgKyAiPiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcW5hbWUgPSBib2R5LmNyZWF0ZVFOYW1lKCJxbmFtZSIsIGJvZHkuZ2V0RWxlbWVudE5hbWUoKS5nZXRQcmVmaXgoKSk7Ci0gICAgICAgICAgICB0cHJlZml4ID0gcW5hbWUuZ2V0UHJlZml4KCk7Ci0gICAgICAgICAgICB0dXJpID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICB0bmFtZSA9IHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgaWYgKCF0cHJlZml4LmVxdWFscyhib2R5LmdldEVsZW1lbnROYW1lKCkuZ2V0UHJlZml4KCkpIHx8Ci0gICAgICAgICAgICAgICAgICAgICF0dXJpLmVxdWFscyhib2R5LmdldEVsZW1lbnROYW1lKCkuZ2V0VVJJKCkpKSB7Ci0gICAgICAgICAgICAgICAgZmFpbCgiY3JlYXRlUU5hbWUoKSBkaWQgbm90IGNyZWF0ZSBjb3JyZWN0IHFuYW1lXG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZDogPHVyaT0iICsgYm9keS5nZXRFbGVtZW50TmFtZSgpLmdldFVSSSgpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIsIHByZWZpeD0iICsgYm9keS5nZXRFbGVtZW50TmFtZSgpLmdldFByZWZpeCgpICsgIiwgbG9jYWxwYXJ0PXFuYW1lPlxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiZ290OiAgICAgIDx1cmk9IiArIHR1cmkgKwotICAgICAgICAgICAgICAgICAgICAgICAgIiwgcHJlZml4PSIgKyB0cHJlZml4ICsgIiwgbG9jYWxwYXJ0PSIgKyB0bmFtZSArICI+Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJGYWlsZWQgIiArIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFJlbW92ZUNvbnRlbnQoKSB7Ci0gICAgICAgIGJvb2xlYW4gcGFzcyA9IHRydWU7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBNZXNzYWdlRmFjdG9yeSBmYWN0b3J5ID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIFNPQVBNZXNzYWdlIG1lc3NhZ2UgPSBmYWN0b3J5LmNyZWF0ZU1lc3NhZ2UoKTsKLSAgICAgICAgICAgIFNPQVBQYXJ0IHNvYXBQYXJ0ID0gbWVzc2FnZS5nZXRTT0FQUGFydCgpOwotICAgICAgICAgICAgU09BUEVudmVsb3BlIGVudmVsb3BlID0gc29hcFBhcnQuZ2V0RW52ZWxvcGUoKTsKLSAgICAgICAgICAgIFNPQVBCb2R5IGJvZHkgPSBlbnZlbG9wZS5nZXRCb2R5KCk7Ci0KLSAgICAgICAgICAgIE5hbWUgbmFtZSA9IGVudmVsb3BlLmNyZWF0ZU5hbWUoIk15Q2hpbGQiKTsKLSAgICAgICAgICAgIFNPQVBFbGVtZW50IHNlID0gYm9keS5hZGRDaGlsZEVsZW1lbnQobmFtZSk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHNlKTsKLSAgICAgICAgICAgIEl0ZXJhdG9yIGNoaWxkcyA9IGJvZHkuZ2V0Q2hpbGRFbGVtZW50cyhuYW1lKTsKLSAgICAgICAgICAgIGludCBjaGlsZEVsZW1lbnRDb3VudCA9IDA7Ci0gICAgICAgICAgICBmb3IgKGludCBhID0gMDsgY2hpbGRzLmhhc05leHQoKTsgYSsrKSB7Ci0gICAgICAgICAgICAgICAgY2hpbGRzLm5leHQoKTsKLSAgICAgICAgICAgICAgICBjaGlsZEVsZW1lbnRDb3VudCsrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2hpbGRzID0gYm9keS5nZXRDaGlsZEVsZW1lbnRzKG5hbWUpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGNoaWxkRWxlbWVudENvdW50LCAxKTsKLQotICAgICAgICAgICAgTmFtZSBuID0gc2UuZ2V0RWxlbWVudE5hbWUoKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhuLCBuYW1lKTsKLSAgICAgICAgICAgIC8vQ2hpbGQgYWRkaXRpb24gdmVyaWZpZWQsIG5vdyBjYWxsIHJlbW92ZUNvbnRlbnRzIHRvIGRlbGV0ZSBpdAotICAgICAgICAgICAgc2UucmVtb3ZlQ29udGVudHMoKTsKLSAgICAgICAgICAgIGNoaWxkcyA9IHNlLmdldENoaWxkRWxlbWVudHMoKTsKLSAgICAgICAgICAgIGNoaWxkRWxlbWVudENvdW50ID0gMDsKLSAgICAgICAgICAgIGZvciAoaW50IGEgPSAwOyBjaGlsZHMuaGFzTmV4dCgpOyBhKyspIHsKLSAgICAgICAgICAgICAgICBjaGlsZHMubmV4dCgpOwotICAgICAgICAgICAgICAgIGNoaWxkRWxlbWVudENvdW50Kys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoY2hpbGRFbGVtZW50Q291bnQsIDApOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0RWxlbWVudFFOYW1lKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkgZmFjdG9yeSA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKFNPQVBDb25zdGFudHMuU09BUF8xXzJfUFJPVE9DT0wpOwotICAgICAgICAgICAgU09BUE1lc3NhZ2UgbWVzc2FnZSA9IGZhY3RvcnkuY3JlYXRlTWVzc2FnZSgpOwotICAgICAgICAgICAgU09BUFBhcnQgc29hcFBhcnQgPSBtZXNzYWdlLmdldFNPQVBQYXJ0KCk7Ci0gICAgICAgICAgICBTT0FQRW52ZWxvcGUgZW52ZWxvcGUgPSBzb2FwUGFydC5nZXRFbnZlbG9wZSgpOwotICAgICAgICAgICAgU09BUEJvZHkgYm9keSA9IGVudmVsb3BlLmdldEJvZHkoKTsKLQotICAgICAgICAgICAgUU5hbWUgcW5hbWUxID0gbmV3IFFOYW1lKCJodHRwOi8vZm9vVVJJLmNvbSIsICJmb29FbGVtZW50IiwgImZvbyIpOwotICAgICAgICAgICAgUU5hbWUgcW5hbWUyID0gbmV3IFFOYW1lKCJodHRwOi8vZm9vMlVSSS5jb20iLCAiZm9vRWxlbWVudDIiLCAiZm9vMiIpOwotICAgICAgICAgICAgU09BUEVsZW1lbnQgc2UgPSBib2R5LmFkZENoaWxkRWxlbWVudChxbmFtZTEpOwotICAgICAgICAgICAgUU5hbWUgcW5hbWUgPSBzZS5nZXRFbGVtZW50UU5hbWUoKTsKLSAgICAgICAgICAgIHNlID0gc2Uuc2V0RWxlbWVudFFOYW1lKHFuYW1lMik7Ci0gICAgICAgICAgICBxbmFtZSA9IHNlLmdldEVsZW1lbnRRTmFtZSgpOwotCi0gICAgICAgICAgICBpZiAoIXFuYW1lLmdldE5hbWVzcGFjZVVSSSgpLmVxdWFscyhxbmFtZTIuZ2V0TmFtZXNwYWNlVVJJKCkpIHx8Ci0gICAgICAgICAgICAgICAgICAgICFxbmFtZS5nZXRMb2NhbFBhcnQoKS5lcXVhbHMocW5hbWUyLmdldExvY2FsUGFydCgpKSB8fAotICAgICAgICAgICAgICAgICAgICAhcW5hbWUuZ2V0UHJlZml4KCkuZXF1YWxzKHFuYW1lMi5nZXRQcmVmaXgoKSkpIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInNldEVsZW1lbnRRTmFtZSgpIGRpZCBub3QgcmVzZXQgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiZWxlbWVudCBxbmFtZVxuZXhwZWN0ZWQ6IDxVUkk9IiArIHFuYW1lMi5nZXROYW1lc3BhY2VVUkkoKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAiLCBwcmVmaXg9IiArIHFuYW1lMi5nZXRQcmVmaXgoKSArICIsIGxvY2FscGFydD0iICsgcW5hbWUyLmdldExvY2FsUGFydCgpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICI+XG5nb3Q6ICAgICAgPFVSST0iICsgcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkgKyAiLCBwcmVmaXg9IiArCi0gICAgICAgICAgICAgICAgICAgICAgICBxbmFtZS5nZXRQcmVmaXgoKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAiLCBsb2NhbHBhcnQ9IiArIHFuYW1lLmdldExvY2FsUGFydCgpICsgIj4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIkVycm9yIDoiICsgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0RWxlbWVudFFOYW1lMigpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5IGZhY3RvcnkgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgU09BUE1lc3NhZ2UgbWVzc2FnZSA9IGZhY3RvcnkuY3JlYXRlTWVzc2FnZSgpOwotICAgICAgICAgICAgU09BUFBhcnQgc29hcFBhcnQgPSBtZXNzYWdlLmdldFNPQVBQYXJ0KCk7Ci0gICAgICAgICAgICBTT0FQRW52ZWxvcGUgZW52ZWxvcGUgPSBzb2FwUGFydC5nZXRFbnZlbG9wZSgpOwotICAgICAgICAgICAgU09BUEJvZHkgYm9keSA9IGVudmVsb3BlLmdldEJvZHkoKTsKLSAgICAgICAgICAgIFNPQVBIZWFkZXIgaGVhZGVyID0gZW52ZWxvcGUuZ2V0SGVhZGVyKCk7Ci0KLSAgICAgICAgICAgIFFOYW1lIHFuYW1lID0gbmV3IFFOYW1lKCJxbmFtZSIpOwotICAgICAgICAgICAgLy9UcnkgYW5kIGNoYW5nZSBlbGVtZW50IG5hbWUgb2YgU09BUEVudmVsb3BlIChleHBlY3QgU09BUEV4Y2VwdGlvbikKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgZW52ZWxvcGUuc2V0RWxlbWVudFFOYW1lKHFuYW1lKTsKLSAgICAgICAgICAgICAgICBmYWlsKCJEaWQgbm90IHRocm93IGV4cGVjdGVkIFNPQVBFeGNlcHRpb24iKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFNPQVBFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vQ2F1Z2h0IGV4cGVjdGVkIFNPQVBFeGNlcHRpb24KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy9UcnkgYW5kIGNoYW5nZSBlbGVtZW50IG5hbWUgb2YgU09BUEhlYWRlciAoZXhwZWN0IFNPQVBFeGNlcHRpb24pCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGhlYWRlci5zZXRFbGVtZW50UU5hbWUocW5hbWUpOwotICAgICAgICAgICAgICAgIGZhaWwoIkRpZCBub3QgdGhyb3cgZXhwZWN0ZWQgU09BUEV4Y2VwdGlvbiIpOwotICAgICAgICAgICAgfSBjYXRjaCAoU09BUEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy9DYXVnaHQgZXhwZWN0ZWQgU09BUEV4Y2VwdGlvbgotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvL1RyeSBhbmQgY2hhbmdlIGVsZW1lbnQgbmFtZSBvZiBTT0FQQm9keSAoZXhwZWN0IFNPQVBFeGNlcHRpb24pCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJvZHkuc2V0RWxlbWVudFFOYW1lKHFuYW1lKTsKLSAgICAgICAgICAgICAgICBmYWlsKCJEaWQgbm90IHRocm93IGV4cGVjdGVkIFNPQVBFeGNlcHRpb24iKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFNPQVBFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vQ2F1Z2h0IGV4cGVjdGVkIFNPQVBFeGNlcHRpb24KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIkVycm9yIDogIiArIGUpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RBcHBlbmRDaGlsZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBNZXNzYWdlRmFjdG9yeSBmYWN0ID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgU09BUE1lc3NhZ2UgbWVzc2FnZSA9IGZhY3QuY3JlYXRlTWVzc2FnZSgpOwotICAgICAgICBTT0FQQm9keSBzb2FwQm9keSA9IG1lc3NhZ2UuZ2V0U09BUEJvZHkoKTsKLQotICAgICAgICBRTmFtZSBxbmFtZTEgPSBuZXcgUU5hbWUoImh0dHA6Ly93b21iYXQuenRyYWRlLmNvbSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR2V0TGFzdFRyYWRlUHJpY2UiLCAienRyYWRlIik7Ci0gICAgICAgIFNPQVBFbGVtZW50IGNoaWxkID0gc29hcEJvZHkuYWRkQ2hpbGRFbGVtZW50KHFuYW1lMSk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRGYWxzZShjaGlsZC5nZXRDaGlsZEVsZW1lbnRzKCkuaGFzTmV4dCgpKTsKLSAgICAgICAgCi0gICAgICAgIERvY3VtZW50IGRvYyA9IGNoaWxkLmdldE93bmVyRG9jdW1lbnQoKTsgICAgICAgIAotICAgICAgICBTdHJpbmcgbmFtZXNwYWNlID0gImh0dHA6Ly9leGFtcGxlLmNvbSI7Ci0gICAgICAgIFN0cmluZyBsb2NhbE5hbWUgPSAiR2V0TGFzdFRyYWRlUHJpY2UiOwotICAgICAgICBFbGVtZW50IGdldExhc3RUcmFkZVByaWNlID0gZG9jLmNyZWF0ZUVsZW1lbnROUyhuYW1lc3BhY2UsIGxvY2FsTmFtZSk7ICAgICAgICAKLSAgICAgICAgRWxlbWVudCBzeW1ib2wgPSBkb2MuY3JlYXRlRWxlbWVudCgic3ltYm9sIik7Ci0gICAgICAgIHN5bWJvbC5zZXRBdHRyaWJ1dGUoImZvbyIsICJiYXIiKTsKLSAgICAgICAgZ2V0TGFzdFRyYWRlUHJpY2UuYXBwZW5kQ2hpbGQoc3ltYm9sKTsKLSAgICAgICAgb3JnLnczYy5kb20uVGV4dCBkZWYgPSBkb2MuY3JlYXRlVGV4dE5vZGUoIkRFRiIpOwotICAgICAgICBzeW1ib2wuYXBwZW5kQ2hpbGQoZGVmKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgY2hpbGQuYXBwZW5kQ2hpbGQoZ2V0TGFzdFRyYWRlUHJpY2UpOwotICAgICAgICAKLSAgICAgICAgSXRlcmF0b3IgaXRlciA9IGNoaWxkLmdldENoaWxkRWxlbWVudHMoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShpdGVyLmhhc05leHQoKSk7IAotICAgICAgICBPYmplY3Qgb2JqID0gaXRlci5uZXh0KCk7Ci0gICAgICAgIGFzc2VydFRydWUob2JqIGluc3RhbmNlb2YgU09BUEVsZW1lbnQpOyAgCi0gICAgICAgIFNPQVBFbGVtZW50IHNvYXBFbGVtZW50ID0gKFNPQVBFbGVtZW50KW9iajsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG5hbWVzcGFjZSwgc29hcEVsZW1lbnQuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMobG9jYWxOYW1lLCBzb2FwRWxlbWVudC5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKGl0ZXIuaGFzTmV4dCgpKTsKLSAgICAgICAgCi0gICAgICAgIGl0ZXIgPSBzb2FwRWxlbWVudC5nZXRDaGlsZEVsZW1lbnRzKCk7Ci0gICAgICAgIGFzc2VydFRydWUoaXRlci5oYXNOZXh0KCkpOyAKLSAgICAgICAgb2JqID0gaXRlci5uZXh0KCk7Ci0gICAgICAgIGFzc2VydFRydWUob2JqIGluc3RhbmNlb2YgU09BUEVsZW1lbnQpOyAgCi0gICAgICAgIHNvYXBFbGVtZW50ID0gKFNPQVBFbGVtZW50KW9iajsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG51bGwsIHNvYXBFbGVtZW50LmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJzeW1ib2wiLCBzb2FwRWxlbWVudC5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKGl0ZXIuaGFzTmV4dCgpKTsKLSAgICAgICAgCi0gICAgICAgIGl0ZXIgPSBzb2FwRWxlbWVudC5nZXRDaGlsZEVsZW1lbnRzKCk7Ci0gICAgICAgIGFzc2VydFRydWUoaXRlci5oYXNOZXh0KCkpOyAKLSAgICAgICAgb2JqID0gaXRlci5uZXh0KCk7Ci0gICAgICAgIGFzc2VydFRydWUob2JqIGluc3RhbmNlb2YgVGV4dCk7ICAKLSAgICAgICAgVGV4dCB0ZXh0ID0gKFRleHQpb2JqOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkRFRiIsIHRleHQuZ2V0RGF0YSgpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoaXRlci5oYXNOZXh0KCkpOyAgICAgICAgICAgICAgIAotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQ2hpbGQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgTWVzc2FnZUZhY3RvcnkgZmFjdCA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIFNPQVBNZXNzYWdlIG1lc3NhZ2UgPSBmYWN0LmNyZWF0ZU1lc3NhZ2UoKTsKLSAgICAgICAgU09BUEJvZHkgc29hcEJvZHkgPSBtZXNzYWdlLmdldFNPQVBCb2R5KCk7Ci0KLSAgICAgICAgYXNzZXJ0RmFsc2Uoc29hcEJvZHkuZ2V0Q2hpbGRFbGVtZW50cygpLmhhc05leHQoKSk7Ci0gICAgICAgIAotICAgICAgICBRTmFtZSBxbmFtZTEgPSBuZXcgUU5hbWUoImh0dHA6Ly93b21iYXQuenRyYWRlLmNvbSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR2V0TGFzdFRyYWRlUHJpY2UiLCAienRyYWRlIik7Ci0gICAgICAgIFNPQVBFbGVtZW50IGNoaWxkID0gc29hcEJvZHkuYWRkQ2hpbGRFbGVtZW50KHFuYW1lMSk7Ci0gICAgICAgIGNoaWxkLmFkZFRleHROb2RlKCJmb28iKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydFRydWUoY2hpbGQuZ2V0Q2hpbGRFbGVtZW50cygpLmhhc05leHQoKSk7Ci0gICAgICAgIAotICAgICAgICBOb2RlIHRleHROb2RlID0gKE5vZGUpY2hpbGQuZ2V0Q2hpbGRFbGVtZW50cygpLm5leHQoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSh0ZXh0Tm9kZSBpbnN0YW5jZW9mIFRleHQpOwotICAgICAgICAKLSAgICAgICAgLyogCi0gICAgICAgIGNoaWxkLnJlbW92ZUNoaWxkKHRleHROb2RlKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydEZhbHNlKGNoaWxkLmdldENoaWxkRWxlbWVudHMoKS5oYXNOZXh0KCkpOwotICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0VHJ1ZShzb2FwQm9keS5nZXRDaGlsZEVsZW1lbnRzKCkuaGFzTmV4dCgpKTsKLSAgICAgICAgCi0gICAgICAgIHNvYXBCb2R5LnJlbW92ZUNoaWxkKGNoaWxkKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydEZhbHNlKHNvYXBCb2R5LmdldENoaWxkRWxlbWVudHMoKS5oYXNOZXh0KCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhYWovdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NhYWovU09BUEVudmVsb3BlVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvc2Fhai90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2Fhai9TT0FQRW52ZWxvcGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1YTk0MTEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2Fhai90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2Fhai9TT0FQRW52ZWxvcGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2ODkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNhYWo7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5EZXRhaWw7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuRGV0YWlsRW50cnk7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuTWVzc2FnZUZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuTWltZUhlYWRlcnM7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuTmFtZTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5Ob2RlOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBCb2R5OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBCb2R5RWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQQ29uc3RhbnRzOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBFbGVtZW50OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBFbnZlbG9wZTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBGYXVsdDsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQSGVhZGVyOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBIZWFkZXJFbGVtZW50OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBNZXNzYWdlOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBQYXJ0OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlRleHQ7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5SZXN1bHQ7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLmRvbS5ET01SZXN1bHQ7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5kb20uRE9NU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc2F4LlNBWFNvdXJjZTsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkNvbW1lbnQ7ICAKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOyAKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgU09BUEVudmVsb3BlVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfU1RSSU5HID0KLSAgICAgICAgICAgICI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz5cbiIgKwotICAgICAgICAgICAgICAgICAgICAiPHNvYXBlbnY6RW52ZWxvcGUgeG1sbnM6c29hcGVudj1cImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvXCJcbiIgKwotICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgIHhtbG5zOnhzZD1cImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hXCJcbiIgKwotICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgIHhtbG5zOnhzaT1cImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlXCI+XG4iICsKLSAgICAgICAgICAgICAgICAgICAgIiA8c29hcGVudjpIZWFkZXI+XG4iICsKLSAgICAgICAgICAgICAgICAgICAgIiAgPHNodzpIZWxsbyB4bWxuczpzaHc9XCJodHRwOi8vd3d3Lmpjb21tZXJjZS5uZXQvc29hcC9ucy9TT0FQSGVsbG9Xb3JsZFwiPlxuIiArCi0gICAgICAgICAgICAgICAgICAgICIgICAgPHNodzpNeW5hbWU+VG9ueTwvc2h3Ok15bmFtZT5cbiIgKwotICAgICAgICAgICAgICAgICAgICAiICA8L3NodzpIZWxsbz5cbiIgKwotICAgICAgICAgICAgICAgICAgICAiIDwvc29hcGVudjpIZWFkZXI+XG4iICsKLSAgICAgICAgICAgICAgICAgICAgIiA8c29hcGVudjpCb2R5PlxuIiArCi0gICAgICAgICAgICAgICAgICAgICI8c2h3OkFkZHJlc3Mgc2h3OnQ9J3Rlc3QnIHhtbG5zOnNodz1cImh0dHA6Ly93d3cuamNvbW1lcmNlLm5ldC9zb2FwL25zL1NPQVBIZWxsb1dvcmxkXCI+XG4iICsKLSAgICAgICAgICAgICAgICAgICAgIjxzaHc6Q2l0eT5HRU5UPC9zaHc6Q2l0eT5cbiIgKwotICAgICAgICAgICAgICAgICAgICAiPC9zaHc6QWRkcmVzcz5cbiIgKwotICAgICAgICAgICAgICAgICAgICAiPC9zb2FwZW52OkJvZHk+XG4iICsKLSAgICAgICAgICAgICAgICAgICAgIjwvc29hcGVudjpFbnZlbG9wZT4iOwotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfSU5QVVRfMSA9ICI8cm9vdD48YT48IS0tIHRoaXMgaXMgYSB0ZXN0IHdpdGggYSBjb21tZW50IG5vZGUgLS0+PC9hPjwvcm9vdD4iOwotCi0gICAgcHVibGljIFNPQVBFbnZlbG9wZVRlc3QoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEVudmVsb3BlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE1lc3NhZ2VGYWN0b3J5IG1mID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgU09BUE1lc3NhZ2Ugc21zZyA9Ci0gICAgICAgICAgICAgICAgbWYuY3JlYXRlTWVzc2FnZShuZXcgTWltZUhlYWRlcnMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShYTUxfU1RSSU5HLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgU09BUFBhcnQgc3AgPSBzbXNnLmdldFNPQVBQYXJ0KCk7Ci0gICAgICAgIFNPQVBFbnZlbG9wZSBzZSA9IHNwLmdldEVudmVsb3BlKCk7Ci0gICAgICAgIGFzc2VydFRydWUoc2UgIT0gbnVsbCk7Ci0KLSAgICAgICAgLy8gdmFsaWRhdGUgdGhlIGJvZHkKLSAgICAgICAgZmluYWwgU09BUEJvZHkgYm9keSA9IHNwLmdldEVudmVsb3BlKCkuZ2V0Qm9keSgpOwotICAgICAgICB2YWxpZGF0ZUJvZHkoYm9keS5nZXRDaGlsZEVsZW1lbnRzKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3REZXRhY2hIZWFkZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgTWVzc2FnZUZhY3RvcnkgbWYgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICBTT0FQTWVzc2FnZSBzbXNnID0KLSAgICAgICAgICAgICAgICBtZi5jcmVhdGVNZXNzYWdlKG5ldyBNaW1lSGVhZGVycygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKFhNTF9TVFJJTkcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICBTT0FQUGFydCBzcCA9IHNtc2cuZ2V0U09BUFBhcnQoKTsKLSAgICAgICAgU09BUEVudmVsb3BlIHNlID0gc3AuZ2V0RW52ZWxvcGUoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShzZSAhPSBudWxsKTsKLSAgICAgICAgU09BUEhlYWRlciBoZWFkZXIgPSBzZS5nZXRIZWFkZXIoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChoZWFkZXIpOwotICAgICAgICBoZWFkZXIuZGV0YWNoTm9kZSgpOwotICAgICAgICBhc3NlcnROdWxsKHNlLmdldEhlYWRlcigpKTsKLSAgICAgICAgYXNzZXJ0TnVsbChzbXNnLmdldFNPQVBIZWFkZXIoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdERldGFjaEJvZHkoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBNZXNzYWdlRmFjdG9yeSBtZiA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICBTT0FQTWVzc2FnZSBzbXNnID0KLSAgICAgICAgICAgICAgICAgICAgbWYuY3JlYXRlTWVzc2FnZShuZXcgTWltZUhlYWRlcnMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oWE1MX1NUUklORy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICBTT0FQUGFydCBzcCA9IHNtc2cuZ2V0U09BUFBhcnQoKTsKLSAgICAgICAgICAgIFNPQVBFbnZlbG9wZSBzZSA9IHNwLmdldEVudmVsb3BlKCk7Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgc2UuYWRkQm9keSgpOwotICAgICAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIEV4Y2VwdGlvbiBkaWQgbm90IG9jY3VyIik7Ci0gICAgICAgICAgICB9IGNhdGNoIChTT0FQRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKHRydWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzZS5nZXRCb2R5KCkuZGV0YWNoTm9kZSgpOwotICAgICAgICAgICAgYXNzZXJ0TnVsbChzZS5nZXRCb2R5KCkpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBzZS5hZGRCb2R5KCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChTT0FQRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgRXhjZXB0aW9uIG9jY3VycmVkLiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgRXhjZXB0aW9uIDogIiArIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEVudmVsb3BlMigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBNZXNzYWdlRmFjdG9yeSBtZiA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIGZpbmFsIEJ5dGVBcnJheUlucHV0U3RyZWFtIGJhSVMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oWE1MX1NUUklORy5nZXRCeXRlcygpKTsKLSAgICAgICAgZmluYWwgTWltZUhlYWRlcnMgbWltZWhlYWRlcnMgPSBuZXcgTWltZUhlYWRlcnMoKTsKLSAgICAgICAgbWltZWhlYWRlcnMuYWRkSGVhZGVyKCJDb250ZW50LVR5cGUiLCAidGV4dC94bWwiKTsKLSAgICAgICAgU09BUE1lc3NhZ2Ugc21zZyA9Ci0gICAgICAgICAgICAgICAgbWYuY3JlYXRlTWVzc2FnZShtaW1laGVhZGVycywgYmFJUyk7Ci0KLSAgICAgICAgU09BUEVudmVsb3BlIGVudmVsb3BlID0gc21zZy5nZXRTT0FQUGFydCgpLmdldEVudmVsb3BlKCk7Ci0gICAgICAgIFNPQVBCb2R5IGJvZHkgPSBlbnZlbG9wZS5nZXRCb2R5KCk7Ci0gICAgICAgIGFzc2VydFRydWUoYm9keSAhPSBudWxsKTsKLSAgICB9Ci0KLSAgICAvLyBUT0RPOiBUaGlzIHRlc3QgZmFpbHMgZHVlIHRvIHNvbWUgaXNzdWVzIGluIE9NLiBOZWVkcyB0byBiZSBhZGRlZCB0byB0aGUgdGVzdCBzdWl0ZQotICAgIC8vICAgdGhhdCBpc3N1ZSBpcyBmaXhlZAotICAgIHB1YmxpYyB2b2lkIF90ZXN0RW52ZWxvcGVXaXRoTGVhZGluZ0NvbW1lbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHNvYXBNZXNzYWdlV2l0aExlYWRpbmdDb21tZW50ID0KLSAgICAgICAgICAgICAgICAiPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICI8IS0tIENvbW1lbnQgLS0+IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiPGVudjpFbnZlbG9wZSB4bWxuczplbnY9J2h0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvJz4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICI8ZW52OkJvZHk+PGVjaG8+PGFyZzA+SGVsbG88L2FyZzA+PC9lY2hvPjwvZW52OkJvZHk+IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiPC9lbnY6RW52ZWxvcGU+IjsKLQotICAgICAgICBNZXNzYWdlRmFjdG9yeSBmYWN0b3J5ID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgU09BUE1lc3NhZ2UgbWVzc2FnZSA9Ci0gICAgICAgICAgICAgICAgZmFjdG9yeS5jcmVhdGVNZXNzYWdlKG5ldyBNaW1lSGVhZGVycygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29hcE1lc3NhZ2VXaXRoTGVhZGluZ0NvbW1lbnQuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICBTT0FQUGFydCBwYXJ0ID0gbWVzc2FnZS5nZXRTT0FQUGFydCgpOwotICAgICAgICBTT0FQRW52ZWxvcGUgZW52ZWxvcGUgPSBwYXJ0LmdldEVudmVsb3BlKCk7Ci0gICAgICAgIG1lc3NhZ2Uud3JpdGVUbyhTeXN0ZW0ub3V0KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShlbnZlbG9wZSAhPSBudWxsKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShlbnZlbG9wZS5nZXRCb2R5KCkgIT0gbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEVudmVsb3BlV2l0aENvbW1lbnRJbkVudmVsb3BlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgU3RyaW5nIHNvYXBNZXNzYWdlV2l0aExlYWRpbmdDb21tZW50ID0KLSAgICAgICAgICAgICAgICAiPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz5cbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIjxzb2FwZW52OkVudmVsb3BlICB4bWxucz0naHR0cDovL3NvbWV3aGVyZS5jb20vaHRtbCdcbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICB4bWxuczpzb2FwZW52PSdodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLydcbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICB4bWxuczp4c2Q9J2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hJ1xuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgIHhtbG5zOnhzaT0naHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UnPlxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiPCEtLSBDb21tZW50IC0tPiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIiA8c29hcGVudjpCb2R5PlxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiICAgIDxlY2hvPjxhcmcwPkhlbGxvPC9hcmcwPjwvZWNobz4iICsKLS8vICAgICAgICAgICAgICAgICIgICAgPHQ6ZWNobyB4bWxuczp0PSdodHRwOi8vdGVzdC5vcmcvVGVzdCc+PHQ6YXJnMD5IZWxsbzwvdDphcmcwPjwvdDplY2hvPiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIiA8L3NvYXBlbnY6Qm9keT5cbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIjwvc29hcGVudjpFbnZlbG9wZT4iOwotCi0gICAgICAgIE1lc3NhZ2VGYWN0b3J5IGZhY3RvcnkgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICBTT0FQTWVzc2FnZSBtZXNzYWdlID0KLSAgICAgICAgICAgICAgICBmYWN0b3J5LmNyZWF0ZU1lc3NhZ2UobmV3IE1pbWVIZWFkZXJzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2FwTWVzc2FnZVdpdGhMZWFkaW5nQ29tbWVudC5nZXRCeXRlcygpKSk7Ci0gICAgICAgIFNPQVBQYXJ0IHBhcnQgPSBtZXNzYWdlLmdldFNPQVBQYXJ0KCk7Ci0gICAgICAgIFNPQVBFbnZlbG9wZSBlbnZlbG9wZSA9IHBhcnQuZ2V0RW52ZWxvcGUoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShlbnZlbG9wZSAhPSBudWxsKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShlbnZlbG9wZS5nZXRCb2R5KCkgIT0gbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEVudmVsb3BlV2l0aENvbW1lbnRJbkJvZHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICBTdHJpbmcgc29hcE1lc3NhZ2VXaXRoTGVhZGluZ0NvbW1lbnQgPQotICAgICAgICAgICAgICAgICI8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PlxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiPHNvYXBlbnY6RW52ZWxvcGUgeG1sbnM6c29hcGVudj0naHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8nXG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgeG1sbnM6eHNkPSdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSdcbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICB4bWxuczp4c2k9J2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlJz5cbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIiA8c29hcGVudjpCb2R5PlxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiPCEtLSBDb21tZW50IC0tPiIgKwotLy8gICAgICAgICAgICAgICAgIiAgICA8ZWNobz48YXJnMD5IZWxsbzwvYXJnMD48L2VjaG8+IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiICAgIDx0OmVjaG8geG1sbnM6dD0naHR0cDovL3Rlc3Qub3JnL1Rlc3QnPjx0OmFyZzA+SGVsbG88L3Q6YXJnMD48L3Q6ZWNobz4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIgPC9zb2FwZW52OkJvZHk+XG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICI8L3NvYXBlbnY6RW52ZWxvcGU+IjsKLQotICAgICAgICBNZXNzYWdlRmFjdG9yeSBmYWN0b3J5ID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgU09BUE1lc3NhZ2UgbWVzc2FnZSA9Ci0gICAgICAgICAgICAgICAgZmFjdG9yeS5jcmVhdGVNZXNzYWdlKG5ldyBNaW1lSGVhZGVycygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29hcE1lc3NhZ2VXaXRoTGVhZGluZ0NvbW1lbnQuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICBTT0FQUGFydCBwYXJ0ID0gbWVzc2FnZS5nZXRTT0FQUGFydCgpOwotICAgICAgICBTT0FQRW52ZWxvcGUgZW52ZWxvcGUgPSBwYXJ0LmdldEVudmVsb3BlKCk7Ci0gICAgICAgIGFzc2VydFRydWUoZW52ZWxvcGUgIT0gbnVsbCk7Ci0gICAgICAgIGFzc2VydFRydWUoZW52ZWxvcGUuZ2V0Qm9keSgpICE9IG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFbnZlbG9wZVdpdGhDb21tZW50cygpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIFN0cmluZyBzb2FwTWVzc2FnZVdpdGhMZWFkaW5nQ29tbWVudCA9Ci0gICAgICAgICAgICAgICAgIjw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+XG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICI8c29hcGVudjpFbnZlbG9wZSB4bWxuczpzb2FwZW52PSdodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLydcbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICB4bWxuczp4c2Q9J2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hJ1xuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgIHhtbG5zOnhzaT0naHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UnPlxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiIDxzb2FwZW52OkhlYWRlcj5cbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIjwhLS0gQ29tbWVudCAtLT4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIgIDxzaHc6SGVsbG8geG1sbnM6c2h3PVwiaHR0cDovL3d3dy5qY29tbWVyY2UubmV0L3NvYXAvbnMvU09BUEhlbGxvV29ybGRcIj5cbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIjwhLS0gQ29tbWVudCAtLT4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIgICAgPHNodzpNeW5hbWU+PCEtLSBDb21tZW50IC0tPlRvbnk8L3NodzpNeW5hbWU+XG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIgIDwvc2h3OkhlbGxvPlxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiIDwvc29hcGVudjpIZWFkZXI+XG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIgPHNvYXBlbnY6Qm9keT5cbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIjwhLS0gQ29tbWVudCAtLT4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIgICAgPHQ6ZWNobyB4bWxuczp0PSdodHRwOi8vdGVzdC5vcmcvVGVzdCc+PHQ6YXJnMD5IZWxsbzwvdDphcmcwPjwvdDplY2hvPiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIiA8L3NvYXBlbnY6Qm9keT5cbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIjwvc29hcGVudjpFbnZlbG9wZT4iOwotCi0gICAgICAgIE1lc3NhZ2VGYWN0b3J5IGZhY3RvcnkgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICBTT0FQTWVzc2FnZSBtZXNzYWdlID0KLSAgICAgICAgICAgICAgICBmYWN0b3J5LmNyZWF0ZU1lc3NhZ2UobmV3IE1pbWVIZWFkZXJzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2FwTWVzc2FnZVdpdGhMZWFkaW5nQ29tbWVudC5nZXRCeXRlcygpKSk7Ci0gICAgICAgIFNPQVBQYXJ0IHBhcnQgPSBtZXNzYWdlLmdldFNPQVBQYXJ0KCk7Ci0gICAgICAgIFNPQVBFbnZlbG9wZSBlbnZlbG9wZSA9IHBhcnQuZ2V0RW52ZWxvcGUoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShlbnZlbG9wZSAhPSBudWxsKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShlbnZlbG9wZS5nZXRCb2R5KCkgIT0gbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgX3Rlc3RGYXVsdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU09BUEVudmVsb3BlIGVudmVsb3BlID0gZ2V0U09BUEVudmVsb3BlKCk7Ci0gICAgICAgIFNPQVBCb2R5IGJvZHkgPSBlbnZlbG9wZS5nZXRCb2R5KCk7Ci0KLSAgICAgICAgYXNzZXJ0RmFsc2UoYm9keS5oYXNGYXVsdCgpKTsKLSAgICAgICAgU09BUEZhdWx0IHNvYXBGYXVsdCA9IGJvZHkuYWRkRmF1bHQoKTsKLSAgICAgICAgc29hcEZhdWx0LnNldEZhdWx0U3RyaW5nKCJteUZhdWx0Iik7Ci0gICAgICAgIHNvYXBGYXVsdC5zZXRGYXVsdENvZGUoIkNPREUiKTsKLQotICAgICAgICBhc3NlcnRUcnVlKGJvZHkuaGFzRmF1bHQoKSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoYm9keS5nZXRGYXVsdCgpKTsKLSAgICAgICAgYXNzZXJ0U2FtZShzb2FwRmF1bHQsIGJvZHkuZ2V0RmF1bHQoKSk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJteUZhdWx0Iiwgc29hcEZhdWx0LmdldEZhdWx0U3RyaW5nKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkNPREUiLCBzb2FwRmF1bHQuZ2V0RmF1bHRDb2RlKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIF90ZXN0RmF1bHRzMigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTT0FQRW52ZWxvcGUgZW52ZWxvcGUgPSBnZXRTT0FQRW52ZWxvcGUoKTsKLSAgICAgICAgU09BUEJvZHkgYm9keSA9IGVudmVsb3BlLmdldEJvZHkoKTsKLSAgICAgICAgU09BUEZhdWx0IGZhdWx0ID0gYm9keS5hZGRGYXVsdCgpOwotCi0gICAgICAgIGFzc2VydFRydWUoYm9keS5nZXRGYXVsdCgpICE9IG51bGwpOwotCi0gICAgICAgIERldGFpbCBkMSA9IGZhdWx0LmFkZERldGFpbCgpOwotICAgICAgICBOYW1lIG5hbWUgPSBlbnZlbG9wZS5jcmVhdGVOYW1lKCJHZXRMYXN0VHJhZGVQcmljZSIsICJXT01CQVQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vd3d3LndvbWJhdC5vcmcvdHJhZGVyIik7Ci0gICAgICAgIGQxLmFkZERldGFpbEVudHJ5KG5hbWUpOwotCi0gICAgICAgIERldGFpbCBkMiA9IGZhdWx0LmdldERldGFpbCgpOwotICAgICAgICBhc3NlcnRUcnVlKGQyICE9IG51bGwpOwotICAgICAgICBJdGVyYXRvciBpID0gZDIuZ2V0RGV0YWlsRW50cmllcygpOwotICAgICAgICBhc3NlcnRUcnVlKGdldEl0ZXJhdG9yQ291bnQoaSkgPT0gMSk7Ci0gICAgICAgIGkgPSBkMi5nZXREZXRhaWxFbnRyaWVzKCk7Ci0gICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkgewotICAgICAgICAgICAgRGV0YWlsRW50cnkgZGUgPSAoRGV0YWlsRW50cnkpaS5uZXh0KCk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoZGUuZ2V0RWxlbWVudE5hbWUoKSwgbmFtZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SGVhZGVyRWxlbWVudHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU09BUEVudmVsb3BlIGVudmVsb3BlID0gZ2V0U09BUEVudmVsb3BlKCk7Ci0gICAgICAgIFNPQVBIZWFkZXIgaGVhZGVyID0gZW52ZWxvcGUuZ2V0SGVhZGVyKCk7Ci0KLSAgICAgICAgU09BUEhlYWRlckVsZW1lbnQgaGVhZGVyRWxlID0gaGVhZGVyLmFkZEhlYWRlckVsZW1lbnQoZW52ZWxvcGUuY3JlYXRlTmFtZSgiZm9vMSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYxIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9vMS1VUkkiKSk7Ci0gICAgICAgIGhlYWRlckVsZS5zZXRBY3RvcigiYWN0b3ItVVJJIik7Ci0gICAgICAgIGhlYWRlckVsZS5zZXRNdXN0VW5kZXJzdGFuZCh0cnVlKTsKLQotICAgICAgICBJdGVyYXRvciBpdGVyYXRvciA9IGhlYWRlci5leHRyYWN0SGVhZGVyRWxlbWVudHMoImFjdG9yLVVSSSIpOwotICAgICAgICBpbnQgY250ID0gMDsKLSAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgY250Kys7Ci0gICAgICAgICAgICBTT0FQSGVhZGVyRWxlbWVudCByZXN1bHRIZWFkZXJFbGUgPSAoU09BUEhlYWRlckVsZW1lbnQpaXRlcmF0b3IubmV4dCgpOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoaGVhZGVyRWxlLmdldEFjdG9yKCksIHJlc3VsdEhlYWRlckVsZS5nZXRBY3RvcigpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHRIZWFkZXJFbGUuZ2V0TXVzdFVuZGVyc3RhbmQoKSwgaGVhZGVyRWxlLmdldE11c3RVbmRlcnN0YW5kKCkpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoY250ID09IDEpOwotICAgICAgICBpdGVyYXRvciA9IGhlYWRlci5leHRyYWN0SGVhZGVyRWxlbWVudHMoImFjdG9yLVVSSSIpOwotICAgICAgICBhc3NlcnRUcnVlKCFpdGVyYXRvci5oYXNOZXh0KCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RUZXh0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFNPQVBFbnZlbG9wZSBlbnZlbG9wZSA9IGdldFNPQVBFbnZlbG9wZSgpOwotICAgICAgICBTT0FQQm9keSBib2R5ID0gZW52ZWxvcGUuZ2V0Qm9keSgpOwotICAgICAgICBJdGVyYXRvciBpU3RhcnQgPSBib2R5LmdldENoaWxkRWxlbWVudHMoKTsKLSAgICAgICAgaW50IGNvdW50U3RhcnQgPSBnZXRJdGVyYXRvckNvdW50KGlTdGFydCk7Ci0KLSAgICAgICAgZmluYWwgU3RyaW5nIGJvZHlUZXh0ID0gIlRoaXMgaXMgdGhlIGJvZHkgdGV4dCI7Ci0KLSAgICAgICAgU09BUEVsZW1lbnQgc2UgPSBib2R5LmFkZENoaWxkRWxlbWVudCgiQ2hpbGQiKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShzZSAhPSBudWxsKTsKLSAgICAgICAgU09BUEVsZW1lbnQgc29hcEVsZW1lbnQgPSBzZS5hZGRUZXh0Tm9kZShib2R5VGV4dCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhib2R5VGV4dCwgc29hcEVsZW1lbnQuZ2V0VmFsdWUoKSk7Ci0KLSAgICAgICAgSXRlcmF0b3IgaSA9IGJvZHkuZ2V0Q2hpbGRFbGVtZW50cygpOwotICAgICAgICBpbnQgY291bnQgPSBnZXRJdGVyYXRvckNvdW50KGkpOwotICAgICAgICBhc3NlcnRUcnVlKGNvdW50ID09IGNvdW50U3RhcnQgKyAxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9uQ29tbWVudFRleHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU09BUEVudmVsb3BlIGVudmVsb3BlID0gZ2V0U09BUEVudmVsb3BlKCk7Ci0gICAgICAgIFNPQVBCb2R5IGJvZHkgPSBlbnZlbG9wZS5nZXRCb2R5KCk7Ci0gICAgICAgIFNPQVBFbGVtZW50IHNlID0gYm9keS5hZGRDaGlsZEVsZW1lbnQoIkNoaWxkIik7Ci0gICAgICAgIHNlLmFkZFRleHROb2RlKCJUaGlzIGlzIHRleHQiKTsKLSAgICAgICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBzZS5nZXRDaGlsZEVsZW1lbnRzKCk7Ci0gICAgICAgIE9iamVjdCBvID0gbnVsbDsKLSAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgbyA9IGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgIGlmIChvIGluc3RhbmNlb2YgVGV4dCkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUobyBpbnN0YW5jZW9mIFRleHQpOwotICAgICAgICBUZXh0IHQgPSAoVGV4dClvOwotICAgICAgICBhc3NlcnRUcnVlKCF0LmlzQ29tbWVudCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tbWVudFRleHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU09BUEVudmVsb3BlIGVudmVsb3BlID0gZ2V0U09BUEVudmVsb3BlKCk7Ci0gICAgICAgIFNPQVBCb2R5IGJvZHkgPSBlbnZlbG9wZS5nZXRCb2R5KCk7Ci0gICAgICAgIFNPQVBFbGVtZW50IHNlID0gYm9keS5hZGRDaGlsZEVsZW1lbnQoIkNoaWxkIik7Ci0gICAgICAgIHNlLmFkZFRleHROb2RlKCI8IS0tIFRoaXMgaXMgYSBjb21tZW50IC0tPiIpOwotICAgICAgICBJdGVyYXRvciBpdGVyYXRvciA9IHNlLmdldENoaWxkRWxlbWVudHMoKTsKLSAgICAgICAgTm9kZSBuID0gbnVsbDsKLSAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgbiA9IChOb2RlKWl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgIGlmIChuIGluc3RhbmNlb2YgVGV4dCkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUobiBpbnN0YW5jZW9mIFRleHQpOwotICAgICAgICBUZXh0IHQgPSAoVGV4dCluOwotICAgICAgICBhc3NlcnRUcnVlKHQuaXNDb21tZW50KCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFNPQVBFbnZlbG9wZSBlbnZlbG9wZSA9IGdldFNPQVBFbnZlbG9wZSgpOwotICAgICAgICBTT0FQQm9keSBib2R5ID0gZW52ZWxvcGUuZ2V0Qm9keSgpOwotCi0gICAgICAgIE5hbWUgbmFtZTEgPSBlbnZlbG9wZS5jcmVhdGVOYW1lKCJNeUF0dHIxIik7Ci0gICAgICAgIFN0cmluZyB2YWx1ZTEgPSAiTXlWYWx1ZTEiOwotCi0gICAgICAgIE5hbWUgbmFtZTIgPSBlbnZlbG9wZS5jcmVhdGVOYW1lKCJNeUF0dHIyIik7Ci0gICAgICAgIFN0cmluZyB2YWx1ZTIgPSAiTXlWYWx1ZTIiOwotCi0gICAgICAgIE5hbWUgbmFtZTMgPSBlbnZlbG9wZS5jcmVhdGVOYW1lKCJNeUF0dHIzIik7Ci0gICAgICAgIFN0cmluZyB2YWx1ZTMgPSAiTXlWYWx1ZTMiOwotCi0gICAgICAgIGJvZHkuYWRkQXR0cmlidXRlKG5hbWUxLCB2YWx1ZTEpOwotICAgICAgICBib2R5LmFkZEF0dHJpYnV0ZShuYW1lMiwgdmFsdWUyKTsKLSAgICAgICAgYm9keS5hZGRBdHRyaWJ1dGUobmFtZTMsIHZhbHVlMyk7Ci0KLSAgICAgICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBib2R5LmdldEFsbEF0dHJpYnV0ZXMoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShnZXRJdGVyYXRvckNvdW50KGl0ZXJhdG9yKSA9PSAzKTsKLSAgICAgICAgaXRlcmF0b3IgPSBib2R5LmdldEFsbEF0dHJpYnV0ZXMoKTsKLQotICAgICAgICBib29sZWFuIGZvdW5kTmFtZTEgPSBmYWxzZTsKLSAgICAgICAgYm9vbGVhbiBmb3VuZE5hbWUyID0gZmFsc2U7Ci0gICAgICAgIGJvb2xlYW4gZm91bmROYW1lMyA9IGZhbHNlOwotICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBOYW1lIG5hbWUgPSAoTmFtZSlpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAobmFtZS5lcXVhbHMobmFtZTEpKSB7Ci0gICAgICAgICAgICAgICAgZm91bmROYW1lMSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbHVlMSwgYm9keS5nZXRBdHRyaWJ1dGVWYWx1ZShuYW1lKSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKG5hbWUyKSkgewotICAgICAgICAgICAgICAgIGZvdW5kTmFtZTIgPSB0cnVlOwotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyh2YWx1ZTIsIGJvZHkuZ2V0QXR0cmlidXRlVmFsdWUobmFtZSkpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFscyhuYW1lMykpIHsKLSAgICAgICAgICAgICAgICBmb3VuZE5hbWUzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHModmFsdWUzLCBib2R5LmdldEF0dHJpYnV0ZVZhbHVlKG5hbWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBhc3NlcnRUcnVlKGZvdW5kTmFtZTEgJiYgZm91bmROYW1lMiAmJiBmb3VuZE5hbWUzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXR0cmlidXRlczIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU09BUEVudmVsb3BlIGVudmVsb3BlID0gZ2V0U09BUEVudmVsb3BlKCk7Ci0gICAgICAgIFNPQVBCb2R5IGJvZHkgPSBlbnZlbG9wZS5nZXRCb2R5KCk7Ci0KLSAgICAgICAgTmFtZSBuYW1lMSA9IGVudmVsb3BlLmNyZWF0ZU5hbWUoIk15QXR0cjEiLCAiYXR0IiwgImh0dHA6Ly90ZXN0LmNvbS9BdHRyIik7Ci0gICAgICAgIFN0cmluZyB2YWx1ZTEgPSAiTXlWYWx1ZTEiOwotCi0gICAgICAgIE5hbWUgbmFtZTIgPSBlbnZlbG9wZS5jcmVhdGVOYW1lKCJNeUF0dHIyIik7Ci0gICAgICAgIFN0cmluZyB2YWx1ZTIgPSAiTXlWYWx1ZTIiOwotCi0gICAgICAgIE5hbWUgbmFtZTMgPSBlbnZlbG9wZS5jcmVhdGVOYW1lKCJNeUF0dHIzIik7Ci0gICAgICAgIFN0cmluZyB2YWx1ZTMgPSAiTXlWYWx1ZTMiOwotCi0gICAgICAgIGJvZHkuYWRkQXR0cmlidXRlKG5hbWUxLCB2YWx1ZTEpOwotICAgICAgICBib2R5LmFkZEF0dHJpYnV0ZShuYW1lMiwgdmFsdWUyKTsKLSAgICAgICAgYm9keS5hZGRBdHRyaWJ1dGUobmFtZTMsIHZhbHVlMyk7Ci0KLSAgICAgICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBib2R5LmdldEFsbEF0dHJpYnV0ZXMoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShnZXRJdGVyYXRvckNvdW50KGl0ZXJhdG9yKSA9PSAzKTsKLSAgICAgICAgaXRlcmF0b3IgPSBib2R5LmdldEFsbEF0dHJpYnV0ZXMoKTsKLQotICAgICAgICBib29sZWFuIGZvdW5kTmFtZTEgPSBmYWxzZTsKLSAgICAgICAgYm9vbGVhbiBmb3VuZE5hbWUyID0gZmFsc2U7Ci0gICAgICAgIGJvb2xlYW4gZm91bmROYW1lMyA9IGZhbHNlOwotICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBOYW1lIG5hbWUgPSAoTmFtZSlpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAobmFtZS5lcXVhbHMobmFtZTEpKSB7Ci0gICAgICAgICAgICAgICAgZm91bmROYW1lMSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbHVlMSwgYm9keS5nZXRBdHRyaWJ1dGVWYWx1ZShuYW1lKSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKG5hbWUyKSkgewotICAgICAgICAgICAgICAgIGZvdW5kTmFtZTIgPSB0cnVlOwotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyh2YWx1ZTIsIGJvZHkuZ2V0QXR0cmlidXRlVmFsdWUobmFtZSkpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFscyhuYW1lMykpIHsKLSAgICAgICAgICAgICAgICBmb3VuZE5hbWUzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHModmFsdWUzLCBib2R5LmdldEF0dHJpYnV0ZVZhbHVlKG5hbWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBhc3NlcnRUcnVlKGZvdW5kTmFtZTEgJiYgZm91bmROYW1lMiAmJiBmb3VuZE5hbWUzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXR0cmlidXRlczMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU09BUEVudmVsb3BlIGVudmVsb3BlID0gZ2V0U09BUEVudmVsb3BlKCk7Ci0gICAgICAgIFNPQVBCb2R5IGJvZHkgPSBlbnZlbG9wZS5nZXRCb2R5KCk7Ci0KLSAgICAgICAgTmFtZSBuYW1lMSA9IGVudmVsb3BlLmNyZWF0ZU5hbWUoIk15QXR0cjEiLCAiYXR0IiwgImh0dHA6Ly90ZXN0LmNvbS9BdHRyIik7Ci0gICAgICAgIFN0cmluZyB2YWx1ZTEgPSAiTXlWYWx1ZTEiOwotCi0gICAgICAgIE5hbWUgbmFtZTIgPSBlbnZlbG9wZS5jcmVhdGVOYW1lKCJNeUF0dHIyIiwgImF0dCIsICJodHRwOi8vdGVzdC5jb20vQXR0ciIpOwotICAgICAgICBTdHJpbmcgdmFsdWUyID0gIk15VmFsdWUyIjsKLQotICAgICAgICBOYW1lIG5hbWUzID0gZW52ZWxvcGUuY3JlYXRlTmFtZSgiTXlBdHRyMyIsICJhdHQiLCAiaHR0cDovL3Rlc3QuY29tL0F0dHIiKTsKLSAgICAgICAgU3RyaW5nIHZhbHVlMyA9ICJNeVZhbHVlMyI7Ci0KLSAgICAgICAgYm9keS5hZGRBdHRyaWJ1dGUobmFtZTEsIHZhbHVlMSk7Ci0gICAgICAgIGJvZHkuYWRkQXR0cmlidXRlKG5hbWUyLCB2YWx1ZTIpOwotICAgICAgICBib2R5LmFkZEF0dHJpYnV0ZShuYW1lMywgdmFsdWUzKTsKLQotICAgICAgICBJdGVyYXRvciBpdGVyYXRvciA9IGJvZHkuZ2V0QWxsQXR0cmlidXRlcygpOwotICAgICAgICBhc3NlcnRUcnVlKGdldEl0ZXJhdG9yQ291bnQoaXRlcmF0b3IpID09IDMpOwotICAgICAgICBpdGVyYXRvciA9IGJvZHkuZ2V0QWxsQXR0cmlidXRlcygpOwotCi0gICAgICAgIGJvb2xlYW4gZm91bmROYW1lMSA9IGZhbHNlOwotICAgICAgICBib29sZWFuIGZvdW5kTmFtZTIgPSBmYWxzZTsKLSAgICAgICAgYm9vbGVhbiBmb3VuZE5hbWUzID0gZmFsc2U7Ci0gICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIE5hbWUgbmFtZSA9IChOYW1lKWl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgIGlmIChuYW1lLmVxdWFscyhuYW1lMSkpIHsKLSAgICAgICAgICAgICAgICBmb3VuZE5hbWUxID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHModmFsdWUxLCBib2R5LmdldEF0dHJpYnV0ZVZhbHVlKG5hbWUpKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHMobmFtZTIpKSB7Ci0gICAgICAgICAgICAgICAgZm91bmROYW1lMiA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbHVlMiwgYm9keS5nZXRBdHRyaWJ1dGVWYWx1ZShuYW1lKSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKG5hbWUzKSkgewotICAgICAgICAgICAgICAgIGZvdW5kTmFtZTMgPSB0cnVlOwotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyh2YWx1ZTMsIGJvZHkuZ2V0QXR0cmlidXRlVmFsdWUobmFtZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoZm91bmROYW1lMSAmJiBmb3VuZE5hbWUyICYmIGZvdW5kTmFtZTMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRIZWFkZXIoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTT0FQRW52ZWxvcGUgZW52ZWxvcGUgPSBnZXRTT0FQRW52ZWxvcGUoKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgZW52ZWxvcGUuYWRkSGVhZGVyKCk7Ci0gICAgICAgICAgICAgICAgZmFpbCgiRGlkIG5vdCBnZXQgZXhwZWN0ZWQgU09BUEV4Y2VwdGlvbiIpOwotICAgICAgICAgICAgfSBjYXRjaCAoU09BUEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiR290IGV4cGVjdGVkIFNPQVBFeGNlcHRpb24iLCB0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVudmVsb3BlLmdldEhlYWRlcigpLmRldGFjaE5vZGUoKTsKLSAgICAgICAgICAgIGFzc2VydE51bGwoZW52ZWxvcGUuZ2V0SGVhZGVyKCkpOwotICAgICAgICAgICAgU09BUEhlYWRlciBteWhkcjsKLQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBteWhkciA9IGVudmVsb3BlLmFkZEhlYWRlcigpOwotICAgICAgICAgICAgICAgIGFzc2VydE5vdE51bGwoIlNPQVBIZWFkZXIgcmV0dXJuIHZhbHVlIGlzIG51bGwiLCBteWhkcik7Ci0gICAgICAgICAgICB9IGNhdGNoIChTT0FQRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIFNPQVBFeGNlcHRpb24gOiAiICsgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBFeGNlcHRpb24gOiAiICsgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFNPQVBFbnZlbG9wZSBnZXRTT0FQRW52ZWxvcGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgTWVzc2FnZUZhY3RvcnkgZmFjdG9yeSA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIFNPQVBNZXNzYWdlIG1lc3NhZ2UgPSBmYWN0b3J5LmNyZWF0ZU1lc3NhZ2UoKTsKLSAgICAgICAgcmV0dXJuIG1lc3NhZ2UuZ2V0U09BUFBhcnQoKS5nZXRFbnZlbG9wZSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgaW50IGdldEl0ZXJhdG9yQ291bnQoamF2YS51dGlsLkl0ZXJhdG9yIGkpIHsKLSAgICAgICAgaW50IGNvdW50ID0gMDsKLSAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBjb3VudCsrOwotICAgICAgICAgICAgaS5uZXh0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNvdW50OwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZUJvZHkoSXRlcmF0b3IgaXRlcikgewotICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIGZpbmFsIE9iamVjdCBvYmogPSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBUZXh0KSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGRhdGEgPSAoKFRleHQpb2JqKS5nZXREYXRhKCk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiXG4iLmVxdWFscyhkYXRhKSB8fCAiR0VOVCIuZXF1YWxzKGRhdGEpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgU09BUEVsZW1lbnQgc29hcEVsZW1lbnQgPSAoU09BUEVsZW1lbnQpb2JqOwotICAgICAgICAgICAgICAgIGZpbmFsIEl0ZXJhdG9yIGF0dEl0ZXIgPSBzb2FwRWxlbWVudC5nZXRBbGxBdHRyaWJ1dGVzKCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGF0dEl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCBvID0gYXR0SXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygidGVzdCIsIHNvYXBFbGVtZW50LmdldEF0dHJpYnV0ZVZhbHVlKChOYW1lKW8pKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBmaW5hbCBJdGVyYXRvciBjaGlsZEVsZW1lbnRJdGVyID0gc29hcEVsZW1lbnQuZ2V0Q2hpbGRFbGVtZW50cygpOwotICAgICAgICAgICAgICAgIGlmIChjaGlsZEVsZW1lbnRJdGVyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB2YWxpZGF0ZUJvZHkoY2hpbGRFbGVtZW50SXRlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0RW5jb2RpbmdTdHlsZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTT0FQRW52ZWxvcGUgZW52ZWxvcGUgPSBnZXRTT0FQRW52ZWxvcGUoKTsKLSAgICAgICAgZW52ZWxvcGUuc2V0RW5jb2RpbmdTdHlsZSgiaHR0cDovL2V4YW1wbGUuY29tL015RW5jb2RpbmdzIik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZW52ZWxvcGUuZ2V0RW5jb2RpbmdTdHlsZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJodHRwOi8vZXhhbXBsZS5jb20vTXlFbmNvZGluZ3MiLGVudmVsb3BlLmdldEVuY29kaW5nU3R5bGUoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEVsZW1lbnRBZnRlckJvZHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgTWVzc2FnZUZhY3RvcnkgZmFjdG9yeSA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKFNPQVBDb25zdGFudHMuU09BUF8xXzJfUFJPVE9DT0wpOwotICAgICAgICBTT0FQTWVzc2FnZSBtZXNzYWdlID0gZmFjdG9yeS5jcmVhdGVNZXNzYWdlKCk7Ci0gICAgICAgIFNPQVBFbnZlbG9wZSBlbnZlbG9wZSA9IG1lc3NhZ2UuZ2V0U09BUFBhcnQoKS5nZXRFbnZlbG9wZSgpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvL1NPQVAxLjIgZG9lcyBub3QgYWxsb3cgdHJhaWxpbmcgYmxvY2tzIGFmdGVyIHRoZSBCb2R5Ci0gICAgICAgICAgICAvL0NhbGwgU09BUEVudmVsb3BlLmFkZENoaWxkRWxlbWVudCgpIGFuZCAoZXhwZWN0IFNPQVBFeGNlcHRpb24pCi0gICAgICAgICAgICBOYW1lIGVsZW1lbnRBZnRlckJvZHkgPSBlbnZlbG9wZS5jcmVhdGVOYW1lKCJBZnRlckJvZHkiLCAiZSIsICJzb21lLXVyaSIpOwotICAgICAgICAgICAgZW52ZWxvcGUuYWRkQ2hpbGRFbGVtZW50KGVsZW1lbnRBZnRlckJvZHkpOwotICAgICAgICAgICAgZmFpbCgiRGlkIG5vdCB0aHJvdyBleHBlY3RlZCBTT0FQRXhjZXB0aW9uIik7Ci0gICAgICAgIH0gY2F0Y2ggKFNPQVBFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy9EaWQgdGhyb3cgZXhwZWN0ZWQgU09BUEV4Y2VwdGlvbiIKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgRXhjZXB0aW9uOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RUcmFuc2Zvcm0oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgTWVzc2FnZUZhY3RvcnkgZmFjdCA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIFNPQVBNZXNzYWdlIG1lc3NhZ2UgPSBmYWN0LmNyZWF0ZU1lc3NhZ2UoKTsKLSAgICAgICAgU09BUEJvZHkgYm9keSA9IG1lc3NhZ2UuZ2V0U09BUEJvZHkoKTsKLSAgICAgICAgU291cmNlIHNvdXJjZSA9IG5ldyBET01Tb3VyY2UoY3JlYXRlRG9jdW1lbnQoKSk7Ci0gICAgICAgIFJlc3VsdCByZXN1bHQgPSBuZXcgRE9NUmVzdWx0KGJvZHkpOwotICAgICAgICBUcmFuc2Zvcm1lckZhY3RvcnkgdHJhbnNmb3JtZXJGYWN0b3J5ID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIFRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gdHJhbnNmb3JtZXJGYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKCk7Ci0gICAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybShzb3VyY2UsIHJlc3VsdCk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYm9keS5nZXRDaGlsZE5vZGVzKCkuZ2V0TGVuZ3RoKCkpOwotICAgICAgICBJdGVyYXRvciBpdGVyID0gYm9keS5nZXRDaGlsZEVsZW1lbnRzKCk7Ci0gICAgICAgIGFzc2VydFRydWUoaXRlci5oYXNOZXh0KCkpOyAKLSAgICAgICAgT2JqZWN0IG9iaiA9IGl0ZXIubmV4dCgpOwotICAgICAgICBhc3NlcnRUcnVlKG9iaiBpbnN0YW5jZW9mIFNPQVBCb2R5RWxlbWVudCk7ICAKLSAgICAgICAgU09BUEVsZW1lbnQgc29hcEVsZW1lbnQgPSAoU09BUEVsZW1lbnQpb2JqOwotICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly9leGFtcGxlLmNvbSIsIHNvYXBFbGVtZW50LmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJHZXRMYXN0VHJhZGVQcmljZSIsIHNvYXBFbGVtZW50LmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgCi0gICAgICAgIGl0ZXIgPSBzb2FwRWxlbWVudC5nZXRDaGlsZEVsZW1lbnRzKCk7Ci0gICAgICAgIGFzc2VydFRydWUoaXRlci5oYXNOZXh0KCkpOyAKLSAgICAgICAgb2JqID0gaXRlci5uZXh0KCk7Ci0gICAgICAgIGFzc2VydFRydWUob2JqIGluc3RhbmNlb2YgU09BUEVsZW1lbnQpOyAgCi0gICAgICAgIHNvYXBFbGVtZW50ID0gKFNPQVBFbGVtZW50KW9iajsKLSAgICAgICAgYXNzZXJ0TnVsbChzb2FwRWxlbWVudC5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygic3ltYm9sIiwgc29hcEVsZW1lbnQuZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICBhc3NlcnRGYWxzZShpdGVyLmhhc05leHQoKSk7Ci0gICAgICAgIAotICAgICAgICBpdGVyID0gc29hcEVsZW1lbnQuZ2V0Q2hpbGRFbGVtZW50cygpOwotICAgICAgICBhc3NlcnRUcnVlKGl0ZXIuaGFzTmV4dCgpKTsgCi0gICAgICAgIG9iaiA9IGl0ZXIubmV4dCgpOwotICAgICAgICBhc3NlcnRUcnVlKG9iaiBpbnN0YW5jZW9mIFRleHQpOyAgCi0gICAgICAgIFRleHQgdGV4dCA9IChUZXh0KW9iajsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJERUYiLCB0ZXh0LmdldERhdGEoKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKGl0ZXIuaGFzTmV4dCgpKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBFbGVtZW50IGNyZWF0ZURvY3VtZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZG9jdW1lbnRCdWlsZGVyRmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgZG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKLSAgICAgICAgRG9jdW1lbnRCdWlsZGVyIGRvY3VtZW50QnVpbGRlciA9IGRvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0gICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gZG9jdW1lbnRCdWlsZGVyLm5ld0RvY3VtZW50KCk7Ci0gICAgICAgIEVsZW1lbnQgZ2V0TGFzdFRyYWRlUHJpY2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly9leGFtcGxlLmNvbSIsICJtOkdldExhc3RUcmFkZVByaWNlIik7ICAgICAgICAKLSAgICAgICAgRWxlbWVudCBzeW1ib2wgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzeW1ib2wiKTsKLSAgICAgICAgZ2V0TGFzdFRyYWRlUHJpY2UuYXBwZW5kQ2hpbGQoc3ltYm9sKTsKLSAgICAgICAgb3JnLnczYy5kb20uVGV4dCBkZWYgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiREVGIik7Ci0gICAgICAgIHN5bWJvbC5hcHBlbmRDaGlsZChkZWYpOwotICAgICAgICBkb2N1bWVudC5hcHBlbmRDaGlsZChnZXRMYXN0VHJhZGVQcmljZSk7Ci0gICAgICAgIHJldHVybiBnZXRMYXN0VHJhZGVQcmljZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdFRyYW5zZm9ybVdpdGhDb21tZW50cygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBNZXNzYWdlRmFjdG9yeSBmYWN0ID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgU09BUE1lc3NhZ2UgbWVzc2FnZSA9IGZhY3QuY3JlYXRlTWVzc2FnZSgpOwotICAgICAgICBTT0FQQm9keSBib2R5ID0gbWVzc2FnZS5nZXRTT0FQQm9keSgpOwotICAgICAgICBTb3VyY2Ugc291cmNlID0gbmV3IFNBWFNvdXJjZShuZXcgSW5wdXRTb3VyY2UobmV3IFN0cmluZ1JlYWRlcihYTUxfSU5QVVRfMSkpKTsKLSAgICAgICAgRE9NUmVzdWx0IHJlc3VsdCA9IG5ldyBET01SZXN1bHQoYm9keSk7Ci0gICAgICAgIFRyYW5zZm9ybWVyRmFjdG9yeSB0cmFuc2Zvcm1lckZhY3RvcnkgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lckZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKLSAgICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKHNvdXJjZSwgcmVzdWx0KTsKLSAgICAgICAgCi0gICAgICAgIC8vIHRlc3QgRE9NCi0gICAgICAgIG9yZy53M2MuZG9tLk5vZGUgcm9vdE5vZGUgPSByZXN1bHQuZ2V0Tm9kZSgpOwotICAgICAgICBvcmcudzNjLmRvbS5Ob2RlIG5vZGUgPSByb290Tm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0gICAgICAgIGFzc2VydFRydWUobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInJvb3QiLCBub2RlLmdldE5vZGVOYW1lKCkpOwotICAgICAgICAKLSAgICAgICAgbm9kZSA9IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOwotICAgICAgICBhc3NlcnRUcnVlKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJhIiwgbm9kZS5nZXROb2RlTmFtZSgpKTsKLSAgICAgICAgCi0gICAgICAgIG5vZGUgPSBub2RlLmdldEZpcnN0Q2hpbGQoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShub2RlIGluc3RhbmNlb2YgQ29tbWVudCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygidGhpcyBpcyBhIHRlc3Qgd2l0aCBhIGNvbW1lbnQgbm9kZSIsIG5vZGUuZ2V0Tm9kZVZhbHVlKCkudHJpbSgpKTsKLSAgICAgICAgCi0gICAgICAgIC8vIHRlc3QgU0FBSgotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYm9keS5nZXRDaGlsZE5vZGVzKCkuZ2V0TGVuZ3RoKCkpOwotICAgICAgICBJdGVyYXRvciBpdGVyID0gYm9keS5nZXRDaGlsZEVsZW1lbnRzKCk7Ci0gICAgICAgIGFzc2VydFRydWUoaXRlci5oYXNOZXh0KCkpOyAKLSAgICAgICAgT2JqZWN0IG9iaiA9IGl0ZXIubmV4dCgpOwotICAgICAgICBhc3NlcnRUcnVlKG9iaiBpbnN0YW5jZW9mIFNPQVBCb2R5RWxlbWVudCk7ICAKLSAgICAgICAgU09BUEVsZW1lbnQgc29hcEVsZW1lbnQgPSAoU09BUEVsZW1lbnQpb2JqOwotICAgICAgICBhc3NlcnRFcXVhbHMoInJvb3QiLCBzb2FwRWxlbWVudC5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgIAotICAgICAgICBpdGVyID0gc29hcEVsZW1lbnQuZ2V0Q2hpbGRFbGVtZW50cygpOwotICAgICAgICBhc3NlcnRUcnVlKGl0ZXIuaGFzTmV4dCgpKTsgCi0gICAgICAgIG9iaiA9IGl0ZXIubmV4dCgpOwotICAgICAgICBhc3NlcnRUcnVlKG9iaiBpbnN0YW5jZW9mIFNPQVBFbGVtZW50KTsgIAotICAgICAgICBzb2FwRWxlbWVudCA9IChTT0FQRWxlbWVudClvYmo7Ci0gICAgICAgIGFzc2VydEVxdWFscygiYSIsIHNvYXBFbGVtZW50LmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoaXRlci5oYXNOZXh0KCkpOwotICAgICAgICAKLSAgICAgICAgaXRlciA9IHNvYXBFbGVtZW50LmdldENoaWxkRWxlbWVudHMoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShpdGVyLmhhc05leHQoKSk7IAotICAgICAgICBvYmogPSBpdGVyLm5leHQoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShvYmogaW5zdGFuY2VvZiBUZXh0KTsgIAotICAgICAgICBUZXh0IHRleHQgPSAoVGV4dClvYmo7Ci0gICAgICAgIGFzc2VydFRydWUodGV4dC5pc0NvbW1lbnQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygidGhpcyBpcyBhIHRlc3Qgd2l0aCBhIGNvbW1lbnQgbm9kZSIsIHRleHQuZ2V0RGF0YSgpLnRyaW0oKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKGl0ZXIuaGFzTmV4dCgpKTsgICAgICAgIAotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhYWovdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NhYWovU09BUEZhY3RvcnlUZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9zYWFqL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zYWFqL1NPQVBGYWN0b3J5VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMWE4NTZkLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhYWovdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NhYWovU09BUEZhY3RvcnlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNhYWo7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuRGV0YWlsOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBDb25zdGFudHM7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRmF1bHQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBTT0FQRmFjdG9yeVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFNPQVBGYWN0b3J5VGVzdC5jbGFzcyk7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlRGV0YWlsKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgU09BUEZhY3Rvcnkgc2YgPSBTT0FQRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgaWYgKHNmID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmYWlsKCJTT0FQRmFjdG9yeSB3YXMgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgRGV0YWlsIGQgPSBzZi5jcmVhdGVEZXRhaWwoKTsKLSAgICAgICAgICAgIGlmIChkID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmYWlsKCJEZXRhaWwgd2FzIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIEV4Y2VwdGlvbiAiICsgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlRWxlbWVudCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vU09BUEZhY3Rvcnkgc2YgPSBTT0FQRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgU09BUEZhY3Rvcnkgc2YgPSBTT0FQRmFjdG9yeS5uZXdJbnN0YW5jZShTT0FQQ29uc3RhbnRzLlNPQVBfMV8yX1BST1RPQ09MKTsKLSAgICAgICAgICAgIGlmIChzZiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZmFpbCgiY3JlYXRlRWxlbWVudFRlc3Q0KCkgY291bGQgbm90IGNyZWF0ZSBTT0FQRmFjdG9yeSBvYmplY3QiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vQ3JlYXRlIFFOYW1lIG9iamVjdCB3aXRoIGxvY2FsTmFtZT1NeU5hbWUxLHByZWZpeD1NeVByZWZpeDEsIHVyaT1NeVVyaTEKLSAgICAgICAgICAgIFFOYW1lIG5hbWUgPSBuZXcgUU5hbWUoIk15VXJpMSIsICJNeU5hbWUxIiwgIk15UHJlZml4MSIpOwotICAgICAgICAgICAgU09BUEVsZW1lbnQgc2UgPSBzZi5jcmVhdGVFbGVtZW50KG5hbWUpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChzZSk7Ci0gICAgICAgICAgICBuYW1lID0gc2UuZ2V0RWxlbWVudFFOYW1lKCk7Ci0gICAgICAgICAgICBTdHJpbmcgbG9jYWxOYW1lID0gbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSBuYW1lLmdldFByZWZpeCgpOwotICAgICAgICAgICAgU3RyaW5nIHVyaSA9IG5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICBpZiAobG9jYWxOYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmYWlsKCJsb2NhbE5hbWUgaXMgbnVsbCAoZXhwZWN0ZWQgTXlOYW1lMSkiKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIWxvY2FsTmFtZS5lcXVhbHMoIk15TmFtZTEiKSkgewotICAgICAgICAgICAgICAgIGZhaWwoImxvY2FsTmFtZSBpcyB3cm9uZyAoZXhwZWN0ZWQgTXlOYW1lMSkiKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmYWlsKCJwcmVmaXggaXMgbnVsbCAoZXhwZWN0ZWQgTXlQcmVmaXgxKSIpOwotICAgICAgICAgICAgfSBlbHNlIGlmICghcHJlZml4LmVxdWFscygiTXlQcmVmaXgxIikpIHsKLSAgICAgICAgICAgICAgICBmYWlsKCJwcmVmaXggaXMgd3JvbmcgKGV4cGVjdGVkIE15UHJlZml4MSkiKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAodXJpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmYWlsKCJ1cmkgaXMgbnVsbCAoZXhwZWN0ZWQgTXlVcmkxKSIpOwotICAgICAgICAgICAgfSBlbHNlIGlmICghdXJpLmVxdWFscygiTXlVcmkxIikpIHsKLSAgICAgICAgICAgICAgICBmYWlsKCJ1cmkgaXMgd3JvbmcgKGV4cGVjdGVkIE15VXJpMSkiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZUVsZW1lbnQyKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgU09BUEZhY3Rvcnkgc2YgPSBTT0FQRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgLy9TT0FQRmFjdG9yeSBzZiA9IFNPQVBGYWN0b3J5Lm5ld0luc3RhbmNlKFNPQVBDb25zdGFudHMuU09BUF8xXzJfUFJPVE9DT0wpOwotICAgICAgICAgICAgaWYgKHNmID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmYWlsKCJjb3VsZCBub3QgY3JlYXRlIFNPQVBGYWN0b3J5IG9iamVjdCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbG9nLmluZm8oIkNyZWF0ZSBhIERPTUVsZW1lbnQiKTsKLSAgICAgICAgICAgIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZGJmYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgRG9jdW1lbnRCdWlsZGVyIGJ1aWxkZXIgPSBkYmZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0gICAgICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IGJ1aWxkZXIubmV3RG9jdW1lbnQoKTsKLSAgICAgICAgICAgIEVsZW1lbnQgZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly9NeU5hbWVzcGFjZS5vcmcvIiwgIk15VGFnIik7Ci0gICAgICAgICAgICAvL0NhbGxpbmcgU09BUEZhY3RvcnkuY3JlYXRlRWxlbWVudChvcmcudzNjLmRvbS5FbGVtZW50KQotICAgICAgICAgICAgU09BUEVsZW1lbnQgc2UgPSBzZi5jcmVhdGVFbGVtZW50KGRlKTsKLSAgICAgICAgICAgIGlmICghZGUuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoc2UuZ2V0Tm9kZU5hbWUoKSkgfHwgIWRlLmdldE5hbWVzcGFjZVVSSSgpLmVxdWFscygKLSAgICAgICAgICAgICAgICAgICAgc2UuZ2V0TmFtZXNwYWNlVVJJKCkpKSB7Ci0gICAgICAgICAgICAgICAgLy9Ob2RlIG5hbWVzIGFyZSBub3QgZXF1YWwKLSAgICAgICAgICAgICAgICBmYWlsKCJHb3Q6IDxVUkk9IiArIHNlLmdldE5hbWVzcGFjZVVSSSgpICsgIiwgUFJFRklYPSIgKwotICAgICAgICAgICAgICAgICAgICAgICAgc2UuZ2V0UHJlZml4KCkgKyAiLCBOQU1FPSIgKyBzZS5nZXROb2RlTmFtZSgpICsgIj4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZDogPFVSST0iICsgZGUuZ2V0TmFtZXNwYWNlVVJJKCkgKyAiLCBQUkVGSVg9IiArCi0gICAgICAgICAgICAgICAgICAgICAgICBkZS5nZXRQcmVmaXgoKSArICIsIE5BTUU9IiArIGRlLmdldE5vZGVOYW1lKCkgKyAiPiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uOiAiICsgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlRWxlbWVudDMoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTT0FQRmFjdG9yeSBmYWN0b3J5ID0gU09BUEZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIGlmIChmYWN0b3J5ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmYWlsKCJjcmVhdGVGYXVsdFRlc3QxKCkgY291bGQgbm90IGNyZWF0ZSBTT0FQRmFjdG9yeSBvYmplY3QiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFNPQVBGYXVsdCBzZiA9IGZhY3RvcnkuY3JlYXRlRmF1bHQoKTsKLSAgICAgICAgICAgIGlmIChzZiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZmFpbCgiY3JlYXRlRmF1bHQoKSByZXR1cm5lZCBudWxsIik7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCEoc2YgaW5zdGFuY2VvZiBTT0FQRmF1bHQpKSB7Ci0gICAgICAgICAgICAgICAgZmFpbCgiY3JlYXRlRmF1bHQoKSBkaWQgbm90IGNyZWF0ZSBhIFNPQVBGYXVsdCBvYmplY3QiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVFbGVtZW50NCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNPQVBGYWN0b3J5IHNmID0gU09BUEZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIGlmIChzZiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZmFpbCgiY3JlYXRlRWxlbWVudFRlc3Q2KCkgY291bGQgbm90IGNyZWF0ZSBTT0FQRmFjdG9yeSBvYmplY3QiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFFOYW1lIHFuYW1lID0gbmV3IFFOYW1lKCJodHRwOi8vTXlOYW1lc3BhY2Uub3JnLyIsICJNeVRhZyIpOwotICAgICAgICAgICAgU09BUEVsZW1lbnQgc2UxID0gc2YuY3JlYXRlRWxlbWVudChxbmFtZSk7Ci0gICAgICAgICAgICAvL0NyZWF0ZSBzZWNvbmQgU09BUEVsZW1lbnQgZnJvbSBmaXJzdCBTT0FQRWxlbWVudAotICAgICAgICAgICAgU09BUEVsZW1lbnQgc2UyID0gc2YuY3JlYXRlRWxlbWVudChzZTEpOwotICAgICAgICAgICAgLy9jb21tZW50ZWQgdG8gc3VwcG9ydCBqZGsgMS40IGJ1aWxkCi0gICAgICAgICAgICAvLyAgICAJCWlmKCFzZTEuaXNFcXVhbE5vZGUoc2UyKSAmJiAhc2UxLmlzU2FtZU5vZGUoc2UyKSkgewotICAgICAgICAgICAgLy8gICAgCQkJZmFpbCgiVGhlIFNPQVBFbGVtZW50J3MgYXJlIG5vdCBlcXVhbCBhbmQgbm90IHRoZSBzYW1lICh1bmV4cGVjdGVkKSIpOwotICAgICAgICAgICAgLy8gICAgCQl9Ci0gICAgICAgICAgICBpZiAoIXNlMS5nZXROb2RlTmFtZSgpLmVxdWFscyhzZTIuZ2V0Tm9kZU5hbWUoKSkgfHwgIXNlMS5nZXROYW1lc3BhY2VVUkkoKS5lcXVhbHMoCi0gICAgICAgICAgICAgICAgICAgIHNlMi5nZXROYW1lc3BhY2VVUkkoKSkpIHsKLSAgICAgICAgICAgICAgICBmYWlsKCJHb3Q6IDxVUkk9IiArIHNlMS5nZXROYW1lc3BhY2VVUkkoKSArICIsIFBSRUZJWD0iICsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlMS5nZXRQcmVmaXgoKSArICIsIE5BTUU9IiArIHNlMS5nZXROb2RlTmFtZSgpICsgIj4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZDogPFVSST0iICsgc2UyLmdldE5hbWVzcGFjZVVSSSgpICsgIiwgUFJFRklYPSIgKwotICAgICAgICAgICAgICAgICAgICAgICAgc2UyLmdldFByZWZpeCgpICsgIiwgTkFNRT0iICsgc2UyLmdldE5vZGVOYW1lKCkgKyAiPiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZUZhdWx0KCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgU09BUEZhY3RvcnkgZmFjdG9yeSA9IFNPQVBGYWN0b3J5Lm5ld0luc3RhbmNlKFNPQVBDb25zdGFudHMuU09BUF8xXzJfUFJPVE9DT0wpOwotICAgICAgICAgICAgLy9TT0FQRmFjdG9yeSBmYWN0b3J5ID0gU09BUEZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIFNPQVBGYXVsdCBzZiA9IGZhY3RvcnkuY3JlYXRlRmF1bHQoIlRoaXMgaXMgdGhlIGZhdWx0IHJlYXNvbi4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT0FQQ29uc3RhbnRzLlNPQVBfUkVDRUlWRVJfRkFVTFQpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChzZik7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHNmIGluc3RhbmNlb2YgU09BUEZhdWx0KTsKLSAgICAgICAgICAgIFFOYW1lIGZjID0gc2YuZ2V0RmF1bHRDb2RlQXNRTmFtZSgpOwotICAgICAgICAgICAgLy9FeHBlY3QgRmF1bHRDb2RlPSIrU09BUENvbnN0YW50cy5TT0FQX1JFQ0VJVkVSX0ZBVUxUCi0gICAgICAgICAgICBJdGVyYXRvciBpID0gc2YuZ2V0RmF1bHRSZWFzb25UZXh0cygpOwotICAgICAgICAgICAgaWYgKGkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJDYWxsIHRvIGdldEZhdWx0UmVhc29uVGV4dHMoKSByZXR1cm5lZCBudWxsIGl0ZXJhdG9yIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTdHJpbmcgcmVhc29uID0gIiI7Ci0gICAgICAgICAgICB3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICByZWFzb24gKz0gKFN0cmluZylpLm5leHQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwocmVhc29uKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUocmVhc29uLmluZGV4T2YoIlRoaXMgaXMgdGhlIGZhdWx0IHJlYXNvbi4iKSA+IC0xKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoZmMuZXF1YWxzKFNPQVBDb25zdGFudHMuU09BUF9SRUNFSVZFUl9GQVVMVCkpOwotICAgICAgICB9IGNhdGNoIChTT0FQRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIkNhdWdodCB1bmV4cGVjdGVkIFNPQVBFeGNlcHRpb24iKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVGYXVsdDEoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvL1NPQVBGYWN0b3J5IGZhY3RvcnkgPSBTT0FQRmFjdG9yeS5uZXdJbnN0YW5jZShTT0FQQ29uc3RhbnRzLlNPQVBfMV8yX1BST1RPQ09MKTsKLSAgICAgICAgICAgIFNPQVBGYWN0b3J5IGZhY3RvcnkgPSBTT0FQRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgU09BUEZhdWx0IHNmID0gZmFjdG9yeS5jcmVhdGVGYXVsdCgiVGhpcyBpcyB0aGUgZmF1bHQgcmVhc29uLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPQVBDb25zdGFudHMuU09BUF9SRUNFSVZFUl9GQVVMVCk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHNmKTsKLSAgICAgICAgICAgIFFOYW1lIGZjID0gc2YuZ2V0RmF1bHRDb2RlQXNRTmFtZSgpOwotICAgICAgICAgICAgSXRlcmF0b3IgaSA9IHNmLmdldEZhdWx0UmVhc29uVGV4dHMoKTsKLQotICAgICAgICAgICAgU3RyaW5nIHJlYXNvbiA9ICIiOwotICAgICAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgcmVhc29uICs9IChTdHJpbmcpaS5uZXh0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBsb2cuaW5mbygiQWN0dWFsIFJlYXNvblRleHQ9IiArIHJlYXNvbik7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHJlYXNvbik7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHJlYXNvbi5pbmRleE9mKCJUaGlzIGlzIHRoZSBmYXVsdCByZWFzb24uIikgPiAtMSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGZjLmVxdWFscyhTT0FQQ29uc3RhbnRzLlNPQVBfUkVDRUlWRVJfRkFVTFQpKTsKLSAgICAgICAgfSBjYXRjaCAoU09BUEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvL0NhdWdodCBleHBlY3RlZCBTT0FQRXhjZXB0aW9uCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJFeGNlcHRpb246ICIgKyBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKiBmb3Igc29hcCAxLjEgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U09BUEZhdWx0RXhjZXB0aW9uMSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNPQVBGYWN0b3J5IGZhY3RvcnkgPSBTT0FQRmFjdG9yeS5uZXdJbnN0YW5jZShTT0FQQ29uc3RhbnRzLlNPQVBfMV8yX1BST1RPQ09MKTsKLSAgICAgICAgICAgIFNPQVBGYXVsdCBmYXVsdCA9IGZhY3RvcnkuY3JlYXRlRmF1bHQoIlRoaXMgaXMgdGhlIGZhdWx0IHJlYXNvbi4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUU5hbWUoImh0dHA6Ly9NeU5hbWVzcGFjZVVSSS5vcmcvIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNeSBGYXVsdCBDb2RlIikpOwotICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvL0NhdWdodCBleHBlY3RlZCBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgotICAgICAgICB9IGNhdGNoIChTT0FQRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vQ2F1Z2h0IGV4cGVjdGVkIFNPQVBFeGNlcHRpb24KLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vQ2F1Z2h0IGV4cGVjdGVkIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uOiAiICsgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiogZm9yIHNvYXAgMS4yICovCi0gICAgcHVibGljIHZvaWQgdGVzdFNPQVBGYXVsdEV4Y2VwdGlvbjIoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTT0FQRmFjdG9yeSBmYWN0b3J5ID0gU09BUEZhY3RvcnkubmV3SW5zdGFuY2UoU09BUENvbnN0YW50cy5TT0FQXzFfMl9QUk9UT0NPTCk7Ci0gICAgICAgICAgICBTT0FQRmF1bHQgc2YgPSBmYWN0b3J5LmNyZWF0ZUZhdWx0KCJUaGlzIGlzIHRoZSBmYXVsdCByZWFzb24uIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFFOYW1lKCJodHRwOi8vTXlOYW1lc3BhY2VVUkkub3JnLyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTXkgRmF1bHQgQ29kZSIpKTsKLSAgICAgICAgICAgIGZhaWwoIkRpZCBub3QgdGhyb3cgZXhwZWN0ZWQgU09BUEV4Y2VwdGlvbiIpOwotICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvL0NhdWdodCBleHBlY3RlZCBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgotICAgICAgICB9IGNhdGNoIChTT0FQRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vQ2F1Z2h0IGV4cGVjdGVkIFNPQVBFeGNlcHRpb24KLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vQ2F1Z2h0IGV4cGVjdGVkIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uOiAiICsgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYWFqL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zYWFqL1NPQVBGYXVsdERldGFpbFRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhYWovdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NhYWovU09BUEZhdWx0RGV0YWlsVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjIwYWE5Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhYWovdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NhYWovU09BUEZhdWx0RGV0YWlsVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNhYWo7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBqYXZheC54bWwuc29hcC5EZXRhaWxFbnRyeTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5NZXNzYWdlRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5NaW1lSGVhZGVyczsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQQm9keTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRmF1bHQ7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUE1lc3NhZ2U7Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBTT0FQRmF1bHREZXRhaWxUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHVibGljIFNPQVBGYXVsdERldGFpbFRlc3QoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgeG1sU3RyaW5nID0KLSAgICAgICAgICAgICI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz4iICsKLSAgICAgICAgICAgICAgICAgICAgIjxzb2FwZW52OkVudmVsb3BlIHhtbG5zOnNvYXBlbnY9XCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlL1wiIHhtbG5zOnhzZD1cImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hXCIgeG1sbnM6eHNpPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2VcIj4iICsKLSAgICAgICAgICAgICAgICAgICAgIiA8c29hcGVudjpCb2R5PiIgKwotICAgICAgICAgICAgICAgICAgICAiICA8c29hcGVudjpGYXVsdD4iICsKLSAgICAgICAgICAgICAgICAgICAgIiAgIDxmYXVsdGNvZGU+c29hcGVudjpTZXJ2ZXIuZ2VuZXJhbEV4Y2VwdGlvbjwvZmF1bHRjb2RlPiIgKwotICAgICAgICAgICAgICAgICAgICAiICAgPGZhdWx0c3RyaW5nPjwvZmF1bHRzdHJpbmc+IiArCi0gICAgICAgICAgICAgICAgICAgICIgICA8ZGV0YWlsPiIgKwotICAgICAgICAgICAgICAgICAgICAiICAgIDx0aWNrZXJTeW1ib2wgeHNpOnR5cGU9XCJ4c2Q6c3RyaW5nXCI+TUFDUjwvdGlja2VyU3ltYm9sPiIgKwotICAgICAgICAgICAgICAgICAgICAiICAgPG5zMTpleGNlcHRpb25OYW1lIHhtbG5zOm5zMT1cImh0dHA6Ly94bWwuYXBhY2hlLm9yZy9heGlzMi9cIj50ZXN0LndzZGwuZmF1bHRzLkludmFsaWRUaWNrZXJGYXVsdE1lc3NhZ2U8L25zMTpleGNlcHRpb25OYW1lPiIgKwotICAgICAgICAgICAgICAgICAgICAiICAgPC9kZXRhaWw+IiArCi0gICAgICAgICAgICAgICAgICAgICIgIDwvc29hcGVudjpGYXVsdD4iICsKLSAgICAgICAgICAgICAgICAgICAgIiA8L3NvYXBlbnY6Qm9keT4iICsKLSAgICAgICAgICAgICAgICAgICAgIjwvc29hcGVudjpFbnZlbG9wZT4iOwotCi0gICAgcHVibGljIHZvaWQgdGVzdERldGFpbHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgTWVzc2FnZUZhY3RvcnkgbWYgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICBTT0FQTWVzc2FnZSBzbXNnID0KLSAgICAgICAgICAgICAgICBtZi5jcmVhdGVNZXNzYWdlKG5ldyBNaW1lSGVhZGVycygpLCBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oeG1sU3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgU09BUEJvZHkgYm9keSA9IHNtc2cuZ2V0U09BUEJvZHkoKTsKLSAgICAgICAgLy9zbXNnLndyaXRlVG8oU3lzdGVtLm91dCk7Ci0gICAgICAgIFNPQVBGYXVsdCBmYXVsdCA9IGJvZHkuZ2V0RmF1bHQoKTsKLSAgICAgICAgZmF1bHQuYWRkRGV0YWlsKCk7Ci0gICAgICAgIGphdmF4LnhtbC5zb2FwLkRldGFpbCBkID0gZmF1bHQuZ2V0RGV0YWlsKCk7Ci0gICAgICAgIEl0ZXJhdG9yIGkgPSBkLmdldERldGFpbEVudHJpZXMoKTsKLSAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBEZXRhaWxFbnRyeSBlbnRyeSA9IChEZXRhaWxFbnRyeSlpLm5leHQoKTsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gZW50cnkuZ2V0RWxlbWVudE5hbWUoKS5nZXRMb2NhbE5hbWUoKTsKLSAgICAgICAgICAgIGlmICgidGlja2VyU3ltYm9sIi5lcXVhbHMobmFtZSkpIHsKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoInRoZSB2YWx1ZSBvZiB0aGUgdGlja2VyU3ltYm9sIGVsZW1lbnQgZGlkbid0IG1hdGNoIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1BQ1IiLCBlbnRyeS5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoImV4Y2VwdGlvbk5hbWUiLmVxdWFscyhuYW1lKSkgewotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygidGhlIHZhbHVlIG9mIHRoZSBleGNlcHRpb25OYW1lIGVsZW1lbnQgZGlkbid0IG1hdGNoIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRlc3Qud3NkbC5mYXVsdHMuSW52YWxpZFRpY2tlckZhdWx0TWVzc2FnZSIsIGVudHJ5LmdldFZhbHVlKCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJFeHBlY3RpbmcgZGV0YWlscyBlbGVtZW50IG5hbWUgb2YgJ3RpY2tlclN5bWJvbCcgb3IgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiJ2V4cGNlcHRpb25OYW1lJyAtIEkgZm91bmQgOiIgKyBuYW1lLCBmYWxzZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYWFqL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zYWFqL1NPQVBGYXVsdFRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhYWovdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NhYWovU09BUEZhdWx0VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzIwZTMwLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhYWovdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NhYWovU09BUEZhdWx0VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTM5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zYWFqOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5EZXRhaWw7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuRGV0YWlsRW50cnk7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuTWVzc2FnZUZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuTmFtZTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQQm9keTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQQ29uc3RhbnRzOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBFbGVtZW50OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBFbnZlbG9wZTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBGYXVsdDsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQSGVhZGVyOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBIZWFkZXJFbGVtZW50OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBNZXNzYWdlOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBQYXJ0OwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotCi1wdWJsaWMgY2xhc3MgU09BUEZhdWx0VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHB1YmxpYyBTT0FQRmF1bHRUZXN0KFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIF90ZXN0U09BUEZhdWx0V2l0aERldGFpbHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLyogV2UgYXJlIHRyeWluZyB0byBnZW5lcmF0ZSB0aGUgZm9sbG93aW5nIFNPQVBGYXVsdAotCi0gICAgICAgIDxzb2FwZW52OkVudmVsb3BlIHhtbG5zOnNvYXBlbnY9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIgotICAgICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICAgICB4bWxuczpjd21wPSJodHRwOi8vY3dtcC5jb20iPgotICAgICAgICAgPHNvYXBlbnY6SGVhZGVyPgotICAgICAgICAgIDxjd21wOklEIHNvYXBlbnY6bXVzdFVuZGVyc3RhbmQ9IjEiPkhFQURFUklELTc4Njc2N2NvbW0KLSAgICAgICAgICA4PC9jd21wOklEPgotICAgICAgICAgPC9zb2FwZW52OkhlYWRlcj4KLSAgICAgICAgIDxzb2FwZW52OkJvZHk+Ci0gICAgICAgICAgPHNvYXBlbnY6RmF1bHQ+Ci0gICAgICAgICAgIDxmYXVsdGNvZGU+Q2xpZW50PC9mYXVsdGNvZGU+Ci0gICAgICAgICAgIDxmYXVsdHN0cmluZz5DV01QIGZhdWx0PC9mYXVsdHN0cmluZz4KLSAgICAgICAgICAgPGZhdWx0YWN0b3I+aHR0cDovL2dpem1vcy5jb20vb3JkZXI8L2ZhdWx0YWN0b3I+Ci0gICAgICAgICAgIDxkZXRhaWw+Ci0gICAgICAgICAgICA8Y3dtcDpGYXVsdD4KLSAgICAgICAgICAgICA8Y3dtcDpGYXVsdENvZGU+VGhpcyBpcyB0aGUgZmF1bHQgY29kZTwvY3dtcDpGYXVsdENvZGU+Ci0gICAgICAgICAgICAgPGN3bXA6RmF1bHRTdHJpbmc+RmF1bHQgTWVzc2FnZTwvY3dtcDpGYXVsdFN0cmluZz4KLSAgICAgICAgICAgICA8Y3dtcDpNZXNzYWdlPlRoaXMgaXMgYSB0ZXN0IGZhdWx0PC9jd21wOkZhdWx0U3RyaW5nPgotICAgICAgICAgICAgPC9jd21wOkZhdWx0PgotICAgICAgICAgICA8L2RldGFpbD4KLSAgICAgICAgICA8L3NvYXBlbnY6RmF1bHQ+Ci0gICAgICAgICA8L3NvYXBlbnY6Qm9keT4KLSAgICAgICAgPC9zb2FwZW52OkVudmVsb3BlPgotCi0gICAgICAgICovCi0KLSAgICAgICAgTWVzc2FnZUZhY3RvcnkgZmFjID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLQotICAgICAgICAvL0NyZWF0ZSB0aGUgcmVzcG9uc2UgdG8gdGhlIG1lc3NhZ2UKLSAgICAgICAgU09BUE1lc3NhZ2Ugc29hcE1lc3NhZ2UgPSBmYWMuY3JlYXRlTWVzc2FnZSgpOwotICAgICAgICBTT0FQUGFydCBzb2FwUGFydCA9IHNvYXBNZXNzYWdlLmdldFNPQVBQYXJ0KCk7Ci0gICAgICAgIFNPQVBFbnZlbG9wZSBlbnZlbG9wZSA9IHNvYXBQYXJ0LmdldEVudmVsb3BlKCk7Ci0gICAgICAgIGVudmVsb3BlLmFkZE5hbWVzcGFjZURlY2xhcmF0aW9uKCJjd21wIiwgImh0dHA6Ly9jd21wLmNvbSIpOwotICAgICAgICBTT0FQQm9keSBib2R5ID0gZW52ZWxvcGUuZ2V0Qm9keSgpOwotICAgICAgICBTT0FQSGVhZGVyIGhlYWRlciA9IGVudmVsb3BlLmdldEhlYWRlcigpOwotICAgICAgICBOYW1lIGlkTmFtZSA9IGVudmVsb3BlLmNyZWF0ZU5hbWUoIklEIiwgImN3bXAiLCAiaHR0cDovL2N3bXAuY29tIik7Ci0gICAgICAgIFNPQVBIZWFkZXJFbGVtZW50IGlkID0gaGVhZGVyLmFkZEhlYWRlckVsZW1lbnQoaWROYW1lKTsKLSAgICAgICAgaWQuc2V0TXVzdFVuZGVyc3RhbmQodHJ1ZSk7Ci0gICAgICAgIGlkLmFkZFRleHROb2RlKCJIRUFERVJJRC03ODY3Njc4Iik7Ci0KLSAgICAgICAgLy9DcmVhdGUgdGhlIFNPQVBGYXVsdCBvYmplY3QKLSAgICAgICAgU09BUEZhdWx0IGZhdWx0ID0gYm9keS5hZGRGYXVsdCgpOwotICAgICAgICBmYXVsdC5zZXRGYXVsdENvZGUoIkNsaWVudCIpOwotICAgICAgICBmYXVsdC5zZXRGYXVsdFN0cmluZygiQ1dNUCBmYXVsdCIpOwotICAgICAgICBmYXVsdC5zZXRGYXVsdEFjdG9yKCJodHRwOi8vZ2l6bW9zLmNvbS9vcmRlciIpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygiQ2xpZW50IiwgZmF1bHQuZ2V0RmF1bHRDb2RlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkNXTVAgZmF1bHQiLCBmYXVsdC5nZXRGYXVsdFN0cmluZygpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJodHRwOi8vZ2l6bW9zLmNvbS9vcmRlciIsIGZhdWx0LmdldEZhdWx0QWN0b3IoKSk7Ci0KLSAgICAgICAgLy9BZGQgRmF1bHQgRGV0YWlsIGluZm9ybWF0aW9uCi0gICAgICAgIERldGFpbCBmYXVsdERldGFpbCA9IGZhdWx0LmFkZERldGFpbCgpOwotICAgICAgICBOYW1lIGN3bXBGYXVsdE5hbWUgPSBlbnZlbG9wZS5jcmVhdGVOYW1lKCJGYXVsdCIsICJjd21wIiwgImh0dHA6Ly9jd21wLmNvbSIpOwotICAgICAgICBEZXRhaWxFbnRyeSBmYXVsdERldGFpbEVudHJ5ID0gZmF1bHREZXRhaWwuYWRkRGV0YWlsRW50cnkoY3dtcEZhdWx0TmFtZSk7Ci0gICAgICAgIFNPQVBFbGVtZW50IGUgPSBmYXVsdERldGFpbEVudHJ5LmFkZENoaWxkRWxlbWVudCgiRmF1bHRDb2RlIik7Ci0KLSAgICAgICAgZS5hZGRUZXh0Tm9kZSgiVGhpcyBpcyB0aGUgZmF1bHQgY29kZSIpOwotICAgICAgICBTT0FQRWxlbWVudCBlMiA9IGZhdWx0RGV0YWlsRW50cnkuYWRkQ2hpbGRFbGVtZW50KGVudmVsb3BlLmNyZWF0ZU5hbWUoIkZhdWx0U3RyaW5nIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjd21wIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vY3dtcC5jb20iKSk7Ci0gICAgICAgIGUyLmFkZFRleHROb2RlKCJGYXVsdCBNZXNzYWdlIik7Ci0KLSAgICAgICAgU09BUEVsZW1lbnQgZTMgPSBmYXVsdERldGFpbEVudHJ5LmFkZENoaWxkRWxlbWVudCgiTWVzc2FnZSIpOwotICAgICAgICBlMy5hZGRUZXh0Tm9kZSgiVGhpcyBpcyBhIHRlc3QgZmF1bHQiKTsKLQotICAgICAgICBzb2FwTWVzc2FnZS5zYXZlQ2hhbmdlcygpOwotCi0gICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0gVmFsaWRhdGUgdGhlIGNvbnRlbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgZmluYWwgRGV0YWlsIGRldGFpbCA9IGZhdWx0LmdldERldGFpbCgpOwotICAgICAgICBmaW5hbCBJdGVyYXRvciBkZXRhaWxFbnRyeUl0ZXIgPSBkZXRhaWwuZ2V0RGV0YWlsRW50cmllcygpOwotICAgICAgICBib29sZWFuIGZvdW5kRmlyc3QgPSBmYWxzZTsKLSAgICAgICAgYm9vbGVhbiBmb3VuZFNlY29uZCA9IGZhbHNlOwotICAgICAgICBib29sZWFuIGZvdW5kVGhpcmQgPSBmYWxzZTsKLSAgICAgICAgd2hpbGUgKGRldGFpbEVudHJ5SXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIGZpbmFsIERldGFpbEVudHJ5IGRldGFpbEVudHJ5ID0gKERldGFpbEVudHJ5KWRldGFpbEVudHJ5SXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBmaW5hbCBJdGVyYXRvciBjaGlsZEVsZW1lbnRzSXRlciA9IGRldGFpbEVudHJ5LmdldENoaWxkRWxlbWVudHMoKTsKLSAgICAgICAgICAgIHdoaWxlIChjaGlsZEVsZW1lbnRzSXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBTT0FQRWxlbWVudCBzb2FwRWxlbWVudCA9IChTT0FQRWxlbWVudCljaGlsZEVsZW1lbnRzSXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKHNvYXBFbGVtZW50LmdldFRhZ05hbWUoKS5lcXVhbHMoIkZhdWx0Q29kZSIpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBzb2FwRWxlbWVudC5nZXRWYWx1ZSgpLmVxdWFscygiVGhpcyBpcyB0aGUgZmF1bHQgY29kZSIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvdW5kRmlyc3QgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoc29hcEVsZW1lbnQuZ2V0VGFnTmFtZSgpLmVxdWFscygiY3dtcDpGYXVsdFN0cmluZyIpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBzb2FwRWxlbWVudC5nZXRWYWx1ZSgpLmVxdWFscygiRmF1bHQgTWVzc2FnZSIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvdW5kU2Vjb25kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHNvYXBFbGVtZW50LmdldFRhZ05hbWUoKS5lcXVhbHMoIk1lc3NhZ2UiKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgc29hcEVsZW1lbnQuZ2V0VmFsdWUoKS5lcXVhbHMoIlRoaXMgaXMgYSB0ZXN0IGZhdWx0IikpIHsKLSAgICAgICAgICAgICAgICAgICAgZm91bmRUaGlyZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoZm91bmRGaXJzdCAmJiBmb3VuZFNlY29uZCAmJiBmb3VuZFRoaXJkKTsKLSAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgLy8gVGVzdCB3aGV0aGVyIHRoZSBmYXVsdCBpcyBiZWluZyBzZXJpYWxpemVkIHByb3Blcmx5Ci0gICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICBzb2FwTWVzc2FnZS53cml0ZVRvKGJhb3MpOwotICAgICAgICBTdHJpbmcgeG1sID0gbmV3IFN0cmluZyhiYW9zLnRvQnl0ZUFycmF5KCkpOwotCi0gICAgICAgIGFzc2VydFRydWUoeG1sLmluZGV4T2YoIjxmYXVsdGNvZGU+Q2xpZW50PC9mYXVsdGNvZGU+IikgIT0gLTEpOwotICAgICAgICBhc3NlcnRUcnVlKHhtbC5pbmRleE9mKCI8ZmF1bHRzdHJpbmc+Q1dNUCBmYXVsdDwvZmF1bHRzdHJpbmc+IikgIT0gLTEpOwotICAgICAgICBhc3NlcnRUcnVlKHhtbC5pbmRleE9mKCI8ZmF1bHRhY3Rvcj5odHRwOi8vZ2l6bW9zLmNvbS9vcmRlcjwvZmF1bHRhY3Rvcj4iKSAhPSAtMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEFkZERldGFpbHNUd2ljZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5IGZhYyA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0KLSAgICAgICAgICAgIC8vQ3JlYXRlIHRoZSByZXNwb25zZSB0byB0aGUgbWVzc2FnZQotICAgICAgICAgICAgU09BUE1lc3NhZ2Ugc29hcE1lc3NhZ2UgPSBmYWMuY3JlYXRlTWVzc2FnZSgpOwotICAgICAgICAgICAgU09BUFBhcnQgc29hcFBhcnQgPSBzb2FwTWVzc2FnZS5nZXRTT0FQUGFydCgpOwotICAgICAgICAgICAgU09BUEVudmVsb3BlIGVudmVsb3BlID0gc29hcFBhcnQuZ2V0RW52ZWxvcGUoKTsKLSAgICAgICAgICAgIGVudmVsb3BlLmFkZE5hbWVzcGFjZURlY2xhcmF0aW9uKCJjd21wIiwgImh0dHA6Ly9jd21wLmNvbSIpOwotICAgICAgICAgICAgU09BUEJvZHkgYm9keSA9IGVudmVsb3BlLmdldEJvZHkoKTsKLQotICAgICAgICAgICAgYm9keS5hZGRGYXVsdCgpLmFkZERldGFpbCgpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBib2R5LmdldEZhdWx0KCkuYWRkRGV0YWlsKCk7Ci0gICAgICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgRXhjZXB0aW9uIGRpZCBub3Qgb2NjdXIiKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFNPQVBFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGFzc2VydFRydWUodHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBjYXRjaCAoU09BUEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIEV4Y2VwdGlvbiBPY2N1cnJlZCA6ICIgKyBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIF90ZXN0UXVpY2soKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgTWVzc2FnZUZhY3RvcnkgbXNnZmFjdG9yeSA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIFNPQVBGYWN0b3J5IGZhY3RvcnkgPSBTT0FQRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICBTT0FQTWVzc2FnZSBvdXRwdXRtc2cgPSBtc2dmYWN0b3J5LmNyZWF0ZU1lc3NhZ2UoKTsKLSAgICAgICAgU3RyaW5nIHZhbHVlQ29kZSA9ICJmYXVsdGNvZGUiOwotICAgICAgICBTdHJpbmcgdmFsdWVTdHJpbmcgPSAiZmF1bHRTdHJpbmciOwotICAgICAgICBTT0FQRmF1bHQgZmF1bHQgPSBvdXRwdXRtc2cuZ2V0U09BUFBhcnQoKS5nZXRFbnZlbG9wZSgpLmdldEJvZHkoKS5hZGRGYXVsdCgpOwotICAgICAgICBmYXVsdC5zZXRGYXVsdENvZGUodmFsdWVDb2RlKTsKLSAgICAgICAgZmF1bHQuc2V0RmF1bHRTdHJpbmcodmFsdWVTdHJpbmcpOwotICAgICAgICBEZXRhaWwgZGV0YWlsID0gZmF1bHQuYWRkRGV0YWlsKCk7Ci0gICAgICAgIGRldGFpbC5hZGREZXRhaWxFbnRyeShmYWN0b3J5LmNyZWF0ZU5hbWUoIkhlbGxvIikpOwotICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgaWYgKG91dHB1dG1zZy5zYXZlUmVxdWlyZWQoKSkgewotICAgICAgICAgICAgb3V0cHV0bXNnLnNhdmVDaGFuZ2VzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgb3V0cHV0bXNnLndyaXRlVG8oYmFvcyk7Ci0gICAgICAgIFN0cmluZyB4bWwgPSBuZXcgU3RyaW5nKGJhb3MudG9CeXRlQXJyYXkoKSk7Ci0gICAgICAgIGFzc2VydFRydWUoeG1sLmluZGV4T2YoIkhlbGxvIikgIT0gLTEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RGYXVsdHMoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBNZXNzYWdlRmFjdG9yeSBtZXNzYWdlRmFjdG9yeSA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICBTT0FQRmFjdG9yeSBzb2FwRmFjdG9yeSA9IFNPQVBGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICBTT0FQTWVzc2FnZSBtZXNzYWdlID0gbWVzc2FnZUZhY3RvcnkuY3JlYXRlTWVzc2FnZSgpOwotICAgICAgICAgICAgU09BUEJvZHkgYm9keSA9IG1lc3NhZ2UuZ2V0U09BUEJvZHkoKTsKLSAgICAgICAgICAgIFNPQVBGYXVsdCBmYXVsdCA9IGJvZHkuYWRkRmF1bHQoKTsKLQotICAgICAgICAgICAgTmFtZSBmYXVsdE5hbWUgPQotICAgICAgICAgICAgICAgICAgICBzb2FwRmFjdG9yeS5jcmVhdGVOYW1lKCJDbGllbnQiLCAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT0FQQ29uc3RhbnRzLlVSSV9OU19TT0FQX0VOVkVMT1BFKTsKLSAgICAgICAgICAgIGZhdWx0LnNldEZhdWx0Q29kZShmYXVsdE5hbWUpOwotCi0gICAgICAgICAgICBmYXVsdC5zZXRGYXVsdFN0cmluZygiTWVzc2FnZSBkb2VzIG5vdCBoYXZlIG5lY2Vzc2FyeSBpbmZvIik7Ci0gICAgICAgICAgICBmYXVsdC5zZXRGYXVsdEFjdG9yKCJodHRwOi8vZ2l6bW9zLmNvbS9vcmRlciIpOwotCi0gICAgICAgICAgICBEZXRhaWwgZGV0YWlsID0gZmF1bHQuYWRkRGV0YWlsKCk7Ci0KLSAgICAgICAgICAgIE5hbWUgZW50cnlOYW1lID0KLSAgICAgICAgICAgICAgICAgICAgc29hcEZhY3RvcnkuY3JlYXRlTmFtZSgib3JkZXIiLCAiUE8iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vZ2l6bW9zLmNvbS9vcmRlcnMvIik7Ci0gICAgICAgICAgICBEZXRhaWxFbnRyeSBlbnRyeSA9IGRldGFpbC5hZGREZXRhaWxFbnRyeShlbnRyeU5hbWUpOwotICAgICAgICAgICAgZW50cnkuYWRkVGV4dE5vZGUoIlF1YW50aXR5IGVsZW1lbnQgZG9lcyBub3QgaGF2ZSBhIHZhbHVlIik7Ci0KLSAgICAgICAgICAgIE5hbWUgZW50cnlOYW1lMiA9Ci0gICAgICAgICAgICAgICAgICAgIHNvYXBGYWN0b3J5LmNyZWF0ZU5hbWUoImNvbmZpcm1hdGlvbiIsICJQTyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly9naXptb3MuY29tL2NvbmZpcm0iKTsKLSAgICAgICAgICAgIERldGFpbEVudHJ5IGVudHJ5MiA9IGRldGFpbC5hZGREZXRhaWxFbnRyeShlbnRyeU5hbWUyKTsKLSAgICAgICAgICAgIGVudHJ5Mi5hZGRUZXh0Tm9kZSgiSW5jb21wbGV0ZSBhZGRyZXNzOiAiICsgIm5vIHppcCBjb2RlIik7Ci0KLSAgICAgICAgICAgIG1lc3NhZ2Uuc2F2ZUNoYW5nZXMoKTsKLSAgICAgICAgICAgIC8vbWVzc2FnZS53cml0ZVRvKFN5c3RlbS5vdXQpOwotCi0gICAgICAgICAgICAvLyBOb3cgcmV0cmlldmUgdGhlIFNPQVBGYXVsdCBvYmplY3QgYW5kCi0gICAgICAgICAgICAvLyBpdHMgY29udGVudHMsIGFmdGVyIGNoZWNraW5nIHRvIHNlZSB0aGF0Ci0gICAgICAgICAgICAvLyB0aGVyZSBpcyBvbmUKLSAgICAgICAgICAgIGlmIChib2R5Lmhhc0ZhdWx0KCkpIHsKLSAgICAgICAgICAgICAgICBTT0FQRmF1bHQgbmV3RmF1bHQgPSBib2R5LmdldEZhdWx0KCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIHF1YWxpZmllZCBuYW1lIG9mIHRoZSBmYXVsdCBjb2RlCi0gICAgICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChuZXdGYXVsdC5nZXRGYXVsdENvZGVBc05hbWUoKSk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChuZXdGYXVsdC5nZXRGYXVsdFN0cmluZygpKTsKLSAgICAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKG5ld0ZhdWx0LmdldEZhdWx0QWN0b3IoKSk7Ci0gICAgICAgICAgICAgICAgRGV0YWlsIG5ld0RldGFpbCA9IG5ld0ZhdWx0LmdldERldGFpbCgpOwotCi0gICAgICAgICAgICAgICAgaWYgKG5ld0RldGFpbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGVudHJpZXMgPSBuZXdEZXRhaWwuZ2V0RGV0YWlsRW50cmllcygpOwotCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlIChlbnRyaWVzLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgRGV0YWlsRW50cnkgbmV3RW50cnkgPSAoRGV0YWlsRW50cnkpZW50cmllcy5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBuZXdFbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCh2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIEV4Y2VwdGlvbiA6ICIgKyBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRGYXVsdEFjdG9yKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgU09BUE1lc3NhZ2UgbXNnID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoKS5jcmVhdGVNZXNzYWdlKCk7Ci0gICAgICAgICAgICBTT0FQRmF1bHQgc2YgPSBtc2cuZ2V0U09BUEJvZHkoKS5hZGRGYXVsdCgpOwotICAgICAgICAgICAgc2Yuc2V0RmF1bHRBY3RvcigiL2ZhdWx0QWN0b3JVUkkiKTsKLSAgICAgICAgICAgIHNmLnNldEZhdWx0QWN0b3IoIi9mYXVsdEFjdG9yVVJJMiIpOwotICAgICAgICAgICAgU3RyaW5nIHJlc3VsdCA9IHNmLmdldEZhdWx0QWN0b3IoKTsKLQotICAgICAgICAgICAgaWYgKCFyZXN1bHQuZXF1YWxzKCIvZmF1bHRBY3RvclVSSTIiKSkgewotICAgICAgICAgICAgICAgIGZhaWwoIkZhdWx0IEFjdG9yIG5vdCBwcm9wZXJseSBzZXQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgRXhjZXB0aW9uIDogIiArIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEdldEZhdWx0U3RyaW5nKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgU09BUE1lc3NhZ2UgbXNnID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoKS5jcmVhdGVNZXNzYWdlKCk7Ci0gICAgICAgICAgICBTT0FQRmF1bHQgc2YgPSBtc2cuZ2V0U09BUEJvZHkoKS5hZGRGYXVsdCgpOwotCi0gICAgICAgICAgICBzZi5zZXRGYXVsdFN0cmluZygiMXN0IEZhdWx0IFN0cmluZyIpOwotICAgICAgICAgICAgc2Yuc2V0RmF1bHRTdHJpbmcoIjJuZCBGYXVsdCBTdHJpbmciKTsKLSAgICAgICAgICAgIFN0cmluZyByZXN1bHQgPSBzZi5nZXRGYXVsdFN0cmluZygpOwotCi0gICAgICAgICAgICBpZiAoIXJlc3VsdC5lcXVhbHMoIjJuZCBGYXVsdCBTdHJpbmciKSkgewotICAgICAgICAgICAgICAgIGZhaWwoIkZhdWx0IFN0cmluZyBub3QgcHJvcGVybHkgc2V0Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIEV4Y2VwdGlvbiA6ICIgKyBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBcHBlbmRTdWJDb2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE1lc3NhZ2VGYWN0b3J5IGZhYyA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKFNPQVBDb25zdGFudHMuU09BUF8xXzJfUFJPVE9DT0wpOwotICAgICAgICBTT0FQTWVzc2FnZSBzb2FwTWVzc2FnZSA9IGZhYy5jcmVhdGVNZXNzYWdlKCk7Ci0gICAgICAgIFNPQVBQYXJ0IHNvYXBQYXJ0ID0gc29hcE1lc3NhZ2UuZ2V0U09BUFBhcnQoKTsKLSAgICAgICAgU09BUEVudmVsb3BlIGVudmVsb3BlID0gc29hcFBhcnQuZ2V0RW52ZWxvcGUoKTsKLSAgICAgICAgZW52ZWxvcGUuYWRkTmFtZXNwYWNlRGVjbGFyYXRpb24oImN3bXAiLCAiaHR0cDovL2N3bXAuY29tIik7Ci0gICAgICAgIFNPQVBCb2R5IGJvZHkgPSBlbnZlbG9wZS5nZXRCb2R5KCk7Ci0gICAgICAgIFNPQVBGYXVsdCBzb2FwRmF1bHQgPSBib2R5LmFkZEZhdWx0KCk7Ci0gICAgICAgIFFOYW1lIHFuYW1lID0gbmV3IFFOYW1lKCJodHRwOi8vZXhhbXBsZS5jb20iLCAibXlmYXVsdDEiLCAiZmx0MSIpOwotICAgICAgICBzb2FwRmF1bHQuYXBwZW5kRmF1bHRTdWJjb2RlKHFuYW1lKTsKLQotICAgICAgICBRTmFtZSBxbmFtZTIgPSBuZXcgUU5hbWUoImh0dHA6Ly9leGFtcGxlMi5jb20iLCAibXlmYXVsdDIiLCAiZmx0MiIpOwotICAgICAgICBzb2FwRmF1bHQuYXBwZW5kRmF1bHRTdWJjb2RlKHFuYW1lMik7Ci0KLSAgICAgICAgUU5hbWUgcW5hbWUzID0gbmV3IFFOYW1lKCJodHRwOi8vZXhhbXBsZTMuY29tIiwgIm15ZmF1bHQzIiwgImZsdDMiKTsKLSAgICAgICAgc29hcEZhdWx0LmFwcGVuZEZhdWx0U3ViY29kZShxbmFtZTMpOwotCi0gICAgICAgIHNvYXBNZXNzYWdlLnNhdmVDaGFuZ2VzKCk7Ci0KLSAgICAgICAgSXRlcmF0b3IgZmF1bHRTdWJDb2RlcyA9IHNvYXBGYXVsdC5nZXRGYXVsdFN1YmNvZGVzKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZmF1bHRTdWJDb2Rlcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEFwcGVuZEZhdWx0U3ViQ29kZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBNZXNzYWdlRmFjdG9yeSBmYWMgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZShTT0FQQ29uc3RhbnRzLlNPQVBfMV8yX1BST1RPQ09MKTsKLSAgICAgICAgU09BUE1lc3NhZ2Ugc29hcE1lc3NhZ2UgPSBmYWMuY3JlYXRlTWVzc2FnZSgpOwotICAgICAgICBTT0FQUGFydCBzb2FwUGFydCA9IHNvYXBNZXNzYWdlLmdldFNPQVBQYXJ0KCk7Ci0gICAgICAgIFNPQVBFbnZlbG9wZSBlbnZlbG9wZSA9IHNvYXBQYXJ0LmdldEVudmVsb3BlKCk7Ci0gICAgICAgIGVudmVsb3BlLmFkZE5hbWVzcGFjZURlY2xhcmF0aW9uKCJjd21wIiwgImh0dHA6Ly9jd21wLmNvbSIpOwotICAgICAgICBTT0FQQm9keSBib2R5ID0gZW52ZWxvcGUuZ2V0Qm9keSgpOwotICAgICAgICBTT0FQRmF1bHQgc2YgPSBib2R5LmFkZEZhdWx0KCk7Ci0KLSAgICAgICAgUU5hbWUgZXhwZWN0ZWQxID0gbmV3IFFOYW1lKCJodHRwOi8vZXhhbXBsZS5jb20iLCAibXlmYXVsdDEiLCAiZmx0MSIpOwotICAgICAgICBRTmFtZSBleHBlY3RlZDIgPSBuZXcgUU5hbWUoImh0dHA6Ly9leGFtcGxlLmNvbSIsICJteWZhdWx0MiIsICJmbHQyIik7Ci0gICAgICAgIGJvb2xlYW4gZm91bmQxID0gZmFsc2U7Ci0gICAgICAgIGJvb2xlYW4gZm91bmQyID0gZmFsc2U7Ci0KLSAgICAgICAgLy9BcHBlbmRpbmcgZmF1bHQgU3ViY29kZQotICAgICAgICBzZi5hcHBlbmRGYXVsdFN1YmNvZGUoZXhwZWN0ZWQxKTsKLSAgICAgICAgLy9BcHBlbmRpbmcgYSBzZWNvbmQgZmF1bHQgU3ViY29kZQotICAgICAgICBzZi5hcHBlbmRGYXVsdFN1YmNvZGUoZXhwZWN0ZWQyKTsKLQotICAgICAgICAvL0dldHRpbmcgRmF1bHRTdWJDb2RlcyBmcm9tIFNPQVBGYXVsdAotICAgICAgICBJdGVyYXRvciBpID0gc2YuZ2V0RmF1bHRTdWJjb2RlcygpOwotICAgICAgICBpbnQgaiA9IDA7Ci0gICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkgewotICAgICAgICAgICAgT2JqZWN0IG8gPSBpLm5leHQoKTsKLSAgICAgICAgICAgIGlmIChvICE9IG51bGwgJiYgbyBpbnN0YW5jZW9mIFFOYW1lKSB7Ci0gICAgICAgICAgICAgICAgUU5hbWUgYWN0dWFsID0gKFFOYW1lKW87Ci0gICAgICAgICAgICAgICAgaWYgKGFjdHVhbC5lcXVhbHMoZXhwZWN0ZWQxKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQxID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJTdWJjb2RlPSAnIithY3R1YWwrIiciKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJSZWNlaXZlZCBhIGR1cGxpY2F0ZSBTdWJjb2RlIDonIithY3R1YWwrIiciKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0dWFsLmVxdWFscyhleHBlY3RlZDIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3VuZDIgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIlN1YmNvZGU9ICciK2FjdHVhbCsiJyIpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIlJlY2VpdmVkIGEgZHVwbGljYXRlIFN1YmNvZGUgOiciK2FjdHVhbCsiJyIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaisrOwotICAgICAgICB9Ci0gICAgICAgIGlmIChqIDwgMSkgewotICAgICAgICAgICAgZmFpbCgiTm8gU3ViY29kZSB3YXMgcmV0dXJuZWQiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaiA+IDIpIHsKLSAgICAgICAgICAgIGZhaWwoIk1vcmUgdGhhbiB0d28gU3ViY29kZXMgd2VyZSByZXR1cm5lZCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmICghZm91bmQxKSB7Ci0gICAgICAgICAgICBmYWlsKCJUaGUgZm9sbG93aW5nIFN1YmNvZGUgd2FzIG5vdCByZWNlaXZlZDogJyIgKyBleHBlY3RlZDEgKyAiJyIpOwotICAgICAgICB9Ci0gICAgICAgIGlmICghZm91bmQyKSB7Ci0gICAgICAgICAgICBmYWlsKCJUaGUgZm9sbG93aW5nIFN1YmNvZGUgd2FzIG5vdCByZWNlaXZlZDogJyIgKyBleHBlY3RlZDIgKyAiJyIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgX3Rlc3RHZXRGYXVsdFJlYXNvblRleHRzKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkgZmFjID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoU09BUENvbnN0YW50cy5TT0FQXzFfMl9QUk9UT0NPTCk7Ci0KLSAgICAgICAgICAgIFNPQVBNZXNzYWdlIHNvYXBNZXNzYWdlID0gZmFjLmNyZWF0ZU1lc3NhZ2UoKTsKLSAgICAgICAgICAgIFNPQVBQYXJ0IHNvYXBQYXJ0ID0gc29hcE1lc3NhZ2UuZ2V0U09BUFBhcnQoKTsKLQotICAgICAgICAgICAgU09BUEVudmVsb3BlIGVudmVsb3BlID0gc29hcFBhcnQuZ2V0RW52ZWxvcGUoKTsKLSAgICAgICAgICAgIGVudmVsb3BlLmFkZE5hbWVzcGFjZURlY2xhcmF0aW9uKCJjd21wIiwgImh0dHA6Ly9jd21wLmNvbSIpOwotICAgICAgICAgICAgU09BUEJvZHkgYm9keSA9IGVudmVsb3BlLmdldEJvZHkoKTsKLSAgICAgICAgICAgIFNPQVBGYXVsdCBzb2FwRmF1bHQgPSBib2R5LmFkZEZhdWx0KCk7Ci0gICAgICAgICAgICBzb2FwRmF1bHQuYWRkRmF1bHRSZWFzb25UZXh0KCJteVJlYXNvbiIsIG5ldyBMb2NhbGUoImVuIikpOwotICAgICAgICAgICAgc29hcEZhdWx0LmFkZEZhdWx0UmVhc29uVGV4dCgiZGUtbXlSZWFzb24iLCBuZXcgTG9jYWxlKCJkZSIpKTsKLSAgICAgICAgICAgIHNvYXBGYXVsdC5hZGRGYXVsdFJlYXNvblRleHQoInNpLW15UmVhc29uIiwgbmV3IExvY2FsZSgic2kiKSk7Ci0gICAgICAgICAgICBzb2FwTWVzc2FnZS5zYXZlQ2hhbmdlcygpOwotICAgICAgICAgICAgSXRlcmF0b3IgcmVhc29uVGV4dHMgPSBzb2FwRmF1bHQuZ2V0RmF1bHRSZWFzb25UZXh0cygpOwotICAgICAgICAgICAgd2hpbGUgKHJlYXNvblRleHRzLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyByZWFzb25UZXh0ID0gKFN0cmluZylyZWFzb25UZXh0cy5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChyZWFzb25UZXh0KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBFeGNlcHRpb24gOiAiICsgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBfdGVzdEFkZEZhdWx0UmVhc29uVGV4dDEoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBNZXNzYWdlRmFjdG9yeSBmYWMgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgU09BUE1lc3NhZ2Ugc29hcE1lc3NhZ2UgPSBmYWMuY3JlYXRlTWVzc2FnZSgpOwotICAgICAgICAgICAgU09BUFBhcnQgc29hcFBhcnQgPSBzb2FwTWVzc2FnZS5nZXRTT0FQUGFydCgpOwotCi0gICAgICAgICAgICBTT0FQRW52ZWxvcGUgZW52ZWxvcGUgPSBzb2FwUGFydC5nZXRFbnZlbG9wZSgpOwotICAgICAgICAgICAgZW52ZWxvcGUuYWRkTmFtZXNwYWNlRGVjbGFyYXRpb24oImN3bXAiLCAiaHR0cDovL2N3bXAuY29tIik7Ci0gICAgICAgICAgICBTT0FQQm9keSBib2R5ID0gZW52ZWxvcGUuZ2V0Qm9keSgpOwotICAgICAgICAgICAgU09BUEZhdWx0IHNvYXBGYXVsdCA9IGJvZHkuYWRkRmF1bHQoKTsKLSAgICAgICAgICAgIHNvYXBGYXVsdC5hZGRGYXVsdFJlYXNvblRleHQoIm15UmVhc29uIiwgTG9jYWxlLkVOR0xJU0gpOwotICAgICAgICAgICAgc29hcE1lc3NhZ2Uuc2F2ZUNoYW5nZXMoKTsKLQotICAgICAgICB9IGNhdGNoIChTT0FQRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgRXhjZXB0aW9uIE9jY3VycmVkIDogIiArIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEFkZEZhdWx0UmVhc29uVGV4dDIoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBNZXNzYWdlRmFjdG9yeSBmYWMgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZShTT0FQQ29uc3RhbnRzLlNPQVBfMV8yX1BST1RPQ09MKTsKLSAgICAgICAgICAgIFNPQVBNZXNzYWdlIHNvYXBNZXNzYWdlID0gZmFjLmNyZWF0ZU1lc3NhZ2UoKTsKLSAgICAgICAgICAgIFNPQVBQYXJ0IHNvYXBQYXJ0ID0gc29hcE1lc3NhZ2UuZ2V0U09BUFBhcnQoKTsKLQotICAgICAgICAgICAgU09BUEVudmVsb3BlIGVudmVsb3BlID0gc29hcFBhcnQuZ2V0RW52ZWxvcGUoKTsKLSAgICAgICAgICAgIGVudmVsb3BlLmFkZE5hbWVzcGFjZURlY2xhcmF0aW9uKCJjd21wIiwgImh0dHA6Ly9jd21wLmNvbSIpOwotICAgICAgICAgICAgU09BUEJvZHkgYm9keSA9IGVudmVsb3BlLmdldEJvZHkoKTsKLSAgICAgICAgICAgIFNPQVBGYXVsdCBzb2FwRmF1bHQgPSBib2R5LmFkZEZhdWx0KCk7Ci0gICAgICAgICAgICBzb2FwRmF1bHQuYWRkRmF1bHRSZWFzb25UZXh0KCJteVJlYXNvbiIsIG5ldyBMb2NhbGUoImVuIikpOwotICAgICAgICAgICAgc29hcEZhdWx0LmFkZEZhdWx0UmVhc29uVGV4dCgiZGUtbXlSZWFzb24iLCBuZXcgTG9jYWxlKCJkZSIpKTsKLSAgICAgICAgICAgIHNvYXBGYXVsdC5hZGRGYXVsdFJlYXNvblRleHQoInNpLW15UmVhc29uIiwgbmV3IExvY2FsZSgic2kiKSk7Ci0gICAgICAgICAgICBzb2FwTWVzc2FnZS5zYXZlQ2hhbmdlcygpOwotCi0gICAgICAgIH0gY2F0Y2ggKFNPQVBFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBFeGNlcHRpb24gT2NjdXJyZWQgOiAiICsgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkRmF1bHRSZWFzb25UZXh0MygpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5IGZhYyA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKFNPQVBDb25zdGFudHMuU09BUF8xXzJfUFJPVE9DT0wpOwotICAgICAgICAgICAgU09BUE1lc3NhZ2Ugc29hcE1lc3NhZ2UgPSBmYWMuY3JlYXRlTWVzc2FnZSgpOwotICAgICAgICAgICAgU09BUFBhcnQgc29hcFBhcnQgPSBzb2FwTWVzc2FnZS5nZXRTT0FQUGFydCgpOwotCi0gICAgICAgICAgICBTT0FQRW52ZWxvcGUgZW52ZWxvcGUgPSBzb2FwUGFydC5nZXRFbnZlbG9wZSgpOwotICAgICAgICAgICAgU09BUEJvZHkgYm9keSA9IGVudmVsb3BlLmdldEJvZHkoKTsKLSAgICAgICAgICAgIFNPQVBGYXVsdCBzZiA9IGJvZHkuYWRkRmF1bHQoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgU3RyaW5nIGV4cGVjdGVkID0gIkl0cyBteSBmYXVsdCBhZ2FpbiI7Ci0gICAgICAgICAgICBib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0gICAgICAgICAgICBzZi5hZGRGYXVsdFJlYXNvblRleHQoIkl0cyBteSBmYXVsdCIsIExvY2FsZS5FTkdMSVNIKTsKLSAgICAgICAgICAgIHNmLmFkZEZhdWx0UmVhc29uVGV4dChleHBlY3RlZCwgTG9jYWxlLkVOR0xJU0gpOwotICAgICAgICAgICAgSXRlcmF0b3IgaSA9IHNmLmdldEZhdWx0UmVhc29uVGV4dHMoKTsKLSAgICAgICAgICAgIGludCBqID0gMDsKLSAgICAgICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIE9iamVjdCBvID0gaS5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKG8gIT0gbnVsbCAmJiBvIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBhY3R1YWwgPSAoU3RyaW5nKW87Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhY3R1YWwuZXF1YWxzKGV4cGVjdGVkKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBqKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoaiA8IDEpIHsKLSAgICAgICAgICAgICAgICBmYWlsKCJObyByZWFzb24gdGV4dCB3YXMgcmV0dXJuZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChqID4gMSkgewotICAgICAgICAgICAgICAgIGZhaWwoIk1vcmUgdGhhbiBvbmUgcmVhc29uIHRleHQgd2FzIHJldHVybmVkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWZvdW5kKSB7Ci0gICAgICAgICAgICAgICAgZmFpbCgiVGhlIGZvbGxvd2luZyBSZWFzb24gdGV4dCB3YXMgbm90IHJlY2VpdmVkOiAnIiArIGV4cGVjdGVkICsgIiciKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoU09BUEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIEV4Y2VwdGlvbiBPY2N1cnJlZCA6ICIgKyBlKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgdGVzdEFkZEZhdWx0UmVhc29uVGV4dDQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgTWVzc2FnZUZhY3RvcnkgZmFjID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoU09BUENvbnN0YW50cy5TT0FQXzFfMl9QUk9UT0NPTCk7Ci0gICAgICAgIFNPQVBNZXNzYWdlIHNvYXBNZXNzYWdlID0gZmFjLmNyZWF0ZU1lc3NhZ2UoKTsKLSAgICAgICAgU09BUFBhcnQgc29hcFBhcnQgPSBzb2FwTWVzc2FnZS5nZXRTT0FQUGFydCgpOwotICAgICAgICBTT0FQRW52ZWxvcGUgZW52ZWxvcGUgPSBzb2FwUGFydC5nZXRFbnZlbG9wZSgpOwotICAgICAgICBTT0FQQm9keSBib2R5ID0gZW52ZWxvcGUuZ2V0Qm9keSgpOwotICAgICAgICBTT0FQRmF1bHQgc2YgPSBib2R5LmFkZEZhdWx0KCk7Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgZXhwZWN0ZWQxID0gIkl0cyBteSBmYXVsdCI7Ci0gICAgICAgIFN0cmluZyBleHBlY3RlZDIgPSAiSXRzIG15IGZhdWx0IGFnYWluIjsKLQotICAgICAgICBib29sZWFuIGZvdW5kMSA9IGZhbHNlOwotICAgICAgICBib29sZWFuIGZvdW5kMiA9IGZhbHNlOwotICAgICAgICBzZi5hZGRGYXVsdFJlYXNvblRleHQoZXhwZWN0ZWQxLCBMb2NhbGUuVUspOwotICAgICAgICBzZi5hZGRGYXVsdFJlYXNvblRleHQoZXhwZWN0ZWQyLCBMb2NhbGUuRU5HTElTSCk7Ci0gICAgICAgIEl0ZXJhdG9yIGkgPSBzZi5nZXRGYXVsdFJlYXNvblRleHRzKCk7Ci0gICAgICAgIGludCBqID0gMDsKLSAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBPYmplY3QgbyA9IGkubmV4dCgpOwotICAgICAgICAgICAgaWYgKG8gIT0gbnVsbCAmJiBvIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGFjdHVhbCA9IChTdHJpbmcpbzsKLSAgICAgICAgICAgICAgICBpZiAoYWN0dWFsLmVxdWFscyhleHBlY3RlZDEpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3VuZDEgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhY3R1YWwuZXF1YWxzKGV4cGVjdGVkMikpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZDIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kMiA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBqKys7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGogPCAxKSB7Ci0gICAgICAgICAgICBmYWlsKCJObyByZWFzb24gdGV4dCB3YXMgcmV0dXJuZWQiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaiA+IDIpIHsKLSAgICAgICAgICAgIGZhaWwoIk1vcmUgdGhhbiB0d28gcmVhc29uIHRleHRzIHdlcmUgcmV0dXJuZWQiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIWZvdW5kMSkgewotICAgICAgICAgICAgZmFpbCgiVGhlIGZvbGxvd2luZyBSZWFzb24gdGV4dCB3YXMgbm90IHJlY2VpdmVkOiAnIiArIGV4cGVjdGVkMSArICInIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFmb3VuZDIpIHsKLSAgICAgICAgICAgIGZhaWwoIlRoZSBmb2xsb3dpbmcgUmVhc29uIHRleHQgd2FzIG5vdCByZWNlaXZlZDogJyIgKyBleHBlY3RlZDIgKyAiJyIpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0RmF1bHRSb2xlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkgZmFjID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoU09BUENvbnN0YW50cy5TT0FQXzFfMl9QUk9UT0NPTCk7Ci0KLSAgICAgICAgICAgIFNPQVBNZXNzYWdlIHNvYXBNZXNzYWdlID0gZmFjLmNyZWF0ZU1lc3NhZ2UoKTsKLSAgICAgICAgICAgIFNPQVBQYXJ0IHNvYXBQYXJ0ID0gc29hcE1lc3NhZ2UuZ2V0U09BUFBhcnQoKTsKLQotICAgICAgICAgICAgU09BUEVudmVsb3BlIGVudmVsb3BlID0gc29hcFBhcnQuZ2V0RW52ZWxvcGUoKTsKLSAgICAgICAgICAgIGVudmVsb3BlLmFkZE5hbWVzcGFjZURlY2xhcmF0aW9uKCJjd21wIiwgImh0dHA6Ly9jd21wLmNvbSIpOwotICAgICAgICAgICAgU09BUEJvZHkgYm9keSA9IGVudmVsb3BlLmdldEJvZHkoKTsKLSAgICAgICAgICAgIFNPQVBGYXVsdCBzb2FwRmF1bHQgPSBib2R5LmFkZEZhdWx0KCk7Ci0gICAgICAgICAgICBzb2FwRmF1bHQuc2V0RmF1bHRSb2xlKCJ0ZXN0Iik7Ci0gICAgICAgICAgICBzb2FwTWVzc2FnZS5zYXZlQ2hhbmdlcygpOwotCi0gICAgICAgIH0gY2F0Y2ggKFNPQVBFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBFeGNlcHRpb24gT2NjdXJyZWQgOiAiICsgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0RmF1bHROb2RlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkgZmFjID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoU09BUENvbnN0YW50cy5TT0FQXzFfMl9QUk9UT0NPTCk7Ci0KLSAgICAgICAgICAgIFNPQVBNZXNzYWdlIHNvYXBNZXNzYWdlID0gZmFjLmNyZWF0ZU1lc3NhZ2UoKTsKLSAgICAgICAgICAgIFNPQVBQYXJ0IHNvYXBQYXJ0ID0gc29hcE1lc3NhZ2UuZ2V0U09BUFBhcnQoKTsKLQotICAgICAgICAgICAgU09BUEVudmVsb3BlIGVudmVsb3BlID0gc29hcFBhcnQuZ2V0RW52ZWxvcGUoKTsKLSAgICAgICAgICAgIGVudmVsb3BlLmFkZE5hbWVzcGFjZURlY2xhcmF0aW9uKCJjd21wIiwgImh0dHA6Ly9jd21wLmNvbSIpOwotICAgICAgICAgICAgU09BUEJvZHkgYm9keSA9IGVudmVsb3BlLmdldEJvZHkoKTsKLSAgICAgICAgICAgIFNPQVBGYXVsdCBzb2FwRmF1bHQgPSBib2R5LmFkZEZhdWx0KCk7Ci0gICAgICAgICAgICBzb2FwRmF1bHQuc2V0RmF1bHROb2RlKCJ0ZXN0Iik7Ci0gICAgICAgICAgICBzb2FwTWVzc2FnZS5zYXZlQ2hhbmdlcygpOwotCi0gICAgICAgIH0gY2F0Y2ggKFNPQVBFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBFeGNlcHRpb24gT2NjdXJyZWQgOiAiICsgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBfdGVzdEdldEZhdWx0UmVhc29uVGV4dCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5IGZhYyA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKFNPQVBDb25zdGFudHMuU09BUF8xXzJfUFJPVE9DT0wpOwotCi0gICAgICAgICAgICBTT0FQTWVzc2FnZSBzb2FwTWVzc2FnZSA9IGZhYy5jcmVhdGVNZXNzYWdlKCk7Ci0gICAgICAgICAgICBTT0FQUGFydCBzb2FwUGFydCA9IHNvYXBNZXNzYWdlLmdldFNPQVBQYXJ0KCk7Ci0KLSAgICAgICAgICAgIFNPQVBFbnZlbG9wZSBlbnZlbG9wZSA9IHNvYXBQYXJ0LmdldEVudmVsb3BlKCk7Ci0gICAgICAgICAgICBlbnZlbG9wZS5hZGROYW1lc3BhY2VEZWNsYXJhdGlvbigiY3dtcCIsICJodHRwOi8vY3dtcC5jb20iKTsKLSAgICAgICAgICAgIFNPQVBCb2R5IGJvZHkgPSBlbnZlbG9wZS5nZXRCb2R5KCk7Ci0gICAgICAgICAgICBTT0FQRmF1bHQgc29hcEZhdWx0ID0gYm9keS5hZGRGYXVsdCgpOwotICAgICAgICAgICAgc29hcEZhdWx0LmFkZEZhdWx0UmVhc29uVGV4dCgibXlSZWFzb24iLCBuZXcgTG9jYWxlKCJlbiIpKTsKLSAgICAgICAgICAgIHNvYXBGYXVsdC5hZGRGYXVsdFJlYXNvblRleHQoImRlLW15UmVhc29uIiwgbmV3IExvY2FsZSgiZGUiKSk7Ci0gICAgICAgICAgICBzb2FwRmF1bHQuYWRkRmF1bHRSZWFzb25UZXh0KCJzaS1teVJlYXNvbiIsIG5ldyBMb2NhbGUoInNpIikpOwotICAgICAgICAgICAgc29hcE1lc3NhZ2Uuc2F2ZUNoYW5nZXMoKTsKLQotICAgICAgICAgICAgU3RyaW5nIGZhdWx0UmVhc29uVGV4dCA9IHNvYXBGYXVsdC5nZXRGYXVsdFJlYXNvblRleHQobmV3IExvY2FsZSgic2kiKSk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGZhdWx0UmVhc29uVGV4dCk7Ci0gICAgICAgICAgICBmYXVsdFJlYXNvblRleHQgPSBzb2FwRmF1bHQuZ2V0RmF1bHRSZWFzb25UZXh0KG5ldyBMb2NhbGUoImphIikpOwotICAgICAgICAgICAgYXNzZXJ0TnVsbChmYXVsdFJlYXNvblRleHQpOwotICAgICAgICAgICAgCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIEV4Y2VwdGlvbiA6ICIgKyBlKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgX3Rlc3RHZXRGYXVsdENvZGVBc1FOYW1lKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy9NZXNzYWdlRmFjdG9yeSBmYWMgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZShTT0FQQ29uc3RhbnRzLlNPQVBfMV8yX1BST1RPQ09MKTsKLSAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5IGZhYyA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0KLSAgICAgICAgICAgIFNPQVBNZXNzYWdlIHNvYXBNZXNzYWdlID0gZmFjLmNyZWF0ZU1lc3NhZ2UoKTsKLSAgICAgICAgICAgIFNPQVBQYXJ0IHNvYXBQYXJ0ID0gc29hcE1lc3NhZ2UuZ2V0U09BUFBhcnQoKTsKLQotICAgICAgICAgICAgU09BUEVudmVsb3BlIGVudmVsb3BlID0gc29hcFBhcnQuZ2V0RW52ZWxvcGUoKTsKLSAgICAgICAgICAgIGVudmVsb3BlLmFkZE5hbWVzcGFjZURlY2xhcmF0aW9uKCJjd21wIiwgImh0dHA6Ly9jd21wLmNvbSIpOwotICAgICAgICAgICAgU09BUEJvZHkgYm9keSA9IGVudmVsb3BlLmdldEJvZHkoKTsKLSAgICAgICAgICAgIFNPQVBGYXVsdCBzb2FwRmF1bHQgPSBib2R5LmFkZEZhdWx0KCk7Ci0gICAgICAgICAgICBzb2FwRmF1bHQuYWRkRmF1bHRSZWFzb25UZXh0KCJteVJlYXNvbiIsIG5ldyBMb2NhbGUoImVuIikpOwotICAgICAgICAgICAgc29hcEZhdWx0LnNldEZhdWx0Q29kZSgibXljb2RlIik7Ci0gICAgICAgICAgICBzb2FwTWVzc2FnZS5zYXZlQ2hhbmdlcygpOwotCi0gICAgICAgICAgICBRTmFtZSBxbmFtZSA9IHNvYXBGYXVsdC5nZXRGYXVsdENvZGVBc1FOYW1lKCk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHFuYW1lKTsKLQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBFeGNlcHRpb24gOiAiICsgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SGFzRGV0YWlsKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkgZmFjID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoU09BUENvbnN0YW50cy5TT0FQXzFfMl9QUk9UT0NPTCk7Ci0gICAgICAgICAgICAvL01lc3NhZ2VGYWN0b3J5IGZhYyA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0KLSAgICAgICAgICAgIFNPQVBNZXNzYWdlIHNvYXBNZXNzYWdlID0gZmFjLmNyZWF0ZU1lc3NhZ2UoKTsKLSAgICAgICAgICAgIFNPQVBQYXJ0IHNvYXBQYXJ0ID0gc29hcE1lc3NhZ2UuZ2V0U09BUFBhcnQoKTsKLQotICAgICAgICAgICAgU09BUEVudmVsb3BlIGVudmVsb3BlID0gc29hcFBhcnQuZ2V0RW52ZWxvcGUoKTsKLSAgICAgICAgICAgIGVudmVsb3BlLmFkZE5hbWVzcGFjZURlY2xhcmF0aW9uKCJjd21wIiwgImh0dHA6Ly9jd21wLmNvbSIpOwotICAgICAgICAgICAgU09BUEJvZHkgYm9keSA9IGVudmVsb3BlLmdldEJvZHkoKTsKLSAgICAgICAgICAgIFNPQVBGYXVsdCBzb2FwRmF1bHQgPSBib2R5LmFkZEZhdWx0KCk7Ci0gICAgICAgICAgICBEZXRhaWwgZGV0YWlsID0gc29hcEZhdWx0LmFkZERldGFpbCgpOwotICAgICAgICAgICAgZGV0YWlsLnNldEF0dHJpYnV0ZSgidGVzdCIsICJteXZhbHVlIik7Ci0gICAgICAgICAgICBzb2FwTWVzc2FnZS5zYXZlQ2hhbmdlcygpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBFeGNlcHRpb24gOiAiICsgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmF1bHRSZWFzb25Mb2NhbGVzKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkgZmFjID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoU09BUENvbnN0YW50cy5TT0FQXzFfMl9QUk9UT0NPTCk7Ci0gICAgICAgICAgICBTT0FQTWVzc2FnZSBzb2FwTWVzc2FnZSA9IGZhYy5jcmVhdGVNZXNzYWdlKCk7Ci0gICAgICAgICAgICBTT0FQUGFydCBzb2FwUGFydCA9IHNvYXBNZXNzYWdlLmdldFNPQVBQYXJ0KCk7Ci0gICAgICAgICAgICBTT0FQRW52ZWxvcGUgZW52ZWxvcGUgPSBzb2FwUGFydC5nZXRFbnZlbG9wZSgpOwotICAgICAgICAgICAgU09BUEJvZHkgYm9keSA9IGVudmVsb3BlLmdldEJvZHkoKTsKLSAgICAgICAgICAgIC8vU09BUEZhdWx0IHNmID0gYm9keS5hZGRGYXVsdCgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBMb2NhbGUgZXhwZWN0ZWQxID0gTG9jYWxlLkVOR0xJU0g7Ci0gICAgICAgICAgICBMb2NhbGUgZXhwZWN0ZWQyID0gTG9jYWxlLlVLOwotICAgICAgICAgICAgTG9jYWxlIGV4cGVjdGVkMyA9IExvY2FsZS5HRVJNQU47Ci0gICAgICAgICAgICBib29sZWFuIGZvdW5kMSA9IGZhbHNlOwotICAgICAgICAgICAgYm9vbGVhbiBmb3VuZDIgPSBmYWxzZTsKLSAgICAgICAgICAgIGJvb2xlYW4gZm91bmQzID0gZmFsc2U7Ci0KLSAgICAgICAgICAgIFNPQVBGYXVsdCBzZiA9IGJvZHkuYWRkRmF1bHQoU09BUENvbnN0YW50cy5TT0FQX1JFQ0VJVkVSX0ZBVUxULCAiSXRzIG15IGZhdWx0MSIsIGV4cGVjdGVkMSk7Ci0gICAgICAgICAgICBzZi5hZGRGYXVsdFJlYXNvblRleHQoIkl0cyBteSBmYXVsdDEiLCBleHBlY3RlZDEpOwotICAgICAgICAgICAgc2YuYWRkRmF1bHRSZWFzb25UZXh0KCJJdHMgbXkgZmF1bHQyIiwgZXhwZWN0ZWQyKTsKLSAgICAgICAgICAgIHNmLmFkZEZhdWx0UmVhc29uVGV4dCgiSXRzIG15IGZhdWx0MyIsIGV4cGVjdGVkMyk7Ci0gICAgICAgICAgICBJdGVyYXRvciBpID0gc2YuZ2V0RmF1bHRSZWFzb25Mb2NhbGVzKCk7Ci0KLSAgICAgICAgICAgIGludCBsb2NhbGVDb3VudCA9IDA7Ci0gICAgICAgICAgICB3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBsb2NhbGVDb3VudCsrOwotICAgICAgICAgICAgICAgIGkubmV4dCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpID0gc2YuZ2V0RmF1bHRSZWFzb25Mb2NhbGVzKCk7Ci0gICAgICAgICAgICBpbnQgaiA9IDA7Ci0gICAgICAgICAgICB3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBPYmplY3QgbyA9IGkubmV4dCgpOwotICAgICAgICAgICAgICAgIGlmIChvIGluc3RhbmNlb2YgTG9jYWxlKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvY2FsZSBhY3R1YWwgPSAoTG9jYWxlKW87Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhY3R1YWwgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjdHVhbC5lcXVhbHMoZXhwZWN0ZWQxKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kMSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhY3R1YWwuZXF1YWxzKGV4cGVjdGVkMikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kMikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZDIgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0dWFsLmVxdWFscyhleHBlY3RlZDMpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZDMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaisrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGogPCAxKSB7Ci0gICAgICAgICAgICAgICAgZmFpbCgiTm8gcmVhc29uIHRleHQgd2FzIHJldHVybmVkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoaiA+IDMpIHsKLSAgICAgICAgICAgICAgICBmYWlsKCJNb3JlIHRoYW4gMyBMb2NhbGVzIHdlcmUgcmV0dXJuZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghZm91bmQxKSB7Ci0gICAgICAgICAgICAgICAgZmFpbCgiVGhlIGZvbGxvd2luZyBMb2NhbGUgd2FzIG5vdCByZWNlaXZlZDogJyIgKyBleHBlY3RlZDEgKyAiJyIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFmb3VuZDIpIHsKLSAgICAgICAgICAgICAgICBmYWlsKCJUaGUgZm9sbG93aW5nIExvY2FsZSB3YXMgbm90IHJlY2VpdmVkOiAnIiArIGV4cGVjdGVkMiArICInIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWZvdW5kMykgewotICAgICAgICAgICAgICAgIGZhaWwoIlRoZSBmb2xsb3dpbmcgTG9jYWxlIHdhcyBub3QgcmVjZWl2ZWQ6ICciICsgZXhwZWN0ZWQzICsgIiciKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbjogIiArIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEZhdWx0U3RyaW5nTG9jYWxlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkgZmFjID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoU09BUENvbnN0YW50cy5TT0FQXzFfMl9QUk9UT0NPTCk7Ci0gICAgICAgICAgICAvL01lc3NhZ2VGYWN0b3J5IGZhYyA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICBTT0FQTWVzc2FnZSBzb2FwTWVzc2FnZSA9IGZhYy5jcmVhdGVNZXNzYWdlKCk7Ci0gICAgICAgICAgICBTT0FQUGFydCBzb2FwUGFydCA9IHNvYXBNZXNzYWdlLmdldFNPQVBQYXJ0KCk7Ci0gICAgICAgICAgICBTT0FQRW52ZWxvcGUgZW52ZWxvcGUgPSBzb2FwUGFydC5nZXRFbnZlbG9wZSgpOwotICAgICAgICAgICAgU09BUEJvZHkgYm9keSA9IGVudmVsb3BlLmdldEJvZHkoKTsKLSAgICAgICAgICAgIFNPQVBGYXVsdCBzZiA9IGJvZHkuYWRkRmF1bHQoKTsKLQotICAgICAgICAgICAgLy9TZXR0aW5nIGZhdWx0IHN0cmluZyB3aXRoIG5vIExvY2FsZQotICAgICAgICAgICAgc2Yuc2V0RmF1bHRTdHJpbmcoInRoaXMgaXMgdGhlIGZhdWx0IHN0cmluZyIpOwotICAgICAgICAgICAgTG9jYWxlIHJlc3VsdCA9IHNmLmdldEZhdWx0U3RyaW5nTG9jYWxlKCk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJFeGNlcHRpb246ICIgKyBlKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgdGVzdEZhdWx0U3RyaW5nTG9jYWxlMigpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5IGZhYyA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKFNPQVBDb25zdGFudHMuU09BUF8xXzJfUFJPVE9DT0wpOwotICAgICAgICAgICAgLy9NZXNzYWdlRmFjdG9yeSBmYWMgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgU09BUE1lc3NhZ2Ugc29hcE1lc3NhZ2UgPSBmYWMuY3JlYXRlTWVzc2FnZSgpOwotICAgICAgICAgICAgU09BUFBhcnQgc29hcFBhcnQgPSBzb2FwTWVzc2FnZS5nZXRTT0FQUGFydCgpOwotICAgICAgICAgICAgU09BUEVudmVsb3BlIGVudmVsb3BlID0gc29hcFBhcnQuZ2V0RW52ZWxvcGUoKTsKLSAgICAgICAgICAgIFNPQVBCb2R5IGJvZHkgPSBlbnZlbG9wZS5nZXRCb2R5KCk7Ci0gICAgICAgICAgICBTT0FQRmF1bHQgc2YgPSBib2R5LmFkZEZhdWx0KCk7Ci0KLSAgICAgICAgICAgIHNmLnNldEZhdWx0U3RyaW5nKCJ0aGlzIGlzIHRoZSBmYXVsdCBzdHJpbmciKTsKLSAgICAgICAgICAgIExvY2FsZSByZXN1bHQgPSBzZi5nZXRGYXVsdFN0cmluZ0xvY2FsZSgpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHQuZXF1YWxzKExvY2FsZS5nZXREZWZhdWx0KCkpKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbjogIiArIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNldEZhdWx0U3RyaW5nTG9jYWxlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkgZmFjID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoU09BUENvbnN0YW50cy5TT0FQXzFfMl9QUk9UT0NPTCk7Ci0gICAgICAgICAgICAvL01lc3NhZ2VGYWN0b3J5IGZhYyA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICBTT0FQTWVzc2FnZSBzb2FwTWVzc2FnZSA9IGZhYy5jcmVhdGVNZXNzYWdlKCk7Ci0gICAgICAgICAgICBTT0FQUGFydCBzb2FwUGFydCA9IHNvYXBNZXNzYWdlLmdldFNPQVBQYXJ0KCk7Ci0gICAgICAgICAgICBTT0FQRW52ZWxvcGUgZW52ZWxvcGUgPSBzb2FwUGFydC5nZXRFbnZlbG9wZSgpOwotICAgICAgICAgICAgU09BUEJvZHkgYm9keSA9IGVudmVsb3BlLmdldEJvZHkoKTsKLSAgICAgICAgICAgIFNPQVBGYXVsdCBzZiA9IGJvZHkuYWRkRmF1bHQoKTsKLQotICAgICAgICAgICAgTG9jYWxlIGV4cGVjdGVkID0gTG9jYWxlLkVOR0xJU0g7Ci0gICAgICAgICAgICBzZi5zZXRGYXVsdFN0cmluZygidGhpcyBpcyB0aGUgZmF1bHQgc3RyaW5nIiwgZXhwZWN0ZWQpOwotICAgICAgICAgICAgTG9jYWxlIHJlc3VsdCA9IHNmLmdldEZhdWx0U3RyaW5nTG9jYWxlKCk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdC5lcXVhbHMoZXhwZWN0ZWQpKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbjogIiArIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmF1bHRDb2RlV2l0aFByZWZpeDEoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBNZXNzYWdlRmFjdG9yeSBmYWMgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgU09BUE1lc3NhZ2Ugc29hcE1lc3NhZ2UgPSBmYWMuY3JlYXRlTWVzc2FnZSgpOwotICAgICAgICAgICAgU09BUFBhcnQgc29hcFBhcnQgPSBzb2FwTWVzc2FnZS5nZXRTT0FQUGFydCgpOwotICAgICAgICAgICAgU09BUEVudmVsb3BlIGVudmVsb3BlID0gc29hcFBhcnQuZ2V0RW52ZWxvcGUoKTsKLSAgICAgICAgICAgIFNPQVBCb2R5IGJvZHkgPSBlbnZlbG9wZS5nZXRCb2R5KCk7Ci0gICAgICAgICAgICBTT0FQRmF1bHQgc2YgPSBib2R5LmFkZEZhdWx0KCk7Ci0KLSAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSAid3NvMiI7Ci0gICAgICAgICAgICBzZi5zZXRGYXVsdENvZGUocHJlZml4ICsgIjpTZXJ2ZXIiKTsKLSAgICAgICAgICAgIFN0cmluZyByZXN1bHQgPSBzZi5nZXRGYXVsdENvZGUoKTsKLQotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHByZWZpeCArICI6U2VydmVyIiwgcmVzdWx0KTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEZhdWx0Q29kZVdpdGhQcmVmaXgyKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkgZmFjID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoU09BUENvbnN0YW50cy5TT0FQXzFfMl9QUk9UT0NPTCk7Ci0gICAgICAgICAgICBTT0FQTWVzc2FnZSBzb2FwTWVzc2FnZSA9IGZhYy5jcmVhdGVNZXNzYWdlKCk7Ci0gICAgICAgICAgICBTT0FQUGFydCBzb2FwUGFydCA9IHNvYXBNZXNzYWdlLmdldFNPQVBQYXJ0KCk7Ci0gICAgICAgICAgICBTT0FQRW52ZWxvcGUgZW52ZWxvcGUgPSBzb2FwUGFydC5nZXRFbnZlbG9wZSgpOwotICAgICAgICAgICAgU09BUEJvZHkgYm9keSA9IGVudmVsb3BlLmdldEJvZHkoKTsKLSAgICAgICAgICAgIFNPQVBGYXVsdCBzZiA9IGJvZHkuYWRkRmF1bHQoKTsKLQotICAgICAgICAgICAgU3RyaW5nIHByZWZpeCA9ICJ3c28yIjsKLSAgICAgICAgICAgIHNmLnNldEZhdWx0Q29kZShwcmVmaXggKyAiOlNlcnZlciIpOwotICAgICAgICAgICAgU3RyaW5nIHJlc3VsdCA9IHNmLmdldEZhdWx0Q29kZSgpOwotCi0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocHJlZml4ICsgIjpTZXJ2ZXIiLCByZXN1bHQpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0R2V0RmF1bHRDb2RlQXNOYW1lMSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNPQVBGYWN0b3J5IGZhYyA9IFNPQVBGYWN0b3J5Lm5ld0luc3RhbmNlKFNPQVBDb25zdGFudHMuU09BUF8xXzFfUFJPVE9DT0wpOwotICAgICAgICAgICAgU09BUEZhdWx0IHNmID0gZmFjLmNyZWF0ZUZhdWx0KCk7Ci0KLSAgICAgICAgICAgIE5hbWUgbmFtZSA9IGZhYy5jcmVhdGVOYW1lKCJteWZhdWx0IiwgImZsdCIsICJodHRwOi8vZXhhbXBsZS5jb20iKTsKLSAgICAgICAgICAgIHNmLnNldEZhdWx0Q29kZShuYW1lKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgTmFtZSBuYW1lMiA9IHNmLmdldEZhdWx0Q29kZUFzTmFtZSgpOyAgICAgICAgICAgIAotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChuYW1lMik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMobmFtZS5nZXRMb2NhbE5hbWUoKSwgbmFtZTIuZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG5hbWUuZ2V0UHJlZml4KCksIG5hbWUyLmdldFByZWZpeCgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhuYW1lLmdldFVSSSgpLCBuYW1lMi5nZXRVUkkoKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFFOYW1lIG5hbWUzID0gc2YuZ2V0RmF1bHRDb2RlQXNRTmFtZSgpOyAgICAgICAgICAgIAotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChuYW1lMyk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMobmFtZS5nZXRMb2NhbE5hbWUoKSwgbmFtZTMuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG5hbWUuZ2V0UHJlZml4KCksIG5hbWUzLmdldFByZWZpeCgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhuYW1lLmdldFVSSSgpLCBuYW1lMy5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0R2V0RmF1bHRDb2RlQXNOYW1lMigpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFFOYW1lIHFuYW1lID0gU09BUENvbnN0YW50cy5TT0FQX1NFTkRFUl9GQVVMVDsKLSAgICAgICAgICAgIFNPQVBGYWN0b3J5IGZhYyA9IFNPQVBGYWN0b3J5Lm5ld0luc3RhbmNlKFNPQVBDb25zdGFudHMuU09BUF8xXzJfUFJPVE9DT0wpOwotICAgICAgICAgICAgTmFtZSBuYW1lID0gZmFjLmNyZWF0ZU5hbWUocW5hbWUuZ2V0TG9jYWxQYXJ0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxbmFtZS5nZXRQcmVmaXgoKSwgcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgICAgICAgICAgU09BUEZhdWx0IHNmID0gZmFjLmNyZWF0ZUZhdWx0KCk7Ci0gICAgICAgICAgICBzZi5zZXRGYXVsdENvZGUobmFtZSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIE5hbWUgbmFtZTIgPSBzZi5nZXRGYXVsdENvZGVBc05hbWUoKTsgICAgICAgICAgICAKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwobmFtZTIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG5hbWUuZ2V0TG9jYWxOYW1lKCksIG5hbWUyLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhuYW1lLmdldFByZWZpeCgpLCBuYW1lMi5nZXRQcmVmaXgoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMobmFtZS5nZXRVUkkoKSwgbmFtZTIuZ2V0VVJJKCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBRTmFtZSBuYW1lMyA9IHNmLmdldEZhdWx0Q29kZUFzUU5hbWUoKTsgICAgICAgICAgICAKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwobmFtZTMpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG5hbWUuZ2V0TG9jYWxOYW1lKCksIG5hbWUzLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhuYW1lLmdldFByZWZpeCgpLCBuYW1lMy5nZXRQcmVmaXgoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMobmFtZS5nZXRVUkkoKSwgbmFtZTMuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNldEdldEZhdWx0Q29kZUFzUU5hbWUxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFNPQVBGYWN0b3J5IGZhYyA9IFNPQVBGYWN0b3J5Lm5ld0luc3RhbmNlKFNPQVBDb25zdGFudHMuU09BUF8xXzFfUFJPVE9DT0wpOwotICAgICAgICBTT0FQRmF1bHQgc2YgPSBmYWMuY3JlYXRlRmF1bHQoKTsKLQotICAgICAgICBRTmFtZSBuYW1lID0gbmV3IFFOYW1lKCJodHRwOi8vZXhhbXBsZS5jb20iLCAibXlmYXVsdCIsICJmbHQiKTsKLSAgICAgICAgc2Yuc2V0RmF1bHRDb2RlKG5hbWUpOwotICAgICAgICAKLSAgICAgICAgUU5hbWUgbmFtZTIgPSBzZi5nZXRGYXVsdENvZGVBc1FOYW1lKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwobmFtZTIpOwotICAgICAgICBhc3NlcnRFcXVhbHMobmFtZS5nZXRMb2NhbFBhcnQoKSwgbmFtZTIuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMobmFtZS5nZXRQcmVmaXgoKSwgbmFtZTIuZ2V0UHJlZml4KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMobmFtZS5nZXROYW1lc3BhY2VVUkkoKSwgbmFtZTIuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgICAgICAKLSAgICAgICAgTmFtZSBuYW1lMyA9IHNmLmdldEZhdWx0Q29kZUFzTmFtZSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKG5hbWUzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG5hbWUuZ2V0TG9jYWxQYXJ0KCksIG5hbWUzLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG5hbWUuZ2V0UHJlZml4KCksIG5hbWUzLmdldFByZWZpeCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG5hbWUuZ2V0TmFtZXNwYWNlVVJJKCksIG5hbWUzLmdldFVSSSgpKTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRHZXRGYXVsdENvZGVBc1FOYW1lMigpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFFOYW1lIG5hbWUgPSBTT0FQQ29uc3RhbnRzLlNPQVBfU0VOREVSX0ZBVUxUOwotICAgICAgICAgICAgU09BUEZhY3RvcnkgZmFjID0gU09BUEZhY3RvcnkubmV3SW5zdGFuY2UoU09BUENvbnN0YW50cy5TT0FQXzFfMl9QUk9UT0NPTCk7Ci0gICAgICAgICAgICBTT0FQRmF1bHQgc2YgPSBmYWMuY3JlYXRlRmF1bHQoKTsKLSAgICAgICAgICAgIHNmLnNldEZhdWx0Q29kZShuYW1lKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgUU5hbWUgbmFtZTIgPSBzZi5nZXRGYXVsdENvZGVBc1FOYW1lKCk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKG5hbWUyKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhuYW1lLmdldExvY2FsUGFydCgpLCBuYW1lMi5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMobmFtZS5nZXRQcmVmaXgoKSwgbmFtZTIuZ2V0UHJlZml4KCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG5hbWUuZ2V0TmFtZXNwYWNlVVJJKCksIG5hbWUyLmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgTmFtZSBuYW1lMyA9IHNmLmdldEZhdWx0Q29kZUFzTmFtZSgpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChuYW1lMyk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMobmFtZS5nZXRMb2NhbFBhcnQoKSwgbmFtZTMuZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG5hbWUuZ2V0UHJlZml4KCksIG5hbWUzLmdldFByZWZpeCgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhuYW1lLmdldE5hbWVzcGFjZVVSSSgpLCBuYW1lMy5nZXRVUkkoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RGYXVsdDEyRGVmYXVsdHMoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBNZXNzYWdlRmFjdG9yeSBtZXNzYWdlRmFjdG9yeSA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKFNPQVBDb25zdGFudHMuU09BUF8xXzJfUFJPVE9DT0wpOwotICAgICAgICAgICAgU09BUE1lc3NhZ2UgbWVzc2FnZSA9IG1lc3NhZ2VGYWN0b3J5LmNyZWF0ZU1lc3NhZ2UoKTsKLSAgICAgICAgICAgIFNPQVBCb2R5IGJvZHkgPSBtZXNzYWdlLmdldFNPQVBCb2R5KCk7Ci0gICAgICAgICAgICBTT0FQRmF1bHQgZmF1bHQgPSBib2R5LmFkZEZhdWx0KCk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGZhdWx0LmdldEZhdWx0Q29kZUFzUU5hbWUoKSk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGZhdWx0LmdldEZhdWx0U3RyaW5nKCkpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmF1bHQxMURlZmF1bHRzKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkgbWVzc2FnZUZhY3RvcnkgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgU09BUE1lc3NhZ2UgbWVzc2FnZSA9IG1lc3NhZ2VGYWN0b3J5LmNyZWF0ZU1lc3NhZ2UoKTsKLSAgICAgICAgICAgIFNPQVBCb2R5IGJvZHkgPSBtZXNzYWdlLmdldFNPQVBCb2R5KCk7Ci0gICAgICAgICAgICBTT0FQRmF1bHQgZmF1bHQgPSBib2R5LmFkZEZhdWx0KCk7Ci0KLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoZmF1bHQuZ2V0RmF1bHRDb2RlQXNRTmFtZSgpKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoZmF1bHQuZ2V0RmF1bHRTdHJpbmcoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYWFqL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zYWFqL1NPQVBIZWFkZXJUZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9zYWFqL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zYWFqL1NPQVBIZWFkZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhMzQ1NDQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2Fhai90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2Fhai9TT0FQSGVhZGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDE3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zYWFqOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5NZXNzYWdlRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5OYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBCb2R5OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBDb25zdGFudHM7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEVudmVsb3BlOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEhlYWRlcjsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQSGVhZGVyRWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQTWVzc2FnZTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQUGFydDsKLWltcG9ydCBqYXZheC54bWwuc29hcC5UZXh0OwotCi1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgU09BUEhlYWRlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgcHJpdmF0ZSBNZXNzYWdlRmFjdG9yeSBtZiA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTT0FQTWVzc2FnZSBtc2cgPSBudWxsOwotICAgIHByaXZhdGUgU09BUFBhcnQgc3AgPSBudWxsOwotICAgIHByaXZhdGUgU09BUEVudmVsb3BlIGVudmVsb3BlID0gbnVsbDsKLSAgICBwcml2YXRlIFNPQVBIZWFkZXIgaGRyID0gbnVsbDsKLSAgICBwcml2YXRlIFNPQVBIZWFkZXJFbGVtZW50IHNoZTEgPSBudWxsOwotICAgIHByaXZhdGUgU09BUEhlYWRlckVsZW1lbnQgc2hlMiA9IG51bGw7Ci0KLSAgICBwdWJsaWMgU09BUEhlYWRlclRlc3QoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEFkZEhlYWRlckVsZW1lbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGphdmF4LnhtbC5zb2FwLlNPQVBNZXNzYWdlIHNvYXBNZXNzYWdlID0KLSAgICAgICAgICAgICAgICBqYXZheC54bWwuc29hcC5NZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpLmNyZWF0ZU1lc3NhZ2UoKTsKLSAgICAgICAgamF2YXgueG1sLnNvYXAuU09BUEVudmVsb3BlIHNvYXBFbnYgPQotICAgICAgICAgICAgICAgIHNvYXBNZXNzYWdlLmdldFNPQVBQYXJ0KCkuZ2V0RW52ZWxvcGUoKTsKLSAgICAgICAgamF2YXgueG1sLnNvYXAuU09BUEhlYWRlciBoZWFkZXIgPSBzb2FwRW52LmdldEhlYWRlcigpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaGVhZGVyLmFkZENoaWxkRWxlbWVudCgiZWJ4bWxtczEiKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUoZSBpbnN0YW5jZW9mIFNPQVBFeGNlcHRpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZShoZWFkZXIuYWRkQ2hpbGRFbGVtZW50KCJlYnhtbG1zMSIsICJucy1wcmVmaXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly90ZXN0LmFwYWNoZS5vcmciKSBpbnN0YW5jZW9mIFNPQVBIZWFkZXJFbGVtZW50KTsKLSAgICAgICAgKChTT0FQSGVhZGVyRWxlbWVudCloZWFkZXIuZ2V0Rmlyc3RDaGlsZCgpKS5hZGRUZXh0Tm9kZSgidGVzdCBhZGQiKTsKLQotCi0gICAgICAgIGFzc2VydFRydWUoaGVhZGVyLmFkZEhlYWRlckVsZW1lbnQoCi0gICAgICAgICAgICAgICAgc29hcEVudi5jcmVhdGVOYW1lKCJlYnhtbG1zMiIsICJucy1wcmVmaXgiLCAiaHR0cDovL3Rlc3QyLmFwYWNoZS5vcmciKSkgIT0gbnVsbCk7Ci0gICAgICAgIGFzc2VydFRydWUoaGVhZGVyLmFkZEhlYWRlckVsZW1lbnQoCi0gICAgICAgICAgICAgICAgbmV3IFByZWZpeGVkUU5hbWUoImh0dHA6Ly90ZXN0My5hcGFjaGUub3JnIiwgImVieG1sbXMzIiwgIm5zLXByZWZpeCIpKSAhPSBudWxsKTsKLQotCi0gICAgICAgIFNPQVBIZWFkZXJFbGVtZW50IGZpcnN0Q2hpbGQgPSAoU09BUEhlYWRlckVsZW1lbnQpaGVhZGVyLmdldEZpcnN0Q2hpbGQoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJlYnhtbG1zMSIsIGZpcnN0Q2hpbGQuZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIm5zLXByZWZpeCIsIGZpcnN0Q2hpbGQuZ2V0UHJlZml4KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly90ZXN0LmFwYWNoZS5vcmciLCBmaXJzdENoaWxkLmdldE5hbWVzcGFjZVVSSSgpKTsKLQotICAgICAgICBTT0FQSGVhZGVyRWxlbWVudCBzZWNvbmRDaGlsZCA9IChTT0FQSGVhZGVyRWxlbWVudClmaXJzdENoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiZWJ4bWxtczIiLCBzZWNvbmRDaGlsZC5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygibnMtcHJlZml4Iiwgc2Vjb25kQ2hpbGQuZ2V0UHJlZml4KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly90ZXN0Mi5hcGFjaGUub3JnIiwgc2Vjb25kQ2hpbGQuZ2V0TmFtZXNwYWNlVVJJKCkpOwotCi0gICAgICAgIFNPQVBIZWFkZXJFbGVtZW50IGxhc3RDaGlsZCA9IChTT0FQSGVhZGVyRWxlbWVudCloZWFkZXIuZ2V0TGFzdENoaWxkKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiZWJ4bWxtczMiLCBsYXN0Q2hpbGQuZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIm5zLXByZWZpeCIsIGxhc3RDaGlsZC5nZXRQcmVmaXgoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiaHR0cDovL3Rlc3QzLmFwYWNoZS5vcmciLCBsYXN0Q2hpbGQuZ2V0TmFtZXNwYWNlVVJJKCkpOwotCi0gICAgICAgIFNPQVBIZWFkZXJFbGVtZW50IGZvdXJ0aENoaWxkID0gKFNPQVBIZWFkZXJFbGVtZW50KWxhc3RDaGlsZC5nZXRQcmV2aW91c1NpYmxpbmcoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJlYnhtbG1zMiIsIGZvdXJ0aENoaWxkLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJucy1wcmVmaXgiLCBmb3VydGhDaGlsZC5nZXRQcmVmaXgoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiaHR0cDovL3Rlc3QyLmFwYWNoZS5vcmciLCBmb3VydGhDaGlsZC5nZXROYW1lc3BhY2VVUkkoKSk7Ci0KLSAgICAgICAgSXRlcmF0b3IgaXQgPSBoZWFkZXIuZ2V0Q2hpbGRFbGVtZW50cygpOwotICAgICAgICBpbnQgbnVtT2ZIZWFkZXJFbGVtZW50cyA9IDA7Ci0gICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIE9iamVjdCBvID0gaXQubmV4dCgpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShvIGluc3RhbmNlb2YgU09BUEhlYWRlckVsZW1lbnQpOwotICAgICAgICAgICAgU09BUEhlYWRlckVsZW1lbnQgZWwgPSAoU09BUEhlYWRlckVsZW1lbnQpbzsKLSAgICAgICAgICAgIFN0cmluZyBsTmFtZSA9IGVsLmdldExvY2FsTmFtZSgpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShsTmFtZS5lcXVhbHMoImVieG1sbXMiICsgKytudW1PZkhlYWRlckVsZW1lbnRzKSk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIG51bU9mSGVhZGVyRWxlbWVudHMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RIZWFkZXJzKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gQ3JlYXRlIG1lc3NhZ2UgZmFjdG9yeSBhbmQgU09BUCBmYWN0b3J5Ci0gICAgICAgICAgICBNZXNzYWdlRmFjdG9yeSBtZXNzYWdlRmFjdG9yeSA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICBTT0FQRmFjdG9yeSBzb2FwRmFjdG9yeSA9IFNPQVBGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0KLSAgICAgICAgICAgIC8vIENyZWF0ZSBhIG1lc3NhZ2UKLSAgICAgICAgICAgIFNPQVBNZXNzYWdlIG1lc3NhZ2UgPSBtZXNzYWdlRmFjdG9yeS5jcmVhdGVNZXNzYWdlKCk7Ci0KLSAgICAgICAgICAgIC8vIEdldCB0aGUgU09BUCBoZWFkZXIgZnJvbSB0aGUgbWVzc2FnZSBhbmQKLSAgICAgICAgICAgIC8vICBhZGQgaGVhZGVycyB0byBpdAotICAgICAgICAgICAgU09BUEhlYWRlciBoZWFkZXIgPSBtZXNzYWdlLmdldFNPQVBIZWFkZXIoKTsKLQotICAgICAgICAgICAgU3RyaW5nIG5hbWVTcGFjZSA9ICJucyI7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZVNwYWNlVVJJID0gImh0dHA6Ly9naXptb3MuY29tL05TVVJJIjsKLQotICAgICAgICAgICAgTmFtZSBvcmRlciA9Ci0gICAgICAgICAgICAgICAgICAgIHNvYXBGYWN0b3J5LmNyZWF0ZU5hbWUoIm9yZGVyRGVzayIsIG5hbWVTcGFjZSwgbmFtZVNwYWNlVVJJKTsKLSAgICAgICAgICAgIFNPQVBIZWFkZXJFbGVtZW50IG9yZGVySGVhZGVyID0gaGVhZGVyLmFkZEhlYWRlckVsZW1lbnQob3JkZXIpOwotICAgICAgICAgICAgb3JkZXJIZWFkZXIuc2V0QWN0b3IoImh0dHA6Ly9naXptb3MuY29tL29yZGVycyIpOwotCi0gICAgICAgICAgICBOYW1lIHNoaXBwaW5nID0KLSAgICAgICAgICAgICAgICAgICAgc29hcEZhY3RvcnkuY3JlYXRlTmFtZSgic2hpcHBpbmdEZXNrIiwgbmFtZVNwYWNlLCBuYW1lU3BhY2VVUkkpOwotICAgICAgICAgICAgU09BUEhlYWRlckVsZW1lbnQgc2hpcHBpbmdIZWFkZXIgPQotICAgICAgICAgICAgICAgICAgICBoZWFkZXIuYWRkSGVhZGVyRWxlbWVudChzaGlwcGluZyk7Ci0gICAgICAgICAgICBzaGlwcGluZ0hlYWRlci5zZXRBY3RvcigiaHR0cDovL2dpem1vcy5jb20vc2hpcHBpbmciKTsKLQotICAgICAgICAgICAgTmFtZSBjb25maXJtYXRpb24gPQotICAgICAgICAgICAgICAgICAgICBzb2FwRmFjdG9yeS5jcmVhdGVOYW1lKCJjb25maXJtYXRpb25EZXNrIiwgbmFtZVNwYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVTcGFjZVVSSSk7Ci0gICAgICAgICAgICBTT0FQSGVhZGVyRWxlbWVudCBjb25maXJtYXRpb25IZWFkZXIgPQotICAgICAgICAgICAgICAgICAgICBoZWFkZXIuYWRkSGVhZGVyRWxlbWVudChjb25maXJtYXRpb24pOwotICAgICAgICAgICAgY29uZmlybWF0aW9uSGVhZGVyLnNldEFjdG9yKCJodHRwOi8vZ2l6bW9zLmNvbS9jb25maXJtYXRpb25zIik7Ci0KLSAgICAgICAgICAgIE5hbWUgYmlsbGluZyA9Ci0gICAgICAgICAgICAgICAgICAgIHNvYXBGYWN0b3J5LmNyZWF0ZU5hbWUoImJpbGxpbmdEZXNrIiwgbmFtZVNwYWNlLCBuYW1lU3BhY2VVUkkpOwotICAgICAgICAgICAgU09BUEhlYWRlckVsZW1lbnQgYmlsbGluZ0hlYWRlciA9IGhlYWRlci5hZGRIZWFkZXJFbGVtZW50KGJpbGxpbmcpOwotICAgICAgICAgICAgYmlsbGluZ0hlYWRlci5zZXRBY3RvcigiaHR0cDovL2dpem1vcy5jb20vYmlsbGluZyIpOwotCi0gICAgICAgICAgICAvLyBBZGQgaGVhZGVyIHdpdGggbXVzdFVuZGVyc3RhbmQgYXR0cmlidXRlCi0gICAgICAgICAgICBOYW1lIHROYW1lID0KLSAgICAgICAgICAgICAgICAgICAgc29hcEZhY3RvcnkuY3JlYXRlTmFtZSgiVHJhbnNhY3Rpb24iLCAidCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly9naXptb3MuY29tL29yZGVycyIpOwotCi0gICAgICAgICAgICBTT0FQSGVhZGVyRWxlbWVudCB0cmFuc2FjdGlvbiA9IGhlYWRlci5hZGRIZWFkZXJFbGVtZW50KHROYW1lKTsKLSAgICAgICAgICAgIHRyYW5zYWN0aW9uLnNldE11c3RVbmRlcnN0YW5kKHRydWUpOwotICAgICAgICAgICAgdHJhbnNhY3Rpb24uYWRkVGV4dE5vZGUoIjUiKTsKLQotICAgICAgICAgICAgLy8gR2V0IHRoZSBTT0FQIGJvZHkgZnJvbSB0aGUgbWVzc2FnZSBidXQgbGVhdmUKLSAgICAgICAgICAgIC8vIGl0IGVtcHR5Ci0gICAgICAgICAgICBTT0FQQm9keSBib2R5ID0gbWVzc2FnZS5nZXRTT0FQQm9keSgpOwotCi0gICAgICAgICAgICBtZXNzYWdlLnNhdmVDaGFuZ2VzKCk7Ci0KLSAgICAgICAgICAgIC8vIERpc3BsYXkgdGhlIG1lc3NhZ2UgdGhhdCB3b3VsZCBiZSBzZW50Ci0gICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiXG4tLS0tLSBSZXF1ZXN0IE1lc3NhZ2UgLS0tLVxuIik7Ci0gICAgICAgICAgICAvL21lc3NhZ2Uud3JpdGVUbyhTeXN0ZW0ub3V0KTsKLQotICAgICAgICAgICAgLy8gTG9vayBhdCB0aGUgaGVhZGVycwotICAgICAgICAgICAgSXRlcmF0b3IgYWxsSGVhZGVycyA9IGhlYWRlci5leGFtaW5lQWxsSGVhZGVyRWxlbWVudHMoKTsKLQotICAgICAgICAgICAgd2hpbGUgKGFsbEhlYWRlcnMuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgU09BUEhlYWRlckVsZW1lbnQgaGVhZGVyRWxlbWVudCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoU09BUEhlYWRlckVsZW1lbnQpYWxsSGVhZGVycy5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgTmFtZSBoZWFkZXJOYW1lID0gaGVhZGVyRWxlbWVudC5nZXRFbGVtZW50TmFtZSgpOwotICAgICAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJcbkhlYWRlciBuYW1lIGlzICIgKwotICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgIGhlYWRlck5hbWUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiQWN0b3IgaXMgIiArIGhlYWRlckVsZW1lbnQuZ2V0QWN0b3IoKSk7Ci0gICAgICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIm11c3RVbmRlcnN0YW5kIGlzICIgKwotICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgIGhlYWRlckVsZW1lbnQuZ2V0TXVzdFVuZGVyc3RhbmQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJFbmV4cGVjdGVkIEV4Y2VwdGlvbiAiICsgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBtc2cgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpLmNyZWF0ZU1lc3NhZ2UoKTsKLSAgICAgICAgc3AgPSBtc2cuZ2V0U09BUFBhcnQoKTsKLSAgICAgICAgZW52ZWxvcGUgPSBzcC5nZXRFbnZlbG9wZSgpOwotICAgICAgICBoZHIgPSBlbnZlbG9wZS5nZXRIZWFkZXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXhhbWluZUhlYWRlcigpIHsKLSAgICAgICAgU09BUEhlYWRlckVsZW1lbnQgc2hlID0gbnVsbDsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgc2hlMSA9IGhkci5hZGRIZWFkZXJFbGVtZW50KGVudmVsb3BlLmNyZWF0ZU5hbWUoImZvbzEiLCAiZjEiLCAiZm9vMS1VUkkiKSk7Ci0gICAgICAgICAgICBzaGUxLnNldEFjdG9yKCJhY3Rvci1VUkkiKTsKLSAgICAgICAgICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gaGRyLmV4YW1pbmVBbGxIZWFkZXJFbGVtZW50cygpOwotICAgICAgICAgICAgaW50IGNudCA9IDA7Ci0gICAgICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgY250Kys7Ci0gICAgICAgICAgICAgICAgc2hlID0gKFNPQVBIZWFkZXJFbGVtZW50KWl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgICAgICBpZiAoIXNoZS5lcXVhbHMoc2hlMSkpIHsKLSAgICAgICAgICAgICAgICAgICAgZmFpbCgiU09BUCBIZWFkZXIgRWxlbWVudHMgZG8gbm90IG1hdGNoIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoY250ICE9IDEpIHsKLSAgICAgICAgICAgICAgICBmYWlsKCJTT0FQSGVhZGVyRWxlbWVudCBjb3VudCBtaXNtYXRjaDogZXhwZWN0ZWQgMSwgcmVjZWl2ZWQgIiArIGNudCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGl0ZXJhdG9yID0gaGRyLmV4YW1pbmVBbGxIZWFkZXJFbGVtZW50cygpOwotICAgICAgICAgICAgaWYgKCFpdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBmYWlsKCJubyBlbGVtZW50cyBpbiBpdGVyYXRvciAtIHVuZXhwZWN0ZWQiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBFeGNlcHRpb246ICIgKyBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBZGROb3RVbmRlcnN0b29kSGVhZGVyRWxlbWVudCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBqYXZheC54bWwuc29hcC5TT0FQTWVzc2FnZSBzb2FwTWVzc2FnZSA9Ci0gICAgICAgICAgICAgICAgamF2YXgueG1sLnNvYXAuTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoCi0gICAgICAgICAgICAgICAgICAgICAgICBTT0FQQ29uc3RhbnRzLlNPQVBfMV8yX1BST1RPQ09MKS5jcmVhdGVNZXNzYWdlKCk7Ci0KLSAgICAgICAgamF2YXgueG1sLnNvYXAuU09BUEVudmVsb3BlIHNvYXBFbnYgPQotICAgICAgICAgICAgICAgIHNvYXBNZXNzYWdlLmdldFNPQVBQYXJ0KCkuZ2V0RW52ZWxvcGUoKTsKLSAgICAgICAgamF2YXgueG1sLnNvYXAuU09BUEhlYWRlciBoZWFkZXIgPSBzb2FwRW52LmdldEhlYWRlcigpOwotCi0gICAgICAgIFNPQVBFbGVtZW50IHNvYXBFbGVtZW50ID0gaGVhZGVyLmFkZE5vdFVuZGVyc3Rvb2RIZWFkZXJFbGVtZW50KAotICAgICAgICAgICAgICAgIG5ldyBRTmFtZSgiaHR0cDovL2Zvby5vcmciLCAiZm9vIiwgImYiKSk7Ci0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzb2FwRWxlbWVudCk7Ci0gICAgICAgIE5hbWUgbmFtZSA9IHNvYXBFbGVtZW50LmdldEVsZW1lbnROYW1lKCk7Ci0gICAgICAgIFN0cmluZyB1cmkgPSBuYW1lLmdldFVSSSgpOwotICAgICAgICBTdHJpbmcgbG9jYWxOYW1lID0gbmFtZS5nZXRMb2NhbE5hbWUoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFNPQVBDb25zdGFudHMuVVJJX05TX1NPQVBfMV8yX0VOVkVMT1BFLCB1cmkpOwotICAgICAgICAvL1ZhbGlkYXRlIHRoZSBMb2NhbE5hbWUgd2hpY2ggbXVzdCBiZSBOb3RVbmRlcnN0b29kCi0gICAgICAgIGFzc2VydEVxdWFscygiTm90VW5kZXJzdG9vZCIsIGxvY2FsTmFtZSk7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkVXBncmFkZUhlYWRlckVsZW1lbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgamF2YXgueG1sLnNvYXAuU09BUE1lc3NhZ2Ugc29hcE1lc3NhZ2UgPQotICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zb2FwLk1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKAotICAgICAgICAgICAgICAgICAgICAgICAgU09BUENvbnN0YW50cy5TT0FQXzFfMl9QUk9UT0NPTCkuY3JlYXRlTWVzc2FnZSgpOwotCi0gICAgICAgIGphdmF4LnhtbC5zb2FwLlNPQVBFbnZlbG9wZSBzb2FwRW52ID0KLSAgICAgICAgICAgICAgICBzb2FwTWVzc2FnZS5nZXRTT0FQUGFydCgpLmdldEVudmVsb3BlKCk7Ci0gICAgICAgIGphdmF4LnhtbC5zb2FwLlNPQVBIZWFkZXIgaGVhZGVyID0gc29hcEVudi5nZXRIZWFkZXIoKTsKLQotICAgICAgICAvLyBjcmVhdGUgYSBsaXN0IG9mIHN1cHBvcnRlZCBVUklzLgotICAgICAgICBBcnJheUxpc3Qgc3VwcG9ydGVkID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBzdXBwb3J0ZWQuYWRkKFNPQVBDb25zdGFudHMuVVJJX05TX1NPQVBfMV8yX0VOVkVMT1BFKTsKLSAgICAgICAgc3VwcG9ydGVkLmFkZChTT0FQQ29uc3RhbnRzLlVSSV9OU19TT0FQX0VOVkVMT1BFKTsKLQotICAgICAgICBTT0FQRWxlbWVudCBzb2FwRWxlbWVudCA9IGhlYWRlci5hZGRVcGdyYWRlSGVhZGVyRWxlbWVudChzdXBwb3J0ZWQuaXRlcmF0b3IoKSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc29hcEVsZW1lbnQpOwotICAgICAgICBOYW1lIG5hbWUgPSBzb2FwRWxlbWVudC5nZXRFbGVtZW50TmFtZSgpOwotICAgICAgICBTdHJpbmcgdXJpID0gbmFtZS5nZXRVUkkoKTsKLSAgICAgICAgU3RyaW5nIGxvY2FsTmFtZSA9IG5hbWUuZ2V0TG9jYWxOYW1lKCk7Ci0KLSAgICAgICAgLy9WYWxpZGF0ZSB0aGUgVVJJIHdoaWNoIG11c3QgYmUgU09BUENvbnN0YW50cy5VUklfTlNfU09BUF8xXzJfRU5WRUxPUEUpOwotICAgICAgICBhc3NlcnRUcnVlKHVyaS5lcXVhbHMoU09BUENvbnN0YW50cy5VUklfTlNfU09BUF8xXzJfRU5WRUxPUEUpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShsb2NhbE5hbWUuZXF1YWxzKCJVcGdyYWRlIikpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFeGFtaW5lSGVhZGVyRWxlbWVudHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgamF2YXgueG1sLnNvYXAuU09BUE1lc3NhZ2Ugc29hcE1lc3NhZ2UgPQotICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zb2FwLk1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKAotICAgICAgICAgICAgICAgICAgICAgICAgU09BUENvbnN0YW50cy5TT0FQXzFfMl9QUk9UT0NPTCkuY3JlYXRlTWVzc2FnZSgpOwotCi0gICAgICAgIGphdmF4LnhtbC5zb2FwLlNPQVBFbnZlbG9wZSBzb2FwRW52ID0KLSAgICAgICAgICAgICAgICBzb2FwTWVzc2FnZS5nZXRTT0FQUGFydCgpLmdldEVudmVsb3BlKCk7Ci0gICAgICAgIGphdmF4LnhtbC5zb2FwLlNPQVBIZWFkZXIgaGVhZGVyID0gc29hcEVudi5nZXRIZWFkZXIoKTsKLQotICAgICAgICBTT0FQSGVhZGVyRWxlbWVudCBzb2FwSGVhZGVyRWxlbWVudCA9Ci0gICAgICAgICAgICAgICAgaGVhZGVyLmFkZEhlYWRlckVsZW1lbnQoZW52ZWxvcGUuY3JlYXRlTmFtZSgiZm9vMSIsICJmMSIsICJmb28xLVVSSSIpKTsKLQotICAgICAgICBJdGVyYXRvciBpdGVyYXRvciA9IG51bGw7Ci0gICAgICAgIHNvYXBIZWFkZXJFbGVtZW50LnNldFJvbGUoInJvbGUtVVJJIik7Ci0KLSAgICAgICAgaXRlcmF0b3IgPSBoZWFkZXIuZXhhbWluZUhlYWRlckVsZW1lbnRzKCJyb2xlMS1VUkkiKTsKLQotICAgICAgICBpbnQgY291bnQgPSAwOwotICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBjb3VudCsrOwotICAgICAgICAgICAgaXRlcmF0b3IubmV4dCgpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCBjb3VudCk7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXhhbWluZUhlYWRlckVsZW1lbnRzMigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBqYXZheC54bWwuc29hcC5TT0FQTWVzc2FnZSBzb2FwTWVzc2FnZSA9Ci0gICAgICAgICAgICAgICAgamF2YXgueG1sLnNvYXAuTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoKS5jcmVhdGVNZXNzYWdlKCk7Ci0KLSAgICAgICAgamF2YXgueG1sLnNvYXAuU09BUEVudmVsb3BlIHNvYXBFbnYgPQotICAgICAgICAgICAgICAgIHNvYXBNZXNzYWdlLmdldFNPQVBQYXJ0KCkuZ2V0RW52ZWxvcGUoKTsKLSAgICAgICAgamF2YXgueG1sLnNvYXAuU09BUEhlYWRlciBoZWFkZXIgPSBzb2FwRW52LmdldEhlYWRlcigpOwotICAgICAgICBTT0FQSGVhZGVyRWxlbWVudCBzb2FwSGVhZGVyRWxlbWVudCA9IG51bGw7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEFkZCBzb21lIHNvYXAgaGVhZGVyIGVsZW1lbnRzCi0gICAgICAgICAgICBTT0FQRWxlbWVudCBzZSA9IGhlYWRlci5hZGRIZWFkZXJFbGVtZW50KAotICAgICAgICAgICAgICAgICAgICBlbnZlbG9wZS5jcmVhdGVOYW1lKCJIZWFkZXIxIiwgInByZWZpeCIsICJodHRwOi8vbXl1cmkiKSkKLSAgICAgICAgICAgICAgICAgICAgLmFkZFRleHROb2RlKCJUaGlzIGlzIEhlYWRlcjEiKTsKLSAgICAgICAgICAgIHNvYXBIZWFkZXJFbGVtZW50ID0gKFNPQVBIZWFkZXJFbGVtZW50KXNlOwotICAgICAgICAgICAgc29hcEhlYWRlckVsZW1lbnQuc2V0TXVzdFVuZGVyc3RhbmQodHJ1ZSk7Ci0KLSAgICAgICAgICAgIHNlID0gaGVhZGVyLmFkZEhlYWRlckVsZW1lbnQoCi0gICAgICAgICAgICAgICAgICAgIGVudmVsb3BlLmNyZWF0ZU5hbWUoIkhlYWRlcjIiLCAicHJlZml4IiwgImh0dHA6Ly9teXVyaSIpKQotICAgICAgICAgICAgICAgICAgICAuYWRkVGV4dE5vZGUoIlRoaXMgaXMgSGVhZGVyMiIpOwotICAgICAgICAgICAgc29hcEhlYWRlckVsZW1lbnQgPSAoU09BUEhlYWRlckVsZW1lbnQpc2U7Ci0gICAgICAgICAgICBzb2FwSGVhZGVyRWxlbWVudC5zZXRNdXN0VW5kZXJzdGFuZChmYWxzZSk7Ci0KLSAgICAgICAgICAgIHNlID0gaGVhZGVyLmFkZEhlYWRlckVsZW1lbnQoCi0gICAgICAgICAgICAgICAgICAgIGVudmVsb3BlLmNyZWF0ZU5hbWUoIkhlYWRlcjMiLCAicHJlZml4IiwgImh0dHA6Ly9teXVyaSIpKQotICAgICAgICAgICAgICAgICAgICAuYWRkVGV4dE5vZGUoIlRoaXMgaXMgSGVhZGVyMyIpOwotICAgICAgICAgICAgc29hcEhlYWRlckVsZW1lbnQgPSAoU09BUEhlYWRlckVsZW1lbnQpc2U7Ci0gICAgICAgICAgICBzb2FwSGVhZGVyRWxlbWVudC5zZXRNdXN0VW5kZXJzdGFuZCh0cnVlKTsKLQotICAgICAgICAgICAgc2UgPSBoZWFkZXIuYWRkSGVhZGVyRWxlbWVudCgKLSAgICAgICAgICAgICAgICAgICAgZW52ZWxvcGUuY3JlYXRlTmFtZSgiSGVhZGVyNCIsICJwcmVmaXgiLCAiaHR0cDovL215dXJpIikpCi0gICAgICAgICAgICAgICAgICAgIC5hZGRUZXh0Tm9kZSgiVGhpcyBpcyBIZWFkZXI0Iik7Ci0gICAgICAgICAgICBzb2FwSGVhZGVyRWxlbWVudCA9IChTT0FQSGVhZGVyRWxlbWVudClzZTsKLSAgICAgICAgICAgIHNvYXBIZWFkZXJFbGVtZW50LnNldE11c3RVbmRlcnN0YW5kKGZhbHNlKTsKLQotICAgICAgICAgICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBoZWFkZXIuZXhhbWluZUFsbEhlYWRlckVsZW1lbnRzKCk7Ci0KLSAgICAgICAgICAgIC8vdmFsaWRhdGluZyBJdGVyYXRvciBjb3VudCAuLi4uIHNob3VsZCBiZSA0Iik7Ci0gICAgICAgICAgICBpbnQgY250ID0gMDsKLSAgICAgICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBjbnQrKzsKLSAgICAgICAgICAgICAgICBzb2FwSGVhZGVyRWxlbWVudCA9IChTT0FQSGVhZGVyRWxlbWVudClpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoY250LCA0KTsKLSAgICAgICAgICAgIGl0ZXJhdG9yID0gaGVhZGVyLmV4YW1pbmVIZWFkZXJFbGVtZW50cyhTT0FQQ29uc3RhbnRzLlVSSV9TT0FQX0FDVE9SX05FWFQpOwotICAgICAgICAgICAgY250ID0gMDsKLSAgICAgICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBjbnQrKzsKLSAgICAgICAgICAgICAgICBzb2FwSGVhZGVyRWxlbWVudCA9IChTT0FQSGVhZGVyRWxlbWVudClpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoY250LCAwKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgRXhjZXB0aW9uOiAiICsgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UU5hbWVzT25IZWFkZXIoKSB7Ci0gICAgICAgIFNPQVBIZWFkZXJFbGVtZW50IGhlYWRlckVsZW1lbnQgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy9TT0FQMS4xIGFuZCBTT0FQMS4yIHJlcXVpcmVzIGFsbCBIZWFkZXJFbGVtZW50cyB0byBiZSBuYW1lc3BhY2UgcXVhbGlmaWVkCi0gICAgICAgICAgICAvL1RyeSBhZGRpbmcgSGVhZGVyRWxlbWVudCB3aXRoIHVucXVhbGlmaWVkIFFOYW1lIG5vdCBiZWxvbmdpbmcgdG8gYW55IG5hbWVzcGFjZQotICAgICAgICAgICAgLy8oZXhwZWN0IFNPQVBFeGNlcHRpb24pCi0gICAgICAgICAgICBoZWFkZXJFbGVtZW50ID0gaGRyLmFkZEhlYWRlckVsZW1lbnQoZW52ZWxvcGUuY3JlYXRlTmFtZSgiVHJhbnNhY3Rpb24iKSk7Ci0gICAgICAgICAgICBmYWlsKCJEaWQgbm90IHRocm93IGV4cGVjdGVkIFNPQVBFeGNlcHRpb24iKTsKLSAgICAgICAgfSBjYXRjaCAoU09BUEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvL0RpZCB0aHJvdyBleHBlY3RlZCBTT0FQRXhjZXB0aW9uCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIEV4Y2VwdGlvbjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwZW5kQ2hpbGQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgTWVzc2FnZUZhY3RvcnkgZmFjdCA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIFNPQVBNZXNzYWdlIG1lc3NhZ2UgPSBmYWN0LmNyZWF0ZU1lc3NhZ2UoKTsKLSAgICAgICAgU09BUEhlYWRlciBzb2FwSGVhZGVyID0gbWVzc2FnZS5nZXRTT0FQSGVhZGVyKCk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgc29hcEhlYWRlci5nZXRDaGlsZE5vZGVzKCkuZ2V0TGVuZ3RoKCkpOwotICAgICAgICBhc3NlcnRGYWxzZShzb2FwSGVhZGVyLmdldENoaWxkRWxlbWVudHMoKS5oYXNOZXh0KCkpOwotICAgICAgICAKLSAgICAgICAgRG9jdW1lbnQgZG9jID0gc29hcEhlYWRlci5nZXRPd25lckRvY3VtZW50KCk7ICAgICAgICAKLSAgICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9ICJodHRwOi8vZXhhbXBsZS5jb20iOwotICAgICAgICBTdHJpbmcgbG9jYWxOYW1lID0gIkdldExhc3RUcmFkZVByaWNlIjsKLSAgICAgICAgRWxlbWVudCBnZXRMYXN0VHJhZGVQcmljZSA9IGRvYy5jcmVhdGVFbGVtZW50TlMobmFtZXNwYWNlLCBsb2NhbE5hbWUpOyAgICAgICAgCi0gICAgICAgIEVsZW1lbnQgc3ltYm9sID0gZG9jLmNyZWF0ZUVsZW1lbnQoInN5bWJvbCIpOwotICAgICAgICBzeW1ib2wuc2V0QXR0cmlidXRlKCJmb28iLCAiYmFyIik7Ci0gICAgICAgIGdldExhc3RUcmFkZVByaWNlLmFwcGVuZENoaWxkKHN5bWJvbCk7Ci0gICAgICAgIG9yZy53M2MuZG9tLlRleHQgZGVmID0gZG9jLmNyZWF0ZVRleHROb2RlKCJERUYiKTsKLSAgICAgICAgc3ltYm9sLmFwcGVuZENoaWxkKGRlZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgc29hcEhlYWRlci5hcHBlbmRDaGlsZChnZXRMYXN0VHJhZGVQcmljZSk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgIGFzc2VydEVxdWFscygxLCBzb2FwSGVhZGVyLmdldENoaWxkTm9kZXMoKS5nZXRMZW5ndGgoKSk7Ci0gICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSBzb2FwSGVhZGVyLmdldENoaWxkRWxlbWVudHMoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShpdGVyLmhhc05leHQoKSk7IAotICAgICAgICBPYmplY3Qgb2JqID0gaXRlci5uZXh0KCk7Ci0gICAgICAgIC8vIG11c3QgYmUgU09BUEhlYWRlckVsZW1lbnQKLSAgICAgICAgYXNzZXJ0VHJ1ZShvYmogaW5zdGFuY2VvZiBTT0FQSGVhZGVyRWxlbWVudCk7ICAKLSAgICAgICAgU09BUEVsZW1lbnQgc29hcEVsZW1lbnQgPSAoU09BUEVsZW1lbnQpb2JqOwotICAgICAgICBhc3NlcnRFcXVhbHMobmFtZXNwYWNlLCBzb2FwRWxlbWVudC5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhsb2NhbE5hbWUsIHNvYXBFbGVtZW50LmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgCi0gICAgICAgIGl0ZXIgPSBzb2FwRWxlbWVudC5nZXRDaGlsZEVsZW1lbnRzKCk7Ci0gICAgICAgIGFzc2VydFRydWUoaXRlci5oYXNOZXh0KCkpOyAKLSAgICAgICAgb2JqID0gaXRlci5uZXh0KCk7Ci0gICAgICAgIGFzc2VydFRydWUob2JqIGluc3RhbmNlb2YgU09BUEVsZW1lbnQpOyAgCi0gICAgICAgIHNvYXBFbGVtZW50ID0gKFNPQVBFbGVtZW50KW9iajsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG51bGwsIHNvYXBFbGVtZW50LmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJzeW1ib2wiLCBzb2FwRWxlbWVudC5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKGl0ZXIuaGFzTmV4dCgpKTsKLSAgICAgICAgCi0gICAgICAgIGl0ZXIgPSBzb2FwRWxlbWVudC5nZXRDaGlsZEVsZW1lbnRzKCk7Ci0gICAgICAgIGFzc2VydFRydWUoaXRlci5oYXNOZXh0KCkpOyAKLSAgICAgICAgb2JqID0gaXRlci5uZXh0KCk7Ci0gICAgICAgIGFzc2VydFRydWUob2JqIGluc3RhbmNlb2YgVGV4dCk7ICAKLSAgICAgICAgVGV4dCB0ZXh0ID0gKFRleHQpb2JqOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkRFRiIsIHRleHQuZ2V0RGF0YSgpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoaXRlci5oYXNOZXh0KCkpOyAgIAotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYWFqL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zYWFqL1NPQVBNZXNzYWdlVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvc2Fhai90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2Fhai9TT0FQTWVzc2FnZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGE4NzMwZC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYWFqL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zYWFqL1NPQVBNZXNzYWdlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjE0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zYWFqOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuc2Fhai51dGlsLlNBQUpEYXRhU291cmNlOwotCi1pbXBvcnQgamF2YXguYWN0aXZhdGlvbi5EYXRhSGFuZGxlcjsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLkF0dGFjaG1lbnRQYXJ0OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLk1lc3NhZ2VGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLk1pbWVIZWFkZXJzOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLk5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEJvZHk7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEJvZHlFbGVtZW50OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBDb25uZWN0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBDb25zdGFudHM7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEVudmVsb3BlOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBGYXVsdDsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQSGVhZGVyOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBIZWFkZXJFbGVtZW50OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBNZXNzYWdlOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBQYXJ0OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVNvdXJjZTsKLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFNPQVBNZXNzYWdlVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICBwcml2YXRlIFNPQVBNZXNzYWdlIG1zZzsKLQotLy8gICAgc3RhdGljIGludCBwb3J0OwotLy8gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBTRVJWSUNFX05BTUUgPSBuZXcgUU5hbWUoIkVjaG8iKTsKLS8vICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgT1BFUkFUSU9OX05BTUUgPSBuZXcgUU5hbWUoImVjaG8iKTsKLS8vCi0vLyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQUFKX1JFUE8gPQotLy8gICAgICAgICAgICBTeXN0ZW0uZ2V0UHJvcGVydHkoImJhc2VkaXIiLCAiLiIpICsgIi8iICsgInRhcmdldC90ZXN0LXJlc291cmNlcy9zYWFqLXJlcG8iOwotLy8KLS8vICAgIHB1YmxpYyBTT0FQTWVzc2FnZVRlc3QoU3RyaW5nIG5hbWUpIHsKLS8vICAgICAgICBzdXBlcihuYW1lKTsKLS8vICAgIH0KLS8vCi0vLyAgICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBnZXRBZGRyZXNzKCkgewotLy8gICAgICAgIHJldHVybiAiaHR0cDovLzEyNy4wLjAuMToiICsKLS8vICAgICAgICAgICAgICAgIHBvcnQgKwotLy8gICAgICAgICAgICAgICAgIi9heGlzMi9zZXJ2aWNlcy9FY2hvIjsKLS8vICAgIH0KLS8vICAgIAotLy8gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotLy8gICAgICAgIHJldHVybiBuZXcgVGVzdFNldHVwKG5ldyBUZXN0U3VpdGUoSW50ZWdyYXRpb25UZXN0LmNsYXNzKSkgewotLy8gICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotLy8gICAgICAgICAgICAgICAgcG9ydCA9IFV0aWxTZXJ2ZXIuc3RhcnQoU0FBSl9SRVBPKTsKLS8vICAgICAgICAgICAgICAgIFBhcmFtZXRlciBlbmVibGVtdG9tID0gbmV3IFBhcmFtZXRlcigiZW5hYmxlTVRPTSIsICJ0cnVlIik7Ci0vLyAgICAgICAgICAgICAgICBVdGlsU2VydmVyLmdldENvbmZpZ3VyYXRpb25Db250ZXh0KCkuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKQotLy8gICAgICAgICAgICAgICAgICAgICAgICAuYWRkUGFyYW1ldGVyKGVuZWJsZW10b20pOwotLy8gICAgICAgICAgICB9Ci0vLwotLy8gICAgICAgICAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotLy8gICAgICAgICAgICAgICAgVXRpbFNlcnZlci5zdG9wKCk7Ci0vLyAgICAgICAgICAgIH0KLS8vICAgICAgICB9OwotLy8gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vICAgICAgICBmaW5hbCBBeGlzU2VydmljZSBzZXJ2aWNlID0gVXRpbHMuY3JlYXRlU2ltcGxlU2VydmljZShTRVJWSUNFX05BTUUsCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWNob1NlcnZpY2UuY2xhc3MuZ2V0TmFtZSgpLAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QRVJBVElPTl9OQU1FKTsKLS8vICAgICAgICBVdGlsU2VydmVyLmRlcGxveVNlcnZpY2Uoc2VydmljZSk7Ci0gICAgICAgIG1zZyA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKCkuY3JlYXRlTWVzc2FnZSgpOwotICAgIH0KLQotLy8gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vICAgICAgICBVdGlsU2VydmVyLnVuRGVwbG95U2VydmljZShTRVJWSUNFX05BTUUpOwotLy8gICAgICAgIFV0aWxTZXJ2ZXIudW5EZXBsb3lDbGllbnRTZXJ2aWNlKCk7Ci0vLyAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2F2ZVJlcXVpcmVkKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiU2F2ZSBSZXF1aXJlZCBpcyBGYWxzZSIsIG1zZy5zYXZlUmVxdWlyZWQoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIEV4Y2VwdGlvbiA6ICIgKyBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTYXZlUmVxdWlyZWQyKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgbXNnLnNhdmVDaGFuZ2VzKCk7Ci0gICAgICAgICAgICBhc3NlcnRGYWxzZSgiU2F2ZSBSZXF1aXJlZCBpcyBUcnVlIiwgbXNnLnNhdmVSZXF1aXJlZCgpKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgRXhjZXB0aW9uIDogIiArIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQXR0YWNoZW1lbnRzKCkgewotICAgICAgICBJdGVyYXRvciBpdGVyYXRvciA9IG51bGw7Ci0gICAgICAgIEF0dGFjaG1lbnRQYXJ0IGFwMSA9IG51bGw7Ci0gICAgICAgIEF0dGFjaG1lbnRQYXJ0IGFwMiA9IG51bGw7Ci0gICAgICAgIEF0dGFjaG1lbnRQYXJ0IGFwMyA9IG51bGw7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5IGZhYyA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKFNPQVBDb25zdGFudHMuU09BUF8xXzJfUFJPVE9DT0wpOwotICAgICAgICAgICAgLy9NZXNzYWdlRmFjdG9yeSBmYWMgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgU09BUE1lc3NhZ2UgbXNnID0gZmFjLmNyZWF0ZU1lc3NhZ2UoKTsKLSAgICAgICAgICAgIFNPQVBQYXJ0IHNvYXBQYXJ0ID0gbXNnLmdldFNPQVBQYXJ0KCk7Ci0gICAgICAgICAgICBTT0FQRW52ZWxvcGUgZW52ZWxvcGUgPSBzb2FwUGFydC5nZXRFbnZlbG9wZSgpOwotICAgICAgICAgICAgU09BUEJvZHkgYm9keSA9IGVudmVsb3BlLmdldEJvZHkoKTsKLSAgICAgICAgICAgIFNPQVBGYXVsdCBzZiA9IGJvZHkuYWRkRmF1bHQoKTsKLQotCi0gICAgICAgICAgICBJbnB1dFN0cmVhbSBpbjEgPSBuZXcgRmlsZUlucHV0U3RyZWFtKG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiYmFzZWRpciIsICIuIikgKwotICAgICAgICAgICAgICAgICAgICAiL3RhcmdldC90ZXN0LXJlc291cmNlcyIgKyBGaWxlLnNlcGFyYXRvciArICJhdHRhY2gueG1sIikpOwotICAgICAgICAgICAgYXAxID0gbXNnLmNyZWF0ZUF0dGFjaG1lbnRQYXJ0KGluMSwgInRleHQveG1sIik7Ci0gICAgICAgICAgICBtc2cuYWRkQXR0YWNobWVudFBhcnQoYXAxKTsKLQotICAgICAgICAgICAgSW5wdXRTdHJlYW0gaW4yID0gbmV3IEZpbGVJbnB1dFN0cmVhbShuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoImJhc2VkaXIiLCAiLiIpICsKLSAgICAgICAgICAgICAgICAgICAgIi90YXJnZXQvdGVzdC1yZXNvdXJjZXMiICsgRmlsZS5zZXBhcmF0b3IgKyAiYXhpczIueG1sIikpOwotICAgICAgICAgICAgYXAyID0gbXNnLmNyZWF0ZUF0dGFjaG1lbnRQYXJ0KGluMiwgInRleHQveG1sIik7Ci0gICAgICAgICAgICBtc2cuYWRkQXR0YWNobWVudFBhcnQoYXAyKTsKLQotICAgICAgICAgICAgSW5wdXRTdHJlYW0gaW4zID0gbmV3IEZpbGVJbnB1dFN0cmVhbShuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoImJhc2VkaXIiLCAiLiIpICsKLSAgICAgICAgICAgICAgICAgICAgIi90YXJnZXQvdGVzdC1yZXNvdXJjZXMiICsgRmlsZS5zZXBhcmF0b3IgKyAiYXhpczIueG1sIikpOwotICAgICAgICAgICAgYXAzID0gbXNnLmNyZWF0ZUF0dGFjaG1lbnRQYXJ0KGluMywgInRleHQvcGxhaW4iKTsKLSAgICAgICAgICAgIG1zZy5hZGRBdHRhY2htZW50UGFydChhcDMpOwotCi0gICAgICAgICAgICAvL2dldCBhbGwgYXR0YWNobWVudHMKLSAgICAgICAgICAgIGl0ZXJhdG9yID0gbXNnLmdldEF0dGFjaG1lbnRzKCk7Ci0KLSAgICAgICAgICAgIGludCBjbnQgPSAwOwotICAgICAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIGNudCsrOwotICAgICAgICAgICAgICAgIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhjbnQsIDMpOwotICAgICAgICAgICAgLy9yZW1vdmUganVzdCB0aGUgdGV4dC94bWwgYXR0YWNobWVudHMKLSAgICAgICAgICAgIE1pbWVIZWFkZXJzIG1ocyA9IG5ldyBNaW1lSGVhZGVycygpOwotICAgICAgICAgICAgbWhzLmFkZEhlYWRlcigiQ29udGVudC1UeXBlIiwgInRleHQveG1sIik7Ci0gICAgICAgICAgICBtc2cucmVtb3ZlQXR0YWNobWVudHMobWhzKTsKLQotICAgICAgICAgICAgLy9nZXQgYWxsIGF0dGFjaG1lbnRzCi0gICAgICAgICAgICBpdGVyYXRvciA9IG1zZy5nZXRBdHRhY2htZW50cygpOwotICAgICAgICAgICAgY250ID0gMDsKLSAgICAgICAgICAgIGl0ZXJhdG9yID0gbXNnLmdldEF0dGFjaG1lbnRzKCk7Ci0gICAgICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgY250Kys7Ci0gICAgICAgICAgICAgICAgaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGNudCwgMSk7Ci0gICAgICAgICAgICBpdGVyYXRvciA9IG1zZy5nZXRBdHRhY2htZW50cygpOwotICAgICAgICAgICAgQXR0YWNobWVudFBhcnQgYXAgPSAoQXR0YWNobWVudFBhcnQpaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgU3RyaW5nIGN0eXBlID0gYXAuZ2V0Q29udGVudFR5cGUoKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoY3R5cGUuZXF1YWxzKCJ0ZXh0L3BsYWluIikpOwotCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJFeGNlcHRpb246ICIgKyBlKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgdGVzdEdldENvbnRlbnQoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBNZXNzYWdlRmFjdG9yeSBmYWMgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZShTT0FQQ29uc3RhbnRzLlNPQVBfMV8yX1BST1RPQ09MKTsKLSAgICAgICAgICAgIC8vTWVzc2FnZUZhY3RvcnkgZmFjID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIFNPQVBNZXNzYWdlIG1zZyA9IGZhYy5jcmVhdGVNZXNzYWdlKCk7Ci0gICAgICAgICAgICBTT0FQUGFydCBzb2FwUGFydCA9IG1zZy5nZXRTT0FQUGFydCgpOwotICAgICAgICAgICAgU09BUEVudmVsb3BlIGVudmVsb3BlID0gc29hcFBhcnQuZ2V0RW52ZWxvcGUoKTsKLSAgICAgICAgICAgIFNPQVBCb2R5IGJvZHkgPSBlbnZlbG9wZS5nZXRCb2R5KCk7Ci0KLSAgICAgICAgICAgIEF0dGFjaG1lbnRQYXJ0IGFwOwotCi0gICAgICAgICAgICBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0obmV3IEZpbGUoU3lzdGVtCi0gICAgICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eSgiYmFzZWRpciIsICIuIikgKyAiL3Rlc3QtcmVzb3VyY2VzIiArIEZpbGUuc2VwYXJhdG9yICsKLSAgICAgICAgICAgICAgICAgICAgImF0dGFjaC54bWwiKSk7Ci0gICAgICAgICAgICBhcCA9IG1zZy5jcmVhdGVBdHRhY2htZW50UGFydChpbnB1dFN0cmVhbSwgInRleHQveG1sIik7Ci0gICAgICAgICAgICBEYXRhSGFuZGxlciBkaCA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBEYXRhSGFuZGxlcihuZXcgU0FBSkRhdGFTb3VyY2UoaW5wdXRTdHJlYW0sIDEwMDAsICJ0ZXh0L3htbCIsIHRydWUpKTsKLQotICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHNiMSA9IGNvcHlUb0J1ZmZlcihkaC5nZXRJbnB1dFN0cmVhbSgpKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYXApOwotCi0gICAgICAgICAgICAvL1ZlcmlmeSBhdHRhY2htZW50IHBhcnQgaXMgbm90IGVtcHR5IGFuZCBjb250ZW50cyBhcmUgY29ycmVjdAotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBPYmplY3QgbyA9IGFwLmdldENvbnRlbnQoKTsKLSAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IG51bGw7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChvKTsKLSAgICAgICAgICAgICAgICBpZiAobyBpbnN0YW5jZW9mIFN0cmVhbVNvdXJjZSkgewotICAgICAgICAgICAgICAgICAgICBTdHJlYW1Tb3VyY2Ugc3MgPSAoU3RyZWFtU291cmNlKW87Ci0gICAgICAgICAgICAgICAgICAgIGlzID0gc3MuZ2V0SW5wdXRTdHJlYW0oKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBmYWlsKCJnb3Qgb2JqZWN0OiAiICsgbyArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwgZXhwZWN0ZWQgb2JqZWN0OiBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1Tb3VyY2UiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBmYWlsKCJhdHRhY2htZW50IGhhcyBubyBjb250ZW50IC0gdW5leHBlY3RlZCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uOiAiICsgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIHByaXZhdGUgU3RyaW5nQnVmZmVyIGNvcHlUb0J1ZmZlcihJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgewotICAgICAgICBpZiAoaW5wdXRTdHJlYW0gPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nV3JpdGVyIHN0cmluZ1dyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICAgICAgQnVmZmVyZWRSZWFkZXIgYnIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKGlucHV0U3RyZWFtKSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTdHJpbmcgczsKLSAgICAgICAgICAgIHdoaWxlICgocyA9IGJyLnJlYWRMaW5lKCkpICE9IG51bGwpCi0gICAgICAgICAgICAgICAgc3RyaW5nV3JpdGVyLndyaXRlKHMpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RyaW5nV3JpdGVyLmdldEJ1ZmZlcigpOwotICAgIH0KLQotICAgIC8qCi0gICAgICAqIERvIG5vdCBhZGQgdGhpcyB0ZXN0IHVubGVzcyBiZWxvdyBtZW50aW9uZWQgcmVzb3VyY2VzIGFyZSBhY2Nlc3NpYmxlCi0gICAgICAqLwotCi0gICAgcHVibGljIHZvaWQgX3Rlc3RHZXRBdHRhY2htZW50c0J5SFJFRigpIHsKLSAgICAgICAgU3RyaW5nIE5TX1BSRUZJWCA9ICJteXByZSI7Ci0gICAgICAgIFN0cmluZyBOU19VUkkgPSAiaHR0cDovL215dXJpLm9yZy8iOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvL01lc3NhZ2VGYWN0b3J5IGZhYyA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKFNPQVBDb25zdGFudHMuU09BUF8xXzJfUFJPVE9DT0wpOwotICAgICAgICAgICAgU09BUE1lc3NhZ2UgbXNnID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoKS5jcmVhdGVNZXNzYWdlKCk7Ci0KLSAgICAgICAgICAgIC8vIE1lc3NhZ2UgY3JlYXRpb24gdGFrZXMgY2FyZSBvZiBjcmVhdGluZyB0aGUgU09BUFBhcnQgLSBhCi0gICAgICAgICAgICAvLyByZXF1aXJlZCBwYXJ0IG9mIHRoZSBtZXNzYWdlIGFzIHBlciB0aGUgU09BUCAxLjEgc3BlYy4KLSAgICAgICAgICAgIFNPQVBQYXJ0IHNwID0gbXNnLmdldFNPQVBQYXJ0KCk7Ci0gICAgICAgICAgICBTT0FQRW52ZWxvcGUgZW52ZWxvcGUgPSBzcC5nZXRFbnZlbG9wZSgpOwotICAgICAgICAgICAgU09BUEhlYWRlciBoZHIgPSBlbnZlbG9wZS5nZXRIZWFkZXIoKTsKLSAgICAgICAgICAgIFNPQVBCb2R5IGJkeSA9IGVudmVsb3BlLmdldEJvZHkoKTsKLSAgICAgICAgICAgIFNPQVBCb2R5RWxlbWVudCBzYmUxID0gYmR5LmFkZEJvZHlFbGVtZW50KAotICAgICAgICAgICAgICAgICAgICBlbnZlbG9wZS5jcmVhdGVOYW1lKCJCb2R5MSIsIE5TX1BSRUZJWCwgTlNfVVJJKSk7Ci0gICAgICAgICAgICBzYmUxLmFkZENoaWxkRWxlbWVudChlbnZlbG9wZS5jcmVhdGVOYW1lKAotICAgICAgICAgICAgICAgICAgICAiVGhlR2lmQXR0YWNobWVudCIsIE5TX1BSRUZJWCwgTlNfVVJJKSk7Ci0gICAgICAgICAgICBzYmUxLnNldEF0dHJpYnV0ZSgiaHJlZiIsICJjaWQ6VEhFR0lGIik7Ci0gICAgICAgICAgICBTT0FQQm9keUVsZW1lbnQgc2JlMiA9IGJkeS5hZGRCb2R5RWxlbWVudCgKLSAgICAgICAgICAgICAgICAgICAgZW52ZWxvcGUuY3JlYXRlTmFtZSgiQm9keTIiLCBOU19QUkVGSVgsIE5TX1VSSSkpOwotICAgICAgICAgICAgc2JlMi5hZGRDaGlsZEVsZW1lbnQoZW52ZWxvcGUuY3JlYXRlTmFtZSgKLSAgICAgICAgICAgICAgICAgICAgIlRoZVhtbEF0dGFjaG1lbnQiLCBOU19QUkVGSVgsIE5TX1VSSSkpOwotICAgICAgICAgICAgc2JlMi5zZXRBdHRyaWJ1dGUoImhyZWYiLCAiY2lkOlRIRVhNTCIpOwotCi0gICAgICAgICAgICBVUkwgdXJsMSA9IG5ldyBVUkwoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9TT0FQTWVzc2FnZS9hdHRhY2gueG1sIik7Ci0gICAgICAgICAgICBVUkwgdXJsMiA9IG5ldyBVUkwoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9TT0FQTWVzc2FnZS9hdHRhY2guZ2lmIik7Ci0gICAgICAgICAgICBVUkwgdXJsMyA9IG5ldyBVUkwoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9TT0FQTWVzc2FnZS9hdHRhY2gudHh0Iik7Ci0gICAgICAgICAgICBVUkwgdXJsNCA9IG5ldyBVUkwoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9TT0FQTWVzc2FnZS9hdHRhY2guaHRtbCIpOwotICAgICAgICAgICAgVVJMIHVybDUgPSBuZXcgVVJMKCJodHRwOi8vbG9jYWxob3N0OjgwODAvU09BUE1lc3NhZ2UvYXR0YWNoLmpwZWciKTsKLQotICAgICAgICAgICAgLy9BZGQgdmFyaW91cyBtaW1lIHR5cGUgYXR0YWNobWVudHMgdG8gU09BUCBtZXNzYWdlCi0gICAgICAgICAgICBBdHRhY2htZW50UGFydCBhcDEgPSBtc2cuY3JlYXRlQXR0YWNobWVudFBhcnQobmV3IERhdGFIYW5kbGVyKHVybDEpKTsKLSAgICAgICAgICAgIEF0dGFjaG1lbnRQYXJ0IGFwMiA9IG1zZy5jcmVhdGVBdHRhY2htZW50UGFydChuZXcgRGF0YUhhbmRsZXIodXJsMikpOwotICAgICAgICAgICAgQXR0YWNobWVudFBhcnQgYXAzID0gbXNnLmNyZWF0ZUF0dGFjaG1lbnRQYXJ0KG5ldyBEYXRhSGFuZGxlcih1cmwzKSk7Ci0gICAgICAgICAgICBBdHRhY2htZW50UGFydCBhcDQgPSBtc2cuY3JlYXRlQXR0YWNobWVudFBhcnQobmV3IERhdGFIYW5kbGVyKHVybDQpKTsKLSAgICAgICAgICAgIEF0dGFjaG1lbnRQYXJ0IGFwNSA9IG1zZy5jcmVhdGVBdHRhY2htZW50UGFydChuZXcgRGF0YUhhbmRsZXIodXJsNSkpOwotCi0gICAgICAgICAgICBhcDEuc2V0Q29udGVudFR5cGUoInRleHQveG1sIik7Ci0gICAgICAgICAgICBhcDEuc2V0Q29udGVudElkKCI8VEhFWE1MPiIpOwotICAgICAgICAgICAgYXAyLnNldENvbnRlbnRUeXBlKCJpbWFnZS9naWYiKTsKLSAgICAgICAgICAgIGFwMi5zZXRDb250ZW50SWQoIjxUSEVHSUY+Iik7Ci0gICAgICAgICAgICBhcDMuc2V0Q29udGVudFR5cGUoInRleHQvcGxhaW4iKTsKLSAgICAgICAgICAgIGFwMy5zZXRDb250ZW50SWQoIjxUSEVQTEFJTj4iKTsKLSAgICAgICAgICAgIGFwNC5zZXRDb250ZW50VHlwZSgidGV4dC9odG1sIik7Ci0gICAgICAgICAgICBhcDQuc2V0Q29udGVudElkKCI8VEhFSFRNTD4iKTsKLSAgICAgICAgICAgIGFwNS5zZXRDb250ZW50VHlwZSgiaW1hZ2UvanBlZyIpOwotICAgICAgICAgICAgYXA1LnNldENvbnRlbnRJZCgiPFRIRUpQRUc+Iik7Ci0KLSAgICAgICAgICAgIG1zZy5hZGRBdHRhY2htZW50UGFydChhcDEpOwotICAgICAgICAgICAgbXNnLmFkZEF0dGFjaG1lbnRQYXJ0KGFwMik7Ci0gICAgICAgICAgICBtc2cuYWRkQXR0YWNobWVudFBhcnQoYXAzKTsKLSAgICAgICAgICAgIG1zZy5hZGRBdHRhY2htZW50UGFydChhcDQpOwotICAgICAgICAgICAgbXNnLmFkZEF0dGFjaG1lbnRQYXJ0KGFwNSk7Ci0gICAgICAgICAgICBtc2cuc2F2ZUNoYW5nZXMoKTsKLQotICAgICAgICAgICAgLy9SZXRyaWV2ZSBhdHRhY2htZW50IHdpdGggaHJlZj1jaWQ6VEhFR0lGCi0gICAgICAgICAgICBBdHRhY2htZW50UGFydCBteWFwID0gbXNnLmdldEF0dGFjaG1lbnQoc2JlMSk7Ci0gICAgICAgICAgICBpZiAobXlhcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZmFpbCgiUmV0dXJuZWQgbnVsbCAodW5leHBlY3RlZCkiKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIW15YXAuZ2V0Q29udGVudFR5cGUoKS5lcXVhbHMoImltYWdlL2dpZiIpKSB7Ci0gICAgICAgICAgICAgICAgZmFpbCgiV3JvbmcgYXR0YWNobWVudCB3YXMgcmV0dXJuZWQ6IEdvdCBDb250ZW50LVR5cGUgb2YgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBteWFwLmdldENvbnRlbnRUeXBlKCkgKyAiLCBFeHBlY3RlZCBDb250ZW50LVR5cGUgb2YgaW1hZ2UvZ2lmIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvL1JldHJpZXZlIGF0dGFjaG1lbnQgd2l0aCBocmVmPWNpZDpUSEVYTUwKLSAgICAgICAgICAgIG15YXAgPSBtc2cuZ2V0QXR0YWNobWVudChzYmUyKTsKLSAgICAgICAgICAgIGlmIChteWFwID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmYWlsKCJSZXR1cm5lZCBudWxsICh1bmV4cGVjdGVkKSIpOwotICAgICAgICAgICAgfSBlbHNlIGlmICghbXlhcC5nZXRDb250ZW50VHlwZSgpLmVxdWFscygidGV4dC94bWwiKSkgewotICAgICAgICAgICAgICAgIGZhaWwoIldyb25nIGF0dGFjaG1lbnQgd2FzIHJldHVybmVkOiBHb3QgQ29udGVudC1UeXBlIG9mICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgbXlhcC5nZXRDb250ZW50VHlwZSgpICsgIiwgRXhwZWN0ZWQgQ29udGVudC1UeXBlIG9mIHRleHQveG1sIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvL1JldHJpZXZlIGF0dGFjaG1lbnQgd2l0aCBocmVmPWNpZDpib28taG9vIChleHBlY3QgbnVsbCkKLSAgICAgICAgICAgIFFOYW1lIG15cW5hbWUgPSBuZXcgUU5hbWUoImJvby1ob28iKTsKLSAgICAgICAgICAgIFNPQVBFbGVtZW50IG15c2UgPSBTT0FQRmFjdG9yeUltcGwubmV3SW5zdGFuY2UoKS5jcmVhdGVFbGVtZW50KG15cW5hbWUpOwotICAgICAgICAgICAgbXlzZS5hZGRUZXh0Tm9kZSgiPHRoZUJvb0hvb0F0dGFjaG1lbnQgaHJlZj1cImNpZDpib28taG9vXCIvPiIpOwotICAgICAgICAgICAgbXlhcCA9IG1zZy5nZXRBdHRhY2htZW50KG15c2UpOwotICAgICAgICAgICAgYXNzZXJ0TnVsbChteWFwKTsKLQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiRXJyb3IgOiIgKyBlKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLyoKLSAgICAgICogRG8gbm90IGFkZCB0aGlzIHRlc3QgdW5sZXNzIGJlbG93IG1lbnRpb25lZCByZXNvdXJjZXMgYXJlIGFjY2Vzc2libGUKLSAgICAgICovCi0gICAgcHVibGljIHZvaWQgX3Rlc3RHZXRBdHRhY2htZW50QnlIUkVGMigpIHsKLSAgICAgICAgU3RyaW5nIE5TX1BSRUZJWCA9ICJteXByZSI7Ci0gICAgICAgIFN0cmluZyBOU19VUkkgPSAiaHR0cDovL215dXJpLm9yZy8iOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBNZXNzYWdlRmFjdG9yeSBmYWMgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgU09BUE1lc3NhZ2UgbXNnID0gZmFjLmNyZWF0ZU1lc3NhZ2UoKTsKLQotICAgICAgICAgICAgLy8gTWVzc2FnZSBjcmVhdGlvbiB0YWtlcyBjYXJlIG9mIGNyZWF0aW5nIHRoZSBTT0FQUGFydCAtIGEKLSAgICAgICAgICAgIC8vIHJlcXVpcmVkIHBhcnQgb2YgdGhlIG1lc3NhZ2UgYXMgcGVyIHRoZSBTT0FQIDEuMSBzcGVjLgotICAgICAgICAgICAgU09BUFBhcnQgc3AgPSBtc2cuZ2V0U09BUFBhcnQoKTsKLSAgICAgICAgICAgIFNPQVBFbnZlbG9wZSBlbnZlbG9wZSA9IHNwLmdldEVudmVsb3BlKCk7Ci0gICAgICAgICAgICBTT0FQSGVhZGVyIGhkciA9IGVudmVsb3BlLmdldEhlYWRlcigpOwotCi0gICAgICAgICAgICBTT0FQQm9keSBiZHkgPSBlbnZlbG9wZS5nZXRCb2R5KCk7Ci0gICAgICAgICAgICBTT0FQQm9keUVsZW1lbnQgc2JlMSA9IGJkeS5hZGRCb2R5RWxlbWVudCgKLSAgICAgICAgICAgICAgICAgICAgZW52ZWxvcGUuY3JlYXRlTmFtZSgiQm9keTEiLCBOU19QUkVGSVgsIE5TX1VSSSkpOwotICAgICAgICAgICAgc2JlMS5hZGRDaGlsZEVsZW1lbnQoZW52ZWxvcGUuY3JlYXRlTmFtZSgKLSAgICAgICAgICAgICAgICAgICAgIlRoZUdpZkF0dGFjaG1lbnQiLCBOU19QUkVGSVgsIE5TX1VSSSkpOwotCi0gICAgICAgICAgICBTT0FQQm9keUVsZW1lbnQgc2JlMiA9IGJkeS5hZGRCb2R5RWxlbWVudCgKLSAgICAgICAgICAgICAgICAgICAgZW52ZWxvcGUuY3JlYXRlTmFtZSgiQm9keTIiLCBOU19QUkVGSVgsIE5TX1VSSSkpOwotCi0gICAgICAgICAgICBzYmUyLmFkZENoaWxkRWxlbWVudChlbnZlbG9wZS5jcmVhdGVOYW1lKAotICAgICAgICAgICAgICAgICAgICAiVGhlWG1sQXR0YWNobWVudCIsIE5TX1BSRUZJWCwgTlNfVVJJKSk7Ci0KLSAgICAgICAgICAgIFVSTCB1cmwxID0gbmV3IFVSTCgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL1NPQVBNZXNzYWdlL2F0dGFjaC54bWwiKTsKLSAgICAgICAgICAgIFVSTCB1cmwyID0gbmV3IFVSTCgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL1NPQVBNZXNzYWdlL2F0dGFjaC5naWYiKTsKLSAgICAgICAgICAgIFVSTCB1cmwzID0gbmV3IFVSTCgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL1NPQVBNZXNzYWdlL2F0dGFjaC50eHQiKTsKLSAgICAgICAgICAgIFVSTCB1cmw0ID0gbmV3IFVSTCgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL1NPQVBNZXNzYWdlL2F0dGFjaC5odG1sIik7Ci0gICAgICAgICAgICBVUkwgdXJsNSA9IG5ldyBVUkwoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9TT0FQTWVzc2FnZS9hdHRhY2guanBlZyIpOwotCi0gICAgICAgICAgICAvLyBTZXQgaHJlZiBvbiBib2R5IGVsZW1lbnRzIHVzaW5nIENvbnRlbnQtTG9jYXRpb24gaGVhZGVycyBhbmQgcmVsYXRpdmUgVVJJJ3MKLSAgICAgICAgICAgIHNiZTEuc2V0QXR0cmlidXRlKCJocmVmIiwgdXJsMi50b1N0cmluZygpKTsKLSAgICAgICAgICAgIHNiZTIuc2V0QXR0cmlidXRlKCJocmVmIiwgdXJsMS50b1N0cmluZygpKTsKLQotICAgICAgICAgICAgQXR0YWNobWVudFBhcnQgYXAxID0gbXNnLmNyZWF0ZUF0dGFjaG1lbnRQYXJ0KG5ldyBEYXRhSGFuZGxlcih1cmwxKSk7Ci0gICAgICAgICAgICBBdHRhY2htZW50UGFydCBhcDIgPSBtc2cuY3JlYXRlQXR0YWNobWVudFBhcnQobmV3IERhdGFIYW5kbGVyKHVybDIpKTsKLSAgICAgICAgICAgIEF0dGFjaG1lbnRQYXJ0IGFwMyA9IG1zZy5jcmVhdGVBdHRhY2htZW50UGFydChuZXcgRGF0YUhhbmRsZXIodXJsMykpOwotICAgICAgICAgICAgQXR0YWNobWVudFBhcnQgYXA0ID0gbXNnLmNyZWF0ZUF0dGFjaG1lbnRQYXJ0KG5ldyBEYXRhSGFuZGxlcih1cmw0KSk7Ci0gICAgICAgICAgICBBdHRhY2htZW50UGFydCBhcDUgPSBtc2cuY3JlYXRlQXR0YWNobWVudFBhcnQobmV3IERhdGFIYW5kbGVyKHVybDUpKTsKLQotICAgICAgICAgICAgYXAxLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3htbCIpOwotICAgICAgICAgICAgYXAxLnNldENvbnRlbnRJZCgiPFRIRVhNTD4iKTsKLSAgICAgICAgICAgIGFwMS5zZXRDb250ZW50TG9jYXRpb24odXJsMS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIGFwMi5zZXRDb250ZW50VHlwZSgiaW1hZ2UvZ2lmIik7Ci0gICAgICAgICAgICBhcDIuc2V0Q29udGVudElkKCI8VEhFR0lGPiIpOwotICAgICAgICAgICAgYXAyLnNldENvbnRlbnRMb2NhdGlvbih1cmwyLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgYXAzLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3BsYWluIik7Ci0gICAgICAgICAgICBhcDMuc2V0Q29udGVudElkKCI8VEhFUExBSU4+Iik7Ci0gICAgICAgICAgICBhcDMuc2V0Q29udGVudExvY2F0aW9uKHVybDMudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICBhcDQuc2V0Q29udGVudFR5cGUoInRleHQvaHRtbCIpOwotICAgICAgICAgICAgYXA0LnNldENvbnRlbnRJZCgiPFRIRUhUTUw+Iik7Ci0gICAgICAgICAgICBhcDQuc2V0Q29udGVudExvY2F0aW9uKHVybDQudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICBhcDUuc2V0Q29udGVudFR5cGUoImltYWdlL2pwZWciKTsKLSAgICAgICAgICAgIGFwNS5zZXRDb250ZW50SWQoIjxUSEVKUEVHPiIpOwotICAgICAgICAgICAgYXA1LnNldENvbnRlbnRMb2NhdGlvbih1cmw1LnRvU3RyaW5nKCkpOwotCi0gICAgICAgICAgICAvLyBBZGQgdGhlIGF0dGFjaG1lbnRzIHRvIHRoZSBtZXNzYWdlLgotICAgICAgICAgICAgbXNnLmFkZEF0dGFjaG1lbnRQYXJ0KGFwMSk7Ci0gICAgICAgICAgICBtc2cuYWRkQXR0YWNobWVudFBhcnQoYXAyKTsKLSAgICAgICAgICAgIG1zZy5hZGRBdHRhY2htZW50UGFydChhcDMpOwotICAgICAgICAgICAgbXNnLmFkZEF0dGFjaG1lbnRQYXJ0KGFwNCk7Ci0gICAgICAgICAgICBtc2cuYWRkQXR0YWNobWVudFBhcnQoYXA1KTsKLSAgICAgICAgICAgIG1zZy5zYXZlQ2hhbmdlcygpOwotCi0gICAgICAgICAgICAvL1JldHJpZXZlIGF0dGFjaG1lbnQgd2l0aCBocmVmPVRIRUdJRgotICAgICAgICAgICAgQXR0YWNobWVudFBhcnQgbXlhcCA9IG1zZy5nZXRBdHRhY2htZW50KHNiZTEpOwotICAgICAgICAgICAgaWYgKG15YXAgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZhaWwoIlJldHVybmVkIG51bGwgKHVuZXhwZWN0ZWQpIik7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFteWFwLmdldENvbnRlbnRUeXBlKCkuZXF1YWxzKCJpbWFnZS9naWYiKSkgewotICAgICAgICAgICAgICAgIGZhaWwoIldyb25nIGF0dGFjaG1lbnQgd2FzIHJldHVybmVkOiBHb3QgQ29udGVudC1UeXBlIG9mICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgbXlhcC5nZXRDb250ZW50VHlwZSgpICsgIiwgRXhwZWN0ZWQgQ29udGVudC1UeXBlIG9mIGltYWdlL2dpZiIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvL1JldHJpZXZlIGF0dGFjaG1lbnQgd2l0aCBocmVmPVRIRVhNTAotICAgICAgICAgICAgbXlhcCA9IG1zZy5nZXRBdHRhY2htZW50KHNiZTIpOwotICAgICAgICAgICAgaWYgKG15YXAgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZhaWwoIlJldHVybmVkIG51bGwgKHVuZXhwZWN0ZWQpIik7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFteWFwLmdldENvbnRlbnRUeXBlKCkuZXF1YWxzKCJ0ZXh0L3htbCIpKSB7Ci0gICAgICAgICAgICAgICAgZmFpbCgiV3JvbmcgYXR0YWNobWVudCB3YXMgcmV0dXJuZWQ6IEdvdCBDb250ZW50LVR5cGUgb2YgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBteWFwLmdldENvbnRlbnRUeXBlKCkgKyAiLCBFeHBlY3RlZCBDb250ZW50LVR5cGUgb2YgdGV4dC94bWwiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy9SZXRyaWV2ZSBhdHRhY2htZW50IHdpdGggaHJlZj1ib28taG9vIChleHBlY3QgbnVsbCkKLSAgICAgICAgICAgIFFOYW1lIG15cW5hbWUgPSBuZXcgUU5hbWUoImJvby1ob28iKTsKLSAgICAgICAgICAgIFNPQVBFbGVtZW50IG15c2UgPSBTT0FQRmFjdG9yeS5uZXdJbnN0YW5jZSgpLmNyZWF0ZUVsZW1lbnQobXlxbmFtZSk7Ci0gICAgICAgICAgICBteXNlLmFkZFRleHROb2RlKCI8dGhlQm9vSG9vQXR0YWNobWVudCBocmVmPVwiYm9vLWhvb1wiLz4iKTsKLSAgICAgICAgICAgIG15YXAgPSBtc2cuZ2V0QXR0YWNobWVudChteXNlKTsKLSAgICAgICAgICAgIGFzc2VydE51bGwobXlhcCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJFeGNlcHRpb246ICIgKyBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIF90ZXN0TWVzc2FnZUNyZWF0aW9uKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIE5TX1BSRUZJWCA9ICJucy1wcmVmaXgiOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIE5TX1VSSSA9ICJucy11cmkiOwotCi0gICAgICAgICAgICBNZXNzYWdlRmFjdG9yeSBmYWMgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgU09BUE1lc3NhZ2UgbXNnID0gZmFjLmNyZWF0ZU1lc3NhZ2UoKTsKLQotICAgICAgICAgICAgU09BUFBhcnQgc3AgPSBtc2cuZ2V0U09BUFBhcnQoKTsKLSAgICAgICAgICAgIFNPQVBFbnZlbG9wZSBlbnZlbG9wZSA9IHNwLmdldEVudmVsb3BlKCk7Ci0gICAgICAgICAgICBTT0FQSGVhZGVyIGhkciA9IGVudmVsb3BlLmdldEhlYWRlcigpOwotICAgICAgICAgICAgU09BUEJvZHkgYmR5ID0gZW52ZWxvcGUuZ2V0Qm9keSgpOwotCi0gICAgICAgICAgICBTT0FQRWxlbWVudCBzZSA9IGhkci5hZGRIZWFkZXJFbGVtZW50KAotICAgICAgICAgICAgICAgICAgICBlbnZlbG9wZS5jcmVhdGVOYW1lKCJIZWFkZXIxIiwgTlNfUFJFRklYLCBOU19VUkkpKQotICAgICAgICAgICAgICAgICAgICAuYWRkVGV4dE5vZGUoIlRoaXMgaXMgSGVhZGVyMSIpOwotICAgICAgICAgICAgU09BUEhlYWRlckVsZW1lbnQgc2hlID0gKFNPQVBIZWFkZXJFbGVtZW50KXNlOwotICAgICAgICAgICAgc2hlLnNldE11c3RVbmRlcnN0YW5kKHRydWUpOwotCi0gICAgICAgICAgICBzZSA9IGhkci5hZGRIZWFkZXJFbGVtZW50KAotICAgICAgICAgICAgICAgICAgICBlbnZlbG9wZS5jcmVhdGVOYW1lKCJIZWFkZXIyIiwgTlNfUFJFRklYLCBOU19VUkkpKQotICAgICAgICAgICAgICAgICAgICAuYWRkVGV4dE5vZGUoIlRoaXMgaXMgSGVhZGVyMiIpOwotICAgICAgICAgICAgc2hlID0gKFNPQVBIZWFkZXJFbGVtZW50KXNlOwotICAgICAgICAgICAgc2hlLnNldE11c3RVbmRlcnN0YW5kKGZhbHNlKTsKLQotICAgICAgICAgICAgc2UgPSBoZHIuYWRkSGVhZGVyRWxlbWVudCgKLSAgICAgICAgICAgICAgICAgICAgZW52ZWxvcGUuY3JlYXRlTmFtZSgiSGVhZGVyMyIsIE5TX1BSRUZJWCwgTlNfVVJJKSkKLSAgICAgICAgICAgICAgICAgICAgLmFkZFRleHROb2RlKCJUaGlzIGlzIEhlYWRlcjMiKTsKLSAgICAgICAgICAgIHNoZSA9IChTT0FQSGVhZGVyRWxlbWVudClzZTsKLSAgICAgICAgICAgIHNoZS5zZXRNdXN0VW5kZXJzdGFuZCh0cnVlKTsKLQotICAgICAgICAgICAgc2UgPSBoZHIuYWRkSGVhZGVyRWxlbWVudCgKLSAgICAgICAgICAgICAgICAgICAgZW52ZWxvcGUuY3JlYXRlTmFtZSgiSGVhZGVyNCIsIE5TX1BSRUZJWCwgTlNfVVJJKSkKLSAgICAgICAgICAgICAgICAgICAgLmFkZFRleHROb2RlKCJUaGlzIGlzIEhlYWRlcjQiKTsKLSAgICAgICAgICAgIHNoZSA9IChTT0FQSGVhZGVyRWxlbWVudClzZTsKLSAgICAgICAgICAgIHNoZS5zZXRNdXN0VW5kZXJzdGFuZChmYWxzZSk7Ci0KLSAgICAgICAgICAgIFNPQVBCb2R5RWxlbWVudCBzYmUgPSBiZHkuYWRkQm9keUVsZW1lbnQoCi0gICAgICAgICAgICAgICAgICAgIGVudmVsb3BlLmNyZWF0ZU5hbWUoIkJvZHkxIiwgTlNfUFJFRklYLCBOU19VUkkpKTsKLQotICAgICAgICAgICAgc2JlLmFkZENoaWxkRWxlbWVudChlbnZlbG9wZS5jcmVhdGVOYW1lKAotICAgICAgICAgICAgICAgICAgICAiQ2hpbGQxIiwgTlNfUFJFRklYLCBOU19VUkkpKS5hZGRUZXh0Tm9kZSgiVGhpcyBpcyBDaGlsZDEiKTsKLSAgICAgICAgICAgIHNiZS5hZGRDaGlsZEVsZW1lbnQoZW52ZWxvcGUuY3JlYXRlTmFtZSgKLSAgICAgICAgICAgICAgICAgICAgIkNoaWxkMiIsIE5TX1BSRUZJWCwgTlNfVVJJKSkuYWRkVGV4dE5vZGUoIlRoaXMgaXMgQ2hpbGQyIik7Ci0KLQotICAgICAgICAgICAgVVJMIHVybDEgPSBuZXcgVVJMKCJodHRwOi8vbG9jYWxob3N0OjgwODAvU09BUE1lc3NhZ2UvYXR0YWNoLnhtbCIpOwotICAgICAgICAgICAgQXR0YWNobWVudFBhcnQgYXAgPSBtc2cuY3JlYXRlQXR0YWNobWVudFBhcnQobmV3IERhdGFIYW5kbGVyKHVybDEpKTsKLSAgICAgICAgICAgIGFwLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3htbCIpOwotICAgICAgICAgICAgbXNnLmFkZEF0dGFjaG1lbnRQYXJ0KGFwKTsKLSAgICAgICAgICAgIG1zZy5zYXZlQ2hhbmdlcygpOwotCi0gICAgICAgICAgICAvLyBDcmVhdGUgYSB1cmwgZW5kcG9pbnQgZm9yIHRoZSByZWNpcGllbnQgb2YgdGhlIG1lc3NhZ2UuCi0gICAgICAgICAgICBVUkwgdXJsRW5kcG9pbnQgPSBuZXcgVVJMKCJodHRwOi8vbG9jYWxob3N0OjgwODAvUmVjZWl2aW5nU09BUDExU2VydmxldCIpOwotCi0gICAgICAgICAgICAvLyBTZW5kIHRoZSBtZXNzYWdlIHRvIHRoZSBlbmRwb2ludCB1c2luZyB0aGUgY29ubmVjdGlvbi4KLSAgICAgICAgICAgIFNPQVBDb25uZWN0aW9uIGNvbiA9IG5ldyBTT0FQQ29ubmVjdGlvbkltcGwoKTsKLSAgICAgICAgICAgIFNPQVBNZXNzYWdlIHJlcGx5bXNnID0gY29uLmNhbGwobXNnLCB1cmxFbmRwb2ludCk7Ci0KLSAgICAgICAgICAgIC8vIENoZWNrIGlmIHJlcGx5IG1lc3NhZ2UKLSAgICAgICAgICAgIGlmICghdmFsaWRhdGVSZXBseU1lc3NhZ2UocmVwbHltc2csIDEpKSB7Ci0gICAgICAgICAgICAgICAgLy9SZXBseSBtZXNzYWdlIGlzIGNvcnJlY3QKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy9UZXN0VXRpbC5sb2dFcnIoIlJlcGx5IG1lc3NhZ2UgaXMgaW5jb3JyZWN0IChGQUlMRUQpIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiU2VuZFN5bmNSZXFSZXNwTXNnVGVzdDIgRXhjZXB0aW9uOiAiICsgZSk7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZShTeXN0ZW0uZXJyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiB2YWxpZGF0ZVJlcGx5TWVzc2FnZShTT0FQTWVzc2FnZSBtc2csIGludCBudW0pIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJvb2xlYW4gcGFzcyA9IHRydWU7Ci0gICAgICAgICAgICBTT0FQRW52ZWxvcGUgZW52ZWxvcGUgPSBtc2cuZ2V0U09BUFBhcnQoKS5nZXRFbnZlbG9wZSgpOwotCi0gICAgICAgICAgICBib29sZWFuIGZvdW5kSGVhZGVyMSA9IGZhbHNlOwotICAgICAgICAgICAgYm9vbGVhbiBmb3VuZEhlYWRlcjIgPSBmYWxzZTsKLSAgICAgICAgICAgIGJvb2xlYW4gZm91bmRIZWFkZXIzID0gZmFsc2U7Ci0gICAgICAgICAgICBib29sZWFuIGZvdW5kSGVhZGVyNCA9IGZhbHNlOwotICAgICAgICAgICAgSXRlcmF0b3IgaSA9IGVudmVsb3BlLmdldEhlYWRlcigpLmV4YW1pbmVBbGxIZWFkZXJFbGVtZW50cygpOwotICAgICAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgU09BUEVsZW1lbnQgc2UgPSAoU09BUEVsZW1lbnQpaS5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgTmFtZSBuYW1lID0gc2UuZ2V0RWxlbWVudE5hbWUoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBzZS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsIHx8IG5hbWUgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUuZXF1YWxzKCJUaGlzIGlzIEhlYWRlcjEiKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgbmFtZS5nZXRMb2NhbE5hbWUoKS5lcXVhbHMoIkhlYWRlcjEiKSkKLSAgICAgICAgICAgICAgICAgICAgZm91bmRIZWFkZXIxID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmICh2YWx1ZS5lcXVhbHMoIlRoaXMgaXMgSGVhZGVyMiIpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBuYW1lLmdldExvY2FsTmFtZSgpLmVxdWFscygiSGVhZGVyMiIpKQotICAgICAgICAgICAgICAgICAgICBmb3VuZEhlYWRlcjIgPSB0cnVlOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlLmVxdWFscygiVGhpcyBpcyBIZWFkZXIzIikKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIG5hbWUuZ2V0TG9jYWxOYW1lKCkuZXF1YWxzKCJIZWFkZXIzIikpCi0gICAgICAgICAgICAgICAgICAgIGZvdW5kSGVhZGVyMyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUuZXF1YWxzKCJUaGlzIGlzIEhlYWRlcjQiKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgbmFtZS5nZXRMb2NhbE5hbWUoKS5lcXVhbHMoIkhlYWRlcjQiKSkKLSAgICAgICAgICAgICAgICAgICAgZm91bmRIZWFkZXI0ID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghZm91bmRIZWFkZXIxIHx8ICFmb3VuZEhlYWRlcjIgfHwKLSAgICAgICAgICAgICAgICAgICAgIWZvdW5kSGVhZGVyMyB8fCAhZm91bmRIZWFkZXI0KSB7Ci0gICAgICAgICAgICAgICAgLy9leHBlY3RlZCBzb2FwIGhlYWRlcnMgaW4gcmVwbHkgbWVzc2FnZQotICAgICAgICAgICAgICAgIHBhc3MgPSBmYWxzZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy9leHBlY3RlZCBzb2FwIGhlYWRlcnMgaW4gcmVwbHkgbWVzc2FnZQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYm9vbGVhbiBmb3VuZEJvZHkxID0gZmFsc2U7Ci0gICAgICAgICAgICBib29sZWFuIGZvdW5kQ2hpbGQxID0gZmFsc2U7Ci0gICAgICAgICAgICBib29sZWFuIGZvdW5kQ2hpbGQyID0gZmFsc2U7Ci0gICAgICAgICAgICBTT0FQQm9keSBiZHkgPSBlbnZlbG9wZS5nZXRCb2R5KCk7Ci0gICAgICAgICAgICBpID0gYmR5LmdldENoaWxkRWxlbWVudHMoKTsKLSAgICAgICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIFNPQVBCb2R5RWxlbWVudCBzYmUgPSAoU09BUEJvZHlFbGVtZW50KWkubmV4dCgpOwotICAgICAgICAgICAgICAgIE5hbWUgbmFtZSA9IHNiZS5nZXRFbGVtZW50TmFtZSgpOwotICAgICAgICAgICAgICAgIGlmIChuYW1lLmdldExvY2FsTmFtZSgpLmVxdWFscygiQm9keTEiKSkKLSAgICAgICAgICAgICAgICAgICAgZm91bmRCb2R5MSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgSXRlcmF0b3IgYyA9IHNiZS5nZXRDaGlsZEVsZW1lbnRzKCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGMuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFNPQVBFbGVtZW50IHNlID0gKFNPQVBFbGVtZW50KWMubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBuYW1lID0gc2UuZ2V0RWxlbWVudE5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gc2UuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlLmVxdWFscygiVGhpcyBpcyBDaGlsZDEiKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIG5hbWUuZ2V0TG9jYWxOYW1lKCkuZXF1YWxzKCJDaGlsZDEiKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kQ2hpbGQxID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUuZXF1YWxzKCJUaGlzIGlzIENoaWxkMiIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbmFtZS5nZXRMb2NhbE5hbWUoKS5lcXVhbHMoIkNoaWxkMiIpKQotICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRDaGlsZDIgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghZm91bmRCb2R5MSkgewotICAgICAgICAgICAgICAgIC8vZXhwZWN0ZWQgc29hcCBib2R5IGluIHJlcGx5IG1lc3NhZ2UKLSAgICAgICAgICAgICAgICBwYXNzID0gZmFsc2U7Ci0gICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICBpZiAoIWZvdW5kQ2hpbGQxIHx8ICFmb3VuZENoaWxkMikgewotICAgICAgICAgICAgICAgICAgICBwYXNzID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy9EaWQgZmluZCBleHBlY3RlZCBzb2FwIGJvZHkgY2hpbGQKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnQgY291bnQgPSBtc2cuY291bnRBdHRhY2htZW50cygpOwotICAgICAgICAgICAgaWYgKGNvdW50ID09IG51bSkgewotICAgICAgICAgICAgICAgIC8vcmVjZWl2ZWQgZXhwZWN0ZWQgbnVtYmVyIG9mIGF0dGFjaG1lbnRzIGluIHJlcGx5IG1lc3NhZ2UKLSAgICAgICAgICAgICAgICBpID0gbXNnLmdldEF0dGFjaG1lbnRzKCk7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBnaWZGb3VuZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGJvb2xlYW4geG1sRm91bmQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBib29sZWFuIHRleHRGb3VuZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGJvb2xlYW4gaHRtbEZvdW5kID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBqcGVnRm91bmQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgQXR0YWNobWVudFBhcnQgYSA9IChBdHRhY2htZW50UGFydClpLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHR5cGUgPSBhLmdldENvbnRlbnRUeXBlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlLmVxdWFscygiaW1hZ2UvZ2lmIikpCi0gICAgICAgICAgICAgICAgICAgICAgICBnaWZGb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUuZXF1YWxzKCJ0ZXh0L3htbCIpKQotICAgICAgICAgICAgICAgICAgICAgICAgeG1sRm91bmQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlLmVxdWFscygidGV4dC9wbGFpbiIpKQotICAgICAgICAgICAgICAgICAgICAgICAgdGV4dEZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZS5lcXVhbHMoInRleHQvaHRtbCIpKQotICAgICAgICAgICAgICAgICAgICAgICAgaHRtbEZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZS5lcXVhbHMoImltYWdlL2pwZWciKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGpwZWdGb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLy9Hb3QgdW5leHBlY3RlZCBNSU1FIHR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobnVtID4gMCkgewotICAgICAgICAgICAgICAgICAgICAvL0RpZCBub3QgZmluZCBleHBlY3RlZCBNSU1FIHR5cGVzIGluIHJlcGx5IG1lc3NhZ2UKLSAgICAgICAgICAgICAgICAgICAgcGFzcyA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gcGFzczsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy9Hb3QgdW5leHBlY3RlZCBudW1iZXIgb2YgYXR0YWNobWVudHMgaW4gcmVwbHkgbWVzc2FnZQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhYWovdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NhYWovU09BUE5hbWVzcGFjZVRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhYWovdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NhYWovU09BUE5hbWVzcGFjZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBkODViMS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYWFqL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zYWFqL1NPQVBOYW1lc3BhY2VUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2FhajsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLk1lc3NhZ2VGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBNZXNzYWdlOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci0KLS8qKiBSZWY6IEpJUkEtIEF4aXMyLTUxNyAqLwotcHVibGljIGNsYXNzIFNPQVBOYW1lc3BhY2VUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHVibGljIFNPQVBOYW1lc3BhY2VUZXN0KFN0cmluZyBhcmcwKSB7Ci0gICAgICAgIHN1cGVyKGFyZzApOwotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgdGVzdCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFN0cmluZyB4bWwgPQotICAgICAgICAgICAgICAgICAgICAiPD94bWwgdmVyc2lvbj0nMS4wJyA/PjxlbnY6RW52ZWxvcGUgeG1sbnM6ZW52PVwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS9cIj48ZW52OkJvZHkvPjwvZW52OkVudmVsb3BlPiI7Ci0KLSAgICAgICAgICAgIFNPQVBNZXNzYWdlIG1zZyA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKCkKLSAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZU1lc3NhZ2UobnVsbCwgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHhtbC5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICBtc2cuc2V0UHJvcGVydHkoU09BUE1lc3NhZ2UuV1JJVEVfWE1MX0RFQ0xBUkFUSU9OLCAidHJ1ZSIpOwotICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICBtc2cud3JpdGVUbyhiYW9zKTsKLSAgICAgICAgICAgIFN0cmluZyBwcm9kdWNlZE1hZyA9IG5ldyBTdHJpbmcoYmFvcy50b0J5dGVBcnJheSgpKTsKLSAgICAgICAgICAgIFN0cmluZyBbXSBzcGxpdFBhcnRzID0gcHJvZHVjZWRNYWcuc3BsaXQoImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUiKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiRXh0cmEgbmFtZXNwYWNlIGRlY2xhcmF0aW9uIiwgMiwgc3BsaXRQYXJ0cy5sZW5ndGgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhYWovdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NhYWovU09BUFBhcnRUZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9zYWFqL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zYWFqL1NPQVBQYXJ0VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTI4NTUzLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhYWovdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NhYWovU09BUFBhcnRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNhYWo7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLmltcGwuZG9tLnNvYXAxMS5TT0FQMTFGYWN0b3J5OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5NZXNzYWdlRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5OYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBCb2R5OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBFbGVtZW50OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBFbnZlbG9wZTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQSGVhZGVyOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBIZWFkZXJFbGVtZW50OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBNZXNzYWdlOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBQYXJ0OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlRleHQ7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5kb20uRE9NU291cmNlOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBTT0FQUGFydFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkU291cmNlKCkgewotICAgICAgICBET01Tb3VyY2UgZG9tU291cmNlOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgIEZpbGVSZWFkZXIgdGVzdEZpbGUgPSBuZXcgRmlsZVJlYWRlcihuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoImJhc2VkaXIiLCIuIikrIi90ZXN0LXJlc291cmNlcyIgKyBGaWxlLnNlcGFyYXRvciArICJzb2FwLXBhcnQueG1sIikpOwotICAgICAgICAgICAgU3RBWE9NQnVpbGRlciBzdEFYT01CdWlsZGVyID0KLSAgICAgICAgICAgICAgICAgICAgT01YTUxCdWlsZGVyRmFjdG9yeS5jcmVhdGVTdEFYT01CdWlsZGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMUZhY3RvcnkoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxJbnB1dEZhY3RvcnkubmV3SW5zdGFuY2UoKS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0RmlsZSkpOwotICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgRG9jdW1lbnRCdWlsZGVyIGJ1aWxkZXIgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0gICAgICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IGJ1aWxkZXIucGFyc2UobmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJiYXNlZGlyIiwgIi4iKSArCi0gICAgICAgICAgICAgICAgICAgICIvdGVzdC1yZXNvdXJjZXMiICsgRmlsZS5zZXBhcmF0b3IgKyAic29hcC1wYXJ0LnhtbCIpKTsKLSAgICAgICAgICAgIGRvbVNvdXJjZSA9IG5ldyBET01Tb3VyY2UoZG9jdW1lbnQpOwotCi0gICAgICAgICAgICBTT0FQTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoKS5jcmVhdGVNZXNzYWdlKCk7Ci0KLSAgICAgICAgICAgIC8vIEdldCB0aGUgU09BUCBwYXJ0IGFuZCBzZXQgaXRzIGNvbnRlbnQgdG8gZG9tU291cmNlCi0gICAgICAgICAgICBTT0FQUGFydCBzb2FwUGFydCA9IG1lc3NhZ2UuZ2V0U09BUFBhcnQoKTsKLSAgICAgICAgICAgIHNvYXBQYXJ0LnNldENvbnRlbnQoZG9tU291cmNlKTsKLSAgICAgICAgICAgIG1lc3NhZ2Uuc2F2ZUNoYW5nZXMoKTsKLQotICAgICAgICAgICAgU09BUEhlYWRlciBoZWFkZXIgPSBtZXNzYWdlLmdldFNPQVBIZWFkZXIoKTsKLSAgICAgICAgICAgIGlmIChoZWFkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGl0ZXIxID0gaGVhZGVyLmdldENoaWxkRWxlbWVudHMoKTsKLSAgICAgICAgICAgICAgICBnZXRDb250ZW50cyhpdGVyMSwgIiIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTT0FQQm9keSBib2R5ID0gbWVzc2FnZS5nZXRTT0FQQm9keSgpOwotICAgICAgICAgICAgSXRlcmF0b3IgaXRlcjIgPSBib2R5LmdldENoaWxkRWxlbWVudHMoKTsKLSAgICAgICAgICAgIGdldENvbnRlbnRzKGl0ZXIyLCAiIik7Ci0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgRXhjZXB0aW9uIDogIiArIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZ2V0Q29udGVudHMoSXRlcmF0b3IgaXRlcmF0b3IsIFN0cmluZyBpbmRlbnQpIHsKLSAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgTm9kZSBub2RlID0gKE5vZGUpaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgU09BUEVsZW1lbnQgZWxlbWVudCA9IG51bGw7Ci0gICAgICAgICAgICBUZXh0IHRleHQgPSBudWxsOwotCi0gICAgICAgICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIFNPQVBFbGVtZW50KSB7Ci0gICAgICAgICAgICAgICAgZWxlbWVudCA9IChTT0FQRWxlbWVudClub2RlOwotCi0gICAgICAgICAgICAgICAgTmFtZSBuYW1lID0gZWxlbWVudC5nZXRFbGVtZW50TmFtZSgpOwotCi0gICAgICAgICAgICAgICAgSXRlcmF0b3IgYXR0cnMgPSBlbGVtZW50LmdldEFsbEF0dHJpYnV0ZXMoKTsKLQotICAgICAgICAgICAgICAgIHdoaWxlIChhdHRycy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgTmFtZSBhdHRyTmFtZSA9IChOYW1lKWF0dHJzLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChhdHRyTmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgSXRlcmF0b3IgaXRlcjIgPSBlbGVtZW50LmdldENoaWxkRWxlbWVudHMoKTsKLSAgICAgICAgICAgICAgICBnZXRDb250ZW50cyhpdGVyMiwgaW5kZW50ICsgIiAiKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGV4dCA9IChUZXh0KW5vZGU7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGNvbnRlbnQgPSB0ZXh0LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChjb250ZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgdGVzdEFkZFNvdXJjZTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgamF2YXgueG1sLnNvYXAuU09BUE1lc3NhZ2Ugc29hcE1lc3NhZ2UgPQotICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zb2FwLk1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKCkuY3JlYXRlTWVzc2FnZSgpOwotICAgICAgICBqYXZheC54bWwuc29hcC5TT0FQRW52ZWxvcGUgc29hcEVudiA9Ci0gICAgICAgICAgICAgICAgc29hcE1lc3NhZ2UuZ2V0U09BUFBhcnQoKS5nZXRFbnZlbG9wZSgpOwotICAgICAgICBqYXZheC54bWwuc29hcC5TT0FQSGVhZGVyIGhlYWRlciA9IHNvYXBFbnYuZ2V0SGVhZGVyKCk7Ci0gICAgICAgIGphdmF4LnhtbC5zb2FwLlNPQVBCb2R5IGJvZHkgPSBzb2FwRW52LmdldEJvZHkoKTsKLQotICAgICAgICBhc3NlcnRUcnVlKGhlYWRlci5hZGRDaGlsZEVsZW1lbnQoImVieG1sbXMxIiwgImNoMiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL3Rlc3QuYXBhY2hlLm9yZyIpIGluc3RhbmNlb2YgU09BUEhlYWRlckVsZW1lbnQpOwotICAgICAgICBhc3NlcnRUcnVlKGhlYWRlci5hZGRIZWFkZXJFbGVtZW50KAotICAgICAgICAgICAgICAgIHNvYXBFbnYuY3JlYXRlTmFtZSgiZWJ4bWxtczIiLCAiY2gzIiwgImh0dHA6Ly90ZXN0Mi5hcGFjaGUub3JnIikpICE9IG51bGwpOwotICAgICAgICBhc3NlcnRUcnVlKGhlYWRlci5hZGRIZWFkZXJFbGVtZW50KAotICAgICAgICAgICAgICAgIG5ldyBQcmVmaXhlZFFOYW1lKCJodHRwOi8vdGVzdDMuYXBhY2hlLm9yZyIsICJlYnhtbG1zMyIsICJjaDUiKSkgIT0gbnVsbCk7Ci0KLSAgICAgICAgYm9keS5hZGRDaGlsZEVsZW1lbnQoImJvZHlFbGUxIiwgImVsZTEiLCAiaHR0cDovL3dzLmFwYWNoZS5vcmciKTsKLSAgICAgICAgc29hcE1lc3NhZ2Uuc2F2ZUNoYW5nZXMoKTsKLQotICAgICAgICBqYXZheC54bWwuc29hcC5TT0FQTWVzc2FnZSBzb2FwTWVzc2FnZTIgPQotICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zb2FwLk1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKCkuY3JlYXRlTWVzc2FnZSgpOwotICAgICAgICBTT0FQUGFydCBzb2FwUGFydCA9IHNvYXBNZXNzYWdlMi5nZXRTT0FQUGFydCgpOwotICAgICAgICBzb2FwUGFydC5zZXRDb250ZW50KHNvYXBNZXNzYWdlLmdldFNPQVBQYXJ0KCkuZ2V0Q29udGVudCgpKTsKLSAgICAgICAgc29hcE1lc3NhZ2UyLnNhdmVDaGFuZ2VzKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc29hcE1lc3NhZ2UyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkU291cmNlMygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBqYXZheC54bWwuc29hcC5TT0FQTWVzc2FnZSBzb2FwTWVzc2FnZSA9Ci0gICAgICAgICAgICAgICAgamF2YXgueG1sLnNvYXAuTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoKS5jcmVhdGVNZXNzYWdlKCk7Ci0gICAgICAgIGphdmF4LnhtbC5zb2FwLlNPQVBFbnZlbG9wZSBzb2FwRW52ID0KLSAgICAgICAgICAgICAgICBzb2FwTWVzc2FnZS5nZXRTT0FQUGFydCgpLmdldEVudmVsb3BlKCk7Ci0gICAgICAgIGphdmF4LnhtbC5zb2FwLlNPQVBIZWFkZXIgaGVhZGVyID0gc29hcEVudi5nZXRIZWFkZXIoKTsKLSAgICAgICAgamF2YXgueG1sLnNvYXAuU09BUEJvZHkgYm9keSA9IHNvYXBFbnYuZ2V0Qm9keSgpOwotCi0gICAgICAgIGFzc2VydFRydWUoaGVhZGVyLmFkZENoaWxkRWxlbWVudCgiZWJ4bWxtczEiLCAiY2gyIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vdGVzdC5hcGFjaGUub3JnIikgaW5zdGFuY2VvZiBTT0FQSGVhZGVyRWxlbWVudCk7Ci0gICAgICAgIGFzc2VydFRydWUoaGVhZGVyLmFkZEhlYWRlckVsZW1lbnQoCi0gICAgICAgICAgICAgICAgc29hcEVudi5jcmVhdGVOYW1lKCJlYnhtbG1zMiIsICJjaDMiLCAiaHR0cDovL3Rlc3QyLmFwYWNoZS5vcmciKSkgIT0gbnVsbCk7Ci0gICAgICAgIGFzc2VydFRydWUoaGVhZGVyLmFkZEhlYWRlckVsZW1lbnQoCi0gICAgICAgICAgICAgICAgbmV3IFByZWZpeGVkUU5hbWUoImh0dHA6Ly90ZXN0My5hcGFjaGUub3JnIiwgImVieG1sbXMzIiwgImNoNSIpKSAhPSBudWxsKTsKLQotICAgICAgICBib2R5LmFkZENoaWxkRWxlbWVudCgiYm9keUVsZTEiLCAiZWxlMSIsICJodHRwOi8vd3MuYXBhY2hlLm9yZyIpOwotICAgICAgICBzb2FwTWVzc2FnZS5zYXZlQ2hhbmdlcygpOwotCi0gICAgICAgIGphdmF4LnhtbC5zb2FwLlNPQVBNZXNzYWdlIHNvYXBNZXNzYWdlMiA9Ci0gICAgICAgICAgICAgICAgamF2YXgueG1sLnNvYXAuTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoKS5jcmVhdGVNZXNzYWdlKCk7Ci0gICAgICAgIFNPQVBQYXJ0IHNvYXBQYXJ0ID0gc29hcE1lc3NhZ2UyLmdldFNPQVBQYXJ0KCk7Ci0gICAgICAgIHNvYXBQYXJ0LnNldENvbnRlbnQoc29hcE1lc3NhZ2UuZ2V0U09BUFBhcnQoKS5nZXRDb250ZW50KCkpOwotICAgICAgICBzb2FwTWVzc2FnZTIuc2F2ZUNoYW5nZXMoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzb2FwTWVzc2FnZTIpOwotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgX3Rlc3RJbnB1dEVuY29kaW5nKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgRE9NU291cmNlIGRvbVNvdXJjZTsKLSAgICAgICAgICAgIERvY3VtZW50QnVpbGRlciBidWlsZGVyID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld0RvY3VtZW50QnVpbGRlcigpOwotICAgICAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBidWlsZGVyLnBhcnNlKG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiYmFzZWRpciIsICIuIikgKwotICAgICAgICAgICAgICAgICAgICAiL3Rlc3QtcmVzb3VyY2VzIiArIEZpbGUuc2VwYXJhdG9yICsgInNvYXAtcGFydC54bWwiKSk7Ci0gICAgICAgICAgICBkb21Tb3VyY2UgPSBuZXcgRE9NU291cmNlKGRvY3VtZW50KTsKLQotICAgICAgICAgICAgU09BUE1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKCkuY3JlYXRlTWVzc2FnZSgpOwotCi0gICAgICAgICAgICAvLyBHZXQgdGhlIFNPQVAgcGFydCBhbmQgc2V0IGl0cyBjb250ZW50IHRvIGRvbVNvdXJjZQotICAgICAgICAgICAgU09BUFBhcnQgc29hcFBhcnQgPSBtZXNzYWdlLmdldFNPQVBQYXJ0KCk7Ci0gICAgICAgICAgICBzb2FwUGFydC5zZXRDb250ZW50KGRvbVNvdXJjZSk7Ci0gICAgICAgICAgICBtZXNzYWdlLnNhdmVDaGFuZ2VzKCk7Ci0KLSAgICAgICAgICAgIFNPQVBQYXJ0IHNwID0gbWVzc2FnZS5nZXRTT0FQUGFydCgpOwotCi0vLyAgICAgICAgICAgIFN0cmluZyBpbnB1dEVuY29kaW5nID0gc3AuZ2V0SW5wdXRFbmNvZGluZygpOwotLy8gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGlucHV0RW5jb2RpbmcpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBFeGNlcHRpb24gIiArIGUpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENoZWNrIHBhcmVudCBwcm9jZXNzaW5nIG9mIFNPQVBNZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdF9wYXJlbnRBY2Nlc3MxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgTWVzc2FnZUZhY3RvcnkgbWYgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICBTT0FQTWVzc2FnZSBtID0gbWYuY3JlYXRlTWVzc2FnZSgpOwotICAgICAgICBTT0FQUGFydCBzcCA9IG0uZ2V0U09BUFBhcnQoKTsKLSAgICAgICAgTm9kZSBub2RlID0gc3AuZ2V0UGFyZW50Tm9kZSgpOwotICAgICAgICBhc3NlcnRUcnVlKG5vZGUgPT0gbnVsbCk7Ci0gICAgICAgIAotICAgICAgICBTT0FQRWxlbWVudCBlID0gc3AuZ2V0UGFyZW50RWxlbWVudCgpOwotICAgICAgICBhc3NlcnRUcnVlKG5vZGUgPT0gbnVsbCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENoZWNrIHBhcmVudCBwcm9jZXNzaW5nIG9mIFNPQVBNZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdF9wYXJlbnRBY2Nlc3MyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgTWVzc2FnZUZhY3RvcnkgbWYgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICBTT0FQTWVzc2FnZSBtID0gbWYuY3JlYXRlTWVzc2FnZSgpOwotICAgICAgICBTT0FQUGFydCBzcCA9IG0uZ2V0U09BUFBhcnQoKTsKLSAgICAgICAgU09BUEVudmVsb3BlIHNlID0gc3AuZ2V0RW52ZWxvcGUoKTsKLSAgICAgICAgTm9kZSBub2RlID0gc2UuZ2V0UGFyZW50Tm9kZSgpOwotICAgICAgICBhc3NlcnRUcnVlKG5vZGUgPT0gc3ApOwotICAgICAgICBub2RlID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0gICAgICAgIGFzc2VydFRydWUobm9kZSA9PSBudWxsKTsKLQotICAgICAgICBTT0FQRWxlbWVudCBlID0gc2UuZ2V0UGFyZW50RWxlbWVudCgpOwotICAgICAgICBhc3NlcnRUcnVlKG5vZGUgPT0gbnVsbCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENoZWNrIHBhcmVudCBwcm9jZXNzaW5nIG9mIFNPQVBNZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdF9wYXJlbnRBY2Nlc3MzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgU09BUDExRmFjdG9yeSBheGlvbVNGID0gbmV3IFNPQVAxMUZhY3RvcnkoKTsKLSAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZSBheGlvbVNFID0gYXhpb21TRi5jcmVhdGVTT0FQRW52ZWxvcGUoKTsKLSAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBNZXNzYWdlIGF4aW9tU00gPSBheGlvbVNGLmNyZWF0ZVNPQVBNZXNzYWdlKGF4aW9tU0UsIG51bGwpOwotICAgICAgICAKLSAgICAgICAgU09BUEVudmVsb3BlSW1wbCBzZSA9IAotICAgICAgICAgICAgbmV3IFNPQVBFbnZlbG9wZUltcGwoKG9yZy5hcGFjaGUuYXhpb20uc29hcC5pbXBsLmRvbS5TT0FQRW52ZWxvcGVJbXBsKWF4aW9tU0UpOwotICAgICAgICBTT0FQTWVzc2FnZUltcGwgc20gPSBuZXcgU09BUE1lc3NhZ2VJbXBsKHNlKTsKLSAgICAgICAgU09BUFBhcnRJbXBsIHNwID0gbmV3IFNPQVBQYXJ0SW1wbChzbSwgc2UpOwotICAgICAgICAKLSAgICAgICAgTm9kZSBub2RlID0gc2UuZ2V0UGFyZW50Tm9kZSgpOwotICAgICAgICBhc3NlcnRUcnVlKG5vZGUgPT0gc3ApOwotICAgICAgICBub2RlID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0gICAgICAgIGFzc2VydFRydWUobm9kZSA9PSBudWxsKTsKLQotICAgICAgICBTT0FQRWxlbWVudCBlID0gc2UuZ2V0UGFyZW50RWxlbWVudCgpOwotICAgICAgICBhc3NlcnRUcnVlKG5vZGUgPT0gbnVsbCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3ROb2RlVHlwZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgTWVzc2FnZUZhY3RvcnkgZmFjdCA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIFNPQVBNZXNzYWdlIG1lc3NhZ2UgPSBmYWN0LmNyZWF0ZU1lc3NhZ2UoKTsKLSAgICAgICAgU09BUFBhcnQgc29hcFBhcnQgPSBtZXNzYWdlLmdldFNPQVBQYXJ0KCk7ICAgICAKLQotICAgICAgICBhc3NlcnRUcnVlKCJmaXJzdCBjaGlsZCIsIHNvYXBQYXJ0LmdldEZpcnN0Q2hpbGQoKSBpbnN0YW5jZW9mIFNPQVBFbnZlbG9wZSk7Ci0gICAgICAgIGFzc2VydFRydWUoImxhc3QgY2hpbGQiLCBzb2FwUGFydC5nZXRMYXN0Q2hpbGQoKSBpbnN0YW5jZW9mIFNPQVBFbnZlbG9wZSk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgIE5vZGVMaXN0IG5vZGVzID0gc29hcFBhcnQuZ2V0Q2hpbGROb2RlcygpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG5vZGVzLmdldExlbmd0aCgpKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBub2Rlcy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKG5vZGVzLml0ZW0oaSkgaW5zdGFuY2VvZiBTT0FQRW52ZWxvcGUpOwotICAgICAgICB9ICAgICAgICAgICAgIAotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQ2hpbGQxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE1lc3NhZ2VGYWN0b3J5IGZhY3QgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICBTT0FQTWVzc2FnZSBtZXNzYWdlID0gZmFjdC5jcmVhdGVNZXNzYWdlKCk7Ci0gICAgICAgIFNPQVBQYXJ0IHNvYXBQYXJ0ID0gbWVzc2FnZS5nZXRTT0FQUGFydCgpOyAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBhc3NlcnRUcnVlKCJzb2FwIGVudiBiZWZvcmUiLCBzb2FwUGFydC5nZXRGaXJzdENoaWxkKCkgaW5zdGFuY2VvZiBTT0FQRW52ZWxvcGUpOwotICAgICAgICAKLSAgICAgICAgc29hcFBhcnQucmVtb3ZlQ2hpbGQoc29hcFBhcnQuZ2V0Rmlyc3RDaGlsZCgpKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydFRydWUoInNvYXAgZW52IGFmdGVyIiwgc29hcFBhcnQuZ2V0Rmlyc3RDaGlsZCgpID09IG51bGwpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQ2hpbGQyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE1lc3NhZ2VGYWN0b3J5IGZhY3QgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICBTT0FQTWVzc2FnZSBtZXNzYWdlID0gZmFjdC5jcmVhdGVNZXNzYWdlKCk7Ci0gICAgICAgIFNPQVBQYXJ0IHNvYXBQYXJ0ID0gbWVzc2FnZS5nZXRTT0FQUGFydCgpOyAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBhc3NlcnRUcnVlKCJzb2FwIGVudiBiZWZvcmUiLCBzb2FwUGFydC5nZXRGaXJzdENoaWxkKCkgaW5zdGFuY2VvZiBTT0FQRW52ZWxvcGUpOwotICAgICAgICAKLSAgICAgICAgc29hcFBhcnQucmVtb3ZlQ2hpbGQoc29hcFBhcnQuZ2V0RW52ZWxvcGUoKSk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRUcnVlKCJzb2FwIGVudiBhZnRlciIsIHNvYXBQYXJ0LmdldEZpcnN0Q2hpbGQoKSA9PSBudWxsKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYWFqL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zYWFqL1RleHRUZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9zYWFqL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zYWFqL1RleHRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4YzczMmMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2Fhai90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2Fhai9UZXh0VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zYWFqOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy53M2MuZG9tLkNvbW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLk1lc3NhZ2VGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLk1pbWVIZWFkZXJzOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLk5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEJvZHk7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEJvZHlFbGVtZW50OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBFbGVtZW50OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUE1lc3NhZ2U7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuVGV4dDsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBUZXh0VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHB1YmxpYyBUZXh0VGVzdChTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0KLSAgICAvL1Rlc3QgU0FBSiBhZGRUZXh0Tm9kZSBwZXJmb3JtYW5jZQotICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRUZXh0Tm9kZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTT0FQRmFjdG9yeSBzb2FwRmFjdG9yeSA9IFNPQVBGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIE1lc3NhZ2VGYWN0b3J5IGZhY3RvcnkgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICBTT0FQTWVzc2FnZSBtZXNzYWdlID0gZmFjdG9yeS5jcmVhdGVNZXNzYWdlKCk7Ci0gICAgICAgIFNPQVBCb2R5IGJvZHkgPSBtZXNzYWdlLmdldFNPQVBCb2R5KCk7Ci0KLSAgICAgICAgLy8gQ3JlYXRlIHRoZSBiYXNlIGVsZW1lbnQKLSAgICAgICAgTmFtZSBib2R5TmFtZSA9IHNvYXBGYWN0b3J5LmNyZWF0ZU5hbWUoIlZCR2VuUmVjZWl2ZXIiLCAieHNpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIik7Ci0gICAgICAgIFNPQVBCb2R5RWxlbWVudCBib2R5RWxlbWVudCA9IGJvZHkuYWRkQm9keUVsZW1lbnQoYm9keU5hbWUpOwotCi0gICAgICAgIC8vIENyZWF0ZSB0aGUgTWV0YURhdGEgVGFnCi0gICAgICAgIE5hbWUgbmFtZSA9IHNvYXBGYWN0b3J5LmNyZWF0ZU5hbWUoIk1ldGFEYXRhIik7Ci0gICAgICAgIFNPQVBFbGVtZW50IG1ldGFEYXRhID0gYm9keUVsZW1lbnQuYWRkQ2hpbGRFbGVtZW50KG5hbWUpOwotCi0gICAgICAgIC8vQ3JlYXRlIHRoZSBTS2V5IFRhZwotICAgICAgICBuYW1lID0gc29hcEZhY3RvcnkuY3JlYXRlTmFtZSgiU0tleSIpOwotICAgICAgICBTT0FQRWxlbWVudCBzS2V5ID0gbWV0YURhdGEuYWRkQ2hpbGRFbGVtZW50KG5hbWUpOwotICAgICAgICBzS2V5LmFkZFRleHROb2RlKCJTS0VZMDAxIik7Ci0KLSAgICAgICAgLy9DcmVhdGUgT2JqZWN0IFRhZwotICAgICAgICBuYW1lID0gc29hcEZhY3RvcnkuY3JlYXRlTmFtZSgiT2JqZWN0Iik7Ci0gICAgICAgIFNPQVBFbGVtZW50IG9iamVjdCA9IGJvZHlFbGVtZW50LmFkZENoaWxkRWxlbWVudChuYW1lKTsKLQotICAgICAgICAvL0NyZWF0ZSBCb29rIElEIFRhZwotICAgICAgICBuYW1lID0gc29hcEZhY3RvcnkuY3JlYXRlTmFtZSgiQm9va0lEIik7Ci0gICAgICAgIFNPQVBFbGVtZW50IGJvb2tJRCA9IG9iamVjdC5hZGRDaGlsZEVsZW1lbnQobmFtZSk7Ci0gICAgICAgIGJvb2tJRC5hZGRUZXh0Tm9kZSgiQm9va0lEMDAyIik7Ci0KLSAgICAgICAgLy9DcmVhdGUgT3JkZXJJRCB0YWcKLSAgICAgICAgbmFtZSA9IHNvYXBGYWN0b3J5LmNyZWF0ZU5hbWUoIk9yZGVySUQiKTsKLSAgICAgICAgU09BUEVsZW1lbnQgb3JkZXJJRCA9IG9iamVjdC5hZGRDaGlsZEVsZW1lbnQobmFtZSk7Ci0gICAgICAgIG9yZGVySUQuYWRkVGV4dE5vZGUoIk9yZGVySUQwMDMiKTsKLQotICAgICAgICAvL2NyZWF0ZSBQdXJjaGFzZUlEIHRhZ2UKLSAgICAgICAgbmFtZSA9IHNvYXBGYWN0b3J5LmNyZWF0ZU5hbWUoIlB1cmNoYXNlSUQiKTsKLSAgICAgICAgU09BUEVsZW1lbnQgcHVyY2hhc2VJRCA9IG9iamVjdC5hZGRDaGlsZEVsZW1lbnQobmFtZSk7Ci0gICAgICAgIHB1cmNoYXNlSUQuYWRkVGV4dE5vZGUoIlB1cmNoYXNlSUQwMDUiKTsKLQotICAgICAgICAvL2NyZWF0ZSBMYW5ndWFnZUlEIFRhZwotICAgICAgICBuYW1lID0gc29hcEZhY3RvcnkuY3JlYXRlTmFtZSgiTGFuZ3VhZ2VJRCIpOwotICAgICAgICBTT0FQRWxlbWVudCBsYW5ndWFnZUlEID0gb2JqZWN0LmFkZENoaWxkRWxlbWVudChuYW1lKTsKLSAgICAgICAgbGFuZ3VhZ2VJRC5hZGRUZXh0Tm9kZSgiTGFuZ3VhZ2VJRDAwNCIpOwotCi0gICAgICAgIC8vY3JlYXRlIExhbmd1YWdlSUQgVGFnCi0gICAgICAgIG5hbWUgPSBzb2FwRmFjdG9yeS5jcmVhdGVOYW1lKCJMYW5ndWFnZU5hbWUiKTsKLSAgICAgICAgU09BUEVsZW1lbnQgbGFuZ3VhZ2VOYW1lID0gb2JqZWN0LmFkZENoaWxkRWxlbWVudChuYW1lKTsKLSAgICAgICAgbGFuZ3VhZ2VOYW1lLmFkZFRleHROb2RlKCJMYW5ndWFnZU5hbWUwMDYiKTsKLQotICAgICAgICAvL2NyZWF0ZSBMYW5ndWFnZUlEIFRhZwotICAgICAgICBuYW1lID0gc29hcEZhY3RvcnkuY3JlYXRlTmFtZSgiVGl0bGUiKTsKLSAgICAgICAgU09BUEVsZW1lbnQgdGl0bGUgPSBvYmplY3QuYWRkQ2hpbGRFbGVtZW50KG5hbWUpOwotICAgICAgICB0aXRsZS5hZGRUZXh0Tm9kZSgiVGl0bGUwMDciKTsKLQotICAgICAgICAvL2NyZWF0ZSBMYW5ndWFnZUlEIFRhZwotICAgICAgICBuYW1lID0gc29hcEZhY3RvcnkuY3JlYXRlTmFtZSgiQXV0aG9yIik7Ci0gICAgICAgIFNPQVBFbGVtZW50IGF1dGhvciA9IG9iamVjdC5hZGRDaGlsZEVsZW1lbnQobmFtZSk7Ci0gICAgICAgIGF1dGhvci5hZGRUZXh0Tm9kZSgiQXV0aG9yMDA4Iik7Ci0KLSAgICAgICAgLy9jcmVhdGUgTGFuZ3VhZ2VJRCBUYWcKLSAgICAgICAgbmFtZSA9IHNvYXBGYWN0b3J5LmNyZWF0ZU5hbWUoIkZvcm1hdCIpOwotICAgICAgICBTT0FQRWxlbWVudCBmb3JtYXQgPSBib2R5RWxlbWVudC5hZGRDaGlsZEVsZW1lbnQobmFtZSk7Ci0KLSAgICAgICAgLy9jcmVhdGUgTGFuZ3VhZ2VJRCBUYWcKLSAgICAgICAgbmFtZSA9IHNvYXBGYWN0b3J5LmNyZWF0ZU5hbWUoIlR5cGUiKTsKLSAgICAgICAgU09BUEVsZW1lbnQgZm9ybWF0VHlwZSA9IGZvcm1hdC5hZGRDaGlsZEVsZW1lbnQobmFtZSk7Ci0gICAgICAgIGZvcm1hdFR5cGUuYWRkVGV4dE5vZGUoIlR5cGUwMDkiKTsKLQotICAgICAgICAvL2NyZWF0ZSBMYW5ndWFnZUlEIFRhZwotICAgICAgICBuYW1lID0gc29hcEZhY3RvcnkuY3JlYXRlTmFtZSgiRGVsaXZlcnkiKTsKLSAgICAgICAgU09BUEVsZW1lbnQgZGVsaXZlcnkgPSBib2R5RWxlbWVudC5hZGRDaGlsZEVsZW1lbnQobmFtZSk7Ci0KLSAgICAgICAgLy9jcmVhdGUgTGFuZ3VhZ2VJRCBUYWcKLSAgICAgICAgbmFtZSA9IHNvYXBGYWN0b3J5LmNyZWF0ZU5hbWUoIk5hbWUiKTsKLSAgICAgICAgU09BUEVsZW1lbnQgZGVsTmFtZSA9IGRlbGl2ZXJ5LmFkZENoaWxkRWxlbWVudChuYW1lKTsKLSAgICAgICAgZGVsTmFtZS5hZGRUZXh0Tm9kZSgiTmFtZTAxMCIpOwotCi0gICAgICAgIC8vY3JlYXRlIExhbmd1YWdlSUQgVGFnCi0gICAgICAgIG5hbWUgPSBzb2FwRmFjdG9yeS5jcmVhdGVOYW1lKCJBZGRyZXNzMSIpOwotICAgICAgICBTT0FQRWxlbWVudCBhZGRyZXNzMSA9IGRlbGl2ZXJ5LmFkZENoaWxkRWxlbWVudChuYW1lKTsKLSAgICAgICAgYWRkcmVzczEuYWRkVGV4dE5vZGUoIkFkZHJlc3MxMDExIik7Ci0KLSAgICAgICAgLy9jcmVhdGUgTGFuZ3VhZ2VJRCBUYWcKLSAgICAgICAgbmFtZSA9IHNvYXBGYWN0b3J5LmNyZWF0ZU5hbWUoIkFkZHJlc3MyIik7Ci0gICAgICAgIFNPQVBFbGVtZW50IGFkZHJlc3MyID0gZGVsaXZlcnkuYWRkQ2hpbGRFbGVtZW50KG5hbWUpOwotICAgICAgICBhZGRyZXNzMi5hZGRUZXh0Tm9kZSgiQWRkcmVzczIwMTIiKTsKLQotICAgICAgICAvL2NyZWF0ZSBMYW5ndWFnZUlEIFRhZwotICAgICAgICBuYW1lID0gc29hcEZhY3RvcnkuY3JlYXRlTmFtZSgiQ2l0eSIpOwotICAgICAgICBTT0FQRWxlbWVudCBjaXR5ID0gZGVsaXZlcnkuYWRkQ2hpbGRFbGVtZW50KG5hbWUpOwotICAgICAgICBjaXR5LmFkZFRleHROb2RlKCJDaXR5MDEzIik7Ci0KLSAgICAgICAgLy9jcmVhdGUgTGFuZ3VhZ2VJRCBUYWcKLSAgICAgICAgbmFtZSA9IHNvYXBGYWN0b3J5LmNyZWF0ZU5hbWUoIlN0YXRlIik7Ci0gICAgICAgIFNPQVBFbGVtZW50IHN0YXRlID0gZGVsaXZlcnkuYWRkQ2hpbGRFbGVtZW50KG5hbWUpOwotICAgICAgICBzdGF0ZS5hZGRUZXh0Tm9kZSgiU3RhdGUwMTQiKTsKLQotICAgICAgICAvL2NyZWF0ZSBMYW5ndWFnZUlEIFRhZwotICAgICAgICBuYW1lID0gc29hcEZhY3RvcnkuY3JlYXRlTmFtZSgiUG9zdGFsQ29kZSIpOwotICAgICAgICBTT0FQRWxlbWVudCBwb3N0YWxDb2RlID0gZGVsaXZlcnkuYWRkQ2hpbGRFbGVtZW50KG5hbWUpOwotICAgICAgICBwb3N0YWxDb2RlLmFkZFRleHROb2RlKCJQb3N0YWxDb2RlMDE1Iik7Ci0KLSAgICAgICAgLy9tZXNzYWdlLndyaXRlVG8oU3lzdGVtLm91dCk7Ci0gICAgICAgIC8vU3lzdGVtLm91dC5mbHVzaCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDb21tZW50KCkgdGhyb3dzIFNPQVBFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQotICAgICAgICBTdHJpbmcgeG1sU3RyaW5nID0gIjw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J3V0Zi04Jz8+ICIgKwotICAgICAgICAgICAgICAgICI8c29hcGVudjpFbnZlbG9wZSB4bWxuczpzb2FwZW52PVwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS9cIj4iICsKLSAgICAgICAgICAgICAgICAiPHNvYXBlbnY6SGVhZGVyPjwvc29hcGVudjpIZWFkZXI+IiArCi0gICAgICAgICAgICAgICAgIjxzb2FwZW52OkJvZHk+IiArCi0gICAgICAgICAgICAgICAgIjxOb2RlOmFiYyB4bWxuczpOb2RlPVwiaHR0cDovL3d3dy5zaW1wbGV0ZXN0Lm9yZ1wiPiIgKwotICAgICAgICAgICAgICAgICJUaGlzIGlzIHNvbWUgdGV4dCIgKwotICAgICAgICAgICAgICAgICI8IS0tVGhpcyBpcyBjb21tZW50LS0+VGhpcyBpcyBvdGhlciB0ZXh0IiArCi0gICAgICAgICAgICAgICAgIjwhLS1UaGlzIGlzIGFub3RoZXIgY29tbWVudC0tPlRoaXMgaXMgc29tZSBvdGhlciB0ZXh0IiArCi0gICAgICAgICAgICAgICAgIjwvTm9kZTphYmM+IiArCi0gICAgICAgICAgICAgICAgIjwvc29hcGVudjpCb2R5PiIgKwotICAgICAgICAgICAgICAgICI8L3NvYXBlbnY6RW52ZWxvcGU+IjsKLQotICAgICAgICBNZXNzYWdlRmFjdG9yeSBtZiA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIFNPQVBNZXNzYWdlIG1lc3NhZ2UgPQotICAgICAgICAgICAgICAgIG1mLmNyZWF0ZU1lc3NhZ2UobmV3IE1pbWVIZWFkZXJzKCksIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSh4bWxTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotCi0gICAgICAgIFNPQVBCb2R5IGJvZHkgPSBtZXNzYWdlLmdldFNPQVBCb2R5KCk7Ci0gICAgICAgIE5vZGUgYm9keUVsZW1lbnQgPSBib2R5LmdldEZpcnN0Q2hpbGQoKTsKLSAgICAgICAgTm9kZUxpc3QgdGV4dE5vZGVzID0gYm9keUVsZW1lbnQuZ2V0Q2hpbGROb2RlcygpOwotCi0gICAgICAgIGFzc2VydEVxdWFscyg1LCB0ZXh0Tm9kZXMuZ2V0TGVuZ3RoKCkpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGV4dE5vZGVzLmdldExlbmd0aCgpOyBpKyspIHsKLSAgICAgICAgICAgIE5vZGUgbm9kZSA9IHRleHROb2Rlcy5pdGVtKGkpOwotICAgICAgICAgICAgYm9vbGVhbiBpc0NvbW1lbnQ7Ci0gICAgICAgICAgICBpc0NvbW1lbnQgPSAoKFRleHQpbm9kZSkuaXNDb21tZW50KCk7Ci0gICAgICAgICAgICBpZiAoaSA9PSAxIHx8IGkgPT0gMykgewotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCBpc0NvbW1lbnQpOwotICAgICAgICAgICAgICAgIGFzc2VydFRydWUobm9kZSBpbnN0YW5jZW9mIENvbW1lbnQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIGlzQ29tbWVudCk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RmFsc2Uobm9kZSBpbnN0YW5jZW9mIENvbW1lbnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2Fhai90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2Fhai9pbnRlZ3JhdGlvbi9FY2hvU2VydmljZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvc2Fhai90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2Fhai9pbnRlZ3JhdGlvbi9FY2hvU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzZmY2FiLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhYWovdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NhYWovaW50ZWdyYXRpb24vRWNob1NlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zYWFqLmludGVncmF0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci0KLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEVjaG9TZXJ2aWNlIHsKLSAgICBwdWJsaWMgT01FbGVtZW50IGVjaG8oT01FbGVtZW50IGVsZW1lbnQpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAvL1ByYXBhcmluZyB0aGUgT01FbGVtZW50IHNvIHRoYXQgaXQgY2FuIGJlIGF0dGFjaGVkIHRvIGFub3RoZXIgT00gVHJlZS4KLSAgICAgICAgLy9GaXJzdCB0aGUgT01FbGVtZW50IHNob3VsZCBiZSBjb21wbGV0ZWx5IGJ1aWx0IGluIGNhc2UgaXQgaXMgbm90IGZ1bGx5IGJ1aWx0IGFuZCBzdGlsbAotICAgICAgICAvL3NvbWUgb2YgdGhlIHhtbCBpcyBpbiB0aGUgc3RyZWFtLgotICAgICAgICBlbGVtZW50LmJ1aWxkKCk7Ci0gICAgICAgIC8vU2Vjb25kbHkgdGhlIE9NRWxlbWVudCBzaG91bGQgYmUgZGV0YWNoZWQgZnJvbSB0aGUgY3VycmVudCBPTVRyZWUgc28gdGhhdCBpdCBjYW4gYmUgYXR0YWNoZWQKLSAgICAgICAgLy9zb21lIG90aGVyIE9NIFRyZWUuIE9uY2UgZGV0YWNoZWQgdGhlIE9tVHJlZSB3aWxsIHJlbW92ZSBpdHMgY29ubmVjdGlvbnMgdG8gdGhpcyBPTUVsZW1lbnQuCi0gICAgICAgIC8vZWxlbWVudC5kZXRhY2goKTsKLSAgICAgICAgcmV0dXJuIGVsZW1lbnQ7Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhYWovdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NhYWovaW50ZWdyYXRpb24vSW50ZWdyYXRpb25UZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9zYWFqL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zYWFqL2ludGVncmF0aW9uL0ludGVncmF0aW9uVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmQ2MDA4Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhYWovdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NhYWovaW50ZWdyYXRpb24vSW50ZWdyYXRpb25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNhYWouaW50ZWdyYXRpb247Ci0KLWltcG9ydCBqdW5pdC5leHRlbnNpb25zLlRlc3RTZXR1cDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5VdGlsczsKLQotaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXI7Ci1pbXBvcnQgamF2YXguYWN0aXZhdGlvbi5GaWxlRGF0YVNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLkF0dGFjaG1lbnRQYXJ0OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLk1lc3NhZ2VGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLk1pbWVIZWFkZXJzOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLk5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEJvZHk7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEJvZHlFbGVtZW50OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBDb25uZWN0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBDb25uZWN0aW9uRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRW52ZWxvcGU7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQSGVhZGVyOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBIZWFkZXJFbGVtZW50OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBNZXNzYWdlOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBQYXJ0OwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIEludGVncmF0aW9uVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHN0YXRpYyBpbnQgcG9ydDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFNFUlZJQ0VfTkFNRSA9IG5ldyBRTmFtZSgiRWNobyIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgT1BFUkFUSU9OX05BTUUgPSBuZXcgUU5hbWUoImVjaG8iKTsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNBQUpfUkVQTyA9Ci0gICAgICAgICAgICBTeXN0ZW0uZ2V0UHJvcGVydHkoImJhc2VkaXIiLCAiLiIpICsgIi8iICsgInRhcmdldC90ZXN0LXJlc291cmNlcy9zYWFqLXJlcG8iOwotCi0gICAgcHVibGljIEludGVncmF0aW9uVGVzdChTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBnZXRBZGRyZXNzKCkgewotICAgICAgICByZXR1cm4gImh0dHA6Ly8xMjcuMC4wLjE6IiArCi0gICAgICAgICAgICAgICAgcG9ydCArCi0gICAgICAgICAgICAgICAgIi9heGlzMi9zZXJ2aWNlcy9FY2hvIjsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotICAgICAgICByZXR1cm4gbmV3IFRlc3RTZXR1cChuZXcgVGVzdFN1aXRlKEludGVncmF0aW9uVGVzdC5jbGFzcykpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgcG9ydCA9IFV0aWxTZXJ2ZXIuc3RhcnQoU0FBSl9SRVBPKTsKLSAgICAgICAgICAgICAgICBQYXJhbWV0ZXIgZW5lYmxlbXRvbSA9IG5ldyBQYXJhbWV0ZXIoImVuYWJsZU1UT00iLCAidHJ1ZSIpOwotICAgICAgICAgICAgICAgIFV0aWxTZXJ2ZXIuZ2V0Q29uZmlndXJhdGlvbkNvbnRleHQoKS5nZXRBeGlzQ29uZmlndXJhdGlvbigpCi0gICAgICAgICAgICAgICAgICAgICAgICAuYWRkUGFyYW1ldGVyKGVuZWJsZW10b20pOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAgICAgICAgIFV0aWxTZXJ2ZXIuc3RvcCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIEF4aXNTZXJ2aWNlIHNlcnZpY2UgPSBVdGlscy5jcmVhdGVTaW1wbGVTZXJ2aWNlKFNFUlZJQ0VfTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWNob1NlcnZpY2UuY2xhc3MuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEVSQVRJT05fTkFNRSk7Ci0gICAgICAgIFV0aWxTZXJ2ZXIuZGVwbG95U2VydmljZShzZXJ2aWNlKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBVdGlsU2VydmVyLnVuRGVwbG95U2VydmljZShTRVJWSUNFX05BTUUpOwotICAgICAgICBVdGlsU2VydmVyLnVuRGVwbG95Q2xpZW50U2VydmljZSgpOwotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNlbmRSZWNlaXZlTWVzc2FnZVdpdGhFbXB0eU5TUHJlZml4KCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkgbWYgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgU09BUE1lc3NhZ2UgcmVxdWVzdCA9IG1mLmNyZWF0ZU1lc3NhZ2UoKTsKLQotICAgICAgICAgICAgU09BUFBhcnQgc1BhcnQgPSByZXF1ZXN0LmdldFNPQVBQYXJ0KCk7Ci0gICAgICAgICAgICBTT0FQRW52ZWxvcGUgZW52ID0gc1BhcnQuZ2V0RW52ZWxvcGUoKTsKLSAgICAgICAgICAgIFNPQVBCb2R5IGJvZHkgPSBlbnYuZ2V0Qm9keSgpOwotCi0gICAgICAgICAgICAvL05hbWVzcGFjZSBwcmVmaXggaXMgZW1wdHkKLSAgICAgICAgICAgIGJvZHkuYWRkQm9keUVsZW1lbnQobmV3IFFOYW1lKCJodHRwOi8vZmFrZU5hbWVzcGFjZTIub3JnIiwiZWNobyIpKQotICAgICAgICAgICAgCQkJCQkJCS5hZGRUZXh0Tm9kZSgiVGhpcyBpcyBzb21lIHRleHQiKTsKLQotICAgICAgICAgICAgU09BUENvbm5lY3Rpb24gc0NvbiA9IFNPQVBDb25uZWN0aW9uRmFjdG9yeS5uZXdJbnN0YW5jZSgpLmNyZWF0ZUNvbm5lY3Rpb24oKTsKLSAgICAgICAgICAgIFNPQVBNZXNzYWdlIHJlc3BvbnNlID0gc0Nvbi5jYWxsKHJlcXVlc3QsIGdldEFkZHJlc3MoKSk7Ci0gICAgICAgICAgICBhc3NlcnRGYWxzZShyZXNwb25zZS5nZXRBdHRhY2htZW50cygpLmhhc05leHQoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgcmVzcG9uc2UuY291bnRBdHRhY2htZW50cygpKTsKLQotICAgICAgICAgICAgU3RyaW5nIHJlcXVlc3RTdHIgPSBwcmludFNPQVBNZXNzYWdlKHJlcXVlc3QpOwotICAgICAgICAgICAgU3RyaW5nIHJlc3BvbnNlU3RyID0gcHJpbnRTT0FQTWVzc2FnZShyZXNwb25zZSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlU3RyLmluZGV4T2YoImVjaG8iKSA+IC0xKTsKLSAgICAgICAgICAgIHNDb24uY2xvc2UoKTsKLSAgICAgICAgfSBjYXRjaCAoU09BUEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBFeGNlcHRpb24gd2hpbGUgcnVubmluZyB0ZXN0OiAiICsgZSk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgRXhjZXB0aW9uIHdoaWxlIHJ1bm5pbmcgdGVzdDogIiArIGUpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RTZW5kUmVjZWl2ZVNpbXBsZVNPQVBNZXNzYWdlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkgbWYgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgU09BUE1lc3NhZ2UgcmVxdWVzdCA9IG1mLmNyZWF0ZU1lc3NhZ2UoKTsKLQotICAgICAgICAgICAgY3JlYXRlU2ltcGxlU09BUFBhcnQocmVxdWVzdCk7Ci0KLSAgICAgICAgICAgIFNPQVBDb25uZWN0aW9uIHNDb24gPSBTT0FQQ29ubmVjdGlvbkZhY3RvcnkubmV3SW5zdGFuY2UoKS5jcmVhdGVDb25uZWN0aW9uKCk7Ci0gICAgICAgICAgICBTT0FQTWVzc2FnZSByZXNwb25zZSA9IHNDb24uY2FsbChyZXF1ZXN0LCBnZXRBZGRyZXNzKCkpOwotICAgICAgICAgICAgYXNzZXJ0RmFsc2UocmVzcG9uc2UuZ2V0QXR0YWNobWVudHMoKS5oYXNOZXh0KCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHJlc3BvbnNlLmNvdW50QXR0YWNobWVudHMoKSk7Ci0KLSAgICAgICAgICAgIFN0cmluZyByZXF1ZXN0U3RyID0gcHJpbnRTT0FQTWVzc2FnZShyZXF1ZXN0KTsKLSAgICAgICAgICAgIFN0cmluZyByZXNwb25zZVN0ciA9IHByaW50U09BUE1lc3NhZ2UocmVzcG9uc2UpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZVN0ci5pbmRleE9mKCJlY2hvIikgIT0gLTEpOwotICAgICAgICAgICAgc0Nvbi5jbG9zZSgpOwotICAgICAgICB9IGNhdGNoIChTT0FQRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIEV4Y2VwdGlvbiB3aGlsZSBydW5uaW5nIHRlc3Q6ICIgKyBlKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBFeGNlcHRpb24gd2hpbGUgcnVubmluZyB0ZXN0OiAiICsgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBwcmludFNPQVBNZXNzYWdlKGZpbmFsIFNPQVBNZXNzYWdlIG1zZykgdGhyb3dzIFNPQVBFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgIG1zZy53cml0ZVRvKGJhb3MpOwotICAgICAgICBTdHJpbmcgcmVzcG9uc2VTdHIgPSBiYW9zLnRvU3RyaW5nKCk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZVN0ci5pbmRleE9mKCJUaGlzIGlzIHNvbWUgdGV4dCIpICE9IC0xKTsKLSAgICAgICAgcmV0dXJuIHJlc3BvbnNlU3RyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTZW5kUmVjZWl2ZU1lc3NhZ2VXaXRoQXR0YWNobWVudCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBNZXNzYWdlRmFjdG9yeSBtZiA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIFNPQVBNZXNzYWdlIHJlcXVlc3QgPSBtZi5jcmVhdGVNZXNzYWdlKCk7Ci0KLSAgICAgICAgLy9jcmVhdGUgdGhlIFNPQVBQYXJ0Ci0gICAgICAgIGNyZWF0ZVNPQVBQYXJ0KHJlcXVlc3QpOwotCi0gICAgICAgIC8vQXR0YWNoIGEgdGV4dC9wbGFpbiBvYmplY3Qgd2l0aCB0aGUgU09BUCByZXF1ZXN0Ci0gICAgICAgIFN0cmluZyBzYW1wbGVNZXNzYWdlID0gIlNhbXBsZSBNZXNzYWdlOiBIZWxsbyBXb3JsZCEiOwotICAgICAgICBBdHRhY2htZW50UGFydCB0ZXh0QXR0YWNoID0gcmVxdWVzdC5jcmVhdGVBdHRhY2htZW50UGFydChzYW1wbGVNZXNzYWdlLCAidGV4dC9wbGFpbiIpOwotICAgICAgICB0ZXh0QXR0YWNoLmFkZE1pbWVIZWFkZXIoIkNvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmciLCAiYmluYXJ5Iik7Ci0gICAgICAgIHRleHRBdHRhY2guc2V0Q29udGVudElkKCJzdWJtaXRTYW1wbGVUZXh0QGFwYWNoZS5vcmciKTsKLSAgICAgICAgcmVxdWVzdC5hZGRBdHRhY2htZW50UGFydCh0ZXh0QXR0YWNoKTsKLQotICAgICAgICAvL0F0dGFjaCBhIGphdmEuYXd0LkltYWdlIG9iamVjdCB0byB0aGUgU09BUCByZXF1ZXN0Ci0gICAgICAgIFN0cmluZyBqcGdmaWxlbmFtZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiYmFzZWRpciIsICIuIikgKyAiLyIgKyAidGVzdC1yZXNvdXJjZXMvYXhpczIuanBnIjsKLSAgICAgICAgRmlsZSBteWZpbGUgPSBuZXcgRmlsZShqcGdmaWxlbmFtZSk7Ci0gICAgICAgIEZpbGVEYXRhU291cmNlIGZkcyA9IG5ldyBGaWxlRGF0YVNvdXJjZShteWZpbGUpOwotICAgICAgICBEYXRhSGFuZGxlciBpbWFnZURIID0gbmV3IERhdGFIYW5kbGVyKGZkcyk7Ci0gICAgICAgIEF0dGFjaG1lbnRQYXJ0IGpwZWdBdHRhY2ggPSByZXF1ZXN0LmNyZWF0ZUF0dGFjaG1lbnRQYXJ0KGltYWdlREgpOwotICAgICAgICBqcGVnQXR0YWNoLmFkZE1pbWVIZWFkZXIoIkNvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmciLCAiYmluYXJ5Iik7Ci0gICAgICAgIGpwZWdBdHRhY2guc2V0Q29udGVudElkKCJzdWJtaXRTYW1wbGVJbWFnZUBhcGFjaGUub3JnIik7Ci0gICAgICAgIGpwZWdBdHRhY2guc2V0Q29udGVudFR5cGUoImltYWdlL2pwZyIpOwotICAgICAgICByZXF1ZXN0LmFkZEF0dGFjaG1lbnRQYXJ0KGpwZWdBdHRhY2gpOwotCi0gICAgICAgIFNPQVBDb25uZWN0aW9uIHNDb24gPSBTT0FQQ29ubmVjdGlvbkZhY3RvcnkubmV3SW5zdGFuY2UoKS5jcmVhdGVDb25uZWN0aW9uKCk7Ci0gICAgICAgIFNPQVBNZXNzYWdlIHJlc3BvbnNlID0gc0Nvbi5jYWxsKHJlcXVlc3QsIGdldEFkZHJlc3MoKSk7Ci0KLSAgICAgICAgaW50IGF0dGFjaG1lbnRDb3VudCA9IHJlc3BvbnNlLmNvdW50QXR0YWNobWVudHMoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShhdHRhY2htZW50Q291bnQgPT0gMik7Ci0KLSAgICAgICAgSXRlcmF0b3IgYXR0YWNoSXRlciA9IHJlc3BvbnNlLmdldEF0dGFjaG1lbnRzKCk7Ci0KLSAgICAgICAgaW50IGkgPSAwOwotICAgICAgICB3aGlsZSAoYXR0YWNoSXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIEF0dGFjaG1lbnRQYXJ0IGF0dGFjaG1lbnQgPSAoQXR0YWNobWVudFBhcnQpYXR0YWNoSXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBmaW5hbCBPYmplY3QgY29udGVudCA9IGF0dGFjaG1lbnQuZ2V0RGF0YUhhbmRsZXIoKS5nZXRDb250ZW50KCk7Ci0gICAgICAgICAgICBpZiAoY29udGVudCBpbnN0YW5jZW9mIFN0cmluZykgewotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhzYW1wbGVNZXNzYWdlLCAoU3RyaW5nKWNvbnRlbnQpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChjb250ZW50IGluc3RhbmNlb2YgQnl0ZUFycmF5SW5wdXRTdHJlYW0pIHsKLSAgICAgICAgICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBiYWlzID0gKEJ5dGVBcnJheUlucHV0U3RyZWFtKWNvbnRlbnQ7Ci0gICAgICAgICAgICAgICAgYnl0ZVtdIGIgPSBuZXcgYnl0ZVsxNTAwMF07Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IGxlbmd0aFJlYWQgPSBiYWlzLnJlYWQoYik7Ci0gICAgICAgICAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBmb3MgPQotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGVPdXRwdXRTdHJlYW0obmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJiYXNlZGlyIiwgIi4iKSArICIvIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQvdGVzdC1yZXNvdXJjZXMvcmVzdWx0IiArIChpKyspICsgIi5qcGciKSk7Ci0gICAgICAgICAgICAgICAgZm9zLndyaXRlKGIsIDAsIGxlbmd0aFJlYWQpOwotICAgICAgICAgICAgICAgIGZvcy5mbHVzaCgpOwotICAgICAgICAgICAgICAgIGZvcy5jbG9zZSgpOwotCi0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhdHRhY2htZW50LmdldENvbnRlbnRUeXBlKCkuZXF1YWxzKCJpbWFnZS9qcGVnIikKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IGF0dGFjaG1lbnQuZ2V0Q29udGVudFR5cGUoKS5lcXVhbHMoInRleHQvcGxhaW4iKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBzQ29uLmNsb3NlKCk7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2VuZFJlY2VpdmVOb25SZWZBdHRhY2htZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE1lc3NhZ2VGYWN0b3J5IG1mID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgU09BUE1lc3NhZ2UgcmVxdWVzdCA9IG1mLmNyZWF0ZU1lc3NhZ2UoKTsKLQotICAgICAgICAvL2NyZWF0ZSB0aGUgU09BUFBhcnQKLSAgICAgICAgY3JlYXRlU2ltcGxlU09BUFBhcnQocmVxdWVzdCk7Ci0KLSAgICAgICAgLy9BdHRhY2ggYSB0ZXh0L3BsYWluIG9iamVjdCB3aXRoIHRoZSBTT0FQIHJlcXVlc3QKLSAgICAgICAgU3RyaW5nIHNhbXBsZU1lc3NhZ2UgPSAiU2FtcGxlIE1lc3NhZ2U6IEhlbGxvIFdvcmxkISI7Ci0gICAgICAgIEF0dGFjaG1lbnRQYXJ0IHRleHRBdHRhY2ggPSByZXF1ZXN0LmNyZWF0ZUF0dGFjaG1lbnRQYXJ0KHNhbXBsZU1lc3NhZ2UsICJ0ZXh0L3BsYWluIik7Ci0gICAgICAgIHJlcXVlc3QuYWRkQXR0YWNobWVudFBhcnQodGV4dEF0dGFjaCk7Ci0KLSAgICAgICAgLy9BdHRhY2ggYSBqYXZhLmF3dC5JbWFnZSBvYmplY3QgdG8gdGhlIFNPQVAgcmVxdWVzdAotICAgICAgICBTdHJpbmcganBnZmlsZW5hbWUgPQotICAgICAgICAgICAgICAgIFN5c3RlbS5nZXRQcm9wZXJ0eSgiYmFzZWRpciIsICIuIikgKyAiLyIgKyAidGFyZ2V0L3Rlc3QtcmVzb3VyY2VzL2F4aXMyLmpwZyI7Ci0gICAgICAgIEZpbGUgbXlmaWxlID0gbmV3IEZpbGUoanBnZmlsZW5hbWUpOwotICAgICAgICBGaWxlRGF0YVNvdXJjZSBmZHMgPSBuZXcgRmlsZURhdGFTb3VyY2UobXlmaWxlKTsKLSAgICAgICAgRGF0YUhhbmRsZXIgaW1hZ2VESCA9IG5ldyBEYXRhSGFuZGxlcihmZHMpOwotICAgICAgICBBdHRhY2htZW50UGFydCBqcGVnQXR0YWNoID0gcmVxdWVzdC5jcmVhdGVBdHRhY2htZW50UGFydChpbWFnZURIKTsKLSAgICAgICAganBlZ0F0dGFjaC5hZGRNaW1lSGVhZGVyKCJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nIiwgImJpbmFyeSIpOwotICAgICAgICBqcGVnQXR0YWNoLnNldENvbnRlbnRUeXBlKCJpbWFnZS9qcGciKTsKLSAgICAgICAgcmVxdWVzdC5hZGRBdHRhY2htZW50UGFydChqcGVnQXR0YWNoKTsKLQotCi0gICAgICAgIFNPQVBDb25uZWN0aW9uIHNDb24gPSBTT0FQQ29ubmVjdGlvbkZhY3RvcnkubmV3SW5zdGFuY2UoKS5jcmVhdGVDb25uZWN0aW9uKCk7Ci0gICAgICAgIFNPQVBNZXNzYWdlIHJlc3BvbnNlID0gc0Nvbi5jYWxsKHJlcXVlc3QsIGdldEFkZHJlc3MoKSk7Ci0KLSAgICAgICAgaW50IGF0dGFjaG1lbnRDb3VudCA9IHJlc3BvbnNlLmNvdW50QXR0YWNobWVudHMoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShhdHRhY2htZW50Q291bnQgPT0gMik7Ci0KLSAgICAgICAgSXRlcmF0b3IgYXR0YWNoSXRlciA9IHJlc3BvbnNlLmdldEF0dGFjaG1lbnRzKCk7Ci0KLSAgICAgICAgd2hpbGUgKGF0dGFjaEl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBBdHRhY2htZW50UGFydCBhdHRhY2htZW50ID0gKEF0dGFjaG1lbnRQYXJ0KWF0dGFjaEl0ZXIubmV4dCgpOwotICAgICAgICAgICAgZmluYWwgT2JqZWN0IGNvbnRlbnQgPSBhdHRhY2htZW50LmdldERhdGFIYW5kbGVyKCkuZ2V0Q29udGVudCgpOwotICAgICAgICAgICAgaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoc2FtcGxlTWVzc2FnZSwgKFN0cmluZyljb250ZW50KTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoY29udGVudCBpbnN0YW5jZW9mIEJ5dGVBcnJheUlucHV0U3RyZWFtKSB7Ci0gICAgICAgICAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmFpcyA9IChCeXRlQXJyYXlJbnB1dFN0cmVhbSljb250ZW50OwotICAgICAgICAgICAgICAgIGJ5dGVbXSBiID0gbmV3IGJ5dGVbMTUwMDBdOwotICAgICAgICAgICAgICAgIGZpbmFsIGludCBsZW5ndGhSZWFkID0gYmFpcy5yZWFkKGIpOwotICAgICAgICAgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gZm9zID0KLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlT3V0cHV0U3RyZWFtKG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiYmFzZWRpciIsICIuIikgKyAiLyIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFyZ2V0L3RhcmdldC90ZXN0LXJlc291cmNlcy9heGlzMi5qcGciKSk7Ci0gICAgICAgICAgICAgICAgZm9zLndyaXRlKGIsIDAsIGxlbmd0aFJlYWQpOwotICAgICAgICAgICAgICAgIGZvcy5mbHVzaCgpOwotICAgICAgICAgICAgICAgIGZvcy5jbG9zZSgpOwotCi0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhdHRhY2htZW50LmdldENvbnRlbnRUeXBlKCkuZXF1YWxzKCJpbWFnZS9qcGVnIikKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IGF0dGFjaG1lbnQuZ2V0Q29udGVudFR5cGUoKS5lcXVhbHMoInRleHQvcGxhaW4iKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBzQ29uLmNsb3NlKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVNPQVBQYXJ0KFNPQVBNZXNzYWdlIG1lc3NhZ2UpIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLSAgICAgICAgU09BUFBhcnQgc1BhcnQgPSBtZXNzYWdlLmdldFNPQVBQYXJ0KCk7Ci0gICAgICAgIFNPQVBFbnZlbG9wZSBlbnYgPSBzUGFydC5nZXRFbnZlbG9wZSgpOwotICAgICAgICBTT0FQQm9keSBib2R5ID0gZW52LmdldEJvZHkoKTsKLQotICAgICAgICBmaW5hbCBTT0FQSGVhZGVyIHNvYXBIZWFkZXIgPSBlbnYuZ2V0SGVhZGVyKCk7Ci0gICAgICAgIHNvYXBIZWFkZXIKLSAgICAgICAgICAgICAgICAuYWRkSGVhZGVyRWxlbWVudChlbnYuY3JlYXRlTmFtZSgiVGVzdEhlYWRlcjEiLCAic3dhIiwgImh0dHA6Ly9mYWtlTmFtZXNwYWNlLm9yZyIpKTsKLSAgICAgICAgc29hcEhlYWRlcgotICAgICAgICAgICAgICAgIC5hZGRIZWFkZXJFbGVtZW50KGVudi5jcmVhdGVOYW1lKCJUZXN0SGVhZGVyMiIsICJzd2EiLCAiaHR0cDovL2Zha2VOYW1lc3BhY2Uub3JnIikpOwotICAgICAgICBmaW5hbCBTT0FQSGVhZGVyRWxlbWVudCBoZWFkZXJFbGUzID0KLSAgICAgICAgICAgICAgICBzb2FwSGVhZGVyLmFkZEhlYWRlckVsZW1lbnQoCi0gICAgICAgICAgICAgICAgICAgICAgICBlbnYuY3JlYXRlTmFtZSgiVGVzdEhlYWRlcjMiLCAic3dhIiwgImh0dHA6Ly9mYWtlTmFtZXNwYWNlLm9yZyIpKTsKLSAgICAgICAgZmluYWwgU09BUEVsZW1lbnQgY2gxID0gaGVhZGVyRWxlMy5hZGRDaGlsZEVsZW1lbnQoImhlMyIsICJzd2EiKTsKLSAgICAgICAgY2gxLmFkZFRleHROb2RlKCJJbSBIZWFkZXIgRWxlbWVudCBvZiBoZWFkZXIzIik7Ci0KLSAgICAgICAgTmFtZSBucyA9IGVudi5jcmVhdGVOYW1lKCJlY2hvIiwgInN3YSIsICJodHRwOi8vZmFrZU5hbWVzcGFjZS5vcmciKTsKLSAgICAgICAgU09BUEJvZHlFbGVtZW50IGJvZHlFbGVtZW50ID0gYm9keS5hZGRCb2R5RWxlbWVudChucyk7Ci0KLSAgICAgICAgTmFtZSBuYW1lTWFpbiA9IGVudi5jcmVhdGVOYW1lKCJpbnRlcm5hbCIpOwotICAgICAgICBTT0FQRWxlbWVudCBtYWluQ2hpbGRFbGUgPSBib2R5RWxlbWVudC5hZGRDaGlsZEVsZW1lbnQobmFtZU1haW4pOwotCi0gICAgICAgIE5hbWUgbnMyID0gZW52LmNyZWF0ZU5hbWUoInRleHQiKTsKLSAgICAgICAgU09BUEVsZW1lbnQgdGV4dFJlZmVyZW5jZSA9IG1haW5DaGlsZEVsZS5hZGRDaGlsZEVsZW1lbnQobnMyKTsKLSAgICAgICAgTmFtZSBocmVmQXR0ciA9IGVudi5jcmVhdGVOYW1lKCJocmVmIik7Ci0gICAgICAgIHRleHRSZWZlcmVuY2UuYWRkQXR0cmlidXRlKGhyZWZBdHRyLCAiY2lkOnN1Ym1pdFNhbXBsZVRleHRAYXBhY2hlLm9yZyIpOwotCi0gICAgICAgIE5hbWUgbnMzID0gZW52LmNyZWF0ZU5hbWUoImltYWdlIik7Ci0gICAgICAgIFNPQVBFbGVtZW50IGltYWdlUmVmZXJlbmNlID0gbWFpbkNoaWxkRWxlLmFkZENoaWxkRWxlbWVudChuczMpOwotICAgICAgICBOYW1lIG5zMzEgPSBlbnYuY3JlYXRlTmFtZSgiaW5uZXIiKTsKLSAgICAgICAgZmluYWwgU09BUEVsZW1lbnQgaW1nID0gaW1hZ2VSZWZlcmVuY2UuYWRkQ2hpbGRFbGVtZW50KG5zMzEpOwotICAgICAgICBpbWcuYWRkQXR0cmlidXRlKGhyZWZBdHRyLCAiY2lkOnN1Ym1pdFNhbXBsZUltYWdlQGFwYWNoZS5vcmciKTsKLQotICAgICAgICBOYW1lIG5zNCA9IGVudi5jcmVhdGVOYW1lKCJwbGFpbnR4dCIpOwotICAgICAgICBTT0FQRWxlbWVudCBwbGFpblR4dCA9IG1haW5DaGlsZEVsZS5hZGRDaGlsZEVsZW1lbnQobnM0KTsKLSAgICAgICAgcGxhaW5UeHQuYWRkVGV4dE5vZGUoIlRoaXMgaXMgc2ltcGxlIHBsYWluIHRleHQiKTsKLQotICAgICAgICBOYW1lIG5zNSA9IGVudi5jcmVhdGVOYW1lKCJuZXN0ZWQiKTsKLSAgICAgICAgU09BUEVsZW1lbnQgbmVzdGVkID0gbWFpbkNoaWxkRWxlLmFkZENoaWxkRWxlbWVudChuczUpOwotICAgICAgICBuZXN0ZWQuYWRkVGV4dE5vZGUoIk5lc3RlZDEgUGxhaW4gVGV4dCIpOwotICAgICAgICBOYW1lIG5zNiA9IGVudi5jcmVhdGVOYW1lKCJuZXN0ZWQyIik7Ci0gICAgICAgIFNPQVBFbGVtZW50IG5lc3RlZDIgPSBuZXN0ZWQuYWRkQ2hpbGRFbGVtZW50KG5zNik7Ci0gICAgICAgIG5lc3RlZDIuYWRkVGV4dE5vZGUoIk5lc3RlZDIgUGxhaW4gVGV4dCIpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVTaW1wbGVTT0FQUGFydChTT0FQTWVzc2FnZSBtZXNzYWdlKSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7Ci0gICAgICAgIFNPQVBQYXJ0IHNQYXJ0ID0gbWVzc2FnZS5nZXRTT0FQUGFydCgpOwotICAgICAgICBTT0FQRW52ZWxvcGUgZW52ID0gc1BhcnQuZ2V0RW52ZWxvcGUoKTsKLSAgICAgICAgU09BUEJvZHkgYm9keSA9IGVudi5nZXRCb2R5KCk7Ci0gICAgICAgIFNPQVBIZWFkZXIgaGVhZGVyID0gZW52LmdldEhlYWRlcigpOwotICAgICAgICBoZWFkZXIuYWRkSGVhZGVyRWxlbWVudChlbnYuY3JlYXRlTmFtZSgiSGVhZGVyMSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcmVmIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly90ZXN0LmFwYWNoLm9yZy90ZXN0IikpCi0gICAgICAgICAgICAgICAgLmFkZFRleHROb2RlKCJUaGlzIGlzIGhlYWRlcjEiKTsKLQotICAgICAgICBOYW1lIG5zID0gZW52LmNyZWF0ZU5hbWUoImVjaG8iLCAic3dhMiIsICJodHRwOi8vZmFrZU5hbWVzcGFjZTIub3JnIik7Ci0gICAgICAgIGZpbmFsIFNPQVBCb2R5RWxlbWVudCBib2R5RWxlbWVudCA9IGJvZHkuYWRkQm9keUVsZW1lbnQobnMpOwotICAgICAgICBOYW1lIG5zMiA9IGVudi5jcmVhdGVOYW1lKCJzb21ldGhpbmciKTsKLSAgICAgICAgZmluYWwgU09BUEVsZW1lbnQgZWxlMSA9IGJvZHlFbGVtZW50LmFkZENoaWxkRWxlbWVudChuczIpOwotICAgICAgICBlbGUxLmFkZFRleHROb2RlKCJUaGlzIGlzIHNvbWUgdGV4dCIpOwotCi0gICAgICAgIE5hbWUgbnMzID0gZW52LmNyZWF0ZU5hbWUoInBpbmciLCAic3dhMyIsICJodHRwOi8vZmFrZU5hbWVzcGFjZTMub3JnIik7Ci0gICAgICAgIGZpbmFsIFNPQVBCb2R5RWxlbWVudCBib2R5RWxlbWVudDIgPSBib2R5LmFkZEJvZHlFbGVtZW50KG5zMyk7Ci0gICAgICAgIE5hbWUgbnM0ID0gZW52LmNyZWF0ZU5hbWUoImFub3RoZXIiKTsKLSAgICAgICAgZmluYWwgU09BUEVsZW1lbnQgZWxlMiA9IGJvZHlFbGVtZW50Mi5hZGRDaGlsZEVsZW1lbnQobnM0KTsKLSAgICAgICAgZWxlMi5hZGRUZXh0Tm9kZSgiVGhpcyBpcyBhbm90aGVyIHRleHQiKTsKLSAgICB9Ci0gICAgCi0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdFNlbmRSZWNlaXZlX0lTTzg4NTkxX0VuY29kZWRTT0FQTWVzc2FnZSgpIHsKLSAgICAgICAgdHJ5ewotICAgICAgICAJTWltZUhlYWRlcnMgbWltZUhlYWRlcnMgPSBuZXcgTWltZUhlYWRlcnMoKTsKLSAgICAgICAgICAgIG1pbWVIZWFkZXJzLmFkZEhlYWRlcigiQ29udGVudC1UeXBlIiwgInRleHQveG1sOyBjaGFyc2V0PWlzby04ODU5LTEiKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgRmlsZUlucHV0U3RyZWFtIGZpbGVJbnB1dFN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oU3lzdGVtLmdldFByb3BlcnR5KCJiYXNlZGlyIiwgIi4iKSArCi0gICAgICAgICAgICAgICAgICAgICIvdGVzdC1yZXNvdXJjZXMiICsgRmlsZS5zZXBhcmF0b3IgKyAic29hcC1wYXJ0LWlzby04ODU5LTEueG1sIik7Ci0gICAgICAgICAgICBTT0FQTWVzc2FnZSByZXF1ZXN0TWVzc2FnZSA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKCkuY3JlYXRlTWVzc2FnZShtaW1lSGVhZGVycyxmaWxlSW5wdXRTdHJlYW0pOwotICAgICAgICAgICAgCi0KLSAgICAgICAgICAgIFNPQVBDb25uZWN0aW9uIHNDb24gPSBTT0FQQ29ubmVjdGlvbkZhY3RvcnkubmV3SW5zdGFuY2UoKS5jcmVhdGVDb25uZWN0aW9uKCk7Ci0gICAgICAgICAgICBTT0FQTWVzc2FnZSByZXNwb25zZSA9IHNDb24uY2FsbChyZXF1ZXN0TWVzc2FnZSwgZ2V0QWRkcmVzcygpKTsKLSAgICAgICAgICAgIGFzc2VydEZhbHNlKHJlc3BvbnNlLmdldEF0dGFjaG1lbnRzKCkuaGFzTmV4dCgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCByZXNwb25zZS5jb3VudEF0dGFjaG1lbnRzKCkpOwotCi0gICAgICAgICAgICBwcmludFNPQVBNZXNzYWdlKHJlcXVlc3RNZXNzYWdlKTsKLSAgICAgICAgICAgIFN0cmluZyByZXNwb25zZVN0ciA9IHByaW50U09BUE1lc3NhZ2UocmVzcG9uc2UpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZVN0ci5pbmRleE9mKCJUaGlzIGlzIHNvbWUgdGV4dC5IZXJlIGFyZSBzb21lIHNwZWNpYWwgY2hhcnMgOiDDtsOGw5rCrsKkIikgIT0gLTEpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZVN0ci5pbmRleE9mKCJlY2hvIikgIT0gLTEpOwotICAgICAgICAgICAgc0Nvbi5jbG9zZSgpOwotICAgICAgICB9IGNhdGNoIChTT0FQRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIEV4Y2VwdGlvbiB3aGlsZSBydW5uaW5nIHRlc3Q6ICIgKyBlKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBFeGNlcHRpb24gd2hpbGUgcnVubmluZyB0ZXN0OiAiICsgZSk7Ci0gICAgICAgIH0KLSAgICB9ICAgIAotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2Fhai90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2Fhai9pbnRlZ3JhdGlvbi9VdGlsU2VydmVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9zYWFqL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zYWFqL2ludGVncmF0aW9uL1V0aWxTZXJ2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE4M2E1Yi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYWFqL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zYWFqL2ludGVncmF0aW9uL1V0aWxTZXJ2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2Fhai5pbnRlZ3JhdGlvbjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuU2VydmljZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LlNlcnZpY2VHcm91cENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LkRlcGxveW1lbnRFbmdpbmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzTW9kdWxlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5TaW1wbGVIVFRQU2VydmVyOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlbmFtZUZpbHRlcjsKLWltcG9ydCBqYXZhLm5ldC5TZXJ2ZXJTb2NrZXQ7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBVdGlsU2VydmVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgY291bnQgPSAwOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU2ltcGxlSFRUUFNlcnZlciByZWNlaXZlcjsKLQotICAgIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgZGVwbG95U2VydmljZShBeGlzU2VydmljZSBzZXJ2aWNlKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgcmVjZWl2ZXIuZ2V0Q29uZmlndXJhdGlvbkNvbnRleHQoKS5nZXRBeGlzQ29uZmlndXJhdGlvbigpLmFkZFNlcnZpY2Uoc2VydmljZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgdm9pZCB1bkRlcGxveVNlcnZpY2UoUU5hbWUgc2VydmljZSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIHJlY2VpdmVyLmdldENvbmZpZ3VyYXRpb25Db250ZXh0KCkuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS4KLSAgICAgICAgICAgICAgICByZW1vdmVTZXJ2aWNlKHNlcnZpY2UuZ2V0TG9jYWxQYXJ0KCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgdW5EZXBsb3lDbGllbnRTZXJ2aWNlKCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIGlmIChyZWNlaXZlci5nZXRDb25maWd1cmF0aW9uQ29udGV4dCgpLmdldEF4aXNDb25maWd1cmF0aW9uKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgcmVjZWl2ZXIuZ2V0Q29uZmlndXJhdGlvbkNvbnRleHQoKS5nZXRBeGlzQ29uZmlndXJhdGlvbigpCi0gICAgICAgICAgICAgICAgICAgIC5yZW1vdmVTZXJ2aWNlKCJBbm9ueW1vdXNTZXJ2aWNlIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIHN0YXJ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN0YXJ0KG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzLlRFU1RJTkdfUkVQT1NJVE9SWSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgaW50IHN0YXJ0KFN0cmluZyByZXBvc2l0b3J5KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaW50IHRlc3RpbmdQb3J0ID0gMDsKLSAgICAgICAgaWYgKGNvdW50ID09IDApIHsKLSAgICAgICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGVyID0gZ2V0TmV3Q29uZmlndXJhdGlvbkNvbnRleHQocmVwb3NpdG9yeSk7Ci0KLSAgICAgICAgICAgIHRlc3RpbmdQb3J0ID0gZmluZEF2YWlsYWJsZVBvcnQoKTsKLSAgICAgICAgICAgIHJlY2VpdmVyID0gbmV3IFNpbXBsZUhUVFBTZXJ2ZXIoZXIsIHRlc3RpbmdQb3J0KTsKLQotICAgICAgICAgICAgcmVjZWl2ZXIuc3RhcnQoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIlNlcnZlciBzdGFydGVkIG9uIHBvcnQgIiArIHRlc3RpbmdQb3J0ICsgIi4uLi4uIik7Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDIwMDApOwotICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZTEpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJUaHJlYWQgaW50ZXJ1cHRlZCIsIGUxKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICAgIGNvdW50Kys7Ci0gICAgICAgIHJldHVybiB0ZXN0aW5nUG9ydDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIENvbmZpZ3VyYXRpb25Db250ZXh0IGdldE5ld0NvbmZpZ3VyYXRpb25Db250ZXh0KFN0cmluZyByZXBvc2l0b3J5KQotICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKHJlcG9zaXRvcnkpOwotICAgICAgICBpZiAoIWZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oInJlcG9zaXRvcnkgZGlyZWN0b3J5ICIgKyBmaWxlLmdldEFic29sdXRlUGF0aCgpICsKLSAgICAgICAgICAgICAgICAgICAgIiBkb2VzIG5vdCBleGlzdCIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkKLSAgICAgICAgICAgICAgICAuY3JlYXRlQ29uZmlndXJhdGlvbkNvbnRleHRGcm9tRmlsZVN5c3RlbShmaWxlLmdldEFic29sdXRlUGF0aCgpLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIHN0b3AoKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgaWYgKGNvdW50ID09IDEpIHsKLSAgICAgICAgICAgIHJlY2VpdmVyLnN0b3AoKTsKLSAgICAgICAgICAgIHdoaWxlIChyZWNlaXZlci5pc1J1bm5pbmcoKSkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlMSkgewotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNvdW50ID0gMDsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIlNlcnZlciBzdG9wcGVkIC4uLi4uIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjb3VudC0tOwotICAgICAgICB9Ci0gICAgICAgIHJlY2VpdmVyLmdldENvbmZpZ3VyYXRpb25Db250ZXh0KCkudGVybWluYXRlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBDb25maWd1cmF0aW9uQ29udGV4dCBnZXRDb25maWd1cmF0aW9uQ29udGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIHJlY2VpdmVyLmdldENvbmZpZ3VyYXRpb25Db250ZXh0KCk7Ci0gICAgfQotCi0gICAgc3RhdGljIGNsYXNzIEFkZHJlc3NpbmdGaWx0ZXIgaW1wbGVtZW50cyBGaWxlbmFtZUZpbHRlciB7Ci0gICAgICAgIHB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGRpciwgU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgICAgIHJldHVybiBuYW1lLnN0YXJ0c1dpdGgoImFkZHJlc3NpbmciKSAmJiBuYW1lLmVuZHNXaXRoKCIubWFyIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBGaWxlIGdldEFkZHJlc3NpbmdNQVJGaWxlKCkgewotICAgICAgICBGaWxlIGRpciA9IG5ldyBGaWxlKG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzLlRFU1RJTkdfUkVQT1NJVE9SWSk7Ci0gICAgICAgIEZpbGVbXSBmaWxlcyA9IGRpci5saXN0RmlsZXMobmV3IEFkZHJlc3NpbmdGaWx0ZXIoKSk7Ci0gICAgICAgIFRlc3RDYXNlLmFzc2VydFRydWUoZmlsZXMubGVuZ3RoID09IDEpOwotICAgICAgICBGaWxlIGZpbGUgPSBmaWxlc1swXTsKLSAgICAgICAgVGVzdENhc2UuYXNzZXJ0VHJ1ZShmaWxlLmV4aXN0cygpKTsKLSAgICAgICAgcmV0dXJuIGZpbGU7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTZXJ2aWNlQ29udGV4dCBjcmVhdGVBZHJlc3NlZEVuYWJsZWRDbGllbnRTaWRlKAotICAgICAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSwgU3RyaW5nIGNsaWVudEhvbWUpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBGaWxlIGZpbGUgPSBnZXRBZGRyZXNzaW5nTUFSRmlsZSgpOwotICAgICAgICBUZXN0Q2FzZS5hc3NlcnRUcnVlKGZpbGUuZXhpc3RzKCkpOwotCi0gICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQgPSBDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkKLSAgICAgICAgICAgICAgICAuY3JlYXRlQ29uZmlndXJhdGlvbkNvbnRleHRGcm9tRmlsZVN5c3RlbShjbGllbnRIb21lLCBudWxsKTsKLSAgICAgICAgQXhpc01vZHVsZSBheGlzTW9kdWxlID0gRGVwbG95bWVudEVuZ2luZS5idWlsZE1vZHVsZShmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ0NvbnRleHQuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKSk7Ci0KLSAgICAgICAgY29uZmlnQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpLmFkZE1vZHVsZShheGlzTW9kdWxlKTsKLSAgICAgICAgLy8gc3lzQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpLmVuZ2FnZU1vZHVsZShtb2R1bGVEZXNjLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgY29uZmlnQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpLmFkZFNlcnZpY2Uoc2VydmljZSk7Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBTZXJ2aWNlR3JvdXBDb250ZXh0KGNvbmZpZ0NvbnRleHQsIHNlcnZpY2UuZ2V0QXhpc1NlcnZpY2VHcm91cCgpKQotICAgICAgICAgICAgICAgIC5nZXRTZXJ2aWNlQ29udGV4dChzZXJ2aWNlKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGludCBmaW5kQXZhaWxhYmxlUG9ydCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNlcnZlclNvY2tldCBzcyA9IG5ldyBTZXJ2ZXJTb2NrZXQoMCk7Ci0gICAgICAgICAgICBpbnQgcmVzdWx0ID0gc3MuZ2V0TG9jYWxQb3J0KCk7Ci0gICAgICAgICAgICBzcy5jbG9zZSgpOwotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybiA1NTU1OwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9hZHZhbmNlZC1ybWkvUkVBRE1FLnR4dCBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvYWR2YW5jZWQtcm1pL1JFQURNRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5MTUwNmQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9hZHZhbmNlZC1ybWkvUkVBRE1FLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotVG8gcnVuIHRoaXMgc2FtcGxlIGZvbGxvdyB0aGVzZXMgc3RlcHMKLTEuIHJ1biBnZW5lcmF0ZV9zZXJ2aWNlIGFudCB0YXNrLiAoYW50IGdlbmVyYXRlX3NlcnZpY2UpCi0gICB0aGlzIGdlbmVyYXRlcyB0aGUgc2VydmljZSBhbmQgcHV0IGl0IHRvIHRoZSBybWlzZXJ2aWNlIGZvbGRlciB1bmRlciByZXBvc2l0b3J5Ci0yLiBzdGFydCB0aGUgYXhpczIgc2VydmVyIAotMy4gcnVuIHRoZSBjbGllbnQgKGFudCBydW5fY2xpZW50KQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9hZHZhbmNlZC1ybWkvYnVpbGQueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9hZHZhbmNlZC1ybWkvYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjMwMjJiLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvYWR2YW5jZWQtcm1pL2J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+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+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9hZHZhbmNlZC1ybWkvY29uZi9jb25maWcueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9hZHZhbmNlZC1ybWkvY29uZi9jb25maWcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjNmZDE3Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvYWR2YW5jZWQtcm1pL2NvbmYvY29uZmlnLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGNvbmZpZyB4bWxucz0iaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvcm1pIj4KLSAgICA8Y3VzdG9tQ2xhc3NJbmZvPgotICAgICAgICA8Y2xhc3NJbmZvIGNsYXNzTmFtZT0ic2FtcGxlLnJtaS5zZXJ2ZXIuZHRvLlRlc3RDbGFzczEiPgotICAgICAgICAgICAgPGZpZWxkSW5mbyBpc0VsZW1lbnQ9ImZhbHNlIiBqYXZhTmFtZT0icGFyYW0xIiB4bWxOYW1lPSJ4bWxQYXJhbTEiLz4KLSAgICAgICAgICAgIDxmaWVsZEluZm8gaXNFbGVtZW50PSJmYWxzZSIgamF2YU5hbWU9InBhcmFtMyIgeG1sTmFtZT0ieG1sUGFyYW0zIi8+Ci0gICAgICAgIDwvY2xhc3NJbmZvPgotICAgICAgICA8Y2xhc3NJbmZvIGNsYXNzTmFtZT0ic2FtcGxlLnJtaS5zZXJ2ZXIuZHRvLlRlc3RDbGFzczIiPgotICAgICAgICAgICAgPGZpZWxkSW5mbyBpc0VsZW1lbnQ9ImZhbHNlIiBqYXZhTmFtZT0icGFyYW0xIiB4bWxOYW1lPSJ4bWxQYXJhbTEiLz4KLSAgICAgICAgICAgIDxmaWVsZEluZm8gaXNFbGVtZW50PSJmYWxzZSIgamF2YU5hbWU9InBhcmFtMiIgeG1sTmFtZT0ieG1sUGFyYW0yIi8+Ci0gICAgICAgICAgICA8ZmllbGRJbmZvIGlzRWxlbWVudD0idHJ1ZSIgamF2YU5hbWU9InBhcmFtMyIgeG1sTmFtZT0ieG1sUGFyYW0zIi8+Ci0gICAgICAgIDwvY2xhc3NJbmZvPgotICAgIDwvY3VzdG9tQ2xhc3NJbmZvPgotICAgIDxwYWNrYWdlVG9OYW1lc3BhY2VNYXBpbmdzPgotICAgICAgICA8cGFja2FnZVRvTmFtZXNwYWNlTWFwPgotICAgICAgICAgICAgPG5hbWVzcGFjZT5odHRwOi8vc2FtcGxlL3NlcnZpY2U8L25hbWVzcGFjZT4KLSAgICAgICAgICAgIDxwYWNrYWdlTmFtZT5zYW1wbGUucm1pLnNlcnZlcjwvcGFja2FnZU5hbWU+Ci0gICAgICAgIDwvcGFja2FnZVRvTmFtZXNwYWNlTWFwPgotICAgICAgICA8cGFja2FnZVRvTmFtZXNwYWNlTWFwPgotICAgICAgICAgICAgPG5hbWVzcGFjZT5odHRwOi8vc2FtcGxlL3NlcnZpY2UvdHlwZXM8L25hbWVzcGFjZT4KLSAgICAgICAgICAgIDxwYWNrYWdlTmFtZT5zYW1wbGUucm1pLnNlcnZlci5kdG88L3BhY2thZ2VOYW1lPgotICAgICAgICA8L3BhY2thZ2VUb05hbWVzcGFjZU1hcD4KLSAgICA8L3BhY2thZ2VUb05hbWVzcGFjZU1hcGluZ3M+Ci0gICAgPHNlcnZpY2VzPgotICAgICAgICA8c2VydmljZT4KLSAgICAgICAgICAgIDxzZXJ2aWNlQ2xhc3M+c2FtcGxlLnJtaS5zZXJ2ZXIuU2VydmljZTE8L3NlcnZpY2VDbGFzcz4KLSAgICAgICAgPC9zZXJ2aWNlPgotICAgICAgICA8c2VydmljZT4KLSAgICAgICAgICAgIDxzZXJ2aWNlQ2xhc3M+c2FtcGxlLnJtaS5zZXJ2ZXIuU2VydmljZTI8L3NlcnZpY2VDbGFzcz4KLSAgICAgICAgPC9zZXJ2aWNlPgotICAgIDwvc2VydmljZXM+Ci08L2NvbmZpZz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2FkdmFuY2VkLXJtaS9zcmMvc2FtcGxlL3JtaS9jbGllbnQvVGVzdFNlcnZpY2UxLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2FkdmFuY2VkLXJtaS9zcmMvc2FtcGxlL3JtaS9jbGllbnQvVGVzdFNlcnZpY2UxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4MTJjZjcuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9hZHZhbmNlZC1ybWkvc3JjL3NhbXBsZS9ybWkvY2xpZW50L1Rlc3RTZXJ2aWNlMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIHNhbXBsZS5ybWkuY2xpZW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmNsaWVudC5STUlDbGllbnRQcm94eTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5jb25maWcuQ2xhc3NJbmZvOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmNvbmZpZy5GaWVsZEluZm87Ci1pbXBvcnQgc2FtcGxlLnJtaS5zZXJ2ZXIuU2VydmljZTFJbnRlcmZhY2U7Ci1pbXBvcnQgc2FtcGxlLnJtaS5zZXJ2ZXIuZHRvLlRlc3RDbGFzczE7Ci1pbXBvcnQgc2FtcGxlLnJtaS5zZXJ2ZXIuZHRvLlRlc3RDbGFzczI7Ci0KLQotcHVibGljIGNsYXNzIFRlc3RTZXJ2aWNlMSB7Ci0KLSAgICBwcml2YXRlIENvbmZpZ3VyYXRvciBjb25maWd1cmF0b3I7Ci0KLSAgICBwdWJsaWMgVGVzdFNlcnZpY2UxKCkgewotCi0gICAgICAgIHRoaXMuY29uZmlndXJhdG9yID0gbmV3IENvbmZpZ3VyYXRvcigpOwotCi0gICAgICAgIHRoaXMuY29uZmlndXJhdG9yLmFkZFBhY2thZ2VUb05hbWVzcGFjZU1hcGluZygic2FtcGxlLnJtaS5zZXJ2ZXIiLCAiaHR0cDovL3NhbXBsZS9zZXJ2aWNlIik7Ci0gICAgICAgIHRoaXMuY29uZmlndXJhdG9yLmFkZFBhY2thZ2VUb05hbWVzcGFjZU1hcGluZygic2FtcGxlLnJtaS5zZXJ2ZXIuZHRvIiwgImh0dHA6Ly9zYW1wbGUvc2VydmljZS90eXBlcyIpOwotCi0gICAgICAgIENsYXNzSW5mbyBjbGFzc0luZm8gPSBuZXcgQ2xhc3NJbmZvKFRlc3RDbGFzczEuY2xhc3MpOwotICAgICAgICBjbGFzc0luZm8uYWRkRmllbGRJbmZvKG5ldyBGaWVsZEluZm8oInBhcmFtMSIsICJ4bWxQYXJhbTEiLCBmYWxzZSkpOwotICAgICAgICBjbGFzc0luZm8uYWRkRmllbGRJbmZvKG5ldyBGaWVsZEluZm8oInBhcmFtMyIsICJ4bWxQYXJhbTMiLCBmYWxzZSkpOwotCi0gICAgICAgIHRoaXMuY29uZmlndXJhdG9yLmFkZENsYXNzSW5mbyhjbGFzc0luZm8pOwotCi0gICAgICAgIGNsYXNzSW5mbyA9IG5ldyBDbGFzc0luZm8oVGVzdENsYXNzMi5jbGFzcyk7Ci0gICAgICAgIGNsYXNzSW5mby5hZGRGaWVsZEluZm8obmV3IEZpZWxkSW5mbygicGFyYW0xIiwgInhtbFBhcmFtMSIsIGZhbHNlKSk7Ci0gICAgICAgIGNsYXNzSW5mby5hZGRGaWVsZEluZm8obmV3IEZpZWxkSW5mbygicGFyYW0yIiwgInhtbFBhcmFtMiIsIGZhbHNlKSk7Ci0gICAgICAgIGNsYXNzSW5mby5hZGRGaWVsZEluZm8obmV3IEZpZWxkSW5mbygicGFyYW0zIiwgInhtbFBhcmFtMyIsIHRydWUpKTsKLQotICAgICAgICB0aGlzLmNvbmZpZ3VyYXRvci5hZGRDbGFzc0luZm8oY2xhc3NJbmZvKTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNZXRob2QxKCkgewotCi0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNlcnZpY2UxSW50ZXJmYWNlIHByb3h5ID0KLSAgICAgICAgICAgICAgICAgICAgKFNlcnZpY2UxSW50ZXJmYWNlKSBSTUlDbGllbnRQcm94eS5jcmVhdGVQcm94eShTZXJ2aWNlMUludGVyZmFjZS5jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2F4aXMyL3NlcnZpY2VzL1NlcnZpY2UxIik7Ci0KLSAgICAgICAgICAgIFRlc3RDbGFzczEgdGVzdENsYXNzMSA9ICBuZXcgVGVzdENsYXNzMSgpOwotICAgICAgICAgICAgdGVzdENsYXNzMS5zZXRQYXJhbTEoNSk7Ci0gICAgICAgICAgICB0ZXN0Q2xhc3MxLnNldFBhcmFtMigiaGVsbG93IHdvcmxkIik7Ci0gICAgICAgICAgICB0ZXN0Q2xhc3MxLnNldFBhcmFtMyhuZXcgSW50ZWdlcig2KSk7Ci0KLSAgICAgICAgICAgIFRlc3RDbGFzczEgcmVzdWx0ID0gcHJveHkubWV0aG9kMSh0ZXN0Q2xhc3MxKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUGFyYW0xID09PiAiICsgcmVzdWx0LmdldFBhcmFtMSgpKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUGFyYW0yID09PiAiICsgcmVzdWx0LmdldFBhcmFtMigpKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUGFyYW0zID09PiAiICsgcmVzdWx0LmdldFBhcmFtMygpKTsKLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGF4aXNGYXVsdCkgewotICAgICAgICAgICAgYXhpc0ZhdWx0LnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0KLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNZXRob2QyKCkgewotCi0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNlcnZpY2UxSW50ZXJmYWNlIHByb3h5ID0KLSAgICAgICAgICAgICAgICAgICAgKFNlcnZpY2UxSW50ZXJmYWNlKSBSTUlDbGllbnRQcm94eS5jcmVhdGVQcm94eShTZXJ2aWNlMUludGVyZmFjZS5jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2F4aXMyL3NlcnZpY2VzL1NlcnZpY2UxIik7Ci0KLSAgICAgICAgICAgIFRlc3RDbGFzczIgdGVzdENsYXNzMiA9IG5ldyBUZXN0Q2xhc3MyKCk7Ci0gICAgICAgICAgICB0ZXN0Q2xhc3MyLnNldFBhcmFtMSg1KTsKLSAgICAgICAgICAgIHRlc3RDbGFzczIuc2V0UGFyYW0yKCJ0ZXN0IFN0cmluZyIpOwotCi0gICAgICAgICAgICBUZXN0Q2xhc3MxW10gdGVzdENsYXNzMXMgPSBuZXcgVGVzdENsYXNzMVsyXTsKLSAgICAgICAgICAgIHRlc3RDbGFzczFzWzBdID0gIG5ldyBUZXN0Q2xhc3MxKCk7Ci0gICAgICAgICAgICB0ZXN0Q2xhc3Mxc1swXS5zZXRQYXJhbTEoNSk7Ci0gICAgICAgICAgICB0ZXN0Q2xhc3Mxc1swXS5zZXRQYXJhbTIoImhlbGxvdyB3b3JsZCIpOwotICAgICAgICAgICAgdGVzdENsYXNzMXNbMF0uc2V0UGFyYW0zKG5ldyBJbnRlZ2VyKDYpKTsKLQotICAgICAgICAgICAgdGVzdENsYXNzMXNbMV0gPSAgbmV3IFRlc3RDbGFzczEoKTsKLSAgICAgICAgICAgIHRlc3RDbGFzczFzWzFdLnNldFBhcmFtMSg1KTsKLSAgICAgICAgICAgIHRlc3RDbGFzczFzWzFdLnNldFBhcmFtMigiaGVsbG93IHdvcmxkIik7Ci0gICAgICAgICAgICB0ZXN0Q2xhc3Mxc1sxXS5zZXRQYXJhbTMobmV3IEludGVnZXIoNikpOwotCi0gICAgICAgICAgICB0ZXN0Q2xhc3MyLnNldFBhcmFtMyh0ZXN0Q2xhc3Mxcyk7Ci0KLSAgICAgICAgICAgIFRlc3RDbGFzczIgcmVzdWx0ID0gcHJveHkubWV0aG9kMih0ZXN0Q2xhc3MyKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUGFyYW0xID09PiAiICsgcmVzdWx0LmdldFBhcmFtMSgpKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUGFyYW0yID09PiAiICsgcmVzdWx0LmdldFBhcmFtMigpKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUGFyYW0zWzBdIHBhcmFtMSA9PT4gIiArIHJlc3VsdC5nZXRQYXJhbTMoKVswXS5nZXRQYXJhbTEoKSk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlBhcmFtM1swXSBwYXJhbTIgPT0+ICIgKyByZXN1bHQuZ2V0UGFyYW0zKClbMF0uZ2V0UGFyYW0yKCkpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJQYXJhbTNbMF0gcGFyYW0zID09PiAiICsgcmVzdWx0LmdldFBhcmFtMygpWzBdLmdldFBhcmFtMygpKTsKLQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJQYXJhbTNbMV0gcGFyYW0xID09PiAiICsgcmVzdWx0LmdldFBhcmFtMygpWzFdLmdldFBhcmFtMSgpKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUGFyYW0zWzFdIHBhcmFtMiA9PT4gIiArIHJlc3VsdC5nZXRQYXJhbTMoKVsxXS5nZXRQYXJhbTIoKSk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlBhcmFtM1sxXSBwYXJhbTMgPT0+ICIgKyByZXN1bHQuZ2V0UGFyYW0zKClbMV0uZ2V0UGFyYW0zKCkpOwotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgYXhpc0ZhdWx0KSB7Ci0gICAgICAgICAgICBheGlzRmF1bHQucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLQotCi0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotICAgICAgICBUZXN0U2VydmljZTEgdGVzdFNlcnZpY2UxID0gbmV3IFRlc3RTZXJ2aWNlMSgpOwotICAgICAgICB0ZXN0U2VydmljZTEudGVzdE1ldGhvZDEoKTsKLSAgICAgICAgdGVzdFNlcnZpY2UxLnRlc3RNZXRob2QyKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9hZHZhbmNlZC1ybWkvc3JjL3NhbXBsZS9ybWkvY2xpZW50L1Rlc3RTZXJ2aWNlMi5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9hZHZhbmNlZC1ybWkvc3JjL3NhbXBsZS9ybWkvY2xpZW50L1Rlc3RTZXJ2aWNlMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Mzk1MTFhLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvYWR2YW5jZWQtcm1pL3NyYy9zYW1wbGUvcm1pL2NsaWVudC9UZXN0U2VydmljZTIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIHNhbXBsZS5ybWkuY2xpZW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmNsaWVudC5STUlDbGllbnRQcm94eTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBzYW1wbGUucm1pLnNlcnZlci5TZXJ2aWNlMkludGVyZmFjZTsKLWltcG9ydCBzYW1wbGUucm1pLnNlcnZlci5kdG8uVGVzdFJlc3RyaWN0aW9uQmVhbjsKLWltcG9ydCBzYW1wbGUucm1pLnNlcnZlci5kdG8uVGVzdENvbXBsZXhCZWFuOwotaW1wb3J0IHNhbXBsZS5ybWkuc2VydmVyLmR0by5UZXN0QmVhbjsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotCi1wdWJsaWMgY2xhc3MgVGVzdFNlcnZpY2UyIHsKLQotICAgIHByaXZhdGUgQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvcjsKLQotICAgIHB1YmxpYyBUZXN0U2VydmljZTIoKSB7Ci0KLSAgICAgICAgdGhpcy5jb25maWd1cmF0b3IgPSBuZXcgQ29uZmlndXJhdG9yKCk7Ci0gICAgICAgIHRoaXMuY29uZmlndXJhdG9yLmFkZFBhY2thZ2VUb05hbWVzcGFjZU1hcGluZygic2FtcGxlLnJtaS5zZXJ2ZXIiLCAiaHR0cDovL3NhbXBsZS9zZXJ2aWNlIik7Ci0gICAgICAgIHRoaXMuY29uZmlndXJhdG9yLmFkZFBhY2thZ2VUb05hbWVzcGFjZU1hcGluZygic2FtcGxlLnJtaS5zZXJ2ZXIuZHRvIiwgImh0dHA6Ly9zYW1wbGUvc2VydmljZS90eXBlcyIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNZXRob2QxKCl7Ci0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgU2VydmljZTJJbnRlcmZhY2UgcHJveHkgPQotICAgICAgICAgICAgICAgICAgICAoU2VydmljZTJJbnRlcmZhY2UpIFJNSUNsaWVudFByb3h5LmNyZWF0ZVByb3h5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZpY2UySW50ZXJmYWNlLmNsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2F4aXMyL3NlcnZpY2VzL1NlcnZpY2UyIik7Ci0gICAgICAgICAgICBUZXN0UmVzdHJpY3Rpb25CZWFuIHRlc3RSZXN0cmljdGlvbkJlYW4gPSBuZXcgVGVzdFJlc3RyaWN0aW9uQmVhbigidGVzdHZhbHVlIik7Ci0gICAgICAgICAgICBUZXN0UmVzdHJpY3Rpb25CZWFuIHJlc3VsdCA9IHByb3h5Lm1ldGhvZDEodGVzdFJlc3RyaWN0aW9uQmVhbik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlJlc3VsdCA9PT4gIiArIHJlc3VsdC5nZXRQYXJhbTEoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBheGlzRmF1bHQpIHsKLSAgICAgICAgICAgIGF4aXNGYXVsdC5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNZXRob2QyKCl7Ci0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgU2VydmljZTJJbnRlcmZhY2UgcHJveHkgPQotICAgICAgICAgICAgICAgICAgICAoU2VydmljZTJJbnRlcmZhY2UpIFJNSUNsaWVudFByb3h5LmNyZWF0ZVByb3h5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZpY2UySW50ZXJmYWNlLmNsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2F4aXMyL3NlcnZpY2VzL1NlcnZpY2UyIik7Ci0gICAgICAgICAgICBUZXN0Q29tcGxleEJlYW4gdGVzdENvbXBsZXhCZWFuID0gbmV3IFRlc3RDb21wbGV4QmVhbigpOwotICAgICAgICAgICAgdGVzdENvbXBsZXhCZWFuLmFkZFRlc3RCZWFuKG5ldyBUZXN0QmVhbig1LCJ0ZXN0c3RyaW5nMSIpKTsKLSAgICAgICAgICAgIHRlc3RDb21wbGV4QmVhbi5hZGRUZXN0QmVhbihuZXcgVGVzdEJlYW4oNiwidGVzdHN0cmluZzIiKSk7Ci0gICAgICAgICAgICB0ZXN0Q29tcGxleEJlYW4uYWRkVGVzdEJlYW4obmV3IFRlc3RCZWFuKDcsInRlc3RzdHJpbmczIikpOwotICAgICAgICAgICAgVGVzdENvbXBsZXhCZWFuIHJlc3VsdCA9IHByb3h5Lm1ldGhvZDIodGVzdENvbXBsZXhCZWFuKTsKLSAgICAgICAgICAgIFRlc3RCZWFuIHRlc3RCZWFuOwotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gcmVzdWx0LmdldFRlc3RCZWFucygpLml0ZXJhdG9yKCk7aXRlci5oYXNOZXh0KCk7KXsKLSAgICAgICAgICAgICAgICB0ZXN0QmVhbiA9IChUZXN0QmVhbikgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJQYXJtMSA9PT4gIiArIHRlc3RCZWFuLmdldFBhcmFtMSgpKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlBhcm0yID09PiAiICsgdGVzdEJlYW4uZ2V0UGFyYW0yKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgYXhpc0ZhdWx0KSB7Ci0gICAgICAgICAgICBheGlzRmF1bHQucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotICAgICAgICBUZXN0U2VydmljZTIgdGVzdFNlcnZpY2UyID0gbmV3IFRlc3RTZXJ2aWNlMigpOwotICAgICAgICB0ZXN0U2VydmljZTIudGVzdE1ldGhvZDEoKTsKLSAgICAgICAgdGVzdFNlcnZpY2UyLnRlc3RNZXRob2QyKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9hZHZhbmNlZC1ybWkvc3JjL3NhbXBsZS9ybWkvc2VydmVyL1NlcnZpY2UxLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2FkdmFuY2VkLXJtaS9zcmMvc2FtcGxlL3JtaS9zZXJ2ZXIvU2VydmljZTEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA2Mzk5NC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2FkdmFuY2VkLXJtaS9zcmMvc2FtcGxlL3JtaS9zZXJ2ZXIvU2VydmljZTEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIHNhbXBsZS5ybWkuc2VydmVyOwotCi1pbXBvcnQgc2FtcGxlLnJtaS5zZXJ2ZXIuZHRvLlRlc3RDbGFzczE7Ci1pbXBvcnQgc2FtcGxlLnJtaS5zZXJ2ZXIuZHRvLlRlc3RDbGFzczI7Ci0KLQotcHVibGljIGNsYXNzIFNlcnZpY2UxIGltcGxlbWVudHMgU2VydmljZTFJbnRlcmZhY2UgewotCi0gICAgcHVibGljIFRlc3RDbGFzczEgbWV0aG9kMShUZXN0Q2xhc3MxIHBhcmFtMSkgewotICAgICAgICByZXR1cm4gcGFyYW0xOwotICAgIH0KLQotICAgIHB1YmxpYyBUZXN0Q2xhc3MyIG1ldGhvZDIoVGVzdENsYXNzMiBwYXJhbTEpIHsKLSAgICAgICAgcmV0dXJuIHBhcmFtMTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2FkdmFuY2VkLXJtaS9zcmMvc2FtcGxlL3JtaS9zZXJ2ZXIvU2VydmljZTFJbnRlcmZhY2UuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvYWR2YW5jZWQtcm1pL3NyYy9zYW1wbGUvcm1pL3NlcnZlci9TZXJ2aWNlMUludGVyZmFjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWYzZWIyLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvYWR2YW5jZWQtcm1pL3NyYy9zYW1wbGUvcm1pL3NlcnZlci9TZXJ2aWNlMUludGVyZmFjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugc2FtcGxlLnJtaS5zZXJ2ZXI7Ci0KLWltcG9ydCBzYW1wbGUucm1pLnNlcnZlci5kdG8uVGVzdENsYXNzMTsKLWltcG9ydCBzYW1wbGUucm1pLnNlcnZlci5kdG8uVGVzdENsYXNzMjsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIFNlcnZpY2UxSW50ZXJmYWNlIHsKLQotICAgIHB1YmxpYyBUZXN0Q2xhc3MxIG1ldGhvZDEoVGVzdENsYXNzMSBwYXJhbTEpOwotCi0gICAgcHVibGljIFRlc3RDbGFzczIgbWV0aG9kMihUZXN0Q2xhc3MyIHBhcmFtMSk7Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2FkdmFuY2VkLXJtaS9zcmMvc2FtcGxlL3JtaS9zZXJ2ZXIvU2VydmljZTIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvYWR2YW5jZWQtcm1pL3NyYy9zYW1wbGUvcm1pL3NlcnZlci9TZXJ2aWNlMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjMwNWQ0Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvYWR2YW5jZWQtcm1pL3NyYy9zYW1wbGUvcm1pL3NlcnZlci9TZXJ2aWNlMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugc2FtcGxlLnJtaS5zZXJ2ZXI7Ci0KLWltcG9ydCBzYW1wbGUucm1pLnNlcnZlci5kdG8uVGVzdFJlc3RyaWN0aW9uQmVhbjsKLWltcG9ydCBzYW1wbGUucm1pLnNlcnZlci5kdG8uVGVzdENvbXBsZXhCZWFuOwotCi0KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlMiBpbXBsZW1lbnRzIFNlcnZpY2UySW50ZXJmYWNlewotCi0gICAgcHVibGljIFRlc3RSZXN0cmljdGlvbkJlYW4gbWV0aG9kMShUZXN0UmVzdHJpY3Rpb25CZWFuIHBhcmFtMSkgewotICAgICAgICByZXR1cm4gcGFyYW0xOwotICAgIH0KLQotICAgIHB1YmxpYyBUZXN0Q29tcGxleEJlYW4gbWV0aG9kMihUZXN0Q29tcGxleEJlYW4gcGFyYW0xKSB7Ci0gICAgICAgIHJldHVybiBwYXJhbTE7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9hZHZhbmNlZC1ybWkvc3JjL3NhbXBsZS9ybWkvc2VydmVyL1NlcnZpY2UySW50ZXJmYWNlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2FkdmFuY2VkLXJtaS9zcmMvc2FtcGxlL3JtaS9zZXJ2ZXIvU2VydmljZTJJbnRlcmZhY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI2YmI3ZC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2FkdmFuY2VkLXJtaS9zcmMvc2FtcGxlL3JtaS9zZXJ2ZXIvU2VydmljZTJJbnRlcmZhY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIHNhbXBsZS5ybWkuc2VydmVyOwotCi1pbXBvcnQgc2FtcGxlLnJtaS5zZXJ2ZXIuZHRvLlRlc3RSZXN0cmljdGlvbkJlYW47Ci1pbXBvcnQgc2FtcGxlLnJtaS5zZXJ2ZXIuZHRvLlRlc3RDb21wbGV4QmVhbjsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIFNlcnZpY2UySW50ZXJmYWNlIHsKLQotICAgIHB1YmxpYyBUZXN0UmVzdHJpY3Rpb25CZWFuIG1ldGhvZDEoVGVzdFJlc3RyaWN0aW9uQmVhbiBwYXJhbTEpOwotCi0gICAgcHVibGljIFRlc3RDb21wbGV4QmVhbiBtZXRob2QyKFRlc3RDb21wbGV4QmVhbiBwYXJhbTEpOwotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9hZHZhbmNlZC1ybWkvc3JjL3NhbXBsZS9ybWkvc2VydmVyL2R0by9UZXN0QmVhbi5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9hZHZhbmNlZC1ybWkvc3JjL3NhbXBsZS9ybWkvc2VydmVyL2R0by9UZXN0QmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjIzMWE1Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvYWR2YW5jZWQtcm1pL3NyYy9zYW1wbGUvcm1pL3NlcnZlci9kdG8vVGVzdEJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIHNhbXBsZS5ybWkuc2VydmVyLmR0bzsKLQotCi1wdWJsaWMgY2xhc3MgVGVzdEJlYW4gewotCi0gICAgcHJpdmF0ZSBpbnQgcGFyYW0xOwotICAgIHByaXZhdGUgU3RyaW5nIHBhcmFtMjsKLQotICAgIHB1YmxpYyBUZXN0QmVhbigpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVGVzdEJlYW4oaW50IHBhcmFtMSwgU3RyaW5nIHBhcmFtMikgewotICAgICAgICB0aGlzLnBhcmFtMSA9IHBhcmFtMTsKLSAgICAgICAgdGhpcy5wYXJhbTIgPSBwYXJhbTI7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRQYXJhbTEoKSB7Ci0gICAgICAgIHJldHVybiBwYXJhbTE7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGFyYW0xKGludCBwYXJhbTEpIHsKLSAgICAgICAgdGhpcy5wYXJhbTEgPSBwYXJhbTE7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQYXJhbTIoKSB7Ci0gICAgICAgIHJldHVybiBwYXJhbTI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGFyYW0yKFN0cmluZyBwYXJhbTIpIHsKLSAgICAgICAgdGhpcy5wYXJhbTIgPSBwYXJhbTI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9hZHZhbmNlZC1ybWkvc3JjL3NhbXBsZS9ybWkvc2VydmVyL2R0by9UZXN0Q2xhc3MxLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2FkdmFuY2VkLXJtaS9zcmMvc2FtcGxlL3JtaS9zZXJ2ZXIvZHRvL1Rlc3RDbGFzczEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA4NzRkNy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2FkdmFuY2VkLXJtaS9zcmMvc2FtcGxlL3JtaS9zZXJ2ZXIvZHRvL1Rlc3RDbGFzczEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIHNhbXBsZS5ybWkuc2VydmVyLmR0bzsKLQotCi1wdWJsaWMgY2xhc3MgVGVzdENsYXNzMSB7Ci0KLSAgICBwcml2YXRlIGludCBwYXJhbTE7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgcGFyYW0yOwotICAgIHByaXZhdGUgSW50ZWdlciBwYXJhbTM7Ci0KLSAgICBwdWJsaWMgaW50IGdldFBhcmFtMSgpIHsKLSAgICAgICAgcmV0dXJuIHBhcmFtMTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJhbTEoaW50IHBhcmFtMSkgewotICAgICAgICB0aGlzLnBhcmFtMSA9IHBhcmFtMTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhcmFtMigpIHsKLSAgICAgICAgcmV0dXJuIHBhcmFtMjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJhbTIoU3RyaW5nIHBhcmFtMikgewotICAgICAgICB0aGlzLnBhcmFtMiA9IHBhcmFtMjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSW50ZWdlciBnZXRQYXJhbTMoKSB7Ci0gICAgICAgIHJldHVybiBwYXJhbTM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGFyYW0zKEludGVnZXIgcGFyYW0zKSB7Ci0gICAgICAgIHRoaXMucGFyYW0zID0gcGFyYW0zOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvYWR2YW5jZWQtcm1pL3NyYy9zYW1wbGUvcm1pL3NlcnZlci9kdG8vVGVzdENsYXNzMi5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9hZHZhbmNlZC1ybWkvc3JjL3NhbXBsZS9ybWkvc2VydmVyL2R0by9UZXN0Q2xhc3MyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkOTVlNzEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9hZHZhbmNlZC1ybWkvc3JjL3NhbXBsZS9ybWkvc2VydmVyL2R0by9UZXN0Q2xhc3MyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBzYW1wbGUucm1pLnNlcnZlci5kdG87Ci0KLQotcHVibGljIGNsYXNzIFRlc3RDbGFzczIgewotCi0gICAgcHJpdmF0ZSBpbnQgcGFyYW0xOwotICAgIHByaXZhdGUgU3RyaW5nIHBhcmFtMjsKLSAgICBwcml2YXRlIFRlc3RDbGFzczFbXSBwYXJhbTM7Ci0KLSAgICBwdWJsaWMgaW50IGdldFBhcmFtMSgpIHsKLSAgICAgICAgcmV0dXJuIHBhcmFtMTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJhbTEoaW50IHBhcmFtMSkgewotICAgICAgICB0aGlzLnBhcmFtMSA9IHBhcmFtMTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhcmFtMigpIHsKLSAgICAgICAgcmV0dXJuIHBhcmFtMjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJhbTIoU3RyaW5nIHBhcmFtMikgewotICAgICAgICB0aGlzLnBhcmFtMiA9IHBhcmFtMjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVGVzdENsYXNzMVtdIGdldFBhcmFtMygpIHsKLSAgICAgICAgcmV0dXJuIHBhcmFtMzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJhbTMoVGVzdENsYXNzMVtdIHBhcmFtMykgewotICAgICAgICB0aGlzLnBhcmFtMyA9IHBhcmFtMzsKLSAgICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9hZHZhbmNlZC1ybWkvc3JjL3NhbXBsZS9ybWkvc2VydmVyL2R0by9UZXN0Q29tcGxleEJlYW4uamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvYWR2YW5jZWQtcm1pL3NyYy9zYW1wbGUvcm1pL3NlcnZlci9kdG8vVGVzdENvbXBsZXhCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhYjNjNzUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9hZHZhbmNlZC1ybWkvc3JjL3NhbXBsZS9ybWkvc2VydmVyL2R0by9UZXN0Q29tcGxleEJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBzYW1wbGUucm1pLnNlcnZlci5kdG87Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5kYXRhYmluZC5BYnN0cmFjdFJNSUJlYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZGF0YWJpbmQuSmF2YU9iamVjdFNlcmlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZGF0YWJpbmQuWG1sU3RyZWFtUGFyc2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLnV0aWwuTmFtZXNwYWNlUHJlZml4OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmV4Y2VwdGlvbi5YbWxTZXJpYWxpemluZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5leGNlcHRpb24uWG1sUGFyc2luZ0V4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBzYW1wbGUucm1pLnNlcnZlci50eXBlLlRlc3RDb21wbGV4VHlwZTsKLQotCi1wdWJsaWMgY2xhc3MgVGVzdENvbXBsZXhCZWFuIGV4dGVuZHMgQWJzdHJhY3RSTUlCZWFuIHsKLQotICAgIHByaXZhdGUgTGlzdCB0ZXN0QmVhbnM7Ci0KLSAgICBwdWJsaWMgVGVzdENvbXBsZXhCZWFuKCkgewotICAgICAgICB0aGlzLnRlc3RCZWFucyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIENsYXNzIGdldEJlYW5DbGFzcygpewotICAgICAgICByZXR1cm4gVGVzdENvbXBsZXhUeXBlLmNsYXNzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBKYXZhT2JqZWN0U2VyaWFsaXplciBzZXJpYWxpemVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBRTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZXNwYWNlUHJlZml4IG5hbWVzcGFjZVByZWZpeCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgWG1sU2VyaWFsaXppbmdFeGNlcHRpb24gewotICAgICAgICAvLyBmaXJzdCB3cml0ZSB0aGUgc3RhcnQgZWxlbWVudAotICAgICAgICB3cml0ZVN0YXJ0RWxlbWVudCh3cml0ZXIsCi0gICAgICAgICAgICAgICAgcGFyZW50UU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCksCi0gICAgICAgICAgICAgICAgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCksCi0gICAgICAgICAgICAgICAgbmFtZXNwYWNlUHJlZml4KTsKLSAgICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9ICJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi9ybWkvc2FtcGxlcy90eXBlcyI7Ci0gICAgICAgIFRlc3RCZWFuIHRlc3RCZWFuOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0ZXN0QmVhbnMuaXRlcmF0b3IoKTtpdGVyLmhhc05leHQoKTspewotICAgICAgICAgICAgdGVzdEJlYW4gPSAoVGVzdEJlYW4pIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgd3JpdGVTdGFydEVsZW1lbnQod3JpdGVyLG5hbWVzcGFjZSwicGFyYW0xIixuYW1lc3BhY2VQcmVmaXgpOwotICAgICAgICAgICAgd3JpdGVyLndyaXRlQ2hhcmFjdGVycyhTdHJpbmcudmFsdWVPZih0ZXN0QmVhbi5nZXRQYXJhbTEoKSkpOwotICAgICAgICAgICAgd3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICAgICAgd3JpdGVTdGFydEVsZW1lbnQod3JpdGVyLG5hbWVzcGFjZSwicGFyYW0yIixuYW1lc3BhY2VQcmVmaXgpOwotICAgICAgICAgICAgd3JpdGVyLndyaXRlQ2hhcmFjdGVycyh0ZXN0QmVhbi5nZXRQYXJhbTIoKSk7Ci0gICAgICAgICAgICB3cml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgICAgIH0KLQotICAgICAgICB3cml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgfQotCi0gICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IHBhcnNlKFhNTFN0cmVhbVJlYWRlciByZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWG1sU3RyZWFtUGFyc2VyIHBhcnNlcikKLSAgICAgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sIFhtbFBhcnNpbmdFeGNlcHRpb24gewotICAgICAgICAgLy8gd2UgZG8gbm90IGhhdmUgYXR0cmlidXRlcwotICAgICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9ICJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi9ybWkvc2FtcGxlcy90eXBlcyI7Ci0gICAgICAgICBRTmFtZSBwYXJlbnRRTmFtZSA9IHJlYWRlci5nZXROYW1lKCk7Ci0gICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgICAgd2hpbGUoIXJlYWRlci5pc1N0YXJ0RWxlbWVudCgpKXsKLSAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgICAgfQotICAgICAgICAgVGVzdENvbXBsZXhCZWFuIHRlc3RDb21wbGV4QmVhbiA9IG5ldyBUZXN0Q29tcGxleEJlYW4oKTsKLSAgICAgICAgIFRlc3RCZWFuIHRlc3RCZWFuOwotICAgICAgICAgLy8gbm93IHJlYWRlciBpcyBhdCB0aGUgYmVnaW5pbmcuCi0gICAgICAgICB3aGlsZSAoIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkgewotICAgICAgICAgICAgIHRlc3RCZWFuID0gbmV3IFRlc3RCZWFuKCk7Ci0gICAgICAgICAgICAgaWYgKHJlYWRlci5nZXROYW1lKCkuZXF1YWxzKG5ldyBRTmFtZShuYW1lc3BhY2UsICJwYXJhbTEiKSkpIHsKLSAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgdGVzdEJlYW4uc2V0UGFyYW0xKEludGVnZXIucGFyc2VJbnQocmVhZGVyLmdldFRleHQoKSkpOwotICAgICAgICAgICAgICAgICB3aGlsZSAoIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkgewotICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgIGlmIChyZWFkZXIuZ2V0TmFtZSgpLmVxdWFscyhuZXcgUU5hbWUobmFtZXNwYWNlLCAicGFyYW0yIikpKSB7Ci0gICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgIHRlc3RCZWFuLnNldFBhcmFtMihyZWFkZXIuZ2V0VGV4dCgpKTsKLSAgICAgICAgICAgICAgICAgd2hpbGUgKCFyZWFkZXIuaXNFbmRFbGVtZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICB0ZXN0Q29tcGxleEJlYW4uYWRkVGVzdEJlYW4odGVzdEJlYW4pOwotICAgICAgICAgfQotICAgICAgICAgcmV0dXJuIHRlc3RDb21wbGV4QmVhbjsKLSAgICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkVGVzdEJlYW4oVGVzdEJlYW4gdGVzdEJlYW4pewotICAgICAgICB0aGlzLnRlc3RCZWFucy5hZGQodGVzdEJlYW4pOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0IGdldFRlc3RCZWFucygpIHsKLSAgICAgICAgcmV0dXJuIHRlc3RCZWFuczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRUZXN0QmVhbnMoTGlzdCB0ZXN0QmVhbnMpIHsKLSAgICAgICAgdGhpcy50ZXN0QmVhbnMgPSB0ZXN0QmVhbnM7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2FkdmFuY2VkLXJtaS9zcmMvc2FtcGxlL3JtaS9zZXJ2ZXIvZHRvL1Rlc3RSZXN0cmljdGlvbkJlYW4uamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvYWR2YW5jZWQtcm1pL3NyYy9zYW1wbGUvcm1pL3NlcnZlci9kdG8vVGVzdFJlc3RyaWN0aW9uQmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjYwODJiLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvYWR2YW5jZWQtcm1pL3NyYy9zYW1wbGUvcm1pL3NlcnZlci9kdG8vVGVzdFJlc3RyaWN0aW9uQmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugc2FtcGxlLnJtaS5zZXJ2ZXIuZHRvOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZGF0YWJpbmQuQWJzdHJhY3RSTUlCZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmRhdGFiaW5kLkphdmFPYmplY3RTZXJpYWxpemVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmRhdGFiaW5kLlhtbFN0cmVhbVBhcnNlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5leGNlcHRpb24uWG1sUGFyc2luZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5leGNlcHRpb24uWG1sU2VyaWFsaXppbmdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkudXRpbC5OYW1lc3BhY2VQcmVmaXg7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyOwotCi1pbXBvcnQgc2FtcGxlLnJtaS5zZXJ2ZXIudHlwZS5UZXN0UmVzdHJpY3Rpb25UeXBlOwotCi0KLXB1YmxpYyBjbGFzcyBUZXN0UmVzdHJpY3Rpb25CZWFuIGV4dGVuZHMgQWJzdHJhY3RSTUlCZWFuIHsKLSAgICAKLSAgICBwcml2YXRlIFN0cmluZyBwYXJhbTE7Ci0KLSAgICBwdWJsaWMgVGVzdFJlc3RyaWN0aW9uQmVhbihTdHJpbmcgcGFyYW0xKSB7Ci0gICAgICAgIHRoaXMucGFyYW0xID0gcGFyYW0xOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBKYXZhT2JqZWN0U2VyaWFsaXplciBzZXJpYWxpemVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBRTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZXNwYWNlUHJlZml4IG5hbWVzcGFjZVByZWZpeCkKLSAgICAgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sIFhtbFNlcmlhbGl6aW5nRXhjZXB0aW9uIHsKLSAgICAgICAgd3JpdGVTdGFydEVsZW1lbnQod3JpdGVyLCBwYXJlbnRRTmFtZS5nZXROYW1lc3BhY2VVUkkoKSwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCksIG5hbWVzcGFjZVByZWZpeCk7Ci0gICAgICAgIHdyaXRlci53cml0ZUNoYXJhY3RlcnMocGFyYW0xKTsKLSAgICAgICAgd3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQ2xhc3MgZ2V0QmVhbkNsYXNzKCl7Ci0gICAgICAgIHJldHVybiBUZXN0UmVzdHJpY3Rpb25UeXBlLmNsYXNzOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IHBhcnNlKFhNTFN0cmVhbVJlYWRlciByZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWG1sU3RyZWFtUGFyc2VyIHBhcnNlcikKLSAgICAgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sIFhtbFBhcnNpbmdFeGNlcHRpb24gewotCi0gICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICBUZXN0UmVzdHJpY3Rpb25CZWFuIHRlc3RSZXN0cmljdGlvbkJlYW4gPSBuZXcgVGVzdFJlc3RyaWN0aW9uQmVhbihyZWFkZXIuZ2V0VGV4dCgpKTsKLSAgICAgICB3aGlsZSAocmVhZGVyLmlzRW5kRWxlbWVudCgpKXsKLSAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICB9Ci0gICAgICAgcmV0dXJuIHRlc3RSZXN0cmljdGlvbkJlYW47Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhcmFtMSgpIHsKLSAgICAgICAgcmV0dXJuIHBhcmFtMTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJhbTEoU3RyaW5nIHBhcmFtMSkgewotICAgICAgICB0aGlzLnBhcmFtMSA9IHBhcmFtMTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2FkdmFuY2VkLXJtaS9zcmMvc2FtcGxlL3JtaS9zZXJ2ZXIvdHlwZS9UZXN0Q29tcGxleFR5cGUuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvYWR2YW5jZWQtcm1pL3NyYy9zYW1wbGUvcm1pL3NlcnZlci90eXBlL1Rlc3RDb21wbGV4VHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmE3ZGNlLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvYWR2YW5jZWQtcm1pL3NyYy9zYW1wbGUvcm1pL3NlcnZlci90eXBlL1Rlc3RDb21wbGV4VHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugc2FtcGxlLnJtaS5zZXJ2ZXIudHlwZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLm1ldGFkYXRhLkFic3RyYWN0VHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5Db25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZXhjZXB0aW9uLk1ldGFEYXRhUG9wdWxhdGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZXhjZXB0aW9uLlNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgc2FtcGxlLnJtaS5zZXJ2ZXIuZHRvLlRlc3RDb21wbGV4QmVhbjsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLQotcHVibGljIGNsYXNzIFRlc3RDb21wbGV4VHlwZSBleHRlbmRzIEFic3RyYWN0VHlwZSB7Ci0KLSAgICBwdWJsaWMgdm9pZCBwb3B1bGF0ZU1ldGFEYXRhKENvbmZpZ3VyYXRvciBjb25maWd1cmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXAgcHJvY2Vzc2VkVHlwZU1hcCkKLSAgICAgICAgICAgIHRocm93cyBNZXRhRGF0YVBvcHVsYXRlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5qYXZhQ2xhc3MgPSBUZXN0Q29tcGxleEJlYW4uY2xhc3M7Ci0gICAgICAgIHRoaXMubmFtZSA9ICJzZXF1ZW5jZU1heE9jY3Jlc1R5cGUiOwotICAgICAgICB0aGlzLm5hbWVzcGFjZSA9ICJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi9ybWkvc2FtcGxlcy90eXBlcyI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZ2VuZXJhdGVTY2hlbWEoQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXAgc2NoZW1hTWFwKQotICAgICAgICAgICAgdGhyb3dzIFNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb24gewotICAgICAgICB0aGlzLmlzU2NoZW1hR2VuZXJhdGVkID0gdHJ1ZTsKLSAgICAgICAgdGhpcy54bWxUeXBlID0gbmV3IFRlc3RDb21wbGV4WG1sVHlwZSgpOwotICAgICAgICB0aGlzLnhtbFR5cGUuc2V0UW5hbWUobmV3IFFOYW1lKHRoaXMubmFtZXNwYWNlLHRoaXMubmFtZSkpOwotICAgICAgICByZWdpc3RlclhtbFR5cGUoc2NoZW1hTWFwKTsKLQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvYWR2YW5jZWQtcm1pL3NyYy9zYW1wbGUvcm1pL3NlcnZlci90eXBlL1Rlc3RDb21wbGV4WG1sVHlwZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9hZHZhbmNlZC1ybWkvc3JjL3NhbXBsZS9ybWkvc2VydmVyL3R5cGUvVGVzdENvbXBsZXhYbWxUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1OWIwYWMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9hZHZhbmNlZC1ybWkvc3JjL3NhbXBsZS9ybWkvc2VydmVyL3R5cGUvVGVzdENvbXBsZXhYbWxUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBzYW1wbGUucm1pLnNlcnZlci50eXBlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEueG1sLkFic3RyYWN0WG1sVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS54bWwuWG1sRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS54bWwuWG1sQXR0cmlidXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmV4Y2VwdGlvbi5TY2hlbWFHZW5lcmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLnV0aWwuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotCi1wdWJsaWMgY2xhc3MgVGVzdENvbXBsZXhYbWxUeXBlIGV4dGVuZHMgQWJzdHJhY3RYbWxUeXBlIHsKLQotICAgIHB1YmxpYyB2b2lkIGdlbmVyYXRlV1NETFNjaGVtYShEb2N1bWVudCBkb2N1bWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwIG5hbWVzcGFjZXNUb1ByZWZpeE1hcCkKLSAgICAgICAgICAgIHRocm93cyBTY2hlbWFHZW5lcmF0aW9uRXhjZXB0aW9uIHsKLQotICAgICAgICBTdHJpbmcgeHNkUHJlZml4ID0gKFN0cmluZykgbmFtZXNwYWNlc1RvUHJlZml4TWFwLmdldChDb25zdGFudHMuVVJJXzIwMDFfU0NIRU1BX1hTRCk7Ci0gICAgICAgIHRoaXMudHlwZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoQ29uc3RhbnRzLlVSSV8yMDAxX1NDSEVNQV9YU0QsICJjb21wbGV4VHlwZSIpOwotICAgICAgICB0aGlzLnR5cGVFbGVtZW50LnNldFByZWZpeCh4c2RQcmVmaXgpOwotICAgICAgICAgICAgdGhpcy50eXBlRWxlbWVudC5zZXRBdHRyaWJ1dGUoIm5hbWUiLCB0aGlzLnFuYW1lLmdldExvY2FsUGFydCgpKTsKLQotICAgICAgICBFbGVtZW50IHNlcXVlbmNlRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhDb25zdGFudHMuVVJJXzIwMDFfU0NIRU1BX1hTRCwgInNlcXVlbmNlIik7Ci0gICAgICAgIHNlcXVlbmNlRWxlbWVudC5zZXRQcmVmaXgoeHNkUHJlZml4KTsKLSAgICAgICAgc2VxdWVuY2VFbGVtZW50LnNldEF0dHJpYnV0ZSgibWluT2NjdXJzIiwiMCIpOwotICAgICAgICBzZXF1ZW5jZUVsZW1lbnQuc2V0QXR0cmlidXRlKCJtYXhPY2N1cnMiLCJ1bmJvdW5kZWQiKTsKLQotICAgICAgICB0aGlzLnR5cGVFbGVtZW50LmFwcGVuZENoaWxkKHNlcXVlbmNlRWxlbWVudCk7Ci0gICAgICAgIC8vIGFkZGluZyB0d28gZWxlbWVudHMKLSAgICAgICAgRWxlbWVudCBwYXJhbTEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoQ29uc3RhbnRzLlVSSV8yMDAxX1NDSEVNQV9YU0QsImVsZW1lbnQiKTsKLSAgICAgICAgcGFyYW0xLnNldEF0dHJpYnV0ZSgibmFtZSIsInBhcmFtMSIpOwotICAgICAgICBwYXJhbTEuc2V0QXR0cmlidXRlKCJ0eXBlIiwgeHNkUHJlZml4ICsgIjppbnQiKTsKLSAgICAgICAgc2VxdWVuY2VFbGVtZW50LmFwcGVuZENoaWxkKHBhcmFtMSk7Ci0KLSAgICAgICAgRWxlbWVudCBwYXJhbTIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoQ29uc3RhbnRzLlVSSV8yMDAxX1NDSEVNQV9YU0QsImVsZW1lbnQiKTsKLSAgICAgICAgcGFyYW0yLnNldEF0dHJpYnV0ZSgibmFtZSIsInBhcmFtMiIpOwotICAgICAgICBwYXJhbTIuc2V0QXR0cmlidXRlKCJ0eXBlIiwgeHNkUHJlZml4ICsgIjpzdHJpbmciKTsKLSAgICAgICAgc2VxdWVuY2VFbGVtZW50LmFwcGVuZENoaWxkKHBhcmFtMik7Ci0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2FkdmFuY2VkLXJtaS9zcmMvc2FtcGxlL3JtaS9zZXJ2ZXIvdHlwZS9UZXN0UmVzdHJpY3Rpb25UeXBlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2FkdmFuY2VkLXJtaS9zcmMvc2FtcGxlL3JtaS9zZXJ2ZXIvdHlwZS9UZXN0UmVzdHJpY3Rpb25UeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3MTJiNmQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9hZHZhbmNlZC1ybWkvc3JjL3NhbXBsZS9ybWkvc2VydmVyL3R5cGUvVGVzdFJlc3RyaWN0aW9uVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugc2FtcGxlLnJtaS5zZXJ2ZXIudHlwZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLm1ldGFkYXRhLkFic3RyYWN0VHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5Db25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZXhjZXB0aW9uLlNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZXhjZXB0aW9uLk1ldGFEYXRhUG9wdWxhdGVFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgc2FtcGxlLnJtaS5zZXJ2ZXIuZHRvLlRlc3RSZXN0cmljdGlvbkJlYW47Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi0KLXB1YmxpYyBjbGFzcyBUZXN0UmVzdHJpY3Rpb25UeXBlIGV4dGVuZHMgQWJzdHJhY3RUeXBlIHsKLQotICAgIHB1YmxpYyB2b2lkIHBvcHVsYXRlTWV0YURhdGEoQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcCBwcm9jZXNzZWRUeXBlTWFwKQotICAgICAgICAgICAgdGhyb3dzIE1ldGFEYXRhUG9wdWxhdGVFeGNlcHRpb24gewotICAgICAgICB0aGlzLmphdmFDbGFzcyA9IFRlc3RSZXN0cmljdGlvbkJlYW4uY2xhc3M7Ci0gICAgICAgIHRoaXMubmFtZSA9ICJzaW1wbGVSZXN0cmljdGlvbiI7Ci0gICAgICAgIHRoaXMubmFtZXNwYWNlID0gImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL3JtaS9zYW1wbGUvdHlwZSI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZ2VuZXJhdGVTY2hlbWEoQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXAgc2NoZW1hTWFwKQotICAgICAgICAgICAgdGhyb3dzIFNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb24gewotICAgICAgICB0aGlzLmlzU2NoZW1hR2VuZXJhdGVkID0gdHJ1ZTsKLSAgICAgICAgdGhpcy54bWxUeXBlID0gbmV3IFRlc3RSZXN0cmljdGlvblhtbFR5cGUoKTsKLSAgICAgICAgdGhpcy54bWxUeXBlLnNldFFuYW1lKG5ldyBRTmFtZSh0aGlzLm5hbWVzcGFjZSx0aGlzLm5hbWUpKTsKLSAgICAgICAgcmVnaXN0ZXJYbWxUeXBlKHNjaGVtYU1hcCk7Ci0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2FkdmFuY2VkLXJtaS9zcmMvc2FtcGxlL3JtaS9zZXJ2ZXIvdHlwZS9UZXN0UmVzdHJpY3Rpb25YbWxUeXBlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2FkdmFuY2VkLXJtaS9zcmMvc2FtcGxlL3JtaS9zZXJ2ZXIvdHlwZS9UZXN0UmVzdHJpY3Rpb25YbWxUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5YWNmM2YuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9hZHZhbmNlZC1ybWkvc3JjL3NhbXBsZS9ybWkvc2VydmVyL3R5cGUvVGVzdFJlc3RyaWN0aW9uWG1sVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugc2FtcGxlLnJtaS5zZXJ2ZXIudHlwZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLm1ldGFkYXRhLnhtbC5BYnN0cmFjdFhtbFR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZXhjZXB0aW9uLlNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkudXRpbC5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLQotcHVibGljIGNsYXNzIFRlc3RSZXN0cmljdGlvblhtbFR5cGUgZXh0ZW5kcyBBYnN0cmFjdFhtbFR5cGUgewotICAgIHB1YmxpYyB2b2lkIGdlbmVyYXRlV1NETFNjaGVtYShEb2N1bWVudCBkb2N1bWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwIG5hbWVzcGFjZXNUb1ByZWZpeE1hcCkKLSAgICAgICAgICAgIHRocm93cyBTY2hlbWFHZW5lcmF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgIC8vIGdlbmVyYXRlIHRoZSBzaW1wbGUgdHlwZSBFbGVtZW50IGhlcmUKLSAgICAgICAgU3RyaW5nIHhzZFByZWZpeCA9IChTdHJpbmcpIG5hbWVzcGFjZXNUb1ByZWZpeE1hcC5nZXQoQ29uc3RhbnRzLlVSSV8yMDAxX1NDSEVNQV9YU0QpOwotICAgICAgICB0aGlzLnR5cGVFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKENvbnN0YW50cy5VUklfMjAwMV9TQ0hFTUFfWFNELCAic2ltcGxlVHlwZSIpOwotICAgICAgICB0aGlzLnR5cGVFbGVtZW50LnNldFByZWZpeCh4c2RQcmVmaXgpOwotICAgICAgICB0aGlzLnR5cGVFbGVtZW50LnNldEF0dHJpYnV0ZSgibmFtZSIsIHRoaXMucW5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotCi0gICAgICAgIEVsZW1lbnQgcmVzdHJpY3Rpb25FbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKENvbnN0YW50cy5VUklfMjAwMV9TQ0hFTUFfWFNELCAicmVzdHJpY3Rpb24iKTsKLSAgICAgICAgcmVzdHJpY3Rpb25FbGVtZW50LnNldFByZWZpeCh4c2RQcmVmaXgpOwotICAgICAgICByZXN0cmljdGlvbkVsZW1lbnQuc2V0QXR0cmlidXRlKCJiYXNlIiwgeHNkUHJlZml4ICsgIjpzdHJpbmciKTsKLSAgICAgICAgdGhpcy50eXBlRWxlbWVudC5hcHBlbmRDaGlsZChyZXN0cmljdGlvbkVsZW1lbnQpOwotCi0gICAgICAgIEVsZW1lbnQgZW51bWVyYXRpb25FbGVtZW50ID0gbnVsbDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCA1OyBpKyspIHsKLSAgICAgICAgICAgIGVudW1lcmF0aW9uRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhDb25zdGFudHMuVVJJXzIwMDFfU0NIRU1BX1hTRCwgImVudW1lcmF0aW9uIik7Ci0gICAgICAgICAgICBlbnVtZXJhdGlvbkVsZW1lbnQuc2V0UHJlZml4KHhzZFByZWZpeCk7Ci0gICAgICAgICAgICBlbnVtZXJhdGlvbkVsZW1lbnQuc2V0QXR0cmlidXRlKCJ2YWx1ZSIsICJ0ZXN0VmFsdWUiICsgaSk7Ci0gICAgICAgICAgICByZXN0cmljdGlvbkVsZW1lbnQuYXBwZW5kQ2hpbGQoZW51bWVyYXRpb25FbGVtZW50KTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvYm9vay9SRUFETUUgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2Jvb2svUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTMyMjQ3Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvYm9vay9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLVRoaXMgZXhhbXBsZSBzaG93cyBob3cgdG8gdXNlIEF4aXMyIGluIGEgc2VydmxldCBjb250YWluZXIuIFlvdSBtdXN0IA0KLWhhdmUgTWF2ZW4gMi54IGluc3RhbGxlZCB0byBidWlsZCB0aGlzIGV4YW1wbGUuICBUbyBidWlsZCB0eXBlOg0KLQ0KLSQgbXZuIGluc3RhbGwgd2FyOndhcg0KLQ0KLVJlbmFtZSB0aGUgcmVzdWx0YW50IHdhciBhcyB5b3VyX3dlYl9hcHAud2FyIGFuZCBkcm9wIGl0IGludG8gYW55IHNlcnZsZXQgZW5naW5lLiANCi1UaGUgV1NETCBmaWxlIGZvciB0aGUgc2VydmljZSBzaG91bGQgYmUgdmlld2FibGUgYXQ6DQotDQotaHR0cDovL3lvdXJob3N0OnBvcnQveW91cl93ZWJfYXBwL3NlcnZpY2VzL0Jvb2tTZXJ2aWNlP3dzZGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2Jvb2svcG9tLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvYm9vay9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWU1MTY3Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvYm9vay9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIKLSAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMi5leGFtcGxlczwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5heGlzMi1ib29rPC9hcnRpZmFjdElkPgotICAgIDxuYW1lPkJvb2sgRXhhbXBsZTwvbmFtZT4KLSAgICA8dmVyc2lvbj4xLjE8L3ZlcnNpb24+Ci0gICAgPGluY2VwdGlvblllYXI+MjAwNDwvaW5jZXB0aW9uWWVhcj4KLQotICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguc2VydmxldDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnNlcnZsZXQtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+Mi4zPC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1rZXJuZWw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjUuMTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1jb2RlZ2VuPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MS41LjE8L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItYWRiPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MS41LjE8L3ZlcnNpb24+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+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjUuMTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi10cmFuc3BvcnQtbG9jYWw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjUuMTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgIDwvZGVwZW5kZW5jaWVzPgotCi0gICAgPGJ1aWxkPgotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXdhci1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx3YXJTb3VyY2VEaXJlY3Rvcnk+JHtiYXNlZGlyfS9zcmMvd2ViYXBwPC93YXJTb3VyY2VEaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgIDwvcGx1Z2lucz4KLSAgICAgICAgPHNvdXJjZURpcmVjdG9yeT5zcmMvbWFpbjwvc291cmNlRGlyZWN0b3J5PgotICAgICAgICA8dGVzdFNvdXJjZURpcmVjdG9yeT5zcmMvdGVzdDwvdGVzdFNvdXJjZURpcmVjdG9yeT4KLSAgICAgICAgPHJlc291cmNlcz4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qLnhtbDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgPC9yZXNvdXJjZXM+Ci0gICAgICAgIDx0ZXN0UmVzb3VyY2VzPgotICAgICAgICAgICAgPHRlc3RSZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy90ZXN0PC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qLnhtbDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKi5wcm9wZXJ0aWVzPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qLndzZGw8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgIDwvdGVzdFJlc291cmNlPgotICAgICAgICA8L3Rlc3RSZXNvdXJjZXM+Ci0gICAgPC9idWlsZD4KLQotICAgIDwhLS0gIG5lZWRlZCBmb3IgWG1sU2NoZW1hIC0tPgotICAgIDxyZXBvc2l0b3JpZXM+Ci0gICAgICAgIDxyZXBvc2l0b3J5PgotICAgICAgICAgICAgPGlkPmliaWJsaW88L2lkPgotICAgICAgICAgICAgPG5hbWU+aWJpYmxpbyBtYXZlbiByZXBvc2l0b3J5PC9uYW1lPgotICAgICAgICAgICAgPHVybD5odHRwOi8vaWJpYmxpby5vcmcvbWF2ZW4vPC91cmw+Ci0gICAgICAgICAgICA8bGF5b3V0PmxlZ2FjeTwvbGF5b3V0PgotICAgICAgICA8L3JlcG9zaXRvcnk+Ci0gICAgICAgIDxyZXBvc2l0b3J5PgotICAgICAgICAgICAgPGlkPmFwYWNoZTwvaWQ+Ci0gICAgICAgICAgICA8bmFtZT5BcGFjaGUgbWF2ZW4gcmVwb3NpdG9yeTwvbmFtZT4KLSAgICAgICAgICAgIDx1cmw+aHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvamF2YS1yZXBvc2l0b3J5LzwvdXJsPgotICAgICAgICAgICAgPGxheW91dD5sZWdhY3k8L2xheW91dD4KLSAgICAgICAgPC9yZXBvc2l0b3J5PgotICAgIDwvcmVwb3NpdG9yaWVzPgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2Jvb2svc3JjL21haW4vbG9nNGoucHJvcGVydGllcyBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvYm9vay9zcmMvbWFpbi9sb2c0ai5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTc1N2U0Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvYm9vay9zcmMvbWFpbi9sb2c0ai5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotIw0KLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0jDQotDQotIyBTZXQgcm9vdCBjYXRlZ29yeSBwcmlvcml0eSB0byBJTkZPIGFuZCBpdHMgb25seSBhcHBlbmRlciB0byBDT05TT0xFLg0KLWxvZzRqLnJvb3RDYXRlZ29yeT1JTkZPLCBDT05TT0xFDQotI2xvZzRqLnJvb3RDYXRlZ29yeT1JTkZPLCBDT05TT0xFLCBMT0dGSUxFDQotDQotIyBTZXQgdGhlIGVudGVycHJpc2UgbG9nZ2VyIHByaW9yaXR5IHRvIEZBVEFMDQotbG9nNGoubG9nZ2VyLm9yZy5hcGFjaGUuYXhpczIuZW50ZXJwcmlzZT1GQVRBTA0KLWxvZzRqLmxvZ2dlci5kZS5odW5zaWNrZXIuamFsb3B5LmlvPUZBVEFMDQotbG9nNGoubG9nZ2VyLmh0dHBjbGllbnQud2lyZS5oZWFkZXI9RkFUQUwNCi1sb2c0ai5sb2dnZXIub3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQ9RkFUQUwNCi0NCi0jIENPTlNPTEUgaXMgc2V0IHRvIGJlIGEgQ29uc29sZUFwcGVuZGVyIHVzaW5nIGEgUGF0dGVybkxheW91dC4NCi1sb2c0ai5hcHBlbmRlci5DT05TT0xFPW9yZy5hcGFjaGUubG9nNGouQ29uc29sZUFwcGVuZGVyDQotbG9nNGouYXBwZW5kZXIuQ09OU09MRS5sYXlvdXQ9b3JnLmFwYWNoZS5sb2c0ai5QYXR0ZXJuTGF5b3V0DQotbG9nNGouYXBwZW5kZXIuQ09OU09MRS5sYXlvdXQuQ29udmVyc2lvblBhdHRlcm49JWQgJS01cCAlYyAtICVtJW4NCi0NCi0jIExPR0ZJTEUgaXMgc2V0IHRvIGJlIGEgRmlsZSBhcHBlbmRlciB1c2luZyBhIFBhdHRlcm5MYXlvdXQuDQotbG9nNGouYXBwZW5kZXIuTE9HRklMRT1vcmcuYXBhY2hlLmxvZzRqLkZpbGVBcHBlbmRlcg0KLWxvZzRqLmFwcGVuZGVyLkxPR0ZJTEUuRmlsZT1heGlzMi5sb2cNCi1sb2c0ai5hcHBlbmRlci5MT0dGSUxFLkFwcGVuZD10cnVlDQotbG9nNGouYXBwZW5kZXIuTE9HRklMRS5sYXlvdXQ9b3JnLmFwYWNoZS5sb2c0ai5QYXR0ZXJuTGF5b3V0DQotbG9nNGouYXBwZW5kZXIuTE9HRklMRS5sYXlvdXQuQ29udmVyc2lvblBhdHRlcm49JWQgWyV0XSAlLTVwICVjICV4IC0gJW0lbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvYm9vay9zcmMvbWFpbi9zYW1wbGVzL2RlbW8vQm9vay5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9ib29rL3NyYy9tYWluL3NhbXBsZXMvZGVtby9Cb29rLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0NDk0NTQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9ib29rL3NyYy9tYWluL3NhbXBsZXMvZGVtby9Cb29rLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBzYW1wbGVzLmRlbW87DQotDQotcHVibGljIGNsYXNzIEJvb2sgew0KLSAgICBwcml2YXRlIFN0cmluZyB0aXRsZTsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgaXNibjsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgYXV0aG9yOw0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldElzYm4oKSB7DQotICAgICAgICByZXR1cm4gaXNibjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRJc2JuKFN0cmluZyBpc2JuKSB7DQotICAgICAgICB0aGlzLmlzYm4gPSBpc2JuOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGl0bGUoKSB7DQotICAgICAgICByZXR1cm4gdGl0bGU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0VGl0bGUoU3RyaW5nIHRpdGxlKSB7DQotICAgICAgICB0aGlzLnRpdGxlID0gdGl0bGU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRBdXRob3IoKSB7DQotICAgICAgICByZXR1cm4gYXV0aG9yOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldEF1dGhvcihTdHJpbmcgYXV0aG9yKSB7DQotICAgICAgICB0aGlzLmF1dGhvciA9IGF1dGhvcjsNCi0gICAgfQ0KLX0NCi0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2Jvb2svc3JjL21haW4vc2FtcGxlcy9kZW1vL0Jvb2tTZXJ2aWNlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2Jvb2svc3JjL21haW4vc2FtcGxlcy9kZW1vL0Jvb2tTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3YTY1NTIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9ib29rL3NyYy9tYWluL3NhbXBsZXMvZGVtby9Cb29rU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugc2FtcGxlcy5kZW1vOw0KLQ0KLXB1YmxpYyBjbGFzcyBCb29rU2VydmljZSB7DQotICAgIHByaXZhdGUgQm9vayBvbmx5Qm9vazsNCi0NCi0gICAgcHVibGljIEJvb2tTZXJ2aWNlKCkgew0KLSAgICAgICAgb25seUJvb2sgPSBuZXcgQm9vaygpOw0KLSAgICAgICAgb25seUJvb2suc2V0QXV0aG9yKCJHbGVuIERhbmllbHMiKTsNCi0gICAgICAgIG9ubHlCb29rLnNldFRpdGxlKCJVc2luZyBBeGlzMiIpOw0KLSAgICAgICAgb25seUJvb2suc2V0SXNibigiMDEyMzQ1Njc4OSIpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBCb29rW10gZ2V0Qm9va3MoKSB7DQotICAgICAgICByZXR1cm4gbmV3IEJvb2tbXXtvbmx5Qm9va307DQotICAgIH0NCi0NCi0gICAgcHVibGljIEJvb2sgZmluZEJvb2soU3RyaW5nIGlzYm4pIHsNCi0gICAgICAgIGlmIChpc2JuLmVxdWFscyhvbmx5Qm9vay5nZXRJc2JuKCkpKQ0KLSAgICAgICAgICAgIHJldHVybiBvbmx5Qm9vazsNCi0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvYm9vay9zcmMvd2ViYXBwL1dFQi1JTkYvc2VydmljZXMvQm9va1NlcnZpY2UvTUVUQS1JTkYvc2VydmljZXMueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9ib29rL3NyYy93ZWJhcHAvV0VCLUlORi9zZXJ2aWNlcy9Cb29rU2VydmljZS9NRVRBLUlORi9zZXJ2aWNlcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwNmFlOGMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9ib29rL3NyYy93ZWJhcHAvV0VCLUlORi9zZXJ2aWNlcy9Cb29rU2VydmljZS9NRVRBLUlORi9zZXJ2aWNlcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08c2VydmljZUdyb3VwPg0KLQk8c2VydmljZSBuYW1lPSJCb29rU2VydmljZSINCi0gICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi9zYW1wbGVzL2Jvb2svIj4NCi0JCTxkZXNjcmlwdGlvbj4NCi0JCQlCb29rIHNhbXBsZSBzZXJ2aWNlDQotCQk8L2Rlc2NyaXB0aW9uPg0KLSAgICAgICAgPHNjaGVtYSBzY2hlbWFOYW1lc3BhY2U9Imh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL3NhbXBsZXMvYm9vay94c2QvIi8+DQotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9IlNlcnZpY2VDbGFzcyIgbG9ja2VkPSJmYWxzZSI+c2FtcGxlcy5kZW1vLkJvb2tTZXJ2aWNlPC9wYXJhbWV0ZXI+DQotCQk8b3BlcmF0aW9uIG5hbWU9ImdldEJvb2tzIj4NCi0JCQk8bWVzc2FnZVJlY2VpdmVyIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJwYy5yZWNlaXZlcnMuUlBDTWVzc2FnZVJlY2VpdmVyIi8+DQotCQk8L29wZXJhdGlvbj4NCi0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iZmluZEJvb2siPg0KLSAgICAgICAgICAgIDxtZXNzYWdlUmVjZWl2ZXIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIucnBjLnJlY2VpdmVycy5SUENNZXNzYWdlUmVjZWl2ZXIiLz4NCi0gICAgICAgIDwvb3BlcmF0aW9uPg0KLQk8L3NlcnZpY2U+DQotPC9zZXJ2aWNlR3JvdXA+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9ib29rL3NyYy93ZWJhcHAvV0VCLUlORi93ZWIueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9ib29rL3NyYy93ZWJhcHAvV0VCLUlORi93ZWIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMmVhMzIzLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvYm9vay9zcmMvd2ViYXBwL1dFQi1JTkYvd2ViLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPz4NCi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08IURPQ1RZUEUgd2ViLWFwcA0KLSAgICBQVUJMSUMgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBXZWIgQXBwbGljYXRpb24gMi4zLy9FTiINCi0gICAgImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL3dlYi1hcHBfMl8zLmR0ZCI+DQotICAgIA0KLTx3ZWItYXBwPg0KLQ0KLSAgICA8c2VydmxldD4NCi0gICAgICAgIDxzZXJ2bGV0LW5hbWU+QXhpc1NlcnZsZXQ8L3NlcnZsZXQtbmFtZT4NCi0gICAgICAgIDxkaXNwbGF5LW5hbWU+QXBhY2hlLUF4aXMgU2VydmxldDwvZGlzcGxheS1uYW1lPg0KLSAgICAgICAgPHNlcnZsZXQtY2xhc3M+DQotICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5BeGlzU2VydmxldDwvc2VydmxldC1jbGFzcz4NCi0gICAgICAgIDxsb2FkLW9uLXN0YXJ0dXA+MTwvbG9hZC1vbi1zdGFydHVwPg0KLSAgICA8L3NlcnZsZXQ+DQotDQotICA8c2VydmxldC1tYXBwaW5nPg0KLSAgICA8c2VydmxldC1uYW1lPkF4aXNTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+DQotICAgIDx1cmwtcGF0dGVybj4vc2VydmljZXMvKjwvdXJsLXBhdHRlcm4+DQotICA8L3NlcnZsZXQtbWFwcGluZz4NCi08L3dlYi1hcHA+DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9idWlsZC54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2J1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQzMjk3YS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+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+Ci0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvY29uZi9zZXJ2aWNlNHdpdGhoYW5kbGVyLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvY29uZi9zZXJ2aWNlNHdpdGhoYW5kbGVyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI5NTdmNy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2NvbmYvc2VydmljZTR3aXRoaGFuZGxlci54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzZXJ2aWNlIG1lc3NhZ2VSZWNlaXZlcj0ib3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuUmF3WE1MSU5PdXRNZXNzYWdlUmVjZWl2ZXIiIHN0eWxlPSJycGMiIGNvbnRleHRQYXRoPSJzZXJ2aWNlcyI+Ci0KLSAgICA8cGFyYW1ldGVyIG5hbWU9IlNlcnZpY2VDbGFzcyI+dXNlcmd1aWRlLnNhbXBsZTEuRWNob1hNTDwvcGFyYW1ldGVyPgotICAgIDxvcGVyYXRpb24gbmFtZT0iZWNobyIgcW5hbWU9ImVjaG8iLz4KLTwvc2VydmljZT4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvY29uZi9zZXJ2aWNlcy54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2NvbmYvc2VydmljZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODk0ZmExLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvY29uZi9zZXJ2aWNlcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzZXJ2aWNlIG5hbWU9IiI+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJTZXJ2aWNlQ2xhc3MiPnVzZXJndWlkZS5zYW1wbGUxLkVjaG9YTUw8L3BhcmFtZXRlcj4KLSAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG8iIHFuYW1lPSJlY2hvIi8+Ci08L3NlcnZpY2U+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2RhdGFiaW5kaW5nL1JFQURNRS50eHQgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2RhdGFiaW5kaW5nL1JFQURNRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmNzczMTcuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9kYXRhYmluZGluZy9SRUFETUUudHh0CisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotM1NhbXBsZTogRGF0YSBCaW5kaW5nDQotPT09PT09PT09PT09PT09PT09PT0NCi0NCi1JbnRyb2R1Y3Rpb24NCi09PT09PT09PT09PT0NCi0NCi1UaGlzIHNhbXBsZSBkZW1vbnN0cmF0ZXMgaG93IHRvIHVzZSBXU0RMMkphdmEgZ2VuZXJhdGVkIGNvZGUgd2l0aCBDYXN0b3IuIA0KLQ0KLVJ1bm5pbmcgb2YgdGhpcyBzYW1wbGUgYXNzdW1lcyB0aGF0IHlvdSBhcmUgcnVubmluZyB0aGlzIHdpdGhpbiB0aGUgZXh0cmFjdGVkIHJlbGVhc2UgZm9sZGVyIChBeGlzMl9IT01FL3NhbXBsZXMvZGF0YWJpbmRpbmcpLg0KLQ0KLQ0KLVByZS1SZXF1aXNpdGVzDQotPT09PT09PT09PT09PT0NCi0gKiBJbnN0YWxsIEFwYWNoZSBBbnQgMS42LjIgb3IgbGF0ZXIuDQotICogUGxlYXNlIGNyZWF0ZSBhIGRpcmVjdG9yeSBuYW1lZCBsaWIgdW5kZXIgdGhlIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIHRoaXMgZmlsZS4NCi0gKiBEb3dubG9hZCBsYXRlc3Qgc3RheC11dGlscyBqYXIgZnJvbQ0KLSAgIGh0dHBzOi8vc3RheC11dGlscy5kZXYuamF2YS5uZXQvc2VydmxldHMvUHJvamVjdERvY3VtZW50TGlzdD9mb2xkZXJJRD0xMTA2IGFuZCBkcm9wIHRoYXQgaW50byB0aGUNCi0gICBuZXcgbGliIGRpcmVjdG9yeS4NCi0gKiBEb3dubG9hZCB2ZXJzaW9uIDEuMC40IG9mIENhc3RvciBqYXIgZnJvbSBodHRwOi8vZGlzdC5jb2RlaGF1cy5vcmcvY2FzdG9yLzEuMC40L2Nhc3Rvci0xLjAuNC5qYXIgYW5kIGRyb3AgdGhhdCBpbnRvIHRoZSBuZXcNCi0gICBsaWIgZGlyZWN0b3J5LihUaGUgbGF0ZXN0IHJlbGVhc2VzIG9mIGNhc3RvciBhcmUgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuY2FzdG9yLm9yZy9kb3dubG9hZC5odG1sLCBidXQgdGhpcyBleGFtcGxlIG1heSBub3QgcnVuIAkNCi0gICB3aXRoIHZlcnNpb25zIGxhdGVyIHRoYW4gMS4wLjQpDQotDQotWW91IGNhbiBhY2hpZXZlIGFsbCB0aHJlZSBvZiB0aGUgYWJvdmUgc3RlcHMgYnkgcnVubmluZyAiYW50IGRvd25sb2FkLmphcnMiLCBidXQgaXQgd2lsbCB0YWtlIHNvbWUgDQotdGltZSB0byBkb3dubG9hZCB0aG9zZSB0d28gamFycywgdXNpbmcgYW50Lg0KLQ0KLQ0KLURlcGxveWluZyB0aGUgU2VydmljZQ0KLT09PT09PT09PT09PT09PT09PT09PQ0KLQ0KLVlvdSBuZWVkIHRvIGNyZWF0ZSB0aGUgc3RvY2sgc2VydmljZSBXZWIgc2VydmljZSBhbmQgZGVwbG95IGl0LiBUeXBpbmcgYW50IGdlbmVyYXRlLnNlcnZpY2Ugb3IgDQotc2ltcGx5IGFudCBpbiB0aGUgY29tbWFuZCBwcm9tcHQsIHdpbGwgYnVpbGQgdGhlIHNlcnZpY2UgYWdhaW5zdCBTdG9ja1F1b3RlU2VydmljZS53c2RsIGxpc3RlZCANCi1pbnNpZGUgQXhpczJfSE9NRS9zYW1wbGVzL2RhdGFiaW5kaW5nIGFuZCBwdXQgaXQgdW5kZXIgQXhpczJfSE9NRS9yZXBvc2l0b3J5L3NlcnZpY2VzLg0KLQ0KLVlvdSBuZWVkIHRvIHRoZW4gc3RhcnR1cCB0aGUgc2VydmVyIHRvIGRlcGxveSB0aGUgc2VydmljZS4gR28gdG8gQXhpczJfSE9NRS9iaW4gZm9sZGVyIGFuZCBleGVjdXRlIGVpdGhlcg0KLWF4aXMyc2VydmVyLmJhdCAoaW4gV2luZG93cykgb3IgYXhpczJzZXJ2ZXIuc2goaW4gTGludXgpLCBkZXBlbmRpbmcgb24geW91ciBwbGF0Zm9ybS4NCi0NCi0NCi1SdW5uaW5nIHRoZSBDbGllbnQNCi09PT09PT09PT09PT09PT09PT0NCi0NCi1UeXBpbmcgdGhlIGNvbW1hbmQgImFudCBydW4uY2xpZW50IiBpbnNpZGUgQXhpczJfSE9NRS9zYW1wbGVzL2RhdGFiaW5kaW5nIHJ1bnMgdGhlIEF4aXMyX0hPTUUvc2FtcGxlcy9kYXRhYmluZGluZy9jbGllbnQvc3JjL3NhbXBsZXMvZGF0YWJpbmRpbmcvU3RvY2tDbGllbnQuamF2YSBjbGFzcy4gWW91IG1heSB1c2UNCi10aGUgY29tbWFuZCBzY3JpcHRzIChhcyBzcGVjaWZpZWQgYWJvdmUpIHRvIGRvIHNvLiBZb3UgbmVlZCB0byBzdXBwbHkgMiBwYXJhbWV0ZXJzIHRvIHRoZSBjb21tYW5kLSB1cmwgYW5kIHN5bWJvbC4NCi0NCi0gKiBhbnQgcnVuLmNsaWVudCAtRHVybD1odHRwOi8vbG9jYWxob3N0OjgwODAvYXhpczIvc2VydmljZXMvU3RvY2tRdW90ZVNlcnZpY2UgLURzeW1ib2w9SUJNDQotICAgU3VjY2VlZHMgd2l0aCBhIFByaWNlIG9mIDk5LjAuIFlvdSB3aWxsIHNlZSAiUHJpY2UgPSA5OS4wIg0KLQ0KLVdoZW4geW91IGNhbGwgYW50IHJ1bi5jbGllbnQgd2l0aCBwYXJhbWV0ZXJzLCBiZWZvcmUgcnVubmluZw0KLWNsaWVudC9zcmMvc2FtcGxlcy9kYXRhYmluZGluZy9TdG9ja0NsaWVudC5qYXZhIGNsYXNzLCBpdCBkb2VzIHRoZSBmb2xsb3dpbmcgYXMgd2VsbDoNCi0NCi0gICogR2VuZXJhdGUgdGhlIHN0dWJzIChmb3IgdGhlIGNsaWVudCkgZnJvbSB0aGUgV1NETA0KLSAgKiBDb21waWxlIHRoZSBjbGllbnQgY2xhc3Nlcw0KLSAgKiBDcmVhdGUgYSBKYXIgb2YgdGhlIGNsaWVudCBjbGFzc2VzIGFuZCBjb3B5IGl0IHRvIGJ1aWxkL2NsaWVudC9TdG9ja1NlcnZpY2UtdGVzdC1jbGllbnQuamFyDQotDQotSG93IEl0IFdvcmtzDQotPT09PT09PT09PT09PT0NCi0NCi0tIEdlbmVyYXRlIGNvZGUgZ2l2aW5nIC1kIG5vbmUgdG8gZ2V0IGFsbCB0aGUgQXhpczIgQVBJcyB3aXRoIE9NRWxlbWVudHMuDQotLSBDcmVhdGUgQ2FzdG9yIG9iamVjdHMgZm9yIHRoZSBzY2hlbWEgZ2l2ZW4gaW4gdGhlIFN0b2NrUXVvdGVTZXJ2aWNlLndzZGwuDQotLSBDbGllbnQgQVBJIGFuZCB0aGUgc2VydmljZSB1c2VzIHRob3NlIGNhc3RvciBvYmplY3RzIHRvIGdldC9zZXQgZGF0YS4NCi0tIEdldCBTdEFYIGV2ZW50cyBmcm9tIHRoZSBjYXN0b3Igb2JqZWN0cyBhbmQgY29uc3RydWN0IE9NRWxlbWVudHMgZnJvbSB0aGVtLiBUaG9zZSBTdEFYIGV2ZW50cw0KLSAgYXJlIGZlZCBpbnRvIFN0QVhPTUJ1aWxkZXIgd2hpY2ggY2FuIGNyZWF0ZSBPTSB0cmVlIGZyb20gaXQuDQotLSBGZWVkIHRob3NlIE9NRWxlbWVudCBpbiB0byBnZW5lcmF0ZWQgY29kZS4NCi0NCi1Ob3RlDQotPT09PT09PT09PT09PT0NCi1Tb21ldGltZXMsIGlmIHlvdSdyZSBoYXZpbmcgdHJvdWJsZSBydW5uaW5nIHRoZSBjbGllbnQgc3VjY2Vzc2Z1bGx5LCANCi1JdCBtYXkgYmUgbmVjZXNzYXJ5IHRvIGNsZWFuIHRoZSBzZXJ2aWNlcyByZXBvc2l0b3J5IGJlZm9yZSB5b3UgZ2VuZXJhdGUgdGhlIHNlcnZpY2UsIGRlcGxveSBpdA0KLWFuZCBydW4gdGhlIGNsaWVudC4gKGkuZS4gZGVsZXRlIHNlcnZpY2VzIGNyZWF0ZWQgZnJvbSBwcmV2aW91cyBzYW1wbGVzLikNCi0NCi1IZWxwDQotPT09PQ0KLVBsZWFzZSBjb250YWN0IGF4aXMtdXNlciBsaXN0IChheGlzLXVzZXJAd3MuYXBhY2hlLm9yZykgaWYgeW91IGhhdmUgYW55IHRyb3VibGUgcnVubmluZyB0aGUgc2FtcGxlLg0KLQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvZGF0YWJpbmRpbmcvU3RvY2tRdW90ZS54c2QgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2RhdGFiaW5kaW5nL1N0b2NrUXVvdGUueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDk2M2NkLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvZGF0YWJpbmRpbmcvU3RvY2tRdW90ZS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTx4c2Q6c2NoZW1hCi0JeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgCi0JdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vdzMuaWJtLmNvbS9zY2hlbWFzL3NlcnZpY2VzLzIwMDIvMTEvMTUvc3RvY2txdW90ZSIKLQl4bWxucz0iaHR0cDovL3czLmlibS5jb20vc2NoZW1hcy9zZXJ2aWNlcy8yMDAyLzExLzE1L3N0b2NrcXVvdGUiCi0+Ci0JCi0JPHhzZDplbGVtZW50IG5hbWU9InF1b3RlIj4KLQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9InN5bWJvbCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJ2b2x1bWUiIHR5cGU9InhzZDppbnRlZ2VyIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9Imxhc3RUcmFkZSIgdHlwZT0ibGFzdFRyYWRlVHlwZSIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJjaGFuZ2UiIHR5cGU9ImNoYW5nZVR5cGUiLz4KLQkJCTwveHNkOnNlcXVlbmNlPgotCQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8L3hzZDplbGVtZW50PgotCi0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjaGFuZ2VUeXBlIj4KLQkJPHhzZDpzZXF1ZW5jZT4KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJkb2xsYXIiIHR5cGU9InhzZDpmbG9hdCIvPgkKLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJwZXJjZW50IiB0eXBlPSJ4c2Q6ZmxvYXQiLz4KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJwb3NpdGl2ZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4JCi0JCTwveHNkOnNlcXVlbmNlPgotCTwveHNkOmNvbXBsZXhUeXBlPgotCi0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJsYXN0VHJhZGVUeXBlIj4KLQkJPHhzZDpzZXF1ZW5jZT4KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJwcmljZSIgdHlwZT0ieHNkOmZsb2F0Ii8+Ci0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iZGF0ZSIgdHlwZT0ieHNkOmxvbmciLz4KLQkJPC94c2Q6c2VxdWVuY2U+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQk8IS0tIE1ldGhvZHMgc2lnbmF0dXJlcyAtLT4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iZ2V0U3RvY2tRdW90ZSI+Ci0JCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQk8eHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJzeW1ib2wiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCTwveHNkOnNlcXVlbmNlPgkKLQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JPC94c2Q6ZWxlbWVudD4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iZ2V0U3RvY2tRdW90ZVJlc3BvbnNlIj4KLQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDplbGVtZW50IHJlZj0icXVvdGUiIC8+Ci0JCQk8L3hzZDpzZXF1ZW5jZT4JCi0JCTwveHNkOmNvbXBsZXhUeXBlPgotCTwveHNkOmVsZW1lbnQ+Ci0KLTwveHNkOnNjaGVtYT4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvZGF0YWJpbmRpbmcvU3RvY2tRdW90ZVNlcnZpY2Uud3NkbCBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvZGF0YWJpbmRpbmcvU3RvY2tRdW90ZVNlcnZpY2Uud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg0MDcyYi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2RhdGFiaW5kaW5nL1N0b2NrUXVvdGVTZXJ2aWNlLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxkZWZpbml0aW9ucyB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93My5pYm0uY29tL3NjaGVtYXMvc2VydmljZXMvMjAwMi8xMS8xNS9zdG9ja3F1b3RlL3dzZGwiCi0JeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiAKLQl4bWxuczp0bnM9Imh0dHA6Ly93My5pYm0uY29tL3NjaGVtYXMvc2VydmljZXMvMjAwMi8xMS8xNS9zdG9ja3F1b3RlL3dzZGwiIAotCXhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iIAotCXhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiAKLQl4bWxuczp0eXBlcz0iaHR0cDovL3czLmlibS5jb20vc2NoZW1hcy9zZXJ2aWNlcy8yMDAyLzExLzE1L3N0b2NrcXVvdGUiCi0JPgotCi0JPGltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly93My5pYm0uY29tL3NjaGVtYXMvc2VydmljZXMvMjAwMi8xMS8xNS9zdG9ja3F1b3RlIiBsb2NhdGlvbj0iU3RvY2tRdW90ZS54c2QiIC8+Ci0KLQk8bWVzc2FnZSBuYW1lPSJnZXRTdG9ja1F1b3RlUmVxIj4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0idHlwZXM6Z2V0U3RvY2tRdW90ZSIgLz4KLQk8L21lc3NhZ2U+Ci0KLQk8bWVzc2FnZSBuYW1lPSJnZXRTdG9ja1F1b3RlUmVzcCI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9InR5cGVzOmdldFN0b2NrUXVvdGVSZXNwb25zZSIgLz4KLQk8L21lc3NhZ2U+Ci0KLQk8cG9ydFR5cGUgbmFtZT0iU3RvY2tRdW90ZVBvcnRUeXBlIj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJnZXRTdG9ja1F1b3RlIj4KLQkJCTxpbnB1dCBtZXNzYWdlPSJ0bnM6Z2V0U3RvY2tRdW90ZVJlcSIgLz4KLQkJCTxvdXRwdXQgbWVzc2FnZT0idG5zOmdldFN0b2NrUXVvdGVSZXNwIiAvPgotCQk8L29wZXJhdGlvbj4KLQk8L3BvcnRUeXBlPgotCi0JPGJpbmRpbmcgbmFtZT0iU3RvY2tRdW90ZVNPQVBCaW5kaW5nIiB0eXBlPSJ0bnM6U3RvY2tRdW90ZVBvcnRUeXBlIj4KLQkJPHNvYXA6YmluZGluZyBzdHlsZT0iZG9jdW1lbnQiIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIiAvPgotCQk8b3BlcmF0aW9uIG5hbWU9ImdldFN0b2NrUXVvdGUiPgotCQkJPHNvYXA6b3BlcmF0aW9uIHN0eWxlPSJkb2N1bWVudCIgc29hcEFjdGlvbj0iZ2V0U3RvY2tRdW90ZSIgLz4KLQkJCTxpbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvaW5wdXQ+Ci0JCQk8b3V0cHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9vdXRwdXQ+Ci0JCTwvb3BlcmF0aW9uPgotCTwvYmluZGluZz4KLQotCTxzZXJ2aWNlIG5hbWU9IlN0b2NrUXVvdGVTZXJ2aWNlIj4KLQkJPHBvcnQgbmFtZT0iU3RvY2tRdW90ZVNPQVBQb3J0IiBiaW5kaW5nPSJ0bnM6U3RvY2tRdW90ZVNPQVBCaW5kaW5nIj4KLQkJCTxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9heGlzMi9zZXJ2aWNlcy9TdG9ja1F1b3RlU2VydmljZSIgLz4KLQkJPC9wb3J0PgotCTwvc2VydmljZT4KLQotPC9kZWZpbml0aW9ucz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2RhdGFiaW5kaW5nL2J1aWxkLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvZGF0YWJpbmRpbmcvYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjFlYzZlLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvZGF0YWJpbmRpbmcvYnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTkxICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+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+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2RhdGFiaW5kaW5nL2Nhc3RvcmJ1aWxkZXIucHJvcGVydGllcyBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvZGF0YWJpbmRpbmcvY2FzdG9yYnVpbGRlci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjA4ZjIxLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvZGF0YWJpbmRpbmcvY2FzdG9yYnVpbGRlci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotIwotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi0KLSMgSmF2YSBjbGFzcyBtYXBwaW5nIG9mIDx4c2Q6ZWxlbWVudD4ncyBhbmQgPHhzZDpjb21wbGV4VHlwZT4ncyAKLSMKLW9yZy5leG9sYWIuY2FzdG9yLmJ1aWxkZXIuamF2YWNsYXNzbWFwcGluZz1lbGVtZW50Ci0KLSMgVGhpcyBwcm9wZXJ0eSBhbGxvd3Mgb25lIHRvIHNwZWNpZnkgdGhlIHN1cGVyIGNsYXNzIG9mICphbGwqIAotIyBnZW5lcmF0ZWQgY2xhc3NlcwotIwotI29yZy5leG9sYWIuY2FzdG9yLmJ1aWxkZXIuc3VwZXJjbGFzcz1jb20ueHl6LkJhc2VPYmplY3QKLQotIyBYTUwgbmFtZXNwYWNlIG1hcHBpbmcgdG8gSmF2YSBwYWNrYWdlcwotIwotI29yZy5leG9sYWIuY2FzdG9yLmJ1aWxkZXIubnNwYWNrYWdlcz1cCi0gIGh0dHA6Ly93d3cueHl6LmNvbS9zY2hlbWFzL3Byb2plY3Q9Y29tLnh5ei5zY2hlbWFzLnByb2plY3QsXAotICBodHRwOi8vd3d3Lnh5ei5jb20vc2NoZW1hcy9wZXJzb249Y29tLnh5ei5zY2hlbWFzLnBlcnNvbgotCi0jIFNldCB0byB0cnVlIGlmIHlvdSB3YW50IHRvIGdlbmVyYXRlIHRoZSBlcXVhbHMgbWV0aG9kCi0jIGZvciBlYWNoIGdlbmVyYXRlZCBjbGFzcwotIyBmYWxzZSBieSBkZWZhdWx0Ci0jCi0jb3JnLmV4b2xhYi5jYXN0b3IuYnVpbGRlci5lcXVhbHNtZXRob2Q9dHJ1ZQotCi0jIFNldCB0byB0cnVlIGlmIHlvdSB3YW50IHRvIHVzZSBPYmplY3QgV3JhcHBlcnMgaW5zdGVhZAotIyBvZiBwcmltaXRpdmVzIChlLmcgRmxvYXQgaW5zdGVhZCBvZiBmbG9hdCkuCi0jIGZhbHNlIGJ5IGRlZmF1bHQuCi0jCi0jb3JnLmV4b2xhYi5jYXN0b3IuYnVpbGRlci5wcmltaXRpdmV0b3dyYXBwZXI9ZmFsc2UKLQotIyBTZXQgdG8gdHJ1ZSBpZiB5b3Ugd2FudCB0aGUgZ2VuZXJhdGVkIGNsYXNzIGRlc2NyaXB0b3JzIHRvCi0jIGV4cG9zZSB0aGUgZWxlbWVudCBhbmQgYXR0cmlidXRlIG5hbWVzIHRoZXkgY29udGFpbi4KLSMgZmFsc2UgYnkgZGVmYXVsdC4KLSMKLSNvcmcuZXhvbGFiLmNhc3Rvci5idWlsZGVyLmNsYXNzZGVzY2ZpZWxkbmFtZXM9ZmFsc2UKLQotIyBTZXQgdG8gdHJ1ZSBpZiB5b3Ugd2FudCB0aGUgZ2VuZXJhdGVkIHNvdXJjZSBjb2RlIHRvIGNvbnRhaW4KLSMgRXh0cmEgbWV0aG9kcyBmb3IgdGhlIGNvbGxlY3Rpb24gZmllbGRzLCBzdWNoIGFzIGdldC9zZXQgdXNpbmcKLSMgdGhlIGNvbGxlY3Rpb24gdHlwZSBpbiBhZGRpdGlvbiB0byB0aGUgdHlwZS1zYWZlIGFycmF5LgotIyBTZXQgdGhpcyB0byB0cnVlIGlmIHlvdSB3YW50IHlvdXIgY29kZSB0byBiZSBtb3JlIGNvbXBhdGlibGUgCi0jIHdpdGggQ2FzdG9yIEpETy4gVGhpcyBpcyBmYWxzZSBieSBkZWZhdWx0LgotIwotI29yZy5leG9sYWIuY2FzdG9yLmJ1aWxkZXIuZXh0cmFDb2xsZWN0aW9uTWV0aG9kcz10cnVlCi0KLSMgVXNlIG9sZC1zdHlsZSAoQ2FzdG9yIDAuOS4zLjkpIG9mIG5hbWluZyB0aGF0IHVwcGVyY2FzZXMKLSMgbmFtZXMgYWZ0ZXIgYW4gdW5kZXJzY29yZQotIwotI29yZy5leG9sYWIuY2FzdG9yLnhtbC5KYXZhTmFtaW5nLnVwcGVyQ2FzZUFmdGVyVW5kZXJzY29yZT10cnVlCi0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvZGF0YWJpbmRpbmcvY2xpZW50L2J1aWxkLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvZGF0YWJpbmRpbmcvY2xpZW50L2J1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWRlODI3Mi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2RhdGFiaW5kaW5nL2NsaWVudC9idWlsZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxwcm9qZWN0IGJhc2VkaXI9Ii4iIGRlZmF1bHQ9Imphci5jbGllbnQiPgotCi0gICAgPHByb3BlcnR5IGVudmlyb25tZW50PSJlbnYiLz4KLQotICAgIDxwcm9wZXJ0eSBuYW1lPSJwcm9qZWN0LmJhc2UuZGlyIiB2YWx1ZT0iLiIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJwYXJlbnQuZGlyIiB2YWx1ZT0iLi4iLz4KLQotICAgIDxwcm9wZXJ0eSBuYW1lPSJ3c2RsLnVyaSIgdmFsdWU9IiR7cGFyZW50LmRpcn0vYmFuay53c2RsIi8+Ci0KLSAgICA8cHJvcGVydHkgbmFtZT0ic3JjIiB2YWx1ZT0iJHtwcm9qZWN0LmJhc2UuZGlyfS9zcmMiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0idGFyZ2V0IiB2YWx1ZT0iJHtwcm9qZWN0LmJhc2UuZGlyfS90YXJnZXQiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0idGFyZ2V0LmphdmEiIHZhbHVlPSIke3RhcmdldH0vc3JjIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9InRhcmdldC5jbGFzc2VzIiB2YWx1ZT0iJHt0YXJnZXR9L2NsYXNzZXMiLz4KLQotICAgIDx0YXJnZXQgbmFtZT0iY2hlY2suZGVwZW5kZW5jeSIgdW5sZXNzPSJlbnYuQVhJUzJfSE9NRSI+Ci0gICAgICAgIDxlY2hvIG1lc3NhZ2U9IkFYSVMyX0hPTUUgbXVzdCBiZSBzZXQiLz4KLSAgICA8L3RhcmdldD4KLQotICAgIDx0YXJnZXQgbmFtZT0iZ2VuLnN0dWIiIGlmPSJlbnYuQVhJUzJfSE9NRSIgZGVwZW5kcz0iY2hlY2suZGVwZW5kZW5jeSI+Ci0gICAgICAgIDxkZWxldGUgZGlyPSIke3RhcmdldH0iLz4KLSAgICAgICAgPG1rZGlyIGRpcj0iJHt0YXJnZXR9Ii8+Ci0gICAgICAgIDxqYXZhIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5heGlzMi53c2RsLldTREwySmF2YSIgZm9yaz0idHJ1ZSI+Ci0gICAgICAgICAgICA8YXJnIGxpbmU9Ii11cmkgJHt3c2RsLnVyaX0iLz4KLSAgICAgICAgICAgIDxhcmcgbGluZT0iLXUiLz4KLSAgICAgICAgICAgIDxhcmcgbGluZT0iLW8gJHt0YXJnZXR9Ii8+Ci0gICAgICAgICAgICA8Y2xhc3NwYXRoPgotICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtlbnYuQVhJUzJfSE9NRX1cbGliIj4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKi5qYXIiLz4KLSAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICA8L2NsYXNzcGF0aD4KLSAgICAgICAgPC9qYXZhPgotICAgIDwvdGFyZ2V0PgotCi0gICAgPCEtLSBDcmVhdGUgdGhlIHNlcnZpY2UgYXJjaGl2ZSBieSBleGVjdXRpbmcgdGFyZ2V0XGJ1aWxkLnhtbCAoamFyLnNlcnZlcikgLS0+Ci0gICAgPHRhcmdldCBuYW1lPSJqYXIuY2xpZW50IiBpZj0iZW52LkFYSVMyX0hPTUUiIGRlcGVuZHM9Imdlbi5zdHViIj4KLSAgICAgICAgPGNvcHkgdG9kaXI9IiR7dGFyZ2V0LmphdmF9Ij4KLSAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtzcmN9Ii8+Ci0gICAgICAgIDwvY29weT4KLSAgICAgICAgPGFudCBkaXI9IiR7dGFyZ2V0fSIvPgotICAgICAgICA8Y29weSBmaWxlPSIke3RhcmdldH1cYnVpbGRcbGliXEJhbmtTZXJ2aWNlLXRlc3QtY2xpZW50LmphciIgdG9kaXI9Ii4uIi8+Ci0gICAgPC90YXJnZXQ+Ci0KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2RhdGFiaW5kaW5nL2NsaWVudC9zcmMvc2FtcGxlcy9kYXRhYmluZGluZy9TdG9ja0NsaWVudC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9kYXRhYmluZGluZy9jbGllbnQvc3JjL3NhbXBsZXMvZGF0YWJpbmRpbmcvU3RvY2tDbGllbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjA4OGQwOC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2RhdGFiaW5kaW5nL2NsaWVudC9zcmMvc2FtcGxlcy9kYXRhYmluZGluZy9TdG9ja0NsaWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugc2FtcGxlcy5kYXRhYmluZGluZzsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuYnVpbGRlci5TQVhPTUJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmV4b2xhYi5jYXN0b3IueG1sLk1hcnNoYWxsZXI7Ci1pbXBvcnQgb3JnLmV4b2xhYi5jYXN0b3IueG1sLlVubWFyc2hhbEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmV4b2xhYi5jYXN0b3IueG1sLlVubWFyc2hhbGxlcjsKLWltcG9ydCBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlcjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci1pbXBvcnQgc2FtcGxlcy5kYXRhYmluZGluZy5kYXRhLkdldFN0b2NrUXVvdGU7Ci1pbXBvcnQgc2FtcGxlcy5kYXRhYmluZGluZy5kYXRhLkdldFN0b2NrUXVvdGVSZXNwb25zZTsKLQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zYXguU0FYUmVzdWx0OwotCi1pbXBvcnQgamF2YW5ldC5zdGF4dXRpbHMuU3RBWFNvdXJjZTsKLXB1YmxpYyBmaW5hbCBjbGFzcyBTdG9ja0NsaWVudCB7Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChhcmdzLmxlbmd0aCAhPSAyKSB7Ci0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlVzYWdlOiBTdG9ja0NsaWVudCA8dXJsPiA8c3ltYm9sPiIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIFN0cmluZyB1cmwgPSBhcmdzWzBdOwotICAgICAgICBmaW5hbCBTdHJpbmcgc3ltYm9sID0gYXJnc1sxXTsKLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJHZXR0aW5nIFN0b2NrIFF1b3RlIGZvciAiICsgc3ltYm9sKTsKLQotICAgICAgICBTdG9ja1F1b3RlU2VydmljZVN0dWIgc3R1YiA9Ci0gICAgICAgICAgICAgICAgbmV3IFN0b2NrUXVvdGVTZXJ2aWNlU3R1Yih1cmwpOwotICAgICAgICBzdHViLl9nZXRTZXJ2aWNlQ2xpZW50KCkuZ2V0T3B0aW9ucygpLnNldEFjdGlvbigiZ2V0U3RvY2tRdW90ZSIpOwotICAgICAgICBHZXRTdG9ja1F1b3RlIHN0b2NrUXVvdGUgPSBuZXcgR2V0U3RvY2tRdW90ZSgpOwotICAgICAgICBzdG9ja1F1b3RlLnNldFN5bWJvbChzeW1ib2wpOwotICAgICAgICBTQVhPTUJ1aWxkZXIgYnVpbGRlciA9IG5ldyBTQVhPTUJ1aWxkZXIoKTsKLSAgICAgICAgTWFyc2hhbGxlci5tYXJzaGFsKHN0b2NrUXVvdGUsIGJ1aWxkZXIpOwotICAgICAgICBPTUVsZW1lbnQgcmVzcG9uc2UgPSBzdHViLmdldFN0b2NrUXVvdGUoCi0gICAgICAgICAgICAgICAgYnVpbGRlci5nZXRSb290RWxlbWVudCgpKTsKLQotCi0gICAgICAgIFN0QVhTb3VyY2Ugc3RheFNvdXJjZSA9Ci0gICAgICAgICAgICAgICAgbmV3IFN0QVhTb3VyY2UocmVzcG9uc2UuZ2V0WE1MU3RyZWFtUmVhZGVyKCkpOwotICAgICAgICBVbm1hcnNoYWxsZXIgdW5tYXJzaGFsbGVyID0gbmV3IFVubWFyc2hhbGxlcihHZXRTdG9ja1F1b3RlUmVzcG9uc2UuY2xhc3MpOwotICAgICAgICBVbm1hcnNoYWxIYW5kbGVyIHVubWFyc2hhbEhhbmRsZXIgPSB1bm1hcnNoYWxsZXIuY3JlYXRlSGFuZGxlcigpOwotICAgICAgICBHZXRTdG9ja1F1b3RlUmVzcG9uc2Ugc3RvY2tRdW90ZVJlc3BvbnNlOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgQ29udGVudEhhbmRsZXIgY29udGVudEhhbmRsZXIgPSBVbm1hcnNoYWxsZXIuZ2V0Q29udGVudEhhbmRsZXIodW5tYXJzaGFsSGFuZGxlcik7Ci0gICAgICAgICAgICBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdUcmFuc2Zvcm1lcigpLnRyYW5zZm9ybShzdGF4U291cmNlLCBuZXcgU0FYUmVzdWx0KGNvbnRlbnRIYW5kbGVyKSk7Ci0gICAgICAgICAgICBzdG9ja1F1b3RlUmVzcG9uc2UgPSAoR2V0U3RvY2tRdW90ZVJlc3BvbnNlKSB1bm1hcnNoYWxIYW5kbGVyLmdldE9iamVjdCgpOwotICAgICAgICB9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gY2F0Y2ggKFRyYW5zZm9ybWVyRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUHJpY2UgPSAiICsgc3RvY2tRdW90ZVJlc3BvbnNlLmdldFF1b3RlKCkuZ2V0TGFzdFRyYWRlKCkuZ2V0UHJpY2UoKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9kYXRhYmluZGluZy9jbGllbnQvc3JjL3NhbXBsZXMvZGF0YWJpbmRpbmcvU3RvY2tDbGllbnQyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2RhdGFiaW5kaW5nL2NsaWVudC9zcmMvc2FtcGxlcy9kYXRhYmluZGluZy9TdG9ja0NsaWVudDIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGY0MGZmNC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2RhdGFiaW5kaW5nL2NsaWVudC9zcmMvc2FtcGxlcy9kYXRhYmluZGluZy9TdG9ja0NsaWVudDIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBzYW1wbGVzLmRhdGFiaW5kaW5nOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTURhdGFTb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU91dHB1dEZvcm1hdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuYnVpbGRlci5TQVhPTUJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmpkb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmpkb20uRWxlbWVudDsKLWltcG9ydCBvcmcuamRvbS5KRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5qZG9tLmlucHV0LlN0QVhCdWlsZGVyOwotaW1wb3J0IG9yZy5qZG9tLm91dHB1dC5TQVhPdXRwdXR0ZXI7Ci1pbXBvcnQgb3JnLmpkb20ub3V0cHV0LlN0QVhPdXRwdXR0ZXI7Ci1pbXBvcnQgb3JnLmpkb20ub3V0cHV0LlhNTE91dHB1dHRlcjsKLWltcG9ydCBvcmcuamRvbS54cGF0aC5YUGF0aDsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci1wdWJsaWMgZmluYWwgY2xhc3MgU3RvY2tDbGllbnQyIHsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGFyZ3MubGVuZ3RoICE9IDIpIHsKLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiVXNhZ2U6IFN0b2NrQ2xpZW50IDx1cmw+IDxzeW1ib2w+Iik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgU3RyaW5nIHVybCA9IGFyZ3NbMF07Ci0gICAgICAgIGZpbmFsIFN0cmluZyBzeW1ib2wgPSBhcmdzWzFdOwotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkdldHRpbmcgU3RvY2sgUXVvdGUgZm9yICIgKyBzeW1ib2wpOwotCi0gICAgICAgIFN0b2NrUXVvdGVTZXJ2aWNlU3R1YiBzdHViID0KLSAgICAgICAgICAgICAgICBuZXcgU3RvY2tRdW90ZVNlcnZpY2VTdHViKHVybCk7Ci0gICAgICAgIHN0dWIuX2dldFNlcnZpY2VDbGllbnQoKS5nZXRPcHRpb25zKCkuc2V0QWN0aW9uKCJnZXRTdG9ja1F1b3RlIik7Ci0KLSAgICAgICAgRWxlbWVudCBlbGVtZW50MSA9IG5ldyBFbGVtZW50KAotICAgICAgICAgICAgImdldFN0b2NrUXVvdGUiLCAibnNsIiwgImh0dHA6Ly93My5pYm0uY29tL3NjaGVtYXMvc2VydmljZXMvMjAwMi8xMS8xNS9zdG9ja3F1b3RlIik7Ci0gICAgICAgIEVsZW1lbnQgZWxlbWVudDIgPSBuZXcgRWxlbWVudCgic3ltYm9sIik7Ci0gICAgICAgIGVsZW1lbnQyLmFkZENvbnRlbnQoc3ltYm9sKTsKLSAgICAgICAgZWxlbWVudDEuYWRkQ29udGVudChlbGVtZW50Mik7Ci0KLSAgICAgICAgT01GYWN0b3J5IGZhY3RvcnkgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKTsKLSAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTURhdGFTb3VyY2Ugc3JjID0gbmV3IEpET01EYXRhU291cmNlKGVsZW1lbnQxKTsKLSAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5hbWVzcGFjZSBhcHBucyA9IGZhY3RvcnkuY3JlYXRlT01OYW1lc3BhY2UoImh0dHA6Ly93My5pYm0uY29tL3NjaGVtYXMvc2VydmljZXMvMjAwMi8xMS8xNS9zdG9ja3F1b3RlIiwgIm5zMSIpOwotICAgICAgICBPTUVsZW1lbnQgY2hpbGQgPSBmYWN0b3J5LmNyZWF0ZU9NRWxlbWVudChzcmMsICJnZXRTdG9ja1F1b3RlIiwgYXBwbnMpOwotCi0gICAgICAgIE9NRWxlbWVudCByZXNwb25zZSA9IHN0dWIuZ2V0U3RvY2tRdW90ZShjaGlsZCk7Ci0KLSAgICAgICAgU3RBWEJ1aWxkZXIgYnVpbGRlciA9IG5ldyBTdEFYQnVpbGRlcigpOwotICAgICAgICBEb2N1bWVudCBkb2MgPSBidWlsZGVyLmJ1aWxkKHJlc3BvbnNlLmdldFhNTFN0cmVhbVJlYWRlcigpKTsKLSAgICAgICAgWFBhdGggcGF0aCA9IFhQYXRoLm5ld0luc3RhbmNlKCIvL3ByaWNlIik7Ci0gICAgICAgIEVsZW1lbnQgcHJpY2UgPSAoRWxlbWVudCkgcGF0aC5zZWxlY3RTaW5nbGVOb2RlKGRvYy5nZXRSb290RWxlbWVudCgpKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJQcmljZSA9ICIgKyBwcmljZS5nZXRUZXh0KCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEpET01EYXRhU291cmNlIGltcGxlbWVudHMgT01EYXRhU291cmNlIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBFbGVtZW50IGRhdGE7Ci0KLSAgICAgICAgcHJpdmF0ZSBKRE9NRGF0YVNvdXJjZShFbGVtZW50IGRhdGEpIHsKLSAgICAgICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoT3V0cHV0U3RyZWFtIG91dHB1dCwgT01PdXRwdXRGb3JtYXQgZm9ybWF0KSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgWE1MT3V0cHV0dGVyIG91dHB1dHRlciA9IG5ldyBYTUxPdXRwdXR0ZXIoKTsKLSAgICAgICAgICAgICAgICBvdXRwdXR0ZXIub3V0cHV0KGRhdGEsIG91dHB1dCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhNTFN0cmVhbUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShXcml0ZXIgd3JpdGVyLCBPTU91dHB1dEZvcm1hdCBmb3JtYXQpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBYTUxPdXRwdXR0ZXIgb3V0cHV0dGVyID0gbmV3IFhNTE91dHB1dHRlcigpOwotICAgICAgICAgICAgICAgIG91dHB1dHRlci5vdXRwdXQoZGF0YSwgd3JpdGVyKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWE1MU3RyZWFtRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKFhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgU3RBWE91dHB1dHRlciBvdXRwdXR0ZXIgPSBuZXcgU3RBWE91dHB1dHRlcih4bWxXcml0ZXIpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBvdXRwdXR0ZXIub3V0cHV0RnJhZ21lbnQoZGF0YSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChKRE9NRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWE1MU3RyZWFtRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFhNTFN0cmVhbVJlYWRlciBnZXRSZWFkZXIoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIFNBWE9NQnVpbGRlciBidWlsZGVyID0gbmV3IFNBWE9NQnVpbGRlcigpOwotICAgICAgICAgICAgU0FYT3V0cHV0dGVyIG91dHB1dHRlciA9IG5ldyBTQVhPdXRwdXR0ZXIoKTsKLSAgICAgICAgICAgIG91dHB1dHRlci5zZXRDb250ZW50SGFuZGxlcihidWlsZGVyKTsKLSAgICAgICAgICAgIG91dHB1dHRlci5zZXRFbnRpdHlSZXNvbHZlcihidWlsZGVyKTsKLSAgICAgICAgICAgIG91dHB1dHRlci5zZXREVERIYW5kbGVyKGJ1aWxkZXIpOwotICAgICAgICAgICAgb3V0cHV0dGVyLnNldEVudGl0eVJlc29sdmVyKGJ1aWxkZXIpOwotICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXIuZ2V0Um9vdEVsZW1lbnQoKS5nZXRYTUxTdHJlYW1SZWFkZXIoKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvZGF0YWJpbmRpbmcvc2VydmljZS9idWlsZC54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2RhdGFiaW5kaW5nL3NlcnZpY2UvYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmFjOTQ0Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvZGF0YWJpbmRpbmcvc2VydmljZS9idWlsZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxwcm9qZWN0IGJhc2VkaXI9Ii4iIGRlZmF1bHQ9Imdlbi5za2VsZXRvbiI+Ci0JCi0JPHByb3BlcnR5IGVudmlyb25tZW50PSJlbnYiLz4KLQkKLQk8cHJvcGVydHkgbmFtZT0icHJvamVjdC5iYXNlLmRpciIgdmFsdWU9Ii4iLz4KLQk8cHJvcGVydHkgbmFtZT0icGFyZW50LmRpciIgdmFsdWU9Ii4uIi8+Ci0JCi0JPHByb3BlcnR5IG5hbWU9IndzZGwudXJpIiB2YWx1ZT0iJHtwYXJlbnQuZGlyfS9iYW5rLndzZGwiLz4KLQkKLQk8cHJvcGVydHkgbmFtZT0ic3JjIiB2YWx1ZT0iJHtwcm9qZWN0LmJhc2UuZGlyfS9zcmMiLz4KLQk8cHJvcGVydHkgbmFtZT0idGFyZ2V0IiB2YWx1ZT0iJHtwcm9qZWN0LmJhc2UuZGlyfS90YXJnZXQiLz4KLQkKLQk8dGFyZ2V0IG5hbWU9ImNoZWNrLmRlcGVuZGVuY3kiIHVubGVzcz0iZW52LkFYSVMyX0hPTUUiPgotCQk8ZWNobyBtZXNzYWdlPSJBWElTMl9IT01FIG11c3QgYmUgc2V0Ii8+Ci0JPC90YXJnZXQ+Ci0JCi0JPHRhcmdldCBuYW1lPSJnZW4uc2tlbGV0b24iIGlmPSJlbnYuQVhJUzJfSE9NRSIgZGVwZW5kcz0iY2hlY2suZGVwZW5kZW5jeSI+Ci0KLQotICAgICAgICA8ZGVsZXRlIGRpcj0iJHt0YXJnZXR9Ii8+Ci0JCTxta2RpciBkaXI9IiR7dGFyZ2V0fSIvPgotCQk8amF2YSBjbGFzc25hbWU9Im9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMMkphdmEiIGZvcms9InRydWUiPgotCQkJPGFyZyBsaW5lPSItdXJpICR7d3NkbC51cml9Ii8+Ci0JCQk8YXJnIGxpbmU9Ii1zcyIvPgotCQkJPGFyZyBsaW5lPSItc2QiLz4KLQkJCTxhcmcgbGluZT0iLW8gJHt0YXJnZXR9Ii8+IDwhLS0gT3V0cHV0IGRpcmVjdG9yeSBpbiB3aGljaCB0byBnZW5lcmF0ZSBmaWxlcyAtLT4gPCEtLSBOQiBpdCBnZW5lcmF0ZXMgdG8gdGhlIHNyYyBmb2xkZXIgdW5kZXIgdGhpcyBkaXJlY3RvcnkhISAtLT4KLQkJCTxjbGFzc3BhdGg+Ci0JCQkJPGZpbGVzZXQgZGlyPSIuLlwuLlxsaWIiPgotCQkJCQk8aW5jbHVkZSBuYW1lPSIqLmphciIvPgotCQkJCTwvZmlsZXNldD4KLQkJCTwvY2xhc3NwYXRoPgotCQk8L2phdmE+Ci0JPC90YXJnZXQ+Ci0JCi0JPCEtLSBDcmVhdGUgdGhlIHNlcnZpY2UgYXJjaGl2ZSBieSBleGVjdXRpbmcgdGFyZ2V0XGJ1aWxkLnhtbCAoamFyLnNlcnZlcikgLS0+Ci0JPHRhcmdldCBuYW1lPSJqYXIuc2VydmVyIiBpZj0iZW52LkFYSVMyX0hPTUUiPgotCQk8YW50IGRpcj0iJHt0YXJnZXR9Ii8+Ci0JCTxjb3B5IGZpbGU9IiR7dGFyZ2V0fVxidWlsZFxsaWJcQmFua1NlcnZpY2UuYWFyIiB0b2Rpcj0iLi4iLz4KLQk8L3RhcmdldD4KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2RhdGFiaW5kaW5nL3NlcnZpY2Uvc3JjL3NhbXBsZXMvZGF0YWJpbmRpbmcvU3RvY2tRdW90ZVNlcnZpY2VTa2VsZXRvbi5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9kYXRhYmluZGluZy9zZXJ2aWNlL3NyYy9zYW1wbGVzL2RhdGFiaW5kaW5nL1N0b2NrUXVvdGVTZXJ2aWNlU2tlbGV0b24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI2MTA0MC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2RhdGFiaW5kaW5nL3NlcnZpY2Uvc3JjL3NhbXBsZXMvZGF0YWJpbmRpbmcvU3RvY2tRdW90ZVNlcnZpY2VTa2VsZXRvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICogU3RvY2tRdW90ZVNlcnZpY2VTa2VsZXRvbi5qYXZhCi0gKgotICogVGhpcyBmaWxlIHdhcyBhdXRvLWdlbmVyYXRlZCBmcm9tIFdTREwKLSAqIGJ5IHRoZSBBcGFjaGUgQXhpczIgdmVyc2lvbjogMS4xLVNOQVBTSE9UIE5vdiAwMywgMjAwNiAoMDY6NTQ6MDcgRVNUKQotICovCi1wYWNrYWdlIHNhbXBsZXMuZGF0YWJpbmRpbmc7Ci1pbXBvcnQgamF2YW5ldC5zdGF4dXRpbHMuU3RBWFNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuYnVpbGRlci5TQVhPTUJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmV4b2xhYi5jYXN0b3IueG1sLk1hcnNoYWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmV4b2xhYi5jYXN0b3IueG1sLk1hcnNoYWxsZXI7Ci1pbXBvcnQgb3JnLmV4b2xhYi5jYXN0b3IueG1sLlVubWFyc2hhbEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmV4b2xhYi5jYXN0b3IueG1sLlVubWFyc2hhbGxlcjsKLWltcG9ydCBvcmcuZXhvbGFiLmNhc3Rvci54bWwuVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlcjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci1pbXBvcnQgc2FtcGxlcy5kYXRhYmluZGluZy5kYXRhLkNoYW5nZTsKLWltcG9ydCBzYW1wbGVzLmRhdGFiaW5kaW5nLmRhdGEuR2V0U3RvY2tRdW90ZTsKLWltcG9ydCBzYW1wbGVzLmRhdGFiaW5kaW5nLmRhdGEuR2V0U3RvY2tRdW90ZVJlc3BvbnNlOwotaW1wb3J0IHNhbXBsZXMuZGF0YWJpbmRpbmcuZGF0YS5MYXN0VHJhZGU7Ci1pbXBvcnQgc2FtcGxlcy5kYXRhYmluZGluZy5kYXRhLlF1b3RlOwotCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnNheC5TQVhSZXN1bHQ7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7Ci0vKioKLSAqIFN0b2NrUXVvdGVTZXJ2aWNlU2tlbGV0b24gamF2YSBza2VsZXRvbiBmb3IgdGhlIGF4aXNTZXJ2aWNlCi0gKi8KLXB1YmxpYyBjbGFzcyBTdG9ja1F1b3RlU2VydmljZVNrZWxldG9uIHsKLSAgICAvKioKLSAgICAgKiBBdXRvIGdlbmVyYXRlZCBtZXRob2Qgc2lnbmF0dXJlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGFyYW0wCi0gICAgICovCi0gICAgcHVibGljIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IGdldFN0b2NrUXVvdGUob3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgcGFyYW0wKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgU3RBWFNvdXJjZSBzdGF4U291cmNlID0KLSAgICAgICAgICAgICAgICBuZXcgU3RBWFNvdXJjZShwYXJhbTAuZ2V0WE1MU3RyZWFtUmVhZGVyKCkpOwotICAgICAgICBVbm1hcnNoYWxsZXIgdW5tYXJzaGFsbGVyID0gbmV3IFVubWFyc2hhbGxlcihHZXRTdG9ja1F1b3RlLmNsYXNzKTsKLSAgICAgICAgVW5tYXJzaGFsSGFuZGxlciB1bm1hcnNoYWxIYW5kbGVyID0gdW5tYXJzaGFsbGVyLmNyZWF0ZUhhbmRsZXIoKTsKLSAgICAgICAgR2V0U3RvY2tRdW90ZSBzdG9ja1F1b3RlOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgQ29udGVudEhhbmRsZXIgY29udGVudEhhbmRsZXIgPSBVbm1hcnNoYWxsZXIuZ2V0Q29udGVudEhhbmRsZXIodW5tYXJzaGFsSGFuZGxlcik7Ci0gICAgICAgICAgICBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdUcmFuc2Zvcm1lcigpLnRyYW5zZm9ybShzdGF4U291cmNlLCBuZXcgU0FYUmVzdWx0KGNvbnRlbnRIYW5kbGVyKSk7Ci0gICAgICAgICAgICBzdG9ja1F1b3RlID0gKEdldFN0b2NrUXVvdGUpIHVubWFyc2hhbEhhbmRsZXIuZ2V0T2JqZWN0KCk7Ci0gICAgICAgIH0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBjYXRjaCAoVHJhbnNmb3JtZXJFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmICghc3RvY2tRdW90ZS5nZXRTeW1ib2woKS5lcXVhbHMoIklCTSIpKSB7Ci0JCQl0aHJvdyBuZXcgQXhpc0ZhdWx0KCJTdG9ja1F1b3RlIGRldGFpbHMgZm9yIHRoZSBzeW1ib2wgJyIrIHN0b2NrUXVvdGUuZ2V0U3ltYm9sKCkgKyAiJyBhcmUgbm90IGF2YWlsYWJsZS4iKTsKLSAgICAgICAgfQotICAgICAgICBHZXRTdG9ja1F1b3RlUmVzcG9uc2Ugc3RvY2tRdW90ZVJlc3BvbnNlID0gbmV3IEdldFN0b2NrUXVvdGVSZXNwb25zZSgpOwotICAgICAgICBRdW90ZSBxdW90ZSA9IG5ldyBRdW90ZSgpOwotICAgICAgICBxdW90ZS5zZXRTeW1ib2woc3RvY2tRdW90ZS5nZXRTeW1ib2woKSk7Ci0gICAgICAgIHF1b3RlLnNldFZvbHVtZSg1MDAwKTsKLQotICAgICAgICBMYXN0VHJhZGUgbGFzdFRyYWRlID0gbmV3IExhc3RUcmFkZSgpOwotICAgICAgICBsYXN0VHJhZGUuc2V0UHJpY2UoOTkpOwotICAgICAgICBsYXN0VHJhZGUuc2V0RGF0ZShDYWxlbmRhci5nZXRJbnN0YW5jZSgpLmdldFRpbWVJbk1pbGxpcygpKTsKLSAgICAgICAgcXVvdGUuc2V0TGFzdFRyYWRlKGxhc3RUcmFkZSk7Ci0KLSAgICAgICAgQ2hhbmdlIGNoYW5nZSA9IG5ldyBDaGFuZ2UoKTsKLSAgICAgICAgY2hhbmdlLnNldERvbGxhcigxKTsKLSAgICAgICAgY2hhbmdlLnNldFBlcmNlbnQoMTApOwotICAgICAgICBjaGFuZ2Uuc2V0UG9zaXRpdmUodHJ1ZSk7Ci0gICAgICAgIHF1b3RlLnNldENoYW5nZShjaGFuZ2UpOwotCi0gICAgICAgIHN0b2NrUXVvdGVSZXNwb25zZS5zZXRRdW90ZShxdW90ZSk7Ci0gICAgICAgIFNBWE9NQnVpbGRlciBidWlsZGVyID0gbmV3IFNBWE9NQnVpbGRlcigpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgTWFyc2hhbGxlci5tYXJzaGFsKHN0b2NrUXVvdGVSZXNwb25zZSwgYnVpbGRlcik7Ci0gICAgICAgIH0gY2F0Y2ggKE1hcnNoYWxFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gY2F0Y2ggKFZhbGlkYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBidWlsZGVyLmdldFJvb3RFbGVtZW50KCk7Ci0gICAgfQotfQotICAgIApkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9ldmVudGluZy9idWlsZC54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2V2ZW50aW5nL2J1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE1YWZlNi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2V2ZW50aW5nL2J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+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+Ci0JICAgICAgICAgICAgCSA8aW5jbHVkZSBuYW1lPSIqLmJhdCIvPgotCSAgICAgICAgCTwvZmlsZXNldD4KLQkgICAgICAgIDwvY29weT4KLQk8L3RhcmdldD4KLQotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvZXZlbnRpbmcvbGlzdG5lcjEuc2VydmljZXMueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9ldmVudGluZy9saXN0bmVyMS5zZXJ2aWNlcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0ZjI2M2QuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9ldmVudGluZy9saXN0bmVyMS5zZXJ2aWNlcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzZXJ2aWNlIG5hbWU9Ikxpc3RuZXJTZXJ2aWNlMSI+Ci0KLSAgIDxwYXJhbWV0ZXIgbmFtZT0iU2VydmljZUNsYXNzIiBsb2NrZWQ9InhzZDpmYWxzZSI+c2FtcGxlLmV2ZW50aW5nLkxpc3RuZXJTZXJ2aWNlMTwvcGFyYW1ldGVyPgotCi0gICAgPGRlc2NyaXB0aW9uPgotICAgICAgICBUaGUgTGlzdG5lciBTZXJ2aWNlIDEgb2YgdGhlIEF4aXMyIEV2ZW50aW5nIHNhbXBsZS4KLSAgICA8L2Rlc2NyaXB0aW9uPgotCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJwdWJsaXNoIiBtZXA9Imh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgvd3NkbC9pbi1vbmx5Ij4gIAotICAgICAgICA8bWVzc2FnZVJlY2VpdmVyIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5SYXdYTUxJTk9ubHlNZXNzYWdlUmVjZWl2ZXIiIC8+Ci0gICAgPC9vcGVyYXRpb24+Ci0gICAgICAgICAgIAotPC9zZXJ2aWNlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvZXZlbnRpbmcvbGlzdG5lcjIuc2VydmljZXMueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9ldmVudGluZy9saXN0bmVyMi5zZXJ2aWNlcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmM2NkZjkuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9ldmVudGluZy9saXN0bmVyMi5zZXJ2aWNlcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzZXJ2aWNlIG5hbWU9Ikxpc3RuZXJTZXJ2aWNlMiI+Ci0KLSAgIDxwYXJhbWV0ZXIgbmFtZT0iU2VydmljZUNsYXNzIiBsb2NrZWQ9InhzZDpmYWxzZSI+c2FtcGxlLmV2ZW50aW5nLkxpc3RuZXJTZXJ2aWNlMjwvcGFyYW1ldGVyPgotCi0gICAgPGRlc2NyaXB0aW9uPgotICAgICAgICBUaGUgTGlzdG5lciBTZXJ2aWNlIDIgb2YgdGhlIEF4aXMyIEV2ZW50aW5nIHNhbXBsZS4KLSAgICA8L2Rlc2NyaXB0aW9uPgotCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJwdWJsaXNoIiBtZXA9Imh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgvd3NkbC9pbi1vbmx5Ij4gIAotICAgICAgICA8bWVzc2FnZVJlY2VpdmVyIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5SYXdYTUxJTk9ubHlNZXNzYWdlUmVjZWl2ZXIiIC8+Ci0gICAgPC9vcGVyYXRpb24+Ci0gICAgICAgICAgIAotPC9zZXJ2aWNlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvZXZlbnRpbmcvcHVibGlzaGVyLnNlcnZpY2VzLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvZXZlbnRpbmcvcHVibGlzaGVyLnNlcnZpY2VzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg5YTYxZi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2V2ZW50aW5nL3B1Ymxpc2hlci5zZXJ2aWNlcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzZXJ2aWNlIG5hbWU9IlB1Ymxpc2hlclNlcnZpY2UiPgotCi0gICA8cGFyYW1ldGVyIG5hbWU9IlNlcnZpY2VDbGFzcyIgbG9ja2VkPSJ4c2Q6ZmFsc2UiPnNhbXBsZS5ldmVudGluZy5QdWJsaXNoZXJTZXJ2aWNlPC9wYXJhbWV0ZXI+Ci0KLSAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgIFRoZSBQdWJsaXNoZXIgU2VydmljZSBvZiB0aGUgQXhpczIgRXZlbnRpbmcgc2FtcGxlLgotICAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgICA8bW9kdWxlIHJlZj0ic2F2YW4iIC8+Ci0gICAgPG1vZHVsZSByZWY9ImFkZHJlc3NpbmciIC8+Ci0JICAgICAgCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJkdW1teU1ldGhvZCIgbWVwPSJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaW4tb25seSI+ICAKLSAgICAgICAgPG1lc3NhZ2VSZWNlaXZlciBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuUmF3WE1MSU5Pbmx5TWVzc2FnZVJlY2VpdmVyIiAvPgotCQk8YWN0aW9uTWFwcGluZz51dWlkOkR1bW15TWV0aG9kQWN0aW9uPC9hY3Rpb25NYXBwaW5nPgotICAgIDwvb3BlcmF0aW9uPgotICAgICAgICAgICAKLTwvc2VydmljZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2V2ZW50aW5nL3JlYWRtZS50eHQgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2V2ZW50aW5nL3JlYWRtZS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5NmQwYTQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9ldmVudGluZy9yZWFkbWUudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotU3RlcHMgdG8gYnVpbGQgYW5kIHJ1biB0aGUgU2F2YW4tRXZlbnRpbmcgc2FtcGxlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotVG8gYnVpbGQKLS0tLS0tLS0tCi0KLTEuIE1vdmUgdG8gdGhlIHNhbXBsZSBmb2xkZXIuCi0yLiBDcmVhdGUgYSBzdWJmb2xkZXJzICdidWlsZC9saWInLgotMy4gQ29weSBhbGwgdGhlIGphcnMgZnJvbSBhIGNvbXBhdGlibGUgQXhpczIgZGlzdHJpYnV0aW9uIHRvICdidWlsZC9saWInLgotNC4gQ29weSB0aGUgc2F2YW4gamFyIGZpbGUgdG8gJ2J1aWxkL2xpYicuCi01LiBSdW4gJ2FudCcgdG8gYnVpbGQgdGhlIHNhbXBsZS4KLQotCi1UbyBydW4KLS0tLS0tLQotMS4gU3RhcnQgYSBBeGlzMiBzZXJ2ZXIuCi0yLiBEZXBsb3kgc2F2YW4gYW5kIGFkZHJlc3NpbmcgbW9kdWxlcy4KLTMuIERlcGxveSB0aGUgdGhyZWUgc2VydmljZXMgdGhhdCB3ZXJlIGNyZWF0ZWQgaW4gdGhlICdidWlsZCcgZm9sZGVyLgotNC4gUnVuIHRoZSAnc2FtcGxlcy5ldmVudGluZy5DbGllbnQnIGNsYXNzLCB5b3UgY2FuIHBhc3MgdGhlIHJlcG9zaXRvcnkgd2l0aCBhICctcicgcGFyYW1ldGVyIGFuZCB0aGUgc2VydmVyIHBvcnQgd2l0aCBhICctcCcgcGFyYW1ldGVyLgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9ldmVudGluZy9ydW4uYmF0IGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9ldmVudGluZy9ydW4uYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTczYWYwLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvZXZlbnRpbmcvcnVuLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLUBlY2hvIG9mZg0KLQ0KLVJFTSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLVJFTSAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi1SRU0gIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotUkVNICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi1SRU0gIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi1SRU0gICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi1SRU0gIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLVJFTSAgDQotUkVNICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi1SRU0gIA0KLVJFTSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLVJFTSAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi1SRU0gICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLVJFTSAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi1SRU0gIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi1SRU0gIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLXJlbSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi1yZW0gU3RhcnQgc2NyaXB0IGZvciBydW5uaW5nIHRoZSBFdmVudGluZyBTYW1wbGUgQ2xpZW50DQotcmVtDQotcmVtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQ0KLXJlbSBzdG9yZSB0aGUgY3VycmVudCBkaXJlY3RvcnkNCi1zZXQgQ1VSUkVOVF9ESVI9JWNkJQ0KLQ0KLXJlbSBjaGVjayB0aGUgQVhJUzJfSE9NRSBlbnZpcm9ubWVudCB2YXJpYWJsZQ0KLWlmIG5vdCAiJUFYSVMyX0hPTUUlIiA9PSAiIiBnb3RvIGdvdEhvbWUNCi0NCi1yZW0gZ3Vlc3MgdGhlIGhvbWUuIEp1bXAgdHdvIGRpcmVjdG9yaWVzIHVwIGFuZCB0YWtlIHRoYXQgYXMgdGhlIGhvbWUNCi1jZCAuLg0KLWNkIC4uDQotc2V0IEFYSVMyX0hPTUU9JWNkJQ0KLQ0KLWVjaG8gdXNpbmcgQXhpcyBIb21lICVBWElTMl9IT01FJQ0KLQ0KLQ0KLTpnb3RIb21lDQotaWYgRVhJU1QgIiVBWElTMl9IT01FJVxsaWJcYXhpczIqLmphciIgZ290byBva0hvbWUNCi1lY2hvIFRoZSBBWElTMl9IT01FIGVudmlyb25tZW50IHZhcmlhYmxlIHNlZW1zIG5vdCB0byBwb2ludCB0byB0aGUgY29ycmVjdCBsb2FjdGlvbiENCi1lY2hvIFRoaXMgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgbmVlZGVkIHRvIHJ1biB0aGlzIHByb2dyYW0NCi1wYXVzZQ0KLWdvdG8gZW5kDQotDQotOm9rSG9tZQ0KLWNkICVDVVJSRU5UX0RJUiUNCi0NCi1zZXRsb2NhbCBFbmFibGVEZWxheWVkRXhwYW5zaW9uDQotcmVtIGxvb3AgdGhyb3VnaCB0aGUgbGlicyBhbmQgYWRkIHRoZW0gdG8gdGhlIGNsYXNzIHBhdGgNCi1zZXQgQVhJUzJfQ0xBU1NfUEFUSD0lQVhJUzJfSE9NRSUNCi1GT1IgJSVjIGluICglQVhJUzJfSE9NRSVcbGliXCouamFyKSBETyBzZXQgQVhJUzJfQ0xBU1NfUEFUSD0hQVhJUzJfQ0xBU1NfUEFUSCE7JSVjDQotDQotc2V0IEFYSVMyX0NMQVNTX1BBVEg9JUFYSVMyX0NMQVNTX1BBVEglOyIlQ1VSUkVOVF9ESVIlXEV2ZW50aW5nU2FtcGxlLmphciINCi0NCi1qYXZhIC1jcCAlQVhJUzJfQ0xBU1NfUEFUSCUgLURheGlzMi5yZXBvPSVBWElTMl9IT01FJSBzYW1wbGUuZXZlbnRpbmcuQ2xpZW50DQotZW5kbG9jYWwNCi06ZW5kClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9ldmVudGluZy9ydW4uc2ggYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2V2ZW50aW5nL3J1bi5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI3MWU0OC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2V2ZW50aW5nL3J1bi5zaAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLSMhL2Jpbi9zaA0KLQ0KLSMgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jICB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jICANCi0jICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jICANCi0jICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jICB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi1leHBvcnQgQVhJUzJfSE9NRT0uLi8uLg0KLUFYSVMyX0NMQVNTUEFUSD0kQVhJUzJfQ0xBU1NQQVRIOlNHQ0NhbGN1bGF0b3IuamFyDQotZm9yIGYgaW4gJEFYSVMyX0hPTUUvbGliLyouamFyDQotZG8NCi0gIEFYSVMyX0NMQVNTUEFUSD0kQVhJUzJfQ0xBU1NQQVRIOiRmDQotZG9uZQ0KLWV4cG9ydCBBWElTMl9DTEFTU1BBVEgNCi1lY2hvIGNsYXNzcGF0aDogJEFYSVMyX0NMQVNTUEFUSA0KLQ0KLWphdmEgLWNsYXNzcGF0aCAkQVhJUzJfQ0xBU1NQQVRIIC1EYXhpczIucmVwbz0kQVhJUzJfSE9NRSAgc2FtcGxlLnNnY2NhbGN1bGF0b3IuQ2FsY0NsaWVudA0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvZXZlbnRpbmcvc3JjL3NhbXBsZS9ldmVudGluZy9DbGllbnQuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvZXZlbnRpbmcvc3JjL3NhbXBsZS9ldmVudGluZy9DbGllbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjc3MzFlMC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2V2ZW50aW5nL3NyYy9zYW1wbGUvZXZlbnRpbmcvQ2xpZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBzYW1wbGUuZXZlbnRpbmc7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5PcHRpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50LlNlcnZpY2VDbGllbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5zYXZhbi5ldmVudGluZy5jbGllbnQuRXZlbnRpbmdDbGllbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5zYXZhbi5ldmVudGluZy5jbGllbnQuRXZlbnRpbmdDbGllbnRCZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUuc2F2YW4uZXZlbnRpbmcuY2xpZW50LlN1YnNjcmlwdGlvblN0YXR1czsKLQotcHVibGljIGNsYXNzIENsaWVudCB7Ci0KLSAgICBCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKFN5c3RlbS5pbikpOwotICAgIAotICAgIHByaXZhdGUgZmluYWwgaW50IE1JTl9PUFRJT04gPSAxOwotICAgIHByaXZhdGUgZmluYWwgaW50IE1BWF9PUFRJT04gPSA5OwotICAgIAotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIFNVQlNDUklCRVJfMV9JRCA9ICJzdWJzY3JpYmVyMSI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgU1VCU0NSSUJFUl8yX0lEID0gInN1YnNjcmliZXIyIjsKLSAgICAKLSAgICBwcml2YXRlIFNlcnZpY2VDbGllbnQgc2VydmljZUNsaWVudCA9IG51bGw7Ci0gICAgcHJpdmF0ZSBPcHRpb25zIG9wdGlvbnMgPSBudWxsOwotICAgIHByaXZhdGUgRXZlbnRpbmdDbGllbnQgZXZlbnRpbmdDbGllbnQgPSBudWxsOwotICAgIAotICAgIHByaXZhdGUgU3RyaW5nIHRvQWRkcmVzc1BhcnQgPSAiL2F4aXMyL3NlcnZpY2VzL1B1Ymxpc2hlclNlcnZpY2UiOwotICAgIHByaXZhdGUgU3RyaW5nIGxpc3RuZXIxQWRkcmVzc1BhcnQgPSAiL2F4aXMyL3NlcnZpY2VzL0xpc3RuZXJTZXJ2aWNlMSI7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbGlzdG5lcjJBZGRyZXNzUGFydCA9ICIvYXhpczIvc2VydmljZXMvTGlzdG5lclNlcnZpY2UyIjsKLSAgICAKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBhcHBsaWNhdGlvbk5hbWVzcGFjZU5hbWUgPSAiaHR0cDovL3RlbXB1cmkub3JnLyI7IAotCXByaXZhdGUgZmluYWwgU3RyaW5nIGR1bW15TWV0aG9kID0gImR1bW15TWV0aG9kIjsKLSAgICAKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgcmVwbyA9IG51bGw7Ci0JcHJpdmF0ZSBzdGF0aWMgaW50IHBvcnQgPSA4MDgwOwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBzZXJ2ZXJJUCA9ICIxMjcuMC4wLjEiOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBwb3J0UGFyYW0gPSAiLXAiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyByZXBvUGFyYW0gPSAiLXIiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBoZWxwUGFyYW0gPSAiLWgiOwotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCi0JCWZvciAoaW50IGk9MDtpPGFyZ3MubGVuZ3RoO2krKykgewotCQkJaWYgKGhlbHBQYXJhbS5lcXVhbHNJZ25vcmVDYXNlKGFyZ3NbaV0pKSB7Ci0JCQkJZGlzcGxheUhlbHAgKCk7Ci0JCQkJU3lzdGVtLmV4aXQoMCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCVN0cmluZyBwb3J0U3RyID0gZ2V0UGFyYW0ocG9ydFBhcmFtLGFyZ3MpOwotCQlpZiAocG9ydFN0ciE9bnVsbCkgewotCQkJcG9ydCA9IEludGVnZXIucGFyc2VJbnQocG9ydFN0cik7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlNlcnZlciBQb3J0IHdhcyBzZXQgdG86IiArIHBvcnQpOwotCQl9Ci0JCQotCQlTdHJpbmcgcmVwb1N0ciA9IGdldFBhcmFtKHJlcG9QYXJhbSxhcmdzKTsKLQkJaWYgKHJlcG9TdHIhPW51bGwpIHsKLQkJCXJlcG8gPSByZXBvU3RyOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJDbGllbnQgUmVwb3NpdG9yeSB3YXMgc2V0IHRvOiIgKyByZXBvKTsKLQkJfQotCQkKLQkJQ2xpZW50IGMgPSBuZXcgQ2xpZW50ICgpOwotCQljLnJ1biAoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBkaXNwbGF5SGVscCAoKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiSGVscCBwYWdlIGZvciB0aGUgRXZlbnRpbmcgQ2xpZW50Iik7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiU2V0IHRoZSBjbGllbnQgcmVwb3Npb3J5IHVzaW5nIHRoZSBwYXJhbWV0ZXIgLXIiKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJTZXQgdGhlIHNlcnZlciBwb3J0IHVzaW5nIHRoZSBwYXJhbWV0ZXIgLXAiKTsKLQl9Ci0JCi0gICAgLyoqCi0gICAgICogVGhpcyB3aWxsIGNoZWNrIHRoZSBnaXZlbiBwYXJhbWV0ZXIgaW4gdGhlIGFycmF5IGFuZCB3aWxsIHJldHVybiwgaWYgYXZhaWxhYmxlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGFyYW0KLSAgICAgKiBAcGFyYW0gYXJncwotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0UGFyYW0oU3RyaW5nIHBhcmFtLCBTdHJpbmdbXSBhcmdzKSB7Ci0gICAgICAgIGlmIChwYXJhbSA9PSBudWxsIHx8ICIiLmVxdWFscyhwYXJhbSkpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSA9IGkgKyAyKSB7Ci0gICAgICAgICAgICBTdHJpbmcgYXJnID0gYXJnc1tpXTsKLSAgICAgICAgICAgIGlmIChwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKGFyZykgJiYgKGFyZ3MubGVuZ3RoID49IChpICsgMSkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGFyZ3NbaSArIDFdOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQkKLQlwdWJsaWMgdm9pZCBydW4gKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlxuIik7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiV2VsY29tZSB0byBBeGlzMiBFdmVudGluZyBTYW1wbGUiKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIik7Ci0JCQotCQlib29sZWFuIHZhbGlkT3B0aW9uU2VsZWN0ZWQgPSBmYWxzZTsKLQkJaW50IHNlbGVjdGVkT3B0aW9uID0gLTE7Ci0JCXdoaWxlICghdmFsaWRPcHRpb25TZWxlY3RlZCkgewotCQkJZGlzcGxheU1lbnUoKTsKLQkJCXNlbGVjdGVkT3B0aW9uID0gZ2V0SW50SW5wdXQoKTsKLQkJCWlmIChzZWxlY3RlZE9wdGlvbj49TUlOX09QVElPTiAmJiBzZWxlY3RlZE9wdGlvbjw9TUFYX09QVElPTikKLQkJCQl2YWxpZE9wdGlvblNlbGVjdGVkID0gdHJ1ZTsKLQkJCWVsc2UgCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJcbkludmFsaWQgT3B0aW9uIFxuXG4iKTsKLQkJfQotCQkJCi0JCWluaXRDbGllbnQgKCk7Ci0JCXBlcmZvcm1BY3Rpb24gKHNlbGVjdGVkT3B0aW9uKTsKLQkJCi0JCS8vVE9ETyBwdWJsaXNoCi0JCQotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlByZXNzIGVudGVyIHRvIGluaXRpYWxpemUgdGhlIHB1Ymxpc2hlciBzZXJ2aWNlLiIpOwotCQlyZWFkZXIucmVhZExpbmUoKTsKLQkJCi0JCW9wdGlvbnMuc2V0QWN0aW9uKCJ1dWlkOkR1bW15TWV0aG9kQWN0aW9uIik7Ci0JCXNlcnZpY2VDbGllbnQuZmlyZUFuZEZvcmdldChnZXREdW1teU1ldGhvZFJlcXVlc3RFbGVtZW50ICgpKTsKLQkJCi0JCXdoaWxlICh0cnVlKSB7Ci0JCQkKLQkJCXZhbGlkT3B0aW9uU2VsZWN0ZWQgPSBmYWxzZTsKLQkJCXNlbGVjdGVkT3B0aW9uID0gLTE7Ci0JCQl3aGlsZSAoIXZhbGlkT3B0aW9uU2VsZWN0ZWQpIHsKLQkJCQlkaXNwbGF5TWVudSgpOwotCQkJCXNlbGVjdGVkT3B0aW9uID0gZ2V0SW50SW5wdXQoKTsKLQkJCQlpZiAoc2VsZWN0ZWRPcHRpb24+PU1JTl9PUFRJT04gJiYgc2VsZWN0ZWRPcHRpb248PU1BWF9PUFRJT04pCi0JCQkJCXZhbGlkT3B0aW9uU2VsZWN0ZWQgPSB0cnVlOwotCQkJCWVsc2UgCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXG5JbnZhbGlkIE9wdGlvbiBcblxuIik7Ci0JCQl9Ci0JCQkJCi0JCQlwZXJmb3JtQWN0aW9uIChzZWxlY3RlZE9wdGlvbik7Ci0JCQkKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgZGlzcGxheU1lbnUgKCkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlByZXNzIDEgdG8gc3Vic2NyaWJlIExpc3RuZXIgU2VydmljZSAxIik7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiUHJlc3MgMiB0byBzdWJzY3JpYmUgTGlzdG5lciBTZXJ2aWNlIDIiKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJQcmVzcyAzIHRvIHN1YnNjcmliZSBib3RoIGxpc3RuZXIgc2VydmljZXMiKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJQcmVzcyA0IHRvIHVuc3Vic2NyaWJlIExpc3RuZXIgU2VydmljZSAxIik7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiUHJlc3MgNSB0byB1bnN1YnNjcmliZSBMaXN0bmVyIFNlcnZpY2UgMiIpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlByZXNzIDYgdG8gdW5zdWJzY3JpYmUgYm90aCBsaXN0bmVyIHNlcnZpY2VzIik7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiUHJlc3MgNyB0byB0byBnZXQgdGhlIHN0YXR1cyBvZiB0aGUgc3Vic2NyaXB0aW9uIHRvIFNlcnZpY2UgMSIpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlByZXNzIDggdG8gdG8gZ2V0IHRoZSBzdGF0dXMgb2YgdGhlIHN1YnNjcmlwdGlvbiB0byBTZXJ2aWNlIDIiKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJQcmVzcyA5IHRvIEV4aXQiKTsKLQl9Ci0JCi0JcHJpdmF0ZSBpbnQgZ2V0SW50SW5wdXQgKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIG9wdGlvbiA9IHJlYWRlci5yZWFkTGluZSgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIEludGVnZXIucGFyc2VJbnQob3B0aW9uKTsKLSAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgCS8vaW52YWxpZCBvcHRpb24KLSAgICAgICAgCXJldHVybiAtMTsKLSAgICAgICAgfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgaW5pdENsaWVudCAoKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLQotCQlTdHJpbmcgQ0xJRU5UX1JFUE8gPSBudWxsOwotCQlTdHJpbmcgQVhJUzJfWE1MID0gbnVsbDsKLQkJCi0JCWlmIChyZXBvIT1udWxsKSB7Ci0JCQlDTElFTlRfUkVQTyA9IHJlcG87Ci0JCQlBWElTMl9YTUwgPSByZXBvICsgRmlsZS5zZXBhcmF0b3IgKyAiYXhpczIueG1sIjsKLQkJfSBlbHNlIHsKLS8vCQkJdGhyb3cgbmV3IEF4aXNGYXVsdCAoIlBsZWFzZSBzcGVjaWZ5IHRoZSBjbGllbnQgcmVwb3NpdG9yeSBhcyBhIHByb2dyYW0gYXJndW1lbnQuVXNlICctaCcgZm9yIGhlbHAuIik7Ci0JCX0KLQkJCi0JCUNvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQgPSBDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkuY3JlYXRlQ29uZmlndXJhdGlvbkNvbnRleHRGcm9tRmlsZVN5c3RlbShDTElFTlRfUkVQTyxudWxsKTsKLQkJc2VydmljZUNsaWVudCA9IG5ldyBTZXJ2aWNlQ2xpZW50IChjb25maWdDb250ZXh0LG51bGwpOyAvL1RPRE8gZ2l2ZSBhIHJlcG8KLQkJCi0JCW9wdGlvbnMgPSBuZXcgT3B0aW9ucyAoKTsKLQkJc2VydmljZUNsaWVudC5zZXRPcHRpb25zKG9wdGlvbnMpOwotCQlzZXJ2aWNlQ2xpZW50LmVuZ2FnZU1vZHVsZShuZXcgUU5hbWUgKCJhZGRyZXNzaW5nIikpOwotCQkKLQkJZXZlbnRpbmdDbGllbnQgPSBuZXcgRXZlbnRpbmdDbGllbnQgKHNlcnZpY2VDbGllbnQpOwotCQkKLQkJU3RyaW5nIHRvQWRkcmVzcyA9ICJodHRwOi8vIiArIHNlcnZlcklQICsgIjoiICsgcG9ydCArIHRvQWRkcmVzc1BhcnQ7Ci0JCW9wdGlvbnMuc2V0VG8obmV3IEVuZHBvaW50UmVmZXJlbmNlICh0b0FkZHJlc3MpKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHBlcmZvcm1BY3Rpb24gKGludCBhY3Rpb24pIHRocm93cyBFeGNlcHRpb24gewotCQkKLQkJc3dpdGNoIChhY3Rpb24pIHsKLQkJY2FzZSAxOgotCQkJZG9TdWJzY3JpYmUoU1VCU0NSSUJFUl8xX0lEKTsKLQkJCWJyZWFrOwotCQljYXNlIDI6Ci0JCQlkb1N1YnNjcmliZShTVUJTQ1JJQkVSXzJfSUQpOwotCQkJYnJlYWs7Ci0JCWNhc2UgMzoKLQkJCWRvU3Vic2NyaWJlKFNVQlNDUklCRVJfMV9JRCk7Ci0JCQlkb1N1YnNjcmliZShTVUJTQ1JJQkVSXzJfSUQpOwotCQkJYnJlYWs7Ci0JCWNhc2UgNDoKLQkJCWRvVW5zdWJzY3JpYmUoU1VCU0NSSUJFUl8xX0lEKTsKLQkJCWJyZWFrOwotCQljYXNlIDU6Ci0JCQlkb1Vuc3Vic2NyaWJlKFNVQlNDUklCRVJfMl9JRCk7Ci0JCQlicmVhazsKLQkJY2FzZSA2OgotCQkJZG9VbnN1YnNjcmliZShTVUJTQ1JJQkVSXzFfSUQpOwotCQkJZG9VbnN1YnNjcmliZShTVUJTQ1JJQkVSXzJfSUQpOwotCQkJYnJlYWs7Ci0JCWNhc2UgNzoKLQkJCWRvR2V0U3RhdHVzKFNVQlNDUklCRVJfMV9JRCk7Ci0JCQlicmVhazsKLQkJY2FzZSA4OgotCQkJZG9HZXRTdGF0dXMoU1VCU0NSSUJFUl8yX0lEKTsKLQkJCWJyZWFrOwotCQljYXNlIDk6Ci0JCQlTeXN0ZW0uZXhpdCgwKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGRvU3Vic2NyaWJlIChTdHJpbmcgSUQpIHRocm93cyBFeGNlcHRpb24gewotCQlFdmVudGluZ0NsaWVudEJlYW4gYmVhbiA9IG5ldyBFdmVudGluZ0NsaWVudEJlYW4gKCk7Ci0JCQotCQlTdHJpbmcgc3Vic2NyaWJpbmdBZGRyZXNzID0gbnVsbDsKLQkJaWYgKFNVQlNDUklCRVJfMV9JRC5lcXVhbHMoSUQpKSB7Ci0gICAgICAgICAgICBzdWJzY3JpYmluZ0FkZHJlc3MgPSAiaHR0cDovLyIgKyBzZXJ2ZXJJUCArICI6IiArIHBvcnQgKyBsaXN0bmVyMUFkZHJlc3NQYXJ0OwotCQl9IGVsc2UgaWYgKFNVQlNDUklCRVJfMl9JRC5lcXVhbHMoSUQpKSB7Ci0gICAgICAgICAgICBzdWJzY3JpYmluZ0FkZHJlc3MgPSAiaHR0cDovLyIgKyBzZXJ2ZXJJUCArICI6IiArIHBvcnQgKyBsaXN0bmVyMkFkZHJlc3NQYXJ0OwotCQl9Ci0JCi0JCWJlYW4uc2V0RGVsaXZlcnlFUFIobmV3IEVuZHBvaW50UmVmZXJlbmNlIChzdWJzY3JpYmluZ0FkZHJlc3MpKTsKLQkKLQkJLy91bmNvbW1lbnQgZm9sbG93aW5nIHRvIHNldCBhbiBleHBpcmF0aW9uIHRpbWUgb2YgMTAgbWludXRlcy4KLS8vCQlEYXRlIGRhdGUgPSBuZXcgRGF0ZSAoKTsKLS8vCQlkYXRlLnNldE1pbnV0ZXMoZGF0ZS5nZXRNaW51dGVzKCkrMTApOwotLy8JCWJlYW4uc2V0RXhwaXJhdGlvblRpbWUoZGF0ZSk7Ci0JCQotCQlldmVudGluZ0NsaWVudC5zdWJzY3JpYmUoYmVhbixJRCk7Ci0JCVRocmVhZC5zbGVlcCgxMDAwKTsgICAvL1RPRE8gcmVtb3ZlIGlmIG5vdCBzZXF1aXJlZAotCX0KLQkKLQlwcml2YXRlIHZvaWQgZG9VbnN1YnNjcmliZSAoU3RyaW5nIElEKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJZXZlbnRpbmdDbGllbnQudW5zdWJzY3JpYmUoSUQpOwotCQlUaHJlYWQuc2xlZXAoMTAwMCk7ICAgLy9UT0RPIHJlbW92ZSBpZiBub3Qgc2VxdWlyZWQKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGRvR2V0U3RhdHVzIChTdHJpbmcgSUQpIHRocm93cyBFeGNlcHRpb24gewotCQlTdWJzY3JpcHRpb25TdGF0dXMgc3RhdHVzICA9IGV2ZW50aW5nQ2xpZW50LmdldFN1YnNjcmlwdGlvblN0YXR1cyhJRCk7Ci0JCVRocmVhZC5zbGVlcCgxMDAwKTsgICAvL1RPRE8gcmVtb3ZlIGlmIG5vdCBzZXF1aXJlZAotCQkKLQkJU3RyaW5nIHN0YXR1c1ZhbHVlID0gc3RhdHVzLmdldEV4cGlyYXRpb25WYWx1ZSgpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlN0YXR1cyBvZiB0aGUgc3Vic2NyaWJlciAnIiArIElEICsiJyBpcyIgKyBzdGF0dXNWYWx1ZSk7Ci0JfQotCQotCXByaXZhdGUgT01FbGVtZW50IGdldER1bW15TWV0aG9kUmVxdWVzdEVsZW1lbnQoKSB7Ci0JCU9NRmFjdG9yeSBmYWMgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKTsKLQkJT01OYW1lc3BhY2UgbmFtZXNwYWNlID0gZmFjLmNyZWF0ZU9NTmFtZXNwYWNlKGFwcGxpY2F0aW9uTmFtZXNwYWNlTmFtZSwibnMxIik7Ci0JCXJldHVybiBmYWMuY3JlYXRlT01FbGVtZW50KGR1bW15TWV0aG9kLCBuYW1lc3BhY2UpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvZXZlbnRpbmcvc3JjL3NhbXBsZS9ldmVudGluZy9MaXN0bmVyU2VydmljZTEuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvZXZlbnRpbmcvc3JjL3NhbXBsZS9ldmVudGluZy9MaXN0bmVyU2VydmljZTEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZmYmIxOS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2V2ZW50aW5nL3NyYy9zYW1wbGUvZXZlbnRpbmcvTGlzdG5lclNlcnZpY2UxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIHNhbXBsZS5ldmVudGluZzsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgTGlzdG5lclNlcnZpY2UxIHsKLQkKLQlTdHJpbmcgbmFtZSA9ICJMaXN0bmVyU2VydmljZTEiOwotCi0JcHVibGljIHZvaWQgcHVibGlzaChPTUVsZW1lbnQgcGFyYW0pIHRocm93cyBFeGNlcHRpb24gewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlxuIik7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiJyIgKyBuYW1lICsgIicgZ290IGEgbmV3IHB1YmxpY2F0aW9uLi4uIik7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbihwYXJhbSk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiXG4iKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvZXZlbnRpbmcvc3JjL3NhbXBsZS9ldmVudGluZy9MaXN0bmVyU2VydmljZTIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvZXZlbnRpbmcvc3JjL3NhbXBsZS9ldmVudGluZy9MaXN0bmVyU2VydmljZTIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzViNTc0Ni4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2V2ZW50aW5nL3NyYy9zYW1wbGUvZXZlbnRpbmcvTGlzdG5lclNlcnZpY2UyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIHNhbXBsZS5ldmVudGluZzsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgTGlzdG5lclNlcnZpY2UyIHsKLSAgCi0JU3RyaW5nIG5hbWUgPSAiTGlzdG5lclNlcnZpY2UyIjsKLSAgCi0JcHVibGljIHZvaWQgcHVibGlzaChPTUVsZW1lbnQgcGFyYW0pIHRocm93cyBFeGNlcHRpb24gIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJcbiIpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIiciICsgbmFtZSArICAiJyBnb3QgYSBuZXcgcHVibGljYXRpb24uLi4iKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKHBhcmFtKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJcbiIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9ldmVudGluZy9zcmMvc2FtcGxlL2V2ZW50aW5nL1B1Ymxpc2hlclNlcnZpY2UuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvZXZlbnRpbmcvc3JjL3NhbXBsZS9ldmVudGluZy9QdWJsaXNoZXJTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmZDYyNWQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9ldmVudGluZy9zcmMvc2FtcGxlL2V2ZW50aW5nL1B1Ymxpc2hlclNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugc2FtcGxlLmV2ZW50aW5nOwotCi1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEudXRpbC5SYW5kb207Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01OYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LlNlcnZpY2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuc2F2YW4ucHVibGljYXRpb24uY2xpZW50LlB1YmxpY2F0aW9uQ2xpZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuc2F2YW4uc3RvcmFnZS5TdWJzY3JpYmVyU3RvcmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5zYXZhbi51dGlsLkNvbW1vblV0aWw7Ci0KLXB1YmxpYyBjbGFzcyBQdWJsaXNoZXJTZXJ2aWNlIHsKLSAgCi0JU2VydmljZUNvbnRleHQgc2VydmljZUNvbnRleHQgPSBudWxsOwotCQotCXB1YmxpYyB2b2lkIGluaXQoU2VydmljZUNvbnRleHQgc2VydmljZUNvbnRleHQpIHRocm93cyBBeGlzRmF1bHQgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIkV2ZW50aW5nIFNlcnZpY2UgSU5JVCBjYWxsZWQiKTsKLQkJdGhpcy5zZXJ2aWNlQ29udGV4dCA9IHNlcnZpY2VDb250ZXh0OwotCQkKLQkJUHVibGlzaGVyVGhyZWFkIHRocmVhZCA9IG5ldyBQdWJsaXNoZXJUaHJlYWQgKCk7Ci0JCXRocmVhZC5zdGFydCgpOwotCX0KLSAgCi0JcHVibGljIHZvaWQgZHVtbXlNZXRob2QoT01FbGVtZW50IHBhcmFtKSB0aHJvd3MgRXhjZXB0aW9uICB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiRXZlbnRpbmcgU2VydmljZSBkdW1teSBtZXRob2QgY2FsbGVkIik7Ci0JfQotCQotCXByaXZhdGUgY2xhc3MgUHVibGlzaGVyVGhyZWFkIGV4dGVuZHMgVGhyZWFkIHsKLQkJCi0JCVN0cmluZyBQdWJsaWNhdGlvbiA9ICJQdWJsaWNhdGlvbiI7Ci0JCVN0cmluZyBwdWJsaWNhdGlvbk5hbWVzcGFjZVZhbHVlID0gImh0dHA6Ly90ZW1wdXJpL3B1YmxpY2F0aW9uLyI7Ci0JCVJhbmRvbSByID0gbmV3IFJhbmRvbSAoKTsKLQkJCi0JCXB1YmxpYyB2b2lkIHJ1biAoKSB7Ci0JCQl0cnkgewotCQkJCXdoaWxlICh0cnVlKSB7Ci0JCQkJCQotCQkJCQlUaHJlYWQuc2xlZXAoNTAwMCk7Ci0JCQkJCQotCQkJCQkvL3B1Ymxpc2hpbmcKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJQdWJsaXNoaW5nIG5leHQgcHVibGljYXRpb24uLi4iKTsKLQkJCQkJCi0JCQkJCVN1YnNjcmliZXJTdG9yZSBzdG9yZSA9IENvbW1vblV0aWwuZ2V0U3Vic2NyaWJlclN0b3JlKHNlcnZpY2VDb250ZXh0LmdldEF4aXNTZXJ2aWNlKCkpOwotCQkJCQlpZiAoc3RvcmU9PW51bGwpCi0JCQkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uICgiQ2FudCBmaW5kIHRoZSBTYXZhbiBzdWJzY3JpYmVyIHN0b3JlIik7Ci0JCQkJCQotCQkJCQlPTUVsZW1lbnQgZGF0YSA9IGdldE5leHRQdWJsaWNhdGlvbkRhdGEgKCk7Ci0JCQkJCQotCQkJCQlQdWJsaWNhdGlvbkNsaWVudCBwdWJsaWNhdGlvbkNsaWVudCA9IG5ldyBQdWJsaWNhdGlvbkNsaWVudCAoc2VydmljZUNvbnRleHQuZ2V0Q29uZmlndXJhdGlvbkNvbnRleHQoKSk7Ci0JCQkJCXB1YmxpY2F0aW9uQ2xpZW50LnNlbmRQdWJsaWNhdGlvbihkYXRhLHNlcnZpY2VDb250ZXh0LmdldEF4aXNTZXJ2aWNlKCksbnVsbCk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCQkKLQkJcHVibGljIE9NRWxlbWVudCBnZXROZXh0UHVibGljYXRpb25EYXRhICgpIHsKLQkJCU9NRmFjdG9yeSBmYWN0b3J5ID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCk7Ci0JCQlPTU5hbWVzcGFjZSBuYW1lc3BhY2UgPSBmYWN0b3J5LmNyZWF0ZU9NTmFtZXNwYWNlKHB1YmxpY2F0aW9uTmFtZXNwYWNlVmFsdWUsIm5zMSIpOwotCQkJT01FbGVtZW50IHB1YmxpY2F0aW9uRWxlbWVudCA9IGZhY3RvcnkuY3JlYXRlT01FbGVtZW50KFB1YmxpY2F0aW9uLG5hbWVzcGFjZSk7Ci0JCQkKLQkJCWludCB2YWx1ZSA9IHIubmV4dEludCgpOwotCQkJcHVibGljYXRpb25FbGVtZW50LnNldFRleHQoSW50ZWdlci50b1N0cmluZyh2YWx1ZSkpOwotCQkJCi0JCQlPTUVsZW1lbnQgZGF0YSA9IGZhY3RvcnkuY3JlYXRlT01FbGVtZW50KCJwdWJsaXNoIixuYW1lc3BhY2UpOwotCQkJZGF0YS5hZGRDaGlsZChwdWJsaWNhdGlvbkVsZW1lbnQpOwotCQkJCi0JCQkKLQkJCXJldHVybiBkYXRhOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9mYXVsdGhhbmRsaW5nL1JFQURNRS50eHQgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2ZhdWx0aGFuZGxpbmcvUkVBRE1FLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDgwM2I1ZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2ZhdWx0aGFuZGxpbmcvUkVBRE1FLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLVNhbXBsZTogRXhjZXB0aW9uIEhhbmRsaW5nIHVzaW5nIFdTREwgRmF1bHRzDQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLQ0KLUludHJvZHVjdGlvbg0KLT09PT09PT09PT09PQ0KLQ0KLVRoaXMgc2FtcGxlIGRlbW9uc3RyYXRlcyBob3cgZXhjZXB0aW9ucyBjYW4gYmUgaGFuZGxlZCB1c2luZyBXU0RMIGZhdWx0cywgaW4gb3RoZXIgd29yZHMsIGhvdyB0byBzcGVjaWZ5IGEgV1NETCBmYXVsdCBpbiBvcmRlciB0byBhbGxvdyB5b3VyIHNlcnZpY2UgdG8gY29tbXVuaWNhdGUgZXhjZXB0aW9uIHBhdGh3YXlzIHRvIHlvdXIgY2xpZW50cy4gDQotDQotUnVubmluZyBvZiB0aGlzIHNhbXBsZSBhc3N1bWVzIHRoYXQgeW91IGFyZSBydW5uaW5nIHRoaXMgd2l0aGluIHRoZSBleHRyYWN0ZWQgcmVsZWFzZSBmb2xkZXIuDQotDQotUHJlLVJlcXVpc2l0ZXMNCi09PT09PT09PT09PT09PQ0KLUFwYWNoZSBBbnQgMS42LjIgb3IgbGF0ZXINCi0NCi0NCi1CdWlsZGluZyBUaGUgU2VydmljZQ0KLT09PT09PT09PT09PT09PT09PT09PQ0KLQ0KLSogVHlwZSBhbnQgZ2VuZXJhdGUuc2VydmljZSBvciBqdXN0IGFudCBmcm9tIEF4aXMyX0hPTUUvc2FtcGxlcy9mYXVsdGhhbmRsaW5nLg0KLSogVGhlbiBnbyB0byBBeGlzMl9IT01FL2JpbiBkaXJlY3RvcnkgYW5kIHJ1biBlaXRoZXIgYXhpczJzZXJ2ZXIuYmF0IG9yIGF4aXMyc2VydmVyLnNoIGRlcGVuZGluZyBvbiB5b3VyIHBsYXRmb3JtLg0KLQ0KLUlmIHlvdSBnbyB0byAgaHR0cDovL2xvY2FsaG9zdDo4MDgwL2F4aXMyLyB5b3Ugc2hvdWxkIHNlZSBCYW5rU2VydmljZSBpcyBkZXBsb3llZC4gDQotDQotUnVubmluZyBUaGUgQ2xpZW50DQotPT09PT09PT09PT09PT09PT09DQotDQotSW52b2tlIHRoZSBjbGllbnQvc3JjL2V4YW1wbGUvQmFua0NsaWVudC5qYXZhIGNsYXNzLiBZb3UgbWF5IHVzZSB0aGUgY29tbWFuZCBzY3JpcHRzIHRvIGRvIHNvLiBZb3UgbmVlZCB0byBzdXBwbHkgMyBwYXJhbWV0ZXJzIHRvIHRoZSBjb21tYW5kLSB1cmwsIGFjY291bnQgYW5kIGFtb3VudC4NCi0NCi0gKiBhbnQgcnVuLmNsaWVudCAtRHVybD1odHRwOi8vbG9jYWxob3N0OjgwODAvYXhpczIvc2VydmljZXMvQmFua1NlcnZpY2UgLURhY2NvdW50PTEzIC1EYW10PTQwMA0KLSAgIFRocm93cyBBY2NvdW50Tm90RXhpc3RGYXVsdE1lc3NhZ2VFeGNlcHRpb24uIFlvdSB3aWxsIHNlZSAiQWNjb3VudCMxMyBkb2VzIG5vdCBleGlzdCKgIA0KLSAqIGFudCBydW4uY2xpZW50IC1EdXJsPWh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9heGlzMi9zZXJ2aWNlcy9CYW5rU2VydmljZSAtRGFjY291bnQ9ODggLURhbXQ9MTIwMA0KLSAgIFRocm93cyBJbnN1ZmZpY2llbnRGdW5kc0ZhdWx0TWVzc2FnZUV4Y2VwdGlvbi4gWW91IHdpbGwgc2VlICJBY2NvdW50Izg4IGhhcyBiYWxhbmNlIG9mIDEwMDAuIEl0IGNhbm5vdCBzdXBwb3J0IHdpdGhkcmF3YWwgICBvZiAxMjAwIqAgDQotICogYW50IHJ1bi5jbGllbnQgLUR1cmw9aHR0cDovL2xvY2FsaG9zdDo4MDgwL2F4aXMyL3NlcnZpY2VzL0JhbmtTZXJ2aWNlIC1EYWNjb3VudD04OCAtRGFtdD00MDANCi0gICBTdWNjZWVkcyB3aXRoIGEgYmFsYW5jZSBvZiA2MDAuIFlvdSB3aWxsIHNlZSAiQmFsYW5jZSA9IDYwMCKgIA0KLQ0KLVdoZW4geW91IGNhbGwgYW50IHJ1bi5jbGllbnQgd2l0aCBwYXJhbWV0ZXJzLCBiZWZvcmUgcnVubmluZyBjbGllbnQvc3JjL2V4YW1wbGUvQmFua0NsaWVudC5qYXZhIGNsYXNzLCBpdCBkb2VzIHRoZSBmb2xsb3dpbmcgYXMgd2VsbDoNCi0gKiBHZW5lcmF0ZSB0aGUgc3R1YnMgKGZvciB0aGUgY2xpZW50KSBmcm9tIHRoZSBXU0RMDQotICogQ29tcGlsZSB0aGUgY2xpZW50IGNsYXNzZXMNCi0gKiBDcmVhdGUgYSBKYXIgb2YgdGhlIGNsaWVudCBjbGFzc2VzIGFuZCBjb3B5IGl0IHRvIGJ1aWxkL2NsaWVudC9CYW5rU2VydmljZS10ZXN0LWNsaWVudC5qYXINCi0NCi1BZHZhbmNlZCBHdWlkZQ0KLT09PT09PT09PT09PT09DQotRm9yIG1vcmUgZGV0YWlscyBraW5kbHkgc2VlIGRvYy9GYXVsdEhhbmRsaW5nU2FtcGxlR3VpZGUuaHRtbA0KLQ0KLUhlbHANCi09PT09DQotUGxlYXNlIGNvbnRhY3QgYXhpcy11c2VyIGxpc3QgKGF4aXMtdXNlckB3cy5hcGFjaGUub3JnKSBpZiB5b3UgaGF2ZSBhbnkgdHJvdWJsZSBydW5uaW5nIHRoZSBzYW1wbGUuDQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9mYXVsdGhhbmRsaW5nL2Jhbmsud3NkbCBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvZmF1bHRoYW5kbGluZy9iYW5rLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2Y2NmMzAuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9mYXVsdGhhbmRsaW5nL2Jhbmsud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/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+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9mYXVsdGhhbmRsaW5nL2J1aWxkLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvZmF1bHRoYW5kbGluZy9idWlsZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4YTg5ZjIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9mYXVsdGhhbmRsaW5nL2J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE1MiArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+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+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2ZhdWx0aGFuZGxpbmcvY2xpZW50L2J1aWxkLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvZmF1bHRoYW5kbGluZy9jbGllbnQvYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjI1NDNiLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvZmF1bHRoYW5kbGluZy9jbGllbnQvYnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08cHJvamVjdCBiYXNlZGlyPSIuIiBkZWZhdWx0PSJqYXIuY2xpZW50Ij4KLQotICAgIDxwcm9wZXJ0eSBlbnZpcm9ubWVudD0iZW52Ii8+Ci0KLSAgICA8cHJvcGVydHkgbmFtZT0icHJvamVjdC5iYXNlLmRpciIgdmFsdWU9Ii4iLz4KLSAgICA8cHJvcGVydHkgbmFtZT0icGFyZW50LmRpciIgdmFsdWU9Ii4uIi8+Ci0KLSAgICA8cHJvcGVydHkgbmFtZT0id3NkbC51cmkiIHZhbHVlPSIke3BhcmVudC5kaXJ9L2Jhbmsud3NkbCIvPgotCi0gICAgPHByb3BlcnR5IG5hbWU9InNyYyIgdmFsdWU9IiR7cHJvamVjdC5iYXNlLmRpcn0vc3JjIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9InRhcmdldCIgdmFsdWU9IiR7cHJvamVjdC5iYXNlLmRpcn0vdGFyZ2V0Ii8+Ci0gICAgPHByb3BlcnR5IG5hbWU9InRhcmdldC5qYXZhIiB2YWx1ZT0iJHt0YXJnZXR9L3NyYyIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YXJnZXQuY2xhc3NlcyIgdmFsdWU9IiR7dGFyZ2V0fS9jbGFzc2VzIi8+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9ImNoZWNrLmRlcGVuZGVuY3kiIHVubGVzcz0iZW52LkFYSVMyX0hPTUUiPgotICAgICAgICA8ZWNobyBtZXNzYWdlPSJBWElTMl9IT01FIG11c3QgYmUgc2V0Ii8+Ci0gICAgPC90YXJnZXQ+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9Imdlbi5zdHViIiBpZj0iZW52LkFYSVMyX0hPTUUiIGRlcGVuZHM9ImNoZWNrLmRlcGVuZGVuY3kiPgotICAgICAgICA8ZGVsZXRlIGRpcj0iJHt0YXJnZXR9Ii8+Ci0gICAgICAgIDxta2RpciBkaXI9IiR7dGFyZ2V0fSIvPgotICAgICAgICA8amF2YSBjbGFzc25hbWU9Im9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMMkphdmEiIGZvcms9InRydWUiPgotICAgICAgICAgICAgPGFyZyBsaW5lPSItdXJpICR7d3NkbC51cml9Ii8+Ci0gICAgICAgICAgICA8YXJnIGxpbmU9Ii11Ii8+Ci08YXJnIGxpbmU9Ii1hcCIvPgotCi0gICAgICAgICAgICA8YXJnIGxpbmU9Ii1vICR7dGFyZ2V0fSIvPgotICAgICAgICAgICAgPGNsYXNzcGF0aD4KLSAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7ZW52LkFYSVMyX0hPTUV9XGxpYiI+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIi8+Ci0gICAgICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICAgICAgPC9jbGFzc3BhdGg+Ci0gICAgICAgIDwvamF2YT4KLSAgICA8L3RhcmdldD4KLQotICAgIDwhLS0gQ3JlYXRlIHRoZSBzZXJ2aWNlIGFyY2hpdmUgYnkgZXhlY3V0aW5nIHRhcmdldFxidWlsZC54bWwgKGphci5zZXJ2ZXIpIC0tPgotICAgIDx0YXJnZXQgbmFtZT0iamFyLmNsaWVudCIgaWY9ImVudi5BWElTMl9IT01FIiBkZXBlbmRzPSJnZW4uc3R1YiI+Ci0gICAgICAgIDxjb3B5IHRvZGlyPSIke3RhcmdldC5qYXZhfSI+Ci0gICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7c3JjfSIvPgotICAgICAgICA8L2NvcHk+Ci0gICAgICAgIDxhbnQgZGlyPSIke3RhcmdldH0iLz4KLSAgICAgICAgPGNvcHkgZmlsZT0iJHt0YXJnZXR9XGJ1aWxkXGxpYlxCYW5rU2VydmljZS10ZXN0LWNsaWVudC5qYXIiIHRvZGlyPSIuLiIvPgotICAgIDwvdGFyZ2V0PgotCi08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9mYXVsdGhhbmRsaW5nL2NsaWVudC9zcmMvZXhhbXBsZS9CYW5rQ2xpZW50LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2ZhdWx0aGFuZGxpbmcvY2xpZW50L3NyYy9leGFtcGxlL0JhbmtDbGllbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZkNjE2Ni4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2ZhdWx0aGFuZGxpbmcvY2xpZW50L3NyYy9leGFtcGxlL0JhbmtDbGllbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgZXhhbXBsZTsKLQotaW1wb3J0IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbjsKLQotcHVibGljIGZpbmFsIGNsYXNzIEJhbmtDbGllbnQgewotCi0JLyoqCi0JICogSWYgYWNjb3VudCMgPT0gIjEzIiwgdGhlbiB5b3Ugd2lsbCBnZXQgYSBBY2NvdW50Tm90RXhpc3RGYXVsdC4KLQkgKiBvdGhlcndpc2UgaWYgeW91IHByb3ZpZGUgYW4gYW1vdW50ID4gMTAwMCwgeW91IHdpbGwgZ2V0IGEgSW5zdWZmaWNpZW50RnVuZEZhdWx0TWVzc2FnZUV4Y2VwdGlvbiwKLQkgKiBvdGhlcndpc2UgeW91IHdpbGwgZ2V0IGEgcmVzcG9uc2Ugd2l0aCBhIGJhbGFuY2UgZXF1YWwgdG8gMTAwMCAtIGFtb3VudFdpdGhkcmF3bi4gCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCi0JCWlmIChhcmdzLmxlbmd0aCAhPSAzKSB7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4oIlVzYWdlOiBCYW5rQ2xpZW50IC1EdXJsPTx1cmw+IC1EYWNjb3VudD08YWNjb3VudD4gLURhbXQ9PGFtb3VudD4iKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJZmluYWwgU3RyaW5nIHVybCA9IGFyZ3NbMF07Ci0JCWZpbmFsIFN0cmluZyBhY2NvdW50ID0gYXJnc1sxXTsKLQkJZmluYWwgSW50ZWdlciB3aXRoZHJhd2FsQW1vdW50ID0gbmV3IEludGVnZXIoYXJnc1syXSk7Ci0JCQotCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJXaXRoZHJhd2luZyAiICsgd2l0aGRyYXdhbEFtb3VudCArICIgZG9sbGFycyBmcm9tIGFjY291bnQjIiArIGFjY291bnQpOwotCQkKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZpbmFsIEJhbmtTZXJ2aWNlIGJhbmtTZXJ2aWNlID0gbmV3IEJhbmtTZXJ2aWNlU3R1Yih1cmwpOwotICAgICAgICAgICAgZmluYWwgV2l0aGRyYXcgd2l0aGRyYXdSZXF1ZXN0ID0gbmV3IFdpdGhkcmF3KCk7Ci0gICAgICAgICAgICB3aXRoZHJhd1JlcXVlc3Quc2V0QWNjb3VudChhY2NvdW50KTsKLSAgICAgICAgICAgIHdpdGhkcmF3UmVxdWVzdC5zZXRBbW91bnQod2l0aGRyYXdhbEFtb3VudC5pbnRWYWx1ZSgpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZmluYWwgV2l0aGRyYXdSZXNwb25zZSB3aXRoZHJhd1Jlc3BvbnNlID0gYmFua1NlcnZpY2Uud2l0aGRyYXcod2l0aGRyYXdSZXF1ZXN0KTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQmFsYW5jZSA9ICIgKyB3aXRoZHJhd1Jlc3BvbnNlLmdldEJhbGFuY2UoKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgfSBjYXRjaCAoQWNjb3VudE5vdEV4aXN0RmF1bHRNZXNzYWdlIGUpIHsKLSAgICAgICAgICAgIGZpbmFsIEFjY291bnROb3RFeGlzdEZhdWx0IGZhdWx0ID0gZS5nZXRGYXVsdE1lc3NhZ2UoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQWNjb3VudCMiICsgZmF1bHQuZ2V0QWNjb3VudCgpICsgIiBkb2VzIG5vdCBleGlzdCIpOwotICAgICAgICB9IGNhdGNoIChJbnN1ZmZpY2llbnRGdW5kRmF1bHRNZXNzYWdlIGUpIHsKLSAgICAgICAgICAgIGZpbmFsIEluc3VmZmljaWVudEZ1bmRGYXVsdCBmYXVsdCA9IGUuZ2V0RmF1bHRNZXNzYWdlKCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkFjY291bnQjIiArIGZhdWx0LmdldEFjY291bnQoKSArICIgaGFzIGJhbGFuY2Ugb2YgIiArIGZhdWx0LmdldEJhbGFuY2UoKSArICIuIEl0IGNhbm5vdCBzdXBwb3J0IHdpdGhkcmF3YWwgb2YgIiArIGZhdWx0LmdldFJlcXVlc3RlZEZ1bmQoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOyAgCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOyAKLSAgICAgICAgfQotCi0KLQkJCi0JfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9mYXVsdGhhbmRsaW5nL2RvY3MvRmF1bHRIYW5kbGluZ1NhbXBsZUd1aWRlLmh0bWwgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2ZhdWx0aGFuZGxpbmcvZG9jcy9GYXVsdEhhbmRsaW5nU2FtcGxlR3VpZGUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI2NGIxNi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2ZhdWx0aGFuZGxpbmcvZG9jcy9GYXVsdEhhbmRsaW5nU2FtcGxlR3VpZGUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+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+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2ZhdWx0aGFuZGxpbmcvc2VydmljZS9idWlsZC54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2ZhdWx0aGFuZGxpbmcvc2VydmljZS9idWlsZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxNDk4MmMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9mYXVsdGhhbmRsaW5nL3NlcnZpY2UvYnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08cHJvamVjdCBiYXNlZGlyPSIuIiBkZWZhdWx0PSJnZW4uc2tlbGV0b24iPgotCQotCTxwcm9wZXJ0eSBlbnZpcm9ubWVudD0iZW52Ii8+Ci0JCi0JPHByb3BlcnR5IG5hbWU9InByb2plY3QuYmFzZS5kaXIiIHZhbHVlPSIuIi8+Ci0JPHByb3BlcnR5IG5hbWU9InBhcmVudC5kaXIiIHZhbHVlPSIuLiIvPgotCQotCTxwcm9wZXJ0eSBuYW1lPSJ3c2RsLnVyaSIgdmFsdWU9IiR7cGFyZW50LmRpcn0vYmFuay53c2RsIi8+Ci0JCi0JPHByb3BlcnR5IG5hbWU9InNyYyIgdmFsdWU9IiR7cHJvamVjdC5iYXNlLmRpcn0vc3JjIi8+Ci0JPHByb3BlcnR5IG5hbWU9InRhcmdldCIgdmFsdWU9IiR7cHJvamVjdC5iYXNlLmRpcn0vdGFyZ2V0Ii8+Ci0JCi0JPHRhcmdldCBuYW1lPSJjaGVjay5kZXBlbmRlbmN5IiB1bmxlc3M9ImVudi5BWElTMl9IT01FIj4KLQkJPGVjaG8gbWVzc2FnZT0iQVhJUzJfSE9NRSBtdXN0IGJlIHNldCIvPgotCTwvdGFyZ2V0PgotCQotCTx0YXJnZXQgbmFtZT0iZ2VuLnNrZWxldG9uIiBpZj0iZW52LkFYSVMyX0hPTUUiIGRlcGVuZHM9ImNoZWNrLmRlcGVuZGVuY3kiPgotCi0KLSAgICAgICAgPGRlbGV0ZSBkaXI9IiR7dGFyZ2V0fSIvPgotCQk8bWtkaXIgZGlyPSIke3RhcmdldH0iLz4KLQkJPGphdmEgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmF4aXMyLndzZGwuV1NETDJKYXZhIiBmb3JrPSJ0cnVlIj4KLQkJCTxhcmcgbGluZT0iLXVyaSAke3dzZGwudXJpfSIvPgotCQkJPGFyZyBsaW5lPSItc3MiLz4KLQkJCTxhcmcgbGluZT0iLXNkIi8+Ci0JCQk8YXJnIGxpbmU9Ii1vICR7dGFyZ2V0fSIvPiA8IS0tIE91dHB1dCBkaXJlY3RvcnkgaW4gd2hpY2ggdG8gZ2VuZXJhdGUgZmlsZXMgLS0+IDwhLS0gTkIgaXQgZ2VuZXJhdGVzIHRvIHRoZSBzcmMgZm9sZGVyIHVuZGVyIHRoaXMgZGlyZWN0b3J5ISEgLS0+Ci0JCQk8Y2xhc3NwYXRoPgotCQkJCTxmaWxlc2V0IGRpcj0iJHtlbnYuQVhJUzJfSE9NRX1cbGliIj4KLQkJCQkJPGluY2x1ZGUgbmFtZT0iKi5qYXIiLz4KLQkJCQk8L2ZpbGVzZXQ+Ci0JCQk8L2NsYXNzcGF0aD4KLQkJPC9qYXZhPgotCTwvdGFyZ2V0PgotCQotCTwhLS0gQ3JlYXRlIHRoZSBzZXJ2aWNlIGFyY2hpdmUgYnkgZXhlY3V0aW5nIHRhcmdldFxidWlsZC54bWwgKGphci5zZXJ2ZXIpIC0tPgotCTx0YXJnZXQgbmFtZT0iamFyLnNlcnZlciIgaWY9ImVudi5BWElTMl9IT01FIj4KLQkJPGFudCBkaXI9IiR7dGFyZ2V0fSIvPgotCQk8Y29weSBmaWxlPSIke3RhcmdldH1cYnVpbGRcbGliXEJhbmtTZXJ2aWNlLmFhciIgdG9kaXI9Ii4uIi8+Ci0JPC90YXJnZXQ+Ci08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9mYXVsdGhhbmRsaW5nL3NlcnZpY2Uvc3JjL2V4YW1wbGUvQmFua1NlcnZpY2VTa2VsZXRvbi5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9mYXVsdGhhbmRsaW5nL3NlcnZpY2Uvc3JjL2V4YW1wbGUvQmFua1NlcnZpY2VTa2VsZXRvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTE1YTQyLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvZmF1bHRoYW5kbGluZy9zZXJ2aWNlL3NyYy9leGFtcGxlL0JhbmtTZXJ2aWNlU2tlbGV0b24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLQotICAgIC8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSAgICAvKioKLSAgICAgKiBCYW5rU2VydmljZVNrZWxldG9uLmphdmEKLSAgICAgKgotICAgICAqLwotICAgIHBhY2thZ2UgZXhhbXBsZTsKLSAgICAvKioKLSAgICAgKiAgQmFua1NlcnZpY2VTa2VsZXRvbiBqYXZhIHNrZWxldG9uIGZvciB0aGUgYXhpc1NlcnZpY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgY2xhc3MgQmFua1NlcnZpY2VTa2VsZXRvbnsKLQotCi0gICAgICAgIC8qKgotCi0gICAgICAgICAgKiBAcGFyYW0gcGFyYW0wCi0KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyAgZXhhbXBsZS5XaXRoZHJhd1Jlc3BvbnNlIHdpdGhkcmF3KGV4YW1wbGUuV2l0aGRyYXcgcGFyYW0wKQotICAgICAgICAgICB0aHJvd3MgSW5zdWZmaWNpZW50RnVuZEZhdWx0TWVzc2FnZSxBY2NvdW50Tm90RXhpc3RGYXVsdE1lc3NhZ2V7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGFjY291bnQgPSBwYXJhbTAuZ2V0QWNjb3VudCgpOwotICAgICAgICBpZiAoYWNjb3VudC5lcXVhbHMoIjEzIikpIHsKLSAgICAgICAgICAgIGZpbmFsIEFjY291bnROb3RFeGlzdEZhdWx0IGZhdWx0ID0gbmV3IEFjY291bnROb3RFeGlzdEZhdWx0KCk7Ci0gICAgICAgICAgICBmYXVsdC5zZXRBY2NvdW50KGFjY291bnQpOwotICAgICAgICAgICAgQWNjb3VudE5vdEV4aXN0RmF1bHRNZXNzYWdlIG1lc3NhZ2VFeGNlcHRpb24gPSBuZXcgQWNjb3VudE5vdEV4aXN0RmF1bHRNZXNzYWdlKCJBY2NvdW50IGRvZXMgbm90IGV4aXN0ISIpOwotICAgICAgICAgICAgbWVzc2FnZUV4Y2VwdGlvbi5zZXRGYXVsdE1lc3NhZ2UoZmF1bHQpOwotICAgICAgICAgICAgdGhyb3cgbWVzc2FnZUV4Y2VwdGlvbjsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIGludCBhbW91bnQgPSBwYXJhbTAuZ2V0QW1vdW50KCk7Ci0gICAgICAgIGlmIChhbW91bnQgPiAxMDAwKSB7Ci0gICAgICAgICAgICBmaW5hbCBJbnN1ZmZpY2llbnRGdW5kRmF1bHQgZmF1bHQgPSBuZXcgSW5zdWZmaWNpZW50RnVuZEZhdWx0KCk7Ci0gICAgICAgICAgICBmYXVsdC5zZXRBY2NvdW50KGFjY291bnQpOwotICAgICAgICAgICAgZmF1bHQuc2V0QmFsYW5jZSgxMDAwKTsKLSAgICAgICAgICAgIGZhdWx0LnNldFJlcXVlc3RlZEZ1bmQoYW1vdW50KTsKLSAgICAgICAgICAgIEluc3VmZmljaWVudEZ1bmRGYXVsdE1lc3NhZ2UgbWVzc2FnZUV4Y2VwdGlvbiA9IG5ldyBJbnN1ZmZpY2llbnRGdW5kRmF1bHRNZXNzYWdlKCJJbnN1ZmZpY2llbnQgZnVuZHMiKTsKLSAgICAgICAgICAgIG1lc3NhZ2VFeGNlcHRpb24uc2V0RmF1bHRNZXNzYWdlKGZhdWx0KTsKLSAgICAgICAgICAgIHRocm93IG1lc3NhZ2VFeGNlcHRpb247Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBXaXRoZHJhd1Jlc3BvbnNlIHJlc3BvbnNlID0gbmV3IFdpdGhkcmF3UmVzcG9uc2UoKTsKLSAgICAgICAgcmVzcG9uc2Uuc2V0QmFsYW5jZSgxMDAwIC0gYW1vdW50KTsKLSAgICAgICAgcmV0dXJuIHJlc3BvbnNlOwotICAgICAgICB9Ci0KLSAgICB9Ci0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvZ29vZ2xlc3BlbGxjaGVjay9SRUFETUUudHh0IGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9nb29nbGVzcGVsbGNoZWNrL1JFQURNRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NDc2M2YuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9nb29nbGVzcGVsbGNoZWNrL1JFQURNRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi1TYW1wbGU6IEdvb2dsZSBTcGVsbCBDaGVja2VyDQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0NCi1JbnRyb2R1Y3Rpb24NCi09PT09PT09PT09PT0NCi0NCi1UaGlzIGV4YW1wbGUgZGVtb25zdHJhdGVzIHRoZSB1c2Ugb2YgYXN5bmNocm9ub3VzIFdlYiBtZXRob2QgaW52b2NhdGlvbnMuIFRoZSB1c2VyIGNhbiBjb250aW51ZSB0byB0eXBlIA0KLXRleHQgb24gdGhlIHRleHQgZWRpdG9yIHdoZXJlIHRoZSB0ZXh0IGVkaXRvciBkb2VzIHRoZSBzcGVsbCBjaGVjayBmcm9tIGEgaG9zdGVkIFdlYiBzZXJ2aWNlLiBUaGUgV2ViIA0KLW1ldGhvZCBpbnZvY2F0aW9uIGlzIGNhcnJpZWQgb3V0IGluIGFuIGFzeW5jaHJvbm91cyBtYW5uZXIgYWxsb3dpbmcgdGhlIHVzZXIgdG8gY29udGludW91c2x5IHR5cGUgdGV4dCANCi13aXRob3V0IGhhdmluZyB0byBzdGFsbCBmb3IgdGhlIHJlc3BvbnNlLg0KLQ0KLQ0KLVByZS1SZXF1aXNpdGVzDQotPT09PT09PT09PT09PT0NCi0NCi1BcGFjaGUgQW50IDEuNi4yIG9yIGxhdGVyDQotDQotDQotUnVubmluZyBUaGUgU2FtcGxlDQotPT09PT09PT09PT09PT09PT09DQotDQotVG8gZ2VuZXJhdGUgc3R1YnMgYW5kIHJ1biB0aGUgdGV4dCBlZGl0b3IsIHR5cGUgYW50Lg0KLQ0KLU5vdGUgdGhhdCB3aGVuIHJ1bm5pbmcgdGhlIGJ1aWxkIHNjcmlwdCwgYSBzdHViIGlzIGdlbmVyYXRlZCBmb3IgdGhlIGhvc3RlZCBzcGVsbCBjaGVjayBzZXJ2aWNlIGF0Og0KLWh0dHA6Ly90b29scy53c28yLm5ldDoxMjAwMS9heGlzMi9zZXJ2aWNlcy9TaW1wbGlmaWVkU3BlbGxDaGVjaz93c2RsDQotDQotTi5CLjogVGhpcyBwdWJsaWMgV2ViIHNlcnZpY2UgdXNlcyBHb29nbGUgV2ViIEFQSXMgdG8gcHJvdmlkZSBzcGVsbCBjaGVjayBzZXJ2aWNlLiBJbiBjYXNlIG9mIGENCi1mYWlsdXJlIFNpbXBsaWZpZWRTcGVsbENoZWNrIGVjaG8gc2VuZHMgYmFjayB0aGUgcGhyYXNlIChzZW50IGZvciBzcGVsbCBjaGVjaykgaW5zdGVhZCBvZiB0aHJvd2luZw0KLWFuIGVycm9yLiBUaGVyZWZvcmUsIGlmIHRoZSBzcGVsbCBjaGVjayBlZGl0b3IganVzdCBvdXRwdXRzIHRoZSBpbnB1dCB3b3Jkcy9waHJhc2UsIHRoYXQgaXMgYmVjYXVzZQ0KLW9mIHRoaXMgYmVoYXZpb3Igb2YgdGhlIFNpbXBsaWZpZWRTcGVsbENoZWNrIHNlcnZpY2UuDQotDQotSGVscA0KLT09PT0NCi1QbGVhc2UgY29udGFjdCBheGlzLXVzZXIgbGlzdCAoYXhpcy11c2VyQHdzLmFwYWNoZS5vcmcpIGlmIHlvdSBoYXZlIGFueSB0cm91YmxlIHJ1bm5pbmcgdGhlIHNhbXBsZS4NCi0NCi0NCi0NCi0NCi0NCi0NCi0NCi0NCi0NCi0NCi0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2dvb2dsZXNwZWxsY2hlY2svYnVpbGQueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9nb29nbGVzcGVsbGNoZWNrL2J1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJlYWM5NS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2dvb2dsZXNwZWxsY2hlY2svYnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHByb2plY3QgbmFtZT0iZ29vZ2xlc3BlbGxjaGVjayIgYmFzZWRpcj0iLiIgZGVmYXVsdD0icnVuLmNsaWVudCI+Ci0JCi0JPHByb3BlcnR5IG5hbWU9IndzZGwiIHZhbHVlPSJodHRwOi8vdG9vbHMud3NvMi5uZXQ6MTIwMDEvYXhpczIvc2VydmljZXMvU2ltcGxpZmllZFNwZWxsQ2hlY2s/d3NkbCIgLz4KLQkKLQk8cHJvcGVydHkgbmFtZT0iZGVzdC5kaXIiIHZhbHVlPSJidWlsZCIgLz4KLQkKLQk8cHJvcGVydHkgbmFtZT0iZGVzdC5kaXIuY2xhc3NlcyIgdmFsdWU9IiR7ZGVzdC5kaXJ9L2NsYXNzZXMiIC8+Ci0JCi0JPHByb3BlcnR5IG5hbWU9ImRlc3QuZGlyLmxpYiIgdmFsdWU9IiR7ZGVzdC5kaXJ9L2xpYiIgLz4KLQkKLQk8cHJvcGVydHkgbmFtZT0iYXhpczIuaG9tZSIgdmFsdWU9Ii4uLy4uLyIgLz4KLQkKLQk8cGF0aCBpZD0iY2xpZW50LmNsYXNzLnBhdGgiPgotCQk8ZmlsZXNldCBkaXI9IiR7YXhpczIuaG9tZX0vbGliIj4KLQkJCTxpbmNsdWRlIG5hbWU9IiouamFyIiAvPgotCQk8L2ZpbGVzZXQ+Ci0JCTxmaWxlc2V0IGRpcj0iJHtkZXN0LmRpci5saWJ9IiBpbmNsdWRlcz0iKi5qYXIiIC8+Ci0JPC9wYXRoPgotCQotCTxwYXRoIGlkPSJidWlsZC5jbGFzcy5wYXRoIj4KLQkJPGZpbGVzZXQgZGlyPSIke2F4aXMyLmhvbWV9L2xpYiI+Ci0JCQk8aW5jbHVkZSBuYW1lPSIqLmphciIgLz4KLQkJPC9maWxlc2V0PgotCTwvcGF0aD4KLQkKLQk8dGFyZ2V0IG5hbWU9ImNsZWFuIj4KLQkJCi0JCTxkZWxldGUgZGlyPSIke2Rlc3QuZGlyfSIgLz4KLQkJCi0JCTxkZWxldGUgZGlyPSJzcmMiIGluY2x1ZGVzPSJzYW1wbGUvc3BlbGxjaGVjay9zdHViLyoqIi8+Ci0JCi0JPC90YXJnZXQ+Ci0JCi0JPHRhcmdldCBuYW1lPSJwcmVwYXJlIj4KLQkJCi0JCTxta2RpciBkaXI9IiR7ZGVzdC5kaXJ9IiAvPgotCQkKLQkJPG1rZGlyIGRpcj0iJHtkZXN0LmRpci5jbGFzc2VzfSIgLz4KLQkJCi0JCTxta2RpciBkaXI9IiR7ZGVzdC5kaXIubGlifSIgLz4KLQkKLQk8L3RhcmdldD4KLQkKLQk8dGFyZ2V0IG5hbWU9InJ1bi5jbGllbnQiIGRlcGVuZHM9ImNsZWFuLHByZXBhcmUiPgotCQotCQk8YW50Y2FsbCB0YXJnZXQ9ImNsaWVudC5jb2RlZ2VuLXN0dWIiPgotCQkJPHBhcmFtIG5hbWU9IndzZGwiIHZhbHVlPSIke3dzZGx9Ii8+Ci0JCTwvYW50Y2FsbD4KLQkJCi0JCTxhbnRjYWxsIHRhcmdldD0iY2xpZW50LmNvbXBpbGUiIC8+Ci0JCQotCQk8YW50Y2FsbCB0YXJnZXQ9ImNsaWVudC5qYXIiIC8+Ci0JCQotCQk8YW50Y2FsbCB0YXJnZXQ9ImNsaWVudC5ydW4iIC8+CQotCTwvdGFyZ2V0PgotCQotCTx0YXJnZXQgbmFtZT0iY2xpZW50LmNvZGVnZW4tc3R1YiI+Ci0JCi0JCTxqYXZhIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5heGlzMi53c2RsLldTREwySmF2YSI+Ci0JCQk8YXJnIHZhbHVlPSItdXJpIiAvPgotCQkJPGFyZyB2YWx1ZT0iJHt3c2RsfSIgLz4KLQkJCTxhcmcgdmFsdWU9Ii1wIiAvPgotCQkJPGFyZyB2YWx1ZT0ic2FtcGxlLnNwZWxsY2hlY2suc3R1YiIgLz4KLQkJCTxhcmcgdmFsdWU9Ii1vIiAvPgotCQkJPGFyZyB2YWx1ZT0ic3JjIiAvPgotCQkJPGFyZyB2YWx1ZT0iLWYiLz4KLQkJCTxjbGFzc3BhdGggcmVmaWQ9ImJ1aWxkLmNsYXNzLnBhdGgiIC8+Ci0JCTwvamF2YT4KLQkKLQk8L3RhcmdldD4KLQkKLQk8dGFyZ2V0IG5hbWU9ImNsaWVudC5jb21waWxlIj4KLQkJCi0JCTxqYXZhYyBzcmNkaXI9InNyYyIgZGVzdGRpcj0iJHtkZXN0LmRpci5jbGFzc2VzfSI+Ci0JCQk8Y2xhc3NwYXRoIHJlZmlkPSJidWlsZC5jbGFzcy5wYXRoIiAvPgotCQk8L2phdmFjPgotCQotCTwvdGFyZ2V0PgotCQotCTx0YXJnZXQgbmFtZT0iY2xpZW50LmphciI+Ci0JCQotCQk8amFyIGJhc2VkaXI9IiR7ZGVzdC5kaXIuY2xhc3Nlc30iIGRlc3RmaWxlPSIke2Rlc3QuZGlyLmxpYn0vZWRpdG9yLmphciIgLz4KLQkKLQk8L3RhcmdldD4KLQkKLQk8dGFyZ2V0IG5hbWU9ImNsaWVudC5ydW4iPgotCQotCQk8amF2YSBjbGFzc25hbWU9InNhbXBsZS5zcGVsbGNoZWNrLmVkaXRvci5TdWdnZXN0aW9uRm9ybSIgZm9yaz0idHJ1ZSI+Ci0JCQk8Y2xhc3NwYXRoIHJlZmlkPSJjbGllbnQuY2xhc3MucGF0aCIgLz4KLQkJPC9qYXZhPgotCQkKLQk8L3RhcmdldD4KLQotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvZ29vZ2xlc3BlbGxjaGVjay9zcmMvc2FtcGxlL3NwZWxsY2hlY2svZWRpdG9yL0FzeW5jUGFuZWwuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvZ29vZ2xlc3BlbGxjaGVjay9zcmMvc2FtcGxlL3NwZWxsY2hlY2svZWRpdG9yL0FzeW5jUGFuZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODRjMDUxNi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2dvb2dsZXNwZWxsY2hlY2svc3JjL3NhbXBsZS9zcGVsbGNoZWNrL2VkaXRvci9Bc3luY1BhbmVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBzYW1wbGUuc3BlbGxjaGVjay5lZGl0b3I7Ci0KLWltcG9ydCBqYXZhLmF3dC5Db2xvcjsKLWltcG9ydCBqYXZhLmF3dC5HcmlkQmFnQ29uc3RyYWludHM7Ci1pbXBvcnQgamF2YS5hd3QuR3JpZEJhZ0xheW91dDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5LZXlFdmVudDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5LZXlMaXN0ZW5lcjsKLQotaW1wb3J0IGphdmF4LnN3aW5nLkpTY3JvbGxQYW5lOwotaW1wb3J0IGphdmF4LnN3aW5nLkpUZXh0QXJlYTsKLWltcG9ydCBqYXZheC5zd2luZy5KVGV4dEZpZWxkOwotCi0vKioKLSAqIGNsYXNzIHNhbXBsZS5nb29nbGUuc3BlbGxjaGVjay5Bc3luY1BhbmVsCi0gKiBUaGlzIEltcGVtZW50cyBpdHMgb3duIEdVSSBvZiB0aGUgQXN5bmNocm9ub3VzIENsaWVudCBhbmQgaXQgdXBkYXRlcyB0aGUgc3RyaW5nIGFmdGVyIGdldHRpbmcgdGhlIHJlc3BvbnNlIHRvIHRleHRhcmVhCi0gKi8KLXB1YmxpYyBjbGFzcyBBc3luY1BhbmVsIGV4dGVuZHMgamF2YXguc3dpbmcuSlBhbmVsIGltcGxlbWVudHMgT2JzZXJ2ZXIsCi0gICAgICAgIEtleUxpc3RlbmVyIHsKLSAgICBGb3JtTW9kZWwgZm9ybU1vZGVsOwotICAgIEpUZXh0QXJlYSB3cml0aW5nVGV4dEFyZWE7Ci0gICAgSlRleHRBcmVhIGRpc3BsYXlUZXh0QXJlYTsKLSAgICBKVGV4dEZpZWxkIGVycm9yTWVzc2FnZUZpZWxkOwotCi0gICAgcHVibGljIEFzeW5jUGFuZWwoKSB7Ci0gICAgICAgIEdyaWRCYWdMYXlvdXQgZ2JMYXlvdXQgPSBuZXcgR3JpZEJhZ0xheW91dCgpOwotICAgICAgICBHcmlkQmFnQ29uc3RyYWludHMgY29uc3RyYWludCA9IG5ldyBHcmlkQmFnQ29uc3RyYWludHMoKTsKLSAgICAgICAgdGhpcy5zZXRMYXlvdXQoZ2JMYXlvdXQpOwotCi0gICAgICAgIGZvcm1Nb2RlbCA9IG5ldyBGb3JtTW9kZWwodGhpcyk7Ci0KLSAgICAgICAgd3JpdGluZ1RleHRBcmVhID0gbmV3IEpUZXh0QXJlYSgpOwotICAgICAgICB3cml0aW5nVGV4dEFyZWEuc2V0TGluZVdyYXAodHJ1ZSk7Ci0KLSAgICAgICAgZGlzcGxheVRleHRBcmVhID0gbmV3IEpUZXh0QXJlYSgpOwotICAgICAgICBkaXNwbGF5VGV4dEFyZWEuc2V0RWRpdGFibGUoZmFsc2UpOwotICAgICAgICBkaXNwbGF5VGV4dEFyZWEuc2V0TGluZVdyYXAodHJ1ZSk7Ci0KLSAgICAgICAgZXJyb3JNZXNzYWdlRmllbGQgPSBuZXcgSlRleHRGaWVsZCgpOwotICAgICAgICBlcnJvck1lc3NhZ2VGaWVsZC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0gICAgICAgIGVycm9yTWVzc2FnZUZpZWxkLnNldEJhY2tncm91bmQoQ29sb3IuTElHSFRfR1JBWSk7Ci0gICAgICAgIGVycm9yTWVzc2FnZUZpZWxkLnNldEZvcmVncm91bmQoQ29sb3IuUkVEKTsKLQotICAgICAgICBKU2Nyb2xsUGFuZSBzY3JvbGxQYW5lR2V0ID0gbmV3IEpTY3JvbGxQYW5lKHdyaXRpbmdUZXh0QXJlYSk7Ci0gICAgICAgIEpTY3JvbGxQYW5lIHNjcm9sbFBhbmVTZXQgPSBuZXcgSlNjcm9sbFBhbmUoZGlzcGxheVRleHRBcmVhKTsKLQotICAgICAgICB3cml0aW5nVGV4dEFyZWEuc2V0VGV4dCgiRW50ZXIgYSBTdHJpbmciKTsKLSAgICAgICAgd3JpdGluZ1RleHRBcmVhLmFkZEtleUxpc3RlbmVyKHRoaXMpOwotCi0gICAgICAgIGNvbnN0cmFpbnQuZmlsbCA9IEdyaWRCYWdDb25zdHJhaW50cy5CT1RIOwotICAgICAgICBjb25zdHJhaW50LmdyaWR4ID0gMDsKLSAgICAgICAgY29uc3RyYWludC53ZWlnaHR4ID0gMTsKLSAgICAgICAgY29uc3RyYWludC53ZWlnaHR5ID0gODsKLSAgICAgICAgZ2JMYXlvdXQuc2V0Q29uc3RyYWludHMoc2Nyb2xsUGFuZUdldCwgY29uc3RyYWludCk7Ci0gICAgICAgIHRoaXMuYWRkKHNjcm9sbFBhbmVHZXQpOwotICAgICAgICBnYkxheW91dC5zZXRDb25zdHJhaW50cyhzY3JvbGxQYW5lU2V0LCBjb25zdHJhaW50KTsKLSAgICAgICAgdGhpcy5hZGQoc2Nyb2xsUGFuZVNldCk7Ci0gICAgICAgIGNvbnN0cmFpbnQud2VpZ2h0eSA9IDE7Ci0gICAgICAgIGdiTGF5b3V0LnNldENvbnN0cmFpbnRzKGVycm9yTWVzc2FnZUZpZWxkLCBjb25zdHJhaW50KTsKLSAgICAgICAgdGhpcy5hZGQoZXJyb3JNZXNzYWdlRmllbGQpOwotCi0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB1cGRhdGUoU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgZGlzcGxheVRleHRBcmVhLnNldFRleHQoZGlzcGxheVRleHRBcmVhLmdldFRleHQoKSArICIgIiArIG1lc3NhZ2UpOwotICAgIH0KLQotICAgIC8vdXBkYXRlcyB0aGUgZXJyb3IgbWVzc2FnZSB0byB0aGUgZXJyb3IgbWVzc2FnZSBkaXNwbGF5IGFyZWEKLSAgICBwdWJsaWMgdm9pZCB1cGRhdGVFcnJvcihTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBlcnJvck1lc3NhZ2VGaWVsZC5zZXRUZXh0KG1lc3NhZ2UpOwotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBlKSB7Ci0gICAgICAgIGludCBrZXkgPSBlLmdldEtleUNoYXIoKTsKLSAgICAgICAgaWYgKChrZXkgPT0gS2V5RXZlbnQuVktfU1BBQ0UpIHx8IChrZXkgPT0gS2V5RXZlbnQuVktfRU5URVIpKSB7Ci0gICAgICAgICAgICBTdHJpbmdbXSB3b3JkcyA9IHdyaXRpbmdUZXh0QXJlYS5nZXRUZXh0KCkuc3BsaXQoIlxccyIpOwotICAgICAgICAgICAgaWYgKHdvcmRzLmxlbmd0aCA+IDApCi0gICAgICAgICAgICAgICAgZm9ybU1vZGVsLmRvQXN5bmNTcGVsbGluZ1N1Z2dlc3Rpb24od29yZHNbd29yZHMubGVuZ3RoIC0gMV0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQga2V5UmVsZWFzZWQoS2V5RXZlbnQgZSkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGtleVR5cGVkKEtleUV2ZW50IGUpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKLSAgICAgICAgZGlzcGxheVRleHRBcmVhLnNldFRleHQoIiIpOwotICAgICAgICB3cml0aW5nVGV4dEFyZWEuc2V0VGV4dCgiIik7Ci0gICAgICAgIGVycm9yTWVzc2FnZUZpZWxkLnNldFRleHQoIiIpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvZ29vZ2xlc3BlbGxjaGVjay9zcmMvc2FtcGxlL3NwZWxsY2hlY2svZWRpdG9yL0Zvcm1Nb2RlbC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9nb29nbGVzcGVsbGNoZWNrL3NyYy9zYW1wbGUvc3BlbGxjaGVjay9lZGl0b3IvRm9ybU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExZmExN2MuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9nb29nbGVzcGVsbGNoZWNrL3NyYy9zYW1wbGUvc3BlbGxjaGVjay9lZGl0b3IvRm9ybU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIHNhbXBsZS5zcGVsbGNoZWNrLmVkaXRvcjsKLQotaW1wb3J0IHNhbXBsZS5zcGVsbGNoZWNrLnN0dWIuU2ltcGxpZmllZFNwZWxsQ2hlY2tTdHViOwotaW1wb3J0IHNhbXBsZS5zcGVsbGNoZWNrLnN0dWIuU2ltcGxpZmllZFNwZWxsQ2hlY2tTdHViLkRvU3BlbGxpbmdTdWdnZXN0aW9uczsKLWltcG9ydCBzYW1wbGUuc3BlbGxjaGVjay5zdHViLlNpbXBsaWZpZWRTcGVsbENoZWNrU3R1Yi5Eb1NwZWxsaW5nU3VnZ2VzdGlvbnNSZXNwb25zZTsKLQotLyoqCi0gKiBjbGFzcyBzYW1wbGUuZ29vZ2xlLnNwZWxsY2hlY2suRm9ybU1vZGVsCi0gKiBUaGlzIGlzIHRoZSBJbXBlbWVudGF0aW9uIG9mIHRoZSBBc3luY2hyb25vdXMgQ2xpZW50Ci0gKi8KLXB1YmxpYyBjbGFzcyBGb3JtTW9kZWwgewotICAgIE9ic2VydmVyIG9ic2VydmVyOwotICAgCi0gICAgcHVibGljIEZvcm1Nb2RlbChPYnNlcnZlciBvYnNlcnZlcikgewotICAgICAgICB0aGlzLm9ic2VydmVyID0gb2JzZXJ2ZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZG9Bc3luY1NwZWxsaW5nU3VnZ2VzdGlvbihTdHJpbmcgd29yZCkgewotICAgICAgICAgICAgICAgCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFNpbXBsaWZpZWRTcGVsbENoZWNrU3R1YiBzdHViID0gbmV3IFNpbXBsaWZpZWRTcGVsbENoZWNrU3R1YigpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBEb1NwZWxsaW5nU3VnZ2VzdGlvbnMgZG9TcGVsbGluZ1N1Z2dlc3Rpb25zID0gbmV3IERvU3BlbGxpbmdTdWdnZXN0aW9ucygpOwotICAgICAgICAgICAgZG9TcGVsbGluZ1N1Z2dlc3Rpb25zLnNldFBocmFzZSh3b3JkKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgU2ltcGxpZmllZFNwZWxsQ2hlY2tDYWxsYmFja0hhbmRsZXJJbXBsIGNhbGxiYWNrSGFuZGxlckltcGwgPSBuZXcgU2ltcGxpZmllZFNwZWxsQ2hlY2tDYWxsYmFja0hhbmRsZXJJbXBsKG9ic2VydmVyLCB3b3JkKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgc3R1Yi5zdGFydGRvU3BlbGxpbmdTdWdnZXN0aW9ucyhkb1NwZWxsaW5nU3VnZ2VzdGlvbnMsIGNhbGxiYWNrSGFuZGxlckltcGwpOwotICAgICAgICAKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBvYnNlcnZlci51cGRhdGVFcnJvcihleC5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZG9TeW5jU3BlbGxpbmdTdWdnZXN0aW9uKFN0cmluZyB3b3JkKSB7Ci0gICAgICAgIAotICAgICAgICB0cnkgewotICAgICAgICAgICAgU2ltcGxpZmllZFNwZWxsQ2hlY2tTdHViIHN0dWIgPSBuZXcgU2ltcGxpZmllZFNwZWxsQ2hlY2tTdHViKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIERvU3BlbGxpbmdTdWdnZXN0aW9ucyBzdWdnZXN0aW9ucyA9IG5ldyBEb1NwZWxsaW5nU3VnZ2VzdGlvbnMoKTsKLSAgICAgICAgICAgIHN1Z2dlc3Rpb25zLnNldFBocmFzZSh3b3JkKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgRG9TcGVsbGluZ1N1Z2dlc3Rpb25zUmVzcG9uc2UgcmVzcG9uc2UgPSBzdHViLmRvU3BlbGxpbmdTdWdnZXN0aW9ucyhzdWdnZXN0aW9ucyk7Ci0gICAgICAgICAgICBTdHJpbmcgc3VnZ2VzdGlvbiA9IHJlc3BvbnNlLmdldF9yZXR1cm4oKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKHN1Z2dlc3Rpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG9ic2VydmVyLnVwZGF0ZSgiTm8gc3VnZ2VzdGlvbnMgZm91bmQgZm9yICIgKyB3b3JkKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIH0gZWxzZSAgewotICAgICAgICAgICAgICAgIG9ic2VydmVyLnVwZGF0ZShzdWdnZXN0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIG9ic2VydmVyLnVwZGF0ZUVycm9yKGV4LmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2dvb2dsZXNwZWxsY2hlY2svc3JjL3NhbXBsZS9zcGVsbGNoZWNrL2VkaXRvci9PYnNlcnZlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9nb29nbGVzcGVsbGNoZWNrL3NyYy9zYW1wbGUvc3BlbGxjaGVjay9lZGl0b3IvT2JzZXJ2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRiODNjNi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2dvb2dsZXNwZWxsY2hlY2svc3JjL3NhbXBsZS9zcGVsbGNoZWNrL2VkaXRvci9PYnNlcnZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBzYW1wbGUuc3BlbGxjaGVjay5lZGl0b3I7Ci0KLQotLyoqCi0gKiBpbnRlcmZhY2Ugc2FtcGxlLmdvb2dsZS5zcGVsbGNoZWNrLk9ic2VydmVyCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT2JzZXJ2ZXIgewotICAgIC8vIHVwZGF0ZXMgdGhlIG1lc3NhZ2UgdG8gdGhlIG1haW4gdGVzdCBkaXNwbGF5IGFyZWEKLSAgICBwdWJsaWMgdm9pZCB1cGRhdGUoU3RyaW5nIG1lc3NhZ2UpOwotCi0gICAgLy91cGRhdGVzIHRoZSBlcnJvciBtZXNzYWdlIHRvIHRoZSBlcnJvciBtZXNzYWdlIGRpc3BsYXkgYXJlYQotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUVycm9yKFN0cmluZyBtZXNzYWdlKTsKLQotICAgIHB1YmxpYyB2b2lkIGNsZWFyKCk7Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2dvb2dsZXNwZWxsY2hlY2svc3JjL3NhbXBsZS9zcGVsbGNoZWNrL2VkaXRvci9TaW1wbGlmaWVkU3BlbGxDaGVja0NhbGxiYWNrSGFuZGxlckltcGwuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvZ29vZ2xlc3BlbGxjaGVjay9zcmMvc2FtcGxlL3NwZWxsY2hlY2svZWRpdG9yL1NpbXBsaWZpZWRTcGVsbENoZWNrQ2FsbGJhY2tIYW5kbGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjcyNTdhLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvZ29vZ2xlc3BlbGxjaGVjay9zcmMvc2FtcGxlL3NwZWxsY2hlY2svZWRpdG9yL1NpbXBsaWZpZWRTcGVsbENoZWNrQ2FsbGJhY2tIYW5kbGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugc2FtcGxlLnNwZWxsY2hlY2suZWRpdG9yOwotCi1pbXBvcnQgc2FtcGxlLnNwZWxsY2hlY2suc3R1Yi5TaW1wbGlmaWVkU3BlbGxDaGVja0NhbGxiYWNrSGFuZGxlcjsKLWltcG9ydCBzYW1wbGUuc3BlbGxjaGVjay5zdHViLlNpbXBsaWZpZWRTcGVsbENoZWNrU3R1Yi5Eb1NwZWxsaW5nU3VnZ2VzdGlvbnNSZXNwb25zZTsKLQotcHVibGljIGNsYXNzIFNpbXBsaWZpZWRTcGVsbENoZWNrQ2FsbGJhY2tIYW5kbGVySW1wbCBleHRlbmRzIFNpbXBsaWZpZWRTcGVsbENoZWNrQ2FsbGJhY2tIYW5kbGVyIHsKLQotICAgIHByaXZhdGUgT2JzZXJ2ZXIgb2JzZXJ2ZXIgPSBudWxsOwotICAgIHByaXZhdGUgU3RyaW5nIHBocmFzZSA9IG51bGw7Ci0gICAgCi0gICAgcHVibGljIFNpbXBsaWZpZWRTcGVsbENoZWNrQ2FsbGJhY2tIYW5kbGVySW1wbChPYnNlcnZlciBvYnNlcnZlciwgU3RyaW5nIHBocmFzZSkgewotICAgICAgICB0aGlzLm9ic2VydmVyID0gb2JzZXJ2ZXI7Ci0gICAgICAgIHRoaXMucGhyYXNlID0gcGhyYXNlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCByZWNlaXZlUmVzdWx0ZG9TcGVsbGluZ1N1Z2dlc3Rpb25zKERvU3BlbGxpbmdTdWdnZXN0aW9uc1Jlc3BvbnNlIHBhcmFtMSkgewotICAgICAgICBTdHJpbmcgc3VnZ2VzdGlvbiA9IHBhcmFtMS5nZXRfcmV0dXJuKCk7Ci0gICAgICAgIAotICAgICAgICBpZiAoc3VnZ2VzdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICBvYnNlcnZlci51cGRhdGUocGhyYXNlKTsKLSAgICAgICAgICAgIG9ic2VydmVyLnVwZGF0ZUVycm9yKAotICAgICAgICAgICAgICAgICAgICAiTm8gc3VnZ2VzdGlvbnMgZm91bmQgZm9yICIgKyBwaHJhc2UpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgb2JzZXJ2ZXIudXBkYXRlKHN1Z2dlc3Rpb24pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVjZWl2ZUVycm9yZG9TcGVsbGluZ1N1Z2dlc3Rpb25zKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIG9ic2VydmVyLnVwZGF0ZUVycm9yKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICB9ICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi19Ci0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvZ29vZ2xlc3BlbGxjaGVjay9zcmMvc2FtcGxlL3NwZWxsY2hlY2svZWRpdG9yL1N1Z2dlc3Rpb25Gb3JtLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2dvb2dsZXNwZWxsY2hlY2svc3JjL3NhbXBsZS9zcGVsbGNoZWNrL2VkaXRvci9TdWdnZXN0aW9uRm9ybS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTlkZTE2Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvZ29vZ2xlc3BlbGxjaGVjay9zcmMvc2FtcGxlL3NwZWxsY2hlY2svZWRpdG9yL1N1Z2dlc3Rpb25Gb3JtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBzYW1wbGUuc3BlbGxjaGVjay5lZGl0b3I7Ci0KLWltcG9ydCBqYXZhLmF3dC5Cb3JkZXJMYXlvdXQ7Ci1pbXBvcnQgamF2YS5hd3QuQ29udGFpbmVyOwotaW1wb3J0IGphdmEuYXd0LkRpbWVuc2lvbjsKLWltcG9ydCBqYXZhLmF3dC5HcmlkTGF5b3V0OwotaW1wb3J0IGphdmEuYXd0LkhlYWRsZXNzRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuYXd0LlRvb2xraXQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uRXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuS2V5RXZlbnQ7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBqYXZheC5zd2luZy5KRWRpdG9yUGFuZTsKLWltcG9ydCBqYXZheC5zd2luZy5KRnJhbWU7Ci1pbXBvcnQgamF2YXguc3dpbmcuSk1lbnU7Ci1pbXBvcnQgamF2YXguc3dpbmcuSk1lbnVCYXI7Ci1pbXBvcnQgamF2YXguc3dpbmcuSk1lbnVJdGVtOwotaW1wb3J0IGphdmF4LnN3aW5nLkpPcHRpb25QYW5lOwotaW1wb3J0IGphdmF4LnN3aW5nLkpTY3JvbGxQYW5lOwotaW1wb3J0IGphdmF4LnN3aW5nLktleVN0cm9rZTsKLWltcG9ydCBqYXZheC5zd2luZy5XaW5kb3dDb25zdGFudHM7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuSHlwZXJsaW5rRXZlbnQ7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuSHlwZXJsaW5rTGlzdGVuZXI7Ci0KLS8qKgotICogY2xhc3Mgc2FtcGxlLmdvb2dsZS5zcGVsbGNoZWNrLlN1Z2dlc3Rpb25Gb3JtCi0gKiBUaGlzIGlzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgR1VJCi0gKi8KLXB1YmxpYyBjbGFzcyBTdWdnZXN0aW9uRm9ybSBleHRlbmRzIGphdmF4LnN3aW5nLkpGcmFtZSBpbXBsZW1lbnRzIEh5cGVybGlua0xpc3RlbmVyIHsKLSAgICBwcml2YXRlIEFzeW5jUGFuZWwgYXN5bmNQYW5lbDsKLSAgICBwcml2YXRlIFN5bmNQYW5lbCBzeW5jUGFuZWw7Ci0gICAgcHJpdmF0ZSBKRWRpdG9yUGFuZSBoZWxwRGlzcGxheVBhbmU7Ci0KLSAgICBwcml2YXRlIEpNZW51SXRlbSBzeW5jTWVudUl0ZW07Ci0gICAgcHJpdmF0ZSBKTWVudUl0ZW0gYXN5bmNNZW51SXRlbTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVMUF9GSUxFX05BTUUgPSAiL2RvY3MvR29vZ2xlU3BlbGxDaGVjay5odG1sIjsKLQotCi0gICAgcHVibGljIFN1Z2dlc3Rpb25Gb3JtKCkgdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uIHsKLSAgICAgICAgYXN5bmNQYW5lbCA9IG5ldyBBc3luY1BhbmVsKCk7Ci0gICAgICAgIHN5bmNQYW5lbCA9IG5ldyBTeW5jUGFuZWwoKTsKLQotICAgICAgICBKTWVudUJhciBtZW51QmFyOwotICAgICAgICAvL0NyZWF0ZSB0aGUgbWVudSBiYXIuCi0gICAgICAgIG1lbnVCYXIgPSBuZXcgSk1lbnVCYXIoKTsKLQotICAgICAgICBKTWVudSBtb2RlTWVudSA9IG5ldyBKTWVudSgiTW9kZSIpOwotICAgICAgICBtb2RlTWVudS5zZXRNbmVtb25pYyhLZXlFdmVudC5WS19NKTsKLSAgICAgICAgc3luY01lbnVJdGVtID0gbmV3IEpNZW51SXRlbSgiU3luYyBNb2RlIiwgS2V5RXZlbnQuVktfUyk7Ci0gICAgICAgIHN5bmNNZW51SXRlbS5zZXRBY2NlbGVyYXRvcigKLSAgICAgICAgICAgICAgICBLZXlTdHJva2UuZ2V0S2V5U3Ryb2tlKEtleUV2ZW50LlZLX1MsIEFjdGlvbkV2ZW50LkNUUkxfTUFTSykpOwotICAgICAgICBzeW5jTWVudUl0ZW0uYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBzZXRTeW5jUGFuZWwoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGFzeW5jTWVudUl0ZW0gPSBuZXcgSk1lbnVJdGVtKCJBU3luYyBNb2RlIiwgS2V5RXZlbnQuVktfQSk7Ci0gICAgICAgIGFzeW5jTWVudUl0ZW0uc2V0QWNjZWxlcmF0b3IoCi0gICAgICAgICAgICAgICAgS2V5U3Ryb2tlLmdldEtleVN0cm9rZShLZXlFdmVudC5WS19BLCBBY3Rpb25FdmVudC5DVFJMX01BU0spKTsKLSAgICAgICAgYXN5bmNNZW51SXRlbS5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIHNldEFzeW5jUGFuZWwoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIG1vZGVNZW51LmFkZChzeW5jTWVudUl0ZW0pOwotICAgICAgICBtb2RlTWVudS5hZGQoYXN5bmNNZW51SXRlbSk7Ci0KLSAgICAgICAgSk1lbnUgY2xlYXJNZW51ID0gbmV3IEpNZW51KCJDbGVhciIpOwotICAgICAgICBjbGVhck1lbnUuc2V0TW5lbW9uaWMoS2V5RXZlbnQuVktfQyk7Ci0gICAgICAgIEpNZW51SXRlbSBjbGVhck1lbnVJdGVtID0gbmV3IEpNZW51SXRlbSgiQ2xlYXIgdGV4dCBib3hlcyIpOwotICAgICAgICBjbGVhck1lbnVJdGVtLnNldEFjY2VsZXJhdG9yKAotICAgICAgICAgICAgICAgIEtleVN0cm9rZS5nZXRLZXlTdHJva2UoS2V5RXZlbnQuVktfQywgQWN0aW9uRXZlbnQuQ1RSTF9NQVNLKSk7Ci0gICAgICAgIGNsZWFyTWVudUl0ZW0uYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBhc3luY1BhbmVsLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgc3luY1BhbmVsLmNsZWFyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBjbGVhck1lbnUuYWRkKGNsZWFyTWVudUl0ZW0pOwotCi0gICAgICAgIEpNZW51IGhlbHBNZW51ID0gbmV3IEpNZW51KCJIZWxwIik7Ci0gICAgICAgIEpNZW51SXRlbSBtbnVJdGVtSGVscCA9IG5ldyBKTWVudUl0ZW0oIlNob3cgSGVscCIpOwotICAgICAgICBoZWxwTWVudS5hZGQobW51SXRlbUhlbHApOwotCi0gICAgICAgIG1udUl0ZW1IZWxwLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgc2hvd0hlbHAoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgbWVudUJhci5hZGQobW9kZU1lbnUpOwotICAgICAgICBtZW51QmFyLmFkZChjbGVhck1lbnUpOwotICAgICAgICBtZW51QmFyLmFkZChoZWxwTWVudSk7Ci0KLSAgICAgICAgdGhpcy5zZXRKTWVudUJhcihtZW51QmFyKTsKLQotICAgICAgICB0aGlzLmdldENvbnRlbnRQYW5lKCkuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDEsIDEpKTsKLSAgICAgICAgc2V0QXN5bmNQYW5lbCgpOwotCi0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0gICAgICAgIFN1Z2dlc3Rpb25Gb3JtIGZvcm0gPSBuZXcgU3VnZ2VzdGlvbkZvcm0oKTsKLSAgICAgICAgRGltZW5zaW9uIHNjcmVlblNpemUgPSBUb29sa2l0LmdldERlZmF1bHRUb29sa2l0KCkuZ2V0U2NyZWVuU2l6ZSgpOwotICAgICAgICBmb3JtLnNldExvY2F0aW9uKHNjcmVlblNpemUud2lkdGggLyA0LAotICAgICAgICAgICAgICAgIHNjcmVlblNpemUuaGVpZ2h0IC8gNCk7Ci0gICAgICAgIGZvcm0uc2V0U2l6ZShzY3JlZW5TaXplLndpZHRoIC8gMiwgc2NyZWVuU2l6ZS5oZWlnaHQgLyAyKTsKLSAgICAgICAgZm9ybS5zZXREZWZhdWx0Q2xvc2VPcGVyYXRpb24oV2luZG93Q29uc3RhbnRzLkVYSVRfT05fQ0xPU0UpOwotICAgICAgICAvL2Zvcm0uc2V0UmVzaXphYmxlKGZhbHNlKTsKLSAgICAgICAgLy9mb3JtLnBhY2soKTsKLSAgICAgICAgZm9ybS5zZXRWaXNpYmxlKHRydWUpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZXRBc3luY1BhbmVsKCkgewotICAgICAgICB0aGlzLmdldENvbnRlbnRQYW5lKCkucmVtb3ZlQWxsKCk7Ci0gICAgICAgIHRoaXMuZ2V0Q29udGVudFBhbmUoKS5hZGQoYXN5bmNQYW5lbCk7Ci0gICAgICAgIHRoaXMuc3luY01lbnVJdGVtLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgIHRoaXMuYXN5bmNNZW51SXRlbS5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgdGhpcy5nZXRDb250ZW50UGFuZSgpLnJlcGFpbnQoKTsKLSAgICAgICAgdGhpcy5zZXRUaXRsZSgiR29vZ2xlIFNwZWxsIGNoZWNrZXIgLSBBc3luYyBNb2RlIik7Ci0gICAgICAgIHRoaXMuc2V0VmlzaWJsZSh0cnVlKTsKLQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZXRTeW5jUGFuZWwoKSB7Ci0gICAgICAgIHRoaXMuZ2V0Q29udGVudFBhbmUoKS5yZW1vdmVBbGwoKTsKLSAgICAgICAgdGhpcy5nZXRDb250ZW50UGFuZSgpLmFkZChzeW5jUGFuZWwpOwotICAgICAgICB0aGlzLnN5bmNNZW51SXRlbS5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgdGhpcy5hc3luY01lbnVJdGVtLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgIHRoaXMuZ2V0Q29udGVudFBhbmUoKS5yZXBhaW50KCk7Ci0gICAgICAgIHRoaXMuc2V0VGl0bGUoIkdvb2dsZSBTcGVsbCBjaGVja2VyIC0gU3luYyBNb2RlIik7Ci0gICAgICAgIHRoaXMuc2V0VmlzaWJsZSh0cnVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBtZXRob2Qgc2hvd0hlbHAKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2hvd0hlbHAoKSB7Ci0KLSAgICAgICAgSkZyYW1lIGZyYW1lID0gbmV3IEpGcmFtZSgpOwotICAgICAgICBEaW1lbnNpb24gc2NyZWVuU2l6ZSA9IFRvb2xraXQuZ2V0RGVmYXVsdFRvb2xraXQoKS5nZXRTY3JlZW5TaXplKCk7Ci0gICAgICAgIGZyYW1lLnNldExvY2F0aW9uKHNjcmVlblNpemUud2lkdGggLyA1LAotICAgICAgICAgICAgICAgIHNjcmVlblNpemUuaGVpZ2h0IC8gNSk7Ci0gICAgICAgIGZyYW1lLnNldFNpemUoc2NyZWVuU2l6ZS53aWR0aCAvIDIsIHNjcmVlblNpemUuaGVpZ2h0IC8gMik7Ci0KLSAgICAgICAgQm9yZGVyTGF5b3V0IGxheW91dCA9IG5ldyBCb3JkZXJMYXlvdXQoKTsKLQotICAgICAgICBKU2Nyb2xsUGFuZSBqc3A7Ci0KLQotICAgICAgICBoZWxwRGlzcGxheVBhbmUgPSBuZXcgSkVkaXRvclBhbmUoKTsKLSAgICAgICAgaGVscERpc3BsYXlQYW5lLmFkZEh5cGVybGlua0xpc3RlbmVyKHRoaXMpOwotICAgICAgICBoZWxwRGlzcGxheVBhbmUuc2V0RWRpdGFibGUoZmFsc2UpOwotICAgICAgICBoZWxwRGlzcGxheVBhbmUuc2V0Q29udGVudFR5cGUoInRleHQvaHRtbCIpOwotCi0gICAgICAgIGpzcCA9IG5ldyBKU2Nyb2xsUGFuZShoZWxwRGlzcGxheVBhbmUpOwotCi0gICAgICAgIENvbnRhaW5lciBjb250ZW50UGFuZSA9IGZyYW1lLmdldENvbnRlbnRQYW5lKCk7Ci0gICAgICAgIGNvbnRlbnRQYW5lLnNldExheW91dChsYXlvdXQpOwotICAgICAgICBjb250ZW50UGFuZS5hZGQoanNwLCBCb3JkZXJMYXlvdXQuQ0VOVEVSKTsKLSAgICAgICAgU3RyaW5nIGhlbHBEb2MgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIikgKyBIRUxQX0ZJTEVfTkFNRTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaGVscERpc3BsYXlQYW5lLnNldFBhZ2UobmV3IEZpbGUoaGVscERvYykudG9VUkwoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIEpPcHRpb25QYW5lLnNob3dNZXNzYWdlRGlhbG9nKHRoaXMsICJIZWxwIGZpbGUgbm90IGRldGVjdGVkIiwgIkhlbHAgZmlsZSBlcnJvciIsCi0gICAgICAgICAgICAgICAgICAgIEpPcHRpb25QYW5lLkVSUk9SX01FU1NBR0UpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGZyYW1lLnNldFZpc2libGUodHJ1ZSk7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCBoeXBlcmxpbmtVcGRhdGUoSHlwZXJsaW5rRXZlbnQgZSkgewotICAgICAgICBpZiAoZS5nZXRFdmVudFR5cGUoKSA9PSBIeXBlcmxpbmtFdmVudC5FdmVudFR5cGUuQUNUSVZBVEVEKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIFN0cmluZyB1cmwgPSBlLmdldFVSTCgpLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgaGVscERpc3BsYXlQYW5lLnNldFBhZ2UodXJsKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlcnIpIHsKLSAgICAgICAgICAgICAgICBKT3B0aW9uUGFuZS5zaG93TWVzc2FnZURpYWxvZyh0aGlzLCAiSGVscCBmaWxlIG5vdCBkZXRlY3RlZCIsIGVyci5nZXRNZXNzYWdlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBKT3B0aW9uUGFuZS5FUlJPUl9NRVNTQUdFKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9nb29nbGVzcGVsbGNoZWNrL3NyYy9zYW1wbGUvc3BlbGxjaGVjay9lZGl0b3IvU3luY1BhbmVsLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2dvb2dsZXNwZWxsY2hlY2svc3JjL3NhbXBsZS9zcGVsbGNoZWNrL2VkaXRvci9TeW5jUGFuZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRhYzY2My4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2dvb2dsZXNwZWxsY2hlY2svc3JjL3NhbXBsZS9zcGVsbGNoZWNrL2VkaXRvci9TeW5jUGFuZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIHNhbXBsZS5zcGVsbGNoZWNrLmVkaXRvcjsKLQotaW1wb3J0IGphdmF4LnN3aW5nLio7Ci0KLWltcG9ydCBqYXZhLmF3dC4qOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkV2ZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkxpc3RlbmVyOwotCi0vKioKLSAqIGNsYXNzIHNhbXBsZS5nb29nbGUuc3BlbGxjaGVjay5TeW5jUGFuZWwKLSAqIFRoaXMgSW1wZW1lbnRzIGl0cyBvd24gR1VJIG9mIHRoZSBTeW5jaHJvbm91cyBDbGllbnQgYW5kIGl0IHNlbmQgdGhlIFNPQVAgcmVxdWVzdCBhZnRlciB0aGUgbW91c2UgZXZlbnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBTeW5jUGFuZWwgZXh0ZW5kcyBqYXZheC5zd2luZy5KUGFuZWwgaW1wbGVtZW50cyBPYnNlcnZlciwKLSAgICAgICAgQWN0aW9uTGlzdGVuZXIgewotICAgIEZvcm1Nb2RlbCBmb3JtTW9kZWw7Ci0gICAgSlRleHRBcmVhIHdyaXRpbmdUZXh0QXJlYTsKLSAgICBKVGV4dEFyZWEgZGlzcGxheVRleHRBcmVhOwotICAgIEpUZXh0RmllbGQgZXJyb3JNZXNzYWdlRmllbGQ7Ci0gICAgSkJ1dHRvbiBzZW5kQnV0dG9uOwotCi0gICAgcHVibGljIFN5bmNQYW5lbCgpIHsKLSAgICAgICAgR3JpZEJhZ0xheW91dCBnYkxheW91dCA9IG5ldyBHcmlkQmFnTGF5b3V0KCk7Ci0gICAgICAgIEdyaWRCYWdDb25zdHJhaW50cyBjb25zdHJhaW50ID0gbmV3IEdyaWRCYWdDb25zdHJhaW50cygpOwotICAgICAgICB0aGlzLnNldExheW91dChnYkxheW91dCk7Ci0KLSAgICAgICAgZm9ybU1vZGVsID0gbmV3IEZvcm1Nb2RlbCh0aGlzKTsKLSAgICAgICAgd3JpdGluZ1RleHRBcmVhID0gbmV3IGphdmF4LnN3aW5nLkpUZXh0QXJlYSgpOwotICAgICAgICB3cml0aW5nVGV4dEFyZWEuc2V0TGluZVdyYXAodHJ1ZSk7Ci0KLSAgICAgICAgZGlzcGxheVRleHRBcmVhID0gbmV3IGphdmF4LnN3aW5nLkpUZXh0QXJlYSgpOwotICAgICAgICBkaXNwbGF5VGV4dEFyZWEuc2V0TGluZVdyYXAodHJ1ZSk7Ci0gICAgICAgIGRpc3BsYXlUZXh0QXJlYS5zZXRFZGl0YWJsZShmYWxzZSk7Ci0KLSAgICAgICAgZXJyb3JNZXNzYWdlRmllbGQgPSBuZXcgSlRleHRGaWVsZCgpOwotICAgICAgICBlcnJvck1lc3NhZ2VGaWVsZC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0gICAgICAgIGVycm9yTWVzc2FnZUZpZWxkLnNldEJhY2tncm91bmQoQ29sb3IuTElHSFRfR1JBWSk7Ci0gICAgICAgIGVycm9yTWVzc2FnZUZpZWxkLnNldEZvcmVncm91bmQoQ29sb3IuUkVEKTsKLQotICAgICAgICBzZW5kQnV0dG9uID0gbmV3IGphdmF4LnN3aW5nLkpCdXR0b24oIlNlbmQiKTsKLSAgICAgICAgSlNjcm9sbFBhbmUgc2Nyb2xsUGFuZWdldCA9IG5ldyBKU2Nyb2xsUGFuZSh3cml0aW5nVGV4dEFyZWEpOwotICAgICAgICBKU2Nyb2xsUGFuZSBzY3JvbGxQYW5lc2V0ID0gbmV3IEpTY3JvbGxQYW5lKGRpc3BsYXlUZXh0QXJlYSk7Ci0gICAgICAgIHdyaXRpbmdUZXh0QXJlYS5zZXRUZXh0KCJFbnRlciBhIFN0cmluZyIpOwotCi0gICAgICAgIGNvbnN0cmFpbnQuZmlsbCA9IEdyaWRCYWdDb25zdHJhaW50cy5CT1RIOwotICAgICAgICBjb25zdHJhaW50LmdyaWR4ID0gMDsKLSAgICAgICAgY29uc3RyYWludC53ZWlnaHR4ID0gMTsKLSAgICAgICAgY29uc3RyYWludC53ZWlnaHR5ID0gODsKLSAgICAgICAgZ2JMYXlvdXQuc2V0Q29uc3RyYWludHMoc2Nyb2xsUGFuZWdldCwgY29uc3RyYWludCk7Ci0gICAgICAgIHRoaXMuYWRkKHNjcm9sbFBhbmVnZXQpOwotICAgICAgICBnYkxheW91dC5zZXRDb25zdHJhaW50cyhzY3JvbGxQYW5lc2V0LCBjb25zdHJhaW50KTsKLSAgICAgICAgdGhpcy5hZGQoc2Nyb2xsUGFuZXNldCk7Ci0gICAgICAgIGNvbnN0cmFpbnQud2VpZ2h0eSA9IDE7Ci0gICAgICAgIGdiTGF5b3V0LnNldENvbnN0cmFpbnRzKHNlbmRCdXR0b24sIGNvbnN0cmFpbnQpOwotICAgICAgICB0aGlzLmFkZChzZW5kQnV0dG9uKTsKLSAgICAgICAgZ2JMYXlvdXQuc2V0Q29uc3RyYWludHMoZXJyb3JNZXNzYWdlRmllbGQsIGNvbnN0cmFpbnQpOwotICAgICAgICB0aGlzLmFkZChlcnJvck1lc3NhZ2VGaWVsZCk7Ci0KLSAgICAgICAgc2VuZEJ1dHRvbi5hZGRBY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZShTdHJpbmcgc3VnZ2VzdGlvbikgewotICAgICAgICBkaXNwbGF5VGV4dEFyZWEuc2V0VGV4dChzdWdnZXN0aW9uKTsKLSAgICB9Ci0KLSAgICAvL3VwZGF0ZXMgdGhlIGVycm9yIG1lc3NhZ2UgdG8gdGhlIGVycm9yIG1lc3NhZ2UgZGlzcGxheSBhcmVhCi0gICAgcHVibGljIHZvaWQgdXBkYXRlRXJyb3IoU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgZXJyb3JNZXNzYWdlRmllbGQuc2V0VGV4dChtZXNzYWdlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgewotICAgICAgICBTdHJpbmcgc3RyID0gd3JpdGluZ1RleHRBcmVhLmdldFRleHQoKS50cmltKCk7Ci0gICAgICAgIGZvcm1Nb2RlbC5kb1N5bmNTcGVsbGluZ1N1Z2dlc3Rpb24oc3RyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKLSAgICAgICAgd3JpdGluZ1RleHRBcmVhLnNldFRleHQoIiIpOwotICAgICAgICBkaXNwbGF5VGV4dEFyZWEuc2V0VGV4dCgiIik7Ci0gICAgICAgIGVycm9yTWVzc2FnZUZpZWxkLnNldFRleHQoIiIpOwotICAgIH0KLQotfQotCi0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF2YV9maXJzdF9qYXh3cy9SRUFETUUgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2phdmFfZmlyc3RfamF4d3MvUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDJhMWJiLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF2YV9maXJzdF9qYXh3cy9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi1UaGlzIGV4YW1wbGUgc2hvd3MgaG93IHRvIHVzZSBBeGlzMiBpbiBhIHNlcnZsZXQgY29udGFpbmVyLiBZb3UgbXVzdCANCi1oYXZlIE1hdmVuIDIueCBpbnN0YWxsZWQgdG8gYnVpbGQgdGhpcyBleGFtcGxlLiAgVG8gYnVpbGQgdHlwZToNCi0NCi0kIG12biBpbnN0YWxsIHdhcjp3YXINCi0NCi1UbyBydW4gdGhlIHNhbXBsZSB1c2luZyBhIFNlcnZsZXQgRW5naW5lOiANCi0NCi1QbGVhc2UgaW5zdGFsbCBhIHNlcnZsZXQgZW5naW5lIHNheSB0b21jYXQuIFJlbmFtZSB0aGUgcmVzdWx0YW50IHdhciBhcyB5b3VyX3dlYl9hcHAud2FyIGFuZCBkcm9wIGl0IGludG8gd2ViYXBwcyBkaXJlY3RvcnkgdW5kZXIgdG9tY2F0Lg0KLVRoZSBXU0RMIGZpbGUgZm9yIHRoZSBzZXJ2aWNlIHNob3VsZCBiZSB2aWV3YWJsZSBhdDoNCi0NCi1odHRwOi8veW91cmhvc3Q6cG9ydC95b3VyX3dlYl9hcHAvc2VydmljZXMvSGVsbG9Xb3JsZC5IZWxsb1dvcmxkSW1wbFBvcnQ/d3NkbA0KLQ0KLVRvIHJ1biB0aGUgc2FtcGxlIHVuZGVyIGF4aXMyc2VydmVyOg0KLQ0KLVBsZWFzZSBjb3B5IHRoZSBqYXZhX2ZpcnN0X2pheHdzIGphciBpbnRvIDxBWElTMl9IT01FPi9yZXBvc2l0b3J5L3NlcnZpY2VqYXJzIChQbGVhc2UgY3JlYXRlIHRoZSBkaXJlY3RvcnkgaWYgaXQgZG9lcyBub3QgZXhpc3QpLiBUaGVuIHN0YXJ0IHRoZSBheGlzMiBzZXJ2ZXIuDQotVGhlIFdTREwgZmlsZSBmb3IgdGhlIHNlcnZpY2Ugc2hvdWxkIGJlIHZpZXdhYmxlIGF0Og0KLQ0KLWh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9heGlzMi9zZXJ2aWNlcy9IZWxsb1dvcmxkLkhlbGxvV29ybGRJbXBsUG9ydD93c2RsDQotDQotTk9URTogSWYgeW91IGFyZSB1c2luZyBKREsxLjUsIHBsZWFzZSBjb3B5IGpheHdzLXJ0LmphciBhbmQgamF4d3MtdG9vbHMuamFyIGZyb20gdGhlIEpBWFdTIFJJIGludG8gPEFYSVMyX0hPTUU+L2xpYiBiZWZvcmUgeW91IHJ1biBheGlzMiBzZXJ2ZXIuIEluIEpESyAxLjYsIHlvdSBkb24ndCBuZWVkIHRoZXNlIDIgamFycy4NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2phdmFfZmlyc3RfamF4d3MvcG9tLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF2YV9maXJzdF9qYXh3cy9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYmE2NmEwLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF2YV9maXJzdF9qYXh3cy9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjY4ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIKLSAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMi5leGFtcGxlczwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5qYXZhX2ZpcnN0X2pheHdzPC9hcnRpZmFjdElkPgotICAgIDxuYW1lPkpBWFdTIC0gU3RhcnRpbmcgZnJvbSBKYXZhIEV4YW1wbGU8L25hbWU+Ci0gICAgPHZlcnNpb24+MS4xPC92ZXJzaW9uPgotICAgIDxpbmNlcHRpb25ZZWFyPjIwMDQ8L2luY2VwdGlvblllYXI+Ci0KLSAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmphdmF4LnNlcnZsZXQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5zZXJ2bGV0LWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjIuMzwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczIta2VybmVsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MS41LjE8L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItamF4d3M8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjUuMTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1jb2RlZ2VuPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MS41LjE8L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItYWRiPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MS41LjE8L3ZlcnNpb24+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+amF2YS5uZXQ8L2lkPgotICAgICAgICAgICAgPHVybD5odHRwczovL21hdmVuLXJlcG9zaXRvcnkuZGV2LmphdmEubmV0L25vbmF2L3JlcG9zaXRvcnkvPC91cmw+Ci0gICAgICAgICAgICA8bGF5b3V0PmxlZ2FjeTwvbGF5b3V0PgotICAgICAgICAgICAgPHNuYXBzaG90cz4KLSAgICAgICAgICAgICAgICA8ZW5hYmxlZD5mYWxzZTwvZW5hYmxlZD4KLSAgICAgICAgICAgIDwvc25hcHNob3RzPgotICAgICAgICAgICAgPHJlbGVhc2VzPgotICAgICAgICAgICAgICAgIDxlbmFibGVkPnRydWU8L2VuYWJsZWQ+Ci0gICAgICAgICAgICA8L3JlbGVhc2VzPgotICAgICAgICA8L3JlcG9zaXRvcnk+Ci0gICAgPC9yZXBvc2l0b3JpZXM+Ci0KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF2YV9maXJzdF9qYXh3cy9zcmMvbWFpbi9kZW1vL2h3L3NlcnZlci9IZWxsb1dvcmxkLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2phdmFfZmlyc3RfamF4d3Mvc3JjL21haW4vZGVtby9ody9zZXJ2ZXIvSGVsbG9Xb3JsZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Zjc4MGFiLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF2YV9maXJzdF9qYXh3cy9zcmMvbWFpbi9kZW1vL2h3L3NlcnZlci9IZWxsb1dvcmxkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBkZW1vLmh3LnNlcnZlcjsNCi0NCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uYWRhcHRlcnMuWG1sSmF2YVR5cGVBZGFwdGVyOw0KLQ0KLUBXZWJTZXJ2aWNlDQotcHVibGljIGludGVyZmFjZSBIZWxsb1dvcmxkIHsNCi0NCi0gICAgU3RyaW5nIHNheUhpKFN0cmluZyB0ZXh0KTsNCi19DQotLy8gRU5EIFNOSVBQRVQ6IHNlcnZpY2UNCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2phdmFfZmlyc3RfamF4d3Mvc3JjL21haW4vZGVtby9ody9zZXJ2ZXIvSGVsbG9Xb3JsZEltcGwuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF2YV9maXJzdF9qYXh3cy9zcmMvbWFpbi9kZW1vL2h3L3NlcnZlci9IZWxsb1dvcmxkSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzdkMmVhLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF2YV9maXJzdF9qYXh3cy9zcmMvbWFpbi9kZW1vL2h3L3NlcnZlci9IZWxsb1dvcmxkSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2UgZGVtby5ody5zZXJ2ZXI7DQotDQotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsNCi0NCi1AV2ViU2VydmljZShlbmRwb2ludEludGVyZmFjZSA9ICJkZW1vLmh3LnNlcnZlci5IZWxsb1dvcmxkIiwgDQotICAgICAgICAgICAgc2VydmljZU5hbWUgPSAiSGVsbG9Xb3JsZCIpDQotcHVibGljIGNsYXNzIEhlbGxvV29ybGRJbXBsIGltcGxlbWVudHMgSGVsbG9Xb3JsZCB7DQotICAgIHB1YmxpYyBTdHJpbmcgc2F5SGkoU3RyaW5nIHRleHQpIHsNCi0gICAgICAgIHJldHVybiAiSGVsbG8gIiArIHRleHQ7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXZhX2ZpcnN0X2pheHdzL3NyYy93ZWJhcHAvV0VCLUlORi9heGlzMi54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2phdmFfZmlyc3RfamF4d3Mvc3JjL3dlYmFwcC9XRUItSU5GL2F4aXMyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDczMTExMC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2phdmFfZmlyc3RfamF4d3Mvc3JjL3dlYmFwcC9XRUItSU5GL2F4aXMyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM1NCArMCwwIEBACi08IS0tDQotICB+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+DQotDQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXZhX2ZpcnN0X2pheHdzL3NyYy93ZWJhcHAvV0VCLUlORi9jbGFzc2VzL2NvbW1vbnMtbG9nZ2luZy5wcm9wZXJ0aWVzIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXZhX2ZpcnN0X2pheHdzL3NyYy93ZWJhcHAvV0VCLUlORi9jbGFzc2VzL2NvbW1vbnMtbG9nZ2luZy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWZkZDBhLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF2YV9maXJzdF9qYXh3cy9zcmMvd2ViYXBwL1dFQi1JTkYvY2xhc3Nlcy9jb21tb25zLWxvZ2dpbmcucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSMNCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotIw0KLQ0KLQ0KLSMgVGhpcyBpcyB0aGUgbG9nZ2luZyBwcm9wZXJ0aWVzIHRoYXQgZ29lcyB0byB0aGUgd2FyLCB0aGVyZSBhcmUgdHdvIGxvZ2dpbmcgY29uZiBrZXB0IGF0IHRoZSANCi0jIHN2biwgb25lIGZvciBkZXZlbG9wZW1lbnQgKG9uZSBhdCBzcmMvdGVzdC1yZXNvdXJjZXMpIGFuZCBvdGhlciBmb3IgcHJvZHVjYXRpb24NCi0gDQotIyBVbmNvbW1lbnQgdGhlIG5leHQgbGluZSB0byBkaXNhYmxlIGFsbCBsb2dnaW5nLg0KLSNvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c9b3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuaW1wbC5Ob09wTG9nDQotDQotIyBVbmNvbW1lbnQgdGhlIG5leHQgbGluZSB0byBlbmFibGUgdGhlIHNpbXBsZSBsb2cgYmFzZWQgbG9nZ2luZw0KLSNvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c9b3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuaW1wbC5TaW1wbGVMb2cNCi0NCi0jIFVuY29tbWVudCB0aGUgbmV4dCBsaW5lIHRvIGVuYWJsZSBsb2c0aiBiYXNlZCBsb2dnaW5nDQotb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nPW9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLmltcGwuTG9nNEpMb2dnZXINCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2phdmFfZmlyc3RfamF4d3Mvc3JjL3dlYmFwcC9XRUItSU5GL2NsYXNzZXMvbG9nNGoucHJvcGVydGllcyBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF2YV9maXJzdF9qYXh3cy9zcmMvd2ViYXBwL1dFQi1JTkYvY2xhc3Nlcy9sb2c0ai5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDQ4ZGRjLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF2YV9maXJzdF9qYXh3cy9zcmMvd2ViYXBwL1dFQi1JTkYvY2xhc3Nlcy9sb2c0ai5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotIw0KLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0jDQotDQotDQotIyBTZXQgcm9vdCBjYXRlZ29yeSBwcmlvcml0eSB0byBJTkZPIGFuZCBpdHMgb25seSBhcHBlbmRlciB0byBDT05TT0xFLg0KLWxvZzRqLnJvb3RDYXRlZ29yeT1JTkZPLCBDT05TT0xFDQotI2xvZzRqLnJvb3RDYXRlZ29yeT1JTkZPLCBDT05TT0xFLCBMT0dGSUxFDQotDQotIyBTZXQgdGhlIGVudGVycHJpc2UgbG9nZ2VyIHByaW9yaXR5IHRvIEZBVEFMDQotbG9nNGoubG9nZ2VyLm9yZy5hcGFjaGUuYXhpczIuZW50ZXJwcmlzZT1GQVRBTA0KLWxvZzRqLmxvZ2dlci5kZS5odW5zaWNrZXIuamFsb3B5LmlvPUZBVEFMDQotbG9nNGoubG9nZ2VyLmh0dHBjbGllbnQud2lyZS5oZWFkZXI9RkFUQUwNCi1sb2c0ai5sb2dnZXIub3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQ9RkFUQUwNCi0NCi0jIENPTlNPTEUgaXMgc2V0IHRvIGJlIGEgQ29uc29sZUFwcGVuZGVyIHVzaW5nIGEgUGF0dGVybkxheW91dC4NCi1sb2c0ai5hcHBlbmRlci5DT05TT0xFPW9yZy5hcGFjaGUubG9nNGouQ29uc29sZUFwcGVuZGVyDQotbG9nNGouYXBwZW5kZXIuQ09OU09MRS5sYXlvdXQ9b3JnLmFwYWNoZS5sb2c0ai5QYXR0ZXJuTGF5b3V0DQotbG9nNGouYXBwZW5kZXIuQ09OU09MRS5sYXlvdXQuQ29udmVyc2lvblBhdHRlcm49WyVwXSAlbSVuDQotDQotIyBMT0dGSUxFIGlzIHNldCB0byBiZSBhIEZpbGUgYXBwZW5kZXIgdXNpbmcgYSBQYXR0ZXJuTGF5b3V0Lg0KLWxvZzRqLmFwcGVuZGVyLkxPR0ZJTEU9b3JnLmFwYWNoZS5sb2c0ai5GaWxlQXBwZW5kZXINCi1sb2c0ai5hcHBlbmRlci5MT0dGSUxFLkZpbGU9YXhpczIubG9nDQotbG9nNGouYXBwZW5kZXIuTE9HRklMRS5BcHBlbmQ9dHJ1ZQ0KLWxvZzRqLmFwcGVuZGVyLkxPR0ZJTEUubGF5b3V0PW9yZy5hcGFjaGUubG9nNGouUGF0dGVybkxheW91dA0KLWxvZzRqLmFwcGVuZGVyLkxPR0ZJTEUubGF5b3V0LkNvbnZlcnNpb25QYXR0ZXJuPSVkIFsldF0gJS01cCAlYyAleCAtICVtJW4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2phdmFfZmlyc3RfamF4d3Mvc3JjL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2phdmFfZmlyc3RfamF4d3Mvc3JjL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyZWEzMjMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXZhX2ZpcnN0X2pheHdzL3NyYy93ZWJhcHAvV0VCLUlORi93ZWIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/Pg0KLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTwhRE9DVFlQRSB3ZWItYXBwDQotICAgIFBVQkxJQyAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIFdlYiBBcHBsaWNhdGlvbiAyLjMvL0VOIg0KLSAgICAiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvd2ViLWFwcF8yXzMuZHRkIj4NCi0gICAgDQotPHdlYi1hcHA+DQotDQotICAgIDxzZXJ2bGV0Pg0KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5BeGlzU2VydmxldDwvc2VydmxldC1uYW1lPg0KLSAgICAgICAgPGRpc3BsYXktbmFtZT5BcGFjaGUtQXhpcyBTZXJ2bGV0PC9kaXNwbGF5LW5hbWU+DQotICAgICAgICA8c2VydmxldC1jbGFzcz4NCi0gICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkF4aXNTZXJ2bGV0PC9zZXJ2bGV0LWNsYXNzPg0KLSAgICAgICAgPGxvYWQtb24tc3RhcnR1cD4xPC9sb2FkLW9uLXN0YXJ0dXA+DQotICAgIDwvc2VydmxldD4NCi0NCi0gIDxzZXJ2bGV0LW1hcHBpbmc+DQotICAgIDxzZXJ2bGV0LW5hbWU+QXhpc1NlcnZsZXQ8L3NlcnZsZXQtbmFtZT4NCi0gICAgPHVybC1wYXR0ZXJuPi9zZXJ2aWNlcy8qPC91cmwtcGF0dGVybj4NCi0gIDwvc2VydmxldC1tYXBwaW5nPg0KLTwvd2ViLWFwcD4NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLWFkZHJlc3Nib29rL1JFQURNRS50eHQgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLWFkZHJlc3Nib29rL1JFQURNRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1YmI1ZDkuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1hZGRyZXNzYm9vay9SRUFETUUudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLUF4aXMyIEpBWC1XUyBzYW1wbGUgdGhhdCB1c2VzIEpBWEIgYXJ0aWZhY3RzIGNyZWF0ZWQgZnJvbSBhIHNpbXBsZSBzY2hlbWEuDQotDQotICAgMS4gR2l2ZW4gYSBzaW1wbGUgc2NoZW1hLCBnZW5lcmF0ZSB0aGUgSkFYQiBhcnRpZmFjdHMgdXNpbmcgeGpjLg0KLSAgIDIuIFdpdGggdGhlIGdlbmVyYXRlZCBKQVhCIGJlYW5zIGluIGhhbmQsIHdyaXRlIHRoZSBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIA0KLSAgICAgIGFuZCBhZGQgYW5ub3RhdGlvbnMgdG8gbWFrZSBhIFdlYiBTZXJ2aWNlLg0KLSAgIDMuIFdyaXRlIGEgRGlzcGF0Y2ggY2xpZW50IHRvIGludGVyYWN0IHdpdGggdGhlIHNlcnZpY2UNCi0gICA0LiBSdW4gdGhlIERpc3BhdGNoIGNsaWVudCBhZ2FpbnN0IHRoZSBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIGRlcGxveWVkIGluIHRoZSBBeGlzMiBzZXJ2ZXINCi0NCi1UaGlzIGFkZHJlc3MgYm9vayBzYW1wbGUgaXMgYmFzZWQgb24gb25lIG9mIHRoZSBqYXh3cy1pbnRlZ3JhdGlvbiB0ZXN0czoNCi1tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkcmVzc2Jvb2sNCi0NCi1Ob3RlIHRoYXQgdGhpcyBpcyBhIHZlcnkgc2ltcGxlIGV4YW1wbGUsIGFuZCBkb2VzIG5vdCBwZXJzaXN0IGFueSBkYXRhLiAgVGhlIGludGVudCBpcw0KLXRvIGlsbHVzdHJhdGUgdGhlIHVzZSBvZiBKQVhCIG9iamVjdHMgd2l0aCBKQVgtV1MsIG5vdCB0byBhY3R1YWxseSBpbXBsZW1lbnQgYW5kIGFkZHJlc3MgYm9vay4NCi0NCi1UaGUgZm9sbG93aW5nIHNvdXJjZSBpcyBpbmNsdWRlZCB3aXRoIHRoaXMgZXhhbXBsZToNCi1zcmNcQWRkcmVzc0Jvb2tFbnRyeS54c2Q6ICBTY2hlbWEgdXNlZCB0byBnZW5lcmF0ZSBKQVhCIGFydGlmYWN0cw0KLXNyY1xvcmdcYXBhY2hlXGF4aXMyXGpheHdzXGFkZHJlc3Nib29rXEFkZHJlc3NCb29rLmphdmE6ICBKQVhXUyBTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZSAoU0VJKQ0KLSAgICBOb3RlIHRoYXQgdGhpcyBTRUkgaXMgTk9UIENVUlJFTlRMWSBVU0VEIGluIHRoaXMgZXhhbXBsZS4NCi1zcmNcb3JnXGFwYWNoZVxheGlzMlxqYXh3c1xhZGRyZXNzYm9va1xBZGRyZXNzQm9va0NsaWVudC5qYXZhOiBKQVhXUyBEaXNwYXRjaCBDbGllbnQNCi1zcmNcb3JnXGFwYWNoZVxheGlzMlxqYXh3c1xhZGRyZXNzYm9va1xBZGRyZXNzQm9va0ltcGwuamF2YTogSkFYV1Mgc2VydmljZSBpbXBsZW1lbnRhdGlvbg0KLQ0KLQ0KLVN0ZXAgMDogSG93IHRvIGJ1aWxkIHRoaXMgc2FtcGxlDQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi1UbyBidWlsZCB0aGlzIHNhbXBsZSwgZXhlY3V0ZSB0aGUgZm9sbG93aW5nIG1hdmVuIGNvbW1hbmQ6IA0KLQltdm4gY2xlYW4gaW5zdGFsbA0KLQ0KLVRoaXMgd2lsbCBkbyB0aGUgZm9sbG93aW5nOg0KLS0gR2VuZXJhdGUgdGhlIEpBWEIgYXJ0aWZhY3RzIChpbiB0YXJnZXQvc2NoZW1hKQ0KLS0gQ29tcGlsZSB0aGUgc2VydmljZSBpbXBsZW1lbnRhdGlvbiBjbGFzc2VzIChpbiB0YXJnZXQvY2xhc3NlcyksIGluY2x1ZGluZyB0aGUgSkFYQiBhcnRpZmFjdHMsIA0KLSAgYW5kIGNyZWF0ZSBhIEpBUiBjb250YWluaW5nIHRob3NlIGNsYXNzZXMgKHRhcmdldC9qYXh3cy1hZGRyZXNzYm9vay1TTkFQU0hPVC5qYXIpDQotLSBDb21waWxlIHRoZSBEaXNwYXRjaCBjbGllbnQgY2xhc3NlcyAoaW4gdGFyZ2V0L2NsYXNzZXMpIGFuZCBjcmVhdGUgYSBKQVIgY29udGFpbmluZyB0aG9zZSBjbGFzc2VzDQotICAodGFyZ2V0L2pheHdzLWFkZHJlc3Nib29rLVNOQVBTSE9ULUNsaWVudC5qYXIpLiAgDQotDQotDQotU3RlcCAxOiBHZW5lcmF0ZSBKQVhCIGFydGlmYWN0cyBmcm9tIHNpbXBsZSBzY2hlbWENCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLVRoZSBmaWxlIHNyYy9BZGRyZXNzQm9va0VudHJ5LnhzZCBkZXNjcmliZXMgYSBzaW1wbGUgQWRkcmVzc0Jvb2tFbnRyeSBvYmplY3Qgd2l0aCB0aGUNCi1mb2xsb3dpbmcgZmllbGRzOg0KLSAgICBTdHJpbmcgZmlyc3ROYW1lOw0KLSAgICBTdHJpbmcgbGFzdE5hbWU7DQotICAgIFN0cmluZyBwaG9uZTsNCi0gICAgU3RyaW5nIHN0cmVldDsNCi0gICAgU3RyaW5nIGNpdHk7DQotICAgIFN0cmluZyBzdGF0ZTsNCi0NCi1UaGUgZm9sbG93aW5nIEpBWEIgYXJ0aWZhY3RzIGFyZSBnZW5lcmF0ZWQgaW4gdGhlIHRhcmdldC9zY2hlbWEvc3JjIGRpcmVjdG9yeSB3aGVuIHRoZSANCi1zYW1wbGUgaXMgYnVpbHQgDQotb3JnXGFwYWNoZVxheGlzMlxqYXh3c1xhZGRyZXNzYm9va1xBZGRyZXNzQm9va0VudHJ5LmphdmENCi1vcmdcYXBhY2hlXGF4aXMyXGpheHdzXGFkZHJlc3Nib29rXE9iamVjdEZhY3RvcnkuamF2YQ0KLW9yZ1xhcGFjaGVcYXhpczJcamF4d3NcYWRkcmVzc2Jvb2tccGFja2FnZS1pbmZvLmphdmENCi0NCi1UaGVzZSBmaWxlcyB3aWxsIGJlIGNvbXBpbGVkIGludG8gdGFyZ2V0L2NsYXNzZXMgYXMgcGFydCBvZiB0aGUgYnVpbGQuDQotDQotDQotU3RlcCAyOiBXcml0ZSBhIEpBWC1XUyBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIHVzaW5nIHRoZSBKQVhCIGFydGlmYWN0cw0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi1UaGUgc2ltcGxlIHNlcnZpY2UgaW1wbGVtZW50YXRpb24gd2lsbCBoYXZlIHR3byBtZXRob2RzIG9uIGl0Og0KLSAgICBwdWJsaWMgU3RyaW5nIGFkZEVudHJ5KFN0cmluZyBmaXJzdE5hbWUsIFN0cmluZyBsYXN0TmFtZSwgU3RyaW5nIHBob25lLCBTdHJpbmcgc3RyZWV0LCBTdHJpbmcgY2l0eSwgU3RyaW5nIHN0YXRlKQ0KLSAgICBwdWJsaWMgQWRkcmVzc0Jvb2tFbnRyeSBmaW5kQnlMYXN0TmFtZShTdHJpbmcgbGFzdE5hbWUpDQotICAgIA0KLVRoZSBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IGV4cGxpY2l0bHkgc3BlY2lmeSBhIEpBWC1XUyBTRUkuICBUaGUgcHVibGljIG1ldGhvZHMgb24gdGhlDQotaW1wbGVtZW50YXRpb24gd2lsbCBiZSBhbiBpbXBsaWNpdCBTRUkuICBTaW1wbHkgYnkgYWRkaW5nIGFuIEBXZWJTZXJ2aWNlIGFubm90YXRpb24gdG8gdGhlIA0KLWltcGxlbWVudGF0aW9uIGNsYXNzIGl0IGJlY29tZXMgYSBKQVgtV1Mgd2ViIHNlcnZpY2UuICAgDQotDQotVGhlIGltcGxlbWVudGF0aW9uIGNsYXNzIGlzOiBzcmNcb3JnXGFwYWNoZVxheGlzMlxqYXh3c1xhZGRyZXNzYm9va1xBZGRyZXNzQm9va0ltcGwuamF2YSAgDQotDQotVGhpcyBmaWxlIHdpbGwgYmUgY29tcGlsZWQgaW50byB0YXJnZXQvY2xhc3NlcyBhcyBwYXJ0IG9mIHRoZSBidWlsZC4NCi0NCi0NCi1TdGVwIDM6IFdyaXRlIGEgSkFYLVdTIERpc3BhdGNoIGNsaWVudCB0byBpbnRlcmFjdCB3aXRoIHRoZSBzZXJ2aWNlDQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLVRoZSBleHRyZW1lbHkgc2ltcGxlIERpc3BhdGNoIGNsaWVudCB3aWxsIGJlIGEgUGF5bG9hZCBtb2RlIFN0cmluZyBEaXNwYXRjaCBjbGllbnQsIG1lYW5pbmcgdGhhdA0KLWl0IHdpbGwgcHJvdmlkZSB0aGUgZXhhY3QgU09BUCBib2R5IHRvIHNlbmQgaW4gdGhlIHJlcXVlc3QgKFBheWxvYWQgbW9kZSkgYXMgYSBTdHJpbmcsIGFuZCBleHBlY3QgDQotdGhlIHJlc3BvbnNlIHRvIGJlIGEgU09BUCBib2R5IHJldHVybmVkIGFzIGEgU3RyaW5nLiAgSXQgd2lsbCBpbnZva2UgYm90aCBtZXRob2RzIG9uIHRoZSAgDQotc2VydmljZSBpbXBsZW5ldGF0aW9uJ3MgaW1wbGljaXQgU0VJLg0KLQ0KLVRoZSBkaXNwYXRjaCBjbGllbnQgY2xhc3MgaXM6IHNyY1xvcmdcYXBhY2hlXGF4aXMyXGpheHdzXGFkZHJlc3Nib29rXEFkZHJlc3NCb29rQ2xpZW50LmphdmENCi0NCi1UaGlzIGZpbGUgd2lsbCBiZSBjb21waWxlZCBpbnRvIHRhcmdldC9jbGFzc2VzIGFzIHBhcnQgb2YgdGhlIGJ1aWxkLg0KLQ0KLQ0KLVN0ZXAgNDogUnVuIHRoZSBEaXNwYXRjaCBjbGllbnQgYWdhaW5zdCB0aGUgc2VydmljZSBpbXBsZW1lbnRhdGlvbiBkZXBsb3llZCBpbiB0aGUgQXhpczIgc2VydmVyDQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0oYSkgU2V0dXAgeW91ciBlbnZpcm9ubWVudCB0byBydW4gdGhlIHNhbXBsZS4gIFlvdSB3aWxsIG5lZWQgdHdvIHdpbmRvd3MsIG9uZSBmb3IgdGhlIHNlcnZlcg0KLWFuZCBvbmUgZm9yIHRoZSBjbGllbnQuICBFYWNoIG5lZWRzIHRoZSBmb2xsb3dpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzIHNldDoNCi0tIEF4aXMyIGJpbmFyeSBkaXN0cmlidXRpb24uICBGb3IgZXhhbXBsZTogQVhJUzJfSE9NRT1DOlx0ZW1wXEF4aXMyXGF4aXMyLVNOQVBTSE9UDQotLSBKYXZhNSBKREsuICBGb3IgZXhhbXBsZTogSkFWQV9IT01FPWM6XGphdmFcamF2YTUgDQotDQotKGIpIENvcHkgdGhlIHNlcnZpY2UgaW1wbGVtZW50YXRpb24gSkFSIGZpbGUgZnJvbSB0aGUgc2FtcGxlIHRhcmdldCBkaXJlY3RvcnkgdG8gdGhlIGFwcHJvcHJpYXRlIA0KLUF4aXMyIHJlcG9zaXRvcnkgZGlyZWN0b3J5LCAlQVhJUzJfSE9NRSVccmVwb3NpdG9yeVxzZXJ2aWNlamFycy4gIE5vdGUgdGhhdCBKQVIgZmlsZXMgaW4gdGhpcyANCi1kaXJlY3Rvcnkgd2lsbCBiZSBkZXBsb3llZCBpbnRvIHRoZSBBeGlzMiBzaW1wbGUgc2VydmVyIHVzaW5nIG9ubHkgYW5ub3RhdGlvbnMgb24gY2xhc3NlcyANCi13aXRoaW4gdGhlIEpBUnM7IG5vIGRlcGxveW1lbnQgZGVzY3JpcHRvciBpcyByZXF1aXJlZC4NCi0NCi1JZiB0aGUgcmVwb3NpdG9yeSBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QsIGNyZWF0ZSBpdCBmaXJzdCwgdGhlbiBjb3B5IHRoZSBzZXJ2aWNlIA0KLWltcGxlbWVudGF0aW9uIEpBUjoNCi0JbWtkaXIgJUFYSVMyX0hPTUUlXHJlcG9zaXRvcnlcc2VydmljZWphcnMNCi0JY29weSB0YXJnZXRcamF4d3MtYWRkcmVzc2Jvb2stU05BUFNIT1QuamFyICVBWElTMl9IT01FJVxyZXBvc2l0b3J5XHNlcnZpY2VqYXJzDQotDQotKGMpIFN0YXJ0IHRoZSBheGlzMiBzZXJ2ZXIuICBUaGlzIHdpbGwgZGVwbG95IHRoZSBKQVgtV1Mgc2VydmljZSBpbXBsZW1lbnRhdGlvbi4NCi0JY2QgJUFYSVMyX0hPTUUlDQotCWJpblxheGlzMnNlcnZlci5iYXQNCi0NCi1Zb3Ugc2hvdWxkIHNlZSBhIG1lc3NhZ2Ugc3VjaCBhczoNCi1bSU5GT10gRGVwbG95aW5nIGFydGlmYWN0IDogamF4d3MtYWRkcmVzc2Jvb2stU05BUFNIT1QuamFyDQotW0lORk9dIERlcGxveWluZyBKQVhXUyBhbm5vdGF0ZWQgY2xhc3Mgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5hZGRyZXNzYm9vay5BZGRyZXNzQm9va0ltcGwgYXMgYSBzZXJ2aWNlIC0gQWRkcmVzc0Jvb2tJbXBsU2VydmljZS5BZGRyZXNzQm9va0ltcGxQb3J0DQotDQotKGQpIEZyb20gYW5vdGhlciB3aW5kb3cgd2l0aCB0aGUgZW52aXJvbm1lbnQgc2V0dXAsIGluIHRoZSBqYXh3cy1hZGRyZXNzYm9vayBzYW1wbGVzIGRpcmVjdG9yeSBydW4gDQotdGhlIERpc3BhdGNoIGNsaWVudDoNCi0JamF2YSAtRGphdmEuZXh0LmRpcnM9JUFYSVMyX0hPTUUlXGxpYjslSkFWQV9IT01FJVxqcmVcbGliXGV4dCAtY3AgdGFyZ2V0L2NsYXNzZXMgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5hZGRyZXNzYm9vay5BZGRyZXNzQm9va0NsaWVudC5jbGFzcyANCi0NCi0NCi1Zb3Ugc2hvdWxkIHNlZSBzb21ldGhpbmcgbGlrZSB0aGUgZm9sbG93aW5nIGluIHRoZSBjbGllbnQgd2luZG93Og0KLT4+IEludm9raW5nIHN5bmMgRGlzcGF0Y2ggZm9yIEFkZEVudHJ5DQotQWRkIEVudHJ5IHJlc3BvbnNlOiA8ZGx3bWluOmFkZEVudHJ5UmVzcG9uc2UgeG1sbnM6ZGx3bWluPSJodHRwOi8vYWRkcmVzc2Jvb2suamF4d3MuYXhpczIuYXBhY2hlLm9yZy8iPjxyZXR1cm4geG1sbnM6bnMyDQotPSJodHRwOi8vYWRkcmVzc2Jvb2suamF4d3MuYXhpczIuYXBhY2hlLm9yZyI+QWRkRW50cnkgQ29tcGxldGVkITwvcmV0dXJuPjwvZGx3bWluOmFkZEVudHJ5UmVzcG9uc2U+DQotPj4gSW52b2tpbmcgRGlzcGF0Y2ggZm9yIGZpbmRCeUxhc3ROYW1lDQotRmluZCByZXNwb25zZTogPGRsd21pbjpmaW5kQnlMYXN0TmFtZVJlc3BvbnNlIHhtbG5zOmRsd21pbj0iaHR0cDovL2FkZHJlc3Nib29rLmpheHdzLmF4aXMyLmFwYWNoZS5vcmcvIj48cmV0dXJuIHhtbG5zOm5zDQotMj0iaHR0cDovL2FkZHJlc3Nib29rLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciPjxmaXJzdE5hbWU+Zmlyc3ROYW1lPC9maXJzdE5hbWU+PGxhc3ROYW1lPmxhc3ROYW1lPC9sYXN0TmFtZT48cGhvbmU+cGhvbmU8DQotL3Bob25lPjxzdHJlZXQ+c3RyZWV0PC9zdHJlZXQ+PGNpdHk+Y2l0eTwvY2l0eT48c3RhdGU+c3RhdGU8L3N0YXRlPjwvcmV0dXJuPjwvZGx3bWluOmZpbmRCeUxhc3ROYW1lUmVzcG9uc2U+DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1hZGRyZXNzYm9vay9wb20ueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1hZGRyZXNzYm9vay9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTk5MjA2Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3MtYWRkcmVzc2Jvb2svcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPg0KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+DQotICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczIuc2FtcGxlczwvZ3JvdXBJZD4NCi0gICAgPGFydGlmYWN0SWQ+amF4d3MtYWRkcmVzc2Jvb2s8L2FydGlmYWN0SWQ+DQotICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+DQotICAgIDx2ZXJzaW9uPjEuNS4xPC92ZXJzaW9uPg0KLSAgICA8bmFtZT5KQVhXUyBBZGRyZXNzYm9vayBTZXJ2aWNlPC9uYW1lPg0KLSAgICA8YnVpbGQ+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+MS41LjE8L3ZlcnNpb24+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgIDwvZGVwZW5kZW5jaWVzPg0KLSAgICA8cmVwb3NpdG9yaWVzPg0KLSAgICAgICAgPHJlcG9zaXRvcnk+DQotICAgICAgICAgICAgPGlkPmFwYWNoZS1tMjwvaWQ+DQotICAgICAgICAgICAgPHVybD5odHRwOi8vcGVvcGxlLmFwYWNoZS5vcmcvcmVwby9tMi1pYmlibGlvLXJzeW5jLXJlcG9zaXRvcnk8L3VybD4NCi0gICAgICAgIDwvcmVwb3NpdG9yeT4NCi0gICAgICAgIDxyZXBvc2l0b3J5Pg0KLSAgICAgICAgICAgIDxpZD5hcGFjaGUtc25hcHNob3RzPC9pZD4NCi0gICAgICAgICAgICA8dXJsPmh0dHA6Ly9wZW9wbGUuYXBhY2hlLm9yZy9yZXBvL20yLXNuYXBzaG90LXJlcG9zaXRvcnkvPC91cmw+DQotICAgICAgICA8L3JlcG9zaXRvcnk+DQotICAgICAgICA8cmVwb3NpdG9yeT4NCi0gICAgICAgICAgICA8aWQ+bWF2ZW4yPC9pZD4NCi0gICAgICAgICAgICA8dXJsPmh0dHA6Ly9yZXBvMS5tYXZlbi5vcmcvbWF2ZW4yLzwvdXJsPg0KLSAgICAgICAgPC9yZXBvc2l0b3J5Pg0KLSAgICA8L3JlcG9zaXRvcmllcz4NCi0gICAgPHBsdWdpblJlcG9zaXRvcmllcz4NCi0gICAgICAgIDxwbHVnaW5SZXBvc2l0b3J5Pg0KLSAgICAgICAgICAgIDxpZD5hcGFjaGUtbTI8L2lkPg0KLSAgICAgICAgICAgIDx1cmw+aHR0cDovL3Blb3BsZS5hcGFjaGUub3JnL3JlcG8vbTItaWJpYmxpby1yc3luYy1yZXBvc2l0b3J5PC91cmw+DQotICAgICAgICA8L3BsdWdpblJlcG9zaXRvcnk+DQotICAgICAgICA8cGx1Z2luUmVwb3NpdG9yeT4NCi0gICAgICAgICAgICA8aWQ+YXBhY2hlLXNuYXBzaG90czwvaWQ+DQotICAgICAgICAgICAgPHVybD5odHRwOi8vcGVvcGxlLmFwYWNoZS5vcmcvcmVwby9tMi1zbmFwc2hvdC1yZXBvc2l0b3J5PC91cmw+DQotICAgICAgICA8L3BsdWdpblJlcG9zaXRvcnk+DQotICAgICAgICA8cGx1Z2luUmVwb3NpdG9yeT4NCi0gICAgICAgICAgICA8aWQ+bWF2ZW4yPC9pZD4NCi0gICAgICAgICAgICA8dXJsPmh0dHA6Ly9yZXBvMS5tYXZlbi5vcmcvbWF2ZW4yLzwvdXJsPg0KLSAgICAgICAgPC9wbHVnaW5SZXBvc2l0b3J5Pg0KLSAgICA8L3BsdWdpblJlcG9zaXRvcmllcz4NCi08L3Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1hZGRyZXNzYm9vay9zcmMvQWRkcmVzc0Jvb2tFbnRyeS54c2QgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLWFkZHJlc3Nib29rL3NyYy9BZGRyZXNzQm9va0VudHJ5LnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU3ZTQ0My4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLWFkZHJlc3Nib29rL3NyYy9BZGRyZXNzQm9va0VudHJ5LnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTx4c2Q6c2NoZW1hIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiDQotICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vYWRkcmVzc2Jvb2suamF4d3MuYXhpczIuYXBhY2hlLm9yZyINCi0gICAgICAgICAgICB4bWxuczp0bnM9Imh0dHA6Ly9hZGRyZXNzYm9vay5qYXh3cy5heGlzMi5hcGFjaGUub3JnIj4NCi0gIDx4c2Q6ZWxlbWVudCBuYW1lPSJBZGRyZXNzQm9va0VudHJ5IiB0eXBlPSJ0bnM6QWRkcmVzc0Jvb2tFbnRyeSIvPg0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkFkZHJlc3NCb29rRW50cnkiPg0KLSAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+DQotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDphbnlUeXBlIj4NCi0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmlyc3ROYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+DQotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imxhc3ROYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+DQotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBob25lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+DQotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cmVldCIgdHlwZT0ieHNkOnN0cmluZyIvPg0KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjaXR5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+DQotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0YXRlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+DQotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPg0KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+DQotICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+DQotICAgIDwveHNkOmNvbXBsZXhUeXBlPg0KLTwveHNkOnNjaGVtYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLWFkZHJlc3Nib29rL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2FkZHJlc3Nib29rL0FkZHJlc3NCb29rLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLWFkZHJlc3Nib29rL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2FkZHJlc3Nib29rL0FkZHJlc3NCb29rLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkOWFhZmIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1hZGRyZXNzYm9vay9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9hZGRyZXNzYm9vay9BZGRyZXNzQm9vay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmFkZHJlc3Nib29rOw0KLQ0KLS8qKg0KLSAqIFRoZSBKQVgtV1MgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UgKFNFSSkuICANCi0gKiANCi0gKiBOT1RFOiBUaGUgU0VJIGlzIE5PVCBVU0VEIGluIHRoaXMgZXhhbXBsZS4gIFRoZSBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIHB1Ymxpc2hpbmcgYWxsIHB1YmxpYw0KLSAqICAgICAgIG1ldGhvZHMgYXMgYW4gaW1wbGljaXQgU0VJLiANCi0gKi8NCi0NCi1wdWJsaWMgaW50ZXJmYWNlIEFkZHJlc3NCb29rIHsNCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIGFkZEVudHJ5KFN0cmluZyBmaXJzdE5hbWUsIFN0cmluZyBsYXN0TmFtZSwgU3RyaW5nIHBob25lLCBTdHJpbmcgc3RyZWV0LCBTdHJpbmcgY2l0eSwgU3RyaW5nIHN0YXRlKTsNCi0gICAgDQotICAgIHB1YmxpYyBBZGRyZXNzQm9va0VudHJ5IGZpbmRCeUxhc3ROYW1lKFN0cmluZyBsYXN0TmFtZSk7DQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3MtYWRkcmVzc2Jvb2svc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvYWRkcmVzc2Jvb2svQWRkcmVzc0Jvb2tDbGllbnQuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3MtYWRkcmVzc2Jvb2svc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvYWRkcmVzc2Jvb2svQWRkcmVzc0Jvb2tDbGllbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI0MjliMC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLWFkZHJlc3Nib29rL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2FkZHJlc3Nib29rL0FkZHJlc3NCb29rQ2xpZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuYWRkcmVzc2Jvb2s7DQotDQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5CaW5kaW5nUHJvdmlkZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5EaXNwYXRjaDsNCi1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7DQotDQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogU2ltcGxlIEpBWC1XUyBEaXNwYXRjaCBjbGllbnQgZm9yIHRoZSBhZGRyZXNzIGJvb2sgc2VydmljZSBpbXBsZW1lbnRhdGlvbi4NCi0gKi8NCi1wdWJsaWMgY2xhc3MgQWRkcmVzc0Jvb2tDbGllbnQgew0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgTkFNRVNQQUNFID0gImh0dHA6Ly9hZGRyZXNzYm9vay5qYXh3cy5heGlzMi5hcGFjaGUub3JnIjsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgUU5hbWUgUU5BTUVfU0VSVklDRSA9IG5ldyBRTmFtZShOQU1FU1BBQ0UsICJzZXJ2aWNlIik7DQotICAgIHByaXZhdGUgc3RhdGljIFFOYW1lIFFOQU1FX1BPUlQgPSBuZXcgUU5hbWUoTkFNRVNQQUNFLCAicG9ydCIpOw0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgRU5EUE9JTlRfVVJMID0gImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9heGlzMi9zZXJ2aWNlcy9BZGRyZXNzQm9va0ltcGxTZXJ2aWNlLkFkZHJlc3NCb29rSW1wbFBvcnQiOw0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgQUREX0VOVFJZX0JPRFlfQ09OVEVOVFMgPSANCi0gICAgICAgICI8bnMxOmFkZEVudHJ5IHhtbG5zOm5zMT1cImh0dHA6Ly9hZGRyZXNzYm9vay5qYXh3cy5heGlzMi5hcGFjaGUub3JnXCI+IiArIA0KLSAgICAgICAgICAiPG5zMTpmaXJzdE5hbWUgeG1sbnM9XCJodHRwOi8vYWRkcmVzc2Jvb2suamF4d3MuYXhpczIuYXBhY2hlLm9yZ1wiPm15Rmlyc3ROYW1lPC9uczE6Zmlyc3ROYW1lPiIgKyANCi0gICAgICAgICAgIjxuczE6bGFzdE5hbWUgeG1sbnM9XCJodHRwOi8vYWRkcmVzc2Jvb2suamF4d3MuYXhpczIuYXBhY2hlLm9yZ1wiPm15TGFzdE5hbWU8L25zMTpsYXN0TmFtZT4iICsgDQotICAgICAgICAgICI8bnMxOnBob25lIHhtbG5zPVwiaHR0cDovL2FkZHJlc3Nib29rLmpheHdzLmF4aXMyLmFwYWNoZS5vcmdcIj5teVBob25lPC9uczE6cGhvbmU+IiArIA0KLSAgICAgICAgICAiPG5zMTpzdHJlZXQgeG1sbnM9XCJodHRwOi8vYWRkcmVzc2Jvb2suamF4d3MuYXhpczIuYXBhY2hlLm9yZ1wiPm15U3RyZWV0PC9uczE6c3RyZWV0PiIgKyANCi0gICAgICAgICAgIjxuczE6Y2l0eSB4bWxucz1cImh0dHA6Ly9hZGRyZXNzYm9vay5qYXh3cy5heGlzMi5hcGFjaGUub3JnXCI+bXlDaXR5PC9uczE6Y2l0eT4iICsgDQotICAgICAgICAgICI8bnMxOnN0YXRlIHhtbG5zPVwiaHR0cDovL2FkZHJlc3Nib29rLmpheHdzLmF4aXMyLmFwYWNoZS5vcmdcIj5teVN0YXRlPC9uczE6c3RhdGU+IiArIA0KLSAgICAgICAgIjwvbnMxOmFkZEVudHJ5PiI7DQotICAgIA0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgRklORF9CT0RZX0NPTlRFTlRTID0gDQotICAgICAgICAiPG5zMTpmaW5kQnlMYXN0TmFtZSB4bWxuczpuczE9XCJodHRwOi8vYWRkcmVzc2Jvb2suamF4d3MuYXhpczIuYXBhY2hlLm9yZ1wiPiIgKw0KLSAgICAgICAgICAiPG5zMTpsYXN0TmFtZSB4bWxucz1cImh0dHA6Ly9hZGRyZXNzYm9vay5qYXh3cy5heGlzMi5hcGFjaGUub3JnXCI+bXlMYXN0TmFtZTwvbnMxOmxhc3ROYW1lPiIgKyAgICAgICAgDQotICAgICAgICAiPC9uczE6ZmluZEJ5TGFzdE5hbWU+IjsNCi0gICAgDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJBZGRyZXNzQm9va0NsaWVudCAuLi4iKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBTZXJ2aWNlIHN2YyA9IFNlcnZpY2UuY3JlYXRlKFFOQU1FX1NFUlZJQ0UpOw0KLSAgICAgICAgICAgIHN2Yy5hZGRQb3J0KFFOQU1FX1BPUlQsIG51bGwsIEVORFBPSU5UX1VSTCk7DQotDQotICAgICAgICAgICAgLy8gQSBEaXNwYXRjaDxTdHJpbmc+IGNsaWVudCBzZW5kcyB0aGUgcmVxdWVzdCBhbmQgcmVjZWl2ZXMgdGhlIHJlc3BvbnNlIGFzIA0KLSAgICAgICAgICAgIC8vIFN0cmluZ3MuICBTaW5jZSBpdCBpcyBQQVlMT0FEIG1vZGUsIHRoZSBjbGllbnQgd2lsbCBwcm92aWRlIHRoZSBTT0FQIGJvZHkgdG8gYmUgDQotICAgICAgICAgICAgLy8gc2VudDsgdGhlIFNPQVAgZW52ZWxvcGUgYW5kIGFueSByZXF1aXJlZCBTT0FQIGhlYWRlcnMgd2lsbCBiZSBhZGRlZCBieSBKQVgtV1MuDQotICAgICAgICAgICAgRGlzcGF0Y2g8U3RyaW5nPiBkaXNwYXRjaCA9IHN2Yy5jcmVhdGVEaXNwYXRjaChRTkFNRV9QT1JULCANCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZy5jbGFzcywgU2VydmljZS5Nb2RlLlBBWUxPQUQpOw0KLSAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBJbnZva2UgdGhlIERpc3BhdGNoDQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCI+PiBJbnZva2luZyBzeW5jIERpc3BhdGNoIGZvciBBZGRFbnRyeSIpOw0KLSAgICAgICAgICAgIFN0cmluZyByZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZShBRERfRU5UUllfQk9EWV9DT05URU5UUyk7DQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJBZGQgRW50cnkgcmVzcG9uc2U6ICIgKyByZXNwb25zZSk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCI+PiBJbnZva2luZyBEaXNwYXRjaCBmb3IgZmluZEJ5TGFzdE5hbWUiKTsNCi0gICAgICAgICAgICBTdHJpbmcgcmVzcG9uc2UyID0gZGlzcGF0Y2guaW52b2tlKEZJTkRfQk9EWV9DT05URU5UUyk7DQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJGaW5kIHJlc3BvbnNlOiAiICsgcmVzcG9uc2UyKTsNCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDYXVnaHQgZXhjZXB0aW9uOiAiICsgZSk7DQotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLWFkZHJlc3Nib29rL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2FkZHJlc3Nib29rL0FkZHJlc3NCb29rSW1wbC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1hZGRyZXNzYm9vay9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9hZGRyZXNzYm9vay9BZGRyZXNzQm9va0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTExNjAxZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLWFkZHJlc3Nib29rL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2FkZHJlc3Nib29rL0FkZHJlc3NCb29rSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmFkZHJlc3Nib29rOw0KLQ0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsNCi0NCi0vKioNCi0gKiBKQVgtV1Mgc2VydmljZSBpbXBsZW1lbnRhdGlvbiB0aGF0IHVzZXMgYW5kIGltcGxpY2l0IFNFSSByYXRoZXIgdGhhbiBhbiBleHBsaWNpdCBTRUkuICBBbg0KLSAqIGltcGxpY2l0IFNFSSBtZWFucyB0aGF0IHRoZXJlIGlzIG5vIEBXZWJTZXJ2aWNlLmVuZHBvaW50SW50ZXJmYWNlIGVsZW1lbnQgc3BlY2lmaWVkLiAgVGhpcyBtZWFucw0KLSAqIHRoYXQgYWxsIHB1YmxpYyBtZXRob2RzIG9uIHRoZSBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIGNvbXByaXNlIGFuIGltcGxpY2l0IFNFSS4NCi0gKi8NCi0NCi0vLyBTaW1wbHkgYWRkaW5nIHRoZSBAV2ViU2VydmljZSBhbm5vdGF0aW9uIG1ha2VzIHRoaXMgYSBKQVgtV1Mgc2VydmljZSBpbXBsZW1lbnRhdGlvbi4NCi1AV2ViU2VydmljZQ0KLXB1YmxpYyBjbGFzcyBBZGRyZXNzQm9va0ltcGwgIHsNCi0NCi0gICAgcHVibGljIFN0cmluZyBhZGRFbnRyeShTdHJpbmcgZmlyc3ROYW1lLCBTdHJpbmcgbGFzdE5hbWUsIFN0cmluZyBwaG9uZSwgU3RyaW5nIHN0cmVldCwgU3RyaW5nIGNpdHksIFN0cmluZyBzdGF0ZSkgew0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJBZGRyZXNzQm9va0ltcGwuYWRkRW50cnkiKTsNCi0gICAgICAgIEFkZHJlc3NCb29rRW50cnkgZW50cnkgPSBuZXcgQWRkcmVzc0Jvb2tFbnRyeSgpOw0KLSAgICAgICAgZW50cnkuc2V0Rmlyc3ROYW1lKGZpcnN0TmFtZSk7DQotICAgICAgICBlbnRyeS5zZXRMYXN0TmFtZShsYXN0TmFtZSk7DQotICAgICAgICBlbnRyeS5zZXRQaG9uZShwaG9uZSk7DQotICAgICAgICBlbnRyeS5zZXRTdHJlZXQoc3RyZWV0KTsNCi0gICAgICAgIGVudHJ5LnNldENpdHkoY2l0eSk7DQotICAgICAgICBlbnRyeS5zZXRTdGF0ZShzdGF0ZSk7DQotICAgICAgICByZXR1cm4gIkFkZEVudHJ5IENvbXBsZXRlZCEiOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBBZGRyZXNzQm9va0VudHJ5IGZpbmRCeUxhc3ROYW1lKFN0cmluZyBsYXN0TmFtZSkgew0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJBZGRyZXNzQm9va0ltcGwuZmluZEJ5TGFzdE5hbWUiKTsNCi0gICAgICAgIEFkZHJlc3NCb29rRW50cnkgZW50cnkgPSBuZXcgQWRkcmVzc0Jvb2tFbnRyeSgpOyANCi0gICAgICAgIGVudHJ5LnNldEZpcnN0TmFtZSgiZmlyc3ROYW1lIik7DQotICAgICAgICBlbnRyeS5zZXRMYXN0TmFtZSgibGFzdE5hbWUiKTsNCi0gICAgICAgIGVudHJ5LnNldFBob25lKCJwaG9uZSIpOw0KLSAgICAgICAgZW50cnkuc2V0U3RyZWV0KCJzdHJlZXQiKTsNCi0gICAgICAgIGVudHJ5LnNldENpdHkoImNpdHkiKTsNCi0gICAgICAgIGVudHJ5LnNldFN0YXRlKCJzdGF0ZSIpOw0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJBZGRyZXNzQm9va0ltcGwuZmluZEJ5TGFzdE5hbWUgcmV0dXJuaW5nICIgKyBlbnRyeSk7DQotICAgICAgICByZXR1cm4gZW50cnk7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1jYWxjdWxhdG9yL1JFQURNRS50eHQgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLWNhbGN1bGF0b3IvUkVBRE1FLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQwNDc3YS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLWNhbGN1bGF0b3IvUkVBRE1FLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLVNhbXBsZTogSkFYV1MtQ2FsY3VsYXRvcgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUludHJvZHVjdGlvbgotPT09PT09PT09PT09Ci0KLVRoaXMgaXMgYW4gZXhhbXBsZSBKQVhXUyBXZWIgc2VydmljZS4gSXQgc2hvd3MgaG93IHRvIGV4cG9zZSB0aGUgbWV0aG9kcyBvZiBhIGNsYXNzIGFzIGEgSkFYV1MgV2ViCi1zZXJ2aWNlIHVzaW5nIEF4aXMyLgotCi0KLUJ1aWxkaW5nIHRoZSBTZXJ2aWNlCi09PT09PT09PT09PT09PT09PT09PQotCi1UbyBidWlsZCB0aGUgc2FtcGxlIHNlcnZpY2UsIHR5cGU6IG12biBjbGVhbiBpbnN0YWxsCi0KLVRoaXMgd2lsbCBidWlsZCB0aGUgamF4d3MtY2FsY3VsYXRvci5qYXIgaW4gdGhlIHRhcmdldCBkaXJlY3RvcnkgYW5kIGNvcHkgaXQgdG8gdGhlCi08QVhJUzJfSE9NRT4vcmVwb3NpdG9yeS9zZXJ2aWNlamFycyBkaXJlY3RvcnkgKGNyZWF0ZSB0aGF0IGRpcmVjdG9yeSBpZiBpdCdzIG5vdCB5ZXQgY3JlYXRlZCkKLQotWW91IGNhbiBzdGFydCB0aGUgQXhpczIgc2VydmVyIGJ5IHJ1bm5pbmcgZWl0aGVyIGF4aXMyc2VydmVyLmJhdCAob24gV2luZG93cykgb3IgYXhpczJzZXJ2ZXIuc2gKLShvbiBMaW51eCl0aGF0IGFyZSBsb2NhdGVkIGluIDxBWElTMl9IT01FPi9iaW4gZGlyZWN0b3J5LgotCi1UaGUgV1NETCBmb3IgdGhpcyBzZXJ2aWNlIHNob3VsZCBiZSB2aWV3YWJsZSBhdDoKLQotaHR0cDovLzx5b3VyaG9zdD46PHlvdXJwb3J0Pi9heGlzMi9zZXJ2aWNlcy9DYWxjdWxhdG9yU2VydmljZS5DYWxjdWxhdG9yU2VydmljZVBvcnQ/d3NkbAotKGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9heGlzMi9zZXJ2aWNlcy9DYWxjdWxhdG9yU2VydmljZS5DYWxjdWxhdG9yU2VydmljZVBvcnQ/d3NkbCkKLQotCi1SdW5uaW5nIHRoZSBDbGllbnQKLT09PT09PT09PT09PT09PT09PQotCi0xLiBTZXQgdXAgYSBDTEFTU1BBVEggd2l0aCB0aGUgZm9sbG93aW5nIAotLSBhbGwgdGhlIGphcnMgaW4gPEFYSVMyX0hPTUUvbGliPgotLSB0aGUgamF4d3MtY2FsY3VsYXRvci1TTkFQU0hPVC1jbGllbnQuamFyIHVuZGVyIHRoZSB0YXJnZXQgZGlyZWN0b3J5Ci0tIGFkZHJlc3NpbmcgbWFyIGluIDxBWElTMl9IT01FL3JlcG9zaXRvcnkvbW9kdWxlcz4KLQotMi4gUnVuIHRoZSBjbGllbnQgdXNpbmcgc2F5ICJqYXZhIC1jbGFzc3BhdGggJUNMQVNTUEFUSCUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jYWxjdWxhdG9yLmNsaWVudC5BZGRTRUlDbGllbnQgMyAzMyIKLQotSGVscAotPT09PQotUGxlYXNlIGNvbnRhY3QgYXhpcy11c2VyIGxpc3QgKGF4aXMtdXNlckB3cy5hcGFjaGUub3JnKSBpZiB5b3UgaGF2ZSBhbnkgdHJvdWJsZSBydW5uaW5nIHRoZSBzYW1wbGUuCi0KLUltcHJvdmVtZW50cwotPT09PT09PT09PT09Ci1NYWtlIHRoaXMgc2FtcGxlIHJ1biBwb3NzaWJsZSB3aXRoIGFudCAKLQotCi0qKioqIFdBUk5JTkcgKioqKgotUGxlYXNlIFJlbW92ZSB4YWxhbiBqYXIgZnJvbSA8QVhJUzJfSE9NRT4vIGJlZm9yZSB5b3Ugc3RhcnQgYXhpczIgc2VydmVyLiBJZiB5b3UgYXJlIHVzaW5nIHRoaXMKLXNhbXBsZSBpbnNpZGUgYSBXQVIsIHBsZWFzZSByZW1vdmUgeGFsYW4gamFyIGZyb20gV0VCLUlORi9saWIKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3MtY2FsY3VsYXRvci9wb20ueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1jYWxjdWxhdG9yL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0ZGVhOTIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1jYWxjdWxhdG9yL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczIuc2FtcGxlczwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5qYXh3cy1jYWxjdWxhdG9yPC9hcnRpZmFjdElkPgotICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+Ci0gICAgPHZlcnNpb24+MS41LjE8L3ZlcnNpb24+Ci0gICAgPG5hbWU+SkFYV1MgQ2FsY3VsYXRvciBTZXJ2aWNlPC9uYW1lPgotICAgIDxidWlsZD4KLSAgICAgICAgPHNvdXJjZURpcmVjdG9yeT5zcmM8L3NvdXJjZURpcmVjdG9yeT4KLSAgICAgICAgPHJlc291cmNlcz4KLSAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICA8ZGlyZWN0b3J5PnJlc291cmNlczwvZGlyZWN0b3J5PgotICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgIDwvcmVzb3VyY2VzPgotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphci1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+amFyPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc2lmaWVyPmNsaWVudDwvY2xhc3NpZmllcj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqL2NsaWVudC8qPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8c291cmNlPjEuNTwvc291cmNlPgotICAgICAgICAgICAgICAgICAgICA8dGFyZ2V0PjEuNTwvdGFyZ2V0PgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgPC9idWlsZD4KLSAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmphdmF4LnhtbC5iaW5kPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF4Yi1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4yLjE8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8ZXhjbHVzaW9ucz4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qc3IxNzM8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPmphdmF4LnhtbDwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgIDwvZXhjbHVzaW9ucz4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1qYXh3czwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuNS4xPC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPC9kZXBlbmRlbmNpZXM+Ci0gICAgPHJlcG9zaXRvcmllcz4KLSAgICAgICAgPHJlcG9zaXRvcnk+Ci0gICAgICAgICAgICA8aWQ+YXBhY2hlLW0yPC9pZD4KLSAgICAgICAgICAgIDx1cmw+aHR0cDovL3Blb3BsZS5hcGFjaGUub3JnL3JlcG8vbTItaWJpYmxpby1yc3luYy1yZXBvc2l0b3J5PC91cmw+Ci0gICAgICAgIDwvcmVwb3NpdG9yeT4KLSAgICAgICAgPHJlcG9zaXRvcnk+Ci0gICAgICAgICAgICA8aWQ+YXBhY2hlLXNuYXBzaG90czwvaWQ+Ci0gICAgICAgICAgICA8dXJsPmh0dHA6Ly9wZW9wbGUuYXBhY2hlLm9yZy9yZXBvL20yLXNuYXBzaG90LXJlcG9zaXRvcnkvPC91cmw+Ci0gICAgICAgIDwvcmVwb3NpdG9yeT4KLSAgICAgICAgPHJlcG9zaXRvcnk+Ci0gICAgICAgICAgICA8aWQ+bWF2ZW4yPC9pZD4KLSAgICAgICAgICAgIDx1cmw+aHR0cDovL3JlcG8xLm1hdmVuLm9yZy9tYXZlbjIvPC91cmw+Ci0gICAgICAgIDwvcmVwb3NpdG9yeT4KLSAgICA8L3JlcG9zaXRvcmllcz4KLSAgICA8cGx1Z2luUmVwb3NpdG9yaWVzPgotICAgICAgICA8cGx1Z2luUmVwb3NpdG9yeT4KLSAgICAgICAgICAgIDxpZD5hcGFjaGUtbTI8L2lkPgotICAgICAgICAgICAgPHVybD5odHRwOi8vcGVvcGxlLmFwYWNoZS5vcmcvcmVwby9tMi1pYmlibGlvLXJzeW5jLXJlcG9zaXRvcnk8L3VybD4KLSAgICAgICAgPC9wbHVnaW5SZXBvc2l0b3J5PgotICAgICAgICA8cGx1Z2luUmVwb3NpdG9yeT4KLSAgICAgICAgICAgIDxpZD5hcGFjaGUtc25hcHNob3RzPC9pZD4KLSAgICAgICAgICAgIDx1cmw+aHR0cDovL3Blb3BsZS5hcGFjaGUub3JnL3JlcG8vbTItc25hcHNob3QtcmVwb3NpdG9yeTwvdXJsPgotICAgICAgICA8L3BsdWdpblJlcG9zaXRvcnk+Ci0gICAgICAgIDxwbHVnaW5SZXBvc2l0b3J5PgotICAgICAgICAgICAgPGlkPm1hdmVuMjwvaWQ+Ci0gICAgICAgICAgICA8dXJsPmh0dHA6Ly9yZXBvMS5tYXZlbi5vcmcvbWF2ZW4yLzwvdXJsPgotICAgICAgICA8L3BsdWdpblJlcG9zaXRvcnk+Ci0gICAgPC9wbHVnaW5SZXBvc2l0b3JpZXM+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLWNhbGN1bGF0b3IvcmVzb3VyY2VzL01FVEEtSU5GL0NhbGN1bGF0b3JTZXJ2aWNlLndzZGwgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLWNhbGN1bGF0b3IvcmVzb3VyY2VzL01FVEEtSU5GL0NhbGN1bGF0b3JTZXJ2aWNlLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4NmVkMjEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1jYWxjdWxhdG9yL3Jlc291cmNlcy9NRVRBLUlORi9DYWxjdWxhdG9yU2VydmljZS53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI/PgotPGRlZmluaXRpb25zIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2NhbGN1bGF0b3IuamF4d3MuYXhpczIuYXBhY2hlLm9yZyIgbmFtZT0iQ2FsY3VsYXRvclNlcnZpY2UiCi0gICAgICAgICAgICAgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB4bWxuczp3c2F3PSJodHRwOi8vd3d3LnczLm9yZy8yMDA2LzA1L2FkZHJlc3Npbmcvd3NkbCIKLSAgICAgICAgICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczp0bnM9Imh0dHA6Ly9jYWxjdWxhdG9yLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciCi0gICAgICAgICAgICAgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyI+Ci0gICAgPHR5cGVzPgotICAgICAgICA8eHNkOnNjaGVtYT4KLSAgICAgICAgICAgIDx4c2Q6aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL2NhbGN1bGF0b3IuamF4d3MuYXhpczIuYXBhY2hlLm9yZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYUxvY2F0aW9uPSJDYWxjdWxhdG9yU2VydmljZV9zY2hlbWExLnhzZCIvPgotICAgICAgICA8L3hzZDpzY2hlbWE+Ci0gICAgPC90eXBlcz4KLSAgICA8bWVzc2FnZSBuYW1lPSJnZXRUaWNrZXQiPgotICAgICAgICA8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJ0bnM6Z2V0VGlja2V0Ii8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9ImdldFRpY2tldFJlc3BvbnNlIj4KLSAgICAgICAgPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0idG5zOmdldFRpY2tldFJlc3BvbnNlIi8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9ImFkZCI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9InRuczphZGQiLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iYWRkUmVzcG9uc2UiPgotICAgICAgICA8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJ0bnM6YWRkUmVzcG9uc2UiLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iQWRkTnVtYmVyc0V4Y2VwdGlvbiI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9ImZhdWx0IiBlbGVtZW50PSJ0bnM6QWRkTnVtYmVyc0V4Y2VwdGlvbiIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8cG9ydFR5cGUgbmFtZT0iQ2FsY3VsYXRvciI+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iZ2V0VGlja2V0Ij4KLSAgICAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6Z2V0VGlja2V0Ii8+Ci0gICAgICAgICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczpnZXRUaWNrZXRSZXNwb25zZSIvPgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJhZGQiPgotICAgICAgICAgICAgPGlucHV0IHdzYXc6QWN0aW9uPSJodHRwOi8vY2FsY3VsYXRvci5qYXh3cy5heGlzMi5hcGFjaGUub3JnL2FkZCIgbWVzc2FnZT0idG5zOmFkZCIvPgotICAgICAgICAgICAgPG91dHB1dCB3c2F3OkFjdGlvbj0iaHR0cDovL2NhbGN1bGF0b3IuamF4d3MuYXhpczIuYXBhY2hlLm9yZy9hZGRSZXNwb25zZSIgbWVzc2FnZT0idG5zOmFkZFJlc3BvbnNlIi8+Ci0gICAgICAgICAgICA8ZmF1bHQgbWVzc2FnZT0idG5zOkFkZE51bWJlcnNFeGNlcHRpb24iIG5hbWU9IkFkZE51bWJlcnNFeGNlcHRpb24iCi0gICAgICAgICAgICAgICAgICAgd3NhdzpBY3Rpb249Imh0dHA6Ly9jYWxjdWxhdG9yLmpheHdzLmF4aXMyLmFwYWNoZS5vcmcvYWRkRmF1bHQiLz4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgPC9wb3J0VHlwZT4KLSAgICA8YmluZGluZyBuYW1lPSJDYWxjdWxhdG9yU2VydmljZVBvcnRCaW5kaW5nIiB0eXBlPSJ0bnM6Q2FsY3VsYXRvciI+Ci0gICAgICAgIDx3c2F3OlVzaW5nQWRkcmVzc2luZy8+Ci0gICAgICAgIDxzb2FwOmJpbmRpbmcgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImdldFRpY2tldCI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+Ci0gICAgICAgICAgICA8aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvaW5wdXQ+Ci0gICAgICAgICAgICA8b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iYWRkIj4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4KLSAgICAgICAgICAgIDxpbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgIDxvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvb3V0cHV0PgotICAgICAgICAgICAgPGZhdWx0IG5hbWU9IkFkZE51bWJlcnNFeGNlcHRpb24iPgotICAgICAgICAgICAgICAgIDxzb2FwOmZhdWx0IG5hbWU9IkFkZE51bWJlcnNFeGNlcHRpb24iIHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC9mYXVsdD4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgPC9iaW5kaW5nPgotICAgIDxzZXJ2aWNlIG5hbWU9IkNhbGN1bGF0b3JTZXJ2aWNlIj4KLSAgICAgICAgPHBvcnQgbmFtZT0iQ2FsY3VsYXRvclNlcnZpY2VQb3J0IiBiaW5kaW5nPSJ0bnM6Q2FsY3VsYXRvclNlcnZpY2VQb3J0QmluZGluZyI+Ci0gICAgICAgICAgICA8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJSRVBMQUNFX1dJVEhfQUNUVUFMX1VSTCIvPgotICAgICAgICA8L3BvcnQ+Ci0gICAgPC9zZXJ2aWNlPgotPC9kZWZpbml0aW9ucz4KLQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1jYWxjdWxhdG9yL3Jlc291cmNlcy9NRVRBLUlORi9DYWxjdWxhdG9yU2VydmljZV9zY2hlbWExLnhzZCBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3MtY2FsY3VsYXRvci9yZXNvdXJjZXMvTUVUQS1JTkYvQ2FsY3VsYXRvclNlcnZpY2Vfc2NoZW1hMS54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1YWZmMTcuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1jYWxjdWxhdG9yL3Jlc291cmNlcy9NRVRBLUlORi9DYWxjdWxhdG9yU2VydmljZV9zY2hlbWExLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KLTx4czpzY2hlbWEgdmVyc2lvbj0iMS4wIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9jYWxjdWxhdG9yLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciCi0gICAgICAgICAgIHhtbG5zOnRucz0iaHR0cDovL2NhbGN1bGF0b3IuamF4d3MuYXhpczIuYXBhY2hlLm9yZyIgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICAgICB4bWxuczpuczE9Imh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDgvYWRkcmVzc2luZyI+Ci0KLSAgICA8eHM6aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3d3dy53My5vcmcvMjAwNS8wOC9hZGRyZXNzaW5nIgotICAgICAgICAgICAgICAgc2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cudzMub3JnLzIwMDYvMDMvYWRkcmVzc2luZy93cy1hZGRyLnhzZCIvPgotCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0iQWRkTnVtYmVyc0V4Y2VwdGlvbiIgdHlwZT0idG5zOkFkZE51bWJlcnNFeGNlcHRpb24iLz4KLQotICAgIDx4czplbGVtZW50IG5hbWU9ImFkZCIgdHlwZT0idG5zOmFkZCIvPgotCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0iYWRkUmVzcG9uc2UiIHR5cGU9InRuczphZGRSZXNwb25zZSIvPgotCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0iZ2V0VGlja2V0IiB0eXBlPSJ0bnM6Z2V0VGlja2V0Ii8+Ci0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJnZXRUaWNrZXRSZXNwb25zZSIgdHlwZT0idG5zOmdldFRpY2tldFJlc3BvbnNlIi8+Ci0KLSAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iZ2V0VGlja2V0Ij4KLSAgICAgICAgPHhzOnNlcXVlbmNlLz4KLSAgICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImdldFRpY2tldFJlc3BvbnNlIj4KLSAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0icmV0dXJuIiB0eXBlPSJuczE6RW5kcG9pbnRSZWZlcmVuY2VUeXBlIiBmb3JtPSJxdWFsaWZpZWQiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iYWRkIj4KLSAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0idmFsdWUxIiB0eXBlPSJ4czppbnQiIGZvcm09InF1YWxpZmllZCIvPgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0idmFsdWUyIiB0eXBlPSJ4czppbnQiIGZvcm09InF1YWxpZmllZCIvPgotICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iYWRkUmVzcG9uc2UiPgotICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJyZXR1cm4iIHR5cGU9InhzOmludCIgZm9ybT0icXVhbGlmaWVkIi8+Ci0gICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLQotICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJBZGROdW1iZXJzRXhjZXB0aW9uIj4KLSAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ibWVzc2FnZSIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICA8L3hzOmNvbXBsZXhUeXBlPgotPC94czpzY2hlbWE+Ci0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3MtY2FsY3VsYXRvci9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jYWxjdWxhdG9yL0FkZC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1jYWxjdWxhdG9yL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NhbGN1bGF0b3IvQWRkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1YWRiMDYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1jYWxjdWxhdG9yL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NhbGN1bGF0b3IvQWRkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKgotKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0qIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0qIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0qIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0qICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0qCi0qIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotKgotKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0qIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0qIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jYWxjdWxhdG9yOwotCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZTsKLQotCi0vKioKLSAqIDxwPkphdmEgY2xhc3MgZm9yIGFkZCBjb21wbGV4IHR5cGUuCi0gKiA8cC8+Ci0gKiA8cD5UaGUgZm9sbG93aW5nIHNjaGVtYSBmcmFnbWVudCBzcGVjaWZpZXMgdGhlIGV4cGVjdGVkIGNvbnRlbnQgY29udGFpbmVkIHdpdGhpbiB0aGlzIGNsYXNzLgotICogPHAvPgotICogPHByZT4KLSAqICZsdDtjb21wbGV4VHlwZSBuYW1lPSJhZGQiPgotICogICAmbHQ7Y29tcGxleENvbnRlbnQ+Ci0gKiAgICAgJmx0O3Jlc3RyaWN0aW9uIGJhc2U9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1hbnlUeXBlIj4KLSAqICAgICAgICZsdDtzZXF1ZW5jZT4KLSAqICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0idmFsdWUxIiB0eXBlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9aW50Ii8+Ci0gKiAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9InZhbHVlMiIgdHlwZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfWludCIvPgotICogICAgICAgJmx0Oy9zZXF1ZW5jZT4KLSAqICAgICAmbHQ7L3Jlc3RyaWN0aW9uPgotICogICAmbHQ7L2NvbXBsZXhDb250ZW50PgotICogJmx0Oy9jb21wbGV4VHlwZT4KLSAqIDwvcHJlPgotICovCi1AWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpCi1AWG1sVHlwZShuYW1lID0gImFkZCIsIHByb3BPcmRlciA9IHsKLSAgICAgICAgInZhbHVlMSIsCi0gICAgICAgICJ2YWx1ZTIiCi0gICAgICAgIH0pCi1wdWJsaWMgY2xhc3MgQWRkIHsKLQotICAgIHByb3RlY3RlZCBpbnQgdmFsdWUxOwotICAgIHByb3RlY3RlZCBpbnQgdmFsdWUyOwotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIHZhbHVlMSBwcm9wZXJ0eS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFZhbHVlMSgpIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlMTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgdmFsdWUxIHByb3BlcnR5LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlMShpbnQgdmFsdWUpIHsKLSAgICAgICAgdGhpcy52YWx1ZTEgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgdmFsdWUyIHByb3BlcnR5LgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0VmFsdWUyKCkgewotICAgICAgICByZXR1cm4gdmFsdWUyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSB2YWx1ZTIgcHJvcGVydHkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWUyKGludCB2YWx1ZSkgewotICAgICAgICB0aGlzLnZhbHVlMiA9IHZhbHVlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1jYWxjdWxhdG9yL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NhbGN1bGF0b3IvQWRkTnVtYmVyc0V4Y2VwdGlvbi5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1jYWxjdWxhdG9yL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NhbGN1bGF0b3IvQWRkTnVtYmVyc0V4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjRiMzI4Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3MtY2FsY3VsYXRvci9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jYWxjdWxhdG9yL0FkZE51bWJlcnNFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qDQotKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0qIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotKg0KLSogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotKg0KLSogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0qICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0qIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0qIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSovDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNhbGN1bGF0b3I7DQotDQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzVHlwZTsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7DQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudDsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlOw0KLQ0KLQ0KLS8qKg0KLSAqIDxwPkphdmEgY2xhc3MgZm9yIEFkZE51bWJlcnNFeGNlcHRpb24gY29tcGxleCB0eXBlLg0KLSAqIDxwLz4NCi0gKiA8cD5UaGUgZm9sbG93aW5nIHNjaGVtYSBmcmFnbWVudCBzcGVjaWZpZXMgdGhlIGV4cGVjdGVkIGNvbnRlbnQgY29udGFpbmVkIHdpdGhpbiB0aGlzIGNsYXNzLg0KLSAqIDxwLz4NCi0gKiA8cHJlPg0KLSAqICZsdDtjb21wbGV4VHlwZSBuYW1lPSJBZGROdW1iZXJzRXhjZXB0aW9uIj4NCi0gKiAgICZsdDtjb21wbGV4Q29udGVudD4NCi0gKiAgICAgJmx0O3Jlc3RyaWN0aW9uIGJhc2U9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1hbnlUeXBlIj4NCi0gKiAgICAgICAmbHQ7c2VxdWVuY2U+DQotICogICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJtZXNzYWdlIiB0eXBlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4NCi0gKiAgICAgICAmbHQ7L3NlcXVlbmNlPg0KLSAqICAgICAmbHQ7L3Jlc3RyaWN0aW9uPg0KLSAqICAgJmx0Oy9jb21wbGV4Q29udGVudD4NCi0gKiAmbHQ7L2NvbXBsZXhUeXBlPg0KLSAqIDwvcHJlPg0KLSAqLw0KLUBYbWxBY2Nlc3NvclR5cGUoWG1sQWNjZXNzVHlwZS5GSUVMRCkNCi1AWG1sVHlwZShuYW1lID0gIkFkZE51bWJlcnNFeGNlcHRpb24iLCBwcm9wT3JkZXIgPSB7DQotICAgICAgICAibWVzc2FnZSINCi0gICAgICAgIH0pDQotcHVibGljIGNsYXNzIEFkZE51bWJlcnNFeGNlcHRpb24gew0KLQ0KLSAgICBAWG1sRWxlbWVudChuYW1lc3BhY2UgPSAiIikNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBtZXNzYWdlOw0KLQ0KLSAgICAvKioNCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIG1lc3NhZ2UgcHJvcGVydHkuDQotICAgICAqDQotICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzDQotICAgICAqICAgICAgICAge0BsaW5rIFN0cmluZyB9DQotICAgICAqLw0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7DQotICAgICAgICByZXR1cm4gbWVzc2FnZTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIG1lc3NhZ2UgcHJvcGVydHkuDQotICAgICAqDQotICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcw0KLSAgICAgKiAgICAgICAgICAgICAge0BsaW5rIFN0cmluZyB9DQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXNzYWdlKFN0cmluZyB2YWx1ZSkgew0KLSAgICAgICAgdGhpcy5tZXNzYWdlID0gdmFsdWU7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1jYWxjdWxhdG9yL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NhbGN1bGF0b3IvQWRkTnVtYmVyc0V4Y2VwdGlvbl9FeGNlcHRpb24uamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3MtY2FsY3VsYXRvci9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jYWxjdWxhdG9yL0FkZE51bWJlcnNFeGNlcHRpb25fRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzYjNkNGIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1jYWxjdWxhdG9yL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NhbGN1bGF0b3IvQWRkTnVtYmVyc0V4Y2VwdGlvbl9FeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qDQotKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0qIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotKg0KLSogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotKg0KLSogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0qICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0qIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0qIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSovDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNhbGN1bGF0b3I7DQotDQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJGYXVsdDsNCi0NCi0NCi1AV2ViRmF1bHQobmFtZSA9ICJBZGROdW1iZXJzRXhjZXB0aW9uIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9jYWxjdWxhdG9yLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciKQ0KLXB1YmxpYyBjbGFzcyBBZGROdW1iZXJzRXhjZXB0aW9uX0V4Y2VwdGlvbg0KLSAgICAgICAgZXh0ZW5kcyBFeGNlcHRpb24gew0KLQ0KLSAgICAvKioNCi0gICAgICogSmF2YSB0eXBlIHRoYXQgZ29lcyBhcyBzb2FwZW52OkZhdWx0IGRldGFpbCBlbGVtZW50Lg0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBBZGROdW1iZXJzRXhjZXB0aW9uIGZhdWx0SW5mbzsNCi0NCi0gICAgLyoqDQotICAgICAqIEBwYXJhbSBmYXVsdEluZm8NCi0gICAgICogQHBhcmFtIG1lc3NhZ2UNCi0gICAgICovDQotICAgIHB1YmxpYyBBZGROdW1iZXJzRXhjZXB0aW9uX0V4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgQWRkTnVtYmVyc0V4Y2VwdGlvbiBmYXVsdEluZm8pIHsNCi0gICAgICAgIHN1cGVyKG1lc3NhZ2UpOw0KLSAgICAgICAgdGhpcy5mYXVsdEluZm8gPSBmYXVsdEluZm87DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIEBwYXJhbSBmYXVsdEluZm8NCi0gICAgICogQHBhcmFtIG1lc3NhZ2UNCi0gICAgICogQHBhcmFtIGNhdXNlDQotICAgICAqLw0KLSAgICBwdWJsaWMgQWRkTnVtYmVyc0V4Y2VwdGlvbl9FeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIEFkZE51bWJlcnNFeGNlcHRpb24gZmF1bHRJbmZvLCBUaHJvd2FibGUgY2F1c2UpIHsNCi0gICAgICAgIHN1cGVyKG1lc3NhZ2UsIGNhdXNlKTsNCi0gICAgICAgIHRoaXMuZmF1bHRJbmZvID0gZmF1bHRJbmZvOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBAcmV0dXJuIHJldHVybnMgZmF1bHQgYmVhbjogb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jYWxjdWxhdG9yLmNsaWVudC5BZGROdW1iZXJzRXhjZXB0aW9uDQotICAgICAqLw0KLSAgICBwdWJsaWMgQWRkTnVtYmVyc0V4Y2VwdGlvbiBnZXRGYXVsdEluZm8oKSB7DQotICAgICAgICByZXR1cm4gZmF1bHRJbmZvOw0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3MtY2FsY3VsYXRvci9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jYWxjdWxhdG9yL0FkZFJlc3BvbnNlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLWNhbGN1bGF0b3Ivc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2FsY3VsYXRvci9BZGRSZXNwb25zZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTMwMDk2Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3MtY2FsY3VsYXRvci9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jYWxjdWxhdG9yL0FkZFJlc3BvbnNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKgotKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0qIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0qIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0qIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0qICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0qCi0qIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotKgotKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0qIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0qIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jYWxjdWxhdG9yOwotCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGU7Ci0KLQotLyoqCi0gKiA8cD5KYXZhIGNsYXNzIGZvciBhZGRSZXNwb25zZSBjb21wbGV4IHR5cGUuCi0gKiA8cC8+Ci0gKiA8cD5UaGUgZm9sbG93aW5nIHNjaGVtYSBmcmFnbWVudCBzcGVjaWZpZXMgdGhlIGV4cGVjdGVkIGNvbnRlbnQgY29udGFpbmVkIHdpdGhpbiB0aGlzIGNsYXNzLgotICogPHAvPgotICogPHByZT4KLSAqICZsdDtjb21wbGV4VHlwZSBuYW1lPSJhZGRSZXNwb25zZSI+Ci0gKiAgICZsdDtjb21wbGV4Q29udGVudD4KLSAqICAgICAmbHQ7cmVzdHJpY3Rpb24gYmFzZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfWFueVR5cGUiPgotICogICAgICAgJmx0O3NlcXVlbmNlPgotICogICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJyZXR1cm4iIHR5cGU9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1pbnQiLz4KLSAqICAgICAgICZsdDsvc2VxdWVuY2U+Ci0gKiAgICAgJmx0Oy9yZXN0cmljdGlvbj4KLSAqICAgJmx0Oy9jb21wbGV4Q29udGVudD4KLSAqICZsdDsvY29tcGxleFR5cGU+Ci0gKiA8L3ByZT4KLSAqLwotQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKQotQFhtbFR5cGUobmFtZSA9ICJhZGRSZXNwb25zZSIsIHByb3BPcmRlciA9IHsKLSAgICAgICAgIl9yZXR1cm4iCi0gICAgICAgIH0pCi1wdWJsaWMgY2xhc3MgQWRkUmVzcG9uc2UgewotCi0gICAgQFhtbEVsZW1lbnQobmFtZSA9ICJyZXR1cm4iKQotICAgIHByb3RlY3RlZCBpbnQgX3JldHVybjsKLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSByZXR1cm4gcHJvcGVydHkuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRSZXR1cm4oKSB7Ci0gICAgICAgIHJldHVybiBfcmV0dXJuOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSByZXR1cm4gcHJvcGVydHkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UmV0dXJuKGludCB2YWx1ZSkgewotICAgICAgICB0aGlzLl9yZXR1cm4gPSB2YWx1ZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3MtY2FsY3VsYXRvci9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jYWxjdWxhdG9yL0NhbGN1bGF0b3IuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3MtY2FsY3VsYXRvci9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jYWxjdWxhdG9yL0NhbGN1bGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI3ZTdjMC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLWNhbGN1bGF0b3Ivc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2FsY3VsYXRvci9DYWxjdWxhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKgotKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0qIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0qIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0qIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0qICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0qCi0qIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotKgotKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0qIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0qIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jYWxjdWxhdG9yOwotCi1pbXBvcnQgamF2YXguandzLldlYk1ldGhvZDsKLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW07Ci1pbXBvcnQgamF2YXguandzLldlYlJlc3VsdDsKLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFNlZUFsc287Ci1pbXBvcnQgamF2YXgueG1sLndzLlJlcXVlc3RXcmFwcGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5SZXNwb25zZVdyYXBwZXI7Ci1pbXBvcnQgamF2YXgueG1sLndzLndzYWRkcmVzc2luZy5XM0NFbmRwb2ludFJlZmVyZW5jZTsKLQotCi1AV2ViU2VydmljZShuYW1lID0gIkNhbGN1bGF0b3IiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL2NhbGN1bGF0b3IuamF4d3MuYXhpczIuYXBhY2hlLm9yZyIpCi1AWG1sU2VlQWxzbyh7Ci0gICAgICAgIE9iamVjdEZhY3RvcnkuY2xhc3MKLSAgICAgICAgfSkKLXB1YmxpYyBpbnRlcmZhY2UgQ2FsY3VsYXRvciB7Ci0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gcmV0dXJucyBqYXZheC54bWwud3Mud3NhZGRyZXNzaW5nLlczQ0VuZHBvaW50UmVmZXJlbmNlCi0gICAgICovCi0gICAgQFdlYk1ldGhvZAotICAgIEBXZWJSZXN1bHQodGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9jYWxjdWxhdG9yLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciKQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAiZ2V0VGlja2V0IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9jYWxjdWxhdG9yLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciLCBjbGFzc05hbWUgPSAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jYWxjdWxhdG9yLkdldFRpY2tldCIpCi0gICAgQFJlc3BvbnNlV3JhcHBlcihsb2NhbE5hbWUgPSAiZ2V0VGlja2V0UmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL2NhbGN1bGF0b3IuamF4d3MuYXhpczIuYXBhY2hlLm9yZyIsIGNsYXNzTmFtZSA9ICJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNhbGN1bGF0b3IuR2V0VGlja2V0UmVzcG9uc2UiKQotICAgIHB1YmxpYyBXM0NFbmRwb2ludFJlZmVyZW5jZSBnZXRUaWNrZXQoKTsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSB2YWx1ZTEKLSAgICAgKiBAcGFyYW0gdmFsdWUyCi0gICAgICogQHJldHVybiByZXR1cm5zIGludAotICAgICAqIEB0aHJvd3MgQWRkTnVtYmVyc0V4Y2VwdGlvbl9FeGNlcHRpb24KLSAgICAgKi8KLSAgICBAV2ViTWV0aG9kCi0gICAgQFdlYlJlc3VsdCh0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL2NhbGN1bGF0b3IuamF4d3MuYXhpczIuYXBhY2hlLm9yZyIpCi0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJhZGQiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL2NhbGN1bGF0b3IuamF4d3MuYXhpczIuYXBhY2hlLm9yZyIsIGNsYXNzTmFtZSA9ICJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNhbGN1bGF0b3IuQWRkIikKLSAgICBAUmVzcG9uc2VXcmFwcGVyKGxvY2FsTmFtZSA9ICJhZGRSZXNwb25zZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vY2FsY3VsYXRvci5qYXh3cy5heGlzMi5hcGFjaGUub3JnIiwgY2xhc3NOYW1lID0gIm9yZy5hcGFjaGUuYXhpczIuamF4d3MuY2FsY3VsYXRvci5BZGRSZXNwb25zZSIpCi0gICAgcHVibGljIGludCBhZGQoCi0gICAgICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJ2YWx1ZTEiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL2NhbGN1bGF0b3IuamF4d3MuYXhpczIuYXBhY2hlLm9yZyIpCi0gICAgICAgICAgICBpbnQgdmFsdWUxLAotICAgICAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAidmFsdWUyIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9jYWxjdWxhdG9yLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciKQotICAgICAgICAgICAgaW50IHZhbHVlMikKLSAgICAgICAgICAgIHRocm93cyBBZGROdW1iZXJzRXhjZXB0aW9uX0V4Y2VwdGlvbgotICAgICAgICAgICAgOwotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLWNhbGN1bGF0b3Ivc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2FsY3VsYXRvci9DYWxjdWxhdG9yU2VydmVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLWNhbGN1bGF0b3Ivc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2FsY3VsYXRvci9DYWxjdWxhdG9yU2VydmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiYzk1M2QuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1jYWxjdWxhdG9yL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NhbGN1bGF0b3IvQ2FsY3VsYXRvclNlcnZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jYWxjdWxhdG9yOw0KLQ0KLWltcG9ydCBqYXZheC54bWwud3MuRW5kcG9pbnQ7DQotDQotcHVibGljIGNsYXNzIENhbGN1bGF0b3JTZXJ2ZXJ7DQotDQotICAgIHByb3RlY3RlZCBDYWxjdWxhdG9yU2VydmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlN0YXJ0aW5nIFNlcnZlciIpOw0KLSAgICAgICAgT2JqZWN0IGltcGxlbWVudG9yID0gbmV3IENhbGN1bGF0b3JTZXJ2aWNlKCk7DQotICAgICAgICBTdHJpbmcgYWRkcmVzcyA9ICJodHRwOi8vbG9jYWxob3N0OjgwODAvYXhpczIvc2VydmljZXMvQ2FsY3VsYXRvclNlcnZpY2UuQ2FsY3VsYXRvclNlcnZpY2VQb3J0IjsNCi0gICAgICAgIEVuZHBvaW50LnB1Ymxpc2goYWRkcmVzcywgaW1wbGVtZW50b3IpOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJnc1tdKSB0aHJvd3MgRXhjZXB0aW9uIHsgDQotICAgICAgICBuZXcgQ2FsY3VsYXRvclNlcnZlcigpOw0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTZXJ2ZXIgcmVhZHkuLi4iKTsgICAgICAgICANCi0gICAgICAgIFRocmVhZC5zbGVlcChJbnRlZ2VyLk1BWF9WQUxVRSk7IA0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTZXJ2ZXIgZXhpdHRpbmciKTsNCi0gICAgICAgIFN5c3RlbS5leGl0KDApOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3MtY2FsY3VsYXRvci9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jYWxjdWxhdG9yL0NhbGN1bGF0b3JTZXJ2aWNlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLWNhbGN1bGF0b3Ivc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2FsY3VsYXRvci9DYWxjdWxhdG9yU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjlhOTNlLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3MtY2FsY3VsYXRvci9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jYWxjdWxhdG9yL0NhbGN1bGF0b3JTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoKLSogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0qIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotKgotKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSoKLSogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotKiB1bmRlciB0aGUgTGljZW5zZS4KLSovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY2FsY3VsYXRvcjsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLWltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlJlc291cmNlOwotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VDb250ZXh0OwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IGphdmF4LnhtbC53cy5zb2FwLkFkZHJlc3Npbmc7Ci1pbXBvcnQgamF2YXgueG1sLndzLndzYWRkcmVzc2luZy5XM0NFbmRwb2ludFJlZmVyZW5jZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotQEFkZHJlc3NpbmcKLUBXZWJTZXJ2aWNlKGVuZHBvaW50SW50ZXJmYWNlID0gIm9yZy5hcGFjaGUuYXhpczIuamF4d3MuY2FsY3VsYXRvci5DYWxjdWxhdG9yIiwKLSAgICAgICAgc2VydmljZU5hbWUgPSAiQ2FsY3VsYXRvclNlcnZpY2UiLAotICAgICAgICBwb3J0TmFtZSA9ICJDYWxjdWxhdG9yU2VydmljZVBvcnQiLAotICAgICAgICB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL2NhbGN1bGF0b3IuamF4d3MuYXhpczIuYXBhY2hlLm9yZyIsCi0gICAgICAgIHdzZGxMb2NhdGlvbiA9ICJNRVRBLUlORi9DYWxjdWxhdG9yU2VydmljZS53c2RsIikKLXB1YmxpYyBjbGFzcyBDYWxjdWxhdG9yU2VydmljZSBpbXBsZW1lbnRzIENhbGN1bGF0b3IgewotCi0gICAgQFJlc291cmNlCi0gICAgcHJpdmF0ZSBXZWJTZXJ2aWNlQ29udGV4dCBjb250ZXh0OwotCi0gICAgLyoKLSAgICAgKiAgKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jYWxjdWxhdG9yLkNhbGN1bGF0b3IjZ2V0VGlja2V0KCkKLSAgICAgKi8KLSAgICBwdWJsaWMgVzNDRW5kcG9pbnRSZWZlcmVuY2UgZ2V0VGlja2V0KCkgewotICAgICAgICBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGZhY3RvcnkgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIGZhY3Rvcnkuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7Ci0gICAgICAgIEVsZW1lbnQgZWxlbWVudCA9IG51bGw7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIERvY3VtZW50QnVpbGRlciBidWlsZGVyID0gZmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKLSAgICAgICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gYnVpbGRlci5uZXdEb2N1bWVudCgpOwotCi0gICAgICAgICAgICBlbGVtZW50ID0KLSAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vY2FsY3VsYXRvci5qYXh3cy5heGlzMi5hcGFjaGUub3JnIiwgIlRpY2tldElkIik7Ci0gICAgICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCIxMjM0NTY3ODkiKSk7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gcGNlKSB7Ci0gICAgICAgICAgICAvLyBQYXJzZXIgd2l0aCBzcGVjaWZpZWQgb3B0aW9ucyBjYW4ndCBiZSBidWlsdAotICAgICAgICAgICAgcGNlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oIlVuYWJsZSB0byBjcmVhdGUgdGlja2V0LiIsIHBjZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gKFczQ0VuZHBvaW50UmVmZXJlbmNlKSBnZXRDb250ZXh0KCkuZ2V0RW5kcG9pbnRSZWZlcmVuY2UoZWxlbWVudCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAgKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jYWxjdWxhdG9yLkNhbGN1bGF0b3IjYWRkKGludCwgaW50KQotICAgICAqLwotICAgIHB1YmxpYyBpbnQgYWRkKGludCB2YWx1ZTEsIGludCB2YWx1ZTIpIHRocm93cyBBZGROdW1iZXJzRXhjZXB0aW9uX0V4Y2VwdGlvbiB7Ci0gICAgICAgIExpc3QgbGlzdCA9IChMaXN0KSBnZXRDb250ZXh0KCkuZ2V0TWVzc2FnZUNvbnRleHQoKS5nZXQoTWVzc2FnZUNvbnRleHQuUkVGRVJFTkNFX1BBUkFNRVRFUlMpOwotCi0gICAgICAgIGlmIChsaXN0LmlzRW1wdHkoKSkgewotICAgICAgICAgICAgQWRkTnVtYmVyc0V4Y2VwdGlvbiBmYXVsdEluZm8gPSBuZXcgQWRkTnVtYmVyc0V4Y2VwdGlvbigpOwotICAgICAgICAgICAgZmF1bHRJbmZvLnNldE1lc3NhZ2UoIk5vIHRpY2tldCBmb3VuZC4iKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBBZGROdW1iZXJzRXhjZXB0aW9uX0V4Y2VwdGlvbihmYXVsdEluZm8uZ2V0TWVzc2FnZSgpLCBmYXVsdEluZm8pOwotICAgICAgICB9Ci0gICAgICAgIEVsZW1lbnQgZWxlbWVudCA9IChFbGVtZW50KSBsaXN0LmdldCgwKTsKLQotICAgICAgICBpZiAoISIxMjM0NTY3ODkiLmVxdWFscyhlbGVtZW50LmdldFRleHRDb250ZW50KCkpKSB7Ci0gICAgICAgICAgICBBZGROdW1iZXJzRXhjZXB0aW9uIGZhdWx0SW5mbyA9IG5ldyBBZGROdW1iZXJzRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICBmYXVsdEluZm8uc2V0TWVzc2FnZSgiSW52YWxpZCB0aWNrZXQ6ICIgKyBlbGVtZW50LmdldFRleHRDb250ZW50KCkpOwotICAgICAgICAgICAgdGhyb3cgbmV3IEFkZE51bWJlcnNFeGNlcHRpb25fRXhjZXB0aW9uKGZhdWx0SW5mby5nZXRNZXNzYWdlKCksIGZhdWx0SW5mbyk7Ci0gICAgICAgIH0KLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInZhbHVlMTogIiArIHZhbHVlMSArICIgdmFsdWUyOiAiICsgdmFsdWUyKTsKLSAgICAgICAgcmV0dXJuIHZhbHVlMSArIHZhbHVlMjsKLSAgICB9Ci0KLSAgICAvL1JldHVybiB0aGUgV2ViU2VydmljZUNvbnRleHQKLSAgICBwcml2YXRlIFdlYlNlcnZpY2VDb250ZXh0IGdldENvbnRleHQoKSB7Ci0gICAgICAgIHJldHVybiBjb250ZXh0OwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLWNhbGN1bGF0b3Ivc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2FsY3VsYXRvci9HZXRUaWNrZXQuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3MtY2FsY3VsYXRvci9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jYWxjdWxhdG9yL0dldFRpY2tldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmE5NWZmLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3MtY2FsY3VsYXRvci9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jYWxjdWxhdG9yL0dldFRpY2tldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoNCi0qIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0qIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0qDQotKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0qDQotKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSogdW5kZXIgdGhlIExpY2Vuc2UuDQotKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY2FsY3VsYXRvcjsNCi0NCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOw0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZTsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlOw0KLQ0KLQ0KLS8qKg0KLSAqIDxwPkphdmEgY2xhc3MgZm9yIGdldFRpY2tldCBjb21wbGV4IHR5cGUuDQotICogPHAvPg0KLSAqIDxwPlRoZSBmb2xsb3dpbmcgc2NoZW1hIGZyYWdtZW50IHNwZWNpZmllcyB0aGUgZXhwZWN0ZWQgY29udGVudCBjb250YWluZWQgd2l0aGluIHRoaXMgY2xhc3MuDQotICogPHAvPg0KLSAqIDxwcmU+DQotICogJmx0O2NvbXBsZXhUeXBlIG5hbWU9ImdldFRpY2tldCI+DQotICogICAmbHQ7Y29tcGxleENvbnRlbnQ+DQotICogICAgICZsdDtyZXN0cmljdGlvbiBiYXNlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9YW55VHlwZSI+DQotICogICAgICAgJmx0O3NlcXVlbmNlPg0KLSAqICAgICAgICZsdDsvc2VxdWVuY2U+DQotICogICAgICZsdDsvcmVzdHJpY3Rpb24+DQotICogICAmbHQ7L2NvbXBsZXhDb250ZW50Pg0KLSAqICZsdDsvY29tcGxleFR5cGU+DQotICogPC9wcmU+DQotICovDQotQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKQ0KLUBYbWxUeXBlKG5hbWUgPSAiZ2V0VGlja2V0IikNCi1wdWJsaWMgY2xhc3MgR2V0VGlja2V0IHsNCi0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1jYWxjdWxhdG9yL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NhbGN1bGF0b3IvR2V0VGlja2V0UmVzcG9uc2UuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3MtY2FsY3VsYXRvci9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jYWxjdWxhdG9yL0dldFRpY2tldFJlc3BvbnNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmNTEyODYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1jYWxjdWxhdG9yL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NhbGN1bGF0b3IvR2V0VGlja2V0UmVzcG9uc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qDQotKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0qIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotKg0KLSogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotKg0KLSogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0qICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0qIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0qIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSovDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNhbGN1bGF0b3I7DQotDQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzVHlwZTsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7DQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudDsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlOw0KLWltcG9ydCBqYXZheC54bWwud3Mud3NhZGRyZXNzaW5nLlczQ0VuZHBvaW50UmVmZXJlbmNlOw0KLQ0KLQ0KLS8qKg0KLSAqIDxwPkphdmEgY2xhc3MgZm9yIGdldFRpY2tldFJlc3BvbnNlIGNvbXBsZXggdHlwZS4NCi0gKiA8cC8+DQotICogPHA+VGhlIGZvbGxvd2luZyBzY2hlbWEgZnJhZ21lbnQgc3BlY2lmaWVzIHRoZSBleHBlY3RlZCBjb250ZW50IGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBjbGFzcy4NCi0gKiA8cC8+DQotICogPHByZT4NCi0gKiAmbHQ7Y29tcGxleFR5cGUgbmFtZT0iZ2V0VGlja2V0UmVzcG9uc2UiPg0KLSAqICAgJmx0O2NvbXBsZXhDb250ZW50Pg0KLSAqICAgICAmbHQ7cmVzdHJpY3Rpb24gYmFzZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfWFueVR5cGUiPg0KLSAqICAgICAgICZsdDtzZXF1ZW5jZT4NCi0gKiAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9InJldHVybiIgdHlwZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDUvMDgvYWRkcmVzc2luZ31FbmRwb2ludFJlZmVyZW5jZVR5cGUiIG1pbk9jY3Vycz0iMCIvPg0KLSAqICAgICAgICZsdDsvc2VxdWVuY2U+DQotICogICAgICZsdDsvcmVzdHJpY3Rpb24+DQotICogICAmbHQ7L2NvbXBsZXhDb250ZW50Pg0KLSAqICZsdDsvY29tcGxleFR5cGU+DQotICogPC9wcmU+DQotICovDQotQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKQ0KLUBYbWxUeXBlKG5hbWUgPSAiZ2V0VGlja2V0UmVzcG9uc2UiLCBwcm9wT3JkZXIgPSB7DQotICAgICAgICAiX3JldHVybiINCi0gICAgICAgIH0pDQotcHVibGljIGNsYXNzIEdldFRpY2tldFJlc3BvbnNlIHsNCi0NCi0gICAgQFhtbEVsZW1lbnQobmFtZSA9ICJyZXR1cm4iKQ0KLSAgICBwcm90ZWN0ZWQgVzNDRW5kcG9pbnRSZWZlcmVuY2UgX3JldHVybjsNCi0NCi0gICAgLyoqDQotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSByZXR1cm4gcHJvcGVydHkuDQotICAgICAqDQotICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzDQotICAgICAqICAgICAgICAge0BsaW5rIFczQ0VuZHBvaW50UmVmZXJlbmNlIH0NCi0gICAgICovDQotICAgIHB1YmxpYyBXM0NFbmRwb2ludFJlZmVyZW5jZSBnZXRSZXR1cm4oKSB7DQotICAgICAgICByZXR1cm4gX3JldHVybjsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHJldHVybiBwcm9wZXJ0eS4NCi0gICAgICoNCi0gICAgICogQHBhcmFtIHZhbHVlIGFsbG93ZWQgb2JqZWN0IGlzDQotICAgICAqICAgICAgICAgICAgICB7QGxpbmsgVzNDRW5kcG9pbnRSZWZlcmVuY2UgfQ0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgc2V0UmV0dXJuKFczQ0VuZHBvaW50UmVmZXJlbmNlIHZhbHVlKSB7DQotICAgICAgICB0aGlzLl9yZXR1cm4gPSB2YWx1ZTsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLWNhbGN1bGF0b3Ivc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2FsY3VsYXRvci9PYmplY3RGYWN0b3J5LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLWNhbGN1bGF0b3Ivc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2FsY3VsYXRvci9PYmplY3RGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1ZDBjMzMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1jYWxjdWxhdG9yL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NhbGN1bGF0b3IvT2JqZWN0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qCi0qIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0qIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSoKLSogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0qCi0qIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0qIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0qIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSogdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNhbGN1bGF0b3I7Ci0KLWltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCRWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnREZWNsOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUmVnaXN0cnk7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotCi0vKioKLSAqIFRoaXMgb2JqZWN0IGNvbnRhaW5zIGZhY3RvcnkgbWV0aG9kcyBmb3IgZWFjaAotICogSmF2YSBjb250ZW50IGludGVyZmFjZSBhbmQgSmF2YSBlbGVtZW50IGludGVyZmFjZQotICogZ2VuZXJhdGVkIGluIHRoZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNhbGN1bGF0b3IuY2xpZW50IHBhY2thZ2UuCi0gKiA8cD5BbiBPYmplY3RGYWN0b3J5IGFsbG93cyB5b3UgdG8gcHJvZ3JhbWF0aWNhbGx5Ci0gKiBjb25zdHJ1Y3QgbmV3IGluc3RhbmNlcyBvZiB0aGUgSmF2YSByZXByZXNlbnRhdGlvbgotICogZm9yIFhNTCBjb250ZW50LiBUaGUgSmF2YSByZXByZXNlbnRhdGlvbiBvZiBYTUwKLSAqIGNvbnRlbnQgY2FuIGNvbnNpc3Qgb2Ygc2NoZW1hIGRlcml2ZWQgaW50ZXJmYWNlcwotICogYW5kIGNsYXNzZXMgcmVwcmVzZW50aW5nIHRoZSBiaW5kaW5nIG9mIHNjaGVtYQotICogdHlwZSBkZWZpbml0aW9ucywgZWxlbWVudCBkZWNsYXJhdGlvbnMgYW5kIG1vZGVsCi0gKiBncm91cHMuICBGYWN0b3J5IG1ldGhvZHMgZm9yIGVhY2ggb2YgdGhlc2UgYXJlCi0gKiBwcm92aWRlZCBpbiB0aGlzIGNsYXNzLgotICovCi1AWG1sUmVnaXN0cnkKLXB1YmxpYyBjbGFzcyBPYmplY3RGYWN0b3J5IHsKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFFOYW1lIF9HZXRUaWNrZXRfUU5BTUUgPSBuZXcgUU5hbWUoImh0dHA6Ly9jYWxjdWxhdG9yLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciLCAiZ2V0VGlja2V0Iik7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgUU5hbWUgX0FkZF9RTkFNRSA9IG5ldyBRTmFtZSgiaHR0cDovL2NhbGN1bGF0b3IuamF4d3MuYXhpczIuYXBhY2hlLm9yZyIsICJhZGQiKTsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBRTmFtZSBfQWRkUmVzcG9uc2VfUU5BTUUgPSBuZXcgUU5hbWUoImh0dHA6Ly9jYWxjdWxhdG9yLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciLCAiYWRkUmVzcG9uc2UiKTsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBRTmFtZSBfR2V0VGlja2V0UmVzcG9uc2VfUU5BTUUgPSBuZXcgUU5hbWUoImh0dHA6Ly9jYWxjdWxhdG9yLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciLCAiZ2V0VGlja2V0UmVzcG9uc2UiKTsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBRTmFtZSBfQWRkTnVtYmVyc0V4Y2VwdGlvbl9RTkFNRSA9IG5ldyBRTmFtZSgiaHR0cDovL2NhbGN1bGF0b3IuamF4d3MuYXhpczIuYXBhY2hlLm9yZyIsICJBZGROdW1iZXJzRXhjZXB0aW9uIik7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBuZXcgT2JqZWN0RmFjdG9yeSB0aGF0IGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBuZXcgaW5zdGFuY2VzIG9mIHNjaGVtYSBkZXJpdmVkIGNsYXNzZXMgZm9yIHBhY2thZ2U6IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY2FsY3VsYXRvci5jbGllbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0RmFjdG9yeSgpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEFkZCB9Ci0gICAgICovCi0gICAgcHVibGljIEFkZCBjcmVhdGVBZGQoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgQWRkKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBBZGRSZXNwb25zZSB9Ci0gICAgICovCi0gICAgcHVibGljIEFkZFJlc3BvbnNlIGNyZWF0ZUFkZFJlc3BvbnNlKCkgewotICAgICAgICByZXR1cm4gbmV3IEFkZFJlc3BvbnNlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBBZGROdW1iZXJzRXhjZXB0aW9uIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgQWRkTnVtYmVyc0V4Y2VwdGlvbiBjcmVhdGVBZGROdW1iZXJzRXhjZXB0aW9uKCkgewotICAgICAgICByZXR1cm4gbmV3IEFkZE51bWJlcnNFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEdldFRpY2tldCB9Ci0gICAgICovCi0gICAgcHVibGljIEdldFRpY2tldCBjcmVhdGVHZXRUaWNrZXQoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgR2V0VGlja2V0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBHZXRUaWNrZXRSZXNwb25zZSB9Ci0gICAgICovCi0gICAgcHVibGljIEdldFRpY2tldFJlc3BvbnNlIGNyZWF0ZUdldFRpY2tldFJlc3BvbnNlKCkgewotICAgICAgICByZXR1cm4gbmV3IEdldFRpY2tldFJlc3BvbnNlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBKQVhCRWxlbWVudCB9e0Bjb2RlIDx9e0BsaW5rIEdldFRpY2tldCB9e0Bjb2RlID59fQotICAgICAqLwotICAgIEBYbWxFbGVtZW50RGVjbChuYW1lc3BhY2UgPSAiaHR0cDovL2NhbGN1bGF0b3IuamF4d3MuYXhpczIuYXBhY2hlLm9yZyIsIG5hbWUgPSAiZ2V0VGlja2V0IikKLSAgICBwdWJsaWMgSkFYQkVsZW1lbnQ8R2V0VGlja2V0PiBjcmVhdGVHZXRUaWNrZXQoR2V0VGlja2V0IHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgSkFYQkVsZW1lbnQ8R2V0VGlja2V0PihfR2V0VGlja2V0X1FOQU1FLCBHZXRUaWNrZXQuY2xhc3MsIG51bGwsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEpBWEJFbGVtZW50IH17QGNvZGUgPH17QGxpbmsgQWRkIH17QGNvZGUgPn19Ci0gICAgICovCi0gICAgQFhtbEVsZW1lbnREZWNsKG5hbWVzcGFjZSA9ICJodHRwOi8vY2FsY3VsYXRvci5qYXh3cy5heGlzMi5hcGFjaGUub3JnIiwgbmFtZSA9ICJhZGQiKQotICAgIHB1YmxpYyBKQVhCRWxlbWVudDxBZGQ+IGNyZWF0ZUFkZChBZGQgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBKQVhCRWxlbWVudDxBZGQ+KF9BZGRfUU5BTUUsIEFkZC5jbGFzcywgbnVsbCwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgSkFYQkVsZW1lbnQgfXtAY29kZSA8fXtAbGluayBBZGRSZXNwb25zZSB9e0Bjb2RlID59fQotICAgICAqLwotICAgIEBYbWxFbGVtZW50RGVjbChuYW1lc3BhY2UgPSAiaHR0cDovL2NhbGN1bGF0b3IuamF4d3MuYXhpczIuYXBhY2hlLm9yZyIsIG5hbWUgPSAiYWRkUmVzcG9uc2UiKQotICAgIHB1YmxpYyBKQVhCRWxlbWVudDxBZGRSZXNwb25zZT4gY3JlYXRlQWRkUmVzcG9uc2UoQWRkUmVzcG9uc2UgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBKQVhCRWxlbWVudDxBZGRSZXNwb25zZT4oX0FkZFJlc3BvbnNlX1FOQU1FLCBBZGRSZXNwb25zZS5jbGFzcywgbnVsbCwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgSkFYQkVsZW1lbnQgfXtAY29kZSA8fXtAbGluayBHZXRUaWNrZXRSZXNwb25zZSB9e0Bjb2RlID59fQotICAgICAqLwotICAgIEBYbWxFbGVtZW50RGVjbChuYW1lc3BhY2UgPSAiaHR0cDovL2NhbGN1bGF0b3IuamF4d3MuYXhpczIuYXBhY2hlLm9yZyIsIG5hbWUgPSAiZ2V0VGlja2V0UmVzcG9uc2UiKQotICAgIHB1YmxpYyBKQVhCRWxlbWVudDxHZXRUaWNrZXRSZXNwb25zZT4gY3JlYXRlR2V0VGlja2V0UmVzcG9uc2UoR2V0VGlja2V0UmVzcG9uc2UgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBKQVhCRWxlbWVudDxHZXRUaWNrZXRSZXNwb25zZT4oX0dldFRpY2tldFJlc3BvbnNlX1FOQU1FLCBHZXRUaWNrZXRSZXNwb25zZS5jbGFzcywgbnVsbCwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgSkFYQkVsZW1lbnQgfXtAY29kZSA8fXtAbGluayBBZGROdW1iZXJzRXhjZXB0aW9uIH17QGNvZGUgPn19Ci0gICAgICovCi0gICAgQFhtbEVsZW1lbnREZWNsKG5hbWVzcGFjZSA9ICJodHRwOi8vY2FsY3VsYXRvci5qYXh3cy5heGlzMi5hcGFjaGUub3JnIiwgbmFtZSA9ICJBZGROdW1iZXJzRXhjZXB0aW9uIikKLSAgICBwdWJsaWMgSkFYQkVsZW1lbnQ8QWRkTnVtYmVyc0V4Y2VwdGlvbj4gY3JlYXRlQWRkTnVtYmVyc0V4Y2VwdGlvbihBZGROdW1iZXJzRXhjZXB0aW9uIHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgSkFYQkVsZW1lbnQ8QWRkTnVtYmVyc0V4Y2VwdGlvbj4oX0FkZE51bWJlcnNFeGNlcHRpb25fUU5BTUUsIEFkZE51bWJlcnNFeGNlcHRpb24uY2xhc3MsIG51bGwsIHZhbHVlKTsKLSAgICB9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1jYWxjdWxhdG9yL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NhbGN1bGF0b3IvY2xpZW50L0FkZC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1jYWxjdWxhdG9yL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NhbGN1bGF0b3IvY2xpZW50L0FkZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NWExMzcyLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3MtY2FsY3VsYXRvci9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jYWxjdWxhdG9yL2NsaWVudC9BZGQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qDQotKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0qIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotKg0KLSogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotKg0KLSogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0qICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0qIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0qIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSovDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNhbGN1bGF0b3IuY2xpZW50Ow0KLQ0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7DQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOw0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGU7DQotDQotDQotLyoqDQotICogPHA+SmF2YSBjbGFzcyBmb3IgYWRkIGNvbXBsZXggdHlwZS4NCi0gKiA8cC8+DQotICogPHA+VGhlIGZvbGxvd2luZyBzY2hlbWEgZnJhZ21lbnQgc3BlY2lmaWVzIHRoZSBleHBlY3RlZCBjb250ZW50IGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBjbGFzcy4NCi0gKiA8cC8+DQotICogPHByZT4NCi0gKiAmbHQ7Y29tcGxleFR5cGUgbmFtZT0iYWRkIj4NCi0gKiAgICZsdDtjb21wbGV4Q29udGVudD4NCi0gKiAgICAgJmx0O3Jlc3RyaWN0aW9uIGJhc2U9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1hbnlUeXBlIj4NCi0gKiAgICAgICAmbHQ7c2VxdWVuY2U+DQotICogICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJ2YWx1ZTEiIHR5cGU9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1pbnQiLz4NCi0gKiAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9InZhbHVlMiIgdHlwZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfWludCIvPg0KLSAqICAgICAgICZsdDsvc2VxdWVuY2U+DQotICogICAgICZsdDsvcmVzdHJpY3Rpb24+DQotICogICAmbHQ7L2NvbXBsZXhDb250ZW50Pg0KLSAqICZsdDsvY29tcGxleFR5cGU+DQotICogPC9wcmU+DQotICovDQotQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKQ0KLUBYbWxUeXBlKG5hbWUgPSAiYWRkIiwgcHJvcE9yZGVyID0gew0KLSAgICAgICAgInZhbHVlMSIsDQotICAgICAgICAidmFsdWUyIg0KLSAgICAgICAgfSkNCi1wdWJsaWMgY2xhc3MgQWRkIHsNCi0NCi0gICAgcHJvdGVjdGVkIGludCB2YWx1ZTE7DQotICAgIHByb3RlY3RlZCBpbnQgdmFsdWUyOw0KLQ0KLSAgICAvKioNCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIHZhbHVlMSBwcm9wZXJ0eS4NCi0gICAgICovDQotICAgIHB1YmxpYyBpbnQgZ2V0VmFsdWUxKCkgew0KLSAgICAgICAgcmV0dXJuIHZhbHVlMTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHZhbHVlMSBwcm9wZXJ0eS4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlMShpbnQgdmFsdWUpIHsNCi0gICAgICAgIHRoaXMudmFsdWUxID0gdmFsdWU7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSB2YWx1ZTIgcHJvcGVydHkuDQotICAgICAqLw0KLSAgICBwdWJsaWMgaW50IGdldFZhbHVlMigpIHsNCi0gICAgICAgIHJldHVybiB2YWx1ZTI7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSB2YWx1ZTIgcHJvcGVydHkuDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZTIoaW50IHZhbHVlKSB7DQotICAgICAgICB0aGlzLnZhbHVlMiA9IHZhbHVlOw0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3MtY2FsY3VsYXRvci9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jYWxjdWxhdG9yL2NsaWVudC9BZGROdW1iZXJzRXhjZXB0aW9uLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLWNhbGN1bGF0b3Ivc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2FsY3VsYXRvci9jbGllbnQvQWRkTnVtYmVyc0V4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGMzOTdhLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3MtY2FsY3VsYXRvci9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jYWxjdWxhdG9yL2NsaWVudC9BZGROdW1iZXJzRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKg0KLSogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0qIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0qIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0qICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0qIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSoNCi0qIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSoNCi0qIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0qIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0qIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotKiB1bmRlciB0aGUgTGljZW5zZS4NCi0qLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jYWxjdWxhdG9yLmNsaWVudDsNCi0NCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOw0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZTsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50Ow0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGU7DQotDQotDQotLyoqDQotICogPHA+SmF2YSBjbGFzcyBmb3IgQWRkTnVtYmVyc0V4Y2VwdGlvbiBjb21wbGV4IHR5cGUuDQotICogPHAvPg0KLSAqIDxwPlRoZSBmb2xsb3dpbmcgc2NoZW1hIGZyYWdtZW50IHNwZWNpZmllcyB0aGUgZXhwZWN0ZWQgY29udGVudCBjb250YWluZWQgd2l0aGluIHRoaXMgY2xhc3MuDQotICogPHAvPg0KLSAqIDxwcmU+DQotICogJmx0O2NvbXBsZXhUeXBlIG5hbWU9IkFkZE51bWJlcnNFeGNlcHRpb24iPg0KLSAqICAgJmx0O2NvbXBsZXhDb250ZW50Pg0KLSAqICAgICAmbHQ7cmVzdHJpY3Rpb24gYmFzZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfWFueVR5cGUiPg0KLSAqICAgICAgICZsdDtzZXF1ZW5jZT4NCi0gKiAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9Im1lc3NhZ2UiIHR5cGU9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1zdHJpbmciIG1pbk9jY3Vycz0iMCIvPg0KLSAqICAgICAgICZsdDsvc2VxdWVuY2U+DQotICogICAgICZsdDsvcmVzdHJpY3Rpb24+DQotICogICAmbHQ7L2NvbXBsZXhDb250ZW50Pg0KLSAqICZsdDsvY29tcGxleFR5cGU+DQotICogPC9wcmU+DQotICovDQotQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKQ0KLUBYbWxUeXBlKG5hbWUgPSAiQWRkTnVtYmVyc0V4Y2VwdGlvbiIsIHByb3BPcmRlciA9IHsNCi0gICAgICAgICJtZXNzYWdlIg0KLSAgICAgICAgfSkNCi1wdWJsaWMgY2xhc3MgQWRkTnVtYmVyc0V4Y2VwdGlvbiB7DQotDQotICAgIEBYbWxFbGVtZW50KG5hbWVzcGFjZSA9ICIiKQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIG1lc3NhZ2U7DQotDQotICAgIC8qKg0KLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgbWVzc2FnZSBwcm9wZXJ0eS4NCi0gICAgICoNCi0gICAgICogQHJldHVybiBwb3NzaWJsZSBvYmplY3QgaXMNCi0gICAgICogICAgICAgICB7QGxpbmsgU3RyaW5nIH0NCi0gICAgICovDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsNCi0gICAgICAgIHJldHVybiBtZXNzYWdlOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgbWVzc2FnZSBwcm9wZXJ0eS4NCi0gICAgICoNCi0gICAgICogQHBhcmFtIHZhbHVlIGFsbG93ZWQgb2JqZWN0IGlzDQotICAgICAqICAgICAgICAgICAgICB7QGxpbmsgU3RyaW5nIH0NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2UoU3RyaW5nIHZhbHVlKSB7DQotICAgICAgICB0aGlzLm1lc3NhZ2UgPSB2YWx1ZTsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLWNhbGN1bGF0b3Ivc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2FsY3VsYXRvci9jbGllbnQvQWRkTnVtYmVyc0V4Y2VwdGlvbl9FeGNlcHRpb24uamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3MtY2FsY3VsYXRvci9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jYWxjdWxhdG9yL2NsaWVudC9BZGROdW1iZXJzRXhjZXB0aW9uX0V4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzFjZDMyLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3MtY2FsY3VsYXRvci9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jYWxjdWxhdG9yL2NsaWVudC9BZGROdW1iZXJzRXhjZXB0aW9uX0V4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoNCi0qIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0qIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0qDQotKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0qDQotKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSogdW5kZXIgdGhlIExpY2Vuc2UuDQotKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY2FsY3VsYXRvci5jbGllbnQ7DQotDQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJGYXVsdDsNCi0NCi0NCi1AV2ViRmF1bHQobmFtZSA9ICJBZGROdW1iZXJzRXhjZXB0aW9uIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9jYWxjdWxhdG9yLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciKQ0KLXB1YmxpYyBjbGFzcyBBZGROdW1iZXJzRXhjZXB0aW9uX0V4Y2VwdGlvbg0KLSAgICAgICAgZXh0ZW5kcyBFeGNlcHRpb24gew0KLQ0KLSAgICAvKioNCi0gICAgICogSmF2YSB0eXBlIHRoYXQgZ29lcyBhcyBzb2FwZW52OkZhdWx0IGRldGFpbCBlbGVtZW50Lg0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBBZGROdW1iZXJzRXhjZXB0aW9uIGZhdWx0SW5mbzsNCi0NCi0gICAgLyoqDQotICAgICAqIEBwYXJhbSBmYXVsdEluZm8NCi0gICAgICogQHBhcmFtIG1lc3NhZ2UNCi0gICAgICovDQotICAgIHB1YmxpYyBBZGROdW1iZXJzRXhjZXB0aW9uX0V4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgQWRkTnVtYmVyc0V4Y2VwdGlvbiBmYXVsdEluZm8pIHsNCi0gICAgICAgIHN1cGVyKG1lc3NhZ2UpOw0KLSAgICAgICAgdGhpcy5mYXVsdEluZm8gPSBmYXVsdEluZm87DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIEBwYXJhbSBmYXVsdEluZm8NCi0gICAgICogQHBhcmFtIG1lc3NhZ2UNCi0gICAgICogQHBhcmFtIGNhdXNlDQotICAgICAqLw0KLSAgICBwdWJsaWMgQWRkTnVtYmVyc0V4Y2VwdGlvbl9FeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIEFkZE51bWJlcnNFeGNlcHRpb24gZmF1bHRJbmZvLCBUaHJvd2FibGUgY2F1c2UpIHsNCi0gICAgICAgIHN1cGVyKG1lc3NhZ2UsIGNhdXNlKTsNCi0gICAgICAgIHRoaXMuZmF1bHRJbmZvID0gZmF1bHRJbmZvOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBAcmV0dXJuIHJldHVybnMgZmF1bHQgYmVhbjogb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jYWxjdWxhdG9yLmNsaWVudC5BZGROdW1iZXJzRXhjZXB0aW9uDQotICAgICAqLw0KLSAgICBwdWJsaWMgQWRkTnVtYmVyc0V4Y2VwdGlvbiBnZXRGYXVsdEluZm8oKSB7DQotICAgICAgICByZXR1cm4gZmF1bHRJbmZvOw0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3MtY2FsY3VsYXRvci9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jYWxjdWxhdG9yL2NsaWVudC9BZGRSZXNwb25zZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1jYWxjdWxhdG9yL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NhbGN1bGF0b3IvY2xpZW50L0FkZFJlc3BvbnNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4YWQ3NjkuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1jYWxjdWxhdG9yL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NhbGN1bGF0b3IvY2xpZW50L0FkZFJlc3BvbnNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKg0KLSogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0qIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0qIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0qICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0qIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSoNCi0qIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSoNCi0qIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0qIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0qIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotKiB1bmRlciB0aGUgTGljZW5zZS4NCi0qLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jYWxjdWxhdG9yLmNsaWVudDsNCi0NCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOw0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZTsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50Ow0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGU7DQotDQotDQotLyoqDQotICogPHA+SmF2YSBjbGFzcyBmb3IgYWRkUmVzcG9uc2UgY29tcGxleCB0eXBlLg0KLSAqIDxwLz4NCi0gKiA8cD5UaGUgZm9sbG93aW5nIHNjaGVtYSBmcmFnbWVudCBzcGVjaWZpZXMgdGhlIGV4cGVjdGVkIGNvbnRlbnQgY29udGFpbmVkIHdpdGhpbiB0aGlzIGNsYXNzLg0KLSAqIDxwLz4NCi0gKiA8cHJlPg0KLSAqICZsdDtjb21wbGV4VHlwZSBuYW1lPSJhZGRSZXNwb25zZSI+DQotICogICAmbHQ7Y29tcGxleENvbnRlbnQ+DQotICogICAgICZsdDtyZXN0cmljdGlvbiBiYXNlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9YW55VHlwZSI+DQotICogICAgICAgJmx0O3NlcXVlbmNlPg0KLSAqICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0icmV0dXJuIiB0eXBlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9aW50Ii8+DQotICogICAgICAgJmx0Oy9zZXF1ZW5jZT4NCi0gKiAgICAgJmx0Oy9yZXN0cmljdGlvbj4NCi0gKiAgICZsdDsvY29tcGxleENvbnRlbnQ+DQotICogJmx0Oy9jb21wbGV4VHlwZT4NCi0gKiA8L3ByZT4NCi0gKi8NCi1AWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpDQotQFhtbFR5cGUobmFtZSA9ICJhZGRSZXNwb25zZSIsIHByb3BPcmRlciA9IHsNCi0gICAgICAgICJfcmV0dXJuIg0KLSAgICAgICAgfSkNCi1wdWJsaWMgY2xhc3MgQWRkUmVzcG9uc2Ugew0KLQ0KLSAgICBAWG1sRWxlbWVudChuYW1lID0gInJldHVybiIpDQotICAgIHByb3RlY3RlZCBpbnQgX3JldHVybjsNCi0NCi0gICAgLyoqDQotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSByZXR1cm4gcHJvcGVydHkuDQotICAgICAqLw0KLSAgICBwdWJsaWMgaW50IGdldFJldHVybigpIHsNCi0gICAgICAgIHJldHVybiBfcmV0dXJuOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgcmV0dXJuIHByb3BlcnR5Lg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgc2V0UmV0dXJuKGludCB2YWx1ZSkgew0KLSAgICAgICAgdGhpcy5fcmV0dXJuID0gdmFsdWU7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1jYWxjdWxhdG9yL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NhbGN1bGF0b3IvY2xpZW50L0FkZFNFSUNsaWVudC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1jYWxjdWxhdG9yL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NhbGN1bGF0b3IvY2xpZW50L0FkZFNFSUNsaWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTVkYTFjLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3MtY2FsY3VsYXRvci9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jYWxjdWxhdG9yL2NsaWVudC9BZGRTRUlDbGllbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qDQotKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0qIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotKg0KLSogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotKg0KLSogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0qICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0qIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0qIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSovDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNhbGN1bGF0b3IuY2xpZW50Ow0KLQ0KLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5BZGRyZXNzaW5nRmVhdHVyZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLndzYWRkcmVzc2luZy5XM0NFbmRwb2ludFJlZmVyZW5jZTsNCi0NCi1wdWJsaWMgY2xhc3MgQWRkU0VJQ2xpZW50IHsNCi0NCi0gICAgLyoqDQotICAgICAqIEBwYXJhbSBhcmdzDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7DQotICAgICAgICBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7DQotDQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIC8vVmFsaWRhdGUgaW5wdXQNCi0gICAgICAgICAgICBpZiAoYXJncy5sZW5ndGggIT0gMikNCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVXNhZ2U6IGphdmEgQWRkQ2xpZW50IDxpbnRlZ2VyIDE+IDxpbnRlZ2VyIDI+Iik7DQotDQotICAgICAgICAgICAgaW50IHZhbHVlMCA9IEludGVnZXIucGFyc2VJbnQoYXJnc1swXSk7DQotICAgICAgICAgICAgaW50IHZhbHVlMSA9IEludGVnZXIucGFyc2VJbnQoYXJnc1sxXSk7DQotDQotICAgICAgICAgICAgLy9SZXRyaWV2ZSB0aWNrZXQNCi0gICAgICAgICAgICBDYWxjdWxhdG9yU2VydmljZSBzZXJ2aWNlID0gbmV3IENhbGN1bGF0b3JTZXJ2aWNlKCk7DQotICAgICAgICAgICAgQ2FsY3VsYXRvciBwb3J0MSA9IHNlcnZpY2UuZ2V0Q2FsY3VsYXRvclNlcnZpY2VQb3J0KCk7DQotICAgICAgICAgICAgVzNDRW5kcG9pbnRSZWZlcmVuY2UgZXByID0gcG9ydDEuZ2V0VGlja2V0KCk7DQotDQotICAgICAgICAgICAgLy9BZGQgbnVtYmVycw0KLSAgICAgICAgICAgIENhbGN1bGF0b3IgcG9ydDIgPSBlcHIuZ2V0UG9ydChDYWxjdWxhdG9yLmNsYXNzLCBuZXcgQWRkcmVzc2luZ0ZlYXR1cmUoKSk7DQotICAgICAgICAgICAgaW50IGFuc3dlciA9IHBvcnQyLmFkZCh2YWx1ZTAsIHZhbHVlMSk7DQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUaGUgYW5zd2VyIGlzOiAiICsgYW5zd2VyKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICB9DQotICAgICAgICBmaW5hbGx5IHsNCi0gICAgICAgICAgICBsb25nIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOw0KLSAgICAgICAgICAgIGxvbmcgdGltZSA9IGVuZCAtIHN0YXJ0Ow0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGltZTogIiArIHRpbWUgKyAiIG1zLiIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3MtY2FsY3VsYXRvci9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jYWxjdWxhdG9yL2NsaWVudC9DYWxjdWxhdG9yLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLWNhbGN1bGF0b3Ivc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2FsY3VsYXRvci9jbGllbnQvQ2FsY3VsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDA1N2VlLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3MtY2FsY3VsYXRvci9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jYWxjdWxhdG9yL2NsaWVudC9DYWxjdWxhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKg0KLSogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0qIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0qIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0qICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0qIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSoNCi0qIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSoNCi0qIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0qIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0qIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotKiB1bmRlciB0aGUgTGljZW5zZS4NCi0qLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jYWxjdWxhdG9yLmNsaWVudDsNCi0NCi1pbXBvcnQgamF2YXguandzLldlYk1ldGhvZDsNCi1pbXBvcnQgamF2YXguandzLldlYlBhcmFtOw0KLWltcG9ydCBqYXZheC5qd3MuV2ViUmVzdWx0Ow0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxTZWVBbHNvOw0KLWltcG9ydCBqYXZheC54bWwud3MuUmVxdWVzdFdyYXBwZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5SZXNwb25zZVdyYXBwZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy53c2FkZHJlc3NpbmcuVzNDRW5kcG9pbnRSZWZlcmVuY2U7DQotDQotDQotQFdlYlNlcnZpY2UobmFtZSA9ICJDYWxjdWxhdG9yIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9jYWxjdWxhdG9yLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciKQ0KLUBYbWxTZWVBbHNvKHsNCi0gICAgICAgIE9iamVjdEZhY3RvcnkuY2xhc3MNCi0gICAgICAgIH0pDQotcHVibGljIGludGVyZmFjZSBDYWxjdWxhdG9yIHsNCi0NCi0NCi0gICAgLyoqDQotICAgICAqIEByZXR1cm4gcmV0dXJucyBqYXZheC54bWwud3Mud3NhZGRyZXNzaW5nLlczQ0VuZHBvaW50UmVmZXJlbmNlDQotICAgICAqLw0KLSAgICBAV2ViTWV0aG9kDQotICAgIEBXZWJSZXN1bHQodGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9jYWxjdWxhdG9yLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciKQ0KLSAgICBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gImdldFRpY2tldCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vY2FsY3VsYXRvci5qYXh3cy5heGlzMi5hcGFjaGUub3JnIiwgY2xhc3NOYW1lID0gIm9yZy5hcGFjaGUuYXhpczIuamF4d3MuY2FsY3VsYXRvci5jbGllbnQuR2V0VGlja2V0IikNCi0gICAgQFJlc3BvbnNlV3JhcHBlcihsb2NhbE5hbWUgPSAiZ2V0VGlja2V0UmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL2NhbGN1bGF0b3IuamF4d3MuYXhpczIuYXBhY2hlLm9yZyIsIGNsYXNzTmFtZSA9ICJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNhbGN1bGF0b3IuY2xpZW50LkdldFRpY2tldFJlc3BvbnNlIikNCi0gICAgcHVibGljIFczQ0VuZHBvaW50UmVmZXJlbmNlIGdldFRpY2tldCgpOw0KLQ0KLSAgICAvKioNCi0gICAgICogQHBhcmFtIHZhbHVlMQ0KLSAgICAgKiBAcGFyYW0gdmFsdWUyDQotICAgICAqIEByZXR1cm4gcmV0dXJucyBpbnQNCi0gICAgICogQHRocm93cyBBZGROdW1iZXJzRXhjZXB0aW9uX0V4Y2VwdGlvbg0KLSAgICAgKi8NCi0gICAgQFdlYk1ldGhvZA0KLSAgICBAV2ViUmVzdWx0KHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vY2FsY3VsYXRvci5qYXh3cy5heGlzMi5hcGFjaGUub3JnIikNCi0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJhZGQiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL2NhbGN1bGF0b3IuamF4d3MuYXhpczIuYXBhY2hlLm9yZyIsIGNsYXNzTmFtZSA9ICJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNhbGN1bGF0b3IuY2xpZW50LkFkZCIpDQotICAgIEBSZXNwb25zZVdyYXBwZXIobG9jYWxOYW1lID0gImFkZFJlc3BvbnNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9jYWxjdWxhdG9yLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciLCBjbGFzc05hbWUgPSAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jYWxjdWxhdG9yLmNsaWVudC5BZGRSZXNwb25zZSIpDQotICAgIHB1YmxpYyBpbnQgYWRkKA0KLSAgICAgICAgICAgIEBXZWJQYXJhbShuYW1lID0gInZhbHVlMSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vY2FsY3VsYXRvci5qYXh3cy5heGlzMi5hcGFjaGUub3JnIikNCi0gICAgICAgICAgICBpbnQgdmFsdWUxLA0KLSAgICAgICAgICAgIEBXZWJQYXJhbShuYW1lID0gInZhbHVlMiIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vY2FsY3VsYXRvci5qYXh3cy5heGlzMi5hcGFjaGUub3JnIikNCi0gICAgICAgICAgICBpbnQgdmFsdWUyKQ0KLSAgICAgICAgICAgIHRocm93cyBBZGROdW1iZXJzRXhjZXB0aW9uX0V4Y2VwdGlvbg0KLSAgICAgICAgICAgIDsNCi0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1jYWxjdWxhdG9yL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NhbGN1bGF0b3IvY2xpZW50L0NhbGN1bGF0b3JTZXJ2aWNlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLWNhbGN1bGF0b3Ivc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2FsY3VsYXRvci9jbGllbnQvQ2FsY3VsYXRvclNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA0Y2IxOS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLWNhbGN1bGF0b3Ivc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2FsY3VsYXRvci9jbGllbnQvQ2FsY3VsYXRvclNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qDQotKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0qIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotKg0KLSogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotKg0KLSogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0qICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0qIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0qIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSovDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNhbGN1bGF0b3IuY2xpZW50Ow0KLQ0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOw0KLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLldlYkVuZHBvaW50Ow0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUNsaWVudDsNCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VGZWF0dXJlOw0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247DQotaW1wb3J0IGphdmEubmV0LlVSTDsNCi1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOw0KLQ0KLQ0KLUBXZWJTZXJ2aWNlQ2xpZW50KG5hbWUgPSAiQ2FsY3VsYXRvclNlcnZpY2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL2NhbGN1bGF0b3IuamF4d3MuYXhpczIuYXBhY2hlLm9yZyIsIHdzZGxMb2NhdGlvbiA9ICJmaWxlOi9DOi9BcGFjaGUvYXhpczIvbW9kdWxlcy9zYW1wbGVzL2pheHdzLWNhbGN1bGF0b3IvcmVzb3VyY2VzL01FVEEtSU5GL0NhbGN1bGF0b3JTZXJ2aWNlLndzZGwiKQ0KLXB1YmxpYyBjbGFzcyBDYWxjdWxhdG9yU2VydmljZQ0KLSAgICAgICAgZXh0ZW5kcyBTZXJ2aWNlIHsNCi0NCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgVVJMIENBTENVTEFUT1JTRVJWSUNFX1dTRExfTE9DQVRJT047DQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIExvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY2FsY3VsYXRvci5jbGllbnQuQ2FsY3VsYXRvclNlcnZpY2UuY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgc3RhdGljIHsNCi0gICAgICAgIFVSTCB1cmwgPSBudWxsOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICB1cmwgPSBuZXcgVVJMKCJodHRwOi8vbG9jYWxob3N0OjgwODAvYXhpczIvc2VydmljZXMvQ2FsY3VsYXRvclNlcnZpY2UuQ2FsY3VsYXRvclNlcnZpY2VQb3J0P3dzZGwiKTsNCi0gICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIENBTENVTEFUT1JTRVJWSUNFX1dTRExfTE9DQVRJT04gPSB1cmw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIENhbGN1bGF0b3JTZXJ2aWNlKFVSTCB3c2RsTG9jYXRpb24sIFFOYW1lIHNlcnZpY2VOYW1lKSB7DQotICAgICAgICBzdXBlcih3c2RsTG9jYXRpb24sIHNlcnZpY2VOYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQ2FsY3VsYXRvclNlcnZpY2UoKSB7DQotICAgICAgICBzdXBlcihDQUxDVUxBVE9SU0VSVklDRV9XU0RMX0xPQ0FUSU9OLCBuZXcgUU5hbWUoImh0dHA6Ly9jYWxjdWxhdG9yLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciLCAiQ2FsY3VsYXRvclNlcnZpY2UiKSk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIEByZXR1cm4gcmV0dXJucyBDYWxjdWxhdG9yDQotICAgICAqLw0KLSAgICBAV2ViRW5kcG9pbnQobmFtZSA9ICJDYWxjdWxhdG9yU2VydmljZVBvcnQiKQ0KLSAgICBwdWJsaWMgQ2FsY3VsYXRvciBnZXRDYWxjdWxhdG9yU2VydmljZVBvcnQoKSB7DQotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0UG9ydChuZXcgUU5hbWUoImh0dHA6Ly9jYWxjdWxhdG9yLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciLCAiQ2FsY3VsYXRvclNlcnZpY2VQb3J0IiksIENhbGN1bGF0b3IuY2xhc3MpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBAcGFyYW0gZmVhdHVyZXMgQSBsaXN0IG9mIHtAbGluayBqYXZheC54bWwud3MuV2ViU2VydmljZUZlYXR1cmV9IHRvIGNvbmZpZ3VyZSBvbiB0aGUgcHJveHkuICBTdXBwb3J0ZWQgZmVhdHVyZXMgbm90IGluIHRoZSA8Y29kZT5mZWF0dXJlczwvY29kZT4gcGFyYW1ldGVyIHdpbGwgaGF2ZSB0aGVpciBkZWZhdWx0IHZhbHVlcy4NCi0gICAgICogQHJldHVybiByZXR1cm5zIENhbGN1bGF0b3INCi0gICAgICovDQotICAgIEBXZWJFbmRwb2ludChuYW1lID0gIkNhbGN1bGF0b3JTZXJ2aWNlUG9ydCIpDQotICAgIHB1YmxpYyBDYWxjdWxhdG9yIGdldENhbGN1bGF0b3JTZXJ2aWNlUG9ydChXZWJTZXJ2aWNlRmVhdHVyZS4uLiBmZWF0dXJlcykgew0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldFBvcnQobmV3IFFOYW1lKCJodHRwOi8vY2FsY3VsYXRvci5qYXh3cy5heGlzMi5hcGFjaGUub3JnIiwgIkNhbGN1bGF0b3JTZXJ2aWNlUG9ydCIpLCBDYWxjdWxhdG9yLmNsYXNzLCBmZWF0dXJlcyk7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1jYWxjdWxhdG9yL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NhbGN1bGF0b3IvY2xpZW50L0dldFRpY2tldC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1jYWxjdWxhdG9yL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NhbGN1bGF0b3IvY2xpZW50L0dldFRpY2tldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Nzc1MTU2Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3MtY2FsY3VsYXRvci9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jYWxjdWxhdG9yL2NsaWVudC9HZXRUaWNrZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qDQotKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0qIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotKg0KLSogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotKg0KLSogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0qICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0qIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0qIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSovDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNhbGN1bGF0b3IuY2xpZW50Ow0KLQ0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7DQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOw0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGU7DQotDQotDQotLyoqDQotICogPHA+SmF2YSBjbGFzcyBmb3IgZ2V0VGlja2V0IGNvbXBsZXggdHlwZS4NCi0gKiA8cC8+DQotICogPHA+VGhlIGZvbGxvd2luZyBzY2hlbWEgZnJhZ21lbnQgc3BlY2lmaWVzIHRoZSBleHBlY3RlZCBjb250ZW50IGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBjbGFzcy4NCi0gKiA8cC8+DQotICogPHByZT4NCi0gKiAmbHQ7Y29tcGxleFR5cGUgbmFtZT0iZ2V0VGlja2V0Ij4NCi0gKiAgICZsdDtjb21wbGV4Q29udGVudD4NCi0gKiAgICAgJmx0O3Jlc3RyaWN0aW9uIGJhc2U9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1hbnlUeXBlIj4NCi0gKiAgICAgICAmbHQ7c2VxdWVuY2U+DQotICogICAgICAgJmx0Oy9zZXF1ZW5jZT4NCi0gKiAgICAgJmx0Oy9yZXN0cmljdGlvbj4NCi0gKiAgICZsdDsvY29tcGxleENvbnRlbnQ+DQotICogJmx0Oy9jb21wbGV4VHlwZT4NCi0gKiA8L3ByZT4NCi0gKi8NCi1AWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpDQotQFhtbFR5cGUobmFtZSA9ICJnZXRUaWNrZXQiKQ0KLXB1YmxpYyBjbGFzcyBHZXRUaWNrZXQgew0KLQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLWNhbGN1bGF0b3Ivc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2FsY3VsYXRvci9jbGllbnQvR2V0VGlja2V0UmVzcG9uc2UuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3MtY2FsY3VsYXRvci9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jYWxjdWxhdG9yL2NsaWVudC9HZXRUaWNrZXRSZXNwb25zZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjQwNjMyLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3MtY2FsY3VsYXRvci9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jYWxjdWxhdG9yL2NsaWVudC9HZXRUaWNrZXRSZXNwb25zZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoNCi0qIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0qIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0qDQotKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0qDQotKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSogdW5kZXIgdGhlIExpY2Vuc2UuDQotKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY2FsY3VsYXRvci5jbGllbnQ7DQotDQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzVHlwZTsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7DQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudDsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlOw0KLWltcG9ydCBqYXZheC54bWwud3Mud3NhZGRyZXNzaW5nLlczQ0VuZHBvaW50UmVmZXJlbmNlOw0KLQ0KLQ0KLS8qKg0KLSAqIDxwPkphdmEgY2xhc3MgZm9yIGdldFRpY2tldFJlc3BvbnNlIGNvbXBsZXggdHlwZS4NCi0gKiA8cC8+DQotICogPHA+VGhlIGZvbGxvd2luZyBzY2hlbWEgZnJhZ21lbnQgc3BlY2lmaWVzIHRoZSBleHBlY3RlZCBjb250ZW50IGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBjbGFzcy4NCi0gKiA8cC8+DQotICogPHByZT4NCi0gKiAmbHQ7Y29tcGxleFR5cGUgbmFtZT0iZ2V0VGlja2V0UmVzcG9uc2UiPg0KLSAqICAgJmx0O2NvbXBsZXhDb250ZW50Pg0KLSAqICAgICAmbHQ7cmVzdHJpY3Rpb24gYmFzZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfWFueVR5cGUiPg0KLSAqICAgICAgICZsdDtzZXF1ZW5jZT4NCi0gKiAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9InJldHVybiIgdHlwZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDUvMDgvYWRkcmVzc2luZ31FbmRwb2ludFJlZmVyZW5jZVR5cGUiIG1pbk9jY3Vycz0iMCIvPg0KLSAqICAgICAgICZsdDsvc2VxdWVuY2U+DQotICogICAgICZsdDsvcmVzdHJpY3Rpb24+DQotICogICAmbHQ7L2NvbXBsZXhDb250ZW50Pg0KLSAqICZsdDsvY29tcGxleFR5cGU+DQotICogPC9wcmU+DQotICovDQotQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKQ0KLUBYbWxUeXBlKG5hbWUgPSAiZ2V0VGlja2V0UmVzcG9uc2UiLCBwcm9wT3JkZXIgPSB7DQotICAgICAgICAiX3JldHVybiINCi0gICAgICAgIH0pDQotcHVibGljIGNsYXNzIEdldFRpY2tldFJlc3BvbnNlIHsNCi0NCi0gICAgQFhtbEVsZW1lbnQobmFtZSA9ICJyZXR1cm4iKQ0KLSAgICBwcm90ZWN0ZWQgVzNDRW5kcG9pbnRSZWZlcmVuY2UgX3JldHVybjsNCi0NCi0gICAgLyoqDQotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSByZXR1cm4gcHJvcGVydHkuDQotICAgICAqDQotICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzDQotICAgICAqICAgICAgICAge0BsaW5rIFczQ0VuZHBvaW50UmVmZXJlbmNlIH0NCi0gICAgICovDQotICAgIHB1YmxpYyBXM0NFbmRwb2ludFJlZmVyZW5jZSBnZXRSZXR1cm4oKSB7DQotICAgICAgICByZXR1cm4gX3JldHVybjsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHJldHVybiBwcm9wZXJ0eS4NCi0gICAgICoNCi0gICAgICogQHBhcmFtIHZhbHVlIGFsbG93ZWQgb2JqZWN0IGlzDQotICAgICAqICAgICAgICAgICAgICB7QGxpbmsgVzNDRW5kcG9pbnRSZWZlcmVuY2UgfQ0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgc2V0UmV0dXJuKFczQ0VuZHBvaW50UmVmZXJlbmNlIHZhbHVlKSB7DQotICAgICAgICB0aGlzLl9yZXR1cm4gPSB2YWx1ZTsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLWNhbGN1bGF0b3Ivc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2FsY3VsYXRvci9jbGllbnQvT2JqZWN0RmFjdG9yeS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1jYWxjdWxhdG9yL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NhbGN1bGF0b3IvY2xpZW50L09iamVjdEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA5YmJlMC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLWNhbGN1bGF0b3Ivc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2FsY3VsYXRvci9jbGllbnQvT2JqZWN0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qDQotKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0qIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotKg0KLSogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotKg0KLSogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0qICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0qIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0qIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNhbGN1bGF0b3IuY2xpZW50Ow0KLQ0KLWltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCRWxlbWVudDsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50RGVjbDsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSZWdpc3RyeTsNCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi0NCi0NCi0vKioNCi0gKiBUaGlzIG9iamVjdCBjb250YWlucyBmYWN0b3J5IG1ldGhvZHMgZm9yIGVhY2gNCi0gKiBKYXZhIGNvbnRlbnQgaW50ZXJmYWNlIGFuZCBKYXZhIGVsZW1lbnQgaW50ZXJmYWNlDQotICogZ2VuZXJhdGVkIGluIHRoZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNhbGN1bGF0b3IuY2xpZW50IHBhY2thZ2UuDQotICogPHA+QW4gT2JqZWN0RmFjdG9yeSBhbGxvd3MgeW91IHRvIHByb2dyYW1hdGljYWxseQ0KLSAqIGNvbnN0cnVjdCBuZXcgaW5zdGFuY2VzIG9mIHRoZSBKYXZhIHJlcHJlc2VudGF0aW9uDQotICogZm9yIFhNTCBjb250ZW50LiBUaGUgSmF2YSByZXByZXNlbnRhdGlvbiBvZiBYTUwNCi0gKiBjb250ZW50IGNhbiBjb25zaXN0IG9mIHNjaGVtYSBkZXJpdmVkIGludGVyZmFjZXMNCi0gKiBhbmQgY2xhc3NlcyByZXByZXNlbnRpbmcgdGhlIGJpbmRpbmcgb2Ygc2NoZW1hDQotICogdHlwZSBkZWZpbml0aW9ucywgZWxlbWVudCBkZWNsYXJhdGlvbnMgYW5kIG1vZGVsDQotICogZ3JvdXBzLiAgRmFjdG9yeSBtZXRob2RzIGZvciBlYWNoIG9mIHRoZXNlIGFyZQ0KLSAqIHByb3ZpZGVkIGluIHRoaXMgY2xhc3MuDQotICovDQotQFhtbFJlZ2lzdHJ5DQotcHVibGljIGNsYXNzIE9iamVjdEZhY3Rvcnkgew0KLQ0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBRTmFtZSBfR2V0VGlja2V0X1FOQU1FID0gbmV3IFFOYW1lKCJodHRwOi8vY2FsY3VsYXRvci5qYXh3cy5heGlzMi5hcGFjaGUub3JnIiwgImdldFRpY2tldCIpOw0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBRTmFtZSBfQWRkX1FOQU1FID0gbmV3IFFOYW1lKCJodHRwOi8vY2FsY3VsYXRvci5qYXh3cy5heGlzMi5hcGFjaGUub3JnIiwgImFkZCIpOw0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBRTmFtZSBfQWRkUmVzcG9uc2VfUU5BTUUgPSBuZXcgUU5hbWUoImh0dHA6Ly9jYWxjdWxhdG9yLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciLCAiYWRkUmVzcG9uc2UiKTsNCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgUU5hbWUgX0dldFRpY2tldFJlc3BvbnNlX1FOQU1FID0gbmV3IFFOYW1lKCJodHRwOi8vY2FsY3VsYXRvci5qYXh3cy5heGlzMi5hcGFjaGUub3JnIiwgImdldFRpY2tldFJlc3BvbnNlIik7DQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFFOYW1lIF9BZGROdW1iZXJzRXhjZXB0aW9uX1FOQU1FID0gbmV3IFFOYW1lKCJodHRwOi8vY2FsY3VsYXRvci5qYXh3cy5heGlzMi5hcGFjaGUub3JnIiwgIkFkZE51bWJlcnNFeGNlcHRpb24iKTsNCi0NCi0gICAgLyoqDQotICAgICAqIENyZWF0ZSBhIG5ldyBPYmplY3RGYWN0b3J5IHRoYXQgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIG5ldyBpbnN0YW5jZXMgb2Ygc2NoZW1hIGRlcml2ZWQgY2xhc3NlcyBmb3IgcGFja2FnZTogb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jYWxjdWxhdG9yLmNsaWVudA0KLSAgICAgKi8NCi0gICAgcHVibGljIE9iamVjdEZhY3RvcnkoKSB7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgQWRkIH0NCi0gICAgICovDQotICAgIHB1YmxpYyBBZGQgY3JlYXRlQWRkKCkgew0KLSAgICAgICAgcmV0dXJuIG5ldyBBZGQoKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBBZGRSZXNwb25zZSB9DQotICAgICAqLw0KLSAgICBwdWJsaWMgQWRkUmVzcG9uc2UgY3JlYXRlQWRkUmVzcG9uc2UoKSB7DQotICAgICAgICByZXR1cm4gbmV3IEFkZFJlc3BvbnNlKCk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgQWRkTnVtYmVyc0V4Y2VwdGlvbiB9DQotICAgICAqLw0KLSAgICBwdWJsaWMgQWRkTnVtYmVyc0V4Y2VwdGlvbiBjcmVhdGVBZGROdW1iZXJzRXhjZXB0aW9uKCkgew0KLSAgICAgICAgcmV0dXJuIG5ldyBBZGROdW1iZXJzRXhjZXB0aW9uKCk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgR2V0VGlja2V0IH0NCi0gICAgICovDQotICAgIHB1YmxpYyBHZXRUaWNrZXQgY3JlYXRlR2V0VGlja2V0KCkgew0KLSAgICAgICAgcmV0dXJuIG5ldyBHZXRUaWNrZXQoKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBHZXRUaWNrZXRSZXNwb25zZSB9DQotICAgICAqLw0KLSAgICBwdWJsaWMgR2V0VGlja2V0UmVzcG9uc2UgY3JlYXRlR2V0VGlja2V0UmVzcG9uc2UoKSB7DQotICAgICAgICByZXR1cm4gbmV3IEdldFRpY2tldFJlc3BvbnNlKCk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgSkFYQkVsZW1lbnQgfXtAY29kZSA8fXtAbGluayBHZXRUaWNrZXQgfXtAY29kZSA+fX0NCi0gICAgICovDQotICAgIEBYbWxFbGVtZW50RGVjbChuYW1lc3BhY2UgPSAiaHR0cDovL2NhbGN1bGF0b3IuamF4d3MuYXhpczIuYXBhY2hlLm9yZyIsIG5hbWUgPSAiZ2V0VGlja2V0IikNCi0gICAgcHVibGljIEpBWEJFbGVtZW50PEdldFRpY2tldD4gY3JlYXRlR2V0VGlja2V0KEdldFRpY2tldCB2YWx1ZSkgew0KLSAgICAgICAgcmV0dXJuIG5ldyBKQVhCRWxlbWVudDxHZXRUaWNrZXQ+KF9HZXRUaWNrZXRfUU5BTUUsIEdldFRpY2tldC5jbGFzcywgbnVsbCwgdmFsdWUpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEpBWEJFbGVtZW50IH17QGNvZGUgPH17QGxpbmsgQWRkIH17QGNvZGUgPn19DQotICAgICAqLw0KLSAgICBAWG1sRWxlbWVudERlY2wobmFtZXNwYWNlID0gImh0dHA6Ly9jYWxjdWxhdG9yLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciLCBuYW1lID0gImFkZCIpDQotICAgIHB1YmxpYyBKQVhCRWxlbWVudDxBZGQ+IGNyZWF0ZUFkZChBZGQgdmFsdWUpIHsNCi0gICAgICAgIHJldHVybiBuZXcgSkFYQkVsZW1lbnQ8QWRkPihfQWRkX1FOQU1FLCBBZGQuY2xhc3MsIG51bGwsIHZhbHVlKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBKQVhCRWxlbWVudCB9e0Bjb2RlIDx9e0BsaW5rIEFkZFJlc3BvbnNlIH17QGNvZGUgPn19DQotICAgICAqLw0KLSAgICBAWG1sRWxlbWVudERlY2wobmFtZXNwYWNlID0gImh0dHA6Ly9jYWxjdWxhdG9yLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciLCBuYW1lID0gImFkZFJlc3BvbnNlIikNCi0gICAgcHVibGljIEpBWEJFbGVtZW50PEFkZFJlc3BvbnNlPiBjcmVhdGVBZGRSZXNwb25zZShBZGRSZXNwb25zZSB2YWx1ZSkgew0KLSAgICAgICAgcmV0dXJuIG5ldyBKQVhCRWxlbWVudDxBZGRSZXNwb25zZT4oX0FkZFJlc3BvbnNlX1FOQU1FLCBBZGRSZXNwb25zZS5jbGFzcywgbnVsbCwgdmFsdWUpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEpBWEJFbGVtZW50IH17QGNvZGUgPH17QGxpbmsgR2V0VGlja2V0UmVzcG9uc2UgfXtAY29kZSA+fX0NCi0gICAgICovDQotICAgIEBYbWxFbGVtZW50RGVjbChuYW1lc3BhY2UgPSAiaHR0cDovL2NhbGN1bGF0b3IuamF4d3MuYXhpczIuYXBhY2hlLm9yZyIsIG5hbWUgPSAiZ2V0VGlja2V0UmVzcG9uc2UiKQ0KLSAgICBwdWJsaWMgSkFYQkVsZW1lbnQ8R2V0VGlja2V0UmVzcG9uc2U+IGNyZWF0ZUdldFRpY2tldFJlc3BvbnNlKEdldFRpY2tldFJlc3BvbnNlIHZhbHVlKSB7DQotICAgICAgICByZXR1cm4gbmV3IEpBWEJFbGVtZW50PEdldFRpY2tldFJlc3BvbnNlPihfR2V0VGlja2V0UmVzcG9uc2VfUU5BTUUsIEdldFRpY2tldFJlc3BvbnNlLmNsYXNzLCBudWxsLCB2YWx1ZSk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgSkFYQkVsZW1lbnQgfXtAY29kZSA8fXtAbGluayBBZGROdW1iZXJzRXhjZXB0aW9uIH17QGNvZGUgPn19DQotICAgICAqLw0KLSAgICBAWG1sRWxlbWVudERlY2wobmFtZXNwYWNlID0gImh0dHA6Ly9jYWxjdWxhdG9yLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciLCBuYW1lID0gIkFkZE51bWJlcnNFeGNlcHRpb24iKQ0KLSAgICBwdWJsaWMgSkFYQkVsZW1lbnQ8QWRkTnVtYmVyc0V4Y2VwdGlvbj4gY3JlYXRlQWRkTnVtYmVyc0V4Y2VwdGlvbihBZGROdW1iZXJzRXhjZXB0aW9uIHZhbHVlKSB7DQotICAgICAgICByZXR1cm4gbmV3IEpBWEJFbGVtZW50PEFkZE51bWJlcnNFeGNlcHRpb24+KF9BZGROdW1iZXJzRXhjZXB0aW9uX1FOQU1FLCBBZGROdW1iZXJzRXhjZXB0aW9uLmNsYXNzLCBudWxsLCB2YWx1ZSk7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1jYWxjdWxhdG9yL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NhbGN1bGF0b3IvY2xpZW50L3BhY2thZ2UtaW5mby5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1jYWxjdWxhdG9yL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NhbGN1bGF0b3IvY2xpZW50L3BhY2thZ2UtaW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTBiNzJmLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3MtY2FsY3VsYXRvci9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jYWxjdWxhdG9yL2NsaWVudC9wYWNrYWdlLWluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qDQotKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0qIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotKg0KLSogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotKg0KLSogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0qICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0qIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0qIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSovDQotDQotQGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sU2NoZW1hKG5hbWVzcGFjZSA9ICJodHRwOi8vY2FsY3VsYXRvci5qYXh3cy5heGlzMi5hcGFjaGUub3JnIiwgZWxlbWVudEZvcm1EZWZhdWx0ID0gamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxOc0Zvcm0uUVVBTElGSUVEKSBwYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY2FsY3VsYXRvci5jbGllbnQ7DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1jYWxjdWxhdG9yL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NhbGN1bGF0b3IvcGFja2FnZS1pbmZvLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLWNhbGN1bGF0b3Ivc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2FsY3VsYXRvci9wYWNrYWdlLWluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmFmNzMxNi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLWNhbGN1bGF0b3Ivc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2FsY3VsYXRvci9wYWNrYWdlLWluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qCi0qIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0qIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSoKLSogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0qCi0qIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0qIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0qIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSogdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotCi1AamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxTY2hlbWEobmFtZXNwYWNlID0gImh0dHA6Ly9jYWxjdWxhdG9yLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciLCBlbGVtZW50Rm9ybURlZmF1bHQgPSBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbE5zRm9ybS5RVUFMSUZJRUQpIHBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jYWxjdWxhdG9yOwpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1keW5hbWljL1JFQURNRS50eHQgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLWR5bmFtaWMvUkVBRE1FLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ2Y2U4OS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLWR5bmFtaWMvUkVBRE1FLnR4dAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLVRoaXMgc2FtcGxlIHdpbGwgc2hvdyBob3cgdG8gY3JlYXRlIGEgZHluYW1pYyBjbGllbnQvc2VydmljZSB1c2luZyBKQVgtV1MuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1keW5hbWljL3Jlc291cmNlcy93c2RsL0R5bmFtaWNTYW1wbGUud3NkbCBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3MtZHluYW1pYy9yZXNvdXJjZXMvd3NkbC9EeW5hbWljU2FtcGxlLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlOGQwNmMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1keW5hbWljL3Jlc291cmNlcy93c2RsL0R5bmFtaWNTYW1wbGUud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxkZWZpbml0aW9ucyB4bWxucz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIA0KLSAgICB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiANCi0JeG1sbnM6dG5zPSJodHRwOi8vYXhpczIuYXBhY2hlLmNvbS9qYXh3cy9zYW1wbGUvZHluYW1pYyIgDQotICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIA0KLSAgICBuYW1lPSJFY2hvU2VydmljZSIgDQotICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2F4aXMyLmFwYWNoZS5jb20vamF4d3Mvc2FtcGxlL2R5bmFtaWMiPg0KLSAgPHR5cGVzPg0KLSAgICA8eHM6c2NoZW1hIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgDQotICAgICAgICB4bWxuczp0bnM9Imh0dHA6Ly9heGlzMi5hcGFjaGUuY29tL2pheHdzL3NhbXBsZS9keW5hbWljIiANCi0gICAgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2F4aXMyLmFwYWNoZS5jb20vamF4d3Mvc2FtcGxlL2R5bmFtaWMiIHZlcnNpb249IjEuMCI+DQotICAgICAgDQotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ib3BlcmF0aW9uMSIgdHlwZT0ieHNkOnN0cmluZyIvPg0KLSAgICAgIDx4czplbGVtZW50IG5hbWU9Im9wZXJhdGlvbjFSZXNwb25zZSIgdHlwZT0ieHNkOnN0cmluZyIvPg0KLSAgICAgIA0KLSAgICAgIDx4czplbGVtZW50IG5hbWU9Im9wZXJhdGlvbjIiIHR5cGU9InhzZDppbnQiLz4NCi0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJvcGVyYXRpb24yUmVzcG9uc2UiIHR5cGU9InhzZDppbnQiLz4NCi0NCi0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJvcGVyYXRpb24zIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPg0KLSAgICAgIDx4czplbGVtZW50IG5hbWU9Im9wZXJhdGlvbjNSZXNwb25zZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4NCi0NCi0gICAgPC94czpzY2hlbWE+DQotICA8L3R5cGVzPg0KLSAgDQotICA8bWVzc2FnZSBuYW1lPSJvcGVyYXRpb24xIj4NCi0gICAgPHBhcnQgZWxlbWVudD0idG5zOm9wZXJhdGlvbjEiIG5hbWU9InBhcmFtZXRlcnMiLz4NCi0gIDwvbWVzc2FnZT4NCi0gIA0KLSAgPG1lc3NhZ2UgbmFtZT0ib3BlcmF0aW9uMVJlc3BvbnNlIj4NCi0gICAgPHBhcnQgZWxlbWVudD0idG5zOm9wZXJhdGlvbjFSZXNwb25zZSIgbmFtZT0icGFyYW1ldGVycyIvPg0KLSAgPC9tZXNzYWdlPg0KLSAgDQotICA8bWVzc2FnZSBuYW1lPSJvcGVyYXRpb24yIj4NCi0gICAgPHBhcnQgZWxlbWVudD0idG5zOm9wZXJhdGlvbjIiIG5hbWU9InBhcmFtZXRlcnMiLz4NCi0gIDwvbWVzc2FnZT4NCi0gIA0KLSAgPG1lc3NhZ2UgbmFtZT0ib3BlcmF0aW9uMlJlc3BvbnNlIj4NCi0gICAgPHBhcnQgZWxlbWVudD0idG5zOm9wZXJhdGlvbjJSZXNwb25zZSIgbmFtZT0icGFyYW1ldGVycyIvPg0KLSAgPC9tZXNzYWdlPg0KLSAgDQotICA8bWVzc2FnZSBuYW1lPSJvcGVyYXRpb24zIj4NCi0gICAgPHBhcnQgZWxlbWVudD0idG5zOm9wZXJhdGlvbjMiIG5hbWU9InBhcmFtZXRlcnMiLz4NCi0gIDwvbWVzc2FnZT4NCi0gIA0KLSAgPG1lc3NhZ2UgbmFtZT0ib3BlcmF0aW9uM1Jlc3BvbnNlIj4NCi0gICAgPHBhcnQgZWxlbWVudD0idG5zOm9wZXJhdGlvbjNSZXNwb25zZSIgbmFtZT0icGFyYW1ldGVycyIvPg0KLSAgPC9tZXNzYWdlPg0KLSAgDQotICA8cG9ydFR5cGUgbmFtZT0iR2VuZXJpYyI+DQotICAgIDxvcGVyYXRpb24gbmFtZT0ib3BlcmF0aW9uMSI+DQotICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczpvcGVyYXRpb24xIi8+DQotICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6b3BlcmF0aW9uMVJlc3BvbnNlIi8+DQotICAgIDwvb3BlcmF0aW9uPg0KLSAgICA8b3BlcmF0aW9uIG5hbWU9Im9wZXJhdGlvbjIiPg0KLSAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6b3BlcmF0aW9uMiIvPg0KLSAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOm9wZXJhdGlvbjJSZXNwb25zZSIvPg0KLSAgICA8L29wZXJhdGlvbj4NCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJvcGVyYXRpb24zIj4NCi0gICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOm9wZXJhdGlvbjMiLz4NCi0gICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczpvcGVyYXRpb24zUmVzcG9uc2UiLz4NCi0gICAgPC9vcGVyYXRpb24+DQotICA8L3BvcnRUeXBlPg0KLSAgDQotICA8YmluZGluZyBuYW1lPSJHZW5lcmljQmluZGluZyIgdHlwZT0idG5zOkdlbmVyaWMiPg0KLSAgICA8c29hcDpiaW5kaW5nIHN0eWxlPSJkb2N1bWVudCIgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiLz4NCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJvcGVyYXRpb24xIj4NCi0gICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+DQotICAgICAgPGlucHV0Pg0KLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4NCi0gICAgICA8L2lucHV0Pg0KLSAgICAgIDxvdXRwdXQ+DQotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgIDwvb3V0cHV0Pg0KLSAgICA8L29wZXJhdGlvbj4NCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJvcGVyYXRpb24yIj4NCi0gICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+DQotICAgICAgPGlucHV0Pg0KLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4NCi0gICAgICA8L2lucHV0Pg0KLSAgICAgIDxvdXRwdXQ+DQotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgIDwvb3V0cHV0Pg0KLSAgICA8L29wZXJhdGlvbj4NCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJvcGVyYXRpb24zIj4NCi0gICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+DQotICAgICAgPGlucHV0Pg0KLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4NCi0gICAgICA8L2lucHV0Pg0KLSAgICAgIDxvdXRwdXQ+DQotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgIDwvb3V0cHV0Pg0KLSAgICA8L29wZXJhdGlvbj4NCi0gIDwvYmluZGluZz4NCi0gIA0KLSAgPHNlcnZpY2UgbmFtZT0iR2VuZXJpY1NlcnZpY2UiPg0KLSAgICA8cG9ydCBiaW5kaW5nPSJ0bnM6R2VuZXJpY0JpbmRpbmciIG5hbWU9IkVjaG9Qb3J0Ij4NCi0gICAgICA8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjgwODAvc2VydmljZXMvR2VuZXJpY1NlcnZpY2UiLz4NCi0gICAgPC9wb3J0Pg0KLSAgPC9zZXJ2aWNlPg0KLSAgDQotPC9kZWZpbml0aW9ucz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLWR5bmFtaWMvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2R5bmFtaWMvRHluYW1pY1NlcnZpY2VQcm92aWRlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1keW5hbWljL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9keW5hbWljL0R5bmFtaWNTZXJ2aWNlUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM2NGVjMC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLWR5bmFtaWMvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2R5bmFtaWMvRHluYW1pY1NlcnZpY2VQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuZHluYW1pYzsNCi0NCi1pbXBvcnQgamF2YXguYW5ub3RhdGlvbi5SZXNvdXJjZTsNCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5SZXN1bHQ7DQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOw0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyOw0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk7DQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yOw0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7DQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVNvdXJjZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLkJpbmRpbmdUeXBlOw0KLWltcG9ydCBqYXZheC54bWwud3MuUHJvdmlkZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlQ29udGV4dDsNCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlUHJvdmlkZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5zb2FwLlNPQVBCaW5kaW5nOw0KLWltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5NZXNzYWdlQ29udGV4dDsNCi1pbXBvcnQgamF2YXgueG1sLndzLmh0dHAuSFRUUEJpbmRpbmc7DQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07DQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07DQotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOw0KLQ0KLUBXZWJTZXJ2aWNlUHJvdmlkZXIoc2VydmljZU5hbWU9IkdlbmVyaWNTZXJ2aWNlIiwgd3NkbExvY2F0aW9uPSJXRUItSU5GL3dzZGwvRHluYW1pY1NhbXBsZS53c2RsIikNCi1AQmluZGluZ1R5cGUoU09BUEJpbmRpbmcuU09BUDExSFRUUF9CSU5ESU5HKQ0KLXB1YmxpYyBjbGFzcyBEeW5hbWljU2VydmljZVByb3ZpZGVyIGltcGxlbWVudHMgUHJvdmlkZXI8U291cmNlPiB7DQotICAgIA0KLQlAUmVzb3VyY2UodHlwZT1XZWJTZXJ2aWNlQ29udGV4dC5jbGFzcykNCi0gICAgcHVibGljIFdlYlNlcnZpY2VDb250ZXh0IGNvbnRleHQ7DQotCQ0KLQlwdWJsaWMgU291cmNlIGludm9rZShTb3VyY2Ugc291cmNlKSB7DQotCQkgICAgICAgIA0KLQkJLy9UZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gU291cmNlUHJvdmlkZXI6IFJlcXVlc3QgcmVjZWl2ZWQuXG4iKTsNCi0gICAgCWlmIChzb3VyY2UgPT0gbnVsbCkgew0KLSAgICAJICAgIHJldHVybiBzb3VyY2U7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgCWlmIChjb250ZXh0ID09IG51bGwpIHsNCi0gICAgCQkvL1Rlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJbRHluYW1pY1NlcnZpY2VQcm92aWRlcl0gdGhlIFdlYlNlcnZpY2VDb250ZXh0IHdhcyBudWxsLiIpOw0KLSAgICAJCXRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKCJBIFdlYlNlcnZpY2VFeGNlcHRpb24gc2hvdWxkIGhhdmUgYmVlbiBpbmplY3RlZC4iKTsNCi0gICAgCX0NCi0gICAgCQ0KLSAgICAJUU5hbWUgd3NkbFNlcnZpY2UgPSAoUU5hbWUpIGNvbnRleHQuZ2V0TWVzc2FnZUNvbnRleHQoKS5nZXQoTWVzc2FnZUNvbnRleHQuV1NETF9TRVJWSUNFKTsNCi0gICAgCVFOYW1lIHdzZGxPcGVyYXRpb24gPSAoUU5hbWUpIGNvbnRleHQuZ2V0TWVzc2FnZUNvbnRleHQoKS5nZXQoTWVzc2FnZUNvbnRleHQuV1NETF9PUEVSQVRJT04pOw0KLSAgICAJDQotICAgIAlTeXN0ZW0ub3V0LnByaW50bG4oIltEeW5hbWljU2VydmljZVByb3ZpZGVyXSAgIHNlcnZpY2UgbmFtZTogIiArIHdzZGxTZXJ2aWNlKTsNCi0gICAgCVN5c3RlbS5vdXQucHJpbnRsbigiW0R5bmFtaWNTZXJ2aWNlUHJvdmlkZXJdIG9wZXJhdGlvbiBuYW1lOiAiICsgd3NkbE9wZXJhdGlvbik7DQotICAgIAkNCi0gICAgCS8vVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIltEeW5hbWljU2VydmljZVByb3ZpZGVyXSAgIHNlcnZpY2UgbmFtZTogIiArIHdzZGxTZXJ2aWNlKTsNCi0gICAgCS8vVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIltEeW5hbWljU2VydmljZVByb3ZpZGVyXSBvcGVyYXRpb24gbmFtZTogIiArIHdzZGxPcGVyYXRpb24pOw0KLSAgICAJDQotICAgICAgICBTdHJpbmdXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOw0KLSAgICAJdHJ5IHsNCi0gICAgICAgICAgICBUcmFuc2Zvcm1lciB0ID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3VHJhbnNmb3JtZXIoKTsNCi0gICAgICAgICAgICBSZXN1bHQgcmVzdWx0ID0gbmV3IFN0cmVhbVJlc3VsdCh3cml0ZXIpOw0KLSAgICAgICAgICAgIHQudHJhbnNmb3JtKHNvdXJjZSwgcmVzdWx0KTsNCi0gICAgICAgIH0gY2F0Y2ggKFRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oZSk7DQotICAgICAgICB9IGNhdGNoIChUcmFuc2Zvcm1lckZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3IgZSkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOw0KLSAgICAgICAgfSBjYXRjaCAoVHJhbnNmb3JtZXJFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOw0KLSAgICAgICAgfQ0KLSAgICAJDQotICAgICAgICBTdHJpbmcgdGV4dCA9IHdyaXRlci5nZXRCdWZmZXIoKS50b1N0cmluZygpOw0KLSAgICAgICAgLy9UZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gU291cmNlIFJlcXVlc3Qgb24gU2VydmVyOiBcbiIgKyB0ZXh0KTsNCi0gICAgCQ0KLSAgICAJaWYgKHRleHQgIT0gbnVsbCAmJiB0ZXh0LmNvbnRhaW5zKCJ0aHJvd1dlYlNlcnZpY2VFeGNlcHRpb24iKSkgew0KLSAgICAJICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKCJwcm92aWRlciIpOw0KLSAgICAJfQ0KLSAgICAJDQotICAgIAlCeXRlQXJyYXlJbnB1dFN0cmVhbSBzdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0odGV4dC5nZXRCeXRlcygpKTsNCi0gICAgCVNvdXJjZSBzcmNTdHJlYW0gPSBuZXcgU3RyZWFtU291cmNlKChJbnB1dFN0cmVhbSkgc3RyZWFtKTsNCi0gICAgCXJldHVybiBzcmNTdHJlYW07ICAgICAgICANCi0gICAgfSAgICAJDQotDQotfQ0KLQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3MtaW50ZXJvcC9SRUFETUUudHh0IGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1pbnRlcm9wL1JFQURNRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0YjUwNjMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1pbnRlcm9wL1JFQURNRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi1TYW1wbGU6IEpBWC1XUyB0b3AtZG93biBkZXZlbG9wbWVudAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotSW50cm9kdWN0aW9uCi09PT09PT09PT09PT0KLVRoaXMgc2FtcGxlIGRlbW9uc3RyYXRlcyB0b3AtZG93biBkZXZlbG9wbWVudCAoaS5lLiBkZXZlbG9wbWVudCBzdGFydGluZyB3aXRoIGEgV1NETCBkb2N1bWVudCkgb2YgYSBzZXJ2aWNlIGFuZCBjbGllbnQgdXNpbmcgdGhlIEpBWC1XUyBBUEkuICBUaGUgc2FtcGxlIGlzIGJhc2VkIG9uIGFuIGludGVyb3Agc2NlbmFyaW8gZm9yIGJhc2UgZGF0YSB0eXBlcyB3aGljaCBtYXkgYmUgZm91bmQgYXQgaHR0cDovL21zc29hcGludGVyb3Aub3JnL2lsYWIvIC4KLQotQnVpbGRpbmcgdGhlIHNlcnZpY2UgZnJvbSBzY3JhdGNoCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVRoZSBzZXJ2aWNlIG1heSBiZSBjb25zdHJ1Y3RlZCBmcm9tIHNjcmF0Y2ggYnkgZXhlY3V0aW5nIHRoZSB3c2ltcG9ydCB0b29sIChmb3VuZCBpbiB0aGUgU3VuIEpBWC1XUyBSSSkgb24gdGhlIEJhc2VEYXRhVHlwZXNEb2NMaWJCLndzZGwgZmlsZTogJ3dzaW1wb3J0IC1rZWVwIC12ZXJib3NlIEJhc2VEYXRhVHlwZXNEb2NMaWJCLndzZGwnICAoVGhlIC1rZWVwIG9wdGlvbiB0ZWxscyB0aGUgdG9vbCB0byBrZWVwIHRoZSBnZW5lcmF0ZWQgZmlsZXMgYW5kIHRoZSAtdmVyYm9zZSBvcHRpb24gY2F1c2VzIHRoZSB0b29sIHRvIGxpc3Qgd2hhdCBpcyBnZW5lcmF0ZWQuKSAgQWZ0ZXIgdGhlIGZpbGVzIGhhdmUgYmVlbiBnZW5lcmF0ZWQgeW91IHdpbGwgbmVlZCB0byBwcm92aWRlIGFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBzZXJ2aWNlIChpLmUuIGEgY2xhc3MgZXF1aXZhbGVudCB0byBUb3BEb3duU2FtcGxlU2VydmljZS5qYXZhKS4KLQotTm90ZTogRHVlIHRvIGFuIGlzc3VlIHdpdGggdGhlIEpBWFdTRGVwbG95ZXIsIHRoZSBhbm5vdGF0aW9ucyBmcm9tIHRoZSBpbnRlcmZhY2UgbmVlZCB0byBiZSByZXBsaWNhdGVkIGluIHRoZSBpbXBsZW1lbnRpbmcgY2xhc3MgaWYgdGhlIHNlcnZpY2UgaXMgYmVpbmcgZGVwbG95ZWQgdGhyb3VnaCBhIGphciB2aWEgdGhlIHNlcnZpY2VqYXJzIGRpcmVjdG9yeS4KLQotRGVwbG95aW5nIHRoZSBzZXJ2aWNlCi09PT09PT09PT09PT09PT09PT09PT0KLVRoZSBjbGFzc2VzIGNhbiBiZSBwYWNrYWdlZCBpbnRvIGEgamFyIGFuZCB0aGUgamFyIGNhbiBiZSBkcm9wcGVkIGludG8gdGhlIHNlcnZpY2VqYXJzIGRpcmVjdG9yeSBvZiBhIGRlcGxveWVkIGF4aXMyIHNlcnZlci4KLQotQnVpbGRpbmcgdGhlIGNsaWVudCBmcm9tIHNjcmF0Y2gKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1UaGUgZHluYW1pYyBwcm94eSBjbGllbnQgbWF5IGJlIGNvbnN0cnVjdGVkIGZyb20gc2NyYXRjaCBieSBleGVjdXRpbmcgdGhlIHdzaW1wb3J0IHRvb2wgKGZvdW5kIGluIHRoZSBTdW4gSkFYLVdTIFJJKSBvbiB0aGUgQmFzZURhdGFUeXBlc0RvY0xpYkIud3NkbCBmaWxlOiAnd3NpbXBvcnQgLWtlZXAgLXZlcmJvc2UgQmFzZURhdGFUeXBlc0RvY0xpYkIud3NkbCcgIChUaGUgLWtlZXAgb3B0aW9uIHRlbGxzIHRoZSB0b29sIHRvIGtlZXAgdGhlIGdlbmVyYXRlZCBmaWxlcyBhbmQgdGhlIC12ZXJib3NlIG9wdGlvbiBjYXVzZXMgdGhlIHRvb2wgdG8gbGlzdCB3aGF0IGlzIGdlbmVyYXRlZC4pICBBZnRlciB0aGUgZmlsZXMgaGF2ZSBiZWVuIGdlbmVyYXRlZCB5b3Ugd2lsbCBuZWVkIHRvIHByb3ZpZGUgYW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIGNsaWVudCAoaS5lLiBhIGNsYXNzIGVxdWl2YWxlbnQgdG8gVG9wRG93blNhbXBsZUNsaWVudC5qYXZhKS4KLQotCi1SdW5uaW5nIHRoZSBDbGllbnQKLT09PT09PT09PT09PT09PT09PQotVGhlIGNsaWVudCBjYW4gYmUgcnVuIHZpYSB0aGUgYXhpczIuc2ggb3IgYXhpczIuYmF0IHNjcmlwdHMgKGUuZy4gJ2F4aXMyLnNoIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaW50ZXJvcC5JbnRlcm9wU2FtcGxlQ2xpZW50Jy4pICBUaGUgZW5kcG9pbnQgVVJMIGlzIGV4dHJhY3RlZCBhdCBydW50aW1lIGZyb20gdGhlIFdTREwsIHNvIHlvdSBjYW4gZWl0aGVyIG1vZGlmeSB0aGUgc29hcDphZGRyZXNzIHRvIHJlZmVyIHRvIE1pY3Jvc29mdCdzIGVuZHBvaW50IGF0IGh0dHA6Ly8xMzEuMTA3LjcyLjE1L1NvYXBXc2RsX0Jhc2VEYXRhVHlwZXNfWG1sRm9ybWF0dGVyX1NlcnZpY2VfSW5kaWdvL0Jhc2VEYXRhVHlwZXNEb2NMaXRCLnN2YyBvciB0byBhIGxvY2FsIGVuZHBvaW50IHN1Y2ggYXMgaHR0cDovL2xvY2FsaG9zdDo4MDgwL2F4aXMyL3NlcnZpY2VzL1RvcERvd25TYW1wbGVTZXJ2aWNlU2VydmljZS5JQmFzZURhdGFUeXBlc0RvY0xpdEJQb3J0ICAKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3MtaW50ZXJvcC9wb20ueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1pbnRlcm9wL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2MzgwYTUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1pbnRlcm9wL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPg0KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+DQotICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczIuc2FtcGxlczwvZ3JvdXBJZD4NCi0gICAgPGFydGlmYWN0SWQ+amF4d3MtaW50ZXJvcDwvYXJ0aWZhY3RJZD4NCi0gICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4NCi0gICAgPHZlcnNpb24+MS41LjE8L3ZlcnNpb24+DQotICAgIDxuYW1lPkpBWFdTIEludGVyb3AgU2FtcGxlPC9uYW1lPg0KLSAgICA8YnVpbGQ+DQotICAgICAgICA8c291cmNlRGlyZWN0b3J5PnNyYzwvc291cmNlRGlyZWN0b3J5Pg0KLSAgICAgICAgPHJlc291cmNlcz4NCi0gICAgICAgICAgPHJlc291cmNlPg0KLSAgICAgICAgICAgIDxkaXJlY3Rvcnk+cmVzb3VyY2VzPC9kaXJlY3Rvcnk+DQotICAgICAgICAgIDwvcmVzb3VyY2U+DQotICAgICAgICA8L3Jlc291cmNlcz4NCi0gICAgICAgIDxwbHVnaW5zPg0KLSAgICAgICAgICAgIDxwbHVnaW4+DQotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgICAgICAgICAgIDxzb3VyY2U+MS41PC9zb3VyY2U+DQotICAgICAgICAgICAgICAgICAgICA8dGFyZ2V0PjEuNTwvdGFyZ2V0Pg0KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+DQotICAgICAgICAgICAgPC9wbHVnaW4+DQotICAgICAgICA8L3BsdWdpbnM+DQotICAgIDwvYnVpbGQ+DQotICAgIDxkZXBlbmRlbmNpZXM+DQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC54bWwuYmluZDwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXhiLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4yLjE8L3ZlcnNpb24+DQotICAgICAgICAgICAgPGV4Y2x1c2lvbnM+DQotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+DQotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qc3IxNzM8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC54bWw8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPg0KLSAgICAgICAgICAgIDwvZXhjbHVzaW9ucz4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItamF4d3M8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS41LjE8L3ZlcnNpb24+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgIDwvZGVwZW5kZW5jaWVzPg0KLSAgICA8cmVwb3NpdG9yaWVzPg0KLSAgICAgICAgPHJlcG9zaXRvcnk+DQotICAgICAgICAgICAgPGlkPmFwYWNoZS1tMjwvaWQ+DQotICAgICAgICAgICAgPHVybD5odHRwOi8vcGVvcGxlLmFwYWNoZS5vcmcvcmVwby9tMi1pYmlibGlvLXJzeW5jLXJlcG9zaXRvcnk8L3VybD4NCi0gICAgICAgIDwvcmVwb3NpdG9yeT4NCi0gICAgICAgIDxyZXBvc2l0b3J5Pg0KLSAgICAgICAgICAgIDxpZD5hcGFjaGUtc25hcHNob3RzPC9pZD4NCi0gICAgICAgICAgICA8dXJsPmh0dHA6Ly9wZW9wbGUuYXBhY2hlLm9yZy9yZXBvL20yLXNuYXBzaG90LXJlcG9zaXRvcnkvPC91cmw+DQotICAgICAgICA8L3JlcG9zaXRvcnk+DQotICAgICAgICA8cmVwb3NpdG9yeT4NCi0gICAgICAgICAgICA8aWQ+bWF2ZW4yPC9pZD4NCi0gICAgICAgICAgICA8dXJsPmh0dHA6Ly9yZXBvMS5tYXZlbi5vcmcvbWF2ZW4yLzwvdXJsPg0KLSAgICAgICAgPC9yZXBvc2l0b3J5Pg0KLSAgICA8L3JlcG9zaXRvcmllcz4NCi0gICAgPHBsdWdpblJlcG9zaXRvcmllcz4NCi0gICAgICAgIDxwbHVnaW5SZXBvc2l0b3J5Pg0KLSAgICAgICAgICAgIDxpZD5hcGFjaGUtbTI8L2lkPg0KLSAgICAgICAgICAgIDx1cmw+aHR0cDovL3Blb3BsZS5hcGFjaGUub3JnL3JlcG8vbTItaWJpYmxpby1yc3luYy1yZXBvc2l0b3J5PC91cmw+DQotICAgICAgICA8L3BsdWdpblJlcG9zaXRvcnk+DQotICAgICAgICA8cGx1Z2luUmVwb3NpdG9yeT4NCi0gICAgICAgICAgICA8aWQ+YXBhY2hlLXNuYXBzaG90czwvaWQ+DQotICAgICAgICAgICAgPHVybD5odHRwOi8vcGVvcGxlLmFwYWNoZS5vcmcvcmVwby9tMi1zbmFwc2hvdC1yZXBvc2l0b3J5PC91cmw+DQotICAgICAgICA8L3BsdWdpblJlcG9zaXRvcnk+DQotICAgICAgICA8cGx1Z2luUmVwb3NpdG9yeT4NCi0gICAgICAgICAgICA8aWQ+bWF2ZW4yPC9pZD4NCi0gICAgICAgICAgICA8dXJsPmh0dHA6Ly9yZXBvMS5tYXZlbi5vcmcvbWF2ZW4yLzwvdXJsPg0KLSAgICAgICAgPC9wbHVnaW5SZXBvc2l0b3J5Pg0KLSAgICA8L3BsdWdpblJlcG9zaXRvcmllcz4NCi08L3Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1pbnRlcm9wL3Jlc291cmNlcy9NRVRBLUlORi9CYXNlRGF0YVR5cGVzRG9jTGl0Qi53c2RsIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1pbnRlcm9wL3Jlc291cmNlcy9NRVRBLUlORi9CYXNlRGF0YVR5cGVzRG9jTGl0Qi53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTcwMGQwLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3MtaW50ZXJvcC9yZXNvdXJjZXMvTUVUQS1JTkYvQmFzZURhdGFUeXBlc0RvY0xpdEIud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDUxOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/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+DQotPC93c2RsOmRlZmluaXRpb25zPg0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3MtaW50ZXJvcC9yZXNvdXJjZXMvTUVUQS1JTkYveHNkMC54c2QgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLWludGVyb3AvcmVzb3VyY2VzL01FVEEtSU5GL3hzZDAueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmM1MTZhLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3MtaW50ZXJvcC9yZXNvdXJjZXMvTUVUQS1JTkYveHNkMC54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTx4czpzY2hlbWEgYXR0cmlidXRlRm9ybURlZmF1bHQ9InF1YWxpZmllZCIgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiDQotICAgICAgICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vMjAwMy8xMC9TZXJpYWxpemF0aW9uLyINCi0gICAgICAgICAgIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6dG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tLzIwMDMvMTAvU2VyaWFsaXphdGlvbi8iPg0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJhbnlUeXBlIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHM6YW55VHlwZSIvPg0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJhbnlVUkkiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4czphbnlVUkkiLz4NCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0iYmFzZTY0QmluYXJ5IiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHM6YmFzZTY0QmluYXJ5Ii8+DQotICAgIDx4czplbGVtZW50IG5hbWU9ImJvb2xlYW4iIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4czpib29sZWFuIi8+DQotICAgIDx4czplbGVtZW50IG5hbWU9ImJ5dGUiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4czpieXRlIi8+DQotICAgIDx4czplbGVtZW50IG5hbWU9ImRhdGVUaW1lIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHM6ZGF0ZVRpbWUiLz4NCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0iZGVjaW1hbCIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzOmRlY2ltYWwiLz4NCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0iZG91YmxlIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHM6ZG91YmxlIi8+DQotICAgIDx4czplbGVtZW50IG5hbWU9ImZsb2F0IiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHM6ZmxvYXQiLz4NCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0iaW50IiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHM6aW50Ii8+DQotICAgIDx4czplbGVtZW50IG5hbWU9ImxvbmciIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4czpsb25nIi8+DQotICAgIDx4czplbGVtZW50IG5hbWU9IlFOYW1lIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHM6UU5hbWUiLz4NCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0ic2hvcnQiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4czpzaG9ydCIvPg0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJzdHJpbmciIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4czpzdHJpbmciLz4NCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0idW5zaWduZWRCeXRlIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHM6dW5zaWduZWRCeXRlIi8+DQotICAgIDx4czplbGVtZW50IG5hbWU9InVuc2lnbmVkSW50IiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHM6dW5zaWduZWRJbnQiLz4NCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0idW5zaWduZWRMb25nIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHM6dW5zaWduZWRMb25nIi8+DQotICAgIDx4czplbGVtZW50IG5hbWU9InVuc2lnbmVkU2hvcnQiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4czp1bnNpZ25lZFNob3J0Ii8+DQotICAgIDx4czplbGVtZW50IG5hbWU9ImNoYXIiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ0bnM6Y2hhciIvPg0KLSAgICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJjaGFyIj4NCi0gICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czppbnQiLz4NCi0gICAgPC94czpzaW1wbGVUeXBlPg0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJkdXJhdGlvbiIgbmlsbGFibGU9InRydWUiIHR5cGU9InRuczpkdXJhdGlvbiIvPg0KLSAgICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJkdXJhdGlvbiI+DQotICAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6ZHVyYXRpb24iPg0KLSAgICAgICAgICAgIDx4czpwYXR0ZXJuIHZhbHVlPSJcLT9QKFxkKkQpPyhUKFxkKkgpPyhcZCpNKT8oXGQqKFwuXGQqKT9TKT8pPyIvPg0KLSAgICAgICAgICAgIDx4czptaW5JbmNsdXNpdmUgdmFsdWU9Ii1QMTA2NzUxOTlEVDJINDhNNS40Nzc1ODA4UyIvPg0KLSAgICAgICAgICAgIDx4czptYXhJbmNsdXNpdmUgdmFsdWU9IlAxMDY3NTE5OURUMkg0OE01LjQ3NzU4MDdTIi8+DQotICAgICAgICA8L3hzOnJlc3RyaWN0aW9uPg0KLSAgICA8L3hzOnNpbXBsZVR5cGU+DQotICAgIDx4czplbGVtZW50IG5hbWU9Imd1aWQiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ0bnM6Z3VpZCIvPg0KLSAgICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJndWlkIj4NCi0gICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPg0KLSAgICAgICAgICAgIDx4czpwYXR0ZXJuIHZhbHVlPSJbXGRhLWZBLUZdezh9LVtcZGEtZkEtRl17NH0tW1xkYS1mQS1GXXs0fS1bXGRhLWZBLUZdezR9LVtcZGEtZkEtRl17MTJ9Ii8+DQotICAgICAgICA8L3hzOnJlc3RyaWN0aW9uPg0KLSAgICA8L3hzOnNpbXBsZVR5cGU+DQotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iRmFjdG9yeVR5cGUiIHR5cGU9InhzOlFOYW1lIi8+DQotPC94czpzY2hlbWE+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1pbnRlcm9wL3Jlc291cmNlcy9NRVRBLUlORi94c2QxLnhzZCBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3MtaW50ZXJvcC9yZXNvdXJjZXMvTUVUQS1JTkYveHNkMS54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjODgzZjAuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1pbnRlcm9wL3Jlc291cmNlcy9NRVRBLUlORi94c2QxLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPHhzOnNjaGVtYSBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvIg0KLSAgICAgICAgICAgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczp0bnM9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iPg0KLSAgICA8eHM6aW1wb3J0DQotICAgICAgICAgICAgc2NoZW1hTG9jYXRpb249Imh0dHA6Ly8xMzEuMTA3LjcyLjE1L1NvYXBXc2RsX0Jhc2VEYXRhVHlwZXNfWG1sRm9ybWF0dGVyX1NlcnZpY2VfSW5kaWdvL0Jhc2VEYXRhVHlwZXNEb2NMaXRCLnN2Yz94c2Q9eHNkMCINCi0gICAgICAgICAgICBuYW1lc3BhY2U9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vMjAwMy8xMC9TZXJpYWxpemF0aW9uLyIvPg0KLSAgICA8eHM6aW1wb3J0DQotICAgICAgICAgICAgc2NoZW1hTG9jYXRpb249Imh0dHA6Ly8xMzEuMTA3LjcyLjE1L1NvYXBXc2RsX0Jhc2VEYXRhVHlwZXNfWG1sRm9ybWF0dGVyX1NlcnZpY2VfSW5kaWdvL0Jhc2VEYXRhVHlwZXNEb2NMaXRCLnN2Yz94c2Q9eHNkMiINCi0gICAgICAgICAgICBuYW1lc3BhY2U9Imh0dHA6Ly9zY2hlbWFzLmRhdGFjb250cmFjdC5vcmcvMjAwNC8wNy9TeXN0ZW0iLz4NCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0iaW5Cb29sIiB0eXBlPSJ4czpib29sZWFuIi8+DQotICAgIDx4czplbGVtZW50IG5hbWU9IlJldEJvb2xSZXN1bHQiIHR5cGU9InhzOmJvb2xlYW4iLz4NCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0iaW5CeXRlIiB0eXBlPSJ4czp1bnNpZ25lZEJ5dGUiLz4NCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0iUmV0Qnl0ZVJlc3VsdCIgdHlwZT0ieHM6dW5zaWduZWRCeXRlIi8+DQotICAgIDx4czplbGVtZW50IG5hbWU9ImluU0J5dGUiIHR5cGU9InhzOmJ5dGUiLz4NCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0iUmV0U0J5dGVSZXN1bHQiIHR5cGU9InhzOmJ5dGUiLz4NCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0iaW5CeXRlQXJyYXkiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4czpiYXNlNjRCaW5hcnkiLz4NCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0iUmV0Qnl0ZUFycmF5UmVzdWx0IiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHM6YmFzZTY0QmluYXJ5Ii8+DQotICAgIDx4czplbGVtZW50IG5hbWU9ImluQ2hhciIgdHlwZT0icTE6Y2hhciIgeG1sbnM6cTE9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vMjAwMy8xMC9TZXJpYWxpemF0aW9uLyIvPg0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJSZXRDaGFyUmVzdWx0IiB0eXBlPSJxMjpjaGFyIiB4bWxuczpxMj0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS8yMDAzLzEwL1NlcmlhbGl6YXRpb24vIi8+DQotICAgIDx4czplbGVtZW50IG5hbWU9ImluRGVjaW1hbCIgdHlwZT0ieHM6ZGVjaW1hbCIvPg0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJSZXREZWNpbWFsUmVzdWx0IiB0eXBlPSJ4czpkZWNpbWFsIi8+DQotICAgIDx4czplbGVtZW50IG5hbWU9ImluRmxvYXQiIHR5cGU9InhzOmZsb2F0Ii8+DQotICAgIDx4czplbGVtZW50IG5hbWU9IlJldEZsb2F0UmVzdWx0IiB0eXBlPSJ4czpmbG9hdCIvPg0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJpbkRvdWJsZSIgdHlwZT0ieHM6ZG91YmxlIi8+DQotICAgIDx4czplbGVtZW50IG5hbWU9IlJldERvdWJsZVJlc3VsdCIgdHlwZT0ieHM6ZG91YmxlIi8+DQotICAgIDx4czplbGVtZW50IG5hbWU9ImluU2luZ2xlIiB0eXBlPSJ4czpmbG9hdCIvPg0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJSZXRTaW5nbGVSZXN1bHQiIHR5cGU9InhzOmZsb2F0Ii8+DQotICAgIDx4czplbGVtZW50IG5hbWU9ImluSW50IiB0eXBlPSJ4czppbnQiLz4NCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0iUmV0SW50UmVzdWx0IiB0eXBlPSJ4czppbnQiLz4NCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0iaW5TaG9ydCIgdHlwZT0ieHM6c2hvcnQiLz4NCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0iUmV0U2hvcnRSZXN1bHQiIHR5cGU9InhzOnNob3J0Ii8+DQotICAgIDx4czplbGVtZW50IG5hbWU9ImluTG9uZyIgdHlwZT0ieHM6bG9uZyIvPg0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJSZXRMb25nUmVzdWx0IiB0eXBlPSJ4czpsb25nIi8+DQotICAgIDx4czplbGVtZW50IG5hbWU9ImluT2JqZWN0IiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHM6YW55VHlwZSIvPg0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJSZXRPYmplY3RSZXN1bHQiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4czphbnlUeXBlIi8+DQotICAgIDx4czplbGVtZW50IG5hbWU9ImluVUludCIgdHlwZT0ieHM6dW5zaWduZWRJbnQiLz4NCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0iUmV0VUludFJlc3VsdCIgdHlwZT0ieHM6dW5zaWduZWRJbnQiLz4NCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0iaW5VU2hvcnQiIHR5cGU9InhzOnVuc2lnbmVkU2hvcnQiLz4NCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0iUmV0VVNob3J0UmVzdWx0IiB0eXBlPSJ4czp1bnNpZ25lZFNob3J0Ii8+DQotICAgIDx4czplbGVtZW50IG5hbWU9ImluVUxvbmciIHR5cGU9InhzOnVuc2lnbmVkTG9uZyIvPg0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJSZXRVTG9uZ1Jlc3VsdCIgdHlwZT0ieHM6dW5zaWduZWRMb25nIi8+DQotICAgIDx4czplbGVtZW50IG5hbWU9ImluU3RyaW5nIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHM6c3RyaW5nIi8+DQotICAgIDx4czplbGVtZW50IG5hbWU9IlJldFN0cmluZ1Jlc3VsdCIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzOnN0cmluZyIvPg0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJpbkd1aWQiIHR5cGU9InEzOmd1aWQiIHhtbG5zOnEzPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tLzIwMDMvMTAvU2VyaWFsaXphdGlvbi8iLz4NCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0iUmV0R3VpZFJlc3VsdCIgdHlwZT0icTQ6Z3VpZCIgeG1sbnM6cTQ9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vMjAwMy8xMC9TZXJpYWxpemF0aW9uLyIvPg0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJpblVyaSIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzOmFueVVSSSIvPg0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJSZXRVcmlSZXN1bHQiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4czphbnlVUkkiLz4NCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0iaW5EYXRlVGltZSIgdHlwZT0ieHM6ZGF0ZVRpbWUiLz4NCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0iUmV0RGF0ZVRpbWVSZXN1bHQiIHR5cGU9InhzOmRhdGVUaW1lIi8+DQotICAgIDx4czplbGVtZW50IG5hbWU9ImluRGF0ZVRpbWVPZmZzZXQiIHR5cGU9InE1OkRhdGVUaW1lT2Zmc2V0Ig0KLSAgICAgICAgICAgICAgICB4bWxuczpxNT0iaHR0cDovL3NjaGVtYXMuZGF0YWNvbnRyYWN0Lm9yZy8yMDA0LzA3L1N5c3RlbSIvPg0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJSZXREYXRlVGltZU9mZnNldFJlc3VsdCIgdHlwZT0icTY6RGF0ZVRpbWVPZmZzZXQiDQotICAgICAgICAgICAgICAgIHhtbG5zOnE2PSJodHRwOi8vc2NoZW1hcy5kYXRhY29udHJhY3Qub3JnLzIwMDQvMDcvU3lzdGVtIi8+DQotICAgIDx4czplbGVtZW50IG5hbWU9ImluVGltZVNwYW4iIHR5cGU9InE3OmR1cmF0aW9uIiB4bWxuczpxNz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS8yMDAzLzEwL1NlcmlhbGl6YXRpb24vIi8+DQotICAgIDx4czplbGVtZW50IG5hbWU9IlJldFRpbWVTcGFuUmVzdWx0IiB0eXBlPSJxODpkdXJhdGlvbiINCi0gICAgICAgICAgICAgICAgeG1sbnM6cTg9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vMjAwMy8xMC9TZXJpYWxpemF0aW9uLyIvPg0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJpblFOYW1lIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHM6UU5hbWUiLz4NCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0iUmV0UU5hbWVSZXN1bHQiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4czpRTmFtZSIvPg0KLTwveHM6c2NoZW1hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3MtaW50ZXJvcC9yZXNvdXJjZXMvTUVUQS1JTkYveHNkMi54c2QgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLWludGVyb3AvcmVzb3VyY2VzL01FVEEtSU5GL3hzZDIueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTdmOWY4Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3MtaW50ZXJvcC9yZXNvdXJjZXMvTUVUQS1JTkYveHNkMi54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTx4czpzY2hlbWEgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3NjaGVtYXMuZGF0YWNvbnRyYWN0Lm9yZy8yMDA0LzA3L1N5c3RlbSINCi0gICAgICAgICAgIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6dG5zPSJodHRwOi8vc2NoZW1hcy5kYXRhY29udHJhY3Qub3JnLzIwMDQvMDcvU3lzdGVtIj4NCi0gICAgPHhzOmltcG9ydA0KLSAgICAgICAgICAgIHNjaGVtYUxvY2F0aW9uPSJodHRwOi8vMTMxLjEwNy43Mi4xNS9Tb2FwV3NkbF9CYXNlRGF0YVR5cGVzX1htbEZvcm1hdHRlcl9TZXJ2aWNlX0luZGlnby9CYXNlRGF0YVR5cGVzRG9jTGl0Qi5zdmM/eHNkPXhzZDAiDQotICAgICAgICAgICAgbmFtZXNwYWNlPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tLzIwMDMvMTAvU2VyaWFsaXphdGlvbi8iLz4NCi0gICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IkRhdGVUaW1lT2Zmc2V0Ij4NCi0gICAgICAgIDx4czphbm5vdGF0aW9uPg0KLSAgICAgICAgICAgIDx4czphcHBpbmZvPg0KLSAgICAgICAgICAgICAgICA8SXNWYWx1ZVR5cGUgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vMjAwMy8xMC9TZXJpYWxpemF0aW9uLyI+dHJ1ZTwvSXNWYWx1ZVR5cGU+DQotICAgICAgICAgICAgPC94czphcHBpbmZvPg0KLSAgICAgICAgPC94czphbm5vdGF0aW9uPg0KLSAgICAgICAgPHhzOnNlcXVlbmNlPg0KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9IkRhdGVUaW1lIiB0eXBlPSJ4czpkYXRlVGltZSIvPg0KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9Ik9mZnNldE1pbnV0ZXMiIHR5cGU9InhzOnNob3J0Ii8+DQotICAgICAgICA8L3hzOnNlcXVlbmNlPg0KLSAgICA8L3hzOmNvbXBsZXhUeXBlPg0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJEYXRlVGltZU9mZnNldCIgbmlsbGFibGU9InRydWUiIHR5cGU9InRuczpEYXRlVGltZU9mZnNldCIvPg0KLTwveHM6c2NoZW1hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3MtaW50ZXJvcC9zcmMvY29tL21pY3Jvc29mdC9zY2hlbWFzL18yMDAzL18xMC9zZXJpYWxpemF0aW9uL09iamVjdEZhY3RvcnkuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3MtaW50ZXJvcC9zcmMvY29tL21pY3Jvc29mdC9zY2hlbWFzL18yMDAzL18xMC9zZXJpYWxpemF0aW9uL09iamVjdEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTgzNzZlNi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLWludGVyb3Avc3JjL2NvbS9taWNyb3NvZnQvc2NoZW1hcy9fMjAwMy9fMTAvc2VyaWFsaXphdGlvbi9PYmplY3RGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjggKzAsMCBAQAotLyoKLSogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0qIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotKgotKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSoKLSogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotKiB1bmRlciB0aGUgTGljZW5zZS4KLSovCi0KLQotcGFja2FnZSBjb20ubWljcm9zb2Z0LnNjaGVtYXMuXzIwMDMuXzEwLnNlcmlhbGl6YXRpb247Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLWltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCRWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnREZWNsOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUmVnaXN0cnk7Ci1pbXBvcnQgamF2YXgueG1sLmRhdGF0eXBlLkR1cmF0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5kYXRhdHlwZS5YTUxHcmVnb3JpYW5DYWxlbmRhcjsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi0KLS8qKgotICogVGhpcyBvYmplY3QgY29udGFpbnMgZmFjdG9yeSBtZXRob2RzIGZvciBlYWNoIAotICogSmF2YSBjb250ZW50IGludGVyZmFjZSBhbmQgSmF2YSBlbGVtZW50IGludGVyZmFjZSAKLSAqIGdlbmVyYXRlZCBpbiB0aGUgY29tLm1pY3Jvc29mdC5zY2hlbWFzLl8yMDAzLl8xMC5zZXJpYWxpemF0aW9uIHBhY2thZ2UuIAotICogPHA+QW4gT2JqZWN0RmFjdG9yeSBhbGxvd3MgeW91IHRvIHByb2dyYW1hdGljYWxseSAKLSAqIGNvbnN0cnVjdCBuZXcgaW5zdGFuY2VzIG9mIHRoZSBKYXZhIHJlcHJlc2VudGF0aW9uIAotICogZm9yIFhNTCBjb250ZW50LiBUaGUgSmF2YSByZXByZXNlbnRhdGlvbiBvZiBYTUwgCi0gKiBjb250ZW50IGNhbiBjb25zaXN0IG9mIHNjaGVtYSBkZXJpdmVkIGludGVyZmFjZXMgCi0gKiBhbmQgY2xhc3NlcyByZXByZXNlbnRpbmcgdGhlIGJpbmRpbmcgb2Ygc2NoZW1hIAotICogdHlwZSBkZWZpbml0aW9ucywgZWxlbWVudCBkZWNsYXJhdGlvbnMgYW5kIG1vZGVsIAotICogZ3JvdXBzLiAgRmFjdG9yeSBtZXRob2RzIGZvciBlYWNoIG9mIHRoZXNlIGFyZSAKLSAqIHByb3ZpZGVkIGluIHRoaXMgY2xhc3MuCi0gKiAKLSAqLwotQFhtbFJlZ2lzdHJ5Ci1wdWJsaWMgY2xhc3MgT2JqZWN0RmFjdG9yeSB7Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBRTmFtZSBfVW5zaWduZWRMb25nX1FOQU1FID0gbmV3IFFOYW1lKCJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tLzIwMDMvMTAvU2VyaWFsaXphdGlvbi8iLCAidW5zaWduZWRMb25nIik7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgUU5hbWUgX1N0cmluZ19RTkFNRSA9IG5ldyBRTmFtZSgiaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS8yMDAzLzEwL1NlcmlhbGl6YXRpb24vIiwgInN0cmluZyIpOwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFFOYW1lIF9EdXJhdGlvbl9RTkFNRSA9IG5ldyBRTmFtZSgiaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS8yMDAzLzEwL1NlcmlhbGl6YXRpb24vIiwgImR1cmF0aW9uIik7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgUU5hbWUgX0d1aWRfUU5BTUUgPSBuZXcgUU5hbWUoImh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vMjAwMy8xMC9TZXJpYWxpemF0aW9uLyIsICJndWlkIik7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgUU5hbWUgX0RlY2ltYWxfUU5BTUUgPSBuZXcgUU5hbWUoImh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vMjAwMy8xMC9TZXJpYWxpemF0aW9uLyIsICJkZWNpbWFsIik7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgUU5hbWUgX1Vuc2lnbmVkSW50X1FOQU1FID0gbmV3IFFOYW1lKCJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tLzIwMDMvMTAvU2VyaWFsaXphdGlvbi8iLCAidW5zaWduZWRJbnQiKTsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBRTmFtZSBfU2hvcnRfUU5BTUUgPSBuZXcgUU5hbWUoImh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vMjAwMy8xMC9TZXJpYWxpemF0aW9uLyIsICJzaG9ydCIpOwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFFOYW1lIF9VbnNpZ25lZFNob3J0X1FOQU1FID0gbmV3IFFOYW1lKCJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tLzIwMDMvMTAvU2VyaWFsaXphdGlvbi8iLCAidW5zaWduZWRTaG9ydCIpOwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFFOYW1lIF9RTmFtZV9RTkFNRSA9IG5ldyBRTmFtZSgiaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS8yMDAzLzEwL1NlcmlhbGl6YXRpb24vIiwgIlFOYW1lIik7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgUU5hbWUgX0RhdGVUaW1lX1FOQU1FID0gbmV3IFFOYW1lKCJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tLzIwMDMvMTAvU2VyaWFsaXphdGlvbi8iLCAiZGF0ZVRpbWUiKTsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBRTmFtZSBfRG91YmxlX1FOQU1FID0gbmV3IFFOYW1lKCJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tLzIwMDMvMTAvU2VyaWFsaXphdGlvbi8iLCAiZG91YmxlIik7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgUU5hbWUgX0ludF9RTkFNRSA9IG5ldyBRTmFtZSgiaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS8yMDAzLzEwL1NlcmlhbGl6YXRpb24vIiwgImludCIpOwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFFOYW1lIF9BbnlUeXBlX1FOQU1FID0gbmV3IFFOYW1lKCJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tLzIwMDMvMTAvU2VyaWFsaXphdGlvbi8iLCAiYW55VHlwZSIpOwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFFOYW1lIF9VbnNpZ25lZEJ5dGVfUU5BTUUgPSBuZXcgUU5hbWUoImh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vMjAwMy8xMC9TZXJpYWxpemF0aW9uLyIsICJ1bnNpZ25lZEJ5dGUiKTsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBRTmFtZSBfQm9vbGVhbl9RTkFNRSA9IG5ldyBRTmFtZSgiaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS8yMDAzLzEwL1NlcmlhbGl6YXRpb24vIiwgImJvb2xlYW4iKTsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBRTmFtZSBfQnl0ZV9RTkFNRSA9IG5ldyBRTmFtZSgiaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS8yMDAzLzEwL1NlcmlhbGl6YXRpb24vIiwgImJ5dGUiKTsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBRTmFtZSBfQmFzZTY0QmluYXJ5X1FOQU1FID0gbmV3IFFOYW1lKCJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tLzIwMDMvMTAvU2VyaWFsaXphdGlvbi8iLCAiYmFzZTY0QmluYXJ5Iik7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgUU5hbWUgX0xvbmdfUU5BTUUgPSBuZXcgUU5hbWUoImh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vMjAwMy8xMC9TZXJpYWxpemF0aW9uLyIsICJsb25nIik7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgUU5hbWUgX0Zsb2F0X1FOQU1FID0gbmV3IFFOYW1lKCJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tLzIwMDMvMTAvU2VyaWFsaXphdGlvbi8iLCAiZmxvYXQiKTsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBRTmFtZSBfQ2hhcl9RTkFNRSA9IG5ldyBRTmFtZSgiaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS8yMDAzLzEwL1NlcmlhbGl6YXRpb24vIiwgImNoYXIiKTsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBRTmFtZSBfQW55VVJJX1FOQU1FID0gbmV3IFFOYW1lKCJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tLzIwMDMvMTAvU2VyaWFsaXphdGlvbi8iLCAiYW55VVJJIik7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBuZXcgT2JqZWN0RmFjdG9yeSB0aGF0IGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBuZXcgaW5zdGFuY2VzIG9mIHNjaGVtYSBkZXJpdmVkIGNsYXNzZXMgZm9yIHBhY2thZ2U6IGNvbS5taWNyb3NvZnQuc2NoZW1hcy5fMjAwMy5fMTAuc2VyaWFsaXphdGlvbgotICAgICAqIAotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3RGYWN0b3J5KCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgSkFYQkVsZW1lbnQgfXtAY29kZSA8fXtAbGluayBCaWdJbnRlZ2VyIH17QGNvZGUgPn19Ci0gICAgICogCi0gICAgICovCi0gICAgQFhtbEVsZW1lbnREZWNsKG5hbWVzcGFjZSA9ICJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tLzIwMDMvMTAvU2VyaWFsaXphdGlvbi8iLCBuYW1lID0gInVuc2lnbmVkTG9uZyIpCi0gICAgcHVibGljIEpBWEJFbGVtZW50PEJpZ0ludGVnZXI+IGNyZWF0ZVVuc2lnbmVkTG9uZyhCaWdJbnRlZ2VyIHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgSkFYQkVsZW1lbnQ8QmlnSW50ZWdlcj4oX1Vuc2lnbmVkTG9uZ19RTkFNRSwgQmlnSW50ZWdlci5jbGFzcywgbnVsbCwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgSkFYQkVsZW1lbnQgfXtAY29kZSA8fXtAbGluayBTdHJpbmcgfXtAY29kZSA+fX0KLSAgICAgKiAKLSAgICAgKi8KLSAgICBAWG1sRWxlbWVudERlY2wobmFtZXNwYWNlID0gImh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vMjAwMy8xMC9TZXJpYWxpemF0aW9uLyIsIG5hbWUgPSAic3RyaW5nIikKLSAgICBwdWJsaWMgSkFYQkVsZW1lbnQ8U3RyaW5nPiBjcmVhdGVTdHJpbmcoU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgSkFYQkVsZW1lbnQ8U3RyaW5nPihfU3RyaW5nX1FOQU1FLCBTdHJpbmcuY2xhc3MsIG51bGwsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEpBWEJFbGVtZW50IH17QGNvZGUgPH17QGxpbmsgRHVyYXRpb24gfXtAY29kZSA+fX0KLSAgICAgKiAKLSAgICAgKi8KLSAgICBAWG1sRWxlbWVudERlY2wobmFtZXNwYWNlID0gImh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vMjAwMy8xMC9TZXJpYWxpemF0aW9uLyIsIG5hbWUgPSAiZHVyYXRpb24iKQotICAgIHB1YmxpYyBKQVhCRWxlbWVudDxEdXJhdGlvbj4gY3JlYXRlRHVyYXRpb24oRHVyYXRpb24gdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBKQVhCRWxlbWVudDxEdXJhdGlvbj4oX0R1cmF0aW9uX1FOQU1FLCBEdXJhdGlvbi5jbGFzcywgbnVsbCwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgSkFYQkVsZW1lbnQgfXtAY29kZSA8fXtAbGluayBTdHJpbmcgfXtAY29kZSA+fX0KLSAgICAgKiAKLSAgICAgKi8KLSAgICBAWG1sRWxlbWVudERlY2wobmFtZXNwYWNlID0gImh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vMjAwMy8xMC9TZXJpYWxpemF0aW9uLyIsIG5hbWUgPSAiZ3VpZCIpCi0gICAgcHVibGljIEpBWEJFbGVtZW50PFN0cmluZz4gY3JlYXRlR3VpZChTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBKQVhCRWxlbWVudDxTdHJpbmc+KF9HdWlkX1FOQU1FLCBTdHJpbmcuY2xhc3MsIG51bGwsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEpBWEJFbGVtZW50IH17QGNvZGUgPH17QGxpbmsgQmlnRGVjaW1hbCB9e0Bjb2RlID59fQotICAgICAqIAotICAgICAqLwotICAgIEBYbWxFbGVtZW50RGVjbChuYW1lc3BhY2UgPSAiaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS8yMDAzLzEwL1NlcmlhbGl6YXRpb24vIiwgbmFtZSA9ICJkZWNpbWFsIikKLSAgICBwdWJsaWMgSkFYQkVsZW1lbnQ8QmlnRGVjaW1hbD4gY3JlYXRlRGVjaW1hbChCaWdEZWNpbWFsIHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgSkFYQkVsZW1lbnQ8QmlnRGVjaW1hbD4oX0RlY2ltYWxfUU5BTUUsIEJpZ0RlY2ltYWwuY2xhc3MsIG51bGwsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEpBWEJFbGVtZW50IH17QGNvZGUgPH17QGxpbmsgTG9uZyB9e0Bjb2RlID59fQotICAgICAqIAotICAgICAqLwotICAgIEBYbWxFbGVtZW50RGVjbChuYW1lc3BhY2UgPSAiaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS8yMDAzLzEwL1NlcmlhbGl6YXRpb24vIiwgbmFtZSA9ICJ1bnNpZ25lZEludCIpCi0gICAgcHVibGljIEpBWEJFbGVtZW50PExvbmc+IGNyZWF0ZVVuc2lnbmVkSW50KExvbmcgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBKQVhCRWxlbWVudDxMb25nPihfVW5zaWduZWRJbnRfUU5BTUUsIExvbmcuY2xhc3MsIG51bGwsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEpBWEJFbGVtZW50IH17QGNvZGUgPH17QGxpbmsgU2hvcnQgfXtAY29kZSA+fX0KLSAgICAgKiAKLSAgICAgKi8KLSAgICBAWG1sRWxlbWVudERlY2wobmFtZXNwYWNlID0gImh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vMjAwMy8xMC9TZXJpYWxpemF0aW9uLyIsIG5hbWUgPSAic2hvcnQiKQotICAgIHB1YmxpYyBKQVhCRWxlbWVudDxTaG9ydD4gY3JlYXRlU2hvcnQoU2hvcnQgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBKQVhCRWxlbWVudDxTaG9ydD4oX1Nob3J0X1FOQU1FLCBTaG9ydC5jbGFzcywgbnVsbCwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgSkFYQkVsZW1lbnQgfXtAY29kZSA8fXtAbGluayBJbnRlZ2VyIH17QGNvZGUgPn19Ci0gICAgICogCi0gICAgICovCi0gICAgQFhtbEVsZW1lbnREZWNsKG5hbWVzcGFjZSA9ICJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tLzIwMDMvMTAvU2VyaWFsaXphdGlvbi8iLCBuYW1lID0gInVuc2lnbmVkU2hvcnQiKQotICAgIHB1YmxpYyBKQVhCRWxlbWVudDxJbnRlZ2VyPiBjcmVhdGVVbnNpZ25lZFNob3J0KEludGVnZXIgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBKQVhCRWxlbWVudDxJbnRlZ2VyPihfVW5zaWduZWRTaG9ydF9RTkFNRSwgSW50ZWdlci5jbGFzcywgbnVsbCwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgSkFYQkVsZW1lbnQgfXtAY29kZSA8fXtAbGluayBRTmFtZSB9e0Bjb2RlID59fQotICAgICAqIAotICAgICAqLwotICAgIEBYbWxFbGVtZW50RGVjbChuYW1lc3BhY2UgPSAiaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS8yMDAzLzEwL1NlcmlhbGl6YXRpb24vIiwgbmFtZSA9ICJRTmFtZSIpCi0gICAgcHVibGljIEpBWEJFbGVtZW50PFFOYW1lPiBjcmVhdGVRTmFtZShRTmFtZSB2YWx1ZSkgewotICAgICAgICByZXR1cm4gbmV3IEpBWEJFbGVtZW50PFFOYW1lPihfUU5hbWVfUU5BTUUsIFFOYW1lLmNsYXNzLCBudWxsLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBKQVhCRWxlbWVudCB9e0Bjb2RlIDx9e0BsaW5rIFhNTEdyZWdvcmlhbkNhbGVuZGFyIH17QGNvZGUgPn19Ci0gICAgICogCi0gICAgICovCi0gICAgQFhtbEVsZW1lbnREZWNsKG5hbWVzcGFjZSA9ICJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tLzIwMDMvMTAvU2VyaWFsaXphdGlvbi8iLCBuYW1lID0gImRhdGVUaW1lIikKLSAgICBwdWJsaWMgSkFYQkVsZW1lbnQ8WE1MR3JlZ29yaWFuQ2FsZW5kYXI+IGNyZWF0ZURhdGVUaW1lKFhNTEdyZWdvcmlhbkNhbGVuZGFyIHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgSkFYQkVsZW1lbnQ8WE1MR3JlZ29yaWFuQ2FsZW5kYXI+KF9EYXRlVGltZV9RTkFNRSwgWE1MR3JlZ29yaWFuQ2FsZW5kYXIuY2xhc3MsIG51bGwsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEpBWEJFbGVtZW50IH17QGNvZGUgPH17QGxpbmsgRG91YmxlIH17QGNvZGUgPn19Ci0gICAgICogCi0gICAgICovCi0gICAgQFhtbEVsZW1lbnREZWNsKG5hbWVzcGFjZSA9ICJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tLzIwMDMvMTAvU2VyaWFsaXphdGlvbi8iLCBuYW1lID0gImRvdWJsZSIpCi0gICAgcHVibGljIEpBWEJFbGVtZW50PERvdWJsZT4gY3JlYXRlRG91YmxlKERvdWJsZSB2YWx1ZSkgewotICAgICAgICByZXR1cm4gbmV3IEpBWEJFbGVtZW50PERvdWJsZT4oX0RvdWJsZV9RTkFNRSwgRG91YmxlLmNsYXNzLCBudWxsLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBKQVhCRWxlbWVudCB9e0Bjb2RlIDx9e0BsaW5rIEludGVnZXIgfXtAY29kZSA+fX0KLSAgICAgKiAKLSAgICAgKi8KLSAgICBAWG1sRWxlbWVudERlY2wobmFtZXNwYWNlID0gImh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vMjAwMy8xMC9TZXJpYWxpemF0aW9uLyIsIG5hbWUgPSAiaW50IikKLSAgICBwdWJsaWMgSkFYQkVsZW1lbnQ8SW50ZWdlcj4gY3JlYXRlSW50KEludGVnZXIgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBKQVhCRWxlbWVudDxJbnRlZ2VyPihfSW50X1FOQU1FLCBJbnRlZ2VyLmNsYXNzLCBudWxsLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBKQVhCRWxlbWVudCB9e0Bjb2RlIDx9e0BsaW5rIE9iamVjdCB9e0Bjb2RlID59fQotICAgICAqIAotICAgICAqLwotICAgIEBYbWxFbGVtZW50RGVjbChuYW1lc3BhY2UgPSAiaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS8yMDAzLzEwL1NlcmlhbGl6YXRpb24vIiwgbmFtZSA9ICJhbnlUeXBlIikKLSAgICBwdWJsaWMgSkFYQkVsZW1lbnQ8T2JqZWN0PiBjcmVhdGVBbnlUeXBlKE9iamVjdCB2YWx1ZSkgewotICAgICAgICByZXR1cm4gbmV3IEpBWEJFbGVtZW50PE9iamVjdD4oX0FueVR5cGVfUU5BTUUsIE9iamVjdC5jbGFzcywgbnVsbCwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgSkFYQkVsZW1lbnQgfXtAY29kZSA8fXtAbGluayBTaG9ydCB9e0Bjb2RlID59fQotICAgICAqIAotICAgICAqLwotICAgIEBYbWxFbGVtZW50RGVjbChuYW1lc3BhY2UgPSAiaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS8yMDAzLzEwL1NlcmlhbGl6YXRpb24vIiwgbmFtZSA9ICJ1bnNpZ25lZEJ5dGUiKQotICAgIHB1YmxpYyBKQVhCRWxlbWVudDxTaG9ydD4gY3JlYXRlVW5zaWduZWRCeXRlKFNob3J0IHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgSkFYQkVsZW1lbnQ8U2hvcnQ+KF9VbnNpZ25lZEJ5dGVfUU5BTUUsIFNob3J0LmNsYXNzLCBudWxsLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBKQVhCRWxlbWVudCB9e0Bjb2RlIDx9e0BsaW5rIEJvb2xlYW4gfXtAY29kZSA+fX0KLSAgICAgKiAKLSAgICAgKi8KLSAgICBAWG1sRWxlbWVudERlY2wobmFtZXNwYWNlID0gImh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vMjAwMy8xMC9TZXJpYWxpemF0aW9uLyIsIG5hbWUgPSAiYm9vbGVhbiIpCi0gICAgcHVibGljIEpBWEJFbGVtZW50PEJvb2xlYW4+IGNyZWF0ZUJvb2xlYW4oQm9vbGVhbiB2YWx1ZSkgewotICAgICAgICByZXR1cm4gbmV3IEpBWEJFbGVtZW50PEJvb2xlYW4+KF9Cb29sZWFuX1FOQU1FLCBCb29sZWFuLmNsYXNzLCBudWxsLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBKQVhCRWxlbWVudCB9e0Bjb2RlIDx9e0BsaW5rIEJ5dGUgfXtAY29kZSA+fX0KLSAgICAgKiAKLSAgICAgKi8KLSAgICBAWG1sRWxlbWVudERlY2wobmFtZXNwYWNlID0gImh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vMjAwMy8xMC9TZXJpYWxpemF0aW9uLyIsIG5hbWUgPSAiYnl0ZSIpCi0gICAgcHVibGljIEpBWEJFbGVtZW50PEJ5dGU+IGNyZWF0ZUJ5dGUoQnl0ZSB2YWx1ZSkgewotICAgICAgICByZXR1cm4gbmV3IEpBWEJFbGVtZW50PEJ5dGU+KF9CeXRlX1FOQU1FLCBCeXRlLmNsYXNzLCBudWxsLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBKQVhCRWxlbWVudCB9e0Bjb2RlIDx9e0BsaW5rIGJ5dGVbXX17QGNvZGUgPn19Ci0gICAgICogCi0gICAgICovCi0gICAgQFhtbEVsZW1lbnREZWNsKG5hbWVzcGFjZSA9ICJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tLzIwMDMvMTAvU2VyaWFsaXphdGlvbi8iLCBuYW1lID0gImJhc2U2NEJpbmFyeSIpCi0gICAgcHVibGljIEpBWEJFbGVtZW50PGJ5dGVbXT4gY3JlYXRlQmFzZTY0QmluYXJ5KGJ5dGVbXSB2YWx1ZSkgewotICAgICAgICByZXR1cm4gbmV3IEpBWEJFbGVtZW50PGJ5dGVbXT4oX0Jhc2U2NEJpbmFyeV9RTkFNRSwgYnl0ZVtdLmNsYXNzLCBudWxsLCAoKGJ5dGVbXSkgdmFsdWUpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEpBWEJFbGVtZW50IH17QGNvZGUgPH17QGxpbmsgTG9uZyB9e0Bjb2RlID59fQotICAgICAqIAotICAgICAqLwotICAgIEBYbWxFbGVtZW50RGVjbChuYW1lc3BhY2UgPSAiaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS8yMDAzLzEwL1NlcmlhbGl6YXRpb24vIiwgbmFtZSA9ICJsb25nIikKLSAgICBwdWJsaWMgSkFYQkVsZW1lbnQ8TG9uZz4gY3JlYXRlTG9uZyhMb25nIHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgSkFYQkVsZW1lbnQ8TG9uZz4oX0xvbmdfUU5BTUUsIExvbmcuY2xhc3MsIG51bGwsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEpBWEJFbGVtZW50IH17QGNvZGUgPH17QGxpbmsgRmxvYXQgfXtAY29kZSA+fX0KLSAgICAgKiAKLSAgICAgKi8KLSAgICBAWG1sRWxlbWVudERlY2wobmFtZXNwYWNlID0gImh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vMjAwMy8xMC9TZXJpYWxpemF0aW9uLyIsIG5hbWUgPSAiZmxvYXQiKQotICAgIHB1YmxpYyBKQVhCRWxlbWVudDxGbG9hdD4gY3JlYXRlRmxvYXQoRmxvYXQgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBKQVhCRWxlbWVudDxGbG9hdD4oX0Zsb2F0X1FOQU1FLCBGbG9hdC5jbGFzcywgbnVsbCwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgSkFYQkVsZW1lbnQgfXtAY29kZSA8fXtAbGluayBJbnRlZ2VyIH17QGNvZGUgPn19Ci0gICAgICogCi0gICAgICovCi0gICAgQFhtbEVsZW1lbnREZWNsKG5hbWVzcGFjZSA9ICJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tLzIwMDMvMTAvU2VyaWFsaXphdGlvbi8iLCBuYW1lID0gImNoYXIiKQotICAgIHB1YmxpYyBKQVhCRWxlbWVudDxJbnRlZ2VyPiBjcmVhdGVDaGFyKEludGVnZXIgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBKQVhCRWxlbWVudDxJbnRlZ2VyPihfQ2hhcl9RTkFNRSwgSW50ZWdlci5jbGFzcywgbnVsbCwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgSkFYQkVsZW1lbnQgfXtAY29kZSA8fXtAbGluayBTdHJpbmcgfXtAY29kZSA+fX0KLSAgICAgKiAKLSAgICAgKi8KLSAgICBAWG1sRWxlbWVudERlY2wobmFtZXNwYWNlID0gImh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vMjAwMy8xMC9TZXJpYWxpemF0aW9uLyIsIG5hbWUgPSAiYW55VVJJIikKLSAgICBwdWJsaWMgSkFYQkVsZW1lbnQ8U3RyaW5nPiBjcmVhdGVBbnlVUkkoU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgSkFYQkVsZW1lbnQ8U3RyaW5nPihfQW55VVJJX1FOQU1FLCBTdHJpbmcuY2xhc3MsIG51bGwsIHZhbHVlKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3MtaW50ZXJvcC9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9pbnRlcm9wL0ludGVyb3BTYW1wbGVDbGllbnQuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3MtaW50ZXJvcC9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9pbnRlcm9wL0ludGVyb3BTYW1wbGVDbGllbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdmZGEyOC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLWludGVyb3Avc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvaW50ZXJvcC9JbnRlcm9wU2FtcGxlQ2xpZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0qIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0qIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0qIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0qICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0qCi0qIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotKgotKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0qIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0qIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmludGVyb3A7Ci0KLWltcG9ydCBvcmcudGVtcHVyaS4qOwotaW1wb3J0IGphdmF4LnhtbC53cy5CaW5kaW5nUHJvdmlkZXI7Ci0KLXB1YmxpYyBjbGFzcyBJbnRlcm9wU2FtcGxlQ2xpZW50Ci17Ci0gIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpCi0gIHsKLSAgICAvKkNyZWF0ZSB0aGUgZHluYW1pYyBwcm94eSovCi0gICAgSUJhc2VEYXRhVHlwZXNEb2NMaXRCIHByb3h5ID0gbmV3IEJhc2VEYXRhVHlwZXNEb2NMaXRCU2VydmljZSgpLmdldEJhc2ljSHR0cEJpbmRpbmdJQmFzZURhdGFUeXBlc0RvY0xpdEIoKTsKLQotICAgIC8qSW52b2tlIHRoZSBzZXJ2aWNlKi8KLSAgICBpZiAoIXByb3h5LnJldEJvb2wodHJ1ZSkpCi0gICAgewotICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJUaGUgc2VydmljZSBzaG91bGQgaGF2ZSByZXR1cm5lZCAndHJ1ZSciKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAocHJveHkucmV0SW50KDQyKSAhPSA0MikKLSAgICB7Ci0gICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlRoZSBzZXJ2aWNlIHNob3VsZCBoYXZlIHJldHVybmVkICc0MiciKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBTdHJpbmcgdGVzdFN0cmluZyA9ICJUaGlzIGlzIGEgdGVzdCI7Ci0gICAgaWYgKCF0ZXN0U3RyaW5nLmVxdWFscyhwcm94eS5yZXRTdHJpbmcodGVzdFN0cmluZykpKQotICAgIHsKLSAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiVGhlIHNlcnZpY2Ugc2hvdWxkIGhhdmUgcmV0dXJuZWQgJyIrdGVzdFN0cmluZysiJyIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGhlIHRlc3QgY29tcGxldGVkIHN1Y2Nlc3NmdWxseS4iKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3MtaW50ZXJvcC9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9pbnRlcm9wL0ludGVyb3BTYW1wbGVTZXJ2aWNlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLWludGVyb3Avc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvaW50ZXJvcC9JbnRlcm9wU2FtcGxlU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmZiM2RlLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3MtaW50ZXJvcC9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9pbnRlcm9wL0ludGVyb3BTYW1wbGVTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODQgKzAsMCBAQAotLyoKLSogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0qIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotKgotKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSoKLSogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotKiB1bmRlciB0aGUgTGljZW5zZS4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5pbnRlcm9wOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci1pbXBvcnQgamF2YXguandzLldlYk1ldGhvZDsKLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW07Ci1pbXBvcnQgamF2YXguandzLldlYlJlc3VsdDsKLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZzsKLWltcG9ydCBqYXZheC54bWwuZGF0YXR5cGUuRHVyYXRpb247Ci1pbXBvcnQgamF2YXgueG1sLmRhdGF0eXBlLlhNTEdyZWdvcmlhbkNhbGVuZGFyOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgb3JnLmRhdGFjb250cmFjdC5zY2hlbWFzLl8yMDA0Ll8wNy5zeXN0ZW0uRGF0ZVRpbWVPZmZzZXQ7Ci1pbXBvcnQgb3JnLnRlbXB1cmkuKjsKLQotQFdlYlNlcnZpY2Uoc2VydmljZU5hbWU9IkJhc2VEYXRhVHlwZXNEb2NMaXRCU2VydmljZSIsIHBvcnROYW1lPSJCYXNpY0h0dHBCaW5kaW5nX0lCYXNlRGF0YVR5cGVzRG9jTGl0QiIsIG5hbWUgPSAiSUJhc2VEYXRhVHlwZXNEb2NMaXRCIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly90ZW1wdXJpLm9yZy8iLCB3c2RsTG9jYXRpb249Ik1FVEEtSU5GL0Jhc2VEYXRhVHlwZXNEb2NMaXRCLndzZGwiKQotQFNPQVBCaW5kaW5nKHBhcmFtZXRlclN0eWxlID0gU09BUEJpbmRpbmcuUGFyYW1ldGVyU3R5bGUuQkFSRSkKLXB1YmxpYyBjbGFzcyBJbnRlcm9wU2FtcGxlU2VydmljZSBpbXBsZW1lbnRzIElCYXNlRGF0YVR5cGVzRG9jTGl0QgotewotICAgIC8qKgotICAgICAqIAotICAgICAqIEBwYXJhbSBpbkJvb2wKLSAgICAgKiBAcmV0dXJuCi0gICAgICogICAgIHJldHVybnMgYm9vbGVhbgotICAgICAqLwotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJSZXRCb29sIiwgYWN0aW9uID0gImh0dHA6Ly90ZW1wdXJpLm9yZy9JQmFzZURhdGFUeXBlc0RvY0xpdEIvUmV0Qm9vbCIpCi0gICAgQFdlYlJlc3VsdChuYW1lID0gIlJldEJvb2xSZXN1bHQiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3RlbXB1cmkub3JnLyIsIHBhcnROYW1lID0gIlJldEJvb2xSZXN1bHQiKQotICAgIHB1YmxpYyBib29sZWFuIHJldEJvb2woCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImluQm9vbCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vdGVtcHVyaS5vcmcvIiwgcGFydE5hbWUgPSAiaW5Cb29sIikKLSAgICAgICAgYm9vbGVhbiBpbkJvb2wpCi0gIHsKLSAgICByZXR1cm4gaW5Cb29sOwotICB9Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW5CeXRlCi0gICAgICogQHJldHVybgotICAgICAqICAgICByZXR1cm5zIHNob3J0Ci0gICAgICovCi0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lID0gIlJldEJ5dGUiLCBhY3Rpb24gPSAiaHR0cDovL3RlbXB1cmkub3JnL0lCYXNlRGF0YVR5cGVzRG9jTGl0Qi9SZXRCeXRlIikKLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAiUmV0Qnl0ZVJlc3VsdCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vdGVtcHVyaS5vcmcvIiwgcGFydE5hbWUgPSAiUmV0Qnl0ZVJlc3VsdCIpCi0gICAgcHVibGljIHNob3J0IHJldEJ5dGUoCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImluQnl0ZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vdGVtcHVyaS5vcmcvIiwgcGFydE5hbWUgPSAiaW5CeXRlIikKLSAgICAgICAgc2hvcnQgaW5CeXRlKQotICB7Ci0gICAgcmV0dXJuIGluQnl0ZTsKLSAgfQotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHBhcmFtIGluU0J5dGUKLSAgICAgKiBAcmV0dXJuCi0gICAgICogICAgIHJldHVybnMgYnl0ZQotICAgICAqLwotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJSZXRTQnl0ZSIsIGFjdGlvbiA9ICJodHRwOi8vdGVtcHVyaS5vcmcvSUJhc2VEYXRhVHlwZXNEb2NMaXRCL1JldFNCeXRlIikKLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAiUmV0U0J5dGVSZXN1bHQiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3RlbXB1cmkub3JnLyIsIHBhcnROYW1lID0gIlJldFNCeXRlUmVzdWx0IikKLSAgICBwdWJsaWMgYnl0ZSByZXRTQnl0ZSgKLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiaW5TQnl0ZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vdGVtcHVyaS5vcmcvIiwgcGFydE5hbWUgPSAiaW5TQnl0ZSIpCi0gICAgICAgIGJ5dGUgaW5TQnl0ZSkKLSAgewotICAgIHJldHVybiBpblNCeXRlOwotICB9Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW5CeXRlQXJyYXkKLSAgICAgKiBAcmV0dXJuCi0gICAgICogICAgIHJldHVybnMgYnl0ZVtdCi0gICAgICovCi0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lID0gIlJldEJ5dGVBcnJheSIsIGFjdGlvbiA9ICJodHRwOi8vdGVtcHVyaS5vcmcvSUJhc2VEYXRhVHlwZXNEb2NMaXRCL1JldEJ5dGVBcnJheSIpCi0gICAgQFdlYlJlc3VsdChuYW1lID0gIlJldEJ5dGVBcnJheVJlc3VsdCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vdGVtcHVyaS5vcmcvIiwgcGFydE5hbWUgPSAiUmV0Qnl0ZUFycmF5UmVzdWx0IikKLSAgICBwdWJsaWMgYnl0ZVtdIHJldEJ5dGVBcnJheSgKLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiaW5CeXRlQXJyYXkiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3RlbXB1cmkub3JnLyIsIHBhcnROYW1lID0gImluQnl0ZUFycmF5IikKLSAgICAgICAgYnl0ZVtdIGluQnl0ZUFycmF5KQotICB7Ci0gICAgcmV0dXJuIGluQnl0ZUFycmF5OwotICB9Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW5DaGFyCi0gICAgICogQHJldHVybgotICAgICAqICAgICByZXR1cm5zIGludAotICAgICAqLwotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJSZXRDaGFyIiwgYWN0aW9uID0gImh0dHA6Ly90ZW1wdXJpLm9yZy9JQmFzZURhdGFUeXBlc0RvY0xpdEIvUmV0Q2hhciIpCi0gICAgQFdlYlJlc3VsdChuYW1lID0gIlJldENoYXJSZXN1bHQiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3RlbXB1cmkub3JnLyIsIHBhcnROYW1lID0gIlJldENoYXJSZXN1bHQiKQotICAgIHB1YmxpYyBpbnQgcmV0Q2hhcigKLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiaW5DaGFyIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly90ZW1wdXJpLm9yZy8iLCBwYXJ0TmFtZSA9ICJpbkNoYXIiKQotICAgICAgICBpbnQgaW5DaGFyKQotICB7Ci0gICAgcmV0dXJuIGluQ2hhcjsKLSAgfQotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHBhcmFtIGluRGVjaW1hbAotICAgICAqIEByZXR1cm4KLSAgICAgKiAgICAgcmV0dXJucyBqYXZhLm1hdGguQmlnRGVjaW1hbAotICAgICAqLwotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJSZXREZWNpbWFsIiwgYWN0aW9uID0gImh0dHA6Ly90ZW1wdXJpLm9yZy9JQmFzZURhdGFUeXBlc0RvY0xpdEIvUmV0RGVjaW1hbCIpCi0gICAgQFdlYlJlc3VsdChuYW1lID0gIlJldERlY2ltYWxSZXN1bHQiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3RlbXB1cmkub3JnLyIsIHBhcnROYW1lID0gIlJldERlY2ltYWxSZXN1bHQiKQotICAgIHB1YmxpYyBCaWdEZWNpbWFsIHJldERlY2ltYWwoCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImluRGVjaW1hbCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vdGVtcHVyaS5vcmcvIiwgcGFydE5hbWUgPSAiaW5EZWNpbWFsIikKLSAgICAgICAgQmlnRGVjaW1hbCBpbkRlY2ltYWwpCi0gIHsKLSAgICByZXR1cm4gaW5EZWNpbWFsOwotICB9Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW5GbG9hdAotICAgICAqIEByZXR1cm4KLSAgICAgKiAgICAgcmV0dXJucyBmbG9hdAotICAgICAqLwotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJSZXRGbG9hdCIsIGFjdGlvbiA9ICJodHRwOi8vdGVtcHVyaS5vcmcvSUJhc2VEYXRhVHlwZXNEb2NMaXRCL1JldEZsb2F0IikKLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAiUmV0RmxvYXRSZXN1bHQiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3RlbXB1cmkub3JnLyIsIHBhcnROYW1lID0gIlJldEZsb2F0UmVzdWx0IikKLSAgICBwdWJsaWMgZmxvYXQgcmV0RmxvYXQoCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImluRmxvYXQiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3RlbXB1cmkub3JnLyIsIHBhcnROYW1lID0gImluRmxvYXQiKQotICAgICAgICBmbG9hdCBpbkZsb2F0KQotICB7Ci0gICAgcmV0dXJuIGluRmxvYXQ7Ci0gIH0KLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEBwYXJhbSBpbkRvdWJsZQotICAgICAqIEByZXR1cm4KLSAgICAgKiAgICAgcmV0dXJucyBkb3VibGUKLSAgICAgKi8KLSAgICBAV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWUgPSAiUmV0RG91YmxlIiwgYWN0aW9uID0gImh0dHA6Ly90ZW1wdXJpLm9yZy9JQmFzZURhdGFUeXBlc0RvY0xpdEIvUmV0RG91YmxlIikKLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAiUmV0RG91YmxlUmVzdWx0IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly90ZW1wdXJpLm9yZy8iLCBwYXJ0TmFtZSA9ICJSZXREb3VibGVSZXN1bHQiKQotICAgIHB1YmxpYyBkb3VibGUgcmV0RG91YmxlKAotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJpbkRvdWJsZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vdGVtcHVyaS5vcmcvIiwgcGFydE5hbWUgPSAiaW5Eb3VibGUiKQotICAgICAgICBkb3VibGUgaW5Eb3VibGUpCi0gIHsKLSAgICByZXR1cm4gaW5Eb3VibGU7Ci0gIH0KLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEBwYXJhbSBpblNpbmdsZQotICAgICAqIEByZXR1cm4KLSAgICAgKiAgICAgcmV0dXJucyBmbG9hdAotICAgICAqLwotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJSZXRTaW5nbGUiLCBhY3Rpb24gPSAiaHR0cDovL3RlbXB1cmkub3JnL0lCYXNlRGF0YVR5cGVzRG9jTGl0Qi9SZXRTaW5nbGUiKQotICAgIEBXZWJSZXN1bHQobmFtZSA9ICJSZXRTaW5nbGVSZXN1bHQiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3RlbXB1cmkub3JnLyIsIHBhcnROYW1lID0gIlJldFNpbmdsZVJlc3VsdCIpCi0gICAgcHVibGljIGZsb2F0IHJldFNpbmdsZSgKLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiaW5TaW5nbGUiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3RlbXB1cmkub3JnLyIsIHBhcnROYW1lID0gImluU2luZ2xlIikKLSAgICAgICAgZmxvYXQgaW5TaW5nbGUpCi0gIHsKLSAgICByZXR1cm4gaW5TaW5nbGU7Ci0gIH0KLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEBwYXJhbSBpbkludAotICAgICAqIEByZXR1cm4KLSAgICAgKiAgICAgcmV0dXJucyBpbnQKLSAgICAgKi8KLSAgICBAV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWUgPSAiUmV0SW50IiwgYWN0aW9uID0gImh0dHA6Ly90ZW1wdXJpLm9yZy9JQmFzZURhdGFUeXBlc0RvY0xpdEIvUmV0SW50IikKLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAiUmV0SW50UmVzdWx0IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly90ZW1wdXJpLm9yZy8iLCBwYXJ0TmFtZSA9ICJSZXRJbnRSZXN1bHQiKQotICAgIHB1YmxpYyBpbnQgcmV0SW50KAotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJpbkludCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vdGVtcHVyaS5vcmcvIiwgcGFydE5hbWUgPSAiaW5JbnQiKQotICAgICAgICBpbnQgaW5JbnQpCi0gIHsKLSAgICByZXR1cm4gaW5JbnQ7Ci0gIH0KLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEBwYXJhbSBpblNob3J0Ci0gICAgICogQHJldHVybgotICAgICAqICAgICByZXR1cm5zIHNob3J0Ci0gICAgICovCi0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lID0gIlJldFNob3J0IiwgYWN0aW9uID0gImh0dHA6Ly90ZW1wdXJpLm9yZy9JQmFzZURhdGFUeXBlc0RvY0xpdEIvUmV0U2hvcnQiKQotICAgIEBXZWJSZXN1bHQobmFtZSA9ICJSZXRTaG9ydFJlc3VsdCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vdGVtcHVyaS5vcmcvIiwgcGFydE5hbWUgPSAiUmV0U2hvcnRSZXN1bHQiKQotICAgIHB1YmxpYyBzaG9ydCByZXRTaG9ydCgKLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiaW5TaG9ydCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vdGVtcHVyaS5vcmcvIiwgcGFydE5hbWUgPSAiaW5TaG9ydCIpCi0gICAgICAgIHNob3J0IGluU2hvcnQpCi0gIHsKLSAgICByZXR1cm4gaW5TaG9ydDsKLSAgfQotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHBhcmFtIGluTG9uZwotICAgICAqIEByZXR1cm4KLSAgICAgKiAgICAgcmV0dXJucyBsb25nCi0gICAgICovCi0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lID0gIlJldExvbmciLCBhY3Rpb24gPSAiaHR0cDovL3RlbXB1cmkub3JnL0lCYXNlRGF0YVR5cGVzRG9jTGl0Qi9SZXRMb25nIikKLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAiUmV0TG9uZ1Jlc3VsdCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vdGVtcHVyaS5vcmcvIiwgcGFydE5hbWUgPSAiUmV0TG9uZ1Jlc3VsdCIpCi0gICAgcHVibGljIGxvbmcgcmV0TG9uZygKLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiaW5Mb25nIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly90ZW1wdXJpLm9yZy8iLCBwYXJ0TmFtZSA9ICJpbkxvbmciKQotICAgICAgICBsb25nIGluTG9uZykKLSAgewotICAgIHJldHVybiBpbkxvbmc7Ci0gIH0KLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEBwYXJhbSBpbk9iamVjdAotICAgICAqIEByZXR1cm4KLSAgICAgKiAgICAgcmV0dXJucyBqYXZhLmxhbmcuT2JqZWN0Ci0gICAgICovCi0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lID0gIlJldE9iamVjdCIsIGFjdGlvbiA9ICJodHRwOi8vdGVtcHVyaS5vcmcvSUJhc2VEYXRhVHlwZXNEb2NMaXRCL1JldE9iamVjdCIpCi0gICAgQFdlYlJlc3VsdChuYW1lID0gIlJldE9iamVjdFJlc3VsdCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vdGVtcHVyaS5vcmcvIiwgcGFydE5hbWUgPSAiUmV0T2JqZWN0UmVzdWx0IikKLSAgICBwdWJsaWMgT2JqZWN0IHJldE9iamVjdCgKLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiaW5PYmplY3QiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3RlbXB1cmkub3JnLyIsIHBhcnROYW1lID0gImluT2JqZWN0IikKLSAgICAgICAgT2JqZWN0IGluT2JqZWN0KQotICB7Ci0gICAgcmV0dXJuIGluT2JqZWN0OwotICB9Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW5VSW50Ci0gICAgICogQHJldHVybgotICAgICAqICAgICByZXR1cm5zIGxvbmcKLSAgICAgKi8KLSAgICBAV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWUgPSAiUmV0VUludCIsIGFjdGlvbiA9ICJodHRwOi8vdGVtcHVyaS5vcmcvSUJhc2VEYXRhVHlwZXNEb2NMaXRCL1JldFVJbnQiKQotICAgIEBXZWJSZXN1bHQobmFtZSA9ICJSZXRVSW50UmVzdWx0IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly90ZW1wdXJpLm9yZy8iLCBwYXJ0TmFtZSA9ICJSZXRVSW50UmVzdWx0IikKLSAgICBwdWJsaWMgbG9uZyByZXRVSW50KAotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJpblVJbnQiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3RlbXB1cmkub3JnLyIsIHBhcnROYW1lID0gImluVUludCIpCi0gICAgICAgIGxvbmcgaW5VSW50KQotICB7Ci0gICAgcmV0dXJuIGluVUludDsKLSAgfQotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHBhcmFtIGluVVNob3J0Ci0gICAgICogQHJldHVybgotICAgICAqICAgICByZXR1cm5zIGludAotICAgICAqLwotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJSZXRVU2hvcnQiLCBhY3Rpb24gPSAiaHR0cDovL3RlbXB1cmkub3JnL0lCYXNlRGF0YVR5cGVzRG9jTGl0Qi9SZXRVU2hvcnQiKQotICAgIEBXZWJSZXN1bHQobmFtZSA9ICJSZXRVU2hvcnRSZXN1bHQiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3RlbXB1cmkub3JnLyIsIHBhcnROYW1lID0gIlJldFVTaG9ydFJlc3VsdCIpCi0gICAgcHVibGljIGludCByZXRVU2hvcnQoCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImluVVNob3J0IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly90ZW1wdXJpLm9yZy8iLCBwYXJ0TmFtZSA9ICJpblVTaG9ydCIpCi0gICAgICAgIGludCBpblVTaG9ydCkKLSAgewotICAgIHJldHVybiBpblVTaG9ydDsKLSAgfQotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHBhcmFtIGluVUxvbmcKLSAgICAgKiBAcmV0dXJuCi0gICAgICogICAgIHJldHVybnMgamF2YS5tYXRoLkJpZ0ludGVnZXIKLSAgICAgKi8KLSAgICBAV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWUgPSAiUmV0VUxvbmciLCBhY3Rpb24gPSAiaHR0cDovL3RlbXB1cmkub3JnL0lCYXNlRGF0YVR5cGVzRG9jTGl0Qi9SZXRVTG9uZyIpCi0gICAgQFdlYlJlc3VsdChuYW1lID0gIlJldFVMb25nUmVzdWx0IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly90ZW1wdXJpLm9yZy8iLCBwYXJ0TmFtZSA9ICJSZXRVTG9uZ1Jlc3VsdCIpCi0gICAgcHVibGljIEJpZ0ludGVnZXIgcmV0VUxvbmcoCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImluVUxvbmciLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3RlbXB1cmkub3JnLyIsIHBhcnROYW1lID0gImluVUxvbmciKQotICAgICAgICBCaWdJbnRlZ2VyIGluVUxvbmcpCi0gIHsKLSAgICByZXR1cm4gaW5VTG9uZzsKLSAgfQotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHBhcmFtIGluU3RyaW5nCi0gICAgICogQHJldHVybgotICAgICAqICAgICByZXR1cm5zIGphdmEubGFuZy5TdHJpbmcKLSAgICAgKi8KLSAgICBAV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWUgPSAiUmV0U3RyaW5nIiwgYWN0aW9uID0gImh0dHA6Ly90ZW1wdXJpLm9yZy9JQmFzZURhdGFUeXBlc0RvY0xpdEIvUmV0U3RyaW5nIikKLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAiUmV0U3RyaW5nUmVzdWx0IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly90ZW1wdXJpLm9yZy8iLCBwYXJ0TmFtZSA9ICJSZXRTdHJpbmdSZXN1bHQiKQotICAgIHB1YmxpYyBTdHJpbmcgcmV0U3RyaW5nKAotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJpblN0cmluZyIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vdGVtcHVyaS5vcmcvIiwgcGFydE5hbWUgPSAiaW5TdHJpbmciKQotICAgICAgICBTdHJpbmcgaW5TdHJpbmcpCi0gIHsKLSAgICByZXR1cm4gaW5TdHJpbmc7Ci0gIH0KLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEBwYXJhbSBpbkd1aWQKLSAgICAgKiBAcmV0dXJuCi0gICAgICogICAgIHJldHVybnMgamF2YS5sYW5nLlN0cmluZwotICAgICAqLwotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJSZXRHdWlkIiwgYWN0aW9uID0gImh0dHA6Ly90ZW1wdXJpLm9yZy9JQmFzZURhdGFUeXBlc0RvY0xpdEIvUmV0R3VpZCIpCi0gICAgQFdlYlJlc3VsdChuYW1lID0gIlJldEd1aWRSZXN1bHQiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3RlbXB1cmkub3JnLyIsIHBhcnROYW1lID0gIlJldEd1aWRSZXN1bHQiKQotICAgIHB1YmxpYyBTdHJpbmcgcmV0R3VpZCgKLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiaW5HdWlkIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly90ZW1wdXJpLm9yZy8iLCBwYXJ0TmFtZSA9ICJpbkd1aWQiKQotICAgICAgICBTdHJpbmcgaW5HdWlkKQotICB7Ci0gICAgcmV0dXJuIGluR3VpZDsKLSAgfQotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHBhcmFtIGluVXJpCi0gICAgICogQHJldHVybgotICAgICAqICAgICByZXR1cm5zIGphdmEubGFuZy5TdHJpbmcKLSAgICAgKi8KLSAgICBAV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWUgPSAiUmV0VXJpIiwgYWN0aW9uID0gImh0dHA6Ly90ZW1wdXJpLm9yZy9JQmFzZURhdGFUeXBlc0RvY0xpdEIvUmV0VXJpIikKLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAiUmV0VXJpUmVzdWx0IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly90ZW1wdXJpLm9yZy8iLCBwYXJ0TmFtZSA9ICJSZXRVcmlSZXN1bHQiKQotICAgIHB1YmxpYyBTdHJpbmcgcmV0VXJpKAotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJpblVyaSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vdGVtcHVyaS5vcmcvIiwgcGFydE5hbWUgPSAiaW5VcmkiKQotICAgICAgICBTdHJpbmcgaW5VcmkpCi0gIHsKLSAgICByZXR1cm4gaW5Vcmk7Ci0gIH0KLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEBwYXJhbSBpbkRhdGVUaW1lCi0gICAgICogQHJldHVybgotICAgICAqICAgICByZXR1cm5zIGphdmF4LnhtbC5kYXRhdHlwZS5YTUxHcmVnb3JpYW5DYWxlbmRhcgotICAgICAqLwotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJSZXREYXRlVGltZSIsIGFjdGlvbiA9ICJodHRwOi8vdGVtcHVyaS5vcmcvSUJhc2VEYXRhVHlwZXNEb2NMaXRCL1JldERhdGVUaW1lIikKLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAiUmV0RGF0ZVRpbWVSZXN1bHQiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3RlbXB1cmkub3JnLyIsIHBhcnROYW1lID0gIlJldERhdGVUaW1lUmVzdWx0IikKLSAgICBwdWJsaWMgWE1MR3JlZ29yaWFuQ2FsZW5kYXIgcmV0RGF0ZVRpbWUoCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImluRGF0ZVRpbWUiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3RlbXB1cmkub3JnLyIsIHBhcnROYW1lID0gImluRGF0ZVRpbWUiKQotICAgICAgICBYTUxHcmVnb3JpYW5DYWxlbmRhciBpbkRhdGVUaW1lKQotICB7Ci0gICAgcmV0dXJuIGluRGF0ZVRpbWU7Ci0gIH0KLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEBwYXJhbSBpbkRhdGVUaW1lT2Zmc2V0Ci0gICAgICogQHJldHVybgotICAgICAqICAgICByZXR1cm5zIG9yZy5kYXRhY29udHJhY3Quc2NoZW1hcy5fMjAwNC5fMDcuc3lzdGVtLkRhdGVUaW1lT2Zmc2V0Ci0gICAgICovCi0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lID0gIlJldERhdGVUaW1lT2Zmc2V0IiwgYWN0aW9uID0gImh0dHA6Ly90ZW1wdXJpLm9yZy9JQmFzZURhdGFUeXBlc0RvY0xpdEIvUmV0RGF0ZVRpbWVPZmZzZXQiKQotICAgIEBXZWJSZXN1bHQobmFtZSA9ICJSZXREYXRlVGltZU9mZnNldFJlc3VsdCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vdGVtcHVyaS5vcmcvIiwgcGFydE5hbWUgPSAiUmV0RGF0ZVRpbWVPZmZzZXRSZXN1bHQiKQotICAgIHB1YmxpYyBEYXRlVGltZU9mZnNldCByZXREYXRlVGltZU9mZnNldCgKLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiaW5EYXRlVGltZU9mZnNldCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vdGVtcHVyaS5vcmcvIiwgcGFydE5hbWUgPSAiaW5EYXRlVGltZU9mZnNldCIpCi0gICAgICAgIERhdGVUaW1lT2Zmc2V0IGluRGF0ZVRpbWVPZmZzZXQpCi0gIHsKLSAgICByZXR1cm4gaW5EYXRlVGltZU9mZnNldDsKLSAgfQotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHBhcmFtIGluVGltZVNwYW4KLSAgICAgKiBAcmV0dXJuCi0gICAgICogICAgIHJldHVybnMgamF2YXgueG1sLmRhdGF0eXBlLkR1cmF0aW9uCi0gICAgICovCi0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lID0gIlJldFRpbWVTcGFuIiwgYWN0aW9uID0gImh0dHA6Ly90ZW1wdXJpLm9yZy9JQmFzZURhdGFUeXBlc0RvY0xpdEIvUmV0VGltZVNwYW4iKQotICAgIEBXZWJSZXN1bHQobmFtZSA9ICJSZXRUaW1lU3BhblJlc3VsdCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vdGVtcHVyaS5vcmcvIiwgcGFydE5hbWUgPSAiUmV0VGltZVNwYW5SZXN1bHQiKQotICAgIHB1YmxpYyBEdXJhdGlvbiByZXRUaW1lU3BhbigKLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiaW5UaW1lU3BhbiIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vdGVtcHVyaS5vcmcvIiwgcGFydE5hbWUgPSAiaW5UaW1lU3BhbiIpCi0gICAgICAgIER1cmF0aW9uIGluVGltZVNwYW4pCi0gIHsKLSAgICByZXR1cm4gaW5UaW1lU3BhbjsKLSAgfQotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHBhcmFtIGluUU5hbWUKLSAgICAgKiBAcmV0dXJuCi0gICAgICogICAgIHJldHVybnMgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZQotICAgICAqLwotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJSZXRRTmFtZSIsIGFjdGlvbiA9ICJodHRwOi8vdGVtcHVyaS5vcmcvSUJhc2VEYXRhVHlwZXNEb2NMaXRCL1JldFFOYW1lIikKLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAiUmV0UU5hbWVSZXN1bHQiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3RlbXB1cmkub3JnLyIsIHBhcnROYW1lID0gIlJldFFOYW1lUmVzdWx0IikKLSAgICBwdWJsaWMgUU5hbWUgcmV0UU5hbWUoCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImluUU5hbWUiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3RlbXB1cmkub3JnLyIsIHBhcnROYW1lID0gImluUU5hbWUiKQotICAgICAgICBRTmFtZSBpblFOYW1lKQotICB7Ci0gICAgcmV0dXJuIGluUU5hbWU7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1pbnRlcm9wL3NyYy9vcmcvZGF0YWNvbnRyYWN0L3NjaGVtYXMvXzIwMDQvXzA3L3N5c3RlbS9EYXRlVGltZU9mZnNldC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1pbnRlcm9wL3NyYy9vcmcvZGF0YWNvbnRyYWN0L3NjaGVtYXMvXzIwMDQvXzA3L3N5c3RlbS9EYXRlVGltZU9mZnNldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWMyZjkwLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3MtaW50ZXJvcC9zcmMvb3JnL2RhdGFjb250cmFjdC9zY2hlbWFzL18yMDA0L18wNy9zeXN0ZW0vRGF0ZVRpbWVPZmZzZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKgotKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0qIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0qIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0qIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0qICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0qCi0qIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotKgotKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0qIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0qIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLQotCi1wYWNrYWdlIG9yZy5kYXRhY29udHJhY3Quc2NoZW1hcy5fMjAwNC5fMDcuc3lzdGVtOwotCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmRhdGF0eXBlLlhNTEdyZWdvcmlhbkNhbGVuZGFyOwotCi0KLS8qKgotICogPHA+SmF2YSBjbGFzcyBmb3IgRGF0ZVRpbWVPZmZzZXQgY29tcGxleCB0eXBlLgotICogCi0gKiA8cD5UaGUgZm9sbG93aW5nIHNjaGVtYSBmcmFnbWVudCBzcGVjaWZpZXMgdGhlIGV4cGVjdGVkIGNvbnRlbnQgY29udGFpbmVkIHdpdGhpbiB0aGlzIGNsYXNzLgotICogCi0gKiA8cHJlPgotICogJmx0O2NvbXBsZXhUeXBlIG5hbWU9IkRhdGVUaW1lT2Zmc2V0Ij4KLSAqICAgJmx0O2NvbXBsZXhDb250ZW50PgotICogICAgICZsdDtyZXN0cmljdGlvbiBiYXNlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9YW55VHlwZSI+Ci0gKiAgICAgICAmbHQ7c2VxdWVuY2U+Ci0gKiAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9IkRhdGVUaW1lIiB0eXBlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9ZGF0ZVRpbWUiLz4KLSAqICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0iT2Zmc2V0TWludXRlcyIgdHlwZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfXNob3J0Ii8+Ci0gKiAgICAgICAmbHQ7L3NlcXVlbmNlPgotICogICAgICZsdDsvcmVzdHJpY3Rpb24+Ci0gKiAgICZsdDsvY29tcGxleENvbnRlbnQ+Ci0gKiAmbHQ7L2NvbXBsZXhUeXBlPgotICogPC9wcmU+Ci0gKiAKLSAqIAotICovCi1AWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpCi1AWG1sVHlwZShuYW1lID0gIkRhdGVUaW1lT2Zmc2V0IiwgbmFtZXNwYWNlID0gImh0dHA6Ly9zY2hlbWFzLmRhdGFjb250cmFjdC5vcmcvMjAwNC8wNy9TeXN0ZW0iLCBwcm9wT3JkZXIgPSB7Ci0gICAgImRhdGVUaW1lIiwKLSAgICAib2Zmc2V0TWludXRlcyIKLX0pCi1wdWJsaWMgY2xhc3MgRGF0ZVRpbWVPZmZzZXQgewotCi0gICAgQFhtbEVsZW1lbnQobmFtZSA9ICJEYXRlVGltZSIsIHJlcXVpcmVkID0gdHJ1ZSkKLSAgICBwcm90ZWN0ZWQgWE1MR3JlZ29yaWFuQ2FsZW5kYXIgZGF0ZVRpbWU7Ci0gICAgQFhtbEVsZW1lbnQobmFtZSA9ICJPZmZzZXRNaW51dGVzIikKLSAgICBwcm90ZWN0ZWQgc2hvcnQgb2Zmc2V0TWludXRlczsKLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBkYXRlVGltZSBwcm9wZXJ0eS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuCi0gICAgICogICAgIHBvc3NpYmxlIG9iamVjdCBpcwotICAgICAqICAgICB7QGxpbmsgWE1MR3JlZ29yaWFuQ2FsZW5kYXIgfQotICAgICAqICAgICAKLSAgICAgKi8KLSAgICBwdWJsaWMgWE1MR3JlZ29yaWFuQ2FsZW5kYXIgZ2V0RGF0ZVRpbWUoKSB7Ci0gICAgICAgIHJldHVybiBkYXRlVGltZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZGF0ZVRpbWUgcHJvcGVydHkuCi0gICAgICogCi0gICAgICogQHBhcmFtIHZhbHVlCi0gICAgICogICAgIGFsbG93ZWQgb2JqZWN0IGlzCi0gICAgICogICAgIHtAbGluayBYTUxHcmVnb3JpYW5DYWxlbmRhciB9Ci0gICAgICogICAgIAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERhdGVUaW1lKFhNTEdyZWdvcmlhbkNhbGVuZGFyIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMuZGF0ZVRpbWUgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgb2Zmc2V0TWludXRlcyBwcm9wZXJ0eS4KLSAgICAgKiAKLSAgICAgKi8KLSAgICBwdWJsaWMgc2hvcnQgZ2V0T2Zmc2V0TWludXRlcygpIHsKLSAgICAgICAgcmV0dXJuIG9mZnNldE1pbnV0ZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIG9mZnNldE1pbnV0ZXMgcHJvcGVydHkuCi0gICAgICogCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0T2Zmc2V0TWludXRlcyhzaG9ydCB2YWx1ZSkgewotICAgICAgICB0aGlzLm9mZnNldE1pbnV0ZXMgPSB2YWx1ZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3MtaW50ZXJvcC9zcmMvb3JnL2RhdGFjb250cmFjdC9zY2hlbWFzL18yMDA0L18wNy9zeXN0ZW0vT2JqZWN0RmFjdG9yeS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1pbnRlcm9wL3NyYy9vcmcvZGF0YWNvbnRyYWN0L3NjaGVtYXMvXzIwMDQvXzA3L3N5c3RlbS9PYmplY3RGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzNWY5MzYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1pbnRlcm9wL3NyYy9vcmcvZGF0YWNvbnRyYWN0L3NjaGVtYXMvXzIwMDQvXzA3L3N5c3RlbS9PYmplY3RGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKgotKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0qIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0qIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0qIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0qICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0qCi0qIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotKgotKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0qIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0qIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLQotCi1wYWNrYWdlIG9yZy5kYXRhY29udHJhY3Quc2NoZW1hcy5fMjAwNC5fMDcuc3lzdGVtOwotCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50RGVjbDsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJlZ2lzdHJ5OwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLQotLyoqCi0gKiBUaGlzIG9iamVjdCBjb250YWlucyBmYWN0b3J5IG1ldGhvZHMgZm9yIGVhY2ggCi0gKiBKYXZhIGNvbnRlbnQgaW50ZXJmYWNlIGFuZCBKYXZhIGVsZW1lbnQgaW50ZXJmYWNlIAotICogZ2VuZXJhdGVkIGluIHRoZSBvcmcuZGF0YWNvbnRyYWN0LnNjaGVtYXMuXzIwMDQuXzA3LnN5c3RlbSBwYWNrYWdlLiAKLSAqIDxwPkFuIE9iamVjdEZhY3RvcnkgYWxsb3dzIHlvdSB0byBwcm9ncmFtYXRpY2FsbHkgCi0gKiBjb25zdHJ1Y3QgbmV3IGluc3RhbmNlcyBvZiB0aGUgSmF2YSByZXByZXNlbnRhdGlvbiAKLSAqIGZvciBYTUwgY29udGVudC4gVGhlIEphdmEgcmVwcmVzZW50YXRpb24gb2YgWE1MIAotICogY29udGVudCBjYW4gY29uc2lzdCBvZiBzY2hlbWEgZGVyaXZlZCBpbnRlcmZhY2VzIAotICogYW5kIGNsYXNzZXMgcmVwcmVzZW50aW5nIHRoZSBiaW5kaW5nIG9mIHNjaGVtYSAKLSAqIHR5cGUgZGVmaW5pdGlvbnMsIGVsZW1lbnQgZGVjbGFyYXRpb25zIGFuZCBtb2RlbCAKLSAqIGdyb3Vwcy4gIEZhY3RvcnkgbWV0aG9kcyBmb3IgZWFjaCBvZiB0aGVzZSBhcmUgCi0gKiBwcm92aWRlZCBpbiB0aGlzIGNsYXNzLgotICogCi0gKi8KLUBYbWxSZWdpc3RyeQotcHVibGljIGNsYXNzIE9iamVjdEZhY3RvcnkgewotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgUU5hbWUgX0RhdGVUaW1lT2Zmc2V0X1FOQU1FID0gbmV3IFFOYW1lKCJodHRwOi8vc2NoZW1hcy5kYXRhY29udHJhY3Qub3JnLzIwMDQvMDcvU3lzdGVtIiwgIkRhdGVUaW1lT2Zmc2V0Iik7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBuZXcgT2JqZWN0RmFjdG9yeSB0aGF0IGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBuZXcgaW5zdGFuY2VzIG9mIHNjaGVtYSBkZXJpdmVkIGNsYXNzZXMgZm9yIHBhY2thZ2U6IG9yZy5kYXRhY29udHJhY3Quc2NoZW1hcy5fMjAwNC5fMDcuc3lzdGVtCi0gICAgICogCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdEZhY3RvcnkoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBEYXRlVGltZU9mZnNldCB9Ci0gICAgICogCi0gICAgICovCi0gICAgcHVibGljIERhdGVUaW1lT2Zmc2V0IGNyZWF0ZURhdGVUaW1lT2Zmc2V0KCkgewotICAgICAgICByZXR1cm4gbmV3IERhdGVUaW1lT2Zmc2V0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBKQVhCRWxlbWVudCB9e0Bjb2RlIDx9e0BsaW5rIERhdGVUaW1lT2Zmc2V0IH17QGNvZGUgPn19Ci0gICAgICogCi0gICAgICovCi0gICAgQFhtbEVsZW1lbnREZWNsKG5hbWVzcGFjZSA9ICJodHRwOi8vc2NoZW1hcy5kYXRhY29udHJhY3Qub3JnLzIwMDQvMDcvU3lzdGVtIiwgbmFtZSA9ICJEYXRlVGltZU9mZnNldCIpCi0gICAgcHVibGljIEpBWEJFbGVtZW50PERhdGVUaW1lT2Zmc2V0PiBjcmVhdGVEYXRlVGltZU9mZnNldChEYXRlVGltZU9mZnNldCB2YWx1ZSkgewotICAgICAgICByZXR1cm4gbmV3IEpBWEJFbGVtZW50PERhdGVUaW1lT2Zmc2V0PihfRGF0ZVRpbWVPZmZzZXRfUU5BTUUsIERhdGVUaW1lT2Zmc2V0LmNsYXNzLCBudWxsLCB2YWx1ZSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLWludGVyb3Avc3JjL29yZy9kYXRhY29udHJhY3Qvc2NoZW1hcy9fMjAwNC9fMDcvc3lzdGVtL3BhY2thZ2UtaW5mby5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1pbnRlcm9wL3NyYy9vcmcvZGF0YWNvbnRyYWN0L3NjaGVtYXMvXzIwMDQvXzA3L3N5c3RlbS9wYWNrYWdlLWluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M1ZTQwZi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLWludGVyb3Avc3JjL29yZy9kYXRhY29udHJhY3Qvc2NoZW1hcy9fMjAwNC9fMDcvc3lzdGVtL3BhY2thZ2UtaW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoKLSogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0qIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotKgotKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSoKLSogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotKiB1bmRlciB0aGUgTGljZW5zZS4KLSovCi0KLUBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFNjaGVtYShuYW1lc3BhY2UgPSAiaHR0cDovL3NjaGVtYXMuZGF0YWNvbnRyYWN0Lm9yZy8yMDA0LzA3L1N5c3RlbSIsIGVsZW1lbnRGb3JtRGVmYXVsdCA9IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sTnNGb3JtLlFVQUxJRklFRCkKLXBhY2thZ2Ugb3JnLmRhdGFjb250cmFjdC5zY2hlbWFzLl8yMDA0Ll8wNy5zeXN0ZW07CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLWludGVyb3Avc3JjL29yZy90ZW1wdXJpL0Jhc2VEYXRhVHlwZXNEb2NMaXRCU2VydmljZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1pbnRlcm9wL3NyYy9vcmcvdGVtcHVyaS9CYXNlRGF0YVR5cGVzRG9jTGl0QlNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZhYzNhZC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLWludGVyb3Avc3JjL29yZy90ZW1wdXJpL0Jhc2VEYXRhVHlwZXNEb2NMaXRCU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoKLSogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0qIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotKgotKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSoKLSogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotKiB1bmRlciB0aGUgTGljZW5zZS4KLSovCi0KLQotcGFja2FnZSBvcmcudGVtcHVyaTsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViRW5kcG9pbnQ7Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VDbGllbnQ7Ci0KLUBXZWJTZXJ2aWNlQ2xpZW50KG5hbWUgPSAiQmFzZURhdGFUeXBlc0RvY0xpdEJTZXJ2aWNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly90ZW1wdXJpLm9yZy8iLCB3c2RsTG9jYXRpb24gPSAiL3RtcC9CYXNlRGF0YVR5cGVzRG9jTGl0Qi53c2RsIikKLXB1YmxpYyBjbGFzcyBCYXNlRGF0YVR5cGVzRG9jTGl0QlNlcnZpY2UKLSAgICBleHRlbmRzIFNlcnZpY2UKLXsKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFVSTCBCQVNFREFUQVRZUEVTRE9DTElUQlNFUlZJQ0VfV1NETF9MT0NBVElPTjsKLQotICAgIHN0YXRpYyB7Ci0gICAgICAgIFVSTCB1cmwgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgdXJsID0gbmV3IFVSTCgiZmlsZTpCYXNlRGF0YVR5cGVzRG9jTGl0Qi53c2RsIik7Ci0gICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgICAgIEJBU0VEQVRBVFlQRVNET0NMSVRCU0VSVklDRV9XU0RMX0xPQ0FUSU9OID0gdXJsOwotICAgIH0KLQotICAgIHB1YmxpYyBCYXNlRGF0YVR5cGVzRG9jTGl0QlNlcnZpY2UoVVJMIHdzZGxMb2NhdGlvbiwgUU5hbWUgc2VydmljZU5hbWUpIHsKLSAgICAgICAgc3VwZXIod3NkbExvY2F0aW9uLCBzZXJ2aWNlTmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIEJhc2VEYXRhVHlwZXNEb2NMaXRCU2VydmljZSgpIHsKLSAgICAgICAgc3VwZXIoQkFTRURBVEFUWVBFU0RPQ0xJVEJTRVJWSUNFX1dTRExfTE9DQVRJT04sIG5ldyBRTmFtZSgiaHR0cDovL3RlbXB1cmkub3JnLyIsICJCYXNlRGF0YVR5cGVzRG9jTGl0QlNlcnZpY2UiKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHJldHVybgotICAgICAqICAgICByZXR1cm5zIElCYXNlRGF0YVR5cGVzRG9jTGl0QgotICAgICAqLwotICAgIEBXZWJFbmRwb2ludChuYW1lID0gIkJhc2ljSHR0cEJpbmRpbmdfSUJhc2VEYXRhVHlwZXNEb2NMaXRCIikKLSAgICBwdWJsaWMgSUJhc2VEYXRhVHlwZXNEb2NMaXRCIGdldEJhc2ljSHR0cEJpbmRpbmdJQmFzZURhdGFUeXBlc0RvY0xpdEIoKSB7Ci0gICAgICAgIHJldHVybiAoSUJhc2VEYXRhVHlwZXNEb2NMaXRCKXN1cGVyLmdldFBvcnQobmV3IFFOYW1lKCJodHRwOi8vdGVtcHVyaS5vcmcvIiwgIkJhc2ljSHR0cEJpbmRpbmdfSUJhc2VEYXRhVHlwZXNEb2NMaXRCIiksIElCYXNlRGF0YVR5cGVzRG9jTGl0Qi5jbGFzcyk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLWludGVyb3Avc3JjL29yZy90ZW1wdXJpL0lCYXNlRGF0YVR5cGVzRG9jTGl0Qi5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1pbnRlcm9wL3NyYy9vcmcvdGVtcHVyaS9JQmFzZURhdGFUeXBlc0RvY0xpdEIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDgxMDY2Zi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLWludGVyb3Avc3JjL29yZy90ZW1wdXJpL0lCYXNlRGF0YVR5cGVzRG9jTGl0Qi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE2ICswLDAgQEAKLS8qCi0qIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0qIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSoKLSogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0qCi0qIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0qIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0qIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSogdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotCi0KLXBhY2thZ2Ugb3JnLnRlbXB1cmk7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLWltcG9ydCBqYXZheC5qd3MuV2ViTWV0aG9kOwotaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbTsKLWltcG9ydCBqYXZheC5qd3MuV2ViUmVzdWx0OwotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOwotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nOwotaW1wb3J0IGphdmF4LnhtbC5kYXRhdHlwZS5EdXJhdGlvbjsKLWltcG9ydCBqYXZheC54bWwuZGF0YXR5cGUuWE1MR3JlZ29yaWFuQ2FsZW5kYXI7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBvcmcuZGF0YWNvbnRyYWN0LnNjaGVtYXMuXzIwMDQuXzA3LnN5c3RlbS5EYXRlVGltZU9mZnNldDsKLQotQFdlYlNlcnZpY2UobmFtZSA9ICJJQmFzZURhdGFUeXBlc0RvY0xpdEIiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3RlbXB1cmkub3JnLyIpCi1AU09BUEJpbmRpbmcocGFyYW1ldGVyU3R5bGUgPSBTT0FQQmluZGluZy5QYXJhbWV0ZXJTdHlsZS5CQVJFKQotcHVibGljIGludGVyZmFjZSBJQmFzZURhdGFUeXBlc0RvY0xpdEIgewotCi0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW5Cb29sCi0gICAgICogQHJldHVybgotICAgICAqICAgICByZXR1cm5zIGJvb2xlYW4KLSAgICAgKi8KLSAgICBAV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWUgPSAiUmV0Qm9vbCIsIGFjdGlvbiA9ICJodHRwOi8vdGVtcHVyaS5vcmcvSUJhc2VEYXRhVHlwZXNEb2NMaXRCL1JldEJvb2wiKQotICAgIEBXZWJSZXN1bHQobmFtZSA9ICJSZXRCb29sUmVzdWx0IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly90ZW1wdXJpLm9yZy8iLCBwYXJ0TmFtZSA9ICJSZXRCb29sUmVzdWx0IikKLSAgICBwdWJsaWMgYm9vbGVhbiByZXRCb29sKAotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJpbkJvb2wiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3RlbXB1cmkub3JnLyIsIHBhcnROYW1lID0gImluQm9vbCIpCi0gICAgICAgIGJvb2xlYW4gaW5Cb29sKTsKLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEBwYXJhbSBpbkJ5dGUKLSAgICAgKiBAcmV0dXJuCi0gICAgICogICAgIHJldHVybnMgc2hvcnQKLSAgICAgKi8KLSAgICBAV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWUgPSAiUmV0Qnl0ZSIsIGFjdGlvbiA9ICJodHRwOi8vdGVtcHVyaS5vcmcvSUJhc2VEYXRhVHlwZXNEb2NMaXRCL1JldEJ5dGUiKQotICAgIEBXZWJSZXN1bHQobmFtZSA9ICJSZXRCeXRlUmVzdWx0IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly90ZW1wdXJpLm9yZy8iLCBwYXJ0TmFtZSA9ICJSZXRCeXRlUmVzdWx0IikKLSAgICBwdWJsaWMgc2hvcnQgcmV0Qnl0ZSgKLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiaW5CeXRlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly90ZW1wdXJpLm9yZy8iLCBwYXJ0TmFtZSA9ICJpbkJ5dGUiKQotICAgICAgICBzaG9ydCBpbkJ5dGUpOwotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHBhcmFtIGluU0J5dGUKLSAgICAgKiBAcmV0dXJuCi0gICAgICogICAgIHJldHVybnMgYnl0ZQotICAgICAqLwotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJSZXRTQnl0ZSIsIGFjdGlvbiA9ICJodHRwOi8vdGVtcHVyaS5vcmcvSUJhc2VEYXRhVHlwZXNEb2NMaXRCL1JldFNCeXRlIikKLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAiUmV0U0J5dGVSZXN1bHQiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3RlbXB1cmkub3JnLyIsIHBhcnROYW1lID0gIlJldFNCeXRlUmVzdWx0IikKLSAgICBwdWJsaWMgYnl0ZSByZXRTQnl0ZSgKLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiaW5TQnl0ZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vdGVtcHVyaS5vcmcvIiwgcGFydE5hbWUgPSAiaW5TQnl0ZSIpCi0gICAgICAgIGJ5dGUgaW5TQnl0ZSk7Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW5CeXRlQXJyYXkKLSAgICAgKiBAcmV0dXJuCi0gICAgICogICAgIHJldHVybnMgYnl0ZVtdCi0gICAgICovCi0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lID0gIlJldEJ5dGVBcnJheSIsIGFjdGlvbiA9ICJodHRwOi8vdGVtcHVyaS5vcmcvSUJhc2VEYXRhVHlwZXNEb2NMaXRCL1JldEJ5dGVBcnJheSIpCi0gICAgQFdlYlJlc3VsdChuYW1lID0gIlJldEJ5dGVBcnJheVJlc3VsdCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vdGVtcHVyaS5vcmcvIiwgcGFydE5hbWUgPSAiUmV0Qnl0ZUFycmF5UmVzdWx0IikKLSAgICBwdWJsaWMgYnl0ZVtdIHJldEJ5dGVBcnJheSgKLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiaW5CeXRlQXJyYXkiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3RlbXB1cmkub3JnLyIsIHBhcnROYW1lID0gImluQnl0ZUFycmF5IikKLSAgICAgICAgYnl0ZVtdIGluQnl0ZUFycmF5KTsKLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEBwYXJhbSBpbkNoYXIKLSAgICAgKiBAcmV0dXJuCi0gICAgICogICAgIHJldHVybnMgaW50Ci0gICAgICovCi0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lID0gIlJldENoYXIiLCBhY3Rpb24gPSAiaHR0cDovL3RlbXB1cmkub3JnL0lCYXNlRGF0YVR5cGVzRG9jTGl0Qi9SZXRDaGFyIikKLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAiUmV0Q2hhclJlc3VsdCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vdGVtcHVyaS5vcmcvIiwgcGFydE5hbWUgPSAiUmV0Q2hhclJlc3VsdCIpCi0gICAgcHVibGljIGludCByZXRDaGFyKAotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJpbkNoYXIiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3RlbXB1cmkub3JnLyIsIHBhcnROYW1lID0gImluQ2hhciIpCi0gICAgICAgIGludCBpbkNoYXIpOwotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHBhcmFtIGluRGVjaW1hbAotICAgICAqIEByZXR1cm4KLSAgICAgKiAgICAgcmV0dXJucyBqYXZhLm1hdGguQmlnRGVjaW1hbAotICAgICAqLwotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJSZXREZWNpbWFsIiwgYWN0aW9uID0gImh0dHA6Ly90ZW1wdXJpLm9yZy9JQmFzZURhdGFUeXBlc0RvY0xpdEIvUmV0RGVjaW1hbCIpCi0gICAgQFdlYlJlc3VsdChuYW1lID0gIlJldERlY2ltYWxSZXN1bHQiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3RlbXB1cmkub3JnLyIsIHBhcnROYW1lID0gIlJldERlY2ltYWxSZXN1bHQiKQotICAgIHB1YmxpYyBCaWdEZWNpbWFsIHJldERlY2ltYWwoCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImluRGVjaW1hbCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vdGVtcHVyaS5vcmcvIiwgcGFydE5hbWUgPSAiaW5EZWNpbWFsIikKLSAgICAgICAgQmlnRGVjaW1hbCBpbkRlY2ltYWwpOwotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHBhcmFtIGluRmxvYXQKLSAgICAgKiBAcmV0dXJuCi0gICAgICogICAgIHJldHVybnMgZmxvYXQKLSAgICAgKi8KLSAgICBAV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWUgPSAiUmV0RmxvYXQiLCBhY3Rpb24gPSAiaHR0cDovL3RlbXB1cmkub3JnL0lCYXNlRGF0YVR5cGVzRG9jTGl0Qi9SZXRGbG9hdCIpCi0gICAgQFdlYlJlc3VsdChuYW1lID0gIlJldEZsb2F0UmVzdWx0IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly90ZW1wdXJpLm9yZy8iLCBwYXJ0TmFtZSA9ICJSZXRGbG9hdFJlc3VsdCIpCi0gICAgcHVibGljIGZsb2F0IHJldEZsb2F0KAotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJpbkZsb2F0IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly90ZW1wdXJpLm9yZy8iLCBwYXJ0TmFtZSA9ICJpbkZsb2F0IikKLSAgICAgICAgZmxvYXQgaW5GbG9hdCk7Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW5Eb3VibGUKLSAgICAgKiBAcmV0dXJuCi0gICAgICogICAgIHJldHVybnMgZG91YmxlCi0gICAgICovCi0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lID0gIlJldERvdWJsZSIsIGFjdGlvbiA9ICJodHRwOi8vdGVtcHVyaS5vcmcvSUJhc2VEYXRhVHlwZXNEb2NMaXRCL1JldERvdWJsZSIpCi0gICAgQFdlYlJlc3VsdChuYW1lID0gIlJldERvdWJsZVJlc3VsdCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vdGVtcHVyaS5vcmcvIiwgcGFydE5hbWUgPSAiUmV0RG91YmxlUmVzdWx0IikKLSAgICBwdWJsaWMgZG91YmxlIHJldERvdWJsZSgKLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiaW5Eb3VibGUiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3RlbXB1cmkub3JnLyIsIHBhcnROYW1lID0gImluRG91YmxlIikKLSAgICAgICAgZG91YmxlIGluRG91YmxlKTsKLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEBwYXJhbSBpblNpbmdsZQotICAgICAqIEByZXR1cm4KLSAgICAgKiAgICAgcmV0dXJucyBmbG9hdAotICAgICAqLwotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJSZXRTaW5nbGUiLCBhY3Rpb24gPSAiaHR0cDovL3RlbXB1cmkub3JnL0lCYXNlRGF0YVR5cGVzRG9jTGl0Qi9SZXRTaW5nbGUiKQotICAgIEBXZWJSZXN1bHQobmFtZSA9ICJSZXRTaW5nbGVSZXN1bHQiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3RlbXB1cmkub3JnLyIsIHBhcnROYW1lID0gIlJldFNpbmdsZVJlc3VsdCIpCi0gICAgcHVibGljIGZsb2F0IHJldFNpbmdsZSgKLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiaW5TaW5nbGUiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3RlbXB1cmkub3JnLyIsIHBhcnROYW1lID0gImluU2luZ2xlIikKLSAgICAgICAgZmxvYXQgaW5TaW5nbGUpOwotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHBhcmFtIGluSW50Ci0gICAgICogQHJldHVybgotICAgICAqICAgICByZXR1cm5zIGludAotICAgICAqLwotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJSZXRJbnQiLCBhY3Rpb24gPSAiaHR0cDovL3RlbXB1cmkub3JnL0lCYXNlRGF0YVR5cGVzRG9jTGl0Qi9SZXRJbnQiKQotICAgIEBXZWJSZXN1bHQobmFtZSA9ICJSZXRJbnRSZXN1bHQiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3RlbXB1cmkub3JnLyIsIHBhcnROYW1lID0gIlJldEludFJlc3VsdCIpCi0gICAgcHVibGljIGludCByZXRJbnQoCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImluSW50IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly90ZW1wdXJpLm9yZy8iLCBwYXJ0TmFtZSA9ICJpbkludCIpCi0gICAgICAgIGludCBpbkludCk7Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW5TaG9ydAotICAgICAqIEByZXR1cm4KLSAgICAgKiAgICAgcmV0dXJucyBzaG9ydAotICAgICAqLwotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJSZXRTaG9ydCIsIGFjdGlvbiA9ICJodHRwOi8vdGVtcHVyaS5vcmcvSUJhc2VEYXRhVHlwZXNEb2NMaXRCL1JldFNob3J0IikKLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAiUmV0U2hvcnRSZXN1bHQiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3RlbXB1cmkub3JnLyIsIHBhcnROYW1lID0gIlJldFNob3J0UmVzdWx0IikKLSAgICBwdWJsaWMgc2hvcnQgcmV0U2hvcnQoCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImluU2hvcnQiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3RlbXB1cmkub3JnLyIsIHBhcnROYW1lID0gImluU2hvcnQiKQotICAgICAgICBzaG9ydCBpblNob3J0KTsKLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEBwYXJhbSBpbkxvbmcKLSAgICAgKiBAcmV0dXJuCi0gICAgICogICAgIHJldHVybnMgbG9uZwotICAgICAqLwotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJSZXRMb25nIiwgYWN0aW9uID0gImh0dHA6Ly90ZW1wdXJpLm9yZy9JQmFzZURhdGFUeXBlc0RvY0xpdEIvUmV0TG9uZyIpCi0gICAgQFdlYlJlc3VsdChuYW1lID0gIlJldExvbmdSZXN1bHQiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3RlbXB1cmkub3JnLyIsIHBhcnROYW1lID0gIlJldExvbmdSZXN1bHQiKQotICAgIHB1YmxpYyBsb25nIHJldExvbmcoCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImluTG9uZyIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vdGVtcHVyaS5vcmcvIiwgcGFydE5hbWUgPSAiaW5Mb25nIikKLSAgICAgICAgbG9uZyBpbkxvbmcpOwotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHBhcmFtIGluT2JqZWN0Ci0gICAgICogQHJldHVybgotICAgICAqICAgICByZXR1cm5zIGphdmEubGFuZy5PYmplY3QKLSAgICAgKi8KLSAgICBAV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWUgPSAiUmV0T2JqZWN0IiwgYWN0aW9uID0gImh0dHA6Ly90ZW1wdXJpLm9yZy9JQmFzZURhdGFUeXBlc0RvY0xpdEIvUmV0T2JqZWN0IikKLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAiUmV0T2JqZWN0UmVzdWx0IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly90ZW1wdXJpLm9yZy8iLCBwYXJ0TmFtZSA9ICJSZXRPYmplY3RSZXN1bHQiKQotICAgIHB1YmxpYyBPYmplY3QgcmV0T2JqZWN0KAotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJpbk9iamVjdCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vdGVtcHVyaS5vcmcvIiwgcGFydE5hbWUgPSAiaW5PYmplY3QiKQotICAgICAgICBPYmplY3QgaW5PYmplY3QpOwotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHBhcmFtIGluVUludAotICAgICAqIEByZXR1cm4KLSAgICAgKiAgICAgcmV0dXJucyBsb25nCi0gICAgICovCi0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lID0gIlJldFVJbnQiLCBhY3Rpb24gPSAiaHR0cDovL3RlbXB1cmkub3JnL0lCYXNlRGF0YVR5cGVzRG9jTGl0Qi9SZXRVSW50IikKLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAiUmV0VUludFJlc3VsdCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vdGVtcHVyaS5vcmcvIiwgcGFydE5hbWUgPSAiUmV0VUludFJlc3VsdCIpCi0gICAgcHVibGljIGxvbmcgcmV0VUludCgKLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiaW5VSW50IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly90ZW1wdXJpLm9yZy8iLCBwYXJ0TmFtZSA9ICJpblVJbnQiKQotICAgICAgICBsb25nIGluVUludCk7Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW5VU2hvcnQKLSAgICAgKiBAcmV0dXJuCi0gICAgICogICAgIHJldHVybnMgaW50Ci0gICAgICovCi0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lID0gIlJldFVTaG9ydCIsIGFjdGlvbiA9ICJodHRwOi8vdGVtcHVyaS5vcmcvSUJhc2VEYXRhVHlwZXNEb2NMaXRCL1JldFVTaG9ydCIpCi0gICAgQFdlYlJlc3VsdChuYW1lID0gIlJldFVTaG9ydFJlc3VsdCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vdGVtcHVyaS5vcmcvIiwgcGFydE5hbWUgPSAiUmV0VVNob3J0UmVzdWx0IikKLSAgICBwdWJsaWMgaW50IHJldFVTaG9ydCgKLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiaW5VU2hvcnQiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3RlbXB1cmkub3JnLyIsIHBhcnROYW1lID0gImluVVNob3J0IikKLSAgICAgICAgaW50IGluVVNob3J0KTsKLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEBwYXJhbSBpblVMb25nCi0gICAgICogQHJldHVybgotICAgICAqICAgICByZXR1cm5zIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0gICAgICovCi0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lID0gIlJldFVMb25nIiwgYWN0aW9uID0gImh0dHA6Ly90ZW1wdXJpLm9yZy9JQmFzZURhdGFUeXBlc0RvY0xpdEIvUmV0VUxvbmciKQotICAgIEBXZWJSZXN1bHQobmFtZSA9ICJSZXRVTG9uZ1Jlc3VsdCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vdGVtcHVyaS5vcmcvIiwgcGFydE5hbWUgPSAiUmV0VUxvbmdSZXN1bHQiKQotICAgIHB1YmxpYyBCaWdJbnRlZ2VyIHJldFVMb25nKAotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJpblVMb25nIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly90ZW1wdXJpLm9yZy8iLCBwYXJ0TmFtZSA9ICJpblVMb25nIikKLSAgICAgICAgQmlnSW50ZWdlciBpblVMb25nKTsKLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEBwYXJhbSBpblN0cmluZwotICAgICAqIEByZXR1cm4KLSAgICAgKiAgICAgcmV0dXJucyBqYXZhLmxhbmcuU3RyaW5nCi0gICAgICovCi0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lID0gIlJldFN0cmluZyIsIGFjdGlvbiA9ICJodHRwOi8vdGVtcHVyaS5vcmcvSUJhc2VEYXRhVHlwZXNEb2NMaXRCL1JldFN0cmluZyIpCi0gICAgQFdlYlJlc3VsdChuYW1lID0gIlJldFN0cmluZ1Jlc3VsdCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vdGVtcHVyaS5vcmcvIiwgcGFydE5hbWUgPSAiUmV0U3RyaW5nUmVzdWx0IikKLSAgICBwdWJsaWMgU3RyaW5nIHJldFN0cmluZygKLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiaW5TdHJpbmciLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3RlbXB1cmkub3JnLyIsIHBhcnROYW1lID0gImluU3RyaW5nIikKLSAgICAgICAgU3RyaW5nIGluU3RyaW5nKTsKLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEBwYXJhbSBpbkd1aWQKLSAgICAgKiBAcmV0dXJuCi0gICAgICogICAgIHJldHVybnMgamF2YS5sYW5nLlN0cmluZwotICAgICAqLwotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJSZXRHdWlkIiwgYWN0aW9uID0gImh0dHA6Ly90ZW1wdXJpLm9yZy9JQmFzZURhdGFUeXBlc0RvY0xpdEIvUmV0R3VpZCIpCi0gICAgQFdlYlJlc3VsdChuYW1lID0gIlJldEd1aWRSZXN1bHQiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3RlbXB1cmkub3JnLyIsIHBhcnROYW1lID0gIlJldEd1aWRSZXN1bHQiKQotICAgIHB1YmxpYyBTdHJpbmcgcmV0R3VpZCgKLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiaW5HdWlkIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly90ZW1wdXJpLm9yZy8iLCBwYXJ0TmFtZSA9ICJpbkd1aWQiKQotICAgICAgICBTdHJpbmcgaW5HdWlkKTsKLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEBwYXJhbSBpblVyaQotICAgICAqIEByZXR1cm4KLSAgICAgKiAgICAgcmV0dXJucyBqYXZhLmxhbmcuU3RyaW5nCi0gICAgICovCi0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lID0gIlJldFVyaSIsIGFjdGlvbiA9ICJodHRwOi8vdGVtcHVyaS5vcmcvSUJhc2VEYXRhVHlwZXNEb2NMaXRCL1JldFVyaSIpCi0gICAgQFdlYlJlc3VsdChuYW1lID0gIlJldFVyaVJlc3VsdCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vdGVtcHVyaS5vcmcvIiwgcGFydE5hbWUgPSAiUmV0VXJpUmVzdWx0IikKLSAgICBwdWJsaWMgU3RyaW5nIHJldFVyaSgKLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiaW5VcmkiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3RlbXB1cmkub3JnLyIsIHBhcnROYW1lID0gImluVXJpIikKLSAgICAgICAgU3RyaW5nIGluVXJpKTsKLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEBwYXJhbSBpbkRhdGVUaW1lCi0gICAgICogQHJldHVybgotICAgICAqICAgICByZXR1cm5zIGphdmF4LnhtbC5kYXRhdHlwZS5YTUxHcmVnb3JpYW5DYWxlbmRhcgotICAgICAqLwotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJSZXREYXRlVGltZSIsIGFjdGlvbiA9ICJodHRwOi8vdGVtcHVyaS5vcmcvSUJhc2VEYXRhVHlwZXNEb2NMaXRCL1JldERhdGVUaW1lIikKLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAiUmV0RGF0ZVRpbWVSZXN1bHQiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3RlbXB1cmkub3JnLyIsIHBhcnROYW1lID0gIlJldERhdGVUaW1lUmVzdWx0IikKLSAgICBwdWJsaWMgWE1MR3JlZ29yaWFuQ2FsZW5kYXIgcmV0RGF0ZVRpbWUoCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImluRGF0ZVRpbWUiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3RlbXB1cmkub3JnLyIsIHBhcnROYW1lID0gImluRGF0ZVRpbWUiKQotICAgICAgICBYTUxHcmVnb3JpYW5DYWxlbmRhciBpbkRhdGVUaW1lKTsKLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEBwYXJhbSBpbkRhdGVUaW1lT2Zmc2V0Ci0gICAgICogQHJldHVybgotICAgICAqICAgICByZXR1cm5zIG9yZy5kYXRhY29udHJhY3Quc2NoZW1hcy5fMjAwNC5fMDcuc3lzdGVtLkRhdGVUaW1lT2Zmc2V0Ci0gICAgICovCi0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lID0gIlJldERhdGVUaW1lT2Zmc2V0IiwgYWN0aW9uID0gImh0dHA6Ly90ZW1wdXJpLm9yZy9JQmFzZURhdGFUeXBlc0RvY0xpdEIvUmV0RGF0ZVRpbWVPZmZzZXQiKQotICAgIEBXZWJSZXN1bHQobmFtZSA9ICJSZXREYXRlVGltZU9mZnNldFJlc3VsdCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vdGVtcHVyaS5vcmcvIiwgcGFydE5hbWUgPSAiUmV0RGF0ZVRpbWVPZmZzZXRSZXN1bHQiKQotICAgIHB1YmxpYyBEYXRlVGltZU9mZnNldCByZXREYXRlVGltZU9mZnNldCgKLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiaW5EYXRlVGltZU9mZnNldCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vdGVtcHVyaS5vcmcvIiwgcGFydE5hbWUgPSAiaW5EYXRlVGltZU9mZnNldCIpCi0gICAgICAgIERhdGVUaW1lT2Zmc2V0IGluRGF0ZVRpbWVPZmZzZXQpOwotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHBhcmFtIGluVGltZVNwYW4KLSAgICAgKiBAcmV0dXJuCi0gICAgICogICAgIHJldHVybnMgamF2YXgueG1sLmRhdGF0eXBlLkR1cmF0aW9uCi0gICAgICovCi0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lID0gIlJldFRpbWVTcGFuIiwgYWN0aW9uID0gImh0dHA6Ly90ZW1wdXJpLm9yZy9JQmFzZURhdGFUeXBlc0RvY0xpdEIvUmV0VGltZVNwYW4iKQotICAgIEBXZWJSZXN1bHQobmFtZSA9ICJSZXRUaW1lU3BhblJlc3VsdCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vdGVtcHVyaS5vcmcvIiwgcGFydE5hbWUgPSAiUmV0VGltZVNwYW5SZXN1bHQiKQotICAgIHB1YmxpYyBEdXJhdGlvbiByZXRUaW1lU3BhbigKLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiaW5UaW1lU3BhbiIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vdGVtcHVyaS5vcmcvIiwgcGFydE5hbWUgPSAiaW5UaW1lU3BhbiIpCi0gICAgICAgIER1cmF0aW9uIGluVGltZVNwYW4pOwotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHBhcmFtIGluUU5hbWUKLSAgICAgKiBAcmV0dXJuCi0gICAgICogICAgIHJldHVybnMgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZQotICAgICAqLwotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJSZXRRTmFtZSIsIGFjdGlvbiA9ICJodHRwOi8vdGVtcHVyaS5vcmcvSUJhc2VEYXRhVHlwZXNEb2NMaXRCL1JldFFOYW1lIikKLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAiUmV0UU5hbWVSZXN1bHQiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3RlbXB1cmkub3JnLyIsIHBhcnROYW1lID0gIlJldFFOYW1lUmVzdWx0IikKLSAgICBwdWJsaWMgUU5hbWUgcmV0UU5hbWUoCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImluUU5hbWUiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3RlbXB1cmkub3JnLyIsIHBhcnROYW1lID0gImluUU5hbWUiKQotICAgICAgICBRTmFtZSBpblFOYW1lKTsKLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1pbnRlcm9wL3NyYy9vcmcvdGVtcHVyaS9PYmplY3RGYWN0b3J5LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLWludGVyb3Avc3JjL29yZy90ZW1wdXJpL09iamVjdEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhkMWY5MC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLWludGVyb3Avc3JjL29yZy90ZW1wdXJpL09iamVjdEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxOSArMCwwIEBACi0vKgotKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0qIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0qIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0qIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0qICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0qCi0qIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotKgotKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0qIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0qIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLQotCi1wYWNrYWdlIG9yZy50ZW1wdXJpOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50RGVjbDsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJlZ2lzdHJ5OwotaW1wb3J0IGphdmF4LnhtbC5kYXRhdHlwZS5EdXJhdGlvbjsKLWltcG9ydCBqYXZheC54bWwuZGF0YXR5cGUuWE1MR3JlZ29yaWFuQ2FsZW5kYXI7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBvcmcuZGF0YWNvbnRyYWN0LnNjaGVtYXMuXzIwMDQuXzA3LnN5c3RlbS5EYXRlVGltZU9mZnNldDsKLQotCi0vKioKLSAqIFRoaXMgb2JqZWN0IGNvbnRhaW5zIGZhY3RvcnkgbWV0aG9kcyBmb3IgZWFjaCAKLSAqIEphdmEgY29udGVudCBpbnRlcmZhY2UgYW5kIEphdmEgZWxlbWVudCBpbnRlcmZhY2UgCi0gKiBnZW5lcmF0ZWQgaW4gdGhlIG9yZy50ZW1wdXJpIHBhY2thZ2UuIAotICogPHA+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+IGNyZWF0ZUluRGVjaW1hbChCaWdEZWNpbWFsIHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgSkFYQkVsZW1lbnQ8QmlnRGVjaW1hbD4oX0luRGVjaW1hbF9RTkFNRSwgQmlnRGVjaW1hbC5jbGFzcywgbnVsbCwgdmFsdWUpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL1JFQURNRSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzZjNjMWIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLVRoaXMgZXhhbXBsZSBzaG93cyBob3cgdG8gdXNlIEF4aXMyL0pBWFdTIGluIGEgc2VydmxldCBjb250YWluZXIuIFlvdSBtdXN0IA0KLWhhdmUgTWF2ZW4gMi54IGluc3RhbGxlZCB0byBidWlsZCB0aGlzIGV4YW1wbGUuICBUbyBidWlsZCB0eXBlOg0KLQ0KLSQgbXZuIGluc3RhbGwgd2FyOndhcg0KLQ0KLVJlbmFtZSB0aGUgcmVzdWx0YW50IHdhciBhcyBqYXh3cy1zYW1wbGVzLndhciBhbmQgZHJvcCBpdCBpbnRvIGFueSBzZXJ2bGV0IGVuZ2luZS4gDQotVGhlIFdTREwgZmlsZSBmb3IgdGhlIHNlcnZpY2Ugc2hvdWxkIGJlIHZpZXdhYmxlIGF0Og0KLQ0KLWh0dHA6Ly95b3VyaG9zdDpwb3J0L2pheHdzLXNhbXBsZXMvc2VydmljZXMvRWNob1NlcnZpY2UxMi5FY2hvU2VydmljZTEyUG9ydA0KLWh0dHA6Ly95b3VyaG9zdDpwb3J0L2pheHdzLXNhbXBsZXMvc2VydmljZXMvRWNob1NlcnZpY2UuRWNob1NlcnZpY2VQb3J0DQotaHR0cDovL3lvdXJob3N0OnBvcnQvamF4d3Mtc2FtcGxlcy9zZXJ2aWNlcy9NdG9tU2FtcGxlU2VydmljZTEyLk10b21TYW1wbGVQb3J0DQotaHR0cDovL3lvdXJob3N0OnBvcnQvamF4d3Mtc2FtcGxlcy9zZXJ2aWNlcy9NdG9tU2FtcGxlU2VydmljZS5NdG9tU2FtcGxlUG9ydA0KLWh0dHA6Ly95b3VyaG9zdDpwb3J0L2pheHdzLXNhbXBsZXMvc2VydmljZXMvUGluZ1NlcnZpY2UxMi5QaW5nU2VydmljZTEyUG9ydA0KLWh0dHA6Ly95b3VyaG9zdDpwb3J0L2pheHdzLXNhbXBsZXMvc2VydmljZXMvUGluZ1NlcnZpY2UuUGluZ1NlcnZpY2VQb3J0DQotDQotSGVyZSdzIHRoZSBtYWluIHBhZ2Ugd2l0aCBzb21lIGRlc2NyaXB0aW9uIG9mIHRoZSB0ZXN0czoNCi0NCi1odHRwOi8veW91cmhvc3Q6cG9ydC9qYXh3cy1zYW1wbGVzLw0KLQ0KLVlvdSBjYW4gdXNlIHRoZSBzYW1wbGUganNwIHBhZ2VzIHRvIGRyaXZlL3Rlc3QgdGhlIHdlYiBzZXJ2aWNlIg0KLQ0KLWh0dHA6Ly95b3VyaG9zdDpwb3J0L2pheHdzLXNhbXBsZXMvZGVtb01UT00NCi1odHRwOi8veW91cmhvc3Q6cG9ydC9qYXh3cy1zYW1wbGVzL2RlbW9FY2hvUGluZw0KLQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9wb20ueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxZDIzOTMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyODcgKzAsMCBAQAotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCINCi0gICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPg0KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+DQotICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczIuZXhhbXBsZXM8L2dyb3VwSWQ+DQotICAgIDxhcnRpZmFjdElkPmpheHdzLXNhbXBsZXM8L2FydGlmYWN0SWQ+DQotICAgIDxuYW1lPkpBWFdTIFNhbXBsZXMgLSBFY2hvLCBQaW5nLCBNVE9NPC9uYW1lPg0KLSAgICA8dmVyc2lvbj4xLjQ8L3ZlcnNpb24+DQotDQotICAgIDxkZXBlbmRlbmNpZXM+DQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5zZXJ2bGV0PC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnNlcnZsZXQtYXBpPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjIuMzwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1rZXJuZWw8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS41LjE8L3ZlcnNpb24+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLWpheHdzPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuNS4xPC92ZXJzaW9uPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1jb2RlZ2VuPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuNS4xPC92ZXJzaW9uPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1hZGI8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS41LjE8L3ZlcnNpb24+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmFkZHJlc3Npbmc8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS41LjE8L3ZlcnNpb24+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+DQotICAgICAgICAgICAgPGxheW91dD5sZWdhY3k8L2xheW91dD4NCi0gICAgICAgIDwvcmVwb3NpdG9yeT4NCi0gICAgICAgIDxyZXBvc2l0b3J5Pg0KLSAgICAgICAgICAgIDxpZD5qYXZhLm5ldDwvaWQ+DQotICAgICAgICAgICAgPHVybD5odHRwczovL21hdmVuLXJlcG9zaXRvcnkuZGV2LmphdmEubmV0L25vbmF2L3JlcG9zaXRvcnkvPC91cmw+DQotICAgICAgICAgICAgPGxheW91dD5sZWdhY3k8L2xheW91dD4NCi0gICAgICAgICAgICA8c25hcHNob3RzPg0KLSAgICAgICAgICAgICAgICA8ZW5hYmxlZD5mYWxzZTwvZW5hYmxlZD4NCi0gICAgICAgICAgICA8L3NuYXBzaG90cz4NCi0gICAgICAgICAgICA8cmVsZWFzZXM+DQotICAgICAgICAgICAgICAgIDxlbmFibGVkPnRydWU8L2VuYWJsZWQ+DQotICAgICAgICAgICAgPC9yZWxlYXNlcz4NCi0gICAgICAgIDwvcmVwb3NpdG9yeT4NCi0gICAgPC9yZXBvc2l0b3JpZXM+DQotDQotPC9wcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvbWFpbi9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvY2xpZW50L1NhbXBsZUNsaWVudC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy9tYWluL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9jbGllbnQvU2FtcGxlQ2xpZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0M2Q2YzcuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy9tYWluL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9jbGllbnQvU2FtcGxlQ2xpZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NTQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGVzLmNsaWVudDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlcy5jbGllbnQuZWNoby5FY2hvU2VydmljZTEyUG9ydFByb3h5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlcy5jbGllbnQuZWNoby5FY2hvU2VydmljZUNhbGxiYWNrSGFuZGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZXMuY2xpZW50LmVjaG8uRWNob1NlcnZpY2VQb3J0UHJveHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGVzLmNsaWVudC5waW5nLlBpbmdTZXJ2aWNlMTJQb3J0UHJveHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGVzLmNsaWVudC5waW5nLlBpbmdTZXJ2aWNlUG9ydFByb3h5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlcy5lY2hvLkVjaG9TdHJpbmdJbnB1dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZXMuZWNoby5FY2hvU3RyaW5nUmVzcG9uc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGVzLnBpbmcuT2JqZWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZXMucGluZy5QaW5nU3RyaW5nSW5wdXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5DbGllbnRDb25maWd1cmF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLm1ldGFkYXRhLnJlZ2lzdHJ5Lk1ldGFkYXRhRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC5GaWxlU3lzdGVtQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwud3MuQmluZGluZ1Byb3ZpZGVyOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLS8qKgotICogU2FtcGxlQ2xpZW50Ci0gKiBtYWluIGVudHJ5IHBvaW50IGZvciB0aGluY2xpZW50IGphciBzYW1wbGUKLSAqIGFuZCB3b3JrZXIgY2xhc3MgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgc2VydmljZXMKLSAqLwotcHVibGljIGNsYXNzIFNhbXBsZUNsaWVudCB7Ci0KLSAgICBwcml2YXRlIGludCB0aW1lb3V0ID0gMjQwOyAgICAgICAgICAgICAgICAgLy8gRXJyb3IgdGltZW91dCBpbiBzZWNvbmRzCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNMRUVQRVIgPSAyOyAgICAgLy8gUG9sbCBkZWxheSBmb3IgYXN5bmMKLSAgICBwcml2YXRlIFN0cmluZyB1cmxIb3N0ID0gImxvY2FsaG9zdCI7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgdXJsUG9ydCA9ICI4MDgwIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVYVF9CQVNFID0gIi9qYXh3cy1zYW1wbGVzL3NlcnZpY2VzLyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBJTkdfQ09OVEVYVCA9IENPTlRFWFRfQkFTRSArICJQaW5nU2VydmljZS5QaW5nU2VydmljZVBvcnQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFQ0hPX0NPTlRFWFQgPSBDT05URVhUX0JBU0UgKyAiRWNob1NlcnZpY2UuRWNob1NlcnZpY2VQb3J0IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUElOR19DT05URVhUMTIgPSBDT05URVhUX0JBU0UgKyAiUGluZ1NlcnZpY2UxMi5QaW5nU2VydmljZTEyUG9ydCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVDSE9fQ09OVEVYVDEyID0gQ09OVEVYVF9CQVNFICsgIkVjaG9TZXJ2aWNlMTIuRWNob1NlcnZpY2UxMlBvcnQiOwotICAgIHByaXZhdGUgU3RyaW5nIHVybFN1ZmZpeCA9ICIiOwotICAgIHByaXZhdGUgU3RyaW5nIG1lc3NhZ2UgPSAiSEVMTE8iOwotICAgIHByaXZhdGUgU3RyaW5nIHNlcnZ0eXBlID0gImFzeW5jIjsKLSAgICBwcml2YXRlIFN0cmluZyB1cmlTdHJpbmcgPSAiaHR0cDovLyIgKyB1cmxIb3N0ICsgIjoiICsgdXJsUG9ydDsKLSAgICBwcml2YXRlIEJvb2xlYW4gd2lyZWFzeW5jID0gdHJ1ZTsKLSAgICBwcml2YXRlIEJvb2xlYW4gc29hcDEyID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBpbnQgY291bnQgPSAxOwotICAgIHByaXZhdGUgQ2xpZW50Q29uZmlndXJhdGlvbkZhY3RvcnkgY2xpZW50Q29uZmlndXJhdGlvbkZhY3RvcnkgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogbWFpbigpCi0gICAgICogPHAvPgotICAgICAqIHNlZSBwcmludHVzYWdlKCkgZm9yIGNvbW1hbmQtbGluZSBhcmd1bWVudHMKLSAgICAgKgotICAgICAqIEBwYXJhbSBhcmdzCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotICAgICAgICBTYW1wbGVDbGllbnQgc2FtcGxlID0gbmV3IFNhbXBsZUNsaWVudCgpOwotICAgICAgICBzYW1wbGUucGFyc2VBcmdzKGFyZ3MpOwotICAgICAgICBzYW1wbGUuQ2FsbFNlcnZpY2UoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBwYXJzZUFyZ3MgUmVhZCBhbmQgaW50ZXJwcmV0IHRoZSBjb21tYW5kLWxpbmUgYXJndW1lbnRzCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYXJncwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHBhcnNlQXJncyhTdHJpbmdbXSBhcmdzKSB7Ci0gICAgICAgIGlmIChhcmdzLmxlbmd0aCA+PSAxKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBpZiAoJy0nID09IGFyZ3NbaV0uY2hhckF0KDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFyZ3NbaV0uY2hhckF0KDEpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnPyc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50VXNhZ2UobnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5leGl0KDApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdoJzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdIJzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsSG9zdCA9IGFyZ3NbKytpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAncCc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnUCc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybFBvcnQgPSBhcmdzWysraV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2YnOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0YnOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmxTdWZmaXggPSBhcmdzWysraV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ20nOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ00nOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gYXJnc1srK2ldOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdzJzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdTJzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydnR5cGUgPSBhcmdzWysraV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoIXNlcnZ0eXBlLmVxdWFsc0lnbm9yZUNhc2UoImFzeW5jIikpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCFzZXJ2dHlwZS5lcXVhbHNJZ25vcmVDYXNlKCJlY2hvIikpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCFzZXJ2dHlwZS5lcXVhbHNJZ25vcmVDYXNlKCJwaW5nIikpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcmludGxuKCJFUlJPUjogQXR0ZW1wdCB0byBpbnZva2UgYSBzZXJ2aWNlIHRoYXQgaXMgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRVc2FnZShudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5leGl0KDApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3QnOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1QnOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0ID0gbmV3IEludGVnZXIoYXJnc1srK2ldKS5pbnRWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdjJzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdDJzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQgPSBuZXcgSW50ZWdlcihhcmdzWysraV0pLmludFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3cnOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1cnOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGFybSA9IGFyZ3NbKytpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcm0uZXF1YWxzSWdub3JlQ2FzZSgieSIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXJlYXN5bmMgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lyZWFzeW5jID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnMSc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvYXAxMiA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcyJzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29hcDEyID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRVc2FnZShhcmdzW2ldKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmV4aXQoMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkludmFsaWQgb3B0aW9uIGZvcm1hdC4iKTsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRVc2FnZShudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmV4aXQoMCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHVyaVN0cmluZyA9ICJodHRwOi8vIiArIHVybEhvc3QgKyAiOiIgKyB1cmxQb3J0OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogcHJpbnRVc2FnZSBQcmludCB1c2FnZSBoZWxwIHRvIG91dHB1dAotICAgICAqCi0gICAgICogQHBhcmFtIGludmFsaWRPcHQgLQotICAgICAqICAgICAgICAgICAgICAgICAgIGlmIG5vbi1udWxsLCBpcyB0aGUgaW52YWxpZCBwYXJhbWV0ZXIKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcHJpbnRVc2FnZShTdHJpbmcgaW52YWxpZE9wdCkgewotICAgICAgICBpZiAobnVsbCAhPSBpbnZhbGlkT3B0KSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkludmFsaWQgT3B0aW9uOiAiICsgaW52YWxpZE9wdCk7Ci0gICAgICAgIH0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJVc2FnZToiKTsKLSAgICAgICAgU3lzdGVtLm91dAotICAgICAgICAgICAgICAgIC5wcmludGxuKCIgIHJ1blNhbXBsZVNlaSAtaCBbaG9zdG5hbWVdIC1wIFtwb3J0XSAtZiBbdXJsU3VmZml4XSAtbSBbdGVzdE1lc3NhZ2VdIC1zIFtlY2hvfHBpbmd8YXN5bmNdIC10IFt0aW1lb3V0XSAtdyBbeXxuXSAtYyBbY291bnRdIC0xIC0yIik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRGVmYXVsdCB2YWx1ZXM6Iik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICBob3N0bmFtZSA9IGxvY2FsaG9zdCIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgcG9ydCA9IDgwODAiKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIHRlc3RNZXNzYWdlID0gSEVMTE8iKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIHVybFN1ZmZpeCA9IC9qYXh3cy1zYW1wbGVzL3NlcnZpY2VzL0VjaG9TZXJ2aWNlLkVjaG9TZXJ2aWNlUG9ydCIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgc2VydmljZSA9IGFzeW5jIik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICB0aW1lb3V0ID0gMjQwIChzZWNvbmRzKSIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgd2lyZWFzeW5jID0geSAoeWVzKSIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgY291bnQgPSAxIik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAtMSA9IHNvYXAgMS4xIChkZWZhdWx0KSIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgLTIgPSBzb2FwIDEuMiIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxTZXJ2aWNlIFBhcm1zIHdlcmUgYWxyZWFkeSByZWFkLiBOb3cgY2FsbCB0aGUgc2VydmljZSBwcm94eSBjbGFzc2VzCi0gICAgICovCi0gICAgdm9pZCBDYWxsU2VydmljZSgpIHsKLSAgICAgICAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IGNvdW50OyBpbmRleCsrKSB7Ci0gICAgICAgICAgICBpZiAoc29hcDEyKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNlcnZ0eXBlLmVxdWFsc0lnbm9yZUNhc2UoImVjaG8iKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoMCA9PSB1cmxTdWZmaXgubGVuZ3RoKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVybFN1ZmZpeCA9IEVDSE9fQ09OVEVYVDEyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkRWNobzEyKHVyaVN0cmluZyArIHVybFN1ZmZpeCwgbnVsbCwgbWVzc2FnZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzZXJ2dHlwZS5lcXVhbHNJZ25vcmVDYXNlKCJhc3luYyIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgwID09IHVybFN1ZmZpeC5sZW5ndGgoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdXJsU3VmZml4ID0gRUNIT19DT05URVhUMTI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAoY2xpZW50Q29uZmlndXJhdGlvbkZhY3RvcnkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgQ2xpZW50Q29uZmlndXJhdGlvbkZhY3RvcnkgZmFjdG9yeSA9IGluaXRDb25maWd1cmF0aW9uRmFjdG9yeSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRBc3luYzEyKHVyaVN0cmluZyArIHVybFN1ZmZpeCwgbnVsbCwgbWVzc2FnZSwgdGltZW91dCwgd2lyZWFzeW5jKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Ryb3lDb25maWd1cmF0aW9uRmFjdG9yeShmYWN0b3J5KTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkQXN5bmMxMih1cmlTdHJpbmcgKyB1cmxTdWZmaXgsIG51bGwsIG1lc3NhZ2UsIHRpbWVvdXQsIHdpcmVhc3luYyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAoMCA9PSB1cmxTdWZmaXgubGVuZ3RoKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVybFN1ZmZpeCA9IFBJTkdfQ09OVEVYVDEyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkUGluZzEyKHVyaVN0cmluZyArIHVybFN1ZmZpeCwgbnVsbCwgbWVzc2FnZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoc2VydnR5cGUuZXF1YWxzSWdub3JlQ2FzZSgiZWNobyIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgwID09IHVybFN1ZmZpeC5sZW5ndGgoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdXJsU3VmZml4ID0gRUNIT19DT05URVhUOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkRWNobyh1cmlTdHJpbmcgKyB1cmxTdWZmaXgsIG51bGwsIG1lc3NhZ2UpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VydnR5cGUuZXF1YWxzSWdub3JlQ2FzZSgiYXN5bmMiKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoMCA9PSB1cmxTdWZmaXgubGVuZ3RoKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVybFN1ZmZpeCA9IEVDSE9fQ09OVEVYVDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoY2xpZW50Q29uZmlndXJhdGlvbkZhY3RvcnkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgQ2xpZW50Q29uZmlndXJhdGlvbkZhY3RvcnkgZmFjdG9yeSA9IGluaXRDb25maWd1cmF0aW9uRmFjdG9yeSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRBc3luYyh1cmlTdHJpbmcgKyB1cmxTdWZmaXgsIG51bGwsIG1lc3NhZ2UsIHRpbWVvdXQsIHdpcmVhc3luYyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXN0cm95Q29uZmlndXJhdGlvbkZhY3RvcnkoZmFjdG9yeSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBidWlsZEFzeW5jKHVyaVN0cmluZyArIHVybFN1ZmZpeCwgbnVsbCwgbWVzc2FnZSwgdGltZW91dCwgd2lyZWFzeW5jKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgwID09IHVybFN1ZmZpeC5sZW5ndGgoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdXJsU3VmZml4ID0gUElOR19DT05URVhUOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkUGluZyh1cmlTdHJpbmcgKyB1cmxTdWZmaXgsIG51bGwsIG1lc3NhZ2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgQ2xpZW50Q29uZmlndXJhdGlvbkZhY3RvcnkgaW5pdENvbmZpZ3VyYXRpb25GYWN0b3J5KCkgewotICAgICAgICBTdHJpbmcgYXhpczJ4bWwgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29uZmlnLnBhdGgiKTsKLSAgICAgICAgaWYgKGF4aXMyeG1sID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJQbGVhc2Ugc2V0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29uZmlnLnBhdGggc3lzdGVtIHByb3BlcnR5IHRvIGEgdmFsaWQgYXhpczIueG1sIGZpbGUgKHdpdGggYWRkcmVzc2luZyBtb2R1bGUgZW5hYmxlZCkiKTsKLSAgICAgICAgfQotICAgICAgICBDbGllbnRDb25maWd1cmF0aW9uRmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEZpbGVTeXN0ZW1Db25maWd1cmF0b3IgY29uZmlndXJhdG9yID0gbmV3IEZpbGVTeXN0ZW1Db25maWd1cmF0b3IobnVsbCwgYXhpczJ4bWwpOwotICAgICAgICAgICAgZmFjdG9yeSA9IG5ldyBDbGllbnRDb25maWd1cmF0aW9uRmFjdG9yeShjb25maWd1cmF0b3IpOwotICAgICAgICAgICAgTWV0YWRhdGFGYWN0b3J5UmVnaXN0cnkuc2V0RmFjdG9yeShDbGllbnRDb25maWd1cmF0aW9uRmFjdG9yeS5jbGFzcywgZmFjdG9yeSk7Ci0gICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBheGlzRmF1bHQpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGF4aXNGYXVsdCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhY3Rvcnk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGRlc3Ryb3lDb25maWd1cmF0aW9uRmFjdG9yeShDbGllbnRDb25maWd1cmF0aW9uRmFjdG9yeSBmYWN0b3J5KSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmYWN0b3J5LmdldENsaWVudENvbmZpZ3VyYXRpb25Db250ZXh0KCkudGVybWluYXRlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBheGlzRmF1bHQpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGF4aXNGYXVsdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBidWlsZFBpbmcKLSAgICAgKiBDYWxsIHRoZSBwaW5nIHNlcnZpY2UKLSAgICAgKgotICAgICAqIEBwYXJhbSBlbmRwb2ludFVSTCBUaGUgU2VydmljZSBlbmRwb2ludCBVUkwKLSAgICAgKiBAcGFyYW0gaW5wdXQgICAgICAgVGhlIG1lc3NhZ2Ugc3RyaW5nCi0gICAgICogQHJldHVybiBCb29sZWFuIHRydWUgaWYgdGhlIHBpbmcgd29ya3MKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBidWlsZFBpbmcoU3RyaW5nIGVuZHBvaW50VVJMLCBVUkwgd3NkbFVSTCwgU3RyaW5nIGlucHV0KSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBQaW5nU2VydmljZVBvcnRQcm94eSBwaW5nID0gbmV3IFBpbmdTZXJ2aWNlUG9ydFByb3h5KHdzZGxVUkwpOwotICAgICAgICAgICAgcGluZy5fZ2V0RGVzY3JpcHRvcigpLnNldEVuZHBvaW50KGVuZHBvaW50VVJMKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiPj4gQ0xJRU5UOiBTRUkgUGluZyB0byAiICsgZW5kcG9pbnRVUkwpOwotCi0gICAgICAgICAgICAvLyBDb25maWd1cmUgU09BUEFjdGlvbiBwcm9wZXJ0aWVzCi0gICAgICAgICAgICBCaW5kaW5nUHJvdmlkZXIgYnAgPSAoQmluZGluZ1Byb3ZpZGVyKSAocGluZy5fZ2V0RGVzY3JpcHRvcigpCi0gICAgICAgICAgICAgICAgICAgIC5nZXRQcm94eSgpKTsKLSAgICAgICAgICAgIGJwLmdldFJlcXVlc3RDb250ZXh0KCkucHV0KEJpbmRpbmdQcm92aWRlci5FTkRQT0lOVF9BRERSRVNTX1BST1BFUlRZLAotICAgICAgICAgICAgICAgICAgICBlbmRwb2ludFVSTCk7Ci0gICAgICAgICAgICBicC5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dChCaW5kaW5nUHJvdmlkZXIuU09BUEFDVElPTl9VU0VfUFJPUEVSVFksCi0gICAgICAgICAgICAgICAgICAgIEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgICAgICBicC5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dChCaW5kaW5nUHJvdmlkZXIuU09BUEFDVElPTl9VUklfUFJPUEVSVFksCi0gICAgICAgICAgICAgICAgICAgICJwaW5nT3BlcmF0aW9uIik7Ci0KLSAgICAgICAgICAgIC8vIEJ1aWxkIHRoZSBpbnB1dCBvYmplY3QKLSAgICAgICAgICAgIFBpbmdTdHJpbmdJbnB1dCBwaW5nUGFybSA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RGYWN0b3J5KCkuY3JlYXRlUGluZ1N0cmluZ0lucHV0KCk7Ci0gICAgICAgICAgICBwaW5nUGFybS5zZXRQaW5nSW5wdXQoaW5wdXQpOwotCi0gICAgICAgICAgICAvLyBDYWxsIHRoZSBzZXJ2aWNlCi0gICAgICAgICAgICBwaW5nLnBpbmdPcGVyYXRpb24ocGluZ1Bhcm0pOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCI+PiBDTElFTlQ6IFNFSSBQaW5nIFNVQ0NFU1MuIik7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiPj4gQ0xJRU5UOiBFUlJPUjogU0VJIFBpbmcgRVhDRVBUSU9OLiIpOwotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIGJ1aWxkRWNobwotICAgICAqIENhbGwgdGhlIEVjaG8gc2VydmljZSAoU3luYykKLSAgICAgKgotICAgICAqIEBwYXJhbSBlbmRwb2ludFVSTCBUaGUgU2VydmljZSBlbmRwb2ludCBVUkwKLSAgICAgKiBAcGFyYW0gaW5wdXQgICAgICAgVGhlIG1lc3NhZ2Ugc3RyaW5nCi0gICAgICogQHJldHVybiBTdHJpbmcgZnJvbSB0aGUgc2VydmljZQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgYnVpbGRFY2hvKFN0cmluZyBlbmRwb2ludFVSTCwgVVJMIHdzZGxVUkwsIFN0cmluZyBpbnB1dCkgewotICAgICAgICBTdHJpbmcgcmVzcG9uc2UgPSAiRVJST1IhOiI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBFY2hvU2VydmljZVBvcnRQcm94eSBlY2hvID0gbmV3IEVjaG9TZXJ2aWNlUG9ydFByb3h5KHdzZGxVUkwpOwotICAgICAgICAgICAgZWNoby5fZ2V0RGVzY3JpcHRvcigpLnNldEVuZHBvaW50KGVuZHBvaW50VVJMKTsKLQotICAgICAgICAgICAgLy8gQ29uZmlndXJlIFNPQVBBY3Rpb24gcHJvcGVydGllcwotICAgICAgICAgICAgQmluZGluZ1Byb3ZpZGVyIGJwID0gKEJpbmRpbmdQcm92aWRlcikgKGVjaG8uX2dldERlc2NyaXB0b3IoKQotICAgICAgICAgICAgICAgICAgICAuZ2V0UHJveHkoKSk7Ci0gICAgICAgICAgICBicC5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dChCaW5kaW5nUHJvdmlkZXIuRU5EUE9JTlRfQUREUkVTU19QUk9QRVJUWSwKLSAgICAgICAgICAgICAgICAgICAgZW5kcG9pbnRVUkwpOwotICAgICAgICAgICAgYnAuZ2V0UmVxdWVzdENvbnRleHQoKS5wdXQoQmluZGluZ1Byb3ZpZGVyLlNPQVBBQ1RJT05fVVNFX1BST1BFUlRZLAotICAgICAgICAgICAgICAgICAgICBCb29sZWFuLlRSVUUpOwotICAgICAgICAgICAgYnAuZ2V0UmVxdWVzdENvbnRleHQoKS5wdXQoQmluZGluZ1Byb3ZpZGVyLlNPQVBBQ1RJT05fVVJJX1BST1BFUlRZLAotICAgICAgICAgICAgICAgICAgICAiZWNob09wZXJhdGlvbiIpOwotCi0gICAgICAgICAgICAvLyBCdWlsZCB0aGUgaW5wdXQgb2JqZWN0Ci0gICAgICAgICAgICBFY2hvU3RyaW5nSW5wdXQgZWNob1Bhcm0gPQotICAgICAgICAgICAgICAgICAgICBuZXcgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGVzLmVjaG8uT2JqZWN0RmFjdG9yeSgpLmNyZWF0ZUVjaG9TdHJpbmdJbnB1dCgpOwotICAgICAgICAgICAgZWNob1Bhcm0uc2V0RWNob0lucHV0KGlucHV0KTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiPj4gQ0xJRU5UOiBTRUkgRWNobyB0byAiICsgZW5kcG9pbnRVUkwpOwotCi0gICAgICAgICAgICAvLyBDYWxsIHRoZSBzZXJ2aWNlCi0gICAgICAgICAgICByZXNwb25zZSA9IGVjaG8uZWNob09wZXJhdGlvbihlY2hvUGFybSkuZ2V0RWNob1Jlc3BvbnNlKCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIj4+IENMSUVOVDogU0VJIEVjaG8gaW52b2NhdGlvbiBjb21wbGV0ZS4iKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiPj4gQ0xJRU5UOiBTRUkgRWNobyByZXNwb25zZSBpczogIiArIHJlc3BvbnNlKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiPj4gQ0xJRU5UOiBFUlJPUjogU0VJIEVjaG8gRVhDRVBUSU9OLiIpOwotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIHJldHVybiByZXNwb25zZSArICI+Pj5FQ0hPIFNFUlZJQ0UgRVhDRVBUSU9OPDw8ICI7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3BvbnNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGJ1aWxkQXN5bmMKLSAgICAgKiBDYWxsIHRoZSBFY2hvIHNlcnZpY2UgKEFzeW5jKQotICAgICAqCi0gICAgICogQHBhcmFtIGVuZHBvaW50VVJMIFRoZSBTZXJ2aWNlIGVuZHBvaW50IFVSTAotICAgICAqIEBwYXJhbSBpbnB1dCAgICAgICBUaGUgbWVzc2FnZSBzdHJpbmcKLSAgICAgKiBAcGFyYW0gd2FpdGluZyAgICAgVGhlIEFzeW5jIHRpbWVvdXQKLSAgICAgKiBAcGFyYW0gd2lyZWFzeW5jICAgdHJ1ZSB0byB1c2UgQXN5bmMgb24gdGhlIHdpcmUKLSAgICAgKiBAcmV0dXJuIFN0cmluZyBmcm9tIHRoZSBzZXJ2aWNlCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBidWlsZEFzeW5jKFN0cmluZyBlbmRwb2ludFVSTCwgVVJMIHdzZGxVUkwsIFN0cmluZyBpbnB1dCwgaW50IHdhaXRpbmcsIEJvb2xlYW4gd2lyZWFzeW5jKSB7Ci0gICAgICAgIFN0cmluZyByZXNwb25zZSA9ICJFUlJPUiE6IjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEVjaG9TZXJ2aWNlUG9ydFByb3h5IGVjaG8gPSBuZXcgRWNob1NlcnZpY2VQb3J0UHJveHkod3NkbFVSTCk7Ci0gICAgICAgICAgICBlY2hvLl9nZXREZXNjcmlwdG9yKCkuc2V0RW5kcG9pbnQoZW5kcG9pbnRVUkwpOwotCi0gICAgICAgICAgICAvLyBDb25maWd1cmUgU09BUEFjdGlvbiBwcm9wZXJ0aWVzCi0gICAgICAgICAgICBCaW5kaW5nUHJvdmlkZXIgYnAgPSAoQmluZGluZ1Byb3ZpZGVyKSAoZWNoby5fZ2V0RGVzY3JpcHRvcigpCi0gICAgICAgICAgICAgICAgICAgIC5nZXRQcm94eSgpKTsKLSAgICAgICAgICAgIGJwLmdldFJlcXVlc3RDb250ZXh0KCkucHV0KEJpbmRpbmdQcm92aWRlci5FTkRQT0lOVF9BRERSRVNTX1BST1BFUlRZLAotICAgICAgICAgICAgICAgICAgICBlbmRwb2ludFVSTCk7Ci0gICAgICAgICAgICBicC5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dChCaW5kaW5nUHJvdmlkZXIuU09BUEFDVElPTl9VU0VfUFJPUEVSVFksCi0gICAgICAgICAgICAgICAgICAgIEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgICAgICBicC5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dChCaW5kaW5nUHJvdmlkZXIuU09BUEFDVElPTl9VUklfUFJPUEVSVFksCi0gICAgICAgICAgICAgICAgICAgICJlY2hvT3BlcmF0aW9uIik7Ci0gICAgICAgICAgICBpZiAod2lyZWFzeW5jKSB7Ci0gICAgICAgICAgICAgICAgYnAuZ2V0UmVxdWVzdENvbnRleHQoKS5wdXQob3JnLmFwYWNoZS5heGlzMi5qYXh3cy51dGlsLkNvbnN0YW50cy5VU0VfQVNZTkNfTUVQLAotICAgICAgICAgICAgICAgICAgICAgICAgQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gU2V0IHVwIHRoZSBjYWxsYmFjayBoYW5kbGVyIGFuZCBjcmVhdGUgdGhlIGlucHV0IG9iamVjdAotICAgICAgICAgICAgRWNob1NlcnZpY2VDYWxsYmFja0hhbmRsZXIgY2FsbGJhY2tIYW5kbGVyID0gbmV3IEVjaG9TZXJ2aWNlQ2FsbGJhY2tIYW5kbGVyKCk7Ci0gICAgICAgICAgICBFY2hvU3RyaW5nSW5wdXQgZWNob1Bhcm0gPQotICAgICAgICAgICAgICAgICAgICBuZXcgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGVzLmVjaG8uT2JqZWN0RmFjdG9yeSgpLmNyZWF0ZUVjaG9TdHJpbmdJbnB1dCgpOwotICAgICAgICAgICAgZWNob1Bhcm0uc2V0RWNob0lucHV0KGlucHV0KTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiPj4gQ0xJRU5UOiBTRUkgQXN5bmMgdG8gIiArIGVuZHBvaW50VVJMKTsKLQotICAgICAgICAgICAgLy8gQ2FsbCB0aGUgc2VydmljZQotICAgICAgICAgICAgRnV0dXJlPD8+IHJlc3AgPSBlY2hvLmVjaG9PcGVyYXRpb25Bc3luYyhlY2hvUGFybSwgY2FsbGJhY2tIYW5kbGVyKTsKLSAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsKLSAgICAgICAgICAgIHdoaWxlICghcmVzcC5pc0RvbmUoKSkgewotICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciB0aW1lb3V0Ci0gICAgICAgICAgICAgICAgaWYgKHdhaXRpbmcgPD0gMCkgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnByaW50bG4oIj4+IENMSUVOVDogRVJST1IgLSBTRUkgQXN5bmMgVGltZW91dCB3YWl0aW5nIGZvciByZXBseS4iKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlICsgIkFzeW5jIHRpbWVvdXQgd2FpdGluZyBmb3IgcmVwbHkuIjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dAotICAgICAgICAgICAgICAgICAgICAgICAgLnByaW50bG4oIj4+IENMSUVOVDogU0VJIEFzeW5jIGludm9jYXRpb24gc3RpbGwgbm90IGNvbXBsZXRlIik7Ci0gICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDAgKiBTTEVFUEVSKTsKLSAgICAgICAgICAgICAgICB3YWl0aW5nIC09IFNMRUVQRVI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEdldCB0aGUgcmVzcG9uc2UgYW5kIHByaW50IGl0LCB0aGVuIHJldHVybgotICAgICAgICAgICAgRWNob1N0cmluZ1Jlc3BvbnNlIGVzciA9IGNhbGxiYWNrSGFuZGxlci5nZXRSZXNwb25zZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCI+PiBDTElFTlQ6IFNFSSBBc3luYyBpbnZvY2F0aW9uIGNvbXBsZXRlLiIpOwotICAgICAgICAgICAgaWYgKG51bGwgIT0gZXNyKSB7Ci0gICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBlc3IuZ2V0RWNob1Jlc3BvbnNlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKG51bGwgIT0gcmVzcG9uc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCI+PiBDTElFTlQ6IFNFSSBBc3luYyByZXNwb25zZSBpczogIiArIHJlc3BvbnNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIj4+IENMSUVOVDogRVJST1I6IFNFSSBBc3luYyBFWENFUFRJT04uIik7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlICsgIj4+PkFTWU5DIFNFUlZJQ0UgRVhDRVBUSU9OPDw8IjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzcG9uc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogYnVpbGRQaW5nMTIKLSAgICAgKiBDYWxsIHRoZSBwaW5nIHNlcnZpY2UKLSAgICAgKgotICAgICAqIEBwYXJhbSBlbmRwb2ludFVSTCBUaGUgU2VydmljZSBlbmRwb2ludCBVUkwKLSAgICAgKiBAcGFyYW0gaW5wdXQgICAgICAgVGhlIG1lc3NhZ2Ugc3RyaW5nCi0gICAgICogQHJldHVybiBCb29sZWFuIHRydWUgaWYgdGhlIHBpbmcgd29ya3MKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBidWlsZFBpbmcxMihTdHJpbmcgZW5kcG9pbnRVUkwsIFVSTCB3c2RsVVJMLCBTdHJpbmcgaW5wdXQpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFBpbmdTZXJ2aWNlMTJQb3J0UHJveHkgcGluZyA9IG5ldyBQaW5nU2VydmljZTEyUG9ydFByb3h5KHdzZGxVUkwpOwotICAgICAgICAgICAgcGluZy5fZ2V0RGVzY3JpcHRvcigpLnNldEVuZHBvaW50KGVuZHBvaW50VVJMKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiPj4gQ0xJRU5UOiBTRUkgUGluZyB0byAiICsgZW5kcG9pbnRVUkwpOwotCi0gICAgICAgICAgICAvLyBCdWlsZCB0aGUgaW5wdXQgb2JqZWN0Ci0gICAgICAgICAgICBQaW5nU3RyaW5nSW5wdXQgcGluZ1Bhcm0gPQotICAgICAgICAgICAgICAgICAgICBuZXcgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGVzLnBpbmcuT2JqZWN0RmFjdG9yeSgpLmNyZWF0ZVBpbmdTdHJpbmdJbnB1dCgpOwotICAgICAgICAgICAgcGluZ1Bhcm0uc2V0UGluZ0lucHV0KGlucHV0KTsKLQotICAgICAgICAgICAgLy8gQ2FsbCB0aGUgc2VydmljZQotICAgICAgICAgICAgcGluZy5waW5nT3BlcmF0aW9uKHBpbmdQYXJtKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiPj4gQ0xJRU5UOiBTRUkgUGluZyBTVUNDRVNTLiIpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIj4+IENMSUVOVDogRVJST1I6IFNFSSBQaW5nIEVYQ0VQVElPTi4iKTsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBidWlsZEVjaG8xMgotICAgICAqIENhbGwgdGhlIEVjaG8gc2VydmljZSAoU3luYykKLSAgICAgKgotICAgICAqIEBwYXJhbSBlbmRwb2ludFVSTCBUaGUgU2VydmljZSBlbmRwb2ludCBVUkwKLSAgICAgKiBAcGFyYW0gaW5wdXQgICAgICAgVGhlIG1lc3NhZ2Ugc3RyaW5nCi0gICAgICogQHJldHVybiBTdHJpbmcgZnJvbSB0aGUgc2VydmljZQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgYnVpbGRFY2hvMTIoU3RyaW5nIGVuZHBvaW50VVJMLCBVUkwgd3NkbFVSTCwgU3RyaW5nIGlucHV0KSB7Ci0gICAgICAgIFN0cmluZyByZXNwb25zZSA9ICJFUlJPUiE6IjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEVjaG9TZXJ2aWNlMTJQb3J0UHJveHkgZWNobyA9IG5ldyBFY2hvU2VydmljZTEyUG9ydFByb3h5KHdzZGxVUkwpOwotICAgICAgICAgICAgZWNoby5fZ2V0RGVzY3JpcHRvcigpLnNldEVuZHBvaW50KGVuZHBvaW50VVJMKTsKLQotICAgICAgICAgICAgLy8gQnVpbGQgdGhlIGlucHV0IG9iamVjdAotICAgICAgICAgICAgRWNob1N0cmluZ0lucHV0IGVjaG9QYXJtID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlcy5lY2hvLk9iamVjdEZhY3RvcnkoKS5jcmVhdGVFY2hvU3RyaW5nSW5wdXQoKTsKLSAgICAgICAgICAgIGVjaG9QYXJtLnNldEVjaG9JbnB1dChpbnB1dCk7Ci0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiPj4gQ0xJRU5UOiBTRUkgRWNobyB0byAiICsgZW5kcG9pbnRVUkwpOwotCi0gICAgICAgICAgICAvLyBDYWxsIHRoZSBzZXJ2aWNlCi0gICAgICAgICAgICByZXNwb25zZSA9IGVjaG8uZWNob09wZXJhdGlvbihlY2hvUGFybSkuZ2V0RWNob1Jlc3BvbnNlKCk7Ci0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiPj4gQ0xJRU5UOiBTRUkgRWNobyBpbnZvY2F0aW9uIGNvbXBsZXRlLiIpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCI+PiBDTElFTlQ6IFNFSSBFY2hvIHJlc3BvbnNlIGlzOiAiICsgcmVzcG9uc2UpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCI+PiBDTElFTlQ6IEVSUk9SOiBTRUkgRWNobyBFWENFUFRJT04uIik7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlICsgIj4+PkVDSE8gU0VSVklDRSBFWENFUFRJT048PDwgIjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzcG9uc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogYnVpbGRBc3luYzEyCi0gICAgICogQ2FsbCB0aGUgRWNobyBzZXJ2aWNlIChBc3luYykKLSAgICAgKgotICAgICAqIEBwYXJhbSBlbmRwb2ludFVSTCBUaGUgU2VydmljZSBlbmRwb2ludCBVUkwKLSAgICAgKiBAcGFyYW0gaW5wdXQgICAgICAgVGhlIG1lc3NhZ2Ugc3RyaW5nCi0gICAgICogQHBhcmFtIHdhaXRpbmcgICAgIFRoZSBBc3luYyB0aW1lb3V0Ci0gICAgICogQHBhcmFtIHdpcmVhc3luYyAgIHRydWUgdG8gdXNlIEFzeW5jIG9uIHRoZSB3aXJlCi0gICAgICogQHJldHVybiBTdHJpbmcgZnJvbSB0aGUgc2VydmljZQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgYnVpbGRBc3luYzEyKFN0cmluZyBlbmRwb2ludFVSTCwgVVJMIHdzZGxVUkwsIFN0cmluZyBpbnB1dCwgaW50IHdhaXRpbmcsIEJvb2xlYW4gd2lyZWFzeW5jKSB7Ci0gICAgICAgIFN0cmluZyByZXNwb25zZSA9ICJFUlJPUiE6IjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEVjaG9TZXJ2aWNlMTJQb3J0UHJveHkgZWNobyA9IG5ldyBFY2hvU2VydmljZTEyUG9ydFByb3h5KHdzZGxVUkwpOwotICAgICAgICAgICAgZWNoby5fZ2V0RGVzY3JpcHRvcigpLnNldEVuZHBvaW50KGVuZHBvaW50VVJMKTsKLQotICAgICAgICAgICAgLy8gQ29uZmlndXJlIG92ZXItdGhlLXdpcmUgYXN5bmMgaWYgc3BlY2lmaWVkCi0gICAgICAgICAgICBpZiAod2lyZWFzeW5jKSB7Ci0gICAgICAgICAgICAgICAgQmluZGluZ1Byb3ZpZGVyIGJwID0gKEJpbmRpbmdQcm92aWRlcikgKGVjaG8uX2dldERlc2NyaXB0b3IoKQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldFByb3h5KCkpOwotICAgICAgICAgICAgICAgIGJwLmdldFJlcXVlc3RDb250ZXh0KCkucHV0KG9yZy5hcGFjaGUuYXhpczIuamF4d3MudXRpbC5Db25zdGFudHMuVVNFX0FTWU5DX01FUCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFNldCB1cCB0aGUgY2FsbGJhY2sgaGFuZGxlciBhbmQgY3JlYXRlIHRoZSBpbnB1dCBvYmplY3QKLSAgICAgICAgICAgIEVjaG9TZXJ2aWNlQ2FsbGJhY2tIYW5kbGVyIGNhbGxiYWNrSGFuZGxlciA9IG5ldyBFY2hvU2VydmljZUNhbGxiYWNrSGFuZGxlcigpOwotICAgICAgICAgICAgRWNob1N0cmluZ0lucHV0IGVjaG9QYXJtID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlcy5lY2hvLk9iamVjdEZhY3RvcnkoKS5jcmVhdGVFY2hvU3RyaW5nSW5wdXQoKTsKLSAgICAgICAgICAgIGVjaG9QYXJtLnNldEVjaG9JbnB1dChpbnB1dCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIj4+IENMSUVOVDogU0VJIEFzeW5jIHRvICIgKyBlbmRwb2ludFVSTCk7Ci0KLSAgICAgICAgICAgIC8vIENhbGwgdGhlIHNlcnZpY2UKLSAgICAgICAgICAgIEZ1dHVyZTw/PiByZXNwID0gZWNoby5lY2hvT3BlcmF0aW9uQXN5bmMoZWNob1Bhcm0sIGNhbGxiYWNrSGFuZGxlcik7Ci0gICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7Ci0gICAgICAgICAgICB3aGlsZSAoIXJlc3AuaXNEb25lKCkpIHsKLSAgICAgICAgICAgICAgICAvLyBDaGVjayBmb3IgdGltZW91dAotICAgICAgICAgICAgICAgIGlmICh3YWl0aW5nIDw9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcmludGxuKCI+PiBDTElFTlQ6IEVSUk9SIC0gU0VJIEFzeW5jIFRpbWVvdXQgd2FpdGluZyBmb3IgcmVwbHkuIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZSArICJBc3luYyB0aW1lb3V0IHdhaXRpbmcgZm9yIHJlcGx5LiI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQKLSAgICAgICAgICAgICAgICAgICAgICAgIC5wcmludGxuKCI+PiBDTElFTlQ6IFNFSSBBc3luYyBpbnZvY2F0aW9uIHN0aWxsIG5vdCBjb21wbGV0ZSIpOwotICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwICogU0xFRVBFUik7Ci0gICAgICAgICAgICAgICAgd2FpdGluZyAtPSBTTEVFUEVSOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBHZXQgdGhlIHJlc3BvbnNlIGFuZCBwcmludCBpdCwgdGhlbiByZXR1cm4KLSAgICAgICAgICAgIEVjaG9TdHJpbmdSZXNwb25zZSBlc3IgPSBjYWxsYmFja0hhbmRsZXIuZ2V0UmVzcG9uc2UoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiPj4gQ0xJRU5UOiBTRUkgQXN5bmMgaW52b2NhdGlvbiBjb21wbGV0ZS4iKTsKLSAgICAgICAgICAgIGlmIChudWxsICE9IGVzcikgewotICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gZXNyLmdldEVjaG9SZXNwb25zZSgpOwotICAgICAgICAgICAgICAgIGlmIChudWxsICE9IHJlc3BvbnNlKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiPj4gQ0xJRU5UOiBTRUkgQXN5bmMgcmVzcG9uc2UgaXM6ICIgKyByZXNwb25zZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIj4+IENMSUVOVDogRVJST1I6IFNFSSBBc3luYyBFWENFUFRJT04uIik7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlICsgIj4+PkFTWU5DIFNFUlZJQ0UgRVhDRVBUSU9OPDw8IjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzcG9uc2U7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q2xpZW50Q29uZmlndXJhdGlvbkZhY3RvcnkoQ2xpZW50Q29uZmlndXJhdGlvbkZhY3RvcnkgY2xpZW50Q29uZmlndXJhdGlvbkZhY3RvcnkpIHsKLSAgICAgICAgdGhpcy5jbGllbnRDb25maWd1cmF0aW9uRmFjdG9yeSA9IGNsaWVudENvbmZpZ3VyYXRpb25GYWN0b3J5OwotICAgIH0KLX0KLQkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL21haW4vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL2NsaWVudC9lY2hvL0VjaG9TZXJ2aWNlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL21haW4vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL2NsaWVudC9lY2hvL0VjaG9TZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1YzE1ZTEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy9tYWluL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9jbGllbnQvZWNoby9FY2hvU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGVzLmNsaWVudC5lY2hvOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViRW5kcG9pbnQ7Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VDbGllbnQ7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotCi1AV2ViU2VydmljZUNsaWVudChuYW1lID0gIkVjaG9TZXJ2aWNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvZWNoby8iLCB3c2RsTG9jYXRpb24gPSAiV0VCLUlORi93c2RsL0VjaG8ud3NkbCIpCi1wdWJsaWMgY2xhc3MgRWNob1NlcnZpY2UKLSAgICAgICAgZXh0ZW5kcyBTZXJ2aWNlIHsKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFVSTCBFQ0hPU0VSVklDRV9XU0RMX0xPQ0FUSU9OOwotCi0gICAgc3RhdGljIHsKLSAgICAgICAgVVJMIHVybCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB1cmwgPSBuZXcgVVJMKCJmaWxlOi9XRUItSU5GL3dzZGwvRWNoby53c2RsIik7Ci0gICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgICAgIEVDSE9TRVJWSUNFX1dTRExfTE9DQVRJT04gPSB1cmw7Ci0gICAgfQotCi0gICAgcHVibGljIEVjaG9TZXJ2aWNlKFVSTCB3c2RsTG9jYXRpb24sIFFOYW1lIHNlcnZpY2VOYW1lKSB7Ci0gICAgICAgIHN1cGVyKHdzZGxMb2NhdGlvbiwgc2VydmljZU5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBFY2hvU2VydmljZSgpIHsKLSAgICAgICAgc3VwZXIoRUNIT1NFUlZJQ0VfV1NETF9MT0NBVElPTiwgbmV3IFFOYW1lKCJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL2VjaG8vIiwgIkVjaG9TZXJ2aWNlIikpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gcmV0dXJucyBFY2hvU2VydmljZVBvcnRUeXBlCi0gICAgICovCi0gICAgQFdlYkVuZHBvaW50KG5hbWUgPSAiRWNob1NlcnZpY2VQb3J0IikKLSAgICBwdWJsaWMgRWNob1NlcnZpY2VQb3J0VHlwZUNsaWVudCBnZXRFY2hvU2VydmljZVBvcnQoKSB7Ci0gICAgICAgIHJldHVybiAoRWNob1NlcnZpY2VQb3J0VHlwZUNsaWVudCkgc3VwZXIuZ2V0UG9ydChuZXcgUU5hbWUoImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvZWNoby8iLCAiRWNob1NlcnZpY2VQb3J0IiksIEVjaG9TZXJ2aWNlUG9ydFR5cGVDbGllbnQuY2xhc3MpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy9tYWluL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9jbGllbnQvZWNoby9FY2hvU2VydmljZTEyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL21haW4vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL2NsaWVudC9lY2hvL0VjaG9TZXJ2aWNlMTIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RlOWY0ZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL21haW4vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL2NsaWVudC9lY2hvL0VjaG9TZXJ2aWNlMTIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlcy5jbGllbnQuZWNobzsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYkVuZHBvaW50OwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlQ2xpZW50OwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLQotQFdlYlNlcnZpY2VDbGllbnQobmFtZSA9ICJFY2hvU2VydmljZTEyIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvZWNoby8iLCB3c2RsTG9jYXRpb24gPSAiV0VCLUlORi93c2RsL0VjaG8xMi53c2RsIikKLXB1YmxpYyBjbGFzcyBFY2hvU2VydmljZTEyCi0gICAgICAgIGV4dGVuZHMgU2VydmljZSB7Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBVUkwgRUNIT1NFUlZJQ0UxMl9XU0RMX0xPQ0FUSU9OOwotCi0gICAgc3RhdGljIHsKLSAgICAgICAgVVJMIHVybCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB1cmwgPSBuZXcgVVJMKCJmaWxlOi9XRUItSU5GL3dzZGwvRWNobzEyLndzZGwiKTsKLSAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgRUNIT1NFUlZJQ0UxMl9XU0RMX0xPQ0FUSU9OID0gdXJsOwotICAgIH0KLQotICAgIHB1YmxpYyBFY2hvU2VydmljZTEyKFVSTCB3c2RsTG9jYXRpb24sIFFOYW1lIHNlcnZpY2VOYW1lKSB7Ci0gICAgICAgIHN1cGVyKHdzZGxMb2NhdGlvbiwgc2VydmljZU5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBFY2hvU2VydmljZTEyKCkgewotICAgICAgICBzdXBlcihFQ0hPU0VSVklDRTEyX1dTRExfTE9DQVRJT04sIG5ldyBRTmFtZSgiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9lY2hvLyIsICJFY2hvU2VydmljZTEyIikpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gcmV0dXJucyBFY2hvU2VydmljZTEyUG9ydFR5cGUKLSAgICAgKi8KLSAgICBAV2ViRW5kcG9pbnQobmFtZSA9ICJFY2hvU2VydmljZTEyUG9ydCIpCi0gICAgcHVibGljIEVjaG9TZXJ2aWNlMTJQb3J0VHlwZUNsaWVudCBnZXRFY2hvU2VydmljZTEyUG9ydCgpIHsKLSAgICAgICAgcmV0dXJuIChFY2hvU2VydmljZTEyUG9ydFR5cGVDbGllbnQpIHN1cGVyLmdldFBvcnQobmV3IFFOYW1lKCJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL2VjaG8vIiwgIkVjaG9TZXJ2aWNlMTJQb3J0IiksIEVjaG9TZXJ2aWNlMTJQb3J0VHlwZUNsaWVudC5jbGFzcyk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL21haW4vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL2NsaWVudC9lY2hvL0VjaG9TZXJ2aWNlMTJQb3J0UHJveHkuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvbWFpbi9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvY2xpZW50L2VjaG8vRWNob1NlcnZpY2UxMlBvcnRQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWJiZjc5Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvbWFpbi9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvY2xpZW50L2VjaG8vRWNob1NlcnZpY2UxMlBvcnRQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlcy5jbGllbnQuZWNobzsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlcy5lY2hvLkVjaG9TdHJpbmdJbnB1dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZXMuZWNoby5FY2hvU3RyaW5nUmVzcG9uc2U7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC53cy5Bc3luY0hhbmRsZXI7Ci1pbXBvcnQgamF2YXgueG1sLndzLkJpbmRpbmdQcm92aWRlcjsKLWltcG9ydCBqYXZheC54bWwud3MuRGlzcGF0Y2g7Ci1pbXBvcnQgamF2YXgueG1sLndzLlJlc3BvbnNlOwotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU7Ci0KLXB1YmxpYyBjbGFzcyBFY2hvU2VydmljZTEyUG9ydFByb3h5IHsKLQotICAgIHByb3RlY3RlZCBEZXNjcmlwdG9yIF9kZXNjcmlwdG9yOwotCi0gICAgcHVibGljIGNsYXNzIERlc2NyaXB0b3IgewotICAgICAgICBwcml2YXRlIEVjaG9TZXJ2aWNlMTIgX3NlcnZpY2UgPSBudWxsOwotICAgICAgICBwcml2YXRlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlcy5jbGllbnQuZWNoby5FY2hvU2VydmljZTEyUG9ydFR5cGVDbGllbnQgX3Byb3h5ID0gbnVsbDsKLSAgICAgICAgcHJpdmF0ZSBEaXNwYXRjaDxTb3VyY2U+IF9kaXNwYXRjaCA9IG51bGw7Ci0KLSAgICAgICAgcHVibGljIERlc2NyaXB0b3IoKSB7Ci0gICAgICAgICAgICBfc2VydmljZSA9IG5ldyBFY2hvU2VydmljZTEyKCk7Ci0gICAgICAgICAgICBpbml0Q29tbW9uKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgRGVzY3JpcHRvcihVUkwgd3NkbExvY2F0aW9uLCBRTmFtZSBzZXJ2aWNlTmFtZSkgewotICAgICAgICAgICAgX3NlcnZpY2UgPSBuZXcgRWNob1NlcnZpY2UxMih3c2RsTG9jYXRpb24sIHNlcnZpY2VOYW1lKTsKLSAgICAgICAgICAgIGluaXRDb21tb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBpbml0Q29tbW9uKCkgewotICAgICAgICAgICAgX3Byb3h5ID0gX3NlcnZpY2UuZ2V0RWNob1NlcnZpY2UxMlBvcnQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZXMuY2xpZW50LmVjaG8uRWNob1NlcnZpY2UxMlBvcnRUeXBlQ2xpZW50IGdldFByb3h5KCkgewotICAgICAgICAgICAgcmV0dXJuIF9wcm94eTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBEaXNwYXRjaDxTb3VyY2U+IGdldERpc3BhdGNoKCkgewotICAgICAgICAgICAgaWYgKF9kaXNwYXRjaCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgUU5hbWUgcG9ydFFOYW1lID0gbmV3IFFOYW1lKCJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL2VjaG8vIiwgIkVjaG9TZXJ2aWNlMTJQb3J0Iik7Ci0gICAgICAgICAgICAgICAgX2Rpc3BhdGNoID0gX3NlcnZpY2UuY3JlYXRlRGlzcGF0Y2gocG9ydFFOYW1lLCBTb3VyY2UuY2xhc3MsIFNlcnZpY2UuTW9kZS5QQVlMT0FEKTsKLQotICAgICAgICAgICAgICAgIFN0cmluZyBwcm94eUVuZHBvaW50VXJsID0gZ2V0RW5kcG9pbnQoKTsKLSAgICAgICAgICAgICAgICBCaW5kaW5nUHJvdmlkZXIgYnAgPSAoQmluZGluZ1Byb3ZpZGVyKSBfZGlzcGF0Y2g7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGRpc3BhdGNoRW5kcG9pbnRVcmwgPSAoU3RyaW5nKSBicC5nZXRSZXF1ZXN0Q29udGV4dCgpLmdldChCaW5kaW5nUHJvdmlkZXIuRU5EUE9JTlRfQUREUkVTU19QUk9QRVJUWSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFkaXNwYXRjaEVuZHBvaW50VXJsLmVxdWFscyhwcm94eUVuZHBvaW50VXJsKSkKLSAgICAgICAgICAgICAgICAgICAgYnAuZ2V0UmVxdWVzdENvbnRleHQoKS5wdXQoQmluZGluZ1Byb3ZpZGVyLkVORFBPSU5UX0FERFJFU1NfUFJPUEVSVFksIHByb3h5RW5kcG9pbnRVcmwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIF9kaXNwYXRjaDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RW5kcG9pbnQoKSB7Ci0gICAgICAgICAgICBCaW5kaW5nUHJvdmlkZXIgYnAgPSAoQmluZGluZ1Byb3ZpZGVyKSBfcHJveHk7Ci0gICAgICAgICAgICByZXR1cm4gKFN0cmluZykgYnAuZ2V0UmVxdWVzdENvbnRleHQoKS5nZXQoQmluZGluZ1Byb3ZpZGVyLkVORFBPSU5UX0FERFJFU1NfUFJPUEVSVFkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0RW5kcG9pbnQoU3RyaW5nIGVuZHBvaW50VXJsKSB7Ci0gICAgICAgICAgICBCaW5kaW5nUHJvdmlkZXIgYnAgPSAoQmluZGluZ1Byb3ZpZGVyKSBfcHJveHk7Ci0gICAgICAgICAgICBicC5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dChCaW5kaW5nUHJvdmlkZXIuRU5EUE9JTlRfQUREUkVTU19QUk9QRVJUWSwgZW5kcG9pbnRVcmwpOwotCi0gICAgICAgICAgICBpZiAoX2Rpc3BhdGNoICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBicCA9IChCaW5kaW5nUHJvdmlkZXIpIF9kaXNwYXRjaDsKLSAgICAgICAgICAgICAgICBicC5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dChCaW5kaW5nUHJvdmlkZXIuRU5EUE9JTlRfQUREUkVTU19QUk9QRVJUWSwgZW5kcG9pbnRVcmwpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIEVjaG9TZXJ2aWNlMTJQb3J0UHJveHkoKSB7Ci0gICAgICAgIF9kZXNjcmlwdG9yID0gbmV3IERlc2NyaXB0b3IoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRWNob1NlcnZpY2UxMlBvcnRQcm94eShVUkwgd3NkbExvY2F0aW9uKSB7Ci0gICAgICAgIF9kZXNjcmlwdG9yID0gbmV3IERlc2NyaXB0b3Iod3NkbExvY2F0aW9uLCBuZXcgUU5hbWUoImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvZWNoby8iLCAiRWNob1NlcnZpY2UxMiIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRWNob1NlcnZpY2UxMlBvcnRQcm94eShVUkwgd3NkbExvY2F0aW9uLCBRTmFtZSBzZXJ2aWNlTmFtZSkgewotICAgICAgICBfZGVzY3JpcHRvciA9IG5ldyBEZXNjcmlwdG9yKHdzZGxMb2NhdGlvbiwgc2VydmljZU5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBEZXNjcmlwdG9yIF9nZXREZXNjcmlwdG9yKCkgewotICAgICAgICByZXR1cm4gX2Rlc2NyaXB0b3I7Ci0gICAgfQotCi0gICAgcHVibGljIFJlc3BvbnNlPEVjaG9TdHJpbmdSZXNwb25zZT4gZWNob09wZXJhdGlvbkFzeW5jKEVjaG9TdHJpbmdJbnB1dCBwYXJhbWV0ZXIpIHsKLSAgICAgICAgcmV0dXJuIF9nZXREZXNjcmlwdG9yKCkuZ2V0UHJveHkoKS5lY2hvT3BlcmF0aW9uQXN5bmMocGFyYW1ldGVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRnV0dXJlPD8+IGVjaG9PcGVyYXRpb25Bc3luYyhFY2hvU3RyaW5nSW5wdXQgcGFyYW1ldGVyLCBBc3luY0hhbmRsZXI8RWNob1N0cmluZ1Jlc3BvbnNlPiBhc3luY0hhbmRsZXIpIHsKLSAgICAgICAgcmV0dXJuIF9nZXREZXNjcmlwdG9yKCkuZ2V0UHJveHkoKS5lY2hvT3BlcmF0aW9uQXN5bmMocGFyYW1ldGVyLCBhc3luY0hhbmRsZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyBFY2hvU3RyaW5nUmVzcG9uc2UgZWNob09wZXJhdGlvbihFY2hvU3RyaW5nSW5wdXQgcGFyYW1ldGVyKSB7Ci0gICAgICAgIHJldHVybiBfZ2V0RGVzY3JpcHRvcigpLmdldFByb3h5KCkuZWNob09wZXJhdGlvbihwYXJhbWV0ZXIpOwotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvbWFpbi9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvY2xpZW50L2VjaG8vRWNob1NlcnZpY2UxMlBvcnRUeXBlQ2xpZW50LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL21haW4vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL2NsaWVudC9lY2hvL0VjaG9TZXJ2aWNlMTJQb3J0VHlwZUNsaWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDJlNzVjLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvbWFpbi9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvY2xpZW50L2VjaG8vRWNob1NlcnZpY2UxMlBvcnRUeXBlQ2xpZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZXMuY2xpZW50LmVjaG87Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZXMuZWNoby5FY2hvU3RyaW5nSW5wdXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGVzLmVjaG8uRWNob1N0cmluZ1Jlc3BvbnNlOwotCi1pbXBvcnQgamF2YXguandzLldlYk1ldGhvZDsKLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW07Ci1pbXBvcnQgamF2YXguandzLldlYlJlc3VsdDsKLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZzsKLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5QYXJhbWV0ZXJTdHlsZTsKLWltcG9ydCBqYXZheC54bWwud3MuQXN5bmNIYW5kbGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5SZXNwb25zZTsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU7Ci0KLQotQFdlYlNlcnZpY2UobmFtZSA9ICJFY2hvU2VydmljZTEyUG9ydFR5cGUiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9lY2hvLyIpCi1AU09BUEJpbmRpbmcocGFyYW1ldGVyU3R5bGUgPSBQYXJhbWV0ZXJTdHlsZS5CQVJFKQotcHVibGljIGludGVyZmFjZSBFY2hvU2VydmljZTEyUG9ydFR5cGVDbGllbnQgewotCi0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gcGFyYW1ldGVyCi0gICAgICogQHJldHVybiByZXR1cm5zIGphdmF4LnhtbC53cy5SZXNwb25zZTxvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZXMuY2xpZW50LmVjaG8uRWNob1N0cmluZ1Jlc3BvbnNlPgotICAgICAqLwotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJlY2hvT3BlcmF0aW9uIiwgYWN0aW9uID0gImVjaG9PcGVyYXRpb24iKQotICAgIHB1YmxpYyBSZXNwb25zZTxFY2hvU3RyaW5nUmVzcG9uc2U+IGVjaG9PcGVyYXRpb25Bc3luYygKLSAgICAgICAgICAgIEBXZWJQYXJhbShuYW1lID0gImVjaG9TdHJpbmdJbnB1dCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL2VjaG8vIiwgcGFydE5hbWUgPSAicGFyYW1ldGVyIikKLSAgICAgICAgICAgIEVjaG9TdHJpbmdJbnB1dCBwYXJhbWV0ZXIpOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGFzeW5jSGFuZGxlcgotICAgICAqIEBwYXJhbSBwYXJhbWV0ZXIKLSAgICAgKiBAcmV0dXJuIHJldHVybnMgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlPD8gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0PgotICAgICAqLwotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJlY2hvT3BlcmF0aW9uIiwgYWN0aW9uID0gImVjaG9PcGVyYXRpb24iKQotICAgIHB1YmxpYyBGdXR1cmU8Pz4gZWNob09wZXJhdGlvbkFzeW5jKAotICAgICAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiZWNob1N0cmluZ0lucHV0IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvZWNoby8iLCBwYXJ0TmFtZSA9ICJwYXJhbWV0ZXIiKQotICAgICAgICAgICAgRWNob1N0cmluZ0lucHV0IHBhcmFtZXRlciwKLSAgICAgICAgICAgIEBXZWJQYXJhbShuYW1lID0gImVjaG9PcGVyYXRpb25SZXNwb25zZSIsIHRhcmdldE5hbWVzcGFjZSA9ICIiLCBwYXJ0TmFtZSA9ICJhc3luY0hhbmRsZXIiKQotICAgICAgICAgICAgQXN5bmNIYW5kbGVyPEVjaG9TdHJpbmdSZXNwb25zZT4gYXN5bmNIYW5kbGVyKTsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBwYXJhbWV0ZXIKLSAgICAgKiBAcmV0dXJuIHJldHVybnMgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGVzLmNsaWVudC5lY2hvLkVjaG9TdHJpbmdSZXNwb25zZQotICAgICAqLwotICAgIEBXZWJNZXRob2QoYWN0aW9uID0gImVjaG9PcGVyYXRpb24iKQotICAgIEBXZWJSZXN1bHQobmFtZSA9ICJlY2hvU3RyaW5nUmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9lY2hvLyIsIHBhcnROYW1lID0gInBhcmFtZXRlciIpCi0gICAgcHVibGljIEVjaG9TdHJpbmdSZXNwb25zZSBlY2hvT3BlcmF0aW9uKAotICAgICAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiZWNob1N0cmluZ0lucHV0IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvZWNoby8iLCBwYXJ0TmFtZSA9ICJwYXJhbWV0ZXIiKQotICAgICAgICAgICAgRWNob1N0cmluZ0lucHV0IHBhcmFtZXRlcik7Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvbWFpbi9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvY2xpZW50L2VjaG8vRWNob1NlcnZpY2VDYWxsYmFja0hhbmRsZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvbWFpbi9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvY2xpZW50L2VjaG8vRWNob1NlcnZpY2VDYWxsYmFja0hhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNhMzY3OC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL21haW4vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL2NsaWVudC9lY2hvL0VjaG9TZXJ2aWNlQ2FsbGJhY2tIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZXMuY2xpZW50LmVjaG87Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZXMuZWNoby5FY2hvU3RyaW5nUmVzcG9uc2U7Ci0KLWltcG9ydCBqYXZheC54bWwud3MuQXN5bmNIYW5kbGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5SZXNwb25zZTsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRpb25FeGNlcHRpb247Ci0KLQotcHVibGljIGNsYXNzIEVjaG9TZXJ2aWNlQ2FsbGJhY2tIYW5kbGVyIGltcGxlbWVudHMgQXN5bmNIYW5kbGVyPEVjaG9TdHJpbmdSZXNwb25zZT4gewotCi0gICAgcHJpdmF0ZSBFY2hvU3RyaW5nUmVzcG9uc2Ugb3V0cHV0OwotCi0gICAgLyoKLSAgICAqCi0gICAgKiBAc2VlIGphdmF4LnhtbC53cy5Bc3luY0hhbmRsZXIjaGFuZGxlUmVzcG9uc2UoamF2YXgueG1sLndzLlJlc3BvbnNlKQotICAgICovCi0gICAgcHVibGljIHZvaWQgaGFuZGxlUmVzcG9uc2UoUmVzcG9uc2U8RWNob1N0cmluZ1Jlc3BvbnNlPiByZXNwb25zZSkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgb3V0cHV0ID0gcmVzcG9uc2UuZ2V0KCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIj4+IENMSUVOVDogQ29ubmVjdGlvbiBFeGNlcHRpb24iKTsKLSAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCI+PiBDTElFTlQ6IEludGVycnVwdGVkIEV4Y2VwdGlvbiIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIEVjaG9TdHJpbmdSZXNwb25zZSBnZXRSZXNwb25zZSgpIHsKLSAgICAgICAgcmV0dXJuIG91dHB1dDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL21haW4vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL2NsaWVudC9lY2hvL0VjaG9TZXJ2aWNlUG9ydFByb3h5LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL21haW4vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL2NsaWVudC9lY2hvL0VjaG9TZXJ2aWNlUG9ydFByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmMjQ0NTQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy9tYWluL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9jbGllbnQvZWNoby9FY2hvU2VydmljZVBvcnRQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlcy5jbGllbnQuZWNobzsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlcy5lY2hvLkVjaG9TdHJpbmdJbnB1dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZXMuZWNoby5FY2hvU3RyaW5nUmVzcG9uc2U7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC53cy5Bc3luY0hhbmRsZXI7Ci1pbXBvcnQgamF2YXgueG1sLndzLkJpbmRpbmdQcm92aWRlcjsKLWltcG9ydCBqYXZheC54bWwud3MuRGlzcGF0Y2g7Ci1pbXBvcnQgamF2YXgueG1sLndzLlJlc3BvbnNlOwotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU7Ci0KLXB1YmxpYyBjbGFzcyBFY2hvU2VydmljZVBvcnRQcm94eSB7Ci0KLSAgICBwcm90ZWN0ZWQgRGVzY3JpcHRvciBfZGVzY3JpcHRvcjsKLQotICAgIHB1YmxpYyBjbGFzcyBEZXNjcmlwdG9yIHsKLSAgICAgICAgcHJpdmF0ZSBFY2hvU2VydmljZSBfc2VydmljZSA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGVzLmNsaWVudC5lY2hvLkVjaG9TZXJ2aWNlUG9ydFR5cGVDbGllbnQgX3Byb3h5ID0gbnVsbDsKLSAgICAgICAgcHJpdmF0ZSBEaXNwYXRjaDxTb3VyY2U+IF9kaXNwYXRjaCA9IG51bGw7Ci0KLSAgICAgICAgcHVibGljIERlc2NyaXB0b3IoKSB7Ci0gICAgICAgICAgICBfc2VydmljZSA9IG5ldyBFY2hvU2VydmljZSgpOwotICAgICAgICAgICAgaW5pdENvbW1vbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIERlc2NyaXB0b3IoVVJMIHdzZGxMb2NhdGlvbiwgUU5hbWUgc2VydmljZU5hbWUpIHsKLSAgICAgICAgICAgIF9zZXJ2aWNlID0gbmV3IEVjaG9TZXJ2aWNlKHdzZGxMb2NhdGlvbiwgc2VydmljZU5hbWUpOwotICAgICAgICAgICAgaW5pdENvbW1vbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGluaXRDb21tb24oKSB7Ci0gICAgICAgICAgICBfcHJveHkgPSBfc2VydmljZS5nZXRFY2hvU2VydmljZVBvcnQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZXMuY2xpZW50LmVjaG8uRWNob1NlcnZpY2VQb3J0VHlwZUNsaWVudCBnZXRQcm94eSgpIHsKLSAgICAgICAgICAgIHJldHVybiBfcHJveHk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgRGlzcGF0Y2g8U291cmNlPiBnZXREaXNwYXRjaCgpIHsKLSAgICAgICAgICAgIGlmIChfZGlzcGF0Y2ggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFFOYW1lIHBvcnRRTmFtZSA9IG5ldyBRTmFtZSgiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9lY2hvLyIsICJFY2hvU2VydmljZVBvcnQiKTsKLSAgICAgICAgICAgICAgICBfZGlzcGF0Y2ggPSBfc2VydmljZS5jcmVhdGVEaXNwYXRjaChwb3J0UU5hbWUsIFNvdXJjZS5jbGFzcywgU2VydmljZS5Nb2RlLlBBWUxPQUQpOwotCi0gICAgICAgICAgICAgICAgU3RyaW5nIHByb3h5RW5kcG9pbnRVcmwgPSBnZXRFbmRwb2ludCgpOwotICAgICAgICAgICAgICAgIEJpbmRpbmdQcm92aWRlciBicCA9IChCaW5kaW5nUHJvdmlkZXIpIF9kaXNwYXRjaDsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZGlzcGF0Y2hFbmRwb2ludFVybCA9IChTdHJpbmcpIGJwLmdldFJlcXVlc3RDb250ZXh0KCkuZ2V0KEJpbmRpbmdQcm92aWRlci5FTkRQT0lOVF9BRERSRVNTX1BST1BFUlRZKTsKLSAgICAgICAgICAgICAgICBpZiAoIWRpc3BhdGNoRW5kcG9pbnRVcmwuZXF1YWxzKHByb3h5RW5kcG9pbnRVcmwpKQotICAgICAgICAgICAgICAgICAgICBicC5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dChCaW5kaW5nUHJvdmlkZXIuRU5EUE9JTlRfQUREUkVTU19QUk9QRVJUWSwgcHJveHlFbmRwb2ludFVybCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gX2Rpc3BhdGNoOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRFbmRwb2ludCgpIHsKLSAgICAgICAgICAgIEJpbmRpbmdQcm92aWRlciBicCA9IChCaW5kaW5nUHJvdmlkZXIpIF9wcm94eTsKLSAgICAgICAgICAgIHJldHVybiAoU3RyaW5nKSBicC5nZXRSZXF1ZXN0Q29udGV4dCgpLmdldChCaW5kaW5nUHJvdmlkZXIuRU5EUE9JTlRfQUREUkVTU19QUk9QRVJUWSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRFbmRwb2ludChTdHJpbmcgZW5kcG9pbnRVcmwpIHsKLSAgICAgICAgICAgIEJpbmRpbmdQcm92aWRlciBicCA9IChCaW5kaW5nUHJvdmlkZXIpIF9wcm94eTsKLSAgICAgICAgICAgIGJwLmdldFJlcXVlc3RDb250ZXh0KCkucHV0KEJpbmRpbmdQcm92aWRlci5FTkRQT0lOVF9BRERSRVNTX1BST1BFUlRZLCBlbmRwb2ludFVybCk7Ci0KLSAgICAgICAgICAgIGlmIChfZGlzcGF0Y2ggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGJwID0gKEJpbmRpbmdQcm92aWRlcikgX2Rpc3BhdGNoOwotICAgICAgICAgICAgICAgIGJwLmdldFJlcXVlc3RDb250ZXh0KCkucHV0KEJpbmRpbmdQcm92aWRlci5FTkRQT0lOVF9BRERSRVNTX1BST1BFUlRZLCBlbmRwb2ludFVybCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgRWNob1NlcnZpY2VQb3J0UHJveHkoKSB7Ci0gICAgICAgIF9kZXNjcmlwdG9yID0gbmV3IERlc2NyaXB0b3IoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRWNob1NlcnZpY2VQb3J0UHJveHkoVVJMIHdzZGxMb2NhdGlvbikgewotICAgICAgICBfZGVzY3JpcHRvciA9IG5ldyBEZXNjcmlwdG9yKHdzZGxMb2NhdGlvbiwgbmV3IFFOYW1lKCJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL2VjaG8vIiwgIkVjaG9TZXJ2aWNlIikpOwotICAgIH0KLQotICAgIHB1YmxpYyBFY2hvU2VydmljZVBvcnRQcm94eShVUkwgd3NkbExvY2F0aW9uLCBRTmFtZSBzZXJ2aWNlTmFtZSkgewotICAgICAgICBfZGVzY3JpcHRvciA9IG5ldyBEZXNjcmlwdG9yKHdzZGxMb2NhdGlvbiwgc2VydmljZU5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBEZXNjcmlwdG9yIF9nZXREZXNjcmlwdG9yKCkgewotICAgICAgICByZXR1cm4gX2Rlc2NyaXB0b3I7Ci0gICAgfQotCi0gICAgcHVibGljIFJlc3BvbnNlPEVjaG9TdHJpbmdSZXNwb25zZT4gZWNob09wZXJhdGlvbkFzeW5jKEVjaG9TdHJpbmdJbnB1dCBwYXJhbWV0ZXIpIHsKLSAgICAgICAgcmV0dXJuIF9nZXREZXNjcmlwdG9yKCkuZ2V0UHJveHkoKS5lY2hvT3BlcmF0aW9uQXN5bmMocGFyYW1ldGVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRnV0dXJlPD8+IGVjaG9PcGVyYXRpb25Bc3luYyhFY2hvU3RyaW5nSW5wdXQgcGFyYW1ldGVyLCBBc3luY0hhbmRsZXI8RWNob1N0cmluZ1Jlc3BvbnNlPiBhc3luY0hhbmRsZXIpIHsKLSAgICAgICAgcmV0dXJuIF9nZXREZXNjcmlwdG9yKCkuZ2V0UHJveHkoKS5lY2hvT3BlcmF0aW9uQXN5bmMocGFyYW1ldGVyLCBhc3luY0hhbmRsZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyBFY2hvU3RyaW5nUmVzcG9uc2UgZWNob09wZXJhdGlvbihFY2hvU3RyaW5nSW5wdXQgcGFyYW1ldGVyKSB7Ci0gICAgICAgIHJldHVybiBfZ2V0RGVzY3JpcHRvcigpLmdldFByb3h5KCkuZWNob09wZXJhdGlvbihwYXJhbWV0ZXIpOwotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvbWFpbi9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvY2xpZW50L2VjaG8vRWNob1NlcnZpY2VQb3J0VHlwZUNsaWVudC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy9tYWluL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9jbGllbnQvZWNoby9FY2hvU2VydmljZVBvcnRUeXBlQ2xpZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmMTI2ZDYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy9tYWluL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9jbGllbnQvZWNoby9FY2hvU2VydmljZVBvcnRUeXBlQ2xpZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZXMuY2xpZW50LmVjaG87Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZXMuZWNoby5FY2hvU3RyaW5nSW5wdXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGVzLmVjaG8uRWNob1N0cmluZ1Jlc3BvbnNlOwotCi1pbXBvcnQgamF2YXguandzLldlYk1ldGhvZDsKLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW07Ci1pbXBvcnQgamF2YXguandzLldlYlJlc3VsdDsKLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZzsKLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5QYXJhbWV0ZXJTdHlsZTsKLWltcG9ydCBqYXZheC54bWwud3MuQXN5bmNIYW5kbGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5SZXNwb25zZTsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU7Ci0KLQotQFdlYlNlcnZpY2UobmFtZSA9ICJFY2hvU2VydmljZVBvcnRUeXBlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvZWNoby8iKQotQFNPQVBCaW5kaW5nKHBhcmFtZXRlclN0eWxlID0gUGFyYW1ldGVyU3R5bGUuQkFSRSkKLXB1YmxpYyBpbnRlcmZhY2UgRWNob1NlcnZpY2VQb3J0VHlwZUNsaWVudCB7Ci0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBwYXJhbWV0ZXIKLSAgICAgKiBAcmV0dXJuIHJldHVybnMgamF2YXgueG1sLndzLlJlc3BvbnNlPG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlcy5jbGllbnQuZWNoby5FY2hvU3RyaW5nUmVzcG9uc2U+Ci0gICAgICovCi0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lID0gImVjaG9PcGVyYXRpb24iLCBhY3Rpb24gPSAiZWNob09wZXJhdGlvbiIpCi0gICAgcHVibGljIFJlc3BvbnNlPEVjaG9TdHJpbmdSZXNwb25zZT4gZWNob09wZXJhdGlvbkFzeW5jKAotICAgICAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiZWNob1N0cmluZ0lucHV0IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvZWNoby8iLCBwYXJ0TmFtZSA9ICJwYXJhbWV0ZXIiKQotICAgICAgICAgICAgRWNob1N0cmluZ0lucHV0IHBhcmFtZXRlcik7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gYXN5bmNIYW5kbGVyCi0gICAgICogQHBhcmFtIHBhcmFtZXRlcgotICAgICAqIEByZXR1cm4gcmV0dXJucyBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU8PyBleHRlbmRzIGphdmEubGFuZy5PYmplY3Q+Ci0gICAgICovCi0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lID0gImVjaG9PcGVyYXRpb24iLCBhY3Rpb24gPSAiZWNob09wZXJhdGlvbiIpCi0gICAgcHVibGljIEZ1dHVyZTw/PiBlY2hvT3BlcmF0aW9uQXN5bmMoCi0gICAgICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJlY2hvU3RyaW5nSW5wdXQiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9lY2hvLyIsIHBhcnROYW1lID0gInBhcmFtZXRlciIpCi0gICAgICAgICAgICBFY2hvU3RyaW5nSW5wdXQgcGFyYW1ldGVyLAotICAgICAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiZWNob09wZXJhdGlvblJlc3BvbnNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIsIHBhcnROYW1lID0gImFzeW5jSGFuZGxlciIpCi0gICAgICAgICAgICBBc3luY0hhbmRsZXI8RWNob1N0cmluZ1Jlc3BvbnNlPiBhc3luY0hhbmRsZXIpOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHBhcmFtZXRlcgotICAgICAqIEByZXR1cm4gcmV0dXJucyBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZXMuY2xpZW50LmVjaG8uRWNob1N0cmluZ1Jlc3BvbnNlCi0gICAgICovCi0gICAgQFdlYk1ldGhvZChhY3Rpb24gPSAiZWNob09wZXJhdGlvbiIpCi0gICAgQFdlYlJlc3VsdChuYW1lID0gImVjaG9TdHJpbmdSZXNwb25zZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL2VjaG8vIiwgcGFydE5hbWUgPSAicGFyYW1ldGVyIikKLSAgICBwdWJsaWMgRWNob1N0cmluZ1Jlc3BvbnNlIGVjaG9PcGVyYXRpb24oCi0gICAgICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJlY2hvU3RyaW5nSW5wdXQiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9lY2hvLyIsIHBhcnROYW1lID0gInBhcmFtZXRlciIpCi0gICAgICAgICAgICBFY2hvU3RyaW5nSW5wdXQgcGFyYW1ldGVyKTsKLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy9tYWluL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9jbGllbnQvbXRvbS9NdG9tU2FtcGxlMTJQb3J0UHJveHkuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvbWFpbi9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvY2xpZW50L210b20vTXRvbVNhbXBsZTEyUG9ydFByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2YzgzM2YuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy9tYWluL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9jbGllbnQvbXRvbS9NdG9tU2FtcGxlMTJQb3J0UHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlcy5jbGllbnQubXRvbTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlcy5tdG9tLkltYWdlRGVwb3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGVzLm10b20uTXRvbVNhbXBsZTEyOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwud3MuQmluZGluZ1Byb3ZpZGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5EaXNwYXRjaDsKLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLXB1YmxpYyBjbGFzcyBNdG9tU2FtcGxlMTJQb3J0UHJveHkgewotCi0gICAgcHJvdGVjdGVkIERlc2NyaXB0b3IgX2Rlc2NyaXB0b3I7Ci0KLSAgICBwdWJsaWMgY2xhc3MgRGVzY3JpcHRvciB7Ci0gICAgICAgIHByaXZhdGUgTXRvbVNhbXBsZVNlcnZpY2UxMiBfc2VydmljZSA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgTXRvbVNhbXBsZTEyIF9wcm94eSA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgRGlzcGF0Y2g8U291cmNlPiBfZGlzcGF0Y2ggPSBudWxsOwotCi0gICAgICAgIHB1YmxpYyBEZXNjcmlwdG9yKCkgewotICAgICAgICAgICAgX3NlcnZpY2UgPSBuZXcgTXRvbVNhbXBsZVNlcnZpY2UxMigpOwotICAgICAgICAgICAgaW5pdENvbW1vbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIERlc2NyaXB0b3IoVVJMIHdzZGxMb2NhdGlvbiwgUU5hbWUgc2VydmljZU5hbWUpIHsKLSAgICAgICAgICAgIF9zZXJ2aWNlID0gbmV3IE10b21TYW1wbGVTZXJ2aWNlMTIod3NkbExvY2F0aW9uLCBzZXJ2aWNlTmFtZSk7Ci0gICAgICAgICAgICBpbml0Q29tbW9uKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgaW5pdENvbW1vbigpIHsKLSAgICAgICAgICAgIF9wcm94eSA9IF9zZXJ2aWNlLmdldE10b21TYW1wbGVQb3J0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgTXRvbVNhbXBsZTEyIGdldFByb3h5KCkgewotICAgICAgICAgICAgcmV0dXJuIF9wcm94eTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBEaXNwYXRjaDxTb3VyY2U+IGdldERpc3BhdGNoKCkgewotICAgICAgICAgICAgaWYgKF9kaXNwYXRjaCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgUU5hbWUgcG9ydFFOYW1lID0gbmV3IFFOYW1lKCJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL210b20vIiwgIk10b21TYW1wbGVQb3J0Iik7Ci0gICAgICAgICAgICAgICAgX2Rpc3BhdGNoID0gX3NlcnZpY2UuY3JlYXRlRGlzcGF0Y2gocG9ydFFOYW1lLCBTb3VyY2UuY2xhc3MsIFNlcnZpY2UuTW9kZS5NRVNTQUdFKTsKLQotICAgICAgICAgICAgICAgIFN0cmluZyBwcm94eUVuZHBvaW50VXJsID0gZ2V0RW5kcG9pbnQoKTsKLSAgICAgICAgICAgICAgICBCaW5kaW5nUHJvdmlkZXIgYnAgPSAoQmluZGluZ1Byb3ZpZGVyKSBfZGlzcGF0Y2g7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGRpc3BhdGNoRW5kcG9pbnRVcmwgPSAoU3RyaW5nKSBicC5nZXRSZXF1ZXN0Q29udGV4dCgpLmdldChCaW5kaW5nUHJvdmlkZXIuRU5EUE9JTlRfQUREUkVTU19QUk9QRVJUWSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFkaXNwYXRjaEVuZHBvaW50VXJsLmVxdWFscyhwcm94eUVuZHBvaW50VXJsKSkKLSAgICAgICAgICAgICAgICAgICAgYnAuZ2V0UmVxdWVzdENvbnRleHQoKS5wdXQoQmluZGluZ1Byb3ZpZGVyLkVORFBPSU5UX0FERFJFU1NfUFJPUEVSVFksIHByb3h5RW5kcG9pbnRVcmwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIF9kaXNwYXRjaDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RW5kcG9pbnQoKSB7Ci0gICAgICAgICAgICBCaW5kaW5nUHJvdmlkZXIgYnAgPSAoQmluZGluZ1Byb3ZpZGVyKSBfcHJveHk7Ci0gICAgICAgICAgICByZXR1cm4gKFN0cmluZykgYnAuZ2V0UmVxdWVzdENvbnRleHQoKS5nZXQoQmluZGluZ1Byb3ZpZGVyLkVORFBPSU5UX0FERFJFU1NfUFJPUEVSVFkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0RW5kcG9pbnQoU3RyaW5nIGVuZHBvaW50VXJsKSB7Ci0gICAgICAgICAgICBCaW5kaW5nUHJvdmlkZXIgYnAgPSAoQmluZGluZ1Byb3ZpZGVyKSBfcHJveHk7Ci0gICAgICAgICAgICBicC5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dChCaW5kaW5nUHJvdmlkZXIuRU5EUE9JTlRfQUREUkVTU19QUk9QRVJUWSwgZW5kcG9pbnRVcmwpOwotCi0gICAgICAgICAgICBpZiAoX2Rpc3BhdGNoICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBicCA9IChCaW5kaW5nUHJvdmlkZXIpIF9kaXNwYXRjaDsKLSAgICAgICAgICAgICAgICBicC5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dChCaW5kaW5nUHJvdmlkZXIuRU5EUE9JTlRfQUREUkVTU19QUk9QRVJUWSwgZW5kcG9pbnRVcmwpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIE10b21TYW1wbGUxMlBvcnRQcm94eSgpIHsKLSAgICAgICAgX2Rlc2NyaXB0b3IgPSBuZXcgRGVzY3JpcHRvcigpOwotICAgIH0KLQotICAgIHB1YmxpYyBNdG9tU2FtcGxlMTJQb3J0UHJveHkoVVJMIHdzZGxMb2NhdGlvbikgewotICAgICAgICBfZGVzY3JpcHRvciA9IG5ldyBEZXNjcmlwdG9yKHdzZGxMb2NhdGlvbiwgbmV3IFFOYW1lKCJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL210b20vIiwgIk10b21TYW1wbGVTZXJ2aWNlMTIiKSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBNdG9tU2FtcGxlMTJQb3J0UHJveHkoVVJMIHdzZGxMb2NhdGlvbiwgUU5hbWUgc2VydmljZU5hbWUpIHsKLSAgICAgICAgX2Rlc2NyaXB0b3IgPSBuZXcgRGVzY3JpcHRvcih3c2RsTG9jYXRpb24sIHNlcnZpY2VOYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRGVzY3JpcHRvciBfZ2V0RGVzY3JpcHRvcigpIHsKLSAgICAgICAgcmV0dXJuIF9kZXNjcmlwdG9yOwotICAgIH0KLQotICAgIHB1YmxpYyBJbWFnZURlcG90IHNlbmRJbWFnZShJbWFnZURlcG90IGlucHV0KSB7Ci0gICAgICAgIHJldHVybiBfZ2V0RGVzY3JpcHRvcigpLmdldFByb3h5KCkuc2VuZEltYWdlKGlucHV0KTsKLSAgICB9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL21haW4vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL2NsaWVudC9tdG9tL010b21TYW1wbGVQb3J0UHJveHkuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvbWFpbi9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvY2xpZW50L210b20vTXRvbVNhbXBsZVBvcnRQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjcxOGMwLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvbWFpbi9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvY2xpZW50L210b20vTXRvbVNhbXBsZVBvcnRQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGVzLmNsaWVudC5tdG9tOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGVzLm10b20uSW1hZ2VEZXBvdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZXMubXRvbS5NdG9tU2FtcGxlOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwud3MuQmluZGluZ1Byb3ZpZGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5EaXNwYXRjaDsKLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLXB1YmxpYyBjbGFzcyBNdG9tU2FtcGxlUG9ydFByb3h5IHsKLQotICAgIHByb3RlY3RlZCBEZXNjcmlwdG9yIF9kZXNjcmlwdG9yOwotCi0gICAgcHVibGljIGNsYXNzIERlc2NyaXB0b3IgewotICAgICAgICBwcml2YXRlIE10b21TYW1wbGVTZXJ2aWNlIF9zZXJ2aWNlID0gbnVsbDsKLSAgICAgICAgcHJpdmF0ZSBNdG9tU2FtcGxlIF9wcm94eSA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgRGlzcGF0Y2g8U291cmNlPiBfZGlzcGF0Y2ggPSBudWxsOwotCi0gICAgICAgIHB1YmxpYyBEZXNjcmlwdG9yKCkgewotICAgICAgICAgICAgX3NlcnZpY2UgPSBuZXcgTXRvbVNhbXBsZVNlcnZpY2UoKTsKLSAgICAgICAgICAgIGluaXRDb21tb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBEZXNjcmlwdG9yKFVSTCB3c2RsTG9jYXRpb24pIHsKLSAgICAgICAgICAgIF9zZXJ2aWNlID0gbmV3IE10b21TYW1wbGVTZXJ2aWNlKHdzZGxMb2NhdGlvbiwgbmV3IFFOYW1lKCJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL210b20vIiwgIk10b21TYW1wbGVTZXJ2aWNlIikpOwotICAgICAgICAgICAgaW5pdENvbW1vbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIERlc2NyaXB0b3IoVVJMIHdzZGxMb2NhdGlvbiwgUU5hbWUgc2VydmljZU5hbWUpIHsKLSAgICAgICAgICAgIF9zZXJ2aWNlID0gbmV3IE10b21TYW1wbGVTZXJ2aWNlKHdzZGxMb2NhdGlvbiwgc2VydmljZU5hbWUpOwotICAgICAgICAgICAgaW5pdENvbW1vbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGluaXRDb21tb24oKSB7Ci0gICAgICAgICAgICBfcHJveHkgPSBfc2VydmljZS5nZXRNdG9tU2FtcGxlUG9ydCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE10b21TYW1wbGUgZ2V0UHJveHkoKSB7Ci0gICAgICAgICAgICByZXR1cm4gX3Byb3h5OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIERpc3BhdGNoPFNvdXJjZT4gZ2V0RGlzcGF0Y2goKSB7Ci0gICAgICAgICAgICBpZiAoX2Rpc3BhdGNoID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBRTmFtZSBwb3J0UU5hbWUgPSBuZXcgUU5hbWUoImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvbXRvbS8iLCAiTXRvbVNhbXBsZVBvcnQiKTsKLSAgICAgICAgICAgICAgICBfZGlzcGF0Y2ggPSBfc2VydmljZS5jcmVhdGVEaXNwYXRjaChwb3J0UU5hbWUsIFNvdXJjZS5jbGFzcywgU2VydmljZS5Nb2RlLk1FU1NBR0UpOwotCi0gICAgICAgICAgICAgICAgU3RyaW5nIHByb3h5RW5kcG9pbnRVcmwgPSBnZXRFbmRwb2ludCgpOwotICAgICAgICAgICAgICAgIEJpbmRpbmdQcm92aWRlciBicCA9IChCaW5kaW5nUHJvdmlkZXIpIF9kaXNwYXRjaDsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZGlzcGF0Y2hFbmRwb2ludFVybCA9IChTdHJpbmcpIGJwLmdldFJlcXVlc3RDb250ZXh0KCkuZ2V0KEJpbmRpbmdQcm92aWRlci5FTkRQT0lOVF9BRERSRVNTX1BST1BFUlRZKTsKLSAgICAgICAgICAgICAgICBpZiAoIWRpc3BhdGNoRW5kcG9pbnRVcmwuZXF1YWxzKHByb3h5RW5kcG9pbnRVcmwpKQotICAgICAgICAgICAgICAgICAgICBicC5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dChCaW5kaW5nUHJvdmlkZXIuRU5EUE9JTlRfQUREUkVTU19QUk9QRVJUWSwgcHJveHlFbmRwb2ludFVybCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gX2Rpc3BhdGNoOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRFbmRwb2ludCgpIHsKLSAgICAgICAgICAgIEJpbmRpbmdQcm92aWRlciBicCA9IChCaW5kaW5nUHJvdmlkZXIpIF9wcm94eTsKLSAgICAgICAgICAgIHJldHVybiAoU3RyaW5nKSBicC5nZXRSZXF1ZXN0Q29udGV4dCgpLmdldChCaW5kaW5nUHJvdmlkZXIuRU5EUE9JTlRfQUREUkVTU19QUk9QRVJUWSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRFbmRwb2ludChTdHJpbmcgZW5kcG9pbnRVcmwpIHsKLSAgICAgICAgICAgIEJpbmRpbmdQcm92aWRlciBicCA9IChCaW5kaW5nUHJvdmlkZXIpIF9wcm94eTsKLSAgICAgICAgICAgIGJwLmdldFJlcXVlc3RDb250ZXh0KCkucHV0KEJpbmRpbmdQcm92aWRlci5FTkRQT0lOVF9BRERSRVNTX1BST1BFUlRZLCBlbmRwb2ludFVybCk7Ci0KLSAgICAgICAgICAgIGlmIChfZGlzcGF0Y2ggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGJwID0gKEJpbmRpbmdQcm92aWRlcikgX2Rpc3BhdGNoOwotICAgICAgICAgICAgICAgIGJwLmdldFJlcXVlc3RDb250ZXh0KCkucHV0KEJpbmRpbmdQcm92aWRlci5FTkRQT0lOVF9BRERSRVNTX1BST1BFUlRZLCBlbmRwb2ludFVybCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgTXRvbVNhbXBsZVBvcnRQcm94eSgpIHsKLSAgICAgICAgX2Rlc2NyaXB0b3IgPSBuZXcgRGVzY3JpcHRvcigpOwotICAgIH0KLQotICAgIHB1YmxpYyBNdG9tU2FtcGxlUG9ydFByb3h5KFVSTCB3c2RsTG9jYXRpb24pIHsKLSAgICAgICAgX2Rlc2NyaXB0b3IgPSBuZXcgRGVzY3JpcHRvcih3c2RsTG9jYXRpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyBNdG9tU2FtcGxlUG9ydFByb3h5KFVSTCB3c2RsTG9jYXRpb24sIFFOYW1lIHNlcnZpY2VOYW1lKSB7Ci0gICAgICAgIF9kZXNjcmlwdG9yID0gbmV3IERlc2NyaXB0b3Iod3NkbExvY2F0aW9uLCBzZXJ2aWNlTmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIERlc2NyaXB0b3IgX2dldERlc2NyaXB0b3IoKSB7Ci0gICAgICAgIHJldHVybiBfZGVzY3JpcHRvcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSW1hZ2VEZXBvdCBzZW5kSW1hZ2UoSW1hZ2VEZXBvdCBpbnB1dCkgewotICAgICAgICByZXR1cm4gX2dldERlc2NyaXB0b3IoKS5nZXRQcm94eSgpLnNlbmRJbWFnZShpbnB1dCk7Ci0gICAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy9tYWluL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9jbGllbnQvbXRvbS9NdG9tU2FtcGxlU2VydmljZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy9tYWluL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9jbGllbnQvbXRvbS9NdG9tU2FtcGxlU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTBmODIzLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvbWFpbi9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvY2xpZW50L210b20vTXRvbVNhbXBsZVNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGVzLmNsaWVudC5tdG9tOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGVzLm10b20uTXRvbVNhbXBsZTsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYkVuZHBvaW50OwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlQ2xpZW50OwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLQotQFdlYlNlcnZpY2VDbGllbnQobmFtZSA9ICJNdG9tU2FtcGxlU2VydmljZSIsCi0gICAgICAgIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL210b20vIiwKLSAgICAgICAgd3NkbExvY2F0aW9uID0gIldFQi1JTkYvd3NkbC9JbWFnZURlcG90LndzZGwiKQotcHVibGljIGNsYXNzIE10b21TYW1wbGVTZXJ2aWNlCi0gICAgICAgIGV4dGVuZHMgU2VydmljZSB7Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBVUkwgTVRPTVNBTVBMRVNFUlZJQ0VfV1NETF9MT0NBVElPTjsKLQotICAgIHN0YXRpYyB7Ci0gICAgICAgIFVSTCB1cmwgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgdXJsID0gbmV3IFVSTCgiZmlsZTovV0VCLUlORi93c2RsL0ltYWdlRGVwb3Qud3NkbCIpOwotICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgICAgICBNVE9NU0FNUExFU0VSVklDRV9XU0RMX0xPQ0FUSU9OID0gdXJsOwotICAgIH0KLQotICAgIHB1YmxpYyBNdG9tU2FtcGxlU2VydmljZShVUkwgd3NkbExvY2F0aW9uLCBRTmFtZSBzZXJ2aWNlTmFtZSkgewotICAgICAgICBzdXBlcih3c2RsTG9jYXRpb24sIHNlcnZpY2VOYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTXRvbVNhbXBsZVNlcnZpY2UoKSB7Ci0gICAgICAgIHN1cGVyKE1UT01TQU1QTEVTRVJWSUNFX1dTRExfTE9DQVRJT04sIG5ldyBRTmFtZSgiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9tdG9tLyIsICJNdG9tU2FtcGxlU2VydmljZSIpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHJldHVybnMgTXRvbVNhbXBsZQotICAgICAqLwotICAgIEBXZWJFbmRwb2ludChuYW1lID0gIk10b21TYW1wbGVQb3J0IikKLSAgICBwdWJsaWMgTXRvbVNhbXBsZSBnZXRNdG9tU2FtcGxlUG9ydCgpIHsKLSAgICAgICAgcmV0dXJuIChNdG9tU2FtcGxlKSBzdXBlci5nZXRQb3J0KG5ldyBRTmFtZSgiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9tdG9tLyIsICJNdG9tU2FtcGxlUG9ydCIpLCBNdG9tU2FtcGxlLmNsYXNzKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvbWFpbi9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvY2xpZW50L210b20vTXRvbVNhbXBsZVNlcnZpY2UxMi5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy9tYWluL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9jbGllbnQvbXRvbS9NdG9tU2FtcGxlU2VydmljZTEyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyZDRhNDguLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy9tYWluL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9jbGllbnQvbXRvbS9NdG9tU2FtcGxlU2VydmljZTEyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlcy5jbGllbnQubXRvbTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlcy5tdG9tLk10b21TYW1wbGUxMjsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYkVuZHBvaW50OwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlQ2xpZW50OwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLQotQFdlYlNlcnZpY2VDbGllbnQobmFtZSA9ICJNdG9tU2FtcGxlU2VydmljZTEyIiwKLSAgICAgICAgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvbXRvbS8iLAotICAgICAgICB3c2RsTG9jYXRpb24gPSAiV0VCLUlORi93c2RsL0ltYWdlRGVwb3QxMi53c2RsIikKLXB1YmxpYyBjbGFzcyBNdG9tU2FtcGxlU2VydmljZTEyCi0gICAgICAgIGV4dGVuZHMgU2VydmljZSB7Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBVUkwgTVRPTVNBTVBMRVNFUlZJQ0UxMl9XU0RMX0xPQ0FUSU9OOwotCi0gICAgc3RhdGljIHsKLSAgICAgICAgVVJMIHVybCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB1cmwgPSBuZXcgVVJMKCJmaWxlOi9XRUItSU5GL3dzZGwvSW1hZ2VEZXBvdDEyLndzZGwiKTsKLSAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgTVRPTVNBTVBMRVNFUlZJQ0UxMl9XU0RMX0xPQ0FUSU9OID0gdXJsOwotICAgIH0KLQotICAgIHB1YmxpYyBNdG9tU2FtcGxlU2VydmljZTEyKFVSTCB3c2RsTG9jYXRpb24sIFFOYW1lIHNlcnZpY2VOYW1lKSB7Ci0gICAgICAgIHN1cGVyKHdzZGxMb2NhdGlvbiwgc2VydmljZU5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBNdG9tU2FtcGxlU2VydmljZTEyKCkgewotICAgICAgICBzdXBlcihNVE9NU0FNUExFU0VSVklDRTEyX1dTRExfTE9DQVRJT04sIG5ldyBRTmFtZSgiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9tdG9tLyIsICJNdG9tU2FtcGxlU2VydmljZTEyIikpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gcmV0dXJucyBNdG9tU2FtcGxlMTIKLSAgICAgKi8KLSAgICBAV2ViRW5kcG9pbnQobmFtZSA9ICJNdG9tU2FtcGxlUG9ydCIpCi0gICAgcHVibGljIE10b21TYW1wbGUxMiBnZXRNdG9tU2FtcGxlUG9ydCgpIHsKLSAgICAgICAgcmV0dXJuIChNdG9tU2FtcGxlMTIpIHN1cGVyLmdldFBvcnQobmV3IFFOYW1lKCJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL210b20vIiwgIk10b21TYW1wbGVQb3J0IiksIE10b21TYW1wbGUxMi5jbGFzcyk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL21haW4vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL2NsaWVudC9tdG9tL1NhbXBsZU1UT01UZXN0cy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy9tYWluL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9jbGllbnQvbXRvbS9TYW1wbGVNVE9NVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFjOGU4ZC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL21haW4vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL2NsaWVudC9tdG9tL1NhbXBsZU1UT01UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGVzLmNsaWVudC5tdG9tOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGVzLm10b20uSW1hZ2VEZXBvdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZXMubXRvbS5PYmplY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlcy5tdG9tLlNlbmRJbWFnZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZXMubXRvbS5TZW5kSW1hZ2VSZXNwb25zZTsKLQotaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXI7Ci1pbXBvcnQgamF2YXguYWN0aXZhdGlvbi5GaWxlRGF0YVNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCQ29udGV4dDsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC53cy5CaW5kaW5nUHJvdmlkZXI7Ci1pbXBvcnQgamF2YXgueG1sLndzLkRpc3BhdGNoOwotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlOwotaW1wb3J0IGphdmF4LnhtbC53cy5zb2FwLlNPQVBCaW5kaW5nOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi0vKioKLSAqIEEgc2FtcGxlIGNsaWVudCB0aGF0IHVzZXMgTVRPTSB0byBzZW5kIGFuIGltYWdlIHVzaW5nIGJvdGggdGhlIEpBWC1XUwotICogRGlzcGF0Y2ggYW5kIHRoZSBQcm94eS4KLSAqLwotcHVibGljIGNsYXNzIFNhbXBsZU1UT01UZXN0cyB7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgdXJsSG9zdCA9ICJsb2NhbGhvc3QiOwotICAgIHByaXZhdGUgU3RyaW5nIHVybFBvcnQgPSAiODA4MCI7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgdXJsU3VmZml4ID0gIiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFWFRfQkFTRSA9ICIvamF4d3Mtc2FtcGxlcy9zZXJ2aWNlcy8iOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNVE9NX0NPTlRFWFQxMSA9IENPTlRFWFRfQkFTRSArICJNdG9tU2FtcGxlU2VydmljZS5NdG9tU2FtcGxlUG9ydCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1UT01fQ09OVEVYVDEyID0gQ09OVEVYVF9CQVNFICsgIk10b21TYW1wbGVTZXJ2aWNlMTIuTXRvbVNhbXBsZVBvcnQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FU1BBQ0UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9tdG9tLyI7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgdXJpU3RyaW5nID0gImh0dHA6Ly8iICsgdXJsSG9zdCArICI6IiArIHVybFBvcnQ7Ci0gICAgcHJpdmF0ZSBRTmFtZSBzZXJ2aWNlTmFtZTExID0gbmV3IFFOYW1lKE5BTUVTUEFDRSwgIk10b21TYW1wbGVTZXJ2aWNlIik7Ci0gICAgcHJpdmF0ZSBRTmFtZSBzZXJ2aWNlTmFtZTEyID0gbmV3IFFOYW1lKE5BTUVTUEFDRSwgIk10b21TYW1wbGVTZXJ2aWNlMTIiKTsKLSAgICBwcml2YXRlIFFOYW1lIHBvcnROYW1lRGlzcGF0Y2ggPSBuZXcgUU5hbWUoTkFNRVNQQUNFLCAiTXRvbVNhbXBsZVBvcnREaXNwYXRjaCIpOwotICAgIHByaXZhdGUgRGF0YUhhbmRsZXIgY29udGVudDsKLSAgICBwcml2YXRlIFN0cmluZyBpbWFnZUZpbGVuYW1lID0gIiI7Ci0gICAgcHJpdmF0ZSBCb29sZWFuIHRyeURpc3BhdGNoID0gdHJ1ZTsKLSAgICBwcml2YXRlIEJvb2xlYW4gdHJ5UHJveHkgPSB0cnVlOwotICAgIHByaXZhdGUgQm9vbGVhbiBzb2FwMTIgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIENvbW1hbmQgTGluZSBQcm9ncmFtIEVudHJ5IFBvaW50Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gYXJncyAtIHNlZSBwcmludFVzYWdlIG91dHB1dAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTYW1wbGVNVE9NVGVzdHMgdGVzdHMgPSBuZXcgU2FtcGxlTVRPTVRlc3RzKCk7Ci0gICAgICAgIHRlc3RzLnBhcnNlQXJncyhhcmdzKTsKLSAgICAgICAgaWYgKHRlc3RzLnRyeURpc3BhdGNoKSB7Ci0gICAgICAgICAgICB0ZXN0cy50ZXN0TXRvbVdpdGhEaXNwYXRjaChudWxsKTsKLSAgICAgICAgfQotICAgICAgICBpZiAodGVzdHMudHJ5UHJveHkpIHsKLSAgICAgICAgICAgIHRlc3RzLnRlc3RNdG9tV2l0aFByb3h5KG51bGwsIG51bGwpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVhZCBhbmQgaW50ZXJwcmV0IHRoZSBjb21tYW5kLWxpbmUgYXJndW1lbnRzLgotICAgICAqIFNlZSBwcmludFVzYWdlIG91dHB1dCBmb3Igc3VwcG9ydGVkIHBhcmFtZXRlcnMKLSAgICAgKgotICAgICAqIEBwYXJhbSBhcmdzIFN0cmluZ1tdIEZyb20gdGhlIENvbW1hbmQgTGluZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHBhcnNlQXJncyhTdHJpbmdbXSBhcmdzKSB7Ci0gICAgICAgIC8vIFBhcnNlIHRoZSBhcmd1bWVudHMKLQotICAgICAgICBpZiAoYXJncy5sZW5ndGggPj0gMSkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCctJyA9PSBhcmdzW2ldLmNoYXJBdCgwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhcmdzW2ldLmNoYXJBdCgxKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJz8nOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludFVzYWdlKG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXhpdCgwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZCc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnRCc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeURpc3BhdGNoID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5UHJveHkgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAneCc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnWCc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeURpc3BhdGNoID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeVByb3h5ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnaCc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnSCc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybEhvc3QgPSBhcmdzWysraV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3AnOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1AnOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmxQb3J0ID0gYXJnc1srK2ldOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdmJzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdGJzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsU3VmZml4ID0gYXJnc1srK2ldOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdpJzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdJJzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VGaWxlbmFtZSA9IGFyZ3NbKytpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnMSc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvYXAxMiA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcyJzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29hcDEyID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRVc2FnZShhcmdzW2ldKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmV4aXQoMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkludmFsaWQgb3B0aW9uIGZvcm1hdC4iKTsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRVc2FnZShudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmV4aXQoMCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHVyaVN0cmluZyA9ICJodHRwOi8vIiArIHVybEhvc3QgKyAiOiIgKyB1cmxQb3J0OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gRGlzcGxheSBhIHdhcm5pbmcgaWYgdGhlcmUgaXMgbm8gaW5wdXQgZmlsZW5hbWUKLSAgICAgICAgaWYgKDAgPT0gaW1hZ2VGaWxlbmFtZS5sZW5ndGgoKSkgewotICAgICAgICAgICAgU3lzdGVtLm91dAotICAgICAgICAgICAgICAgICAgICAucHJpbnRsbigiPj4gW1dBUk5JTkd9IC0gTm8gYXR0YWNobWVudCBmaWxlIHNwZWNpZmllZC4gIE5vIGRhdGEgd2lsbCBiZSBpbmNsdWRlZC4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFVzZSB0aGUgZGVmYXVsdCBzdWZmaXggaWYgaXQgd2FzIG5vdCBzcGVjaWZpZWQKLSAgICAgICAgaWYgKDAgPT0gdXJsU3VmZml4Lmxlbmd0aCgpKSB7Ci0gICAgICAgICAgICBpZiAoc29hcDEyKSB7Ci0gICAgICAgICAgICAgICAgdXJsU3VmZml4ID0gTVRPTV9DT05URVhUMTI7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHVybFN1ZmZpeCA9IE1UT01fQ09OVEVYVDExOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IG11bHRpcGxlIGNsYXNzIHZhcmlhYmxlcyBhbmQgaW5pdCBjb250ZW50LgotICAgICAqCi0gICAgICogQHBhcmFtIHVyaSAgICAgIC0gU3RyaW5nIC0gYmFzZSBzZXJ2aWNlIFVSSQotICAgICAqIEBwYXJhbSBzb2FwZGVmICAtIEJvb2xlYW4gLSB0cnVlIGZvciBTT0FQIDEuMgotICAgICAqIEBwYXJhbSBmaWxlTmFtZSAtIHNvdXJjZSBmaWxlIHRvIHNlbmQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRPcHRpb25zKFN0cmluZyB1cmksIEJvb2xlYW4gc29hcGRlZiwgU3RyaW5nIGZpbGVOYW1lKQotICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHVyaVN0cmluZyA9IHVyaTsKLSAgICAgICAgdXJsU3VmZml4ID0gKHNvYXBkZWYpID8gTVRPTV9DT05URVhUMTIgOiBNVE9NX0NPTlRFWFQxMTsKLSAgICAgICAgc29hcDEyID0gc29hcGRlZjsKLSAgICAgICAgaW1hZ2VGaWxlbmFtZSA9IGZpbGVOYW1lOwotICAgICAgICBpbml0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJpbnQgdXNhZ2UgaGVscCB0byBvdXRwdXQKLSAgICAgKgotICAgICAqIEBwYXJhbSBpbnZhbGlkT3B0IC0KLSAgICAgKiAgICAgICAgICAgICAgICAgICBpZiBub24tbnVsbCwgaXMgdGhlIGludmFsaWQgcGFyYW1ldGVyCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHByaW50VXNhZ2UoU3RyaW5nIGludmFsaWRPcHQpIHsKLSAgICAgICAgaWYgKG51bGwgIT0gaW52YWxpZE9wdCkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJJbnZhbGlkIE9wdGlvbjogIiArIGludmFsaWRPcHQpOwotICAgICAgICB9Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVXNhZ2U6Iik7Ci0gICAgICAgIFN5c3RlbS5vdXQKLSAgICAgICAgICAgICAgICAucHJpbnRsbigiICBydW5TYW1wbGVNdG9tIC1oIFtob3N0bmFtZV0gLXAgW3BvcnRdIC1mIFt1cmxTdWZmaXhdIC1pIFtpbWFnZUZpbGVuYW1lXSAtZCAteCAtMSAtMiIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkRlZmF1bHQgdmFsdWVzOiIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgaG9zdG5hbWUgPSBsb2NhbGhvc3QiKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIHBvcnQgPSA4MDgwIik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICB1cmxTdWZmaXggPSAvamF4d3Mtc2FtcGxlcy9zZXJ2aWNlcy9NdG9tU2FtcGxlU2VydmljZS5NdG9tU2FtcGxlUG9ydCIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgLWQgPSBVc2UgRGlzcGF0Y2ggT25seSIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgLXggPSBVc2UgUHJveHkgT25seSIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgLTEgPSBzb2FwIDEuMSAoZGVmYXVsdCkiKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIC0yID0gc29hcCAxLjIiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBjb250ZW50IG9iamVjdCBpZiByZXF1aXJlZAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBpbml0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChjb250ZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgIGNvbnRlbnQgPSBnZXRCaW5hcnlDb250ZW50KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyBzZW5kaW5nIGFuIGltYWdlIHdpdGggTVRPTSwgdXNpbmcgdGhlIEpBWC1XUyBEaXNwYXRjaCBBUEkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVzdWx0IC0gU3RyaW5nIC0gdXNlZCB0byBwYXNzIGJhY2sgcmVzdWx0cyB0byBzZXJ2bGV0LgotICAgICAqIEByZXR1cm4gU3RyaW5nIC0gdGhlIGlucHV0IHN0cmluZyBvciBudWxsCi0gICAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHRlc3RNdG9tV2l0aERpc3BhdGNoKFN0cmluZyByZXN1bHQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTZXJ2aWNlIHN2YzsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCI+Pi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIj4+TVRPTSBEaXNwYXRjaCBUZXN0Iik7Ci0KLSAgICAgICAgaW5pdCgpOwotCi0gICAgICAgIC8vIFNldCB0aGUgZGF0YSBpbnNpZGUgb2YgdGhlIGFwcHJvcHJpYXRlIG9iamVjdAotICAgICAgICBJbWFnZURlcG90IGltYWdlRGVwb3QgPSBuZXcgT2JqZWN0RmFjdG9yeSgpLmNyZWF0ZUltYWdlRGVwb3QoKTsKLSAgICAgICAgaW1hZ2VEZXBvdC5zZXRJbWFnZURhdGEoY29udGVudCk7Ci0KLSAgICAgICAgaWYgKHNvYXAxMikgewotICAgICAgICAgICAgc3ZjID0gU2VydmljZS5jcmVhdGUoc2VydmljZU5hbWUxMik7Ci0gICAgICAgICAgICBzdmMuYWRkUG9ydChwb3J0TmFtZURpc3BhdGNoLCBTT0FQQmluZGluZy5TT0FQMTJIVFRQX0JJTkRJTkcsIHVyaVN0cmluZyArIHVybFN1ZmZpeCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzdmMgPSBTZXJ2aWNlLmNyZWF0ZShzZXJ2aWNlTmFtZTExKTsKLSAgICAgICAgICAgIHN2Yy5hZGRQb3J0KHBvcnROYW1lRGlzcGF0Y2gsIFNPQVBCaW5kaW5nLlNPQVAxMUhUVFBfQklORElORywgdXJpU3RyaW5nICsgdXJsU3VmZml4KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFNldHVwIHRoZSBuZWNlc3NhcnkgSkFYLVdTIGFydGlmYWN0cwotICAgICAgICBKQVhCQ29udGV4dCBqYmMgPSBKQVhCQ29udGV4dAotICAgICAgICAgICAgICAgIC5uZXdJbnN0YW5jZSgib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGVzLm10b20iKTsKLSAgICAgICAgRGlzcGF0Y2g8T2JqZWN0PiBkaXNwYXRjaCA9IHN2Yy5jcmVhdGVEaXNwYXRjaChwb3J0TmFtZURpc3BhdGNoLCBqYmMsCi0gICAgICAgICAgICAgICAgU2VydmljZS5Nb2RlLlBBWUxPQUQpOwotICAgICAgICBCaW5kaW5nUHJvdmlkZXIgYnAgPSAoQmluZGluZ1Byb3ZpZGVyKSBkaXNwYXRjaDsKLSAgICAgICAgYnAuZ2V0UmVxdWVzdENvbnRleHQoKS5wdXQoQmluZGluZ1Byb3ZpZGVyLlNPQVBBQ1RJT05fVVNFX1BST1BFUlRZLAotICAgICAgICAgICAgICAgIEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgIGJwLmdldFJlcXVlc3RDb250ZXh0KCkucHV0KEJpbmRpbmdQcm92aWRlci5TT0FQQUNUSU9OX1VSSV9QUk9QRVJUWSwKLSAgICAgICAgICAgICAgICAic2VuZEltYWdlIik7Ci0KLSAgICAgICAgLy8gU2V0IHRoZSBhY3R1YWwgZmxhZyB0byBlbmFibGUgTVRPTQotICAgICAgICBTT0FQQmluZGluZyBiaW5kaW5nID0gKFNPQVBCaW5kaW5nKSBkaXNwYXRjaC5nZXRCaW5kaW5nKCk7Ci0gICAgICAgIGJpbmRpbmcuc2V0TVRPTUVuYWJsZWQodHJ1ZSk7Ci0KLSAgICAgICAgLy8gQ3JlYXRlIHRoZSByZXF1ZXN0IHdyYXBwZXIgYmVhbgotICAgICAgICBPYmplY3RGYWN0b3J5IGZhY3RvcnkgPSBuZXcgT2JqZWN0RmFjdG9yeSgpOwotICAgICAgICBTZW5kSW1hZ2UgcmVxdWVzdCA9IGZhY3RvcnkuY3JlYXRlU2VuZEltYWdlKCk7Ci0gICAgICAgIHJlcXVlc3Quc2V0SW5wdXQoaW1hZ2VEZXBvdCk7Ci0KLSAgICAgICAgaWYgKG51bGwgIT0gcmVzdWx0KSB7Ci0gICAgICAgICAgICByZXN1bHQgPSByZXN1bHQuY29uY2F0KCJJbnZva2luZyBEaXNwYXRjaDxPYmplY3Q+IHdpdGggYSBiaW5hcnkgcGF5bG9hZFxuIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0Ci0gICAgICAgICAgICAgICAgICAgIC5wcmludGxuKCI+Pk1UT00gSW52b2tpbmcgRGlzcGF0Y2g8T2JqZWN0PiB3aXRoIGEgYmluYXJ5IHBheWxvYWQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFNlbmQgdGhlIGltYWdlIGFuZCBwcm9jZXNzIHRoZSByZXNwb25zZSBpbWFnZQotICAgICAgICB0cnkgewotICAgICAgICAgICAgU2VuZEltYWdlUmVzcG9uc2UgcmVzcG9uc2UgPSAoU2VuZEltYWdlUmVzcG9uc2UpIGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsKLSAgICAgICAgICAgIGlmIChudWxsICE9IHJlc3VsdCkgewotICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5jb25jYXQoIk1UT00gRGlzcGF0Y2ggUmVzcG9uc2UgcmVjZWl2ZWQgLSAiICsgcmVzcG9uc2UuZ2V0T3V0cHV0KCkuZ2V0SW1hZ2VEYXRhKCkuZ2V0Q29udGVudFR5cGUoKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmNvbmNhdCgiRVJST1I6IE1UT00gRGlzcGF0Y2ggTlVMTCBSZXNwb25zZSByZWNlaXZlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCI+Pk1UT00gUmVzcG9uc2UgcmVjZWl2ZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcmludGxuKCI+Pk1UT00gV3JpdGluZyByZXR1cm5lZCBpbWFnZSB0byBkaXNwYXRjaF9yZXNwb25zZS5naWYiKTsKLSAgICAgICAgICAgICAgICAgICAgSW1hZ2VEZXBvdCByZXNwb25zZUNvbnRlbnQgPSByZXNwb25zZS5nZXRPdXRwdXQoKTsKLSAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0ltYWdlRGVwb3QocmVzcG9uc2VDb250ZW50LCAiZGlzcGF0Y2hfcmVzcG9uc2UuZ2lmIik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCI+PiBbRVJST1JdIC0gUmVzcG9uc2UgZnJvbSB0aGUgc2VydmVyIHdhcyBOVUxMIik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpZiAobnVsbCAhPSByZXN1bHQpIHsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQuY29uY2F0KCI+PiBbRVJST1JdIC0gRXhjZXB0aW9uIG1ha2luZyBjb25uZWN0aW9uLiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCI+PiBbRVJST1JdIC0gRXhjZXB0aW9uIG1ha2luZyBjb25uZWN0aW9uLiIpOwotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIj4+TVRPTSBEaXNwYXRjaCBEb25lIik7Ci0gICAgICAgIHJldHVybiAocmVzdWx0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyBzZW5kaW5nIGFuIGltYWdlIHdpdGggTVRPTSwgdXNpbmcgYSBKQVgtV1MgRHluYW1pYyBQcm94eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSByZXN1bHQgLSBTdHJpbmcgLSB1c2VkIHRvIHBhc3MgYmFjayByZXN1bHRzIHRvIHNlcnZsZXQuCi0gICAgICogQHJldHVybiBTdHJpbmcgLSB0aGUgaW5wdXQgc3RyaW5nIG9yIG51bGwKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgdGVzdE10b21XaXRoUHJveHkoU3RyaW5nIHJlc3VsdCwgVVJMIHVybCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEltYWdlRGVwb3QgcmVzcG9uc2U7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiPj4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCI+Pk1UT00gUHJveHkgVGVzdCIpOwotCi0gICAgICAgIGluaXQoKTsKLQotICAgICAgICAvLyBTZXQgdGhlIGRhdGEgaW5zaWRlIG9mIHRoZSBhcHByb3ByaWF0ZSBvYmplY3QKLSAgICAgICAgSW1hZ2VEZXBvdCBpbWFnZURlcG90ID0gbmV3IE9iamVjdEZhY3RvcnkoKS5jcmVhdGVJbWFnZURlcG90KCk7Ci0gICAgICAgIGltYWdlRGVwb3Quc2V0SW1hZ2VEYXRhKGNvbnRlbnQpOwotCi0gICAgICAgIGlmIChudWxsICE9IHJlc3VsdCkgewotICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmNvbmNhdCgiSW52b2tpbmcgTVRPTSBwcm94eSB3aXRoIGEgYmluYXJ5IHBheWxvYWRcbiIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCI+Pk1UT00gSW52b2tpbmcgcHJveHkgd2l0aCBhIGJpbmFyeSBwYXlsb2FkIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTZXR1cCB0aGUgbmVjZXNzYXJ5IEpBWC1XUyBhcnRpZmFjdHMKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChzb2FwMTIpIHsKLSAgICAgICAgICAgICAgICAvLyBVc2UgdGhlIGdlbmVyYXRlZCBwcm94eQotICAgICAgICAgICAgICAgIE10b21TYW1wbGUxMlBvcnRQcm94eSBwcm94eSA9IG5ldyBNdG9tU2FtcGxlMTJQb3J0UHJveHkodXJsKTsKLSAgICAgICAgICAgICAgICBwcm94eS5fZ2V0RGVzY3JpcHRvcigpLnNldEVuZHBvaW50KHVyaVN0cmluZyArIHVybFN1ZmZpeCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBFbmFibGUgTVRPTQotICAgICAgICAgICAgICAgIEJpbmRpbmdQcm92aWRlciBicCA9IChCaW5kaW5nUHJvdmlkZXIpIHByb3h5Ll9nZXREZXNjcmlwdG9yKCkuZ2V0UHJveHkoKTsKLSAgICAgICAgICAgICAgICBTT0FQQmluZGluZyBiaW5kaW5nID0gKFNPQVBCaW5kaW5nKSBicC5nZXRCaW5kaW5nKCk7Ci0gICAgICAgICAgICAgICAgYmluZGluZy5zZXRNVE9NRW5hYmxlZCh0cnVlKTsKLQotICAgICAgICAgICAgICAgIC8vIFNlbmQgdGhlIGltYWdlIGFuZCBwcm9jZXNzIHRoZSByZXNwb25zZSBpbWFnZQotICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gcHJveHkuc2VuZEltYWdlKGltYWdlRGVwb3QpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBTT0FQIDEuMSBDcmVhdGUgdGhlIHNlcnZpY2UKLSAgICAgICAgICAgICAgICAvLwkJCQkgVXNlIHRoZSBnZW5lcmF0ZWQgcHJveHkKLSAgICAgICAgICAgICAgICBNdG9tU2FtcGxlUG9ydFByb3h5IHByb3h5ID0gbmV3IE10b21TYW1wbGVQb3J0UHJveHkodXJsKTsKLSAgICAgICAgICAgICAgICBwcm94eS5fZ2V0RGVzY3JpcHRvcigpLnNldEVuZHBvaW50KHVyaVN0cmluZyArIHVybFN1ZmZpeCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBFbmFibGUgTVRPTQotICAgICAgICAgICAgICAgIEJpbmRpbmdQcm92aWRlciBicCA9IChCaW5kaW5nUHJvdmlkZXIpIHByb3h5Ll9nZXREZXNjcmlwdG9yKCkuZ2V0UHJveHkoKTsKLSAgICAgICAgICAgICAgICBTT0FQQmluZGluZyBiaW5kaW5nID0gKFNPQVBCaW5kaW5nKSBicC5nZXRCaW5kaW5nKCk7Ci0gICAgICAgICAgICAgICAgYmluZGluZy5zZXRNVE9NRW5hYmxlZCh0cnVlKTsKLQotICAgICAgICAgICAgICAgIC8vIFNlbmQgdGhlIGltYWdlIGFuZCBwcm9jZXNzIHRoZSByZXNwb25zZSBpbWFnZQotICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gcHJveHkuc2VuZEltYWdlKGltYWdlRGVwb3QpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobnVsbCAhPSByZXN1bHQpIHsKLSAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQuY29uY2F0KCJNVE9NIFByb3h5IFJlc3BvbnNlIHJlY2VpdmVkIC0gIiArIHJlc3BvbnNlLmdldEltYWdlRGF0YSgpLmdldENvbnRlbnRUeXBlKCkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5jb25jYXQoIkVSUk9SOiBNVE9NIFByb3h5IE5VTEwgUmVzcG9uc2UgcmVjZWl2ZWRcbiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCI+Pk1UT00gUmVzcG9uc2UgcmVjZWl2ZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcmludGxuKCI+Pk1UT00gV3JpdGluZyByZXR1cm5lZCBpbWFnZSB0byBwcm94eV9yZXNwb25zZS5naWYiKTsKLSAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0ltYWdlRGVwb3QocmVzcG9uc2UsICJwcm94eV9yZXNwb25zZS5naWYiKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnByaW50bG4oIj4+IFtFUlJPUl0gLSBSZXNwb25zZSBmcm9tIHRoZSBzZXJ2ZXIgd2FzIE5VTEwiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpZiAobnVsbCAhPSByZXN1bHQpIHsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQuY29uY2F0KCI+PiBbRVJST1JdIC0gRXhjZXB0aW9uIG1ha2luZyBjb25uZWN0aW9uLiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCI+PiBbRVJST1JdIC0gRXhjZXB0aW9uIG1ha2luZyBjb25uZWN0aW9uLiIpOwotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiPj5NVE9NIFByb3h5IERvbmUiKTsKLSAgICAgICAgcmV0dXJuIChyZXN1bHQpOwotICAgIH0KLQotICAgIC8qCi0gICAgICAqIEdldCBhIERhdGFIYW5kbGVyIHRoYXQgY29udGFpbnMgdGhlIGJpbmFyeSBkYXRhIHdlJ2QgbGlrZSB0byBzZW5kLgotICAgICAgKiBAcmV0dXJuIERhdGFIYW5kbGVyCi0gICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAgICAqLwotICAgIHByaXZhdGUgRGF0YUhhbmRsZXIgZ2V0QmluYXJ5Q29udGVudCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBEYXRhSGFuZGxlciBkaCA9IG51bGw7Ci0gICAgICAgIGlmIChpbWFnZUZpbGVuYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGltYWdlRmlsZW5hbWUpOwotICAgICAgICAgICAgaWYgKCFmaWxlLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCI+Pk1UT00gTG9hZGluZyBkYXRhIGZyb206ICciCi0gICAgICAgICAgICAgICAgICAgICsgZmlsZS50b1VSSSgpLnRvVVJMKCkudG9FeHRlcm5hbEZvcm0oKSArICInIik7Ci0gICAgICAgICAgICBGaWxlRGF0YVNvdXJjZSBmZHMgPSBuZXcgRmlsZURhdGFTb3VyY2UoZmlsZSk7Ci0gICAgICAgICAgICBkaCA9IG5ldyBEYXRhSGFuZGxlcihmZHMpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGRoOwotICAgIH0KLQotICAgIC8qCi0gICAgICAqIFRha2VzIHRoZSBkYXRhIGZyb20gdGhlIEltYWdlRGVwb3QgYW5kIHdyaXRlcyBpdCBvdXQgdG8gYSBmaWxlIG5hbWVkIGJ5Ci0gICAgICAqIHRoZSBwcm92aWRlZCBTdHJpbmcuCi0gICAgICAqIEBwYXJhbSBJbWFnZURlcG90IGRhdGEKLSAgICAgICogQHBhcmFtIFN0cmluZyBmbmFtZQotICAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0ltYWdlRGVwb3QoSW1hZ2VEZXBvdCBkYXRhLCBTdHJpbmcgZm5hbWUpCi0gICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgRGF0YUhhbmRsZXIgZGggPSBkYXRhLmdldEltYWdlRGF0YSgpOwotICAgICAgICBpZiAoZGggIT0gbnVsbCkgewotICAgICAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUoZm5hbWUpOwotICAgICAgICAgICAgaWYgKGYuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICBmLmRlbGV0ZSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGYpOwotICAgICAgICAgICAgZGgud3JpdGVUbyhmb3MpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgU3lzdGVtLm91dAotICAgICAgICAgICAgICAgICAgICAucHJpbnRsbigiPj4gW0VSUk9SXSAtIEltYWdlRGVwb3Qgd2FzIG5vdCBudWxsLCBidXQgZGlkIG5vdCBjb250YWluIGJpbmFyeSBkYXRhIik7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL21haW4vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL2NsaWVudC9waW5nL1BpbmdTZXJ2aWNlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL21haW4vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL2NsaWVudC9waW5nL1BpbmdTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmNjY4MTQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy9tYWluL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9jbGllbnQvcGluZy9QaW5nU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGVzLmNsaWVudC5waW5nOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViRW5kcG9pbnQ7Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VDbGllbnQ7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotCi1AV2ViU2VydmljZUNsaWVudChuYW1lID0gIlBpbmdTZXJ2aWNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvcGluZy8iLCB3c2RsTG9jYXRpb24gPSAiV0VCLUlORi93c2RsL1Bpbmcud3NkbCIpCi1wdWJsaWMgY2xhc3MgUGluZ1NlcnZpY2UKLSAgICAgICAgZXh0ZW5kcyBTZXJ2aWNlIHsKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFVSTCBQSU5HU0VSVklDRV9XU0RMX0xPQ0FUSU9OOwotCi0gICAgc3RhdGljIHsKLSAgICAgICAgVVJMIHVybCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB1cmwgPSBuZXcgVVJMKCJmaWxlOi9XRUItSU5GL3dzZGwvUGluZy53c2RsIik7Ci0gICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgICAgIFBJTkdTRVJWSUNFX1dTRExfTE9DQVRJT04gPSB1cmw7Ci0gICAgfQotCi0gICAgcHVibGljIFBpbmdTZXJ2aWNlKFVSTCB3c2RsTG9jYXRpb24sIFFOYW1lIHNlcnZpY2VOYW1lKSB7Ci0gICAgICAgIHN1cGVyKHdzZGxMb2NhdGlvbiwgc2VydmljZU5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBQaW5nU2VydmljZSgpIHsKLSAgICAgICAgc3VwZXIoUElOR1NFUlZJQ0VfV1NETF9MT0NBVElPTiwgbmV3IFFOYW1lKCJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL3BpbmcvIiwgIlBpbmdTZXJ2aWNlIikpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gcmV0dXJucyBQaW5nU2VydmljZVBvcnRUeXBlCi0gICAgICovCi0gICAgQFdlYkVuZHBvaW50KG5hbWUgPSAiUGluZ1NlcnZpY2VQb3J0IikKLSAgICBwdWJsaWMgUGluZ1NlcnZpY2VQb3J0VHlwZUNsaWVudCBnZXRQaW5nU2VydmljZVBvcnQoKSB7Ci0gICAgICAgIHJldHVybiAoUGluZ1NlcnZpY2VQb3J0VHlwZUNsaWVudCkgc3VwZXIuZ2V0UG9ydChuZXcgUU5hbWUoImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvcGluZy8iLCAiUGluZ1NlcnZpY2VQb3J0IiksIFBpbmdTZXJ2aWNlUG9ydFR5cGVDbGllbnQuY2xhc3MpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy9tYWluL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9jbGllbnQvcGluZy9QaW5nU2VydmljZTEyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL21haW4vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL2NsaWVudC9waW5nL1BpbmdTZXJ2aWNlMTIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjg1MDA4OS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL21haW4vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL2NsaWVudC9waW5nL1BpbmdTZXJ2aWNlMTIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlcy5jbGllbnQucGluZzsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYkVuZHBvaW50OwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlQ2xpZW50OwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLQotQFdlYlNlcnZpY2VDbGllbnQobmFtZSA9ICJQaW5nU2VydmljZTEyIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvcGluZy8iLCB3c2RsTG9jYXRpb24gPSAiV0VCLUlORi93c2RsL1BpbmcxMi53c2RsIikKLXB1YmxpYyBjbGFzcyBQaW5nU2VydmljZTEyCi0gICAgICAgIGV4dGVuZHMgU2VydmljZSB7Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBVUkwgUElOR1NFUlZJQ0UxMl9XU0RMX0xPQ0FUSU9OOwotCi0gICAgc3RhdGljIHsKLSAgICAgICAgVVJMIHVybCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB1cmwgPSBuZXcgVVJMKCJmaWxlOi9XRUItSU5GL3dzZGwvUGluZzEyLndzZGwiKTsKLSAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgUElOR1NFUlZJQ0UxMl9XU0RMX0xPQ0FUSU9OID0gdXJsOwotICAgIH0KLQotICAgIHB1YmxpYyBQaW5nU2VydmljZTEyKFVSTCB3c2RsTG9jYXRpb24sIFFOYW1lIHNlcnZpY2VOYW1lKSB7Ci0gICAgICAgIHN1cGVyKHdzZGxMb2NhdGlvbiwgc2VydmljZU5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBQaW5nU2VydmljZTEyKCkgewotICAgICAgICBzdXBlcihQSU5HU0VSVklDRTEyX1dTRExfTE9DQVRJT04sIG5ldyBRTmFtZSgiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9waW5nLyIsICJQaW5nU2VydmljZTEyIikpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gcmV0dXJucyBQaW5nU2VydmljZTEyUG9ydFR5cGUKLSAgICAgKi8KLSAgICBAV2ViRW5kcG9pbnQobmFtZSA9ICJQaW5nU2VydmljZTEyUG9ydCIpCi0gICAgcHVibGljIFBpbmdTZXJ2aWNlMTJQb3J0VHlwZUNsaWVudCBnZXRQaW5nU2VydmljZTEyUG9ydCgpIHsKLSAgICAgICAgcmV0dXJuIChQaW5nU2VydmljZTEyUG9ydFR5cGVDbGllbnQpIHN1cGVyLmdldFBvcnQobmV3IFFOYW1lKCJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL3BpbmcvIiwgIlBpbmdTZXJ2aWNlMTJQb3J0IiksIFBpbmdTZXJ2aWNlMTJQb3J0VHlwZUNsaWVudC5jbGFzcyk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL21haW4vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL2NsaWVudC9waW5nL1BpbmdTZXJ2aWNlMTJQb3J0UHJveHkuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvbWFpbi9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvY2xpZW50L3BpbmcvUGluZ1NlcnZpY2UxMlBvcnRQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmZkMThiLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvbWFpbi9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvY2xpZW50L3BpbmcvUGluZ1NlcnZpY2UxMlBvcnRQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlcy5jbGllbnQucGluZzsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlcy5waW5nLlBpbmdTdHJpbmdJbnB1dDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLndzLkJpbmRpbmdQcm92aWRlcjsKLWltcG9ydCBqYXZheC54bWwud3MuRGlzcGF0Y2g7Ci1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1wdWJsaWMgY2xhc3MgUGluZ1NlcnZpY2UxMlBvcnRQcm94eSB7Ci0KLSAgICBwcm90ZWN0ZWQgRGVzY3JpcHRvciBfZGVzY3JpcHRvcjsKLQotICAgIHB1YmxpYyBjbGFzcyBEZXNjcmlwdG9yIHsKLSAgICAgICAgcHJpdmF0ZSBQaW5nU2VydmljZTEyIF9zZXJ2aWNlID0gbnVsbDsKLSAgICAgICAgcHJpdmF0ZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZXMuY2xpZW50LnBpbmcuUGluZ1NlcnZpY2UxMlBvcnRUeXBlQ2xpZW50IF9wcm94eSA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgRGlzcGF0Y2g8U291cmNlPiBfZGlzcGF0Y2ggPSBudWxsOwotCi0gICAgICAgIHB1YmxpYyBEZXNjcmlwdG9yKCkgewotICAgICAgICAgICAgX3NlcnZpY2UgPSBuZXcgUGluZ1NlcnZpY2UxMigpOwotICAgICAgICAgICAgaW5pdENvbW1vbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIERlc2NyaXB0b3IoVVJMIHdzZGxMb2NhdGlvbiwgUU5hbWUgc2VydmljZU5hbWUpIHsKLSAgICAgICAgICAgIF9zZXJ2aWNlID0gbmV3IFBpbmdTZXJ2aWNlMTIod3NkbExvY2F0aW9uLCBzZXJ2aWNlTmFtZSk7Ci0gICAgICAgICAgICBpbml0Q29tbW9uKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgaW5pdENvbW1vbigpIHsKLSAgICAgICAgICAgIF9wcm94eSA9IF9zZXJ2aWNlLmdldFBpbmdTZXJ2aWNlMTJQb3J0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGVzLmNsaWVudC5waW5nLlBpbmdTZXJ2aWNlMTJQb3J0VHlwZUNsaWVudCBnZXRQcm94eSgpIHsKLSAgICAgICAgICAgIHJldHVybiBfcHJveHk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgRGlzcGF0Y2g8U291cmNlPiBnZXREaXNwYXRjaCgpIHsKLSAgICAgICAgICAgIGlmIChfZGlzcGF0Y2ggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFFOYW1lIHBvcnRRTmFtZSA9IG5ldyBRTmFtZSgiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9waW5nLyIsICJQaW5nU2VydmljZTEyUG9ydCIpOwotICAgICAgICAgICAgICAgIF9kaXNwYXRjaCA9IF9zZXJ2aWNlLmNyZWF0ZURpc3BhdGNoKHBvcnRRTmFtZSwgU291cmNlLmNsYXNzLCBTZXJ2aWNlLk1vZGUuUEFZTE9BRCk7Ci0KLSAgICAgICAgICAgICAgICBTdHJpbmcgcHJveHlFbmRwb2ludFVybCA9IGdldEVuZHBvaW50KCk7Ci0gICAgICAgICAgICAgICAgQmluZGluZ1Byb3ZpZGVyIGJwID0gKEJpbmRpbmdQcm92aWRlcikgX2Rpc3BhdGNoOwotICAgICAgICAgICAgICAgIFN0cmluZyBkaXNwYXRjaEVuZHBvaW50VXJsID0gKFN0cmluZykgYnAuZ2V0UmVxdWVzdENvbnRleHQoKS5nZXQoQmluZGluZ1Byb3ZpZGVyLkVORFBPSU5UX0FERFJFU1NfUFJPUEVSVFkpOwotICAgICAgICAgICAgICAgIGlmICghZGlzcGF0Y2hFbmRwb2ludFVybC5lcXVhbHMocHJveHlFbmRwb2ludFVybCkpCi0gICAgICAgICAgICAgICAgICAgIGJwLmdldFJlcXVlc3RDb250ZXh0KCkucHV0KEJpbmRpbmdQcm92aWRlci5FTkRQT0lOVF9BRERSRVNTX1BST1BFUlRZLCBwcm94eUVuZHBvaW50VXJsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBfZGlzcGF0Y2g7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEVuZHBvaW50KCkgewotICAgICAgICAgICAgQmluZGluZ1Byb3ZpZGVyIGJwID0gKEJpbmRpbmdQcm92aWRlcikgX3Byb3h5OwotICAgICAgICAgICAgcmV0dXJuIChTdHJpbmcpIGJwLmdldFJlcXVlc3RDb250ZXh0KCkuZ2V0KEJpbmRpbmdQcm92aWRlci5FTkRQT0lOVF9BRERSRVNTX1BST1BFUlRZKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldEVuZHBvaW50KFN0cmluZyBlbmRwb2ludFVybCkgewotICAgICAgICAgICAgQmluZGluZ1Byb3ZpZGVyIGJwID0gKEJpbmRpbmdQcm92aWRlcikgX3Byb3h5OwotICAgICAgICAgICAgYnAuZ2V0UmVxdWVzdENvbnRleHQoKS5wdXQoQmluZGluZ1Byb3ZpZGVyLkVORFBPSU5UX0FERFJFU1NfUFJPUEVSVFksIGVuZHBvaW50VXJsKTsKLQotICAgICAgICAgICAgaWYgKF9kaXNwYXRjaCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYnAgPSAoQmluZGluZ1Byb3ZpZGVyKSBfZGlzcGF0Y2g7Ci0gICAgICAgICAgICAgICAgYnAuZ2V0UmVxdWVzdENvbnRleHQoKS5wdXQoQmluZGluZ1Byb3ZpZGVyLkVORFBPSU5UX0FERFJFU1NfUFJPUEVSVFksIGVuZHBvaW50VXJsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBQaW5nU2VydmljZTEyUG9ydFByb3h5KCkgewotICAgICAgICBfZGVzY3JpcHRvciA9IG5ldyBEZXNjcmlwdG9yKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFBpbmdTZXJ2aWNlMTJQb3J0UHJveHkoVVJMIHdzZGxMb2NhdGlvbikgewotICAgICAgICBfZGVzY3JpcHRvciA9IG5ldyBEZXNjcmlwdG9yKHdzZGxMb2NhdGlvbiwgbmV3IFFOYW1lKCJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL3BpbmcvIiwgIlBpbmdTZXJ2aWNlMTIiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIFBpbmdTZXJ2aWNlMTJQb3J0UHJveHkoVVJMIHdzZGxMb2NhdGlvbiwgUU5hbWUgc2VydmljZU5hbWUpIHsKLSAgICAgICAgX2Rlc2NyaXB0b3IgPSBuZXcgRGVzY3JpcHRvcih3c2RsTG9jYXRpb24sIHNlcnZpY2VOYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRGVzY3JpcHRvciBfZ2V0RGVzY3JpcHRvcigpIHsKLSAgICAgICAgcmV0dXJuIF9kZXNjcmlwdG9yOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHBpbmdPcGVyYXRpb24oUGluZ1N0cmluZ0lucHV0IHBhcmFtZXRlcikgewotICAgICAgICBfZ2V0RGVzY3JpcHRvcigpLmdldFByb3h5KCkucGluZ09wZXJhdGlvbihwYXJhbWV0ZXIpOwotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvbWFpbi9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvY2xpZW50L3BpbmcvUGluZ1NlcnZpY2UxMlBvcnRUeXBlQ2xpZW50LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL21haW4vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL2NsaWVudC9waW5nL1BpbmdTZXJ2aWNlMTJQb3J0VHlwZUNsaWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWNiYTE5Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvbWFpbi9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvY2xpZW50L3BpbmcvUGluZ1NlcnZpY2UxMlBvcnRUeXBlQ2xpZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZXMuY2xpZW50LnBpbmc7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZXMucGluZy5QaW5nU3RyaW5nSW5wdXQ7Ci0KLWltcG9ydCBqYXZheC5qd3MuT25ld2F5OwotaW1wb3J0IGphdmF4Lmp3cy5XZWJNZXRob2Q7Ci1pbXBvcnQgamF2YXguandzLldlYlBhcmFtOwotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOwotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nOwotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlBhcmFtZXRlclN0eWxlOwotCi0KLUBXZWJTZXJ2aWNlKG5hbWUgPSAiUGluZ1NlcnZpY2UxMlBvcnRUeXBlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvcGluZy8iKQotQFNPQVBCaW5kaW5nKHBhcmFtZXRlclN0eWxlID0gUGFyYW1ldGVyU3R5bGUuQkFSRSkKLXB1YmxpYyBpbnRlcmZhY2UgUGluZ1NlcnZpY2UxMlBvcnRUeXBlQ2xpZW50IHsKLQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHBhcmFtZXRlcgotICAgICAqLwotICAgIEBXZWJNZXRob2QoYWN0aW9uID0gInBpbmdPcGVyYXRpb24iKQotICAgIEBPbmV3YXkKLSAgICBwdWJsaWMgdm9pZCBwaW5nT3BlcmF0aW9uKAotICAgICAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAicGluZ1N0cmluZ0lucHV0IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvcGluZy8iLCBwYXJ0TmFtZSA9ICJwYXJhbWV0ZXIiKQotICAgICAgICAgICAgUGluZ1N0cmluZ0lucHV0IHBhcmFtZXRlcik7Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvbWFpbi9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvY2xpZW50L3BpbmcvUGluZ1NlcnZpY2VQb3J0UHJveHkuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvbWFpbi9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvY2xpZW50L3BpbmcvUGluZ1NlcnZpY2VQb3J0UHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI2NmQzOS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL21haW4vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL2NsaWVudC9waW5nL1BpbmdTZXJ2aWNlUG9ydFByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGVzLmNsaWVudC5waW5nOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGVzLnBpbmcuUGluZ1N0cmluZ0lucHV0OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwud3MuQmluZGluZ1Byb3ZpZGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5EaXNwYXRjaDsKLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLXB1YmxpYyBjbGFzcyBQaW5nU2VydmljZVBvcnRQcm94eSB7Ci0KLSAgICBwcm90ZWN0ZWQgRGVzY3JpcHRvciBfZGVzY3JpcHRvcjsKLQotICAgIHB1YmxpYyBjbGFzcyBEZXNjcmlwdG9yIHsKLSAgICAgICAgcHJpdmF0ZSBQaW5nU2VydmljZSBfc2VydmljZSA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGVzLmNsaWVudC5waW5nLlBpbmdTZXJ2aWNlUG9ydFR5cGVDbGllbnQgX3Byb3h5ID0gbnVsbDsKLSAgICAgICAgcHJpdmF0ZSBEaXNwYXRjaDxTb3VyY2U+IF9kaXNwYXRjaCA9IG51bGw7Ci0KLSAgICAgICAgcHVibGljIERlc2NyaXB0b3IoKSB7Ci0gICAgICAgICAgICBfc2VydmljZSA9IG5ldyBQaW5nU2VydmljZSgpOwotICAgICAgICAgICAgaW5pdENvbW1vbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIERlc2NyaXB0b3IoVVJMIHdzZGxMb2NhdGlvbiwgUU5hbWUgc2VydmljZU5hbWUpIHsKLSAgICAgICAgICAgIF9zZXJ2aWNlID0gbmV3IFBpbmdTZXJ2aWNlKHdzZGxMb2NhdGlvbiwgc2VydmljZU5hbWUpOwotICAgICAgICAgICAgaW5pdENvbW1vbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGluaXRDb21tb24oKSB7Ci0gICAgICAgICAgICBfcHJveHkgPSBfc2VydmljZS5nZXRQaW5nU2VydmljZVBvcnQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZXMuY2xpZW50LnBpbmcuUGluZ1NlcnZpY2VQb3J0VHlwZUNsaWVudCBnZXRQcm94eSgpIHsKLSAgICAgICAgICAgIHJldHVybiBfcHJveHk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgRGlzcGF0Y2g8U291cmNlPiBnZXREaXNwYXRjaCgpIHsKLSAgICAgICAgICAgIGlmIChfZGlzcGF0Y2ggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFFOYW1lIHBvcnRRTmFtZSA9IG5ldyBRTmFtZSgiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9waW5nLyIsICJQaW5nU2VydmljZVBvcnQiKTsKLSAgICAgICAgICAgICAgICBfZGlzcGF0Y2ggPSBfc2VydmljZS5jcmVhdGVEaXNwYXRjaChwb3J0UU5hbWUsIFNvdXJjZS5jbGFzcywgU2VydmljZS5Nb2RlLlBBWUxPQUQpOwotCi0gICAgICAgICAgICAgICAgU3RyaW5nIHByb3h5RW5kcG9pbnRVcmwgPSBnZXRFbmRwb2ludCgpOwotICAgICAgICAgICAgICAgIEJpbmRpbmdQcm92aWRlciBicCA9IChCaW5kaW5nUHJvdmlkZXIpIF9kaXNwYXRjaDsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZGlzcGF0Y2hFbmRwb2ludFVybCA9IChTdHJpbmcpIGJwLmdldFJlcXVlc3RDb250ZXh0KCkuZ2V0KEJpbmRpbmdQcm92aWRlci5FTkRQT0lOVF9BRERSRVNTX1BST1BFUlRZKTsKLSAgICAgICAgICAgICAgICBpZiAoIWRpc3BhdGNoRW5kcG9pbnRVcmwuZXF1YWxzKHByb3h5RW5kcG9pbnRVcmwpKQotICAgICAgICAgICAgICAgICAgICBicC5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dChCaW5kaW5nUHJvdmlkZXIuRU5EUE9JTlRfQUREUkVTU19QUk9QRVJUWSwgcHJveHlFbmRwb2ludFVybCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gX2Rpc3BhdGNoOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRFbmRwb2ludCgpIHsKLSAgICAgICAgICAgIEJpbmRpbmdQcm92aWRlciBicCA9IChCaW5kaW5nUHJvdmlkZXIpIF9wcm94eTsKLSAgICAgICAgICAgIHJldHVybiAoU3RyaW5nKSBicC5nZXRSZXF1ZXN0Q29udGV4dCgpLmdldChCaW5kaW5nUHJvdmlkZXIuRU5EUE9JTlRfQUREUkVTU19QUk9QRVJUWSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRFbmRwb2ludChTdHJpbmcgZW5kcG9pbnRVcmwpIHsKLSAgICAgICAgICAgIEJpbmRpbmdQcm92aWRlciBicCA9IChCaW5kaW5nUHJvdmlkZXIpIF9wcm94eTsKLSAgICAgICAgICAgIGJwLmdldFJlcXVlc3RDb250ZXh0KCkucHV0KEJpbmRpbmdQcm92aWRlci5FTkRQT0lOVF9BRERSRVNTX1BST1BFUlRZLCBlbmRwb2ludFVybCk7Ci0KLSAgICAgICAgICAgIGlmIChfZGlzcGF0Y2ggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGJwID0gKEJpbmRpbmdQcm92aWRlcikgX2Rpc3BhdGNoOwotICAgICAgICAgICAgICAgIGJwLmdldFJlcXVlc3RDb250ZXh0KCkucHV0KEJpbmRpbmdQcm92aWRlci5FTkRQT0lOVF9BRERSRVNTX1BST1BFUlRZLCBlbmRwb2ludFVybCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgUGluZ1NlcnZpY2VQb3J0UHJveHkoKSB7Ci0gICAgICAgIF9kZXNjcmlwdG9yID0gbmV3IERlc2NyaXB0b3IoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUGluZ1NlcnZpY2VQb3J0UHJveHkoVVJMIHdzZGxMb2NhdGlvbikgewotICAgICAgICBfZGVzY3JpcHRvciA9IG5ldyBEZXNjcmlwdG9yKHdzZGxMb2NhdGlvbiwgbmV3IFFOYW1lKCJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL3BpbmcvIiwgIlBpbmdTZXJ2aWNlIikpOwotICAgIH0KLQotICAgIHB1YmxpYyBQaW5nU2VydmljZVBvcnRQcm94eShVUkwgd3NkbExvY2F0aW9uLCBRTmFtZSBzZXJ2aWNlTmFtZSkgewotICAgICAgICBfZGVzY3JpcHRvciA9IG5ldyBEZXNjcmlwdG9yKHdzZGxMb2NhdGlvbiwgc2VydmljZU5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBEZXNjcmlwdG9yIF9nZXREZXNjcmlwdG9yKCkgewotICAgICAgICByZXR1cm4gX2Rlc2NyaXB0b3I7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcGluZ09wZXJhdGlvbihQaW5nU3RyaW5nSW5wdXQgcGFyYW1ldGVyKSB7Ci0gICAgICAgIF9nZXREZXNjcmlwdG9yKCkuZ2V0UHJveHkoKS5waW5nT3BlcmF0aW9uKHBhcmFtZXRlcik7Ci0gICAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy9tYWluL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9jbGllbnQvcGluZy9QaW5nU2VydmljZVBvcnRUeXBlQ2xpZW50LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL21haW4vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL2NsaWVudC9waW5nL1BpbmdTZXJ2aWNlUG9ydFR5cGVDbGllbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ0ZmEzNS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL21haW4vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL2NsaWVudC9waW5nL1BpbmdTZXJ2aWNlUG9ydFR5cGVDbGllbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlcy5jbGllbnQucGluZzsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlcy5waW5nLlBpbmdTdHJpbmdJbnB1dDsKLQotaW1wb3J0IGphdmF4Lmp3cy5PbmV3YXk7Ci1pbXBvcnQgamF2YXguandzLldlYk1ldGhvZDsKLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW07Ci1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7Ci1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmc7Ci1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuUGFyYW1ldGVyU3R5bGU7Ci0KLQotQFdlYlNlcnZpY2UobmFtZSA9ICJQaW5nU2VydmljZVBvcnRUeXBlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvcGluZy8iKQotQFNPQVBCaW5kaW5nKHBhcmFtZXRlclN0eWxlID0gUGFyYW1ldGVyU3R5bGUuQkFSRSkKLXB1YmxpYyBpbnRlcmZhY2UgUGluZ1NlcnZpY2VQb3J0VHlwZUNsaWVudCB7Ci0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBwYXJhbWV0ZXIKLSAgICAgKi8KLSAgICBAV2ViTWV0aG9kKGFjdGlvbiA9ICJwaW5nT3BlcmF0aW9uIikKLSAgICBAT25ld2F5Ci0gICAgcHVibGljIHZvaWQgcGluZ09wZXJhdGlvbigKLSAgICAgICAgICAgIEBXZWJQYXJhbShuYW1lID0gInBpbmdTdHJpbmdJbnB1dCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL3BpbmcvIiwgcGFydE5hbWUgPSAicGFyYW1ldGVyIikKLSAgICAgICAgICAgIFBpbmdTdHJpbmdJbnB1dCBwYXJhbWV0ZXIpOwotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL21haW4vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL2VjaG8vRWNob1NlcnZpY2UxMlBvcnRJbXBsLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL21haW4vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL2VjaG8vRWNob1NlcnZpY2UxMlBvcnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjZDBhNWQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy9tYWluL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9lY2hvL0VjaG9TZXJ2aWNlMTJQb3J0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGVzLmVjaG87Ci0KLWltcG9ydCBqYXZheC54bWwud3MuQmluZGluZ1R5cGU7Ci1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuU09BUEJpbmRpbmc7Ci0KLUBqYXZheC5qd3MuV2ViU2VydmljZShlbmRwb2ludEludGVyZmFjZSA9ICJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZXMuZWNoby5FY2hvU2VydmljZTEyUG9ydFR5cGUiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9lY2hvLyIsIHNlcnZpY2VOYW1lID0gIkVjaG9TZXJ2aWNlMTIiLCBwb3J0TmFtZSA9ICJFY2hvU2VydmljZTEyUG9ydCIsIHdzZGxMb2NhdGlvbiA9ICJXRUItSU5GL3dzZGwvRWNobzEyLndzZGwiKQotQEJpbmRpbmdUeXBlKFNPQVBCaW5kaW5nLlNPQVAxMkhUVFBfQklORElORykKLXB1YmxpYyBjbGFzcyBFY2hvU2VydmljZTEyUG9ydEltcGwgewotCi0gICAgcHVibGljIEVjaG9TdHJpbmdSZXNwb25zZSBlY2hvT3BlcmF0aW9uKEVjaG9TdHJpbmdJbnB1dCBwYXJhbWV0ZXIpIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCI+PiBTRVJWSUNFOiBTRUkgRWNobyBTT0FQMTIgU2VydmljZTogUmVxdWVzdCByZWNlaXZlZC4iKTsKLSAgICAgICAgU3RyaW5nIGlucHV0U3RyaW5nID0gIkZhaWxlZCI7Ci0gICAgICAgIGlmIChwYXJhbWV0ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIj4+IFNFUlZJQ0U6IFNPQVAxMiBFY2hvIElucHV0IFN0cmluZyAnIiArIHBhcmFtZXRlci5lY2hvSW5wdXQgKyAiJyIpOwotICAgICAgICAgICAgICAgIGlucHV0U3RyaW5nID0gcGFyYW1ldGVyLmVjaG9JbnB1dDsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBFY2hvU3RyaW5nUmVzcG9uc2UgcmVzcG9uc2UgPQotICAgICAgICAgICAgICAgIG5ldyBPYmplY3RGYWN0b3J5KCkuY3JlYXRlRWNob1N0cmluZ1Jlc3BvbnNlKCk7Ci0gICAgICAgIHJlc3BvbnNlLmVjaG9SZXNwb25zZSA9ICJTT0FQMTI9PT4+IiArIGlucHV0U3RyaW5nOwotICAgICAgICByZXR1cm4gcmVzcG9uc2U7Ci0gICAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy9tYWluL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9lY2hvL0VjaG9TZXJ2aWNlMTJQb3J0VHlwZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy9tYWluL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9lY2hvL0VjaG9TZXJ2aWNlMTJQb3J0VHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTk0MGE5Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvbWFpbi9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvZWNoby9FY2hvU2VydmljZTEyUG9ydFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlcy5lY2hvOwotCi1pbXBvcnQgamF2YXguandzLldlYk1ldGhvZDsKLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW07Ci1pbXBvcnQgamF2YXguandzLldlYlJlc3VsdDsKLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZzsKLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5QYXJhbWV0ZXJTdHlsZTsKLQotCi1AV2ViU2VydmljZShuYW1lID0gIkVjaG9TZXJ2aWNlMTJQb3J0VHlwZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL2VjaG8vIikKLUBTT0FQQmluZGluZyhwYXJhbWV0ZXJTdHlsZSA9IFBhcmFtZXRlclN0eWxlLkJBUkUpCi1wdWJsaWMgaW50ZXJmYWNlIEVjaG9TZXJ2aWNlMTJQb3J0VHlwZSB7Ci0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBwYXJhbWV0ZXIKLSAgICAgKiBAcmV0dXJuIHJldHVybnMgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGVzLmVjaG8uRWNob1N0cmluZ1Jlc3BvbnNlCi0gICAgICovCi0gICAgQFdlYk1ldGhvZChhY3Rpb24gPSAiZWNob09wZXJhdGlvbiIpCi0gICAgQFdlYlJlc3VsdChuYW1lID0gImVjaG9TdHJpbmdSZXNwb25zZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL2VjaG8vIiwgcGFydE5hbWUgPSAicGFyYW1ldGVyIikKLSAgICBwdWJsaWMgRWNob1N0cmluZ1Jlc3BvbnNlIGVjaG9PcGVyYXRpb24oCi0gICAgICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJlY2hvU3RyaW5nSW5wdXQiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9lY2hvLyIsIHBhcnROYW1lID0gInBhcmFtZXRlciIpCi0gICAgICAgICAgICBFY2hvU3RyaW5nSW5wdXQgcGFyYW1ldGVyKTsKLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy9tYWluL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9lY2hvL0VjaG9TZXJ2aWNlUG9ydEltcGwuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvbWFpbi9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvZWNoby9FY2hvU2VydmljZVBvcnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1N2UyOWYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy9tYWluL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9lY2hvL0VjaG9TZXJ2aWNlUG9ydEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlcy5lY2hvOwotCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7Ci1pbXBvcnQgamF2YXguandzLkhhbmRsZXJDaGFpbjsKLQotCi1AV2ViU2VydmljZShlbmRwb2ludEludGVyZmFjZSA9ICJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZXMuZWNoby5FY2hvU2VydmljZVBvcnRUeXBlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvZWNoby8iLCBzZXJ2aWNlTmFtZSA9ICJFY2hvU2VydmljZSIsIHBvcnROYW1lID0gIkVjaG9TZXJ2aWNlUG9ydCIsIHdzZGxMb2NhdGlvbiA9ICJXRUItSU5GL3dzZGwvRWNoby53c2RsIikKLUBIYW5kbGVyQ2hhaW4oZmlsZT0ibG9naGFuZGxlci54bWwiKQotcHVibGljIGNsYXNzIEVjaG9TZXJ2aWNlUG9ydEltcGwgewotCi0gICAgcHVibGljIEVjaG9TdHJpbmdSZXNwb25zZSBlY2hvT3BlcmF0aW9uKEVjaG9TdHJpbmdJbnB1dCBwYXJhbWV0ZXIpIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCI+PiBTRVJWSUNFOiBTRUkgRWNobyBKQVgtV1MgU2VydmljZTogUmVxdWVzdCByZWNlaXZlZC4iKTsKLSAgICAgICAgU3RyaW5nIGlucHV0U3RyaW5nID0gIkZhaWxlZCI7Ci0gICAgICAgIGlmIChwYXJhbWV0ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIj4+IFNFUlZJQ0U6IFNFSSBFY2hvIElucHV0IFN0cmluZyAnIiArIHBhcmFtZXRlci5lY2hvSW5wdXQgKyAiJyIpOwotICAgICAgICAgICAgICAgIGlucHV0U3RyaW5nID0gcGFyYW1ldGVyLmVjaG9JbnB1dDsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBFY2hvU3RyaW5nUmVzcG9uc2UgcmVzcG9uc2UgPQotICAgICAgICAgICAgICAgIG5ldyBPYmplY3RGYWN0b3J5KCkuY3JlYXRlRWNob1N0cmluZ1Jlc3BvbnNlKCk7Ci0gICAgICAgIHJlc3BvbnNlLmVjaG9SZXNwb25zZSA9ICJKQVgtV1M9PT4+IiArIGlucHV0U3RyaW5nOwotICAgICAgICByZXR1cm4gcmVzcG9uc2U7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvbWFpbi9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvZWNoby9FY2hvU2VydmljZVBvcnRUeXBlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL21haW4vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL2VjaG8vRWNob1NlcnZpY2VQb3J0VHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDJlOTYwLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvbWFpbi9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvZWNoby9FY2hvU2VydmljZVBvcnRUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZXMuZWNobzsKLQotaW1wb3J0IGphdmF4Lmp3cy5XZWJNZXRob2Q7Ci1pbXBvcnQgamF2YXguandzLldlYlBhcmFtOwotaW1wb3J0IGphdmF4Lmp3cy5XZWJSZXN1bHQ7Ci1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7Ci1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmc7Ci1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuUGFyYW1ldGVyU3R5bGU7Ci0KLQotQFdlYlNlcnZpY2UobmFtZSA9ICJFY2hvU2VydmljZVBvcnRUeXBlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvZWNoby8iKQotQFNPQVBCaW5kaW5nKHBhcmFtZXRlclN0eWxlID0gUGFyYW1ldGVyU3R5bGUuQkFSRSkKLXB1YmxpYyBpbnRlcmZhY2UgRWNob1NlcnZpY2VQb3J0VHlwZSB7Ci0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBwYXJhbWV0ZXIKLSAgICAgKiBAcmV0dXJuIHJldHVybnMgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGVzLmVjaG8uRWNob1N0cmluZ1Jlc3BvbnNlCi0gICAgICovCi0gICAgQFdlYk1ldGhvZChhY3Rpb24gPSAiZWNob09wZXJhdGlvbiIpCi0gICAgQFdlYlJlc3VsdChuYW1lID0gImVjaG9TdHJpbmdSZXNwb25zZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL2VjaG8vIiwgcGFydE5hbWUgPSAicGFyYW1ldGVyIikKLSAgICBwdWJsaWMgRWNob1N0cmluZ1Jlc3BvbnNlIGVjaG9PcGVyYXRpb24oCi0gICAgICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJlY2hvU3RyaW5nSW5wdXQiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9lY2hvLyIsIHBhcnROYW1lID0gInBhcmFtZXRlciIpCi0gICAgICAgICAgICBFY2hvU3RyaW5nSW5wdXQgcGFyYW1ldGVyKTsKLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy9tYWluL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9lY2hvL0VjaG9TdHJpbmdJbnB1dC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy9tYWluL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9lY2hvL0VjaG9TdHJpbmdJbnB1dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODIzNDJhLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvbWFpbi9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvZWNoby9FY2hvU3RyaW5nSW5wdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlcy5lY2hvOwotCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50OwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZTsKLQotCi0vKioKLSAqIDxwPkphdmEgY2xhc3MgZm9yIGVjaG9TdHJpbmdJbnB1dCBlbGVtZW50IGRlY2xhcmF0aW9uLgotICogPHAvPgotICogPHA+VGhlIGZvbGxvd2luZyBzY2hlbWEgZnJhZ21lbnQgc3BlY2lmaWVzIHRoZSBleHBlY3RlZCBjb250ZW50IGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBjbGFzcy4KLSAqIDxwLz4KLSAqIDxwcmU+Ci0gKiAmbHQ7ZWxlbWVudCBuYW1lPSJlY2hvU3RyaW5nSW5wdXQiPgotICogICAmbHQ7Y29tcGxleFR5cGU+Ci0gKiAgICAgJmx0O2NvbXBsZXhDb250ZW50PgotICogICAgICAgJmx0O3Jlc3RyaWN0aW9uIGJhc2U9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1hbnlUeXBlIj4KLSAqICAgICAgICAgJmx0O3NlcXVlbmNlPgotICogICAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9ImVjaG9JbnB1dCIgdHlwZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfXN0cmluZyIvPgotICogICAgICAgICAmbHQ7L3NlcXVlbmNlPgotICogICAgICAgJmx0Oy9yZXN0cmljdGlvbj4KLSAqICAgICAmbHQ7L2NvbXBsZXhDb250ZW50PgotICogICAmbHQ7L2NvbXBsZXhUeXBlPgotICogJmx0Oy9lbGVtZW50PgotICogPC9wcmU+Ci0gKi8KLUBYbWxBY2Nlc3NvclR5cGUoWG1sQWNjZXNzVHlwZS5GSUVMRCkKLUBYbWxUeXBlKG5hbWUgPSAiIiwgcHJvcE9yZGVyID0gewotICAgICAgICAiZWNob0lucHV0IgotICAgICAgICB9KQotQFhtbFJvb3RFbGVtZW50KG5hbWUgPSAiZWNob1N0cmluZ0lucHV0IikKLXB1YmxpYyBjbGFzcyBFY2hvU3RyaW5nSW5wdXQgewotCi0gICAgQFhtbEVsZW1lbnQocmVxdWlyZWQgPSB0cnVlKQotICAgIHByb3RlY3RlZCBTdHJpbmcgZWNob0lucHV0OwotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGVjaG9JbnB1dCBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzCi0gICAgICogICAgICAgICB7QGxpbmsgU3RyaW5nIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEVjaG9JbnB1dCgpIHsKLSAgICAgICAgcmV0dXJuIGVjaG9JbnB1dDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZWNob0lucHV0IHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIGFsbG93ZWQgb2JqZWN0IGlzCi0gICAgICogICAgICAgICAgICAgIHtAbGluayBTdHJpbmcgfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEVjaG9JbnB1dChTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5lY2hvSW5wdXQgPSB2YWx1ZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvbWFpbi9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvZWNoby9FY2hvU3RyaW5nUmVzcG9uc2UuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvbWFpbi9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvZWNoby9FY2hvU3RyaW5nUmVzcG9uc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNmMmRmYy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL21haW4vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL2VjaG8vRWNob1N0cmluZ1Jlc3BvbnNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZXMuZWNobzsKLQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSb290RWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGU7Ci0KLQotLyoqCi0gKiA8cD5KYXZhIGNsYXNzIGZvciBlY2hvU3RyaW5nUmVzcG9uc2UgZWxlbWVudCBkZWNsYXJhdGlvbi4KLSAqIDxwLz4KLSAqIDxwPlRoZSBmb2xsb3dpbmcgc2NoZW1hIGZyYWdtZW50IHNwZWNpZmllcyB0aGUgZXhwZWN0ZWQgY29udGVudCBjb250YWluZWQgd2l0aGluIHRoaXMgY2xhc3MuCi0gKiA8cC8+Ci0gKiA8cHJlPgotICogJmx0O2VsZW1lbnQgbmFtZT0iZWNob1N0cmluZ1Jlc3BvbnNlIj4KLSAqICAgJmx0O2NvbXBsZXhUeXBlPgotICogICAgICZsdDtjb21wbGV4Q29udGVudD4KLSAqICAgICAgICZsdDtyZXN0cmljdGlvbiBiYXNlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9YW55VHlwZSI+Ci0gKiAgICAgICAgICZsdDtzZXF1ZW5jZT4KLSAqICAgICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJlY2hvUmVzcG9uc2UiIHR5cGU9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1zdHJpbmciLz4KLSAqICAgICAgICAgJmx0Oy9zZXF1ZW5jZT4KLSAqICAgICAgICZsdDsvcmVzdHJpY3Rpb24+Ci0gKiAgICAgJmx0Oy9jb21wbGV4Q29udGVudD4KLSAqICAgJmx0Oy9jb21wbGV4VHlwZT4KLSAqICZsdDsvZWxlbWVudD4KLSAqIDwvcHJlPgotICovCi1AWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpCi1AWG1sVHlwZShuYW1lID0gIiIsIHByb3BPcmRlciA9IHsKLSAgICAgICAgImVjaG9SZXNwb25zZSIKLSAgICAgICAgfSkKLUBYbWxSb290RWxlbWVudChuYW1lID0gImVjaG9TdHJpbmdSZXNwb25zZSIpCi1wdWJsaWMgY2xhc3MgRWNob1N0cmluZ1Jlc3BvbnNlIHsKLQotICAgIEBYbWxFbGVtZW50KHJlcXVpcmVkID0gdHJ1ZSkKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGVjaG9SZXNwb25zZTsKLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBlY2hvUmVzcG9uc2UgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHBvc3NpYmxlIG9iamVjdCBpcwotICAgICAqICAgICAgICAge0BsaW5rIFN0cmluZyB9Ci0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRFY2hvUmVzcG9uc2UoKSB7Ci0gICAgICAgIHJldHVybiBlY2hvUmVzcG9uc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGVjaG9SZXNwb25zZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcwotICAgICAqICAgICAgICAgICAgICB7QGxpbmsgU3RyaW5nIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRFY2hvUmVzcG9uc2UoU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMuZWNob1Jlc3BvbnNlID0gdmFsdWU7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL21haW4vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL2VjaG8vT2JqZWN0RmFjdG9yeS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy9tYWluL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9lY2hvL09iamVjdEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzIzNzRlZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL21haW4vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL2VjaG8vT2JqZWN0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGVzLmVjaG87Ci0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJlZ2lzdHJ5OwotCi0KLS8qKgotICogVGhpcyBvYmplY3QgY29udGFpbnMgZmFjdG9yeSBtZXRob2RzIGZvciBlYWNoCi0gKiBKYXZhIGNvbnRlbnQgaW50ZXJmYWNlIGFuZCBKYXZhIGVsZW1lbnQgaW50ZXJmYWNlCi0gKiBnZW5lcmF0ZWQgaW4gdGhlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlcy5lY2hvIHBhY2thZ2UuCi0gKiA8cD5BbiBPYmplY3RGYWN0b3J5IGFsbG93cyB5b3UgdG8gcHJvZ3JhbWF0aWNhbGx5Ci0gKiBjb25zdHJ1Y3QgbmV3IGluc3RhbmNlcyBvZiB0aGUgSmF2YSByZXByZXNlbnRhdGlvbgotICogZm9yIFhNTCBjb250ZW50LiBUaGUgSmF2YSByZXByZXNlbnRhdGlvbiBvZiBYTUwKLSAqIGNvbnRlbnQgY2FuIGNvbnNpc3Qgb2Ygc2NoZW1hIGRlcml2ZWQgaW50ZXJmYWNlcwotICogYW5kIGNsYXNzZXMgcmVwcmVzZW50aW5nIHRoZSBiaW5kaW5nIG9mIHNjaGVtYQotICogdHlwZSBkZWZpbml0aW9ucywgZWxlbWVudCBkZWNsYXJhdGlvbnMgYW5kIG1vZGVsCi0gKiBncm91cHMuICBGYWN0b3J5IG1ldGhvZHMgZm9yIGVhY2ggb2YgdGhlc2UgYXJlCi0gKiBwcm92aWRlZCBpbiB0aGlzIGNsYXNzLgotICovCi1AWG1sUmVnaXN0cnkKLXB1YmxpYyBjbGFzcyBPYmplY3RGYWN0b3J5IHsKLQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbmV3IE9iamVjdEZhY3RvcnkgdGhhdCBjYW4gYmUgdXNlZCB0byBjcmVhdGUgbmV3IGluc3RhbmNlcyBvZiBzY2hlbWEgZGVyaXZlZCBjbGFzc2VzIGZvciBwYWNrYWdlOiBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZXMuZWNobwotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3RGYWN0b3J5KCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgRWNob1N0cmluZ1Jlc3BvbnNlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgRWNob1N0cmluZ1Jlc3BvbnNlIGNyZWF0ZUVjaG9TdHJpbmdSZXNwb25zZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBFY2hvU3RyaW5nUmVzcG9uc2UoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEVjaG9TdHJpbmdJbnB1dCB9Ci0gICAgICovCi0gICAgcHVibGljIEVjaG9TdHJpbmdJbnB1dCBjcmVhdGVFY2hvU3RyaW5nSW5wdXQoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgRWNob1N0cmluZ0lucHV0KCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL21haW4vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL2VjaG8vcGFja2FnZS1pbmZvLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL21haW4vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL2VjaG8vcGFja2FnZS1pbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwYWEzYmEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy9tYWluL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9lY2hvL3BhY2thZ2UtaW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLUBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFNjaGVtYShuYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9lY2hvLyIpIHBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGVzLmVjaG87CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL21haW4vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL2hhbmRsZXIvTG9nZ2luZ1NPQVBIYW5kbGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL21haW4vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL2hhbmRsZXIvTG9nZ2luZ1NPQVBIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmZmViMzQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy9tYWluL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9oYW5kbGVyL0xvZ2dpbmdTT0FQSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGVzLmhhbmRsZXI7DQotDQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBNZXNzYWdlOw0KLWltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5NZXNzYWdlQ29udGV4dDsNCi1pbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuc29hcC5TT0FQSGFuZGxlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuc29hcC5TT0FQTWVzc2FnZUNvbnRleHQ7DQotaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotDQotcHVibGljIGNsYXNzIExvZ2dpbmdTT0FQSGFuZGxlciBpbXBsZW1lbnRzIFNPQVBIYW5kbGVyPFNPQVBNZXNzYWdlQ29udGV4dD4gew0KLQ0KLSAgICBwcml2YXRlIFByaW50U3RyZWFtIG91dDsNCi0NCi0gICAgcHVibGljIExvZ2dpbmdTT0FQSGFuZGxlcigpIHsNCi0gICAgICAgIHNldExvZ1N0cmVhbShTeXN0ZW0ub3V0KTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBzZXRMb2dTdHJlYW0oUHJpbnRTdHJlYW0gcHMpIHsNCi0gICAgICAgIG91dCA9IHBzOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGluaXQoTWFwIGMpIHsNCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTG9nZ2luZ0hhbmRsZXIgOiBpbml0KCkgQ2FsbGVkLi4uLiIpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTZXQ8UU5hbWU+IGdldEhlYWRlcnMoKSB7DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYW5kbGVNZXNzYWdlKFNPQVBNZXNzYWdlQ29udGV4dCBzbWMpIHsNCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTG9nZ2luZ0hhbmRsZXIgOiBoYW5kbGVNZXNzYWdlIENhbGxlZC4uLi4iKTsNCi0gICAgICAgIGxvZ1RvU3lzdGVtT3V0KHNtYyk7DQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYW5kbGVGYXVsdChTT0FQTWVzc2FnZUNvbnRleHQgc21jKSB7DQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkxvZ2dpbmdIYW5kbGVyIDogaGFuZGxlRmF1bHQgQ2FsbGVkLi4uLiIpOw0KLSAgICAgICAgbG9nVG9TeXN0ZW1PdXQoc21jKTsNCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIC8vIG5vdGhpbmcgdG8gY2xlYW4gdXANCi0gICAgcHVibGljIHZvaWQgY2xvc2UoTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQpIHsNCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTG9nZ2luZ0hhbmRsZXIgOiBjbG9zZSgpIENhbGxlZC4uLi4iKTsNCi0gICAgfQ0KLQ0KLSAgICAvLyBub3RoaW5nIHRvIGNsZWFuIHVwDQotICAgIHB1YmxpYyB2b2lkIGRlc3Ryb3koKSB7DQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkxvZ2dpbmdIYW5kbGVyIDogZGVzdHJveSgpIENhbGxlZC4uLi4iKTsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiBDaGVjayB0aGUgTUVTU0FHRV9PVVRCT1VORF9QUk9QRVJUWSBpbiB0aGUgY29udGV4dA0KLSAgICAgKiB0byBzZWUgaWYgdGhpcyBpcyBhbiBvdXRnb2luZyBvciBpbmNvbWluZyBtZXNzYWdlLg0KLSAgICAgKiBXcml0ZSBhIGJyaWVmIG1lc3NhZ2UgdG8gdGhlIHByaW50IHN0cmVhbSBhbmQNCi0gICAgICogb3V0cHV0IHRoZSBtZXNzYWdlLiBUaGUgd3JpdGVUbygpIG1ldGhvZCBjYW4gdGhyb3cNCi0gICAgICogU09BUEV4Y2VwdGlvbiBvciBJT0V4Y2VwdGlvbg0KLSAgICAgKi8NCi0gICAgcHJvdGVjdGVkIHZvaWQgbG9nVG9TeXN0ZW1PdXQoU09BUE1lc3NhZ2VDb250ZXh0IHNtYykgew0KLSAgICAgICAgQm9vbGVhbiBvdXRib3VuZFByb3BlcnR5ID0gKEJvb2xlYW4pDQotICAgICAgICAgICAgICAgIHNtYy5nZXQoTWVzc2FnZUNvbnRleHQuTUVTU0FHRV9PVVRCT1VORF9QUk9QRVJUWSk7DQotICAgICAgICBvdXQucHJpbnRsbigiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKTsNCi0gICAgICAgIGlmIChvdXRib3VuZFByb3BlcnR5LmJvb2xlYW5WYWx1ZSgpKSB7DQotICAgICAgICAgICAgb3V0LnByaW50bG4oIk91dGJvdW5kIG1lc3NhZ2U6Iik7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIG91dC5wcmludGxuKCJJbmJvdW5kIG1lc3NhZ2U6Iik7DQotICAgICAgICB9DQotDQotICAgICAgICBTT0FQTWVzc2FnZSBtZXNzYWdlID0gc21jLmdldE1lc3NhZ2UoKTsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgbWVzc2FnZS53cml0ZVRvKG91dCk7DQotICAgICAgICAgICAgb3V0LnByaW50bG4oKTsNCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgb3V0LnByaW50bG4oIkV4Y2VwdGlvbiBpbiBoYW5kbGVyOiAiICsgZSk7DQotICAgICAgICB9DQotICAgICAgICBvdXQucHJpbnRsbigiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL21haW4vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL210b20vSW1hZ2VEZXBvdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy9tYWluL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9tdG9tL0ltYWdlRGVwb3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2E4ZDAxYy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL21haW4vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL210b20vSW1hZ2VEZXBvdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZXMubXRvbTsKLQotaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXI7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbE1pbWVUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZTsKLQotCi0vKioKLSAqIDxwPkphdmEgY2xhc3MgZm9yIEltYWdlRGVwb3QgY29tcGxleCB0eXBlLgotICogPHAvPgotICogPHA+VGhlIGZvbGxvd2luZyBzY2hlbWEgZnJhZ21lbnQgc3BlY2lmaWVzIHRoZSBleHBlY3RlZCBjb250ZW50IGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBjbGFzcy4KLSAqIDxwLz4KLSAqIDxwcmU+Ci0gKiAmbHQ7Y29tcGxleFR5cGUgbmFtZT0iSW1hZ2VEZXBvdCI+Ci0gKiAgICZsdDtjb21wbGV4Q29udGVudD4KLSAqICAgICAmbHQ7cmVzdHJpY3Rpb24gYmFzZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfWFueVR5cGUiPgotICogICAgICAgJmx0O3NlcXVlbmNlPgotICogICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJpbWFnZURhdGEiIHR5cGU9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1iYXNlNjRCaW5hcnkiLz4KLSAqICAgICAgICZsdDsvc2VxdWVuY2U+Ci0gKiAgICAgJmx0Oy9yZXN0cmljdGlvbj4KLSAqICAgJmx0Oy9jb21wbGV4Q29udGVudD4KLSAqICZsdDsvY29tcGxleFR5cGU+Ci0gKiA8L3ByZT4KLSAqLwotQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKQotQFhtbFR5cGUobmFtZSA9ICJJbWFnZURlcG90IiwgbmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvbXRvbS8iLCBwcm9wT3JkZXIgPSB7Ci0gICAgICAgICJpbWFnZURhdGEiCi0gICAgICAgIH0pCi1wdWJsaWMgY2xhc3MgSW1hZ2VEZXBvdCB7Ci0KLSAgICBAWG1sRWxlbWVudChyZXF1aXJlZCA9IHRydWUpCi0gICAgQFhtbE1pbWVUeXBlKCJtdWx0aXBhcnQvKiIpCi0gICAgcHJvdGVjdGVkIERhdGFIYW5kbGVyIGltYWdlRGF0YTsKLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBpbWFnZURhdGEgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHBvc3NpYmxlIG9iamVjdCBpcwotICAgICAqICAgICAgICAge0BsaW5rIERhdGFIYW5kbGVyIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgRGF0YUhhbmRsZXIgZ2V0SW1hZ2VEYXRhKCkgewotICAgICAgICByZXR1cm4gaW1hZ2VEYXRhOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBpbWFnZURhdGEgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgYWxsb3dlZCBvYmplY3QgaXMKLSAgICAgKiAgICAgICAgICAgICAge0BsaW5rIERhdGFIYW5kbGVyIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJbWFnZURhdGEoRGF0YUhhbmRsZXIgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5pbWFnZURhdGEgPSB2YWx1ZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvbWFpbi9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvbXRvbS9NdG9tU2FtcGxlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL21haW4vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL210b20vTXRvbVNhbXBsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTRkMjQ2Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvbWFpbi9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvbXRvbS9NdG9tU2FtcGxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZXMubXRvbTsKLQotaW1wb3J0IGphdmF4Lmp3cy5XZWJNZXRob2Q7Ci1pbXBvcnQgamF2YXguandzLldlYlBhcmFtOwotaW1wb3J0IGphdmF4Lmp3cy5XZWJSZXN1bHQ7Ci1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7Ci1pbXBvcnQgamF2YXgueG1sLndzLlJlcXVlc3RXcmFwcGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5SZXNwb25zZVdyYXBwZXI7Ci0KLQotQFdlYlNlcnZpY2UobmFtZSA9ICJNdG9tU2FtcGxlU2VydmljZSIsCi0gICAgICAgIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL210b20vIiwKLSAgICAgICAgd3NkbExvY2F0aW9uID0gIldFQi1JTkYvd3NkbC9JbWFnZURlcG90LndzZGwiKQotcHVibGljIGludGVyZmFjZSBNdG9tU2FtcGxlIHsKLQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGlucHV0Ci0gICAgICogQHJldHVybiByZXR1cm5zIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlcy5tdG9tLkltYWdlRGVwb3QKLSAgICAgKi8KLSAgICBAV2ViTWV0aG9kKGFjdGlvbiA9ICJzZW5kSW1hZ2UiKQotICAgIEBXZWJSZXN1bHQobmFtZSA9ICJvdXRwdXQiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9tdG9tLyIpCi0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJzZW5kSW1hZ2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9tdG9tLyIsIGNsYXNzTmFtZSA9ICJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZXMubXRvbS5TZW5kSW1hZ2UiKQotICAgIEBSZXNwb25zZVdyYXBwZXIobG9jYWxOYW1lID0gInNlbmRJbWFnZVJlc3BvbnNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvbXRvbS8iLCBjbGFzc05hbWUgPSAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGVzLm10b20uU2VuZEltYWdlUmVzcG9uc2UiKQotICAgIHB1YmxpYyBJbWFnZURlcG90IHNlbmRJbWFnZSgKLSAgICAgICAgICAgIEBXZWJQYXJhbShuYW1lID0gImlucHV0IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvbXRvbS8iKQotICAgICAgICAgICAgSW1hZ2VEZXBvdCBpbnB1dCk7Ci0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy9tYWluL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9tdG9tL010b21TYW1wbGUxMi5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy9tYWluL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9tdG9tL010b21TYW1wbGUxMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2ZjZGY0Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvbWFpbi9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvbXRvbS9NdG9tU2FtcGxlMTIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGVzLm10b207Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViTWV0aG9kOwotaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbTsKLWltcG9ydCBqYXZheC5qd3MuV2ViUmVzdWx0OwotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOwotaW1wb3J0IGphdmF4LnhtbC53cy5SZXF1ZXN0V3JhcHBlcjsKLWltcG9ydCBqYXZheC54bWwud3MuUmVzcG9uc2VXcmFwcGVyOwotCi0KLUBXZWJTZXJ2aWNlKG5hbWUgPSAiTXRvbVNhbXBsZVNlcnZpY2UxMiIsCi0gICAgICAgIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL210b20vIikKLXB1YmxpYyBpbnRlcmZhY2UgTXRvbVNhbXBsZTEyIHsKLQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGlucHV0Ci0gICAgICogQHJldHVybiByZXR1cm5zIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlcy5tdG9tLkltYWdlRGVwb3QKLSAgICAgKi8KLSAgICBAV2ViTWV0aG9kKGFjdGlvbiA9ICJzZW5kSW1hZ2UiKQotICAgIEBXZWJSZXN1bHQobmFtZSA9ICJvdXRwdXQiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9tdG9tLyIpCi0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJzZW5kSW1hZ2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9tdG9tLyIsIGNsYXNzTmFtZSA9ICJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZXMubXRvbS5TZW5kSW1hZ2UiKQotICAgIEBSZXNwb25zZVdyYXBwZXIobG9jYWxOYW1lID0gInNlbmRJbWFnZVJlc3BvbnNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvbXRvbS8iLCBjbGFzc05hbWUgPSAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGVzLm10b20uU2VuZEltYWdlUmVzcG9uc2UiKQotICAgIHB1YmxpYyBJbWFnZURlcG90IHNlbmRJbWFnZSgKLSAgICAgICAgICAgIEBXZWJQYXJhbShuYW1lID0gImlucHV0IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvbXRvbS8iKQotICAgICAgICAgICAgSW1hZ2VEZXBvdCBpbnB1dCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvbWFpbi9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvbXRvbS9NdG9tU2FtcGxlMTJQb3J0SW1wbC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy9tYWluL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9tdG9tL010b21TYW1wbGUxMlBvcnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwY2M1ZDcuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy9tYWluL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9tdG9tL010b21TYW1wbGUxMlBvcnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlcy5tdG9tOwotCi1AamF2YXguandzLldlYlNlcnZpY2UoZW5kcG9pbnRJbnRlcmZhY2UgPSAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGVzLm10b20uTXRvbVNhbXBsZTEyIiwKLSAgICAgICAgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvbXRvbS8iLAotICAgICAgICBzZXJ2aWNlTmFtZSA9ICJNdG9tU2FtcGxlU2VydmljZTEyIiwKLSAgICAgICAgcG9ydE5hbWUgPSAiTXRvbVNhbXBsZVBvcnQiLAotICAgICAgICB3c2RsTG9jYXRpb24gPSAiV0VCLUlORi93c2RsL0ltYWdlRGVwb3QxMi53c2RsIikKLUBqYXZheC54bWwud3MuQmluZGluZ1R5cGUodmFsdWUgPSBqYXZheC54bWwud3Muc29hcC5TT0FQQmluZGluZy5TT0FQMTJIVFRQX01UT01fQklORElORykKLXB1YmxpYyBjbGFzcyBNdG9tU2FtcGxlMTJQb3J0SW1wbCB7Ci0KLSAgICBwdWJsaWMgSW1hZ2VEZXBvdCBzZW5kSW1hZ2UoSW1hZ2VEZXBvdCBpbnB1dCkgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIj4+TVRPTSBTT0FQIDEuMiByZXF1ZXN0IHJlY2VpdmVkLCB0eXBlID0gIiArIGlucHV0LmdldEltYWdlRGF0YSgpLmdldENvbnRlbnRUeXBlKCkpOwotICAgICAgICByZXR1cm4gaW5wdXQ7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvbWFpbi9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvbXRvbS9NdG9tU2FtcGxlUG9ydEltcGwuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvbWFpbi9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvbXRvbS9NdG9tU2FtcGxlUG9ydEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk2NzcxYy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL21haW4vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL210b20vTXRvbVNhbXBsZVBvcnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlcy5tdG9tOwotCi1AamF2YXguandzLldlYlNlcnZpY2UoZW5kcG9pbnRJbnRlcmZhY2UgPSAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGVzLm10b20uTXRvbVNhbXBsZSIsCi0gICAgICAgIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL210b20vIiwKLSAgICAgICAgc2VydmljZU5hbWUgPSAiTXRvbVNhbXBsZVNlcnZpY2UiLAotICAgICAgICBwb3J0TmFtZSA9ICJNdG9tU2FtcGxlUG9ydCIsCi0gICAgICAgIHdzZGxMb2NhdGlvbiA9ICJXRUItSU5GL3dzZGwvSW1hZ2VEZXBvdC53c2RsIikKLUBqYXZheC54bWwud3MuQmluZGluZ1R5cGUodmFsdWUgPSBqYXZheC54bWwud3Muc29hcC5TT0FQQmluZGluZy5TT0FQMTFIVFRQX01UT01fQklORElORykKLXB1YmxpYyBjbGFzcyBNdG9tU2FtcGxlUG9ydEltcGwgewotCi0gICAgcHVibGljIEltYWdlRGVwb3Qgc2VuZEltYWdlKEltYWdlRGVwb3QgaW5wdXQpIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCI+Pk1UT00gU09BUCAxLjEgcmVxdWVzdCByZWNlaXZlZCwgdHlwZSA9ICIgKyBpbnB1dC5nZXRJbWFnZURhdGEoKS5nZXRDb250ZW50VHlwZSgpKTsKLSAgICAgICAgcmV0dXJuIGlucHV0OwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL21haW4vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL210b20vT2JqZWN0RmFjdG9yeS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy9tYWluL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9tdG9tL09iamVjdEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJjOTRiYS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL21haW4vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL210b20vT2JqZWN0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZXMubXRvbTsKLQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUmVnaXN0cnk7Ci0KLQotLyoqCi0gKiBUaGlzIG9iamVjdCBjb250YWlucyBmYWN0b3J5IG1ldGhvZHMgZm9yIGVhY2gKLSAqIEphdmEgY29udGVudCBpbnRlcmZhY2UgYW5kIEphdmEgZWxlbWVudCBpbnRlcmZhY2UKLSAqIGdlbmVyYXRlZCBpbiB0aGUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGVzLm10b20gcGFja2FnZS4KLSAqIDxwPkFuIE9iamVjdEZhY3RvcnkgYWxsb3dzIHlvdSB0byBwcm9ncmFtYXRpY2FsbHkKLSAqIGNvbnN0cnVjdCBuZXcgaW5zdGFuY2VzIG9mIHRoZSBKYXZhIHJlcHJlc2VudGF0aW9uCi0gKiBmb3IgWE1MIGNvbnRlbnQuIFRoZSBKYXZhIHJlcHJlc2VudGF0aW9uIG9mIFhNTAotICogY29udGVudCBjYW4gY29uc2lzdCBvZiBzY2hlbWEgZGVyaXZlZCBpbnRlcmZhY2VzCi0gKiBhbmQgY2xhc3NlcyByZXByZXNlbnRpbmcgdGhlIGJpbmRpbmcgb2Ygc2NoZW1hCi0gKiB0eXBlIGRlZmluaXRpb25zLCBlbGVtZW50IGRlY2xhcmF0aW9ucyBhbmQgbW9kZWwKLSAqIGdyb3Vwcy4gIEZhY3RvcnkgbWV0aG9kcyBmb3IgZWFjaCBvZiB0aGVzZSBhcmUKLSAqIHByb3ZpZGVkIGluIHRoaXMgY2xhc3MuCi0gKi8KLUBYbWxSZWdpc3RyeQotcHVibGljIGNsYXNzIE9iamVjdEZhY3RvcnkgewotCi0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBuZXcgT2JqZWN0RmFjdG9yeSB0aGF0IGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBuZXcgaW5zdGFuY2VzIG9mIHNjaGVtYSBkZXJpdmVkIGNsYXNzZXMgZm9yIHBhY2thZ2U6IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlcy5tdG9tCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdEZhY3RvcnkoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBTZW5kSW1hZ2UgfQotICAgICAqLwotICAgIHB1YmxpYyBTZW5kSW1hZ2UgY3JlYXRlU2VuZEltYWdlKCkgewotICAgICAgICByZXR1cm4gbmV3IFNlbmRJbWFnZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgU2VuZEltYWdlUmVzcG9uc2UgfQotICAgICAqLwotICAgIHB1YmxpYyBTZW5kSW1hZ2VSZXNwb25zZSBjcmVhdGVTZW5kSW1hZ2VSZXNwb25zZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTZW5kSW1hZ2VSZXNwb25zZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgSW1hZ2VEZXBvdCB9Ci0gICAgICovCi0gICAgcHVibGljIEltYWdlRGVwb3QgY3JlYXRlSW1hZ2VEZXBvdCgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBJbWFnZURlcG90KCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL21haW4vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL210b20vU2VuZEltYWdlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL21haW4vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL210b20vU2VuZEltYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4ODkzYjQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy9tYWluL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9tdG9tL1NlbmRJbWFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZXMubXRvbTsKLQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50OwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZTsKLQotCi0vKioKLSAqIDxwPkphdmEgY2xhc3MgZm9yIGFub255bW91cyBjb21wbGV4IHR5cGUuCi0gKiA8cC8+Ci0gKiA8cD5UaGUgZm9sbG93aW5nIHNjaGVtYSBmcmFnbWVudCBzcGVjaWZpZXMgdGhlIGV4cGVjdGVkIGNvbnRlbnQgY29udGFpbmVkIHdpdGhpbiB0aGlzIGNsYXNzLgotICogPHAvPgotICogPHByZT4KLSAqICZsdDtjb21wbGV4VHlwZT4KLSAqICAgJmx0O2NvbXBsZXhDb250ZW50PgotICogICAgICZsdDtyZXN0cmljdGlvbiBiYXNlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9YW55VHlwZSI+Ci0gKiAgICAgICAmbHQ7c2VxdWVuY2U+Ci0gKiAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9ImlucHV0IiB0eXBlPSJ7aHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9tdG9tL31JbWFnZURlcG90IiBtaW5PY2N1cnM9IjAiLz4KLSAqICAgICAgICZsdDsvc2VxdWVuY2U+Ci0gKiAgICAgJmx0Oy9yZXN0cmljdGlvbj4KLSAqICAgJmx0Oy9jb21wbGV4Q29udGVudD4KLSAqICZsdDsvY29tcGxleFR5cGU+Ci0gKiA8L3ByZT4KLSAqLwotQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKQotQFhtbFR5cGUobmFtZSA9ICIiLCBwcm9wT3JkZXIgPSB7Ci0gICAgICAgICJpbnB1dCIKLSAgICAgICAgfSkKLUBYbWxSb290RWxlbWVudChuYW1lID0gInNlbmRJbWFnZSIpCi1wdWJsaWMgY2xhc3MgU2VuZEltYWdlIHsKLQotICAgIHByb3RlY3RlZCBJbWFnZURlcG90IGlucHV0OwotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGlucHV0IHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiBwb3NzaWJsZSBvYmplY3QgaXMKLSAgICAgKiAgICAgICAgIHtAbGluayBJbWFnZURlcG90IH0KLSAgICAgKi8KLSAgICBwdWJsaWMgSW1hZ2VEZXBvdCBnZXRJbnB1dCgpIHsKLSAgICAgICAgcmV0dXJuIGlucHV0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBpbnB1dCBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcwotICAgICAqICAgICAgICAgICAgICB7QGxpbmsgSW1hZ2VEZXBvdCB9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SW5wdXQoSW1hZ2VEZXBvdCB2YWx1ZSkgewotICAgICAgICB0aGlzLmlucHV0ID0gdmFsdWU7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL21haW4vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL210b20vU2VuZEltYWdlUmVzcG9uc2UuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvbWFpbi9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvbXRvbS9TZW5kSW1hZ2VSZXNwb25zZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWM4M2JkLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvbWFpbi9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvbXRvbS9TZW5kSW1hZ2VSZXNwb25zZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZXMubXRvbTsKLQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50OwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZTsKLQotCi0vKioKLSAqIDxwPkphdmEgY2xhc3MgZm9yIGFub255bW91cyBjb21wbGV4IHR5cGUuCi0gKiA8cC8+Ci0gKiA8cD5UaGUgZm9sbG93aW5nIHNjaGVtYSBmcmFnbWVudCBzcGVjaWZpZXMgdGhlIGV4cGVjdGVkIGNvbnRlbnQgY29udGFpbmVkIHdpdGhpbiB0aGlzIGNsYXNzLgotICogPHAvPgotICogPHByZT4KLSAqICZsdDtjb21wbGV4VHlwZT4KLSAqICAgJmx0O2NvbXBsZXhDb250ZW50PgotICogICAgICZsdDtyZXN0cmljdGlvbiBiYXNlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9YW55VHlwZSI+Ci0gKiAgICAgICAmbHQ7c2VxdWVuY2U+Ci0gKiAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9Im91dHB1dCIgdHlwZT0ie2h0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvbXRvbS99SW1hZ2VEZXBvdCIgbWluT2NjdXJzPSIwIi8+Ci0gKiAgICAgICAmbHQ7L3NlcXVlbmNlPgotICogICAgICZsdDsvcmVzdHJpY3Rpb24+Ci0gKiAgICZsdDsvY29tcGxleENvbnRlbnQ+Ci0gKiAmbHQ7L2NvbXBsZXhUeXBlPgotICogPC9wcmU+Ci0gKi8KLUBYbWxBY2Nlc3NvclR5cGUoWG1sQWNjZXNzVHlwZS5GSUVMRCkKLUBYbWxUeXBlKG5hbWUgPSAiIiwgcHJvcE9yZGVyID0gewotICAgICAgICAib3V0cHV0IgotICAgICAgICB9KQotQFhtbFJvb3RFbGVtZW50KG5hbWUgPSAic2VuZEltYWdlUmVzcG9uc2UiKQotcHVibGljIGNsYXNzIFNlbmRJbWFnZVJlc3BvbnNlIHsKLQotICAgIHByb3RlY3RlZCBJbWFnZURlcG90IG91dHB1dDsKLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBvdXRwdXQgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHBvc3NpYmxlIG9iamVjdCBpcwotICAgICAqICAgICAgICAge0BsaW5rIEltYWdlRGVwb3QgfQotICAgICAqLwotICAgIHB1YmxpYyBJbWFnZURlcG90IGdldE91dHB1dCgpIHsKLSAgICAgICAgcmV0dXJuIG91dHB1dDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgb3V0cHV0IHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIGFsbG93ZWQgb2JqZWN0IGlzCi0gICAgICogICAgICAgICAgICAgIHtAbGluayBJbWFnZURlcG90IH0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRPdXRwdXQoSW1hZ2VEZXBvdCB2YWx1ZSkgewotICAgICAgICB0aGlzLm91dHB1dCA9IHZhbHVlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy9tYWluL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9tdG9tL3BhY2thZ2UtaW5mby5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy9tYWluL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9tdG9tL3BhY2thZ2UtaW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTUxNTMzLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvbWFpbi9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvbXRvbS9wYWNrYWdlLWluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLUBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFNjaGVtYShuYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9tdG9tLyIsIGVsZW1lbnRGb3JtRGVmYXVsdCA9IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sTnNGb3JtLlFVQUxJRklFRCkgcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZXMubXRvbTsKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvbWFpbi9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvcGluZy9PYmplY3RGYWN0b3J5LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL21haW4vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL3BpbmcvT2JqZWN0RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTIyNGQ5Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvbWFpbi9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvcGluZy9PYmplY3RGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZXMucGluZzsKLQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUmVnaXN0cnk7Ci0KLQotLyoqCi0gKiBUaGlzIG9iamVjdCBjb250YWlucyBmYWN0b3J5IG1ldGhvZHMgZm9yIGVhY2gKLSAqIEphdmEgY29udGVudCBpbnRlcmZhY2UgYW5kIEphdmEgZWxlbWVudCBpbnRlcmZhY2UKLSAqIGdlbmVyYXRlZCBpbiB0aGUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGVzLnBpbmcgcGFja2FnZS4KLSAqIDxwPkFuIE9iamVjdEZhY3RvcnkgYWxsb3dzIHlvdSB0byBwcm9ncmFtYXRpY2FsbHkKLSAqIGNvbnN0cnVjdCBuZXcgaW5zdGFuY2VzIG9mIHRoZSBKYXZhIHJlcHJlc2VudGF0aW9uCi0gKiBmb3IgWE1MIGNvbnRlbnQuIFRoZSBKYXZhIHJlcHJlc2VudGF0aW9uIG9mIFhNTAotICogY29udGVudCBjYW4gY29uc2lzdCBvZiBzY2hlbWEgZGVyaXZlZCBpbnRlcmZhY2VzCi0gKiBhbmQgY2xhc3NlcyByZXByZXNlbnRpbmcgdGhlIGJpbmRpbmcgb2Ygc2NoZW1hCi0gKiB0eXBlIGRlZmluaXRpb25zLCBlbGVtZW50IGRlY2xhcmF0aW9ucyBhbmQgbW9kZWwKLSAqIGdyb3Vwcy4gIEZhY3RvcnkgbWV0aG9kcyBmb3IgZWFjaCBvZiB0aGVzZSBhcmUKLSAqIHByb3ZpZGVkIGluIHRoaXMgY2xhc3MuCi0gKi8KLUBYbWxSZWdpc3RyeQotcHVibGljIGNsYXNzIE9iamVjdEZhY3RvcnkgewotCi0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBuZXcgT2JqZWN0RmFjdG9yeSB0aGF0IGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBuZXcgaW5zdGFuY2VzIG9mIHNjaGVtYSBkZXJpdmVkIGNsYXNzZXMgZm9yIHBhY2thZ2U6IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlcy5waW5nCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdEZhY3RvcnkoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBQaW5nU3RyaW5nSW5wdXQgfQotICAgICAqLwotICAgIHB1YmxpYyBQaW5nU3RyaW5nSW5wdXQgY3JlYXRlUGluZ1N0cmluZ0lucHV0KCkgewotICAgICAgICByZXR1cm4gbmV3IFBpbmdTdHJpbmdJbnB1dCgpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy9tYWluL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9waW5nL1BpbmdTZXJ2aWNlMTJQb3J0SW1wbC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy9tYWluL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9waW5nL1BpbmdTZXJ2aWNlMTJQb3J0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjhjMDcyLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvbWFpbi9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvcGluZy9QaW5nU2VydmljZTEyUG9ydEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlcy5waW5nOwotCi1pbXBvcnQgamF2YXgueG1sLndzLkJpbmRpbmdUeXBlOwotaW1wb3J0IGphdmF4LnhtbC53cy5zb2FwLlNPQVBCaW5kaW5nOwotCi0KLUBqYXZheC5qd3MuV2ViU2VydmljZShlbmRwb2ludEludGVyZmFjZSA9ICJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZXMucGluZy5QaW5nU2VydmljZTEyUG9ydFR5cGUiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9waW5nLyIsIHNlcnZpY2VOYW1lID0gIlBpbmdTZXJ2aWNlMTIiLCBwb3J0TmFtZSA9ICJQaW5nU2VydmljZTEyUG9ydCIsIHdzZGxMb2NhdGlvbiA9ICJXRUItSU5GL3dzZGwvUGluZzEyLndzZGwiKQotQEJpbmRpbmdUeXBlKFNPQVBCaW5kaW5nLlNPQVAxMkhUVFBfQklORElORykKLXB1YmxpYyBjbGFzcyBQaW5nU2VydmljZTEyUG9ydEltcGwgewotCi0gICAgcHVibGljIHZvaWQgcGluZ09wZXJhdGlvbihQaW5nU3RyaW5nSW5wdXQgcGFyYW1ldGVyKSB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiPj4gU0VSVklDRTogU0VJIFBpbmcgU09BUDEyIFNlcnZpY2U6IFJlcXVlc3QgcmVjZWl2ZWQuIik7Ci0gICAgICAgIGlmIChwYXJhbWV0ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIj4+IFNFUlZJQ0U6IFNPQVAxMiBQaW5nIElucHV0IFN0cmluZyAnIiArIHBhcmFtZXRlci5waW5nSW5wdXQgKyAiJyIpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy9tYWluL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9waW5nL1BpbmdTZXJ2aWNlMTJQb3J0VHlwZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy9tYWluL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9waW5nL1BpbmdTZXJ2aWNlMTJQb3J0VHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Yjk2ZWUwLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvbWFpbi9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvcGluZy9QaW5nU2VydmljZTEyUG9ydFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlcy5waW5nOwotCi1pbXBvcnQgamF2YXguandzLk9uZXdheTsKLWltcG9ydCBqYXZheC5qd3MuV2ViTWV0aG9kOwotaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbTsKLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZzsKLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5QYXJhbWV0ZXJTdHlsZTsKLQotCi1AV2ViU2VydmljZShuYW1lID0gIlBpbmdTZXJ2aWNlMTJQb3J0VHlwZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL3BpbmcvIikKLUBTT0FQQmluZGluZyhwYXJhbWV0ZXJTdHlsZSA9IFBhcmFtZXRlclN0eWxlLkJBUkUpCi1wdWJsaWMgaW50ZXJmYWNlIFBpbmdTZXJ2aWNlMTJQb3J0VHlwZSB7Ci0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBwYXJhbWV0ZXIKLSAgICAgKi8KLSAgICBAV2ViTWV0aG9kKGFjdGlvbiA9ICJwaW5nT3BlcmF0aW9uIikKLSAgICBAT25ld2F5Ci0gICAgcHVibGljIHZvaWQgcGluZ09wZXJhdGlvbigKLSAgICAgICAgICAgIEBXZWJQYXJhbShuYW1lID0gInBpbmdTdHJpbmdJbnB1dCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL3BpbmcvIiwgcGFydE5hbWUgPSAicGFyYW1ldGVyIikKLSAgICAgICAgICAgIFBpbmdTdHJpbmdJbnB1dCBwYXJhbWV0ZXIpOwotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL21haW4vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL3BpbmcvUGluZ1NlcnZpY2VQb3J0SW1wbC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy9tYWluL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9waW5nL1BpbmdTZXJ2aWNlUG9ydEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjVhMTZmMS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL21haW4vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL3BpbmcvUGluZ1NlcnZpY2VQb3J0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGVzLnBpbmc7Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKLQotCi1AV2ViU2VydmljZShlbmRwb2ludEludGVyZmFjZSA9ICJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZXMucGluZy5QaW5nU2VydmljZVBvcnRUeXBlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvcGluZy8iLCBzZXJ2aWNlTmFtZSA9ICJQaW5nU2VydmljZSIsIHBvcnROYW1lID0gIlBpbmdTZXJ2aWNlUG9ydCIsIHdzZGxMb2NhdGlvbiA9ICJXRUItSU5GL3dzZGwvUGluZy53c2RsIikKLXB1YmxpYyBjbGFzcyBQaW5nU2VydmljZVBvcnRJbXBsIHsKLQotICAgIHB1YmxpYyB2b2lkIHBpbmdPcGVyYXRpb24oUGluZ1N0cmluZ0lucHV0IHBhcmFtZXRlcikgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIj4+IFNFUlZJQ0U6IFNFSSBQaW5nIEpBWC1XUyBTZXJ2aWNlOiBSZXF1ZXN0IHJlY2VpdmVkLiIpOwotICAgICAgICBpZiAocGFyYW1ldGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCI+PiBTRVJWSUNFOiBTRUkgUGluZyBJbnB1dCBTdHJpbmcgJyIgKyBwYXJhbWV0ZXIucGluZ0lucHV0ICsgIiciKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL21haW4vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL3BpbmcvUGluZ1NlcnZpY2VQb3J0VHlwZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy9tYWluL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9waW5nL1BpbmdTZXJ2aWNlUG9ydFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM0ZTkxNi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL21haW4vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL3BpbmcvUGluZ1NlcnZpY2VQb3J0VHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGVzLnBpbmc7Ci0KLWltcG9ydCBqYXZheC5qd3MuT25ld2F5OwotaW1wb3J0IGphdmF4Lmp3cy5XZWJNZXRob2Q7Ci1pbXBvcnQgamF2YXguandzLldlYlBhcmFtOwotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOwotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nOwotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlBhcmFtZXRlclN0eWxlOwotCi0KLUBXZWJTZXJ2aWNlKG5hbWUgPSAiUGluZ1NlcnZpY2VQb3J0VHlwZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL3BpbmcvIikKLUBTT0FQQmluZGluZyhwYXJhbWV0ZXJTdHlsZSA9IFBhcmFtZXRlclN0eWxlLkJBUkUpCi1wdWJsaWMgaW50ZXJmYWNlIFBpbmdTZXJ2aWNlUG9ydFR5cGUgewotCi0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gcGFyYW1ldGVyCi0gICAgICovCi0gICAgQFdlYk1ldGhvZChhY3Rpb24gPSAicGluZ09wZXJhdGlvbiIpCi0gICAgQE9uZXdheQotICAgIHB1YmxpYyB2b2lkIHBpbmdPcGVyYXRpb24oCi0gICAgICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJwaW5nU3RyaW5nSW5wdXQiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9waW5nLyIsIHBhcnROYW1lID0gInBhcmFtZXRlciIpCi0gICAgICAgICAgICBQaW5nU3RyaW5nSW5wdXQgcGFyYW1ldGVyKTsKLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy9tYWluL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9waW5nL1BpbmdTdHJpbmdJbnB1dC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy9tYWluL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9waW5nL1BpbmdTdHJpbmdJbnB1dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYmYwMzhkLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvbWFpbi9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvcGluZy9QaW5nU3RyaW5nSW5wdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlcy5waW5nOwotCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50OwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZTsKLQotCi0vKioKLSAqIDxwPkphdmEgY2xhc3MgZm9yIHBpbmdTdHJpbmdJbnB1dCBlbGVtZW50IGRlY2xhcmF0aW9uLgotICogPHAvPgotICogPHA+VGhlIGZvbGxvd2luZyBzY2hlbWEgZnJhZ21lbnQgc3BlY2lmaWVzIHRoZSBleHBlY3RlZCBjb250ZW50IGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBjbGFzcy4KLSAqIDxwLz4KLSAqIDxwcmU+Ci0gKiAmbHQ7ZWxlbWVudCBuYW1lPSJwaW5nU3RyaW5nSW5wdXQiPgotICogICAmbHQ7Y29tcGxleFR5cGU+Ci0gKiAgICAgJmx0O2NvbXBsZXhDb250ZW50PgotICogICAgICAgJmx0O3Jlc3RyaWN0aW9uIGJhc2U9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1hbnlUeXBlIj4KLSAqICAgICAgICAgJmx0O3NlcXVlbmNlPgotICogICAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9InBpbmdJbnB1dCIgdHlwZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfXN0cmluZyIvPgotICogICAgICAgICAmbHQ7L3NlcXVlbmNlPgotICogICAgICAgJmx0Oy9yZXN0cmljdGlvbj4KLSAqICAgICAmbHQ7L2NvbXBsZXhDb250ZW50PgotICogICAmbHQ7L2NvbXBsZXhUeXBlPgotICogJmx0Oy9lbGVtZW50PgotICogPC9wcmU+Ci0gKi8KLUBYbWxBY2Nlc3NvclR5cGUoWG1sQWNjZXNzVHlwZS5GSUVMRCkKLUBYbWxUeXBlKG5hbWUgPSAiIiwgcHJvcE9yZGVyID0gewotICAgICAgICAicGluZ0lucHV0IgotICAgICAgICB9KQotQFhtbFJvb3RFbGVtZW50KG5hbWUgPSAicGluZ1N0cmluZ0lucHV0IikKLXB1YmxpYyBjbGFzcyBQaW5nU3RyaW5nSW5wdXQgewotCi0gICAgQFhtbEVsZW1lbnQocmVxdWlyZWQgPSB0cnVlKQotICAgIHByb3RlY3RlZCBTdHJpbmcgcGluZ0lucHV0OwotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIHBpbmdJbnB1dCBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzCi0gICAgICogICAgICAgICB7QGxpbmsgU3RyaW5nIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBpbmdJbnB1dCgpIHsKLSAgICAgICAgcmV0dXJuIHBpbmdJbnB1dDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgcGluZ0lucHV0IHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIGFsbG93ZWQgb2JqZWN0IGlzCi0gICAgICogICAgICAgICAgICAgIHtAbGluayBTdHJpbmcgfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFBpbmdJbnB1dChTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5waW5nSW5wdXQgPSB2YWx1ZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvbWFpbi9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvcGluZy9wYWNrYWdlLWluZm8uamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvbWFpbi9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvcGluZy9wYWNrYWdlLWluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQxOThiNi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL21haW4vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL3BpbmcvcGFja2FnZS1pbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotQGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sU2NoZW1hKG5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL3BpbmcvIikgcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZXMucGluZzsKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvbWFpbi9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvc2VydmxldC9FY2hvUGluZ1NhbXBsZVNlcnZsZXQuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvbWFpbi9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvc2VydmxldC9FY2hvUGluZ1NhbXBsZVNlcnZsZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTc1ZmE2MS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL21haW4vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL3NlcnZsZXQvRWNob1BpbmdTYW1wbGVTZXJ2bGV0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGVzLnNlcnZsZXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZXMuY2xpZW50LlNhbXBsZUNsaWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLkNsaWVudENvbmZpZ3VyYXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIubWV0YWRhdGEucmVnaXN0cnkuTWV0YWRhdGFGYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LkZpbGVTeXN0ZW1Db25maWd1cmF0b3I7Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXQ7Ci1pbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dDsKLWltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0OwotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7Ci1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotCi0vKioKLSAqIEVjaG9QaW5nU2FtcGxlU2VydmxldCBtYWluIGVudHJ5IHBvaW50IGZvciBKU1Agc2VydmxldAotICovCi1wdWJsaWMgY2xhc3MgRWNob1BpbmdTYW1wbGVTZXJ2bGV0IGV4dGVuZHMgSHR0cFNlcnZsZXQgaW1wbGVtZW50cyBTZXJ2bGV0IHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUSU1FT1VUID0gMjQwOyAvLyBBc3luYyB0aW1lb3V0Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMTAzOTM2MjEwNjEyMzQ5Mzc5OUw7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFWFRfQkFTRSA9ICIvamF4d3Mtc2FtcGxlcy9zZXJ2aWNlcy8iOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQSU5HX0NPTlRFWFQgPSBDT05URVhUX0JBU0UgKyAiUGluZ1NlcnZpY2UuUGluZ1NlcnZpY2VQb3J0IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUNIT19DT05URVhUID0gQ09OVEVYVF9CQVNFICsgIkVjaG9TZXJ2aWNlLkVjaG9TZXJ2aWNlUG9ydCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBJTkdfQ09OVEVYVDEyID0gQ09OVEVYVF9CQVNFICsgIlBpbmdTZXJ2aWNlMTIuUGluZ1NlcnZpY2UxMlBvcnQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFQ0hPX0NPTlRFWFQxMiA9IENPTlRFWFRfQkFTRSArICJFY2hvU2VydmljZTEyLkVjaG9TZXJ2aWNlMTJQb3J0IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5ERVhfSlNQX0xPQ0FUSU9OID0gIi9XRUItSU5GL2pzcC9kZW1vRWNob1BpbmcuanNwIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUElOR19SRVNQT05TRV9HT09EID0gIk1lc3NhZ2UgZGVsaXZlcmVkIHN1Y2Nlc3NmdWxseS4gUGxlYXNlIGNoZWNrIHNlcnZlciBsb2dzIHRvIGNvbmZpcm0gbWVzc2FnZSBkZWxpdmVyeS4iOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQSU5HX1JFU1BPTlNFX0JBRCA9ICJFUlJPUjogRmFpbHVyZSBpbiBjbGllbnQgYmVmb3JlIG1lc3NhZ2UgZGVsaXZlcnkuIjsKLSAgICBwcml2YXRlIFN0cmluZyB1cmlTdHJpbmcgPSAiIjsKLSAgICBwcml2YXRlIFN0cmluZyBzb2FwU3RyaW5nID0gIiI7Ci0gICAgcHJpdmF0ZSBpbnQgY291bnQgPSAxOwotICAgIHByaXZhdGUgQ2xpZW50Q29uZmlndXJhdGlvbkZhY3RvcnkgZmFjdG9yeSA9IG51bGw7Ci0KLSAgICBwdWJsaWMgRWNob1BpbmdTYW1wbGVTZXJ2bGV0KCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcCkKLSAgICAgICAgICAgIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHByb2Nlc3NSZXF1ZXN0KHJlcSwgcmVzcCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9Qb3N0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcCkKLSAgICAgICAgICAgIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHByb2Nlc3NSZXF1ZXN0KHJlcSwgcmVzcCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogcHJvY2Vzc1JlcXVlc3QgUmVhZHMgdGhlIHBvc3RlZCBwYXJhbWV0ZXJzIGFuZCBjYWxscyB0aGUgc2VydmljZQotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzUmVxdWVzdChIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3ApCi0gICAgICAgICAgICB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotICAgICAgICAKLSAgICAgICAgaWYoZmFjdG9yeSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgcGF0aCA9IGdldFNlcnZsZXRDb25maWcoKS5nZXRTZXJ2bGV0Q29udGV4dCgpLmdldFJlYWxQYXRoKCIvV0VCLUlORi9heGlzMi54bWwiKTsKLSAgICAgICAgICAgIEZpbGVTeXN0ZW1Db25maWd1cmF0b3IgY29uZmlndXJhdG9yID0gbmV3IEZpbGVTeXN0ZW1Db25maWd1cmF0b3IobnVsbCwgcGF0aCk7Ci0gICAgICAgICAgICBmYWN0b3J5ID0gbmV3IENsaWVudENvbmZpZ3VyYXRpb25GYWN0b3J5KGNvbmZpZ3VyYXRvcik7Ci0gICAgICAgICAgICBNZXRhZGF0YUZhY3RvcnlSZWdpc3RyeS5zZXRGYWN0b3J5KENsaWVudENvbmZpZ3VyYXRpb25GYWN0b3J5LmNsYXNzLCBmYWN0b3J5KTsKLSAgICAgICAgfQotCi0gICAgICAgIFNlcnZsZXRDb250ZXh0IGNvbnRleHQgPSBnZXRTZXJ2bGV0Q29udGV4dCgpOwotICAgICAgICBTdHJpbmcgbXNnU3RyaW5nID0gcmVxLmdldFBhcmFtZXRlcigibXNnc3RyaW5nIik7Ci0gICAgICAgIFN0cmluZyBzdmMgPSByZXEuZ2V0UGFyYW1ldGVyKCJtc2dzZXJ2aWNlIik7Ci0gICAgICAgIFN0cmluZyBjbnQgPSByZXEuZ2V0UGFyYW1ldGVyKCJtc2djb3VudCIpOwotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gIiI7Ci0gICAgICAgIHJlcS5zZXRBdHRyaWJ1dGUoIlBpbmdTZWxlY3RlZCIsICIgIik7Ci0gICAgICAgIHJlcS5zZXRBdHRyaWJ1dGUoIkVjaG9TZWxlY3RlZCIsICIgIik7Ci0gICAgICAgIHJlcS5zZXRBdHRyaWJ1dGUoIkFzeW5jU2VsZWN0ZWQiLCAiICIpOwotICAgICAgICByZXEuc2V0QXR0cmlidXRlKCJBc3luY1dpcmVTZWxlY3RlZCIsICIgIik7Ci0KLSAgICAgICAgaWYgKG51bGwgPT0gbXNnU3RyaW5nIHx8ICIiID09IG1zZ1N0cmluZykgewotICAgICAgICAgICAgLy8gU2V0IHVwIHRoZSBkZWZhdWx0IHZhbHVlcyB0byB1c2UKLSAgICAgICAgICAgIHVyaVN0cmluZyA9ICJodHRwOi8vbG9jYWxob3N0OiIgKyByZXEuZ2V0U2VydmVyUG9ydCgpOwotICAgICAgICAgICAgc29hcFN0cmluZyA9ICIiOwotICAgICAgICAgICAgZm9ybWF0T3V0cHV0KHJlcSwgdXJpU3RyaW5nLCAiIiwgIiIpOwotICAgICAgICAgICAgcmVxLnNldEF0dHJpYnV0ZSgidXJpZGVmIiwgdXJpU3RyaW5nKTsKLSAgICAgICAgICAgIHJlcS5zZXRBdHRyaWJ1dGUoInNvYXBkZWYiLCBzb2FwU3RyaW5nKTsKLSAgICAgICAgICAgIHJlcS5zZXRBdHRyaWJ1dGUoIm1lc3NhZ2VTIiwgIiAiKTsKLSAgICAgICAgICAgIHJlcS5zZXRBdHRyaWJ1dGUoIm1lc3NhZ2VSIiwgIiAiKTsKLSAgICAgICAgICAgIHJlcS5zZXRBdHRyaWJ1dGUoIm1zZ2NvdW50IiwgbmV3IEludGVnZXIoY291bnQpLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgcmVxLnNldEF0dHJpYnV0ZSgiUGluZ1NlbGVjdGVkIiwgInNlbGVjdGVkIik7Ci0gICAgICAgICAgICBjb250ZXh0LmdldFJlcXVlc3REaXNwYXRjaGVyKElOREVYX0pTUF9MT0NBVElPTikuZm9yd2FyZChyZXEsIHJlc3ApOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gR2V0IHRoZSBwYXJtcyBmcm9tIHRoZSByZXF1ZXN0Ci0gICAgICAgICAgICB1cmlTdHJpbmcgPSByZXEuZ2V0UGFyYW1ldGVyKCJ1cmkiKTsKLSAgICAgICAgICAgIHNvYXBTdHJpbmcgPSByZXEuZ2V0UGFyYW1ldGVyKCJzb2FwMTIiKTsKLSAgICAgICAgICAgIGlmIChudWxsICE9IHNvYXBTdHJpbmcpIHsKLSAgICAgICAgICAgICAgICBzb2FwU3RyaW5nID0gImNoZWNrZWQiOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzb2FwU3RyaW5nID0gIiI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBHZXQgY291bnQKLSAgICAgICAgICAgIGlmICgobnVsbCAhPSBjbnQpICYmICgiIiAhPSBjbnQpKSB7Ci0gICAgICAgICAgICAgICAgY291bnQgPSBuZXcgSW50ZWdlcihjbnQpLmludFZhbHVlKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFNldCB0aGUgdmFsdWVzIHRvIGJlIG9uIHRoZSByZWZyZXNoZWQgcGFnZQkJCQotICAgICAgICAgICAgcmVxLnNldEF0dHJpYnV0ZSgibXNnc3RyaW5nIiwgcmVxLmdldEF0dHJpYnV0ZSgibXNnc3RyaW5nIikpOwotICAgICAgICAgICAgcmVxLnNldEF0dHJpYnV0ZSgidXJpZGVmIiwgdXJpU3RyaW5nKTsKLSAgICAgICAgICAgIHJlcS5zZXRBdHRyaWJ1dGUoInNvYXBkZWYiLCBzb2FwU3RyaW5nKTsKLSAgICAgICAgICAgIHJlcS5zZXRBdHRyaWJ1dGUoIm1zZ2NvdW50IiwgbmV3IEludGVnZXIoY291bnQpLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgcmVxLnNldEF0dHJpYnV0ZShzdmMgKyAiU2VsZWN0ZWQiLCAic2VsZWN0ZWQiKTsKLQotICAgICAgICAgICAgLy8gTm93IGNhbGwgdGhlIHNlcnZpY2UKLSAgICAgICAgICAgIFNhbXBsZUNsaWVudCBjbGllbnQgPSBuZXcgU2FtcGxlQ2xpZW50KCk7Ci0gICAgICAgICAgICBjbGllbnQuc2V0Q2xpZW50Q29uZmlndXJhdGlvbkZhY3RvcnkoZmFjdG9yeSk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIj4+IFNFUlZMRVQ6IFJlcXVlc3QgY291bnQgPSAiICsgY291bnQpOwotCi0gICAgICAgICAgICAvLyBMb29wIG9uIHRoZSBjb3VudAotICAgICAgICAgICAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IGNvdW50OyBpbmRleCsrKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCI+PiBTRVJWTEVUOiBSZXF1ZXN0IGluZGV4OiAiICsgKGluZGV4ICsgMSkpOwotICAgICAgICAgICAgICAgIGlmICgwID09IHNvYXBTdHJpbmcubGVuZ3RoKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHN2Yy5lcXVhbHNJZ25vcmVDYXNlKCgiQXN5bmMiKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBjbGllbnQuYnVpbGRBc3luYyh1cmlTdHJpbmcgKyBFQ0hPX0NPTlRFWFQsIGdldFdTRExVUkwoIi9XRUItSU5GL3dzZGwvRWNoby53c2RsIiksIG1zZ1N0cmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNRU9VVCwgZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN2Yy5lcXVhbHNJZ25vcmVDYXNlKCgiQXN5bmNXaXJlIikpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gY2xpZW50LmJ1aWxkQXN5bmModXJpU3RyaW5nICsgRUNIT19DT05URVhULCBnZXRXU0RMVVJMKCIvV0VCLUlORi93c2RsL0VjaG8ud3NkbCIpLCBtc2dTdHJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTUVPVVQsIHRydWUpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN2Yy5lcXVhbHNJZ25vcmVDYXNlKCJFY2hvIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBjbGllbnQuYnVpbGRFY2hvKHVyaVN0cmluZyArIEVDSE9fQ09OVEVYVCwgZ2V0V1NETFVSTCgiL1dFQi1JTkYvd3NkbC9FY2hvLndzZGwiKSwgbXNnU3RyaW5nKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGllbnQuYnVpbGRQaW5nKHVyaVN0cmluZyArIFBJTkdfQ09OVEVYVCwgZ2V0V1NETFVSTCgiL1dFQi1JTkYvd3NkbC9QaW5nLndzZGwiKSwgbXNnU3RyaW5nKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBQSU5HX1JFU1BPTlNFX0dPT0Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBQSU5HX1JFU1BPTlNFX0JBRDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSAgLy8gU09BUDEuMgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHN2Yy5lcXVhbHNJZ25vcmVDYXNlKCgiQXN5bmMiKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBjbGllbnQuYnVpbGRBc3luYzEyKHVyaVN0cmluZyArIEVDSE9fQ09OVEVYVDEyLCBnZXRXU0RMVVJMKCIvV0VCLUlORi93c2RsL0VjaG8xMi53c2RsIiksIG1zZ1N0cmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNRU9VVCwgZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN2Yy5lcXVhbHNJZ25vcmVDYXNlKCgiQXN5bmNXaXJlIikpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gY2xpZW50LmJ1aWxkQXN5bmMxMih1cmlTdHJpbmcgKyBFQ0hPX0NPTlRFWFQxMiwgZ2V0V1NETFVSTCgiL1dFQi1JTkYvd3NkbC9FY2hvMTIud3NkbCIpLCBtc2dTdHJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTUVPVVQsIHRydWUpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN2Yy5lcXVhbHNJZ25vcmVDYXNlKCJFY2hvIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBjbGllbnQuYnVpbGRFY2hvMTIodXJpU3RyaW5nICsgRUNIT19DT05URVhUMTIsIGdldFdTRExVUkwoIi9XRUItSU5GL3dzZGwvRWNobzEyLndzZGwiKSwgbXNnU3RyaW5nKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGllbnQuYnVpbGRQaW5nMTIodXJpU3RyaW5nICsgUElOR19DT05URVhUMTIsIGdldFdTRExVUkwoIi9XRUItSU5GL3dzZGwvUGluZzEyLndzZGwiKSwgbXNnU3RyaW5nKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBQSU5HX1JFU1BPTlNFX0dPT0Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBQSU5HX1JFU1BPTlNFX0JBRDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXN1bHQgKz0gIlxuIjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gRm9ybWF0IHRoZSBvdXRwdXQgYW5kIHJlZnJlc2ggdGhlIHBhbmVsCi0gICAgICAgICAgICBmb3JtYXRPdXRwdXQocmVxLCB1cmlTdHJpbmcsIG1zZ1N0cmluZywgcmVzdWx0KTsKLSAgICAgICAgICAgIGNvbnRleHQuZ2V0UmVxdWVzdERpc3BhdGNoZXIoSU5ERVhfSlNQX0xPQ0FUSU9OKS5mb3J3YXJkKHJlcSwgcmVzcCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBmb3JtYXRPdXRwdXQgRm9ybWF0IHRoZSB0cmFuc2FjdGlvbiBkYXRhIGludG8gdGhlIEhUTUwgdGV4dCBhcmVhCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGZvcm1hdE91dHB1dChIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBTdHJpbmcgZW5kcG9pbnRVUkwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmVxdWVzdCwgU3RyaW5nIHJlY2VpdmVkKSB7Ci0gICAgICAgIHJlcS5zZXRBdHRyaWJ1dGUoIm1lc3NhZ2VTIiwgIlxuIiArICJDb25uZWN0aW5nIHRvLi4uICIgKyBlbmRwb2ludFVSTAotICAgICAgICAgICAgICAgICsgIlxuXG4iICsgIk1lc3NhZ2UgUmVxdWVzdDogXG4iICsgcmVxdWVzdCArICJcbiIpOwotICAgICAgICByZXEuc2V0QXR0cmlidXRlKCJtZXNzYWdlUiIsICJcbiIgKyAiTWVzc2FnZSBSZXNwb25zZTogXG4iICsgcmVjZWl2ZWQKLSAgICAgICAgICAgICAgICArICJcbiIpOwotICAgIH0KLQotICAgIHByaXZhdGUgVVJMIGdldFdTRExVUkwoU3RyaW5nIGZpbGUpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZ2V0U2VydmxldENvbmZpZygpLmdldFNlcnZsZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2UoZmlsZSk7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvbWFpbi9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvc2VydmxldC9NVE9NU2FtcGxlU2VydmxldC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy9tYWluL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9zZXJ2bGV0L01UT01TYW1wbGVTZXJ2bGV0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1MTY3NzkuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy9tYWluL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9zZXJ2bGV0L01UT01TYW1wbGVTZXJ2bGV0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZXMuc2VydmxldDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlcy5jbGllbnQubXRvbS5TYW1wbGVNVE9NVGVzdHM7Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OwotaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OwotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOwotaW1wb3J0IGphdmEuaW8uRGF0YUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi0vKioKLSAqIFNlcnZsZXQgaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIFNlcnZsZXQ6IE1UT01TYW1wbGVTZXJ2bGV0Ci0gKiA8cC8+Ci0gKiB3ZWIuc2VydmxldAotICogbmFtZT0iTVRPTVNhbXBsZVNlcnZsZXQiCi0gKiBkaXNwbGF5LW5hbWU9Ik1UT01TYW1wbGVTZXJ2bGV0IgotICogZGVzY3JpcHRpb249IlByb3ZpZGVzIGEgc2VydmxldCBpbnRlcmZhY2UgdG8gdGhlIE1UT00gU2VydmljZSBTYW1wbGUiCi0gKiA8cC8+Ci0gKiB3ZWIuc2VydmxldC1tYXBwaW5nCi0gKiB1cmwtcGF0dGVybj0iL01UT01TYW1wbGVTZXJ2bGV0IgotICovCi1wdWJsaWMgY2xhc3MgTVRPTVNhbXBsZVNlcnZsZXQgZXh0ZW5kcyBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXQgaW1wbGVtZW50cyBqYXZheC5zZXJ2bGV0LlNlcnZsZXQgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDEwMzkzNjIxMDYxMjM0OTM3OTlMOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTkRFWF9KU1BfTE9DQVRJT04gPSAiL1dFQi1JTkYvanNwL2RlbW9NVE9NLmpzcCI7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgdXJpU3RyaW5nID0gIiI7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgc29hcFN0cmluZyA9ICIiOwotICAgIHByaXZhdGUgU3RyaW5nIGZpbGVOYW1lID0gIiI7Ci0KLSAgICBwdWJsaWMgTVRPTVNhbXBsZVNlcnZsZXQoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9HZXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwKQotICAgICAgICAgICAgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAgICAgcHJvY2Vzc1JlcXVlc3QocmVxLCByZXNwKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb1Bvc3QoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwKQotICAgICAgICAgICAgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAgICAgcHJvY2Vzc1JlcXVlc3QocmVxLCByZXNwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBwcm9jZXNzUmVxdWVzdCBSZWFkcyB0aGUgcG9zdGVkIHBhcmFtZXRlcnMgYW5kIGNhbGxzIHRoZSBzZXJ2aWNlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVxICAtIEh0dHBTZXJ2bGV0UmVxdWVzdAotICAgICAqIEBwYXJhbSByZXNwIC0gSHR0cFNlcnZsZXRSZXNwb25zZQotICAgICAqIEB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc1JlcXVlc3QoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwKQotICAgICAgICAgICAgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAgICAgU2VydmxldENvbnRleHQgY29udGV4dCA9IGdldFNlcnZsZXRDb250ZXh0KCk7Ci0KLSAgICAgICAgLy8gU2V0IHRoZSBkZWZhdWx0IHZhbHVlcwotICAgICAgICBTdHJpbmcgc3ZjID0gbnVsbDsKLSAgICAgICAgcmVxLnNldEF0dHJpYnV0ZSgiRGlzcGF0Y2hTZWxlY3RlZCIsICIgIik7Ci0gICAgICAgIHJlcS5zZXRBdHRyaWJ1dGUoIlByb3h5U2VsZWN0ZWQiLCAiICIpOwotCi0gICAgICAgIC8vIFNlZSBpZiB0aGUgZm9ybSB3YXMgcG9zdGVkIAotICAgICAgICBTdHJpbmcgY29udGVudFR5cGUgPSByZXEuZ2V0Q29udGVudFR5cGUoKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCI+PlNFUlZMRVQ6IENvbnRlbnQgdHlwZSBpczogIiArIGNvbnRlbnRUeXBlKTsKLQotICAgICAgICAvLyB2ZXJpZnkgd2UgaGF2ZSBtdWx0aXBhcnQvZm9ybS1kYXRhCi0gICAgICAgIGlmICgoY29udGVudFR5cGUgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAmJiAoY29udGVudFR5cGUuaW5kZXhPZigibXVsdGlwYXJ0L2Zvcm0tZGF0YSIpID49IDApKSB7Ci0KLSAgICAgICAgICAgIC8vIFJlYWQgdGhlIHBvc3QgZGF0YQotICAgICAgICAgICAgRGF0YUlucHV0U3RyZWFtIGluID0gbmV3IERhdGFJbnB1dFN0cmVhbShyZXEKLSAgICAgICAgICAgICAgICAgICAgLmdldElucHV0U3RyZWFtKCkpOwotICAgICAgICAgICAgaW50IGZvcm1EYXRhTGVuZ3RoID0gcmVxLmdldENvbnRlbnRMZW5ndGgoKTsKLQotICAgICAgICAgICAgYnl0ZSBkYXRhQnl0ZXNbXSA9IG5ldyBieXRlW2Zvcm1EYXRhTGVuZ3RoXTsKLSAgICAgICAgICAgIGludCBieXRlUmVhZCA9IDA7Ci0gICAgICAgICAgICBpbnQgdG90YWxCeXRlc1JlYWQgPSAwOwotICAgICAgICAgICAgd2hpbGUgKHRvdGFsQnl0ZXNSZWFkIDwgZm9ybURhdGFMZW5ndGgpIHsKLSAgICAgICAgICAgICAgICBieXRlUmVhZCA9IGluLnJlYWQoZGF0YUJ5dGVzLCB0b3RhbEJ5dGVzUmVhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1EYXRhTGVuZ3RoKTsKLSAgICAgICAgICAgICAgICB0b3RhbEJ5dGVzUmVhZCArPSBieXRlUmVhZDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gQ2hhbmdlIGl0IHRvIGEgc3RyaW5nCi0gICAgICAgICAgICBTdHJpbmcgZGF0YSA9IG5ldyBTdHJpbmcoZGF0YUJ5dGVzKTsKLQotICAgICAgICAgICAgLy8gUGFyc2Ugb3V0IHRoZSBwYXJtcwotICAgICAgICAgICAgc3ZjID0gZ2V0cGFybSgibXNnc2VydmljZSIsIGRhdGEpOwotICAgICAgICAgICAgdXJpU3RyaW5nID0gZ2V0cGFybSgidXJpZGVmIiwgZGF0YSk7Ci0gICAgICAgICAgICBzb2FwU3RyaW5nID0gZ2V0cGFybSgic29hcGRlZiIsIGRhdGEpOwotCi0gICAgICAgICAgICAvLyBGaWxlbmFtZSBpcyBwYXJ0IG9mIHRoZSBmaWxlIGRhdGEgYmxvY2suCi0gICAgICAgICAgICBmaWxlTmFtZSA9IGRhdGEuc3Vic3RyaW5nKGRhdGEuaW5kZXhPZigiZmlsZW5hbWU9XCIiKSArIDEwKTsKLSAgICAgICAgICAgIGZpbGVOYW1lID0gZmlsZU5hbWUuc3Vic3RyaW5nKDAsIGZpbGVOYW1lLmluZGV4T2YoIlxuIikpOwotCi0gICAgICAgICAgICAvLyBTdHJpcCBwYXRoIGluZm8gb3V0LCB3aW5kb3dzIG9yIHVuaXgKLSAgICAgICAgICAgIGZpbGVOYW1lID0gZmlsZU5hbWUuc3Vic3RyaW5nKGZpbGVOYW1lLmxhc3RJbmRleE9mKCJcXCIpICsgMSwgZmlsZU5hbWUuaW5kZXhPZigiXCIiKSk7Ci0gICAgICAgICAgICBmaWxlTmFtZSA9IGZpbGVOYW1lLnN1YnN0cmluZyhmaWxlTmFtZS5sYXN0SW5kZXhPZigiLyIpICsgMSk7Ci0KLSAgICAgICAgICAgIC8vIE5vdyBsb29rIGZvciB0aGUgZmlsZSBkYXRhCi0gICAgICAgICAgICBpbnQgbGFzdEluZGV4ID0gY29udGVudFR5cGUubGFzdEluZGV4T2YoIj0iKTsKLSAgICAgICAgICAgIFN0cmluZyBib3VuZGFyeSA9IGNvbnRlbnRUeXBlLnN1YnN0cmluZyhsYXN0SW5kZXggKyAxLAotICAgICAgICAgICAgICAgICAgICBjb250ZW50VHlwZS5sZW5ndGgoKSk7Ci0KLSAgICAgICAgICAgIGludCBwb3M7Ci0gICAgICAgICAgICBwb3MgPSBkYXRhLmluZGV4T2YoImZpbGVuYW1lPVwiIik7Ci0gICAgICAgICAgICBwb3MgPSBkYXRhLmluZGV4T2YoIlxuIiwgcG9zKSArIDE7Ci0gICAgICAgICAgICBwb3MgPSBkYXRhLmluZGV4T2YoIlxuIiwgcG9zKSArIDE7Ci0gICAgICAgICAgICBwb3MgPSBkYXRhLmluZGV4T2YoIlxuIiwgcG9zKSArIDE7Ci0KLSAgICAgICAgICAgIC8vIERldGVybWluZSB0aGUgYm91bmRhcmllcwotICAgICAgICAgICAgaW50IGJvdW5kYXJ5TG9jYXRpb24gPSBkYXRhLmluZGV4T2YoYm91bmRhcnksIHBvcykgLSA0OwotICAgICAgICAgICAgaW50IHN0YXJ0UG9zID0gKChkYXRhLnN1YnN0cmluZygwLCBwb3MpKS5nZXRCeXRlcygpKS5sZW5ndGg7Ci0gICAgICAgICAgICBpbnQgZW5kUG9zID0gKChkYXRhLnN1YnN0cmluZygwLCBib3VuZGFyeUxvY2F0aW9uKSkuZ2V0Qnl0ZXMoKSkubGVuZ3RoOwotCi0gICAgICAgICAgICAvLyBXcml0ZSB0aGUgZmlsZSBsb2NhbGx5Ci0gICAgICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIGZpbGVPdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlTmFtZSk7Ci0gICAgICAgICAgICBmaWxlT3V0LndyaXRlKGRhdGFCeXRlcywgc3RhcnRQb3MsIChlbmRQb3MgLSBzdGFydFBvcykpOwotICAgICAgICAgICAgZmlsZU91dC5mbHVzaCgpOwotICAgICAgICAgICAgZmlsZU91dC5jbG9zZSgpOwotCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIj4+U0VSVkxFVDogRmlsZSBzYXZlZCBhcyAiICsgZmlsZU5hbWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTnVsbCBtZWFucyB0aGlzIGlzIG5vdCBhIHBvc3QsIHNvIHdlIHNldCB0aGUgZGVmYXVsdHMKLSAgICAgICAgaWYgKG51bGwgPT0gc3ZjIHx8ICIiID09IHN2YykgewotICAgICAgICAgICAgLy8gU2V0IHVwIHRoZSBkZWZhdWx0IHZhbHVlcyB0byB1c2UKLSAgICAgICAgICAgIHVyaVN0cmluZyA9ICJodHRwOi8vbG9jYWxob3N0OiIgKyByZXEuZ2V0U2VydmVyUG9ydCgpOwotICAgICAgICAgICAgc29hcFN0cmluZyA9ICIiOwotICAgICAgICAgICAgcmVxLnNldEF0dHJpYnV0ZSgidXJpZGVmIiwgdXJpU3RyaW5nKTsKLSAgICAgICAgICAgIHJlcS5zZXRBdHRyaWJ1dGUoInNvYXBkZWYiLCBzb2FwU3RyaW5nKTsKLSAgICAgICAgICAgIHJlcS5zZXRBdHRyaWJ1dGUoImZpbGVkZWYiLCAiIik7Ci0gICAgICAgICAgICByZXEuc2V0QXR0cmlidXRlKCJtZXNzYWdlUyIsICIgIik7Ci0gICAgICAgICAgICByZXEuc2V0QXR0cmlidXRlKCJtZXNzYWdlUiIsICIgIik7Ci0gICAgICAgICAgICBjb250ZXh0LmdldFJlcXVlc3REaXNwYXRjaGVyKElOREVYX0pTUF9MT0NBVElPTikuZm9yd2FyZChyZXEsIHJlc3ApOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gVGhpcyBpcyBhIHBvc3QsIHdvcmsgd2l0aCB0aGUgZGF0YQotICAgICAgICAgICAgU3RyaW5nIHJlc3VsdCA9ICIiOwotCi0gICAgICAgICAgICAvLyBTZXR1cCBzb2FwIHJldHVybgotICAgICAgICAgICAgc29hcFN0cmluZyA9IChudWxsICE9IHNvYXBTdHJpbmcpID8gImNoZWNrZWQiIDogIiI7Ci0KLSAgICAgICAgICAgIC8vIFNldCB0aGUgdmFsdWVzIHRvIGJlIG9uIHRoZSByZWZyZXNoZWQgcGFnZQkJCQotICAgICAgICAgICAgcmVxLnNldEF0dHJpYnV0ZSgidXJpZGVmIiwgdXJpU3RyaW5nKTsKLSAgICAgICAgICAgIHJlcS5zZXRBdHRyaWJ1dGUoInNvYXBkZWYiLCBzb2FwU3RyaW5nKTsKLSAgICAgICAgICAgIHJlcS5zZXRBdHRyaWJ1dGUoImZpbGVkZWYiLCBmaWxlTmFtZSk7Ci0gICAgICAgICAgICByZXEuc2V0QXR0cmlidXRlKHN2YyArICJTZWxlY3RlZCIsICJzZWxlY3RlZCIpOwotCi0gICAgICAgICAgICAvLyBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIHRlc3RzIGNsaWVudAotICAgICAgICAgICAgU2FtcGxlTVRPTVRlc3RzIGNsaWVudCA9IG5ldyBTYW1wbGVNVE9NVGVzdHMoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiPj5TRVJWTEVUOiBGaWxlbmFtZSA9ICIgKyBmaWxlTmFtZSk7Ci0KLSAgICAgICAgICAgIC8vIENhbGwgdGhlIHRlc3QgY2xhc3MKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgY2xpZW50LnNldE9wdGlvbnModXJpU3RyaW5nLCAoMCAhPSBzb2FwU3RyaW5nLmxlbmd0aCgpKSwgZmlsZU5hbWUpOwotICAgICAgICAgICAgICAgIGlmIChzdmMuZXF1YWxzKCJEaXNwYXRjaCIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNsaWVudC50ZXN0TXRvbVdpdGhEaXNwYXRjaChyZXN1bHQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNsaWVudC50ZXN0TXRvbVdpdGhQcm94eShyZXN1bHQsIGdldFNlcnZsZXRDb25maWcoKS5nZXRTZXJ2bGV0Q29udGV4dCgpLmdldFJlc291cmNlKCIvV0VCLUlORi93c2RsL0ltYWdlRGVwb3QxMi53c2RsIikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5jb25jYXQoIkVSUk9SOiBTRVJWTEVUIEVYQ0VQVElPTiAiICsgZSk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCI+PlNFUlZMRVQ6IEVYQ0VQVElPTiAiICsgZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEZvcm1hdCB0aGUgb3V0cHV0IGFuZCByZWZyZXNoIHRoZSBwYW5lbAotICAgICAgICAgICAgZm9ybWF0T3V0cHV0KHJlcSwgdXJpU3RyaW5nLCAiU2VuZGluZyAnIiArIGZpbGVOYW1lICsgIicgdmlhIE1UT00gIiArICgoMCAhPSBzb2FwU3RyaW5nLmxlbmd0aCgpKSA/ICJTT0FQIDEuMiIgOiAiU09BUCAxLjEiKSwgcmVzdWx0KTsKLSAgICAgICAgICAgIGNvbnRleHQuZ2V0UmVxdWVzdERpc3BhdGNoZXIoSU5ERVhfSlNQX0xPQ0FUSU9OKS5mb3J3YXJkKHJlcSwgcmVzcCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBnZXRwYXJtCi0gICAgICogPHAvPgotICAgICAqIHBhcnNlcyB0aGUgcGFyYW1ldGVycyBmcm9tIHRoZSBtdWx0aXBhcnQtZm9ybSBkYXRhCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGFybSAtIFN0cmluZyB0byBzZWFyY2ggZm9yCi0gICAgICogQHBhcmFtIGRhdGEgLSBTdHJpbmcgd2l0aCBmb3JtIGRhdGEKLSAgICAgKiBAcmV0dXJuIC0gU3RyaW5nIC0gdGhlIHBhcm0gdmFsdWUgb3IgbnVsbCBpZiBub3QgZm91bmQKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBnZXRwYXJtKFN0cmluZyBwYXJtLCBTdHJpbmcgZGF0YSkgewotICAgICAgICBTdHJpbmcgcmV0dmFsID0gbnVsbDsKLSAgICAgICAgcGFybSA9ICJcIiIgKyBwYXJtICsgIlwiIjsKLSAgICAgICAgaW50IHBvcyA9IGRhdGEuaW5kZXhPZihwYXJtKTsKLSAgICAgICAgaWYgKDAgPD0gcG9zKSB7Ci0gICAgICAgICAgICBwb3MgPSBkYXRhLmluZGV4T2YoIlxuIiwgcG9zKSArIDE7Ci0gICAgICAgICAgICBwb3MgPSBkYXRhLmluZGV4T2YoIlxuIiwgcG9zKSArIDE7Ci0gICAgICAgICAgICByZXR2YWwgPSBkYXRhLnN1YnN0cmluZyhwb3MpOwotICAgICAgICAgICAgaWYgKG51bGwgIT0gcmV0dmFsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcmV0dmFsLnN1YnN0cmluZygwLCByZXR2YWwuaW5kZXhPZigiXG4iKSk7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcmV0dmFsLnN1YnN0cmluZygwLCByZXR2YWwuaW5kZXhPZigiXHIiKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldHZhbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBmb3JtYXRPdXRwdXQKLSAgICAgKiA8cC8+Ci0gICAgICogRm9ybWF0IHRoZSB0cmFuc2FjdGlvbiBkYXRhIGludG8gdGhlIEhUTUwgdGV4dCBhcmVhCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVxICAgICAgICAgLSBIdHRwU2VydmxldFJlcXVlc3QKLSAgICAgKiBAcGFyYW0gZW5kcG9pbnRVUkwgLSBTdHJpbmcKLSAgICAgKiBAcGFyYW0gcmVxdWVzdCAgICAgLSBTdHJpbmcgd2l0aCB3aGF0IHdlIHNlbmQKLSAgICAgKiBAcGFyYW0gcmVjZWl2ZWQgICAgLSBTdHJpbmcgcmV0dXJuZWQgdmFsdWUKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgZm9ybWF0T3V0cHV0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIFN0cmluZyBlbmRwb2ludFVSTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyByZXF1ZXN0LCBTdHJpbmcgcmVjZWl2ZWQpIHsKLSAgICAgICAgcmVxLnNldEF0dHJpYnV0ZSgibWVzc2FnZVMiLCAiXG4iICsgIkNvbm5lY3RpbmcgdG8uLi4gIiArIGVuZHBvaW50VVJMCi0gICAgICAgICAgICAgICAgKyAiXG5cbiIgKyAiUmVxdWVzdDogXG4iICsgcmVxdWVzdCArICJcbiIpOwotICAgICAgICByZXEuc2V0QXR0cmlidXRlKCJtZXNzYWdlUiIsICJcbiIgKyAiUmVzcG9uc2U6IFxuIiArIHJlY2VpdmVkCi0gICAgICAgICAgICAgICAgKyAiXG4iKTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy93ZWJhcHAvV0VCLUlORi9heGlzMi54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL3dlYmFwcC9XRUItSU5GL2F4aXMyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGYxYjNhZi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL3dlYmFwcC9XRUItSU5GL2F4aXMyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM1MiArMCwwIEBACi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08YXhpc2NvbmZpZyBuYW1lPSJBeGlzSmF2YTIuMCI+DQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4NCi0gICAgPCEtLSBQYXJhbWV0ZXJzIC0tPg0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+DQotICAgIDxwYXJhbWV0ZXIgbmFtZT0iaG90ZGVwbG95bWVudCI+dHJ1ZTwvcGFyYW1ldGVyPg0KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImhvdHVwZGF0ZSI+ZmFsc2U8L3BhcmFtZXRlcj4NCi0gICAgPHBhcmFtZXRlciBuYW1lPSJlbmFibGVNVE9NIj5mYWxzZTwvcGFyYW1ldGVyPg0KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImVuYWJsZVN3QSI+ZmFsc2U8L3BhcmFtZXRlcj4NCi0NCi0gICAgPCEtLVVuY29tbWVudCBpZiB5b3Ugd2FudCB0byBlbmFibGUgZmlsZSBjYWNoaW5nIGZvciBhdHRhY2htZW50cyAtLT4NCi0gICAgPCEtLXBhcmFtZXRlciBuYW1lPSJjYWNoZUF0dGFjaG1lbnRzIj50cnVlPC9wYXJhbWV0ZXI+DQotICAgIDxwYXJhbWV0ZXIgbmFtZT0iYXR0YWNobWVudERJUiI+PC9wYXJhbWV0ZXI+DQotICAgIDxwYXJhbWV0ZXIgbmFtZT0ic2l6ZVRocmVzaG9sZCI+NDAwMDwvcGFyYW1ldGVyLS0+DQotDQotICAgIDwhLS1VbmNvbW1lbnQgaWYgeW91IHdhbnQgdG8gcGx1Z2luIHlvdXIgb3duIGF0dGFjaG1lbnRzIGxpZmVjeWNsZSBpbXBsZW1lbnRhdGlvbiAtLT4NCi0gICAgPCEtLTxhdHRhY2htZW50c0xpZmVjeWNsZU1hbmFnZXIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpb20uYXR0YWNobWVudHMubGlmZWN5Y2xlLmltcGwuTGlmZWN5Y2xlTWFuYWdlckltcGwiLz4tLT4NCi0NCi0NCi0gICAgPCEtLVVuY29tbWVudCBpZiB5b3Ugd2FudCB0byBlbmFibGUgdGhlIHJlZHVjdGlvbiBvZiB0aGUgaW4tbWVtb3J5IGNhY2hlIG9mIFdTREwgZGVmaW5pdGlvbnMgLS0+DQotICAgIDwhLS1JbiBzb21lIHNlcnZlciBlbnZpcm9ubWVudHMsIHRoZSBhdmFpbGFibGUgbWVtb3J5IGhlYXAgaXMgbGltaXRlZCBhbmQgY2FuIGZpbGwgdXAgdW5kZXIgbG9hZCAtLT4NCi0gICAgPCEtLVNpbmNlIGluLW1lbW9yeSBjb3BpZXMgb2YgV1NETCBkZWZpbml0aW9ucyBjYW4gYmUgbGFyZ2UsIHNvbWUgc3RlcHMgY2FuIGJlIHRha2VuLS0+DQotICAgIDwhLS10byByZWR1Y2UgdGhlIG1lbW9yeSBuZWVkZWQgZm9yIHRoZSBjYWNoZWQgV1NETCBkZWZpbml0aW9ucy4gLS0+DQotICAgIDwhLS1wYXJhbWV0ZXIgbmFtZT0icmVkdWNlV1NETE1lbW9yeUNhY2hlIj50cnVlPC9wYXJhbWV0ZXItLT4NCi0NCi0gICAgPCEtLVRoaXMgd2lsbCBnaXZlIG91dCB0aGUgdGltb3V0IG9mIHRoZSBjb25maWd1cmF0aW9uIGNvbnRleHRzLCBpbiBtaWxsaXNlY29uZHMtLT4NCi0gICAgPHBhcmFtZXRlciBuYW1lPSJDb25maWdDb250ZXh0VGltZW91dEludGVydmFsIj4zMDAwMDwvcGFyYW1ldGVyPg0KLQ0KLSAgICA8IS0tRHVyaW5nIGEgZmF1bHQsIHN0YWNrIHRyYWNlIGNhbiBiZSBzZW50IHdpdGggdGhlIGZhdWx0IG1lc3NhZ2UuIFRoZSBmb2xsb3dpbmcgZmxhZyB3aWxsIGNvbnRyb2wgLS0+DQotICAgIDwhLS10aGF0IGJlaGF2aW9yLi0tPg0KLSAgICA8cGFyYW1ldGVyIG5hbWU9InNlbmRTdGFja3RyYWNlRGV0YWlsc1dpdGhGYXVsdHMiPmZhbHNlPC9wYXJhbWV0ZXI+DQotDQotICAgIDwhLS1JZiB0aGVyZSBhcmVuJ3QgYW55IGluZm9ybWF0aW9uIGF2YWlsYWJsZSB0byBmaW5kIG91dCB0aGUgZmF1bHQgcmVhc29uLCB3ZSBzZXQgdGhlIG1lc3NhZ2Ugb2YgdGhlIGV4Y2VwdGlvbi0tPg0KLSAgICA8IS0tYXMgdGhlIGZhdWx0cmVhc29uL1JlYXNvbi4gQnV0IHdoZW4gYSBmYXVsdCBpcyB0aHJvd24gZnJvbSBhIHNlcnZpY2Ugb3Igc29tZSB3aGVyZSwgaXQgd2lsbCBiZSAtLT4NCi0gICAgPCEtLXdyYXBwZWQgYnkgZGlmZmVyZW50IGxldmVscy4gRHVlIHRvIHRoaXMgdGhlIGluaXRpYWwgZXhjZXB0aW9uIG1lc3NhZ2UgY2FuIGJlIGxvc3QuIElmIHRoaXMgZmxhZy0tPg0KLSAgICA8IS0taXMgc2V0LCB0aGVuIEF4aXMyIHRyaWVzIHRvIGdldCB0aGUgZmlyc3QgZXhjZXB0aW9uIGFuZCBzZXQgaXRzIG1lc3NhZ2UgYXMgdGhlIGZhdWx0cmVhc29uL1JlYXNvbi4tLT4NCi0gICAgPHBhcmFtZXRlciBuYW1lPSJEcmlsbERvd25Ub1Jvb3RDYXVzZUZvckZhdWx0UmVhc29uIj5mYWxzZTwvcGFyYW1ldGVyPg0KLQ0KLSAgICA8cGFyYW1ldGVyIG5hbWU9InVzZXJOYW1lIj5hZG1pbjwvcGFyYW1ldGVyPg0KLSAgICA8cGFyYW1ldGVyIG5hbWU9InBhc3N3b3JkIj5heGlzMjwvcGFyYW1ldGVyPg0KLQ0KLSAgICA8IS0tVG8gb3ZlcnJpZGUgcmVwb3NpdG9yeS9zZXJ2aWNlcyB5b3UgbmVlZCB0byB1bmNvbW1lbnQgZm9sbG93aW5nIHBhcmFtZXRlciBhbmQgdmFsdWUgU0hPVUxEIGJlIGFic29sdXRlIGZpbGUgcGF0aC4tLT4NCi0gICAgPCEtLVNlcnZpY2VzRGlyZWN0b3J5IG9ubHkgd29ya3Mgb24gdGhlIGZvbGxvd2luZyBjYXNlcy0tPg0KLSAgICA8IS0tLUZpbGUgYmFzZWQgY29uZmlndXJhdG9yIGFuZCBpbiB0aGF0IGNhc2UgdGhlIHZhbHVlIHNob3VsZCBiZSBhIGZpbGUgVVJMIChodHRwOi8vIG5vdCBhbGxvd2VkKS0tPg0KLSAgICA8IS0tLVdoZW4gY3JlYXRpbmcgVVJMIEJhc2VkIGNvbmZpZ3VyYXRvciB3aXRoIFVSTCDigJxmaWxlOi8v4oCdICAtLT4NCi0gICAgPCEtLS0gV2FyIGJhc2VkIGNvbmZpZ3VyYXRvciB3aXRoIGV4cGFuZGVkIGNhc2UgLCAtLT4NCi0NCi0gICAgPCEtLUFsbCB0aGUgb3RoZXIgc2NlbmFyaW9zIGl0IHdpbGwgYmUgaWdub3JlZC4tLT4NCi0gICAgPCEtLTxwYXJhbWV0ZXIgbmFtZT0iU2VydmljZXNEaXJlY3RvcnkiPnNlcnZpY2U8L3BhcmFtZXRlcj4tLT4NCi0gICAgPCEtLVRvIG92ZXJyaWRlIHJlcG9zaXRvcnkvbW9kdWxlcyB5b3UgbmVlZCB0byB1bmNvbW1lbnQgZm9sbG93aW5nIHBhcmFtZXRlciBhbmQgdmFsdWUgU0hPVUxEIGJlIGFic29sdXRlIGZpbGUgcGF0aC0tPg0KLSAgICA8IS0tPHBhcmFtZXRlciBuYW1lPSJNb2R1bGVzRGlyZWN0b3J5Ij5tb2R1bGVzPC9wYXJhbWV0ZXI+LS0+DQotDQotDQotICAgIDwhLS1Gb2xsb3dpbmcgcGFyYW1zIHdpbGwgc2V0IHRoZSBwcm9wZXIgY29udGV4dCBwYXRocyBmb3IgaW52b2NhdGlvbnMuIEFsbCB0aGUgZW5kcG9pbnRzIHdpbGwgaGF2ZSBhIGNvbW1vbnMgY29udGV4dC0tPg0KLSAgICA8IS0tcm9vdCB3aGljaCBjYW4gY29uZmlndXJlZCB1c2luZyB0aGUgZm9sbG93aW5nIGNvbnRleHRSb290IHBhcmFtZXRlci0tPg0KLSAgICA8IS0tPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0Um9vdCI+YXhpczI8L3BhcmFtZXRlcj4tLT4NCi0NCi0gICAgPCEtLU91ciBIVFRQIGVuZHBvaW50cyBjYW4gaGFuZGxlIGJvdGggUkVTVCBhbmQgU09BUC4gRm9sbG93aW5nIHBhcmFtZXRlcnMgY2FuIGJlIHVzZWQgdG8gZGlzdGluZ3VpdXNoIHRob3NlIGVuZHBvaW50cy0tPg0KLSAgICA8IS0tSW4gY2FzZSBvZiBhIHNlcnZsZXQsIGlmIHlvdSBjaGFuZ2UgdGhpcyB5b3UgaGF2ZSB0byBtYW51YWxseSBjaGFuZ2UgdGhlIHNldHRpbmdzIG9mIHlvdXIgc2VydmxldCBjb250YWluZXIgdG8gbWFwIHRoaXMgLS0+DQotICAgIDwhLS1jb250ZXh0IHBhdGggdG8gcHJvcGVyIEF4aXMyIHNlcnZsZXRzLS0+DQotICAgIDwhLS08cGFyYW1ldGVyIG5hbWU9InNlcnZpY2VQYXRoIj5zZXJ2aWNlczwvcGFyYW1ldGVyPi0tPg0KLSAgICA8IS0tPHBhcmFtZXRlciBuYW1lPSJyZXN0UGF0aCI+cmVzdDwvcGFyYW1ldGVyPi0tPg0KLQ0KLSAgICA8IS0tIEZvbGxvd2luZyBwYXJhbWV0ZXIgd2lsbCBjb21wbGV0ZWx5IGRpc2FibGUgUkVTVCBoYW5kbGluZyBpbiBBeGlzMi0tPg0KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImRpc2FibGVSRVNUIiBsb2NrZWQ9InRydWUiPmZhbHNlPC9wYXJhbWV0ZXI+DQotDQotICAgIDwhLS0gRm9sbG93aW5nIHBhcmFtZXRlciB3aWxsIHN1cHByZXNzIGdlbmVyYXRpb24gb2YgU09BUCAxLjIgYmluZGluZ3MgaW4gYXV0by1nZW5lcmF0ZWQgV1NETCBmaWxlcyAtLT4NCi0gICAgPHBhcmFtZXRlciBuYW1lPSJkaXNhYmxlU09BUDEyIiBsb2NrZWQ9InRydWUiPmZhbHNlPC9wYXJhbWV0ZXI+DQotDQotICAgIDwhLS1QT0pPIGRlcGxveWVyICwgdGhpcyB3aWxsIGFsb3cgdXNlcnMgdG8gZHJvcCAuY2xhc3MgZmlsZSBhbmQgbWFrZSB0aGF0IGludG8gYSBzZXJ2aWNlLS0+DQotICAgIDxkZXBsb3llciBleHRlbnNpb249Ii5jbGFzcyIgZGlyZWN0b3J5PSJwb2pvIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LlBPSk9EZXBsb3llciIvPg0KLSAgICA8ZGVwbG95ZXIgZXh0ZW5zaW9uPSIuamFyIiBkaXJlY3Rvcnk9InBvam8iIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmZyYW1ld29yay5KQVhXU0RlcGxveWVyIi8+DQotICAgIDwhLS08ZGVwbG95ZXIgZXh0ZW5zaW9uPSIuanNhIiBkaXJlY3Rvcnk9InJtaXNlcnZpY2VzIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5ybWkuZGVwbG95LlJNSVNlcnZpY2VEZXBsb3llciIvPi0tPg0KLQ0KLQ0KLSAgICA8IS0tIEZvbGxvd2luZyBwYXJhbWV0ZXIgd2lsbCBzZXQgdGhlIGhvc3QgbmFtZSBmb3IgdGhlIGVwci0tPg0KLSAgICA8IS0tPHBhcmFtZXRlciBuYW1lPSJob3N0bmFtZSIgbG9ja2VkPSJ0cnVlIj5teWhvc3QuY29tPC9wYXJhbWV0ZXI+LS0+DQotDQotICAgIDwhLS0gSWYgeW91IGhhdmUgYSBmcm9udCBlbmQgaG9zdCB3aGljaCBleHBvc2VzIHRoaXMgd2Vic2VydmljZSB1c2luZyBhIGRpZmZlcmVudCBwdWJsaWMgVVJMICAtLT4NCi0gICAgPCEtLSB1c2UgdGhpcyBwYXJhbWV0ZXIgdG8gb3ZlcnJpZGUgYXV0b2RldGVjdGVkIHVybCAtLT4NCi0gICAgPCEtLTxwYXJhbWV0ZXIgbmFtZT0iaHR0cEZyb250ZW5kSG9zdFVybCI+aHR0cHM6Ly9zb21lb3RoZXJob3N0L2NvbnRleHQ8L3BhcmFtZXRlcj4tLT4NCi0NCi0NCi0gICAgPCEtLSAgICBUaGUgd2F5IG9mIGFkZGluZyBsaXN0ZW5lciB0byB0aGUgc3lzdGVtLS0+DQotICAgIDwhLS0gICAgPGxpc3RlbmVyIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLk9ic2VydmVySU1QTCI+LS0+DQotICAgIDwhLS0gICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iUlNTX1VSTCI+aHR0cDovLzEyNy4wLjAuMS9yc3M8L3BhcmFtZXRlcj4tLT4NCi0gICAgPCEtLSAgICA8L2xpc3RlbmVyPi0tPg0KLQ0KLSAgICA8IS0tIFVuY29tbWVudCBpZiBKQVgtV1MgMi4xIHN1cHBvcnQgaXMgbmVlZGVkLiAtLT4NCi0gICAgPCEtLQ0KLSAgICA8dGhyZWFkQ29udGV4dE1pZ3JhdG9ycz4NCi0gICAgICAgIDx0aHJlYWRDb250ZXh0TWlncmF0b3IgbGlzdElkPSJKQVhXUy1UaHJlYWRDb250ZXh0TWlncmF0b3ItTGlzdCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuamF4d3MuYWRkcmVzc2luZy5taWdyYXRvci5FbmRwb2ludENvbnRleHRNYXBNaWdyYXRvciIvPg0KLSAgICA8L3RocmVhZENvbnRleHRNaWdyYXRvcnM+DQotICAgIC0tPg0KLQ0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+DQotICAgIDwhLS0gTWVzc2FnZSBSZWNlaXZlcnMgLS0+DQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4NCi0gICAgPCEtLVRoaXMgaXMgdGhlIGRlYWZ1bHQgTWVzc2FnZVJlY2VpdmVyIGZvciB0aGUgc3lzdGVtICwgaWYgeW91IHdhbnQgdG8gaGF2ZSBNZXNzYWdlUmVjZWl2ZXJzIGZvciAtLT4NCi0gICAgPCEtLWFsbCB0aGUgb3RoZXIgTUVQIGltcGxlbWVudCBpdCBhbmQgYWRkIHRoZSBjb3JyZWN0IGVudHJ5IHRvIGhlcmUgLCBzbyB0aGF0IHlvdSBjYW4gcmVmZXIgZnJvbS0tPg0KLSAgICA8IS0tYW55IG9wZXJhdGlvbiAtLT4NCi0gICAgPCEtLU5vdGUgOiBZb3UgY2FuIG92cnJpZGUgdGhpcyBmb3IgYSBwYXJ0aWN1bGFyIHNlcnZpY2UgYnkgYWRkaW5nIHRoZSBzYW1lIGVsZW1lbnQgd2l0aCB5b3VyIHJlcXVpcmVtZW50LS0+DQotICAgIDxtZXNzYWdlUmVjZWl2ZXJzPg0KLSAgICAgICAgPG1lc3NhZ2VSZWNlaXZlciBtZXA9Imh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgvd3NkbC9pbi1vbmx5Ig0KLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuUmF3WE1MSU5Pbmx5TWVzc2FnZVJlY2VpdmVyIi8+DQotICAgICAgICA8bWVzc2FnZVJlY2VpdmVyIG1lcD0iaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC93c2RsL2luLW91dCINCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLlJhd1hNTElOT3V0TWVzc2FnZVJlY2VpdmVyIi8+DQotICAgICAgICA8bWVzc2FnZVJlY2VpdmVyIG1lcD0iaHR0cDovL3d3dy53My5vcmcvMjAwNi8wMS93c2RsL2luLW9ubHkiDQotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5SYXdYTUxJTk9ubHlNZXNzYWdlUmVjZWl2ZXIiLz4NCi0gICAgICAgIDxtZXNzYWdlUmVjZWl2ZXIgbWVwPSJodHRwOi8vd3d3LnczLm9yZy8yMDA2LzAxL3dzZGwvaW4tb3V0Ig0KLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuUmF3WE1MSU5PdXRNZXNzYWdlUmVjZWl2ZXIiLz4NCi0gICAgPC9tZXNzYWdlUmVjZWl2ZXJzPg0KLQ0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+DQotICAgIDwhLS0gTWVzc2FnZSBGb3JtYXR0ZXIgLS0+DQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4NCi0gICAgPCEtLUZvbGxvd2luZyBjb250ZW50IHR5cGUgdG8gbWVzc2FnZSBmb3JtYXR0ZXIgbWFwcGluZyBjYW4gYmUgdXNlZCB0byBpbXBsZW1lbnQgc3VwcG9ydCBmb3IgZGlmZmVyZW50IG1lc3NhZ2UgLS0+DQotICAgIDwhLS1mb3JtYXQgIHNlcmlhbGl6YXRpb24gaW4gQXhpczIuIFRoZXNlIG1lc3NhZ2UgZm9ybWF0cyBhcmUgZXhwZWN0ZWQgdG8gYmUgcmVzb2x2ZWQgYmFzZWQgb24gdGhlIGNvbnRlbnQgdHlwZS4gLS0+DQotICAgIDxtZXNzYWdlRm9ybWF0dGVycz4NCi0gICAgICAgIDxtZXNzYWdlRm9ybWF0dGVyIGNvbnRlbnRUeXBlPSJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiDQotICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5YRm9ybVVSTEVuY29kZWRGb3JtYXR0ZXIiLz4NCi0gICAgICAgIDxtZXNzYWdlRm9ybWF0dGVyIGNvbnRlbnRUeXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuTXVsdGlwYXJ0Rm9ybURhdGFGb3JtYXR0ZXIiLz4NCi0gICAgICAgIDxtZXNzYWdlRm9ybWF0dGVyIGNvbnRlbnRUeXBlPSJhcHBsaWNhdGlvbi94bWwiDQotICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5BcHBsaWNhdGlvblhNTEZvcm1hdHRlciIvPg0KLSAgICAgICAgPG1lc3NhZ2VGb3JtYXR0ZXIgY29udGVudFR5cGU9InRleHQveG1sIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuU09BUE1lc3NhZ2VGb3JtYXR0ZXIiLz4NCi0gICAgICAgIDxtZXNzYWdlRm9ybWF0dGVyIGNvbnRlbnRUeXBlPSJhcHBsaWNhdGlvbi9zb2FwK3htbCINCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLlNPQVBNZXNzYWdlRm9ybWF0dGVyIi8+DQotICAgIDwvbWVzc2FnZUZvcm1hdHRlcnM+DQotDQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4NCi0gICAgPCEtLSBNZXNzYWdlIEJ1aWxkZXJzIC0tPg0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+DQotICAgIDwhLS1Gb2xsb3dpbmcgY29udGVudCB0eXBlIHRvIGJ1aWxkZXIgbWFwcGluZyBjYW4gYmUgdXNlZCB0byBpbXBsZW1lbnQgc3VwcG9ydCBmb3IgZGlmZmVyZW50IG1lc3NhZ2UgLS0+DQotICAgIDwhLS1mb3JtYXRzIGluIEF4aXMyLiBUaGVzZSBtZXNzYWdlIGZvcm1hdHMgYXJlIGV4cGVjdGVkIHRvIGJlIHJlc29sdmVkIGJhc2VkIG9uIHRoZSBjb250ZW50IHR5cGUuIC0tPg0KLSAgICA8bWVzc2FnZUJ1aWxkZXJzPg0KLSAgICAgICAgPG1lc3NhZ2VCdWlsZGVyIGNvbnRlbnRUeXBlPSJhcHBsaWNhdGlvbi94bWwiDQotICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuYnVpbGRlci5BcHBsaWNhdGlvblhNTEJ1aWxkZXIiLz4NCi0gICAgICAgIDxtZXNzYWdlQnVpbGRlciBjb250ZW50VHlwZT0iYXBwbGljYXRpb24veG1sIg0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmJ1aWxkZXIuQXBwbGljYXRpb25YTUxCdWlsZGVyIi8+DQotICAgICAgICA8bWVzc2FnZUJ1aWxkZXIgY29udGVudFR5cGU9ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCINCi0gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5idWlsZGVyLlhGb3JtVVJMRW5jb2RlZEJ1aWxkZXIiLz4NCi0gICAgICAgIDxtZXNzYWdlQnVpbGRlciBjb250ZW50VHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSINCi0gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5idWlsZGVyLk11bHRpcGFydEZvcm1EYXRhQnVpbGRlciIvPg0KLSAgICA8L21lc3NhZ2VCdWlsZGVycz4NCi0NCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPg0KLSAgICA8IS0tIFRyYW5zcG9ydCBJbnMgLS0+DQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4NCi0gICAgPHRyYW5zcG9ydFJlY2VpdmVyIG5hbWU9Imh0dHAiDQotICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5TaW1wbGVIVFRQU2VydmVyIj4NCi0gICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icG9ydCI+NjA2MDwvcGFyYW1ldGVyPg0KLSAgICAgICAgPCEtLSBIZXJlIGlzIHRoZSBjb21wbGV0ZSBsaXN0IG9mIHN1cHBvcnRlZCBwYXJhbWV0ZXJzIChzZWUgZXhhbXBsZSBzZXR0aW5ncyBmdXJ0aGVyIGJlbG93KToNCi0gICAgICAgICAgICBwb3J0OiB0aGUgcG9ydCB0byBsaXN0ZW4gb24gKGRlZmF1bHQgNjA2MCkNCi0gICAgICAgICAgICBob3N0bmFtZTogIGlmIG5vbi1udWxsLCB1cmwgcHJlZml4IHVzZWQgaW4gcmVwbHktdG8gZW5kcG9pbnQgcmVmZXJlbmNlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkZWZhdWx0IG51bGwpDQotICAgICAgICAgICAgb3JpZ2luU2VydmVyOiAgdmFsdWUgb2YgaHR0cCBTZXJ2ZXIgaGVhZGVyIGluIG91dGdvaW5nIG1lc3NhZ2VzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdCAiU2ltcGxlLVNlcnZlci8xLjEiKQ0KLSAgICAgICAgICAgIHJlcXVlc3RUaW1lb3V0OiAgdmFsdWUgaW4gbWlsbGlzIG9mIHRpbWUgdGhhdCByZXF1ZXN0cyBjYW4gd2FpdCBmb3IgZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQgMjAwMDApDQotICAgICAgICAgICAgcmVxdWVzdFRjcE5vRGVsYXk6ICB0cnVlIHRvIG1heGltaXplIHBlcmZvcm1hbmNlIGFuZCBtaW5pbWl6ZSBsYXRlbmN5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdCB0cnVlKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgdG8gbWluaW1pemUgYmFuZHdpZHRoIGNvbnN1bXB0aW9uIGJ5IGNvbWJpbmluZyBzZWdtZW50cw0KLSAgICAgICAgICAgIHJlcXVlc3RDb3JlVGhyZWFkUG9vbFNpemU6ICBudW1iZXIgb2YgdGhyZWFkcyBhdmFpbGFibGUgZm9yIHJlcXVlc3QgcHJvY2Vzc2luZyAodW5sZXNzIHF1ZXVlIGZpbGxzIHVwKSAgKGRlZmF1bHQgMjUpDQotICAgICAgICAgICAgcmVxdWVzdE1heFRocmVhZFBvb2xTaXplOiAgbnVtYmVyIG9mIHRocmVhZHMgYXZhaWxhYmxlIGZvciByZXF1ZXN0IHByb2Nlc3NpbmcgaWYgcXVldWUgZmlsbHMgdXAgICAgICAgICAoZGVmYXVsdCAxNTApDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90ZSB0aGF0IGRlZmF1bHQgcXVldWUgbmV2ZXIgZmlsbHMgdXA6ICBzZWUgSHR0cEZhY3RvcnkNCi0gICAgICAgICAgICB0aHJlYWRLZWVwQWxpdmVUaW1lOiAgdGltZSB0byBrZWVwIHRocmVhZHMgaW4gZXhjZXNzIG9mIGNvcmUgc2l6ZSBhbGl2ZSB3aGlsZSBpbmFjdGl2ZSAgICAgICAgICAgICAgICAgIChkZWZhdWx0IDE4MCkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90ZSB0aGF0IG5vIHN1Y2ggdGhyZWFkcyBjYW4gZXhpc3Qgd2l0aCBkZWZhdWx0IHVuYm91bmRlZCByZXF1ZXN0IHF1ZXVlDQotICAgICAgICAgICAgdGhyZWFkS2VlcEFsaXZlVGltZVVuaXQ6ICBUaW1lVW5pdCBvZiB2YWx1ZSBpbiB0aHJlYWRLZWVwQWxpdmVUaW1lIChkZWZhdWx0IFNFQ09ORFMpICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdCBTRUNPTkRTKQ0KLSAgICAgICAgLS0+DQotICAgICAgICA8IS0tIDxwYXJhbWV0ZXIgbmFtZT0iaG9zdG5hbWUiPmh0dHA6Ly93d3cubXlBcHAuY29tL3dzPC9wYXJhbWV0ZXI+IC0tPg0KLSAgICAgICAgPCEtLSA8cGFyYW1ldGVyIG5hbWU9Im9yaWdpblNlcnZlciI+TXktU2VydmVyLzEuMTwvcGFyYW1ldGVyPiAgICAgICAgICAgLS0+DQotICAgICAgICA8IS0tIDxwYXJhbWV0ZXIgbmFtZT0icmVxdWVzdFRpbWVvdXQiPjEwMDAwPC9wYXJhbWV0ZXI+ICAgICAgICAgICAgICAgICAgIC0tPg0KLSAgICAgICAgPCEtLSA8cGFyYW1ldGVyIG5hbWU9InJlcXVlc3RUY3BOb0RlbGF5Ij5mYWxzZTwvcGFyYW1ldGVyPiAgICAgICAgICAgICAgICAgICAtLT4NCi0gICAgICAgIDwhLS0gPHBhcmFtZXRlciBuYW1lPSJyZXF1ZXN0Q29yZVRocmVhZFBvb2xTaXplIj41MDwvcGFyYW1ldGVyPiAgICAgICAgICAgICAgICAgICAgICAtLT4NCi0gICAgICAgIDwhLS0gPHBhcmFtZXRlciBuYW1lPSJyZXF1ZXN0TWF4VGhyZWFkUG9vbFNpemUiPjEwMDwvcGFyYW1ldGVyPiAgICAgICAgICAgICAgICAgICAgIC0tPg0KLSAgICAgICAgPCEtLSA8cGFyYW1ldGVyIG5hbWU9InRocmVhZEtlZXBBbGl2ZVRpbWUiPjI0MDAwMDwvcGFyYW1ldGVyPiAgICAgICAgICAgICAgICAgIC0tPg0KLSAgICAgICAgPCEtLSA8cGFyYW1ldGVyIG5hbWU9InRocmVhZEtlZXBBbGl2ZVRpbWVVbml0Ij5NSUxMSVNFQ09ORFM8L3BhcmFtZXRlcj4gICAgICAgICAgICAtLT4NCi0gICAgPC90cmFuc3BvcnRSZWNlaXZlcj4NCi0NCi0gICAgPCEtLVVuY29tbWVudCBpZiB5b3Ugd2FudCB0byBoYXZlIFRDUCB0cmFuc3BvcnQgc3VwcG9ydC0tPg0KLSAgICA8IS0tdHJhbnNwb3J0UmVjZWl2ZXIgbmFtZT0idGNwIg0KLSAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0LnRjcC5UQ1BTZXJ2ZXIiPg0KLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJwb3J0Ij42MDYwPC9wYXJhbWV0ZXItLT4+DQotICAgIDwhLS1JZiB5b3Ugd2FudCB0byBnaXZlIHlvdXIgb3duIGhvc3QgYWRkcmVzcyBmb3IgRVBSIGdlbmVyYXRpb24tLT4NCi0gICAgPCEtLXVuY29tbWVudCB0aGUgZm9sbG93aW5nIHBhcmFtdGVyICwgYW5kIHNldCBpdCBhcyB5b3UgcmVxdWlyZWQuLS0+DQotICAgIDwhLS08cGFyYW1ldGVyIG5hbWU9Imhvc3RuYW1lIj50Y3A6Ly9teUFwcC5jb20vd3M8L3BhcmFtZXRlcj4tLT4NCi0gICAgPCEtLSAvdHJhbnNwb3J0UmVjZWl2ZXIgLS0+DQotDQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4NCi0gICAgPCEtLSBUcmFuc3BvcnQgT3V0cyAtLT4NCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPg0KLQ0KLSAgICA8IS0tVW5jb21tZW50IGlmIHlvdSB3YW50IHRvIGhhdmUgVENQIHRyYW5zcG9ydCBzdXBwb3J0LS0+DQotICAgIDwhLS0NCi0gICAgPHRyYW5zcG9ydFNlbmRlciBuYW1lPSJ0Y3AiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0LnRjcC5UQ1BUcmFuc3BvcnRTZW5kZXIiLz4NCi0gICAgLS0+DQotICAgIDx0cmFuc3BvcnRTZW5kZXIgbmFtZT0ibG9jYWwiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0LmxvY2FsLkxvY2FsVHJhbnNwb3J0U2VuZGVyIi8+DQotICAgIDx0cmFuc3BvcnRTZW5kZXIgbmFtZT0iaHR0cCINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5Db21tb25zSFRUUFRyYW5zcG9ydFNlbmRlciI+DQotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9IlBST1RPQ09MIj5IVFRQLzEuMTwvcGFyYW1ldGVyPg0KLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJUcmFuc2Zlci1FbmNvZGluZyI+Y2h1bmtlZDwvcGFyYW1ldGVyPg0KLQ0KLSAgICAgICAgPCEtLSBJZiBmb2xsb3dpbmcgaXMgc2V0IHRvICd0cnVlJywgb3B0aW9uYWwgYWN0aW9uIHBhcnQgb2YgdGhlIENvbnRlbnQtVHlwZSB3aWxsIG5vdCBiZSBhZGRlZCB0byB0aGUgU09BUCAxLjIgbWVzc2FnZXMgLS0+DQotICAgICAgICA8IS0tICA8cGFyYW1ldGVyIG5hbWU9Ik9taXRTT0FQMTJBY3Rpb24iPnRydWU8L3BhcmFtZXRlcj4gIC0tPg0KLSAgICA8L3RyYW5zcG9ydFNlbmRlcj4NCi0NCi0gICAgPHRyYW5zcG9ydFNlbmRlciBuYW1lPSJodHRwcyINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5Db21tb25zSFRUUFRyYW5zcG9ydFNlbmRlciI+DQotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9IlBST1RPQ09MIj5IVFRQLzEuMTwvcGFyYW1ldGVyPg0KLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJUcmFuc2Zlci1FbmNvZGluZyI+Y2h1bmtlZDwvcGFyYW1ldGVyPg0KLSAgICA8L3RyYW5zcG9ydFNlbmRlcj4NCi0gICAgPHRyYW5zcG9ydFNlbmRlciBuYW1lPSJqYXZhIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5qYXZhLkphdmFUcmFuc3BvcnRTZW5kZXIiLz4NCi0NCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPg0KLSAgICA8IS0tIEdsb2JhbCBNb2R1bGVzICAtLT4NCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPg0KLSAgICA8IS0tIENvbW1lbnQgdGhpcyB0byBkaXNhYmxlIEFkZHJlc3NpbmcgLS0+DQotICAgIDxtb2R1bGUgcmVmPSJhZGRyZXNzaW5nIi8+DQotDQotICAgIDwhLS1Db25maWd1cmluZyBtb2R1bGUgLCBwcm92aWRpbmcgcGFyYW1ldGVycyBmb3IgbW9kdWxlcyB3aGV0aGVyIHRoZXkgcmVmZXIgb3Igbm90LS0+DQotICAgIDwhLS08bW9kdWxlQ29uZmlnIG5hbWU9ImFkZHJlc3NpbmciPi0tPg0KLSAgICA8IS0tPHBhcmFtZXRlciBuYW1lPSJhZGRyZXNzaW5nUGFyYSI+Ti9BPC9wYXJhbWV0ZXI+LS0+DQotICAgIDwhLS08L21vZHVsZUNvbmZpZz4tLT4NCi0NCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPg0KLSAgICA8IS0tIENsdXN0ZXJpbmcgIC0tPg0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+DQotICAgIDwhLS0gQ29uZmlndXJlIGFuZCB1bmNvbW1lbnQgZm9sbG93aW5nIGZvciBwcmVwYXJpbmcgQXhpczIgdG8gYSBjbHVzdGVyZWQgZW52aXJvbm1lbnQgLS0+DQotICAgIDwhLS0NCi0gICAgPGNsdXN0ZXIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuY2x1c3Rlci50cmliZXMuVHJpYmVzQ2x1c3Rlck1hbmFnZXIiPg0KLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJwYXJhbTEiPnZhbHVlMTwvcGFyYW1ldGVyPg0KLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJkb21haW4iPmFwYWNoZS5heGlzMi5kb21haW48L3BhcmFtZXRlcj4NCi0gICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0ic3luY2hyb25pemVBbGwiPnRydWU8L3BhcmFtZXRlcj4NCi0gICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0ibWF4UmV0cmllcyI+MTA8L3BhcmFtZXRlcj4NCi0gICAgCTxjb25maWd1cmF0aW9uTWFuYWdlciBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyLmNvbmZpZ3VyYXRpb24uVHJpYmVzQ29uZmlndXJhdGlvbk1hbmFnZXIiPg0KLSAgICAJICAgIDxsaXN0ZW5lciBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyLmNvbmZpZ3VyYXRpb24uRGVmYXVsdENvbmZpZ3VyYXRpb25NYW5hZ2VyTGlzdGVuZXIiLz4NCi0gICAgCTwvY29uZmlndXJhdGlvbk1hbmFnZXI+DQotICAgIAk8Y29udGV4dE1hbmFnZXIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuY2x1c3Rlci5jb250ZXh0LlRyaWJlc0NvbnRleHRNYW5hZ2VyIj4NCi0gICAgCSAgICA8bGlzdGVuZXIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuY2x1c3Rlci5jb250ZXh0LkRlZmF1bHRDb250ZXh0TWFuYWdlckxpc3RlbmVyIi8+DQotICAgIAk8L2NvbnRleHRNYW5hZ2VyPg0KLSAgICA8L2NsdXN0ZXI+DQotICAgIC0tPg0KLQ0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+DQotICAgIDwhLS0gUGhhc2VzICAtLT4NCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPg0KLSAgICA8cGhhc2VPcmRlciB0eXBlPSJJbkZsb3ciPg0KLSAgICAgICAgPCEtLSAgU3lzdGVtIHByZWRlZmluZWQgcGhhc2VzICAgICAgIC0tPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9IlRyYW5zcG9ydCI+DQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5SZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIj4NCi0gICAgICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJUcmFuc3BvcnQiLz4NCi0gICAgICAgICAgICA8L2hhbmRsZXI+DQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIj4NCi0gICAgICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJUcmFuc3BvcnQiLz4NCi0gICAgICAgICAgICA8L2hhbmRsZXI+DQotICAgICAgICA8L3BoYXNlPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9IkFkZHJlc3NpbmciPg0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciI+DQotICAgICAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iQWRkcmVzc2luZyIvPg0KLSAgICAgICAgICAgIDwvaGFuZGxlcj4NCi0gICAgICAgIDwvcGhhc2U+DQotICAgICAgICA8cGhhc2UgbmFtZT0iU2VjdXJpdHkiLz4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJQcmVEaXNwYXRjaCIvPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9IkRpc3BhdGNoIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuRGlzcGF0Y2hQaGFzZSI+DQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5SZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIi8+DQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIi8+DQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iUmVxdWVzdFVSSU9wZXJhdGlvbkRpc3BhdGNoZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSU9wZXJhdGlvbkRpc3BhdGNoZXIiLz4NCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIi8+DQotDQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iSFRUUExvY2F0aW9uQmFzZWREaXNwYXRjaGVyIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLkhUVFBMb2NhdGlvbkJhc2VkRGlzcGF0Y2hlciIvPg0KLSAgICAgICAgPC9waGFzZT4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJSTVBoYXNlIi8+DQotICAgICAgICA8IS0tICBTeXN0ZW0gcHJlZGVmaW5lZCBwaGFzZXMgICAgICAgLS0+DQotICAgICAgICA8IS0tICAgQWZ0ZXIgUG9zdGRpc3BhdGNoIHBoYXNlIG1vZHVsZSBhdXRob3Igb3Igc2VydmljZSBhdXRob3IgY2FuIGFkZCBhbnkgcGhhc2UgaGUgd2FudCAgICAgIC0tPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik9wZXJhdGlvbkluUGhhc2UiLz4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJzb2FwbW9uaXRvclBoYXNlIi8+DQotICAgIDwvcGhhc2VPcmRlcj4NCi0gICAgPHBoYXNlT3JkZXIgdHlwZT0iT3V0RmxvdyI+DQotICAgICAgICA8IS0tICAgICAgdXNlciBjYW4gYWRkIGhpcyBvd24gcGhhc2VzIHRvIHRoaXMgYXJlYSAgLS0+DQotICAgICAgICA8cGhhc2UgbmFtZT0ic29hcG1vbml0b3JQaGFzZSIvPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik9wZXJhdGlvbk91dFBoYXNlIi8+DQotICAgICAgICA8IS0tc3lzdGVtIHByZWRlZmluZWQgcGhhc2UtLT4NCi0gICAgICAgIDwhLS10aGVzZSBwaGFzZSB3aWxsIHJ1biBpcnJlc3BlY3RpdmUgb2YgdGhlIHNlcnZpY2UtLT4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJSTVBoYXNlIi8+DQotICAgICAgICA8cGhhc2UgbmFtZT0iUG9saWN5RGV0ZXJtaW5hdGlvbiIvPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik1lc3NhZ2VPdXQiLz4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJTZWN1cml0eSIvPg0KLSAgICA8L3BoYXNlT3JkZXI+DQotICAgIDxwaGFzZU9yZGVyIHR5cGU9IkluRmF1bHRGbG93Ij4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJBZGRyZXNzaW5nIj4NCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJBZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiPg0KLSAgICAgICAgICAgICAgICA8b3JkZXIgcGhhc2U9IkFkZHJlc3NpbmciLz4NCi0gICAgICAgICAgICA8L2hhbmRsZXI+DQotICAgICAgICA8L3BoYXNlPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9IlNlY3VyaXR5Ii8+DQotICAgICAgICA8cGhhc2UgbmFtZT0iUHJlRGlzcGF0Y2giLz4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJEaXNwYXRjaCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkRpc3BhdGNoUGhhc2UiPg0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciIvPg0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciIvPg0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlJlcXVlc3RVUklPcGVyYXRpb25EaXNwYXRjaGVyIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklPcGVyYXRpb25EaXNwYXRjaGVyIi8+DQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciIvPg0KLQ0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IkhUVFBMb2NhdGlvbkJhc2VkRGlzcGF0Y2hlciINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5IVFRQTG9jYXRpb25CYXNlZERpc3BhdGNoZXIiLz4NCi0gICAgICAgIDwvcGhhc2U+DQotICAgICAgICA8cGhhc2UgbmFtZT0iUk1QaGFzZSIvPg0KLSAgICAgICAgPCEtLSAgICAgIHVzZXIgY2FuIGFkZCBoaXMgb3duIHBoYXNlcyB0byB0aGlzIGFyZWEgIC0tPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik9wZXJhdGlvbkluRmF1bHRQaGFzZSIvPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9InNvYXBtb25pdG9yUGhhc2UiLz4NCi0gICAgPC9waGFzZU9yZGVyPg0KLSAgICA8cGhhc2VPcmRlciB0eXBlPSJPdXRGYXVsdEZsb3ciPg0KLSAgICAgICAgPCEtLSAgICAgIHVzZXIgY2FuIGFkZCBoaXMgb3duIHBoYXNlcyB0byB0aGlzIGFyZWEgIC0tPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9InNvYXBtb25pdG9yUGhhc2UiLz4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJPcGVyYXRpb25PdXRGYXVsdFBoYXNlIi8+DQotICAgICAgICA8cGhhc2UgbmFtZT0iUk1QaGFzZSIvPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9IlBvbGljeURldGVybWluYXRpb24iLz4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJNZXNzYWdlT3V0Ii8+DQotICAgIDwvcGhhc2VPcmRlcj4NCi08L2F4aXNjb25maWc+DQotDQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy93ZWJhcHAvV0VCLUlORi9jbGFzc2VzL2NvbW1vbnMtbG9nZ2luZy5wcm9wZXJ0aWVzIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy93ZWJhcHAvV0VCLUlORi9jbGFzc2VzL2NvbW1vbnMtbG9nZ2luZy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWZkZDBhLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvd2ViYXBwL1dFQi1JTkYvY2xhc3Nlcy9jb21tb25zLWxvZ2dpbmcucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSMNCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotIw0KLQ0KLQ0KLSMgVGhpcyBpcyB0aGUgbG9nZ2luZyBwcm9wZXJ0aWVzIHRoYXQgZ29lcyB0byB0aGUgd2FyLCB0aGVyZSBhcmUgdHdvIGxvZ2dpbmcgY29uZiBrZXB0IGF0IHRoZSANCi0jIHN2biwgb25lIGZvciBkZXZlbG9wZW1lbnQgKG9uZSBhdCBzcmMvdGVzdC1yZXNvdXJjZXMpIGFuZCBvdGhlciBmb3IgcHJvZHVjYXRpb24NCi0gDQotIyBVbmNvbW1lbnQgdGhlIG5leHQgbGluZSB0byBkaXNhYmxlIGFsbCBsb2dnaW5nLg0KLSNvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c9b3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuaW1wbC5Ob09wTG9nDQotDQotIyBVbmNvbW1lbnQgdGhlIG5leHQgbGluZSB0byBlbmFibGUgdGhlIHNpbXBsZSBsb2cgYmFzZWQgbG9nZ2luZw0KLSNvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c9b3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuaW1wbC5TaW1wbGVMb2cNCi0NCi0jIFVuY29tbWVudCB0aGUgbmV4dCBsaW5lIHRvIGVuYWJsZSBsb2c0aiBiYXNlZCBsb2dnaW5nDQotb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nPW9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLmltcGwuTG9nNEpMb2dnZXINCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL3dlYmFwcC9XRUItSU5GL2NsYXNzZXMvbG9nNGoucHJvcGVydGllcyBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvd2ViYXBwL1dFQi1JTkYvY2xhc3Nlcy9sb2c0ai5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDQ4ZGRjLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvd2ViYXBwL1dFQi1JTkYvY2xhc3Nlcy9sb2c0ai5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotIw0KLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0jDQotDQotDQotIyBTZXQgcm9vdCBjYXRlZ29yeSBwcmlvcml0eSB0byBJTkZPIGFuZCBpdHMgb25seSBhcHBlbmRlciB0byBDT05TT0xFLg0KLWxvZzRqLnJvb3RDYXRlZ29yeT1JTkZPLCBDT05TT0xFDQotI2xvZzRqLnJvb3RDYXRlZ29yeT1JTkZPLCBDT05TT0xFLCBMT0dGSUxFDQotDQotIyBTZXQgdGhlIGVudGVycHJpc2UgbG9nZ2VyIHByaW9yaXR5IHRvIEZBVEFMDQotbG9nNGoubG9nZ2VyLm9yZy5hcGFjaGUuYXhpczIuZW50ZXJwcmlzZT1GQVRBTA0KLWxvZzRqLmxvZ2dlci5kZS5odW5zaWNrZXIuamFsb3B5LmlvPUZBVEFMDQotbG9nNGoubG9nZ2VyLmh0dHBjbGllbnQud2lyZS5oZWFkZXI9RkFUQUwNCi1sb2c0ai5sb2dnZXIub3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQ9RkFUQUwNCi0NCi0jIENPTlNPTEUgaXMgc2V0IHRvIGJlIGEgQ29uc29sZUFwcGVuZGVyIHVzaW5nIGEgUGF0dGVybkxheW91dC4NCi1sb2c0ai5hcHBlbmRlci5DT05TT0xFPW9yZy5hcGFjaGUubG9nNGouQ29uc29sZUFwcGVuZGVyDQotbG9nNGouYXBwZW5kZXIuQ09OU09MRS5sYXlvdXQ9b3JnLmFwYWNoZS5sb2c0ai5QYXR0ZXJuTGF5b3V0DQotbG9nNGouYXBwZW5kZXIuQ09OU09MRS5sYXlvdXQuQ29udmVyc2lvblBhdHRlcm49WyVwXSAlbSVuDQotDQotIyBMT0dGSUxFIGlzIHNldCB0byBiZSBhIEZpbGUgYXBwZW5kZXIgdXNpbmcgYSBQYXR0ZXJuTGF5b3V0Lg0KLWxvZzRqLmFwcGVuZGVyLkxPR0ZJTEU9b3JnLmFwYWNoZS5sb2c0ai5GaWxlQXBwZW5kZXINCi1sb2c0ai5hcHBlbmRlci5MT0dGSUxFLkZpbGU9YXhpczIubG9nDQotbG9nNGouYXBwZW5kZXIuTE9HRklMRS5BcHBlbmQ9dHJ1ZQ0KLWxvZzRqLmFwcGVuZGVyLkxPR0ZJTEUubGF5b3V0PW9yZy5hcGFjaGUubG9nNGouUGF0dGVybkxheW91dA0KLWxvZzRqLmFwcGVuZGVyLkxPR0ZJTEUubGF5b3V0LkNvbnZlcnNpb25QYXR0ZXJuPSVkIFsldF0gJS01cCAlYyAleCAtICVtJW4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL3dlYmFwcC9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL2VjaG8vbG9naGFuZGxlci54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL3dlYmFwcC9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL2VjaG8vbG9naGFuZGxlci54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzM2NjY2QuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy93ZWJhcHAvV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9lY2hvL2xvZ2hhbmRsZXIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxoYW5kbGVyLWNoYWlucyB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIj4NCi0JPGhhbmRsZXItY2hhaW4+DQotICAgICAgICAgPHNlcnZpY2UtbmFtZS1wYXR0ZXJuIHhtbG5zOm5zMT0iaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9lY2hvLyI+bnMxOio8L3NlcnZpY2UtbmFtZS1wYXR0ZXJuPg0KLSAgICAgICAgIDxoYW5kbGVyPg0KLQkJCTxoYW5kbGVyLWNsYXNzPm9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlcy5oYW5kbGVyLkxvZ2dpbmdTT0FQSGFuZGxlcjwvaGFuZGxlci1jbGFzcz4NCi0JCTwvaGFuZGxlcj4NCi0JPC9oYW5kbGVyLWNoYWluPg0KLTwvaGFuZGxlci1jaGFpbnM+DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy93ZWJhcHAvV0VCLUlORi9qc3AvZGVtb0VjaG9QaW5nLmpzcCBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvd2ViYXBwL1dFQi1JTkYvanNwL2RlbW9FY2hvUGluZy5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjYzNmMDQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy93ZWJhcHAvV0VCLUlORi9qc3AvZGVtb0VjaG9QaW5nLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4KLQotPCUtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tJT4KLQotPEhUTUw+Ci08SEVBRD4KLSAgICA8JUAgcGFnZSBsYW5ndWFnZT0iamF2YSIgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIgotICAgICAgICAgICAgIHBhZ2VFbmNvZGluZz0iSVNPLTg4NTktMSIgJT4KLSAgICA8TUVUQSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLSAgICA8VElUTEU+SkFYLVdTIFdlYiBTZXJ2aWNlcyBQaW5nIGFuZCBFY2hvIFNhbXBsZTwvVElUTEU+Ci08L0hFQUQ+Ci08Qk9EWT4KLTxQIGFsaWduPSJjZW50ZXIiPjxCPjxGT05UIHNpemU9IisyIj5KQVgtV1MgV2ViIFNlcnZpY2VzIFBpbmcgYW5kIEVjaG8gU2FtcGxlCi08L0ZPTlQ+PC9CPjwvUD4KLQotPEgzPjxCPiA8VT5NZXNzYWdlIE9wdGlvbnM8L1U+PC9CPjwvSDM+Ci0KLTxGT1JNIG5hbWU9ImRlbW9NZSIgbWV0aG9kPSJQT1NUIiBhY3Rpb249Ii9qYXh3cy1zYW1wbGVzL2RlbW9FY2hvUGluZyI+Ci08VEFCTEUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjEiPgotPFRCT0RZPgotPFRSPgotICAgIDxURD4KLSAgICAgICAgPFRBQkxFIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIxIiBiZ2NvbG9yPSIjOTlGRkJCIj4KLSAgICAgICAgICAgIDxUQk9EWT4KLSAgICAgICAgICAgICAgICA8VFI+Ci0gICAgICAgICAgICAgICAgICAgIDxURD48Qj5NZXNzYWdlIFR5cGU6PC9CPjwvVEQ+Ci0gICAgICAgICAgICAgICAgICAgIDxURD48Qj48U0VMRUNUIG5hbWU9Im1zZ3NlcnZpY2UiPgotICAgICAgICAgICAgICAgICAgICAgICAgPE9QVElPTiB2YWx1ZT0iUGluZyIgPCU9cmVxdWVzdC5nZXRBdHRyaWJ1dGUoIlBpbmdTZWxlY3RlZCIpJT4+T25lLVdheQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgIDwvT1BUSU9OPgotICAgICAgICAgICAgICAgICAgICAgICAgPE9QVElPTiB2YWx1ZT0iRWNobyIgPCU9cmVxdWVzdC5nZXRBdHRyaWJ1dGUoIkVjaG9TZWxlY3RlZCIpJT4+U3luY2hyb25vdXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBFY2hvCi0gICAgICAgICAgICAgICAgICAgICAgICA8L09QVElPTj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxPUFRJT04gdmFsdWU9IkFzeW5jIiA8JT1yZXF1ZXN0LmdldEF0dHJpYnV0ZSgiQXN5bmNTZWxlY3RlZCIpJT4+QXN5bmNocm9ub3VzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRWNobyB3aXRoIFN5bmMgQ29tbXVuaWNhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgPC9PUFRJT04+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8T1BUSU9OIHZhbHVlPSJBc3luY1dpcmUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwlPXJlcXVlc3QuZ2V0QXR0cmlidXRlKCJBc3luY1dpcmVTZWxlY3RlZCIpJT4+QXN5bmNocm9ub3VzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRWNobyB3aXRoIEFzeW5jIENvbW11bmljYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvT1BUSU9OPgotICAgICAgICAgICAgICAgICAgICA8L1NFTEVDVD48L0I+PC9URD4KLSAgICAgICAgICAgICAgICAgICAgPFREPjwvVEQ+Ci0gICAgICAgICAgICAgICAgPC9UUj4KLSAgICAgICAgICAgICAgICA8VFI+Ci0gICAgICAgICAgICAgICAgICAgIDxURD48QlI+Ci0gICAgICAgICAgICAgICAgICAgIDwvVEQ+Ci0gICAgICAgICAgICAgICAgICAgIDxURD48L1REPgotICAgICAgICAgICAgICAgICAgICA8VEQ+PC9URD4KLSAgICAgICAgICAgICAgICA8L1RSPgotICAgICAgICAgICAgICAgIDxUUj4KLSAgICAgICAgICAgICAgICAgICAgPFREPjxCPk1lc3NhZ2UgU3RyaW5nOjwvQj48L1REPgotICAgICAgICAgICAgICAgICAgICA8VEQ+PElOUFVUIHR5cGU9InRleHQiIG5hbWU9Im1zZ3N0cmluZyIgc2l6ZT0iNDAiPjwvVEQ+Ci0gICAgICAgICAgICAgICAgICAgIDxURD48L1REPgotICAgICAgICAgICAgICAgIDwvVFI+Ci0gICAgICAgICAgICAgICAgPFRSPgotICAgICAgICAgICAgICAgICAgICA8VEQ+PEJSPgotICAgICAgICAgICAgICAgICAgICA8L1REPgotICAgICAgICAgICAgICAgICAgICA8VEQ+PC9URD4KLSAgICAgICAgICAgICAgICAgICAgPFREPjwvVEQ+Ci0gICAgICAgICAgICAgICAgPC9UUj4KLSAgICAgICAgICAgICAgICA8VFI+Ci0gICAgICAgICAgICAgICAgICAgIDxURD48Qj5NZXNzYWdlIENvdW50OjwvQj48L1REPgotICAgICAgICAgICAgICAgICAgICA8VEQ+PEI+PElOUFVUIHR5cGU9InRleHQiIG5hbWU9Im1zZ2NvdW50IiBzaXplPSI0IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSI8JT1yZXF1ZXN0LmdldEF0dHJpYnV0ZSgibXNnY291bnQiKSU+Ij48L0I+PC9URD4KLSAgICAgICAgICAgICAgICA8L1RSPgotICAgICAgICAgICAgICAgIDxUUj4KLSAgICAgICAgICAgICAgICAgICAgPFREPjxCUj4KLSAgICAgICAgICAgICAgICAgICAgPC9URD4KLSAgICAgICAgICAgICAgICAgICAgPFREPjwvVEQ+Ci0gICAgICAgICAgICAgICAgICAgIDxURD48L1REPgotICAgICAgICAgICAgICAgIDwvVFI+Ci0gICAgICAgICAgICAgICAgPFRSPgotICAgICAgICAgICAgICAgICAgICA8VEQ+PEI+U2VydmljZSBVUkk6PC9CPjwvVEQ+Ci0gICAgICAgICAgICAgICAgICAgIDxURD48Qj48SU5QVVQgdHlwZT0idGV4dCIgbmFtZT0idXJpIiBzaXplPSI0MCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0iPCU9cmVxdWVzdC5nZXRBdHRyaWJ1dGUoInVyaWRlZiIpJT4iPjwvQj48L1REPgotICAgICAgICAgICAgICAgICAgICA8VEQ+PC9URD4KLSAgICAgICAgICAgICAgICA8L1RSPgotICAgICAgICAgICAgICAgIDxUUj4KLSAgICAgICAgICAgICAgICAgICAgPFREPjxCUj4KLSAgICAgICAgICAgICAgICAgICAgPC9URD4KLSAgICAgICAgICAgICAgICAgICAgPFREPjxGT05UIHNpemU9Ii0xIj4iZXhhbXBsZToKLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly9TZXJ2aWNlSG9zdG5hbWU6cG9ydCI8L0ZPTlQ+PC9URD4KLSAgICAgICAgICAgICAgICAgICAgPFREPjwvVEQ+Ci0gICAgICAgICAgICAgICAgPC9UUj4KLSAgICAgICAgICAgICAgICA8VFI+Ci0gICAgICAgICAgICAgICAgICAgIDxURD48QlI+Ci0gICAgICAgICAgICAgICAgICAgIDwvVEQ+Ci0gICAgICAgICAgICAgICAgICAgIDxURD48L1REPgotICAgICAgICAgICAgICAgICAgICA8VEQ+PC9URD4KLSAgICAgICAgICAgICAgICA8L1RSPgotICAgICAgICAgICAgICAgIDxUUj4KLSAgICAgICAgICAgICAgICAgICAgPFREPjxCPlNPQVA6PC9CPjwvVEQ+Ci0gICAgICAgICAgICAgICAgICAgIDxURD48SU5QVVQgdHlwZT0iY2hlY2tib3giIG5hbWU9InNvYXAxMiIKLSAgICAgICAgICAgICAgICAgICAgPCU9cmVxdWVzdC5nZXRBdHRyaWJ1dGUoInNvYXBkZWYiKSU+PlVzZSBTT0FQIDEuMgotICAgICAgICAgICAgICAgICAgICA8L1REPgotICAgICAgICAgICAgICAgICAgICA8VEQ+PC9URD4KLSAgICAgICAgICAgICAgICA8L1RSPgotICAgICAgICAgICAgPC9UQk9EWT4KLSAgICAgICAgPC9UQUJMRT4KLSAgICA8L1REPgotPC9UUj4KLTxUUj4KLSAgICA8VEQ+Ci0gICAgICAgIDxUQUJMRSB3aWR0aD0iNTAiIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIxIj4KLSAgICAgICAgICAgIDxUQk9EWT4KLSAgICAgICAgICAgICAgICA8VFI+Ci0gICAgICAgICAgICAgICAgICAgIDxURD48SU5QVVQgdHlwZT0ic3VibWl0IiBuYW1lPSJTVUJNSVQiIHZhbHVlPSJTZW5kIE1lc3NhZ2UiPgotICAgICAgICAgICAgICAgIDwvVFI+Ci0gICAgICAgICAgICAgICAgPFRSPgotICAgICAgICAgICAgICAgICAgICA8VEQ+PFRFWFRBUkVBIHJvd3M9IjIwIiBjb2xzPSI2MCIgbmFtZT0iT1VUUFVUIiByZWFkb25seQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPSJiYWNrZ3JvdW5kOiNFNkU2RkEiIHN0eWxlPSJmb250LXdlaWdodDogYm9sZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT0iYm9yZGVyLXN0eWxlOnNvbGlkIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwlPXJlcXVlc3QuZ2V0QXR0cmlidXRlKCJtZXNzYWdlUyIpJT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwlPXJlcXVlc3QuZ2V0QXR0cmlidXRlKCJtZXNzYWdlUiIpJT4KLSAgICAgICAgICAgICAgICAgICAgPC9URVhUQVJFQT4KLSAgICAgICAgICAgICAgICAgICAgPC9URD4KLSAgICAgICAgICAgICAgICAgICAgPFREPjwvVEQ+Ci0gICAgICAgICAgICAgICAgPC9UUj4KLSAgICAgICAgICAgIDwvVEJPRFk+Ci0gICAgICAgIDwvVEFCTEU+Ci0gICAgPC9URD4KLTwvVFI+Ci08L1RCT0RZPgotPC9UQUJMRT4KLTwvRk9STT4KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvd2ViYXBwL1dFQi1JTkYvanNwL2RlbW9NVE9NLmpzcCBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvd2ViYXBwL1dFQi1JTkYvanNwL2RlbW9NVE9NLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTYxYjJmMC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL3dlYmFwcC9XRUItSU5GL2pzcC9kZW1vTVRPTS5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotPCVAIHBhZ2UgbGFuZ3VhZ2U9ImphdmEiIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIKLSAgICAgICAgIHBhZ2VFbmNvZGluZz0iSVNPLTg4NTktMSIgJT4KLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotCi08JS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0lPgotCi08aHRtbD4KLTxoZWFkPgotICAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotICAgIDx0aXRsZT5KQVgtV1MgV2ViIFNlcnZpY2VzIE1UT00gU2FtcGxlPC90aXRsZT4KLSAgICA8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICAgICAgICA8IS0tCi0gICAgICAgIGZ1bmN0aW9uIGNoZWNrZm9ybShmb3JtKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZm9ybS5maWxlZGVmLnZhbHVlID09ICIiKSB7Ci0gICAgICAgICAgICAgICAgYWxlcnQoIlBsZWFzZSBlbnRlciBhIFNvdXJjZSBGaWxlbmFtZSIpOwotICAgICAgICAgICAgICAgIGZvcm0uZmlsZWRlZi5mb2N1cygpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIC8vLS0+Ci0gICAgPC9zY3JpcHQ+Ci08L2hlYWQ+Ci08Ym9keT4KLTxQIGFsaWduPSJjZW50ZXIiPjxCPjxGT05UIHNpemU9IisyIj5KQVgtV1MgV2ViIFNlcnZpY2VzIE1UT00gU2FtcGxlCi08L0ZPTlQ+PC9CPjwvUD4KLQotPEgzPjxCPiA8VT5NZXNzYWdlIE9wdGlvbnM8L1U+PC9CPjwvSDM+Ci0KLTxGT1JNIG5hbWU9Im10b21kZW1vIiBtZXRob2Q9IlBPU1QiIGFjdGlvbj0iL2pheHdzLXNhbXBsZXMvZGVtb01UT00iIG9uc3VibWl0PSJyZXR1cm4gY2hlY2tmb3JtKHRoaXMpOyIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSI+Ci0gICAgPFRBQkxFIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIxIj4KLSAgICAgICAgPFRCT0RZPgotICAgICAgICAgICAgPFRSPgotICAgICAgICAgICAgICAgIDxURD4KLSAgICAgICAgICAgICAgICAgICAgPFRBQkxFIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIxIiBiZ2NvbG9yPSIjQ0NDQzIyIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxUQk9EWT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8VFI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxURD48Qj5TZXJ2aWNlIFR5cGU6PC9CPjwvVEQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxURD48Qj48U0VMRUNUIG5hbWU9Im1zZ3NlcnZpY2UiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPE9QVElPTiB2YWx1ZT0iRGlzcGF0Y2giIDwlPXJlcXVlc3QuZ2V0QXR0cmlidXRlKCJEaXNwYXRjaFNlbGVjdGVkIiklPj5EaXNwYXRjaAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9PUFRJT04+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8T1BUSU9OIHZhbHVlPSJQcm94eSIgPCU9cmVxdWVzdC5nZXRBdHRyaWJ1dGUoIlByb3h5U2VsZWN0ZWQiKSU+PlByb3h5PC9PUFRJT04+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvU0VMRUNUPjwvQj48L1REPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8VEQ+PC9URD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L1RSPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxUUj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFREPjxCPlNvdXJjZSBGaWxlbmFtZTo8L0I+PC9URD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFREPjxCPjxJTlBVVCB0eXBlPSJmaWxlIiBuYW1lPSJmaWxlZGVmIiBzaXplPSIzMiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0iPCU9cmVxdWVzdC5nZXRBdHRyaWJ1dGUoImZpbGVkZWYiKSU+Ij48L0I+PC9URD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L1RSPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxUUj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFREPjxCUj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9URD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFREPjwvVEQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxURD48L1REPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvVFI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPFRSPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8VEQ+PEI+U2VydmljZSBVUkk6PC9CPjwvVEQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxURD48Qj48SU5QVVQgdHlwZT0idGV4dCIgbmFtZT0idXJpZGVmIiBzaXplPSI0MCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0iPCU9cmVxdWVzdC5nZXRBdHRyaWJ1dGUoInVyaWRlZiIpJT4iPjwvQj48L1REPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8VEQ+PC9URD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L1RSPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxUUj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFREPjxCUj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9URD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFREPjxGT05UIHNpemU9Ii0xIj5leGFtcGxlOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL1NlcnZpY2VIb3N0bmFtZTpwb3J0PC9GT05UPjwvVEQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxURD48L1REPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvVFI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPFRSPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8VEQ+PEJSPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L1REPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8VEQ+PC9URD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFREPjwvVEQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9UUj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8VFI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxURD48Qj5TT0FQOjwvQj48L1REPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8VEQ+PElOUFVUIHR5cGU9ImNoZWNrYm94IiBuYW1lPSJzb2FwZGVmIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8JT1yZXF1ZXN0LmdldEF0dHJpYnV0ZSgic29hcGRlZiIpJT4+VXNlIFNPQVAgMS4yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvVEQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxURD48L1REPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvVFI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L1RCT0RZPgotICAgICAgICAgICAgICAgICAgICA8L1RBQkxFPgotICAgICAgICAgICAgICAgIDwvVEQ+Ci0gICAgICAgICAgICA8L1RSPgotICAgICAgICAgICAgPFRSPgotICAgICAgICAgICAgICAgIDxURD4KLSAgICAgICAgICAgICAgICAgICAgPFRBQkxFIHdpZHRoPSI1MCIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjEiPgotICAgICAgICAgICAgICAgICAgICAgICAgPFRCT0RZPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxUUj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFREPjxJTlBVVCB0eXBlPSJzdWJtaXQiIG5hbWU9IlNVQk1JVCIgdmFsdWU9IlNlbmQgTWVzc2FnZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9UUj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8VFI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxURD48VEVYVEFSRUEgcm93cz0iMjAiIGNvbHM9IjYwIiBuYW1lPSJPVVRQVVQiIHJlYWRvbmx5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9ImJhY2tncm91bmQ6I0ZBRTYyMiIgc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPSJib3JkZXItc3R5bGU6c29saWQiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCU9cmVxdWVzdC5nZXRBdHRyaWJ1dGUoIm1lc3NhZ2VTIiklPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCU9cmVxdWVzdC5nZXRBdHRyaWJ1dGUoIm1lc3NhZ2VSIiklPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L1RFWFRBUkVBPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L1REPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8VEQ+PC9URD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L1RSPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9UQk9EWT4KLSAgICAgICAgICAgICAgICAgICAgPC9UQUJMRT4KLSAgICAgICAgICAgICAgICA8L1REPgotICAgICAgICAgICAgPC9UUj4KLSAgICAgICAgPC9UQk9EWT4KLSAgICA8L1RBQkxFPgotPC9GT1JNPgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJhZGM4MS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIj8+DQotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPHdlYi1hcHAgaWQ9ImpheHdzLXNhbXBsZXMiIHZlcnNpb249IjIuNCIgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiDQotICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS93ZWItYXBwXzJfNC54c2QiPg0KLQ0KLSAgICA8c2VydmxldD4NCi0gICAgICAgIDxzZXJ2bGV0LW5hbWU+QXhpc1NlcnZsZXQ8L3NlcnZsZXQtbmFtZT4NCi0gICAgICAgIDxzZXJ2bGV0LWNsYXNzPg0KLSAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuQXhpc1NlcnZsZXQNCi0gICAgICAgIDwvc2VydmxldC1jbGFzcz4NCi0gICAgICAgIDxsb2FkLW9uLXN0YXJ0dXA+MTwvbG9hZC1vbi1zdGFydHVwPg0KLSAgICA8L3NlcnZsZXQ+DQotDQotICAgIDxzZXJ2bGV0LW1hcHBpbmc+DQotICAgICAgICA8c2VydmxldC1uYW1lPkF4aXNTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+DQotICAgICAgICA8dXJsLXBhdHRlcm4+L3NlcnZpY2VzLyo8L3VybC1wYXR0ZXJuPg0KLSAgICA8L3NlcnZsZXQtbWFwcGluZz4NCi0NCi0gICAgPHNlcnZsZXQgaWQ9IlNlcnZsZXRfMTE4MjM2NzMwNzQxNiI+DQotICAgICAgICA8c2VydmxldC1uYW1lPk1UT01TYW1wbGVTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+DQotICAgICAgICA8c2VydmxldC1jbGFzcz4NCi0gICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZXMuc2VydmxldC5NVE9NU2FtcGxlU2VydmxldA0KLSAgICAgICAgPC9zZXJ2bGV0LWNsYXNzPg0KLSAgICA8L3NlcnZsZXQ+DQotDQotICAgIDxzZXJ2bGV0LW1hcHBpbmc+DQotICAgICAgICA8c2VydmxldC1uYW1lPk1UT01TYW1wbGVTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+DQotICAgICAgICA8dXJsLXBhdHRlcm4+L2RlbW9NVE9NPC91cmwtcGF0dGVybj4NCi0gICAgPC9zZXJ2bGV0LW1hcHBpbmc+DQotDQotICAgIDxzZXJ2bGV0Pg0KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5FY2hvUGluZ1NhbXBsZVNlcnZsZXQ8L3NlcnZsZXQtbmFtZT4NCi0gICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlcy5zZXJ2bGV0LkVjaG9QaW5nU2FtcGxlU2VydmxldDwvc2VydmxldC1jbGFzcz4NCi0gICAgPC9zZXJ2bGV0Pg0KLSAgICA8c2VydmxldC1tYXBwaW5nPg0KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5FY2hvUGluZ1NhbXBsZVNlcnZsZXQ8L3NlcnZsZXQtbmFtZT4NCi0gICAgICAgIDx1cmwtcGF0dGVybj4vZGVtb0VjaG9QaW5nPC91cmwtcGF0dGVybj4NCi0gICAgPC9zZXJ2bGV0LW1hcHBpbmc+DQotPC93ZWItYXBwPg0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvd2ViYXBwL1dFQi1JTkYvd3NkbC9FY2hvLndzZGwgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL3dlYmFwcC9XRUItSU5GL3dzZGwvRWNoby53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmVkMzQyLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvd2ViYXBwL1dFQi1JTkYvd3NkbC9FY2hvLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotPHdzZGw6ZGVmaW5pdGlvbnMgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iCi0gICAgICAgICAgICAgICAgICB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIgotICAgICAgICAgICAgICAgICAgeG1sbnM6dG5zPSJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL2VjaG8vIgotICAgICAgICAgICAgICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iRWNob1NlcnZpY2UiCi0gICAgICAgICAgICAgICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvZWNoby8iPgotICAgIDx3c2RsOnR5cGVzPgotICAgICAgICA8eHNkOnNjaGVtYQotICAgICAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9lY2hvLyIKLSAgICAgICAgICAgICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4KLQotCi0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWNob1N0cmluZ1Jlc3BvbnNlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVjaG9SZXNwb25zZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVjaG9TdHJpbmdJbnB1dCI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlY2hvSW5wdXQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICAgIDwveHNkOnNjaGVtYT4KLSAgICA8L3dzZGw6dHlwZXM+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJlY2hvT3BlcmF0aW9uUmVxdWVzdCI+Ci0gICAgICAgIDx3c2RsOnBhcnQgZWxlbWVudD0idG5zOmVjaG9TdHJpbmdJbnB1dCIgbmFtZT0icGFyYW1ldGVyIi8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJlY2hvT3BlcmF0aW9uUmVzcG9uc2UiPgotICAgICAgICA8d3NkbDpwYXJ0IGVsZW1lbnQ9InRuczplY2hvU3RyaW5nUmVzcG9uc2UiIG5hbWU9InBhcmFtZXRlciIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOnBvcnRUeXBlIG5hbWU9IkVjaG9TZXJ2aWNlUG9ydFR5cGUiPgotCi0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJlY2hvT3BlcmF0aW9uIj4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0IG1lc3NhZ2U9InRuczplY2hvT3BlcmF0aW9uUmVxdWVzdCIvPgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0IG1lc3NhZ2U9InRuczplY2hvT3BlcmF0aW9uUmVzcG9uc2UiLz4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICA8L3dzZGw6cG9ydFR5cGU+Ci0gICAgPHdzZGw6YmluZGluZyBuYW1lPSJFY2hvU09BUCIgdHlwZT0idG5zOkVjaG9TZXJ2aWNlUG9ydFR5cGUiPgotICAgICAgICA8c29hcDpiaW5kaW5nIHN0eWxlPSJkb2N1bWVudCIKLSAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIvPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iZWNob09wZXJhdGlvbiI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iZWNob09wZXJhdGlvbiIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgIDwvd3NkbDpiaW5kaW5nPgotICAgIDx3c2RsOnNlcnZpY2UgbmFtZT0iRWNob1NlcnZpY2UiPgotICAgICAgICA8d3NkbDpwb3J0IGJpbmRpbmc9InRuczpFY2hvU09BUCIgbmFtZT0iRWNob1NlcnZpY2VQb3J0Ij4KLSAgICAgICAgICAgIDxzb2FwOmFkZHJlc3MKLSAgICAgICAgICAgICAgICAgICAgbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qYXh3cy1zYW1wbGVzL3NlcnZpY2VzL0VjaG9TZXJ2aWNlIi8+Ci0gICAgICAgIDwvd3NkbDpwb3J0PgotICAgIDwvd3NkbDpzZXJ2aWNlPgotPC93c2RsOmRlZmluaXRpb25zPgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy93ZWJhcHAvV0VCLUlORi93c2RsL0VjaG8xMi53c2RsIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy93ZWJhcHAvV0VCLUlORi93c2RsL0VjaG8xMi53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGRhMTQ5Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvd2ViYXBwL1dFQi1JTkYvd3NkbC9FY2hvMTIud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci08d3NkbDpkZWZpbml0aW9ucyB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIKLSAgICAgICAgICAgICAgICAgIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcDEyLyIKLSAgICAgICAgICAgICAgICAgIHhtbG5zOnRucz0iaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9lY2hvLyIKLSAgICAgICAgICAgICAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9IkVjaG9TZXJ2aWNlMTIiCi0gICAgICAgICAgICAgICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvZWNoby8iPgotICAgIDx3c2RsOnR5cGVzPgotICAgICAgICA8eHNkOnNjaGVtYQotICAgICAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9lY2hvLyIKLSAgICAgICAgICAgICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4KLQotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVjaG9TdHJpbmdSZXNwb25zZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlY2hvUmVzcG9uc2UiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlY2hvU3RyaW5nSW5wdXQiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWNob0lucHV0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgICA8L3hzZDpzY2hlbWE+Ci0gICAgPC93c2RsOnR5cGVzPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0iZWNob09wZXJhdGlvblJlcXVlc3QiPgotICAgICAgICA8d3NkbDpwYXJ0IGVsZW1lbnQ9InRuczplY2hvU3RyaW5nSW5wdXQiIG5hbWU9InBhcmFtZXRlciIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0iZWNob09wZXJhdGlvblJlc3BvbnNlIj4KLSAgICAgICAgPHdzZGw6cGFydCBlbGVtZW50PSJ0bnM6ZWNob1N0cmluZ1Jlc3BvbnNlIiBuYW1lPSJwYXJhbWV0ZXIiLz4KLSAgICA8L3dzZGw6bWVzc2FnZT4KLSAgICA8d3NkbDpwb3J0VHlwZSBuYW1lPSJFY2hvU2VydmljZTEyUG9ydFR5cGUiPgotCi0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJlY2hvT3BlcmF0aW9uIj4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0IG1lc3NhZ2U9InRuczplY2hvT3BlcmF0aW9uUmVxdWVzdCIvPgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0IG1lc3NhZ2U9InRuczplY2hvT3BlcmF0aW9uUmVzcG9uc2UiLz4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICA8L3dzZGw6cG9ydFR5cGU+Ci0gICAgPHdzZGw6YmluZGluZyBuYW1lPSJFY2hvU09BUDEyIiB0eXBlPSJ0bnM6RWNob1NlcnZpY2UxMlBvcnRUeXBlIj4KLSAgICAgICAgPHNvYXA6YmluZGluZyBzdHlsZT0iZG9jdW1lbnQiCi0gICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiLz4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImVjaG9PcGVyYXRpb24iPgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249ImVjaG9PcGVyYXRpb24iIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICA8L3dzZGw6YmluZGluZz4KLSAgICA8d3NkbDpzZXJ2aWNlIG5hbWU9IkVjaG9TZXJ2aWNlMTIiPgotICAgICAgICA8d3NkbDpwb3J0IGJpbmRpbmc9InRuczpFY2hvU09BUDEyIiBuYW1lPSJFY2hvU2VydmljZTEyUG9ydCI+Ci0gICAgICAgICAgICA8c29hcDphZGRyZXNzCi0gICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjgwODAvamF4d3Mtc2FtcGxlcy9zZXJ2aWNlcy9FY2hvU2VydmljZTEyIi8+Ci0gICAgICAgIDwvd3NkbDpwb3J0PgotICAgIDwvd3NkbDpzZXJ2aWNlPgotPC93c2RsOmRlZmluaXRpb25zPgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy93ZWJhcHAvV0VCLUlORi93c2RsL0ltYWdlRGVwb3Qud3NkbCBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvd2ViYXBwL1dFQi1JTkYvd3NkbC9JbWFnZURlcG90LndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiOTA0MjUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy93ZWJhcHAvV0VCLUlORi93c2RsL0ltYWdlRGVwb3Qud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci08d3NkbDpkZWZpbml0aW9ucyB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvbXRvbS8iCi0gICAgICAgICAgICAgICAgICB4bWxuczppbXBsPSJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL210b20vIgotICAgICAgICAgICAgICAgICAgeG1sbnM6aW50Zj0iaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9tdG9tLyIKLSAgICAgICAgICAgICAgICAgIHhtbG5zOm10b209Imh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvbXRvbS8iCi0gICAgICAgICAgICAgICAgICB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIKLSAgICAgICAgICAgICAgICAgIHhtbG5zOndzZGxzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIgotICAgICAgICAgICAgICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+Ci0gICAgPHdzZGw6dHlwZXM+Ci0gICAgICAgIDx4czpzY2hlbWEgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0gICAgICAgICAgICAgICAgICAgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICAgICAgICAgICAgIHhtbG5zOnhtaW1lPSJodHRwOi8vd3d3LnczLm9yZy8yMDA1LzA1L3htbG1pbWUiCi0gICAgICAgICAgICAgICAgICAgeG1sbnM6dG5zPSJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL210b20vIgotICAgICAgICAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9tdG9tLyI+Ci0gICAgICAgICAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iSW1hZ2VEZXBvdCI+Ci0gICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJpbWFnZURhdGEiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzOmJhc2U2NEJpbmFyeSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1pbWU6ZXhwZWN0ZWRDb250ZW50VHlwZXM9Im11bHRpcGFydC8qIi8+Ci0gICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InNlbmRJbWFnZSI+Ci0gICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0iaW5wdXQiIHR5cGU9InRuczpJbWFnZURlcG90Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLQotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ic2VuZEltYWdlUmVzcG9uc2UiPgotICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9Im91dHB1dCIgdHlwZT0idG5zOkltYWdlRGVwb3QiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94czplbGVtZW50PgotICAgICAgICA8L3hzOnNjaGVtYT4KLSAgICA8L3dzZGw6dHlwZXM+Ci0KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9InNlbmRJbWFnZVJlcXVlc3QiPgotICAgICAgICA8d3NkbDpwYXJ0IGVsZW1lbnQ9Im10b206c2VuZEltYWdlIiBuYW1lPSJwYXJhbWV0ZXJzIi8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9InNlbmRJbWFnZVJlc3BvbnNlIj4KLSAgICAgICAgPHdzZGw6cGFydCBlbGVtZW50PSJtdG9tOnNlbmRJbWFnZVJlc3BvbnNlIiBuYW1lPSJwYXJhbWV0ZXJzIi8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0KLSAgICA8d3NkbDpwb3J0VHlwZSBuYW1lPSJNdG9tU2FtcGxlU2VydmljZSI+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJzZW5kSW1hZ2UiPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQgbWVzc2FnZT0iaW1wbDpzZW5kSW1hZ2VSZXF1ZXN0IiBuYW1lPSJzZW5kSW1hZ2VSZXF1ZXN0Ii8+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQgbWVzc2FnZT0iaW1wbDpzZW5kSW1hZ2VSZXNwb25zZSIgbmFtZT0ic2VuZEltYWdlUmVzcG9uc2UiLz4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICA8L3dzZGw6cG9ydFR5cGU+Ci0KLSAgICA8d3NkbDpiaW5kaW5nIG5hbWU9Ik10b21TYW1wbGVTb2FwIiB0eXBlPSJpbXBsOk10b21TYW1wbGVTZXJ2aWNlIj4KLSAgICAgICAgPHdzZGxzb2FwOmJpbmRpbmcgc3R5bGU9ImRvY3VtZW50IiB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIvPgotCi0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJzZW5kSW1hZ2UiPgotICAgICAgICAgICAgPHdzZGxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJzZW5kSW1hZ2UiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0IG5hbWU9InNlbmRJbWFnZVJlcXVlc3QiPgotICAgICAgICAgICAgICAgIDx3c2Rsc29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0IG5hbWU9InNlbmRJbWFnZVJlc3BvbnNlIj4KLSAgICAgICAgICAgICAgICA8d3NkbHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgPC93c2RsOmJpbmRpbmc+Ci0KLSAgICA8d3NkbDpzZXJ2aWNlIG5hbWU9Ik10b21TYW1wbGVTZXJ2aWNlIj4KLSAgICAgICAgPHdzZGw6cG9ydCBiaW5kaW5nPSJpbXBsOk10b21TYW1wbGVTb2FwIiBuYW1lPSJNdG9tU2FtcGxlUG9ydCI+Ci0gICAgICAgICAgICA8d3NkbHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo4MDgwL2pheHdzLXNhbXBsZXMvc2VydmljZXMvTXRvbVNhbXBsZVNlcnZpY2UiLz4KLSAgICAgICAgPC93c2RsOnBvcnQ+Ci0gICAgPC93c2RsOnNlcnZpY2U+Ci0KLTwvd3NkbDpkZWZpbml0aW9ucz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL3dlYmFwcC9XRUItSU5GL3dzZGwvSW1hZ2VEZXBvdDEyLndzZGwgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL3dlYmFwcC9XRUItSU5GL3dzZGwvSW1hZ2VEZXBvdDEyLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxMGNiZDYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy93ZWJhcHAvV0VCLUlORi93c2RsL0ltYWdlRGVwb3QxMi53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLTx3c2RsOmRlZmluaXRpb25zIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB4bWxuczppbXBsPSJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL210b20vIgotICAgICAgICAgICAgICAgICAgeG1sbnM6aW50Zj0iaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9tdG9tLyIKLSAgICAgICAgICAgICAgICAgIHhtbG5zOm10b209Imh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvbXRvbS8iCi0gICAgICAgICAgICAgICAgICB4bWxuczp3c2Rsc29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwMTIvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL210b20vIj4KLSAgICA8d3NkbDp0eXBlcz4KLSAgICAgICAgPHhzOnNjaGVtYSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOnRucz0iaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9tdG9tLyIKLSAgICAgICAgICAgICAgICAgICB4bWxuczp4bWltZT0iaHR0cDovL3d3dy53My5vcmcvMjAwNS8wNS94bWxtaW1lIiBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKLSAgICAgICAgICAgICAgICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvbXRvbS8iPgotICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IkltYWdlRGVwb3QiPgotICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iaW1hZ2VEYXRhIiB0eXBlPSJ4czpiYXNlNjRCaW5hcnkiIHhtaW1lOmV4cGVjdGVkQ29udGVudFR5cGVzPSJtdWx0aXBhcnQvKiIvPgotICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJzZW5kSW1hZ2UiPgotICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWF4T2NjdXJzPSIxIiBtaW5PY2N1cnM9IjAiIG5hbWU9ImlucHV0IiB0eXBlPSJ0bnM6SW1hZ2VEZXBvdCIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InNlbmRJbWFnZVJlc3BvbnNlIj4KLSAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1heE9jY3Vycz0iMSIgbWluT2NjdXJzPSIwIiBuYW1lPSJvdXRwdXQiIHR5cGU9InRuczpJbWFnZURlcG90Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgPC94czpzY2hlbWE+Ci0gICAgPC93c2RsOnR5cGVzPgotCi0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJzZW5kSW1hZ2VSZXF1ZXN0Ij4KLSAgICAgICAgPHdzZGw6cGFydCBlbGVtZW50PSJtdG9tOnNlbmRJbWFnZSIgbmFtZT0icGFyYW1ldGVycyIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotCi0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJzZW5kSW1hZ2VSZXNwb25zZSI+Ci0gICAgICAgIDx3c2RsOnBhcnQgZWxlbWVudD0ibXRvbTpzZW5kSW1hZ2VSZXNwb25zZSIgbmFtZT0icGFyYW1ldGVycyIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotCi0gICAgPHdzZGw6cG9ydFR5cGUgbmFtZT0iTXRvbVNhbXBsZVNlcnZpY2UxMiI+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJzZW5kSW1hZ2UiPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQgbWVzc2FnZT0iaW1wbDpzZW5kSW1hZ2VSZXF1ZXN0IiBuYW1lPSJzZW5kSW1hZ2VSZXF1ZXN0Ii8+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQgbWVzc2FnZT0iaW1wbDpzZW5kSW1hZ2VSZXNwb25zZSIgbmFtZT0ic2VuZEltYWdlUmVzcG9uc2UiLz4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICA8L3dzZGw6cG9ydFR5cGU+Ci0KLSAgICA8d3NkbDpiaW5kaW5nIG5hbWU9Ik10b21TYW1wbGVTb2FwIiB0eXBlPSJpbXBsOk10b21TYW1wbGVTZXJ2aWNlMTIiPgotICAgICAgICA8d3NkbHNvYXA6YmluZGluZyBzdHlsZT0iZG9jdW1lbnQiIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIi8+Ci0KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InNlbmRJbWFnZSI+Ci0gICAgICAgICAgICA8d3NkbHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249InNlbmRJbWFnZSIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQgbmFtZT0ic2VuZEltYWdlUmVxdWVzdCI+Ci0gICAgICAgICAgICAgICAgPHdzZGxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQgbmFtZT0ic2VuZEltYWdlUmVzcG9uc2UiPgotICAgICAgICAgICAgICAgIDx3c2Rsc29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICA8L3dzZGw6YmluZGluZz4KLQotICAgIDx3c2RsOnNlcnZpY2UgbmFtZT0iTXRvbVNhbXBsZVNlcnZpY2UxMiI+Ci0gICAgICAgIDx3c2RsOnBvcnQgYmluZGluZz0iaW1wbDpNdG9tU2FtcGxlU29hcCIgbmFtZT0iTXRvbVNhbXBsZVBvcnQiPgotICAgICAgICAgICAgPHdzZGxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qYXh3cy1zYW1wbGVzL3NlcnZpY2VzL010b21TYW1wbGVTZXJ2aWNlMTIiLz4KLSAgICAgICAgPC93c2RsOnBvcnQ+Ci0gICAgPC93c2RsOnNlcnZpY2U+Ci0KLTwvd3NkbDpkZWZpbml0aW9ucz4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvd2ViYXBwL1dFQi1JTkYvd3NkbC9QaW5nLndzZGwgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL3dlYmFwcC9XRUItSU5GL3dzZGwvUGluZy53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OWZmNTZmLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvd2ViYXBwL1dFQi1JTkYvd3NkbC9QaW5nLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotPHdzZGw6ZGVmaW5pdGlvbnMgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iCi0gICAgICAgICAgICAgICAgICB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIgotICAgICAgICAgICAgICAgICAgeG1sbnM6dG5zPSJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL3BpbmcvIgotICAgICAgICAgICAgICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iUGluZ1NlcnZpY2UiCi0gICAgICAgICAgICAgICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvcGluZy8iPgotICAgIDx3c2RsOnR5cGVzPgotICAgICAgICA8eHNkOnNjaGVtYQotICAgICAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9waW5nLyIKLSAgICAgICAgICAgICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4KLQotCi0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGluZ1N0cmluZ0lucHV0Ij4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBpbmdJbnB1dCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNjaGVtYT4KLSAgICA8L3dzZGw6dHlwZXM+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJwaW5nT3BlcmF0aW9uUmVxdWVzdCI+Ci0gICAgICAgIDx3c2RsOnBhcnQgZWxlbWVudD0idG5zOnBpbmdTdHJpbmdJbnB1dCIgbmFtZT0icGFyYW1ldGVyIi8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6cG9ydFR5cGUgbmFtZT0iUGluZ1NlcnZpY2VQb3J0VHlwZSI+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJwaW5nT3BlcmF0aW9uIj4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0IG1lc3NhZ2U9InRuczpwaW5nT3BlcmF0aW9uUmVxdWVzdCIvPgotCi0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgPC93c2RsOnBvcnRUeXBlPgotICAgIDx3c2RsOmJpbmRpbmcgbmFtZT0iUGluZ1NPQVAiIHR5cGU9InRuczpQaW5nU2VydmljZVBvcnRUeXBlIj4KLSAgICAgICAgPHNvYXA6YmluZGluZyBzdHlsZT0iZG9jdW1lbnQiCi0gICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiLz4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InBpbmdPcGVyYXRpb24iPgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249InBpbmdPcGVyYXRpb24iIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICA8L3dzZGw6YmluZGluZz4KLSAgICA8d3NkbDpzZXJ2aWNlIG5hbWU9IlBpbmdTZXJ2aWNlIj4KLSAgICAgICAgPHdzZGw6cG9ydCBiaW5kaW5nPSJ0bnM6UGluZ1NPQVAiIG5hbWU9IlBpbmdTZXJ2aWNlUG9ydCI+Ci0gICAgICAgICAgICA8c29hcDphZGRyZXNzCi0gICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjgwODAvamF4d3Mtc2FtcGxlcy9zZXJ2aWNlcy9QaW5nU2VydmljZSIvPgotICAgICAgICA8L3dzZGw6cG9ydD4KLSAgICA8L3dzZGw6c2VydmljZT4KLTwvd3NkbDpkZWZpbml0aW9ucz4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvd2ViYXBwL1dFQi1JTkYvd3NkbC9QaW5nMTIud3NkbCBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvd2ViYXBwL1dFQi1JTkYvd3NkbC9QaW5nMTIud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjczOTU0Yy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL3dlYmFwcC9XRUItSU5GL3dzZGwvUGluZzEyLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotPHdzZGw6ZGVmaW5pdGlvbnMgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iCi0gICAgICAgICAgICAgICAgICB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAxMi8iCi0gICAgICAgICAgICAgICAgICB4bWxuczp0bnM9Imh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvcGluZy8iCi0gICAgICAgICAgICAgICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJQaW5nU2VydmljZTEyIgotICAgICAgICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL3BpbmcvIj4KLSAgICA8d3NkbDp0eXBlcz4KLSAgICAgICAgPHhzZDpzY2hlbWEKLSAgICAgICAgICAgICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvcGluZy8iCi0gICAgICAgICAgICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+Ci0KLQotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBpbmdTdHJpbmdJbnB1dCI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwaW5nSW5wdXQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzY2hlbWE+Ci0gICAgPC93c2RsOnR5cGVzPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0icGluZ09wZXJhdGlvblJlcXVlc3QiPgotICAgICAgICA8d3NkbDpwYXJ0IGVsZW1lbnQ9InRuczpwaW5nU3RyaW5nSW5wdXQiIG5hbWU9InBhcmFtZXRlciIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOnBvcnRUeXBlIG5hbWU9IlBpbmdTZXJ2aWNlMTJQb3J0VHlwZSI+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJwaW5nT3BlcmF0aW9uIj4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0IG1lc3NhZ2U9InRuczpwaW5nT3BlcmF0aW9uUmVxdWVzdCIvPgotCi0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgPC93c2RsOnBvcnRUeXBlPgotICAgIDx3c2RsOmJpbmRpbmcgbmFtZT0iUGluZ1NPQVAxMiIgdHlwZT0idG5zOlBpbmdTZXJ2aWNlMTJQb3J0VHlwZSI+Ci0gICAgICAgIDxzb2FwOmJpbmRpbmcgc3R5bGU9ImRvY3VtZW50IgotICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIi8+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJwaW5nT3BlcmF0aW9uIj4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJwaW5nT3BlcmF0aW9uIiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgPC93c2RsOmJpbmRpbmc+Ci0gICAgPHdzZGw6c2VydmljZSBuYW1lPSJQaW5nU2VydmljZTEyIj4KLSAgICAgICAgPHdzZGw6cG9ydCBiaW5kaW5nPSJ0bnM6UGluZ1NPQVAxMiIgbmFtZT0iUGluZ1NlcnZpY2UxMlBvcnQiPgotICAgICAgICAgICAgPHNvYXA6YWRkcmVzcwotICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo4MDgwL2pheHdzLXNhbXBsZXMvc2VydmljZXMvUGluZ1NlcnZpY2UxMiIvPgotICAgICAgICA8L3dzZGw6cG9ydD4KLSAgICA8L3dzZGw6c2VydmljZT4KLTwvd3NkbDpkZWZpbml0aW9ucz4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvd2ViYXBwL2luZGV4Lmh0bWwgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL3dlYmFwcC9pbmRleC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzIyMWU5Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvd2ViYXBwL2luZGV4Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi08SFRNTD4NCi08SEVBRD4NCi08VElUTEU+SkFYLVdTIFdlYiBTZXJ2aWNlcyBTYW1wbGVzPC9USVRMRT4NCi08L0hFQUQ+DQotDQotPEJPRFk+DQotPFRBQkxFPg0KLSAgPHRyPiANCi0gICAgPHRkPg0KLSAgICAgIDxzdHJvbmc+DQotICAgICAgIFBpbmcgYW5kIEVjaG8gU2FtcGxlDQotICAgICAgPC9zdHJvbmc+DQotICAgIDwvdGQ+DQotICA8L3RyPg0KLSAgPHRyPg0KLSAgIDx0ZD4NCi0gICAgPHN0cm9uZz4NCi0gICAgIDxhIGhyZWY9Ii9qYXh3cy1zYW1wbGVzL2RlbW9FY2hvUGluZyI+UnVuPC9hPg0KLSAgICA8L3N0cm9uZz4NCi0gICA8L3RkPg0KLSAgPHRyPiANCi0gIDx0cj4gDQotICAgIDx0ZD4NCi0gICAgICBUaGUgUGluZyBhbmQgRWNobyBTYW1wbGUgaWxsdXN0cmF0ZXMgc2ltcGxlIEpBWC1XUyBzZXJ2aWNlcy4gVGhlIFBpbmcgU2FtcGxlDQotICAgICAgZGVtb25zdHJhdGVzIGEgb25lLXdheSBzZXJ2aWNlIHRyYW5zYWN0aW9uLiBBIHNpbXBsZSB0ZXh0IHN0cmluZyBpcyBzZW50DQotICAgICAgZnJvbSB0aGUgc2VydmljZSBjbGllbnQgdG8gdGhlIHNlcnZpY2UgZW5kcG9pbnQuIFRoZSBFY2hvIFNhbXBsZSBkZW1vbnN0cmF0ZXMNCi0gICAgICBhIHR3by13YXkgc2VydmljZSB0cmFuc2FjdGlvbi4gQSBzaW1wbGUgdGV4dCBzdHJpbmcgaXMgc2VudCBmcm9tIHRoZSBzZXJ2aWNlIA0KLSAgICAgIGNsaWVudCB0byB0aGUgc2VydmljZSBlbmRwb2ludC4gVGhlIHNlcnZpY2UgcHJlcGVuZHMgYW4gaWRlbnRpZmllciBhbmQgcmV0dXJucyANCi0gICAgICB0aGUgc3RyaW5nIHRvIHRoZSBjbGllbnQuIFRoZSBFY2hvIFNhbXBsZSBhbHNvIGRlbW9uc3RyYXRlcyB0aGUgdXNlIG9mIHRoZSANCi0gICAgICBzeW5jaHJvbm91cyBwcm9ncmFtbWluZyBtb2RlbCBhbmQgYWxzbyB0aGUgdXNlIG9mIHR3byBtb2RlcyBvZiB0aGUgYXN5bmNocm9ub3VzIHByb2dyYW1taW5nIG1vZGVsLg0KLSAgICAgIFlvdSBjYW4gY2hvb3NlIGVpdGhlciBTT0FQIDEuMSBvciBTT0FQIDEuMiBhcyB0aGUgdHJhbnNwb3J0IG9wdGlvbiBmb3IgdGhlIFBpbmcgYW5kIEVjaG8gU2FtcGxlcy4NCi0gICAgPC90ZD4NCi0gIDwvdHI+DQotDQotICA8dHI+IA0KLSAgICA8dGQ+DQotICAgICAgPHN0cm9uZz4NCi0gICAgICAgTVRPTSBTYW1wbGUNCi0gICAgICA8L3N0cm9uZz4NCi0gICAgPC90ZD4NCi0NCi0gIDwvdHI+DQotICA8dHI+DQotICAgPHRkPg0KLSAgICA8c3Ryb25nPg0KLSAgICAgPGEgaHJlZj0iL2pheHdzLXNhbXBsZXMvZGVtb01UT00iPlJ1bjwvYT4NCi0gICAgPC9zdHJvbmc+DQotICAgPC90ZD4NCi0NCi0gIDwvdHI+IA0KLSAgPHRyPiANCi0gICAgPHRkPg0KLSAgICAgIFRoZSBNVE9NIFNhbXBsZSBpbGx1c3RyYXRlcyB0aGUgdXNlIG9mIHRoZSBTT0FQIE1lc3NhZ2UgVHJhbnNtaXNzaW9uIA0KLSAgICAgIE9wdGltaXphdGlvbiBNZWNoYW5pc20gKE1UT00pIG9uIHRoZSB0cmFuc3BvcnQgdG8gc2VuZCBhbmQgcmVjZWl2ZSBiaW5hcnkgZmlsZXMuIA0KLSAgICAgIFRoZSBNVE9NIGZlYXR1cmUgZW5hYmxlcyBTT0FQIGJpbmRpbmdzIHRvIG9wdGltaXplIHRoZSB0cmFuc21pc3Npb24gb3INCi0gICAgICB3aXJlIGZvcm1hdCBvZiBhIFNPQVAgbWVzc2FnZSBieSBzZWxlY3RpdmVseSBlbmNvZGluZyBwb3J0aW9ucyBvZiB0aGUgbWVzc2FnZSwNCi0gICAgICB3aGlsZSBzdGlsbCBwcmVzZW50aW5nIGFuIFhNTCBJbmZvc2V0IHRvIHRoZSBTT0FQIGFwcGxpY2F0aW9uLg0KLSAgICAgIEEgZmlsZSBpcyBzZW50IGZyb20gdGhlIHNlcnZpY2UgY2xpZW50IHRvIHRoZSBzZXJ2aWNlIGVuZHBvaW50IHdpdGgNCi0gICAgICB0aGUgYmluYXJ5IGRhdGEgZW5jb2RlZCB1c2luZyBNVE9NLg0KLSAgICA8L3RkPg0KLSAgPC90cj4NCi08L0JPRFk+DQotPC9IVE1MPg0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3MtdmVyc2lvbi9SRUFETUUudHh0IGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy12ZXJzaW9uL1JFQURNRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3OTBlMmUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy12ZXJzaW9uL1JFQURNRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi1TYW1wbGU6IEpBWFdTIFZlcnNpb24NCi09PT09PT09PT09PT09PT0NCi0NCi1JbnRyb2R1Y3Rpb24NCi09PT09PT09PT09PT0NCi0NCi1BIHNpbXBsZSBKQVhXUyBzZXJ2aWNlIHRoYXQgcmV0dXJucyBhIHRleHQgd2hpY2ggY29udGFpbnMgdGhlIHZlcnNpb24gbnVtYmVyIGFuZCB0aGUgYnVpbHQgDQotZGF0ZSBvZiB0aGUgQXhpczIgRGlzdHJpYnV0aW9uIHVzZWQuDQotDQotSW4gb3RoZXIgd29yZHMsIHRoaXMgaXMgYSBzaW1wbGUgSkFYV1MvSlNSIDE4MSBzZXJ2aWNlIHVzZWQgYnkgbWFueSB0byB0ZXN0IHdoZXRoZXIgdGhlIGRpc3RyaWJ1dGlvbiB0aGV5IGdvdCBpcyBzZXR1cCANCi1hbmQgd29ya2luZyBwcm9wZXJseS4gSXQgY29udGFpbnMgYSBzaW5nbGUgbWV0aG9kIHRoYXQgc2ltcGx5IHJldHVybnMgdmVyc2lvbiBhbmQgYnVpbGQgDQotZGF0ZSBvZiB0aGUgQXhpczIgZGlzdHJpYnV0aW9uIHVzZWQuDQotDQotDQotUHJlLVJlcXVpc2l0ZXMNCi09PT09PT09PT09PT09PQ0KLQ0KLUFwYWNoZSBBbnQgMS42LjIgb3IgbGF0ZXINCi0NCi1SdW5uaW5nIHRoZSBTYW1wbGUNCi09PT09PT09PT09PT09PT09PT0NCi0NCi1UeXBlICRhbnQgZnJvbSBBeGlzMl9IT01FL3NhbXBsZXMvdmVyc2lvbg0KLQ0KLQ0KLUhlbHANCi09PT09DQotUGxlYXNlIGNvbnRhY3QgYXhpcy11c2VyIGxpc3QgKGF4aXMtdXNlckB3cy5hcGFjaGUub3JnKSBpZiB5b3UgaGF2ZSBhbnkgdHJvdWJsZSBydW5uaW5nIHRoZSBzYW1wbGUuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy12ZXJzaW9uL2J1aWxkLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3MtdmVyc2lvbi9idWlsZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5ZDk4ODEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy12ZXJzaW9uL2J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTxwcm9qZWN0IG5hbWU9InZlcnNpb24iIGJhc2VkaXI9Ii4iIGRlZmF1bHQ9ImdlbmVyYXRlLnNlcnZpY2UiPg0KLQkNCi0JPHByb3BlcnR5IG5hbWU9ImRlc3QuZGlyIiB2YWx1ZT0iYnVpbGQiIC8+DQotCQ0KLQk8cHJvcGVydHkgbmFtZT0iZGVzdC5kaXIuY2xhc3NlcyIgdmFsdWU9IiR7ZGVzdC5kaXJ9L2NsYXNzZXMiIC8+DQotCQ0KLQk8cHJvcGVydHkgbmFtZT0iYXhpczIuaG9tZSIgdmFsdWU9Ii4uLy4uLyIgLz4NCi0JDQotCTxwcm9wZXJ0eSBuYW1lPSJyZXBvc2l0b3J5LnBhdGgiIHZhbHVlPSIke2F4aXMyLmhvbWV9L3JlcG9zaXRvcnkvc2VydmljZWphcnMiIC8+DQotCQ0KLQk8cGF0aCBpZD0iYnVpbGQuY2xhc3MucGF0aCI+DQotCQk8ZmlsZXNldCBkaXI9IiR7YXhpczIuaG9tZX0vbGliIj4NCi0JCQk8aW5jbHVkZSBuYW1lPSIqLmphciIgLz4NCi0JCTwvZmlsZXNldD4NCi0JPC9wYXRoPg0KLQkNCi0JPHRhcmdldCBuYW1lPSJjbGVhbiI+DQotCQk8ZGVsZXRlIGRpcj0iJHtkZXN0LmRpcn0iIC8+DQotCTwvdGFyZ2V0Pg0KLQkNCi0JPHRhcmdldCBuYW1lPSJwcmVwYXJlIj4NCi0JCQ0KLQkJPG1rZGlyIGRpcj0iJHtkZXN0LmRpcn0iIC8+DQotCQkNCi0JCTxta2RpciBkaXI9IiR7ZGVzdC5kaXIuY2xhc3Nlc30iIC8+DQotDQotCQk8Y29weSB0b2Rpcj0iJHtkZXN0LmRpci5jbGFzc2VzfSI+DQotICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJyZXNvdXJjZXMiLz4NCi0gICAgICAgIDwvY29weT4NCi0JPC90YXJnZXQ+DQotCQ0KLQk8dGFyZ2V0IG5hbWU9ImdlbmVyYXRlLnNlcnZpY2UiIGRlcGVuZHM9ImNsZWFuLHByZXBhcmUiPg0KLQkJDQotCQk8amF2YWMgc3JjZGlyPSJzcmMiIGRlc3RkaXI9IiR7ZGVzdC5kaXIuY2xhc3Nlc30iIGluY2x1ZGVzPSJzYW1wbGUvamF4d3MvKioiPg0KLQkJCTxjbGFzc3BhdGggcmVmaWQ9ImJ1aWxkLmNsYXNzLnBhdGgiIC8+DQotCQk8L2phdmFjPg0KLQkJDQotCQk8amFyIGJhc2VkaXI9IiR7ZGVzdC5kaXIuY2xhc3Nlc30iIGRlc3RmaWxlPSIke2Rlc3QuZGlyfS92ZXJzaW9uLmphciIgLz4NCi0JCQ0KLQkJPGNvcHkgZmlsZT0iJHtkZXN0LmRpcn0vdmVyc2lvbi5qYXIiIHRvZmlsZT0iJHtyZXBvc2l0b3J5LnBhdGh9L3ZlcnNpb24uamFyIiBvdmVyd3JpdGU9InRydWUiIC8+DQotCQ0KLQk8L3RhcmdldD4NCi0JDQotPC9wcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3MtdmVyc2lvbi9wb20ueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy12ZXJzaW9uL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiMzk3MGYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy12ZXJzaW9uL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPg0KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+DQotICAgIDxwYXJlbnQ+DQotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPg0KLSAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItcGFyZW50PC9hcnRpZmFjdElkPg0KLSAgICAgICAgPHZlcnNpb24+MS41LjE8L3ZlcnNpb24+DQotICAgICAgICA8cmVsYXRpdmVQYXRoPi4uLy4uL3BhcmVudC9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+DQotICAgIDwvcGFyZW50Pg0KLSAgICA8YXJ0aWZhY3RJZD52ZXJzaW9uPC9hcnRpZmFjdElkPg0KLSAgICA8bmFtZT5BcGFjaGUgQXhpczIgLSBKQVhXUyBWZXJzaW9uIFNlcnZpY2U8L25hbWU+DQotICAgIDxidWlsZD4NCi0gICAgICAgIDxzb3VyY2VEaXJlY3Rvcnk+c3JjPC9zb3VyY2VEaXJlY3Rvcnk+DQotICAgICAgICA8cmVzb3VyY2VzPg0KLSAgICAgICAgICA8cmVzb3VyY2U+DQotICAgICAgICAgICAgPGRpcmVjdG9yeT5yZXNvdXJjZXM8L2RpcmVjdG9yeT4NCi0gICAgICAgICAgPC9yZXNvdXJjZT4NCi0gICAgICAgIDwvcmVzb3VyY2VzPg0KLSAgICAgICAgPHBsdWdpbnM+DQotICAgICAgICAgICAgPHBsdWdpbj4NCi0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPg0KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgPHNvdXJjZT4xLjU8L3NvdXJjZT4NCi0gICAgICAgICAgICAgICAgICAgIDx0YXJnZXQ+MS41PC90YXJnZXQ+DQotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgICA8L3BsdWdpbj4NCi0gICAgICAgIDwvcGx1Z2lucz4NCi0gICAgPC9idWlsZD4NCi0gICAgPGRlcGVuZGVuY2llcz4NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczIta2VybmVsPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7dmVyc2lvbn08L3ZlcnNpb24+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgIDwvZGVwZW5kZW5jaWVzPg0KLTwvcHJvamVjdD4NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXZlcnNpb24vcmVzb3VyY2VzL01FVEEtSU5GL3ZlcnNpb24ud3NkbCBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3MtdmVyc2lvbi9yZXNvdXJjZXMvTUVUQS1JTkYvdmVyc2lvbi53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjE2NGU2Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3MtdmVyc2lvbi9yZXNvdXJjZXMvTUVUQS1JTkYvdmVyc2lvbi53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08ZGVmaW5pdGlvbnMgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB4bWxuczp0bnM9Imh0dHA6Ly9qYXh3cy5zYW1wbGUvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9qYXh3cy5zYW1wbGUvIiBuYW1lPSJKQVhXU1ZlcnNpb24iPg0KLQk8dHlwZXM+DQotCQk8eHNkOnNjaGVtYT4NCi0JCQk8eHNkOmltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly9qYXh3cy5zYW1wbGUvIiBzY2hlbWFMb2NhdGlvbj0idmVyc2lvbi54c2QiLz4NCi0JCTwveHNkOnNjaGVtYT4NCi0JPC90eXBlcz4NCi0JPG1lc3NhZ2UgbmFtZT0iZ2V0VmVyc2lvblJlc3BvbnNlIj4NCi0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9InRuczpnZXRWZXJzaW9uUmVzcG9uc2UiPg0KLSAgICA8L3BhcnQ+DQotCTwvbWVzc2FnZT4NCi0JPG1lc3NhZ2UgbmFtZT0iRXhjZXB0aW9uIj4NCi0JCTxwYXJ0IG5hbWU9ImZhdWx0IiBlbGVtZW50PSJ0bnM6RXhjZXB0aW9uIj4NCi0gICAgPC9wYXJ0Pg0KLQk8L21lc3NhZ2U+DQotCTxtZXNzYWdlIG5hbWU9ImdldFZlcnNpb24iPg0KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0idG5zOmdldFZlcnNpb24iPg0KLSAgICA8L3BhcnQ+DQotCTwvbWVzc2FnZT4NCi0JPHBvcnRUeXBlIG5hbWU9IlZlcnNpb24iPg0KLQkJPG9wZXJhdGlvbiBuYW1lPSJnZXRWZXJzaW9uIj4NCi0JCQk8aW5wdXQgbWVzc2FnZT0idG5zOmdldFZlcnNpb24iPg0KLSAgICA8L2lucHV0Pg0KLQkJCTxvdXRwdXQgbWVzc2FnZT0idG5zOmdldFZlcnNpb25SZXNwb25zZSI+DQotICAgIDwvb3V0cHV0Pg0KLQkJCTxmYXVsdCBuYW1lPSJFeGNlcHRpb24iIG1lc3NhZ2U9InRuczpFeGNlcHRpb24iPg0KLSAgICA8L2ZhdWx0Pg0KLQkJPC9vcGVyYXRpb24+DQotCTwvcG9ydFR5cGU+DQotCTxiaW5kaW5nIG5hbWU9IlZlcnNpb25Qb3J0QmluZGluZyIgdHlwZT0idG5zOlZlcnNpb24iPg0KLQkJPHNvYXA6YmluZGluZyBzdHlsZT0iZG9jdW1lbnQiIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIi8+DQotCQk8b3BlcmF0aW9uIG5hbWU9ImdldFZlcnNpb24iPg0KLQkJCTxzb2FwOm9wZXJhdGlvbi8+DQotCQkJPGlucHV0Pg0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPg0KLQkJCTwvaW5wdXQ+DQotCQkJPG91dHB1dD4NCi0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4NCi0JCQk8L291dHB1dD4NCi0JCQk8ZmF1bHQgbmFtZT0iRXhjZXB0aW9uIj4NCi0JCQkJPHNvYXA6ZmF1bHQgbmFtZT0iRXhjZXB0aW9uIiB1c2U9ImxpdGVyYWwiLz4NCi0JCQk8L2ZhdWx0Pg0KLQkJPC9vcGVyYXRpb24+DQotCTwvYmluZGluZz4NCi0JPHNlcnZpY2UgbmFtZT0iSkFYV1NWZXJzaW9uIj4NCi0JCTxwb3J0IG5hbWU9IlZlcnNpb25Qb3J0IiBiaW5kaW5nPSJ0bnM6VmVyc2lvblBvcnRCaW5kaW5nIj4NCi0JCQk8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vMTkyLjE2OC4yLjEwMjo4MDgwL2F4aXMyL3NlcnZpY2VzL0pBWFdTVmVyc2lvbi5WZXJzaW9uUG9ydCIvPg0KLQkJPC9wb3J0Pg0KLQk8L3NlcnZpY2U+DQotPC9kZWZpbml0aW9ucz4NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXZlcnNpb24vcmVzb3VyY2VzL01FVEEtSU5GL3ZlcnNpb24ueHNkIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy12ZXJzaW9uL3Jlc291cmNlcy9NRVRBLUlORi92ZXJzaW9uLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNhMDVjMy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXZlcnNpb24vcmVzb3VyY2VzL01FVEEtSU5GL3ZlcnNpb24ueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotPHhzOnNjaGVtYSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOnRucz0iaHR0cDovL2pheHdzLnNhbXBsZS8iIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2pheHdzLnNhbXBsZS8iIGVsZW1lbnRGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCI+DQotCTx4czplbGVtZW50IG5hbWU9IkV4Y2VwdGlvbiIgdHlwZT0idG5zOkV4Y2VwdGlvbiIvPg0KLQk8eHM6ZWxlbWVudCBuYW1lPSJnZXRWZXJzaW9uIiB0eXBlPSJ0bnM6Z2V0VmVyc2lvbiIvPg0KLQk8eHM6ZWxlbWVudCBuYW1lPSJnZXRWZXJzaW9uUmVzcG9uc2UiIHR5cGU9InRuczpnZXRWZXJzaW9uUmVzcG9uc2UiLz4NCi0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImdldFZlcnNpb24iPg0KLQkJPHhzOnNlcXVlbmNlLz4NCi0JPC94czpjb21wbGV4VHlwZT4NCi0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImdldFZlcnNpb25SZXNwb25zZSI+DQotCQk8eHM6c2VxdWVuY2U+DQotCQkJPHhzOmVsZW1lbnQgbmFtZT0icmV0dXJuIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPg0KLQkJPC94czpzZXF1ZW5jZT4NCi0JPC94czpjb21wbGV4VHlwZT4NCi0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9IkV4Y2VwdGlvbiI+DQotCQk8eHM6c2VxdWVuY2U+DQotCQkJPHhzOmVsZW1lbnQgbmFtZT0ibWVzc2FnZSIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4NCi0JCTwveHM6c2VxdWVuY2U+DQotCTwveHM6Y29tcGxleFR5cGU+DQotPC94czpzY2hlbWE+DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy12ZXJzaW9uL3NyYy9zYW1wbGUvamF4d3MvVmVyc2lvbi5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9qYXh3cy12ZXJzaW9uL3NyYy9zYW1wbGUvamF4d3MvVmVyc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTQxMDQ1Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvamF4d3MtdmVyc2lvbi9zcmMvc2FtcGxlL2pheHdzL1ZlcnNpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIHNhbXBsZS5qYXh3czsNCi0NCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7DQotDQotQFdlYlNlcnZpY2Uoc2VydmljZU5hbWUgPSAiSkFYV1NWZXJzaW9uIiwNCi0gICAgICAgICAgICBwb3J0TmFtZT0iVmVyc2lvblBvcnQiLA0KLSAgICAgICAgICAgIHdzZGxMb2NhdGlvbj0iTUVUQS1JTkYvdmVyc2lvbi53c2RsIikNCi1wdWJsaWMgY2xhc3MgVmVyc2lvbiB7DQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgcmV0dXJuICJIZWxsbyBJIGFtIEF4aXMyIHZlcnNpb24gc2VydmljZSAsIiArDQotICAgICAgICAgICAgICAgICIgTXkgdmVyc2lvbiBpcyAiICsgb3JnLmFwYWNoZS5heGlzMi5WZXJzaW9uLmdldFZlcnNpb25UZXh0KCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9tZXgvUkVBRE1FLnR4dCBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvbWV4L1JFQURNRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3NWM1MmQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9tZXgvUkVBRE1FLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLVNhbXBsZTogbWV4IChNZXRhZGF0YSBFeGNoYW5nZSkNCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0NCi1JbnRyb2R1Y3Rpb24NCi09PT09PT09PT09PT0NCi0NCi1UaGUgZXhhbXBsZXMgcHJvdmlkZWQgZGVtb3N0cmF0ZXMgZGF0YSByZXRyaWV2YWwgZm9yIFdTLU1ldGFkYXRhRXhjaGFuZ2UgR2V0TWV0YWRhdGEgcmVxdWVzdA0KLWhhbmRsZWQgYnkgZGlmZmVyZW50IGxldmVsIG9mIGRhdGEgbG9jYXRvcnMgYmVsb3c6IA0KLSAgMS4gRGVmYXVsdCBBeGlzMiBkYXRhIGxvY2F0b3INCi0gIDIuIFBsdWctaW4gc2VydmljZSBsZXZlbCBkYXRhIGxvY2F0b3INCi0gIDMuIFBsdWctaW4gc2VydmljZSBzZXZlbCBXU0RMLXNwZWNpZmljIGRhdGEgbG9jYXRvcg0KLQ0KLU5vdGU6IEV4YW1wbGUgMiBhbmQgMyBhcmUgb25seSBmb3IgdGhlIHNvbGUgcHVycG9zZSBvZiBkZW1vc3RyYXRpbmcgcGx1Zy1pbiBkYXRhIGxvY2F0b3Igc3VwcG9ydC4gVGhlDQotICAgICAgZGF0YSByZXRyaWV2YWwgbG9naWMgZm9yIHRoZSBwbHVnLWluIGRhdGEgbG9jYXRvcnMgYXJlIG5vdCBpbXBsZW1lbnRlZC4NCi0NCi1EZXRhaWxzIGZvciB0aGUgZXhhbXBsZXMgYXJlIGRvY3VtZW50ZWQgaW4gdGhlIEFwYWNoZSBNZXRhZGF0YSBFeGNoYW5nZSBVc2VyJ3MgR3VpZGUuDQotDQotUHJlcmVxdWlzaXRlcyAgDQotPT09PT09PT09PT09PQ0KLQ0KLVRvIGJ1aWxkIHRoZSBzYW1wbGUgc2VydmljZSB5b3UgbXVzdCBoYXZlIGFudC0xLjYueCBpbnN0YWxsZWQgaW4geW91ciBzeXN0ZW0uIA0KLQ0KLVRvIHNldCBBWElTMl9IT01FIGluIFVuaXgvTGludXggdHlwZToNCi0kZXhwb3J0IEFYSVMyX0hPTUU9PHBhdGggdG8gYXhpczIgZGlzdHJpYnV0aW9uPg0KLQ0KLW1ldGFkYXRhRXhjaGFuZ2UgbW9kdWxlIG11c3QgYmUgZGVwbG95ZWQgYW5kIGVuZ2FnZWQuIA0KLVBsZWFzZSByZWZlciB0byBBcGFjaGUgTWV0YWRhdGEgRXhjaGFuZ2UgVXNlcidzIEd1aWRlIGZvciBob3cgdG8gZGVwbG95IGFuZCBlbmdhZ2UgDQotdGhlIG1ldGFkYXRhRXhjaGFuZ2UgbW9kdWxlLg0KLQ0KLQ0KLUJ1aWxkaW5nIHRoZSBTZXJ2aWNlDQotPT09PT09PT09PT09PT09PT09PT0NCi0NCi1UbyBidWlsZCB0aGUgc2FtcGxlIHNlcnZpY2UsIHR5cGU6ICRhbnQgZ2VuZXJhdGUuc2VydmljZSBvciBqdXN0IGFudA0KLQ0KLVRoaXMgd2lsbCBidWlsZCB0aGUgRGVmYXVsdEF4aXMyRGF0YUxvY2F0b3JEZW1vU2VydmljZS5hYXIsIFNlcnZpY2VMZXZlbERhdGFMb2NhdG9yRGVtb1NlcnZpY2UuYWFyLA0KLWFuZCBXU0RMRGF0YUxvY2F0b3JEZW1vU2VydmljZS5hYXIgc2VydmljZSBhcmNoaXZlIGZpbGVzIGluIHRoZSBidWlsZCBkaXJlY3RvcnkgYW5kIGNvcHkgdGhlbSB0byB0aGUNCi08QVhJUzJfSE9NRT4vcmVwb3NpdG9yeS9zZXJ2aWNlcyBkaXJlY3RvcnkuDQotDQotWW91IGNhbiBzdGFydCB0aGUgQXhpczIgc2VydmVyIGJ5IHJ1bm5pbmcgZWl0aGVyIGF4aXMyc2VydmVyLmJhdCAob24gV2luZG93cykgb3IgYXhpczJzZXJ2ZXIuc2gNCi0ob24gTGludXgpdGhhdCBhcmUgbG9jYXRlZCBpbiA8QVhJUzJfSE9NRT4vYmluIGRpcmVjdG9yeS4NCi0NCi1UaGUgV1NETCBmb3IgdGhpcyBzZXJ2aWNlIHNob3VsZCBiZSB2aWV3YWJsZSBhdDoNCi0NCi1odHRwOi8vPHlvdXJob3N0Pjo8eW91cnBvcnQ+L2F4aXMyL3NlcnZpY2VzL0RlZmF1bHRBeGlzMkRhdGFMb2NhdG9yRGVtb1NlcnZpY2U/d3NkbCANCi0oZS5nLiBodHRwOi8vbG9jYWxob3N0OjgwODAvYXhpczIvc2VydmljZXMvRGVmYXVsdEF4aXMyRGF0YUxvY2F0b3JEZW1vU2VydmljZT93c2RsKQ0KLQ0KLVRoZSBjbGllbnRzIHRvIHNlbmQgR2V0TWV0YWRhdGEgcmVxdWVzdHMgYXJlIGF2YWlsYWJsZSBpbiBzYW1wbGVzL21leC9zcmMvdXNlcmd1aWRlL21leC9jbGllbnRzIGRpcmVjdG9yeS4NCi0NCi0NCi1SdW5uaW5nIHRoZSBDbGllbnQNCi09PT09PT09PT09PT09PT09PT0NCi0NCi1UbyBjb21waWxlIGFuZCBydW4gRGVmYXVsdCBBeGlzMiBkYXRhIGxvY2F0b3Igc2NlbmFyaW8sIHR5cGUNCi0kYW50IHJ1bi5jbGllbnQuZGVmYXVsdA0KLQ0KLVRvIGNvbXBpbGUgYW5kIHJ1biBQbHVnLWluIHNlcnZpY2UgbGV2ZWwgQXhpczIgZGF0YSBsb2NhdG9yIHNjZW5hcmlvLCB0eXBlDQotJGFudCBydW4uY2xpZW50LnNlcnZpY2UNCi0NCi1UbyBjb21waWxlIGFuZCBydW4gUEx1Zy1pbiBXU0RMLXNwZWNpZmljIGxldmVsIEF4aXMyIGRhdGEgbG9jYXRvciBzY2VuYXJpbywgdHlwZQ0KLSRhbnQgcnVuLmNsaWVudC53c2RsDQotDQotDQotSGVscA0KLT09PT0NCi1QbGVhc2UgY29udGFjdCBheGlzLXVzZXIgbGlzdCAoYXhpcy11c2VyQHdzLmFwYWNoZS5vcmcpIGlmIHlvdSBoYXZlIGFueSB0cm91YmxlIHJ1bm5pbmcgdGhlIHNhbXBsZS4NCi0NCi0NCi0NCi0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL21leC9idWlsZC54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL21leC9idWlsZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyN2I0MDcuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9tZXgvYnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+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+Ci0JPGVjaG8gbWVzc2FnZT0icnVuLmNsaWVudC5zZXJ2aWNlIiAvPgotCTxlY2hvIG1lc3NhZ2U9InJ1bi5jbGllbnQud3NkbCIgLz4KLQk8ZWNobyBtZXNzYWdlPSJydW4uY2xpZW50LmFsbCAgLSAgcnVuIGFsbCBjbGllbnRzIiAvPgotICAgIDwvdGFyZ2V0PgotICAgIDx0YXJnZXQgbmFtZT0iY2xlYW4iPgotCTxkZWxldGUgZGlyPSJidWlsZCIgLz4KLSAgICA8L3RhcmdldD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvbWV4L3NyYy91c2VyZ3VpZGUvbWV4L2NsaWVudHMvRGVtb0RlZmF1bHREYXRhTG9jYXRvci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9tZXgvc3JjL3VzZXJndWlkZS9tZXgvY2xpZW50cy9EZW1vRGVmYXVsdERhdGFMb2NhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhNDhkMmMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9tZXgvc3JjL3VzZXJndWlkZS9tZXgvY2xpZW50cy9EZW1vRGVmYXVsdERhdGFMb2NhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIHVzZXJndWlkZS5tZXguY2xpZW50czsKLQotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvcjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTE91dHB1dEZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5PcHRpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YXJldHJpZXZhbC5EUkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFyZXRyaWV2YWwuY2xpZW50Lk1leENsaWVudDsKLQotLyoqCi0gKiBTYW1wbGUgdG8gZGVtb3N0cmF0ZSAgdXNpbmcgRGVmYXV0bCBBeGlzIDIgRGF0YSBMb2NhdG9yIHRvIHBlcmZvcm0gZGF0YSByZXRyaWV2YWwgCi0gKiBmb3IgdGhlIFdTLU1FWCBHZXRNZXRhZGF0YSByZXF1ZXN0LgotICogCi0gKiBJbiB0aGUgZXhhbXBsZSwgbm8gRGF0YSBMb2NhdG9yIGlzIGNvbmZpZ3VyZWQgaW4gdGhlIEF4aXMyLnhtbCBub3IgdGhlIHNlcnZpY2VzLnhtbC4KLSAqIAotICogQmVmb3JlIHJ1bm5pbmcgdGhlIHNhbXBsZSwgeW91IG11c3QgZmlyc3QgZGVwbG95IHRoZSBBeGlzIDIgc2FtcGxlIERlZmF1bHRBeGlzRGF0YUxvY2F0b3JEZW1vU2VydmljZSBzZXJ2aWNlIGkuZS4KLSAqIERlZmF1bHRBeGlzRGF0YUxvY2F0b3JEZW1vU2VydmljZS5hYXIgZmlsZS4gIAotICogCi0gKi8KLQotcHVibGljIGNsYXNzIERlbW9EZWZhdWx0RGF0YUxvY2F0b3IgewotCi0gICBwcml2YXRlIHN0YXRpYyBFbmRwb2ludFJlZmVyZW5jZSB0YXJnZXRFUFIgPSBuZXcgRW5kcG9pbnRSZWZlcmVuY2UoImh0dHA6Ly8xMjcuMC4wLjE6ODA4MC9heGlzMi9zZXJ2aWNlcy9EZWZhdWx0QXhpc0RhdGFMb2NhdG9yRGVtb1NlcnZpY2UiKTsKLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGVzdCBnZXRNZXRhZGF0YSBmb3IgIiArIHRhcmdldEVQUi5nZXRBZGRyZXNzKCkpOwotICAgICAgICAgCi0gICAgICAgICAgICBNZXhDbGllbnQgc2VydmljZUNsaWVudCA9ICBuZXcgTWV4Q2xpZW50KCk7Ci0gICAgICAgICAgICBPcHRpb25zIG9wdGlvbnMgPSBuZXcgT3B0aW9ucygpOwotICAgICAgICAgICAgc2VydmljZUNsaWVudC5zZXRPcHRpb25zKG9wdGlvbnMpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBvcHRpb25zLnNldFRvKHRhcmdldEVQUik7Ci0gICAgICAgICAgICBvcHRpb25zLnNldEFjdGlvbihEUkNvbnN0YW50cy5TUEVDLkFjdGlvbnMuR0VUX01FVEFEQVRBX1JFUVVFU1QpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4gKCJObyBEYXRhTG9jYXRvciBjb25maWd1cmVkISBVc2VkIEF4aXNEYXRhTG9jYXRvciIpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBPTUVsZW1lbnQgbWV0aG9kID0gc2VydmljZUNsaWVudC5zZXR1cEdldE1ldGFkYXRhUmVxdWVzdChudWxsLCBudWxsKTsKLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICBPTUVsZW1lbnQgcmVzdWx0ID0gc2VydmljZUNsaWVudC5zZW5kUmVjZWl2ZShtZXRob2QpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHJlc3VsdCk7Ci0gICAgICAgICAgICBTdHJpbmdXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgICAgICAgICAgdHJ5IHsKLQkJCQlyZXN1bHQuc2VyaWFsaXplKFhNTE91dHB1dEZhY3RvcnkubmV3SW5zdGFuY2UoKQotCQkJCSAgICAgIC5jcmVhdGVYTUxTdHJlYW1Xcml0ZXIod3JpdGVyKSk7Ci0JCQl9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfSBjYXRjaCAoRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvciBlKSB7Ci0JCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0gICAgICAgICAgICB3cml0ZXIuZmx1c2goKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbih3cml0ZXIudG9TdHJpbmcoKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgIAotICAgICAgIAotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgYXhpc0ZhdWx0KSB7Ci0gICAgICAgICAgICBheGlzRmF1bHQucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvbWV4L3NyYy91c2VyZ3VpZGUvbWV4L2NsaWVudHMvRGVtb1NlcnZpY2VMZXZlbERhdGFMb2NhdG9yLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL21leC9zcmMvdXNlcmd1aWRlL21leC9jbGllbnRzL0RlbW9TZXJ2aWNlTGV2ZWxEYXRhTG9jYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMWM5YTg5Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvbWV4L3NyYy91c2VyZ3VpZGUvbWV4L2NsaWVudHMvRGVtb1NlcnZpY2VMZXZlbERhdGFMb2NhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIHVzZXJndWlkZS5tZXguY2xpZW50czsKLQotaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5PcHRpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YXJldHJpZXZhbC5EUkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFyZXRyaWV2YWwuY2xpZW50Lk1leENsaWVudDsKLQotLyoqCi0gKiBTYW1wbGUgdG8gZGVtb3N0cmF0ZSAgdXNpbmcgVXNlci1kZWZpbmVkIFNlcnZpY2UgbGV2ZWwgRGF0YSBMb2NhdG9yIHRvIHBlcmZvcm0gZGF0YSByZXRyaWV2YWwgCi0gKiBmb3IgdGhlIFdTLU1FWCBHZXRNZXRhZGF0YSByZXF1ZXN0LgotICogCi0gKiBJbiB0aGUgZXhhbXBsZSwgZGF0YUxvY2F0b3IgZWxlbWVudCB3YXMgYWRkZWQgaW4gdGhlIHNlcnZpY2VzLnhtbCBvZiB0aGUgdGFyZ2V0IFNlcnZpY2UuCi0gKiAKLSAqIEJlZm9yZSBydW5uaW5nIHRoZSBzYW1wbGUsIHlvdSBtdXN0IGZpcnN0IGRlcGxveSB0aGUgQXhpcyAyIHNhbXBsZSBTZXJ2aWNlTGV2ZWxEYXRhTG9jYXRvckRlbW9TZXJ2aWNlIHNlcnZpY2UgaS5lLgotICogU2VydmljZUxldmVsRGF0YUxvY2F0b3JEZW1vU2VydmljZS5hYXIgZmlsZS4gIAotICogCi0gKi8KLQotcHVibGljIGNsYXNzIERlbW9TZXJ2aWNlTGV2ZWxEYXRhTG9jYXRvciB7Ci0JcHJpdmF0ZSBzdGF0aWMgRW5kcG9pbnRSZWZlcmVuY2UgdGFyZ2V0RVBSID0gbmV3IEVuZHBvaW50UmVmZXJlbmNlKAotCQkJImh0dHA6Ly8xMjcuMC4wLjE6ODA4MC9heGlzMi9zZXJ2aWNlcy9TZXJ2aWNlTGV2ZWxEYXRhTG9jYXRvckRlbW9TZXJ2aWNlIik7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCXRyeSB7Ci0JCQlTeXN0ZW0ub3V0Ci0JCQkJCS5wcmludGxuKENhbGVuZGFyLmdldEluc3RhbmNlKCkuZ2V0VGltZSgpICsgIiBUZXN0IGdldE1ldGFkYXRhIGZvciAiICsgdGFyZ2V0RVBSLmdldEFkZHJlc3MoKSk7Ci0JCQlNZXhDbGllbnQgc2VydmljZUNsaWVudCA9IG5ldyBNZXhDbGllbnQoKTsKLQkJCU9wdGlvbnMgb3B0aW9ucyA9IG5ldyBPcHRpb25zKCk7Ci0JCQlzZXJ2aWNlQ2xpZW50LnNldE9wdGlvbnMob3B0aW9ucyk7Ci0JICAgICAgICBvcHRpb25zLnNldFRvKHRhcmdldEVQUik7Ci0JICAgICAgICBvcHRpb25zLnNldEFjdGlvbihEUkNvbnN0YW50cy5TUEVDLkFjdGlvbnMuR0VUX01FVEFEQVRBX1JFUVVFU1QpOwotCSAgICAgICAgCi0JICAgICAgICBTdHJpbmcgaWRlbnRpZmllciA9IG51bGw7ICAgIAotCQkgICAgT01FbGVtZW50IG1ldGhvZCA9IHNlcnZpY2VDbGllbnQuc2V0dXBHZXRNZXRhZGF0YVJlcXVlc3QoRFJDb25zdGFudHMuU1BFQy5ESUFMRUNUX1RZUEVfV1NETCwgaWRlbnRpZmllcik7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIE9NRWxlbWVudCByZXN1bHQgPSBzZXJ2aWNlQ2xpZW50LnNlbmRSZWNlaXZlKG1ldGhvZCk7Ci0gICAgIAotCQkJU3lzdGVtLm91dC5wcmludGxuKHJlc3VsdCk7Ci0KLQkJfSBjYXRjaCAoQXhpc0ZhdWx0IGF4aXNGYXVsdCkgewotCQkJYXhpc0ZhdWx0LnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9tZXgvc3JjL3VzZXJndWlkZS9tZXgvY2xpZW50cy9EZW1vV1NETFNlcnZpY2VEYXRhTG9jYXRvci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9tZXgvc3JjL3VzZXJndWlkZS9tZXgvY2xpZW50cy9EZW1vV1NETFNlcnZpY2VEYXRhTG9jYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiN2QyNzM1Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvbWV4L3NyYy91c2VyZ3VpZGUvbWV4L2NsaWVudHMvRGVtb1dTRExTZXJ2aWNlRGF0YUxvY2F0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgdXNlcmd1aWRlLm1leC5jbGllbnRzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50Lk9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhcmV0cmlldmFsLkRSQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YXJldHJpZXZhbC5jbGllbnQuTWV4Q2xpZW50OwotCi0vKioKLSAqIFNhbXBsZSB0byBkZW1vc3RyYXRlICB1c2luZyBVc2VyLWRlZmluZWQgU2VydmljZSBsZXZlbCBXU0RMIGRpYWxlY3Qgc3BlY2lmaWMgCi0gKiBEYXRhIExvY2F0b3IgdG8gcGVyZm9ybSBkYXRhIHJldHJpZXZhbGZvciB0aGUgV1MtTUVYIEdldE1ldGFkYXRhIHJlcXVlc3QuCi0gKiAKLSAqIEluIHRoZSBleGFtcGxlLCBkaWFsZWN0TG9jYXRvciBmb3IgZGlhbGVjdD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iCi0gKiBlbGVtZW50IHdhcyBhZGRlZCBpbiB0aGUgc2VydmljZXMueG1sIG9mIHRoZSB0YXJnZXQgU2VydmljZS4KLSAqIAotICogQmVmb3JlIHJ1bm5pbmcgdGhlIHNhbXBsZSwgeW91IG11c3QgZmlyc3QgZGVwbG95IHRoZSBBeGlzIDIgc2FtcGxlICJXU0RMRGF0YUxvY2F0b3JEZW1vU2VydmljZSIgc2VydmljZSBpLmUuCi0gKiBXU0RMRGF0YUxvY2F0b3JEZW1vU2VydmljZS5hYXIgZmlsZS4gIAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBEZW1vV1NETFNlcnZpY2VEYXRhTG9jYXRvciB7Ci0JcHJpdmF0ZSBzdGF0aWMgRW5kcG9pbnRSZWZlcmVuY2UgdGFyZ2V0RVBSID0gbmV3IEVuZHBvaW50UmVmZXJlbmNlKAotCSJodHRwOi8vMTI3LjAuMC4xOjgwODAvYXhpczIvc2VydmljZXMvV1NETERhdGFMb2NhdG9yRGVtb1NlcnZpY2UiKTsKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLXRyeSB7Ci0JU3lzdGVtLm91dAotCQkJLnByaW50bG4oIlRlc3QgZ2V0TWV0YWRhdGEgZm9yICIgKyB0YXJnZXRFUFIuZ2V0QWRkcmVzcygpKTsKLQlTeXN0ZW0ub3V0Ci0JLnByaW50bG4oIlNlcnZpY2UgV1NETCBzcGVjaWZpYyBEYXRhTG9jYXRvciB3YXMgY29uZmlndXJlZCIpOwotCi0JTWV4Q2xpZW50IHNlcnZpY2VDbGllbnQgPSBuZXcgTWV4Q2xpZW50KCk7Ci0JT3B0aW9ucyBvcHRpb25zID0gbmV3IE9wdGlvbnMoKTsKLQlvcHRpb25zLnNldEFjdGlvbihEUkNvbnN0YW50cy5TUEVDLkFjdGlvbnMuR0VUX01FVEFEQVRBX1JFUVVFU1QpOwotICAgIG9wdGlvbnMuc2V0VG8odGFyZ2V0RVBSKTsKLSAgICAKLQlzZXJ2aWNlQ2xpZW50LnNldE9wdGlvbnMob3B0aW9ucyk7Ci0gICAgU3RyaW5nIGlkZW50aWZpZXIgPSAgbnVsbDsgICAKLSAgICBPTUVsZW1lbnQgbWV0aG9kID0gc2VydmljZUNsaWVudC5zZXR1cEdldE1ldGFkYXRhUmVxdWVzdChEUkNvbnN0YW50cy5TUEVDLkRJQUxFQ1RfVFlQRV9XU0RMLCBpZGVudGlmaWVyKTsKLSAgICAKLSAgICBPTUVsZW1lbnQgcmVzdWx0ID0gc2VydmljZUNsaWVudC5zZW5kUmVjZWl2ZShtZXRob2QpOwotCi0JU3lzdGVtLm91dC5wcmludGxuKHJlc3VsdCk7Ci0KLX0gY2F0Y2ggKEF4aXNGYXVsdCBheGlzRmF1bHQpIHsKLQlheGlzRmF1bHQucHJpbnRTdGFja1RyYWNlKCk7Ci19Ci19Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL21leC9zcmMvdXNlcmd1aWRlL21leC9kYXRhbG9jYXRvcnMvR2xvYmFsRGF0YUxvY2F0b3IuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvbWV4L3NyYy91c2VyZ3VpZGUvbWV4L2RhdGFsb2NhdG9ycy9HbG9iYWxEYXRhTG9jYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjdlYzQwLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvbWV4L3NyYy91c2VyZ3VpZGUvbWV4L2RhdGFsb2NhdG9ycy9HbG9iYWxEYXRhTG9jYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgdXNlcmd1aWRlLm1leC5kYXRhbG9jYXRvcnM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhcmV0cmlldmFsLkF4aXNEYXRhTG9jYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFyZXRyaWV2YWwuRFJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhcmV0cmlldmFsLkRhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhcmV0cmlldmFsLkRhdGFSZXRyaWV2YWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhcmV0cmlldmFsLkRhdGFSZXRyaWV2YWxSZXF1ZXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YXJldHJpZXZhbC5PdXRwdXRGb3JtOwotCi0vKgotICogU2FtcGxlIHVzZXItZGVmaW5lZCBHbG9iYWwgTGV2ZWwgTG9jYXRvciwgR2xvYmFsRGF0YUxvY2F0b3IKLSAqIAotICogVGhlIHNhbXBsZSBEYXRhIExvY2F0b3IgaW1wbGVtZW50ZWQgc3VwcG9ydHMgZGF0YSByZXRyaWV2YWwgZm9yIHRoZSBQb2xpY3kgYW5kIFNjaGVtYQotICogZGlhbGVjdHMuIEZvciBkaWFsZWN0cyB0aGF0IGl0IGRvZXMgbm90IHVuZGVyc3RhbmQsIGl0IGRlbGVnYXRlcyB0aGUgcmVxdWVzdAotICogdG8gdGhlIGF2YWlsYWJsZSBEYXRhIExvY2F0b3JzIGluIHRoZSBoaWVyYWNoeSBieSByZXR1cm5pbmcgUmVzdWx0IHdpdGgKLSAqIHVzZURhdGFMb2NhdG9ySGllcmFjaHkgaW5kaWNhdG9yIHNldC4KLSAqIAotICogU2VlICB7QGxpbmsgRGVtb1NlcnZpY2VMZXZlbERhdGFMb2NhdG9yfSBmb3Igc3RlcHMgdG8gaW52b2tlIGdldERhdGEgQVBJCi0gKiBvZiB0aGlzIERhdGEgTG9jYXRvci4gICAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgR2xvYmFsRGF0YUxvY2F0b3IgaW1wbGVtZW50cyBBeGlzRGF0YUxvY2F0b3IgewotCi0JcHVibGljIERhdGFbXSBnZXREYXRhKERhdGFSZXRyaWV2YWxSZXF1ZXN0IHJlcXVlc3QsCi0JCQlNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB0aHJvd3MgRGF0YVJldHJpZXZhbEV4Y2VwdGlvbiB7Ci0JCURhdGFbXSBvdXRwdXQgPSBudWxsOwotICAgICAgICBTdHJpbmcgZGlhbGVjdCA9IHJlcXVlc3QuZ2V0RGlhbGVjdCgpOwotICAgICAgICBPdXRwdXRGb3JtIGZvcm0gPSByZXF1ZXN0LmdldE91dHB1dEZvcm0oKTsKLSAgICAgICAgaWYgKGZvcm0gPT0gT3V0cHV0Rm9ybS5SRUZFUkVOQ0VfRk9STSl7Ci0gICAgICAgIAkKLSAgICAgICAgfQotICAgICAgICBpZiAoZGlhbGVjdC5lcXVhbHMoRFJDb25zdGFudHMuU1BFQy5ESUFMRUNUX1RZUEVfUE9MSUNZKSB8fCBkaWFsZWN0LmVxdWFscyhEUkNvbnN0YW50cy5TUEVDLkRJQUxFQ1RfVFlQRV9TQ0hFTUEpKXsKLSAgICAgICAJIFN5c3RlbS5vdXQucHJpbnQoIlNlcnZpY2VMZXZlbERhdGFMb2NhdG9yIGhhcyBub3QgaW1wbGVtZW50ZWQgZGF0YSByZXRyaWV2YWwgZm9yIGRpYWxlY3QgIiArIGRpYWxlY3QpOwotICAgICAgICAJIFN5c3RlbS5vdXQucHJpbnRsbigiIik7Ci0gICAgICAgCSBTeXN0ZW0ub3V0LnByaW50bG4oIiEhISEgZ2V0IEF4aXMyIGRlZmF1bHQgRGF0YSBMb2NhdG9yIHRvIHJldHJpZXZlIGRhdGEgZm9yICIgKyBkaWFsZWN0KTsKLQotICAgICAgIAkvLyByZXN1bHQgPSBuZXcgUmVzdWx0KCk7Ci0gICAgICAgIAkvLyByZXN1bHQuc2V0VXNlRGF0YUxvY2F0b3JIaWVyYWNoeSh0cnVlKTsKLSAgCi0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgCSBTeXN0ZW0ub3V0LnByaW50bG4oIiEhISEgU2VydmljZUxldmVsRGF0YUxvY2F0b3IgZG9lcyBub3Qgc3VwcG9ydCBkaWFsZWN0ICIgKyBkaWFsZWN0KTsKLSAgICAgICAJIFN5c3RlbS5vdXQucHJpbnRsbigiIik7Ci0gICAgICAgCSBTeXN0ZW0ub3V0LnByaW50bG4oIiEhISEgZ2V0IEF4aXMyIGRlZmF1bHQgRGF0YSBMb2NhdG9yIHRvIHJldHJpZXZlIGRhdGEgZm9yICIgKyBkaWFsZWN0KTsKLSAgICAgICAgCS8vIHJlc3VsdCA9IG5ldyBSZXN1bHQoKTsKLSAgICAgICAgCS8vIHJlc3VsdC5zZXRVc2VEYXRhTG9jYXRvckhpZXJhY2h5KHRydWUpOwotICAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG91dHB1dDsKLQkJCi0JfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL21leC9zcmMvdXNlcmd1aWRlL21leC9kYXRhbG9jYXRvcnMvU2VydmljZUxldmVsRGF0YUxvY2F0b3IuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvbWV4L3NyYy91c2VyZ3VpZGUvbWV4L2RhdGFsb2NhdG9ycy9TZXJ2aWNlTGV2ZWxEYXRhTG9jYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODYxZDIwLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvbWV4L3NyYy91c2VyZ3VpZGUvbWV4L2RhdGFsb2NhdG9ycy9TZXJ2aWNlTGV2ZWxEYXRhTG9jYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSB1c2VyZ3VpZGUubWV4LmRhdGFsb2NhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFyZXRyaWV2YWwuKjsKLQotLyoKLSAqIFNhbXBsZSBTZXJ2aWNlIExldmVsIExvY2F0b3IKLSAqIFNlcnZpY2VMZXZlbERhdGFMb2NhdG9yIGlzIGNvbmZpZ3VyZWQgYXMgYSBTZXJ2aWNlIGxldmVsIERhdGEgTG9jYXRvciAKLSAqIGZvciB0aGUgU2FtcGxlIFNlcnZpY2VMZXZlbERhdGFMb2NhdG9yRGVtb1NlcnZpY2Ugc2VydmljZS4KLSAqIAotICogVGhlIHNhbXBsZSBEYXRhIExvY2F0b3IgaXMgb25seSBmb3IgdGhlIHB1cnBvc2Ugb2YgZGVtb3N0cmF0aW5nIGFuIGltcGxlbWVudGF0aW9uIG9mCi0gKiB1c2VyLWRlZmluZWQgU2VydmljZSBMZXZlbCBEYXRhIExvY2F0b3IsIHRoZSBhY3R1YWwgZGF0YSByZXRyaWV2YWwgY29kZSBpcyBub3QgaW1wbGVtZW50ZWQuCi0gKiBJbiB0aGUgZXhhbXBsZSwgYSBlbXB0eSBEYXRhIGFycmF5IGlzIHJldHVybmVkIGZvciBQb2xpY3kgYW5kIFNjaGVtYSBkYXRhIHJldHJpZXZhbAotICogcmVxdWVzdCwgYW5kIGEgbnVsbCBEYXRhIGFycmF5IGlzIHJldHVybmVkIGZvciBXU0RMIGRhdGEgcmV0cmlldmFsLiAKLSAqIAotICogTm90ZTogRW1wdHkgRGF0YSBhcnJheSBtZWFucyBEYXRhIExvY2F0b3IgdW5kZXJzdG9vZCB0aGUgcmVxdWVzdCwgaG93ZXZlciBkYXRhCi0gKiBpcyBub3QgYXZhaWxhYmxlIGZvciB0aGUgRGlhbGVjdDsgYSBudWxsIGRhdGEgYXJyYXkgbWVhbnMgRGF0YSBMb2NhdG9yIGRvZXMgbm90IHVuZGVyc3RhbmQKLSAqIHRoZSByZXF1ZXN0LgotICogCi0gKiBSdW4gIHtAbGluayBEZW1vU2VydmljZUxldmVsRGF0YUxvY2F0b3J9IGNsaWVudCBjb2RlIHRvIGludm9rZSB0aGlzIHNhbXBsZSBkYXRhIGxvY2F0b3IuIAotICogICAgCi0gKi8KLQotcHVibGljIGNsYXNzIFNlcnZpY2VMZXZlbERhdGFMb2NhdG9yIGltcGxlbWVudHMgQXhpc0RhdGFMb2NhdG9yIHsKLQotCXB1YmxpYyBEYXRhW10gZ2V0RGF0YShEYXRhUmV0cmlldmFsUmVxdWVzdCByZXF1ZXN0LAotCQkJTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgdGhyb3dzIERhdGFSZXRyaWV2YWxFeGNlcHRpb24gewotCQlTeXN0ZW0ub3V0Ci0JCQkJLnByaW50bG4oQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKS5nZXRUaW1lKCkKLQkJCQkJCSsgIiAhISEhIHVzZXJndWlkZS5tZXguZGF0YWxvY2F0b3JzLlNlcnZpY2VMZXZlbERhdGFMb2NhdG9yIHBlcmZvcm1pbmcgZ2V0RGF0YSAhISEhIik7Ci0KLQkJU3lzdGVtLm91dAotCQkJCS5wcmludCgiICEhISBTRVJWSUNFIExFVkVMIERhdGEgTG9jYXRvciBzdXBwb3J0cyBQb2xpY3kgYW5kIFNjaGVtYSBkaWFsZWN0cyBvbmx5ICEhISIpOwotCQlEYXRhW10gcmVzdWx0ID0gbnVsbDsKLQotCQlTdHJpbmcgZGlhbGVjdCA9IHJlcXVlc3QuZ2V0RGlhbGVjdCgpOwotCQlpZiAoZGlhbGVjdC5lcXVhbHMoRFJDb25zdGFudHMuU1BFQy5ESUFMRUNUX1RZUEVfUE9MSUNZKQotCQkJCXx8IGRpYWxlY3QuZXF1YWxzKERSQ29uc3RhbnRzLlNQRUMuRElBTEVDVF9UWVBFX1NDSEVNQSkpIHsKLQkJCS8vIFlvdSBtYXkgaW1wbGVtZW50IGxvZ2ljIHRvIHJldHJpZXZlIFBvbGljeSBhbmQgU2NoZW1hIG1ldGFkYXRhIGhlcmUhIQotCQkJLy8KLQkJCVN5c3RlbS5vdXQKLQkJCQkJLnByaW50KCJTZXJ2aWNlTGV2ZWxEYXRhTG9jYXRvciBoYXMgbm90IGltcGxlbWVudGVkIGRhdGEgcmV0cmlldmFsIGZvciBkaWFsZWN0ICIKLQkJCQkJCQkrIGRpYWxlY3QpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCIiKTsKLQkJCVN5c3RlbS5vdXQKLQkJCQkJLnByaW50bG4oIiEhISEgUmV0dXJuIGVtcHR5IERhdGEgbWVhbnMgdGhlIERhdGEgTG9jYXRvciB1bmRlcnN0b29kIHRoZSByZXF1ZXN0IGZvciBEaWFsZWN0LCBidXQgbm8gZGF0YSBpcyBhdmFpbGFibGUgZm9yIHRoZSBkaWFsZWN0Iik7Ci0JCQlyZXN1bHQgPSBuZXcgRGF0YVswXTsKLQotCQl9IGVsc2UgewotCQkJU3lzdGVtLm91dAotCQkJCQkucHJpbnRsbigiISEhISBTZXJ2aWNlTGV2ZWxEYXRhTG9jYXRvciBkb2VzIG5vdCBzdXBwb3J0IGRpYWxlY3QgIgotCQkJCQkJCSsgZGlhbGVjdCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiIpOwotCQkJU3lzdGVtLm91dAotCQkJCQkucHJpbnRsbigiISEhISBSZXR1cm4gTnVsbCBEYXRhIG1lYW5zIGVzY2FsYXRlIHRvIHRoZSBBeGlzMiBkZWZhdWx0IERhdGEgTG9jYXRvciB0byByZXRyaWV2ZSBkYXRhIGZvciAiCi0JCQkJCQkJKyBkaWFsZWN0KTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkJCi0JCQotCQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9tZXgvc3JjL3VzZXJndWlkZS9tZXgvZGF0YWxvY2F0b3JzL1dTRExEYXRhTG9jYXRvci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9tZXgvc3JjL3VzZXJndWlkZS9tZXgvZGF0YWxvY2F0b3JzL1dTRExEYXRhTG9jYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODdjNzAxLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvbWV4L3NyYy91c2VyZ3VpZGUvbWV4L2RhdGFsb2NhdG9ycy9XU0RMRGF0YUxvY2F0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgdXNlcmd1aWRlLm1leC5kYXRhbG9jYXRvcnM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhcmV0cmlldmFsLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLQotLyoKLSAqIFNhbXBsZSB1c2VyLWRlZmluZWQgV1NETCBEYXRhIExvY2F0b3IsIFdTRExEYXRhTG9jYXRvciBpcyBjb25maWd1cmVkIGFzIGEgU2VydmljZSBsZXZlbCAKLSAqIFdTREwgc3BlY2lmaWMgRGF0YSBMb2NhdG9yIGZvciB0aGUgU2FtcGxlIFdTRExEYXRhU2VydmljZU15U2VydmljZSBzZXJ2aWNlLgotICogCi0gKiBUaGUgc2FtcGxlIERhdGEgTG9jYXRvciBpcyBvbmx5IGZvciB0aGUgcHVycG9zZSBvZiBkZW1vc3RyYXRpbmcgYW4gaW1wbGVtZW50YXRpb24gb2YKLSAqIHVzZXItZGVmaW5lZCBTZXJ2aWNlIExldmVsIERpYWxlY3QgRGF0YSBMb2NhdG9yLCB0aGUgYWN0dWFsIGRhdGEgcmV0cmlldmFsIGNvZGUgaXMgbm90IGltcGxlbWVudGVkLgotICogSW4gdGhlIGV4YW1wbGUsIGEgZW1wdHkgRGF0YSBhcnJheSBpcyByZXR1cm5lZCBmb3IgV1NETCBkYXRhIHJldHJpZXZhbAotICogcmVxdWVzdC4KLSAqIAotICogTm90ZTogRW1wdHkgRGF0YSBhcnJheSBtZWFucyBEYXRhIExvY2F0b3IgdW5kZXJzdG9vZCB0aGUgcmVxdWVzdC4KLSAqIAotICogUnVuICB7QGxpbmsgRGVtb1NlcnZpY2VXU0RMU2VydmljZUxvY2F0b3J9IGNsaWVudCBjb2RlIHRvIGludm9rZSB0aGlzIHNhbXBsZSBkYXRhIGxvY2F0b3IuIAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0RMRGF0YUxvY2F0b3IgaW1wbGVtZW50cyBBeGlzRGF0YUxvY2F0b3IgewotCUF4aXNTZXJ2aWNlIHRoZVNlcnZpY2UgPSBudWxsOwotCi0JU3RyaW5nIHNlcnZpY2VOYW1lID0gIldTRExEYXRhTG9jYXRvckRlbW9TZXJ2aWNlIjsKLQotCXB1YmxpYyBEYXRhW10gZ2V0RGF0YShEYXRhUmV0cmlldmFsUmVxdWVzdCByZXF1ZXN0LAotCQkJTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgdGhyb3dzIERhdGFSZXRyaWV2YWxFeGNlcHRpb24gewotCQlEYXRhW10gcmVzdWx0ID0gbmV3IERhdGFbMF07Ci0JCVN5c3RlbS5vdXQucHJpbnQoc2VydmljZU5hbWUKLQkJCQkrICIgVXNlci1kZWZpbmVkIFdTREwgRGF0YSBMb2NhdG9yIGhhcyBiZWVuIGludm9rZWQhISEiKTsKLQkJLy8gWW91IG1heSBpbXBsZW1lbnQgbG9naWMgdG8gcmV0cmlldmUgV1NETCBtZXRhZGF0YSBoZXJlISEKLQkJCi0JCVN5c3RlbS5vdXQucHJpbnQoIldTRExEYXRhTG9jYXRvciBoYXMgbm90IGltcGxlbWVudGVkIGRhdGEgcmV0cmlldmFsLiIpOwotIAotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotfQotCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL21leC9zcmMvdXNlcmd1aWRlL21leC9zZXJ2aWNlcy9leGFtcGxlMS9NRVRBLUlORi9EZWZhdWx0QXhpczJEYXRhTG9jYXRvckRlbW9TZXJ2aWNlLndzZGwgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL21leC9zcmMvdXNlcmd1aWRlL21leC9zZXJ2aWNlcy9leGFtcGxlMS9NRVRBLUlORi9EZWZhdWx0QXhpczJEYXRhTG9jYXRvckRlbW9TZXJ2aWNlLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxZTNhNzkuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9tZXgvc3JjL3VzZXJndWlkZS9tZXgvc2VydmljZXMvZXhhbXBsZTEvTUVUQS1JTkYvRGVmYXVsdEF4aXMyRGF0YUxvY2F0b3JEZW1vU2VydmljZS53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotPCEtLQotICB+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+PHdzZGw6cG9ydCBuYW1lPSJEZWZhdWx0QXhpc0RhdGFMb2NhdG9yRGVtb1NlcnZpY2VIdHRwcG9ydDEiIGJpbmRpbmc9ImF4aXMyOkRlZmF1bHRBeGlzRGF0YUxvY2F0b3JEZW1vU2VydmljZUh0dHBCaW5kaW5nIj48aHR0cDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vMTkyLjE2OC4wLjEwNzo4MDgwL2F4aXMyL3Jlc3QvRGVmYXVsdEF4aXNEYXRhTG9jYXRvckRlbW9TZXJ2aWNlIiAvPjwvd3NkbDpwb3J0Pjwvd3NkbDpzZXJ2aWNlPjwvd3NkbDpkZWZpbml0aW9ucz4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvbWV4L3NyYy91c2VyZ3VpZGUvbWV4L3NlcnZpY2VzL2V4YW1wbGUxL01FVEEtSU5GL0RlZmF1bHRBeGlzMkRhdGFMb2NhdG9yRGVtb1NlcnZpY2UueHNkIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9tZXgvc3JjL3VzZXJndWlkZS9tZXgvc2VydmljZXMvZXhhbXBsZTEvTUVUQS1JTkYvRGVmYXVsdEF4aXMyRGF0YUxvY2F0b3JEZW1vU2VydmljZS54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkMjM2MjQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9tZXgvc3JjL3VzZXJndWlkZS9tZXgvc2VydmljZXMvZXhhbXBsZTEvTUVUQS1JTkYvRGVmYXVsdEF4aXMyRGF0YUxvY2F0b3JEZW1vU2VydmljZS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eHNkOnNjaGVtYSB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiAKLXhtbG5zOm5zMD0iaHR0cDovL3NlcnZpY2VzLmV4YW1wbGUub3JnL21leC9pbnRlcm9wL1NlcnZpY2VBLyIgCi14bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiB4bWxuczp0bnM9Imh0dHA6Ly93d3cuZXhhbXBsZS5vcmcvU2VydmljZUEvIiAKLXhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiAKLWVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiAKLXRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2V4YW1wbGUxLnNlcnZpY2VzLm1leC51c2VyZ3VpZGUveHNkIj4KLSA8eHNkOmVsZW1lbnQgbmFtZT0iZ2V0VmVyc2lvbkZhdWx0Ij4gPHhzZDpjb21wbGV4VHlwZT4KLSA8eHNkOnNlcXVlbmNlPgotPHhzZDplbGVtZW50IG5hbWU9ImdldFZlcnNpb25GYXVsdCIgdHlwZT0ieHNkOmFueVR5cGUiLz4KLTwveHNkOnNlcXVlbmNlPgotPC94c2Q6Y29tcGxleFR5cGU+Ci08L3hzZDplbGVtZW50PgotPHhzZDplbGVtZW50IG5hbWU9ImdldFZlcnNpb25SZXNwb25zZSI+Ci0gPHhzZDpjb21wbGV4VHlwZT48eHNkOnNlcXVlbmNlPgotPHhzZDplbGVtZW50IG5hbWU9InJldHVybiIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLTwveHNkOnNlcXVlbmNlPgotPC94c2Q6Y29tcGxleFR5cGU+Ci08L3hzZDplbGVtZW50PiAgCi08L3hzZDpzY2hlbWE+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL21leC9zcmMvdXNlcmd1aWRlL21leC9zZXJ2aWNlcy9leGFtcGxlMS9NRVRBLUlORi9TZXJ2aWNlRGF0YS54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL21leC9zcmMvdXNlcmd1aWRlL21leC9zZXJ2aWNlcy9leGFtcGxlMS9NRVRBLUlORi9TZXJ2aWNlRGF0YS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0MWEyMDIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9tZXgvc3JjL3VzZXJndWlkZS9tZXgvc2VydmljZXMvZXhhbXBsZTEvTUVUQS1JTkYvU2VydmljZURhdGEueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08U2VydmljZURhdGE+Ci08RGF0YSBkaWFsZWN0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIgZmlsZT0iTUVUQS1JTkYvRGVmYXVsdEF4aXMyRGF0YUxvY2F0b3JEZW1vU2VydmljZS53c2RsIj4KLSA8VVJMPmh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9heGlzMi9zZXJ2aWNlcy9EZWZhdWx0QXhpczJEYXRhTG9jYXRvckRlbW9TZXJ2aWNlP3dzZGwgPC9VUkw+Ci08L0RhdGE+Ci08RGF0YSBkaWFsZWN0PSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgZmlsZT0iTUVUQS1JTkYvRGVmYXVsdEF4aXMyRGF0YUxvY2F0b3JEZW1vU2VydmljZS54c2QiPgotIDxVUkw+aHR0cDovL2xvY2FsaG9zdDo4MDgwL2F4aXMyL3NlcnZpY2VzL0RlZmF1bHRBeGlzMkRhdGFMb2NhdG9yRGVtb1NlcnZpY2U/eHNkIDwvVVJMPgotIDwvRGF0YT4KLTwvU2VydmljZURhdGE+Ci0gCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL21leC9zcmMvdXNlcmd1aWRlL21leC9zZXJ2aWNlcy9leGFtcGxlMS9NRVRBLUlORi9zZXJ2aWNlcy54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL21leC9zcmMvdXNlcmd1aWRlL21leC9zZXJ2aWNlcy9leGFtcGxlMS9NRVRBLUlORi9zZXJ2aWNlcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4NzgzODIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9tZXgvc3JjL3VzZXJndWlkZS9tZXgvc2VydmljZXMvZXhhbXBsZTEvTUVUQS1JTkYvc2VydmljZXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08c2VydmljZSBuYW1lPSJEZWZhdWx0QXhpczJEYXRhTG9jYXRvckRlbW9TZXJ2aWNlIj4KLSAgICA8ZGVzY3JpcHRpb24+Ci0gICAgIFNhbXBsZSB3ZWIgc2VydmljZSB0byBkZW1vc3RyYXRlIHVzZSBvZiBEZWZhdWx0IEF4aXMyIERhdGEgTG9jYXRvciB0byBoYW5kbGUgd3MtbWV4IEdldE1ldGFkYXRhIHJlcXVlc3QuICAgICAgIAotICAgICA8L2Rlc2NyaXB0aW9uPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iU2VydmljZUNsYXNzIj51c2VyZ3VpZGUubWV4LnNlcnZpY2VzLmV4YW1wbGUxLlZlcnNpb248L3BhcmFtZXRlcj4KLSAgICA8b3BlcmF0aW9uIG5hbWU9ImdldFZlcnNpb24iPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0ibWV0YWRhdGFFeGNoYW5nZSI+Ci0gICAgICA8b3V0cHV0Zm9ybSBkaWFsZWN0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIgZm9ybXM9ImlubGluZSxsb2NhdGlvbiIvPgotICAgICAgPG91dHB1dGZvcm0gZm9ybXM9ImxvY2F0aW9uIi8+Ci0gICAgIDwvcGFyYW1ldGVyPgotICAgIDxtZXNzYWdlUmVjZWl2ZXIgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJwYy5yZWNlaXZlcnMuUlBDTWVzc2FnZVJlY2VpdmVyIiAvPgotICAgIDwvb3BlcmF0aW9uPgotPC9zZXJ2aWNlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvbWV4L3NyYy91c2VyZ3VpZGUvbWV4L3NlcnZpY2VzL2V4YW1wbGUxL1ZlcnNpb24uamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvbWV4L3NyYy91c2VyZ3VpZGUvbWV4L3NlcnZpY2VzL2V4YW1wbGUxL1ZlcnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGMwODBhYy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL21leC9zcmMvdXNlcmd1aWRlL21leC9zZXJ2aWNlcy9leGFtcGxlMS9WZXJzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIHVzZXJndWlkZS5tZXguc2VydmljZXMuZXhhbXBsZTE7Ci0KLXB1YmxpYyBjbGFzcyBWZXJzaW9uIHsKLSAgICBwdWJsaWMgU3RyaW5nIGdldFZlcnNpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuICJIZWxsbyBJIGFtIEF4aXMyIHZlcnNpb24gc2VydmljZSAsIiArCi0gICAgICAgICAgICAgICAgIiBNeSB2ZXJzaW9uIGlzICIgKyBvcmcuYXBhY2hlLmF4aXMyLlZlcnNpb24uZ2V0VmVyc2lvblRleHQoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL21leC9zcmMvdXNlcmd1aWRlL21leC9zZXJ2aWNlcy9leGFtcGxlMi9NRVRBLUlORi9zZXJ2aWNlcy54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL21leC9zcmMvdXNlcmd1aWRlL21leC9zZXJ2aWNlcy9leGFtcGxlMi9NRVRBLUlORi9zZXJ2aWNlcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkOTUwNGIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9tZXgvc3JjL3VzZXJndWlkZS9tZXgvc2VydmljZXMvZXhhbXBsZTIvTUVUQS1JTkYvc2VydmljZXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08c2VydmljZSBuYW1lPSJTZXJ2aWNlTGV2ZWxEYXRhTG9jYXRvckRlbW9TZXJ2aWNlIj4KLSAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICBTYW1wbGUgd2ViIHNlcnZpY2UgdG8gZGVtb3N0cmF0ZSB1c2Ugb2YgIGRlZmluZWQgU2VydmljZSBMZXZlbCBEYXRhIExvY2F0b3IgdG8gaGFuZGxlIHdzLW1leCBHZXRNZXRhZGF0YSByZXF1ZXN0LiAgICAgICAKLSAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iU2VydmljZUNsYXNzIj51c2VyZ3VpZGUubWV4LnNlcnZpY2VzLmV4YW1wbGUyLlZlcnNpb248L3BhcmFtZXRlcj4KLSAgICA8b3BlcmF0aW9uIG5hbWU9ImdldFZlcnNpb24iPgotICAgIDxtZXNzYWdlUmVjZWl2ZXIgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJwYy5yZWNlaXZlcnMuUlBDTWVzc2FnZVJlY2VpdmVyIiAvPgotICAgIDwvb3BlcmF0aW9uPgotICAgPGRhdGFMb2NhdG9yIGNsYXNzPSJ1c2VyZ3VpZGUubWV4LmRhdGFsb2NhdG9ycy5TZXJ2aWNlTGV2ZWxEYXRhTG9jYXRvciI+Ci0gICA8L2RhdGFMb2NhdG9yPgotPC9zZXJ2aWNlPgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9tZXgvc3JjL3VzZXJndWlkZS9tZXgvc2VydmljZXMvZXhhbXBsZTIvVmVyc2lvbi5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9tZXgvc3JjL3VzZXJndWlkZS9tZXgvc2VydmljZXMvZXhhbXBsZTIvVmVyc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDZiMjYyLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvbWV4L3NyYy91c2VyZ3VpZGUvbWV4L3NlcnZpY2VzL2V4YW1wbGUyL1ZlcnNpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgdXNlcmd1aWRlLm1leC5zZXJ2aWNlcy5leGFtcGxlMjsKLQotcHVibGljIGNsYXNzIFZlcnNpb24gewotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gIkhlbGxvIEkgYW0gQXhpczIgdmVyc2lvbiBzZXJ2aWNlICwiICsKLSAgICAgICAgICAgICAgICAiIE15IHZlcnNpb24gaXMgIiArIG9yZy5hcGFjaGUuYXhpczIuVmVyc2lvbi5nZXRWZXJzaW9uVGV4dCgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvbWV4L3NyYy91c2VyZ3VpZGUvbWV4L3NlcnZpY2VzL2V4YW1wbGUzL01FVEEtSU5GL3NlcnZpY2VzLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvbWV4L3NyYy91c2VyZ3VpZGUvbWV4L3NlcnZpY2VzL2V4YW1wbGUzL01FVEEtSU5GL3NlcnZpY2VzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE4Y2EzNi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL21leC9zcmMvdXNlcmd1aWRlL21leC9zZXJ2aWNlcy9leGFtcGxlMy9NRVRBLUlORi9zZXJ2aWNlcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzZXJ2aWNlIG5hbWU9IldTRExEYXRhTG9jYXRvckRlbW9TZXJ2aWNlIj4KLSAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICBTYW1wbGUgd2ViIHNlcnZpY2UgdG8gZGVtb3N0cmF0ZSB1c2Ugb2YgIGRlZmluZWQgV1NETCBkaWFsZWN0IHNwZWNmaWMgRGF0YSBMb2NhdG9yIHRvIGhhbmRsZSB3cy1tZXggR2V0TWV0YWRhdGEgcmVxdWVzdC4gICAgICAgCi0gICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9IlNlcnZpY2VDbGFzcyI+dXNlcmd1aWRlLm1leC5zZXJ2aWNlcy5leGFtcGxlMy5WZXJzaW9uPC9wYXJhbWV0ZXI+Ci0gICAgPG9wZXJhdGlvbiBuYW1lPSJnZXRWZXJzaW9uIj4KLSAgICA8bWVzc2FnZVJlY2VpdmVyICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5ycGMucmVjZWl2ZXJzLlJQQ01lc3NhZ2VSZWNlaXZlciIgLz4KLSAgICA8L29wZXJhdGlvbj4KLSAgPGRhdGFMb2NhdG9yPgotICA8ZGlhbGVjdExvY2F0b3IgZGlhbGVjdD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIGNsYXNzPSJ1c2VyZ3VpZGUubWV4LmRhdGFsb2NhdG9ycy5XU0RMRGF0YUxvY2F0b3IiIC8+IAotICAgPC9kYXRhTG9jYXRvcj4KLTwvc2VydmljZT4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvbWV4L3NyYy91c2VyZ3VpZGUvbWV4L3NlcnZpY2VzL2V4YW1wbGUzL1ZlcnNpb24uamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvbWV4L3NyYy91c2VyZ3VpZGUvbWV4L3NlcnZpY2VzL2V4YW1wbGUzL1ZlcnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGYwOTNiZi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL21leC9zcmMvdXNlcmd1aWRlL21leC9zZXJ2aWNlcy9leGFtcGxlMy9WZXJzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIHVzZXJndWlkZS5tZXguc2VydmljZXMuZXhhbXBsZTM7Ci0KLXB1YmxpYyBjbGFzcyBWZXJzaW9uIHsKLSAgICBwdWJsaWMgU3RyaW5nIGdldFZlcnNpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuICJIZWxsbyBJIGFtIEF4aXMyIHZlcnNpb24gc2VydmljZSAsIiArCi0gICAgICAgICAgICAgICAgIiBNeSB2ZXJzaW9uIGlzICIgKyBvcmcuYXBhY2hlLmF4aXMyLlZlcnNpb24uZ2V0VmVyc2lvblRleHQoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL210b20vUkVBRE1FLnR4dCBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvbXRvbS9SRUFETUUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDA2ODI2Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvbXRvbS9SRUFETUUudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotU2FtcGxlOiBNVE9NIChNZXNzYWdlIFRyYW5zbWlzc2lvbiBPcHRpbWl6YXRpb24gTWVjaGFuaXNtKQ0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLQ0KLUludHJvZHVjdGlvbjoNCi09PT09PT09PT09PT0NCi0NCi1UaGlzIHNhbXBsZSBkZW1vbnN0cmF0ZXMgdGhlIGNhcGFiaWxpdGllcyBhbmQgcG93ZXIgb2YgTVRPTSBzdXBwb3J0IG9mIEFYSVMyLiBJbiB0aGlzIHNhbXBsZSB0aGUNCi11c2VyIGNhbiBzZW5kIGEgZmlsZSB0byB0aGUgc2VydmljZS4NCi0NCi1QcmVyZXF1aXNpdGVzDQotPT09PT09PT09PT09PQ0KLUFwYWNoZSBBbnQgMS42LjIgb3IgbGF0ZXINCi0NCi0NCi1SdW5uaW5nIHRoZSBTYW1wbGU6DQotPT09PT09PT09PT09PT09PT09PQ0KLTEuIFVzZSBhbnQgZ2VuZXJhdGUuc2VydmljZSBvciBqdXN0IHRoZSBhbnQgY29tbWFuZCBhbG9uZSBpbiB0aGUgQXhpczJfSE9NRS9zYW1wbGUvbXRvbS8gdG8gYnVpbGQgdGhlIHNlcnZpY2UuDQotMi4gR2VuZXJhdGVkIHNlcnZpY2UgZ2V0cyBjb3BpZWQgdG8gdGhlIEFYSVMyX0hPTUUvcmVwb3NpdG9yeS9zZXJ2aWNlcyBhdXRvbWF0aWNhbGx5Lg0KLTMuIFJ1biB0aGUgQVhJUzJfSE9NRS9iaW4vYXhpczJzZXJ2ZXIue3NoL2JhdH0gdG8gc3RhcnQgdGhlIHN0YW5kYWxvbmUgYXhpczIgc2VydmVyLiAoQWx0ZXJuYXRpdmVseQ0KLSAgeW91IGNhbiBkcm9wIHRoZSBzYW1wbGUgaW50byB0aGUgc2VydmljZXMgZGlyZWN0b3J5IG9mIGEgQXhpczIgc2VydmVyIHJ1bm5pbmcgaW4gYSBzZXJ2bGV0IGNvbnRhaW5lcikNCi00LiBVc2UgYW50IGdlbmVyYXRlLmNsaWVudCB0byBidWlsZCB0aGUgY2xpZW50Lg0KLTUuIFVzZSBhbnQgcnVuLmNsaWVudCAtRGZpbGUgImZpbGUgdG8gYmUgc2VudCIgLURkZXN0ICJkZXN0aW5hdGlvbiBmaWxlIG5hbWUiIHRvIHJ1biB0aGUgY2xpZW50Lg0KLQ0KLQ0KLU5vdGUNCi09PT09PT09PT09PT09PQ0KLVNvbWV0aW1lcywgaWYgeW91J3JlIGhhdmluZyB0cm91YmxlIHJ1bm5pbmcgdGhlIGNsaWVudCBzdWNjZXNzZnVsbHksIA0KLUl0IG1heSBiZSBuZWNlc3NhcnkgdG8gY2xlYW4gdGhlIHNlcnZpY2VzIHJlcG9zaXRvcnkgYmVmb3JlIHlvdSBnZW5lcmF0ZSB0aGUgc2VydmljZSwgZGVwbG95IGl0DQotYW5kIHJ1biB0aGUgY2xpZW50LiAoaS5lLiBkZWxldGUgc2VydmljZXMgY3JlYXRlZCBmcm9tIHByZXZpb3VzIHNhbXBsZXMuKQ0KLQ0KLUhlbHANCi09PT09DQotUGxlYXNlIGNvbnRhY3QgYXhpcy11c2VyIGxpc3QgKGF4aXMtdXNlckB3cy5hcGFjaGUub3JnKSBpZiB5b3UgaGF2ZSBhbnkgdHJvdWJsZSBydW5uaW5nIHRoZSBzYW1wbGUuDQotDQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9tdG9tL2J1aWxkLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvbXRvbS9idWlsZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDMxZjgzNWQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9tdG9tL2J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+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+Ci0JCTwvY29weT4KLQkJPGphciBkZXN0ZmlsZT0iJHtzZXJ2aWNlLmRpcn0vc2FtcGxlLW10b20uYWFyIj4KLQkJPGZpbGVzZXQgZXhjbHVkZXM9IioqL1Rlc3QuY2xhc3MiIGRpcj0iJHtzZXJ2aWNlLmRpcn0vY2xhc3NlcyIvPgotCQk8L2phcj4KLQk8L3RhcmdldD4KLQk8dGFyZ2V0IG5hbWU9ImNsZWFuIj4KLQkJPGRlbGV0ZSBkaXI9ImJ1aWxkIiAvPgotCTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9tdG9tL3Jlc291cmNlcy9NVE9NU2FtcGxlLndzZGwgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL210b20vcmVzb3VyY2VzL01UT01TYW1wbGUud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2IxMTk5ZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL210b20vcmVzb3VyY2VzL01UT01TYW1wbGUud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTx3c2RsOmRlZmluaXRpb25zIHhtbG5zOnRucz0iaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvbXRvbXNhbXBsZS8iCi0JeG1sbnM6bWltZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9taW1lLyIKLQl4bWxuczpodHRwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL2h0dHAvIgotCXhtbG5zOnNvYXAxMj0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwMTIvIgotCXhtbG5zOnhtaW1lPSJodHRwOi8vd3d3LnczLm9yZy8yMDA1LzA1L3htbG1pbWUiCi0JeG1sbnM6d3Nhdz0iaHR0cDovL3d3dy53My5vcmcvMjAwNi8wNS9hZGRyZXNzaW5nL3dzZGwiCi0JeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLQl4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIgotCXhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIgotCXhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIKLQl0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL210b21zYW1wbGUvIj4KLQk8d3NkbDp0eXBlcz4KLQkJPHhzZDpzY2hlbWEgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIgotCQkJYXR0cmlidXRlRm9ybURlZmF1bHQ9InF1YWxpZmllZCIgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0JCQl0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL210b21zYW1wbGUvIj4KLQkJCTx4c2Q6aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3d3dy53My5vcmcvMjAwNS8wNS94bWxtaW1lIgotCQkJCXNjaGVtYUxvY2F0aW9uPSJ4bWltZS54c2QiIC8+Ci0JCQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkF0dGFjaG1lbnRUeXBlIj4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJmaWxlTmFtZSIKLQkJCQkJCXR5cGU9InhzZDpzdHJpbmciIC8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImJpbmFyeURhdGEiCi0JCQkJCQl0eXBlPSJ4bWltZTpiYXNlNjRCaW5hcnkiIC8+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpjb21wbGV4VHlwZT4KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJBdHRhY2htZW50UmVxdWVzdCIgdHlwZT0idG5zOkF0dGFjaG1lbnRUeXBlIiAvPgotCQkJPHhzZDplbGVtZW50IG5hbWU9IkF0dGFjaG1lbnRSZXNwb25zZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLQkJPC94c2Q6c2NoZW1hPgotCTwvd3NkbDp0eXBlcz4KLQk8d3NkbDptZXNzYWdlIG5hbWU9IkF0dGFjaG1lbnRSZXF1ZXN0Ij4KLQkJPHdzZGw6cGFydCBuYW1lPSJwYXJ0MSIgZWxlbWVudD0idG5zOkF0dGFjaG1lbnRSZXF1ZXN0IiAvPgotCTwvd3NkbDptZXNzYWdlPgotCTx3c2RsOm1lc3NhZ2UgbmFtZT0iQXR0YWNobWVudFJlc3BvbnNlIj4KLQkJPHdzZGw6cGFydCBuYW1lPSJwYXJ0MSIgZWxlbWVudD0idG5zOkF0dGFjaG1lbnRSZXNwb25zZSIgLz4KLQk8L3dzZGw6bWVzc2FnZT4KLQk8d3NkbDpwb3J0VHlwZSBuYW1lPSJNVE9NU2VydmljZVBvcnRUeXBlIj4KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImF0dGFjaG1lbnQiPgotCQkJPHdzZGw6aW5wdXQgbWVzc2FnZT0idG5zOkF0dGFjaG1lbnRSZXF1ZXN0IgotCQkJCXdzYXc6QWN0aW9uPSJhdHRhY2htZW50IiAvPgotCQkJPHdzZGw6b3V0cHV0IG1lc3NhZ2U9InRuczpBdHRhY2htZW50UmVzcG9uc2UiCi0JCQkJd3NhdzpBY3Rpb249Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvTVRPTVNlcnZpY2VQb3J0VHlwZS9BdHRhY2htZW50UmVzcG9uc2UiIC8+Ci0JCTwvd3NkbDpvcGVyYXRpb24+Ci0JPC93c2RsOnBvcnRUeXBlPgotCTx3c2RsOmJpbmRpbmcgbmFtZT0iTVRPTVNlcnZpY2VTT0FQMTFCaW5kaW5nIgotCQl0eXBlPSJ0bnM6TVRPTVNlcnZpY2VQb3J0VHlwZSI+Ci0JCTxzb2FwOmJpbmRpbmcgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiCi0JCQlzdHlsZT0iZG9jdW1lbnQiIC8+Ci0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJhdHRhY2htZW50Ij4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJhdHRhY2htZW50IiBzdHlsZT0iZG9jdW1lbnQiIC8+Ci0JCQk8d3NkbDppbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvd3NkbDppbnB1dD4KLQkJCTx3c2RsOm91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvd3NkbDpvdXRwdXQ+Ci0JCTwvd3NkbDpvcGVyYXRpb24+Ci0JPC93c2RsOmJpbmRpbmc+Ci0JPHdzZGw6YmluZGluZyBuYW1lPSJNVE9NU2VydmljZVNPQVAxMkJpbmRpbmciCi0JCXR5cGU9InRuczpNVE9NU2VydmljZVBvcnRUeXBlIj4KLQkJPHNvYXAxMjpiaW5kaW5nIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIgotCQkJc3R5bGU9ImRvY3VtZW50IiAvPgotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iYXR0YWNobWVudCI+Ci0JCQk8c29hcDEyOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJhdHRhY2htZW50IiBzdHlsZT0iZG9jdW1lbnQiIC8+Ci0JCQk8d3NkbDppbnB1dD4KLQkJCQk8c29hcDEyOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC93c2RsOmlucHV0PgotCQkJPHdzZGw6b3V0cHV0PgotCQkJCTxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L3dzZGw6b3V0cHV0PgotCQk8L3dzZGw6b3BlcmF0aW9uPgotCTwvd3NkbDpiaW5kaW5nPgotCTx3c2RsOnNlcnZpY2UgbmFtZT0iTVRPTVNhbXBsZSI+Ci0JCTx3c2RsOnBvcnQgbmFtZT0iTVRPTVNhbXBsZVNPQVAxMXBvcnRfaHR0cCIKLQkJCWJpbmRpbmc9InRuczpNVE9NU2VydmljZVNPQVAxMUJpbmRpbmciPgotCQkJPHNvYXA6YWRkcmVzcwotCQkJCWxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjgwODAvYXhpczIvc2VydmljZXMvTVRPTVNhbXBsZSIgLz4KLQkJPC93c2RsOnBvcnQ+Ci0JCTx3c2RsOnBvcnQgbmFtZT0iTVRPTVNhbXBsZVNPQVAxMnBvcnRfaHR0cCIKLQkJCWJpbmRpbmc9InRuczpNVE9NU2VydmljZVNPQVAxMkJpbmRpbmciPgotCQkJPHNvYXAxMjphZGRyZXNzCi0JCQkJbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9heGlzMi9zZXJ2aWNlcy9NVE9NU2FtcGxlIiAvPgotCQk8L3dzZGw6cG9ydD4KLQk8L3dzZGw6c2VydmljZT4KLTwvd3NkbDpkZWZpbml0aW9ucz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL210b20vcmVzb3VyY2VzL3htaW1lLnhzZCBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvbXRvbS9yZXNvdXJjZXMveG1pbWUueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2MjYwODEwLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvbXRvbS9yZXNvdXJjZXMveG1pbWUueHNkCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHhzOnNjaGVtYSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0JeG1sbnM6eG1pbWU9Imh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDUveG1sbWltZSIKLQl0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDUveG1sbWltZSI+Ci0JPHhzOmF0dHJpYnV0ZSBuYW1lPSJjb250ZW50VHlwZSI+Ci0JCTx4czpzaW1wbGVUeXBlPgotCQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQkJPHhzOm1pbkxlbmd0aCB2YWx1ZT0iMyIgLz4KLQkJCTwveHM6cmVzdHJpY3Rpb24+Ci0JCTwveHM6c2ltcGxlVHlwZT4KLQk8L3hzOmF0dHJpYnV0ZT4KLQk8eHM6YXR0cmlidXRlIG5hbWU9ImV4cGVjdGVkQ29udGVudFR5cGVzIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImJhc2U2NEJpbmFyeSI+Ci0JCTx4czpzaW1wbGVDb250ZW50PgotCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpiYXNlNjRCaW5hcnkiPgotCQkJCTx4czphdHRyaWJ1dGUgcmVmPSJ4bWltZTpjb250ZW50VHlwZSIgLz4KLQkJCTwveHM6ZXh0ZW5zaW9uPgotCQk8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0JPC94czpjb21wbGV4VHlwZT4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iaGV4QmluYXJ5Ij4KLQkJPHhzOnNpbXBsZUNvbnRlbnQ+Ci0JCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmhleEJpbmFyeSI+Ci0JCQkJPHhzOmF0dHJpYnV0ZSByZWY9InhtaW1lOmNvbnRlbnRUeXBlIiAvPgotCQkJPC94czpleHRlbnNpb24+Ci0JCTwveHM6c2ltcGxlQ29udGVudD4KLQk8L3hzOmNvbXBsZXhUeXBlPgotPC94czpzY2hlbWE+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL210b20vc3JjL3NhbXBsZS9tdG9tL2NsaWVudC9DbGllbnQuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvbXRvbS9zcmMvc2FtcGxlL210b20vY2xpZW50L0NsaWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiZTZlZTZkLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvbXRvbS9zcmMvc2FtcGxlL210b20vY2xpZW50L0NsaWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugc2FtcGxlLm10b20uY2xpZW50OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgamF2YXguYWN0aXZhdGlvbi5EYXRhSGFuZGxlcjsKLWltcG9ydCBqYXZheC5hY3RpdmF0aW9uLkZpbGVEYXRhU291cmNlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLkNvbW1hbmRMaW5lT3B0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5Db21tYW5kTGluZU9wdGlvblBhcnNlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuT3B0aW9uc1ZhbGlkYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmF4aXMyLm10b21zYW1wbGUuTVRPTVNhbXBsZU1UT01TYW1wbGVTT0FQMTFQb3J0X2h0dHBTdHViOwotCi0KLXB1YmxpYyBjbGFzcyBDbGllbnQgewotCi0JLyoqCi0JICogQHBhcmFtIGFyZ3MKLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotCQlDb21tYW5kTGluZU9wdGlvblBhcnNlciBvcHRpb25zUGFyc2VyID0gbmV3IENvbW1hbmRMaW5lT3B0aW9uUGFyc2VyKAotCQkJCWFyZ3MpOwotCQlMaXN0IGludmFsaWRPcHRpb25zTGlzdCA9IG9wdGlvbnNQYXJzZXIKLQkJCQkuZ2V0SW52YWxpZE9wdGlvbnMobmV3IE9wdGlvbnNWYWxpZGF0b3IoKSB7Ci0JCQkJCXB1YmxpYyBib29sZWFuIGlzSW52YWxpZChDb21tYW5kTGluZU9wdGlvbiBvcHRpb24pIHsKLQkJCQkJCVN0cmluZyBvcHRpb25UeXBlID0gb3B0aW9uLmdldE9wdGlvblR5cGUoKTsKLQkJCQkJCXJldHVybiAhKCJkZXN0Ii5lcXVhbHNJZ25vcmVDYXNlKG9wdGlvblR5cGUpIHx8ICJmaWxlIgotCQkJCQkJCQkuZXF1YWxzSWdub3JlQ2FzZShvcHRpb25UeXBlKSk7Ci0JCQkJCX0KLQkJCQl9KTsKLQotCQlpZiAoKGludmFsaWRPcHRpb25zTGlzdC5zaXplKCkgPiAwKSB8fCAoYXJncy5sZW5ndGggIT0gNCkpIHsKLQkJCS8vIHByaW50VXNhZ2UoKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiSW52YWxpZCBQYXJhbWV0ZXJzLiIpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJTWFwIG9wdGlvbnNNYXAgPSBvcHRpb25zUGFyc2VyLmdldEFsbE9wdGlvbnMoKTsKLQotCQlDb21tYW5kTGluZU9wdGlvbiBmaWxlT3B0aW9uID0gKENvbW1hbmRMaW5lT3B0aW9uKSBvcHRpb25zTWFwCi0JCQkJLmdldCgiZmlsZSIpOwotCQlDb21tYW5kTGluZU9wdGlvbiBkZXN0aW5hdGlvbk9wdGlvbiA9IChDb21tYW5kTGluZU9wdGlvbikgb3B0aW9uc01hcAotCQkJCS5nZXQoImRlc3QiKTsKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoZmlsZU9wdGlvbi5nZXRPcHRpb25WYWx1ZSgpKTsKLQkJaWYgKGZpbGUuZXhpc3RzKCkpCi0JCQl0cmFuc2ZlckZpbGUoZmlsZSwgZGVzdGluYXRpb25PcHRpb24uZ2V0T3B0aW9uVmFsdWUoKSk7Ci0JCWVsc2UKLQkJCXRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhbnNmZXJGaWxlKEZpbGUgZmlsZSwgU3RyaW5nIGRlc3RpbmF0aW9uKQotCQkJdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7Ci0JCS8vIHVuY29tbWVudCB0aGUgZm9sbG93aW5nIGlmIHlvdSBuZWVkIHRvIGNhcHR1cmUgdGhlIG1lc3NhZ2VzIGZyb20KLQkJLy8gVENQTU9OLiBQbGVhc2UgbG9vayBhdCBodHRwOi8vd3MuYXBhY2hlLm9yZy9jb21tb25zL3RjcG1vbi90Y3Btb250dXRvcmlhbC5odG1sCi0JCS8vIHRvIGxlYXJuIGhvdyB0byBzZXR1cCB0Y3Btb24KLQkJTVRPTVNhbXBsZU1UT01TYW1wbGVTT0FQMTFQb3J0X2h0dHBTdHViIHNlcnZpY2VTdHViID0gbmV3IE1UT01TYW1wbGVNVE9NU2FtcGxlU09BUDExUG9ydF9odHRwU3R1YigKLQkJCQkvLyJodHRwOi8vbG9jYWxob3N0OjgwODEvYXhpczIvcmVzdC9NVE9NU2FtcGxlIgotCQkpOwotCi0JCS8vIEVuYWJsZSBNVE9NIGluIHRoZSBjbGllbnQgc2lkZQotCQlzZXJ2aWNlU3R1Yi5fZ2V0U2VydmljZUNsaWVudCgpLmdldE9wdGlvbnMoKS5zZXRQcm9wZXJ0eSgKLQkJCQlDb25zdGFudHMuQ29uZmlndXJhdGlvbi5FTkFCTEVfTVRPTSwgQ29uc3RhbnRzLlZBTFVFX1RSVUUpOwotCQkvL0luY3JlYXNlIHRoZSB0aW1lIG91dCB3aGVuIHNlbmRpbmcgbGFyZ2UgYXR0YWNobWVudHMKLQkJc2VydmljZVN0dWIuX2dldFNlcnZpY2VDbGllbnQoKS5nZXRPcHRpb25zKCkuc2V0VGltZU91dEluTWlsbGlTZWNvbmRzKDEwMDAwKTsKLQotCQkvLyBVbmNvbW1lbnQgYW5kIGZpbGwgdGhlIGZvbGxvd2luZyBpZiB5b3Ugd2FudCB0byBoYXZlIGNsaWVudCBzaWRlIGZpbGUKLQkJLy8gY2FjaGluZyBzd2l0Y2hlZCBPTi4KLQkJLyoKLQkJICogc2VydmljZVN0dWIuX2dldFNlcnZpY2VDbGllbnQoKS5nZXRPcHRpb25zKCkuc2V0UHJvcGVydHkoCi0JCSAqIENvbnN0YW50cy5Db25maWd1cmF0aW9uLkNBQ0hFX0FUVEFDSE1FTlRTLCBDb25zdGFudHMuVkFMVUVfVFJVRSk7Ci0JCSAqIHNlcnZpY2VTdHViLl9nZXRTZXJ2aWNlQ2xpZW50KCkuZ2V0T3B0aW9ucygpLnNldFByb3BlcnR5KAotCQkgKiBDb25zdGFudHMuQ29uZmlndXJhdGlvbi5BVFRBQ0hNRU5UX1RFTVBfRElSLCAieW91ciB0ZW1wIGRpciIpOwotCQkgKiBzZXJ2aWNlU3R1Yi5fZ2V0U2VydmljZUNsaWVudCgpLmdldE9wdGlvbnMoKS5zZXRQcm9wZXJ0eSgKLQkJICogQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uRklMRV9TSVpFX1RIUkVTSE9MRCwgIjQwMDAiKTsKLQkJICovCi0KLQkJLy8gUG9wdWxhdGluZyB0aGUgY29kZSBnZW5lcmF0ZWQgYmVhbnMKLQkJTVRPTVNhbXBsZU1UT01TYW1wbGVTT0FQMTFQb3J0X2h0dHBTdHViLkF0dGFjaG1lbnRSZXF1ZXN0IGF0dGFjaG1lbnRSZXF1ZXN0ID0gbmV3IE1UT01TYW1wbGVNVE9NU2FtcGxlU09BUDExUG9ydF9odHRwU3R1Yi5BdHRhY2htZW50UmVxdWVzdCgpOwotCQlNVE9NU2FtcGxlTVRPTVNhbXBsZVNPQVAxMVBvcnRfaHR0cFN0dWIuQXR0YWNobWVudFR5cGUgYXR0YWNobWVudFR5cGUgPSBuZXcgTVRPTVNhbXBsZU1UT01TYW1wbGVTT0FQMTFQb3J0X2h0dHBTdHViLkF0dGFjaG1lbnRUeXBlKCk7Ci0JCU1UT01TYW1wbGVNVE9NU2FtcGxlU09BUDExUG9ydF9odHRwU3R1Yi5CYXNlNjRCaW5hcnkgYmFzZTY0QmluYXJ5ID0gbmV3IE1UT01TYW1wbGVNVE9NU2FtcGxlU09BUDExUG9ydF9odHRwU3R1Yi5CYXNlNjRCaW5hcnkoKTsKLQotCQkvLyBDcmVhdGluZyBhIGphdmF4LmFjdGl2YXRpb24uRmlsZURhdGFTb3VyY2UgZnJvbSB0aGUgaW5wdXQgZmlsZS4KLQkJRmlsZURhdGFTb3VyY2UgZmlsZURhdGFTb3VyY2UgPSBuZXcgRmlsZURhdGFTb3VyY2UoZmlsZSk7Ci0KLQkJLy8gQ3JlYXRlIGEgZGF0YUhhbmRsZXIgdXNpbmcgdGhlIGZpbGVEYXRhU291cmNlLiBBbnkgaW1wbGVtZW50YXRpb24gb2YKLQkJLy8gamF2YXguYWN0aXZhdGlvbi5EYXRhU291cmNlIGludGVyZmFjZSBjYW4gZml0IGhlcmUuCi0JCURhdGFIYW5kbGVyIGRhdGFIYW5kbGVyID0gbmV3IERhdGFIYW5kbGVyKGZpbGVEYXRhU291cmNlKTsKLQkJYmFzZTY0QmluYXJ5LnNldEJhc2U2NEJpbmFyeShkYXRhSGFuZGxlcik7Ci0gICAgICAgIE1UT01TYW1wbGVNVE9NU2FtcGxlU09BUDExUG9ydF9odHRwU3R1Yi5Db250ZW50VHlwZV90eXBlMCBwYXJhbSA9IG5ldyBNVE9NU2FtcGxlTVRPTVNhbXBsZVNPQVAxMVBvcnRfaHR0cFN0dWIuQ29udGVudFR5cGVfdHlwZTAoKTsKLSAgICAgICAgcGFyYW0uc2V0Q29udGVudFR5cGVfdHlwZTAoZGF0YUhhbmRsZXIuZ2V0Q29udGVudFR5cGUoKSk7Ci0gICAgICAgIGJhc2U2NEJpbmFyeS5zZXRDb250ZW50VHlwZShwYXJhbSk7Ci0JCWF0dGFjaG1lbnRUeXBlLnNldEJpbmFyeURhdGEoYmFzZTY0QmluYXJ5KTsKLQkJYXR0YWNobWVudFR5cGUuc2V0RmlsZU5hbWUoZGVzdGluYXRpb24pOwotCQlhdHRhY2htZW50UmVxdWVzdC5zZXRBdHRhY2htZW50UmVxdWVzdChhdHRhY2htZW50VHlwZSk7Ci0KLQkJTVRPTVNhbXBsZU1UT01TYW1wbGVTT0FQMTFQb3J0X2h0dHBTdHViLkF0dGFjaG1lbnRSZXNwb25zZSByZXNwb25zZSA9IHNlcnZpY2VTdHViLmF0dGFjaG1lbnQoYXR0YWNobWVudFJlcXVlc3QpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4ocmVzcG9uc2UuZ2V0QXR0YWNobWVudFJlc3BvbnNlKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9tdG9tL3NyYy9zYW1wbGUvbXRvbS9zZXJ2aWNlL01UT01TYW1wbGVTa2VsZXRvbi5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9tdG9tL3NyYy9zYW1wbGUvbXRvbS9zZXJ2aWNlL01UT01TYW1wbGVTa2VsZXRvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyYWZiMzM3Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvbXRvbS9zcmMvc2FtcGxlL210b20vc2VydmljZS9NVE9NU2FtcGxlU2tlbGV0b24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIHNhbXBsZS5tdG9tLnNlcnZpY2U7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotCi1pbXBvcnQgamF2YXguYWN0aXZhdGlvbi5EYXRhSGFuZGxlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUud3MuYXhpczIubXRvbXNhbXBsZS5BdHRhY2htZW50UmVzcG9uc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5heGlzMi5tdG9tc2FtcGxlLkF0dGFjaG1lbnRUeXBlOwotaW1wb3J0IG9yZy53My53d3cuXzIwMDUuXzA1LnhtbG1pbWUuQmFzZTY0QmluYXJ5OwotCi0vKioKLSAqIE1UT01TZXJ2aWNlU2tlbGV0b24gamF2YSBza2VsZXRvbiBmb3IgdGhlIGF4aXNTZXJ2aWNlCi0gKi8KLXB1YmxpYyBjbGFzcyBNVE9NU2FtcGxlU2tlbGV0b24gewotCi0JLyoqCi0JICogQXV0byBnZW5lcmF0ZWQgbWV0aG9kIHNpZ25hdHVyZQotCSAqIAotCSAqIEBwYXJhbSBwYXJhbTAKLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbiAKLQkgKiAKLQkgKi8KLQlwdWJsaWMgb3JnLmFwYWNoZS53cy5heGlzMi5tdG9tc2FtcGxlLkF0dGFjaG1lbnRSZXNwb25zZSBhdHRhY2htZW50KAotCQkJb3JnLmFwYWNoZS53cy5heGlzMi5tdG9tc2FtcGxlLkF0dGFjaG1lbnRSZXF1ZXN0IHBhcmFtMCkKLQkJCXRocm93cyBFeGNlcHRpb24KLQotCXsKLQkJQXR0YWNobWVudFR5cGUgYXR0YWNobWVudFJlcXVlc3QgPSBwYXJhbTAuZ2V0QXR0YWNobWVudFJlcXVlc3QoKTsKLQkJQmFzZTY0QmluYXJ5IGJpbmFyeURhdGEgPSBhdHRhY2htZW50UmVxdWVzdC5nZXRCaW5hcnlEYXRhKCk7Ci0JCURhdGFIYW5kbGVyIGRhdGFIYW5kbGVyID0gYmluYXJ5RGF0YS5nZXRCYXNlNjRCaW5hcnkoKTsKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoCi0JCQkJYXR0YWNobWVudFJlcXVlc3QuZ2V0RmlsZU5hbWUoKSk7Ci0JCUZpbGVPdXRwdXRTdHJlYW0gZmlsZU91dHB1dFN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUpOwotCQlkYXRhSGFuZGxlci53cml0ZVRvKGZpbGVPdXRwdXRTdHJlYW0pOwotCQlmaWxlT3V0cHV0U3RyZWFtLmZsdXNoKCk7Ci0JCWZpbGVPdXRwdXRTdHJlYW0uY2xvc2UoKTsKLQkJCi0JCUF0dGFjaG1lbnRSZXNwb25zZSByZXNwb25zZSA9IG5ldyBBdHRhY2htZW50UmVzcG9uc2UoKTsKLQkJcmVzcG9uc2Uuc2V0QXR0YWNobWVudFJlc3BvbnNlKCJGaWxlIHNhdmVkIHN1Y2Nlc2Z1bGx5LiIpOwotCQlyZXR1cm4gcmVzcG9uc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3BpbmcvUkVBRE1FLnR4dCBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvcGluZy9SRUFETUUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGM1MWJkLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvcGluZy9SRUFETUUudHh0CisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotU2FtcGxlIC0gUGluZ2luZyB0aGUgc2VydmljZSBkZXBsb3llZCBpbiBBeGlzMgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUludHJvZHVjdGlvbgotPT09PT09PT09PT09Ci0KLUluIHRoaXMgc2FtcGxlLCB3ZSBhcmUgZGVwbG95aW5nIGFuIEFYSU9NIGJhc2VkIHNlcnZpY2UgYWZ0ZXIgd3JpdGluZwotYSBzZXJ2aWNlcy54bWwgYW5kIGNyZWF0aW5nIGFuIGFhci4gV2UgYWxzbyB0ZXN0IHN1Y2Nlc3NmdWwKLWRlcGxveW1lbnQgdXNpbmcgYW4gQVhJT00gYmFzZWQgY2xpZW50IHdoaWNoIHNlbmQgc2V2ZXJhbCBwaW5nIHJlcXVlc3RzLgotVGhlIGNsaWVudCBzZW5kcyBzZXZlcmFsIHBpbmcgcmVxdWVzdHMsIGluY2x1ZGluZyBzZXJ2aWNlIGxldmVsIHJlcXVlc3RzLgotCi0KLVByZS1SZXF1aXNpdGVzCi09PT09PT09PT09PT09PQotCi1BcGFjaGUgQW50IDEuNi4yIG9yIGxhdGVyCi0KLUJ1aWxkaW5nIHRoZSBTZXJ2aWNlCi09PT09PT09PT09PT09PT09PT09PQotCi1UeXBlICJhbnQgZ2VuZXJhdGUuc2VydmljZSIgZnJvbSBBWElTMl9IT01FL3NhbXBsZXMvcGluZyBkaXJlY3RvcnksCi10byBnZW5lcmF0ZSB0aGUgc2VydmljZSBhbmQgZGVwbG95IGl0IGludG8gCi1BWElTMl9IT01FL3JlcG9zaXRvcnkvc2VydmljZXMKLQotCi1SdW5uaW5nIHRoZSBDbGllbnQKLT09PT09PT09PT09PT09PT09PQotCi1UeXBlIGFudCBydW4uY2xpZW50IGluIHRoZSBBeGlzMl9IT01FL3NhbXBsZXMvcGluZyBkaXJlY3RvcnkKLQotTm90ZQotPT09PQotU29tZXRpbWVzLCBpZiB5b3UncmUgaGF2aW5nIHRyb3VibGUgcnVubmluZyB0aGUgY2xpZW50IHN1Y2Nlc3NmdWxseSwgCi1JdCBtYXkgYmUgbmVjZXNzYXJ5IHRvIGNsZWFuIHRoZSBzZXJ2aWNlcyByZXBvc2l0b3J5IGJlZm9yZSB5b3UgZ2VuZXJhdGUgdGhlIHNlcnZpY2UsIGRlcGxveSBpdAotYW5kIHJ1biB0aGUgY2xpZW50LiAoaS5lLiBkZWxldGUgc2VydmljZXMgY3JlYXRlZCBmcm9tIHByZXZpb3VzIHNhbXBsZXMuKQotCi0KLUhlbHAKLT09PT0KLVBsZWFzZSBjb250YWN0IGF4aXMtdXNlciBsaXN0IChheGlzLXVzZXJAd3MuYXBhY2hlLm9yZykgaWYgeW91IGhhdmUKLWFueSB0cm91YmxlIHJ1bm5pbmcgdGhlIHNhbXBsZS4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3BpbmcvYnVpbGQueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9waW5nL2J1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc4OGY3ZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3BpbmcvYnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08cHJvamVjdCBuYW1lPSJwaW5nIiBiYXNlZGlyPSIuIiBkZWZhdWx0PSJnZW5lcmF0ZS5zZXJ2aWNlIj4KLQotICAgIDxwcm9wZXJ0eSBlbnZpcm9ubWVudD0iZW52Ii8+Ci0gICAgPHByb3BlcnR5IG5hbWU9IkFYSVMyX0hPTUUiIHZhbHVlPSIuLi8uLi8iLz4KLQotICAgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC5kaXIiIHZhbHVlPSJidWlsZCIvPgotCi0gICAgPHBhdGggaWQ9ImF4aXMyLmNsYXNzcGF0aCI+Ci0gICAgICAgIDxmaWxlc2V0IGRpcj0iJHtBWElTMl9IT01FfS9saWIiPgotICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKi5qYXIiLz4KLSAgICAgICAgPC9maWxlc2V0PgotICAgIDwvcGF0aD4KLQk8cGF0aCBpZD0iY2xpZW50LmNsYXNzLnBhdGgiPgotCQk8ZmlsZXNldCBkaXI9IiR7QVhJUzJfSE9NRX0vbGliIj4KLQkJCTxpbmNsdWRlIG5hbWU9IiouamFyIiAvPgotCQk8L2ZpbGVzZXQ+Ci0JCTxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtidWlsZC5kaXJ9L2NsYXNzZXMiIC8+Ci0JPC9wYXRoPgotCi0gICAgPHRhcmdldCBuYW1lPSJjb21waWxlIj4KLSAgICAgICAgPG1rZGlyIGRpcj0iJHtidWlsZC5kaXJ9Ii8+Ci0gICAgICAgIDxta2RpciBkaXI9IiR7YnVpbGQuZGlyfS9jbGFzc2VzIi8+Ci0KLSAgICAgICAgPCEtLUZpcnN0IGxldCdzIGNvbXBpbGUgdGhlIGNsYXNzZXMtLT4KLSAgICAgICAgPGphdmFjIGRlYnVnPSJvbiIKLSAgICAgICAgICAgICAgIGZvcms9InRydWUiCi0gICAgICAgICAgICAgICBkZXN0ZGlyPSIke2J1aWxkLmRpcn0vY2xhc3NlcyIKLSAgICAgICAgICAgICAgIHNyY2Rpcj0iJHtiYXNlZGlyfS9zcmMiCi0gICAgICAgICAgICAgICBjbGFzc3BhdGhyZWY9ImF4aXMyLmNsYXNzcGF0aCI+Ci0gICAgICAgIDwvamF2YWM+Ci0gICAgPC90YXJnZXQ+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9ImdlbmVyYXRlLnNlcnZpY2UiIGRlcGVuZHM9ImNvbXBpbGUiPgotICAgICAgICA8IS0tYWFyIHRoZW0gdXAgLS0+Ci0gICAgICAgIDxjb3B5IHRvRGlyPSIke2J1aWxkLmRpcn0vY2xhc3NlcyIgZmFpbG9uZXJyb3I9ImZhbHNlIj4KLSAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtiYXNlZGlyfS9yZXNvdXJjZXMiPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoueG1sIi8+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi53c2RsIi8+Ci0gICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgIDwvY29weT4KLSAgICAgICAgPGphciBkZXN0ZmlsZT0iJHtidWlsZC5kaXJ9L1NhbXBsZVBpbmdTZXJ2aWNlLmFhciI+Ci0gICAgICAgICAgICA8ZmlsZXNldCBleGNsdWRlcz0iKiovVGVzdC5jbGFzcyIgZGlyPSIke2J1aWxkLmRpcn0vY2xhc3NlcyIvPgotICAgICAgICA8L2phcj4KLQkJPGNvcHkgZmlsZT0iJHtidWlsZC5kaXJ9L1NhbXBsZVBpbmdTZXJ2aWNlLmFhciIgZGVzdGZpbGU9Ii4uLy4uL3JlcG9zaXRvcnkvc2VydmljZXMiIC8+Ci0gICAgPC90YXJnZXQ+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9InJ1bi5jbGllbnQiIGRlcGVuZHM9ImNvbXBpbGUiPgotICAgICAgICA8amF2YSBjbGFzc25hbWU9InNhbXBsZXMucGluZy5jbGllbnQuUGluZ0NsaWVudCI+Ci0gICAgICAgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJjbGllbnQuY2xhc3MucGF0aCIgLz4KLSAgICAgICAgPC9qYXZhPgotICAgIDwvdGFyZ2V0PgotCi0gICAgPHRhcmdldCBuYW1lPSJjbGVhbiI+Ci0gICAgICAgIDxkZWxldGUgZGlyPSIke2J1aWxkLmRpcn0iLz4KLSAgICA8L3RhcmdldD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvcGluZy9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9waW5nL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiNDAwNjMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9waW5nL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzZXJ2aWNlIG5hbWU9IlNhbXBsZVBpbmdTZXJ2aWNlIiBzY29wZT0iYXBwbGljYXRpb24iPgotICAgIDxkZXNjcmlwdGlvbj5QaW5nIFNlcnZpY2U8L2Rlc2NyaXB0aW9uPgotICAgIDxtb2R1bGUgcmVmPSJwaW5nIi8+Ci0KLSAgICA8b3BlcmF0aW9uIG5hbWU9ImdldFByaWNlIj4KLSAgICAgICAgPG1lc3NhZ2VSZWNlaXZlciBtZXA9Imh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgvd3NkbC9pbi1vbmx5IiBjbGFzcz0ic2FtcGxlcy5waW5nLnJlY2VpdmVycy5SYXdYTUxJTk91dE1lc3NhZ2VSZWNlaXZlciIvPgotICAgIDwvb3BlcmF0aW9uPgotCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJ1cGRhdGUiPgotICAgICAgICA8bWVzc2FnZVJlY2VpdmVyIG1lcD0iaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC93c2RsL2luLW91dCIgY2xhc3M9InNhbXBsZXMucGluZy5yZWNlaXZlcnMuUmF3WE1MSU5Pbmx5TWVzc2FnZVJlY2VpdmVyIi8+Ci0gICAgPC9vcGVyYXRpb24+Ci0gICAgCi0gICAgPHBhcmFtZXRlciBuYW1lPSJTZXJ2aWNlQ2xhc3MiPnNhbXBsZXMucGluZy5zZXJ2aWNlLlBpbmdTZXJ2aWNlPC9wYXJhbWV0ZXI+Ci08L3NlcnZpY2U+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9waW5nL3NyYy9zYW1wbGVzL3BpbmcvY2xpZW50L1BpbmdDbGllbnQuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvcGluZy9zcmMvc2FtcGxlcy9waW5nL2NsaWVudC9QaW5nQ2xpZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MmJiZTEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9waW5nL3NyYy9zYW1wbGVzL3BpbmcvY2xpZW50L1BpbmdDbGllbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIHNhbXBsZXMucGluZy5jbGllbnQ7Ci0KLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuT3B0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5TZXJ2aWNlQ2xpZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgUGluZ0NsaWVudCB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgRW5kcG9pbnRSZWZlcmVuY2UgdGFyZ2V0RVBSID0KLSAgICAgICAgICAgIG5ldyBFbmRwb2ludFJlZmVyZW5jZSgKLSAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9heGlzMi9zZXJ2aWNlcy9TYW1wbGVQaW5nU2VydmljZSIpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBJTkdfUkVRVUVTVCA9ICJwaW5nUmVxdWVzdCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBJTkdfT1BFUkFUSU9OID0gIm9wZXJhdGlvbiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBJTkdfU09BUEFDVElPTiA9ICJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi9tb2R1bGVzL3BpbmciOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQSU5HX05BTUVTUEFDRSA9ICJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi9tb2R1bGVzL3BpbmcveHNkIjsKLQotICAgIHB1YmxpYyBQaW5nQ2xpZW50KCkgewotCi0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPTUVsZW1lbnQgZ2V0UGluZ1JlcXVlc3QxKFN0cmluZyBbXSBvcGVyYXRpb25MaXN0KSB7Ci0gICAgICAgIE9NRmFjdG9yeSBmYWMgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKTsKLSAgICAgICAgT01OYW1lc3BhY2Ugb21OcyA9IGZhYy5jcmVhdGVPTU5hbWVzcGFjZShQSU5HX05BTUVTUEFDRSwgInRucyIpOwotCi0gICAgICAgIE9NRWxlbWVudCBwaW5nUmVxdWVzdCA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoUElOR19SRVFVRVNULCBvbU5zKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG9wZXJhdGlvbkxpc3QubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBvcGVyYXRpb24gPSBmYWMuY3JlYXRlT01FbGVtZW50KFBJTkdfT1BFUkFUSU9OLCBvbU5zKTsKLSAgICAgICAgICAgIG9wZXJhdGlvbi5hZGRDaGlsZChmYWMuY3JlYXRlT01UZXh0KG9wZXJhdGlvbkxpc3RbaV0pKTsKLSAgICAgICAgICAgIHBpbmdSZXF1ZXN0LmFkZENoaWxkKG9wZXJhdGlvbik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHBpbmdSZXF1ZXN0OwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT01FbGVtZW50IGdldFBpbmdSZXF1ZXN0NCgpIHsKLSAgICAgICAgT01GYWN0b3J5IGZhYyA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpOwotICAgICAgICBPTU5hbWVzcGFjZSBvbU5zID0gZmFjLmNyZWF0ZU9NTmFtZXNwYWNlKFBJTkdfTkFNRVNQQUNFLCAidG5zIik7Ci0KLSAgICAgICAgcmV0dXJuIGZhYy5jcmVhdGVPTUVsZW1lbnQoUElOR19SRVFVRVNULCBvbU5zKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2VuZFJlcXVlc3QoU2VydmljZUNsaWVudCBzZW5kZXIsIE9NRWxlbWVudCByZXF1ZXN0LCBTdHJpbmcgZGVzY3JpcHRpb24pIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlBpbmcgcmVxdWVzdCAtICIgKyBkZXNjcmlwdGlvbik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihyZXF1ZXN0LnRvU3RyaW5nKCkpOwotICAgICAgICBPTUVsZW1lbnQgcmVzdWx0ID0gc2VuZGVyLnNlbmRSZWNlaXZlKHJlcXVlc3QpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlBpbmcgcmVzcG9uc2UgIik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihyZXN1bHQudG9TdHJpbmcoKSk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9wdGlvbnMgb3B0aW9ucyA9IG5ldyBPcHRpb25zKCk7Ci0gICAgICAgICAgICBvcHRpb25zLnNldFRvKHRhcmdldEVQUik7Ci0gICAgICAgICAgICBvcHRpb25zLnNldFRyYW5zcG9ydEluUHJvdG9jb2woQ29uc3RhbnRzLlRSQU5TUE9SVF9IVFRQKTsKLSAgICAgICAgICAgIG9wdGlvbnMuc2V0QWN0aW9uKFBJTkdfU09BUEFDVElPTik7Ci0gICAgICAgICAKLQkgICAgU2VydmljZUNsaWVudCBzZW5kZXIgPSBuZXcgU2VydmljZUNsaWVudCgpOwotICAgICAgICAgICAgc2VuZGVyLnNldE9wdGlvbnMob3B0aW9ucyk7Ci0KLSAgICAgICAgICAgIE9NRWxlbWVudCBwaW5nUmVxdWVzdFBheWxvYWQ7Ci0KLSAgICAgICAgICAgIHBpbmdSZXF1ZXN0UGF5bG9hZCA9IGdldFBpbmdSZXF1ZXN0MShuZXcgU3RyaW5nW117ImdldFByaWNlIiwgInVwZGF0ZSJ9KTsKLSAgICAgICAgICAgIHNlbmRSZXF1ZXN0KHNlbmRlciwgcGluZ1JlcXVlc3RQYXlsb2FkLCAidHdvIG9wZXJhdGlvbnMgYXJlIHNwZWNpZmllZCIpOwotCi0gICAgICAgICAgICBwaW5nUmVxdWVzdFBheWxvYWQgPSBnZXRQaW5nUmVxdWVzdDEobmV3IFN0cmluZ1tdeyJnZXRQcmljZSJ9KTsKLSAgICAgICAgICAgIHNlbmRSZXF1ZXN0KHNlbmRlciwgcGluZ1JlcXVlc3RQYXlsb2FkLCAib25lIG9wZXJhdGlvbiBpcyBzcGVjaWZpZWQiKTsKLQotICAgICAgICAgICAgcGluZ1JlcXVlc3RQYXlsb2FkID0gZ2V0UGluZ1JlcXVlc3QxKG5ldyBTdHJpbmdbMF0pOwotICAgICAgICAgICAgc2VuZFJlcXVlc3Qoc2VuZGVyLCBwaW5nUmVxdWVzdFBheWxvYWQsICJTZXJ2aWNlIGxldmVsIik7Ci0KLSAgICAgICAgICAgIHBpbmdSZXF1ZXN0UGF5bG9hZCA9IGdldFBpbmdSZXF1ZXN0NCgpOwotICAgICAgICAgICAgc2VuZFJlcXVlc3Qoc2VuZGVyLCBwaW5nUmVxdWVzdFBheWxvYWQsIlNlcnZpY2UgbGV2ZWwiKTsKLQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvcGluZy9zcmMvc2FtcGxlcy9waW5nL3JlY2VpdmVycy9SYXdYTUxJTk9ubHlNZXNzYWdlUmVjZWl2ZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvcGluZy9zcmMvc2FtcGxlcy9waW5nL3JlY2VpdmVycy9SYXdYTUxJTk9ubHlNZXNzYWdlUmVjZWl2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFhOWM2NS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3Bpbmcvc3JjL3NhbXBsZXMvcGluZy9yZWNlaXZlcnMvUmF3WE1MSU5Pbmx5TWVzc2FnZVJlY2VpdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBzYW1wbGVzLnBpbmcucmVjZWl2ZXJzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuQWJzdHJhY3RJbk1lc3NhZ2VSZWNlaXZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLk1lc3NhZ2VSZWNlaXZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5QaW5nYWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmkxOG4uTWVzc2FnZXM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci0KLXB1YmxpYyBjbGFzcyBSYXdYTUxJTk9ubHlNZXNzYWdlUmVjZWl2ZXIgZXh0ZW5kcyBvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5SYXdYTUxJTk9ubHlNZXNzYWdlUmVjZWl2ZXIKLSAgICAgICAgaW1wbGVtZW50cyBNZXNzYWdlUmVjZWl2ZXIsIFBpbmdhYmxlIHsKLQotICAgIHB1YmxpYyBpbnQgcGluZygpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICAvLyBnZXQgdGhlIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciB0aGUgV2ViIFNlcnZpY2UKLSAgICAgICAgT2JqZWN0IG9iaiA9IGdldFRoZUltcGxlbWVudGF0aW9uT2JqZWN0KE1lc3NhZ2VDb250ZXh0LmdldEN1cnJlbnRNZXNzYWdlQ29udGV4dCgpKTsKLQotICAgICAgICBpZihvYmogaW5zdGFuY2VvZiBQaW5nYWJsZSl7Ci0gICAgICAgICAgICByZXR1cm4gKChQaW5nYWJsZSlvYmopLnBpbmcoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gUElOR19NUl9MRVZFTDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3Bpbmcvc3JjL3NhbXBsZXMvcGluZy9yZWNlaXZlcnMvUmF3WE1MSU5PdXRNZXNzYWdlUmVjZWl2ZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvcGluZy9zcmMvc2FtcGxlcy9waW5nL3JlY2VpdmVycy9SYXdYTUxJTk91dE1lc3NhZ2VSZWNlaXZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGFjMjJlLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvcGluZy9zcmMvc2FtcGxlcy9waW5nL3JlY2VpdmVycy9SYXdYTUxJTk91dE1lc3NhZ2VSZWNlaXZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBzYW1wbGVzLnBpbmcucmVjZWl2ZXJzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuQWJzdHJhY3RJbk91dFN5bmNNZXNzYWdlUmVjZWl2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuUmF3WE1MSU5Pbmx5TWVzc2FnZVJlY2VpdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLk1lc3NhZ2VSZWNlaXZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaTE4bi5NZXNzYWdlczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5QaW5nYWJsZTsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLQotcHVibGljIGNsYXNzIFJhd1hNTElOT3V0TWVzc2FnZVJlY2VpdmVyIGV4dGVuZHMgb3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuUmF3WE1MSU5PdXRNZXNzYWdlUmVjZWl2ZXIKLSAgICAgICAgaW1wbGVtZW50cyBNZXNzYWdlUmVjZWl2ZXIsIFBpbmdhYmxlIHsKLQotICAgIHB1YmxpYyBpbnQgcGluZygpIHRocm93cyBBeGlzRmF1bHR7Ci0gICAgICAgIC8vIGdldCB0aGUgaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIHRoZSBXZWIgU2VydmljZQotICAgICAgICBPYmplY3Qgb2JqID0gZ2V0VGhlSW1wbGVtZW50YXRpb25PYmplY3QoTWVzc2FnZUNvbnRleHQuZ2V0Q3VycmVudE1lc3NhZ2VDb250ZXh0KCkpOwotCi0gICAgICAgIGlmKG9iaiBpbnN0YW5jZW9mIFBpbmdhYmxlKXsKLSAgICAgICAgICAgIHJldHVybiAoKFBpbmdhYmxlKW9iaikucGluZygpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBQSU5HX01SX0xFVkVMOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvcGluZy9zcmMvc2FtcGxlcy9waW5nL3NlcnZpY2UvUGluZ1NlcnZpY2UuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvcGluZy9zcmMvc2FtcGxlcy9waW5nL3NlcnZpY2UvUGluZ1NlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ2NjJlNi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3Bpbmcvc3JjL3NhbXBsZXMvcGluZy9zZXJ2aWNlL1BpbmdTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIHNhbXBsZXMucGluZy5zZXJ2aWNlOwotCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01OYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLlBpbmdhYmxlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotcHVibGljIGNsYXNzIFBpbmdTZXJ2aWNlIGltcGxlbWVudHMgUGluZ2FibGUgewotCi0gICAgcHJpdmF0ZSBIYXNoTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICBwdWJsaWMgT01FbGVtZW50IGdldFByaWNlKE9NRWxlbWVudCBlbGVtZW50KSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgZWxlbWVudC5idWlsZCgpOwotICAgICAgICBlbGVtZW50LmRldGFjaCgpOwotCi0gICAgICAgIE9NRWxlbWVudCBzeW1ib2xFbGVtZW50ID0gZWxlbWVudC5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgICAgU3RyaW5nIHN5bWJvbCA9IHN5bWJvbEVsZW1lbnQuZ2V0VGV4dCgpOwotCi0gICAgICAgIFN0cmluZyByZXR1cm5UZXh0ID0gIjQyIjsKLSAgICAgICAgRG91YmxlIHByaWNlID0gKERvdWJsZSkgbWFwLmdldChzeW1ib2wpOwotICAgICAgICBpZiAocHJpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuVGV4dCA9ICIiICsgcHJpY2UuZG91YmxlVmFsdWUoKTsKLSAgICAgICAgfQotICAgICAgICBPTUZhY3RvcnkgZmFjID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCk7Ci0gICAgICAgIE9NTmFtZXNwYWNlIG9tTnMgPQotICAgICAgICAgICAgICAgIGZhYy5jcmVhdGVPTU5hbWVzcGFjZSgiaHR0cDovL3F1aWNrc3RhcnQuc2FtcGxlcy94c2QiLCAibnMiKTsKLSAgICAgICAgT01FbGVtZW50IG1ldGhvZCA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoImdldFByaWNlUmVzcG9uc2UiLCBvbU5zKTsKLSAgICAgICAgT01FbGVtZW50IHZhbHVlID0gZmFjLmNyZWF0ZU9NRWxlbWVudCgicmV0dXJuIiwgb21Ocyk7Ci0gICAgICAgIHZhbHVlLmFkZENoaWxkKGZhYy5jcmVhdGVPTVRleHQodmFsdWUsIHJldHVyblRleHQpKTsKLSAgICAgICAgbWV0aG9kLmFkZENoaWxkKHZhbHVlKTsKLSAgICAgICAgcmV0dXJuIG1ldGhvZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB1cGRhdGUoT01FbGVtZW50IGVsZW1lbnQpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBlbGVtZW50LmJ1aWxkKCk7Ci0gICAgICAgIGVsZW1lbnQuZGV0YWNoKCk7Ci0KLSAgICAgICAgT01FbGVtZW50IHN5bWJvbEVsZW1lbnQgPSBlbGVtZW50LmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgICBTdHJpbmcgc3ltYm9sID0gc3ltYm9sRWxlbWVudC5nZXRUZXh0KCk7Ci0KLSAgICAgICAgT01FbGVtZW50IHByaWNlRWxlbWVudCA9IChPTUVsZW1lbnQpIHN5bWJvbEVsZW1lbnQuZ2V0TmV4dE9NU2libGluZygpOwotICAgICAgICBTdHJpbmcgcHJpY2UgPSBwcmljZUVsZW1lbnQuZ2V0VGV4dCgpOwotCi0gICAgICAgIG1hcC5wdXQoc3ltYm9sLCBuZXcgRG91YmxlKHByaWNlKSk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBwaW5nKCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQgPSBNZXNzYWdlQ29udGV4dC5nZXRDdXJyZW50TWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgLy9vcGVyYXRpb24gbmFtZSB0byBjYW4gYmUgYWNjZXNzZWQgaW4gdGhpcyBtYW5uZXIKLSAgICAgICAgU3RyaW5nIG9wZXJhdGlvbk5hbWUgPSAoU3RyaW5nKW1zZ0NvbnRleHQuZ2V0UHJvcGVydHkoT1BFUkFUSU9OX1RPX1BJTkcpOwotCi0gICAgICAgIC8vSW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgZGVwZW5kcyBvbiB0aGUgcGFydGljdWxhciBzZXJ2aWNlCi0gICAgICAgIGlmKG9wZXJhdGlvbk5hbWUgIT0gbnVsbCAmJiBvcGVyYXRpb25OYW1lLmVxdWFscygiZ2V0UHJpY2UiKSl7Ci0gICAgICAgICAgICAvL0ZvciB0aGlzIHNhbXBsZQotICAgICAgICAgICAgcmV0dXJuIFBJTkdfU1VDQ0VTU0ZVTDsKLSAgICAgICAgfWVsc2UgaWYob3BlcmF0aW9uTmFtZSAhPSBudWxsICYmIG9wZXJhdGlvbk5hbWUuZXF1YWxzKCJ1cGRhdGUiKSl7Ci0gICAgICAgICAgICByZXR1cm4gUElOR19GQUlMRDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gUElOR19GQUlMRDsKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvcG9qby9SRUFETUUudHh0IGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9wb2pvL1JFQURNRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViNDEwYmUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9wb2pvL1JFQURNRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi1TYW1wbGU6IFBPSk8gKFBsYWluIE9sZCBKYXZhIE9iamVjdCkNCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0NCi1JbnRyb2R1Y3Rpb24NCi09PT09PT09PT09PT0NCi0NCi1UaGlzIGlzIGFuIGV4YW1wbGUgUE9KTyBXZWIgc2VydmljZS4gSXQgc2hvd3MgaG93IHRvIGV4cG9zZSB0aGUgbWV0aG9kcyBvZiBhIEphdmEgY2xhc3MgYXMgYSBXZWINCi1zZXJ2aWNlIHVzaW5nIEFpeHMyLg0KLQ0KLQ0KLVByZXJlcXVpc2l0ZXMgIA0KLT09PT09PT09PT09PT0NCi0NCi1UbyBidWlsZCB0aGUgc2FtcGxlIHNlcnZpY2UgeW91IG11c3QgaGF2ZSBhbnQtMS42LnggaW5zdGFsbGVkIGluIHlvdXIgc3lzdGVtLiANCi0NCi1UbyBzZXQgQVhJUzJfSE9NRSBpbiBVbml4L0xpbnV4IHR5cGU6DQotJGV4cG9ydCBBWElTMl9IT01FPTxwYXRoIHRvIGF4aXMyIGRpc3RyaWJ1dGlvbj4NCi0NCi1CdWlsZGluZyB0aGUgU2VydmljZQ0KLT09PT09PT09PT09PT09PT09PT09DQotDQotVG8gYnVpbGQgdGhlIHNhbXBsZSBzZXJ2aWNlLCB0eXBlOiAkYW50IGdlbmVyYXRlLnNlcnZpY2Ugb3IganVzdCBhbnQNCi0NCi1UaGlzIHdpbGwgYnVpbGQgdGhlIEFkZHJlc3NCb29rU2VydmljZS5hYXIgaW4gdGhlIGJ1aWxkIGRpcmVjdG9yeSBhbmQgY29weSBpdCB0byB0aGUNCi08QVhJUzJfSE9NRT4vcmVwb3NpdG9yeS9zZXJ2aWNlcyBkaXJlY3RvcnkuDQotDQotWW91IGNhbiBzdGFydCB0aGUgQXhpczIgc2VydmVyIGJ5IHJ1bm5pbmcgZWl0aGVyIGF4aXMyc2VydmVyLmJhdCAob24gV2luZG93cykgb3IgYXhpczJzZXJ2ZXIuc2gNCi0ob24gTGludXgpdGhhdCBhcmUgbG9jYXRlZCBpbiA8QVhJUzJfSE9NRT4vYmluIGRpcmVjdG9yeS4NCi0NCi1UaGUgV1NETCBmb3IgdGhpcyBzZXJ2aWNlIHNob3VsZCBiZSB2aWV3YWJsZSBhdDoNCi0NCi1odHRwOi8vPHlvdXJob3N0Pjo8eW91cnBvcnQ+L2F4aXMyL3NlcnZpY2VzL0FkZHJlc3NCb29rU2VydmljZT93c2RsIA0KLShlLmcuIGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9heGlzMi9zZXJ2aWNlcy9BZGRyZXNzQm9va1NlcnZpY2U/d3NkbCkNCi0NCi1zcmMvc2FtcGxlL2FkZHJlc3Nib29rL3JwY2NsaWVudC9BZGRyZXNzQm9va1JQQ0NsaWVudC5qYXZhIGlzIGEgQ2xpZW50IHRoYXQgdXNlcyBSUENTZXJ2aWNlQ2xpZW50DQotdG8gaW52b2tlIHRoZSBtZXRob2RzIG9mIHRoaXMgd2ViIHNlcnZpY2VzIGp1c3QgbGlrZSB0aGUgbWV0aG9kIGludm9jYXRpb25zIG9mIGEgSmF2YSBvYmplY3QuDQotDQotDQotUnVubmluZyB0aGUgQ2xpZW50DQotPT09PT09PT09PT09PT09PT09DQotDQotVG8gY29tcGlsZSBhbmQgcnVuLCB0eXBlDQotJGFudCBycGMuY2xpZW50DQotDQotc3JjL3NhbXBsZS9hZGRyZXNzYm9vay9hZGJjbGllbnQvQWRkcmVzc0Jvb2tBREJDbGllbnQgaXMgQ2xpZW50IHRoYXQgdXNlcyBhIGdlbmVyYXRlZCBzdHViIHdpdGggQURCDQotdG8gaW52b2tlIHRoZSBtZXRob2RzIG9mIHRoaXMgd2ViIHNlcnZpY2UuDQotDQotVG8gZ2VuZXJhdGUgdGhlIHN0dWIsIGNvbXBpbGUgYW5kIHJ1biwgdHlwZQ0KLSRhbnQgYWRiLmNsaWVudCAtRHdzZGw9aHR0cDovLzx5b3VyaG9zdD46PHlvdXJwb3J0Pi9heGlzMi9zZXJ2aWNlcy9BZGRyZXNzQm9va1NlcnZpY2U/d3NkbA0KLQ0KLUhlbHANCi09PT09DQotUGxlYXNlIGNvbnRhY3QgYXhpcy11c2VyIGxpc3QgKGF4aXMtdXNlckB3cy5hcGFjaGUub3JnKSBpZiB5b3UgaGF2ZSBhbnkgdHJvdWJsZSBydW5uaW5nIHRoZSBzYW1wbGUuDQotDQotDQotDQotDQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9wb2pvL2J1aWxkLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvcG9qby9idWlsZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1ZDZlZGMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9wb2pvL2J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+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+Ci0JCTwvamF2YT4KLQk8L3RhcmdldD4KLQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9wb2pvL3NyYy9NRVRBLUlORi9zZXJ2aWNlcy54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3Bvam8vc3JjL01FVEEtSU5GL3NlcnZpY2VzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjExMjA0ZC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3Bvam8vc3JjL01FVEEtSU5GL3NlcnZpY2VzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHNlcnZpY2UgbmFtZT0iQWRkcmVzc0Jvb2tTZXJ2aWNlIiBzY29wZT0iYXBwbGljYXRpb24iPgotICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgUE9KTzogQWRkcmVzc0Jvb2sgU2VydmljZQotICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgPG1lc3NhZ2VSZWNlaXZlcnM+Ci0gICAgICAgIDxtZXNzYWdlUmVjZWl2ZXIgbWVwPSJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaW4tb25seSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5ycGMucmVjZWl2ZXJzLlJQQ0luT25seU1lc3NhZ2VSZWNlaXZlciIvPgotICAgICAgICA8bWVzc2FnZVJlY2VpdmVyIG1lcD0iaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC93c2RsL2luLW91dCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5ycGMucmVjZWl2ZXJzLlJQQ01lc3NhZ2VSZWNlaXZlciIvPgotICAgIDwvbWVzc2FnZVJlY2VpdmVycz4KLSAgICA8cGFyYW1ldGVyIG5hbWU9IlNlcnZpY2VDbGFzcyI+c2FtcGxlLmFkZHJlc3Nib29rLnNlcnZpY2UuQWRkcmVzc0Jvb2tTZXJ2aWNlPC9wYXJhbWV0ZXI+Ci0KLTwvc2VydmljZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3Bvam8vc3JjL3NhbXBsZS9hZGRyZXNzYm9vay9hZGJjbGllbnQvQWRkcmVzc0Jvb2tBREJDbGllbnQuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvcG9qby9zcmMvc2FtcGxlL2FkZHJlc3Nib29rL2FkYmNsaWVudC9BZGRyZXNzQm9va0FEQkNsaWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YmM0NzU2Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvcG9qby9zcmMvc2FtcGxlL2FkZHJlc3Nib29rL2FkYmNsaWVudC9BZGRyZXNzQm9va0FEQkNsaWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugc2FtcGxlLmFkZHJlc3Nib29rLmFkYmNsaWVudDsKLQotaW1wb3J0IHNhbXBsZS5hZGRyZXNzYm9vay5zdHViLkFkZHJlc3NCb29rU2VydmljZVN0dWI7Ci0KLQotcHVibGljIGNsYXNzIEFkZHJlc3NCb29rQURCQ2xpZW50IHsKLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBVUkwgPSAiaHR0cDovLzEyNy4wLjAuMTo4MDgwL2F4aXMyL3NlcnZpY2VzL0FkZHJlc3NCb29rU2VydmljZSI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEFkZHJlc3NCb29rU2VydmljZVN0dWIgc3R1YjsKLQotICAgICAgICAgICAgaWYgKGFyZ3MgIT0gbnVsbCAmJiBhcmdzLmxlbmd0aCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgc3R1YiA9IG5ldyBBZGRyZXNzQm9va1NlcnZpY2VTdHViKGFyZ3NbMF0pOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzdHViID0gbmV3IEFkZHJlc3NCb29rU2VydmljZVN0dWIoVVJMKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgQWRkcmVzc0Jvb2tTZXJ2aWNlU3R1Yi5BZGRFbnRyeSBhZGRFbnRyeSA9IG5ldyBBZGRyZXNzQm9va1NlcnZpY2VTdHViLkFkZEVudHJ5KCk7Ci0gICAgICAgICAgICBBZGRyZXNzQm9va1NlcnZpY2VTdHViLkVudHJ5IGVudHJ5ID0gbmV3IEFkZHJlc3NCb29rU2VydmljZVN0dWIuRW50cnkoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZW50cnkuc2V0TmFtZSgiQWJieSBDYWRhYmJ5Iik7Ci0gICAgICAgICAgICBlbnRyeS5zZXRTdHJlZXQoIlNlc2FtZSBTdHJlZXQiKTsKLSAgICAgICAgICAgIGVudHJ5LnNldENpdHkoIlNlc2FtZSBDaXR5Iik7Ci0gICAgICAgICAgICBlbnRyeS5zZXRTdGF0ZSgiU2VzYW1lIFN0YXRlIik7Ci0gICAgICAgICAgICBlbnRyeS5zZXRQb3N0YWxDb2RlKCIxMTExMSIpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBhZGRFbnRyeS5zZXRBcmdzMChlbnRyeSk7Ci0gICAgICAgICAgICBzdHViLmFkZEVudHJ5KGFkZEVudHJ5KTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgQWRkcmVzc0Jvb2tTZXJ2aWNlU3R1Yi5GaW5kRW50cnkgZmluZEVudHJ5ID0gbmV3IEFkZHJlc3NCb29rU2VydmljZVN0dWIuRmluZEVudHJ5KCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZpbmRFbnRyeS5zZXRBcmdzMCgiQWJieSBDYWRhYmJ5Iik7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIEFkZHJlc3NCb29rU2VydmljZVN0dWIuRmluZEVudHJ5UmVzcG9uc2UgcmVzcG9uc2UgPSBzdHViLmZpbmRFbnRyeShmaW5kRW50cnkpOwotICAgICAgICAgICAgQWRkcmVzc0Jvb2tTZXJ2aWNlU3R1Yi5FbnRyeSByZXNwb25zZUVudHJ5ID0gcmVzcG9uc2UuZ2V0X3JldHVybigpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk5hbWUgICA6IiArIHJlc3BvbnNlRW50cnkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU3RyZWV0IDoiICsgcmVzcG9uc2VFbnRyeS5nZXRTdHJlZXQoKSk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNpdHkgICA6IiArIHJlc3BvbnNlRW50cnkuZ2V0Q2l0eSgpKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU3RhdGUgIDoiICsgcmVzcG9uc2VFbnRyeS5nZXRTdGF0ZSgpKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUG9zdGFsIENvZGUgOiIgKyByZXNwb25zZUVudHJ5LmdldFBvc3RhbENvZGUoKSk7Ci0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBleC5wcmludFN0YWNrVHJhY2UoKTsKLQotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3Bvam8vc3JjL3NhbXBsZS9hZGRyZXNzYm9vay9lbnRyeS9FbnRyeS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9wb2pvL3NyYy9zYW1wbGUvYWRkcmVzc2Jvb2svZW50cnkvRW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJiYmRiZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3Bvam8vc3JjL3NhbXBsZS9hZGRyZXNzYm9vay9lbnRyeS9FbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugc2FtcGxlLmFkZHJlc3Nib29rLmVudHJ5OwotCi1wdWJsaWMgY2xhc3MgRW50cnkgewotICAgIAotICAgIHByaXZhdGUgU3RyaW5nIG5hbWUgPSBudWxsOwotICAgIAotICAgIHByaXZhdGUgU3RyaW5nIHN0cmVldCA9IG51bGw7Ci0gICAgCi0gICAgcHJpdmF0ZSBTdHJpbmcgY2l0eSA9IG51bGw7Ci0gICAgCi0gICAgcHJpdmF0ZSBTdHJpbmcgc3RhdGUgPSBudWxsOwotICAgIAotICAgIHByaXZhdGUgU3RyaW5nIHBvc3RhbENvZGUgPSBudWxsOwotCi0gICAgcHVibGljIFN0cmluZyBnZXRDaXR5KCkgewotICAgICAgICByZXR1cm4gY2l0eTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDaXR5KFN0cmluZyBjaXR5KSB7Ci0gICAgICAgIHRoaXMuY2l0eSA9IGNpdHk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQb3N0YWxDb2RlKCkgewotICAgICAgICByZXR1cm4gcG9zdGFsQ29kZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQb3N0YWxDb2RlKFN0cmluZyBwb3N0YWxDb2RlKSB7Ci0gICAgICAgIHRoaXMucG9zdGFsQ29kZSA9IHBvc3RhbENvZGU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRTdGF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIHN0YXRlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFN0YXRlKFN0cmluZyBzdGF0ZSkgewotICAgICAgICB0aGlzLnN0YXRlID0gc3RhdGU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRTdHJlZXQoKSB7Ci0gICAgICAgIHJldHVybiBzdHJlZXQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U3RyZWV0KFN0cmluZyBzdHJlZXQpIHsKLSAgICAgICAgdGhpcy5zdHJlZXQgPSBzdHJlZXQ7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9wb2pvL3NyYy9zYW1wbGUvYWRkcmVzc2Jvb2svcnBjY2xpZW50L0FkZHJlc3NCb29rUlBDQ2xpZW50LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3Bvam8vc3JjL3NhbXBsZS9hZGRyZXNzYm9vay9ycGNjbGllbnQvQWRkcmVzc0Jvb2tSUENDbGllbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI1YjAzNi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3Bvam8vc3JjL3NhbXBsZS9hZGRyZXNzYm9vay9ycGNjbGllbnQvQWRkcmVzc0Jvb2tSUENDbGllbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBzYW1wbGUuYWRkcmVzc2Jvb2sucnBjY2xpZW50OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5PcHRpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucnBjLmNsaWVudC5SUENTZXJ2aWNlQ2xpZW50OwotCi1pbXBvcnQgc2FtcGxlLmFkZHJlc3Nib29rLmVudHJ5LkVudHJ5OwotCi0KLQotcHVibGljIGNsYXNzIEFkZHJlc3NCb29rUlBDQ2xpZW50IHsKLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MxKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLQotICAgICAgICBSUENTZXJ2aWNlQ2xpZW50IHNlcnZpY2VDbGllbnQgPSBuZXcgUlBDU2VydmljZUNsaWVudCgpOwotCi0gICAgICAgIE9wdGlvbnMgb3B0aW9ucyA9IHNlcnZpY2VDbGllbnQuZ2V0T3B0aW9ucygpOwotCi0gICAgICAgIEVuZHBvaW50UmVmZXJlbmNlIHRhcmdldEVQUiA9IG5ldyBFbmRwb2ludFJlZmVyZW5jZSgKLSAgICAgICAgICAgICAgICAiaHR0cDovLzEyNy4wLjAuMTo4MDgwL2F4aXMyL3NlcnZpY2VzL0FkZHJlc3NCb29rU2VydmljZSIpOwotICAgICAgICBvcHRpb25zLnNldFRvKHRhcmdldEVQUik7Ci0KLSAgICAgICAgLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSAgICAgICAgLyoKLSAgICAgICAgICogQ3JlYXRlcyBhbiBFbnRyeSBhbmQgc3RvcmVzIGl0IGluIHRoZSBBZGRyZXNzQm9vay4KLSAgICAgICAgICovCi0KLSAgICAgICAgLy8gUU5hbWUgb2YgdGhlIHRhcmdldCBtZXRob2QgCi0gICAgICAgIFFOYW1lIG9wQWRkRW50cnkgPSBuZXcgUU5hbWUoImh0dHA6Ly9zZXJ2aWNlLmFkZHJlc3Nib29rLnNhbXBsZSIsICJhZGRFbnRyeSIpOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIENvbnN0cnVjdGluZyBhIG5ldyBFbnRyeQotICAgICAgICAgKi8KLSAgICAgICAgRW50cnkgZW50cnkgPSBuZXcgRW50cnkoKTsKLQotICAgICAgICBlbnRyeS5zZXROYW1lKCJBYmJ5IENhZGFiYnkiKTsKLSAgICAgICAgZW50cnkuc2V0U3RyZWV0KCJTZXNhbWUgU3RyZWV0Iik7Ci0gICAgICAgIGVudHJ5LnNldENpdHkoIlNlc2FtZSBDaXR5Iik7Ci0gICAgICAgIGVudHJ5LnNldFN0YXRlKCJTZXNhbWUgU3RhdGUiKTsKLSAgICAgICAgZW50cnkuc2V0UG9zdGFsQ29kZSgiMTExMTEiKTsKLQotICAgICAgICAvLyBDb25zdHJ1Y3RpbmcgdGhlIGFyZ3VtZW50cyBhcnJheSBmb3IgdGhlIG1ldGhvZCBpbnZvY2F0aW9uCi0gICAgICAgIE9iamVjdFtdIG9wQWRkRW50cnlBcmdzID0gbmV3IE9iamVjdFtdIHsgZW50cnkgfTsKLQotICAgICAgICAvLyBJbnZva2luZyB0aGUgbWV0aG9kCi0gICAgICAgIHNlcnZpY2VDbGllbnQuaW52b2tlUm9idXN0KG9wQWRkRW50cnksIG9wQWRkRW50cnlBcmdzKTsKLQotICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgICAgICAKLSAgICAgICAgLyoKLSAgICAgICAgICogRmV0Y2hpbmcgYW4gRW50cnkgZnJvbSB0aGUgQWRkcmVzcyBib29rCi0gICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgLy8gUU5hbWUgb2YgdGhlIG1ldGhvZCB0byBpbnZva2UgCi0gICAgICAgIFFOYW1lIG9wRmluZEVudHJ5ID0gbmV3IFFOYW1lKCJodHRwOi8vc2VydmljZS5hZGRyZXNzYm9vay5zYW1wbGUiLCAiZmluZEVudHJ5Iik7Ci0KLSAgICAgICAgLy8KLSAgICAgICAgU3RyaW5nIG5hbWUgPSAiQWJieSBDYWRhYmJ5IjsKLQotICAgICAgICBPYmplY3RbXSBvcEZpbmRFbnRyeUFyZ3MgPSBuZXcgT2JqZWN0W10geyBuYW1lIH07Ci0gICAgICAgIENsYXNzW10gcmV0dXJuVHlwZXMgPSBuZXcgQ2xhc3NbXSB7IEVudHJ5LmNsYXNzIH07Ci0KLSAgICAgICAgCi0gICAgICAgIE9iamVjdFtdIHJlc3BvbnNlID0gc2VydmljZUNsaWVudC5pbnZva2VCbG9ja2luZyhvcEZpbmRFbnRyeSwKLSAgICAgICAgICAgICAgICBvcEZpbmRFbnRyeUFyZ3MsIHJldHVyblR5cGVzKTsKLSAgICAgICAgCi0gICAgICAgIEVudHJ5IHJlc3VsdCA9IChFbnRyeSkgcmVzcG9uc2VbMF07Ci0gICAgICAgIAotICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTm8gZW50cnkgZm91bmQgZm9yICIgKyBuYW1lKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfSAKLSAgICAgICAgCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTmFtZSAgIDoiICsgcmVzdWx0LmdldE5hbWUoKSk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU3RyZWV0IDoiICsgcmVzdWx0LmdldFN0cmVldCgpKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDaXR5ICAgOiIgKyByZXN1bHQuZ2V0Q2l0eSgpKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTdGF0ZSAgOiIgKyByZXN1bHQuZ2V0U3RhdGUoKSk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUG9zdGFsIENvZGUgOiIgKyByZXN1bHQuZ2V0UG9zdGFsQ29kZSgpKTsKLSAgICAgICAgCi0KLSAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3Bvam8vc3JjL3NhbXBsZS9hZGRyZXNzYm9vay9zZXJ2aWNlL0FkZHJlc3NCb29rU2VydmljZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9wb2pvL3NyYy9zYW1wbGUvYWRkcmVzc2Jvb2svc2VydmljZS9BZGRyZXNzQm9va1NlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE1MjIyMC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3Bvam8vc3JjL3NhbXBsZS9hZGRyZXNzYm9vay9zZXJ2aWNlL0FkZHJlc3NCb29rU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugc2FtcGxlLmFkZHJlc3Nib29rLnNlcnZpY2U7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1pbXBvcnQgc2FtcGxlLmFkZHJlc3Nib29rLmVudHJ5LkVudHJ5OwotCi0KLQotcHVibGljIGNsYXNzIEFkZHJlc3NCb29rU2VydmljZSB7Ci0gICAgCi0gICAgcHJpdmF0ZSBIYXNoTWFwIGVudHJpZXMgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgLyoqCi0gICAgICogQWRkIGFuIEVudHJ5IHRvIHRoZSBBZGRyZXNzIEJvb2sKLSAgICAgKiBAcGFyYW0gZW50cnkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRFbnRyeShFbnRyeSBlbnRyeSkgewotICAgICAgICB0aGlzLmVudHJpZXMucHV0KGVudHJ5LmdldE5hbWUoKSwgZW50cnkpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBTZWFyY2ggYW4gYWRkcmVzcyBvZiBhIHBlcnNvbgotICAgICAqIAotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwZXJzb24gd2hvc2UgYWRkcmVzcyBuZWVkcyB0byBiZSBmb3VuZAotICAgICAqIEByZXR1cm4gcmV0dXJuIHRoZSBhZGRyZXNzIGVudHJ5IG9mIHRoZSBwZXJzb24uIAotICAgICAqLwotICAgIHB1YmxpYyBFbnRyeSBmaW5kRW50cnkoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgcmV0dXJuIChFbnRyeSkgdGhpcy5lbnRyaWVzLmdldChuYW1lKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3Bvam9ndWlkZS9SRUFETUUudHh0IGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9wb2pvZ3VpZGUvUkVBRE1FLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZhOTAzMi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3Bvam9ndWlkZS9SRUFETUUudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotUE9KTyBXZWIgU2VydmljZXMgdXNpbmcgQXBhY2hlIEF4aXMyLSBTYW1wbGUgMQ0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLVRoaXMgc2FtcGxlIGNvbnRhaW5zIHNvdXJjZSBjb2RlIGZvciB0aGUgeGRvY3MvMV8xL3Bvam9ndWlkZS5odG1sIGRvY3VtZW50IGZvdW5kIGluIA0KLXRoZSBleHRyYWN0ZWQgQXhpczIgRG9jdW1lbnRzIERpc3RyaWJ1dGlvbi4gRm9yIGEgbW9yZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvbiB0aGUgDQotc291cmNlIGNvZGUga2luZGx5IHNlZSB0aGlzICdQT0pPIFdlYiBTZXJ2aWNlcyB1c2luZyBBcGFjaGUgQXhpczInIGRvY3VtZW50Lg0KLQ0KLVRoZSBhYm92ZSBtZW50aW9uZWQgZG9jdW1lbnQgc2hvd3MgeW91IGhvdyB0byB0YWtlIGEgc2ltcGxlIFBPSk8gKFBsYWluIE9sZCBKYXZhIA0KLU9iamVjdCksIGFuZCBkZXBsb3kgaXQgb24gQXBhY2hlIFRvbWNhdCBhcyBhIFdlYiBzZXJ2aWNlIGluIHRoZSBleHBsb2RlZCBkaXJlY3RvcnkgDQotZm9ybWF0LiBUaGlzIGlzIGEgcXVpY2sgd2F5IHRvIGdldCBhIFdlYiBzZXJ2aWNlIHVwIGFuZCBydW5uaW5nIGluIG5vIHRpbWUuIA0KLQ0KLUludHJvZHVjdGlvbg0KLT09PT09PT09PT09PQ0KLQ0KLVRoaXMgc2FtcGxlIHNob3dzIGhvdyB0byBleHBvc2UgYSBKYXZhIGNsYXNzIGFzIGEgd2ViIHNlcnZpY2UuICANCi1UaGUgV2VhdGhlclNlcnZpY2UgSmF2YSBjbGFzcyBwcm92aWRlcyBtZXRob2RzIHRvIGdldCBhbmQgc2V0IGEgV2VhdGhlciANCi10eXBlIEphdmEgb2JqZWN0cy4gVGhlIGNsaWVudCB1c2VzIFJQQ1NlcnZpY2VDbGllbnQgdG8gaW52b2tlIHRob3NlIHR3byANCi1tZXRob2RzIGp1c3QgYXMgSmF2YSBvYmplY3QgbWV0aG9kIGludm9jYXRpb24uDQotDQotUHJlcmVxdWlzaXRlcw0KLT09PT09PT09PT09PT09DQotDQotQXBhY2hlIEFudCAxLjYuMiBvciBsYXRlcg0KLQ0KLUJ1aWxkaW5nIHRoZSBTZXJ2aWNlDQotPT09PT09PT09PT09PT09PT09PT0NCi0NCi1UeXBlICRhbnQgZnJvbSBBeGlzMl9IT01FL3NhbXBsZXMvcG9qb2d1aWRlDQotDQotDQotUnVubmluZyB0aGUgQ2xpZW50DQotPT09PT09PT09PT09PT09PT09DQotDQotVHlwZSAkYW50IHJwYy5jbGllbnQNCi0NCi0NCi1IZWxwDQotPT09PQ0KLVBsZWFzZSBjb250YWN0IGF4aXMtdXNlciBsaXN0IChheGlzLXVzZXJAd3MuYXBhY2hlLm9yZykgaWYgeW91IGhhdmUgYW55IHRyb3VibGUgcnVubmluZyB0aGUgc2FtcGxlLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvcG9qb2d1aWRlL2J1aWxkLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvcG9qb2d1aWRlL2J1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDc3NjQyOC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3Bvam9ndWlkZS9idWlsZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxwcm9qZWN0IG5hbWU9InBvam9ndWlkZSIgYmFzZWRpcj0iLiIgZGVmYXVsdD0iZ2VuZXJhdGUuc2VydmljZSI+Ci0KLQk8cHJvcGVydHkgbmFtZT0ic2VydmljZS5uYW1lIiB2YWx1ZT0iV2VhdGhlclNlcnZpY2UiIC8+Ci0JPHByb3BlcnR5IG5hbWU9ImRlc3QuZGlyIiB2YWx1ZT0iYnVpbGQiIC8+Ci0JPHByb3BlcnR5IG5hbWU9ImRlc3QuZGlyLmNsYXNzZXMiIHZhbHVlPSIke2Rlc3QuZGlyfS8ke3NlcnZpY2UubmFtZX0iIC8+Ci0JPHByb3BlcnR5IG5hbWU9ImRlc3QuZGlyLmxpYiIgdmFsdWU9IiR7ZGVzdC5kaXJ9L2xpYiIgLz4JCi0JPHByb3BlcnR5IG5hbWU9ImF4aXMyLmhvbWUiIHZhbHVlPSIuLi8uLi8iIC8+Ci0JPHByb3BlcnR5IG5hbWU9InJlcG9zaXRvcnkucGF0aCIgdmFsdWU9IiR7YXhpczIuaG9tZX0vcmVwb3NpdG9yeSIgLz4KLQotCTxwYXRoIGlkPSJidWlsZC5jbGFzcy5wYXRoIj4KLQkJPGZpbGVzZXQgZGlyPSIke2F4aXMyLmhvbWV9L2xpYiI+Ci0JCQk8aW5jbHVkZSBuYW1lPSIqLmphciIgLz4KLQkJPC9maWxlc2V0PgotCTwvcGF0aD4KLQotCTxwYXRoIGlkPSJjbGllbnQuY2xhc3MucGF0aCI+Ci0JCTxmaWxlc2V0IGRpcj0iJHtheGlzMi5ob21lfS9saWIiPgotCQkJPGluY2x1ZGUgbmFtZT0iKi5qYXIiIC8+Ci0JCTwvZmlsZXNldD4KLQkJPGZpbGVzZXQgZGlyPSIke2Rlc3QuZGlyLmxpYn0iPgotCQkJPGluY2x1ZGUgbmFtZT0iKi5qYXIiIC8+Ci0JCTwvZmlsZXNldD4KLQotCTwvcGF0aD4KLQk8dGFyZ2V0IG5hbWU9ImNsZWFuIj4KLQkJPGRlbGV0ZSBkaXI9IiR7ZGVzdC5kaXJ9IiAvPgotCQk8ZGVsZXRlIGRpcj0ic3JjIiBpbmNsdWRlcz0ic2FtcGxlL3Bvam8vc3R1Yi8qKiIvPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJwcmVwYXJlIj4KLQkJPG1rZGlyIGRpcj0iJHtkZXN0LmRpcn0iIC8+Ci0JCTxta2RpciBkaXI9IiR7ZGVzdC5kaXJ9L2xpYiIgLz4KLQkJPG1rZGlyIGRpcj0iJHtkZXN0LmRpci5jbGFzc2VzfSIgLz4KLQkJPG1rZGlyIGRpcj0iJHtkZXN0LmRpci5jbGFzc2VzfS9NRVRBLUlORiIgLz4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0iZ2VuZXJhdGUuc2VydmljZSIgZGVwZW5kcz0iY2xlYW4scHJlcGFyZSI+Ci0KLQkJPGNvcHkgZmlsZT0ic3JjL01FVEEtSU5GL3NlcnZpY2VzLnhtbCIgdG9maWxlPSIke2Rlc3QuZGlyLmNsYXNzZXN9L01FVEEtSU5GL3NlcnZpY2VzLnhtbCIgb3ZlcndyaXRlPSJ0cnVlIiAvPgotCi0JCTxqYXZhYyBzcmNkaXI9InNyYyIgZGVzdGRpcj0iJHtkZXN0LmRpci5jbGFzc2VzfSIgaW5jbHVkZXM9InNhbXBsZS9wb2pvL3NlcnZpY2UvKiosc2FtcGxlL3Bvam8vZGF0YS8qKiI+Ci0JCQk8Y2xhc3NwYXRoIHJlZmlkPSJidWlsZC5jbGFzcy5wYXRoIiAvPgotCQk8L2phdmFjPgotCQkKLQkJPGphciBiYXNlZGlyPSIke2Rlc3QuZGlyLmNsYXNzZXN9IiBkZXN0ZmlsZT0iJHtkZXN0LmRpcn0vJHtzZXJ2aWNlLm5hbWV9LmFhciIgLz4KLQotCQk8Y29weSBmaWxlPSIke2Rlc3QuZGlyfS8ke3NlcnZpY2UubmFtZX0uYWFyIiB0b2ZpbGU9IiR7cmVwb3NpdG9yeS5wYXRofS9zZXJ2aWNlcy8ke3NlcnZpY2UubmFtZX0uYWFyIiBvdmVyd3JpdGU9InRydWUiIC8+Ci0JCQotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJycGMuY2xpZW50IiBkZXBlbmRzPSJjbGVhbixwcmVwYXJlIj4KLQotCQk8YW50Y2FsbCB0YXJnZXQ9InJwYy5jbGllbnQuY29tcGlsZSIgLz4KLQotCQk8YW50Y2FsbCB0YXJnZXQ9InJwYy5jbGllbnQuamFyIiAvPgotCi0JCTxhbnRjYWxsIHRhcmdldD0icnBjLmNsaWVudC5ydW4iIC8+Ci0KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0icnBjLmNsaWVudC5jb21waWxlIj4KLQkJPGphdmFjIHNyY2Rpcj0ic3JjIiBkZXN0ZGlyPSIke2Rlc3QuZGlyLmNsYXNzZXN9IiBpbmNsdWRlcz0ic2FtcGxlL3Bvam8vcnBjY2xpZW50LyoqLHNhbXBsZS9wb2pvL2RhdGEvKioiPgotCQkJPGNsYXNzcGF0aCByZWZpZD0iYnVpbGQuY2xhc3MucGF0aCIgLz4KLQkJPC9qYXZhYz4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0icnBjLmNsaWVudC5qYXIiPgotCQk8amFyIGJhc2VkaXI9IiR7ZGVzdC5kaXIuY2xhc3Nlc30iIGRlc3RmaWxlPSIke2Rlc3QuZGlyLmxpYn0vcnBjLWNsaWVudC5qYXIiIGluY2x1ZGVzPSJzYW1wbGUvcG9qby9ycGNjbGllbnQvKiosc2FtcGxlL3Bvam8vZGF0YS8qKiIgLz4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0icnBjLmNsaWVudC5ydW4iPgotCQk8amF2YSBjbGFzc25hbWU9InNhbXBsZS5wb2pvLnJwY2NsaWVudC5XZWF0aGVyUlBDQ2xpZW50Ij4KLQkJCTxjbGFzc3BhdGggcmVmaWQ9ImNsaWVudC5jbGFzcy5wYXRoIiAvPgotCQk8L2phdmE+Ci0JPC90YXJnZXQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3Bvam9ndWlkZS9zcmMvTUVUQS1JTkYvc2VydmljZXMueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9wb2pvZ3VpZGUvc3JjL01FVEEtSU5GL3NlcnZpY2VzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzkxYmQwMy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3Bvam9ndWlkZS9zcmMvTUVUQS1JTkYvc2VydmljZXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08c2VydmljZSBuYW1lPSJXZWF0aGVyU2VydmljZSIgc2NvcGU9ImFwcGxpY2F0aW9uIj4KLSAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgIFdlYXRoZXIgUE9KTyBTZXJ2aWNlCi0gICAgPC9kZXNjcmlwdGlvbj4KLSAgICA8bWVzc2FnZVJlY2VpdmVycz4KLSAgICAgICAgPG1lc3NhZ2VSZWNlaXZlciBtZXA9Imh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgvd3NkbC9pbi1vbmx5IgotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJwYy5yZWNlaXZlcnMuUlBDSW5Pbmx5TWVzc2FnZVJlY2VpdmVyIi8+Ci0gICAgICAgIDxtZXNzYWdlUmVjZWl2ZXIgbWVwPSJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaW4tb3V0IgotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJwYy5yZWNlaXZlcnMuUlBDTWVzc2FnZVJlY2VpdmVyIi8+Ci0gICAgPC9tZXNzYWdlUmVjZWl2ZXJzPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iU2VydmljZUNsYXNzIj5zYW1wbGUucG9qby5zZXJ2aWNlLldlYXRoZXJTZXJ2aWNlPC9wYXJhbWV0ZXI+Ci0KLTwvc2VydmljZT4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvcG9qb2d1aWRlL3NyYy9zYW1wbGUvcG9qby9kYXRhL1dlYXRoZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvcG9qb2d1aWRlL3NyYy9zYW1wbGUvcG9qby9kYXRhL1dlYXRoZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc3OWM1OC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3Bvam9ndWlkZS9zcmMvc2FtcGxlL3Bvam8vZGF0YS9XZWF0aGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBzYW1wbGUucG9qby5kYXRhOwotCi1wdWJsaWMgY2xhc3MgV2VhdGhlcnsKLSAgICBmbG9hdCB0ZW1wZXJhdHVyZTsKLSAgICBTdHJpbmcgZm9yZWNhc3Q7Ci0gICAgYm9vbGVhbiByYWluOwotICAgIGZsb2F0IGhvd011Y2hSYWluOwotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldFRlbXBlcmF0dXJlKGZsb2F0IHRlbXApewotICAgICAgICB0ZW1wZXJhdHVyZSA9IHRlbXA7Ci0gICAgfQotCi0gICAgcHVibGljIGZsb2F0IGdldFRlbXBlcmF0dXJlKCl7Ci0gICAgICAgIHJldHVybiB0ZW1wZXJhdHVyZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0Rm9yZWNhc3QoU3RyaW5nIGZvcmUpewotICAgICAgICBmb3JlY2FzdCA9IGZvcmU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRGb3JlY2FzdCgpewotICAgICAgICByZXR1cm4gZm9yZWNhc3Q7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldFJhaW4oYm9vbGVhbiByKXsKLSAgICAgICAgcmFpbiA9IHI7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0UmFpbigpewotICAgICAgICByZXR1cm4gcmFpbjsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0SG93TXVjaFJhaW4oZmxvYXQgaG93TXVjaCl7Ci0gICAgICAgIGhvd011Y2hSYWluID0gaG93TXVjaDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmxvYXQgZ2V0SG93TXVjaFJhaW4oKXsKLSAgICAgICAgcmV0dXJuIGhvd011Y2hSYWluOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3Bvam9ndWlkZS9zcmMvc2FtcGxlL3Bvam8vcnBjY2xpZW50L1dlYXRoZXJSUENDbGllbnQuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvcG9qb2d1aWRlL3NyYy9zYW1wbGUvcG9qby9ycGNjbGllbnQvV2VhdGhlclJQQ0NsaWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjM0OTJjLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvcG9qb2d1aWRlL3NyYy9zYW1wbGUvcG9qby9ycGNjbGllbnQvV2VhdGhlclJQQ0NsaWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugc2FtcGxlLnBvam8ucnBjY2xpZW50OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5PcHRpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucnBjLmNsaWVudC5SUENTZXJ2aWNlQ2xpZW50OwotCi1pbXBvcnQgc2FtcGxlLnBvam8uZGF0YS5XZWF0aGVyOwotCi0KLXB1YmxpYyBjbGFzcyBXZWF0aGVyUlBDQ2xpZW50IHsKLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MxKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLQotICAgICAgICBSUENTZXJ2aWNlQ2xpZW50IHNlcnZpY2VDbGllbnQgPSBuZXcgUlBDU2VydmljZUNsaWVudCgpOwotCi0gICAgICAgIE9wdGlvbnMgb3B0aW9ucyA9IHNlcnZpY2VDbGllbnQuZ2V0T3B0aW9ucygpOwotCi0gICAgICAgIEVuZHBvaW50UmVmZXJlbmNlIHRhcmdldEVQUiA9IG5ldyBFbmRwb2ludFJlZmVyZW5jZSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2F4aXMyL3NlcnZpY2VzL1dlYXRoZXJTZXJ2aWNlIik7Ci0KLSAgICAgICAgb3B0aW9ucy5zZXRUbyh0YXJnZXRFUFIpOwotCi0gICAgICAgIC8vIFNldHRpbmcgdGhlIHdlYXRoZXIKLSAgICAgICAgUU5hbWUgb3BTZXRXZWF0aGVyID0gbmV3IFFOYW1lKCJodHRwOi8vc2VydmljZS5wb2pvLnNhbXBsZSIsICJzZXRXZWF0aGVyIik7Ci0KLSAgICAgICAgV2VhdGhlciB3ID0gbmV3IFdlYXRoZXIoKTsKLQotICAgICAgICB3LnNldFRlbXBlcmF0dXJlKChmbG9hdCkzOS4zKTsKLSAgICAgICAgdy5zZXRGb3JlY2FzdCgiQ2xvdWR5IHdpdGggc2hvd2VycyIpOwotICAgICAgICB3LnNldFJhaW4odHJ1ZSk7Ci0gICAgICAgIHcuc2V0SG93TXVjaFJhaW4oKGZsb2F0KTQuNSk7Ci0KLSAgICAgICAgT2JqZWN0W10gb3BTZXRXZWF0aGVyQXJncyA9IG5ldyBPYmplY3RbXSB7IHcgfTsKLQotICAgICAgICBzZXJ2aWNlQ2xpZW50Lmludm9rZVJvYnVzdChvcFNldFdlYXRoZXIsIG9wU2V0V2VhdGhlckFyZ3MpOwotCi0KLSAgICAgICAgLy8gR2V0dGluZyB0aGUgd2VhdGhlcgotICAgICAgICBRTmFtZSBvcEdldFdlYXRoZXIgPSBuZXcgUU5hbWUoImh0dHA6Ly9zZXJ2aWNlLnBvam8uc2FtcGxlIiwgImdldFdlYXRoZXIiKTsKLQotICAgICAgICBPYmplY3RbXSBvcEdldFdlYXRoZXJBcmdzID0gbmV3IE9iamVjdFtdIHsgfTsKLSAgICAgICAgQ2xhc3NbXSByZXR1cm5UeXBlcyA9IG5ldyBDbGFzc1tdIHsgV2VhdGhlci5jbGFzcyB9OwotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIE9iamVjdFtdIHJlc3BvbnNlID0gc2VydmljZUNsaWVudC5pbnZva2VCbG9ja2luZyhvcEdldFdlYXRoZXIsCi0gICAgICAgICAgICAgICAgb3BHZXRXZWF0aGVyQXJncywgcmV0dXJuVHlwZXMpOwotICAgICAgICAKLSAgICAgICAgV2VhdGhlciByZXN1bHQgPSAoV2VhdGhlcikgcmVzcG9uc2VbMF07Ci0gICAgICAgIAotICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiV2VhdGhlciBkaWRuJ3QgaW5pdGlhbGl6ZSEiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gRGlzcGxheWluZyB0aGUgcmVzdWx0Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGVtcGVyYXR1cmUgICAgICAgICAgICAgICA6ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmdldFRlbXBlcmF0dXJlKCkpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkZvcmVjYXN0ICAgICAgICAgICAgICAgICAgOiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5nZXRGb3JlY2FzdCgpKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJSYWluICAgICAgICAgICAgICAgICAgICAgIDogIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuZ2V0UmFpbigpKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJIb3cgbXVjaCByYWluIChpbiBpbmNoZXMpIDogIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuZ2V0SG93TXVjaFJhaW4oKSk7Ci0gICAgICAgIAotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvcG9qb2d1aWRlL3NyYy9zYW1wbGUvcG9qby9zZXJ2aWNlL1dlYXRoZXJTZXJ2aWNlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3Bvam9ndWlkZS9zcmMvc2FtcGxlL3Bvam8vc2VydmljZS9XZWF0aGVyU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjQyYzVhLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvcG9qb2d1aWRlL3NyYy9zYW1wbGUvcG9qby9zZXJ2aWNlL1dlYXRoZXJTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBzYW1wbGUucG9qby5zZXJ2aWNlOwotCi1pbXBvcnQgc2FtcGxlLnBvam8uZGF0YS5XZWF0aGVyOwotCi1wdWJsaWMgY2xhc3MgV2VhdGhlclNlcnZpY2V7Ci0gICAgV2VhdGhlciB3ZWF0aGVyOwotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldFdlYXRoZXIoV2VhdGhlciB3ZWF0aGVyKXsKLSAgICAgICAgdGhpcy53ZWF0aGVyID0gd2VhdGhlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgV2VhdGhlciBnZXRXZWF0aGVyKCl7Ci0gICAgICAgIHJldHVybiB0aGlzLndlYXRoZXI7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvcG9qb2d1aWRlc3ByaW5nL1JFQURNRS50eHQgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3Bvam9ndWlkZXNwcmluZy9SRUFETUUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmMyYjk1Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvcG9qb2d1aWRlc3ByaW5nL1JFQURNRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi1QT0pPIFdlYiBTZXJ2aWNlcyB1c2luZyBBcGFjaGUgQXhpczItIFNhbXBsZSAyDQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLVRoaXMgc2FtcGxlIGNvbnRhaW5zIHNvdXJjZSBjb2RlIGZvciB0aGUgeGRvY3MvMV8xL3Bvam9ndWlkZS5odG1sIGRvY3VtZW50IGZvdW5kIGluIA0KLXRoZSBleHRyYWN0ZWQgQXhpczIgRG9jdW1lbnRzIERpc3RyaWJ1dGlvbi4gRm9yIGEgbW9yZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvbiB0aGUgDQotc291cmNlIGNvZGUga2luZGx5IHNlZSB0aGlzICdQT0pPIFdlYiBTZXJ2aWNlcyB1c2luZyBBcGFjaGUgQXhpczInIGRvY3VtZW50Lg0KLQ0KLUluIHRoaXMgc3BlY2lmaWMgc2FtcGxlIHlvdSdsbCBiZSBzaG93biBob3cgdG8gdGFrZSBhIFBPSk8gIChQbGFpbiBPbGQgSmF2YSBPYmplY3QpIA0KLWJhc2VkIG9uIHRoZSBTcHJpbmcgRnJhbWV3b3JrLCBhbmQgZGVwbG95IHRoYXQgYXMgYW4gQUFSIHBhY2thZ2VkIFdlYiBzZXJ2aWNlIG9uIFRvbWNhdC4gDQotVGhpcyBpcyBhIHF1aWNrIHdheSB0byBnZXQgYSBXZWIgc2VydmljZSB1cCBhbmQgcnVubmluZyBpbiBubyB0aW1lLiANCi0NCi1JbnRyb2R1Y3Rpb24NCi09PT09PT09PT09PT0NCi0NCi1UaGlzIHNhbXBsZSBzaG93cyBob3cgdG8gZXhwb3NlIHRoZSBnZXR0ZXJzIGFuZCBzZXR0ZXJzIG9mIFdlYXRoZXJTcHJpbmdTZXJ2aWNlIHRoYXQgDQotdGFrZXMgV2VhdGhlciB0eXBlIEphdmEgT2JqZWN0IGFzIHRoZSBhcmd1bWVudCBhbmQgdGhlIHJldHVybiB0eXBlLiBJdCB1c2VzIHRoZSBTcHJpbmcgDQotZnJhbWV3b3JrIHRvIGluaXRpYWxpemUgdGhlIHdlYXRoZXIgcHJvcGVydHkgb2YgdGhlIFdlYXRoZXJTcHJpbmdTZXJ2aWNlLg0KLQ0KLQ0KLVByZS1SZXF1aXNpdGVzDQotPT09PT09PT09PT09PT0NCi0NCi1BcGFjaGUgQW50IDEuNi4yIG9yIGxhdGVyDQotDQotU3ByaW5nLTEuMi42LmphciBvciBsYXRlciANCi1Zb3UgbmVlZCB0byBoYXZlIHRoaXMgamFyIGluIHlvdXIgYnVpbGQgYW5kIHJ1bnRpbWUgY2xhc3MgcGF0aC4gVGhlIGVhc2llc3Qgd2F5IHRvIGRvIHRoaXMgDQotaXMgdG8gY29weSBpdCB0byBBeGlzMl9IT01FL2xpYiBkaXJlY3RvcnkuDQotDQotQnVpbGRpbmcgdGhlIFNlcnZpY2UNCi09PT09PT09PT09PT09PT09PT09PQ0KLQ0KLVR5cGUgJGFudCBmcm9tIEF4aXMyX0hPTUUvc2FtcGxlcy9wb2pvZ3VpZGVzcHJpbmcNCi0NCi0NCi1SdW5uaW5nIHRoZSBDbGllbnQNCi09PT09PT09PT09PT09PT09PT0NCi1UeXBlICRhbnQgcnBjLmNsaWVudCBmcm9tIGZyb20gQXhpczJfSE9NRS9zYW1wbGVzL3Bvam9ndWlkZXNwcmluZw0KLQ0KLUhlbHANCi09PT09DQotUGxlYXNlIGNvbnRhY3QgYXhpcy11c2VyIGxpc3QgKGF4aXMtdXNlckB3cy5hcGFjaGUub3JnKSBpZiB5b3UgaGF2ZSBhbnkgdHJvdWJsZSBydW5uaW5nIHRoZSBzYW1wbGUuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9wb2pvZ3VpZGVzcHJpbmcvYnVpbGQueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9wb2pvZ3VpZGVzcHJpbmcvYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjE5NmQ5Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvcG9qb2d1aWRlc3ByaW5nL2J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+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+Ci0KLQk8dGFyZ2V0IG5hbWU9ImRvd25sb2FkLmphcnMiIGRlcGVuZHM9ImNoZWNrU3ByaW5nSmFyQXZhaWxhYmlsaXR5IiB1bmxlc3M9InNwcmluZ19hdmFpbGFibGUiPgotCSAgICA8ZWNobyBtZXNzYWdlPSJTcHJpbmcgamFycyBub3QgYXZhaWxhYmxlLkRvd25sb2FkaW5nLi4uLiIvPgotCSAgICA8bWtkaXIgZGlyPSJsaWIiLz4KLSAgICAgICAgICAgIDxnZXQgc3JjPSJodHRwOi8vd3Muem9uZXMuYXBhY2hlLm9yZy9yZXBvc2l0b3J5L29yZy5zcHJpbmdmcmFtZXdvcmsvamFycy9zcHJpbmctY29yZS0xLjIuOC5qYXIiCi0JICAgICAgICAgICAgIGRlc3Q9ImxpYi9zcHJpbmctY29yZS0xLjIuOC5qYXIiIHZlcmJvc2U9InRydWUiLz4KLQkgICAgPGdldCBzcmM9Imh0dHA6Ly93cy56b25lcy5hcGFjaGUub3JnL3JlcG9zaXRvcnkvb3JnLnNwcmluZ2ZyYW1ld29yay9qYXJzL3NwcmluZy1jb250ZXh0LTEuMi44LmphciIKLQkgICAgICAgICAgICAgZGVzdD0ibGliL3NwcmluZy1jb250ZXh0LTEuMi44LmphciIgdmVyYm9zZT0idHJ1ZSIvPgotCSAgICA8Z2V0IHNyYz0iaHR0cDovL3dzLnpvbmVzLmFwYWNoZS5vcmcvcmVwb3NpdG9yeS9vcmcuc3ByaW5nZnJhbWV3b3JrL2phcnMvc3ByaW5nLWJlYW5zLTEuMi44LmphciIKLQkgICAgICAgICAgICAgZGVzdD0ibGliL3NwcmluZy1iZWFucy0xLjIuOC5qYXIiIHZlcmJvc2U9InRydWUiLz4KLQk8L3RhcmdldD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvcG9qb2d1aWRlc3ByaW5nL3NyYy9NRVRBLUlORi9zZXJ2aWNlcy54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3Bvam9ndWlkZXNwcmluZy9zcmMvTUVUQS1JTkYvc2VydmljZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWFiNTgwLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvcG9qb2d1aWRlc3ByaW5nL3NyYy9NRVRBLUlORi9zZXJ2aWNlcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzZXJ2aWNlR3JvdXA+Ci0gIDxzZXJ2aWNlIG5hbWU9IlNwcmluZ0luaXQiIGNsYXNzPSJzYW1wbGUuc3ByaW5nLnNlcnZpY2UuU3ByaW5nSW5pdCI+Ci0gICAgPGRlc2NyaXB0aW9uPgotICAgICAgVGhpcyB3ZWIgc2VydmljZSBpbml0aWFsaXplcyBTcHJpbmcuCi0gICAgPC9kZXNjcmlwdGlvbj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9IlNlcnZpY2VDbGFzcyIgPnNhbXBsZS5zcHJpbmcuc2VydmljZS5TcHJpbmdJbml0PC9wYXJhbWV0ZXI+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJTZXJ2aWNlVENDTCIgPmNvbXBvc2l0ZTwvcGFyYW1ldGVyPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0ibG9hZC1vbi1zdGFydHVwIiA+dHJ1ZTwvcGFyYW1ldGVyPgotICAgIDxvcGVyYXRpb24gbmFtZT0ic3ByaW5nSW5pdCI+Ci0gICAgICA8bWVzc2FnZVJlY2VpdmVyIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5SYXdYTUxJTk91dE1lc3NhZ2VSZWNlaXZlciIvPgotICAgIDwvb3BlcmF0aW9uPgotICA8L3NlcnZpY2U+Ci0gIDxzZXJ2aWNlIG5hbWU9IldlYXRoZXJTcHJpbmdTZXJ2aWNlIj4KLSAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICBXZWF0aGVyIFNwcmluZyBQT0pPIEF4aXMyIEFBUiBkZXBsb3ltZW50Ci0gICAgPC9kZXNjcmlwdGlvbj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9IlNlcnZpY2VDbGFzcyIgPnNhbXBsZS5zcHJpbmcuc2VydmljZS5XZWF0aGVyU3ByaW5nU2VydmljZTwvcGFyYW1ldGVyPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iU2VydmljZU9iamVjdFN1cHBsaWVyIiA+b3JnLmFwYWNoZS5heGlzMi5leHRlbnNpb25zLnNwcmluZy5yZWNlaXZlcnMuU3ByaW5nQXBwQ29udGV4dEF3YXJlT2JqZWN0U3VwcGxpZXI8L3BhcmFtZXRlcj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9IlNwcmluZ0JlYW5OYW1lIiA+d2VhdGhlclNwcmluZ1NlcnZpY2U8L3BhcmFtZXRlcj4KLSAgICA8bWVzc2FnZVJlY2VpdmVycz4KLSAgICAgIDxtZXNzYWdlUmVjZWl2ZXIgbWVwPSJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaW4tb25seSIKLSAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIucnBjLnJlY2VpdmVycy5SUENJbk9ubHlNZXNzYWdlUmVjZWl2ZXIiLz4KLSAgICAgIDxtZXNzYWdlUmVjZWl2ZXIgbWVwPSJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaW4tb3V0IgotICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5ycGMucmVjZWl2ZXJzLlJQQ01lc3NhZ2VSZWNlaXZlciIvPgotICAgIDwvbWVzc2FnZVJlY2VpdmVycz4KLSAgPC9zZXJ2aWNlPgotPC9zZXJ2aWNlR3JvdXA+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3Bvam9ndWlkZXNwcmluZy9zcmMvYXBwbGljYXRpb25Db250ZXh0LnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvcG9qb2d1aWRlc3ByaW5nL3NyYy9hcHBsaWNhdGlvbkNvbnRleHQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGRmY2I2Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvcG9qb2d1aWRlc3ByaW5nL3NyYy9hcHBsaWNhdGlvbkNvbnRleHQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08IURPQ1RZUEUgYmVhbnMgUFVCTElDICItLy9TUFJJTkcvL0RURCBCRUFOLy9FTiIgImh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9kdGQvc3ByaW5nLWJlYW5zLmR0ZCI+Ci0KLTxiZWFucz4KLSAgPGJlYW4gaWQ9ImFwcGxpY2F0aW9uQ29udGV4dCIgCi0gICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZXh0ZW5zaW9ucy5zcHJpbmcucmVjZWl2ZXJzLkFwcGxpY2F0aW9uQ29udGV4dEhvbGRlciIgLz4KLQotICA8YmVhbiBpZD0id2VhdGhlclNwcmluZ1NlcnZpY2UiIGNsYXNzPSJzYW1wbGUuc3ByaW5nLnNlcnZpY2UuV2VhdGhlclNwcmluZ1NlcnZpY2UiPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJ3ZWF0aGVyIiByZWY9IndlYXRoZXJCZWFuIi8+Ci0gIDwvYmVhbj4KLQotICA8YmVhbiBpZD0id2VhdGhlckJlYW4iIGNsYXNzPSJzYW1wbGUuc3ByaW5nLmJlYW4uV2VhdGhlciI+Ci0gICAgPHByb3BlcnR5IG5hbWU9InRlbXBlcmF0dXJlIiB2YWx1ZT0iODkuOSIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJmb3JlY2FzdCIgdmFsdWU9IlN1bm55Ii8+Ci0gICAgPHByb3BlcnR5IG5hbWU9InJhaW4iIHZhbHVlPSJmYWxzZSIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJob3dNdWNoUmFpbiIgdmFsdWU9IjAuMiIvPgotICA8L2JlYW4+Ci08L2JlYW5zPgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9wb2pvZ3VpZGVzcHJpbmcvc3JjL2NsaWVudC9XZWF0aGVyU3ByaW5nUlBDQ2xpZW50LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3Bvam9ndWlkZXNwcmluZy9zcmMvY2xpZW50L1dlYXRoZXJTcHJpbmdSUENDbGllbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNjOTA0My4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3Bvam9ndWlkZXNwcmluZy9zcmMvY2xpZW50L1dlYXRoZXJTcHJpbmdSUENDbGllbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGNsaWVudDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuT3B0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJwYy5jbGllbnQuUlBDU2VydmljZUNsaWVudDsKLQotaW1wb3J0IHNhbXBsZS5zcHJpbmcuYmVhbi5XZWF0aGVyOwotCi1wdWJsaWMgY2xhc3MgV2VhdGhlclNwcmluZ1JQQ0NsaWVudCB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzMSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0KLSAgICAgICAgUlBDU2VydmljZUNsaWVudCBzZXJ2aWNlQ2xpZW50ID0gbmV3IFJQQ1NlcnZpY2VDbGllbnQoKTsKLQotICAgICAgICBPcHRpb25zIG9wdGlvbnMgPSBzZXJ2aWNlQ2xpZW50LmdldE9wdGlvbnMoKTsKLQotICAgICAgICBFbmRwb2ludFJlZmVyZW5jZSB0YXJnZXRFUFIgCi0gICAgICAgICAgICAgICAgPSBuZXcgRW5kcG9pbnRSZWZlcmVuY2UoCi0gICAgICAgICAgICAgICAgImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9heGlzMi9zZXJ2aWNlcy9XZWF0aGVyU3ByaW5nU2VydmljZSIpOyAKLSAgICAgICAgCi0gICAgICAgIG9wdGlvbnMuc2V0VG8odGFyZ2V0RVBSKTsKLQotICAgICAgICAvLyBHZXQgdGhlIHdlYXRoZXIgKG5vIHNldHRpbmcsIHRoZSBTcHJpbmcgRnJhbWV3b3JrIGhhcyBhbHJlYWR5IGluaXRpYWxpemVkIGl0IGZvciB1cykKLSAgICAgICAgUU5hbWUgb3BHZXRXZWF0aGVyID0gbmV3IFFOYW1lKCJodHRwOi8vc2VydmljZS5zcHJpbmcuc2FtcGxlL3hzZCIsICJnZXRXZWF0aGVyIik7Ci0KLSAgICAgICAgT2JqZWN0W10gb3BHZXRXZWF0aGVyQXJncyA9IG5ldyBPYmplY3RbXSB7IH07Ci0gICAgICAgIENsYXNzW10gcmV0dXJuVHlwZXMgPSBuZXcgQ2xhc3NbXSB7IFdlYXRoZXIuY2xhc3MgfTsKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBPYmplY3RbXSByZXNwb25zZSA9IHNlcnZpY2VDbGllbnQuaW52b2tlQmxvY2tpbmcob3BHZXRXZWF0aGVyLAotICAgICAgICAgICAgICAgIG9wR2V0V2VhdGhlckFyZ3MsIHJldHVyblR5cGVzKTsKLSAgICAgICAgCi0gICAgICAgIFdlYXRoZXIgcmVzdWx0ID0gKFdlYXRoZXIpIHJlc3BvbnNlWzBdOwotICAgICAgICAKLSAgICAgICAgLy8gZGlzcGxheSByZXN1bHRzCi0gICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJXZWF0aGVyIGRpZG4ndCBpbml0aWFsaXplISIpOwotICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGVtcGVyYXR1cmUgICAgICAgICAgICAgICA6ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5nZXRUZW1wZXJhdHVyZSgpKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRm9yZWNhc3QgICAgICAgICAgICAgICAgICA6ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5nZXRGb3JlY2FzdCgpKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUmFpbiAgICAgICAgICAgICAgICAgICAgICA6ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5nZXRSYWluKCkpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJIb3cgbXVjaCByYWluIChpbiBpbmNoZXMpIDogIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmdldEhvd011Y2hSYWluKCkpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9wb2pvZ3VpZGVzcHJpbmcvc3JjL3NhbXBsZS9zcHJpbmcvYmVhbi9XZWF0aGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3Bvam9ndWlkZXNwcmluZy9zcmMvc2FtcGxlL3NwcmluZy9iZWFuL1dlYXRoZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdlMjUxNi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3Bvam9ndWlkZXNwcmluZy9zcmMvc2FtcGxlL3NwcmluZy9iZWFuL1dlYXRoZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIHNhbXBsZS5zcHJpbmcuYmVhbjsKLQotcHVibGljIGNsYXNzIFdlYXRoZXJ7Ci0gICAgZmxvYXQgdGVtcGVyYXR1cmU7Ci0gICAgU3RyaW5nIGZvcmVjYXN0OwotICAgIGJvb2xlYW4gcmFpbjsKLSAgICBmbG9hdCBob3dNdWNoUmFpbjsKLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRUZW1wZXJhdHVyZShmbG9hdCB0ZW1wKXsKLSAgICAgICAgdGVtcGVyYXR1cmUgPSB0ZW1wOwotICAgIH0KLQotICAgIHB1YmxpYyBmbG9hdCBnZXRUZW1wZXJhdHVyZSgpewotICAgICAgICByZXR1cm4gdGVtcGVyYXR1cmU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldEZvcmVjYXN0KFN0cmluZyBmb3JlKXsKLSAgICAgICAgZm9yZWNhc3QgPSBmb3JlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rm9yZWNhc3QoKXsKLSAgICAgICAgcmV0dXJuIGZvcmVjYXN0OwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRSYWluKGJvb2xlYW4gcil7Ci0gICAgICAgIHJhaW4gPSByOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGdldFJhaW4oKXsKLSAgICAgICAgcmV0dXJuIHJhaW47Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldEhvd011Y2hSYWluKGZsb2F0IGhvd011Y2gpewotICAgICAgICBob3dNdWNoUmFpbiA9IGhvd011Y2g7Ci0gICAgfQotCi0gICAgcHVibGljIGZsb2F0IGdldEhvd011Y2hSYWluKCl7Ci0gICAgICAgIHJldHVybiBob3dNdWNoUmFpbjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3Bvam9ndWlkZXNwcmluZy9zcmMvc2FtcGxlL3NwcmluZy9zZXJ2aWNlL1NwcmluZ0luaXQuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvcG9qb2d1aWRlc3ByaW5nL3NyYy9zYW1wbGUvc3ByaW5nL3NlcnZpY2UvU3ByaW5nSW5pdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmM5Mzk0Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvcG9qb2d1aWRlc3ByaW5nL3NyYy9zYW1wbGUvc3ByaW5nL3NlcnZpY2UvU3ByaW5nSW5pdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugc2FtcGxlLnNwcmluZy5zZXJ2aWNlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuU2VydmljZUxpZmVDeWNsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk9wZXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LlNlcnZpY2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5jb250ZXh0LnN1cHBvcnQuQ2xhc3NQYXRoWG1sQXBwbGljYXRpb25Db250ZXh0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBTcHJpbmdJbml0IGltcGxlbWVudHMgU2VydmljZUxpZmVDeWNsZSB7Ci0gICAgICAgIAotICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5Ci0gICAgICAgIC5nZXRMb2coU3ByaW5nSW5pdCAuY2xhc3MpOwotCi0gICAgLy8gVGhlIHdlYiBzZXJ2aWNlCi0gICAgcHVibGljIE9NRWxlbWVudCBzcHJpbmdJbml0KE9NRWxlbWVudCBpZ25vcmUpIHsKLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbml0KFNlcnZpY2VDb250ZXh0IHNlcnZpY2VDb250ZXh0KSB7Ci0gICAgICAgIAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE9wZXJhdGlvbkNvbnRleHQoT3BlcmF0aW9uQ29udGV4dCBhcmcwKSB7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkZXN0cm95KFNlcnZpY2VDb250ZXh0IGFyZzApIHsKLQotICAgIH0KLQotICAgICAvKioKLSAgICAgKiB0aGlzIHdpbGwgYmUgY2FsbGVkIGR1cmluZyB0aGUgZGVwbG95ZW1lbnQgdGltZSBvZiB0aGUgc2VydmljZS4gaXJyZXNwZWN0aXZlCi0gICAgICogb2YgdGhlIHNlcnZpY2Ugc2NvcGUgdGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdGFydFVwKENvbmZpZ3VyYXRpb25Db250ZXh0IGlnbm9yZSwgQXhpc1NlcnZpY2Ugc2VydmljZSkgewotICAgICAgICBDbGFzc0xvYWRlciBjbGFzc0xvYWRlciA9IHNlcnZpY2UuZ2V0Q2xhc3NMb2FkZXIoKTsKLSAgICAgICAgQ2xhc3NQYXRoWG1sQXBwbGljYXRpb25Db250ZXh0IGFwcEN0eCA9IG5ldwotICAgICAgICAgICAgQ2xhc3NQYXRoWG1sQXBwbGljYXRpb25Db250ZXh0KG5ldyBTdHJpbmdbXSB7ImFwcGxpY2F0aW9uQ29udGV4dC54bWwifSwgZmFsc2UpOwotICAgICAgICBhcHBDdHguc2V0Q2xhc3NMb2FkZXIoY2xhc3NMb2FkZXIpOwotICAgICAgICBhcHBDdHgucmVmcmVzaCgpOwotICAgICAgICBpZiAobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygiXG5cbnN0YXJ0VXAoKSBzZXQgc3ByaW5nIGNsYXNzbG9hZGVyIHZpYSBheGlzU2VydmljZS5nZXRDbGFzc0xvYWRlcigpIC4uLiAiKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAvKioKLSAgICAgKiB0aGlzIHdpbGwgYmUgY2FsbGVkIGR1cmluZyB0aGUgZGVwbG95ZW1lbnQgdGltZSBvZiB0aGUgc2VydmljZS4gaXJyZXNwZWN0aXZlCi0gICAgICogb2YgdGhlIHNlcnZpY2Ugc2NvcGUgdGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzaHV0RG93bihDb25maWd1cmF0aW9uQ29udGV4dCBpZ25vcmUsIEF4aXNTZXJ2aWNlIHNlcnZpY2UpIHsKLSAgICAgICAgCi0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvcG9qb2d1aWRlc3ByaW5nL3NyYy9zYW1wbGUvc3ByaW5nL3NlcnZpY2UvV2VhdGhlclNwcmluZ1NlcnZpY2UuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvcG9qb2d1aWRlc3ByaW5nL3NyYy9zYW1wbGUvc3ByaW5nL3NlcnZpY2UvV2VhdGhlclNwcmluZ1NlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI0NWExZi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3Bvam9ndWlkZXNwcmluZy9zcmMvc2FtcGxlL3NwcmluZy9zZXJ2aWNlL1dlYXRoZXJTcHJpbmdTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBzYW1wbGUuc3ByaW5nLnNlcnZpY2U7Ci0KLWltcG9ydCBzYW1wbGUuc3ByaW5nLmJlYW4uV2VhdGhlcjsKLQotcHVibGljIGNsYXNzIFdlYXRoZXJTcHJpbmdTZXJ2aWNlewotICAgIFdlYXRoZXIgd2VhdGhlcjsKLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRXZWF0aGVyKFdlYXRoZXIgdyl7Ci0gICAgICAgIHdlYXRoZXIgPSB3OwotICAgIH0KLQotICAgIHB1YmxpYyBXZWF0aGVyIGdldFdlYXRoZXIoKXsKLSAgICAgICAgcmV0dXJuIHdlYXRoZXI7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvcG9tLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg3OTA2MC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNzkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+MS41LjE8L3ZlcnNpb24+Ci0gICAgICAgIDxyZWxhdGl2ZVBhdGg+Li4vcGFyZW50L3BvbS54bWw8L3JlbGF0aXZlUGF0aD4KLSAgICA8L3BhcmVudD4KLSAgICA8YXJ0aWZhY3RJZD5heGlzMi1zYW1wbGVzPC9hcnRpZmFjdElkPgotICAgIDxuYW1lPkFwYWNoZSBBeGlzMiAtIFNhbXBsZXM8L25hbWU+Ci0gICAgPGRlc2NyaXB0aW9uPkNvcmUgUGFydHMgb2YgQXhpcyAyLjAuIFRoaXMgaW5jbHVkZXMgQXhpcyAyLjAgZW5naW5lLCBDbGllbnQgQVBJLCBBZGRyZXNzaW5nIHN1cHBvcnQsIGV0Yy4sCi0gICAgPC9kZXNjcmlwdGlvbj4KLSAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmphdmF4LnNlcnZsZXQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5zZXJ2bGV0LWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmNvbW1vbnMtaHR0cGNsaWVudDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtaHR0cGNsaWVudDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmNvbW1vbnMtZmlsZXVwbG9hZDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtZmlsZXVwbG9hZDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5odHRwY29yZTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPndzZGw0ajwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPndzZGw0ajwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPiR7c3RheC5pbXBsLmdyb3VwaWR9PC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+JHtzdGF4LmltcGwuYXJ0aWZhY3R9PC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPlhtbFNjaGVtYTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubmVldGhpPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bmVldGhpPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS53b2RlbjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPndvZGVuLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDxleGNsdXNpb25zPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPnhlcmNlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+eGVyY2VzSW1wbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD54bWwtYXBpczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+eG1sLWFwaXM8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICA8L2V4Y2x1c2lvbnM+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLndvZGVuPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+d29kZW4taW1wbC1kb208L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8ZXhjbHVzaW9ucz4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD54ZXJjZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnhlcmNlc0ltcGw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+eG1sLWFwaXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnhtbC1hcGlzPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgPC9leGNsdXNpb25zPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1sb2dnaW5nPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1sb2dnaW5nPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPC9kZXBlbmRlbmNpZXM+Ci0gICAgPGJ1aWxkPgotICAgICAgICA8c291cmNlRGlyZWN0b3J5PnNyYzwvc291cmNlRGlyZWN0b3J5PgotICAgICAgICA8dGVzdFNvdXJjZURpcmVjdG9yeT50ZXN0PC90ZXN0U291cmNlRGlyZWN0b3J5PgotICAgICAgICA8cmVzb3VyY2VzPgotICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+Y29uZjwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxleGNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovKi5wcm9wZXJ0aWVzPC9leGNsdWRlPgotICAgICAgICAgICAgICAgIDwvZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgPGZpbHRlcmluZz5mYWxzZTwvZmlsdGVyaW5nPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYzwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxleGNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovKi5qYXZhPC9leGNsdWRlPgotICAgICAgICAgICAgICAgIDwvZXhjbHVkZXM+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICA8L3Jlc291cmNlcz4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHNraXA+ZmFsc2U8L3NraXA+Ci0gICAgICAgICAgICAgICAgICAgIDxleGNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqLypBYnN0cmFjdCouamF2YTwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqLypVdGlsKi5qYXZhPC9leGNsdWRlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovKlBoYXNlUmVzb2x2aW5nVGVzdC5qYXZhPC9leGNsdWRlPgotICAgICAgICAgICAgICAgICAgICA8L2V4Y2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qVGVzdC5qYXZhPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYW50cnVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5wcm9jZXNzLXRlc3QtcmVzb3VyY2VzPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wcm9jZXNzLXRlc3QtcmVzb3VyY2VzPC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YXNrcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1rZGlyIGRpcj0idGFyZ2V0L3ZlcnNpb24iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGphciBkZXN0ZmlsZT0idGFyZ2V0L3ZlcnNpb24vdmVyc2lvbi5qYXIiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJ2ZXJzaW9uL3RhcmdldC9jbGFzc2VzIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJzYW1wbGUvYXhpc3ZlcnNpb24vKioiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0idmVyc2lvbi9zcmMvc2FtcGxlL2F4aXN2ZXJzaW9uLyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iTUVUQS1JTkYvc2VydmljZXMueG1sIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvamFyPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29weSBmaWxlPSJ0YXJnZXQvdmVyc2lvbi92ZXJzaW9uLmphciIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9maWxlPSJ0YXJnZXQvdG9XYXIvc2VydmljZXMvdmVyc2lvbi5hYXIiLz4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFza3M+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+cnVuPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+dGVzdC1jb21waWxlPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT50ZXN0LWNvbXBpbGU8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhc2tzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ibWF2ZW4uYnVpbGQuZGlyIiBsb2NhdGlvbj0iJHtiYXNlZGlyfS90YXJnZXQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rhc2tzPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnJ1bjwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgPC9idWlsZD4KLTwvcHJvamVjdD4KLQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9xdWlja3N0YXJ0L1JFQURNRS50eHQgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3F1aWNrc3RhcnQvUkVBRE1FLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY0ZGMzNy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3F1aWNrc3RhcnQvUkVBRE1FLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLUF4aXMyIFF1aWNrIFN0YXJ0IEd1aWRlLSBTYW1wbGUgMQ0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLQ0KLVRoaXMgc2FtcGxlIGNvbnRhaW5zIHNvdXJjZSBjb2RlIGZvciB0aGUgeGRvY3MvMV8xL3F1aWNrc3RhcnRndWlkZS5odG1sIGRvY3VtZW50IGZvdW5kIGluIA0KLXRoZSBleHRyYWN0ZWQgQXhpczIgRG9jdW1lbnRzIERpc3RyaWJ1dGlvbi4gRm9yIGEgbW9yZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvbiB0aGUgDQotc291cmNlIGNvZGUga2luZGx5IHNlZSB0aGlzICdBeGlzMiBRdWljayBTdGFydCBHdWlkZScgZG9jdW1lbnQuDQotDQotSW50cm9kdWN0aW9uDQotPT09PT09PT09PT09DQotSW4gdGhpcyBzYW1wbGUsIHdlIGFyZSBkZXBsb3lpbmcgYSBQT0pPIGFmdGVyIHdyaXRpbmcgYSBzZXJ2aWNlcy54bWwgYW5kDQotY3JlYXRpbmcgYW4gYWFyLiBXZSBhbHNvIHRlc3QgdGhlIGdlUHJpY2UgYW5kIHVwZGF0ZSBtZXRob2RzIHVzaW5nIGEgYnJvd3Nlci4NCi0NCi1QcmUtUmVxdWlzaXRlcw0KLT09PT09PT09PT09PT09DQotDQotQXBhY2hlIEFudCAxLjYuMiBvciBsYXRlcg0KLQ0KLUJ1aWxkaW5nIHRoZSBTZXJ2aWNlDQotPT09PT09PT09PT09PT09PT09PT0NCi0NCi1UeXBlICJhbnQgZ2VuZXJhdGUuc2VydmljZSIgb3IganVzdCAiYW50IiBmcm9tIEF4aXMyX0hPTUUvc2FtcGxlcy9xdWlja3N0YXJ0IGRpcmVjdG9yeSANCi1hbmQgdGhlbiBkZXBsb3kgdGhlIEF4aXMyX0hPTUUvc2FtcGxlcy9xdWlja3N0YXJ0L2J1aWxkL1N0b2NrUXVvdGVTZXJ2aWNlLmFhcg0KLQ0KLUdlbmVyYXRlIFdTREwNCi09PT09PT09PT09PT09PQ0KLQ0KLVR5cGUgImFudCBnZW5lcmF0ZS53c2RsIiBmcm9tIEF4aXMyX0hPTUUvc2FtcGxlcy9xdWlja3N0YXJ0IGRpcmVjdG9yeSB3aGljaCBnZW5lcmF0ZXMgYSANCi1XU0RMIGZpbGUgZm9yIHRoZSBhYm92ZSBXZWIgc2VydmljZSBhbmQgaXQgd2lsbCBiZSBwbGFjZWQgaW4gQXhpczJfSE9NRS9zYW1wbGVzL3F1aWNrc3RhcnQvYnVpbGQgDQotZGlyZWN0b3J5Lg0KLQ0KLVJ1bm5pbmcgdGhlIENsaWVudA0KLT09PT09PT09PT09PT09PT09PQ0KLS0gRnJvbSB5b3VyIGJyb3dzZXIsIElmIHlvdSBwb2ludCB0byB0aGUgZm9sbG93aW5nIFVSTDoNCi1odHRwOi8vbG9jYWxob3N0OjgwODAvYXhpczIvc2VydmljZXMvU3RvY2tRdW90ZVNlcnZpY2UvZ2V0UHJpY2U/c3ltYm9sPUlCTQ0KLQ0KLVlvdSB3aWxsIGdldCB0aGUgZm9sbG93aW5nIHJlc3BvbnNlOg0KLTxuczpnZXRQcmljZVJlc3BvbnNlPjxuczpyZXR1cm4+NDIuMDwvbnM6cmV0dXJuPjwvbnM6Z2V0UHJpY2VSZXNwb25zZT4NCi0NCi0tIElmIHlvdSBpbnZva2UgdGhlIHVwZGF0ZSBtZXRob2QgbGlrZSBzbzoNCi1odHRwOi8vbG9jYWxob3N0OjgwODAvYXhpczIvc2VydmljZXMvU3RvY2tRdW90ZVNlcnZpY2UvdXBkYXRlP3N5bWJvbD1JQk0mcHJpY2U9MTAwDQotDQotQW5kIHRoZW4gZXhlY3V0ZSB0aGUgZmlyc3QgZ2V0UHJpY2UgdXJsLiBZb3UgY2FuIHNlZSB0aGF0IHRoZSBwcmljZSBnb3QgdXBkYXRlZC4NCi0NCi1IZWxwDQotPT09PQ0KLVBsZWFzZSBjb250YWN0IGF4aXMtdXNlciBsaXN0IChheGlzLXVzZXJAd3MuYXBhY2hlLm9yZykgaWYgeW91IGhhdmUgYW55IHRyb3VibGUgcnVubmluZyB0aGUgc2FtcGxlLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvcXVpY2tzdGFydC9idWlsZC54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3F1aWNrc3RhcnQvYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzc1ZWEzLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvcXVpY2tzdGFydC9idWlsZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxwcm9qZWN0IG5hbWU9InF1aWNrc3RhcnQiIGJhc2VkaXI9Ii4iIGRlZmF1bHQ9ImdlbmVyYXRlLnNlcnZpY2UiPgotCi0gICAgPHByb3BlcnR5IGVudmlyb25tZW50PSJlbnYiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iQVhJUzJfSE9NRSIgdmFsdWU9Ii4uLy4uIi8+Ci0KLSAgICA8cHJvcGVydHkgbmFtZT0iYnVpbGQuZGlyIiB2YWx1ZT0iYnVpbGQiLz4KLQotICAgIDxwYXRoIGlkPSJheGlzMi5jbGFzc3BhdGgiPgotICAgICAgICA8ZmlsZXNldCBkaXI9IiR7QVhJUzJfSE9NRX0vbGliIj4KLSAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIi8+Ci0gICAgICAgIDwvZmlsZXNldD4KLSAgICA8L3BhdGg+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUuc2VydmljZSI+Ci0gICAgICAgIDxta2RpciBkaXI9IiR7YnVpbGQuZGlyfSIvPgotICAgICAgICA8bWtkaXIgZGlyPSIke2J1aWxkLmRpcn0vY2xhc3NlcyIvPgotCi0gICAgICAgIDwhLS1GaXJzdCBsZXQncyBjb21waWxlIHRoZSBjbGFzc2VzLS0+Ci0gICAgICAgIDxqYXZhYyBkZWJ1Zz0ib24iIAotICAgICAgICAgICAgICAgZm9yaz0idHJ1ZSIKLSAgICAgICAgICAgICAgIGRlc3RkaXI9IiR7YnVpbGQuZGlyfS9jbGFzc2VzIiAKLSAgICAgICAgICAgICAgIHNyY2Rpcj0iJHtiYXNlZGlyfS9zcmMiCi0gICAgICAgICAgICAgICBjbGFzc3BhdGhyZWY9ImF4aXMyLmNsYXNzcGF0aCI+Ci0gICAgICAgIDwvamF2YWM+Ci0gICAgPC90YXJnZXQ+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9ImdlbmVyYXRlLndzZGwiIGRlcGVuZHM9ImNvbXBpbGUuc2VydmljZSI+Ci0gICAgICAgIDx0YXNrZGVmIG5hbWU9ImphdmEyd3NkbCIKLSAgICAgICAgICAgICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLndzLmphdmEyd3NkbC5KYXZhMldTRExUYXNrIgotICAgICAgICAgICAgICAgICBjbGFzc3BhdGhyZWY9ImF4aXMyLmNsYXNzcGF0aCIvPgotICAgICAgICA8amF2YTJ3c2RsIGNsYXNzTmFtZT0ic2FtcGxlcy5xdWlja3N0YXJ0LnNlcnZpY2UucG9qby5TdG9ja1F1b3RlU2VydmljZSIKLSAgICAgICAgICAgICAgICAgICBvdXRwdXRMb2NhdGlvbj0iJHtidWlsZC5kaXJ9IgotICAgICAgICAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3F1aWNrc3RhcnQuc2FtcGxlcy8iCi0gICAgICAgICAgICAgICAgICAgc2NoZW1hVGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vcXVpY2tzdGFydC5zYW1wbGVzL3hzZCI+Ci0gICAgICAgICAgICA8Y2xhc3NwYXRoPgotICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke2F4aXMyLmNsYXNzcGF0aH0iLz4KLSAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7YnVpbGQuZGlyfS9jbGFzc2VzIi8+Ci0gICAgICAgICAgICA8L2NsYXNzcGF0aD4KLSAgICAgICAgPC9qYXZhMndzZGw+Ci0gICAgPC90YXJnZXQ+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9ImdlbmVyYXRlLnNlcnZpY2UiIGRlcGVuZHM9ImNvbXBpbGUuc2VydmljZSI+Ci0gICAgICAgIDwhLS1hYXIgdGhlbSB1cCAtLT4KLSAgICAgICAgPGNvcHkgdG9EaXI9IiR7YnVpbGQuZGlyfS9jbGFzc2VzIiBmYWlsb25lcnJvcj0iZmFsc2UiPgotICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke2Jhc2VkaXJ9L3Jlc291cmNlcyI+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi54bWwiLz4KLSAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgPC9jb3B5PgotICAgICAgICA8amFyIGRlc3RmaWxlPSIke2J1aWxkLmRpcn0vU3RvY2tRdW90ZVNlcnZpY2UuYWFyIj4KLSAgICAgICAgICAgIDxmaWxlc2V0IGV4Y2x1ZGVzPSIqKi9UZXN0LmNsYXNzIiBkaXI9IiR7YnVpbGQuZGlyfS9jbGFzc2VzIi8+Ci0gICAgICAgIDwvamFyPgotICAgIDwvdGFyZ2V0PgotCi0gICAgPHRhcmdldCBuYW1lPSJjbGVhbiI+Ci0gICAgICAgIDxkZWxldGUgZGlyPSIke2J1aWxkLmRpcn0iLz4KLSAgICA8L3RhcmdldD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvcXVpY2tzdGFydC9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9xdWlja3N0YXJ0L3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyMjc4OWEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9xdWlja3N0YXJ0L3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzZXJ2aWNlIG5hbWU9IlN0b2NrUXVvdGVTZXJ2aWNlIiBzY29wZT0iYXBwbGljYXRpb24iIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3F1aWNrc3RhcnQuc2FtcGxlcy8iPgotICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgU3RvY2sgUXVvdGUgU2VydmljZQotICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgPG1lc3NhZ2VSZWNlaXZlcnM+Ci0gICAgICAgIDxtZXNzYWdlUmVjZWl2ZXIgbWVwPSJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaW4tb25seSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5ycGMucmVjZWl2ZXJzLlJQQ0luT25seU1lc3NhZ2VSZWNlaXZlciIvPgotICAgICAgICA8bWVzc2FnZVJlY2VpdmVyIG1lcD0iaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC93c2RsL2luLW91dCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5ycGMucmVjZWl2ZXJzLlJQQ01lc3NhZ2VSZWNlaXZlciIvPgotICAgIDwvbWVzc2FnZVJlY2VpdmVycz4KLSAgICA8c2NoZW1hIHNjaGVtYU5hbWVzcGFjZT0iaHR0cDovL3F1aWNrc3RhcnQuc2FtcGxlcy94c2QiLz4KLSAgICA8cGFyYW1ldGVyIG5hbWU9IlNlcnZpY2VDbGFzcyI+c2FtcGxlcy5xdWlja3N0YXJ0LnNlcnZpY2UucG9qby5TdG9ja1F1b3RlU2VydmljZTwvcGFyYW1ldGVyPgotPC9zZXJ2aWNlPgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9xdWlja3N0YXJ0L3NyYy9zYW1wbGVzL3F1aWNrc3RhcnQvc2VydmljZS9wb2pvL1N0b2NrUXVvdGVTZXJ2aWNlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3F1aWNrc3RhcnQvc3JjL3NhbXBsZXMvcXVpY2tzdGFydC9zZXJ2aWNlL3Bvam8vU3RvY2tRdW90ZVNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJmNmI3OC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3F1aWNrc3RhcnQvc3JjL3NhbXBsZXMvcXVpY2tzdGFydC9zZXJ2aWNlL3Bvam8vU3RvY2tRdW90ZVNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIHNhbXBsZXMucXVpY2tzdGFydC5zZXJ2aWNlLnBvam87Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotcHVibGljIGNsYXNzIFN0b2NrUXVvdGVTZXJ2aWNlIHsKLSAgICBwcml2YXRlIEhhc2hNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLQotICAgIHB1YmxpYyBkb3VibGUgZ2V0UHJpY2UoU3RyaW5nIHN5bWJvbCkgewotICAgICAgICBEb3VibGUgcHJpY2UgPSAoRG91YmxlKSBtYXAuZ2V0KHN5bWJvbCk7Ci0gICAgICAgIGlmKHByaWNlICE9IG51bGwpewotICAgICAgICAgICAgcmV0dXJuIHByaWNlLmRvdWJsZVZhbHVlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDQyLjAwOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZShTdHJpbmcgc3ltYm9sLCBkb3VibGUgcHJpY2UpIHsKLSAgICAgICAgbWFwLnB1dChzeW1ib2wsIG5ldyBEb3VibGUocHJpY2UpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3F1aWNrc3RhcnRhZGIvUkVBRE1FLnR4dCBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvcXVpY2tzdGFydGFkYi9SRUFETUUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODllOGRmLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvcXVpY2tzdGFydGFkYi9SRUFETUUudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotQXhpczIgUXVpY2sgU3RhcnQgR3VpZGUtIFNhbXBsZSAyIChBREIpDQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0NCi1UaGlzIHNhbXBsZSBjb250YWlucyBzb3VyY2UgY29kZSBmb3IgdGhlIHhkb2NzLzFfMS9xdWlja3N0YXJ0Z3VpZGUuaHRtbCBkb2N1bWVudCBmb3VuZCBpbiANCi10aGUgZXh0cmFjdGVkIEF4aXMyIERvY3VtZW50cyBEaXN0cmlidXRpb24uIEZvciBhIG1vcmUgZGV0YWlsZWQgZGVzY3JpcHRpb24gb24gdGhlIA0KLXNvdXJjZSBjb2RlIGtpbmRseSBzZWUgdGhpcyAnQXhpczIgUXVpY2sgU3RhcnQgR3VpZGUnIGRvY3VtZW50Lg0KLQ0KLUludHJvZHVjdGlvbg0KLT09PT09PT09PT09PQ0KLQ0KLUluIHRoaXMgc2FtcGxlLCB3ZSBhcmUgZGVwbG95aW5nIGFuIEFEQiBnZW5lcmF0ZWQgc2VydmljZS4gVGhlIHNlcnZpY2UNCi1pcyB0ZXN0ZWQgdXNpbmcgZ2VuZXJhdGVkIGNsaWVudCBzdHVicy4NCi0NCi1QcmUtUmVxdWlzaXRlcw0KLT09PT09PT09PT09PT09DQotDQotQXBhY2hlIEFudCAxLjYuMiBvciBsYXRlcg0KLQ0KLUJ1aWxkaW5nIHRoZSBTZXJ2aWNlDQotPT09PT09PT09PT09PT09PT09PT0NCi0NCi1UeXBlICJhbnQgZ2VuZXJhdGUuc2VydmljZSIgZnJvbSBBeGlzMl9IT01FL3NhbXBsZXMvcXVpY2tzdGFydGFkYg0KLWRpcmVjdG9yeSBhbmQgdGhlbiBkZXBsb3kgdGhlIA0KLUF4aXMyX0hPTUUvc2FtcGxlcy9xdWlja3N0YXJ0YWRiL2J1aWxkL3NlcnZpY2UvYnVpbGQvbGliL1N0b2NrUXVvdGVTZXJ2aWNlLmFhcg0KLQ0KLVJ1bm5pbmcgdGhlIENsaWVudA0KLT09PT09PT09PT09PT09PT09PQ0KLQ0KLXR5cGUgYW50IHJ1bi5jbGllbnQgaW4gdGhlIEF4aXMyX0hPTUUvc2FtcGxlcy9xdWlja3N0YXJ0YWRiIGRpcmVjdG9yeQ0KLQ0KLUhlbHANCi09PT09DQotUGxlYXNlIGNvbnRhY3QgYXhpcy11c2VyIGxpc3QgKGF4aXMtdXNlckB3cy5hcGFjaGUub3JnKSBpZiB5b3UNCi1oYXZlIGFueSB0cm91YmxlIHJ1bm5pbmcgdGhlIHNhbXBsZS4NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3F1aWNrc3RhcnRhZGIvYnVpbGQueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9xdWlja3N0YXJ0YWRiL2J1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ5ZGU5NC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3F1aWNrc3RhcnRhZGIvYnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHByb2plY3QgbmFtZT0icXVpY2tzdGFydGFkYiIgYmFzZWRpcj0iLiIgZGVmYXVsdD0iZ2VuZXJhdGUuc2VydmljZSI+Ci0KLSAgICA8cHJvcGVydHkgZW52aXJvbm1lbnQ9ImVudiIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJBWElTMl9IT01FIiB2YWx1ZT0iLi4vLi4iLz4KLQotCTxwcm9wZXJ0eSBuYW1lPSJ3c2RsLnVyaSIgdmFsdWU9Ii4vcmVzb3VyY2VzL01FVEEtSU5GL1N0b2NrUXVvdGVTZXJ2aWNlLndzZGwiLz4KLQk8cHJvcGVydHkgbmFtZT0ic2VydmljZS50YXJnZXQiIHZhbHVlPSJidWlsZC9zZXJ2aWNlIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImNsaWVudC50YXJnZXQiIHZhbHVlPSJidWlsZC9jbGllbnQiLz4KLQotICAgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC5kaXIiIHZhbHVlPSJidWlsZCIvPgotCi0gICAgPHBhdGggaWQ9ImF4aXMyLmNsYXNzcGF0aCI+Ci0gICAgICAgIDxmaWxlc2V0IGRpcj0iJHtBWElTMl9IT01FfS9saWIiPgotICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKi5qYXIiLz4KLSAgICAgICAgPC9maWxlc2V0PgotICAgIDwvcGF0aD4KLSAgICA8cGF0aCBpZD0iY2xpZW50LmNsYXNzLnBhdGgiPgotICAgICAgICA8ZmlsZXNldCBkaXI9IiR7QVhJUzJfSE9NRX0vbGliIj4KLSAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIiAvPgotICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgIDxmaWxlc2V0IGRpcj0iJHtidWlsZC5kaXJ9L2NsaWVudC9idWlsZC9saWIiID4KLSAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIiAvPgotICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgPC9wYXRoPgotCi0gICAgPHRhcmdldCBuYW1lPSJpbml0Ij4KLSAgICAgICAgPG1rZGlyIGRpcj0iJHtidWlsZC5kaXJ9Ii8+Ci0gICAgICAgIDxta2RpciBkaXI9IiR7YnVpbGQuZGlyfS9zZXJ2aWNlIi8+Ci0gICAgICAgIDxta2RpciBkaXI9IiR7YnVpbGQuZGlyfS9jbGllbnQiLz4KLSAgICA8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0iZ2VuZXJhdGUuc2VydmljZSI+Ci0gICAgICAgIDxkZWxldGUgZGlyPSIke3NlcnZpY2UudGFyZ2V0fSIvPgotICAgICAgICA8bWtkaXIgZGlyPSIke3NlcnZpY2UudGFyZ2V0fSIvPgotICAgICAgICA8bWtkaXIgZGlyPSIke3NlcnZpY2UudGFyZ2V0fS9jbGFzc2VzIi8+Ci0gICAgICAgIDxqYXZhIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5heGlzMi53c2RsLldTREwySmF2YSIgZm9yaz0idHJ1ZSIgY2xhc3NwYXRocmVmPSJheGlzMi5jbGFzc3BhdGgiPgotICAgICAgICAgICAgPGFyZyBsaW5lPSItdXJpICR7d3NkbC51cml9Ii8+Ci0JCQk8YXJnIGxpbmU9Ii1zIi8+Ci0gICAgICAgICAgICA8YXJnIGxpbmU9Ii1zcyIvPgotICAgICAgICAgICAgPGFyZyBsaW5lPSItc2QiLz4KLQkJCTxhcmcgbGluZT0iLXNzaSIvPgotICAgICAgICAgICAgPGFyZyBsaW5lPSItYXAiLz4KLQkJCTxhcmcgbGluZT0iLW5zMnAgaHR0cDovL3F1aWNrc3RhcnQuc2FtcGxlcy94c2Q9c2FtcGxlcy5xdWlja3N0YXJ0LnNlcnZpY2UuYWRiLnhzZCIvPgotCQkJPGFyZyBsaW5lPSItbCBqYXZhIi8+Ci0gICAgICAgICAgICA8YXJnIGxpbmU9Ii1wIHNhbXBsZXMucXVpY2tzdGFydC5zZXJ2aWNlLmFkYiIvPgotICAgICAgICAgICAgPGFyZyBsaW5lPSItZCBhZGIiLz4KLSAgICAgICAgICAgIDxhcmcgbGluZT0iLW8gJHtidWlsZC5kaXJ9L3NlcnZpY2UiLz4KLSAgICAgICAgPC9qYXZhPgotICAgICAgICAKLQkJPGNvcHkgZmlsZT0iJHtiYXNlZGlyfS9zcmMvc2FtcGxlcy9xdWlja3N0YXJ0L3NlcnZpY2UvYWRiL1N0b2NrUXVvdGVTZXJ2aWNlU2tlbGV0b24uamF2YSIKLSAgICAgICAgICAgICAgdG9EaXI9IiR7YnVpbGQuZGlyfS9zZXJ2aWNlL3NyYy9zYW1wbGVzL3F1aWNrc3RhcnQvc2VydmljZS9hZGIvIgotICAgICAgICAgICAgICBvdmVyd3JpdGU9InllcyI+ICAgIAotICAgICAgICA8L2NvcHk+Ci0gICAgICAgIDxjb3B5IGZpbGU9IiR7YmFzZWRpcn0vcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzLnhtbCIKLSAgICAgICAgICAgICAgdG9EaXI9IiR7YnVpbGQuZGlyfS9zZXJ2aWNlL3Jlc291cmNlcy8iCi0gICAgICAgICAgICAgIG92ZXJ3cml0ZT0ieWVzIj4KLSAgICAgICAgPC9jb3B5PgotICAgICAgICA8YW50IGRpcj0iJHtidWlsZC5kaXJ9L3NlcnZpY2UiPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImF4aXMyLmhvbWUiIHZhbHVlPSIuLi8uLi8ke0FYSVMyX0hPTUV9Ii8+Ci0gICAgICAgIDwvYW50PiAKLQkJPGNvcHkgZmlsZT0iJHtiYXNlZGlyfS9idWlsZC9zZXJ2aWNlL2J1aWxkL2xpYi9TdG9ja1F1b3RlU2VydmljZS5hYXIiCi0gICAgICAgICAgICAgIHRvRGlyPSIke2Jhc2VkaXJ9Ly4uLy4uL3JlcG9zaXRvcnkvc2VydmljZXMiCi0gICAgICAgICAgICAgIG92ZXJ3cml0ZT0ieWVzIj4KLSAgICAgICAgPC9jb3B5PgotCQkKLSAgICA8L3RhcmdldD4KLQotICAgIDx0YXJnZXQgbmFtZT0iZ2VuZXJhdGUuY2xpZW50Ij4KLQkJPGRlbGV0ZSBkaXI9IiR7Y2xpZW50LnRhcmdldH0iLz4KLQkJPG1rZGlyIGRpcj0iJHtjbGllbnQudGFyZ2V0fSIvPgotICAgICAgICAgPGphdmEgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmF4aXMyLndzZGwuV1NETDJKYXZhIiBmb3JrPSJ0cnVlIiBjbGFzc3BhdGhyZWY9ImF4aXMyLmNsYXNzcGF0aCI+Ci0gICAgICAgICAgICA8YXJnIGxpbmU9Ii11cmkgJHt3c2RsLnVyaX0iLz4KLQkJCTxhcmcgbGluZT0iLXMiLz4KLSAgICAgICAgICAgIDxhcmcgbGluZT0iLW5zMnAgaHR0cDovL3F1aWNrc3RhcnQuc2FtcGxlcy94c2Q9c2FtcGxlcy5xdWlja3N0YXJ0LnNlcnZpY2UuYWRiLnhzZCIvPgotCQkJPGFyZyBsaW5lPSItbCBqYXZhIi8+Ci0gICAgICAgICAgICA8YXJnIGxpbmU9Ii1wIHNhbXBsZXMucXVpY2tzdGFydC5zZXJ2aWNlLmFkYiIvPgotICAgICAgICAgICAgPGFyZyBsaW5lPSItZCBhZGIiLz4KLSAgICAgICAgICAgIDxhcmcgbGluZT0iLW8gJHtidWlsZC5kaXJ9L2NsaWVudCIvPgotICAgICAgICA8L2phdmE+Ci0gICAgICAgIDxjb3B5IGZpbGU9IiR7YmFzZWRpcn0vc3JjL3NhbXBsZXMvcXVpY2tzdGFydC9jbGllbnRzL0FEQkNsaWVudC5qYXZhIgotICAgICAgICAgICAgICB0b0Rpcj0iJHtidWlsZC5kaXJ9L2NsaWVudC9zcmMvc2FtcGxlcy9xdWlja3N0YXJ0L2NsaWVudHMvIgotICAgICAgICAgICAgICBvdmVyd3JpdGU9InllcyI+Ci0gICAgICAgIDwvY29weT4KLSAgICAgICAgPGFudCBkaXI9IiR7YnVpbGQuZGlyfS9jbGllbnQiPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImF4aXMyLmhvbWUiIHZhbHVlPSIuLi8uLi8ke0FYSVMyX0hPTUV9Ii8+Ci0gICAgICAgIDwvYW50PgotCQkKLSAgICA8L3RhcmdldD4KLQotICAgIDx0YXJnZXQgbmFtZT0iZ2VuZXJhdGUuYWxsIiBkZXBlbmRzPSJnZW5lcmF0ZS5zZXJ2aWNlLCBnZW5lcmF0ZS5jbGllbnQiLz4KLQotICAgIDx0YXJnZXQgbmFtZT0icnVuLmNsaWVudCIgZGVwZW5kcz0iZ2VuZXJhdGUuY2xpZW50Ij4KLSAgICAgICAgPGphdmEgY2xhc3NuYW1lPSJzYW1wbGVzLnF1aWNrc3RhcnQuY2xpZW50cy5BREJDbGllbnQiPgotICAgICAgICAgICAgPGNsYXNzcGF0aCByZWZpZD0iY2xpZW50LmNsYXNzLnBhdGgiIC8+Ci0gICAgICAgIDwvamF2YT4KLSAgICA8L3RhcmdldD4KLQotICAgIDx0YXJnZXQgbmFtZT0iY2xlYW4iPgotICAgICAgICA8ZGVsZXRlIGRpcj0iJHtidWlsZC5kaXJ9Ii8+Ci0gICAgPC90YXJnZXQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3F1aWNrc3RhcnRhZGIvcmVzb3VyY2VzL01FVEEtSU5GL1N0b2NrUXVvdGVTZXJ2aWNlLndzZGwgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3F1aWNrc3RhcnRhZGIvcmVzb3VyY2VzL01FVEEtSU5GL1N0b2NrUXVvdGVTZXJ2aWNlLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlM2QzODMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9xdWlja3N0YXJ0YWRiL3Jlc291cmNlcy9NRVRBLUlORi9TdG9ja1F1b3RlU2VydmljZS53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08d3NkbDpkZWZpbml0aW9ucyB4bWxuczpheGlzMj0iaHR0cDovL3F1aWNrc3RhcnQuc2FtcGxlcy8iIHhtbG5zOnNvYXAxMj0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwMTIvIiB4bWxuczpodHRwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL2h0dHAvIiB4bWxuczptaW1lPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL21pbWUvIiB4bWxuczpucz0iaHR0cDovL3F1aWNrc3RhcnQuc2FtcGxlcy94c2QiIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9xdWlja3N0YXJ0LnNhbXBsZXMvIj48d3NkbDp0eXBlcz48eHM6c2NoZW1hIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgYXR0cmlidXRlRm9ybURlZmF1bHQ9InF1YWxpZmllZCIgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3F1aWNrc3RhcnQuc2FtcGxlcy94c2QiPgotPHhzOmVsZW1lbnQgbmFtZT0iZ2V0UHJpY2UiPgotPHhzOmNvbXBsZXhUeXBlPgotPHhzOnNlcXVlbmNlPgotPHhzOmVsZW1lbnQgbmFtZT0ic3ltYm9sIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHM6c3RyaW5nIiAvPgotPC94czpzZXF1ZW5jZT4KLTwveHM6Y29tcGxleFR5cGU+Ci08L3hzOmVsZW1lbnQ+Ci08eHM6ZWxlbWVudCBuYW1lPSJnZXRQcmljZVJlc3BvbnNlIj4KLTx4czpjb21wbGV4VHlwZT4KLTx4czpzZXF1ZW5jZT4KLTx4czplbGVtZW50IG5hbWU9InJldHVybiIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzOmRvdWJsZSIgLz4KLTwveHM6c2VxdWVuY2U+Ci08L3hzOmNvbXBsZXhUeXBlPgotPC94czplbGVtZW50PgotPHhzOmVsZW1lbnQgbmFtZT0idXBkYXRlIj4KLTx4czpjb21wbGV4VHlwZT4KLTx4czpzZXF1ZW5jZT4KLTx4czplbGVtZW50IG5hbWU9InN5bWJvbCIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzOnN0cmluZyIgLz4KLTx4czplbGVtZW50IG5hbWU9InByaWNlIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHM6ZG91YmxlIiAvPgotPC94czpzZXF1ZW5jZT4KLTwveHM6Y29tcGxleFR5cGU+Ci08L3hzOmVsZW1lbnQ+Ci08L3hzOnNjaGVtYT48L3dzZGw6dHlwZXM+PHdzZGw6bWVzc2FnZSBuYW1lPSJnZXRQcmljZU1lc3NhZ2UiPjx3c2RsOnBhcnQgbmFtZT0icGFydDEiIGVsZW1lbnQ9Im5zOmdldFByaWNlIiAvPjwvd3NkbDptZXNzYWdlPjx3c2RsOm1lc3NhZ2UgbmFtZT0iZ2V0UHJpY2VSZXNwb25zZU1lc3NhZ2UiPjx3c2RsOnBhcnQgbmFtZT0icGFydDEiIGVsZW1lbnQ9Im5zOmdldFByaWNlUmVzcG9uc2UiIC8+PC93c2RsOm1lc3NhZ2U+PHdzZGw6bWVzc2FnZSBuYW1lPSJ1cGRhdGVNZXNzYWdlIj48d3NkbDpwYXJ0IG5hbWU9InBhcnQxIiBlbGVtZW50PSJuczp1cGRhdGUiIC8+PC93c2RsOm1lc3NhZ2U+PHdzZGw6cG9ydFR5cGUgbmFtZT0iU3RvY2tRdW90ZVNlcnZpY2VQb3J0VHlwZSI+PHdzZGw6b3BlcmF0aW9uIG5hbWU9ImdldFByaWNlIj48d3NkbDppbnB1dCBtZXNzYWdlPSJheGlzMjpnZXRQcmljZU1lc3NhZ2UiIC8+PHdzZGw6b3V0cHV0IG1lc3NhZ2U9ImF4aXMyOmdldFByaWNlUmVzcG9uc2VNZXNzYWdlIiAvPjwvd3NkbDpvcGVyYXRpb24+PHdzZGw6b3BlcmF0aW9uIG5hbWU9InVwZGF0ZSI+PHdzZGw6aW5wdXQgbWVzc2FnZT0iYXhpczI6dXBkYXRlTWVzc2FnZSIgLz48L3dzZGw6b3BlcmF0aW9uPjwvd3NkbDpwb3J0VHlwZT48d3NkbDpiaW5kaW5nIG5hbWU9IlN0b2NrUXVvdGVTZXJ2aWNlU09BUDExQmluZGluZyIgdHlwZT0iYXhpczI6U3RvY2tRdW90ZVNlcnZpY2VQb3J0VHlwZSI+PHNvYXA6YmluZGluZyB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIgc3R5bGU9ImRvY3VtZW50IiAvPjx3c2RsOm9wZXJhdGlvbiBuYW1lPSJnZXRQcmljZSI+PHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjpnZXRQcmljZSIgc3R5bGU9ImRvY3VtZW50IiAvPjx3c2RsOmlucHV0Pjxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9Imh0dHA6Ly9xdWlja3N0YXJ0LnNhbXBsZXMvIiAvPjwvd3NkbDppbnB1dD48d3NkbDpvdXRwdXQ+PHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIG5hbWVzcGFjZT0iaHR0cDovL3F1aWNrc3RhcnQuc2FtcGxlcy8iIC8+PC93c2RsOm91dHB1dD48L3dzZGw6b3BlcmF0aW9uPjx3c2RsOm9wZXJhdGlvbiBuYW1lPSJ1cGRhdGUiPjxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46dXBkYXRlIiBzdHlsZT0iZG9jdW1lbnQiIC8+PHdzZGw6aW5wdXQ+PHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIG5hbWVzcGFjZT0iaHR0cDovL3F1aWNrc3RhcnQuc2FtcGxlcy8iIC8+PC93c2RsOmlucHV0Pjwvd3NkbDpvcGVyYXRpb24+PC93c2RsOmJpbmRpbmc+PHdzZGw6YmluZGluZyBuYW1lPSJTdG9ja1F1b3RlU2VydmljZVNPQVAxMkJpbmRpbmciIHR5cGU9ImF4aXMyOlN0b2NrUXVvdGVTZXJ2aWNlUG9ydFR5cGUiPjxzb2FwMTI6YmluZGluZyB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIgc3R5bGU9ImRvY3VtZW50IiAvPjx3c2RsOm9wZXJhdGlvbiBuYW1lPSJnZXRQcmljZSI+PHNvYXAxMjpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOmdldFByaWNlIiBzdHlsZT0iZG9jdW1lbnQiIC8+PHdzZGw6aW5wdXQ+PHNvYXAxMjpib2R5IHVzZT0ibGl0ZXJhbCIgbmFtZXNwYWNlPSJodHRwOi8vcXVpY2tzdGFydC5zYW1wbGVzLyIgLz48L3dzZGw6aW5wdXQ+PHdzZGw6b3V0cHV0Pjxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiIG5hbWVzcGFjZT0iaHR0cDovL3F1aWNrc3RhcnQuc2FtcGxlcy8iIC8+PC93c2RsOm91dHB1dD48L3dzZGw6b3BlcmF0aW9uPjx3c2RsOm9wZXJhdGlvbiBuYW1lPSJ1cGRhdGUiPjxzb2FwMTI6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjp1cGRhdGUiIHN0eWxlPSJkb2N1bWVudCIgLz48d3NkbDppbnB1dD48c29hcDEyOmJvZHkgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9Imh0dHA6Ly9xdWlja3N0YXJ0LnNhbXBsZXMvIiAvPjwvd3NkbDppbnB1dD48L3dzZGw6b3BlcmF0aW9uPjwvd3NkbDpiaW5kaW5nPjx3c2RsOnNlcnZpY2UgbmFtZT0iU3RvY2tRdW90ZVNlcnZpY2UiPjx3c2RsOnBvcnQgbmFtZT0iU3RvY2tRdW90ZVNlcnZpY2VTT0FQMTFwb3J0IiBiaW5kaW5nPSJheGlzMjpTdG9ja1F1b3RlU2VydmljZVNPQVAxMUJpbmRpbmciPjxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9heGlzMi9zZXJ2aWNlcy9TdG9ja1F1b3RlU2VydmljZSIgLz48L3dzZGw6cG9ydD48L3dzZGw6c2VydmljZT48L3dzZGw6ZGVmaW5pdGlvbnM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9xdWlja3N0YXJ0YWRiL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3F1aWNrc3RhcnRhZGIvcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU0NmVmMS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3F1aWNrc3RhcnRhZGIvcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHNlcnZpY2UgbmFtZT0iU3RvY2tRdW90ZVNlcnZpY2UiIHNjb3BlPSJhcHBsaWNhdGlvbiI+Ci0gICAgPG1lc3NhZ2VSZWNlaXZlcnM+Ci0gICAgICAgIDxtZXNzYWdlUmVjZWl2ZXIgbWVwPSJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaW4tb3V0IgotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJzYW1wbGVzLnF1aWNrc3RhcnQuc2VydmljZS5hZGIuU3RvY2tRdW90ZVNlcnZpY2VNZXNzYWdlUmVjZWl2ZXJJbk91dCIvPgotICAgICAgICA8bWVzc2FnZVJlY2VpdmVyIG1lcD0iaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC93c2RsL2luLW9ubHkiCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9InNhbXBsZXMucXVpY2tzdGFydC5zZXJ2aWNlLmFkYi5TdG9ja1F1b3RlU2VydmljZU1lc3NhZ2VSZWNlaXZlckluT25seSIvPgotICAgIDwvbWVzc2FnZVJlY2VpdmVycz4KLSAgICA8cGFyYW1ldGVyIG5hbWU9IlNlcnZpY2VDbGFzcyI+c2FtcGxlcy5xdWlja3N0YXJ0LnNlcnZpY2UuYWRiLlN0b2NrUXVvdGVTZXJ2aWNlU2tlbGV0b24KLSAgICA8L3BhcmFtZXRlcj4KLSAgICA8b3BlcmF0aW9uIG5hbWU9InVwZGF0ZSIgbWVwPSJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaW4tb25seSI+Ci0gICAgICAgIDxhY3Rpb25NYXBwaW5nPnVybjp1cGRhdGU8L2FjdGlvbk1hcHBpbmc+Ci0gICAgPC9vcGVyYXRpb24+Ci0gICAgPG9wZXJhdGlvbiBuYW1lPSJnZXRQcmljZSIgbWVwPSJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaW4tb3V0Ij4KLSAgICAgICAgPGFjdGlvbk1hcHBpbmc+dXJuOmdldFByaWNlPC9hY3Rpb25NYXBwaW5nPgotICAgICAgICA8b3V0cHV0QWN0aW9uTWFwcGluZz5odHRwOi8vcXVpY2tzdGFydC5zYW1wbGVzL1N0b2NrUXVvdGVTZXJ2aWNlUG9ydFR5cGUvZ2V0UHJpY2VSZXNwb25zZTwvb3V0cHV0QWN0aW9uTWFwcGluZz4KLSAgICA8L29wZXJhdGlvbj4KLTwvc2VydmljZT4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvcXVpY2tzdGFydGFkYi9zcmMvc2FtcGxlcy9xdWlja3N0YXJ0L2NsaWVudHMvQURCQ2xpZW50LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3F1aWNrc3RhcnRhZGIvc3JjL3NhbXBsZXMvcXVpY2tzdGFydC9jbGllbnRzL0FEQkNsaWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDQwNDM4Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvcXVpY2tzdGFydGFkYi9zcmMvc2FtcGxlcy9xdWlja3N0YXJ0L2NsaWVudHMvQURCQ2xpZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBzYW1wbGVzLnF1aWNrc3RhcnQuY2xpZW50czsKLQotaW1wb3J0IHNhbXBsZXMucXVpY2tzdGFydC5zZXJ2aWNlLmFkYi5TdG9ja1F1b3RlU2VydmljZVN0dWI7Ci1wdWJsaWMgY2xhc3MgQURCQ2xpZW50ewotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKGphdmEubGFuZy5TdHJpbmcgYXJnc1tdKXsKLSAgICAgICAgdHJ5ewotICAgICAgICAgICAgU3RvY2tRdW90ZVNlcnZpY2VTdHViIHN0dWIgPQotICAgICAgICAgICAgICAgIG5ldyBTdG9ja1F1b3RlU2VydmljZVN0dWIKLSAgICAgICAgICAgICAgICAoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9heGlzMi9zZXJ2aWNlcy9TdG9ja1F1b3RlU2VydmljZSIpOwotCi0gICAgICAgICAgICBnZXRQcmljZShzdHViKTsKLSAgICAgICAgICAgIHVwZGF0ZShzdHViKTsKLSAgICAgICAgICAgIGdldFByaWNlKHN0dWIpOwotCi0gICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiXG5cblxuIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBmaXJlIGFuZCBmb3JnZXQgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdXBkYXRlKFN0b2NrUXVvdGVTZXJ2aWNlU3R1YiBzdHViKXsKLSAgICAgICAgdHJ5ewotICAgICAgICAgICAgU3RvY2tRdW90ZVNlcnZpY2VTdHViLlVwZGF0ZSByZXEgPSBuZXcgU3RvY2tRdW90ZVNlcnZpY2VTdHViLlVwZGF0ZSgpOwotICAgICAgICAgICAgcmVxLnNldFN5bWJvbCAoIkFCQyIpOwotICAgICAgICAgICAgcmVxLnNldFByaWNlICg0Mi4zNSk7Ci0KLSAgICAgICAgICAgIHN0dWIudXBkYXRlKHJlcSk7Ci0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oInByaWNlIHVwZGF0ZWQiKTsKLSAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJcblxuXG4iKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIHR3byB3YXkgY2FsbC9yZWNlaXZlICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGdldFByaWNlKFN0b2NrUXVvdGVTZXJ2aWNlU3R1YiBzdHViKXsKLSAgICAgICAgdHJ5ewotICAgICAgICAgICAgU3RvY2tRdW90ZVNlcnZpY2VTdHViLkdldFByaWNlIHJlcSA9IG5ldyBTdG9ja1F1b3RlU2VydmljZVN0dWIuR2V0UHJpY2UoKTsKLQotICAgICAgICAgICAgcmVxLnNldFN5bWJvbCgiQUJDIik7Ci0KLSAgICAgICAgICAgIFN0b2NrUXVvdGVTZXJ2aWNlU3R1Yi5HZXRQcmljZVJlc3BvbnNlIHJlcyA9Ci0gICAgICAgICAgICAgICAgc3R1Yi5nZXRQcmljZShyZXEpOwotCi0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4ocmVzLmdldF9yZXR1cm4oKSk7Ci0gICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiXG5cblxuIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvcXVpY2tzdGFydGFkYi9zcmMvc2FtcGxlcy9xdWlja3N0YXJ0L3NlcnZpY2UvYWRiL1N0b2NrUXVvdGVTZXJ2aWNlU2tlbGV0b24uamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvcXVpY2tzdGFydGFkYi9zcmMvc2FtcGxlcy9xdWlja3N0YXJ0L3NlcnZpY2UvYWRiL1N0b2NrUXVvdGVTZXJ2aWNlU2tlbGV0b24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJkYmY0MS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3F1aWNrc3RhcnRhZGIvc3JjL3NhbXBsZXMvcXVpY2tzdGFydC9zZXJ2aWNlL2FkYi9TdG9ja1F1b3RlU2VydmljZVNrZWxldG9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBzYW1wbGVzLnF1aWNrc3RhcnQuc2VydmljZS5hZGI7Ci1pbXBvcnQgc2FtcGxlcy5xdWlja3N0YXJ0LnNlcnZpY2UuYWRiLnhzZC5HZXRQcmljZVJlc3BvbnNlOwotaW1wb3J0IHNhbXBsZXMucXVpY2tzdGFydC5zZXJ2aWNlLmFkYi54c2QuVXBkYXRlOwotaW1wb3J0IHNhbXBsZXMucXVpY2tzdGFydC5zZXJ2aWNlLmFkYi54c2QuR2V0UHJpY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLXB1YmxpYyBjbGFzcyBTdG9ja1F1b3RlU2VydmljZVNrZWxldG9uIGltcGxlbWVudHMgU3RvY2tRdW90ZVNlcnZpY2VTa2VsZXRvbkludGVyZmFjZSB7Ci0gICAgcHJpdmF0ZSBIYXNoTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICBwdWJsaWMgdm9pZCB1cGRhdGUoVXBkYXRlIHBhcmFtMCkgewotICAgICAgICBtYXAucHV0KHBhcmFtMC5nZXRTeW1ib2woKSwgbmV3IERvdWJsZShwYXJhbTAuZ2V0UHJpY2UoKSkpOwotICAgIH0KLQotICAgIHB1YmxpYyBHZXRQcmljZVJlc3BvbnNlIGdldFByaWNlKEdldFByaWNlIHBhcmFtMSkgewotICAgICAgICBEb3VibGUgcHJpY2UgPSAoRG91YmxlKSBtYXAuZ2V0KHBhcmFtMS5nZXRTeW1ib2woKSk7Ci0gICAgICAgIGRvdWJsZSByZXQgPSA0MjsKLSAgICAgICAgaWYocHJpY2UgIT0gbnVsbCl7Ci0gICAgICAgICAgICByZXQgPSBwcmljZS5kb3VibGVWYWx1ZSgpOwotICAgICAgICB9Ci0gICAgICAgIEdldFByaWNlUmVzcG9uc2UgcmVzID0KLSAgICAgICAgICAgICAgICBuZXcgR2V0UHJpY2VSZXNwb25zZSgpOwotICAgICAgICByZXMuc2V0X3JldHVybihyZXQpOwotICAgICAgICByZXR1cm4gcmVzOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvcXVpY2tzdGFydGF4aW9tL1JFQURNRS50eHQgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3F1aWNrc3RhcnRheGlvbS9SRUFETUUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTJiODhlLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvcXVpY2tzdGFydGF4aW9tL1JFQURNRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi1BeGlzMiBRdWljayBTdGFydCBHdWlkZSAtIFNhbXBsZSAzIChBWElPTSkNCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0NCi1UaGlzIHNhbXBsZSBjb250YWlucyBzb3VyY2UgY29kZSBmb3IgdGhlIHhkb2NzLzFfMS9xdWlja3N0YXJ0Z3VpZGUuaHRtbCBkb2N1bWVudCBmb3VuZCBpbiANCi10aGUgZXh0cmFjdGVkIEF4aXMyIERvY3VtZW50cyBEaXN0cmlidXRpb24uIEZvciBhIG1vcmUgZGV0YWlsZWQgZGVzY3JpcHRpb24gb24gdGhlIA0KLXNvdXJjZSBjb2RlIGtpbmRseSBzZWUgdGhpcyAnQXhpczIgUXVpY2sgU3RhcnQgR3VpZGUnIGRvY3VtZW50Lg0KLQ0KLUludHJvZHVjdGlvbg0KLT09PT09PT09PT09PQ0KLQ0KLUluIHRoaXMgc2FtcGxlLCB3ZSBhcmUgZGVwbG95aW5nIGFuIEFYSU9NIGJhc2VkIFBPSk8gc2VydmljZSBhZnRlciB3cml0aW5nDQotYSBzZXJ2aWNlcy54bWwgYW5kIGNyZWF0aW5nIGFuIGFhci4gV2UgYWxzbyB0ZXN0IHN1Y2Nlc3NmdWwNCi1kZXBsb3ltZW50IHVzaW5nIGFuIEFYSU9NIGJhc2VkIGNsaWVudC4NCi0NCi0NCi1QcmUtUmVxdWlzaXRlcw0KLT09PT09PT09PT09PT09DQotDQotQXBhY2hlIEFudCAxLjYuMiBvciBsYXRlcg0KLQ0KLUJ1aWxkaW5nIHRoZSBTZXJ2aWNlDQotPT09PT09PT09PT09PT09PT09PT0NCi0NCi1UeXBlICJhbnQgZ2VuZXJhdGUuc2VydmljZSIgZnJvbSBBWElTMl9IT01FL3NhbXBsZXMvcXVpY2tzdGFydGF4aW9tIGRpcmVjdG9yeS4NCi1UaGVuIGRlcGxveSB0aGUgDQotQVhJUzJfSE9NRS9zYW1wbGVzL3F1aWNrc3RhcnRheGlvbS9idWlsZC9TdG9ja1F1b3RlU2VydmljZS5hYXINCi0NCi0NCi1SdW5uaW5nIHRoZSBDbGllbnQNCi09PT09PT09PT09PT09PT09PT0NCi0NCi1UeXBlIGFudCBydW4uY2xpZW50IGluIHRoZSBBWElTMl9IT01FL3NhbXBsZXMvcXVpY2tzdGFydGF4aW9tIGRpcmVjdG9yeQ0KLQ0KLUhlbHANCi09PT09DQotUGxlYXNlIGNvbnRhY3QgYXhpcy11c2VyIGxpc3QgKGF4aXMtdXNlckB3cy5hcGFjaGUub3JnKSBpZiB5b3UgaGF2ZQ0KLWFueSB0cm91YmxlIHJ1bm5pbmcgdGhlIHNhbXBsZS4NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3F1aWNrc3RhcnRheGlvbS9idWlsZC54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3F1aWNrc3RhcnRheGlvbS9idWlsZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxOTZiMTkuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9xdWlja3N0YXJ0YXhpb20vYnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08cHJvamVjdCBuYW1lPSJxdWlja3N0YXJ0YXhpb20iIGJhc2VkaXI9Ii4iIGRlZmF1bHQ9ImdlbmVyYXRlLnNlcnZpY2UiPgotCi0gICAgPHByb3BlcnR5IGVudmlyb25tZW50PSJlbnYiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iQVhJUzJfSE9NRSIgdmFsdWU9Ii4uLy4uIi8+Ci0KLSAgICA8cHJvcGVydHkgbmFtZT0iYnVpbGQuZGlyIiB2YWx1ZT0iYnVpbGQiLz4KLQotICAgIDxwYXRoIGlkPSJheGlzMi5jbGFzc3BhdGgiPgotICAgICAgICA8ZmlsZXNldCBkaXI9IiR7QVhJUzJfSE9NRX0vbGliIj4KLSAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIi8+Ci0gICAgICAgIDwvZmlsZXNldD4KLSAgICA8L3BhdGg+Ci0JPHBhdGggaWQ9ImNsaWVudC5jbGFzcy5wYXRoIj4KLQkJPGZpbGVzZXQgZGlyPSIke0FYSVMyX0hPTUV9L2xpYiI+Ci0JCQk8aW5jbHVkZSBuYW1lPSIqLmphciIgLz4KLQkJPC9maWxlc2V0PgotCQk8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7YnVpbGQuZGlyfS9jbGFzc2VzIiAvPgotCTwvcGF0aD4KLQotICAgIDx0YXJnZXQgbmFtZT0iY29tcGlsZSI+Ci0gICAgICAgIDxta2RpciBkaXI9IiR7YnVpbGQuZGlyfSIvPgotICAgICAgICA8bWtkaXIgZGlyPSIke2J1aWxkLmRpcn0vY2xhc3NlcyIvPgotCi0gICAgICAgIDwhLS1GaXJzdCBsZXQncyBjb21waWxlIHRoZSBjbGFzc2VzLS0+Ci0gICAgICAgIDxqYXZhYyBkZWJ1Zz0ib24iIAotICAgICAgICAgICAgICAgZm9yaz0idHJ1ZSIKLSAgICAgICAgICAgICAgIGRlc3RkaXI9IiR7YnVpbGQuZGlyfS9jbGFzc2VzIiAKLSAgICAgICAgICAgICAgIHNyY2Rpcj0iJHtiYXNlZGlyfS9zcmMiCi0gICAgICAgICAgICAgICBjbGFzc3BhdGhyZWY9ImF4aXMyLmNsYXNzcGF0aCI+Ci0gICAgICAgIDwvamF2YWM+Ci0gICAgPC90YXJnZXQ+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9ImdlbmVyYXRlLnNlcnZpY2UiIGRlcGVuZHM9ImNvbXBpbGUiPgotICAgICAgICA8IS0tYWFyIHRoZW0gdXAgLS0+Ci0gICAgICAgIDxjb3B5IHRvRGlyPSIke2J1aWxkLmRpcn0vY2xhc3NlcyIgZmFpbG9uZXJyb3I9ImZhbHNlIj4KLSAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtiYXNlZGlyfS9yZXNvdXJjZXMiPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoueG1sIi8+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi53c2RsIi8+Ci0gICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgIDwvY29weT4KLSAgICAgICAgPGphciBkZXN0ZmlsZT0iJHtidWlsZC5kaXJ9L1N0b2NrUXVvdGVTZXJ2aWNlLmFhciI+Ci0gICAgICAgICAgICA8ZmlsZXNldCBleGNsdWRlcz0iKiovVGVzdC5jbGFzcyIgZGlyPSIke2J1aWxkLmRpcn0vY2xhc3NlcyIvPgotICAgICAgICA8L2phcj4KLSAgICA8L3RhcmdldD4KLQotICAgIDx0YXJnZXQgbmFtZT0icnVuLmNsaWVudCIgZGVwZW5kcz0iY29tcGlsZSI+Ci0gICAgICAgIDxqYXZhIGNsYXNzbmFtZT0ic2FtcGxlcy5xdWlja3N0YXJ0LmNsaWVudHMuQVhJT01DbGllbnQiPgotICAgICAgICAgICAgPGNsYXNzcGF0aCByZWZpZD0iY2xpZW50LmNsYXNzLnBhdGgiIC8+Ci0gICAgICAgIDwvamF2YT4KLSAgICA8L3RhcmdldD4KLQotICAgIDx0YXJnZXQgbmFtZT0iY2xlYW4iPgotICAgICAgICA8ZGVsZXRlIGRpcj0iJHtidWlsZC5kaXJ9Ii8+Ci0gICAgPC90YXJnZXQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3F1aWNrc3RhcnRheGlvbS9yZXNvdXJjZXMvTUVUQS1JTkYvU3RvY2tRdW90ZVNlcnZpY2Uud3NkbCBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvcXVpY2tzdGFydGF4aW9tL3Jlc291cmNlcy9NRVRBLUlORi9TdG9ja1F1b3RlU2VydmljZS53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTVlNDYwLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvcXVpY2tzdGFydGF4aW9tL3Jlc291cmNlcy9NRVRBLUlORi9TdG9ja1F1b3RlU2VydmljZS53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08d3NkbDpkZWZpbml0aW9ucyB4bWxuczpheGlzMj0iaHR0cDovL3F1aWNrc3RhcnQuc2FtcGxlcy8iIHhtbG5zOnNvYXAxMj0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwMTIvIiB4bWxuczpodHRwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL2h0dHAvIiB4bWxuczptaW1lPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL21pbWUvIiB4bWxuczpucz0iaHR0cDovL3F1aWNrc3RhcnQuc2FtcGxlcy94c2QiIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9xdWlja3N0YXJ0LnNhbXBsZXMvIj48d3NkbDp0eXBlcz48eHM6c2NoZW1hIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgYXR0cmlidXRlRm9ybURlZmF1bHQ9InF1YWxpZmllZCIgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3F1aWNrc3RhcnQuc2FtcGxlcy94c2QiPgotPHhzOmVsZW1lbnQgbmFtZT0iZ2V0UHJpY2UiPgotPHhzOmNvbXBsZXhUeXBlPgotPHhzOnNlcXVlbmNlPgotPHhzOmVsZW1lbnQgbmFtZT0ic3ltYm9sIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHM6c3RyaW5nIiAvPgotPC94czpzZXF1ZW5jZT4KLTwveHM6Y29tcGxleFR5cGU+Ci08L3hzOmVsZW1lbnQ+Ci08eHM6ZWxlbWVudCBuYW1lPSJnZXRQcmljZVJlc3BvbnNlIj4KLTx4czpjb21wbGV4VHlwZT4KLTx4czpzZXF1ZW5jZT4KLTx4czplbGVtZW50IG5hbWU9InJldHVybiIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzOmRvdWJsZSIgLz4KLTwveHM6c2VxdWVuY2U+Ci08L3hzOmNvbXBsZXhUeXBlPgotPC94czplbGVtZW50PgotPHhzOmVsZW1lbnQgbmFtZT0idXBkYXRlIj4KLTx4czpjb21wbGV4VHlwZT4KLTx4czpzZXF1ZW5jZT4KLTx4czplbGVtZW50IG5hbWU9InN5bWJvbCIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzOnN0cmluZyIgLz4KLTx4czplbGVtZW50IG5hbWU9InByaWNlIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHM6ZG91YmxlIiAvPgotPC94czpzZXF1ZW5jZT4KLTwveHM6Y29tcGxleFR5cGU+Ci08L3hzOmVsZW1lbnQ+Ci08L3hzOnNjaGVtYT48L3dzZGw6dHlwZXM+PHdzZGw6bWVzc2FnZSBuYW1lPSJnZXRQcmljZU1lc3NhZ2UiPjx3c2RsOnBhcnQgbmFtZT0icGFydDEiIGVsZW1lbnQ9Im5zOmdldFByaWNlIiAvPjwvd3NkbDptZXNzYWdlPjx3c2RsOm1lc3NhZ2UgbmFtZT0iZ2V0UHJpY2VSZXNwb25zZU1lc3NhZ2UiPjx3c2RsOnBhcnQgbmFtZT0icGFydDEiIGVsZW1lbnQ9Im5zOmdldFByaWNlUmVzcG9uc2UiIC8+PC93c2RsOm1lc3NhZ2U+PHdzZGw6bWVzc2FnZSBuYW1lPSJ1cGRhdGVNZXNzYWdlIj48d3NkbDpwYXJ0IG5hbWU9InBhcnQxIiBlbGVtZW50PSJuczp1cGRhdGUiIC8+PC93c2RsOm1lc3NhZ2U+PHdzZGw6cG9ydFR5cGUgbmFtZT0iU3RvY2tRdW90ZVNlcnZpY2VQb3J0VHlwZSI+PHdzZGw6b3BlcmF0aW9uIG5hbWU9ImdldFByaWNlIj48d3NkbDppbnB1dCBtZXNzYWdlPSJheGlzMjpnZXRQcmljZU1lc3NhZ2UiIC8+PHdzZGw6b3V0cHV0IG1lc3NhZ2U9ImF4aXMyOmdldFByaWNlUmVzcG9uc2VNZXNzYWdlIiAvPjwvd3NkbDpvcGVyYXRpb24+PHdzZGw6b3BlcmF0aW9uIG5hbWU9InVwZGF0ZSI+PHdzZGw6aW5wdXQgbWVzc2FnZT0iYXhpczI6dXBkYXRlTWVzc2FnZSIgLz48L3dzZGw6b3BlcmF0aW9uPjwvd3NkbDpwb3J0VHlwZT48d3NkbDpiaW5kaW5nIG5hbWU9IlN0b2NrUXVvdGVTZXJ2aWNlU09BUDExQmluZGluZyIgdHlwZT0iYXhpczI6U3RvY2tRdW90ZVNlcnZpY2VQb3J0VHlwZSI+PHNvYXA6YmluZGluZyB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIgc3R5bGU9ImRvY3VtZW50IiAvPjx3c2RsOm9wZXJhdGlvbiBuYW1lPSJnZXRQcmljZSI+PHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjpnZXRQcmljZSIgc3R5bGU9ImRvY3VtZW50IiAvPjx3c2RsOmlucHV0Pjxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9Imh0dHA6Ly9xdWlja3N0YXJ0LnNhbXBsZXMvIiAvPjwvd3NkbDppbnB1dD48d3NkbDpvdXRwdXQ+PHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIG5hbWVzcGFjZT0iaHR0cDovL3F1aWNrc3RhcnQuc2FtcGxlcy8iIC8+PC93c2RsOm91dHB1dD48L3dzZGw6b3BlcmF0aW9uPjx3c2RsOm9wZXJhdGlvbiBuYW1lPSJ1cGRhdGUiPjxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46dXBkYXRlIiBzdHlsZT0iZG9jdW1lbnQiIC8+PHdzZGw6aW5wdXQ+PHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIG5hbWVzcGFjZT0iaHR0cDovL3F1aWNrc3RhcnQuc2FtcGxlcy8iIC8+PC93c2RsOmlucHV0Pjwvd3NkbDpvcGVyYXRpb24+PC93c2RsOmJpbmRpbmc+PHdzZGw6YmluZGluZyBuYW1lPSJTdG9ja1F1b3RlU2VydmljZVNPQVAxMkJpbmRpbmciIHR5cGU9ImF4aXMyOlN0b2NrUXVvdGVTZXJ2aWNlUG9ydFR5cGUiPjxzb2FwMTI6YmluZGluZyB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIgc3R5bGU9ImRvY3VtZW50IiAvPjx3c2RsOm9wZXJhdGlvbiBuYW1lPSJnZXRQcmljZSI+PHNvYXAxMjpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOmdldFByaWNlIiBzdHlsZT0iZG9jdW1lbnQiIC8+PHdzZGw6aW5wdXQ+PHNvYXAxMjpib2R5IHVzZT0ibGl0ZXJhbCIgbmFtZXNwYWNlPSJodHRwOi8vcXVpY2tzdGFydC5zYW1wbGVzLyIgLz48L3dzZGw6aW5wdXQ+PHdzZGw6b3V0cHV0Pjxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiIG5hbWVzcGFjZT0iaHR0cDovL3F1aWNrc3RhcnQuc2FtcGxlcy8iIC8+PC93c2RsOm91dHB1dD48L3dzZGw6b3BlcmF0aW9uPjx3c2RsOm9wZXJhdGlvbiBuYW1lPSJ1cGRhdGUiPjxzb2FwMTI6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjp1cGRhdGUiIHN0eWxlPSJkb2N1bWVudCIgLz48d3NkbDppbnB1dD48c29hcDEyOmJvZHkgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9Imh0dHA6Ly9xdWlja3N0YXJ0LnNhbXBsZXMvIiAvPjwvd3NkbDppbnB1dD48L3dzZGw6b3BlcmF0aW9uPjwvd3NkbDpiaW5kaW5nPjx3c2RsOnNlcnZpY2UgbmFtZT0iU3RvY2tRdW90ZVNlcnZpY2UiPjx3c2RsOnBvcnQgbmFtZT0iU3RvY2tRdW90ZVNlcnZpY2VTT0FQMTFwb3J0IiBiaW5kaW5nPSJheGlzMjpTdG9ja1F1b3RlU2VydmljZVNPQVAxMUJpbmRpbmciPjxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9heGlzMi9zZXJ2aWNlcy9TdG9ja1F1b3RlU2VydmljZSIgLz48L3dzZGw6cG9ydD48d3NkbDpwb3J0IG5hbWU9IlN0b2NrUXVvdGVTZXJ2aWNlU09BUDEycG9ydCIgYmluZGluZz0iYXhpczI6U3RvY2tRdW90ZVNlcnZpY2VTT0FQMTJCaW5kaW5nIj48c29hcDEyOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9heGlzMi9zZXJ2aWNlcy9TdG9ja1F1b3RlU2VydmljZSIgLz48L3dzZGw6cG9ydD48L3dzZGw6c2VydmljZT48L3dzZGw6ZGVmaW5pdGlvbnM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9xdWlja3N0YXJ0YXhpb20vcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvcXVpY2tzdGFydGF4aW9tL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlZDE5NzcuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9xdWlja3N0YXJ0YXhpb20vcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHNlcnZpY2UgbmFtZT0iU3RvY2tRdW90ZVNlcnZpY2UiIHNjb3BlPSJhcHBsaWNhdGlvbiI+Ci0gICAgPGRlc2NyaXB0aW9uPgotICAgICAgICBTdG9jayBRdW90ZSBTZXJ2aWNlCi0gICAgPC9kZXNjcmlwdGlvbj4KLSAgICA8b3BlcmF0aW9uIG5hbWU9ImdldFByaWNlIj4KLSAgICAgICAgPG1lc3NhZ2VSZWNlaXZlciBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuUmF3WE1MSU5PdXRNZXNzYWdlUmVjZWl2ZXIiLz4KLSAgICA8L29wZXJhdGlvbj4KLSAgICA8b3BlcmF0aW9uIG5hbWU9InVwZGF0ZSI+Ci0gICAgICAgIDxtZXNzYWdlUmVjZWl2ZXIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLlJhd1hNTElOT25seU1lc3NhZ2VSZWNlaXZlciIvPgotICAgIDwvb3BlcmF0aW9uPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iU2VydmljZUNsYXNzIj5zYW1wbGVzLnF1aWNrc3RhcnQuc2VydmljZS5heGlvbS5TdG9ja1F1b3RlU2VydmljZTwvcGFyYW1ldGVyPgotPC9zZXJ2aWNlPgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9xdWlja3N0YXJ0YXhpb20vc3JjL3NhbXBsZXMvcXVpY2tzdGFydC9jbGllbnRzL0FYSU9NQ2xpZW50LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3F1aWNrc3RhcnRheGlvbS9zcmMvc2FtcGxlcy9xdWlja3N0YXJ0L2NsaWVudHMvQVhJT01DbGllbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2IyYjZlMC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3F1aWNrc3RhcnRheGlvbS9zcmMvc2FtcGxlcy9xdWlja3N0YXJ0L2NsaWVudHMvQVhJT01DbGllbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIHNhbXBsZXMucXVpY2tzdGFydC5jbGllbnRzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5PcHRpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50LlNlcnZpY2VDbGllbnQ7Ci0KLXB1YmxpYyBjbGFzcyBBWElPTUNsaWVudCB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBFbmRwb2ludFJlZmVyZW5jZSB0YXJnZXRFUFIgPSAKLSAgICAgICAgbmV3IEVuZHBvaW50UmVmZXJlbmNlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9heGlzMi9zZXJ2aWNlcy9TdG9ja1F1b3RlU2VydmljZSIpOwotCi0gICAgcHVibGljIHN0YXRpYyBPTUVsZW1lbnQgZ2V0UHJpY2VQYXlsb2FkKFN0cmluZyBzeW1ib2wpIHsKLSAgICAgICAgT01GYWN0b3J5IGZhYyA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpOwotICAgICAgICBPTU5hbWVzcGFjZSBvbU5zID0gZmFjLmNyZWF0ZU9NTmFtZXNwYWNlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vcXVpY2tzdGFydC5zYW1wbGVzL3hzZCIsICJ0bnMiKTsKLQotICAgICAgICBPTUVsZW1lbnQgbWV0aG9kID0gZmFjLmNyZWF0ZU9NRWxlbWVudCgiZ2V0UHJpY2UiLCBvbU5zKTsKLSAgICAgICAgT01FbGVtZW50IHZhbHVlID0gZmFjLmNyZWF0ZU9NRWxlbWVudCgic3ltYm9sIiwgb21Ocyk7Ci0gICAgICAgIHZhbHVlLmFkZENoaWxkKGZhYy5jcmVhdGVPTVRleHQodmFsdWUsIHN5bWJvbCkpOwotICAgICAgICBtZXRob2QuYWRkQ2hpbGQodmFsdWUpOwotICAgICAgICByZXR1cm4gbWV0aG9kOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT01FbGVtZW50IHVwZGF0ZVBheWxvYWQoU3RyaW5nIHN5bWJvbCwgZG91YmxlIHByaWNlKSB7Ci0gICAgICAgIE9NRmFjdG9yeSBmYWMgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKTsKLSAgICAgICAgT01OYW1lc3BhY2Ugb21OcyA9IGZhYy5jcmVhdGVPTU5hbWVzcGFjZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL3F1aWNrc3RhcnQuc2FtcGxlcy94c2QiLCAidG5zIik7Ci0KLSAgICAgICAgT01FbGVtZW50IG1ldGhvZCA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoInVwZGF0ZSIsIG9tTnMpOwotCi0gICAgICAgIE9NRWxlbWVudCB2YWx1ZTEgPSBmYWMuY3JlYXRlT01FbGVtZW50KCJzeW1ib2wiLCBvbU5zKTsKLSAgICAgICAgdmFsdWUxLmFkZENoaWxkKGZhYy5jcmVhdGVPTVRleHQodmFsdWUxLCBzeW1ib2wpKTsKLSAgICAgICAgbWV0aG9kLmFkZENoaWxkKHZhbHVlMSk7Ci0KLSAgICAgICAgT01FbGVtZW50IHZhbHVlMiA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoInByaWNlIiwgb21Ocyk7Ci0gICAgICAgIHZhbHVlMi5hZGRDaGlsZChmYWMuY3JlYXRlT01UZXh0KHZhbHVlMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRG91YmxlLnRvU3RyaW5nKHByaWNlKSkpOwotICAgICAgICBtZXRob2QuYWRkQ2hpbGQodmFsdWUyKTsKLSAgICAgICAgcmV0dXJuIG1ldGhvZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgZ2V0UHJpY2VQYXlsb2FkID0gZ2V0UHJpY2VQYXlsb2FkKCJXU08iKTsKLSAgICAgICAgICAgIE9NRWxlbWVudCB1cGRhdGVQYXlsb2FkID0gdXBkYXRlUGF5bG9hZCgiV1NPIiwgMTIzLjQyKTsKLSAgICAgICAgICAgIE9wdGlvbnMgb3B0aW9ucyA9IG5ldyBPcHRpb25zKCk7Ci0gICAgICAgICAgICBvcHRpb25zLnNldFRvKHRhcmdldEVQUik7Ci0gICAgICAgICAgICBvcHRpb25zLnNldFRyYW5zcG9ydEluUHJvdG9jb2woQ29uc3RhbnRzLlRSQU5TUE9SVF9IVFRQKTsKLQotICAgICAgICAgICAgU2VydmljZUNsaWVudCBzZW5kZXIgPSBuZXcgU2VydmljZUNsaWVudCgpOwotICAgICAgICAgICAgc2VuZGVyLnNldE9wdGlvbnMob3B0aW9ucyk7Ci0KLSAgICAgICAgICAgIHNlbmRlci5maXJlQW5kRm9yZ2V0KHVwZGF0ZVBheWxvYWQpOwotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJwcmljZSB1cGRhdGVkIik7Ci0gICAgICAgICAgICBUaHJlYWQuc2xlZXAoMzAwMCk7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgcmVzdWx0ID0gc2VuZGVyLnNlbmRSZWNlaXZlKGdldFByaWNlUGF5bG9hZCk7Ci0KLSAgICAgICAgICAgIFN0cmluZyByZXNwb25zZSA9IHJlc3VsdC5nZXRGaXJzdEVsZW1lbnQoKS5nZXRUZXh0KCk7Ci0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkN1cnJlbnQgcHJpY2Ugb2YgV1NPOiAiICsgcmVzcG9uc2UpOwotCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9xdWlja3N0YXJ0YXhpb20vc3JjL3NhbXBsZXMvcXVpY2tzdGFydC9zZXJ2aWNlL2F4aW9tL1N0b2NrUXVvdGVTZXJ2aWNlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3F1aWNrc3RhcnRheGlvbS9zcmMvc2FtcGxlcy9xdWlja3N0YXJ0L3NlcnZpY2UvYXhpb20vU3RvY2tRdW90ZVNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNmOTY5Zi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3F1aWNrc3RhcnRheGlvbS9zcmMvc2FtcGxlcy9xdWlja3N0YXJ0L3NlcnZpY2UvYXhpb20vU3RvY2tRdW90ZVNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIHNhbXBsZXMucXVpY2tzdGFydC5zZXJ2aWNlLmF4aW9tOwotCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5hbWVzcGFjZTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotcHVibGljIGNsYXNzIFN0b2NrUXVvdGVTZXJ2aWNlIHsKLSAgICBwcml2YXRlIEhhc2hNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLQotICAgIHByaXZhdGUgU3RyaW5nIG5hbWVzcGFjZSA9ICJodHRwOi8vcXVpY2tzdGFydC5zYW1wbGVzL3hzZCI7Ci0KLSAgICBwdWJsaWMgT01FbGVtZW50IGdldFByaWNlKE9NRWxlbWVudCBlbGVtZW50KSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgZWxlbWVudC5idWlsZCgpOwotICAgICAgICBlbGVtZW50LmRldGFjaCgpOwotCi0gICAgICAgIE9NRWxlbWVudCBzeW1ib2xFbGVtZW50ID0gZWxlbWVudC5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgICAgU3RyaW5nIHN5bWJvbCA9IHN5bWJvbEVsZW1lbnQuZ2V0VGV4dCgpOwotCi0gICAgICAgIFN0cmluZyByZXR1cm5UZXh0ID0gIjQyIjsKLSAgICAgICAgRG91YmxlIHByaWNlID0gKERvdWJsZSkgbWFwLmdldChzeW1ib2wpOwotICAgICAgICBpZihwcmljZSAhPSBudWxsKXsKLSAgICAgICAgICAgIHJldHVyblRleHQgID0gIiIgKyBwcmljZS5kb3VibGVWYWx1ZSgpOwotICAgICAgICB9Ci0gICAgICAgIE9NRmFjdG9yeSBmYWMgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKTsKLSAgICAgICAgT01OYW1lc3BhY2Ugb21OcyA9Ci0gICAgICAgICAgICBmYWMuY3JlYXRlT01OYW1lc3BhY2UobmFtZXNwYWNlLCAibnMiKTsKLSAgICAgICAgT01FbGVtZW50IG1ldGhvZCA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoImdldFByaWNlUmVzcG9uc2UiLCBvbU5zKTsKLSAgICAgICAgT01FbGVtZW50IHZhbHVlID0gZmFjLmNyZWF0ZU9NRWxlbWVudCgicmV0dXJuIiwgb21Ocyk7Ci0gICAgICAgIHZhbHVlLmFkZENoaWxkKGZhYy5jcmVhdGVPTVRleHQodmFsdWUsIHJldHVyblRleHQpKTsKLSAgICAgICAgbWV0aG9kLmFkZENoaWxkKHZhbHVlKTsKLSAgICAgICAgcmV0dXJuIG1ldGhvZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB1cGRhdGUoT01FbGVtZW50IGVsZW1lbnQpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBlbGVtZW50LmJ1aWxkKCk7Ci0gICAgICAgIGVsZW1lbnQuZGV0YWNoKCk7Ci0KLSAgICAgICAgT01FbGVtZW50IHN5bWJvbEVsZW1lbnQgPSBlbGVtZW50LmdldEZpcnN0Q2hpbGRXaXRoTmFtZShuZXcgUU5hbWUobmFtZXNwYWNlLCAic3ltYm9sIikpOwotICAgICAgICBTdHJpbmcgc3ltYm9sID0gc3ltYm9sRWxlbWVudC5nZXRUZXh0KCk7Ci0KLSAgICAgICAgT01FbGVtZW50IHByaWNlRWxlbWVudCA9IGVsZW1lbnQuZ2V0Rmlyc3RDaGlsZFdpdGhOYW1lKG5ldyBRTmFtZShuYW1lc3BhY2UsICJwcmljZSIpKTsKLSAgICAgICAgU3RyaW5nIHByaWNlID0gcHJpY2VFbGVtZW50LmdldFRleHQoKTsKLQotICAgICAgICBtYXAucHV0KHN5bWJvbCwgbmV3IERvdWJsZShwcmljZSkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvcXVpY2tzdGFydGppYngvUkVBRE1FLnR4dCBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvcXVpY2tzdGFydGppYngvUkVBRE1FLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTEwNmM0ZC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3F1aWNrc3RhcnRqaWJ4L1JFQURNRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi1BeGlzMiBRdWljayBTdGFydCBHdWlkZS0gKEppQlgpDQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0NCi1JbnRyb2R1Y3Rpb24NCi09PT09PT09PT09PT0NCi1JbiB0aGlzIHNhbXBsZSwgd2UgYXJlIGRlcGxveWluZyBhIEppQlggZ2VuZXJhdGVkIHNlcnZpY2UuIFRoZSBzZXJ2aWNlDQotaXMgdGVzdGVkIHVzaW5nIGdlbmVyYXRlZCBjbGllbnQgc3R1YnMuDQotDQotUHJlLVJlcXVpc2l0ZXMNCi09PT09PT09PT09PT09PQ0KLQ0KLUFwYWNoZSBBbnQgMS42LjIgb3IgbGF0ZXINCi0NCi1CdWlsZGluZyB0aGUgU2VydmljZQ0KLT09PT09PT09PT09PT09PT09PT09DQotDQotVHlwZSAiYW50IGdlbmVyYXRlLnNlcnZpY2UiIGZyb20gQXhpczJfSE9NRS9zYW1wbGVzL3F1aWNrc3RhcnRqaWJ4DQotZGlyZWN0b3J5IGFuZCB0aGVuIGRlcGxveSB0aGUgDQotQXhpczJfSE9NRS9zYW1wbGVzL3F1aWNrc3RhcnRqaWJ4L2J1aWxkL3NlcnZpY2UvYnVpbGQvbGliL1N0b2NrUXVvdGVTZXJ2aWNlLmFhcg0KLQ0KLVJ1bm5pbmcgdGhlIENsaWVudA0KLT09PT09PT09PT09PT09PT09PQ0KLQ0KLXR5cGUgYW50IHJ1bi5jbGllbnQgaW4gdGhlIEF4aXMyX0hPTUUvc2FtcGxlcy9xdWlja3N0YXJ0YWRiIGRpcmVjdG9yeQ0KLQ0KLUhlbHANCi09PT09DQotUGxlYXNlIGNvbnRhY3QgYXhpcy11c2VyIGxpc3QgKGF4aXMtdXNlckB3cy5hcGFjaGUub3JnKSBpZiB5b3UNCi1oYXZlIGFueSB0cm91YmxlIHJ1bm5pbmcgdGhlIHNhbXBsZS4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3F1aWNrc3RhcnRqaWJ4L2J1aWxkLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvcXVpY2tzdGFydGppYngvYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDZmMzY5Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvcXVpY2tzdGFydGppYngvYnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHByb2plY3QgbmFtZT0icXVpY2tzdGFydGppYngiIGJhc2VkaXI9Ii4iIGRlZmF1bHQ9ImdlbmVyYXRlLmFsbCI+Ci0KLSAgICA8cHJvcGVydHkgZW52aXJvbm1lbnQ9ImVudiIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJBWElTMl9IT01FIiB2YWx1ZT0iLi4vLi4iLz4KLQk8cHJvcGVydHkgbmFtZT0id3NkbC51cmkiIHZhbHVlPSIuL3Jlc291cmNlcy9NRVRBLUlORi9TdG9ja1F1b3RlU2VydmljZS53c2RsIi8+Ci0JPHByb3BlcnR5IG5hbWU9InNlcnZpY2UudGFyZ2V0IiB2YWx1ZT0iYnVpbGQvc2VydmljZSIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJjbGllbnQudGFyZ2V0IiB2YWx1ZT0iYnVpbGQvY2xpZW50Ii8+Ci0KLSAgICA8cHJvcGVydHkgbmFtZT0iYnVpbGQuZGlyIiB2YWx1ZT0iYnVpbGQiLz4KLQotICAgIDxwYXRoIGlkPSJheGlzMi5jbGFzc3BhdGgiPgotICAgICAgICA8ZmlsZXNldCBkaXI9IiR7QVhJUzJfSE9NRX0vbGliIj4KLSAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIi8+Ci0gICAgICAgIDwvZmlsZXNldD4KLSAgICA8L3BhdGg+Ci0gICAgPHBhdGggaWQ9ImNsaWVudC5jbGFzcy5wYXRoIj4KLSAgICAgICAgPGZpbGVzZXQgZGlyPSIke0FYSVMyX0hPTUV9L2xpYiI+Ci0gICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqLmphciIgLz4KLSAgICAgICAgPC9maWxlc2V0PgotICAgICAgICA8ZmlsZXNldCBkaXI9IiR7YnVpbGQuZGlyfS9jbGllbnQvYnVpbGQvbGliIiA+Ci0gICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqLmphciIgLz4KLSAgICAgICAgPC9maWxlc2V0PgotICAgIDwvcGF0aD4KLQotICAgIDx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0gICAgICAgIDxkZWxldGUgZGlyPSIke2J1aWxkLmRpcn0iLz4KLSAgICAgICAgPG1rZGlyIGRpcj0iJHtidWlsZC5kaXJ9Ii8+Ci0gICAgICAgIDxta2RpciBkaXI9IiR7YnVpbGQuZGlyfS9zZXJ2aWNlIi8+Ci0gICAgICAgIDxta2RpciBkaXI9IiR7YnVpbGQuZGlyfS9jbGllbnQiLz4KLSAgICA8L3RhcmdldD4KLQkKLSAgICA8dGFyZ2V0IG5hbWU9ImdlbmVyYXRlLnNlcnZpY2UiIGRlcGVuZHM9ImluaXQiPgotICAgICAgICA8amF2YSBjbGFzc25hbWU9Im9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMMkphdmEiIGZvcms9InRydWUiIGNsYXNzcGF0aHJlZj0iYXhpczIuY2xhc3NwYXRoIj4KLSAgICAgICAgICAgIDxhcmcgbGluZT0iLXVyaSAke3dzZGwudXJpfSIvPgotCQkJPGFyZyBsaW5lPSItcyIvPgotICAgICAgICAgICAgPGFyZyBsaW5lPSItc3MiLz4KLQkJCTxhcmcgbGluZT0iLXV3Ii8+Ci0gICAgICAgICAgICA8YXJnIGxpbmU9Ii1zZCIvPgotCQkJPGFyZyBsaW5lPSItc3NpIi8+Ci0gICAgICAgICAgICA8YXJnIGxpbmU9Ii1hcCIvPgotCQkJPGFyZyBsaW5lPSItbnMycCBodHRwOi8vcXVpY2tzdGFydC5zYW1wbGVzL3hzZD1zYW1wbGVzLnF1aWNrc3RhcnQuc2VydmljZS5qaWJ4LnhzZCIvPgotCQkJPGFyZyBsaW5lPSItbCBqYXZhIi8+Ci0gICAgICAgICAgICA8YXJnIGxpbmU9Ii1wIHNhbXBsZXMucXVpY2tzdGFydC5zZXJ2aWNlLmppYngiLz4KLSAgICAgICAgICAgIDxhcmcgbGluZT0iLWQgamlieCIvPgotICAgICAgICAgICAgPGFyZyBsaW5lPSItbyAke2J1aWxkLmRpcn0vc2VydmljZSIvPgotICAgICAgICA8L2phdmE+Ci0gICAgICAgIDxjb3B5IGZpbGU9IiR7YmFzZWRpcn0vc3JjL3NhbXBsZXMvcXVpY2tzdGFydC9zZXJ2aWNlL2ppYngvU3RvY2tRdW90ZVNlcnZpY2VTa2VsZXRvbi5qYXZhIgotICAgICAgICAgICAgICB0b0Rpcj0iJHtidWlsZC5kaXJ9L3NlcnZpY2Uvc3JjL3NhbXBsZXMvcXVpY2tzdGFydC9zZXJ2aWNlL2ppYngvIgotICAgICAgICAgICAgICBvdmVyd3JpdGU9InllcyI+ICAgIAotICAgICAgICA8L2NvcHk+Ci0gICAgICAgIDxjb3B5IGZpbGU9IiR7YmFzZWRpcn0vcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzLnhtbCIKLSAgICAgICAgICAgICAgdG9EaXI9IiR7YnVpbGQuZGlyfS9zZXJ2aWNlL3Jlc291cmNlcy8iCi0gICAgICAgICAgICAgIG92ZXJ3cml0ZT0ieWVzIj4KLSAgICAgICAgPC9jb3B5PgotICAgICAgICA8YW50IGRpcj0iJHtidWlsZC5kaXJ9L3NlcnZpY2UiPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImF4aXMyLmhvbWUiIHZhbHVlPSIuLi8uLi8ke0FYSVMyX0hPTUV9Ii8+Ci0gICAgICAgIDwvYW50PgotCQk8Y29weSBmaWxlPSIke2Jhc2VkaXJ9L2J1aWxkL3NlcnZpY2UvYnVpbGQvbGliL1N0b2NrUXVvdGVTZXJ2aWNlLmFhciIKLSAgICAgICAgICAgICAgdG9EaXI9IiR7YmFzZWRpcn0vLi4vLi4vcmVwb3NpdG9yeS9zZXJ2aWNlcyIKLSAgICAgICAgICAgICAgb3ZlcndyaXRlPSJ5ZXMiPgotICAgICAgICA8L2NvcHk+Ci0gICAgPC90YXJnZXQ+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9ImdlbmVyYXRlLmNsaWVudCIgZGVwZW5kcz0iaW5pdCI+Ci0gICAgICAgIDxqYXZhIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5heGlzMi53c2RsLldTREwySmF2YSIgZm9yaz0idHJ1ZSIgY2xhc3NwYXRocmVmPSJheGlzMi5jbGFzc3BhdGgiPgotICAgICAgICAgICAgPGFyZyBsaW5lPSItdXJpICR7d3NkbC51cml9Ii8+Ci0JCQk8YXJnIGxpbmU9Ii1zIi8+Ci0JCQk8YXJnIGxpbmU9Ii11dyIvPgotICAgICAgICAgICAgPGFyZyBsaW5lPSItbnMycCBodHRwOi8vcXVpY2tzdGFydC5zYW1wbGVzL3hzZD1zYW1wbGVzLnF1aWNrc3RhcnQuc2VydmljZS5qaWJ4LnhzZCIvPgotCQkJPGFyZyBsaW5lPSItbCBqYXZhIi8+Ci0gICAgICAgICAgICA8YXJnIGxpbmU9Ii1wIHNhbXBsZXMucXVpY2tzdGFydC5zZXJ2aWNlLmppYngiLz4KLSAgICAgICAgICAgIDxhcmcgbGluZT0iLWQgamlieCIvPgotICAgICAgICAgICAgPGFyZyBsaW5lPSItbyAke2J1aWxkLmRpcn0vY2xpZW50Ii8+Ci0gICAgICAgIDwvamF2YT4KLSAgICAgICAgPGNvcHkgZmlsZT0iJHtiYXNlZGlyfS9zcmMvc2FtcGxlcy9xdWlja3N0YXJ0L2NsaWVudHMvSmlCWENsaWVudC5qYXZhIgotICAgICAgICAgICAgICB0b0Rpcj0iJHtidWlsZC5kaXJ9L2NsaWVudC9zcmMvc2FtcGxlcy9xdWlja3N0YXJ0L2NsaWVudHMvIgotICAgICAgICAgICAgICBvdmVyd3JpdGU9InllcyI+Ci0gICAgICAgIDwvY29weT4KLSAgICAgICAgPGFudCBkaXI9IiR7YnVpbGQuZGlyfS9jbGllbnQiPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImF4aXMyLmhvbWUiIHZhbHVlPSIuLi8uLi8ke0FYSVMyX0hPTUV9Ii8+Ci0gICAgICAgIDwvYW50PgotICAgIDwvdGFyZ2V0PgotCi0gICAgPHRhcmdldCBuYW1lPSJnZW5lcmF0ZS5hbGwiIGRlcGVuZHM9ImdlbmVyYXRlLnNlcnZpY2UsIGdlbmVyYXRlLmNsaWVudCIvPgotCi0gICAgPHRhcmdldCBuYW1lPSJydW4uY2xpZW50IiBkZXBlbmRzPSJnZW5lcmF0ZS5jbGllbnQiPgotICAgICAgICA8amF2YSBjbGFzc25hbWU9InNhbXBsZXMucXVpY2tzdGFydC5jbGllbnRzLkppQlhDbGllbnQiPgotICAgICAgICAgICAgPGNsYXNzcGF0aCByZWZpZD0iY2xpZW50LmNsYXNzLnBhdGgiIC8+Ci0gICAgICAgIDwvamF2YT4KLSAgICA8L3RhcmdldD4KLQotICAgIDx0YXJnZXQgbmFtZT0iY2xlYW4iPgotICAgICAgICA8ZGVsZXRlIGRpcj0iJHtidWlsZC5kaXJ9Ii8+Ci0gICAgPC90YXJnZXQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3F1aWNrc3RhcnRqaWJ4L3Jlc291cmNlcy9NRVRBLUlORi9TdG9ja1F1b3RlU2VydmljZS53c2RsIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9xdWlja3N0YXJ0amlieC9yZXNvdXJjZXMvTUVUQS1JTkYvU3RvY2tRdW90ZVNlcnZpY2Uud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2UzZDM4My4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3F1aWNrc3RhcnRqaWJ4L3Jlc291cmNlcy9NRVRBLUlORi9TdG9ja1F1b3RlU2VydmljZS53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08d3NkbDpkZWZpbml0aW9ucyB4bWxuczpheGlzMj0iaHR0cDovL3F1aWNrc3RhcnQuc2FtcGxlcy8iIHhtbG5zOnNvYXAxMj0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwMTIvIiB4bWxuczpodHRwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL2h0dHAvIiB4bWxuczptaW1lPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL21pbWUvIiB4bWxuczpucz0iaHR0cDovL3F1aWNrc3RhcnQuc2FtcGxlcy94c2QiIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9xdWlja3N0YXJ0LnNhbXBsZXMvIj48d3NkbDp0eXBlcz48eHM6c2NoZW1hIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgYXR0cmlidXRlRm9ybURlZmF1bHQ9InF1YWxpZmllZCIgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3F1aWNrc3RhcnQuc2FtcGxlcy94c2QiPgotPHhzOmVsZW1lbnQgbmFtZT0iZ2V0UHJpY2UiPgotPHhzOmNvbXBsZXhUeXBlPgotPHhzOnNlcXVlbmNlPgotPHhzOmVsZW1lbnQgbmFtZT0ic3ltYm9sIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHM6c3RyaW5nIiAvPgotPC94czpzZXF1ZW5jZT4KLTwveHM6Y29tcGxleFR5cGU+Ci08L3hzOmVsZW1lbnQ+Ci08eHM6ZWxlbWVudCBuYW1lPSJnZXRQcmljZVJlc3BvbnNlIj4KLTx4czpjb21wbGV4VHlwZT4KLTx4czpzZXF1ZW5jZT4KLTx4czplbGVtZW50IG5hbWU9InJldHVybiIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzOmRvdWJsZSIgLz4KLTwveHM6c2VxdWVuY2U+Ci08L3hzOmNvbXBsZXhUeXBlPgotPC94czplbGVtZW50PgotPHhzOmVsZW1lbnQgbmFtZT0idXBkYXRlIj4KLTx4czpjb21wbGV4VHlwZT4KLTx4czpzZXF1ZW5jZT4KLTx4czplbGVtZW50IG5hbWU9InN5bWJvbCIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzOnN0cmluZyIgLz4KLTx4czplbGVtZW50IG5hbWU9InByaWNlIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHM6ZG91YmxlIiAvPgotPC94czpzZXF1ZW5jZT4KLTwveHM6Y29tcGxleFR5cGU+Ci08L3hzOmVsZW1lbnQ+Ci08L3hzOnNjaGVtYT48L3dzZGw6dHlwZXM+PHdzZGw6bWVzc2FnZSBuYW1lPSJnZXRQcmljZU1lc3NhZ2UiPjx3c2RsOnBhcnQgbmFtZT0icGFydDEiIGVsZW1lbnQ9Im5zOmdldFByaWNlIiAvPjwvd3NkbDptZXNzYWdlPjx3c2RsOm1lc3NhZ2UgbmFtZT0iZ2V0UHJpY2VSZXNwb25zZU1lc3NhZ2UiPjx3c2RsOnBhcnQgbmFtZT0icGFydDEiIGVsZW1lbnQ9Im5zOmdldFByaWNlUmVzcG9uc2UiIC8+PC93c2RsOm1lc3NhZ2U+PHdzZGw6bWVzc2FnZSBuYW1lPSJ1cGRhdGVNZXNzYWdlIj48d3NkbDpwYXJ0IG5hbWU9InBhcnQxIiBlbGVtZW50PSJuczp1cGRhdGUiIC8+PC93c2RsOm1lc3NhZ2U+PHdzZGw6cG9ydFR5cGUgbmFtZT0iU3RvY2tRdW90ZVNlcnZpY2VQb3J0VHlwZSI+PHdzZGw6b3BlcmF0aW9uIG5hbWU9ImdldFByaWNlIj48d3NkbDppbnB1dCBtZXNzYWdlPSJheGlzMjpnZXRQcmljZU1lc3NhZ2UiIC8+PHdzZGw6b3V0cHV0IG1lc3NhZ2U9ImF4aXMyOmdldFByaWNlUmVzcG9uc2VNZXNzYWdlIiAvPjwvd3NkbDpvcGVyYXRpb24+PHdzZGw6b3BlcmF0aW9uIG5hbWU9InVwZGF0ZSI+PHdzZGw6aW5wdXQgbWVzc2FnZT0iYXhpczI6dXBkYXRlTWVzc2FnZSIgLz48L3dzZGw6b3BlcmF0aW9uPjwvd3NkbDpwb3J0VHlwZT48d3NkbDpiaW5kaW5nIG5hbWU9IlN0b2NrUXVvdGVTZXJ2aWNlU09BUDExQmluZGluZyIgdHlwZT0iYXhpczI6U3RvY2tRdW90ZVNlcnZpY2VQb3J0VHlwZSI+PHNvYXA6YmluZGluZyB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIgc3R5bGU9ImRvY3VtZW50IiAvPjx3c2RsOm9wZXJhdGlvbiBuYW1lPSJnZXRQcmljZSI+PHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjpnZXRQcmljZSIgc3R5bGU9ImRvY3VtZW50IiAvPjx3c2RsOmlucHV0Pjxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9Imh0dHA6Ly9xdWlja3N0YXJ0LnNhbXBsZXMvIiAvPjwvd3NkbDppbnB1dD48d3NkbDpvdXRwdXQ+PHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIG5hbWVzcGFjZT0iaHR0cDovL3F1aWNrc3RhcnQuc2FtcGxlcy8iIC8+PC93c2RsOm91dHB1dD48L3dzZGw6b3BlcmF0aW9uPjx3c2RsOm9wZXJhdGlvbiBuYW1lPSJ1cGRhdGUiPjxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46dXBkYXRlIiBzdHlsZT0iZG9jdW1lbnQiIC8+PHdzZGw6aW5wdXQ+PHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIG5hbWVzcGFjZT0iaHR0cDovL3F1aWNrc3RhcnQuc2FtcGxlcy8iIC8+PC93c2RsOmlucHV0Pjwvd3NkbDpvcGVyYXRpb24+PC93c2RsOmJpbmRpbmc+PHdzZGw6YmluZGluZyBuYW1lPSJTdG9ja1F1b3RlU2VydmljZVNPQVAxMkJpbmRpbmciIHR5cGU9ImF4aXMyOlN0b2NrUXVvdGVTZXJ2aWNlUG9ydFR5cGUiPjxzb2FwMTI6YmluZGluZyB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIgc3R5bGU9ImRvY3VtZW50IiAvPjx3c2RsOm9wZXJhdGlvbiBuYW1lPSJnZXRQcmljZSI+PHNvYXAxMjpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOmdldFByaWNlIiBzdHlsZT0iZG9jdW1lbnQiIC8+PHdzZGw6aW5wdXQ+PHNvYXAxMjpib2R5IHVzZT0ibGl0ZXJhbCIgbmFtZXNwYWNlPSJodHRwOi8vcXVpY2tzdGFydC5zYW1wbGVzLyIgLz48L3dzZGw6aW5wdXQ+PHdzZGw6b3V0cHV0Pjxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiIG5hbWVzcGFjZT0iaHR0cDovL3F1aWNrc3RhcnQuc2FtcGxlcy8iIC8+PC93c2RsOm91dHB1dD48L3dzZGw6b3BlcmF0aW9uPjx3c2RsOm9wZXJhdGlvbiBuYW1lPSJ1cGRhdGUiPjxzb2FwMTI6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjp1cGRhdGUiIHN0eWxlPSJkb2N1bWVudCIgLz48d3NkbDppbnB1dD48c29hcDEyOmJvZHkgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9Imh0dHA6Ly9xdWlja3N0YXJ0LnNhbXBsZXMvIiAvPjwvd3NkbDppbnB1dD48L3dzZGw6b3BlcmF0aW9uPjwvd3NkbDpiaW5kaW5nPjx3c2RsOnNlcnZpY2UgbmFtZT0iU3RvY2tRdW90ZVNlcnZpY2UiPjx3c2RsOnBvcnQgbmFtZT0iU3RvY2tRdW90ZVNlcnZpY2VTT0FQMTFwb3J0IiBiaW5kaW5nPSJheGlzMjpTdG9ja1F1b3RlU2VydmljZVNPQVAxMUJpbmRpbmciPjxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9heGlzMi9zZXJ2aWNlcy9TdG9ja1F1b3RlU2VydmljZSIgLz48L3dzZGw6cG9ydD48L3dzZGw6c2VydmljZT48L3dzZGw6ZGVmaW5pdGlvbnM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9xdWlja3N0YXJ0amlieC9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9xdWlja3N0YXJ0amlieC9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDRmY2UyLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvcXVpY2tzdGFydGppYngvcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHNlcnZpY2UgbmFtZT0iU3RvY2tRdW90ZVNlcnZpY2UiIHNjb3BlPSJhcHBsaWNhdGlvbiI+Ci0gICAgPG1lc3NhZ2VSZWNlaXZlcnM+Ci0gICAgICAgIDxtZXNzYWdlUmVjZWl2ZXIgbWVwPSJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaW4tb3V0IgotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJzYW1wbGVzLnF1aWNrc3RhcnQuc2VydmljZS5qaWJ4LlN0b2NrUXVvdGVTZXJ2aWNlTWVzc2FnZVJlY2VpdmVySW5PdXQiLz4KLSAgICAgICAgPG1lc3NhZ2VSZWNlaXZlciBtZXA9Imh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgvd3NkbC9pbi1vbmx5IgotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJzYW1wbGVzLnF1aWNrc3RhcnQuc2VydmljZS5qaWJ4LlN0b2NrUXVvdGVTZXJ2aWNlTWVzc2FnZVJlY2VpdmVySW5Pbmx5Ii8+Ci0gICAgPC9tZXNzYWdlUmVjZWl2ZXJzPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iU2VydmljZUNsYXNzIj5zYW1wbGVzLnF1aWNrc3RhcnQuc2VydmljZS5qaWJ4LlN0b2NrUXVvdGVTZXJ2aWNlU2tlbGV0b24KLSAgICA8L3BhcmFtZXRlcj4KLSAgICA8b3BlcmF0aW9uIG5hbWU9InVwZGF0ZSIgbWVwPSJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaW4tb25seSI+Ci0gICAgICAgIDxhY3Rpb25NYXBwaW5nPnVybjp1cGRhdGU8L2FjdGlvbk1hcHBpbmc+Ci0gICAgPC9vcGVyYXRpb24+Ci0gICAgPG9wZXJhdGlvbiBuYW1lPSJnZXRQcmljZSIgbWVwPSJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaW4tb3V0Ij4KLSAgICAgICAgPGFjdGlvbk1hcHBpbmc+dXJuOmdldFByaWNlPC9hY3Rpb25NYXBwaW5nPgotICAgICAgICA8b3V0cHV0QWN0aW9uTWFwcGluZz5odHRwOi8vcXVpY2tzdGFydC5zYW1wbGVzL1N0b2NrUXVvdGVTZXJ2aWNlUG9ydFR5cGUvZ2V0UHJpY2VSZXNwb25zZTwvb3V0cHV0QWN0aW9uTWFwcGluZz4KLSAgICA8L29wZXJhdGlvbj4KLTwvc2VydmljZT4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvcXVpY2tzdGFydGppYngvc3JjL3NhbXBsZXMvcXVpY2tzdGFydC9jbGllbnRzL0ppQlhDbGllbnQuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvcXVpY2tzdGFydGppYngvc3JjL3NhbXBsZXMvcXVpY2tzdGFydC9jbGllbnRzL0ppQlhDbGllbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRkYTQ3MS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3F1aWNrc3RhcnRqaWJ4L3NyYy9zYW1wbGVzL3F1aWNrc3RhcnQvY2xpZW50cy9KaUJYQ2xpZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBzYW1wbGVzLnF1aWNrc3RhcnQuY2xpZW50czsKLQotaW1wb3J0IHNhbXBsZXMucXVpY2tzdGFydC5zZXJ2aWNlLmppYnguU3RvY2tRdW90ZVNlcnZpY2VTdHViOwotCi1wdWJsaWMgY2xhc3MgSmlCWENsaWVudHsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihqYXZhLmxhbmcuU3RyaW5nIGFyZ3NbXSl7Ci0gICAgICAgIHRyeXsKLSAgICAgICAgICAgIFN0b2NrUXVvdGVTZXJ2aWNlU3R1YiBzdHViID0KLSAgICAgICAgICAgICAgICBuZXcgU3RvY2tRdW90ZVNlcnZpY2VTdHViCi0gICAgICAgICAgICAgICAgKCJodHRwOi8vbG9jYWxob3N0OjgwODAvYXhpczIvc2VydmljZXMvU3RvY2tRdW90ZVNlcnZpY2UiKTsKLQotICAgICAgICAgICAgZ2V0UHJpY2Uoc3R1Yik7Ci0gICAgICAgICAgICB1cGRhdGUoc3R1Yik7Ci0gICAgICAgICAgICBnZXRQcmljZShzdHViKTsKLQotICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKXsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlxuXG5cbiIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogZmlyZSBhbmQgZm9yZ2V0ICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHVwZGF0ZShTdG9ja1F1b3RlU2VydmljZVN0dWIgc3R1Yil7Ci0gICAgICAgIHRyeXsKLSAgICAgICAgICAgIHN0dWIudXBkYXRlKCJDREUiLCBuZXcgRG91YmxlKDQyLjM1KSk7Ci0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oInByaWNlIHVwZGF0ZWQiKTsKLSAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJcblxuXG4iKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIHR3byB3YXkgY2FsbC9yZWNlaXZlICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGdldFByaWNlKFN0b2NrUXVvdGVTZXJ2aWNlU3R1YiBzdHViKXsKLSAgICAgICAgdHJ5ewotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKHN0dWIuZ2V0UHJpY2UoIkNERSIpKTsKLSAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJcblxuXG4iKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9xdWlja3N0YXJ0amlieC9zcmMvc2FtcGxlcy9xdWlja3N0YXJ0L3NlcnZpY2UvamlieC9TdG9ja1F1b3RlU2VydmljZVNrZWxldG9uLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3F1aWNrc3RhcnRqaWJ4L3NyYy9zYW1wbGVzL3F1aWNrc3RhcnQvc2VydmljZS9qaWJ4L1N0b2NrUXVvdGVTZXJ2aWNlU2tlbGV0b24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhjYzFiYi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3F1aWNrc3RhcnRqaWJ4L3NyYy9zYW1wbGVzL3F1aWNrc3RhcnQvc2VydmljZS9qaWJ4L1N0b2NrUXVvdGVTZXJ2aWNlU2tlbGV0b24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIHNhbXBsZXMucXVpY2tzdGFydC5zZXJ2aWNlLmppYng7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotcHVibGljIGNsYXNzIFN0b2NrUXVvdGVTZXJ2aWNlU2tlbGV0b24gaW1wbGVtZW50cyBTdG9ja1F1b3RlU2VydmljZVNrZWxldG9uSW50ZXJmYWNlIHsKLSAgICBwcml2YXRlIEhhc2hNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLQotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZShTdHJpbmcgc3ltYm9sLCBEb3VibGUgcHJpY2UpIHsKLSAgICAgICAgbWFwLnB1dChzeW1ib2wsIHByaWNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRG91YmxlIGdldFByaWNlKFN0cmluZyBzeW1ib2wpIHsKLSAgICAgICAgRG91YmxlIHJldCA9IChEb3VibGUpIG1hcC5nZXQoc3ltYm9sKTsKLSAgICAgICAgaWYgKHJldCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXQgPSBuZXcgRG91YmxlKDQyLjApOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9xdWlja3N0YXJ0eG1sYmVhbnMvUkVBRE1FLnR4dCBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvcXVpY2tzdGFydHhtbGJlYW5zL1JFQURNRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlNTE3MjQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9xdWlja3N0YXJ0eG1sYmVhbnMvUkVBRE1FLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLUF4aXMyIFF1aWNrIFN0YXJ0IEd1aWRlLSBTYW1wbGUgNCAoWE1MIEJlYW5zKQ0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotDQotVGhpcyBzYW1wbGUgY29udGFpbnMgc291cmNlIGNvZGUgZm9yIHRoZSB4ZG9jcy8xXzEvcXVpY2tzdGFydGd1aWRlLmh0bWwgZG9jdW1lbnQgZm91bmQgaW4gDQotdGhlIGV4dHJhY3RlZCBBeGlzMiBEb2N1bWVudHMgRGlzdHJpYnV0aW9uLiBGb3IgYSBtb3JlIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9uIHRoZSANCi1zb3VyY2UgY29kZSBraW5kbHkgc2VlIHRoaXMgJ0F4aXMyIFF1aWNrIFN0YXJ0IEd1aWRlJyBkb2N1bWVudC4NCi0NCi1JbnRyb2R1Y3Rpb24NCi09PT09PT09PT09PT0NCi1JbiB0aGlzIHNhbXBsZSwgd2UgYXJlIGRlcGxveWluZyBhbiBYTUxCRUFOUyBnZW5lcmF0ZWQgc2VydmljZS4gVGhlIHNlcnZpY2UNCi1pcyB0ZXN0ZWQgdXNpbmcgZ2VuZXJhdGVkIGNsaWVudCBzdHVicy4NCi0NCi0NCi1QcmUtUmVxdWlzaXRlcw0KLT09PT09PT09PT09PT09DQotDQotQXBhY2hlIEFudCAxLjYuMiBvciBsYXRlcg0KLQ0KLUJ1aWxkaW5nIHRoZSBTZXJ2aWNlDQotPT09PT09PT09PT09PT09PT09PT0NCi0NCi1UeXBlICJhbnQgZ2VuZXJhdGUuc2VydmljZSIgZnJvbSBBeGlzMl9IT01FL3NhbXBsZXMvcXVpY2tzdGFydHhtbGJlYW5zDQotZGlyZWN0b3J5LiBUaGVuIGRlcGxveSB0aGUgDQotQVhJUzJfSE9NRS9zYW1wbGVzL3F1aWNrc3RhcnR4bWxiZWFucy9idWlsZC9zZXJ2aWNlL2J1aWxkL2xpYi9TdG9ja1F1b3RlU2VydmljZS5hYXINCi0NCi0NCi1SdW5uaW5nIHRoZSBDbGllbnQNCi09PT09PT09PT09PT09PT09PT0NCi0NCi10eXBlIGFudCBydW4uY2xpZW50IGluIHRoZSBBWElTMl9IT01FL3NhbXBsZXMvcXVpY2tzdGFydHhtbGJlYW5zIGRpcmVjdG9yeQ0KLQ0KLUhlbHANCi09PT09DQotUGxlYXNlIGNvbnRhY3QgYXhpcy11c2VyIGxpc3QgKGF4aXMtdXNlckB3cy5hcGFjaGUub3JnKSBpZiB5b3UgaGF2ZQ0KLWFueSB0cm91YmxlIHJ1bm5pbmcgdGhlIHNhbXBsZS4NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3F1aWNrc3RhcnR4bWxiZWFucy9idWlsZC54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3F1aWNrc3RhcnR4bWxiZWFucy9idWlsZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2NjQ2Y2MuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9xdWlja3N0YXJ0eG1sYmVhbnMvYnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHByb2plY3QgbmFtZT0icXVpY2tzdGFydHhtbGJlYW5zIiBiYXNlZGlyPSIuIiBkZWZhdWx0PSJnZW5lcmF0ZS5zZXJ2aWNlIj4KLQotICAgIDxwcm9wZXJ0eSBlbnZpcm9ubWVudD0iZW52Ii8+Ci0gICAgPHByb3BlcnR5IG5hbWU9IkFYSVMyX0hPTUUiIHZhbHVlPSIuLi8uLiIvPgotCi0JPHByb3BlcnR5IG5hbWU9IndzZGwudXJpIiB2YWx1ZT0iLi9yZXNvdXJjZXMvTUVUQS1JTkYvU3RvY2tRdW90ZVNlcnZpY2Uud3NkbCIvPgotCTxwcm9wZXJ0eSBuYW1lPSJzZXJ2aWNlLnRhcmdldCIgdmFsdWU9ImJ1aWxkL3NlcnZpY2UiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iY2xpZW50LnRhcmdldCIgdmFsdWU9ImJ1aWxkL2NsaWVudCIvPgotCi0gICAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmRpciIgdmFsdWU9ImJ1aWxkIi8+Ci0KLSAgICA8cGF0aCBpZD0iYXhpczIuY2xhc3NwYXRoIj4KLSAgICAgICAgPGZpbGVzZXQgZGlyPSIke0FYSVMyX0hPTUV9L2xpYiI+Ci0gICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqLmphciIvPgotICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgPC9wYXRoPgotICAgIDxwYXRoIGlkPSJjbGllbnQuY2xhc3MucGF0aCI+Ci0gICAgICAgIDxmaWxlc2V0IGRpcj0iJHtBWElTMl9IT01FfS9saWIiPgotICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKi5qYXIiIC8+Ci0gICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgPGZpbGVzZXQgZGlyPSIke2J1aWxkLmRpcn0vY2xpZW50L2J1aWxkL2xpYiIgPgotICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKi5qYXIiIC8+Ci0gICAgICAgIDwvZmlsZXNldD4KLSAgICA8L3BhdGg+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9ImluaXQiPgotICAgICAgICA8bWtkaXIgZGlyPSIke2J1aWxkLmRpcn0iLz4KLSAgICAgICAgPG1rZGlyIGRpcj0iJHtidWlsZC5kaXJ9L3NlcnZpY2UiLz4KLSAgICAgICAgPG1rZGlyIGRpcj0iJHtidWlsZC5kaXJ9L2NsaWVudCIvPgotICAgIDwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJnZW5lcmF0ZS5zZXJ2aWNlIiBkZXBlbmRzPSJpbml0Ij4KLSAgICAgICAgPGRlbGV0ZSBkaXI9IiR7c2VydmljZS50YXJnZXR9Ii8+Ci0gICAgICAgIDxta2RpciBkaXI9IiR7c2VydmljZS50YXJnZXR9Ii8+Ci0gICAgICAgIDxta2RpciBkaXI9IiR7c2VydmljZS50YXJnZXR9L2NsYXNzZXMiLz4KLSAgICAgICAgPGphdmEgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmF4aXMyLndzZGwuV1NETDJKYXZhIiBmb3JrPSJ0cnVlIiBjbGFzc3BhdGhyZWY9ImF4aXMyLmNsYXNzcGF0aCI+Ci0gICAgICAgICAgICA8YXJnIGxpbmU9Ii11cmkgJHt3c2RsLnVyaX0iLz4KLQkJCTxhcmcgbGluZT0iLXMiLz4KLSAgICAgICAgICAgIDxhcmcgbGluZT0iLXNzIi8+Ci0gICAgICAgICAgICA8YXJnIGxpbmU9Ii1zZCIvPgotCQkJPGFyZyBsaW5lPSItc3NpIi8+Ci0gICAgICAgICAgICA8YXJnIGxpbmU9Ii1hcCIvPgotCQkJPGFyZyBsaW5lPSItbnMycCBodHRwOi8vcXVpY2tzdGFydC5zYW1wbGVzL3hzZD1zYW1wbGVzLnF1aWNrc3RhcnQuc2VydmljZS54bWxiZWFucy54c2QiLz4KLQkJCTxhcmcgbGluZT0iLWwgamF2YSIvPgotICAgICAgICAgICAgPGFyZyBsaW5lPSItcCBzYW1wbGVzLnF1aWNrc3RhcnQuc2VydmljZS54bWxiZWFucyIvPgotICAgICAgICAgICAgPGFyZyBsaW5lPSItZCB4bWxiZWFucyIvPgotICAgICAgICAgICAgPGFyZyBsaW5lPSItbyAke2J1aWxkLmRpcn0vc2VydmljZSIvPgotICAgICAgICA8L2phdmE+Ci0gICAgICAgIAotCQk8Y29weSBmaWxlPSIke2Jhc2VkaXJ9L3NyYy9zYW1wbGVzL3F1aWNrc3RhcnQvc2VydmljZS94bWxiZWFucy9TdG9ja1F1b3RlU2VydmljZVNrZWxldG9uLmphdmEiCi0gICAgICAgICAgICAgIHRvRGlyPSIke2J1aWxkLmRpcn0vc2VydmljZS9zcmMvc2FtcGxlcy9xdWlja3N0YXJ0L3NlcnZpY2UveG1sYmVhbnMvIgotICAgICAgICAgICAgICBvdmVyd3JpdGU9InllcyI+ICAgIAotICAgICAgICA8L2NvcHk+Ci0gICAgICAgIDxjb3B5IGZpbGU9IiR7YmFzZWRpcn0vcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzLnhtbCIKLSAgICAgICAgICAgICAgdG9EaXI9IiR7YnVpbGQuZGlyfS9zZXJ2aWNlL3Jlc291cmNlcy8iCi0gICAgICAgICAgICAgIG92ZXJ3cml0ZT0ieWVzIj4KLSAgICAgICAgPC9jb3B5PgotICAgICAgICA8YW50IGRpcj0iJHtidWlsZC5kaXJ9L3NlcnZpY2UiPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImF4aXMyLmhvbWUiIHZhbHVlPSIuLi8uLi8ke0FYSVMyX0hPTUV9Ii8+Ci0gICAgICAgIDwvYW50PgotCQk8Y29weSBmaWxlPSIke2Jhc2VkaXJ9L2J1aWxkL3NlcnZpY2UvYnVpbGQvbGliL1N0b2NrUXVvdGVTZXJ2aWNlLmFhciIKLSAgICAgICAgICAgICAgdG9EaXI9IiR7YmFzZWRpcn0vLi4vLi4vcmVwb3NpdG9yeS9zZXJ2aWNlcyIKLSAgICAgICAgICAgICAgb3ZlcndyaXRlPSJ5ZXMiPgotICAgICAgICA8L2NvcHk+Ci0gICAgPC90YXJnZXQ+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9ImdlbmVyYXRlLmNsaWVudCIgZGVwZW5kcz0iaW5pdCI+Ci0JCTxkZWxldGUgZGlyPSIke2NsaWVudC50YXJnZXR9Ii8+Ci0JCTxta2RpciBkaXI9IiR7Y2xpZW50LnRhcmdldH0iLz4KLQkgPGphdmEgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmF4aXMyLndzZGwuV1NETDJKYXZhIiBmb3JrPSJ0cnVlIiBjbGFzc3BhdGhyZWY9ImF4aXMyLmNsYXNzcGF0aCI+Ci0gICAgICAgICAgICA8YXJnIGxpbmU9Ii11cmkgJHt3c2RsLnVyaX0iLz4KLQkJCTxhcmcgbGluZT0iLXMiLz4KLSAgICAgICAgICAgIDxhcmcgbGluZT0iLW5zMnAgaHR0cDovL3F1aWNrc3RhcnQuc2FtcGxlcy94c2Q9c2FtcGxlcy5xdWlja3N0YXJ0LnNlcnZpY2UueG1sYmVhbnMueHNkIi8+Ci0JCQk8YXJnIGxpbmU9Ii1sIGphdmEiLz4KLSAgICAgICAgICAgIDxhcmcgbGluZT0iLXAgc2FtcGxlcy5xdWlja3N0YXJ0LnNlcnZpY2UueG1sYmVhbnMiLz4KLSAgICAgICAgICAgIDxhcmcgbGluZT0iLWQgeG1sYmVhbnMiLz4KLSAgICAgICAgICAgIDxhcmcgbGluZT0iLW8gJHtidWlsZC5kaXJ9L2NsaWVudCIvPgotICAgICAgICA8L2phdmE+Ci0gICAgICAgIDxjb3B5IGZpbGU9IiR7YmFzZWRpcn0vc3JjL3NhbXBsZXMvcXVpY2tzdGFydC9jbGllbnRzL1hNTEJFQU5TQ2xpZW50LmphdmEiCi0gICAgICAgICAgICAgIHRvRGlyPSIke2J1aWxkLmRpcn0vY2xpZW50L3NyYy9zYW1wbGVzL3F1aWNrc3RhcnQvY2xpZW50cy8iCi0gICAgICAgICAgICAgIG92ZXJ3cml0ZT0ieWVzIj4KLSAgICAgICAgPC9jb3B5PgotICAgICAgICA8YW50IGRpcj0iJHtidWlsZC5kaXJ9L2NsaWVudCI+Ci0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iYXhpczIuaG9tZSIgdmFsdWU9Ii4uLy4uLyR7QVhJUzJfSE9NRX0iLz4KLSAgICAgICAgPC9hbnQ+Ci0gICAgPC90YXJnZXQ+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9ImdlbmVyYXRlLmFsbCIgZGVwZW5kcz0iZ2VuZXJhdGUuc2VydmljZSwgZ2VuZXJhdGUuY2xpZW50Ii8+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9InJ1bi5jbGllbnQiIGRlcGVuZHM9ImdlbmVyYXRlLmNsaWVudCI+Ci0gICAgICAgIDxqYXZhIGNsYXNzbmFtZT0ic2FtcGxlcy5xdWlja3N0YXJ0LmNsaWVudHMuWE1MQkVBTlNDbGllbnQiPgotICAgICAgICAgICAgPGNsYXNzcGF0aCByZWZpZD0iY2xpZW50LmNsYXNzLnBhdGgiIC8+Ci0gICAgICAgIDwvamF2YT4KLSAgICA8L3RhcmdldD4KLQotICAgIDx0YXJnZXQgbmFtZT0iY2xlYW4iPgotICAgICAgICA8ZGVsZXRlIGRpcj0iJHtidWlsZC5kaXJ9Ii8+Ci0gICAgPC90YXJnZXQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3F1aWNrc3RhcnR4bWxiZWFucy9yZXNvdXJjZXMvTUVUQS1JTkYvU3RvY2tRdW90ZVNlcnZpY2Uud3NkbCBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvcXVpY2tzdGFydHhtbGJlYW5zL3Jlc291cmNlcy9NRVRBLUlORi9TdG9ja1F1b3RlU2VydmljZS53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTNkMzgzLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvcXVpY2tzdGFydHhtbGJlYW5zL3Jlc291cmNlcy9NRVRBLUlORi9TdG9ja1F1b3RlU2VydmljZS53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08d3NkbDpkZWZpbml0aW9ucyB4bWxuczpheGlzMj0iaHR0cDovL3F1aWNrc3RhcnQuc2FtcGxlcy8iIHhtbG5zOnNvYXAxMj0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwMTIvIiB4bWxuczpodHRwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL2h0dHAvIiB4bWxuczptaW1lPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL21pbWUvIiB4bWxuczpucz0iaHR0cDovL3F1aWNrc3RhcnQuc2FtcGxlcy94c2QiIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9xdWlja3N0YXJ0LnNhbXBsZXMvIj48d3NkbDp0eXBlcz48eHM6c2NoZW1hIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgYXR0cmlidXRlRm9ybURlZmF1bHQ9InF1YWxpZmllZCIgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3F1aWNrc3RhcnQuc2FtcGxlcy94c2QiPgotPHhzOmVsZW1lbnQgbmFtZT0iZ2V0UHJpY2UiPgotPHhzOmNvbXBsZXhUeXBlPgotPHhzOnNlcXVlbmNlPgotPHhzOmVsZW1lbnQgbmFtZT0ic3ltYm9sIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHM6c3RyaW5nIiAvPgotPC94czpzZXF1ZW5jZT4KLTwveHM6Y29tcGxleFR5cGU+Ci08L3hzOmVsZW1lbnQ+Ci08eHM6ZWxlbWVudCBuYW1lPSJnZXRQcmljZVJlc3BvbnNlIj4KLTx4czpjb21wbGV4VHlwZT4KLTx4czpzZXF1ZW5jZT4KLTx4czplbGVtZW50IG5hbWU9InJldHVybiIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzOmRvdWJsZSIgLz4KLTwveHM6c2VxdWVuY2U+Ci08L3hzOmNvbXBsZXhUeXBlPgotPC94czplbGVtZW50PgotPHhzOmVsZW1lbnQgbmFtZT0idXBkYXRlIj4KLTx4czpjb21wbGV4VHlwZT4KLTx4czpzZXF1ZW5jZT4KLTx4czplbGVtZW50IG5hbWU9InN5bWJvbCIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzOnN0cmluZyIgLz4KLTx4czplbGVtZW50IG5hbWU9InByaWNlIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHM6ZG91YmxlIiAvPgotPC94czpzZXF1ZW5jZT4KLTwveHM6Y29tcGxleFR5cGU+Ci08L3hzOmVsZW1lbnQ+Ci08L3hzOnNjaGVtYT48L3dzZGw6dHlwZXM+PHdzZGw6bWVzc2FnZSBuYW1lPSJnZXRQcmljZU1lc3NhZ2UiPjx3c2RsOnBhcnQgbmFtZT0icGFydDEiIGVsZW1lbnQ9Im5zOmdldFByaWNlIiAvPjwvd3NkbDptZXNzYWdlPjx3c2RsOm1lc3NhZ2UgbmFtZT0iZ2V0UHJpY2VSZXNwb25zZU1lc3NhZ2UiPjx3c2RsOnBhcnQgbmFtZT0icGFydDEiIGVsZW1lbnQ9Im5zOmdldFByaWNlUmVzcG9uc2UiIC8+PC93c2RsOm1lc3NhZ2U+PHdzZGw6bWVzc2FnZSBuYW1lPSJ1cGRhdGVNZXNzYWdlIj48d3NkbDpwYXJ0IG5hbWU9InBhcnQxIiBlbGVtZW50PSJuczp1cGRhdGUiIC8+PC93c2RsOm1lc3NhZ2U+PHdzZGw6cG9ydFR5cGUgbmFtZT0iU3RvY2tRdW90ZVNlcnZpY2VQb3J0VHlwZSI+PHdzZGw6b3BlcmF0aW9uIG5hbWU9ImdldFByaWNlIj48d3NkbDppbnB1dCBtZXNzYWdlPSJheGlzMjpnZXRQcmljZU1lc3NhZ2UiIC8+PHdzZGw6b3V0cHV0IG1lc3NhZ2U9ImF4aXMyOmdldFByaWNlUmVzcG9uc2VNZXNzYWdlIiAvPjwvd3NkbDpvcGVyYXRpb24+PHdzZGw6b3BlcmF0aW9uIG5hbWU9InVwZGF0ZSI+PHdzZGw6aW5wdXQgbWVzc2FnZT0iYXhpczI6dXBkYXRlTWVzc2FnZSIgLz48L3dzZGw6b3BlcmF0aW9uPjwvd3NkbDpwb3J0VHlwZT48d3NkbDpiaW5kaW5nIG5hbWU9IlN0b2NrUXVvdGVTZXJ2aWNlU09BUDExQmluZGluZyIgdHlwZT0iYXhpczI6U3RvY2tRdW90ZVNlcnZpY2VQb3J0VHlwZSI+PHNvYXA6YmluZGluZyB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIgc3R5bGU9ImRvY3VtZW50IiAvPjx3c2RsOm9wZXJhdGlvbiBuYW1lPSJnZXRQcmljZSI+PHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjpnZXRQcmljZSIgc3R5bGU9ImRvY3VtZW50IiAvPjx3c2RsOmlucHV0Pjxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9Imh0dHA6Ly9xdWlja3N0YXJ0LnNhbXBsZXMvIiAvPjwvd3NkbDppbnB1dD48d3NkbDpvdXRwdXQ+PHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIG5hbWVzcGFjZT0iaHR0cDovL3F1aWNrc3RhcnQuc2FtcGxlcy8iIC8+PC93c2RsOm91dHB1dD48L3dzZGw6b3BlcmF0aW9uPjx3c2RsOm9wZXJhdGlvbiBuYW1lPSJ1cGRhdGUiPjxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46dXBkYXRlIiBzdHlsZT0iZG9jdW1lbnQiIC8+PHdzZGw6aW5wdXQ+PHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIG5hbWVzcGFjZT0iaHR0cDovL3F1aWNrc3RhcnQuc2FtcGxlcy8iIC8+PC93c2RsOmlucHV0Pjwvd3NkbDpvcGVyYXRpb24+PC93c2RsOmJpbmRpbmc+PHdzZGw6YmluZGluZyBuYW1lPSJTdG9ja1F1b3RlU2VydmljZVNPQVAxMkJpbmRpbmciIHR5cGU9ImF4aXMyOlN0b2NrUXVvdGVTZXJ2aWNlUG9ydFR5cGUiPjxzb2FwMTI6YmluZGluZyB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIgc3R5bGU9ImRvY3VtZW50IiAvPjx3c2RsOm9wZXJhdGlvbiBuYW1lPSJnZXRQcmljZSI+PHNvYXAxMjpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOmdldFByaWNlIiBzdHlsZT0iZG9jdW1lbnQiIC8+PHdzZGw6aW5wdXQ+PHNvYXAxMjpib2R5IHVzZT0ibGl0ZXJhbCIgbmFtZXNwYWNlPSJodHRwOi8vcXVpY2tzdGFydC5zYW1wbGVzLyIgLz48L3dzZGw6aW5wdXQ+PHdzZGw6b3V0cHV0Pjxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiIG5hbWVzcGFjZT0iaHR0cDovL3F1aWNrc3RhcnQuc2FtcGxlcy8iIC8+PC93c2RsOm91dHB1dD48L3dzZGw6b3BlcmF0aW9uPjx3c2RsOm9wZXJhdGlvbiBuYW1lPSJ1cGRhdGUiPjxzb2FwMTI6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjp1cGRhdGUiIHN0eWxlPSJkb2N1bWVudCIgLz48d3NkbDppbnB1dD48c29hcDEyOmJvZHkgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9Imh0dHA6Ly9xdWlja3N0YXJ0LnNhbXBsZXMvIiAvPjwvd3NkbDppbnB1dD48L3dzZGw6b3BlcmF0aW9uPjwvd3NkbDpiaW5kaW5nPjx3c2RsOnNlcnZpY2UgbmFtZT0iU3RvY2tRdW90ZVNlcnZpY2UiPjx3c2RsOnBvcnQgbmFtZT0iU3RvY2tRdW90ZVNlcnZpY2VTT0FQMTFwb3J0IiBiaW5kaW5nPSJheGlzMjpTdG9ja1F1b3RlU2VydmljZVNPQVAxMUJpbmRpbmciPjxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9heGlzMi9zZXJ2aWNlcy9TdG9ja1F1b3RlU2VydmljZSIgLz48L3dzZGw6cG9ydD48L3dzZGw6c2VydmljZT48L3dzZGw6ZGVmaW5pdGlvbnM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9xdWlja3N0YXJ0eG1sYmVhbnMvcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvcXVpY2tzdGFydHhtbGJlYW5zL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4NmM4MGUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9xdWlja3N0YXJ0eG1sYmVhbnMvcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHNlcnZpY2UgbmFtZT0iU3RvY2tRdW90ZVNlcnZpY2UiIHNjb3BlPSJhcHBsaWNhdGlvbiI+Ci0gICAgPG1lc3NhZ2VSZWNlaXZlcnM+Ci0gICAgICAgIDxtZXNzYWdlUmVjZWl2ZXIgbWVwPSJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaW4tb3V0IgotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJzYW1wbGVzLnF1aWNrc3RhcnQuc2VydmljZS54bWxiZWFucy5TdG9ja1F1b3RlU2VydmljZU1lc3NhZ2VSZWNlaXZlckluT3V0Ii8+Ci0gICAgICAgIDxtZXNzYWdlUmVjZWl2ZXIgbWVwPSJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaW4tb25seSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ic2FtcGxlcy5xdWlja3N0YXJ0LnNlcnZpY2UueG1sYmVhbnMuU3RvY2tRdW90ZVNlcnZpY2VNZXNzYWdlUmVjZWl2ZXJJbk9ubHkiLz4KLSAgICA8L21lc3NhZ2VSZWNlaXZlcnM+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJTZXJ2aWNlQ2xhc3MiPnNhbXBsZXMucXVpY2tzdGFydC5zZXJ2aWNlLnhtbGJlYW5zLlN0b2NrUXVvdGVTZXJ2aWNlU2tlbGV0b24KLSAgICA8L3BhcmFtZXRlcj4KLSAgICA8b3BlcmF0aW9uIG5hbWU9InVwZGF0ZSIgbWVwPSJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaW4tb25seSI+Ci0gICAgICAgIDxhY3Rpb25NYXBwaW5nPnVybjp1cGRhdGU8L2FjdGlvbk1hcHBpbmc+Ci0gICAgPC9vcGVyYXRpb24+Ci0gICAgPG9wZXJhdGlvbiBuYW1lPSJnZXRQcmljZSIgbWVwPSJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaW4tb3V0Ij4KLSAgICAgICAgPGFjdGlvbk1hcHBpbmc+dXJuOmdldFByaWNlPC9hY3Rpb25NYXBwaW5nPgotICAgICAgICA8b3V0cHV0QWN0aW9uTWFwcGluZz5odHRwOi8vcXVpY2tzdGFydC5zYW1wbGVzL1N0b2NrUXVvdGVTZXJ2aWNlUG9ydFR5cGUvZ2V0UHJpY2VSZXNwb25zZTwvb3V0cHV0QWN0aW9uTWFwcGluZz4KLSAgICA8L29wZXJhdGlvbj4KLTwvc2VydmljZT4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvcXVpY2tzdGFydHhtbGJlYW5zL3NyYy9zYW1wbGVzL3F1aWNrc3RhcnQvY2xpZW50cy9YTUxCRUFOU0NsaWVudC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9xdWlja3N0YXJ0eG1sYmVhbnMvc3JjL3NhbXBsZXMvcXVpY2tzdGFydC9jbGllbnRzL1hNTEJFQU5TQ2xpZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0YjJlYjguLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9xdWlja3N0YXJ0eG1sYmVhbnMvc3JjL3NhbXBsZXMvcXVpY2tzdGFydC9jbGllbnRzL1hNTEJFQU5TQ2xpZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBzYW1wbGVzLnF1aWNrc3RhcnQuY2xpZW50czsKLQotaW1wb3J0IHNhbXBsZXMucXVpY2tzdGFydC5zZXJ2aWNlLnhtbGJlYW5zLlN0b2NrUXVvdGVTZXJ2aWNlU3R1YjsKLWltcG9ydCBzYW1wbGVzLnF1aWNrc3RhcnQuc2VydmljZS54bWxiZWFucy54c2QuR2V0UHJpY2VEb2N1bWVudDsKLWltcG9ydCBzYW1wbGVzLnF1aWNrc3RhcnQuc2VydmljZS54bWxiZWFucy54c2QuR2V0UHJpY2VSZXNwb25zZURvY3VtZW50OwotaW1wb3J0IHNhbXBsZXMucXVpY2tzdGFydC5zZXJ2aWNlLnhtbGJlYW5zLnhzZC5VcGRhdGVEb2N1bWVudDsKLQotcHVibGljIGNsYXNzIFhNTEJFQU5TQ2xpZW50ewotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oamF2YS5sYW5nLlN0cmluZyBhcmdzW10pewotICAgICAgICB0cnl7Ci0gICAgICAgICAgICBTdG9ja1F1b3RlU2VydmljZVN0dWIgc3R1YiA9Ci0gICAgICAgICAgICAgICAgbmV3IFN0b2NrUXVvdGVTZXJ2aWNlU3R1YgotICAgICAgICAgICAgICAgICgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2F4aXMyL3NlcnZpY2VzL1N0b2NrUXVvdGVTZXJ2aWNlIik7Ci0KLSAgICAgICAgICAgIGdldFByaWNlKHN0dWIpOwotICAgICAgICAgICAgdXBkYXRlKHN0dWIpOwotICAgICAgICAgICAgZ2V0UHJpY2Uoc3R1Yik7Ci0KLSAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJcblxuXG4iKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIGZpcmUgYW5kIGZvcmdldCAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB1cGRhdGUoU3RvY2tRdW90ZVNlcnZpY2VTdHViIHN0dWIpewotICAgICAgICB0cnl7Ci0gICAgICAgICAgICBVcGRhdGVEb2N1bWVudCByZXFEb2MgPSBVcGRhdGVEb2N1bWVudC5GYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICBVcGRhdGVEb2N1bWVudC5VcGRhdGUgcmVxID0gcmVxRG9jLmFkZE5ld1VwZGF0ZSgpOwotICAgICAgICAgICAgcmVxLnNldFN5bWJvbCAoIkJDRCIpOwotICAgICAgICAgICAgcmVxLnNldFByaWNlICg0Mi4zMik7Ci0KLSAgICAgICAgICAgIHN0dWIudXBkYXRlKHJlcURvYyk7Ci0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oInByaWNlIHVwZGF0ZWQiKTsKLSAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJcblxuXG4iKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIHR3byB3YXkgY2FsbC9yZWNlaXZlICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGdldFByaWNlKFN0b2NrUXVvdGVTZXJ2aWNlU3R1YiBzdHViKXsKLSAgICAgICAgdHJ5ewotICAgICAgICAgICAgR2V0UHJpY2VEb2N1bWVudCByZXFEb2MgPSBHZXRQcmljZURvY3VtZW50LkZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIEdldFByaWNlRG9jdW1lbnQuR2V0UHJpY2UgcmVxID0gcmVxRG9jLmFkZE5ld0dldFByaWNlKCk7Ci0gICAgICAgICAgICByZXEuc2V0U3ltYm9sKCJCQ0QiKTsKLQotICAgICAgICAgICAgR2V0UHJpY2VSZXNwb25zZURvY3VtZW50IHJlcyA9Ci0gICAgICAgICAgICAgICAgc3R1Yi5nZXRQcmljZShyZXFEb2MpOwotCi0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4ocmVzLmdldEdldFByaWNlUmVzcG9uc2UoKS5nZXRSZXR1cm4oKSk7Ci0gICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiXG5cblxuIik7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3F1aWNrc3RhcnR4bWxiZWFucy9zcmMvc2FtcGxlcy9xdWlja3N0YXJ0L3NlcnZpY2UveG1sYmVhbnMvU3RvY2tRdW90ZVNlcnZpY2VTa2VsZXRvbi5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9xdWlja3N0YXJ0eG1sYmVhbnMvc3JjL3NhbXBsZXMvcXVpY2tzdGFydC9zZXJ2aWNlL3htbGJlYW5zL1N0b2NrUXVvdGVTZXJ2aWNlU2tlbGV0b24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzFlMDJmYS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3F1aWNrc3RhcnR4bWxiZWFucy9zcmMvc2FtcGxlcy9xdWlja3N0YXJ0L3NlcnZpY2UveG1sYmVhbnMvU3RvY2tRdW90ZVNlcnZpY2VTa2VsZXRvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBTdG9ja1F1b3RlU2VydmljZVNrZWxldG9uLmphdmEKLSAqCi0gKiBUaGlzIGZpbGUgd2FzIGF1dG8tZ2VuZXJhdGVkIGZyb20gV1NETAotICogYnkgdGhlIEFwYWNoZSBBeGlzMiB2ZXJzaW9uOiAxLjEtUkMyIE5vdiAwMiwgMjAwNiAoMDI6Mzc6NTAgTEtUKQotICovCi1wYWNrYWdlIHNhbXBsZXMucXVpY2tzdGFydC5zZXJ2aWNlLnhtbGJlYW5zOwotaW1wb3J0IHNhbXBsZXMucXVpY2tzdGFydC5zZXJ2aWNlLnhtbGJlYW5zLnhzZC5HZXRQcmljZURvY3VtZW50OwotaW1wb3J0IHNhbXBsZXMucXVpY2tzdGFydC5zZXJ2aWNlLnhtbGJlYW5zLnhzZC5HZXRQcmljZVJlc3BvbnNlRG9jdW1lbnQ7Ci1pbXBvcnQgc2FtcGxlcy5xdWlja3N0YXJ0LnNlcnZpY2UueG1sYmVhbnMueHNkLlVwZGF0ZURvY3VtZW50OwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0vKioKLSAqIFN0b2NrUXVvdGVTZXJ2aWNlU2tlbGV0b24gamF2YSBza2VsZXRvbiBmb3IgdGhlIGF4aXNTZXJ2aWNlCi0gKi8KLXB1YmxpYyBjbGFzcyBTdG9ja1F1b3RlU2VydmljZVNrZWxldG9uIGltcGxlbWVudHMgU3RvY2tRdW90ZVNlcnZpY2VTa2VsZXRvbkludGVyZmFjZSB7Ci0KLSAgICBwcml2YXRlIEhhc2hNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLQotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZShVcGRhdGVEb2N1bWVudCBwYXJhbTApIHsKLSAgICAgICAgbWFwLnB1dChwYXJhbTAuZ2V0VXBkYXRlKCkuZ2V0U3ltYm9sKCksIG5ldyBEb3VibGUocGFyYW0wLmdldFVwZGF0ZSgpLmdldFByaWNlKCkpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgR2V0UHJpY2VSZXNwb25zZURvY3VtZW50IGdldFByaWNlKEdldFByaWNlRG9jdW1lbnQgcGFyYW0xKSB7Ci0gICAgICAgIERvdWJsZSBwcmljZSA9IChEb3VibGUpIG1hcC5nZXQocGFyYW0xLmdldEdldFByaWNlKCkuZ2V0U3ltYm9sKCkpOwotICAgICAgICBkb3VibGUgcmV0ID0gNDI7Ci0gICAgICAgIGlmKHByaWNlICE9IG51bGwpewotICAgICAgICAgICAgcmV0ID0gcHJpY2UuZG91YmxlVmFsdWUoKTsKLSAgICAgICAgfQotICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oKTsKLSAgICAgICAgR2V0UHJpY2VSZXNwb25zZURvY3VtZW50IHJlc0RvYyA9Ci0gICAgICAgICAgICAgICAgR2V0UHJpY2VSZXNwb25zZURvY3VtZW50LkZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgR2V0UHJpY2VSZXNwb25zZURvY3VtZW50LkdldFByaWNlUmVzcG9uc2UgcmVzID0KLSAgICAgICAgICAgICAgICByZXNEb2MuYWRkTmV3R2V0UHJpY2VSZXNwb25zZSgpOwotICAgICAgICByZXMuc2V0UmV0dXJuKHJldCk7Ci0gICAgICAgIHJldHVybiByZXNEb2M7Ci0gICAgfQotfQotICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvcmVzb3VyY2VzL29tL2JpbmFyeS9iaW5hcnkueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9yZXNvdXJjZXMvb20vYmluYXJ5L2JpbmFyeS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmNzRmYjIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9yZXNvdXJjZXMvb20vYmluYXJ5L2JpbmFyeS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxQcm9qZWN0IHhtbG5zOmFwYWNoZT0iaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIiPjxOYW1lPkF4aXMyPC9OYW1lPjxDdXJyZW50VmVyc2lvbj4wLjk8L0N1cnJlbnRWZXJzaW9uPjxNb2R1bGVzPjwhLS0gTGlzdCBvZiBtb2R1bGVzIHRoYXQgY2FuIGJlIGZvdW5kIHVuZGVyIEF4aXMyIHByb2plY3QgLS0+PE1vZHVsZSBuYW1lPSJ4bWwiPjxEZXNjcmlwdGlvbj5YTUwgT2JqZWN0IE1vZGVsPC9EZXNjcmlwdGlvbj48L01vZHVsZT48TW9kdWxlIG5hbWU9IndzZGwiPjxEZXNjcmlwdGlvbj5GdWxsIFdTREwgc29sdXRpb24gZm9yIEF4aXMyPC9EZXNjcmlwdGlvbj48L01vZHVsZT48TW9kdWxlIG5hbWU9ImNvcmUiPjxEZXNjcmlwdGlvbj5Db3JlIHBhcnRzIG9mIEF4aXMyPC9EZXNjcmlwdGlvbj48L01vZHVsZT48L01vZHVsZXM+PC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvcm1pL1JFQURNRS50eHQgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3JtaS9SRUFETUUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTE1MDZkLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvcm1pL1JFQURNRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLVRvIHJ1biB0aGlzIHNhbXBsZSBmb2xsb3cgdGhlc2VzIHN0ZXBzCi0xLiBydW4gZ2VuZXJhdGVfc2VydmljZSBhbnQgdGFzay4gKGFudCBnZW5lcmF0ZV9zZXJ2aWNlKQotICAgdGhpcyBnZW5lcmF0ZXMgdGhlIHNlcnZpY2UgYW5kIHB1dCBpdCB0byB0aGUgcm1pc2VydmljZSBmb2xkZXIgdW5kZXIgcmVwb3NpdG9yeQotMi4gc3RhcnQgdGhlIGF4aXMyIHNlcnZlciAKLTMuIHJ1biB0aGUgY2xpZW50IChhbnQgcnVuX2NsaWVudCkKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvcm1pL2J1aWxkLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvcm1pL2J1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWIzMDIyYi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3JtaS9idWlsZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08cHJvamVjdCBuYW1lPSJzYW1wbGVfc2VydmljZSIgZGVmYXVsdD0iZ2VuZXJhdGVfc2VydmljZSIgYmFzZWRpcj0iLiI+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9ImluaXQiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0ic2FtcGxlX2hvbWUiIHZhbHVlPSIke2Jhc2VkaXJ9Ii8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjbGFzc2VzX2RpciIgdmFsdWU9IiR7c2FtcGxlX2hvbWV9L2NsYXNzZXMiLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InNyY19kaXIiIHZhbHVlPSIke3NhbXBsZV9ob21lfS9zcmMiLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9ImF4aXMyLmhvbWUiIHZhbHVlPSIuLi8uLi8iIC8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJsaWJfZGlyIiB2YWx1ZT0iJHtheGlzMi5ob21lfS9saWIiLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9ImRpc3RfZGlyIiB2YWx1ZT0iJHtheGlzMi5ob21lfS9kaXN0Ii8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXBsb3lfZGlyIiB2YWx1ZT0iJHtzYW1wbGVfaG9tZX0vZGVwbG95Ii8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzZXJ2aWNlX2ZpbGUiIHZhbHVlPSIke2F4aXMyLmhvbWV9L3JlcG9zaXRvcnkvcm1pc2VydmljZXMvcm1pc2VydmljZS5qc2EiLz4KLQotICAgICAgICA8cGF0aCBpZD0iY2xpZW50LmNsYXNzLnBhdGgiPgotICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke2F4aXMyLmhvbWV9L2xpYiI+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKi5qYXIiLz4KLSAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtkaXN0X2Rpcn0iPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIi8+Ci0gICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0KLSAgICAgICAgPC9wYXRoPgotCi0KLSAgICA8L3RhcmdldD4KLQotICAgIDx0YXJnZXQgbmFtZT0iZ2VuZXJhdGVfc2VydmljZSIgZGVwZW5kcz0iY2xlYW4iIGRlc2NyaXB0aW9uPSJHZW5lcmF0aW5nIHRoZSBzZXJ2aWNlIGFhciI+Ci0KLSAgICAgICAgPGVjaG8gbWVzc2FnZT0iY3JlYXRpbmcgdGhlIHNlcnZpY2UgYWFyIGZyb20gJHtzYW1wbGVfaG9tZX0iLz4KLQotICAgICAgICA8IS0tIGNyZWF0ZXMgZGVwbG95IGFuZCBjbGFzcyBkaXJlY3RvcmlzIC0tPgotICAgICAgICA8bWtkaXIgZGlyPSIke2RlcGxveV9kaXJ9Ii8+Ci0gICAgICAgIDxta2RpciBkaXI9IiR7ZGVwbG95X2Rpcn0vTUVUQS1JTkYiLz4KLQotICAgICAgICA8IS0tIGNvbXBpbGluZyB0aGUgY2xhc3NlcyAtLT4KLSAgICAgICAgPGphdmFjICBkZXN0ZGlyPSIke2RlcGxveV9kaXJ9IiBzcmNkaXI9IiR7c3JjX2Rpcn0iIGRlYnVnPSJvbiI+Ci0gICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSIqKi9jbGllbnQvKiIvPgotICAgICAgICAgICAgPGNsYXNzcGF0aD4KLSAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7bGliX2Rpcn0iIGluY2x1ZGVzPSIqLmphciIvPgotICAgICAgICAgICAgPC9jbGFzc3BhdGg+Ci0gICAgICAgIDwvamF2YWM+Ci0KLSAgICAgICAgPCEtLSBjb3B5IHNlcnZpY2VzIGZpbGUgLS0+Ci0gICAgICAgIDxjb3B5IGZpbGU9ImNvbmYvY29uZmlnLnhtbCIgdG9kaXI9IiR7ZGVwbG95X2Rpcn0vTUVUQS1JTkYiLz4KLQotICAgICAgICA8IS0tIGNyZWF0ZSBCYXNpY1NlcnZpY2VUZXN0LmFhciBmaWxlIC0tPgotICAgICAgICA8amFyIGRlc3RmaWxlPSIke3NlcnZpY2VfZmlsZX0iPgotICAgICAgICAgICAgPHppcGZpbGVzZXQgZGlyPSIke2RlcGxveV9kaXJ9IiBwcmVmaXg9IiIvPgotICAgICAgICA8L2phcj4KLQotICAgIDwvdGFyZ2V0PgotCi0gICAgPHRhcmdldCBuYW1lPSJydW5fY2xpZW50IiBkZXBlbmRzPSJjbGVhbiIgZGVzY3JpcHRpb249IlJ1bm5pbmcgdGhlIGNsaWVudHMiPgotCi0gICAgICAgIDxlY2hvIG1lc3NhZ2U9IlJ1bm5pbmcgdGhlIFJNSSBjbGllbnRzIi8+Ci0KLSAgICAgICAgPCEtLSBjcmVhdGVzIGRlcGxveSBhbmQgY2xhc3MgZGlyZWN0b3JpcyAtLT4KLSAgICAgICAgPG1rZGlyIGRpcj0iJHtjbGFzc2VzX2Rpcn0iLz4KLSAgICAgICAgPG1rZGlyIGRpcj0iJHtkaXN0X2Rpcn0iLz4KLQotICAgICAgICA8IS0tIGNvbXBpbGluZyB0aGUgY2xhc3NlcyAtLT4KLSAgICAgICAgPGphdmFjICBkZXN0ZGlyPSIke2NsYXNzZXNfZGlyfSIgc3JjZGlyPSIke3NyY19kaXJ9IiBkZWJ1Zz0ib24iPgotICAgICAgICAgICAgPGNsYXNzcGF0aD4KLSAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7bGliX2Rpcn0iIGluY2x1ZGVzPSIqLmphciIvPgotICAgICAgICAgICAgPC9jbGFzc3BhdGg+Ci0gICAgICAgIDwvamF2YWM+Ci0KLSAgICAgICAgPGphciBkZXN0ZmlsZT0iJHtkaXN0X2Rpcn0vcm1pX2NsaWVudC5qYXIiPgotICAgICAgICAgICAgPHppcGZpbGVzZXQgZGlyPSIke2NsYXNzZXNfZGlyfSIgcHJlZml4PSIiLz4KLSAgICAgICAgPC9qYXI+Ci0KLSAgICAgICAgPCEtLSBydW5uaW5nIHRoZSBjbGllbnRzIC0tPgotICAgICAgICA8amF2YSBjbGFzc25hbWU9InNhbXBsZS5ybWkuY2xpZW50LlRlc3RTZXJ2aWNlMSI+Ci0gICAgICAgICAgICAgPGNsYXNzcGF0aCByZWZpZD0iY2xpZW50LmNsYXNzLnBhdGgiLz4KLSAgICAgICAgPC9qYXZhPgotICAgICAgICA8amF2YSBjbGFzc25hbWU9InNhbXBsZS5ybWkuY2xpZW50LlRlc3RTZXJ2aWNlMiI+Ci0gICAgICAgICAgICAgPGNsYXNzcGF0aCByZWZpZD0iY2xpZW50LmNsYXNzLnBhdGgiLz4KLSAgICAgICAgPC9qYXZhPgotICAgICAgICA8amF2YSBjbGFzc25hbWU9InNhbXBsZS5ybWkuY2xpZW50LlRlc3RTZXJ2aWNlMyI+Ci0gICAgICAgICAgICAgPGNsYXNzcGF0aCByZWZpZD0iY2xpZW50LmNsYXNzLnBhdGgiLz4KLSAgICAgICAgPC9qYXZhPgotICAgICAgICA8amF2YSBjbGFzc25hbWU9InNhbXBsZS5ybWkuY2xpZW50LlRlc3RTZXJ2aWNlNCI+Ci0gICAgICAgICAgICAgPGNsYXNzcGF0aCByZWZpZD0iY2xpZW50LmNsYXNzLnBhdGgiLz4KLSAgICAgICAgPC9qYXZhPgotCi0gICAgPC90YXJnZXQ+Ci0KLQotCi0gICAgPHRhcmdldCBuYW1lPSJjbGVhbiIgZGVwZW5kcz0iaW5pdCIgZGVzY3JpcHRpb249ImRlbGV0ZXMgdGhlIG9sZCBjb250ZW50c3QiPgotICAgICAgICA8IS0tPGRlbGV0ZSBkaXI9IiR7Y2xhc3Nlc19kaXJ9Ii8+LS0+Ci0gICAgICAgIDxkZWxldGUgZGlyPSIke2RlcGxveV9kaXJ9Ii8+Ci0gICAgICAgIDxkZWxldGUgZGlyPSIke2NsYXNzZXNfZGlyfSIvPgotICAgICAgICA8ZGVsZXRlIGRpcj0iJHtkaXN0X2Rpcn0iLz4KLSAgICA8L3RhcmdldD4KLQotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvcm1pL2NvbmYvY29uZmlnLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvcm1pL2NvbmYvY29uZmlnLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY2NmY0ZC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3JtaS9jb25mL2NvbmZpZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxjb25maWcgeG1sbnM9Imh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL3JtaSI+Ci0gICAgPGV4dGVuc2lvbkNsYXNzZXM+Ci0gICAgICAgIDxleHRlbnNpb25DbGFzcz5zYW1wbGUucm1pLnNlcnZlci5kdG8uQ2hpbGRDbGFzczwvZXh0ZW5zaW9uQ2xhc3M+Ci0gICAgPC9leHRlbnNpb25DbGFzc2VzPgotICAgIDxwYWNrYWdlVG9OYW1lc3BhY2VNYXBpbmdzPgotICAgICAgICA8cGFja2FnZVRvTmFtZXNwYWNlTWFwPgotICAgICAgICAgICAgPG5hbWVzcGFjZT5odHRwOi8vc2FtcGxlL3NlcnZpY2U8L25hbWVzcGFjZT4KLSAgICAgICAgICAgIDxwYWNrYWdlTmFtZT5zYW1wbGUucm1pLnNlcnZlcjwvcGFja2FnZU5hbWU+Ci0gICAgICAgIDwvcGFja2FnZVRvTmFtZXNwYWNlTWFwPgotICAgICAgICA8cGFja2FnZVRvTmFtZXNwYWNlTWFwPgotICAgICAgICAgICAgPG5hbWVzcGFjZT5odHRwOi8vc2FtcGxlL3NlcnZpY2UvdHlwZXM8L25hbWVzcGFjZT4KLSAgICAgICAgICAgIDxwYWNrYWdlTmFtZT5zYW1wbGUucm1pLnNlcnZlci5kdG88L3BhY2thZ2VOYW1lPgotICAgICAgICA8L3BhY2thZ2VUb05hbWVzcGFjZU1hcD4KLSAgICAgICAgPHBhY2thZ2VUb05hbWVzcGFjZU1hcD4KLSAgICAgICAgICAgIDxuYW1lc3BhY2U+aHR0cDovL3NhbXBsZS9zZXJ2aWNlL2V4Y2VwdGlvbjwvbmFtZXNwYWNlPgotICAgICAgICAgICAgPHBhY2thZ2VOYW1lPnNhbXBsZS5ybWkuc2VydmVyLmV4Y2VwdGlvbjwvcGFja2FnZU5hbWU+Ci0gICAgICAgIDwvcGFja2FnZVRvTmFtZXNwYWNlTWFwPgotICAgIDwvcGFja2FnZVRvTmFtZXNwYWNlTWFwaW5ncz4KLSAgICA8c2VydmljZXM+Ci0gICAgICAgIDxzZXJ2aWNlPgotICAgICAgICAgICAgPHNlcnZpY2VDbGFzcz5zYW1wbGUucm1pLnNlcnZlci5TZXJ2aWNlMTwvc2VydmljZUNsYXNzPgotICAgICAgICA8L3NlcnZpY2U+Ci0gICAgICAgIDxzZXJ2aWNlPgotICAgICAgICAgICAgPHNlcnZpY2VDbGFzcz5zYW1wbGUucm1pLnNlcnZlci5TZXJ2aWNlMjwvc2VydmljZUNsYXNzPgotICAgICAgICA8L3NlcnZpY2U+Ci0gICAgICAgIDxzZXJ2aWNlPgotICAgICAgICAgICAgPHNlcnZpY2VDbGFzcz5zYW1wbGUucm1pLnNlcnZlci5TZXJ2aWNlMzwvc2VydmljZUNsYXNzPgotICAgICAgICA8L3NlcnZpY2U+Ci0gICAgICAgIDxzZXJ2aWNlPgotICAgICAgICAgICAgPHNlcnZpY2VDbGFzcz5zYW1wbGUucm1pLnNlcnZlci5TZXJ2aWNlNDwvc2VydmljZUNsYXNzPgotICAgICAgICA8L3NlcnZpY2U+Ci0gICAgPC9zZXJ2aWNlcz4KLSAgICA8c2ltcGxlRGF0YUhhbmRsZXJDbGFzcz5zYW1wbGUucm1pLnNlcnZlci5kYXRhYmluZC5DdXN0b21TaW1wbGVUeXBlSGFuZGxlcjwvc2ltcGxlRGF0YUhhbmRsZXJDbGFzcz4KLTwvY29uZmlnPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvcm1pL3NyYy9zYW1wbGUvcm1pL2NsaWVudC9UZXN0U2VydmljZTEuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvcm1pL3NyYy9zYW1wbGUvcm1pL2NsaWVudC9UZXN0U2VydmljZTEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTg4NTM3MS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3JtaS9zcmMvc2FtcGxlL3JtaS9jbGllbnQvVGVzdFNlcnZpY2UxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBzYW1wbGUucm1pLmNsaWVudDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLkNvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5jbGllbnQuUk1JQ2xpZW50UHJveHk7Ci1pbXBvcnQgc2FtcGxlLnJtaS5zZXJ2ZXIuU2VydmljZTFJbnRlcmZhY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLQotCi1wdWJsaWMgY2xhc3MgVGVzdFNlcnZpY2UxIHsKLQotICAgIHByaXZhdGUgQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvcjsKLQotICAgIHB1YmxpYyBUZXN0U2VydmljZTEoKSB7Ci0gICAgICAgIHRoaXMuY29uZmlndXJhdG9yID0gbmV3IENvbmZpZ3VyYXRvcigpOwotICAgICAgICB0aGlzLmNvbmZpZ3VyYXRvci5hZGRQYWNrYWdlVG9OYW1lc3BhY2VNYXBpbmcoInNhbXBsZS5ybWkuc2VydmVyIiwgImh0dHA6Ly9zYW1wbGUvc2VydmljZSIpOwotICAgICAgICB0aGlzLmNvbmZpZ3VyYXRvci5hZGRQYWNrYWdlVG9OYW1lc3BhY2VNYXBpbmcoInNhbXBsZS5ybWkuc2VydmVyLmR0byIsICJodHRwOi8vc2FtcGxlL3NlcnZpY2UvdHlwZXMiKTsKLSAgICAgICAgdGhpcy5jb25maWd1cmF0b3IuYWRkUGFja2FnZVRvTmFtZXNwYWNlTWFwaW5nKCJzYW1wbGUucm1pLnNlcnZlci5leGNlcHRpb24iLCAiaHR0cDovL3NhbXBsZS9zZXJ2aWNlL2V4Y2VwdGlvbiIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNZXRob2QxKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgU2VydmljZTFJbnRlcmZhY2UgcHJveHkgPQotICAgICAgICAgICAgICAgICAgICAoU2VydmljZTFJbnRlcmZhY2UpIFJNSUNsaWVudFByb3h5LmNyZWF0ZVByb3h5KFNlcnZpY2UxSW50ZXJmYWNlLmNsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vbG9jYWxob3N0OjgwODAvYXhpczIvc2VydmljZXMvU2VydmljZTEiKTsKLSAgICAgICAgICAgIFN0cmluZyByZXN1bHQgPSBwcm94eS5tZXRob2QxKCJIZWxsb3ciLCIgV29ybGQiKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUmVzdWx0ID09PiAiICsgcmVzdWx0KTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kMigpIHsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgU2VydmljZTFJbnRlcmZhY2UgcHJveHkgPQotICAgICAgICAgICAgICAgICAgICAoU2VydmljZTFJbnRlcmZhY2UpIFJNSUNsaWVudFByb3h5LmNyZWF0ZVByb3h5KFNlcnZpY2UxSW50ZXJmYWNlLmNsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vbG9jYWxob3N0OjgwODAvYXhpczIvc2VydmljZXMvU2VydmljZTEiKTsKLSAgICAgICAgICAgIEludGVnZXIgcmVzdWx0ID0gcHJveHkubWV0aG9kMihuZXcgSW50ZWdlcig1KSxuZXcgSW50ZWdlcigxNSkpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJSZXN1bHQgPT0+ICIgKyByZXN1bHQpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNZXRob2QzKCl7Ci0gICAgICAgICB0cnkgewotICAgICAgICAgICAgU2VydmljZTFJbnRlcmZhY2UgcHJveHkgPQotICAgICAgICAgICAgICAgICAgICAoU2VydmljZTFJbnRlcmZhY2UpIFJNSUNsaWVudFByb3h5LmNyZWF0ZVByb3h5KFNlcnZpY2UxSW50ZXJmYWNlLmNsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vbG9jYWxob3N0OjgwODAvYXhpczIvc2VydmljZXMvU2VydmljZTEiKTsKLSAgICAgICAgICAgIERhdGUgcmVzdWx0ID0gcHJveHkubWV0aG9kMyhuZXcgRGF0ZSgpKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUmVzdWx0ID09PiAiICsgcmVzdWx0KTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0gICAgICAgIFRlc3RTZXJ2aWNlMSB0ZXN0U2VydmljZTEgPSBuZXcgVGVzdFNlcnZpY2UxKCk7Ci0gICAgICAgIHRlc3RTZXJ2aWNlMS50ZXN0TWV0aG9kMSgpOwotICAgICAgICB0ZXN0U2VydmljZTEudGVzdE1ldGhvZDIoKTsKLSAgICAgICAgdGVzdFNlcnZpY2UxLnRlc3RNZXRob2QzKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9ybWkvc3JjL3NhbXBsZS9ybWkvY2xpZW50L1Rlc3RTZXJ2aWNlMi5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9ybWkvc3JjL3NhbXBsZS9ybWkvY2xpZW50L1Rlc3RTZXJ2aWNlMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OWVhMjlkLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvcm1pL3NyYy9zYW1wbGUvcm1pL2NsaWVudC9UZXN0U2VydmljZTIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBzYW1wbGUucm1pLmNsaWVudDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLkNvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5jbGllbnQuUk1JQ2xpZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmNsaWVudC5STUlDbGllbnRQcm94eTsKLWltcG9ydCBzYW1wbGUucm1pLnNlcnZlci5TZXJ2aWNlMjsKLWltcG9ydCBzYW1wbGUucm1pLnNlcnZlci5TZXJ2aWNlMUludGVyZmFjZTsKLWltcG9ydCBzYW1wbGUucm1pLnNlcnZlci5TZXJ2aWNlMkludGVyZmFjZTsKLWltcG9ydCBzYW1wbGUucm1pLnNlcnZlci5kdG8uQ2hpbGRDbGFzczsKLWltcG9ydCBzYW1wbGUucm1pLnNlcnZlci5kdG8uUGFyZW50Q2xhc3M7Ci1pbXBvcnQgc2FtcGxlLnJtaS5zZXJ2ZXIuZHRvLlRlc3RDbGFzczE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1wdWJsaWMgY2xhc3MgVGVzdFNlcnZpY2UyIHsKLQotICAgIHByaXZhdGUgQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvcjsKLQotICAgIHB1YmxpYyBUZXN0U2VydmljZTIoKSB7Ci0gICAgICAgIHRoaXMuY29uZmlndXJhdG9yID0gbmV3IENvbmZpZ3VyYXRvcigpOwotICAgICAgICB0aGlzLmNvbmZpZ3VyYXRvci5hZGRQYWNrYWdlVG9OYW1lc3BhY2VNYXBpbmcoInNhbXBsZS5ybWkuc2VydmVyIiwgImh0dHA6Ly9zYW1wbGUvc2VydmljZSIpOwotICAgICAgICB0aGlzLmNvbmZpZ3VyYXRvci5hZGRQYWNrYWdlVG9OYW1lc3BhY2VNYXBpbmcoInNhbXBsZS5ybWkuc2VydmVyLmR0byIsICJodHRwOi8vc2FtcGxlL3NlcnZpY2UvdHlwZXMiKTsKLSAgICAgICAgdGhpcy5jb25maWd1cmF0b3IuYWRkUGFja2FnZVRvTmFtZXNwYWNlTWFwaW5nKCJzYW1wbGUucm1pLnNlcnZlci5leGNlcHRpb24iLCAiaHR0cDovL3NhbXBsZS9zZXJ2aWNlL2V4Y2VwdGlvbiIpOwotICAgICAgICB0aGlzLmNvbmZpZ3VyYXRvci5hZGRFeHRlbnNpb24oUGFyZW50Q2xhc3MuY2xhc3MpOwotICAgICAgICB0aGlzLmNvbmZpZ3VyYXRvci5hZGRFeHRlbnNpb24oQ2hpbGRDbGFzcy5jbGFzcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE1ldGhvZDExKCkgewotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTZXJ2aWNlMkludGVyZmFjZSBwcm94eSA9Ci0gICAgICAgICAgICAgICAgICAgIChTZXJ2aWNlMkludGVyZmFjZSkgUk1JQ2xpZW50UHJveHkuY3JlYXRlUHJveHkoU2VydmljZTJJbnRlcmZhY2UuY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9heGlzMi9zZXJ2aWNlcy9TZXJ2aWNlMiIpOwotICAgICAgICAgICAgUGFyZW50Q2xhc3MgcGFyZW50Q2xhc3MgPSBuZXcgUGFyZW50Q2xhc3MoKTsKLSAgICAgICAgICAgIHBhcmVudENsYXNzLnNldFBhcmFtMSgidGVzdCBwYXJhbTEiKTsKLSAgICAgICAgICAgIHBhcmVudENsYXNzLnNldFBhcmFtMigxMCk7Ci0gICAgICAgICAgICBQYXJlbnRDbGFzcyByZXN1bHQgPSBwcm94eS5tZXRob2QxKHBhcmVudENsYXNzKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUmVzdWx0IHBhcmFtIDEgPT0+ICIgKyByZXN1bHQuZ2V0UGFyYW0xKCkpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJSZXN1bHQgcGFyYW0gMiA9PT4gIiArIHJlc3VsdC5nZXRQYXJhbTIoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOyAgLy9UbyBjaGFuZ2UgYm9keSBvZiBjYXRjaCBzdGF0ZW1lbnQgdXNlIEZpbGUgfCBTZXR0aW5ncyB8IEZpbGUgVGVtcGxhdGVzLgotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE1ldGhvZDEyKCkgewotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTZXJ2aWNlMkludGVyZmFjZSBwcm94eSA9Ci0gICAgICAgICAgICAgICAgICAgIChTZXJ2aWNlMkludGVyZmFjZSkgUk1JQ2xpZW50UHJveHkuY3JlYXRlUHJveHkoU2VydmljZTJJbnRlcmZhY2UuY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9heGlzMi9zZXJ2aWNlcy9TZXJ2aWNlMiIpOwotICAgICAgICAgICAgQ2hpbGRDbGFzcyBjaGlsZENsYXNzID0gbmV3IENoaWxkQ2xhc3MoKTsKLSAgICAgICAgICAgIGNoaWxkQ2xhc3Muc2V0UGFyYW0xKCJ0ZXN0IHBhcmFtMSIpOwotICAgICAgICAgICAgY2hpbGRDbGFzcy5zZXRQYXJhbTIoMTApOwotICAgICAgICAgICAgY2hpbGRDbGFzcy5zZXRQYXJhbTMoInRlc3QgcGFyYW0zIik7Ci0gICAgICAgICAgICBjaGlsZENsYXNzLnNldFBhcmFtNChuZXcgSW50ZWdlcigxMikpOwotICAgICAgICAgICAgQ2hpbGRDbGFzcyByZXN1bHQgPSAoQ2hpbGRDbGFzcykgcHJveHkubWV0aG9kMShjaGlsZENsYXNzKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUmVzdWx0IHBhcmFtIDEgPT0+ICIgKyByZXN1bHQuZ2V0UGFyYW0xKCkpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJSZXN1bHQgcGFyYW0gMiA9PT4gIiArIHJlc3VsdC5nZXRQYXJhbTIoKSk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlJlc3VsdCBwYXJhbSAzID09PiAiICsgcmVzdWx0LmdldFBhcmFtMygpKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUmVzdWx0IHBhcmFtIDQgPT0+ICIgKyByZXN1bHQuZ2V0UGFyYW00KCkpOwotCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOyAgLy9UbyBjaGFuZ2UgYm9keSBvZiBjYXRjaCBzdGF0ZW1lbnQgdXNlIEZpbGUgfCBTZXR0aW5ncyB8IEZpbGUgVGVtcGxhdGVzLgotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE1ldGhvZDIoKSB7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNlcnZpY2UySW50ZXJmYWNlIHByb3h5ID0KLSAgICAgICAgICAgICAgICAgICAgKFNlcnZpY2UySW50ZXJmYWNlKSBSTUlDbGllbnRQcm94eS5jcmVhdGVQcm94eShTZXJ2aWNlMkludGVyZmFjZS5jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2F4aXMyL3NlcnZpY2VzL1NlcnZpY2UyIik7Ci0gICAgICAgICAgICBUZXN0Q2xhc3MxIHRlc3RDbGFzczEgPSBuZXcgVGVzdENsYXNzMSgpOwotICAgICAgICAgICAgdGVzdENsYXNzMS5zZXRQYXJhbTEoInRlc3QgcGFyYW0xIik7Ci0gICAgICAgICAgICB0ZXN0Q2xhc3MxLnNldFBhcm1hMigidGVzdCBwYXJhbTIiKTsKLSAgICAgICAgICAgIFRlc3RDbGFzczEgcmVzdWx0ID0gcHJveHkubWV0aG9kMih0ZXN0Q2xhc3MxKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUmVzdWx0IHBhcmFtIDEgPT0+ICIgKyByZXN1bHQuZ2V0UGFyYW0xKCkpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJSZXN1bHQgcGFyYW0gMiA9PT4gIiArIHJlc3VsdC5nZXRQYXJtYTIoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOyAgLy9UbyBjaGFuZ2UgYm9keSBvZiBjYXRjaCBzdGF0ZW1lbnQgdXNlIEZpbGUgfCBTZXR0aW5ncyB8IEZpbGUgVGVtcGxhdGVzLgotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotICAgICAgICBUZXN0U2VydmljZTIgdGVzdFNlcnZpY2UyID0gbmV3IFRlc3RTZXJ2aWNlMigpOwotICAgICAgICB0ZXN0U2VydmljZTIudGVzdE1ldGhvZDExKCk7Ci0gICAgICAgIHRlc3RTZXJ2aWNlMi50ZXN0TWV0aG9kMTIoKTsKLSAgICAgICAgdGVzdFNlcnZpY2UyLnRlc3RNZXRob2QyKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3JtaS9zcmMvc2FtcGxlL3JtaS9jbGllbnQvVGVzdFNlcnZpY2UzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3JtaS9zcmMvc2FtcGxlL3JtaS9jbGllbnQvVGVzdFNlcnZpY2UzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzNWFiNDMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9ybWkvc3JjL3NhbXBsZS9ybWkvY2xpZW50L1Rlc3RTZXJ2aWNlMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIHNhbXBsZS5ybWkuY2xpZW50OwotCi1pbXBvcnQgc2FtcGxlLnJtaS5zZXJ2ZXIuU2VydmljZTM7Ci1pbXBvcnQgc2FtcGxlLnJtaS5zZXJ2ZXIuU2VydmljZTJJbnRlcmZhY2U7Ci1pbXBvcnQgc2FtcGxlLnJtaS5zZXJ2ZXIuU2VydmljZTNJbnRlcmZhY2U7Ci1pbXBvcnQgc2FtcGxlLnJtaS5zZXJ2ZXIuZXhjZXB0aW9uLkV4Y2VwdGlvbjE7Ci1pbXBvcnQgc2FtcGxlLnJtaS5zZXJ2ZXIuZXhjZXB0aW9uLkV4Y2VwdGlvbjI7Ci1pbXBvcnQgc2FtcGxlLnJtaS5zZXJ2ZXIuZXhjZXB0aW9uLkV4Y2VwdGlvbjM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmNsaWVudC5STUlDbGllbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuY2xpZW50LlJNSUNsaWVudFByb3h5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotCi1wdWJsaWMgY2xhc3MgVGVzdFNlcnZpY2UzIHsKLQotICAgIHByaXZhdGUgQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvcjsKLQotICAgIHB1YmxpYyBUZXN0U2VydmljZTMoKSB7Ci0gICAgICAgIHRoaXMuY29uZmlndXJhdG9yID0gbmV3IENvbmZpZ3VyYXRvcigpOwotICAgICAgICB0aGlzLmNvbmZpZ3VyYXRvci5hZGRQYWNrYWdlVG9OYW1lc3BhY2VNYXBpbmcoInNhbXBsZS5ybWkuc2VydmVyIiwgImh0dHA6Ly9zYW1wbGUvc2VydmljZSIpOwotICAgICAgICB0aGlzLmNvbmZpZ3VyYXRvci5hZGRQYWNrYWdlVG9OYW1lc3BhY2VNYXBpbmcoInNhbXBsZS5ybWkuc2VydmVyLmR0byIsICJodHRwOi8vc2FtcGxlL3NlcnZpY2UvdHlwZXMiKTsKLSAgICAgICAgdGhpcy5jb25maWd1cmF0b3IuYWRkUGFja2FnZVRvTmFtZXNwYWNlTWFwaW5nKCJzYW1wbGUucm1pLnNlcnZlci5leGNlcHRpb24iLCAiaHR0cDovL3NhbXBsZS9zZXJ2aWNlL2V4Y2VwdGlvbiIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNZXRob2QxKCkgewotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTZXJ2aWNlM0ludGVyZmFjZSBwcm94eSA9Ci0gICAgICAgICAgICAgICAgICAgIChTZXJ2aWNlM0ludGVyZmFjZSkgUk1JQ2xpZW50UHJveHkuY3JlYXRlUHJveHkoU2VydmljZTNJbnRlcmZhY2UuY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9heGlzMi9zZXJ2aWNlcy9TZXJ2aWNlMyIpOwotICAgICAgICAgICAgcHJveHkubWV0aG9kMSgpOwotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgYXhpc0ZhdWx0KSB7Ci0gICAgICAgICAgICBheGlzRmF1bHQucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbjEgZXhjZXB0aW9uMSkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJHb3QgdGhlIGV4Y2VwdGlvbiAxIik7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNZXRob2QyKCkgewotCi0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNlcnZpY2UzSW50ZXJmYWNlIHByb3h5ID0KLSAgICAgICAgICAgICAgICAgICAgKFNlcnZpY2UzSW50ZXJmYWNlKSBSTUlDbGllbnRQcm94eS5jcmVhdGVQcm94eShTZXJ2aWNlM0ludGVyZmFjZS5jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2F4aXMyL3NlcnZpY2VzL1NlcnZpY2UzIik7Ci0gICAgICAgICAgICBwcm94eS5tZXRob2QyKCJ0ZXN0IHN0cmluZyIpOwotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgYXhpc0ZhdWx0KSB7Ci0gICAgICAgICAgICBheGlzRmF1bHQucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbjIgZXhjZXB0aW9uMikgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJHb3QgdGhlIGV4Y2VwdGlvbiAyIik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbjEgZXhjZXB0aW9uMSkgewotICAgICAgICAgICAgZXhjZXB0aW9uMS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE1ldGhvZDMoKSB7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNlcnZpY2UzSW50ZXJmYWNlIHByb3h5ID0KLSAgICAgICAgICAgICAgICAgICAgKFNlcnZpY2UzSW50ZXJmYWNlKSBSTUlDbGllbnRQcm94eS5jcmVhdGVQcm94eShTZXJ2aWNlM0ludGVyZmFjZS5jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2F4aXMyL3NlcnZpY2VzL1NlcnZpY2UzIik7Ci0gICAgICAgICAgICBwcm94eS5tZXRob2QzKDUpOwotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgYXhpc0ZhdWx0KSB7Ci0gICAgICAgICAgICBheGlzRmF1bHQucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbjMgZXhjZXB0aW9uMykgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJHb3QgdGhlIGV4Y2VwdGlvbiAzIik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbjIgZXhjZXB0aW9uMikgewotICAgICAgICAgICAgZXhjZXB0aW9uMi5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uMSBleGNlcHRpb24xKSB7Ci0gICAgICAgICAgICBleGNlcHRpb24xLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0gICAgICAgIFRlc3RTZXJ2aWNlMyB0ZXN0U2VydmljZTMgPSBuZXcgVGVzdFNlcnZpY2UzKCk7Ci0gICAgICAgIHRlc3RTZXJ2aWNlMy50ZXN0TWV0aG9kMSgpOwotICAgICAgICB0ZXN0U2VydmljZTMudGVzdE1ldGhvZDIoKTsKLSAgICAgICAgdGVzdFNlcnZpY2UzLnRlc3RNZXRob2QzKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9ybWkvc3JjL3NhbXBsZS9ybWkvY2xpZW50L1Rlc3RTZXJ2aWNlNC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9ybWkvc3JjL3NhbXBsZS9ybWkvY2xpZW50L1Rlc3RTZXJ2aWNlNC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OWY1NTYyLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvcm1pL3NyYy9zYW1wbGUvcm1pL2NsaWVudC9UZXN0U2VydmljZTQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBzYW1wbGUucm1pLmNsaWVudDsKLQotaW1wb3J0IHNhbXBsZS5ybWkuc2VydmVyLlNlcnZpY2U0SW50ZXJmYWNlOwotaW1wb3J0IHNhbXBsZS5ybWkuc2VydmVyLmR0by5DaGlsZENsYXNzOwotaW1wb3J0IHNhbXBsZS5ybWkuc2VydmVyLmR0by5QYXJlbnRDbGFzczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5Db25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuY2xpZW50LlJNSUNsaWVudFByb3h5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi0KLXB1YmxpYyBjbGFzcyBUZXN0U2VydmljZTQgewotCi0gICAgcHJpdmF0ZSBDb25maWd1cmF0b3IgY29uZmlndXJhdG9yOwotCi0gICAgcHVibGljIFRlc3RTZXJ2aWNlNCgpIHsKLQotICAgICAgICB0aGlzLmNvbmZpZ3VyYXRvciA9IG5ldyBDb25maWd1cmF0b3IoKTsKLSAgICAgICAgdGhpcy5jb25maWd1cmF0b3IuYWRkUGFja2FnZVRvTmFtZXNwYWNlTWFwaW5nKCJzYW1wbGUucm1pLnNlcnZlciIsICJodHRwOi8vc2FtcGxlL3NlcnZpY2UiKTsKLSAgICAgICAgdGhpcy5jb25maWd1cmF0b3IuYWRkUGFja2FnZVRvTmFtZXNwYWNlTWFwaW5nKCJzYW1wbGUucm1pLnNlcnZlci5kdG8iLCAiaHR0cDovL3NhbXBsZS9zZXJ2aWNlL3R5cGVzIik7Ci0gICAgICAgIHRoaXMuY29uZmlndXJhdG9yLmFkZEV4dGVuc2lvbihQYXJlbnRDbGFzcy5jbGFzcyk7Ci0gICAgICAgIHRoaXMuY29uZmlndXJhdG9yLmFkZEV4dGVuc2lvbihDaGlsZENsYXNzLmNsYXNzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kMTEoKSB7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNlcnZpY2U0SW50ZXJmYWNlIHByb3h5ID0KLSAgICAgICAgICAgICAgICAgICAgKFNlcnZpY2U0SW50ZXJmYWNlKSBSTUlDbGllbnRQcm94eS5jcmVhdGVQcm94eShTZXJ2aWNlNEludGVyZmFjZS5jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2F4aXMyL3NlcnZpY2VzL1NlcnZpY2U0Iik7Ci0gICAgICAgICAgICBPYmplY3QgcmVzdWx0ID0gcHJveHkubWV0aG9kMShudWxsKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNZXRob2QxMigpIHsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgU2VydmljZTRJbnRlcmZhY2UgcHJveHkgPQotICAgICAgICAgICAgICAgICAgICAoU2VydmljZTRJbnRlcmZhY2UpIFJNSUNsaWVudFByb3h5LmNyZWF0ZVByb3h5KFNlcnZpY2U0SW50ZXJmYWNlLmNsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vbG9jYWxob3N0OjgwODAvYXhpczIvc2VydmljZXMvU2VydmljZTQiKTsKLSAgICAgICAgICAgIE9iamVjdCByZXN1bHQgPSBwcm94eS5tZXRob2QxKCJ0ZXN0IHN0cmluZyIpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJHb3QgdGhlIHN0cmluZyAiICsgcmVzdWx0KTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kMTMoKSB7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNlcnZpY2U0SW50ZXJmYWNlIHByb3h5ID0KLSAgICAgICAgICAgICAgICAgICAgKFNlcnZpY2U0SW50ZXJmYWNlKSBSTUlDbGllbnRQcm94eS5jcmVhdGVQcm94eShTZXJ2aWNlNEludGVyZmFjZS5jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2F4aXMyL3NlcnZpY2VzL1NlcnZpY2U0Iik7Ci0KLSAgICAgICAgICAgIFBhcmVudENsYXNzIHBhcmVudENsYXNzID0gbmV3IFBhcmVudENsYXNzKCk7Ci0gICAgICAgICAgICBwYXJlbnRDbGFzcy5zZXRQYXJhbTEoInRlc3Qgc3RyaW5nIik7Ci0gICAgICAgICAgICBwYXJlbnRDbGFzcy5zZXRQYXJhbTIoMyk7Ci0gICAgICAgICAgICBQYXJlbnRDbGFzcyByZXN1bHQgPSAoUGFyZW50Q2xhc3MpIHByb3h5Lm1ldGhvZDEocGFyZW50Q2xhc3MpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJQYXJhbSAxID09PiIgKyByZXN1bHQuZ2V0UGFyYW0xKCkpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJQYXJhbSAyID09PiIgKyByZXN1bHQuZ2V0UGFyYW0yKCkpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNZXRob2QzKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgU2VydmljZTRJbnRlcmZhY2UgcHJveHkgPQotICAgICAgICAgICAgICAgICAgICAoU2VydmljZTRJbnRlcmZhY2UpIFJNSUNsaWVudFByb3h5LmNyZWF0ZVByb3h5KFNlcnZpY2U0SW50ZXJmYWNlLmNsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vbG9jYWxob3N0OjgwODAvYXhpczIvc2VydmljZXMvU2VydmljZTQiKTsKLSAgICAgICAgICAgIFN0cmluZ1tdIHJlc3VsdCA9IHByb3h5Lm1ldGhvZDMoIlBhcmFtMSIsIlBhcmFtMiIsIlBhcmFtMyIpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPYmplY3QgMSA9PT4iICsgcmVzdWx0WzBdKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT2JqZWN0IDIgPT0+IiArIHJlc3VsdFsxXSk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9iamVjdCAzID09PiIgKyByZXN1bHRbMl0pOwotCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE1ldGhvZDIoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgU2VydmljZTRJbnRlcmZhY2UgcHJveHkgPQotICAgICAgICAgICAgICAgICAgICAoU2VydmljZTRJbnRlcmZhY2UpIFJNSUNsaWVudFByb3h5LmNyZWF0ZVByb3h5KFNlcnZpY2U0SW50ZXJmYWNlLmNsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vbG9jYWxob3N0OjgwODAvYXhpczIvc2VydmljZXMvU2VydmljZTQiKTsKLQotICAgICAgICAgICAgTGlzdCBwYXJhbTEgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICBwYXJhbTEuYWRkKG5ldyBDaGlsZENsYXNzKCkpOwotICAgICAgICAgICAgcGFyYW0xLmFkZChuZXcgSW50ZWdlcigyKSk7Ci0KLSAgICAgICAgICAgIExpc3QgcGFyYW0yID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgcGFyYW0yLmFkZChuZXcgUGFyZW50Q2xhc3MoKSk7Ci0gICAgICAgICAgICBwYXJhbTIuYWRkKG5ldyBGbG9hdCgyLjM0ZikpOwotCi0gICAgICAgICAgICBMaXN0IHJlc3VsdCA9IHByb3h5Lm1ldGhvZDIocGFyYW0xLHBhcmFtMik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9iamVjdCAxID09PiIgKyByZXN1bHQuZ2V0KDEpKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT2JqZWN0IDMgPT0+IiArIHJlc3VsdC5nZXQoMykpOwotCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE1ldGhvZDQoKXsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgU2VydmljZTRJbnRlcmZhY2UgcHJveHkgPQotICAgICAgICAgICAgICAgICAgICAgIChTZXJ2aWNlNEludGVyZmFjZSkgUk1JQ2xpZW50UHJveHkuY3JlYXRlUHJveHkoU2VydmljZTRJbnRlcmZhY2UuY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vbG9jYWxob3N0OjgwODAvYXhpczIvc2VydmljZXMvU2VydmljZTQiKTsKLSAgICAgICAgICAgIE1hcCBwYXJhbTEgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICAgICAgUGFyZW50Q2xhc3MgcGFyZW50ID0gbmV3IFBhcmVudENsYXNzKCk7Ci0gICAgICAgICAgICBwYXJlbnQuc2V0UGFyYW0xKCJwYXJhbTEiKTsKLSAgICAgICAgICAgIHBhcmVudC5zZXRQYXJhbTIoNSk7Ci0gICAgICAgICAgICBwYXJhbTEucHV0KCJrZXkxIixwYXJlbnQpOwotICAgICAgICAgICAgcGFyYW0xLnB1dCgia2V5MiIsInZhbHVlMiIpOwotICAgICAgICAgICAgcGFyYW0xLnB1dCgia2V5MyIsbmV3IEludGVnZXIoNikpOwotCi0gICAgICAgICAgICBNYXAgcmVzdWx0ID0gcHJveHkubWV0aG9kNChwYXJhbTEpOwotICAgICAgICAgICAgUGFyZW50Q2xhc3MgcmVzdWx0UGFyZW50ID0gKFBhcmVudENsYXNzKSByZXN1bHQuZ2V0KCJrZXkxIik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlBhcmVudCBwYXJhbTEgPT0+ICIgKyByZXN1bHRQYXJlbnQuZ2V0UGFyYW0xKCkpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJQYXJlbnQgcGFyYW0yID09PiAiICsgcmVzdWx0UGFyZW50LmdldFBhcmFtMigpKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiS2V5IDIgPT0+ICIgKyByZXN1bHQuZ2V0KCJrZXkyIikpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJLZXkgMyA9PT4gIiArIHJlc3VsdC5nZXQoImtleTMiKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBheGlzRmF1bHQpIHsKLSAgICAgICAgICAgIGF4aXNGYXVsdC5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotCi0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0KLSAgICAgICAgVGVzdFNlcnZpY2U0IHRlc3RTZXJ2aWNlNCA9IG5ldyBUZXN0U2VydmljZTQoKTsKLSAgICAgICAgdGVzdFNlcnZpY2U0LnRlc3RNZXRob2QxMSgpOwotICAgICAgICB0ZXN0U2VydmljZTQudGVzdE1ldGhvZDEyKCk7Ci0gICAgICAgIHRlc3RTZXJ2aWNlNC50ZXN0TWV0aG9kMTMoKTsKLSAgICAgICAgdGVzdFNlcnZpY2U0LnRlc3RNZXRob2QyKCk7Ci0gICAgICAgIHRlc3RTZXJ2aWNlNC50ZXN0TWV0aG9kMygpOwotICAgICAgICB0ZXN0U2VydmljZTQudGVzdE1ldGhvZDQoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3JtaS9zcmMvc2FtcGxlL3JtaS9zZXJ2ZXIvU2VydmljZTEuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvcm1pL3NyYy9zYW1wbGUvcm1pL3NlcnZlci9TZXJ2aWNlMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTY5NzgzLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvcm1pL3NyYy9zYW1wbGUvcm1pL3NlcnZlci9TZXJ2aWNlMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugc2FtcGxlLnJtaS5zZXJ2ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLQotcHVibGljIGNsYXNzIFNlcnZpY2UxIGltcGxlbWVudHMgU2VydmljZTFJbnRlcmZhY2UgewotCi0gICAgcHVibGljIFN0cmluZyBtZXRob2QxKFN0cmluZyBwYXJhbTEsIFN0cmluZyBwYXJhbTIpewotICAgICAgICByZXR1cm4gcGFyYW0xICsgcGFyYW0yOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgbWV0aG9kMihpbnQgcGFyYW0xLCBpbnQgcGFyYW0yKXsKLSAgICAgICAgcmV0dXJuIHBhcmFtMSArIHBhcmFtMjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRGF0ZSBtZXRob2QzKERhdGUgcGFyYW0xKSB7Ci0gICAgICAgIHJldHVybiBwYXJhbTE7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9ybWkvc3JjL3NhbXBsZS9ybWkvc2VydmVyL1NlcnZpY2UxSW50ZXJmYWNlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3JtaS9zcmMvc2FtcGxlL3JtaS9zZXJ2ZXIvU2VydmljZTFJbnRlcmZhY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRmNmIyMS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3JtaS9zcmMvc2FtcGxlL3JtaS9zZXJ2ZXIvU2VydmljZTFJbnRlcmZhY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIHNhbXBsZS5ybWkuc2VydmVyOwotCi1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgU2VydmljZTFJbnRlcmZhY2UgewotCi0gICAgcHVibGljIFN0cmluZyBtZXRob2QxKFN0cmluZyBwYXJhbTEsIFN0cmluZyBwYXJhbTIpOwotCi0gICAgcHVibGljIGludCBtZXRob2QyKGludCBwYXJhbTEsIGludCBwYXJhbTIpOwotCi0gICAgcHVibGljIERhdGUgbWV0aG9kMyhEYXRlIHBhcmFtMSk7Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3JtaS9zcmMvc2FtcGxlL3JtaS9zZXJ2ZXIvU2VydmljZTIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvcm1pL3NyYy9zYW1wbGUvcm1pL3NlcnZlci9TZXJ2aWNlMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODg1M2NiLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvcm1pL3NyYy9zYW1wbGUvcm1pL3NlcnZlci9TZXJ2aWNlMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugc2FtcGxlLnJtaS5zZXJ2ZXI7Ci0KLWltcG9ydCBzYW1wbGUucm1pLnNlcnZlci5kdG8uUGFyZW50Q2xhc3M7Ci1pbXBvcnQgc2FtcGxlLnJtaS5zZXJ2ZXIuZHRvLlRlc3RDbGFzczE7Ci0KLQotcHVibGljIGNsYXNzIFNlcnZpY2UyIGltcGxlbWVudHMgU2VydmljZTJJbnRlcmZhY2UgewotICAgIAotICAgIHB1YmxpYyBQYXJlbnRDbGFzcyBtZXRob2QxKFBhcmVudENsYXNzIHBhcmFtMSl7Ci0gICAgICAgIHJldHVybiBwYXJhbTE7Ci0gICAgfQotCi0gICAgcHVibGljIFRlc3RDbGFzczEgbWV0aG9kMihUZXN0Q2xhc3MxIHBhcmFtMSl7Ci0gICAgICAgIHJldHVybiBwYXJhbTE7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3JtaS9zcmMvc2FtcGxlL3JtaS9zZXJ2ZXIvU2VydmljZTJJbnRlcmZhY2UuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvcm1pL3NyYy9zYW1wbGUvcm1pL3NlcnZlci9TZXJ2aWNlMkludGVyZmFjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWVlM2QxLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvcm1pL3NyYy9zYW1wbGUvcm1pL3NlcnZlci9TZXJ2aWNlMkludGVyZmFjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugc2FtcGxlLnJtaS5zZXJ2ZXI7Ci0KLWltcG9ydCBzYW1wbGUucm1pLnNlcnZlci5kdG8uUGFyZW50Q2xhc3M7Ci1pbXBvcnQgc2FtcGxlLnJtaS5zZXJ2ZXIuZHRvLlRlc3RDbGFzczE7Ci0KLQotcHVibGljIGludGVyZmFjZSBTZXJ2aWNlMkludGVyZmFjZSB7Ci0KLSAgICBwdWJsaWMgUGFyZW50Q2xhc3MgbWV0aG9kMShQYXJlbnRDbGFzcyBwYXJhbTEpOwotCi0gICAgcHVibGljIFRlc3RDbGFzczEgbWV0aG9kMihUZXN0Q2xhc3MxIHBhcmFtMSk7Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3JtaS9zcmMvc2FtcGxlL3JtaS9zZXJ2ZXIvU2VydmljZTMuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvcm1pL3NyYy9zYW1wbGUvcm1pL3NlcnZlci9TZXJ2aWNlMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDI5YTlmLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvcm1pL3NyYy9zYW1wbGUvcm1pL3NlcnZlci9TZXJ2aWNlMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugc2FtcGxlLnJtaS5zZXJ2ZXI7Ci0KLWltcG9ydCBzYW1wbGUucm1pLnNlcnZlci5leGNlcHRpb24uRXhjZXB0aW9uMTsKLWltcG9ydCBzYW1wbGUucm1pLnNlcnZlci5leGNlcHRpb24uRXhjZXB0aW9uMjsKLWltcG9ydCBzYW1wbGUucm1pLnNlcnZlci5leGNlcHRpb24uRXhjZXB0aW9uMzsKLQotcHVibGljIGNsYXNzIFNlcnZpY2UzIGltcGxlbWVudHMgU2VydmljZTNJbnRlcmZhY2UgewotCi0gICAgcHVibGljIHZvaWQgbWV0aG9kMSgpIHRocm93cyBFeGNlcHRpb24xIHsKLSAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbjEoIlRlc3QgRXhjZXB0aW9uMSIpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgbWV0aG9kMihTdHJpbmcgcGFyYW0xKSB0aHJvd3MgRXhjZXB0aW9uMiwgRXhjZXB0aW9uMSB7Ci0gICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24yKCJUZXN0IEV4Y2VwdGlvbjIiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IG1ldGhvZDMoaW50IHBhcmFtMSkgdGhyb3dzIEV4Y2VwdGlvbjMsIEV4Y2VwdGlvbjIsIEV4Y2VwdGlvbjEgewotICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uMygiVGVzdCBFeGNlcHRpb24zIik7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3JtaS9zcmMvc2FtcGxlL3JtaS9zZXJ2ZXIvU2VydmljZTNJbnRlcmZhY2UuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvcm1pL3NyYy9zYW1wbGUvcm1pL3NlcnZlci9TZXJ2aWNlM0ludGVyZmFjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NGY3MTI1Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvcm1pL3NyYy9zYW1wbGUvcm1pL3NlcnZlci9TZXJ2aWNlM0ludGVyZmFjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugc2FtcGxlLnJtaS5zZXJ2ZXI7Ci0KLWltcG9ydCBzYW1wbGUucm1pLnNlcnZlci5leGNlcHRpb24uRXhjZXB0aW9uMTsKLWltcG9ydCBzYW1wbGUucm1pLnNlcnZlci5leGNlcHRpb24uRXhjZXB0aW9uMjsKLWltcG9ydCBzYW1wbGUucm1pLnNlcnZlci5leGNlcHRpb24uRXhjZXB0aW9uMzsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIFNlcnZpY2UzSW50ZXJmYWNlIHsKLSAgICAKLSAgICBwdWJsaWMgdm9pZCBtZXRob2QxKCkgdGhyb3dzIEV4Y2VwdGlvbjE7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIG1ldGhvZDIoU3RyaW5nIHBhcmFtMSkgdGhyb3dzIEV4Y2VwdGlvbjIsIEV4Y2VwdGlvbjE7Ci0KLSAgICBwdWJsaWMgaW50IG1ldGhvZDMoaW50IHBhcmFtMSkgdGhyb3dzIEV4Y2VwdGlvbjMsIEV4Y2VwdGlvbjIsIEV4Y2VwdGlvbjE7Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3JtaS9zcmMvc2FtcGxlL3JtaS9zZXJ2ZXIvU2VydmljZTQuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvcm1pL3NyYy9zYW1wbGUvcm1pL3NlcnZlci9TZXJ2aWNlNC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjhiOWU4Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvcm1pL3NyYy9zYW1wbGUvcm1pL3NlcnZlci9TZXJ2aWNlNC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugc2FtcGxlLnJtaS5zZXJ2ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlNCBpbXBsZW1lbnRzIFNlcnZpY2U0SW50ZXJmYWNlIHsKLQotICAgIHB1YmxpYyBPYmplY3QgbWV0aG9kMShPYmplY3QgcGFyYW0xKXsKLSAgICAgICAgcmV0dXJuIHBhcmFtMTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdCBtZXRob2QyKExpc3QgcGFyYW0xLCBMaXN0IHBhcmFtMil7Ci0gICAgICAgIGlmIChwYXJhbTEgIT0gbnVsbCl7Ci0gICAgICAgICAgICBpZiAocGFyYW0yICE9IG51bGwpewotICAgICAgICAgICAgICAgIHBhcmFtMS5hZGRBbGwocGFyYW0yKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gcGFyYW0xOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcGFyYW0xOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIHBhcmFtMjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmdbXSBtZXRob2QzKFN0cmluZyBwYXJhbTEsU3RyaW5nIHBhcmFtMixTdHJpbmcgcGFyYW0zKXsKLSAgICAgICAgU3RyaW5nW10gcmV0dXJuQXJyYXkgPSBuZXcgU3RyaW5nWzNdOwotICAgICAgICByZXR1cm5BcnJheVswXSA9IHBhcmFtMTsKLSAgICAgICAgcmV0dXJuQXJyYXlbMV0gPSBwYXJhbTI7Ci0gICAgICAgIHJldHVybkFycmF5WzJdID0gcGFyYW0zOwotICAgICAgICByZXR1cm4gcmV0dXJuQXJyYXk7Ci0gICAgfQotCi0gICAgcHVibGljIE1hcCBtZXRob2Q0KE1hcCBwYXJhbTEpIHsKLSAgICAgICAgcmV0dXJuIHBhcmFtMTsKLSAgICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9ybWkvc3JjL3NhbXBsZS9ybWkvc2VydmVyL1NlcnZpY2U0SW50ZXJmYWNlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3JtaS9zcmMvc2FtcGxlL3JtaS9zZXJ2ZXIvU2VydmljZTRJbnRlcmZhY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmViYmZlYS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3JtaS9zcmMvc2FtcGxlL3JtaS9zZXJ2ZXIvU2VydmljZTRJbnRlcmZhY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIHNhbXBsZS5ybWkuc2VydmVyOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIFNlcnZpY2U0SW50ZXJmYWNlIHsKLSAgICBwdWJsaWMgT2JqZWN0IG1ldGhvZDEoT2JqZWN0IHBhcmFtMSk7Ci0KLSAgICBwdWJsaWMgTGlzdCBtZXRob2QyKExpc3QgcGFyYW0xLCBMaXN0IHBhcmFtMik7Ci0KLSAgICBwdWJsaWMgU3RyaW5nW10gbWV0aG9kMyhTdHJpbmcgcGFyYW0xLFN0cmluZyBwYXJhbTIsU3RyaW5nIHBhcmFtMyk7Ci0KLSAgICBwdWJsaWMgTWFwIG1ldGhvZDQoTWFwIHBhcmFtMSk7Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3JtaS9zcmMvc2FtcGxlL3JtaS9zZXJ2ZXIvZGF0YWJpbmQvQ3VzdG9tU2ltcGxlVHlwZUhhbmRsZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvcm1pL3NyYy9zYW1wbGUvcm1pL3NlcnZlci9kYXRhYmluZC9DdXN0b21TaW1wbGVUeXBlSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTI1ZTc0Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvcm1pL3NyYy9zYW1wbGUvcm1pL3NlcnZlci9kYXRhYmluZC9DdXN0b21TaW1wbGVUeXBlSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugc2FtcGxlLnJtaS5zZXJ2ZXIuZGF0YWJpbmQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5kYXRhYmluZC5TaW1wbGVUeXBlSGFuZGxlcjsKLQotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OwotCi0KLXB1YmxpYyBjbGFzcyBDdXN0b21TaW1wbGVUeXBlSGFuZGxlciBleHRlbmRzIFNpbXBsZVR5cGVIYW5kbGVyIHsKLSAgICBwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhEYXRlIHZhbHVlKSB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ29udmVydGluZyBkYXRlID09PiAiICsgdmFsdWUpOwotICAgICAgICBTaW1wbGVEYXRlRm9ybWF0IHNpbXBsZURhdGVGb3JtYXQgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgieXl5eS1NTS1kZFoiKTsKLSAgICAgICAgcmV0dXJuIHNpbXBsZURhdGVGb3JtYXQuZm9ybWF0KHZhbHVlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3JtaS9zcmMvc2FtcGxlL3JtaS9zZXJ2ZXIvZHRvL0NoaWxkQ2xhc3MuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvcm1pL3NyYy9zYW1wbGUvcm1pL3NlcnZlci9kdG8vQ2hpbGRDbGFzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZGU1N2FhLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvcm1pL3NyYy9zYW1wbGUvcm1pL3NlcnZlci9kdG8vQ2hpbGRDbGFzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugc2FtcGxlLnJtaS5zZXJ2ZXIuZHRvOwotCi0KLXB1YmxpYyBjbGFzcyBDaGlsZENsYXNzIGV4dGVuZHMgUGFyZW50Q2xhc3MgewotICAgIAotICAgIHByaXZhdGUgU3RyaW5nIHBhcmFtMzsKLSAgICBwcml2YXRlIEludGVnZXIgcGFyYW00OwotCi0gICAgcHVibGljIFN0cmluZyBnZXRQYXJhbTMoKSB7Ci0gICAgICAgIHJldHVybiBwYXJhbTM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGFyYW0zKFN0cmluZyBwYXJhbTMpIHsKLSAgICAgICAgdGhpcy5wYXJhbTMgPSBwYXJhbTM7Ci0gICAgfQotCi0gICAgcHVibGljIEludGVnZXIgZ2V0UGFyYW00KCkgewotICAgICAgICByZXR1cm4gcGFyYW00OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBhcmFtNChJbnRlZ2VyIHBhcmFtNCkgewotICAgICAgICB0aGlzLnBhcmFtNCA9IHBhcmFtNDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3JtaS9zcmMvc2FtcGxlL3JtaS9zZXJ2ZXIvZHRvL1BhcmVudENsYXNzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3JtaS9zcmMvc2FtcGxlL3JtaS9zZXJ2ZXIvZHRvL1BhcmVudENsYXNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwNDg2MzQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9ybWkvc3JjL3NhbXBsZS9ybWkvc2VydmVyL2R0by9QYXJlbnRDbGFzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugc2FtcGxlLnJtaS5zZXJ2ZXIuZHRvOwotCi1wdWJsaWMgY2xhc3MgUGFyZW50Q2xhc3MgewotICAgIAotICAgIHByaXZhdGUgU3RyaW5nIHBhcmFtMTsKLSAgICBwcml2YXRlIGludCBwYXJhbTI7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhcmFtMSgpIHsKLSAgICAgICAgcmV0dXJuIHBhcmFtMTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJhbTEoU3RyaW5nIHBhcmFtMSkgewotICAgICAgICB0aGlzLnBhcmFtMSA9IHBhcmFtMTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldFBhcmFtMigpIHsKLSAgICAgICAgcmV0dXJuIHBhcmFtMjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJhbTIoaW50IHBhcmFtMikgewotICAgICAgICB0aGlzLnBhcmFtMiA9IHBhcmFtMjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3JtaS9zcmMvc2FtcGxlL3JtaS9zZXJ2ZXIvZHRvL1Rlc3RDbGFzczEuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvcm1pL3NyYy9zYW1wbGUvcm1pL3NlcnZlci9kdG8vVGVzdENsYXNzMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzdlYjZjLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvcm1pL3NyYy9zYW1wbGUvcm1pL3NlcnZlci9kdG8vVGVzdENsYXNzMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugc2FtcGxlLnJtaS5zZXJ2ZXIuZHRvOwotCi0KLXB1YmxpYyBjbGFzcyBUZXN0Q2xhc3MxIHsKLQotICAgIHByaXZhdGUgU3RyaW5nIHBhcmFtMTsKLSAgICBwcml2YXRlIFN0cmluZyBwYXJtYTI7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhcmFtMSgpIHsKLSAgICAgICAgcmV0dXJuIHBhcmFtMTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJhbTEoU3RyaW5nIHBhcmFtMSkgewotICAgICAgICB0aGlzLnBhcmFtMSA9IHBhcmFtMTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhcm1hMigpIHsKLSAgICAgICAgcmV0dXJuIHBhcm1hMjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJtYTIoU3RyaW5nIHBhcm1hMikgewotICAgICAgICB0aGlzLnBhcm1hMiA9IHBhcm1hMjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3JtaS9zcmMvc2FtcGxlL3JtaS9zZXJ2ZXIvZXhjZXB0aW9uL0V4Y2VwdGlvbjEuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvcm1pL3NyYy9zYW1wbGUvcm1pL3NlcnZlci9leGNlcHRpb24vRXhjZXB0aW9uMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjM1MjljLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvcm1pL3NyYy9zYW1wbGUvcm1pL3NlcnZlci9leGNlcHRpb24vRXhjZXB0aW9uMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugc2FtcGxlLnJtaS5zZXJ2ZXIuZXhjZXB0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBFeGNlcHRpb24xIGV4dGVuZHMgRXhjZXB0aW9uIHsKLSAgICAKLSAgICBwdWJsaWMgRXhjZXB0aW9uMSgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRXhjZXB0aW9uMShTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRXhjZXB0aW9uMShUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIoY2F1c2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBFeGNlcHRpb24xKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvcm1pL3NyYy9zYW1wbGUvcm1pL3NlcnZlci9leGNlcHRpb24vRXhjZXB0aW9uMi5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9ybWkvc3JjL3NhbXBsZS9ybWkvc2VydmVyL2V4Y2VwdGlvbi9FeGNlcHRpb24yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwOWM5ZjEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9ybWkvc3JjL3NhbXBsZS9ybWkvc2VydmVyL2V4Y2VwdGlvbi9FeGNlcHRpb24yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBzYW1wbGUucm1pLnNlcnZlci5leGNlcHRpb247Ci0KLQotcHVibGljIGNsYXNzIEV4Y2VwdGlvbjIgZXh0ZW5kcyBFeGNlcHRpb24gewotICAgIHB1YmxpYyBFeGNlcHRpb24yKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBFeGNlcHRpb24yKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBFeGNlcHRpb24yKFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICBzdXBlcihjYXVzZSk7Ci0gICAgfQotCi0gICAgcHVibGljIEV4Y2VwdGlvbjIoU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlLCBjYXVzZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9ybWkvc3JjL3NhbXBsZS9ybWkvc2VydmVyL2V4Y2VwdGlvbi9FeGNlcHRpb24zLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3JtaS9zcmMvc2FtcGxlL3JtaS9zZXJ2ZXIvZXhjZXB0aW9uL0V4Y2VwdGlvbjMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBkOGFhOS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3JtaS9zcmMvc2FtcGxlL3JtaS9zZXJ2ZXIvZXhjZXB0aW9uL0V4Y2VwdGlvbjMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIHNhbXBsZS5ybWkuc2VydmVyLmV4Y2VwdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgRXhjZXB0aW9uMyBleHRlbmRzIEV4Y2VwdGlvbiB7Ci0gICAgCi0gICAgcHVibGljIEV4Y2VwdGlvbjMoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIEV4Y2VwdGlvbjMoU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSk7Ci0gICAgfQotCi0gICAgcHVibGljIEV4Y2VwdGlvbjMoVGhyb3dhYmxlIGNhdXNlKSB7Ci0gICAgICAgIHN1cGVyKGNhdXNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRXhjZXB0aW9uMyhTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGNhdXNlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UsIGNhdXNlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3NjcmlwdC9idWlsZC54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3NjcmlwdC9idWlsZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NTI5NjcuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9zY3JpcHQvYnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08cHJvamVjdCBuYW1lPSJzY3JpcHQiIGRlZmF1bHQ9ImFsbHRlc3RzIj4KLSAgICA8cHJvcGVydHkgbmFtZT0ibWFpbkRpciIgdmFsdWU9Ii4uLy4uIi8+Ci0gICAgPHBhdGggaWQ9ImF4aXMuY2xhc3NwYXRoIj4KLSAgICAgICAgPGZpbGVzZXQgZGlyPSIuLi8uLi9saWIiPgotICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKi5qYXIiLz4KLSAgICAgICAgPC9maWxlc2V0PgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249Ii4vc2FtcGxlLmphciIvPgotICAgIDwvcGF0aD4KLSAgICA8cGF0aCBpZD0ic2FtcGxlLmNsYXNzcGF0aCI+Ci0gICAgICAgIDxwYXRoIHJlZmlkPSJheGlzLmNsYXNzcGF0aCIvPgotICAgIDwvcGF0aD4KLQotICAgIDx0YXJnZXQgbmFtZT0iYWxsdGVzdHMiCi0gICAgICAgICAgICBkZXBlbmRzPSJ0ZXN0RWNob0Jsb2NraW5nQ2xpZW50LHRlc3RFY2hvQmxvY2tpbmdEdWFsQ2xpZW50LHRlc3RFY2hvTm9uQmxvY2tpbmdEdWFsQ2xpZW50LHRlc3RQaW5nQ2xpZW50LHRlc3RXZWJTZXJ2aWNlV2l0aE1vZHVsZUNsaWVudCI+Ci0gICAgPC90YXJnZXQ+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9InRlc3RFY2hvQmxvY2tpbmdDbGllbnQiPgotICAgICAgICA8amF2YSBjbGFzc25hbWU9InVzZXJndWlkZS5jbGllbnRzLkVjaG9CbG9ja2luZ0NsaWVudCIKLSAgICAgICAgICAgICAgY2xhc3NwYXRocmVmPSJheGlzLmNsYXNzcGF0aCIgZm9yaz0idHJ1ZSI+Ci0gICAgICAgICAgICA8anZtYXJnIHZhbHVlPSItRGF4aXMyLnJlcG89JHttYWluRGlyfSIvPgotICAgICAgICA8L2phdmE+Ci0gICAgPC90YXJnZXQ+Ci0gICAgPHRhcmdldCBuYW1lPSJ0ZXN0RWNob0Jsb2NraW5nRHVhbENsaWVudCI+Ci0gICAgICAgIDxqYXZhIGNsYXNzbmFtZT0idXNlcmd1aWRlLmNsaWVudHMuRWNob0Jsb2NraW5nRHVhbENsaWVudCIKLSAgICAgICAgICAgICAgY2xhc3NwYXRocmVmPSJheGlzLmNsYXNzcGF0aCIgZm9yaz0idHJ1ZSI+Ci0gICAgICAgICAgICA8anZtYXJnIHZhbHVlPSItRGF4aXMyLnJlcG89JHttYWluRGlyfSIvPgotICAgICAgICA8L2phdmE+Ci0gICAgPC90YXJnZXQ+Ci0gICAgPHRhcmdldCBuYW1lPSJ0ZXN0RWNob05vbkJsb2NraW5nRHVhbENsaWVudCI+Ci0gICAgICAgIDxqYXZhIGNsYXNzbmFtZT0idXNlcmd1aWRlLmNsaWVudHMuRWNob05vbkJsb2NraW5nRHVhbENsaWVudCIKLSAgICAgICAgICAgICAgY2xhc3NwYXRocmVmPSJheGlzLmNsYXNzcGF0aCIgZm9yaz0idHJ1ZSI+Ci0gICAgICAgICAgICA8anZtYXJnIHZhbHVlPSItRGF4aXMyLnJlcG89JHttYWluRGlyfSIvPgotICAgICAgICA8L2phdmE+Ci0gICAgPC90YXJnZXQ+Ci0gICAgPHRhcmdldCBuYW1lPSJ0ZXN0UGluZ0NsaWVudCI+Ci0gICAgICAgIDxqYXZhIGNsYXNzbmFtZT0idXNlcmd1aWRlLmNsaWVudHMuUGluZ0NsaWVudCIKLSAgICAgICAgICAgICAgY2xhc3NwYXRocmVmPSJheGlzLmNsYXNzcGF0aCIgZm9yaz0idHJ1ZSI+Ci0gICAgICAgICAgICA8anZtYXJnIHZhbHVlPSItRGF4aXMyLnJlcG89JHttYWluRGlyfSIvPgotICAgICAgICA8L2phdmE+Ci0gICAgPC90YXJnZXQ+Ci0gICAgPHRhcmdldCBuYW1lPSJ0ZXN0V2ViU2VydmljZVdpdGhNb2R1bGVDbGllbnQiPgotICAgICAgICA8amF2YSBjbGFzc25hbWU9InVzZXJndWlkZS5jbGllbnRzLkNsaWVudEZvcldlYlNlcnZpY2VXaXRoTW9kdWxlIgotICAgICAgICAgICAgICBjbGFzc3BhdGhyZWY9ImF4aXMuY2xhc3NwYXRoIiBmb3JrPSJ0cnVlIj4KLSAgICAgICAgICAgIDxqdm1hcmcgdmFsdWU9Ii1EYXhpczIucmVwbz0ke21haW5EaXJ9Ii8+Ci0gICAgICAgIDwvamF2YT4KLSAgICA8L3RhcmdldD4KLQotICAgIDx0YXJnZXQgbmFtZT0idGVzdEVjaG9Ob25CbG9ja2luZ0NsaWVudCI+Ci0gICAgICAgIDxqYXZhIGNsYXNzbmFtZT0idXNlcmd1aWRlLmNsaWVudHMuRWNob05vbkJsb2NraW5nQ2xpZW50IgotICAgICAgICAgICAgICBjbGFzc3BhdGhyZWY9ImF4aXMuY2xhc3NwYXRoIiBmb3JrPSJ0cnVlIj4KLSAgICAgICAgICAgIDxqdm1hcmcgdmFsdWU9Ii1EYXhpczIucmVwbz0ke21haW5EaXJ9Ii8+Ci0gICAgICAgIDwvamF2YT4KLSAgICA8L3RhcmdldD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvc2NyaXB0L3VzZXJndWlkZS9jbGllbnRfc2NyaXB0cy9UZXN0RWNob0Jsb2NraW5nQ2xpZW50LmJhdCBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvc2NyaXB0L3VzZXJndWlkZS9jbGllbnRfc2NyaXB0cy9UZXN0RWNob0Jsb2NraW5nQ2xpZW50LmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NhMzJmMS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3NjcmlwdC91c2VyZ3VpZGUvY2xpZW50X3NjcmlwdHMvVGVzdEVjaG9CbG9ja2luZ0NsaWVudC5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi1AZWNobyBvZmYNCi0NCi1SRU0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi1SRU0gIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotUkVNICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLVJFTSAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotUkVNICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotUkVNICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotUkVNICB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi1SRU0gIA0KLVJFTSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotUkVNICANCi1SRU0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi1SRU0gIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotUkVNICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi1SRU0gIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotUkVNICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotUkVNICB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi1zZXRsb2NhbCBFbmFibGVEZWxheWVkRXhwYW5zaW9uDQotDQotcmVtIGxvb3AgdGhyb3VnaCB0aGUgbGlicyBhbmQgYWRkIHRoZW0gdG8gdGhlIGNsYXNzIHBhdGgNCi1zZXQgQVhJUzJfSE9NRT0uLlwuLlwuLlwNCi0NCi1zZXQgQVhJUzJfQ0xBU1NfUEFUSD0lQVhJUzJfSE9NRSUNCi1GT1IgJSVjIGluICglQVhJUzJfSE9NRSVcbGliXCouamFyKSBETyBzZXQgQVhJUzJfQ0xBU1NfUEFUSD0hQVhJUzJfQ0xBU1NfUEFUSCE7JSVjDQotDQotc2V0IEFYSVMyX0NMQVNTX1BBVEg9JUFYSVMyX0NMQVNTX1BBVEglOy4uXHNhbXBsZS5qYXINCi0NCi1qYXZhIC1jcCAlQVhJUzJfQ0xBU1NfUEFUSCUgdXNlcmd1aWRlLmNsaWVudHMuRWNob0Jsb2NraW5nQ2xpZW50DQotZW5kbG9jYWwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3NjcmlwdC91c2VyZ3VpZGUvY2xpZW50X3NjcmlwdHMvVGVzdEVjaG9CbG9ja2luZ0R1YWxDbGllbnQuYmF0IGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9zY3JpcHQvdXNlcmd1aWRlL2NsaWVudF9zY3JpcHRzL1Rlc3RFY2hvQmxvY2tpbmdEdWFsQ2xpZW50LmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ1NWQ3NS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3NjcmlwdC91c2VyZ3VpZGUvY2xpZW50X3NjcmlwdHMvVGVzdEVjaG9CbG9ja2luZ0R1YWxDbGllbnQuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotQGVjaG8gb2ZmDQotc2V0bG9jYWwgRW5hYmxlRGVsYXllZEV4cGFuc2lvbg0KLQ0KLVJFTSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLVJFTSAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi1SRU0gIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotUkVNICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi1SRU0gIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi1SRU0gICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi1SRU0gIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLVJFTSAgDQotUkVNICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi1SRU0gIA0KLVJFTSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLVJFTSAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi1SRU0gICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLVJFTSAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi1SRU0gIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi1SRU0gIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLXJlbSBsb29wIHRocm91Z2ggdGhlIGxpYnMgYW5kIGFkZCB0aGVtIHRvIHRoZSBjbGFzcyBwYXRoDQotc2V0IEFYSVMyX0hPTUU9Li5cLi5cLi5cDQotDQotc2V0IEFYSVMyX0NMQVNTX1BBVEg9JUFYSVMyX0hPTUUlDQotRk9SICUlYyBpbiAoJUFYSVMyX0hPTUUlXGxpYlwqLmphcikgRE8gc2V0IEFYSVMyX0NMQVNTX1BBVEg9IUFYSVMyX0NMQVNTX1BBVEghOyUlYw0KLQ0KLXNldCBBWElTMl9DTEFTU19QQVRIPSVBWElTMl9DTEFTU19QQVRIJTsuLlxzYW1wbGUuamFyDQotDQotamF2YSAtY3AgJUFYSVMyX0NMQVNTX1BBVEglIHVzZXJndWlkZS5jbGllbnRzLkVjaG9CbG9ja2luZ0R1YWxDbGllbnQNCi1lbmRsb2NhbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvc2NyaXB0L3VzZXJndWlkZS9jbGllbnRfc2NyaXB0cy9UZXN0RWNob05vbkJsb2NraW5nQ2xpZW50LmJhdCBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvc2NyaXB0L3VzZXJndWlkZS9jbGllbnRfc2NyaXB0cy9UZXN0RWNob05vbkJsb2NraW5nQ2xpZW50LmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZhZjAwYy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3NjcmlwdC91c2VyZ3VpZGUvY2xpZW50X3NjcmlwdHMvVGVzdEVjaG9Ob25CbG9ja2luZ0NsaWVudC5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi1AZWNobyBvZmYNCi1zZXRsb2NhbCBFbmFibGVEZWxheWVkRXhwYW5zaW9uDQotDQotUkVNICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotUkVNICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLVJFTSAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi1SRU0gIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLVJFTSAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLVJFTSAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLVJFTSAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotUkVNICANCi1SRU0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLVJFTSAgDQotUkVNICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotUkVNICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLVJFTSAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotUkVNICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLVJFTSAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLVJFTSAgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotcmVtIGxvb3AgdGhyb3VnaCB0aGUgbGlicyBhbmQgYWRkIHRoZW0gdG8gdGhlIGNsYXNzIHBhdGgNCi1zZXQgQVhJUzJfSE9NRT0uLlwuLlwuLlwNCi0NCi1zZXQgQVhJUzJfQ0xBU1NfUEFUSD0lQVhJUzJfSE9NRSUNCi1GT1IgJSVjIGluICglQVhJUzJfSE9NRSVcbGliXCouamFyKSBETyBzZXQgQVhJUzJfQ0xBU1NfUEFUSD0hQVhJUzJfQ0xBU1NfUEFUSCE7JSVjDQotDQotc2V0IEFYSVMyX0NMQVNTX1BBVEg9JUFYSVMyX0NMQVNTX1BBVEglOy4uXHNhbXBsZS5qYXINCi0NCi1qYXZhIC1jcCAlQVhJUzJfQ0xBU1NfUEFUSCUgdXNlcmd1aWRlLmNsaWVudHMuRWNob05vbkJsb2NraW5nQ2xpZW50DQotZW5kbG9jYWwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3NjcmlwdC91c2VyZ3VpZGUvY2xpZW50X3NjcmlwdHMvVGVzdEVjaG9Ob25CbG9ja2luZ0R1YWxDbGllbnQuYmF0IGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9zY3JpcHQvdXNlcmd1aWRlL2NsaWVudF9zY3JpcHRzL1Rlc3RFY2hvTm9uQmxvY2tpbmdEdWFsQ2xpZW50LmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWEwNWYyZi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3NjcmlwdC91c2VyZ3VpZGUvY2xpZW50X3NjcmlwdHMvVGVzdEVjaG9Ob25CbG9ja2luZ0R1YWxDbGllbnQuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotQGVjaG8gb2ZmDQotc2V0bG9jYWwgRW5hYmxlRGVsYXllZEV4cGFuc2lvbg0KLQ0KLVJFTSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLVJFTSAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi1SRU0gIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotUkVNICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi1SRU0gIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi1SRU0gICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi1SRU0gIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLVJFTSAgDQotUkVNICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi1SRU0gIA0KLVJFTSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLVJFTSAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi1SRU0gICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLVJFTSAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi1SRU0gIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi1SRU0gIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLXJlbSBsb29wIHRocm91Z2ggdGhlIGxpYnMgYW5kIGFkZCB0aGVtIHRvIHRoZSBjbGFzcyBwYXRoDQotc2V0IEFYSVMyX0hPTUU9Li5cLi5cLi5cDQotDQotc2V0IEFYSVMyX0NMQVNTX1BBVEg9JUFYSVMyX0hPTUUlDQotRk9SICUlYyBpbiAoJUFYSVMyX0hPTUUlXGxpYlwqLmphcikgRE8gc2V0IEFYSVMyX0NMQVNTX1BBVEg9IUFYSVMyX0NMQVNTX1BBVEghOyUlYw0KLQ0KLXNldCBBWElTMl9DTEFTU19QQVRIPSVBWElTMl9DTEFTU19QQVRIJTsuLlxzYW1wbGUuamFyDQotDQotamF2YSAtY3AgJUFYSVMyX0NMQVNTX1BBVEglIHVzZXJndWlkZS5jbGllbnRzLkVjaG9Ob25CbG9ja2luZ0R1YWxDbGllbnQNCi1lbmRsb2NhbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvc2NyaXB0L3VzZXJndWlkZS9jbGllbnRfc2NyaXB0cy9UZXN0UGluZ0NsaWVudC5iYXQgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3NjcmlwdC91c2VyZ3VpZGUvY2xpZW50X3NjcmlwdHMvVGVzdFBpbmdDbGllbnQuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlN2VlYzQwLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvc2NyaXB0L3VzZXJndWlkZS9jbGllbnRfc2NyaXB0cy9UZXN0UGluZ0NsaWVudC5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi1AZWNobyBvZmYNCi1zZXRsb2NhbCBFbmFibGVEZWxheWVkRXhwYW5zaW9uDQotDQotUkVNICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotUkVNICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLVJFTSAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi1SRU0gIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLVJFTSAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLVJFTSAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLVJFTSAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotUkVNICANCi1SRU0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLVJFTSAgDQotUkVNICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotUkVNICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLVJFTSAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotUkVNICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLVJFTSAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLVJFTSAgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotcmVtIGxvb3AgdGhyb3VnaCB0aGUgbGlicyBhbmQgYWRkIHRoZW0gdG8gdGhlIGNsYXNzIHBhdGgNCi1zZXQgQVhJUzJfSE9NRT0uLlwuLlwuLlwNCi0NCi1zZXQgQVhJUzJfQ0xBU1NfUEFUSD0lQVhJUzJfSE9NRSUNCi1GT1IgJSVjIGluICglQVhJUzJfSE9NRSVcbGliXCouamFyKSBETyBzZXQgQVhJUzJfQ0xBU1NfUEFUSD0hQVhJUzJfQ0xBU1NfUEFUSCE7JSVjDQotDQotc2V0IEFYSVMyX0NMQVNTX1BBVEg9JUFYSVMyX0NMQVNTX1BBVEglOy4uXHNhbXBsZS5qYXINCi0NCi1qYXZhIC1jcCAlQVhJUzJfQ0xBU1NfUEFUSCUgdXNlcmd1aWRlLmNsaWVudHMuUGluZ0NsaWVudA0KLWVuZGxvY2FsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9zY3JpcHQvdXNlcmd1aWRlL2NsaWVudF9zY3JpcHRzL1Rlc3RQaW5nQ2xpZW50LnNoIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9zY3JpcHQvdXNlcmd1aWRlL2NsaWVudF9zY3JpcHRzL1Rlc3RQaW5nQ2xpZW50LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDQxODg1Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvc2NyaXB0L3VzZXJndWlkZS9jbGllbnRfc2NyaXB0cy9UZXN0UGluZ0NsaWVudC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLSMhL2Jpbi9zaAotCi0jICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jICAKLSMgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIyAgCi0jICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyAgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWV4cG9ydCBBWElTMl9IT01FPS4uLy4uLy4uLwotCi1BWElTMl9DTEFTU1BBVEg9JEFYSVMyX0NMQVNTUEFUSDouLi9zYW1wbGUuamFyCi1mb3IgZiBpbiAkQVhJUzJfSE9NRS9saWIvKi5qYXIKLWRvCi0gIEFYSVMyX0NMQVNTUEFUSD0kQVhJUzJfQ0xBU1NQQVRIOiRmCi1kb25lCi0KLWV4cG9ydCBBWElTMl9DTEFTU1BBVEgKLWphdmEgLWNsYXNzcGF0aCAkQVhJUzJfQ0xBU1NQQVRIICB1c2VyZ3VpZGUuY2xpZW50cy5QaW5nQ2xpZW50CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3NjcmlwdC91c2VyZ3VpZGUvY2xpZW50X3NjcmlwdHMvVGVzdFdlYlNlcnZpY2VXaXRoTW9kdWxlQ2xpZW50LmJhdCBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvc2NyaXB0L3VzZXJndWlkZS9jbGllbnRfc2NyaXB0cy9UZXN0V2ViU2VydmljZVdpdGhNb2R1bGVDbGllbnQuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTJlMmQ3Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvc2NyaXB0L3VzZXJndWlkZS9jbGllbnRfc2NyaXB0cy9UZXN0V2ViU2VydmljZVdpdGhNb2R1bGVDbGllbnQuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotQGVjaG8gb2ZmDQotc2V0bG9jYWwgRW5hYmxlRGVsYXllZEV4cGFuc2lvbg0KLQ0KLVJFTSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLVJFTSAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi1SRU0gIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotUkVNICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi1SRU0gIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi1SRU0gICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi1SRU0gIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLVJFTSAgDQotUkVNICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi1SRU0gIA0KLVJFTSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLVJFTSAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi1SRU0gICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLVJFTSAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi1SRU0gIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi1SRU0gIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLXJlbSBsb29wIHRocm91Z2ggdGhlIGxpYnMgYW5kIGFkZCB0aGVtIHRvIHRoZSBjbGFzcyBwYXRoDQotc2V0IEFYSVMyX0hPTUU9Li5cLi5cLi5cDQotDQotc2V0IEFYSVMyX0NMQVNTX1BBVEg9JUFYSVMyX0hPTUUlDQotRk9SICUlYyBpbiAoJUFYSVMyX0hPTUUlXGxpYlwqLmphcikgRE8gc2V0IEFYSVMyX0NMQVNTX1BBVEg9IUFYSVMyX0NMQVNTX1BBVEghOyUlYw0KLXNldCBBWElTMl9DTEFTU19QQVRIPSVBWElTMl9DTEFTU19QQVRIJTsuLlxzYW1wbGUuamFyDQotDQotamF2YSAtY3AgJUFYSVMyX0NMQVNTX1BBVEglIHVzZXJndWlkZS5jbGllbnRzLkNsaWVudEZvcldlYlNlcnZpY2VXaXRoTW9kdWxlDQotZW5kbG9jYWwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3NjcmlwdC91c2VyZ3VpZGUvY2xpZW50X3NjcmlwdHMvVGVzdFdlYlNlcnZpY2VXaXRoTW9kdWxlQ2xpZW50LnNoIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9zY3JpcHQvdXNlcmd1aWRlL2NsaWVudF9zY3JpcHRzL1Rlc3RXZWJTZXJ2aWNlV2l0aE1vZHVsZUNsaWVudC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZmMTk1Zi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3NjcmlwdC91c2VyZ3VpZGUvY2xpZW50X3NjcmlwdHMvVGVzdFdlYlNlcnZpY2VXaXRoTW9kdWxlQ2xpZW50LnNoCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotIyEvYmluL3NoCi0KLSMgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0jICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jICB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMgIAotIyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jICAKLSMgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jICB1bmRlciB0aGUgTGljZW5zZS4KLQotZXhwb3J0IEFYSVMyX0hPTUU9Li4vLi4vLi4vCi0KLUFYSVMyX0NMQVNTUEFUSD0kQVhJUzJfQ0xBU1NQQVRIOi4uL3NhbXBsZS5qYXIKLWZvciBmIGluICRBWElTMl9IT01FL2xpYi8qLmphcgotZG8KLSAgQVhJUzJfQ0xBU1NQQVRIPSRBWElTMl9DTEFTU1BBVEg6JGYKLWRvbmUKLQotZXhwb3J0IEFYSVMyX0NMQVNTUEFUSAotamF2YSAtY2xhc3NwYXRoICRBWElTMl9DTEFTU1BBVEggIHVzZXJndWlkZS5jbGllbnRzLkNsaWVudEZvcldlYlNlcnZpY2VXaXRoTW9kdWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3NjcmlwdC91c2VyZ3VpZGUvY2xpZW50X3NjcmlwdHMvdGVzdF9lY2hvX2Jsb2NraW5nX2NsaWVudC5zaCBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvc2NyaXB0L3VzZXJndWlkZS9jbGllbnRfc2NyaXB0cy90ZXN0X2VjaG9fYmxvY2tpbmdfY2xpZW50LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTU3MTBkLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvc2NyaXB0L3VzZXJndWlkZS9jbGllbnRfc2NyaXB0cy90ZXN0X2VjaG9fYmxvY2tpbmdfY2xpZW50LnNoCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotIyEvYmluL3NoCi0KLSMgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0jICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jICB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMgIAotIyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jICAKLSMgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jICB1bmRlciB0aGUgTGljZW5zZS4KLQotZXhwb3J0IEFYSVMyX0hPTUU9Li4vLi4vLi4vCi0KLUFYSVMyX0NMQVNTUEFUSD0kQVhJUzJfQ0xBU1NQQVRIOi4uL3NhbXBsZS5qYXIKLWZvciBmIGluICRBWElTMl9IT01FL2xpYi8qLmphcgotZG8KLSAgQVhJUzJfQ0xBU1NQQVRIPSRBWElTMl9DTEFTU1BBVEg6JGYKLWRvbmUKLQotZXhwb3J0IEFYSVMyX0NMQVNTUEFUSAotamF2YSAtY2xhc3NwYXRoICRBWElTMl9DTEFTU1BBVEggdXNlcmd1aWRlLmNsaWVudHMuRWNob0Jsb2NraW5nQ2xpZW50CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3NjcmlwdC91c2VyZ3VpZGUvY2xpZW50X3NjcmlwdHMvdGVzdF9lY2hvX2Jsb2NraW5nX2R1YWxfY2xpZW50LnNoIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9zY3JpcHQvdXNlcmd1aWRlL2NsaWVudF9zY3JpcHRzL3Rlc3RfZWNob19ibG9ja2luZ19kdWFsX2NsaWVudC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM1ZDdhMy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3NjcmlwdC91c2VyZ3VpZGUvY2xpZW50X3NjcmlwdHMvdGVzdF9lY2hvX2Jsb2NraW5nX2R1YWxfY2xpZW50LnNoCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotIyEvYmluL3NoCi0KLSMgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0jICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jICB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMgIAotIyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jICAKLSMgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jICB1bmRlciB0aGUgTGljZW5zZS4KLQotZXhwb3J0IEFYSVMyX0hPTUU9Li4vLi4vLi4vCi0KLUFYSVMyX0NMQVNTUEFUSD0kQVhJUzJfQ0xBU1NQQVRIOi4uL3NhbXBsZS5qYXIKLWZvciBmIGluICRBWElTMl9IT01FL2xpYi8qLmphcgotZG8KLSAgQVhJUzJfQ0xBU1NQQVRIPSRBWElTMl9DTEFTU1BBVEg6JGYKLWRvbmUKLQotZXhwb3J0IEFYSVMyX0NMQVNTUEFUSAotamF2YSAtY2xhc3NwYXRoICRBWElTMl9DTEFTU1BBVEggdXNlcmd1aWRlLmNsaWVudHMuRWNob0Jsb2NraW5nRHVhbENsaWVudApkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9zY3JpcHQvdXNlcmd1aWRlL2NsaWVudF9zY3JpcHRzL3Rlc3RfZWNob19ub25fYmxvY2tpbmdfY2xpZW50LnNoIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9zY3JpcHQvdXNlcmd1aWRlL2NsaWVudF9zY3JpcHRzL3Rlc3RfZWNob19ub25fYmxvY2tpbmdfY2xpZW50LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDc3NmE0Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvc2NyaXB0L3VzZXJndWlkZS9jbGllbnRfc2NyaXB0cy90ZXN0X2VjaG9fbm9uX2Jsb2NraW5nX2NsaWVudC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLSMhL2Jpbi9zaAotCi0jICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jICAKLSMgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIyAgCi0jICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyAgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWV4cG9ydCBBWElTMl9IT01FPS4uLy4uLy4uLwotCi1BWElTMl9DTEFTU1BBVEg9JEFYSVMyX0NMQVNTUEFUSDouLi9zYW1wbGUuamFyCi1mb3IgZiBpbiAkQVhJUzJfSE9NRS9saWIvKi5qYXIKLWRvCi0gIEFYSVMyX0NMQVNTUEFUSD0kQVhJUzJfQ0xBU1NQQVRIOiRmCi1kb25lCi0KLWV4cG9ydCBBWElTMl9DTEFTU1BBVEgKLWphdmEgLWNsYXNzcGF0aCAkQVhJUzJfQ0xBU1NQQVRIIHVzZXJndWlkZS5jbGllbnRzLkVjaG9Ob25CbG9ja2luZ0NsaWVudApkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9zY3JpcHQvdXNlcmd1aWRlL2NsaWVudF9zY3JpcHRzL3Rlc3RfZWNob19ub25fYmxvY2tpbmdfZHVhbF9jbGllbnQuc2ggYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3NjcmlwdC91c2VyZ3VpZGUvY2xpZW50X3NjcmlwdHMvdGVzdF9lY2hvX25vbl9ibG9ja2luZ19kdWFsX2NsaWVudC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWYzODhiMS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3NjcmlwdC91c2VyZ3VpZGUvY2xpZW50X3NjcmlwdHMvdGVzdF9lY2hvX25vbl9ibG9ja2luZ19kdWFsX2NsaWVudC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLSMhL2Jpbi9zaAotCi0jICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jICAKLSMgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIyAgCi0jICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyAgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWV4cG9ydCBBWElTMl9IT01FPS4uLy4uLy4uLwotCi1BWElTMl9DTEFTU1BBVEg9JEFYSVMyX0NMQVNTUEFUSDouLi9zYW1wbGUuamFyCi1mb3IgZiBpbiAkQVhJUzJfSE9NRS9saWIvKi5qYXIKLWRvCi0gIEFYSVMyX0NMQVNTUEFUSD0kQVhJUzJfQ0xBU1NQQVRIOiRmCi1kb25lCi0KLWV4cG9ydCBBWElTMl9DTEFTU1BBVEgKLWphdmEgLWNsYXNzcGF0aCAkQVhJUzJfQ0xBU1NQQVRIICB1c2VyZ3VpZGUuY2xpZW50cy5FY2hvTm9uQmxvY2tpbmdEdWFsQ2xpZW50CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3NlcnZpY2VsaWZlY3ljbGUvUkVBRE1FLnR4dCBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvc2VydmljZWxpZmVjeWNsZS9SRUFETUUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjQyZDI3Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvc2VydmljZWxpZmVjeWNsZS9SRUFETUUudHh0CisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotU2FtcGxlOiBTZXJ2aWNlTGlmZUN5Y2xlDQotPT09PT09PT09PT09PT09PT09PT09PT09PQ0KLQ0KLUludHJvZHVjdGlvbjoNCi09PT09PT09PT09PT0NCi0NCi1UaGlzIHNhbXBsZSBkZW1vbnN0cmF0ZSB1c2FnZSBvZiB0aGUgc2VydmljZSBsaWZlY3ljbGUgYW5kIGEgYml0IG9mIHNlc3Npb24gbWFuYWdtZW50LiANCi1UaGUgbWFpbiBpZGVhIGlzIHRvIHNob3cgd2hlcmUgYW5kIGhvdyB0byB1c2Ugc2VydmljZSBsaWZlY3ljbGUgaW50ZXJmYWNlIGFuZCANCi1zZXNzaW9uIHJlbGF0ZWQgbWV0aG9kcy4gDQotDQotDQotUHJlcmVxdWlzaXRlcw0KLT09PT09PT09PT09PT0NCi1BcGFjaGUgQW50IDEuNi4yIG9yIGxhdGVyDQotDQotSWYgeW91IHdhbnQgdG8gYWNjZXNzIHRoZSBzZXJ2aWNlIGluIGEgUkVTVCBtYW5uZXIgeW91IGhhdmUgdG8gZGVwbG95IHRoZSBzZXJ2aWNlIGluIGFuDQotYXBwbGljYXRpb24gc2VydmVyIHN1Y2ggYXMgQXBhY2hlIFRvbWNhdC4gTm90ZSB0aGF0IGl0IHdpbGwgbm90IHdvcmsgd2l0aCBheGlzMnNlcnZlci4NCi0NCi0NCi0NCi1EZXBsb3lpbmcgdGhlIFNlcnZpY2UNCi09PT09PT09PT09PT09PT09PT09PT0gDQotDQotRGVwbG95IGludG8gU2FtcGxlIHJlcG9zaXRvcnk6DQotICAgIA0KLSAqIFR5cGUgYW50IGdlbmVyYXRlLnNlcnZpY2Ugb3Igc2ltcGx5IGFudCBmcm9tIEFYSVMyX0hPTUUvc2FtcGxlcy9zZXJ2aWNlbGlmZWN5Y2xlDQotDQotRGVwbG95IGludG8gVG9tY2F0IDoNCi0gICAgIA0KLSAqIFRvIGJ1aWxkIGFuZCBjb3B5IHRoZSBzZXJ2aWNlIGFyY2hpdmUgZmlsZSBpbnRvIFRvbWNhdCwgdHlwZSBhbnQgY29weS50by50b21jYXQgZnJvbSANCi1BWElTMl9IT01FL3NhbXBsZXMvc2VydmljZWxpZmVjeWNsZSB3aGljaCB3aWxsIGNvcHkgdGhlIGFhciBmaWxlIGludG8NCi08dG9tY2F0X2hvbWU+L3dlYi1hcHAvYXhpczIvV0VCLUlORi9zZXJ2aWNlcyBkaXJlY3RvcnkuDQotDQotUnVubmluZyB0aGUgQ2xpZW50DQotPT09PT09PT09PT09PT09PT09DQotVHlwZSBhbnQgcnVuLmNsaWVudCBmcm9tIEFYSVMyX0hPTUUvc2FtcGxlcy9zZXJ2aWNlbGlmZWN5Y2xlLg0KLQ0KLUFuZCB0aGVuIGZvbGxvdyB0aGUgaW5zdHJ1Y3Rpb25zIGFzIG1lbnRpb25lZCBpbiB0aGUgY29uc29sZS4NCi0NCi1XaGVuIGFza2VkIGZvciBzZXJ2aWNlIGVwciBhZGRyZXNzLCBlbnRlcg0KLWh0dHA6Ly88aG9zdD46PHBvcnQ+L2F4aXMyL3NlcnZpY2VzL0xpYnJhcnkNCi1XaGVyZSA8aG9zdD4gJiA8cG9ydD4gd291bGQgYmUgdGhlIGhvc3QgYW5kIHBvcnQgdGhhdCB0b21jYXQgaXMgcnVubmluZyBvbiwgcmVzcGVjdGl2ZWx5Lg0KLQ0KLUFkdmFuY2VkIEd1aWRlDQotPT09PT09PT09PT09PT0NCi1Gb3IgbW9yZSBkZXRhaWxzIGtpbmRseSBzZWUgZG9jL3NlcnZpY2VsaWZlY3ljbGVndWlkZS5odG1sDQotDQotTm90ZQ0KLT09PT09PT09PT09PT09DQotU29tZXRpbWVzLCBpZiB5b3UncmUgaGF2aW5nIHRyb3VibGUgcnVubmluZyB0aGUgY2xpZW50IHN1Y2Nlc3NmdWxseSwgDQotSXQgbWF5IGJlIG5lY2Vzc2FyeSB0byBjbGVhbiB0aGUgc2VydmljZXMgcmVwb3NpdG9yeSBiZWZvcmUgeW91IGdlbmVyYXRlIHRoZSBzZXJ2aWNlLCBkZXBsb3kgaXQNCi1hbmQgcnVuIHRoZSBjbGllbnQuIChpLmUuIGRlbGV0ZSBzZXJ2aWNlcyBjcmVhdGVkIGZyb20gcHJldmlvdXMgc2FtcGxlcy4pDQotDQotSGVscA0KLT09PT0NCi1QbGVhc2UgY29udGFjdCBheGlzLXVzZXIgbGlzdCAoYXhpcy11c2VyQHdzLmFwYWNoZS5vcmcpIGlmIHlvdSBoYXZlIGFueSB0cm91YmxlIHJ1bm5pbmcgdGhlIHNhbXBsZS4NCi0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3NlcnZpY2VsaWZlY3ljbGUvYnVpbGQueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9zZXJ2aWNlbGlmZWN5Y2xlL2J1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Q1MjI2NC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3NlcnZpY2VsaWZlY3ljbGUvYnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHByb2plY3QgbmFtZT0ic2VydmljZWxpZmVjeWNsZSIgYmFzZWRpcj0iLiIgZGVmYXVsdD0iYnVpbGQiPgotCi0gICAgPHByb3BlcnR5IGVudmlyb25tZW50PSJlbnYiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0ic2VydmljZS1uYW1lIiB2YWx1ZT0iTGlicmFyeS5hYXIiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iZGVzdC5kaXIiIHZhbHVlPSJ0YXJnZXQiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iYXhpczIuaG9tZSIgdmFsdWU9Ii4uLy4uLyIgLz4KLQotCTxwcm9wZXJ0eSBuYW1lPSJyZXBvc2l0b3J5LnBhdGgiIHZhbHVlPSIke2F4aXMyLmhvbWV9L3JlcG9zaXRvcnkvc2VydmljZXMiIC8+Ci0KLSAgICA8cHJvcGVydHkgbmFtZT0iZGVzdC5kaXIuY2xhc3NlcyIgdmFsdWU9IiR7ZGVzdC5kaXJ9L2NsYXNzZXMiLz4KLQotICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXN0LmRpci5saWIiIHZhbHVlPSIke2Rlc3QuZGlyfS9saWIiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iY2F0YWxpbmEtbW9kdWxlcyIKLSAgICAgICAgICAgICAgdmFsdWU9IiR7ZW52LkNBVEFMSU5BX0hPTUV9L3dlYmFwcHMvYXhpczIvV0VCLUlORi9zZXJ2aWNlcyIvPgotCi0gICAgPHBhdGggaWQ9ImJ1aWxkLmNsYXNzLnBhdGgiPgotICAgICAgICA8ZmlsZXNldCBkaXI9Ii4uLy4uL2xpYiI+Ci0gICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqLmphciIvPgotICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgPC9wYXRoPgotCi0gICAgPHRhcmdldCBuYW1lPSJjbGVhbiI+Ci0gICAgICAgIDxkZWxldGUgZGlyPSIke2Rlc3QuZGlyfSIvPgotICAgIDwvdGFyZ2V0PgotCi0gICAgPHRhcmdldCBuYW1lPSJwcmVwYXJlIiBkZXBlbmRzPSJjbGVhbiI+Ci0KLSAgICAgICAgPG1rZGlyIGRpcj0iJHtkZXN0LmRpcn0iLz4KLQotICAgICAgICA8bWtkaXIgZGlyPSIke2Rlc3QuZGlyLmNsYXNzZXN9Ii8+Ci0KLSAgICAgICAgPG1rZGlyIGRpcj0iJHtkZXN0LmRpci5jbGFzc2VzfS9NRVRBLUlORiIvPgotCi0gICAgPC90YXJnZXQ+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9ImJ1aWxkIiBkZXBlbmRzPSJwcmVwYXJlIj4KLQotICAgICAgICA8bWtkaXIgZGlyPSIke2Rlc3QuZGlyfSIvPgotCi0gICAgICAgIDxta2RpciBkaXI9IiR7ZGVzdC5kaXIuY2xhc3Nlc30iLz4KLSAgICAgICAgPG1rZGlyIGRpcj0iJHtkZXN0LmRpci5jbGFzc2VzfS9NRVRBLUlORiIvPgotCi0gICAgICAgIDxjb3B5IGZpbGU9InNyYy9NRVRBLUlORi9zZXJ2aWNlcy54bWwiCi0gICAgICAgICAgICAgIHRvZmlsZT0iJHtkZXN0LmRpci5jbGFzc2VzfS9NRVRBLUlORi9zZXJ2aWNlcy54bWwiCi0gICAgICAgICAgICAgIG92ZXJ3cml0ZT0idHJ1ZSIvPgotCi0gICAgICAgIDxqYXZhYyBkZWJ1Zz0ib24iIHNyY2Rpcj0ic3JjIiBkZXN0ZGlyPSIke2Rlc3QuZGlyLmNsYXNzZXN9IiBpbmNsdWRlcz0ic2FtcGxlLyoqIj4KLSAgICAgICAgICAgIDxjbGFzc3BhdGggcmVmaWQ9ImJ1aWxkLmNsYXNzLnBhdGgiLz4KLSAgICAgICAgPC9qYXZhYz4KLQotICAgICAgICA8amFyIGJhc2VkaXI9IiR7ZGVzdC5kaXIuY2xhc3Nlc30iCi0gICAgICAgICAgICAgZGVzdGZpbGU9IiR7ZGVzdC5kaXJ9LyR7c2VydmljZS1uYW1lfSIvPgotCi0gICAgPC90YXJnZXQ+Ci0KLSAgICAgPHRhcmdldCBuYW1lPSJnZW5lcmF0ZS5zZXJ2aWNlIiBkZXBlbmRzPSJwcmVwYXJlIj4KLQotICAgICAgICA8bWtkaXIgZGlyPSIke2Rlc3QuZGlyfSIvPgotCi0gICAgICAgIDxta2RpciBkaXI9IiR7ZGVzdC5kaXIuY2xhc3Nlc30iLz4KLSAgICAgICAgPG1rZGlyIGRpcj0iJHtkZXN0LmRpci5jbGFzc2VzfS9NRVRBLUlORiIvPgotCi0gICAgICAgIDxjb3B5IGZpbGU9InNyYy9NRVRBLUlORi9zZXJ2aWNlcy54bWwiCi0gICAgICAgICAgICAgIHRvZmlsZT0iJHtkZXN0LmRpci5jbGFzc2VzfS9NRVRBLUlORi9zZXJ2aWNlcy54bWwiCi0gICAgICAgICAgICAgIG92ZXJ3cml0ZT0idHJ1ZSIvPgotCi0gICAgICAgIDxqYXZhYyBkZWJ1Zz0ib24iIHNyY2Rpcj0ic3JjIiBkZXN0ZGlyPSIke2Rlc3QuZGlyLmNsYXNzZXN9IiBpbmNsdWRlcz0ic2FtcGxlLyoqIj4KLSAgICAgICAgICAgIDxjbGFzc3BhdGggcmVmaWQ9ImJ1aWxkLmNsYXNzLnBhdGgiLz4KLSAgICAgICAgPC9qYXZhYz4KLQotICAgICAgICA8amFyIGJhc2VkaXI9IiR7ZGVzdC5kaXIuY2xhc3Nlc30iCi0gICAgICAgICAgICAgZGVzdGZpbGU9IiR7cmVwb3NpdG9yeS5wYXRofS8ke3NlcnZpY2UtbmFtZX0iLz4KLQotICAgIDwvdGFyZ2V0PgotCi0KLQotICAgIDx0YXJnZXQgbmFtZT0icnVuLmNsaWVudCIgZGVwZW5kcz0icHJlcGFyZSI+Ci0gICAgICAgIDxta2RpciBkaXI9IiR7ZGVzdC5kaXJ9Ii8+Ci0gICAgICAgIDxta2RpciBkaXI9IiR7ZGVzdC5kaXIuY2xhc3Nlc30iLz4KLSAgICAgICAgPGphdmFjIGRlYnVnPSJvbiIgc3JjZGlyPSJzcmMiIGRlc3RkaXI9IiR7ZGVzdC5kaXIuY2xhc3Nlc30iIGluY2x1ZGVzPSJjbGllbnQvKioiPgotICAgICAgICAgICAgPGNsYXNzcGF0aD4KLSAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9Ii4uLy4uL2xpYiI+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIi8+Ci0gICAgICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICAgICAgPC9jbGFzc3BhdGg+Ci0gICAgICAgIDwvamF2YWM+Ci0KLSAgICAgICAgPGphdmEgY2xhc3NuYW1lPSJjbGllbnQuTGlicmFyeVNlcnZpY2VDbGllbnQiPgotICAgICAgICAgICAgPGNsYXNzcGF0aD4KLSAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7ZGVzdC5kaXIuY2xhc3Nlc30iLz4KLSAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9Ii4uLy4uL2xpYiI+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIi8+Ci0gICAgICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICAgICAgPC9jbGFzc3BhdGg+Ci0gICAgICAgIDwvamF2YT4KLQk8L3RhcmdldD4KLSAgICA8dGFyZ2V0IG5hbWU9ImNvcHkudG8udG9tY2F0IiBkZXBlbmRzPSJidWlsZCI+Ci0gICAgICAgIDxjb3B5IGZpbGU9IiR7ZGVzdC5kaXJ9LyR7c2VydmljZS1uYW1lfSIgdG9kaXI9IiR7Y2F0YWxpbmEtbW9kdWxlc30iLz4KLSAgICA8L3RhcmdldD4KLQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9zZXJ2aWNlbGlmZWN5Y2xlL2RvYy9zZXJ2aWNlbGlmZWN5Y2xlZ3VpZGUuaHRtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvc2VydmljZWxpZmVjeWNsZS9kb2Mvc2VydmljZWxpZmVjeWNsZWd1aWRlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjOGIyODguLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9zZXJ2aWNlbGlmZWN5Y2xlL2RvYy9zZXJ2aWNlbGlmZWN5Y2xlZ3VpZGUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIwMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJpc28tODg1OS0xIj8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjEvL0VOIgotICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDExL0RURC94aHRtbDExLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSIgLz4KLSAgPHRpdGxlPlNlcnZpY2UgTGlmZSBDeWNsZSBTYW1wbGUgR3VpZGU8L3RpdGxlPgotICA8bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9ImFtYXlhIDkuMi4xLCBzZWUgaHR0cDovL3d3dy53My5vcmcvQW1heWEvIgotICAvPgotPC9oZWFkPgotCi08Ym9keT4KLTxoMT5TZXJ2aWNlIExpZmUgQ3ljbGUgU2FtcGxlIEd1aWRlPC9oMT4KLQotPGgyPkludHJvZHVjdGlvbjwvaDI+Ci0KLTxwPlRoaXMgc2FtcGxlIGlzIHRvIGRlbW9uc3RyYXRlIHVzYWdlIG9mIGEgc2VydmljZSBsaWZlIGN5Y2xlIGludGVyZmFjZSBhbmQKLXNlc3Npb24gc2NvcGluZyB3aXRoIGEgc2FtcGxlIG9uIGFwcGxpY2F0aW9uIHNjb3BlIHNlc3Npb24uIFRoZSBzYW1wbGUKLWNvbnNpc3RzIG9mIHR3byBwYXJ0cywgU2VydmljZSBhbmQgQ2xpZW50LjwvcD4KLQotPHA+TGV0J3MgdGFrZSBhIGxpYnJhcnkgc3lzdGVtLCB3aGljaCBoYXMgdGhlIGZvbGxvd2luZyBvcGVyYXRpb25zLCBhcyB0aGUKLXNjZW5hcmlvIGZvciB0aGlzIHNhbXBsZS48L3A+Ci08dWw+Ci0gIDxsaT5SZWdpc3RlciB1c2VyPC9saT4KLSAgPGxpPkxvZ2luIHRvIHN5c3RlbTwvbGk+Ci0gIDxsaT5WaWV3IGFsbCBib29rczwvbGk+Ci0gIDxsaT5WaWV3IGF2YWlsYWJsZSBib29rczwvbGk+Ci0gIDxsaT5WaWV3IGxlbmQgYm9va3M8L2xpPgotICA8bGk+TGVuZCBhbmQgcmV0dXJuIGJvb2tzPC9saT4KLTwvdWw+Ci0KLTxoMj5XaHkgRG8gV2UgTmVlZCBTZXJ2aWNlIExpZmUgQ3ljbGUgSGVyZT88L2gyPgotCi08cD5JbiBvcmRlciB0byBtYWtlIHN1cmUgdGhhdCBhdCB0aGUgcnVudGltZSBzZXJ2aWNlIGltcGwgY2xhc3MgY2FuIGFjY2VzcwotZGF0YSByZWFkIGZyb20gYW55d2hlcmUsIHdlIG5lZWQgdG8gaW5pdGlhbGl6ZSB0aGUgc2VydmljZSBhdCBkZXBsb3ltZW50LgotTGV0J3MgZm9yZ2V0IGFib3V0IHRoZSBzZXNzaW9uIGZvciBhIG1pbnV0ZSBhbmQgdGhpbmsgYWJvdXQgdGhlIHNjZW5hcmlvCi13aGVyZSB5b3Ugd2FudCB0byBwb3B1bGF0ZSBhIGJlYW4gb3IgbmVlZCB0byBzdGFydCBhIERhdGEgQmFzZSBjb25uZWN0aW9uIGZvcgotdGhlIHNlcnZpY2UuIEluIHN1Y2ggYSBzaXR1YXRpb24gaGF2aW5nIHNlcnZpY2UgbGlmZSBjeWNsZSBjbGFzcyBpcyB2ZXJ5Ci11c2VmdWwuPC9wPgotCi08cD5JbiB0aGlzIHNhbXBsZSB5b3Ugd2lsbCBsZWFybiBob3cgdG8gdXNlIHRoZSBzZXJ2aWNlIGxpZmUgY3ljbGUgY2xhc3MgZm9yCi15b3VyIGFwcGxpY2F0aW9uLiBUaGUgaW50ZXJmYWNlIGhhcyBvbmx5IHR3byBtZXRob2RzPC9wPgotPG9sPgotICA8bGk+c3RhcnRVcDwvbGk+Ci0gIDxsaT5zaHV0RG93bjwvbGk+Ci08L29sPgotCi08cD5XaGVyZSBzdGFydFVwIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSBzZXJ2aWNlIGlzIGRlcGxveWVkIGFuZCBpdAotd2lsbCBjYWxsIG9ubHkgb25jZSBmb3IgdGhhdCBwYXJ0aWN1bGFyIHNlcnZpY2UsIHdoaWxlIHNodXREb3duIG1ldGhvZCBjYWxscwotd2hlbiBzeXN0ZW0gc2h1dGRvd24uPC9wPgotCi08cD5TbyBpbiB0aGlzIHNhbXBsZSwgdGhlIGxpZmUgY3ljbGUgY2xhc3Mgd2lsbCBsb2FkIHRoZSBsaWJyYXJ5IGluc2lkZSB0aGUKLXN0YXJ0VXAgbWV0aG9kLiBBdCB0aGUgdmVyeSBmaXJzdCB0aW1lIHRoZSBzeXN0ZW0gd2lsbCBsb2FkIGZyb20KLXNlcnZpY2VzLnhtbC4gSXQgaGFzIGFsbCB0aGUgYXZhaWxhYmxlIGJvb2tzIGluIHRoZSBzeXN0ZW0uIEFuZCBhdCB0aGUgdGltZQotb2Ygc3lzdGVtIHNodXRkb3duIGl0IHdpbGwgc2F2ZSB0aGUgc3RhdHVzIG9mIHRoZSBsaWJyYXJ5IGludG8gYSBmaWxlCi0obGlicmFyeS54bWwpIGluIHRoZSBqYXZhLmlvLnRlbXAgZGlyZWN0b3J5LiBTbyB0aGUgbmV4dCB0aW1lIG9ud2FyZHMgaXQgd2lsbAotcG9wdWxhdGUgbGlicmFyeSB1c2luZyB0aGUgYWJvdmUgZmlsZS4gU28gYWxsIHRoZSBjaGFuZ2VzIHdpbGwgYmUgdGhlcmUgaW4KLXRoZSBuZXcgaW5zdGFuY2UgYXMgd2VsbC48L3A+Ci0KLTxoMj5QcmVyZXF1aXNpdGVzPC9oMj4KLQotPHA+WW91IHdpbGwgaGF2ZSB0byBpbnN0YWxsIDxhIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy8iPkFwYWNoZSBBbnQ8L2E+Ci0xLjYuMiBvciBsYXRlci48L3A+Ci0KLTxoMj5SdW5uaW5nIHRoZSBTYW1wbGU8L2gyPgotCi08aDM+SG93IHRvIEJ1aWxkIHRoZSBTZXJ2aWNlPzwvaDM+Ci0KLTxwPkJ1aWxkaW5nIHRoZSBzZXJ2aWNlIGlzIGp1c3QgYSBtYXR0ZXIgb2YgcnVubmluZyBhbnQgYnVpbGQgZmlsZS4gSXQgd2lsbAotY3JlYXRlIHRoZSBzZXJ2aWNlIGFhciBmaWxlLCBvciB5b3UgY291bGQganVzdCBydW4gdGhlIGNvcHkudG8udG9tY2F0IGdvYWwKLXdoaWNoIHdpbGwgY29weSB0aGUgYWFyIGZpbGUgaW50byB0b21jYXQvd2ViLWFwcC9heGlzMi9XRUItSU5GL3NlcnZpY2VzCi1kaXJlY3RvcnkuPC9wPgotCi08cD5OZXh0LCBnbyB0byBodHRwOi8vW3VybCBhbmQgcG9ydCB0byB5b3VyIGFwcCBzZXJ2ZXJdL2F4aXMyIGFuZCBzZWUgd2hldGhlcgoteW91ciBzZXJ2aWNlIGlzIGxpc3RlZCB0aGVyZS48L3A+Ci0KLTxoMz5Ib3cgdG8gSW52b2tlIHRoZSBTZXJ2aWNlPC9oMz4KLQotPHA+WW91IGNhbiBpbnZva2UgY29tcGxldGUgc2VydmljZSB1c2luZyBSRVNUIEFQSSwgYnV0IGl0IG9ubHkgd29ya3MgaW4KLWFwcGxpY2F0aW9uIHNlcnZlcnMgbGlrZSBBcGFjaGUgVG9tY2F0IGFuZCBpdCB3aWxsIG5vdCB3b3JrIGluCi1TaW1wbGVIdHRwU2VydmVyLiBGaXJzdCB0cnkgdG8gdXNlIGxpYnJhcnkgc3lzdGVtIHVzaW5nIFJFU1QgQVBJLjwvcD4KLQotPHA+VGhpcyBzYW1wbGUgaXMgYSBzaW1wbGUgb25lIGFuZCB3aWxsIG5vdCBkbyBjb21wbGV4IHRhc2tzLiBTbyBsZXQncyBmb2xsb3cKLXN0ZXBzIGdpdmVuIGJlbG93IHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBzYW1wbGUgd29ya3MgYXMgaXQgc2hvdWxkOjwvcD4KLQotPHA+PHN0cm9uZz5TdGVwIDE8L3N0cm9uZz46LSBWaWV3IGFsbCB0aGUgYXZhaWxhYmxlIGJvb2tzIGluIHRoZSBsaWJyYXJ5LAotanVzdCB0eXBlIHRoZSBVUkwKLWh0dHA6Ly8xMjcuMC4wLjE6ODA4MC9heGlzMi9zZXJ2aWNlcy9MaWJyYXJ5L2xpc3RBdmFpbGFibGVCb29rIG9uIHlvdXIKLWZhdm9yaXRlIGJyb3dzZXIuPC9wPgotCi08cD5Zb3Ugd2lsbCBzZWUgYWxsIHRoZSBhdmFpbGFibGUgYm9va3MgaW4gdGhlIHN5c3RlbS48L3A+Ci0KLTxwPjxzdHJvbmc+U3RlcCAyPC9zdHJvbmc+IDogVmlldyBhbGwgdGhlIGJvb2tzIGluIHRoZSBzeXN0ZW0gYXQKLWh0dHA6Ly8xMjcuMC4wLjE6ODA4MC9heGlzMi9zZXJ2aWNlcy9MaWJyYXJ5L2xpc3RBbGxCb29rPC9wPgotCi08cD5JbiB0aGlzIGNhc2UgeW91IHdpbGwgZ2V0IGV4YWN0bHkgdGhlIHNhbWUgcmVzdWx0IGZvciBib3RoIHRoZSByZXF1ZXN0LAotc2luY2Ugbm8gb25lIGhhcyBib3Jyb3dlZCB0aGUgYm9vay48L3A+Ci0KLTxwPjxzdHJvbmc+U3RlcCAzPC9zdHJvbmc+OiBOb3cgbG9vayBhdCBhbGwgdGhlIGxlbnQgYm9va3MgaW4gdGhlIHN5c3RlbS4gQW5kCi15b3Ugd2lsbCBzZWUgYW4gZW1wdHkgbGlzdCBhdAotaHR0cDovLzEyNy4wLjAuMTo4MDgwL2F4aXMyL3NlcnZpY2VzL0xpYnJhcnkvbGlzdExlbmRCb29rPC9wPgotCi08cD48c3Ryb25nPlN0ZXAgNDwvc3Ryb25nPiA6IFJlZ2lzdGVyIGEgdXNlci4gVG8gbGVuZCBhIGJvb2sgb3IgcmV0dXJuIGEKLWJvb2ssIHlvdSBuZWVkIHRvIHJlZ2lzdGVyIGZpcnN0LiBEbyBub3QgcmVnaXN0ZXIgdHdpY2UsIGlmIHlvdSB0cnkgdG8gZG8gc28KLXlvdSB3aWxsIGdldCBhbiBleGNlcHRpb24uPC9wPgotCi08cD5UbyByZWdpc3RlciB5b3UgbmVlZCB0byBnaXZlIHVzZXIgbmFtZSBhbmQgcGFzc3dvcmQgKGhhdmUgYSBsb29rIGF0IHRoZQotd3NkbCBhdCBodHRwOi8vMTI3LjAuMC4xOnBvcnQvYXhpczIvc2VydmljZXMvc2VydmljZU5hbWU/d3NkbC4gWW91IHdpbGwgc2VlCi13aGF0IHlvdSBuZWVkIHRvIHBhc3MgaW4pPC9wPgotCi08cD5TbyBsZXQncyBjcmVhdGUgYSB1c2VyIGNhbGxlZCAnZm9vJyB3aXRoIHRoZSBwYXNzd29yZCAnMTIzJwotKGh0dHA6Ly8xMjcuMC4wLjE6ODA4MC9heGlzMi9zZXJ2aWNlcy9MaWJyYXJ5L3JlZ2lzdGVyP3VzZXJOYW1lPWZvbyZhbXA7cGFzc1dvcmQ9MTIzKTwvcD4KLQotPHA+VGhlbiB5b3Ugd2lsbCBnZXQgdGhlIGZvbGxvd2luZyByZXNwb25zZSwgaWYgZXZlcnl0aGluZyBoYXMgZ29uZSB3ZWxsLjwvcD4KLTxwcmU+Jmx0O25zOnJlZ2lzdGVyUmVzcG9uc2UmZ3Q7Ci0mbHQ7bnM6cmV0dXJuJmd0O3RydWUmbHQ7L25zOnJldHVybiZndDsKLSZsdDsvbnM6cmVnaXN0ZXJSZXNwb25zZSZndDs8L3ByZT4KLQotPHA+PHN0cm9uZz5TdGVwIDU8L3N0cm9uZz4gOiBMb2cgaW50byBzeXN0ZW0uIFRvIGxvZyBpbiB5b3UgbmVlZCB0byBwYXNzIHVzZXIKLW5hbWUgYW5kIHBhc3N3b3JkLiBTbyBsZXQncyB0cnkgdG8gbG9naW4gdG8gc3lzdGVtLiBUaGUgcmVxdWVzdCB3aWxsIGJlCi1odHRwOi8vMTI3LjAuMC4xOjgwODAvYXhpczIvc2VydmljZXMvTGlicmFyeS9sb2dpbj91c2VyTmFtZT1mb28mYW1wO3Bhc3NXb3JkPTEyMzwvcD4KLQotPHA+PHN0cm9uZz5TdGVwIDY8L3N0cm9uZz4gOiBOb3cgd2UgYXJlIHJlYWR5IHRvIGxlbmQgYSBib29rLiBUbyBsZW5kIGEgYm9vawoteW91IG5lZWQgdG8gcGFzcyBpc2JuIGFuZCB1c2VyTmFtZS4gTGV0J3MgdHJ5IHRvIGxlbmQgdGhlIGJvb2sgd2l0aCBpc2JuCi0wLTkzNzE3NS03Ny0zLCB5b3VyIHJlcXVlc3Qgd291bGQgbG9vayBsaWtlIGJlbG93OjwvcD4KLQotPHA+aHR0cDovLzEyNy4wLjAuMTo4MDgwL2F4aXMyL3NlcnZpY2VzL0xpYnJhcnkvbGVuZEJvb2s/aXNibj0wLTkzNzE3NS03Ny0zJmFtcDt1c2VyTmFtZT1mb288L3A+Ci0KLTxwPklmIGV2ZXJ5dGhpbmcgd2VudCB3ZWxsLCB5b3Ugd2lsbCBzZWUgdGhlIGZvbGxvd2luZyByZXNwb25zZSBpbiB0aGUKLWJyb3dzZXIuPC9wPgotPHByZT4mbHQ7bnM6bGVuZEJvb2tSZXNwb25zZSZndDsKLSZsdDtuczpyZXR1cm4mZ3Q7Ci0mbHQ7YXV0aG9yJmd0O0pvaG4gQmxvb21lciZsdDsvYXV0aG9yJmd0OwotJmx0O2lzYm4mZ3Q7MC05MzcxNzUtNzctMyZsdDsvaXNibiZndDsKLSZsdDt0aXRsZSZndDtQb3dlciBQcm9ncmFtbWluZyB3aXRoIFJQQyZsdDsvdGl0bGUmZ3Q7Ci0mbHQ7L25zOnJldHVybiZndDsKLSZsdDsvbnM6bGVuZEJvb2tSZXNwb25zZSZndDs8L3ByZT4KLQotPHA+PHN0cm9uZz5TdGVwIDc8L3N0cm9uZz4gOiBOb3cgZ28gYW5kIGxvb2sgYXQgbGVudCBsaXN0IGFnYWluIGF0Ci1odHRwOi8vMTI3LjAuMC4xOjgwODAvYXhpczIvc2VydmljZXMvTGlicmFyeS9saXN0TGVuZEJvb2ssIHlvdSB3aWxsIHNlZSB0aGUKLWZvbGxvd2luZyBvdXRwdXQgaW4gdGhlIGJyb3dzZXIuPC9wPgotPHByZT4mbHQ7bnM6bGlzdExlbmRCb29rUmVzcG9uc2UmZ3Q7Ci0mbHQ7bnM6cmV0dXJuJmd0OwotJmx0O2F1dGhvciZndDtKb2huIEJsb29tZXImbHQ7L2F1dGhvciZndDsKLSZsdDtpc2JuJmd0OzAtOTM3MTc1LTc3LTMmbHQ7L2lzYm4mZ3Q7Ci0mbHQ7dGl0bGUmZ3Q7UG93ZXIgUHJvZ3JhbW1pbmcgd2l0aCBSUEMmbHQ7L3RpdGxlJmd0OwotJmx0Oy9uczpyZXR1cm4mZ3Q7Ci0mbHQ7L25zOmxpc3RMZW5kQm9va1Jlc3BvbnNlJmd0OzwvcHJlPgotCi08cD5UaGF0J3MgdGhlIGJvb2sgeW91IGp1c3QgbGVudCE8L3A+Ci0KLTxwPk5vdGUgOiBOb3cgaWYgd2UgdmlldyB0aGUgYXZhaWxhYmxlIGJvb2tzLCB5b3Ugd2lsbCBub3Qgc2VlIHRoZSBhYm92ZSBib29rCi1pbiB0aGF0IGxpc3QuPC9wPgotCi08cD48c3Ryb25nPlN0ZXAgODwvc3Ryb25nPiA6IE5vdyBsZXQncyByZXR1cm4gdGhlIGJvb2suPC9wPgotCi08cD5odHRwOi8vMTI3LjAuMC4xOjgwODAvYXhpczIvc2VydmljZXMvTGlicmFyeS9yZXR1cm5Cb29rP2lzYm49Ci0wLTkzNzE3NS03Ny0zPC9wPgotCi08cD48c3Ryb25nPlN0ZXAgOTwvc3Ryb25nPiA6IE5vdyBsZXQncyBsb29rIGF0IHRoZSBsZW50IGJvb2sgbGlzdCBhZ2FpbiwgYW5kCi15b3Ugd2lsbCByZWFsaXplIHRoYXQgbGlzdCBpcyBlbXB0eS48L3A+Ci0KLTxwPjxzdHJvbmc+U3RlcCAxMDwvc3Ryb25nPiA6IExlbmQgZmV3IG1vcmUgYm9vayBhbmQgcmUtc3RhcnQgdGhlIGFwcCBzZXJ2ZXIKLShzYXkgVG9tY2F0KSwgYW5kIHNlZSB3aGV0aGVyIGFsbCB0aGUgcHJldmlvdXMgZGF0YSBpcyB0aGVyZSBpbiB0aGUgbmV3Ci1pbnN0YW5jZS48L3A+Ci0KLTxoMz5SdW5uaW5nIHRoZSBKYXZhIENsaWVudDwvaDM+Ci0KLTxwPk9wZW4gdXAgdGhlIExpYnJhcnlTZXJ2aWNlQ2xpZW50IGphdmEgY2xhc3MgaW4geW91ciBmYXZvcml0ZSBJREUgYW5kIHJ1bgotdGhlIG1haW4gY2xhc3MuIEFuZCB5b3UgY2FuIGNvbW1lbnQgb3V0IHRoZSBtZXRob2RzIHlvdSBkbyBub3Qgd2lzaCB0byBpbnZva2UKLXdoaWxlIHVuLWNvbW1lbnRpbmcgdGhlIG1ldGhvZChzKSB5b3Ugd2FudCB0byBpbnZva2UuPC9wPgotCi08cD5KYXZhIGNsaWVudCBhbHNvIGNhbiBiZSBydW4gdXNpbmcgPGEKLWhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy8iPkFudDwvYT4uIFlvdSBjYW4gZXhlY3V0ZSB0aGUgY2xpZW50IGFuZCBpbnZva2UKLXNlcnZpY2UgdHlwaW5nIDxjb2RlPmFudCBydW4uY2xpZW50PC9jb2RlPiBjb21tYW5kIGluIHRoZQotQXhpczJfSE9NRS9zYW1wbGVzL3NlcnZpY2VsaWZlY3ljbGU8L3A+Ci0KLTxwPkFuZCB0aGVuIGZvbGxvdyB0aGUgaW5zdHJ1Y3Rpb25zIGFzIG1lbnRpb25lZCBpbiB0aGUgY29uc29sZS48L3A+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3NlcnZpY2VsaWZlY3ljbGUvc3JjL01FVEEtSU5GL3NlcnZpY2VzLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvc2VydmljZWxpZmVjeWNsZS9zcmMvTUVUQS1JTkYvc2VydmljZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0N2QyY2Y0Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvc2VydmljZWxpZmVjeWNsZS9zcmMvTUVUQS1JTkYvc2VydmljZXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08c2VydmljZSBuYW1lPSJMaWJyYXJ5IgotICAgICAgICAgY2xhc3M9InNhbXBsZS5zZXJ2aWNlbGlmZWN5Y2xlLkxpYnJhcnlMaWZlQ3ljbGUiIHNjb3BlPSJhcHBsaWNhdGlvbiI+Ci0gICAgPGRlc2NyaXB0aW9uPgotICAgICAgICBUaGlzIGlzIHNhbXBsZSBzZXJ2aWNlIDIKLSAgICA8L2Rlc2NyaXB0aW9uPgotICAgIDxtZXNzYWdlUmVjZWl2ZXJzPgotICAgICAgICA8bWVzc2FnZVJlY2VpdmVyIG1lcD0iaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC93c2RsL2luLW9ubHkiCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIucnBjLnJlY2VpdmVycy5SUENJbk9ubHlNZXNzYWdlUmVjZWl2ZXIiLz4KLSAgICAgICAgPG1lc3NhZ2VSZWNlaXZlciBtZXA9Imh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgvd3NkbC9pbi1vdXQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIucnBjLnJlY2VpdmVycy5SUENNZXNzYWdlUmVjZWl2ZXIiLz4KLSAgICA8L21lc3NhZ2VSZWNlaXZlcnM+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJTZXJ2aWNlQ2xhc3MiPgotICAgICAgICBzYW1wbGUuc2VydmljZWxpZmVjeWNsZS5MaWJyYXJ5U2VydmljZTwvcGFyYW1ldGVyPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iYWxsQm9va3MiPgotICAgICAgICA8YWxsQm9va3M+Ci0gICAgICAgICAgICA8Ym9vaz4KLSAgICAgICAgICAgICAgICA8YXV0aG9yPkpvaG4gQmxvb21lcjwvYXV0aG9yPgotICAgICAgICAgICAgICAgIDxpc2JuPjAtOTM3MTc1LTc3LTM8L2lzYm4+Ci0gICAgICAgICAgICAgICAgPHRpdGxlPlBvd2VyIFByb2dyYW1taW5nIHdpdGggUlBDPC90aXRsZT4KLSAgICAgICAgICAgIDwvYm9vaz4KLSAgICAgICAgICAgIDxib29rPgotICAgICAgICAgICAgICAgIDxhdXRob3I+U3RlcGhlbiBTcGFpbmhvdXIgYW5kIFZhbGVyaWUgUXVlcmNpYTwvYXV0aG9yPgotICAgICAgICAgICAgICAgIDxpc2JuPjEtNTY1OTItMjI5LTg8L2lzYm4+Ci0gICAgICAgICAgICAgICAgPHRpdGxlPldFQk1BU1RFUiBJTiBBIE5VVFNIRUxMPC90aXRsZT4KLSAgICAgICAgICAgIDwvYm9vaz4KLSAgICAgICAgICAgIDxib29rPgotICAgICAgICAgICAgICAgIDxhdXRob3I+RGF2aWQgRmxhbmFnYW48L2F1dGhvcj4KLSAgICAgICAgICAgICAgICA8aXNibj4xLTU2NTkyLTM3MS01PC9pc2JuPgotICAgICAgICAgICAgICAgIDx0aXRsZT5KYXZhIEV4YW1wbGVzPC90aXRsZT4KLSAgICAgICAgICAgIDwvYm9vaz4KLSAgICAgICAgICAgIDxib29rPgotICAgICAgICAgICAgICAgIDxhdXRob3I+TWFyayBMdXR6IGFuZCBEYXZpZCBBc2NoZXI8L2F1dGhvcj4KLSAgICAgICAgICAgICAgICA8aXNibj4xLTU2NTkyLTQ2NC04PC9pc2JuPgotICAgICAgICAgICAgICAgIDx0aXRsZT5MZWFybmluZyBQeXRob248L3RpdGxlPgotICAgICAgICAgICAgPC9ib29rPgotICAgICAgICAgICAgPGJvb2s+Ci0gICAgICAgICAgICAgICAgPGF1dGhvcj5BLiBLZXl0b24gV2Vpc3NpbmdlcjwvYXV0aG9yPgotICAgICAgICAgICAgICAgIDxpc2JuPjEtNTY1OTItNDkwLTg8L2lzYm4+Ci0gICAgICAgICAgICAgICAgPHRpdGxlPkFTUCBJbiBhIG51dHNoZWxsPC90aXRsZT4KLSAgICAgICAgICAgIDwvYm9vaz4KLSAgICAgICAgICAgIDxib29rPgotICAgICAgICAgICAgICAgIDxhdXRob3I+Q2xpbnRvbiBXb25nPC9hdXRob3I+Ci0gICAgICAgICAgICAgICAgPGlzYm4+MS01NjU5Mi0yMTQtWDwvaXNibj4KLSAgICAgICAgICAgICAgICA8dGl0bGU+V2ViIENsaWVudCBQcm9ncmFtbWluZyB3aXRoIFBlcmw8L3RpdGxlPgotICAgICAgICAgICAgPC9ib29rPgotICAgICAgICAgICAgPGJvb2s+Ci0gICAgICAgICAgICAgICAgPGF1dGhvcj5Eb24gQm94ICwgQWFyb24gU2tvbm5hcmQgYW5kIEpvaG4gTGFtPC9hdXRob3I+Ci0gICAgICAgICAgICAgICAgPGlzYm4+MC0yMDEtNzA5MTQtNzwvaXNibj4KLSAgICAgICAgICAgICAgICA8dGl0bGU+RXNzZW50aWFsIFhNTCAsIEJleW9uZCBNYXJrdXA8L3RpdGxlPgotICAgICAgICAgICAgPC9ib29rPgotICAgICAgICA8L2FsbEJvb2tzPgotICAgIDwvcGFyYW1ldGVyPgotPC9zZXJ2aWNlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvc2VydmljZWxpZmVjeWNsZS9zcmMvY2xpZW50L0xpYnJhcnlTZXJ2aWNlQ2xpZW50LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3NlcnZpY2VsaWZlY3ljbGUvc3JjL2NsaWVudC9MaWJyYXJ5U2VydmljZUNsaWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWFiNjZkLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvc2VydmljZWxpZmVjeWNsZS9zcmMvY2xpZW50L0xpYnJhcnlTZXJ2aWNlQ2xpZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgY2xpZW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50Lk9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5EZWZhdWx0T2JqZWN0U3VwcGxpZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ycGMuY2xpZW50LlJQQ1NlcnZpY2VDbGllbnQ7Ci1pbXBvcnQgc2FtcGxlLnNlcnZpY2VsaWZlY3ljbGUuYmVhbi5Cb29rOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgTGlicmFyeVNlcnZpY2VDbGllbnQgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VSX05BTUUgPSAiLXVzZXJOYW1lIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFTU19XT1JEID0gIi1wYXNzV29yZCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElTQk4gPSAiLWlzYm4iOwotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIExpYnJhcnlTZXJ2aWNlQ2xpZW50IGNsaWVudCA9IG5ldyBMaWJyYXJ5U2VydmljZUNsaWVudCgpOwotICAgICAgICBjbGllbnQucnVuQ2xpZW50KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2hvd09wdGlvbnMoKSB7Ci0gICAgCVN5c3RlbS5vdXQucHJpbnRsbigiPT09PT1XZWxjb21lIHRvIExpYnJhcmF5IGNsaWVudD09PT09PSIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgVG8gbGlzdCBBbGwgYm9va3MgdHlwZSAxIik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiIFRvIGxpc3QgQXZhaWxhYmxlIGJvb2tzIHR5cGUgMiIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiBUbyBsaXN0IExlbmQgYm9va3MgdHlwZSAzIik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiIFRvIHJlZ2lzdGVyICA0ICAtIC11c2VyTmFtZSAtcGFzc1dvcmQiKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgVG8gbG9naW4gICAgIDUgLSAtdXNlck5hbWUgLXBhc3NXb3JkIik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiIFRvIGxlbmQgYSBib29rIDYgLSAtaXNibiAtdXNlck5hbWUgICAiKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgVG8gcmV0dXJuIGEgYm9vayA3IC0gLWlzYm4iKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgVG8gZXhpdCB0eXBlIC0xICIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKLSAgICAgICAKLSAgICB9Ci0gICAgcHVibGljIHZvaWQgcnVuQ2xpZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgCVN5c3RlbS5vdXQucHJpbnRsbigiRW50ZXIgc2VydmljZSBlcHIgYWRkcmVzcyA6ICAgICAgICAgICIpOwotICAgICAgICBTdHJpbmcgZXByID0gZ2V0SW5wdXQoKTsKLSAgICAgICAgUlBDU2VydmljZUNsaWVudCBycGNDbGllbnQgPSBuZXcgUlBDU2VydmljZUNsaWVudCgpOwotICAgICAgICBPcHRpb25zIG9wdHMgPSBuZXcgT3B0aW9ucygpOwotICAgICAgICBvcHRzLnNldFRvKG5ldyBFbmRwb2ludFJlZmVyZW5jZShlcHIpKTsKLSAgICAgICAgcnBjQ2xpZW50LnNldE9wdGlvbnMob3B0cyk7Ci0gICAgICAgIExpYnJhcnlTZXJ2aWNlQ2xpZW50IGNsaWVudCA9IG5ldyBMaWJyYXJ5U2VydmljZUNsaWVudCgpOwotICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAJc2hvd09wdGlvbnMoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVHlwZSB5b3VyIGNvbW1hbmQgaGVyZSA6ICIpOwotICAgICAgICAgICAgU3RyaW5nIGNvbW1hbmRzUGFybXMgPSBnZXRJbnB1dCgpOwotICAgICAgICAgICAgaWYgKGNvbW1hbmRzUGFybXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFN0cmluZ1tdIGFyZ3MgPSBjb21tYW5kc1Bhcm1zLnNwbGl0KCIgIik7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGZpcnN0YXJnID0gYXJnc1swXTsKLSAgICAgICAgICAgICAgICBpbnQgY29tbWFuZDsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIAljb21tYW5kID0gSW50ZWdlci5wYXJzZUludChmaXJzdGFyZyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIAlTeXN0ZW0ub3V0LnByaW50bG4oIklsbGVnYWwgYXJndW1lbnQgZW50ZXJlZC5cbiIpOwotICAgICAgICAgICAgICAgIAljb250aW51ZTsKLQkJCQl9Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChjb21tYW5kKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgMSA6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudC5saXN0QWxsQm9vayhycGNDbGllbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSAyIDogewotICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50Lmxpc3RBdmFpbGFibGVCb29rKHJwY0NsaWVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXNlIDMgOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQubGlzdExlbmRCb29rKHJwY0NsaWVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXNlIDQgOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdXNyZU5hbWUgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhc3NXb3JkID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA8IDUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJObyBlbm91Z2ggbnVtYmVyIG9mIGFyZ3VtZW50cyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFVTRVJfTkFNRS5lcXVhbHMoYXJnc1sxXSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c3JlTmFtZSA9IGFyZ3NbMl07Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFVTRVJfTkFNRS5lcXVhbHMoYXJnc1szXSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c3JlTmFtZSA9IGFyZ3NbNF07Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChQQVNTX1dPUkQuZXF1YWxzKGFyZ3NbMV0pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc1dvcmQgPSBhcmdzWzJdOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChQQVNTX1dPUkQuZXF1YWxzKGFyZ3NbM10pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc1dvcmQgPSBhcmdzWzRdOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50LnJlZ2lzdGVyKHVzcmVOYW1lLCBwYXNzV29yZCwgcnBjQ2xpZW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgNSA6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB1c3JlTmFtZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGFzc1dvcmQgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFyZ3MubGVuZ3RoIDwgNSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIk5vIGVub3VnaCBudW1iZXIgb2YgYXJndW1lbnRzIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoVVNFUl9OQU1FLmVxdWFscyhhcmdzWzFdKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzcmVOYW1lID0gYXJnc1syXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoVVNFUl9OQU1FLmVxdWFscyhhcmdzWzNdKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzcmVOYW1lID0gYXJnc1s0XTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFBBU1NfV09SRC5lcXVhbHMoYXJnc1sxXSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzV29yZCA9IGFyZ3NbMl07Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFBBU1NfV09SRC5lcXVhbHMoYXJnc1szXSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzV29yZCA9IGFyZ3NbNF07Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQubG9naW4odXNyZU5hbWUsIHBhc3NXb3JkLCBycGNDbGllbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSA2IDogewotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGlzYm4gPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHVzZXJOYW1lID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA8IDUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJObyBlbm91Z2ggbnVtYmVyIG9mIGFyZ3VtZW50cyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFVTRVJfTkFNRS5lcXVhbHMoYXJnc1sxXSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyTmFtZSA9IGFyZ3NbMl07Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFVTRVJfTkFNRS5lcXVhbHMoYXJnc1szXSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyTmFtZSA9IGFyZ3NbNF07Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChJU0JOLmVxdWFscyhhcmdzWzFdKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzYm4gPSBhcmdzWzJdOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChJU0JOLmVxdWFscyhhcmdzWzNdKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzYm4gPSBhcmdzWzRdOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50LmxlbmRCb29rKGlzYm4sIHVzZXJOYW1lLCBycGNDbGllbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSA3IDogewotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGlzYm4gPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFyZ3MubGVuZ3RoIDwgMykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIk5vIGVub3VnaCBudW1iZXIgb2YgYXJndW1lbnRzIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoSVNCTi5lcXVhbHMoYXJnc1sxXSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc2JuID0gYXJnc1syXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudC5yZXR1cm5Cb29rKGlzYm4sIHJwY0NsaWVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXNlIC0xIDogewotICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmV4aXQoMCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogewotICAgICAgICAgICAgICAgICAgICAJU3lzdGVtLm91dC5wcmludGxuKCJXcm9uZyBhcmd1bWVudC5cbiIpOwotICAgICAgICAgICAgICAgICAgICAJYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyAgU3lzdGVtLmluLnJlYWQoKQotICAgIH0KLQotICAgIC8vCi0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldElucHV0KCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnl0ZSBiIFtdID0gbmV3IGJ5dGUgWzI1Nl07Ci0gICAgICAgICAgICBpbnQgaSA9IFN5c3RlbS5pbi5yZWFkKGIpOwotICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICIiOwotICAgICAgICAgICAgaWYgKGkgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICBtc2cgPSBuZXcgU3RyaW5nKGIpLnN1YnN0cmluZygwLCBpIC0gMSkudHJpbSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG1zZzsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCIgb2NjdXJyZWQgd2hpbGUgcmVhZGluZyBpbiBjb21tYW5kIDogIiArIGUpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIHB1YmxpYyB2b2lkIHJldHVybkJvb2soU3RyaW5nIGlzYm4sIFJQQ1NlcnZpY2VDbGllbnQgcnBjQ2xpZW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgcnBjQ2xpZW50LmdldE9wdGlvbnMoKS5zZXRBY3Rpb24oInVybjpyZXR1cm5Cb29rIik7Ci0gICAgICAgIEFycmF5TGlzdCBhcmdzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBhcmdzLmFkZChpc2JuKTsKLSAgICAgICAgcnBjQ2xpZW50Lmludm9rZVJvYnVzdChuZXcgUU5hbWUoImh0dHA6Ly9zZXJ2aWNlbGlmZWN5Y2xlLnNhbXBsZSIsCi0gICAgICAgICAgICAgICAgInJldHVybkJvb2siKSwgYXJncy50b0FycmF5KCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGxlbmRCb29rKFN0cmluZyBpc2JuLCBTdHJpbmcgdXNlck5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgUlBDU2VydmljZUNsaWVudCBycGNDbGllbnQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBycGNDbGllbnQuZ2V0T3B0aW9ucygpLnNldEFjdGlvbigidXJuOmxlbmRCb29rIik7Ci0gICAgICAgIEFycmF5TGlzdCBhcmdzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBhcmdzLmFkZChpc2JuKTsKLSAgICAgICAgYXJncy5hZGQodXNlck5hbWUpOwotICAgICAgICBPYmplY3Qgb2JqIFtdID0gcnBjQ2xpZW50Lmludm9rZUJsb2NraW5nKG5ldyBRTmFtZSgiaHR0cDovL3NlcnZpY2VsaWZlY3ljbGUuc2FtcGxlIiwKLSAgICAgICAgICAgICAgICAibGVuZEJvb2siKSwgYXJncy50b0FycmF5KCksIG5ldyBDbGFzc1tde0Jvb2suY2xhc3N9KTsKLSAgICAgICAgQm9vayBib29rID0gKEJvb2spIG9ialswXTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUaXRsZSA6ICIgKyBib29rLmdldFRpdGxlKCkpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIklzYm4gOiAiICsgYm9vay5nZXRJc2JuKCkpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkF1dGhvciA6ICIgKyBib29rLmdldEF1dGhvcigpKTsKLQotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHJlZ2lzdGVyKFN0cmluZyB1c2VyTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGFzc1dvcmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUlBDU2VydmljZUNsaWVudCBycGNDbGllbnQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBycGNDbGllbnQuZ2V0T3B0aW9ucygpLnNldEFjdGlvbigidXJuOnJlZ2lzdGVyIik7Ci0gICAgICAgIEFycmF5TGlzdCBhcmdzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBhcmdzLmFkZCh1c2VyTmFtZSk7Ci0gICAgICAgIGFyZ3MuYWRkKHBhc3NXb3JkKTsKLSAgICAgICAgT2JqZWN0IG9iaiBbXSA9IHJwY0NsaWVudC5pbnZva2VCbG9ja2luZyhuZXcgUU5hbWUoImh0dHA6Ly9zZXJ2aWNlbGlmZWN5Y2xlLnNhbXBsZSIsCi0gICAgICAgICAgICAgICAgInJlZ2lzdGVyIiksIGFyZ3MudG9BcnJheSgpLCBuZXcgQ2xhc3NbXXtCb29sZWFuLmNsYXNzfSk7Ci0gICAgICAgIHJldHVybiAoKEJvb2xlYW4pIG9ialswXSkuYm9vbGVhblZhbHVlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gbG9naW4oU3RyaW5nIHVzZXJOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXNzV29yZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBSUENTZXJ2aWNlQ2xpZW50IHJwY0NsaWVudCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJwY0NsaWVudC5nZXRPcHRpb25zKCkuc2V0QWN0aW9uKCJ1cm46bG9naW4iKTsKLSAgICAgICAgQXJyYXlMaXN0IGFyZ3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGFyZ3MuYWRkKHVzZXJOYW1lKTsKLSAgICAgICAgYXJncy5hZGQocGFzc1dvcmQpOwotICAgICAgICBPYmplY3Qgb2JqIFtdID0gcnBjQ2xpZW50Lmludm9rZUJsb2NraW5nKG5ldyBRTmFtZSgiaHR0cDovL3NlcnZpY2VsaWZlY3ljbGUuc2FtcGxlIiwKLSAgICAgICAgICAgICAgICAibG9naW4iKSwgYXJncy50b0FycmF5KCksIG5ldyBDbGFzc1tde0Jvb2xlYW4uY2xhc3N9KTsKLSAgICAgICAgcmV0dXJuICgoQm9vbGVhbikgb2JqWzBdKS5ib29sZWFuVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBsaXN0QXZhaWxhYmxlQm9vayhSUENTZXJ2aWNlQ2xpZW50IHJwY0NsaWVudCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJwY0NsaWVudC5nZXRPcHRpb25zKCkuc2V0QWN0aW9uKCJ1cm46bGlzdEF2YWlsYWJsZUJvb2siKTsKLSAgICAgICAgT01FbGVtZW50IGVsZW1udCA9IHJwY0NsaWVudC5pbnZva2VCbG9ja2luZyhuZXcgUU5hbWUoImh0dHA6Ly9zZXJ2aWNlbGlmZWN5Y2xlLnNhbXBsZSIsCi0gICAgICAgICAgICAgICAgImxpc3RBdmFpbGFibGVCb29rIiksIG5ldyBPYmplY3RbXXtudWxsfSk7Ci0gICAgICAgIHByaW50Qm9va0RhdGEoZWxlbW50KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcHJpbnRCb29rRGF0YShPTUVsZW1lbnQgZWxlbWVudCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIEl0ZXJhdG9yIHZhbHVlcyA9IGVsZW1lbnQuZ2V0Q2hpbGRyZW5XaXRoTmFtZShuZXcgUU5hbWUoImh0dHA6Ly9zZXJ2aWNlbGlmZWN5Y2xlLnNhbXBsZSIsICJyZXR1cm4iKSk7Ci0gICAgICAgICAgICB3aGlsZSAodmFsdWVzLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSAoT01FbGVtZW50KSB2YWx1ZXMubmV4dCgpOwotICAgICAgICAgICAgICAgIEJvb2sgYm9vayA9IChCb29rKSBCZWFuVXRpbC5kZXNlcmlhbGl6ZShCb29rLmNsYXNzLCBvbUVsZW1lbnQsIG5ldyBEZWZhdWx0T2JqZWN0U3VwcGxpZXIoKSwgImJvb2siKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIklzYm4gOiAiICsgYm9vay5nZXRJc2JuKCkpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQXV0aG9yIDogIiArIGJvb2suZ2V0QXV0aG9yKCkpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGl0bGUgOiAiICsgYm9vay5nZXRUaXRsZSgpKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBsaXN0QWxsQm9vayhSUENTZXJ2aWNlQ2xpZW50IHJwY0NsaWVudCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJwY0NsaWVudC5nZXRPcHRpb25zKCkuc2V0QWN0aW9uKCJ1cm46bGlzdEFsbEJvb2siKTsKLSAgICAgICAgT01FbGVtZW50IGVsZW1udCA9IHJwY0NsaWVudC5pbnZva2VCbG9ja2luZyhuZXcgUU5hbWUoImh0dHA6Ly9zZXJ2aWNlbGlmZWN5Y2xlLnNhbXBsZSIsCi0gICAgICAgICAgICAgICAgImxpc3RBbGxCb29rIiksIG5ldyBPYmplY3RbXXtudWxsfSk7Ci0gICAgICAgIHByaW50Qm9va0RhdGEoZWxlbW50KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBsaXN0TGVuZEJvb2soUlBDU2VydmljZUNsaWVudCBycGNDbGllbnQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBycGNDbGllbnQuZ2V0T3B0aW9ucygpLnNldEFjdGlvbigidXJuOmxpc3RMZW5kQm9vayIpOwotICAgICAgICBPTUVsZW1lbnQgZWxlbW50ID0gcnBjQ2xpZW50Lmludm9rZUJsb2NraW5nKG5ldyBRTmFtZSgiaHR0cDovL3NlcnZpY2VsaWZlY3ljbGUuc2FtcGxlIiwKLSAgICAgICAgICAgICAgICAibGlzdExlbmRCb29rIiksIG5ldyBPYmplY3RbXXtudWxsfSk7Ci0gICAgICAgIHByaW50Qm9va0RhdGEoZWxlbW50KTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvc2VydmljZWxpZmVjeWNsZS9zcmMvc2FtcGxlL3NlcnZpY2VsaWZlY3ljbGUvTGlicmFyeUNvbnN0YW50cy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9zZXJ2aWNlbGlmZWN5Y2xlL3NyYy9zYW1wbGUvc2VydmljZWxpZmVjeWNsZS9MaWJyYXJ5Q29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjYTEwNzguLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9zZXJ2aWNlbGlmZWN5Y2xlL3NyYy9zYW1wbGUvc2VydmljZWxpZmVjeWNsZS9MaWJyYXJ5Q29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBzYW1wbGUuc2VydmljZWxpZmVjeWNsZTsKLQotcHVibGljIGludGVyZmFjZSBMaWJyYXJ5Q29uc3RhbnRzIHsKLSAgICBTdHJpbmcgQVZBSUxBQkxFX0JPT0sgPSAiYXZhaWxhYmxlQm9va3MiOwotICAgIFN0cmluZyBBTExfQk9PSyA9ICJhbGxCb29rcyI7Ci0gICAgU3RyaW5nIExFTkRfQk9PSyA9ICJsZW5kQm9va3MiOwotICAgIFN0cmluZyBVU0VSX0xJU1QgPSAidXNlcnMiOwotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9zZXJ2aWNlbGlmZWN5Y2xlL3NyYy9zYW1wbGUvc2VydmljZWxpZmVjeWNsZS9MaWJyYXJ5TGlmZUN5Y2xlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3NlcnZpY2VsaWZlY3ljbGUvc3JjL3NhbXBsZS9zZXJ2aWNlbGlmZWN5Y2xlL0xpYnJhcnlMaWZlQ3ljbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmYyNzk0ZC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3NlcnZpY2VsaWZlY3ljbGUvc3JjL3NhbXBsZS9zZXJ2aWNlbGlmZWN5Y2xlL0xpYnJhcnlMaWZlQ3ljbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBzYW1wbGUuc2VydmljZWxpZmVjeWNsZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmJ1aWxkZXIuU3RBWE9NQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLnV0aWwuU3RBWFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5QYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuRGVmYXVsdE9iamVjdFN1cHBsaWVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLlNlcnZpY2VMaWZlQ3ljbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgc2FtcGxlLnNlcnZpY2VsaWZlY3ljbGUuYmVhbi5Cb29rOwotaW1wb3J0IHNhbXBsZS5zZXJ2aWNlbGlmZWN5Y2xlLmJlYW4uQm9va0xpc3Q7Ci1pbXBvcnQgc2FtcGxlLnNlcnZpY2VsaWZlY3ljbGUuYmVhbi5Vc2VyOwotaW1wb3J0IHNhbXBsZS5zZXJ2aWNlbGlmZWN5Y2xlLmJlYW4uVXNlckxpc3Q7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5TGlmZUN5Y2xlIGltcGxlbWVudHMgU2VydmljZUxpZmVDeWNsZSB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKExpYnJhcnlMaWZlQ3ljbGUuY2xhc3MpOwotCi0gICAgcHVibGljIHZvaWQgc3RhcnRVcChDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdjdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICBBeGlzU2VydmljZSBzZXJ2aWNlKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTdHJpbmcgdGVtcERpciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5pby50bXBkaXIiKTsKLSAgICAgICAgICAgIEZpbGUgdGVtcEZpbGUgPSBuZXcgRmlsZSh0ZW1wRGlyKTsKLSAgICAgICAgICAgIEZpbGUgbGliRmlsZSA9IG5ldyBGaWxlKHRlbXBGaWxlLCAibGlicmFyeS54bWwiKTsKLSAgICAgICAgICAgIE9NRWxlbWVudCBsaWJyYXJ5RWxlbWVudDsKLSAgICAgICAgICAgIGJvb2xlYW4gbm9GaWxlID0gdHJ1ZTsKLSAgICAgICAgICAgIGlmICghbGliRmlsZS5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgIC8vU2VydmljZSBzdGFydGluZyBhdCB0aGUgZmlyc3QgdGltZSBvciB1c2VyIGhhcyBjbGVhbiB0aGUgdGVtcC5kaXIKLSAgICAgICAgICAgICAgICBQYXJhbWV0ZXIgYWxsQm9va3MgPSBzZXJ2aWNlLmdldFBhcmFtZXRlcihMaWJyYXJ5Q29uc3RhbnRzLkFMTF9CT09LKTsKLSAgICAgICAgICAgICAgICBsaWJyYXJ5RWxlbWVudCA9IGFsbEJvb2tzLmdldFBhcmFtZXRlckVsZW1lbnQoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGxpYkZpbGUpOwotICAgICAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPSBTdEFYVXRpbHMKLSAgICAgICAgICAgICAgICAgICAgICAgIC5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoaW4pOwotICAgICAgICAgICAgICAgIFN0QVhPTUJ1aWxkZXIgc3RheE9NQnVpbGRlciA9IG5ldyBTdEFYT01CdWlsZGVyKHhtbFJlYWRlcik7Ci0gICAgICAgICAgICAgICAgbGlicmFyeUVsZW1lbnQgPSBzdGF4T01CdWlsZGVyLmdldERvY3VtZW50RWxlbWVudCgpOwotICAgICAgICAgICAgICAgIG5vRmlsZSA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHJvY2Vzc09tZWxlbW50KGxpYnJhcnlFbGVtZW50LCBzZXJ2aWNlLCBub0ZpbGUpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICBsb2cuaW5mbyhleGNlcHRpb24pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2h1dERvd24oQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2UpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEJvb2tMaXN0IGF2YWlsYWJsZUJvb2tMaXN0ID0gKEJvb2tMaXN0KSBzZXJ2aWNlLmdldFBhcmFtZXRlclZhbHVlKExpYnJhcnlDb25zdGFudHMuQVZBSUxBQkxFX0JPT0spOwotICAgICAgICAgICAgQm9va0xpc3QgYWxsQm9va0xpc3QgPSAoQm9va0xpc3QpIHNlcnZpY2UuZ2V0UGFyYW1ldGVyVmFsdWUoTGlicmFyeUNvbnN0YW50cy5BTExfQk9PSyk7Ci0gICAgICAgICAgICBCb29rTGlzdCBsZW5kQm9va0xpc3QgPSAoQm9va0xpc3QpIHNlcnZpY2UuZ2V0UGFyYW1ldGVyVmFsdWUoTGlicmFyeUNvbnN0YW50cy5MRU5EX0JPT0spOwotICAgICAgICAgICAgVXNlckxpc3QgdXNlckxpc3QgPSAoVXNlckxpc3QpIHNlcnZpY2UuZ2V0UGFyYW1ldGVyVmFsdWUoTGlicmFyeUNvbnN0YW50cy5VU0VSX0xJU1QpOwotICAgICAgICAgICAgT01GYWN0b3J5IGZhYyA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpOwotICAgICAgICAgICAgT01FbGVtZW50IGxpYkVsZW1lbnQgPSBmYWMuY3JlYXRlT01FbGVtZW50KCJsaWJyYXJ5IiwgbnVsbCk7Ci0gICAgICAgICAgICBCb29rW10gYm9va0xpc3QgPSBhbGxCb29rTGlzdC5nZXRCb29rTGlzdCgpOwotICAgICAgICAgICAgbGliRWxlbWVudC5hZGRDaGlsZChCZWFuVXRpbC5nZXRPTUVsZW1lbnQoCi0gICAgICAgICAgICAgICAgICAgIG5ldyBRTmFtZShMaWJyYXJ5Q29uc3RhbnRzLkFMTF9CT09LKSwKLSAgICAgICAgICAgICAgICAgICAgYm9va0xpc3QsIG5ldyBRTmFtZSgiYm9vayIpLCBmYWxzZSwgbnVsbCkpOwotICAgICAgICAgICAgbGliRWxlbWVudC5hZGRDaGlsZChCZWFuVXRpbC5nZXRPTUVsZW1lbnQoCi0gICAgICAgICAgICAgICAgICAgIG5ldyBRTmFtZShMaWJyYXJ5Q29uc3RhbnRzLkFWQUlMQUJMRV9CT09LKSwKLSAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlQm9va0xpc3QuZ2V0Qm9va0xpc3QoKSwgbmV3IFFOYW1lKCJib29rIiksIGZhbHNlLCBudWxsKSk7Ci0gICAgICAgICAgICBsaWJFbGVtZW50LmFkZENoaWxkKEJlYW5VdGlsLmdldE9NRWxlbWVudCgKLSAgICAgICAgICAgICAgICAgICAgbmV3IFFOYW1lKExpYnJhcnlDb25zdGFudHMuTEVORF9CT09LKSwKLSAgICAgICAgICAgICAgICAgICAgbGVuZEJvb2tMaXN0LmdldEJvb2tMaXN0KCksIG5ldyBRTmFtZSgiYm9vayIpLCBmYWxzZSwgbnVsbCkpOwotCi0gICAgICAgICAgICBsaWJFbGVtZW50LmFkZENoaWxkKEJlYW5VdGlsLmdldE9NRWxlbWVudCgKLSAgICAgICAgICAgICAgICAgICAgbmV3IFFOYW1lKExpYnJhcnlDb25zdGFudHMuVVNFUl9MSVNUKSwKLSAgICAgICAgICAgICAgICAgICAgdXNlckxpc3QuZ2V0VXNlcnMoKSwgbmV3IFFOYW1lKCJ1c2VyIiksIGZhbHNlLCBudWxsKSk7Ci0KLSAgICAgICAgICAgIFN0cmluZyB0ZW1wRGlyID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmlvLnRtcGRpciIpOwotICAgICAgICAgICAgRmlsZSB0ZW1wRmlsZSA9IG5ldyBGaWxlKHRlbXBEaXIpOwotICAgICAgICAgICAgRmlsZSBsaWJGaWxlID0gbmV3IEZpbGUodGVtcEZpbGUsICJsaWJyYXJ5LnhtbCIpOwotICAgICAgICAgICAgT3V0cHV0U3RyZWFtIG91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGxpYkZpbGUpOwotICAgICAgICAgICAgbGliRWxlbWVudC5zZXJpYWxpemUob3V0KTsKLSAgICAgICAgICAgIG91dC5mbHVzaCgpOwotICAgICAgICAgICAgb3V0LmNsb3NlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBsb2cuaW5mbyhlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzT21lbGVtbnQoT01FbGVtZW50IGVsZW1lbnQsIEF4aXNTZXJ2aWNlIHNlcnZpY2UsIGJvb2xlYW4gZmlsZUZvdW5kKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgQm9va0xpc3QgYWxsQm9va0xpc3QgPSBuZXcgQm9va0xpc3QoTGlicmFyeUNvbnN0YW50cy5BTExfQk9PSyk7Ci0gICAgICAgIE9NRWxlbWVudCBib29rRWxlID0gZWxlbWVudC5nZXRGaXJzdENoaWxkV2l0aE5hbWUobmV3IFFOYW1lKExpYnJhcnlDb25zdGFudHMuQUxMX0JPT0spKTsKLSAgICAgICAgSXRlcmF0b3IgYm9va19pdHIgPSBib29rRWxlLmdldENoaWxkcmVuKCk7Ci0gICAgICAgIHdoaWxlIChib29rX2l0ci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIE9iamVjdCBvYmogPSBib29rX2l0ci5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgT01FbGVtZW50KSB7Ci0gICAgICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IChPTUVsZW1lbnQpIG9iajsKLSAgICAgICAgICAgICAgICBhbGxCb29rTGlzdC5hZGRCb29rKChCb29rKSBCZWFuVXRpbC5kZXNlcmlhbGl6ZShCb29rLmNsYXNzLCBvbUVsZW1lbnQsIG5ldyBEZWZhdWx0T2JqZWN0U3VwcGxpZXIoKSwgImJvb2siKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBCb29rTGlzdCBhdmFpbGFibGVCb29rTGlzdCA9IG5ldyBCb29rTGlzdChMaWJyYXJ5Q29uc3RhbnRzLkFWQUlMQUJMRV9CT09LKTsKLSAgICAgICAgT01FbGVtZW50IGF2YWxpYWJsZUJvb2tzRWxlID0KLSAgICAgICAgICAgICAgICBlbGVtZW50LmdldEZpcnN0Q2hpbGRXaXRoTmFtZShuZXcgUU5hbWUoTGlicmFyeUNvbnN0YW50cy5BVkFJTEFCTEVfQk9PSykpOwotICAgICAgICBpZiAoYXZhbGlhYmxlQm9va3NFbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgSXRlcmF0b3IgYXZhaWxhYmxlX2Jvb2tfaXRyID0gYXZhbGlhYmxlQm9va3NFbGUuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgICAgICAgIHdoaWxlIChhdmFpbGFibGVfYm9va19pdHIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IG9iaiA9IGF2YWlsYWJsZV9ib29rX2l0ci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIE9NRWxlbWVudCkgewotICAgICAgICAgICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gKE9NRWxlbWVudCkgb2JqOwotICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVCb29rTGlzdC5hZGRCb29rKChCb29rKSBCZWFuVXRpbC5kZXNlcmlhbGl6ZShCb29rLmNsYXNzLCBvbUVsZW1lbnQsIG5ldyBEZWZhdWx0T2JqZWN0U3VwcGxpZXIoKSwgImJvb2siKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotCi0gICAgICAgIEJvb2tMaXN0IGxlbmRCb29rTGlzdCA9IG5ldyBCb29rTGlzdChMaWJyYXJ5Q29uc3RhbnRzLkxFTkRfQk9PSyk7Ci0gICAgICAgIE9NRWxlbWVudCBsZW5kQm9va3NFbGUgPQotICAgICAgICAgICAgICAgIGVsZW1lbnQuZ2V0Rmlyc3RDaGlsZFdpdGhOYW1lKG5ldyBRTmFtZShMaWJyYXJ5Q29uc3RhbnRzLkxFTkRfQk9PSykpOwotICAgICAgICBpZiAobGVuZEJvb2tzRWxlICE9IG51bGwpIHsKLSAgICAgICAgICAgIEl0ZXJhdG9yIGxlbmRfYm9va19pdHIgPSBsZW5kQm9va3NFbGUuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgICAgICAgIHdoaWxlIChsZW5kX2Jvb2tfaXRyLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIE9iamVjdCBvYmogPSBsZW5kX2Jvb2tfaXRyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgT01FbGVtZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSAoT01FbGVtZW50KSBvYmo7Ci0gICAgICAgICAgICAgICAgICAgIGxlbmRCb29rTGlzdC5hZGRCb29rKChCb29rKSBCZWFuVXRpbC5kZXNlcmlhbGl6ZShCb29rLmNsYXNzLCBvbUVsZW1lbnQsIG5ldyBEZWZhdWx0T2JqZWN0U3VwcGxpZXIoKSwgImJvb2siKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIFVzZXJMaXN0IHVzZXJzID0gbmV3IFVzZXJMaXN0KCk7Ci0gICAgICAgIE9NRWxlbWVudCB1c2Vyc0VsZSA9Ci0gICAgICAgICAgICAgICAgZWxlbWVudC5nZXRGaXJzdENoaWxkV2l0aE5hbWUobmV3IFFOYW1lKExpYnJhcnlDb25zdGFudHMuVVNFUl9MSVNUKSk7Ci0gICAgICAgIGlmICh1c2Vyc0VsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBJdGVyYXRvciB1c3JlX2l0ciA9IHVzZXJzRWxlLmdldENoaWxkcmVuKCk7Ci0gICAgICAgICAgICB3aGlsZSAodXNyZV9pdHIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IG9iaiA9IHVzcmVfaXRyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgT01FbGVtZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSAoT01FbGVtZW50KSBvYmo7Ci0gICAgICAgICAgICAgICAgICAgIHVzZXJzLmFkZFVzZXIoKFVzZXIpIEJlYW5VdGlsLmRlc2VyaWFsaXplKFVzZXIuY2xhc3MsIG9tRWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRGVmYXVsdE9iamVjdFN1cHBsaWVyKCksICJ1c2VyIikpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChmaWxlRm91bmQpIHsKLSAgICAgICAgICAgIGF2YWlsYWJsZUJvb2tMaXN0ID0gYWxsQm9va0xpc3QuY29weSgpOwotICAgICAgICAgICAgc2VydmljZS5hZGRQYXJhbWV0ZXIobmV3IFBhcmFtZXRlcihMaWJyYXJ5Q29uc3RhbnRzLkFWQUlMQUJMRV9CT09LLCBhdmFpbGFibGVCb29rTGlzdCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc2VydmljZS5hZGRQYXJhbWV0ZXIobmV3IFBhcmFtZXRlcihMaWJyYXJ5Q29uc3RhbnRzLkFWQUlMQUJMRV9CT09LLCBhdmFpbGFibGVCb29rTGlzdCkpOwotICAgICAgICB9Ci0KLQotICAgICAgICBzZXJ2aWNlLmFkZFBhcmFtZXRlcihuZXcgUGFyYW1ldGVyKExpYnJhcnlDb25zdGFudHMuQUxMX0JPT0ssIGFsbEJvb2tMaXN0KSk7Ci0gICAgICAgIHNlcnZpY2UuYWRkUGFyYW1ldGVyKG5ldyBQYXJhbWV0ZXIoTGlicmFyeUNvbnN0YW50cy5MRU5EX0JPT0ssIGxlbmRCb29rTGlzdCkpOwotICAgICAgICBzZXJ2aWNlLmFkZFBhcmFtZXRlcihuZXcgUGFyYW1ldGVyKExpYnJhcnlDb25zdGFudHMuVVNFUl9MSVNULCB1c2VycykpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvc2VydmljZWxpZmVjeWNsZS9zcmMvc2FtcGxlL3NlcnZpY2VsaWZlY3ljbGUvTGlicmFyeVNlcnZpY2UuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvc2VydmljZWxpZmVjeWNsZS9zcmMvc2FtcGxlL3NlcnZpY2VsaWZlY3ljbGUvTGlicmFyeVNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmEwYzZjYy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3NlcnZpY2VsaWZlY3ljbGUvc3JjL3NhbXBsZS9zZXJ2aWNlbGlmZWN5Y2xlL0xpYnJhcnlTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugc2FtcGxlLnNlcnZpY2VsaWZlY3ljbGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuU2VydmljZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlBhcmFtZXRlcjsKLQotaW1wb3J0IHNhbXBsZS5zZXJ2aWNlbGlmZWN5Y2xlLkxpYnJhcnlDb25zdGFudHM7Ci1pbXBvcnQgc2FtcGxlLnNlcnZpY2VsaWZlY3ljbGUuYmVhbi5Cb29rOwotaW1wb3J0IHNhbXBsZS5zZXJ2aWNlbGlmZWN5Y2xlLmJlYW4uQm9va0xpc3Q7Ci1pbXBvcnQgc2FtcGxlLnNlcnZpY2VsaWZlY3ljbGUuYmVhbi5Vc2VyOwotaW1wb3J0IHNhbXBsZS5zZXJ2aWNlbGlmZWN5Y2xlLmJlYW4uVXNlckxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5U2VydmljZSB7Ci0KLSAgICAvL1RvIHN0b3JlIGFsbCB0aGUgYXZhaWxhYmxlIGJvb2tzCi0gICAgcHJpdmF0ZSBCb29rTGlzdCBhdmFpbGFibGVCb29rTGlzdDsKLSAgICAvL3RvIGtlZXAgYWxsIHRoZSBib29rIGluIHRoZSBzeXN0ZW0KLSAgICBwcml2YXRlIEJvb2tMaXN0IGFsbEJvb2tMaXN0OwotICAgIC8vdG8ga2VlcCBhbGwgdGhlIGxlbmRlZCBib29rcwotICAgIHByaXZhdGUgQm9va0xpc3QgbGVuZEJvb2tMaXN0OwotICAgIC8vdG8ga2VlcCB0aGUgc3lzdGVtIHVzZXJzCi0gICAgcHJpdmF0ZSBVc2VyTGlzdCB1c2VyTGlzdDsKLQotCi0gICAgcHVibGljIEJvb2tbXSBsaXN0QXZhaWxhYmxlQm9vaygpIHsKLSAgICAgICAgcmV0dXJuIGF2YWlsYWJsZUJvb2tMaXN0LmdldEJvb2tMaXN0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIEJvb2tbXSBsaXN0QWxsQm9vaygpIHsKLSAgICAgICAgcmV0dXJuIGFsbEJvb2tMaXN0LmdldEJvb2tMaXN0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIEJvb2tbXSBsaXN0TGVuZEJvb2soKSB7Ci0gICAgICAgIHJldHVybiBsZW5kQm9va0xpc3QuZ2V0Qm9va0xpc3QoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQm9vayBsZW5kQm9vayhTdHJpbmcgaXNibiwgU3RyaW5nIHVzZXJOYW1lKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgaWYgKGlzTG9nZ2VkKHVzZXJOYW1lKSkgewotICAgICAgICAgICAgQm9vayBib29rID0gYXZhaWxhYmxlQm9va0xpc3QuZ2V0Qm9vayhpc2JuKTsKLSAgICAgICAgICAgIGlmIChib29rID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBib29rID0gbGVuZEJvb2tMaXN0LmdldEJvb2soaXNibik7Ci0gICAgICAgICAgICAgICAgaWYgKGJvb2sgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJTb21lb25lIGhhcyBib3Jyb3dlZCB0aGUgYm9vayIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJCb29rIGlzIG5vdCBhdmFpbGFibGUgZm9yIGxlbmRpbmciKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGF2YWlsYWJsZUJvb2tMaXN0LnJlbW92ZUJvb2soYm9vayk7Ci0gICAgICAgICAgICBsZW5kQm9va0xpc3QuYWRkQm9vayhib29rKTsKLSAgICAgICAgICAgIHJldHVybiBib29rOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiRmlyc3QgbG9nIGludG8gc3lzdGVtIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZXR1cm5Cb29rKFN0cmluZyBpc2JuKSB7Ci0gICAgICAgIEJvb2sgdGVtcEJvb2sgPSBhbGxCb29rTGlzdC5nZXRCb29rKGlzYm4pOwotICAgICAgICBhdmFpbGFibGVCb29rTGlzdC5hZGRCb29rKHRlbXBCb29rKTsKLSAgICAgICAgbGVuZEJvb2tMaXN0LnJlbW92ZUJvb2sodGVtcEJvb2spOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0xvZ2dlZChTdHJpbmcgdXNlck5hbWUpIHsKLSAgICAgICAgcmV0dXJuIHVzZXJMaXN0LmlzTG9nZ2VkKHVzZXJOYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiByZWdpc3RlcihTdHJpbmcgdXNlck5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhc3NXb3JkKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgdXNlckxpc3QuYWRkVXNlcihuZXcgVXNlcih1c2VyTmFtZSwgcGFzc1dvcmQpKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gbG9naW4oU3RyaW5nIHVzZXJOYW1lLCBTdHJpbmcgcGFzc1dvcmQpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICByZXR1cm4gdXNlckxpc3QubG9naW4odXNlck5hbWUsIHBhc3NXb3JkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXNzaW9uIHJlbGF0ZWQgbWV0aG9kcwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGluaXQoU2VydmljZUNvbnRleHQgc2VydmljZUNvbnRleHQpIHsKLSAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSA9IHNlcnZpY2VDb250ZXh0LmdldEF4aXNTZXJ2aWNlKCk7Ci0gICAgICAgIHRoaXMuYXZhaWxhYmxlQm9va0xpc3QgPSAoQm9va0xpc3QpIHNlcnZpY2UuZ2V0UGFyYW1ldGVyVmFsdWUoTGlicmFyeUNvbnN0YW50cy5BVkFJTEFCTEVfQk9PSyk7Ci0gICAgICAgIHRoaXMuYXZhaWxhYmxlQm9va0xpc3Quc2V0TGlzdE5hbWUoTGlicmFyeUNvbnN0YW50cy5BVkFJTEFCTEVfQk9PSyk7Ci0gICAgICAgIHRoaXMuYWxsQm9va0xpc3QgPSAoQm9va0xpc3QpIHNlcnZpY2UuZ2V0UGFyYW1ldGVyVmFsdWUoTGlicmFyeUNvbnN0YW50cy5BTExfQk9PSyk7Ci0gICAgICAgIHRoaXMubGVuZEJvb2tMaXN0ID0gKEJvb2tMaXN0KSBzZXJ2aWNlLmdldFBhcmFtZXRlclZhbHVlKExpYnJhcnlDb25zdGFudHMuTEVORF9CT09LKTsKLSAgICAgICAgdGhpcy51c2VyTGlzdCA9IChVc2VyTGlzdCkgc2VydmljZS5nZXRQYXJhbWV0ZXJWYWx1ZShMaWJyYXJ5Q29uc3RhbnRzLlVTRVJfTElTVCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGVzdHJveShTZXJ2aWNlQ29udGV4dCBzZXJ2aWNlQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2UgPSBzZXJ2aWNlQ29udGV4dC5nZXRBeGlzU2VydmljZSgpOwotICAgICAgICBzZXJ2aWNlLmFkZFBhcmFtZXRlcihuZXcgUGFyYW1ldGVyKExpYnJhcnlDb25zdGFudHMuQVZBSUxBQkxFX0JPT0ssIGF2YWlsYWJsZUJvb2tMaXN0KSk7Ci0gICAgICAgIHNlcnZpY2UuYWRkUGFyYW1ldGVyKG5ldyBQYXJhbWV0ZXIoTGlicmFyeUNvbnN0YW50cy5BTExfQk9PSywgYWxsQm9va0xpc3QpKTsKLSAgICAgICAgc2VydmljZS5hZGRQYXJhbWV0ZXIobmV3IFBhcmFtZXRlcihMaWJyYXJ5Q29uc3RhbnRzLkxFTkRfQk9PSywgbGVuZEJvb2tMaXN0KSk7Ci0gICAgICAgIHNlcnZpY2UuYWRkUGFyYW1ldGVyKG5ldyBQYXJhbWV0ZXIoTGlicmFyeUNvbnN0YW50cy5VU0VSX0xJU1QsIHVzZXJMaXN0KSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9zZXJ2aWNlbGlmZWN5Y2xlL3NyYy9zYW1wbGUvc2VydmljZWxpZmVjeWNsZS9Vc2Vyc1NlcnZpY2UuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvc2VydmljZWxpZmVjeWNsZS9zcmMvc2FtcGxlL3NlcnZpY2VsaWZlY3ljbGUvVXNlcnNTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0NDk1ZTEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9zZXJ2aWNlbGlmZWN5Y2xlL3NyYy9zYW1wbGUvc2VydmljZWxpZmVjeWNsZS9Vc2Vyc1NlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIHNhbXBsZS5zZXJ2aWNlbGlmZWN5Y2xlOwotCi1wdWJsaWMgY2xhc3MgVXNlcnNTZXJ2aWNlIHsKLQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3NlcnZpY2VsaWZlY3ljbGUvc3JjL3NhbXBsZS9zZXJ2aWNlbGlmZWN5Y2xlL2JlYW4vQm9vay5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9zZXJ2aWNlbGlmZWN5Y2xlL3NyYy9zYW1wbGUvc2VydmljZWxpZmVjeWNsZS9iZWFuL0Jvb2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGI4ZmE1OC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3NlcnZpY2VsaWZlY3ljbGUvc3JjL3NhbXBsZS9zZXJ2aWNlbGlmZWN5Y2xlL2JlYW4vQm9vay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugc2FtcGxlLnNlcnZpY2VsaWZlY3ljbGUuYmVhbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgQm9vayB7Ci0KLSAgICBwcml2YXRlIFN0cmluZyB0aXRsZTsKLSAgICBwcml2YXRlIFN0cmluZyBhdXRob3I7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgaXNibjsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGl0bGUoKSB7Ci0gICAgICAgIHJldHVybiB0aXRsZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRUaXRsZShTdHJpbmcgdGl0bGUpIHsKLSAgICAgICAgdGhpcy50aXRsZSA9IHRpdGxlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXV0aG9yKCkgewotICAgICAgICByZXR1cm4gYXV0aG9yOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEF1dGhvcihTdHJpbmcgYXV0aG9yKSB7Ci0gICAgICAgIHRoaXMuYXV0aG9yID0gYXV0aG9yOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SXNibigpIHsKLSAgICAgICAgcmV0dXJuIGlzYm47Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SXNibihTdHJpbmcgaXNibikgewotICAgICAgICB0aGlzLmlzYm4gPSBpc2JuOwotICAgIH0KLQotICAgIHB1YmxpYyBPTUVsZW1lbnQgc2VyaWFsaXplKE9NRmFjdG9yeSBmYWMpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9zZXJ2aWNlbGlmZWN5Y2xlL3NyYy9zYW1wbGUvc2VydmljZWxpZmVjeWNsZS9iZWFuL0Jvb2tMaXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3NlcnZpY2VsaWZlY3ljbGUvc3JjL3NhbXBsZS9zZXJ2aWNlbGlmZWN5Y2xlL2JlYW4vQm9va0xpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA5M2E4NC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3NlcnZpY2VsaWZlY3ljbGUvc3JjL3NhbXBsZS9zZXJ2aWNlbGlmZWN5Y2xlL2JlYW4vQm9va0xpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIHNhbXBsZS5zZXJ2aWNlbGlmZWN5Y2xlLmJlYW47Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIEJvb2tMaXN0IHsKLQotICAgIHByaXZhdGUgSGFzaE1hcCBib29rVGFibGU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbGlzdE5hbWU7Ci0KLSAgICBwdWJsaWMgQm9va0xpc3QoU3RyaW5nIGxpc3ROYW1lKSB7Ci0gICAgICAgIHRoaXMuYm9va1RhYmxlID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgdGhpcy5saXN0TmFtZSA9IGxpc3ROYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZEJvb2soQm9vayBib29rKSB7Ci0gICAgICAgIGJvb2tUYWJsZS5wdXQoYm9vay5nZXRJc2JuKCkudHJpbSgpLCBib29rKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQm9vayBnZXRCb29rKFN0cmluZyBpc2JuKSB7Ci0gICAgICAgIHJldHVybiAoQm9vaykgYm9va1RhYmxlLmdldChpc2JuLnRyaW0oKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlQm9vayhCb29rIGJvb2spIHsKLSAgICAgICAgYm9va1RhYmxlLnJlbW92ZShib29rLmdldElzYm4oKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlQm9vayhTdHJpbmcgaXNibikgewotICAgICAgICBib29rVGFibGUucmVtb3ZlKGlzYm4pOwotICAgIH0KLQotICAgIHB1YmxpYyBIYXNoTWFwIGdldEJvb2tUYWJsZSgpIHsKLSAgICAgICAgcmV0dXJuIGJvb2tUYWJsZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRCb29rVGFibGUoSGFzaE1hcCBib29rVGFibGUpIHsKLSAgICAgICAgdGhpcy5ib29rVGFibGUgPSBib29rVGFibGU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRMaXN0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGxpc3ROYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldExpc3ROYW1lKFN0cmluZyBsaXN0TmFtZSkgewotICAgICAgICB0aGlzLmxpc3ROYW1lID0gbGlzdE5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIE9NRWxlbWVudCBzZXJpYWxpemUoT01GYWN0b3J5IGZhYykgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQm9va1tdIGdldEJvb2tMaXN0KCkgewotICAgICAgICBCb29rIFtdIGJvb2tzID0gbmV3IEJvb2tbYm9va1RhYmxlLnNpemUoKV07Ci0gICAgICAgIEl0ZXJhdG9yIGJvb2tzX2l0ciA9IGJvb2tUYWJsZS52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgICAgICBpbnQgY291bnQgPSAwOwotICAgICAgICB3aGlsZSAoYm9va3NfaXRyLmhhc05leHQoKSkgewotICAgICAgICAgICAgYm9va3NbY291bnRdID0gKEJvb2spIGJvb2tzX2l0ci5uZXh0KCk7Ci0gICAgICAgICAgICBjb3VudCArKzsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYm9va3M7Ci0gICAgfQotCi0gICAgcHVibGljIEJvb2tMaXN0IGNvcHkoKSB7Ci0gICAgICAgIEJvb2tMaXN0IGJvb2tzID0gbmV3IEJvb2tMaXN0KGdldExpc3ROYW1lKCkpOwotICAgICAgICBCb29rIFtdIGFsbEJvb2tzID0gZ2V0Qm9va0xpc3QoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxCb29rcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgQm9vayBhbGxCb29rID0gYWxsQm9va3NbaV07Ci0gICAgICAgICAgICBCb29rIGJvb2sgPSBuZXcgQm9vaygpOwotICAgICAgICAgICAgYm9vay5zZXRBdXRob3IoYWxsQm9vay5nZXRBdXRob3IoKSk7Ci0gICAgICAgICAgICBib29rLnNldElzYm4oYWxsQm9vay5nZXRJc2JuKCkpOwotICAgICAgICAgICAgYm9vay5zZXRUaXRsZShhbGxCb29rLmdldFRpdGxlKCkpOwotICAgICAgICAgICAgYm9va3MuYWRkQm9vayhib29rKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYm9va3M7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9zZXJ2aWNlbGlmZWN5Y2xlL3NyYy9zYW1wbGUvc2VydmljZWxpZmVjeWNsZS9iZWFuL1VzZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvc2VydmljZWxpZmVjeWNsZS9zcmMvc2FtcGxlL3NlcnZpY2VsaWZlY3ljbGUvYmVhbi9Vc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxMmVlZmEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9zZXJ2aWNlbGlmZWN5Y2xlL3NyYy9zYW1wbGUvc2VydmljZWxpZmVjeWNsZS9iZWFuL1VzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIHNhbXBsZS5zZXJ2aWNlbGlmZWN5Y2xlLmJlYW47Ci0KLXB1YmxpYyBjbGFzcyBVc2VyIHsKLSAgICBwcml2YXRlIFN0cmluZyB1c2VyTmFtZTsKLSAgICBwcml2YXRlIFN0cmluZyBwYXNzV29yZDsKLQotICAgIHB1YmxpYyBVc2VyKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBVc2VyKFN0cmluZyB1c2VyTmFtZSwgU3RyaW5nIHBhc3NXb3JkKSB7Ci0gICAgICAgIHRoaXMudXNlck5hbWUgPSB1c2VyTmFtZTsKLSAgICAgICAgdGhpcy5wYXNzV29yZCA9IHBhc3NXb3JkOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFzc1dvcmQoKSB7Ci0gICAgICAgIHJldHVybiBwYXNzV29yZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXNzV29yZChTdHJpbmcgcGFzc1dvcmQpIHsKLSAgICAgICAgdGhpcy5wYXNzV29yZCA9IHBhc3NXb3JkOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXNlck5hbWUoKSB7Ci0gICAgICAgIHJldHVybiB1c2VyTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRVc2VyTmFtZShTdHJpbmcgdXNlck5hbWUpIHsKLSAgICAgICAgdGhpcy51c2VyTmFtZSA9IHVzZXJOYW1lOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9zZXJ2aWNlbGlmZWN5Y2xlL3NyYy9zYW1wbGUvc2VydmljZWxpZmVjeWNsZS9iZWFuL1VzZXJMaXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3NlcnZpY2VsaWZlY3ljbGUvc3JjL3NhbXBsZS9zZXJ2aWNlbGlmZWN5Y2xlL2JlYW4vVXNlckxpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTIxYjJjMy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3NlcnZpY2VsaWZlY3ljbGUvc3JjL3NhbXBsZS9zZXJ2aWNlbGlmZWN5Y2xlL2JlYW4vVXNlckxpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIHNhbXBsZS5zZXJ2aWNlbGlmZWN5Y2xlLmJlYW47Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIFVzZXJMaXN0IHsKLSAgICBwcml2YXRlIEhhc2hNYXAgdXNlckxpc3Q7Ci0gICAgcHJpdmF0ZSBIYXNoTWFwIGxvZ2dlZFVzZXJzOwotCi0gICAgcHVibGljIFVzZXJMaXN0KCkgewotICAgICAgICB0aGlzLnVzZXJMaXN0ID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgbG9nZ2VkVXNlcnMgPSBuZXcgSGFzaE1hcCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFVzZXIoVXNlciB1c2VyKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgaWYgKHVzZXJMaXN0LmdldCh1c2VyLmdldFVzZXJOYW1lKCkudHJpbSgpKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJVc2VyIGhhcyBhbHJlYWR5IHJlZ2lzdGVyZWQuIik7Ci0gICAgICAgIH0KLSAgICAgICAgdXNlckxpc3QucHV0KHVzZXIuZ2V0VXNlck5hbWUoKSwgdXNlcik7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gbG9naW4oU3RyaW5nIHVzZXJOYW1lLCBTdHJpbmcgcGFzc1dvcmQpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBVc2VyIHVzZXIgPSAoVXNlcikgdXNlckxpc3QuZ2V0KHVzZXJOYW1lLnRyaW0oKSk7Ci0gICAgICAgIGlmICh1c2VyID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoInVzZXIgaGFzIG5vdCByZWdpc3RlcmQiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAodXNlci5nZXRQYXNzV29yZCgpLmVxdWFscyhwYXNzV29yZCkpIHsKLSAgICAgICAgICAgIGxvZ2dlZFVzZXJzLnB1dCh1c2VyTmFtZSwgdXNlcik7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoIkludmFsaWQgdXNlciAsIHBhc3Mgb3dyZCBpbmNvcnJlY3QiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzTG9nZ2VkKFN0cmluZyB1c2VyTmFtZSkgewotICAgICAgICBVc2VyIHVzZXIgPSAoVXNlcikgbG9nZ2VkVXNlcnMuZ2V0KHVzZXJOYW1lLnRyaW0oKSk7Ci0gICAgICAgIHJldHVybiB1c2VyICE9IG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIFVzZXJbXSBnZXRVc2VycygpIHsKLSAgICAgICAgVXNlciBbXSB1c2VycyA9IG5ldyBVc2VyW3VzZXJMaXN0LnNpemUoKV07Ci0gICAgICAgIEl0ZXJhdG9yIHVzZXJzX2l0ciA9IHVzZXJMaXN0LnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgICAgIGludCBjb3VudCA9IDA7Ci0gICAgICAgIHdoaWxlICh1c2Vyc19pdHIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICB1c2Vyc1tjb3VudF0gPSAoVXNlcikgdXNlcnNfaXRyLm5leHQoKTsKLSAgICAgICAgICAgIGNvdW50ICsrOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB1c2VyczsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3NvYXB3aXRoYXR0YWNobWVudHMvUkVBRE1FLnR4dCBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvc29hcHdpdGhhdHRhY2htZW50cy9SRUFETUUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTRiOGE2Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvc29hcHdpdGhhdHRhY2htZW50cy9SRUFETUUudHh0CisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotU2FtcGxlOiBTT0FQIHdpdGggQXR0YWNobWVudHMNCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLQ0KLUludHJvZHVjdGlvbg0KLT09PT09PT09PT09PQ0KLVRoaXMgc2FtcGxlIGRlbW9uc3RyYXRlcyB0aGUgY2FwYWJpbGl0aWVzIGFuZCBwb3dlciBvZiBTT0FQIHdpdGggQXR0YWNobWVudCBzdXBwb3J0IGFuZCB0aGUNCi1BdHRhY2htZW50IEFQSSBvZiBBWElTMi4gTW9yZSBpbmZvcm1hdGlvbiBhYm91dCBBeGlzMiBhdHRhY2htZW50IGltcGxlbWVudGF0aW9uIGNhbiBiZSBmb3VuZCBhdCANCi1odHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi8xXzEvbXRvbS1ndWlkZS5odG1sLiANCi0NCi1UaGlzIHNhbXBsZSBpbmNsdWRlcyBhIHNlcnZpY2UgYW5kIGEgY2xpZW50IHdoaWNoIGNhbiBiZSB1c2VkIHRvIHVwbG9hZCBhIGZpbGUgdG8gdGhlIHNlcnZlciB1c2luZyANCi1TT0FQIG1lc3NhZ2UgY29udGFpbmluZyBhIFNPQVAgd2l0aCBBdHRhY2htZW50IHR5cGUgYmluYXJ5IGF0dGFjaG1lbnQuIFRoZSBzZXJ2aWNlIGlzIHdyaXR0ZW4gYW5kIA0KLWRlcGxveWVkIHVzaW5nIHRoZSBSQ1BNZXNzYWdlUmVjZWl2ZXIgYW5kIGEgUE9KTyhQbGFpbiBPbGQgSmF2YSBPYmplY3QpLiBUaGUgUE9KTyBzZXJ2aWNlIGNsYXNzIHVzZXMgDQotdGhlIEF0dGFjaG1lbnQgQVBJIG9mIHRoZSBNZXNzYWdlQ29udGV4dCB0byByZXRyaWV2ZSB0aGUgcmVjZWl2ZWQgYXR0YWNobWVudC5UaGUgY2xpZW50IHByb2dyYW0gaXMgDQotd3JpdHRlbiB1c2luZyB0aGUgT3BlcmF0aW9uQ2xpZW50IEFQSSBvZiBBeGlzMiB0b2dldGhlciB3aXRoIHRoZSBBdHRhY2htZW50IEFQSSBvZiBNZXNzYWdlQ29udGV4dC4NCi0NCi0NCi1PYmplY3RpdmVzDQotPT09PT09PT09PQ0KLQ0KLSAqIFdyaXRpbmcgYSBQT0pPIChQbGFpbiBPbGQgSmF2YSBPYmplY3QpIGJhc2VkIHNlcnZpY2UgdG8gYWNjZXNzIGF0dGFjaG1lbnRzLg0KLSAqIEltcGxlbWVudCBhIEF4aXMyIE9wZXJhdGlvbkNsaWVudCBiYXNlZCBXZWIgU2VydmljZSBjbGllbnQgdG8gaW52b2tlIHRoZSBzZXJ2aWNlIHdpdGggU09BUCANCi0gICB3aXRoIEF0dGFjaG1lbnQgdHlwZSBhdHRhY2htZW50cy4NCi0gKiBJbnZva2UgdGhlIGRlcGxveWVkIHNlcnZpY2UuDQotDQotUHJlcmVxdWlzaXRlcw0KLT09PT09PT09PT09PT0NCi1JbnN0YWxsIEFwYWNoZSBBbnQgMS42LjIgb3IgbGF0ZXINCi0NCi0NCi1SdW5uaW5nIHRoZSBTYW1wbGU6DQotPT09PT09PT09PT09PT09PT09PQ0KLVRoZSBmaWxlcyBiZWxvbmdpbmcgdG8gdGhpcyBzYW1wbGUgYXJlIGNvbnRhaW5lZCBpbiB0aGUgc2FtcGxlcy9zb2Fwd2l0aGF0dGFjaG1lbnRzIGZvbGRlciBvZiB0aGUgDQotZXh0cmFjdGVkIEF4aXMyIGJpbmFyeSBkaXN0cmlidXRpb24sIHdoaWNoIHdpbGwgYmUgY2FsbGVkIGhlcmUgYWZ0ZXIgYXMgU1dBX1NBTVBMRV9ESVIuIFRoZSANCi1sb2NhdGlvbiBvZiB0aGUgZXh0cmFjdGVkIGJpbmFyeSBkaXN0cmlidXRpb24gd2lsbCBiZSByZWZlcmVkIGFzIEFYSVMyX0RJU1QuIFRoZXJlIGlzIGEgDQotImJ1aWxkLnhtbCIgQW50IHNjcmlwdCBpbiB0aGUgU1dBX1NBTVBMRV9ESVIgdGhhdCBjb250YWlucyBidWlsZCB0YXJnZXRzIGZvciBidWlsZGluZyB0aGUgc2VydmljZSANCi1hcmNoaXZlIGFuZCBydW5uaW5nIHRoZSBjbGllbnQgYXBwbGljYXRpb24gLSBhbGwgZGVzY3JpYmVkIGluIHN0ZXBzIGJlbG93LiANCi0NCi0xLiBHZW5lcmF0ZSB0aGUgc2VydmljZQ0KLVVzZSAiYW50IGdlbmVyYXRlLnNlcnZpY2UiIGNvbW1hbmQgaW4gdGhlIFNXQV9TQU1QTEVfRElSIHRvIGJ1aWxkIHRoZSBzZXJ2aWNlLiBHZW5lcmF0ZWQgc2VydmljZSANCi13aWxsIGF1dG9tYXRpY2FsbHkgZ2V0cyBjb3BpZWQgaW4gdG8gdGhlIEFYSVMyX0RJU1QvcmVwb3NpdG9yeS9zZXJ2aWNlcyBkaXJlY3RvcnkuIFNvdXJjZSBmaWxlIA0KLXJhbGF0aW5nIHRvIHRoaXMgc2VydmljZSBjYW4gYmUgZm91bmQgYXQgDQotU1dBX1NBTVBMRV9ESVIvc3JjL3NhbXBsZS9zb2Fwd2l0aGF0dGFjaG1lbnRzL3NlcnZpY2UvQXR0YWNobWVudFNlcnZpY2UuamF2YS4gVGhlIHNlcnZpY2VzLnhtbCB1c2VkDQotd2hlbiBidWlsZGluZyB0aGlzIHNlcnZpY2UgY2FuIGJlIGZvdW5kIGF0IFNXQV9TQU1QTEVfRElSL3Jlc291cmNlcyBkaXJlY3RvcnkuIA0KLQ0KLTIuIERlcGxveSB0aGUgc2VydmljZQ0KLVJ1biB0aGUgQVhJUzJfRElTVC9iaW4vYXhpczJzZXJ2ZXIue3NoLmJhdH0gc2NyaXB0IHRvIHN0YXJ0IHRoZSBzdGFuZGFsb25lIGF4aXMyIHNlcnZlci4gVGhpcyBzZXJ2ZXIgDQotd2lsbCBkZXBsb3kgYWxsIHRoZSBzcnZpY2VzIGF2YWlsYWJsZSBhdCBBWElTMl9ESVNUL3JlcG9zaXRvcnkvc2VydmljZXMgZGlyZWN0b3J5LiBBbHRlcm5hdGl2ZWx5IHlvdQ0KLWNhbiBkcm9wIHRoZSBzYW1wbGUtc3dhLmFhciBzZXJ2aWNlIGFyY2hpdmUgdG8gdGhlIHNlcnZpY2VzIGRpcmVjdG9yeSBvZiBhIHJ1bm5pbmcgQXhpczIgc2VydmxldCkNCi0NCi0zLiBSdW5uaW5nIHRoZSBjbGllbnQNCi1Vc2UgImFudCBydW4uY2xpZW50IC1EZmlsZSA8ZmlsZSB0byBiZSBzZW5kPiAtRGRlc3QgPGRlc3RpbmF0aW9uIGZpbGUgbmFtZT4iIGNvbW1hbmQgaW4gdGhlIA0KLVNXQV9TQU1QTEVfRElSIHRvIGJ1aWxkIGFuZCBydW4gdGhlIGNsaWVudC4gU291cmNlIGZpbGUgcmFsYXRpbmcgdG8gdGhlIGNsaWVudCBjYW4gYmUgZm91bmQgYXQgDQotU1dBX1NBTVBMRV9ESVIvc3JjL3NhbXBsZS9zb2Fwd2l0aGF0dGFjaG1lbnRzL2NsaWVudC9TV0FDbGllbnQuamF2YS4NCi0NCi1IZWxwDQotPT09PQ0KLVBsZWFzZSBjb250YWN0IGF4aXMtdXNlciBsaXN0IChheGlzLXVzZXJAd3MuYXBhY2hlLm9yZykgaWYgeW91IGhhdmUgYW55IHRyb3VibGUgcnVubmluZyB0aGUgc2FtcGxlLg0KLQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvc29hcHdpdGhhdHRhY2htZW50cy9idWlsZC54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3NvYXB3aXRoYXR0YWNobWVudHMvYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGZlYzQwLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvc29hcHdpdGhhdHRhY2htZW50cy9idWlsZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxwcm9qZWN0IG5hbWU9IlNPQVBXaXRoQXR0YWNobWVudHNTYW1wbGUiIGRlZmF1bHQ9ImdlbmVyYXRlLnNlcnZpY2UiPgotCTxwcm9wZXJ0eSBlbnZpcm9ubWVudD0iZW52IiAvPgotCTxwcm9wZXJ0eSBuYW1lPSJheGlzMi5ob21lIiB2YWx1ZT0iLi4vLi4vIiAvPgotCTxwcm9wZXJ0eSBuYW1lPSJheGlzMi5yZXBvIiB2YWx1ZT0iJHtheGlzMi5ob21lfS9yZXBvc2l0b3J5IiAvPgotCTxwcm9wZXJ0eSBuYW1lPSJidWlsZC5kaXIiIHZhbHVlPSJidWlsZCIgLz4KLQk8cHJvcGVydHkgbmFtZT0iY2xpZW50LmNsYXNzZXMuZGlyIiB2YWx1ZT0iJHtidWlsZC5kaXJ9L2NsYXNzZXMiIC8+Ci0JPHBhdGggaWQ9ImF4aXMuY2xhc3NwYXRoIj4KLQkJPGZpbGVzZXQgZGlyPSIke2F4aXMyLmhvbWV9L2xpYiI+Ci0JCQk8aW5jbHVkZSBuYW1lPSIqLmphciIgLz4KLQkJPC9maWxlc2V0PgotCQk8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL3N3YVNhbXBsZUNsaWVudC5qYXIiIC8+Ci0JPC9wYXRoPgotCi0JPHRhcmdldCBuYW1lPSJnZW5lcmF0ZS5zZXJ2aWNlIiBkZXBlbmRzPSJjb21waWxlIj4KLQkJPGphciBkZXN0ZmlsZT0iJHtidWlsZC5kaXJ9L3NhbXBsZS1zd2EuYWFyIj4JCi0JCQk8ZmlsZXNldCBkaXI9InJlc291cmNlcy8iPgotCQkJCTxpbmNsdWRlIG5hbWU9Ik1FVEEtSU5GL3NlcnZpY2VzLnhtbCIgLz4KLQkJCTwvZmlsZXNldD4KLQkJCTxmaWxlc2V0IGRpcj0iJHtidWlsZC5kaXJ9L2NsYXNzZXMiPgotCQkJCTxpbmNsdWRlIG5hbWU9InNhbXBsZS9zb2Fwd2l0aGF0dGFjaG1lbnRzL3NlcnZpY2UvKiovKi5jbGFzcyIgLz4KLQkJCTwvZmlsZXNldD4KLQkJPC9qYXI+Ci0JCTxjb3B5IGZpbGU9IiR7YnVpbGQuZGlyfS9zYW1wbGUtc3dhLmFhciIgdG9maWxlPSIke2F4aXMyLmhvbWV9L3JlcG9zaXRvcnkvc2VydmljZXMvc2FtcGxlLXN3YS5hYXIiIG92ZXJ3cml0ZT0idHJ1ZSIgLz4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0iY29tcGlsZSI+Ci0JCTxta2RpciBkaXI9IiR7Y2xpZW50LmNsYXNzZXMuZGlyfSIgLz4KLQkJPCEtLSBDb21waWxlIGNsaWVudCAtLT4KLQkJPGphdmFjIGRlYnVnPSJvbiIgIHNyY2Rpcj0ic3JjIiBkZXN0ZGlyPSIke2NsaWVudC5jbGFzc2VzLmRpcn0iPgotCQkJPGNsYXNzcGF0aCByZWZpZD0iYXhpcy5jbGFzc3BhdGgiIC8+Ci0JCTwvamF2YWM+Ci0JPC90YXJnZXQ+Ci0JPHRhcmdldCBuYW1lPSJjaGVjay1wYXJhbWV0ZXJzIj4KLQkJPGNvbmRpdGlvbiBwcm9wZXJ0eT0icGFyYW1ldGVycy5zZXQiPgotCQkJPGFuZD4KLQkJCQk8aXNzZXQgcHJvcGVydHk9ImRlc3QiIC8+Ci0JCQkJPGlzc2V0IHByb3BlcnR5PSJmaWxlIiAvPgotCQkJPC9hbmQ+Ci0JCTwvY29uZGl0aW9uPgotCQk8IS0tIFRoaXMgaXMgYSBoYWNrIHRvIGdldCBhIGlmLWVsc2Ugd29ya2luZyBpbiBhbnQuIFNvbWUgbXVjaCBtb3JlICJBTlR5IiBwZXJzb24gaXMgd2VsY29tZSB0byBpbXByb3ZlIHRoaXMgLS0+Ci0JCTxhbnRjYWxsIHRhcmdldD0icHJpbnQtdXNhZ2UiIC8+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9InByaW50LXVzYWdlIiB1bmxlc3M9InBhcmFtZXRlcnMuc2V0Ij4KLQkJPGVjaG8gbWVzc2FnZT0iYW50IC1EZmlsZSAmbHQ7ZmlsZSB0byBiZSB0cmFuc2ZlcmVkJmd0OyAgLURkZXN0ICZsdDtuYW1lIG9mIHRoZSBkZXN0aW5hdGlvbiBmaWxlJmd0OyIgLz4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0icnVuLmNsaWVudCIgZGVwZW5kcz0iY29tcGlsZSxjaGVjay1wYXJhbWV0ZXJzIiBpZj0icGFyYW1ldGVycy5zZXQiPgotCQk8amFyIGRlc3RmaWxlPSIke2J1aWxkLmRpcn0vc3dhU2FtcGxlQ2xpZW50LmphciI+Ci0JCQk8ZmlsZXNldCBkaXI9IiR7YnVpbGQuZGlyfS9jbGFzc2VzIj4KLQkJCQk8aW5jbHVkZSBuYW1lPSJzYW1wbGUvc29hcHdpdGhhdHRhY2htZW50cy9jbGllbnQvKiovKi5jbGFzcyIgLz4KLQkJCTwvZmlsZXNldD4KLQkJPC9qYXI+Ci0JCTxqYXZhIGNsYXNzbmFtZT0ic2FtcGxlLnNvYXB3aXRoYXR0YWNobWVudHMuY2xpZW50LlNXQUNsaWVudCIgY2xhc3NwYXRocmVmPSJheGlzLmNsYXNzcGF0aCIgZm9yaz0idHJ1ZSI+Ci0JCQk8YXJnIHZhbHVlPSItZmlsZSIgLz4KLQkJCTxhcmcgdmFsdWU9IiR7ZmlsZX0iIC8+Ci0JCQk8YXJnIHZhbHVlPSItZGVzdCIgLz4KLQkJCTxhcmcgdmFsdWU9IiR7ZGVzdH0iIC8+Ci0JCQk8anZtYXJnIHZhbHVlPSItRGF4aXMyLnJlcG89JHtheGlzMi5yZXBvfSIgLz4KLQkJPC9qYXZhPgotCTwvdGFyZ2V0PgotCTx0YXJnZXQgbmFtZT0iY2xlYW4iPgotCQk8ZGVsZXRlIGRpcj0iYnVpbGQiIC8+Ci0JPC90YXJnZXQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3NvYXB3aXRoYXR0YWNobWVudHMvcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvc29hcHdpdGhhdHRhY2htZW50cy9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmZDVkNGJiLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvc29hcHdpdGhhdHRhY2htZW50cy9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08c2VydmljZSBuYW1lPSJTV0FTYW1wbGVTZXJ2aWNlIj4KLSAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgIFRoaXMgaXMgYSBzYW1wbGUgV2ViIFNlcnZpY2UgZm9yIGlsbHVzdHJhdGluZyBBdHRhY2htZW50cyBBUEkgb2YgQXhpczIKLSAgICA8L2Rlc2NyaXB0aW9uPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iU2VydmljZUNsYXNzIj5zYW1wbGUuc29hcHdpdGhhdHRhY2htZW50cy5zZXJ2aWNlLkF0dGFjaG1lbnRTZXJ2aWNlPC9wYXJhbWV0ZXI+Ci0gICAgPG9wZXJhdGlvbiBuYW1lPSJ1cGxvYWRGaWxlIj4KLSAgICAgICAgPGFjdGlvbk1hcHBpbmc+dXJuOnVwbG9hZEZpbGU8L2FjdGlvbk1hcHBpbmc+Ci0gICAgICAgIDxtZXNzYWdlUmVjZWl2ZXIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIucnBjLnJlY2VpdmVycy5SUENNZXNzYWdlUmVjZWl2ZXIiLz4KLSAgICA8L29wZXJhdGlvbj4KLTwvc2VydmljZT4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvc29hcHdpdGhhdHRhY2htZW50cy9zcmMvc2FtcGxlL3NvYXB3aXRoYXR0YWNobWVudHMvY2xpZW50L1NXQUNsaWVudC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9zb2Fwd2l0aGF0dGFjaG1lbnRzL3NyYy9zYW1wbGUvc29hcHdpdGhhdHRhY2htZW50cy9jbGllbnQvU1dBQ2xpZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZiMWU3NjEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy9zb2Fwd2l0aGF0dGFjaG1lbnRzL3NyYy9zYW1wbGUvc29hcHdpdGhhdHRhY2htZW50cy9jbGllbnQvU1dBQ2xpZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBzYW1wbGUuc29hcHdpdGhhdHRhY2htZW50cy5jbGllbnQ7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXI7Ci1pbXBvcnQgamF2YXguYWN0aXZhdGlvbi5GaWxlRGF0YVNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01UZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQMTFDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBCb2R5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5PcGVyYXRpb25DbGllbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuT3B0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5TZXJ2aWNlQ2xpZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuQ29tbWFuZExpbmVPcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLkNvbW1hbmRMaW5lT3B0aW9uUGFyc2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5PcHRpb25zVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMQ29uc3RhbnRzOwotCi1wdWJsaWMgY2xhc3MgU1dBQ2xpZW50IHsKLQotCXByaXZhdGUgc3RhdGljIEVuZHBvaW50UmVmZXJlbmNlIHRhcmdldEVQUiA9IG5ldyBFbmRwb2ludFJlZmVyZW5jZSgKLQkJCSJodHRwOi8vbG9jYWxob3N0OjgwODAvYXhpczIvc2VydmljZXMvU1dBU2FtcGxlU2VydmljZSIpOwotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUNvbW1hbmRMaW5lT3B0aW9uUGFyc2VyIG9wdGlvbnNQYXJzZXIgPSBuZXcgQ29tbWFuZExpbmVPcHRpb25QYXJzZXIoCi0JCQkJYXJncyk7Ci0JCUxpc3QgaW52YWxpZE9wdGlvbnNMaXN0ID0gb3B0aW9uc1BhcnNlcgotCQkJCS5nZXRJbnZhbGlkT3B0aW9ucyhuZXcgT3B0aW9uc1ZhbGlkYXRvcigpIHsKLQkJCQkJcHVibGljIGJvb2xlYW4gaXNJbnZhbGlkKENvbW1hbmRMaW5lT3B0aW9uIG9wdGlvbikgewotCQkJCQkJU3RyaW5nIG9wdGlvblR5cGUgPSBvcHRpb24uZ2V0T3B0aW9uVHlwZSgpOwotCQkJCQkJcmV0dXJuICEoImRlc3QiLmVxdWFsc0lnbm9yZUNhc2Uob3B0aW9uVHlwZSkgfHwgImZpbGUiCi0JCQkJCQkJCS5lcXVhbHNJZ25vcmVDYXNlKG9wdGlvblR5cGUpKTsKLQkJCQkJfQotCQkJCX0pOwotCi0JCWlmICgoaW52YWxpZE9wdGlvbnNMaXN0LnNpemUoKSA+IDApIHx8IChhcmdzLmxlbmd0aCAhPSA0KSkgewotCQkJLy8gcHJpbnRVc2FnZSgpOwotCQkJU3lzdGVtLm91dAotCQkJCQkucHJpbnRsbigiSW52YWxpZCBQYXJhbWV0ZXJzLiAgVXNhZ2UgLWZpbGUgPGZpbGUgdG8gYmUgc2VuZD4gLWRlc3QgPGRlc3RpbmF0aW9uIGZpbGU+Iik7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlNYXAgb3B0aW9uc01hcCA9IG9wdGlvbnNQYXJzZXIuZ2V0QWxsT3B0aW9ucygpOwotCi0JCUNvbW1hbmRMaW5lT3B0aW9uIGZpbGVPcHRpb24gPSAoQ29tbWFuZExpbmVPcHRpb24pIG9wdGlvbnNNYXAKLQkJCQkuZ2V0KCJmaWxlIik7Ci0JCUNvbW1hbmRMaW5lT3B0aW9uIGRlc3RpbmF0aW9uT3B0aW9uID0gKENvbW1hbmRMaW5lT3B0aW9uKSBvcHRpb25zTWFwCi0JCQkJLmdldCgiZGVzdCIpOwotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShmaWxlT3B0aW9uLmdldE9wdGlvblZhbHVlKCkpOwotCQlpZiAoZmlsZS5leGlzdHMoKSkKLQkJCXRyYW5zZmVyRmlsZShmaWxlLCBkZXN0aW5hdGlvbk9wdGlvbi5nZXRPcHRpb25WYWx1ZSgpKTsKLQkJZWxzZQotCQkJdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFuc2ZlckZpbGUoRmlsZSBmaWxlLCBTdHJpbmcgZGVzdGluYXRpb25GaWxlKQotCQkJdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJT3B0aW9ucyBvcHRpb25zID0gbmV3IE9wdGlvbnMoKTsKLQkJb3B0aW9ucy5zZXRUbyh0YXJnZXRFUFIpOwotCQlvcHRpb25zLnNldFByb3BlcnR5KENvbnN0YW50cy5Db25maWd1cmF0aW9uLkVOQUJMRV9TV0EsCi0JCQkJQ29uc3RhbnRzLlZBTFVFX1RSVUUpOwotCQlvcHRpb25zLnNldFNvYXBWZXJzaW9uVVJJKFNPQVAxMUNvbnN0YW50cy5TT0FQX0VOVkVMT1BFX05BTUVTUEFDRV9VUkkpOwotCQkvLyBJbmNyZWFzZSB0aGUgdGltZSBvdXQgd2hlbiBzZW5kaW5nIGxhcmdlIGF0dGFjaG1lbnRzCi0JCW9wdGlvbnMuc2V0VGltZU91dEluTWlsbGlTZWNvbmRzKDEwMDAwKTsKLQkJb3B0aW9ucy5zZXRUbyh0YXJnZXRFUFIpOwotCQlvcHRpb25zLnNldEFjdGlvbigidXJuOnVwbG9hZEZpbGUiKTsKLQotCQkvLyBhc3N1bWUgdGhlIHVzZSBydW5zIHRoaXMgc2FtcGxlIGF0Ci0JCS8vIDxheGlzMmhvbWU+L3NhbXBsZXMvc29hcHdpdGhhdHRhY2htZW50cy8gZGlyCi0JCUNvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQgPSBDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkKLQkJCQkuY3JlYXRlQ29uZmlndXJhdGlvbkNvbnRleHRGcm9tRmlsZVN5c3RlbSgiLi4vLi4vcmVwb3NpdG9yeSIsCi0JCQkJCQludWxsKTsKLQotCQlTZXJ2aWNlQ2xpZW50IHNlbmRlciA9IG5ldyBTZXJ2aWNlQ2xpZW50KGNvbmZpZ0NvbnRleHQsIG51bGwpOwotCQlzZW5kZXIuc2V0T3B0aW9ucyhvcHRpb25zKTsKLQkJT3BlcmF0aW9uQ2xpZW50IG1lcENsaWVudCA9IHNlbmRlcgotCQkJCS5jcmVhdGVDbGllbnQoU2VydmljZUNsaWVudC5BTk9OX09VVF9JTl9PUCk7Ci0KLQkJTWVzc2FnZUNvbnRleHQgbWMgPSBuZXcgTWVzc2FnZUNvbnRleHQoKTsKLQkJRmlsZURhdGFTb3VyY2UgZmlsZURhdGFTb3VyY2UgPSBuZXcgRmlsZURhdGFTb3VyY2UoZmlsZSk7Ci0KLQkJLy8gQ3JlYXRlIGEgZGF0YUhhbmRsZXIgdXNpbmcgdGhlIGZpbGVEYXRhU291cmNlLiBBbnkgaW1wbGVtZW50YXRpb24gb2YKLQkJLy8gamF2YXguYWN0aXZhdGlvbi5EYXRhU291cmNlIGludGVyZmFjZSBjYW4gZml0IGhlcmUuCi0JCURhdGFIYW5kbGVyIGRhdGFIYW5kbGVyID0gbmV3IERhdGFIYW5kbGVyKGZpbGVEYXRhU291cmNlKTsKLQkJU3RyaW5nIGF0dGFjaG1lbnRJRCA9IG1jLmFkZEF0dGFjaG1lbnQoZGF0YUhhbmRsZXIpOwotCi0JCVNPQVBGYWN0b3J5IGZhYyA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMUZhY3RvcnkoKTsKLQkJU09BUEVudmVsb3BlIGVudiA9IGZhYy5nZXREZWZhdWx0RW52ZWxvcGUoKTsKLQkJT01OYW1lc3BhY2Ugb21OcyA9IGZhYy5jcmVhdGVPTU5hbWVzcGFjZSgKLQkJCQkiaHR0cDovL3NlcnZpY2Uuc29hcHdpdGhhdHRhY2htZW50cy5zYW1wbGUiLCAic3dhIik7Ci0JCU9NRWxlbWVudCB1cGxvYWRGaWxlID0gZmFjLmNyZWF0ZU9NRWxlbWVudCgidXBsb2FkRmlsZSIsIG9tTnMpOwotCQlPTUVsZW1lbnQgbmFtZUVsZSA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoIm5hbWUiLCBvbU5zKTsKLQkJbmFtZUVsZS5zZXRUZXh0KGRlc3RpbmF0aW9uRmlsZSk7Ci0JCU9NRWxlbWVudCBpZEVsZSA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoImF0dGNobWVudElEIiwgb21Ocyk7Ci0JCWlkRWxlLnNldFRleHQoYXR0YWNobWVudElEKTsKLQkJdXBsb2FkRmlsZS5hZGRDaGlsZChuYW1lRWxlKTsKLQkJdXBsb2FkRmlsZS5hZGRDaGlsZChpZEVsZSk7Ci0JCWVudi5nZXRCb2R5KCkuYWRkQ2hpbGQodXBsb2FkRmlsZSk7Ci0JCW1jLnNldEVudmVsb3BlKGVudik7Ci0KLQkJbWVwQ2xpZW50LmFkZE1lc3NhZ2VDb250ZXh0KG1jKTsKLQkJbWVwQ2xpZW50LmV4ZWN1dGUodHJ1ZSk7Ci0JCU1lc3NhZ2VDb250ZXh0IHJlc3BvbnNlID0gbWVwQ2xpZW50Ci0JCQkJLmdldE1lc3NhZ2VDb250ZXh0KFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9JTl9WQUxVRSk7Ci0JICAJU09BUEJvZHkgYm9keSA9IHJlc3BvbnNlLmdldEVudmVsb3BlKCkuZ2V0Qm9keSgpOwotCSAgCU9NRWxlbWVudCBlbGVtZW50ID0gYm9keS5nZXRGaXJzdEVsZW1lbnQoKS5nZXRGaXJzdENoaWxkV2l0aE5hbWUoCi0JICAJbmV3IFFOYW1lKCJodHRwOi8vc2VydmljZS5zb2Fwd2l0aGF0dGFjaG1lbnRzLnNhbXBsZSIsInJldHVybiIpKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKGVsZW1lbnQuZ2V0VGV4dCgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3NvYXB3aXRoYXR0YWNobWVudHMvc3JjL3NhbXBsZS9zb2Fwd2l0aGF0dGFjaG1lbnRzL3NlcnZpY2UvQXR0YWNobWVudFNlcnZpY2UuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvc29hcHdpdGhhdHRhY2htZW50cy9zcmMvc2FtcGxlL3NvYXB3aXRoYXR0YWNobWVudHMvc2VydmljZS9BdHRhY2htZW50U2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkZjM4MDNmLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvc29hcHdpdGhhdHRhY2htZW50cy9zcmMvc2FtcGxlL3NvYXB3aXRoYXR0YWNobWVudHMvc2VydmljZS9BdHRhY2htZW50U2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugc2FtcGxlLnNvYXB3aXRoYXR0YWNobWVudHMuc2VydmljZTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBqYXZheC5hY3RpdmF0aW9uLkRhdGFIYW5kbGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5hdHRhY2htZW50cy5BdHRhY2htZW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBBdHRhY2htZW50U2VydmljZSB7Ci0KLQlwdWJsaWMgU3RyaW5nIHVwbG9hZEZpbGUoU3RyaW5nIG5hbWUsIFN0cmluZyBhdHRjaG1lbnRJRCkgdGhyb3dzIElPRXhjZXB0aW9uCi0JewotICAgICAgICBNZXNzYWdlQ29udGV4dCBtc2dDdHggPSBNZXNzYWdlQ29udGV4dC5nZXRDdXJyZW50TWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgQXR0YWNobWVudHMgYXR0YWNobWVudCA9IG1zZ0N0eC5nZXRBdHRhY2htZW50TWFwKCk7Ci0gICAgICAgIERhdGFIYW5kbGVyIGRhdGFIYW5kbGVyID0gYXR0YWNobWVudC5nZXREYXRhSGFuZGxlcihhdHRjaG1lbnRJRCk7Ci0gICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKAotCQkJCW5hbWUpOwotCQlGaWxlT3V0cHV0U3RyZWFtIGZpbGVPdXRwdXRTdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlKTsKLQkJZGF0YUhhbmRsZXIud3JpdGVUbyhmaWxlT3V0cHV0U3RyZWFtKTsKLQkJZmlsZU91dHB1dFN0cmVhbS5mbHVzaCgpOwotCQlmaWxlT3V0cHV0U3RyZWFtLmNsb3NlKCk7Ci0JCQotCQlyZXR1cm4gIkZpbGUgc2F2ZWQgc3VjY2VzZnVsbHkuIjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvdXNlcmd1aWRlL1JFQURNRS50eHQgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3VzZXJndWlkZS9SRUFETUUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTM4NzM2Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvdXNlcmd1aWRlL1JFQURNRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi1BeGlzMiBVc2VyJ3MgR3VpZGUgU2FtcGxlDQotPT09PT09PT09PT09PT09PT09PT09PT09PQ0KLQ0KLVRoaXMgc2FtcGxlIGNvbnRhaW5zIHRoZSBzb3VyY2UgY29kZSByZWxldmFudCB0byB4ZG9jcy8xXzEvYWR2LXVzZXJndWlkZS5odG1sLCANCi1tb3JlIHNwZWNpZmljYWxseSB0byB4ZG9jcy8xXzEvZGlpLmh0bWwgYW5kIHhtbGJhc2VkLXNlcnZlci5odG1sIHdoaWNoIGFyZSBzZWN0aW9ucyANCi1vZiB0aGUgQXhpczIgQWR2YW5jZWQgVXNlcidzIEd1aWRlIGZvdW5kIGluIHRoZSBEb2N1bWVudHMgRGlzdHJpYnV0aW9uLg0KLQ0KLVRoZSBzYW1wbGUgZXhwbGFpbnMgaG93IHRvIHdyaXRlIGEgV2ViIHNlcnZpY2UgYW5kIFdlYiBzZXJ2aWNlIGNsaWVudCB3aXRoIA0KLUFwYWNoZSBBeGlzMiB1c2luZyBYTUwgYmFzZWQgY2xpZW50IEFQSXMgKEF4aXMyJ3MgUHJpbWFyeSBBUElzKS4NCi0NCi1JbnRyb2R1Y3Rpb24NCi09PT09PT09PT09PT0NCi0NCi1UaGUgZm9sbG93aW5nIHNhbXBsZSBjbGllbnRzIGFyZSBsb2NhdGVkIGF0IA0KLUFYSVMyX0hPTUUvc2FtcGxlcy91c2VyZ3VpZGUvc2FtcGxlcy91c2VyZ3VpZGUvc3JjL3VzZXJndWlkZS9jbGllbnRzIGRpcmVjdG9yeS4gDQotDQotRWNob0Jsb2NraW5nQ2xpZW50LmphdmEgLS0gRGVtb25zdHJhdGVzIHRoZSByZXF1ZXN0LXJlc3BvbnNlLCBibG9ja2luZyBjbGllbnQgd2hpY2ggDQotaXMgd3JpdHRlbiB1c2luZyBBeGlzMidzIHByaW1hcnkgQVBJcy4NCi0NCi1FY2hvQmxvY2tpbmdEdWFsQ2xpZW50LmphdmEgLS0gRGVtb25zdHJhdGVzIHRoZSByZXF1ZXN0LXJlc3BvbnNlLCBibG9ja2luZyBjbGllbnQgd2hpY2ggDQotdXNlcyB0d28gdHJhbnNwb3J0IGNvbm5lY3Rpb25zIGFuZCB3cml0dGVuIHVzaW5nIEF4aXMyJ3MgcHJpbWFyeSBBUElzLg0KLQ0KLUVjaG9Ob25CbG9ja2luZ0NsaWVudC5qYXZhIC0tIERlbW9uc3RyYXRlcyB0aGUgcmVxdWVzdC1yZXNwb25zZSwgbm9uLWJsb2NraW5nIGludm9jYXRpb24gDQotd2hpY2ggaXMgd3JpdHRlbiB1c2luZyBBeGlzMidzIHByaW1hcnkgQVBJcy4NCi0NCi1FY2hvTm9uQmxvY2tpbmdEdWFsQ2xpZW50LmphdmEgLS0gRGVtb25zdHJhdGVzIHRoZSByZXF1ZXN0LXJlc3BvbnNlLCBub24tYmxvY2tpbmcgaW52b2NhdGlvbiANCi11c2luZyB0d28gdHJhbnNwb3J0IGNvbm5lY3Rpb25zIGFuZCBpcyB3cml0dGVuIHVzaW5nIEF4aXMyJ3MgcHJpbWFyeSBBUElzLg0KLQ0KLU1haWxDbGllbnQuamF2YSAtLSBSZXByZXNlbnRzIGEgY2xpZW50IGZvciBpbnZva2luZyANCi0NCi1QaW5nQ2xpZW50LmphdmEgLS0gUmVwcmVzZW50cyBhIHNpbXBsZSBvbmUtd2F5IGNsaWVudCB3aGljaCBpcyB3cml0dGVuIHVzaW5nIEF4aXMyJ3MgcHJpbWFyeSBBUElzLg0KLQ0KLVJFU1RDbGllbnQuamF2YSAtLSBSZXByZXNlbnRzIGEgY2xpZW50IGZvciBpbnZva2luZyBhIFJFU1QgV2ViIHNlcnZpY2UNCi0NCi1UQ1BDbGllbnQuamF2YSAtLSBEZW1vbnN0cmF0ZXMgYSBjbGllbnQgZm9yIGludm9raW5nIGEgV2ViIHNlcnZpY2UgdXNpbmcgVENQDQotDQotZXhhbXBsZTEsIGV4YW1wbGUyIGFuZCBleGFtcGxlMyBkaXJlY3RvcmllcyBpbnNpZGUgQXhpczJfaG9tZS9zYW1wbGVzL3VzZXJndWlkZS9zcmMvdXNlcmd1aWRlIA0KLWNvbnRhaW4gdGhlIFdlYiBzZXJ2aWNlcyB3aGljaCBhcmUgaW52b2tlZCBieSB0aGUgYWJvdmUgY2xpZW50cy4NCi0NCi0NCi1QcmUtUmVxdWlzaXRlcw0KLT09PT09PT09PT09PT09DQotDQotQXBhY2hlIEFudCAxLjYuMiBvciBsYXRlcg0KLQ0KLUJ1aWxkaW5nIHRoZSBTZXJ2aWNlDQotPT09PT09PT09PT09PT09PT09PT0NCi0qIFR5cGUgImFudCBnZW5lcmF0ZS5tb2R1bGUiIGZyb20gQXhpczJfSE9NRS9zYW1wbGVzL3VzZXJndWlkZSB0byBnZW5lcmF0ZSB0aGUgbG9nZ2luZyBtb2R1bGUuDQotKiBBZGQgdGhlIGxvZ2dpbmcgcGhhc2UgdG8gdGhlIC4uLy4uL2NvbmYvYXhpczIueG1sLiBGb3IgbW9yZSBkZXRhaWxzIHBsZWFzZSByZWZlciB0byB0aGUgDQotICBodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi8xXzIvbW9kdWxlcy5odG1sDQotKiBUeXBlICJhbnQgZ2VuZXJhdGUuc2VydmljZSIgb3IganVzdCAiYW50IiBmcm9tIEF4aXMyX0hPTUUvc2FtcGxlcy91c2VyZ3VpZGUNCi0qIFRoZW4gZ28gdG8gQVhJUzJfSE9NRS9iaW4gZGlyZWN0b3J5IGFuZCBydW4gZWl0aGVyIGF4aXMyc2VydmVyLmJhdCBvciBheGlzMnNlcnZlci5zaCBkZXBlbmRpbmcgb24geW91ciBwbGF0Zm9ybS4NCi0NCi1BbHRlcm5hdGl2ZWx5IHlvdSBjYW4gY29weSB0aGUgdGhlIGdlbmVyYXRlZCBzZXJ2aWNlIGFyY2hpdmVzIGluIHRvIGEgc2VydmxldCBjb250YWluZXIuDQotDQotSWYgeW91IGdvIHRvIGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9heGlzMi8sIHlvdSBzaG91bGQgc2VlIE15U2VydmljZSwgTXlTZXJ2aWNlV2l0aE1vZHVsZSBhcmUgZGVwbG95ZWQuIA0KLQ0KLQ0KLVJ1bm5pbmcgdGhlIENsaWVudHMNCi09PT09PT09PT09PT09PT09PT09DQotDQotVHlwZSB0aGUgZm9sbG93aW5nIGFudCBjb21tYW5kcyBmcm9tIEF4aXMyX0hPTUUvc2FtcGxlcy91c2VyZ3VpZGUgdG8gcnVuIHRoZSBjbGllbnRzIG9uZSBieSBvbmUuDQotDQotICogImFudCBydW4uY2xpZW50LmJsb2NraW5nIg0KLSAgIFRoaXMgaW52b2tlcyBNeVNlcnZpY2UgdGhyb3VnaCBhIHJlcXVlc3QtcmVzcG9uc2UsIGJsb2NraW5nIGNsaWVudC4gICANCi0gKiAiYW50IHJ1bi5jbGllbnQuYmxvY2tpbmdkdWFsIg0KLSAgIFRoaXMgaW52b2tlcyBNeVNlcnZpY2UgdGhyb3VnaCBhIHJlcXVlc3QtcmVzcG9uc2UsIGJsb2NraW5nIGNsaWVudCB2aWEgZHVhbCB0cmFuc3BvcnQgY2hhbm5lbHMuICAgDQotICogImFudCBydW4uY2xpZW50Lm5vbmJsb2NraW5nIg0KLSAgIFRoaXMgaW52b2tlcyBNeVNlcnZpY2UgdGhyb3VnaCBhIHJlcXVlc3QtcmVzcG9uc2UsIG5vbi1ibG9ja2luZyBjbGllbnQuICANCi0gKiAiYW50IHJ1bi5jbGllbnQubm9uYmxvY2tpbmdkdWFsIg0KLSAgIFRoaXMgaW52b2tlcyBNeVNlcnZpY2UgdGhyb3VnaCBhIHJlcXVlc3QtcmVzcG9uc2UsIG5vbi1ibG9ja2luZyBjbGllbnQgdmlhIGR1YWwgdHJhbnNwb3J0IGNoYW5uZWxzLiAgIA0KLSAqICJhbnQgcnVuLmNsaWVudC5waW5nIg0KLSAgIFRoaXMgaW52b2tlcyBNeVNlcnZpY2UgdGhyb3VnaCBhIG9uZS13YXkgY2xpZW50DQotDQotIA0KLVlvdSBjYW4gZmluZCBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBhYm92ZSBjbGllbnRzIGluIEF4aXMyIHVzZXJzIGd1aWRlLCBSRVNURnVsIFdlYiBzZXJ2aWNlcyBzdXBwb3J0LCANCi1UQ1AgVHJhbnNwb3J0IGRvY3VtZW50cyBmb3VuZCBpbiB0aGUgRG9jdW1lbnRzIERpc3RyaWJ1dGlvbidzIHhkb2NzIGRpcmVjdG9yeS4gQWxzbywgeW91IG1heSBmaW5kIGl0IA0KLXVzZWZ1bCB0byB0cnkgb3V0IHRoZSBhYm92ZSBzZXJ2aWNlcyBhbmQgY2xpZW50cyB3aGlsZSBnb2luZyB0aHJvdWdoIHRoZXNlIGRvY3VtZW50cy4NCi0NCi1Ob3RlDQotPT09PT09PT09PT09PT0NCi1Tb21ldGltZXMsIGlmIHlvdSdyZSBoYXZpbmcgdHJvdWJsZSBydW5uaW5nIHRoZSBjbGllbnQgc3VjY2Vzc2Z1bGx5LCANCi1JdCBtYXkgYmUgbmVjZXNzYXJ5IHRvIGNsZWFuIHRoZSBzZXJ2aWNlcyByZXBvc2l0b3J5IGJlZm9yZSB5b3UgZ2VuZXJhdGUgdGhlIHNlcnZpY2UsIGRlcGxveSBpdA0KLWFuZCBydW4gdGhlIGNsaWVudC4gKGkuZS4gZGVsZXRlIHNlcnZpY2VzIGNyZWF0ZWQgZnJvbSBwcmV2aW91cyBzYW1wbGVzLikNCi0NCi1IZWxwDQotPT09PQ0KLVBsZWFzZSBjb250YWN0IGF4aXMtdXNlciBsaXN0IChheGlzLXVzZXJAd3MuYXBhY2hlLm9yZykgaWYgeW91IGhhdmUgYW55IHRyb3VibGUgcnVubmluZyB0aGUgc2FtcGxlLg0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvdXNlcmd1aWRlL2J1aWxkLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvdXNlcmd1aWRlL2J1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVlZDU0ZC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3VzZXJndWlkZS9idWlsZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08cHJvamVjdCBuYW1lPSJ1c2VyZ3VpZGUiIGRlZmF1bHQ9ImdlbmVyYXRlLnNlcnZpY2UiPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJtYWluRGlyIiB2YWx1ZT0iLi4vLi4iLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iY2xhc3Nlcy5kaXIiIHZhbHVlPSJidWlsZC9jbGFzc2VzIi8+Ci0gICAgPHBhdGggaWQ9ImF4aXMuY2xhc3NwYXRoIj4KLSAgICAgICAgPGZpbGVzZXQgZGlyPSIuLi8uLi9saWIiPgotICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKi5qYXIiLz4KLSAgICAgICAgPC9maWxlc2V0PgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL3VzZXJndWlkZS5qYXIiLz4KLSAgICA8L3BhdGg+Ci08bWtkaXIgZGlyPSIke2Jhc2VkaXJ9L2J1aWxkL2NsYXNzZXMiLz4KLQotCi0gICAgPHRhcmdldCBuYW1lPSJydW4uY2xpZW50LmFsbCIKLSAgICAgICAgICAgIGRlcGVuZHM9InJ1bi5jbGllbnQucGluZyxydW4uY2xpZW50LmJsb2NraW5nLHJ1bi5jbGllbnQuYmxvY2tpbmdkdWFsLHJ1bi5jbGllbnQubm9uYmxvY2tpbmcscnVuLmNsaWVudC5ub25ibG9ja2luZ2R1YWwscnVuLmNsaWVudC5zZXJ2aWNld2l0aG1vZHVsZSI+Ci0gICAgPC90YXJnZXQ+Ci0gICAgCi0gICAgPHRhcmdldCBuYW1lPSJjb21waWxlIj4KLSAgICAJCTxta2RpciBkaXI9IiR7Y2xhc3Nlcy5kaXJ9IiAvPgotCQk8amF2YWMgc3JjZGlyPSJzcmMiIGRlc3RkaXI9IiR7Y2xhc3Nlcy5kaXJ9Ij4KLQkJCTxjbGFzc3BhdGggcmVmaWQ9ImF4aXMuY2xhc3NwYXRoIiAvPgotCQk8L2phdmFjPgotCQk8amFyIGRlc3RmaWxlPSJidWlsZC91c2VyZ3VpZGUuamFyIj4KLSAgICAgICAgICAgIAkJPGZpbGVzZXQgZGlyPSIke2NsYXNzZXMuZGlyfSI+Ci0gICAgICAgICAgICAgICAgCQk8aW5jbHVkZSBuYW1lPSJ1c2VyZ3VpZGUvKioiLz4KLSAgICAgICAgICAgIAkJPC9maWxlc2V0PgotICAgICAgIAkJPC9qYXI+Ci0gICAgPC90YXJnZXQ+Ci0gICAgCi0gICAgPHRhcmdldCBuYW1lPSJnZW5lcmF0ZS5zZXJ2aWNlIiBkZXBlbmRzPSJjb21waWxlIj4KLSAgICAgICAgICAgIDxqYXIgZGVzdGZpbGU9ImJ1aWxkL015U2VydmljZS5hYXIiPgotICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJzcmMvdXNlcmd1aWRlL2V4YW1wbGUxLyI+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iTUVUQS1JTkYvKioiLz4KLSAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtjbGFzc2VzLmRpcn0iPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9InVzZXJndWlkZS9leGFtcGxlMS8qKi8qLmNsYXNzIi8+Ci0gICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgIDwvamFyPgotICAgICAgICA8Y29weSBmaWxlPSJidWlsZC9NeVNlcnZpY2UuYWFyIiB0b2ZpbGU9Ii4uLy4uL3JlcG9zaXRvcnkvc2VydmljZXMvc2FtcGxlLU15U2VydmljZS5hYXIiIG92ZXJ3cml0ZT0idHJ1ZSIvPgotICAgICAgICA8amFyIGRlc3RmaWxlPSJidWlsZC9NeVNlcnZpY2VXaXRoTW9kdWxlLmFhciIgPgotICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJzcmMvdXNlcmd1aWRlL2V4YW1wbGUyLyI+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iTUVUQS1JTkYvKioiLz4KLSAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtjbGFzc2VzLmRpcn0iPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9InVzZXJndWlkZS9leGFtcGxlMi8qKi8qLmNsYXNzIi8+Ci0gICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgIDwvamFyPgotICAgICAgICA8Y29weSBmaWxlPSJidWlsZC9NeVNlcnZpY2VXaXRoTW9kdWxlLmFhciIgdG9maWxlPSIuLi8uLi9yZXBvc2l0b3J5L3NlcnZpY2VzL3NhbXBsZS1NeVNlcnZpY2VXaXRoTW9kdWxlLmFhciIgb3ZlcndyaXRlPSJ0cnVlIi8+Ci0gICAgICAgIDxqYXIgZGVzdGZpbGU9ImJ1aWxkL1dzYU1hcHBpbmdTZXJ2aWNlLmFhciI+Ci0gICAgICAgICAgICA8ZmlsZXNldCBkaXI9InNyYy91c2VyZ3VpZGUvZXhhbXBsZTMvIj4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJNRVRBLUlORi8qKiIvPgotICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke2NsYXNzZXMuZGlyfSI+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0idXNlcmd1aWRlL2V4YW1wbGUzLyoqLyouY2xhc3MiLz4KLSAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgPC9qYXI+Ci0gICAgICAgIDxjb3B5IGZpbGU9ImJ1aWxkL1dzYU1hcHBpbmdTZXJ2aWNlLmFhciIgdG9maWxlPSIuLi8uLi9yZXBvc2l0b3J5L3NlcnZpY2VzL3NhbXBsZS1Xc2FNYXBwaW5nU2VydmljZS5hYXIiIG92ZXJ3cml0ZT0idHJ1ZSIvPgotICAgIDwvdGFyZ2V0PgotICAgIAotICAgIDx0YXJnZXQgbmFtZT0iZ2VuZXJhdGUubW9kdWxlIiBkZXBlbmRzPSJjb21waWxlIj4KLSAgICAgICA8amFyIGRlc3RmaWxlPSJidWlsZC9sb2dnaW5nLm1hciI+Ci0gICAgICAgICAgICA8ZmlsZXNldCBkaXI9InNyYy91c2VyZ3VpZGUvbG9nZ2luZ21vZHVsZS8iPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Ik1FVEEtSU5GLyoqIi8+Ci0gICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7Y2xhc3Nlcy5kaXJ9Ij4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJ1c2VyZ3VpZGUvbG9nZ2luZ21vZHVsZS8qKi8qLmNsYXNzIi8+Ci0gICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgPC9qYXI+Ci0gICAgICAgPGNvcHkgZmlsZT0iYnVpbGQvbG9nZ2luZy5tYXIiIHRvZmlsZT0iLi4vLi4vcmVwb3NpdG9yeS9tb2R1bGVzL3NhbXBsZS1sb2dnaW5nLm1hciIgb3ZlcndyaXRlPSJ0cnVlIi8+Ci0gICAgICAgPGVjaG8gbWVzc2FnZT0iKioqIFBsZWFzZSBhZGQgdGhlIGxvZ2dpbmcgcGhhc2UgdG8gdGhlIC4uLy4uL2NvbmYvYXhpczIueG1sLiBGb3IgbW9yZSBkZXRhaWxzIHBsZWFzZSByZWZlciB0byB0aGUgaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvMV8yL21vZHVsZXMuaHRtbCAqKioiLz4KLSAgICA8L3RhcmdldD4KLQotICAgIDx0YXJnZXQgbmFtZT0icnVuLmNsaWVudC5ibG9ja2luZyIgZGVwZW5kcz0iY29tcGlsZSI+Ci0gICAgICAgIDxqYXZhIGNsYXNzbmFtZT0idXNlcmd1aWRlLmNsaWVudHMuRWNob0Jsb2NraW5nQ2xpZW50IgotICAgICAgICAgICAgICBjbGFzc3BhdGhyZWY9ImF4aXMuY2xhc3NwYXRoIiBmb3JrPSJ0cnVlIj4KLSAgICAgICAgICAgIDxqdm1hcmcgdmFsdWU9Ii1EYXhpczIucmVwbz0ke21haW5EaXJ9L3JlcG9zaXRvcnkiLz4KLQkgICAgPGp2bWFyZyB2YWx1ZT0iLURheGlzMi54bWw9Y29uZi9heGlzMi54bWwiLz4KLSAgICAgICAgPC9qYXZhPgotICAgIDwvdGFyZ2V0PgotICAgIDx0YXJnZXQgbmFtZT0icnVuLmNsaWVudC5ibG9ja2luZ2R1YWwiIGRlcGVuZHM9ImNvbXBpbGUiPgotICAgICAgICA8amF2YSBjbGFzc25hbWU9InVzZXJndWlkZS5jbGllbnRzLkVjaG9CbG9ja2luZ0R1YWxDbGllbnQiCi0gICAgICAgICAgICAgIGNsYXNzcGF0aHJlZj0iYXhpcy5jbGFzc3BhdGgiIGZvcms9InRydWUiPgotICAgICAgICAgICAgPGp2bWFyZyB2YWx1ZT0iLURheGlzMi5yZXBvPSR7bWFpbkRpcn0vcmVwb3NpdG9yeSIvPgotCSAgICA8anZtYXJnIHZhbHVlPSItRGF4aXMyLnhtbD1jb25mL2F4aXMyLnhtbCIvPgotICAgICAgICA8L2phdmE+Ci0gICAgPC90YXJnZXQ+Ci0gICAgCi0gICAgPHRhcmdldCBuYW1lPSJydW4uY2xpZW50Lm5vbmJsb2NraW5nIiBkZXBlbmRzPSJjb21waWxlIj4KLSAgICAgICAgPGphdmEgY2xhc3NuYW1lPSJ1c2VyZ3VpZGUuY2xpZW50cy5FY2hvTm9uQmxvY2tpbmdDbGllbnQiCi0gICAgICAgICAgICAgIGNsYXNzcGF0aHJlZj0iYXhpcy5jbGFzc3BhdGgiIGZvcms9InRydWUiPgotICAgICAgICAgICAgPGp2bWFyZyB2YWx1ZT0iLURheGlzMi5yZXBvPSR7bWFpbkRpcn0vcmVwb3NpdG9yeSIvPgotCSAgICA8anZtYXJnIHZhbHVlPSItRGF4aXMyLnhtbD1jb25mL2F4aXMyLnhtbCIvPgotICAgICAgICA8L2phdmE+Ci0gICAgPC90YXJnZXQ+Ci0gICAgCi0gICAgPHRhcmdldCBuYW1lPSJydW4uY2xpZW50Lm5vbmJsb2NraW5nZHVhbCIgZGVwZW5kcz0iY29tcGlsZSI+Ci0gICAgICAgIDxqYXZhIGNsYXNzbmFtZT0idXNlcmd1aWRlLmNsaWVudHMuRWNob05vbkJsb2NraW5nRHVhbENsaWVudCIKLSAgICAgICAgICAgICAgY2xhc3NwYXRocmVmPSJheGlzLmNsYXNzcGF0aCIgZm9yaz0idHJ1ZSI+Ci0gICAgICAgICAgICA8anZtYXJnIHZhbHVlPSItRGF4aXMyLnJlcG89JHttYWluRGlyfS9yZXBvc2l0b3J5Ii8+Ci0JICAgIDxqdm1hcmcgdmFsdWU9Ii1EYXhpczIueG1sPWNvbmYvYXhpczIueG1sIi8+Ci0gICAgICAgIDwvamF2YT4KLSAgICA8L3RhcmdldD4KLSAgICAKLSAgICA8dGFyZ2V0IG5hbWU9InJ1bi5jbGllbnQucGluZyIgZGVwZW5kcz0iY29tcGlsZSI+Ci0gICAgICAgIDxqYXZhIGNsYXNzbmFtZT0idXNlcmd1aWRlLmNsaWVudHMuUGluZ0NsaWVudCIKLSAgICAgICAgICAgICAgY2xhc3NwYXRocmVmPSJheGlzLmNsYXNzcGF0aCIgZm9yaz0idHJ1ZSI+Ci0gICAgICAgICAgICA8anZtYXJnIHZhbHVlPSItRGF4aXMyLnJlcG89JHttYWluRGlyfS9yZXBvc2l0b3J5Ii8+Ci0JICAgIDxqdm1hcmcgdmFsdWU9Ii1EYXhpczIueG1sPWNvbmYvYXhpczIueG1sIi8+Ci0gICAgICAgIDwvamF2YT4KLSAgICA8L3RhcmdldD4KLSAgICAKLSAgICA8dGFyZ2V0IG5hbWU9InJ1bi5jbGllbnQuc2VydmljZXdpdGhtb2R1bGUiIGRlcGVuZHM9ImNvbXBpbGUiPgotICAgIAk8ZWNobyBtZXNzYWdlPSIke21haW5EaXJ9IiAvPgotCTxlY2hvIG1lc3NhZ2U9IiR7bWFpbkRpcn0vcmVwb3NpdG9yeS9jb25mL2F4aXMyLnhtbCIgLz4KLSAgICAgICAgPGphdmEgY2xhc3NuYW1lPSJ1c2VyZ3VpZGUuY2xpZW50cy5DbGllbnRGb3JXZWJTZXJ2aWNlV2l0aE1vZHVsZSIKLSAgICAgICAgICAgICAgY2xhc3NwYXRocmVmPSJheGlzLmNsYXNzcGF0aCIgZm9yaz0idHJ1ZSI+Ci0gICAgICAgICAgIDxqdm1hcmcgdmFsdWU9Ii1EYXhpczIucmVwbz0ke21haW5EaXJ9L3JlcG9zaXRvcnkiLz4JICAgCi0JICAgPGp2bWFyZyB2YWx1ZT0iLURheGlzMi54bWw9Y29uZi9heGlzMi54bWwiLz4KLSAgICAgICAgPC9qYXZhPgotICAgIDwvdGFyZ2V0PgotICAgIAotICAgIDx0YXJnZXQgbmFtZT0icnVuLmNsaWVudCI+Ci0JPGVjaG8gbWVzc2FnZT0iUGxlYXNlIHVzZSB0aGUgZm9sbG93aW5nIGFudCB0YXJnZXRzIHRvIHJ1biB0aGUgY2xpZW50cyIgLz4KLQk8ZWNobyBtZXNzYWdlPSJydW4uY2xpZW50LnBpbmciIC8+Ci0JPGVjaG8gbWVzc2FnZT0icnVuLmNsaWVudC5ibG9ja2luZyIgLz4KLQk8ZWNobyBtZXNzYWdlPSJydW4uY2xpZW50LmJsb2NraW5nZHVhbCIgLz4KLQk8ZWNobyBtZXNzYWdlPSJydW4uY2xpZW50Lm5vbmJsb2NraW5nIiAvPgotCTxlY2hvIG1lc3NhZ2U9InJ1bi5jbGllbnQubm9uYmxvY2tpbmdkdWFsIiAvPgotCTxlY2hvIG1lc3NhZ2U9InJ1bi5jbGllbnQuc2VydmljZXdpdGhtb2R1bGUiIC8+Ci0JPGVjaG8gbWVzc2FnZT0icnVuLmNsaWVudC5hbGwgIC0gIHJ1biBhbGwgY2xpZW50cyIgLz4KLSAgICA8L3RhcmdldD4KLSAgICA8dGFyZ2V0IG5hbWU9ImNsZWFuIj4KLQk8ZGVsZXRlIGRpcj0iYnVpbGQiIC8+Ci0gICAgPC90YXJnZXQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3VzZXJndWlkZS9jb25mL2F4aXMyLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvdXNlcmd1aWRlL2NvbmYvYXhpczIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWVlOGNkLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvdXNlcmd1aWRlL2NvbmYvYXhpczIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjg5ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+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+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJtYW5hZ2VUcmFuc3BvcnRTZXNzaW9uIj5mYWxzZTwvcGFyYW1ldGVyPgotCi0gICAgPCEtLSBGb2xsb3dpbmcgcGFyYW1ldGVyIHdpbGwgY29tcGxldGVseSBkaXNhYmxlIFJFU1QgaGFuZGxpbmcgaW4gQXhpczItLT4KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImRpc2FibGVSRVNUIiBsb2NrZWQ9InRydWUiPmZhbHNlPC9wYXJhbWV0ZXI+Ci0KLSAgICA8IS0tIElmIHlvdSBoYXZlIGEgZnJvbnRlbmQgaG9zdCB3aGljaCBleHBvc2VzIHRoaXMgd2Vic2VydmljZSB1c2luZyBhIGRpZmZlcmVudCBwdWJsaWMgVVJMICAtLT4KLSAgICA8IS0tIHVzZSB0aGlzIHBhcmFtZXRlciB0byBvdmVycmlkZSBhdXRvZGV0ZWN0ZWQgdXJsIC0tPgotICAgIDwhLS08cGFyYW1ldGVyIG5hbWU9Imh0dHBGcm9udGVuZEhvc3RVcmwiPmh0dHBzOi8vc29tZW90aGVyaG9zdC9jb250ZXh0PC9wYXJhbWV0ZXI+LS0+Ci0KLQotICAgIDwhLS0gICAgVGhlIHdheSBvZiBhZGRpbmcgbGlzdGVuZXIgdG8gdGhlIHN5c3RlbS0tPgotICAgIDwhLS0gICAgPGxpc3RlbmVyIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLk9ic2VydmVySU1QTCI+LS0+Ci0gICAgPCEtLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJSU1NfVVJMIj5odHRwOi8vMTI3LjAuMC4xL3JzczwvcGFyYW1ldGVyPi0tPgotICAgIDwhLS0gICAgPC9saXN0ZW5lcj4tLT4KLQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIE1lc3NhZ2UgUmVjZWl2ZXJzIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tVGhpcyBpcyB0aGUgRGVhZnVsdCBNZXNzYWdlIFJlY2VpdmVyIGZvciB0aGUgc3lzdGVtICwgaWYgeW91IHdhbnQgdG8gaGF2ZSBNZXNzYWdlUmVjZWl2ZXJzIGZvciAtLT4KLSAgICA8IS0tYWxsIHRoZSBvdGhlciBNRVAgaW1wbGVtZW50IGl0IGFuZCBhZGQgdGhlIGNvcnJlY3QgZW50cnkgdG8gaGVyZSAsIHNvIHRoYXQgeW91IGNhbiByZWZlciBmcm9tLS0+Ci0gICAgPCEtLWFueSBvcGVyYXRpb24gLS0+Ci0gICAgPCEtLU5vdGUgOiBZb3UgY2FuIG92cmlkZSB0aGlzIGZvciBwYXJ0aWN1bGFyIHNlcnZpY2UgYnkgYWRkaW5nIHRoZSBzYW1lIGVsZW1lbnQgd2l0aCB5b3VyIHJlcXVpcmVtZW50LS0+Ci0gICAgPG1lc3NhZ2VSZWNlaXZlcnM+Ci0gICAgICAgIDxtZXNzYWdlUmVjZWl2ZXIgbWVwPSJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaW4tb25seSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuUmF3WE1MSU5Pbmx5TWVzc2FnZVJlY2VpdmVyIi8+Ci0gICAgICAgIDxtZXNzYWdlUmVjZWl2ZXIgbWVwPSJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaW4tb3V0IgotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5SYXdYTUxJTk91dE1lc3NhZ2VSZWNlaXZlciIvPgotICAgIDwvbWVzc2FnZVJlY2VpdmVycz4KLQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIE1lc3NhZ2UgRm9ybWF0dGVyIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tRm9sbG93aW5nIGNvbnRlbnQgdHlwZSB0byBtZXNzYWdlIGZvcm1hdHRlciBtYXBwaW5nIGNhbiBiZSB1c2VkIHRvIGltcGxlbWVudCBzdXBwb3J0IGZvciBkaWZmZXJlbnQgbWVzc2FnZSAtLT4KLSAgICA8IS0tZm9ybWF0ICBzZXJpYWxpemF0aW9uIGluIEF4aXMyLiBUaGVzZSBtZXNzYWdlIGZvcm1hdHMgYXJlIGV4cGVjdGVkIHRvIGJlIHJlc29sdmVkIGJhc2VkIG9uIHRoZSBjb250ZW50IHR5cGUuIC0tPgotICAgIDxtZXNzYWdlRm9ybWF0dGVycz4KLSAgICAgICAgPG1lc3NhZ2VGb3JtYXR0ZXIgY29udGVudFR5cGU9ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuWEZvcm1VUkxFbmNvZGVkRm9ybWF0dGVyIi8+Ci0gICAgICAgIDxtZXNzYWdlRm9ybWF0dGVyIGNvbnRlbnRUeXBlPSJhcHBsaWNhdGlvbi94bWwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkFwcGxpY2F0aW9uWE1MRm9ybWF0dGVyIi8+Ci0gICAgICAgIDxtZXNzYWdlRm9ybWF0dGVyIGNvbnRlbnRUeXBlPSJ0ZXh0L3htbCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuQXBwbGljYXRpb25YTUxGb3JtYXR0ZXIiLz4KLSAgICAgICAgPG1lc3NhZ2VGb3JtYXR0ZXIgY29udGVudFR5cGU9ImFwcGxpY2F0aW9uL2VjaG8reG1sIgotICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5BcHBsaWNhdGlvblhNTEZvcm1hdHRlciIvPgotICAgIDwvbWVzc2FnZUZvcm1hdHRlcnM+Ci0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBUcmFuc3BvcnQgSW5zIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8dHJhbnNwb3J0UmVjZWl2ZXIgbmFtZT0iaHR0cCIKLSAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuU2ltcGxlSFRUUFNlcnZlciI+Ci0gICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icG9ydCI+NjA2MDwvcGFyYW1ldGVyPgotICAgICAgICA8IS0tIEhlcmUgaXMgdGhlIGNvbXBsZXRlIGxpc3Qgb2Ygc3VwcG9ydGVkIHBhcmFtZXRlcnMgKHNlZSBleGFtcGxlIHNldHRpbmdzIGZ1cnRoZXIgYmVsb3cpOgotICAgICAgICAgICAgcG9ydDogdGhlIHBvcnQgdG8gbGlzdGVuIG9uIChkZWZhdWx0IDYwNjApCi0gICAgICAgICAgICBob3N0bmFtZTogIGlmIG5vbi1udWxsLCB1cmwgcHJlZml4IHVzZWQgaW4gcmVwbHktdG8gZW5kcG9pbnQgcmVmZXJlbmNlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkZWZhdWx0IG51bGwpCi0gICAgICAgICAgICBvcmlnaW5TZXJ2ZXI6ICB2YWx1ZSBvZiBodHRwIFNlcnZlciBoZWFkZXIgaW4gb3V0Z29pbmcgbWVzc2FnZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkZWZhdWx0ICJTaW1wbGUtU2VydmVyLzEuMSIpCi0gICAgICAgICAgICByZXF1ZXN0VGltZW91dDogIHZhbHVlIGluIG1pbGxpcyBvZiB0aW1lIHRoYXQgcmVxdWVzdHMgY2FuIHdhaXQgZm9yIGRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkZWZhdWx0IDIwMDAwKQotICAgICAgICAgICAgcmVxdWVzdFRjcE5vRGVsYXk6ICB0cnVlIHRvIG1heGltaXplIHBlcmZvcm1hbmNlIGFuZCBtaW5pbWl6ZSBsYXRlbmN5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdCB0cnVlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSB0byBtaW5pbWl6ZSBiYW5kd2lkdGggY29uc3VtcHRpb24gYnkgY29tYmluaW5nIHNlZ21lbnRzCi0gICAgICAgICAgICByZXF1ZXN0Q29yZVRocmVhZFBvb2xTaXplOiAgbnVtYmVyIG9mIHRocmVhZHMgYXZhaWxhYmxlIGZvciByZXF1ZXN0IHByb2Nlc3NpbmcgKHVubGVzcyBxdWV1ZSBmaWxscyB1cCkgIChkZWZhdWx0IDI1KQotICAgICAgICAgICAgcmVxdWVzdE1heFRocmVhZFBvb2xTaXplOiAgbnVtYmVyIG9mIHRocmVhZHMgYXZhaWxhYmxlIGZvciByZXF1ZXN0IHByb2Nlc3NpbmcgaWYgcXVldWUgZmlsbHMgdXMgICAgICAgICAoZGVmYXVsdCAxNTApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RlIHRoYXQgZGVmYXVsdCBxdWV1ZSBuZXZlciBmaWxscyB1cDogIHNlZSBIdHRwRmFjdG9yeQotICAgICAgICAgICAgdGhyZWFkS2VlcEFsaXZlVGltZTogIHRpbWUgdG8ga2VlcCB0aHJlYWRzIGluIGV4Y2VzcyBvZiBjb3JlIHNpemUgYWxpdmUgd2hpbGUgaW5hY3RpdmUgICAgICAgICAgICAgICAgICAoZGVmYXVsdCAxODApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90ZSB0aGF0IG5vIHN1Y2ggdGhyZWFkcyBjYW4gZXhpc3Qgd2l0aCBkZWZhdWx0IHVuYm91bmRlZCByZXF1ZXN0IHF1ZXVlCi0gICAgICAgICAgICB0aHJlYWRLZWVwQWxpdmVUaW1lVW5pdDogIFRpbWVVbml0IG9mIHZhbHVlIGluIHRocmVhZEtlZXBBbGl2ZVRpbWUgKGRlZmF1bHQgU0VDT05EUykgICAgICAgICAgICAgICAgICAgIChkZWZhdWx0IFNFQ09ORFMpCi0gICAgICAgIC0tPgotICAgICAgICA8IS0tIDxwYXJhbWV0ZXIgbmFtZT0iaG9zdG5hbWUiICAgICAgICAgICAgICAgICA+aHR0cDovL3d3dy5teUFwcC5jb20vd3M8L3BhcmFtZXRlcj4gLS0+Ci0gICAgICAgIDwhLS0gPHBhcmFtZXRlciBuYW1lPSJvcmlnaW5TZXJ2ZXIiICAgICAgICAgICAgID5NeS1TZXJ2ZXIvMS4xPC9wYXJhbWV0ZXI+ICAgICAgICAgICAtLT4KLSAgICAgICAgPCEtLSA8cGFyYW1ldGVyIG5hbWU9InJlcXVlc3RUaW1lb3V0IiAgICAgICAgICAgPjEwMDAwPC9wYXJhbWV0ZXI+ICAgICAgICAgICAgICAgICAgIC0tPgotICAgICAgICA8IS0tIDxwYXJhbWV0ZXIgbmFtZT0icmVxdWVzdFRjcE5vRGVsYXkiICAgICAgICA+ZmFsc2U8L3BhcmFtZXRlcj4gICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gPHBhcmFtZXRlciBuYW1lPSJyZXF1ZXN0Q29yZVRocmVhZFBvb2xTaXplIj41MDwvcGFyYW1ldGVyPiAgICAgICAgICAgICAgICAgICAgICAtLT4KLSAgICAgICAgPCEtLSA8cGFyYW1ldGVyIG5hbWU9InJlcXVlc3RNYXhUaHJlYWRQb29sU2l6ZSIgPjEwMDwvcGFyYW1ldGVyPiAgICAgICAgICAgICAgICAgICAgIC0tPgotICAgICAgICA8IS0tIDxwYXJhbWV0ZXIgbmFtZT0idGhyZWFkS2VlcEFsaXZlVGltZSIgICAgICA+MjQwMDAwPC9wYXJhbWV0ZXI+ICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gPHBhcmFtZXRlciBuYW1lPSJ0aHJlYWRLZWVwQWxpdmVUaW1lVW5pdCIgID5NSUxMSVNFQ09ORFM8L3BhcmFtZXRlcj4gICAgICAgICAgICAtLT4KLSAgICA8L3RyYW5zcG9ydFJlY2VpdmVyPgotICAgIAotICAgIDwhLS1VbmNvbW1lbnQgaWYgeW91IHdhbnQgdG8gaGF2ZSBUQ1AgdHJhbnNwb3J0IHN1cHBvcnQtLT4KLSAgICA8IS0tdHJhbnNwb3J0UmVjZWl2ZXIgbmFtZT0idGNwIgotICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQudGNwLlRDUFNlcnZlciI+Ci0gICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icG9ydCI+NjA2MDwvcGFyYW1ldGVyLS0+PgotICAgICAgICA8IS0tSWYgeW91IHdhbnQgdG8gZ2l2ZSB5b3VyIG93biBob3N0IGFkZHJlc3MgZm9yIEVQUiBnZW5lcmF0aW9uLS0+Ci0gICAgICAgIDwhLS11bmNvbW1ldCBmb2xsb3dpbmcgcGFyYW10ZXIgLCBhbmQgc2V0IGFzIHlvdSByZXF1aXJlZC4tLT4KLSAgICAgICAgPCEtLTxwYXJhbWV0ZXIgbmFtZT0iaG9zdG5hbWUiPnRjcDovL215QXBwLmNvbS93czwvcGFyYW1ldGVyPi0tPgotICAgIDwhLS0gL3RyYW5zcG9ydFJlY2VpdmVyIC0tPgotCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gVHJhbnNwb3J0IE91dHMgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi0gICAgPCEtLVVuY29tbWVudCBpZiB5b3Ugd2FudCB0byBoYXZlIFRDUCB0cmFuc3BvcnQgc3VwcG9ydC0tPgotICAgIDwhLS0KLSAgICA8dHJhbnNwb3J0U2VuZGVyIG5hbWU9InRjcCIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC50Y3AuVENQVHJhbnNwb3J0U2VuZGVyIi8+Ci0gICAgLS0+Ci0gICAgPHRyYW5zcG9ydFNlbmRlciBuYW1lPSJsb2NhbCIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5sb2NhbC5Mb2NhbFRyYW5zcG9ydFNlbmRlciIvPgotICAgIDx0cmFuc3BvcnRTZW5kZXIgbmFtZT0iaHR0cCIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkNvbW1vbnNIVFRQVHJhbnNwb3J0U2VuZGVyIj4KLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJQUk9UT0NPTCI+SFRUUC8xLjE8L3BhcmFtZXRlcj4KLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJUcmFuc2Zlci1FbmNvZGluZyI+Y2h1bmtlZDwvcGFyYW1ldGVyPgotICAgICAgICAKLSAgICAgICAgPCEtLSBJZiBmb2xsb3dpbmcgaXMgc2V0IHRvICd0cnVlJywgb3B0aW9uYWwgYWN0aW9uIHBhcnQgb2YgdGhlIENvbnRlbnQtVHlwZSB3aWxsIG5vdCBiZSBhZGRlZCB0byB0aGUgU09BUCAxLjIgbWVzc2FnZXMgLS0+Ci0gICAgICAgIDwhLS0gIDxwYXJhbWV0ZXIgbmFtZT0iT21pdFNPQVAxMkFjdGlvbiI+dHJ1ZTwvcGFyYW1ldGVyPiAgLS0+Ci0gICAgPC90cmFuc3BvcnRTZW5kZXI+Ci0gICAgCi0gICAgPHRyYW5zcG9ydFNlbmRlciBuYW1lPSJodHRwcyIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkNvbW1vbnNIVFRQVHJhbnNwb3J0U2VuZGVyIj4KLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJQUk9UT0NPTCI+SFRUUC8xLjE8L3BhcmFtZXRlcj4KLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJUcmFuc2Zlci1FbmNvZGluZyI+Y2h1bmtlZDwvcGFyYW1ldGVyPgotICAgIDwvdHJhbnNwb3J0U2VuZGVyPgotCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gR2xvYmFsIE1vZHVsZXMgIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIENvbW1lbnQgdGhpcyB0byBkaXNhYmxlIEFkZHJlc3NpbmcgLS0+Ci0gICAgPG1vZHVsZSByZWY9ImFkZHJlc3NpbmciLz4KLQotICAgIDwhLS1Db25maWd1cmluZyBtb2R1bGUgLCBwcm92aWRpbmcgcGFyYW1ldGVycyBmb3IgbW9kdWxlcyB3aGV0aGVyIHRoZXkgcmVmZXIgb3Igbm90LS0+Ci0gICAgPCEtLTxtb2R1bGVDb25maWcgbmFtZT0iYWRkcmVzc2luZyI+LS0+Ci0gICAgPCEtLTxwYXJhbWV0ZXIgbmFtZT0iYWRkcmVzc2luZ1BhcmEiPk4vQTwvcGFyYW1ldGVyPi0tPgotICAgIDwhLS08L21vZHVsZUNvbmZpZz4tLT4KLQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIENsdXN0ZXJpbmcgIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIENvbmZpZ3VyZSBhbmQgdW5jb21tZW50IGZvbGxvd2luZyBmb3IgcHJlcGFyaW5nIEF4aXMyIHRvIGEgY2x1c3RlcmVkIGVudmlyb25tZW50IC0tPgotICAgIDwhLS0gCi0gICAgPGNsdXN0ZXIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuY2x1c3Rlci50cmliZXMuVHJpYmVzQ2x1c3Rlck1hbmFnZXIiPgotICAgIAk8cGFyYW1ldGVyIG5hbWU9InBhcmFtMSI+dmFsdWUxPC9wYXJhbWV0ZXI+Ci0gICAgPC9jbHVzdGVyPgotICAgICAtLT4KLSAgICAgCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gUGhhc2VzICAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPHBoYXNlT3JkZXIgdHlwZT0iSW5GbG93Ij4KLSAgICAgICAgPCEtLSAgU3lzdGVtIHByZWRlZmluZWQgcGhhc2VzICAgICAgIC0tPgotICAgICAgICA8cGhhc2UgbmFtZT0iVHJhbnNwb3J0Ij4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5SZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIj4KLSAgICAgICAgICAgICAgICA8b3JkZXIgcGhhc2U9IlRyYW5zcG9ydCIvPgotICAgICAgICAgICAgPC9oYW5kbGVyPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiPgotICAgICAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iVHJhbnNwb3J0Ii8+Ci0gICAgICAgICAgICA8L2hhbmRsZXI+Ci0gICAgICAgIDwvcGhhc2U+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJBZGRyZXNzaW5nIj4KLSAgICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJBZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciI+Ci0gICAgICAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iQWRkcmVzc2luZyIvPgotICAgICAgICAgICAgPC9oYW5kbGVyPgotICAgICAgICA8L3BoYXNlPgotICAgICAgICA8cGhhc2UgbmFtZT0iU2VjdXJpdHkiLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlByZURpc3BhdGNoIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJEaXNwYXRjaCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkRpc3BhdGNoUGhhc2UiPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiLz4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIi8+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJSZXF1ZXN0VVJJT3BlcmF0aW9uRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklPcGVyYXRpb25EaXNwYXRjaGVyIi8+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiLz4KLQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iSFRUUExvY2F0aW9uQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuSFRUUExvY2F0aW9uQmFzZWREaXNwYXRjaGVyIi8+Ci0gICAgICAgIDwvcGhhc2U+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJSTVBoYXNlIi8+Ci0gICAgICAgIDwhLS0gIFN5c3RlbSBwcmVkZWZpbmVkIHBoYXNlcyAgICAgICAtLT4KLSAgICAgICAgPCEtLSAgIEFmdGVyIFBvc3RkaXNwYXRjaCBwaGFzZSBtb2R1bGUgYXV0aG9yIG9yIHNlcnZpY2UgYXV0aG9yIGNhbiBhZGQgYW55IHBoYXNlIGhlIHdhbnQgICAgICAtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik9wZXJhdGlvbkluUGhhc2UiLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9InNvYXBtb25pdG9yUGhhc2UiLz4KLSAgICA8L3BoYXNlT3JkZXI+Ci0gICAgPHBoYXNlT3JkZXIgdHlwZT0iT3V0RmxvdyI+Ci0gICAgICAgIDwhLS0gICAgICB1c2VyIGNhbiBhZGQgaGlzIG93biBwaGFzZXMgdG8gdGhpcyBhcmVhICAtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9InNvYXBtb25pdG9yUGhhc2UiLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik9wZXJhdGlvbk91dFBoYXNlIi8+Ci0gICAgICAgIDwhLS1zeXN0ZW0gcHJlZGVmaW5lZCBwaGFzZS0tPgotICAgICAgICA8IS0tdGhlc2UgcGhhc2Ugd2lsbCBydW4gaXJyZXNwZWN0aXZlIG9mIHRoZSBzZXJ2aWNlLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJSTVBoYXNlIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJQb2xpY3lEZXRlcm1pbmF0aW9uIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJNZXNzYWdlT3V0Ii8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJTZWN1cml0eSIvPgotICAgIDwvcGhhc2VPcmRlcj4KLSAgICA8cGhhc2VPcmRlciB0eXBlPSJJbkZhdWx0RmxvdyI+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJBZGRyZXNzaW5nIj4KLSAgICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJBZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciI+Ci0gICAgICAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iQWRkcmVzc2luZyIvPgotICAgICAgICAgICAgPC9oYW5kbGVyPgotICAgICAgICA8L3BoYXNlPgotICAgICAgICA8cGhhc2UgbmFtZT0iU2VjdXJpdHkiLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlByZURpc3BhdGNoIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJEaXNwYXRjaCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkRpc3BhdGNoUGhhc2UiPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiLz4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIi8+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJSZXF1ZXN0VVJJT3BlcmF0aW9uRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklPcGVyYXRpb25EaXNwYXRjaGVyIi8+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiLz4KLQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iSFRUUExvY2F0aW9uQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuSFRUUExvY2F0aW9uQmFzZWREaXNwYXRjaGVyIi8+Ci0gICAgICAgIDwvcGhhc2U+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJSTVBoYXNlIi8+Ci0gICAgICAgIDwhLS0gICAgICB1c2VyIGNhbiBhZGQgaGlzIG93biBwaGFzZXMgdG8gdGhpcyBhcmVhICAtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik9wZXJhdGlvbkluRmF1bHRQaGFzZSIvPgotICAgICAgICA8cGhhc2UgbmFtZT0ic29hcG1vbml0b3JQaGFzZSIvPgotICAgIDwvcGhhc2VPcmRlcj4KLSAgICA8cGhhc2VPcmRlciB0eXBlPSJPdXRGYXVsdEZsb3ciPgotICAgICAgICA8IS0tICAgICAgdXNlciBjYW4gYWRkIGhpcyBvd24gcGhhc2VzIHRvIHRoaXMgYXJlYSAgLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJzb2FwbW9uaXRvclBoYXNlIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJPcGVyYXRpb25PdXRGYXVsdFBoYXNlIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJSTVBoYXNlIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJQb2xpY3lEZXRlcm1pbmF0aW9uIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJNZXNzYWdlT3V0Ii8+Ci0gICAgPC9waGFzZU9yZGVyPgotPC9heGlzY29uZmlnPgotCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3VzZXJndWlkZS9zcmMvdXNlcmd1aWRlL2NsaWVudHMvQ2xpZW50Rm9yV2ViU2VydmljZVdpdGhNb2R1bGUuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvdXNlcmd1aWRlL3NyYy91c2VyZ3VpZGUvY2xpZW50cy9DbGllbnRGb3JXZWJTZXJ2aWNlV2l0aE1vZHVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGE1YWQ0Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvdXNlcmd1aWRlL3NyYy91c2VyZ3VpZGUvY2xpZW50cy9DbGllbnRGb3JXZWJTZXJ2aWNlV2l0aE1vZHVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSB1c2VyZ3VpZGUuY2xpZW50czsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5PcHRpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50LlNlcnZpY2VDbGllbnQ7Ci0KLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTE91dHB1dEZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBDbGllbnRGb3JXZWJTZXJ2aWNlV2l0aE1vZHVsZSB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgRW5kcG9pbnRSZWZlcmVuY2UgdGFyZ2V0RVBSID0gbmV3IEVuZHBvaW50UmVmZXJlbmNlKCJodHRwOi8vMTI3LjAuMC4xOjgwODAvYXhpczIvc2VydmljZXMvTXlTZXJ2aWNlV2l0aE1vZHVsZSIpOwotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgT01FbGVtZW50IHBheWxvYWQgPSBDbGllbnRVdGlsLmdldEVjaG9PTUVsZW1lbnQoKTsKLSAgICAgICAgICAgIE9wdGlvbnMgb3B0aW9ucyA9IG5ldyBPcHRpb25zKCk7Ci0gICAgICAgICAgICBvcHRpb25zLnNldFRvKHRhcmdldEVQUik7Ci0gICAgICAgICAgICBvcHRpb25zLnNldEFjdGlvbigidXJuOmVjaG8iKTsKLSAgICAgICAgICAgIG9wdGlvbnMuc2V0VHJhbnNwb3J0SW5Qcm90b2NvbChDb25zdGFudHMuVFJBTlNQT1JUX0hUVFApOwotICAgICAgICAgICAgU2VydmljZUNsaWVudCBzZW5kZXIgPSBuZXcgU2VydmljZUNsaWVudCgpOwotICAgICAgICAgICAgc2VuZGVyLnNldE9wdGlvbnMob3B0aW9ucyk7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgcmVzdWx0ID0gc2VuZGVyLnNlbmRSZWNlaXZlKHBheWxvYWQpOwotCi0KLSAgICAgICAgICAgIFN0cmluZ1dyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgICAgICAgICByZXN1bHQuc2VyaWFsaXplKFhNTE91dHB1dEZhY3RvcnkubmV3SW5zdGFuY2UoKQotICAgICAgICAgICAgICAgICAgICAuY3JlYXRlWE1MU3RyZWFtV3JpdGVyKHdyaXRlcikpOwotICAgICAgICAgICAgd3JpdGVyLmZsdXNoKCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4od3JpdGVyLnRvU3RyaW5nKCkpOwotCi0KLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGF4aXNGYXVsdCkgewotICAgICAgICAgICAgYXhpc0ZhdWx0LnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvdXNlcmd1aWRlL3NyYy91c2VyZ3VpZGUvY2xpZW50cy9DbGllbnRTaWRlTW9kdWxlRW5nYWdlbWVudC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy91c2VyZ3VpZGUvc3JjL3VzZXJndWlkZS9jbGllbnRzL0NsaWVudFNpZGVNb2R1bGVFbmdhZ2VtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzYjQ3MzQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy91c2VyZ3VpZGUvc3JjL3VzZXJndWlkZS9jbGllbnRzL0NsaWVudFNpZGVNb2R1bGVFbmdhZ2VtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSB1c2VyZ3VpZGUuY2xpZW50czsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50LlNlcnZpY2VDbGllbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dEZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBTYW1wbGUgZm9yIGVuZ2FnZWQgbW9kdWxlcyBpbiBDbGllbnQgc2lkZS4KLSAqIExvZ2dpbmcgbW9kdWxlIGhhcyBiZWVuIHVzZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBDbGllbnRTaWRlTW9kdWxlRW5nYWdlbWVudCB7Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBob21lID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmhvbWUiKTsKLSAgICAgICAgLy8gY3JlYXRlIHRoaXMgZm9sZGVyIGF0IHlvdXIgaG9tZS4gVGhpcyBmb2xkZXIgY291bGQgYmUgYW55dGhpbmcKLSAgICAgICAgLy90aGVuIGNyZWF0ZSB0aGUgIm1vZHVsZXMiIGZvbGRlcgotCi0gICAgICAgIEZpbGUgcmVwb3NpdG9yeSA9IG5ldyBGaWxlKGhvbWUgKyBGaWxlLnNlcGFyYXRvciArICJjbGllbnQtcmVwb3NpdG9yeSIpOwotICAgICAgICBpZiAoIXJlcG9zaXRvcnkuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oIlJlcG9zaXRvcnkgRG9lc25vdCBFeGlzdCIpOwotICAgICAgICB9Ci0gICAgICAgIC8vY29weSB0aGUgTG9nZ2luZ01vZHVsZS5tYXIgdG8gIm1vZHVsZXMiIGZvbGRlci4KLSAgICAgICAgLy90aGVuIG1vZGlmeSB0aGUgYXhpczIueG1sIHRoYXQgaXMgZ2VuZXJhdGluZyB0aGVyZSBhY2NvcmRpbmcgdG8KLSAgICAgICAgLy9waGFzZXMgdGhhdCBiZWluZyBpbmNsdWRlZCBpbiB0aGUgIm1vZHVsZS54bWwiCi0gICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQgPSBDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkuCi0gICAgICAgICAgICAgICAgY3JlYXRlQ29uZmlndXJhdGlvbkNvbnRleHRGcm9tRmlsZVN5c3RlbShyZXBvc2l0b3J5LmdldEFic29sdXRlUGF0aCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3NpdG9yeS5nZXROYW1lKCkgKyAiL2F4aXMyLnhtbCIpOwotICAgICAgICBTZXJ2aWNlQ2xpZW50IHNlcnZpY2VDbGllbnQgPSBuZXcgU2VydmljZUNsaWVudChjb25maWdDb250ZXh0LCBudWxsKTsKLSAgICAgICAgc2VydmljZUNsaWVudC5lbmdhZ2VNb2R1bGUoIkxvZ2dpbmdNb2R1bGUiKTsKLSAgICB9Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy91c2VyZ3VpZGUvc3JjL3VzZXJndWlkZS9jbGllbnRzL0NsaWVudFV0aWwuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvdXNlcmd1aWRlL3NyYy91c2VyZ3VpZGUvY2xpZW50cy9DbGllbnRVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwMDJmMWUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy91c2VyZ3VpZGUvc3JjL3VzZXJndWlkZS9jbGllbnRzL0NsaWVudFV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgdXNlcmd1aWRlLmNsaWVudHM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01OYW1lc3BhY2U7Ci0KLXB1YmxpYyBjbGFzcyBDbGllbnRVdGlsIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgT01FbGVtZW50IGdldEVjaG9PTUVsZW1lbnQoKSB7Ci0gICAgICAgIE9NRmFjdG9yeSBmYWMgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKTsKLSAgICAgICAgT01OYW1lc3BhY2Ugb21OcyA9IGZhYy5jcmVhdGVPTU5hbWVzcGFjZSgKLSAgICAgICAgICAgICAgICAiaHR0cDovL2V4YW1wbGUxLm9yZy9leGFtcGxlMSIsICJleGFtcGxlMSIpOwotICAgICAgICBPTUVsZW1lbnQgbWV0aG9kID0gZmFjLmNyZWF0ZU9NRWxlbWVudCgiZWNobyIsIG9tTnMpOwotICAgICAgICBPTUVsZW1lbnQgdmFsdWUgPSBmYWMuY3JlYXRlT01FbGVtZW50KCJUZXh0Iiwgb21Ocyk7Ci0gICAgICAgIHZhbHVlLmFkZENoaWxkKGZhYy5jcmVhdGVPTVRleHQodmFsdWUsICJBeGlzMiBFY2hvIFN0cmluZyAiKSk7Ci0gICAgICAgIG1ldGhvZC5hZGRDaGlsZCh2YWx1ZSk7Ci0KLSAgICAgICAgcmV0dXJuIG1ldGhvZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9NRWxlbWVudCBnZXRQaW5nT01FbGVtZW50KCkgewotICAgICAgICBPTUZhY3RvcnkgZmFjID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCk7Ci0gICAgICAgIE9NTmFtZXNwYWNlIG9tTnMgPSBmYWMuY3JlYXRlT01OYW1lc3BhY2UoCi0gICAgICAgICAgICAgICAgImh0dHA6Ly9leGFtcGxlMS5vcmcvZXhhbXBsZTEiLCAiZXhhbXBsZTEiKTsKLSAgICAgICAgT01FbGVtZW50IG1ldGhvZCA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoInBpbmciLCBvbU5zKTsKLSAgICAgICAgT01FbGVtZW50IHZhbHVlID0gZmFjLmNyZWF0ZU9NRWxlbWVudCgiVGV4dCIsIG9tTnMpOwotICAgICAgICB2YWx1ZS5hZGRDaGlsZChmYWMuY3JlYXRlT01UZXh0KHZhbHVlLCAiQXhpczIgUGluZyBTdHJpbmcgIikpOwotICAgICAgICBtZXRob2QuYWRkQ2hpbGQodmFsdWUpOwotCi0gICAgICAgIHJldHVybiBtZXRob2Q7Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvdXNlcmd1aWRlL3NyYy91c2VyZ3VpZGUvY2xpZW50cy9FY2hvQmxvY2tpbmdDbGllbnQuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvdXNlcmd1aWRlL3NyYy91c2VyZ3VpZGUvY2xpZW50cy9FY2hvQmxvY2tpbmdDbGllbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODAxN2UzMi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3VzZXJndWlkZS9zcmMvdXNlcmd1aWRlL2NsaWVudHMvRWNob0Jsb2NraW5nQ2xpZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLXBhY2thZ2UgdXNlcmd1aWRlLmNsaWVudHM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuT3B0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5TZXJ2aWNlQ2xpZW50OwotCi0vKioKLSAqIFNhbXBsZSBmb3Igc3luY2hyb25vdXMgc2luZ2xlIGNoYW5uZWwgYmxvY2tpbmcgc2VydmljZSBpbnZvY2F0aW9uLgotICogTWVzc2FnZSBFeGNoYWdlIFBhdHRlcm4gSU4tT1VUCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2hvQmxvY2tpbmdDbGllbnQgewotICAgIHByaXZhdGUgc3RhdGljIEVuZHBvaW50UmVmZXJlbmNlIHRhcmdldEVQUiA9IG5ldyBFbmRwb2ludFJlZmVyZW5jZSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2F4aXMyL3NlcnZpY2VzL015U2VydmljZSIpOwotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgT01FbGVtZW50IHBheWxvYWQgPSBDbGllbnRVdGlsLmdldEVjaG9PTUVsZW1lbnQoKTsKLSAgICAgICAgICAgIE9wdGlvbnMgb3B0aW9ucyA9IG5ldyBPcHRpb25zKCk7Ci0gICAgICAgICAgICBvcHRpb25zLnNldFRvKHRhcmdldEVQUik7Ci0gICAgICAgICAgICBvcHRpb25zLnNldEFjdGlvbigidXJuOmVjaG8iKTsKLQotICAgICAgICAgICAgLy9CbG9ja2luZyBpbnZvY2F0aW9uCi0gICAgICAgICAgICBTZXJ2aWNlQ2xpZW50IHNlbmRlciA9IG5ldyBTZXJ2aWNlQ2xpZW50KCk7Ci0gICAgICAgICAgICBzZW5kZXIuc2V0T3B0aW9ucyhvcHRpb25zKTsKLSAgICAgICAgICAgIE9NRWxlbWVudCByZXN1bHQgPSBzZW5kZXIuc2VuZFJlY2VpdmUocGF5bG9hZCk7Ci0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihyZXN1bHQpOwotCi0gICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBheGlzRmF1bHQpIHsKLSAgICAgICAgICAgIGF4aXNGYXVsdC5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvdXNlcmd1aWRlL3NyYy91c2VyZ3VpZGUvY2xpZW50cy9FY2hvQmxvY2tpbmdEdWFsQ2xpZW50LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3VzZXJndWlkZS9zcmMvdXNlcmd1aWRlL2NsaWVudHMvRWNob0Jsb2NraW5nRHVhbENsaWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzVlZjM5Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvdXNlcmd1aWRlL3NyYy91c2VyZ3VpZGUvY2xpZW50cy9FY2hvQmxvY2tpbmdEdWFsQ2xpZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIHVzZXJndWlkZS5jbGllbnRzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50Lk9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuU2VydmljZUNsaWVudDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxPdXRwdXRGYWN0b3J5OwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotCi0vKioKLSAqIFNhbXBsZSBmb3Igc3luY2hyb25vdXMgZHVhbCBjaGFubmVsIGJsb2NraW5nIHNlcnZpY2UgaW52b2NhdGlvbi4KLSAqIE1lc3NhZ2UgRXhjaGFnZSBQYXR0ZXJuIElOLU9VVAotICovCi1wdWJsaWMgY2xhc3MgRWNob0Jsb2NraW5nRHVhbENsaWVudCB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgRW5kcG9pbnRSZWZlcmVuY2UgdGFyZ2V0RVBSID0gbmV3IEVuZHBvaW50UmVmZXJlbmNlKCJodHRwOi8vMTI3LjAuMC4xOjgwODAvYXhpczIvc2VydmljZXMvTXlTZXJ2aWNlIik7Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0gICAgICAgIFNlcnZpY2VDbGllbnQgc2VuZGVyID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBwYXlsb2FkID0gQ2xpZW50VXRpbC5nZXRFY2hvT01FbGVtZW50KCk7Ci0gICAgICAgICAgICBPcHRpb25zIG9wdGlvbnMgPSBuZXcgT3B0aW9ucygpOwotICAgICAgICAgICAgb3B0aW9ucy5zZXRUbyh0YXJnZXRFUFIpOwotICAgICAgICAgICAgb3B0aW9ucy5zZXRBY3Rpb24oInVybjplY2hvIik7Ci0gICAgICAgICAgICAvL1RoZSBib29sZWFuIGZsYWcgaW5mb3JtcyB0aGUgYXhpczIgZW5naW5lIHRvIHVzZSB0d28gc2VwYXJhdGUgdHJhbnNwb3J0IGNvbm5lY3Rpb24KLSAgICAgICAgICAgIC8vdG8gcmV0cmlldmUgdGhlIHJlc3BvbnNlLgotICAgICAgICAgICAgb3B0aW9ucy5zZXRUcmFuc3BvcnRJblByb3RvY29sKENvbnN0YW50cy5UUkFOU1BPUlRfSFRUUCk7Ci0gICAgICAgICAgICBvcHRpb25zLnNldFVzZVNlcGFyYXRlTGlzdGVuZXIodHJ1ZSk7Ci0KLSAgICAgICAgICAgIC8vQmxvY2tpbmcgSW52b2NhdGlvbgotICAgICAgICAgICAgc2VuZGVyID0gbmV3IFNlcnZpY2VDbGllbnQoKTsKLSAgICAgICAgICAgIHNlbmRlci5lbmdhZ2VNb2R1bGUoQ29uc3RhbnRzLk1PRFVMRV9BRERSRVNTSU5HKTsKLSAgICAgICAgICAgIHNlbmRlci5zZXRPcHRpb25zKG9wdGlvbnMpOwotICAgICAgICAgICAgT01FbGVtZW50IHJlc3VsdCA9IHNlbmRlci5zZW5kUmVjZWl2ZShwYXlsb2FkKTsKLQotICAgICAgICAgICAgU3RyaW5nV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICAgICAgICAgIHJlc3VsdC5zZXJpYWxpemUoWE1MT3V0cHV0RmFjdG9yeS5uZXdJbnN0YW5jZSgpCi0gICAgICAgICAgICAgICAgICAgIC5jcmVhdGVYTUxTdHJlYW1Xcml0ZXIod3JpdGVyKSk7Ci0gICAgICAgICAgICB3cml0ZXIuZmx1c2goKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbih3cml0ZXIudG9TdHJpbmcoKSk7Ci0KLSAgICAgICAgICAgIC8vTmVlZCB0byBjbG9zZSB0aGUgQ2xpZW50IFNpZGUgTGlzdGVuZXIuCi0KLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGF4aXNGYXVsdCkgewotICAgICAgICAgICAgYXhpc0ZhdWx0LnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIGV4LnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9IGZpbmFsbHl7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHNlbmRlci5jbGVhbnVwKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgYXhpc0ZhdWx0KSB7Ci0gICAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy91c2VyZ3VpZGUvc3JjL3VzZXJndWlkZS9jbGllbnRzL0VjaG9CbG9ja2luZ1dzYUJhc2VkQ2xpZW50LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3VzZXJndWlkZS9zcmMvdXNlcmd1aWRlL2NsaWVudHMvRWNob0Jsb2NraW5nV3NhQmFzZWRDbGllbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZkMmMzYS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3VzZXJndWlkZS9zcmMvdXNlcmd1aWRlL2NsaWVudHMvRWNob0Jsb2NraW5nV3NhQmFzZWRDbGllbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIHVzZXJndWlkZS5jbGllbnRzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5PcHRpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50LlNlcnZpY2VDbGllbnQ7Ci0KLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLQotLyoqCi0gKiBUbyBydW4gdGhpcyBzYW1wbGUgeW91IGhhdmUgdG8gZGVwbG95IFdzYU1hcHBpbmdTZXJ2aWNlLmFhciB0byB0aGUKLSAqIHNlcnZpY2UgZm9sZGVyLgotICovCi1wdWJsaWMgY2xhc3MgRWNob0Jsb2NraW5nV3NhQmFzZWRDbGllbnQgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgRW5kcG9pbnRSZWZlcmVuY2UgdGFyZ2V0RVBSID0gbmV3IEVuZHBvaW50UmVmZXJlbmNlKCJodHRwOi8vbG9jYWxob3N0OjgwODAvYXhpczIvc2VydmljZXMvV3NhTWFwcGluZ1Rlc3QiKTsKLQotICAgIHByaXZhdGUgc3RhdGljIE9NRWxlbWVudCBnZXRCb2R5KCkgewotICAgICAgICBPTUZhY3RvcnkgZmFjID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCk7Ci0gICAgICAgIE9NTmFtZXNwYWNlIG9tTnMgPSBmYWMKLSAgICAgICAgICAgICAgICAuY3JlYXRlT01OYW1lc3BhY2UoImh0dHA6Ly9leGFtcGxlMS5vcmcvZXhhbXBsZTEiLCAiZXhhbXBsZTEiKTsKLSAgICAgICAgT01FbGVtZW50IGlkID0gZmFjLmNyZWF0ZU9NRWxlbWVudCgiaWQiLCBvbU5zKTsKLSAgICAgICAgaWQuYWRkQ2hpbGQoZmFjLmNyZWF0ZU9NVGV4dChpZCwgIkF4aXMyIikpOwotICAgICAgICByZXR1cm4gaWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE9wdGlvbnMgb3B0aW9ucyA9IG5ldyBPcHRpb25zKCk7Ci0gICAgICAgIG9wdGlvbnMuc2V0VG8odGFyZ2V0RVBSKTsKLSAgICAgICAgb3B0aW9ucy5zZXRUcmFuc3BvcnRJblByb3RvY29sKENvbnN0YW50cy5UUkFOU1BPUlRfSFRUUCk7Ci0KLSAgICAgICAgLy9CbG9ja2luZyBpbnZvY2F0aW9uIHZpYSB3c2EgbWFwcGluZwotICAgICAgICBvcHRpb25zLnNldEFjdGlvbigidXJuOmVjaG8iKTsKLQotICAgICAgICBTZXJ2aWNlQ2xpZW50IHNlbmRlciA9IG5ldyBTZXJ2aWNlQ2xpZW50KCk7Ci0gICAgICAgIHNlbmRlci5zZXRPcHRpb25zKG9wdGlvbnMpOwotICAgICAgICBPTUVsZW1lbnQgcmVzdWx0ID0gc2VuZGVyLnNlbmRSZWNlaXZlKGdldEJvZHkoKSk7Ci0KLSAgICAgICAgU3RyaW5nV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICAgICAgcmVzdWx0LnNlcmlhbGl6ZSh3cml0ZXIpOwotICAgICAgICB3cml0ZXIuZmx1c2goKTsKLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4od3JpdGVyLnRvU3RyaW5nKCkpOwotCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy91c2VyZ3VpZGUvc3JjL3VzZXJndWlkZS9jbGllbnRzL0VjaG9Ob25CbG9ja2luZ0NsaWVudC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy91c2VyZ3VpZGUvc3JjL3VzZXJndWlkZS9jbGllbnRzL0VjaG9Ob25CbG9ja2luZ0NsaWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWU3OGU2Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvdXNlcmd1aWRlL3NyYy91c2VyZ3VpZGUvY2xpZW50cy9FY2hvTm9uQmxvY2tpbmdDbGllbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotcGFja2FnZSB1c2VyZ3VpZGUuY2xpZW50czsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5PcHRpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50LlNlcnZpY2VDbGllbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuYXN5bmMuQXN5bmNSZXN1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuYXN5bmMuQ2FsbGJhY2s7Ci0KLS8qKgotICogU2FtcGxlIGZvciBhc3luY2hyb25vdXMgc2luZ2xlIGNoYW5uZWwgbm9uLWJsb2NraW5nIHNlcnZpY2UgaW52b2NhdGlvbi4KLSAqIE1lc3NhZ2UgRXhjaGFnZSBQYXR0ZXJuIElOLU9VVAotICovCi1wdWJsaWMgY2xhc3MgRWNob05vbkJsb2NraW5nQ2xpZW50IHsKLSAgICBwcml2YXRlIHN0YXRpYyBFbmRwb2ludFJlZmVyZW5jZSB0YXJnZXRFUFIgPSBuZXcgRW5kcG9pbnRSZWZlcmVuY2UoImh0dHA6Ly8xMjcuMC4wLjE6ODA4MC9heGlzMi9zZXJ2aWNlcy9NeVNlcnZpY2UiKTsKLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgU2VydmljZUNsaWVudCBzZW5kZXIgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgT01FbGVtZW50IHBheWxvYWQgPSBDbGllbnRVdGlsLmdldEVjaG9PTUVsZW1lbnQoKTsKLSAgICAgICAgICAgIE9wdGlvbnMgb3B0aW9ucyA9IG5ldyBPcHRpb25zKCk7Ci0gICAgICAgICAgICBvcHRpb25zLnNldFRvKHRhcmdldEVQUik7Ci0gICAgICAgICAgICBvcHRpb25zLnNldEFjdGlvbigidXJuOmVjaG8iKTsKLQotICAgICAgICAgICAgLy9DYWxsYmFjayB0byBoYW5kbGUgdGhlIHJlc3BvbnNlCi0gICAgICAgICAgICBDYWxsYmFjayBjYWxsYmFjayA9IG5ldyBDYWxsYmFjaygpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNvbXBsZXRlKEFzeW5jUmVzdWx0IHJlc3VsdCkgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4ocmVzdWx0LmdldFJlc3BvbnNlRW52ZWxvcGUoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25FcnJvcihFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH07Ci0KLSAgICAgICAgICAgIC8vTm9uLUJsb2NraW5nIEludm9jYXRpb24KLSAgICAgICAgICAgIHNlbmRlciA9IG5ldyBTZXJ2aWNlQ2xpZW50KCk7Ci0gICAgICAgICAgICBzZW5kZXIuc2V0T3B0aW9ucyhvcHRpb25zKTsKLSAgICAgICAgICAgIHNlbmRlci5zZW5kUmVjZWl2ZU5vbkJsb2NraW5nKHBheWxvYWQsIGNhbGxiYWNrKTsKLQotICAgICAgICAgICAgLy9XYWl0IHRpbGwgdGhlIGNhbGxiYWNrIHJlY2VpdmVzIHRoZSByZXNwb25zZS4KLSAgICAgICAgICAgIHdoaWxlICghY2FsbGJhY2suaXNDb21wbGV0ZSgpKSB7Ci0gICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDApOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBheGlzRmF1bHQpIHsKLSAgICAgICAgICAgIGF4aXNGYXVsdC5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBleC5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgc2VuZGVyLmNsZWFudXAoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBheGlzRmF1bHQpIHsKLSAgICAgICAgICAgICAgICAvLwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3VzZXJndWlkZS9zcmMvdXNlcmd1aWRlL2NsaWVudHMvRWNob05vbkJsb2NraW5nRHVhbENsaWVudC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy91c2VyZ3VpZGUvc3JjL3VzZXJndWlkZS9jbGllbnRzL0VjaG9Ob25CbG9ja2luZ0R1YWxDbGllbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y1YTVhZC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3VzZXJndWlkZS9zcmMvdXNlcmd1aWRlL2NsaWVudHMvRWNob05vbkJsb2NraW5nRHVhbENsaWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIHVzZXJndWlkZS5jbGllbnRzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50Lk9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuU2VydmljZUNsaWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5hc3luYy5Bc3luY1Jlc3VsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5hc3luYy5DYWxsYmFjazsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLS8qKgotICogU2FtcGxlIGZvciBhc3luY2hyb25vdXMgZHVhbCBjaGFubmVsIG5vbi1ibG9ja2luZyBzZXJ2aWNlIGludm9jYXRpb24uCi0gKiBNZXNzYWdlIEV4Y2hhZ2UgUGF0dGVybiBJTi1PVVQKLSAqIFVsaXRtYXRlIGFzeW5jaHJvbm91cyBzZXJ2aWNlIGludm9jYXRpb24gc2FtcGxlLgotICovCi1wdWJsaWMgY2xhc3MgRWNob05vbkJsb2NraW5nRHVhbENsaWVudCB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgRW5kcG9pbnRSZWZlcmVuY2UgdGFyZ2V0RVBSID0gbmV3IEVuZHBvaW50UmVmZXJlbmNlKCJodHRwOi8vMTI3LjAuMC4xOjgwODAvYXhpczIvc2VydmljZXMvTXlTZXJ2aWNlIik7Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0gICAgICAgIFNlcnZpY2VDbGllbnQgc2VuZGVyID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBwYXlsb2FkID0gQ2xpZW50VXRpbC5nZXRFY2hvT01FbGVtZW50KCk7Ci0KLSAgICAgICAgICAgIE9wdGlvbnMgb3B0aW9ucyA9IG5ldyBPcHRpb25zKCk7Ci0gICAgICAgICAgICBvcHRpb25zLnNldFRvKHRhcmdldEVQUik7Ci0gICAgICAgICAgICBvcHRpb25zLnNldEFjdGlvbigidXJuOmVjaG8iKTsKLSAgICAgICAgICAgIG9wdGlvbnMuc2V0VHJhbnNwb3J0SW5Qcm90b2NvbChDb25zdGFudHMuVFJBTlNQT1JUX0hUVFApOwotICAgICAgICAgICAgb3B0aW9ucy5zZXRVc2VTZXBhcmF0ZUxpc3RlbmVyKHRydWUpOwotICAgICAgICAgICAgb3B0aW9ucy5zZXRBY3Rpb24oInVybjplY2hvIik7ICAvLyB0aGlzIGlzIHRoZSBhY3Rpb24gbWFwcGluZyB3ZSBwdXQgd2l0aGluIHRoZSBzZXJ2aWNlLnhtbAotCi0gICAgICAgICAgICAvL0NhbGxiYWNrIHRvIGhhbmRsZSB0aGUgcmVzcG9uc2UKLSAgICAgICAgICAgIENhbGxiYWNrIGNhbGxiYWNrID0gbmV3IENhbGxiYWNrKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ29tcGxldGUoQXN5bmNSZXN1bHQgcmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihyZXN1bHQuZ2V0UmVzcG9uc2VFbnZlbG9wZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkVycm9yKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLQotICAgICAgICAgICAgLy9Ob24tQmxvY2tpbmcgSW52b2NhdGlvbgotICAgICAgICAgICAgc2VuZGVyID0gbmV3IFNlcnZpY2VDbGllbnQoKTsKLSAgICAgICAgICAgIHNlbmRlci5lbmdhZ2VNb2R1bGUoQ29uc3RhbnRzLk1PRFVMRV9BRERSRVNTSU5HKTsKLSAgICAgICAgICAgIHNlbmRlci5zZXRPcHRpb25zKG9wdGlvbnMpOwotICAgICAgICAgICAgc2VuZGVyLnNlbmRSZWNlaXZlTm9uQmxvY2tpbmcocGF5bG9hZCwgY2FsbGJhY2spOwotCi0gICAgICAgICAgICAvL1dhaXQgdGlsbCB0aGUgY2FsbGJhY2sgcmVjZWl2ZXMgdGhlIHJlc3BvbnNlLgotICAgICAgICAgICAgd2hpbGUgKCFjYWxsYmFjay5pc0NvbXBsZXRlKCkpIHsKLSAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvL05lZWQgdG8gY2xvc2UgdGhlIENsaWVudCBTaWRlIExpc3RlbmVyLgotCi0gICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBheGlzRmF1bHQpIHsKLSAgICAgICAgICAgIGF4aXNGYXVsdC5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBleC5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgc2VuZGVyLmNsZWFudXAoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBheGlzRmF1bHQpIHsKLSAgICAgICAgICAgICAgICAvL2hhdmUgdG8gaWdub3JlIHRoaXMKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy91c2VyZ3VpZGUvc3JjL3VzZXJndWlkZS9jbGllbnRzL01haWxDbGllbnQuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvdXNlcmd1aWRlL3NyYy91c2VyZ3VpZGUvY2xpZW50cy9NYWlsQ2xpZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmYzFkZDIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy91c2VyZ3VpZGUvc3JjL3VzZXJndWlkZS9jbGllbnRzL01haWxDbGllbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgdXNlcmd1aWRlLmNsaWVudHM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01OYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50Lk9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuU2VydmljZUNsaWVudDsKLQotLyoqCi0gKiBUaGlzIGlzIGEgQ2xpZW50IHByb2dhbSB0aGF0IGFjY2Vzc2VzICdNeVNlcnZpY2UnIHdlYiBzZXJ2aWNlIGluIEF4aXMyIHNhbXBsZXMKLSAqIEBkZXByZWNhdGVkIAotICovCi1wdWJsaWMgY2xhc3MgTWFpbENsaWVudCB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgdG9FcHIgPSAiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2F4aXMyL3NlcnZpY2VzL215c2VydmljZSI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgT3B0aW9ucyBvcHRpb25zID0gbmV3IE9wdGlvbnMoKTsKLSAgICAgICAgb3B0aW9ucy5zZXRUbygKLSAgICAgICAgICAgICAgICBuZXcgRW5kcG9pbnRSZWZlcmVuY2UodG9FcHIpKTsKLSAgICAgICAgb3B0aW9ucy5zZXRBY3Rpb24oInVybjplY2hvIik7Ci0gICAgICAgIFNlcnZpY2VDbGllbnQgc2VydmljQ2xpZW50ID0gbmV3IFNlcnZpY2VDbGllbnQoKTsKLQotICAgICAgICBzZXJ2aWNDbGllbnQuc2V0T3B0aW9ucyhvcHRpb25zKTsKLQotICAgICAgICBzZXJ2aWNDbGllbnQuc2VuZFJvYnVzdChnZXRQYXlsb2FkKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIE9NRWxlbWVudCBnZXRQYXlsb2FkKCkgewotICAgICAgICBPTUZhY3RvcnkgZmFjID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCk7Ci0gICAgICAgIE9NTmFtZXNwYWNlIG9tTnMgPSBmYWMuY3JlYXRlT01OYW1lc3BhY2UoCi0gICAgICAgICAgICAgICAgImh0dHA6Ly9leGFtcGxlMS5vcmcvZXhhbXBsZTEiLCAiZXhhbXBsZTEiKTsKLSAgICAgICAgT01FbGVtZW50IG1ldGhvZCA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoImVjaG8iLCBvbU5zKTsKLSAgICAgICAgT01FbGVtZW50IHZhbHVlID0gZmFjLmNyZWF0ZU9NRWxlbWVudCgiVGV4dCIsIG9tTnMpOwotICAgICAgICB2YWx1ZS5hZGRDaGlsZChmYWMuY3JlYXRlT01UZXh0KHZhbHVlLCAiQXhpczIgRWNobyBTdHJpbmcgIikpOwotICAgICAgICBtZXRob2QuYWRkQ2hpbGQodmFsdWUpOwotCi0gICAgICAgIHJldHVybiBtZXRob2Q7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy91c2VyZ3VpZGUvc3JjL3VzZXJndWlkZS9jbGllbnRzL1BpbmdDbGllbnQuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvdXNlcmd1aWRlL3NyYy91c2VyZ3VpZGUvY2xpZW50cy9QaW5nQ2xpZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5ZGVhODcuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy91c2VyZ3VpZGUvc3JjL3VzZXJndWlkZS9jbGllbnRzL1BpbmdDbGllbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIHVzZXJndWlkZS5jbGllbnRzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50Lk9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuU2VydmljZUNsaWVudDsKLQotLyoqCi0gKiBTYW1wbGUgZm9yIGZpcmUtYW5kLWZvcmdldCBzZXJ2aWNlIGludm9jYXRpb24KLSAqIE1lc3NhZ2UgRXhjaGFnZSBQYXR0ZXJuIElOLU9ubHkKLSAqLwotcHVibGljIGNsYXNzIFBpbmdDbGllbnQgewotICAgIHByaXZhdGUgc3RhdGljIEVuZHBvaW50UmVmZXJlbmNlIHRhcmdldEVQUiA9IG5ldyBFbmRwb2ludFJlZmVyZW5jZSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2F4aXMyL3NlcnZpY2VzL015U2VydmljZSIpOwotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgT01FbGVtZW50IHBheWxvYWQgPSBDbGllbnRVdGlsLmdldFBpbmdPTUVsZW1lbnQoKTsKLSAgICAgICAgICAgIFNlcnZpY2VDbGllbnQgc2VydmljZUNsaWVudCA9IG5ldyBTZXJ2aWNlQ2xpZW50KCk7Ci0KLSAgICAgICAgICAgIE9wdGlvbnMgb3B0aW9ucyA9IG5ldyBPcHRpb25zKCk7Ci0gICAgICAgICAgICBzZXJ2aWNlQ2xpZW50LnNldE9wdGlvbnMob3B0aW9ucyk7Ci0gICAgICAgICAgICBvcHRpb25zLnNldFRvKHRhcmdldEVQUik7Ci0gICAgICAgICAgICBvcHRpb25zLnNldEFjdGlvbigidXJuOnBpbmciKTsKLQotICAgICAgICAgICAgc2VydmljZUNsaWVudC5maXJlQW5kRm9yZ2V0KHBheWxvYWQpOwotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBXZSBoYXZlIHRvIGJvY2sgdGhpcyB0aHJlYWQgdW50aWxsIHdlIHNlbmQgdGhlIHJlcXVlc3QgLCB0aGUgcHJvYmxlbQotICAgICAgICAgICAgICogaXMgaWYgd2UgZ28gb3V0IG9mIHRoZSBtYWluIHRocmVhZCAsIHRoZW4gcmVxdWVzdCB3b250IHNlbmQgLHNvCi0gICAgICAgICAgICAgKiB5b3UgaGF2ZSB0byB3YWl0IHNvbWUgdGltZSA6KQotICAgICAgICAgICAgICovCi0gICAgICAgICAgVGhyZWFkLnNsZWVwKDUwMCk7Ci0KLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGF4aXNGYXVsdCkgewotICAgICAgICAgICAgYXhpc0ZhdWx0LnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3VzZXJndWlkZS9zcmMvdXNlcmd1aWRlL2NsaWVudHMvUkVTVENsaWVudC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy91c2VyZ3VpZGUvc3JjL3VzZXJndWlkZS9jbGllbnRzL1JFU1RDbGllbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDMxYzFjMi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3VzZXJndWlkZS9zcmMvdXNlcmd1aWRlL2NsaWVudHMvUkVTVENsaWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSB1c2VyZ3VpZGUuY2xpZW50czsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuT3B0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5TZXJ2aWNlQ2xpZW50OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLkZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3I7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxPdXRwdXRGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyOwotCi0vKioKLSAqIFRoaXMgaXMgYSBDbGllbnQgcHJvZ2FtIHRoYXQgYWNjZXNzZXMgJ015U2VydmljZScgd2ViIHNlcnZpY2UgaW4gQXhpczIgc2FtcGxlcwotICovCi1wdWJsaWMgY2xhc3MgUkVTVENsaWVudCB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgdG9FcHIgPSAiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2F4aXMyL3NlcnZpY2VzL015U2VydmljZSI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLQotICAgICAgICBPcHRpb25zIG9wdGlvbnMgPSBuZXcgT3B0aW9ucygpOwotICAgICAgICBvcHRpb25zLnNldFRvKG5ldyBFbmRwb2ludFJlZmVyZW5jZSh0b0VwcikpOwotICAgICAgICBvcHRpb25zLnNldFRyYW5zcG9ydEluUHJvdG9jb2woQ29uc3RhbnRzLlRSQU5TUE9SVF9IVFRQKTsKLQotICAgICAgICBvcHRpb25zLnNldFByb3BlcnR5KENvbnN0YW50cy5Db25maWd1cmF0aW9uLkVOQUJMRV9SRVNULCBDb25zdGFudHMuVkFMVUVfVFJVRSk7Ci0KLSAgICAgICAgU2VydmljZUNsaWVudCBzZW5kZXIgPSBuZXcgU2VydmljZUNsaWVudCgpOwotICAgICAgICBzZW5kZXIuZW5nYWdlTW9kdWxlKENvbnN0YW50cy5NT0RVTEVfQUREUkVTU0lORyk7Ci0gICAgICAgIHNlbmRlci5zZXRPcHRpb25zKG9wdGlvbnMpOwotICAgICAgICBPTUVsZW1lbnQgcmVzdWx0ID0gc2VuZGVyLnNlbmRSZWNlaXZlKGdldFBheWxvYWQoKSk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFhNTFN0cmVhbVdyaXRlciB3cml0ZXIgPSBYTUxPdXRwdXRGYWN0b3J5Lm5ld0luc3RhbmNlKCkKLSAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZVhNTFN0cmVhbVdyaXRlcihTeXN0ZW0ub3V0KTsKLSAgICAgICAgICAgIHJlc3VsdC5zZXJpYWxpemUod3JpdGVyKTsKLSAgICAgICAgICAgIHdyaXRlci5mbHVzaCgpOwotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfSBjYXRjaCAoRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvciBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICBwcml2YXRlIHN0YXRpYyBPTUVsZW1lbnQgZ2V0UGF5bG9hZCgpIHsKLSAgICAgICAgT01GYWN0b3J5IGZhYyA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpOwotICAgICAgICBPTU5hbWVzcGFjZSBvbU5zID0gZmFjLmNyZWF0ZU9NTmFtZXNwYWNlKAotICAgICAgICAgICAgICAgICJodHRwOi8vZXhhbXBsZTEub3JnL2V4YW1wbGUxIiwgImV4YW1wbGUxIik7Ci0gICAgICAgIE9NRWxlbWVudCBtZXRob2QgPSBmYWMuY3JlYXRlT01FbGVtZW50KCJlY2hvIiwgb21Ocyk7Ci0gICAgICAgIE9NRWxlbWVudCB2YWx1ZSA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoIlRleHQiLCBvbU5zKTsKLSAgICAgICAgdmFsdWUuYWRkQ2hpbGQoZmFjLmNyZWF0ZU9NVGV4dCh2YWx1ZSwgIkF4aXMyIEVjaG8gU3RyaW5nICIpKTsKLSAgICAgICAgbWV0aG9kLmFkZENoaWxkKHZhbHVlKTsKLQotICAgICAgICByZXR1cm4gbWV0aG9kOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvdXNlcmd1aWRlL3NyYy91c2VyZ3VpZGUvY2xpZW50cy9UQ1BDbGllbnQuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvdXNlcmd1aWRlL3NyYy91c2VyZ3VpZGUvY2xpZW50cy9UQ1BDbGllbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM4ZTJiNS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3VzZXJndWlkZS9zcmMvdXNlcmd1aWRlL2NsaWVudHMvVENQQ2xpZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIHVzZXJndWlkZS5jbGllbnRzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5PcHRpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50LlNlcnZpY2VDbGllbnQ7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvcjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTE91dHB1dEZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXI7Ci0KLS8qKgotICogVGhpcyBpcyBhIENsaWVudCBwcm9nYW0gdGhhdCBhY2Nlc3NlcyAnTXlTZXJ2aWNlJyB3ZWIgc2VydmljZSBpbiBBeGlzMiBzYW1wbGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBUQ1BDbGllbnQgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHRvRXByID0gInRjcDovL2xvY2FsaG9zdDo4MDgwL2F4aXMyL3NlcnZpY2VzL015U2VydmljZSI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLQotICAgICAgICBPcHRpb25zIG9wdGlvbnMgPSBuZXcgT3B0aW9ucygpOwotICAgICAgICBvcHRpb25zLnNldFRvKG5ldyBFbmRwb2ludFJlZmVyZW5jZSh0b0VwcikpOwotICAgICAgICBvcHRpb25zLnNldFRyYW5zcG9ydEluUHJvdG9jb2woQ29uc3RhbnRzLlRSQU5TUE9SVF9UQ1ApOwotICAgICAgICBvcHRpb25zLnNldEFjdGlvbigidXJuOmVjaG8iKTsKLQotICAgICAgICBTZXJ2aWNlQ2xpZW50IHNlbmRlciA9IG5ldyBTZXJ2aWNlQ2xpZW50KCk7Ci0gICAgICAgIHNlbmRlci5lbmdhZ2VNb2R1bGUoQ29uc3RhbnRzLk1PRFVMRV9BRERSRVNTSU5HKTsKLSAgICAgICAgc2VuZGVyLnNldE9wdGlvbnMob3B0aW9ucyk7Ci0gICAgICAgIE9NRWxlbWVudCByZXN1bHQgPSBzZW5kZXIuc2VuZFJlY2VpdmUoZ2V0UGF5bG9hZCgpKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgWE1MU3RyZWFtV3JpdGVyIHdyaXRlciA9IFhNTE91dHB1dEZhY3RvcnkubmV3SW5zdGFuY2UoKQotICAgICAgICAgICAgICAgICAgICAuY3JlYXRlWE1MU3RyZWFtV3JpdGVyKFN5c3RlbS5vdXQpOwotICAgICAgICAgICAgcmVzdWx0LnNlcmlhbGl6ZSh3cml0ZXIpOwotICAgICAgICAgICAgd3JpdGVyLmZsdXNoKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9IGNhdGNoIChGYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIHByaXZhdGUgc3RhdGljIE9NRWxlbWVudCBnZXRQYXlsb2FkKCkgewotICAgICAgICBPTUZhY3RvcnkgZmFjID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCk7Ci0gICAgICAgIE9NTmFtZXNwYWNlIG9tTnMgPSBmYWMuY3JlYXRlT01OYW1lc3BhY2UoCi0gICAgICAgICAgICAgICAgInRjcDovL2xvY2FsaG9zdDo4MDgwL2F4aXMyL3NlcnZpY2VzL015U2VydmljZSIsICJleGFtcGxlMSIpOwotICAgICAgICBPTUVsZW1lbnQgbWV0aG9kID0gZmFjLmNyZWF0ZU9NRWxlbWVudCgiZWNobyIsIG9tTnMpOwotICAgICAgICBPTUVsZW1lbnQgdmFsdWUgPSBmYWMuY3JlYXRlT01FbGVtZW50KCJUZXh0Iiwgb21Ocyk7Ci0gICAgICAgIHZhbHVlLmFkZENoaWxkKGZhYy5jcmVhdGVPTVRleHQodmFsdWUsICJBeGlzMiBFY2hvIFN0cmluZyAiKSk7Ci0gICAgICAgIG1ldGhvZC5hZGRDaGlsZCh2YWx1ZSk7Ci0KLSAgICAgICAgcmV0dXJuIG1ldGhvZDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3VzZXJndWlkZS9zcmMvdXNlcmd1aWRlL2V4YW1wbGUxL01FVEEtSU5GL3NlcnZpY2VzLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvdXNlcmd1aWRlL3NyYy91c2VyZ3VpZGUvZXhhbXBsZTEvTUVUQS1JTkYvc2VydmljZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTQyYjU3Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvdXNlcmd1aWRlL3NyYy91c2VyZ3VpZGUvZXhhbXBsZTEvTUVUQS1JTkYvc2VydmljZXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08c2VydmljZSBuYW1lPSJNeVNlcnZpY2UiPgotICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgVGhpcyBpcyBhIHNhbXBsZSBXZWIgU2VydmljZSB3aXRoIHR3byBvcGVyYXRpb25zLGVjaG8gYW5kIHBpbmcuCi0gICAgPC9kZXNjcmlwdGlvbj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9IlNlcnZpY2VDbGFzcyI+dXNlcmd1aWRlLmV4YW1wbGUxLk15U2VydmljZTwvcGFyYW1ldGVyPgotICAgIDxvcGVyYXRpb24gbmFtZT0iZWNobyI+Ci0gICAgICAgIDxtZXNzYWdlUmVjZWl2ZXIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLlJhd1hNTElOT3V0TWVzc2FnZVJlY2VpdmVyIi8+Ci0gICAgICAgIDxhY3Rpb25NYXBwaW5nPnVybjplY2hvPC9hY3Rpb25NYXBwaW5nPgotICAgIDwvb3BlcmF0aW9uPgotICAgIDxvcGVyYXRpb24gbmFtZT0icGluZyI+Ci0gICAgICAgIDxtZXNzYWdlUmVjZWl2ZXIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLlJhd1hNTElOT25seU1lc3NhZ2VSZWNlaXZlciIvPgotICAgICAgICA8YWN0aW9uTWFwcGluZz51cm46cGluZzwvYWN0aW9uTWFwcGluZz4KLSAgICA8L29wZXJhdGlvbj4KLTwvc2VydmljZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3VzZXJndWlkZS9zcmMvdXNlcmd1aWRlL2V4YW1wbGUxL015U2VydmljZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy91c2VyZ3VpZGUvc3JjL3VzZXJndWlkZS9leGFtcGxlMS9NeVNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjliZjMxZC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3VzZXJndWlkZS9zcmMvdXNlcmd1aWRlL2V4YW1wbGUxL015U2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgdXNlcmd1aWRlLmV4YW1wbGUxOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci0KLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBDcmVhdGVkIGJ5IEludGVsbGlKIElERUEuCi0gKiBVc2VyOiBKYWxpeWEKLSAqIERhdGU6IEp1biAyLCAyMDA1Ci0gKiBUaW1lOiAyOjE3OjU4IFBNCi0gKi8KLXB1YmxpYyBjbGFzcyBNeVNlcnZpY2UgewotICAgIHB1YmxpYyBPTUVsZW1lbnQgZWNobyhPTUVsZW1lbnQgZWxlbWVudCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vUHJhcGFyaW5nIHRoZSBPTUVsZW1lbnQgc28gdGhhdCBpdCBjYW4gYmUgYXR0YWNoZWQgdG8gYW5vdGhlciBPTSBUcmVlLgotICAgICAgICAvL0ZpcnN0IHRoZSBPTUVsZW1lbnQgc2hvdWxkIGJlIGNvbXBsZXRlbHkgYnVpbGQgaW4gY2FzZSBpdCBpcyBub3QgZnVsbHkgYnVpbHQgYW5kIHN0aWxsCi0gICAgICAgIC8vc29tZSBvZiB0aGUgeG1sIGlzIGluIHRoZSBzdHJlYW0uCi0gICAgICAgIGVsZW1lbnQuYnVpbGQoKTsKLSAgICAgICAgLy9TZWNvbmRseSB0aGUgT01FbGVtZW50IHNob3VsZCBiZSBkZXRhY2hlZCBmcm9tIHRoZSBjdXJyZW50IE9NVHJlZSBzbyB0aGF0IGl0IGNhbiBiZSBhdHRhY2hlZAotICAgICAgICAvL3NvbWUgb3RoZXIgT00gVHJlZS4gT25jZSBkZXRhY2hlZCB0aGUgT21UcmVlIHdpbGwgcmVtb3ZlIGl0cyBjb25uZWN0aW9ucyB0byB0aGlzIE9NRWxlbWVudC4KLSAgICAgICAgZWxlbWVudC5kZXRhY2goKTsKLSAgICAgICAgcmV0dXJuIGVsZW1lbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcGluZyhPTUVsZW1lbnQgZWxlbWVudCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vRG8gc29tZSBwcm9jZXNzaW5nCi0gICAgfQotICAgIHB1YmxpYyB2b2lkIHBpbmdGKE9NRWxlbWVudCBlbGVtZW50KSB0aHJvd3MgQXhpc0ZhdWx0ewotICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJGYXVsdCBiZWluZyB0aHJvd24iKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3VzZXJndWlkZS9zcmMvdXNlcmd1aWRlL2V4YW1wbGUyL01FVEEtSU5GL3NlcnZpY2VzLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvdXNlcmd1aWRlL3NyYy91c2VyZ3VpZGUvZXhhbXBsZTIvTUVUQS1JTkYvc2VydmljZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjM3ZTdmLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvdXNlcmd1aWRlL3NyYy91c2VyZ3VpZGUvZXhhbXBsZTIvTUVUQS1JTkYvc2VydmljZXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08c2VydmljZSBuYW1lPSJNeVNlcnZpY2VXaXRoTW9kdWxlIj4KLSAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgIFRoaXMgaXMgYSBzYW1wbGUgV2ViIFNlcnZpY2Ugd2l0aCBhIGxvZ2dpbmcgbW9kdWxlIGVuZ2FnZWQuCi0gICAgPC9kZXNjcmlwdGlvbj4KLSAgICA8bW9kdWxlIHJlZj0ic2FtcGxlLWxvZ2dpbmciLz4KLSAgICA8cGFyYW1ldGVyIG5hbWU9IlNlcnZpY2VDbGFzcyI+dXNlcmd1aWRlLmV4YW1wbGUyLk15U2VydmljZTwvcGFyYW1ldGVyPgotICAgIDxvcGVyYXRpb24gbmFtZT0iZWNobyI+Ci0gICAgICAgIDxtZXNzYWdlUmVjZWl2ZXIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLlJhd1hNTElOT3V0TWVzc2FnZVJlY2VpdmVyIi8+Ci0gICAgICAgIDxhY3Rpb25NYXBwaW5nPnVybjplY2hvPC9hY3Rpb25NYXBwaW5nPgotICAgIDwvb3BlcmF0aW9uPgotICAgIDxvcGVyYXRpb24gbmFtZT0icGluZyI+Ci0gICAgICAgIDxtZXNzYWdlUmVjZWl2ZXIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLlJhd1hNTElOT3V0TWVzc2FnZVJlY2VpdmVyIi8+Ci0gICAgICAgIDxhY3Rpb25NYXBwaW5nPnVybjpwaW5nPC9hY3Rpb25NYXBwaW5nPgotICAgIDwvb3BlcmF0aW9uPgotPC9zZXJ2aWNlPgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy91c2VyZ3VpZGUvc3JjL3VzZXJndWlkZS9leGFtcGxlMi9NeVNlcnZpY2UuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvdXNlcmd1aWRlL3NyYy91c2VyZ3VpZGUvZXhhbXBsZTIvTXlTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlMmEzZjIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy91c2VyZ3VpZGUvc3JjL3VzZXJndWlkZS9leGFtcGxlMi9NeVNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotcGFja2FnZSB1c2VyZ3VpZGUuZXhhbXBsZTI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotCi0vKioKLSAqIENyZWF0ZWQgYnkgSW50ZWxsaUogSURFQS4KLSAqIFVzZXI6IEphbGl5YQotICogRGF0ZTogSnVuIDIsIDIwMDUKLSAqIFRpbWU6IDI6MTc6NTggUE0KLSAqLwotcHVibGljIGNsYXNzIE15U2VydmljZSB7Ci0gICAgcHVibGljIE9NRWxlbWVudCBlY2hvKE9NRWxlbWVudCBlbGVtZW50KSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgLy9QcmFwYXJpbmcgdGhlIE9NRWxlbWVudCBzbyB0aGF0IGl0IGNhbiBiZSBhdHRhY2hlZCB0byBhbm90aGVyIE9NIFRyZWUuCi0gICAgICAgIC8vRmlyc3QgdGhlIE9NRWxlbWVudCBzaG91bGQgYmUgY29tcGxldGVseSBidWlsZCBpbiBjYXNlIGl0IGlzIG5vdCBmdWxseSBidWlsdCBhbmQgc3RpbGwKLSAgICAgICAgLy9zb21lIG9mIHRoZSB4bWwgaXMgaW4gdGhlIHN0cmVhbS4KLSAgICAgICAgZWxlbWVudC5idWlsZCgpOwotICAgICAgICAvL1NlY29uZGx5IHRoZSBPTUVsZW1lbnQgc2hvdWxkIGJlIGRldGFjaGVkIGZyb20gdGhlIGN1cnJlbnQgT01UcmVlIHNvIHRoYXQgaXQgY2FuIGJlIGF0dGFjaGVkCi0gICAgICAgIC8vc29tZSBvdGhlciBPTSBUcmVlLiBPbmNlIGRldGFjaGVkIHRoZSBPbVRyZWUgd2lsbCByZW1vdmUgaXRzIGNvbm5lY3Rpb25zIHRvIHRoaXMgT01FbGVtZW50LgotICAgICAgICBlbGVtZW50LmRldGFjaCgpOwotICAgICAgICByZXR1cm4gZWxlbWVudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwaW5nKE9NRWxlbWVudCBlbGVtZW50KSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgLy9EbyBzb21lIHByb2Nlc3NpbmcKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3VzZXJndWlkZS9zcmMvdXNlcmd1aWRlL2V4YW1wbGUzL01FVEEtSU5GL3NlcnZpY2VzLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvdXNlcmd1aWRlL3NyYy91c2VyZ3VpZGUvZXhhbXBsZTMvTUVUQS1JTkYvc2VydmljZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2I3YTczLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvdXNlcmd1aWRlL3NyYy91c2VyZ3VpZGUvZXhhbXBsZTMvTUVUQS1JTkYvc2VydmljZXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08c2VydmljZUdyb3VwPgotICAgIDxzZXJ2aWNlIG5hbWU9IldzYU1hcHBpbmdUZXN0Ij4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgU2FtcGxlIHRvIHZpYSBXU0EgTWFwcGluZwotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9IlNlcnZpY2VDbGFzcyI+dXNlcmd1aWRlLmV4YW1wbGUzLk15U2VydmljZTwvcGFyYW1ldGVyPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG8iPgotICAgICAgICAgICAgPG1lc3NhZ2VSZWNlaXZlcgotICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuUmF3WE1MSU5PdXRNZXNzYWdlUmVjZWl2ZXIiLz4KLSAgICAgICAgICAgIDxhY3Rpb25NYXBwaW5nPnVybjplY2hvPC9hY3Rpb25NYXBwaW5nPgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICA8L3NlcnZpY2U+Ci08L3NlcnZpY2VHcm91cD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3VzZXJndWlkZS9zcmMvdXNlcmd1aWRlL2V4YW1wbGUzL015U2VydmljZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy91c2VyZ3VpZGUvc3JjL3VzZXJndWlkZS9leGFtcGxlMy9NeVNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhiNTRhZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3VzZXJndWlkZS9zcmMvdXNlcmd1aWRlL2V4YW1wbGUzL015U2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgdXNlcmd1aWRlLmV4YW1wbGUzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci0KLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgTXlTZXJ2aWNlIHsKLSAgICBwdWJsaWMgT01FbGVtZW50IGVjaG8oT01FbGVtZW50IGVsZW1lbnQpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgLy9QcmFwYXJpbmcgdGhlIE9NRWxlbWVudCBzbyB0aGF0IGl0IGNhbiBiZSBhdHRhY2hlZCB0byBhbm90aGVyIE9NIFRyZWUuCi0gICAgICAgICAgICAvL0ZpcnN0IHRoZSBPTUVsZW1lbnQgc2hvdWxkIGJlIGNvbXBsZXRlbHkgYnVpbGQgaW4gY2FzZSBpdCBpcyBub3QgZnVsbHkgYnVpbHQgYW5kIHN0aWxsCi0gICAgICAgICAgICAvL3NvbWUgb2YgdGhlIHhtbCBpcyBpbiB0aGUgc3RyZWFtLgotICAgICAgICAgICAgZWxlbWVudC5idWlsZCgpOwotICAgICAgICAgICAgLy9TZWNvbmRseSB0aGUgT01FbGVtZW50IHNob3VsZCBiZSBkZXRhY2hlZCBmcm9tIHRoZSBjdXJyZW50IE9NVHJlZSBzbyB0aGF0IGl0IGNhbiBiZSBhdHRhY2hlZAotICAgICAgICAgICAgLy9zb21lIG90aGVyIE9NIFRyZWUuIE9uY2UgZGV0YWNoZWQgdGhlIE9tVHJlZSB3aWxsIHJlbW92ZSBpdHMgY29ubmVjdGlvbnMgdG8gdGhpcyBPTUVsZW1lbnQuCi0gICAgICAgICAgICBlbGVtZW50LmRldGFjaCgpOwotICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7Ci0gICAgICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy91c2VyZ3VpZGUvc3JjL3VzZXJndWlkZS9sb2dnaW5nbW9kdWxlL0xvZ0hhbmRsZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvdXNlcmd1aWRlL3NyYy91c2VyZ3VpZGUvbG9nZ2luZ21vZHVsZS9Mb2dIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyNjdjNTUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy91c2VyZ3VpZGUvc3JjL3VzZXJndWlkZS9sb2dnaW5nbW9kdWxlL0xvZ0hhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgdXNlcmd1aWRlLmxvZ2dpbmdtb2R1bGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuSGFuZGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmhhbmRsZXJzLkFic3RyYWN0SGFuZGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLXB1YmxpYyBjbGFzcyBMb2dIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyIGltcGxlbWVudHMgSGFuZGxlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKExvZ0hhbmRsZXIuY2xhc3MpOwotICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBJbnZvY2F0aW9uUmVzcG9uc2UgaW52b2tlKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBsb2cuaW5mbyhtc2dDb250ZXh0LmdldEVudmVsb3BlKCkudG9TdHJpbmcoKSk7Ci0gICAgICAgIHJldHVybiBJbnZvY2F0aW9uUmVzcG9uc2UuQ09OVElOVUU7ICAgICAgICAKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZXZva2UoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgewotICAgICAgICBsb2cuaW5mbyhtc2dDb250ZXh0LmdldEVudmVsb3BlKCkudG9TdHJpbmcoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy91c2VyZ3VpZGUvc3JjL3VzZXJndWlkZS9sb2dnaW5nbW9kdWxlL0xvZ2dpbmdNb2R1bGUuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvdXNlcmd1aWRlL3NyYy91c2VyZ3VpZGUvbG9nZ2luZ21vZHVsZS9Mb2dnaW5nTW9kdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzN2IwYzMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy91c2VyZ3VpZGUvc3JjL3VzZXJndWlkZS9sb2dnaW5nbW9kdWxlL0xvZ2dpbmdNb2R1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotcGFja2FnZSB1c2VyZ3VpZGUubG9nZ2luZ21vZHVsZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNNb2R1bGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5tb2R1bGVzLk1vZHVsZTsKLWltcG9ydCBvcmcuYXBhY2hlLm5lZXRoaS5Bc3NlcnRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5uZWV0aGkuUG9saWN5OwotCi1wdWJsaWMgY2xhc3MgTG9nZ2luZ01vZHVsZSBpbXBsZW1lbnRzIE1vZHVsZSB7Ci0KLQotICAgIC8vIGluaXRpYWxpemUgdGhlIG1vZHVsZQotICAgIHB1YmxpYyB2b2lkIGluaXQoQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ29udGV4dCwgQXhpc01vZHVsZSBtb2R1bGUpIHRocm93cyBBeGlzRmF1bHQgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVuZ2FnZU5vdGlmeShBeGlzRGVzY3JpcHRpb24gYXhpc0Rlc2NyaXB0aW9uKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICB9Ci0KLSAgICAvLyBzaHV0ZG93biB0aGUgbW9kdWxlCi0gICAgcHVibGljIHZvaWQgc2h1dGRvd24oQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlndXJhdGlvbkNvbnRleHQpIHRocm93cyBBeGlzRmF1bHQgewotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0UG9saWN5TmFtZXNwYWNlcygpIHsKLSAgICAJcmV0dXJuIG51bGw7CQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFwcGx5UG9saWN5KFBvbGljeSBwb2xpY3ksIEF4aXNEZXNjcmlwdGlvbiBheGlzRGVzY3JpcHRpb24pIHRocm93cyBBeGlzRmF1bHQgewotICAgIH0KLQkJICAgCi0gICAgcHVibGljIGJvb2xlYW4gY2FuU3VwcG9ydEFzc2VydGlvbihBc3NlcnRpb24gYXNzZXJ0aW9uKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvdXNlcmd1aWRlL3NyYy91c2VyZ3VpZGUvbG9nZ2luZ21vZHVsZS9NRVRBLUlORi9tb2R1bGUueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy91c2VyZ3VpZGUvc3JjL3VzZXJndWlkZS9sb2dnaW5nbW9kdWxlL01FVEEtSU5GL21vZHVsZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2MmU0NzEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy91c2VyZ3VpZGUvc3JjL3VzZXJndWlkZS9sb2dnaW5nbW9kdWxlL01FVEEtSU5GL21vZHVsZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxtb2R1bGUgbmFtZT0ic2FtcGxlLWxvZ2dpbmciIGNsYXNzPSJ1c2VyZ3VpZGUubG9nZ2luZ21vZHVsZS5Mb2dnaW5nTW9kdWxlIj4KLSAgICA8SW5GbG93PgotICAgICAgICA8aGFuZGxlciBuYW1lPSJJbkZsb3dMb2dIYW5kbGVyIiBjbGFzcz0idXNlcmd1aWRlLmxvZ2dpbmdtb2R1bGUuTG9nSGFuZGxlciI+Ci0gICAgICAgICAgICA8b3JkZXIgcGhhc2U9ImxvZ2dpbmdQaGFzZSIvPgotICAgICAgICA8L2hhbmRsZXI+Ci0gICAgPC9JbkZsb3c+Ci0KLSAgICA8T3V0Rmxvdz4KLSAgICAgICAgPGhhbmRsZXIgbmFtZT0iT3V0Rmxvd0xvZ0hhbmRsZXIiIGNsYXNzPSJ1c2VyZ3VpZGUubG9nZ2luZ21vZHVsZS5Mb2dIYW5kbGVyIj4KLSAgICAgICAgICAgIDxvcmRlciBwaGFzZT0ibG9nZ2luZ1BoYXNlIi8+Ci0gICAgICAgIDwvaGFuZGxlcj4KLSAgICA8L091dEZsb3c+Ci0KLSAgICA8T3V0RmF1bHRGbG93PgotICAgICAgICA8aGFuZGxlciBuYW1lPSJGYXVsdE91dEZsb3dMb2dIYW5kbGVyIiBjbGFzcz0idXNlcmd1aWRlLmxvZ2dpbmdtb2R1bGUuTG9nSGFuZGxlciI+Ci0gICAgICAgICAgICA8b3JkZXIgcGhhc2U9ImxvZ2dpbmdQaGFzZSIvPgotICAgICAgICA8L2hhbmRsZXI+Ci0gICAgPC9PdXRGYXVsdEZsb3c+Ci0KLSAgICA8SW5GYXVsdEZsb3c+Ci0gICAgICAgIDxoYW5kbGVyIG5hbWU9IkZhdWx0SW5GbG93TG9nSGFuZGxlciIgY2xhc3M9InVzZXJndWlkZS5sb2dnaW5nbW9kdWxlLkxvZ0hhbmRsZXIiPgotICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJsb2dnaW5nUGhhc2UiLz4KLSAgICAgICAgPC9oYW5kbGVyPgotICAgIDwvSW5GYXVsdEZsb3c+Ci08L21vZHVsZT4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvdmVyc2lvbi9SRUFETUUudHh0IGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy92ZXJzaW9uL1JFQURNRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3ZjgwOTQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy92ZXJzaW9uL1JFQURNRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi1TYW1wbGU6IFZlcnNpb24NCi09PT09PT09PT09PT09PT0NCi0NCi1JbnRyb2R1Y3Rpb24NCi09PT09PT09PT09PT0NCi0NCi1BIHNpbXBsZSBzZXJ2aWNlIHRoYXQgcmV0dXJucyBhIHRleHQgd2hpY2ggY29udGFpbnMgdGhlIHZlcnNpb24gbnVtYmVyIGFuZCB0aGUgYnVpbHQgDQotZGF0ZSBvZiB0aGUgQXhpczIgRGlzdHJpYnV0aW9uIHVzZWQuDQotDQotSW4gb3RoZXIgd29yZHMsIHRoaXMgaXMgYSBzaW1wbGUgc2VydmljZSB1c2VkIGJ5IG1hbnkgdG8gdGVzdCB3aGV0aGVyIHRoZSBkaXN0cmlidXRpb24gdGhleSBnb3QgaXMgc2V0dXAgDQotYW5kIHdvcmtpbmcgcHJvcGVybHkuIEl0IGNvbnRhaW5zIGEgc2luZ2xlIG1ldGhvZCB0aGF0IHNpbXBseSByZXR1cm5zIHZlcnNpb24gYW5kIGJ1aWx0IA0KLWRhdGUgb2YgdGhlIEF4aXMyIGRpc3RyaWJ1dGlvbiB1c2VkLg0KLQ0KLQ0KLVByZS1SZXF1aXNpdGVzDQotPT09PT09PT09PT09PT0NCi0NCi1BcGFjaGUgQW50IDEuNi4yIG9yIGxhdGVyDQotDQotUnVubmluZyB0aGUgU2FtcGxlDQotPT09PT09PT09PT09PT09PT09DQotDQotVHlwZSAkYW50IGZyb20gQXhpczJfSE9NRS9zYW1wbGVzL3ZlcnNpb24NCi0NCi0NCi1IZWxwDQotPT09PQ0KLVBsZWFzZSBjb250YWN0IGF4aXMtdXNlciBsaXN0IChheGlzLXVzZXJAd3MuYXBhY2hlLm9yZykgaWYgeW91IGhhdmUgYW55IHRyb3VibGUgcnVubmluZyB0aGUgc2FtcGxlLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvdmVyc2lvbi9idWlsZC54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3ZlcnNpb24vYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODY5YTJmLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvdmVyc2lvbi9idWlsZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxwcm9qZWN0IG5hbWU9InZlcnNpb24iIGJhc2VkaXI9Ii4iIGRlZmF1bHQ9ImdlbmVyYXRlLnNlcnZpY2UiPgotCQotCTxwcm9wZXJ0eSBuYW1lPSJkZXN0LmRpciIgdmFsdWU9ImJ1aWxkIiAvPgotCQotCTxwcm9wZXJ0eSBuYW1lPSJkZXN0LmRpci5jbGFzc2VzIiB2YWx1ZT0iJHtkZXN0LmRpcn0vY2xhc3NlcyIgLz4KLQkKLQk8cHJvcGVydHkgbmFtZT0iYXhpczIuaG9tZSIgdmFsdWU9Ii4uLy4uLyIgLz4KLQkKLQk8cHJvcGVydHkgbmFtZT0icmVwb3NpdG9yeS5wYXRoIiB2YWx1ZT0iJHtheGlzMi5ob21lfS9yZXBvc2l0b3J5L3NlcnZpY2VzIiAvPgotCQotCTxwYXRoIGlkPSJidWlsZC5jbGFzcy5wYXRoIj4KLQkJPGZpbGVzZXQgZGlyPSIke2F4aXMyLmhvbWV9L2xpYiI+Ci0JCQk8aW5jbHVkZSBuYW1lPSIqLmphciIgLz4KLQkJPC9maWxlc2V0PgotCTwvcGF0aD4KLQkKLQk8dGFyZ2V0IG5hbWU9ImNsZWFuIj4KLQkJPGRlbGV0ZSBkaXI9IiR7ZGVzdC5kaXJ9IiAvPgotCTwvdGFyZ2V0PgotCQotCTx0YXJnZXQgbmFtZT0icHJlcGFyZSI+Ci0JCQotCQk8bWtkaXIgZGlyPSIke2Rlc3QuZGlyfSIgLz4KLQkJCi0JCTxta2RpciBkaXI9IiR7ZGVzdC5kaXIuY2xhc3Nlc30iIC8+Ci0JCQotCQk8bWtkaXIgZGlyPSIke2Rlc3QuZGlyLmNsYXNzZXN9L01FVEEtSU5GIiAvPgotCQotCTwvdGFyZ2V0PgotCQotCTx0YXJnZXQgbmFtZT0iZ2VuZXJhdGUuc2VydmljZSIgZGVwZW5kcz0iY2xlYW4scHJlcGFyZSI+Ci0JCQotCQk8Y29weSBmaWxlPSJzcmMvc2FtcGxlL2F4aXN2ZXJzaW9uL01FVEEtSU5GL3NlcnZpY2VzLnhtbCIgdG9maWxlPSIke2Rlc3QuZGlyLmNsYXNzZXN9L01FVEEtSU5GL3NlcnZpY2VzLnhtbCIgb3ZlcndyaXRlPSJ0cnVlIiAvPgotCQkKLQkJPGphdmFjIHNyY2Rpcj0ic3JjIiBkZXN0ZGlyPSIke2Rlc3QuZGlyLmNsYXNzZXN9IiBpbmNsdWRlcz0ic2FtcGxlL2F4aXN2ZXJzaW9uLyoqIj4KLQkJCTxjbGFzc3BhdGggcmVmaWQ9ImJ1aWxkLmNsYXNzLnBhdGgiIC8+Ci0JCTwvamF2YWM+Ci0JCQotCQk8amFyIGJhc2VkaXI9IiR7ZGVzdC5kaXIuY2xhc3Nlc30iIGRlc3RmaWxlPSIke2Rlc3QuZGlyfS92ZXJzaW9uLmFhciIgLz4KLQkJCi0JCTxjb3B5IGZpbGU9IiR7ZGVzdC5kaXJ9L3ZlcnNpb24uYWFyIiB0b2ZpbGU9IiR7cmVwb3NpdG9yeS5wYXRofS92ZXJzaW9uLmFhciIgb3ZlcndyaXRlPSJ0cnVlIiAvPgotCQotCTwvdGFyZ2V0PgotCQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy92ZXJzaW9uL3BvbS54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3ZlcnNpb24vcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM1YzU2ZC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3ZlcnNpb24vcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjEuNS4xPC92ZXJzaW9uPgotICAgICAgICA8cmVsYXRpdmVQYXRoPi4uLy4uL3BhcmVudC9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+Ci0gICAgPC9wYXJlbnQ+Ci0gICAgPGFydGlmYWN0SWQ+dmVyc2lvbjwvYXJ0aWZhY3RJZD4KLSAgICA8cGFja2FnaW5nPmFhcjwvcGFja2FnaW5nPgotICAgIDxuYW1lPkFwYWNoZSBBeGlzMiAtIFZlcnNpb24gU2VydmljZTwvbmFtZT4KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxzb3VyY2VEaXJlY3Rvcnk+c3JjPC9zb3VyY2VEaXJlY3Rvcnk+Ci0gICAgICAgIDxyZXNvdXJjZXM+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT4uLi8uLjwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+Tk9USUNFLnR4dDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+TElDRU5TRS50eHQ8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgICAgICA8ZmlsdGVyaW5nPmZhbHNlPC9maWx0ZXJpbmc+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPiAgICAgICAgICAgIAotICAgICAgICA8L3Jlc291cmNlcz4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxzb3VyY2U+MS40PC9zb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx0YXJnZXQ+MS40PC90YXJnZXQ+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItYWFyLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3ZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDxleHRlbnNpb25zPnRydWU8L2V4dGVuc2lvbnM+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxzZXJ2aWNlc1htbEZpbGU+JHtiYXNlZGlyfS9zcmMvc2FtcGxlL2F4aXN2ZXJzaW9uL01FVEEtSU5GL3NlcnZpY2VzLnhtbDwvc2VydmljZXNYbWxGaWxlPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZURlcGVuZGVuY2llcz5mYWxzZTwvaW5jbHVkZURlcGVuZGVuY2llcz4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvYnVpbGQ+Ci0gICAgPGRlcGVuZGVuY2llcz4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczIta2VybmVsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHt2ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgIDwvZGVwZW5kZW5jaWVzPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy92ZXJzaW9uL3NyYy9zYW1wbGUvYXhpc3ZlcnNpb24vTUVUQS1JTkYvc2VydmljZXMueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy92ZXJzaW9uL3NyYy9zYW1wbGUvYXhpc3ZlcnNpb24vTUVUQS1JTkYvc2VydmljZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODM0OTc2Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvdmVyc2lvbi9zcmMvc2FtcGxlL2F4aXN2ZXJzaW9uL01FVEEtSU5GL3NlcnZpY2VzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHNlcnZpY2UgbmFtZT0iVmVyc2lvbiI+Ci0gICAgPGRlc2NyaXB0aW9uPgotICAgICAgICBUaGlzIHNlcnZpY2UgaXMgdG8gZ2V0IHRoZSBydW5uaW5nIEF4aXMgdmVyc2lvbgotICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJTZXJ2aWNlQ2xhc3MiPnNhbXBsZS5heGlzdmVyc2lvbi5WZXJzaW9uPC9wYXJhbWV0ZXI+Ci0gICAgPG9wZXJhdGlvbiBuYW1lPSJnZXRWZXJzaW9uIj4KLSAgICA8bWVzc2FnZVJlY2VpdmVyICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5ycGMucmVjZWl2ZXJzLlJQQ01lc3NhZ2VSZWNlaXZlciIgLz4KLSAgICA8L29wZXJhdGlvbj4KLTwvc2VydmljZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3ZlcnNpb24vc3JjL3NhbXBsZS9heGlzdmVyc2lvbi9WZXJzaW9uLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3ZlcnNpb24vc3JjL3NhbXBsZS9heGlzdmVyc2lvbi9WZXJzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzNzdlZDcuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy92ZXJzaW9uL3NyYy9zYW1wbGUvYXhpc3ZlcnNpb24vVmVyc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBzYW1wbGUuYXhpc3ZlcnNpb247Ci0KLXB1YmxpYyBjbGFzcyBWZXJzaW9uIHsKLSAgICBwdWJsaWMgU3RyaW5nIGdldFZlcnNpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuICJIaSAtIHRoZSBBeGlzMiB2ZXJzaW9uIGlzICIgKyBvcmcuYXBhY2hlLmF4aXMyLlZlcnNpb24uZ2V0VmVyc2lvblRleHQoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3dzZGwvQXhpczJTYW1wbGVEb2NMaXQud3NkbCBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvd3NkbC9BeGlzMlNhbXBsZURvY0xpdC53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTZiZWY4Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvd3NkbC9BeGlzMlNhbXBsZURvY0xpdC53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLTw/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+Ci0JPC9zZXJ2aWNlPgotPC9kZWZpbml0aW9ucz4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvd3NkbC9wZXJmLndzZGwgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3dzZGwvcGVyZi53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmNmNGM5Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMvd3NkbC9wZXJmLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTx3c2RsOmRlZmluaXRpb25zIHhtbG5zOmFwYWNoZXNvYXA9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94bWwtc29hcCIgeG1sbnM6aW1wbD0iaHR0cDovL3BlcmYuc2FtcGxlcyIgeG1sbnM6aW50Zj0iaHR0cDovL3BlcmYuc2FtcGxlcyIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOndzZGxzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9wZXJmLnNhbXBsZXMiPgotCTx3c2RsOnR5cGVzPgotCQk8c2NoZW1hIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9wZXJmLnNhbXBsZXMiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+Ci0JCQk8ZWxlbWVudCBuYW1lPSJpbnB1dEVsZW1lbnQiPgotCQkJCTxjb21wbGV4VHlwZT4KLQkJCQkJPHNlcXVlbmNlPgotCQkJCQkJPGVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCIgbmFtZT0iaXRlbSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8L3NlcXVlbmNlPgotCQkJCTwvY29tcGxleFR5cGU+Ci0JCQk8L2VsZW1lbnQ+Ci0JCQk8ZWxlbWVudCBuYW1lPSJvdXRwdXRFbGVtZW50IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCTwvc2NoZW1hPgotCTwvd3NkbDp0eXBlcz4KLQk8d3NkbDptZXNzYWdlIG5hbWU9ImhhbmRsZVN0cmluZ0FycmF5UmVzcG9uc2UiPgotCQk8d3NkbDpwYXJ0IG5hbWU9Im91dHB1dCIgZWxlbWVudD0iaW1wbDpvdXRwdXRFbGVtZW50Ii8+Ci0JPC93c2RsOm1lc3NhZ2U+Ci0JPHdzZGw6bWVzc2FnZSBuYW1lPSJoYW5kbGVTdHJpbmdBcnJheVJlcXVlc3QiPgotCQk8d3NkbDpwYXJ0IG5hbWU9ImlucHV0IiBlbGVtZW50PSJpbXBsOmlucHV0RWxlbWVudCIvPgotCTwvd3NkbDptZXNzYWdlPgotCTx3c2RsOnBvcnRUeXBlIG5hbWU9IlBlcmZQb3J0VHlwZSI+Ci0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJoYW5kbGVTdHJpbmdBcnJheSIgcGFyYW1ldGVyT3JkZXI9ImlucHV0Ij4KLQkJCTx3c2RsOmlucHV0IG5hbWU9ImhhbmRsZVN0cmluZ0FycmF5UmVxdWVzdCIgbWVzc2FnZT0iaW1wbDpoYW5kbGVTdHJpbmdBcnJheVJlcXVlc3QiLz4KLQkJCTx3c2RsOm91dHB1dCBuYW1lPSJoYW5kbGVTdHJpbmdBcnJheVJlc3BvbnNlIiBtZXNzYWdlPSJpbXBsOmhhbmRsZVN0cmluZ0FycmF5UmVzcG9uc2UiLz4KLQkJPC93c2RsOm9wZXJhdGlvbj4KLQk8L3dzZGw6cG9ydFR5cGU+Ci0JPHdzZGw6YmluZGluZyBuYW1lPSJQZXJmb3JtYW5jZVNvYXBCaW5kaW5nIiB0eXBlPSJpbXBsOlBlcmZQb3J0VHlwZSI+Ci0JCTx3c2Rsc29hcDpiaW5kaW5nIHN0eWxlPSJkb2N1bWVudCIgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiLz4KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImhhbmRsZVN0cmluZ0FycmF5Ij4KLQkJCTx3c2Rsc29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaGFuZGxlU3RyaW5nQXJyYXkiLz4KLQkJCTx3c2RsOmlucHV0PgotCQkJCTx3c2Rsc29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotCQkJPC93c2RsOmlucHV0PgotCQkJPHdzZGw6b3V0cHV0PgotCQkJCTx3c2Rsc29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotCQkJPC93c2RsOm91dHB1dD4KLQkJPC93c2RsOm9wZXJhdGlvbj4KLQk8L3dzZGw6YmluZGluZz4KLQk8d3NkbDpzZXJ2aWNlIG5hbWU9IlBlcmZTb2FwU2VydmljZSI+Ci0JCTx3c2RsOnBvcnQgbmFtZT0iUGVyZm9ybWFuY2UiIGJpbmRpbmc9ImltcGw6UGVyZm9ybWFuY2VTb2FwQmluZGluZyI+Ci0JCQk8d3NkbHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo4MDgwL2F4aXMyL3NlcnZpY2VzL1BlcmZQb3J0VHlwZSIvPgotCQk8L3dzZGw6cG9ydD4KLQk8L3dzZGw6c2VydmljZT4KLTwvd3NkbDpkZWZpbml0aW9ucz4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMveWFob29qc29uc2VhcmNoL1JFQURNRS50eHQgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3lhaG9vanNvbnNlYXJjaC9SRUFETUUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTRhNzNmLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMveWFob29qc29uc2VhcmNoL1JFQURNRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi1TYW1wbGUgZm9yIFlhaG9vIC0gU2VhcmNoIC0gSlNPTgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUludHJvZHVjdGlvbgotPT09PT09PT09PT09Ci0KLUF4aXMyIGNsaWVudCBBUEkgaGFzIGZhY2lsaXRpZXMgdG8gYWNjZXB0IHJlc3BvbnNlcyBpbiBKU09OLgotCi1ZYWhvbyBwcm92aWRlcyBhbiBBUEkgdG8gY2FsbCBpdHMgc2VhcmNoIHNlcnZpY2UgYW5kIHJldHJpZXZlIEpTT04gcmVzcG9uc2VzLiBUaGlzIHNhbXBsZSBkZW1vbnN0cmF0ZXMgaG93IHRvIGNhbGwgWWFob28KLXNlYXJjaCBzZXJ2aWNlIHVzaW5nIGFuIEF4aXMyIGNsaWVudCB3aGljaCBhY2NlcHRzIGEgSlNPTiByZXNwb25zZS4KLQotUHJlLVJlcXVpc2l0ZXMKLT09PT09PT09PT09PT09Ci0KLUFwYWNoZSBBbnQgMS42LjIgb3IgbGF0ZXIKLQotUnVubmluZyBUaGUgU2FtcGxlCi09PT09PT09PT09PT09PT09PT0KLQotVHlwZSAiYW50IiBmcm9tIEF4aXMyX0hPTUUvc2FtcGxlcy95YWhvb2pzb25zZWFyY2ggZGlyZWN0b3J5LgotCi1IZWxwCi09PT09Ci1QbGVhc2UgY29udGFjdCBheGlzLXVzZXIgbGlzdCAoYXhpcy11c2VyQHdzLmFwYWNoZS5vcmcpIGlmIHlvdSBoYXZlIGFueSB0cm91YmxlIHJ1bm5pbmcgdGhlIHNhbXBsZS4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMveWFob29qc29uc2VhcmNoL2J1aWxkLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMveWFob29qc29uc2VhcmNoL2J1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q4Zjc4MC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3lhaG9vanNvbnNlYXJjaC9idWlsZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxwcm9qZWN0IG5hbWU9IllhaG9vSlNPTlNlYXJjaFNhbXBsZSIgZGVmYXVsdD0icnVuLmNsaWVudCI+Ci0JPHByb3BlcnR5IGVudmlyb25tZW50PSJlbnYiIC8+Ci0JPHByb3BlcnR5IG5hbWU9ImF4aXMyLmhvbWUiIHZhbHVlPSIuLi8uLi8iIC8+Ci0JPHByb3BlcnR5IG5hbWU9ImF4aXMyLnJlcG8iIHZhbHVlPSIke2F4aXMyLmhvbWV9L3JlcG9zaXRvcnkiIC8+Ci0JPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmRpciIgdmFsdWU9ImJ1aWxkIiAvPgotCTxwcm9wZXJ0eSBuYW1lPSJjbGllbnQuY2xhc3Nlcy5kaXIiIHZhbHVlPSIke2J1aWxkLmRpcn0vY2xhc3NlcyIgLz4KLQk8cGF0aCBpZD0iYXhpcy5jbGFzc3BhdGgiPgotCQk8ZmlsZXNldCBkaXI9IiR7YXhpczIuaG9tZX0vbGliIj4KLQkJCTxpbmNsdWRlIG5hbWU9IiouamFyIiAvPgotCQk8L2ZpbGVzZXQ+Ci0JCTxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQveWFob29KU09OU2VhcmNoLmphciIgLz4KLQk8L3BhdGg+Ci0KLQk8dGFyZ2V0IG5hbWU9ImNvbXBpbGUiPgotCQk8bWtkaXIgZGlyPSIke2NsaWVudC5jbGFzc2VzLmRpcn0iIC8+Ci0JCTwhLS0gQ29tcGlsZSBjbGllbnQgLS0+Ci0JCTxqYXZhYyBzcmNkaXI9InNyYyIgZGVzdGRpcj0iJHtjbGllbnQuY2xhc3Nlcy5kaXJ9Ij4KLQkJCTxjbGFzc3BhdGggcmVmaWQ9ImF4aXMuY2xhc3NwYXRoIiAvPgotCQk8L2phdmFjPgotCQk8amFyIGRlc3RmaWxlPSIke2J1aWxkLmRpcn0veWFob29KU09OU2VhcmNoLmphciI+Ci0JCQk8ZmlsZXNldCBkaXI9IiR7YnVpbGQuZGlyfS9jbGFzc2VzIiAvPgotCQk8L2phcj4KLQk8L3RhcmdldD4KLQk8dGFyZ2V0IG5hbWU9InJ1bi5jbGllbnQiIGRlcGVuZHM9ImNvbXBpbGUiPgotCQk8amF2YSBjbGFzc25hbWU9InNhbXBsZS55YWhvb3NlcnZpY2VzLkpTT05TZWFyY2guSlNPTlNlYXJjaENsaWVudCIgY2xhc3NwYXRocmVmPSJheGlzLmNsYXNzcGF0aCIgZm9yaz0idHJ1ZSI+Ci0JCQk8anZtYXJnIHZhbHVlPSItRGF4aXMyLnJlcG89JHtheGlzMi5yZXBvfSIgLz4KLQkJPC9qYXZhPgotCTwvdGFyZ2V0PgotCTx0YXJnZXQgbmFtZT0iY2xlYW4iPgotCQk8ZGVsZXRlIGRpcj0iYnVpbGQiIC8+Ci0JPC90YXJnZXQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3lhaG9vanNvbnNlYXJjaC9yZXNvdXJjZXMvYXhpczIueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy95YWhvb2pzb25zZWFyY2gvcmVzb3VyY2VzL2F4aXMyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY5ZDczNi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3lhaG9vanNvbnNlYXJjaC9yZXNvdXJjZXMvYXhpczIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjgyICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+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+Ci0gICAgPC9waGFzZU9yZGVyPgotPC9heGlzY29uZmlnPgotCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3lhaG9vanNvbnNlYXJjaC9zcmMvc2FtcGxlL3lhaG9vc2VydmljZXMvSlNPTlNlYXJjaC9KU09OU2VhcmNoQ2xpZW50LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3lhaG9vanNvbnNlYXJjaC9zcmMvc2FtcGxlL3lhaG9vc2VydmljZXMvSlNPTlNlYXJjaC9KU09OU2VhcmNoQ2xpZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViNzNiYWMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy95YWhvb2pzb25zZWFyY2gvc3JjL3NhbXBsZS95YWhvb3NlcnZpY2VzL0pTT05TZWFyY2gvSlNPTlNlYXJjaENsaWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBzYW1wbGUueWFob29zZXJ2aWNlcy5KU09OU2VhcmNoOwotCi1pbXBvcnQgamF2YXguc3dpbmcuKjsKLWltcG9ydCBqYXZhLmF3dC4qOwotCi1wdWJsaWMgY2xhc3MgSlNPTlNlYXJjaENsaWVudCBleHRlbmRzIEpGcmFtZSB7Ci0gICAgcHVibGljIHN0YXRpYyBpbnQgd2lkdGg7Ci0gICAgcHVibGljIHN0YXRpYyBpbnQgaGVpZ2h0OwotCi0gICAgcHVibGljIEpTT05TZWFyY2hDbGllbnQoU3RyaW5nIHRpdGxlKSB0aHJvd3MgSGVhZGxlc3NFeGNlcHRpb24gewotICAgICAgICBzdXBlcih0aXRsZSk7Ci0KLSAgICAgICAgdGhpcy5nZXRDb250ZW50UGFuZSgpLmFkZChuZXcgVXNlckludGVyZmFjZSh0aGlzKSk7Ci0gICAgICAgIHRoaXMuc2V0VmlzaWJsZSh0cnVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0gICAgICAgIERpbWVuc2lvbiBzY3JlZW5TaXplID0gVG9vbGtpdC5nZXREZWZhdWx0VG9vbGtpdCgpLmdldFNjcmVlblNpemUoKTsKLSAgICAgICAgd2lkdGggPSBzY3JlZW5TaXplLndpZHRoOwotICAgICAgICBoZWlnaHQgPSBzY3JlZW5TaXplLmhlaWdodDsKLSAgICAgICAgSlNPTlNlYXJjaENsaWVudCBmb3JtID0gbmV3IEpTT05TZWFyY2hDbGllbnQoIkF4aXMyIFlhaG9vLUpTT04gU2VhcmNoIENsaWVudCIpOwotCi0KLSAgICAgICAgaW50IGxlZnQgPSAod2lkdGgpIC8gMjsKLSAgICAgICAgaW50IHRvcCA9IChoZWlnaHQpIC8gMjsKLSAgICAgICAgZm9ybS5zZXRMb2NhdGlvbihsZWZ0LCB0b3ApOwotICAgICAgICBmb3JtLnNldFNpemUod2lkdGgsIGhlaWdodCk7Ci0gICAgICAgIGZvcm0uc2V0RGVmYXVsdENsb3NlT3BlcmF0aW9uKFdpbmRvd0NvbnN0YW50cy5FWElUX09OX0NMT1NFKTsKLSAgICAgICAgZm9ybS5zZXRWaXNpYmxlKHRydWUpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMveWFob29qc29uc2VhcmNoL3NyYy9zYW1wbGUveWFob29zZXJ2aWNlcy9KU09OU2VhcmNoL0pTT05TZWFyY2hNb2RlbC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy95YWhvb2pzb25zZWFyY2gvc3JjL3NhbXBsZS95YWhvb3NlcnZpY2VzL0pTT05TZWFyY2gvSlNPTlNlYXJjaE1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyYzZmYzcuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy95YWhvb2pzb25zZWFyY2gvc3JjL3NhbXBsZS95YWhvb3NlcnZpY2VzL0pTT05TZWFyY2gvSlNPTlNlYXJjaE1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBzYW1wbGUueWFob29zZXJ2aWNlcy5KU09OU2VhcmNoOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkhUVFBDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50Lk9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuU2VydmljZUNsaWVudDsKLQotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uZXQuVVJMRW5jb2RlcjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBKU09OU2VhcmNoTW9kZWwgewotICAgIC8qKgotICAgICAqIEhUTUwgSGVhZGVyIHRvIGRlc3BsYXkgc25pcHBldCB0ZXh0Ci0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgYmVnaW5IVE1MID0gIjxIVE1MPjxIRUFEPjxUSVRMRT5TZWFyY2ggUmVzdWx0czwvVElUTEU+PC9IRUFEPjxCT0RZPiI7Ci0KLSAgICAvKioKLSAgICAgKiBIVE1MIGZvb3RlcgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGVuZEhUTUwgPSAiPC9CT0RZPjwvSFRNTD4iOwotCi0gICAgLyoqCi0gICAgICogU3RvcmUgdGhlIHRleHRzIHJlYWQgYnkgTmF2aWdhdGlvblVSTCBvZiBzb2FwCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgc25pcHBldDsKLQotICAgIHB1YmxpYyBTdHJpbmcgc2VhcmNoWWFob28oU3RyaW5nIHF1ZXJ5LCBTdHJpbmcgZm9ybWF0KSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzbmlwcGV0ID0gYmVnaW5IVE1MOwotICAgICAgICAgICAgU3RyaW5nIGVwciA9ICJodHRwOi8vYXBpLnNlYXJjaC55YWhvby5jb20vV2ViU2VhcmNoU2VydmljZS9WMS93ZWJTZWFyY2giOwotICAgICAgICAgICAgRmlsZSBjb25maWdGaWxlID0gbmV3IEZpbGUoInJlc291cmNlcy9heGlzMi54bWwiKTsKLSAgICAgICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ3VyYXRpb25Db250ZXh0ID0gQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5Ci0gICAgICAgICAgICAgICAgICAgIC5jcmVhdGVDb25maWd1cmF0aW9uQ29udGV4dEZyb21GaWxlU3lzdGVtKG51bGwsIGNvbmZpZ0ZpbGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCi0gICAgICAgICAgICBTZXJ2aWNlQ2xpZW50IGNsaWVudCA9IG5ldyBTZXJ2aWNlQ2xpZW50KGNvbmZpZ3VyYXRpb25Db250ZXh0LCBudWxsKTsKLSAgICAgICAgICAgIE9wdGlvbnMgb3B0aW9ucyA9IG5ldyBPcHRpb25zKCk7Ci0gICAgICAgICAgICBjbGllbnQuc2V0T3B0aW9ucyhvcHRpb25zKTsKLSAgICAgICAgICAgIG9wdGlvbnMuc2V0VG8obmV3IEVuZHBvaW50UmVmZXJlbmNlKGVwcikpOwotICAgICAgICAgICAgb3B0aW9ucy5zZXRQcm9wZXJ0eShDb25zdGFudHMuQ29uZmlndXJhdGlvbi5NRVNTQUdFX1RZUEUsIEhUVFBDb25zdGFudHMuTUVESUFfVFlQRV9YX1dXV19GT1JNKTsKLSAgICAgICAgICAgIG9wdGlvbnMuc2V0UHJvcGVydHkoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uSFRUUF9NRVRIT0QsIENvbnN0YW50cy5Db25maWd1cmF0aW9uLkhUVFBfTUVUSE9EX0dFVCk7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgcmVzcG9uc2UgPSBjbGllbnQuc2VuZFJlY2VpdmUoZ2V0UGF5bG9hZEZvcllhaG9vU2VhcmNoQ2FsbChxdWVyeSwgZm9ybWF0KSk7Ci0gICAgICAgICAgICBnZW5lcmF0ZVNuaXBwZXQocmVzcG9uc2UpOwotICAgICAgICAgICAgcmV0dXJuIHNuaXBwZXQ7Ci0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICBzbmlwcGV0ID0gIjxIMj5FcnJvciBvY2N1cnJlZCBkdXJpbmcgdGhlIGludm9jYXRpb24gdG8gWWFob28gc2VhcmNoIHNlcnZpY2U8L0gyPiIgKwotICAgICAgICAgICAgICAgICAgICAiPHA+IiArIGUuZ2V0TWVzc2FnZSgpICsgIjwvcD4iICsgZW5kSFRNTDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBPTUVsZW1lbnQgZ2V0UGF5bG9hZEZvcllhaG9vU2VhcmNoQ2FsbChTdHJpbmcgcXVlcnlTdHIsIFN0cmluZyBmb3JtYXRTdHIpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKLSAgICAgICAgT01GYWN0b3J5IGZhYyA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpOwotICAgICAgICBPTUVsZW1lbnQgcm9vdEVsZW1lbnQgPSBmYWMuY3JlYXRlT01FbGVtZW50KCJ3ZWJTZWFyY2giLCBudWxsKTsKLQotICAgICAgICBPTUVsZW1lbnQgYXBwSWQgPSBmYWMuY3JlYXRlT01FbGVtZW50KCJhcHBpZCIsIG51bGwsIHJvb3RFbGVtZW50KTsKLSAgICAgICAgYXBwSWQuc2V0VGV4dCgiQXBhY2hlUmVzdERlbW8iKTsKLQotICAgICAgICBPTUVsZW1lbnQgcXVlcnkgPSBmYWMuY3JlYXRlT01FbGVtZW50KCJxdWVyeSIsIG51bGwsIHJvb3RFbGVtZW50KTsKLSAgICAgICAgcXVlcnkuc2V0VGV4dChVUkxFbmNvZGVyLmVuY29kZShxdWVyeVN0ciwgIlVURi04IikpOwotCi0gICAgICAgIE9NRWxlbWVudCBvdXRwdXRUeXBlID0gZmFjLmNyZWF0ZU9NRWxlbWVudCgib3V0cHV0IiwgbnVsbCwgcm9vdEVsZW1lbnQpOwotICAgICAgICBvdXRwdXRUeXBlLnNldFRleHQoImpzb24iKTsKLQotICAgICAgICBpZiAoZm9ybWF0U3RyICE9IG51bGwgJiYgZm9ybWF0U3RyLmxlbmd0aCgpICE9IDApIHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBmb3JtYXQgPSBmYWMuY3JlYXRlT01FbGVtZW50KCJmb3JtYXQiLCBudWxsLCByb290RWxlbWVudCk7Ci0gICAgICAgICAgICBmb3JtYXQuc2V0VGV4dChVUkxFbmNvZGVyLmVuY29kZShmb3JtYXRTdHIsICJVVEYtOCIpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcm9vdEVsZW1lbnQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGdlbmVyYXRlU25pcHBldChPTUVsZW1lbnQgcmVzcG9uc2UpIHsKLSAgICAgICAgU3RyaW5nIHRpdGxlID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIHN1bW1hcnkgPSBudWxsOwotICAgICAgICBTdHJpbmcgY2xpY2tVcmwgPSBudWxsOwotICAgICAgICBTdHJpbmcgdXJsID0gbnVsbDsKLSAgICAgICAgT01FbGVtZW50IHJlc3VsdCA9IG51bGw7Ci0gICAgICAgIC8vZ2V0IGFuIGl0ZXJhdG9yIGZvciBSZXN1bHQgZWxlbWVudHMKLSAgICAgICAgSXRlcmF0b3IgaXRyID0gcmVzcG9uc2UuZ2V0Q2hpbGRFbGVtZW50cygpOwotICAgICAgICBJdGVyYXRvciBpbm5lckl0cjsKLSAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IChPTUVsZW1lbnQpIGl0ci5uZXh0KCk7Ci0gICAgICAgICAgICBpbm5lckl0ciA9IHJlc3VsdC5nZXRDaGlsZEVsZW1lbnRzKCk7Ci0gICAgICAgICAgICBpZiAoaW5uZXJJdHIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgdGl0bGUgPSAoKE9NRWxlbWVudCkgaW5uZXJJdHIubmV4dCgpKS5nZXRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgc3VtbWFyeSA9ICgoT01FbGVtZW50KSBpbm5lckl0ci5uZXh0KCkpLmdldFRleHQoKTsKLSAgICAgICAgICAgICAgICB1cmwgPSAoKE9NRWxlbWVudCkgaW5uZXJJdHIubmV4dCgpKS5nZXRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgY2xpY2tVcmwgPSAoKE9NRWxlbWVudCkgaW5uZXJJdHIubmV4dCgpKS5nZXRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKHRpdGxlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgc25pcHBldCArPSAiPGEgaHJlZj0iICsgY2xpY2tVcmwgKyAiPiIgKyB0aXRsZSArICI8L2E+IiArICI8YnI+IiArIHN1bW1hcnkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+IiArIHVybCArICI8YnI+IiArICI8YnI+IjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgc25pcHBldCArPSBlbmRIVE1MOwotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy95YWhvb2pzb25zZWFyY2gvc3JjL3NhbXBsZS95YWhvb3NlcnZpY2VzL0pTT05TZWFyY2gvVXNlckludGVyZmFjZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy95YWhvb2pzb25zZWFyY2gvc3JjL3NhbXBsZS95YWhvb3NlcnZpY2VzL0pTT05TZWFyY2gvVXNlckludGVyZmFjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmYzMTdlLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMveWFob29qc29uc2VhcmNoL3NyYy9zYW1wbGUveWFob29zZXJ2aWNlcy9KU09OU2VhcmNoL1VzZXJJbnRlcmZhY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIHNhbXBsZS55YWhvb3NlcnZpY2VzLkpTT05TZWFyY2g7Ci0KLWltcG9ydCBqYXZheC5zd2luZy4qOwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50Lkh5cGVybGlua0xpc3RlbmVyOwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50Lkh5cGVybGlua0V2ZW50OwotaW1wb3J0IGphdmEuYXd0Lio7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uRXZlbnQ7Ci0KLXB1YmxpYyBjbGFzcyBVc2VySW50ZXJmYWNlIGV4dGVuZHMgSlBhbmVsIGltcGxlbWVudHMgSHlwZXJsaW5rTGlzdGVuZXIgewotCi0gICAgcHJpdmF0ZSBKRWRpdG9yUGFuZSBqZXA7Ci0gICAgcHJpdmF0ZSBKU2Nyb2xsUGFuZSBzY3JvbGxQYW5lOwotCi0gICAgcHJpdmF0ZSBKVGV4dEZpZWxkIHNjaEZpZWxkOwotICAgIHByaXZhdGUgSlRleHRGaWVsZCBmb3JtYXRGaWVsZDsKLQotICAgIHByaXZhdGUgSkJ1dHRvbiBzY2hCdXR0b247Ci0gICAgcHJpdmF0ZSBKQnV0dG9uIGJhY2tCdXR0b247Ci0KLSAgICBwcml2YXRlIEpMYWJlbCBzY2hMYWJlbDsKLSAgICBwcml2YXRlIEpMYWJlbCBmb3JtYXRMYWJlbDsKLQotCi0gICAgcHJpdmF0ZSBKU09OU2VhcmNoTW9kZWwgbW9kZWw7Ci0gICAgcHJpdmF0ZSBKU09OU2VhcmNoQ2xpZW50IHBhcmVudDsKLQotICAgIHByaXZhdGUgU3RyaW5nIHJlc3BvbnNlOwotICAgIHB1YmxpYyBVc2VySW50ZXJmYWNlKEpTT05TZWFyY2hDbGllbnQgcGFyZW50KSB7Ci0gICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50OwotICAgICAgICBtb2RlbCA9ICBuZXcgSlNPTlNlYXJjaE1vZGVsKCk7Ci0gICAgICAgIGluaXRDb21wb25lbnRzKCk7Ci0KLSAgICAgICAgc2NoQnV0dG9uLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlU2VhcmNoKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIGJhY2tCdXR0b24uYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVCYWNrKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIENvbnRhaW5lciBwYW5lID0gcGFyZW50LmdldENvbnRlbnRQYW5lKCk7Ci0gICAgICAgIHBhbmUuc2V0TGF5b3V0KG51bGwpOwotCi0gICAgICAgIHBhbmUuYWRkKHNjaExhYmVsKTsKLSAgICAgICAgcGFuZS5hZGQoc2NoRmllbGQpOwotICAgICAgICBwYW5lLmFkZChmb3JtYXRMYWJlbCk7Ci0gICAgICAgIHBhbmUuYWRkKGZvcm1hdEZpZWxkKTsKLSAgICAgICAgcGFuZS5hZGQoYmFja0J1dHRvbik7Ci0gICAgICAgIHBhbmUuYWRkKHNjaEJ1dHRvbik7Ci0gICAgICAgIHBhbmUuYWRkKHNjcm9sbFBhbmUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGluaXRDb21wb25lbnRzKCkgewotICAgICAgICBzY2hMYWJlbCA9IG5ldyBKTGFiZWwoIlNlYXJjaCBmb3IiKTsKLSAgICAgICAgc2NoTGFiZWwuc2V0Qm91bmRzKDIwLCAxMCwgODAsIDI1KTsKLSAgICAgICAgc2NoRmllbGQgPSBuZXcgSlRleHRGaWVsZCgpOwotICAgICAgICBzY2hGaWVsZC5zZXRCb3VuZHMoOTAsIDEwLCAyNTAsIDI1KTsKLQotICAgICAgICBmb3JtYXRMYWJlbCA9IG5ldyBKTGFiZWwoImZvcm1hdCIpOwotICAgICAgICBmb3JtYXRMYWJlbC5zZXRCb3VuZHMoMzUwLCAxMCwgNTAsIDI1KTsKLSAgICAgICAgZm9ybWF0RmllbGQgPSBuZXcgSlRleHRGaWVsZCgpOwotICAgICAgICBmb3JtYXRGaWVsZC5zZXRCb3VuZHMoNDAwLCAxMCwgMTAwLCAyNSk7Ci0KLSAgICAgICAgYmFja0J1dHRvbiA9IG5ldyBKQnV0dG9uKCJCYWNrIHRvIFJlc3VsdHMiKTsKLSAgICAgICAgYmFja0J1dHRvbi5zZXRCb3VuZHMoNjcwLCAxMCwgMTUwLCAyNSk7Ci0gICAgICAgIGJhY2tCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0KLSAgICAgICAgc2NoQnV0dG9uID0gIG5ldyBKQnV0dG9uKCJTZWFyY2giKTsKLSAgICAgICAgc2NoQnV0dG9uLnNldEJvdW5kcyg1MTAsIDEwLCAxNTAsIDI1KTsKLQotCi0gICAgICAgIGplcCA9IG5ldyBKRWRpdG9yUGFuZSgpOwotICAgICAgICBqZXAuc2V0RWRpdGFibGUoZmFsc2UpOwotICAgICAgICBqZXAuc2V0Q29udGVudFR5cGUoInRleHQvaHRtbCIpOwotICAgICAgICBqZXAuYWRkSHlwZXJsaW5rTGlzdGVuZXIodGhpcyk7Ci0KLSAgICAgICAgc2Nyb2xsUGFuZSA9IG5ldyBKU2Nyb2xsUGFuZShqZXApOwotICAgICAgICBzY3JvbGxQYW5lLnNldEJvdW5kcygxMCwgODAsIChKU09OU2VhcmNoQ2xpZW50LndpZHRoIC0gMzApLCAoSlNPTlNlYXJjaENsaWVudC5oZWlnaHQgLSAxNjApKTsKLQotCi0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVNlYXJjaCgpewotICAgICAgICBTdHJpbmcgcXVlcnkgPSBzY2hGaWVsZC5nZXRUZXh0KCk7Ci0KLSAgICAgICAgaWYoIXF1ZXJ5LmVxdWFscygiIikpewotICAgICAgICAgICAgcmVzcG9uc2UgPSBtb2RlbC5zZWFyY2hZYWhvbyhxdWVyeSwgZm9ybWF0RmllbGQuZ2V0VGV4dCgpKTsKLSAgICAgICAgICAgIGplcC5zZXRUZXh0KHJlc3BvbnNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBoYW5kbGVCYWNrKCl7Ci0gICAgICAgIGplcC5zZXRUZXh0KHJlc3BvbnNlKTsKLSAgICAgICAgYmFja0J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBoeXBlcmxpbmtVcGRhdGUoSHlwZXJsaW5rRXZlbnQgaGUpIHsKLSAgICAgICAgaWYgKGhlLmdldEV2ZW50VHlwZSgpID09IEh5cGVybGlua0V2ZW50LkV2ZW50VHlwZS5BQ1RJVkFURUQpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgamVwLnNldFBhZ2UoaGUuZ2V0VVJMKCkpOwotICAgICAgICAgICAgICAgIGJhY2tCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgSk9wdGlvblBhbmUuc2hvd01lc3NhZ2VEaWFsb2cocGFyZW50LCAiUGFnZSBjb3VsZCBub3QgYmUgbG9hZGVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBhZ2UgRXJyb3IiLCBKT3B0aW9uUGFuZS5FUlJPUl9NRVNTQUdFKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgfQotfQotCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3lhaG9vcmVzdHNlYXJjaC9SRUFETUUudHh0IGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy95YWhvb3Jlc3RzZWFyY2gvUkVBRE1FLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWIwOGUyMi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3lhaG9vcmVzdHNlYXJjaC9SRUFETUUudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotU2FtcGxlIGZvciBZYWhvbyAtIFNlYXJjaCAtIFJFU1QNCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0NCi1JbnRyb2R1Y3Rpb24NCi09PT09PT09PT09PT0NCi0NCi1BeGlzMiBjbGllbnQgQVBJIGhhcyBmYWNpbGl0aWVzIHRvIGludm9rZSBSRVNUIGludGVyZmFjZXMuIFRoZSBBUEkgdG8gYmUgdXNlZCBpcyBhbG1vc3QgdGhlIHNhbWUNCi1hcyB0aGUgb25lIHdlIHVzZSB3aGlsZSBpbnZva2luZyB3aXRoIFJFU1QuDQotDQotWWFob28gcHJvdmlkZXMgYSBSRVNUIEFQSSB0byBjYWxsIGl0cyBzZWFyY2ggc2VydmljZS4gVGhpcyBzYW1wbGUgZGVtb25zdHJhdGVzIGhvdyB0byBjYWxsIFlhaG9vDQotc2VhcmNoIHNlcnZpY2UgdXNpbmcgYW4gQXhpczIgY2xpZW50Lg0KLQ0KLVByZS1SZXF1aXNpdGVzDQotPT09PT09PT09PT09PT0NCi0NCi1BcGFjaGUgQW50IDEuNi4yIG9yIGxhdGVyDQotDQotUnVubmluZyBUaGUgU2FtcGxlDQotPT09PT09PT09PT09PT09PT09DQotDQotVHlwZSAiYW50IiBmcm9tIEF4aXMyX0hPTUUvc2FtcGxlcy95YWhvb3Jlc3RzZWFyY2ggZGlyZWN0b3J5Lg0KLQ0KLUhlbHANCi09PT09DQotUGxlYXNlIGNvbnRhY3QgYXhpcy11c2VyIGxpc3QgKGF4aXMtdXNlckB3cy5hcGFjaGUub3JnKSBpZiB5b3UgaGF2ZSBhbnkgdHJvdWJsZSBydW5uaW5nIHRoZSBzYW1wbGUuDQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy95YWhvb3Jlc3RzZWFyY2gvYnVpbGQueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy95YWhvb3Jlc3RzZWFyY2gvYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmNjlhNGM4Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMveWFob29yZXN0c2VhcmNoL2J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHByb2plY3QgbmFtZT0iWWFob29SZXN0U2VhcmNoU2FtcGxlIiBkZWZhdWx0PSJydW4uY2xpZW50Ij4KLQk8cHJvcGVydHkgZW52aXJvbm1lbnQ9ImVudiIgLz4KLQk8cHJvcGVydHkgbmFtZT0iYXhpczIuaG9tZSIgdmFsdWU9Ii4uLy4uLyIgLz4KLQk8cHJvcGVydHkgbmFtZT0iYXhpczIucmVwbyIgdmFsdWU9IiR7YXhpczIuaG9tZX0vcmVwb3NpdG9yeSIgLz4KLQk8cHJvcGVydHkgbmFtZT0iYnVpbGQuZGlyIiB2YWx1ZT0iYnVpbGQiIC8+Ci0JPHByb3BlcnR5IG5hbWU9ImNsaWVudC5jbGFzc2VzLmRpciIgdmFsdWU9IiR7YnVpbGQuZGlyfS9jbGFzc2VzIiAvPgotCTxwYXRoIGlkPSJheGlzLmNsYXNzcGF0aCI+Ci0JCTxmaWxlc2V0IGRpcj0iJHtheGlzMi5ob21lfS9saWIiPgotCQkJPGluY2x1ZGUgbmFtZT0iKi5qYXIiIC8+Ci0JCTwvZmlsZXNldD4KLQkJPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC95YWhvb1JFU1RTZWFyY2guamFyIiAvPgotCTwvcGF0aD4KLQotCTx0YXJnZXQgbmFtZT0iY29tcGlsZSI+Ci0JCTxta2RpciBkaXI9IiR7Y2xpZW50LmNsYXNzZXMuZGlyfSIgLz4KLQkJPCEtLSBDb21waWxlIGNsaWVudCAtLT4KLQkJPGphdmFjIHNyY2Rpcj0ic3JjIiBkZXN0ZGlyPSIke2NsaWVudC5jbGFzc2VzLmRpcn0iPgotCQkJPGNsYXNzcGF0aCByZWZpZD0iYXhpcy5jbGFzc3BhdGgiIC8+Ci0JCTwvamF2YWM+Ci0JCTxqYXIgZGVzdGZpbGU9IiR7YnVpbGQuZGlyfS95YWhvb1JFU1RTZWFyY2guamFyIj4KLQkJCTxmaWxlc2V0IGRpcj0iJHtidWlsZC5kaXJ9L2NsYXNzZXMiIC8+Ci0JCTwvamFyPgotCTwvdGFyZ2V0PgotCTx0YXJnZXQgbmFtZT0icnVuLmNsaWVudCIgZGVwZW5kcz0iY29tcGlsZSI+Ci0JCTxqYXZhIGNsYXNzbmFtZT0ic2FtcGxlLnlhaG9vc2VydmljZXMuUkVTVFNlYXJjaC5SRVNUU2VhcmNoQ2xpZW50IiBjbGFzc3BhdGhyZWY9ImF4aXMuY2xhc3NwYXRoIiBmb3JrPSJ0cnVlIj4KLQkJCTxqdm1hcmcgdmFsdWU9Ii1EYXhpczIucmVwbz0ke2F4aXMyLnJlcG99IiAvPgotCQk8L2phdmE+Ci0JPC90YXJnZXQ+Ci0JPHRhcmdldCBuYW1lPSJjbGVhbiI+Ci0JCTxkZWxldGUgZGlyPSJidWlsZCIgLz4KLQk8L3RhcmdldD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMveWFob29yZXN0c2VhcmNoL3NyYy9zYW1wbGUveWFob29zZXJ2aWNlcy9SRVNUU2VhcmNoL1JFU1RTZWFyY2hDbGllbnQuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMveWFob29yZXN0c2VhcmNoL3NyYy9zYW1wbGUveWFob29zZXJ2aWNlcy9SRVNUU2VhcmNoL1JFU1RTZWFyY2hDbGllbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmMzYTI4OS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3lhaG9vcmVzdHNlYXJjaC9zcmMvc2FtcGxlL3lhaG9vc2VydmljZXMvUkVTVFNlYXJjaC9SRVNUU2VhcmNoQ2xpZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIHNhbXBsZS55YWhvb3NlcnZpY2VzLlJFU1RTZWFyY2g7Ci0KLWltcG9ydCBqYXZheC5zd2luZy4qOwotaW1wb3J0IGphdmEuYXd0Lio7Ci0KLXB1YmxpYyBjbGFzcyBSRVNUU2VhcmNoQ2xpZW50IGV4dGVuZHMgSkZyYW1lIHsKLSAgICBwdWJsaWMgc3RhdGljIGludCB3aWR0aDsKLSAgICBwdWJsaWMgc3RhdGljIGludCBoZWlnaHQ7Ci0KLSAgICBwdWJsaWMgUkVTVFNlYXJjaENsaWVudChTdHJpbmcgdGl0bGUpIHRocm93cyBIZWFkbGVzc0V4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyKHRpdGxlKTsKLQotICAgICAgICB0aGlzLmdldENvbnRlbnRQYW5lKCkuYWRkKG5ldyBVc2VySW50ZXJmYWNlKHRoaXMpKTsKLSAgICAgICAgdGhpcy5zZXRWaXNpYmxlKHRydWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgRGltZW5zaW9uIHNjcmVlblNpemUgPSBUb29sa2l0LmdldERlZmF1bHRUb29sa2l0KCkuZ2V0U2NyZWVuU2l6ZSgpOwotICAgICAgICB3aWR0aCA9IHNjcmVlblNpemUud2lkdGg7Ci0gICAgICAgIGhlaWdodCA9IHNjcmVlblNpemUuaGVpZ2h0OwotICAgICAgICBSRVNUU2VhcmNoQ2xpZW50IGZvcm0gPSBuZXcgUkVTVFNlYXJjaENsaWVudCgiQXhpczIgUkVTVCBTZWFyY2ggQ2xpZW50Iik7Ci0KLSAgICAgICAgaW50IGxlZnQgPSAod2lkdGgpIC8gMjsKLSAgICAgICAgaW50IHRvcCA9IChoZWlnaHQpIC8gMjsKLSAgICAgICAgZm9ybS5zZXRMb2NhdGlvbihsZWZ0LCB0b3ApOwotICAgICAgICBmb3JtLnNldFNpemUod2lkdGgsIGhlaWdodCk7Ci0gICAgICAgIGZvcm0uc2V0RGVmYXVsdENsb3NlT3BlcmF0aW9uKFdpbmRvd0NvbnN0YW50cy5FWElUX09OX0NMT1NFKTsKLSAgICAgICAgZm9ybS5zZXRWaXNpYmxlKHRydWUpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NhbXBsZXMveWFob29yZXN0c2VhcmNoL3NyYy9zYW1wbGUveWFob29zZXJ2aWNlcy9SRVNUU2VhcmNoL1JFU1RTZWFyY2hNb2RlbC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy95YWhvb3Jlc3RzZWFyY2gvc3JjL3NhbXBsZS95YWhvb3NlcnZpY2VzL1JFU1RTZWFyY2gvUkVTVFNlYXJjaE1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzN2RkM2YuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy95YWhvb3Jlc3RzZWFyY2gvc3JjL3NhbXBsZS95YWhvb3NlcnZpY2VzL1JFU1RTZWFyY2gvUkVTVFNlYXJjaE1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBzYW1wbGUueWFob29zZXJ2aWNlcy5SRVNUU2VhcmNoOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuT3B0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5TZXJ2aWNlQ2xpZW50OwotCi1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTEVuY29kZXI7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgUkVTVFNlYXJjaE1vZGVsIHsKLSAgICAvKioKLSAgICAgKiBIVE1MIEhlYWRlciB0byBkZXNwbGF5IHNuaXBwZXQgdGV4dAotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGJlZ2luSFRNTCA9ICI8SFRNTD48SEVBRD48VElUTEU+U2VhcmNoIFJlc3VsdHM8L1RJVExFPjwvSEVBRD48Qk9EWT4iOwotCi0gICAgLyoqCi0gICAgICogSFRNTCBmb290ZXIKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBlbmRIVE1MID0gIjwvQk9EWT48L0hUTUw+IjsKLQotICAgIC8qKgotICAgICAqIFN0b3JlIHRoZSB0ZXh0cyByZWFkIGJ5IE5hdmlnYXRpb25VUkwgb2Ygc29hcAotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIHNuaXBwZXQ7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHNlYXJjaFlhaG9vKFN0cmluZyBxdWVyeSwgU3RyaW5nIGZvcm1hdCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgc25pcHBldCA9IGJlZ2luSFRNTDsKLSAgICAgICAgICAgIFN0cmluZyBlcHIgPSAiaHR0cDovL3NlYXJjaC55YWhvb2FwaXMuY29tL1dlYlNlYXJjaFNlcnZpY2UvVjEvd2ViU2VhcmNoIjsKLQotICAgICAgICAgICAgU2VydmljZUNsaWVudCBjbGllbnQgPSBuZXcgU2VydmljZUNsaWVudCgpOwotICAgICAgICAgICAgT3B0aW9ucyBvcHRpb25zID0gbmV3IE9wdGlvbnMoKTsKLSAgICAgICAgICAgIGNsaWVudC5zZXRPcHRpb25zKG9wdGlvbnMpOwotICAgICAgICAgICAgb3B0aW9ucy5zZXRUbyhuZXcgRW5kcG9pbnRSZWZlcmVuY2UoZXByKSk7Ci0gICAgICAgICAgICBvcHRpb25zLnNldFByb3BlcnR5KENvbnN0YW50cy5Db25maWd1cmF0aW9uLkVOQUJMRV9SRVNULCBDb25zdGFudHMuVkFMVUVfVFJVRSk7Ci0gICAgICAgICAgICBvcHRpb25zLnNldFByb3BlcnR5KENvbnN0YW50cy5Db25maWd1cmF0aW9uLkhUVFBfTUVUSE9ELCBDb25zdGFudHMuQ29uZmlndXJhdGlvbi5IVFRQX01FVEhPRF9HRVQpOwotCSAgICBvcHRpb25zLnNldFByb3BlcnR5KENvbnN0YW50cy5Db25maWd1cmF0aW9uLk1FU1NBR0VfVFlQRSxvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkhUVFBDb25zdGFudHMuTUVESUFfVFlQRV9YX1dXV19GT1JNKTsKLQotICAgICAgICAgICAgLy9pZiBwb3N0IGlzIHRocm91Z2ggR0VUIG9mIEhUVFAKLSAgICAgICAgICAgIE9NRWxlbWVudCByZXNwb25zZSA9IGNsaWVudC5zZW5kUmVjZWl2ZShnZXRQYXlsb2FkRm9yWWFob29TZWFyY2hDYWxsKHF1ZXJ5LCBmb3JtYXQpKTsKLSAgICAgICAgICAgIGdlbmVyYXRlU25pcHBldChyZXNwb25zZSk7Ci0gICAgICAgICAgICByZXR1cm4gc25pcHBldDsKLQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIHNuaXBwZXQgPSAiPEgyPkVycm9yIG9jY3VycmVkIGR1cmluZyB0aGUgaW52b2NhdGlvbiB0byBZYWhvbyBzZWFyY2ggc2VydmljZTwvSDI+IiArCi0gICAgICAgICAgICAgICAgICAgICI8cD4iICsgZS5nZXRNZXNzYWdlKCkgKyAiPC9wPiIgKyBlbmRIVE1MOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIE9NRWxlbWVudCBnZXRQYXlsb2FkRm9yWWFob29TZWFyY2hDYWxsKFN0cmluZyBxdWVyeVN0ciwgU3RyaW5nIGZvcm1hdFN0cikgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gewotICAgICAgICBPTUZhY3RvcnkgZmFjID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCk7Ci0gICAgICAgIE9NRWxlbWVudCByb290RWxlbWVudCA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoIndlYlNlYXJjaCIsIG51bGwpOwotCi0gICAgICAgIE9NRWxlbWVudCBhcHBJZCA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoImFwcGlkIiwgbnVsbCwgcm9vdEVsZW1lbnQpOwotICAgICAgICBhcHBJZC5zZXRUZXh0KCJBcGFjaGVSZXN0RGVtbyIpOwotCi0gICAgICAgIE9NRWxlbWVudCBxdWVyeSA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoInF1ZXJ5IiwgbnVsbCwgcm9vdEVsZW1lbnQpOwotICAgICAgICBxdWVyeS5zZXRUZXh0KFVSTEVuY29kZXIuZW5jb2RlKHF1ZXJ5U3RyLCAiVVRGLTgiKSk7Ci0KLSAgICAgICAgaWYgKGZvcm1hdFN0ciAhPSBudWxsICYmIGZvcm1hdFN0ci5sZW5ndGgoKSAhPSAwKSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgZm9ybWF0ID0gZmFjLmNyZWF0ZU9NRWxlbWVudCgiZm9ybWF0IiwgbnVsbCwgcm9vdEVsZW1lbnQpOwotICAgICAgICAgICAgZm9ybWF0LnNldFRleHQoVVJMRW5jb2Rlci5lbmNvZGUoZm9ybWF0U3RyLCAiVVRGLTgiKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJvb3RFbGVtZW50OwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBnZW5lcmF0ZVNuaXBwZXQoT01FbGVtZW50IHJlc3BvbnNlKSB7Ci0gICAgICAgIFN0cmluZyB0aXRsZSA9IG51bGw7Ci0gICAgICAgIFN0cmluZyBzdW1tYXJ5ID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIGNsaWNrVXJsID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIHVybCA9IG51bGw7Ci0gICAgICAgIE9NRWxlbWVudCByZXN1bHQgPSBudWxsOwotICAgICAgICAvL2dldCBhbiBpdGVyYXRvciBmb3IgUmVzdWx0IGVsZW1lbnRzCi0gICAgICAgIEl0ZXJhdG9yIGl0ciA9IHJlc3BvbnNlLmdldENoaWxkRWxlbWVudHMoKTsKLSAgICAgICAgSXRlcmF0b3IgaW5uZXJJdHI7Ci0gICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSAoT01FbGVtZW50KSBpdHIubmV4dCgpOwotICAgICAgICAgICAgaW5uZXJJdHIgPSByZXN1bHQuZ2V0Q2hpbGRFbGVtZW50cygpOwotICAgICAgICAgICAgdGl0bGUgPSAoKE9NRWxlbWVudCkgaW5uZXJJdHIubmV4dCgpKS5nZXRUZXh0KCk7Ci0gICAgICAgICAgICBzdW1tYXJ5ID0gKChPTUVsZW1lbnQpIGlubmVySXRyLm5leHQoKSkuZ2V0VGV4dCgpOwotICAgICAgICAgICAgdXJsID0gKChPTUVsZW1lbnQpIGlubmVySXRyLm5leHQoKSkuZ2V0VGV4dCgpOwotICAgICAgICAgICAgY2xpY2tVcmwgPSAoKE9NRWxlbWVudCkgaW5uZXJJdHIubmV4dCgpKS5nZXRUZXh0KCk7Ci0gICAgICAgICAgICBzbmlwcGV0ICs9ICI8YSBocmVmPSIgKyBjbGlja1VybCArICI+IiArIHRpdGxlICsgIjwvYT4iICsgIjxicj4iICsgc3VtbWFyeSArCi0gICAgICAgICAgICAgICAgICAgICI8YnI+IiArIHVybCArICI8YnI+IiArICI8YnI+IjsKLSAgICAgICAgfQotICAgICAgICBzbmlwcGV0ICs9IGVuZEhUTUw7Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3lhaG9vcmVzdHNlYXJjaC9zcmMvc2FtcGxlL3lhaG9vc2VydmljZXMvUkVTVFNlYXJjaC9Vc2VySW50ZXJmYWNlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9zYW1wbGVzL3lhaG9vcmVzdHNlYXJjaC9zcmMvc2FtcGxlL3lhaG9vc2VydmljZXMvUkVTVFNlYXJjaC9Vc2VySW50ZXJmYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5YmZjNTMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2FtcGxlcy95YWhvb3Jlc3RzZWFyY2gvc3JjL3NhbXBsZS95YWhvb3NlcnZpY2VzL1JFU1RTZWFyY2gvVXNlckludGVyZmFjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugc2FtcGxlLnlhaG9vc2VydmljZXMuUkVTVFNlYXJjaDsKLQotaW1wb3J0IGphdmF4LnN3aW5nLio7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuSHlwZXJsaW5rTGlzdGVuZXI7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuSHlwZXJsaW5rRXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuKjsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudDsKLQotcHVibGljIGNsYXNzIFVzZXJJbnRlcmZhY2UgZXh0ZW5kcyBKUGFuZWwgaW1wbGVtZW50cyBIeXBlcmxpbmtMaXN0ZW5lciB7Ci0KLSAgICBwcml2YXRlIEpFZGl0b3JQYW5lIGplcDsKLSAgICBwcml2YXRlIEpTY3JvbGxQYW5lIHNjcm9sbFBhbmU7Ci0KLSAgICBwcml2YXRlIEpUZXh0RmllbGQgc2NoRmllbGQ7Ci0gICAgcHJpdmF0ZSBKVGV4dEZpZWxkIGZvcm1hdEZpZWxkOwotCi0gICAgcHJpdmF0ZSBKQnV0dG9uIHNjaEJ1dHRvbjsKLSAgICBwcml2YXRlIEpCdXR0b24gYmFja0J1dHRvbjsKLQotICAgIHByaXZhdGUgSkxhYmVsIHNjaExhYmVsOwotICAgIHByaXZhdGUgSkxhYmVsIGZvcm1hdExhYmVsOwotCi0KLSAgICBwcml2YXRlIFJFU1RTZWFyY2hNb2RlbCBtb2RlbDsKLSAgICBwcml2YXRlIFJFU1RTZWFyY2hDbGllbnQgcGFyZW50OwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgcmVzcG9uc2U7Ci0gICAgcHVibGljIFVzZXJJbnRlcmZhY2UoUkVTVFNlYXJjaENsaWVudCBwYXJlbnQpIHsKLSAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0gICAgICAgIG1vZGVsID0gIG5ldyBSRVNUU2VhcmNoTW9kZWwoKTsKLSAgICAgICAgaW5pdENvbXBvbmVudHMoKTsKLQotICAgICAgICBzY2hCdXR0b24uYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVTZWFyY2goKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgYmFja0J1dHRvbi5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGhhbmRsZUJhY2soKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgQ29udGFpbmVyIHBhbmUgPSBwYXJlbnQuZ2V0Q29udGVudFBhbmUoKTsKLSAgICAgICAgcGFuZS5zZXRMYXlvdXQobnVsbCk7Ci0KLSAgICAgICAgcGFuZS5hZGQoc2NoTGFiZWwpOwotICAgICAgICBwYW5lLmFkZChzY2hGaWVsZCk7Ci0gICAgICAgIHBhbmUuYWRkKGZvcm1hdExhYmVsKTsKLSAgICAgICAgcGFuZS5hZGQoZm9ybWF0RmllbGQpOwotICAgICAgICBwYW5lLmFkZChiYWNrQnV0dG9uKTsKLSAgICAgICAgcGFuZS5hZGQoc2NoQnV0dG9uKTsKLSAgICAgICAgcGFuZS5hZGQoc2Nyb2xsUGFuZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaW5pdENvbXBvbmVudHMoKSB7Ci0gICAgICAgIHNjaExhYmVsID0gbmV3IEpMYWJlbCgiU2VhcmNoIGZvciIpOwotICAgICAgICBzY2hMYWJlbC5zZXRCb3VuZHMoMjAsIDEwLCA4MCwgMjUpOwotICAgICAgICBzY2hGaWVsZCA9IG5ldyBKVGV4dEZpZWxkKCk7Ci0gICAgICAgIHNjaEZpZWxkLnNldEJvdW5kcyg5MCwgMTAsIDI1MCwgMjUpOwotCi0gICAgICAgIGZvcm1hdExhYmVsID0gbmV3IEpMYWJlbCgiZm9ybWF0Iik7Ci0gICAgICAgIGZvcm1hdExhYmVsLnNldEJvdW5kcygzNTAsIDEwLCA1MCwgMjUpOwotICAgICAgICBmb3JtYXRGaWVsZCA9IG5ldyBKVGV4dEZpZWxkKCk7Ci0gICAgICAgIGZvcm1hdEZpZWxkLnNldEJvdW5kcyg0MDAsIDEwLCAxMDAsIDI1KTsKLQotICAgICAgICBiYWNrQnV0dG9uID0gbmV3IEpCdXR0b24oIkJhY2sgdG8gUmVzdWx0cyIpOwotICAgICAgICBiYWNrQnV0dG9uLnNldEJvdW5kcyg2NzAsIDEwLCAxNTAsIDI1KTsKLSAgICAgICAgYmFja0J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQotICAgICAgICBzY2hCdXR0b24gPSAgbmV3IEpCdXR0b24oIlNlYXJjaCIpOwotICAgICAgICBzY2hCdXR0b24uc2V0Qm91bmRzKDUxMCwgMTAsIDE1MCwgMjUpOwotCi0KLSAgICAgICAgamVwID0gbmV3IEpFZGl0b3JQYW5lKCk7Ci0gICAgICAgIGplcC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0gICAgICAgIGplcC5zZXRDb250ZW50VHlwZSgidGV4dC9odG1sIik7Ci0gICAgICAgIGplcC5hZGRIeXBlcmxpbmtMaXN0ZW5lcih0aGlzKTsKLQotICAgICAgICBzY3JvbGxQYW5lID0gbmV3IEpTY3JvbGxQYW5lKGplcCk7Ci0gICAgICAgIHNjcm9sbFBhbmUuc2V0Qm91bmRzKDEwLCA4MCwgKFJFU1RTZWFyY2hDbGllbnQud2lkdGggLSAzMCksIChSRVNUU2VhcmNoQ2xpZW50LmhlaWdodCAtIDE2MCkpOwotCi0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlU2VhcmNoKCl7Ci0gICAgICAgIFN0cmluZyBxdWVyeSA9IHNjaEZpZWxkLmdldFRleHQoKTsKLQotICAgICAgICBpZighcXVlcnkuZXF1YWxzKCIiKSl7Ci0gICAgICAgICAgICByZXNwb25zZSA9IG1vZGVsLnNlYXJjaFlhaG9vKHF1ZXJ5LCBmb3JtYXRGaWVsZC5nZXRUZXh0KCkpOwotICAgICAgICAgICAgamVwLnNldFRleHQocmVzcG9uc2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZUJhY2soKXsKLSAgICAgICAgamVwLnNldFRleHQocmVzcG9uc2UpOwotICAgICAgICBiYWNrQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGh5cGVybGlua1VwZGF0ZShIeXBlcmxpbmtFdmVudCBoZSkgewotICAgICAgICBpZiAoaGUuZ2V0RXZlbnRUeXBlKCkgPT0gSHlwZXJsaW5rRXZlbnQuRXZlbnRUeXBlLkFDVElWQVRFRCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBqZXAuc2V0UGFnZShoZS5nZXRVUkwoKSk7Ci0gICAgICAgICAgICAgICAgYmFja0J1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICBKT3B0aW9uUGFuZS5zaG93TWVzc2FnZURpYWxvZyhwYXJlbnQsICJQYWdlIGNvdWxkIG5vdCBiZSBsb2FkZWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUGFnZSBFcnJvciIsIEpPcHRpb25QYW5lLkVSUk9SX01FU1NBR0UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zY3JpcHRpbmcvcG9tLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL3NjcmlwdGluZy9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Y2UxMjg5Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NjcmlwdGluZy9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjEuNS4xPC92ZXJzaW9uPgotICAgICAgICA8cmVsYXRpdmVQYXRoPi4uL3BhcmVudC9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+Ci0gICAgPC9wYXJlbnQ+Ci0gICAgPGFydGlmYWN0SWQ+YXhpczItc2NyaXB0aW5nPC9hcnRpZmFjdElkPgotICAgIDxwYWNrYWdpbmc+bWFyPC9wYWNrYWdpbmc+Ci0gICAgPG5hbWU+QXBhY2hlIEF4aXMyIC0gU2NyaXB0aW5nPC9uYW1lPgotICAgIDxkZXNjcmlwdGlvbj5BeGlzMiBzY3JpcHRpbmcgc3VwcG9ydCBmb3Igc2VydmljZXMgaW1wbGVtZW50ZWQgd2l0aCBzY3JpcHRpbmcgbGFuZ3VhZ2VzPC9kZXNjcmlwdGlvbj4KLSAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1rZXJuZWw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3ZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+cmhpbm88L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5qczwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUueG1sYmVhbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD54bWxiZWFuczwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmJzZjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmJzZjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgIDwvZGVwZW5kZW5jaWVzPgotICAgIDxidWlsZD4KLSAgICAgICAgPHNvdXJjZURpcmVjdG9yeT5zcmM8L3NvdXJjZURpcmVjdG9yeT4KLSAgICAgICAgPHRlc3RTb3VyY2VEaXJlY3Rvcnk+dGVzdDwvdGVzdFNvdXJjZURpcmVjdG9yeT4KLSAgICAgICAgPHJlc291cmNlcz4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5Pi4uLy4uLy4uPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5OT1RJQ0UudHh0PC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5MSUNFTlNFLnR4dDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgICAgIDxmaWx0ZXJpbmc+ZmFsc2U8L2ZpbHRlcmluZz4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5jb25mPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi8qLnByb3BlcnRpZXM8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9leGNsdWRlcz4KLSAgICAgICAgICAgICAgICA8ZmlsdGVyaW5nPmZhbHNlPC9maWx0ZXJpbmc+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi8qLmphdmE8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9leGNsdWRlcz4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgIDwvcmVzb3VyY2VzPgotICAgICAgICA8dGVzdFJlc291cmNlcz4KLSAgICAgICAgICAgIDx0ZXN0UmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPHRhcmdldFBhdGg+Li4vdGVzdC1yZXNvdXJjZXM8L3RhcmdldFBhdGg+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT50ZXN0LXJlc291cmNlczwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKio8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgIDwvdGVzdFJlc291cmNlPgotICAgICAgICA8L3Rlc3RSZXNvdXJjZXM+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxza2lwPmZhbHNlPC9za2lwPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qVGVzdC5qYXZhPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi9TY3JpcHRNb2R1bGVUZXN0LmphdmE8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi9TY3JpcHREZXBsb3ltZW50RW5naW5lVGVzdC5qYXZhPC9leGNsdWRlPgotICAgICAgICAgICAgICAgICAgICA8L2V4Y2x1ZGVzPgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLW1hci1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+JHt2ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8ZXh0ZW5zaW9ucz50cnVlPC9leHRlbnNpb25zPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZURlcGVuZGVuY2llcz5mYWxzZTwvaW5jbHVkZURlcGVuZGVuY2llcz4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvYnVpbGQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zY3JpcHRpbmcvc3JjL01FVEEtSU5GL21vZHVsZS54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9zY3JpcHRpbmcvc3JjL01FVEEtSU5GL21vZHVsZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1ODczNjAuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2NyaXB0aW5nL3NyYy9NRVRBLUlORi9tb2R1bGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08bW9kdWxlIG5hbWU9InNjcmlwdCIKLSAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuc2NyaXB0aW5nLlNjcmlwdE1vZHVsZSI+Ci08L21vZHVsZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zY3JpcHRpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvc2NyaXB0aW5nL1NjcmlwdERlcGxveW1lbnRFbmdpbmUuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NjcmlwdGluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9zY3JpcHRpbmcvU2NyaXB0RGVwbG95bWVudEVuZ2luZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2FkOWE3Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NjcmlwdGluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9zY3JpcHRpbmcvU2NyaXB0RGVwbG95bWVudEVuZ2luZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zY3JpcHRpbmc7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQuRGVwbG95bWVudEVuZ2luZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQuRGVwbG95bWVudEVycm9yTXNnczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQuRGVwbG95bWVudEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQucmVwb3NpdG9yeS51dGlsLkRlcGxveW1lbnRGaWxlRGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQucmVwb3NpdG9yeS51dGlsLldTSW5mbzsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQudXRpbC5VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlR3JvdXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5QYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5XU0RMMTFUb0F4aXNTZXJ2aWNlQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLldTRExUb0F4aXNTZXJ2aWNlQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmkxOG4uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogQW4gQXhpczIgRGVwbG95bWVudEVuZ2luZSBzdWJjbGFzcyBmb3IgZGVwbG95aW5nIHNjcmlwdCBzZXJ2aWNlcyAKLSAqIHN1cHBvcnRpbmcgaG90IGRlcGxveSBhbmQgaG90IHVwZGF0ZS4KLSAqLwotcHVibGljIGNsYXNzIFNjcmlwdERlcGxveW1lbnRFbmdpbmUgZXh0ZW5kcyBEZXBsb3ltZW50RW5naW5lIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhTY3JpcHRNb2R1bGUuY2xhc3MpOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NSSVBUX0hPVF9VUERBVEVfID0gInNjcmlwdHMuaG90dXBkYXRlIjsKLQotICAgIHByaXZhdGUgQXhpc0NvbmZpZ3VyYXRpb24gcmVhbEF4aXNDb25maWc7Ci0KLSAgICBwdWJsaWMgU2NyaXB0RGVwbG95bWVudEVuZ2luZShBeGlzQ29uZmlndXJhdGlvbiByZWFsQXhpc0NvbmZpZykgewotICAgICAgICB0aGlzLmF4aXNDb25maWcgPSBuZXcgQXhpc0NvbmZpZ3VyYXRpb24oKTsKLSAgICAgICAgdGhpcy5yZWFsQXhpc0NvbmZpZyA9IHJlYWxBeGlzQ29uZmlnOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGxvYWRSZXBvc2l0b3J5KEZpbGUgc2NyaXB0c1JlcG9GaWxlKSB0aHJvd3MgRGVwbG95bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMucmVwb0xpc3RlbmVyID0gbmV3IFNjcmlwdFJlcG9zaXRvcnlMaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgdGhpcy5zZXJ2aWNlc0RpciA9IHNjcmlwdHNSZXBvRmlsZTsKLQotICAgICAgICBQYXJhbWV0ZXIgc2NyaXB0c0hvdFVwZGF0ZVBhcmFtZXRlciA9IGF4aXNDb25maWcuZ2V0UGFyYW1ldGVyKFNDUklQVF9IT1RfVVBEQVRFXyk7Ci0gICAgICAgIHRoaXMuaG90VXBkYXRlID0gc2NyaXB0c0hvdFVwZGF0ZVBhcmFtZXRlciA9PSBudWxsIHx8ICJ0cnVlIi5lcXVhbHMoc2NyaXB0c0hvdFVwZGF0ZVBhcmFtZXRlci5nZXRWYWx1ZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkb0RlcGxveSgpIHsKLSAgICAgICAgTGlzdCBhbHJlYWR5RGVwbG95ZWQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgd3NUb0RlcGxveS5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgdHJ5IHsKLQotICAgICAgICAgICAgCURlcGxveW1lbnRGaWxlRGF0YSBhcmNoaXZlRmlsZURhdGEgPSAoRGVwbG95bWVudEZpbGVEYXRhKXdzVG9EZXBsb3kuZ2V0KGkpOwotICAgICAgICAgICAgICAgIGRlcGxveVNlcnZpY2UoYWxyZWFkeURlcGxveWVkLCBhcmNoaXZlRmlsZURhdGEpOwotCi0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICAgICAgbG9nLndhcm4oIkV4Y2VwdGlvbiBkZXBsb3lpbmcgc2NyaXB0IHNlcnZpY2U6ICIgKyAoKERlcGxveW1lbnRGaWxlRGF0YSl3c1RvRGVwbG95LmdldChpKSkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB3c1RvRGVwbG95LmNsZWFyKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGRlcGxveVNlcnZpY2UoTGlzdCBhbHJlYWR5RGVwbG95ZWQsIERlcGxveW1lbnRGaWxlRGF0YSBhcmNoaXZlRmlsZURhdGEpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBGaWxlIGZpbGUgPSBhcmNoaXZlRmlsZURhdGEuZ2V0RmlsZSgpOwotCi0gICAgICAgIEZpbGUgd3NkbEZpbGU7Ci0gICAgICAgIEZpbGUgc2NyaXB0RmlsZTsKLSAgICAgICAgaWYgKGZpbGUudG9TdHJpbmcoKS5lbmRzV2l0aCgiLndzZGwiKSkgewotICAgICAgICAgICAgd3NkbEZpbGUgPSBmaWxlOwotICAgICAgICAgICAgc2NyaXB0RmlsZSA9IGdldFNjcmlwdEZvcldTREwod3NkbEZpbGUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc2NyaXB0RmlsZSA9IGZpbGU7Ci0gICAgICAgICAgICB3c2RsRmlsZSA9IGdldFdTRExGb3JTY3JpcHQoc2NyaXB0RmlsZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc2NyaXB0RmlsZSAhPSBudWxsICYmIHdzZGxGaWxlICE9IG51bGwgJiYgIWFscmVhZHlEZXBsb3llZC5jb250YWlucyhzY3JpcHRGaWxlLnRvVVJJKCkpICYmIHNjcmlwdEZpbGUuZXhpc3RzKCkgJiYgd3NkbEZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlID0gY3JlYXRlU2VydmljZSh3c2RsRmlsZSwgc2NyaXB0RmlsZSk7Ci0gICAgICAgICAgICBBeGlzU2VydmljZUdyb3VwIGF4aXNTZXJ2aWNlR3JvdXAgPSBuZXcgQXhpc1NlcnZpY2VHcm91cChheGlzQ29uZmlnKTsKLSAgICAgICAgICAgIGF4aXNTZXJ2aWNlR3JvdXAuc2V0U2VydmljZUdyb3VwQ2xhc3NMb2FkZXIoYXhpc1NlcnZpY2UuZ2V0Q2xhc3NMb2FkZXIoKSk7Ci0gICAgICAgICAgICBheGlzU2VydmljZUdyb3VwLnNldFNlcnZpY2VHcm91cE5hbWUoYXhpc1NlcnZpY2UuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIGF4aXNTZXJ2aWNlR3JvdXAuYWRkU2VydmljZShheGlzU2VydmljZSk7Ci0gICAgICAgICAgICByZWFsQXhpc0NvbmZpZy5hZGRTZXJ2aWNlR3JvdXAoYXhpc1NlcnZpY2VHcm91cCk7Ci0gICAgICAgICAgICBhbHJlYWR5RGVwbG95ZWQuYWRkKHNjcmlwdEZpbGUudG9VUkkoKSk7Ci0gICAgICAgICAgICBsb2cuaW5mbygiRGVwbG95ZWQgc2NyaXB0IHNlcnZpY2UgJyIgKyBheGlzU2VydmljZS5nZXROYW1lKCkgKyAiJyBmb3Igc2NyaXB0OiAiICsgc2NyaXB0RmlsZS5nZXROYW1lKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdW5EZXBsb3koKSB7Ci0gICAgICAgIFN0cmluZyBzZXJ2aWNlTmFtZSA9IG51bGw7Ci0gICAgICAgIExpc3QgdW5kZXBsb3llZCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB3c1RvVW5EZXBsb3kuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgV1NJbmZvIHdzSW5mbyA9IChXU0luZm8pd3NUb1VuRGVwbG95LmdldChpKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZmlsZU5hbWUgPSBVdGlscy5nZXRTaG9ydEZpbGVOYW1lKHdzSW5mby5nZXRGaWxlTmFtZSgpKTsKLS8vICAgICAgICAgICAgICAgIGlmICh3c0luZm8uZ2V0VHlwZSgpID09IFRZUEVfU0VSVklDRSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoaXNIb3RVcGRhdGUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlTmFtZSA9IGdldEF4aXNTZXJ2aWNlTmFtZShmaWxlTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF1bmRlcGxveWVkLmNvbnRhaW5zKHNlcnZpY2VOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFsQXhpc0NvbmZpZy5yZW1vdmVTZXJ2aWNlR3JvdXAoc2VydmljZU5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlcGxveWVkLmFkZChzZXJ2aWNlTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IG5lZWQgYSB3YXkgdG8gYWxzbyByZW1vdmUgdGhlIFNlcnZpY2VHcm91cCBmcm9tIHRoZSBDb25maWdDb250ZXh0LmFwcGxpY2F0aW9uU2Vzc2lvblNlcnZpY2VHcm91cENvbnRleHRUYWJsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuaW5mbyhNZXNzYWdlcy5nZXRNZXNzYWdlKERlcGxveW1lbnRFcnJvck1zZ3MuU0VSVklDRV9SRU1PVkVELCBzZXJ2aWNlTmFtZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBheGlzRmF1bHQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNYXkgYmUgYSBmYXVsdHkgc2VydmljZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWxBeGlzQ29uZmlnLnJlbW92ZUZhdWx0eVNlcnZpY2Uoc2VydmljZU5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygicmVtb3ZlRmF1bHR5U2VydmljZTogIiArIGZpbGVOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlYWxBeGlzQ29uZmlnLnJlbW92ZUZhdWx0eVNlcnZpY2Uoc2VydmljZU5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJub3QgaG90VXBkYXRlLCByZW1vdmVGYXVsdHlTZXJ2aWNlOiAiICsgZmlsZU5hbWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0vLyAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGxvZy53YXJuKGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHdzVG9VbkRlcGxveS5jbGVhcigpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogT3ZlcnJpZGUgdGhlIERlcGxveW1lbnRFbmdpbmUgbWV0aG9kIHJldHVybiBhbiBlbXB0eSBtb2R1bGVzIGRpcmVjdG9yeSBhcwotICAgICAqIGl0cyBub3QgcmVxdWlyZWQgZm9yIHNjcmlwdCBzZXJ2aWNlcwotICAgICAqLwotICAgIHB1YmxpYyBGaWxlIGdldE1vZHVsZXNEaXIoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgRmlsZSgiIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgc2NyaXB0IGFzc29jaWF0ZWQgd2l0aCB0aGUgd3NkbC4gVGhlIGFzc29jaWF0ZWQgc2NyaXB0IGlzIHRoZQotICAgICAqIGZpbGUgd2l0aCB0aGUgc2FtZSBuYW1lIGFzIHRoZSB3c2RsIGZpbGUgZXhjbHVkaW5nIHRoZSBmaWxlIHN1ZmZpeCwgZm9yCi0gICAgICogZXhhbXBsZSwgc3RvY2txdW90ZS5qcyBhbmQgc3RvY2txdW90ZS53c2RsLgotICAgICAqLwotICAgIHByb3RlY3RlZCBGaWxlIGdldFNjcmlwdEZvcldTREwoRmlsZSB3c2RsRmlsZSkgewotICAgICAgICBTdHJpbmcgd3NkbEZpbGVOYW1lID0gd3NkbEZpbGUuZ2V0TmFtZSgpOwotICAgICAgICBTdHJpbmcgZmlsZVN1ZmZpeCA9IHdzZGxGaWxlTmFtZS5zdWJzdHJpbmcoMCwgd3NkbEZpbGVOYW1lLmxhc3RJbmRleE9mKCcuJykgKTsKLSAgICAgICAgRmlsZSB3c2RsRmlsZURpciA9IHdzZGxGaWxlLmdldFBhcmVudEZpbGUoKTsKLSAgICAgICAgU3RyaW5nW10gZmlsZXMgPSB3c2RsRmlsZURpci5saXN0KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmICghZmlsZXNbaV0uZXF1YWxzKHdzZGxGaWxlTmFtZSkgJiYgZmlsZXNbaV0uc3RhcnRzV2l0aChmaWxlU3VmZml4KSkgewotICAgICAgICAgICAgICAgIEZpbGUgc2NyaXB0RmlsZSA9IG5ldyBGaWxlKHdzZGxGaWxlRGlyLCBmaWxlc1tpXSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHNjcmlwdEZpbGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgV1NETCBhc3NvY2lhdGVkIHdpdGggdGhlIHNjcmlwdC4gVGhlIGFzc29jaWF0ZWQgV1NETCBpcyB0aGUgZmlsZQotICAgICAqIHdpdGggdGhlIHNhbWUgbmFtZSBhcyB0aGUgc2NyaXB0IGZpbGUgZXhjbHVkaW5nIHRoZSBmaWxlIHN1ZmZpeCwgZm9yCi0gICAgICogZXhhbXBsZSwgc3RvY2txdW90ZS5qcyBhbmQgc3RvY2txdW90ZS53c2RsLgotICAgICAqLwotICAgIHByb3RlY3RlZCBGaWxlIGdldFdTRExGb3JTY3JpcHQoRmlsZSBzY3JpcHRGaWxlKSB7Ci0gICAgICAgIFN0cmluZyBzY3JpcHRGaWxlTmFtZSA9IHNjcmlwdEZpbGUuZ2V0TmFtZSgpOwotICAgICAgICBTdHJpbmcgZmlsZVN1ZmZpeCA9IHNjcmlwdEZpbGVOYW1lLnN1YnN0cmluZygwLCBzY3JpcHRGaWxlTmFtZS5sYXN0SW5kZXhPZignLicpKTsKLSAgICAgICAgRmlsZSBzY3JpcHRGaWxlRGlyID0gc2NyaXB0RmlsZS5nZXRQYXJlbnRGaWxlKCk7Ci0gICAgICAgIEZpbGUgd3NkbEZpbGUgPSBuZXcgRmlsZShzY3JpcHRGaWxlRGlyLCBmaWxlU3VmZml4ICsgIi53c2RsIik7Ci0gICAgICAgIHJldHVybiB3c2RsRmlsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIEF4aXMyIHNlcnZpY2UgZm9yIHRoZSBzY3JpcHQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQXhpc1NlcnZpY2UgY3JlYXRlU2VydmljZShGaWxlIHdzZGxGaWxlLCBGaWxlIHNjcmlwdEZpbGUpIHsKLSAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UgPSBudWxsOwotICAgICAgICB0cnkgewotCi0gICAgICAgICAgICBJbnB1dFN0cmVhbSBkZWZpbml0aW9uOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBkZWZpbml0aW9uID0gd3NkbEZpbGUudG9VUkwoKS5vcGVuU3RyZWFtKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoImV4Y2VwdGlvbiBvcGVuaW5nIHdzZGwiLCBlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgV1NETFRvQXhpc1NlcnZpY2VCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgV1NETDExVG9BeGlzU2VydmljZUJ1aWxkZXIoZGVmaW5pdGlvbik7Ci0gICAgICAgICAgICBidWlsZGVyLnNldFNlcnZlclNpZGUodHJ1ZSk7Ci0gICAgICAgICAgICBheGlzU2VydmljZSA9IGJ1aWxkZXIucG9wdWxhdGVTZXJ2aWNlKCk7Ci0KLSAgICAgICAgICAgIC8vYXhpc1NlcnZpY2Uuc2V0U2NvcGUoQ29uc3RhbnRzLlNDT1BFX0FQUExJQ0FUSU9OKTsKLSAgICAgICAgICAgIFBhcmFtZXRlciB1c2VyV1NETCA9IG5ldyBQYXJhbWV0ZXIoInVzZU9yaWdpbmFsd3NkbCIsICJ0cnVlIik7Ci0gICAgICAgICAgICBheGlzU2VydmljZS5hZGRQYXJhbWV0ZXIodXNlcldTREwpOwotCi0gICAgICAgICAgICBQYXJhbWV0ZXIgc2NyaXB0U3JjID0gbmV3IFBhcmFtZXRlcihTY3JpcHRSZWNlaXZlci5TQ1JJUFRfU1JDX1BST1AsIHJlYWRTY3JpcHRTb3VyY2Uoc2NyaXB0RmlsZSkpOwotICAgICAgICAgICAgYXhpc1NlcnZpY2UuYWRkUGFyYW1ldGVyKHNjcmlwdFNyYyk7Ci0KLSAgICAgICAgICAgIFNjcmlwdFJlY2VpdmVyIHNjcmlwdFJlY2VpdmVyID0gbmV3IFNjcmlwdFJlY2VpdmVyKCk7Ci0gICAgICAgICAgICBheGlzU2VydmljZS5hZGRNZXNzYWdlUmVjZWl2ZXIoImh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgvd3NkbC9pbi1vdXQiLCBzY3JpcHRSZWNlaXZlcik7Ci0KLSAgICAgICAgICAgIC8vIFRPRE86IFNob3VsZG4ndCB0aGlzIGJlIGRvbmUgYnkgV1NETFRvQXhpc1NlcnZpY2VCdWlsZGVyLnBvcHVsYXRlU2VydmljZT8KLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBheGlzU2VydmljZS5nZXRPcGVyYXRpb25zKCk7IGl0Lmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICBBeGlzT3BlcmF0aW9uIG9wZXJhdGlvbiA9IChBeGlzT3BlcmF0aW9uKWl0Lm5leHQoKTsKLSAgICAgICAgICAgICAgICBvcGVyYXRpb24uc2V0TWVzc2FnZVJlY2VpdmVyKHNjcmlwdFJlY2VpdmVyKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgUGFyYW1ldGVyIHNjcmlwdFBhcmFtID0gbmV3IFBhcmFtZXRlcihTY3JpcHRSZWNlaXZlci5TQ1JJUFRfQVRUUiwgc2NyaXB0RmlsZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIGF4aXNTZXJ2aWNlLmFkZFBhcmFtZXRlcihzY3JpcHRQYXJhbSk7Ci0KLSAgICAgICAgICAgIGF4aXNTZXJ2aWNlLnNldE5hbWUoc2NyaXB0RmlsZS5nZXROYW1lKCkuc3Vic3RyaW5nKDAsIHNjcmlwdEZpbGUuZ2V0TmFtZSgpLmxhc3RJbmRleE9mKCcuJykpKTsKLQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkgewotICAgICAgICAgICAgbG9nLndhcm4oIkF4aXNGYXVsdCBjcmVhdGluZyBzY3JpcHQgc2VydmljZSIsIGUpOwotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBheGlzU2VydmljZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWFkcyB0aGUgY29tcGxldGUgc2NyaXB0IHNvdXJjZSBjb2RlIGludG8gYSBTdHJpbmcKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHJlYWRTY3JpcHRTb3VyY2UoRmlsZSBzY3JpcHRGaWxlKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgSW5wdXRTdHJlYW0gaXM7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpcyA9IHNjcmlwdEZpbGUudG9VUkwoKS5vcGVuU3RyZWFtKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoIklPRXhjZXB0aW9uIG9wZW5pbmcgc2NyaXB0OiAiICsgc2NyaXB0RmlsZSwgZSk7Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFJlYWRlciByZWFkZXIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaXMsICJVVEYtOCIpOwotICAgICAgICAgICAgY2hhcltdIGJ1ZmZlciA9IG5ldyBjaGFyWzEwMjRdOwotICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHNvdXJjZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgIGludCBjb3VudDsKLSAgICAgICAgICAgIHdoaWxlICgoY291bnQgPSByZWFkZXIucmVhZChidWZmZXIpKSA+IDApIHsKLSAgICAgICAgICAgICAgICBzb3VyY2UuYXBwZW5kKGJ1ZmZlciwgMCwgY291bnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHNvdXJjZS50b1N0cmluZygpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJJT0V4Y2VwdGlvbiByZWFkaW5nIHNjcmlwdDogIiArIHNjcmlwdEZpbGUsIGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpcy5jbG9zZSgpOwotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoIklPRXhjZXB0aW9uIGNsb3Npbmcgc2NyaXB0OiAiICsgc2NyaXB0RmlsZSwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NjcmlwdGluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9zY3JpcHRpbmcvU2NyaXB0SW52b2tlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvc2NyaXB0aW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NjcmlwdGluZy9TY3JpcHRJbnZva2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzYmIxNGQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2NyaXB0aW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NjcmlwdGluZy9TY3JpcHRJbnZva2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjcmlwdGluZzsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYnNmLkJTRkVuZ2luZTsKLWltcG9ydCBvcmcuYXBhY2hlLmJzZi5CU0ZFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5ic2YuQlNGTWFuYWdlcjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLQotcHVibGljIGNsYXNzIFNjcmlwdEludm9rZXIgewotCi0JcHJvdGVjdGVkIEZpbGUgc2NyaXB0RmlsZTsKLQotCXByb3RlY3RlZCBsb25nIGxhc3RNb2RpZmllZDsKLQotCXByb3RlY3RlZCBsb25nIGxhc3RDaGVja1RpbWU7Ci0KLQlwcm90ZWN0ZWQgaW50IGhvdFVwZGF0ZUludGVydmFsOwotCi0JcHJvdGVjdGVkIEJTRkVuZ2luZSBlbmdpbmU7Ci0KLQlwcml2YXRlIFN0cmluZyBzY3JpcHROYW1lOwotCi0JcHVibGljIFNjcmlwdEludm9rZXIoRmlsZSBzY3JpcHRGaWxlLCBpbnQgaG90VXBkYXRlSW50ZXJ2YWwpIHsKLQkJdGhpcy5zY3JpcHRGaWxlID0gc2NyaXB0RmlsZTsKLQkJdGhpcy5ob3RVcGRhdGVJbnRlcnZhbCA9IGhvdFVwZGF0ZUludGVydmFsOwotCQl0aGlzLnNjcmlwdE5hbWUgPSBzY3JpcHRGaWxlLmdldE5hbWUoKTsKLQkJaW5pdEVuZ2luZSgpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgaW52b2tlKFN0cmluZyBmdW5jdGlvbk5hbWUsIE9iamVjdFtdIGFyZ3MpIHsKLQotCQlpZiAoaG90VXBkYXRlSW50ZXJ2YWwgPiAwKSB7Ci0JCQljaGVja1VwZGF0ZSgpOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCWVuZ2luZS5jYWxsKG51bGwsIGZ1bmN0aW9uTmFtZSwgYXJncyk7Ci0JCX0gY2F0Y2ggKEJTRkV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBjaGVja1VwZGF0ZSgpIHsKLQkJbG9uZyBub3cgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJaWYgKG5vdyAtIGxhc3RDaGVja1RpbWUgPiBob3RVcGRhdGVJbnRlcnZhbCkgewotCQkJbGFzdENoZWNrVGltZSA9IG5vdzsKLQkJCWxvbmcgbG0gPSBzY3JpcHRGaWxlLmxhc3RNb2RpZmllZCgpOwotCQkJaWYgKGxtICE9IGxhc3RNb2RpZmllZCkgewotCQkJCWxhc3RNb2RpZmllZCA9IGxtOwotCQkJCWluaXRFbmdpbmUoKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRFbmdpbmUoKSB7Ci0JCXRyeSB7Ci0KLQkJCVN0cmluZyBzY3JpcHRMYW5ndWFnZSA9IEJTRk1hbmFnZXIuZ2V0TGFuZ0Zyb21GaWxlbmFtZShzY3JpcHROYW1lKTsKLQkJCUJTRk1hbmFnZXIgYnNmTWFuYWdlciA9IG5ldyBCU0ZNYW5hZ2VyKCk7Ci0JCQlic2ZNYW5hZ2VyLnNldENsYXNzTG9hZGVyKEJTRk1hbmFnZXIuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSk7Ci0JCQkvLyBic2ZNYW5hZ2VyLmRlY2xhcmVCZWFuKCJfQXhpc1NlcnZpY2UiLCBheGlzU2VydmljZSwKLQkJCS8vIEF4aXNTZXJ2aWNlLmNsYXNzKTsKLQotCQkJQlNGRW5naW5lIGJzZkVuZ2luZSA9IGJzZk1hbmFnZXIKLQkJCQkJLmxvYWRTY3JpcHRpbmdFbmdpbmUoc2NyaXB0TGFuZ3VhZ2UpOwotCQkJT2JqZWN0IHNjcmlwdFNyYyA9IHJlYWRTY3JpcHQoKTsKLQkJCWJzZkVuZ2luZS5leGVjKHNjcmlwdE5hbWUsIDAsIDAsIHNjcmlwdFNyYyk7Ci0KLQkJfSBjYXRjaCAoQlNGRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVhZHMgdGhlIGNvbXBsZXRlIHNjcmlwdCBzb3VyY2UgY29kZSBpbnRvIGEgU3RyaW5nCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyByZWFkU2NyaXB0KCkgewotCQlSZWFkZXIgcmVhZGVyID0gbnVsbDsKLQkJdHJ5IHsKLQotCQkJcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoc2NyaXB0RmlsZSk7Ci0JCQljaGFyW10gYnVmZmVyID0gbmV3IGNoYXJbMTAyNF07Ci0JCQlTdHJpbmdCdWZmZXIgc291cmNlID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJaW50IGNvdW50OwotCQkJd2hpbGUgKChjb3VudCA9IHJlYWRlci5yZWFkKGJ1ZmZlcikpID4gMCkgewotCQkJCXNvdXJjZS5hcHBlbmQoYnVmZmVyLCAwLCBjb3VudCk7Ci0JCQl9Ci0KLQkJCXJldHVybiBzb3VyY2UudG9TdHJpbmcoKTsKLQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiSU9FeGNlcHRpb24gcmVhZGluZyBzY3JpcHQ6ICIKLQkJCQkJKyBzY3JpcHROYW1lLCBlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJaWYgKHJlYWRlciAhPSBudWxsKSB7Ci0JCQkJCXJlYWRlci5jbG9zZSgpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiSU9FeGNlcHRpb24gY2xvc2luZyBzY3JpcHQ6ICIKLQkJCQkJCSsgc2NyaXB0TmFtZSwgZSk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zY3JpcHRpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvc2NyaXB0aW5nL1NjcmlwdE1lc3NhZ2VDb250ZXh0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9zY3JpcHRpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvc2NyaXB0aW5nL1NjcmlwdE1lc3NhZ2VDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwYzlkODYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2NyaXB0aW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NjcmlwdGluZy9TY3JpcHRNZXNzYWdlQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjcmlwdGluZzsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5zY3JpcHRpbmcuY29udmVydG9ycy5PTUVsZW1lbnRDb252ZXJ0b3I7Ci0KLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBTY3JpcHRNZXNzYWdlQ29udGV4dCBkZWNvcmF0ZXMgdGhlIEF4aXMyIE1lc3NhZ2VDb250ZXh0IGFkZGluZyBtZXRob2RzIHRvIHVzZQotICogdGhlIG1lc3NhZ2UgcGF5bG9hZCBYTUwgaW4gYSB3YXkgbmF0dXJhbCB0byB0aGUgc2NyaXB0aW5nIGxhbmd1YWdlLgotICovCi1wdWJsaWMgY2xhc3MgU2NyaXB0TWVzc2FnZUNvbnRleHQgZXh0ZW5kcyBNZXNzYWdlQ29udGV4dCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCXByaXZhdGUgTWVzc2FnZUNvbnRleHQgbWM7Ci0KLSAgICBwcml2YXRlIE9NRWxlbWVudENvbnZlcnRvciBjb252ZXJ0b3I7Ci0KLSAgICBwdWJsaWMgU2NyaXB0TWVzc2FnZUNvbnRleHQoTWVzc2FnZUNvbnRleHQgbWMsIE9NRWxlbWVudENvbnZlcnRvciBjb252ZXJ0b3IpIHsKLSAgICAgICAgdGhpcy5tYyA9IG1jOwotICAgICAgICB0aGlzLmNvbnZlcnRvciA9IGNvbnZlcnRvcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIFhNTCByZXByZXNlbnRhdGlvbiBvZiBTT0FQIEJvZHkgcGF5bG9hZC4gVGhlIHBheWxvYWQgaXMgdGhlIGZpcnN0Ci0gICAgICogZWxlbWVudCBpbnNpZGUgdGhlIFNPQVAgPEJvZHk+IHRhZ3MKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBYTUwgU09BUCBCb2R5Ci0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRQYXlsb2FkWE1MKCkgewotICAgICAgICByZXR1cm4gY29udmVydG9yLnRvU2NyaXB0KG1jLmdldEVudmVsb3BlKCkuZ2V0Qm9keSgpLmdldEZpcnN0RWxlbWVudCgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIFNPQVAgYm9keSBwYXlsb2FkIGZyb20gWE1MCi0gICAgICogCi0gICAgICogQHBhcmFtIHBheWxvYWQKLSAgICAgKiBAdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFBheWxvYWRYTUwoT2JqZWN0IHBheWxvYWQpIHsKLSAgICAgICAgbWMuZ2V0RW52ZWxvcGUoKS5nZXRCb2R5KCkuc2V0Rmlyc3RDaGlsZChjb252ZXJ0b3IuZnJvbVNjcmlwdChwYXlsb2FkKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBYTUwgcmVwcmVzZW50YXRpb24gb2YgdGhlIGNvbXBsZXRlIFNPQVAgZW52ZWxvcGUKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldEVudmVsb3BlWE1MKCkgewotICAgICAgICByZXR1cm4gY29udmVydG9yLnRvU2NyaXB0KG1jLmdldEVudmVsb3BlKCkpOwotICAgIH0KLQotICAgIC8vIGhlbHBlcnMgdG8gc2V0IEVQUnMgZnJvbSBhIHNjcmlwdCBzdHJpbmcKLQotICAgIHB1YmxpYyB2b2lkIHNldFRvKFN0cmluZyByZWZlcmVuY2UpIHsKLSAgICAgICAgbWMuc2V0VG8obmV3IEVuZHBvaW50UmVmZXJlbmNlKHJlZmVyZW5jZSkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEZhdWx0VG8oU3RyaW5nIHJlZmVyZW5jZSkgewotICAgICAgICBtYy5zZXRGYXVsdFRvKG5ldyBFbmRwb2ludFJlZmVyZW5jZShyZWZlcmVuY2UpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRGcm9tKFN0cmluZyByZWZlcmVuY2UpIHsKLSAgICAgICAgbWMuc2V0RnJvbShuZXcgRW5kcG9pbnRSZWZlcmVuY2UocmVmZXJlbmNlKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UmVwbHlUbyhTdHJpbmcgcmVmZXJlbmNlKSB7Ci0gICAgICAgIG1jLnNldFJlcGx5VG8obmV3IEVuZHBvaW50UmVmZXJlbmNlKHJlZmVyZW5jZSkpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2NyaXB0aW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NjcmlwdGluZy9TY3JpcHRNb2R1bGUuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NjcmlwdGluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9zY3JpcHRpbmcvU2NyaXB0TW9kdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkOGU2YTIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2NyaXB0aW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NjcmlwdGluZy9TY3JpcHRNb2R1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2NyaXB0aW5nOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC5EZXBsb3ltZW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc0Rlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc01vZHVsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLm1vZHVsZXMuTW9kdWxlOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubmVldGhpLkFzc2VydGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm5lZXRoaS5Qb2xpY3k7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5VUkxEZWNvZGVyOwotCi0vKioKLSAqIEF4aXMyIG1vZHVsZSB0byBpbml0aWFsaXplIHNjcmlwdCBzZXJ2aWNlcy4gVXNlcyBhIFNjcmlwdERlcGxveW1lbnRFbmdpbmUgdG8KLSAqIGZpbmQgYWxsIHRoZSBzY3JpcHRzIGluIHRoZSBzY3JpcHRTZXJ2aWNlcyBkaXJlY3RvcnkgYW5kIGRlcGxveSB0aGVtIGFzIEF4aXMyCi0gKiBzZXJ2aWNlcy4KLSAqLwotcHVibGljIGNsYXNzIFNjcmlwdE1vZHVsZSBpbXBsZW1lbnRzIE1vZHVsZSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coU2NyaXB0TW9kdWxlLmNsYXNzKTsKLQotICAgIHN0YXRpYyBTdHJpbmcgZGVmYXVsdEVuY29kaW5nID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihTeXN0ZW0ub3V0KS5nZXRFbmNvZGluZygpOwotCi0gICAgLyoqCi0gICAgICogSW5pdCBieSBjcmVhdGluZyBhbmQgZGVwbG95aW5nIEF4aXNTZXJ2aWNlcyBmb3IgZWFjaCBzY3JpcHQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbml0KENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQsIEF4aXNNb2R1bGUgbW9kdWxlKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLQotICAgICAgICBsb2cuZGVidWcoInNjcmlwdCBzZXJ2aWNlcyBpbml0Iik7Ci0KLSAgICAgICAgQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZyA9IGNvbmZpZ0NvbnRleHQuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKTsKLSAgICAgICAgaWYoYXhpc0NvbmZpZy5nZXRSZXBvc2l0b3J5KCkgPT0gbnVsbCkgewotICAgICAgICAgICAgbG9nLmVycm9yKCJBeGlzQ29uZmlndXJhdGlvbiBnZXRSZXBvc2l0b3J5IHJldHVybnMgbnVsbCwgY2Fubm90IGRlcGxveSBzY3JpcHRzIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBGaWxlIHNjcmlwdFNlcnZpY2VzRGlyZWN0b3J5ID0gZ2V0U2NyaXB0U2VydmljZXNEaXJlY3RvcnkoYXhpc0NvbmZpZyk7Ci0gICAgICAgICAgICBTY3JpcHREZXBsb3ltZW50RW5naW5lIGRlcGxveW1lbnRFbmdpbmUgPSBuZXcgU2NyaXB0RGVwbG95bWVudEVuZ2luZShheGlzQ29uZmlnKTsKLSAgICAgICAgICAgIGRlcGxveW1lbnRFbmdpbmUubG9hZFJlcG9zaXRvcnkoc2NyaXB0U2VydmljZXNEaXJlY3RvcnkpOwotICAgICAgICAgICAgZGVwbG95bWVudEVuZ2luZS5sb2FkU2VydmljZXMoKTsKLSAgICAgICAgfQotICAgICAgICBsb2cuZGVidWcoInNjcmlwdCBtb2R1bGUgYWN0aXZhdGVkIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgcmVwbyBkaXJlY3RvcnkgZm9yIHRoZSBzY3JpcHRzLiBUaGUgc2NyaXB0cyBkaXJlY3RvcnkgaXMgYQotICAgICAqIHN1Yi1kaXJlY3Rvcnkgb2YgdGhlIEF4aXMyIHJlcG9zaXRvcnkgZGlyZWN0b3J5LiBJdHMgbmFtZSBtYXkgYmUgZGVmaW5lZAotICAgICAqIGJ5IGEgJ3NjcmlwdFNlcnZpY2VzRGlyJyBwcm9wZXJ0eSBpbiB0aGUgYXhpczIueG1sIG90aGVyd2lzZSBpdCBkZWZhdWx0cwotICAgICAqIGEgdG8gYSBkaXJlY3RvcnkgbmFtZWQgJ3NjcmlwdFNlcnZpY2VzJy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRmlsZSBnZXRTY3JpcHRTZXJ2aWNlc0RpcmVjdG9yeShBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlnKSB0aHJvd3MgRGVwbG95bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0KLSAgICAgICAgICAgIFVSTCBheGlzMlJlcG9zaXRvcnkgPSBheGlzQ29uZmlnLmdldFJlcG9zaXRvcnkoKTsKLSAgICAgICAgICAgIFBhcmFtZXRlciBzY3JpcHRzRGlyUGFyYW0gPSBheGlzQ29uZmlnLmdldFBhcmFtZXRlcigic2NyaXB0U2VydmljZXNEaXIiKTsKLSAgICAgICAgICAgIFN0cmluZyBzY3JpcHRzRGlyID0gc2NyaXB0c0RpclBhcmFtID09IG51bGwgPyAic2NyaXB0U2VydmljZXMiIDogKFN0cmluZylzY3JpcHRzRGlyUGFyYW0uZ2V0VmFsdWUoKTsKLQotICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBVUkxEZWNvZGVyLmRlY29kZShheGlzMlJlcG9zaXRvcnkuZ2V0UGF0aCgpLCBkZWZhdWx0RW5jb2RpbmcpOwotICAgICAgICAgICAgamF2YS5pby5GaWxlIHJlcG9EaXIgPQotICAgICAgICAgICAgICAgICAgICBuZXcgamF2YS5pby5GaWxlKHBhdGgucmVwbGFjZSgnLycsIEZpbGUuc2VwYXJhdG9yQ2hhcikucmVwbGFjZSgnfCcsICc6JykpOwotCi0gICAgICAgICAgICByZXR1cm4gbmV3IEZpbGUocmVwb0Rpciwgc2NyaXB0c0Rpcik7Ci0gICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oIlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZ2V0dGluZyBzY3JpcHQgc2VydmljZSBkaXJlY3RvcnkiLCBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIC0tLSB0aGUgZm9sbG93aW5nIGFyZSB1bnVzZWQgbWV0aG9kcyBvbiB0aGUgTW9kdWxlIGludGVyZmFjZSAtLS0KLQotICAgIHB1YmxpYyB2b2lkIGFwcGx5UG9saWN5KFBvbGljeSBwb2xpY3ksIEF4aXNEZXNjcmlwdGlvbiBheGlzRGVzY3JpcHRpb24pIHRocm93cyBBeGlzRmF1bHQgewotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGNhblN1cHBvcnRBc3NlcnRpb24oQXNzZXJ0aW9uIGFzc2VydGlvbikgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZW5nYWdlTm90aWZ5KEF4aXNEZXNjcmlwdGlvbiBheGlzRGVzY3JpcHRpb24pIHRocm93cyBBeGlzRmF1bHQgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNodXRkb3duKENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ3VyYXRpb25Db250ZXh0KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NjcmlwdGluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9zY3JpcHRpbmcvU2NyaXB0UmVjZWl2ZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NjcmlwdGluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9zY3JpcHRpbmcvU2NyaXB0UmVjZWl2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZmYmMwOC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zY3JpcHRpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvc2NyaXB0aW5nL1NjcmlwdFJlY2VpdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjcmlwdGluZzsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuU2VydmljZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5BYnN0cmFjdEluT3V0U3luY01lc3NhZ2VSZWNlaXZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnNjcmlwdGluZy5jb252ZXJ0b3JzLkNvbnZlcnRvckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5zY3JpcHRpbmcuY29udmVydG9ycy5PTUVsZW1lbnRDb252ZXJ0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5ic2YuQlNGRW5naW5lOwotaW1wb3J0IG9yZy5hcGFjaGUuYnNmLkJTRkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmJzZi5CU0ZNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLS8qKgotICogQW4gQXhpczIgTWVzc2FnZVJlY2VpdmVyIGZvciBpbnZva2luZyBzY3JpcHQgbGFuZ3VhZ2UgZnVuY3Rpb25zLgotICogCi0gKiBUaGUgc2NyaXB0aW5nIHN1cHBvcnQgdXNlcyB0aGUgQXBhY2hlIEJlYW4gU2NyaXB0aW5nIEZyYW1ld29yayAoQlNGKSAKLSAqIHNvIHRoZSBzY3JpcHQgbWF5IGJlIHdyaXR0ZW4gaW4gYW55IGxhbmd1YWdlIHN1cHBvcnRlZCBieSBCU0YuIAotICogCi0gKiBUaGVyZSBhcmUgdHdvIHdheXMgb2YgZGVmaW5pbmcgdGhlIHNjcmlwdCwgZWl0aGVyIGluIGEgc2VwZXJhdGUgZmlsZQotICogb3IgZW1iZWRkZWQgaW4tbGluZSB3aXRoaW4gdGhlIHNlcnZpY2VzLnhtbCBmaWxlLgotICogCi0gKiBUaGlzIGV4YW1wbGUgc2hvd3MgYSBzZXJ2aWNlcy54bWwgdXNpbmcgYSBzZXBlcmF0ZSBzY3JpcHQgZmlsZToKLSAqIDxjb2RlPgotICogICA8c2VydmljZUdyb3VwPgotICogICAgIDxzZXJ2aWNlIC4uLj4KLSAqICAgICAgIC4uLgotICogICAgICAgPHBhcmFtZXRlciBuYW1lPSJzY3JpcHQiPnNjcmlwdHMvbXlTY3JpcHQuanM8L3BhcmFtZXRlcj4KLSAqICAgICA8L3NlcnZpY2U+Ci0gKiAgIDwvc2VydmljZUdyb3VwPgotICogPC9jb2RlPgotICogCi0gKiBUaGlzIGV4YW1wbGUgc2hvd3MgYSBKYXZhU2NyaXB0IGZ1bmN0aW9uIGVtYmVkZGVkIHdpdGhpbiBhIHNlcnZpY2VzLnhtbCBmaWxlOgotICogPGNvZGU+Ci0gKiAgIDxzZXJ2aWNlR3JvdXA+Ci0gKiAgICAgPHNlcnZpY2UgLi4uPgotICogICAgICAgLi4uCi0gKiAgICAgICA8cGFyYW1ldGVyIG5hbWU9InNjcmlwdC5qcyI+PCFbQ0RBVEFbCi0gKiAgICAgICAgICBmdW5jdGlvbiBpbnZva2UoaW5NQywgb3V0TUMpIHsKLSAqICAgICAgICAgICAgIC4uLgotICogICAgICAgICAgfQotICogICAgICAgIF1dPjwvcGFyYW1ldGVyPgotICogICAgIDwvc2VydmljZT4KLSAqICAgPC9zZXJ2aWNlR3JvdXA+Ci0gKiA8L2NvZGU+Ci0gKiAKLSAqIFRoZSBzY3JpcHQgbGFuZ3VhZ2UgaXMgZGV0ZXJtaW5lZCBieSB0aGUgZmlsZSBuYW1lIHN1ZmZpeCB3aGVuIHVzaW5nIHNjcmlwdHMKLSAqIGluIHNlcGVyYXRlIGZpbGVzIG9yIHRoZSBzY3JpcHQgcGFyYW1ldGVyIG5hbWUgc3VmZml4IHdoZW4gdXNpbmcgaW5saW5lIHNjcmlwdHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBTY3JpcHRSZWNlaXZlciBleHRlbmRzIEFic3RyYWN0SW5PdXRTeW5jTWVzc2FnZVJlY2VpdmVyIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNDUklQVF9BVFRSID0gInNjcmlwdCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRlVOQ1RJT05fQVRUUiA9ICJmdW5jdGlvbiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9GVU5DVElPTiA9ICJpbnZva2UiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlZFUlRPUl9BVFRSID0gImNvbnZlcnRvciI7Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBCU0ZFTkdJTkVfUFJPUCA9IFNjcmlwdFJlY2VpdmVyLmNsYXNzLmdldE5hbWUoKSArICJCU0ZFbmdpbmUiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlZFUlRPUl9QUk9QID0gU2NyaXB0UmVjZWl2ZXIuY2xhc3MuZ2V0TmFtZSgpICsgIk9NRWxlbWVudENvbnZlcnRvciI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NSSVBUX1NSQ19QUk9QID0gU2NyaXB0UmVjZWl2ZXIuY2xhc3MuZ2V0TmFtZSgpICsgIlNjcmlwdFNyYyI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coU2NyaXB0TW9kdWxlLmNsYXNzKTsKLQotICAgIHB1YmxpYyBTY3JpcHRSZWNlaXZlcigpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbnZva2VzIHRoZSBzZXJ2aWNlIGJ5IGNhbGxpbmcgdGhlIHNjcmlwdCBmdW5jdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGludm9rZUJ1c2luZXNzTG9naWMoTWVzc2FnZUNvbnRleHQgaW5NQywgTWVzc2FnZUNvbnRleHQgb3V0TUMpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICB0cnkgewotCi0gICAgICAgICAgICBsb2cuZGVidWcoImludm9raW5nIHNjcmlwdCBzZXJ2aWNlIik7Ci0KLSAgICAgICAgICAgIG91dE1DLnNldEVudmVsb3BlKGdldFNPQVBGYWN0b3J5KGluTUMpLmdldERlZmF1bHRFbnZlbG9wZSgpKTsKLQotICAgICAgICAgICAgQlNGRW5naW5lIGVuZ2luZSA9IGdldEJTRkVuZ2luZShpbk1DKTsKLSAgICAgICAgICAgIE9NRWxlbWVudENvbnZlcnRvciBjb252ZXJ0b3IgPSAoT01FbGVtZW50Q29udmVydG9yKSBpbk1DLmdldFNlcnZpY2VDb250ZXh0KCkuZ2V0UHJvcGVydHkoQ09OVkVSVE9SX1BST1ApOwotCi0gICAgICAgICAgICBQYXJhbWV0ZXIgc2NyaXB0RnVuY3Rpb25QYXJhbSA9IGluTUMuZ2V0QXhpc1NlcnZpY2UoKS5nZXRQYXJhbWV0ZXIoRlVOQ1RJT05fQVRUUik7Ci0gICAgICAgICAgICBTdHJpbmcgc2NyaXB0RnVuY3Rpb24gPSBzY3JpcHRGdW5jdGlvblBhcmFtID09IG51bGwgPyBERUZBVUxUX0ZVTkNUSU9OIDogKFN0cmluZykgc2NyaXB0RnVuY3Rpb25QYXJhbS5nZXRWYWx1ZSgpOwotCi0gICAgICAgICAgICBTY3JpcHRNZXNzYWdlQ29udGV4dCBpblNjcmlwdE1DID0gbmV3IFNjcmlwdE1lc3NhZ2VDb250ZXh0KGluTUMsIGNvbnZlcnRvcik7Ci0gICAgICAgICAgICBTY3JpcHRNZXNzYWdlQ29udGV4dCBvdXRTY3JpcHRNQyA9IG5ldyBTY3JpcHRNZXNzYWdlQ29udGV4dChvdXRNQywgY29udmVydG9yKTsKLSAgICAgICAgICAgIE9iamVjdFtdIGFyZ3MgPSBuZXcgT2JqZWN0W10geyBpblNjcmlwdE1DLCBvdXRTY3JpcHRNQyB9OwotCi0gICAgICAgICAgICBlbmdpbmUuY2FsbChudWxsLCBzY3JpcHRGdW5jdGlvbiwgYXJncyk7Ci0KLSAgICAgICAgfSBjYXRjaCAoQlNGRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEF4aXNGYXVsdC5tYWtlRmF1bHQoZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBCU0ZFbmdpbmUgZm9yIHRoZSBzY3JpcHQgc2VydmljZS4KLSAgICAgKiAKLSAgICAgKiBUaGUgZmlyc3Qgc2VydmljZSBpbnZvY2F0aW9uIGNyZWF0ZXMgdGhlIEJTRkVuZ2luZSBhbmQgY2FjaGVzCi0gICAgICogaXQgaW4gdGhlIEF4aXMyIFNlcnZpY2VDb250ZXh0IGZvciByZXVzZSBieSBzdWJzZXF1ZW50IHJlcXVlc3RzLgotICAgICAqLwotICAgIHByb3RlY3RlZCBCU0ZFbmdpbmUgZ2V0QlNGRW5naW5lKE1lc3NhZ2VDb250ZXh0IG1jKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgQlNGRW5naW5lIGJzZkVuZ2luZTsKLSAgICAgICAgU2VydmljZUNvbnRleHQgc2VydmljZUNvbnRleHQgPSBtYy5nZXRTZXJ2aWNlQ29udGV4dCgpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKHNlcnZpY2VDb250ZXh0KSB7Ci0gICAgICAgICAgICBic2ZFbmdpbmUgPSAoQlNGRW5naW5lKSBzZXJ2aWNlQ29udGV4dC5nZXRQcm9wZXJ0eShCU0ZFTkdJTkVfUFJPUCk7Ci0gICAgICAgICAgICBpZiAoYnNmRW5naW5lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBic2ZFbmdpbmUgPSBpbml0U2NyaXB0KG1jKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYnNmRW5naW5lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluaXRpYWxpemVzIHRoZSBzY3JpcHQgc2VydmljZSBieSBmaW5kaW5nIHRoZSBzY3JpcHQgc291cmNlIGNvZGUsCi0gICAgICogY29tcGlsaW5nIGl0IGluIGEgQlNGRW5naW5lLCBhbmQgY3JlYXRpbmcgYW4gT01FbGVtZW50Q29udmVydG9yCi0gICAgICogZm9yIHRoZSBzY3JpcHQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEJTRkVuZ2luZSBpbml0U2NyaXB0KE1lc3NhZ2VDb250ZXh0IG1jKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgbG9nLmRlYnVnKCJpbml0aWFsaXppbmcgc2NyaXB0IHNlcnZpY2UiKTsKLQotICAgICAgICBBeGlzU2VydmljZSBheGlzU2VydmljZSA9IG1jLmdldEF4aXNTZXJ2aWNlKCk7Ci0KLSAgICAgICAgU3RyaW5nIHNjcmlwdE5hbWUgPSBudWxsOwotICAgICAgICBTdHJpbmcgc2NyaXB0U3JjID0gbnVsbDsKLSAgICAgICAgUGFyYW1ldGVyIHNjcmlwdEZpbGVQYXJhbSA9IGF4aXNTZXJ2aWNlLmdldFBhcmFtZXRlcihTQ1JJUFRfQVRUUik7Ci0gICAgICAgIGlmIChzY3JpcHRGaWxlUGFyYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gdGhlIHNjcmlwdCBpcyBkZWZpbmVkIGluIGEgc2VwZXJhdGUgZmlsZQotICAgICAgICAgICAgc2NyaXB0TmFtZSA9ICgoU3RyaW5nKSBzY3JpcHRGaWxlUGFyYW0uZ2V0VmFsdWUoKSkudHJpbSgpOwotICAgICAgICAgICAgUGFyYW1ldGVyIHNjcmlwdFNyY1BhcmFtID0gYXhpc1NlcnZpY2UuZ2V0UGFyYW1ldGVyKFNDUklQVF9TUkNfUFJPUCk7Ci0gICAgICAgICAgICBpZiAoc2NyaXB0U3JjUGFyYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHNjcmlwdFNyYyA9IChTdHJpbmcpIHNjcmlwdFNyY1BhcmFtLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNjcmlwdFNyYyA9IHJlYWRTY3JpcHQoYXhpc1NlcnZpY2UuZ2V0Q2xhc3NMb2FkZXIoKSwgc2NyaXB0TmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyB0aGUgc2NyaXB0IGlzIGRlZmluZWQgaW5saW5lIHdpdGhpbiB0aGUgc2VydmljZXMueG1sCi0gICAgICAgICAgICBBcnJheUxpc3QgcGFyYW1ldGVycyA9IGF4aXNTZXJ2aWNlLmdldFBhcmFtZXRlcnMoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGk9MDsgc2NyaXB0RmlsZVBhcmFtID09IG51bGwgJiYgaTxwYXJhbWV0ZXJzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgUGFyYW1ldGVyIHAgPSAoUGFyYW1ldGVyKSBwYXJhbWV0ZXJzLmdldChpKTsKLSAgICAgICAgICAgICAgICBpZiAocC5nZXROYW1lKCkuc3RhcnRzV2l0aCgic2NyaXB0LiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNjcmlwdEZpbGVQYXJhbSA9IHA7Ci0gICAgICAgICAgICAgICAgICAgIHNjcmlwdE5hbWUgPSBwLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgc2NyaXB0U3JjID0gKFN0cmluZykgcC5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoc2NyaXB0TmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJNaXNzaW5nIHNjcmlwdCBwYXJhbWV0ZXIiKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgdHJ5IHsKLQotICAgICAgICAgICAgU3RyaW5nIHNjcmlwdExhbmd1YWdlID0gQlNGTWFuYWdlci5nZXRMYW5nRnJvbUZpbGVuYW1lKHNjcmlwdE5hbWUpOwotICAgICAgICAgICAgQlNGTWFuYWdlciBic2ZNYW5hZ2VyID0gbmV3IEJTRk1hbmFnZXIoKTsKLSAgICAgICAgICAgIGJzZk1hbmFnZXIuc2V0Q2xhc3NMb2FkZXIoQlNGTWFuYWdlci5jbGFzcy5nZXRDbGFzc0xvYWRlcigpKTsKLSAgICAgICAgICAgIGJzZk1hbmFnZXIuZGVjbGFyZUJlYW4oIl9BeGlzU2VydmljZSIsIGF4aXNTZXJ2aWNlLCBBeGlzU2VydmljZS5jbGFzcyk7Ci0KLSAgICAgICAgICAgIEJTRkVuZ2luZSBic2ZFbmdpbmUgPSBic2ZNYW5hZ2VyLmxvYWRTY3JpcHRpbmdFbmdpbmUoc2NyaXB0TGFuZ3VhZ2UpOwotICAgICAgICAgICAgYnNmRW5naW5lLmV4ZWMoc2NyaXB0TmFtZSwgMCwgMCwgc2NyaXB0U3JjKTsKLQotICAgICAgICAgICAgU2VydmljZUNvbnRleHQgc2VydmljZUNvbnRleHQgPSBtYy5nZXRTZXJ2aWNlQ29udGV4dCgpOwotICAgICAgICAgICAgc2VydmljZUNvbnRleHQuc2V0UHJvcGVydHkoQlNGRU5HSU5FX1BST1AsIGJzZkVuZ2luZSk7Ci0KLSAgICAgICAgICAgIE9NRWxlbWVudENvbnZlcnRvciBjb252ZXJ0b3IgPSBDb252ZXJ0b3JGYWN0b3J5LmNyZWF0ZU9NRWxlbWVudENvbnZlcnRvcihheGlzU2VydmljZSwgc2NyaXB0TmFtZSk7Ci0gICAgICAgICAgICBzZXJ2aWNlQ29udGV4dC5zZXRQcm9wZXJ0eShDT05WRVJUT1JfUFJPUCwgY29udmVydG9yKTsKLQotICAgICAgICAgICAgcmV0dXJuIGJzZkVuZ2luZTsKLQotICAgICAgICB9IGNhdGNoIChCU0ZFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlYWRzIHRoZSBjb21wbGV0ZSBzY3JpcHQgc291cmNlIGNvZGUgaW50byBhIFN0cmluZwotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgcmVhZFNjcmlwdChDbGFzc0xvYWRlciBjbCwgU3RyaW5nIHNjcmlwdE5hbWUpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBVUkwgdXJsID0gY2wuZ2V0UmVzb3VyY2Uoc2NyaXB0TmFtZSk7Ci0gICAgICAgIGlmICh1cmwgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiU2NyaXB0IG5vdCBmb3VuZDogIiArIHNjcmlwdE5hbWUpOwotICAgICAgICB9Ci0gICAgICAgIElucHV0U3RyZWFtIGlzOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaXMgPSB1cmwub3BlblN0cmVhbSgpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJJT0V4Y2VwdGlvbiBvcGVuaW5nIHNjcmlwdDogIiArIHNjcmlwdE5hbWUsIGUpOwotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBSZWFkZXIgcmVhZGVyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKGlzLCAiVVRGLTgiKTsKLSAgICAgICAgICAgIGNoYXJbXSBidWZmZXIgPSBuZXcgY2hhclsxMDI0XTsKLSAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBzb3VyY2UgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICBpbnQgY291bnQ7Ci0gICAgICAgICAgICB3aGlsZSAoKGNvdW50ID0gcmVhZGVyLnJlYWQoYnVmZmVyKSkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgc291cmNlLmFwcGVuZChidWZmZXIsIDAsIGNvdW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBzb3VyY2UudG9TdHJpbmcoKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiSU9FeGNlcHRpb24gcmVhZGluZyBzY3JpcHQ6ICIgKyBzY3JpcHROYW1lLCBlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaXMuY2xvc2UoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJJT0V4Y2VwdGlvbiBjbG9zaW5nIHNjcmlwdDogIiArIHNjcmlwdE5hbWUsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2NyaXB0aW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NjcmlwdGluZy9TY3JpcHRSZXBvc2l0b3J5TGlzdGVuZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NjcmlwdGluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9zY3JpcHRpbmcvU2NyaXB0UmVwb3NpdG9yeUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExMjc3N2QuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2NyaXB0aW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NjcmlwdGluZy9TY3JpcHRSZXBvc2l0b3J5TGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zY3JpcHRpbmc7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQuRGVwbG95bWVudEVuZ2luZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQuUmVwb3NpdG9yeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC5yZXBvc2l0b3J5LnV0aWwuV1NJbmZvOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbjsKLQotLyoqCi0gKiBBbiBBeGlzMiBSZXBvc2l0b3J5TGlzdGVuZXIgc3ViY2xhc3MgZm9yIGRlYWxpbmcgd2l0aCBzY3JpcHQgc2VydmljZXMKLSAqLwotcHVibGljIGNsYXNzIFNjcmlwdFJlcG9zaXRvcnlMaXN0ZW5lciBleHRlbmRzIFJlcG9zaXRvcnlMaXN0ZW5lciB7Ci0KLSAgICBwdWJsaWMgU2NyaXB0UmVwb3NpdG9yeUxpc3RlbmVyKERlcGxveW1lbnRFbmdpbmUgZGVwbG95bWVudEVuZ2luZSkgewotICAgICAgICBzdXBlcihkZXBsb3ltZW50RW5naW5lLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VhcmNoZXMgYSBnaXZlbiBmb2xkZXIgZm9yIHNjcmlwdCBzZXJ2aWNlcyBhbmQgYWRkcyB0aGVtIHRvIGEgbGlzdCBpbgotICAgICAqIHRoZSBXU0luZm9saXN0IGNsYXNzLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGZpbmRTZXJ2aWNlc0luRGlyZWN0b3J5KCkgewotICAgICAgICAvLyBuZWVkIGRvUHJpdiB0byBsaXN0IGZpbGVzIHdpdGggSjJTIGVuYWJsZWQKLSAgICAgICAgRmlsZVtdIGZpbGVzID0gKEZpbGVbXSkgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRBY3Rpb24oKSB7Ci0gICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZGVwbG95bWVudEVuZ2luZS5nZXRTZXJ2aWNlc0RpcigpLmxpc3RGaWxlcygpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBpZiAoZmlsZXMgIT0gbnVsbCAmJiBmaWxlcy5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgd3NJbmZvTGlzdC5hZGRXU0luZm9JdGVtKGZpbGVzW2ldLCBkZXBsb3ltZW50RW5naW5lLmdldE1vZHVsZURlcGxveWVyKCksIFdTSW5mby5UWVBFX0NVU1RPTSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotLy8gICAgICAgIHdzSW5mb0xpc3QuYWRkV1NJbmZvSXRlbShudWxsLCBkZXBsb3ltZW50RW5naW5lLmdldE1vZHVsZURlcGxveWVyKCksIFdTSW5mby5UWVBFX0NVU1RPTSk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBPdmVycmlkZSB0aGUgUmVwb3NpdG9yeUxpc3RlbmVyIG1ldGhvZCB0byBkbyBub3RoaW5nIGFzIG5vdCByZXF1aXJlZCBmb3IKLSAgICAgKiBzY3JpcHQgc2VydmljZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjaGVja01vZHVsZXMoKSB7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBPdmVycmlkZSB0aGUgUmVwb3NpdG9yeUxpc3RlbmVyIG1ldGhvZCB0byBkbyBub3RoaW5nIGFzIG5vdCByZXF1aXJlZCBmb3IKLSAgICAgKiBzY3JpcHQgc2VydmljZXMKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBsb2FkQ2xhc3NQYXRoTW9kdWxlcygpIHsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zY3JpcHRpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvc2NyaXB0aW5nL2NvbnZlcnRvcnMvQ29udmVydG9yRmFjdG9yeS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvc2NyaXB0aW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NjcmlwdGluZy9jb252ZXJ0b3JzL0NvbnZlcnRvckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODRiNjM2OS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zY3JpcHRpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvc2NyaXB0aW5nL2NvbnZlcnRvcnMvQ29udmVydG9yRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zY3JpcHRpbmcuY29udmVydG9yczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5QYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0NvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5zY3JpcHRpbmcuU2NyaXB0UmVjZWl2ZXI7Ci0KLXB1YmxpYyBjbGFzcyBDb252ZXJ0b3JGYWN0b3J5IHsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gT01FbGVtZW50Q29udmVydG9yIGZvciB0aGUgc2NyaXB0LgotICAgICAqIAotICAgICAqIFRoZSBPTUVsZW1lbnRDb252ZXJ0b3IgaW1wbCBjbGFzcyBuYW1lIGlzIGVpdGhlcjoKLSAgICAgKiAtIHRoZSBjb252ZXJ0b3IgY2xhc3MgbmFtZSBhdHRyaWJ1dGUgZnJvbSB0aGUgc2NyaXB0IGVsZW1lbnQgaW4gdGhlIHNldmljZXMueG1sCi0gICAgICogLSB0aGUgdmFsdWUgb2YgdGhlIHBhcmFtZXRlciBuYW1lIFhYT01FbGVtZW50Q29udmVydG9yIGluIHRoZSBheGlzMi54bWwKLSAgICAgKiAgIHdoZXJlIFhYIGlzIHRoZSBzY3JpcHQgbGFuZ3VhZ2Ugc3VmZml4IHVwcGVyIGNhc2VkLCBlZy4gSlMgb3IgUkIKLSAgICAgKiAtIG9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLnNjcmlwdGluZy5jb252ZXJ0b3JzLlhYT01FbGVtZW50Q29udmVydG9yIHdoZXJlCi0gICAgICogICB3aGVyZSBYWCBpcyB0aGUgc2NyaXB0IGxhbmd1YWdlIHN1ZmZpeCB1cHBlciBjYXNlZCwgZWcuIEpTIG9yIFJCCi0gICAgICogLSBvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5zY3JpcHRpbmcuY29udmVydG9ycy5EZWZhdWx0T01FbGVtZW50Q29udmVydG9yCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBPTUVsZW1lbnRDb252ZXJ0b3IgY3JlYXRlT01FbGVtZW50Q29udmVydG9yKEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlLCBTdHJpbmcgc2NyaXB0TmFtZSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIE9NRWxlbWVudENvbnZlcnRvciBvYyA9IGdldFNjcmlwdENvbnZlcnRvcihheGlzU2VydmljZSk7Ci0gICAgICAgIGlmIChvYyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBvYyA9IGdldEF4aXMyQ29udmVydG9yKGF4aXNTZXJ2aWNlLCBzY3JpcHROYW1lKTsKLSAgICAgICAgfSAKLSAgICAgICAgaWYgKG9jID09IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgb2MgPSBnZXREZWZhdWx0U2NyaXB0Q29udmVydG9yKGF4aXNTZXJ2aWNlLCBzY3JpcHROYW1lKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSAKLSAgICAgICAgaWYgKG9jID09IG51bGwpIHsKLSAgICAgICAgICAgIG9jID0gbmV3IERlZmF1bHRPTUVsZW1lbnRDb252ZXJ0b3IoKTsKLSAgICAgICAgfSAKLSAgICAgICAgcmV0dXJuIG9jOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIAotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgT01FbGVtZW50Q29udmVydG9yIGdldFNjcmlwdENvbnZlcnRvcihBeGlzU2VydmljZSBheGlzU2VydmljZSkgewotICAgICAgICBPTUVsZW1lbnRDb252ZXJ0b3Igb2MgPSBudWxsOwotICAgICAgICBQYXJhbWV0ZXIgY29udmVydG9yUGFyYW0gPSBheGlzU2VydmljZS5nZXRQYXJhbWV0ZXIoU2NyaXB0UmVjZWl2ZXIuQ09OVkVSVE9SX0FUVFIpOwotICAgICAgICBpZiAoY29udmVydG9yUGFyYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIGNvbnZlcnRvckNsYXNzTmFtZSA9IChTdHJpbmcpIGNvbnZlcnRvclBhcmFtLmdldFZhbHVlKCk7IAotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBvYyA9IChPTUVsZW1lbnRDb252ZXJ0b3IpIENsYXNzLmZvck5hbWUoY29udmVydG9yQ2xhc3NOYW1lLCB0cnVlLCBheGlzU2VydmljZS5nZXRDbGFzc0xvYWRlcigpKS5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBpZ25vcmUKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gb2M7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBPTUVsZW1lbnRDb252ZXJ0b3IgZ2V0QXhpczJDb252ZXJ0b3IoQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UsIFN0cmluZyBzY3JpcHROYW1lKSB7Ci0gICAgICAgIE9NRWxlbWVudENvbnZlcnRvciBvYyA9IG51bGw7Ci0gICAgICAgIGludCBsYXN0RG90ID0gc2NyaXB0TmFtZS5sYXN0SW5kZXhPZignLicpOwotICAgICAgICBTdHJpbmcgc3VmZml4ID0gc2NyaXB0TmFtZS5zdWJzdHJpbmcobGFzdERvdCArIDEpLnRvVXBwZXJDYXNlKCk7Ci0gICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBPTUVsZW1lbnRDb252ZXJ0b3IuY2xhc3MuZ2V0TmFtZSgpOwotICAgICAgICBpbnQgaSA9IGNsYXNzTmFtZS5sYXN0SW5kZXhPZignLicpOwotICAgICAgICBTdHJpbmcgY29udmVydG9yQ2xhc3NOYW1lUHJvcCA9IHN1ZmZpeC50b1VwcGVyQ2FzZSgpICsgY2xhc3NOYW1lLnN1YnN0cmluZyhpICsgMSk7Ci0gICAgICAgIEF4aXNDb25maWd1cmF0aW9uIGF4aXNDb25maWcgPSBheGlzU2VydmljZS5nZXRBeGlzQ29uZmlndXJhdGlvbigpOwotICAgICAgICBQYXJhbWV0ZXIgY29udmVydG9yUGFyYW0gPSBheGlzQ29uZmlnLmdldFBhcmFtZXRlcihjb252ZXJ0b3JDbGFzc05hbWVQcm9wKTsKLSAgICAgICAgaWYgKGNvbnZlcnRvclBhcmFtICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyBjb252ZXJ0b3JDbGFzc05hbWUgPSAoU3RyaW5nKSBjb252ZXJ0b3JQYXJhbS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBvYyA9IChPTUVsZW1lbnRDb252ZXJ0b3IpIENsYXNzLmZvck5hbWUoY29udmVydG9yQ2xhc3NOYW1lLCB0cnVlLCBheGlzU2VydmljZS5nZXRDbGFzc0xvYWRlcigpKS5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBpZ25vcmUKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gb2M7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBPTUVsZW1lbnRDb252ZXJ0b3IgZ2V0RGVmYXVsdFNjcmlwdENvbnZlcnRvcihBeGlzU2VydmljZSBheGlzU2VydmljZSwgU3RyaW5nIHNjcmlwdE5hbWUpIHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHsKLSAgICAgICAgT01FbGVtZW50Q29udmVydG9yIG9jID0gbnVsbDsKLSAgICAgICAgaW50IGxhc3REb3QgPSBzY3JpcHROYW1lLmxhc3RJbmRleE9mKCcuJyk7Ci0gICAgICAgIFN0cmluZyBzdWZmaXggPSBzY3JpcHROYW1lLnN1YnN0cmluZyhsYXN0RG90ICsgMSkudG9VcHBlckNhc2UoKTsKLSAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IE9NRWxlbWVudENvbnZlcnRvci5jbGFzcy5nZXROYW1lKCk7Ci0gICAgICAgIGludCBpID0gY2xhc3NOYW1lLmxhc3RJbmRleE9mKCcuJyk7Ci0gICAgICAgIFN0cmluZyBjb252ZXJ0b3JDbGFzc05hbWUgPSBzdWZmaXgudG9VcHBlckNhc2UoKSArIGNsYXNzTmFtZS5zdWJzdHJpbmcoaSArIDEpOwotICAgICAgICBBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlnID0gYXhpc1NlcnZpY2UuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKTsKLSAgICAgICAgUGFyYW1ldGVyIGNvbnZlcnRvclBhcmFtID0gYXhpc0NvbmZpZy5nZXRQYXJhbWV0ZXIoY29udmVydG9yQ2xhc3NOYW1lKTsKLSAgICAgICAgaWYgKGNvbnZlcnRvclBhcmFtICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgb2MgPSAoT01FbGVtZW50Q29udmVydG9yKSBDbGFzcy5mb3JOYW1lKChTdHJpbmcpIGNvbnZlcnRvclBhcmFtLmdldFZhbHVlKCksIHRydWUsIGF4aXNTZXJ2aWNlLmdldENsYXNzTG9hZGVyKCkpLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBpZ25vcmUKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFN0cmluZyBmcUNvbnZlcnRvckNsYXNzTmFtZSA9IGNsYXNzTmFtZS5zdWJzdHJpbmcoMCwgaSArIDEpICsgY29udmVydG9yQ2xhc3NOYW1lOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBvYyA9IChPTUVsZW1lbnRDb252ZXJ0b3IpIENsYXNzLmZvck5hbWUoZnFDb252ZXJ0b3JDbGFzc05hbWUsIHRydWUsIGF4aXNTZXJ2aWNlLmdldENsYXNzTG9hZGVyKCkpLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBpZ25vcmUKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChvYyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgb2MgPSAoT01FbGVtZW50Q29udmVydG9yKSBDbGFzcy5mb3JOYW1lKGZxQ29udmVydG9yQ2xhc3NOYW1lLCB0cnVlLCBDb252ZXJ0b3JGYWN0b3J5LmNsYXNzLmdldENsYXNzTG9hZGVyKCkpLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gb2M7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zY3JpcHRpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvc2NyaXB0aW5nL2NvbnZlcnRvcnMvRGVmYXVsdE9NRWxlbWVudENvbnZlcnRvci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvc2NyaXB0aW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NjcmlwdGluZy9jb252ZXJ0b3JzL0RlZmF1bHRPTUVsZW1lbnRDb252ZXJ0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI1NGE0Mi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zY3JpcHRpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvc2NyaXB0aW5nL2NvbnZlcnRvcnMvRGVmYXVsdE9NRWxlbWVudENvbnZlcnRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjcmlwdGluZy5jb252ZXJ0b3JzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmJ1aWxkZXIuU3RBWE9NQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmJzZi5CU0ZFbmdpbmU7Ci0KLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotCi0vKioKLSAqIFRoZSBEZWZhdWx0T01FbGVtZW50Q29udmVydG9yIGNvbnZlcnRzIGJldHdlZW4gU3luYXBzZSBPTUVsZW1lbnRzIGFuZCBTdHJpbmdzCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWZhdWx0T01FbGVtZW50Q29udmVydG9yIGltcGxlbWVudHMgT01FbGVtZW50Q29udmVydG9yIHsKLQotICAgIHB1YmxpYyBPTUVsZW1lbnQgZnJvbVNjcmlwdChPYmplY3QgbykgewotICAgICAgICB0cnkgewotCi0gICAgICAgICAgICBieXRlW10geG1sQnl0ZXMgPSBvLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoKTsKLSAgICAgICAgICAgIFN0QVhPTUJ1aWxkZXIgYnVpbGRlciA9IG5ldyBTdEFYT01CdWlsZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSh4bWxCeXRlcykpOwotICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IGJ1aWxkZXIuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0gICAgICAgICAgICByZXR1cm4gb21FbGVtZW50OwotCi0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgdG9TY3JpcHQoT01FbGVtZW50IG9tRWxlbWVudCkgewotICAgICAgICByZXR1cm4gb21FbGVtZW50LnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RW5naW5lKEJTRkVuZ2luZSBlKSB7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zY3JpcHRpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvc2NyaXB0aW5nL2NvbnZlcnRvcnMvSlNPTUVsZW1lbnRDb252ZXJ0b3IuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NjcmlwdGluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9zY3JpcHRpbmcvY29udmVydG9ycy9KU09NRWxlbWVudENvbnZlcnRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDY3YWIwLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NjcmlwdGluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9zY3JpcHRpbmcvY29udmVydG9ycy9KU09NRWxlbWVudENvbnZlcnRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjcmlwdGluZy5jb252ZXJ0b3JzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmJ1aWxkZXIuU3RBWE9NQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLWltcG9ydCBvcmcubW96aWxsYS5qYXZhc2NyaXB0LkNvbnRleHQ7Ci1pbXBvcnQgb3JnLm1vemlsbGEuamF2YXNjcmlwdC5TY3JpcHRhYmxlOwotaW1wb3J0IG9yZy5tb3ppbGxhLmphdmFzY3JpcHQuU2NyaXB0YWJsZU9iamVjdDsKLWltcG9ydCBvcmcubW96aWxsYS5qYXZhc2NyaXB0LldyYXBwZXI7Ci1pbXBvcnQgb3JnLm1vemlsbGEuamF2YXNjcmlwdC54bWwuWE1MT2JqZWN0OwotCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci0KLS8qKgotICogSlNPYmplY3RDb252ZXJ0b3IgY29udmVydHMgYmV0d2VlbiBPTUVsZW1lbnRzIGFuZCBKYXZhU2NyaXB0IEU0WCBYTUwgb2JqZWN0cwotICovCi1wdWJsaWMgY2xhc3MgSlNPTUVsZW1lbnRDb252ZXJ0b3IgZXh0ZW5kcyBEZWZhdWx0T01FbGVtZW50Q29udmVydG9yIHsKLQotICAgIHByb3RlY3RlZCBTY3JpcHRhYmxlIHNjb3BlOwotCi0gICAgcHVibGljIEpTT01FbGVtZW50Q29udmVydG9yKCkgewotICAgICAgICBDb250ZXh0IGN4ID0gQ29udGV4dC5lbnRlcigpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgdGhpcy5zY29wZSA9IGN4LmluaXRTdGFuZGFyZE9iamVjdHMoKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIENvbnRleHQuZXhpdCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCB0b1NjcmlwdChPTUVsZW1lbnQgbykgewotICAgICAgICBYbWxPYmplY3QgeG1sOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgeG1sID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2Uoby5nZXRYTUxTdHJlYW1SZWFkZXIoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiZXhjZXB0aW9uIGdldHRpbmcgbWVzc2FnZSBYTUw6ICIgKyBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIENvbnRleHQgY3ggPSBDb250ZXh0LmVudGVyKCk7Ci0gICAgICAgIHRyeSB7Ci0KLSAgICAgICAgICAgIE9iamVjdCB3cmFwcGVkWE1MID0gY3guZ2V0V3JhcEZhY3RvcnkoKS53cmFwKGN4LCBzY29wZSwgeG1sLCBYbWxPYmplY3QuY2xhc3MpOwotICAgICAgICAgICAgU2NyaXB0YWJsZSBqc1hNTCA9IGN4Lm5ld09iamVjdChzY29wZSwgIlhNTCIsIG5ldyBPYmplY3RbXSB7IHdyYXBwZWRYTUwgfSk7Ci0KLSAgICAgICAgICAgIHJldHVybiBqc1hNTDsKLQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgQ29udGV4dC5leGl0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgT01FbGVtZW50IGZyb21TY3JpcHQoT2JqZWN0IG8pIHsKLSAgICAgICAgaWYgKCEobyBpbnN0YW5jZW9mIFhNTE9iamVjdCkpIHsKLSAgICAgICAgICAgIHJldHVybiBzdXBlci5mcm9tU2NyaXB0KG8pOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVE9ETzogRTRYIEJ1Zz8gU2hvdWxkbid0IG5lZWQgdGhpcyBjb3B5LCBidXQgd2l0aG91dCBpdCB0aGUgb3V0ZXIgZWxlbWVudCBnZXRzIGxvc3QuIFNlZSBNb3ppbGxhIGJ1Z3ppbGxhIDM2MTcyMgotICAgICAgICBTY3JpcHRhYmxlIGpzWE1MID0gKFNjcmlwdGFibGUpIFNjcmlwdGFibGVPYmplY3QuY2FsbE1ldGhvZCgoU2NyaXB0YWJsZSkgbywgImNvcHkiLCBuZXcgT2JqZWN0WzBdKTsKLSAgICAgICAgV3JhcHBlciB3cmFwcGVyID0gKFdyYXBwZXIpIFNjcmlwdGFibGVPYmplY3QuY2FsbE1ldGhvZCgoWE1MT2JqZWN0KWpzWE1MLCAiZ2V0WG1sT2JqZWN0IiwgbmV3IE9iamVjdFswXSk7Ci0gICAgICAgIFhtbE9iamVjdCB4bWxPYmplY3QgPSAoWG1sT2JqZWN0KXdyYXBwZXIudW53cmFwKCk7Ci0gICAgICAgIHRyeSB7Ci0KLSAgICAgICAgICAgIFN0QVhPTUJ1aWxkZXIgYnVpbGRlciA9IG5ldyBTdEFYT01CdWlsZGVyKHhtbE9iamVjdC5uZXdJbnB1dFN0cmVhbSgpKTsKLSAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSBidWlsZGVyLmdldERvY3VtZW50RWxlbWVudCgpOwotCi0gICAgICAgICAgICByZXR1cm4gb21FbGVtZW50OwotCi0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2NyaXB0aW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NjcmlwdGluZy9jb252ZXJ0b3JzL09NRWxlbWVudENvbnZlcnRvci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvc2NyaXB0aW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NjcmlwdGluZy9jb252ZXJ0b3JzL09NRWxlbWVudENvbnZlcnRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjY3N2I0Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NjcmlwdGluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9zY3JpcHRpbmcvY29udmVydG9ycy9PTUVsZW1lbnRDb252ZXJ0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zY3JpcHRpbmcuY29udmVydG9yczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYnNmLkJTRkVuZ2luZTsKLQotLyoqCi0gKiBUaGUgT01FbGVtZW50Q29udmVydG9yIGludGVyZmFjZSBlbmFibGVzIGN1c3RvbWl6aW5nIHRoZSBjb252ZXJzaW9uIG9mIAotICogWE1MIGJldHdlZW4gU3luYXBzZSBhbmQgYSBzY3JpcHQgbGFuZ3VhZ2UuIFNvbWUgc2NyaXB0IGxhbmd1YWdlcyBoYXZlIHRoZWlyCi0gKiBvd24gd2F5cyBvZiB1c2luZyBYTUwsIHN1Y2ggYXMgRTRYIGluIEphdmFTY3JpcHQgb3IgUkVYTUwgaW4gUnVieS4gQnV0IEJTRgotICogaGFzIG5vIHN1cHBvcnQgZm9yIHRob3NlIHNvIFN5bmFwc2UgbmVlZHMgdG8gaGFuZGxlIHRoaXMgaXRzZWxmLCB3aGljaCBpcyB3aGF0Ci0gKiB0aGUgT01FbGVtZW50Q29udmVydG9yIGRvZXMuCi0gKiAKLSAqIFdoaWNoIE9NRWxlbWVudENvbnZlcnRvciB0eXBlIHRvIHVzZSBpcyBkaXNjb3ZlcmVkIGJhc2VkIG9uIHRoZSBmaWxlIG5hbWUgc3VmZml4IG9mIAotICogdGhlIG1lZGlhdG9yIHNjcmlwdC4gVGhlIHN1ZmZpeCBpcyBjb252ZXJ0ZWQgdG8gdXBwZXJjYXNlIGFuZCB1c2VkIGFzIHRoZSBwcmVmaXggdG8gCi0gKiB0aGUgT01FbGVtZW50Q29udmVydG9yIGNsYXNzbmFtZS4gRm9yIGV4YW1wbGUsIHdpdGggYSBKYXZhU2NyaXB0IHNjcmlwdCBuYW1lZCBteXNjcmlwdC5qcwotICogdGhlIC5qcyBzdWZmaXggaXMgdGFrZW4gdG8gbWFrZSB0aGUgY29udmVydG9yIGNsYXNzIG5hbWUgCi0gKiAib3JnLmFwYWNoZS5zeW5hcHNlLm1lZGlhdG9ycy5ic2YuY29udmVydG9ycy5KU09NRWxlbWVudENvbnZlcnRvciIKLSAqIElmIHRoZSBjb252ZXJ0b3IgY2xhc3MgaXMgbm90IGZvdW5kIHRoZW4gYSBkZWZhdWx0IGNvbnZlcnRvciBpcyB1c2VkIHdoaWNoIGNvbnZlcnRzCi0gKiBYTUwgdG8gYSBTdHJpbmcgcmVwcmVzZW50YXRpb24uCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT01FbGVtZW50Q29udmVydG9yIHsKLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRFbmdpbmUoQlNGRW5naW5lIGUpOwotICAgIHB1YmxpYyBPYmplY3QgdG9TY3JpcHQoT01FbGVtZW50IG9tRWxlbWVudCk7Ci0gICAgCi0gICAgcHVibGljIE9NRWxlbWVudCBmcm9tU2NyaXB0KE9iamVjdCBvKTsKLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2NyaXB0aW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NjcmlwdGluZy9jb252ZXJ0b3JzL1JCT01FbGVtZW50Q29udmVydG9yLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9zY3JpcHRpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvc2NyaXB0aW5nL2NvbnZlcnRvcnMvUkJPTUVsZW1lbnRDb252ZXJ0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjMzMzVkZC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zY3JpcHRpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvc2NyaXB0aW5nL2NvbnZlcnRvcnMvUkJPTUVsZW1lbnRDb252ZXJ0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zY3JpcHRpbmcuY29udmVydG9yczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5idWlsZGVyLlN0QVhPTUJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5ic2YuQlNGRW5naW5lOwotaW1wb3J0IG9yZy5hcGFjaGUuYnNmLkJTRkV4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci0KLS8qKgotICogT01FbGVtZW50Q29udmVydG9yIGZvciBSdWJ5IHNjcmlwdHMKLSAqIAotICogVE9ETzogUmlnaHQgbm93IHRoaXMgZ29lcyB2aWEgU3RyaW5ncyBhbmQgbGlrZWx5IGlzbid0IHZlcnkgZmFzdAotICogVGhlcmUgY291bGQgd2VsbCBiZSBtdWNoIGJldHRlciB3YXlzIHRvIGRvIHRoaXMgOikKLSAqLwotcHVibGljIGNsYXNzIFJCT01FbGVtZW50Q29udmVydG9yIGltcGxlbWVudHMgT01FbGVtZW50Q29udmVydG9yIHsKLQotICAgIHByb3RlY3RlZCBCU0ZFbmdpbmUgYnNmRW5naW5lOwotCi0gICAgcHVibGljIFJCT01FbGVtZW50Q29udmVydG9yKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgdG9TY3JpcHQoT01FbGVtZW50IG9tRWxlbWVudCkgewotICAgICAgICB0cnkgewotCi0gICAgICAgICAgICBTdHJpbmdCdWZmZXIgc3JjRnJhZ21lbnQgPSBuZXcgU3RyaW5nQnVmZmVyKCJEb2N1bWVudC5uZXcoPDxFT0ZcbiIpOwotICAgICAgICAgICAgc3JjRnJhZ21lbnQuYXBwZW5kKG9tRWxlbWVudC50b1N0cmluZygpKTsKLSAgICAgICAgICAgIHNyY0ZyYWdtZW50LmFwcGVuZCgiXG5FT0ZcbiIpOwotICAgICAgICAgICAgc3JjRnJhZ21lbnQuYXBwZW5kKCIpIik7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIE9iamVjdCBvID0gYnNmRW5naW5lLmV2YWwoIlJCT01FbGVtZW50Q29udmVydG9yIiwgMCwgMCwgc3JjRnJhZ21lbnQudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICByZXR1cm4gbzsKLQotICAgICAgICB9IGNhdGNoIChCU0ZFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgT01FbGVtZW50IGZyb21TY3JpcHQoT2JqZWN0IG8pIHsKLSAgICAgICAgdHJ5IHsKLQotICAgICAgICAgICAgYnl0ZVtdIHhtbEJ5dGVzID0gby50b1N0cmluZygpLmdldEJ5dGVzKCk7Ci0gICAgICAgICAgICBTdEFYT01CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RBWE9NQnVpbGRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oeG1sQnl0ZXMpKTsKLSAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSBidWlsZGVyLmdldERvY3VtZW50RWxlbWVudCgpOwotCi0gICAgICAgICAgICByZXR1cm4gb21FbGVtZW50OwotCi0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEVuZ2luZShCU0ZFbmdpbmUgZSkgewotICAgICAgICB0aGlzLmJzZkVuZ2luZSA9IGU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc2NyaXB0aW5nL3Rlc3QtcmVzb3VyY2VzL29yZy9hcGFjaGUvYXhpczIvc2NyaXB0aW5nL3Rlc3RyZXBvL3Rlc3QuanMgYi92MS41LjFSQzMvbW9kdWxlcy9zY3JpcHRpbmcvdGVzdC1yZXNvdXJjZXMvb3JnL2FwYWNoZS9heGlzMi9zY3JpcHRpbmcvdGVzdHJlcG8vdGVzdC5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTdjMDQ0MC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zY3JpcHRpbmcvdGVzdC1yZXNvdXJjZXMvb3JnL2FwYWNoZS9heGlzMi9zY3JpcHRpbmcvdGVzdHJlcG8vdGVzdC5qcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wZXRyYQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NjcmlwdGluZy90ZXN0LXJlc291cmNlcy9vcmcvYXBhY2hlL2F4aXMyL3NjcmlwdGluZy90ZXN0cmVwby90ZXN0LndzZGwgYi92MS41LjFSQzMvbW9kdWxlcy9zY3JpcHRpbmcvdGVzdC1yZXNvdXJjZXMvb3JnL2FwYWNoZS9heGlzMi9zY3JpcHRpbmcvdGVzdHJlcG8vdGVzdC53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTdhMDQxLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NjcmlwdGluZy90ZXN0LXJlc291cmNlcy9vcmcvYXBhY2hlL2F4aXMyL3NjcmlwdGluZy90ZXN0cmVwby90ZXN0LndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08d3NkbDpkZWZpbml0aW9ucyB4bWxuczpheGlzMj0iaHR0cDovL3NlcnZpY2VzLnNhbXBsZXMiIHhtbG5zOmh0dHA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvaHR0cC8iIHhtbG5zOm1pbWU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvbWltZS8iIHhtbG5zOm5zMT0iaHR0cDovL3NlcnZpY2VzLnNhbXBsZXMveHNkIiB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vc2VydmljZXMuc2FtcGxlcyI+Ci0JPHdzZGw6dHlwZXM+Ci0JCTx4czpzY2hlbWEgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczpheDIxPSJodHRwOi8vc2VydmljZXMuc2FtcGxlcy94c2QiIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9zZXJ2aWNlcy5zYW1wbGVzL3hzZCI+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJnZXRRdW90ZSI+Ci0JCQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJCQk8eHM6c2VxdWVuY2U+Ci0JCQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJyZXF1ZXN0IiB0eXBlPSJheDIxOkdldFF1b3RlIi8+Ci0JCQkJCTwveHM6c2VxdWVuY2U+Ci0JCQkJPC94czpjb21wbGV4VHlwZT4KLQkJCTwveHM6ZWxlbWVudD4KLQkJCTx4czplbGVtZW50IG5hbWU9IkdldFF1b3RlIiB0eXBlPSJheDIxOkdldFF1b3RlIi8+Ci0JCQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iR2V0UXVvdGUiPgotCQkJCTx4czpzZXF1ZW5jZT4KLQkJCQkJPHhzOmVsZW1lbnQgbmFtZT0ic3ltYm9sIiB0eXBlPSJ4czpzdHJpbmciLz4KLQkJCQk8L3hzOnNlcXVlbmNlPgotCQkJPC94czpjb21wbGV4VHlwZT4KLQkJCTx4czplbGVtZW50IG5hbWU9ImdldFF1b3RlUmVzcG9uc2UiPgotCQkJCTx4czpjb21wbGV4VHlwZT4KLQkJCQkJPHhzOnNlcXVlbmNlPgotCQkJCQkJPHhzOmVsZW1lbnQgbmFtZT0icmV0dXJuIiB0eXBlPSJheDIxOkdldFF1b3RlUmVzcG9uc2UiLz4KLQkJCQkJPC94czpzZXF1ZW5jZT4KLQkJCQk8L3hzOmNvbXBsZXhUeXBlPgotCQkJPC94czplbGVtZW50PgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iR2V0UXVvdGVSZXNwb25zZSIgdHlwZT0iYXgyMTpHZXRRdW90ZVJlc3BvbnNlIi8+Ci0JCQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iR2V0UXVvdGVSZXNwb25zZSI+Ci0JCQkJPHhzOnNlcXVlbmNlPgotCQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJjaGFuZ2UiIHR5cGU9InhzOmRvdWJsZSIvPgotCQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJlYXJuaW5ncyIgdHlwZT0ieHM6ZG91YmxlIi8+Ci0JCQkJCTx4czplbGVtZW50IG5hbWU9ImhpZ2giIHR5cGU9InhzOmRvdWJsZSIvPgotCQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJsYXN0IiB0eXBlPSJ4czpkb3VibGUiLz4KLQkJCQkJPHhzOmVsZW1lbnQgbmFtZT0ibGFzdFRyYWRlVGltZXN0YW1wIiB0eXBlPSJ4czpzdHJpbmciLz4KLQkJCQkJPHhzOmVsZW1lbnQgbmFtZT0ibG93IiB0eXBlPSJ4czpkb3VibGUiLz4KLQkJCQkJPHhzOmVsZW1lbnQgbmFtZT0ibWFya2V0Q2FwIiB0eXBlPSJ4czpkb3VibGUiLz4KLQkJCQkJPHhzOmVsZW1lbnQgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JCQkJCTx4czplbGVtZW50IG5hbWU9Im9wZW4iIHR5cGU9InhzOmRvdWJsZSIvPgotCQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJwZVJhdGlvIiB0eXBlPSJ4czpkb3VibGUiLz4KLQkJCQkJPHhzOmVsZW1lbnQgbmFtZT0icGVyY2VudGFnZUNoYW5nZSIgdHlwZT0ieHM6ZG91YmxlIi8+Ci0JCQkJCTx4czplbGVtZW50IG5hbWU9InByZXZDbG9zZSIgdHlwZT0ieHM6ZG91YmxlIi8+Ci0JCQkJCTx4czplbGVtZW50IG5hbWU9InN5bWJvbCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JCQkJCTx4czplbGVtZW50IG5hbWU9InZvbHVtZSIgdHlwZT0ieHM6aW50Ii8+Ci0JCQkJPC94czpzZXF1ZW5jZT4KLQkJCTwveHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJwbGFjZU9yZGVyIj4KLQkJCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQkJCTx4czpzZXF1ZW5jZT4KLQkJCQkJCTx4czplbGVtZW50IG5hbWU9Im9yZGVyIiB0eXBlPSJheDIxOlBsYWNlT3JkZXIiLz4KLQkJCQkJPC94czpzZXF1ZW5jZT4KLQkJCQk8L3hzOmNvbXBsZXhUeXBlPgotCQkJPC94czplbGVtZW50PgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iUGxhY2VPcmRlciIgdHlwZT0iYXgyMTpQbGFjZU9yZGVyIi8+Ci0JCQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iUGxhY2VPcmRlciI+Ci0JCQkJPHhzOnNlcXVlbmNlPgotCQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJwcmljZSIgdHlwZT0ieHM6ZG91YmxlIi8+Ci0JCQkJCTx4czplbGVtZW50IG5hbWU9InF1YW50aXR5IiB0eXBlPSJ4czppbnQiLz4KLQkJCQkJPHhzOmVsZW1lbnQgbmFtZT0ic3ltYm9sIiB0eXBlPSJ4czpzdHJpbmciLz4KLQkJCQk8L3hzOnNlcXVlbmNlPgotCQkJPC94czpjb21wbGV4VHlwZT4KLQkJPC94czpzY2hlbWE+Ci0JPC93c2RsOnR5cGVzPgotCTx3c2RsOm1lc3NhZ2UgbmFtZT0iZ2V0UXVvdGVNZXNzYWdlIj4KLQkJPHdzZGw6cGFydCBuYW1lPSJwYXJ0MSIgZWxlbWVudD0ibnMxOmdldFF1b3RlIi8+Ci0JPC93c2RsOm1lc3NhZ2U+Ci0JPHdzZGw6bWVzc2FnZSBuYW1lPSJnZXRRdW90ZVJlc3BvbnNlTWVzc2FnZSI+Ci0JCTx3c2RsOnBhcnQgbmFtZT0icGFydDEiIGVsZW1lbnQ9Im5zMTpnZXRRdW90ZVJlc3BvbnNlIi8+Ci0JPC93c2RsOm1lc3NhZ2U+Ci0JPHdzZGw6bWVzc2FnZSBuYW1lPSJwbGFjZU9yZGVyTWVzc2FnZSI+Ci0JCTx3c2RsOnBhcnQgbmFtZT0icGFydDEiIGVsZW1lbnQ9Im5zMTpwbGFjZU9yZGVyIi8+Ci0JPC93c2RsOm1lc3NhZ2U+Ci0JPHdzZGw6cG9ydFR5cGUgbmFtZT0iU2ltcGxlU3RvY2tRdW90ZVNlcnZpY2VQb3J0VHlwZSI+Ci0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJnZXRRdW90ZSI+Ci0JCQk8d3NkbDppbnB1dCBtZXNzYWdlPSJheGlzMjpnZXRRdW90ZU1lc3NhZ2UiLz4KLQkJCTx3c2RsOm91dHB1dCBtZXNzYWdlPSJheGlzMjpnZXRRdW90ZVJlc3BvbnNlTWVzc2FnZSIvPgotCQk8L3dzZGw6b3BlcmF0aW9uPgotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0icGxhY2VPcmRlciI+Ci0JCQk8d3NkbDppbnB1dCBtZXNzYWdlPSJheGlzMjpwbGFjZU9yZGVyTWVzc2FnZSIvPgotCQk8L3dzZGw6b3BlcmF0aW9uPgotCTwvd3NkbDpwb3J0VHlwZT4KLQk8d3NkbDpiaW5kaW5nIG5hbWU9IlNpbXBsZVN0b2NrUXVvdGVTZXJ2aWNlU09BUDExQmluZGluZyIgdHlwZT0iYXhpczI6U2ltcGxlU3RvY2tRdW90ZVNlcnZpY2VQb3J0VHlwZSI+Ci0JCTxzb2FwOmJpbmRpbmcgc3R5bGU9ImRvY3VtZW50IiB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIvPgotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iZ2V0UXVvdGUiPgotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjpnZXRRdW90ZSIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0JCQk8d3NkbDppbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgbmFtZXNwYWNlPSJodHRwOi8vc2VydmljZXMuc2FtcGxlcyIvPgotCQkJPC93c2RsOmlucHV0PgotCQkJPHdzZGw6b3V0cHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9Imh0dHA6Ly9zZXJ2aWNlcy5zYW1wbGVzIi8+Ci0JCQk8L3dzZGw6b3V0cHV0PgotCQk8L3dzZGw6b3BlcmF0aW9uPgotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0icGxhY2VPcmRlciI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOnBsYWNlT3JkZXIiIHN0eWxlPSJkb2N1bWVudCIvPgotCQkJPHdzZGw6aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIG5hbWVzcGFjZT0iaHR0cDovL3NlcnZpY2VzLnNhbXBsZXMiLz4KLQkJCTwvd3NkbDppbnB1dD4KLQkJPC93c2RsOm9wZXJhdGlvbj4KLQk8L3dzZGw6YmluZGluZz4KLQk8d3NkbDpzZXJ2aWNlIG5hbWU9IlNpbXBsZVN0b2NrUXVvdGVTZXJ2aWNlIj4KLQkJPHdzZGw6cG9ydCBuYW1lPSJTaW1wbGVTdG9ja1F1b3RlU2VydmljZVNPQVAxMXBvcnQiIGJpbmRpbmc9ImF4aXMyOlNpbXBsZVN0b2NrUXVvdGVTZXJ2aWNlU09BUDExQmluZGluZyI+Ci0JCQk8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjgwODAvYXhpczIvc2VydmljZXMvU2ltcGxlU3RvY2tRdW90ZVNlcnZpY2UiLz4KLQkJPC93c2RsOnBvcnQ+Ci0JPC93c2RsOnNlcnZpY2U+Ci08L3dzZGw6ZGVmaW5pdGlvbnM+Ci0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NjcmlwdGluZy90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NyaXB0aW5nL1NjcmlwdERlcGxveW1lbnRFbmdpbmVUZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9zY3JpcHRpbmcvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjcmlwdGluZy9TY3JpcHREZXBsb3ltZW50RW5naW5lVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmM2OTYxLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NjcmlwdGluZy90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NyaXB0aW5nL1NjcmlwdERlcGxveW1lbnRFbmdpbmVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2NyaXB0aW5nOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC51dGlsLlV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0aW9uOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotcHVibGljIGNsYXNzIFNjcmlwdERlcGxveW1lbnRFbmdpbmVUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3QxKCkgdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24sIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgQXhpc0ZhdWx0LCBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKLSAgICAgICAgQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZyA9IG5ldyBBeGlzQ29uZmlndXJhdGlvbigpOwotICAgICAgICBTY3JpcHREZXBsb3ltZW50RW5naW5lIHNkZSA9IG5ldyBTY3JpcHREZXBsb3ltZW50RW5naW5lKGF4aXNDb25maWcpOwotICAgICAgICBVUkwgdGVzdFNjcmlwdCA9IGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKS5nZXRSZXNvdXJjZSgib3JnL2FwYWNoZS9heGlzMi9zY3JpcHRpbmcvdGVzdHJlcG8vdGVzdC5qcyIpOwotICAgICAgICBGaWxlIHNjcmlwdHNEaXIgPSBVdGlscy50b0ZpbGUodGVzdFNjcmlwdCkuZ2V0UGFyZW50RmlsZSgpOwotICAgICAgICBzZGUubG9hZFJlcG9zaXRvcnkoc2NyaXB0c0Rpcik7Ci0gICAgICAgIHNkZS5sb2FkU2VydmljZXMoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChheGlzQ29uZmlnLmdldFNlcnZpY2UoInRlc3QiKSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zY3JpcHRpbmcvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjcmlwdGluZy9TY3JpcHRNb2R1bGVUZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9zY3JpcHRpbmcvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjcmlwdGluZy9TY3JpcHRNb2R1bGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxZGE4OGUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2NyaXB0aW5nL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY3JpcHRpbmcvU2NyaXB0TW9kdWxlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjcmlwdGluZzsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LnV0aWwuVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5QYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0NvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1wdWJsaWMgY2xhc3MgU2NyaXB0TW9kdWxlVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotLy8gICAgcHVibGljIHZvaWQgdGVzdEdldFNjcmlwdEZvcldTREwoKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBVUklTeW50YXhFeGNlcHRpb24gewotLy8gICAgICAgIFNjcmlwdE1vZHVsZSBtb2R1bGUgPSBuZXcgU2NyaXB0TW9kdWxlKCk7Ci0vLyAgICAgICAgVVJMIHdzZGxVUkwgPSBnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkuZ2V0UmVzb3VyY2UoIm9yZy9hcGFjaGUvYXhpczIvc2NyaXB0aW5nL3Rlc3RyZXBvL3Rlc3Qud3NkbCIpOwotLy8gICAgICAgIFVSTCBzY3JpcHRVUkwgPSBtb2R1bGUuZ2V0U2NyaXB0Rm9yV1NETCh3c2RsVVJMKTsKLS8vICAgICAgICBhc3NlcnRUcnVlKHNjcmlwdFVSTC50b1N0cmluZygpLmVuZHNXaXRoKCJ0ZXN0LmpzIikpOwotLy8gICAgfQotLy8KLS8vICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRXU0RMc0luRGlyKCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgVVJJU3ludGF4RXhjZXB0aW9uIHsKLS8vICAgICAgICBTY3JpcHRNb2R1bGUgbW9kdWxlID0gbmV3IFNjcmlwdE1vZHVsZSgpOwotLy8gICAgICAgIFVSTCB3c2RsVVJMID0gZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpLmdldFJlc291cmNlKCJvcmcvYXBhY2hlL2F4aXMyL3NjcmlwdGluZy90ZXN0cmVwby90ZXN0LndzZGwiKTsKLS8vICAgICAgICBVUkwgc2NyaXB0c0RpciA9IG5ldyBGaWxlKHdzZGxVUkwudG9VUkkoKSkuZ2V0UGFyZW50RmlsZSgpLnRvVVJMKCk7Ci0vLyAgICAgICAgTGlzdCB3c2RscyA9IG1vZHVsZS5nZXRXU0RMc0luRGlyKHNjcmlwdHNEaXIpOwotLy8gICAgICAgIGFzc2VydEVxdWFscygyLCB3c2Rscy5zaXplKCkpOwotLy8gICAgICAgIGFzc2VydFRydWUod3NkbHMuZ2V0KDApLnRvU3RyaW5nKCkuZW5kc1dpdGgoInRlc3Qud3NkbCIpKTsKLS8vICAgIH0KLS8vCi0vLyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhZFNjcmlwdFNvdXJjZSgpIHRocm93cyBBeGlzRmF1bHQgewotLy8gICAgICAgIFNjcmlwdE1vZHVsZSBtb2R1bGUgPSBuZXcgU2NyaXB0TW9kdWxlKCk7Ci0vLyAgICAgICAgVVJMIHVybCA9IGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKS5nZXRSZXNvdXJjZSgib3JnL2FwYWNoZS9heGlzMi9zY3JpcHRpbmcvdGVzdHJlcG8vdGVzdC5qcyIpOwotLy8gICAgICAgIFN0cmluZyBzID0gbW9kdWxlLnJlYWRTY3JpcHRTb3VyY2UodXJsKTsKLS8vICAgICAgICBhc3NlcnRFcXVhbHMoInBldHJhIiwgcyk7Ci0vLyAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0U2NyaXB0U2VydmljZXNEaXJlY3RvcnkoKSB0aHJvd3MgQXhpc0ZhdWx0LCBNYWxmb3JtZWRVUkxFeGNlcHRpb24sIFVSSVN5bnRheEV4Y2VwdGlvbiwgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIFNjcmlwdE1vZHVsZSBtb2R1bGUgPSBuZXcgU2NyaXB0TW9kdWxlKCk7Ci0gICAgICAgIEF4aXNDb25maWd1cmF0aW9uIGF4aXNDb25maWcgPSBuZXcgQXhpc0NvbmZpZ3VyYXRpb24oKTsKLSAgICAgICAgVVJMIHVybCA9IGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKS5nZXRSZXNvdXJjZSgib3JnL2FwYWNoZS9heGlzMi9zY3JpcHRpbmcvdGVzdHJlcG8vdGVzdC5qcyIpOwotICAgICAgICBGaWxlIGRpciA9IFV0aWxzLnRvRmlsZSh1cmwpLmdldFBhcmVudEZpbGUoKTsKLSAgICAgICAgYXhpc0NvbmZpZy5zZXRSZXBvc2l0b3J5KGRpci5nZXRQYXJlbnRGaWxlKCkudG9VUkwoKSk7Ci0gICAgICAgIGF4aXNDb25maWcuYWRkUGFyYW1ldGVyKG5ldyBQYXJhbWV0ZXIoInNjcmlwdFNlcnZpY2VzRGlyIiwgZGlyLmdldE5hbWUoKSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZGlyLnRvVVJMKCksIG1vZHVsZS5nZXRTY3JpcHRTZXJ2aWNlc0RpcmVjdG9yeShheGlzQ29uZmlnKS50b1VSTCgpKTsKLSAgICB9Ci0KLS8vICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVTZXJ2aWNlKCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0vLyAgICAgICAgVVJMIHdzZGxVUkwgPSBnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkuZ2V0UmVzb3VyY2UoIm9yZy9hcGFjaGUvYXhpczIvc2NyaXB0aW5nL3Rlc3RyZXBvL3Rlc3Qud3NkbCIpOwotLy8gICAgICAgIFVSTCBzY3JpcHRVUkwgPSBnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkuZ2V0UmVzb3VyY2UoIm9yZy9hcGFjaGUvYXhpczIvc2NyaXB0aW5nL3Rlc3RyZXBvL3Rlc3QuanMiKTsKLS8vICAgICAgICBTY3JpcHRNb2R1bGUgbW9kdWxlID0gbmV3IFNjcmlwdE1vZHVsZSgpOwotLy8gICAgICAgIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlID0gbW9kdWxlLmNyZWF0ZVNlcnZpY2Uod3NkbFVSTCwgc2NyaXB0VVJMKTsKLS8vICAgICAgICBhc3NlcnRFcXVhbHMoInBldHJhIiwgYXhpc1NlcnZpY2UuZ2V0UGFyYW1ldGVyVmFsdWUoU2NyaXB0UmVjZWl2ZXIuU0NSSVBUX1NSQ19QUk9QKSk7Ci0vLyAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW5pdCgpIHRocm93cyBBeGlzRmF1bHQsIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgVVJJU3ludGF4RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIFNjcmlwdE1vZHVsZSBtb2R1bGUgPSBuZXcgU2NyaXB0TW9kdWxlKCk7Ci0gICAgICAgIEF4aXNDb25maWd1cmF0aW9uIGF4aXNDb25maWcgPSBuZXcgQXhpc0NvbmZpZ3VyYXRpb24oKTsKLSAgICAgICAgVVJMIHVybCA9IGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKS5nZXRSZXNvdXJjZSgib3JnL2FwYWNoZS9heGlzMi9zY3JpcHRpbmcvdGVzdHJlcG8vdGVzdC5qcyIpOwotICAgICAgICBGaWxlIGRpciA9IFV0aWxzLnRvRmlsZSh1cmwpLmdldFBhcmVudEZpbGUoKTsKLSAgICAgICAgYXhpc0NvbmZpZy5zZXRSZXBvc2l0b3J5KGRpci5nZXRQYXJlbnRGaWxlKCkudG9VUkwoKSk7Ci0gICAgICAgIGF4aXNDb25maWcuYWRkUGFyYW1ldGVyKG5ldyBQYXJhbWV0ZXIoInNjcmlwdFNlcnZpY2VzRGlyIiwgZGlyLmdldE5hbWUoKSkpOwotICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0ID0gbmV3IENvbmZpZ3VyYXRpb25Db250ZXh0KGF4aXNDb25maWcpOwotCi0gICAgICAgIG1vZHVsZS5pbml0KGNvbmZpZ0NvbnRleHQsIG51bGwpOwotICAgICAgICAKLSAgICAgICAgVGhyZWFkLnNsZWVwKDUwMCk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnROb3ROdWxsKGF4aXNDb25maWcuZ2V0U2VydmljZSgidGVzdCIpKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NjcmlwdGluZy90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NyaXB0aW5nL1NjcmlwdFJlY2VpdmVyVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvc2NyaXB0aW5nL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY3JpcHRpbmcvU2NyaXB0UmVjZWl2ZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlYjM5NmMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2NyaXB0aW5nL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY3JpcHRpbmcvU2NyaXB0UmVjZWl2ZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2NyaXB0aW5nOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgU2NyaXB0UmVjZWl2ZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZva2VCdXNpbmVzc0xvZ2ljKCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIFNjcmlwdFJlY2VpdmVyIHNjcmlwdFJlY2VpdmVyID0gbmV3IFNjcmlwdFJlY2VpdmVyKCk7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IGluTUMgPSBUZXN0VXRpbHMuY3JlYXRlTW9ja01lc3NhZ2VDb250ZXh0KCI8YT5wZXRyYTwvYT4iKTsKLSAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UgPSBpbk1DLmdldEF4aXNTZXJ2aWNlKCk7Ci0gICAgICAgIGF4aXNTZXJ2aWNlLmFkZFBhcmFtZXRlcihuZXcgUGFyYW1ldGVyKFNjcmlwdFJlY2VpdmVyLlNDUklQVF9BVFRSLCAiZm9vLmpzIikpOwotICAgICAgICBheGlzU2VydmljZS5hZGRQYXJhbWV0ZXIobmV3IFBhcmFtZXRlcihTY3JpcHRSZWNlaXZlci5TQ1JJUFRfU1JDX1BST1AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmdW5jdGlvbiBpbnZva2UoaW5NQyxvdXRNQykgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIntvdXRNQy5zZXRQYXlsb2FkWE1MKDxhPnBldHJhPC9hPikgfSIpKTsKLSAgICAgICAgaW5NQy5zZXRBeGlzU2VydmljZShheGlzU2VydmljZSk7Ci0gICAgICAgIHNjcmlwdFJlY2VpdmVyLmludm9rZUJ1c2luZXNzTG9naWMoaW5NQywgaW5NQyk7Ci0gICAgICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gaW5NQy5nZXRFbnZlbG9wZSgpLmdldENoaWxkRWxlbWVudHMoKTsKLSAgICAgICAgaXRlcmF0b3IubmV4dCgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjxhPnBldHJhPC9hPiIsICgoT01FbGVtZW50KSBpdGVyYXRvci5uZXh0KCkpLmdldEZpcnN0RWxlbWVudCgpLnRvU3RyaW5nKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBeGlzU2VydmljZSgpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBTY3JpcHRSZWNlaXZlciBzY3JpcHRSZWNlaXZlciA9IG5ldyBTY3JpcHRSZWNlaXZlcigpOwotICAgICAgICBNZXNzYWdlQ29udGV4dCBpbk1DID0gVGVzdFV0aWxzLmNyZWF0ZU1vY2tNZXNzYWdlQ29udGV4dCgiPGE+cGV0cmE8L2E+Iik7Ci0gICAgICAgIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlID0gaW5NQy5nZXRBeGlzU2VydmljZSgpOwotICAgICAgICBheGlzU2VydmljZS5hZGRQYXJhbWV0ZXIobmV3IFBhcmFtZXRlcihTY3JpcHRSZWNlaXZlci5TQ1JJUFRfQVRUUiwgImZvby5qcyIpKTsKLSAgICAgICAgYXhpc1NlcnZpY2UuYWRkUGFyYW1ldGVyKFNjcmlwdFJlY2VpdmVyLlNDUklQVF9TUkNfUFJPUCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhciBzY29wZSA9IF9BeGlzU2VydmljZS5nZXRTY29wZSgpO2Z1bmN0aW9uIGludm9rZShpbk1DLG91dE1DKSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAie291dE1DLnNldFBheWxvYWRYTUwoPGE+e3Njb3BlfTwvYT4pIH0iKTsKLSAgICAgICAgc2NyaXB0UmVjZWl2ZXIuaW52b2tlQnVzaW5lc3NMb2dpYyhpbk1DLCBpbk1DKTsKLSAgICAgICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBpbk1DLmdldEVudmVsb3BlKCkuZ2V0Q2hpbGRFbGVtZW50cygpOwotICAgICAgICBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiPGE+cmVxdWVzdDwvYT4iLCAoKE9NRWxlbWVudCkgaXRlcmF0b3IubmV4dCgpKS5nZXRGaXJzdEVsZW1lbnQoKS50b1N0cmluZygpKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NjcmlwdGluZy90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NyaXB0aW5nL1Rlc3RVdGlscy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvc2NyaXB0aW5nL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY3JpcHRpbmcvVGVzdFV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyMmRlNzcuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc2NyaXB0aW5nL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY3JpcHRpbmcvVGVzdFV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2NyaXB0aW5nOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmJ1aWxkZXIuU3RBWE9NQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LlNlcnZpY2VHcm91cENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlR3JvdXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5QYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0NvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTElucHV0RmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKLQotcHVibGljIGNsYXNzIFRlc3RVdGlscyB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9NRWxlbWVudCBjcmVhdGVPTUVsZW1lbnQoU3RyaW5nIHhtbCkgewotICAgICAgICB0cnkgewotCi0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyID0gWE1MSW5wdXRGYWN0b3J5Lm5ld0luc3RhbmNlKCkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoeG1sKSk7Ci0gICAgICAgICAgICBTdEFYT01CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RBWE9NQnVpbGRlcihyZWFkZXIpOwotICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXIuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0KLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBNZXNzYWdlQ29udGV4dCBjcmVhdGVNb2NrTWVzc2FnZUNvbnRleHQoU3RyaW5nIHBheWxvYWQpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBNZXNzYWdlQ29udGV4dCBpbk1DID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIFNPQVBFbnZlbG9wZSBlbnZlbG9wZSA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMUZhY3RvcnkoKS5nZXREZWZhdWx0RW52ZWxvcGUoKTsKLSAgICAgICAgT01Eb2N1bWVudCBvbURvYyA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMUZhY3RvcnkoKS5jcmVhdGVPTURvY3VtZW50KCk7Ci0gICAgICAgIG9tRG9jLmFkZENoaWxkKGVudmVsb3BlKTsKLSAgICAgICAgZW52ZWxvcGUuZ2V0Qm9keSgpLmFkZENoaWxkKFRlc3RVdGlscy5jcmVhdGVPTUVsZW1lbnQocGF5bG9hZCkpOwotICAgICAgICBpbk1DLnNldEVudmVsb3BlKGVudmVsb3BlKTsKLSAgICAgICAgQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZyA9IG5ldyBBeGlzQ29uZmlndXJhdGlvbigpOwotICAgICAgICBBeGlzU2VydmljZSBhcyA9IG5ldyBBeGlzU2VydmljZSgpOwotICAgICAgICBhcy5zZXROYW1lKCJTY3JpcHRTZXJ2aWNlIik7Ci0gICAgICAgIEF4aXNTZXJ2aWNlR3JvdXAgYXNnID0gbmV3IEF4aXNTZXJ2aWNlR3JvdXAoYXhpc0NvbmZpZyk7Ci0gICAgICAgIGFzZy5hZGRTZXJ2aWNlKGFzKTsKLSAgICAgICAgYXMuYWRkUGFyYW1ldGVyKG5ldyBQYXJhbWV0ZXIoInNjcmlwdC5qcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmdW5jdGlvbiBpbnZva2UoaW5NQywgb3V0TUMpIHsgb3V0TUMuc2V0UGF5bG9hZFhNTCgiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkICsgIil9IikpOwotICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBjZmdDdHggPSBuZXcgQ29uZmlndXJhdGlvbkNvbnRleHQoYXhpc0NvbmZpZyk7Ci0gICAgICAgIFNlcnZpY2VHcm91cENvbnRleHQgc2djID0gY2ZnQ3R4LmNyZWF0ZVNlcnZpY2VHcm91cENvbnRleHQoYXNnKTsKLSAgICAgICAgaW5NQy5zZXRBeGlzU2VydmljZShhcyk7Ci0gICAgICAgIGluTUMuc2V0U2VydmljZUNvbnRleHQoc2djLmdldFNlcnZpY2VDb250ZXh0KGFzKSk7Ci0gICAgICAgIHJldHVybiBpbk1DOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NjcmlwdGluZy90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NyaXB0aW5nL2NvbnZlcnRvcnMvSlNPTUVsZW1lbnRDb252ZXJ0b3JUZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9zY3JpcHRpbmcvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjcmlwdGluZy9jb252ZXJ0b3JzL0pTT01FbGVtZW50Q29udmVydG9yVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWM0NDMxLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NjcmlwdGluZy90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NyaXB0aW5nL2NvbnZlcnRvcnMvSlNPTUVsZW1lbnRDb252ZXJ0b3JUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2NyaXB0aW5nLmNvbnZlcnRvcnM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZUdyb3VwOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuc2NyaXB0aW5nLlNjcmlwdFJlY2VpdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuc2NyaXB0aW5nLlRlc3RVdGlsczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIEpTT01FbGVtZW50Q29udmVydG9yVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTCA9ICI8YT48Yj5wZXRyYTwvYj48L2E+IjsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RUb0FuZEZyb21TY3JpcHQoKSB7Ci0gICAgICAgIEpTT01FbGVtZW50Q29udmVydG9yIGNvbnZlcnRvciA9IG5ldyBKU09NRWxlbWVudENvbnZlcnRvcigpOwotICAgICAgICBPYmplY3QgbyA9IGNvbnZlcnRvci50b1NjcmlwdChUZXN0VXRpbHMuY3JlYXRlT01FbGVtZW50KFhNTCkpOwotICAgICAgICBPTUVsZW1lbnQgb20gPSBjb252ZXJ0b3IuZnJvbVNjcmlwdChvKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFhNTCwgb20udG9TdHJpbmcoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEZyb21TY3JpcHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU2NyaXB0UmVjZWl2ZXIgbWVkaWF0b3IgPSBuZXcgU2NyaXB0UmVjZWl2ZXIoKTsKLSAgICAgICAgTWVzc2FnZUNvbnRleHQgaW5NQyA9IFRlc3RVdGlscy5jcmVhdGVNb2NrTWVzc2FnZUNvbnRleHQoWE1MKTsKLSAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZjZSA9IG5ldyBBeGlzU2VydmljZSgpOwotICAgICAgICBheGlzU2VydmNlLnNldFBhcmVudChuZXcgQXhpc1NlcnZpY2VHcm91cChuZXcgQXhpc0NvbmZpZ3VyYXRpb24oKSkpOwotICAgICAgICBheGlzU2VydmNlLmFkZFBhcmFtZXRlcihuZXcgUGFyYW1ldGVyKFNjcmlwdFJlY2VpdmVyLlNDUklQVF9BVFRSLCAiZm9vLmpzIikpOwotICAgICAgICBheGlzU2VydmNlLmFkZFBhcmFtZXRlcihuZXcgUGFyYW1ldGVyKFNjcmlwdFJlY2VpdmVyLlNDUklQVF9TUkNfUFJPUCwgImZ1bmN0aW9uIGludm9rZShpbk1DLG91dE1DKSB7IG91dE1DLnNldFBheWxvYWRYTUwoPGE+PGI+cGV0cmE8L2I+PC9hPikgfSIpKTsKLSAgICAgICAgaW5NQy5zZXRBeGlzU2VydmljZShheGlzU2VydmNlKTsKLSAgICAgICAgbWVkaWF0b3IuaW52b2tlQnVzaW5lc3NMb2dpYyhpbk1DLCBpbk1DKTsKLSAgICAgICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBpbk1DLmdldEVudmVsb3BlKCkuZ2V0Q2hpbGRFbGVtZW50cygpOwotICAgICAgICBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhYTUwsICgoT01FbGVtZW50KSBpdGVyYXRvci5uZXh0KCkpLmdldEZpcnN0RWxlbWVudCgpLnRvU3RyaW5nKCkpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc29hcG1vbml0b3IvcG9tLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL3NvYXBtb25pdG9yL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0YmYzY2MuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc29hcG1vbml0b3IvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItcGFyZW50PC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4xLjUuMTwvdmVyc2lvbj4KLSAgICAgICAgPHJlbGF0aXZlUGF0aD4uLi9wYXJlbnQvcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgotICAgIDwvcGFyZW50PgotICAgIDxhcnRpZmFjdElkPnNvYXBtb25pdG9yPC9hcnRpZmFjdElkPgotICAgIDxwYWNrYWdpbmc+bWFyPC9wYWNrYWdpbmc+Ci0gICAgPG5hbWU+QXBhY2hlIEF4aXMyIC0gU09BUCBNb25pdG9yPC9uYW1lPgotICAgIDxkZXNjcmlwdGlvbj5zb2FwbW9uaXRvciBmb3IgQXhpcyAyLjA8L2Rlc2NyaXB0aW9uPgotICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLWtlcm5lbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7dmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8L2RlcGVuZGVuY2llcz4KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxzb3VyY2VEaXJlY3Rvcnk+c3JjPC9zb3VyY2VEaXJlY3Rvcnk+Ci0gICAgICAgIDx0ZXN0U291cmNlRGlyZWN0b3J5PnRlc3Q8L3Rlc3RTb3VyY2VEaXJlY3Rvcnk+Ci0gICAgICAgIDxyZXNvdXJjZXM+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT4uLi8uLjwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+Tk9USUNFLnR4dDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+TElDRU5TRS50eHQ8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgICAgICA8ZmlsdGVyaW5nPmZhbHNlPC9maWx0ZXJpbmc+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+Y29uZjwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxleGNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovKi5wcm9wZXJ0aWVzPC9leGNsdWRlPgotICAgICAgICAgICAgICAgIDwvZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgPGZpbHRlcmluZz5mYWxzZTwvZmlsdGVyaW5nPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYzwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovbW9kdWxlLnhtbDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgICAgIDxmaWx0ZXJpbmc+ZmFsc2U8L2ZpbHRlcmluZz4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgIDwvcmVzb3VyY2VzPgotICAgICAgICA8dGVzdFJlc291cmNlcz4KLSAgICAgICAgICAgIDx0ZXN0UmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPHRhcmdldFBhdGg+Li4vdGVzdC1yZXNvdXJjZXM8L3RhcmdldFBhdGg+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT50ZXN0LXJlc291cmNlczwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKio8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgIDwvdGVzdFJlc291cmNlPgotICAgICAgICA8L3Rlc3RSZXNvdXJjZXM+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxza2lwPmZhbHNlPC9za2lwPgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYW50cnVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5wcm9jZXNzLWNsYXNzZXM8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnByb2Nlc3MtY2xhc3NlczwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFza3M+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlY2hvIG1lc3NhZ2U9IkNyZWF0aW5nIHNvYXBtb25pdG9yIGphci4uLiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8amFyIGRlc3RmaWxlPSIke3BvbS5iYXNlZGlyfS90YXJnZXQvJHtwcm9qZWN0LmJ1aWxkLmZpbmFsTmFtZX0uamFyIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VkaXI9IiR7cG9tLmJhc2VkaXJ9L3RhcmdldC9jbGFzc2VzIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2x1ZGVzPSIqKi9tb2R1bGUueG1sLCpoYW5kbGVycyosKiovKk1vZHVsZSosKiovKkhhbmRsZXIqIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YXNrcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5ydW48L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1tYXItbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7dmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPGV4dGVuc2lvbnM+dHJ1ZTwvZXh0ZW5zaW9ucz4KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGVEZXBlbmRlbmNpZXM+ZmFsc2U8L2luY2x1ZGVEZXBlbmRlbmNpZXM+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgIDwvcGx1Z2lucz4KLSAgICA8L2J1aWxkPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc29hcG1vbml0b3Ivc3JjL01FVEEtSU5GL01BTklGRVNULk1GIGIvdjEuNS4xUkMzL21vZHVsZXMvc29hcG1vbml0b3Ivc3JjL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTUwYjhmLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3NvYXBtb25pdG9yL3NyYy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wDQotQ3JlYXRlZC1CeTogQW50IDEuNC4xDQotDQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc29hcG1vbml0b3Ivc3JjL01FVEEtSU5GL21vZHVsZS54bWwgYi92MS41LjFSQzMvbW9kdWxlcy9zb2FwbW9uaXRvci9zcmMvTUVUQS1JTkYvbW9kdWxlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTY5MzFlYi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zb2FwbW9uaXRvci9zcmMvTUVUQS1JTkYvbW9kdWxlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPG1vZHVsZSBuYW1lPSJzb2FwbW9uaXRvciIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuaGFuZGxlcnMuc29hcG1vbml0b3IuU09BUE1vbml0b3JNb2R1bGUiPgotICAgIDxJbkZsb3c+Ci0gICAgICAgIDxoYW5kbGVyIG5hbWU9IkluRmxvd1NPQVBNb25pdG9ySGFuZGxlciIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuaGFuZGxlcnMuc29hcG1vbml0b3IuU09BUE1vbml0b3JIYW5kbGVyIj4KLSAgICAgICAgICAgIDxvcmRlciBwaGFzZT0ic29hcG1vbml0b3JQaGFzZSIvPgotICAgICAgICA8L2hhbmRsZXI+Ci0gICAgPC9JbkZsb3c+Ci0KLSAgICA8T3V0Rmxvdz4KLSAgICAgICAgPGhhbmRsZXIgbmFtZT0iT3V0Rmxvd1NPQVBNb25pdG9ySGFuZGxlciIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuaGFuZGxlcnMuc29hcG1vbml0b3IuU09BUE1vbml0b3JIYW5kbGVyIj4KLSAgICAgICAgICAgIDxvcmRlciBwaGFzZT0ic29hcG1vbml0b3JQaGFzZSIvPgotICAgICAgICA8L2hhbmRsZXI+Ci0gICAgPC9PdXRGbG93PgotCi0gICAgPE91dEZhdWx0Rmxvdz4KLSAgICAgICAgPGhhbmRsZXIgbmFtZT0iRmF1bHRPdXRGbG93U09BUE1vbml0b3JIYW5kbGVyIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5oYW5kbGVycy5zb2FwbW9uaXRvci5TT0FQTW9uaXRvckhhbmRsZXIiPgotICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJzb2FwbW9uaXRvclBoYXNlIi8+Ci0gICAgICAgIDwvaGFuZGxlcj4KLSAgICA8L091dEZhdWx0Rmxvdz4KLQotICAgIDxJbkZhdWx0Rmxvdz4KLSAgICAgICAgPGhhbmRsZXIgbmFtZT0iRmF1bHRJbkZsb3dTT0FQTW9uaXRvckhhbmRsZXIiIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmhhbmRsZXJzLnNvYXBtb25pdG9yLlNPQVBNb25pdG9ySGFuZGxlciI+Ci0gICAgICAgICAgICA8b3JkZXIgcGhhc2U9InNvYXBtb25pdG9yUGhhc2UiLz4KLSAgICAgICAgPC9oYW5kbGVyPgotICAgIDwvSW5GYXVsdEZsb3c+Ci08L21vZHVsZT4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NvYXBtb25pdG9yL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2hhbmRsZXJzL3NvYXBtb25pdG9yL1NPQVBNb25pdG9ySGFuZGxlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvc29hcG1vbml0b3Ivc3JjL29yZy9hcGFjaGUvYXhpczIvaGFuZGxlcnMvc29hcG1vbml0b3IvU09BUE1vbml0b3JIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2MmVkYTIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc29hcG1vbml0b3Ivc3JjL29yZy9hcGFjaGUvYXhpczIvaGFuZGxlcnMvc29hcG1vbml0b3IvU09BUE1vbml0b3JIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmhhbmRsZXJzLnNvYXBtb25pdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmhhbmRsZXJzLkFic3RyYWN0SGFuZGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnNvYXBtb25pdG9yLnNlcnZsZXQuU09BUE1vbml0b3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5zb2FwbW9uaXRvci5zZXJ2bGV0LlNPQVBNb25pdG9yU2VydmljZTsKLQotcHVibGljIGNsYXNzIFNPQVBNb25pdG9ySGFuZGxlciBleHRlbmRzIEFic3RyYWN0SGFuZGxlciB7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBuYW1lOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgbG9uZyBuZXh0X21lc3NhZ2VfaWQgPSAxOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgU09BUE1vbml0b3JIYW5kbGVyKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmV2b2tlKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBQcm9jZXNzIGFuZCBTT0FQIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgSW52b2NhdGlvblJlc3BvbnNlIGludm9rZShNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0KLSAgICAgICAgRW5kcG9pbnRSZWZlcmVuY2UgcmVmID0gbnVsbDsKLQotICAgICAgICAvLyBHZXQgaWQsIHR5cGUgYW5kIGNvbnRlbnQKLSAgICAgICAgTG9uZyBpZDsKLSAgICAgICAgSW50ZWdlciB0eXBlOwotICAgICAgICAvLyAnc29hcCByZXF1ZXN0JyBtdXN0IGJlIGNhbGxlZCBmaXJzdAotICAgICAgICBpZiAobWVzc2FnZUNvbnRleHQuZ2V0RkxPVygpID09IE1lc3NhZ2VDb250ZXh0LklOX0ZMT1cpIHsKLSAgICAgICAgICAgIC8vIHNob3cgc29hcCBtZXNzYWdlIGluc2lkZSB0aGUgJ3NvYXAgcmVxdWVzdCcgcGFuZSBpbiB0aGUgYXBwbGV0Ci0gICAgICAgICAgICBpZCA9IGFzc2lnbk1lc3NhZ2VJZChtZXNzYWdlQ29udGV4dCk7Ci0gICAgICAgICAgICB0eXBlID0gbmV3IEludGVnZXIoU09BUE1vbml0b3JDb25zdGFudHMuU09BUF9NT05JVE9SX1JFUVVFU1QpOwotICAgICAgICAgICAgcmVmID0gbWVzc2FnZUNvbnRleHQuZ2V0VG8oKTsKLSAgICAgICAgfSBlbHNlIGlmIChtZXNzYWdlQ29udGV4dC5nZXRGTE9XKCkgPT0gTWVzc2FnZUNvbnRleHQuT1VUX0ZMT1cpIHsKLSAgICAgICAgICAgIGlkID0gZ2V0TWVzc2FnZUlkKG1lc3NhZ2VDb250ZXh0KTsKLSAgICAgICAgICAgIC8vIHNob3cgc29hcCBtZXNzYWdlIGluc2lkZSB0aGUgJ3NvYXAgcmVzcG9uc2UnIHBhbmUgaW4gdGhlIGFwcGxldAotICAgICAgICAgICAgdHlwZSA9IG5ldyBJbnRlZ2VyKFNPQVBNb25pdG9yQ29uc3RhbnRzLlNPQVBfTU9OSVRPUl9SRVNQT05TRSk7Ci0gICAgICAgICAgICByZWYgPSBtZXNzYWdlQ29udGV4dC5nZXRGcm9tKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAobWVzc2FnZUNvbnRleHQuZ2V0RkxPVygpID09IE1lc3NhZ2VDb250ZXh0LklOX0ZBVUxUX0ZMT1cpIHsKLSAgICAgICAgICAgIGlkID0gZ2V0TWVzc2FnZUlkKG1lc3NhZ2VDb250ZXh0KTsKLSAgICAgICAgICAgIC8vIHNob3cgc29hcCBtZXNzYWdlIGluc2lkZSB0aGUgJ3NvYXAgcmVxdWVzdCcgcGFuZSBpbiB0aGUgYXBwbGV0Ci0gICAgICAgICAgICB0eXBlID0gbmV3IEludGVnZXIoU09BUE1vbml0b3JDb25zdGFudHMuU09BUF9NT05JVE9SX1JFUVVFU1QpOwotICAgICAgICAgICAgcmVmID0gbWVzc2FnZUNvbnRleHQuZ2V0RmF1bHRUbygpOwotICAgICAgICB9IGVsc2UgaWYgKG1lc3NhZ2VDb250ZXh0LmdldEZMT1coKSA9PSBNZXNzYWdlQ29udGV4dC5PVVRfRkFVTFRfRkxPVykgewotICAgICAgICAgICAgaWQgPSBnZXRNZXNzYWdlSWQobWVzc2FnZUNvbnRleHQpOwotICAgICAgICAgICAgLy8gc2hvdyBzb2FwIG1lc3NhZ2UgaW5zaWRlIHRoZSAnc29hcCByZXNwb25zZScgcGFuZSBpbiB0aGUgYXBwbGV0Ci0gICAgICAgICAgICB0eXBlID0gbmV3IEludGVnZXIoU09BUE1vbml0b3JDb25zdGFudHMuU09BUF9NT05JVE9SX1JFU1BPTlNFKTsKLSAgICAgICAgICAgIC8vIFRPRE8gLSBIb3cgZG8gSSBnZXQgYW4gRVBSIG9uIE1lc3NhZ2VDb250ZXh0Lk9VVF9GQVVMVF9GTE9XID8KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInVua25vd24gRkxPVyBkZXRlY3RlZCBpbiBtZXNzYWdlQ29udGV4dDogIiArIG1lc3NhZ2VDb250ZXh0LmdldEZMT1coKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgdGFyZ2V0ID0gbnVsbDsKLSAgICAgICAgaWYgKHJlZiAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0YXJnZXQgPSByZWYuZ2V0QWRkcmVzcygpOwotICAgICAgICB9Ci0gICAgICAgIC8vIENoZWNrIGZvciBudWxsIHRhcmdldAotICAgICAgICBpZiAodGFyZ2V0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRhcmdldCA9ICIiOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gR2V0IHRoZSBTT0FQIHBvcnRpb24gb2YgdGhlIG1lc3NhZ2UKLSAgICAgICAgU3RyaW5nIHNvYXAgPSBudWxsOwotICAgICAgICBpZiAobWVzc2FnZUNvbnRleHQuZ2V0RW52ZWxvcGUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzb2FwID0gbWVzc2FnZUNvbnRleHQuZ2V0RW52ZWxvcGUoKS50b1N0cmluZygpOwotICAgICAgICB9Ci0gICAgICAgIC8vIElmIHdlIGhhdmUgYW4gaWQgYW5kIGEgU09BUCBwb3J0aW9uLCB0aGVuIHNlbmQgdGhlCi0gICAgICAgIC8vIG1lc3NhZ2UgdG8gdGhlIFNPQVAgbW9uaXRvciBzZXJ2aWNlCi0gICAgICAgIGlmICgoaWQgIT0gbnVsbCkgJiYgKHNvYXAgIT0gbnVsbCkpIHsKLSAgICAgICAgICAgIFNPQVBNb25pdG9yU2VydmljZS5wdWJsaXNoTWVzc2FnZShpZCwgdHlwZSwgdGFyZ2V0LCBzb2FwKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gSW52b2NhdGlvblJlc3BvbnNlLkNPTlRJTlVFOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFzc2lnbiBhIG5ldyBtZXNzYWdlIGlkCi0gICAgICovCi0gICAgcHJpdmF0ZSBMb25nIGFzc2lnbk1lc3NhZ2VJZChNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCkgewotICAgICAgICBMb25nIGlkOwotICAgICAgICBzeW5jaHJvbml6ZWQgKFNPQVBNb25pdG9yQ29uc3RhbnRzLlNPQVBfTU9OSVRPUl9JRCkgewotICAgICAgICAgICAgaWQgPSBuZXcgTG9uZyhuZXh0X21lc3NhZ2VfaWQpOwotICAgICAgICAgICAgbmV4dF9tZXNzYWdlX2lkKys7Ci0gICAgICAgIH0KLSAgICAgICAgbWVzc2FnZUNvbnRleHQuZ2V0T3BlcmF0aW9uQ29udGV4dCgpLnNldFByb3BlcnR5KAotICAgICAgICAgICAgICAgIFNPQVBNb25pdG9yQ29uc3RhbnRzLlNPQVBfTU9OSVRPUl9JRCwgaWQpOwotICAgICAgICByZXR1cm4gaWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBhbHJlYWR5IGFzc2lnbmVkIG1lc3NhZ2UgaWQKLSAgICAgKi8KLSAgICBwcml2YXRlIExvbmcgZ2V0TWVzc2FnZUlkKE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0KSB7Ci0gICAgICAgIExvbmcgaWQ7Ci0gICAgICAgIGlkID0gKExvbmcpIG1lc3NhZ2VDb250ZXh0LmdldE9wZXJhdGlvbkNvbnRleHQoKS5nZXRQcm9wZXJ0eSgKLSAgICAgICAgICAgICAgICBTT0FQTW9uaXRvckNvbnN0YW50cy5TT0FQX01PTklUT1JfSUQpOwotICAgICAgICByZXR1cm4gaWQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc29hcG1vbml0b3Ivc3JjL29yZy9hcGFjaGUvYXhpczIvaGFuZGxlcnMvc29hcG1vbml0b3IvU09BUE1vbml0b3JNb2R1bGUuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NvYXBtb25pdG9yL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2hhbmRsZXJzL3NvYXBtb25pdG9yL1NPQVBNb25pdG9yTW9kdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNjQxMDIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc29hcG1vbml0b3Ivc3JjL29yZy9hcGFjaGUvYXhpczIvaGFuZGxlcnMvc29hcG1vbml0b3IvU09BUE1vbml0b3JNb2R1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmhhbmRsZXJzLnNvYXBtb25pdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc0Rlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc01vZHVsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLm1vZHVsZXMuTW9kdWxlOwotaW1wb3J0IG9yZy5hcGFjaGUubmVldGhpLkFzc2VydGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm5lZXRoaS5Qb2xpY3k7Ci0KLXB1YmxpYyBjbGFzcyBTT0FQTW9uaXRvck1vZHVsZSBpbXBsZW1lbnRzIE1vZHVsZSB7Ci0KLQotICAgICAvLyBpbml0aWFsaXplIHRoZSBtb2R1bGUKLSAgICBwdWJsaWMgdm9pZCBpbml0KENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQsIEF4aXNNb2R1bGUgbW9kdWxlKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBlbmdhZ2VOb3RpZnkoQXhpc0Rlc2NyaXB0aW9uIGF4aXNEZXNjcmlwdGlvbikgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgfQotCi0gICAgLy8gc2h1dGRvd24gdGhlIG1vZHVsZQotICAgIHB1YmxpYyB2b2lkIHNodXRkb3duKENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQpIHRocm93cyBBeGlzRmF1bHQgewotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRQb2xpY3lOYW1lc3BhY2VzKCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhcHBseVBvbGljeShQb2xpY3kgcG9saWN5LCBBeGlzRGVzY3JpcHRpb24gYXhpc0Rlc2NyaXB0aW9uKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBjYW5TdXBwb3J0QXNzZXJ0aW9uKEFzc2VydGlvbiBhc3NlcnRpb24pIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIAotICAgIAotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc29hcG1vbml0b3Ivc3JjL29yZy9hcGFjaGUvYXhpczIvc29hcG1vbml0b3IvYXBwbGV0L1NPQVBNb25pdG9yQXBwbGV0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9zb2FwbW9uaXRvci9zcmMvb3JnL2FwYWNoZS9heGlzMi9zb2FwbW9uaXRvci9hcHBsZXQvU09BUE1vbml0b3JBcHBsZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTUzNmI2Ni4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zb2FwbW9uaXRvci9zcmMvb3JnL2FwYWNoZS9heGlzMi9zb2FwbW9uaXRvci9hcHBsZXQvU09BUE1vbml0b3JBcHBsZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OTQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNvYXBtb25pdG9yLmFwcGxldDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuc29hcG1vbml0b3Iuc2VydmxldC5TT0FQTW9uaXRvckNvbnN0YW50czsKLQotaW1wb3J0IGphdmF4LnN3aW5nLio7Ci1pbXBvcnQgamF2YXguc3dpbmcuYm9yZGVyLkJldmVsQm9yZGVyOwotaW1wb3J0IGphdmF4LnN3aW5nLmJvcmRlci5FbXB0eUJvcmRlcjsKLWltcG9ydCBqYXZheC5zd2luZy5ib3JkZXIuRXRjaGVkQm9yZGVyOwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LkRvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuRG9jdW1lbnRMaXN0ZW5lcjsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5MaXN0U2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuTGlzdFNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IGphdmF4LnN3aW5nLnRhYmxlLkFic3RyYWN0VGFibGVNb2RlbDsKLWltcG9ydCBqYXZhLmF3dC4qOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkV2ZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkxpc3RlbmVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5Tb2NrZXQ7Ci1pbXBvcnQgamF2YS50ZXh0LkRhdGVGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLS8qKgotICogVGhpcyBpcyBhIFNPQVAgTW9pbnRvciBBcHBsZXQgY2xhc3MuICBUaGlzIGNsYXNzIHByb3ZpZGVzCi0gKiB0aGUgdXNlciBpbnRlcmZhY2UgZm9yIGRpc3BsYXlpbmcgZGF0YSBmcm9tIHRoZSBTT0FQCi0gKiBtb25pdG9yIHNlcnZpY2UuCi0gKi8KLXB1YmxpYyBjbGFzcyBTT0FQTW9uaXRvckFwcGxldCBleHRlbmRzIEpBcHBsZXQgewotCi0gICAgLyoqCi0gICAgICogUHJpdmF0ZSBkYXRhCi0gICAgICovCi0gICAgcHJpdmF0ZSBKUGFuZWwgICAgICBtYWluX3BhbmVsID0gbnVsbDsKLSAgICBwcml2YXRlIEpUYWJiZWRQYW5lIHRhYmJlZF9wYW5lID0gbnVsbDsKLSAgICBwcml2YXRlIGludCAgICAgICAgIHBvcnQgPSAwOwotICAgIHByaXZhdGUgVmVjdG9yICAgICAgcGFnZXMgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgU09BUE1vbml0b3JBcHBsZXQoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXBwbGV0IGluaXRpYWxpemF0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW5pdCgpIHsKLSAgICAgICAgLy8gR2V0IHRoZSBwb3J0IHRvIGJlIHVzZWQKLSAgICAgICAgU3RyaW5nIHBvcnRfc3RyID0gZ2V0UGFyYW1ldGVyKCJwb3J0Iik7Ci0gICAgICAgIGlmIChwb3J0X3N0ciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwb3J0ID0gSW50ZWdlci5wYXJzZUludChwb3J0X3N0cik7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gVHJ5IHRvIHVzZSB0aGUgc3lzdGVtIGxvb2sgYW5kIGZlZWwKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgVUlNYW5hZ2VyLnNldExvb2tBbmRGZWVsKFVJTWFuYWdlci5nZXRTeXN0ZW1Mb29rQW5kRmVlbENsYXNzTmFtZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpewotICAgICAgICB9Ci0gICAgICAgIC8vIENyZWF0ZSBtYWluIHBhbmVsIHRvIGhvbGQgbm90ZWJvb2sKLSAgICAgICAgbWFpbl9wYW5lbCA9IG5ldyBKUGFuZWwoKTsKLSAgICAgICAgbWFpbl9wYW5lbC5zZXRCYWNrZ3JvdW5kKENvbG9yLndoaXRlKTsKLSAgICAgICAgbWFpbl9wYW5lbC5zZXRMYXlvdXQobmV3IEJvcmRlckxheW91dCgpKTsKLSAgICAgICAgc2V0Q29udGVudFBhbmUobWFpbl9wYW5lbCk7Ci0gICAgICAgIC8vIENyZWF0ZSB0aGUgbm90ZWJvb2sKLSAgICAgICAgdGFiYmVkX3BhbmUgPSBuZXcgSlRhYmJlZFBhbmUoSlRhYmJlZFBhbmUuVE9QKTsKLSAgICAgICAgbWFpbl9wYW5lbC5hZGQodGFiYmVkX3BhbmUsQm9yZGVyTGF5b3V0LkNFTlRFUik7Ci0gICAgICAgIC8vIEFkZCBub3RlYm9vayBwYWdlIGZvciBkZWZhdWx0IGhvc3QgY29ubmVjdGlvbgotICAgICAgICBwYWdlcyA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgYWRkUGFnZShuZXcgU09BUE1vbml0b3JQYWdlKGdldENvZGVCYXNlKCkuZ2V0SG9zdCgpKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkIGEgcGFnZSB0byB0aGUgbm90ZWJvb2sKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYWRkUGFnZShTT0FQTW9uaXRvclBhZ2UgcGcpIHsKLSAgICAgICAgdGFiYmVkX3BhbmUuYWRkVGFiKCIgICIrcGcuZ2V0SG9zdCgpKyIgICIsIHBnKTsKLSAgICAgICAgcGFnZXMuYWRkRWxlbWVudChwZyk7Ci0gICAgfQotCi0gICAgLyoqIAotICAgICAqIEFwcGxldCBpcyBiZWluZyBkaXNwbGF5ZWQgCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc3RhcnQoKSB7Ci0gICAgICAgIC8vIFRlbGwgYWxsIHBhZ2VzIHRvIHN0YXJ0IHRhbGtpbmcgdG8gdGhlIHNlcnZlcgotICAgICAgICBFbnVtZXJhdGlvbiBlID0gcGFnZXMuZWxlbWVudHMoKTsKLSAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgIFNPQVBNb25pdG9yUGFnZSBwZyA9IChTT0FQTW9uaXRvclBhZ2UpIGUubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgIGlmIChwZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcGcuc3RhcnQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogQXBwbGV0IGlzIG5vIGxvbmdlciBkaXNwbGF5ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdG9wKCkgewotICAgICAgICAvLyBUZWxsIGFsbCBwYWdlcyB0byBzdG9wIHRhbGtpbmcgdG8gdGhlIHNlcnZlcgotICAgICAgICBFbnVtZXJhdGlvbiBlID0gcGFnZXMuZWxlbWVudHMoKTsKLSAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgIFNPQVBNb25pdG9yUGFnZSBwZyA9IChTT0FQTW9uaXRvclBhZ2UpIGUubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgIGlmIChwZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcGcuc3RvcCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXBwbGV0IGNsZWFudXAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkZXN0cm95KCkgewotICAgICAgICB0YWJiZWRfcGFuZSA9IG51bGw7Ci0gICAgICAgIG1haW5fcGFuZWwgPSBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgdGhlIGNvbnRlbnRzIG9mIGEgbm90ZWJvb2sgcGFnZQotICAgICAqIHJlcHJlc2VudGluZyBhIHNlcnZlciBjb25uZWN0aW9uLgotICAgICAqLwotICAgIGNsYXNzIFNPQVBNb25pdG9yUGFnZSBleHRlbmRzIEpQYW5lbCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50cyBSdW5uYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0U2VsZWN0aW9uTGlzdGVuZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uTGlzdGVuZXIgewotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTdGF0dXMgU3RyaW5ncwotICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgU1RBVFVTX0FDVElWRSAgICA9ICJUaGUgU09BUCBNb25pdG9yIGlzIHN0YXJ0ZWQuIjsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgU1RBVFVTX1NUT1BQRUQgICA9ICJUaGUgU09BUCBNb25pdG9yIGlzIHN0b3BwZWQuIjsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgU1RBVFVTX0NMT1NFRCAgICA9ICJUaGUgc2VydmVyIGNvbW11bmljYXRpb24gaGFzIGJlZW4gdGVybWluYXRlZC4iOwotICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBTVEFUVVNfTk9DT05ORUNUID0gIlRoZSBTT0FQIE1vbml0b3IgaXMgdW5hYmxlIHRvIGNvbW11bmNhdGUgd2l0aCB0aGUgc2VydmVyLiI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFByaXZhdGUgZGF0YQotICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgICAgICAgICAgICAgICAgaG9zdCA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgU29ja2V0ICAgICAgICAgICAgICAgIHNvY2tldCA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgT2JqZWN0SW5wdXRTdHJlYW0gICAgIGluID0gbnVsbDsKLSAgICAgICAgcHJpdmF0ZSBPYmplY3RPdXRwdXRTdHJlYW0gICAgb3V0ID0gbnVsbDsKLSAgICAgICAgcHJpdmF0ZSBTT0FQTW9uaXRvclRhYmxlTW9kZWwgbW9kZWwgPSBudWxsOwotICAgICAgICBwcml2YXRlIEpUYWJsZSAgICAgICAgICAgICAgICB0YWJsZSA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgSlNjcm9sbFBhbmUgICAgICAgICAgIHNjcm9sbCA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgSlBhbmVsICAgICAgICAgICAgICAgIGxpc3RfcGFuZWwgPSBudWxsOwotICAgICAgICBwcml2YXRlIEpQYW5lbCAgICAgICAgICAgICAgICBsaXN0X2J1dHRvbnMgPSBudWxsOwotICAgICAgICBwcml2YXRlIEpCdXR0b24gICAgICAgICAgICAgICByZW1vdmVfYnV0dG9uID0gbnVsbDsKLSAgICAgICAgcHJpdmF0ZSBKQnV0dG9uICAgICAgICAgICAgICAgcmVtb3ZlX2FsbF9idXR0b24gPSBudWxsOwotICAgICAgICBwcml2YXRlIEpCdXR0b24gICAgICAgICAgICAgICBmaWx0ZXJfYnV0dG9uID0gbnVsbDsKLSAgICAgICAgcHJpdmF0ZSBKUGFuZWwgICAgICAgICAgICAgICAgZGV0YWlsc19wYW5lbCA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgSlBhbmVsICAgICAgICAgICAgICAgIGRldGFpbHNfaGVhZGVyID0gbnVsbDsKLSAgICAgICAgcHJpdmF0ZSBKU3BsaXRQYW5lICAgICAgICAgICAgZGV0YWlsc19zb2FwID0gbnVsbDsKLSAgICAgICAgcHJpdmF0ZSBKUGFuZWwgICAgICAgICAgICAgICAgZGV0YWlsc19idXR0b25zID0gbnVsbDsKLSAgICAgICAgcHJpdmF0ZSBKTGFiZWwgICAgICAgICAgICAgICAgZGV0YWlsc190aW1lID0gbnVsbDsKLSAgICAgICAgcHJpdmF0ZSBKTGFiZWwgICAgICAgICAgICAgICAgZGV0YWlsc190YXJnZXQgPSBudWxsOwotICAgICAgICBwcml2YXRlIEpMYWJlbCAgICAgICAgICAgICAgICBkZXRhaWxzX3N0YXR1cyA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgSkxhYmVsICAgICAgICAgICAgICAgIGRldGFpbHNfdGltZV92YWx1ZSA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgSkxhYmVsICAgICAgICAgICAgICAgIGRldGFpbHNfdGFyZ2V0X3ZhbHVlID0gbnVsbDsKLSAgICAgICAgcHJpdmF0ZSBKTGFiZWwgICAgICAgICAgICAgICAgZGV0YWlsc19zdGF0dXNfdmFsdWUgPSBudWxsOwotICAgICAgICBwcml2YXRlIEVtcHR5Qm9yZGVyICAgICAgICAgICBlbXB0eV9ib3JkZXIgPSBudWxsOwotICAgICAgICBwcml2YXRlIEV0Y2hlZEJvcmRlciAgICAgICAgICBldGNoZWRfYm9yZGVyID0gbnVsbDsKLSAgICAgICAgcHJpdmF0ZSBKUGFuZWwgICAgICAgICAgICAgICAgcmVxdWVzdF9wYW5lbCA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgSlBhbmVsICAgICAgICAgICAgICAgIHJlc3BvbnNlX3BhbmVsID0gbnVsbDsKLSAgICAgICAgcHJpdmF0ZSBKTGFiZWwgICAgICAgICAgICAgICAgcmVxdWVzdF9sYWJlbCA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgSkxhYmVsICAgICAgICAgICAgICAgIHJlc3BvbnNlX2xhYmVsID0gbnVsbDsKLSAgICAgICAgcHJpdmF0ZSBTT0FQTW9uaXRvclRleHRBcmVhICAgcmVxdWVzdF90ZXh0ID0gbnVsbDsKLSAgICAgICAgcHJpdmF0ZSBTT0FQTW9uaXRvclRleHRBcmVhICAgcmVzcG9uc2VfdGV4dCA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgSlNjcm9sbFBhbmUgICAgICAgICAgIHJlcXVlc3Rfc2Nyb2xsID0gbnVsbDsKLSAgICAgICAgcHJpdmF0ZSBKU2Nyb2xsUGFuZSAgICAgICAgICAgcmVzcG9uc2Vfc2Nyb2xsID0gbnVsbDsKLSAgICAgICAgcHJpdmF0ZSBKQnV0dG9uICAgICAgICAgICAgICAgbGF5b3V0X2J1dHRvbiA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgSlNwbGl0UGFuZSAgICAgICAgICAgIHNwbGl0ID0gbnVsbDsKLSAgICAgICAgcHJpdmF0ZSBKUGFuZWwgICAgICAgICAgICAgICAgc3RhdHVzX2FyZWEgPSBudWxsOwotICAgICAgICBwcml2YXRlIEpQYW5lbCAgICAgICAgICAgICAgICBzdGF0dXNfYnV0dG9ucyA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgSkJ1dHRvbiAgICAgICAgICAgICAgIHN0YXJ0X2J1dHRvbiA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgSkJ1dHRvbiAgICAgICAgICAgICAgIHN0b3BfYnV0dG9uID0gbnVsbDsKLSAgICAgICAgcHJpdmF0ZSBKTGFiZWwgICAgICAgICAgICAgICAgc3RhdHVzX3RleHQgPSBudWxsOwotICAgICAgICBwcml2YXRlIEpQYW5lbCAgICAgICAgICAgICAgICBzdGF0dXNfdGV4dF9wYW5lbCA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgU09BUE1vbml0b3JGaWx0ZXIgICAgIGZpbHRlciA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgR3JpZEJhZ0xheW91dCAgICAgICAgIGRldGFpbHNfaGVhZGVyX2xheW91dCA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgR3JpZEJhZ0NvbnN0cmFpbnRzICAgIGRldGFpbHNfaGVhZGVyX2NvbnN0cmFpbnRzID0gbnVsbDsKLSAgICAgICAgcHJpdmF0ZSBKQ2hlY2tCb3ggICAgICAgICAgICAgcmVmbG93X3htbCA9IG51bGw7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENvbnN0cnVjdG9yIChjcmVhdGUgYW5kIGxheW91dCBwYWdlKQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFNPQVBNb25pdG9yUGFnZShTdHJpbmcgaG9zdF9uYW1lKSB7Ci0gICAgICAgICAgICBob3N0ID0gaG9zdF9uYW1lOwotICAgICAgICAgICAgLy8gU2V0IHVwIGRlZmF1bHQgZmlsdGVyIChzaG93IGFsbCBtZXNzYWdlcykKLSAgICAgICAgICAgIGZpbHRlciA9IG5ldyBTT0FQTW9uaXRvckZpbHRlcigpOwotICAgICAgICAgICAgLy8gVXNlIGJvcmRlcnMgdG8gaGVscCBpbXByb3ZlIGFwcGVhcmFuY2UKLSAgICAgICAgICAgIGV0Y2hlZF9ib3JkZXIgPSBuZXcgRXRjaGVkQm9yZGVyKCk7Ci0gICAgICAgICAgICAvLyBCdWlsZCB0b3AgcG9ydGlvbiBvZiBzcGxpdCAobGlzdCBwYW5lbCkgCi0gICAgICAgICAgICBtb2RlbCA9IG5ldyBTT0FQTW9uaXRvclRhYmxlTW9kZWwoKTsKLSAgICAgICAgICAgIHRhYmxlID0gbmV3IEpUYWJsZShtb2RlbCk7Ci0gICAgICAgICAgICB0YWJsZS5zZXRTZWxlY3Rpb25Nb2RlKExpc3RTZWxlY3Rpb25Nb2RlbC5TSU5HTEVfU0VMRUNUSU9OKTsKLSAgICAgICAgICAgIHRhYmxlLnNldFJvd1NlbGVjdGlvbkludGVydmFsKDAsMCk7Ci0gICAgICAgICAgICB0YWJsZS5zZXRQcmVmZXJyZWRTY3JvbGxhYmxlVmlld3BvcnRTaXplKG5ldyBEaW1lbnNpb24oNjAwLCA5NikpOwotICAgICAgICAgICAgdGFibGUuZ2V0U2VsZWN0aW9uTW9kZWwoKS5hZGRMaXN0U2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgICAgICBzY3JvbGwgPSBuZXcgSlNjcm9sbFBhbmUodGFibGUpOwotICAgICAgICAgICAgcmVtb3ZlX2J1dHRvbiA9IG5ldyBKQnV0dG9uKCJSZW1vdmUiKTsKLSAgICAgICAgICAgIHJlbW92ZV9idXR0b24uYWRkQWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgICAgICByZW1vdmVfYnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgcmVtb3ZlX2FsbF9idXR0b24gPSBuZXcgSkJ1dHRvbigiUmVtb3ZlIEFsbCIpOwotICAgICAgICAgICAgcmVtb3ZlX2FsbF9idXR0b24uYWRkQWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgICAgICBmaWx0ZXJfYnV0dG9uID0gbmV3IEpCdXR0b24oIkZpbHRlciAuLi4iKTsKLSAgICAgICAgICAgIGZpbHRlcl9idXR0b24uYWRkQWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgICAgICBsaXN0X2J1dHRvbnMgPSBuZXcgSlBhbmVsKCk7Ci0gICAgICAgICAgICBsaXN0X2J1dHRvbnMuc2V0TGF5b3V0KG5ldyBGbG93TGF5b3V0KCkpOwotICAgICAgICAgICAgbGlzdF9idXR0b25zLmFkZChyZW1vdmVfYnV0dG9uKTsKLSAgICAgICAgICAgIGxpc3RfYnV0dG9ucy5hZGQocmVtb3ZlX2FsbF9idXR0b24pOwotICAgICAgICAgICAgbGlzdF9idXR0b25zLmFkZChmaWx0ZXJfYnV0dG9uKTsKLSAgICAgICAgICAgIGxpc3RfcGFuZWwgPSBuZXcgSlBhbmVsKCk7Ci0gICAgICAgICAgICBsaXN0X3BhbmVsLnNldExheW91dChuZXcgQm9yZGVyTGF5b3V0KCkpOwotICAgICAgICAgICAgbGlzdF9wYW5lbC5hZGQoc2Nyb2xsLEJvcmRlckxheW91dC5DRU5URVIpOwotICAgICAgICAgICAgbGlzdF9wYW5lbC5hZGQobGlzdF9idXR0b25zLCBCb3JkZXJMYXlvdXQuU09VVEgpOwotICAgICAgICAgICAgbGlzdF9wYW5lbC5zZXRCb3JkZXIoZW1wdHlfYm9yZGVyKTsKLSAgICAgICAgICAgIC8vIEJ1aWxkIGJvdHRvbSBwb3J0aW9uIG9mIHNwbGl0IChtZXNzYWdlIGRldGFpbHMpIAotICAgICAgICAgICAgZGV0YWlsc190aW1lID0gbmV3IEpMYWJlbCgiVGltZTogIiwgU3dpbmdDb25zdGFudHMuUklHSFQpOwotICAgICAgICAgICAgZGV0YWlsc190YXJnZXQgPSBuZXcgSkxhYmVsKCJUYXJnZXQgU2VydmljZTogIiwgU3dpbmdDb25zdGFudHMuUklHSFQpOwotICAgICAgICAgICAgZGV0YWlsc19zdGF0dXMgPSBuZXcgSkxhYmVsKCJTdGF0dXM6ICIsIFN3aW5nQ29uc3RhbnRzLlJJR0hUKTsKLSAgICAgICAgICAgIGRldGFpbHNfdGltZV92YWx1ZSA9IG5ldyBKTGFiZWwoKTsKLSAgICAgICAgICAgIGRldGFpbHNfdGFyZ2V0X3ZhbHVlID0gbmV3IEpMYWJlbCgpOwotICAgICAgICAgICAgZGV0YWlsc19zdGF0dXNfdmFsdWUgPSBuZXcgSkxhYmVsKCk7Ci0gICAgICAgICAgICBEaW1lbnNpb24gcHJlZmVycmVkX3NpemUgPSBkZXRhaWxzX3RpbWUuZ2V0UHJlZmVycmVkU2l6ZSgpOwotICAgICAgICAgICAgcHJlZmVycmVkX3NpemUud2lkdGggPSAxOwotICAgICAgICAgICAgZGV0YWlsc190aW1lLnNldFByZWZlcnJlZFNpemUocHJlZmVycmVkX3NpemUpOyAKLSAgICAgICAgICAgIGRldGFpbHNfdGFyZ2V0LnNldFByZWZlcnJlZFNpemUocHJlZmVycmVkX3NpemUpOyAKLSAgICAgICAgICAgIGRldGFpbHNfc3RhdHVzLnNldFByZWZlcnJlZFNpemUocHJlZmVycmVkX3NpemUpOyAKLSAgICAgICAgICAgIGRldGFpbHNfdGltZV92YWx1ZS5zZXRQcmVmZXJyZWRTaXplKHByZWZlcnJlZF9zaXplKTsgCi0gICAgICAgICAgICBkZXRhaWxzX3RhcmdldF92YWx1ZS5zZXRQcmVmZXJyZWRTaXplKHByZWZlcnJlZF9zaXplKTsgCi0gICAgICAgICAgICBkZXRhaWxzX3N0YXR1c192YWx1ZS5zZXRQcmVmZXJyZWRTaXplKHByZWZlcnJlZF9zaXplKTsKLSAgICAgICAgICAgIGRldGFpbHNfaGVhZGVyID0gbmV3IEpQYW5lbCgpOwotICAgICAgICAgICAgZGV0YWlsc19oZWFkZXJfbGF5b3V0ID0gbmV3IEdyaWRCYWdMYXlvdXQoKTsKLSAgICAgICAgICAgIGRldGFpbHNfaGVhZGVyLnNldExheW91dChkZXRhaWxzX2hlYWRlcl9sYXlvdXQpOwotICAgICAgICAgICAgZGV0YWlsc19oZWFkZXJfY29uc3RyYWludHMgPSBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKCk7Ci0gICAgICAgICAgICBkZXRhaWxzX2hlYWRlcl9jb25zdHJhaW50cy5maWxsPUdyaWRCYWdDb25zdHJhaW50cy5CT1RIOwotICAgICAgICAgICAgZGV0YWlsc19oZWFkZXJfY29uc3RyYWludHMud2VpZ2h0eD0wLjU7Ci0gICAgICAgICAgICBkZXRhaWxzX2hlYWRlcl9sYXlvdXQuc2V0Q29uc3RyYWludHMoZGV0YWlsc190aW1lLGRldGFpbHNfaGVhZGVyX2NvbnN0cmFpbnRzKTsKLSAgICAgICAgICAgIGRldGFpbHNfaGVhZGVyLmFkZChkZXRhaWxzX3RpbWUpOwotICAgICAgICAgICAgZGV0YWlsc19oZWFkZXJfbGF5b3V0LnNldENvbnN0cmFpbnRzKGRldGFpbHNfdGltZV92YWx1ZSxkZXRhaWxzX2hlYWRlcl9jb25zdHJhaW50cyk7Ci0gICAgICAgICAgICBkZXRhaWxzX2hlYWRlci5hZGQoZGV0YWlsc190aW1lX3ZhbHVlKTsKLSAgICAgICAgICAgIGRldGFpbHNfaGVhZGVyX2xheW91dC5zZXRDb25zdHJhaW50cyhkZXRhaWxzX3RhcmdldCxkZXRhaWxzX2hlYWRlcl9jb25zdHJhaW50cyk7Ci0gICAgICAgICAgICBkZXRhaWxzX2hlYWRlci5hZGQoZGV0YWlsc190YXJnZXQpOwotICAgICAgICAgICAgZGV0YWlsc19oZWFkZXJfY29uc3RyYWludHMud2VpZ2h0eD0xLjA7Ci0gICAgICAgICAgICBkZXRhaWxzX2hlYWRlcl9sYXlvdXQuc2V0Q29uc3RyYWludHMoZGV0YWlsc190YXJnZXRfdmFsdWUsZGV0YWlsc19oZWFkZXJfY29uc3RyYWludHMpOwotICAgICAgICAgICAgZGV0YWlsc19oZWFkZXIuYWRkKGRldGFpbHNfdGFyZ2V0X3ZhbHVlKTsKLSAgICAgICAgICAgIGRldGFpbHNfaGVhZGVyX2NvbnN0cmFpbnRzLndlaWdodHg9LjU7Ci0gICAgICAgICAgICBkZXRhaWxzX2hlYWRlcl9sYXlvdXQuc2V0Q29uc3RyYWludHMoZGV0YWlsc19zdGF0dXMsZGV0YWlsc19oZWFkZXJfY29uc3RyYWludHMpOwotICAgICAgICAgICAgZGV0YWlsc19oZWFkZXIuYWRkKGRldGFpbHNfc3RhdHVzKTsKLSAgICAgICAgICAgIGRldGFpbHNfaGVhZGVyX2xheW91dC5zZXRDb25zdHJhaW50cyhkZXRhaWxzX3N0YXR1c192YWx1ZSxkZXRhaWxzX2hlYWRlcl9jb25zdHJhaW50cyk7Ci0gICAgICAgICAgICBkZXRhaWxzX2hlYWRlci5hZGQoZGV0YWlsc19zdGF0dXNfdmFsdWUpOwotICAgICAgICAgICAgZGV0YWlsc19oZWFkZXIuc2V0Qm9yZGVyKGV0Y2hlZF9ib3JkZXIpOwotICAgICAgICAgICAgcmVxdWVzdF9sYWJlbCA9IG5ldyBKTGFiZWwoIlNPQVAgUmVxdWVzdCIsIFN3aW5nQ29uc3RhbnRzLkNFTlRFUik7Ci0gICAgICAgICAgICByZXF1ZXN0X3RleHQgPSBuZXcgU09BUE1vbml0b3JUZXh0QXJlYSgpOwotICAgICAgICAgICAgcmVxdWVzdF90ZXh0LnNldEVkaXRhYmxlKGZhbHNlKTsKLSAgICAgICAgICAgIHJlcXVlc3Rfc2Nyb2xsID0gbmV3IEpTY3JvbGxQYW5lKHJlcXVlc3RfdGV4dCk7Ci0gICAgICAgICAgICByZXF1ZXN0X3BhbmVsID0gbmV3IEpQYW5lbCgpOwotICAgICAgICAgICAgcmVxdWVzdF9wYW5lbC5zZXRMYXlvdXQobmV3IEJvcmRlckxheW91dCgpKTsKLSAgICAgICAgICAgIHJlcXVlc3RfcGFuZWwuYWRkKHJlcXVlc3RfbGFiZWwsIEJvcmRlckxheW91dC5OT1JUSCk7Ci0gICAgICAgICAgICByZXF1ZXN0X3BhbmVsLmFkZChyZXF1ZXN0X3Njcm9sbCwgQm9yZGVyTGF5b3V0LkNFTlRFUik7Ci0gICAgICAgICAgICByZXNwb25zZV9sYWJlbCA9IG5ldyBKTGFiZWwoIlNPQVAgUmVzcG9uc2UiLCBTd2luZ0NvbnN0YW50cy5DRU5URVIpOwotICAgICAgICAgICAgcmVzcG9uc2VfdGV4dCA9IG5ldyBTT0FQTW9uaXRvclRleHRBcmVhKCk7Ci0gICAgICAgICAgICByZXNwb25zZV90ZXh0LnNldEVkaXRhYmxlKGZhbHNlKTsKLSAgICAgICAgICAgIHJlc3BvbnNlX3Njcm9sbCA9IG5ldyBKU2Nyb2xsUGFuZShyZXNwb25zZV90ZXh0KTsKLSAgICAgICAgICAgIHJlc3BvbnNlX3BhbmVsID0gbmV3IEpQYW5lbCgpOwotICAgICAgICAgICAgcmVzcG9uc2VfcGFuZWwuc2V0TGF5b3V0KG5ldyBCb3JkZXJMYXlvdXQoKSk7Ci0gICAgICAgICAgICByZXNwb25zZV9wYW5lbC5hZGQocmVzcG9uc2VfbGFiZWwsIEJvcmRlckxheW91dC5OT1JUSCk7Ci0gICAgICAgICAgICByZXNwb25zZV9wYW5lbC5hZGQocmVzcG9uc2Vfc2Nyb2xsLCBCb3JkZXJMYXlvdXQuQ0VOVEVSKTsKLSAgICAgICAgICAgIGRldGFpbHNfc29hcCA9IG5ldyBKU3BsaXRQYW5lKEpTcGxpdFBhbmUuSE9SSVpPTlRBTF9TUExJVCk7Ci0gICAgICAgICAgICBkZXRhaWxzX3NvYXAuc2V0VG9wQ29tcG9uZW50KHJlcXVlc3RfcGFuZWwpOwotICAgICAgICAgICAgZGV0YWlsc19zb2FwLnNldFJpZ2h0Q29tcG9uZW50KHJlc3BvbnNlX3BhbmVsKTsKLSAgICAgICAgICAgIGRldGFpbHNfc29hcC5zZXRSZXNpemVXZWlnaHQoLjUpOwotICAgICAgICAgICAgZGV0YWlsc19wYW5lbCA9IG5ldyBKUGFuZWwoKTsKLSAgICAgICAgICAgIGxheW91dF9idXR0b24gPSBuZXcgSkJ1dHRvbigiU3dpdGNoIExheW91dCIpOwotICAgICAgICAgICAgbGF5b3V0X2J1dHRvbi5hZGRBY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgICAgIHJlZmxvd194bWwgPSBuZXcgSkNoZWNrQm94KCJSZWZsb3cgWE1MIHRleHQiKTsKLSAgICAgICAgICAgIHJlZmxvd194bWwuYWRkQWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgICAgICBkZXRhaWxzX2J1dHRvbnMgPSBuZXcgSlBhbmVsKCk7Ci0gICAgICAgICAgICBkZXRhaWxzX2J1dHRvbnMuc2V0TGF5b3V0KG5ldyBGbG93TGF5b3V0KCkpOwotICAgICAgICAgICAgZGV0YWlsc19idXR0b25zLmFkZChyZWZsb3dfeG1sKTsKLSAgICAgICAgICAgIGRldGFpbHNfYnV0dG9ucy5hZGQobGF5b3V0X2J1dHRvbik7Ci0gICAgICAgICAgICBkZXRhaWxzX3BhbmVsLnNldExheW91dChuZXcgQm9yZGVyTGF5b3V0KCkpOwotICAgICAgICAgICAgZGV0YWlsc19wYW5lbC5hZGQoZGV0YWlsc19oZWFkZXIsQm9yZGVyTGF5b3V0Lk5PUlRIKTsKLSAgICAgICAgICAgIGRldGFpbHNfcGFuZWwuYWRkKGRldGFpbHNfc29hcCxCb3JkZXJMYXlvdXQuQ0VOVEVSKTsKLSAgICAgICAgICAgIGRldGFpbHNfcGFuZWwuYWRkKGRldGFpbHNfYnV0dG9ucyxCb3JkZXJMYXlvdXQuU09VVEgpOwotICAgICAgICAgICAgZGV0YWlsc19wYW5lbC5zZXRCb3JkZXIoZW1wdHlfYm9yZGVyKTsKLSAgICAgICAgICAgIC8vIEFkZCB0aGUgdHdvIHBhcnRzIHRvIHRoZSBhZ2Ugc3BsaXQgcGFuZQotICAgICAgICAgICAgc3BsaXQgPSBuZXcgSlNwbGl0UGFuZShKU3BsaXRQYW5lLlZFUlRJQ0FMX1NQTElUKTsKLSAgICAgICAgICAgIHNwbGl0LnNldFRvcENvbXBvbmVudChsaXN0X3BhbmVsKTsKLSAgICAgICAgICAgIHNwbGl0LnNldFJpZ2h0Q29tcG9uZW50KGRldGFpbHNfcGFuZWwpOwotICAgICAgICAgICAgLy8gQnVpbGQgc3RhdHVzIGFyZWEKLSAgICAgICAgICAgIHN0YXJ0X2J1dHRvbiA9IG5ldyBKQnV0dG9uKCJTdGFydCIpOwotICAgICAgICAgICAgc3RhcnRfYnV0dG9uLmFkZEFjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgICAgICAgICAgc3RvcF9idXR0b24gPSBuZXcgSkJ1dHRvbigiU3RvcCIpOwotICAgICAgICAgICAgc3RvcF9idXR0b24uYWRkQWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgICAgICBzdGF0dXNfYnV0dG9ucyA9IG5ldyBKUGFuZWwoKTsKLSAgICAgICAgICAgIHN0YXR1c19idXR0b25zLnNldExheW91dChuZXcgRmxvd0xheW91dCgpKTsKLSAgICAgICAgICAgIHN0YXR1c19idXR0b25zLmFkZChzdGFydF9idXR0b24pOwotICAgICAgICAgICAgc3RhdHVzX2J1dHRvbnMuYWRkKHN0b3BfYnV0dG9uKTsKLSAgICAgICAgICAgIHN0YXR1c190ZXh0ID0gbmV3IEpMYWJlbCgpOwotICAgICAgICAgICAgc3RhdHVzX3RleHQuc2V0Qm9yZGVyKG5ldyBCZXZlbEJvcmRlcihCZXZlbEJvcmRlci5MT1dFUkVEKSk7Ci0gICAgICAgICAgICBzdGF0dXNfdGV4dF9wYW5lbCA9IG5ldyBKUGFuZWwoKTsKLSAgICAgICAgICAgIHN0YXR1c190ZXh0X3BhbmVsLnNldExheW91dChuZXcgQm9yZGVyTGF5b3V0KCkpOwotICAgICAgICAgICAgc3RhdHVzX3RleHRfcGFuZWwuYWRkKHN0YXR1c190ZXh0LCBCb3JkZXJMYXlvdXQuQ0VOVEVSKTsKLSAgICAgICAgICAgIHN0YXR1c190ZXh0X3BhbmVsLnNldEJvcmRlcihlbXB0eV9ib3JkZXIpOwotICAgICAgICAgICAgc3RhdHVzX2FyZWEgPSBuZXcgSlBhbmVsKCk7Ci0gICAgICAgICAgICBzdGF0dXNfYXJlYS5zZXRMYXlvdXQobmV3IEJvcmRlckxheW91dCgpKTsKLSAgICAgICAgICAgIHN0YXR1c19hcmVhLmFkZChzdGF0dXNfYnV0dG9ucywgQm9yZGVyTGF5b3V0LldFU1QpOwotICAgICAgICAgICAgc3RhdHVzX2FyZWEuYWRkKHN0YXR1c190ZXh0X3BhbmVsLCBCb3JkZXJMYXlvdXQuQ0VOVEVSKTsKLSAgICAgICAgICAgIHN0YXR1c19hcmVhLnNldEJvcmRlcihldGNoZWRfYm9yZGVyKTsKLSAgICAgICAgICAgIC8vIEFkZCB0aGUgc3BsaXQgYW5kIHN0YXR1cyBhcmVhIHRvIHBhZ2UKLSAgICAgICAgICAgIHNldExheW91dChuZXcgQm9yZGVyTGF5b3V0KCkpOwotICAgICAgICAgICAgYWRkKHNwbGl0LCBCb3JkZXJMYXlvdXQuQ0VOVEVSKTsKLSAgICAgICAgICAgIGFkZChzdGF0dXNfYXJlYSwgQm9yZGVyTGF5b3V0LlNPVVRIKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXQgdGhlIG5hbWUgb2YgdGhlIGhvc3Qgd2UgYXJlIGRpc3BsYXlpbmcKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0SG9zdCgpIHsKLSAgICAgICAgICAgIHJldHVybiBob3N0OwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldCB0aGUgc3RhdHVzIHRleHQKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFN0YXR1cyhTdHJpbmcgdHh0KSB7Ci0gICAgICAgICAgICBzdGF0dXNfdGV4dC5zZXRGb3JlZ3JvdW5kKENvbG9yLmJsYWNrKTsKLSAgICAgICAgICAgIHN0YXR1c190ZXh0LnNldFRleHQoIiAgIit0eHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldCB0aGUgc3RhdHVzIHRleHQgdG8gYW4gZXJyb3IKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldEVycm9yU3RhdHVzKFN0cmluZyB0eHQpIHsKLSAgICAgICAgICAgIHN0YXR1c190ZXh0LnNldEZvcmVncm91bmQoQ29sb3IucmVkKTsKLSAgICAgICAgICAgIHN0YXR1c190ZXh0LnNldFRleHQoIiAgIit0eHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFN0YXJ0IHRhbGtpbmcgdG8gdGhlIHNlcnZlcgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgc3RhcnQoKSB7Ci0gICAgICAgICAgICBTdHJpbmcgY29kZWhvc3QgPSBnZXRDb2RlQmFzZSgpLmdldEhvc3QoKTsKLSAgICAgICAgICAgIGlmIChzb2NrZXQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIE9wZW4gdGhlIHNvY2tldCB0byB0aGUgc2VydmVyCi0gICAgICAgICAgICAgICAgICAgIHNvY2tldCA9IG5ldyBTb2NrZXQoY29kZWhvc3QsIHBvcnQpOwotICAgICAgICAgICAgICAgICAgICAvLyBDcmVhdGUgb3V0cHV0IHN0cmVhbQotICAgICAgICAgICAgICAgICAgICBvdXQgPSBuZXcgT2JqZWN0T3V0cHV0U3RyZWFtKHNvY2tldC5nZXRPdXRwdXRTdHJlYW0oKSk7Ci0gICAgICAgICAgICAgICAgICAgIG91dC5mbHVzaCgpOwotICAgICAgICAgICAgICAgICAgICAvLyBDcmVhdGUgaW5wdXQgc3RyZWFtIGFuZCBzdGFydCBiYWNrZ3JvdW5kCi0gICAgICAgICAgICAgICAgICAgIC8vIHRocmVhZCB0byByZWFkIGRhdGEgZnJvbSB0aGUgc2VydmVyCi0gICAgICAgICAgICAgICAgICAgIGluID0gbmV3IE9iamVjdElucHV0U3RyZWFtKHNvY2tldC5nZXRJbnB1dFN0cmVhbSgpKTsKLSAgICAgICAgICAgICAgICAgICAgbmV3IFRocmVhZCh0aGlzKS5zdGFydCgpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEV4Y2VwdGlvbnMgaGVyZSBhcmUgdW5leHBlY3RlZCwgYnV0IHdlIGNhbid0Ci0gICAgICAgICAgICAgICAgICAgIC8vIHJlYWxseSBkbyBhbnl0aGluZyAoc28ganVzdCB3cml0ZSBpdCB0byBzdGRvdXQKLSAgICAgICAgICAgICAgICAgICAgLy8gaW4gY2FzZSBzb21lb25lIGNhcmVzIGFuZCB0aGVuIGlnbm9yZSBpdCkKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFeGNlcHRpb24hICIrZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgc2V0RXJyb3JTdGF0dXMoU1RBVFVTX05PQ09OTkVDVCk7Ci0gICAgICAgICAgICAgICAgICAgIHNvY2tldCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBBbHJlYWR5IHN0YXJ0ZWQKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzb2NrZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgcmlnaHQgYnV0dG9ucyBhcmUgZW5hYmxlZAotICAgICAgICAgICAgICAgIHN0YXJ0X2J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICBzdG9wX2J1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgICAgIHNldFN0YXR1cyhTVEFUVVNfQUNUSVZFKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTdG9wIHRhbGtpbmcgdG8gdGhlIHNlcnZlcgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgc3RvcCgpIHsKLSAgICAgICAgICAgIGlmIChzb2NrZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIENsb3NlIGFsbCB0aGUgc3RyZWFtcyBhbmQgc29ja2V0Ci0gICAgICAgICAgICAgICAgaWYgKG91dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXQuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgb3V0ID0gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGluICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGluID0gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHNvY2tldCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzb2NrZXQuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc29ja2V0ID0gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIEFscmVhZHkgc3RvcHBlZAotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSByaWdodCBidXR0b25zIGFyZSBlbmFibGVkCi0gICAgICAgICAgICBzdGFydF9idXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgIHN0b3BfYnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgc2V0U3RhdHVzKFNUQVRVU19TVE9QUEVEKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBCYWNrZ3JvdW5kIHRocmVhZCB1c2VkIHRvIHJlY2VpdmUgZGF0YSBmcm9tCi0gICAgICAgICAqIHRoZSBzZXJ2ZXIuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICBMb25nICAgICAgICAgICAgaWQ7Ci0gICAgICAgICAgICBJbnRlZ2VyICAgICAgICAgbWVzc2FnZV90eXBlOwotICAgICAgICAgICAgU3RyaW5nICAgICAgICAgIHRhcmdldDsKLSAgICAgICAgICAgIFN0cmluZyAgICAgICAgICBzb2FwOwotICAgICAgICAgICAgU09BUE1vbml0b3JEYXRhIGRhdGE7Ci0gICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VsZWN0ZWQ7Ci0gICAgICAgICAgICBpbnQgICAgICAgICAgICAgcm93OwotICAgICAgICAgICAgYm9vbGVhbiAgICAgICAgIHVwZGF0ZV9uZWVkZWQ7Ci0gICAgICAgICAgICB3aGlsZSAoc29ja2V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIGRhdGEgZnJvbSB0aGUgc2VydmVyCi0gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VfdHlwZSA9IChJbnRlZ2VyKSBpbi5yZWFkT2JqZWN0KCk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFByb2Nlc3MgdGhlIGRhdGEgZGVwZW5kaW5nIG9uIGl0cyB0eXBlCi0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobWVzc2FnZV90eXBlLmludFZhbHVlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU09BUE1vbml0b3JDb25zdGFudHMuU09BUF9NT05JVE9SX1JFUVVFU1Q6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBpZCwgdGFyZ2V0IGFuZCBzb2FwIGluZm8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCA9IChMb25nKSBpbi5yZWFkT2JqZWN0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gKFN0cmluZykgaW4ucmVhZE9iamVjdCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvYXAgPSAoU3RyaW5nKSBpbi5yZWFkT2JqZWN0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWRkIG5ldyByZXF1ZXN0IGRhdGEgdG8gdGhlIHRhYmxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IG5ldyBTT0FQTW9uaXRvckRhdGEoaWQsdGFyZ2V0LHNvYXApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLmFkZERhdGEoZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgIm1vc3QgcmVjZW50IiBzZWxlY3RlZCB0aGVuIHVwZGF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBkZXRhaWxzIGFyZWEgaWYgbmVlZGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWQgPSB0YWJsZS5nZXRTZWxlY3RlZFJvdygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoc2VsZWN0ZWQgPT0gMCkgJiYgbW9kZWwuZmlsdGVyTWF0Y2goZGF0YSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVDaGFuZ2VkKG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU09BUE1vbml0b3JDb25zdGFudHMuU09BUF9NT05JVE9SX1JFU1BPTlNFOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgaWQgYW5kIHNvYXAgaW5mbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkID0gKExvbmcpIGluLnJlYWRPYmplY3QoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2FwID0gKFN0cmluZykgaW4ucmVhZE9iamVjdCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBtb2RlbC5maW5kRGF0YShpZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVfbmVlZGVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgc2VsZWN0ZWQgcm93Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkID0gdGFibGUuZ2V0U2VsZWN0ZWRSb3coKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgIm1vc3QgcmVjZW50IiwgdGhlbiBhbHdheXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlIGRldGFpbHMgYXJlYQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWQgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlX25lZWRlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGRhdGEgYmVpbmcgdXBkYXRlZCBpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZWxlY3RlZCB0aGVuIHVwZGF0ZSBkZXRhaWxzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdyA9IG1vZGVsLmZpbmRSb3coZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocm93ICE9IC0xKSAmJiAocm93ID09IHNlbGVjdGVkKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlX25lZWRlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2V0IHRoZSByZXNwb25zZSBhbmQgdXBkYXRlIHRhYmxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuc2V0U09BUFJlc3BvbnNlKHNvYXApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC51cGRhdGVEYXRhKGRhdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZWZyZXNoIGRldGFpbHMgYXJlYSAoaWYgbmVlZGVkKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodXBkYXRlX25lZWRlZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVDaGFuZ2VkKG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAvLyBFeGNlcHRpb25zIGFyZSBleHBlY3RlZCBoZXJlIHdoZW4gdGhlCi0gICAgICAgICAgICAgICAgICAgIC8vIHNlcnZlciBjb21tdW5pY2F0aW9uIGhhcyBiZWVuIHRlcm1pbmF0ZWQuCi0gICAgICAgICAgICAgICAgICAgIGlmIChzdG9wX2J1dHRvbi5pc0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RvcCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2V0RXJyb3JTdGF0dXMoU1RBVFVTX0NMT1NFRCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogTGlzdGVuZXIgdG8gaGFuZGxlIHRhYmxlIHNlbGVjdGlvbiBjaGFuZ2VzCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCB2YWx1ZUNoYW5nZWQoTGlzdFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgIGludCByb3cgPSB0YWJsZS5nZXRTZWxlY3RlZFJvdygpOwotICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhleSBzZWxlY3RlZCBhIHNwZWNpZmljIHJvdwotICAgICAgICAgICAgaWYgKHJvdyA+IDApIHsKLSAgICAgICAgICAgICAgICByZW1vdmVfYnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJlbW92ZV9idXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBDaGVjayBmb3IgIm1vc3QgcmVjZW50IiBzZWxlY3Rpb24KLSAgICAgICAgICAgIGlmIChyb3cgPT0gMCkgewotICAgICAgICAgICAgICAgIHJvdyA9IG1vZGVsLmdldFJvd0NvdW50KCkgLSAxOwotICAgICAgICAgICAgICAgIGlmIChyb3cgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICByb3cgPSAtMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocm93ID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgLy8gQ2xlYXIgdGhlIGRldGFpbHMgcGFuZWwKLSAgICAgICAgICAgICAgICBkZXRhaWxzX3RpbWVfdmFsdWUuc2V0VGV4dCgiIik7Ci0gICAgICAgICAgICAgICAgZGV0YWlsc190YXJnZXRfdmFsdWUuc2V0VGV4dCgiIik7Ci0gICAgICAgICAgICAgICAgZGV0YWlsc19zdGF0dXNfdmFsdWUuc2V0VGV4dCgiIik7Ci0gICAgICAgICAgICAgICAgcmVxdWVzdF90ZXh0LnNldFRleHQoIiIpOwotICAgICAgICAgICAgICAgIHJlc3BvbnNlX3RleHQuc2V0VGV4dCgiIik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIFNob3cgdGhlIGRldGFpbHMgZm9yIHRoZSByb3cKLSAgICAgICAgICAgICAgICBTT0FQTW9uaXRvckRhdGEgc29hcCA9IG1vZGVsLmdldERhdGEocm93KTsKLSAgICAgICAgICAgICAgICBkZXRhaWxzX3RpbWVfdmFsdWUuc2V0VGV4dChzb2FwLmdldFRpbWUoKSk7Ci0gICAgICAgICAgICAgICAgZGV0YWlsc190YXJnZXRfdmFsdWUuc2V0VGV4dChzb2FwLmdldFRhcmdldFNlcnZpY2UoKSk7Ci0gICAgICAgICAgICAgICAgZGV0YWlsc19zdGF0dXNfdmFsdWUuc2V0VGV4dChzb2FwLmdldFN0YXR1cygpKTsKLSAgICAgICAgICAgICAgICBpZiAoc29hcC5nZXRTT0FQUmVxdWVzdCgpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVxdWVzdF90ZXh0LnNldFRleHQoIiIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RfdGV4dC5zZXRUZXh0KHNvYXAuZ2V0U09BUFJlcXVlc3QoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RfdGV4dC5zZXRDYXJldFBvc2l0aW9uKDApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoc29hcC5nZXRTT0FQUmVzcG9uc2UoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlX3RleHQuc2V0VGV4dCgiIik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VfdGV4dC5zZXRUZXh0KHNvYXAuZ2V0U09BUFJlc3BvbnNlKCkpOwotICAgICAgICAgICAgICAgICAgICByZXNwb25zZV90ZXh0LnNldENhcmV0UG9zaXRpb24oMCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIExpc3RlbmVyIHRvIGhhbmRsZSBidXR0b24gYWN0aW9ucwotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSB1c2VyIHByZXNzZWQgdGhlIHJlbW92ZSBidXR0b24KLSAgICAgICAgICAgIGlmIChlLmdldFNvdXJjZSgpID09IHJlbW92ZV9idXR0b24pIHsKLSAgICAgICAgICAgICAgICBpbnQgcm93ID0gdGFibGUuZ2V0U2VsZWN0ZWRSb3coKTsKLSAgICAgICAgICAgICAgICBtb2RlbC5yZW1vdmVSb3cocm93KTsKLSAgICAgICAgICAgICAgICB0YWJsZS5jbGVhclNlbGVjdGlvbigpOwotICAgICAgICAgICAgICAgIHRhYmxlLnJlcGFpbnQoKTsKLSAgICAgICAgICAgICAgICB2YWx1ZUNoYW5nZWQobnVsbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgdXNlciBwcmVzc2VkIHRoZSByZW1vdmUgYWxsIGJ1dHRvbgotICAgICAgICAgICAgaWYgKGUuZ2V0U291cmNlKCkgPT0gcmVtb3ZlX2FsbF9idXR0b24pIHsKLSAgICAgICAgICAgICAgICBtb2RlbC5jbGVhckFsbCgpOwotICAgICAgICAgICAgICAgIHRhYmxlLnNldFJvd1NlbGVjdGlvbkludGVydmFsKDAsMCk7Ci0gICAgICAgICAgICAgICAgdGFibGUucmVwYWludCgpOwotICAgICAgICAgICAgICAgIHZhbHVlQ2hhbmdlZChudWxsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSB1c2VyIHByZXNzZWQgdGhlIGZpbHRlciBidXR0b24KLSAgICAgICAgICAgIGlmIChlLmdldFNvdXJjZSgpID09IGZpbHRlcl9idXR0b24pIHsKLSAgICAgICAgICAgICAgICBmaWx0ZXIuc2hvd0RpYWxvZygpOwotICAgICAgICAgICAgICAgIGlmIChmaWx0ZXIub2tQcmVzc2VkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBkaXNwbGF5IHdpdGggbmV3IGZpbHRlcgotICAgICAgICAgICAgICAgICAgICBtb2RlbC5zZXRGaWx0ZXIoZmlsdGVyKTsKLSAgICAgICAgICAgICAgICAgICAgdGFibGUucmVwYWludCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSB1c2VyIHByZXNzZWQgdGhlIHN0YXJ0IGJ1dHRvbgotICAgICAgICAgICAgaWYgKGUuZ2V0U291cmNlKCkgPT0gc3RhcnRfYnV0dG9uKSB7Ci0gICAgICAgICAgICAgICAgc3RhcnQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSB1c2VyIHByZXNzZWQgdGhlIHN0b3AgYnV0dG9uCi0gICAgICAgICAgICBpZiAoZS5nZXRTb3VyY2UoKSA9PSBzdG9wX2J1dHRvbikgewotICAgICAgICAgICAgICAgIHN0b3AoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSB1c2VyIHdhbnRzIHRvIHN3aXRjaCBsYXlvdXQKLSAgICAgICAgICAgIGlmIChlLmdldFNvdXJjZSgpID09IGxheW91dF9idXR0b24pIHsKLSAgICAgICAgICAgICAgICBkZXRhaWxzX3BhbmVsLnJlbW92ZShkZXRhaWxzX3NvYXApOwotICAgICAgICAgICAgICAgIGRldGFpbHNfc29hcC5yZW1vdmVBbGwoKTsKLSAgICAgICAgICAgICAgICBpZiAoZGV0YWlsc19zb2FwLmdldE9yaWVudGF0aW9uKCkgPT0gSlNwbGl0UGFuZS5IT1JJWk9OVEFMX1NQTElUKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRldGFpbHNfc29hcCA9IG5ldyBKU3BsaXRQYW5lKEpTcGxpdFBhbmUuVkVSVElDQUxfU1BMSVQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGRldGFpbHNfc29hcCA9IG5ldyBKU3BsaXRQYW5lKEpTcGxpdFBhbmUuSE9SSVpPTlRBTF9TUExJVCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGRldGFpbHNfc29hcC5zZXRUb3BDb21wb25lbnQocmVxdWVzdF9wYW5lbCk7Ci0gICAgICAgICAgICAgICAgZGV0YWlsc19zb2FwLnNldFJpZ2h0Q29tcG9uZW50KHJlc3BvbnNlX3BhbmVsKTsKLSAgICAgICAgICAgICAgICBkZXRhaWxzX3NvYXAuc2V0UmVzaXplV2VpZ2h0KC41KTsKLSAgICAgICAgICAgICAgICBkZXRhaWxzX3BhbmVsLmFkZChkZXRhaWxzX3NvYXAsIEJvcmRlckxheW91dC5DRU5URVIpOwotICAgICAgICAgICAgICAgIGRldGFpbHNfcGFuZWwudmFsaWRhdGUoKTsKLSAgICAgICAgICAgICAgICBkZXRhaWxzX3BhbmVsLnJlcGFpbnQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSB1c2VyIGlzIGNoYW5naW5nIHRoZSByZWZsb3cgb3B0aW9uCi0gICAgICAgICAgICBpZiAoZS5nZXRTb3VyY2UoKSA9PSByZWZsb3dfeG1sKSB7Ci0gICAgICAgICAgICAgICAgcmVxdWVzdF90ZXh0LnNldFJlZmxvd1hNTChyZWZsb3dfeG1sLmlzU2VsZWN0ZWQoKSk7Ci0gICAgICAgICAgICAgICAgcmVzcG9uc2VfdGV4dC5zZXRSZWZsb3dYTUwocmVmbG93X3htbC5pc1NlbGVjdGVkKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBjbGFzcyByZXByZXNlbmQgdGhlIGRhdGEgZm9yIGEgU09BUCByZXF1ZXN0L3Jlc3BvbnNlIHBhaXIKLSAgICAgKi8KLSAgICBjbGFzcyBTT0FQTW9uaXRvckRhdGEgewotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBQcml2YXRlIGRhdGEKLSAgICAgICAgICovCi0gICAgICAgIHByaXZhdGUgTG9uZyAgICBpZDsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgIHRpbWU7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nICB0YXJnZXQ7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nICBzb2FwX3JlcXVlc3Q7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nICBzb2FwX3Jlc3BvbnNlOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDb25zdHJ1Y3RvcgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFNPQVBNb25pdG9yRGF0YShMb25nIGlkLCBTdHJpbmcgdGFyZ2V0LCBTdHJpbmcgc29hcF9yZXF1ZXN0KSB7Ci0gICAgICAgICAgICB0aGlzLmlkID0gaWQ7Ci0gICAgICAgICAgICAvLyBBIG51bGwgaWQgaXMgdXNlZCB0byBzaWduYWwgdGhhdCB0aGUgIm1vc3QgcmVjZW50IiBlbnRyeQotICAgICAgICAgICAgLy8gaXMgYmVpbmcgY3JlYXRlZC4KLSAgICAgICAgICAgIGlmIChpZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy50aW1lID0gIk1vc3QgUmVjZW50IjsKLSAgICAgICAgICAgICAgICB0aGlzLnRhcmdldCA9ICItLS0iOwotICAgICAgICAgICAgICAgIHRoaXMuc29hcF9yZXF1ZXN0ID0gbnVsbDsKLSAgICAgICAgICAgICAgICB0aGlzLnNvYXBfcmVzcG9uc2UgPSBudWxsOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aGlzLnRpbWUgPSBEYXRlRm9ybWF0LmdldFRpbWVJbnN0YW5jZSgpLmZvcm1hdChuZXcgRGF0ZSgpKTsKLSAgICAgICAgICAgICAgICB0aGlzLnRhcmdldCA9IHRhcmdldDsKLSAgICAgICAgICAgICAgICB0aGlzLnNvYXBfcmVxdWVzdCA9IHNvYXBfcmVxdWVzdDsKLSAgICAgICAgICAgICAgICB0aGlzLnNvYXBfcmVzcG9uc2UgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldCB0aGUgaWQgZm9yIHRoZSBTT0FQIG1lc3NhZ2UKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBMb25nIGdldElkKCkgewotICAgICAgICAgICAgcmV0dXJuIGlkOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldCB0aGUgdGltZSB0aGUgU09BUCByZXF1ZXN0IHdhcyByZWNlaXZlZCBieSB0aGUgYXBwbGV0Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFRpbWUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gdGltZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXQgdGhlIFNPQVAgcmVxdWVzdCB0YXJnZXQgc2VydmljZSBuYW1lCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFRhcmdldFNlcnZpY2UoKSB7Ci0gICAgICAgICAgICByZXR1cm4gdGFyZ2V0OwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldCB0aGUgc3RhdHVzIG9mIHRoZSByZXF1ZXN0Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFN0YXR1cygpIHsKLSAgICAgICAgICAgIFN0cmluZyBzdGF0dXMgPSAiLS0tIjsKLSAgICAgICAgICAgIGlmIChpZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gIkNvbXBsZXRlIjsKLSAgICAgICAgICAgICAgICBpZiAoc29hcF9yZXNwb25zZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9ICJBY3RpdmUiOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0IHRoZSByZXF1ZXN0IFNPQVAgY29udGVudHMKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0U09BUFJlcXVlc3QoKSB7Ci0gICAgICAgICAgICByZXR1cm4gc29hcF9yZXF1ZXN0OwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldCB0aGUgcmVzcG9zbmUgU09BUCBjb250ZW50cwotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgc2V0U09BUFJlc3BvbnNlKFN0cmluZyByZXNwb25zZSkgewotICAgICAgICAgICAgc29hcF9yZXNwb25zZSA9IHJlc3BvbnNlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldCB0aGUgcmVzcG9uc2UgU09BUCBjb250ZW50cwotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRTT0FQUmVzcG9uc2UoKSB7Ci0gICAgICAgICAgICByZXR1cm4gc29hcF9yZXNwb25zZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgdGFibGUgbW9kZWwgaXMgdXNlZCB0byBtYW5hZ2UgdGhlIHRhYmxlIGRpc3BsYXllZAotICAgICAqIGF0IHRoZSB0b3Agb2YgdGhlIHBhZ2UgdG8gc2hvdyBhbGwgdGhlIFNPQVAgbWVzc2FnZXMKLSAgICAgKiB3ZSBoYXZlIHJlY2VpdmVkIGFuZCB0byBjb250cm9sIHdoaWNoIG1lc3NhZ2UgZGV0YWlscyBhcmUKLSAgICAgKiB0byBiZSBkaXNwbGF5ZWQgb24gdGhlIGJvdHRvbSBvZiB0aGUgcGFnZS4KLSAgICAgKi8KLSAgICBjbGFzcyBTT0FQTW9uaXRvclRhYmxlTW9kZWwgZXh0ZW5kcyBBYnN0cmFjdFRhYmxlTW9kZWwgewotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDb2x1bW4gdGl0bGVzCi0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZ1tdIGNvbHVtbl9uYW1lcyA9IHsgIlRpbWUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRhcmdldCBTZXJ2aWNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTdGF0dXMiIH07Ci0gICAgICAgIC8qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICogUHJpdmF0ZSBkYXRhCi0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIFZlY3RvciAgZGF0YTsKLSAgICAgICAgcHJpdmF0ZSBWZWN0b3IgIGZpbHRlcl9pbmNsdWRlOwotICAgICAgICBwcml2YXRlIFZlY3RvciAgZmlsdGVyX2V4Y2x1ZGU7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBmaWx0ZXJfYWN0aXZlOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gZmlsdGVyX2NvbXBsZXRlOwotICAgICAgICBwcml2YXRlIFZlY3RvciAgZmlsdGVyX2RhdGE7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENvbnN0cnVjdG9yCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgU09BUE1vbml0b3JUYWJsZU1vZGVsKCkgewotICAgICAgICAgICAgZGF0YSA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgICAgIC8vIEFkZCAibW9zdCByZWNlbnQiIGVudHJ5IHRvIHRvcCBvZiB0YWJsZQotICAgICAgICAgICAgU09BUE1vbml0b3JEYXRhIHNvYXAgPSBuZXcgU09BUE1vbml0b3JEYXRhKG51bGwsbnVsbCxudWxsKTsKLSAgICAgICAgICAgIGRhdGEuYWRkRWxlbWVudChzb2FwKTsKLSAgICAgICAgICAgIGZpbHRlcl9pbmNsdWRlID0gbnVsbDsKLSAgICAgICAgICAgIGZpbHRlcl9leGNsdWRlID0gbnVsbDsKLSAgICAgICAgICAgIGZpbHRlcl9hY3RpdmUgPSBmYWxzZTsKLSAgICAgICAgICAgIGZpbHRlcl9jb21wbGV0ZSA9IGZhbHNlOwotICAgICAgICAgICAgZmlsdGVyX2RhdGEgPSBudWxsOwotICAgICAgICAgICAgLy8gQnkgZGVmYXVsdCwgZXhjbHVkZSBOb3RpZmljYXRpb25TZXJ2aWNlIGFuZAotICAgICAgICAgICAgLy8gRXZlbnRWaWV3ZXJTZXJ2aWNlIG1lc3NhZ2VzCi0gICAgICAgICAgICBmaWx0ZXJfZXhjbHVkZSA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgICAgIGZpbHRlcl9leGNsdWRlLmFkZEVsZW1lbnQoIk5vdGlmaWNhdGlvblNlcnZpY2UiKTsKLSAgICAgICAgICAgIGZpbHRlcl9leGNsdWRlLmFkZEVsZW1lbnQoIkV2ZW50Vmlld2VyU2VydmljZSIpOwotICAgICAgICAgICAgZmlsdGVyX2RhdGEgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAgICAgICBmaWx0ZXJfZGF0YS5hZGRFbGVtZW50KHNvYXApOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldCBjb2x1bW4gY291bnQgKHBhcnQgb2YgdGFibGUgbW9kZWwgaW50ZXJmYWNlKQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGludCBnZXRDb2x1bW5Db3VudCgpIHsKLSAgICAgICAgICAgIHJldHVybiBjb2x1bW5fbmFtZXMubGVuZ3RoOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvKioKLSAgICAgICAgICogR2V0IHJvdyBjb3VudCAocGFydCBvZiB0YWJsZSBtb2RlbCBpbnRlcmZhY2UpCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgaW50IGdldFJvd0NvdW50KCkgewotICAgICAgICAgICAgaW50IGNvdW50ID0gZGF0YS5zaXplKCk7Ci0gICAgICAgICAgICBpZiAoZmlsdGVyX2RhdGEgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNvdW50ID0gZmlsdGVyX2RhdGEuc2l6ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGNvdW50OwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldCBjb2x1bW4gbmFtZSAocGFydCBvZiB0YWJsZSBtb2RlbCBpbnRlcmZhY2UpCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldENvbHVtbk5hbWUoaW50IGNvbCkgewotICAgICAgICAgICAgcmV0dXJuIGNvbHVtbl9uYW1lc1tjb2xdOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldCB2YWx1ZSBhdCAocGFydCBvZiB0YWJsZSBtb2RlbCBpbnRlcmZhY2UpCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgT2JqZWN0IGdldFZhbHVlQXQoaW50IHJvdywgaW50IGNvbCkgewotICAgICAgICAgICAgU09BUE1vbml0b3JEYXRhIHNvYXA7Ci0gICAgICAgICAgICBTdHJpbmcgICAgICAgICAgdmFsdWUgPSBudWxsOwotICAgICAgICAgICAgc29hcCA9IChTT0FQTW9uaXRvckRhdGEpIGRhdGEuZWxlbWVudEF0KHJvdyk7Ci0gICAgICAgICAgICBpZiAoZmlsdGVyX2RhdGEgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHNvYXAgPSAoU09BUE1vbml0b3JEYXRhKSBmaWx0ZXJfZGF0YS5lbGVtZW50QXQocm93KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN3aXRjaCAoY29sKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHNvYXAuZ2V0VGltZSgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gc29hcC5nZXRUYXJnZXRTZXJ2aWNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBzb2FwLmdldFN0YXR1cygpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDaGVjayBpZiBzb2FwIGRhdGEgbWF0Y2hlcyBmaWx0ZXIgCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBmaWx0ZXJNYXRjaChTT0FQTW9uaXRvckRhdGEgc29hcCkgewotICAgICAgICAgICAgYm9vbGVhbiBtYXRjaCA9IHRydWU7Ci0gICAgICAgICAgICBpZiAoZmlsdGVyX2luY2x1ZGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciBzZXJ2aWNlIG1hdGNoCi0gICAgICAgICAgICAgICAgRW51bWVyYXRpb24gZSA9IGZpbHRlcl9pbmNsdWRlLmVsZW1lbnRzKCk7Ci0gICAgICAgICAgICAgICAgbWF0Y2ggPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSAmJiAhbWF0Y2gpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNlcnZpY2UgPSAoU3RyaW5nKSBlLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzZXJ2aWNlLmVxdWFscyhzb2FwLmdldFRhcmdldFNlcnZpY2UoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChmaWx0ZXJfZXhjbHVkZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIHNlcnZpY2UgbWF0Y2gKLSAgICAgICAgICAgICAgICBFbnVtZXJhdGlvbiBlID0gZmlsdGVyX2V4Y2x1ZGUuZWxlbWVudHMoKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSAmJiBtYXRjaCkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2VydmljZSA9IChTdHJpbmcpIGUubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNlcnZpY2UuZXF1YWxzKHNvYXAuZ2V0VGFyZ2V0U2VydmljZSgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2ggPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChmaWx0ZXJfYWN0aXZlKSB7Ci0gICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIGFjdGl2ZSBzdGF0dXMgbWF0Y2gKLSAgICAgICAgICAgICAgICBpZiAoc29hcC5nZXRTT0FQUmVzcG9uc2UoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1hdGNoID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGZpbHRlcl9jb21wbGV0ZSkgewotICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciBjb21wbGV0ZSBzdGF0dXMgbWF0Y2gKLSAgICAgICAgICAgICAgICBpZiAoc29hcC5nZXRTT0FQUmVzcG9uc2UoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1hdGNoID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gVGhlICJtb3N0IHJlY2VudCIgaXMgYWx3YXlzIGEgbWF0Y2gKLSAgICAgICAgICAgIGlmIChzb2FwLmdldElkKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1hdGNoID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBtYXRjaDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBZGQgZGF0YSB0byB0aGUgdGFibGUgYXMgYSBuZXcgcm93Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBhZGREYXRhKFNPQVBNb25pdG9yRGF0YSBzb2FwKSB7Ci0gICAgICAgICAgICBpbnQgcm93ID0gZGF0YS5zaXplKCk7Ci0gICAgICAgICAgICBkYXRhLmFkZEVsZW1lbnQoc29hcCk7Ci0gICAgICAgICAgICBpZiAoZmlsdGVyX2RhdGEgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChmaWx0ZXJNYXRjaChzb2FwKSkgewotICAgICAgICAgICAgICAgICAgICByb3cgPSBmaWx0ZXJfZGF0YS5zaXplKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZpbHRlcl9kYXRhLmFkZEVsZW1lbnQoc29hcCk7Ci0gICAgICAgICAgICAgICAgICAgIGZpcmVUYWJsZVJvd3NJbnNlcnRlZChyb3cscm93KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZpcmVUYWJsZVJvd3NJbnNlcnRlZChyb3cscm93KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBGaW5kIHRoZSBkYXRhIGZvciBhIGdpdmVuIGlkCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgU09BUE1vbml0b3JEYXRhIGZpbmREYXRhKExvbmcgaWQpIHsKLSAgICAgICAgICAgIFNPQVBNb25pdG9yRGF0YSBzb2FwID0gbnVsbDsKLSAgICAgICAgICAgIGZvciAoaW50IHJvdz1kYXRhLnNpemUoKTsgKHJvdyA+IDApICYmIChzb2FwID09IG51bGwpOyByb3ctLSkgewotICAgICAgICAgICAgICAgIHNvYXAgPSAoU09BUE1vbml0b3JEYXRhKSBkYXRhLmVsZW1lbnRBdChyb3ctMSk7Ci0gICAgICAgICAgICAgICAgaWYgKHNvYXAuZ2V0SWQoKS5sb25nVmFsdWUoKSAhPSBpZC5sb25nVmFsdWUoKSkgewotICAgICAgICAgICAgICAgICAgICBzb2FwID0gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gc29hcDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBGaW5kIHRoZSByb3cgaW4gdGhlIHRhYmxlIGZvciBhIGdpdmVuIG1lc3NhZ2UgaWQKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBpbnQgZmluZFJvdyhTT0FQTW9uaXRvckRhdGEgc29hcCkgewotICAgICAgICAgICAgaW50IHJvdyA9IC0xOwotICAgICAgICAgICAgaWYgKGZpbHRlcl9kYXRhICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByb3cgPSBmaWx0ZXJfZGF0YS5pbmRleE9mKHNvYXApOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByb3cgPSBkYXRhLmluZGV4T2Yoc29hcCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcm93OwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJlbW92ZSBhbGwgbWVzc2FnZXMgZnJvbSB0aGUgdGFibGUgKGJ1dCBsZWF2ZSAibW9zdCByZWNlbnQiKQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgY2xlYXJBbGwoKSB7Ci0gICAgICAgICAgICBpbnQgbGFzdF9yb3cgPSBkYXRhLnNpemUoKSAtIDE7Ci0gICAgICAgICAgICBpZiAobGFzdF9yb3cgPiAwKSB7Ci0gICAgICAgICAgICAgICAgZGF0YS5yZW1vdmVBbGxFbGVtZW50cygpOwotICAgICAgICAgICAgICAgIFNPQVBNb25pdG9yRGF0YSBzb2FwID0gbmV3IFNPQVBNb25pdG9yRGF0YShudWxsLG51bGwsbnVsbCk7Ci0gICAgICAgICAgICAgICAgZGF0YS5hZGRFbGVtZW50KHNvYXApOwotICAgICAgICAgICAgICAgIGlmIChmaWx0ZXJfZGF0YSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbHRlcl9kYXRhLnJlbW92ZUFsbEVsZW1lbnRzKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZpbHRlcl9kYXRhLmFkZEVsZW1lbnQoc29hcCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZpcmVUYWJsZURhdGFDaGFuZ2VkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmVtb3ZlIGEgbWVzc2FnZSBmcm9tIHRoZSB0YWJsZQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlUm93KGludCByb3cpIHsKLSAgICAgICAgICAgIFNPQVBNb25pdG9yRGF0YSBzb2FwID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChmaWx0ZXJfZGF0YSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc29hcCA9IChTT0FQTW9uaXRvckRhdGEpIGRhdGEuZWxlbWVudEF0KHJvdyk7Ci0gICAgICAgICAgICAgICAgZGF0YS5yZW1vdmUoc29hcCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNvYXAgPSAoU09BUE1vbml0b3JEYXRhKSBmaWx0ZXJfZGF0YS5lbGVtZW50QXQocm93KTsKLSAgICAgICAgICAgICAgICBmaWx0ZXJfZGF0YS5yZW1vdmUoc29hcCk7Ci0gICAgICAgICAgICAgICAgZGF0YS5yZW1vdmUoc29hcCk7Ci0gICAgICAgICAgICB9ICAgICAgICAgCi0gICAgICAgICAgICBmaXJlVGFibGVSb3dzRGVsZXRlZChyb3cscm93KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXQgYSBuZXcgZmlsdGVyCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoU09BUE1vbml0b3JGaWx0ZXIgZmlsdGVyKSB7Ci0gICAgICAgICAgICAvLyBTYXZlIG5ldyBmaWx0ZXIgY3JpdGVyaWEKLSAgICAgICAgICAgIGZpbHRlcl9pbmNsdWRlID0gZmlsdGVyLmdldEZpbHRlckluY2x1ZGVMaXN0KCk7Ci0gICAgICAgICAgICBmaWx0ZXJfZXhjbHVkZSA9IGZpbHRlci5nZXRGaWx0ZXJFeGNsdWRlTGlzdCgpOwotICAgICAgICAgICAgZmlsdGVyX2FjdGl2ZSA9IGZpbHRlci5nZXRGaWx0ZXJBY3RpdmUoKTsKLSAgICAgICAgICAgIGZpbHRlcl9jb21wbGV0ZSA9IGZpbHRlci5nZXRGaWx0ZXJDb21wbGV0ZSgpOwotICAgICAgICAgICAgYXBwbHlGaWx0ZXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZWZpbHRlciB0aGUgbGlzdCBvZiBtZXNzYWdlcwotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgYXBwbHlGaWx0ZXIoKSB7Ci0gICAgICAgICAgICAvLyBSZS1maWx0ZXIgdXNpbmcgbmV3IGNyaXRlcmlhCi0gICAgICAgICAgICBmaWx0ZXJfZGF0YSA9IG51bGw7Ci0gICAgICAgICAgICBpZiAoKGZpbHRlcl9pbmNsdWRlICE9IG51bGwpIHx8IAotICAgICAgICAgICAgICAgIChmaWx0ZXJfZXhjbHVkZSAhPSBudWxsKSB8fAotICAgICAgICAgICAgICAgICBmaWx0ZXJfYWN0aXZlIHx8IGZpbHRlcl9jb21wbGV0ZSApIHsKLSAgICAgICAgICAgICAgICBmaWx0ZXJfZGF0YSA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgICAgICAgICBFbnVtZXJhdGlvbiBlID0gZGF0YS5lbGVtZW50cygpOwotICAgICAgICAgICAgICAgIFNPQVBNb25pdG9yRGF0YSBzb2FwOwotICAgICAgICAgICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNvYXAgPSAoU09BUE1vbml0b3JEYXRhKSBlLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmaWx0ZXJNYXRjaChzb2FwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyX2RhdGEuYWRkRWxlbWVudChzb2FwKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpcmVUYWJsZURhdGFDaGFuZ2VkKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0IHRoZSBkYXRhIGZvciBhIHJvdwotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFNPQVBNb25pdG9yRGF0YSBnZXREYXRhKGludCByb3cpIHsKLSAgICAgICAgICAgIFNPQVBNb25pdG9yRGF0YSBzb2FwID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChmaWx0ZXJfZGF0YSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc29hcCA9IChTT0FQTW9uaXRvckRhdGEpIGRhdGEuZWxlbWVudEF0KHJvdyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNvYXAgPSAoU09BUE1vbml0b3JEYXRhKSBmaWx0ZXJfZGF0YS5lbGVtZW50QXQocm93KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBzb2FwOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFVwZGF0ZSBhIG1lc3NhZ2UKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHVwZGF0ZURhdGEgKFNPQVBNb25pdG9yRGF0YSBzb2FwKSB7Ci0gICAgICAgICAgIGludCByb3c7Ci0gICAgICAgICAgIGlmIChmaWx0ZXJfZGF0YSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAvLyBObyBmaWx0ZXIsIHNvIGp1c3QgZmlyZSB0YWJsZSB1cGRhdGVkCi0gICAgICAgICAgICAgICByb3cgPSBkYXRhLmluZGV4T2Yoc29hcCk7Ci0gICAgICAgICAgICAgICBpZiAocm93ICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgZmlyZVRhYmxlUm93c1VwZGF0ZWQocm93LHJvdyk7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcm93IHdhcyBiZWluZyBkaXNwbGF5ZWQKLSAgICAgICAgICAgICAgIHJvdyA9IGZpbHRlcl9kYXRhLmluZGV4T2Yoc29hcCk7Ci0gICAgICAgICAgICAgICBpZiAocm93ID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgLy8gUm93IHdhcyBub3QgZGlzcGxheWVkLCBzbyBjaGVjayBmb3IgaWYgaXQKLSAgICAgICAgICAgICAgICAgICAvLyBub3cgbmVlZHMgdG8gYmUgZGlzcGxheWVkCi0gICAgICAgICAgICAgICAgICAgaWYgKGZpbHRlck1hdGNoKHNvYXApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCA9IC0xOwotICAgICAgICAgICAgICAgICAgICAgICByb3cgPSBkYXRhLmluZGV4T2Yoc29hcCkgKyAxOwotICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKHJvdyA8IGRhdGEuc2l6ZSgpKSAmJiAoaW5kZXggPT0gLTEpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCA9IGZpbHRlcl9kYXRhLmluZGV4T2YoZGF0YS5lbGVtZW50QXQocm93KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggIT0gLTEpIHsgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW5zZXJ0IGF0IHRoaXMgbG9jYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfZGF0YS5hZGQoaW5kZXgsc29hcCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICByb3crKzsKLSAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluc2VydCBhdCBlbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gZmlsdGVyX2RhdGEuc2l6ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyX2RhdGEuYWRkRWxlbWVudChzb2FwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICBmaXJlVGFibGVSb3dzSW5zZXJ0ZWQoaW5kZXgsaW5kZXgpOwotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgLy8gUm93IHdhcyBkaXNwbGF5ZWQsIHNvIGNoZWNrIGlmIGl0IG5lZWRzIHRvCi0gICAgICAgICAgICAgICAgICAgLy8gYmUgdXBkYXRlZCBvciByZW1vdmVkCi0gICAgICAgICAgICAgICAgICAgaWYgKGZpbHRlck1hdGNoKHNvYXApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIGZpcmVUYWJsZVJvd3NVcGRhdGVkKHJvdyxyb3cpOwotICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcl9kYXRhLnJlbW92ZShzb2FwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgZmlyZVRhYmxlUm93c0RlbGV0ZWQocm93LHJvdyk7Ci0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfQotICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBhbmVsIHdpdGggY2hlY2tib3ggYW5kIGxpc3QKLSAgICAgKi8KLSAgICBjbGFzcyBTZXJ2aWNlRmlsdGVyUGFuZWwgZXh0ZW5kcyBKUGFuZWwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudHMgQWN0aW9uTGlzdGVuZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdFNlbGVjdGlvbkxpc3RlbmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERvY3VtZW50TGlzdGVuZXIgewotCi0gICAgICAgIHByaXZhdGUgSkNoZWNrQm94ICAgIHNlcnZpY2VfYm94ID0gbnVsbDsKLSAgICAgICAgcHJpdmF0ZSBWZWN0b3IgICAgICAgZmlsdGVyX2xpc3QgPSBudWxsOwotICAgICAgICBwcml2YXRlIFZlY3RvciAgICAgICBzZXJ2aWNlX2RhdGEgPSBudWxsOwotICAgICAgICBwcml2YXRlIEpMaXN0ICAgICAgICBzZXJ2aWNlX2xpc3QgPSBudWxsOwotICAgICAgICBwcml2YXRlIEpTY3JvbGxQYW5lICBzZXJ2aWNlX3Njcm9sbCA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgSkJ1dHRvbiAgICAgIHJlbW92ZV9zZXJ2aWNlX2J1dHRvbiA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgSlBhbmVsICAgICAgIHJlbW92ZV9zZXJ2aWNlX3BhbmVsID0gbnVsbDsKLSAgICAgICAgcHJpdmF0ZSBFbXB0eUJvcmRlciAgaW5kZW50X2JvcmRlciA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgRW1wdHlCb3JkZXIgIGVtcHR5X2JvcmRlciA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgSlBhbmVsICAgICAgIHNlcnZpY2VfYXJlYSA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgSlBhbmVsICAgICAgIGFkZF9zZXJ2aWNlX2FyZWEgPSBudWxsOwotICAgICAgICBwcml2YXRlIEpUZXh0RmllbGQgICBhZGRfc2VydmljZV9maWVsZCA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgSkJ1dHRvbiAgICAgIGFkZF9zZXJ2aWNlX2J1dHRvbiA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgSlBhbmVsICAgICAgIGFkZF9zZXJ2aWNlX3BhbmVsID0gbnVsbDsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQ29uc3RydWN0b3IKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBTZXJ2aWNlRmlsdGVyUGFuZWwoU3RyaW5nIHRleHQsIFZlY3RvciBsaXN0KSB7Ci0gICAgICAgICAgICBlbXB0eV9ib3JkZXIgPSBuZXcgRW1wdHlCb3JkZXIoNSw1LDAsNSk7Ci0gICAgICAgICAgICBpbmRlbnRfYm9yZGVyID0gbmV3IEVtcHR5Qm9yZGVyKDUsMjUsNSw1KTsKLSAgICAgICAgICAgIHNlcnZpY2VfYm94ID0gbmV3IEpDaGVja0JveCh0ZXh0KTsKLSAgICAgICAgICAgIHNlcnZpY2VfYm94LmFkZEFjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgICAgICAgICAgc2VydmljZV9kYXRhID0gbmV3IFZlY3RvcigpOwotICAgICAgICAgICAgaWYgKGxpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHNlcnZpY2VfYm94LnNldFNlbGVjdGVkKHRydWUpOwotICAgICAgICAgICAgICAgIHNlcnZpY2VfZGF0YSA9IChWZWN0b3IpIGxpc3QuY2xvbmUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNlcnZpY2VfbGlzdCA9IG5ldyBKTGlzdChzZXJ2aWNlX2RhdGEpOwotICAgICAgICAgICAgc2VydmljZV9saXN0LnNldEJvcmRlcihuZXcgRXRjaGVkQm9yZGVyKCkpOwotICAgICAgICAgICAgc2VydmljZV9saXN0LnNldFZpc2libGVSb3dDb3VudCg1KTsKLSAgICAgICAgICAgIHNlcnZpY2VfbGlzdC5hZGRMaXN0U2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgICAgICBzZXJ2aWNlX2xpc3Quc2V0RW5hYmxlZChzZXJ2aWNlX2JveC5pc1NlbGVjdGVkKCkpOwotICAgICAgICAgICAgc2VydmljZV9zY3JvbGwgPSBuZXcgSlNjcm9sbFBhbmUoc2VydmljZV9saXN0KTsKLSAgICAgICAgICAgIHNlcnZpY2Vfc2Nyb2xsLnNldEJvcmRlcihuZXcgRXRjaGVkQm9yZGVyKCkpOwotICAgICAgICAgICAgcmVtb3ZlX3NlcnZpY2VfYnV0dG9uID0gbmV3IEpCdXR0b24oIlJlbW92ZSIpOwotICAgICAgICAgICAgcmVtb3ZlX3NlcnZpY2VfYnV0dG9uLmFkZEFjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgICAgICAgICAgcmVtb3ZlX3NlcnZpY2VfYnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgcmVtb3ZlX3NlcnZpY2VfcGFuZWwgPSBuZXcgSlBhbmVsKCk7Ci0gICAgICAgICAgICByZW1vdmVfc2VydmljZV9wYW5lbC5zZXRMYXlvdXQobmV3IEZsb3dMYXlvdXQoKSk7Ci0gICAgICAgICAgICByZW1vdmVfc2VydmljZV9wYW5lbC5hZGQocmVtb3ZlX3NlcnZpY2VfYnV0dG9uKTsKLSAgICAgICAgICAgIHNlcnZpY2VfYXJlYSA9IG5ldyBKUGFuZWwoKTsKLSAgICAgICAgICAgIHNlcnZpY2VfYXJlYS5zZXRMYXlvdXQobmV3IEJvcmRlckxheW91dCgpKTsKLSAgICAgICAgICAgIHNlcnZpY2VfYXJlYS5hZGQoc2VydmljZV9zY3JvbGwsIEJvcmRlckxheW91dC5DRU5URVIpOwotICAgICAgICAgICAgc2VydmljZV9hcmVhLmFkZChyZW1vdmVfc2VydmljZV9wYW5lbCwgQm9yZGVyTGF5b3V0LkVBU1QpOwotICAgICAgICAgICAgc2VydmljZV9hcmVhLnNldEJvcmRlcihpbmRlbnRfYm9yZGVyKTsKLSAgICAgICAgICAgIGFkZF9zZXJ2aWNlX2ZpZWxkID0gbmV3IEpUZXh0RmllbGQoKTsKLSAgICAgICAgICAgIGFkZF9zZXJ2aWNlX2ZpZWxkLmFkZEFjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgICAgICAgICAgYWRkX3NlcnZpY2VfZmllbGQuZ2V0RG9jdW1lbnQoKS5hZGREb2N1bWVudExpc3RlbmVyKHRoaXMpOwotICAgICAgICAgICAgYWRkX3NlcnZpY2VfZmllbGQuc2V0RW5hYmxlZChzZXJ2aWNlX2JveC5pc1NlbGVjdGVkKCkpOwotICAgICAgICAgICAgYWRkX3NlcnZpY2VfYnV0dG9uID0gbmV3IEpCdXR0b24oIkFkZCIpOwotICAgICAgICAgICAgYWRkX3NlcnZpY2VfYnV0dG9uLmFkZEFjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgICAgICAgICAgYWRkX3NlcnZpY2VfYnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgYWRkX3NlcnZpY2VfcGFuZWwgPSBuZXcgSlBhbmVsKCk7Ci0gICAgICAgICAgICBhZGRfc2VydmljZV9wYW5lbC5zZXRMYXlvdXQobmV3IEJvcmRlckxheW91dCgpKTsKLSAgICAgICAgICAgIEpQYW5lbCBkdW1teSA9IG5ldyBKUGFuZWwoKTsKLSAgICAgICAgICAgIGR1bW15LnNldEJvcmRlcihlbXB0eV9ib3JkZXIpOwotICAgICAgICAgICAgYWRkX3NlcnZpY2VfcGFuZWwuYWRkKGR1bW15LCBCb3JkZXJMYXlvdXQuV0VTVCk7Ci0gICAgICAgICAgICBhZGRfc2VydmljZV9wYW5lbC5hZGQoYWRkX3NlcnZpY2VfYnV0dG9uLCBCb3JkZXJMYXlvdXQuRUFTVCk7Ci0gICAgICAgICAgICBhZGRfc2VydmljZV9hcmVhID0gbmV3IEpQYW5lbCgpOwotICAgICAgICAgICAgYWRkX3NlcnZpY2VfYXJlYS5zZXRMYXlvdXQobmV3IEJvcmRlckxheW91dCgpKTsKLSAgICAgICAgICAgIGFkZF9zZXJ2aWNlX2FyZWEuYWRkKGFkZF9zZXJ2aWNlX2ZpZWxkLCBCb3JkZXJMYXlvdXQuQ0VOVEVSKTsKLSAgICAgICAgICAgIGFkZF9zZXJ2aWNlX2FyZWEuYWRkKGFkZF9zZXJ2aWNlX3BhbmVsLCBCb3JkZXJMYXlvdXQuRUFTVCk7Ci0gICAgICAgICAgICBhZGRfc2VydmljZV9hcmVhLnNldEJvcmRlcihpbmRlbnRfYm9yZGVyKTsKLSAgICAgICAgICAgIHNldExheW91dChuZXcgQm9yZGVyTGF5b3V0KCkpOwotICAgICAgICAgICAgYWRkKHNlcnZpY2VfYm94LCBCb3JkZXJMYXlvdXQuTk9SVEgpOwotICAgICAgICAgICAgYWRkKHNlcnZpY2VfYXJlYSwgQm9yZGVyTGF5b3V0LkNFTlRFUik7Ci0gICAgICAgICAgICBhZGQoYWRkX3NlcnZpY2VfYXJlYSwgQm9yZGVyTGF5b3V0LlNPVVRIKTsKLSAgICAgICAgICAgIHNldEJvcmRlcihlbXB0eV9ib3JkZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldCB0aGUgY3VycmVudCBsaXN0IG9mIHNlcnZpY2VzCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgVmVjdG9yIGdldFNlcnZpY2VMaXN0KCkgewotICAgICAgICAgICAgVmVjdG9yIGxpc3QgPSBudWxsOwotICAgICAgICAgICAgaWYgKHNlcnZpY2VfYm94LmlzU2VsZWN0ZWQoKSkgewotICAgICAgICAgICAgICAgIGxpc3QgPSBzZXJ2aWNlX2RhdGE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbGlzdDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBMaXN0ZW5lciB0byBoYW5kbGUgYnV0dG9uIGFjdGlvbnMKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgdXNlciBjaGFuZ2VkIHRoZSBzZXJ2aWNlIGZpbHRlciBvcHRpb24KLSAgICAgICAgICAgIGlmIChlLmdldFNvdXJjZSgpID09IHNlcnZpY2VfYm94KSB7Ci0gICAgICAgICAgICAgICAgc2VydmljZV9saXN0LnNldEVuYWJsZWQoc2VydmljZV9ib3guaXNTZWxlY3RlZCgpKTsKLSAgICAgICAgICAgICAgICBzZXJ2aWNlX2xpc3QuY2xlYXJTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgICAgICByZW1vdmVfc2VydmljZV9idXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgYWRkX3NlcnZpY2VfZmllbGQuc2V0RW5hYmxlZChzZXJ2aWNlX2JveC5pc1NlbGVjdGVkKCkpOwotICAgICAgICAgICAgICAgIGFkZF9zZXJ2aWNlX2ZpZWxkLnNldFRleHQoIiIpOwotICAgICAgICAgICAgICAgIGFkZF9zZXJ2aWNlX2J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSB1c2VyIHByZXNzZWQgdGhlIGFkZCBzZXJ2aWNlIGJ1dHRvbgotICAgICAgICAgICAgaWYgKChlLmdldFNvdXJjZSgpID09IGFkZF9zZXJ2aWNlX2J1dHRvbikgfHwKLSAgICAgICAgICAgICAgICAoZS5nZXRTb3VyY2UoKSA9PSBhZGRfc2VydmljZV9maWVsZCkpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdGV4dCA9IGFkZF9zZXJ2aWNlX2ZpZWxkLmdldFRleHQoKTsKLSAgICAgICAgICAgICAgICBpZiAoKHRleHQgIT0gbnVsbCkgJiYgKHRleHQubGVuZ3RoKCkgPiAwKSkgewotICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlX2RhdGEuYWRkRWxlbWVudCh0ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgc2VydmljZV9saXN0LnNldExpc3REYXRhKHNlcnZpY2VfZGF0YSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGFkZF9zZXJ2aWNlX2ZpZWxkLnNldFRleHQoIiIpOwotICAgICAgICAgICAgICAgIGFkZF9zZXJ2aWNlX2ZpZWxkLnJlcXVlc3RGb2N1cygpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHVzZXIgcHJlc3NlZCB0aGUgcmVtb3ZlIHNlcnZpY2UgYnV0dG9uCi0gICAgICAgICAgICBpZiAoZS5nZXRTb3VyY2UoKSA9PSByZW1vdmVfc2VydmljZV9idXR0b24pIHsKLSAgICAgICAgICAgICAgICBPYmplY3RbXSBzZWxzID0gc2VydmljZV9saXN0LmdldFNlbGVjdGVkVmFsdWVzKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPHNlbHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgc2VydmljZV9kYXRhLnJlbW92ZUVsZW1lbnQoc2Vsc1tpXSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNlcnZpY2VfbGlzdC5zZXRMaXN0RGF0YShzZXJ2aWNlX2RhdGEpOwotICAgICAgICAgICAgICAgIHNlcnZpY2VfbGlzdC5jbGVhclNlbGVjdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEhhbmRsZSBjaGFuZ2VzIHRvIHRoZSB0ZXh0IGZpZWxkCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBjaGFuZ2VkVXBkYXRlKERvY3VtZW50RXZlbnQgZSkgewotICAgICAgICAgICAgU3RyaW5nIHRleHQgPSBhZGRfc2VydmljZV9maWVsZC5nZXRUZXh0KCk7Ci0gICAgICAgICAgICBpZiAoKHRleHQgIT0gbnVsbCkgJiYgKHRleHQubGVuZ3RoKCkgPiAwKSkgewotICAgICAgICAgICAgICAgIGFkZF9zZXJ2aWNlX2J1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBhZGRfc2VydmljZV9idXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogSGFuZGxlIGNoYW5nZXMgdG8gdGhlIHRleHQgZmllbGQKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIGluc2VydFVwZGF0ZShEb2N1bWVudEV2ZW50IGUpIHsKLSAgICAgICAgICAgIGNoYW5nZWRVcGRhdGUoZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogSGFuZGxlIGNoYW5nZXMgdG8gdGhlIHRleHQgZmllbGQKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZVVwZGF0ZShEb2N1bWVudEV2ZW50IGUpIHsKLSAgICAgICAgICAgIGNoYW5nZWRVcGRhdGUoZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogTGlzdGVuZXIgdG8gaGFuZGxlIHNlcnZpY2UgbGlzdCBzZWxlY3Rpb24gY2hhbmdlcwotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgdmFsdWVDaGFuZ2VkKExpc3RTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICBpZiAoc2VydmljZV9saXN0LmdldFNlbGVjdGVkSW5kZXgoKSA9PSAtMSkgewotICAgICAgICAgICAgICAgIHJlbW92ZV9zZXJ2aWNlX2J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmVtb3ZlX3NlcnZpY2VfYnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDbGFzcyBmb3Igc2hvd2luZyB0aGUgZmlsdGVyIGRpYWxvZwotICAgICAqLwotICAgIGNsYXNzIFNPQVBNb25pdG9yRmlsdGVyIGltcGxlbWVudHMgQWN0aW9uTGlzdGVuZXIgewotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBQcml2YXRlIGRhdGEKLSAgICAgICAgICovCi0gICAgICAgIHByaXZhdGUgSkRpYWxvZyAgICAgICAgICAgIGRpYWxvZyA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgSlBhbmVsICAgICAgICAgICAgIHBhbmVsID0gbnVsbDsKLSAgICAgICAgcHJpdmF0ZSBKUGFuZWwgICAgICAgICAgICAgYnV0dG9ucyA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgSkJ1dHRvbiAgICAgICAgICAgIG9rX2J1dHRvbiA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgSkJ1dHRvbiAgICAgICAgICAgIGNhbmNlbF9idXR0b24gPSBudWxsOwotICAgICAgICBwcml2YXRlIFNlcnZpY2VGaWx0ZXJQYW5lbCBpbmNsdWRlX3BhbmVsID0gbnVsbDsKLSAgICAgICAgcHJpdmF0ZSBTZXJ2aWNlRmlsdGVyUGFuZWwgZXhjbHVkZV9wYW5lbCA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgSlBhbmVsICAgICAgICAgICAgIHN0YXR1c19wYW5lbCA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgSkNoZWNrQm94ICAgICAgICAgIHN0YXR1c19ib3ggPSBudWxsOwotICAgICAgICBwcml2YXRlIEVtcHR5Qm9yZGVyICBlbXB0eV9ib3JkZXIgPSBudWxsOwotICAgICAgICBwcml2YXRlIEVtcHR5Qm9yZGVyICBpbmRlbnRfYm9yZGVyID0gbnVsbDsKLSAgICAgICAgcHJpdmF0ZSBKUGFuZWwgICAgICAgICAgICAgc3RhdHVzX29wdGlvbnMgPSBudWxsOwotICAgICAgICBwcml2YXRlIEJ1dHRvbkdyb3VwICAgICAgICBzdGF0dXNfZ3JvdXAgPSBudWxsOwotICAgICAgICBwcml2YXRlIEpSYWRpb0J1dHRvbiAgICAgICBzdGF0dXNfYWN0aXZlID0gbnVsbDsKLSAgICAgICAgcHJpdmF0ZSBKUmFkaW9CdXR0b24gICAgICAgc3RhdHVzX2NvbXBsZXRlID0gbnVsbDsKLSAgICAgICAgcHJpdmF0ZSBWZWN0b3IgICAgICAgICAgICAgZmlsdGVyX2luY2x1ZGVfbGlzdCA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgVmVjdG9yICAgICAgICAgICAgIGZpbHRlcl9leGNsdWRlX2xpc3QgPSBudWxsOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gICAgICAgICAgICBmaWx0ZXJfYWN0aXZlID0gZmFsc2U7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgICAgIGZpbHRlcl9jb21wbGV0ZSA9IGZhbHNlOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gICAgICAgICAgICBva19wcmVzc2VkID0gZmFsc2U7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENvbnN0cnVjdG9yCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgU09BUE1vbml0b3JGaWx0ZXIoKSB7Ci0gICAgICAgICAgICAvLyBCeSBkZWZhdWx0LCBleGNsdWRlIE5vdGlmaWNhdGlvblNlcnZpY2UgYW5kCi0gICAgICAgICAgICAvLyBFdmVudFZpZXdlclNlcnZpY2UgbWVzc2FnZXMKLSAgICAgICAgICAgIGZpbHRlcl9leGNsdWRlX2xpc3QgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAgICAgICBmaWx0ZXJfZXhjbHVkZV9saXN0LmFkZEVsZW1lbnQoIk5vdGlmaWNhdGlvblNlcnZpY2UiKTsKLSAgICAgICAgICAgIGZpbHRlcl9leGNsdWRlX2xpc3QuYWRkRWxlbWVudCgiRXZlbnRWaWV3ZXJTZXJ2aWNlIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0IGxpc3Qgb2Ygc2VydmljZXMgdG8gYmUgaW5jbHVkZWQKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBWZWN0b3IgZ2V0RmlsdGVySW5jbHVkZUxpc3QoKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmlsdGVyX2luY2x1ZGVfbGlzdDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXQgbGlzdCBvZiBzZXJ2aWNlcyB0byBiZSBleGNsdWRlZAotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFZlY3RvciBnZXRGaWx0ZXJFeGNsdWRlTGlzdCgpIHsKLSAgICAgICAgICAgIHJldHVybiBmaWx0ZXJfZXhjbHVkZV9saXN0OwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENoZWNrIGlmIGZpbHRlciBhY3RpdmUgbWVzc2FnZXMKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGdldEZpbHRlckFjdGl2ZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBmaWx0ZXJfYWN0aXZlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENoZWNrIGlmIGZpbHRlciBjb21wbGV0ZSBtZXNzYWdlcwotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGJvb2xlYW4gZ2V0RmlsdGVyQ29tcGxldGUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmlsdGVyX2NvbXBsZXRlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNob3cgdGhlIGZpbHRlciBkaWFsb2cKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHNob3dEaWFsb2coKSB7Ci0gICAgICAgICAgICBlbXB0eV9ib3JkZXIgPSBuZXcgRW1wdHlCb3JkZXIoNSw1LDAsNSk7Ci0gICAgICAgICAgICBpbmRlbnRfYm9yZGVyID0gbmV3IEVtcHR5Qm9yZGVyKDUsMjUsNSw1KTsKLSAgICAgICAgICAgIGluY2x1ZGVfcGFuZWwgPSBuZXcgU2VydmljZUZpbHRlclBhbmVsKCJJbmNsdWRlIG1lc3NhZ2VzIGJhc2VkIG9uIHRhcmdldCBzZXJ2aWNlOiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfaW5jbHVkZV9saXN0KTsKLSAgICAgICAgICAgIGV4Y2x1ZGVfcGFuZWwgPSBuZXcgU2VydmljZUZpbHRlclBhbmVsKCJFeGNsdWRlIG1lc3NhZ2VzIGJhc2VkIG9uIHRhcmdldCBzZXJ2aWNlOiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfZXhjbHVkZV9saXN0KTsKLSAgICAgICAgICAgIHN0YXR1c19ib3ggPSBuZXcgSkNoZWNrQm94KCJGaWx0ZXIgbWVzc2FnZXMgYmFzZWQgb24gc3RhdHVzOiIpOwotICAgICAgICAgICAgc3RhdHVzX2JveC5hZGRBY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgICAgIHN0YXR1c19hY3RpdmUgPSBuZXcgSlJhZGlvQnV0dG9uKCJBY3RpdmUgbWVzc2FnZXMgb25seSIpOwotICAgICAgICAgICAgc3RhdHVzX2FjdGl2ZS5zZXRTZWxlY3RlZCh0cnVlKTsKLSAgICAgICAgICAgIHN0YXR1c19hY3RpdmUuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICBzdGF0dXNfY29tcGxldGUgPSBuZXcgSlJhZGlvQnV0dG9uKCJDb21wbGV0ZSBtZXNzYWdlcyBvbmx5Iik7Ci0gICAgICAgICAgICBzdGF0dXNfY29tcGxldGUuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICBzdGF0dXNfZ3JvdXAgPSBuZXcgQnV0dG9uR3JvdXAoKTsKLSAgICAgICAgICAgIHN0YXR1c19ncm91cC5hZGQoc3RhdHVzX2FjdGl2ZSk7Ci0gICAgICAgICAgICBzdGF0dXNfZ3JvdXAuYWRkKHN0YXR1c19jb21wbGV0ZSk7Ci0gICAgICAgICAgICBpZiAoZmlsdGVyX2FjdGl2ZSB8fCBmaWx0ZXJfY29tcGxldGUpIHsKLSAgICAgICAgICAgICAgICBzdGF0dXNfYm94LnNldFNlbGVjdGVkKHRydWUpOwotICAgICAgICAgICAgICAgIHN0YXR1c19hY3RpdmUuc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICBzdGF0dXNfY29tcGxldGUuc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICBpZiAoZmlsdGVyX2NvbXBsZXRlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXR1c19jb21wbGV0ZS5zZXRTZWxlY3RlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdGF0dXNfb3B0aW9ucyA9IG5ldyBKUGFuZWwoKTsKLSAgICAgICAgICAgIHN0YXR1c19vcHRpb25zLnNldExheW91dChuZXcgQm94TGF5b3V0KHN0YXR1c19vcHRpb25zLCBCb3hMYXlvdXQuWV9BWElTKSk7Ci0gICAgICAgICAgICBzdGF0dXNfb3B0aW9ucy5hZGQoc3RhdHVzX2FjdGl2ZSk7Ci0gICAgICAgICAgICBzdGF0dXNfb3B0aW9ucy5hZGQoc3RhdHVzX2NvbXBsZXRlKTsKLSAgICAgICAgICAgIHN0YXR1c19vcHRpb25zLnNldEJvcmRlcihpbmRlbnRfYm9yZGVyKTsKLSAgICAgICAgICAgIHN0YXR1c19wYW5lbCA9IG5ldyBKUGFuZWwoKTsKLSAgICAgICAgICAgIHN0YXR1c19wYW5lbC5zZXRMYXlvdXQobmV3IEJvcmRlckxheW91dCgpKTsKLSAgICAgICAgICAgIHN0YXR1c19wYW5lbC5hZGQoc3RhdHVzX2JveCwgQm9yZGVyTGF5b3V0Lk5PUlRIKTsKLSAgICAgICAgICAgIHN0YXR1c19wYW5lbC5hZGQoc3RhdHVzX29wdGlvbnMsIEJvcmRlckxheW91dC5DRU5URVIpOwotICAgICAgICAgICAgc3RhdHVzX3BhbmVsLnNldEJvcmRlcihlbXB0eV9ib3JkZXIpOwotICAgICAgICAgICAgb2tfYnV0dG9uID0gbmV3IEpCdXR0b24oIk9rIik7Ci0gICAgICAgICAgICBva19idXR0b24uYWRkQWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgICAgICBjYW5jZWxfYnV0dG9uID0gbmV3IEpCdXR0b24oIkNhbmNlbCIpOwotICAgICAgICAgICAgY2FuY2VsX2J1dHRvbi5hZGRBY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgICAgIGJ1dHRvbnMgPSBuZXcgSlBhbmVsKCk7Ci0gICAgICAgICAgICBidXR0b25zLnNldExheW91dChuZXcgRmxvd0xheW91dCgpKTsKLSAgICAgICAgICAgIGJ1dHRvbnMuYWRkKG9rX2J1dHRvbik7Ci0gICAgICAgICAgICBidXR0b25zLmFkZChjYW5jZWxfYnV0dG9uKTsKLSAgICAgICAgICAgIHBhbmVsID0gbmV3IEpQYW5lbCgpOwotICAgICAgICAgICAgcGFuZWwuc2V0TGF5b3V0KG5ldyBCb3hMYXlvdXQocGFuZWwsIEJveExheW91dC5ZX0FYSVMpKTsKLSAgICAgICAgICAgIHBhbmVsLmFkZChpbmNsdWRlX3BhbmVsKTsKLSAgICAgICAgICAgIHBhbmVsLmFkZChleGNsdWRlX3BhbmVsKTsKLSAgICAgICAgICAgIHBhbmVsLmFkZChzdGF0dXNfcGFuZWwpOwotICAgICAgICAgICAgcGFuZWwuYWRkKGJ1dHRvbnMpOwotICAgICAgICAgICAgZGlhbG9nID0gbmV3IEpEaWFsb2coKTsKLSAgICAgICAgICAgIGRpYWxvZy5zZXRUaXRsZSgiU09BUCBNb25pdG9yIEZpbHRlciIpOwotICAgICAgICAgICAgZGlhbG9nLnNldENvbnRlbnRQYW5lKHBhbmVsKTsKLSAgICAgICAgICAgIGRpYWxvZy5zZXREZWZhdWx0Q2xvc2VPcGVyYXRpb24oV2luZG93Q29uc3RhbnRzLkRJU1BPU0VfT05fQ0xPU0UpOwotICAgICAgICAgICAgZGlhbG9nLnNldE1vZGFsKHRydWUpOwotICAgICAgICAgICAgZGlhbG9nLnBhY2soKTsKLSAgICAgICAgICAgIERpbWVuc2lvbiBkID0gZGlhbG9nLmdldFRvb2xraXQoKS5nZXRTY3JlZW5TaXplKCk7Ci0gICAgICAgICAgICBkaWFsb2cuc2V0TG9jYXRpb24oKGQud2lkdGgtZGlhbG9nLmdldFdpZHRoKCkpLzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGQuaGVpZ2h0LWRpYWxvZy5nZXRIZWlnaHQoKSkvMik7Ci0gICAgICAgICAgICBva19wcmVzc2VkID0gZmFsc2U7Ci0gICAgICAgICAgICBkaWFsb2cuc2hvdygpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIExpc3RlbmVyIHRvIGhhbmRsZSBidXR0b24gYWN0aW9ucwotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSB1c2VyIHByZXNzZWQgdGhlIG9rIGJ1dHRvbgotICAgICAgICAgICAgaWYgKGUuZ2V0U291cmNlKCkgPT0gb2tfYnV0dG9uKSB7Ci0gICAgICAgICAgICAgICAgZmlsdGVyX2luY2x1ZGVfbGlzdCA9IGluY2x1ZGVfcGFuZWwuZ2V0U2VydmljZUxpc3QoKTsKLSAgICAgICAgICAgICAgICBmaWx0ZXJfZXhjbHVkZV9saXN0ID0gZXhjbHVkZV9wYW5lbC5nZXRTZXJ2aWNlTGlzdCgpOwotICAgICAgICAgICAgICAgIGlmIChzdGF0dXNfYm94LmlzU2VsZWN0ZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfYWN0aXZlID0gc3RhdHVzX2FjdGl2ZS5pc1NlbGVjdGVkKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZpbHRlcl9jb21wbGV0ZSA9IHN0YXR1c19jb21wbGV0ZS5pc1NlbGVjdGVkKCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZmlsdGVyX2FjdGl2ZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfY29tcGxldGUgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb2tfcHJlc3NlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgZGlhbG9nLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSB1c2VyIHByZXNzZWQgdGhlIGNhbmNlbCBidXR0b24KLSAgICAgICAgICAgIGlmIChlLmdldFNvdXJjZSgpID09IGNhbmNlbF9idXR0b24pIHsKLSAgICAgICAgICAgICAgICBkaWFsb2cuZGlzcG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHVzZXIgY2hhbmdlZCB0aGUgc3RhdHVzIGZpbHRlciBvcHRpb24KLSAgICAgICAgICAgIGlmIChlLmdldFNvdXJjZSgpID09IHN0YXR1c19ib3gpIHsKLSAgICAgICAgICAgICAgICBzdGF0dXNfYWN0aXZlLnNldEVuYWJsZWQoc3RhdHVzX2JveC5pc1NlbGVjdGVkKCkpOwotICAgICAgICAgICAgICAgIHN0YXR1c19jb21wbGV0ZS5zZXRFbmFibGVkKHN0YXR1c19ib3guaXNTZWxlY3RlZCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDaGVjayBpZiB0aGUgdXNlciBwcmVzc2VkIHRoZSBvayBidXR0b24KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBib29sZWFuIG9rUHJlc3NlZCgpIHsKLSAgICAgICAgICAgIHJldHVybiBva19wcmVzc2VkOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGV4dCBwYW5lbCBjbGFzcyB0aGF0IHN1cHBvcnRzIFhNTCByZWZsb3cKLSAgICAgKi8KLSAgICBjbGFzcyBTT0FQTW9uaXRvclRleHRBcmVhIGV4dGVuZHMgSlRleHRBcmVhIHsKLQotICAgICAgICAvKioKLSAgICAgICAgICogUHJpdmF0ZSBkYXRhCi0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gZm9ybWF0ID0gZmFsc2U7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nICBvcmlnaW5hbCA9ICIiOwotICAgICAgICBwcml2YXRlIFN0cmluZyAgZm9ybWF0dGVkID0gbnVsbDsgCi0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENvbnN0cnVjdG9yCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgU09BUE1vbml0b3JUZXh0QXJlYSgpIHsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogT3ZlcnJpZGUgc2V0VGV4dCB0byBkbyBmb3JtYXR0aW5nCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBzZXRUZXh0KFN0cmluZyB0ZXh0KSB7Ci0gICAgICAgICAgICBvcmlnaW5hbCA9IHRleHQ7Ci0gICAgICAgICAgICBmb3JtYXR0ZWQgPSBudWxsOwotICAgICAgICAgICAgaWYgKGZvcm1hdCkgewotICAgICAgICAgICAgICAgIGRvRm9ybWF0KCk7Ci0gICAgICAgICAgICAgICAgc3VwZXIuc2V0VGV4dChmb3JtYXR0ZWQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzdXBlci5zZXRUZXh0KG9yaWdpbmFsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUdXJuIHJlZmxvdyBvbiBvciBvZmYKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFJlZmxvd1hNTChib29sZWFuIHJlZmxvdykgewotICAgICAgICAgICAgZm9ybWF0ID0gcmVmbG93OwotICAgICAgICAgICAgaWYgKGZvcm1hdCkgewotICAgICAgICAgICAgICAgIGlmIChmb3JtYXR0ZWQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBkb0Zvcm1hdCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzdXBlci5zZXRUZXh0KGZvcm1hdHRlZCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHN1cGVyLnNldFRleHQob3JpZ2luYWwpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJlZmxvdyBYTUwKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIGRvRm9ybWF0KCkgewotICAgICAgICAgICAgVmVjdG9yICAgICAgIHBhcnRzID0gbmV3IFZlY3RvcigpOwotICAgICAgICAgICAgY2hhcltdICAgICAgIGNoYXJzID0gb3JpZ2luYWwudG9DaGFyQXJyYXkoKTsKLSAgICAgICAgICAgIGludCAgICAgICAgICBpbmRleCA9IDA7Ci0gICAgICAgICAgICBpbnQgICAgICAgICAgZmlyc3QgPSAwOwotICAgICAgICAgICAgU3RyaW5nICAgICAgIHBhcnQgPSBudWxsOwotICAgICAgICAgICAgd2hpbGUgKGluZGV4IDwgY2hhcnMubGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIHN0YXJ0IG9mIHRhZwotICAgICAgICAgICAgICAgIGlmIChjaGFyc1tpbmRleF0gPT0gJzwnKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIERpZCB3ZSBoYXZlIGRhdGEgYmVmb3JlIHRoaXMgdGFnPwotICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3QgPCBpbmRleCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcGFydCA9IG5ldyBTdHJpbmcoY2hhcnMsZmlyc3QsaW5kZXgtZmlyc3QpOwotICAgICAgICAgICAgICAgICAgICAgICAgcGFydCA9IHBhcnQudHJpbSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2F2ZSBub24td2hpdGVzcGFjZSBkYXRhCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFydC5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0cy5hZGRFbGVtZW50KHBhcnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIFNhdmUgdGhlIHN0YXJ0IG9mIHRhZwotICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGluZGV4OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBDaGVjayBmb3IgZW5kIG9mIHRhZwotICAgICAgICAgICAgICAgIGlmIChjaGFyc1tpbmRleF0gPT0gJz4nKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFNhdmUgdGhlIHRhZwotICAgICAgICAgICAgICAgICAgICBwYXJ0ID0gbmV3IFN0cmluZyhjaGFycyxmaXJzdCxpbmRleC1maXJzdCsxKTsKLSAgICAgICAgICAgICAgICAgICAgcGFydHMuYWRkRWxlbWVudChwYXJ0KTsKLSAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBpbmRleCsxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBDaGVjayBmb3IgZW5kIG9mIGxpbmUKLSAgICAgICAgICAgICAgICBpZiAoKGNoYXJzW2luZGV4XSA9PSAnXG4nKSB8fCAoY2hhcnNbaW5kZXhdID09ICdccicpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFdhcyB0aGVyZSBkYXRhIG9uIHRoaXMgbGluZT8KLSAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0IDwgaW5kZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcnQgPSBuZXcgU3RyaW5nKGNoYXJzLGZpcnN0LGluZGV4LWZpcnN0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcnQgPSBwYXJ0LnRyaW0oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNhdmUgbm9uLXdoaXRlc3BhY2UgZGF0YQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnQubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydHMuYWRkRWxlbWVudChwYXJ0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGluZGV4KzE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGluZGV4Kys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBSZWZsb3cgYXMgWE1MCi0gICAgICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgT2JqZWN0W10gbGlzdCA9IHBhcnRzLnRvQXJyYXkoKTsKLSAgICAgICAgICAgIGludCBpbmRlbnQgPSAwOwotICAgICAgICAgICAgaW50IHBhZCA9IDA7Ci0gICAgICAgICAgICBpbmRleCA9IDA7Ci0gICAgICAgICAgICB3aGlsZSAoaW5kZXggPCBsaXN0Lmxlbmd0aCkgewotICAgICAgICAgICAgICAgIHBhcnQgPSAoU3RyaW5nKSBsaXN0W2luZGV4XTsKLSAgICAgICAgICAgICAgICBpZiAoYnVmLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSnVzdCBhZGQgZmlyc3QgdGFnIChzaG91bGQgYmUgWE1MIGhlYWRlcikKLSAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZChwYXJ0KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBBbGwgb3RoZXIgcGFydHMgbmVlZCB0byBzdGFydCBvbiBhIG5ldyBsaW5lCi0gICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoJ1xuJyk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIElmIHdlJ3JlIGF0IGFuIGVuZCB0YWcgdGhlbiBkZWNyZWFzZSBpbmRlbnQKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnQuc3RhcnRzV2l0aCgiPC8iKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50LS07Ci0gICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgLy8gQWRkIGFueSBpbmRlbnQKLSAgICAgICAgICAgICAgICAgICAgZm9yIChwYWQgPSAwOyBwYWQgPCBpbmRlbnQ7IHBhZCsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCIgICIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIEFkZCB0aGUgdGFnIG9yIGRhdGEKLSAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZChwYXJ0KTsKLSAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBpcyBhIHN0YXJ0IHRhZyB0aGVuIGluY3JlYXNlIGluZGVudAotICAgICAgICAgICAgICAgICAgICBpZiAocGFydC5zdGFydHNXaXRoKCI8IikgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICFwYXJ0LnN0YXJ0c1dpdGgoIjwvIikgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICFwYXJ0LmVuZHNXaXRoKCIvPiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciBzcGVjaWFsIDx0YWc+ZGF0YTwvdGFnPiBjYXNlCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGluZGV4ICsgMikgPCBsaXN0Lmxlbmd0aCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnQgPSAoU3RyaW5nKSBsaXN0W2luZGV4KzJdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJ0LnN0YXJ0c1dpdGgoIjwvIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydCA9IChTdHJpbmcpIGxpc3RbaW5kZXgrMV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFydC5zdGFydHNXaXRoKCI8IikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQocGFydCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0ID0gKFN0cmluZykgbGlzdFtpbmRleCsyXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQocGFydCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCA9IGluZGV4ICsgMjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGVudC0tOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGluZGV4Kys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3JtYXR0ZWQgPSBuZXcgU3RyaW5nKGJ1Zik7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zb2FwbW9uaXRvci9zcmMvb3JnL2FwYWNoZS9heGlzMi9zb2FwbW9uaXRvci9zZXJ2bGV0L1NPQVBNb25pdG9yQ29uc3RhbnRzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9zb2FwbW9uaXRvci9zcmMvb3JnL2FwYWNoZS9heGlzMi9zb2FwbW9uaXRvci9zZXJ2bGV0L1NPQVBNb25pdG9yQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0MGIwNDcuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc29hcG1vbml0b3Ivc3JjL29yZy9hcGFjaGUvYXhpczIvc29hcG1vbml0b3Ivc2VydmxldC9TT0FQTW9uaXRvckNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNvYXBtb25pdG9yLnNlcnZsZXQ7Ci0KLS8qKgotICogU09BUCBNb25pdG9yIFNlcnZpY2UgY29uc3RhbnRzCi0gKi8KLQotcHVibGljIGNsYXNzIFNPQVBNb25pdG9yQ29uc3RhbnRzIHsKLQotICAvKioKLSAgICogU09BUCBtZXNzYWdlIHR5cGVzCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTT0FQX01PTklUT1JfUkVRVUVTVCAgPSAwOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTT0FQX01PTklUT1JfUkVTUE9OU0UgPSAxOwotCi0gIC8qKiAKLSAgICogU2VydmxldCBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXIgbmFtZXMKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNPQVBfTU9OSVRPUl9QT1JUID0gIlNPQVBNb25pdG9yUG9ydCI7Ci0KLSAgLyoqCi0gICAqIFVuaXF1ZSBTT0FQIG1vbml0b3IgaWQgdGFnCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTT0FQX01PTklUT1JfSUQgPSAiU09BUE1vbml0b3JJZCI7Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zb2FwbW9uaXRvci9zcmMvb3JnL2FwYWNoZS9heGlzMi9zb2FwbW9uaXRvci9zZXJ2bGV0L1NPQVBNb25pdG9yU2VydmljZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvc29hcG1vbml0b3Ivc3JjL29yZy9hcGFjaGUvYXhpczIvc29hcG1vbml0b3Ivc2VydmxldC9TT0FQTW9uaXRvclNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRkZGIzNC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zb2FwbW9uaXRvci9zcmMvb3JnL2FwYWNoZS9heGlzMi9zb2FwbW9uaXRvci9zZXJ2bGV0L1NPQVBNb25pdG9yU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zb2FwbW9uaXRvci5zZXJ2bGV0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb25maWc7Ci1pbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldDsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OwotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5TZXJ2ZXJTb2NrZXQ7Ci1pbXBvcnQgamF2YS5uZXQuU29ja2V0OwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi0vKioKLSAqIFRoaXMgaXMgYSBTT0FQIE1vbml0b3IgU2VydmljZSBjbGFzcy4gCi0gKgotICogRHVyaW5nIHRoZSBIVFRQIHNlcnZlciBzdGFydHVwLCB0aGUgc2VydmxldCBpbml0IG1ldGhvZCAKLSAqIGlzIGludm9rZWQuICBUaGlzIGFsbG93cyB0aGUgY29kZSB0byBvcGVuIGEgc2VydmVyIAotICogc29ja2V0IHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNvbW11bmljYXRlIHdpdGggcnVubmluZyAKLSAqIGFwcGxldHMuCi0gKgotICogV2hlbiBhbiBIVFRQIEdFVCByZXF1ZXN0IGlzIHJlY2VpdmVkLCB0aGUgc2VydmxldCAKLSAqIGR5bmFtaWNhbGx5IHByb2R1Y2VzIGFuIEhUTUwgZG9jdW1lbnQgdG8gbG9hZCB0aGUgU09BUCAKLSAqIG1vbml0b3IgYXBwbGV0IGFuZCBzdXBwbHkgdGhlIHBvcnQgbnVtYmVyIGJlaW5nIHVzZWQgYnkKLSAqIHRoZSBzZXJ2ZXIgc29ja2V0IChzbyB0aGUgYXBwbGV0IHdpbGwga25vdyBob3cgdG8gCi0gKiBjb25uZWN0IGJhY2sgdG8gdGhlIHNlcnZlcikuCi0gKgotICogRWFjaCB0aW1lIGEgc29ja2V0IGNvbm5lY3Rpb24gaXMgZXN0YWJsaXNoZWQsIGEgbmV3IAotICogdGhyZWFkIGlzIGNyZWF0ZWQgdG8gaGFuZGxlIGNvbW11bmljYXRpb25zIGZyb20gdGhlIAotICogYXBwbGV0LgotICoKLSAqIFRoZSBwdWJsaXNoTWV0aG9kIHJvdXRpbmUgaXMgaW52b2tlZCBieSB0aGUgU09BUCBtb25pdG9yCi0gKiBoYW5kbGVyIHdoZW4gYSBTT0FQIG1lc3NhZ2UgcmVxdWVzdCBvciByZXNwb25zZSBpcyAKLSAqIGRldGVjdGVkLiAgVGhlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBTT0FQIG1lc3NhZ2UgaXMgCi0gKiB0aGVuIGZvcndhcmVkIHRvIGFsbCBjdXJyZW50IHNvY2tldCBjb25uZWN0aW9ucyBmb3IgCi0gKiBkaXNwbGF5IGJ5IHRoZSBhcHBsZXQuCi0gKi8KLQotcHVibGljIGNsYXNzIFNPQVBNb25pdG9yU2VydmljZSBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKLQotICAvKioKLSAgICogUHJpdmF0ZSBkYXRhIAotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgU2VydmVyU29ja2V0IHNlcnZlcl9zb2NrZXQgPSBudWxsOwotICBwcml2YXRlIHN0YXRpYyBWZWN0b3IgICAgICAgY29ubmVjdGlvbnMgPSBudWxsOwotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhTT0FQTW9uaXRvclNlcnZpY2UuY2xhc3MpOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvcgotICAgKi8KLSAgcHVibGljIFNPQVBNb25pdG9yU2VydmljZSgpIHsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFB1Ymxpc2ggYSBTT0FQIG1lc3NhZ2UgdG8gbGlzdGVuZXJzCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgcHVibGlzaE1lc3NhZ2UoTG9uZyBpZCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyIHR5cGUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRhcmdldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzb2FwKSB7Ci0gICAgaWYgKGNvbm5lY3Rpb25zICE9IG51bGwpIHsKLSAgICAgIEVudW1lcmF0aW9uIGUgPSBjb25uZWN0aW9ucy5lbGVtZW50cygpOwotICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgQ29ubmVjdGlvblRocmVhZCBjdCA9IChDb25uZWN0aW9uVGhyZWFkKSBlLm5leHRFbGVtZW50KCk7Ci0gICAgICAgIGN0LnB1Ymxpc2hNZXNzYWdlKGlkLHR5cGUsdGFyZ2V0LHNvYXApOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBTZXJ2bGV0IGluaXRpYWxpYXRpb24KLSAgICovCi0gIHB1YmxpYyB2b2lkIGluaXQoKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiB7Ci0gICAgaWYgKGNvbm5lY3Rpb25zID09IG51bGwpIHsKLSAgICAgIC8vIENyZWF0ZSB2ZWN0b3IgdG8gaG9sZCBjb25uZWN0aW9uIGluZm9ybWF0aW9uCi0gICAgICBjb25uZWN0aW9ucyA9IG5ldyBWZWN0b3IoKTsKLSAgICB9Ci0gICAgaWYgKHNlcnZlcl9zb2NrZXQgPT0gbnVsbCkgewotICAgICAgLy8gR2V0IHRoZSBzZXJ2ZXIgc29ja2V0IHBvcnQgZnJvbSB0aGUgaW5pdCBwYXJhbXMKLSAgICAgIFNlcnZsZXRDb25maWcgY29uZmlnID0gc3VwZXIuZ2V0U2VydmxldENvbmZpZygpOwotICAgICAgU3RyaW5nIHBvcnQgPSBjb25maWcuZ2V0SW5pdFBhcmFtZXRlcihTT0FQTW9uaXRvckNvbnN0YW50cy5TT0FQX01PTklUT1JfUE9SVCk7Ci0gICAgICBpZiAocG9ydCA9PSBudWxsKSB7Ci0gICAgICAgIGxvZy5lcnJvcigiU09BUE1vbml0b3JTZXJ2aWNlIGNhbid0IGZpbmQgU2VydmxldENvbmZpZyBpbml0IHBhcmFtZXRlciAncG9ydCciKTsKLSAgICAgICAgcG9ydCA9ICIwIjsKLSAgICAgIH0KLSAgICAgIHRyeSB7Ci0gICAgICAgIC8vIFRyeSB0byBvcGVuIHRoZSBzZXJ2ZXIgc29ja2V0Ci0gICAgICAgIHNlcnZlcl9zb2NrZXQgPSBuZXcgU2VydmVyU29ja2V0KEludGVnZXIucGFyc2VJbnQocG9ydCkpOwotICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgIC8vIExldCBzb21lb25lIGtub3cgd2UgY291bGQgbm90IG9wZW4gdGhlIHNvY2tldAotICAgICAgICBsb2cuZXJyb3IoIlVuYWJsZSB0byBvcGVuIHNlcnZlciBzb2NrZXQgdXNpbmcgcG9ydDogIiArIHBvcnQpOwotICAgICAgICBsb2cuZXJyb3IoZXguZ2V0TWVzc2FnZSgpLCBleCk7Ci0gICAgICAgIC8vIEZhaWwgYXMgbG91ZGx5IGFzIHBvc3NpYmxlIGZvciB0aG9zZSB3aXRob3V0IGxvZ2dpbmcgY29uZmlndXJlZAotICAgICAgICBjb25maWcuZ2V0U2VydmxldENvbnRleHQoKS5sb2coIlVuYWJsZSB0byBvcGVuIHNlcnZlciBzb2NrZXQgdXNpbmcgcG9ydCAiK3BvcnQrIjoiLCBleCk7Ci0gICAgICAgIHNlcnZlcl9zb2NrZXQgPSBudWxsOwotICAgICAgfQotICAgICAgaWYgKHNlcnZlcl9zb2NrZXQgIT0gbnVsbCkgewotICAgICAgICAvLyBTdGFydCB0aGUgc2VydmVyIHNvY2tldCB0aHJlYWQKLSAgICAgICAgbmV3IFRocmVhZChuZXcgU2VydmVyU29ja2V0VGhyZWFkKCkpLnN0YXJ0KCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFNlcnZsZXQgdGVybWluYXRpb24KLSAgICovCi0gIHB1YmxpYyB2b2lkIGRlc3Ryb3koKSB7Ci0gICAgLy8gRW5kIGFsbCBjb25uZWN0aW9uIHRocmVhZHMKLSAgICBFbnVtZXJhdGlvbiBlID0gY29ubmVjdGlvbnMuZWxlbWVudHMoKTsKLSAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgQ29ubmVjdGlvblRocmVhZCBjdCA9IChDb25uZWN0aW9uVGhyZWFkKSBlLm5leHRFbGVtZW50KCk7Ci0gICAgICBjdC5jbG9zZSgpOwotICAgIH0KLSAgICAvLyBFbmQgbWFpbiBzZXJ2ZXIgc29ja2V0IHRocmVhZAotICAgIGlmIChzZXJ2ZXJfc29ja2V0ICE9IG51bGwpIHsKLSAgICAgIHRyeSB7Ci0gICAgICAgIHNlcnZlcl9zb2NrZXQuY2xvc2UoKTsKLSAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiB4KSB7fQotICAgICAgc2VydmVyX3NvY2tldCA9IG51bGw7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEhUVFAgR0VUIHJlcXVlc3QKLSAgICovCi0gIHB1YmxpYyB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQotICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24KLSAgewotICAgLy8gQ3JlYXRlIEhUTUwgdG8gbG9hZCB0aGUgU09BUCBtb25pdG9yIGFwcGxldAotICAgaW50IHBvcnQgPSAwOwotICAgaWYgKHNlcnZlcl9zb2NrZXQgIT0gbnVsbCkgewotICAgICBwb3J0ID0gc2VydmVyX3NvY2tldC5nZXRMb2NhbFBvcnQoKTsKLSAgICAgbG9nLmRlYnVnKCJTZW5kaW5nIHBhcmFtIHRvIFNPQVAgbW9uaXRvciBhcHBsZXQgYXMgcG9ydDogIiArIHBvcnQpOwotICAgfQotICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoInRleHQvaHRtbCIpOwotICAgcmVzcG9uc2UuZ2V0V3JpdGVyKCkucHJpbnRsbigiPGh0bWw+Iik7Ci0gICByZXNwb25zZS5nZXRXcml0ZXIoKS5wcmludGxuKCI8aGVhZD4iKTsKLSAgIHJlc3BvbnNlLmdldFdyaXRlcigpLnByaW50bG4oIjx0aXRsZT5TT0FQIE1vbml0b3I8L3RpdGxlPiIpOwotICAgcmVzcG9uc2UuZ2V0V3JpdGVyKCkucHJpbnRsbigiPC9oZWFkPiIpOwotICAgcmVzcG9uc2UuZ2V0V3JpdGVyKCkucHJpbnRsbigiPGJvZHk+Iik7Ci0gICByZXNwb25zZS5nZXRXcml0ZXIoKS5wcmludGxuKCI8b2JqZWN0IGNsYXNzaWQ9XCJjbHNpZDo4QUQ5Qzg0MC0wNDRFLTExRDEtQjNFOS0wMDgwNUY0OTlEOTNcIiB3aWR0aD0xMDAlIGhlaWdodD0xMDAlIGNvZGViYXNlPVwiaHR0cDovL2phdmEuc3VuLmNvbS9wcm9kdWN0cy9wbHVnaW4vMS4zL2ppbnN0YWxsLTEzLXdpbjMyLmNhYiNWZXJzaW9uPTEsMywwLDBcIj4iKTsKLSAgIHJlc3BvbnNlLmdldFdyaXRlcigpLnByaW50bG4oIjxwYXJhbSBuYW1lPWNvZGUgdmFsdWU9b3JnLmFwYWNoZS5heGlzMi5zb2FwbW9uaXRvci5hcHBsZXQuU09BUE1vbml0b3JBcHBsZXQuY2xhc3M+Iik7Ci0gICByZXNwb25zZS5nZXRXcml0ZXIoKS5wcmludGxuKCI8cGFyYW0gbmFtZT1cInR5cGVcIiB2YWx1ZT1cImFwcGxpY2F0aW9uL3gtamF2YS1hcHBsZXQ7dmVyc2lvbj0xLjNcIj4iKTsKLSAgIHJlc3BvbnNlLmdldFdyaXRlcigpLnByaW50bG4oIjxwYXJhbSBuYW1lPVwic2NyaXB0YWJsZVwiIHZhbHVlPVwiZmFsc2VcIj4iKTsKLSAgIHJlc3BvbnNlLmdldFdyaXRlcigpLnByaW50bG4oIjxwYXJhbSBuYW1lPVwicG9ydFwiIHZhbHVlPVwiIitwb3J0KyJcIj4iKTsKLSAgIHJlc3BvbnNlLmdldFdyaXRlcigpLnByaW50bG4oIjxjb21tZW50PiIpOwotICAgcmVzcG9uc2UuZ2V0V3JpdGVyKCkucHJpbnRsbigiPGVtYmVkIHR5cGU9XCJhcHBsaWNhdGlvbi94LWphdmEtYXBwbGV0O3ZlcnNpb249MS4zXCIgY29kZT1vcmcuYXBhY2hlLmF4aXMyLnNvYXBtb25pdG9yLmFwcGxldC5TT0FQTW9uaXRvckFwcGxldC5jbGFzcyB3aWR0aD0xMDAlIGhlaWdodD0xMDAlIHBvcnQ9XCIiK3BvcnQrIlwiIHNjcmlwdGFibGU9ZmFsc2UgcGx1Z2luc3BhZ2U9XCJodHRwOi8vamF2YS5zdW4uY29tL3Byb2R1Y3RzL3BsdWdpbi8xLjMvcGx1Z2luLWluc3RhbGwuaHRtbFwiPiIpOyAKLSAgIHJlc3BvbnNlLmdldFdyaXRlcigpLnByaW50bG4oIjxub2VtYmVkPiIpOyAKLSAgIHJlc3BvbnNlLmdldFdyaXRlcigpLnByaW50bG4oIjwvY29tbWVudD4iKTsgCi0gICByZXNwb25zZS5nZXRXcml0ZXIoKS5wcmludGxuKCI8L25vZW1iZWQ+Iik7IAotICAgcmVzcG9uc2UuZ2V0V3JpdGVyKCkucHJpbnRsbigiPC9lbWJlZD4iKTsgCi0gICByZXNwb25zZS5nZXRXcml0ZXIoKS5wcmludGxuKCI8L29iamVjdD4iKTsKLSAgIHJlc3BvbnNlLmdldFdyaXRlcigpLnByaW50bG4oIjwvYm9keT4iKTsKLSAgIHJlc3BvbnNlLmdldFdyaXRlcigpLnByaW50bG4oIjwvaHRtbD4iKTsKLSAgfQotCi0gIC8qKgotICAgKiBUaHJlYWQgY2xhc3MgZm9yIGhhbmRsaW5nIHRoZSBzZXJ2ZXIgc29ja2V0Ci0gICAqLwotICBjbGFzcyBTZXJ2ZXJTb2NrZXRUaHJlYWQgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0KLSAgICAvKioKLSAgICAgKiBUaHJlYWQgZm9yIGhhbmRsaW5nIHRoZSBzZXJ2ZXIgc29ja2V0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgLy8gV2FpdCBmb3Igc29ja2V0IGNvbm5lY3Rpb25zCi0gICAgICB3aGlsZSAoc2VydmVyX3NvY2tldCAhPSBudWxsKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgU29ja2V0IHNvY2tldCA9IHNlcnZlcl9zb2NrZXQuYWNjZXB0KCk7Ci0gICAgICAgICAgbmV3IFRocmVhZChuZXcgQ29ubmVjdGlvblRocmVhZChzb2NrZXQpKS5zdGFydCgpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHt9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFRocmVhZCBjbGFzcyBmb3IgaGFuZGxpbmcgc29ja2V0IGNvbm5lY3Rpb25zCi0gICAqLwotICBjbGFzcyBDb25uZWN0aW9uVGhyZWFkIGltcGxlbWVudHMgUnVubmFibGUgewotCi0gICAgcHJpdmF0ZSBTb2NrZXQgICAgICAgICAgICAgc29ja2V0ID0gbnVsbDsKLSAgICBwcml2YXRlIE9iamVjdElucHV0U3RyZWFtICBpbiA9IG51bGw7Ci0gICAgcHJpdmF0ZSBPYmplY3RPdXRwdXRTdHJlYW0gb3V0ID0gbnVsbDsKLSAgICBwcml2YXRlIGJvb2xlYW4gICAgICAgICAgICBjbG9zZWQgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yCi0gICAgICovCi0gICAgcHVibGljIENvbm5lY3Rpb25UaHJlYWQoU29ja2V0IHMpIHsKLSAgICAgIHNvY2tldCA9IHM7Ci0gICAgICB0cnkgewotICAgICAgICAvLyBVc2Ugb2JqZWN0IHN0cmVhbXMgZm9yIGlucHV0IGFuZCBvdXRwdXQKLSAgICAgICAgLy8KLSAgICAgICAgLy8gTk9URTogV2UgbmVlZCB0byBiZSBzdXJlIHRvIGNyZWF0ZSBhbmQgZmx1c2ggdGhlIAotICAgICAgICAvLyBvdXRwdXQgc3RyZWFtIGZpcnN0IGJlY2F1c2UgdGhlIE9iamVjdE91dHB1dFN0cmVhbQotICAgICAgICAvLyBjb25zdHJ1Y3RvciB3cml0ZXMgYSBoZWFkZXIgdG8gdGhlIHN0cmVhbSB0aGF0IGlzCi0gICAgICAgIC8vIG5lZWRlZCBieSB0aGUgT2JqZWN0SW5wdXRTdHJlYW0gb24gdGhlIG90aGVyIGVuZAotICAgICAgICBvdXQgPSBuZXcgT2JqZWN0T3V0cHV0U3RyZWFtKHNvY2tldC5nZXRPdXRwdXRTdHJlYW0oKSk7Ci0gICAgICAgIG91dC5mbHVzaCgpOwotICAgICAgICBpbiA9IG5ldyBPYmplY3RJbnB1dFN0cmVhbShzb2NrZXQuZ2V0SW5wdXRTdHJlYW0oKSk7Ci0gICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkge30KLSAgICAgIC8vIEFkZCB0aGUgY29ubmVjdGlvbiB0byBvdXIgbGlzdAotICAgICAgc3luY2hyb25pemVkIChjb25uZWN0aW9ucykgewotICAgICAgICBjb25uZWN0aW9ucy5hZGRFbGVtZW50KHRoaXMpOwotICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENsb3NlIHRoZSBzb2NrZXQgY29ubmVjdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgewotICAgICAgY2xvc2VkID0gdHJ1ZTsKLSAgICAgIHRyeSB7Ci0gICAgICAgIHNvY2tldC5jbG9zZSgpOwotICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7fQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRocmVhZCB0byBoYW5kbGUgdGhlIHNvY2tldCBjb25uZWN0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgdHJ5IHsKLSAgICAgICAgd2hpbGUgKCFjbG9zZWQpIHsKLSAgICAgICAgICBPYmplY3QgbyA9IGluLnJlYWRPYmplY3QoKTsKLSAgICAgICAgfQotICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHt9Ci0gICAgICAvLyBDbGVhbnVwIGNvbm5lY3Rpb24gbGlzdAotICAgICAgc3luY2hyb25pemVkIChjb25uZWN0aW9ucykgewotICAgICAgICBjb25uZWN0aW9ucy5yZW1vdmVFbGVtZW50KHRoaXMpOwotICAgICAgfQotICAgICAgLy8gQ2xlYW51cCBJL08gc3RyZWFtcyAKLSAgICAgIGlmIChvdXQgIT0gbnVsbCkgewotICAgICAgICB0cnkgewotICAgICAgICAgIG91dC5jbG9zZSgpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHt9Ci0gICAgICAgIG91dCA9IG51bGw7Ci0gICAgICB9Ci0gICAgICBpZiAoaW4gIT0gbnVsbCkgewotICAgICAgICB0cnkgewotICAgICAgICAgIGluLmNsb3NlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkge30KLSAgICAgICAgaW4gPSBudWxsOwotICAgICAgfQotICAgICAgLy8gQmUgc3VyZSB0aGUgc29ja2V0IGlzIGNsb3NlZAotICAgICAgY2xvc2UoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQdWJsaXNoIFNPQVAgbWVzc2FnZSBpbmZvcm1hdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBwdWJsaXNoTWVzc2FnZShMb25nIGlkLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyIG1lc3NhZ2VfdHlwZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRhcmdldCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNvYXApIHsKLSAgICAgIC8vIElmIHdlIGhhdmUgYSB2YWxpZCBvdXRwdXQgc3RyZWFtLCB0aGVuCi0gICAgICAvLyBzZW5kIHRoZSBkYXRhIHRvIHRoZSBhcHBsZXQKLSAgICAgIGlmIChvdXQgIT0gbnVsbCkgewotICAgICAgICB0cnkgewotICAgICAgICAgIHN3aXRjaCAobWVzc2FnZV90eXBlLmludFZhbHVlKCkpIHsKLSAgICAgICAgICAgIGNhc2UgU09BUE1vbml0b3JDb25zdGFudHMuU09BUF9NT05JVE9SX1JFUVVFU1Q6Ci0gICAgICAgICAgICAgIG91dC53cml0ZU9iamVjdChtZXNzYWdlX3R5cGUpOwotICAgICAgICAgICAgICBvdXQud3JpdGVPYmplY3QoaWQpOwotICAgICAgICAgICAgICBvdXQud3JpdGVPYmplY3QodGFyZ2V0KTsKLSAgICAgICAgICAgICAgb3V0LndyaXRlT2JqZWN0KHNvYXApOwotICAgICAgICAgICAgICBvdXQuZmx1c2goKTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFNPQVBNb25pdG9yQ29uc3RhbnRzLlNPQVBfTU9OSVRPUl9SRVNQT05TRToKLSAgICAgICAgICAgICAgb3V0LndyaXRlT2JqZWN0KG1lc3NhZ2VfdHlwZSk7Ci0gICAgICAgICAgICAgIG91dC53cml0ZU9iamVjdChpZCk7Ci0gICAgICAgICAgICAgIG91dC53cml0ZU9iamVjdChzb2FwKTsKLSAgICAgICAgICAgICAgb3V0LmZsdXNoKCk7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHt9Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NwcmluZy9wb20ueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvc3ByaW5nL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyZGU0YjMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc3ByaW5nL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItcGFyZW50PC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4xLjUuMTwvdmVyc2lvbj4KLSAgICAgICAgPHJlbGF0aXZlUGF0aD4uLi9wYXJlbnQvcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgotICAgIDwvcGFyZW50PgotICAgIDxhcnRpZmFjdElkPmF4aXMyLXNwcmluZzwvYXJ0aWZhY3RJZD4KLSAgICA8bmFtZT5BcGFjaGUgQXhpczIgLSBzcHJpbmc8L25hbWU+Ci0gICAgPGRlc2NyaXB0aW9uPnNwcmluZyBmb3IgQXhpcyAyLjA8L2Rlc2NyaXB0aW9uPgotICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLWtlcm5lbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7dmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuc3ByaW5nZnJhbWV3b3JrPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+c3ByaW5nLWNvcmU8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuc3ByaW5nZnJhbWV3b3JrPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+c3ByaW5nLWJlYW5zPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLnNwcmluZ2ZyYW1ld29yazwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnNwcmluZy1jb250ZXh0PC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLnNwcmluZ2ZyYW1ld29yazwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnNwcmluZy13ZWI8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8L2RlcGVuZGVuY2llcz4KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxzb3VyY2VEaXJlY3Rvcnk+c3JjPC9zb3VyY2VEaXJlY3Rvcnk+Ci0gICAgICAgIDxyZXNvdXJjZXM+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT4uLi8uLjwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+Tk9USUNFLnR4dDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+TElDRU5TRS50eHQ8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgICAgICA8ZmlsdGVyaW5nPmZhbHNlPC9maWx0ZXJpbmc+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICA8L3Jlc291cmNlcz4KLSAgICA8L2J1aWxkPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc3ByaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2V4dGVuc2lvbnMvc3ByaW5nL3JlY2VpdmVycy9BcHBsaWNhdGlvbkNvbnRleHRIb2xkZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3NwcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9leHRlbnNpb25zL3NwcmluZy9yZWNlaXZlcnMvQXBwbGljYXRpb25Db250ZXh0SG9sZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1ZjU3YmYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc3ByaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2V4dGVuc2lvbnMvc3ByaW5nL3JlY2VpdmVycy9BcHBsaWNhdGlvbkNvbnRleHRIb2xkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5leHRlbnNpb25zLnNwcmluZy5yZWNlaXZlcnM7Ci0KLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLkJlYW5zRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuY29udGV4dC5BcHBsaWNhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5jb250ZXh0LkFwcGxpY2F0aW9uQ29udGV4dEF3YXJlOwotCi0vKioKLSAqIEltcGxlbWVudGF0aW9uIG9mIGEgU3ByaW5nIGludGVyZmFjZSB3aG8gaXMgY29uZmlndXJlZCBpbiBTcHJpbmcncyBhcHBsaWNhdGlvbkNvbnRleHQueG1sIG9yIHNvbWUKLSAqIG90aGVyIFNwcmluZyB0eXBlIG9mIHdheS4gVGhpcyBjbGFzcyBhbmQgdGhlIHNwcmluZyBiZWFuIG5lZWRlZCB0byB3aXJlIGl0IGNvdWxkIGJlIHVzZWQgYXMgYW4KLSAqIGFsdGVybmF0aXZlIHRvIGdldHRpbmcgdGhlIEFwcGxpY2F0aW9uQ29udGV4dCBmcm9tIHRoZSBTZXJ2bGV0Q29udGV4dC4KLSAqLwotcHVibGljIGNsYXNzIEFwcGxpY2F0aW9uQ29udGV4dEhvbGRlciBpbXBsZW1lbnRzIEFwcGxpY2F0aW9uQ29udGV4dEF3YXJlIHsKLQotICAgIHByaXZhdGUgc3RhdGljIEFwcGxpY2F0aW9uQ29udGV4dCBhcHBDdHg7Ci0KLSAgICBwdWJsaWMgQXBwbGljYXRpb25Db250ZXh0SG9sZGVyKCkgewotICAgIH0KLQotICAgIC8qKiBTcHJpbmcgc3VwcGxpZWQgaW50ZXJmYWNlIG1ldGhvZCBmb3IgaW5qZWN0aW5nIGFwcCBjb250ZXh0LiAqLwotICAgIHB1YmxpYyB2b2lkIHNldEFwcGxpY2F0aW9uQ29udGV4dChBcHBsaWNhdGlvbkNvbnRleHQgYXBwbGljYXRpb25Db250ZXh0KQotICAgICAgICAgICAgdGhyb3dzIEJlYW5zRXhjZXB0aW9uIHsKLSAgICAgICAgYXBwQ3R4ID0gYXBwbGljYXRpb25Db250ZXh0OwotICAgIH0KLQotICAgIC8qKiBBY2Nlc3MgdG8gc3ByaW5nIHdpcmVkIGJlYW5zLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgQXBwbGljYXRpb25Db250ZXh0IGdldENvbnRleHQoKSB7Ci0gICAgICAgIHJldHVybiBhcHBDdHg7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy9zcHJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvZXh0ZW5zaW9ucy9zcHJpbmcvcmVjZWl2ZXJzL1NwcmluZ0FwcENvbnRleHRBd2FyZU9iamVjdFN1cHBsaWVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9zcHJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvZXh0ZW5zaW9ucy9zcHJpbmcvcmVjZWl2ZXJzL1NwcmluZ0FwcENvbnRleHRBd2FyZU9iamVjdFN1cHBsaWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjYWZjNTYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc3ByaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2V4dGVuc2lvbnMvc3ByaW5nL3JlY2VpdmVycy9TcHJpbmdBcHBDb250ZXh0QXdhcmVPYmplY3RTdXBwbGllci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmV4dGVuc2lvbnMuc3ByaW5nLnJlY2VpdmVyczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuU2VydmljZU9iamVjdFN1cHBsaWVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5QYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pMThuLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuY29udGV4dC5BcHBsaWNhdGlvbkNvbnRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBTcHJpbmdBcHBDb250ZXh0QXdhcmVPYmplY3RTdXBwbGllciBpbXBsZW1lbnRzIFNlcnZpY2VPYmplY3RTdXBwbGllciB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWSUNFX1NQUklOR19CRUFOTkFNRSA9ICJTcHJpbmdCZWFuTmFtZSI7Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgZ2V0U2VydmljZU9iamVjdCB0aGF0IGlzIFNwcmluZyBhd2FyZSB2aWEgU3ByaW5nIGludGVyZmFjZSBBcHBsaWNhdGlvbkNvbnRleHRBd2FyZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBheGlzU2VydmljZQotICAgICAqIEByZXR1cm4gUmV0dXJucyBPYmplY3QuCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQKLSAgICAgKi8KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0U2VydmljZU9iamVjdChBeGlzU2VydmljZSBheGlzU2VydmljZSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBOYW1lIG9mIHNwcmluZyBhd2FyZSBiZWFuIHRvIGJlIGluamVjdGVkLCB0YWtlbiBmcm9tIHNlcnZpY2VzLnhtbAotICAgICAgICAgICAgLy8gdmlhICdTRVJWSUNFX1NQUklOR19CRUFOTkFNRSAnIC4gVGhlIEJlYW4gYW5kIGl0cyBwcm9wZXJ0aWVzIGFyZSBwcmUtY29uZmlndXJlZAotICAgICAgICAgICAgLy8gYXMgbm9ybWFsbHkgZG9uZSBpbiBhIHNwcmluZyB0eXBlIG9mIHdheSBhbmQgc3Vic2VxdWVudGx5IGxvYWRlZCBieSBTcHJpbmcuCi0gICAgICAgICAgICAvLyBBeGlzMiBqdXN0IGFzc3VtZXMgdGhhdCB0aGUgYmVhbiBpcyBjb25maWd1cmVkIGFuZCBpcyBpbiB0aGUgY2xhc3Nsb2FkZXIuCi0gICAgICAgICAgICBQYXJhbWV0ZXIgaW1wbEJlYW5QYXJhbSA9IGF4aXNTZXJ2aWNlLmdldFBhcmFtZXRlcihTRVJWSUNFX1NQUklOR19CRUFOTkFNRSk7Ci0gICAgICAgICAgICBTdHJpbmcgYmVhbk5hbWUgPSAoKFN0cmluZylpbXBsQmVhblBhcmFtLmdldFZhbHVlKCkpLnRyaW0oKTsKLSAgICAgICAgICAgIGlmIChiZWFuTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gQXBwbGljYXRpb25Db250ZXh0SG9sZGVyIGltcGxlbWVudHMgU3ByaW5nIGludGVyZmFjZSBBcHBsaWNhdGlvbkNvbnRleHRBd2FyZQotICAgICAgICAgICAgICAgIEFwcGxpY2F0aW9uQ29udGV4dCBhQ3R4ID0gQXBwbGljYXRpb25Db250ZXh0SG9sZGVyLmdldENvbnRleHQoKTsKLSAgICAgICAgICAgICAgICBpZiAoYUN0eCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIkF4aXMyIENhbid0IGZpbmQgU3ByaW5nJ3MgQXBwbGljYXRpb25Db250ZXh0Iik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhQ3R4LmdldEJlYW4oYmVhbk5hbWUpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiQXhpczIgQ2FuJ3QgZmluZCBTcHJpbmcgQmVhbjogIiArIGJlYW5OYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGFDdHguZ2V0QmVhbihiZWFuTmFtZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoCi0gICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRNZXNzYWdlKCJwYXJhbUlzTm90U3BlY2lmaWVkIiwgIlNFUlZJQ0VfU1BSSU5HX0JFQU5OQU1FIikpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvc3ByaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2V4dGVuc2lvbnMvc3ByaW5nL3JlY2VpdmVycy9TcHJpbmdTZXJ2bGV0Q29udGV4dE9iamVjdFN1cHBsaWVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy9zcHJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvZXh0ZW5zaW9ucy9zcHJpbmcvcmVjZWl2ZXJzL1NwcmluZ1NlcnZsZXRDb250ZXh0T2JqZWN0U3VwcGxpZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE1MmRkMy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy9zcHJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvZXh0ZW5zaW9ucy9zcHJpbmcvcmVjZWl2ZXJzL1NwcmluZ1NlcnZsZXRDb250ZXh0T2JqZWN0U3VwcGxpZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5leHRlbnNpb25zLnNwcmluZy5yZWNlaXZlcnM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLlNlcnZpY2VPYmplY3RTdXBwbGllcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaTE4bi5NZXNzYWdlczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkhUVFBDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5jb250ZXh0LkFwcGxpY2F0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5jb250ZXh0LnN1cHBvcnQuV2ViQXBwbGljYXRpb25Db250ZXh0VXRpbHM7Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb25maWc7Ci1pbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dDsKLQotcHVibGljIGNsYXNzIFNwcmluZ1NlcnZsZXRDb250ZXh0T2JqZWN0U3VwcGxpZXIgaW1wbGVtZW50cyBTZXJ2aWNlT2JqZWN0U3VwcGxpZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFNwcmluZ1NlcnZsZXRDb250ZXh0T2JqZWN0U3VwcGxpZXIuY2xhc3MpOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVklDRV9TUFJJTkdfQkVBTk5BTUUgPSAiU3ByaW5nQmVhbk5hbWUiOwotCi0gICAgLyoqCi0gICAgICogTWV0aG9kIGdldFNlcnZpY2VPYmplY3QgdGhhdCBpcyBTcHJpbmcgYXdhcmUgdmlhIFNlcnZsZXRDb250ZXh0LgotICAgICAqCi0gICAgICogQHBhcmFtIGF4aXNTZXJ2aWNlCi0gICAgICogQHJldHVybiBSZXR1cm5zIE9iamVjdC4KLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdAotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0U2VydmljZU9iamVjdChBeGlzU2VydmljZSBheGlzU2VydmljZSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBOYW1lIG9mIHNwcmluZyBhd2FyZSBiZWFuIHRvIGJlIGluamVjdGVkLCB0YWtlbiBmcm9tIHNlcnZpY2VzLnhtbAotICAgICAgICAgICAgLy8gdmlhICdTRVJWSUNFX1NQUklOR19CRUFOTkFNRSAnIC4gVGhlIEJlYW4gYW5kIGl0cyBwcm9wZXJ0aWVzIGFyZSBwcmUtY29uZmlndXJlZAotICAgICAgICAgICAgLy8gYXMgbm9ybWFsbHkgZG9uZSBpbiBhIHNwcmluZyB0eXBlIG9mIHdheSBhbmQgc3Vic2VxdWVudGx5IGxvYWRlZCBieSBTcHJpbmcuCi0gICAgICAgICAgICAvLyBBeGlzMiBqdXN0IGFzc3VtZXMgdGhhdCB0aGUgYmVhbiBpcyBjb25maWd1cmVkIGFuZCBpcyBpbiB0aGUgY2xhc3Nsb2FkZXIuCi0gICAgICAgICAgICBQYXJhbWV0ZXIgaW1wbEJlYW5QYXJhbSA9IGF4aXNTZXJ2aWNlLmdldFBhcmFtZXRlcihTRVJWSUNFX1NQUklOR19CRUFOTkFNRSk7Ci0gICAgICAgICAgICBTdHJpbmcgYmVhbk5hbWUgPSAoKFN0cmluZylpbXBsQmVhblBhcmFtLmdldFZhbHVlKCkpLnRyaW0oKTsKLSAgICAgICAgICAgIGlmIChiZWFuTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgUGFyYW1ldGVyIHNlcnZsZXRDb25maWdQYXJhbSA9IGF4aXNTZXJ2aWNlLmdldEF4aXNDb25maWd1cmF0aW9uKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRQYXJhbWV0ZXIoSFRUUENvbnN0YW50cy5IVFRQX1NFUlZMRVRDT05GSUcpOwotCi0gICAgICAgICAgICAgICAgaWYgKHNlcnZsZXRDb25maWdQYXJhbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIkF4aXMyIENhbid0IGZpbmQgU2VydmxldENvbmZpZ1BhcmFtZXRlciIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBPYmplY3Qgb2JqID0gc2VydmxldENvbmZpZ1BhcmFtLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgU2VydmxldENvbnRleHQgc2VydmxldENvbnRleHQ7Ci0gICAgICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFNlcnZsZXRDb25maWcpIHsKLSAgICAgICAgICAgICAgICAgICAgU2VydmxldENvbmZpZyBzZXJ2bGV0Q29uZmlnID0gKFNlcnZsZXRDb25maWcpb2JqOwotICAgICAgICAgICAgICAgICAgICBzZXJ2bGV0Q29udGV4dCA9IHNlcnZsZXRDb25maWcuZ2V0U2VydmxldENvbnRleHQoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJBeGlzMiBDYW4ndCBmaW5kIFNlcnZsZXRDb25maWciKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQXBwbGljYXRpb25Db250ZXh0IGFDdHggPQotICAgICAgICAgICAgICAgICAgICAgICAgV2ViQXBwbGljYXRpb25Db250ZXh0VXRpbHMuZ2V0V2ViQXBwbGljYXRpb25Db250ZXh0KHNlcnZsZXRDb250ZXh0KTsKLSAgICAgICAgICAgICAgICBpZiAoYUN0eCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKCJBeGlzMiBDYW4ndCBmaW5kIFNwcmluZydzIEFwcGxpY2F0aW9uQ29udGV4dCIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFDdHguZ2V0QmVhbihiZWFuTmFtZSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJBeGlzMiBDYW4ndCBmaW5kIFNwcmluZyBCZWFuOiAiICsgYmVhbk5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gYUN0eC5nZXRCZWFuKGJlYW5OYW1lKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgKLSAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoInBhcmFtSXNOb3RTcGVjaWZpZWQiLCAiU0VSVklDRV9TUFJJTkdfQkVBTk5BTUUiKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBBeGlzRmF1bHQubWFrZUZhdWx0KGUpOwotICAgICAgICB9Ci0KLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3NwcmluZy90ZXN0LXJlc291cmNlcy9hcHBsaWNhdGlvbkNvbnRleHQueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvc3ByaW5nL3Rlc3QtcmVzb3VyY2VzL2FwcGxpY2F0aW9uQ29udGV4dC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3OGMwZTEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvc3ByaW5nL3Rlc3QtcmVzb3VyY2VzL2FwcGxpY2F0aW9uQ29udGV4dC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTwhRE9DVFlQRSBiZWFucyBQVUJMSUMgIi0vL1NQUklORy8vRFREIEJFQU4vL0VOIiAiaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL2R0ZC9zcHJpbmctYmVhbnMuZHRkIj4KLQotPGJlYW5zPgotICA8IS0tIFVzZWQgdG8gdGVzdCBhIG5vbi1zZXJ2bGV0IGNvbnRhaW5lciBlbnZpcm9ubWVudCAtIGdpdmVzIHNwcmluZyB0byBnaXZlIGEgaG9vayB0byBheGlzMiAtLT4KLSAgPGJlYW4gaWQ9ImFwcGxpY2F0aW9uQ29udGV4dCIgCi0gICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZXh0ZW5zaW9ucy5zcHJpbmcucmVjZWl2ZXJzLkFwcGxpY2F0aW9uQ29udGV4dEhvbGRlciIgLz4KLQotICA8IS0tIEF4aXMyIFdlYiBTZXJ2aWNlLCBidXQgdG8gU3ByaW5nLCBpdHMganVzdCBhbm90aGVyIGJlYW4gdGhhdCBoYXMgZGVwZW5kZW5jaWVzIC0tPgotICA8YmVhbiBpZD0ic3ByaW5nQXdhcmVTZXJ2aWNlIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5zcHJpbmcuU3ByaW5nQXdhcmVTZXJ2aWNlIj4KLSAgICA8cHJvcGVydHkgbmFtZT0ibXlCZWFuIiByZWY9Im15QmVhbiIvPgotICA8L2JlYW4+Ci0KLSAgPCEtLSBqdXN0IGFub3RoZXIgYmVhbiB3aXRoIGEgd2lyZWQgaW1wbGVtZW50YXRpb24sIHRoYXQncyBpbmplY3RlZCBieSBTcHJpbmcgCi0gICAgICAgICAgaW50byB0aGUgV2ViIFNlcnZpY2UgLS0+Ci0gICA8YmVhbiBpZD0ibXlCZWFuIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5zcHJpbmcuTXlCZWFuSW1wbCI+Ci0gICAgIDxwcm9wZXJ0eSBuYW1lPSJ2YWwiIHZhbHVlPSJTcHJpbmcsIGVtZXJnZSB0aHlzZWxmIiAvPgotICA8L2JlYW4+Ci08L2JlYW5zPgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1hYXItbWF2ZW4tcGx1Z2luL3BvbS54bWwgYi92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWFhci1tYXZlbi1wbHVnaW4vcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM0Mjk4ZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWFhci1tYXZlbi1wbHVnaW4vcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItcGFyZW50PC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4xLjUuMTwvdmVyc2lvbj4KLSAgICAgICAgPHJlbGF0aXZlUGF0aD4uLi8uLi9wYXJlbnQvcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgotICAgIDwvcGFyZW50PgotICAgIDxhcnRpZmFjdElkPmF4aXMyLWFhci1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgPHBhY2thZ2luZz5tYXZlbi1wbHVnaW48L3BhY2thZ2luZz4KLSAgICA8bmFtZT5BcGFjaGUgQXhpczIgLSB0b29sIC0gQUFSIE1hdmVuIFBsdWdpbjwvbmFtZT4KLSAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgIEEgTWF2ZW4gMiBwbHVnaW4gZm9yIGNyZWF0aW5nIEF4aXMgMiBzZXJ2aWNlIGFyY2hpdmVzIChhYXIgZmlsZXMpCi0gICAgPC9kZXNjcmlwdGlvbj4KLSAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW48L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wbHVnaW4tYXBpPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXByb2plY3Q8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXJ0aWZhY3Q8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXJjaGl2ZXI8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMucGxleHVzPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+cGxleHVzLXV0aWxzPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnNoYXJlZDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXBsdWdpbi10ZXN0aW5nLWhhcm5lc3M8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5jb21tb25zLWh0dHBjbGllbnQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWh0dHBjbGllbnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8L2RlcGVuZGVuY2llcz4KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxyZXNvdXJjZXM+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLyo8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgICAgICA8ZmlsdGVyaW5nPmZhbHNlPC9maWx0ZXJpbmc+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+Li4vLi4vLi48L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPk5PVElDRS50eHQ8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPkxJQ0VOU0UudHh0PC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgPGZpbHRlcmluZz5mYWxzZTwvZmlsdGVyaW5nPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgPC9yZXNvdXJjZXM+Ci0gICAgPC9idWlsZD4KLSAgICA8ZGV2ZWxvcGVycz4KLSAgICAgICAgPGRldmVsb3Blcj4KLSAgICAgICAgICAgIDxpZD5qb2NoZW48L2lkPgotICAgICAgICAgICAgPG5hbWU+Sm9jaGVuIFdpZWRtYW5uPC9uYW1lPgotICAgICAgICAgICAgPGVtYWlsPmpvY2hlbi53aWVkbWFubkBnbWFpbC5jb208L2VtYWlsPgotICAgICAgICA8L2RldmVsb3Blcj4KLSAgICA8L2RldmVsb3BlcnM+Ci0gICAgPGNvbnRyaWJ1dG9ycz4KLSAgICAgICAgPGNvbnRyaWJ1dG9yPgotICAgICAgICAgICAgPG5hbWU+Sm9obiBQZmVpZmVyPC9uYW1lPgotICAgICAgICAgICAgPGVtYWlsPmpvaG4ucGZlaWZlckBobnBzb2x1dGlvbnMuY29tPC9lbWFpbD4KLSAgICAgICAgPC9jb250cmlidXRvcj4KLSAgICA8L2NvbnRyaWJ1dG9ycz4KLSAgICA8cmVwb3J0aW5nPgotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphdmFkb2MtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jaGFuZ2VzLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8cmVwb3J0U2V0cz4KLSAgICAgICAgICAgICAgICAgICAgPHJlcG9ydFNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxyZXBvcnRzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXBvcnQ+Y2hhbmdlcy1yZXBvcnQ8L3JlcG9ydD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVwb3J0cz4KLSAgICAgICAgICAgICAgICAgICAgPC9yZXBvcnRTZXQ+Ci0gICAgICAgICAgICAgICAgPC9yZXBvcnRTZXRzPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgIDwvcGx1Z2lucz4KLSAgICA8L3JlcG9ydGluZz4KLSAgICA8ZGlzdHJpYnV0aW9uTWFuYWdlbWVudD4KLSAgICAgICAgPHJlcG9zaXRvcnk+Ci0gICAgICAgICAgICA8aWQ+YXBhY2hlLXJlcG88L2lkPgotICAgICAgICAgICAgPG5hbWU+TWF2ZW4gQ2VudHJhbCBSZXBvc2l0b3J5PC9uYW1lPgotICAgICAgICAgICAgPHVybD5zY3BleGU6Ly9wZW9wbGUuYXBhY2hlLm9yZy8vd3d3L3Blb3BsZS5hcGFjaGUub3JnL3JlcG8vbTItaWJpYmxpby1yc3luYy1yZXBvc2l0b3J5PC91cmw+Ci0gICAgICAgIDwvcmVwb3NpdG9yeT4KLSAgICAgICAgPHNuYXBzaG90UmVwb3NpdG9yeT4KLSAgICAgICAgICAgIDxpZD5hcGFjaGUtc25hcHNob3RzPC9pZD4KLSAgICAgICAgICAgIDxuYW1lPkFwYWNoZSBEZXZlbG9wbWVudCBSZXBvc2l0b3J5PC9uYW1lPgotICAgICAgICAgICAgPHVybD5zY3BleGU6Ly9wZW9wbGUuYXBhY2hlLm9yZy8vd3d3L3Blb3BsZS5hcGFjaGUub3JnL3JlcG8vbTItc25hcHNob3QtcmVwb3NpdG9yeTwvdXJsPgotICAgICAgICA8L3NuYXBzaG90UmVwb3NpdG9yeT4KLSAgICA8L2Rpc3RyaWJ1dGlvbk1hbmFnZW1lbnQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWFhci1tYXZlbi1wbHVnaW4vc3JjL2NoYW5nZXMvY2hhbmdlcy54bWwgYi92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWFhci1tYXZlbi1wbHVnaW4vc3JjL2NoYW5nZXMvY2hhbmdlcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhNzcxZWUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1hYXItbWF2ZW4tcGx1Z2luL3NyYy9jaGFuZ2VzL2NoYW5nZXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08ZG9jdW1lbnQ+Ci0gIDxwcm9wZXJ0aWVzPgotICAgIDx0aXRsZT5DaGFuZ2VzIGluIHRoZSBBeGlzMiBBQVIgcGx1Z2luIGZvciBNYXZlbiAyPC90aXRsZT4KLSAgPC9wcm9wZXJ0aWVzPgotICA8Ym9keT4KLSAgICA8cmVsZWFzZSB2ZXJzaW9uPSIxLjEtU05BUFNIT1QiIGRhdGU9Ik5vdCB5ZXQgcmVsZWFzZWQiPgotICAgICAgPGFjdGlvbiBkZXY9ImpvY2hlbiIgdHlwZT0iZml4IiBpc3N1ZT0iQVhJUzItMTE0MCIgZHVlLXRvPSJKb2huIFBmZWlmZXIiCi0gICAgICAgICAgZHVlLXRvLWVtYWlsPSIiPgotICAgICAgICBEZXBlbmRlbmNpZXMgaGF2ZW4ndCBiZWVuIGFkZGVkIHRvIHRoZSBhYXIgZmlsZXMgbGliIGRpcmVjdG9yeS4KLSAgICAgIDwvYWN0aW9uPgotICAgIDwvcmVsZWFzZT4KLSAgICA8cmVsZWFzZSB2ZXJzaW9uPSIxLjAtU05BUFNIT1QiIGRhdGU9Ik5vdCB5ZXQgcmVsZWFzZWQiPgotICAgICAgPGFjdGlvbiBkZXY9ImpvY2hlbiIgdHlwZT0iYWRkIj4KLSAgICAgICAgSW5pdGlhbCB2ZXJzaW9uLiBOZXZlciBhY3R1YWxseSBwdWJsaXNoZWQuCi0gICAgICA8L2FjdGlvbj4KLSAgICA8L3JlbGVhc2U+Ci0gIDwvYm9keT4KLTwvZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWFhci1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL21hdmVuMi9hYXIvQWFyRXhwbG9kZWRNb2pvLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWFhci1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL21hdmVuMi9hYXIvQWFyRXhwbG9kZWRNb2pvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3NTc4ZDcuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1hYXItbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi9tYXZlbjIvYWFyL0FhckV4cGxvZGVkTW9qby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLm1hdmVuMi5hYXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5Nb2pvRXhlY3V0aW9uRXhjZXB0aW9uOwotCi0vKioKLSAqIEdlbmVyYXRlIHRoZSBleHBsb2RlZCBhYXIKLSAqCi0gKiBAZ29hbCBleHBsb2RlZAotICogQHBoYXNlIHBhY2thZ2UKLSAqIEByZXF1aXJlc0RlcGVuZGVuY3lSZXNvbHV0aW9uIHJ1bnRpbWUKLSAqLwotcHVibGljIGNsYXNzIEFhckV4cGxvZGVkTW9qbwotICAgICAgICBleHRlbmRzIEFic3RyYWN0QWFyTW9qbyB7Ci0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpCi0gICAgICAgICAgICB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIGJ1aWxkRXhwbG9kZWRBYXIoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWFhci1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL21hdmVuMi9hYXIvQWFySW5QbGFjZU1vam8uamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItYWFyLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvbWF2ZW4yL2Fhci9BYXJJblBsYWNlTW9qby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmFkOTdiLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItYWFyLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvbWF2ZW4yL2Fhci9BYXJJblBsYWNlTW9qby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLm1hdmVuMi5hYXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5Nb2pvRXhlY3V0aW9uRXhjZXB0aW9uOwotCi0vKioKLSAqIEdlbmVyYXRlcyBhYXIgaW4gdGhlIHNvdXJjZSBkaXJlY3RvcnkKLSAqCi0gKiBAZ29hbCBpbnBsYWNlCi0gKiBAcmVxdWlyZXNEZXBlbmRlbmN5UmVzb2x1dGlvbiBydW50aW1lCi0gKi8KLXB1YmxpYyBjbGFzcyBBYXJJblBsYWNlTW9qbwotICAgICAgICBleHRlbmRzIEFic3RyYWN0QWFyTW9qbyB7Ci0KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgICAgICAgICAgIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQotICAgICAgICBnZXRMb2coKS5kZWJ1ZygiR2VuZXJhdGluZyBhYXIgaW4gc291cmNlIGRpcmVjdG9yeS4uLiAiICsgYWFyRGlyZWN0b3J5KTsKLSAgICAgICAgYnVpbGRFeHBsb2RlZEFhcigpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItYWFyLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvbWF2ZW4yL2Fhci9BYXJNb2pvLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWFhci1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL21hdmVuMi9hYXIvQWFyTW9qby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2FlNWM5Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItYWFyLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvbWF2ZW4yL2Fhci9BYXJNb2pvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLm1hdmVuMi5hYXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFyY2hpdmVyLk1hdmVuQXJjaGl2ZUNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcmNoaXZlci5NYXZlbkFyY2hpdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5EZXBlbmRlbmN5UmVzb2x1dGlvblJlcXVpcmVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLk1vam9FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wcm9qZWN0Lk1hdmVuUHJvamVjdEhlbHBlcjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmFyY2hpdmVyLkFyY2hpdmVyRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuYXJjaGl2ZXIuamFyLkphckFyY2hpdmVyOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuYXJjaGl2ZXIuamFyLk1hbmlmZXN0RXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLS8qKgotICogQnVpbGQgYSBhYXIuCi0gKgotICogQGdvYWwgYWFyCi0gKiBAcGhhc2UgcGFja2FnZQotICogQHJlcXVpcmVzRGVwZW5kZW5jeVJlc29sdXRpb24gcnVudGltZQotICovCi1wdWJsaWMgY2xhc3MgQWFyTW9qbyBleHRlbmRzIEFic3RyYWN0QWFyTW9qbyB7Ci0gICAgLyoqCi0gICAgICogVGhlIGRpcmVjdG9yeSBmb3IgdGhlIGdlbmVyYXRlZCBhYXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9IgotICAgICAqIEByZXF1aXJlZAotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIG91dHB1dERpcmVjdG9yeTsKLQotICAgIC8qKgotICAgICAqIFRoZSBuYW1lIG9mIHRoZSBnZW5lcmF0ZWQgYWFyLgotICAgICAqCi0gICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke3Byb2plY3QuYnVpbGQuZmluYWxOYW1lfSIKLSAgICAgKiBAcmVxdWlyZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBhYXJOYW1lOwotCi0gICAgLyoqCi0gICAgICogVGhlIEphciBhcmNoaXZlci4KLSAgICAgKgotICAgICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtjb21wb25lbnQub3JnLmNvZGVoYXVzLnBsZXh1cy5hcmNoaXZlci5BcmNoaXZlciNqYXJ9IgotICAgICAqIEByZXF1aXJlZAotICAgICAqLwotICAgIHByaXZhdGUgSmFyQXJjaGl2ZXIgamFyQXJjaGl2ZXI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbWF2ZW4gYXJjaGl2ZSBjb25maWd1cmF0aW9uIHRvIHVzZS4KLSAgICAgKgotICAgICAqIEBwYXJhbWV0ZXIKLSAgICAgKi8KLSAgICBwcml2YXRlIE1hdmVuQXJjaGl2ZUNvbmZpZ3VyYXRpb24gYXJjaGl2ZSA9IG5ldyBNYXZlbkFyY2hpdmVDb25maWd1cmF0aW9uKCk7Ci0KLSAgICAvKioKLSAgICAgKiBDbGFzc2lmaWVyIHRvIGFkZCB0byB0aGUgYXJ0aWZhY3QgZ2VuZXJhdGVkLiBJZiBnaXZlbiwgdGhlIGFydGlmYWN0IHdpbGwgYmUgYW4gYXR0YWNobWVudAotICAgICAqIGluc3RlYWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW1ldGVyCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgY2xhc3NpZmllcjsKLQotICAgIC8qKgotICAgICAqIFdoZXRoZXIgdGhpcyBpcyB0aGUgbWFpbiBhcnRpZmFjdCBiZWluZyBidWlsdC4gU2V0IHRvIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB5b3UgZG9uJ3Qgd2FudCB0bwotICAgICAqIGluc3RhbGwgb3IgZGVwbG95IGl0IHRvIHRoZSBsb2NhbCByZXBvc2l0b3J5IGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgb25lIGluIGFuIGV4ZWN1dGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtwcmltYXJ5QXJ0aWZhY3R9IiBkZWZhdWx0LXZhbHVlPSJ0cnVlIgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBwcmltYXJ5QXJ0aWZhY3Q7Ci0KLSAgICAvKiogQGNvbXBvbmVudCAqLwotICAgIHByaXZhdGUgTWF2ZW5Qcm9qZWN0SGVscGVyIHByb2plY3RIZWxwZXI7Ci0KLSAgICAvKioKLSAgICAgKiBFeGVjdXRlcyB0aGUgQWFyTW9qbyBvbiB0aGUgY3VycmVudCBwcm9qZWN0LgotICAgICAqCi0gICAgICogQHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VyZWQgd2hpbGUgYnVpbGRpbmcgdGhlIHdlYmFwcAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgRmlsZSBhYXJGaWxlID0gbmV3IEZpbGUob3V0cHV0RGlyZWN0b3J5LCBhYXJOYW1lICsgIi5hYXIiKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcGVyZm9ybVBhY2thZ2luZyhhYXJGaWxlKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCJFcnJvciBhc3NlbWJsaW5nIGFhciIsIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2VuZXJhdGVzIHRoZSBhYXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYWFyRmlsZSB0aGUgdGFyZ2V0IGFhciBmaWxlCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgQXJjaGl2ZXJFeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIE1hbmlmZXN0RXhjZXB0aW9uCi0gICAgICogQHRocm93cyBEZXBlbmRlbmN5UmVzb2x1dGlvblJlcXVpcmVkRXhjZXB0aW9uCi0gICAgICoKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcGVyZm9ybVBhY2thZ2luZyhGaWxlIGFhckZpbGUpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIEFyY2hpdmVyRXhjZXB0aW9uLCBNYW5pZmVzdEV4Y2VwdGlvbiwKLSAgICAgICAgICAgIERlcGVuZGVuY3lSZXNvbHV0aW9uUmVxdWlyZWRFeGNlcHRpb24sCi0gICAgICAgICAgICBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQotICAgICAgICBidWlsZEV4cGxvZGVkQWFyKCk7Ci0KLSAgICAgICAgLy8gZ2VuZXJhdGUgYWFyIGZpbGUKLSAgICAgICAgZ2V0TG9nKCkuaW5mbygiR2VuZXJhdGluZyBhYXIgIiArIGFhckZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgICAgICBNYXZlbkFyY2hpdmVyIGFyY2hpdmVyID0gbmV3IE1hdmVuQXJjaGl2ZXIoKTsKLSAgICAgICAgYXJjaGl2ZXIuc2V0QXJjaGl2ZXIoamFyQXJjaGl2ZXIpOwotICAgICAgICBhcmNoaXZlci5zZXRPdXRwdXRGaWxlKGFhckZpbGUpOwotICAgICAgICBqYXJBcmNoaXZlci5hZGREaXJlY3RvcnkoYWFyRGlyZWN0b3J5KTsKLQotICAgICAgICAvLyBjcmVhdGUgYXJjaGl2ZQotICAgICAgICBhcmNoaXZlci5jcmVhdGVBcmNoaXZlKHByb2plY3QsIGFyY2hpdmUpOwotCi0gICAgICAgIGlmIChjbGFzc2lmaWVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHByb2plY3RIZWxwZXIuYXR0YWNoQXJ0aWZhY3QocHJvamVjdCwgImFhciIsIGNsYXNzaWZpZXIsIGFhckZpbGUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQXJ0aWZhY3QgYXJ0aWZhY3QgPSBwcm9qZWN0LmdldEFydGlmYWN0KCk7Ci0gICAgICAgICAgICBpZiAocHJpbWFyeUFydGlmYWN0KSB7Ci0gICAgICAgICAgICAgICAgYXJ0aWZhY3Quc2V0RmlsZShhYXJGaWxlKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJ0aWZhY3QuZ2V0RmlsZSgpID09IG51bGwgfHwgYXJ0aWZhY3QuZ2V0RmlsZSgpLmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgICAgICBhcnRpZmFjdC5zZXRGaWxlKGFhckZpbGUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwcm9qZWN0SGVscGVyLmF0dGFjaEFydGlmYWN0KHByb2plY3QsICJhYXIiLCBhYXJGaWxlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItYWFyLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvbWF2ZW4yL2Fhci9BYnN0cmFjdEFhck1vam8uamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItYWFyLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvbWF2ZW4yL2Fhci9BYnN0cmFjdEFhck1vam8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE3YjdjNS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWFhci1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL21hdmVuMi9hYXIvQWJzdHJhY3RBYXJNb2pvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLm1hdmVuMi5hYXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LkFydGlmYWN0OwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QucmVzb2x2ZXIuZmlsdGVyLlNjb3BlQXJ0aWZhY3RGaWx0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uQWJzdHJhY3RNb2pvOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLk1vam9FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wcm9qZWN0Lk1hdmVuUHJvamVjdDsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLnV0aWwuRGlyZWN0b3J5U2Nhbm5lcjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLnV0aWwuRmlsZVV0aWxzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotCi0vKiogQWJzdHJhY3QgYmFzZSBjbGFzcyBvZiBhbGwgdGhlIG1vam9zIGluIHRoZSBheGlzMi1hYXItbWF2ZW4tcGx1Z2luLiAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0QWFyTW9qbwotICAgICAgICBleHRlbmRzIEFic3RyYWN0TW9qbyB7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgcHJvamVjdHMgYmFzZSBkaXJlY3RvcnkuCi0gICAgICoKLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7cHJvamVjdC5iYXNlZGlyfSIKLSAgICAgKiBAcmVxdWlyZWQKLSAgICAgKiBAcmVhZG9ubHkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRmlsZSBiYXNlRGlyOwotCi0gICAgLyoqCi0gICAgICogVGhlIG1hdmVuIHByb2plY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7cHJvamVjdH0iCi0gICAgICogQHJlcXVpcmVkCi0gICAgICogQHJlYWRvbmx5Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIE1hdmVuUHJvamVjdCBwcm9qZWN0OwotCi0gICAgLyoqCi0gICAgICogVGhlIGRpcmVjdG9yeSBjb250YWluaW5nIGdlbmVyYXRlZCBjbGFzc2VzLgotICAgICAqCi0gICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke3Byb2plY3QuYnVpbGQub3V0cHV0RGlyZWN0b3J5fSIKLSAgICAgKiBAcmVxdWlyZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEZpbGUgY2xhc3Nlc0RpcmVjdG9yeTsKLQotICAgIC8qKgotICAgICAqIFRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIGFhciBpcyBidWlsdC4KLSAgICAgKgotICAgICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vYWFyIgotICAgICAqIEByZXF1aXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBGaWxlIGFhckRpcmVjdG9yeTsKLQotICAgIC8qKgotICAgICAqIFRoZSBsb2NhdGlvbiBvZiB0aGUgc2VydmljZXMueG1sIGZpbGUuICBJZiBpdCBpcyBwcmVzZW50IGluIHRoZSBNRVRBLUlORiBkaXJlY3RvcnkgaW4KLSAgICAgKiBzcmMvbWFpbi9yZXNvdXJjZXMgd2l0aCB0aGF0IG5hbWUgdGhlbiBpdCB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgaW5jbHVkZWQuIE90aGVyd2lzZSB0aGlzCi0gICAgICogcGFyYW1ldGVyIG11c3QgYmUgc2V0LgotICAgICAqCi0gICAgICogQHBhcmFtZXRlcgotICAgICAqLwotICAgIHByaXZhdGUgRmlsZSBzZXJ2aWNlc1htbEZpbGU7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbG9jYXRpb24gb2YgdGhlIFdTREwgZmlsZSwgaWYgYW55LiBCeSBkZWZhdWx0LCBubyBXU0RMIGZpbGUgaXMgYWRkZWQgYW5kIGl0IGlzIGFzc3VtZWQsCi0gICAgICogdGhhdCBBeGlzIDIgd2lsbCBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlIGEgV1NETCBmaWxlLgotICAgICAqCi0gICAgICogQHBhcmFtZXRlcgotICAgICAqLwotICAgIHByaXZhdGUgRmlsZSB3c2RsRmlsZTsKLQotICAgIC8qKgotICAgICAqIE5hbWUsIHRvIHdoaWNoIHRoZSB3c2RsIGZpbGUgc2hhbGwgYmUgbWFwcGVkLiBCeSBkZWZhdWx0LCB0aGUgbmFtZSB3aWxsIGJlIGNvbXB1dGVkIGZyb20gdGhlCi0gICAgICogZmlsZXMgcGF0aCBieSByZW1vdmluZyB0aGUgZGlyZWN0b3J5LgotICAgICAqCi0gICAgICogQHBhcmFtZXRlciBkZWZhdWx0LXZhbHVlPSJzZXJ2aWNlLndzZGwiCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgd3NkbEZpbGVOYW1lOwotCi0gICAgLyoqCi0gICAgICogQWRkaXRpb25hbCBmaWxlIHNldHMsIHdoaWNoIGFyZSBiZWluZyBhZGRlZCB0byB0aGUgYXJjaGl2ZS4KLSAgICAgKgotICAgICAqIEBwYXJhbWV0ZXIKLSAgICAgKi8KLSAgICBwcml2YXRlIEZpbGVTZXRbXSBmaWxlU2V0czsKLQotICAgIC8qKgotICAgICAqIFdoZXRoZXIgdGhlIGRlcGVuZGVuY3kgamFycyBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIGFhcgotICAgICAqCi0gICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke2luY2x1ZGVEZXBlbmRlbmNpZXN9IiBkZWZhdWx0LXZhbHVlPSJ0cnVlIgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBpbmNsdWRlRGVwZW5kZW5jaWVzOwotCi0gICAgLyoqCi0gICAgICogQnVpbGRzIHRoZSBleHBsb2RlZCBBQVIgZmlsZS4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGJ1aWxkRXhwbG9kZWRBYXIoKQotICAgICAgICAgICAgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24gewotICAgICAgICBnZXRMb2coKS5kZWJ1ZygiRXhwbG9kaW5nIGFhci4uLiIpOwotCi0gICAgICAgIGFhckRpcmVjdG9yeS5ta2RpcnMoKTsKLSAgICAgICAgZ2V0TG9nKCkuZGVidWcoIkFzc2VtYmxpbmcgYWFyICIgKyBwcm9qZWN0LmdldEFydGlmYWN0SWQoKSArICIgaW4gIiArIGFhckRpcmVjdG9yeSk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZpbmFsIEZpbGUgbWV0YUluZkRpciA9IG5ldyBGaWxlKGFhckRpcmVjdG9yeSwgIk1FVEEtSU5GIik7Ci0gICAgICAgICAgICBmaW5hbCBGaWxlIGxpYkRpciA9IG5ldyBGaWxlKGFhckRpcmVjdG9yeSwgImxpYiIpOwotICAgICAgICAgICAgZmluYWwgRmlsZSBzZXJ2aWNlc0ZpbGVUYXJnZXQgPSBuZXcgRmlsZShtZXRhSW5mRGlyLCAic2VydmljZXMueG1sIik7Ci0gICAgICAgICAgICBib29sZWFuIGV4aXN0c0JlZm9yZUNvcHlpbmdDbGFzc2VzID0gc2VydmljZXNGaWxlVGFyZ2V0LmV4aXN0cygpOwotCi0gICAgICAgICAgICBTdHJpbmcgd3NkbE5hbWUgPSB3c2RsRmlsZU5hbWU7Ci0gICAgICAgICAgICBpZiAod3NkbE5hbWUgPT0gbnVsbCAmJiB3c2RsRmlsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgd3NkbE5hbWUgPSB3c2RsRmlsZS5nZXROYW1lKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBGaWxlIHdzZGxGaWxlVGFyZ2V0ID0gbnVsbDsKLSAgICAgICAgICAgIGlmICh3c2RsRmlsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgd3NkbEZpbGVUYXJnZXQgPSBuZXcgRmlsZShtZXRhSW5mRGlyLCB3c2RsRmlsZU5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYm9vbGVhbiB3c2RsRXhpc3RzQmVmb3JlQ29weWluZ0NsYXNzZXMgPQotICAgICAgICAgICAgICAgICAgICB3c2RsRmlsZVRhcmdldCA9PSBudWxsID8gZmFsc2UgOiB3c2RsRmlsZVRhcmdldC5leGlzdHMoKTsKLQotICAgICAgICAgICAgaWYgKGNsYXNzZXNEaXJlY3RvcnkuZXhpc3RzKCkgJiYgKCFjbGFzc2VzRGlyZWN0b3J5LmVxdWFscyhhYXJEaXJlY3RvcnkpKSkgewotICAgICAgICAgICAgICAgIEZpbGVVdGlscy5jb3B5RGlyZWN0b3J5U3RydWN0dXJlKGNsYXNzZXNEaXJlY3RvcnksIGFhckRpcmVjdG9yeSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChmaWxlU2V0cyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlU2V0cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBGaWxlU2V0IGZpbGVTZXQgPSBmaWxlU2V0c1tpXTsKLSAgICAgICAgICAgICAgICAgICAgY29weUZpbGVTZXQoZmlsZVNldCwgYWFyRGlyZWN0b3J5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNvcHlNZXRhSW5mRmlsZShzZXJ2aWNlc1htbEZpbGUsIHNlcnZpY2VzRmlsZVRhcmdldCwgZXhpc3RzQmVmb3JlQ29weWluZ0NsYXNzZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgInNlcnZpY2VzLnhtbCBmaWxlIik7Ci0gICAgICAgICAgICBjb3B5TWV0YUluZkZpbGUod3NkbEZpbGUsIHdzZGxGaWxlVGFyZ2V0LCB3c2RsRXhpc3RzQmVmb3JlQ29weWluZ0NsYXNzZXMsICJXU0RMIGZpbGUiKTsKLQotICAgICAgICAgICAgaWYgKGluY2x1ZGVEZXBlbmRlbmNpZXMpIHsKLSAgICAgICAgICAgICAgICBTZXQgYXJ0aWZhY3RzID0gcHJvamVjdC5nZXRBcnRpZmFjdHMoKTsKLQotICAgICAgICAgICAgICAgIExpc3QgZHVwbGljYXRlcyA9IGZpbmREdXBsaWNhdGVzKGFydGlmYWN0cyk7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhcnRpZmFjdHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgICAgIEFydGlmYWN0IGFydGlmYWN0ID0gKEFydGlmYWN0KWl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdGFyZ2V0RmlsZU5hbWUgPSBnZXREZWZhdWx0RmluYWxOYW1lKGFydGlmYWN0KTsKLQotICAgICAgICAgICAgICAgICAgICBnZXRMb2coKS5kZWJ1ZygiUHJvY2Vzc2luZzogIiArIHRhcmdldEZpbGVOYW1lKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoZHVwbGljYXRlcy5jb250YWlucyh0YXJnZXRGaWxlTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldExvZygpLmRlYnVnKCJEdXBsaWNhdGUgZm91bmQ6ICIgKyB0YXJnZXRGaWxlTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRGaWxlTmFtZSA9IGFydGlmYWN0LmdldEdyb3VwSWQoKSArICItIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHRhcmdldEZpbGVOYW1lOwotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TG9nKCkuZGVidWcoIlJlbmFtZWQgdG86ICIgKyB0YXJnZXRGaWxlTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiB1dGlsaXNlIGFwcHJvcHJpYXRlIG1ldGhvZHMgZnJvbSBwcm9qZWN0IGJ1aWxkZXIKLSAgICAgICAgICAgICAgICAgICAgU2NvcGVBcnRpZmFjdEZpbHRlciBmaWx0ZXIgPSBuZXcgU2NvcGVBcnRpZmFjdEZpbHRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnRpZmFjdC5TQ09QRV9SVU5USU1FKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFhcnRpZmFjdC5pc09wdGlvbmFsKCkgJiYgZmlsdGVyLmluY2x1ZGUoYXJ0aWZhY3QpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdHlwZSA9IGFydGlmYWN0LmdldFR5cGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgiamFyIi5lcXVhbHModHlwZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3B5RmlsZUlmTW9kaWZpZWQoYXJ0aWZhY3QuZ2V0RmlsZSgpLCBuZXcgRmlsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYkRpciwgdGFyZ2V0RmlsZU5hbWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oIkNvdWxkIG5vdCBleHBsb2RlIGFhci4uLiIsIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VhcmNoZXMgYSBzZXQgb2YgYXJ0aWZhY3RzIGZvciBkdXBsaWNhdGUgZmlsZW5hbWVzIGFuZCByZXR1cm5zIGEgbGlzdCBvZiBkdXBsaWNhdGVzLgotICAgICAqCi0gICAgICogQHBhcmFtIGFydGlmYWN0cyBzZXQgb2YgYXJ0aWZhY3RzCi0gICAgICogQHJldHVybiBMaXN0IG9mIGR1cGxpY2F0ZWQgYXJ0aWZhY3RzCi0gICAgICovCi0gICAgcHJpdmF0ZSBMaXN0IGZpbmREdXBsaWNhdGVzKFNldCBhcnRpZmFjdHMpIHsKLSAgICAgICAgTGlzdCBkdXBsaWNhdGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBMaXN0IGlkZW50aWZpZXJzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhcnRpZmFjdHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBBcnRpZmFjdCBhcnRpZmFjdCA9IChBcnRpZmFjdClpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIFN0cmluZyBjYW5kaWRhdGUgPSBnZXREZWZhdWx0RmluYWxOYW1lKGFydGlmYWN0KTsKLSAgICAgICAgICAgIGlmIChpZGVudGlmaWVycy5jb250YWlucyhjYW5kaWRhdGUpKSB7Ci0gICAgICAgICAgICAgICAgZHVwbGljYXRlcy5hZGQoY2FuZGlkYXRlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWRlbnRpZmllcnMuYWRkKGNhbmRpZGF0ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGR1cGxpY2F0ZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgdGhlIGZpbGVuYW1lIG9mIGFuIGFydGlmYWN0IHRvIGFydGlmYWN0SWQtdmVyc2lvbi50eXBlIGZvcm1hdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhcnRpZmFjdAotICAgICAqIEByZXR1cm4gY29udmVydGVkIGZpbGVuYW1lIG9mIHRoZSBhcnRpZmFjdAotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGdldERlZmF1bHRGaW5hbE5hbWUoQXJ0aWZhY3QgYXJ0aWZhY3QpIHsKLSAgICAgICAgcmV0dXJuIGFydGlmYWN0LmdldEFydGlmYWN0SWQoKSArICItIiArIGFydGlmYWN0LmdldFZlcnNpb24oKSArICIuIiArCi0gICAgICAgICAgICAgICAgYXJ0aWZhY3QuZ2V0QXJ0aWZhY3RIYW5kbGVyKCkuZ2V0RXh0ZW5zaW9uKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29weSBmaWxlIGZyb20gc291cmNlIHRvIGRlc3RpbmF0aW9uIG9ubHkgaWYgc291cmNlIHRpbWVzdGFtcCBpcyBsYXRlciB0aGFuIHRoZSBkZXN0aW5hdGlvbgotICAgICAqIHRpbWVzdGFtcC4gVGhlIGRpcmVjdG9yaWVzIHVwIHRvIDxjb2RlPmRlc3RpbmF0aW9uPC9jb2RlPiB3aWxsIGJlIGNyZWF0ZWQgaWYgdGhleSBkb24ndAotICAgICAqIGFscmVhZHkgZXhpc3QuIDxjb2RlPmRlc3RpbmF0aW9uPC9jb2RlPiB3aWxsIGJlIG92ZXJ3cml0dGVuIGlmIGl0IGFscmVhZHkgZXhpc3RzLgotICAgICAqCi0gICAgICogQHBhcmFtIHNvdXJjZSAgICAgIEFuIGV4aXN0aW5nIG5vbi1kaXJlY3RvcnkgPGNvZGU+RmlsZTwvY29kZT4gdG8gY29weSBieXRlcyBmcm9tLgotICAgICAqIEBwYXJhbSBkZXN0aW5hdGlvbiBBIG5vbi1kaXJlY3RvcnkgPGNvZGU+RmlsZTwvY29kZT4gdG8gd3JpdGUgYnl0ZXMgdG8gKHBvc3NpYmx5Ci0gICAgICogICAgICAgICAgICAgICAgICAgIG92ZXJ3cml0aW5nKS4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uICAgICAgICAgICAgICAgICAgIGlmIDxjb2RlPnNvdXJjZTwvY29kZT4gZG9lcyBub3QgZXhpc3QsCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29kZT5kZXN0aW5hdGlvbjwvY29kZT4gY2Fubm90IGJlIHdyaXR0ZW4gdG8sIG9yIGFuIElPCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvciBvY2N1cnMgZHVyaW5nIGNvcHlpbmcuCi0gICAgICogQHRocm93cyBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBpZiA8Y29kZT5kZXN0aW5hdGlvbjwvY29kZT4gaXMgYSBkaXJlY3RvcnkKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLz4KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRPIERPOiBSZW1vdmUgdGhpcyBtZXRob2Qgd2hlbiBNYXZlbiBtb3ZlcyB0bwotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxleHVzLXV0aWxzIHZlcnNpb24gMS40Ci0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNvcHlGaWxlSWZNb2RpZmllZChGaWxlIHNvdXJjZSwgRmlsZSBkZXN0aW5hdGlvbikKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFRPIERPOiBSZW1vdmUgdGhpcyBtZXRob2QgYW5kIHVzZSB0aGUgbWV0aG9kIGluIFdhckZpbGVVdGlscyB3aGVuIE1hdmVuIDIgY2hhbmdlcwotICAgICAgICAvLyB0byBwbGV4dXMtdXRpbHMgMS4yLgotICAgICAgICBpZiAoZGVzdGluYXRpb24ubGFzdE1vZGlmaWVkKCkgPCBzb3VyY2UubGFzdE1vZGlmaWVkKCkpIHsKLSAgICAgICAgICAgIEZpbGVVdGlscy5jb3B5RmlsZShzb3VyY2UuZ2V0Q2Fub25pY2FsRmlsZSgpLCBkZXN0aW5hdGlvbik7Ci0gICAgICAgICAgICAvLyBwcmVzZXJ2ZSB0aW1lc3RhbXAKLSAgICAgICAgICAgIGRlc3RpbmF0aW9uLnNldExhc3RNb2RpZmllZChzb3VyY2UubGFzdE1vZGlmaWVkKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNvcHlGaWxlU2V0KEZpbGVTZXQgZmlsZVNldCwgRmlsZSB0YXJnZXREaXJlY3RvcnkpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBGaWxlIGRpciA9IGZpbGVTZXQuZ2V0RGlyZWN0b3J5KCk7Ci0gICAgICAgIGlmIChkaXIgPT0gbnVsbCkgewotICAgICAgICAgICAgZGlyID0gYmFzZURpcjsKLSAgICAgICAgfQotICAgICAgICBGaWxlIHRhcmdldERpciA9IHRhcmdldERpcmVjdG9yeTsKLSAgICAgICAgaWYgKGZpbGVTZXQuZ2V0T3V0cHV0RGlyZWN0b3J5KCkgIT0gbnVsbCkgewotICAgICAgICAgICAgdGFyZ2V0RGlyID0gbmV3IEZpbGUodGFyZ2V0RGlyLCBmaWxlU2V0LmdldE91dHB1dERpcmVjdG9yeSgpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAodGFyZ2V0RGlyLmVxdWFscyhkaXIpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBEaXJlY3RvcnlTY2FubmVyIGRzID0gbmV3IERpcmVjdG9yeVNjYW5uZXIoKTsKLSAgICAgICAgZHMuc2V0QmFzZWRpcihkaXIpOwotICAgICAgICBpZiAoIWZpbGVTZXQuaXNTa2lwRGVmYXVsdEV4Y2x1ZGVzKCkpIHsKLSAgICAgICAgICAgIGRzLmFkZERlZmF1bHRFeGNsdWRlcygpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIFN0cmluZ1tdIGV4Y2x1ZGVzID0gZmlsZVNldC5nZXRFeGNsdWRlcygpOwotICAgICAgICBpZiAoZXhjbHVkZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgZHMuc2V0RXhjbHVkZXMoZXhjbHVkZXMpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIFN0cmluZ1tdIGluY2x1ZGVzID0gZmlsZVNldC5nZXRJbmNsdWRlcygpOwotICAgICAgICBpZiAoaW5jbHVkZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgZHMuc2V0SW5jbHVkZXMoaW5jbHVkZXMpOwotICAgICAgICB9Ci0gICAgICAgIGRzLnNjYW4oKTsKLSAgICAgICAgU3RyaW5nW10gZmlsZXMgPSBkcy5nZXRJbmNsdWRlZEZpbGVzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIEZpbGUgc291cmNlRmlsZSA9IG5ldyBGaWxlKGRpciwgZmlsZXNbaV0pOwotICAgICAgICAgICAgRmlsZSB0YXJnZXRGaWxlID0gbmV3IEZpbGUodGFyZ2V0RGlyLCBmaWxlc1tpXSk7Ci0gICAgICAgICAgICBGaWxlVXRpbHMuY29weUZpbGUoc291cmNlRmlsZSwgdGFyZ2V0RmlsZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIHByaXZhdGUgdm9pZCBjb3B5TWV0YUluZkZpbGUoZmluYWwgRmlsZSBwU291cmNlLCBmaW5hbCBGaWxlIHBUYXJnZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIHBFeGlzdHNCZWZvcmVDb3B5aW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHBEZXNjcmlwdGlvbikKLSAgICAgICAgICAgIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChwU291cmNlICE9IG51bGwgJiYgcFRhcmdldCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoIXBTb3VyY2UuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgY29uZmlndXJlZCAiICsgcERlc2NyaXB0aW9uICsgIiBjb3VsZCBub3QgYmUgZm91bmQgYXQgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHBTb3VyY2UpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIXBFeGlzdHNCZWZvcmVDb3B5aW5nICYmIHBUYXJnZXQuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICBnZXRMb2coKS53YXJuKCJUaGUgY29uZmlndXJlZCAiICsgcERlc2NyaXB0aW9uICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIgb3ZlcndyaXRlcyBhbm90aGVyIGZpbGUgZnJvbSB0aGUgY2xhc3NwYXRoLiIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBGaWxlVXRpbHMuY29weUZpbGUocFNvdXJjZSwgcFRhcmdldCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWFhci1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL21hdmVuMi9hYXIvRGVwbG95QWFyTW9qby5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1hYXItbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi9tYXZlbjIvYWFyL0RlcGxveUFhck1vam8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg2MjIyMi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWFhci1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL21hdmVuMi9hYXIvRGVwbG95QWFyTW9qby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5tYXZlbjIuYWFyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQuSHR0cENsaWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5IdHRwRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50Lk5hbWVWYWx1ZVBhaXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQuY29va2llLkNvb2tpZVBvbGljeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5tZXRob2RzLkdldE1ldGhvZDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5tZXRob2RzLlBvc3RNZXRob2Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQubWV0aG9kcy5tdWx0aXBhcnQuRmlsZVBhcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQubWV0aG9kcy5tdWx0aXBhcnQuTXVsdGlwYXJ0UmVxdWVzdEVudGl0eTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5tZXRob2RzLm11bHRpcGFydC5QYXJ0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50LnBhcmFtcy5IdHRwQ2xpZW50UGFyYW1zOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLk1vam9FeGVjdXRpb25FeGNlcHRpb247Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLS8qKgotICogRGVwbG95cyBhbiBBQVIgdG8gdGhlIEF4aXMyIHNlcnZlci4KLSAqIAotICogQGdvYWwgZGVwbG95YWFyCi0gKiBAcGhhc2UgaW5zdGFsbAotICovCi1wdWJsaWMgY2xhc3MgRGVwbG95QWFyTW9qbyBleHRlbmRzIEFic3RyYWN0QWFyTW9qbyB7Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgTE9HSU5fRkFJTEVEX0VSUk9SX01FU1NBR0UgPSAiSW52YWxpZCBhdXRoIGNyZWRlbnRpYWxzISI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgVVJMIG9mIHRoZSBBeGlzMiBhZG1pbmlzdHJhdGlvbiBjb25zb2xlLgotICAgICAqCi0gICAgICogQHBhcmFtZXRlciBkZWZhdWx0LXZhbHVlPSJodHRwOi8vbG9jYWxob3N0OjgwODAvYXhpczIvYXhpczItYWRtaW4iIGV4cHJlc3Npb249IiR7YXhpczIuYWFyLmF4aXMyQWRtaW5Db25zb2xlVVJMfSIKLSAgICAgKi8KLSAgICBwcml2YXRlIFVSTCBheGlzMkFkbWluQ29uc29sZVVSTDsKLQotICAgIC8qKgotICAgICAqIFRoZSBhZG1pbmlzdHJhdG9yIHVzZXIgbmFtZSBmb3IgdGhlIEF4aXMyIGFkbWluaXN0cmF0aW9uIGNvbnNvbGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7YXhpczIuYWFyLmF4aXMyQWRtaW5Vc2VyfSIKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBheGlzMkFkbWluVXNlcjsKLQotICAgIC8qKgotICAgICAqIFRoZSBhZG1pbmlzdHJhdG9yIHBhc3N3b3JkIGZvciB0aGUgQXhpczIgYWRtaW5pc3RyYXRpb24gY29uc29sZS4KLSAgICAgKgotICAgICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtheGlzMi5hYXIuYXhpczJBZG1pblBhc3N3b3JkfSIKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBheGlzMkFkbWluUGFzc3dvcmQ7Ci0KLSAgICAvKioKLSAgICAgKiBFeGVjdXRlcyB0aGUgRGVwbG95QWFyTW9qbyBvbiB0aGUgY3VycmVudCBwcm9qZWN0LgotICAgICAqCi0gICAgICogQHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGJ1aWxkaW5nIHRoZSB3ZWJhcHAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24gewotICAgICAgICBnZXRMb2coKS5pbmZvKCJEZXBsb3lpbmcgQUFSIGFydGlmYWN0ICIrcHJvamVjdC5nZXRBcnRpZmFjdCgpLmdldEZpbGUoKSsiIHRvIEF4aXMyIFdlYiBDb25zb2xlICIrYXhpczJBZG1pbkNvbnNvbGVVUkwpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZGVwbG95KHByb2plY3QuZ2V0QXJ0aWZhY3QoKS5nZXRGaWxlKCkpOwotICAgICAgICB9IGNhdGNoKE1vam9FeGVjdXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCJFcnJvciBkZXBsb3lpbmcgYWFyIiwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZXBsb3lzIHRoZSBBQVIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYWFyRmlsZSB0aGUgdGFyZ2V0IEFBUiBmaWxlCi0gICAgICogQHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBIdHRwRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBkZXBsb3koRmlsZSBhYXJGaWxlKSB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIEh0dHBFeGNlcHRpb24gewotICAgICAgICBpZihheGlzMkFkbWluQ29uc29sZVVSTCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigiTm8gQXhpczIgYWRtaW5pc3RyYXRpdmUgY29uc29sZSBVUkwgcHJvdmlkZWQuIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBUT0RPIGdldCBuYW1lIG9mIHdlYiBzZXJ2aWNlIG1vdW50IHBvaW50Ci0gICAgICAgIEh0dHBDbGllbnQgY2xpZW50ID0gbmV3IEh0dHBDbGllbnQoKTsKLSAgICAgICAgY2xpZW50LmdldFBhcmFtcygpLnNldFBhcmFtZXRlcihIdHRwQ2xpZW50UGFyYW1zLkNPT0tJRV9QT0xJQ1ksIENvb2tpZVBvbGljeS5CUk9XU0VSX0NPTVBBVElCSUxJVFkpOwotCi0gICAgICAgIC8vIGxvZyBpbnRvIEF4aXMyIGFkbWluaXN0cmF0aW9uIGNvbnNvbGUKLSAgICAgICAgVVJMIGF4aXMyQWRtaW5Db25zb2xlTG9naW5VUkwgPSBuZXcgVVJMKGF4aXMyQWRtaW5Db25zb2xlVVJMLnRvU3RyaW5nKCkrIi9sb2dpbiIpOwotICAgICAgICBnZXRMb2coKS5kZWJ1ZygiTG9nZ2luZyBpbnRvIEF4aXMyIEFkbWluIFdlYiBDb25zb2xlICIrYXhpczJBZG1pbkNvbnNvbGVMb2dpblVSTCsiIHVzaW5nIHVzZXIgSUQgIitheGlzMkFkbWluVXNlcik7Ci0KLSAgICAgICAgUG9zdE1ldGhvZCAgcG9zdCA9IG5ldyBQb3N0TWV0aG9kKGF4aXMyQWRtaW5Db25zb2xlTG9naW5VUkwudG9TdHJpbmcoKSk7Ci0gICAgICAgIE5hbWVWYWx1ZVBhaXJbXSBudnBzID0gbmV3IE5hbWVWYWx1ZVBhaXJbXSB7Ci0gICAgICAgICAgICAgICAgbmV3IE5hbWVWYWx1ZVBhaXIoInVzZXJOYW1lIiwgYXhpczJBZG1pblVzZXIpLAotICAgICAgICAgICAgICAgIG5ldyBOYW1lVmFsdWVQYWlyKCJwYXNzd29yZCIsIGF4aXMyQWRtaW5QYXNzd29yZCkKLSAgICAgICAgfTsKLSAgICAgICAgcG9zdC5zZXRSZXF1ZXN0Qm9keShudnBzKTsKLQotICAgICAgICBpbnQgc3RhdHVzID0gY2xpZW50LmV4ZWN1dGVNZXRob2QocG9zdCk7Ci0gICAgICAgIGlmKHN0YXR1cyAhPSAyMDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCJGYWlsZWQgdG8gbG9nIGluIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYocG9zdC5nZXRSZXNwb25zZUJvZHlBc1N0cmluZygpLmluZGV4T2YoTE9HSU5fRkFJTEVEX0VSUk9SX01FU1NBR0UpIT0tMSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oIkZhaWxlZCB0byBsb2cgaW50byBBeGlzMiBhZG1pbmlzdHJhdGlvbiB3ZWIgY29uc29sZSB1c2luZyBjcmVkZW50aWFscyIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZGVwbG95IEFBUiB3ZWIgc2VydmljZQotICAgICAgICBVUkwgYXhpczJBZG1pbkNvbnNvbGVVcGxvYWRVUkwgPSBuZXcgVVJMKGF4aXMyQWRtaW5Db25zb2xlVVJMLnRvU3RyaW5nKCkrIi91cGxvYWQiKTsKLSAgICAgICAgZ2V0TG9nKCkuZGVidWcoIlVwbG9hZGluZyBBQVIgdG8gQXhpczIgQWRtaW4gV2ViIENvbnNvbGUgIitheGlzMkFkbWluQ29uc29sZVVwbG9hZFVSTCk7Ci0KLSAgICAgICAgcG9zdCA9IG5ldyBQb3N0TWV0aG9kKGF4aXMyQWRtaW5Db25zb2xlVXBsb2FkVVJMLnRvU3RyaW5nKCkpOwotICAgICAgICBQYXJ0W10gcGFydHMgPSB7Ci0gICAgICAgICAgICAgICAgbmV3IEZpbGVQYXJ0KHByb2plY3QuZ2V0QXJ0aWZhY3QoKS5nZXRGaWxlKCkuZ2V0TmFtZSgpLCBwcm9qZWN0LmdldEFydGlmYWN0KCkuZ2V0RmlsZSgpKQotICAgICAgICB9OwotICAgICAgICBwb3N0LnNldFJlcXVlc3RFbnRpdHkobmV3IE11bHRpcGFydFJlcXVlc3RFbnRpdHkocGFydHMsIHBvc3QuZ2V0UGFyYW1zKCkpKTsKLQotICAgICAgICBzdGF0dXMgPSBjbGllbnQuZXhlY3V0ZU1ldGhvZChwb3N0KTsKLSAgICAgICAgaWYoc3RhdHVzICE9IDIwMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oIkZhaWxlZCB0byBsb2cgaW4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGxvZyBvdXQgb2Ygd2ViIGNvbnNvbGUKLSAgICAgICAgVVJMIGF4aXMyQWRtaW5Db25zb2xlTG9nb3V0VVJMID0gbmV3IFVSTChheGlzMkFkbWluQ29uc29sZVVSTC50b1N0cmluZygpKyIvbG9nb3V0Iik7Ci0gICAgICAgIGdldExvZygpLmRlYnVnKCJMb2dnaW5nIG91dCBvZiBBeGlzMiBBZG1pbiBXZWIgQ29uc29sZSAiK2F4aXMyQWRtaW5Db25zb2xlTG9nb3V0VVJMKTsKLQotICAgICAgICBHZXRNZXRob2QgZ2V0ID0gbmV3IEdldE1ldGhvZChheGlzMkFkbWluQ29uc29sZUxvZ291dFVSTC50b1N0cmluZygpKTsKLSAgICAgICAgc3RhdHVzID0gY2xpZW50LmV4ZWN1dGVNZXRob2QoZ2V0KTsKLSAgICAgICAgaWYoc3RhdHVzICE9IDIwMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oIkZhaWxlZCB0byBsb2cgb3V0Iik7Ci0gICAgICAgIH0KLQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1hYXItbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi9tYXZlbjIvYWFyL0ZpbGVTZXQuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItYWFyLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvbWF2ZW4yL2Fhci9GaWxlU2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0Y2I3YTQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1hYXItbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi9tYXZlbjIvYWFyL0ZpbGVTZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5tYXZlbjIuYWFyOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi0KLS8qKgotICogQSBGaWxlU2V0IGRlZmluZXMgYWRkaXRpb25hbCBmaWxlcywgd2hpY2ggYXJlIGJlaW5nIGFkZGVkIHRvIHRoZSBBeGlzIGFwcGxpY2F0aW9uIGFyY2hpdmUuIFRoZQotICogb2JqZWN0cyBzdHJ1Y3R1cmUgZm9sbG93cyB0aGUgRmlsZVNldCBvYmplY3QgZnJvbSB0aGUgbWF2ZW4tYXNzZW1ibHktcGx1Z2luLCBzZWUgdGhlIDxhCi0gKiBocmVmPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS5odG1sIj5wbHVnaW4KLSAqIGRvY3VtZW50YXRpb248L2E+IGZvciBkZXRhaWxzLgotICovCi1wdWJsaWMgY2xhc3MgRmlsZVNldCB7Ci0gICAgcHJpdmF0ZSBGaWxlIGRpcmVjdG9yeTsKLSAgICBwcml2YXRlIFN0cmluZyBvdXRwdXREaXJlY3Rvcnk7Ci0gICAgcHJpdmF0ZSBTdHJpbmdbXSBpbmNsdWRlcywgZXhjbHVkZXM7Ci0gICAgcHJpdmF0ZSBib29sZWFuIHNraXBEZWZhdWx0RXhjbHVkZXM7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBmaWxlIHNldHMgYmFzZSBkaXJlY3RvcnkuIE1heSBiZSBvbWl0dGVkLCBpbiB3aGljaCBjYXNlIHRoZSBwcm9qZWN0cyBiYXNlCi0gICAgICogZGlyZWN0b3J5IGlzIGFzc3VtZWQuCi0gICAgICovCi0gICAgcHVibGljIEZpbGUgZ2V0RGlyZWN0b3J5KCkgewotICAgICAgICByZXR1cm4gZGlyZWN0b3J5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGZpbGUgc2V0cyBiYXNlIGRpcmVjdG9yeS4gTWF5IGJlIG9taXR0ZWQsIGluIHdoaWNoIGNhc2UgdGhlIHByb2plY3RzIGJhc2UgZGlyZWN0b3J5Ci0gICAgICogaXMgYXNzdW1lZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREaXJlY3RvcnkoRmlsZSBkaXJlY3RvcnkpIHsKLSAgICAgICAgdGhpcy5kaXJlY3RvcnkgPSBkaXJlY3Rvcnk7Ci0gICAgfQotCi0gICAgLyoqIFJldHVybnMgdGhlIGZpbGUgc2V0cyBleGNsdXNpb24gbGlzdC4gKi8KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0RXhjbHVkZXMoKSB7Ci0gICAgICAgIHJldHVybiBleGNsdWRlczsKLSAgICB9Ci0KLSAgICAvKiogU2V0cyB0aGUgZmlsZSBzZXRzIGV4Y2x1c2lvbiBsaXN0LiAqLwotICAgIHB1YmxpYyB2b2lkIHNldEV4Y2x1ZGVzKFN0cmluZ1tdIGV4Y2x1ZGVzKSB7Ci0gICAgICAgIHRoaXMuZXhjbHVkZXMgPSBleGNsdWRlczsKLSAgICB9Ci0KLSAgICAvKiogUmV0dXJucyB0aGUgZmlsZSBzZXRzIGluY2x1c2lvbiBsaXN0LiAqLwotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRJbmNsdWRlcygpIHsKLSAgICAgICAgcmV0dXJuIGluY2x1ZGVzOwotICAgIH0KLQotICAgIC8qKiBTZXRzIHRoZSBmaWxlIHNldHMgaW5jbHVzaW9uIGxpc3QuICovCi0gICAgcHVibGljIHZvaWQgc2V0SW5jbHVkZXMoU3RyaW5nW10gaW5jbHVkZXMpIHsKLSAgICAgICAgdGhpcy5pbmNsdWRlcyA9IGluY2x1ZGVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgYSBwcmVmaXgsIHdoaWNoIHRoZSBpbmNsdWRlZCBmaWxlcyBzaG91bGQgaGF2ZSB3aGVuIGJlaW5nIGFkZGVkIHRvIHRoZSBBeGlzIGFwcGxpY2F0aW9uCi0gICAgICogYXJjaGl2ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE91dHB1dERpcmVjdG9yeSgpIHsKLSAgICAgICAgcmV0dXJuIG91dHB1dERpcmVjdG9yeTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgcHJlZml4LCB3aGljaCB0aGUgaW5jbHVkZWQgZmlsZXMgc2hvdWxkIGhhdmUgd2hlbiBiZWluZyBhZGRlZCB0byB0aGUgQXhpcwotICAgICAqIGFwcGxpY2F0aW9uIGFyY2hpdmUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0T3V0cHV0RGlyZWN0b3J5KFN0cmluZyBvdXRwdXREaXJlY3RvcnkpIHsKLSAgICAgICAgdGhpcy5vdXRwdXREaXJlY3RvcnkgPSBvdXRwdXREaXJlY3Rvcnk7Ci0gICAgfQotCi0gICAgLyoqIFJldHVybnMsIHdoZXRoZXIgdGhlIGRlZmF1bHQgZXhjbHVkZXMgc2hvdWxkIGJlIHVzZWQuIERlZmF1bHRzIHRvIHRydWUuICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNTa2lwRGVmYXVsdEV4Y2x1ZGVzKCkgewotICAgICAgICByZXR1cm4gc2tpcERlZmF1bHRFeGNsdWRlczsKLSAgICB9Ci0KLSAgICAvKiogU2V0cywgd2hldGhlciB0aGUgZGVmYXVsdCBleGNsdWRlcyBzaG91bGQgYmUgdXNlZC4gRGVmYXVsdHMgdG8gdHJ1ZS4gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTa2lwRGVmYXVsdEV4Y2x1ZGVzKGJvb2xlYW4gc2tpcERlZmF1bHRFeGNsdWRlcykgewotICAgICAgICB0aGlzLnNraXBEZWZhdWx0RXhjbHVkZXMgPSBza2lwRGVmYXVsdEV4Y2x1ZGVzOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItYWFyLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvcGxleHVzL2NvbXBvbmVudHMueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1hYXItbWF2ZW4tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9wbGV4dXMvY29tcG9uZW50cy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyMjdiNTkuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1hYXItbWF2ZW4tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9wbGV4dXMvY29tcG9uZW50cy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxjb21wb25lbnQtc2V0PgotICA8Y29tcG9uZW50cz4KLSAgICA8Y29tcG9uZW50PgotICAgICAgPHJvbGU+b3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5oYW5kbGVyLkFydGlmYWN0SGFuZGxlcjwvcm9sZT4KLSAgICAgIDxyb2xlLWhpbnQ+YWFyPC9yb2xlLWhpbnQ+Ci0gICAgICA8aW1wbGVtZW50YXRpb24+b3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5oYW5kbGVyLkRlZmF1bHRBcnRpZmFjdEhhbmRsZXI8L2ltcGxlbWVudGF0aW9uPgotICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgIDxleHRlbnNpb24+YWFyPC9leHRlbnNpb24+Ci0gICAgICAgIDx0eXBlPmFhcjwvdHlwZT4KLSAgICAgICAgPGxhbmd1YWdlPmphdmE8L2xhbmd1YWdlPgotICAgICAgICA8YWRkZWRUb0NsYXNzcGF0aD5mYWxzZTwvYWRkZWRUb0NsYXNzcGF0aD4KLSAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICA8L2NvbXBvbmVudD4KLSAgICA8Y29tcG9uZW50PgotICAgICAgPHJvbGU+b3JnLmFwYWNoZS5tYXZlbi5saWZlY3ljbGUubWFwcGluZy5MaWZlY3ljbGVNYXBwaW5nPC9yb2xlPgotICAgICAgPHJvbGUtaGludD5hYXI8L3JvbGUtaGludD4KLSAgICAgIDxpbXBsZW1lbnRhdGlvbj5vcmcuYXBhY2hlLm1hdmVuLmxpZmVjeWNsZS5tYXBwaW5nLkRlZmF1bHRMaWZlY3ljbGVNYXBwaW5nPC9pbXBsZW1lbnRhdGlvbj4KLSAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICA8bGlmZWN5Y2xlcz4KLSAgICAgICAgICA8bGlmZWN5Y2xlPgotICAgICAgICAgICAgPGlkPmRlZmF1bHQ8L2lkPgotICAgICAgICAgICAgPHBoYXNlcz4KLSAgICAgICAgICAgICAgPHByb2Nlc3MtcmVzb3VyY2VzPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczptYXZlbi1yZXNvdXJjZXMtcGx1Z2luOnJlc291cmNlczwvcHJvY2Vzcy1yZXNvdXJjZXM+Ci0gICAgICAgICAgICAgIDxjb21waWxlPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczptYXZlbi1jb21waWxlci1wbHVnaW46Y29tcGlsZTwvY29tcGlsZT4KLSAgICAgICAgICAgICAgPHByb2Nlc3MtdGVzdC1yZXNvdXJjZXM+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zOm1hdmVuLXJlc291cmNlcy1wbHVnaW46dGVzdFJlc291cmNlczwvcHJvY2Vzcy10ZXN0LXJlc291cmNlcz4KLSAgICAgICAgICAgICAgPHRlc3QtY29tcGlsZT5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM6bWF2ZW4tY29tcGlsZXItcGx1Z2luOnRlc3RDb21waWxlPC90ZXN0LWNvbXBpbGU+Ci0gICAgICAgICAgICAgIDx0ZXN0Pm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczptYXZlbi1zdXJlZmlyZS1wbHVnaW46dGVzdDwvdGVzdD4KLSAgICAgICAgICAgICAgPHBhY2thZ2U+b3JnLmFwYWNoZS5heGlzMjpheGlzMi1hYXItbWF2ZW4tcGx1Z2luOmFhcjwvcGFja2FnZT4KLSAgICAgICAgICAgICAgPGluc3RhbGw+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zOm1hdmVuLWluc3RhbGwtcGx1Z2luOmluc3RhbGw8L2luc3RhbGw+Ci0gICAgICAgICAgICAgIDxkZXBsb3k+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zOm1hdmVuLWRlcGxveS1wbHVnaW46ZGVwbG95PC9kZXBsb3k+Ci0gICAgICAgICAgICA8L3BoYXNlcz4KLSAgICAgICAgICA8L2xpZmVjeWNsZT4KLSAgICAgICAgPC9saWZlY3ljbGVzPgotICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgIDwvY29tcG9uZW50PgotICA8L2NvbXBvbmVudHM+Ci08L2NvbXBvbmVudC1zZXQ+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWFhci1tYXZlbi1wbHVnaW4vc3JjL3NpdGUvYXB0L2NvbmZpZ3VyYXRpb24uYXB0IGIvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1hYXItbWF2ZW4tcGx1Z2luL3NyYy9zaXRlL2FwdC9jb25maWd1cmF0aW9uLmFwdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGVlYWFlNC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWFhci1tYXZlbi1wbHVnaW4vc3JjL3NpdGUvYXB0L2NvbmZpZ3VyYXRpb24uYXB0CisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLUNvbmZpZ3VyYXRpb24KLQotICBBbGwgQWFyIHBsdWdpbiBnb2FscyB0YWtlcyB0aGUgZm9sbG93aW5nIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBhcyBpbnB1dDoKLQotKi0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgUGFyYW1ldGVyIG5hbWUgICB8IERlZmF1bHQgdmFsdWUgICAgICAgICAgICAgICAgICAgIHwgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBhYXJEaXJlY3RvcnkgICAgIHwgJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vYWFyICAgfCBEaXJlY3Rvcnkgd2hlcmUgdGhlIGFhciBmaWxlIGlzIGJ1aWx0LiAgICAgICAgIHwKLSotLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IGNsYXNzZXNEaXJlY3RvcnkgfCAke3Byb2plY3QuYnVpbGQub3V0cHV0RGlyZWN0b3J5fSB8IERpcmVjdG9yeSB3aXRoIGNvbXBpbGVkIGNsYXNzZXMgYW5kIHJlc291cmNlcy4gfAotKi0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgZmlsZVNldHMgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQWRkaXRpb25hbCBmaWxlIHNldHMsIHdoaWNoIGFyZSBiZWluZyBhZGRlZCB0byB8Ci18ICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRoZSBhcmNoaXZlLiBTZWUgIkZpbGUgU2V0cyIgYmVsb3cgZm9yIGFuICAgICAgfAotfCAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBleGFtcGxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSotLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IHNlcnZpY2VzWG1sRmlsZSAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IExvY2F0aW9uIG9mIHRoZSBzZXJ2aWNlcy54bWwgZmlsZS4gQnkgZGVmYXVsdCwgfAotfCAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBpdCBpcyBhc3N1bWVkIHRoYXQgdGhlIGZpbGUgaXMgYWxyZWFkeSBwcmVzZW50IHwKLXwgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaW4gY2xhc3Nlc0RpcmVjdG9yeS9NRVRBLUlORiBhbmQgbm8gc3BlY2lhbCAgICB8Ci18ICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHByb2Nlc3NpbmcgaXMgcmVxdWlyZWQuICAgICAgICAgICAgICAgICAgICAgICAgfAotKi0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgd3NkbEZpbGUgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTG9jYXRpb24gb2YgdGhlIFdTREwgZmlsZS4gQnkgZGVmYXVsdCwgaXQgaXMgICB8Ci18ICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGFzc3VtZWQgdGhhdCB0aGUgZmlsZSBpcyBhbHJlYWR5IHByZXNlbnQgaW4gICAgfAotfCAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBjbGFzc2VzRGlyZWN0b3J5L01FVEEtSU5GIGFuZCBubyBzcGVjaWFsICAgICAgIHwKLXwgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcHJvY2Vzc2luZyBpcyByZXF1aXJlZC4gICAgICAgICAgICAgICAgICAgICAgICB8Ci0qLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCB3c2RsRmlsZU5hbWUgICAgIHwgc2VydmljZS53c2RsICAgICAgICAgICAgICAgICAgICAgfCBOYW1lLCB0byB3aGljaCB0aGUgV1NETCBmaWxlIHNob3VsZCBiZSBtYXBwZWQuIHwKLSotLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0KLQotVGhlIGFhciBnb2FsCi0KLSAgVGhlIGFhciBnb2FsIGFsbG93cyB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgcGFyYW1ldGVyczoKLQotKi0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgUGFyYW1ldGVyIG5hbWUgICB8IERlZmF1bHQgdmFsdWUgICAgICAgICAgICAgIHwgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBvdXRwdXREaXJlY3RvcnkgIHwgJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0gfCBEaXJlY3Rvcnkgd2hlcmUgdG8gZ2VuZXJhdGUgdGhlIEFBUiBmaWxlLiAgICAgIHwKLSotLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IGFhck5hbWUgICAgICAgICAgfCAke3Byb2plY3QuYnVpbGQuZmluYWxOYW1lfSB8IFRoZSBnZW5lcmF0ZWQgQUFSIGZpbGVzIG5hbWUuICAgICAgICAgICAgICAgICAgfAotKi0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgYXJjaGl2ZSAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQSBNYXZlbiBhcmNoaXZlIGNvbmZpZ3VyYXRpb24uIFRoaXMgYWxsb3dzLCAgICB8Ci18ICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGZvciBleGFtcGxlLCB0byBjb25maWd1cmUgdGhlIE1BTklGRVNULk1GICAgICAgfAotfCAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBmaWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSotLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IGNsYXNzaWZpZXIgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEEgY2xhc3NpZmllciwgd2hpY2ggc2hvdWxkIGJlIGFkZGVkIHRvIHRoZSAgICAgfAotfCAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBnZW5lcmF0ZWQgQUFSIGZpbGVzIG5hbWUuIFNldHRpbmcgdGhpcyAgICAgICAgIHwKLXwgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFyYW1ldGVyIGhhcyB0aGUgc2lkZSBlZmZlY3QsIHRoYXQgdGhlICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGFydGlmYWN0IGlzIHRyZWF0ZWQgYXMgYW4gYXR0YWNobWVudCBhbmQgbm90ICAgfAotfCAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhcyB0aGUgcHJvamVjdHMgcHJpbWFyeSBhcnRpZmFjdC4gICAgICAgICAgICAgIHwKLSotLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IHByaW1hcnlBcnRpZmFjdCAgfCB0cnVlICAgICAgICAgICAgICAgICAgICAgICB8IFNldHRpbmcgdGhpcyBwcm9wZXJ0eSB0byBmYWxzZSBkaXNhYmxlcyAgICAgICAgfAotfCAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBpbnN0YWxsYXRpb24gb3IgZGVwbG95bWVudCBvZiB0aGUgYXJ0aWZhY3QgYXMgIHwKLXwgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGhlIHByb2plY3RzIHByaW1hcnkgYXJ0aWZhY3QuICAgICAgICAgICAgICAgICB8Ci0qLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotCi0KLUZpbGUgU2V0cwotCi0gIEFkZGl0aW9uYWwgZmlsZSBzZXRzIG1heSBiZSBjb25maWd1cmVkIGZvciBpbmNsdXNpb24gaW50byB0aGUgQUFSIGZpbGUuIEEgZmlsZSBzZXQgbG9va3MKLSAgYXMgZm9sbG93czoKLQotLS0tLS0tLS0tLS0tLS0tLS0KLSAgPGZpbGVTZXRzPgotICAgIDxmaWxlU2V0PgotICAgICAgPGRpcmVjdG9yeT5zcmMvYWFyL2ZpbGVzPC9kaXJlY3Rvcnk+Ci0gICAgICA8b3V0cHV0RGlyZWN0b3J5Pk1FVEEtSU5GL2RvY3M8L291dHB1dERpcmVjdG9yeT4KLSAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgPGluY2x1ZGU+KiovKi5odG1sPC9pbmNsdWRlPgotICAgICAgPC9pbmNsdWRlcz4KLSAgICA8L2ZpbGVTZXQ+Ci0gICAgPGZpbGVTZXQ+Ci0gICAgICA8ZGlyZWN0b3J5PnNyYy9hYXIvZmlsZXM8L2RpcmVjdG9yeT4KLSAgICAgIDxvdXRwdXREaXJlY3Rvcnk+TUVUQS1JTkYvZXRjPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICA8ZXhjbHVkZXM+Ci0gICAgICAgIDxleGNsdWRlPioqLyouaHRtbDwvZXhjbHVkZT4KLSAgICAgIDwvZXhjbHVkZXM+Ci0gICAgPC9maWxlU2V0PgotICA8L2ZpbGVTZXRzPgotLS0tLS0tLS0tLS0tLS0tLS0KLQotICBUaGUgZXhhbXBsZSBzcGVjaWZpZXMsIHRoYXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBkaXJlY3Rvcnkgc3JjL2Fhci9maWxlcyBzaGFsbAotICBiZSBhZGRlZCB0byB0aGUgQUFSIGZpbGUuIEhUTUwgZmlsZXMgd2lsbCBnbyBpbnRvIE1FVEEtSU5GL2RvY3MsIGFsbCBvdGhlcgotICBmaWxlcyB0byBNRVRBLUlORi9ldGMuCi0KLSAgQSBmaWxlIHNldCBpcyBjb25maWd1cmVkIHRocm91Z2ggdGhlIGZvbGxvd2luZyBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnM6Ci0KLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgUGFyYW1ldGVyIG5hbWUgICAgICB8IERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgZGlyZWN0b3J5ICAgICAgICAgICB8IFRoZSBkaXJlY3RvcnksIGZyb20gd2hpY2ggdG8gcmVhZCB0aGUgZmlsZSBzZXQuIFRoaXMgcGFyYW1ldGVyIGlzIHwKLXwgICAgICAgICAgICAgICAgICAgICB8IHJlcXVpcmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgb3V0cHV0RGlyZWN0b3J5ICAgICB8IFRoZSB0YXJnZXQgZGlyZWN0b3J5IHdpdGhpbiB0aGUgQUFSIGZpbGUuIERlZmF1bHRzIHRvIHRoZSBBQVIgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICB8IGZpbGVzIHJvb3QgZGlyZWN0b3J5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgaW5jbHVkZXMgICAgICAgICAgICB8IENvbmZpZ3VyZXMgdGhlIHNldCBvZiBmaWxlcywgd2hpY2ggc2hhbGwgYmUgaW5jbHVkZWQgaW50byB0aGUgQUFSIHwKLXwgICAgICAgICAgICAgICAgICAgICB8IGZpbGUuIERlZmF1bHRzIHRvICoqLyouICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgZXhjbHVkZXMgICAgICAgICAgICB8IENvbmZpZ3VyZXMgYSBzZXQgb2YgZmlsZXMsIHdoaWNoIHNoYWxsIGJlIGV4Y2x1ZGVkIGZyb20gdGhlIGZpbGUgIHwKLXwgICAgICAgICAgICAgICAgICAgICB8IHNldC4gRGVmYXVsdHMgdG8gdGhlIE1hdmVuIGRlZmF1bHQgZXhjbHVkZXMgKCoqLyp+LCAqKi9jdnMvKiovKiwgIHwKLXwgICAgICAgICAgICAgICAgICAgICB8ICoqLy5zdm4vKiovKiwgZXRjLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgc2tpcERlZmF1bHRFeGNsdWRlcyB8IElmIHRoaXMgcGFyYW1ldGVyIGlzIHNldCB0byB0cnVlLCB0aGVuIG5vIGRlZmF1bHQgZXhjbHVkZXMgYXJlICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICB8IGJlaW5nIHVzZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItYWFyLW1hdmVuLXBsdWdpbi9zcmMvc2l0ZS9hcHQvaG93dG8uYXB0IGIvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1hYXItbWF2ZW4tcGx1Z2luL3NyYy9zaXRlL2FwdC9ob3d0by5hcHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlY2YzMDMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1hYXItbWF2ZW4tcGx1Z2luL3NyYy9zaXRlL2FwdC9ob3d0by5hcHQKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0gLS0tLS0tCi0gTWF2ZW4gMiBBYXIgUGx1Z2luOiBjb25maWd1cmF0aW9uIGV4YW1wbGVzCi0gLS0tLS0tCi0gSm9jaGVuIFdpZWRtYW5uIAotIDxqb2NoZW4ud2llZG1hbm5AZ21haWwuY29tPgotIC0tLS0tLQotCi1Hb2FscwotCi0gIFRoZSBBYXIgcGx1Z2luIGFsbG93cyB0aGUgcGFja2FnaW5nIG9mIGFuIEF4aXMgMiBzZXJ2aWNlIGFhciBpbiAzIGRpZmZlcmVudCBtb2RlczoKLQotICAgKiBhYXIgKGRlZmF1bHQpOiBnZW5lcmF0ZXMgdGhlIGFhciBhcnRpZmFjdAotCi0gICAqIGlucGxhY2U6IHBhY2thZ2UgdGhlIGFhciBpbiB0aGUgc291cmNlIHRyZWUKLQotICAgKiBleHBsb2RlZCA6IHBhY2thZ2UgYW4gZXhwbG9kZWQgYWFyIGFwcGxpY2F0aW9uCi0KLSAgRWFjaCBtb2RlIGlzIG1hdGVyaWFsaXplZCBieSBhIGdvYWwuIEZvciBpbnN0YW5jZSwgdG8gZ2VuZXJhdGUgYW4gZXhwbG9kZWQKLSAgYWFyIGZyb20gdGhlIGN1cnJlbnQgcHJvamVjdCwgb25lIHdvdWxkIHR5cGUKLQotKy0tLS0tLS0tCi0gIG12biBhYXI6ZXhwbG9kZWQKLSstLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItYWFyLW1hdmVuLXBsdWdpbi9zcmMvc2l0ZS9hcHQvaW50cm9kdWN0aW9uLmFwdCBiL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItYWFyLW1hdmVuLXBsdWdpbi9zcmMvc2l0ZS9hcHQvaW50cm9kdWN0aW9uLmFwdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg1N2RiNS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWFhci1tYXZlbi1wbHVnaW4vc3JjL3NpdGUvYXB0L2ludHJvZHVjdGlvbi5hcHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0gLS0tLS0tCi0gTWF2ZW4gMiBBYXIgUGx1Z2luCi0gLS0tLS0tCi0gSm9jaGVuIFdpZWRtYW5uCi0gPGpvY2hlbi53aWVkbWFubkBnbWFpbC5jb20+Ci0gLS0tLS0tCi0KLUludHJvZHVjdGlvbgotCi0gIFRoaXMgcGx1Z2luIGdlbmVyYXRlcyBhbiBBeGlzIDIgc2VydmljZSBmaWxlIChBQVIgZmlsZSkuCi0KLSAgVGhlIGZ1bGwgZGVzY3JpcHRpb24gb2YgZ29hbHMgaXMgYXZhaWxhYmxlIHt7e2hvd3RvLmh0bWx9aGVyZX19LgotCi0KLQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1hYXItbWF2ZW4tcGx1Z2luL3NyYy9zaXRlL3NpdGUueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1hYXItbWF2ZW4tcGx1Z2luL3NyYy9zaXRlL3NpdGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjU1OWU3Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItYWFyLW1hdmVuLXBsdWdpbi9zcmMvc2l0ZS9zaXRlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08cHJvamVjdCBuYW1lPSJNYXZlbiBBeGlzIDIgQUFSIFBsdWdpbiI+Ci0gIDxiYW5uZXJMZWZ0PgotICAgIDxuYW1lPk1hdmVuIEF4aXMgMiBBQVIgUGx1Z2luPC9uYW1lPgotICAgIDxzcmM+aHR0cDovL21hdmVuLmFwYWNoZS5vcmcvaW1hZ2VzL2FwYWNoZS1tYXZlbi1wcm9qZWN0LnBuZzwvc3JjPgotICAgIDxocmVmPmh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnLzwvaHJlZj4KLSAgPC9iYW5uZXJMZWZ0PgotICA8YmFubmVyUmlnaHQ+Ci0gICAgPHNyYz5odHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9pbWFnZXMvbWF2ZW4tc21hbGwuZ2lmPC9zcmM+Ci0gIDwvYmFubmVyUmlnaHQ+Ci0gIDxib2R5PgotICAgIDxsaW5rcz4KLSAgICAgIDxpdGVtIG5hbWU9IkFwYWNoZSIgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnLyIvPgotICAgICAgPGl0ZW0gbmFtZT0iV2Vic2VydmljZXMiIGhyZWY9Imh0dHA6Ly93cy5hcGFjaGUub3JnLyIvPgotICAgICAgPGl0ZW0gbmFtZT0iQXhpcyAyIiBocmVmPSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi8iLz4KLSAgICAgIDxpdGVtIG5hbWU9Ik1hdmVuIDIiIGhyZWY9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuMi8iLz4KLSAgICA8L2xpbmtzPgotCi0gICAgPG1lbnUgbmFtZT0iT3ZlcnZpZXciPgotICAgICAgPGl0ZW0gbmFtZT0iSW50cm9kdWN0aW9uIiBocmVmPSJpbnRyb2R1Y3Rpb24uaHRtbCIvPgotICAgICAgPGl0ZW0gbmFtZT0iSG93IHRvIFVzZSIgaHJlZj0iaG93dG8uaHRtbCIvPgotICAgICAgPGl0ZW0gbmFtZT0iQ29uZmlndXJhdGlvbiIgaHJlZj0iY29uZmlndXJhdGlvbi5odG1sIi8+Ci0gICAgPC9tZW51PgotICAgICR7cmVwb3J0c30KLSAgPC9ib2R5PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1hbnQtcGx1Z2luL3BvbS54bWwgYi92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWFudC1wbHVnaW4vcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY0MTljNi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWFudC1wbHVnaW4vcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItcGFyZW50PC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4xLjUuMTwvdmVyc2lvbj4KLSAgICAgICAgPHJlbGF0aXZlUGF0aD4uLi8uLi9wYXJlbnQvcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgotICAgIDwvcGFyZW50PgotICAgIDxhcnRpZmFjdElkPmF4aXMyLWFudC1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgPG5hbWU+QXBhY2hlIEF4aXMyIC0gdG9vbCAtIEFudCBQbHVnaW48L25hbWU+Ci0gICAgPHBhY2thZ2luZz5tYXZlbi1wbHVnaW48L3BhY2thZ2luZz4KLSAgICA8ZGVzY3JpcHRpb24+VGhlIEF4aXMgMiBQbHVnaW4gZm9yIEFudCBUYXNrcy48L2Rlc2NyaXB0aW9uPgotICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLWNvZGVnZW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3ZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLWtlcm5lbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7dmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItYWRiPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHt2ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1hZGItY29kZWdlbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7dmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItamF2YTJ3c2RsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHt2ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+d3NkbDRqPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+d3NkbDRqPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1sb2dnaW5nPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1sb2dnaW5nPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1odHRwY2xpZW50PC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1odHRwY2xpZW50PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHNjb3BlPnJ1bnRpbWU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5uZWV0aGk8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5uZWV0aGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+WG1sU2NoZW1hPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5nZXJvbmltby5zcGVjczwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmdlcm9uaW1vLWphdmFtYWlsXzEuNF9zcGVjPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5nZXJvbmltby5zcGVjczwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmdlcm9uaW1vLWFjdGl2YXRpb25fMS4xX3NwZWM8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmFudDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmFudDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgIDwvZGVwZW5kZW5jaWVzPgotICAgIDxidWlsZD4KLSAgICAgICAgPHJlc291cmNlcz4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5Pi4uLy4uLy4uPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5OT1RJQ0UudHh0PC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5MSUNFTlNFLnR4dDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgICAgIDxmaWx0ZXJpbmc+ZmFsc2U8L2ZpbHRlcmluZz4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgIDwvcmVzb3VyY2VzPgotICAgIDwvYnVpbGQ+Ci0gICAgPGRpc3RyaWJ1dGlvbk1hbmFnZW1lbnQ+Ci0gICAgICAgIDxyZXBvc2l0b3J5PgotICAgICAgICAgICAgPGlkPmFwYWNoZS1yZXBvPC9pZD4KLSAgICAgICAgICAgIDxuYW1lPk1hdmVuIENlbnRyYWwgUmVwb3NpdG9yeTwvbmFtZT4KLSAgICAgICAgICAgIDx1cmw+c2NwZXhlOi8vcGVvcGxlLmFwYWNoZS5vcmcvL3d3dy9wZW9wbGUuYXBhY2hlLm9yZy9yZXBvL20yLWliaWJsaW8tcnN5bmMtcmVwb3NpdG9yeTwvdXJsPgotICAgICAgICA8L3JlcG9zaXRvcnk+Ci0gICAgICAgIDxzbmFwc2hvdFJlcG9zaXRvcnk+Ci0gICAgICAgICAgICA8aWQ+YXBhY2hlLXNuYXBzaG90czwvaWQ+Ci0gICAgICAgICAgICA8bmFtZT5BcGFjaGUgRGV2ZWxvcG1lbnQgUmVwb3NpdG9yeTwvbmFtZT4KLSAgICAgICAgICAgIDx1cmw+c2NwZXhlOi8vcGVvcGxlLmFwYWNoZS5vcmcvL3d3dy9wZW9wbGUuYXBhY2hlLm9yZy9yZXBvL20yLXNuYXBzaG90LXJlcG9zaXRvcnk8L3VybD4KLSAgICAgICAgPC9zbmFwc2hvdFJlcG9zaXRvcnk+Ci0gICAgPC9kaXN0cmlidXRpb25NYW5hZ2VtZW50PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1hbnQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL2FudC9BbnRDb2RlZ2VuVGFzay5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1hbnQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL2FudC9BbnRDb2RlZ2VuVGFzay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTM0MTdiLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItYW50LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9hbnQvQW50Q29kZWdlblRhc2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudG9vbC5hbnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuQ29tbWFuZExpbmVPcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLkNvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5Db21tYW5kTGluZU9wdGlvblBhcnNlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuVVJMUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLkNvZGVHZW5lcmF0aW9uRW5naW5lOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC51dGlsLkNvbmZpZ1Byb3BlcnR5RmlsZUxvYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5BbnRDbGFzc0xvYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlZmVyZW5jZTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotCi1wdWJsaWMgY2xhc3MgQW50Q29kZWdlblRhc2sgZXh0ZW5kcyBUYXNrIHsKLQotICAgIHByaXZhdGUgU3RyaW5nIHdzZGxGaWxlTmFtZSA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgb3V0cHV0ID0gIi4iOwotICAgIHByaXZhdGUgU3RyaW5nIGxhbmd1YWdlID0gQ29uZmlnUHJvcGVydHlGaWxlTG9hZGVyLmdldERlZmF1bHRMYW5ndWFnZSgpOwotICAgIHByaXZhdGUgU3RyaW5nIHBhY2thZ2VOYW1lID0gVVJMUHJvY2Vzc29yLkRFRkFVTFRfUEFDS0FHRTsKLSAgICBwcml2YXRlIFN0cmluZyBkYXRhYmluZGluZ05hbWUgPSBDb25maWdQcm9wZXJ0eUZpbGVMb2FkZXIuZ2V0RGVmYXVsdERCRnJhbWV3b3JrTmFtZSgpOwotICAgIHByaXZhdGUgU3RyaW5nIHBvcnROYW1lID0gbnVsbDsKLSAgICBwcml2YXRlIFN0cmluZyBzZXJ2aWNlTmFtZSA9IG51bGw7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gYXN5bmNPbmx5ID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBib29sZWFuIHN5bmNPbmx5ID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBib29sZWFuIHNlcnZlclNpZGUgPSBmYWxzZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gdGVzdGNhc2UgPSBmYWxzZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gZ2VuZXJhdGVTZXJ2aWNlWG1sID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGdlbmVyYXRlQWxsQ2xhc3NlcyA9IGZhbHNlOwotICAgIHByaXZhdGUgYm9vbGVhbiB1bnBhY2tDbGFzc2VzID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBib29sZWFuIHNlcnZlclNpZGVJbnRlcmZhY2UgPSBmYWxzZTsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBhbGxQb3J0cyA9IGZhbHNlOwotICAgIHByaXZhdGUgYm9vbGVhbiBiYWNrd2FyZENvbXBhdGlibGUgPSBmYWxzZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gZmxhdHRlbkZpbGVzID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBib29sZWFuIHNraXBNZXNzYWdlUmVjZWl2ZXIgPSBmYWxzZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gc2tpcEJ1aWxkWE1MID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBib29sZWFuIHNraXBXU0RMID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG92ZXJXcml0ZSA9IGZhbHNlOwotICAgIHByaXZhdGUgYm9vbGVhbiBzdXBwcmVzc1ByZWZpeGVzID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBQcm9wZXJ0aWVzIHByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKLQotICAgIHByaXZhdGUgU3RyaW5nIHJlcG9zaXRvcnlQYXRoID0gbnVsbDsKLSAgICBwcml2YXRlIFN0cmluZyBleHRlcm5hbE1hcHBpbmcgPSBudWxsOwotICAgIHByaXZhdGUgU3RyaW5nIHdzZGxWZXJzaW9uID0gbnVsbDsKLSAgICBwcml2YXRlIFN0cmluZyB0YXJnZXRTb3VyY2VGb2xkZXJMb2NhdGlvbiA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgdGFyZ2V0UmVzb3VyY2VzRm9sZGVyTG9jYXRpb24gPSBudWxsOwotICAgIHByaXZhdGUgYm9vbGVhbiB1bndyYXAgPSBmYWxzZTsKLQotICAgIHByaXZhdGUgU3RyaW5nIG5hbWVzcGFjZVRvUGFja2FnZXMgPSBudWxsOwotCi0gICAgcHJpdmF0ZSBQYXRoIGNsYXNzcGF0aDsKLQotCi0gICAgLyoqCi0gICAgICogCi0gICAgICovCi0gICAgcHVibGljIEFudENvZGVnZW5UYXNrKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgY2xhc3NwYXRoLgotICAgICAqCi0gICAgICogQHJldHVybiBSZXR1cm5zIFBhdGguCi0gICAgICovCi0gICAgcHVibGljIFBhdGggY3JlYXRlQ2xhc3NwYXRoKCkgewotICAgICAgICBpZiAoY2xhc3NwYXRoID09IG51bGwpIHsKLSAgICAgICAgICAgIGNsYXNzcGF0aCA9IG5ldyBQYXRoKGdldFByb2plY3QoKSk7Ci0gICAgICAgICAgICBjbGFzc3BhdGggPSBjbGFzc3BhdGguY29uY2F0U3lzdGVtQ2xhc3NwYXRoKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNsYXNzcGF0aC5jcmVhdGVQYXRoKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSByZWZlcmVuY2UgdG8gYW4gb3B0aW9uYWwgY2xhc3NwYXRoCi0gICAgICoKLSAgICAgKiBAcGFyYW0gciB0aGUgaWQgb2YgdGhlIEFudCBwYXRoIGluc3RhbmNlIHRvIGFjdCBhcyB0aGUgY2xhc3NwYXRoCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q2xhc3NwYXRoUmVmKFJlZmVyZW5jZSByKSB7Ci0gICAgICAgIGNyZWF0ZUNsYXNzcGF0aCgpLnNldFJlZmlkKHIpOwotICAgIH0KLQotICAgIC8qKiBAcmV0dXJuICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzU2VydmVyU2lkZUludGVyZmFjZSgpIHsKLSAgICAgICAgcmV0dXJuIHNlcnZlclNpZGVJbnRlcmZhY2U7Ci0gICAgfQotCi0gICAgLyoqIEBwYXJhbSBzZXJ2ZXJTaWRlSW50ZXJmYWNlICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNlcnZlclNpZGVJbnRlcmZhY2UoYm9vbGVhbiBzZXJ2ZXJTaWRlSW50ZXJmYWNlKSB7Ci0gICAgICAgIHRoaXMuc2VydmVyU2lkZUludGVyZmFjZSA9IHNlcnZlclNpZGVJbnRlcmZhY2U7Ci0gICAgfQotCi0gICAgLyoqIEZpbGxzIHRoZSBvcHRpb24gbWFwLiBUaGlzIG1hcCBpcyBwYXNzZWQgb250byB0aGUgY29kZSBnZW5lcmF0aW9uIEFQSSB0byBnZW5lcmF0ZSB0aGUgY29kZS4gKi8KLSAgICBwcml2YXRlIE1hcCBmaWxsT3B0aW9uTWFwKCkgewotICAgICAgICBNYXAgb3B0aW9uTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgICAgIC8vV1NETCBmaWxlIG5hbWUKLSAgICAgICAgb3B0aW9uTWFwLnB1dCgKLSAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuV1NETF9MT0NBVElPTl9VUklfT1BUSU9OLAotICAgICAgICAgICAgICAgIG5ldyBDb21tYW5kTGluZU9wdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5XU0RMX0xPQ0FUSU9OX1VSSV9PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRTdHJpbmdBcnJheSh3c2RsRmlsZU5hbWUpKSk7Ci0KLSAgICAgICAgLy9XU0RMIHZlcnNpb24KLSAgICAgICAgaWYgKHdzZGxWZXJzaW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIG9wdGlvbk1hcC5wdXQoCi0gICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5XU0RMX1ZFUlNJT05fT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICBuZXcgQ29tbWFuZExpbmVPcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLldTRExfVkVSU0lPTl9PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U3RyaW5nQXJyYXkod3NkbFZlcnNpb24pKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyByZXBvc2l0b3J5IHBhdGgKLSAgICAgICAgaWYgKHJlcG9zaXRvcnlQYXRoICE9IG51bGwpIHsKLSAgICAgICAgICAgIG9wdGlvbk1hcC5wdXQoCi0gICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5SRVBPU0lUT1JZX1BBVEhfT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICBuZXcgQ29tbWFuZExpbmVPcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLlJFUE9TSVRPUllfUEFUSF9PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U3RyaW5nQXJyYXkocmVwb3NpdG9yeVBhdGgpKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBleHRlcm5hbCBtYXBwaW5nCi0gICAgICAgIGlmIChleHRlcm5hbE1hcHBpbmcgIT0gbnVsbCkgewotICAgICAgICAgICAgb3B0aW9uTWFwLnB1dCgKLSAgICAgICAgICAgICAgICAgICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLkVYVEVSTkFMX01BUFBJTkdfT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICBuZXcgQ29tbWFuZExpbmVPcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLkVYVEVSTkFMX01BUFBJTkdfT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFN0cmluZ0FycmF5KGV4dGVybmFsTWFwcGluZykpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHRhcmdldCBzb3VyY2UgZm9sZGVyIGxvY2F0aW9uCi0gICAgICAgIGlmICh0YXJnZXRTb3VyY2VGb2xkZXJMb2NhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBvcHRpb25NYXAucHV0KAotICAgICAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuU09VUkNFX0ZPTERFUl9OQU1FX09QVElPTiwKLSAgICAgICAgICAgICAgICAgICAgbmV3IENvbW1hbmRMaW5lT3B0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5TT1VSQ0VfRk9MREVSX05BTUVfT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFN0cmluZ0FycmF5KHRhcmdldFNvdXJjZUZvbGRlckxvY2F0aW9uKSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gdGFyZ2V0IHNvdXJjZSBmb2xkZXIgbG9jYXRpb24KLSAgICAgICAgaWYgKHRhcmdldFJlc291cmNlc0ZvbGRlckxvY2F0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIG9wdGlvbk1hcC5wdXQoCi0gICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5SRVNPVVJDRV9GT0xERVJfT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICBuZXcgQ29tbWFuZExpbmVPcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLlJFU09VUkNFX0ZPTERFUl9PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U3RyaW5nQXJyYXkodGFyZ2V0UmVzb3VyY2VzRm9sZGVyTG9jYXRpb24pKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyB0YXJnZXQgc291cmNlIGZvbGRlciBsb2NhdGlvbgotICAgICAgICBpZiAodW53cmFwKSB7Ci0gICAgICAgICAgICBvcHRpb25NYXAucHV0KAotICAgICAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuVU5XUkFQX1BBUkFNRVRFUlMsCi0gICAgICAgICAgICAgICAgICAgIG5ldyBDb21tYW5kTGluZU9wdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuVU5XUkFQX1BBUkFNRVRFUlMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1swXSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy9vdXRwdXQgbG9jYXRpb24KLSAgICAgICAgb3B0aW9uTWFwLnB1dCgKLSAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuT1VUUFVUX0xPQ0FUSU9OX09QVElPTiwKLSAgICAgICAgICAgICAgICBuZXcgQ29tbWFuZExpbmVPcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuT1VUUFVUX0xPQ0FUSU9OX09QVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldFN0cmluZ0FycmF5KG91dHB1dCkpKTsKLSAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgICAgIC8vIERhdGFiaW5kaW5nIHR5cGUKLSAgICAgICAgb3B0aW9uTWFwLnB1dCgKLSAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuREFUQV9CSU5ESU5HX1RZUEVfT1BUSU9OLAotICAgICAgICAgICAgICAgIG5ldyBDb21tYW5kTGluZU9wdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5EQVRBX0JJTkRJTkdfVFlQRV9PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRTdHJpbmdBcnJheShkYXRhYmluZGluZ05hbWUpKSk7Ci0KLSAgICAgICAgLy8gQXN5bmMgb25seSBvcHRpb24gLSBmb3JjaW5nIHRvIGdlbmVyYXRlIGFzeW5jIG1ldGhvZHMgb25seQotICAgICAgICBpZiAoYXN5bmNPbmx5KSB7Ci0gICAgICAgICAgICBvcHRpb25NYXAucHV0KAotICAgICAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuQ09ERUdFTl9BU1lOQ19PTkxZX09QVElPTiwKLSAgICAgICAgICAgICAgICAgICAgbmV3IENvbW1hbmRMaW5lT3B0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5DT0RFR0VOX0FTWU5DX09OTFlfT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbMF0pKTsKLSAgICAgICAgfQotICAgICAgICAvLyBTeW5jIG9ubHkgb3B0aW9uIC0gZm9yY2luZyB0byBnZW5lcmF0ZSBTeW5jIG1ldGhvZHMgb25seQotICAgICAgICBpZiAoc3luY09ubHkpIHsKLSAgICAgICAgICAgIG9wdGlvbk1hcC5wdXQoCi0gICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5DT0RFR0VOX1NZTkNfT05MWV9PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgIG5ldyBDb21tYW5kTGluZU9wdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuQ09ERUdFTl9TWU5DX09OTFlfT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbMF0pKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vUGFja2FnZQotICAgICAgICBvcHRpb25NYXAucHV0KAotICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5QQUNLQUdFX09QVElPTiwKLSAgICAgICAgICAgICAgICBuZXcgQ29tbWFuZExpbmVPcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuUEFDS0FHRV9PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRTdHJpbmdBcnJheShwYWNrYWdlTmFtZSkpKTsKLQotICAgICAgICAvL3N0dWIgbGFuZ3VhZ2UKLSAgICAgICAgb3B0aW9uTWFwLnB1dCgKLSAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuU1RVQl9MQU5HVUFHRV9PUFRJT04sCi0gICAgICAgICAgICAgICAgbmV3IENvbW1hbmRMaW5lT3B0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLlNUVUJfTEFOR1VBR0VfT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U3RyaW5nQXJyYXkobGFuZ3VhZ2UpKSk7Ci0KLSAgICAgICAgLy9zZXJ2ZXIgc2lkZSBhbmQgZ2VuZXJhdGUgc2VydmljZXMueG1sIG9wdGlvbnMKLSAgICAgICAgaWYgKHNlcnZlclNpZGUpIHsKLSAgICAgICAgICAgIG9wdGlvbk1hcC5wdXQoCi0gICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5TRVJWRVJfU0lERV9DT0RFX09QVElPTiwKLSAgICAgICAgICAgICAgICAgICAgbmV3IENvbW1hbmRMaW5lT3B0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5TRVJWRVJfU0lERV9DT0RFX09QVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nWzBdKSk7Ci0KLSAgICAgICAgICAgIC8vc2VydmljZXMgWE1MIGdlbmVyYXRpb24gLSBlZmZlY3RpdmUgb25seSB3aGVuIHNwZWNpZmllZCBhcyB0aGUgc2VydmVyIHNpZGUKLSAgICAgICAgICAgIGlmIChnZW5lcmF0ZVNlcnZpY2VYbWwpIHsKLSAgICAgICAgICAgICAgICBvcHRpb25NYXAucHV0KAotICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5HRU5FUkFURV9TRVJWSUNFX0RFU0NSSVBUSU9OX09QVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDb21tYW5kTGluZU9wdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkdFTkVSQVRFX1NFUlZJQ0VfREVTQ1JJUFRJT05fT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nWzBdKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvL2dlbmVyYXRlIGFsbCBvcHRpb24gLSBPbmx5IHZhbGlkIHdoZW4gZ2VuZXJhdGluZyBzZXJ2ZXJzaWRlIGNvZGUKLSAgICAgICAgICAgIGlmIChnZW5lcmF0ZUFsbENsYXNzZXMpIHsKLSAgICAgICAgICAgICAgICBvcHRpb25NYXAucHV0KAotICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLkdFTkVSQVRFX0FMTF9PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ29tbWFuZExpbmVPcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5HRU5FUkFURV9BTExfT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nWzBdKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0gICAgICAgIC8vZ2VuZXJhdGUgdGhlIHRlc3QgY2FzZQotICAgICAgICBpZiAodGVzdGNhc2UpIHsKLSAgICAgICAgICAgIG9wdGlvbk1hcC5wdXQoCi0gICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5HRU5FUkFURV9URVNUX0NBU0VfT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICBuZXcgQ29tbWFuZExpbmVPcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLkdFTkVSQVRFX1RFU1RfQ0FTRV9PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1swXSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy9VbndyYXAgY2xhc3NlcyBvcHRpb24gLSB0aGlzIGRldGVybWluZXMgd2hldGhlciB0aGUgZ2VuZXJhdGVkIGNsYXNzZXMgYXJlIGluc2lkZSB0aGUgc3R1Yi9NUgotICAgICAgICAvL29yIGdldHMgZ2VuZXJhdGVzIGFzIHNlcGVyYXRlIGNsYXNzZXMKLSAgICAgICAgaWYgKHVucGFja0NsYXNzZXMpIHsKLSAgICAgICAgICAgIG9wdGlvbk1hcC5wdXQoCi0gICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5VTlBBQ0tfQ0xBU1NFU19PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgIG5ldyBDb21tYW5kTGluZU9wdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuVU5QQUNLX0NMQVNTRVNfT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbMF0pKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vc2VydmVyIHNpZGUgaW50ZXJmYWNlIG9wdGlvbgotICAgICAgICBpZiAoc2VydmVyU2lkZUludGVyZmFjZSkgewotICAgICAgICAgICAgb3B0aW9uTWFwLnB1dCgKLSAgICAgICAgICAgICAgICAgICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLlNFUlZFUl9TSURFX0lOVEVSRkFDRV9PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgIG5ldyBDb21tYW5kTGluZU9wdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuU0VSVkVSX1NJREVfSU5URVJGQUNFX09QVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nWzBdKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYWxsUG9ydHMpIHsKLSAgICAgICAgICAgIG9wdGlvbk1hcC5wdXQoCi0gICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5BbGxfUE9SVFNfT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICBuZXcgQ29tbWFuZExpbmVPcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLkFsbF9QT1JUU19PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1swXSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGJhY2t3YXJkQ29tcGF0aWJsZSkgewotICAgICAgICAgICAgb3B0aW9uTWFwLnB1dCgKLSAgICAgICAgICAgICAgICAgICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLkJBQ0tXT1JEX0NPTVBBVElCSUxJVFlfT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICBuZXcgQ29tbWFuZExpbmVPcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLkJBQ0tXT1JEX0NPTVBBVElCSUxJVFlfT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbMF0pKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChmbGF0dGVuRmlsZXMpIHsKLSAgICAgICAgICAgIG9wdGlvbk1hcC5wdXQoCi0gICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5GTEFUVEVOX0ZJTEVTX09QVElPTiwKLSAgICAgICAgICAgICAgICAgICAgbmV3IENvbW1hbmRMaW5lT3B0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5GTEFUVEVOX0ZJTEVTX09QVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nWzBdKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc2tpcE1lc3NhZ2VSZWNlaXZlcikgewotICAgICAgICAgICAgb3B0aW9uTWFwLnB1dCgKLSAgICAgICAgICAgICAgICAgICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLk5PX01FU1NBR0VfUkVDRUlWRVJfT1BUSU9OX0xPTkcsCi0gICAgICAgICAgICAgICAgICAgIG5ldyBDb21tYW5kTGluZU9wdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuTk9fTUVTU0FHRV9SRUNFSVZFUl9PUFRJT05fTE9ORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nWzBdKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc2tpcEJ1aWxkWE1MKSB7Ci0gICAgICAgICAgICBvcHRpb25NYXAucHV0KAotICAgICAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuTk9fQlVJTERfWE1MX09QVElPTl9MT05HLAotICAgICAgICAgICAgICAgICAgICBuZXcgQ29tbWFuZExpbmVPcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLk5PX0JVSUxEX1hNTF9PUFRJT05fTE9ORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nWzBdKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc2tpcFdTREwpIHsKLSAgICAgICAgICAgIG9wdGlvbk1hcC5wdXQoCi0gICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5OT19XU0RMU19PUFRJT05fTE9ORywKLSAgICAgICAgICAgICAgICAgICAgbmV3IENvbW1hbmRMaW5lT3B0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5OT19XU0RMU19PUFRJT05fTE9ORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nWzBdKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAob3ZlcldyaXRlKSB7Ci0gICAgICAgICAgICBvcHRpb25NYXAucHV0KAotICAgICAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuT1ZFUlJJREVfT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICBuZXcgQ29tbWFuZExpbmVPcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLk9WRVJSSURFX09QVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nWzBdKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc3VwcHJlc3NQcmVmaXhlcykgewotICAgICAgICAgICAgb3B0aW9uTWFwLnB1dCgKLSAgICAgICAgICAgICAgICAgICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLlNVUFBSRVNTX1BSRUZJWEVTX09QVElPTiwKLSAgICAgICAgICAgICAgICAgICAgbmV3IENvbW1hbmRMaW5lT3B0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5TVVBQUkVTU19QUkVGSVhFU19PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1swXSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBwcm9wcy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIE1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgIFN0cmluZyBrZXkgPSBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuRVhUUkFfT1BUSU9OVFlQRV9QUkVGSVggKyBlbnRyeS5nZXRLZXkoKTsKLSAgICAgICAgICAgIG9wdGlvbk1hcC5wdXQoCi0gICAgICAgICAgICAgICAgICAgIGtleSwKLSAgICAgICAgICAgICAgICAgICAgbmV3IENvbW1hbmRMaW5lT3B0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW117KFN0cmluZykgZW50cnkuZ2V0VmFsdWUoKX0pKTsKLSAgICAgICAgfQotCi0gICAgICAgIG9wdGlvbk1hcC5wdXQoCi0gICAgICAgICAgICAgICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLlNFUlZJQ0VfTkFNRV9PUFRJT04sCi0gICAgICAgICAgICAgICAgbmV3IENvbW1hbmRMaW5lT3B0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLlNFUlZJQ0VfTkFNRV9PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyBzZXJ2aWNlTmFtZSB9KSk7Ci0KLSAgICAgICAgb3B0aW9uTWFwLnB1dCgKLSAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuUE9SVF9OQU1FX09QVElPTiwKLSAgICAgICAgICAgICAgICBuZXcgQ29tbWFuZExpbmVPcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuUE9SVF9OQU1FX09QVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IHBvcnROYW1lIH0pKTsKLSAgICAgICAgLy8gc2V0IHRoZSBuYW1lc3BhY2VzCi0gICAgICAgIG9wdGlvbk1hcC5wdXQoCi0gICAgICAgICAgICAgICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLk5BTUVfU1BBQ0VfVE9fUEFDS0FHRV9PUFRJT04sCi0gICAgICAgICAgICAgICAgbmV3IENvbW1hbmRMaW5lT3B0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLk5BTUVfU1BBQ0VfVE9fUEFDS0FHRV9PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyBuYW1lc3BhY2VUb1BhY2thZ2VzIH0pKTsKLQotICAgICAgICByZXR1cm4gb3B0aW9uTWFwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFV0aWxpdHkgbWV0aG9kIHRvIGNvbnZlcnQgYSBzdHJpbmcgaW50byBhIHNpbmdsZSBpdGVtIHN0cmluZ1tdCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgU3RyaW5nW10uCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmdbXSBnZXRTdHJpbmdBcnJheShTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgU3RyaW5nW10gdmFsdWVzID0gbmV3IFN0cmluZ1sxXTsKLSAgICAgICAgdmFsdWVzWzBdID0gdmFsdWU7Ci0gICAgICAgIHJldHVybiB2YWx1ZXM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogVGhpcyBuZWVkcyB0aGUgQ2xhc3NMb2FkZXIgd2UgdXNlIHRvIGxvYWQgdGhlIHRhc2sKLSAgICAgICAgICAgICAqIGhhdmUgYWxsIHRoZSBkZXBlbmRhbmNpZXMgc2V0LCBob3BlIHRoYXQKLSAgICAgICAgICAgICAqIGlzIG9rIGZvciBub3cKLSAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICBBbnRDbGFzc0xvYWRlciBjbCA9IG5ldyBBbnRDbGFzc0xvYWRlcigKLSAgICAgICAgICAgICAgICAgICAgZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpLAotICAgICAgICAgICAgICAgICAgICBnZXRQcm9qZWN0KCksCi0gICAgICAgICAgICAgICAgICAgIGNsYXNzcGF0aCA9PSBudWxsID8gY3JlYXRlQ2xhc3NwYXRoKCkgOiBjbGFzc3BhdGgsCi0gICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKLQotICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIoY2wpOwotCi0gICAgICAgICAgICBNYXAgY29tbWFuZExpbmVPcHRpb25zID0gdGhpcy5maWxsT3B0aW9uTWFwKCk7Ci0gICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvblBhcnNlciBwYXJzZXIgPQotICAgICAgICAgICAgICAgICAgICBuZXcgQ29tbWFuZExpbmVPcHRpb25QYXJzZXIoY29tbWFuZExpbmVPcHRpb25zKTsKLSAgICAgICAgICAgIG5ldyBDb2RlR2VuZXJhdGlvbkVuZ2luZShwYXJzZXIpLmdlbmVyYXRlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBvcnROYW1lKFN0cmluZyBwb3J0TmFtZSkgewotICAgICAgICB0aGlzLnBvcnROYW1lID0gcG9ydE5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2VydmljZU5hbWUoU3RyaW5nIHNlcnZpY2VOYW1lKSB7Ci0gICAgICAgIHRoaXMuc2VydmljZU5hbWUgPSBzZXJ2aWNlTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZUFsbENsYXNzZXMoYm9vbGVhbiBnZW5lcmF0ZUFsbENsYXNzZXMpIHsKLSAgICAgICAgdGhpcy5nZW5lcmF0ZUFsbENsYXNzZXMgPSBnZW5lcmF0ZUFsbENsYXNzZXM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VW5wYWNrQ2xhc3Nlcyhib29sZWFuIHVucGFja0NsYXNzZXMpIHsKLSAgICAgICAgdGhpcy51bnBhY2tDbGFzc2VzID0gdW5wYWNrQ2xhc3NlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRXc2RsRmlsZU5hbWUoU3RyaW5nIHdzZGxGaWxlTmFtZSkgewotICAgICAgICB0aGlzLndzZGxGaWxlTmFtZSA9IHdzZGxGaWxlTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRPdXRwdXQoU3RyaW5nIG91dHB1dCkgewotICAgICAgICB0aGlzLm91dHB1dCA9IG91dHB1dDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYWNrYWdlTmFtZShTdHJpbmcgcGFja2FnZU5hbWUpIHsKLSAgICAgICAgdGhpcy5wYWNrYWdlTmFtZSA9IHBhY2thZ2VOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldExhbmd1YWdlKFN0cmluZyBsYW5ndWFnZSkgewotICAgICAgICB0aGlzLmxhbmd1YWdlID0gbGFuZ3VhZ2U7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QXN5bmNPbmx5KGJvb2xlYW4gYXN5bmNPbmx5KSB7Ci0gICAgICAgIHRoaXMuYXN5bmNPbmx5ID0gYXN5bmNPbmx5OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFN5bmNPbmx5KGJvb2xlYW4gc3luY09ubHkpIHsKLSAgICAgICAgdGhpcy5zeW5jT25seSA9IHN5bmNPbmx5OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFNlcnZlclNpZGUoYm9vbGVhbiBzZXJ2ZXJTaWRlKSB7Ci0gICAgICAgIHRoaXMuc2VydmVyU2lkZSA9IHNlcnZlclNpZGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VGVzdGNhc2UoYm9vbGVhbiB0ZXN0Y2FzZSkgewotICAgICAgICB0aGlzLnRlc3RjYXNlID0gdGVzdGNhc2U7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0R2VuZXJhdGVTZXJ2aWNlWG1sKGJvb2xlYW4gZ2VuZXJhdGVTZXJ2aWNlWG1sKSB7Ci0gICAgICAgIHRoaXMuZ2VuZXJhdGVTZXJ2aWNlWG1sID0gZ2VuZXJhdGVTZXJ2aWNlWG1sOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFJlcG9zaXRvcnlQYXRoKFN0cmluZyByZXBvc2l0b3J5UGF0aCkgewotICAgICAgICB0aGlzLnJlcG9zaXRvcnlQYXRoID0gcmVwb3NpdG9yeVBhdGg7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RXh0ZXJuYWxNYXBwaW5nKFN0cmluZyBleHRlcm5hbE1hcHBpbmcpIHsKLSAgICAgICAgdGhpcy5leHRlcm5hbE1hcHBpbmcgPSBleHRlcm5hbE1hcHBpbmc7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0V3NkbFZlcnNpb24oU3RyaW5nIHdzZGxWZXJzaW9uKSB7Ci0gICAgICAgIHRoaXMud3NkbFZlcnNpb24gPSB3c2RsVmVyc2lvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRUYXJnZXRTb3VyY2VGb2xkZXJMb2NhdGlvbihTdHJpbmcgdGFyZ2V0U291cmNlRm9sZGVyTG9jYXRpb24pIHsKLSAgICAgICAgdGhpcy50YXJnZXRTb3VyY2VGb2xkZXJMb2NhdGlvbiA9IHRhcmdldFNvdXJjZUZvbGRlckxvY2F0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFRhcmdldFJlc291cmNlc0ZvbGRlckxvY2F0aW9uKFN0cmluZyB0YXJnZXRSZXNvdXJjZXNGb2xkZXJMb2NhdGlvbikgewotICAgICAgICB0aGlzLnRhcmdldFJlc291cmNlc0ZvbGRlckxvY2F0aW9uID0gdGFyZ2V0UmVzb3VyY2VzRm9sZGVyTG9jYXRpb247Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VW53cmFwKGJvb2xlYW4gdW53cmFwKSB7Ci0gICAgICAgIHRoaXMudW53cmFwID0gdW53cmFwOwotICAgIH0KLQotICAgIC8qKiBAcmV0dXJuIFJldHVybnMgUGF0aC4gKi8KLSAgICBwdWJsaWMgUGF0aCBnZXRDbGFzc3BhdGgoKSB7Ci0gICAgICAgIHJldHVybiBjbGFzc3BhdGg7Ci0gICAgfQotCi0gICAgLyoqIEBwYXJhbSBwYXRoICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENsYXNzcGF0aChQYXRoIHBhdGgpIHsKLSAgICAgICAgY2xhc3NwYXRoID0gcGF0aDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldERhdGFiaW5kaW5nTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGRhdGFiaW5kaW5nTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREYXRhYmluZGluZ05hbWUoU3RyaW5nIGRhdGFiaW5kaW5nTmFtZSkgewotICAgICAgICB0aGlzLmRhdGFiaW5kaW5nTmFtZSA9IGRhdGFiaW5kaW5nTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVRvUGFja2FnZXMoKSB7Ci0gICAgICAgIHJldHVybiBuYW1lc3BhY2VUb1BhY2thZ2VzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE5hbWVzcGFjZVRvUGFja2FnZXMoU3RyaW5nIG5hbWVzcGFjZVRvUGFja2FnZXMpIHsKLSAgICAgICAgdGhpcy5uYW1lc3BhY2VUb1BhY2thZ2VzID0gbmFtZXNwYWNlVG9QYWNrYWdlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRDb25maWd1cmVkUGFyYW1ldGVyKFBhcmFtZXRlciBwcm9wKSB7Ci0gICAgICAgIHByb3BzLnNldFByb3BlcnR5KHByb3AuZ2V0TmFtZSgpLCBwcm9wLmdldFZhbHVlKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFN1cHByZXNzUHJlZml4ZXMoYm9vbGVhbiBzdXBwcmVzc1ByZWZpeGVzKSB7Ci0gICAgICAgIHRoaXMuc3VwcHJlc3NQcmVmaXhlcyA9IHN1cHByZXNzUHJlZml4ZXM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0T3ZlcldyaXRlKGJvb2xlYW4gb3ZlcldyaXRlKSB7Ci0gICAgICAgIHRoaXMub3ZlcldyaXRlID0gb3ZlcldyaXRlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFNraXBXU0RMKGJvb2xlYW4gc2tpcFdTREwpIHsKLSAgICAgICAgdGhpcy5za2lwV1NETCA9IHNraXBXU0RMOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFNraXBCdWlsZFhNTChib29sZWFuIHNraXBCdWlsZFhNTCkgewotICAgICAgICB0aGlzLnNraXBCdWlsZFhNTCA9IHNraXBCdWlsZFhNTDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTa2lwTWVzc2FnZVJlY2VpdmVyKGJvb2xlYW4gc2tpcE1lc3NhZ2VSZWNlaXZlcikgewotICAgICAgICB0aGlzLnNraXBNZXNzYWdlUmVjZWl2ZXIgPSBza2lwTWVzc2FnZVJlY2VpdmVyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEZsYXR0ZW5GaWxlcyhib29sZWFuIGZsYXR0ZW5GaWxlcykgewotICAgICAgICB0aGlzLmZsYXR0ZW5GaWxlcyA9IGZsYXR0ZW5GaWxlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRCYWNrd2FyZENvbXBhdGlibGUoYm9vbGVhbiBiYWNrd2FyZENvbXBhdGlibGUpIHsKLSAgICAgICAgdGhpcy5iYWNrd2FyZENvbXBhdGlibGUgPSBiYWNrd2FyZENvbXBhdGlibGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QWxsUG9ydHMoYm9vbGVhbiBhbGxQb3J0cykgewotICAgICAgICB0aGlzLmFsbFBvcnRzID0gYWxsUG9ydHM7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1hbnQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL2FudC9KYXZhMldTRExUYXNrLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWFudC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvYW50L0phdmEyV1NETFRhc2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg0MDE3Yi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWFudC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvYW50L0phdmEyV1NETFRhc2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzMCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnRvb2wuYW50Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLmphdmEyd3NkbC5KYXZhMldTRExDb25zdGFudHM7DQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkFudENsYXNzTG9hZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsNCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aDsNCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVmZXJlbmNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLndzLmphdmEyd3NkbC5KYXZhMldTRExDb2RlZ2VuRW5naW5lOw0KLWltcG9ydCBvcmcuYXBhY2hlLndzLmphdmEyd3NkbC5NYXBwaW5nU2V0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLndzLmphdmEyd3NkbC5OYW1lc3BhY2VNYXBwaW5nOw0KLWltcG9ydCBvcmcuYXBhY2hlLndzLmphdmEyd3NkbC51dGlscy5KYXZhMldTRExDb21tYW5kTGluZU9wdGlvbjsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi1wdWJsaWMgY2xhc3MgSmF2YTJXU0RMVGFzayBleHRlbmRzIFRhc2sgaW1wbGVtZW50cyBKYXZhMldTRExDb25zdGFudHMgew0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUEVOX0JSQUNLRVQgPSAiWyI7DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMT1NFX0JSQUNLRVQgPSAiXSI7DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1BID0gIiwiOw0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyBjbGFzc05hbWUgPSBudWxsOw0KLSAgICBwcml2YXRlIFN0cmluZyBvdXRwdXRMb2NhdGlvbiA9IG51bGw7DQotICAgIHByaXZhdGUgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9IG51bGw7DQotICAgIHByaXZhdGUgU3RyaW5nIHRhcmdldE5hbWVzcGFjZVByZWZpeCA9IG51bGw7DQotICAgIHByaXZhdGUgU3RyaW5nIHNjaGVtYVRhcmdldE5hbWVzcGFjZSA9IG51bGw7DQotICAgIHByaXZhdGUgU3RyaW5nIHNjaGVtYVRhcmdldE5hbWVzcGFjZVByZWZpeCA9IG51bGw7DQotICAgIHByaXZhdGUgU3RyaW5nIHNlcnZpY2VOYW1lID0gbnVsbDsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgb3V0cHV0RmlsZU5hbWUgPSBudWxsOw0KLSAgICBwcml2YXRlIFBhdGggY2xhc3NwYXRoID0gbnVsbDsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgc3R5bGUgPSBKYXZhMldTRExDb25zdGFudHMuRE9DVU1FTlQ7DQotICAgIHByaXZhdGUgU3RyaW5nIHVzZSA9IEphdmEyV1NETENvbnN0YW50cy5MSVRFUkFMOw0KLSAgICBwcml2YXRlIFN0cmluZyBsb2NhdGlvblVyaTsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgYXR0ckZvcm1EZWZhdWx0ID0gbnVsbDsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgZWxlbWVudEZvcm1EZWZhdWx0ID0gbnVsbDsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgd3NkbFZlcnNpb24gPSBudWxsOw0KLSAgICBwcml2YXRlIFN0cmluZyBkb2NMaXRCYXJlID0gbnVsbDsNCi0NCi0gICAgLy9uYW1lcyBvZiBqYXZhIHR5cGVzIG5vdCB1c2VkIGluIHRoZSBzZXJ2aWNlIGRlZm4uIGRpcmVjdGx5LCBidXQgZm9yIHdoaWNoIHNjaGVtYSBtdXN0IGJlIGdlbmVyYXRlZA0KLSAgICBwcml2YXRlIFN0cmluZ1tdIGV4dHJhQ2xhc3NlczsNCi0NCi0gICAgLy9uYW1lc3BhY2UgZ2VuZXJhdG9yIGNsYXNzbmFtZQ0KLSAgICBwcml2YXRlIFN0cmluZyBuc0dlbkNsYXNzTmFtZSA9IG51bGw7DQotDQotICAgIC8vcGFja2FnZSB0byBuYW1lc3BhY2UgbWFwDQotICAgIHByaXZhdGUgSGFzaE1hcCBuYW1lc3BhY2VNYXAgPSBuZXcgSGFzaE1hcCgpOw0KLQ0KLSAgICAvL25hbWVzIG9mIGphdmEgdHlwZXMgbm90IHVzZWQgaW4gdGhlIHNlcnZpY2UgZGVmbi4gZGlyZWN0bHksIGJ1dCBmb3Igd2hpY2ggc2NoZW1hIG11c3QgYmUgZ2VuZXJhdGVkDQotICAgIHByaXZhdGUgQXJyYXlMaXN0IHBrZzJuc01hcHBpbmdzID0gbmV3IEFycmF5TGlzdCgpOw0KLQ0KLSAgICBwcml2YXRlIE1hcHBpbmdTZXQgbWFwcGluZ3MgPSBuZXcgTWFwcGluZ1NldCgpOw0KLSAgICANCi0gICAgcHJpdmF0ZSBTdHJpbmcgc2NoZW1hR2VuQ2xhc3NOYW1lID0gbnVsbDsNCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRMb2NhdGlvblVyaSgpIHsNCi0gICAgICAgIHJldHVybiBsb2NhdGlvblVyaTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRMb2NhdGlvblVyaShTdHJpbmcgbG9jYXRpb25VcmkpIHsNCi0gICAgICAgIHRoaXMubG9jYXRpb25VcmkgPSBsb2NhdGlvblVyaTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN0eWxlKCkgew0KLSAgICAgICAgcmV0dXJuIHN0eWxlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFN0eWxlKFN0cmluZyBzdHlsZSkgew0KLSAgICAgICAgdGhpcy5zdHlsZSA9IHN0eWxlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXNlKCkgew0KLSAgICAgICAgcmV0dXJuIHVzZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRVc2UoU3RyaW5nIHVzZSkgew0KLSAgICAgICAgdGhpcy51c2UgPSB1c2U7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqDQotICAgICAqLw0KLSAgICBwdWJsaWMgSmF2YTJXU0RMVGFzaygpIHsNCi0gICAgICAgIHN1cGVyKCk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIEZpbGxzIHRoZSBvcHRpb24gbWFwLiBUaGlzIG1hcCBpcyBwYXNzZWQgb250bw0KLSAgICAgKiB0aGUgY29kZSBnZW5lcmF0aW9uIEFQSSB0byBnZW5lcmF0ZSB0aGUgY29kZS4NCi0gICAgICovDQotICAgIHByaXZhdGUgTWFwIGZpbGxPcHRpb25NYXAoKSB7DQotICAgICAgICBNYXAgb3B0aW9uTWFwID0gbmV3IEhhc2hNYXAoKTsNCi0NCi0gICAgICAgIC8vIENoZWNrIHRoYXQgY3JpdGljYWwgb3B0aW9ucyBleGlzdA0KLSAgICAgICAgaWYgKGNsYXNzTmFtZSA9PSBudWxsKSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKA0KLSAgICAgICAgICAgICAgICAgICAgIllvdSBtdXN0IHNwZWNpZnkgYSBjbGFzc25hbWUiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0NCi0gICAgICAgIC8vIENsYXNzbmFtZQ0KLSAgICAgICAgYWRkVG9PcHRpb25NYXAob3B0aW9uTWFwLA0KLSAgICAgICAgICAgICAgICBKYXZhMldTRExDb25zdGFudHMuQ0xBU1NOQU1FX09QVElPTiwNCi0gICAgICAgICAgICAgICAgY2xhc3NOYW1lKTsNCi0NCi0gICAgICAgIC8vIE91dHB1dCBsb2NhdGlvbg0KLSAgICAgICAgYWRkVG9PcHRpb25NYXAob3B0aW9uTWFwLA0KLSAgICAgICAgICAgICAgICBKYXZhMldTRExDb25zdGFudHMuT1VUUFVUX0xPQ0FUSU9OX09QVElPTiwNCi0gICAgICAgICAgICAgICAgb3V0cHV0TG9jYXRpb24pOw0KLQ0KLSAgICAgICAgLy8gVGFyZ2V0IG5hbWVzcGFjZQ0KLSAgICAgICAgYWRkVG9PcHRpb25NYXAob3B0aW9uTWFwLA0KLSAgICAgICAgICAgICAgICBKYXZhMldTRExDb25zdGFudHMuVEFSR0VUX05BTUVTUEFDRV9PUFRJT04sDQotICAgICAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZSk7DQotDQotICAgICAgICAvLyBUYXJnZXQgbmFtZXNwYWNlIHByZWZpeA0KLSAgICAgICAgYWRkVG9PcHRpb25NYXAob3B0aW9uTWFwLA0KLSAgICAgICAgICAgICAgICBKYXZhMldTRExDb25zdGFudHMuVEFSR0VUX05BTUVTUEFDRV9QUkVGSVhfT1BUSU9OLA0KLSAgICAgICAgICAgICAgICB0YXJnZXROYW1lc3BhY2VQcmVmaXgpOw0KLQ0KLSAgICAgICAgLy8gU2NoZW1hIHRhcmdldCBuYW1lc3BhY2UNCi0gICAgICAgIGFkZFRvT3B0aW9uTWFwKG9wdGlvbk1hcCwNCi0gICAgICAgICAgICAgICAgSmF2YTJXU0RMQ29uc3RhbnRzLlNDSEVNQV9UQVJHRVRfTkFNRVNQQUNFX09QVElPTiwNCi0gICAgICAgICAgICAgICAgc2NoZW1hVGFyZ2V0TmFtZXNwYWNlKTsNCi0NCi0gICAgICAgIC8vIFNjaGVtYSB0YXJnZXQgbmFtZXNwYWNlIHByZWZpeA0KLSAgICAgICAgYWRkVG9PcHRpb25NYXAob3B0aW9uTWFwLA0KLSAgICAgICAgICAgICAgICBKYXZhMldTRExDb25zdGFudHMuU0NIRU1BX1RBUkdFVF9OQU1FU1BBQ0VfUFJFRklYX09QVElPTiwNCi0gICAgICAgICAgICAgICAgc2NoZW1hVGFyZ2V0TmFtZXNwYWNlUHJlZml4KTsNCi0NCi0gICAgICAgIC8vIFNlcnZpY2UgbmFtZQ0KLSAgICAgICAgYWRkVG9PcHRpb25NYXAob3B0aW9uTWFwLA0KLSAgICAgICAgICAgICAgICBKYXZhMldTRExDb25zdGFudHMuU0VSVklDRV9OQU1FX09QVElPTiwNCi0gICAgICAgICAgICAgICAgc2VydmljZU5hbWUpOw0KLQ0KLSAgICAgICAgLy8gT3V0cHV0IGZpbGUgbmFtZQ0KLSAgICAgICAgYWRkVG9PcHRpb25NYXAob3B0aW9uTWFwLA0KLSAgICAgICAgICAgICAgICBKYXZhMldTRExDb25zdGFudHMuT1VUUFVUX0ZJTEVOQU1FX09QVElPTiwNCi0gICAgICAgICAgICAgICAgb3V0cHV0RmlsZU5hbWUpOw0KLQ0KLSAgICAgICAgYWRkVG9PcHRpb25NYXAob3B0aW9uTWFwLA0KLSAgICAgICAgICAgICAgICBKYXZhMldTRExDb25zdGFudHMuU1RZTEVfT1BUSU9OLA0KLSAgICAgICAgICAgICAgICBnZXRTdHlsZSgpKTsNCi0NCi0gICAgICAgIGFkZFRvT3B0aW9uTWFwKG9wdGlvbk1hcCwNCi0gICAgICAgICAgICAgICAgSmF2YTJXU0RMQ29uc3RhbnRzLlVTRV9PUFRJT04sDQotICAgICAgICAgICAgICAgIGdldFVzZSgpKTsNCi0NCi0gICAgICAgIGFkZFRvT3B0aW9uTWFwKG9wdGlvbk1hcCwNCi0gICAgICAgICAgICAgICAgSmF2YTJXU0RMQ29uc3RhbnRzLkxPQ0FUSU9OX09QVElPTiwNCi0gICAgICAgICAgICAgICAgZ2V0TG9jYXRpb25VcmkoKSk7DQotDQotICAgICAgICBhZGRUb09wdGlvbk1hcChvcHRpb25NYXAsDQotICAgICAgICAgICAgICAgIEphdmEyV1NETENvbnN0YW50cy5BVFRSX0ZPUk1fREVGQVVMVF9PUFRJT04sDQotICAgICAgICAgICAgICAgIGdldEF0dHJGb3JtRGVmYXVsdCgpKTsNCi0NCi0gICAgICAgIGFkZFRvT3B0aW9uTWFwKG9wdGlvbk1hcCwNCi0gICAgICAgICAgICAgICAgSmF2YTJXU0RMQ29uc3RhbnRzLkVMRU1FTlRfRk9STV9ERUZBVUxUX09QVElPTiwNCi0gICAgICAgICAgICAgICAgZ2V0RWxlbWVudEZvcm1EZWZhdWx0KCkpOw0KLQ0KLSAgICAgICAgYWRkVG9PcHRpb25NYXAob3B0aW9uTWFwLA0KLSAgICAgICAgICAgICAgICBKYXZhMldTRExDb25zdGFudHMuRVhUUkFfQ0xBU1NFU19ERUZBVUxUX09QVElPTiwNCi0gICAgICAgICAgICAgICAgZ2V0RXh0cmFDbGFzc2VzKCkpOw0KLQ0KLSAgICAgICAgYWRkVG9PcHRpb25NYXAob3B0aW9uTWFwLA0KLSAgICAgICAgICAgICAgICBKYXZhMldTRExDb25zdGFudHMuTkFNRVNQQUNFX0dFTkVSQVRPUl9PUFRJT04sDQotICAgICAgICAgICAgICAgIGdldE5zR2VuQ2xhc3NOYW1lKCkpOw0KLQ0KLSAgICAgICAgYWRkVG9PcHRpb25NYXAob3B0aW9uTWFwLA0KLSAgICAgICAgICAgICAgICBKYXZhMldTRExDb25zdGFudHMuU0NIRU1BX0dFTkVSQVRPUl9PUFRJT04sDQotICAgICAgICAgICAgICAgIGdldFNjaGVtYUdlbkNsYXNzTmFtZSgpKTsNCi0NCi0gICAgICAgIGFkZFRvT3B0aW9uTWFwKG9wdGlvbk1hcCwNCi0gICAgICAgICAgICAgICAgSmF2YTJXU0RMQ29uc3RhbnRzLldTRExfVkVSU0lPTl9PUFRJT04sDQotICAgICAgICAgICAgICAgIGdldFdTRExWZXJzaW9uKCkpOw0KLQ0KLSAgICAgICAgYWRkVG9PcHRpb25NYXAob3B0aW9uTWFwLA0KLSAgICAgICAgICAgICAgICBKYXZhMldTRExDb25zdGFudHMuRE9DX0xJVF9CQVJFLA0KLSAgICAgICAgICAgICAgICBnZXREb2NMaXRCYXJlKCkpOw0KLQ0KLSAgICAgICAgbG9hZFBrZzJOc01hcCgpOw0KLSAgICAgICAgYWRkVG9PcHRpb25NYXAob3B0aW9uTWFwLA0KLSAgICAgICAgICAgICAgICBKYXZhMldTRExDb25zdGFudHMuSkFWQV9QS0dfMl9OU01BUF9PUFRJT04sDQotICAgICAgICAgICAgICAgIGdldFBrZzJuc01hcHBpbmdzKCkpOw0KLQ0KLSAgICAgICAgcmV0dXJuIG9wdGlvbk1hcDsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogVXRpbGl0eSBtZXRob2QgdG8gY29udmVydCBhIHN0cmluZyBpbnRvIGEgc2luZ2xlIGl0ZW0gc3RyaW5nW10NCi0gICAgICoNCi0gICAgICogQHBhcmFtIHZhbHVlDQotICAgICAqIEByZXR1cm4gUmV0dXJucyBTdHJpbmdbXS4NCi0gICAgICovDQotICAgIHByaXZhdGUgU3RyaW5nW10gZ2V0U3RyaW5nQXJyYXkoU3RyaW5nIHZhbHVlKSB7DQotICAgICAgICBTdHJpbmdbXSB2YWx1ZXMgPSBuZXcgU3RyaW5nWzFdOw0KLSAgICAgICAgdmFsdWVzWzBdID0gdmFsdWU7DQotICAgICAgICByZXR1cm4gdmFsdWVzOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBGdW5jdGlvbiB0byBwdXQgYXJndW1lbnRzIGluIHRoZSBvcHRpb24gbWFwLg0KLSAgICAgKiBUaGlzIGZ1bmN0aW9ucyBza2lwcyBhZGRpbmcgb2Ygb3B0aW9ucyB0aGF0IGhhdmUgYSBudWxsIHZhbHVlLg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gbWFwICAgIFRoZSBvcHRpb24gbWFwIGludG8gd2hpY2ggdGhlIG9wdGlvbiBpcyB0byBiZSBhZGRlZA0KLSAgICAgKiBAcGFyYW0gb3B0aW9uIFRoZSBvcHRpb24gbmFtZQ0KLSAgICAgKiBAcGFyYW0gdmFsdWUgIFRoZSB2YWx1ZSBvZiB0aGUgb3B0aW9uDQotICAgICAqLw0KLSAgICBwcml2YXRlIHZvaWQgYWRkVG9PcHRpb25NYXAoTWFwIG1hcCwgU3RyaW5nIG9wdGlvbiwgU3RyaW5nIHZhbHVlKSB7DQotICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIG1hcC5wdXQob3B0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgbmV3IEphdmEyV1NETENvbW1hbmRMaW5lT3B0aW9uKG9wdGlvbiwgZ2V0U3RyaW5nQXJyYXkodmFsdWUpKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGFkZFRvT3B0aW9uTWFwKE1hcCBtYXAsIFN0cmluZyBvcHRpb24sIFN0cmluZ1tdIHZhbHVlcykgew0KLSAgICAgICAgaWYgKHZhbHVlcyAhPSBudWxsICYmIHZhbHVlcy5sZW5ndGggPiAwKSB7DQotICAgICAgICAgICAgbWFwLnB1dChvcHRpb24sDQotICAgICAgICAgICAgICAgICAgICBuZXcgSmF2YTJXU0RMQ29tbWFuZExpbmVPcHRpb24ob3B0aW9uLCB2YWx1ZXMpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgYWRkVG9PcHRpb25NYXAoTWFwIG1hcCwgU3RyaW5nIG9wdGlvbiwgQXJyYXlMaXN0IHZhbHVlcykgew0KLSAgICAgICAgaWYgKHZhbHVlcyAhPSBudWxsICYmICF2YWx1ZXMuaXNFbXB0eSgpKSB7DQotICAgICAgICAgICAgbWFwLnB1dChvcHRpb24sDQotICAgICAgICAgICAgICAgICAgICBuZXcgSmF2YTJXU0RMQ29tbWFuZExpbmVPcHRpb24ob3B0aW9uLCB2YWx1ZXMpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsNCi0gICAgICAgIHRyeSB7DQotDQotICAgICAgICAgICAgTWFwIGNvbW1hbmRMaW5lT3B0aW9ucyA9IHRoaXMuZmlsbE9wdGlvbk1hcCgpOw0KLSAgICAgICAgICAgIENsYXNzTG9hZGVyIGNvbmV4dENsYXNzTG9hZGVyID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsNCi0gICAgICAgICAgICBBbnRDbGFzc0xvYWRlciBjbCA9IG5ldyBBbnRDbGFzc0xvYWRlcihnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCksDQotICAgICAgICAgICAgICAgICAgICBnZXRQcm9qZWN0KCksDQotICAgICAgICAgICAgICAgICAgICBjbGFzc3BhdGggPT0gbnVsbCA/IGNyZWF0ZUNsYXNzcGF0aCgpIDogY2xhc3NwYXRoLA0KLSAgICAgICAgICAgICAgICAgICAgZmFsc2UpOw0KLQ0KLSAgICAgICAgICAgIGNvbW1hbmRMaW5lT3B0aW9ucy5wdXQoSmF2YTJXU0RMQ29uc3RhbnRzLkNMQVNTUEFUSF9PUFRJT04sIG5ldyBKYXZhMldTRExDb21tYW5kTGluZU9wdGlvbihKYXZhMldTRExDb25zdGFudHMuQ0xBU1NQQVRIX09QVElPTiwgY2xhc3NwYXRoLmxpc3QoKSkpOw0KLQ0KLSAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyKGNsKTsNCi0NCi0gICAgICAgICAgICBpZiAob3V0cHV0TG9jYXRpb24gIT0gbnVsbCkgY2wuYWRkUGF0aEVsZW1lbnQob3V0cHV0TG9jYXRpb24pOw0KLQ0KLSAgICAgICAgICAgIG5ldyBKYXZhMldTRExDb2RlZ2VuRW5naW5lKGNvbW1hbmRMaW5lT3B0aW9ucykuZ2VuZXJhdGUoKTsNCi0gICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcihjb25leHRDbGFzc0xvYWRlcik7DQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihlKTsNCi0gICAgICAgIH0NCi0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc05hbWUoU3RyaW5nIGNsYXNzTmFtZSkgew0KLSAgICAgICAgdGhpcy5jbGFzc05hbWUgPSBjbGFzc05hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0T3V0cHV0TG9jYXRpb24oU3RyaW5nIG91dHB1dExvY2F0aW9uKSB7DQotICAgICAgICB0aGlzLm91dHB1dExvY2F0aW9uID0gb3V0cHV0TG9jYXRpb247DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0VGFyZ2V0TmFtZXNwYWNlKFN0cmluZyB0YXJnZXROYW1lc3BhY2UpIHsNCi0gICAgICAgIHRoaXMudGFyZ2V0TmFtZXNwYWNlID0gdGFyZ2V0TmFtZXNwYWNlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFRhcmdldE5hbWVzcGFjZVByZWZpeChTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlUHJlZml4KSB7DQotICAgICAgICB0aGlzLnRhcmdldE5hbWVzcGFjZVByZWZpeCA9IHRhcmdldE5hbWVzcGFjZVByZWZpeDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRTY2hlbWFUYXJnZXROYW1lc3BhY2UoU3RyaW5nIHNjaGVtYVRhcmdldE5hbWVzcGFjZSkgew0KLSAgICAgICAgdGhpcy5zY2hlbWFUYXJnZXROYW1lc3BhY2UgPSBzY2hlbWFUYXJnZXROYW1lc3BhY2U7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0U2NoZW1hVGFyZ2V0TmFtZXNwYWNlUHJlZml4KFN0cmluZyBzY2hlbWFUYXJnZXROYW1lc3BhY2VQcmVmaXgpIHsNCi0gICAgICAgIHRoaXMuc2NoZW1hVGFyZ2V0TmFtZXNwYWNlUHJlZml4ID0gc2NoZW1hVGFyZ2V0TmFtZXNwYWNlUHJlZml4Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VOYW1lKFN0cmluZyBzZXJ2aWNlTmFtZSkgew0KLSAgICAgICAgdGhpcy5zZXJ2aWNlTmFtZSA9IHNlcnZpY2VOYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE91dHB1dEZpbGVOYW1lKFN0cmluZyBvdXRwdXRGaWxlTmFtZSkgew0KLSAgICAgICAgdGhpcy5vdXRwdXRGaWxlTmFtZSA9IG91dHB1dEZpbGVOYW1lOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBTZXQgdGhlIG9wdGlvbmFsIGNsYXNzcGF0aA0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gY2xhc3NwYXRoIHRoZSBjbGFzc3BhdGggdG8gdXNlIHdoZW4gbG9hZGluZyBjbGFzcw0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgc2V0Q2xhc3NwYXRoKFBhdGggY2xhc3NwYXRoKSB7DQotICAgICAgICBjcmVhdGVDbGFzc3BhdGgoKS5hcHBlbmQoY2xhc3NwYXRoKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogU2V0IHRoZSBvcHRpb25hbCBjbGFzc3BhdGgNCi0gICAgICoNCi0gICAgICogQHJldHVybiBhIHBhdGggaW5zdGFuY2UgdG8gYmUgY29uZmlndXJlZCBieSB0aGUgQW50IGNvcmUuDQotICAgICAqLw0KLSAgICBwdWJsaWMgUGF0aCBjcmVhdGVDbGFzc3BhdGgoKSB7DQotICAgICAgICBpZiAoY2xhc3NwYXRoID09IG51bGwpIHsNCi0gICAgICAgICAgICBjbGFzc3BhdGggPSBuZXcgUGF0aChnZXRQcm9qZWN0KCkpOw0KLSAgICAgICAgICAgIGNsYXNzcGF0aCA9IGNsYXNzcGF0aC5jb25jYXRTeXN0ZW1DbGFzc3BhdGgoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBjbGFzc3BhdGguY3JlYXRlUGF0aCgpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBTZXQgdGhlIHJlZmVyZW5jZSB0byBhbiBvcHRpb25hbCBjbGFzc3BhdGgNCi0gICAgICoNCi0gICAgICogQHBhcmFtIHIgdGhlIGlkIG9mIHRoZSBBbnQgcGF0aCBpbnN0YW5jZSB0byBhY3QgYXMgdGhlIGNsYXNzcGF0aA0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgc2V0Q2xhc3NwYXRoUmVmKFJlZmVyZW5jZSByKSB7DQotICAgICAgICBjcmVhdGVDbGFzc3BhdGgoKS5zZXRSZWZpZChyKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJGb3JtRGVmYXVsdCgpIHsNCi0gICAgICAgIHJldHVybiBhdHRyRm9ybURlZmF1bHQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0QXR0ckZvcm1EZWZhdWx0KFN0cmluZyBhdHRyRm9ybURlZmF1bHQpIHsNCi0gICAgICAgIHRoaXMuYXR0ckZvcm1EZWZhdWx0ID0gYXR0ckZvcm1EZWZhdWx0Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudEZvcm1EZWZhdWx0KCkgew0KLSAgICAgICAgcmV0dXJuIGVsZW1lbnRGb3JtRGVmYXVsdDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRFbGVtZW50Rm9ybURlZmF1bHQoU3RyaW5nIGVsZW1lbnRGb3JtRGVmYXVsdCkgew0KLSAgICAgICAgdGhpcy5lbGVtZW50Rm9ybURlZmF1bHQgPSBlbGVtZW50Rm9ybURlZmF1bHQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZ1tdIGdldEV4dHJhQ2xhc3NlcygpIHsNCi0gICAgICAgIHJldHVybiBleHRyYUNsYXNzZXM7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RXh0cmFDbGFzc2VzKFN0cmluZ1tdIGV4dHJhQ2xhc3Nlcykgew0KLSAgICAgICAgdGhpcy5leHRyYUNsYXNzZXMgPSBleHRyYUNsYXNzZXM7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXROc0dlbkNsYXNzTmFtZSgpIHsNCi0gICAgICAgIHJldHVybiBuc0dlbkNsYXNzTmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXROc0dlbkNsYXNzTmFtZShTdHJpbmcgbnNHZW5DbGFzc05hbWUpIHsNCi0gICAgICAgIHRoaXMubnNHZW5DbGFzc05hbWUgPSBuc0dlbkNsYXNzTmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNjaGVtYUdlbkNsYXNzTmFtZSgpIHsNCi0gICAgICAgIHJldHVybiBzY2hlbWFHZW5DbGFzc05hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0U2NoZW1hR2VuQ2xhc3NOYW1lKFN0cmluZyBzY2hlbWFHZW5DbGFzc05hbWUpIHsNCi0gICAgICAgIHRoaXMuc2NoZW1hR2VuQ2xhc3NOYW1lID0gc2NoZW1hR2VuQ2xhc3NOYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGxvYWRQa2cyTnNNYXAoKSB7DQotICAgICAgICBtYXBwaW5ncy5leGVjdXRlKG5hbWVzcGFjZU1hcCwgdHJ1ZSk7DQotICAgICAgICBJdGVyYXRvciBwYWNrYWdlTmFtZXMgPSBuYW1lc3BhY2VNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsNCi0gICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9IG51bGw7DQotICAgICAgICB3aGlsZSAocGFja2FnZU5hbWVzLmhhc05leHQoKSkgew0KLSAgICAgICAgICAgIHBhY2thZ2VOYW1lID0gKFN0cmluZykgcGFja2FnZU5hbWVzLm5leHQoKTsNCi0gICAgICAgICAgICBwa2cybnNNYXBwaW5ncy5hZGQoT1BFTl9CUkFDS0VUICsNCi0gICAgICAgICAgICAgICAgICAgIHBhY2thZ2VOYW1lICsNCi0gICAgICAgICAgICAgICAgICAgIENPTU1BICsNCi0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZU1hcC5nZXQocGFja2FnZU5hbWUpICsNCi0gICAgICAgICAgICAgICAgICAgIENMT1NFX0JSQUNLRVQpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBBcnJheUxpc3QgZ2V0UGtnMm5zTWFwcGluZ3MoKSB7DQotICAgICAgICByZXR1cm4gcGtnMm5zTWFwcGluZ3M7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0UGtnMm5zTWFwcGluZ3MoQXJyYXlMaXN0IHBrZzJuc01hcHBpbmdzKSB7DQotICAgICAgICB0aGlzLnBrZzJuc01hcHBpbmdzID0gcGtnMm5zTWFwcGluZ3M7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIGFkZCBhIG1hcHBpbmcgb2YgbmFtZXNwYWNlcyB0byBwYWNrYWdlcw0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgYWRkTWFwcGluZyhOYW1lc3BhY2VNYXBwaW5nIG1hcHBpbmcpIHsNCi0gICAgICAgIG1hcHBpbmdzLmFkZE1hcHBpbmcobWFwcGluZyk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIGFkZCBhIG1hcHBpbmcgb2YgbmFtZXNwYWNlcyB0byBwYWNrYWdlcw0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgYWRkTWFwcGluZ1NldChNYXBwaW5nU2V0IG1hcHBpbmdzZXQpIHsNCi0gICAgICAgIG1hcHBpbmdzLmFkZE1hcHBpbmdTZXQobWFwcGluZ3NldCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXREb2NMaXRCYXJlKCkgew0KLSAgICAgICAgcmV0dXJuIGRvY0xpdEJhcmU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RG9jTGl0QmFyZShTdHJpbmcgZG9jTGl0QmFyZSkgew0KLSAgICAgICAgdGhpcy5kb2NMaXRCYXJlID0gZG9jTGl0QmFyZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFdTRExWZXJzaW9uKCkgew0KLSAgICAgICAgcmV0dXJuIHdzZGxWZXJzaW9uOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFdTRExWZXJzaW9uKFN0cmluZyB3c2RsVmVyc2lvbikgew0KLSAgICAgICAgdGhpcy53c2RsVmVyc2lvbiA9IHdzZGxWZXJzaW9uOw0KLSAgICB9DQotfQ0KLQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItYW50LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvd3MvamF2YTJ3c2RsL0phdmEyV1NETFRhc2suamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItYW50LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvd3MvamF2YTJ3c2RsL0phdmEyV1NETFRhc2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFmZGZkMS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWFudC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3dzL2phdmEyd3NkbC9KYXZhMldTRExUYXNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUud3MuamF2YTJ3c2RsOwotCi0vKioKLSAqIEBkZXByZWNhdGVkIHBsZWFzZSB1c2Ugb3JnLmFwYWNoZS5heGlzMi50b29sLmFudC5KYXZhMldTRExUYXNrCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhMldTRExUYXNrIGV4dGVuZHMgb3JnLmFwYWNoZS5heGlzMi50b29sLmFudC5KYXZhMldTRExUYXNrIHsKLX0KLQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1hbnQtcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9sb2c0ai5wcm9wZXJ0aWVzIGIvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1hbnQtcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9sb2c0ai5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTQ4MDRmLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItYW50LXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvbG9nNGoucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLSMKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotCi0jIFNldCByb290IGNhdGVnb3J5IHByaW9yaXR5IHRvIElORk8gYW5kIGl0cyBvbmx5IGFwcGVuZGVyIHRvIENPTlNPTEUuCi1sb2c0ai5yb290Q2F0ZWdvcnk9SU5GTywgQ09OU09MRQotI2xvZzRqLnJvb3RDYXRlZ29yeT1JTkZPLCBDT05TT0xFLCBMT0dGSUxFCi0KLSMgU2V0IHRoZSBlbnRlcnByaXNlIGxvZ2dlciBwcmlvcml0eSB0byBGQVRBTAotbG9nNGoubG9nZ2VyLm9yZy5hcGFjaGUuYXhpczIuZW50ZXJwcmlzZT1GQVRBTAotbG9nNGoubG9nZ2VyLmRlLmh1bnNpY2tlci5qYWxvcHkuaW89RkFUQUwKLWxvZzRqLmxvZ2dlci5odHRwY2xpZW50LndpcmUuaGVhZGVyPUZBVEFMCi1sb2c0ai5sb2dnZXIub3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQ9RkFUQUwKLQotIyBDT05TT0xFIGlzIHNldCB0byBiZSBhIENvbnNvbGVBcHBlbmRlciB1c2luZyBhIFBhdHRlcm5MYXlvdXQuCi1sb2c0ai5hcHBlbmRlci5DT05TT0xFPW9yZy5hcGFjaGUubG9nNGouQ29uc29sZUFwcGVuZGVyCi1sb2c0ai5hcHBlbmRlci5DT05TT0xFLmxheW91dD1vcmcuYXBhY2hlLmxvZzRqLlBhdHRlcm5MYXlvdXQKLWxvZzRqLmFwcGVuZGVyLkNPTlNPTEUubGF5b3V0LkNvbnZlcnNpb25QYXR0ZXJuPSVkICUtNXAgJWMgLSAlbSVuCi0KLSMgTE9HRklMRSBpcyBzZXQgdG8gYmUgYSBGaWxlIGFwcGVuZGVyIHVzaW5nIGEgUGF0dGVybkxheW91dC4KLWxvZzRqLmFwcGVuZGVyLkxPR0ZJTEU9b3JnLmFwYWNoZS5sb2c0ai5GaWxlQXBwZW5kZXIKLWxvZzRqLmFwcGVuZGVyLkxPR0ZJTEUuRmlsZT1heGlzMi5sb2cKLWxvZzRqLmFwcGVuZGVyLkxPR0ZJTEUuQXBwZW5kPXRydWUKLWxvZzRqLmFwcGVuZGVyLkxPR0ZJTEUubGF5b3V0PW9yZy5hcGFjaGUubG9nNGouUGF0dGVybkxheW91dAotbG9nNGouYXBwZW5kZXIuTE9HRklMRS5sYXlvdXQuQ29udmVyc2lvblBhdHRlcm49JWQgWyV0XSAlLTVwICVjICV4IC0gJW0lbgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLWNvZGVnZW4tcGx1Z2luL2J1aWxkLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1jb2RlZ2VuLXBsdWdpbi9idWlsZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkwZWU5MmMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLWNvZGVnZW4tcGx1Z2luL2J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwOCArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxwcm9qZWN0IGJhc2VkaXI9Ii4iIGRlZmF1bHQ9ImhlbHAiPgotCi0gICAgPCEtLVNldCB5b3VyIGVjbGlwc2UgaG9tZSBkaXJlY3RvcnkgIC0tPgotICAgIDxwcm9wZXJ0eSBlbnZpcm9ubWVudD0iZW52IiAvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJlY2xpcHNlLmhvbWUiIHZhbHVlPSIke2Vudi5FQ0xJUFNFX0hPTUV9Ij48L3Byb3BlcnR5PgotCQotICAgIDwhLS0gcHJvcGVydGllcyBmaWxlIHRvIGxvYWQgdGhlIHZlcnNpb25zIG9mIGRlcGVuZGVuY2llcyAtLT4KLSAgICA8cHJvcGVydHkgZmlsZT0iLi4vLi4vLi4vZXRjL3Byb2plY3QucHJvcGVydGllcyIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJjb2RlZ2VuLnBsdWdpbi52ZXJzaW9uIiB2YWx1ZT0iQXhpczJfQ29kZWdlbl9XaXphcmRfJHt2ZXJzaW9uX251bWJlcn0iPjwvcHJvcGVydHk+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImNvZGVnZW4ucGx1Z2luLnppcC5uYW1lIiB2YWx1ZT0iYXhpczItZWNsaXBzZS1jb2RlZ2VuLXdpemFyZC56aXAiPjwvcHJvcGVydHk+Ci0JCi0gICAgPHByb3BlcnR5IG5hbWU9InNyYyIgdmFsdWU9Ii4vc3JjIj48L3Byb3BlcnR5PgotICAgIDxwcm9wZXJ0eSBuYW1lPSJjb2RlZ2VuLnNyYy5kaXIiIHZhbHVlPSIuLi9heGlzMi1lY2xpcHNlLWNvZGVnZW4tcGx1Z2luL3NyYy9tYWluL2phdmEiPjwvcHJvcGVydHk+Ci0gICAgPHByb3BlcnR5IG5hbWU9Im91dHB1dCIgdmFsdWU9Ii4uL3RhcmdldC9lY2xpcHNlX3BsdWdpbnMiPjwvcHJvcGVydHk+Ci0gICAgPHByb3BlcnR5IG5hbWU9Im91dHB1dC50YXJnZXQiIHZhbHVlPSIke291dHB1dH0vcmVsZWFzZSI+PC9wcm9wZXJ0eT4KLSAgICA8cHJvcGVydHkgbmFtZT0icGx1Z2luLm91dHB1dC5kaXIiIHZhbHVlPSIke291dHB1dH0vcGx1Z2luIj48L3Byb3BlcnR5PgotICAgIDxwcm9wZXJ0eSBuYW1lPSJjb2RlZ2VuLm91dHB1dC5kaXIiIHZhbHVlPSIke291dHB1dH0vY29kZS1nZW4iPjwvcHJvcGVydHk+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImNvZGVnZW4ucGx1Z2luLm91dHB1dC5kaXIiIHZhbHVlPSIke3BsdWdpbi5vdXRwdXQuZGlyfS8ke2NvZGVnZW4ucGx1Z2luLnZlcnNpb259Ij48L3Byb3BlcnR5PgotCi0gICAgPHByb3BlcnR5IG5hbWU9InNvdXJjZS5kaXIubmFtZSIgdmFsdWU9InNyYyI+PC9wcm9wZXJ0eT4KLSAgICA8cHJvcGVydHkgbmFtZT0ibGliLmRpci5uYW1lIiB2YWx1ZT0ibGliIj48L3Byb3BlcnR5PgotICAgIDxwcm9wZXJ0eSBuYW1lPSJiaW4uZGlyLm5hbWUiIHZhbHVlPSJiaW4iPjwvcHJvcGVydHk+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImhlbHAuZGlyLm5hbWUiIHZhbHVlPSJoZWxwIj48L3Byb3BlcnR5PgotICAgIDxwcm9wZXJ0eSBuYW1lPSJpY29ucy5kaXIubmFtZSIgdmFsdWU9Imljb25zIj48L3Byb3BlcnR5PgotCi0gICAgPHByb3BlcnR5IG5hbWU9InBsdWdpbi5wcm9qZWN0LmZpbGUubmFtZSIgdmFsdWU9Ii5wcm9qZWN0Ij48L3Byb3BlcnR5PgotICAgIDxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4uY2xhc3NwYXRoLmZpbGUubmFtZSIgdmFsdWU9Ii5jbGFzc3BhdGgiPjwvcHJvcGVydHk+Ci0gICAgPHByb3BlcnR5IG5hbWU9InBsdWdpbi5oZWxwLmZpbGUubmFtZSIgdmFsdWU9ImhlbHBfdG9jLnhtbCI+PC9wcm9wZXJ0eT4KLSAgICA8cHJvcGVydHkgbmFtZT0idG9vbF9kb2NzX3ZlcnNpb24iIHZhbHVlPSIxXzQiPjwvcHJvcGVydHk+Ci0KLSAgICA8cHJvcGVydHkgbmFtZT0iY29kZWdlbi5yZXNvdXJjZS5kaXIiIHZhbHVlPSIuLi9jb25mL2NvZGVnZW4iPjwvcHJvcGVydHk+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImNvZGVnZW4uaGVscC5yZXNvdXJjZS5maWxlIiB2YWx1ZT0iLi4vLi4vLi4vbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLyR7dG9vbF9kb2NzX3ZlcnNpb259L2VjbGlwc2Uvd3NkbDJqYXZhLXBsdWdpbi5odG1sIj48L3Byb3BlcnR5PgotICAgIDxwcm9wZXJ0eSBuYW1lPSJjb2RlZ2VuLmhlbHAuaW1hZ2VzLmRpciIgdmFsdWU9Ii4uLy4uLy4uL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8ke3Rvb2xfZG9jc192ZXJzaW9ufS9lY2xpcHNlL2ltYWdlcyI+PC9wcm9wZXJ0eT4KLSAgICA8cHJvcGVydHkgbmFtZT0iYXhpczIubGliLmRpciIgdmFsdWU9Ii4uLy4uLy4uL3RhcmdldC9saWIiPjwvcHJvcGVydHk+Ci0KLSAgICA8IS0tRmlsdGVyIHRva2VucyBmb3IgdGhlIGNvcHkgY29tbWFuZCB0byBmaWx0ZXIgdGhlIHZlcnNpb25zIG9mIGV4dGVybmFsIGRlcGVuZGVuY2llcyAtLT4KLSAgICAgPGZpbHRlciB0b2tlbj0idmVyc2lvbl9udW1iZXIiIHZhbHVlPSIke3ZlcnNpb25fbnVtYmVyfSIgLz4KLSAgICAgPGZpbHRlciB0b2tlbj0iYWN0aXZhdGlvbi52ZXJzaW9uIiB2YWx1ZT0iJHthY3RpdmF0aW9uLnZlcnNpb259IiAvPgotCi0gICAgIDxmaWx0ZXIgdG9rZW49ImFudC52ZXJzaW9uIiB2YWx1ZT0iJHthbnQudmVyc2lvbn0iIC8+Ci0gICAgIDxmaWx0ZXIgdG9rZW49ImF4aW9tLnZlcnNpb24iIHZhbHVlPSIke2F4aW9tLnZlcnNpb259IiAvPgotICAgICA8ZmlsdGVyIHRva2VuPSJjb21tb25zLmxvZ2dpbmcudmVyc2lvbiIgdmFsdWU9IiR7Y29tbW9ucy5sb2dnaW5nLnZlcnNpb259IiAvPgotICAgICA8ZmlsdGVyIHRva2VuPSJuZWV0aGkudmVyc2lvbiIgdmFsdWU9IiR7bmVldGhpLnZlcnNpb259IiAvPgotICAgICA8ZmlsdGVyIHRva2VuPSJzdGF4LmFwaS52ZXJzaW9uIiB2YWx1ZT0iJHtzdGF4LmFwaS52ZXJzaW9ufSIgLz4KLSAgICAgPGZpbHRlciB0b2tlbj0ieG1sYmVhbnMudmVyc2lvbiIgdmFsdWU9IiR7eG1sYmVhbnMudmVyc2lvbn0iIC8+Ci0gICAgIDxmaWx0ZXIgdG9rZW49IlhtbFNjaGVtYS52ZXJzaW9uIiB2YWx1ZT0iJHtYbWxTY2hlbWEudmVyc2lvbn0iIC8+Ci0gICAgIDxmaWx0ZXIgdG9rZW49ImxvZzRqLnZlcnNpb24iIHZhbHVlPSIke2xvZzRqLnZlcnNpb259IiAvPgotICAgICA8ZmlsdGVyIHRva2VuPSJ3c2RsNGoudmVyc2lvbiIgdmFsdWU9IiR7d3NkbDRqLnZlcnNpb259IiAvPgotICAgICA8ZmlsdGVyIHRva2VuPSJ3b2Rlbi52ZXJzaW9uIiB2YWx1ZT0iJHt3b2Rlbi52ZXJzaW9ufSIgLz4KLSAgICAgPGZpbHRlciB0b2tlbj0iY29tbW9ucy5odHRwY2xpZW50LnZlcnNpb24iIHZhbHVlPSIke2NvbW1vbnMuaHR0cGNsaWVudC52ZXJzaW9ufSIgLz4KLSAgICAgPGZpbHRlciB0b2tlbj0iY29tbW9ucy5jb2RlYy52ZXJzaW9uIiB2YWx1ZT0iJHtjb21tb25zLmNvZGVjLnZlcnNpb259IiAvPgotICAgICA8ZmlsdGVyIHRva2VuPSJqaWJ4LnZlcnNpb24iIHZhbHVlPSIke2ppYngudmVyc2lvbn0iIC8+Ci0gICAgIDxmaWx0ZXIgdG9rZW49Imdlcm9uaW1vLnNwZWMuc3RheC52ZXJzaW9uIiB2YWx1ZT0iJHtnZXJvbmltby5zcGVjLnN0YXgudmVyc2lvbn0iIC8+Ci0gICAgIDxmaWx0ZXIgdG9rZW49Imdlcm9uaW1vLnNwZWMuYWN0aXZhdGlvbi52ZXJzaW9uIiB2YWx1ZT0iJHtnZXJvbmltby5zcGVjLmFjdGl2YXRpb24udmVyc2lvbn0iIC8+Ci0KLQotICAgICA8IS0tQ29kZWdlbiB3aXphcmQgbGlicmFyaWVzIC0tPgotICAgICA8ZmlsZXNldCBpZD0iY29kZWdlbi5saWJzIiBkaXI9IiR7YXhpczIubGliLmRpcn0iPgotIAkJPGluY2x1ZGUgbmFtZT0iZ2Vyb25pbW8tYWN0aXZhdGlvbl8xLjFfc3BlYy0ke2dlcm9uaW1vLnNwZWMuYWN0aXZhdGlvbi52ZXJzaW9ufS5qYXIiIC8+Ci0gCQk8aW5jbHVkZSBuYW1vPSJnZXJvbmltby1zdGF4LWFwaV8xLjBfc3BlYy0ke2dlcm9uaW1vLnNwZWMuc3RheC52ZXJzaW9ufS5qYXIiIC8+Ci0JCTxpbmNsdWRlIG5hbWU9ImFudC0ke2FudC52ZXJzaW9ufS5qYXIiIC8+Ci0JCTxpbmNsdWRlIG5hbWU9ImF4aW9tLWFwaS0ke2F4aW9tLnZlcnNpb259LmphciIgLz4KLQkJPGluY2x1ZGUgbmFtZT0iYXhpb20tZG9tLSR7YXhpb20udmVyc2lvbn0uamFyIiAvPgotCQk8aW5jbHVkZSBuYW1lPSJheGlvbS1pbXBsLSR7YXhpb20udmVyc2lvbn0uamFyIiAvPgotCSAgICAgICAgPGluY2x1ZGUgbmFtZT0iYXhpczItJHt2ZXJzaW9uX251bWJlcn0uamFyIiAvPgotCQk8aW5jbHVkZSBuYW1lPSJjb21tb25zLWxvZ2dpbmctJHtjb21tb25zLmxvZ2dpbmcudmVyc2lvbn0uamFyIiAvPgotCQk8aW5jbHVkZSBuYW1lPSJsb2c0ai0ke2xvZzRqLnZlcnNpb259LmphciIgLz4KLQkJPGluY2x1ZGUgbmFtZT0ibmVldGhpLSR7bmVldGhpLnZlcnNpb259LmphciIgLz4KLQkJPGluY2x1ZGUgbmFtZT0id3NkbDRqLSR7d3NkbDRqLnZlcnNpb259LmphciIgLz4KLQkJPGluY2x1ZGUgbmFtZT0ieG1sYmVhbnMtJHt4bWxiZWFucy52ZXJzaW9ufS5qYXIiIC8+Ci0JCTxpbmNsdWRlIG5hbWU9IlhtbFNjaGVtYS0ke1htbFNjaGVtYS52ZXJzaW9ufS5qYXIiIC8+Ci0JCTxpbmNsdWRlIG5hbWU9IndvZGVuLSR7d29kZW4udmVyc2lvbn0uamFyIiAvPgotCQk8aW5jbHVkZSBuYW1lPSJjb21tb25zLWh0dHBjbGllbnQtJHtjb21tb25zLmh0dHBjbGllbnQudmVyc2lvbn0uamFyIiAvPgotCQk8aW5jbHVkZSBuYW1lPSJjb21tb25zLWNvZGVjLSR7Y29tbW9ucy5jb2RlYy52ZXJzaW9ufS5qYXIiIC8+Ci0JCTxpbmNsdWRlIG5hbWU9ImF4aXMyLWppYngtJHt2ZXJzaW9uX251bWJlcn0uamFyIiAvPgotCQk8aW5jbHVkZSBuYW1lPSJqaWJ4LWJpbmQtJHtqaWJ4LnZlcnNpb259LmphciIgLz4KLQkJPGluY2x1ZGUgbmFtZT0iamlieC1ydW4tJHtqaWJ4LnZlcnNpb259LmphciIgLz4KLSAgICA8L2ZpbGVzZXQ+Ci0JCi0gICAgPCEtLSBEZWZhdWx0IHRhcmdldCB0byBnZW5lcmF0ZSBhbGwgdGhlIHNlcnZpY2VzIC0tPgotICAgIDx0YXJnZXQgbmFtZT0iYWxsIj4KLSAgICAJPGFudGNhbGwgdGFyZ2V0PSJjbGVhbiIgLz4KLSAgICAgICAgPGFudGNhbGwgdGFyZ2V0PSJnZW5lcmF0ZS1jb2RlZ2VuLXBsdWdpbiIvPgotICAgICAgICA8YW50Y2FsbCB0YXJnZXQ9InJlbGVhc2UtcGx1Z2luIi8+Ci0gICAgPC90YXJnZXQ+Ci0KLSAgICA8IS0tIGluaXQtLT4KLSAgICA8dGFyZ2V0IG5hbWU9ImluaXQiPgotICAgICAgICA8bWtkaXIgZGlyPSIke291dHB1dH0iPjwvbWtkaXI+Ci0gICAgICAgIDxta2RpciBkaXI9IiR7Y29kZWdlbi5vdXRwdXQuZGlyfSI+PC9ta2Rpcj4KLSAgICA8L3RhcmdldD4KLQotICA8IS0tIENvZGVnZW4gUHJvamVjdCAtLT4KLQotCi0gICAgICAgICAgPCEtLSBHZW5lcmV0ZSB0aGUgQ29kZWdlbiBQcm9qZWN0IHRoYXQgY2FuIGJlIGltcG9ydGVkIGFzIGEgcmVhZHltYWRlIGVjbGlwc2UgcHJvamVjdCBpbiB0byB3b3Jrc3BhY2UgLS0+Ci0gICAgICAgICAgICA8dGFyZ2V0IG5hbWU9ImdlbmVyYXRlLWNvZGVnZW4tcHJvamVjdCI+Ci0gICAgICAgICAgICAgICAgPGRlbGV0ZSBmaWxlPSJwbHVnaW4ueG1sIiAvPgotICAgICAgICAgICAgICAgIDxkZWxldGUgZmlsZT0iYnVpbGQucHJvcGVydGllcyIgLz4KLSAgICAgICAgICAgICAgICA8ZGVsZXRlIGZpbGU9Ii5wcm9qZWN0IiAvPgotICAgICAgICAgICAgICAgIDxkZWxldGUgZmlsZT0iLmNsYXNzcGF0aCIgLz4KLSAgICAgICAgICAgICAgICA8ZGVsZXRlIGRpcj0iaWNvbnMiIC8+Ci0gICAgICAgICAgICAgICAgPGRlbGV0ZSBkaXI9ImhlbHAiIC8+Ci0gICAgICAgICAgICAgICAgPGRlbGV0ZSBkaXI9ImxpYiIgLz4KLQotICAgICAgICAgICAgICAgIDwhLS0gQ29weSB0byB0aGUgc2FtZSBwb3NpdGlvbiB3aXRoIHRoZSBmaWx0ZXJpbmcgb24tLT4KLSAgICAgICAgICAgICAgICA8Y29weSB0b2Rpcj0iLiIgZmlsdGVyaW5nPSJvbiIgPgotICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7Y29kZWdlbi5yZXNvdXJjZS5kaXJ9Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9InBsdWdpbi54bWwiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJidWlsZC5wcm9wZXJ0aWVzIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iJHtwbHVnaW4uY2xhc3NwYXRoLmZpbGUubmFtZX0iIC8+Ci0gICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgICAgICAgICA8L2NvcHk+Ci0KLSAgICAgICAgICAgICAgICA8IS0tIGNvcHkgdGhlIGxpYnMgLS0+Ci0gICAgICAgICAgICAgICAgPG1rZGlyIGRpcj0iJHtsaWIuZGlyLm5hbWV9IiAvPgotICAgICAgICAgICAgICAgIDxjb3B5IHRvZGlyPSIke2xpYi5kaXIubmFtZX0iPgotICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCByZWZpZD0iY29kZWdlbi5saWJzIiAvPgotICAgICAgICAgICAgICAgIDwvY29weT4KLSAgICAgICAgICAgICAgICA8IS0tIGNvcHkgdGhlICBpY29ucy0tPgotICAgICAgICAgICAgICAgIDxta2RpciBkaXI9IiR7aWNvbnMuZGlyLm5hbWV9IiAvPgotICAgICAgICAgICAgICAgIDxjb3B5IHRvZGlyPSIke2ljb25zLmRpci5uYW1lfSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7Y29kZWdlbi5yZXNvdXJjZS5kaXJ9LyR7aWNvbnMuZGlyLm5hbWV9IiAvPgotICAgICAgICAgICAgICAgIDwvY29weT4KLSAgICAgICAgICAgICAgICA8IS0tIGNvcHkgdGhlIG90aGVyIHByb2plY3QgZmlsZXMtLT4KLSAgICAgICAgICAgICAgICA8Y29weSB0b2Rpcj0iLiI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBmaWxlPSIke2NvZGVnZW4ucmVzb3VyY2UuZGlyfS8ke3BsdWdpbi5wcm9qZWN0LmZpbGUubmFtZX0iIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBmaWxlPSIke2NvZGVnZW4ucmVzb3VyY2UuZGlyfS8ke3BsdWdpbi5oZWxwLmZpbGUubmFtZX0iIC8+Ci0gICAgICAgICAgICAgICAgPC9jb3B5PgotCi0gICAgICAgICAgICA8L3RhcmdldD4KLQotICAgIDwhLS1jcmVhdGUgdGhlIGNvZGVnZW4gcHJvamVjdC0tPgotICAgIDx0YXJnZXQgbmFtZT0iY3JlYXRlLWNvZGVnZW4tcHJvamVjdCIgZGVwZW5kcz0iaW5pdCI+Ci0gICAgICAgIDwhLS0gY29weSB0aGUgc291cmNlICAtLT4KLSAgICAgICAgPGNvcHkgdG9kaXI9IiR7Y29kZWdlbi5vdXRwdXQuZGlyfS8ke3NvdXJjZS5kaXIubmFtZX0iPgotICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke2NvZGVnZW4uc3JjLmRpcn0iIGV4Y2x1ZGVzPSIqKi9zZXJ2aWNlLyoqLyouamF2YSIvPgotICAgICAgICA8L2NvcHk+Ci0gICAgICAgIDwhLS0gQ29weSB0aGUgb3RoZXIgc3R1ZmYgLS0+Ci0gICAgICAgIDxjb3B5IHRvZGlyPSIke2NvZGVnZW4ub3V0cHV0LmRpcn0iIGZpbHRlcmluZz0ib24iID4KLSAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtjb2RlZ2VuLnJlc291cmNlLmRpcn0iIGV4Y2x1ZGVzPSIqKi8qLmdpZiI+PC9maWxlc2V0PgotICAgICAgICA8L2NvcHk+Ci0gICAgICAgIDwhLS0gQ29weSB0aGUgaWNvbnMgZGlyIC0tPgotICAgICAgICA8Y29weSB0b2Rpcj0iJHtjb2RlZ2VuLm91dHB1dC5kaXJ9Ij4KLSAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtjb2RlZ2VuLnJlc291cmNlLmRpcn0iIGluY2x1ZGVzPSIqKi8qLmdpZiI+PC9maWxlc2V0PgotICAgICAgICA8L2NvcHk+Ci0gICAgICAgIDwhLS0gY3JlYXRlIGJpbiBkaXJlY3RvcnkgLS0+Ci0JICAgIDxta2RpciBkaXI9IiR7Y29kZWdlbi5vdXRwdXQuZGlyfS8ke2Jpbi5kaXIubmFtZX0iPjwvbWtkaXI+Ci0gICAgICAgIDwhLS0gY3JlYXRlIHRoZSBoZWxwIGRpcmVjdG9yeSAtLT4KLSAgICAgICAgPG1rZGlyIGRpcj0iJHtjb2RlZ2VuLm91dHB1dC5kaXJ9LyR7aGVscC5kaXIubmFtZX0iPjwvbWtkaXI+Ci0JICAgIDwhLS0gY29weSB0aGUgaGVscCBkaXJlY3RvcnkgLS0+Ci0gICAgICAgIDxjb3B5IHRvZGlyPSIke2NvZGVnZW4ub3V0cHV0LmRpcn0vJHtoZWxwLmRpci5uYW1lfSI+Ci0gICAgICAgICAgICA8ZmlsZXNldCBmaWxlPSIke2NvZGVnZW4uaGVscC5yZXNvdXJjZS5maWxlfSI+PC9maWxlc2V0PgotICAgICAgICA8L2NvcHk+Ci0gICAgICAgIDwhLS0gY29weSB0aGUgbGlicmFyaWVzIHRvIHRoZSBwbHVnaW4tLT4KLSAgICAgICAgPGNvcHkgdG9kaXI9IiR7Y29kZWdlbi5vdXRwdXQuZGlyfS8ke2xpYi5kaXIubmFtZX0iPgotICAgICAgICAgICAgPGZpbGVzZXQgcmVmaWQ9ImNvZGVnZW4ubGlicyIgLz4KLSAgICAgICAgPC9jb3B5PgotICAgICAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJpbWFnZXMuZGlyIiBmaWxlPSIke2NvZGVnZW4uaGVscC5pbWFnZXMuZGlyfSIgdHlwZT0iZGlyIiB2YWx1ZT0iJHtjb2RlZ2VuLmhlbHAuaW1hZ2VzLmRpcn0iLz4KLSAgICAgICAgICA8Y29weSB0b2Rpcj0iJHtjb2RlZ2VuLm91dHB1dC5kaXJ9LyR7aGVscC5kaXIubmFtZX0vaW1hZ2VzIj4KLSAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtpbWFnZXMuZGlyfSIvPgotICAgICAgICAgPC9jb3B5PgotCi0gICAgPC90YXJnZXQ+Ci0gICAgCi0gICAgPCEtLUdlbmVyYXRlIHRoZSBjb2RlZ2VuIHBsdWdpbiAtLT4JCi0gICAgPHRhcmdldCBuYW1lPSJnZW5lcmF0ZS1jb2RlZ2VuLXBsdWdpbiIgZGVwZW5kcz0iY3JlYXRlLWNvZGVnZW4tcHJvamVjdCI+Ci0gICAgICAgIDxta2RpciBkaXI9IiR7Y29kZWdlbi5wbHVnaW4ub3V0cHV0LmRpcn0iPjwvbWtkaXI+Ci0gICAgICAgIDwhLS0gY29weSB0aGUgcGx1Z2luLnhtbCBhbmQgaGVscF90b2MueG1sIC0tPgotICAgICAgICA8Y29weSB0b2Rpcj0iJHtjb2RlZ2VuLnBsdWdpbi5vdXRwdXQuZGlyfSI+Ci0gICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7Y29kZWdlbi5vdXRwdXQuZGlyfSIgPgotCQk8aW5jbHVkZSBuYW1lPSJwbHVnaW4ueG1sIiAvPgotCQk8aW5jbHVkZSBuYW1lPSJoZWxwX3RvYy54bWwiIC8+Ci0JCTxpbmNsdWRlIG5hbWU9ImJ1aWxkLnByb3BlcnRpZXMiIC8+Ci0JCTxpbmNsdWRlIG5hbWU9IioqL1NlcnZpY2VSZXNvdXJjZXMucHJvcGVydGllcyIgLz4KLQkgICAgPC9maWxlc2V0PgotICAgICAgICA8L2NvcHk+Ci0gICAgICAgIDwhLS0gY29weSB0aGUgaGVscCBkaXJlY3RvcnktLT4KLSAgICAgICAgPGNvcHkgdG9kaXI9IiR7Y29kZWdlbi5wbHVnaW4ub3V0cHV0LmRpcn0vaGVscCI+Ci0gICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7Y29kZWdlbi5vdXRwdXQuZGlyfS9oZWxwIiAvPgotICAgICAgICA8L2NvcHk+Ci0gICAgICAgIDwhLS0gY29weSB0aGUgaWNvbnMgZGlyZWN0b3J5LS0+Ci0gICAgICAgIDxjb3B5IHRvZGlyPSIke2NvZGVnZW4ucGx1Z2luLm91dHB1dC5kaXJ9L2ljb25zIj4KLSAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtjb2RlZ2VuLm91dHB1dC5kaXJ9L2ljb25zIiAvPgotICAgICAgICA8L2NvcHk+Ci0gICAgICAgIDwhLS0gY29weSB0aGUgbGlicmFyaWVzIHRvIHRoZSBwbHVnaW4tLT4KLSAgICAgICAgPGNvcHkgdG9kaXI9IiR7Y29kZWdlbi5wbHVnaW4ub3V0cHV0LmRpcn0vJHtsaWIuZGlyLm5hbWV9Ij4KLSAgICAgICAgICAgIDxmaWxlc2V0IHJlZmlkPSJjb2RlZ2VuLmxpYnMiIC8+Ci0gICAgICAgIDwvY29weT4KLSAgICAgICAgPCEtLSBjb3B5IHRoZSBzb3VyY2VzIHRvIHRoZSBwbHVnaW4tLT4KLSAgICAgICAgPGNvcHkgdG9kaXI9IiR7Y29kZWdlbi5wbHVnaW4ub3V0cHV0LmRpcn0vJHtzb3VyY2UuZGlyLm5hbWV9Ij4KLQkgICAgPGZpbGVzZXQgZGlyPSIke2NvZGVnZW4ub3V0cHV0LmRpcn0vJHtzb3VyY2UuZGlyLm5hbWV9Ij4KLQkJICAgIDxpbmNsdWRlIG5hbWU9Im9yZy8qKiIgLz4KLSAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgPC9jb3B5PgotCi0JPCEtLSBjb21waWxlIHRoZSBwbHVnaW4gamF2YSBmaWxlcyAtLT4KLQk8ZGVsZXRlIGRpcj0iJHtjb2RlZ2VuLnBsdWdpbi5vdXRwdXQuZGlyfS9jbGFzcyI+PC9kZWxldGU+Ci0gCTxta2RpciBkaXI9IiR7Y29kZWdlbi5wbHVnaW4ub3V0cHV0LmRpcn0vY2xhc3MiPjwvbWtkaXI+Ci0JPGphdmFjIHNyY2Rpcj0iJHtjb2RlZ2VuLm91dHB1dC5kaXJ9LyR7c291cmNlLmRpci5uYW1lfSIgCi0gICAgICAgICAgICAgICBkZXN0ZGlyPSIke2NvZGVnZW4ucGx1Z2luLm91dHB1dC5kaXJ9L2NsYXNzIiAKLSAgICAgICAgICAgICAgIGluY2x1ZGVzPSJvcmcvYXBhY2hlL2F4aXMyLyoqIj4KLQkJPGNsYXNzcGF0aD4KLSAgICAgCQkJPGZpbGVzZXQgZGlyPSIke2NvZGVnZW4ucGx1Z2luLm91dHB1dC5kaXJ9L2xpYiI+Ci0gICAgICAgIAkJCTxpbmNsdWRlIG5hbWU9IioqLyouamFyIiAvPgotICAgICAJCQk8L2ZpbGVzZXQ+Ci0gICAgICAgCQkJIDxmaWxlc2V0IGRpcj0iJHtlY2xpcHNlLmhvbWV9L3BsdWdpbnMvIj4KLQkJCQk8aW5jbHVkZSBuYW1lPSIqKi8qLmphciIgLz4KLSAgICAgCQkJPC9maWxlc2V0PgotICAgIAkJPC9jbGFzc3BhdGg+CQotCTwvamF2YWM+Ci0JCi0JPCEtLU1ha2UgYXZhaWxhYmxlIHRoZSByZXNvdXJjZXMgZm9yIHRoZSBwbHVnaW4gLS0+Ci0gICAgICAgIDxjb3B5IHRvZGlyPSIke2NvZGVnZW4ucGx1Z2luLm91dHB1dC5kaXJ9L2NsYXNzIj4KLSAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtjb2RlZ2VuLm91dHB1dC5kaXJ9LyR7c291cmNlLmRpci5uYW1lfSIgPgotCQk8aW5jbHVkZSBuYW1lPSIqKi9Db2RlZ2VuLnByb3BlcnRpZXMiIC8+Ci0JCTxleGNsdWRlIG5hbWU9IioqLyouY2xhc3MiIC8+Ci0JICAgIDwvZmlsZXNldD4KLSAgICAgICAgPC9jb3B5PgotICAgICAgCi0JPCEtLSBjcmVhdGUgdGhlIEF4aXMyQ29kZWdlbldpemFyZC5qYXIgLS0+Ci0gICAgICAgIDxqYXIgZGVzdGZpbGU9IiR7Y29kZWdlbi5wbHVnaW4ub3V0cHV0LmRpcn0vQXhpczJDb2RlZ2VuV2l6YXJkLmphciIgCi0JICAgICAgIGJhc2VkaXI9IiR7Y29kZWdlbi5wbHVnaW4ub3V0cHV0LmRpcn0vY2xhc3MiCi0gICAgICAgICAgIGluY2x1ZGVzPSJvcmcvYXBhY2hlLyoqIgotICAgICAgICAgIC8+Ci0JPGRlbGV0ZSBkaXI9IiR7Y29kZWdlbi5wbHVnaW4ub3V0cHV0LmRpcn0vc3JjIj48L2RlbGV0ZT4KLQk8ZGVsZXRlIGRpcj0iJHtjb2RlZ2VuLnBsdWdpbi5vdXRwdXQuZGlyfS9jbGFzcyI+PC9kZWxldGU+Ci0gICAgPC90YXJnZXQ+Ci0KLSAgICA8IS0tSW5zdGFsbCB0aGUgY29kZWdlbiBwbHVnaW4gLS0+Ci0gICAgPHRhcmdldCBuYW1lPSJpbnN0YWxsLWNvZGVnZW4tcGx1Z2luIiBkZXBlbmRzPSJpbml0LGdlbmVyYXRlLWNvZGVnZW4tcHJvamVjdCxnZW5lcmF0ZS1jb2RlZ2VuLXBsdWdpbiI+Ci0gICAgICAgIDxkZWxldGUgZGlyPSIke2VjbGlwc2UuaG9tZX0vcGx1Z2lucy8ke2NvZGVnZW4ucGx1Z2luLnZlcnNpb259Ij48L2RlbGV0ZT4KLSAgICAgICAgICA8Y29weSB0b2Rpcj0iJHtlY2xpcHNlLmhvbWV9L3BsdWdpbnMiPgotICAgIAkJPGZpbGVzZXQgZGlyPSIke3BsdWdpbi5vdXRwdXQuZGlyfSIvPgotICAgICAgICAgIDwvY29weT4KLSAgICA8L3RhcmdldD4KLSAgICAKLSAgICA8IS0tUmVsZXNlIHRoZSBwbHVnaW5zICh0aGlzIHdpbGwgaW5zdGFsbCB0aGUgcGx1Z2lucyBhbmQgYnVpbGQgdGhlIHppcCB2ZXJzaW9uKS0tPgotICAgIDx0YXJnZXQgbmFtZT0icmVsZWFzZS1wbHVnaW4iPgotICAgIAk8bWtkaXIgZGlyPSIke291dHB1dC50YXJnZXR9IiAvPgotICAgIAk8bWtkaXIgZGlyPSIke291dHB1dC50YXJnZXR9L2NvZGVnZW4vJHtjb2RlZ2VuLnBsdWdpbi52ZXJzaW9ufSIgLz4KLSAgICAJCi0gICAgICAgIDxhbnRjYWxsIHRhcmdldD0iZ2VuZXJhdGUtY29kZWdlbi1wbHVnaW4iLz4KLSAgICAJCi0gICAgICAgIDxjb3B5IHRvZGlyPSIke291dHB1dC50YXJnZXR9L2NvZGVnZW4vJHtjb2RlZ2VuLnBsdWdpbi52ZXJzaW9ufSI+Ci0gICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtwbHVnaW4ub3V0cHV0LmRpcn0vJHtjb2RlZ2VuLnBsdWdpbi52ZXJzaW9ufSIvPgotICAgICAgICA8L2NvcHk+Ci0gICAgCQotICAgIAk8IS0tWmlwIHRoZSBlY2xpcHNlIHBsdWdpbnMgdG8gZWNsaXBzZV9wbHVnaW5zL3RhcmdldCAtLT4KLSAgICAJPHppcCBkZXN0ZmlsZT0iJHtvdXRwdXQudGFyZ2V0fS8ke2NvZGVnZW4ucGx1Z2luLnppcC5uYW1lfSIKLSAgICAJICAgICAgIGJhc2VkaXI9IiR7b3V0cHV0LnRhcmdldH0vY29kZWdlbiIKLSAgICAJICAgICAgIHVwZGF0ZT0idHJ1ZSIKLSAgICAJLz4KLSAgICAJPGRlbGV0ZSBkaXI9IiR7b3V0cHV0LnRhcmdldH0vY29kZWdlbiIgLz4KLSAgICA8L3RhcmdldD4KLQotCi0gICAgPCEtLSBDbGVhbiB0aGUgZGlyZWN0b3J5IC0tPgotICAgIDx0YXJnZXQgbmFtZT0iY2xlYW4iPgotCTxkZWxldGUgZGlyPSIke2NvZGVnZW4ub3V0cHV0LmRpcn0iPjwvZGVsZXRlPgotICAgICAgICA8ZGVsZXRlIGRpcj0iJHtwbHVnaW4ub3V0cHV0LmRpcn0vJHtjb2RlZ2VuLnBsdWdpbi52ZXJzaW9ufSI+PC9kZWxldGU+Ci0gICAgICAgIDxkZWxldGUgZmlsZT0iJHtvdXRwdXQudGFnZXR9LyR7Y29kZWdlbi5maWxlLnppcC5uYW1lfSI+PC9kZWxldGU+Ci0gICAgPC90YXJnZXQ+Ci0KLQk8IS0tIGhlbHAsIGxpc3Qgb2YgdGFyZ2V0cyAtLT4KLSAgICA8dGFyZ2V0IG5hbWU9ImhlbHAiPgotCSAgICA8ZWNobyBtZXNzYWdlPSIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIiAvPgotCSAgICA8ZWNobyBtZXNzYWdlPSIqKiAgICAgICAgICAgICAgICAgRWNsaXBzZSBDb2RlZ2VuIFBsdWdpbiBCdWlsZCAgICAgICAgICAgICAgICAgICAgICAgICAgICoqIiAvPgotCSAgICA8ZWNobyBtZXNzYWdlPSIqKiAgcHJlLXJlcXVpc2l0ICAgICAgICAgICAgOiBlbnYuRUNMSVBTRV9IT01FICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqIiAvPgotCSAgICA8ZWNobyBtZXNzYWdlPSIqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqIiAvPgotCSAgICA8ZWNobyBtZXNzYWdlPSIqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqIiAvPgotCSAgICA8ZWNobyBtZXNzYWdlPSIqKiAgYnVpbGQgZWNsaXBzZSBwcm9qZWN0aSAgIDogZ2VuZXJhdGUtY29kZWdlbi1wcm9qZWN0ICAgICAgICAgICAgICAgICAgICoqIiAvPgotCSAgICA8ZWNobyBtZXNzYWdlPSIqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqIiAvPgotCSAgICA8ZWNobyBtZXNzYWdlPSIqKiAgYnVpbGQgZWNsaXBzZSBwbHVnaW4gICAgOiBnZW5lcmF0ZS1jb2RlZ2VuLXBsdWdpbiAgICAgICAgICAgICAgICAgICAgICoqIiAvPgotCSAgICA8ZWNobyBtZXNzYWdlPSIqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqIiAvPgotCSAgICA8ZWNobyBtZXNzYWdlPSIqKiAgaW5zdGFsbCBwbHVnaW4gICAgICAgICAgOiBpbnN0YWxsLWNvZGVnZW4tcGx1Z2luICAgICAgICAgICAgICAgICAgICAgICoqIiAvPgotCSAgICA8ZWNobyBtZXNzYWdlPSIqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqIiAvPgotCSAgICA8ZWNobyBtZXNzYWdlPSIqKiAgcmVsZWFzZSBlY2xpcHNlIHBsdWdpbiAgOiByZWxlYXNlLXBsdWdpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqIiAvPgotCSAgICA8ZWNobyBtZXNzYWdlPSIqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqIiAvPgotCSAgICA8ZWNobyBtZXNzYWdlPSIqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqIiAvPgotCSAgICA8ZWNobyBtZXNzYWdlPSIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIiAvPgotCi0gICAgPC90YXJnZXQ+Ci0JCi0KLTwvcHJvamVjdD4KLQotCi0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1jb2RlZ2VuLXBsdWdpbi9lY2xpcHNlLWNvZGVnZW4tcGx1Z2luLWFzc2VtYmx5LnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1jb2RlZ2VuLXBsdWdpbi9lY2xpcHNlLWNvZGVnZW4tcGx1Z2luLWFzc2VtYmx5LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTE0MmU3MC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2UtY29kZWdlbi1wbHVnaW4vZWNsaXBzZS1jb2RlZ2VuLXBsdWdpbi1hc3NlbWJseS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08YXNzZW1ibHk+Ci0gICAgPGlkPmF4aXMyLWVjbGlwc2UtY29kZWdlLXBsdWdpbjwvaWQ+Ci0gICAgPGluY2x1ZGVCYXNlRGlyZWN0b3J5PmZhbHNlPC9pbmNsdWRlQmFzZURpcmVjdG9yeT4KLSAgICA8Zm9ybWF0cz4KLSAgICAgICAgPGZvcm1hdD56aXA8L2Zvcm1hdD4KLSAgICA8L2Zvcm1hdHM+Ci0gICAgPGZpbGVTZXRzPgotICAgICAgICA8ZmlsZVNldD4KLSAgICAgICAgICAgIDxkaXJlY3Rvcnk+Li90YXJnZXQvY2xhc3NlczwvZGlyZWN0b3J5PgotICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT5jbGFzc2VzPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgIAk8L2ZpbGVTZXQ+Ci0gICAgPC9maWxlU2V0cz4KLQk8ZGVwZW5kZW5jeVNldHM+Ci0JPGRlcGVuZGVuY3lTZXQ+Ci0JCTxvdXRwdXRGaWxlTmFtZU1hcHBpbmc+JHthcnRpZmFjdElkfS0ke2dlcm9uaW1vLnNwZWMuYWN0aXZhdGlvbi52ZXJzaW9ufS4ke2V4dGVuc2lvbn08L291dHB1dEZpbGVOYW1lTWFwcGluZz4KLQkgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+bGliPC9vdXRwdXREaXJlY3Rvcnk+Ci0JICAgICAgICA8aW5jbHVkZXM+Ci0JICAgICAgICAJPGluY2x1ZGU+b3JnLmFwYWNoZS5nZXJvbmltby5zcGVjczpnZXJvbmltby1hY3RpdmF0aW9uXzEuMV9zcGVjOmphcjwvaW5jbHVkZT4KLQkgICAgICAgIDwvaW5jbHVkZXM+Ci0JPC9kZXBlbmRlbmN5U2V0PiAKLQk8ZGVwZW5kZW5jeVNldD4KLQkJPG91dHB1dEZpbGVOYW1lTWFwcGluZz4ke2FydGlmYWN0SWR9LSR7YXhpb20udmVyc2lvbn0uJHtleHRlbnNpb259PC9vdXRwdXRGaWxlTmFtZU1hcHBpbmc+Ci0JICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PmxpYjwvb3V0cHV0RGlyZWN0b3J5PgotCSAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgIAk8aW5jbHVkZT5vcmcuYXBhY2hlLndzLmNvbW1vbnMuYXhpb206YXhpb20tYXBpOmphcjwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAJPGluY2x1ZGU+b3JnLmFwYWNoZS53cy5jb21tb25zLmF4aW9tOmF4aW9tLWRvbTpqYXI8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgCTxpbmNsdWRlPm9yZy5hcGFjaGUud3MuY29tbW9ucy5heGlvbTpheGlvbS1pbXBsOmphcjwvaW5jbHVkZT4KLQkgICAgICAgIDwvaW5jbHVkZXM+Ci0JPC9kZXBlbmRlbmN5U2V0PiAKLQkJPGRlcGVuZGVuY3lTZXQ+Ci0JCTxvdXRwdXRGaWxlTmFtZU1hcHBpbmc+JHthcnRpZmFjdElkfS0ke2NvbW1vbnMubG9nZ2luZy52ZXJzaW9ufS4ke2V4dGVuc2lvbn08L291dHB1dEZpbGVOYW1lTWFwcGluZz4KLQkgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+bGliPC9vdXRwdXREaXJlY3Rvcnk+Ci0JICAgICAgICA8aW5jbHVkZXM+Ci0JICAgICAgICAJPGluY2x1ZGU+Y29tbW9ucy1sb2dnaW5nOmNvbW1vbnMtbG9nZ2luZzpqYXI8L2luY2x1ZGU+Ci0JICAgICAgICA8L2luY2x1ZGVzPgotCTwvZGVwZW5kZW5jeVNldD4gCi0JPGRlcGVuZGVuY3lTZXQ+Ci0JCTxvdXRwdXRGaWxlTmFtZU1hcHBpbmc+JHthcnRpZmFjdElkfS0ke2F4aXMyLnZlcnNpb259LiR7ZXh0ZW5zaW9ufTwvb3V0cHV0RmlsZU5hbWVNYXBwaW5nPgotCSAgICAgICAgPG91dHB1dERpcmVjdG9yeT5saWI8L291dHB1dERpcmVjdG9yeT4KLQkgICAgICAgIDxpbmNsdWRlcz4KLQkgICAgICAgIAk8aW5jbHVkZT5vcmcuYXBhY2hlLmF4aXMyOmF4aXMyOmphcjwvaW5jbHVkZT4KLQkgICAgICAgIDwvaW5jbHVkZXM+Ci0JPC9kZXBlbmRlbmN5U2V0PiAKLQk8ZGVwZW5kZW5jeVNldD4KLQkJPG91dHB1dEZpbGVOYW1lTWFwcGluZz4ke2FydGlmYWN0SWR9LSR7bmVldGhpLnZlcnNpb259LiR7ZXh0ZW5zaW9ufTwvb3V0cHV0RmlsZU5hbWVNYXBwaW5nPgotCSAgICAgICAgPG91dHB1dERpcmVjdG9yeT5saWI8L291dHB1dERpcmVjdG9yeT4KLQkgICAgICAgIDxpbmNsdWRlcz4KLQkgICAgICAgIAk8aW5jbHVkZT5vcmcuYXBhY2hlLm5lZXRoaTpuZWV0aGk6amFyPC9pbmNsdWRlPgotCSAgICAgICAgPC9pbmNsdWRlcz4KLQk8L2RlcGVuZGVuY3lTZXQ+IAotCTxkZXBlbmRlbmN5U2V0PgotCQk8b3V0cHV0RmlsZU5hbWVNYXBwaW5nPiR7YXJ0aWZhY3RJZH0tJHtnZXJvbmltby5zcGVjLnN0YXgudmVyc2lvbn0uJHtleHRlbnNpb259PC9vdXRwdXRGaWxlTmFtZU1hcHBpbmc+Ci0JICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PmxpYjwvb3V0cHV0RGlyZWN0b3J5PgotCSAgICAgICAgPGluY2x1ZGVzPgotCSAgICAgICAgCTxpbmNsdWRlPm9yZy5hcGFjaGUuZ2Vyb25pbW8uc3BlY3M6Z2Vyb25pbW8tc3RheC1hcGlfMS4wX3NwZWM6amFyPC9pbmNsdWRlPgotCSAgICAgICAgPC9pbmNsdWRlcz4KLQk8L2RlcGVuZGVuY3lTZXQ+IAotCTxkZXBlbmRlbmN5U2V0PgotCQk8b3V0cHV0RmlsZU5hbWVNYXBwaW5nPiR7YXJ0aWZhY3RJZH0tJHt3c2RsNGoudmVyc2lvbn0uJHtleHRlbnNpb259PC9vdXRwdXRGaWxlTmFtZU1hcHBpbmc+Ci0JICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PmxpYjwvb3V0cHV0RGlyZWN0b3J5PgotCSAgICAgICAgPGluY2x1ZGVzPgotCSAgICAgICAgCTxpbmNsdWRlPndzZGw0ajp3c2RsNGo6amFyPC9pbmNsdWRlPgotCSAgICAgICAgPC9pbmNsdWRlcz4KLQk8L2RlcGVuZGVuY3lTZXQ+IAotCTxkZXBlbmRlbmN5U2V0PgotCQk8b3V0cHV0RmlsZU5hbWVNYXBwaW5nPiR7YXJ0aWZhY3RJZH0tJHt4bWxiZWFucy52ZXJzaW9ufS4ke2V4dGVuc2lvbn08L291dHB1dEZpbGVOYW1lTWFwcGluZz4KLQkgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+bGliPC9vdXRwdXREaXJlY3Rvcnk+Ci0JICAgICAgICA8aW5jbHVkZXM+Ci0JICAgICAgICAJPGluY2x1ZGU+b3JnLmFwYWNoZS54bWxiZWFuczp4bWxiZWFuczpqYXI8L2luY2x1ZGU+Ci0JICAgICAgICA8L2luY2x1ZGVzPgotCTwvZGVwZW5kZW5jeVNldD4gCi0JPGRlcGVuZGVuY3lTZXQ+Ci0JCTxvdXRwdXRGaWxlTmFtZU1hcHBpbmc+JHthcnRpZmFjdElkfS0ke3htbHNjaGVtYS52ZXJzaW9ufS4ke2V4dGVuc2lvbn08L291dHB1dEZpbGVOYW1lTWFwcGluZz4KLQkgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+bGliPC9vdXRwdXREaXJlY3Rvcnk+Ci0JICAgICAgICA8aW5jbHVkZXM+Ci0JICAgICAgICAJPGluY2x1ZGU+b3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYTpYbWxTY2hlbWE6amFyPC9pbmNsdWRlPgotCSAgICAgICAgPC9pbmNsdWRlcz4KLQk8L2RlcGVuZGVuY3lTZXQ+IAotCTxkZXBlbmRlbmN5U2V0PgotCQk8b3V0cHV0RmlsZU5hbWVNYXBwaW5nPiR7YXJ0aWZhY3RJZH0tJHtsb2c0ai52ZXJzaW9ufS4ke2V4dGVuc2lvbn08L291dHB1dEZpbGVOYW1lTWFwcGluZz4KLQkgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+bGliPC9vdXRwdXREaXJlY3Rvcnk+Ci0JICAgICAgICA8aW5jbHVkZXM+Ci0JICAgICAgICAJPGluY2x1ZGU+bG9nNGo6bG9nNGo6amFyPC9pbmNsdWRlPgotCSAgICAgICAgPC9pbmNsdWRlcz4KLQk8L2RlcGVuZGVuY3lTZXQ+IAotCTxkZXBlbmRlbmN5U2V0PgotCQk8b3V0cHV0RmlsZU5hbWVNYXBwaW5nPiR7YXJ0aWZhY3RJZH0tJHt3b2Rlbi52ZXJzaW9ufS4ke2V4dGVuc2lvbn08L291dHB1dEZpbGVOYW1lTWFwcGluZz4KLQkgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+bGliPC9vdXRwdXREaXJlY3Rvcnk+Ci0JICAgICAgICA8aW5jbHVkZXM+Ci0JICAgICAgICAJPGluY2x1ZGU+b3JnLmFwYWNoZS53b2Rlbjp3b2RlbjpqYXI8L2luY2x1ZGU+Ci0JICAgICAgICA8L2luY2x1ZGVzPgotCTwvZGVwZW5kZW5jeVNldD4gCi0JPGRlcGVuZGVuY3lTZXQ+Ci0JCTxvdXRwdXRGaWxlTmFtZU1hcHBpbmc+JHthcnRpZmFjdElkfS0ke2NvbW1vbnMuaHR0cGNsaWVudC52ZXJzaW9ufS4ke2V4dGVuc2lvbn08L291dHB1dEZpbGVOYW1lTWFwcGluZz4KLQkgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+bGliPC9vdXRwdXREaXJlY3Rvcnk+Ci0JICAgICAgICA8aW5jbHVkZXM+Ci0JICAgICAgICAJPGluY2x1ZGU+Y29tbW9ucy1odHRwY2xpZW50OmNvbW1vbnMtaHR0cGNsaWVudDpqYXI8L2luY2x1ZGU+Ci0JICAgICAgICA8L2luY2x1ZGVzPgotCTwvZGVwZW5kZW5jeVNldD4gCi0JPGRlcGVuZGVuY3lTZXQ+Ci0JCTxvdXRwdXRGaWxlTmFtZU1hcHBpbmc+JHthcnRpZmFjdElkfS0ke2NvbW1vbnMuY29kZWMudmVyc2lvbn0uJHtleHRlbnNpb259PC9vdXRwdXRGaWxlTmFtZU1hcHBpbmc+Ci0JICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PmxpYjwvb3V0cHV0RGlyZWN0b3J5PgotCSAgICAgICAgPGluY2x1ZGVzPgotCSAgICAgICAgCTxpbmNsdWRlPmNvbW1vbnMtY29kZWM6Y29tbW9ucy1jb2RlYzpqYXI8L2luY2x1ZGU+Ci0JICAgICAgICA8L2luY2x1ZGVzPgotCTwvZGVwZW5kZW5jeVNldD4gCi0JPGRlcGVuZGVuY3lTZXQ+Ci0JCTxvdXRwdXRGaWxlTmFtZU1hcHBpbmc+JHthcnRpZmFjdElkfS0ke2ppYngudmVyc2lvbn0uJHtleHRlbnNpb259PC9vdXRwdXRGaWxlTmFtZU1hcHBpbmc+Ci0JICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PmxpYjwvb3V0cHV0RGlyZWN0b3J5PgotCSAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgIAk8aW5jbHVkZT5qaWJ4OmppYngtYmluZDpqYXI8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgCTxpbmNsdWRlPmppYng6amlieC1ydW46amFyPC9pbmNsdWRlPgotCSAgICAgICAgPC9pbmNsdWRlcz4KLQk8L2RlcGVuZGVuY3lTZXQ+IAotCTwvZGVwZW5kZW5jeVNldHM+Ci08L2Fzc2VtYmx5PgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLWNvZGVnZW4tcGx1Z2luL3BvbS54bWwgYi92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2UtY29kZWdlbi1wbHVnaW4vcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjYzYTMxYy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2UtY29kZWdlbi1wbHVnaW4vcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ5NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItcGFyZW50PC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4xLjUuMTwvdmVyc2lvbj4KLSAgICAgICAgPHJlbGF0aXZlUGF0aD4uLi8uLi9wYXJlbnQvcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgotICAgIDwvcGFyZW50PgotICAgIDxhcnRpZmFjdElkPmF4aXMyLmVjbGlwc2UuY29kZWdlbi5wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgPG5hbWU+QXBhY2hlIEF4aXMyIC0gdG9vbCAtIEVjbGlwc2UgQ29kZWdlbiBQbHVnaW48L25hbWU+Ci0gICAgPHBhY2thZ2luZz5tYXZlbi1wbHVnaW48L3BhY2thZ2luZz4KLSAgICA8ZGVzY3JpcHRpb24+VGhlIEF4aXMgMiBFY2xpcHNlIENvZGVnZW4gUGx1Z2luIGZvciB3c2RsMmphdmEgYW5kIGphdmEyd3NkbDwvZGVzY3JpcHRpb24+Ci0gICAgPGRlcGVuZGVuY2llcz4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5jb3JlPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuY29yZS5qb2JzPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPGV4Y2x1c2lvbnM+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuY29yZTwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuY29yZS5jb21tYW5kczwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5jb3JlPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5jb3JlLnZhcmlhYmxlczwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5jb3JlPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5jb3JlLmNvbnRlbnR0eXBlPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmNvcmU8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnM8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuY29yZTwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuY29yZS5maWxlc3lzdGVtPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLnVwZGF0ZTwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UudXBkYXRlLnVpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLnVwZGF0ZTwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvcjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS51cGRhdGU8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmhlbHA8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmhlbHA8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuYW50PC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5hbnQuY29yZTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgIDwvZXhjbHVzaW9ucz4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmNvcmU8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlczwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmNvcmU8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8ZXhjbHVzaW9ucz4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5jb3JlPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29tcGF0aWJpbGl0eTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5jb3JlPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29tcGF0aWJpbGl0eS5hdXRoPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgPC9leGNsdXNpb25zPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuZXF1aW5veDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmVxdWlub3guY29tbW9uPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPGV4Y2x1c2lvbnM+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuZXF1aW5veDwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuZXF1aW5veC5yZWdpc3RyeTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5lcXVpbm94PC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5lcXVpbm94LnByZWZlcmVuY2VzPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgPC9leGNsdXNpb25zPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamZhY2U8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZmFjZTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLm9zZ2k8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5vc2dpPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2Uuc3d0PC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2Uuc3d0PC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2Uuc3d0PC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2Uuc3d0LndpbjMyLndpbjMyLng4NjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLnVpPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UudWkuaWRlPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPGV4Y2x1c2lvbnM+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UudWk8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLnVpLmZvcm1zPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLnVpPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS51aS52aWV3czwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgIDwvZXhjbHVzaW9ucz4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZ2Vyb25pbW8uc3BlY3M8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5nZXJvbmltby1qYXZhbWFpbF8xLjRfc3BlYzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7Z2Vyb25pbW8uc3BlYy5qYXZhbWFpbC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1sb2dnaW5nPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1sb2dnaW5nPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtjb21tb25zLmxvZ2dpbmcudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczI8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3ZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLWNvZGVnZW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3ZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLWtlcm5lbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7dmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItYWRiPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHt2ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1hZGItY29kZWdlbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7dmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItamF2YTJ3c2RsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHt2ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZ2Vyb25pbW8uc3BlY3M8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5nZXJvbmltby1zdGF4LWFwaV8xLjBfc3BlYzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7Z2Vyb25pbW8uc3BlYy5zdGF4LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5uZWV0aGk8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5uZWV0aGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke25lZXRoaS52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+d3NkbDRqPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+d3NkbDRqPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHt3c2RsNGoudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLnhtbGJlYW5zPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+eG1sYmVhbnM8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3htbGJlYW5zLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+c3RheDwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnN0YXgtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbnM+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+WG1sU2NoZW1hPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHt4bWxzY2hlbWEudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmFudDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmFudDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7YW50LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS53b2RlbjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPndvZGVuLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7d29kZW4udmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmNvbW1vbnMtaHR0cGNsaWVudDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtaHR0cGNsaWVudDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7Y29tbW9ucy5odHRwY2xpZW50LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1jb2RlYzwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtY29kZWM8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke2NvbW1vbnMuY29kZWMudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuamlieDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmppYngtYmluZDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7amlieC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5qaWJ4PC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+amlieC1ydW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke2ppYngudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUud29kZW48L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD53b2Rlbi1pbXBsLWRvbTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmxvZzRqPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bG9nNGo8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke2xvZzRqLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXgubWFpbDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm1haWw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke2phdmF4Lm1haWwudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmdlcm9uaW1vLnNwZWNzPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+Z2Vyb25pbW8td3MtbWV0YWRhdGFfMi4wX3NwZWM8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8L2RlcGVuZGVuY2llcz4KLSAgICA8ZGlzdHJpYnV0aW9uTWFuYWdlbWVudD4KLSAgICAgICAgPHJlcG9zaXRvcnk+Ci0gICAgICAgICAgICA8aWQ+YXBhY2hlLXJlcG88L2lkPgotICAgICAgICAgICAgPG5hbWU+TWF2ZW4gQ2VudHJhbCBSZXBvc2l0b3J5PC9uYW1lPgotICAgICAgICAgICAgPHVybD5zY3BleGU6Ly9wZW9wbGUuYXBhY2hlLm9yZy8vd3d3L3Blb3BsZS5hcGFjaGUub3JnL3JlcG8vbTItaWJpYmxpby1yc3luYy1yZXBvc2l0b3J5PC91cmw+Ci0gICAgICAgIDwvcmVwb3NpdG9yeT4KLSAgICAgICAgPHNuYXBzaG90UmVwb3NpdG9yeT4KLSAgICAgICAgICAgIDxpZD5hcGFjaGUtc25hcHNob3RzPC9pZD4KLSAgICAgICAgICAgIDxuYW1lPkFwYWNoZSBEZXZlbG9wbWVudCBSZXBvc2l0b3J5PC9uYW1lPgotICAgICAgICAgICAgPHVybD5zY3BleGU6Ly9wZW9wbGUuYXBhY2hlLm9yZy8vd3d3L3Blb3BsZS5hcGFjaGUub3JnL3JlcG8vbTItc25hcHNob3QtcmVwb3NpdG9yeTwvdXJsPgotICAgICAgICA8L3NuYXBzaG90UmVwb3NpdG9yeT4KLSAgICA8L2Rpc3RyaWJ1dGlvbk1hbmFnZW1lbnQ+Ci0gICAgPGJ1aWxkPgotICAgICAgICA8cmVzb3VyY2VzPgotICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgPGRpcmVjdG9yeT4uLi8uLi8uLjwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICA8aW5jbHVkZT5OT1RJQ0UudHh0PC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+TElDRU5TRS50eHQ8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICAgIDxmaWx0ZXJpbmc+ZmFsc2U8L2ZpbHRlcmluZz4KLSAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vamF2YTwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxleGNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovKi5qYXZhPC9leGNsdWRlPgotICAgICAgICAgICAgICAgIDwvZXhjbHVkZXM+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICA8L3Jlc291cmNlcz4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxzb3VyY2U+MS41PC9zb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx0YXJnZXQ+MS41PC90YXJnZXQ+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+JHttYXZlbi5hc3NlbWJseS52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5kaXN0cmlidXRpb24tcGFja2FnZTwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+YXR0YWNoZWQ8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0b3JzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvcj4ke3BvbS5iYXNlZGlyfS9lY2xpcHNlLWNvZGVnZW4tcGx1Z2luLWFzc2VtYmx5LnhtbDwvZGVzY3JpcHRvcj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rlc2NyaXB0b3JzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaW5hbE5hbWU+ZGlzdDwvZmluYWxOYW1lPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFudHJ1bi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+cGFja2FnZTwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFza3M+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iY29kZWdlbi5wbHVnaW4udmVyc2lvbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJBeGlzMl9Db2RlZ2VuX1dpemFyZF8ke2VjbGlwc2UucGx1Z2lucy52ZXJzaW9ufSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iY29kZWdlbi5wbHVnaW4uemlwLm5hbWUiIHZhbHVlPSJheGlzMi1lY2xpcHNlLWNvZGVnZW4td2l6YXJkLnppcCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iY29kZWdlbi5wbHVnaW4uamFyLm5hbWUiIHZhbHVlPSJBeGlzMkNvZGVnZW5XaXphcmQuamFyIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzcmMiIHZhbHVlPSIuL3NyYyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iY29kZWdlbi5zcmMuZGlyIiB2YWx1ZT0iLi4vYXhpczItZWNsaXBzZS1jb2RlZ2VuLXBsdWdpbi9zcmMvbWFpbi9qYXZhIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJvdXRwdXQiIHZhbHVlPSIuLi90YXJnZXQvZWNsaXBzZV9wbHVnaW5zIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJvdXRwdXQudGFyZ2V0IiB2YWx1ZT0iJHtvdXRwdXR9L3JlbGVhc2UiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InBsdWdpbi5vdXRwdXQuZGlyIiB2YWx1ZT0iJHtvdXRwdXR9L3BsdWdpbiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iY29kZWdlbi5vdXRwdXQuZGlyIiB2YWx1ZT0iJHtvdXRwdXR9L2NvZGUtZ2VuIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjb2RlZ2VuLnBsdWdpbi5vdXRwdXQuZGlyIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9IiR7cGx1Z2luLm91dHB1dC5kaXJ9LyR7Y29kZWdlbi5wbHVnaW4udmVyc2lvbn0iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InNvdXJjZS5kaXIubmFtZSIgdmFsdWU9InNyYyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ibGliLmRpci5uYW1lIiB2YWx1ZT0ibGliIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJiaW4uZGlyLm5hbWUiIHZhbHVlPSJiaW4iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImhlbHAuZGlyLm5hbWUiIHZhbHVlPSJoZWxwIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJpY29ucy5kaXIubmFtZSIgdmFsdWU9Imljb25zIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4ucHJvamVjdC5maWxlLm5hbWUiIHZhbHVlPSIucHJvamVjdCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0icGx1Z2luLmNsYXNzcGF0aC5maWxlLm5hbWUiIHZhbHVlPSIuY2xhc3NwYXRoIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4uaGVscC5maWxlLm5hbWUiIHZhbHVlPSJoZWxwX3RvYy54bWwiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImNvZGVnZW4ucmVzb3VyY2UuZGlyIiB2YWx1ZT0iLi4vY29uZi9jb2RlZ2VuIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjb2RlZ2VuLmhlbHAucmVzb3VyY2UuZmlsZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSIuLi8uLi8uLi9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2VjbGlwc2Uvd3NkbDJqYXZhLXBsdWdpbi5odG1sIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjb2RlZ2VuLmhlbHAuaW1hZ2VzLmRpciIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSIuLi8uLi8uLi9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2VjbGlwc2UvaW1hZ2VzIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJheGlzMi5saWIuZGlyIiB2YWx1ZT0iLi4vLi4vLi4vdGFyZ2V0L2xpYiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iY29kZWdlbi5yZXNvdXJjZS5kaXIiIHZhbHVlPSIuLi9jb25mL2NvZGVnZW4iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlbGV0ZSBkaXI9Ii4vdGFyZ2V0L3BsdWdpbi8ke2NvZGVnZW4ucGx1Z2luLnZlcnNpb259Ii8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxta2RpciBkaXI9Ii4vdGFyZ2V0L3BsdWdpbi8ke2NvZGVnZW4ucGx1Z2luLnZlcnNpb259Ii8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZWxldGUgZGlyPSIuL3RhcmdldC9kaXN0Ii8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxta2RpciBkaXI9Ii4vdGFyZ2V0L2Rpc3QiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLUZpbHRlciB0b2tlbnMgZm9yIHRoZSBjb3B5IGNvbW1hbmQgdG8gZmlsdGVyIHRoZSB2ZXJzaW9ucyBvZiBleHRlcm5hbCBkZXBlbmRlbmNpZXMgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWx0ZXIgdG9rZW49ImVjbGlwc2UucGx1Z2lucy52ZXJzaW9uIiB2YWx1ZT0iJHtlY2xpcHNlLnBsdWdpbnMudmVyc2lvbn0iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbHRlciB0b2tlbj0idmVyc2lvbiIgdmFsdWU9IiR7dmVyc2lvbn0iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbHRlciB0b2tlbj0iZ2Vyb25pbW8uc3BlYy5hY3RpdmF0aW9uLnZlcnNpb24iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9IiR7Z2Vyb25pbW8uc3BlYy5hY3RpdmF0aW9uLnZlcnNpb259Ii8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWx0ZXIgdG9rZW49Imdlcm9uaW1vLnNwZWMuc3RheC52ZXJzaW9uIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSIke2dlcm9uaW1vLnNwZWMuc3RheC52ZXJzaW9ufSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsdGVyIHRva2VuPSJhbnQudmVyc2lvbiIgdmFsdWU9IiR7YW50LnZlcnNpb259Ii8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWx0ZXIgdG9rZW49ImF4aW9tLnZlcnNpb24iIHZhbHVlPSIke2F4aW9tLnZlcnNpb259Ii8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWx0ZXIgdG9rZW49ImNvbW1vbnMubG9nZ2luZy52ZXJzaW9uIiB2YWx1ZT0iJHtjb21tb25zLmxvZ2dpbmcudmVyc2lvbn0iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbHRlciB0b2tlbj0ibmVldGhpLnZlcnNpb24iIHZhbHVlPSIke25lZXRoaS52ZXJzaW9ufSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsdGVyIHRva2VuPSJ4bWxiZWFucy52ZXJzaW9uIiB2YWx1ZT0iJHt4bWxiZWFucy52ZXJzaW9ufSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsdGVyIHRva2VuPSJ4bWxzY2hlbWEudmVyc2lvbiIgdmFsdWU9IiR7eG1sc2NoZW1hLnZlcnNpb259Ii8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWx0ZXIgdG9rZW49ImxvZzRqLnZlcnNpb24iIHZhbHVlPSIke2xvZzRqLnZlcnNpb259Ii8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWx0ZXIgdG9rZW49IndzZGw0ai52ZXJzaW9uIiB2YWx1ZT0iJHt3c2RsNGoudmVyc2lvbn0iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbHRlciB0b2tlbj0id29kZW4udmVyc2lvbiIgdmFsdWU9IiR7d29kZW4udmVyc2lvbn0iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbHRlciB0b2tlbj0iY29tbW9ucy5odHRwY2xpZW50LnZlcnNpb24iIHZhbHVlPSIke2NvbW1vbnMuaHR0cGNsaWVudC52ZXJzaW9ufSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsdGVyIHRva2VuPSJjb21tb25zLmNvZGVjLnZlcnNpb24iIHZhbHVlPSIke2NvbW1vbnMuY29kZWMudmVyc2lvbn0iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbHRlciB0b2tlbj0iamlieC52ZXJzaW9uIiB2YWx1ZT0iJHtqaWJ4LnZlcnNpb259Ii8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWx0ZXIgdG9rZW49ImphdmF4Lm1haWwudmVyc2lvbiIgdmFsdWU9IiR7amF2YXgubWFpbC52ZXJzaW9ufSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsdGVyIHRva2VuPSJnZXJvbmltby5zcGVjLm1ldGFkYXRhLnZlcnNpb24iIHZhbHVlPSIke2dlcm9uaW1vLnNwZWMubWV0YWRhdGEudmVyc2lvbn0iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbHRlciB0b2tlbj0iZ2Vyb25pbW8uc3BlYy5qYXZhbWFpbC52ZXJzaW9uIiB2YWx1ZT0iJHtnZXJvbmltby5zcGVjLmphdmFtYWlsLnZlcnNpb259Ii8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWx0ZXIgdG9rZW49InN0YXguaW1wbC52ZXJzaW9uIiB2YWx1ZT0iJHtzdGF4LmltcGwudmVyc2lvbn0iLz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotCQkJCQkJCQk8IS0tCi0JCQkJCQkJCSAgSWYgaXQgaXMgbmVjY2Vzc2FyeSB0byBjcmVhdGUgdGhlIGVjbGlwc2UgcHJvamVjdCBtYW51YWxseSB3aXRob3V0IHVzaW5nICJtdm4gZWNsaXBzZTplY2xpcHNlIiBjb21tYW5kIHVuY29tbWVudCB0aGUgZm9sbG93aW5nIHNlY3Rpb24gd2hpY2ggY29waWVzIAotCQkJCQkJCQkgIHRoZSByZXF1aXJlZCBqYXJzIHRvIHRoZSB0aGUgcHJvamVjdCBsaWIgZm9sZGVyCi0JCQkJCQkJCSAgLS0+Ci0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJtMi5sb2NhbC5yZXBvIiB2YWx1ZT0iJHtzZXR0aW5ncy5sb2NhbFJlcG9zaXRvcnl9Ii8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxta2RpciBkaXI9Ii4vbGliIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3B5IHRvZGlyPSIuL2xpYiIgZmlsZT0iJHttMi5sb2NhbC5yZXBvfS9vcmcvYXBhY2hlL2dlcm9uaW1vL3NwZWNzL2dlcm9uaW1vLWFjdGl2YXRpb25fMS4xX3NwZWMvJHtnZXJvbmltby5zcGVjLmFjdGl2YXRpb24udmVyc2lvbn0vZ2Vyb25pbW8tYWN0aXZhdGlvbl8xLjFfc3BlYy0ke2dlcm9uaW1vLnNwZWMuYWN0aXZhdGlvbi52ZXJzaW9ufS5qYXIiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3B5IHRvZGlyPSIuL2xpYiIgZmlsZT0iJHttMi5sb2NhbC5yZXBvfS9vcmcvYXBhY2hlL2FudC9hbnQvJHthbnQudmVyc2lvbn0vYW50LSR7YW50LnZlcnNpb259LmphciIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvcHkgdG9kaXI9Ii4vbGliIiBmaWxlPSIke20yLmxvY2FsLnJlcG99L29yZy9hcGFjaGUvd3MvY29tbW9ucy9heGlvbS9heGlvbS1hcGkvJHtheGlvbS52ZXJzaW9ufS9heGlvbS1hcGktJHtheGlvbS52ZXJzaW9ufS5qYXIiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3B5IHRvZGlyPSIuL2xpYiIgZmlsZT0iJHttMi5sb2NhbC5yZXBvfS9vcmcvYXBhY2hlL3dzL2NvbW1vbnMvYXhpb20vYXhpb20tZG9tLyR7YXhpb20udmVyc2lvbn0vYXhpb20tZG9tLSR7YXhpb20udmVyc2lvbn0uamFyIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29weSB0b2Rpcj0iLi9saWIiIGZpbGU9IiR7bTIubG9jYWwucmVwb30vb3JnL2FwYWNoZS93cy9jb21tb25zL2F4aW9tL2F4aW9tLWltcGwvJHtheGlvbS52ZXJzaW9ufS9heGlvbS1pbXBsLSR7YXhpb20udmVyc2lvbn0uamFyIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29weSB0b2Rpcj0iLi9saWIiIGZpbGU9IiR7bTIubG9jYWwucmVwb30vY29tbW9ucy1sb2dnaW5nL2NvbW1vbnMtbG9nZ2luZy8ke2NvbW1vbnMubG9nZ2luZy52ZXJzaW9ufS9jb21tb25zLWxvZ2dpbmctJHtjb21tb25zLmxvZ2dpbmcudmVyc2lvbn0uamFyIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29weSB0b2Rpcj0iLi9saWIiIGZpbGU9IiR7bTIubG9jYWwucmVwb30vb3JnL2FwYWNoZS9uZWV0aGkvbmVldGhpLyR7bmVldGhpLnZlcnNpb259L25lZXRoaS0ke25lZXRoaS52ZXJzaW9ufS5qYXIiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3B5IHRvZGlyPSIuL2xpYiIgZmlsZT0iJHttMi5sb2NhbC5yZXBvfS9vcmcvYXBhY2hlL2dlcm9uaW1vL3NwZWNzL2dlcm9uaW1vLXN0YXgtYXBpXzEuMF9zcGVjLyR7Z2Vyb25pbW8uc3BlYy5zdGF4LnZlcnNpb259L2dlcm9uaW1vLXN0YXgtYXBpXzEuMF9zcGVjLSR7Z2Vyb25pbW8uc3BlYy5zdGF4LnZlcnNpb259LmphciIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvcHkgdG9kaXI9Ii4vbGliIiBmaWxlPSIke20yLmxvY2FsLnJlcG99L29yZy9jb2RlaGF1cy93b29kc3RveC93c3R4LWFzbC8ke3N0YXguaW1wbC52ZXJzaW9ufS93c3R4LWFzbC0ke3N0YXguaW1wbC52ZXJzaW9ufS5qYXIiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3B5IHRvZGlyPSIuL2xpYiIgZmlsZT0iJHttMi5sb2NhbC5yZXBvfS9vcmcvYXBhY2hlL3htbGJlYW5zL3htbGJlYW5zLyR7eG1sYmVhbnMudmVyc2lvbn0veG1sYmVhbnMtJHt4bWxiZWFucy52ZXJzaW9ufS5qYXIiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3B5IHRvZGlyPSIuL2xpYiIgZmlsZT0iJHttMi5sb2NhbC5yZXBvfS9vcmcvYXBhY2hlL3dzL2NvbW1vbnMvc2NoZW1hL1htbFNjaGVtYS8ke3htbHNjaGVtYS52ZXJzaW9ufS9YbWxTY2hlbWEtJHt4bWxzY2hlbWEudmVyc2lvbn0uamFyIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29weSB0b2Rpcj0iLi9saWIiIGZpbGU9IiR7bTIubG9jYWwucmVwb30vbG9nNGovbG9nNGovJHtsb2c0ai52ZXJzaW9ufS9sb2c0ai0ke2xvZzRqLnZlcnNpb259LmphciIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvcHkgdG9kaXI9Ii4vbGliIiBmaWxlPSIke20yLmxvY2FsLnJlcG99L3dzZGw0ai93c2RsNGovJHt3c2RsNGoudmVyc2lvbn0vd3NkbDRqLSR7d3NkbDRqLnZlcnNpb259LmphciIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvcHkgdG9kaXI9Ii4vbGliIiBmaWxlPSIke20yLmxvY2FsLnJlcG99L29yZy9hcGFjaGUvd29kZW4vd29kZW4tYXBpLyR7d29kZW4udmVyc2lvbn0vd29kZW4tYXBpLSR7d29kZW4udmVyc2lvbn0uamFyIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29weSB0b2Rpcj0iLi9saWIiIGZpbGU9IiR7bTIubG9jYWwucmVwb30vY29tbW9ucy1jb2RlYy9jb21tb25zLWNvZGVjLyR7Y29tbW9ucy5jb2RlYy52ZXJzaW9ufS9jb21tb25zLWNvZGVjLSR7Y29tbW9ucy5jb2RlYy52ZXJzaW9ufS5qYXIiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3B5IHRvZGlyPSIuL2xpYiIgZmlsZT0iJHttMi5sb2NhbC5yZXBvfS9jb21tb25zLWh0dHBjbGllbnQvY29tbW9ucy1odHRwY2xpZW50LyR7Y29tbW9ucy5odHRwY2xpZW50LnZlcnNpb259L2NvbW1vbnMtaHR0cGNsaWVudC0ke2NvbW1vbnMuaHR0cGNsaWVudC52ZXJzaW9ufS5qYXIiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3B5IHRvZGlyPSIuL2xpYiIgZmlsZT0iJHttMi5sb2NhbC5yZXBvfS9vcmcvYXBhY2hlL2F4aXMyL2F4aXMyLyR7dmVyc2lvbn0vYXhpczItJHt2ZXJzaW9ufS5qYXIiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3B5IHRvZGlyPSIuL2xpYiIgZmlsZT0iJHttMi5sb2NhbC5yZXBvfS9vcmcvYXBhY2hlL2dlcm9uaW1vL3NwZWNzL2dlcm9uaW1vLWphdmFtYWlsXzEuNF9zcGVjLyR7Z2Vyb25pbW8uc3BlYy5qYXZhbWFpbC52ZXJzaW9ufS9nZXJvbmltby1qYXZhbWFpbF8xLjRfc3BlYy0ke2dlcm9uaW1vLnNwZWMuamF2YW1haWwudmVyc2lvbn0uamFyIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29weSB0b2Rpcj0iLi9saWIiIGZpbGU9IiR7bTIubG9jYWwucmVwb30vamF2YXgvbWFpbC9tYWlsLyR7amF2YXgubWFpbC52ZXJzaW9ufS9tYWlsLSR7amF2YXgubWFpbC52ZXJzaW9ufS5qYXIiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3B5IHRvZGlyPSIuL2xpYiIgZmlsZT0iJHttMi5sb2NhbC5yZXBvfS9vcmcvYXBhY2hlL2dlcm9uaW1vL3NwZWNzL2dlcm9uaW1vLXdzLW1ldGFkYXRhXzIuMF9zcGVjLyR7Z2Vyb25pbW8uc3BlYy5tZXRhZGF0YS52ZXJzaW9ufS9nZXJvbmltby13cy1tZXRhZGF0YV8yLjBfc3BlYy0ke2dlcm9uaW1vLnNwZWMubWV0YWRhdGEudmVyc2lvbn0uamFyIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1rZGlyIGRpcj0iLi9pY29ucyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29weSB0b2Rpcj0iLi9pY29ucyIgb3ZlcndyaXRlPSJ0cnVlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iLi4vY29uZi9jb2RlZ2VuL2ljb25zIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvcHk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3B5IHRvZGlyPSIuIiBmaWxlPSIuLi9jb25mL2NvZGVnZW4vYnVpbGQucHJvcGVydGllcyIgb3ZlcndyaXRlPSJ0cnVlIiBmaWx0ZXJpbmc9Im9uIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3B5IHRvZGlyPSIuIiBmaWxlPSIuLi9jb25mL2NvZGVnZW4vaGVscF90b2MueG1sIiBvdmVyd3JpdGU9InRydWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvcHkgdG9kaXI9Ii4iIGZpbGU9Ii4uL2NvbmYvY29kZWdlbi9wbHVnaW4ueG1sIiBvdmVyd3JpdGU9InRydWUiIGZpbHRlcmluZz0ib24iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvcHkgdG9kaXI9Ii4iIGZpbGU9Ii4uL2NvbmYvY29kZWdlbi8uY2xhc3NwYXRoIiBvdmVyd3JpdGU9InRydWUiIGZpbHRlcmluZz0ib24iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvcHkgdG9kaXI9Ii4iIGZpbGU9Ii4uL2NvbmYvY29kZWdlbi8ucHJvamVjdCIgb3ZlcndyaXRlPSJ0cnVlIiBmaWx0ZXJpbmc9Im9uIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3B5IHRvZGlyPSIuIiBmaWxlPSIuLi9jb25mL2NvZGVnZW4vcmVhZG1lLnR4dCIgb3ZlcndyaXRlPSJ0cnVlIi8+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVuemlwIHNyYz0iLi90YXJnZXQvYXhpczIuZWNsaXBzZS5jb2RlZ2VuLnBsdWdpbi0ke3BvbS52ZXJzaW9ufS5qYXIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0PSIuL3RhcmdldC9wbHVnaW4vJHtjb2RlZ2VuLnBsdWdpbi52ZXJzaW9ufSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIENvcHkgdG8gdGhlIHNhbWUgcG9zaXRpb24gd2l0aCB0aGUgZmlsdGVyaW5nIG9uLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3B5IHRvZGlyPSIuL3RhcmdldC9wbHVnaW4vJHtjb2RlZ2VuLnBsdWdpbi52ZXJzaW9ufSIgZmlsdGVyaW5nPSJvbiI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7Y29kZWdlbi5yZXNvdXJjZS5kaXJ9Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJwbHVnaW4ueG1sIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iYnVpbGQucHJvcGVydGllcyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IiR7cGx1Z2luLmNsYXNzcGF0aC5maWxlLm5hbWV9Ii8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29weT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBjb3B5IHRoZSBoZWxwIGRpcmVjdG9yeSAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1rZGlyIGRpcj0iLi90YXJnZXQvcGx1Z2luLyR7Y29kZWdlbi5wbHVnaW4udmVyc2lvbn0vJHtoZWxwLmRpci5uYW1lfSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWtkaXIgZGlyPSIuL3RhcmdldC9wbHVnaW4vJHtjb2RlZ2VuLnBsdWdpbi52ZXJzaW9ufS8ke2hlbHAuZGlyLm5hbWV9LyR7aWNvbnMuZGlyLm5hbWV9Ii8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3B5IHRvZGlyPSIuL3RhcmdldC9wbHVnaW4vJHtjb2RlZ2VuLnBsdWdpbi52ZXJzaW9ufS8ke2hlbHAuZGlyLm5hbWV9Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGZpbGU9IiR7Y29kZWdlbi5oZWxwLnJlc291cmNlLmZpbGV9Ii8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29weT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvcHkgdG9kaXI9Ii4vdGFyZ2V0L3BsdWdpbi8ke2NvZGVnZW4ucGx1Z2luLnZlcnNpb259LyR7aGVscC5kaXIubmFtZX0vJHtpY29ucy5kaXIubmFtZX0iPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke2NvZGVnZW4uaGVscC5pbWFnZXMuZGlyfSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvcHk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gY29weSB0aGUgIGljb25zLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxta2RpciBkaXI9Ii4vdGFyZ2V0L3BsdWdpbi8ke2NvZGVnZW4ucGx1Z2luLnZlcnNpb259LyR7aWNvbnMuZGlyLm5hbWV9Ii8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3B5IHRvZGlyPSIuL3RhcmdldC9wbHVnaW4vJHtjb2RlZ2VuLnBsdWdpbi52ZXJzaW9ufS8ke2ljb25zLmRpci5uYW1lfSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7Y29kZWdlbi5yZXNvdXJjZS5kaXJ9LyR7aWNvbnMuZGlyLm5hbWV9Ii8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29weT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBjb3B5IHRoZSBsaWIgZmlsZXMgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxta2RpciBkaXI9Ii4vdGFyZ2V0L3BsdWdpbi90ZW1wIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1bnppcCBzcmM9Ii4vdGFyZ2V0L2Rpc3QtYXhpczItZWNsaXBzZS1jb2RlZ2UtcGx1Z2luLnppcCIgZGVzdD0iLi90YXJnZXQvcGx1Z2luL3RlbXAiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1rZGlyIGRpcj0iLi90YXJnZXQvcGx1Z2luLyR7Y29kZWdlbi5wbHVnaW4udmVyc2lvbn0vbGliIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3B5IHRvZGlyPSIuL3RhcmdldC9wbHVnaW4vJHtjb2RlZ2VuLnBsdWdpbi52ZXJzaW9ufS9saWIiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIuL3RhcmdldC9wbHVnaW4vdGVtcC9saWIiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb3B5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVsZXRlIGRpcj0iLi90YXJnZXQvcGx1Z2luL3RlbXAiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBjb3B5IHRoZSBvdGhlciBwcm9qZWN0IGZpbGVzLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3B5IHRvZGlyPSIuL3RhcmdldC9wbHVnaW4vJHtjb2RlZ2VuLnBsdWdpbi52ZXJzaW9ufSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBmaWxlPSIke2NvZGVnZW4ucmVzb3VyY2UuZGlyfS8ke3BsdWdpbi5wcm9qZWN0LmZpbGUubmFtZX0iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGZpbGU9IiR7Y29kZWdlbi5yZXNvdXJjZS5kaXJ9LyR7cGx1Z2luLmhlbHAuZmlsZS5uYW1lfSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvcHk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gY29weSB0aGUgY2xhc3NlcyB0byBjbGFzc2VzIGRpcmVjdG9yeS0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWtkaXIgZGlyPSIuL3RhcmdldC9wbHVnaW4vJHtjb2RlZ2VuLnBsdWdpbi52ZXJzaW9ufS9jbGFzc2VzIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3B5IHRvZGlyPSIuL3RhcmdldC9wbHVnaW4vJHtjb2RlZ2VuLnBsdWdpbi52ZXJzaW9ufS9jbGFzc2VzIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iLi90YXJnZXQvcGx1Z2luLyR7Y29kZWdlbi5wbHVnaW4udmVyc2lvbn0iPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqL29yZy8qKiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvcHk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS1aaXAgdGhlIGNsYXNzZXMgdG8gYSBqYXIgZmlsZS0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8emlwIGRlc3RmaWxlPSIuL3RhcmdldC9wbHVnaW4vJHtjb2RlZ2VuLnBsdWdpbi52ZXJzaW9ufS8ke2NvZGVnZW4ucGx1Z2luLmphci5uYW1lfSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlZGlyPSIuL3RhcmdldC9wbHVnaW4vJHtjb2RlZ2VuLnBsdWdpbi52ZXJzaW9ufS9jbGFzc2VzIiB1cGRhdGU9InRydWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlbGV0ZSBkaXI9Ii4vdGFyZ2V0L3BsdWdpbi8ke2NvZGVnZW4ucGx1Z2luLnZlcnNpb259L2NsYXNzZXMiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLVppcCB0aGUgZWNsaXBzZSBwbHVnaW4gdG8gdGhlIHRhcmdldC9kaXN0IGRpcmVjdG9yeSAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHppcCBkZXN0ZmlsZT0iLi90YXJnZXQvZGlzdC8ke2NvZGVnZW4ucGx1Z2luLnppcC5uYW1lfSIgYmFzZWRpcj0iLi90YXJnZXQvcGx1Z2luIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVsZXRlIGRpcj0iLi90YXJnZXQvdGVtcCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVsZXRlIGRpcj0iLi90YXJnZXQvY2xhc3NlcyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVsZXRlIGRpcj0iLi90YXJnZXQvdGVzdC1jbGFzc2VzIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YXNrcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5ydW48L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvYnVpbGQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2UtY29kZWdlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvY29kZWdlbi9XU0RMMkphdmFHZW5lcmF0b3IuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1jb2RlZ2VuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9jb2RlZ2VuL1dTREwySmF2YUdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTY5NzBmLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1jb2RlZ2VuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9jb2RlZ2VuL1dTREwySmF2YUdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50b29sLmNvZGVnZW47Ci0KLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5XU0RMMTFUb0F4aXNTZXJ2aWNlQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuQ29tbWFuZExpbmVPcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLkNvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzOwotCi1pbXBvcnQgamF2YXgud3NkbC5XU0RMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLQotcHVibGljIGNsYXNzIFdTREwySmF2YUdlbmVyYXRvciB7Ci0gICAgCi0gICAgLyoqCi0gICAgICogTWFwcyBhIHN0cmluZyBjb250YWluaW5nIHRoZSBuYW1lIG9mIGEgbGFuZ3VhZ2UgdG8gYSBjb25zdGFudCBkZWZpbmVkIGluIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLkxhbmd1YWdlTmFtZXMKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gVUlMYW5nVmFsdWUgYSBzdHJpbmcgY29udGFpbmcgYSBsYW5ndWFnZSwgZS5nLiAiamF2YSIsICJjcyIsICJjcHAiIG9yICJ2YiIKLSAgICAgKiBAcmV0dXJuIGEgbm9ybWFsaXplZCBzdHJpbmcgY29uc3RhbnQKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBtYXBMYW5ndWFnZXNXaXRoQ29tYm8oU3RyaW5nIFVJTGFuZ1ZhbHVlKQotICAgIHsKLSAgICAgICByZXR1cm4gVUlMYW5nVmFsdWU7Ci0gICAgfQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBsaXN0IG9mIHBhcmFtZXRlcnMgZm9yIHRoZSBjb2RlIGdlbmVyYXRvciBiYXNlZCBvbiB0aGUgZGVjaXNpb25zIG1hZGUgYnkgdGhlIHVzZXIgb24gdGhlIE9wdGlvbnNQYWdlCi0gICAgICogKHBhZ2UyKS4gRm9yIGVhY2ggc2V0dGluZywgdGhlcmUgaXMgYSBDb21tYW5kLUxpbmUgb3B0aW9uIGZvciB0aGUgQXhpczIgY29kZSBnZW5lcmF0b3IuCi0gICAgICogCi0gICAgICogQHJldHVybiBhIE1hcCB3aXRoIGtleXMgZnJvbSBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cyB3aXRoIHRoZSB2YWx1ZXMgZW50ZXJlZCBieSB0aGUgdXNlciBvbiB0aGUgT3B0aW9ucyBQYWdlLgotICAgICAqLwotICAgIHB1YmxpYyBNYXAgZmlsbE9wdGlvbk1hcChib29sZWFuIGlzQXluY09ubHksCi0gICAgICAgICAgICAJCSAgYm9vbGVhbiBpc1N5bmNPbmx5LAotICAgICAgICAgICAgCQkgIGJvb2xlYW4gaXNTZXJ2ZXJTaWRlLAotICAgICAgICAgICAgCQkgIGJvb2xlYW4gaXNTZXJ2ZXJYTUwsCi0gICAgICAgICAgICAJCSAgYm9vbGVhbiBpc1Rlc3RDYXNlLAotICAgICAgICAgICAgCQkgIGJvb2xlYW4gaXNHZW5lcmF0ZUFsbCwKLSAgICAgICAgICAgIAkJICBTdHJpbmcgc2VydmljZU5hbWUsCi0gICAgICAgICAgICAJCSAgU3RyaW5nIHBvcnROYW1lLAotICAgICAgICAgICAgCQkgIFN0cmluZyBkYXRhYmluZGluZ05hbWUsCi0gICAgICAgICAgICAJCSAgU3RyaW5nIFdTRExVUkksCi0gICAgICAgICAgICAJCSAgU3RyaW5nIHBhY2thZ2VOYW1lLAotICAgICAgICAgICAgCQkgIFN0cmluZyBzZWxlY3RlZExhbmd1YWdlLAotICAgICAgICAgICAgCQkgIFN0cmluZyBvdXRwdXRMb2NhdGlvbiwKLSAgICAgICAgICAgIAkJICBTdHJpbmcgbmFtZXNwYWNlMnBhY2thZ2VMaXN0LAotICAgICAgICAgICAgCQkgIGJvb2xlYW4gaXNTZXJ2ZXJTaWRlSW50ZXJmYWNlLAotICAgICAgICAgICAgCQkgIEhhc2hNYXAgYWR2YW5jZU9wdGlvbnMKLSAgICAgICAgICAgIAkJICApCi0gICAgewotICAgICAgIE1hcCBvcHRpb25NYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgIC8vV1NETCBmaWxlIG5hbWUKLSAgICAgICBvcHRpb25NYXAucHV0KENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5XU0RMX0xPQ0FUSU9OX1VSSV9PUFRJT04sIG5ldyBDb21tYW5kTGluZU9wdGlvbigKLSAgICAJCSAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5XU0RMX0xPQ0FUSU9OX1VSSV9PUFRJT04sIGdldFN0cmluZ0FycmF5KFdTRExVUkkpKSk7Ci0gICAgICAgCi0gICAgICAgLy9Bc3luYyBvbmx5Ci0gICAgICAgaWYgKGlzQXluY09ubHkpCi0gICAgICAgewotICAgICAgICAgIG9wdGlvbk1hcC5wdXQoQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLkNPREVHRU5fQVNZTkNfT05MWV9PUFRJT04sIG5ldyBDb21tYW5kTGluZU9wdGlvbigKLSAgICAgICAgCQkgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5DT0RFR0VOX0FTWU5DX09OTFlfT1BUSU9OLCBuZXcgU3RyaW5nWzBdKSk7Ci0gICAgICAgfQotICAgICAgIC8vc3luYyBvbmx5Ci0gICAgICAgaWYgKGlzU3luY09ubHkpCi0gICAgICAgewotICAgICAgICAgIG9wdGlvbk1hcC5wdXQoQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLkNPREVHRU5fU1lOQ19PTkxZX09QVElPTiwgbmV3IENvbW1hbmRMaW5lT3B0aW9uKAotICAgICAgICAJCSAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLkNPREVHRU5fU1lOQ19PTkxZX09QVElPTiwgbmV3IFN0cmluZ1swXSkpOwotICAgICAgIH0KLSAgICAgICAvL3NlcnZlcnNpZGUKLSAgICAgICBpZiAoaXNTZXJ2ZXJTaWRlKQotICAgICAgIHsKLSAgICAgICAgICBvcHRpb25NYXAucHV0KENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5TRVJWRVJfU0lERV9DT0RFX09QVElPTiwgbmV3IENvbW1hbmRMaW5lT3B0aW9uKAotICAgICAgICAJCSAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLlNFUlZFUl9TSURFX0NPREVfT1BUSU9OLCBuZXcgU3RyaW5nWzBdKSk7Ci0gICAgICAgICAgLy9zZXJ2ZXIgeG1sCi0gICAgICAgICAgaWYgKGlzU2VydmVyWE1MKQotICAgICAgICAgIHsKLSAgICAgICAgICAgICBvcHRpb25NYXAucHV0KENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5HRU5FUkFURV9TRVJWSUNFX0RFU0NSSVBUSU9OX09QVElPTiwgbmV3IENvbW1hbmRMaW5lT3B0aW9uKAotICAgICAgICAgICAgCQkgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLkdFTkVSQVRFX1NFUlZJQ0VfREVTQ1JJUFRJT05fT1BUSU9OLCBuZXcgU3RyaW5nWzBdKSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChpc0dlbmVyYXRlQWxsKXsKLSAgICAgICAgICAgICAgb3B0aW9uTWFwLnB1dChDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuR0VORVJBVEVfQUxMX09QVElPTiwgbmV3IENvbW1hbmRMaW5lT3B0aW9uKAotICAgICAgICAgICAgCQkgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5HRU5FUkFURV9BTExfT1BUSU9OLCBuZXcgU3RyaW5nWzBdKSk7Ci0gICAgICAgICAgfQotICAgICAgIH0KLSAgICAgICAvL3Rlc3QgY2FzZQotICAgICAgIGlmIChpc1Rlc3RDYXNlKQotICAgICAgIHsKLSAgICAgICAgICBvcHRpb25NYXAucHV0KENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5HRU5FUkFURV9URVNUX0NBU0VfT1BUSU9OLCBuZXcgQ29tbWFuZExpbmVPcHRpb24oCi0gICAgICAgIAkJICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuR0VORVJBVEVfVEVTVF9DQVNFX09QVElPTiwgbmV3IFN0cmluZ1swXSkpOwotICAgICAgIH0KLSAgICAgICAvL3BhY2thZ2UgbmFtZQotICAgICAgIG9wdGlvbk1hcC5wdXQoQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLlBBQ0tBR0VfT1BUSU9OLCBuZXcgQ29tbWFuZExpbmVPcHRpb24oCi0gICAgCQkgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuUEFDS0FHRV9PUFRJT04sIGdldFN0cmluZ0FycmF5KHBhY2thZ2VOYW1lKSkpOwotICAgICAgIC8vc2VsZWN0ZWQgbGFuZ3VhZ2UKLSAgICAgICBvcHRpb25NYXAucHV0KENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5TVFVCX0xBTkdVQUdFX09QVElPTiwgbmV3IENvbW1hbmRMaW5lT3B0aW9uKAotICAgIAkJICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLlNUVUJfTEFOR1VBR0VfT1BUSU9OLCBnZXRTdHJpbmdBcnJheShtYXBMYW5ndWFnZXNXaXRoQ29tYm8oc2VsZWN0ZWRMYW5ndWFnZSkpKSk7Ci0gICAgICAgLy9vdXRwdXQgbG9jYXRpb24KLSAgICAgICBvcHRpb25NYXAucHV0KENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5PVVRQVVRfTE9DQVRJT05fT1BUSU9OLCBuZXcgQ29tbWFuZExpbmVPcHRpb24oCi0gICAgCQkgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuT1VUUFVUX0xPQ0FUSU9OX09QVElPTiwgZ2V0U3RyaW5nQXJyYXkob3V0cHV0TG9jYXRpb24pKSk7Ci0gICAgICAgCi0gICAgICAvL2RhdGFiaW5kaW5nCi0gICAgICAgb3B0aW9uTWFwLnB1dChDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuREFUQV9CSU5ESU5HX1RZUEVfT1BUSU9OLCBuZXcgQ29tbWFuZExpbmVPcHRpb24oCi0gICAgCQkgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuREFUQV9CSU5ESU5HX1RZUEVfT1BUSU9OLCBnZXRTdHJpbmdBcnJheShkYXRhYmluZGluZ05hbWUpKSk7Ci0gICAgICAgCi0gICAgICAgLy9wb3J0IG5hbWUKLSAgICAgICBpZiAocG9ydE5hbWUhPW51bGwpewotCSAgICAgICBvcHRpb25NYXAucHV0KENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5QT1JUX05BTUVfT1BUSU9OLCBuZXcgQ29tbWFuZExpbmVPcHRpb24oCi0JICAgIAkJICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLlBPUlRfTkFNRV9PUFRJT04sIGdldFN0cmluZ0FycmF5KHBvcnROYW1lKSkpOwotICAgICAgIH0KLSAgICAgICAvL3NlcnZpY2UgbmFtZQotICAgICAgIGlmIChzZXJ2aWNlTmFtZSE9IG51bGwpewotCSAgICAgICBvcHRpb25NYXAucHV0KENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5TRVJWSUNFX05BTUVfT1BUSU9OLCBuZXcgQ29tbWFuZExpbmVPcHRpb24oCi0JICAgIAkJICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLlNFUlZJQ0VfTkFNRV9PUFRJT04sIGdldFN0cmluZ0FycmF5KHNlcnZpY2VOYW1lKSkpOwotICAgICAgIH0KLSAgICAgICAvL25zMnBrZyBtYXBwaW5nCi0gICAgICAgaWYgKG5hbWVzcGFjZTJwYWNrYWdlTGlzdCE9IG51bGwpewotCSAgICAgICBvcHRpb25NYXAucHV0KENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5OQU1FX1NQQUNFX1RPX1BBQ0tBR0VfT1BUSU9OLCBuZXcgQ29tbWFuZExpbmVPcHRpb24oCi0JICAgIAkJICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLk5BTUVfU1BBQ0VfVE9fUEFDS0FHRV9PUFRJT04sIGdldFN0cmluZ0FycmF5KG5hbWVzcGFjZTJwYWNrYWdlTGlzdCkpKTsKLSAgICAgICB9Ci0gICAgICAgCi0gICAgICAgLy9zZXJ2ZXIgc2lkZSBpbnRlcmZhY2UgIG1hcHBpbmcKLSAgICAgICBpZiAoaXNTZXJ2ZXJTaWRlSW50ZXJmYWNlKXsKLQkgICAgICAgb3B0aW9uTWFwLnB1dChDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuU0VSVkVSX1NJREVfSU5URVJGQUNFX09QVElPTiwgbmV3IENvbW1hbmRMaW5lT3B0aW9uKAotCSAgICAJCSAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5TRVJWRVJfU0lERV9JTlRFUkZBQ0VfT1BUSU9OLCBuZXcgU3RyaW5nWzBdKSk7Ci0gICAgICAgfQotICAgICAgIAotICAgICAgIGlmIChhZHZhbmNlT3B0aW9ucyAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gYWR2YW5jZU9wdGlvbnMua2V5U2V0KCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlTdHJpbmcgdHlwZSA9IChTdHJpbmcpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlTdHJpbmdbXSBwYXJhbWV0ZXJzOwotCQkJCWlmIChhZHZhbmNlT3B0aW9ucy5nZXQodHlwZSkgPT0gbnVsbCkKLQkJCQkJcGFyYW1ldGVycyA9IG5ldyBTdHJpbmdbMF07Ci0JCQkJZWxzZQotCQkJCQlwYXJhbWV0ZXJzID0gKFN0cmluZ1tdKSBhZHZhbmNlT3B0aW9ucy5nZXQodHlwZSk7Ci0JCQkJb3B0aW9uTWFwLnB1dCh0eXBlLCBuZXcgQ29tbWFuZExpbmVPcHRpb24odHlwZSwgcGFyYW1ldGVycykpOwotCQkJfQotCQl9Ci0gICAgICAgcmV0dXJuIG9wdGlvbk1hcDsKLSAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyBnZXRCYXNlVXJpKFN0cmluZyB3c2RsVVJJKXsKLSAgICAJCi0gICAgCXRyeSB7Ci0JCQlVUkwgdXJsOwotCQkJaWYgKHdzZGxVUkkuaW5kZXhPZigiOi8vIik9PS0xKXsKLQkJCQl1cmwgPSBuZXcgVVJMKCJmaWxlIiwiIix3c2RsVVJJKTsKLQkJCX1lbHNlewotCQkJCXVybCA9IG5ldyBVUkwod3NkbFVSSSk7CQotCQkJfQotCi0JCQkKLQkJCVN0cmluZyBiYXNlVXJpOwotCQkJaWYgKCJmaWxlIi5lcXVhbHModXJsLmdldFByb3RvY29sKCkpKXsKLQkJCQliYXNlVXJpID0gbmV3IEZpbGUodXJsLmdldEZpbGUoKSkuZ2V0UGFyZW50RmlsZSgpLnRvVVJMKCkudG9FeHRlcm5hbEZvcm0oKTsKLQkJCX1lbHNlewotCQkJCWJhc2VVcmkgPSB1cmwudG9FeHRlcm5hbEZvcm0oKS5zdWJzdHJpbmcoMCwKLQkJCQkJCXVybC50b0V4dGVybmFsRm9ybSgpLmxhc3RJbmRleE9mKCIvIikKLQkJCQkpOwotCQkJfQotCQkKLQkJCQotCQkJcmV0dXJuIGJhc2VVcmk7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLQkJfQotICAgIH0KLSAgICAvKioKLSAgICAgKiBSZWFkcyB0aGUgV1NETCBPYmplY3QgTW9kZWwgZnJvbSB0aGUgZ2l2ZW4gbG9jYXRpb24uCi0gICAgICogCi0gICAgICogQHBhcmFtIHdzZGxVUkkgdGhlIGZpbGVzeXN0ZW0gbG9jYXRpb24gKGZ1bGwgcGF0aCkgb2YgdGhlIFdTREwgZmlsZSB0byByZWFkIGluLgotICAgICAqIEByZXR1cm4gdGhlIFdTRExEZXNjcmlwdGlvbiBvYmplY3QgY29udGFpbmluZyB0aGUgV1NETCBPYmplY3QgTW9kZWwgb2YgdGhlIGdpdmVuIFdTREwgZmlsZQotICAgICAqIEB0aHJvd3MgV1NETEV4Y2VwdGlvbiB3aGVuIFdTREwgRmlsZSBpcyBpbnZhbGlkCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBvbiBlcnJvcnMgcmVhZGluZyB0aGUgV1NETCBmaWxlCi0gICAgICovCi0gICAgcHVibGljIEF4aXNTZXJ2aWNlIGdldEF4aXNTZXJ2aWNlKFN0cmluZyB3c2RsVVJJKSB0aHJvd3MgRXhjZXB0aW9uewotICAgIAkKLSAgICAJCVVSTCB1cmw7Ci0JCQlpZiAod3NkbFVSSS5pbmRleE9mKCI6Ly8iKT09LTEpewotCQkJCXVybCA9IG5ldyBVUkwoImZpbGUiLCIiLHdzZGxVUkkpOwotCQkJfWVsc2V7Ci0JCQkJdXJsID0gbmV3IFVSTCh3c2RsVVJJKTsJCi0JCQl9Ci0KLQkgICAgLy8gVGhpcyBxdWljayBmaXggYXNzdW1lIHRoYXQgdGhlIHdzZGxVUkkgcG9pbnRzIHRvIGEgd3NkbCAxLjEgdmVyc2lvbi4KLQkJCS8vIEEgYmV0dGVyIGZpeCBzaG91bGQgYmUgdG8gZGV0ZXJtaW5lIHdoaWNoIGJ1aWxkZXIgdG8gdXNlIGJhc2VkIG9uIHRoZSB3c2RsIHZlcnNpb24uIAotCQkJLy8gVGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gb2YgdGhlIHdzZGwgYnVpbGRlciBjbGFzc2VzIGRpZCBub3QgYWxsb3cgZm9yIHRoaXMuIEkgd2lsbCBzdWdnZXN0Ci0JCQkvLyB0aGF0IHRoZSBkZXRlcm1pbmF0aW9uIG9mIHdoaWNoIGJ1aWxkZXIgdG8gdXNlIHNob3VsZCBiZSBkb25lIGluIHRoZSBidWlsZGVyIGNsYXNzZXMsIHByZWZlcmFibHkKLQkJCS8vIGluIHRoZSBwYXJlbnQgYnVpbGRlciBjbGFzcy4gCi0JCQkvLyBBY2Nlc3NhYmxlIHRocm91Z2ggYSBzdGF0aWMgcmVmZXJlbmNlIHRvIGEgbWV0aG9kIGxpa2UgZ2V0QnVpbGRlckluc3RhbmNlKFN0cmluZyB3c2RsVVJJKSBpbgotCQkJLy8gdGhlIHBhcmVudCBidWlsZGVyIGNsYXNzIG9yIHRocm91Z2ggYSBidWlsZGVyIEFic3RyYWN0IEZhY3RvciBvciBBYnN0cmFjdCBmYWN0b3J5IG1ldGhvZHMuCi0JCQkKLQkJCVdTREwxMVRvQXhpc1NlcnZpY2VCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgV1NETDExVG9BeGlzU2VydmljZUJ1aWxkZXIodXJsLm9wZW5Db25uZWN0aW9uKCkuZ2V0SW5wdXRTdHJlYW0oKSk7Ci0JCQkJCQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2V0IHRoZSBVUkkgb2YgdGhlIGJhc2UgZG9jdW1lbnQgZm9yIHRoZSBEZWZpbml0aW9uLgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHRoaXMgaXMgdGhlIFVSSSBvZiB0aGUgYmFzZSBkb2N1bWVudCwgbm90IHRoZSBpbXBvcnRzLgotICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5zZXREb2N1bWVudEJhc2VVcmkodXJsLnRvU3RyaW5nKCkpOwotCi0JCQlidWlsZGVyLnNldEJhc2VVcmkoZ2V0QmFzZVVyaSh3c2RsVVJJKSk7Ci0JCQlidWlsZGVyLnNldENvZGVnZW4odHJ1ZSk7Ci0JCQlyZXR1cm4gYnVpbGRlci5wb3B1bGF0ZVNlcnZpY2UoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyBhIHNpbmdsZSBTdHJpbmcgaW50byBhIFN0cmluZyBBcnJheQotICAgICAqIAotICAgICAqIEBwYXJhbSB2YWx1ZSBhIHNpbmdsZSBzdHJpbmcKLSAgICAgKiBAcmV0dXJuIGFuIGFycmF5IGNvbnRhaW5pbmcgb25seSBvbmUgZWxlbWVudAotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nW10gZ2V0U3RyaW5nQXJyYXkoU3RyaW5nIHZhbHVlKQotICAgIHsKLSAgICAgICBTdHJpbmdbXSB2YWx1ZXMgPSBuZXcgU3RyaW5nWzFdOwotICAgICAgIHZhbHVlc1swXSA9IHZhbHVlOwotICAgICAgIHJldHVybiB2YWx1ZXM7Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2UtY29kZWdlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvY29kZWdlbi9lY2xpcHNlL0NvZGVHZW5XaXphcmQuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1jb2RlZ2VuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9jb2RlZ2VuL2VjbGlwc2UvQ29kZUdlbldpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmZmNmZmLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1jb2RlZ2VuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9jb2RlZ2VuL2VjbGlwc2UvQ29kZUdlbldpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTg5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50b29sLmNvZGVnZW4uZWNsaXBzZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5qYXZhMndzZGwuSmF2YTJXU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbC5jb2RlZ2VuLldTREwySmF2YUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRvb2wuY29kZWdlbi5lY2xpcHNlLnBsdWdpbi5Db2RlZ2VuV2l6YXJkUGx1Z2luOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbC5jb2RlZ2VuLmVjbGlwc2UudWkuQWJzdHJhY3RXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbC5jb2RlZ2VuLmVjbGlwc2UudWkuSmF2YVNvdXJjZVNlbGVjdGlvblBhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29sLmNvZGVnZW4uZWNsaXBzZS51aS5KYXZhV1NETE9wdGlvbnNQYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbC5jb2RlZ2VuLmVjbGlwc2UudWkuSmF2YVdTRExPdXRwdXRMb2NhdGlvblBhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29sLmNvZGVnZW4uZWNsaXBzZS51aS5PcHRpb25zUGFnZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRvb2wuY29kZWdlbi5lY2xpcHNlLnVpLk91dHB1dFBhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29sLmNvZGVnZW4uZWNsaXBzZS51aS5Ub29sU2VsZWN0aW9uUGFnZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRvb2wuY29kZWdlbi5lY2xpcHNlLnVpLldTRExGaWxlU2VsZWN0aW9uUGFnZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRvb2wuY29kZWdlbi5lY2xpcHNlLnV0aWwuU2V0dGluZ3NDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29sLmNvZGVnZW4uZWNsaXBzZS51dGlsLlVJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbC5jb2RlZ2VuLmVjbGlwc2UudXRpbC5XU0RMUHJvcGVydHlSZWFkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29sLmNvcmUuSmFyRmlsZVdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRvb2wuY29yZS5TcmNDb21waWxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5Db2RlR2VuQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5Db2RlR2VuZXJhdGlvbkVuZ2luZTsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmphdmEyd3NkbC5KYXZhMldTRExDb2RlZ2VuRW5naW5lOwotaW1wb3J0IG9yZy5hcGFjaGUud3MuamF2YTJ3c2RsLnV0aWxzLkphdmEyV1NETENvbW1hbmRMaW5lT3B0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklOZXdXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uOwotCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBUaGUgbWFpbiB3aXphcmQgZm9yIHRoZSBjb2RlZ2VuIHdpemFyZAotICovCi0KLXB1YmxpYyBjbGFzcyBDb2RlR2VuV2l6YXJkIGV4dGVuZHMgV2l6YXJkIGltcGxlbWVudHMgSU5ld1dpemFyZCwgSmF2YTJXU0RMQ29uc3RhbnRzIHsKLSAgICBwcml2YXRlIFRvb2xTZWxlY3Rpb25QYWdlIHRvb2xTZWxlY3Rpb25QYWdlOwotICAgIAotICAgIHByaXZhdGUgV1NETEZpbGVTZWxlY3Rpb25QYWdlIHdzZGxTZWxlY3Rpb25QYWdlOwotCi0gICAgcHJpdmF0ZSBPcHRpb25zUGFnZSBvcHRpb25zUGFnZTsKLQotICAgIHByaXZhdGUgT3V0cHV0UGFnZSBvdXRwdXRQYWdlOwotCi0gICAgcHJpdmF0ZSBKYXZhV1NETE9wdGlvbnNQYWdlIGphdmEyd3NkbE9wdGlvbnNQYWdlOwotCi0gICAgcHJpdmF0ZSBKYXZhU291cmNlU2VsZWN0aW9uUGFnZSBqYXZhU291cmNlU2VsZWN0aW9uUGFnZTsKLQotICAgIHByaXZhdGUgSmF2YVdTRExPdXRwdXRMb2NhdGlvblBhZ2UgamF2YTJ3c2RsT3V0cHV0TG9jYXRpb25QYWdlOwotCi0gICAgcHJpdmF0ZSBpbnQgc2VsZWN0ZWRXaXphcmRUeXBlID0gU2V0dGluZ3NDb25zdGFudHMuV1NETF8yX0pBVkFfVFlQRTsvL1RPRE8gY2hhbmdlIHRoaXMKLQotICAgIHByaXZhdGUgaW50IHNlbGVjdGVkQ29kZWdlbk9wdGlvblR5cGUgPSBTZXR0aW5nc0NvbnN0YW50cy5DT0RFR0VOX0RFRkFVTFRfVFlQRTsvL1RPRE8gY2hhbmdlIHRoaXMKLSAgICAKLQotICAgCi0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgQ29kZUdlbldpemFyZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ29kZUdlbldpemFyZCgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgc2V0TmVlZHNQcm9ncmVzc01vbml0b3IodHJ1ZSk7Ci0gICAgICAgIHRoaXMKLSAgICAgICAgICAgICAgICAuc2V0V2luZG93VGl0bGUob3JnLmFwYWNoZS5heGlzMi50b29sLmNvZGVnZW4uZWNsaXBzZS5wbHVnaW4uQ29kZWdlbldpemFyZFBsdWdpbgotICAgICAgICAgICAgICAgICAgICAgICAgLmdldFJlc291cmNlU3RyaW5nKCJnZW5lcmFsLm5hbWUiKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkaW5nIHRoZSBwYWdlIHRvIHRoZSB3aXphcmQuCi0gICAgICovCi0KLSAgICBwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKLSAgICAgICAgdG9vbFNlbGVjdGlvblBhZ2UgPSBuZXcgVG9vbFNlbGVjdGlvblBhZ2UoKTsKLSAgICAgICAgYWRkUGFnZSh0b29sU2VsZWN0aW9uUGFnZSk7Ci0KLSAgICAgICAgLy9hZGQgdGhlIHdzZGwyamF2YSB3aXphcmQgcGFnZXMKLSAgICAgICAgd3NkbFNlbGVjdGlvblBhZ2UgPSBuZXcgV1NETEZpbGVTZWxlY3Rpb25QYWdlKCk7Ci0gICAgICAgIGFkZFBhZ2Uod3NkbFNlbGVjdGlvblBhZ2UpOwotICAgICAgICAKLSAgICAgICAgb3B0aW9uc1BhZ2UgPSBuZXcgT3B0aW9uc1BhZ2UoKTsKLSAgICAgICAgYWRkUGFnZShvcHRpb25zUGFnZSk7Ci0gICAgICAgIG91dHB1dFBhZ2UgPSBuZXcgT3V0cHV0UGFnZSgpOwotICAgICAgICBhZGRQYWdlKG91dHB1dFBhZ2UpOwotCi0gICAgICAgIC8vYWRkIGphdmEyd3NkbCB3aXphcmQgcGFnZXMKLSAgICAgICAgamF2YVNvdXJjZVNlbGVjdGlvblBhZ2UgPSBuZXcgSmF2YVNvdXJjZVNlbGVjdGlvblBhZ2UoKTsKLSAgICAgICAgYWRkUGFnZShqYXZhU291cmNlU2VsZWN0aW9uUGFnZSk7Ci0gICAgICAgIGphdmEyd3NkbE9wdGlvbnNQYWdlID0gbmV3IEphdmFXU0RMT3B0aW9uc1BhZ2UoKTsKLSAgICAgICAgYWRkUGFnZShqYXZhMndzZGxPcHRpb25zUGFnZSk7Ci0gICAgICAgIGphdmEyd3NkbE91dHB1dExvY2F0aW9uUGFnZSA9IG5ldyBKYXZhV1NETE91dHB1dExvY2F0aW9uUGFnZSgpOwotICAgICAgICBhZGRQYWdlKGphdmEyd3NkbE91dHB1dExvY2F0aW9uUGFnZSk7Ci0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkI2NhbkZpbmlzaCgpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gY2FuRmluaXNoKCkgewotICAgICAgICBJV2l6YXJkUGFnZVtdIHBhZ2VzID0gZ2V0UGFnZXMoKTsKLSAgICAgICAgQWJzdHJhY3RXaXphcmRQYWdlIHdpemFyZFBhZ2UgPSBudWxsOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhZ2VzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICB3aXphcmRQYWdlID0gKEFic3RyYWN0V2l6YXJkUGFnZSkgcGFnZXNbaV07Ci0gICAgICAgICAgICBpZiAod2l6YXJkUGFnZS5nZXRQYWdlVHlwZSgpID09IHRoaXMuc2VsZWN0ZWRXaXphcmRUeXBlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCEod2l6YXJkUGFnZS5pc1BhZ2VDb21wbGV0ZSgpKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBJV2l6YXJkUGFnZSBnZXROZXh0UGFnZShJV2l6YXJkUGFnZSBwYWdlKSB7Ci0gICAgICAgIEFic3RyYWN0V2l6YXJkUGFnZSBjdXJyZW50UGFnZSA9IChBYnN0cmFjdFdpemFyZFBhZ2UpIHBhZ2U7Ci0gICAgICAgIEFic3RyYWN0V2l6YXJkUGFnZSBwYWdlb3V0ID0gKEFic3RyYWN0V2l6YXJkUGFnZSkgc3VwZXIKLSAgICAgICAgICAgICAgICAuZ2V0TmV4dFBhZ2UocGFnZSk7Ci0KLSAgICAgICAgd2hpbGUgKHBhZ2VvdXQgIT0gbnVsbCAmJiBzZWxlY3RlZFdpemFyZFR5cGUgIT0gcGFnZW91dC5nZXRQYWdlVHlwZSgpKSB7Ci0gICAgICAgICAgICBBYnN0cmFjdFdpemFyZFBhZ2UgdGVtcCA9IHBhZ2VvdXQ7Ci0gICAgICAgICAgICBwYWdlb3V0ID0gKEFic3RyYWN0V2l6YXJkUGFnZSkgc3VwZXIuZ2V0TmV4dFBhZ2UoY3VycmVudFBhZ2UpOwotICAgICAgICAgICAgY3VycmVudFBhZ2UgPSB0ZW1wOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwYWdlb3V0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuICdGaW5pc2gnIGJ1dHRvbiBpcyBwcmVzc2VkIGluIHRoZSB3aXphcmQuIFdlCi0gICAgICogd2lsbCBjcmVhdGUgYW4gb3BlcmF0aW9uIGFuZCBydW4gaXQgdXNpbmcgd2l6YXJkIGFzIGV4ZWN1dGlvbiBjb250ZXh0LgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKHNlbGVjdGVkV2l6YXJkVHlwZSkgewotICAgICAgICAgICAgY2FzZSBTZXR0aW5nc0NvbnN0YW50cy5XU0RMXzJfSkFWQV9UWVBFOgotICAgICAgICAgICAgICAgIGRvRmluaXNoV1NETDJKYXZhKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFNldHRpbmdzQ29uc3RhbnRzLkpBVkFfMl9XU0RMX1RZUEU6Ci0gICAgICAgICAgICAgICAgZG9GaW5pc2hKYXZhMldTREwoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgU2V0dGluZ3NDb25zdGFudHMuVU5TUEVDSUZJRURfVFlQRToKLSAgICAgICAgICAgICAgICBicmVhazsgLy9EbyBub3RoaW5nCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKENvZGVnZW5XaXphcmRQbHVnaW4uCi0gICAgICAgICAgICAgICAgCQlnZXRSZXNvdXJjZVN0cmluZygiZ2VuZXJhbC5pbnZhbGlkLnN0YXRlIikpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTWVzc2FnZURpYWxvZy5vcGVuRXJyb3IoZ2V0U2hlbGwoKSwgCi0gICAgICAgICAgICAgICAgICAgIENvZGVnZW5XaXphcmRQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoImdlbmVyYWwuRXJyb3IiKSwgCi0gICAgICAgICAgICAgICAgICAgIENvZGVnZW5XaXphcmRQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoImdlbmVyYWwuRXJyb3IucHJlZml4IikgKwotICAgICAgICAgICAgICAgICAgICBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgTWVzc2FnZURpYWxvZy5vcGVuSW5mb3JtYXRpb24odGhpcy5nZXRTaGVsbCgpLCAKLSAgICAgICAgICAgICAgICAgQ29kZWdlbldpemFyZFBsdWdpbgotICAgICAgICAgICAgICAgIC5nZXRSZXNvdXJjZVN0cmluZygiZ2VuZXJhbC5uYW1lIiksIENvZGVnZW5XaXphcmRQbHVnaW4KLSAgICAgICAgICAgICAgICAuZ2V0UmVzb3VyY2VTdHJpbmcoIndpemFyZC5zdWNjZXNzIikpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgd29ya2VyIG1ldGhvZCwgZ2VuZXJhdGVzIHRoZSBjb2RlIGl0c2VsZi4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgZG9GaW5pc2hXU0RMMkphdmEoKSB7Ci0gICAgICAgIFdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbiBvcCA9IG5ldyBXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24oKQotICAgICAgICB7Ci0gICAgICAgICAgIHByb3RlY3RlZCB2b2lkIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotICAgICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb257Ci0gICAgICAgICAgICAgIGlmIChtb25pdG9yID09IG51bGwpCi0gICAgICAgICAgICAgICAgIG1vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCi0gICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAqICIzIiBpcyB0aGUgdG90YWwgYW1vdW50IG9mIHN0ZXBzLCBzZWUgYmVsb3cgbW9uaXRvci53b3JrZWQoYW1vdW50KQotICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgbW9uaXRvci5iZWdpblRhc2soQ29kZWdlbldpemFyZFBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiZ2VuZXJhdG9yLmdlbmVyYXRpbmciKSwgMyk7Ci0KLSAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICogVE9ETzogSW50cm9kdWNlIGEgcHJvZ3Jlc3MgbW9uaXRvciBpbnRlcmZhY2UgZm9yIENvZGVHZW5lcmF0aW9uRW5naW5lLgotICAgICAgICAgICAgICAgICAgKiBTaW5jZSB0aGlzIG1vbml0b3IgaGVyZSBkb2Vzbid0IG1ha2UgbXVjaCBzZW5zZSwgd2UKLSAgICAgICAgICAgICAgICAgICogc2hvdWxkIGVpdGhlciByZW1vdmUgdGhlIHByb2dyZXNzIG1vbml0b3IgZnJvbSB0aGUgQ29kZUdlbldpemFyZCwKLSAgICAgICAgICAgICAgICAgICogb3IgZ2l2ZSBhIChjdXN0b20pIHByb2dyZXNzIG1vbml0b3IgdG8gdGhlIGdlbmVyYXRlKCkgbWV0aG9kLCBzbwotICAgICAgICAgICAgICAgICAgKiB3ZSB3aWxsIGJlIGluZm9ybWVkIGJ5IEF4aXMyIGFib3V0IHRoZSBwcm9ncmVzcyBvZiBjb2RlIGdlbmVyYXRpb24uICAKLSAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgIFdTREwySmF2YUdlbmVyYXRvciBnZW5lcmF0b3IgPSBuZXcgV1NETDJKYXZhR2VuZXJhdG9yKCk7IAotICAgICAgICAgICAgICAgICBtb25pdG9yLnN1YlRhc2soQ29kZWdlbldpemFyZFBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiZ2VuZXJhdG9yLnJlYWRpbmdXT00iKSk7Ci0gICAgICAgICAgICAgICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2UgPSBnZW5lcmF0b3IuZ2V0QXhpc1NlcnZpY2Uod3NkbFNlbGVjdGlvblBhZ2UuZ2V0RmlsZU5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgIG1vbml0b3Iud29ya2VkKDEpOwotICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgLy9UaGUgZ2VuZXJhdGUgYWxsIGZpeCAoQXhpczItMTg2MikKLSAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc1NlcnZlcnNpZGUsaXNTZXJ2aWNlWE1MLGlzR2VuZXJhdGVTZXJ2ZXJTaWRlSW50ZXJmYWNlICA9IGZhbHNlOwotICAgICAgICAgICAgICAgICBpZiAob3B0aW9uc1BhZ2UuZ2V0R2VuZXJhdGVBbGwoKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgaXNTZXJ2ZXJzaWRlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICBpc1NlcnZpY2VYTUwgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgIGlzR2VuZXJhdGVTZXJ2ZXJTaWRlSW50ZXJmYWNlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgaXNTZXJ2ZXJzaWRlID0gb3B0aW9uc1BhZ2UuaXNTZXJ2ZXJzaWRlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgaXNTZXJ2aWNlWE1MID1vcHRpb25zUGFnZS5pc1NlcnZlclhNTCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgIGlzR2VuZXJhdGVTZXJ2ZXJTaWRlSW50ZXJmYWNlID0gb3B0aW9uc1BhZ2UuZ2V0R2VuZXJhdGVTZXJ2ZXJTaWRlSW50ZXJmYWNlKCk7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgTWFwIG9wdGlvbnNNYXAgPSBnZW5lcmF0b3IuZmlsbE9wdGlvbk1hcChvcHRpb25zUGFnZS5pc0FzeW5jT25seU9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zUGFnZS5pc1N5bmNPbmx5T24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU2VydmVyc2lkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU2VydmljZVhNTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnNQYWdlLmlzR2VuZXJhdGVUZXN0Q2FzZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uc1BhZ2UuZ2V0R2VuZXJhdGVBbGwoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnNQYWdlLmdldFNlcnZpY2VOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zUGFnZS5nZXRQb3J0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uc1BhZ2UuZ2V0RGF0YWJpbmRlck5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzZGxTZWxlY3Rpb25QYWdlLmdldEZpbGVOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zUGFnZS5nZXRQYWNrYWdlTmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uc1BhZ2UuZ2V0U2VsZWN0ZWRMYW5ndWFnZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UGFnZS5nZXRPdXRwdXRMb2NhdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uc1BhZ2UuZ2V0TnMyUGtnTWFwcGluZygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNHZW5lcmF0ZVNlcnZlclNpZGVJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zUGFnZS5nZXRBZHZhbmNlT3B0aW9ucygpKTsKLQotICAgICAgICAgICAgICAgICAvL0ZpeCBmb3IgdGhlIENvZGVHZW5Db25maWd1cmF0aW9uIENvbnRydWN0b3IgQ2hhbmdlCi0gICAgICAgICAgICAgICAgIC8vQ29kZUdlbkNvbmZpZ3VyYXRpb24gY29kZWdlbkNvbmZpZyA9IG5ldyBDb2RlR2VuQ29uZmlndXJhdGlvbihzZXJ2aWNlLCBvcHRpb25zTWFwKTsKLSAgICAgICAgICAgICAgICAgQ29kZUdlbkNvbmZpZ3VyYXRpb24gY29kZWdlbkNvbmZpZyA9IG5ldyBDb2RlR2VuQ29uZmlndXJhdGlvbihvcHRpb25zTWFwKTsKLSAgICAgICAgICAgICAgICAgY29kZWdlbkNvbmZpZy5hZGRBeGlzU2VydmljZShzZXJ2aWNlKTsKLSAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgIC8vc2V0IHRoZSB3c2RsIGRlZmluaXNpb24gZm9yIGNvZGVnZW4gY29uZmlnIGZvciBza2VsZXRvbiBnZW5lcmFyaW9uLgotICAgICAgICAgICAgICAgICBXU0RMUHJvcGVydHlSZWFkZXIgcmVhZGVyID0gbmV3IFdTRExQcm9wZXJ0eVJlYWRlcigpOwotICAgICAgICAgICAgICAgICByZWFkZXIucmVhZFdTREwod3NkbFNlbGVjdGlvblBhZ2UuZ2V0RmlsZU5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgIERlZmluaXRpb24gd3NkbERlZmluaXRpb24gPSByZWFkZXIuZ2V0V3NkbERlZmluaXRpb24oKTsKLSAgICAgICAgICAgICAgICAgY29kZWdlbkNvbmZpZy5zZXRXc2RsRGVmaW5pdGlvbih3c2RsRGVmaW5pdGlvbik7Ci0gICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAvL3NldCB0aGUgYmFzZVVSSQotICAgICAgICAgICAgICAgICBjb2RlZ2VuQ29uZmlnLnNldEJhc2VVUkkoZ2VuZXJhdG9yLmdldEJhc2VVcmkod3NkbFNlbGVjdGlvblBhZ2UuZ2V0RmlsZU5hbWUoKSkpOwotICAgICAgICAgICAgICAgICBtb25pdG9yLndvcmtlZCgxKTsKLSAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgIG1vbml0b3Iuc3ViVGFzayhDb2RlZ2VuV2l6YXJkUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJnZW5lcmF0b3IuZ2VuZXJhdGluZyIpKTsKLSAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgIG5ldyBDb2RlR2VuZXJhdGlvbkVuZ2luZShjb2RlZ2VuQ29uZmlnKS5nZW5lcmF0ZSgpOwotICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgLy9UT0RPIHJlZnJlc2ggdGhlIGVjbGlwc2UgcHJvamVjdCBzcGFjZSB0byBzaG93IHRoZSBnZW5lcmF0ZWQgZmlsZXMKLSAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgIC8vQWRkIHRoZSBjb2RlZ2VuIGxpYnMgdGhhdCBhcmUgY29taW5nIHdpdGggdGhlIHBsdWdpbiB0byB0aGUgcHJvamVjdCBsaWIgdGhhdCBoYXMgYmVlbiBjcmVhdGVkCi0gICAgICAgICAgICAgICAgIGlmIChvdXRwdXRQYWdlLmdldEF4aXMyUGx1Z2luTGliQ29weUNoZWNrQm94U2VsZWN0aW9uKCkpeyAKLSAgICAgICAgICAgICAgICAJIFN0cmluZyBlY2xpcHNlSG9tZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5kaXIiKTsKLSAgICAgICAgICAgICAgICAJIFN0cmluZyBwbHVnaW5MaWJMb2NhdGlvbiA9IGVjbGlwc2VIb21lK0ZpbGUuc2VwYXJhdG9yK1VJQ29uc3RhbnRzLlBMVUdJTlMrCi0JCQkJCQkJCQkJCUZpbGUuc2VwYXJhdG9yK1VJQ29uc3RhbnRzLkFYSVNfQ09ERUdFTl9QTFVHSU5fRk9MREVSKwotCQkJCQkJCQkJCQlGaWxlLnNlcGFyYXRvcitVSUNvbnN0YW50cy5MSUI7Ci0gICAgICAgICAgICAgICAgCSBhZGRMaWJzVG9Qcm9qZWN0TGliKHBsdWdpbkxpYkxvY2F0aW9uLCBvdXRwdXRQYWdlLmdldE91dHB1dExvY2F0aW9uKCkpOwotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAvL0Fsc28gYW5vdGhlciByZXF1aXJlbWVudCBhcmlzZXMgCi0gICAgICAgICAgICAgICAgIC8vSWYgdGhlIGNvZGVnZW4gcHJvamVjdCB3YXMgbmV3bHkgYnVpZGVkIHByb2plY3Qgb3IgZWxzZSB0aGUgZWNsaXBzZQotICAgICAgICAgICAgICAgICAvL3Byb2plY3QgaW50ZW5kZWQgdG8gc2F2ZSB0aGlzIGdlbmVyYXRlZCBjb2RlIGRvZXMgbm90IGhhdmUgdGhlIHJlcXVpcmVkIGxpYnMKLSAgICAgICAgICAgICAgICAgLy90byBjb21waWxlIHRoZSBnZW5lcmF0ZWQgY29kZS4gV2UgbmVlZCB0byBhZGQgdGhlIHJlbGV2ZW50IGxpYnMgdG8gYSBsaWIgZGlyZWN0b3J5IAotICAgICAgICAgICAgICAgICAvL29mIHRoZSA8Y29kZT5vdXRwdXRQYWdlLmdldE91dHB1dExvY2F0aW9uKCk8L2NvZGU+Ci0gICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAvL0FkZCB0aGUgbGlicmFyaWVzIG9uIHRoZSBwbHVnaW4gbGliIGRpcmVjdG9yeSB0byB0aGUgY3JlYXRlZCBwcm9qZWN0IGxpYgotICAgICAgICAgICAgICAgICBpZiAob3V0cHV0UGFnZS5nZXRBeGlzTGliQ29weUNoZWNrQm94U2VsZWN0aW9uKCkgJiYgb3V0cHV0UGFnZS5va3RvTG9hZExpYnMoKSl7Ci0vLyAgICAgICAgICAgICAgICAJIFN0cmluZyBsaWJEaXJlY3RvcnkgPSBvdXRwdXRQYWdlLmdldEF4aXNIb21lTG9jYXRpb24oKStGaWxlLnNlcGFyYXRvcisKLS8vICAgICAgICAgICAgICAgIAkgCQkJCQkgICBVSUNvbnN0YW50cy5UQVJHRVQrRmlsZS5zZXBhcmF0b3IrVUlDb25zdGFudHMuTElCOwotICAgICAgICAgICAgICAgIAkgU3RyaW5nIGxpYkRpcmVjdG9yeSA9IG91dHB1dFBhZ2UuZ2V0QXhpc0phcnNMb2NhdGlvbigpOwotICAgICAgICAgICAgICAgIAkgYWRkTGlic1RvUHJvamVjdExpYihsaWJEaXJlY3RvcnksIG91dHB1dFBhZ2UuZ2V0T3V0cHV0TG9jYXRpb24oKSk7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgIC8vVGhpcyB3aWxsIENyZWF0ZSBhIGphciBmaWxlIGZyb20gdGhlIGNvZGVnZW4gcmVzdWx0cyBhbmQgYWRkIHRvIHRoZSBvdXRwdXQgCi0gICAgICAgICAgICAgICAgIC8vbG9jYXRpb25zIGxpYiBkaXJlY3RvcnkKLSAgICAgICAgICAgICAgICAgaWYgKG91dHB1dFBhZ2UuZ2V0Q3JlYXRlSmFyQ2hlY2tCb3hTZWxlY3Rpb24oKSl7Ci0gICAgICAgICAgICAgICAgCSBJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLSAgICAgICAgICAgICAgICAJIFN0cmluZyB0ZW1wQ29kZWdlbkxvY2F0aW9uID0gIHdvcmtzcGFjZS5nZXRSb290KCkuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpK0ZpbGUuc2VwYXJhdG9yKyJjb2RlZ2VuIjsKLSAgICAgICAgICAgICAgICAJIFN0cmluZyB0ZW1wUHJvamVjdFNyY0xvY2F0aW9uID0gdGVtcENvZGVnZW5Mb2NhdGlvbitGaWxlLnNlcGFyYXRvcisiY29kZWdlbl90ZW1wX3NyY18iKwotICAgICAgICAgICAgICAgIAkgCQkJCQkJCQkgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICAgICAgCSBTdHJpbmcgdGVtcFByb2plY3RDbGFzc0xvY2F0aW9uID0gdGVtcENvZGVnZW5Mb2NhdGlvbitGaWxlLnNlcGFyYXRvcisiY29kZWdlbl90ZW1wX2NsYXNzXyIrCi0gICAgICAgICAgICAgICAgCSAJCQkJCQkJICAgICAgIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICAgICAgICAgIAkgRmlsZSB0ZW1wQ29kZWdlbkZpbGUgPSBuZXcgRmlsZSh0ZW1wQ29kZWdlbkxvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICAJIEZpbGUgdGVtcFNyY0ZpbGUgPSBuZXcgRmlsZSh0ZW1wUHJvamVjdFNyY0xvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICAJIEZpbGUgdGVtcENsYXNzRmlsZSA9IG5ldyBGaWxlKHRlbXBQcm9qZWN0Q2xhc3NMb2NhdGlvbik7Ci0gICAgICAgICAgICAgICAgCSB0ZW1wQ29kZWdlbkZpbGUubWtkaXIoKTsKLSAgICAgICAgICAgICAgICAJIHRlbXBTcmNGaWxlLm1rZGlyKCk7Ci0gICAgICAgICAgICAgICAgCSB0ZW1wQ2xhc3NGaWxlLm1rZGlyKCk7Ci0gICAgICAgICAgICAgICAgCSBjb3B5RGlyZWN0b3J5KG5ldyBGaWxlKG91dHB1dFBhZ2UuZ2V0T3V0cHV0TG9jYXRpb24oKSksIHRlbXBTcmNGaWxlKTsKLSAgICAgICAgICAgICAgICAJIC8vQ29tcGlsZSB0aGUgc291cmNlIHRvIGFub3RoZXIgZGlyZWN0b3J5IAotICAgICAgICAgICAgICAgIAkgU3JjQ29tcGlsZXIgc3JjQ29tcGlsZVRvb2wgPSBuZXcgU3JjQ29tcGlsZXIoKTsKLSAgICAgICAgICAgICAgICAJIHNyY0NvbXBpbGVUb29sLmNvbXBpbGVTb3VyY2UodGVtcENsYXNzRmlsZSwgdGVtcFByb2plY3RTcmNMb2NhdGlvbik7Ci0gICAgICAgICAgICAgICAgCSAvL2NyZWF0ZSB0aGUgamFyIGZpbGUgYW5kIGFkZCB0aGF0IHRvIHRoZSBsaWIgZGlyZWN0b3J5Ci0gICAgICAgICAgICAgICAgCSBTdHJpbmcgcHJvamVjdExpYiA9IG91dHB1dFBhZ2UuZ2V0T3V0cHV0TG9jYXRpb24oKStGaWxlLnNlcGFyYXRvcisibGliIjsKLSAgICAgICAgICAgICAgICAJIEphckZpbGVXcml0ZXIgamFyRmlsZVdyaXRlciA9IG5ldyBKYXJGaWxlV3JpdGVyKCk7Ci0gICAgICAgICAgICAgICAgCSBTdHJpbmcgamFyRmlsZU5hbWUgPSAiQ29kZWdlblJlc3VsdHMuamFyIjsKLSAgICAgICAgICAgICAgICAJIGlmICghb3V0cHV0UGFnZS5nZXRKYXJGaWxlbmFtZSgpLmVxdWFscygiIikpewotICAgICAgICAgICAgICAgIAkJIGphckZpbGVOYW1lPW91dHB1dFBhZ2UuZ2V0SmFyRmlsZW5hbWUoKTsKLSAgICAgICAgICAgICAgICAJIH0KLSAgICAgICAgICAgICAgICAJIG91dHB1dFBhZ2Uuc2V0SmFyRmlsZU5hbWUoamFyRmlsZU5hbWUpOwotICAgICAgICAgICAgICAgIAkgamFyRmlsZVdyaXRlci53cml0ZUphckZpbGUobmV3IEZpbGUocHJvamVjdExpYiksIGphckZpbGVOYW1lLCB0ZW1wQ2xhc3NGaWxlKTsKLSAgICAgICAgICAgICAgICAJIAotICAgICAgICAgICAgICAgIAkgLy9EZWxldGUgdGhlIHRlbXAgZm9sZGVycwotICAgICAgICAgICAgICAgIAkgZGVsZXRlRGlyKHRlbXBDb2RlZ2VuRmlsZSk7Ci0KLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgIG1vbml0b3Iud29ya2VkKDEpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgICAgICAgICAJICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgCSAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAKLSAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludGVycnVwdGVkRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIG1vbml0b3IuZG9uZSgpOwotICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0KLQotICAgICAgICAvKgotICAgICAgICAgKiBTdGFydCB0aGUgZ2VuZXJhdGlvbiBhcyBuZXcgV29ya2JlbmNoIE9wZXJhdGlvbiwgc28gdGhlIHVzZXIKLSAgICAgICAgICogY2FuIHNlZSB0aGUgcHJvZ3Jlc3MgYW5kLCBpZiBuZWVkZWQsIGNhbiBzdG9wIHRoZSBvcGVyYXRpb24uCi0gICAgICAgICAqLwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICBnZXRDb250YWluZXIoKS5ydW4oZmFsc2UsIHRydWUsIG9wKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlMSkKLSAgICAgICAgewotICAgICAgICAJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgICAgICAJZTEucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIAkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUxKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZTEpCi0gICAgICAgIHsKLSAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZTEpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotCi0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZG9GaW5pc2hKYXZhMldTREwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICBXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24gb3AgPSBuZXcgV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uKCkgewotICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLSAgICAgICAgICAgICAgICBpZiAobW9uaXRvciA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICBtb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICogIjIiIGlzIHRoZSB0b3RhbCBhbW91bnQgb2Ygc3RlcHMsIHNlZSBiZWxvdwotICAgICAgICAgICAgICAgICAqIG1vbml0b3Iud29ya2VkKGFtb3VudCkKLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBtb25pdG9yLmJlZ2luVGFzayhDb2RlZ2VuV2l6YXJkUGx1Z2luCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UmVzb3VyY2VTdHJpbmcoImdlbmVyYXRvci5nZW5lcmF0aW5nIiksIDMpOwotCi0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgbW9uaXRvci53b3JrZWQoMSk7Ci0gICAgICAgICAgICAgICAgICAgIC8vZmlsbCB0aGUgb3B0aW9uIG1hcAotICAgICAgICAgICAgICAgICAgICBNYXAgb3B0aW9uc01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgICAgICAgICAgICAgIEphdmEyV1NETENvbW1hbmRMaW5lT3B0aW9uIG9wdGlvbiA9IG5ldyBKYXZhMldTRExDb21tYW5kTGluZU9wdGlvbigKLSAgICAgICAgICAgICAgICAgICAgCQlDTEFTU05BTUVfT1BUSU9OLG5ldyBTdHJpbmdbXXtqYXZhU291cmNlU2VsZWN0aW9uUGFnZS5nZXRDbGFzc05hbWUoKX0pOwotICAgICAgICAgICAgICAgICAgICBvcHRpb25zTWFwLnB1dChDTEFTU05BTUVfT1BUSU9OLG9wdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBvcHRpb24gPSBuZXcgSmF2YTJXU0RMQ29tbWFuZExpbmVPcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIAkJQ0xBU1NQQVRIX09QVElPTixqYXZhU291cmNlU2VsZWN0aW9uUGFnZS5nZXRDbGFzc1BhdGhMaXN0KCkpOwotICAgICAgICAgICAgICAgICAgICBvcHRpb25zTWFwLnB1dChDTEFTU1BBVEhfT1BUSU9OLG9wdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBvcHRpb24gPSBuZXcgSmF2YTJXU0RMQ29tbWFuZExpbmVPcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIAkJVEFSR0VUX05BTUVTUEFDRV9PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgIAkJbmV3IFN0cmluZ1tde2phdmEyd3NkbE9wdGlvbnNQYWdlLmdldFRhcmdldE5hbWVzcGFjZSgpfSk7Ci0gICAgICAgICAgICAgICAgICAgIG9wdGlvbnNNYXAucHV0KFRBUkdFVF9OQU1FU1BBQ0VfT1BUSU9OLG9wdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBvcHRpb24gPSBuZXcgSmF2YTJXU0RMQ29tbWFuZExpbmVPcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIAkJVEFSR0VUX05BTUVTUEFDRV9QUkVGSVhfT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICAJCW5ldyBTdHJpbmdbXXtqYXZhMndzZGxPcHRpb25zUGFnZS5nZXRUYXJnZXROYW1lc3BhY2VQcmVmaXgoKX0pOwotICAgICAgICAgICAgICAgICAgICBvcHRpb25zTWFwLnB1dChUQVJHRVRfTkFNRVNQQUNFX1BSRUZJWF9PUFRJT04sb3B0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIG9wdGlvbiA9IG5ldyBKYXZhMldTRExDb21tYW5kTGluZU9wdGlvbigKLSAgICAgICAgICAgICAgICAgICAgCQlTQ0hFTUFfVEFSR0VUX05BTUVTUEFDRV9PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgIAkJbmV3IFN0cmluZ1tde2phdmEyd3NkbE9wdGlvbnNQYWdlLmdldFNjaGVtYVRhcmdldE5hbWVzcGFjZSgpfSk7Ci0gICAgICAgICAgICAgICAgICAgIG9wdGlvbnNNYXAucHV0KFNDSEVNQV9UQVJHRVRfTkFNRVNQQUNFX09QVElPTixvcHRpb24pOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgb3B0aW9uID0gbmV3IEphdmEyV1NETENvbW1hbmRMaW5lT3B0aW9uKAotICAgICAgICAgICAgICAgICAgICAJCVNFUlZJQ0VfTkFNRV9PUFRJT04sbmV3IFN0cmluZ1tde2phdmEyd3NkbE9wdGlvbnNQYWdlLmdldFNlcnZpY2VOYW1lKCl9KTsKLSAgICAgICAgICAgICAgICAgICAgb3B0aW9uc01hcC5wdXQoU0VSVklDRV9OQU1FX09QVElPTixvcHRpb24pOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgb3B0aW9uID0gbmV3IEphdmEyV1NETENvbW1hbmRMaW5lT3B0aW9uKAotICAgICAgICAgICAgICAgICAgICAJCVNDSEVNQV9UQVJHRVRfTkFNRVNQQUNFX1BSRUZJWF9PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgIAkJbmV3IFN0cmluZ1tde2phdmEyd3NkbE9wdGlvbnNQYWdlLmdldFNjaGVtYVRhcmdldE5hbWVzcGFjZVByZWZpeCgpfSk7Ci0gICAgICAgICAgICAgICAgICAgIG9wdGlvbnNNYXAucHV0KFNDSEVNQV9UQVJHRVRfTkFNRVNQQUNFX1BSRUZJWF9PUFRJT04sb3B0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIG9wdGlvbiA9IG5ldyBKYXZhMldTRExDb21tYW5kTGluZU9wdGlvbigKLSAgICAgICAgICAgICAgICAgICAgCQlPVVRQVVRfTE9DQVRJT05fT1BUSU9OLG5ldyBTdHJpbmdbXXtqYXZhMndzZGxPdXRwdXRMb2NhdGlvblBhZ2UuZ2V0T3V0cHV0TG9jYXRpb24oKX0pOwotICAgICAgICAgICAgICAgICAgICBvcHRpb25zTWFwLnB1dChPVVRQVVRfTE9DQVRJT05fT1BUSU9OLG9wdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBvcHRpb24gPSBuZXcgSmF2YTJXU0RMQ29tbWFuZExpbmVPcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIAkJT1VUUFVUX0ZJTEVOQU1FX09QVElPTixuZXcgU3RyaW5nW117amF2YTJ3c2RsT3V0cHV0TG9jYXRpb25QYWdlLmdldE91dHB1dFdTRExOYW1lKCl9KTsKLSAgICAgICAgICAgICAgICAgICAgb3B0aW9uc01hcC5wdXQoT1VUUFVUX0ZJTEVOQU1FX09QVElPTixvcHRpb24pOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgbW9uaXRvci53b3JrZWQoMSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBuZXcgSmF2YTJXU0RMQ29kZWdlbkVuZ2luZShvcHRpb25zTWFwKS5nZW5lcmF0ZSgpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgbW9uaXRvci53b3JrZWQoMSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkgewotICAgICAgICAgICAgICAgIAkJZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgICAgICAJICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG1vbml0b3IuZG9uZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBnZXRDb250YWluZXIoKS5ydW4oZmFsc2UsIHRydWUsIG9wKTsKLSAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlMSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZTEpOwotICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlMSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oQ29kZWdlbldpemFyZFBsdWdpbi4KLSAgICAgICAgICAgIAkJZ2V0UmVzb3VyY2VTdHJpbmcoImdlbmVyYWwudXNlcmFib3J0ZWQuc3RhdGUiKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogV2Ugd2lsbCBhY2NlcHQgdGhlIHNlbGVjdGlvbiBpbiB0aGUgd29ya2JlbmNoIHRvIHNlZSBpZiB3ZSBjYW4gaW5pdGlhbGl6ZQotICAgICAqIGZyb20gaXQuCi0gICAgICogCi0gICAgICogQHNlZSBJV29ya2JlbmNoV2l6YXJkI2luaXQoSVdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0gICAgICAgIC8vZG8gbm90aGluZwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgc2VsZWN0ZWRXaXphcmRUeXBlLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0U2VsZWN0ZWRXaXphcmRUeXBlKCkgewotICAgICAgICByZXR1cm4gc2VsZWN0ZWRXaXphcmRUeXBlOwotICAgIH0gICAgCi0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gc2VsZWN0ZWRXaXphcmRUeXBlCi0gICAgICogICAgICAgICAgICBUaGUgc2VsZWN0ZWRXaXphcmRUeXBlIHRvIHNldC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTZWxlY3RlZFdpemFyZFR5cGUoaW50IHNlbGVjdGVkV2l6YXJkVHlwZSkgewotICAgICAgICB0aGlzLnNlbGVjdGVkV2l6YXJkVHlwZSA9IHNlbGVjdGVkV2l6YXJkVHlwZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBjb2RlZ2VuT3B0aW9uVHlwZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFNlbGVjdGVkQ29kZWdlbk9wdGlvblR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBzZWxlY3RlZENvZGVnZW5PcHRpb25UeXBlOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAcGFyYW0gc2VsZWN0ZWRDb2RlZ2VuT3B0aW9uVHlwZQotICAgICAqICAgICAgICAgICAgVGhlIHNlbGVjdGVkQ29kZWdlbk9wdGlvblR5cGUgdG8gc2V0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNlbGVjdGVkQ29kZWdlbk9wdGlvblR5cGUoaW50IHNlbGVjdGVkQ29kZWdlbk9wdGlvblR5cGUpIHsKLSAgICAgICAgdGhpcy5zZWxlY3RlZENvZGVnZW5PcHRpb25UeXBlID0gc2VsZWN0ZWRDb2RlZ2VuT3B0aW9uVHlwZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHNlbGVjdGVkIFdTREwgZnJvbSB0aGUgV1NETHNlbGVjdGlvbnBhZ2UKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRXU0RMbmFtZSgpewotICAgICAgICByZXR1cm4gd3NkbFNlbGVjdGlvblBhZ2UuZ2V0RmlsZU5hbWUoKTsJCi0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIHBvcHVsYXRlIHRoZSBvcHRpb25zIHBhZ2UuIFVzdWFsbHkgZG9uZSBhZnRlciByZWxvYWRpbmcgdGhlIFdTREwKLSAgICAgKgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHBvcHVsYXRlT3B0aW9ucygpewotICAgIAlvcHRpb25zUGFnZS5wb3B1bGF0ZVBhcmFtc0Zyb21XU0RMKCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHROYW1lc3BhY2VzKFN0cmluZyBmdWxseVF1YWxpZmllZENsYXNzTmFtZSl7Ci0gICAgCWphdmEyd3NkbE9wdGlvbnNQYWdlLnNldE5hbWVzcGFjZURlZmF1bHRzKGZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lKTsKLSAgICB9Ci0gICAgCi0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGFkZExpYnNUb1Byb2plY3RMaWIoU3RyaW5nIGxpYkRpcmVjdG9yeSwgU3RyaW5nIG91dHB1dExvY2F0aW9uKXsKLSAgICAJU3RyaW5nIG5ld091dHB1dExvY2F0aW9uID0gb3V0cHV0TG9jYXRpb24rRmlsZS5zZXBhcmF0b3IrVUlDb25zdGFudHMuTElCOwotICAgIAkvL0NyZWF0ZSBhIGxpYiBkaXJlY3Rvcnk7IGFsbCBhbmNlc3RvciBkaXJlY3RvcmllcyBtdXN0IGV4aXN0Ci0gICAgCWJvb2xlYW4gc3VjY2VzcyA9IChuZXcgRmlsZShuZXdPdXRwdXRMb2NhdGlvbikpLm1rZGlyKCk7Ci0gICAgICAgIGlmICghc3VjY2VzcykgewotICAgICAgICAgICAgLy8gRGlyZWN0b3J5IGNyZWF0aW9uIGZhaWxlZAotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0JCQljb3B5RGlyZWN0b3J5KG5ldyBGaWxlKGxpYkRpcmVjdG9yeSksbmV3IEZpbGUobmV3T3V0cHV0TG9jYXRpb24pKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotICAgIH0KLSAgICAKLSAgICAvLyBDb3BpZXMgYWxsIGZpbGVzIHVuZGVyIHNyY0RpciB0byBkc3REaXIuCi0gICAgLy8gSWYgZHN0RGlyIGRvZXMgbm90IGV4aXN0LCBpdCB3aWxsIGJlIGNyZWF0ZWQuCi0gICAgcHVibGljIHZvaWQgY29weURpcmVjdG9yeShGaWxlIHNyY0RpciwgRmlsZSBkc3REaXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChzcmNEaXIuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgaWYgKCFkc3REaXIuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICBkc3REaXIubWtkaXIoKTsKLSAgICAgICAgICAgIH0KLSAgICAKLSAgICAgICAgICAgIFN0cmluZ1tdIGNoaWxkcmVuID0gc3JjRGlyLmxpc3QoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGNvcHlEaXJlY3RvcnkobmV3IEZpbGUoc3JjRGlyLCBjaGlsZHJlbltpXSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGUoZHN0RGlyLCBjaGlsZHJlbltpXSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY29weUZpbGUoc3JjRGlyLCBkc3REaXIpOwotICAgICAgICB9Ci0gICAgfQotICAgICAgICAKLSAgICAvLyBDb3BpZXMgc3JjIGZpbGUgdG8gZHN0IGZpbGUuCi0gICAgLy8gSWYgdGhlIGRzdCBmaWxlIGRvZXMgbm90IGV4aXN0LCBpdCBpcyBjcmVhdGVkCi0gICAgcHJpdmF0ZSB2b2lkIGNvcHlGaWxlKEZpbGUgc3JjLCBGaWxlIGRzdCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgSW5wdXRTdHJlYW0gaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKHNyYyk7Ci0gICAgICAgIE91dHB1dFN0cmVhbSBvdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShkc3QpOwotICAgIAotICAgICAgICAvLyBUcmFuc2ZlciBieXRlcyBmcm9tIGluIHRvIG91dAotICAgICAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbMTAyNF07Ci0gICAgICAgIGludCBsZW47Ci0gICAgICAgIHdoaWxlICgobGVuID0gaW4ucmVhZChidWYpKSA+IDApIHsKLSAgICAgICAgICAgIG91dC53cml0ZShidWYsIDAsIGxlbik7Ci0gICAgICAgIH0KLSAgICAgICAgaW4uY2xvc2UoKTsKLSAgICAgICAgb3V0LmNsb3NlKCk7Ci0gICAgfQotICAgIAotICAgIC8vIERlbGV0ZXMgYWxsIGZpbGVzIGFuZCBzdWJkaXJlY3RvcmllcyB1bmRlciBkaXIuCi0gICAgLy8gUmV0dXJucyB0cnVlIGlmIGFsbCBkZWxldGlvbnMgd2VyZSBzdWNjZXNzZnVsLgotICAgIC8vIElmIGEgZGVsZXRpb24gZmFpbHMsIHRoZSBtZXRob2Qgc3RvcHMgYXR0ZW1wdGluZyB0byBkZWxldGUgYW5kIHJldHVybnMgZmFsc2UuCi0gICAgcHJpdmF0ZSBib29sZWFuIGRlbGV0ZURpcihGaWxlIGRpcikgewotICAgICAgICBpZiAoZGlyLmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgIFN0cmluZ1tdIGNoaWxkcmVuID0gZGlyLmxpc3QoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9IGRlbGV0ZURpcihuZXcgRmlsZShkaXIsIGNoaWxkcmVuW2ldKSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFzdWNjZXNzKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAKLSAgICAgICAgLy8gVGhlIGRpcmVjdG9yeSBpcyBub3cgZW1wdHkgc28gZGVsZXRlIGl0Ci0gICAgICAgIHJldHVybiBkaXIuZGVsZXRlKCk7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLWNvZGVnZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL2NvZGVnZW4vZWNsaXBzZS9wbHVnaW4vQ29kZWdlbldpemFyZFBsdWdpbi5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLWNvZGVnZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL2NvZGVnZW4vZWNsaXBzZS9wbHVnaW4vQ29kZWdlbldpemFyZFBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDc4N2U0Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1jb2RlZ2VuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9jb2RlZ2VuL2VjbGlwc2UvcGx1Z2luL0NvZGVnZW5XaXphcmRQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudG9vbC5jb2RlZ2VuLmVjbGlwc2UucGx1Z2luOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLS8qKgotICogVGhlIG1haW4gcGx1Z2luIGNsYXNzIHRvIGJlIHVzZWQgaW4gdGhlIGRlc2t0b3AuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb2RlZ2VuV2l6YXJkUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0JLy9UaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIENvZGVnZW5XaXphcmRQbHVnaW4gcGx1Z2luOwotCS8vUmVzb3VyY2UgYnVuZGxlLgotCXByaXZhdGUgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGU7Ci0JcHJpdmF0ZSBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIHdpemFyZEltYWdlRGVzY3JpcHRvcjsKLQkKLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIENvZGVnZW5XaXphcmRQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JCXRyeSB7Ci0JCQlyZXNvdXJjZUJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgib3JnLmFwYWNoZS5heGlzMi50b29sLmNvZGVnZW4ucmVzb3VyY2UuQ29kZWdlbiIpOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24geCkgewotCQkJcmVzb3VyY2VCdW5kbGUgPSBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHVwb24gcGx1Zy1pbiBhY3RpdmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIHBsdWctaW4gaXMgc3RvcHBlZAotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBDb2RlZ2VuV2l6YXJkUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RyaW5nIGZyb20gdGhlIHBsdWdpbidzIHJlc291cmNlIGJ1bmRsZSwKLQkgKiBvciAna2V5JyBpZiBub3QgZm91bmQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIGtleSkgewotCQlSZXNvdXJjZUJ1bmRsZSBidW5kbGUgPSBDb2RlZ2VuV2l6YXJkUGx1Z2luLmdldERlZmF1bHQoKS5nZXRSZXNvdXJjZUJ1bmRsZSgpOwotCQl0cnkgewotCQkJcmV0dXJuIChidW5kbGUgIT0gbnVsbCkgPyBidW5kbGUuZ2V0U3RyaW5nKGtleSkgOiBrZXk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4ga2V5OwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGx1Z2luJ3MgcmVzb3VyY2UgYnVuZGxlLAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpIHsKLQkJcmV0dXJuIHJlc291cmNlQnVuZGxlOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRXaXphcmRJbWFnZURlc2NyaXB0b3IoKXsKLQkgICAgaWYgKHdpemFyZEltYWdlRGVzY3JpcHRvcj09bnVsbCl7Ci0JICAgICAgICB3aXphcmRJbWFnZURlc2NyaXB0b3IgPUNvZGVnZW5XaXphcmRQbHVnaW4uaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbigiQXhpczJfQ29kZWdlbl9XaXphcmQiLCJpY29ucy9hc2YtZmVhdGhlci5naWYiKTsKLQkgICAgfQotCSAgICByZXR1cm4gd2l6YXJkSW1hZ2VEZXNjcmlwdG9yOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1jb2RlZ2VuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9jb2RlZ2VuL2VjbGlwc2UvdWkvQWJzdHJhY3RXaXphcmRQYWdlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2UtY29kZWdlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvY29kZWdlbi9lY2xpcHNlL3VpL0Fic3RyYWN0V2l6YXJkUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDU5OThlLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1jb2RlZ2VuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9jb2RlZ2VuL2VjbGlwc2UvdWkvQWJzdHJhY3RXaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudG9vbC5jb2RlZ2VuLmVjbGlwc2UudWk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRvb2wuY29kZWdlbi5lY2xpcHNlLkNvZGVHZW5XaXphcmQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29sLmNvZGVnZW4uZWNsaXBzZS5wbHVnaW4uQ29kZWdlbldpemFyZFBsdWdpbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRvb2wuY29kZWdlbi5lY2xpcHNlLnV0aWwuU2V0dGluZ3NDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nU2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFdpemFyZFBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlIGltcGxlbWVudHMgU2V0dGluZ3NDb25zdGFudHMgewotICAgIAotICAgIHByb3RlY3RlZCBJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3M7Ci0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcmVzdG9yZWRGcm9tUHJldmlvdXNTZXR0aW5ncyA9IGZhbHNlOwotICAgIAotICAgIHB1YmxpYyBBYnN0cmFjdFdpemFyZFBhZ2UoU3RyaW5nIHBhZ2VOYW1lKXsKLSAgICAgICAgc3VwZXIocGFnZU5hbWUrIi5uYW1lIik7Ci0gICAgICAgIGluaXQocGFnZU5hbWUpOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0KFN0cmluZyBwYWdlTmFtZSl7Ci0gICAgICAgIHNldFRpdGxlKENvZGVnZW5XaXphcmRQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcocGFnZU5hbWUrIi50aXRsZSIpKTsKLSAgICAgICAgc2V0RGVzY3JpcHRpb24oQ29kZWdlbldpemFyZFBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZyhwYWdlTmFtZSsiLmRlc2MiKSk7Ci0gICAgICAgIHNldEltYWdlRGVzY3JpcHRvcihDb2RlZ2VuV2l6YXJkUGx1Z2luLmdldFdpemFyZEltYWdlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgCi0gICAgICAgIC8qCi0gICAgICAgICAqIEdldCB0aGUgc2V0dGluZ3MgZm9yIHRoaXMgcGFnZS4gSWYgdGhlcmUgaXMgbm8gc2VjdGlvbiBpbiB0aGUKLSAgICAgICAgICogUGx1Z2luJ3Mgc2V0dGluZ3MgZm9yIHRoaXMgT3B0aW9uc1BhZ2UsIGNyZWF0ZSBhIG5ldyBzZWN0aW9uCi0gICAgICAgICAqLwotICAgICAgICBJRGlhbG9nU2V0dGluZ3Mgcm9vdFNldHRpbmdzID0gQ29kZWdlbldpemFyZFBsdWdpbi5nZXREZWZhdWx0KCkKLSAgICAgICAgICAgICAgICAuZ2V0RGlhbG9nU2V0dGluZ3MoKTsKLSAgICAgICAgSURpYWxvZ1NldHRpbmdzIHNlY3Rpb24gPSByb290U2V0dGluZ3MuZ2V0U2VjdGlvbih0aGlzLmdldENsYXNzKCkKLSAgICAgICAgICAgICAgICAuZ2V0TmFtZSgpKTsKLSAgICAgICAgaWYgKHNlY3Rpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgc2V0dGluZ3MgPSByb290U2V0dGluZ3MuYWRkTmV3U2VjdGlvbih0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIHJlc3RvcmVkRnJvbVByZXZpb3VzU2V0dGluZ3MgPSBmYWxzZTsKLSAgICAgICAgICAgIGluaXRpYWxpemVEZWZhdWx0U2V0dGluZ3MoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJlc3RvcmVkRnJvbVByZXZpb3VzU2V0dGluZ3M9dHJ1ZTsKLSAgICAgICAgICAgIHNldHRpbmdzID0gc2VjdGlvbjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHVwZGF0ZVN0YXR1cyhTdHJpbmcgbWVzc2FnZSkgewotICAgIAlzZXRFcnJvck1lc3NhZ2UobWVzc2FnZSk7Ci0gICAgICAgIHNldFBhZ2VDb21wbGV0ZShtZXNzYWdlID09IG51bGwpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGluaXRpYWxpemVEZWZhdWx0U2V0dGluZ3MoKTsgCi0gICAKLSAgICBwdWJsaWMgYWJzdHJhY3QgaW50IGdldFBhZ2VUeXBlKCkgOwotICAgIAotICAgIC8qKgotICAgICAqIGEgY29udmVuaWVudCBtZXRob2QgdG8gZ2V0IHRoZSB3aXphcmQKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIENvZGVHZW5XaXphcmQgZ2V0Q29kZWdlbldpemFyZCgpewotICAgIAlyZXR1cm4gKENvZGVHZW5XaXphcmQpZ2V0V2l6YXJkKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLWNvZGVnZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL2NvZGVnZW4vZWNsaXBzZS91aS9KYXZhU291cmNlU2VsZWN0aW9uUGFnZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLWNvZGVnZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL2NvZGVnZW4vZWNsaXBzZS91aS9KYXZhU291cmNlU2VsZWN0aW9uUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTRkMjUwLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1jb2RlZ2VuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9jb2RlZ2VuL2VjbGlwc2UvdWkvSmF2YVNvdXJjZVNlbGVjdGlvblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudG9vbC5jb2RlZ2VuLmVjbGlwc2UudWk7Ci0KLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbC5jb2RlZ2VuLmVjbGlwc2UucGx1Z2luLkNvZGVnZW5XaXphcmRQbHVnaW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29sLmNvZGVnZW4uZWNsaXBzZS51dGlsLkNsYXNzRmlsZVJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU2Nyb2xsZWRDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpcmVjdG9yeURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5GaWxlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgSmF2YVNvdXJjZVNlbGVjdGlvblBhZ2UgZXh0ZW5kcyBBYnN0cmFjdFdpemFyZFBhZ2V7Ci0KLSAgICBwcml2YXRlIENvbXBvc2l0ZSBjb250YWluZXI7Ci0gICAgcHJpdmF0ZSBUZXh0IGphdmFDbGFzc05hbWVCb3g7Ci0gICAgcHJpdmF0ZSBMaXN0IGphdmFDbGFzc3BhdGhMaXN0OwotICAgIHByaXZhdGUgTGFiZWwgc3RhdHVzTGFiZWw7Ci0KLSAgICBwdWJsaWMgSmF2YVNvdXJjZVNlbGVjdGlvblBhZ2UoKSB7ICAKLSAgICAJc3VwZXIoInBhZ2U0Iik7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRTZXR0aW5ncygpIHsKLSAgICAgICAgc2V0dGluZ3MucHV0KEpBVkFfQ0xBU1NfTkFNRSwgIiIpOwotICAgICAgICBzZXR0aW5ncy5wdXQoSkFWQV9DTEFTU19QQVRIX0VOVFJJRVMsIG5ldyBTdHJpbmdbXXsiIn0pOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi50b29sLmNvZGVnZW4uZWNsaXBzZS51aS5Db2RlZ2VuUGFnZSNnZXRQYWdlVHlwZSgpCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRQYWdlVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIEpBVkFfMl9XU0RMX1RZUEU7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlI2NyZWF0ZUNvbnRyb2wob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBjb250YWluZXIgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotICAgICAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgICAgIGNvbnRhaW5lci5zZXRMYXlvdXQobGF5b3V0KTsKLSAgICAgICAgbGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotICAgICAgICBsYXlvdXQudmVydGljYWxTcGFjaW5nID0gOTsKLQotICAgICAgICBHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotICAgICAgICAKLSAgICAgICAgLy9jbGFzcyBuYW1lICBlbnRyeQotICAgICAgICBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb250YWluZXIsIFNXVC5OVUxMKTsKLSAgICAgICAgbGFiZWwuc2V0VGV4dChDb2RlZ2VuV2l6YXJkUGx1Z2luCi0gICAgICAgICAgICAgICAgLmdldFJlc291cmNlU3RyaW5nKCJwYWdlNC5jbGFzc25hbWUubGFiZWwiKSk7Ci0gICAgICAgIAotICAgICAgICBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotICAgICAgICBnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgICAgIGphdmFDbGFzc05hbWVCb3ggPSBuZXcgVGV4dChjb250YWluZXIsU1dULkJPUkRFUik7Ci0gICAgICAgIGphdmFDbGFzc05hbWVCb3guc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgICAgIGphdmFDbGFzc05hbWVCb3guc2V0VGV4dChzZXR0aW5ncy5nZXQoSkFWQV9DTEFTU19OQU1FKSk7Ci0gICAgICAgIGphdmFDbGFzc05hbWVCb3guYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCl7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpewotICAgICAgICAgICAgICAgIGhhbmRsZUNsYXNzTmFtZVRleHRDaGFuZ2UoKTsKLSAgICAgICAgICAgICB9Ci0gICAgICAgICB9KTsKLSAgICAgICAgCi0gICAgICAgIC8vY2xhc3MgcGF0aCBlbnRyeQotICAgICAgICBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotICAgICAgICBnZC5ob3Jpem9udGFsU3Bhbj0zOwotICAgICAgICBsYWJlbCA9IG5ldyBMYWJlbChjb250YWluZXIsIFNXVC5OVUxMKTsKLSAgICAgICAgbGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgICAgIGxhYmVsLnNldFRleHQoQ29kZWdlbldpemFyZFBsdWdpbgotICAgICAgICAgICAgICAgIC5nZXRSZXNvdXJjZVN0cmluZygicGFnZTQuY2xhc3NwYXRoLmxhYmVsIikpOwotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotICAgICAgICBCdXR0b24gYWRkRGlyQnV0dG9uID0gbmV3IEJ1dHRvbihjb250YWluZXIsU1dULlBVU0gpOwotICAgICAgICBhZGREaXJCdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgICAgIGFkZERpckJ1dHRvbi5zZXRUZXh0KENvZGVnZW5XaXphcmRQbHVnaW4KLSAgICAgICAgICAgICAgICAuZ2V0UmVzb3VyY2VTdHJpbmcoInBhZ2U0LmFkZERpci5sYWJlbCIpKTsKLSAgICAgICAgYWRkRGlyQnV0dG9uLmFkZE1vdXNlTGlzdGVuZXIobmV3IE1vdXNlQWRhcHRlcigpewotICAgICAgICAJcHVibGljIHZvaWQgbW91c2VVcChNb3VzZUV2ZW50IGUpIHsKLSAgICAgICAgCQloYW5kbGVEaXJlY3RvcnlCcm93c2UoKTsKLSAgICAgICAgCX0KLSAgICAgICAgfSk7Ci0gICAgICAgIAotICAgICAgICBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotICAgICAgICBCdXR0b24gYWRkSmFyQnV0dG9uID0gbmV3IEJ1dHRvbihjb250YWluZXIsU1dULlBVU0gpOwotICAgICAgICBhZGRKYXJCdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgICAgIGFkZEphckJ1dHRvbi5zZXRUZXh0KENvZGVnZW5XaXphcmRQbHVnaW4KLSAgICAgICAgICAgICAgICAuZ2V0UmVzb3VyY2VTdHJpbmcoInBhZ2U0LmFkZEphci5sYWJlbCIpKTsKLSAgICAgICAgYWRkSmFyQnV0dG9uLmFkZE1vdXNlTGlzdGVuZXIobmV3IE1vdXNlQWRhcHRlcigpewotICAgICAgICAJcHVibGljIHZvaWQgbW91c2VVcChNb3VzZUV2ZW50IGUpIHsKLSAgICAgICAgCQloYW5kbGVGaWxlQnJvd3NlKCk7Ci0gICAgICAgIAl9Ci0gICAgICAgIH0pOwotICAgICAgICAKLSAgICAgICAgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLSAgICAgICAgQnV0dG9uIHJlbW92ZUVudHJ5QnV0dG9uID0gbmV3IEJ1dHRvbihjb250YWluZXIsU1dULlBVU0gpOwotICAgICAgICByZW1vdmVFbnRyeUJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLSAgICAgICAgcmVtb3ZlRW50cnlCdXR0b24uc2V0VGV4dChDb2RlZ2VuV2l6YXJkUGx1Z2luCi0gICAgICAgICAgICAgICAgLmdldFJlc291cmNlU3RyaW5nKCJwYWdlNC5yZW1vdmVFbnRyeS5sYWJlbCIpKTsKLSAgICAgICAgcmVtb3ZlRW50cnlCdXR0b24uYWRkTW91c2VMaXN0ZW5lcihuZXcgTW91c2VBZGFwdGVyKCl7Ci0gICAgICAgIAlwdWJsaWMgdm9pZCBtb3VzZVVwKE1vdXNlRXZlbnQgZSkgewotICAgICAgICAJCWhhbmRsZVJlbW92ZSgpOwotICAgICAgICAJfQotICAgICAgICB9KTsKLSAgICAgICAgCi0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMzsKLQkJZ2QudmVydGljYWxTcGFuID0gMjsKLSAgICAgICAgU2Nyb2xsZWRDb21wb3NpdGUgYzIgPSBuZXcgU2Nyb2xsZWRDb21wb3NpdGUoY29udGFpbmVyLCBTV1QuVl9TQ1JPTEwpOwotICAgICAgICBjMi5zZXRFeHBhbmRIb3Jpem9udGFsKGZhbHNlKTsKLSAgICAgICAgYzIuc2V0RXhwYW5kVmVydGljYWwoZmFsc2UpOwotCQljMi5zZXRMYXlvdXREYXRhKGdkKTsKLQkJamF2YUNsYXNzcGF0aExpc3QgPSBuZXcgTGlzdChjMixTV1QuUkVBRF9PTkxZIHxTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMKTsKLQkJamF2YUNsYXNzcGF0aExpc3Quc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgICAgIHNldHRpbmdzLnB1dChKQVZBX0NMQVNTX1BBVEhfRU5UUklFUywgbmV3IFN0cmluZ1tde30pOwotCQlqYXZhQ2xhc3NwYXRoTGlzdC5zZXRJdGVtcyhzZXR0aW5ncy5nZXRBcnJheShKQVZBX0NMQVNTX1BBVEhfRU5UUklFUykpOwotCQlqYXZhQ2xhc3NwYXRoTGlzdC5zZXRTaXplKDYwMCwgMjUwKTsKLQkJYzIuc2V0Q29udGVudChqYXZhQ2xhc3NwYXRoTGlzdCk7Ci0KLSAgICAgICAgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLSAgICAgICAgQnV0dG9uIHRyeUxvYWRCdXR0b24gPSBuZXcgQnV0dG9uKGNvbnRhaW5lcixTV1QuUFVTSCk7Ci0gICAgICAgIHRyeUxvYWRCdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgICAgIHRyeUxvYWRCdXR0b24uc2V0VGV4dChDb2RlZ2VuV2l6YXJkUGx1Z2luCi0gICAgICAgICAgICAgICAgLmdldFJlc291cmNlU3RyaW5nKCJwYWdlNC50cnlMb2FkLmxhYmVsIikpOwotICAgICAgICB0cnlMb2FkQnV0dG9uLmFkZE1vdXNlTGlzdGVuZXIobmV3IE1vdXNlQWRhcHRlcigpewotICAgICAgICAJcHVibGljIHZvaWQgbW91c2VVcChNb3VzZUV2ZW50IGUpIHsKLSAgICAgICAgCQlqYXZhLnV0aWwuTGlzdCBlcnJvckxpc3RlbmVyID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAJCWlmICghQ2xhc3NGaWxlUmVhZGVyLnRyeUxvYWRpbmdDbGFzcyhnZXRDbGFzc05hbWUoKSwKLSAgICAgICAgCQkJCWdldENsYXNzUGF0aExpc3QoKSwKLSAgICAgICAgCQkJCWVycm9yTGlzdGVuZXIpKXsKLSAgICAgICAgCQkJSXRlcmF0b3IgaXQgPSBlcnJvckxpc3RlbmVyLml0ZXJhdG9yKCk7Ci0gICAgICAgIAkJCXdoaWxlKGl0Lmhhc05leHQoKSl7Ci0gICAgICAgIAkJCQlPYmplY3QgbmV4dE9iamVjdCA9IGl0Lm5leHQoKTsKLSAgICAgICAgCQkJCVN0cmluZyBlcnJvck1lc3NhZ2UgPSBuZXh0T2JqZWN0PT1udWxsP0NvZGVnZW5XaXphcmRQbHVnaW4KLQkJCQkgICAgICAgICAgICAgICAgLmdldFJlc291cmNlU3RyaW5nKCJwYWdlNC51bmtub3duRXJyb3IubGFiZWwiKTpuZXh0T2JqZWN0LnRvU3RyaW5nKCk7Ci0JCQkJCQl1cGRhdGVTdGF0dXMoZXJyb3JNZXNzYWdlKTsKLQkJCQkJCXVwZGF0ZVN0YXR1c1RleHRGaWVsZChmYWxzZSxlcnJvck1lc3NhZ2UpOwotICAgICAgICAJCQl9Ci0gICAgICAgIAkJCQotICAgICAgICAJCX1lbHNlewotICAgICAgICAJCQl1cGRhdGVTdGF0dXNUZXh0RmllbGQodHJ1ZSxDb2RlZ2VuV2l6YXJkUGx1Z2luCi0JCQkgICAgICAgICAgICAgICAgLmdldFJlc291cmNlU3RyaW5nKCJwYWdlNC5zdWNjZXNzTG9hZGluZy5sYWJlbCIpKTsKLSAgICAgICAgCQkJdXBkYXRlU3RhdHVzKG51bGwpOwotICAgICAgICAJCX0KLSAgICAgICAgCX0KLSAgICAgICAgfSk7Ci0gICAgICAgIAotICAgICAgICBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotICAgICAgICBnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgICAgIHN0YXR1c0xhYmVsID0gbmV3IExhYmVsKGNvbnRhaW5lcixTV1QuTlVMTCk7Ci0gICAgICAgIHN0YXR1c0xhYmVsLnNldExheW91dERhdGEoZ2QpOwotICAgICAgICAKLQkJLy9maWxsaW5nIGxhYmVsIAotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCUxhYmVsIGZpbGxMYWJlbDMgPSBuZXcgTGFiZWwoY29udGFpbmVyLCBTV1QuSE9SSVpPTlRBTCB8IFNXVC5TRVBBUkFUT1IpOwotCQlmaWxsTGFiZWwzLnNldExheW91dERhdGEoZ2QpOwotCQkKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAzOyAKLQkJTGFiZWwgaGludExhYmVsID0gbmV3IExhYmVsKGNvbnRhaW5lciwgU1dULk5VTEwpOwotCQloaW50TGFiZWwKLQkJCQkuc2V0VGV4dChDb2RlZ2VuV2l6YXJkUGx1Z2luCi0JCQkJCQkuZ2V0UmVzb3VyY2VTdHJpbmcoInBhZ2U0LmhpbnQuY2FwdGlvbiIpKTsKLQkJaGludExhYmVsLnNldExheW91dERhdGEoZ2QpOwotLy8JCWhpbnRMYWJlbC5zZXRGb250KG5ldyBGb250KG5ldyBEZXZpY2UoKSB7Ci0vLwkJCXB1YmxpYyBpbnQgaW50ZXJuYWxfbmV3X0dDKEdDRGF0YSBkYXRhKSB7cmV0dXJuIDA7fQotLy8JCQlwdWJsaWMgdm9pZCBpbnRlcm5hbF9kaXNwb3NlX0dDKGludCBoYW5kbGUsIEdDRGF0YSBkYXRhKSB7fQotLy8JCQkJCQkJCQkJCX0sImhpbnRGb250Iiw4LFNXVC5OT1JNQUwpKTsKLSAgICAgICAgCi0gICAgICAgIHNldFBhZ2VDb21wbGV0ZShmYWxzZSk7Ci0gICAgICAgIHNldENvbnRyb2woY29udGFpbmVyKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChyZXN0b3JlZEZyb21QcmV2aW91c1NldHRpbmdzKXsKLSAgICAgICAgICAgIGhhbmRsZUNsYXNzTmFtZVRleHRDaGFuZ2UoKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgCi0gICAgLyoqCi0gICAgICogUG9wcyB1cCB0aGUgZmlsZSBicm93c2UgZGlhbG9nIGJveAotICAgICAqICAKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlRGlyZWN0b3J5QnJvd3NlKCkgewotICAgICAgICBEaXJlY3RvcnlEaWFsb2cgZmlsZURpYWxvZyA9IG5ldyBEaXJlY3RvcnlEaWFsb2codGhpcy5nZXRTaGVsbCgpKTsKLSAgICAgICAgU3RyaW5nIGRpck5hbWUgPSBmaWxlRGlhbG9nLm9wZW4oKTsKLSAgICAgICAgaWYgKGRpck5hbWUgIT0gbnVsbCkgewotICAgICAgICAJaWYgKCFjaGVja0ZpbGVuYW1lRXhpc3RzSW5MaXN0KGRpck5hbWUpKXsgIAotICAgICAgICAJCWphdmFDbGFzc3BhdGhMaXN0LmFkZChkaXJOYW1lKTsKLSAgICAgICAgCQl1cGRhdGVMaXN0RW50cmllcygpOwotICAgICAgICAJfQotICAgICAgICB9Ci0gICAgICAgIHVwZGF0ZVN0YXR1c1RleHRGaWVsZChmYWxzZSwiIik7Ci0gICAgfQotICAgIAotICAgIAotICAgIC8qKgotICAgICAqIFBvcHMgdXAgdGhlIGZpbGUgYnJvd3NlIGRpYWxvZyBib3gKLSAgICAgKiAgCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVJlbW92ZSgpIHsKLSAgICAgICAgaW50W10gc2VsZWN0aW9uSW5kaWNlcyA9IGphdmFDbGFzc3BhdGhMaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKTsKLSAgICAgICAgZm9yIChpbnQgaT0wO2k8c2VsZWN0aW9uSW5kaWNlcy5sZW5ndGg7aSsrKXsKLSAgICAgICAgCWphdmFDbGFzc3BhdGhMaXN0LnJlbW92ZShzZWxlY3Rpb25JbmRpY2VzW2ldKTsKLSAgICAgICAgfQotICAgICAgICB1cGRhdGVMaXN0RW50cmllcygpOwotICAgICAgICB1cGRhdGVTdGF0dXNUZXh0RmllbGQoZmFsc2UsIiIpOwotICAgIH0KLSAgICAKLSAgIAotICAgIC8qKgotICAgICAqIFBvcHMgdXAgdGhlIGZpbGUgYnJvd3NlIGRpYWxvZyBib3gKLSAgICAgKiAgCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZUZpbGVCcm93c2UoKSB7Ci0gICAgICAgIEZpbGVEaWFsb2cgZmlsZURpYWxvZyA9IG5ldyBGaWxlRGlhbG9nKHRoaXMuZ2V0U2hlbGwoKSk7Ci0gICAgICAgIGZpbGVEaWFsb2cuc2V0RmlsdGVyRXh0ZW5zaW9ucyhuZXcgU3RyaW5nW117IiouamFyIn0pOwotICAgICAgICBTdHJpbmcgZmlsZU5hbWUgPSBmaWxlRGlhbG9nLm9wZW4oKTsKLSAgICAgICAgaWYgKGZpbGVOYW1lICE9IG51bGwpIHsKLSAgICAgICAgCWlmICghY2hlY2tGaWxlbmFtZUV4aXN0c0luTGlzdChmaWxlTmFtZSkpewotICAgICAgICAgICAgCWphdmFDbGFzc3BhdGhMaXN0LmFkZChmaWxlTmFtZSk7Ci0gICAgICAgICAgICAJdXBkYXRlTGlzdEVudHJpZXMoKTsKLSAgICAgICAgCX0KLSAgICAgICAgfQotICAgICAgICB1cGRhdGVTdGF0dXNUZXh0RmllbGQoZmFsc2UsIiIpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBNZXRob2QgY2hlY2tzIHRoZSBsaXN0IGFudHJpZXMgYW5kIGNvbXBhcmUgdGhhdCB0byB0aGUgZmlsZSBuYW1lIAotICAgICAqIHJldHVybiB0aGUgcmVzdWx0cyBvZiB0aGUgY29tcGFyaXNvbgotICAgICAqIEBwYXJhbSBmaWxlbmFtZQotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gY2hlY2tGaWxlbmFtZUV4aXN0c0luTGlzdChTdHJpbmcgZmlsZW5hbWUpewotICAgIAlTdHJpbmdbXSBhcnJheSA9IGphdmFDbGFzc3BhdGhMaXN0LmdldEl0ZW1zKCk7Ci0KLSAgICAJZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykgewotCQkJaWYgKGFycmF5W2ldLmVxdWFscyhmaWxlbmFtZSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotICAgIAlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVTdGF0dXNUZXh0RmllbGQoYm9vbGVhbiBzdWNjZXNzLFN0cmluZyB0ZXh0KXsKLSAgICAJaWYgKHN1Y2Nlc3MpewotICAgIAkJZ2V0Q29kZWdlbldpemFyZCgpLnNldERlZmF1bHROYW1lc3BhY2VzKGphdmFDbGFzc05hbWVCb3guZ2V0VGV4dCgpKTsKLSAgICAJfQotICAgICAJc3RhdHVzTGFiZWwuc2V0VGV4dCh0ZXh0KTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUxpc3RFbnRyaWVzKCl7Ci0gICAgCXNldHRpbmdzLnB1dChKQVZBX0NMQVNTX1BBVEhfRU5UUklFUyxqYXZhQ2xhc3NwYXRoTGlzdC5nZXRJdGVtcygpKTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogCi0gICAgICoKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlQ2xhc3NOYW1lVGV4dENoYW5nZSgpewotICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gamF2YUNsYXNzTmFtZUJveC5nZXRUZXh0KCk7Ci0gICAgICAgIHNldHRpbmdzLnB1dChKQVZBX0NMQVNTX05BTUUsY2xhc3NOYW1lKTsKLSAgICAgICAgaWYgKGNsYXNzTmFtZT09bnVsbCB8fCAiIi5lcXVhbHMoY2xhc3NOYW1lLnRyaW0oKSkpewotICAgICAgICAgICAgdXBkYXRlU3RhdHVzKENvZGVnZW5XaXphcmRQbHVnaW4KLSAgICAgICAgICAgICAgICAgICAgLmdldFJlc291cmNlU3RyaW5nKCJwYWdlNC5lcnJvci5pbnZhbGlkQ2xhc3NOYW1lIikpOwotICAgICAgICB9ZWxzZSBpZihjbGFzc05hbWUuZW5kc1dpdGgoIi4iKSl7Ci0gICAgICAgICAgICB1cGRhdGVTdGF0dXMoQ29kZWdlbldpemFyZFBsdWdpbgotICAgICAgICAgICAgICAgICAgICAuZ2V0UmVzb3VyY2VTdHJpbmcoInBhZ2U0LmVycm9yLkNsYXNzTmFtZU5vdFRlcm1pbmF0ZWQiKSk7Ci0gICAgICAgIH1lbHNlewotICAgICAgICAJLy9qdXN0IGxlYXZlIGl0Ci0gICAgICAgICAgICAvL3VwZGF0ZVN0YXR1cyhudWxsKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKXsKLSAgICAgICAgcmV0dXJuIGphdmFDbGFzc05hbWVCb3guZ2V0VGV4dCgpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZ1tdIGdldENsYXNzUGF0aExpc3QoKXsKLSAgICAgICAgcmV0dXJuIGphdmFDbGFzc3BhdGhMaXN0LmdldEl0ZW1zKCk7Ci0gICAgfQotICAgIAotICAgCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2UtY29kZWdlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvY29kZWdlbi9lY2xpcHNlL3VpL0phdmFXU0RMT3B0aW9uc1BhZ2UuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1jb2RlZ2VuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9jb2RlZ2VuL2VjbGlwc2UvdWkvSmF2YVdTRExPcHRpb25zUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjJlZTJiLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1jb2RlZ2VuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9jb2RlZ2VuL2VjbGlwc2UvdWkvSmF2YVdTRExPcHRpb25zUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50b29sLmNvZGVnZW4uZWNsaXBzZS51aTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbC5jb2RlZ2VuLmVjbGlwc2UucGx1Z2luLkNvZGVnZW5XaXphcmRQbHVnaW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29sLmNvZGVnZW4uZWNsaXBzZS51dGlsLk5hbWVzcGFjZUZpbmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoKLSAqIFVzYWdlIGphdmEyd3NkbCAtY24gPGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lPiA6IGNsYXNzIGZpbGUgbmFtZSAtbyA8b3V0cHV0Ci0gKiBMb2NhdGlvbj4gOiBvdXRwdXQgZmlsZSBsb2NhdGlvbiAtY3AgPGNsYXNzIHBhdGggdXJpPiA6IGxpc3Qgb2YgY2xhc3NwYXRoCi0gKiBlbnRyaWVzIC0gKHVybHMpIC10biA8dGFyZ2V0IG5hbWVzcGFjZT4gOiB0YXJnZXQgbmFtZXNwYWNlIC10cCA8dGFyZ2V0Ci0gKiBuYW1lc3BhY2UgcHJlZml4PiA6IHRhcmdldCBuYW1lc3BhY2UgcHJlZml4IC1zdG4gPHNjaGVtYSB0YXJnZXQgbmFtZXNwYWNlPiA6Ci0gKiB0YXJnZXQgbmFtZXNwYWNlIGZvciBzY2hlbWEgLXN0cCA8c2NoZW1hIHRhcmdldCBuYW1lc3BhY2UgcHJlZml4PiA6IHRhcmdldAotICogbmFtZXNwYWNlIHByZWZpeCBmb3Igc2NoZW1hIC1zbiA8c2VydmljZSBuYW1lPiA6IHNlcnZpY2UgbmFtZSAtb2YgPG91dHB1dAotICogZmlsZSBuYW1lPiA6IG91dHB1dCBmaWxlIG5hbWUgZm9yIHRoZSBXU0RMCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhV1NETE9wdGlvbnNQYWdlIGV4dGVuZHMgQWJzdHJhY3RXaXphcmRQYWdlIHsKLQotCXByaXZhdGUgVGV4dCB0YXJnZXROYW1lc3BhY2VUZXh0OwotCi0JcHJpdmF0ZSBUZXh0IHRhcmdldE5hbWVzcGFjZVByZWZpeFRleHQ7Ci0KLQlwcml2YXRlIFRleHQgc2NoZW1hVGFyZ2V0TmFtZXBhY2VUZXh0OwotCi0JcHJpdmF0ZSBUZXh0IHNjaGVtYVRhcmdldE5hbWVzcGFjZVByZWZpeFRleHQ7Ci0KLQlwcml2YXRlIFRleHQgc2VydmljZU5hbWVUZXh0OwotCi0JLy8gVE9ETyBuZWVkIG1vcmUgaGVyZQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLnRvb2wuY29kZWdlbi5lY2xpcHNlLnVpLkFic3RyYWN0V2l6YXJkUGFnZSNpbml0aWFsaXplRGVmYXVsdFNldHRpbmdzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRGVmYXVsdFNldHRpbmdzKCkgewotCQlzZXR0aW5ncy5wdXQoUFJFRl9KQVZBX1RBUkdFVF9OUywiIiApOwotCQlzZXR0aW5ncy5wdXQoUFJFRl9KQVZBX1RBUkdFVF9OU19QUkVGLCAiIik7Ci0JCXNldHRpbmdzLnB1dChQUkVGX0pBVkFfU0NIRU1BX1RBUkdFVF9OUywgIiIpOwotCQlzZXR0aW5ncy5wdXQoUFJFRl9KQVZBX1NDSEVNQV9UQVJHRVRfTlNfUFJFRiwgIiIpOwotCQlzZXR0aW5ncy5wdXQoUFJFRl9KQVZBX1NFUlZJQ0VfTkFNRSwgIiIpOwotCi0JfQotCi0JCi0JcHVibGljIHZvaWQgc2V0TmFtZXNwYWNlRGVmYXVsdHMoU3RyaW5nIGZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lKXsKLQkJCi0JCXRhcmdldE5hbWVzcGFjZVRleHQuc2V0VGV4dChOYW1lc3BhY2VGaW5kZXIuZ2V0VGFyZ2V0TmFtZXNwYWNlRnJvbUNsYXNzKGZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lKSk7Ci0JCXNjaGVtYVRhcmdldE5hbWVwYWNlVGV4dC5zZXRUZXh0KE5hbWVzcGFjZUZpbmRlci5nZXRTY2hlbWFUYXJnZXROYW1lc3BhY2VGcm9tQ2xhc3MoZnVsbHlRdWFsaWZpZWRDbGFzc05hbWUpKTsKLQkJCi0JCXRhcmdldE5hbWVzcGFjZVByZWZpeFRleHQuc2V0VGV4dChOYW1lc3BhY2VGaW5kZXIuZ2V0RGVmYXVsdE5hbWVzcGFjZVByZWZpeCgpKTsKLQkJc2NoZW1hVGFyZ2V0TmFtZXNwYWNlUHJlZml4VGV4dC5zZXRUZXh0KE5hbWVzcGFjZUZpbmRlci5nZXREZWZhdWx0U2NoZW1hTmFtZXNwYWNlUHJlZml4KCkpOwotCQkKLS8vCQlzZXJ2aWNlTmFtZVRleHQuc2V0VGV4dChmdWxseVF1YWxpZmllZENsYXNzTmFtZS5yZXBsYWNlQWxsKCJcXC4iLCJfIikpOwotCQlzZXJ2aWNlTmFtZVRleHQuc2V0VGV4dChOYW1lc3BhY2VGaW5kZXIuZ2V0U2VydmljZU5hbWVUZXh0KGZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lKSk7Ci0JfQotCS8qKgotCSAqIEBwYXJhbSBwYWdlTmFtZQotCSAqLwotCXB1YmxpYyBKYXZhV1NETE9wdGlvbnNQYWdlKCkgewotCQlzdXBlcigicGFnZTUiKTsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi50b29sLmNvZGVnZW4uZWNsaXBzZS51aS5Db2RlZ2VuUGFnZSNnZXRQYWdlVHlwZSgpCi0JICovCi0JcHVibGljIGludCBnZXRQYWdlVHlwZSgpIHsKLQkJcmV0dXJuIEpBVkFfMl9XU0RMX1RZUEU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlI2NyZWF0ZUNvbnRyb2wob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29udGFpbmVyID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQljb250YWluZXIuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDk7Ci0KLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29udGFpbmVyLCBTV1QuTlVMTCk7Ci0JCWxhYmVsLnNldFRleHQoQ29kZWdlbldpemFyZFBsdWdpbgotCQkJCS5nZXRSZXNvdXJjZVN0cmluZygicGFnZTUudGFyZ2V0TmFtZXNwYWNlLmxhYmVsIikpOwotCi0JCXRhcmdldE5hbWVzcGFjZVRleHQgPSBuZXcgVGV4dChjb250YWluZXIsIFNXVC5CT1JERVIgfCBTV1QuU0lOR0xFKTsKLQkJdGFyZ2V0TmFtZXNwYWNlVGV4dC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJdGFyZ2V0TmFtZXNwYWNlVGV4dC5zZXRUZXh0KHNldHRpbmdzLmdldChQUkVGX0pBVkFfVEFSR0VUX05TKSk7Ci0JCXRhcmdldE5hbWVzcGFjZVRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJc2V0dGluZ3MKLQkJCQkJCS5wdXQoUFJFRl9KQVZBX1RBUkdFVF9OUywgdGFyZ2V0TmFtZXNwYWNlVGV4dC5nZXRUZXh0KCkpOwotCQkJCS8vIGRpYWxvZ0NoYW5nZWQoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJbGFiZWwgPSBuZXcgTGFiZWwoY29udGFpbmVyLCBTV1QuTlVMTCk7Ci0JCWxhYmVsLnNldFRleHQoQ29kZWdlbldpemFyZFBsdWdpbgotCQkJCS5nZXRSZXNvdXJjZVN0cmluZygicGFnZTUudGFyZ2V0TmFtZXNwYWNlUHJlZml4LmxhYmVsIikpOwotCi0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCXRhcmdldE5hbWVzcGFjZVByZWZpeFRleHQgPSBuZXcgVGV4dChjb250YWluZXIsIFNXVC5CT1JERVIpOwotCQl0YXJnZXROYW1lc3BhY2VQcmVmaXhUZXh0LnNldExheW91dERhdGEoZ2QpOwotCQl0YXJnZXROYW1lc3BhY2VQcmVmaXhUZXh0LnNldFRleHQoc2V0dGluZ3MKLQkJCQkuZ2V0KFBSRUZfSkFWQV9UQVJHRVRfTlNfUFJFRikpOwotCQl0YXJnZXROYW1lc3BhY2VQcmVmaXhUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCXNldHRpbmdzLnB1dChQUkVGX0pBVkFfVEFSR0VUX05TX1BSRUYsCi0JCQkJCQl0YXJnZXROYW1lc3BhY2VQcmVmaXhUZXh0LmdldFRleHQoKSk7Ci0JCQkJLy8gZGlhbG9nQ2hhbmdlZCgpOwotCQkJfQotCQl9KTsKLQotCQlsYWJlbCA9IG5ldyBMYWJlbChjb250YWluZXIsIFNXVC5OVUxMKTsKLQkJbGFiZWwuc2V0VGV4dChDb2RlZ2VuV2l6YXJkUGx1Z2luCi0JCQkJLmdldFJlc291cmNlU3RyaW5nKCJwYWdlNS5zY2hlbWFUYXJnZXROcy5sYWJlbCIpKTsKLQotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlzY2hlbWFUYXJnZXROYW1lcGFjZVRleHQgPSBuZXcgVGV4dChjb250YWluZXIsIFNXVC5CT1JERVIpOwotCQlzY2hlbWFUYXJnZXROYW1lcGFjZVRleHQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXNjaGVtYVRhcmdldE5hbWVwYWNlVGV4dC5zZXRUZXh0KHNldHRpbmdzCi0JCQkJLmdldChQUkVGX0pBVkFfU0NIRU1BX1RBUkdFVF9OU19QUkVGKSk7Ci0JCXNjaGVtYVRhcmdldE5hbWVwYWNlVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQlzZXR0aW5ncy5wdXQoUFJFRl9KQVZBX1NDSEVNQV9UQVJHRVRfTlNfUFJFRiwKLQkJCQkJCXNjaGVtYVRhcmdldE5hbWVwYWNlVGV4dC5nZXRUZXh0KCkpOwotCQkJCS8vIGRpYWxvZ0NoYW5nZWQoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJbGFiZWwgPSBuZXcgTGFiZWwoY29udGFpbmVyLCBTV1QuTlVMTCk7Ci0JCWxhYmVsLnNldFRleHQoQ29kZWdlbldpemFyZFBsdWdpbgotCQkJCS5nZXRSZXNvdXJjZVN0cmluZygicGFnZTUuc2NoZW1hVGFyZ2V0TnNQcmVmaXgubGFiZWwiKSk7Ci0KLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJc2NoZW1hVGFyZ2V0TmFtZXNwYWNlUHJlZml4VGV4dCA9IG5ldyBUZXh0KGNvbnRhaW5lciwgU1dULkJPUkRFUik7Ci0JCXNjaGVtYVRhcmdldE5hbWVzcGFjZVByZWZpeFRleHQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXNjaGVtYVRhcmdldE5hbWVzcGFjZVByZWZpeFRleHQuc2V0VGV4dChzZXR0aW5ncwotCQkJCS5nZXQoUFJFRl9KQVZBX1NDSEVNQV9UQVJHRVRfTlMpKTsKLQkJc2NoZW1hVGFyZ2V0TmFtZXNwYWNlUHJlZml4VGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQlzZXR0aW5ncy5wdXQoUFJFRl9KQVZBX1NDSEVNQV9UQVJHRVRfTlMsCi0JCQkJCQlzY2hlbWFUYXJnZXROYW1lc3BhY2VQcmVmaXhUZXh0LmdldFRleHQoKSk7Ci0JCQkJLy8gZGlhbG9nQ2hhbmdlZCgpOwotCQkJfQotCQl9KTsKLQotCQlsYWJlbCA9IG5ldyBMYWJlbChjb250YWluZXIsIFNXVC5OVUxMKTsKLQkJbGFiZWwuc2V0VGV4dChDb2RlZ2VuV2l6YXJkUGx1Z2luCi0JCQkJLmdldFJlc291cmNlU3RyaW5nKCJwYWdlNS5zZXJ2aWNlTmFtZS5sYWJlbCIpKTsKLQotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlzZXJ2aWNlTmFtZVRleHQgPSBuZXcgVGV4dChjb250YWluZXIsIFNXVC5CT1JERVIpOwotCQlzZXJ2aWNlTmFtZVRleHQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXNlcnZpY2VOYW1lVGV4dC5zZXRUZXh0KHNldHRpbmdzCi0JCQkJLmdldChQUkVGX0pBVkFfU0NIRU1BX1RBUkdFVF9OUykpOwotCQlzZXJ2aWNlTmFtZVRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJc2V0dGluZ3MucHV0KFBSRUZfSkFWQV9TRVJWSUNFX05BTUUsCi0JCQkJCQlzZXJ2aWNlTmFtZVRleHQuZ2V0VGV4dCgpKTsKLQkJCQlkaWFsb2dDaGFuZ2VkKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCXNldENvbnRyb2woY29udGFpbmVyKTsKLQkJCi0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRhcmdldE5hbWVzcGFjZSgpIHsKLQkJcmV0dXJuIHRoaXMudGFyZ2V0TmFtZXNwYWNlVGV4dC5nZXRUZXh0KCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUYXJnZXROYW1lc3BhY2VQcmVmaXgoKSB7Ci0JCXJldHVybiB0aGlzLnRhcmdldE5hbWVzcGFjZVByZWZpeFRleHQuZ2V0VGV4dCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U2NoZW1hVGFyZ2V0TmFtZXNwYWNlKCkgewotCQlyZXR1cm4gdGhpcy5zY2hlbWFUYXJnZXROYW1lcGFjZVRleHQuZ2V0VGV4dCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U2NoZW1hVGFyZ2V0TmFtZXNwYWNlUHJlZml4KCkgewotCQlyZXR1cm4gdGhpcy5zY2hlbWFUYXJnZXROYW1lc3BhY2VQcmVmaXhUZXh0LmdldFRleHQoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNlcnZpY2VOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5zZXJ2aWNlTmFtZVRleHQuZ2V0VGV4dCgpOwotCX0KLQotICAgIC8qKgotICAgICAqIEhhbmRsZSB0aGUgZGlhbG9nIGNoYW5nZSBldmVudC4gQmFzaWNhbGx5IGV2YWx1YXRlcyB0aGUgZmlsZSBuYW1lIGFuZAotICAgICAqIHNldHMgdGhlIGVycm9yIG1lc3NhZ2UgYWNjb3JkaW5nbHkKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgZGlhbG9nQ2hhbmdlZCgpIHsKLSAgICAgICAgU3RyaW5nIGZpbGVOYW1lID0gZ2V0U2VydmljZU5hbWUoKTsKLQotICAgICAgICBpZiAoZmlsZU5hbWUubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgdXBkYXRlU3RhdHVzKENvZGVnZW5XaXphcmRQbHVnaW4KLSAgICAgICAgICAgICAgICAgICAgLmdldFJlc291cmNlU3RyaW5nKCJwYWdlNS5lcnJvci5maWxlbWlzc2luZ2Vycm9yIikpOwotICAgICAgICAgICAgcmV0dXJuOwotCX0KLSAgICAgICAgLy8gdXBkYXRlIHRoZSBzdGF0dXMKLSAgICAgICAgdXBkYXRlU3RhdHVzKG51bGwpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLWNvZGVnZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL2NvZGVnZW4vZWNsaXBzZS91aS9KYXZhV1NETE91dHB1dExvY2F0aW9uUGFnZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLWNvZGVnZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL2NvZGVnZW4vZWNsaXBzZS91aS9KYXZhV1NETE91dHB1dExvY2F0aW9uUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjg2ODRmLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1jb2RlZ2VuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9jb2RlZ2VuL2VjbGlwc2UvdWkvSmF2YVdTRExPdXRwdXRMb2NhdGlvblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudG9vbC5jb2RlZ2VuLmVjbGlwc2UudWk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRvb2wuY29kZWdlbi5lY2xpcHNlLnBsdWdpbi5Db2RlZ2VuV2l6YXJkUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlyZWN0b3J5RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5Db250YWluZXJTZWxlY3Rpb25EaWFsb2c7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhV1NETE91dHB1dExvY2F0aW9uUGFnZSBleHRlbmRzIEFic3RyYWN0V2l6YXJkUGFnZSB7Ci0KLQlwcml2YXRlIFRleHQgb3V0cHV0Rm9sZGVyVGV4dEJveDsKLQotCXByaXZhdGUgVGV4dCBvdXRwdXRGaWxlTmFtZVRleHRCb3g7Ci0KLQlwcml2YXRlIEJ1dHRvbiB3b3Jrc3BhY2VQcm9qZWN0T3B0aW9uc0J1dHRvbjsKLQotCXByaXZhdGUgQnV0dG9uIGZpbGVzeVN0ZW1PcHRpb25zQnV0dG9uOwotCi0JcHJpdmF0ZSBib29sZWFuIHdvcmtzcGFjZVNhdmVPcHRpb24gPSBmYWxzZTsKLQotCS8qKgotCSAqIEBwYXJhbSBwYWdlTmFtZQotCSAqLwotCXB1YmxpYyBKYXZhV1NETE91dHB1dExvY2F0aW9uUGFnZSgpIHsKLQkJc3VwZXIoInBhZ2U2Iik7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi50b29sLmNvZGVnZW4uZWNsaXBzZS51aS5BYnN0cmFjdFdpemFyZFBhZ2UjaW5pdGlhbGl6ZURlZmF1bHRTZXR0aW5ncygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRTZXR0aW5ncygpIHsKLQkJc2V0dGluZ3MucHV0KFBSRUZfSkFWQV9PVVRQVVRfV1NETF9MT0NBVElPTiwgIiIpOwotCQlzZXR0aW5ncy5wdXQoSkFWQV9PVVRQVVRfV1NETF9OQU1FLCAic2VydmljZXMud3NkbCIpOwotCQlzZXR0aW5ncy5wdXQoUFJFRl9KQVZBX09VVFBVVF9GSUxFU1lBVEVNLCB0cnVlKTsKLQkJc2V0dGluZ3MucHV0KFBSRUZfSkFWQV9PVVRQVVRfV09SS1NQQUNFLCBmYWxzZSk7Ci0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLnRvb2wuY29kZWdlbi5lY2xpcHNlLnVpLkFic3RyYWN0V2l6YXJkUGFnZSNnZXRQYWdlVHlwZSgpCi0JICovCi0JcHVibGljIGludCBnZXRQYWdlVHlwZSgpIHsKLQkJcmV0dXJuIEpBVkFfMl9XU0RMX1RZUEU7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQkvL2xheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSA5OwotCQljb250YWluZXIuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCUxhYmVsIHNlbGVjdExhYmVsID0gbmV3IExhYmVsKGNvbnRhaW5lciwgU1dULk5VTEwpOwotCQlzZWxlY3RMYWJlbAotCQkJCS5zZXRUZXh0KENvZGVnZW5XaXphcmRQbHVnaW4KLQkJCQkJCS5nZXRSZXNvdXJjZVN0cmluZygiU2VsZWN0IHRoZSBsb2NhdGlvbiB3aGVyZSB0byBwdXQgdGhlIG91dHB1dCIpKTsKLQkJc2VsZWN0TGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQl3b3Jrc3BhY2VQcm9qZWN0T3B0aW9uc0J1dHRvbiA9IG5ldyBCdXR0b24oY29udGFpbmVyLCBTV1QuUkFESU8pOwotCQl3b3Jrc3BhY2VQcm9qZWN0T3B0aW9uc0J1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLQkJd29ya3NwYWNlUHJvamVjdE9wdGlvbnNCdXR0b24uc2V0VGV4dChDb2RlZ2VuV2l6YXJkUGx1Z2luCi0JCQkJLmdldFJlc291cmNlU3RyaW5nKCJwYWdlNi53b3Jrc3BhY2UuY2FwdGlvbiIpKTsKLQkJd29ya3NwYWNlUHJvamVjdE9wdGlvbnNCdXR0b24uc2V0VG9vbFRpcFRleHQoQ29kZWdlbldpemFyZFBsdWdpbgotCQkJCS5nZXRSZXNvdXJjZVN0cmluZygicGFnZTYud29ya3NwYWNlLmRlc2MiKSk7Ci0JCXdvcmtzcGFjZVByb2plY3RPcHRpb25zQnV0dG9uLnNldFNlbGVjdGlvbihzZXR0aW5ncwotCQkJCS5nZXRCb29sZWFuKFBSRUZfSkFWQV9PVVRQVVRfV09SS1NQQUNFKSk7Ci0JCXdvcmtzcGFjZVByb2plY3RPcHRpb25zQnV0dG9uCi0JCQkJLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQloYW5kbGVDaGVja2JveFNlbGVjdGlvbigpOwotCQkJCQl9Ci0JCQkJfSk7Ci0KLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlmaWxlc3lTdGVtT3B0aW9uc0J1dHRvbiA9IG5ldyBCdXR0b24oY29udGFpbmVyLCBTV1QuUkFESU8pOwotCQlmaWxlc3lTdGVtT3B0aW9uc0J1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLQkJZmlsZXN5U3RlbU9wdGlvbnNCdXR0b24uc2V0VGV4dChDb2RlZ2VuV2l6YXJkUGx1Z2luCi0JCQkJLmdldFJlc291cmNlU3RyaW5nKCJwYWdlNi5maWxlc3lzdGVtLmNhcHRpb24iKSk7Ci0JCWZpbGVzeVN0ZW1PcHRpb25zQnV0dG9uLnNldFRvb2xUaXBUZXh0KENvZGVnZW5XaXphcmRQbHVnaW4KLQkJCQkuZ2V0UmVzb3VyY2VTdHJpbmcoInBhZ2U2LmZpbGVzeXN0ZW0uZGVzYyIpKTsKLQkJZmlsZXN5U3RlbU9wdGlvbnNCdXR0b24uc2V0U2VsZWN0aW9uKHNldHRpbmdzCi0JCQkJLmdldEJvb2xlYW4oUFJFRl9KQVZBX09VVFBVVF9GSUxFU1lBVEVNKSk7Ci0JCWZpbGVzeVN0ZW1PcHRpb25zQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWhhbmRsZUNoZWNrYm94U2VsZWN0aW9uKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCUxhYmVsIGxhYmVsMSA9IG5ldyBMYWJlbChjb250YWluZXIsIFNXVC5OVUxMKTsKLQkJbGFiZWwxLnNldFRleHQoQ29kZWdlbldpemFyZFBsdWdpbgotCQkJCS5nZXRSZXNvdXJjZVN0cmluZygicGFnZTYub3V0cHV0LmxhYmVsIikpOwotCi0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCW91dHB1dEZvbGRlclRleHRCb3ggPSBuZXcgVGV4dChjb250YWluZXIsIFNXVC5CT1JERVIpOwotCQlvdXRwdXRGb2xkZXJUZXh0Qm94LnNldExheW91dERhdGEoZ2QpOwotCQlvdXRwdXRGb2xkZXJUZXh0Qm94LnNldFRleHQoIiIpOwotCQlvdXRwdXRGb2xkZXJUZXh0Qm94LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCWhhbmRsZUZvbGRlclRleHRDaGFuZ2UoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJQnV0dG9uIGJyb3dzZUJ1dHRvbiA9IG5ldyBCdXR0b24oY29udGFpbmVyLCBTV1QuUFVTSCk7Ci0JCWJyb3dzZUJ1dHRvbi5zZXRUZXh0KENvZGVnZW5XaXphcmRQbHVnaW4KLQkJCQkuZ2V0UmVzb3VyY2VTdHJpbmcoImdlbmVyYWwuYnJvd3NlIikpOwotCQlicm93c2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWhhbmRsZUJyb3dzZSgpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJfQotCQl9KTsKLQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb250YWluZXIsIFNXVC5OVUxMKTsKLQkJbGFiZWwuc2V0VGV4dChDb2RlZ2VuV2l6YXJkUGx1Z2luCi0JCQkJLmdldFJlc291cmNlU3RyaW5nKCJwYWdlNi5vdXRwdXRuYW1lLmxhYmVsIikpOwotCi0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJb3V0cHV0RmlsZU5hbWVUZXh0Qm94ID0gbmV3IFRleHQoY29udGFpbmVyLCBTV1QuQk9SREVSKTsKLQkJb3V0cHV0RmlsZU5hbWVUZXh0Qm94LnNldExheW91dERhdGEoZ2QpOwotCQlvdXRwdXRGaWxlTmFtZVRleHRCb3guc2V0VGV4dChzZXR0aW5ncy5nZXQoSkFWQV9PVVRQVVRfV1NETF9OQU1FKSk7Ci0JCW91dHB1dEZpbGVOYW1lVGV4dEJveC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQloYW5kbGVGaWxlTmFtZVRleHRDaGFuZ2UoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJaWYgKHJlc3RvcmVkRnJvbVByZXZpb3VzU2V0dGluZ3MpIHsKLQkJCWhhbmRsZUZvbGRlclRleHRDaGFuZ2UoKTsKLQkJCWhhbmRsZUZvbGRlclRleHRDaGFuZ2UoKTsKLQkJfQotCi0JCXNldENvbnRyb2woY29udGFpbmVyKTsKLQotCX0KLQotCXByaXZhdGUgdm9pZCBoYW5kbGVDaGVja2JveFNlbGVjdGlvbigpIHsKLQkJaWYgKHdvcmtzcGFjZVByb2plY3RPcHRpb25zQnV0dG9uLmdldFNlbGVjdGlvbigpKSB7Ci0JCQlzZXR0aW5ncy5wdXQoUFJFRl9KQVZBX09VVFBVVF9XT1JLU1BBQ0UsIHRydWUpOwotCQkJc2V0dGluZ3MucHV0KFBSRUZfSkFWQV9PVVRQVVRfRklMRVNZQVRFTSwgZmFsc2UpOwotCQkJd29ya3NwYWNlU2F2ZU9wdGlvbiA9IHRydWU7Ci0JCX0gZWxzZSBpZiAoZmlsZXN5U3RlbU9wdGlvbnNCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCXNldHRpbmdzLnB1dChQUkVGX0pBVkFfT1VUUFVUX0ZJTEVTWUFURU0sIHRydWUpOwotCQkJc2V0dGluZ3MucHV0KFBSRUZfSkFWQV9PVVRQVVRfV09SS1NQQUNFLCBmYWxzZSk7Ci0JCQl3b3Jrc3BhY2VTYXZlT3B0aW9uID0gZmFsc2U7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlRm9sZGVyVGV4dENoYW5nZSgpIHsKLQkJU3RyaW5nIG91dHB1dEZvbGRlciA9IG91dHB1dEZvbGRlclRleHRCb3guZ2V0VGV4dCgpOwotCQlzZXR0aW5ncy5wdXQoUFJFRl9KQVZBX09VVFBVVF9XU0RMX0xPQ0FUSU9OLCBvdXRwdXRGb2xkZXIpOwotCQlpZiAoIiIuZXF1YWxzKG91dHB1dEZvbGRlci50cmltKCkpKSB7Ci0JCQl1cGRhdGVTdGF0dXMoIklucHV0IGEgcHJvcGVyIGxvY2F0aW9uIGZvciB0aGUgb3V0cHV0Iik7Ci0JCX0gZWxzZSB7Ci0JCQl1cGRhdGVTdGF0dXMobnVsbCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlRmlsZU5hbWVUZXh0Q2hhbmdlKCkgewotCQlTdHJpbmcgb3V0RmlsZU5hbWUgPSBvdXRwdXRGaWxlTmFtZVRleHRCb3guZ2V0VGV4dCgpOwotCQlzZXR0aW5ncy5wdXQoSkFWQV9PVVRQVVRfV1NETF9OQU1FLCBvdXRGaWxlTmFtZSk7Ci0JCWlmICgiIi5lcXVhbHMob3V0RmlsZU5hbWUudHJpbSgpKSkgewotCQkJdXBkYXRlU3RhdHVzKCJJbnB1dCBhIGZpbGUgbmFtZSIpOwotCQl9IGVsc2UgaWYgKG91dEZpbGVOYW1lLm1hdGNoZXMoIlxcVyIpKSB7Ci0JCQl1cGRhdGVTdGF0dXMoIklucHV0IGEgdmFsaWQgZmlsZSBuYW1lIik7Ci0JCX0gZWxzZSBpZiAoIShvdXRGaWxlTmFtZS5lbmRzV2l0aCgiLndzZGwiKSB8fCBvdXRGaWxlTmFtZS5lbmRzV2l0aCgiLnhtbCIpKSApIHsKLQkJCXVwZGF0ZVN0YXR1cygiSW5wdXQgYSB2YWxpZCBmaWxlIG5hbWUgLCBFeGFtcGxlIDogc2VydmljZXMud3NkbCBvciBzZXJ2aWNlcy54bWwiKTsKLQkJfSBlbHNlIHsKLQkJCXVwZGF0ZVN0YXR1cyhudWxsKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBoYW5kbGVCcm93c2UoKSB7Ci0KLQkJLy8gICAgCWJvb2xlYW4gbG9jYXRpb24gPSBsb2NhdGlvblNlbGVjdENoZWNrQm94LmdldFNlbGVjdGlvbigpOwotCQlib29sZWFuIGxvY2F0aW9uID0gZmFsc2U7Ci0JCWlmKHNldHRpbmdzLmdldEJvb2xlYW4oUFJFRl9KQVZBX09VVFBVVF9GSUxFU1lBVEVNKSl7Ci0JCQlsb2NhdGlvbiA9IGZhbHNlOwotCQl9ZWxzZSBpZihzZXR0aW5ncy5nZXRCb29sZWFuKFBSRUZfSkFWQV9PVVRQVVRfV09SS1NQQUNFKSl7Ci0JCQlsb2NhdGlvbiA9IHRydWU7Ci0JCX0KLQkJaWYgKHdvcmtzcGFjZVNhdmVPcHRpb24pIHsKLQkJCWxvY2F0aW9uID0gdHJ1ZTsKLQkJfQotCQlpZiAoIWxvY2F0aW9uKSB7Ci0JCQlEaXJlY3RvcnlEaWFsb2cgZGlhbG9nID0gbmV3IERpcmVjdG9yeURpYWxvZyh0aGlzLmdldFNoZWxsKCkpOwotCQkJU3RyaW5nIHJldHVyblN0cmluZyA9IGRpYWxvZy5vcGVuKCk7Ci0JCQlpZiAocmV0dXJuU3RyaW5nICE9IG51bGwpIHsKLQkJCQlvdXRwdXRGb2xkZXJUZXh0Qm94LnNldFRleHQocmV0dXJuU3RyaW5nKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCUlXb3Jrc3BhY2VSb290IHJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCi0JCQlDb250YWluZXJTZWxlY3Rpb25EaWFsb2cgZGlhbG9nID0gbmV3IENvbnRhaW5lclNlbGVjdGlvbkRpYWxvZygKLQkJCQkJZ2V0U2hlbGwoKSwgcm9vdCwgZmFsc2UsIENvZGVnZW5XaXphcmRQbHVnaW4KLQkJCQkJCQkuZ2V0UmVzb3VyY2VTdHJpbmcoInBhZ2UzLmNvbnRhaW5lcmJveC50aXRsZSIpKTsKLQkJCWlmIChkaWFsb2cub3BlbigpID09IENvbnRhaW5lclNlbGVjdGlvbkRpYWxvZy5PSykgewotCQkJCU9iamVjdFtdIHJlc3VsdCA9IGRpYWxvZy5nZXRSZXN1bHQoKTsKLQkJCQlpZiAocmVzdWx0Lmxlbmd0aCA9PSAxKSB7Ci0JCQkJCVBhdGggcGF0aCA9ICgoUGF0aCkgcmVzdWx0WzBdKTsKLQkJCQkJLy8gYXBwZW5kIHRvIHRoZSB3b3Jrc3BhY2UgcGF0aAotCQkJCQlpZiAocm9vdC5leGlzdHMocGF0aCkpIHsKLQkJCQkJCW91dHB1dEZvbGRlclRleHRCb3guc2V0VGV4dChyb290LmdldExvY2F0aW9uKCkuYXBwZW5kKAotCQkJCQkJCQlwYXRoKS50b0ZpbGUoKS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RnVsbEZpbGVOYW1lKCkgewotCQlTdHJpbmcgZm9sZGVyID0gdGhpcy5vdXRwdXRGb2xkZXJUZXh0Qm94LmdldFRleHQoKTsKLQkJU3RyaW5nIGZpbGVOYW1lID0gdGhpcy5vdXRwdXRGaWxlTmFtZVRleHRCb3guZ2V0VGV4dCgpOwotCQlpZiAoIWZpbGVOYW1lLmVuZHNXaXRoKCIud3NkbCIpKSB7Ci0JCQlmaWxlTmFtZSA9IGZpbGVOYW1lICsgIi53c2RsIjsKLQkJfQotCQlyZXR1cm4gZm9sZGVyICsgRmlsZS5zZXBhcmF0b3IgKyBmaWxlTmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE91dHB1dFdTRExOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5vdXRwdXRGaWxlTmFtZVRleHRCb3guZ2V0VGV4dCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0T3V0cHV0TG9jYXRpb24oKSB7Ci0JCXJldHVybiB0aGlzLm91dHB1dEZvbGRlclRleHRCb3guZ2V0VGV4dCgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLWNvZGVnZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL2NvZGVnZW4vZWNsaXBzZS91aS9PcHRpb25zUGFnZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLWNvZGVnZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL2NvZGVnZW4vZWNsaXBzZS91aS9PcHRpb25zUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGQ0MGY4Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1jb2RlZ2VuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9jb2RlZ2VuL2VjbGlwc2UvdWkvT3B0aW9uc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyODIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnRvb2wuY29kZWdlbi5lY2xpcHNlLnVpOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29sLmNvZGVnZW4uZWNsaXBzZS5wbHVnaW4uQ29kZWdlbldpemFyZFBsdWdpbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRvb2wuY29kZWdlbi5lY2xpcHNlLnV0aWwuVUlDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29sLmNvZGVnZW4uZWNsaXBzZS51dGlsLldTRExQcm9wZXJ0eVJlYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLlVSTFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uVGFibGVFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotaW1wb3J0IGphdmF4LndzZGwuV1NETEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogT3B0aW9ucyBQYWdlIGxldHMgdGhlIHVzZXIgY2hhbmdlIGdlbmVyYWwgc2V0dGluZ3Mgb24gdGhlIGNvZGUgZ2VuZXJhdGlvbi4gSXQKLSAqIGlzIHVzZWQgaW4gdGhlIENvZGVnZW5XaXphcmRQbHVnaW4sIENvZGVHZW5XaXphcmQuCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIE9wdGlvbnNQYWdlIGV4dGVuZHMgQWJzdHJhY3RXaXphcmRQYWdlIGltcGxlbWVudHMgVUlDb25zdGFudHMgewotCi0JLyoqCi0JICogU2VsZWN0aW9uIGxpc3QgZm9yIHRhcmdldCBsYW5ndWFnZXMKLQkgKi8KLQlwcml2YXRlIENvbWJvIGxhbmd1YWdlU2VsZWN0aW9uQ29tYm9Cb3g7Ci0KLQkvKioKLQkgKiBBIHJhZGlvIGJ1dHRvbiB0byBlbmFibGUvZGlzYWJsZSBjb2RlIGdlbmVyYXRpb24gZm9yIHN5bmNocm9ub3VzIGFuZAotCSAqIGFzeW5jaHJvbm91cyBjYWxscy4KLQkgKi8KLQlwcml2YXRlIEJ1dHRvbiBzeW5jQW5kQXN5bmNSYWRpb0J1dHRvbjsKLQotCS8qKgotCSAqIEEgcmFkaW8gYnV0dG9uIHRvIGNob29zZSAic3luY2hyb25vdXMgb25seSIgY29kZSBnZW5lcmF0aW9uCi0JICovCi0JcHJpdmF0ZSBCdXR0b24gc3luY09ubHlSYWRpb0J1dHRvbjsKLQotCS8qKgotCSAqIEEgcmFkaW8gYnV0dG9uIHRvIGNob29zZSAiYXN5bmNocm9ub3VzIG9ubHkiIGNvZGUgZ2VuZXJhdGlvbgotCSAqLwotCXByaXZhdGUgQnV0dG9uIGFzeW5jT25seVJhZGlvQnV0dG9uOwotCi0JLyoqCi0JICogTGFiZWwgaG9sZGluZyB0aGUgZnVsbCBxdWFsaWZpZWQgcGFja2FnZSBuYW1lIGZvciBnZW5lcmF0ZWQgY29kZQotCSAqLwotCXByaXZhdGUgVGV4dCBwYWNrYWdlVGV4dDsKLQotCS8qKgotCSAqIENoZWNrYm94IHRvIGVuYWJsZSBzZXJ2ZXItc2lkZSBza2VsZXRvbiBjb2RlIGdlbmVyYXRpb24uIElmIGVuYWJsZWQsCi0JICogZ2VuZXJhdGVzIGFuIGVtcHR5IGltcGxlbWVudGF0aW9uIG9mIHRoZSBzZXJ2aWNlCi0JICovCi0JcHJpdmF0ZSBCdXR0b24gc2VydmVyU2lkZUNoZWNrQm94QnV0dG9uOwotCQotCS8qKgotCSAqIENoZWNrYm94IHRvIGVuYWJsZSBjbGllbnQgc2lkZSBjb2RlIGdlbmVyYXRpb24uIElmIGVuYWJsZWQsCi0JICogZ2VuZXJhdGVzIGFuIGVtcHR5IGltcGxlbWVudGF0aW9uIG9mIHRoZSBzZXJ2aWNlCi0JICovCi0JcHJpdmF0ZSBCdXR0b24gY2xpZW50U2lkZUNoZWNrQm94QnV0dG9uOwotCi0JLyoqCi0JICogQ2hlY2tib3ggdG8gZW5hYmxlIHRoZSBnZW5lcmF0aW9uIG9mIHRlc3QgY2FzZSBjbGFzc2VzIGZvciB0aGUgZ2VuZXJhdGVkCi0JICogaW1wbGVtZW50YXRpb24gb2YgdGhlIHdlYnNlcnZpY2UuCi0JICovCi0JcHJpdmF0ZSBCdXR0b24gdGVzdENhc2VDaGVja0JveEJ1dHRvbjsKLQotCS8qKgotCSAqIENoZWNrYm94IHRvIGVuYWJsZSB0aGUgZ2VuZXJhdGlvbiBvZiBhIGRlZmF1bHQgc2VydmVyLnhtbCBjb25maWd1cmF0aW9uCi0JICogZmlsZQotCSAqLwotCXByaXZhdGUgQnV0dG9uIHNlcnZlclhNTENoZWNrQm94QnV0dG9uOwotCi0JLyoqCi0JICogQ2hlY2tib3ggdG8gZW5hYmxlIHRoZSBnZW5lcmF0ZSBhbGwgY2xhc3NlcwotCSAqLwotCXByaXZhdGUgQnV0dG9uIGdlbmVyYXRlQWxsQ2hlY2tCb3hCdXR0b247Ci0JCi0JLyoqCi0JICogIGNoZWNrIGJveCBmb3Igc2VydmVyIHNpZGUgaW50ZXJmYWNlCi0JICovCi0JcHJpdmF0ZSBCdXR0b24gZ2VuZXJhdGVTZXJ2ZXJTaWRlSW50ZXJmYWNlQ2hlY2tCb3hCdXR0b247Ci0KLQlwcml2YXRlIENvbWJvIGRhdGFiaW5kaW5nVHlwZUNvbWJvOwotCi0JLyoqCi0JICogVGV4dCBib3ggdG8gaGF2ZSB0aGUgcG9ydG5hbWUKLQkgKi8KLQlwcml2YXRlIENvbWJvIHBvcnROYW1lQ29tYm87Ci0KLQkvKioKLQkgKiBUZXh0IGJveCB0byBoYXZlIHRoZSBzZXJ2aWNlIG5hbWUKLQkgKi8KLQlwcml2YXRlIENvbWJvIHNlcnZpY2VOYW1lQ29tYm87Ci0JCi0JcHJpdmF0ZSBCdXR0b24gYWR2YW5jZU9wdGlvbnNCdXR0b247Ci0KLQlwcml2YXRlIFdTRExQcm9wZXJ0eVJlYWRlciByZWFkZXI7Ci0KLQlwcml2YXRlIGphdmEudXRpbC5MaXN0IHNlcnZpY2VRTmFtZUxpc3QgPSBudWxsOwotCQotCXByaXZhdGUgZmluYWwgaW50IEVESVRBQkxFQ09MVU1OID0gMTsKLQlwcml2YXRlIFN0cmluZyBkZWZhdWx0UGFja2FnZU5hbWUgPSBudWxsOwotCQotCXByaXZhdGUgQ29tYm8gY29kZWdlbk9wdGlvblNlbGVjdGlvbkNvbWJvQm94OwotCQotCS8qKgotCSAqIEEgdGFibGUgdG8ga2VlcCB0aGUgbmFtZXNwYWNlIHRvIAotCSAqIHBhY2thZ2UgbWFwcGluZ3MKLQkgKi8KLQlwcml2YXRlIFRhYmxlIG5hbWVzcGFjZTJwYWNrYWdlVGFibGUgPSBudWxsOwotCQotCXByaXZhdGUgSGFzaE1hcCBhZHZhbmNlT3B0aW9uczsKLQkKLQlDb21wb3NpdGUgY29udGFpbmVyOwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgcGFnZSBhbmQgaW5pdGlhbGl6ZSBzb21lIHNldHRpbmdzCi0JICovCi0JcHVibGljIE9wdGlvbnNQYWdlKCkgewotCQlzdXBlcigicGFnZTIiKTsKLQkJYWR2YW5jZU9wdGlvbnM9Z2V0SW5pdGlhbGlzZWRBZHZhbmNlT3B0aW9ucygpOwotCX0KLQotCXByaXZhdGUgSGFzaE1hcCBnZXRJbml0aWFsaXNlZEFkdmFuY2VPcHRpb25zKCl7Ci0JCUhhc2hNYXAgYWR2YW5jZU9wdGlvbnM9bmV3IEhhc2hNYXAoKTsKLQkJYWR2YW5jZU9wdGlvbnMucHV0KENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5VTlBBQ0tfQ0xBU1NFU19PUFRJT04sIG5ldyBTdHJpbmdbMF0pOwotCQlyZXR1cm4gYWR2YW5jZU9wdGlvbnM7Ci0JfQotCS8qKgotCSAqIFNldHMgdGhlIGRlZmF1bHQgdmFsdWVzIGZvciB0aGUgT3B0aW9ucyBwYWdlCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRTZXR0aW5ncygpIHsKLQkJc2V0dGluZ3MucHV0KFBSRUZfQ0hFQ0tfR0VORVJBVEVfU0VSVkVSQ09ORklHLCBmYWxzZSk7Ci0JCXNldHRpbmdzLnB1dChQUkVGX0NIRUNLX0dFTkVSQVRFX1NFUlZFUlNJREUsIGZhbHNlKTsKLQkJc2V0dGluZ3MucHV0KFBSRUZfQ0hFQ0tfR0VORVJBVEVfVEVTVENBU0UsIGZhbHNlKTsKLQkJc2V0dGluZ3MucHV0KFBSRUZfTEFOR1VBR0VfSU5ERVgsIDApOwotCQlzZXR0aW5ncy5wdXQoUFJFRl9QQUNLQUdFX05BTUUsIERFRkFVTFRfUEFDS0FHRU5BTUUpOwotCQlzZXR0aW5ncy5wdXQoUFJFRl9SQURJT19BU1lOQ19PTkxZLCBmYWxzZSk7Ci0JCXNldHRpbmdzLnB1dChQUkVGX1JBRElPX1NZTkNfQU5EX0FTWU5DLCB0cnVlKTsKLQkJc2V0dGluZ3MucHV0KFBSRUZfUkFESU9fU1lOQ19PTkxZLCBmYWxzZSk7Ci0JCXNldHRpbmdzLnB1dChQUkVGX0NPTUJPX1BPUlROQU1FX0lOREVYLCAwKTsKLQkJc2V0dGluZ3MucHV0KFBSRUZfQ09NQk9fU0VSVklDRU5BTUVfSU5ERVgsIDApOwotCQlzZXR0aW5ncy5wdXQoUFJFRl9EQVRBQklOREVSX0lOREVYLCAwKTsKLQkJc2V0dGluZ3MucHV0KFBSRUZfR0VOX0FMTCwgZmFsc2UpOwotCQlzZXR0aW5ncy5wdXQoUFJFRl9HRU5fU1NfSU5URVJGQUNFLCBmYWxzZSk7Ci0JfQotCi0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2UjY3JlYXRlQ29udHJvbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJY29udGFpbmVyID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQljb250YWluZXIuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMzsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQotCSAgICBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb250YWluZXIsIFNXVC5OVUxMKTsKLQkgICAgbGFiZWwuc2V0VGV4dChDb2RlZ2VuV2l6YXJkUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJwYWdlMi5vcHRpb25zLmRlc2MiKSk7Ci0JICAgIGxhYmVsLnNldExheW91dERhdGEoZ2QpOwotCSAgICAKLQkgICAgICAgIAotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0KLQkJY29kZWdlbk9wdGlvblNlbGVjdGlvbkNvbWJvQm94ID0gbmV3IENvbWJvKGNvbnRhaW5lciwgU1dULkRST1BfRE9XTnwgU1dULkJPUkRFUiB8IFNXVC5SRUFEX09OTFkpOwotCQkvLyBmaWxsIHRoZSBjb21ibwotCQl0aGlzLmZpbGxDb2RlZ2VuT3B0aW9uU2VsZWN0aW9uQ29tYm9Cb3goKTsKLQkJY29kZWdlbk9wdGlvblNlbGVjdGlvbkNvbWJvQm94LnNldExheW91dERhdGEoZ2QpOwotCQlzZXR0aW5ncy5wdXQoUFJFRl9DT0RFR0VOX09QVElPTl9JTkRFWCwgY29kZWdlbk9wdGlvblNlbGVjdGlvbkNvbWJvQm94Ci0JCQkJLmdldFNlbGVjdGlvbkluZGV4KCkpOwotCQljb2RlZ2VuT3B0aW9uU2VsZWN0aW9uQ29tYm9Cb3guc2VsZWN0KHNldHRpbmdzLmdldEludChQUkVGX0NPREVHRU5fT1BUSU9OX0lOREVYKSk7Ci0JCWNvZGVnZW5PcHRpb25TZWxlY3Rpb25Db21ib0JveC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc2V0dGluZ3MucHV0KFBSRUZfQ09ERUdFTl9PUFRJT05fSU5ERVgsIGNvZGVnZW5PcHRpb25TZWxlY3Rpb25Db21ib0JveAotCQkJCQkJLmdldFNlbGVjdGlvbkluZGV4KCkpOwotCQkJCWlmIChjb2RlZ2VuT3B0aW9uU2VsZWN0aW9uQ29tYm9Cb3gKLQkJCQkJCS5nZXRTZWxlY3Rpb25JbmRleCgpID09IDAgKXsKLQkJCQkJZGlzYWJsZUNvbnRyb2xzKCk7Ci0JCQkJCQotCQkJCX1lbHNlIGlmIChjb2RlZ2VuT3B0aW9uU2VsZWN0aW9uQ29tYm9Cb3gKLQkJCQkJCS5nZXRTZWxlY3Rpb25JbmRleCgpID09IDEpewotCQkJCQllbmFibGVDb250cm9scygpOwotCQkJCX0KLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCX0KLQkJfSk7Ci0JCQkKLQkJCQotCQkJCi0JCQkKLQotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0KLQkJTGFiZWwgbGFiZWwxID0gbmV3IExhYmVsKGNvbnRhaW5lciwgU1dULk5VTEwpOwotCQlsYWJlbDEuc2V0VGV4dChDb2RlZ2VuV2l6YXJkUGx1Z2luCi0JCQkJLmdldFJlc291cmNlU3RyaW5nKCJwYWdlMi5sYW5ndWFnZS5jYXB0aW9uIikpOwotCi0JCWxhbmd1YWdlU2VsZWN0aW9uQ29tYm9Cb3ggPSBuZXcgQ29tYm8oY29udGFpbmVyLCBTV1QuRFJPUF9ET1dOfCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSk7Ci0JCS8vIGZpbGwgdGhlIGNvbWJvCi0JCXRoaXMuZmlsbExhbmd1YWdlQ29tYm8oKTsKLQkJbGFuZ3VhZ2VTZWxlY3Rpb25Db21ib0JveC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJbGFuZ3VhZ2VTZWxlY3Rpb25Db21ib0JveC5zZWxlY3Qoc2V0dGluZ3MuZ2V0SW50KFBSRUZfTEFOR1VBR0VfSU5ERVgpKTsKLQkJbGFuZ3VhZ2VTZWxlY3Rpb25Db21ib0JveC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc2V0dGluZ3MucHV0KFBSRUZfTEFOR1VBR0VfSU5ERVgsIGxhbmd1YWdlU2VsZWN0aW9uQ29tYm9Cb3gKLQkJCQkJCS5nZXRTZWxlY3Rpb25JbmRleCgpKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCX0KLQkJfSk7Ci0JCQotCQkvLyBzZXJ2aWNlIG5hbWUKLQkJbGFiZWwgPSBuZXcgTGFiZWwoY29udGFpbmVyLCBTV1QuTlVMTCk7Ci0JCWxhYmVsLnNldFRleHQoQ29kZWdlbldpemFyZFBsdWdpbgotCQkJCS5nZXRSZXNvdXJjZVN0cmluZygicGFnZTIuc2VydmljZU5hbWUuY2FwdGlvbiIpKTsKLQotCQlzZXJ2aWNlTmFtZUNvbWJvID0gbmV3IENvbWJvKGNvbnRhaW5lciwgU1dULkRST1BfRE9XTiB8IFNXVC5CT1JERVIKLQkJCQl8IFNXVC5SRUFEX09OTFkpOwotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCXNlcnZpY2VOYW1lQ29tYm8uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCS8vIHNlcnZpY2VOYW1lQ29tYm8uc2V0VGV4dChzZXR0aW5ncy5nZXQoUFJFRl9URVhUX1NFUlZJQ0VOQU1FKSk7Ci0JCXNlcnZpY2VOYW1lQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCS8vIHVwZGF0ZSB0aGUgc2V0dGluZ3MKLQkJCQlzZXR0aW5ncy5wdXQoUFJFRl9DT01CT19TRVJWSUNFTkFNRV9JTkRFWCwgc2VydmljZU5hbWVDb21ibwotCQkJCQkJLmdldFNlbGVjdGlvbkluZGV4KCkpOwotCQkJCS8vIHJlbG9hZCB0aGUgcG9ydE5hbWUgbGlzdAotCQkJCWxvYWRQb3J0TmFtZXMoKTsKLQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJfQotCQl9KTsKLQotCQkvLyBwb3J0IG5hbWUKLQkJbGFiZWwgPSBuZXcgTGFiZWwoY29udGFpbmVyLCBTV1QuTlVMTCk7Ci0JCWxhYmVsLnNldFRleHQoQ29kZWdlbldpemFyZFBsdWdpbgotCQkJCS5nZXRSZXNvdXJjZVN0cmluZygicGFnZTIucG9ydE5hbWUuY2FwdGlvbiIpKTsKLQkJcG9ydE5hbWVDb21ibyA9IG5ldyBDb21ibyhjb250YWluZXIsIFNXVC5EUk9QX0RPV04gfCBTV1QuQk9SREVSCi0JCQkJfCBTV1QuUkVBRF9PTkxZKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlwb3J0TmFtZUNvbWJvLnNldExheW91dERhdGEoZ2QpOwotCi0JCXBvcnROYW1lQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCS8vIHVwZGF0ZSB0aGUgc2V0dGluZ3MKLQkJCQlzZXR0aW5ncy5wdXQoUFJFRl9DT01CT19QT1JUTkFNRV9JTkRFWCwgcG9ydE5hbWVDb21ibwotCQkJCQkJLmdldFNlbGVjdGlvbkluZGV4KCkpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJfQotCQl9KTsKLQkJCi0JCS8vIERhdGFiaW5kaW5nCi0JCWxhYmVsID0gbmV3IExhYmVsKGNvbnRhaW5lciwgU1dULk5VTEwpOwotCQlsYWJlbC5zZXRUZXh0KENvZGVnZW5XaXphcmRQbHVnaW4KLQkJCQkuZ2V0UmVzb3VyY2VTdHJpbmcoInBhZ2UyLmRhdGFiaW5kaW5nQ2hlY2suY2FwdGlvbiIpKTsKLQotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWRhdGFiaW5kaW5nVHlwZUNvbWJvID0gbmV3IENvbWJvKGNvbnRhaW5lciwgU1dULkRST1BfRE9XTiB8IFNXVC5CT1JERVIKLQkJCQl8IFNXVC5SRUFEX09OTFkpOwotCQlkYXRhYmluZGluZ1R5cGVDb21iby5zZXRMYXlvdXREYXRhKGdkKTsKLQkJZmlsbERhdGFiaW5kZXJDb21ibygpOwotCQlkYXRhYmluZGluZ1R5cGVDb21iby5zZWxlY3Qoc2V0dGluZ3MuZ2V0SW50KFBSRUZfREFUQUJJTkRFUl9JTkRFWCkpOwotCQlkYXRhYmluZGluZ1R5cGVDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc2V0dGluZ3MucHV0KFBSRUZfREFUQUJJTkRFUl9JTkRFWCwgZGF0YWJpbmRpbmdUeXBlQ29tYm8KLQkJCQkJCS5nZXRTZWxlY3Rpb25JbmRleCgpKTsKLQotCQkJfTsKLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCX07Ci0JCX0pOwotCQkKLQkJLy8gcGFja2FnZSBuYW1lCi0JCWxhYmVsID0gbmV3IExhYmVsKGNvbnRhaW5lciwgU1dULk5VTEwpOwotCQlsYWJlbC5zZXRUZXh0KENvZGVnZW5XaXphcmRQbHVnaW4KLQkJCQkuZ2V0UmVzb3VyY2VTdHJpbmcoInBhZ2UyLnBhY2thZ2UuY2FwdGlvbiIpKTsKLQkJcGFja2FnZVRleHQgPSBuZXcgVGV4dChjb250YWluZXIsIFNXVC5CT1JERVIpOwotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0KLQkJcGFja2FnZVRleHQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCVN0cmluZyBwYWNrYWdlTmFtZTsKLQkJU3RyaW5nIHN0b3JlZFBhY2thZ2VOYW1lID0gc2V0dGluZ3MuZ2V0KFBSRUZfUEFDS0FHRV9OQU1FKTsKLQkJdGhpcy5kZWZhdWx0UGFja2FnZU5hbWUgPSBzdG9yZWRQYWNrYWdlTmFtZTsKLQkJaWYgKHN0b3JlZFBhY2thZ2VOYW1lLmVxdWFscygiIikpIHsKLQkJCXBhY2thZ2VOYW1lID0gVVJMUHJvY2Vzc29yLm1ha2VQYWNrYWdlTmFtZSgiIik7Ci0JCX0gZWxzZSB7Ci0JCQlwYWNrYWdlTmFtZSA9IHN0b3JlZFBhY2thZ2VOYW1lOwotCQl9Ci0JCQotCQkvL2lmIHRoZSBwYWNrYWdlIG5hbWUgc29tZWhvdyB0dXJuZWQgb3V0IHRvIGJlIG51bGwgc2V0IGl0IHRvIAotCQkvL2RlZmF1bHQgcGFja2FnZQotCQlpZiAocGFja2FnZU5hbWU9PW51bGwpcGFja2FnZU5hbWU9VVJMUHJvY2Vzc29yLkRFRkFVTFRfUEFDS0FHRTsKLQkJCi0JCXBhY2thZ2VUZXh0LnNldFRleHQocGFja2FnZU5hbWUpOyAvLyBnZXQgdGhpcyB0ZXh0IGZyb20gdGhlCi0JCS8vIFVSTFByb2Nlc3NvcgotCQlwYWNrYWdlVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQloYW5kbGVDdXN0b21QYWNrYWdlTmFtZU1vZGlmeUV2ZW50KCk7Ci0JCQkJc2V0dGluZ3MucHV0KFBSRUZfUEFDS0FHRV9OQU1FLCBwYWNrYWdlVGV4dC5nZXRUZXh0KCkpOwotCQkJfQotCQl9KTsKLQkJCi0JCQotCQkvLyBnZW5lcmF0ZSB0ZXN0IGNhc2Ugb3B0aW9uCi0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMzsKLQkJdGVzdENhc2VDaGVja0JveEJ1dHRvbiA9IG5ldyBCdXR0b24oY29udGFpbmVyLCBTV1QuQ0hFQ0spOwotCQl0ZXN0Q2FzZUNoZWNrQm94QnV0dG9uLnNldExheW91dERhdGEoZ2QpOwotCQl0ZXN0Q2FzZUNoZWNrQm94QnV0dG9uCi0JCQkJLnNldFRleHQob3JnLmFwYWNoZS5heGlzMi50b29sLmNvZGVnZW4uZWNsaXBzZS5wbHVnaW4uQ29kZWdlbldpemFyZFBsdWdpbgotCQkJCQkJLmdldFJlc291cmNlU3RyaW5nKCJwYWdlMi50ZXN0Y2FzZS5jYXB0aW9uIikpOwotCQl0ZXN0Q2FzZUNoZWNrQm94QnV0dG9uLnNldFNlbGVjdGlvbihzZXR0aW5ncwotCQkJCS5nZXRCb29sZWFuKFBSRUZfQ0hFQ0tfR0VORVJBVEVfVEVTVENBU0UpKTsKLQkJdGVzdENhc2VDaGVja0JveEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc2V0dGluZ3MucHV0KFBSRUZfQ0hFQ0tfR0VORVJBVEVfVEVTVENBU0UsCi0JCQkJCQl0ZXN0Q2FzZUNoZWNrQm94QnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCX0KLQkJfSk7Ci0JCQotCQkvL2ZpbGxpbmcgbGFiZWwgCi0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMzsKLQkJTGFiZWwgZmlsbExhYmVsID0gbmV3IExhYmVsKGNvbnRhaW5lciwgU1dULkhPUklaT05UQUwgfCBTV1QuU0VQQVJBVE9SKTsKLQkJZmlsbExhYmVsLnNldExheW91dERhdGEoZ2QpOwotCi0JCS8vY2xlaW50IHNpZGUgbGFiZWwgCi0vLwkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLS8vCQlnZC5ob3Jpem9udGFsU3BhbiA9IDM7Ci0vLwkJTGFiZWwgbGJsQ2xpZW50c2lkZSA9IG5ldyBMYWJlbChjb250YWluZXIsIFNXVC5OT05FKTsKLS8vCQlsYmxDbGllbnRzaWRlLnNldFRleHQoQ29kZWdlbldpemFyZFBsdWdpbgotLy8JCQkJLmdldFJlc291cmNlU3RyaW5nKCJwYWdlMi5jbGllbnRzaWRlLmNhcHRpb24iKSk7Ci0vLwkJbGJsQ2xpZW50c2lkZS5zZXRMYXlvdXREYXRhKGdkKTsKLQkJCi0JCS8vY2xlaW50IHNpZGUgbGFiZWwgCi0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMzsKLQkJY2xpZW50U2lkZUNoZWNrQm94QnV0dG9uID0gbmV3IEJ1dHRvbihjb250YWluZXIsIFNXVC5DSEVDSyk7Ci0JCWNsaWVudFNpZGVDaGVja0JveEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLQkJY2xpZW50U2lkZUNoZWNrQm94QnV0dG9uLnNldFRleHQoQ29kZWdlbldpemFyZFBsdWdpbgotCQkJCS5nZXRSZXNvdXJjZVN0cmluZygicGFnZTIuY2xpZW50c2lkZS5jYXB0aW9uIikpOwotCQljbGllbnRTaWRlQ2hlY2tCb3hCdXR0b24uc2V0U2VsZWN0aW9uKHNldHRpbmdzCi0JCQkJLmdldEJvb2xlYW4oUFJFRl9DSEVDS19HRU5FUkFURV9DTElFTlRTSURFKSk7Ci0JCWNsaWVudFNpZGVDaGVja0JveEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaGFuZGxlQ2xpZW50c2lkZVNlbGVjdGlvbigpOwotCQkJCXNldHRpbmdzLnB1dChQUkVGX0NIRUNLX0dFTkVSQVRFX0NMSUVOVFNJREUsCi0JCQkJCQljbGllbnRTaWRlQ2hlY2tCb3hCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCQkJfQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCX0KLQkJfSk7Ci0JCQotCi0JCS8vY2xpZW50IHNpZGUgYnV0dG9ucwotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDE7Ci0JCXN5bmNBbmRBc3luY1JhZGlvQnV0dG9uID0gbmV3IEJ1dHRvbihjb250YWluZXIsIFNXVC5SQURJTyk7Ci0JCXN5bmNBbmRBc3luY1JhZGlvQnV0dG9uLnNldExheW91dERhdGEoZ2QpOwotCQlzeW5jQW5kQXN5bmNSYWRpb0J1dHRvbi5zZXRUZXh0KENvZGVnZW5XaXphcmRQbHVnaW4KLQkJCQkuZ2V0UmVzb3VyY2VTdHJpbmcoInBhZ2UyLnN5bmNBc3luYy5jYXB0aW9uIikpOwotCQlzeW5jQW5kQXN5bmNSYWRpb0J1dHRvbi5zZXRTZWxlY3Rpb24oc2V0dGluZ3MKLQkJCQkuZ2V0Qm9vbGVhbihQUkVGX1JBRElPX1NZTkNfQU5EX0FTWU5DKSk7Ci0JCXN5bmNBbmRBc3luY1JhZGlvQnV0dG9uLnNldFZpc2libGUodHJ1ZSk7Ci0JCXN5bmNBbmRBc3luY1JhZGlvQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlzZXR0aW5ncy5wdXQoUFJFRl9SQURJT19TWU5DX0FORF9BU1lOQywgc3luY0FuZEFzeW5jUmFkaW9CdXR0b24KLQkJCQkJCS5nZXRTZWxlY3Rpb24oKSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJCi0KLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAxOwotCQlzeW5jT25seVJhZGlvQnV0dG9uID0gbmV3IEJ1dHRvbihjb250YWluZXIsIFNXVC5SQURJTyk7Ci0JCXN5bmNPbmx5UmFkaW9CdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXN5bmNPbmx5UmFkaW9CdXR0b24uc2V0VGV4dChDb2RlZ2VuV2l6YXJkUGx1Z2luCi0JCQkJLmdldFJlc291cmNlU3RyaW5nKCJwYWdlMi5zeW5jLmNhcHRpb24iKSk7Ci0JCXN5bmNPbmx5UmFkaW9CdXR0b24uc2V0U2VsZWN0aW9uKHNldHRpbmdzCi0JCQkJLmdldEJvb2xlYW4oUFJFRl9SQURJT19TWU5DX09OTFkpKTsKLQkJc3luY09ubHlSYWRpb0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc2V0dGluZ3MucHV0KFBSRUZfUkFESU9fU1lOQ19PTkxZLCBzeW5jT25seVJhZGlvQnV0dG9uCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCkpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJfQotCQl9KTsKLQotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDE7Ci0JCWFzeW5jT25seVJhZGlvQnV0dG9uID0gbmV3IEJ1dHRvbihjb250YWluZXIsIFNXVC5SQURJTyk7Ci0JCWFzeW5jT25seVJhZGlvQnV0dG9uLnNldExheW91dERhdGEoZ2QpOwotCQlhc3luY09ubHlSYWRpb0J1dHRvbgotCQkJCS5zZXRUZXh0KG9yZy5hcGFjaGUuYXhpczIudG9vbC5jb2RlZ2VuLmVjbGlwc2UucGx1Z2luLkNvZGVnZW5XaXphcmRQbHVnaW4KLQkJCQkJCS5nZXRSZXNvdXJjZVN0cmluZygicGFnZTIuYXN5bmMuY2FwdGlvbiIpKTsKLQkJYXN5bmNPbmx5UmFkaW9CdXR0b24uc2V0U2VsZWN0aW9uKHNldHRpbmdzCi0JCQkJLmdldEJvb2xlYW4oUFJFRl9SQURJT19BU1lOQ19PTkxZKSk7Ci0JCWFzeW5jT25seVJhZGlvQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlzZXR0aW5ncy5wdXQoUFJFRl9SQURJT19BU1lOQ19PTkxZLCBhc3luY09ubHlSYWRpb0J1dHRvbgotCQkJCQkJLmdldFNlbGVjdGlvbigpKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCX0KLQkJfSk7Ci0JCQotCQkvL2ZpbGxpbmcgbGFiZWwgCi0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMzsKLQkJTGFiZWwgZmlsbExhYmVsMSA9IG5ldyBMYWJlbChjb250YWluZXIsIFNXVC5IT1JJWk9OVEFMIHwgU1dULlNFUEFSQVRPUik7Ci0JCWZpbGxMYWJlbDEuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQotCQkKLQkJLy8gU2VydmVyIHNpZGUgY2hlY2sgYm94Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMzsKLQkJc2VydmVyU2lkZUNoZWNrQm94QnV0dG9uID0gbmV3IEJ1dHRvbihjb250YWluZXIsIFNXVC5DSEVDSyk7Ci0JCXNlcnZlclNpZGVDaGVja0JveEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLQkJc2VydmVyU2lkZUNoZWNrQm94QnV0dG9uLnNldFRleHQoQ29kZWdlbldpemFyZFBsdWdpbgotCQkJCS5nZXRSZXNvdXJjZVN0cmluZygicGFnZTIuc2VydmVyc2lkZS5jYXB0aW9uIikpOwotCQlzZXJ2ZXJTaWRlQ2hlY2tCb3hCdXR0b24uc2V0U2VsZWN0aW9uKHNldHRpbmdzCi0JCQkJLmdldEJvb2xlYW4oUFJFRl9DSEVDS19HRU5FUkFURV9TRVJWRVJTSURFKSk7Ci0JCXNlcnZlclNpZGVDaGVja0JveEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaGFuZGxlU2VydmVyc2lkZVNlbGVjdGlvbigpOwotCQkJCXNldHRpbmdzLnB1dChQUkVGX0NIRUNLX0dFTkVSQVRFX1NFUlZFUlNJREUsCi0JCQkJCQlzZXJ2ZXJTaWRlQ2hlY2tCb3hCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJfQotCQl9KTsKLQotCQkvLyBTZXJ2ZXIgc2lkZSBzZXJ2aWNlcyB4bWwKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAxOwotCQlzZXJ2ZXJYTUxDaGVja0JveEJ1dHRvbiA9IG5ldyBCdXR0b24oY29udGFpbmVyLCBTV1QuQ0hFQ0spOwotCQlzZXJ2ZXJYTUxDaGVja0JveEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLQkJc2VydmVyWE1MQ2hlY2tCb3hCdXR0b24uc2V0U2VsZWN0aW9uKHNldHRpbmdzCi0JCQkJLmdldEJvb2xlYW4oUFJFRl9DSEVDS19HRU5FUkFURV9TRVJWRVJDT05GSUcpKTsKLQkJc2VydmVyWE1MQ2hlY2tCb3hCdXR0b24uc2V0VGV4dChDb2RlZ2VuV2l6YXJkUGx1Z2luCi0JCQkJLmdldFJlc291cmNlU3RyaW5nKCJwYWdlMi5zZXJ2aWNlWE1MLmNhcHRpb24iKSk7Ci0JCXNlcnZlclhNTENoZWNrQm94QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlzZXR0aW5ncy5wdXQoUFJFRl9DSEVDS19HRU5FUkFURV9TRVJWRVJDT05GSUcsCi0JCQkJCQlzZXJ2ZXJYTUxDaGVja0JveEJ1dHRvbi5nZXRFbmFibGVkKCkpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJfQotCQl9KTsKLQotCi0JCS8vdGhlIHNlcnZlciBzaWRlIGludGVyZmFjZSBvcHRpb24KLQkJZ2VuZXJhdGVTZXJ2ZXJTaWRlSW50ZXJmYWNlQ2hlY2tCb3hCdXR0b24gPSBuZXcgQnV0dG9uKGNvbnRhaW5lciwgU1dULkNIRUNLKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAxOwotCQlnZW5lcmF0ZVNlcnZlclNpZGVJbnRlcmZhY2VDaGVja0JveEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLQkJZ2VuZXJhdGVTZXJ2ZXJTaWRlSW50ZXJmYWNlQ2hlY2tCb3hCdXR0b24uc2V0U2VsZWN0aW9uKHNldHRpbmdzCi0JCQkJLmdldEJvb2xlYW4oUFJFRl9HRU5fU1NfSU5URVJGQUNFKSk7Ci0JCWdlbmVyYXRlU2VydmVyU2lkZUludGVyZmFjZUNoZWNrQm94QnV0dG9uLnNldFRleHQoQ29kZWdlbldpemFyZFBsdWdpbgotCQkJCS5nZXRSZXNvdXJjZVN0cmluZygicGFnZTIuc3NJbnRlcmZhY2UuY2FwdGlvbiIpKTsKLQkJZ2VuZXJhdGVTZXJ2ZXJTaWRlSW50ZXJmYWNlQ2hlY2tCb3hCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXNldHRpbmdzLnB1dChQUkVGX0dFTl9TU19JTlRFUkZBQ0UsIGdlbmVyYXRlU2VydmVyU2lkZUludGVyZmFjZUNoZWNrQm94QnV0dG9uCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCkpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJfQotCQl9KTsKLQkJCi0JCQotCQkvL2ZpbGxpbmcgbGFiZWwgCi0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMzsKLQkJTGFiZWwgZmlsbExhYmVsMiA9IG5ldyBMYWJlbChjb250YWluZXIsIFNXVC5IT1JJWk9OVEFMIHwgU1dULlNFUEFSQVRPUik7Ci0JCWZpbGxMYWJlbDIuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQotCQkvLyBnZW5lcmF0ZSBhbGwKLQkJZ2VuZXJhdGVBbGxDaGVja0JveEJ1dHRvbiA9IG5ldyBCdXR0b24oY29udGFpbmVyLCBTV1QuQ0hFQ0spOwotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCWdlbmVyYXRlQWxsQ2hlY2tCb3hCdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWdlbmVyYXRlQWxsQ2hlY2tCb3hCdXR0b24uc2V0U2VsZWN0aW9uKHNldHRpbmdzCi0JCQkJLmdldEJvb2xlYW4oUFJFRl9HRU5fQUxMKSk7Ci0JCWdlbmVyYXRlQWxsQ2hlY2tCb3hCdXR0b24uc2V0VGV4dChDb2RlZ2VuV2l6YXJkUGx1Z2luCi0JCQkJLmdldFJlc291cmNlU3RyaW5nKCJwYWdlMi5nZW5BbGwuY2FwdGlvbiIpKTsKLQkJZ2VuZXJhdGVBbGxDaGVja0JveEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc2V0dGluZ3MucHV0KFBSRUZfR0VOX0FMTCwgZ2VuZXJhdGVBbGxDaGVja0JveEJ1dHRvbgotCQkJCQkJLmdldFNlbGVjdGlvbigpKTsKLQkJCQloYW5kbGVHZW5lcmF0ZUFsbFNlbGVjdGlvbigpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJfQotCQl9KTsKLQkJCi0JCS8vZmlsbGluZyBsYWJlbCAKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlMYWJlbCBmaWxsTGFiZWwzID0gbmV3IExhYmVsKGNvbnRhaW5lciwgU1dULkhPUklaT05UQUwgfCBTV1QuU0VQQVJBVE9SKTsKLQkJZmlsbExhYmVsMy5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQkvLwkJIERhdGFiaW5kaW5nCi0JCWxhYmVsID0gbmV3IExhYmVsKGNvbnRhaW5lciwgU1dULk5VTEwpOwotCQlsYWJlbC5zZXRUZXh0KENvZGVnZW5XaXphcmRQbHVnaW4KLQkJCQkuZ2V0UmVzb3VyY2VTdHJpbmcoInBhZ2UyLm5hbWVzcGFjZTJQa2cuY2FwdGlvbiIpKTsKLQkJCi0JCS8vYWRkIGEgdGFibGUgdG8gc2V0IG5hbWVzcGFjZSB0byBwYWNrYWdlIG1hcHBpbmcKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLSAgICAgICAgZ2QuaG9yaXpvbnRhbFNwYW4gPSAzOwotICAgICAgICBnZC52ZXJ0aWNhbFNwYW4gPSA1OwotICAgICAgICAKLSAgICAgICAgbmFtZXNwYWNlMnBhY2thZ2VUYWJsZSA9IG5ldyBUYWJsZShjb250YWluZXIsU1dULkJPUkRFUnxTV1QuTVVMVEkpOwotICAgICAgICBuYW1lc3BhY2UycGFja2FnZVRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLSAgICAgICAgbmFtZXNwYWNlMnBhY2thZ2VUYWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOyAKLSAgICAgICAgbmFtZXNwYWNlMnBhY2thZ2VUYWJsZS5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICBuYW1lc3BhY2UycGFja2FnZVRhYmxlLnNldExheW91dERhdGEoZ2QpOwotICAgICAgIAotICAgICAgICBkZWNsYXJlQ29sdW1uKG5hbWVzcGFjZTJwYWNrYWdlVGFibGUsCi0gICAgICAgIAkJMzUwLCAvL2EgZGVmYXVsdCB3aWR0aCB1bnRpbCB3ZSBhZGp1c3QKLSAgICAgICAgCQlDb2RlZ2VuV2l6YXJkUGx1Z2luCi0JCQkJLmdldFJlc291cmNlU3RyaW5nKCJwYWdlMi5uYW1lc3BhY2UuY2FwdGlvbiIpKTsKLSAgICAgICAgZGVjbGFyZUNvbHVtbihuYW1lc3BhY2UycGFja2FnZVRhYmxlLAotICAgICAgICAJCTIwMCwvL2EgZGVmYXVsdCB3aWR0aCB1bnRpbCB3ZSBhZGp1c3QKLSAgICAgICAgCQlDb2RlZ2VuV2l6YXJkUGx1Z2luCi0JCQkJLmdldFJlc291cmNlU3RyaW5nKCJwYWdlMi5wYWNrYWdlLmNhcHRpb24iKSk7Ci0gICAgICAgIAotICAgICAgICBuYW1lc3BhY2UycGFja2FnZVRhYmxlLnNldFZpc2libGUodHJ1ZSk7Ci0gICAgICAgIAotICAgICAgICAvLyBhZGQgdGhlIHRhYmxlIGVkaXRvcgotICAgICAgICBmaW5hbCBUYWJsZUVkaXRvciBlZGl0b3IgPSBuZXcgVGFibGVFZGl0b3IobmFtZXNwYWNlMnBhY2thZ2VUYWJsZSk7Ci0gICAgICAgIGVkaXRvci5zZXRDb2x1bW4oMSk7Ci0gICAgICAgIGVkaXRvci5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkxFRlQ7Ci0gICAgICAgIGVkaXRvci5ncmFiSG9yaXpvbnRhbCA9IHRydWU7Ci0gICAgICAgIC8vVGhpcyBpcyB0aGUgY3V0ZSB3YXkgb2YgbWFraW5nIHRoZSBuYW1lc3BhY2VzIGNvbHVtbnMgZWRpdGFibGUKLSAgICAgICAgbmFtZXNwYWNlMnBhY2thZ2VUYWJsZS5hZGRMaXN0ZW5lcihTV1QuTW91c2VEb3duLCBuZXcgTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotICAgICAgICAgICAgICBSZWN0YW5nbGUgY2xpZW50QXJlYSA9IG5hbWVzcGFjZTJwYWNrYWdlVGFibGUuZ2V0Q2xpZW50QXJlYSgpOwotICAgICAgICAgICAgICBQb2ludCBwdCA9IG5ldyBQb2ludChldmVudC54LCBldmVudC55KTsKLSAgICAgICAgICAgICAgaW50IGluZGV4ID0gbmFtZXNwYWNlMnBhY2thZ2VUYWJsZS5nZXRUb3BJbmRleCgpOwotICAgICAgICAgICAgICB3aGlsZSAoaW5kZXggPCBuYW1lc3BhY2UycGFja2FnZVRhYmxlLmdldEl0ZW1Db3VudCgpKSB7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiB2aXNpYmxlID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgZmluYWwgVGFibGVJdGVtIGl0ZW0gPSBuYW1lc3BhY2UycGFja2FnZVRhYmxlLmdldEl0ZW0oaW5kZXgpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmFtZXNwYWNlMnBhY2thZ2VUYWJsZS5nZXRDb2x1bW5Db3VudCgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgIFJlY3RhbmdsZSByZWN0ID0gaXRlbS5nZXRCb3VuZHMoaSk7Ci0gICAgICAgICAgICAgICAgICBpZiAocmVjdC5jb250YWlucyhwdCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGNvbHVtbiA9IGk7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFRleHQgdGV4dCA9IG5ldyBUZXh0KG5hbWVzcGFjZTJwYWNrYWdlVGFibGUsIFNXVC5OT05FKTsKLSAgICAgICAgICAgICAgICAgICAgTGlzdGVuZXIgdGV4dExpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KGZpbmFsIEV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZS50eXBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNXVC5Gb2N1c091dDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5zZXRUZXh0KGNvbHVtbiwgdGV4dC5nZXRUZXh0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0LmRpc3Bvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNXVC5UcmF2ZXJzZToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChlLmRldGFpbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNXVC5UUkFWRVJTRV9SRVRVUk46Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0VGV4dChjb2x1bW4sIHRleHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRUZXh0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGQUxMIFRIUk9VR0gKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTV1QuVFJBVkVSU0VfRVNDQVBFOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQuZGlzcG9zZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZG9pdCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgICAgICAgdGV4dC5hZGRMaXN0ZW5lcihTV1QuRm9jdXNPdXQsIHRleHRMaXN0ZW5lcik7Ci0gICAgICAgICAgICAgICAgICAgIHRleHQuYWRkTGlzdGVuZXIoU1dULlRyYXZlcnNlLCB0ZXh0TGlzdGVuZXIpOwotICAgICAgICAgICAgICAgICAgICBlZGl0b3Iuc2V0RWRpdG9yKHRleHQsIGl0ZW0sIGkpOwotICAgICAgICAgICAgICAgICAgICB0ZXh0LnNldFRleHQoaXRlbS5nZXRUZXh0KGkpKTsKLSAgICAgICAgICAgICAgICAgICAgdGV4dC5zZWxlY3RBbGwoKTsKLSAgICAgICAgICAgICAgICAgICAgdGV4dC5zZXRGb2N1cygpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICBpZiAoIXZpc2libGUgJiYgcmVjdC5pbnRlcnNlY3RzKGNsaWVudEFyZWEpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHZpc2libGUgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoIXZpc2libGUpCi0gICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgaW5kZXgrKzsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0pOwotICAgICAgIAotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCUxhYmVsIGZpbGxMYWJlbDQgPSBuZXcgTGFiZWwoY29udGFpbmVyLCBTV1QuTlVMTCk7Ci0JCWZpbGxMYWJlbDQuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAxOwotCQlhZHZhbmNlT3B0aW9uc0J1dHRvbj0gbmV3IEJ1dHRvbihjb250YWluZXIsIFNXVC5OVUxMKTsKLQkJYWR2YW5jZU9wdGlvbnNCdXR0b24uc2V0VGV4dCgiQWR2YW5jZSBPcHRpb25zIik7Ci0JCWFkdmFuY2VPcHRpb25zQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCl7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaGFuZGxlQWR2YW5jZUJ1dHRvbkNsaWNrKCk7Ci0JCQl9Ci0JCX0pOwotCQlhZHZhbmNlT3B0aW9uc0J1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLQkJCi0gICAgICAgIC8vYWRqdXN0IHRoZSB3aWR0aAotICAgICAgICAvL2FkanVzdENvbHVtbldpZHRoKG5hbWVzcGFjZTJwYWNrYWdlVGFibGUpOwotICAgICAgIAotCQkvKgotCQkgKiBDaGVjayB0aGUgc3RhdGUgb2Ygc2VydmVyLXNpZGUgc2VsZWN0aW9uLCBzbyB3ZSBjYW4gZW5hYmxlL2Rpc2FibGUKLQkJICogdGhlIHNlcnZlclhNTCBjaGVja2JveCBidXR0b24uCi0JCSAqLwotCQloYW5kbGVTZXJ2ZXJzaWRlU2VsZWN0aW9uKCk7Ci0JCS8qCi0JCSAqIHRyeSBwb3B1bGF0aW5nIHRoZSBjb21ib3MgYW5kIG90aGVyIGluZm9ybWF0aW9uIGZyb20gdGhlIFdTREwgaWYgdGhpcwotCQkgKiBpcyByZXN0b3JlZAotCQkgKi8KLQkJaWYgKHJlc3RvcmVkRnJvbVByZXZpb3VzU2V0dGluZ3MpIHsKLQkJCXBvcHVsYXRlUGFyYW1zRnJvbVdTREwoKTsKLQkJCXNlbGVjdERlZmF1bHRzKCk7Ci0JCX0KLQkJCi0JCS8vZmlyc3QgYXBwZWFyZW5jZSBEaXNhYmxlIGFsbCB0aGUgY29udHJvbHMgCi0JCWRpc2FibGVDb250cm9scygpOwotCQkKLQkJCi0JCXNldENvbnRyb2woY29udGFpbmVyKTsKLQotCQlzZXRQYWdlQ29tcGxldGUodHJ1ZSk7Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlQWR2YW5jZUJ1dHRvbkNsaWNrKCl7Ci0JCVdTRExKYXZhQWR2YW5jZURpYWxvZyBqYXZhQWR2YW5jZURpYWxvZyA9IG5ldyBXU0RMSmF2YUFkdmFuY2VEaWFsb2coZ2V0U2hlbGwoKSxhZHZhbmNlT3B0aW9ucyk7Ci0JCWphdmFBZHZhbmNlRGlhbG9nLmNyZWF0ZSgpOwotCQlqYXZhQWR2YW5jZURpYWxvZy5nZXRTaGVsbCgpLnNldFNpemUoNzAwLCA5NTApOwotCQlqYXZhQWR2YW5jZURpYWxvZy5vcGVuKCk7Ci0JCWlmIChqYXZhQWR2YW5jZURpYWxvZy5nZXRSZXR1cm5Db2RlKCkgPT0gb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdy5PSyl7Ci0JCQlhZHZhbmNlT3B0aW9ucz1qYXZhQWR2YW5jZURpYWxvZy5nZXRBZHZhbmNlT3B0aW9ucygpOwotCQl9Ci0JfQotLy8JLyoqCi0vLwkgKiBBZGp1c3QgdGhlIGNvbHVtbiB3aWR0aHMKLS8vCSAqIEBwYXJhbSB0YWJsZQotLy8JICovCi0vLwlwcml2YXRlIHZvaWQgYWRqdXN0Q29sdW1uV2lkdGgoVGFibGUgdGFibGUpewotLy8JCSBQb2ludCBwID0gbmFtZXNwYWNlMnBhY2thZ2VUYWJsZS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotLy8JICAgICBpbnQgY29sdW1ucyA9IHRhYmxlLmdldENvbHVtbkNvdW50KCk7Ci0vLwkgICAgIGZvciAoaW50IGk9MDtpPGNvbHVtbnM7aSsrKXsKLS8vCSAgICAJIHRhYmxlLmdldENvbHVtbihpKS5zZXRXaWR0aChwLngvY29sdW1ucyk7Ci0vLwkgICAgIH0KLS8vCX0KLQkvKioKLQkgKiBBIHV0aWwgbWV0aG9kIHRvIGNyZWF0ZSBhIG5ldyBjb2x1bW4KLQkgKiBAcGFyYW0gdGFibGUKLQkgKiBAcGFyYW0gd2lkdGgKLQkgKiBAcGFyYW0gY29sTmFtZQotCSAqLwotCXByaXZhdGUgdm9pZCBkZWNsYXJlQ29sdW1uKFRhYmxlIHRhYmxlLCBpbnQgd2lkdGgsU3RyaW5nIGNvbE5hbWUpewotICAgICAgICBUYWJsZUNvbHVtbiBjb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsU1dULk5PTkUpOwotICAgICAgICBjb2x1bW4uc2V0V2lkdGgod2lkdGgpOwotICAgICAgICBjb2x1bW4uc2V0VGV4dChjb2xOYW1lKTsKLSAgICB9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNlbGVjdERlZmF1bHRzKCkgewotCQlzZXJ2aWNlTmFtZUNvbWJvLnNlbGVjdChzZXR0aW5ncy5nZXRJbnQoUFJFRl9DT01CT19TRVJWSUNFTkFNRV9JTkRFWCkpOwotCQkvLyBwb3J0cyBuZWVkIHRvIGJlIHJlbmFtZWQgaW4gb3JkZXIgZm9yIGNvcnJlY3QgZGVmYXVsdCBzZWxlY3Rpb24KLQkJbG9hZFBvcnROYW1lcygpOwotCQlwb3J0TmFtZUNvbWJvLnNlbGVjdChzZXR0aW5ncy5nZXRJbnQoUFJFRl9DT01CT19TRVJWSUNFTkFNRV9JTkRFWCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwb3B1bGF0ZVBhY2thZ2VOYW1lKCkgewotCQl0aGlzLnBhY2thZ2VUZXh0LnNldFRleHQocmVhZGVyLnBhY2thZ2VGcm9tVGFyZ2V0TmFtZXNwYWNlKCkpOwotCX0KLQotCS8qKgotCSAqIHBvcHVsYXRlIHRoZSBzZXJ2aWNlIGFuZCB0aGUgcG9ydCBmcm9tIHRoZSBXU0RMIHRoaXMgbmVlZHMgdG8gYmUgcHVibGljCi0JICogc2luY2UgdGhlIFdTRExzZWxlY3Rpb24gcGFnZSBtYXkgY2FsbCB0aGlzCi0JICovCi0JcHVibGljIHZvaWQgcG9wdWxhdGVQYXJhbXNGcm9tV1NETCgpIHsKLQkJaWYgKHJlYWRlciA9PSBudWxsKQotCQkJcmVhZGVyID0gbmV3IFdTRExQcm9wZXJ0eVJlYWRlcigpOwotCQl0cnkgewotCQkJU3RyaW5nIGxuYW1lID0gZ2V0Q29kZWdlbldpemFyZCgpLmdldFdTRExuYW1lKCk7Ci0JCQlpZiAoISIiLmVxdWFscyhsbmFtZS50cmltKCkpKSB7Ci0JCQkJCi0JCQkJcmVhZGVyLnJlYWRXU0RMKGxuYW1lKTsKLQotCQkJCS8vIGVuYWJsZSB0aGUgY29tYm8ncwotCQkJCXNldENvbWJvQm94RW5hYmxlKHRydWUpOwotCi0JCQkJdGhpcy5zZXJ2aWNlUU5hbWVMaXN0ID0gcmVhZGVyLmdldFNlcnZpY2VMaXN0KCk7Ci0JCQkJaWYgKCFzZXJ2aWNlUU5hbWVMaXN0LmlzRW1wdHkoKSkgewotCQkJCQlzZXJ2aWNlTmFtZUNvbWJvLnJlbW92ZUFsbCgpOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNlcnZpY2VRTmFtZUxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCQkJCS8vIGFkZCB0aGUgbG9jYWwgcGFydCBvZiB0aGUKLQkJCQkJCXNlcnZpY2VOYW1lQ29tYm8uYWRkKCgoUU5hbWUpIHNlcnZpY2VRTmFtZUxpc3QuZ2V0KGkpKQotCQkJCQkJCQkuZ2V0TG9jYWxQYXJ0KCkpOwotCQkJCQl9Ci0JCQkJCTsKLQkJCQkJLy8gc2VsZWN0IHRoZSBmaXJzdCBvbmUgYXMgdGhlIGRlZmF1bHQKLQkJCQkJc2VydmljZU5hbWVDb21iby5zZWxlY3QoMCk7Ci0KLQkJCQkJLy8gbG9hZCB0aGUgcG9ydHMKLQkJCQkJbG9hZFBvcnROYW1lcygpOwotCi0JCQkJCXVwZGF0ZVN0YXR1cyhudWxsKTsKLQkJCQl9IGVsc2UgewotCQkJCQkvLyBzZXJ2aWNlIG5hbWUgbGlzdCBiZWluZyBlbXB0eSBtZWFucyB3ZSBhcmUgc3dpdGNoaW5nIHRvCi0JCQkJCS8vIHRoZSBpbnRlcmZhY2UgbW9kZQotCQkJCQlpZiAoc2VydmljZU5hbWVDb21ibyE9bnVsbCkgc2VydmljZU5hbWVDb21iby5yZW1vdmVBbGwoKTsKLQkJCQkJaWYgKHBvcnROYW1lQ29tYm8hPW51bGwpIHBvcnROYW1lQ29tYm8ucmVtb3ZlQWxsKCk7Ci0JCQkJCS8vIGRpc2FibGUgdGhlIGNvbWJvJ3MKLQkJCQkJc2V0Q29tYm9Cb3hFbmFibGUoZmFsc2UpOwotCQkJCQkvL3RoaXMgaXMgbm90IGFuIGVycm9yCi0JCQkJCXVwZGF0ZVN0YXR1cyhudWxsKTsKLQkJCQotCQkJCX0KLQotCQkJCXBvcHVsYXRlUGFja2FnZU5hbWUoKTsKLQkJCQkKLQkJCQkvL3BvcHVsYXRlIHRoZSBuYW1lc3BhY2VzcwotCQkJICAgIGxvYWROYW1lc3BhY2VzKHJlYWRlci5nZXREZWZpbml0aW9uTmFtZXNwYWNlTWFwKCkpOwotCQkJfQotCQl9IGNhdGNoIChXU0RMRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGRpc2FibGUgdGhlIGNvbWJvJ3MKLQkJCXNldENvbWJvQm94RW5hYmxlKGZhbHNlKTsKLQkJCXVwZGF0ZVN0YXR1cyhDb2RlZ2VuV2l6YXJkUGx1Z2luCi0JCQkJCS5nZXRSZXNvdXJjZVN0cmluZygicGFnZTIud3NkbEludmFsaWQubWVzc2FnZSIpKTsKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGRpc2FibGUgdGhlIGNvbWJvJ3MKLQkJCXNldENvbWJvQm94RW5hYmxlKGZhbHNlKTsKLQkJCXVwZGF0ZVN0YXR1cyhDb2RlZ2VuV2l6YXJkUGx1Z2luCi0JCQkJCS5nZXRSZXNvdXJjZVN0cmluZygicGFnZTIud3NkbE5vdEZvdW5kLm1lc3NhZ2UiKSk7Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgdm9pZCBsb2FkUG9ydE5hbWVzKCkgewotCQlpbnQgc2VsZWN0aW9uSW5kZXggPSBzZXJ2aWNlTmFtZUNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCWlmIChzZWxlY3Rpb25JbmRleCAhPSAtMSkgewotCQkJamF2YS51dGlsLkxpc3QgcG9ydHMgPSByZWFkZXIuZ2V0UG9ydE5hbWVMaXN0KChRTmFtZSkgc2VydmljZVFOYW1lTGlzdAotCQkJCQkuZ2V0KHNlbGVjdGlvbkluZGV4KSk7Ci0JCQlpZiAoIXBvcnRzLmlzRW1wdHkoKSkgewotCQkJCXBvcnROYW1lQ29tYm8ucmVtb3ZlQWxsKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwb3J0cy5zaXplKCk7IGkrKykgewotCQkJCQkvLyBhZGQgdGhlIGxvY2FsIHBhcnQgb2YgdGhlCi0JCQkJCXBvcnROYW1lQ29tYm8uYWRkKHBvcnRzLmdldChpKS50b1N0cmluZygpKTsKLQkJCQl9Ci0JCQkJdXBkYXRlU3RhdHVzKG51bGwpOwotCQkJCXBvcnROYW1lQ29tYm8uc2VsZWN0KDApOwotCQkJfSBlbHNlIHsKLQkJCQl1cGRhdGVTdGF0dXMoQ29kZWdlbldpemFyZFBsdWdpbgotCQkJCQkJLmdldFJlc291cmNlU3RyaW5nKCJwYWdlMi5ub3BvcnRzLm1lc3NhZ2UiKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0Q29tYm9Cb3hFbmFibGUoYm9vbGVhbiBiKSB7Ci0JCWlmIChzZXJ2aWNlTmFtZUNvbWJvICE9IG51bGwpIHsKLQkJCXNlcnZpY2VOYW1lQ29tYm8uc2V0RW5hYmxlZChiKTsKLQkJCXBvcnROYW1lQ29tYm8uc2V0RW5hYmxlZChiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIExvYWRzIHRoZSBuYW1lc3BhY2VzCi0JICogQHBhcmFtIG5hbWVzcGFjZU1hcAotCSAqLwotCXByaXZhdGUgdm9pZCBsb2FkTmFtZXNwYWNlcyhNYXAgbmFtZXNwYWNlTWFwKXsKLQkJSXRlcmF0b3IgbmFtZXNwYWNlcyA9IG5hbWVzcGFjZU1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQluYW1lc3BhY2UycGFja2FnZVRhYmxlLnJlbW92ZUFsbCgpOwotICAgICAgICBUYWJsZUl0ZW1bXSBpdGVtcyA9IG5ldyBUYWJsZUl0ZW1bbmFtZXNwYWNlTWFwLnNpemUoKV07IC8vIEFuIGl0ZW0gZm9yIGVhY2ggZmllbGQKLSAgICAgICAgCi0gICAgICAgIGludCBpID0gMDsKLSAgICAgICAgd2hpbGUobmFtZXNwYWNlcy5oYXNOZXh0KCkpewotICAgICAgICAJCi0gICAgICAgICAgIGl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbShuYW1lc3BhY2UycGFja2FnZVRhYmxlLCBTV1QuTlVMTCk7Ci0gICAgICAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSAoU3RyaW5nKW5hbWVzcGFjZXMubmV4dCgpOwotICAgICAgICAgICBpdGVtc1tpXS5zZXRUZXh0KDAsbmFtZXNwYWNlKTsKLSAgICAgICAgICAgaXRlbXNbaV0uc2V0VGV4dCgxLGdldFBhY2thZ2VGcm9tTmFtZXNwYWNlKG5hbWVzcGFjZSkpOwotICAgICAgICAgICBpKys7Ci0gICAgICAgIH0KLQotICAgICAgICBuYW1lc3BhY2UycGFja2FnZVRhYmxlLnNldFZpc2libGUodHJ1ZSk7Ci0JCQotCX0KLQkKLQkvKioKLQkgKiBGaWxsIHRoZSBjb21ibyB3aXRoIHByb3BlciBkYXRhYmluZGluZyBuYW1lcwotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBmaWxsRGF0YWJpbmRlckNvbWJvKCkgewotCi0JCWRhdGFiaW5kaW5nVHlwZUNvbWJvLmFkZChEQVRBX0JJTkRJTkdfQURCKTsKLQkJZGF0YWJpbmRpbmdUeXBlQ29tYm8uYWRkKERBVEFfQklORElOR19YTUxCRUFOUyk7Ci0JCWRhdGFiaW5kaW5nVHlwZUNvbWJvLmFkZChEQVRBX0JJTkRJTkdfSklCWCk7Ci0JCWRhdGFiaW5kaW5nVHlwZUNvbWJvLmFkZChEQVRBX0JJTkRJTkdfTk9ORSk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBGaWxsIHRoZSBjb21ibyB3aXRoIHByb3BlciBsYW5ndWFnZSBuYW1lcwotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBmaWxsTGFuZ3VhZ2VDb21ibygpIHsKLQotCQlsYW5ndWFnZVNlbGVjdGlvbkNvbWJvQm94LmFkZChKQVZBKTsKLQkJLy9zaW5jZSB3ZSBoYXZlIG5vdCBsb29rZWQgYXQgQyMgc3VwcG9ydCBzZXJpb3VzbHkKLQkJLy9mb3IgYSBsb25nIHRpbWUsIHdlJ2xsIGp1c3QgbGVhdmUgaXQgb3V0Ci0JCS8vbGFuZ3VhZ2VTZWxlY3Rpb25Db21ib0JveC5hZGQoQ19TSEFSUCk7Ci0KLQkJbGFuZ3VhZ2VTZWxlY3Rpb25Db21ib0JveC5zZWxlY3QoMCk7Ci0JfQotCQotCS8qKgotCSAqIEZpbGwgdGhlIGNvbWJvIHdpdGggcHJvcGVyb3B0aW9uIHNlbGVjdGlvbgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBmaWxsQ29kZWdlbk9wdGlvblNlbGVjdGlvbkNvbWJvQm94KCkgewotCQljb2RlZ2VuT3B0aW9uU2VsZWN0aW9uQ29tYm9Cb3guYWRkKERFRkFVTFQpOwotCQljb2RlZ2VuT3B0aW9uU2VsZWN0aW9uQ29tYm9Cb3guYWRkKENVU1RPTSk7Ci0JCWNvZGVnZW5PcHRpb25TZWxlY3Rpb25Db21ib0JveC5zZWxlY3QoMCk7Ci0JfQotCi0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIHN0YXR1cyBvZiB0aGUgc2VydmVyLXNpZGUgY2hlY2tib3gsIGFuZCBlbmFibGVzL2Rpc2FibGVzCi0JICogdGhlIGdlbmVyYXRpb24gY2hlY2tib3ggZm9yIFhNTCBjb25maWd1cmF0aW9uIGZpbGUKLQkgKi8KLQlwcml2YXRlIHZvaWQgaGFuZGxlU2VydmVyc2lkZVNlbGVjdGlvbigpIHsKLQkJaWYgKHRoaXMuc2VydmVyU2lkZUNoZWNrQm94QnV0dG9uLmdldFNlbGVjdGlvbigpKSB7Ci0JCQlzZXR0aW5ncy5wdXQoUFJFRl9DSEVDS19HRU5FUkFURV9TRVJWRVJTSURFLCBzZXJ2ZXJTaWRlQ2hlY2tCb3hCdXR0b24KLQkJCQkJLmdldFNlbGVjdGlvbigpKTsKLQkJCXRoaXMuc2VydmVyWE1MQ2hlY2tCb3hCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCS8vdGhpcy5nZW5lcmF0ZUFsbENoZWNrQm94QnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQl0aGlzLmdlbmVyYXRlU2VydmVyU2lkZUludGVyZmFjZUNoZWNrQm94QnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlpZihjbGllbnRTaWRlQ2hlY2tCb3hCdXR0b24uZ2V0U2VsZWN0aW9uKCk9PXRydWUgCi0JCQkJCXx8IGdlbmVyYXRlQWxsQ2hlY2tCb3hCdXR0b24uZ2V0U2VsZWN0aW9uKCkgPT0gdHJ1ZSl7Ci0JCQkJdW5jaGVja0NsaWVudFNpZGUoKTsKLQkJCQl1bmNoZWNrR2VuZXJhdGVBbGwoKTsKLQkJCQlzZXJ2ZXJTaWRlQ2hlY2tCb3hCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJCXNldHRpbmdzLnB1dChQUkVGX0NIRUNLX0dFTkVSQVRFX1NFUlZFUlNJREUsIHNlcnZlclNpZGVDaGVja0JveEJ1dHRvbgotCQkJCQkJLmdldFNlbGVjdGlvbigpKTsKLQkJCX0KLQkJCXRoaXMuc3luY0FuZEFzeW5jUmFkaW9CdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCXRoaXMuYXN5bmNPbmx5UmFkaW9CdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCXRoaXMuc3luY09ubHlSYWRpb0J1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJLy9lYXJsaWVyIGV4aXN0aW5nIGNvZGUgKFRoaXMgb25seSBzZXQgZm9jdXMgZmFsc2UpCi0JCQl0aGlzLnN5bmNBbmRBc3luY1JhZGlvQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJdGhpcy5hc3luY09ubHlSYWRpb0J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCXRoaXMuc3luY09ubHlSYWRpb0J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCXRoaXMudGVzdENhc2VDaGVja0JveEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCXRoaXMudGVzdENhc2VDaGVja0JveEJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCi0JCX0gCi0JCQllbHNlIHsKLS8vCQkJLy9hZGRlZCB0aGlzIHRvIGluY3JlYXNlIHRoZSBVSSBmZWF0dXJlcyAodGhpcyB3aWxsIGRlc2VsY3QgYWxsIHRoZSBzZWxlY3RlZCBmZWF0dXJlcykKLS8vCQkJdGhpcy5zZXJ2ZXJYTUxDaGVja0JveEJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotLy8JCQkvL3RoaXMuZ2VuZXJhdGVBbGxDaGVja0JveEJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotLy8JCQl0aGlzLmdlbmVyYXRlU2VydmVyU2lkZUludGVyZmFjZUNoZWNrQm94QnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0vLwkJCS8vZWFybGllciBleGlzdGluZyBjb2RlIChUaGlzIG9ubHkgc2V0IGZvY3VzIGZhbHNlKQotLy8JCQl0aGlzLnNlcnZlclhNTENoZWNrQm94QnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotLy8JCQkvL3RoaXMuZ2VuZXJhdGVBbGxDaGVja0JveEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLS8vCQkJdGhpcy5nZW5lcmF0ZVNlcnZlclNpZGVJbnRlcmZhY2VDaGVja0JveEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWlmKGNsaWVudFNpZGVDaGVja0JveEJ1dHRvbi5nZXRTZWxlY3Rpb24oKT09ZmFsc2UgCi0JCQkJCSYmIGdlbmVyYXRlQWxsQ2hlY2tCb3hCdXR0b24uZ2V0U2VsZWN0aW9uKCkgPT0gZmFsc2UpewotCQkJCXNlcnZlclNpZGVDaGVja0JveEJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQkJc2V0dGluZ3MucHV0KFBSRUZfQ0hFQ0tfR0VORVJBVEVfU0VSVkVSU0lERSwgc2VydmVyU2lkZUNoZWNrQm94QnV0dG9uCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCkpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgc3RhdHVzIG9mIHRoZSBjbGllbnQtc2lkZSBjaGVja2JveCwgYW5kIGVuYWJsZXMvZGlzYWJsZXMKLQkgKiB0aGUgZ2VuZXJhdGlvbiBjaGVja2JveCBmb3IgWE1MIGNvbmZpZ3VyYXRpb24gZmlsZQotCSAqLwotCXByaXZhdGUgdm9pZCBoYW5kbGVDbGllbnRzaWRlU2VsZWN0aW9uKCkgewotCQlpZiAodGhpcy5jbGllbnRTaWRlQ2hlY2tCb3hCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCXRoaXMuc3luY0FuZEFzeW5jUmFkaW9CdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJdGhpcy5zeW5jQW5kQXN5bmNSYWRpb0J1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCQkJdGhpcy5hc3luY09ubHlSYWRpb0J1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCQkJdGhpcy5zeW5jT25seVJhZGlvQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlpZihzZXJ2ZXJTaWRlQ2hlY2tCb3hCdXR0b24uZ2V0U2VsZWN0aW9uKCk9PXRydWUgCi0JCQkJCXx8IGdlbmVyYXRlQWxsQ2hlY2tCb3hCdXR0b24uZ2V0U2VsZWN0aW9uKCkgPT0gdHJ1ZSl7Ci0JCQkJY2xpZW50U2lkZUNoZWNrQm94QnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCQlzZXR0aW5ncy5wdXQoUFJFRl9DSEVDS19HRU5FUkFURV9DTElFTlRTSURFLCBjbGllbnRTaWRlQ2hlY2tCb3hCdXR0b24KLQkJCQkJCS5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJdW5jaGVja1NlcnZlclNpZGUoKTsKLQkJCQl1bmNoZWNrR2VuZXJhdGVBbGwoKTsKLQkJCX0KLQkJCXRoaXMuc2VydmVyWE1MQ2hlY2tCb3hCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl0aGlzLnNlcnZlclhNTENoZWNrQm94QnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQl0aGlzLmdlbmVyYXRlU2VydmVyU2lkZUludGVyZmFjZUNoZWNrQm94QnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJdGhpcy5nZW5lcmF0ZVNlcnZlclNpZGVJbnRlcmZhY2VDaGVja0JveEJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJdGhpcy50ZXN0Q2FzZUNoZWNrQm94QnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvL2FkZGVkIHRoaXMgdG8gaW5jcmVhc2UgdGhlIFVJIGZlYXR1cmVzICh0aGlzIHdpbGwgZGVzZWxjdCBhbGwgdGhlIHNlbGVjdGVkIGZlYXR1cmVzKQotLy8JCQl0aGlzLnN5bmNBbmRBc3luY1JhZGlvQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0vLwkJCXRoaXMuYXN5bmNPbmx5UmFkaW9CdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLS8vCQkJdGhpcy5zeW5jT25seVJhZGlvQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQkvL2VhcmxpZXIgZXhpc3RpbmcgY29kZSAoVGhpcyBvbmx5IHNldCBmb2N1cyBmYWxzZSkKLS8vCQkJdGhpcy5zeW5jQW5kQXN5bmNSYWRpb0J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLS8vCQkJdGhpcy5hc3luY09ubHlSYWRpb0J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLS8vCQkJdGhpcy5zeW5jT25seVJhZGlvQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJaWYoc2VydmVyU2lkZUNoZWNrQm94QnV0dG9uLmdldFNlbGVjdGlvbigpPT1mYWxzZSAKLQkJCQkJJiYgZ2VuZXJhdGVBbGxDaGVja0JveEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSA9PSBmYWxzZSl7Ci0JCQkJY2xpZW50U2lkZUNoZWNrQm94QnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCQlzZXR0aW5ncy5wdXQoUFJFRl9DSEVDS19HRU5FUkFURV9DTElFTlRTSURFLCBjbGllbnRTaWRlQ2hlY2tCb3hCdXR0b24KLQkJCQkJCS5nZXRTZWxlY3Rpb24oKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZUdlbmVyYXRlQWxsU2VsZWN0aW9uKCkgewotCQlpZiAodGhpcy5nZW5lcmF0ZUFsbENoZWNrQm94QnV0dG9uLmdldFNlbGVjdGlvbigpKSB7Ci0JCQlzZXR0aW5ncy5wdXQoUFJFRl9HRU5fQUxMLCBnZW5lcmF0ZUFsbENoZWNrQm94QnV0dG9uCi0JCQkJCS5nZXRTZWxlY3Rpb24oKSk7Ci0JCQlpZihzZXJ2ZXJTaWRlQ2hlY2tCb3hCdXR0b24uZ2V0U2VsZWN0aW9uKCk9PXRydWUgCi0JCQkJCXx8IGNsaWVudFNpZGVDaGVja0JveEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSA9PSB0cnVlKXsKLQkJCQl0aGlzLnNlcnZlclNpZGVDaGVja0JveEJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJCXNldHRpbmdzLnB1dChQUkVGX0NIRUNLX0dFTkVSQVRFX1NFUlZFUlNJREUsIHNlcnZlclNpZGVDaGVja0JveEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJdW5jaGVja1NlcnZlclNpZGUoKTsKLQkJCQl1bmNoZWNrQ2xpZW50U2lkZSgpOwotCQkJfQotCQkJdGhpcy5zeW5jQW5kQXN5bmNSYWRpb0J1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJdGhpcy5hc3luY09ubHlSYWRpb0J1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJdGhpcy5zeW5jT25seVJhZGlvQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQkvL2VhcmxpZXIgZXhpc3RpbmcgY29kZSAoVGhpcyBvbmx5IHNldCBmb2N1cyBmYWxzZSkKLQkJCXRoaXMuc3luY0FuZEFzeW5jUmFkaW9CdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl0aGlzLmFzeW5jT25seVJhZGlvQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJdGhpcy5zeW5jT25seVJhZGlvQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCi0JCQl0aGlzLnNlcnZlclhNTENoZWNrQm94QnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJdGhpcy5zZXJ2ZXJYTUxDaGVja0JveEJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJdGhpcy5nZW5lcmF0ZVNlcnZlclNpZGVJbnRlcmZhY2VDaGVja0JveEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCXRoaXMuZ2VuZXJhdGVTZXJ2ZXJTaWRlSW50ZXJmYWNlQ2hlY2tCb3hCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCXRoaXMudGVzdENhc2VDaGVja0JveEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCQl9Ci0JCWVsc2V7Ci0JCQlpZihzZXJ2ZXJTaWRlQ2hlY2tCb3hCdXR0b24uZ2V0U2VsZWN0aW9uKCk9PWZhbHNlIAotCQkJCQl8fCBjbGllbnRTaWRlQ2hlY2tCb3hCdXR0b24uZ2V0U2VsZWN0aW9uKCkgPT0gZmFsc2UpewotCQkJCWdlbmVyYXRlQWxsQ2hlY2tCb3hCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJCXNldHRpbmdzLnB1dChQUkVGX0dFTl9BTEwsIGdlbmVyYXRlQWxsQ2hlY2tCb3hCdXR0b24KLQkJCQkJCS5nZXRTZWxlY3Rpb24oKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHNlbGVjdGVkIGxhbmd1YWdlCi0JICogCi0JICogQHJldHVybiBhIHN0cmluZyBjb250YWluaW5nIHRoZSBuYW1lIG9mIHRoZSB0YXJnZXQgbGFuZ3VhZ2UKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNlbGVjdGVkTGFuZ3VhZ2UoKSB7Ci0JCXJldHVybiBsYW5ndWFnZVNlbGVjdGlvbkNvbWJvQm94LmdldEl0ZW0obGFuZ3VhZ2VTZWxlY3Rpb25Db21ib0JveAotCQkJCS5nZXRTZWxlY3Rpb25JbmRleCgpKTsKLQl9Ci0KLQkvKioKLQkgKiB0aGUgYXN5bmMgb25seSBzdGF0dXMKLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgIkdlbmVyYXRlIGFzeW5jaHJvbm91cyBjb2RlIG9ubHkiIGlzIGNoZWNrZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FzeW5jT25seU9uKCkgewotCQlyZXR1cm4gYXN5bmNPbmx5UmFkaW9CdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogdGhlIHN5bmMgb25seSBzdGF0dXMKLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgIkdlbmVyYXRlIHN5bmNocm9ub3VzIGNvZGUgb25seSIgaXMgY2hlY2tlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU3luY09ubHlPbigpIHsKLQkJcmV0dXJuIHN5bmNPbmx5UmFkaW9CdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogcmV0dXJuIHRoZSBwYWNrYWdlIG5hbWUKLQkgKiAKLQkgKiBAcmV0dXJuIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHBhY2thZ2UgbmFtZSB0byB1c2UgZm9yIGNvZGUgZ2VuZXJhdGlvbgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKSB7Ci0JCWlmICgiIi5lcXVhbHMocGFja2FnZVRleHQuZ2V0VGV4dCgpLnRyaW0oKSkpewotCQkJLy93ZSBkbyBub3QgYWxsb3cgdGhlIHBhY2thZ2luZyB0byBiZSBlbXB0eQotCQkJLy9pZiB0aGUgdXNlciBzZXRzIGl0IHRvIGVtcHR5IHdlIHNldCBpdCB0bwotCQkJLy90aGUgZGVmYXVsdAotCQkJcmV0dXJuIFVSTFByb2Nlc3Nvci5ERUZBVUxUX1BBQ0tBR0U7Ci0JCX0KLQkJcmV0dXJuIHRoaXMucGFja2FnZVRleHQuZ2V0VGV4dCgpOwotCX0KLQotCS8qKgotCSAqIFRoZSBzZXJ2ZXJzaWRlIHN0YXR1cwotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZSBpZiAiR2VuZXJhdGUgU2VydmVyLVNpZGUiIGlzIGNoZWNrZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NlcnZlcnNpZGUoKSB7Ci0JCXJldHVybiB0aGlzLnNlcnZlclNpZGVDaGVja0JveEJ1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgIkdlbmVyYXRlIFhNTCBjb25maWd1cmF0aW9uIGZpbGUiIGlzIGNoZWNrZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NlcnZlclhNTCgpIHsKLQkJaWYgKHRoaXMuc2VydmVyWE1MQ2hlY2tCb3hCdXR0b24uaXNFbmFibGVkKCkpCi0JCQlyZXR1cm4gdGhpcy5zZXJ2ZXJYTUxDaGVja0JveEJ1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLQkJZWxzZQotCQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZSBpZiAiR2VuZXJhdGUgdGVzdCBjYXNlIiBpcyBjaGVja2VkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNHZW5lcmF0ZVRlc3RDYXNlKCkgewotCQlyZXR1cm4gdGhpcy50ZXN0Q2FzZUNoZWNrQm94QnV0dG9uLmdldFNlbGVjdGlvbigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi50b29sLmNvZGVnZW4uZWNsaXBzZS51aS5Db2RlZ2VuUGFnZSNnZXRQYWdlVHlwZSgpCi0JICovCi0JcHVibGljIGludCBnZXRQYWdlVHlwZSgpIHsKLQkJcmV0dXJuIFdTRExfMl9KQVZBX1RZUEU7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBudWxsIGlmIHBvcnRuYW1lIGlzIGVtcHR5Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRQb3J0TmFtZSgpIHsKLQkJaW50IHNlbGVjdGlvbkluZGV4ID0gcG9ydE5hbWVDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQlpZiAoc2VsZWN0aW9uSW5kZXggIT0gLTEpIHsKLQkJCVN0cmluZyB0ZXh0ID0gdGhpcy5wb3J0TmFtZUNvbWJvLmdldEl0ZW0oc2VsZWN0aW9uSW5kZXgpOwotCi0JCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQudHJpbSgpLmVxdWFscygiIikpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCXJldHVybiB0ZXh0OwotCQl9IGVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG51bGwgaWYgdGhlIHRleHQgaXMgZW1wdHkKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNlcnZpY2VOYW1lKCkgewotCQlpbnQgc2VsZWN0aW9uSW5kZXggPSBzZXJ2aWNlTmFtZUNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCS8vIGNhdGVyIGZvciB0aGUgc2NlbmFyaW8gd2hlcmUgdGhlIGNvbWJvJ3MgY2FuIGJlIGVtcHR5Ci0JCWlmIChzZWxlY3Rpb25JbmRleCAhPSAtMSkgewotCQkJU3RyaW5nIHRleHQgPSB0aGlzLnNlcnZpY2VOYW1lQ29tYm8uZ2V0SXRlbShzZWxlY3Rpb25JbmRleCk7Ci0KLQkJCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC50cmltKCkuZXF1YWxzKCIiKSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJcmV0dXJuIHRleHQ7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERhdGFiaW5kZXJOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5kYXRhYmluZGluZ1R5cGVDb21iby5nZXRJdGVtKGRhdGFiaW5kaW5nVHlwZUNvbWJvCi0JCQkJLmdldFNlbGVjdGlvbkluZGV4KCkpOwotCi0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldEdlbmVyYXRlU2VydmVyU2lkZUludGVyZmFjZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2VuZXJhdGVTZXJ2ZXJTaWRlSW50ZXJmYWNlQ2hlY2tCb3hCdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0JfQotCQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRHZW5lcmF0ZUFsbCgpIHsKLQkJcmV0dXJuIHRoaXMuZ2VuZXJhdGVBbGxDaGVja0JveEJ1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLQl9Ci0JCi0JLyoqCi0JICogZ2V0IHRoZSBwYWNrYWdlIHRvIG5hbWVzcGFjZSBtYXBwaW5ncwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5zMlBrZ01hcHBpbmcoKXsKLQkJU3RyaW5nIHJldHVybkxpc3Q9IiI7Ci0JCVRhYmxlSXRlbVtdIGl0ZW1zID0gbmFtZXNwYWNlMnBhY2thZ2VUYWJsZS5nZXRJdGVtcygpOwotCQlTdHJpbmcgcGFja2FnZVZhbHVlOyAKLQkJZm9yIChpbnQgaT0wO2k8aXRlbXMubGVuZ3RoO2krKyl7Ci0JCQlwYWNrYWdlVmFsdWUgPSBpdGVtc1tpXS5nZXRUZXh0KDEpOwotCQkJaWYgKHBhY2thZ2VWYWx1ZSE9bnVsbCAmJiAhIiIuZXF1YWxzKHBhY2thZ2VWYWx1ZSkpewotCQkJCXJldHVybkxpc3QgPSByZXR1cm5MaXN0ICsKLQkJCQkgICAgICAgICAgICAgKCIiLmVxdWFscyhyZXR1cm5MaXN0KT8iIjoiLCIpICsKLQkJCQkgICAgICAgICAgICAgaXRlbXNbaV0uZ2V0VGV4dCgwKSsgIj0iICsgcGFja2FnZVZhbHVlOwotCQkJfQotCQkJCi0JCX0KLQkJcmV0dXJuICIiLmVxdWFscyhyZXR1cm5MaXN0KT9udWxsOnJldHVybkxpc3Q7Ci0JfQotCQotCQotCXByaXZhdGUgdm9pZCBkaXNhYmxlQ29udHJvbHMoKXsKLQkJdGhpcy5jb2RlZ2VuT3B0aW9uU2VsZWN0aW9uQ29tYm9Cb3guc2VsZWN0KDApOwotCQl0aGlzLnRlc3RDYXNlQ2hlY2tCb3hCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIHRoaXMudGVzdENhc2VDaGVja0JveEJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotICAgICAgICB0aGlzLmRhdGFiaW5kaW5nVHlwZUNvbWJvLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICB0aGlzLmRhdGFiaW5kaW5nVHlwZUNvbWJvLnNlbGVjdCgwKTsKLSAgICAgICAgdGhpcy5nZW5lcmF0ZUFsbENoZWNrQm94QnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICB0aGlzLmdlbmVyYXRlQWxsQ2hlY2tCb3hCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLSAgICAgICAgdGhpcy5nZW5lcmF0ZVNlcnZlclNpZGVJbnRlcmZhY2VDaGVja0JveEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgdGhpcy5nZW5lcmF0ZVNlcnZlclNpZGVJbnRlcmZhY2VDaGVja0JveEJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotICAgICAgICB0aGlzLmxhbmd1YWdlU2VsZWN0aW9uQ29tYm9Cb3guc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIHRoaXMubmFtZXNwYWNlMnBhY2thZ2VUYWJsZS5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgdGhpcy5wYWNrYWdlVGV4dC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0gICAgICAgIHRoaXMucG9ydE5hbWVDb21iby5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgdGhpcy5wb3J0TmFtZUNvbWJvLnNlbGVjdCgwKTsgICAgICAgIAotICAgICAgICB0aGlzLnNlcnZlclNpZGVDaGVja0JveEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgdGhpcy5zZXJ2ZXJTaWRlQ2hlY2tCb3hCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLSAgICAgICAgdGhpcy5zZXJ2ZXJYTUxDaGVja0JveEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgdGhpcy5zZXJ2ZXJYTUxDaGVja0JveEJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotICAgICAgICB0aGlzLnNlcnZpY2VOYW1lQ29tYm8uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIHRoaXMuc2VydmljZU5hbWVDb21iby5zZWxlY3QoMCk7Ci0gICAgICAgIHRoaXMuc3luY09ubHlSYWRpb0J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgdGhpcy5zeW5jT25seVJhZGlvQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0gICAgICAgIHRoaXMuYXN5bmNPbmx5UmFkaW9CdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIHRoaXMuYXN5bmNPbmx5UmFkaW9CdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLSAgICAgICAgdGhpcy5zeW5jQW5kQXN5bmNSYWRpb0J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgdGhpcy5zeW5jQW5kQXN5bmNSYWRpb0J1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0gICAgICAgIHRoaXMucGFja2FnZVRleHQuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIHRoaXMuY2xpZW50U2lkZUNoZWNrQm94QnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICB0aGlzLmNsaWVudFNpZGVDaGVja0JveEJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0gICAgICAgIHRoaXMuZ2VuZXJhdGVBbGxDaGVja0JveEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgdGhpcy5hZHZhbmNlT3B0aW9uc0J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGVuYWJsZUNvbnRyb2xzKCl7Ci0gICAgICAgIHRoaXMudGVzdENhc2VDaGVja0JveEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICB0aGlzLmRhdGFiaW5kaW5nVHlwZUNvbWJvLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgIHRoaXMubGFuZ3VhZ2VTZWxlY3Rpb25Db21ib0JveC5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICB0aGlzLm5hbWVzcGFjZTJwYWNrYWdlVGFibGUuc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgdGhpcy5wYWNrYWdlVGV4dC5zZXRFZGl0YWJsZSh0cnVlKTsKLSAgICAgICAgdGhpcy5wb3J0TmFtZUNvbWJvLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgIHRoaXMuc2VydmVyU2lkZUNoZWNrQm94QnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgIHRoaXMuc2VydmljZU5hbWVDb21iby5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICB0aGlzLnN5bmNPbmx5UmFkaW9CdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgdGhpcy5hc3luY09ubHlSYWRpb0J1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICB0aGlzLnN5bmNBbmRBc3luY1JhZGlvQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgIHRoaXMucGFja2FnZVRleHQuc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgdGhpcy5jbGllbnRTaWRlQ2hlY2tCb3hCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgdGhpcy5nZW5lcmF0ZUFsbENoZWNrQm94QnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgIHRoaXMuYWR2YW5jZU9wdGlvbnNCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICB9Ci0JCi0JLyoqCi0JICogZ2V0IHRoZSBwYWNrYWdlIGRlcml2ZWQgYnkgIE5hbWVzcGFjZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGFja2FnZUZyb21OYW1lc3BhY2UoU3RyaW5nIG5hbWVzcGFjZSl7Ci0JCXJldHVybiAgVVJMUHJvY2Vzc29yLm1ha2VQYWNrYWdlTmFtZShuYW1lc3BhY2UpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgaGFuZGxlQ3VzdG9tUGFja2FnZU5hbWVNb2RpZnlFdmVudCgpIHsKLQkvLyBUaGlzIG1ldGhvZCBpcyBhZGQgYXMgYSB0ZW1wb3J5IGZpeCBmb3IgdGhlIEF4aXMyLTEzNjggCi0JLy8gVE9ETyBmaXggdGhpcyBwZXJtYW5hbnRseS4JCi0JU3RyaW5nIHRleHQgPSB0aGlzLnBhY2thZ2VUZXh0LmdldFRleHQoKTsKLQlpZiAoKHRleHQgPT0gbnVsbCkgfHwgKHRleHQudHJpbSgpLmVxdWFscygiIikpfHwgKHRleHQuZW5kc1dpdGgoIi4iKSkgfHwgKHRleHQuc3RhcnRzV2l0aCgiLiIpKSkgewotCQl1cGRhdGVTdGF0dXMob3JnLmFwYWNoZS5heGlzMi50b29sLmNvZGVnZW4uZWNsaXBzZS5wbHVnaW4uQ29kZWdlbldpemFyZFBsdWdpbgotCQkJCS5nZXRSZXNvdXJjZVN0cmluZygicGFnZTIucGFjaGFnZS5lcnJvci5ub2xvY2F0aW9uIikpOwotCQlyZXR1cm47Ci0JfQotCQl1cGRhdGVTdGF0dXMobnVsbCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCB1bmNoZWNrU2VydmVyU2lkZSgpewotCQl0aGlzLnNlcnZlclNpZGVDaGVja0JveEJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQlzZXR0aW5ncy5wdXQoUFJFRl9DSEVDS19HRU5FUkFURV9TRVJWRVJTSURFLCBzZXJ2ZXJTaWRlQ2hlY2tCb3hCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgdW5jaGVja0NsaWVudFNpZGUoKXsKLQkJdGhpcy5jbGllbnRTaWRlQ2hlY2tCb3hCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJc2V0dGluZ3MucHV0KFBSRUZfQ0hFQ0tfR0VORVJBVEVfQ0xJRU5UU0lERSwgY2xpZW50U2lkZUNoZWNrQm94QnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHVuY2hlY2tHZW5lcmF0ZUFsbCgpewotCQl0aGlzLmdlbmVyYXRlQWxsQ2hlY2tCb3hCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJc2V0dGluZ3MucHV0KFBSRUZfR0VOX0FMTCwgZ2VuZXJhdGVBbGxDaGVja0JveEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0KLQl9Ci0JCi0JcHVibGljIEhhc2hNYXAgZ2V0QWR2YW5jZU9wdGlvbnMoKXsKLQkJaWYgKGFkdmFuY2VPcHRpb25zQnV0dG9uLmdldEVuYWJsZWQoKSkKLQkJCXJldHVybiBhZHZhbmNlT3B0aW9uczsKLQkJZWxzZQotCQkJcmV0dXJuIGdldEluaXRpYWxpc2VkQWR2YW5jZU9wdGlvbnMoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2UtY29kZWdlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvY29kZWdlbi9lY2xpcHNlL3VpL091dHB1dFBhZ2UuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1jb2RlZ2VuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9jb2RlZ2VuL2VjbGlwc2UvdWkvT3V0cHV0UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDEwNGQ2Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1jb2RlZ2VuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9jb2RlZ2VuL2VjbGlwc2UvdWkvT3V0cHV0UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50b29sLmNvZGVnZW4uZWNsaXBzZS51aTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbC5jb2RlZ2VuLmVjbGlwc2UucGx1Z2luLkNvZGVnZW5XaXphcmRQbHVnaW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29sLmNvZGVnZW4uZWNsaXBzZS51dGlsLlVJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXJlY3RvcnlEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkNvbnRhaW5lclNlbGVjdGlvbkRpYWxvZzsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotcHVibGljIGNsYXNzIE91dHB1dFBhZ2UgZXh0ZW5kcyBBYnN0cmFjdFdpemFyZFBhZ2UgewotCi0JcHJpdmF0ZSBUZXh0IG91dHB1dExvY2F0aW9uOwotCQotCXByaXZhdGUgVGV4dCBheGlzSG9tZUxvY2F0aW9uOwotCQotCXByaXZhdGUgVGV4dCBqYXJGaWxlTmFtZVRleHQ7Ci0KLQlwcml2YXRlIEJ1dHRvbiBicm93c2VCdXR0b247Ci0JCi0JcHJpdmF0ZSBCdXR0b24gYXhpc0hvbWVCcm93c2VCdXR0b247Ci0JCi0JcHJpdmF0ZSBCdXR0b24gYXhpc0xvYWRMaWJzQnV0dG9uOwotCQotCXByaXZhdGUgQnV0dG9uIGNvcHlMaWJCdXR0b247Ci0JCi0JcHJpdmF0ZSBCdXR0b24gamFyQ3JlYXRpb25CdXR0b247Ci0KLQlwcml2YXRlIEJ1dHRvbiB3b3Jrc3BhY2VQcm9qZWN0T3B0aW9uc0J1dHRvbjsKLQotCXByaXZhdGUgQnV0dG9uIGZpbGVzeVN0ZW1PcHRpb25zQnV0dG9uOwotCi0JcHJpdmF0ZSBCdXR0b24gY29weVBsdWdpbkxpYkJ1dHRvbjsKLQkKLQlwcml2YXRlIGJvb2xlYW4gd29ya3NwYWNlU2F2ZU9wdGlvbiA9IGZhbHNlOwotCQotCXByaXZhdGUgYm9vbGVhbiBqYXJGaWxlQ29weU9wdGlvbiA9IGZhbHNlOwotCQotCXByaXZhdGUgTGFiZWwgYXhpc0hvbWVMYWJlbDsKLQkKLQlwcml2YXRlIExhYmVsIGF4aXNMb2FkTGliUmVzdWx0c0xhYmVsOwotCQotCXByaXZhdGUgTGFiZWwgamFyRmlsZU5hbWVMYWJlbDsKLQkKLQlwcml2YXRlIFN0cmluZyBheGlzMkxpYnNMb2NhdGlvbiA9IG51bGw7Ci0JCi0JcHJpdmF0ZSBMYWJlbCBoaW50TGFiZWw7Ci0JCi0JcHJpdmF0ZSBCdXR0b24gaGludEJ1dHRvbjsKLQkKLQlwcml2YXRlIGJvb2xlYW4gaGludFZpc2libGUgPSBmYWxzZTsKLQkKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBPdXRwdXRQYWdlKCkgewotCQkgc3VwZXIoInBhZ2UzIik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBzb21lIGluaXRpYWwgdmFsdWVzIGZvciB0aGUgc2V0dGluZ3MuIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVEZWZhdWx0U2V0dGluZ3MoKSB7Ci0JCXNldHRpbmdzLnB1dChQUkVGX09VVFBVVF9MT0NBVElPTiwgIiIpOwotCQlzZXR0aW5ncy5wdXQoUFJFRl9BWElTX0hPTUVfT1VUUFVUX0xPQ0FUSU9OLCAiIik7Ci0JCXNldHRpbmdzLnB1dChQUkVGX0pBUl9GSUxFX05BTUUsICIiKTsKLQkJc2V0dGluZ3MucHV0KFBSRUZfQ0hFQ0tfV09SS1NQQUNFLCBmYWxzZSk7Ci0JCXNldHRpbmdzLnB1dChQUkVGX0NIRUNLX0ZJTEVfU1lTVEVNLCB0cnVlKTsKLQkJc2V0dGluZ3MucHV0KFBSRUZfQ0hFQ0tfQVhJU19MSUJfQ09QWSwgZmFsc2UpOwotCQlzZXR0aW5ncy5wdXQoUFJFRl9DSEVDS19KQVJfQ1JFQVRJT04sIGZhbHNlKTsKLQkJc2V0dGluZ3MucHV0KFBSRUZfQ0hFQ0tfQVhJU19QTFVHSU5fTElCX0NPUFksIGZhbHNlKTsKLQkJd29ya3NwYWNlU2F2ZU9wdGlvbiA9IGZhbHNlOwotCQlqYXJGaWxlQ29weU9wdGlvbiA9IGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJY29udGFpbmVyLnNldExheW91dChsYXlvdXQpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSA5OwotCi0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0KLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlMYWJlbCBzZWxlY3RMYWJlbCA9IG5ldyBMYWJlbChjb250YWluZXIsIFNXVC5OVUxMKTsKLQkJc2VsZWN0TGFiZWwKLQkJCQkuc2V0VGV4dChDb2RlZ2VuV2l6YXJkUGx1Z2luCi0JCQkJCQkuZ2V0UmVzb3VyY2VTdHJpbmcoInBhZ2UzLnJlc3VsdC5kZWNzIikpOwotCQlzZWxlY3RMYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCXdvcmtzcGFjZVByb2plY3RPcHRpb25zQnV0dG9uID0gbmV3IEJ1dHRvbihjb250YWluZXIsIFNXVC5SQURJTyk7Ci0JCXdvcmtzcGFjZVByb2plY3RPcHRpb25zQnV0dG9uLnNldExheW91dERhdGEoZ2QpOwotCQl3b3Jrc3BhY2VQcm9qZWN0T3B0aW9uc0J1dHRvbi5zZXRUZXh0KENvZGVnZW5XaXphcmRQbHVnaW4KLQkJCQkuZ2V0UmVzb3VyY2VTdHJpbmcoInBhZ2UzLndvcmtzcGFjZS5jYXB0aW9uIikpOwotCQl3b3Jrc3BhY2VQcm9qZWN0T3B0aW9uc0J1dHRvbi5zZXRUb29sVGlwVGV4dChDb2RlZ2VuV2l6YXJkUGx1Z2luCi0JCQkJLmdldFJlc291cmNlU3RyaW5nKCJwYWdlMy53b3Jrc3BhY2UuZGVzYyIpKTsKLQkJc2V0dGluZ3MucHV0KFBSRUZfQ0hFQ0tfV09SS1NQQUNFLCBmYWxzZSk7Ci0JCXNldHRpbmdzLnB1dChQUkVGX0NIRUNLX0ZJTEVfU1lTVEVNLCB0cnVlKTsKLQkJd29ya3NwYWNlUHJvamVjdE9wdGlvbnNCdXR0b24uc2V0U2VsZWN0aW9uKHNldHRpbmdzCi0JCQkJLmdldEJvb2xlYW4oUFJFRl9DSEVDS19XT1JLU1BBQ0UpKTsKLQkJd29ya3NwYWNlUHJvamVjdE9wdGlvbnNCdXR0b24KLQkJCQkuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCWhhbmRsZUNoZWNrYm94U2VsZWN0aW9uKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCWZpbGVzeVN0ZW1PcHRpb25zQnV0dG9uID0gbmV3IEJ1dHRvbihjb250YWluZXIsIFNXVC5SQURJTyk7Ci0JCWZpbGVzeVN0ZW1PcHRpb25zQnV0dG9uLnNldExheW91dERhdGEoZ2QpOwotCQlmaWxlc3lTdGVtT3B0aW9uc0J1dHRvbi5zZXRUZXh0KENvZGVnZW5XaXphcmRQbHVnaW4KLQkJCQkuZ2V0UmVzb3VyY2VTdHJpbmcoInBhZ2UzLmZpbGVzeXN0ZW0uY2FwdGlvbiIpKTsKLQkJZmlsZXN5U3RlbU9wdGlvbnNCdXR0b24uc2V0VG9vbFRpcFRleHQoQ29kZWdlbldpemFyZFBsdWdpbgotCQkJCS5nZXRSZXNvdXJjZVN0cmluZygicGFnZTMuZmlsZXN5c3RlbS5kZXNjIikpOwotCQlmaWxlc3lTdGVtT3B0aW9uc0J1dHRvbi5zZXRTZWxlY3Rpb24oc2V0dGluZ3MKLQkJCQkuZ2V0Qm9vbGVhbihQUkVGX0NIRUNLX0ZJTEVfU1lTVEVNKSk7Ci0JCWZpbGVzeVN0ZW1PcHRpb25zQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWhhbmRsZUNoZWNrYm94U2VsZWN0aW9uKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbnRhaW5lciwgU1dULk5VTEwpOwotCQlsYWJlbAotCQkJCS5zZXRUZXh0KG9yZy5hcGFjaGUuYXhpczIudG9vbC5jb2RlZ2VuLmVjbGlwc2UucGx1Z2luLkNvZGVnZW5XaXphcmRQbHVnaW4KLQkJCQkJCS5nZXRSZXNvdXJjZVN0cmluZygicGFnZTMub3V0cHV0LmNhcHRpb24iKSk7Ci0JCQotCQlzZXR0aW5ncy5wdXQoUFJFRl9PVVRQVVRfTE9DQVRJT04sICIiKTsKLQkJc2V0dGluZ3MucHV0KFBSRUZfQVhJU19IT01FX09VVFBVVF9MT0NBVElPTiwgIiIpOwotCQlvdXRwdXRMb2NhdGlvbiA9IG5ldyBUZXh0KGNvbnRhaW5lciwgU1dULkJPUkRFUik7Ci0JCW91dHB1dExvY2F0aW9uLnNldFRleHQoc2V0dGluZ3MuZ2V0KFBSRUZfT1VUUFVUX0xPQ0FUSU9OKSk7Ci0JCW91dHB1dExvY2F0aW9uLnNldExheW91dERhdGEoZ2QpOwotCQlvdXRwdXRMb2NhdGlvbi5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQlzZXR0aW5ncy5wdXQoUFJFRl9PVVRQVVRfTE9DQVRJT04sIG91dHB1dExvY2F0aW9uLmdldFRleHQoKSk7Ci0JCQkJaGFuZGxlTW9kaWZ5RXZlbnQoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJYnJvd3NlQnV0dG9uID0gbmV3IEJ1dHRvbihjb250YWluZXIsIFNXVC5QVVNIKTsKLQkJYnJvd3NlQnV0dG9uLnNldFRleHQoQ29kZWdlbldpemFyZFBsdWdpbgotCQkJCS5nZXRSZXNvdXJjZVN0cmluZygicGFnZTMub3V0c2VsZWN0aW9uLmJyb3dzZSIpKTsKLQkJYnJvd3NlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWhhbmRsZUJyb3dzZSgpOwotCQkJfQotCQl9KTsKLQkJCi0JCQotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCWNvcHlQbHVnaW5MaWJCdXR0b24gPSBuZXcgQnV0dG9uKGNvbnRhaW5lciwgU1dULkNIRUNLKTsKLQkJY29weVBsdWdpbkxpYkJ1dHRvbi5zZXRUZXh0KENvZGVnZW5XaXphcmRQbHVnaW4KLQkJCQkuZ2V0UmVzb3VyY2VTdHJpbmcoInBhZ2UzLmNvcHlwbHVnaW5saWIuY2FwdGlvbiIpKTsKLQkJY29weVBsdWdpbkxpYkJ1dHRvbi5zZXRUb29sVGlwVGV4dChDb2RlZ2VuV2l6YXJkUGx1Z2luCi0JCQkJLmdldFJlc291cmNlU3RyaW5nKCJwYWdlMy5jb3B5cGx1Z2lubGliLmNhcHRpb24iKSk7Ci0JCXNldHRpbmdzLnB1dChQUkVGX0NIRUNLX0FYSVNfUExVR0lOX0xJQl9DT1BZLGZhbHNlKTsKLQkJY29weVBsdWdpbkxpYkJ1dHRvbi5zZXRTZWxlY3Rpb24oc2V0dGluZ3MuZ2V0Qm9vbGVhbihQUkVGX0NIRUNLX0FYSVNfUExVR0lOX0xJQl9DT1BZKSk7Ci0JCWNvcHlQbHVnaW5MaWJCdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWNvcHlQbHVnaW5MaWJCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaGFuZGxlQ29weVBsdWdpbkxpYnNDaGVja0JveCgpOwotCQkJCXNldHRpbmdzLnB1dChQUkVGX0NIRUNLX0FYSVNfUExVR0lOX0xJQl9DT1BZLCBjb3B5UGx1Z2luTGliQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3Bhbj0zOwotCQlMYWJlbCBmaWxsTGFiZWwgPSBuZXcgTGFiZWwoY29udGFpbmVyLCBTV1QuTlVMTCk7Ci0JCWZpbGxMYWJlbC5zZXRUZXh0KCIiKTsKLQkJCi0JCS8vZmlsbGluZyBsYWJlbCAKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlMYWJlbCBmaWxsTGFiZWwxID0gbmV3IExhYmVsKGNvbnRhaW5lciwgU1dULkhPUklaT05UQUwgfCBTV1QuU0VQQVJBVE9SKTsKLQkJZmlsbExhYmVsMS5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQkKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQljb3B5TGliQnV0dG9uID0gbmV3IEJ1dHRvbihjb250YWluZXIsIFNXVC5DSEVDSyk7Ci0JCWNvcHlMaWJCdXR0b24uc2V0VGV4dChDb2RlZ2VuV2l6YXJkUGx1Z2luCi0JCQkJLmdldFJlc291cmNlU3RyaW5nKCJwYWdlMy5hZGRheGlzbGliLmNhcHRpb24iKSk7Ci0JCWNvcHlMaWJCdXR0b24uc2V0VG9vbFRpcFRleHQoQ29kZWdlbldpemFyZFBsdWdpbgotCQkJCS5nZXRSZXNvdXJjZVN0cmluZygicGFnZTMuYWRkYXhpc2xpYi5kZXNjIikpOwotCQlzZXR0aW5ncy5wdXQoUFJFRl9DSEVDS19BWElTX0xJQl9DT1BZLGZhbHNlKTsKLQkJY29weUxpYkJ1dHRvbi5zZXRTZWxlY3Rpb24oc2V0dGluZ3MuZ2V0Qm9vbGVhbihQUkVGX0NIRUNLX0FYSVNfTElCX0NPUFkpKTsKLQkJY29weUxpYkJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLQkJY29weUxpYkJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQloYW5kbGVqYXJDaGVja0JveCgpOwotCQkJCXNldHRpbmdzLnB1dChQUkVGX0NIRUNLX0FYSVNfTElCX0NPUFksIGNvcHlMaWJCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCQkJfQotCQl9KTsKLQkJCi0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWF4aXNIb21lTGFiZWwgPSBuZXcgTGFiZWwoY29udGFpbmVyLCBTV1QuTlVMTCk7Ci0JCWF4aXNIb21lTGFiZWwKLQkJCQkuc2V0VGV4dChDb2RlZ2VuV2l6YXJkUGx1Z2luCi0JCQkJCQkuZ2V0UmVzb3VyY2VTdHJpbmcoInBhZ2UzLmF4aXNob21lLmNhcHRpb24iKSk7Ci0JCQotCQkKLQkJYXhpc0hvbWVMb2NhdGlvbiA9IG5ldyBUZXh0KGNvbnRhaW5lciwgU1dULkJPUkRFUik7Ci0JCWF4aXNIb21lTG9jYXRpb24uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXNldHRpbmdzLnB1dChQUkVGX0FYSVNfSE9NRV9PVVRQVVRfTE9DQVRJT04sICIiKTsKLQkJYXhpc0hvbWVMb2NhdGlvbi5zZXRUZXh0KHNldHRpbmdzLmdldChQUkVGX0FYSVNfSE9NRV9PVVRQVVRfTE9DQVRJT04pKTsKLQkJYXhpc0hvbWVMb2NhdGlvbi5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQlzZXR0aW5ncy5wdXQoUFJFRl9BWElTX0hPTUVfT1VUUFVUX0xPQ0FUSU9OLCBheGlzSG9tZUxvY2F0aW9uLmdldFRleHQoKSk7Ci0JCQkJaGFuZGxlQXhpc0hvbWVNb2RpZnlFdmVudCgpOwotCQkJfQotCQl9KTsKLQotCQlheGlzSG9tZUJyb3dzZUJ1dHRvbiA9IG5ldyBCdXR0b24oY29udGFpbmVyLCBTV1QuUFVTSCk7Ci0JCWF4aXNIb21lQnJvd3NlQnV0dG9uLnNldFRleHQoQ29kZWdlbldpemFyZFBsdWdpbgotCQkJCS5nZXRSZXNvdXJjZVN0cmluZygicGFnZTMub3V0c2VsZWN0aW9uLmJyb3dzZSIpKTsKLQkJYXhpc0hvbWVCcm93c2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaGFuZGxlQXhpc0hvbWVCcm93c2UoKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlheGlzTG9hZExpYnNCdXR0b24gPSBuZXcgQnV0dG9uKGNvbnRhaW5lciwgU1dULlBVU0gpOwotCQlheGlzTG9hZExpYnNCdXR0b24uc2V0VGV4dChDb2RlZ2VuV2l6YXJkUGx1Z2luCi0JCQkJLmdldFJlc291cmNlU3RyaW5nKCJwYWdlMy5sb2FkbGlicy5icm93c2UiKSk7Ci0JCWF4aXNMb2FkTGlic0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQloYW5kbGVMb2FkTGlic0Jyb3dzZSgpOwotCQkJfQotCQl9KTsKLQkJCi0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJYXhpc0xvYWRMaWJSZXN1bHRzTGFiZWwgPSBuZXcgTGFiZWwoY29udGFpbmVyLCBTV1QuTlVMTCk7Ci0JCWF4aXNMb2FkTGliUmVzdWx0c0xhYmVsCS5zZXRUZXh0KCIiKTsKLQkJYXhpc0xvYWRMaWJSZXN1bHRzTGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQotCQkvL2ZpbGxpbmcgbGFiZWwgCi0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMzsKLQkJTGFiZWwgZmlsbExhYmVsMiA9IG5ldyBMYWJlbChjb250YWluZXIsIFNXVC5IT1JJWk9OVEFMIHwgU1dULlNFUEFSQVRPUik7Ci0JCWZpbGxMYWJlbDIuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCWphckNyZWF0aW9uQnV0dG9uPSBuZXcgQnV0dG9uKGNvbnRhaW5lciwgU1dULkNIRUNLKTsKLQkJamFyQ3JlYXRpb25CdXR0b24uc2V0VGV4dChDb2RlZ2VuV2l6YXJkUGx1Z2luCi0JCQkJLmdldFJlc291cmNlU3RyaW5nKCJwYWdlMy5qYXJjcmVhdGlvbi5jYXB0aW9uIikpOwotCQlqYXJDcmVhdGlvbkJ1dHRvbi5zZXRUb29sVGlwVGV4dChDb2RlZ2VuV2l6YXJkUGx1Z2luCi0JCQkJLmdldFJlc291cmNlU3RyaW5nKCJwYWdlMy5qYXJjcmVhdGlvbi5kZXNjIikpOwotCQlzZXR0aW5ncy5wdXQoUFJFRl9DSEVDS19KQVJfQ1JFQVRJT04sZmFsc2UpOwotCQlqYXJDcmVhdGlvbkJ1dHRvbi5zZXRTZWxlY3Rpb24oc2V0dGluZ3MuZ2V0Qm9vbGVhbihQUkVGX0NIRUNLX0pBUl9DUkVBVElPTikpOwotCQlqYXJDcmVhdGlvbkJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLQkJamFyQ3JlYXRpb25CdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaGFuZGxlamFyQ3JlYXRpb25DaGVja0JveCgpOwotLy8JCQkJc2V0dGluZ3MucHV0KFBSRUZfQ0hFQ0tfSkFSX0NSRUFUSU9OLCBqYXJDcmVhdGlvbkJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJamFyRmlsZU5hbWVMYWJlbCA9IG5ldyBMYWJlbChjb250YWluZXIsIFNXVC5OVUxMKTsKLQkJamFyRmlsZU5hbWVMYWJlbAotCQkJCS5zZXRUZXh0KENvZGVnZW5XaXphcmRQbHVnaW4KLQkJCQkJCS5nZXRSZXNvdXJjZVN0cmluZygicGFnZTMuamFybmFtZS5jYXB0aW9uIikpOwotCQkJCQotCQlqYXJGaWxlTmFtZVRleHQgPSBuZXcgVGV4dChjb250YWluZXIsIFNXVC5CT1JERVIpOwotCQlqYXJGaWxlTmFtZVRleHQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWphckZpbGVOYW1lVGV4dC5zZXRUZXh0KHNldHRpbmdzLmdldChQUkVGX0pBUl9GSUxFX05BTUUpKTsKLQkJamFyRmlsZU5hbWVUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCXNldHRpbmdzLnB1dChQUkVGX0pBUl9GSUxFX05BTUUsIGphckZpbGVOYW1lVGV4dC5nZXRUZXh0KCkpOwotLy8JCQkJaGFuZGxlQXhpc0hvbWVNb2RpZnlFdmVudCgpOwotCQkJfQotCQl9KTsKLQkJCi0JCS8vZmlsbGluZyBsYWJlbCAKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlMYWJlbCBmaWxsTGFiZWwzID0gbmV3IExhYmVsKGNvbnRhaW5lciwgU1dULkhPUklaT05UQUwgfCBTV1QuU0VQQVJBVE9SKTsKLQkJZmlsbExhYmVsMy5zZXRMYXlvdXREYXRhKGdkKTsKLQkJCi0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMzsgCi0JCQotCQloaW50QnV0dG9uID0gbmV3IEJ1dHRvbihjb250YWluZXIsIFNXVC5QVVNIKTsKLQkJaGludEJ1dHRvbi5zZXRUZXh0KENvZGVnZW5XaXphcmRQbHVnaW4KLQkJCQkuZ2V0UmVzb3VyY2VTdHJpbmcoInBhZ2UzLmhpbnQub2ZmIikpOwotCQloaW50QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWhhbmRsZUhpbnRCcm93c2UoKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCWhpbnRMYWJlbCA9IG5ldyBMYWJlbChjb250YWluZXIsIFNXVC5OVUxMKTsKLQkJaGludExhYmVsCi0JCQkJLnNldFRleHQoQ29kZWdlbldpemFyZFBsdWdpbgotCQkJCQkJLmdldFJlc291cmNlU3RyaW5nKCJwYWdlMy5oaW50LmNhcHRpb24iKSk7Ci0JCWhpbnRMYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJaGludExhYmVsLnNldFZpc2libGUoaGludFZpc2libGUpOwotCQkKLQkJZGlzYWJsZUNvbnRyb2xzKCk7Ci0JCQotCQlzZXRDb250cm9sKGNvbnRhaW5lcik7Ci0KLQkJLyoKLQkJICogVXBkYXRlIHRoZSBidXR0b25zLCBpbiBjYXNlIHRoaXMgd2FzIHJlc3RvcmVkIGZyb20gYW4gZWFybGllciBzZXR0aW5nCi0JCSAqLwotCQlpZiAocmVzdG9yZWRGcm9tUHJldmlvdXNTZXR0aW5ncykgewotCQkJaGFuZGxlTW9kaWZ5RXZlbnQoKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgaGFuZGxlSGludEJyb3dzZSgpIHsKLQkJaWYgKGhpbnRWaXNpYmxlKSB7Ci0JCQloaW50QnV0dG9uLnNldFRleHQoQ29kZWdlbldpemFyZFBsdWdpbgotCQkJCQkuZ2V0UmVzb3VyY2VTdHJpbmcoInBhZ2UzLmhpbnQub2ZmIikpOwotCQkJaGludFZpc2libGUgPSBmYWxzZTsKLQkJCWhpbnRMYWJlbC5zZXRWaXNpYmxlKGhpbnRWaXNpYmxlKTsKLQkJfSBlbHNlIHsKLQkJCWhpbnRCdXR0b24uc2V0VGV4dChDb2RlZ2VuV2l6YXJkUGx1Z2luCi0JCQkJCS5nZXRSZXNvdXJjZVN0cmluZygicGFnZTMuaGludC5vbiIpKTsKLQkJCWhpbnRWaXNpYmxlID0gdHJ1ZTsKLQkJCWhpbnRMYWJlbC5zZXRWaXNpYmxlKGhpbnRWaXNpYmxlKTsKLQkJfQotCQkKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIG91dHB1dCBsb2NhdGlvbgotCSAqIAotCSAqIEByZXR1cm4gYSBzdHJpbmcgY29udGFpbmluZyB0aGUgZnVsbCBwYXRobmFtZSBvZiB0aGUgb3V0cHV0IGxvY2F0aW9uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRPdXRwdXRMb2NhdGlvbigpIHsKLQkJcmV0dXJuIG91dHB1dExvY2F0aW9uLmdldFRleHQoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF4aXNIb21lTG9jYXRpb24oKSB7Ci0JCXJldHVybiBheGlzSG9tZUxvY2F0aW9uLmdldFRleHQoKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRKYXJGaWxlbmFtZSgpIHsKLQkJcmV0dXJuIGphckZpbGVOYW1lVGV4dC5nZXRUZXh0KCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGdldEF4aXMyUGx1Z2luTGliQ29weUNoZWNrQm94U2VsZWN0aW9uKCl7Ci0vLwkJcmV0dXJuIHNldHRpbmdzLmdldEJvb2xlYW4oUFJFRl9DSEVDS19BWElTX1BMVUdJTl9MSUJfQ09QWSk7Ci0JCXJldHVybiB0aGlzLmNvcHlQbHVnaW5MaWJCdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGdldEF4aXNMaWJDb3B5Q2hlY2tCb3hTZWxlY3Rpb24oKXsKLS8vCQlyZXR1cm4gc2V0dGluZ3MuZ2V0Qm9vbGVhbihQUkVGX0NIRUNLX0FYSVNfTElCX0NPUFkpOwotCQlyZXR1cm4gdGhpcy5jb3B5TGliQnV0dG9uLmdldFNlbGVjdGlvbigpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBnZXRDcmVhdGVKYXJDaGVja0JveFNlbGVjdGlvbigpewotLy8JCXJldHVybiBzZXR0aW5ncy5nZXRCb29sZWFuKFBSRUZfQ0hFQ0tfSkFSX0NSRUFUSU9OKTsKLQkJcmV0dXJuIGphckNyZWF0aW9uQnV0dG9uLmdldFNlbGVjdGlvbigpOwotCQkKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRBeGlzSmFyc0xvY2F0aW9uKCl7Ci0JCXJldHVybiB0aGlzLmF4aXMyTGlic0xvY2F0aW9uOwotCQkKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gb2t0b0xvYWRMaWJzKCl7Ci0JCXJldHVybiB0aGlzLmphckZpbGVDb3B5T3B0aW9uOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRKYXJGaWxlTmFtZShTdHJpbmcgamFyRmlsZU5hbWUpewotCQl0aGlzLmphckZpbGVOYW1lVGV4dC5zZXRUZXh0KGphckZpbGVOYW1lKTsKLQl9Ci0JCi0JLyoqCi0JICogV29ya2VyIG1ldGhvZCBmb3IgaGFuZGxpbmcgbW9kaWZpY2F0aW9ucyB0byB0aGUgdGV4dGJveAotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBoYW5kbGVNb2RpZnlFdmVudCgpIHsKLQkJU3RyaW5nIHRleHQgPSB0aGlzLm91dHB1dExvY2F0aW9uLmdldFRleHQoKTsKLQkJaWYgKCh0ZXh0ID09IG51bGwpIHx8ICh0ZXh0LnRyaW0oKS5lcXVhbHMoIiIpKSkgewotCQkJdXBkYXRlU3RhdHVzKG9yZy5hcGFjaGUuYXhpczIudG9vbC5jb2RlZ2VuLmVjbGlwc2UucGx1Z2luLkNvZGVnZW5XaXphcmRQbHVnaW4KLQkJCQkJLmdldFJlc291cmNlU3RyaW5nKCJwYWdlMy5lcnJvci5ub2xvY2F0aW9uIikpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXVwZGF0ZVN0YXR1cyhudWxsKTsKLQl9Ci0KLQkKLQlwcml2YXRlIHZvaWQgaGFuZGxlQXhpc0hvbWVNb2RpZnlFdmVudCgpIHsKLQkJU3RyaW5nIHRleHQgPSB0aGlzLmF4aXNIb21lTG9jYXRpb24uZ2V0VGV4dCgpOwotCQlpZiAoKHRleHQgPT0gbnVsbCkgfHwgKHRleHQudHJpbSgpLmVxdWFscygiIikpKSB7Ci0JCQl1cGRhdGVTdGF0dXMob3JnLmFwYWNoZS5heGlzMi50b29sLmNvZGVnZW4uZWNsaXBzZS5wbHVnaW4uQ29kZWdlbldpemFyZFBsdWdpbgotCQkJCQkuZ2V0UmVzb3VyY2VTdHJpbmcoInBhZ2UzLmVycm9yLm5vbG9jYXRpb24iKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJdXBkYXRlU3RhdHVzKG51bGwpOwotCX0KLQkKLS8vCXByaXZhdGUgdm9pZCBoYW5kbGVKYXJOYW1lTW9kaWZ5RXZlbnQoKSB7Ci0vLwkJU3RyaW5nIHRleHQgPSB0aGlzLmphckZpbGVOYW1lVGV4dC5nZXRUZXh0KCk7Ci0vLwkJaWYgKCh0ZXh0ID09IG51bGwpIHx8ICh0ZXh0LnRyaW0oKS5lcXVhbHMoIiIpKSkgewotLy8JCQl1cGRhdGVTdGF0dXMob3JnLmFwYWNoZS5heGlzMi50b29sLmNvZGVnZW4uZWNsaXBzZS5wbHVnaW4uQ29kZWdlbldpemFyZFBsdWdpbgotLy8JCQkJCS5nZXRSZXNvdXJjZVN0cmluZygicGFnZTMuZXJyb3Iubm9sb2NhdGlvbiIpKTsKLS8vCQkJcmV0dXJuOwotLy8JCX0KLS8vCQl1cGRhdGVTdGF0dXMobnVsbCk7Ci0vLwl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlQ2hlY2tib3hTZWxlY3Rpb24oKSB7Ci0JCWlmICh3b3Jrc3BhY2VQcm9qZWN0T3B0aW9uc0J1dHRvbi5nZXRTZWxlY3Rpb24oKSkgewotCQkJc2V0dGluZ3MucHV0KFBSRUZfQ0hFQ0tfV09SS1NQQUNFLCB0cnVlKTsKLQkJCXNldHRpbmdzLnB1dChQUkVGX0NIRUNLX0ZJTEVfU1lTVEVNLCBmYWxzZSk7Ci0JCQl3b3Jrc3BhY2VTYXZlT3B0aW9uID0gdHJ1ZTsKLQkJfSBlbHNlIGlmIChmaWxlc3lTdGVtT3B0aW9uc0J1dHRvbi5nZXRTZWxlY3Rpb24oKSkgewotCQkJc2V0dGluZ3MucHV0KFBSRUZfQ0hFQ0tfRklMRV9TWVNURU0sIHRydWUpOwotCQkJc2V0dGluZ3MucHV0KFBSRUZfQ0hFQ0tfV09SS1NQQUNFLCBmYWxzZSk7Ci0JCQl3b3Jrc3BhY2VTYXZlT3B0aW9uID0gZmFsc2U7Ci0JCX0KLQl9Ci0JCi0JCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZWphckNoZWNrQm94KCkgewotCQlpZihjb3B5TGliQnV0dG9uLmdldFNlbGVjdGlvbigpKXsKLQkJCWVuYWJsZUNvbnRyb2xzKCk7Ci0JCQlzZXR0aW5ncy5wdXQoUFJFRl9DSEVDS19BWElTX0xJQl9DT1BZLCB0cnVlKTsKLQkJfWVsc2V7Ci0JCQlkaXNhYmxlQ29udHJvbHMoKTsKLQkJCXNldHRpbmdzLnB1dChQUkVGX0NIRUNLX0FYSVNfTElCX0NPUFksIGZhbHNlKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgaGFuZGxlQ29weVBsdWdpbkxpYnNDaGVja0JveCgpIHsKLQkJaWYoY29weVBsdWdpbkxpYkJ1dHRvbi5nZXRTZWxlY3Rpb24oKSl7Ci0JCQlzZXR0aW5ncy5wdXQoUFJFRl9DSEVDS19BWElTX1BMVUdJTl9MSUJfQ09QWSwgdHJ1ZSk7Ci0JCX1lbHNlewotCQkJc2V0dGluZ3MucHV0KFBSRUZfQ0hFQ0tfQVhJU19QTFVHSU5fTElCX0NPUFksIGZhbHNlKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgaGFuZGxlamFyQ3JlYXRpb25DaGVja0JveCgpIHsKLQkJaWYoamFyQ3JlYXRpb25CdXR0b24uZ2V0U2VsZWN0aW9uKCk9PSB0cnVlKXsKLQkJCXNldHRpbmdzLnB1dChQUkVGX0NIRUNLX0pBUl9DUkVBVElPTiwgdHJ1ZSk7Ci0JCX1lbHNlewotCQkJc2V0dGluZ3MucHV0KFBSRUZfQ0hFQ0tfSkFSX0NSRUFUSU9OLCBmYWxzZSk7Ci0JCQl0aGlzLmphckZpbGVOYW1lVGV4dC5zZXRUZXh0KCIiKTsKLQkJfQotCQlpZihqYXJGaWxlTmFtZUxhYmVsLmVxdWFscygiIikpewotCQkJdXBkYXRlU3RhdHVzKCJQbGVhc2UgZW50ZXIgYSB2YWxpZCBuYW1lIHRvIHRoZSBqYXIgZmlsZSIpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBkaXNhYmxlQ29udHJvbHMoKXsKLQkJdGhpcy5heGlzSG9tZUxvY2F0aW9uLnNldFRleHQoIlVucGFja2VkIEF4aXMyIGJpbmFyeSBob21lIE9yIEF4aXMyIHNvdXJjZSBsb2NhdGlvbiIpOwotCQl0aGlzLmF4aXNIb21lQnJvd3NlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQl0aGlzLmF4aXNIb21lTG9jYXRpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCXRoaXMuamFyQ3JlYXRpb25CdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJdGhpcy5qYXJDcmVhdGlvbkJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJdGhpcy5heGlzSG9tZUxhYmVsLnNldEVuYWJsZWQoZmFsc2UpOwotCQl0aGlzLmF4aXNMb2FkTGliUmVzdWx0c0xhYmVsLnNldFRleHQoIiIpOwotCQl0aGlzLmF4aXNMb2FkTGliUmVzdWx0c0xhYmVsLnNldEVuYWJsZWQoZmFsc2UpOwotCQl0aGlzLmF4aXNMb2FkTGlic0J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJdGhpcy5qYXJGaWxlTmFtZUxhYmVsLnNldEVuYWJsZWQoZmFsc2UpOwotCQl0aGlzLmphckZpbGVOYW1lVGV4dC5zZXRUZXh0KCIiKTsKLQkJdGhpcy5qYXJGaWxlTmFtZVRleHQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCXNldHRpbmdzLnB1dChQUkVGX0NIRUNLX0pBUl9DUkVBVElPTiwgZmFsc2UpOwotCQlqYXJGaWxlQ29weU9wdGlvbiA9IGZhbHNlOwotCQlDb2xvciBjb2xvciA9IGdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9JTkZPX0JBQ0tHUk9VTkQpOwotCQlheGlzTG9hZExpYlJlc3VsdHNMYWJlbC5zZXRCYWNrZ3JvdW5kKGNvbG9yKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGVuYWJsZUNvbnRyb2xzKCl7Ci0JCXRoaXMuYXhpc0hvbWVCcm93c2VCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJdGhpcy5heGlzSG9tZUxvY2F0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXRoaXMuamFyQ3JlYXRpb25CdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJdGhpcy5heGlzSG9tZUxhYmVsLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXRoaXMuYXhpc0xvYWRMaWJSZXN1bHRzTGFiZWwuc2V0RW5hYmxlZCh0cnVlKTsKLQkJdGhpcy5heGlzTG9hZExpYnNCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJdGhpcy5qYXJGaWxlTmFtZUxhYmVsLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXRoaXMuamFyRmlsZU5hbWVUZXh0LnNldEVuYWJsZWQodHJ1ZSk7Ci0JCWlmIChheGlzTG9hZExpYlJlc3VsdHNMYWJlbC5nZXRUZXh0KCkuZXF1YWxzKCIiKSl7Ci0JCQl1cGRhdGVTdGF0dXMoIlBsZWFzZSBlbnRlciBhIHZhbGlkIHBhdGggdG8gdGhlIEF4aXMyIGxpYnMgYW5kIHRoZW4gdHJ5IHRvIGxvYWQgdGhlIGxpYnJhcmllcyB1c2luZyB0aGUgY2hlY2sgbGlicyBidXR0b24iKTsKLQkJfQotCSAgICAgYXhpc0xvYWRMaWJSZXN1bHRzTGFiZWwuc2V0VGV4dChDb2RlZ2VuV2l6YXJkUGx1Z2luCi0JCQkJCS5nZXRSZXNvdXJjZVN0cmluZygicGFnZTMubG9hZGxpYi5mYWlsLmNhcHRpb24iKSk7Ci0JICAgICBDb2xvciBjb2xvciA9IGdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9SRUQpOwotCSAgICAgYXhpc0xvYWRMaWJSZXN1bHRzTGFiZWwuc2V0QmFja2dyb3VuZChjb2xvcik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBoYW5kbGVBeGlzSG9tZUJyb3dzZSgpIHsKLQkJICAgIHRoaXMuYXhpc0hvbWVMb2NhdGlvbi5zZXRUZXh0KCJ1bnBhY2tlZCBBeGlzMiBiaW5hcnkgaG9tZSBPciBBeGlzMiBzb3VyY2UgTG9jYXRpb24iKTsKLQkJCURpcmVjdG9yeURpYWxvZyBkaWFsb2cgPSBuZXcgRGlyZWN0b3J5RGlhbG9nKHRoaXMuZ2V0U2hlbGwoKSk7Ci0JCQlTdHJpbmcgcmV0dXJuU3RyaW5nID0gZGlhbG9nLm9wZW4oKTsKLQkJCWlmIChyZXR1cm5TdHJpbmcgIT0gbnVsbCkgewotCQkJCWF4aXNIb21lTG9jYXRpb24uc2V0VGV4dChyZXR1cm5TdHJpbmcpOwotCQkJCXNldHRpbmdzLnB1dChQUkVGX0FYSVNfSE9NRV9PVVRQVVRfTE9DQVRJT04sIGF4aXNIb21lTG9jYXRpb24uZ2V0VGV4dCgpKTsKLQkJCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZUxvYWRMaWJzQnJvd3NlKCkgewotCQlpZihheGlzSG9tZUxvY2F0aW9uLmdldFRleHQoKS5lcXVhbHMoIiIpKXsKLQkJCSBheGlzTG9hZExpYlJlc3VsdHNMYWJlbC5zZXRUZXh0KENvZGVnZW5XaXphcmRQbHVnaW4KLQkJCQkJCS5nZXRSZXNvdXJjZVN0cmluZygicGFnZTMubG9hZGxpYi5mYWlsLmNhcHRpb24iKSk7Ci0JCQkgamFyRmlsZUNvcHlPcHRpb249ZmFsc2U7Ci0JCSAgICAgaWYgKGF4aXNMb2FkTGliUmVzdWx0c0xhYmVsLmdldFRleHQoKS5lcXVhbHMoIiIpKXsKLQkJCQkJdXBkYXRlU3RhdHVzKCJQbGVhc2UgZW50ZXIgYSB2YWxpZCBwYXRoIHRvIHRoZSBBeGlzMiBsaWJzIGFuZCB0aGVuIHRyeSB0byBsb2FkIHRoZSBsaWJyYXJpZXMgdXNpbmcgdGhlIGNoZWNrIGxpYnMgYnV0dG9uIik7Ci0JCSAgICAgfQotCQl9ZWxzZXsKLQkJCXNldHRpbmdzLnB1dChQUkVGX0FYSVNfSE9NRV9PVVRQVVRfTE9DQVRJT04sIGF4aXNIb21lTG9jYXRpb24uZ2V0VGV4dCgpKTsKLQkJCVN0cmluZyBheGlzX2hvbWUgPSBzZXR0aW5ncy5nZXQoUFJFRl9BWElTX0hPTUVfT1VUUFVUX0xPQ0FUSU9OKTsKLQkJCVN0cmluZyBheGlzX3RhcmdldF9saWI9YXhpc19ob21lK0ZpbGUuc2VwYXJhdG9yK1VJQ29uc3RhbnRzLlRBUkdFVCtGaWxlLnNlcGFyYXRvcitVSUNvbnN0YW50cy5MSUI7Ci0JCQlTdHJpbmcgYXhpc19zdGRfbGliX2RpcmVjdG9yeT1heGlzX2hvbWUrRmlsZS5zZXBhcmF0b3IrVUlDb25zdGFudHMuTElCOwotCi0JCQlGaWxlIGF4aXNfdGFyZ2V0X2xpYnNfZGlyZWN0b3J5ID0gbmV3IEZpbGUoYXhpc190YXJnZXRfbGliKTsKLQkJCUZpbGUgYXhpc19saWJzX2RpcmVjdG9yeSA9IG5ldyBGaWxlKGF4aXNfc3RkX2xpYl9kaXJlY3RvcnkpOwotCQkJIGlmIChheGlzX2xpYnNfZGlyZWN0b3J5LmlzRGlyZWN0b3J5KCkgfHwgYXhpc190YXJnZXRfbGlic19kaXJlY3RvcnkuaXNEaXJlY3RvcnkoKSkgewotCQkJCSBheGlzTG9hZExpYlJlc3VsdHNMYWJlbC5zZXRUZXh0KENvZGVnZW5XaXphcmRQbHVnaW4KLQkJCQkJCQkuZ2V0UmVzb3VyY2VTdHJpbmcoInBhZ2UzLmxvYWRsaWIuc3VjY2Vzcy5jYXB0aW9uIikpOwotCQkJCWlmKGF4aXNfbGlic19kaXJlY3RvcnkuaXNEaXJlY3RvcnkoKSl7Ci0JCQkJCWF4aXMyTGlic0xvY2F0aW9uPWF4aXNfc3RkX2xpYl9kaXJlY3Rvcnk7Ci0JCQkJfQotCQkJCWVsc2UgaWYoYXhpc190YXJnZXRfbGlic19kaXJlY3RvcnkuaXNEaXJlY3RvcnkoKSl7Ci0JCQkJCWF4aXMyTGlic0xvY2F0aW9uPWF4aXNfdGFyZ2V0X2xpYjsKLQkJCQl9Ci0JCQkJIGphckZpbGVDb3B5T3B0aW9uID10cnVlOwotCQkJCSBDb2xvciBjb2xvciA9IGdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9JTkZPX0JBQ0tHUk9VTkQpOwotCQkJCSBheGlzTG9hZExpYlJlc3VsdHNMYWJlbC5zZXRCYWNrZ3JvdW5kKGNvbG9yKTsKLQkJCSB9ZWxzZXsKLQkJCSAgICAgYXhpc0xvYWRMaWJSZXN1bHRzTGFiZWwuc2V0VGV4dChDb2RlZ2VuV2l6YXJkUGx1Z2luCi0JCQkJCQkJLmdldFJlc291cmNlU3RyaW5nKCJwYWdlMy5sb2FkbGliLmZhaWwuY2FwdGlvbiIpKTsKLQkJCSAgICAgQ29sb3IgY29sb3IgPSBnZXRTaGVsbCgpLmdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfUkVEKTsKLQkJCSAgICAgYXhpc0xvYWRMaWJSZXN1bHRzTGFiZWwuc2V0QmFja2dyb3VuZChjb2xvcik7Ci0JCQkgICAgIHVwZGF0ZVN0YXR1cyhvcmcuYXBhY2hlLmF4aXMyLnRvb2wuY29kZWdlbi5lY2xpcHNlLnBsdWdpbi5Db2RlZ2VuV2l6YXJkUGx1Z2luCi0JCQkJCQkuZ2V0UmVzb3VyY2VTdHJpbmcoInBhZ2UzLmxvYWRsaWIuZmFpbC5tZXNzYWdlIikpOwotCQkJICAgICBqYXJGaWxlQ29weU9wdGlvbj1mYWxzZTsKLQkJCSB9Ci0JCX0KLQl9Ci0KLQkKLQkvKioKLQkgKiBIYW5kbGUgdGhlIGJyb3dzZSBidXR0b24gZXZlbnRzOiBvcGVucyBhIGRpYWxvZyB3aGVyZSB0aGUgdXNlciBjYW4gY2hvb3NlCi0JICogYW4gZXh0ZXJuYWwgZGlyZWN0b3J5IGxvY2F0aW9uCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZUJyb3dzZSgpIHsKLQkJLy8gQ2hhbmdlIHRoaXMgdG8gYWRkIHRoZSBjbGFyaXR5IG9mIDIgb3B0aW9uIGJ1dHRpb25zCi0JCS8vIGJvb2xlYW4gbG9jYXRpb24gPSBsb2NhdGlvblNlbGVjdENoZWNrQm94LmdldFNlbGVjdGlvbigpOwotCQlib29sZWFuIGxvY2F0aW9uID0gZmFsc2U7Ci0JCWlmKHNldHRpbmdzLmdldEJvb2xlYW4oUFJFRl9DSEVDS19GSUxFX1NZU1RFTSkpewotCQkJbG9jYXRpb24gPSBmYWxzZTsKLQkJfWVsc2UgaWYoc2V0dGluZ3MuZ2V0Qm9vbGVhbihQUkVGX0NIRUNLX1dPUktTUEFDRSkpewotCQkJbG9jYXRpb24gPSB0cnVlOwotCQl9Ci0KLQkJaWYgKHdvcmtzcGFjZVNhdmVPcHRpb24pIHsKLQkJCWxvY2F0aW9uID0gdHJ1ZTsKLQkJfQotCi0JCWlmICghbG9jYXRpb24pIHsKLQkJCURpcmVjdG9yeURpYWxvZyBkaWFsb2cgPSBuZXcgRGlyZWN0b3J5RGlhbG9nKHRoaXMuZ2V0U2hlbGwoKSk7Ci0JCQlTdHJpbmcgcmV0dXJuU3RyaW5nID0gZGlhbG9nLm9wZW4oKTsKLQkJCWlmIChyZXR1cm5TdHJpbmcgIT0gbnVsbCkgewotCQkJCW91dHB1dExvY2F0aW9uLnNldFRleHQocmV0dXJuU3RyaW5nKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCUlXb3Jrc3BhY2VSb290IHJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCi0JCQlDb250YWluZXJTZWxlY3Rpb25EaWFsb2cgZGlhbG9nID0gbmV3IENvbnRhaW5lclNlbGVjdGlvbkRpYWxvZygKLQkJCQkJZ2V0U2hlbGwoKSwgcm9vdCwgZmFsc2UsIENvZGVnZW5XaXphcmRQbHVnaW4KLQkJCQkJCQkuZ2V0UmVzb3VyY2VTdHJpbmcoInBhZ2UzLmNvbnRhaW5lcmJveC50aXRsZSIpKTsKLQkJCWlmIChkaWFsb2cub3BlbigpID09IENvbnRhaW5lclNlbGVjdGlvbkRpYWxvZy5PSykgewotCQkJCU9iamVjdFtdIHJlc3VsdCA9IGRpYWxvZy5nZXRSZXN1bHQoKTsKLQkJCQlpZiAocmVzdWx0Lmxlbmd0aCA9PSAxKSB7Ci0JCQkJCVBhdGggcGF0aCA9ICgoUGF0aCkgcmVzdWx0WzBdKTsKLQkJCQkJLy8gYXBwZW5kIHRvIHRoZSB3b3Jrc3BhY2UgcGF0aAotCQkJCQlpZiAocm9vdC5leGlzdHMocGF0aCkpIHsKLQkJCQkJCW91dHB1dExvY2F0aW9uLnNldFRleHQocm9vdC5nZXRMb2NhdGlvbigpLmFwcGVuZChwYXRoKQotCQkJCQkJCQkudG9GaWxlKCkuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIudG9vbC5jb2RlZ2VuLmVjbGlwc2UudWkuQ29kZWdlblBhZ2UjZ2V0UGFnZVR5cGUoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0UGFnZVR5cGUoKSB7Ci0JCXJldHVybiBXU0RMXzJfSkFWQV9UWVBFOwotCX0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1jb2RlZ2VuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9jb2RlZ2VuL2VjbGlwc2UvdWkvVG9vbFNlbGVjdGlvblBhZ2UuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1jb2RlZ2VuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9jb2RlZ2VuL2VjbGlwc2UvdWkvVG9vbFNlbGVjdGlvblBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThmOWZjOS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2UtY29kZWdlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvY29kZWdlbi9lY2xpcHNlL3VpL1Rvb2xTZWxlY3Rpb25QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnRvb2wuY29kZWdlbi5lY2xpcHNlLnVpOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29sLmNvZGVnZW4uZWNsaXBzZS5Db2RlR2VuV2l6YXJkOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbC5jb2RlZ2VuLmVjbGlwc2UucGx1Z2luLkNvZGVnZW5XaXphcmRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLQotcHVibGljIGNsYXNzIFRvb2xTZWxlY3Rpb25QYWdlIGV4dGVuZHMgQWJzdHJhY3RXaXphcmRQYWdlIHsKLSAgIAotICAgIHByaXZhdGUgQnV0dG9uIGphdmEyV1NETFJhZGlvQnV0dG9uOwotICAgIHByaXZhdGUgQnV0dG9uIHdzZGwySmF2YVJhZGlvQnV0dG9uOwotICAgIHB1YmxpYyBUb29sU2VsZWN0aW9uUGFnZSgpIHsKLSAgICAgICAgc3VwZXIoInBhZ2UwIik7Ci0gICAgICAgCi0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgc2V0dGluZ3Mgb24gdGhpcyBwYWdlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRTZXR0aW5ncygpIHsKLSAgICAgICAgc2V0dGluZ3MucHV0KFBSRUZfVE9PTF9TRUxFQ1RJT05fSkFWQTJXU0RMLCBmYWxzZSk7Ci0gICAgICAgIHNldHRpbmdzLnB1dChQUkVGX1RPT0xfU0VMRUNUSU9OX1dTREwySkFWQSwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLSAgICAgKi8KLXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICAKLSAgICAgICAgQ29tcG9zaXRlIGNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0gICAgICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICAgICAgY29udGFpbmVyLnNldExheW91dChsYXlvdXQpOwotICAgICAgICBsYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0gICAgICAgIGxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSA5OwotCi0gICAgICAgICAgICAgIAotICAgICAgICBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb250YWluZXIsIFNXVC5OVUxMKTsKLSAgICAgICAgbGFiZWwuc2V0VGV4dChDb2RlZ2VuV2l6YXJkUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJwYWdlMC5vcHRpb25zLmRlc2MiKSk7Ci0gICAgICAgICAgICAgCi0gICAgICAgIHdzZGwySmF2YVJhZGlvQnV0dG9uID0gbmV3IEJ1dHRvbihjb250YWluZXIsU1dULlJBRElPKTsKLSAgICAgICAgd3NkbDJKYXZhUmFkaW9CdXR0b24uc2V0VGV4dChDb2RlZ2VuV2l6YXJkUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJwYWdlMC53c2RsMmphdmEuY2FwdGlvbiIpKTsKLSAgICAgICAgd3NkbDJKYXZhUmFkaW9CdXR0b24uc2V0VG9vbFRpcFRleHQoQ29kZWdlbldpemFyZFBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygicGFnZTAud3NkbDJqYXZhLmRlc2MiKSk7Ci0gICAgICAgIHdzZGwySmF2YVJhZGlvQnV0dG9uLnNldFNlbGVjdGlvbihzZXR0aW5ncy5nZXRCb29sZWFuKFBSRUZfVE9PTF9TRUxFQ1RJT05fV1NETDJKQVZBKSk7Ci0gICAgICAgIHdzZGwySmF2YVJhZGlvQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCl7Ci0gICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaGFuZGxlQ2hlY2tib3hTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgCi0gICAgICAgIGphdmEyV1NETFJhZGlvQnV0dG9uID0gbmV3IEJ1dHRvbihjb250YWluZXIsU1dULlJBRElPKTsKLSAgICAgICAgamF2YTJXU0RMUmFkaW9CdXR0b24uc2V0VGV4dChDb2RlZ2VuV2l6YXJkUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJwYWdlMC5qYXZhMndzZGwuY2FwdGlvbiIpKTsKLSAgICAgICAgamF2YTJXU0RMUmFkaW9CdXR0b24uc2V0VG9vbFRpcFRleHQoQ29kZWdlbldpemFyZFBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygicGFnZTAuamF2YTJ3c2RsLmRlc2MiKSk7Ci0gICAgICAgIGphdmEyV1NETFJhZGlvQnV0dG9uLnNldFNlbGVjdGlvbihzZXR0aW5ncy5nZXRCb29sZWFuKFBSRUZfVE9PTF9TRUxFQ1RJT05fSkFWQTJXU0RMKSk7Ci0gICAgICAgIGphdmEyV1NETFJhZGlvQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCl7Ci0gICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaGFuZGxlQ2hlY2tib3hTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgCi0gICAgICAgIExhYmVsIGZpbGxMYWJlbCA9IG5ldyBMYWJlbChjb250YWluZXIsIFNXVC5OVUxMKTsKLSAgICAgICAgZmlsbExhYmVsLnNldFRleHQoQ29kZWdlbldpemFyZFBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiZ2VuZXJhbC5lbXB0eSIpKTsKLQotICAgICAgICBMYWJlbCBoaW50TGFiZWwgPSBuZXcgTGFiZWwoY29udGFpbmVyLCBTV1QuTlVMTCk7Ci0gICAgICAgIGhpbnRMYWJlbC5zZXRUZXh0KENvZGVnZW5XaXphcmRQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoInBhZ2UwLmhpbnQuZGVzYyIpKTsKLQotICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAgICAgLy9qYXZhMldTRExSYWRpb0J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAgICAgCi0gICAgICAgIGhhbmRsZUNoZWNrYm94U2VsZWN0aW9uKCk7Ci0gICAgICAgIHNldENvbnRyb2woY29udGFpbmVyKTsKLQotICAgIH0KLQotCXByaXZhdGUgdm9pZCBoYW5kbGVDaGVja2JveFNlbGVjdGlvbigpewotCSAgICBDb2RlR2VuV2l6YXJkIHdpemFyZCA9IChDb2RlR2VuV2l6YXJkKXRoaXMuZ2V0V2l6YXJkKCk7Ci0JICAgIGlmICh3c2RsMkphdmFSYWRpb0J1dHRvbi5nZXRTZWxlY3Rpb24oKSl7Ci0JICAgICAgICBzZXR0aW5ncy5wdXQoUFJFRl9UT09MX1NFTEVDVElPTl9XU0RMMkpBVkEsdHJ1ZSk7Ci0JICAgICAgICBzZXR0aW5ncy5wdXQoUFJFRl9UT09MX1NFTEVDVElPTl9KQVZBMldTREwsZmFsc2UpOwotCSAgICAgICB3aXphcmQuc2V0U2VsZWN0ZWRXaXphcmRUeXBlKFdTRExfMl9KQVZBX1RZUEUpOyAKLQkgICAgfWVsc2UgaWYgKGphdmEyV1NETFJhZGlvQnV0dG9uLmdldFNlbGVjdGlvbigpKXsKLQkgICAgICAgIHNldHRpbmdzLnB1dChQUkVGX1RPT0xfU0VMRUNUSU9OX1dTREwySkFWQSxmYWxzZSk7Ci0JICAgICAgICBzZXR0aW5ncy5wdXQoUFJFRl9UT09MX1NFTEVDVElPTl9KQVZBMldTREwsdHJ1ZSk7Ci0JICAgICAgICB3aXphcmQuc2V0U2VsZWN0ZWRXaXphcmRUeXBlKEpBVkFfMl9XU0RMX1RZUEUpOyAKLQkgICAgfQotCX0KLQkKLQkKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLnRvb2wuY29kZWdlbi5lY2xpcHNlLnVpLkNvZGVnZW5QYWdlI2dldFBhZ2VUeXBlKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFBhZ2VUeXBlKCkgewotICAgICAgICAgcmV0dXJuIFVOU1BFQ0lGSUVEX1RZUEU7Ci0gICAgfQotICAgIAotICAgICAgICAKLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1jb2RlZ2VuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9jb2RlZ2VuL2VjbGlwc2UvdWkvV1NETEZpbGVTZWxlY3Rpb25QYWdlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2UtY29kZWdlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvY29kZWdlbi9lY2xpcHNlL3VpL1dTRExGaWxlU2VsZWN0aW9uUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTA3NDA5Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1jb2RlZ2VuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9jb2RlZ2VuL2VjbGlwc2UvdWkvV1NETEZpbGVTZWxlY3Rpb25QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnRvb2wuY29kZWdlbi5lY2xpcHNlLnVpOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29sLmNvZGVnZW4uZWNsaXBzZS5wbHVnaW4uQ29kZWdlbldpemFyZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRmlsZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIFRoZSBmaXJzdCBwYWdlIG9mIHRoZSBjb2RlIGdlbmVyYXRvciB3aXpyYWQuIEFza3MgZm9yIHRoZSBXU0RMIGZpbGUgTmFtZQotICovCi0KLXB1YmxpYyBjbGFzcyBXU0RMRmlsZVNlbGVjdGlvblBhZ2UgZXh0ZW5kcyBBYnN0cmFjdFdpemFyZFBhZ2UgewotCi0gICAgcHJpdmF0ZSBUZXh0IGZpbGVUZXh0OyAKLQotICAgCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHBhcmFtIHBhZ2VOYW1lCi0gICAgICovCi0gICAgcHVibGljIFdTRExGaWxlU2VsZWN0aW9uUGFnZSgpIHsKLSAgICAgICAgc3VwZXIoInBhZ2UxIik7Ci0gICAgICAgCi0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIHNldHRpbmdzIG9uIHRoaXMgcGFnZS4gRm9yCi0gICAgICogV1NETEZpbGVTZWxlY3Rpb24sIHRoaXMgaXMgbm90IHZlcnkgbXVjaC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRGVmYXVsdFNldHRpbmdzKCkgewotICAgICAgICBzZXR0aW5ncy5wdXQoUFJFRl9XU0RMX0xPQ0FUSU9OLCAiIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBJRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKENvbXBvc2l0ZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotICAgICAgICBDb21wb3NpdGUgY29udGFpbmVyID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLSAgICAgICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgICAgICBjb250YWluZXIuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgICAgIGxheW91dC5udW1Db2x1bW5zID0gMzsKLSAgICAgICAgLy9sYXlvdXQudmVydGljYWxTcGFjaW5nID0gOTsKLSAgICAgCi0gICAgICAgIEdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0gICAgICAgCi0gICAgICAgIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0gICAgICAgIExhYmVsIGxhYmVsRmlsZSA9IG5ldyBMYWJlbChjb250YWluZXIsIFNXVC5OVUxMKTsKLSAgICAgICAgbGFiZWxGaWxlLnNldFRleHQoQ29kZWdlbldpemFyZFBsdWdpbgotICAgICAgICAgICAgICAgIC5nZXRSZXNvdXJjZVN0cmluZygicGFnZTEuZmlsZXNlbGVjdGlvbi5sYWJlbCIpKTsKLSAgICAgICAgCi0gICAgICAgIGZpbGVUZXh0ID0gbmV3IFRleHQoY29udGFpbmVyLCBTV1QuQk9SREVSIHwgU1dULlNJTkdMRSk7Ci0gICAgICAgIGZpbGVUZXh0LnNldExheW91dERhdGEoZ2QpOwotCSAgICBmaWxlVGV4dC5zZXRUZXh0KHNldHRpbmdzLmdldChQUkVGX1dTRExfTE9DQVRJT04pKTsKLSAgICAgICAgZmlsZVRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgc2V0dGluZ3MucHV0KFBSRUZfV1NETF9MT0NBVElPTiwgZmlsZVRleHQuZ2V0VGV4dCgpKTsKLSAgICAgICAgICAgICAgICBkaWFsb2dDaGFuZ2VkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIEJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKGNvbnRhaW5lciwgU1dULlBVU0gpOwotICAgICAgICBidXR0b24uc2V0VGV4dChDb2RlZ2VuV2l6YXJkUGx1Z2luCi0gICAgICAgICAgICAgICAgLmdldFJlc291cmNlU3RyaW5nKCJwYWdlMS5maWxlc2VsZWN0aW9uLmJyb3dzZSIpKTsKLSAgICAgICAgYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGhhbmRsZUJyb3dzZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgCi0gICAgICAgIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0gICAgICAgIGdkLmhvcml6b250YWxTcGFuPTM7Ci0gICAgICAgIExhYmVsIGZpbGxMYWJlbCA9IG5ldyBMYWJlbChjb250YWluZXIsIFNXVC5OVUxMKTsKLSAgICAgICAgZmlsbExhYmVsLnNldExheW91dERhdGEoZ2QpOwotICAgICAgICAKLSAgICAgICAgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLSAgICAgICAgZ2QuaG9yaXpvbnRhbFNwYW49MzsKLSAgICAgICAgTGFiZWwgaGludExhYmVsID0gbmV3IExhYmVsKGNvbnRhaW5lciwgU1dULk5VTEwpOwotICAgICAgICBoaW50TGFiZWwuc2V0VGV4dChDb2RlZ2VuV2l6YXJkUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJwYWdlMS5oaW50LmRlc2MiKSk7Ci0gICAgICAgIGhpbnRMYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLS8vICAgICAgICBoaW50TGFiZWwuc2V0Rm9udChuZXcgRm9udChuZXcgRGV2aWNlKCkgewotLy8JCQlwdWJsaWMgaW50IGludGVybmFsX25ld19HQyhHQ0RhdGEgZGF0YSkge3JldHVybiAwO30KLS8vCQkJcHVibGljIHZvaWQgaW50ZXJuYWxfZGlzcG9zZV9HQyhpbnQgaGFuZGxlLCBHQ0RhdGEgZGF0YSkge30KLS8vCQkJCQkJCQkJCQl9LCJoaW50Rm9udCIsNixTV1QuTk9STUFMKSk7Ci0gICAgICAgIAotICAgICAgICBzZXRQYWdlQ29tcGxldGUoZmFsc2UpOwotICAgICAgICBzZXRDb250cm9sKGNvbnRhaW5lcik7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogVmFsaWRhdGUgdGhpcyBkaWFsb2csIGJlY2F1c2Ugd2UgY291bGQgaGF2ZSBnb3QgdmFsaWQgdmFsdWVzIGZyb20gdGhlCi0gICAgICAgICAqIHNldHRpbmdzIGFscmVhZHkuCi0gICAgICAgICAqLwotICAgICAgICBpZiAocmVzdG9yZWRGcm9tUHJldmlvdXNTZXR0aW5ncyl7Ci0gICAgICAgICAgICBkaWFsb2dDaGFuZ2VkKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBIYW5kbGUgdGhlIGRpYWxvZyBjaGFuZ2UgZXZlbnQuIEJhc2ljYWxseSBldmFsdWF0ZXMgdGhlIGZpbGUgbmFtZSBhbmQKLSAgICAgKiBzZXRzIHRoZSBlcnJvciBtZXNzYWdlIGFjY29yZGluZ2x5Ci0gICAgICogCi0gICAgICogVE9ETyAtIHdlIG1pZ2h0IG5lZWQgdG8gY2FsbCB0aGlzIGluIGEgZGlmZmVyZW50IGV2ZW50ISEhCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGRpYWxvZ0NoYW5nZWQoKSB7Ci0gICAgICAgIFN0cmluZyBmaWxlTmFtZSA9IGdldEZpbGVOYW1lKCk7Ci0KLSAgICAgICAgaWYgKGZpbGVOYW1lLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIHVwZGF0ZVN0YXR1cyhDb2RlZ2VuV2l6YXJkUGx1Z2luCi0gICAgICAgICAgICAgICAgICAgIC5nZXRSZXNvdXJjZVN0cmluZygicGFnZTEuZXJyb3IuZmlsZW1pc3NpbmdlcnJvciIpKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy90cnkgcG9wdWxhdGUgdGhlIG9wdGlvbnMKLSAgICAgICAgZ2V0Q29kZWdlbldpemFyZCgpLnBvcHVsYXRlT3B0aW9ucygpOwotICAgICAgICAvLyB1cGRhdGUgdGhlIHN0YXR1cwotICAgICAgICB1cGRhdGVTdGF0dXMobnVsbCk7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQb3BzIHVwIHRoZSBmaWxlIGJyb3dzZSBkaWFsb2cgYm94Ci0gICAgICogIAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBoYW5kbGVCcm93c2UoKSB7Ci0JICAgIGZpbGVUZXh0LnNldFRleHQoImVudGVyIGEgdmFsaWQgKi53c2RsLyoueG1sIHNlcnZpY2UgZGVzY3JpcHRpb24gZmlsZSIpOwotICAgICAgICBGaWxlRGlhbG9nIGZpbGVEaWFsb2cgPSBuZXcgRmlsZURpYWxvZyh0aGlzLmdldFNoZWxsKCkpOwotICAgICAgICBmaWxlRGlhbG9nLnNldEZpbHRlckV4dGVuc2lvbnMobmV3IFN0cmluZ1tdIHsgIioud3NkbCIgLCIqLnhtbCJ9KTsKLSAgICAgICAgU3RyaW5nIGZpbGVOYW1lID0gZmlsZURpYWxvZy5vcGVuKCk7Ci0gICAgICAgIGlmIChmaWxlTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmaWxlVGV4dC5zZXRUZXh0KGZpbGVOYW1lKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIAotICAgIC8qKgotICAgICAqIEdldCB0aGUgZmlsZSBuYW1lCi0gICAgICogCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmlsZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBmaWxlVGV4dC5nZXRUZXh0KCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLnRvb2wuY29kZWdlbi5lY2xpcHNlLnVpLkNvZGVnZW5QYWdlI2dldFBhZ2VUeXBlKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFBhZ2VUeXBlKCkgewotICAgICAgICByZXR1cm4gV1NETF8yX0pBVkFfVFlQRTsKLSAgICB9Ci0gICAgCi0gICAgCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2UtY29kZWdlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvY29kZWdlbi9lY2xpcHNlL3VpL1dTRExKYXZhQWR2YW5jZURpYWxvZy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLWNvZGVnZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL2NvZGVnZW4vZWNsaXBzZS91aS9XU0RMSmF2YUFkdmFuY2VEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzlmNWFiYS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2UtY29kZWdlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvY29kZWdlbi9lY2xpcHNlL3VpL1dTRExKYXZhQWR2YW5jZURpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzc4ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50b29sLmNvZGVnZW4uZWNsaXBzZS51aTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLkNvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpcmVjdG9yeURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotcHVibGljIGNsYXNzIFdTRExKYXZhQWR2YW5jZURpYWxvZyBleHRlbmRzIERpYWxvZyB7Ci0KLQlwcml2YXRlIEJ1dHRvbiB0bXBDaGVja0JveDsgCi0JcHJpdmF0ZSBUZXh0IHRtcFRleHRCb3g7Ci0JcHJpdmF0ZSBIYXNoTWFwIGFkdmFuY2VPcHRpb25zOwotCXByaXZhdGUgYm9vbGVhbiBpc0VkaXRBZHZhbmNlT3B0aW9ucz1mYWxzZTsKLQlwcml2YXRlIENvbWJvIHdzZGxWZXJzaW9uQ29tYm87Ci0JcHJpdmF0ZSBCdXR0b24gcGFja2FnZVJlbW92ZUJ1dHRvbjsKLQlwcml2YXRlIFRhYmxlIHBhY2thZ2VOYW1lTGlzdDsKLQlwcml2YXRlIEJ1dHRvbiBwYWNrYWdlQWRkQnV0dG9uOwotCXByaXZhdGUgVGV4dCBhZGROZXdFeGNsdWRlUGFja2FnZU5hbWU7Ci0KLQlwcm90ZWN0ZWQgV1NETEphdmFBZHZhbmNlRGlhbG9nKFNoZWxsIHNoZWxsLCBIYXNoTWFwIGFkdmFuY2VPcHRpb25zKSB7Ci0JCXN1cGVyKHNoZWxsKTsKLQkJaXNFZGl0QWR2YW5jZU9wdGlvbnM9KGFkdmFuY2VPcHRpb25zIT1udWxsKTsKLQkJaWYgKGlzRWRpdEFkdmFuY2VPcHRpb25zKQotCQkJdGhpcy5hZHZhbmNlT3B0aW9ucz0oSGFzaE1hcCkgYWR2YW5jZU9wdGlvbnMuY2xvbmUoKTsKLQkJZWxzZQotCQkJdGhpcy5hZHZhbmNlT3B0aW9ucz1uZXcgSGFzaE1hcCgpOwotCX0KLQotCXByaXZhdGUgQnV0dG9uIGFkZENoZWNrQm94KENvbXBvc2l0ZSBjb250YWluZXIsCi0JCQlmaW5hbCBCdXR0b24gdG1wQ2hlY2tCb3gsU3RyaW5nIGNhcHRpb24sZmluYWwgU3RyaW5nIHBhcmFtZXRlclR5cGUpewotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCS8vdG1wQ2hlY2tCb3ggPSBuZXcgQnV0dG9uKGNvbnRhaW5lciwgU1dULkNIRUNLKTsKLQkJdG1wQ2hlY2tCb3guc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXRtcENoZWNrQm94LnNldFRleHQoY2FwdGlvbik7Ci0JCWlmIChpc0VkaXRBZHZhbmNlT3B0aW9ucykKLQkJCXRtcENoZWNrQm94LnNldFNlbGVjdGlvbihhZHZhbmNlT3B0aW9ucy5jb250YWluc0tleShwYXJhbWV0ZXJUeXBlKSk7Ci0JCXRtcENoZWNrQm94LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCl7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc2V0Q2hlY2tCb3hTdGF0ZShwYXJhbWV0ZXJUeXBlLCB0bXBDaGVja0JveC5nZXRTZWxlY3Rpb24oKSk7Ci0JCQl9Ci0JCX0pOwotCQlyZXR1cm4gdG1wQ2hlY2tCb3g7Ci0JfQotCQotCXByaXZhdGUgVGV4dCBhZGRUZXh0Qm94KENvbXBvc2l0ZSBjb250YWluZXIsTGFiZWwgbGJsQ2FwdGlvbiwgCi0JCQlmaW5hbCBUZXh0IHRtcFRleHRCb3gsIFN0cmluZyBjYXB0aW9uLGZpbmFsIFN0cmluZyBwYXJhbWV0ZXJUeXBlLGJvb2xlYW4gaXNCcm93c2VGb2xkZXIpewotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDE7Ci0JCWdkLndpZHRoSGludD0yMDA7Ci0JCWxibENhcHRpb24uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWxibENhcHRpb24uc2V0VGV4dChjYXB0aW9uKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJaWYgKGlzQnJvd3NlRm9sZGVyKQotCQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAxOwotCQllbHNlCi0JCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCXRtcFRleHRCb3guc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWlmIChpc0VkaXRBZHZhbmNlT3B0aW9ucykKLQkJCWlmIChhZHZhbmNlT3B0aW9ucy5jb250YWluc0tleShwYXJhbWV0ZXJUeXBlKSkKLQkJCQl0bXBUZXh0Qm94LnNldFRleHQoKChTdHJpbmdbXSlhZHZhbmNlT3B0aW9ucy5nZXQocGFyYW1ldGVyVHlwZSkpWzBdKTsKLQkJdG1wVGV4dEJveC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQlzZXRUZXh0Qm94VmFsdWUocGFyYW1ldGVyVHlwZSwgdG1wVGV4dEJveC5nZXRUZXh0KCkpOwotCQkJfQotCQl9KTsKLQkJaWYgKGlzQnJvd3NlRm9sZGVyKXsKLQkJCUJ1dHRvbiBicm93c2U9bmV3IEJ1dHRvbihjb250YWluZXIsU1dULk5VTEwpOwotCQkJYnJvd3NlLnNldFRleHQoIkJyb3dzZSIpOwotCQkJYnJvd3NlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJRGlyZWN0b3J5RGlhbG9nIGRpYWxvZyA9IG5ldyBEaXJlY3RvcnlEaWFsb2coZ2V0U2hlbGwoKSk7Ci0JCQkJCVN0cmluZyByZXR1cm5TdHJpbmcgPSBkaWFsb2cub3BlbigpOwotCQkJCQlpZiAocmV0dXJuU3RyaW5nICE9IG51bGwpIHsKLQkJCQkJCXRtcFRleHRCb3guc2V0VGV4dChyZXR1cm5TdHJpbmcpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJcmV0dXJuIHRtcFRleHRCb3g7Ci0JfQotCQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoZmluYWwgQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29udGFpbmVyID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQkvL0ZvbnRVdGlsIGZvbnRVdGlsID0gRm9udFV0aWwuZ2V0SW5zdGFuY2UoY29udGFpbmVyLmdldERpc3BsYXkoKSk7Ci0KLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQljb250YWluZXIuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMzsKLQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDEwOwotCi0JCUdyaWREYXRhIGdkOwotCQkKLQkJYWRkVGV4dEJveChjb250YWluZXIsbmV3IExhYmVsKGNvbnRhaW5lcixTV1QuTlVMTCksIG5ldyBUZXh0KGNvbnRhaW5lcixTV1QuQk9SREVSKSwgCi0JCQkJIlNwZWNpZnkgYSByZXBvc2l0b3J5IGFnYWluc3Qgd2hpY2ggY29kZSBpcyBnZW5lcmF0ZWQuIiwgCi0JCQkJQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLlJFUE9TSVRPUllfUEFUSF9PUFRJT04sdHJ1ZSk7Ci0JCWFkZFRleHRCb3goY29udGFpbmVyLG5ldyBMYWJlbChjb250YWluZXIsU1dULk5VTEwpLCBuZXcgVGV4dChjb250YWluZXIsU1dULkJPUkRFUiksIAotCQkJCSJTcGVjaWZ5IGEgZGlyZWN0b3J5IHBhdGggZm9yIGdlbmVyYXRlZCBzb3VyY2UiLCAKLQkJCQlDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuU09VUkNFX0ZPTERFUl9OQU1FX09QVElPTix0cnVlKTsKLQkJYWRkVGV4dEJveChjb250YWluZXIsbmV3IExhYmVsKGNvbnRhaW5lcixTV1QuTlVMTCksIG5ldyBUZXh0KGNvbnRhaW5lcixTV1QuQk9SREVSKSwgCi0JCQkJIlNwZWNpZnkgYSBkaXJlY3RvcnkgcGF0aCBmb3IgZ2VuZXJhdGVkIHJlc291cmNlcyIsIAotCQkJCUNvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5SRVNPVVJDRV9GT0xERVJfT1BUSU9OLHRydWUpOwotCQlhZGRUZXh0Qm94KGNvbnRhaW5lcixuZXcgTGFiZWwoY29udGFpbmVyLFNXVC5OVUxMKSwgbmV3IFRleHQoY29udGFpbmVyLFNXVC5CT1JERVIpLCAKLQkJCQkiUHJveHkgaG9zdCBhZGRyZXNzIGlmIHlvdSBhcmUgYmVoaW5kIGEgZmlyZXdhbGwiLCAKLQkJCQlDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuSFRUUF9QUk9YWV9IT1NUX09QVElPTl9MT05HLGZhbHNlKTsKLQkJYWRkVGV4dEJveChjb250YWluZXIsbmV3IExhYmVsKGNvbnRhaW5lcixTV1QuTlVMTCksIG5ldyBUZXh0KGNvbnRhaW5lcixTV1QuQk9SREVSKSwgCi0JCQkJIlByb3h5IHBvcnQgYWRkcmVzcyBpZiB5b3UgYXJlIGJlaGluZCBhIGZpcmV3YWxsIiwgCi0JCQkJQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLkhUVFBfUFJPWFlfUE9SVF9PUFRJT05fTE9ORyxmYWxzZSk7Ci0JCWFkZFRleHRCb3goY29udGFpbmVyLG5ldyBMYWJlbChjb250YWluZXIsU1dULk5VTEwpLCBuZXcgVGV4dChjb250YWluZXIsU1dULkJPUkRFUiksIAotCQkJCSJTa2VsdG9uIGludGVyZmFjZSBuYW1lIiwgCi0JCQkJQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLlNLRUxUT05fSU5URVJGQUNFX05BTUVfT1BUSU9OLGZhbHNlKTsKLQkJYWRkVGV4dEJveChjb250YWluZXIsbmV3IExhYmVsKGNvbnRhaW5lcixTV1QuTlVMTCksIG5ldyBUZXh0KGNvbnRhaW5lcixTV1QuQk9SREVSKSwgCi0JCQkJIlNrZWx0b24gY2xhc3MgbmFtZSIsIAotCQkJCUNvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5TS0VMVE9OX0NMQVNTX05BTUVfT1BUSU9OLGZhbHNlKTsKLQkJCi0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMzsKLQkJTGFiZWwgZmlsbExhYmVsID0gbmV3IExhYmVsKGNvbnRhaW5lciwgU1dULkhPUklaT05UQUwgfCBTV1QuU0VQQVJBVE9SKTsKLQkJZmlsbExhYmVsLnNldExheW91dERhdGEoZ2QpOwotCQkKLQkJdG1wQ2hlY2tCb3g9bmV3IEJ1dHRvbihjb250YWluZXIsIFNXVC5DSEVDSyk7YWRkQ2hlY2tCb3goY29udGFpbmVyLHRtcENoZWNrQm94LCAKLQkJCQkiVW5wYWNrcyB0aGUgZGF0YWJpbmRpbmcgY2xhc3NlcyIsIAotCQkJCUNvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5VTlBBQ0tfQ0xBU1NFU19PUFRJT04pOwotCQl0bXBDaGVja0JveD1uZXcgQnV0dG9uKGNvbnRhaW5lciwgU1dULkNIRUNLKTthZGRDaGVja0JveChjb250YWluZXIsdG1wQ2hlY2tCb3gsIAotCQkJCSJGbGF0dGVucyB0aGUgZ2VuZXJhdGVkIGZpbGVzIiwgCi0JCQkJQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLkZMQVRURU5fRklMRVNfT1BUSU9OKTsKLQkJdG1wQ2hlY2tCb3g9bmV3IEJ1dHRvbihjb250YWluZXIsIFNXVC5DSEVDSyk7YWRkQ2hlY2tCb3goY29udGFpbmVyLHRtcENoZWNrQm94LCAKLQkJCQkiU3dpdGNoIG9uIHVuLXdyYXBwaW5nIiwgCi0JCQkJQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLlVOV1JBUF9QQVJBTUVURVJTKTsKLQkJdG1wQ2hlY2tCb3g9bmV3IEJ1dHRvbihjb250YWluZXIsIFNXVC5DSEVDSyk7YWRkQ2hlY2tCb3goY29udGFpbmVyLHRtcENoZWNrQm94LCAKLQkJCQkiR2VuZXJhdGUgY29kZSBmb3IgYWxsIHBvcnRzIiwgCi0JCQkJQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLkFsbF9QT1JUU19PUFRJT04pOwotCQl0bXBDaGVja0JveD1uZXcgQnV0dG9uKGNvbnRhaW5lciwgU1dULkNIRUNLKTthZGRDaGVja0JveChjb250YWluZXIsdG1wQ2hlY2tCb3gsIAotCQkJCSJPdmVyd3JpdGUgdGhlIGV4aXN0aW5nIGNsYXNzZXMiLCAKLQkJCQlDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuT1ZFUlJJREVfT1BUSU9OKTsKLQkJdG1wQ2hlY2tCb3g9bmV3IEJ1dHRvbihjb250YWluZXIsIFNXVC5DSEVDSyk7YWRkQ2hlY2tCb3goY29udGFpbmVyLHRtcENoZWNrQm94LCAKLQkJCQkiR2VuZXJhdGUgQXhpcyAxLnggYmFja3dvcmQgY29tcGF0aWJsZSBjb2RlIiwgCi0JCQkJQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLkJBQ0tXT1JEX0NPTVBBVElCSUxJVFlfT1BUSU9OKTsKLQkJdG1wQ2hlY2tCb3g9bmV3IEJ1dHRvbihjb250YWluZXIsIFNXVC5DSEVDSyk7YWRkQ2hlY2tCb3goY29udGFpbmVyLHRtcENoZWNrQm94LCAKLQkJCQkiU3VwcHJlc3MgbmFtZXNwYWNlIHByZWZpeGVzIChPcHRpbXphdGlvbiB0aGF0IHJlZHVjZXMgc2l6ZSBvZiBzb2FwIHJlcXVlc3QvcmVzcG9uc2UpIiwgCi0JCQkJQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLlNVUFBSRVNTX1BSRUZJWEVTX09QVElPTik7Ci0JCXRtcENoZWNrQm94PW5ldyBCdXR0b24oY29udGFpbmVyLCBTV1QuQ0hFQ0spO2FkZENoZWNrQm94KGNvbnRhaW5lcix0bXBDaGVja0JveCwgCi0JCQkJIkRvbnQgZ2VuZXJhdGUgdGhlIGJ1aWxkLnhtbCBpbiB0aGUgb3V0cHV0IGRpcmVjdG9yeSIsIAotCQkJCUNvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5OT19CVUlMRF9YTUxfT1BUSU9OX0xPTkcpOwotCQl0bXBDaGVja0JveD1uZXcgQnV0dG9uKGNvbnRhaW5lciwgU1dULkNIRUNLKTthZGRDaGVja0JveChjb250YWluZXIsdG1wQ2hlY2tCb3gsIAotCQkJCSJEb250IGdlbmVyYXRlIFdTRExzIGluIHRoZSByZXNvdXJjZXMgZGlyZWN0b3J5IiwgCi0JCQkJQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLk5PX1dTRExTX09QVElPTl9MT05HKTsKLQkJdG1wQ2hlY2tCb3g9bmV3IEJ1dHRvbihjb250YWluZXIsIFNXVC5DSEVDSyk7YWRkQ2hlY2tCb3goY29udGFpbmVyLHRtcENoZWNrQm94LCAKLQkJCQkiRG9udCBnZW5lcmF0ZSBhIE1lc3NhZ2VSZWNlaXZlciBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZXMiLCAKLQkJCQlDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuTk9fTUVTU0FHRV9SRUNFSVZFUl9PUFRJT05fTE9ORyk7Ci0KLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlmaWxsTGFiZWwgPSBuZXcgTGFiZWwoY29udGFpbmVyLCBTV1QuSE9SSVpPTlRBTCB8IFNXVC5TRVBBUkFUT1IpOwotCQlmaWxsTGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCi0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJZ2Qud2lkdGhIaW50PTQwMDsKLQkJTGFiZWwgZmlsbExhYmVsMT1uZXcgTGFiZWwoY29udGFpbmVyLFNXVC5OVUxMKTsKLQkJZmlsbExhYmVsMS5zZXRMYXlvdXREYXRhKGdkKTsKLQkJZmlsbExhYmVsMS5zZXRUZXh0KCJXU0RMIHZlcnNpb24iKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJd3NkbFZlcnNpb25Db21ibz1uZXcgQ29tYm8oY29udGFpbmVyLFNXVC5EUk9QX0RPV04gfCBTV1QuQk9SREVSfCBTV1QuUkVBRF9PTkxZKTsKLQkJd3NkbFZlcnNpb25Db21iby5zZXRMYXlvdXREYXRhKGdkKTsKLQkJZmlsbFdTRExWZXJzaW9uQ29tYm8oKTsKLQkJU3RyaW5nIGtleT1Db21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuV1NETF9WRVJTSU9OX09QVElPTjsKLQkJaWYgKChpc0VkaXRBZHZhbmNlT3B0aW9ucykgJiYgKGFkdmFuY2VPcHRpb25zLmNvbnRhaW5zS2V5KGtleSkpKQotCQkJd3NkbFZlcnNpb25Db21iby5zZWxlY3Qod3NkbFZlcnNpb25Db21iby5pbmRleE9mKCgoU3RyaW5nW10pYWR2YW5jZU9wdGlvbnMuZ2V0KGtleSkpWzBdKSk7Ci0JCQotCQl3c2RsVmVyc2lvbkNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQloYW5kbGVXc2RsVmVyc2lvbkNvbWJvU2VsZWN0ZWQoKTsKLQotCQkJfTsKLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCX07Ci0JCX0pOwotCQkKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlmaWxsTGFiZWwgPSBuZXcgTGFiZWwoY29udGFpbmVyLCBTV1QuSE9SSVpPTlRBTCB8IFNXVC5TRVBBUkFUT1IpOwotCQlmaWxsTGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDE7Ci0JCUxhYmVsIGxhYmVsUGFja2FnZUFkZENhcHRpb24gPSBuZXcgTGFiZWwoY29udGFpbmVyLCBTV1QuTlVMTCk7Ci0JCWxhYmVsUGFja2FnZUFkZENhcHRpb24uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWxhYmVsUGFja2FnZUFkZENhcHRpb24uc2V0VGV4dCgiRXhjbHVkZXMgUGFja2FnZXMiKTsKLQotCQlhZGROZXdFeGNsdWRlUGFja2FnZU5hbWU9bmV3IFRleHQoY29udGFpbmVyLFNXVC5CT1JERVIpOwotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDE7Ci0JCWFkZE5ld0V4Y2x1ZGVQYWNrYWdlTmFtZS5zZXRMYXlvdXREYXRhKGdkKTsKLQkJYWRkTmV3RXhjbHVkZVBhY2thZ2VOYW1lLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCWhhbmRsZU5ld1BhY2thZ2VOYW1lQ2hhbmdlKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAxOwotCQlwYWNrYWdlQWRkQnV0dG9uPSBuZXcgQnV0dG9uKGNvbnRhaW5lciwgU1dULk5VTEwpOwotCQlwYWNrYWdlQWRkQnV0dG9uLnNldFRleHQoIkFkZCIpOwotCQlwYWNrYWdlQWRkQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCl7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJYWRkUGFja2FnZU5hbWUoKTsKLQkJCX0KLQkJfSk7Ci0JCXBhY2thZ2VBZGRCdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJcGFja2FnZU5hbWVMaXN0ID0gbmV3IFRhYmxlKGNvbnRhaW5lciwKLQkJCQlTV1QuU0lOR0xFfFNXVC5GVUxMX1NFTEVDVElPTnxTV1QuVl9TQ1JPTEx8U1dULkhfU0NST0xMKTsKLQkJcGFja2FnZU5hbWVMaXN0LnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQkJcGFja2FnZU5hbWVMaXN0LnNldEhlYWRlclZpc2libGUodHJ1ZSk7IAotCQlwYWNrYWdlTmFtZUxpc3Quc2V0TGF5b3V0RGF0YShnZCk7Ci0JCVRhYmxlQ29sdW1uIGNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbihwYWNrYWdlTmFtZUxpc3QsU1dULk5PTkUpOwotCQljb2x1bW4uc2V0V2lkdGgoNTAwKTsKLQkJY29sdW1uLnNldFRleHQoIkV4Y2x1ZGVkIHBhY2thZ2VzIik7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMzsKLQkJZ2QuaGVpZ2h0SGludCA9IDgwOwotCQlwYWNrYWdlTmFtZUxpc3Quc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXBhY2thZ2VOYW1lTGlzdC5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJaWYgKGlzRWRpdEFkdmFuY2VPcHRpb25zKSB1cGRhdGVFeGNsdWRlUGFja2FnZUxpc3QoKTsKLQkJcGFja2FnZU5hbWVMaXN0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCl7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaGFuZGxlUGFja2FnZU5hbWVMaXN0Q2xpY2soKTsKLQkJCX0KLQkJfSk7Ci0vLwkJdGFibGVPdXRwdXRNYXBzLmFkZE1vdXNlTGlzdGVuZXIobmV3IE1vdXNlQWRhcHRlcigpewotLy8JCQlwdWJsaWMgdm9pZCBtb3VzZURvdWJsZUNsaWNrKE1vdXNlRXZlbnQgZSl7Ci0vLwkJCQkvL2hhbmRsZU91dHB1dE1hcEVkaXRRdWVyeSgpOwotLy8JCQl9Ci0vLwkJfSk7Ci0JCXBhY2thZ2VOYW1lTGlzdC5yZWRyYXcoKTsKLQkJcGFja2FnZU5hbWVMaXN0LnNldFZpc2libGUodHJ1ZSk7Ci0JCQotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCUxhYmVsIGZpbGxMYWJlbDQgPSBuZXcgTGFiZWwoY29udGFpbmVyLCBTV1QuTlVMTCk7Ci0JCWZpbGxMYWJlbDQuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAxOwotCQlwYWNrYWdlUmVtb3ZlQnV0dG9uPSBuZXcgQnV0dG9uKGNvbnRhaW5lciwgU1dULk5VTEwpOwotCQlwYWNrYWdlUmVtb3ZlQnV0dG9uLnNldFRleHQoIlJlbW92ZSIpOwotCQlwYWNrYWdlUmVtb3ZlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCl7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJcmVtb3ZlUGFja2FnZU5hbWUoKTsKLQkJCX0KLQkJfSk7Ci0JCXBhY2thZ2VSZW1vdmVCdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQotCQloYW5kbGVQYWNrYWdlTmFtZUxpc3RDbGljaygpOwotCQloYW5kbGVOZXdQYWNrYWdlTmFtZUNoYW5nZSgpOwotCQkKLQkJcmV0dXJuIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZVBhY2thZ2VOYW1lTGlzdENsaWNrKCl7Ci0JCXBhY2thZ2VSZW1vdmVCdXR0b24uc2V0RW5hYmxlZChwYWNrYWdlTmFtZUxpc3QuZ2V0U2VsZWN0aW9uQ291bnQoKT4wKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZVBhY2thZ2VOYW1lKCl7Ci0JCWlmIChwYWNrYWdlTmFtZUxpc3QuZ2V0U2VsZWN0aW9uSW5kZXgoKSE9LTEpewotCQkJU3RyaW5nIHR5cGU9Q29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLkVYQ0xVREVfUEFLQUdFU19PUFRJT047Ci0JCQlTdHJpbmdbXSBjb21tYVNlcGVyYXRlZFBhY2thZ2VMaXN0PShTdHJpbmdbXSkgYWR2YW5jZU9wdGlvbnMuZ2V0KHR5cGUpOwotCQkJU3RyaW5nW10gcGFja2FnZUxpc3Q9Y29tbWFTZXBlcmF0ZWRQYWNrYWdlTGlzdFswXS5zcGxpdCgiLCIpOwotCQkJU3RyaW5nIG5ld0xpc3Q9IiI7Ci0JCQlpbnQgc2VsZWN0ZWRJbmRleD1wYWNrYWdlTmFtZUxpc3QuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJCVN0cmluZyB0b1JlbW92ZT1wYWNrYWdlTmFtZUxpc3QuZ2V0SXRlbShzZWxlY3RlZEluZGV4KS5nZXRUZXh0KCk7Ci0JCQlmb3IgKFN0cmluZyBzIDogcGFja2FnZUxpc3QpIHsKLQkJCQlpZiAoIXMuZXF1YWxzSWdub3JlQ2FzZSh0b1JlbW92ZSkpewotCQkJCQlpZiAobmV3TGlzdC5lcXVhbHNJZ25vcmVDYXNlKCIiKSkKLQkJCQkJCW5ld0xpc3Q9czsKLQkJCQkJZWxzZQotCQkJCQkJbmV3TGlzdD1uZXdMaXN0KyIsIitzOwotCQkJCX0KLQkJCX0KLQkJCWlmIChuZXdMaXN0LmVxdWFsc0lnbm9yZUNhc2UoIiIpKQotCQkJCWFkdmFuY2VPcHRpb25zLnJlbW92ZSh0eXBlKTsKLQkJCWVsc2UKLQkJCQlhZHZhbmNlT3B0aW9ucy5wdXQodHlwZSwgbmV3IFN0cmluZ1tde25ld0xpc3R9KTsKLQkJCXBhY2thZ2VOYW1lTGlzdC5yZW1vdmUoc2VsZWN0ZWRJbmRleCk7Ci0JCQlpZiAoc2VsZWN0ZWRJbmRleD49cGFja2FnZU5hbWVMaXN0LmdldEl0ZW1Db3VudCgpKQotCQkJCXNlbGVjdGVkSW5kZXgtLTsKLQkJCXBhY2thZ2VOYW1lTGlzdC5zZWxlY3Qoc2VsZWN0ZWRJbmRleCk7Ci0JCX0KLQkJcGFja2FnZU5hbWVMaXN0LnJlZHJhdygpOwotCQloYW5kbGVQYWNrYWdlTmFtZUxpc3RDbGljaygpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYWRkUGFja2FnZU5hbWUoKXsKLQkJU3RyaW5nIG5ld0xpc3Q7Ci0JCVN0cmluZyB0eXBlPUNvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5FWENMVURFX1BBS0FHRVNfT1BUSU9OOwotCQlpZiAocGFja2FnZU5hbWVMaXN0LmdldEl0ZW1Db3VudCgpPjApewotCQkJU3RyaW5nW10gY29tbWFTZXBlcmF0ZWRQYWNrYWdlTGlzdD0oU3RyaW5nW10pIGFkdmFuY2VPcHRpb25zLmdldCh0eXBlKTsKLQkJCW5ld0xpc3Q9Y29tbWFTZXBlcmF0ZWRQYWNrYWdlTGlzdFswXSsiLCIrYWRkTmV3RXhjbHVkZVBhY2thZ2VOYW1lLmdldFRleHQoKTsKLQkJfWVsc2UKLQkJCW5ld0xpc3Q9YWRkTmV3RXhjbHVkZVBhY2thZ2VOYW1lLmdldFRleHQoKTsKLQkJYWR2YW5jZU9wdGlvbnMucHV0KHR5cGUsbmV3IFN0cmluZ1tde25ld0xpc3R9KTsKLQkJYWRkVGFibGVJdGVtKGFkZE5ld0V4Y2x1ZGVQYWNrYWdlTmFtZS5nZXRUZXh0KCkpOwotCQlhZGROZXdFeGNsdWRlUGFja2FnZU5hbWUuc2V0VGV4dCgiIik7Ci0JCWhhbmRsZU5ld1BhY2thZ2VOYW1lQ2hhbmdlKCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCB1cGRhdGVFeGNsdWRlUGFja2FnZUxpc3QoKXsKLQkJcGFja2FnZU5hbWVMaXN0LmNsZWFyQWxsKCk7Ci0JCVN0cmluZyB0eXBlPUNvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5FWENMVURFX1BBS0FHRVNfT1BUSU9OOwotCQlpZiAoYWR2YW5jZU9wdGlvbnMuY29udGFpbnNLZXkodHlwZSkpewotCQkJU3RyaW5nW10gY29tbWFTZXBlcmF0ZWRQYWNrYWdlTGlzdD0oU3RyaW5nW10pIGFkdmFuY2VPcHRpb25zLmdldCh0eXBlKTsKLQkJCVN0cmluZ1tdIHBhY2thZ2VMaXN0PWNvbW1hU2VwZXJhdGVkUGFja2FnZUxpc3RbMF0uc3BsaXQoIiwiKTsKLQkJCWZvciAoU3RyaW5nIHN0cmluZyA6IHBhY2thZ2VMaXN0KSB7Ci0JCQkJYWRkVGFibGVJdGVtKHN0cmluZyk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZFRhYmxlSXRlbShTdHJpbmcgaXRlbVRleHQpewotCQlUYWJsZUl0ZW0gaXRlbT1uZXcgVGFibGVJdGVtKHBhY2thZ2VOYW1lTGlzdCxTV1QuTm9uZSk7Ci0JCWl0ZW0uc2V0VGV4dChpdGVtVGV4dCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBoYW5kbGVOZXdQYWNrYWdlTmFtZUNoYW5nZSgpewotCQlQYXR0ZXJuIHAgPSBQYXR0ZXJuLmNvbXBpbGUoIl5bYS16QS1aX1xcJF1bXFx3XFwkXSooPzpcXC5bYS16QS1aX1xcJF1bXFx3XFwkXSopKiQiKTsKLSAgICAgICAgcGFja2FnZUFkZEJ1dHRvbi5zZXRFbmFibGVkKHAubWF0Y2hlcihhZGROZXdFeGNsdWRlUGFja2FnZU5hbWUuZ2V0VGV4dCgpKS5tYXRjaGVzKCkpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgaGFuZGxlV3NkbFZlcnNpb25Db21ib1NlbGVjdGVkKCl7Ci0JCWFkdmFuY2VPcHRpb25zLnB1dChDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuV1NETF9WRVJTSU9OX09QVElPTiwgCi0JCQkJbmV3IFN0cmluZ1tde3dzZGxWZXJzaW9uQ29tYm8uZ2V0SXRlbSh3c2RsVmVyc2lvbkNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkpfSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBmaWxsV1NETFZlcnNpb25Db21ibygpewotCQl3c2RsVmVyc2lvbkNvbWJvLnJlbW92ZUFsbCgpOwotCQl3c2RsVmVyc2lvbkNvbWJvLmFkZCgiMS4xIik7Ci0JCXdzZGxWZXJzaW9uQ29tYm8uYWRkKCIyLjAiKTsKLQl9Ci0JcHJpdmF0ZSB2b2lkIHNldENoZWNrQm94U3RhdGUoU3RyaW5nIHR5cGUsYm9vbGVhbiBzdGF0ZSl7Ci0JCWlmIChzdGF0ZSkKLQkJCWFkdmFuY2VPcHRpb25zLnB1dCh0eXBlLCBudWxsKTsKLQkJZWxzZQotCQkJYWR2YW5jZU9wdGlvbnMucmVtb3ZlKHR5cGUpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2V0VGV4dEJveFZhbHVlKFN0cmluZyB0eXBlLFN0cmluZyB2YWx1ZSl7Ci0JCWlmICh2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCIiKSkKLQkJCWFkdmFuY2VPcHRpb25zLnJlbW92ZSh0eXBlKTsKLQkJZWxzZQotCQkJYWR2YW5jZU9wdGlvbnMucHV0KHR5cGUsIG5ldyBTdHJpbmdbXXt2YWx1ZX0pOwotCX0KLQotCXB1YmxpYyBIYXNoTWFwIGdldEFkdmFuY2VPcHRpb25zKCl7Ci0JCXJldHVybiBhZHZhbmNlT3B0aW9uczsKLQl9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2UtY29kZWdlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvY29kZWdlbi9lY2xpcHNlL3V0aWwvQ2xhc3NGaWxlUmVhZGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2UtY29kZWdlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvY29kZWdlbi9lY2xpcHNlL3V0aWwvQ2xhc3NGaWxlUmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjYjAxYjQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLWNvZGVnZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL2NvZGVnZW4vZWNsaXBzZS91dGlsL0NsYXNzRmlsZVJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnRvb2wuY29kZWdlbi5lY2xpcHNlLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5VUkxDbGFzc0xvYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBBIHV0aWxpdHkgY2xhc3MgZm9yIHJlYWRpbmcvbG9hZGluZyBjbGFzc2VzIGFuZAotICogZXh0cmFjdGluZyB0aGUgaW5mb3JtYXRpb24uCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQ2xhc3NGaWxlUmVhZGVyIHsKLQotCS8qKgotCSAqIHRyeSB3aGV0aGVyIGEgZ2l2ZW4gY2xhc3MgY2FuIGJlIGxvYWRlZCBmcm9tIHRoZSBnaXZlbiBsb2NhdGlvbgotCSAqIEBwYXJhbSBjbGFzc05hbWUKLQkgKiBAcGFyYW0gY2xhc3NQYXRoRW50cmllcwotCSAqIEBwYXJhbSBlcnJvckxpc3RlbmVyCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB0cnlMb2FkaW5nQ2xhc3MoU3RyaW5nIGNsYXNzTmFtZSwKLQkJCVN0cmluZ1tdIGNsYXNzUGF0aEVudHJpZXMsIExpc3QgZXJyb3JMaXN0ZW5lcikgewotCQkvL21ha2UgYSBVUkwgY2xhc3MgbG9hZGVyIGZyb20gdGhlIGVudHJpZXMKLQkJQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXI7Ci0KLQkJaWYgKGNsYXNzUGF0aEVudHJpZXMubGVuZ3RoID4gMCkgewotCQkJVVJMW10gdXJscyA9IG5ldyBVUkxbY2xhc3NQYXRoRW50cmllcy5sZW5ndGhdOwotCi0JCQl0cnkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2xhc3NQYXRoRW50cmllcy5sZW5ndGg7IGkrKykgewotCQkJCQlTdHJpbmcgY2xhc3NQYXRoRW50cnkgPSBjbGFzc1BhdGhFbnRyaWVzW2ldOwotCQkJCQkvL3RoaXMgc2hvdWxkIGJlIGEgZmlsZShvciBhIFVSTCkKLQkJCQkJaWYgKGNsYXNzUGF0aEVudHJ5LnN0YXJ0c1dpdGgoImh0dHA6Ly8iKSkgewotCQkJCQkJdXJsc1tpXSA9IG5ldyBVUkwoY2xhc3NQYXRoRW50cnkpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJdXJsc1tpXSA9IG5ldyBGaWxlKGNsYXNzUGF0aEVudHJ5KS50b1VSTCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCQlpZiAoZXJyb3JMaXN0ZW5lciE9bnVsbCl7Ci0JCQkJCWVycm9yTGlzdGVuZXIuYWRkKGUpOwotCQkJCX0KLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCWNsYXNzTG9hZGVyID0gbmV3IFVSTENsYXNzTG9hZGVyKHVybHMpOwotCi0JCX0gZWxzZSB7Ci0JCQljbGFzc0xvYWRlciA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7Ci0JCX0KLQkJCi0JCS8vdHJ5IHRvIGxvYWQgdGhlIGNsYXNzIHdpdGggdGhlIGdpdmVuIG5hbWUKLQkJCi0JCXRyeSB7Ci0JCQlDbGFzcyBjbGF6ej1jbGFzc0xvYWRlci5sb2FkQ2xhc3MoY2xhc3NOYW1lKTsKLQkJCWNsYXp6LmdldE1ldGhvZHMoKTsKLQkJICAgIAotCQkJCi0JCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQlpZiAoZXJyb3JMaXN0ZW5lciE9bnVsbCl7Ci0JCQkJZXJyb3JMaXN0ZW5lci5hZGQodCk7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLWNvZGVnZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL2NvZGVnZW4vZWNsaXBzZS91dGlsL05hbWVzcGFjZUZpbmRlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLWNvZGVnZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL2NvZGVnZW4vZWNsaXBzZS91dGlsL05hbWVzcGFjZUZpbmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYmMyNWNkLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1jb2RlZ2VuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9jb2RlZ2VuL2VjbGlwc2UvdXRpbC9OYW1lc3BhY2VGaW5kZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50b29sLmNvZGVnZW4uZWNsaXBzZS51dGlsOwotCi1wdWJsaWMgY2xhc3MgTmFtZXNwYWNlRmluZGVyIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgTlNfUFJFRklYID0gImh0dHA6Ly8iOwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBTQ0hFTUFfTlNfREVGQVVMVF9QUkVGSVggPSAieHNkIjsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgTlNfREVGQVVMVF9QUkVGSVggPSAibnMiOwotCQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFRhcmdldE5hbWVzcGFjZUZyb21DbGFzcyhTdHJpbmcgZnVsbHlRdWFsaWZpZWRDbGFzc05hbWUpewotCQkvL3Rva2VuaXplIHRoZSBjbGFzc05hbWUKLQkJU3RyaW5nW10gY2xhc3NOYW1lUGFydHMgPSBmdWxseVF1YWxpZmllZENsYXNzTmFtZS5zcGxpdCgiXFwuIik7Ci0JCS8vYWRkIHRoZSBzdHJpbmdzIGluIHJldmVyc2Ugb3JkZXIgdG8gbWFrZSB0aGUgbmFtZXNwYWNlCi0JCVN0cmluZyBuc1VyaSA9ICIiOwotCQlmb3IoaW50IGk9Y2xhc3NOYW1lUGFydHMubGVuZ3RoLTI7aT49MDtpLS0pewotCQkJbnNVcmkgPSBuc1VyaSArIGNsYXNzTmFtZVBhcnRzW2ldICsgKGk9PTA/IiI6Ii4iKTsKLQkJfQotCQkKLQkJcmV0dXJuIE5TX1BSRUZJWCArIG5zVXJpOwkKLQkJCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFNjaGVtYVRhcmdldE5hbWVzcGFjZUZyb21DbGFzcyhTdHJpbmcgZnVsbHlRdWFsaWZpZWRDbGFzc05hbWUpewotCQlyZXR1cm4gZ2V0VGFyZ2V0TmFtZXNwYWNlRnJvbUNsYXNzKGZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREZWZhdWx0U2NoZW1hTmFtZXNwYWNlUHJlZml4KCl7Ci0JCXJldHVybiBTQ0hFTUFfTlNfREVGQVVMVF9QUkVGSVg7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERlZmF1bHROYW1lc3BhY2VQcmVmaXgoKXsKLQkJcmV0dXJuIE5TX0RFRkFVTFRfUFJFRklYOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTZXJ2aWNlTmFtZVRleHQoU3RyaW5nIGZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lKXsKLQkJLy90b2tlbml6ZSB0aGUgY2xhc3NOYW1lCi0JCVN0cmluZ1tdIGNsYXNzTmFtZVBhcnRzID0gZnVsbHlRdWFsaWZpZWRDbGFzc05hbWUuc3BsaXQoIlxcLiIpOwotCQlyZXR1cm4gY2xhc3NOYW1lUGFydHNbY2xhc3NOYW1lUGFydHMubGVuZ3RoLTFdOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1jb2RlZ2VuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9jb2RlZ2VuL2VjbGlwc2UvdXRpbC9TZXR0aW5nc0NvbnN0YW50cy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLWNvZGVnZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL2NvZGVnZW4vZWNsaXBzZS91dGlsL1NldHRpbmdzQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkN2QxMzEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLWNvZGVnZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL2NvZGVnZW4vZWNsaXBzZS91dGlsL1NldHRpbmdzQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnRvb2wuY29kZWdlbi5lY2xpcHNlLnV0aWw7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgU2V0dGluZ3NDb25zdGFudHMgewotCi0gICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotICAgIC8vV1NETCBTZWxlY3Rpb24gcGFnZSBjb25zdGFudHMKLSAgICAvKioKLSAgICAgKiBUaGUga2V5IGZvciBzdG9yaW5nIHRoZSBXU0RMIGxvY2F0aW9uIGluIHRoZSBkaWFsb2cgc2V0dGluZ3Mgb2YgdGhlCi0gICAgICogV1NETEZpbGVTZWxlY3Rpb25QYWdlCi0gICAgICovCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX1dTRExfTE9DQVRJT04gPSAiUFJFRl9XU0RMX0xPQ0FUSU9OIjsKLQotICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSAgICAvLyBUb29scyBzZWxlY3Rpb24gcGFnZQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9UT09MX1NFTEVDVElPTl9XU0RMMkpBVkEgPSAiUFJFRl9UT09MX1NFTEVDVElPTl9XU0RMMkpBVkEiOwotCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX1RPT0xfU0VMRUNUSU9OX0pBVkEyV1NETCA9ICJQUkVGX1RPT0xfU0VMRUNUSU9OX0pBVkEyV1NETCI7Ci0gICAgCi0gICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotLy8gICAgIENvZGVnZW4gT3B0aW9ucyBzZWxlY3Rpb24gcGFnZQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9PUFRJT05fU0VMRUNUSU9OX0RFRlVMVCA9ICJQUkVGX09QVElPTl9TRUxFQ1RJT05fREVGVUxUIjsKLQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9PUFRJT05fU0VMRUNUSU9OX0NVU1RPTSA9ICJQUkVGX09QVElPTl9TRUxFQ1RJT05fQ1VTVE9NIjsKLQotICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSAgICAvLyBPdXRwdXQgc2VsZWN0aW9uIHBhZ2UKLSAgICAvKioKLSAgICAgKiBUaGUga2V5IHRvIHN0b3JlIHRoZSBvdXRwdXQgbG9jYXRpb24gaW4gdGhlIHNldHRpbmdzCi0gICAgICogIAotICAgICAqLwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9PVVRQVVRfTE9DQVRJT04gPSAiUFJFRl9PVVRQVVRfTE9DQVRJT04iOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9DSEVDS19CUk9XU0VfUFJPSkVDVFMgPSAiUFJFRl9DSEVDS19CUk9XU0VfUFJPSkVDVFMiOwotCi0gICAgLy9PcHRpb25zIHBhZ2UgY29uc3RhbnRzCi0gICAgLyoqCi0gICAgICogUG9zaXRpb24gaW4gdGhlIGNvbWJveCBmb3IgY2hvb3NpbmcgdGhlIHRhcmdldCBwcm9ncmFtbWluZyBsYW5ndWFnZS4gRGVmYXVsdCBpcyAwCi0gICAgICovCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX0xBTkdVQUdFX0lOREVYID0gIlBSRUZfTEFOR1VBR0VfSU5ERVgiOwotCi0gICAgLyoqCi0gICAgICogVGhyZWUgcmFkaW8gYnV0dG9uczogR2VuZXJhdGUgQ29kZSBmb3IgU3luYyBjYWxscywgQXN5bmMgYW5kIEJvdGguIEJvdGggaXMgZGVmYXVsdC4KLSAgICAgKi8KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfUkFESU9fU1lOQ19BTkRfQVNZTkMgPSAiUFJFRl9SQURJT19TWU5DX0FORF9BU1lOQyI7Ci0KLSAgICAvKioKLSAgICAgKiBUaHJlZSByYWRpbyBidXR0b25zOiBHZW5lcmF0ZSBDb2RlIGZvciBTeW5jIGNhbGxzLCBBc3luYyBhbmQgQm90aC4gQm90aCBpcyBkZWZhdWx0LgotICAgICAqLwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9SQURJT19TWU5DX09OTFkgPSAiUFJFRl9SQURJT19TWU5DX09OTFkiOwotCi0gICAgLyoqCi0gICAgICogVGhyZWUgcmFkaW8gYnV0dG9uczogR2VuZXJhdGUgQ29kZSBmb3IgU3luYyBjYWxscywgQXN5bmMgYW5kIEJvdGguIEJvdGggaXMgZGVmYXVsdC4KLSAgICAgKi8KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfUkFESU9fQVNZTkNfT05MWSA9ICJQUkVGX1JBRElPX0FTWU5DX09OTFkiOwotCi0gICAgLyoqCi0gICAgICogU3BlY2lmaWVzIHRoZSBmdWxsIHF1YWxpZmllZCBwYWNrYWdlIG5hbWUgZm9yIHRoZSBnZW5lcmF0ZWQgc291cmNlIGNvZGUuCi0gICAgICovCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX1BBQ0tBR0VfTkFNRSA9ICJQUkVGX1BBQ0tBR0VfTkFNRSI7Ci0KLSAgICAvKioKLSAgICAgKiBBIGJvb2xlYW4gdmFsdWUgd2hldGhlciBKVW5pdCB0ZXN0IGNsYXNzZXMgYXJlIGdlbmVyYXRlZCBvciBub3QuCi0gICAgICovCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX0NIRUNLX0dFTkVSQVRFX1RFU1RDQVNFID0gIlBSRUZfQ0hFQ0tfR0VORVJBVEVfVEVTVENBU0UiOwotCi0gICAgLyoqCi0gICAgICogQSBib29sZWFuIHZhbHVlIHdoZXRoZXIgdGhlIHNlcnZlci1zaWRlIHNrZWxldG9ucyBhcmUgZ2VuZXJhdGVkIG9yIG5vdAotICAgICAqLwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9DSEVDS19HRU5FUkFURV9TRVJWRVJTSURFID0gIlBSRUZfQ0hFQ0tfR0VORVJBVEVfU0VSVkVSU0lERSI7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQSBib29sZWFuIHZhbHVlIHdoZXRoZXIgdGhlIHNlcnZlci1zaWRlIHNrZWxldG9ucyBhcmUgZ2VuZXJhdGVkIG9yIG5vdAotICAgICAqLwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9DSEVDS19HRU5FUkFURV9DTElFTlRTSURFID0gIlBSRUZfQ0hFQ0tfR0VORVJBVEVfQ0xJRU5UU0lERSI7Ci0KLSAgICAvKioKLSAgICAgKiBBIGJvb2xlYW4gdmFsdWUgd2hldGhlciB0aGUgc2VydmVyLXNpZGUgY29uZmlndXJhdGlvbiBmaWxlIGZvciBBeGlzMiAoc2VydmVyLnhtbCkgd2lsbCBiZSBnZW5lcmF0ZWQgb3Igbm90LgotICAgICAqLwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9DSEVDS19HRU5FUkFURV9TRVJWRVJDT05GSUcgPSAiUFJFRl9DSEVDS19HRU5FUkFURV9TRVJWRVJDT05GSUciOwotICAgIAotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9DT01CT19QT1JUTkFNRV9JTkRFWCA9ICJQUkVGX1RFWFRfUE9SVE5BTUUiOwotICAgIAotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9DT01CT19TRVJWSUNFTkFNRV9JTkRFWCA9ICJQUkVGX1RFWFRfU0VSVklDRU5BTUUiOwotICAgIAotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9EQVRBQklOREVSX0lOREVYID0gIlBSRUZfREFUQUJJTkRFUl9JTkRFWCI7Ci0gICAgCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX0dFTl9BTEwgPSAiUFJFRl9HRU5fQUxMIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfR0VOX1NTX0lOVEVSRkFDRSA9ICJQUkVGX0dFTl9TRVJWRVJTSURFX0lOVEVSRkFDRSI7Ci0KLSAgICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0gICAgLy8gSmF2YSBzb3VyY2UgZmlsZSBzZWxlY3Rpb24gcGFnZQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQV9DTEFTU19OQU1FID0gIkpBVkFfQ0xBU1NfTkFNRSI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBX0NMQVNTX1BBVEhfRU5UUklFUyA9ICJKQVZBX0NMQVNTX1BBVEhfTkFNRSI7Ci0gICAgCi0gICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotICAgIC8vIEphdmEyd3NkbCBvcHRpb25zIHNlbGVjdGlvbiBwYWdlCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX0pBVkFfVEFSR0VUX05TID0gIlRBUkdFVF9OUyI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX0pBVkFfVEFSR0VUX05TX1BSRUYgPSAiVEFSR0VUX05TX1BSRUYiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9KQVZBX1NDSEVNQV9UQVJHRVRfTlMgPSAiU0NIRU1BX1RBUkdFVF9OUyI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX0pBVkFfU0VSVklDRV9OQU1FID0gIlNDSEVNQV9TRVJWSUNFIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfSkFWQV9TVFlMRV9JTkRFWCA9ICJTVFlMRV9JTkRFWCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX0pBVkFfU0NIRU1BX1RBUkdFVF9OU19QUkVGID0gIlNDSEVNQV9UQVJHRVRfTlNfUFJFRiI7Ci0gICAgCi0gICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotICAgIC8vb3V0cHV0IHBhZ2UKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFfT1VUUFVUX1dTRExfTkFNRSA9ICJPVVRQVVRfV1NETCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX0pBVkFfT1VUUFVUX1dTRExfTE9DQVRJT04gPSAiT1VUUFVUX1dTRExfTE9DQVRJT04iOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9KQVZBX09VVFBVVF9GSUxFU1lBVEVNPSAiT1VUUFVUX1dTRExfTE9DQVRJT05fRklMRVNZQVRFTSI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX0pBVkFfT1VUUFVUX1dPUktTUEFDRSA9ICJPVVRQVVRfV1NETF9MT0NBVElPTl9XT1JLU1BBQ0UiOwotICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSAgICAvLyBQYWdlIGNvbnN0YW50cwotICAgICBzdGF0aWMgZmluYWwgaW50IFdTRExfMl9KQVZBX1RZUEUgPSAxOwotICAgICBzdGF0aWMgZmluYWwgaW50IEpBVkFfMl9XU0RMX1RZUEUgPSAyOwotICAgICBzdGF0aWMgZmluYWwgaW50IFVOU1BFQ0lGSUVEX1RZUEUgPSAzOwotICAgICAKLSAgICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotICAgICAvLyBDb2RlZ2VuIE9wdGlvbnMgY29uc3RhbnRzCi0gICAgICBzdGF0aWMgZmluYWwgaW50IENPREVHRU5fREVGQVVMVF9UWVBFID0gMTE7Ci0gICAgICBzdGF0aWMgZmluYWwgaW50IENPREVHRU5fQ1VTVE9NX1RZUEUgPSAxMjsKLSAgICAgIHN0YXRpYyBmaW5hbCBpbnQgQ09ERUdFTl9VTkRFQ0xFQVJFRF9UWVBFID0gMTM7Ci0gICAgCi0gICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotICAgIC8vIFdTREwgTW9kZSBjb25zdGFudHMKLSAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBXU0RMX0FMTCA9ICJBbGwiOwotICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFdTRExfSU5URVJGQUNFX09OTFkgPSAiSW50ZXJmYWNlIG9ubHkiOwotICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFdTRExfSU1QTEVNRU5UQVRJT05fT05MWSA9ICJJbXBsZW1lbnRhdGlvbiBvbmx5IjsKLSAgICAgCi0gICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0gICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NETF9TVFlMRV9ET0NVTUVOVD0iRG9jdW1lbnQiOwotICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFdTRExfU1RZTEVfUlBDPSJycGMiOwotICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFdTRExfU1RZTEVfV1JBUFBFRD0id3JhcHBlZCI7Ci0KLSAgICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX0NIRUNLX1dPUktTUEFDRSA9IlBSRUZfQ0hFQ0tfV09SS1NQQUNFIjsKLSAgICAgCi0gICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9DSEVDS19GSUxFX1NZU1RFTSA9IlBSRUZfQ0hFQ0tfRklMRV9TWVNURU0iOwotCi0gICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9DSEVDS19BWElTX0xJQl9DT1BZID0iUFJFRl9DSEVDS19GSUxFX1NZU1RFTSI7Ci0gICAgIAotICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfQ0hFQ0tfSkFSX0NSRUFUSU9OID0iUFJFRl9DSEVDS19GSUxFX1NZU1RFTSI7Ci0gICAgIAotICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfQVhJU19IT01FX09VVFBVVF9MT0NBVElPTiA9ICJQUkVGX09VVFBVVF9MT0NBVElPTiI7Ci0gICAgIAotICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfQVhJU19MSUJfTE9DQVRJT04gPSAiUFJFRl9PVVRQVVRfTE9DQVRJT04iOwotICAgICAKLSAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX0pBUl9GSUxFX05BTUUgPSAiUFJFRl9PVVRQVVRfTE9DQVRJT04iOwotICAgICAKLSAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX0NPREVHRU5fT1BUSU9OX0lOREVYID0gIlBSRUZfQ09ERUdFTl9PUFRJT05fSU5ERVgiOwotICAgICAKLSAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX0NIRUNLX0FYSVNfUExVR0lOX0xJQl9DT1BZID0iUFJFRl9DSEVDS19BWElTX1BMVUdJTl9MSUJfQ09QWSI7Ci0gICAgIAotICAgICAKLSAgICAKLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1jb2RlZ2VuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9jb2RlZ2VuL2VjbGlwc2UvdXRpbC9VSUNvbnN0YW50cy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLWNvZGVnZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL2NvZGVnZW4vZWNsaXBzZS91dGlsL1VJQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiOWE2N2IuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLWNvZGVnZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL2NvZGVnZW4vZWNsaXBzZS91dGlsL1VJQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudG9vbC5jb2RlZ2VuLmVjbGlwc2UudXRpbDsKLQotcHVibGljIGludGVyZmFjZSBVSUNvbnN0YW50cyB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQSA9ICJqYXZhIiA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ19TSEFSUCA9ICJjLXNoYXJwIiA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ19QTFVTX1BMVVMgPSAiQysrIiA7Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFUQV9CSU5ESU5HX05PTkUgPSAibm9uZSIgOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEFfQklORElOR19BREIgPSAiYWRiIiA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFUQV9CSU5ESU5HX1hNTEJFQU5TID0gInhtbGJlYW5zIiA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFUQV9CSU5ESU5HX0pJQlggPSAiamlieCIgOwotICAgIAotCS8vIFNlbGVjdGVkIE9wdGlvbiBieSB0aGUgdXNlciBhdCB0aGUgcHJldmlvdXMgcGFnZSAoZGVmYXVsdC9mYWxzZSBDdXN0b20vdHJ1ZSkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2VsZWN0ZWRPcHRpb24gPSBmYWxzZTsKLQkKLQkvL2NvZGVnZW4gb3B0aW9ucwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFQgPSAiZGVmYXVsdCIgOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTSA9ICJjdXN0b20iIDsKLQkKLQkvL0RlZmF1bHQgcGFja2FnZSBuYW1lIAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfUEFDS0FHRU5BTUUgPSAib3JnLmV4YW1wbGUud2Vic2VydmljZSIgOwotCQotCS8vRm9sZGVyIG5hbWVzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElCID0gImxpYiIgOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBUkdFVCA9ICJ0YXJnZXQiIDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5TID0gInBsdWdpbnMiIDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBWElTX0NPREVHRU5fUExVR0lOX0ZPTERFUiA9ICJBeGlzMl9Db2RlZ2VuX1dpemFyZF8xLjMuMCIgOwotCQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLWNvZGVnZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL2NvZGVnZW4vZWNsaXBzZS91dGlsL1dTRExQcm9wZXJ0eVJlYWRlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLWNvZGVnZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL2NvZGVnZW4vZWNsaXBzZS91dGlsL1dTRExQcm9wZXJ0eVJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWU4N2Y0Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1jb2RlZ2VuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9jb2RlZ2VuL2VjbGlwc2UvdXRpbC9XU0RMUHJvcGVydHlSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudG9vbC5jb2RlZ2VuLmVjbGlwc2UudXRpbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5VUkxQcm9jZXNzb3I7Ci0KLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5Qb3J0OwotaW1wb3J0IGphdmF4LndzZGwuU2VydmljZTsKLWltcG9ydCBqYXZheC53c2RsLldTRExFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5mYWN0b3J5LldTRExGYWN0b3J5OwotaW1wb3J0IGphdmF4LndzZGwueG1sLldTRExSZWFkZXI7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIHByZXNlbnRzIGEgY29udmVuaWVudCB3YXkgb2YgcmVhZGluZyB0aGUgCi0gKiBXU0RMIGZpbGUodXJsKSBhbmQgcHJvZHVjaW5nIGEgdXNlZnVsIHNldCBvZiBpbmZvcm1hdGlvbgotICogSXQgZG9lcyBOT1QgdXNlIGFueSBvZiB0aGUgc3RhbmRhcmQgV1NETCBjbGFzc2VzIGZyb20gCi0gKiBBeGlzMiwgcmF0aGVyIGl0IHVzZXMgd3NkbDRqIHRvIHJlYWQgdGhlIHdzZGwgYW5kIGV4dHJhY3QgCi0gKiB0aGUgcHJvcGVydGllcyAoVGhpcyBpcyBtZWFudCBhcyBhIGNvbnZlbmllbmNlIGZvciB0aGUgVUkKLSAqIG9ubHkuIFdlIG1heSBub3QgbmVlZCB0aGUgd2hvbGUgY29udmVyc2lvbiB0aGUgV1NETHB1bXAgCi0gKiBnb2VzIHRocm91Z2gpCi0gKiBPbmUgd291bGQgbmVlZCB0byBjaGFuZ2UgdGhpcyB0byBzdWl0IGEgcHJvcGVyIFdTREwgCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0RMUHJvcGVydHlSZWFkZXIgewotICAgIHByaXZhdGUgRGVmaW5pdGlvbiB3c2RsRGVmaW5pdGlvbiA9IG51bGw7Ci0gICAgCi0JcHVibGljIHZvaWQgcmVhZFdTREwoU3RyaW5nIGZpbGVwYXRoKSB0aHJvd3MgV1NETEV4Y2VwdGlvbiB7Ci0JCVdTRExSZWFkZXIgcmVhZGVyID0gV1NETEZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdXU0RMUmVhZGVyKCk7Ci0JCXdzZGxEZWZpbml0aW9uID0gcmVhZGVyLnJlYWRXU0RMKGZpbGVwYXRoKTsgCi0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5hbWVzcGFjZSBtYXAgZnJvbSBkZWZpbml0aW9uCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBNYXAgZ2V0RGVmaW5pdGlvbk5hbWVzcGFjZU1hcCgpewotCQlyZXR1cm4gd3NkbERlZmluaXRpb24uZ2V0TmFtZXNwYWNlcygpOwotCX0KLQkKLQkvKioKLQkgKiBnZXQgdGhlIGRlZmF1bHQgcGFja2FnZSBkZXJpdmVkIGJ5IHRoZSB0YXJnZXROYW1lc3BhY2UKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHBhY2thZ2VGcm9tVGFyZ2V0TmFtZXNwYWNlKCl7Ci0JCXJldHVybiAgVVJMUHJvY2Vzc29yLm1ha2VQYWNrYWdlTmFtZSh3c2RsRGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKSk7Ci0JCQotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBzZXJ2aWNlIG5hbWVzCi0JICogdGhlIG5hbWVzIGFyZSBRTmFtZXMKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIExpc3QgZ2V0U2VydmljZUxpc3QoKXsKLQkJTGlzdCByZXR1cm5MaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlTZXJ2aWNlIHNlcnZpY2UgPSBudWxsOwotCQlNYXAgc2VydmljZU1hcCA9IHdzZGxEZWZpbml0aW9uLmdldFNlcnZpY2VzKCk7Ci0JCWlmKHNlcnZpY2VNYXAhPW51bGwgJiYgIXNlcnZpY2VNYXAuaXNFbXB0eSgpKXsKLQkJICAgSXRlcmF0b3Igc2VydmljZUl0ZXJhdG9yID0gc2VydmljZU1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQkgICB3aGlsZShzZXJ2aWNlSXRlcmF0b3IuaGFzTmV4dCgpKXsKLQkJCSAgIHNlcnZpY2UgPSAoU2VydmljZSlzZXJ2aWNlSXRlcmF0b3IubmV4dCgpOwotCQkJICAgcmV0dXJuTGlzdC5hZGQoc2VydmljZS5nZXRRTmFtZSgpKTsKLQkJICAgfQotCQl9Ci0JCQotCQlyZXR1cm4gcmV0dXJuTGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBwb3J0cyBmb3IgYSBwYXJ0aWN1bGFyIHNlcnZpY2UKLQkgKiB0aGUgbmFtZXMgYXJlIFFOYW1lcwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQb3J0TmFtZUxpc3QoUU5hbWUgc2VydmljZU5hbWUpewotCQlMaXN0IHJldHVybkxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCVNlcnZpY2Ugc2VydmljZSA9IHdzZGxEZWZpbml0aW9uLmdldFNlcnZpY2Uoc2VydmljZU5hbWUpOwotCQlQb3J0IHBvcnQgPSBudWxsOyAKLQkJaWYoc2VydmljZSE9bnVsbCl7Ci0JCSAgIE1hcCBwb3J0TWFwID0gc2VydmljZS5nZXRQb3J0cygpOwotCQkgICBpZiAocG9ydE1hcCE9bnVsbCAmJiAhcG9ydE1hcC5pc0VtcHR5KCkpewotCQkJICAgSXRlcmF0b3IgcG9ydEl0ZXJhdG9yID0gcG9ydE1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQkJICAgd2hpbGUocG9ydEl0ZXJhdG9yLmhhc05leHQoKSl7Ci0JCQkJIHBvcnQgPSAoUG9ydClwb3J0SXRlcmF0b3IubmV4dCgpOwotCQkJCSByZXR1cm5MaXN0LmFkZChwb3J0LmdldE5hbWUoKSk7Ci0JCQkgICB9Ci0JCSAgIH0KLQkJICAKLQkJfQotCQkKLQkJcmV0dXJuIHJldHVybkxpc3Q7Ci0JfQotCi0JLyoqCi0JICogcHVibGljIG1ldGhvZCB0byBnZXQgbG9hZGVkIHdzZGwgRGVmaW5pdGlvbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgRGVmaW5pdGlvbiBnZXRXc2RsRGVmaW5pdGlvbigpIHsKLQkJcmV0dXJuIHdzZGxEZWZpbml0aW9uOwotCX0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1jb2RlZ2VuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9jb2RlZ2VuL3Jlc291cmNlL0NvZGVnZW4ucHJvcGVydGllcyBiL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1jb2RlZ2VuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9jb2RlZ2VuL3Jlc291cmNlL0NvZGVnZW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VjZDc1Yy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2UtY29kZWdlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvY29kZWdlbi9yZXNvdXJjZS9Db2RlZ2VuLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzcgKzAsMCBAQAotIwotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyMjIyMjIyMjIyMjIyMjIyMjIyBQcm9wZXJ0eSBmaWxlIGZvciB0aGUgQXhpczIgQ29kZSBnZW5lcmF0b3IgIyMjIyMjIyMjIyMjIyMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIwotI0dlbmVyYWwKLWdlbmVyYWwuRXJyb3I9RXJyb3IKLWdlbmVyYWwuRXJyb3IucHJlZml4PUFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGNvbXBsZXRpbmcgcHJvY2VzcyAtCi1nZW5lcmFsLm5hbWU9QXhpczIgQ29kZWdlbiBXaXphcmQKLWdlbmVyYWwuYnJvd3NlPUJyb3dzZS4uLgotZ2VuZXJhbC5zZWFyY2g9U2VhcmNoLi4KLWdlbmVyYWwuaW52YWxpZC5zdGF0ZT1JbnZhbGlkIHN0YXRlIQotZ2VuZXJhbC51c2VyYWJvcnRlZC5zdGF0ZT1Vc2VyIGFib3J0ZWQhCi1nZW5lcmFsLmVtcHR5PQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBJbml0aWFsIHRvb2wgc2VsZWN0aW9uIHBhZ2UgLSBQYWdlMAotIyBUb29sIHNlbGVjdGlvbgotcGFnZTAubmFtZT1BeGlzMiBDb2RlIGdlbmVyYXRpb24gd2l6YXJkCi1wYWdlMC50aXRsZT1TZWxlY3QgdGhlIHdpemFyZAotcGFnZTAuZGVzYz1XZWxjb21lIHRvIHRoZSBBeGlzMiBjb2RlIGdlbmVyYXRvciB3aXphcmQuIAotIwotcGFnZTAub3B0aW9ucy5kZXNjPVBsZWFzZSBzcGVjaWZ5IHdoYXQgeW91IHdhbnQgdG8gZG8uIAotcGFnZTAuaGludC5kZXNjPUhpbnQgOiBZb3UgY2FuIGdlbmVyYXRlIGphdmEgY29kZSBmcm9tIGEgV1NETCBvciBXU0RMIGZyb20gYSBKYXZhIHNvdXJjZSBmaWxlLgotcGFnZTAuamF2YTJ3c2RsLmRlc2M9U2VsZWN0IHRoaXMgb3B0aW9uIGlmIHlvdSBhbHJlYWR5IGhhdmUgYSBqYXZhIHNvdXJjZSBmaWxlIGFuZCBuZWVkIHRvIGdlbmVyYXRlIGEgV1NETCAKLXBhZ2UwLmphdmEyd3NkbC5jYXB0aW9uPUdlbmVyYXRlIGEgV1NETCBmcm9tIGEgSmF2YSBzb3VyY2UgZmlsZQotIwotcGFnZTAud3NkbDJqYXZhLmRlc2M9U2VsZWN0IHRoaXMgb3B0aW9uIGlmIHlvdSBuZWVkIHRvIGdlbmVyYXRlIHN0dWJzL3NrZWxldG9ucyBmcm9tIGEgV1NETCAKLXBhZ2UwLndzZGwyamF2YS5jYXB0aW9uPUdlbmVyYXRlIEphdmEgc291cmNlIGNvZGUgZnJvbSBhIFdTREwgZmlsZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotI1dTREwgc2VsZWN0aW9uIHBhZ2UgLSBQYWdlMQotI1dTREwgc2VsZWN0aW9uIHBhZ2UgbmFtZQotcGFnZTEubmFtZT1wYWdlMQotcGFnZTEudGl0bGU9V1NETCBzZWxlY3Rpb24gcGFnZQotcGFnZTEuZGVzYz1QbGVhc2UgU2VsZWN0IHRoZSBXU0RMIGZpbGUgbG9jYXRpb24KLSNsYWJlbHMKLXBhZ2UxLmZpbGVzZWxlY3Rpb24ubGFiZWw9V1NETCBmaWxlIGxvY2F0aW9uIDoKLXBhZ2UxLmZpbGVzZWxlY3Rpb24uYnJvd3NlPUJyb3dzZS4uLgotcGFnZTEuaGludC5kZXNjPUhpbnQgOiBZb3UgY2FuIHNlbGVjdCBvbmx5ICoud3NkbC8qLnhtbCBmaWxlIGxvY2F0aW9uIAotCi0jRXJyb3JzCi1wYWdlMS5lcnJvci5maWxlbWlzc2luZ2Vycm9yPUZpbGUgbmFtZSBzaG91bGQgYmUgc3BlY2lmaWVkCi1wYWdlMS5lcnJvci53cm9uZ2V4dGVuc2lvbj1GaWxlIGV4dGVuc2lvbiBtdXN0IGJlIHdzZGwKLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIAotI09wdGlvbnMgLSBwYWdlMwotcGFnZTIubmFtZT1wYWdlMwotcGFnZTIudGl0bGU9T3B0aW9ucwotcGFnZTIuZGVzYz1TZXQgdGhlIG9wdGlvbnMgZm9yIHRoZSBjb2RlIGdlbmVyYXRvci4gSWYgeW91IHdpc2ggdG8gZWRpdCB0aGUgY29kZWdlbiBvcHRpb25zLCBTZWxlY3QgY3VzdG9tIG9wdGlvbiBmcm9tIENvZGVnZW4gT3B0aW9uIGRyb3AgZG93biBsaXN0LgotI2xhYmVscwotcGFnZTIubGFuZ3VhZ2UuY2FwdGlvbj1PdXRwdXQgbGFuZ3VhZ2UKLXBhZ2UyLnN5bmNBc3luYy5jYXB0aW9uPUdlbmVyYXRlIGJvdGggc3luYyBhbmQgYXN5bmMKLXBhZ2UyLnN5bmMuY2FwdGlvbj1HZW5lcmF0ZSBzeW5jIHN0eWxlIG9ubHkKLXBhZ2UyLmFzeW5jLmNhcHRpb249R2VuZXJhdGUgYXN5bmMgc3R5bGUgb25seQotcGFnZTIucGFja2FnZS5jYXB0aW9uPUN1c3RvbSBwYWNrYWdlIG5hbWUKLXBhZ2UyLm5hbWVzcGFjZS5jYXB0aW9uPU5hbWVzcGFjZQotcGFnZTIubmFtZXNwYWNlMlBrZy5jYXB0aW9uPU5hbWVzcGFjZSB0byBwYWNrYWdlIG1hcHBpbmdzCi1wYWdlMi5zZXJ2ZXJzaWRlLmNhcHRpb249R2VuZXJhdGUgc2VydmVyIHNpZGUgY29kZQotcGFnZTIuY2xpZW50c2lkZS5jYXB0aW9uPUdlbmVyYXRlIGNsaWVudCBzaWRlIGNvZGUKLXBhZ2UyLnNlcnZpY2VYTUwuY2FwdGlvbj1HZW5lcmF0ZSBhIGRlZmF1bHQgc2VydmljZXMueG1sCi1wYWdlMi50ZXN0Y2FzZS5jYXB0aW9uPUdlbmVyYXRlIHRlc3QgY2FzZQotcGFnZTIuZGF0YWJpbmRpbmdDaGVjay5jYXB0aW9uPURhdGFiaW5kaW5nIE5hbWUKLXBhZ2UyLnNlcnZpY2VOYW1lLmNhcHRpb249U2VydmljZSBOYW1lCi1wYWdlMi5wb3J0TmFtZS5jYXB0aW9uPVBvcnQgTmFtZQotcGFnZTIuZ2VuQWxsLmNhcHRpb249R2VuZXJhdGUgQm90aCB3aXRoIGFsbCBjbGFzc2VzIGZvciBldmVyeSBlbGVtZW50cyBvbiBTaGVtYXMgCi1wYWdlMi5zc0ludGVyZmFjZS5jYXB0aW9uPUdlbmVyYXRlIGFuIEludGVyZmFjZSBmb3IgU2tlbGV0b24KLXBhZ2UyLndzZGxOb3RGb3VuZC5tZXNzYWdlPVNwZWNpZmllZCBXU0RMIGlzIG5vdCBmb3VuZCEsIFBsZWFzZSBDaGVjayB3aGV0aGVyIHlvdSBoYXZlIGVudGVyZWQgdGhlIGNvcnJlY3QgcGF0aCB0byBhICoud3NkbCBvbiBwcmV2aW91cyBwYWdlLgotcGFnZTIud3NkbEludmFsaWQubWVzc2FnZT1TcGVjaWZpZWQgV1NETCBpcyBpbnZhbGlkISwgUGxlYXNlIHNlbGVjdCBhIHZhbGlkYXRlZCAqLndzZGwvKi54bWwgZmlsZSBvbiBwcmV2aW91cyBwYWdlLgotcGFnZTIubm9wb3J0cy5tZXNzYWdlPU5vIHBvcnRzIGZvdW5kIGluIHRoZSBzcGVjaWZpZWQgc2VydmljZQotIwotcGFnZTIub3B0aW9ucy5kZXNjPUNvZGVnZW4gb3B0aW9uCi1wYWdlMi5kZWZhdWx0LmRlc2M9U2VsZWN0IHRoaXMgdG8gY29kZWdlbiBieSBhY2NlcHRpbmcgdGhlIGRlZmF1bHQgb3B0aW9ucwotcGFnZTIuZGVmYXVsdC5jYXB0aW9uPURlZmF1bHQgQ29kZWdlbiBPcHRpb25zCi0jCi1wYWdlMi5jdXN0b20uZGVzYz1TZWxlY3QgdGhpcyBvcHRpb24gaWYgeW91IG5lZWQgdG8gY3VzdG9taXplIHRoZSBjb2RlZ2VuIG9wdGlvbnMKLXBhZ2UyLmN1c3RvbS5jYXB0aW9uPUN1c3RvbSBDb2RlZ2VuIE9wdGlvbnMKLSNlcnJvcnMKLXBhZ2UyLnBhY2hhZ2UuZXJyb3Iubm9sb2NhdGlvbj1JbnZhbGlkIHBhY2thZ2UgbmFtZS4gUGxlYXNlIGVudGVyIGEgdmFsaWQgcGFja2FnZSBuYW1lLgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgCi0jT3V0cHV0IGxvY2F0aW9uIHNlbGVjdGlvbiAtIHBhZ2U0ICAKLXBhZ2UzLm5hbWU9cGFnZTQKLXBhZ2UzLnRpdGxlPU91dHB1dAotcGFnZTMuZGVzYz1TZXQgdGhlIG91dHB1dCBsb2NhdGlvbiBmb3IgdGhlIGdlbmVyYXRlZCBjb2RlCi0jbGFibGVzCi1wYWdlMy5yZXN1bHQuZGVjcz1TZWxlY3Qgb25lIG9mIGJlbG93IHRvIHNhdmUgdGhlIGNvZGVnZW4gb3V0cHV0IGVpdGhlciBvbiBlY2xpcHNlIHdvcmtzcGFjZSBwcm9qZWN0IG9yIFxuIG9uIGZpbGUgc3lzdGVtIGFuZCB0aGVuIGJyb3dzZSB0byBlbnRlciB0aGUgb3V0cHV0IHBhdGgKLXBhZ2UzLm91dHB1dC5jYXB0aW9uPU91dHB1dCBwYXRoCi1wYWdlMy5heGlzaG9tZS5jYXB0aW9uPUF4aXMgSG9tZQotcGFnZTMuamFybmFtZS5jYXB0aW9uPUphciBGaWxlIE5hbWUKLXBhZ2UzLm91dHNlbGVjdGlvbi5icm93c2U9QnJvd3NlLi4uCi1wYWdlMy5sb2FkbGlicy5icm93c2U9Q2hlY2sgTGlicy4uLgotcGFnZTMuY29udGFpbmVyYm94LnRpdGxlPVNlbGVjdCBuZXcgZmlsZSBjb250YWluZXIKLXBhZ2UzLndvcmtzcGFjZS5jYXB0aW9uPUJyb3dzZSBhbmQgc2VsZWN0IGEgcHJvamVjdCBvbiBjdXJyZW50IGVjbGlwc2Ugd29ya3NwYWNlCi1wYWdlMy53b3Jrc3BhY2UuZGVzYz1TZWxlY3QgdGhpcyB0byBhZGQgdGhlIGNvZGVnZW4gcmVzdWx0cyB1bmRlciBhIHByb2plY3Qgb24gY3VycmVudCBlY2xpcHNlIHdvcmtzcGFjZQotcGFnZTMuZmlsZXN5c3RlbS5jYXB0aW9uPUJyb3dzZSBhbmQgc2VsZWN0IGxvY2F0aW9uIG9uIGxvY2FsIGZpbGUgc3lzdGVtCi1wYWdlMy5maWxlc3lzdGVtLmRlc2M9U2VsZWN0IHRoaXMgdG8gc2F2ZSB0aGUgcmVzdWx0cyBvZiB0aGUgY29kZWdlbiBvbiBsb2NhbCBmaWxlIHN5c3RlbQotcGFnZTMuYWRkYXhpc2xpYi5jYXB0aW9uPUFkZCBBeGlzMiBsaWJyYXJpZXMgdG8gdGhlIGNvZGVnZW4gcmVzdWx0IHByb2plY3QKLXBhZ2UzLmFkZGF4aXNsaWIuZGVzYz1DbGljayB0aGlzIHRvIENvcHkgdGhlIEF4aXMyIExpYnJhcmllcyB0byB0aGUgY3JlYXRlZCBwcm9qZWN0IGxpYnJhcnkKLXBhZ2UzLmphcmNyZWF0aW9uLmNhcHRpb249Q3JlYXRlIGEgamFyIGZpbGUgb2YgY29kZWdlbiByZXN1bHQgcHJvamVjdCBhbmQgYWRkIHRvIHJlc3VsdGVkIHByb2plY3QgbGliIGZvbGRlciAoRGVmYXVsdCA6IENvZGVnZW5SZXN1bHRzLmphcikKLXBhZ2UzLmphcmNyZWF0aW9uLmRlc2M9Q2xpY2sgdGhpcyB0byBjcmVhdGUgYSBqYXIgZmlsZSBvZiB0aGUgY29kZWdlbiByZXN1bHRzIGFuZCBwdXQgdGhhdCBpbiBvdXRwdXQgbG9jYXRpb24KLXBhZ2UzLmNvcHlwbHVnaW5saWIuY2FwdGlvbj1BZGQgdGhlIEF4aXMyIGNvZGVnZW4gamFycyB0byB0aGUgY29kZWdlbiByZXN1bHRlZCBwcm9qZWN0Ci1wYWdlMy5jb3B5cGx1Z2lubGliLmRlc2M9Q2xpY2sgdGhpcyB0byBhZGQgYWxsIHRoZSBBeGlzMiBsaWJzIGluIHRvIHRoZSBnZW5lcmF0ZWQgcHJvamVjdCBhcyB0aGUgcmVzdWx0IG9mIGNvZGVnZW4KLXBhZ2UzLmhpbnQuY2FwdGlvbj1IaW50IDogSWYgeW91IGhhdmUgQXhpczIgYmluYXJ5IGRpc3RyaWJ1dGlvbiBvciBBeGlzIHNvdXJjZSwgdGhlbiB5b3UgY2FuIGFkZCB0aG9zZSBsaWJzIGFsc28gdG8gdGhlXG4gcmVzdWx0ZWQgY29kZWdlbiBwcm9qZWN0IGJ5IGNoZWNraW5nIHRoZSBcIkFkZCBBeGlzMiBMaWJyYXJpZXMgdG8gdGhlIGNvZGVnZW4gcmVzdWx0ZWQgcHJvamVjdFwiXG4gY2hlY2sgYm94IGFuZCBzcGVjaWZ5aW5nIHRoZSBBeGlzMiBob21lLiBBbm90aGVyIG9wdGlvbiB5b3UgaGF2ZSBpcyB0byBjb21waWxlIHRoZSBjb2RlZ2VuIFxuIHJlc3VsdCBwcm9qZWN0IGFuZCBhZGQgaXQgYXMgYSBqYXIgZmlsZSBpbiB0aGUgbGliIGRpcmVjdG9yeSBvZiB0aGUgcmVzdWx0ZWQgcHJvamVjdCwgZm9yIHRoYXQgeW91IGNhbiBcbiBjaGVjayB0aGUgXCJDcmVhdGUgYSBqYXIgZmlsZSBvZiBjb2RlZ2VuIHJlc3VsdCBwcm9qZWN0IGFuZCBhZGQgdG8gcmVzdWx0ZWQgcHJvamVjdCBsaWIgZm9sZGVyXCIgXG4gY2hlY2tib3ggYW5kIHRoZW4gZ2l2ZSB0aGUgamFyIGZpbGUgbmFtZSB0aGF0IHlvdSBwcmVmZXIuIFxuIElmIHlvdSBhcmUgYWRkaW5nIHRoZSBjb2RlZ2VuIHJlc3VsdCB0byBhIGVjbGlwc2UgcHJvamVjdCBvbiBjdXJyZW50IGVjbGlwc2Ugd29ya3NwYWNlLCBcbiBwbGVhc2UgbWFrZSBzdXJlIHRvIHJlZnJlc2ggdGhhdCBwYXJ0aWN1bGFyIGVjbGlwc2UgcHJvamVjdC4gXG4gQWxzbyBpZiB5b3Ugc2VsZWN0IHRoZSBvcHRpb25zIHRvIGFkZCBsaWJzIHRvIHRoZSBwcm9qZWN0LCBtYWtlIHN1cmUgdG8gYWRkIHRob3NlIGxpYnMgdG8gdGhlIFxuIHByb2plY3QgbGlicmFyeSBwYXRoLgotcGFnZTMubG9hZGxpYi5zdWNjZXNzLmNhcHRpb249QXhpcyBsaWJzIGxvYWRlZCBzdWNjZXNzZnVsbHkgISEKLXBhZ2UzLmxvYWRsaWIuZmFpbC5jYXB0aW9uPUF4aXMgbGlicyBhcmUgbm90IGF2YWlsYWJsZSEhIFBsZWFzZSB2ZXJpZnkgdGhlIGVudGVyZWQgcGF0aCEhCi1wYWdlMy5sb2FkbGliLmZhaWwubWVzc2FnZT1BeGlzIGxpYnMgYXJlIG5vdCBhdmFpbGFibGUhISBQbGVhc2UgdmVyaWZ5IHRoZSBlbnRlcmVkIHBhdGgsIElmIHlvdSBwb2ludCB0byBzb3VyY2UgdHJ5IG1hdmVuIGdvYWwgY3JlYXRlLWxpYiAhIQotcGFnZTMuaGludC5vbj1QYWdlIEhpbnQgPj4KLXBhZ2UzLmhpbnQub2ZmPVBhZ2UgSGludCA8PAotI2Vycm9ycwotcGFnZTMuZXJyb3Iubm9sb2NhdGlvbj1vdXRwdXQgbG9jYXRpb24gbmVlZHMgdG8gYmUgc3BlY2lmaWVkCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotI2phdmEgc291cmNlIGZpbGUgc2VsZWN0aW9uID0gcGFnZTUKLXBhZ2U0Lm5hbWU9cGFnZTUKLXBhZ2U0LnRpdGxlPUphdmEgc291cmNlL2NsYXNzcGF0aCBzZWxlY3Rpb24KLXBhZ2U0LmRlc2M9U2VsZWN0IHRoZSBjbGFzc2VzIGFuZCB0aGUgbGlicmFyaWVzCi0jbGFiZWxzCi1wYWdlNC5jbGFzc3BhdGgubGFiZWw9SmF2YSBDbGFzcyBwYXRoIEVudHJpZXMuIFNlbGVjdCBlaXRoZXIgZm9sZGVycyBvciBqYXIgZmlsZXMKLXBhZ2U0LmNsYXNzbmFtZS5sYWJlbD1GdWxseSBRdWFsaWZpZWQgQ2xhc3MgbmFtZQotcGFnZTQuYWRkRGlyLmxhYmVsPUFkZCBGb2xkZXIKLXBhZ2U0LmFkZEphci5sYWJlbD1BZGQgSmFyCi1wYWdlNC5yZW1vdmVFbnRyeS5sYWJlbD1SZW1vdmUKLXBhZ2U0LmVycm9yLmludmFsaWRDbGFzc05hbWU9RnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgbmVlZHMgdG8gYmUgc3BlY2lmaWVkIQotcGFnZTQuZXJyb3IuQ2xhc3NOYW1lTm90VGVybWluYXRlZD1DbGFzcyBuYW1lIGlzIG5vdCBwcm9wZXJseSB0ZXJtaW5hdGVkIQotcGFnZTQudHJ5TG9hZC5sYWJlbD1UZXN0IENsYXNzIExvYWRpbmcuLgotcGFnZTQudW5rbm93bkVycm9yLmxhYmVsPVVua25vd24gZXJyb3IhCi1wYWdlNC5zdWNjZXNzTG9hZGluZy5sYWJlbD1DbGFzcyBmaWxlIGxvYWRlZCBzdWNjZXNzZnVsbHkKLXBhZ2U0LmhpbnQuY2FwdGlvbj1IaW50IDogUGxlYXNlIGdpdmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lLCBleGFtcGxlIDpjb20uZm9vLkJhclNlcnZpY2VcbiAgICAgICAgIFRoZW4gYWRkIHRoZSBmb2xkZXIgb3IgdGhlIGphciBmaWxlIHdoaWNoIGNvbnRhaW5zIHRoYXQgY2xhc3MgZmlsZS4gXG4gICAgICAgICBGaW5hbGx5IGNoZWNrIHdoZXRoZXIgdGhlIGNsYXNzIGZpbGUgY2FuIGJlIGxvYWRlZCBmcm9tIHRoZSBwbHVnaW4uIFxuXG4gICAgICAgICBJZiB0aGUgY2xhc3MgdGhhdCB5b3UgYXJlIGdvaW5nIHRvIGxvYWQgY29udGFpbnMgYW55IGRlcGVuZGVuY2llcyBcbiAgICAgICAgIG9uIG90aGVyIGF4aXMyIGxpYnJhcmllcyAoIGZvciBleGFtcGxlIGxpa2UgYXhpb20qLmphciksIHBsZWFzZSBhZGQgdGhvc2UgXG4gICAgICAgICBsaWJyYXJpZXMgYXMgd2VsbCBhbmQgdHJ5IHRvIGxvYWQgdGhlIGNsYXNzLgotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSNqYXZhMndzZGwgb3B0aW9ucyA9IHBhZ2U2Ci1wYWdlNS5uYW1lPXBhZ2U2Ci1wYWdlNS50aXRsZT1KYXZhIHRvIFdTREwgT3B0aW9ucwotcGFnZTUuZGVzYz1TZXQgdGhlIE9wdGlvbnMgZm9yIHRoZSBnZW5lcmF0b3IKLXBhZ2U1LnRhcmdldE5hbWVzcGFjZS5sYWJlbD1UYXJnZXQgTmFtZXNwYWNlCi1wYWdlNS50YXJnZXROYW1lc3BhY2VQcmVmaXgubGFiZWw9VGFyZ2V0IE5hbWVzcGFjZSBQcmVmaXgKLXBhZ2U1LnNjaGVtYVRhcmdldE5zLmxhYmVsPVNjaGVtYSB0YXJnZXQgbmFtZXNwYWNlCi1wYWdlNS5zY2hlbWFUYXJnZXROc1ByZWZpeC5sYWJlbD1TY2hlbWEgdGFyZ2V0IG5hbWVzcGFjZSBQcmVmaXgKLXBhZ2U1LnNlcnZpY2VOYW1lLmxhYmVsPVNlcnZpY2UgTmFtZQotcGFnZTUuZXJyb3IuZmlsZW1pc3NpbmdlcnJvcj1TZXJ2aWNlIG5hbWUgc2hvdWxkIGJlIHNwZWNpZmllZAotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSNqYXZhMndzZGwgb3V0cHV0IGxvY2F0aW9uIC0gcGFnZTcKLXBhZ2U2Lm5hbWU9cGFnZTcKLXBhZ2U2LnRpdGxlPVdTREwgZmlsZSBvdXRwdXQgbG9jYXRpb24KLXBhZ2U2LmRlc2M9U2VsZWN0IHRoZSBsb2NhdGlvbiBmb3IgdGhlIGdlbmVyYXRlZCBXU0RMLgotIyMjIwotcGFnZTYub3V0cHV0LmxhYmVsPU91dHB1dCBsb2NhdGlvbgotcGFnZTYub3V0cHV0bmFtZS5sYWJlbD1PdXRwdXQgRmlsZSBOYW1lCi1wYWdlNi53b3Jrc3BhY2UuY2FwdGlvbj1Ccm93c2UgYW5kIGFkZCB0aGUgV1NETCB0byBhIHByb2plY3Qgb24gY3VycmVudCBlY2xpcHNlIHdvcmtzcGFjZQotcGFnZTYud29ya3NwYWNlLmRlc2M9U2VsZWN0IHRoaXMgdG8gYWRkIHRoZSBXU0RMIGZpbGUgdW5kZXIgYSBwcm9qZWN0IG9uIGN1cnJlbnQgZWNsaXBzZSB3b3Jrc3BhY2UKLXBhZ2U2LmZpbGVzeXN0ZW0uY2FwdGlvbj1Ccm93c2UgYW5kIHNhdmUgdGhlIFdTREwgZmlsZSBvbiBsb2NhbCBmaWxlIHN5c3RlbQotcGFnZTYuZmlsZXN5c3RlbS5kZXNjPVNlbGVjdCB0aGlzIHRvIHNhdmUgdGhlIHJlc3VsdGVkIFdTREwgb24gbG9jYWwgZmlsZSBzeXN0ZW0KLSNXaXphcmQKLWdlbmVyYXRvci5nZW5lcmF0aW5nPUdlbmVyYXRpbmcgY29kZS4uLgotZ2VuZXJhdG9yLnJlYWRpbmdXT009UmVhZGluZyBXU0RMIGZpbGUuLi4KLSNTdWNjZXNzIG1lc3NhZ2UKLXdpemFyZC5zdWNjZXNzPUFsbCBvcGVyYXRpb25zIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkgIQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2UtY29kZWdlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvY29yZS9DbGFzc0ZpbGVIYW5kbGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2UtY29kZWdlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvY29yZS9DbGFzc0ZpbGVIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MDdiOWUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLWNvZGVnZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL2NvcmUvQ2xhc3NGaWxlSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnRvb2wuY29yZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uZXQuVVJMQ2xhc3NMb2FkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotcHVibGljIGNsYXNzIENsYXNzRmlsZUhhbmRsZXIgewotCi0KLSAgIAotLyoqCi0gKiAKLSAqIEBwYXJhbSBjbGFzc0ZpbGVOYW1lCi0gKiBAcGFyYW0gbG9jYXRpb24KLSAqIEByZXR1cm4KLSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAqIEB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbgotICovCi0gICAgcHVibGljIEFycmF5TGlzdCBnZXRNZXRob2ROYW1lc0Zyb21DbGFzcyhTdHJpbmcgY2xhc3NGaWxlTmFtZSxTdHJpbmcgbG9jYXRpb24pIHRocm93cyBJT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbnsKLSAgICAgICAgQXJyYXlMaXN0IHJldHVybkxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIEZpbGUgZmlsZUVuZHBvaW50ID0gbmV3IEZpbGUobG9jYXRpb24pOwotICAgICAgICBpZiAoIWZpbGVFbmRwb2ludC5leGlzdHMoKSkKLSAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigidGhlIGxvY2F0aW9uIGlzIGludmFsaWQiKTsKLSAgICAgICAgVVJMW10gdXJsTGlzdCA9IHtmaWxlRW5kcG9pbnQudG9VUkwoKX07Ci0gICAgICAgIFVSTENsYXNzTG9hZGVyIGNsYXp6TG9hZGVyID0gbmV3IFVSTENsYXNzTG9hZGVyKHVybExpc3QpOwotICAgICAgICBDbGFzcyBjbGF6eiA9IGNsYXp6TG9hZGVyLmxvYWRDbGFzcyhjbGFzc0ZpbGVOYW1lKTsKLSAgICAgICAgTWV0aG9kW10gbWV0aG9kcyA9IGNsYXp6LmdldERlY2xhcmVkTWV0aG9kcygpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgcmV0dXJuTGlzdC5hZGQobWV0aG9kc1tpXS5nZXROYW1lKCkpOwotCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldHVybkxpc3Q7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2UtY29kZWdlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvY29yZS9GaWxlQ29waWVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2UtY29kZWdlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvY29yZS9GaWxlQ29waWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiNDM5OGUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLWNvZGVnZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL2NvcmUvRmlsZUNvcGllci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnRvb2wuY29yZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuQ29weTsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWxlU2V0OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1wdWJsaWMgY2xhc3MgRmlsZUNvcGllciBleHRlbmRzIENvcHl7Ci0gICAgcHVibGljIEZpbGVDb3BpZXIoKSB7Ci0gICAgICAgIHRoaXMuc2V0UHJvamVjdChuZXcgUHJvamVjdCgpKTsKLSAgICAgICAgdGhpcy5nZXRQcm9qZWN0KCkuaW5pdCgpOwotICAgICAgICB0aGlzLnNldFRhc2tUeXBlKCJjb3B5Iik7Ci0gICAgICAgIHRoaXMuc2V0VGFza05hbWUoImNvcHktZmlsZXMiKTsKLSAgICAgICAgdGhpcy5zZXRPd25pbmdUYXJnZXQobmV3IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhcmdldCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjb3B5RmlsZXMoRmlsZSBzb3VyY2VGaWxlLEZpbGUgZGVzdGluYXRpb25EaXJlY3RvcnksU3RyaW5nIGZpbHRlcil7Ci0gICAgICAgIGlmIChzb3VyY2VGaWxlLmlzRmlsZSgpKQotICAgICAgICAgICAgdGhpcy5zZXRGaWxlKHNvdXJjZUZpbGUpOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIEZpbGVTZXQgZmlsZXNldCA9IG5ldyBGaWxlU2V0KCk7Ci0gICAgICAgICAgICBmaWxlc2V0LnNldERpcihzb3VyY2VGaWxlKTsKLSAgICAgICAgICAgIGlmIChmaWx0ZXIhPW51bGwpewotICAgICAgICAgICAgICAgIGlmIChmaWx0ZXIubWF0Y2hlcygiXFwuXFx3KiIpKXsKLSAgICAgICAgICAgICAgICAgICAgZmlsZXNldC5zZXRJbmNsdWRlcygiKi8qKi8qIitmaWx0ZXIpOyAKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHRoaXMuYWRkRmlsZXNldChmaWxlc2V0KTsKLSAgICAgICAgfQotICAgICAgICB0aGlzLnNldFRvZGlyKGRlc3RpbmF0aW9uRGlyZWN0b3J5KTsKLSAgICAgICAgdGhpcy5wZXJmb3JtKCk7Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1jb2RlZ2VuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9jb3JlL0phckZpbGVXcml0ZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1jb2RlZ2VuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9jb3JlL0phckZpbGVXcml0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRkYTJmMy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2UtY29kZWdlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvY29yZS9KYXJGaWxlV3JpdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudG9vbC5jb3JlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5KYXI7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIEphckZpbGVXcml0ZXIgZXh0ZW5kcyBKYXJ7Ci0KLQotICAgIHB1YmxpYyBKYXJGaWxlV3JpdGVyKCkgewotICAgICAgICB0aGlzLnNldFByb2plY3QobmV3IFByb2plY3QoKSk7Ci0gICAgICAgIHRoaXMuZ2V0UHJvamVjdCgpLmluaXQoKTsKLSAgICAgICAgdGhpcy5zZXRUYXNrVHlwZSgiamFyIik7Ci0gICAgICAgIHRoaXMuc2V0VGFza05hbWUoImphciIpOwotICAgICAgICB0aGlzLnNldE93bmluZ1RhcmdldChuZXcgb3JnLmFwYWNoZS50b29scy5hbnQuVGFyZ2V0KCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlSmFyRmlsZShGaWxlIG91dHB1dEZvbGRlcixTdHJpbmcgb3V0cHV0RmlsZU5hbWUsRmlsZSBpbnB1dEZpbGVGb2xkZXIpIHRocm93cyBJT0V4Y2VwdGlvbixFeGNlcHRpb24gewotCi0gICAgICAgIGlmICghb3V0cHV0Rm9sZGVyLmV4aXN0cygpKXsKLSAgICAgICAgICAgIG91dHB1dEZvbGRlci5ta2RpcigpOyAvL2NyZWF0ZSB0aGUgb3V0cHV0IHBhdGgKLSAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICBpZiAoIW91dHB1dEZvbGRlci5pc0RpcmVjdG9yeSgpKQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIEZpbGUgdGFyZ2V0RmlsZSA9IG5ldyBGaWxlKG91dHB1dEZvbGRlcixvdXRwdXRGaWxlTmFtZSk7Ci0gICAgICAgIHRoaXMuc2V0QmFzZWRpcihpbnB1dEZpbGVGb2xkZXIpOwotICAgICAgICB0aGlzLnNldERlc3RGaWxlKHRhcmdldEZpbGUpOwotCi0gICAgICAgIC8vcnVuIHRoZSB0YXNrCi0gICAgICAgIHRoaXMucGVyZm9ybSgpOwotCi0KLSAgICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLWNvZGVnZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL2NvcmUvU2VydmljZUZpbGVDcmVhdG9yLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2UtY29kZWdlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvY29yZS9TZXJ2aWNlRmlsZUNyZWF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTkwNGMzMS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2UtY29kZWdlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvY29yZS9TZXJ2aWNlRmlsZUNyZWF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudG9vbC5jb3JlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4ud3JpdGVyLkZpbGVXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4ud3JpdGVyLlNlcnZpY2VYTUxXcml0ZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5SZXN1bHQ7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLmRvbS5ET01Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0OwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlRmlsZUNyZWF0b3IgewotICAgIAotICAgIHB1YmxpYyBGaWxlIGNyZWF0ZVNlcnZpY2VGaWxlKFN0cmluZyBzZXJ2aWNlTmFtZSxTdHJpbmcgaW1wbGVtZW50YXRpb25DbGFzc05hbWUsQXJyYXlMaXN0IG1ldGhvZExpc3QpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAKLSAgICAgICAgU3RyaW5nIGN1cnJlbnRVc2VyRGlyID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmRpciIpOwotICAgICAgICBTdHJpbmcgZmlsZU5hbWUgPSAic2VydmljZXMueG1sIjsKLSAgICAgICAgCi0gICAgICAgIEZpbGVXcml0ZXIgc2VydmljZVhtbFdyaXRlciA9IG5ldyBTZXJ2aWNlWE1MV3JpdGVyKGN1cnJlbnRVc2VyRGlyKTsKLSAgICAgICAgd3JpdGVGaWxlKGdldFNlcnZpY2VNb2RlbChzZXJ2aWNlTmFtZSxpbXBsZW1lbnRhdGlvbkNsYXNzTmFtZSxtZXRob2RMaXN0KSxzZXJ2aWNlWG1sV3JpdGVyLGZpbGVOYW1lKTsKLQotICAgICAgICByZXR1cm4gbmV3IEZpbGUoY3VycmVudFVzZXJEaXIgKyBGaWxlLnNlcGFyYXRvciArIGZpbGVOYW1lKTsKLQotCi0KLQotICAgIH0KLQotICAgIHByaXZhdGUgRG9jdW1lbnQgZ2V0U2VydmljZU1vZGVsKFN0cmluZyBzZXJ2aWNlTmFtZSxTdHJpbmcgY2xhc3NOYW1lLEFycmF5TGlzdCBtZXRob2RzKXsKLQotICAgICAgICBEb2N1bWVudEJ1aWxkZXIgYnVpbGRlciA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBidWlsZGVyID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld0RvY3VtZW50QnVpbGRlcigpOwotICAgICAgICB9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgICAgIERvY3VtZW50IGRvYyA9IGJ1aWxkZXIubmV3RG9jdW1lbnQoKTsKLSAgICAgICAgCi0gICAgICAgIEVsZW1lbnQgcm9vdEVsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudCgiaW50ZXJmYWNlIik7Ci0gICAgICAgIHJvb3RFbGVtZW50LnNldEF0dHJpYnV0ZSgiY2xhc3NwYWNrYWdlIiwiIik7Ci0gICAgICAgIHJvb3RFbGVtZW50LnNldEF0dHJpYnV0ZSgibmFtZSIsY2xhc3NOYW1lKTsKLSAgICAgICAgcm9vdEVsZW1lbnQuc2V0QXR0cmlidXRlKCJzZXJ2aWNlbmFtZSIsc2VydmljZU5hbWUpOwotICAgICAgICBFbGVtZW50IG1ldGhvZEVsZW1lbnQgPSBudWxsOwotICAgICAgICBpbnQgc2l6ZSA9IG1ldGhvZHMuc2l6ZSgpOwotICAgICAgICBmb3IoaW50IGk9MDtpPHNpemU7aSsrKXsKLSAgICAgICAgICAgIG1ldGhvZEVsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudCgibWV0aG9kIik7Ci0gICAgICAgICAgICByb290RWxlbWVudC5zZXRBdHRyaWJ1dGUoIm5hbWUiLG1ldGhvZHMuZ2V0KGkpLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgcm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQobWV0aG9kRWxlbWVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgZG9jLmFwcGVuZENoaWxkKHJvb3RFbGVtZW50KTsKLSAgICAgICAgcmV0dXJuIGRvYzsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQSByZXN1c2FibGUgbWV0aG9kIGZvciB0aGUgaW1wbGVtZW50YXRpb24gb2YgaW50ZXJmYWNlIGFuZCBpbXBsZW1lbnRhdGlvbiB3cml0aW5nCi0gICAgICogQHBhcmFtIG1vZGVsCi0gICAgICogQHBhcmFtIHdyaXRlcgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB3cml0ZUZpbGUoRG9jdW1lbnQgbW9kZWwsIEZpbGVXcml0ZXIgd3JpdGVyLFN0cmluZyBmaWxlTmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uLEV4Y2VwdGlvbiB7Ci0gICAgICAgIAotICAgICAgICBTb3VyY2Ugc291cmNlID0gbmV3IERPTVNvdXJjZShtb2RlbCk7Ci0gICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBtZW1vcnlTdHJlYW0gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgIFJlc3VsdCByZXN1bHQgPSBuZXcgU3RyZWFtUmVzdWx0KG1lbW9yeVN0cmVhbSk7Ci0gICAgICAgIFRyYW5zZm9ybWVyIHhmb3JtZXIgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdUcmFuc2Zvcm1lcigpOwotICAgICAgICB4Zm9ybWVyLnRyYW5zZm9ybShzb3VyY2UsIHJlc3VsdCk7Ci0gICAgICAgIAotICAgICAgICAvL1RPRE86IERvZXNuJ3QgcmVhbGx5IG91dHB1dCBzdHVmZiBmcm9tIHRoZSBtZW1vcnlzdHJlYW0gdG8gZmlsZS4uLmhtbS4KLSAgICAgICAgCi0gICAgICAgIHdyaXRlci5sb2FkVGVtcGxhdGUoKTsKLSAgICAgICAgd3JpdGVyLmNyZWF0ZU91dEZpbGUobnVsbCwKLSAgICAgICAgICAgICAgICAgZmlsZU5hbWUpOwotICAgIH0KLSAgICAKLSAgIAotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2UtY29kZWdlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvY29yZS9TcmNDb21waWxlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLWNvZGVnZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL2NvcmUvU3JjQ29tcGlsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNkZjYxYS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2UtY29kZWdlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvY29yZS9TcmNDb21waWxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnRvb2wuY29yZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuSmF2YWM7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBjdXN0b20gY2xhc3MgZm9yIGNvbXBpbGluZyB0aGUgc291cmNlIAotICovCi1wdWJsaWMgY2xhc3MgU3JjQ29tcGlsZXIgZXh0ZW5kcyBKYXZhYyB7Ci0KLSAgICBQcm9qZWN0IHByb2plY3Q7Ci0gICAgcHVibGljIFNyY0NvbXBpbGVyKCkgewotICAgICAgICBwcm9qZWN0ID0gbmV3IFByb2plY3QoKTsKLSAgICAgICAgdGhpcy5zZXRQcm9qZWN0KHByb2plY3QpOwotICAgICAgICBwcm9qZWN0LmluaXQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjb21waWxlU291cmNlKEZpbGUgZGVzdERpciwgU3RyaW5nIGNvbXBpbGFibGVTcmNMb2NhdGlvbil7Ci0KLSAgICAgICAgUGF0aCBwYXRoOwotICAgICAgICBQYXRoIHNyY1BhdGggPSBuZXcgUGF0aChwcm9qZWN0LGNvbXBpbGFibGVTcmNMb2NhdGlvbiArIEZpbGUuc2VwYXJhdG9yICsgInNyYyIpOwotICAgICAgICB0aGlzLnNldFNyY2RpcihzcmNQYXRoKTsKLSAgICAgICAgdGhpcy5zZXREZXN0ZGlyKGRlc3REaXIpOwotICAgICAgICB0aGlzLnNldEluY2x1ZGVzKCIqKi8qLmphdmEsICouamF2YSIpOwotICAgICAgICBGaWxlIGxpYiA9IG5ldyBGaWxlKGNvbXBpbGFibGVTcmNMb2NhdGlvbisgIEZpbGUuc2VwYXJhdG9yICsgImxpYiIpOwotICAgICAgICBGaWxlIGZpbGVzIFtdID0gbmV3IEZpbGVbbGliLmxpc3RGaWxlcygpLmxlbmd0aF07Ci0gICAgICAgIGZpbGVzID0gbGliLmxpc3RGaWxlcygpOwotCi0gICAgICAgIFBhdGggY2xhc3NwYXRoID0gbmV3IFBhdGgocHJvamVjdCk7Ci0gICAgICAgIGZvciAoaW50IGNvdW50ID0wO2NvdW50PGZpbGVzLmxlbmd0aDtjb3VudCsrKXsKLSAgICAgICAgICAgIHBhdGggPSBuZXcgUGF0aChwcm9qZWN0LGZpbGVzW2NvdW50XS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgICAgICAgICBjbGFzc3BhdGguYWRkKHBhdGgpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICB0aGlzLnNldENsYXNzcGF0aChjbGFzc3BhdGgpOwotICAgICAgICB0aGlzLnNldEZvcmsodHJ1ZSk7Ci0gICAgICAgIHRoaXMucGVyZm9ybSgpOwotCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLWNvZGVnZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL3V0aWwvQ29uc3RhbnRzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2UtY29kZWdlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvdXRpbC9Db25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ4Y2VhNi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2UtY29kZWdlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvdXRpbC9Db25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50b29sLnV0aWw7Ci0KLXB1YmxpYyBjbGFzcyBDb25zdGFudHMgewotICAgIHB1YmxpYyBjbGFzcyBVSUNvbnN0YW50c3sKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEFCRUxfV0lEVEg9MTAwOwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSQURJT19CVVRUT05fV0lEVEg9MjAwOwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBURVhUX0JPWF9XSURUSD0yNTA7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJST1dTRV9CVVRUT05fV0lEVEg9MjA7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdFTkVSQUxfQlVUVE9OX1dJRFRIPTgwOwotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdFTkVSQUxfQ09NUF9IRUlHSFQ9MjA7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLWNvZGVnZW4tcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9sb2c0ai5wcm9wZXJ0aWVzIGIvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLWNvZGVnZW4tcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9sb2c0ai5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzk1MGMzLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1jb2RlZ2VuLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvbG9nNGoucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLSMKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotIwotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi0jCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLSMgU2V0IHJvb3QgY2F0ZWdvcnkgcHJpb3JpdHkgdG8gSU5GTyBhbmQgaXRzIG9ubHkgYXBwZW5kZXIgdG8gQ09OU09MRS4KLWxvZzRqLnJvb3RDYXRlZ29yeT1JTkZPLCBDT05TT0xFCi0jbG9nNGoucm9vdENhdGVnb3J5PUlORk8sIENPTlNPTEUsIExPR0ZJTEUKLQotIyBTZXQgdGhlIGVudGVycHJpc2UgbG9nZ2VyIHByaW9yaXR5IHRvIEZBVEFMCi1sb2c0ai5sb2dnZXIub3JnLmFwYWNoZS5heGlzMi5lbnRlcnByaXNlPUZBVEFMCi1sb2c0ai5sb2dnZXIuZGUuaHVuc2lja2VyLmphbG9weS5pbz1GQVRBTAotbG9nNGoubG9nZ2VyLmh0dHBjbGllbnQud2lyZS5oZWFkZXI9RkFUQUwKLWxvZzRqLmxvZ2dlci5vcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudD1GQVRBTAotCi0jIENPTlNPTEUgaXMgc2V0IHRvIGJlIGEgQ29uc29sZUFwcGVuZGVyIHVzaW5nIGEgUGF0dGVybkxheW91dC4KLWxvZzRqLmFwcGVuZGVyLkNPTlNPTEU9b3JnLmFwYWNoZS5sb2c0ai5Db25zb2xlQXBwZW5kZXIKLWxvZzRqLmFwcGVuZGVyLkNPTlNPTEUubGF5b3V0PW9yZy5hcGFjaGUubG9nNGouUGF0dGVybkxheW91dAotbG9nNGouYXBwZW5kZXIuQ09OU09MRS5sYXlvdXQuQ29udmVyc2lvblBhdHRlcm49JWQgJS01cCAlYyAtICVtJW4KLQotIyBMT0dGSUxFIGlzIHNldCB0byBiZSBhIEZpbGUgYXBwZW5kZXIgdXNpbmcgYSBQYXR0ZXJuTGF5b3V0LgotbG9nNGouYXBwZW5kZXIuTE9HRklMRT1vcmcuYXBhY2hlLmxvZzRqLkZpbGVBcHBlbmRlcgotbG9nNGouYXBwZW5kZXIuTE9HRklMRS5GaWxlPWF4aXMyLmxvZwotbG9nNGouYXBwZW5kZXIuTE9HRklMRS5BcHBlbmQ9dHJ1ZQotbG9nNGouYXBwZW5kZXIuTE9HRklMRS5sYXlvdXQ9b3JnLmFwYWNoZS5sb2c0ai5QYXR0ZXJuTGF5b3V0Ci1sb2c0ai5hcHBlbmRlci5MT0dGSUxFLmxheW91dC5Db252ZXJzaW9uUGF0dGVybj0lZCBbJXRdICUtNXAgJWMgJXggLSAlbSVuCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2Utc2VydmljZS1wbHVnaW4vYnVpbGQueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLXNlcnZpY2UtcGx1Z2luL2J1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmNmYjY5Ny4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2Utc2VydmljZS1wbHVnaW4vYnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjgwICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHByb2plY3QgYmFzZWRpcj0iLiIgZGVmYXVsdD0iaGVscCI+Ci0KLSAgICA8IS0tU2V0IHlvdXIgZWxjaXBzZSBob21lIGRpcmVjdG9yeSAgLS0+Ci0gICAgPHByb3BlcnR5IGVudmlyb25tZW50PSJlbnYiIC8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImVjbGlwc2UuaG9tZSIgdmFsdWU9IiR7ZW52LkVDTElQU0VfSE9NRX0iPjwvcHJvcGVydHk+Ci0JCi0gICAgPCEtLSBwcm9wZXJ0aWVzIGZpbGUgdG8gbG9hZCB0aGUgdmVyc2lvbnMgb2YgZGVwZW5kZW5jaWVzIC0tPgotICAgIDxwcm9wZXJ0eSBmaWxlPSIuLi8uLi8uLi9ldGMvcHJvamVjdC5wcm9wZXJ0aWVzIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9InNlcnZpY2UucGx1Z2luLnZlcnNpb24iIHZhbHVlPSJBeGlzMl9TZXJ2aWNlX0FyY2hpdmVyXyR7dmVyc2lvbl9udW1iZXJ9Ij48L3Byb3BlcnR5PgotICAgIDxwcm9wZXJ0eSBuYW1lPSJzZXJ2aWNlLnBsdWdpbi56aXAubmFtZSIgdmFsdWU9ImF4aXMyLWVjbGlwc2Utc2VydmljZS1hcmNoaXZlci13aXphcmQuemlwIj48L3Byb3BlcnR5PgotCQotICAgIDxwcm9wZXJ0eSBuYW1lPSJzcmMiIHZhbHVlPSIuL3NyYyI+PC9wcm9wZXJ0eT4KLSAgICA8cHJvcGVydHkgbmFtZT0ic2VydmljZS5zcmMuZGlyIiB2YWx1ZT0iLi4vYXhpczItZWNsaXBzZS1zZXJ2aWNlLXBsdWdpbi9zcmMvbWFpbi9qYXZhIj48L3Byb3BlcnR5PgotICAgIDxwcm9wZXJ0eSBuYW1lPSJvdXRwdXQiIHZhbHVlPSIuLi90YXJnZXQvZWNsaXBzZV9wbHVnaW5zIj48L3Byb3BlcnR5PgotICAgIDxwcm9wZXJ0eSBuYW1lPSJvdXRwdXQudGFyZ2V0IiB2YWx1ZT0iJHtvdXRwdXR9L3JlbGVhc2UiPjwvcHJvcGVydHk+Ci0gICAgPHByb3BlcnR5IG5hbWU9InNlcnZpY2Uub3V0cHV0LmRpciIgdmFsdWU9IiR7b3V0cHV0fS9zZXJ2aWNlLWFyY2hpdmVyIj48L3Byb3BlcnR5PgotICAgIDxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4ub3V0cHV0LmRpciIgdmFsdWU9IiR7b3V0cHV0fS9wbHVnaW4iPjwvcHJvcGVydHk+Ci0gICAgPHByb3BlcnR5IG5hbWU9InNlcnZpY2UucGx1Z2luLm91dHB1dC5kaXIiIHZhbHVlPSIke3BsdWdpbi5vdXRwdXQuZGlyfS8ke3NlcnZpY2UucGx1Z2luLnZlcnNpb259Ij48L3Byb3BlcnR5PgotCi0gICAgPHByb3BlcnR5IG5hbWU9InNvdXJjZS5kaXIubmFtZSIgdmFsdWU9InNyYyI+PC9wcm9wZXJ0eT4KLSAgICA8cHJvcGVydHkgbmFtZT0ibGliLmRpci5uYW1lIiB2YWx1ZT0ibGliIj48L3Byb3BlcnR5PgotICAgIDxwcm9wZXJ0eSBuYW1lPSJiaW4uZGlyLm5hbWUiIHZhbHVlPSJiaW4iPjwvcHJvcGVydHk+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImhlbHAuZGlyLm5hbWUiIHZhbHVlPSJoZWxwIj48L3Byb3BlcnR5PgotICAgIDxwcm9wZXJ0eSBuYW1lPSJpY29ucy5kaXIubmFtZSIgdmFsdWU9Imljb25zIj48L3Byb3BlcnR5PgotCi0gICAgPHByb3BlcnR5IG5hbWU9InBsdWdpbi5wcm9qZWN0LmZpbGUubmFtZSIgdmFsdWU9Ii5wcm9qZWN0Ij48L3Byb3BlcnR5PgotICAgIDxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4uY2xhc3NwYXRoLmZpbGUubmFtZSIgdmFsdWU9Ii5jbGFzc3BhdGgiPjwvcHJvcGVydHk+Ci0gICAgPHByb3BlcnR5IG5hbWU9InBsdWdpbi5oZWxwLmZpbGUubmFtZSIgdmFsdWU9ImhlbHBfdG9jLnhtbCI+PC9wcm9wZXJ0eT4KLSAgICA8cHJvcGVydHkgbmFtZT0idG9vbF9kb2NzX3ZlcnNpb24iIHZhbHVlPSIxXzQiPjwvcHJvcGVydHk+Ci0KLSAgICA8cHJvcGVydHkgbmFtZT0ic2VydmljZS5yZXNvdXJjZS5kaXIiIHZhbHVlPSIuLi9jb25mL3NlcnZpY2UiPjwvcHJvcGVydHk+Ci0gICAgPHByb3BlcnR5IG5hbWU9InNlcnZpY2UuaGVscC5yZXNvdXJjZS5maWxlIiB2YWx1ZT0iLi4vLi4vLi4vbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLyR7dG9vbF9kb2NzX3ZlcnNpb259L2VjbGlwc2Uvc2VydmljZWFyY2hpdmVyLXBsdWdpbi5odG1sIj48L3Byb3BlcnR5PgotICAgIDxwcm9wZXJ0eSBuYW1lPSJzZXJ2aWNlLmhlbHAuaW1hZ2VzLmRpciIgdmFsdWU9Ii4uLy4uLy4uL21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8ke3Rvb2xfZG9jc192ZXJzaW9ufS9lY2xpcHNlL2ltYWdlcyI+PC9wcm9wZXJ0eT4KLSAgICA8cHJvcGVydHkgbmFtZT0iYXhpczIubGliLmRpciIgdmFsdWU9Ii4uLy4uLy4uL3RhcmdldC9saWIiPjwvcHJvcGVydHk+Ci0KLSAgICA8IS0tRmlsdGVyIHRvY2tlbnMgZm9yIHRoZSBjb3B5IGNvbW1hbmQgdG8gZmlsdGVyIHRoZSB2ZXJzaW9ucyBvZiBleHRlcm5hbCBkZXBlbmRlbmNpZXMgLS0+Ci0gICAgPGZpbHRlciB0b2tlbj0idmVyc2lvbl9udW1iZXIiIHZhbHVlPSIke3ZlcnNpb25fbnVtYmVyfSIgLz4KLSAgICA8ZmlsdGVyIHRva2VuPSJhbnQudmVyc2lvbiIgdmFsdWU9IiR7YW50LnZlcnNpb259IiAvPgotICAgIDxmaWx0ZXIgdG9rZW49ImNvbW1vbnMubG9nZ2luZy52ZXJzaW9uIiB2YWx1ZT0iJHtjb21tb25zLmxvZ2dpbmcudmVyc2lvbn0iIC8+Ci0gICAgPGZpbHRlciB0b2tlbj0ibG9nNGoudmVyc2lvbiIgdmFsdWU9IiR7bG9nNGoudmVyc2lvbn0iIC8+Ci0KLQotICAgICA8IS0tU2VydmljZSB3aXphcmQgbGlicmFyaWVzIC0tPgotICAgICA8ZmlsZXNldCBpZD0ic2VydmljZS5saWJzIiBkaXI9IiR7YXhpczIubGliLmRpcn0iPgotCSAgICAgCTxpbmNsdWRlIG5hbWU9ImFudC0ke2FudC52ZXJzaW9ufS5qYXIiIC8+Ci0JCTxpbmNsdWRlIG5hbWU9ImxvZzRqLSR7bG9nNGoudmVyc2lvbn0uamFyIiAvPgotCQk8aW5jbHVkZSBuYW1lPSJjb21tb25zLWxvZ2dpbmctJHtjb21tb25zLmxvZ2dpbmcudmVyc2lvbn0uamFyIiAvPgotCSAgICAJPGluY2x1ZGUgbmFtZT0iYXhpczItJHt2ZXJzaW9uX251bWJlcn0uamFyIiAvPgotICAgICA8L2ZpbGVzZXQ+Ci0JCi0JCi0gICAgPCEtLSBEZWZhdWx0IHRhcmdldCB0byBnZW5lcmF0ZSBhbGwgdGhlIHNlcnZpY2VzIC0tPgotICAgIDx0YXJnZXQgbmFtZT0iYWxsIj4KLSAgICAJPGFudGNhbGwgdGFyZ2V0PSJjbGVhbiIgLz4KLSAgICAgICAgPGFudGNhbGwgdGFyZ2V0PSJnZW5lcmF0ZS1zZXJ2aWNlLXBsdWdpbiIvPgotICAgICAgICA8YW50Y2FsbCB0YXJnZXQ9InJlbGVhc2UtcGx1Z2luIi8+Ci0gICAgPC90YXJnZXQ+Ci0KLSAgICA8IS0tIGluaXQtLT4KLSAgICA8dGFyZ2V0IG5hbWU9ImluaXQiPgotICAgICAgICA8bWtkaXIgZGlyPSIke291dHB1dH0iPjwvbWtkaXI+Ci0gICAgICAgIDxta2RpciBkaXI9IiR7c2VydmljZS5vdXRwdXQuZGlyfSI+PC9ta2Rpcj4KLSAgICA8L3RhcmdldD4KLQotCi0gIDwhLS0gU2VydmljZSBBcmNoaXZlciBQcm9qZWN0IC0tPgotCi0gICAgICAgICAgPCEtLSAgR2VuZXJldGUgdGhlIFNlcnZpY2UgUHJvamVjdCB0aGF0IGNhbiBiZSBpbXBvcnRlZCBhcyBhIHJlYWR5bWFkZSBlY2xpcHNlIHByb2plY3QgaW4gdG8gd29ya3NwYWNlIC0tPgotICAgICAgICAgICAgPHRhcmdldCBuYW1lPSJnZW5lcmF0ZS1zZXJ2aWNlLXByb2plY3QiIGRlcGVuZHM9ImluaXQiPgotICAgICAgICAgICAgICAgIDwhLS0gZGVsZXRlIHRoZSBleGlzdGluZyBmaWxlcyAtLT4KLSAgICAgICAgICAgICAgICA8ZGVsZXRlIGZpbGU9InBsdWdpbi54bWwiIC8+Ci0gICAgICAgICAgICAgICAgPGRlbGV0ZSBmaWxlPSJidWlsZC5wcm9wZXJ0aWVzIiAvPgotICAgICAgICAgICAgICAgIDxkZWxldGUgZmlsZT0iLnByb2plY3QiIC8+Ci0JCTxkZWxldGUgZmlsZT0iLmNsYXNzcGF0aCIgLz4KLSAgICAgICAgICAgICAgICA8ZGVsZXRlIGRpcj0iaWNvbnMiIC8+Ci0gICAgICAgICAgICAgICAgPGRlbGV0ZSBkaXI9ImhlbHAiIC8+Ci0gICAgICAgICAgICAgICAgPGRlbGV0ZSBkaXI9ImxpYiIgLz4KLSAgICAgICAgICAgICAgICA8IS0tIENvcHkgd2l0aCB0aGUgZmlsdGVyaW5nIG9uLS0+Ci0gICAgICAgICAgICAgICAgPGNvcHkgdG9kaXI9Ii4iIGZpbHRlcmluZz0ib24iID4KLSAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke3NlcnZpY2UucmVzb3VyY2UuZGlyfSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJwbHVnaW4ueG1sIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iYnVpbGQucHJvcGVydGllcyIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IiR7cGx1Z2luLmNsYXNzcGF0aC5maWxlLm5hbWV9IiAvPgotICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICAgICAgPC9jb3B5PgotCi0gICAgICAgICAgICAgICAgPCEtLSBjb3B5IHRoZSBsaWJzIC0tPgotICAgICAgICAgICAgICAgIDxta2RpciBkaXI9IiR7bGliLmRpci5uYW1lfSIgLz4KLSAgICAgICAgICAgICAgICA8Y29weSB0b2Rpcj0iJHtsaWIuZGlyLm5hbWV9Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IHJlZmlkPSJzZXJ2aWNlLmxpYnMiIC8+Ci0gICAgICAgICAgICAgICAgPC9jb3B5PgotICAgICAgICAgICAgICAgIDwhLS0gY29weSB0aGUgIGljb25zLS0+Ci0gICAgICAgICAgICAgICAgPG1rZGlyIGRpcj0iJHtpY29ucy5kaXIubmFtZX0iIC8+Ci0gICAgICAgICAgICAgICAgPGNvcHkgdG9kaXI9IiR7aWNvbnMuZGlyLm5hbWV9Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtzZXJ2aWNlLnJlc291cmNlLmRpcn0vJHtpY29ucy5kaXIubmFtZX0iIC8+Ci0gICAgICAgICAgICAgICAgPC9jb3B5PgotICAgICAgICAgICAgICAgIDwhLS0gY29weSB0aGUgb3RoZXIgcHJvamVjdCBmaWxlcy0tPgotICAgICAgICAgICAgICAgIDxjb3B5IHRvZGlyPSIuIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGZpbGU9IiR7c2VydmljZS5yZXNvdXJjZS5kaXJ9LyR7cGx1Z2luLnByb2plY3QuZmlsZS5uYW1lfSIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGZpbGU9IiR7c2VydmljZS5yZXNvdXJjZS5kaXJ9LyR7cGx1Z2luLmhlbHAuZmlsZS5uYW1lfSIgLz4KLSAgICAgICAgICAgICAgICA8L2NvcHk+Ci0KLSAgICAgICAgICAgIDwvdGFyZ2V0PgotCi0JPCEtLSBnZW5lcmF0ZSB0aGUgc2VydmljZSBhcmNoaXZlciBwcm9qZWN0IC0tPgotCTx0YXJnZXQgbmFtZT0iY3JlYXRlLXNlcnZpY2UtcHJvamVjdCIgZGVwZW5kcz0iaW5pdCI+Ci0JICAgICAgICA8IS0tIGNvcHkgdGhlIHNvdXJjZSAtLT4KLQkgICAgICAgIDxjb3B5IHRvZGlyPSIke3NlcnZpY2Uub3V0cHV0LmRpcn0vJHtzb3VyY2UuZGlyLm5hbWV9Ij4KLQkgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7c2VydmljZS5zcmMuZGlyfS8iIGV4Y2x1ZGVzPSIqKi9jb2RlZ2VuLyoqLyouamF2YSIvPgotCSAgICAgICAgPC9jb3B5PgotCQkJPCEtLSBDb3B5IHRoZSBvdGhlciBzdHVmZiAtLT4KLQkgICAgICAgIDxjb3B5IHRvZGlyPSIke3NlcnZpY2Uub3V0cHV0LmRpcn0iIGZpbHRlcmluZz0ib24iPgotCSAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtzZXJ2aWNlLnJlc291cmNlLmRpcn0iIGV4Y2x1ZGVzPSIqKi8qLmdpZiI+PC9maWxlc2V0PgotCSAgICAgICAgPC9jb3B5PgotCQkgICAgPCEtLSBDb3B5IHRoZSBpY29ucyBmb2xkZXIgLS0+Ci0gICAgICAgICAgICA8Y29weSB0b2Rpcj0iJHtzZXJ2aWNlLm91dHB1dC5kaXJ9Ij4KLSAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke3NlcnZpY2UucmVzb3VyY2UuZGlyfSIgaW5jbHVkZXM9IioqLyouZ2lmIiA+PC9maWxlc2V0PgotICAgICAgICAgICAgPC9jb3B5PgotCQkgICAgPCEtLSBjcmVhdGUgYmluIGRpcmVjdG9yeSAtLT4KLQkJICAgIDxta2RpciBkaXI9IiR7c2VydmljZS5vdXRwdXQuZGlyfS8ke2Jpbi5kaXIubmFtZX0iPjwvbWtkaXI+Ci0JCSAgICA8IS0tIGNyZWF0ZSB0aGUgaGVscCBkaXJlY3RvcnkgLS0+Ci0JICAgICAgICAJPG1rZGlyIGRpcj0iJHtzZXJ2aWNlLm91dHB1dC5kaXJ9LyR7aGVscC5kaXIubmFtZX0iPjwvbWtkaXI+Ci0JCSAgICA8IS0tIGNvcHkgdGhlIGhlbHAgZGlyZWN0b3J5IC0tPgotCSAgICAgICAgPGNvcHkgdG9kaXI9IiR7c2VydmljZS5vdXRwdXQuZGlyfS8ke2hlbHAuZGlyLm5hbWV9Ij4KLQkgICAgICAgICAgICA8ZmlsZXNldCBmaWxlPSIke3NlcnZpY2UuaGVscC5yZXNvdXJjZS5maWxlfSI+PC9maWxlc2V0PgotCSAgICAgICAgPC9jb3B5PgotCSAgICAgICAgPCEtLSBjb3B5IHRoZSBsaWJyYXJpZXMgdG8gdGhlIHBsdWdpbi0tPgotCSAgICAgICAgPGNvcHkgdG9kaXI9IiR7c2VydmljZS5vdXRwdXQuZGlyfS8ke2xpYi5kaXIubmFtZX0iPgotCSAgICAgICAgICAgIDxmaWxlc2V0IHJlZmlkPSJzZXJ2aWNlLmxpYnMiIC8+Ci0JICAgICAgICA8L2NvcHk+Ci0JCTxhdmFpbGFibGUgcHJvcGVydHk9ImltYWdlcy5kaXIiIGZpbGU9IiR7c2VydmljZS5oZWxwLmltYWdlcy5kaXJ9IiB0eXBlPSJkaXIiIHZhbHVlPSIke3NlcnZpY2UuaGVscC5pbWFnZXMuZGlyfSIvPgotCSAgICAgICAgIDxjb3B5IHRvZGlyPSIke3NlcnZpY2Uub3V0cHV0LmRpcn0vJHtoZWxwLmRpci5uYW1lfS9pbWFnZXMiPgotCSAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7aW1hZ2VzLmRpcn0iLz4KLQkgICAgICAgICA8L2NvcHk+IAotCi0JICAgIDwvdGFyZ2V0PgotCi0gICAgPCEtLUdlbmVyYXRlIHRoZSBzZXJ2aWNlIHBsdWdpbiAtLT4JCi0gICAgPHRhcmdldCBuYW1lPSJnZW5lcmF0ZS1zZXJ2aWNlLXBsdWdpbiIgZGVwZW5kcz0iaW5pdCxjcmVhdGUtc2VydmljZS1wcm9qZWN0Ij4KLSAgICAgICAgPG1rZGlyIGRpcj0iJHtzZXJ2aWNlLnBsdWdpbi5vdXRwdXQuZGlyfSI+PC9ta2Rpcj4KLSAgICAgICAgPCEtLSBjb3B5IHRoZSBwbHVnaW4ueG1sLGJ1aWxkLnByb3BlcnRpZXMgYW5kIGhlbHBfdG9jLnhtbCAtLT4KLSAgICAgICAgPGNvcHkgdG9kaXI9IiR7c2VydmljZS5wbHVnaW4ub3V0cHV0LmRpcn0iPgotICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke3NlcnZpY2Uub3V0cHV0LmRpcn0iID4KLQkJPGluY2x1ZGUgbmFtZT0icGx1Z2luLnhtbCIgLz4KLQkJPGluY2x1ZGUgbmFtZT0iaGVscF90b2MueG1sIiAvPgotCQk8aW5jbHVkZSBuYW1lPSJidWlsZC5wcm9wZXJ0aWVzIiAvPgotIAkJPGluY2x1ZGUgbmFtZT0iKiovU2VydmljZVJlc291cmNlcy5wcm9wZXJ0aWVzIiAvPgotCSAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgIDwvY29weT4KLSAgICAgICAgPCEtLSBjb3B5IHRoZSBoZWxwIGRpcmVjdG9yeS0tPgotICAgICAgICA8Y29weSB0b2Rpcj0iJHtzZXJ2aWNlLnBsdWdpbi5vdXRwdXQuZGlyfS9oZWxwIj4KLSAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtzZXJ2aWNlLm91dHB1dC5kaXJ9L2hlbHAiIC8+Ci0gICAgICAgIDwvY29weT4KLSAgICAgICAgPCEtLSBjb3B5IHRoZSBpY29ucyBkaXJlY3RvcnktLT4KLSAgICAgICAgPGNvcHkgdG9kaXI9IiR7c2VydmljZS5wbHVnaW4ub3V0cHV0LmRpcn0vaWNvbnMiPgotICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke3NlcnZpY2Uub3V0cHV0LmRpcn0vaWNvbnMiIC8+Ci0gICAgICAgIDwvY29weT4KLSAgICAgICAgPCEtLSBjb3B5IHRoZSBsaWJyYXJpZXMgdG8gdGhlIHBsdWdpbi0tPgotICAgICAgICA8Y29weSB0b2Rpcj0iJHtzZXJ2aWNlLnBsdWdpbi5vdXRwdXQuZGlyfS8ke2xpYi5kaXIubmFtZX0iPgotICAgICAgICAgICAgPGZpbGVzZXQgcmVmaWQ9InNlcnZpY2UubGlicyIgLz4KLSAgICAgICAgPC9jb3B5PgotICAgICAgICA8IS0tIGNvcHkgdGhlIHNvdXJjZXMgdG8gdGhlIHBsdWdpbi0tPgotICAgICAgICA8Y29weSB0b2Rpcj0iJHtzZXJ2aWNlLnBsdWdpbi5vdXRwdXQuZGlyfS8ke3NvdXJjZS5kaXIubmFtZX0iPgotCSAgICA8ZmlsZXNldCBkaXI9IiR7c2VydmljZS5vdXRwdXQuZGlyfS8ke3NvdXJjZS5kaXIubmFtZX0iPgotCQk8aW5jbHVkZSBuYW1lPSJvcmcvKioiIC8+Ci0JICAgIDwvZmlsZXNldD4KLSAgICAgICAgPC9jb3B5PgotCi0JPCEtLSBjb21waWxlIHRoZSBwbHVnaW4gamF2YSBmaWxlcyAtLT4KLQk8ZGVsZXRlIGRpcj0iJHtzZXJ2aWNlLnBsdWdpbi5vdXRwdXQuZGlyfS9jbGFzcyI+PC9kZWxldGU+Ci0gCTxta2RpciBkaXI9IiR7c2VydmljZS5wbHVnaW4ub3V0cHV0LmRpcn0vY2xhc3MiPjwvbWtkaXI+Ci0JPGphdmFjIHNyY2Rpcj0iJHtzZXJ2aWNlLm91dHB1dC5kaXJ9LyR7c291cmNlLmRpci5uYW1lfSIgCi0gICAgICAgICAgICAgICBkZXN0ZGlyPSIke3NlcnZpY2UucGx1Z2luLm91dHB1dC5kaXJ9L2NsYXNzIiAKLSAgICAgICAgICAgICAgIGluY2x1ZGVzPSJvcmcvYXBhY2hlL2F4aXMyLyoqIj4KLQkJPGNsYXNzcGF0aD4KLSAgICAgCQkJPGZpbGVzZXQgZGlyPSIke3NlcnZpY2UucGx1Z2luLm91dHB1dC5kaXJ9L2xpYiI+Ci0gICAgICAgIAkJCTxpbmNsdWRlIG5hbWU9IioqLyouamFyIiAvPgotICAgICAJCQk8L2ZpbGVzZXQ+Ci0gICAgICAgCQkJIDxmaWxlc2V0IGRpcj0iJHtlY2xpcHNlLmhvbWV9L3BsdWdpbnMvIj4KLQkJCQk8aW5jbHVkZSBuYW1lPSIqKi8qLmphciIgLz4KLSAgICAgCQkJPC9maWxlc2V0PgotICAgIAkJPC9jbGFzc3BhdGg+CQotCTwvamF2YWM+Ci0JCi0JPCEtLU1ha2UgYXZhaWxhYmxlIHRoZSByZXNvdXJjZXMgZm9yIHRoZSBwbHVnaW4gLS0+Ci0gICAgICAgICAgPGNvcHkgdG9kaXI9IiR7c2VydmljZS5wbHVnaW4ub3V0cHV0LmRpcn0vY2xhc3MiPgotICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke3NlcnZpY2Uub3V0cHV0LmRpcn0vJHtzb3VyY2UuZGlyLm5hbWV9IiA+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovU2VydmljZVJlc291cmNlcy5wcm9wZXJ0aWVzIiAvPgotCQk8ZXhjbHVkZSBuYW1lPSIqKi8qLmNsYXNzIiAvPgotICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICAgIDwvY29weT4KLQotICAgICAgICAgIDwhLS0gY3JlYXRlIHRoZSBBeGlzMl9TZXJ2aWNlX0FyY2hpdmVyLmphciAtLT4KLQkgIDxqYXIgZGVzdGZpbGU9IiR7c2VydmljZS5wbHVnaW4ub3V0cHV0LmRpcn0vQXhpc19TZXJ2aWNlX0FyY2hpdmVyLmphciIgCi0JICAgICAgIGJhc2VkaXI9IiR7c2VydmljZS5wbHVnaW4ub3V0cHV0LmRpcn0vY2xhc3MiCi0gICAgICAgICAgIGluY2x1ZGVzPSJvcmcvYXBhY2hlLyoqIgotICAgICAgICAgIC8+Ci0JPGRlbGV0ZSBkaXI9IiR7c2VydmljZS5wbHVnaW4ub3V0cHV0LmRpcn0vc3JjIj48L2RlbGV0ZT4KLQk8ZGVsZXRlIGRpcj0iJHtzZXJ2aWNlLnBsdWdpbi5vdXRwdXQuZGlyfS9jbGFzcyI+PC9kZWxldGU+Ci0gICAgPC90YXJnZXQ+Ci0KLSAgICA8IS0tSW5zdGFsbCB0aGUgc2VydmljZSBwbHVnaW4gLS0+Ci0gICAgPHRhcmdldCBuYW1lPSJpbnN0YWxsLXNlcnZpY2UtcGx1Z2luIiBkZXBlbmRzPSJpbml0LGdlbmVyYXRlLXNlcnZpY2UtcHJvamVjdCxnZW5lcmF0ZS1zZXJ2aWNlLXBsdWdpbiI+Ci0gICAgICAgIDxkZWxldGUgZGlyPSIke2VjbGlwc2UuaG9tZX0vcGx1Z2lucy8ke3NlcnZpY2UucGx1Z2luLnZlcnNpb259Ij48L2RlbGV0ZT4KLSAgICAgICAgICA8Y29weSB0b2Rpcj0iJHtlY2xpcHNlLmhvbWV9L3BsdWdpbnMiPgotICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtwbHVnaW4ub3V0cHV0LmRpcn0iLz4KLSAgICAgICAgICA8L2NvcHk+Ci0gICAgPC90YXJnZXQ+Ci0KLSAgICA8IS0tUmVsZXNlIHRoZSBwbHVnaW5zICh0aGlzIHdpbGwgaW5zdGFsbCB0aGUgcGx1Z2lucyBhbmQgYnVpbGQgdGhlIHppcCB2ZXJzaW9uKS0tPgotICAgIDx0YXJnZXQgbmFtZT0icmVsZWFzZS1wbHVnaW4iPgotICAgIAk8bWtkaXIgZGlyPSIke291dHB1dC50YXJnZXR9IiAvPgotICAgIAk8bWtkaXIgZGlyPSIke291dHB1dC50YXJnZXR9L3NlcnZpY2UvJHtzZXJ2aWNlLnBsdWdpbi52ZXJzaW9ufSIgLz4KLSAgICAJCi0gICAgICAgIDxhbnRjYWxsIHRhcmdldD0iZ2VuZXJhdGUtc2VydmljZS1wbHVnaW4iLz4KLSAgICAJCi0gICAgICAgIDxjb3B5IHRvZGlyPSIke291dHB1dC50YXJnZXR9L3NlcnZpY2UvJHtzZXJ2aWNlLnBsdWdpbi52ZXJzaW9ufSI+Ci0gICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtwbHVnaW4ub3V0cHV0LmRpcn0vJHtzZXJ2aWNlLnBsdWdpbi52ZXJzaW9ufSIvPgotICAgICAgICA8L2NvcHk+Ci0gICAgCQotICAgIAk8IS0tWmlwIHRoZSBlY2xpcHNlIHBsdWdpbnMgdG8gZWNsaXBzZV9wbHVnaW5zL3RhcmdldCAtLT4KLSAgICAJPHppcCBkZXN0ZmlsZT0iJHtvdXRwdXQudGFyZ2V0fS8ke3NlcnZpY2UucGx1Z2luLnppcC5uYW1lfSIKLSAgICAJICAgICAgIGJhc2VkaXI9IiR7b3V0cHV0LnRhcmdldH0vc2VydmljZSIKLSAgICAJICAgICAgIHVwZGF0ZT0idHJ1ZSIKLSAgICAJLz4KLSAgICAJPGRlbGV0ZSBkaXI9IiR7b3V0cHV0LnRhcmdldH0vc2VydmljZSIgLz4KLSAgICA8L3RhcmdldD4KLQotCi0gICAgPCEtLSBDbGVhbiB0aGUgZGlyZWN0b3J5IC0tPgotICAgIDx0YXJnZXQgbmFtZT0iY2xlYW4iPgotICAgICAgICA8ZGVsZXRlIGRpcj0iJHtzZXJ2aWNlLm91dHB1dC5kaXJ9Ij48L2RlbGV0ZT4KLSAgICAgICAgPGRlbGV0ZSBkaXI9IiR7cGx1Z2luLm91dHB1dC5kaXJ9LyR7c2VydmljZS5wbHVnaW4udmVyc2lvbn0iPjwvZGVsZXRlPgotICAgICAgICA8ZGVsZXRlIGZpbGU9IiR7b3V0cHV0LnRhcmdldH0vJHtzZXJ2aWNlLmZpbGUuemlwLm5hbWV9Ij48L2RlbGV0ZT4KLSAgICA8L3RhcmdldD4KLQotCTwhLS0gaGVscCwgbGlzdCBvZiB0YXJnZXRzIC0tPgotICAgIDx0YXJnZXQgbmFtZT0iaGVscCI+Ci0JICAgIDxlY2hvIG1lc3NhZ2U9IioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiIC8+Ci0JICAgIDxlY2hvIG1lc3NhZ2U9IioqICAgICAgICAgICAgICBFY2xpcHNlIFNlcnZpY2UgQXJjaGl2ZXIgUGx1Z2luIEJ1aWxkICAgICAgICAgICAgICAgICAgICAgKioiIC8+Ci0JICAgIDxlY2hvIG1lc3NhZ2U9IioqICBwcmUtcmVxdWlzaXQgICAgICAgICAgICA6IGVudi5FQ0xJUFNFX0hPTUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioiIC8+Ci0JICAgIDxlY2hvIG1lc3NhZ2U9IioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioiIC8+Ci0JICAgIDxlY2hvIG1lc3NhZ2U9IioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioiIC8+Ci0JICAgIDxlY2hvIG1lc3NhZ2U9IioqICBidWlsZCBlY2xpcHNlIHByb2plY3QgICA6IGdlbmVyYXRlLXNlcnZpY2UtcHJvamVjdCAgICAgICAgICAgICAgICAgICAgKioiIC8+Ci0JICAgIDxlY2hvIG1lc3NhZ2U9IioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioiIC8+Ci0JICAgIDxlY2hvIG1lc3NhZ2U9IioqICBidWlsZCBlY2xpcHNlIHBsdWdpbiAgICA6IGdlbmVyYXRlLXNlcnZpY2UtcGx1Z2luICAgICAgICAgICAgICAgICAgICAgKioiIC8+Ci0JICAgIDxlY2hvIG1lc3NhZ2U9IioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioiIC8+Ci0JICAgIDxlY2hvIG1lc3NhZ2U9IioqICBpbnN0YWxsIHBsdWdpbiAgICAgICAgICA6IGluc3RhbGwtc2VydmljZS1wbHVnaW4gICAgICAgICAgICAgICAgICAgICAgKioiIC8+Ci0JICAgIDxlY2hvIG1lc3NhZ2U9IioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioiIC8+Ci0JICAgIDxlY2hvIG1lc3NhZ2U9IioqICByZWxlYXNlIGVjbGlwc2UgcGx1Z2luICA6IHJlbGVhc2UtcGx1Z2luICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioiIC8+Ci0JICAgIDxlY2hvIG1lc3NhZ2U9IioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioiIC8+Ci0JICAgIDxlY2hvIG1lc3NhZ2U9IioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioiIC8+Ci0JICAgIDxlY2hvIG1lc3NhZ2U9IioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiIC8+Ci0KLSAgICA8L3RhcmdldD4KLQkKLQkKLTwvcHJvamVjdD4KLQotCi0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1zZXJ2aWNlLXBsdWdpbi9lY2xpcHNlLXNlcnZpY2UtcGx1Z2luLWFzc2VtYmx5LnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1zZXJ2aWNlLXBsdWdpbi9lY2xpcHNlLXNlcnZpY2UtcGx1Z2luLWFzc2VtYmx5LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYwYTE4ZC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2Utc2VydmljZS1wbHVnaW4vZWNsaXBzZS1zZXJ2aWNlLXBsdWdpbi1hc3NlbWJseS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxhc3NlbWJseT4KLSAgICA8aWQ+YXhpczItZWNsaXBzZS1zZXJ2aWNlLXBsdWdpbjwvaWQ+Ci0gICAgPGluY2x1ZGVCYXNlRGlyZWN0b3J5PmZhbHNlPC9pbmNsdWRlQmFzZURpcmVjdG9yeT4KLSAgICA8Zm9ybWF0cz4KLSAgICAgICAgPGZvcm1hdD56aXA8L2Zvcm1hdD4KLSAgICA8L2Zvcm1hdHM+Ci0gICAgPGZpbGVTZXRzPgotICAgICAgICA8ZmlsZVNldD4KLSAgICAgICAgICAgIDxkaXJlY3Rvcnk+Li90YXJnZXQvY2xhc3NlczwvZGlyZWN0b3J5PgotICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT5jbGFzc2VzPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgIAk8L2ZpbGVTZXQ+Ci0gICAgPC9maWxlU2V0cz4KLQk8ZGVwZW5kZW5jeVNldHM+Ci0JPGRlcGVuZGVuY3lTZXQ+Ci0JCTxvdXRwdXRGaWxlTmFtZU1hcHBpbmc+JHthcnRpZmFjdElkfS0ke2NvbW1vbnMubG9nZ2luZy52ZXJzaW9ufS4ke2V4dGVuc2lvbn08L291dHB1dEZpbGVOYW1lTWFwcGluZz4KLQkgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+bGliPC9vdXRwdXREaXJlY3Rvcnk+Ci0JICAgICAgICA8aW5jbHVkZXM+Ci0JICAgICAgICAJPGluY2x1ZGU+Y29tbW9ucy1sb2dnaW5nOmNvbW1vbnMtbG9nZ2luZzpqYXI8L2luY2x1ZGU+Ci0JICAgICAgICA8L2luY2x1ZGVzPgotCTwvZGVwZW5kZW5jeVNldD4gCi0JPGRlcGVuZGVuY3lTZXQ+Ci0JCTxvdXRwdXRGaWxlTmFtZU1hcHBpbmc+JHthcnRpZmFjdElkfS0ke3ZlcnNpb259LiR7ZXh0ZW5zaW9ufTwvb3V0cHV0RmlsZU5hbWVNYXBwaW5nPgotCSAgICAgICAgPG91dHB1dERpcmVjdG9yeT5saWI8L291dHB1dERpcmVjdG9yeT4KLQkgICAgICAgIDxpbmNsdWRlcz4KLQkgICAgICAgIAk8aW5jbHVkZT5vcmcuYXBhY2hlLmF4aXMyOmF4aXMyOmphcjwvaW5jbHVkZT4KLQkgICAgICAgIDwvaW5jbHVkZXM+Ci0JPC9kZXBlbmRlbmN5U2V0PiAKLQk8ZGVwZW5kZW5jeVNldD4KLQkJPG91dHB1dEZpbGVOYW1lTWFwcGluZz4ke2FydGlmYWN0SWR9LSR7bG9nNGoudmVyc2lvbn0uJHtleHRlbnNpb259PC9vdXRwdXRGaWxlTmFtZU1hcHBpbmc+Ci0JICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PmxpYjwvb3V0cHV0RGlyZWN0b3J5PgotCSAgICAgICAgPGluY2x1ZGVzPgotCSAgICAgICAgCTxpbmNsdWRlPmxvZzRqOmxvZzRqOmphcjwvaW5jbHVkZT4KLQkgICAgICAgIDwvaW5jbHVkZXM+Ci0JPC9kZXBlbmRlbmN5U2V0PiAKLQk8ZGVwZW5kZW5jeVNldD4KLQkJPG91dHB1dEZpbGVOYW1lTWFwcGluZz4ke2FydGlmYWN0SWR9LSR7YW50LnZlcnNpb259LiR7ZXh0ZW5zaW9ufTwvb3V0cHV0RmlsZU5hbWVNYXBwaW5nPgotCSAgICAgICAgPG91dHB1dERpcmVjdG9yeT5saWI8L291dHB1dERpcmVjdG9yeT4KLQkgICAgICAgIDxpbmNsdWRlcz4KLQkgICAgICAgIAk8aW5jbHVkZT5vcmcuYXBhY2hlLmFudDphbnQ6amFyPC9pbmNsdWRlPgotCSAgICAgICAgPC9pbmNsdWRlcz4KLQk8L2RlcGVuZGVuY3lTZXQ+IAotCTwvZGVwZW5kZW5jeVNldHM+Ci08L2Fzc2VtYmx5PgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLXNlcnZpY2UtcGx1Z2luL3BvbS54bWwgYi92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2Utc2VydmljZS1wbHVnaW4vcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2VlODFjYS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2Utc2VydmljZS1wbHVnaW4vcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM2NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItcGFyZW50PC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4xLjUuMTwvdmVyc2lvbj4KLSAgICAgICAgPHJlbGF0aXZlUGF0aD4uLi8uLi9wYXJlbnQvcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgotICAgIDwvcGFyZW50PgotICAgIDxhcnRpZmFjdElkPmF4aXMyLmVjbGlwc2Uuc2VydmljZS5wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgPG5hbWU+QXBhY2hlIEF4aXMyIC0gdG9vbCAtIEVjbGlwc2Ugc2VydmljZSBQbHVnaW48L25hbWU+Ci0gICAgPHBhY2thZ2luZz5tYXZlbi1wbHVnaW48L3BhY2thZ2luZz4KLSAgICA8ZGVzY3JpcHRpb24+VGhlIEF4aXMgMiBFY2xpcHNlIFNlcnZpY2UgUGx1Z2luIGZvciBTZXJ2aWNlIGFyY2hpdmUgY3JlYXRpb248L2Rlc2NyaXB0aW9uPgotICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHt2ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1qYXZhMndzZGw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3ZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLWNvZGVnZW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3ZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLWtlcm5lbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7dmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItYWRiPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHt2ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1hZGItY29kZWdlbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7dmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5jb21tb25zLWxvZ2dpbmc8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWxvZ2dpbmc8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5sb2c0ajwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmxvZzRqPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuY29yZTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmNvcmUucnVudGltZTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDxleGNsdXNpb25zPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmNvcmU8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHM8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuY29yZTwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuY29yZS52YXJpYWJsZXM8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuY29yZTwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuY29yZS5jb250ZW50dHlwZTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5jb3JlPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmNvcmU8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmNvcmUuZmlsZXN5c3RlbTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS51cGRhdGU8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLnVwZGF0ZS51aTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS51cGRhdGU8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3I8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UudXBkYXRlPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS51cGRhdGUuY29yZTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5oZWxwPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5oZWxwPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmVxdWlub3g8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmVxdWlub3gucmVnaXN0cnk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuZXF1aW5veDwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuZXF1aW5veC5wcmVmZXJlbmNlczwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5jb3JlPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29tcGF0aWJpbGl0eTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5jb3JlPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29tcGF0aWJpbGl0eS5hdXRoPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmFudDwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuYW50LmNvcmU8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICA8L2V4Y2x1c2lvbnM+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5zd3Q8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5zd3Q8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5vc2dpPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2Uub3NnaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLnN3dDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLnN3dC53aW4zMi53aW4zMi54ODY8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS51aTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLnVpLmlkZTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDxleGNsdXNpb25zPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLnVpPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS51aS5mb3JtczwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS51aTwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UudWkudmlld3M8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICA8L2V4Y2x1c2lvbnM+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZmFjZTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpmYWNlPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5hbnQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5hbnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8L2RlcGVuZGVuY2llcz4KLSAgICA8ZGlzdHJpYnV0aW9uTWFuYWdlbWVudD4KLSAgICAgICAgPHJlcG9zaXRvcnk+Ci0gICAgICAgICAgICA8aWQ+YXBhY2hlLXJlcG88L2lkPgotICAgICAgICAgICAgPG5hbWU+TWF2ZW4gQ2VudHJhbCBSZXBvc2l0b3J5PC9uYW1lPgotICAgICAgICAgICAgPHVybD5zY3BleGU6Ly9wZW9wbGUuYXBhY2hlLm9yZy8vd3d3L3Blb3BsZS5hcGFjaGUub3JnL3JlcG8vbTItaWJpYmxpby1yc3luYy1yZXBvc2l0b3J5PC91cmw+Ci0gICAgICAgIDwvcmVwb3NpdG9yeT4KLSAgICAgICAgPHNuYXBzaG90UmVwb3NpdG9yeT4KLSAgICAgICAgICAgIDxpZD5hcGFjaGUtc25hcHNob3RzPC9pZD4KLSAgICAgICAgICAgIDxuYW1lPkFwYWNoZSBEZXZlbG9wbWVudCBSZXBvc2l0b3J5PC9uYW1lPgotICAgICAgICAgICAgPHVybD5zY3BleGU6Ly9wZW9wbGUuYXBhY2hlLm9yZy8vd3d3L3Blb3BsZS5hcGFjaGUub3JnL3JlcG8vbTItc25hcHNob3QtcmVwb3NpdG9yeTwvdXJsPgotICAgICAgICA8L3NuYXBzaG90UmVwb3NpdG9yeT4KLSAgICA8L2Rpc3RyaWJ1dGlvbk1hbmFnZW1lbnQ+Ci0gICAgPGJ1aWxkPgotICAgICAgICA8cmVzb3VyY2VzPgotICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+Li4vLi4vLi48L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPk5PVElDRS50eHQ8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPkxJQ0VOU0UudHh0PC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgPGZpbHRlcmluZz5mYWxzZTwvZmlsdGVyaW5nPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL2phdmE8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqLyouamF2YTwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1ZGVzPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgPC9yZXNvdXJjZXM+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8c291cmNlPjEuNTwvc291cmNlPgotICAgICAgICAgICAgICAgICAgICA8dGFyZ2V0PjEuNTwvdGFyZ2V0PgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmRpc3RyaWJ1dGlvbi1wYWNrYWdlPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5hdHRhY2hlZDwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9yPiR7cG9tLmJhc2VkaXJ9L2VjbGlwc2Utc2VydmljZS1wbHVnaW4tYXNzZW1ibHkueG1sPC9kZXNjcmlwdG9yPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbmFsTmFtZT5kaXN0PC9maW5hbE5hbWU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYW50cnVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5wYWNrYWdlPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YXNrcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InNlcnZpY2UucGx1Z2luLnZlcnNpb24iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0iQXhpczJfU2VydmljZV9BcmNoaXZlcl8ke2VjbGlwc2UucGx1Z2lucy52ZXJzaW9ufSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ic2VydmljZS5wbHVnaW4uemlwLm5hbWUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0iYXhpczItZWNsaXBzZS1zZXJ2aWNlLWFyY2hpdmVyLXdpemFyZC56aXAiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InNlcnZpY2UucGx1Z2luLmphci5uYW1lIiB2YWx1ZT0iQXhpc19TZXJ2aWNlX0FyY2hpdmVyLmphciIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ic3JjIiB2YWx1ZT0iLi9zcmMiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InNlcnZpY2Uuc3JjLmRpciIgdmFsdWU9Ii4uL2F4aXMyLWVjbGlwc2Utc2VydmljZS1wbHVnaW4vc3JjL21haW4vamF2YSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ib3V0cHV0IiB2YWx1ZT0iLi4vdGFyZ2V0L2VjbGlwc2VfcGx1Z2lucyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ib3V0cHV0LnRhcmdldCIgdmFsdWU9IiR7b3V0cHV0fS9yZWxlYXNlIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzZXJ2aWNlLm91dHB1dC5kaXIiIHZhbHVlPSIke291dHB1dH0vc2VydmljZS1hcmNoaXZlciIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0icGx1Z2luLm91dHB1dC5kaXIiIHZhbHVlPSIke291dHB1dH0vcGx1Z2luIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzZXJ2aWNlLnBsdWdpbi5vdXRwdXQuZGlyIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9IiR7cGx1Z2luLm91dHB1dC5kaXJ9LyR7c2VydmljZS5wbHVnaW4udmVyc2lvbn0iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InNvdXJjZS5kaXIubmFtZSIgdmFsdWU9InNyYyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ibGliLmRpci5uYW1lIiB2YWx1ZT0ibGliIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJiaW4uZGlyLm5hbWUiIHZhbHVlPSJiaW4iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImhlbHAuZGlyLm5hbWUiIHZhbHVlPSJoZWxwIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJpY29ucy5kaXIubmFtZSIgdmFsdWU9Imljb25zIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4ucHJvamVjdC5maWxlLm5hbWUiIHZhbHVlPSIucHJvamVjdCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0icGx1Z2luLmNsYXNzcGF0aC5maWxlLm5hbWUiIHZhbHVlPSIuY2xhc3NwYXRoIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4uaGVscC5maWxlLm5hbWUiIHZhbHVlPSJoZWxwX3RvYy54bWwiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InNlcnZpY2UucmVzb3VyY2UuZGlyIiB2YWx1ZT0iLi4vY29uZi9zZXJ2aWNlIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzZXJ2aWNlLmhlbHAucmVzb3VyY2UuZmlsZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSIuLi8uLi8uLi9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2VjbGlwc2Uvc2VydmljZWFyY2hpdmVyLXBsdWdpbi5odG1sIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzZXJ2aWNlLmhlbHAuaW1hZ2VzLmRpciIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSIuLi8uLi8uLi9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2VjbGlwc2UvaW1hZ2VzIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJheGlzMi5saWIuZGlyIiB2YWx1ZT0iLi4vLi4vLi4vdGFyZ2V0L2xpYiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tRmlsdGVyIHRvY2tlbnMgZm9yIHRoZSBjb3B5IGNvbW1hbmQgdG8gZmlsdGVyIHRoZSB2ZXJzaW9ucyBvZiBleHRlcm5hbCBkZXBlbmRlbmNpZXMgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWx0ZXIgdG9rZW49InZlcnNpb24iIHZhbHVlPSIke3ZlcnNpb259Ii8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWx0ZXIgdG9rZW49ImVjbGlwc2UucGx1Z2lucy52ZXJzaW9uIiB2YWx1ZT0iJHtlY2xpcHNlLnBsdWdpbnMudmVyc2lvbn0iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbHRlciB0b2tlbj0iYW50LnZlcnNpb24iIHZhbHVlPSIke2FudC52ZXJzaW9ufSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsdGVyIHRva2VuPSJjb21tb25zLmxvZ2dpbmcudmVyc2lvbiIgdmFsdWU9IiR7Y29tbW9ucy5sb2dnaW5nLnZlcnNpb259Ii8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWx0ZXIgdG9rZW49ImxvZzRqLnZlcnNpb24iIHZhbHVlPSIke2xvZzRqLnZlcnNpb259Ii8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tCi0JCQkJCQkJCSAgSWYgaXQgaXMgbmVjY2Vzc2FyeSB0byBjcmVhdGUgdGhlIGVjbGlwc2UgcHJvamVjdCBtYW51YWxseSB3aXRob3V0IHVzaW5nICJtdm4gZWNsaXBzZTplY2xpcHNlIiBjb21tYW5kIHVuY29tbWVudCB0aGUgZm9sbG93aW5nIHNlY3Rpb24gd2hpY2ggY29waWVzIAotCQkJCQkJCQkgIHRoZSByZXF1aXJlZCBqYXJzIHRvIHRoZSB0aGUgcHJvamVjdCBsaWIgZm9sZGVyCi0JCQkJCQkJCSAgLS0+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJtMi5sb2NhbC5yZXBvIiB2YWx1ZT0iJHtzZXR0aW5ncy5sb2NhbFJlcG9zaXRvcnl9Ii8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxta2RpciBkaXI9Ii4vbGliIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3B5IHRvZGlyPSIuL2xpYiIgZmlsZT0iJHttMi5sb2NhbC5yZXBvfS9vcmcvYXBhY2hlL2FudC9hbnQvJHthbnQudmVyc2lvbn0vYW50LSR7YW50LnZlcnNpb259LmphciIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvcHkgdG9kaXI9Ii4vbGliIiBmaWxlPSIke20yLmxvY2FsLnJlcG99L2NvbW1vbnMtbG9nZ2luZy9jb21tb25zLWxvZ2dpbmcvJHtjb21tb25zLmxvZ2dpbmcudmVyc2lvbn0vY29tbW9ucy1sb2dnaW5nLSR7Y29tbW9ucy5sb2dnaW5nLnZlcnNpb259LmphciIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvcHkgdG9kaXI9Ii4vbGliIiBmaWxlPSIke20yLmxvY2FsLnJlcG99L2xvZzRqL2xvZzRqLyR7bG9nNGoudmVyc2lvbn0vbG9nNGotJHtsb2c0ai52ZXJzaW9ufS5qYXIiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3B5IHRvZGlyPSIuL2xpYiIgZmlsZT0iJHttMi5sb2NhbC5yZXBvfS9vcmcvYXBhY2hlL2F4aXMyL2F4aXMyLyR7dmVyc2lvbn0vYXhpczItJHt2ZXJzaW9ufS5qYXIiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWtkaXIgZGlyPSIuL2ljb25zIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3B5IHRvZGlyPSIuL2ljb25zIiBvdmVyd3JpdGU9InRydWUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIuLi9jb25mL3NlcnZpY2UvaWNvbnMiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29weT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvcHkgdG9kaXI9Ii4iIGZpbGU9Ii4uL2NvbmYvc2VydmljZS9idWlsZC5wcm9wZXJ0aWVzIiBvdmVyd3JpdGU9InRydWUiIGZpbHRlcmluZz0ib24iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvcHkgdG9kaXI9Ii4iIGZpbGU9Ii4uL2NvbmYvc2VydmljZS9oZWxwX3RvYy54bWwiIG92ZXJ3cml0ZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29weSB0b2Rpcj0iLiIgZmlsZT0iLi4vY29uZi9zZXJ2aWNlL3BsdWdpbi54bWwiIG92ZXJ3cml0ZT0idHJ1ZSIgZmlsdGVyaW5nPSJvbiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29weSB0b2Rpcj0iLiIgZmlsZT0iLi4vY29uZi9zZXJ2aWNlLy5jbGFzc3BhdGgiIG92ZXJ3cml0ZT0idHJ1ZSIgZmlsdGVyaW5nPSJvbiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29weSB0b2Rpcj0iLiIgZmlsZT0iLi4vY29uZi9zZXJ2aWNlLy5wcm9qZWN0IiBvdmVyd3JpdGU9InRydWUiIGZpbHRlcmluZz0ib24iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvcHkgdG9kaXI9Ii4iIGZpbGU9Ii4uL2NvbmYvc2VydmljZS9yZWFkbWUudHh0IiBvdmVyd3JpdGU9InRydWUiLz4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVsZXRlIGRpcj0iLi90YXJnZXQvcGx1Z2luLyR7c2VydmljZS5wbHVnaW4udmVyc2lvbn0iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1rZGlyIGRpcj0iLi90YXJnZXQvcGx1Z2luLyR7c2VydmljZS5wbHVnaW4udmVyc2lvbn0iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlbGV0ZSBkaXI9Ii4vdGFyZ2V0L2Rpc3QiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1rZGlyIGRpcj0iLi90YXJnZXQvZGlzdCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dW56aXAgc3JjPSIuL3RhcmdldC9heGlzMi5lY2xpcHNlLnNlcnZpY2UucGx1Z2luLSR7dmVyc2lvbn0uamFyIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdD0iLi90YXJnZXQvcGx1Z2luLyR7c2VydmljZS5wbHVnaW4udmVyc2lvbn0iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBDb3B5IHRvIHRoZSBzYW1lIHBvc2l0aW9uIHdpdGggdGhlIGZpbHRlcmluZyBvbi0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29weSB0b2Rpcj0iLi90YXJnZXQvcGx1Z2luLyR7c2VydmljZS5wbHVnaW4udmVyc2lvbn0iIGZpbHRlcmluZz0ib24iPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke3NlcnZpY2UucmVzb3VyY2UuZGlyfSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0icGx1Z2luLnhtbCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9ImJ1aWxkLnByb3BlcnRpZXMiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIke3BsdWdpbi5jbGFzc3BhdGguZmlsZS5uYW1lfSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvcHk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gY29weSB0aGUgaGVscCBkaXJlY3RvcnkgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxta2RpciBkaXI9Ii4vdGFyZ2V0L3BsdWdpbi8ke3NlcnZpY2UucGx1Z2luLnZlcnNpb259LyR7aGVscC5kaXIubmFtZX0iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1rZGlyIGRpcj0iLi90YXJnZXQvcGx1Z2luLyR7c2VydmljZS5wbHVnaW4udmVyc2lvbn0vJHtoZWxwLmRpci5uYW1lfS8ke2ljb25zLmRpci5uYW1lfSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29weSB0b2Rpcj0iLi90YXJnZXQvcGx1Z2luLyR7c2VydmljZS5wbHVnaW4udmVyc2lvbn0vJHtoZWxwLmRpci5uYW1lfSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBmaWxlPSIke3NlcnZpY2UuaGVscC5yZXNvdXJjZS5maWxlfSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvcHk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3B5IHRvZGlyPSIuL3RhcmdldC9wbHVnaW4vJHtzZXJ2aWNlLnBsdWdpbi52ZXJzaW9ufS8ke2hlbHAuZGlyLm5hbWV9LyR7aWNvbnMuZGlyLm5hbWV9Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtzZXJ2aWNlLmhlbHAuaW1hZ2VzLmRpcn0iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb3B5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGNvcHkgdGhlICBpY29ucy0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWtkaXIgZGlyPSIuL3RhcmdldC9wbHVnaW4vJHtzZXJ2aWNlLnBsdWdpbi52ZXJzaW9ufS8ke2ljb25zLmRpci5uYW1lfSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29weSB0b2Rpcj0iLi90YXJnZXQvcGx1Z2luLyR7c2VydmljZS5wbHVnaW4udmVyc2lvbn0vJHtpY29ucy5kaXIubmFtZX0iPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke3NlcnZpY2UucmVzb3VyY2UuZGlyfS8ke2ljb25zLmRpci5uYW1lfSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvcHk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gY29weSB0aGUgbGliIGZpbGVzIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWtkaXIgZGlyPSIuL3RhcmdldC9wbHVnaW4vdGVtcCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dW56aXAgc3JjPSIuL3RhcmdldC9kaXN0LWF4aXMyLWVjbGlwc2Utc2VydmljZS1wbHVnaW4uemlwIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdD0iLi90YXJnZXQvcGx1Z2luL3RlbXAiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1rZGlyIGRpcj0iLi90YXJnZXQvcGx1Z2luLyR7c2VydmljZS5wbHVnaW4udmVyc2lvbn0vbGliIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3B5IHRvZGlyPSIuL3RhcmdldC9wbHVnaW4vJHtzZXJ2aWNlLnBsdWdpbi52ZXJzaW9ufS9saWIiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIuL3RhcmdldC9wbHVnaW4vdGVtcC9saWIiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb3B5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVsZXRlIGRpcj0iLi90YXJnZXQvcGx1Z2luL3RlbXAiLz4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGNvcHkgdGhlIG90aGVyIHByb2plY3QgZmlsZXMtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvcHkgdG9kaXI9Ii4vdGFyZ2V0L3BsdWdpbi8ke3NlcnZpY2UucGx1Z2luLnZlcnNpb259Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGZpbGU9IiR7c2VydmljZS5yZXNvdXJjZS5kaXJ9LyR7cGx1Z2luLnByb2plY3QuZmlsZS5uYW1lfSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZmlsZT0iJHtzZXJ2aWNlLnJlc291cmNlLmRpcn0vJHtwbHVnaW4uaGVscC5maWxlLm5hbWV9Ii8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29weT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBjb3B5IHRoZSBjbGFzc2VzIHRvIGNsYXNzZXMgZGlyZWN0b3J5LS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxta2RpciBkaXI9Ii4vdGFyZ2V0L3BsdWdpbi8ke3NlcnZpY2UucGx1Z2luLnZlcnNpb259L2NsYXNzZXMiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvcHkgdG9kaXI9Ii4vdGFyZ2V0L3BsdWdpbi8ke3NlcnZpY2UucGx1Z2luLnZlcnNpb259L2NsYXNzZXMiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIuL3RhcmdldC9wbHVnaW4vJHtzZXJ2aWNlLnBsdWdpbi52ZXJzaW9ufSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovb3JnLyoqIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29weT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLVppcCB0aGUgY2xhc3NlcyB0byBhIGphciBmaWxlIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8emlwIGRlc3RmaWxlPSIuL3RhcmdldC9wbHVnaW4vJHtzZXJ2aWNlLnBsdWdpbi52ZXJzaW9ufS8ke3NlcnZpY2UucGx1Z2luLmphci5uYW1lfSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlZGlyPSIuL3RhcmdldC9wbHVnaW4vJHtzZXJ2aWNlLnBsdWdpbi52ZXJzaW9ufS9jbGFzc2VzIiB1cGRhdGU9InRydWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlbGV0ZSBkaXI9Ii4vdGFyZ2V0L3BsdWdpbi8ke3NlcnZpY2UucGx1Z2luLnZlcnNpb259L2NsYXNzZXMiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLVppcCB0aGUgZWNsaXBzZSBwbHVnaW4gdG8gdGhlIHRhcmdldC9kaXN0IGRpcmVjdG9yeSAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHppcCBkZXN0ZmlsZT0iLi90YXJnZXQvZGlzdC8ke3NlcnZpY2UucGx1Z2luLnppcC5uYW1lfSIgYmFzZWRpcj0iLi90YXJnZXQvcGx1Z2luIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVsZXRlIGRpcj0iLi90YXJnZXQvdGVtcCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVsZXRlIGRpcj0iLi90YXJnZXQvY2xhc3NlcyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVsZXRlIGRpcj0iLi90YXJnZXQvdGVzdC1jbGFzc2VzIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YXNrcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5ydW48L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvYnVpbGQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2Utc2VydmljZS1wbHVnaW4vcmVzb3VyY2VzL3NlcnZpY2VzLnhzZCBiL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1zZXJ2aWNlLXBsdWdpbi9yZXNvdXJjZXMvc2VydmljZXMueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTM2YTc5Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1zZXJ2aWNlLXBsdWdpbi9yZXNvdXJjZXMvc2VydmljZXMueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotDQotPHhzOnNjaGVtYSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIj4NCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0ic2VydmljZUdyb3VwIj4NCi0gICAgICAgIDx4czpjb21wbGV4VHlwZT4NCi0gICAgICAgICAgICA8eHM6c2VxdWVuY2U+DQotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9InNlcnZpY2UiLz4NCi0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9InBhcmFtZXRlciIvPg0KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0ibW9kdWxlIi8+DQotICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4NCi0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+DQotICAgIDwveHM6ZWxlbWVudD4NCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0ic2VydmljZSI+DQotICAgICAgICA8eHM6Y29tcGxleFR5cGU+DQotICAgICAgICAgICAgPHhzOnNlcXVlbmNlPg0KLSAgICAgICAgICAgICAgICA8eHM6Y2hvaWNlIG1heE9jY3Vycz0idW5ib3VuZGVkIj4NCi0gICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ibW9kdWxlIi8+DQotICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9Im9wZXJhdGlvbiIvPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJwYXJhbWV0ZXIiLz4NCi0gICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0iZGVzY3JpcHRpb24iLz4NCi0gICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0iRGVzY3JpcHRpb24iLz4NCi0gICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0iZXhjbHVkZU9wZXJhdGlvbnMiLz4NCi0gICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ibWVzc2FnZVJlY2VpdmVycyIvPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJzY2hlbWEiLz4NCi0gICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0idHJhbnNwb3J0cyIvPg0KLSAgICAgICAgICAgICAgICA8L3hzOmNob2ljZT4NCi0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9ImRhdGFMb2NhdG9yIi8+DQotICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImNsYXNzIi8+DQotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIi8+DQotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJzY29wZSIgdHlwZT0ieHM6TkNOYW1lIi8+DQotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXROYW1lc3BhY2UiIHR5cGU9InhzOmFueVVSSSIvPg0KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iYWN0aXZhdGUiIHR5cGU9InhzOmJvb2xlYW4iIHVzZT0ib3B0aW9uYWwiLz4NCi0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+DQotICAgIDwveHM6ZWxlbWVudD4NCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzOnN0cmluZyIvPg0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJEZXNjcmlwdGlvbiIgdHlwZT0ieHM6c3RyaW5nIi8+DQotICAgIDx4czplbGVtZW50IG5hbWU9ImV4Y2x1ZGVPcGVyYXRpb25zIj4NCi0gICAgICAgIDx4czpjb21wbGV4VHlwZT4NCi0gICAgICAgICAgICA8eHM6c2VxdWVuY2U+DQotICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ib3BlcmF0aW9uIiB0eXBlPSJ4czpzdHJpbmciIC8+ICANCi0gICAgICAgICAgICA8L3hzOnNlcXVlbmNlPg0KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4NCi0gICAgPC94czplbGVtZW50Pg0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJtZXNzYWdlUmVjZWl2ZXJzIj4NCi0gICAgICAgIDx4czpjb21wbGV4VHlwZT4NCi0gICAgICAgICAgICA8eHM6c2VxdWVuY2U+DQotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9Im1lc3NhZ2VSZWNlaXZlciIvPg0KLSAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+DQotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPg0KLSAgICA8L3hzOmVsZW1lbnQ+DQotICAgIDx4czplbGVtZW50IG5hbWU9InNjaGVtYSI+DQotICAgICAgICA8eHM6Y29tcGxleFR5cGU+DQotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJzY2hlbWFOYW1lc3BhY2UiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzOmFueVVSSSIvPg0KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4NCi0gICAgPC94czplbGVtZW50Pg0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ0cmFuc3BvcnRzIj4NCi0gICAgICAgIDx4czpjb21wbGV4VHlwZT4NCi0gICAgICAgICAgICA8eHM6c2VxdWVuY2U+DQotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0idHJhbnNwb3J0Ii8+DQotICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4NCi0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+DQotICAgIDwveHM6ZWxlbWVudD4NCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0idHJhbnNwb3J0IiB0eXBlPSJ4czpOQ05hbWUiLz4NCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0iZGF0YUxvY2F0b3IiPg0KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPg0KLSAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4NCi0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9ImRpYWxlY3RMb2NhdG9yIi8+DQotICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImNsYXNzIi8+DQotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPg0KLSAgICA8L3hzOmVsZW1lbnQ+DQotICAgIDx4czplbGVtZW50IG5hbWU9ImRpYWxlY3RMb2NhdG9yIj4NCi0gICAgICAgIDx4czpjb21wbGV4VHlwZT4NCi0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB1c2U9InJlcXVpcmVkIi8+DQotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJkaWFsZWN0IiB1c2U9InJlcXVpcmVkIiB0eXBlPSJ4czphbnlVUkkiLz4NCi0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+DQotICAgIDwveHM6ZWxlbWVudD4NCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0icGFyYW1ldGVyIj4NCi0gICAgICAgIDx4czpjb21wbGV4VHlwZSBtaXhlZD0idHJ1ZSI+DQotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJsb2NrZWQiIHR5cGU9InhzOk5NVE9LRU4iLz4NCi0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzOk5DTmFtZSIvPg0KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4NCi0gICAgPC94czplbGVtZW50Pg0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJtb2R1bGUiPg0KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPg0KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icmVmIiB1c2U9InJlcXVpcmVkIiB0eXBlPSJ4czpOQ05hbWUiLz4NCi0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+DQotICAgIDwveHM6ZWxlbWVudD4NCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0ib3BlcmF0aW9uIj4NCi0gICAgICAgIDx4czpjb21wbGV4VHlwZSBtaXhlZD0idHJ1ZSI+DQotICAgICAgICAgICAgPHhzOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4NCi0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJtZXNzYWdlUmVjZWl2ZXIiLz4NCi0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJtb2R1bGUiLz4NCi0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJwYXJhbWV0ZXIiLz4NCi0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJhY3Rpb25NYXBwaW5nIi8+DQotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0iZmF1bHRBY3Rpb25NYXBwaW5nIi8+DQotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ibWVzc2FnZSIvPg0KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9Im91dHB1dEFjdGlvbk1hcHBpbmciLz4NCi0gICAgICAgICAgICA8L3hzOmNob2ljZT4NCi0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im1lcCIgdHlwZT0ieHM6YW55VVJJIi8+DQotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpOQ05hbWUiLz4NCi0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InFuYW1lIiB0eXBlPSJ4czpOQ05hbWUiLz4NCi0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+DQotICAgIDwveHM6ZWxlbWVudD4NCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0iYWN0aW9uTWFwcGluZyIgdHlwZT0ieHM6YW55VVJJIi8+DQotICAgIDx4czplbGVtZW50IG5hbWU9ImZhdWx0QWN0aW9uTWFwcGluZyI+DQotICAgICAgICA8eHM6Y29tcGxleFR5cGU+DQotICAgICAgICAgICAgPHhzOnNpbXBsZUNvbnRlbnQ+DQotICAgICAgICAgICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6YW55VVJJIj4NCi0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZmF1bHROYW1lIiB1c2U9InJlcXVpcmVkIiB0eXBlPSJ4czpOQ05hbWUiLz4NCi0gICAgICAgICAgICAgICAgPC94czpleHRlbnNpb24+DQotICAgICAgICAgICAgPC94czpzaW1wbGVDb250ZW50Pg0KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4NCi0gICAgPC94czplbGVtZW50Pg0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJtZXNzYWdlIj4NCi0gICAgICAgIDx4czpjb21wbGV4VHlwZT4NCi0gICAgICAgICAgICA8eHM6c2VxdWVuY2U+DQotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0icGFyYW1ldGVyIi8+DQotICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImxhYmVsIiB1c2U9InJlcXVpcmVkIiB0eXBlPSJ4czpOQ05hbWUiLz4NCi0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+DQotICAgIDwveHM6ZWxlbWVudD4NCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0ib3V0cHV0QWN0aW9uTWFwcGluZyIgdHlwZT0ieHM6YW55VVJJIi8+DQotICAgIDx4czplbGVtZW50IG5hbWU9Im1lc3NhZ2VSZWNlaXZlciI+DQotICAgICAgICA8eHM6Y29tcGxleFR5cGU+DQotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHM6TkNOYW1lIi8+DQotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtZXAiIHR5cGU9InhzOmFueVVSSSIvPg0KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4NCi0gICAgPC94czplbGVtZW50Pg0KLTwveHM6c2NoZW1hPg0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1zZXJ2aWNlLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9jb3JlL0NsYXNzRmlsZUhhbmRsZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1zZXJ2aWNlLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9jb3JlL0NsYXNzRmlsZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYwN2I5ZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2Utc2VydmljZS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvY29yZS9DbGFzc0ZpbGVIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudG9vbC5jb3JlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5VUkxDbGFzc0xvYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1wdWJsaWMgY2xhc3MgQ2xhc3NGaWxlSGFuZGxlciB7Ci0KLQotICAgCi0vKioKLSAqIAotICogQHBhcmFtIGNsYXNzRmlsZU5hbWUKLSAqIEBwYXJhbSBsb2NhdGlvbgotICogQHJldHVybgotICogQHRocm93cyBJT0V4Y2VwdGlvbgotICogQHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uCi0gKi8KLSAgICBwdWJsaWMgQXJyYXlMaXN0IGdldE1ldGhvZE5hbWVzRnJvbUNsYXNzKFN0cmluZyBjbGFzc0ZpbGVOYW1lLFN0cmluZyBsb2NhdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uewotICAgICAgICBBcnJheUxpc3QgcmV0dXJuTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgRmlsZSBmaWxlRW5kcG9pbnQgPSBuZXcgRmlsZShsb2NhdGlvbik7Ci0gICAgICAgIGlmICghZmlsZUVuZHBvaW50LmV4aXN0cygpKQotICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJ0aGUgbG9jYXRpb24gaXMgaW52YWxpZCIpOwotICAgICAgICBVUkxbXSB1cmxMaXN0ID0ge2ZpbGVFbmRwb2ludC50b1VSTCgpfTsKLSAgICAgICAgVVJMQ2xhc3NMb2FkZXIgY2xhenpMb2FkZXIgPSBuZXcgVVJMQ2xhc3NMb2FkZXIodXJsTGlzdCk7Ci0gICAgICAgIENsYXNzIGNsYXp6ID0gY2xhenpMb2FkZXIubG9hZENsYXNzKGNsYXNzRmlsZU5hbWUpOwotICAgICAgICBNZXRob2RbXSBtZXRob2RzID0gY2xhenouZ2V0RGVjbGFyZWRNZXRob2RzKCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICByZXR1cm5MaXN0LmFkZChtZXRob2RzW2ldLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0dXJuTGlzdDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1zZXJ2aWNlLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9jb3JlL0ZpbGVDb3BpZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1zZXJ2aWNlLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9jb3JlL0ZpbGVDb3BpZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWViMGMyZi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2Utc2VydmljZS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvY29yZS9GaWxlQ29waWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudG9vbC5jb3JlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5Db3B5OwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbGVTZXQ7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLXB1YmxpYyBjbGFzcyBGaWxlQ29waWVyIGV4dGVuZHMgQ29weXsKLSAgICBwdWJsaWMgRmlsZUNvcGllcigpIHsKLSAgICAgICAgdGhpcy5zZXRQcm9qZWN0KG5ldyBQcm9qZWN0KCkpOwotICAgICAgICB0aGlzLmdldFByb2plY3QoKS5pbml0KCk7Ci0gICAgICAgIHRoaXMuc2V0VGFza1R5cGUoImNvcHkiKTsKLSAgICAgICAgdGhpcy5zZXRUYXNrTmFtZSgiY29weS1maWxlcyIpOwotICAgICAgICB0aGlzLnNldE93bmluZ1RhcmdldChuZXcgb3JnLmFwYWNoZS50b29scy5hbnQuVGFyZ2V0KCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNvcHlGaWxlcyhGaWxlIHNvdXJjZUZpbGUsRmlsZSBkZXN0aW5hdGlvbkRpcmVjdG9yeSxTdHJpbmcgZmlsdGVyKXsKLQotICAgICAgICBpZiAoc291cmNlRmlsZS5pc0ZpbGUoKSkKLSAgICAgICAgICAgIHRoaXMuc2V0RmlsZShzb3VyY2VGaWxlKTsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgIAkgRmlsZVNldCBmaWxlc2V0ID0gbmV3IEZpbGVTZXQoKTsKLQkgICAgICAgICAgICBmaWxlc2V0LnNldERpcihzb3VyY2VGaWxlKTsKLQkgICAgICAgICAgICBpZiAoZmlsdGVyIT1udWxsKXsKLQkgICAgICAgICAgICAgICAgaWYgKGZpbHRlci5tYXRjaGVzKCJcXC5cXHcqIikpewotCSAgICAgICAgICAgICAgICAJZmlsZXNldC5zZXRJbmNsdWRlcygiKiovKiIrZmlsdGVyKTsgCi0JICAgICAgICAgICAgICAgIH0KLQkgICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aGlzLmFkZEZpbGVzZXQoZmlsZXNldCk7Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy5zZXRUb2RpcihkZXN0aW5hdGlvbkRpcmVjdG9yeSk7Ci0gICAgICAgIHRoaXMucGVyZm9ybSgpOwotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2Utc2VydmljZS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvY29yZS9KYXJGaWxlV3JpdGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2Utc2VydmljZS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvY29yZS9KYXJGaWxlV3JpdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0ZGEyZjMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLXNlcnZpY2UtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL2NvcmUvSmFyRmlsZVdyaXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnRvb2wuY29yZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuSmFyOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBKYXJGaWxlV3JpdGVyIGV4dGVuZHMgSmFyewotCi0KLSAgICBwdWJsaWMgSmFyRmlsZVdyaXRlcigpIHsKLSAgICAgICAgdGhpcy5zZXRQcm9qZWN0KG5ldyBQcm9qZWN0KCkpOwotICAgICAgICB0aGlzLmdldFByb2plY3QoKS5pbml0KCk7Ci0gICAgICAgIHRoaXMuc2V0VGFza1R5cGUoImphciIpOwotICAgICAgICB0aGlzLnNldFRhc2tOYW1lKCJqYXIiKTsKLSAgICAgICAgdGhpcy5zZXRPd25pbmdUYXJnZXQobmV3IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhcmdldCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUphckZpbGUoRmlsZSBvdXRwdXRGb2xkZXIsU3RyaW5nIG91dHB1dEZpbGVOYW1lLEZpbGUgaW5wdXRGaWxlRm9sZGVyKSB0aHJvd3MgSU9FeGNlcHRpb24sRXhjZXB0aW9uIHsKLQotICAgICAgICBpZiAoIW91dHB1dEZvbGRlci5leGlzdHMoKSl7Ci0gICAgICAgICAgICBvdXRwdXRGb2xkZXIubWtkaXIoKTsgLy9jcmVhdGUgdGhlIG91dHB1dCBwYXRoCi0gICAgICAgIH1lbHNlewotICAgICAgICAgICAgaWYgKCFvdXRwdXRGb2xkZXIuaXNEaXJlY3RvcnkoKSkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBGaWxlIHRhcmdldEZpbGUgPSBuZXcgRmlsZShvdXRwdXRGb2xkZXIsb3V0cHV0RmlsZU5hbWUpOwotICAgICAgICB0aGlzLnNldEJhc2VkaXIoaW5wdXRGaWxlRm9sZGVyKTsKLSAgICAgICAgdGhpcy5zZXREZXN0RmlsZSh0YXJnZXRGaWxlKTsKLQotICAgICAgICAvL3J1biB0aGUgdGFzawotICAgICAgICB0aGlzLnBlcmZvcm0oKTsKLQotCi0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1zZXJ2aWNlLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9jb3JlL1NlcnZpY2VGaWxlQ3JlYXRvci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLXNlcnZpY2UtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL2NvcmUvU2VydmljZUZpbGVDcmVhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5MDRjMzEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLXNlcnZpY2UtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL2NvcmUvU2VydmljZUZpbGVDcmVhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnRvb2wuY29yZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLndyaXRlci5GaWxlV3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLndyaXRlci5TZXJ2aWNlWE1MV3JpdGVyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uUmVzdWx0OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXI7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5kb20uRE9NU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdDsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1wdWJsaWMgY2xhc3MgU2VydmljZUZpbGVDcmVhdG9yIHsKLSAgICAKLSAgICBwdWJsaWMgRmlsZSBjcmVhdGVTZXJ2aWNlRmlsZShTdHJpbmcgc2VydmljZU5hbWUsU3RyaW5nIGltcGxlbWVudGF0aW9uQ2xhc3NOYW1lLEFycmF5TGlzdCBtZXRob2RMaXN0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBjdXJyZW50VXNlckRpciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5kaXIiKTsKLSAgICAgICAgU3RyaW5nIGZpbGVOYW1lID0gInNlcnZpY2VzLnhtbCI7Ci0gICAgICAgIAotICAgICAgICBGaWxlV3JpdGVyIHNlcnZpY2VYbWxXcml0ZXIgPSBuZXcgU2VydmljZVhNTFdyaXRlcihjdXJyZW50VXNlckRpcik7Ci0gICAgICAgIHdyaXRlRmlsZShnZXRTZXJ2aWNlTW9kZWwoc2VydmljZU5hbWUsaW1wbGVtZW50YXRpb25DbGFzc05hbWUsbWV0aG9kTGlzdCksc2VydmljZVhtbFdyaXRlcixmaWxlTmFtZSk7Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBGaWxlKGN1cnJlbnRVc2VyRGlyICsgRmlsZS5zZXBhcmF0b3IgKyBmaWxlTmFtZSk7Ci0KLQotCi0KLSAgICB9Ci0KLSAgICBwcml2YXRlIERvY3VtZW50IGdldFNlcnZpY2VNb2RlbChTdHJpbmcgc2VydmljZU5hbWUsU3RyaW5nIGNsYXNzTmFtZSxBcnJheUxpc3QgbWV0aG9kcyl7Ci0KLSAgICAgICAgRG9jdW1lbnRCdWlsZGVyIGJ1aWxkZXIgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnVpbGRlciA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKLSAgICAgICAgfSBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgICAgICBEb2N1bWVudCBkb2MgPSBidWlsZGVyLm5ld0RvY3VtZW50KCk7Ci0gICAgICAgIAotICAgICAgICBFbGVtZW50IHJvb3RFbGVtZW50ID0gZG9jLmNyZWF0ZUVsZW1lbnQoImludGVyZmFjZSIpOwotICAgICAgICByb290RWxlbWVudC5zZXRBdHRyaWJ1dGUoImNsYXNzcGFja2FnZSIsIiIpOwotICAgICAgICByb290RWxlbWVudC5zZXRBdHRyaWJ1dGUoIm5hbWUiLGNsYXNzTmFtZSk7Ci0gICAgICAgIHJvb3RFbGVtZW50LnNldEF0dHJpYnV0ZSgic2VydmljZW5hbWUiLHNlcnZpY2VOYW1lKTsKLSAgICAgICAgRWxlbWVudCBtZXRob2RFbGVtZW50ID0gbnVsbDsKLSAgICAgICAgaW50IHNpemUgPSBtZXRob2RzLnNpemUoKTsKLSAgICAgICAgZm9yKGludCBpPTA7aTxzaXplO2krKyl7Ci0gICAgICAgICAgICBtZXRob2RFbGVtZW50ID0gZG9jLmNyZWF0ZUVsZW1lbnQoIm1ldGhvZCIpOwotICAgICAgICAgICAgcm9vdEVsZW1lbnQuc2V0QXR0cmlidXRlKCJuYW1lIixtZXRob2RzLmdldChpKS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIHJvb3RFbGVtZW50LmFwcGVuZENoaWxkKG1ldGhvZEVsZW1lbnQpOwotICAgICAgICB9Ci0gICAgICAgIGRvYy5hcHBlbmRDaGlsZChyb290RWxlbWVudCk7Ci0gICAgICAgIHJldHVybiBkb2M7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEEgcmVzdXNhYmxlIG1ldGhvZCBmb3IgdGhlIGltcGxlbWVudGF0aW9uIG9mIGludGVyZmFjZSBhbmQgaW1wbGVtZW50YXRpb24gd3JpdGluZwotICAgICAqIEBwYXJhbSBtb2RlbAotICAgICAqIEBwYXJhbSB3cml0ZXIKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgd3JpdGVGaWxlKERvY3VtZW50IG1vZGVsLCBGaWxlV3JpdGVyIHdyaXRlcixTdHJpbmcgZmlsZU5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbixFeGNlcHRpb24gewotICAgICAgICAKLSAgICAgICAgU291cmNlIHNvdXJjZSA9IG5ldyBET01Tb3VyY2UobW9kZWwpOwotICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gbWVtb3J5U3RyZWFtID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICBSZXN1bHQgcmVzdWx0ID0gbmV3IFN0cmVhbVJlc3VsdChtZW1vcnlTdHJlYW0pOwotICAgICAgICBUcmFuc2Zvcm1lciB4Zm9ybWVyID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3VHJhbnNmb3JtZXIoKTsKLSAgICAgICAgeGZvcm1lci50cmFuc2Zvcm0oc291cmNlLCByZXN1bHQpOwotICAgICAgICAKLSAgICAgICAgLy9UT0RPOiBEb2Vzbid0IHJlYWxseSBvdXRwdXQgc3R1ZmYgZnJvbSB0aGUgbWVtb3J5c3RyZWFtIHRvIGZpbGUuLi5obW0uCi0gICAgICAgIAotICAgICAgICB3cml0ZXIubG9hZFRlbXBsYXRlKCk7Ci0gICAgICAgIHdyaXRlci5jcmVhdGVPdXRGaWxlKG51bGwsCi0gICAgICAgICAgICAgICAgIGZpbGVOYW1lKTsKLSAgICB9Ci0gICAgCi0gICAKLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLXNlcnZpY2UtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL2NvcmUvU2VydmljZVhNTENyZWF0ZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1zZXJ2aWNlLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9jb3JlL1NlcnZpY2VYTUxDcmVhdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwM2Q2NWEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLXNlcnZpY2UtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL2NvcmUvU2VydmljZVhNTENyZWF0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50b29sLmNvcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1wdWJsaWMgY2xhc3MgU2VydmljZVhNTENyZWF0ZXIgewotICAgIHByaXZhdGUgU3RyaW5nIHNlcnZpY2VOYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIHNlcnZpY2VDbGFzczsKLSAgICBwcml2YXRlIEFycmF5TGlzdCBvcGVyYXRpb25zOwotCi0gICAgcHVibGljIFNlcnZpY2VYTUxDcmVhdGVyKFN0cmluZyBzZXJ2aWNlTmFtZSwgU3RyaW5nIHNlcnZpY2VDbGFzcywgQXJyYXlMaXN0IG9wZXJhdGlvbnMpIHsKLSAgICAgICAgdGhpcy5zZXJ2aWNlTmFtZSA9IHNlcnZpY2VOYW1lOwotICAgICAgICB0aGlzLnNlcnZpY2VDbGFzcyA9IHNlcnZpY2VDbGFzczsKLSAgICAgICAgdGhpcy5vcGVyYXRpb25zID0gb3BlcmF0aW9uczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNlcnZpY2VOYW1lKCkgewotICAgICAgICByZXR1cm4gc2VydmljZU5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRTZXJ2aWNlQ2xhc3MoKSB7Ci0gICAgICAgIHJldHVybiBzZXJ2aWNlQ2xhc3M7Ci0gICAgfQotCi0gICAgcHVibGljIEFycmF5TGlzdCBnZXRPcGVyYXRpb25zKCkgewotICAgICAgICByZXR1cm4gb3BlcmF0aW9uczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBTdHJpbmcgc2VydmljZVhNTCA9ICI8c2VydmljZSBuYW1lPVwiIiArIHNlcnZpY2VOYW1lICsgIlwiID5cbiIgKwotICAgICAgICAiXHQ8ZGVzY3JpcHRpb24+XG4iICsKLSAgICAgICAgIlx0XHRQbGVhc2UgVHlwZSB5b3VyIHNlcnZpY2UgZGVzY3JpcHRpb24gaGVyZVxuIiArCi0gICAgICAgICJcdDwvZGVzY3JpcHRpb24+XG4iICsKLSAgICAgICAgIlx0PG1lc3NhZ2VSZWNlaXZlcnM+XG4iICsKLSAgICAgICAgIlx0XHQ8bWVzc2FnZVJlY2VpdmVyIG1lcD1cImh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgvd3NkbC9pbi1vbmx5XCIgY2xhc3M9XCJvcmcuYXBhY2hlLmF4aXMyLnJwYy5yZWNlaXZlcnMuUlBDSW5Pbmx5TWVzc2FnZVJlY2VpdmVyXCIgLz5cbiIgKwotICAgICAgICAiXHRcdDxtZXNzYWdlUmVjZWl2ZXIgIG1lcD1cImh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgvd3NkbC9pbi1vdXRcIiAgY2xhc3M9XCJvcmcuYXBhY2hlLmF4aXMyLnJwYy5yZWNlaXZlcnMuUlBDTWVzc2FnZVJlY2VpdmVyXCIvPlxuIiArCi0gICAgICAgICJcdDwvbWVzc2FnZVJlY2VpdmVycz5cbiIgKyAKLSAgICAgICAgIlx0PHBhcmFtZXRlciBuYW1lPVwiU2VydmljZUNsYXNzXCI+IiArIHNlcnZpY2VDbGFzcyArICI8L3BhcmFtZXRlcj5cbiIgOyAKLSAgICAgICAgc2VydmljZVhNTCA9IHNlcnZpY2VYTUwgKyAiPC9zZXJ2aWNlPlxuIjsKLSAgICAgICAgcmV0dXJuIHNlcnZpY2VYTUw7Ci0gICAgfQotCi19Ci0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1zZXJ2aWNlLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9zZXJ2aWNlL2JlYW4vQ2xhc3NGaWxlU2VsZWN0aW9uQmVhbi5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLXNlcnZpY2UtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL3NlcnZpY2UvYmVhbi9DbGFzc0ZpbGVTZWxlY3Rpb25CZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjODkxYjcuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLXNlcnZpY2UtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL3NlcnZpY2UvYmVhbi9DbGFzc0ZpbGVTZWxlY3Rpb25CZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudG9vbC5zZXJ2aWNlLmJlYW47Ci0KLXB1YmxpYyBjbGFzcyBDbGFzc0ZpbGVTZWxlY3Rpb25CZWFuIHsKLSAgICBwcml2YXRlIFN0cmluZyBmaWxlTG9jYXRpb247Ci0gICAgcHJpdmF0ZSBTdHJpbmcgZmlsdGVyOwotCi0gICAgcHVibGljIFN0cmluZyBnZXRGaWxlTG9jYXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBmaWxlTG9jYXRpb247Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RmlsZUxvY2F0aW9uKFN0cmluZyBmaWxlTG9jYXRpb24pIHsKLSAgICAgICAgdGhpcy5maWxlTG9jYXRpb24gPSBmaWxlTG9jYXRpb247Ci0gICAgfQotICAgIAotICAgIAotICAgIC8qKgotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgZmlsdGVyLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmlsdGVyKCkgewotICAgICAgICByZXR1cm4gZmlsdGVyOwotICAgIH0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gZmlsdGVyIFRoZSBmaWx0ZXIgdG8gc2V0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEZpbHRlcihTdHJpbmcgZmlsdGVyKSB7Ci0gICAgICAgIHRoaXMuZmlsdGVyID0gZmlsdGVyOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1zZXJ2aWNlLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9zZXJ2aWNlL2JlYW4vTGlicmFyeVNlbGVjdGlvbkJlYW4uamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1zZXJ2aWNlLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9zZXJ2aWNlL2JlYW4vTGlicmFyeVNlbGVjdGlvbkJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NjMDgyOS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2Utc2VydmljZS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvc2VydmljZS9iZWFuL0xpYnJhcnlTZWxlY3Rpb25CZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50b29sLnNlcnZpY2UuYmVhbjsKLQotcHVibGljIGNsYXNzIExpYnJhcnlTZWxlY3Rpb25CZWFuIHsKLSAgICAKLSAgICBwcml2YXRlIFN0cmluZ1tdIGZpbGVMaXN0ID0gbnVsbDsKLSAgICAKLSAgICAKLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgZmlsZUxpc3QuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZ1tdIGdldEZpbGVMaXN0KCkgewotICAgICAgICByZXR1cm4gZmlsZUxpc3Q7Ci0gICAgfQotICAgIC8qKgotICAgICAqIEBwYXJhbSBmaWxlTGlzdCBUaGUgZmlsZUxpc3QgdG8gc2V0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEZpbGVMaXN0KFN0cmluZ1tdIGZpbGVMaXN0KSB7Ci0gICAgICAgIHRoaXMuZmlsZUxpc3QgPSBmaWxlTGlzdDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2Utc2VydmljZS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvc2VydmljZS9iZWFuL1BhZ2UyQmVhbi5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLXNlcnZpY2UtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL3NlcnZpY2UvYmVhbi9QYWdlMkJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNmZjU5Zi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2Utc2VydmljZS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvc2VydmljZS9iZWFuL1BhZ2UyQmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50b29sLnNlcnZpY2UuYmVhbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBQYWdlMkJlYW4gewotICAgIHByaXZhdGUgYm9vbGVhbiBtYW51YWwgPSBmYWxzZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gYXV0b21hdGljID0gZmFsc2U7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBtYW51YWxGaWxlTmFtZTsKLSAgICBwcml2YXRlIFN0cmluZyBhdXRvbWF0aWNDbGFzc05hbWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgcHJvdmlkZXJDbGFzc05hbWU7Ci0KLSAgICBwcml2YXRlIEFycmF5TGlzdCBzZWxlY3RlZE1ldGhvZE5hbWVzOwotICAgIHByaXZhdGUgU3RyaW5nIHNlcnZpY2VOYW1lOwotICAgIAotICAgIAotICAgIC8qKgotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgc2VydmljZU5hbWUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRTZXJ2aWNlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHNlcnZpY2VOYW1lOwotICAgIH0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gc2VydmljZU5hbWUgVGhlIHNlcnZpY2VOYW1lIHRvIHNldC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlTmFtZShTdHJpbmcgc2VydmljZU5hbWUpIHsKLSAgICAgICAgdGhpcy5zZXJ2aWNlTmFtZSA9IHNlcnZpY2VOYW1lOwotICAgIH0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb3ZpZGVyQ2xhc3NOYW1lKCkgewotICAgICAgICByZXR1cm4gcHJvdmlkZXJDbGFzc05hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UHJvdmlkZXJDbGFzc05hbWUoU3RyaW5nIHByb3ZpZGVyQ2xhc3NOYW1lKSB7Ci0gICAgICAgIHRoaXMucHJvdmlkZXJDbGFzc05hbWUgPSBwcm92aWRlckNsYXNzTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUGFnZTJCZWFuKCkgewotICAgICAgICBzZWxlY3RlZE1ldGhvZE5hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzTWFudWFsKCkgewotICAgICAgICByZXR1cm4gbWFudWFsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE1hbnVhbChib29sZWFuIG1hbnVhbCkgewotICAgICAgICB0aGlzLm1hbnVhbCA9IG1hbnVhbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0F1dG9tYXRpYygpIHsKLSAgICAgICAgcmV0dXJuIGF1dG9tYXRpYzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRBdXRvbWF0aWMoYm9vbGVhbiBhdXRvbWF0aWMpIHsKLSAgICAgICAgdGhpcy5hdXRvbWF0aWMgPSBhdXRvbWF0aWM7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRNYW51YWxGaWxlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG1hbnVhbEZpbGVOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE1hbnVhbEZpbGVOYW1lKFN0cmluZyBtYW51YWxGaWxlTmFtZSkgewotICAgICAgICB0aGlzLm1hbnVhbEZpbGVOYW1lID0gbWFudWFsRmlsZU5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBdXRvbWF0aWNDbGFzc05hbWUoKSB7Ci0gICAgICAgIHJldHVybiBhdXRvbWF0aWNDbGFzc05hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QXV0b21hdGljQ2xhc3NOYW1lKFN0cmluZyBhdXRvbWF0aWNDbGFzc05hbWUpIHsKLSAgICAgICAgdGhpcy5hdXRvbWF0aWNDbGFzc05hbWUgPSBhdXRvbWF0aWNDbGFzc05hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRNZXRob2ROYW1lQ291bnQoKSB7Ci0gICAgICAgIHJldHVybiBzZWxlY3RlZE1ldGhvZE5hbWVzLnNpemUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTZWxlY3RlZE1ldGhvZE5hbWVzKEFycmF5TGlzdCBsaXN0KSB7Ci0gICAgICAgIHRoaXMuc2VsZWN0ZWRNZXRob2ROYW1lcyA9IGxpc3Q7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRNZXRob2ROYW1lKGludCBpbmRleCkgewotICAgICAgICByZXR1cm4gc2VsZWN0ZWRNZXRob2ROYW1lcy5nZXQoaW5kZXgpLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkTWV0aG9kTmFtZShTdHJpbmcgc2VsZWN0ZWRNZXRob2ROYW1lKSB7Ci0gICAgICAgIHRoaXMuc2VsZWN0ZWRNZXRob2ROYW1lcy5hZGQoc2VsZWN0ZWRNZXRob2ROYW1lcyk7Ci0gICAgfQotCi0gICAgcHVibGljIEFycmF5TGlzdCBnZXRTZWxlY3RlZE1ldGhvZE5hbWVzKCkgewotICAgICAgICByZXR1cm4gc2VsZWN0ZWRNZXRob2ROYW1lczsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2Utc2VydmljZS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvc2VydmljZS9iZWFuL1BhZ2UzQmVhbi5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLXNlcnZpY2UtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL3NlcnZpY2UvYmVhbi9QYWdlM0JlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzMyMjdjNi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2Utc2VydmljZS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvc2VydmljZS9iZWFuL1BhZ2UzQmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnRvb2wuc2VydmljZS5iZWFuOwotCi1wdWJsaWMgY2xhc3MgUGFnZTNCZWFuIHsKLSAgICBwcml2YXRlIFN0cmluZyBvdXRwdXRGb2xkZXJOYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIG91dHB1dEZpbGVOYW1lOwotCi0gICAgcHVibGljIFN0cmluZyBnZXRPdXRwdXRGb2xkZXJOYW1lKCkgewotICAgICAgICByZXR1cm4gb3V0cHV0Rm9sZGVyTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRPdXRwdXRGb2xkZXJOYW1lKFN0cmluZyBvdXRwdXRGb2xkZXJOYW1lKSB7Ci0gICAgICAgIHRoaXMub3V0cHV0Rm9sZGVyTmFtZSA9IG91dHB1dEZvbGRlck5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRPdXRwdXRGaWxlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG91dHB1dEZpbGVOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE91dHB1dEZpbGVOYW1lKFN0cmluZyBvdXRwdXRGaWxlTmFtZSkgewotICAgICAgICB0aGlzLm91dHB1dEZpbGVOYW1lID0gb3V0cHV0RmlsZU5hbWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLXNlcnZpY2UtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL3NlcnZpY2UvYmVhbi9XU0RMQXV0b0dlbmVyYXRlT3B0aW9uQmVhbi5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLXNlcnZpY2UtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL3NlcnZpY2UvYmVhbi9XU0RMQXV0b0dlbmVyYXRlT3B0aW9uQmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzNhOWY5Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1zZXJ2aWNlLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9zZXJ2aWNlL2JlYW4vV1NETEF1dG9HZW5lcmF0ZU9wdGlvbkJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50b29sLnNlcnZpY2UuYmVhbjsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLQotcHVibGljIGNsYXNzIFdTRExBdXRvR2VuZXJhdGVPcHRpb25CZWFuIHsKLSAgICAvL3Jlc3Qgb2YgdGhlIHBhcmFtZXRlcnMgYXJlIHRha2VuIGZyb20gb3RoZXIKLSAgICAvL2JlYW5zCi0gICAgcHJpdmF0ZSBTdHJpbmcgY2xhc3NGaWxlTmFtZTsKLSAgICBwcml2YXRlIFN0cmluZyBzdHlsZTsKLSAgICBwcml2YXRlIFN0cmluZyBvdXRwdXRGaWxlTmFtZTsKLSAgICBwcml2YXRlIFZlY3RvciBsaXN0T2ZNZXRob2RzOwotICAgIAotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBvdXRwdXRGaWxlTmFtZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE91dHB1dEZpbGVOYW1lKCkgewotICAgICAgICByZXR1cm4gb3V0cHV0RmlsZU5hbWU7Ci0gICAgfQotICAgIC8qKgotICAgICAqIEBwYXJhbSBvdXRwdXRGaWxlTmFtZSBUaGUgb3V0cHV0RmlsZU5hbWUgdG8gc2V0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE91dHB1dEZpbGVOYW1lKFN0cmluZyBvdXRwdXRGaWxlTmFtZSkgewotICAgICAgICB0aGlzLm91dHB1dEZpbGVOYW1lID0gb3V0cHV0RmlsZU5hbWU7Ci0gICAgfQotICAgIC8qKgotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgY2xhc3NGaWxlTmFtZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzRmlsZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBjbGFzc0ZpbGVOYW1lOwotICAgIH0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gY2xhc3NGaWxlTmFtZSBUaGUgY2xhc3NGaWxlTmFtZSB0byBzZXQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q2xhc3NGaWxlTmFtZShTdHJpbmcgY2xhc3NGaWxlTmFtZSkgewotICAgICAgICB0aGlzLmNsYXNzRmlsZU5hbWUgPSBjbGFzc0ZpbGVOYW1lOwotICAgIH0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHN0eWxlLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3R5bGUoKSB7Ci0gICAgICAgIHJldHVybiBzdHlsZTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogQHBhcmFtIHN0eWxlIFRoZSBzdHlsZSB0byBzZXQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U3R5bGUoU3RyaW5nIHN0eWxlKSB7Ci0gICAgICAgIHRoaXMuc3R5bGUgPSBzdHlsZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBsaXN0T2ZNZXRob2RzLgotICAgICAqLwotICAgIHB1YmxpYyBWZWN0b3IgZ2V0TGlzdE9mTWV0aG9kcygpIHsKLSAgICAgICAgcmV0dXJuIGxpc3RPZk1ldGhvZHM7Ci0gICAgfQotICAgIC8qKgotICAgICAqIEBwYXJhbSBsaXN0T2ZNZXRob2RzIFRoZSBsaXN0T2ZNZXRob2RzIHRvIHNldC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRMaXN0T2ZNZXRob2RzKFZlY3RvciBsaXN0T2ZNZXRob2RzKSB7Ci0gICAgICAgIHRoaXMubGlzdE9mTWV0aG9kcyA9IGxpc3RPZk1ldGhvZHM7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLXNlcnZpY2UtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL3NlcnZpY2UvYmVhbi9XU0RMRmlsZUxvY2F0aW9uQmVhbi5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLXNlcnZpY2UtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL3NlcnZpY2UvYmVhbi9XU0RMRmlsZUxvY2F0aW9uQmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDI3MGY3Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1zZXJ2aWNlLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9zZXJ2aWNlL2JlYW4vV1NETEZpbGVMb2NhdGlvbkJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50b29sLnNlcnZpY2UuYmVhbjsKLQotcHVibGljIGNsYXNzIFdTRExGaWxlTG9jYXRpb25CZWFuIHsKLQotICAgIHByaXZhdGUgU3RyaW5nIFdTRExGaWxlTmFtZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gbWFudWFsOwotICAgIHByaXZhdGUgYm9vbGVhbiBza2lwOwotICAgIAotICAgIAotICAgIAotICAgIC8qKgotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgc2tpcC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1NraXAoKSB7Ci0gICAgICAgIHJldHVybiBza2lwOwotICAgIH0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gc2tpcCBUaGUgc2tpcCB0byBzZXQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U2tpcChib29sZWFuIHNraXApIHsKLSAgICAgICAgdGhpcy5za2lwID0gc2tpcDsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBtYW51YWwuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNNYW51YWwoKSB7Ci0gICAgICAgIHJldHVybiBtYW51YWw7Ci0gICAgfQotICAgIC8qKgotICAgICAqIEBwYXJhbSBtYW51YWwgVGhlIG1hbnVhbCB0byBzZXQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TWFudWFsKGJvb2xlYW4gbWFudWFsKSB7Ci0gICAgICAgIHRoaXMubWFudWFsID0gbWFudWFsOwotICAgIH0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHdTRExGaWxlTmFtZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFdTRExGaWxlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIFdTRExGaWxlTmFtZTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogQHBhcmFtIGZpbGVOYW1lIFRoZSB3U0RMRmlsZU5hbWUgdG8gc2V0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFdTRExGaWxlTmFtZShTdHJpbmcgZmlsZU5hbWUpIHsKLSAgICAgICAgV1NETEZpbGVOYW1lID0gZmlsZU5hbWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLXNlcnZpY2UtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL3NlcnZpY2UvYmVhbi9XaXphcmRCZWFuLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2Utc2VydmljZS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvc2VydmljZS9iZWFuL1dpemFyZEJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDliN2IxMy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2Utc2VydmljZS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvc2VydmljZS9iZWFuL1dpemFyZEJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50b29sLnNlcnZpY2UuYmVhbjsKLQotcHVibGljIGNsYXNzIFdpemFyZEJlYW4gewotICAgIHByaXZhdGUgQ2xhc3NGaWxlU2VsZWN0aW9uQmVhbiBjbGFzc0ZpbGVCZWFuOwotICAgIHByaXZhdGUgV1NETEZpbGVMb2NhdGlvbkJlYW4gd3NkbEJlYW47Ci0gICAgcHJpdmF0ZSBMaWJyYXJ5U2VsZWN0aW9uQmVhbiBsaWJyYXJ5QmVhbjsKLSAgICAKLSAgICBwcml2YXRlIFBhZ2UyQmVhbiBwYWdlMmJlYW47Ci0gICAgcHJpdmF0ZSBQYWdlM0JlYW4gcGFnZTNiZWFuOwotICAgIAotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBsaWJyYXJ5QmVhbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgTGlicmFyeVNlbGVjdGlvbkJlYW4gZ2V0TGlicmFyeUJlYW4oKSB7Ci0gICAgICAgIHJldHVybiBsaWJyYXJ5QmVhbjsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogQHBhcmFtIGxpYnJhcnlCZWFuIFRoZSBsaWJyYXJ5QmVhbiB0byBzZXQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TGlicmFyeUJlYW4oTGlicmFyeVNlbGVjdGlvbkJlYW4gbGlicmFyeUJlYW4pIHsKLSAgICAgICAgdGhpcy5saWJyYXJ5QmVhbiA9IGxpYnJhcnlCZWFuOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHdzZGxCZWFuLgotICAgICAqLwotICAgIHB1YmxpYyBXU0RMRmlsZUxvY2F0aW9uQmVhbiBnZXRXc2RsQmVhbigpIHsKLSAgICAgICAgcmV0dXJuIHdzZGxCZWFuOwotICAgIH0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gd3NkbEJlYW4gVGhlIHdzZGxCZWFuIHRvIHNldC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRXc2RsQmVhbihXU0RMRmlsZUxvY2F0aW9uQmVhbiB3c2RsQmVhbikgewotICAgICAgICB0aGlzLndzZGxCZWFuID0gd3NkbEJlYW47Ci0gICAgfQotICAgIHB1YmxpYyBDbGFzc0ZpbGVTZWxlY3Rpb25CZWFuIGdldFBhZ2UxYmVhbigpIHsKLSAgICAgICAgcmV0dXJuIGNsYXNzRmlsZUJlYW47Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGFnZTFiZWFuKENsYXNzRmlsZVNlbGVjdGlvbkJlYW4gcGFnZTFiZWFuKSB7Ci0gICAgICAgIHRoaXMuY2xhc3NGaWxlQmVhbiA9IHBhZ2UxYmVhbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUGFnZTJCZWFuIGdldFBhZ2UyYmVhbigpIHsKLSAgICAgICAgcmV0dXJuIHBhZ2UyYmVhbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYWdlMmJlYW4oUGFnZTJCZWFuIHBhZ2UyYmVhbikgewotICAgICAgICB0aGlzLnBhZ2UyYmVhbiA9IHBhZ2UyYmVhbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUGFnZTNCZWFuIGdldFBhZ2UzYmVhbigpIHsKLSAgICAgICAgcmV0dXJuIHBhZ2UzYmVhbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYWdlM2JlYW4oUGFnZTNCZWFuIHBhZ2UzYmVhbikgewotICAgICAgICB0aGlzLnBhZ2UzYmVhbiA9IHBhZ2UzYmVhbjsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1zZXJ2aWNlLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9zZXJ2aWNlL2NvbnRyb2wvQ29udHJvbGxlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLXNlcnZpY2UtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL3NlcnZpY2UvY29udHJvbC9Db250cm9sbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxNGRmMTAuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLXNlcnZpY2UtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL3NlcnZpY2UvY29udHJvbC9Db250cm9sbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnRvb2wuc2VydmljZS5jb250cm9sOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29sLmNvcmUuQ2xhc3NGaWxlSGFuZGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRvb2wuY29yZS5GaWxlQ29waWVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbC5jb3JlLkphckZpbGVXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29sLmNvcmUuU2VydmljZVhNTENyZWF0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29sLnNlcnZpY2UuYmVhbi5DbGFzc0ZpbGVTZWxlY3Rpb25CZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbC5zZXJ2aWNlLmJlYW4uTGlicmFyeVNlbGVjdGlvbkJlYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29sLnNlcnZpY2UuYmVhbi5QYWdlMkJlYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29sLnNlcnZpY2UuYmVhbi5QYWdlM0JlYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29sLnNlcnZpY2UuYmVhbi5XU0RMRmlsZUxvY2F0aW9uQmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRvb2wuc2VydmljZS5iZWFuLldpemFyZEJlYW47Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1wdWJsaWMgY2xhc3MgQ29udHJvbGxlciB7Ci0KLSAgICBwdWJsaWMgQXJyYXlMaXN0IGdldE1ldGhvZExpc3QoV2l6YXJkQmVhbiBiZWFuKSB0aHJvd3MgUHJvY2Vzc0V4Y2VwdGlvbiB7Ci0gICAgICAgIEFycmF5TGlzdCByZXR1cm5MaXN0ID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybkxpc3QgPQotICAgICAgICAgICAgICAgICAgICBuZXcgQ2xhc3NGaWxlSGFuZGxlcigpLmdldE1ldGhvZE5hbWVzRnJvbUNsYXNzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlYW4uZ2V0UGFnZTJiZWFuKCkuZ2V0QXV0b21hdGljQ2xhc3NOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVhbi5nZXRQYWdlMWJlYW4oKS5nZXRGaWxlTG9jYXRpb24oKSk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBQcm9jZXNzRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiSU8gRXJyb3IsIFRoZSBjbGFzcyBmaWxlIGxvY2F0aW9uIG1heSBiZSBmYXVsdHkhIiwgZSk7Ci0gICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFByb2Nlc3NFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICIgVGhlIHNwZWNpZmllZCBjbGFzcyBkb2VzIG5vdCBleGlzdCEhISIpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFByb2Nlc3NFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICJVbmtub3duIEVycm9yISBTZWUgd2hldGhlciBhbGwgcGFyYW1ldGVycyBhcmUgYXZhaWxhYmxlIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldHVybkxpc3Q7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzKFdpemFyZEJlYW4gYmVhbikgdGhyb3dzIFByb2Nlc3NFeGNlcHRpb24sIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgQ2xhc3NGaWxlU2VsZWN0aW9uQmVhbiBwYWdlMUJlYW4gPSBiZWFuLmdldFBhZ2UxYmVhbigpOwotICAgICAgICBXU0RMRmlsZUxvY2F0aW9uQmVhbiB3c2RsQmVhbiA9IGJlYW4uZ2V0V3NkbEJlYW4oKTsKLSAgICAgICAgTGlicmFyeVNlbGVjdGlvbkJlYW4gbGliQmVhbiA9IGJlYW4uZ2V0TGlicmFyeUJlYW4oKTsKLSAgICAgICAgUGFnZTJCZWFuIHBhZ2UyQmVhbiA9IGJlYW4uZ2V0UGFnZTJiZWFuKCk7Ci0gICAgICAgIFBhZ2UzQmVhbiBwYWdlM0JlYW4gPSBiZWFuLmdldFBhZ2UzYmVhbigpOwotCi0gICAgICAgIEZpbGUgc2VydmljZUZpbGUgPSBudWxsOwotICAgICAgICBGaWxlIHdzZGxGaWxlID0gbnVsbDsKLSAgICAgICAgRmlsZSBjbGFzc0ZpbGVGb2xkZXIgPSBudWxsOwotICAgICAgICBGaWxlIG91dHB1dEZvbGRlciA9IG51bGw7Ci0gICAgICAgIFN0cmluZyBvdXRwdXRGaWxlTmFtZSA9IG51bGw7Ci0gICAgICAgIGJvb2xlYW4gaXNTZXJ2aWNlQ3JlYXRlZCA9IGZhbHNlOwotICAgICAgICBib29sZWFuIGlzV1NETEF2YWlsYWJsZSA9IGZhbHNlOwotCi0gICAgICAgIC8vc2VlIGlmIHRoZSBjbGFzcyBmaWxlIGxvY2F0aW9uIGlzIHZhbGlkCi0gICAgICAgIGNsYXNzRmlsZUZvbGRlciA9IG5ldyBGaWxlKHBhZ2UxQmVhbi5nZXRGaWxlTG9jYXRpb24oKSk7Ci0gICAgICAgIGlmICghY2xhc3NGaWxlRm9sZGVyLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUHJvY2Vzc0V4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIlNwZWNpZmllZCBDbGFzcyBmaWxlIGxvY2F0aW9uIGlzIGVtcHR5ISEiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIWNsYXNzRmlsZUZvbGRlci5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUHJvY2Vzc0V4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIlRoZSBjbGFzcyBmaWxlIGxvY2F0aW9uIG11c3QgYmUgYSBmb2xkZXIhIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvL3NlZSBpZiB0aGUgIHNlcnZpY2UueG1sIGZpbGUgaXMgdmFsaWQKLSAgICAgICAgaWYgKHBhZ2UyQmVhbi5pc01hbnVhbCgpKSB7Ci0gICAgICAgICAgICBzZXJ2aWNlRmlsZSA9IG5ldyBGaWxlKHBhZ2UyQmVhbi5nZXRNYW51YWxGaWxlTmFtZSgpKTsKLSAgICAgICAgICAgIGlmICghc2VydmljZUZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUHJvY2Vzc0V4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICJTcGVjaWZpZWQgU2VydmljZSBYTUwgZmlsZSBpcyBtaXNzaW5nISIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQXJyYXlMaXN0IG1ldGhvZExpc3QgPSBwYWdlMkJlYW4uZ2V0U2VsZWN0ZWRNZXRob2ROYW1lcygpOwotICAgICAgICAgICAgaWYgKG1ldGhvZExpc3QuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFByb2Nlc3NFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAiVGhlcmUgYXJlIG5vIG1ldGhvZHMgc2VsZWN0ZWQgdG8gZ2VuZXJhdGUgdGhlIHNlcnZpY2UhISIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgU3RyaW5nIGN1cnJlbnRVc2VyRGlyID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmRpciIpOwotICAgICAgICAgICAgU3RyaW5nIGZpbGVOYW1lID0gInNlcnZpY2VzLnhtbCI7Ci0gICAgICAgICAgICBTZXJ2aWNlWE1MQ3JlYXRlciBzZXJ2aWNlWE1MQ3JlYXRlciA9IG5ldyBTZXJ2aWNlWE1MQ3JlYXRlcihwYWdlMkJlYW4uZ2V0U2VydmljZU5hbWUoKSwKLSAgICAgICAgICAgIAkJCQkJCQkJCQkJCSBwYWdlMkJlYW4uZ2V0QXV0b21hdGljQ2xhc3NOYW1lKCksCi0gICAgICAgICAgICAJCQkJCQkJCQkJCQkgcGFnZTJCZWFuLmdldFNlbGVjdGVkTWV0aG9kTmFtZXMoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgc2VydmljZUZpbGVTdHJpbmcgPSBzZXJ2aWNlWE1MQ3JlYXRlci50b1N0cmluZygpOwotICAgICAgICAgICAgCXNlcnZpY2VGaWxlID0gbmV3IEZpbGUoY3VycmVudFVzZXJEaXIgKyBGaWxlLnNlcGFyYXRvciArIGZpbGVOYW1lKTsKLSAgICAgICAgICAgIGlmIChzZXJ2aWNlRmlsZS5leGlzdHMoKSl7c2VydmljZUZpbGUuZGVsZXRlKCk7fQotICAgICAgICAgICAgRmlsZVdyaXRlciBzZXJ2aWNlWE1MRmlsZVdyaXRlciA9IG5ldyBGaWxlV3JpdGVyKHNlcnZpY2VGaWxlLCB0cnVlKTsKLSAgICAgICAgICAgIEJ1ZmZlcmVkV3JpdGVyIHdyaXRlciA9IG5ldyBCdWZmZXJlZFdyaXRlcihzZXJ2aWNlWE1MRmlsZVdyaXRlcikgOwotICAgICAgICAgICAgd3JpdGVyLndyaXRlKHNlcnZpY2VGaWxlU3RyaW5nKSA7Ci0gICAgICAgICAgICB3cml0ZXIuY2xvc2UoKSA7Ci0gICAgICAgICAgICAKLS8vICAgICAgICAgICAgICAgICAgICBuZXcgU2VydmljZUZpbGVDcmVhdG9yKCkuY3JlYXRlU2VydmljZUZpbGUoCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlMkJlYW4uZ2V0U2VydmljZU5hbWUoKSwKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UyQmVhbi5nZXRBdXRvbWF0aWNDbGFzc05hbWUoKSwKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UyQmVhbi5nZXRTZWxlY3RlZE1ldGhvZE5hbWVzKCkpOy8vY3JlYXRlIHRoZSBmaWxlIGhlcmUKLSAgICAgICAgICAgIAkKLSAgICAgICAgICAgIGlzU2VydmljZUNyZWF0ZWQgPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy9zZWUgaWYgdGhlIFdTREwgZmlsZSBpcyBhdmFpbGFibGUKLSAgICAgICAgaWYgKCF3c2RsQmVhbi5pc1NraXAoKSl7Ci0gICAgICAgICAgICB3c2RsRmlsZSA9IG5ldyBGaWxlKHdzZGxCZWFuLmdldFdTRExGaWxlTmFtZSgpKTsKLSAgICAgICAgICAgIGlmICghd3NkbEZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUHJvY2Vzc0V4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICJTcGVjaWZpZWQgV1NETCBmaWxlIGlzIG1pc3NpbmchIik7Ci0gICAgICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgICAgICBpc1dTRExBdmFpbGFibGUgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBMaXN0IGZpbGVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAvL2NoZWNrIHRoZSBsaWJzCi0gICAgICAgIGlmIChsaWJCZWFuIT1udWxsKXsKLSAgICAgICAgICAgIFN0cmluZ1tdIGZpbGVzID0gbGliQmVhbi5nZXRGaWxlTGlzdCgpOwotICAgICAgICAgICAgRmlsZSB0ZW1wRmlsZSA9IG51bGw7Ci0gICAgICAgICAgICBpZiAoZmlsZXMhPW51bGwpewotICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wO2k8ZmlsZXMubGVuZ3RoO2krKyl7Ci0gICAgICAgICAgICAgICAgIHRlbXBGaWxlID0gbmV3IEZpbGUoZmlsZXNbaV0pOyAKLSAgICAgICAgICAgICAgICAgaWYgKCF0ZW1wRmlsZS5leGlzdHMoKXx8dGVtcEZpbGUuaXNEaXJlY3RvcnkoKSl7Ci0gICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUHJvY2Vzc0V4Y2VwdGlvbigiSW52YWxpZCBsaWJyYXJpZXMiKTsKLSAgICAgICAgICAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICAgICAgICAgICBmaWxlTGlzdC5hZGQodGVtcEZpbGUpOwotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIG91dHB1dEZvbGRlciA9IG5ldyBGaWxlKHBhZ2UzQmVhbi5nZXRPdXRwdXRGb2xkZXJOYW1lKCkpOwotICAgICAgICBvdXRwdXRGaWxlTmFtZSA9IHBhZ2UzQmVhbi5nZXRPdXRwdXRGaWxlTmFtZSgpOwotICAgICAgICBpZiAoIW91dHB1dEZpbGVOYW1lLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoIi5qYXIiKSAmJiAhb3V0cHV0RmlsZU5hbWUudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgiLmFhciIpKSB7Ci0gICAgICAgICAgICBvdXRwdXRGaWxlTmFtZSA9IG91dHB1dEZpbGVOYW1lICsgIi5hYXIiOwotICAgICAgICB9Ci0KLSAgICAgICAgRmlsZSB0ZW1wRmlsZUZvbGRlciA9IG51bGw7Ci0gICAgICAgIFN0cmluZyB4bWxGaWx0ZXIgPSAiLnhtbCI7Ci0gICAgICAgIFN0cmluZyB3c2RsRmlsdGVyID0gIi53c2RsIjsKLQotICAgICAgICB0cnkgewotICAgICAgICAJU3RyaW5nIG1ldGFJbmZGb2xkZXJOYW1lPSJNRVRBLUlORiI7Ci0gICAgICAgIAlTdHJpbmcgbGliRm9sZGVyTmFtZT0ibGliIjsKLSAgICAgICAgCQotICAgICAgICAgICAgLy9jcmVhdGUgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IGFuZCBjb3B5IHRoZSBmaWxlcwotICAgICAgICAgICAgdGVtcEZpbGVGb2xkZXIgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJ0ZW1wIiwiLnRtcCIpOwotICAgICAgICAgICAgdGVtcEZpbGVGb2xkZXIuZGVsZXRlT25FeGl0KCk7Ci0gICAgICAgICAgICBpZiAodGVtcEZpbGVGb2xkZXIuZXhpc3RzKCkpe2RlbGV0ZURpcih0ZW1wRmlsZUZvbGRlcik7fQotICAgICAgICAgICAgdGVtcEZpbGVGb2xkZXIubWtkaXIoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgRmlsZSBtZXRhSW5mRm9sZGVyID0gbmV3IEZpbGUodGVtcEZpbGVGb2xkZXIsIG1ldGFJbmZGb2xkZXJOYW1lKTsKLSAgICAgICAgICAgIG1ldGFJbmZGb2xkZXIubWtkaXIoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgRmlsZSBsaWJGb2xkZXIgPSBuZXcgRmlsZSh0ZW1wRmlsZUZvbGRlcixsaWJGb2xkZXJOYW1lKTsKLSAgICAgICAgICAgIGxpYkZvbGRlci5ta2RpcigpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBGaWxlQ29waWVyIGNsYXNzRmlsZWNvcGllciA9IG5ldyBGaWxlQ29waWVyKCk7Ci0gICAgICAgICAgICAvL2NvcHkgdGhlIGNsYXNzZXMKLSAgICAgICAgICAgIGNsYXNzRmlsZWNvcGllci5jb3B5RmlsZXMoY2xhc3NGaWxlRm9sZGVyLCB0ZW1wRmlsZUZvbGRlcixwYWdlMUJlYW4uZ2V0RmlsdGVyKCkpOwotICAgICAgICAgICAKLSAgICAgICAgICAgIC8vY29weSB0aGUgc2VydmljZS54bWwKLSAgICAgICAgICAgIEZpbGVDb3BpZXIgc2VydmljZVhNTGNvcGllciA9IG5ldyBGaWxlQ29waWVyKCk7Ci0gICAgICAgICAgICBzZXJ2aWNlWE1MY29waWVyLmNvcHlGaWxlcyhzZXJ2aWNlRmlsZSwgbWV0YUluZkZvbGRlcix4bWxGaWx0ZXIpOwotICAgICAgICAgICAKLSAgICAgICAgICAgIC8vY29weSB0aGUgbGlicwotICAgICAgICAgICAgRmlsZUNvcGllciBsaWJDb3BpZXIgPSBuZXcgRmlsZUNvcGllcigpOwotICAgICAgICAgICAgZm9yIChpbnQgaT0wO2kgPCBmaWxlTGlzdC5zaXplKCk7aSsrKXsKLSAgICAgICAgICAgIAlsaWJDb3BpZXIuY29weUZpbGVzKChGaWxlKWZpbGVMaXN0LmdldChpKSxsaWJGb2xkZXIsbnVsbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChpc1dTRExBdmFpbGFibGUpewotICAgICAgICAgICAgICAgIG5ldyBGaWxlQ29waWVyKCkuY29weUZpbGVzKHdzZGxGaWxlLCBtZXRhSW5mRm9sZGVyLHdzZGxGaWx0ZXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy9qYXIgdGhlIHRlbXAgZGlyZWN0b3J5LiB0aGUgb3V0cHV0IGZvbGRlciB3aWxsIGJlIGNyZWF0ZWQgaWYgbWlzc2luZwotICAgICAgICAgICAgCi0gICAgICAgICAgICBuZXcgSmFyRmlsZVdyaXRlcigpLndyaXRlSmFyRmlsZShvdXRwdXRGb2xkZXIsCi0gICAgICAgICAgICAgICAgICAgIG91dHB1dEZpbGVOYW1lLAotICAgICAgICAgICAgICAgICAgICB0ZW1wRmlsZUZvbGRlcik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUHJvY2Vzc0V4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGRlbGV0ZURpcih0ZW1wRmlsZUZvbGRlcik7Ci0gICAgICAgICAgICAgaWYgKGlzU2VydmljZUNyZWF0ZWQpCi0gICAgICAgICAgICAgICAgc2VydmljZUZpbGUuZGVsZXRlKCk7Ci0gICAgICAgIH0KLQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlICBib29sZWFuIGRlbGV0ZURpcihGaWxlIGRpcikgewotICAgICAgICBpZiAoZGlyLmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgIFN0cmluZ1tdIGNoaWxkcmVuID0gZGlyLmxpc3QoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9IGRlbGV0ZURpcihuZXcgRmlsZShkaXIsIGNoaWxkcmVuW2ldKSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFzdWNjZXNzKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAKLSAgICAgICAgLy8gVGhlIGRpcmVjdG9yeSBpcyBub3cgZW1wdHkgc28gZGVsZXRlIGl0Ci0gICAgICAgIHJldHVybiBkaXIuZGVsZXRlKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLXNlcnZpY2UtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL3NlcnZpY2UvY29udHJvbC9Qcm9jZXNzRXhjZXB0aW9uLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2Utc2VydmljZS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvc2VydmljZS9jb250cm9sL1Byb2Nlc3NFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU5NDQxNC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2Utc2VydmljZS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvc2VydmljZS9jb250cm9sL1Byb2Nlc3NFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50b29sLnNlcnZpY2UuY29udHJvbDsKLQotcHVibGljIGNsYXNzIFByb2Nlc3NFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewotICAgIHB1YmxpYyBQcm9jZXNzRXhjZXB0aW9uKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBQcm9jZXNzRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9jZXNzRXhjZXB0aW9uKFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICBzdXBlcihjYXVzZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFByb2Nlc3NFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlLCBjYXVzZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLXNlcnZpY2UtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL3NlcnZpY2UvZWNsaXBzZS9wbHVnaW4vU2VydmljZUFyY2hpdmVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2Utc2VydmljZS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvc2VydmljZS9lY2xpcHNlL3BsdWdpbi9TZXJ2aWNlQXJjaGl2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU3Y2Y4Yi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2Utc2VydmljZS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvc2VydmljZS9lY2xpcHNlL3BsdWdpbi9TZXJ2aWNlQXJjaGl2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudG9vbC5zZXJ2aWNlLmVjbGlwc2UucGx1Z2luOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLS8qKgotICogVGhlIG1haW4gcGx1Z2luIGNsYXNzIHRvIGJlIHVzZWQgaW4gdGhlIGRlc2t0b3AuCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlQXJjaGl2ZXIgZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLSAgICAvL1RoZSBzaGFyZWQgaW5zdGFuY2UuCi0gICAgcHJpdmF0ZSBzdGF0aWMgU2VydmljZUFyY2hpdmVyIHBsdWdpbjsKLSAgICAvL1Jlc291cmNlIGJ1bmRsZS4KLSAgICBwcml2YXRlIFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlOwotICAgIHByaXZhdGUgc3RhdGljIEltYWdlRGVzY3JpcHRvciB3aXphcmRJbWFnZURlc2NyaXB0b3I7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY29uc3RydWN0b3IuCi0gICAgICovCi0gICAgcHVibGljIFNlcnZpY2VBcmNoaXZlcigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgcGx1Z2luID0gdGhpczsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJlc291cmNlQnVuZGxlID0KLSAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmF4aXMyLnRvb2wuc2VydmljZS5yZXNvdXJjZS5TZXJ2aWNlUmVzb3VyY2VzIik7Ci0gICAgICAgIH0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB4KSB7Ci0gICAgICAgICAgICByZXNvdXJjZUJ1bmRsZSA9IG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdXBvbiBwbHVnLWluIGFjdGl2YXRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zdGFydChjb250ZXh0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgcGx1Zy1pbiBpcyBzdG9wcGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zdG9wKGNvbnRleHQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFNlcnZpY2VBcmNoaXZlciBnZXREZWZhdWx0KCkgewotICAgICAgICByZXR1cm4gcGx1Z2luOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHN0cmluZyBmcm9tIHRoZSBwbHVnaW4ncyByZXNvdXJjZSBidW5kbGUsCi0gICAgICogb3IgJ2tleScgaWYgbm90IGZvdW5kLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXkpIHsKLSAgICAgICAgUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gU2VydmljZUFyY2hpdmVyLmdldERlZmF1bHQoKS5nZXRSZXNvdXJjZUJ1bmRsZSgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIChidW5kbGUgIT0gbnVsbCkgPyBidW5kbGUuZ2V0U3RyaW5nKGtleSkgOiBrZXk7Ci0gICAgICAgIH0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXR1cm4ga2V5OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcGx1Z2luJ3MgcmVzb3VyY2UgYnVuZGxlLAotICAgICAqLwotICAgIHB1YmxpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpIHsKLSAgICAgICAgcmV0dXJuIHJlc291cmNlQnVuZGxlOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGdldFdpemFyZEltYWdlRGVzY3JpcHRvcigpIHsKLSAgICAgICAgaWYgKHdpemFyZEltYWdlRGVzY3JpcHRvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB3aXphcmRJbWFnZURlc2NyaXB0b3IgPQotICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlQXJjaGl2ZXIuaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXhpc19TZXJ2aWNlX0FyY2hpdmVyIiwgImljb25zL2FzZi1mZWF0aGVyLmdpZiIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB3aXphcmRJbWFnZURlc2NyaXB0b3I7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLXNlcnZpY2UtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL3NlcnZpY2UvZWNsaXBzZS91aS9BYnN0cmFjdFNlcnZpY2VXaXphcmRQYWdlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2Utc2VydmljZS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvc2VydmljZS9lY2xpcHNlL3VpL0Fic3RyYWN0U2VydmljZVdpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDMxOWQyNS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2Utc2VydmljZS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvc2VydmljZS9lY2xpcHNlL3VpL0Fic3RyYWN0U2VydmljZVdpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50b29sLnNlcnZpY2UuZWNsaXBzZS51aTsKLQotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29sLnNlcnZpY2UuZWNsaXBzZS5wbHVnaW4uU2VydmljZUFyY2hpdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbC5zZXJ2aWNlLmVjbGlwc2UudXRpbC5TZXR0aW5nc0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZTsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RTZXJ2aWNlV2l6YXJkUGFnZSBleHRlbmRzIFdpemFyZFBhZ2UgaW1wbGVtZW50cyBTZXR0aW5nc0NvbnN0YW50c3sKLSAgICBwcm90ZWN0ZWQgSURpYWxvZ1NldHRpbmdzIHNldHRpbmdzOwotICAgIHByb3RlY3RlZCBib29sZWFuIHJlc3RvcmVkRnJvbVByZXZpb3VzU2V0dGluZ3MgPSBmYWxzZTsKLSAgICAKLSAgICBwdWJsaWMgQWJzdHJhY3RTZXJ2aWNlV2l6YXJkUGFnZShTdHJpbmcgcGFnZU5hbWUpewotICAgICAgICBzdXBlcihwYWdlTmFtZSsiLm5hbWUiKTsKLSAgICAgICAgaW5pdChwYWdlTmFtZSk7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIGluaXQoU3RyaW5nIHBhZ2VOYW1lKXsKLSAgICAgICAgc2V0VGl0bGUoU2VydmljZUFyY2hpdmVyLmdldFJlc291cmNlU3RyaW5nKHBhZ2VOYW1lKyIudGl0bGUiKSk7Ci0gICAgICAgIHNldERlc2NyaXB0aW9uKFNlcnZpY2VBcmNoaXZlci5nZXRSZXNvdXJjZVN0cmluZyhwYWdlTmFtZSsiLmRlc2MiKSk7Ci0gICAgICAgIHNldEltYWdlRGVzY3JpcHRvcihTZXJ2aWNlQXJjaGl2ZXIuZ2V0V2l6YXJkSW1hZ2VEZXNjcmlwdG9yKCkpOwotICAgICAgICAKLSAgICAgICAgLyoKLSAgICAgICAgICogR2V0IHRoZSBzZXR0aW5ncyBmb3IgdGhpcyBwYWdlLiBJZiB0aGVyZSBpcyBubyBzZWN0aW9uIGluIHRoZQotICAgICAgICAgKiBQbHVnaW4ncyBzZXR0aW5ncyBmb3IgdGhpcyBPcHRpb25zUGFnZSwgY3JlYXRlIGEgbmV3IHNlY3Rpb24KLSAgICAgICAgICovCi0gICAgICAgIElEaWFsb2dTZXR0aW5ncyByb290U2V0dGluZ3MgPSBTZXJ2aWNlQXJjaGl2ZXIuZ2V0RGVmYXVsdCgpCi0gICAgICAgICAgICAgICAgLmdldERpYWxvZ1NldHRpbmdzKCk7Ci0gICAgICAgIElEaWFsb2dTZXR0aW5ncyBzZWN0aW9uID0gcm9vdFNldHRpbmdzLmdldFNlY3Rpb24odGhpcy5nZXRDbGFzcygpCi0gICAgICAgICAgICAgICAgLmdldE5hbWUoKSk7Ci0gICAgICAgIGlmIChzZWN0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgIHNldHRpbmdzID0gcm9vdFNldHRpbmdzLmFkZE5ld1NlY3Rpb24odGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICByZXN0b3JlZEZyb21QcmV2aW91c1NldHRpbmdzID0gZmFsc2U7Ci0gICAgICAgICAgICBpbml0aWFsaXplRGVmYXVsdFNldHRpbmdzKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXN0b3JlZEZyb21QcmV2aW91c1NldHRpbmdzPXRydWU7Ci0gICAgICAgICAgICBzZXR0aW5ncyA9IHNlY3Rpb247Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVTdGF0dXMoU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgc2V0RXJyb3JNZXNzYWdlKG1lc3NhZ2UpOwotICAgICAgICBzZXRQYWdlQ29tcGxldGUobWVzc2FnZSA9PSBudWxsKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBpbml0aWFsaXplRGVmYXVsdFNldHRpbmdzKCk7IAotICAgIAotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIGdldFdpemFyZENvbXBsZXRlKCk7IAotICAgIAotICAgIC8vRGVmYXVsdCBpbXBsZW1lbnRhdGlvbgotICAgIHB1YmxpYyBib29sZWFuIGlzU2tpcE5leHQoKXsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICAvL3B1YmxpYyBhYnN0cmFjdCBXaXphcmRCZWFuIGdldEJlYW4oKTsKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1zZXJ2aWNlLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9zZXJ2aWNlL2VjbGlwc2UvdWkvQ2xhc3NGaWxlTG9jYXRpb25QYWdlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2Utc2VydmljZS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvc2VydmljZS9lY2xpcHNlL3VpL0NsYXNzRmlsZUxvY2F0aW9uUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmM0ZTc4Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1zZXJ2aWNlLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9zZXJ2aWNlL2VjbGlwc2UvdWkvQ2xhc3NGaWxlTG9jYXRpb25QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnRvb2wuc2VydmljZS5lY2xpcHNlLnVpOwotCi0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRvb2wuc2VydmljZS5iZWFuLkNsYXNzRmlsZVNlbGVjdGlvbkJlYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29sLnNlcnZpY2UuZWNsaXBzZS5wbHVnaW4uU2VydmljZUFyY2hpdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXJlY3RvcnlEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotCi1wdWJsaWMgY2xhc3MgQ2xhc3NGaWxlTG9jYXRpb25QYWdlIGV4dGVuZHMgQWJzdHJhY3RTZXJ2aWNlV2l6YXJkUGFnZXsKLQotICAgIHByaXZhdGUgVGV4dCBjbGFzc0ZpbGVMb2NhdGlvblRleHQ7Ci0gICAgcHJpdmF0ZSBCdXR0b24gZmlsdGVyQnlDbGFzc0ZpbGVzQ2hlY2tCb3g7Ci0gICAgCi0gICAKLSAgICBwdWJsaWMgQ2xhc3NGaWxlTG9jYXRpb25QYWdlKCl7Ci0gICAgICAgIHN1cGVyKCJwYWdlMSIpOwotICAgIH0KLSAgIAotICAgIAotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi50b29sLnNlcnZpY2UuZWNsaXBzZS51aS5BYnN0cmFjdFNlcnZpY2VXaXphcmRQYWdlI2luaXRpYWxpemVEZWZhdWx0U2V0dGluZ3MoKQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVEZWZhdWx0U2V0dGluZ3MoKSB7Ci0gICAgICBzZXR0aW5ncy5wdXQoUFJFRl9DTEFTU19GSUxFX0xPQ0FUSU9OLFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5kaXIiKSk7Ci0gICAgICBzZXR0aW5ncy5wdXQoUFJFRl9GSUxURVJfQllfQ0xBU1NFUyx0cnVlKTsKLQotICAgIH0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlI2NyZWF0ZUNvbnRyb2wob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBDb21wb3NpdGUgY29udGFpbmVyID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLSAgICAgICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgICAgICBsYXlvdXQubnVtQ29sdW1ucz0zOwotICAgICAgICBsYXlvdXQudmVydGljYWxTcGFjaW5nID0gOTsKLSAgICAgICAgCi0gICAgICAgIGNvbnRhaW5lci5zZXRMYXlvdXQobGF5b3V0KTsKLSAgICAgICAgR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJTGFiZWwgbGFibGUgPSBuZXcgTGFiZWwoY29udGFpbmVyLFNXVC5OVUxMKTsKLQkJbGFibGUuc2V0VGV4dChTZXJ2aWNlQXJjaGl2ZXIuZ2V0UmVzb3VyY2VTdHJpbmcoInBhZ2UxLmZpbGVMb2NhdGlvbkxhYmVsIikpOwotCQkKLQkJY2xhc3NGaWxlTG9jYXRpb25UZXh0ID0gbmV3IFRleHQoY29udGFpbmVyLFNXVC5CT1JERVIpOwotCQljbGFzc0ZpbGVMb2NhdGlvblRleHQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWNsYXNzRmlsZUxvY2F0aW9uVGV4dC5zZXRUZXh0KHNldHRpbmdzLmdldChQUkVGX0NMQVNTX0ZJTEVfTE9DQVRJT04pKTsKLQkJY2xhc3NGaWxlTG9jYXRpb25UZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpewotCQkgICAgcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKXsKLQkJICAgICAgICBoYW5kbGVNb2RpZnkoKTsKLQkJICAgIH0KLQkJfSk7Ci0JCQotCQlCdXR0b24gYnJvd3NlQnV0dG9uID0gbmV3IEJ1dHRvbihjb250YWluZXIsU1dULlBVU0gpOwotCQlicm93c2VCdXR0b24uc2V0VGV4dChTZXJ2aWNlQXJjaGl2ZXIuZ2V0UmVzb3VyY2VTdHJpbmcoImdlbmVyYWwuYnJvd3NlIikpOwotCQlicm93c2VCdXR0b24uYWRkTW91c2VMaXN0ZW5lcihuZXcgTW91c2VBZGFwdGVyKCl7Ci0JCSAgICBwdWJsaWMgdm9pZCBtb3VzZVVwKE1vdXNlRXZlbnQgZSkgewotCQkgICAgICAgIGhhbmRsZUJyb3dzZSgpOwotCQkgICAgfSAKLQkJfSk7Ci0JCQotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWZpbHRlckJ5Q2xhc3NGaWxlc0NoZWNrQm94ID0gbmV3IEJ1dHRvbihjb250YWluZXIsU1dULkNIRUNLKTsKLQkJZmlsdGVyQnlDbGFzc0ZpbGVzQ2hlY2tCb3guc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWZpbHRlckJ5Q2xhc3NGaWxlc0NoZWNrQm94LnNldFRleHQoU2VydmljZUFyY2hpdmVyLmdldFJlc291cmNlU3RyaW5nKCJwYWdlMS5maWx0ZXIuY2FwdGlvbiIpKTsKLQkJZmlsdGVyQnlDbGFzc0ZpbGVzQ2hlY2tCb3guc2V0U2VsZWN0aW9uKHNldHRpbmdzLmdldEJvb2xlYW4oUFJFRl9GSUxURVJfQllfQ0xBU1NFUykpOwotCQlmaWx0ZXJCeUNsYXNzRmlsZXNDaGVja0JveC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKXsKLQkJICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpewotCQkgICAgICAgIHNldHRpbmdzLnB1dChQUkVGX0ZJTFRFUl9CWV9DTEFTU0VTLGZpbHRlckJ5Q2xhc3NGaWxlc0NoZWNrQm94LmdldFNlbGVjdGlvbigpKTsKLQkJICAgIH0KLQkJICAgIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKXt9Ci0JCX0pOwotCQkKLQkJCi0JCXNldENvbnRyb2woY29udGFpbmVyKTsKLQkJLy9jYWxsIHRoZSBoYW5kbGUgbW9kaWZ5IG1ldGhvZCBpZiB0aGUgc2V0dHRpbmdzIGFyZSByZXN0b3JlZAotCQkKLQkJaWYgKHJlc3RvcmVkRnJvbVByZXZpb3VzU2V0dGluZ3MpewotCQkgICAgaGFuZGxlTW9kaWZ5KCk7Ci0JCX0KLSAgICB9Ci0gICAgCi0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZUJyb3dzZSgpewotICAgICAgIERpcmVjdG9yeURpYWxvZyBkaXJEaWFsb2cgPSBuZXcgRGlyZWN0b3J5RGlhbG9nKHRoaXMuZ2V0U2hlbGwoKSk7Ci0gICAgICAgZGlyRGlhbG9nLnNldE1lc3NhZ2UoU2VydmljZUFyY2hpdmVyLmdldFJlc291cmNlU3RyaW5nKCJwYWdlMS5maWxlZGlhbG9nVGl0bGUiKSk7Ci0gICAgICAgU3RyaW5nIHJldHVyblRleHQgPSBkaXJEaWFsb2cub3BlbigpOwotICAgICAgIGlmIChyZXR1cm5UZXh0IT1udWxsKXsKLSAgICAgICAgICAgdGhpcy5jbGFzc0ZpbGVMb2NhdGlvblRleHQuc2V0VGV4dChyZXR1cm5UZXh0KTsKLSAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBoYW5kbGVNb2RpZnkoKXsKLSAgICAgICAgU3RyaW5nIGNsYXNzTG9jYXRpb25UZXh0ID0gdGhpcy5jbGFzc0ZpbGVMb2NhdGlvblRleHQuZ2V0VGV4dCgpLnRyaW0oKTsKLSAgICAgICAgc2V0dGluZ3MucHV0KFBSRUZfQ0xBU1NfRklMRV9MT0NBVElPTixjbGFzc0xvY2F0aW9uVGV4dCk7Ci0gICAgICAgIC8vdXBkYXRlIHRoZSB3aXphcmQKLSAgICAgICAgKChTZXJ2aWNlQXJjaGl2ZVdpemFyZCl0aGlzLmdldFdpemFyZCgpKS5zZXRDbGFzc0ZpbGVMb2NhdGlvbihjbGFzc0xvY2F0aW9uVGV4dCk7Ci0gICAgICAgIAotICAgICAgICBpZiAoIiIuZXF1YWxzKGNsYXNzTG9jYXRpb25UZXh0KSl7Ci0gICAgICAgICAgICB1cGRhdGVTdGF0dXMoU2VydmljZUFyY2hpdmVyLmdldFJlc291cmNlU3RyaW5nKCJwYWdlMS5lcnJvci5maWxlbWlzc2luZyIpKTsKLSAgICAgICAgfWVsc2V7ICAgIAotICAgICAgICAgICAgdXBkYXRlU3RhdHVzKG51bGwpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NGaWxlTG9jYXRpb24oKXsKLSAgICAgICAgcmV0dXJuIGNsYXNzRmlsZUxvY2F0aW9uVGV4dC5nZXRUZXh0KCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBDbGFzc0ZpbGVTZWxlY3Rpb25CZWFuIGdldEJlYW4oKXsKLSAgICAgICAgQ2xhc3NGaWxlU2VsZWN0aW9uQmVhbiBwYWdlQmVhbiA9IG5ldyBDbGFzc0ZpbGVTZWxlY3Rpb25CZWFuKCk7Ci0gICAgICAgIHBhZ2VCZWFuLnNldEZpbGVMb2NhdGlvbih0aGlzLmNsYXNzRmlsZUxvY2F0aW9uVGV4dC5nZXRUZXh0KCkpOwotICAgICAgICBpZiAoZmlsdGVyQnlDbGFzc0ZpbGVzQ2hlY2tCb3guZ2V0U2VsZWN0aW9uKCkpewotICAgICAgICAgICAgcGFnZUJlYW4uc2V0RmlsdGVyKCIuY2xhc3MiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcGFnZUJlYW47Ci0gICAgfQotCi0KLQotCXByb3RlY3RlZCBib29sZWFuIGdldFdpemFyZENvbXBsZXRlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLXNlcnZpY2UtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL3NlcnZpY2UvZWNsaXBzZS91aS9MaWJyYXJ5QWRkaW5nUGFnZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLXNlcnZpY2UtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL3NlcnZpY2UvZWNsaXBzZS91aS9MaWJyYXJ5QWRkaW5nUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWQzZDhmLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1zZXJ2aWNlLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9zZXJ2aWNlL2VjbGlwc2UvdWkvTGlicmFyeUFkZGluZ1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50b29sLnNlcnZpY2UuZWNsaXBzZS51aTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbC5zZXJ2aWNlLmJlYW4uTGlicmFyeVNlbGVjdGlvbkJlYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29sLnNlcnZpY2UuZWNsaXBzZS5wbHVnaW4uU2VydmljZUFyY2hpdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkZpbGVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi1wdWJsaWMgY2xhc3MgTGlicmFyeUFkZGluZ1BhZ2UgZXh0ZW5kcyBBYnN0cmFjdFNlcnZpY2VXaXphcmRQYWdlIHsKLSAgICAKLSAgICBwcml2YXRlIExhYmVsIGxpYnJhcnlOYW1lTGFiZWw7Ci0gICAgcHJpdmF0ZSBUZXh0IGxpYnJhcnlOYW1lVGV4dDsKLSAgICBwcml2YXRlIEJ1dHRvbiBicm93c2VCdXR0b247Ci0gICAgcHJpdmF0ZSBCdXR0b24gYWRkQnV0dG9uOwotICAgIHByaXZhdGUgQnV0dG9uIHJlbW92ZUJ1dHRvbjsKLSAgICBwcml2YXRlIExpc3QgamFyRmlsZUxpc3Q7Ci0gICAgcHJpdmF0ZSBMYWJlbCBqYXJGaWxlY291bnRMYWJlbDsKLSAgICAKLSAgICAvKioKLSAgICAgKiAKLSAgICAgKi8KLSAgICBwdWJsaWMgTGlicmFyeUFkZGluZ1BhZ2UoKSB7Ci0gICAgICAgIHN1cGVyKCJwYWdlNiIpOwotICAgICAgIAotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIudG9vbC5zZXJ2aWNlLmVjbGlwc2UudWkuQWJzdHJhY3RTZXJ2aWNlV2l6YXJkUGFnZSNpbml0aWFsaXplRGVmYXVsdFNldHRpbmdzKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRGVmYXVsdFNldHRpbmdzKCkgewotICAgICAgIHNldHRpbmdzLnB1dChQUkVGX0xJQl9MSUJOQU1FUyxuZXcgU3RyaW5nW117fSk7Ly9wdXQgYW4gZW1wdHkgYXJyYXkKLQotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2UjY3JlYXRlQ29udHJvbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIENvbXBvc2l0ZSBjb250YWluZXIgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotICAgICAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgICAgIGxheW91dC5udW1Db2x1bW5zPTM7Ci0gICAgICAgIGNvbnRhaW5lci5zZXRMYXlvdXQobGF5b3V0KTsKLSAgICAgCi0JCQotICAgICAgICBHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotICAgICAgICBnZC5ob3Jpem9udGFsU3BhbiA9MzsKLSAgICAgICAgbGlicmFyeU5hbWVUZXh0ID0gbmV3IFRleHQoY29udGFpbmVyLFNXVC5CT1JERVIpOwotICAgICAgICBsaWJyYXJ5TmFtZVRleHQuc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgICAgCi0gICAgICAgIGxpYnJhcnlOYW1lVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKXsKLQkJICAgIHB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSl7Ci0JCSAgICAvL2hhbmRsZU1vZGlmeSgpOwotCQkgICAgfQotCQl9KTsKLQkJCi0gICAgICAgIAotICAgICAgICBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlicm93c2VCdXR0b24gPSBuZXcgQnV0dG9uKGNvbnRhaW5lcixTV1QuUFVTSCk7Ci0JCWJyb3dzZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLQkJYnJvd3NlQnV0dG9uLnNldFRleHQoU2VydmljZUFyY2hpdmVyLmdldFJlc291cmNlU3RyaW5nKCJnZW5lcmFsLmJyb3dzZSIpKTsKLQkJYnJvd3NlQnV0dG9uLmFkZE1vdXNlTGlzdGVuZXIobmV3IE1vdXNlQWRhcHRlcigpewotCQkgICAgcHVibGljIHZvaWQgbW91c2VVcChNb3VzZUV2ZW50IGUpIHsKLQkJICAgICAgICBoYW5kbGVCcm93c2UoKTsKLQkJICAgIH0KLQkJfSk7Ci0JCQotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlhZGRCdXR0b24gPSBuZXcgQnV0dG9uKGNvbnRhaW5lcixTV1QuUFVTSCk7Ci0JCWFkZEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLQkJYWRkQnV0dG9uLnNldFRleHQoU2VydmljZUFyY2hpdmVyLmdldFJlc291cmNlU3RyaW5nKCJwYWdlNi5hZGQiKSk7Ci0JCWFkZEJ1dHRvbi5hZGRNb3VzZUxpc3RlbmVyKG5ldyBNb3VzZUFkYXB0ZXIoKXsKLQkJICAgIHB1YmxpYyB2b2lkIG1vdXNlVXAoTW91c2VFdmVudCBlKSB7Ci0JCSAgICAgICAgaGFuZGxlQWRkKCk7Ci0JCSAgICB9Ci0KLSAgICAgICAgICAgCi0JCX0pOwotCQkKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJcmVtb3ZlQnV0dG9uID0gbmV3IEJ1dHRvbihjb250YWluZXIsU1dULlBVU0gpOwotCQlyZW1vdmVCdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXJlbW92ZUJ1dHRvbi5zZXRUZXh0KFNlcnZpY2VBcmNoaXZlci5nZXRSZXNvdXJjZVN0cmluZygicGFnZTYucmVtb3ZlIikpOwotCQlyZW1vdmVCdXR0b24uYWRkTW91c2VMaXN0ZW5lcihuZXcgTW91c2VBZGFwdGVyKCl7Ci0JCSAgICBwdWJsaWMgdm9pZCBtb3VzZVVwKE1vdXNlRXZlbnQgZSkgewotCQkgICAgICAgIGhhbmRsZVJlbW92ZSgpOwotCQkgICAgfQotCi0gICAgICAgICAgIAotCQl9KTsKLQkJCi0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMzsKLQkJTGFiZWwgZHVtbXlMYWJlbCA9IG5ldyBMYWJlbChjb250YWluZXIsU1dULk5PTkUpOwotCQlkdW1teUxhYmVsLnNldFRleHQoU2VydmljZUFyY2hpdmVyLmdldFJlc291cmNlU3RyaW5nKCJwYWdlNi5saWJsaXN0LmNhcHRpb24iKSk7Ci0JCWR1bW15TGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCWdkLnZlcnRpY2FsU3BhbiA9IDU7Ci0JCQotCQlqYXJGaWxlTGlzdCA9IG5ldyBMaXN0KGNvbnRhaW5lcixTV1QuQk9SREVSfFNXVC5WX1NDUk9MTCk7Ci0JCWphckZpbGVMaXN0LnNldEl0ZW1zKHNldHRpbmdzLmdldEFycmF5KFBSRUZfTElCX0xJQk5BTUVTKSk7Ci0JCWphckZpbGVMaXN0LnNldExheW91dERhdGEoZ2QpOwotCQkKLQkJCi0JCS8vIExhYmVsIGZvciB0aGUgY291bnQKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlqYXJGaWxlY291bnRMYWJlbCA9IG5ldyBMYWJlbChjb250YWluZXIsU1dULk5PTkUpOwotCQlqYXJGaWxlY291bnRMYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJCi0JCXNldENvbnRyb2woY29udGFpbmVyKTsKLQkJc2V0UGFnZUNvbXBsZXRlKHRydWUpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBoYW5kbGVCcm93c2UoKXsKLSAgICAgICAgRmlsZURpYWxvZyBmaWxlRGlhbG9nID0gbmV3IEZpbGVEaWFsb2codGhpcy5nZXRTaGVsbCgpKTsKLSAgICAgICAgZmlsZURpYWxvZy5zZXRGaWx0ZXJFeHRlbnNpb25zKG5ldyBTdHJpbmdbXXsiKi5qYXIifSk7Ci0gICAgICAgIFN0cmluZyByZXR1cm5GaWxlTmFtZSA9IGZpbGVEaWFsb2cub3BlbigpIDsKLSAgICAgICAgaWYgKHJldHVybkZpbGVOYW1lIT1udWxsKXsKLSAgICAgICAgICAgIHRoaXMubGlicmFyeU5hbWVUZXh0LnNldFRleHQocmV0dXJuRmlsZU5hbWUpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBoYW5kbGVBZGQoKSB7Ci0gICAgICAgIFN0cmluZyBsaWJOYW1lID0gbGlicmFyeU5hbWVUZXh0LmdldFRleHQoKS50cmltKCk7Ci0gICAgICAgIGlmICghbGliTmFtZS5lcXVhbHMoIiIpKXsKLSAgICAgICAgICAgIC8vYWRkIHRoZSBsaWJzIHRvIHRoZSBsaXN0Ci0gICAgICAgICAgICBqYXJGaWxlTGlzdC5hZGQobGliTmFtZSk7Ci0gICAgICAgICAgICB1cGRhdGVMaXN0KCk7Ci0gICAgICAgICAgICBsaWJyYXJ5TmFtZVRleHQuc2V0VGV4dCgiIik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVJlbW92ZSgpIHsKLSAgICAgICAgaW50IHNlbGVjdGVkSW5kZXggPSBqYXJGaWxlTGlzdC5nZXRTZWxlY3Rpb25JbmRleCgpOwotICAgICAgICAvLy0xIGlzIHJldHVybmVkIHdoZW4gbm90aGluZyBpcyBzZWxlY3RlZAotICAgICAgICBpZiAoc2VsZWN0ZWRJbmRleCE9LTEpewotICAgICAgICAgICBqYXJGaWxlTGlzdC5yZW1vdmUoc2VsZWN0ZWRJbmRleCk7Ci0gICAgICAgICAgIHVwZGF0ZUxpc3QoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlTGlzdCgpewotICAgICAgICBqYXJGaWxlY291bnRMYWJlbC5zZXRUZXh0KGphckZpbGVMaXN0LmdldEl0ZW1Db3VudCgpICsgIiAiICsgU2VydmljZUFyY2hpdmVyLmdldFJlc291cmNlU3RyaW5nKCJwYWdlNi5saWJsaXN0LmNvdW50LmNhcHRpb24iKSk7Ci0gICAgICAgIHNldHRpbmdzLnB1dChQUkVGX0xJQl9MSUJOQU1FUyxqYXJGaWxlTGlzdC5nZXRJdGVtcygpKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIExpYnJhcnlTZWxlY3Rpb25CZWFuIGdldEJlYW4oKXsKLSAgICAgICAgTGlicmFyeVNlbGVjdGlvbkJlYW4gYmVhbiA9IG5ldyBMaWJyYXJ5U2VsZWN0aW9uQmVhbigpOwotICAgICAgICBiZWFuLnNldEZpbGVMaXN0KGphckZpbGVMaXN0LmdldEl0ZW1zKCkpOwotICAgICAgICByZXR1cm4gYmVhbjsKLSAgICB9Ci0gICAgCi0JcHJvdGVjdGVkIGJvb2xlYW4gZ2V0V2l6YXJkQ29tcGxldGUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0gICAgCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2Utc2VydmljZS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvc2VydmljZS9lY2xpcHNlL3VpL1NlcnZpY2VBcmNoaXZlT3V0cHV0TG9jYXRpb25QYWdlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2Utc2VydmljZS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvc2VydmljZS9lY2xpcHNlL3VpL1NlcnZpY2VBcmNoaXZlT3V0cHV0TG9jYXRpb25QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyMWJjOWIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLXNlcnZpY2UtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL3NlcnZpY2UvZWNsaXBzZS91aS9TZXJ2aWNlQXJjaGl2ZU91dHB1dExvY2F0aW9uUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk0ICswLDAgQEAKLSAvKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLyAgcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnRvb2wuc2VydmljZS5lY2xpcHNlLnVpOwotCi0gaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbC5zZXJ2aWNlLmJlYW4uUGFnZTNCZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbC5zZXJ2aWNlLmVjbGlwc2UucGx1Z2luLlNlcnZpY2VBcmNoaXZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXJlY3RvcnlEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotIHB1YmxpYyBjbGFzcyBTZXJ2aWNlQXJjaGl2ZU91dHB1dExvY2F0aW9uUGFnZSBleHRlbmRzIEFic3RyYWN0U2VydmljZVdpemFyZFBhZ2UgewotCi0gICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0pBUl9OQU1FID0gIm15X3NlcnZpY2UiOwotICAgICBwcml2YXRlIFRleHQgb3V0cHV0RmlsZUxvY2F0aW9uVGV4dEJveDsKLSAgICAgcHJpdmF0ZSBCdXR0b24gYnJvd3NlQnV0dG9uOwotICAgICBwcml2YXRlIFRleHQgb3V0cHV0RmlsZU5hbWVUZXh0Ym94OwotICAgICBwcml2YXRlIGJvb2xlYW4gaXNXaXphcmRDb21wbGV0ZSA9IGZhbHNlOwotICAgICAKLSAgICAgcHVibGljIFNlcnZpY2VBcmNoaXZlT3V0cHV0TG9jYXRpb25QYWdlKCl7Ci0gICAgICAgICBzdXBlcigicGFnZTQiKTsKLSAgICAgfQotICAgICAKLSAgICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi50b29sLnNlcnZpY2UuZWNsaXBzZS51aS5BYnN0cmFjdFNlcnZpY2VXaXphcmRQYWdlI2luaXRpYWxpemVEZWZhdWx0U2V0dGluZ3MoKQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVEZWZhdWx0U2V0dGluZ3MoKSB7Ci0gICAgICAgIHNldHRpbmdzLnB1dChQUkVGX09VVFBVVF9MT0NBVElPTixTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIikpOwotICAgICAgICBzZXR0aW5ncy5wdXQoUFJFRl9PVVRQVVRfTkFNRSxERUZBVUxUX0pBUl9OQU1FKTsKLQotICAgIH0KLSAgICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2UjY3JlYXRlQ29udHJvbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0gICAgICAqLwotICAgICBwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgIENvbXBvc2l0ZSBjb250YWluZXIgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotICAgICAgICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgICAgICAgbGF5b3V0Lm51bUNvbHVtbnM9MzsKLSAgICAgICAgIGNvbnRhaW5lci5zZXRMYXlvdXQobGF5b3V0KTsKLSAgICAgICAgIAotICAgICAgICBHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotICAgICAgICBnZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICAgICAgIAotIAkJTGFiZWwgbGFibGUgPSBuZXcgTGFiZWwoY29udGFpbmVyLFNXVC5OVUxMKTsKLSAJCWxhYmxlLnNldFRleHQoU2VydmljZUFyY2hpdmVyLmdldFJlc291cmNlU3RyaW5nKCJwYWdlNC5vdXRwdXRsb2NhdGlvbi5sYWJlbCIpKTsKLSAJCQotIAkJb3V0cHV0RmlsZUxvY2F0aW9uVGV4dEJveCA9IG5ldyBUZXh0KGNvbnRhaW5lcixTV1QuQk9SREVSKTsKLSAJCW91dHB1dEZpbGVMb2NhdGlvblRleHRCb3guc2V0TGF5b3V0RGF0YShnZCk7Ci0gCQlvdXRwdXRGaWxlTG9jYXRpb25UZXh0Qm94LnNldFRleHQoIiIpOwotIAkJb3V0cHV0RmlsZUxvY2F0aW9uVGV4dEJveC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKXsKLSAJCSAgICBwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpewotIAkJICAgICAgICBoYW5kbGVMb2NhdGlvbk1vZGlmaWNhdGlvbigpOwotIAkJICAgIH0KLSAJCX0pOwotIAkJCi0gCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0VORCk7Ci0gCQkJCQotIAkJYnJvd3NlQnV0dG9uID0gbmV3IEJ1dHRvbihjb250YWluZXIsU1dULlBVU0gpOwotIAkJYnJvd3NlQnV0dG9uLnNldFRleHQoU2VydmljZUFyY2hpdmVyLmdldFJlc291cmNlU3RyaW5nKCJnZW5lcmFsLmJyb3dzZSIpKTsKLSAJCWJyb3dzZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLSAJCWJyb3dzZUJ1dHRvbi5hZGRNb3VzZUxpc3RlbmVyKG5ldyBNb3VzZUFkYXB0ZXIoKXsKLSAJCSAgICBwdWJsaWMgdm9pZCBtb3VzZVVwKE1vdXNlRXZlbnQgZSkgewotIAkJICAgICAgICBoYW5kbGVCcm93c2UoKTsKLSAJCSAgICB9IAotIAkJfSk7Ci0gCQkKLSAJCWxhYmxlID0gbmV3IExhYmVsKGNvbnRhaW5lcixTV1QuTlVMTCk7Ci0gCQlsYWJsZS5zZXRUZXh0KFNlcnZpY2VBcmNoaXZlci5nZXRSZXNvdXJjZVN0cmluZygicGFnZTQub3V0cHV0bmFtZS5sYWJlbCIpKTsKLSAJCQotIAkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLSAJCQotIAkJb3V0cHV0RmlsZU5hbWVUZXh0Ym94ID0gbmV3IFRleHQoY29udGFpbmVyLFNXVC5CT1JERVIpOwotIAkJb3V0cHV0RmlsZU5hbWVUZXh0Ym94LnNldExheW91dERhdGEoZ2QpOwotIAkJb3V0cHV0RmlsZU5hbWVUZXh0Ym94LnNldFRleHQoc2V0dGluZ3MuZ2V0KFBSRUZfT1VUUFVUX05BTUUpKTsKLSAJCW91dHB1dEZpbGVOYW1lVGV4dGJveC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKXsKLSAJCSAgICBwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpewotIAkJICAgICAgICBoYW5kbGVGaWxlTmFtZU1vZGlmaWNhdGlvbigpOwotIAkJICAgIH0KLSAgICAgICAgfSk7Ci0gCQkKLSAJCS8vQWRkIHNvbWUgZmlsbCBsYWJsZXMgCi0gICAgICAgIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0gICAgICAgIGdkLmhvcml6b250YWxTcGFuID0gMzsKLSAJCUxhYmVsIGZpbGxMYWJsZSA9IG5ldyBMYWJlbChjb250YWluZXIsU1dULk5VTEwpOwotIAkJZmlsbExhYmxlLnNldFRleHQoIiIpOwotIAkJZmlsbExhYmxlLnNldExheW91dERhdGEoZ2QpOwotIAkJTGFiZWwgZmlsbExhYmxlMSA9IG5ldyBMYWJlbChjb250YWluZXIsU1dULk5VTEwpOwotIAkJZmlsbExhYmxlMS5zZXRUZXh0KCIiKTsKLSAJCWZpbGxMYWJsZTEuc2V0TGF5b3V0RGF0YShnZCk7Ci0gCQkKLSAgICAgICAgLy9IaW50IExhYmxlCi0gCQlMYWJlbCBoaW50TGFibGUgPSBuZXcgTGFiZWwoY29udGFpbmVyLFNXVC5OVUxMKTsKLSAJCWhpbnRMYWJsZS5zZXRUZXh0KFNlcnZpY2VBcmNoaXZlci5nZXRSZXNvdXJjZVN0cmluZygicGFnZTQuaGludC5jYXB0aW9uIikpOwotIAkJaGludExhYmxlLnNldExheW91dERhdGEoZ2QpOwotIAkJCi0gICAgICAgIGlmIChyZXN0b3JlZEZyb21QcmV2aW91c1NldHRpbmdzKSB7Ci0gICAgICAgICAgICBoYW5kbGVGaWxlTmFtZU1vZGlmaWNhdGlvbigpOwotICAgICAgICAgICAgaGFuZGxlTG9jYXRpb25Nb2RpZmljYXRpb24oKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vbm90aGluZyB5ZXQKLSAgICAgICAgfQotCi0gICAgICAgIHNldENvbnRyb2woY29udGFpbmVyKTsKLQotICAgIH0KLSAgICAgCi0gICAgIHByaXZhdGUgdm9pZCBoYW5kbGVCcm93c2UoKXsKLSAgICAgICAgIERpcmVjdG9yeURpYWxvZyBkaXJEaWFsb2cgPSBuZXcgRGlyZWN0b3J5RGlhbG9nKHRoaXMuZ2V0U2hlbGwoKSk7Ci0gICAgICAgICBkaXJEaWFsb2cuc2V0TWVzc2FnZShTZXJ2aWNlQXJjaGl2ZXIuZ2V0UmVzb3VyY2VTdHJpbmcoInBhZ2U0LmRpcmRpYWxvZy5jYXB0aW9uIikpOwotICAgICAgICAgU3RyaW5nIHJldHVyblRleHQgPSBkaXJEaWFsb2cub3BlbigpOwotICAgICAgICAgaWYgKHJldHVyblRleHQhPW51bGwpewotICAgICAgICAgICAgIHRoaXMub3V0cHV0RmlsZUxvY2F0aW9uVGV4dEJveC5zZXRUZXh0KHJldHVyblRleHQpOwotICAgICAgICAgICAgIHRoaXMub3V0cHV0RmlsZUxvY2F0aW9uVGV4dEJveC5zZXRUb29sVGlwVGV4dChyZXR1cm5UZXh0KTsKLSAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgCi0gICAgIHByaXZhdGUgdm9pZCBoYW5kbGVMb2NhdGlvbk1vZGlmaWNhdGlvbigpewotICAgICAgICAgU3RyaW5nIG91dHB1dExvY2F0aW9uVGV4dCA9IG91dHB1dEZpbGVMb2NhdGlvblRleHRCb3guZ2V0VGV4dCgpOwotICAgICAgICAgc2V0dGluZ3MucHV0KFBSRUZfT1VUUFVUX0xPQ0FUSU9OLG91dHB1dExvY2F0aW9uVGV4dCk7Ci0gICAgICAgICBpZiAob3V0cHV0TG9jYXRpb25UZXh0PT1udWxsIHx8IiIuZXF1YWxzKG91dHB1dExvY2F0aW9uVGV4dC50cmltKCkpKXsKLSAgICAgICAgICAgICB0aGlzLnVwZGF0ZVN0YXR1cyhTZXJ2aWNlQXJjaGl2ZXIuZ2V0UmVzb3VyY2VTdHJpbmcoInBhZ2U0LmVycm9yLmxvY2F0aW9uIikpOwotICAgICAgICAgICAgIGlzV2l6YXJkQ29tcGxldGU9ZmFsc2U7Ci0gICAgICAgICAgICAgdXBkYXRlU3RhdHVzKG51bGwpOwotICAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICAgU3RyaW5nIG91dHB1dEZpbGVuYW1lVGV4dCA9IG91dHB1dEZpbGVOYW1lVGV4dGJveC5nZXRUZXh0KCk7Ci0gICAgICAgICAgICAgc2V0dGluZ3MucHV0KFBSRUZfT1VUUFVUX05BTUUsb3V0cHV0RmlsZW5hbWVUZXh0KTsKLSAgICAgICAgCSBpZiAob3V0cHV0RmlsZW5hbWVUZXh0PT1udWxsIHx8ICIiLmVxdWFscyhvdXRwdXRGaWxlbmFtZVRleHQudHJpbSgpKSl7Ci0gICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlU3RhdHVzKFNlcnZpY2VBcmNoaXZlci5nZXRSZXNvdXJjZVN0cmluZygicGFnZTQuZXJyb3IuZmlsZW5hbWUiKSk7Ci0gICAgICAgICAgICAgICAgIGlzV2l6YXJkQ29tcGxldGU9ZmFsc2U7Ci0gICAgICAgICAgICAgICAgIHVwZGF0ZVN0YXR1cyhudWxsKTsKLSAgICAgICAgCSB9ZWxzZXsKLSAgICAgICAgCQkgaXNXaXphcmRDb21wbGV0ZSA9IHRydWU7Ci0gICAgICAgIAkJIHVwZGF0ZVN0YXR1cyhudWxsKTsKLSAgICAgICAgCSB9Ci0gICAgICAgICB9Ci0gICAgIH0KLSAgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZUZpbGVOYW1lTW9kaWZpY2F0aW9uKCl7Ci0gICAgICAgICBTdHJpbmcgb3V0cHV0RmlsZW5hbWVUZXh0ID0gb3V0cHV0RmlsZU5hbWVUZXh0Ym94LmdldFRleHQoKTsKLSAgICAgICAgIHNldHRpbmdzLnB1dChQUkVGX09VVFBVVF9OQU1FLG91dHB1dEZpbGVuYW1lVGV4dCk7Ci0gICAgICAgICBpZiAob3V0cHV0RmlsZW5hbWVUZXh0PT1udWxsIHx8ICIiLmVxdWFscyhvdXRwdXRGaWxlbmFtZVRleHQudHJpbSgpKSl7Ci0gICAgICAgICAgICAgdGhpcy51cGRhdGVTdGF0dXMoU2VydmljZUFyY2hpdmVyLmdldFJlc291cmNlU3RyaW5nKCJwYWdlNC5lcnJvci5maWxlbmFtZSIpKTsKLSAgICAgICAgICAgICBpc1dpemFyZENvbXBsZXRlPWZhbHNlOwotICAgICAgICAgICAgIHVwZGF0ZVN0YXR1cyhudWxsKTsKLSAgICAgICAgIH1lbHNlewotICAgICAgICAgICAgIFN0cmluZyBvdXRwdXRMb2NhdGlvblRleHQgPSBvdXRwdXRGaWxlTG9jYXRpb25UZXh0Qm94LmdldFRleHQoKTsKLSAgICAgICAgICAgICBzZXR0aW5ncy5wdXQoUFJFRl9PVVRQVVRfTE9DQVRJT04sb3V0cHV0TG9jYXRpb25UZXh0KTsKLSAgICAgICAgICAgICBpZiAob3V0cHV0TG9jYXRpb25UZXh0PT1udWxsIHx8IiIuZXF1YWxzKG91dHB1dExvY2F0aW9uVGV4dC50cmltKCkpKXsKLSAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVTdGF0dXMoU2VydmljZUFyY2hpdmVyLmdldFJlc291cmNlU3RyaW5nKCJwYWdlNC5lcnJvci5sb2NhdGlvbiIpKTsKLSAgICAgICAgICAgICAgICAgaXNXaXphcmRDb21wbGV0ZT1mYWxzZTsKLSAgICAgICAgICAgICAgICAgdXBkYXRlU3RhdHVzKG51bGwpOwotICAgICAgICAgICAgIH1lbHNlewotICAgICAgICAgICAgCSBpc1dpemFyZENvbXBsZXRlID0gdHJ1ZTsKLSAgICAgICAgICAgIAkgdXBkYXRlU3RhdHVzKG51bGwpOwotICAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgfQotICAgICAKLSAgICAgCi0gICAgIAotICAgICBwdWJsaWMgUGFnZTNCZWFuIGdldEJlYW4oKXsKLSAgICAgICAgIFBhZ2UzQmVhbiBwYWdlQmVhbiA9IG5ldyBQYWdlM0JlYW4oKTsKLSAgICAgICAgIHBhZ2VCZWFuLnNldE91dHB1dEZvbGRlck5hbWUodGhpcy5vdXRwdXRGaWxlTG9jYXRpb25UZXh0Qm94LmdldFRleHQoKS50cmltKCkpOwotICAgICAgICAgcGFnZUJlYW4uc2V0T3V0cHV0RmlsZU5hbWUodGhpcy5vdXRwdXRGaWxlTmFtZVRleHRib3guZ2V0VGV4dCgpLnRyaW0oKSk7Ci0gICAgICAgICByZXR1cm4gcGFnZUJlYW47Ci0gICAgIH0KLSAgICAgCi0gCXByb3RlY3RlZCBib29sZWFuIGdldFdpemFyZENvbXBsZXRlKCkgewotCQlyZXR1cm4gaXNXaXphcmRDb21wbGV0ZTsKLQl9Ci0gfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLXNlcnZpY2UtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL3NlcnZpY2UvZWNsaXBzZS91aS9TZXJ2aWNlQXJjaGl2ZVdpemFyZC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLXNlcnZpY2UtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL3NlcnZpY2UvZWNsaXBzZS91aS9TZXJ2aWNlQXJjaGl2ZVdpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODYxMjM0Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1zZXJ2aWNlLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9zZXJ2aWNlL2VjbGlwc2UvdWkvU2VydmljZUFyY2hpdmVXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudG9vbC5zZXJ2aWNlLmVjbGlwc2UudWk7Ci0KLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbC5zZXJ2aWNlLmJlYW4uV2l6YXJkQmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRvb2wuc2VydmljZS5jb250cm9sLkNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29sLnNlcnZpY2UuZWNsaXBzZS5wbHVnaW4uU2VydmljZUFyY2hpdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklOZXdXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLldvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbjsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0KLQotcHVibGljIGNsYXNzIFNlcnZpY2VBcmNoaXZlV2l6YXJkIGV4dGVuZHMgV2l6YXJkIGltcGxlbWVudHMgSU5ld1dpemFyZCB7Ci0KLQotCXByaXZhdGUgQ2xhc3NGaWxlTG9jYXRpb25QYWdlIGNsYXNzRmlsZUxvY2F0aW9uUGFnZTsKLSAgICBwcml2YXRlIFdTRExGaWxlU2VsZWN0aW9uUGFnZSB3c2RsRmlsZVNlbGVjdGlvblBhZ2U7Ci0gICAgcHJpdmF0ZSBTZXJ2aWNlWE1MRmlsZVNlbGVjdGlvblBhZ2Ugc2VydmljZVhNTEZpbGVTZWxlY3Rpb25QYWdlOwotICAgIHByaXZhdGUgU2VydmljZVhNTEdlbmVyYXRpb25QYWdlIHNlcnZpY2VYTUxHZW5lcmF0aW9uUGFnZTsKLSAgICBwcml2YXRlIFNlcnZpY2VBcmNoaXZlT3V0cHV0TG9jYXRpb25QYWdlIHNlcnZpY2VBcmNoaXZlT3V0cHV0TG9jYXRpb25QYWdlOwotICAgIHByaXZhdGUgTGlicmFyeUFkZGluZ1BhZ2UgbGliUGFnZTsKLQotICAgIHByaXZhdGUgYm9vbGVhbiB1cGRhdGVTZXJ2aWNlR2VuZXJhdGlvblN0YXR1czsKLSAgICBwcml2YXRlIFN0cmluZyBjbGFzc0ZpbGVMb2NhdGlvbjsKLSAgICBwcml2YXRlIFN0cmluZyB3c2RsRmlsZUdlbmVyYXRpb25TdGF0dXM7Ci0gICAgCi0gIAotICAgIAotICAgIC8qKgotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgd3NkbEZpbGVHZW5lcmF0aW9uU3RhdHVzLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0V3NkbEZpbGVHZW5lcmF0aW9uU3RhdHVzKCkgewotICAgICAgICByZXR1cm4gd3NkbEZpbGVHZW5lcmF0aW9uU3RhdHVzOwotICAgIH0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgd3NkbEZpbGVHZW5lcmF0aW9uU3RhdHVzIHRvIHNldC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB1cGRhdGVXc2RsRmlsZUdlbmVyYXRpb25TdGF0dXMoU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgdGhpcy53c2RsRmlsZUdlbmVyYXRpb25TdGF0dXMgPSBtZXNzYWdlOwotICAgIH0KLSAgICBwdWJsaWMgIFN0cmluZyBnZXRDbGFzc0ZpbGVMb2NhdGlvbigpewotICAgICAgICByZXR1cm4gY2xhc3NGaWxlTG9jYXRpb247Ci0gICAgfQotICAgIAotICAgIC8vZ2V0IHRoZSBsaWIgZmlsZSBsaXN0Ci0gICAgcHVibGljIFN0cmluZ1tdIGdldExpYkZpbGVMaXN0KCl7Ci0gICAgICAgIHJldHVybiBsaWJQYWdlLmdldEJlYW4oKS5nZXRGaWxlTGlzdCgpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgIHZvaWQgc2V0Q2xhc3NGaWxlTG9jYXRpb24oU3RyaW5nIGxvY2F0aW9uKXsKLSAgICAgICAgdGhpcy5jbGFzc0ZpbGVMb2NhdGlvbiA9IGxvY2F0aW9uOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB1cGRhdGVTZXJ2aWNlWE1MR2VuZXJhdGlvbihib29sZWFuIHN0YXR1cyl7Ci0gICAgICAgIHNlcnZpY2VYTUxHZW5lcmF0aW9uUGFnZS5zZXRQYWdlQ29tcGxldGUoc3RhdHVzKTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogCi0gICAgICovCi0gICAgcHVibGljIFNlcnZpY2VBcmNoaXZlV2l6YXJkKCkgewotICAgICAgICBzdXBlcigpOwotICAgICAgICBzZXROZWVkc1Byb2dyZXNzTW9uaXRvcih0cnVlKTsKLSAgICAgICAgc2V0V2luZG93VGl0bGUoU2VydmljZUFyY2hpdmVyLmdldFJlc291cmNlU3RyaW5nKCJtYWluLnRpdGxlIikpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGNhbkZpbmlzaCgpIHsKLSAgICAgICAgSVdpemFyZFBhZ2VbXSBwYWdlcyA9IGdldFBhZ2VzKCk7Ci0gICAgICAgIEFic3RyYWN0U2VydmljZVdpemFyZFBhZ2Ugd2l6YXJkUGFnZSA9IG51bGw7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFnZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIHdpemFyZFBhZ2UgPSAoQWJzdHJhY3RTZXJ2aWNlV2l6YXJkUGFnZSkgcGFnZXNbaV07Ci0gICAgICAgICAgICBpZiAod2l6YXJkUGFnZS5nZXROYW1lKCkuZXF1YWxzKCJwYWdlNC5uYW1lIikpewotCSAgICAgICAgICAgIGlmICghd2l6YXJkUGFnZS5nZXRXaXphcmRDb21wbGV0ZSgpICkgewotCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLQl9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCNnZXROZXh0UGFnZShvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2UpCi0gICAgICovCi0gICAgcHVibGljIElXaXphcmRQYWdlIGdldE5leHRQYWdlKElXaXphcmRQYWdlIHBhZ2UpIHsKLSAgICAgICAgQWJzdHJhY3RTZXJ2aWNlV2l6YXJkUGFnZSB0aGlzUGFnZSA9IChBYnN0cmFjdFNlcnZpY2VXaXphcmRQYWdlKXBhZ2U7Ci0gICAgICAgIEFic3RyYWN0U2VydmljZVdpemFyZFBhZ2UgbmV4dFBhZ2UgPSAoQWJzdHJhY3RTZXJ2aWNlV2l6YXJkUGFnZSlzdXBlci5nZXROZXh0UGFnZShwYWdlKTsKLSAgICAgICAgd2hpbGUgKHRoaXNQYWdlIT1udWxsICYmIHRoaXNQYWdlLmlzU2tpcE5leHQoKSkgewotICAgICAgICAgICAgaWYgKG5leHRQYWdlIT1udWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhpc1BhZ2UgPSBuZXh0UGFnZTsKLSAgICAgICAgICAgICAgICBuZXh0UGFnZSA9IChBYnN0cmFjdFNlcnZpY2VXaXphcmRQYWdlKXN1cGVyLmdldE5leHRQYWdlKG5leHRQYWdlKTsKLSAgICAgICAgICAgIH1lbHNlewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXh0UGFnZTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCNhZGRQYWdlcygpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7Ci0gICAgICAgIGNsYXNzRmlsZUxvY2F0aW9uUGFnZSA9IG5ldyBDbGFzc0ZpbGVMb2NhdGlvblBhZ2UoKTsKLSAgICAgICAgdGhpcy5hZGRQYWdlKGNsYXNzRmlsZUxvY2F0aW9uUGFnZSk7Ci0gICAgICAgIHdzZGxGaWxlU2VsZWN0aW9uUGFnZSA9IG5ldyBXU0RMRmlsZVNlbGVjdGlvblBhZ2UoKTsKLSAgICAgICAgdGhpcy5hZGRQYWdlKHdzZGxGaWxlU2VsZWN0aW9uUGFnZSk7Ci0gICAgICAgIGxpYlBhZ2UgPSBuZXcgTGlicmFyeUFkZGluZ1BhZ2UoKTsKLSAgICAgICAgdGhpcy5hZGRQYWdlKGxpYlBhZ2UpOwotICAgICAgICBzZXJ2aWNlWE1MRmlsZVNlbGVjdGlvblBhZ2UgPSBuZXcgU2VydmljZVhNTEZpbGVTZWxlY3Rpb25QYWdlKCk7Ci0gICAgICAgIHRoaXMuYWRkUGFnZShzZXJ2aWNlWE1MRmlsZVNlbGVjdGlvblBhZ2UpOwotICAgICAgICBzZXJ2aWNlWE1MR2VuZXJhdGlvblBhZ2UgPSBuZXcgU2VydmljZVhNTEdlbmVyYXRpb25QYWdlKCk7Ci0gICAgICAgIHRoaXMuYWRkUGFnZShzZXJ2aWNlWE1MR2VuZXJhdGlvblBhZ2UpOwotICAgICAgICBzZXJ2aWNlQXJjaGl2ZU91dHB1dExvY2F0aW9uUGFnZSA9IG5ldyBTZXJ2aWNlQXJjaGl2ZU91dHB1dExvY2F0aW9uUGFnZSgpOwotICAgICAgICB0aGlzLmFkZFBhZ2Uoc2VydmljZUFyY2hpdmVPdXRwdXRMb2NhdGlvblBhZ2UpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYmMpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCNwZXJmb3JtRmluaXNoKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgewotICAgICAgICAgICAgICAgIAotICAgICAgICBXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24gb3AgPSBuZXcgV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uKCkKLSAgICAgICAgewotICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLSAgICAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24gLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgaWYgKG1vbml0b3IgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgbW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0KLSAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICogIjciIGlzIHRoZSB0b3RhbCBhbW91bnQgb2Ygc3RlcHMsIHNlZSBiZWxvdyBtb25pdG9yLndvcmtlZChhbW91bnQpCi0gICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICBtb25pdG9yLmJlZ2luVGFzayhTZXJ2aWNlQXJjaGl2ZXIuZ2V0UmVzb3VyY2VTdHJpbmcoIndpemFyZC5jb2RlZ2VuLnN0YXJ0bXNnIiksIDgpOwotCi0gICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBtb25pdG9yLndvcmtlZCgxKTsKLSAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBhIHdpemFyZCBiZWFuCi0gICAgICAgICAgICAgICAgICBXaXphcmRCZWFuIHdpekJlYW4gPSBuZXcgV2l6YXJkQmVhbigpOwotICAgICAgICAgICAgICAgICAgbW9uaXRvci53b3JrZWQoMSk7Ci0gICAgICAgICAgICAgICAgICB3aXpCZWFuLnNldFBhZ2UxYmVhbihjbGFzc0ZpbGVMb2NhdGlvblBhZ2UuZ2V0QmVhbigpKTsKLSAgICAgICAgICAgICAgICAgIG1vbml0b3Iud29ya2VkKDEpOwotICAgICAgICAgICAgICAgICAgd2l6QmVhbi5zZXRXc2RsQmVhbih3c2RsRmlsZVNlbGVjdGlvblBhZ2UuZ2V0QmVhbigpKTsKLSAgICAgICAgICAgICAgICAgIG1vbml0b3Iud29ya2VkKDEpOwotICAgICAgICAgICAgICAgICAgd2l6QmVhbi5zZXRQYWdlMmJlYW4oc2VydmljZVhNTEdlbmVyYXRpb25QYWdlLmdldEJlYW4oc2VydmljZVhNTEZpbGVTZWxlY3Rpb25QYWdlLmdldEJlYW4oKSkpOwotICAgICAgICAgICAgICAgICAgbW9uaXRvci53b3JrZWQoMSk7Ci0gICAgICAgICAgICAgICAgICB3aXpCZWFuLnNldExpYnJhcnlCZWFuKGxpYlBhZ2UuZ2V0QmVhbigpKTsKLSAgICAgICAgICAgICAgICAgIG1vbml0b3Iud29ya2VkKDEpOwotICAgICAgICAgICAgICAgICAgd2l6QmVhbi5zZXRQYWdlM2JlYW4oc2VydmljZUFyY2hpdmVPdXRwdXRMb2NhdGlvblBhZ2UuZ2V0QmVhbigpKTsKLSAgICAgICAgICAgICAgICAgIG1vbml0b3Iud29ya2VkKDEpOwotICAgICAgICAgICAgICAgICAgbmV3IENvbnRyb2xsZXIoKS5wcm9jZXNzKHdpekJlYW4pOwotICAgICAgICAgICAgICAgICAgbW9uaXRvci53b3JrZWQoMSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSBlKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSApOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgbW9uaXRvci5kb25lKCk7Ci0gICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgCi0gICAgICAgIC8qCi0gICAgICAgICAqIFN0YXJ0IHRoZSBnZW5lcmF0aW9uIGFzIG5ldyBXb3JrYmVuY2ggT3BlcmF0aW9uLCBzbyB0aGUgdXNlcgotICAgICAgICAgKiBjYW4gc2VlIHRoZSBwcm9ncmVzcyBhbmQsIGlmIG5lZWRlZCwgY2FuIHN0b3AgdGhlIG9wZXJhdGlvbi4KLSAgICAgICAgICovCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgIGdldENvbnRhaW5lcigpLnJ1bihmYWxzZSwgdHJ1ZSwgb3ApOwotICAgICAgICAgICBzaG93U3VjY2Vzc01lc3NhZ2UoU2VydmljZUFyY2hpdmVyLmdldFJlc291cmNlU3RyaW5nKCJ3aXphcmQuY29kZWdlbi5zdWNjZXNzIikpOwotICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlMSkKLSAgICAgICAgewotICAgICAgICAgICAgc2hvd0Vycm9yTWVzc2FnZShlMS5nZXRUYXJnZXRFeGNlcHRpb24oKS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlMSkKLSAgICAgICAgewotICAgICAgICAgICAgc2hvd0Vycm9yTWVzc2FnZShlMS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgc2hvd0Vycm9yTWVzc2FnZShTZXJ2aWNlQXJjaGl2ZXIuZ2V0UmVzb3VyY2VTdHJpbmcoIndpemFyZC5jb2RlZ2VuLnVua25vd24uZXJyb3IiKSArICIgICIrICBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgIH0KLQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpemFyZCNpbml0KG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2gsIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzaG93RXJyb3JNZXNzYWdlKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIE1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKHRoaXMuZ2V0U2hlbGwoKSwgU2VydmljZUFyY2hpdmVyLmdldFJlc291cmNlU3RyaW5nKCJ3aXphcmQuY29kZWdlbi5lcnJvci5tc2cuaGVhZGluZyIpLCBtZXNzYWdlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2hvd1N1Y2Nlc3NNZXNzYWdlKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIE1lc3NhZ2VEaWFsb2cub3BlbkluZm9ybWF0aW9uKHRoaXMuZ2V0U2hlbGwoKSwgU2VydmljZUFyY2hpdmVyLmdldFJlc291cmNlU3RyaW5nKCJ3aXphcmQuY29kZWdlbi5zdWNjZXNzLm1zZy5oZWFkaW5nIiksIG1lc3NhZ2UpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1zZXJ2aWNlLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9zZXJ2aWNlL2VjbGlwc2UvdWkvU2VydmljZVhNTEZpbGVTZWxlY3Rpb25QYWdlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2Utc2VydmljZS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvc2VydmljZS9lY2xpcHNlL3VpL1NlcnZpY2VYTUxGaWxlU2VsZWN0aW9uUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzE3YWE0Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1zZXJ2aWNlLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9zZXJ2aWNlL2VjbGlwc2UvdWkvU2VydmljZVhNTEZpbGVTZWxlY3Rpb25QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnRvb2wuc2VydmljZS5lY2xpcHNlLnVpOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29sLnNlcnZpY2UuYmVhbi5QYWdlMkJlYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29sLnNlcnZpY2UuZWNsaXBzZS5wbHVnaW4uU2VydmljZUFyY2hpdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbC51dGlsLlNlcnZpY2VQbHVnaW5VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRmlsZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi1wdWJsaWMgY2xhc3MgU2VydmljZVhNTEZpbGVTZWxlY3Rpb25QYWdlIGV4dGVuZHMgQWJzdHJhY3RTZXJ2aWNlV2l6YXJkUGFnZSB7Ci0gICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVklDRVNfWE1MX05BTUUgPSAiKi54bWwiOwotICAgIHByaXZhdGUgVGV4dCBzZXJ2aWNlWE1MVGV4dDsKLSAgICBwcml2YXRlIExhYmVsIG1hbnVhbFNlbGVjdGlvbkxhYmVsOwotICAgIHByaXZhdGUgTGFiZWwgcmVjb21tZW5kYXRpb25UZXh0TGFibGU7Ci0gICAgcHJpdmF0ZSBCdXR0b24gYnJvd3NlQnV0dG9uOwotICAgIHByaXZhdGUgQnV0dG9uIHNlbGVjdEF1dG9GaWxlR2VuZXJhdGlvbkNoZWNrQm94OwotICAgIAotICAgIAotICAgIHByaXZhdGUgYm9vbGVhbiBza2lwTmV4dFBhZ2U9dHJ1ZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gcGFnZUNvbXBsZXRlOwotICAgIAotICAgIHB1YmxpYyBTZXJ2aWNlWE1MRmlsZVNlbGVjdGlvblBhZ2UoKXsKLSAgICAgICAgc3VwZXIoInBhZ2UyIik7Ci0gICAgfQotICAgIAotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIudG9vbC5zZXJ2aWNlLmVjbGlwc2UudWkuQWJzdHJhY3RTZXJ2aWNlV2l6YXJkUGFnZSNpbml0aWFsaXplRGVmYXVsdFNldHRpbmdzKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRGVmYXVsdFNldHRpbmdzKCkgewotICAgICAgIHNldHRpbmdzLnB1dChQUkVGX1NFUlZJQ0VfWE1MX0ZJTEUsIiIpOwotICAgICAgIHNldHRpbmdzLnB1dChQUkVGX0NIRUNLX0FVVE9fR0VOX1NFUlZJQ0VfWE1MLGZhbHNlKTsKLQotICAgIH0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlI2NyZWF0ZUNvbnRyb2wob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBDb21wb3NpdGUgY29udGFpbmVyID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLSAgICAgICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgICAgICBsYXlvdXQubnVtQ29sdW1ucz0zOwotICAgICAgICBjb250YWluZXIuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgICAgICAgICAgICAKLSAgICAgICAgbWFudWFsU2VsZWN0aW9uTGFiZWwgPSBuZXcgTGFiZWwoY29udGFpbmVyLFNXVC5OVUxMKTsKLSAgICAgICAgbWFudWFsU2VsZWN0aW9uTGFiZWwuc2V0VGV4dChTZXJ2aWNlQXJjaGl2ZXIuZ2V0UmVzb3VyY2VTdHJpbmcoInBhZ2UyLnNlbGVjdHNlcnZpY2V4bWwuY2FwdGlvbiIpKTsKLQkJCi0gICAgICAgIEdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCXNlcnZpY2VYTUxUZXh0ID0gbmV3IFRleHQoY29udGFpbmVyLFNXVC5CT1JERVIpOwotCQlzZXJ2aWNlWE1MVGV4dC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJc2VydmljZVhNTFRleHQuc2V0VGV4dChzZXR0aW5ncy5nZXQoUFJFRl9TRVJWSUNFX1hNTF9GSUxFKSk7Ci0JCXNlcnZpY2VYTUxUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpewotCQkgICAgcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKXsKLQkJICAgIGhhbmRsZU1vZGlmeSgpOwotCQkgICAgfQotCQl9KTsKLQkJCi0JCWJyb3dzZUJ1dHRvbiA9IG5ldyBCdXR0b24oY29udGFpbmVyLFNXVC5QVVNIKTsKLQkJYnJvd3NlQnV0dG9uLnNldFRleHQoU2VydmljZUFyY2hpdmVyLmdldFJlc291cmNlU3RyaW5nKCJnZW5lcmFsLmJyb3dzZSIpKTsKLQkJYnJvd3NlQnV0dG9uLmFkZE1vdXNlTGlzdGVuZXIobmV3IE1vdXNlQWRhcHRlcigpewotCQkgICAgcHVibGljIHZvaWQgbW91c2VVcChNb3VzZUV2ZW50IGUpIHsKLQkJICAgICAgICBoYW5kbGVCcm93c2UoKTsKLQkJICAgIH0KLQkJfSk7Ci0JCQotCQlnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCXNlbGVjdEF1dG9GaWxlR2VuZXJhdGlvbkNoZWNrQm94ID0gbmV3IEJ1dHRvbihjb250YWluZXIsU1dULkNIRUNLKTsKLQkJc2VsZWN0QXV0b0ZpbGVHZW5lcmF0aW9uQ2hlY2tCb3guc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXNlbGVjdEF1dG9GaWxlR2VuZXJhdGlvbkNoZWNrQm94LnNldFRleHQoU2VydmljZUFyY2hpdmVyLmdldFJlc291cmNlU3RyaW5nKCJwYWdlMi5nZW5lcmF0ZWF1dG8uY2FwdGlvbiIpKTsKLQkJc2VsZWN0QXV0b0ZpbGVHZW5lcmF0aW9uQ2hlY2tCb3guc2V0U2VsZWN0aW9uKHNldHRpbmdzLmdldEJvb2xlYW4oUFJFRl9DSEVDS19BVVRPX0dFTl9TRVJWSUNFX1hNTCkpOwotCQlzZWxlY3RBdXRvRmlsZUdlbmVyYXRpb25DaGVja0JveC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKXsKLQkJICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpewotCQkgICAgICAgIGhhbmRsZVNlbGVjdGlvbigpOwotCQkgICAgfQotCQkgICAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpe30KLQkJfSk7Ci0JCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JCS8vZW5hYmxlIHRoZSBzZWxlY3Rpb24gY29tYm8gZm9yIG5vdwotCQkvL3NlbGVjdEF1dG9GaWxlR2VuZXJhdGlvbkNoZWNrQm94LnNldEVuYWJsZWQoZmFsc2UpOwotCQlzZWxlY3RBdXRvRmlsZUdlbmVyYXRpb25DaGVja0JveC5zZXRUb29sVGlwVGV4dChTZXJ2aWNlQXJjaGl2ZXIuZ2V0UmVzb3VyY2VTdHJpbmcoInBhZ2UyLmF1dG9nZW4udG9vbHRpcCIpKTsKLQkJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQkJCi0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJZ2QudmVydGljYWxTcGFuICA9MjsKLQkJcmVjb21tZW5kYXRpb25UZXh0TGFibGUgPSBuZXcgTGFiZWwoY29udGFpbmVyLFNXVC5OVUxMKTsKLQkJcmVjb21tZW5kYXRpb25UZXh0TGFibGUuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCS8vcmVjb21tZW5kYXRpb25UZXh0TGFibGUuc2V0Rm9yZWdyb3VuZCgpKSk7Ci0JCQotCQlzZXRDb250cm9sKGNvbnRhaW5lcik7Ci0JCQotCQlpZiAocmVzdG9yZWRGcm9tUHJldmlvdXNTZXR0aW5ncyl7Ci0JCSAgICBoYW5kbGVNb2RpZnkoKTsKLQkJICAgIGhhbmRsZVNlbGVjdGlvbigpOwotCQl9ZWxzZXsKLQkJICAgIHNldFBhZ2VDb21wbGV0ZShmYWxzZSk7Ci0JCSAgICB1cGRhdGVHZW5lcmF0aW9uUGFnZShmYWxzZSk7Ci0JCX0KLQkJCi0JCQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlQnJvd3NlKCl7Ci0gICAgICAgIEZpbGVEaWFsb2cgZmlsZURpYWxvZyA9IG5ldyBGaWxlRGlhbG9nKHRoaXMuZ2V0U2hlbGwoKSk7Ci0gICAgICAgIGZpbGVEaWFsb2cuc2V0RmlsdGVyRXh0ZW5zaW9ucyhuZXcgU3RyaW5nW117U0VSVklDRVNfWE1MX05BTUV9KTsKLSAgICAgICAgU3RyaW5nIHJldHVybkZpbGVOYW1lID0gZmlsZURpYWxvZy5vcGVuKCkgOwotICAgICAgICBpZiAocmV0dXJuRmlsZU5hbWUhPW51bGwpewotICAgICAgICAgICAgdGhpcy5zZXJ2aWNlWE1MVGV4dC5zZXRUZXh0KHJldHVybkZpbGVOYW1lKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlU2VsZWN0aW9uKCl7Ci0gICAgICAgIGJvb2xlYW4gc2VsZWN0aW9uID0gdGhpcy5zZWxlY3RBdXRvRmlsZUdlbmVyYXRpb25DaGVja0JveC5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgc2V0dGluZ3MucHV0KFBSRUZfQ0hFQ0tfQVVUT19HRU5fU0VSVklDRV9YTUwsc2VsZWN0aW9uKTsKLSAgICAgICAgaWYgKHNlbGVjdGlvbil7Ci0gICAgICAgICAgICBjaGFuZ2VNYW51YWxTZWxlY3Rpb25TdGF0dXMoZmFsc2UpOyAKLSAgICAgICAgICAgIHRoaXMuc2tpcE5leHRQYWdlID0gZmFsc2U7Ci0gICAgICAgICAgICB1cGRhdGVTdGF0dXMobnVsbCk7Ci0gICAgICAgICAgICB1cGRhdGVHZW5lcmF0aW9uUGFnZShmYWxzZSk7Ci0gICAgICAgIH1lbHNlewotICAgICAgICAgICAgY2hhbmdlTWFudWFsU2VsZWN0aW9uU3RhdHVzKHRydWUpOwotICAgICAgICAgICAgdGhpcy5za2lwTmV4dFBhZ2UgPSB0cnVlOwotICAgICAgICAgICAgaGFuZGxlTW9kaWZ5KCk7Ci0gICAgICAgICAgICB1cGRhdGVHZW5lcmF0aW9uUGFnZSh0cnVlKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlR2VuZXJhdGlvblBhZ2UoYm9vbGVhbiBzdGF0dXMpewotICAgICAgICBTZXJ2aWNlQXJjaGl2ZVdpemFyZCB3aXphcmQgPSAoU2VydmljZUFyY2hpdmVXaXphcmQpdGhpcy5nZXRXaXphcmQoKTsKLSAgICAgICAgd2l6YXJkLnVwZGF0ZVNlcnZpY2VYTUxHZW5lcmF0aW9uKHN0YXR1cyk7Ci0gICAgICAgCi0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBjaGFuZ2VNYW51YWxTZWxlY3Rpb25TdGF0dXMoYm9vbGVhbiBzdGF0ZSl7Ci0gICAgICAgIHRoaXMuc2VydmljZVhNTFRleHQuc2V0RW5hYmxlZChzdGF0ZSk7Ci0gICAgICAgIHRoaXMuYnJvd3NlQnV0dG9uLnNldEVuYWJsZWQoc3RhdGUpOwotICAgICAgICB0aGlzLm1hbnVhbFNlbGVjdGlvbkxhYmVsLnNldEVuYWJsZWQoc3RhdGUpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlTW9kaWZ5KCl7Ci0gICAgICAgIFN0cmluZyBzZXJ2aWNlWE1MU3RyaW5nID1zZXJ2aWNlWE1MVGV4dC5nZXRUZXh0KCkudHJpbSgpOyAKLSAgICAgICAgc2V0dGluZ3MucHV0KFBSRUZfU0VSVklDRV9YTUxfRklMRSxzZXJ2aWNlWE1MU3RyaW5nKTsKLSAgICAgICAgaWYgKHNlcnZpY2VYTUxTdHJpbmcuZXF1YWxzKCIiKSl7Ci0gICAgICAgICAgIHRoaXMudXBkYXRlU3RhdHVzKFNlcnZpY2VBcmNoaXZlci5nZXRSZXNvdXJjZVN0cmluZygicGFnZTIuZXJyb3Iuc2VydmljZW5hbWVlbXB0eSIpKTsKLSAgICAgICAgfWVsc2UgaWYgKCEobmV3IEZpbGUoc2VydmljZVhNTFN0cmluZykpLmV4aXN0cygpKXsKLSAgICAgICAgCXRoaXMudXBkYXRlU3RhdHVzKFNlcnZpY2VBcmNoaXZlci5nZXRSZXNvdXJjZVN0cmluZygicGFnZTIuZXJyb3Iuc2VydmljZW5vdGV4aXN0IikpOwotICAgICAgICB9ZWxzZSBpZighU2VydmljZVBsdWdpblV0aWxzLmlzU2VydmljZXNYTUxWYWxpZChzZXJ2aWNlWE1MU3RyaW5nKSl7Ci0gICAgICAgICAgICB0aGlzLnVwZGF0ZVN0YXR1cyhTZXJ2aWNlQXJjaGl2ZXIuZ2V0UmVzb3VyY2VTdHJpbmcoInBhZ2UyLmVycm9yLnNlcnZpY2VzZWxlY3RlZGludmFsaWQiKSk7ICAKLSAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICB0aGlzLnVwZGF0ZVN0YXR1cyhudWxsKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAKLSAgICBwdWJsaWMgdm9pZCB1cGRhdGVSZWNvbW1lbmRhdGlvbihTdHJpbmcgbWVzc2FnZSl7Ci0gICAgICAgIGlmIChyZWNvbW1lbmRhdGlvblRleHRMYWJsZSE9bnVsbCkKLSAgICAgICAgcmVjb21tZW5kYXRpb25UZXh0TGFibGUuc2V0VGV4dChtZXNzYWdlKTsKLSAgICB9Ci0gICAgCi0gICAKLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLnRvb2wuc2VydmljZS5lY2xpcHNlLnVpLkFic3RyYWN0U2VydmljZVdpemFyZFBhZ2UjaXNTa2lwTmV4dCgpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNTa2lwTmV4dCgpIHsKLSAgICAgICByZXR1cm4gdGhpcy5za2lwTmV4dFBhZ2U7Ci0gICAgfQotICAgIHB1YmxpYyBQYWdlMkJlYW4gZ2V0QmVhbigpewotICAgICAgICBQYWdlMkJlYW4gcGFnZUJlYW4gPSBuZXcgUGFnZTJCZWFuKCk7Ci0gICAgICAgIHBhZ2VCZWFuLnNldE1hbnVhbCghdGhpcy5zZWxlY3RBdXRvRmlsZUdlbmVyYXRpb25DaGVja0JveC5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgIHBhZ2VCZWFuLnNldE1hbnVhbEZpbGVOYW1lKHRoaXMuc2VydmljZVhNTFRleHQuZ2V0VGV4dCgpKTsKLSAgICAgICAgcmV0dXJuIHBhZ2VCZWFuOwotICAgIH0KLSAgICAKLQlwcm90ZWN0ZWQgYm9vbGVhbiBnZXRXaXphcmRDb21wbGV0ZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1zZXJ2aWNlLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9zZXJ2aWNlL2VjbGlwc2UvdWkvU2VydmljZVhNTEdlbmVyYXRpb25QYWdlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2Utc2VydmljZS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvc2VydmljZS9lY2xpcHNlL3VpL1NlcnZpY2VYTUxHZW5lcmF0aW9uUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzRlZmI4Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1zZXJ2aWNlLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9zZXJ2aWNlL2VjbGlwc2UvdWkvU2VydmljZVhNTEdlbmVyYXRpb25QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnRvb2wuc2VydmljZS5lY2xpcHNlLnVpOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29sLnNlcnZpY2UuYmVhbi5QYWdlMkJlYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29sLnNlcnZpY2UuYmVhbi5XU0RMQXV0b0dlbmVyYXRlT3B0aW9uQmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRvb2wuc2VydmljZS5lY2xpcHNlLnBsdWdpbi5TZXJ2aWNlQXJjaGl2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uZXQuVVJMQ2xhc3NMb2FkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotCi1wdWJsaWMgY2xhc3MgU2VydmljZVhNTEdlbmVyYXRpb25QYWdlIGV4dGVuZHMgQWJzdHJhY3RTZXJ2aWNlV2l6YXJkUGFnZXsKLSAgICAKLSAgICBwcml2YXRlIFRleHQgY2xhc3NOYW1lVGV4dEJveDsKLSAgICBwcml2YXRlIFRleHQgc2VydmljZU5hbWVUZXh0Qm94OwotICAgIHByaXZhdGUgQnV0dG9uIHNlYXJjaERlY2xhcmVkTWV0aG9kc0NoZWNrQm94OwotICAgIEJ1dHRvbiBsb2FkQnV0dG9uOwotICAgIHByaXZhdGUgVGFibGUgdGFibGU7Ci0gICAgCi0gICAgcHJpdmF0ZSBib29sZWFuIGRpcnR5ID0gZmFsc2U7Ci0gICAgCi0gICAgcHVibGljIFNlcnZpY2VYTUxHZW5lcmF0aW9uUGFnZSgpewotICAgICAgICBzdXBlcigicGFnZTMiKTsKLSAgICB9Ci0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi50b29sLnNlcnZpY2UuZWNsaXBzZS51aS5BYnN0cmFjdFNlcnZpY2VXaXphcmRQYWdlI2luaXRpYWxpemVEZWZhdWx0U2V0dGluZ3MoKQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVEZWZhdWx0U2V0dGluZ3MoKSB7Ci0gICAgICBzZXR0aW5ncy5wdXQoUFJFRl9TRVJWSUNFX0dFTl9TRVJWSUNFX05BTUUsIk15U2VydmljZSIpOwotICAgICAgc2V0dGluZ3MucHV0KFBSRUZfU0VSVklDRV9HRU5fQ0xBU1NOQU1FLCIiKTsKLSAgICAgIHNldHRpbmdzLnB1dChQUkVGX1NFUlZJQ0VfR0VOX0xPQURfQUxMLGZhbHNlKTsKLSAgICB9Ci0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgQ29tcG9zaXRlIGNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0gICAgICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICAgICAgbGF5b3V0Lm51bUNvbHVtbnM9MzsKLSAgICAgICAgY29udGFpbmVyLnNldExheW91dChsYXlvdXQpOwotICAgICAgICAKLSAgICAgICAgTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29udGFpbmVyLFNXVC5OVUxMKTsKLSAgICAgICAgbGFiZWwuc2V0VGV4dChTZXJ2aWNlQXJjaGl2ZXIuZ2V0UmVzb3VyY2VTdHJpbmcoInBhZ2UzLnNlcnZpY2VuYW1lLmxhYmxlIikpOwotICAgICAgICAKLSAgICAgICAgR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLSAgICAgICAgZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgICAgICBzZXJ2aWNlTmFtZVRleHRCb3ggPSBuZXcgVGV4dChjb250YWluZXIsU1dULkJPUkRFUik7Ci0gICAgICAgIHNlcnZpY2VOYW1lVGV4dEJveC5zZXRMYXlvdXREYXRhKGdkKTsKLSAgICAgICAgc2VydmljZU5hbWVUZXh0Qm94LnNldFRvb2xUaXBUZXh0KFNlcnZpY2VBcmNoaXZlci5nZXRSZXNvdXJjZVN0cmluZygicGFnZTMuc2VydmljZW5hbWUudG9vbHRpcCIpKTsKLSAgICAgICAgc2VydmljZU5hbWVUZXh0Qm94LnNldFRleHQoc2V0dGluZ3MuZ2V0KFBSRUZfU0VSVklDRV9HRU5fU0VSVklDRV9OQU1FKSk7Ci0gICAgICAgIHNlcnZpY2VOYW1lVGV4dEJveC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKXsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSl7Ci0gICAgICAgICAgICAgICAgdXBkYXRlRGlydHlTdGF0dXModHJ1ZSk7Ci0gICAgICAgICAgICAgICAgc2V0dGluZ3MucHV0KFBSRUZfU0VSVklDRV9HRU5fU0VSVklDRV9OQU1FLHNlcnZpY2VOYW1lVGV4dEJveC5nZXRUZXh0KCkpOwotICAgICAgICAgICAgICAgIC8vdmFsaWRhdGUKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgCi0gICAgICAgIAotICAgICAgICBsYWJlbCA9IG5ldyBMYWJlbChjb250YWluZXIsU1dULk5VTEwpOwotICAgICAgICBsYWJlbC5zZXRUZXh0KFNlcnZpY2VBcmNoaXZlci5nZXRSZXNvdXJjZVN0cmluZygicGFnZTMuY2xhc3NuYW1lLmxhYmxlIikpOwotICAgICAgICAKLSAgICAgICAgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLSAgICAgICAgY2xhc3NOYW1lVGV4dEJveCA9IG5ldyBUZXh0KGNvbnRhaW5lcixTV1QuQk9SREVSKTsKLSAgICAgICAgY2xhc3NOYW1lVGV4dEJveC5zZXRMYXlvdXREYXRhKGdkKTsKLSAgICAgICAgY2xhc3NOYW1lVGV4dEJveC5zZXRUb29sVGlwVGV4dChTZXJ2aWNlQXJjaGl2ZXIuZ2V0UmVzb3VyY2VTdHJpbmcoInBhZ2UzLmNsYXNzbmFtZS50b29sdGlwIikpOwotICAgICAgICBjbGFzc05hbWVUZXh0Qm94LnNldFRleHQoc2V0dGluZ3MuZ2V0KFBSRUZfU0VSVklDRV9HRU5fQ0xBU1NOQU1FKSk7Ci0gICAgICAgIGNsYXNzTmFtZVRleHRCb3guYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCl7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpewotICAgICAgICAgICAgICAgIHVwZGF0ZURpcnR5U3RhdHVzKHRydWUpOwotICAgICAgICAgICAgICAgIHNldHRpbmdzLnB1dChQUkVGX1NFUlZJQ0VfR0VOX0NMQVNTTkFNRSxjbGFzc05hbWVUZXh0Qm94LmdldFRleHQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgIAotICAgICAgICAKLSAgICAgICAgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLSAgICAgICAgbG9hZEJ1dHRvbiA9IG5ldyBCdXR0b24oY29udGFpbmVyLFNXVC5QVVNIKTsKLSAgICAgICAgbG9hZEJ1dHRvbi5zZXRUZXh0KFNlcnZpY2VBcmNoaXZlci5nZXRSZXNvdXJjZVN0cmluZygicGFnZTMubG9hZGJ1dHRvbi5sYWJsZSIpKTsKLSAgICAgICAgbG9hZEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLSAgICAgICAgbG9hZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKXsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpewotICAgICAgICAgICAgICAgIHVwZGF0ZVRhYmxlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSl7fQotICAgICAgICB9KTsKLSAgICAgICAgCi0gICAgICAgIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0gICAgICAgIGdkLmhvcml6b250YWxTcGFuID0gMzsKLSAgICAgICAgCi0gICAgICAgIHNlYXJjaERlY2xhcmVkTWV0aG9kc0NoZWNrQm94ID0gbmV3IEJ1dHRvbihjb250YWluZXIsU1dULkNIRUNLKTsKLSAgICAgICAgc2VhcmNoRGVjbGFyZWRNZXRob2RzQ2hlY2tCb3guc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgICAgIHNlYXJjaERlY2xhcmVkTWV0aG9kc0NoZWNrQm94LnNldFRleHQoU2VydmljZUFyY2hpdmVyLmdldFJlc291cmNlU3RyaW5nKCJwYWdlMy5kZWNsYXJlZC5sYWJsZSIpKTsKLSAgICAgICAgc2VhcmNoRGVjbGFyZWRNZXRob2RzQ2hlY2tCb3guYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCl7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKXsKLSAgICAgICAgICAgICAgICB1cGRhdGVEaXJ0eVN0YXR1cyh0cnVlKTsvL2RpcnR5Ci0gICAgICAgICAgICAgICAgc2V0dGluZ3MucHV0KFBSRUZfU0VSVklDRV9HRU5fTE9BRF9BTEwsc2VhcmNoRGVjbGFyZWRNZXRob2RzQ2hlY2tCb3guZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICAgICAgICAgIGlmKHRhYmxlLmlzVmlzaWJsZSgpKXsKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlVGFibGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSl7fSAKLSAgICAgICAgfSk7Ci0gICAgICAgIHNlYXJjaERlY2xhcmVkTWV0aG9kc0NoZWNrQm94LnNldFNlbGVjdGlvbihzZXR0aW5ncy5nZXRCb29sZWFuKFBSRUZfU0VSVklDRV9HRU5fTE9BRF9BTEwpKTsKLSAgICAgICAgCi0gICAgICAgIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0gICAgICAgIGdkLmhvcml6b250YWxTcGFuID0gMjsKLSAgICAgICAgZ2QudmVydGljYWxTcGFuID0gNTsKLSAgICAgICAgCi0gICAgICAgIHRhYmxlID0gbmV3IFRhYmxlKGNvbnRhaW5lcixTV1QuU0lOR0xFfFNXVC5GVUxMX1NFTEVDVElPTnxTV1QuQ0hFQ0spOwotICAgICAgICB0YWJsZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0gICAgICAgIHRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7IAotICAgICAgICB0YWJsZS5zZXRMYXlvdXREYXRhKGdkKTsKLSAgICAgICAgZGVjbGFyZUNvbHVtbih0YWJsZSwyMCwiIik7Ci0gICAgICAgIGRlY2xhcmVDb2x1bW4odGFibGUsMTAwLFNlcnZpY2VBcmNoaXZlci5nZXRSZXNvdXJjZVN0cmluZygicGFnZTMudGFibGUuY29sMSIpKTsKLSAgICAgICAgZGVjbGFyZUNvbHVtbih0YWJsZSwxMDAsU2VydmljZUFyY2hpdmVyLmdldFJlc291cmNlU3RyaW5nKCJwYWdlMy50YWJsZS5jb2wyIikpOwotICAgICAgICBkZWNsYXJlQ29sdW1uKHRhYmxlLDEwMCxTZXJ2aWNlQXJjaGl2ZXIuZ2V0UmVzb3VyY2VTdHJpbmcoInBhZ2UzLnRhYmxlLmNvbDMiKSk7Ci0gICAgICAgIAotICAgICAgICB0YWJsZS5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCi0gICAgICAgIGlmIChyZXN0b3JlZEZyb21QcmV2aW91c1NldHRpbmdzKXsKLSAgICAgICAgICAgIC8vdHJ5IHJ1bm5pbmcgdGhlIHVwZGF0ZQotICAgICAgICAgICAgdXBkYXRlVGFibGUoKTsKLSAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICBzZXRQYWdlQ29tcGxldGUoZmFsc2UpOyAgCi0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIAotCQlzZXRDb250cm9sKGNvbnRhaW5lcik7Ci0KLSAgICB9Ci0gICAgIAotICAgIC8qKgotICAgICAqIGlmIHRoZSB1c2VyIGhhcyBhbHJlYWR5IGZpbGxlZCB0aGUgZGF0YSwgdGhpcyBwYWdlIG5lZWRzIHRvIGJlIAotICAgICAqIHVuY2hhbmdlYWJsZQotICAgICAqCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZmlsbERhdGFmcm9tUHJldmlvdXMoV1NETEF1dG9HZW5lcmF0ZU9wdGlvbkJlYW4gYmVhbikgewotICAgICAgICAvL3NldCBjbGFzcyBuYW1lCi0gICAgICAgIFN0cmluZyBhdXRvbWF0aWNDbGFzc05hbWUgPSBiZWFuLmdldENsYXNzRmlsZU5hbWUoKTsKLSAgICAgICAgdGhpcy5jbGFzc05hbWVUZXh0Qm94LnNldFRleHQoYXV0b21hdGljQ2xhc3NOYW1lKTsKLSAgICAgICAgdGhpcy5jbGFzc05hbWVUZXh0Qm94LnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAvL3NldCBzZXJ2aWNlIG5hbWUKLSAgICAgICAgU3RyaW5nW10gY2xhc3NuYW1lUGFydHMgPSBhdXRvbWF0aWNDbGFzc05hbWUuc3BsaXQoIlxcLiIpOwotICAgICAgICBpZiAoY2xhc3NuYW1lUGFydHMubGVuZ3RoID09IDApIHsKLSAgICAgICAgICAgIHRoaXMuc2VydmljZU5hbWVUZXh0Qm94LnNldFRleHQoYXV0b21hdGljQ2xhc3NOYW1lKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRoaXMuc2VydmljZU5hbWVUZXh0Qm94Ci0gICAgICAgICAgICAgICAgICAgIC5zZXRUZXh0KGNsYXNzbmFtZVBhcnRzW2NsYXNzbmFtZVBhcnRzLmxlbmd0aCAtIDFdKTsKLSAgICAgICAgfQotICAgICAgICAvL2xvYWQgdGhlIGNsYXNzZXMKLSAgICAgICAgdXBkYXRlVGFibGUoKTsKLSAgICAgICAgLy9jaGVjayB0aGUgY29ycmVjdCBvbmVzCi0KLSAgICAgICAgLy9kaXNiYWxlIHRoZSB0YWJsZQotICAgICAgICB0YWJsZS5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgbG9hZEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgY2xlYXJQcmV2aW91c0RhdGEoKXsKLSAgICAgICAgdGhpcy5jbGFzc05hbWVUZXh0Qm94LnNldFRleHQoIiIpOwotICAgICAgICB0aGlzLmNsYXNzTmFtZVRleHRCb3guc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgLy9zZXQgc2VydmljZSBuYW1lCi0gICAgICAgIHRoaXMuc2VydmljZU5hbWVUZXh0Qm94LnNldFRleHQoIiIpOwotICAgICAgICBpZiAodGFibGUuaXNWaXNpYmxlKCkpewotICAgICAgICAgICAgdGFibGUuc2V0VmlzaWJsZShmYWxzZSk7Ci0gICAgICAgIH0KLSAgICAgICAgbG9hZEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotICAgIH0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlRGlydHlTdGF0dXMoYm9vbGVhbiBzdGF0dXMpewotICAgICAgICBkaXJ0eSA9IHN0YXR1czsKLSAgICAgICAgaWYgKHRhYmxlLmlzVmlzaWJsZSgpKXsKLSAgICAgICAgICAgIHRhYmxlLnNldEVuYWJsZWQoIXN0YXR1cyk7Ci0gICAgICAgIH0KLSAgICAgICAgc2V0UGFnZUNvbXBsZXRlKCFzdGF0dXMpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgZGVjbGFyZUNvbHVtbihUYWJsZSB0YWJsZSwgaW50IHdpZHRoLFN0cmluZyBjb2xOYW1lKXsKLSAgICAgICAgVGFibGVDb2x1bW4gY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLFNXVC5OT05FKTsKLSAgICAgICAgY29sdW1uLnNldFdpZHRoKHdpZHRoKTsKLSAgICAgICAgY29sdW1uLnNldFRleHQoY29sTmFtZSk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVUYWJsZSgpIHsKLSAgICAgICAgLy9nZXQgYSBVUkwgZnJvbSB0aGUgY2xhc3MgZmlsZSBsb2NhdGlvbgotICAgICAgICB0cnkgewotICAgICAgICAgICAgU3RyaW5nIGNsYXNzRmlsZUxvY2F0aW9uID0gZ2V0Q2xhc3NGaWxlTG9jYXRpb24oKTsKLSAgICAgICAgICAgIFVSTCBjbGFzc0ZpbGVVUkwgPSBuZXcgRmlsZShjbGFzc0ZpbGVMb2NhdGlvbikudG9VUkwoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICBBcnJheUxpc3QgbGlzdG9mVVJMcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgbGlzdG9mVVJMcy5hZGQoY2xhc3NGaWxlVVJMKTsKLSAgICAgICAgICAgCi0gICAgICAgICAgICAvL2dldCB0aGUgbGlicmFyaWVzIGZyb20gdGhlIGxpYiBwYWdlIGFuZCBsb2FkIGl0IAotICAgICAgICAgICAgU3RyaW5nW10gbGliRmlsZUxpc3QgPSAoKFNlcnZpY2VBcmNoaXZlV2l6YXJkKXRoaXMuZ2V0V2l6YXJkKCkpLmdldExpYkZpbGVMaXN0KCk7Ci0gICAgICAgICAgICBpZiAobGliRmlsZUxpc3QhPW51bGwpewotICAgICAgICAgICAgCWludCBjb3VudCA9IGxpYkZpbGVMaXN0Lmxlbmd0aDsKLQkJCQlmb3IgKGludCBpPTA7aTxjb3VudDtpKyspewotCQkJCQlsaXN0b2ZVUkxzLmFkZChuZXcgRmlsZShsaWJGaWxlTGlzdFtpXSkudG9VUkwoKSk7Ci0gICAgICAgICAgICAJfQotICAgICAgICAgICAgfQotICAgICAgICAgICAKLSAgICAgICAgICAgIAotICAgICAgICAgICAgQ2xhc3NMb2FkZXIgbG9hZGVyID0gbmV3IFVSTENsYXNzTG9hZGVyKChVUkxbXSlsaXN0b2ZVUkxzLnRvQXJyYXkobmV3IFVSTFtsaXN0b2ZVUkxzLnNpemUoKV0pKTsKLSAgICAgICAgICAgIENsYXNzIGNsYXp6ID0gQ2xhc3MuZm9yTmFtZShjbGFzc05hbWVUZXh0Qm94LmdldFRleHQoKSx0cnVlLGxvYWRlcik7Ci0gICAgICAgICAgICBNZXRob2RbXSBtZXRob2RzID0gbnVsbDsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoc2VhcmNoRGVjbGFyZWRNZXRob2RzQ2hlY2tCb3guZ2V0U2VsZWN0aW9uKCkpewotICAgICAgICAgICAgICAgIG1ldGhvZHMgPSBjbGF6ei5nZXREZWNsYXJlZE1ldGhvZHMoKTsKLSAgICAgICAgICAgIH1lbHNlewotICAgICAgICAgICAgICAgIG1ldGhvZHMgPSBjbGF6ei5nZXRNZXRob2RzKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGludCBtZXRob2RDb3VudCA9IG1ldGhvZHMubGVuZ3RoOwotICAgICAgICAgICAgaWYgKG1ldGhvZENvdW50ID4gMCkgewotICAgICAgICAgICAgICAgIHRhYmxlLnJlbW92ZUFsbCgpOwotICAgICAgICAgICAgICAgIFRhYmxlSXRlbVtdIGl0ZW1zID0gbmV3IFRhYmxlSXRlbVttZXRob2RDb3VudF07IC8vIEFuIGl0ZW0gZm9yIGVhY2ggZmllbGQKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBtZXRob2RDb3VudDsgaSsrKXsKLSAgICAgICAgICAgICAgICAgICBpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsKLSAgICAgICAgICAgICAgICAgICBpdGVtc1tpXS5zZXRUZXh0KDEsbWV0aG9kc1tpXS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgIGl0ZW1zW2ldLnNldFRleHQoMixtZXRob2RzW2ldLmdldFJldHVyblR5cGUoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgIGl0ZW1zW2ldLnNldFRleHQoMyxtZXRob2RzW2ldLmdldFBhcmFtZXRlclR5cGVzKCkubGVuZ3RoKyIiKTsKLSAgICAgICAgICAgICAgICAgICBpdGVtc1tpXS5zZXRDaGVja2VkKHRydWUpOy8vY2hlY2sgdGhlbSBhbGwgYnkgZGVmYXVsdAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0YWJsZS5zZXRWaXNpYmxlKHRydWUpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vdXBkYXRlIHRoZSBkaXJ0eSB2YXJpYWJsZQotICAgICAgICAgICAgICAgdXBkYXRlRGlydHlTdGF0dXMoZmFsc2UpOwotICAgICAgICAgICAgICAgdXBkYXRlU3RhdHVzKG51bGwpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgIHVwZGF0ZVN0YXR1cyhTZXJ2aWNlQXJjaGl2ZXIuZ2V0UmVzb3VyY2VTdHJpbmcoInBhZ2UzLmVycm9yLnVybCIpICtlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICB1cGRhdGVTdGF0dXMoU2VydmljZUFyY2hpdmVyLmdldFJlc291cmNlU3RyaW5nKCJwYWdlMy5lcnJvci5jbGFzcyIpKyBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKXsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICB1cGRhdGVTdGF0dXMoU2VydmljZUFyY2hpdmVyLmdldFJlc291cmNlU3RyaW5nKCJwYWdlMy5lcnJvci51bmtub3duIikgKyBlLmdldE1lc3NhZ2UoKSk7IAotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIGlzRGlydHkoKXsKLSAgICAgICAgcmV0dXJuIGRpcnR5OwotICAgIH0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRDbGFzc0ZpbGVMb2NhdGlvbigpewotICAgICAgICBTZXJ2aWNlQXJjaGl2ZVdpemFyZCB3aXphcmQgPSAoU2VydmljZUFyY2hpdmVXaXphcmQpZ2V0V2l6YXJkKCk7Ci0gICAgICAgIHJldHVybiB3aXphcmQuZ2V0Q2xhc3NGaWxlTG9jYXRpb24oKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFBhZ2UyQmVhbiBnZXRCZWFuKFBhZ2UyQmVhbiBwcmV2aW91c0JlYW4pewotICAgICAgICBpZiAoIXByZXZpb3VzQmVhbi5pc01hbnVhbCgpKXsKLQkgICAgICAgIHByZXZpb3VzQmVhbi5zZXRBdXRvbWF0aWModHJ1ZSk7Ci0JICAgICAgICBwcmV2aW91c0JlYW4uc2V0QXV0b21hdGljQ2xhc3NOYW1lKGNsYXNzTmFtZVRleHRCb3guZ2V0VGV4dCgpKTsKLQkgICAgICAgIEFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCSAgICAgICAgVGFibGVJdGVtW10gaXRlbXMgPSB0YWJsZS5nZXRJdGVtcygpOwotCSAgICAgICAgaW50IGl0ZW1MZW5ndGggPSBpdGVtcy5sZW5ndGg7Ci0JICAgICAgICBmb3IoaW50IGk9MDtpPGl0ZW1MZW5ndGg7aSsrKXsKLQkgICAgICAgICAgIGlmKGl0ZW1zW2ldLmdldENoZWNrZWQoKSl7Ci0JICAgICAgICAgICAgICAgbGlzdC5hZGQoaXRlbXNbaV0uZ2V0VGV4dCgxKSk7Ly9nZXQgdGhlIHNlbGVjdGVkIG1ldGhvZCBuYW1lIG9ubHkKLQkgICAgICAgICAgIH0KLQkgICAgICAgIH0KLQkgICAgICAgIHByZXZpb3VzQmVhbi5zZXRTZWxlY3RlZE1ldGhvZE5hbWVzKGxpc3QpOwotCSAgICAgICAgcHJldmlvdXNCZWFuLnNldFNlcnZpY2VOYW1lKHRoaXMuc2VydmljZU5hbWVUZXh0Qm94LmdldFRleHQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHByZXZpb3VzQmVhbjsKLSAgICB9Ci0gICAgCi0JcHJvdGVjdGVkIGJvb2xlYW4gZ2V0V2l6YXJkQ29tcGxldGUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2Utc2VydmljZS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvc2VydmljZS9lY2xpcHNlL3VpL1dTRExGaWxlU2VsZWN0aW9uUGFnZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLXNlcnZpY2UtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL3NlcnZpY2UvZWNsaXBzZS91aS9XU0RMRmlsZVNlbGVjdGlvblBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQxNWFiZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2Utc2VydmljZS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvc2VydmljZS9lY2xpcHNlL3VpL1dTRExGaWxlU2VsZWN0aW9uUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50b29sLnNlcnZpY2UuZWNsaXBzZS51aTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbC5zZXJ2aWNlLmJlYW4uV1NETEZpbGVMb2NhdGlvbkJlYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29sLnNlcnZpY2UuZWNsaXBzZS5wbHVnaW4uU2VydmljZUFyY2hpdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5GaWxlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBXU0RMRmlsZVNlbGVjdGlvblBhZ2UgZXh0ZW5kcyBBYnN0cmFjdFNlcnZpY2VXaXphcmRQYWdlIHsKLSAgICAKLSAgICAvLyAgc2V0IHRoZSBkZWZhdWx0IHRvIGZhbHNlLiBUaGlzIHN0ZXAgY2Fubm90IGJlIHNraXBwZWQKLSAgICBwcml2YXRlIGJvb2xlYW4gc2tpcE5leHRQYWdlID0gZmFsc2U7Ci0gICAgCi0gICAgcHJpdmF0ZSBUZXh0IHdzZGxUZXh0Qm94OwotICAgIHByaXZhdGUgTGFiZWwgc2VsZWN0aW9uTGFiZWw7Ci0gICAgcHJpdmF0ZSBCdXR0b24gYnJvd3NlQnV0dG9uOwotICAgIC8vcHJpdmF0ZSBCdXR0b24gYXV0b0dlbmVyYXRlV1NETENoZWNrQnV0dG9uOwotICAgIHByaXZhdGUgQnV0dG9uIHNraXBXU0RMQ2hlY2tCdXR0b247Ci0gICAgcHJpdmF0ZSBCdXR0b24gc2VsZWN0V1NETENoZWNrQnV0dG9uOwotICAgIAotICAgIHB1YmxpYyBXU0RMRmlsZVNlbGVjdGlvblBhZ2UoKXsKLSAgICAgICAgc3VwZXIoInBhZ2U1Iik7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi50b29sLnNlcnZpY2UuZWNsaXBzZS51aS5BYnN0cmFjdFNlcnZpY2VXaXphcmRQYWdlI2luaXRpYWxpemVEZWZhdWx0U2V0dGluZ3MoKQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVEZWZhdWx0U2V0dGluZ3MoKSB7Ci0gICAgICAgIHNldHRpbmdzLnB1dChQUkVGX1dTRExfRklMRV9OQU1FLCIiKTsKLSAgICAgICAgc2V0dGluZ3MucHV0KFBSRUZfQ0hFQ0tfV1NETF9HRU5FUkFURSx0cnVlKTsKLSAgICAgICAgc2V0dGluZ3MucHV0KFBSRUZfQ0hFQ0tfU0tJUF9XU0RMLGZhbHNlKTsKLSAgICAgICAgc2V0dGluZ3MucHV0KFBSRUZfQ0hFQ0tfU0VMRUNUX1dTREwsZmFsc2UpOwotCi0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgQ29tcG9zaXRlIGNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0gICAgICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICAgICAgbGF5b3V0Lm51bUNvbHVtbnM9MzsKLSAgICAgICAgY29udGFpbmVyLnNldExheW91dChsYXlvdXQpOwotICAgICAgICAKLSAgICAgICAgR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJLy9nZC5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCS8vYXV0b0dlbmVyYXRlV1NETENoZWNrQnV0dG9uID0gbmV3IEJ1dHRvbihjb250YWluZXIsU1dULkNIRUNLKTsKLQkJLy9hdXRvR2VuZXJhdGVXU0RMQ2hlY2tCdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCS8vYXV0b0dlbmVyYXRlV1NETENoZWNrQnV0dG9uLnNldFRleHQoU2VydmljZUFyY2hpdmVyLmdldFJlc291cmNlU3RyaW5nKCJwYWdlNS5nZW5lcmF0ZWF1dG8uY2FwdGlvbiIpKTsKLQkJLy9hdXRvR2VuZXJhdGVXU0RMQ2hlY2tCdXR0b24uc2V0U2VsZWN0aW9uKHNldHRpbmdzLmdldEJvb2xlYW4oUFJFRl9DSEVDS19XU0RMX0dFTkVSQVRFKSk7Ci0JCS8vYXV0b0dlbmVyYXRlV1NETENoZWNrQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpewotCQkvLyAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKXsKLQkJLy8gICAgICAgIGhhbmRsZVNlbGVjdGlvbigpOwotCQkvLyAgICB9Ci0JCS8vICAgIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKXt9Ci0JCS8vfSk7Ci0JCS8vYXV0b0dlbmVyYXRlV1NETENoZWNrQnV0dG9uLnNldFRvb2xUaXBUZXh0KFNlcnZpY2VBcmNoaXZlci5nZXRSZXNvdXJjZVN0cmluZygicGFnZTUuYXV0b2dlbi50b29sdGlwIikpOwotCQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JCS8vIGVuYWJsZSB0aGUgYXV0b21hdGljIGdlbmVyYXRpb24gYm94Ci0JCS8vYXV0b0dlbmVyYXRlV1NETENoZWNrQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCQkKLQkJCi0JCWdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMzsKLQkJc2tpcFdTRExDaGVja0J1dHRvbiA9IG5ldyBCdXR0b24oY29udGFpbmVyLFNXVC5DSEVDSyk7Ci0JCXNraXBXU0RMQ2hlY2tCdXR0b24uc2V0VGV4dChTZXJ2aWNlQXJjaGl2ZXIuZ2V0UmVzb3VyY2VTdHJpbmcoInBhZ2U1LnNraXBXU0RMLmNhcHRpb24iKSk7Ci0JCXNraXBXU0RMQ2hlY2tCdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXNraXBXU0RMQ2hlY2tCdXR0b24uc2V0U2VsZWN0aW9uKHNldHRpbmdzLmdldEJvb2xlYW4oUFJFRl9DSEVDS19TS0lQX1dTREwpKTsKLQkJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCQkvLyBlbmFibGUgdGhlIHNraXAgY2hlY2sgYm94Ci0JCXNraXBXU0RMQ2hlY2tCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JCXNraXBXU0RMQ2hlY2tCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCl7Ci0JCSAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKXsKLQkJICAgICAgICBoYW5kbGVTa2lwKCk7Ci0JCSAgICB9Ci0JCSAgICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSl7fSAKLQkJICAgIAotCQl9KTsKLQkJCi0JCS8vYWRkIGFuIGVtcHR5IGxhYmxlCi0JCW5ldyBMYWJlbChjb250YWluZXIsU1dULk5PTkUpOwotCQkKLQkJZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlzZWxlY3RXU0RMQ2hlY2tCdXR0b24gPSBuZXcgQnV0dG9uKGNvbnRhaW5lcixTV1QuQ0hFQ0spOwotCQlzZWxlY3RXU0RMQ2hlY2tCdXR0b24uc2V0VGV4dChTZXJ2aWNlQXJjaGl2ZXIuZ2V0UmVzb3VyY2VTdHJpbmcoInBhZ2U1LnNlbGVjdFdTREwuY2FwdGlvbiIpKTsKLQkJc2VsZWN0V1NETENoZWNrQnV0dG9uLnNldExheW91dERhdGEoZ2QpOwotCQlzZWxlY3RXU0RMQ2hlY2tCdXR0b24uc2V0U2VsZWN0aW9uKHNldHRpbmdzLmdldEJvb2xlYW4oUFJFRl9DSEVDS19TRUxFQ1RfV1NETCkpOwotCQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JCS8vIGVuYWJsZSB0aGUgc2tpcCBjaGVjayBib3gKLQkJc2VsZWN0V1NETENoZWNrQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCQlzZWxlY3RXU0RMQ2hlY2tCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCl7Ci0JCSAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKXsKLQkJICAgICAgICBoYW5kbGVTZWxlY3QoKTsKLQkJICAgIH0KLQkJICAgIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKXt9IAotCQkgICAgCi0JCX0pOwotICAgICAgICAgICAKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsgCi0gICAgICAgIHNlbGVjdGlvbkxhYmVsPSBuZXcgTGFiZWwoY29udGFpbmVyLFNXVC5OVUxMKTsKLSAgICAgICAgc2VsZWN0aW9uTGFiZWwuc2V0VGV4dChTZXJ2aWNlQXJjaGl2ZXIuZ2V0UmVzb3VyY2VTdHJpbmcoInBhZ2U1LnNlbGVjdHdzZGwuY2FwdGlvbiIpKTsKLQkJCi0gICAgICAgIHdzZGxUZXh0Qm94ID0gbmV3IFRleHQoY29udGFpbmVyLFNXVC5CT1JERVIpOwotICAgICAgICB3c2RsVGV4dEJveC5zZXRMYXlvdXREYXRhKGdkKTsKLSAgICAgICAgd3NkbFRleHRCb3guc2V0VGV4dChzZXR0aW5ncy5nZXQoUFJFRl9XU0RMX0ZJTEVfTkFNRSkpOwotICAgICAgICB3c2RsVGV4dEJveC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKXsKLQkJICAgIHB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSl7Ci0JCSAgICAgICAgaGFuZGxlTW9kaWZ5KCk7Ci0JCSAgICB9Ci0JCX0pOwotCQkKLQkJYnJvd3NlQnV0dG9uID0gbmV3IEJ1dHRvbihjb250YWluZXIsU1dULlBVU0gpOwotCQlicm93c2VCdXR0b24uc2V0VGV4dChTZXJ2aWNlQXJjaGl2ZXIuZ2V0UmVzb3VyY2VTdHJpbmcoImdlbmVyYWwuYnJvd3NlIikpOwotCQlicm93c2VCdXR0b24uYWRkTW91c2VMaXN0ZW5lcihuZXcgTW91c2VBZGFwdGVyKCl7Ci0JCSAgICBwdWJsaWMgdm9pZCBtb3VzZVVwKE1vdXNlRXZlbnQgZSkgewotCQkgICAgICAgIGhhbmRsZUJyb3dzZSgpOwotCQkgICAgfQotCQl9KTsKLQkJCi0KLQkJCQkKLQkJc2V0Q29udHJvbChjb250YWluZXIpOwotCQkKLQkJaWYgKHJlc3RvcmVkRnJvbVByZXZpb3VzU2V0dGluZ3MpewotCQkgICAgaGFuZGxlU2tpcCgpOwotCQkgICAgaWYgKCFza2lwV1NETENoZWNrQnV0dG9uLmdldFNlbGVjdGlvbigpKXsKLQkJICAgIAloYW5kbGVTZWxlY3QoKTsKLQkJICAgIH0KLQkJfQotICAgIH0KLSAgICAKLSAgICAvL3ByaXZhdGUgdm9pZCBoYW5kbGVTZWxlY3Rpb24oKXsKLSAgICAvLyAgICBib29sZWFuIHNlbGVjdGlvbiA9IHRoaXMuYXV0b0dlbmVyYXRlV1NETENoZWNrQnV0dG9uLmdldFNlbGVjdGlvbigpOwotICAgIC8vICAgIHNldHRpbmdzLnB1dChQUkVGX0NIRUNLX1dTRExfR0VORVJBVEUsc2VsZWN0aW9uKTsKLSAgICAvLyAgICBpZiAoc2VsZWN0aW9uKXsKLSAgICAvLyAgICAgICAgdGhpcy5za2lwTmV4dFBhZ2UgPSBmYWxzZTsKLSAgICAvLyAgICAgICAgdXBkYXRlU3RhdHVzKG51bGwpOwotICAgIC8vICAgICAgICB1cGRhdGVSZWNvbW1lbmRhdGlvbihTZXJ2aWNlQXJjaGl2ZXIuZ2V0UmVzb3VyY2VTdHJpbmcoInBhZ2U1LnJlY29tbWVuZGF0aW9uIikpOwotICAgIC8vICAgICAgICB0aGlzLnNraXBXU0RMQ2hlY2tCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLSAgICAvLyAgICAgICAgdGhpcy5zZWxlY3RXU0RMQ2hlY2tCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLSAgICAvLyAgICAgICAgY2hhbmdlTWFudWFsU2VsZWN0aW9uU3RhdHVzKGZhbHNlKTsgCi0gICAgLy8gICAgfWVsc2V7IAotICAgIC8vICAgICAgICAgIGNoYW5nZU1hbnVhbFNlbGVjdGlvblN0YXR1cyh0cnVlKTsKLSAgICAvLyAgICAgICAgICB0aGlzLnNraXBOZXh0UGFnZSA9IHRydWU7Ci0gICAgLy8gICAgICAgICAgaGFuZGxlTW9kaWZ5KCk7Ci0gICAgLy8gICAgICAgICAgdXBkYXRlUmVjb21tZW5kYXRpb24oIiIpOwotICAgIC8vICAgICAgICAgIHRoaXMuc2tpcFdTRExDaGVja0J1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0gICAgLy8gICAgCWlmIChza2lwV1NETENoZWNrQnV0dG9uLmdldFNlbGVjdGlvbigpIHx8IHNlbGVjdFdTRExDaGVja0J1dHRvbi5nZXRTZWxlY3Rpb24oKSl7Ci0gICAgLy8gICAgCQkvL3lvdSBzaG91bGQgbm90IGNvbWUgaGVyZQotICAgIC8vICAgCQkKLSAgICAvLyAgICAJfWVsc2UgewotICAgIC8vICAgIAkJYXV0b0dlbmVyYXRlV1NETENoZWNrQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLSAgICAvLyAgICAgICAgICAgIHRoaXMuc2tpcE5leHRQYWdlID0gZmFsc2U7Ci0gICAgLy8gICAgICAgICAgICB1cGRhdGVTdGF0dXMobnVsbCk7Ci0gICAgLy8gICAgICAgICAgICB1cGRhdGVSZWNvbW1lbmRhdGlvbihTZXJ2aWNlQXJjaGl2ZXIuZ2V0UmVzb3VyY2VTdHJpbmcoInBhZ2U1LnJlY29tbWVuZGF0aW9uIikpOwotICAgIC8vICAgICAgICAgICAgdGhpcy5za2lwV1NETENoZWNrQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0gICAgLy8gICAgICAgICAgICB0aGlzLnNlbGVjdFdTRExDaGVja0J1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotICAgIC8vICAgICAgICAgICAgY2hhbmdlTWFudWFsU2VsZWN0aW9uU3RhdHVzKGZhbHNlKTsgCi0gICAgLy8gICAgCX0KLSAgICAvLyAgICB9Ci0gICAgLy99Ci0KLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlU2tpcCgpewotICAgICAgICBpZiAoc2tpcFdTRExDaGVja0J1dHRvbi5nZXRTZWxlY3Rpb24oKSl7Ci0gICAgICAgICAgIC8vZGlzYWJsZSBvdGhlciB3aWRndGV0cwotICAgICAgICAgICBjaGFuZ2VNYW51YWxTZWxlY3Rpb25TdGF0dXMoZmFsc2UpOwotICAgICAgICAgICAvL2VuYWJsZSBuZXh0Ci0gICAgICAgICAgIHRoaXMudXBkYXRlU3RhdHVzKG51bGwpOwotICAgICAgICAgICBzZXR0aW5ncy5wdXQoUFJFRl9DSEVDS19TS0lQX1dTREwsdHJ1ZSk7Ci0gICAgICAgICAgIHRoaXMuc2VsZWN0V1NETENoZWNrQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0gICAgICAgIH1lbHNlewotLy8gICAgICAgICAgICAvL2NhbGwgdGhpcyB0byB1cGRhdGUgdGhlIHN0YXR1cwotLy8gICAgICAgICAgICBoYW5kbGVNb2RpZnkoKTsKLS8vICAgICAgICAgICAgc2V0dGluZ3MucHV0KFBSRUZfQ0hFQ0tfU0tJUF9XU0RMLGZhbHNlKTsKLS8vICAgICAgICAgICAgdGhpcy5hdXRvR2VuZXJhdGVXU0RMQ2hlY2tCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotICAgICAgICAJaWYgKHNlbGVjdFdTRExDaGVja0J1dHRvbi5nZXRTZWxlY3Rpb24oKSl7Ci0gICAgICAgIAkJLy95b3Ugc2hvdWxkIG5vdCBjb21lIGhlcmUKLSAgICAgICAgCQkKLSAgICAgICAgCX1lbHNlIHsKLSAgICAgICAgCQlza2lwV1NETENoZWNrQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLSAgICAgICAgICAgICAgICAvL2Rpc2FibGUgb3RoZXIgd2lkZ3RldHMKLSAgICAgICAgICAgICAgICBjaGFuZ2VNYW51YWxTZWxlY3Rpb25TdGF0dXMoZmFsc2UpOwotICAgICAgICAgICAgICAgIC8vZW5hYmxlIG5leHQKLSAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVN0YXR1cyhudWxsKTsKLSAgICAgICAgICAgICAgICBzZXR0aW5ncy5wdXQoUFJFRl9DSEVDS19TS0lQX1dTREwsdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RXU0RMQ2hlY2tCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLSAgICAgICAgCX0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlU2VsZWN0KCl7Ci0gICAgICAgIGlmIChzZWxlY3RXU0RMQ2hlY2tCdXR0b24uZ2V0U2VsZWN0aW9uKCkpewotICAgICAgICAgICAgY2hhbmdlTWFudWFsU2VsZWN0aW9uU3RhdHVzKHRydWUpOwotICAgICAgICAgICAgLy9lbmFibGUgbmV4dAotICAgICAgICAgICAgdGhpcy51cGRhdGVTdGF0dXMobnVsbCk7Ci0gICAgICAgICAgICB0aGlzLnNraXBXU0RMQ2hlY2tCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLSAgICAgICAgICAgCi0gICAgICAgIH1lbHNlewotLy8gICAgICAgICAgICBzZXRTdGF0dXModHJ1ZSk7Ci0vLyAgICAgICAgICAgIC8vY2FsbCB0aGlzIHRvIHVwZGF0ZSB0aGUgc3RhdHVzCi0vLyAgICAgICAgICAgIGhhbmRsZU1vZGlmeSgpOwotLy8gICAgICAgICAgICBzZXR0aW5ncy5wdXQoUFJFRl9DSEVDS19TS0lQX1dTREwsZmFsc2UpOwotLy8gICAgICAgICAgICB0aGlzLmF1dG9HZW5lcmF0ZVdTRExDaGVja0J1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0gICAgICAgIAlpZiAoc2tpcFdTRExDaGVja0J1dHRvbi5nZXRTZWxlY3Rpb24oKSl7Ci0gICAgICAgIAkJLy95b3Ugc2hvdWxkIG5vdCBjb21lIGhlcmUKLSAgICAgICAgCQkKLSAgICAgICAgCX1lbHNlIHsKLSAgICAgICAgCQlzZWxlY3RXU0RMQ2hlY2tCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotICAgICAgICAgICAgICAgIC8vZGlzYWJsZSBvdGhlciB3aWRndGV0cwotICAgICAgICAgICAgICAgIGNoYW5nZU1hbnVhbFNlbGVjdGlvblN0YXR1cyh0cnVlKTsKLSAgICAgICAgICAgICAgICAvL2VuYWJsZSBuZXh0Ci0gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVTdGF0dXMobnVsbCk7Ci0gICAgICAgICAgICAgICAgdGhpcy5za2lwV1NETENoZWNrQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0gICAgICAgIAl9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICBwcml2YXRlIHZvaWQgaGFuZGxlQnJvd3NlKCl7Ci0gICAgICAgIEZpbGVEaWFsb2cgZmlsZURpYWxvZyA9IG5ldyBGaWxlRGlhbG9nKHRoaXMuZ2V0U2hlbGwoKSk7Ci0gICAgICAgIGZpbGVEaWFsb2cuc2V0RmlsdGVyRXh0ZW5zaW9ucyhuZXcgU3RyaW5nW117Iioud3NkbCJ9KTsKLSAgICAgICAgU3RyaW5nIHJldHVybkZpbGVOYW1lID0gZmlsZURpYWxvZy5vcGVuKCkgOwotICAgICAgICBpZiAocmV0dXJuRmlsZU5hbWUhPW51bGwpewotICAgICAgICAgICAgdGhpcy53c2RsVGV4dEJveC5zZXRUZXh0KHJldHVybkZpbGVOYW1lKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLQotICAgIAotICAgIHByaXZhdGUgdm9pZCBoYW5kbGVNb2RpZnkoKXsKLSAgICAgICAgU3RyaW5nIHRleHQgPSB3c2RsVGV4dEJveC5nZXRUZXh0KCk7Ci0gICAgICAgIHNldHRpbmdzLnB1dChQUkVGX1dTRExfRklMRV9OQU1FLHRleHQpOwotICAgICAgICAvL3ZhbGlkYXRlCi0gICAgICAgIGlmICgiIi5lcXVhbHModGV4dCkpewotICAgICAgICAgICAgdGhpcy51cGRhdGVTdGF0dXMoU2VydmljZUFyY2hpdmVyLmdldFJlc291cmNlU3RyaW5nKCJwYWdlNS5lcnJvci53c2RsbmFtZWVtcHR5IikpOyAKLSAgICAgICAgIH1lbHNlIGlmKCF0ZXh0LmVuZHNXaXRoKCIud3NkbCIpKXsKLSAgICAgICAgICAgICB0aGlzLnVwZGF0ZVN0YXR1cyhTZXJ2aWNlQXJjaGl2ZXIuZ2V0UmVzb3VyY2VTdHJpbmcoInBhZ2U1LmVycm9yLndzZGxuYW1ld3JvbmciKSk7ICAKLSAgICAgICAgIH1lbHNlewotICAgICAgICAgICAgIHRoaXMudXBkYXRlU3RhdHVzKG51bGwpOwotICAgICAgICAgfQotICAgICAgICAKLSAgICB9Ci0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVJlY29tbWVuZGF0aW9uKFN0cmluZyBtZXNzYWdlKXsKLSAgICAgICAgU2VydmljZUFyY2hpdmVXaXphcmQgd2l6YXJkID0gKFNlcnZpY2VBcmNoaXZlV2l6YXJkKXRoaXMuZ2V0V2l6YXJkKCk7Ci0gICAgICAgIHdpemFyZC51cGRhdGVXc2RsRmlsZUdlbmVyYXRpb25TdGF0dXMobWVzc2FnZSk7Ci0gICAgICAgCi0gICAgfQotICAgIHByaXZhdGUgdm9pZCBjaGFuZ2VNYW51YWxTZWxlY3Rpb25TdGF0dXMoYm9vbGVhbiBzdGF0ZSl7Ci0gICAgICAgIHRoaXMud3NkbFRleHRCb3guc2V0RW5hYmxlZChzdGF0ZSk7Ci0gICAgICAgIHRoaXMuYnJvd3NlQnV0dG9uLnNldEVuYWJsZWQoc3RhdGUpOwotICAgICAgICB0aGlzLnNlbGVjdGlvbkxhYmVsLnNldEVuYWJsZWQoc3RhdGUpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0F1dG9HZW5lcmF0ZSgpewotICAgICAgICByZXR1cm4gZmFsc2UgOy8vIGF1dG9HZW5lcmF0ZVdTRExDaGVja0J1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLSAgICB9Ci0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi50b29sLnNlcnZpY2UuZWNsaXBzZS51aS5BYnN0cmFjdFNlcnZpY2VXaXphcmRQYWdlI2lzU2tpcE5leHQoKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzU2tpcE5leHQoKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgLy9yZXR1cm4gdGhpcy5za2lwTmV4dFBhZ2U7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBXU0RMRmlsZUxvY2F0aW9uQmVhbiBnZXRCZWFuKCl7Ci0gICAgICAgIFdTRExGaWxlTG9jYXRpb25CZWFuIGxvY2F0aW9uQmVhbiA9IG5ldyBXU0RMRmlsZUxvY2F0aW9uQmVhbigpOwotICAgICAgICBsb2NhdGlvbkJlYW4uc2V0TWFudWFsKCFpc0F1dG9HZW5lcmF0ZSgpKTsKLSAgICAgICAgbG9jYXRpb25CZWFuLnNldFdTRExGaWxlTmFtZSh3c2RsVGV4dEJveC5nZXRUZXh0KCkpOwotICAgICAgICBsb2NhdGlvbkJlYW4uc2V0U2tpcChza2lwV1NETENoZWNrQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgcmV0dXJuIGxvY2F0aW9uQmVhbjsKLSAgICB9Ci0gICAgCi0JcHJvdGVjdGVkIGJvb2xlYW4gZ2V0V2l6YXJkQ29tcGxldGUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2Utc2VydmljZS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvc2VydmljZS9lY2xpcHNlL3VpL1dTRExPcHRpb25zUGFnZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLXNlcnZpY2UtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL3NlcnZpY2UvZWNsaXBzZS91aS9XU0RMT3B0aW9uc1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFhN2Q5Yi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2Utc2VydmljZS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvc2VydmljZS9lY2xpcHNlL3VpL1dTRExPcHRpb25zUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50b29sLnNlcnZpY2UuZWNsaXBzZS51aTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbC5zZXJ2aWNlLmJlYW4uV1NETEF1dG9HZW5lcmF0ZU9wdGlvbkJlYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29sLnNlcnZpY2UuZWNsaXBzZS5wbHVnaW4uU2VydmljZUFyY2hpdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmV0LlVSTENsYXNzTG9hZGVyOwotCi1wdWJsaWMgY2xhc3MgV1NETE9wdGlvbnNQYWdlIGV4dGVuZHMgQWJzdHJhY3RTZXJ2aWNlV2l6YXJkUGFnZSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVklDRV9XU0RMX0RFRkFVTFRfTkFNRSA9ICJzZXJ2aWNlLndzZGwiOwotICAgIHByaXZhdGUgVGV4dCBjbGFzc05hbWVUZXh0Qm94OwotICAgIHByaXZhdGUgVGV4dCBvdXRwdXRGaWxlTmFtZVRleHRCb3g7Ci0gICAgcHJpdmF0ZSBDb21ibyBzdHlsZVNlbGVjdGlvbkNvbWJvOwotICAgIHByaXZhdGUgQnV0dG9uIHNlYXJjaERlY2xhcmVkTWV0aG9kc0NoZWNrQm94OwotICAgIHByaXZhdGUgVGFibGUgdGFibGU7Ci0gICAgCi0gICAgcHJpdmF0ZSBib29sZWFuIGRpcnR5ID0gZmFsc2U7Ci0gICAgCi0gICAgcHVibGljIFdTRExPcHRpb25zUGFnZSgpewotICAgICAgICBzdXBlcigicGFnZTYiKTsKLSAgICB9Ci0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi50b29sLnNlcnZpY2UuZWNsaXBzZS51aS5BYnN0cmFjdFNlcnZpY2VXaXphcmRQYWdlI2luaXRpYWxpemVEZWZhdWx0U2V0dGluZ3MoKQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVEZWZhdWx0U2V0dGluZ3MoKSB7Ci0gICAgICAgc2V0dGluZ3MucHV0KFBSRUZfV1NETF9GSUxFX05BTUUsU0VSVklDRV9XU0RMX0RFRkFVTFRfTkFNRSk7Ci0gICAgICAgc2V0dGluZ3MucHV0KFBSRUZfV1NETF9DTEFTU19OQU1FLCIiKTsKLSAgICAgICBzZXR0aW5ncy5wdXQoUFJFRl9XU0RMX1NUWUxFX0lOREVYLDApOwotCi0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgQ29tcG9zaXRlIGNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0gICAgICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICAgICAgY29udGFpbmVyLnNldExheW91dChsYXlvdXQpOwotICAgICAgICBsYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0gICAgICAgIGxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSA5OwotCi0gICAgICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0gICAgICAgIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbnRhaW5lciwgU1dULk5VTEwpOwotICAgICAgICBsYWJlbAotICAgICAgICAgICAgICAgIC5zZXRUZXh0KFNlcnZpY2VBcmNoaXZlcgotICAgICAgICAgICAgICAgICAgICAgICAgLmdldFJlc291cmNlU3RyaW5nKCJwYWdlNi5maWxlTmFtZS5sYWJlbCIpKTsKLSAgICAgICAgR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLSAgICAgICAgZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgICAgICBvdXRwdXRGaWxlTmFtZVRleHRCb3ggPSBuZXcgVGV4dChjb250YWluZXIsIFNXVC5CT1JERVIpOwotICAgICAgICBvdXRwdXRGaWxlTmFtZVRleHRCb3guc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgICAgIG91dHB1dEZpbGVOYW1lVGV4dEJveC5zZXRUZXh0KHNldHRpbmdzLmdldChQUkVGX1dTRExfRklMRV9OQU1FKSk7Ci0gICAgICAgIC8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSAgICAgICAgb3V0cHV0RmlsZU5hbWVUZXh0Qm94LnNldEVuYWJsZWQoZmFsc2UpOy8vdGhpcyB0ZXh0IGJveCBpcyBkaXNiYWxlZCBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdwotICAgICAgICAvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0gICAgICAgIG91dHB1dEZpbGVOYW1lVGV4dEJveC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBoYW5kbEZpbGVOYW1lTW9kaWZpY2F0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIC8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSAgICAgICAgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLSAgICAgICAgbGFiZWwgPSBuZXcgTGFiZWwoY29udGFpbmVyLCBTV1QuTlVMTCk7Ci0gICAgICAgIGxhYmVsLnNldFRleHQoU2VydmljZUFyY2hpdmVyLmdldFJlc291cmNlU3RyaW5nKCJwYWdlNi5jbGFzcy5sYWJlbCIpKTsKLQotICAgICAgICBjbGFzc05hbWVUZXh0Qm94ID0gbmV3IFRleHQoY29udGFpbmVyLCBTV1QuQk9SREVSKTsKLSAgICAgICAgY2xhc3NOYW1lVGV4dEJveC5zZXRMYXlvdXREYXRhKGdkKTsKLSAgICAgICAgY2xhc3NOYW1lVGV4dEJveC5zZXRUZXh0KHNldHRpbmdzLmdldChQUkVGX1dTRExfQ0xBU1NfTkFNRSkpOwotICAgICAgICBjbGFzc05hbWVUZXh0Qm94LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGhhbmRsZUNsYXNzTmFtZU1vZGlmaWNhdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotICAgICAgICBCdXR0b24gbG9hZEJ1dHRvbiA9IG5ldyBCdXR0b24oY29udGFpbmVyLCBTV1QuUFVTSCk7Ci0gICAgICAgIGxvYWRCdXR0b24uc2V0VGV4dCgiTG9hZCIpOwotICAgICAgICBsb2FkQnV0dG9uLnNldExheW91dERhdGEoZ2QpOwotICAgICAgICBsb2FkQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVUYWJsZSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotICAgICAgICBnZC5ob3Jpem9udGFsU3BhbiA9IDM7Ci0gICAgICAgIAotICAgICAgICBzZWFyY2hEZWNsYXJlZE1ldGhvZHNDaGVja0JveCA9IG5ldyBCdXR0b24oY29udGFpbmVyLFNXVC5DSEVDSyk7Ci0gICAgICAgIHNlYXJjaERlY2xhcmVkTWV0aG9kc0NoZWNrQm94LnNldExheW91dERhdGEoZ2QpOwotICAgICAgICBzZWFyY2hEZWNsYXJlZE1ldGhvZHNDaGVja0JveC5zZXRUZXh0KCJMaXN0IERlY2xhcmVkIE1ldGhvZHMgT25seSIpOwotICAgICAgICBzZWFyY2hEZWNsYXJlZE1ldGhvZHNDaGVja0JveC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKXsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpewotICAgICAgICAgICAgICAgIHVwZGF0ZURpcnR5U3RhdHVzKHRydWUpOy8vZGlydHkKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKXt9IAotICAgICAgICB9KTsKLSAgICAgICAgCi0gICAgICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0gICAgICAgIGxhYmVsID0gbmV3IExhYmVsKGNvbnRhaW5lciwgU1dULk5VTEwpOwotICAgICAgICBsYWJlbC5zZXRUZXh0KFNlcnZpY2VBcmNoaXZlci5nZXRSZXNvdXJjZVN0cmluZygicGFnZTYuc3R5bGUubGFiZWwiKSk7Ci0KLSAgICAgICAgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLSAgICAgICAgZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgICAgICBzdHlsZVNlbGVjdGlvbkNvbWJvID0gbmV3IENvbWJvKGNvbnRhaW5lciwgU1dULkRST1BfRE9XTiB8IFNXVC5CT1JERVIKLSAgICAgICAgICAgICAgICB8IFNXVC5SRUFEX09OTFkpOwotICAgICAgICBzdHlsZVNlbGVjdGlvbkNvbWJvLnNldExheW91dERhdGEoZ2QpOwotICAgICAgICBwb3B1bGF0ZVN0eWxlQ29tYm8oKTsKLSAgICAgICAgc3R5bGVTZWxlY3Rpb25Db21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgc2V0dGluZ3MucHV0KFBSRUZfV1NETF9TVFlMRV9JTkRFWCwgc3R5bGVTZWxlY3Rpb25Db21ibwotICAgICAgICAgICAgICAgICAgICAgICAgLmdldFNlbGVjdGlvbkluZGV4KCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgCi0gICAgICAgIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0gICAgICAgIGdkLmhvcml6b250YWxTcGFuID0gMzsKLSAgICAgICAgZ2QudmVydGljYWxTcGFuID0gNTsKLSAgICAgICAgCi0gICAgICAgIHRhYmxlID0gbmV3IFRhYmxlKGNvbnRhaW5lcixTV1QuU0lOR0xFfFNXVC5GVUxMX1NFTEVDVElPTnxTV1QuQ0hFQ0spOwotICAgICAgICB0YWJsZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0gICAgICAgIHRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7IAotICAgICAgICB0YWJsZS5zZXRMYXlvdXREYXRhKGdkKTsKLSAgICAgICAgZGVjbGFyZUNvbHVtbih0YWJsZSwyMCwiIik7Ci0gICAgICAgIGRlY2xhcmVDb2x1bW4odGFibGUsMTAwLCJNZXRob2QgTmFtZSIpOwotICAgICAgICBkZWNsYXJlQ29sdW1uKHRhYmxlLDEwMCwiUmV0dXJuIFR5cGUiKTsKLSAgICAgICAgZGVjbGFyZUNvbHVtbih0YWJsZSwxMDAsIlBhcmFtZXRlciBDb3VudCIpOwotICAgICAgICAKLSAgICAgICAgdGFibGUuc2V0VmlzaWJsZShmYWxzZSk7Ci0gICAgICAgIAotICAgICAgICBzZXRDb250cm9sKGNvbnRhaW5lcik7Ci0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGRlY2xhcmVDb2x1bW4oVGFibGUgdGFibGUsIGludCB3aWR0aCxTdHJpbmcgY29sTmFtZSl7Ci0gICAgICAgIFRhYmxlQ29sdW1uIGNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSxTV1QuTk9ORSk7Ci0gICAgICAgIGNvbHVtbi5zZXRXaWR0aCh3aWR0aCk7Ci0gICAgICAgIGNvbHVtbi5zZXRUZXh0KGNvbE5hbWUpOwotICAgIH0KLSAgICAKLSAgICAKLSAgICBwcml2YXRlIHZvaWQgcG9wdWxhdGVTdHlsZUNvbWJvKCkgewotICAgICAgICBzdHlsZVNlbGVjdGlvbkNvbWJvLmFkZCgiRG9jdW1lbnQiKTsKLSAgICAgICAgc3R5bGVTZWxlY3Rpb25Db21iby5hZGQoInJwYyIpOwotICAgICAgICBzdHlsZVNlbGVjdGlvbkNvbWJvLmFkZCgiV3JhcHBlZCIpOwotCi0gICAgICAgIHN0eWxlU2VsZWN0aW9uQ29tYm8uc2VsZWN0KHNldHRpbmdzLmdldEludChQUkVGX1dTRExfU1RZTEVfSU5ERVgpKTsKLSAgICAgICAgCi0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVUYWJsZSgpIHsKLSAgICAgICAgLy9nZXQgYSBVUkwgZnJvbSB0aGUgY2xhc3MgZmlsZSBsb2NhdGlvbgotICAgICAgICB0cnkgewotICAgICAgICAgICAgU3RyaW5nIGNsYXNzRmlsZUxvY2F0aW9uID0gZ2V0Q2xhc3NGaWxlTG9jYXRpb24oKTsKLSAgICAgICAgICAgIFVSTCBjbGFzc0ZpbGVVUkwgPSBuZXcgRmlsZShjbGFzc0ZpbGVMb2NhdGlvbikudG9VUkwoKTsKLSAgICAgICAgICAgIENsYXNzTG9hZGVyIGxvYWRlciA9IG5ldyBVUkxDbGFzc0xvYWRlcihuZXcgVVJMW10geyBjbGFzc0ZpbGVVUkwgfSk7Ci0KLSAgICAgICAgICAgIENsYXNzIGNsYXp6ID0gbG9hZGVyLmxvYWRDbGFzcyhjbGFzc05hbWVUZXh0Qm94LmdldFRleHQoKSk7Ci0gICAgICAgICAgICBNZXRob2RbXSBtZXRob2RzID0gbnVsbDsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKHNlYXJjaERlY2xhcmVkTWV0aG9kc0NoZWNrQm94LmdldFNlbGVjdGlvbigpKXsKLSAgICAgICAgICAgICAgICBtZXRob2RzID0gY2xhenouZ2V0RGVjbGFyZWRNZXRob2RzKCk7Ci0gICAgICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgICAgICBtZXRob2RzID0gY2xhenouZ2V0TWV0aG9kcygpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQgbWV0aG9kQ291bnQgPSBtZXRob2RzLmxlbmd0aDsKLSAgICAgICAgICAgIGlmIChtZXRob2RDb3VudCA+IDApIHsKLSAgICAgICAgICAgICAgICB0YWJsZS5yZW1vdmVBbGwoKTsKLSAgICAgICAgICAgICAgICBUYWJsZUl0ZW1bXSBpdGVtcyA9IG5ldyBUYWJsZUl0ZW1bbWV0aG9kQ291bnRdOyAvLyBBbiBpdGVtIGZvciBlYWNoIGZpZWxkCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgbWV0aG9kQ291bnQ7IGkrKyl7Ci0gICAgICAgICAgICAgICAgICAgaXRlbXNbaV0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSk7Ci0gICAgICAgICAgICAgICAgICAgaXRlbXNbaV0uc2V0VGV4dCgxLG1ldGhvZHNbaV0uZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICBpdGVtc1tpXS5zZXRUZXh0KDIsbWV0aG9kc1tpXS5nZXRSZXR1cm5UeXBlKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICBpdGVtc1tpXS5zZXRUZXh0KDMsbWV0aG9kc1tpXS5nZXRQYXJhbWV0ZXJUeXBlcygpLmxlbmd0aCsiIik7Ci0gICAgICAgICAgICAgICAgICAgaXRlbXNbaV0uc2V0Q2hlY2tlZCh0cnVlKTsvL2NoZWNrIHRoZW0gYWxsIGJ5IGRlZmF1bHQKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdGFibGUuc2V0VmlzaWJsZSh0cnVlKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvL3VwZGF0ZSB0aGUgZGlydHkgdmFyaWFibGUKLSAgICAgICAgICAgICAgIHVwZGF0ZURpcnR5U3RhdHVzKGZhbHNlKTsKLSAgICAgICAgICAgICAgIHVwZGF0ZVN0YXR1cyhudWxsKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotICAgICAgICAgICB1cGRhdGVTdGF0dXMoIkVycm9yIDogaW52YWxpZCBsb2NhdGlvbiAiICtlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICB1cGRhdGVTdGF0dXMoIkVycm9yIDogQ2xhc3Mgbm90IGZvdW5kICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZUNsYXNzTmFtZU1vZGlmaWNhdGlvbigpewotICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gY2xhc3NOYW1lVGV4dEJveC5nZXRUZXh0KCk7Ci0gICAgICAgIHNldHRpbmdzLnB1dChQUkVGX1dTRExfQ0xBU1NfTkFNRSwgY2xhc3NOYW1lKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChjbGFzc05hbWU9PW51bGwgfHwgIiIuZXF1YWxzKGNsYXNzTmFtZS50cmltKCkpKXsKLSAgICAgICAgICAgIHVwZGF0ZVN0YXR1cyhTZXJ2aWNlQXJjaGl2ZXIuZ2V0UmVzb3VyY2VTdHJpbmcoInBhZ2U2LmVycm9yLmNsYXNzbmFtZTEiKSk7Ci0gICAgICAgIH1lbHNlIGlmIChjbGFzc05hbWUuZW5kc1dpdGgoIi4iKSl7Ci0gICAgICAgICAgICB1cGRhdGVTdGF0dXMoU2VydmljZUFyY2hpdmVyLmdldFJlc291cmNlU3RyaW5nKCJwYWdlNi5lcnJvci5jbGFzc25hbWUyIikpOwotICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgIHVwZGF0ZVN0YXR1cyhudWxsKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsRmlsZU5hbWVNb2RpZmljYXRpb24oKXsKLSAgICAgICAgU3RyaW5nIHdzZGxGaWxlTmFtZSA9IG91dHB1dEZpbGVOYW1lVGV4dEJveC5nZXRUZXh0KCk7Ci0gICAgICAgIHNldHRpbmdzLnB1dChQUkVGX1dTRExfRklMRV9OQU1FLCB3c2RsRmlsZU5hbWUpOwotICAgICAgICAKLSAgICAgICAgaWYgKHdzZGxGaWxlTmFtZT09bnVsbCB8fCAiIi5lcXVhbHMod3NkbEZpbGVOYW1lLnRyaW0oKSkpewotICAgICAgICAgICAgdXBkYXRlU3RhdHVzKFNlcnZpY2VBcmNoaXZlci5nZXRSZXNvdXJjZVN0cmluZygicGFnZTYuZXJyb3IuZmlsZU5hbWUxIikpOwotICAgICAgICB9ZWxzZSBpZiAod3NkbEZpbGVOYW1lLmVuZHNXaXRoKCIud3NkbCIpKXsKLSAgICAgICAgICAgIHVwZGF0ZVN0YXR1cyhTZXJ2aWNlQXJjaGl2ZXIuZ2V0UmVzb3VyY2VTdHJpbmcoInBhZ2U2LmVycm9yLmZpbGVOYW1lMiIpKTsKLSAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICB1cGRhdGVTdGF0dXMobnVsbCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgfQotICAgIHByaXZhdGUgU3RyaW5nIGdldENsYXNzRmlsZUxvY2F0aW9uKCl7Ci0gICAgICAgIFNlcnZpY2VBcmNoaXZlV2l6YXJkIHdpemFyZCA9IChTZXJ2aWNlQXJjaGl2ZVdpemFyZClnZXRXaXphcmQoKTsKLSAgICAgICAgcmV0dXJuIHdpemFyZC5nZXRDbGFzc0ZpbGVMb2NhdGlvbigpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgV1NETEF1dG9HZW5lcmF0ZU9wdGlvbkJlYW4gZ2V0QmVhbigpewotICAgICAgICBXU0RMQXV0b0dlbmVyYXRlT3B0aW9uQmVhbiBvcHRpb25CZWFuID0gbmV3IFdTRExBdXRvR2VuZXJhdGVPcHRpb25CZWFuKCk7Ci0gICAgICAgIG9wdGlvbkJlYW4uc2V0Q2xhc3NGaWxlTmFtZShjbGFzc05hbWVUZXh0Qm94LmdldFRleHQoKSk7Ci0gICAgICAgIG9wdGlvbkJlYW4uc2V0T3V0cHV0RmlsZU5hbWUob3V0cHV0RmlsZU5hbWVUZXh0Qm94LmdldFRleHQoKSk7Ci0gICAgICAgIG9wdGlvbkJlYW4uc2V0U3R5bGUoc3R5bGVTZWxlY3Rpb25Db21iby5nZXRJdGVtKHN0eWxlU2VsZWN0aW9uQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSkpOwotICAgICAgICByZXR1cm4gb3B0aW9uQmVhbjsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZURpcnR5U3RhdHVzKGJvb2xlYW4gc3RhdHVzKXsKLSAgICAgICAgZGlydHkgPSBzdGF0dXM7Ci0gICAgICAgIGlmICh0YWJsZS5pc1Zpc2libGUoKSl7Ci0gICAgICAgICAgICB0YWJsZS5zZXRFbmFibGVkKCFzdGF0dXMpOwotICAgICAgICB9Ci0gICAgICAgIHNldFBhZ2VDb21wbGV0ZSghc3RhdHVzKTsKLSAgICB9Ci0gICAgCi0JcHJvdGVjdGVkIGJvb2xlYW4gZ2V0V2l6YXJkQ29tcGxldGUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2Utc2VydmljZS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvc2VydmljZS9lY2xpcHNlL3V0aWwvU2V0dGluZ3NDb25zdGFudHMuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1zZXJ2aWNlLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9zZXJ2aWNlL2VjbGlwc2UvdXRpbC9TZXR0aW5nc0NvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTM4YzBiLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1zZXJ2aWNlLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9zZXJ2aWNlL2VjbGlwc2UvdXRpbC9TZXR0aW5nc0NvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnRvb2wuc2VydmljZS5lY2xpcHNlLnV0aWw7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgU2V0dGluZ3NDb25zdGFudHMgewotICAgLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotICAgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX0NMQVNTX0ZJTEVfTE9DQVRJT04gPSAiQ0xBU1NfRklMRV9MT0NBVElPTiIgOwotICAgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX0ZJTFRFUl9CWV9DTEFTU0VTID0gIkZJTFRFUl9CWV9DTEFTU0VTIiA7Ci0gICAvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0gICBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfU0VSVklDRV9YTUxfRklMRSA9ICJTRVJWSUNFX1hNTCIgOwotICAgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX0NIRUNLX0FVVE9fR0VOX1NFUlZJQ0VfWE1MID0gIkFVVE9fR0VOIiA7Ci0gICAvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0gICBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfV1NETF9GSUxFX05BTUU9IldTRExfRklMRV9OQU1FIjsKLSAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9DSEVDS19XU0RMX0dFTkVSQVRFPSJXU0RMX0dFTiI7Ci0gICBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfQ0hFQ0tfU0tJUF9XU0RMPSJTS0lQX1dTREwiOwotICAgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX0NIRUNLX1NFTEVDVF9XU0RMPSJTRUxFQ1RfV1NETCI7Ci0gICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0gICBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfV1NETF9DTEFTU19OQU1FPSJXU0RMX0NMQVNTX05BTUUiOwotICAgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX1dTRExfU1RZTEVfSU5ERVg9IldTRExfU1RZTEUiOwotICAgLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0gICBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfT1VUUFVUX0xPQ0FUSU9OPSJPVVRfTE9DQVRJT04iOwotICAgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX09VVFBVVF9OQU1FPSJPVVRfTkFNRSI7Ci0gICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0gICBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfU0VSVklDRV9HRU5fU0VSVklDRV9OQU1FPSJTRVJWSUNFX05BTUUiOwotICAgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX1NFUlZJQ0VfR0VOX0NMQVNTTkFNRT0iQ0xBU1NOQU1FIjsKLSAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9TRVJWSUNFX0dFTl9MT0FEX0FMTD0iTE9BRF9BTEwiOwotICAgLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9MSUJfTElCTkFNRVM9IkxJQl9OQU1FUyI7Ci0gICAKLSAgIAotICAgCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2Utc2VydmljZS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvc2VydmljZS9yZXNvdXJjZS9TZXJ2aWNlUmVzb3VyY2VzLnByb3BlcnRpZXMgYi92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2Utc2VydmljZS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvc2VydmljZS9yZXNvdXJjZS9TZXJ2aWNlUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxOGE0NDkuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLXNlcnZpY2UtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL3NlcnZpY2UvcmVzb3VyY2UvU2VydmljZVJlc291cmNlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLSMKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyMjIyMjIyMjIyMjIyMjIyMjICAgUmVzb3VyY2VzIGZvciB0aGUgaW50ZXJmYWNlICMjIyMjIyMjIyMjIyMjIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjICBEZWZhdWx0IGVuX3VzICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIyBNYWluIHBhZ2UgdGl0bGUKLW1haW4udGl0bGU9QXBhY2hlIEF4aXMgU2VydmljZSBBcmNoaXZlcgotCi0jZ2VuZXJhbCB0ZXh0cwotI09rIGJ1dHRvbiBjYXB0aW9uCi1nZW5lcmFsLm9rPU9rCi0jQ2FuY2xlIGJ1dHRvbiBjYXB0aW9uCi1nZW5lcmFsLmNhbmNlbD1DYW5jZWwKLSNOZXh0IGJ1dHRvbiBjYXB0aW9uCi1nZW5lcmFsLm5leHQ9TmV4dAotI1ByZXZpb3VzIGJ1dHRvbiBjYXB0aW9uCi1nZW5lcmFsLnByZXY9UHJldgotI0ZpbmlzaCBidXR0b24gY2FwdGlvbgotZ2VuZXJhbC5maW5pc2g9RmluaXNoCi0jYnJvd3NlCi1nZW5lcmFsLmJyb3dzZT1Ccm93c2UuLi4KLWdlbmVyYWwuYWRkPUFkZAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotI0ZpcnN0cGFnZSB0aXRsZQotcGFnZTEubmFtZT1wYWdlMQotcGFnZTEudGl0bGU9U2VydmljZSBBcmNoaXZlcgotcGFnZTEuZGVzYz1XZWxjb21lIHRvIHRoZSBuZXcgQVhJUyBTZXJ2aWNlIHBhY2thZ2VyIFdpemFyZCBJbnRlcmZhY2UuSW5zZXJ0IHRoZSBsb2NhdGlvbiBmb3IgdGhlIGNsYXNzIGZpbGVzIGhlcmUuCi0jIEZpcnN0IHBhZ2UKLXBhZ2UxLmZpbGVMb2NhdGlvbkxhYmVsPUNsYXNzIEZpbGUgTG9jYXRpb24KLXBhZ2UxLmZpbGVkaWFsb2dUaXRsZT1Ccm93c2UgZm9yIHRoZSBjbGFzcyBmaWxlIGxvY2F0aW9uCi1wYWdlMS5maWx0ZXIuY2FwdGlvbj1JbmNsdWRlIC5jbGFzcyBmaWxlcyBvbmx5Ci1wYWdlMS5maWxlZGlhbG9nVGl0bGU9QnJvd3NlIGZvciBhIGxvY2F0aW9uCi1wYWdlMS5lcnJvci5maWxlbWlzc2luZz1UaGUgc3BlY2lmaWVkIGZpbGUgaXMgbWlzc2luZwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgc2Vjb25kIHBhZ2UKLXBhZ2UyLm5hbWU9cGFnZTIKLXBhZ2UyLnRpdGxlPVNlcnZpY2UgQXJjaGl2ZXIKLXBhZ2UyLmRlc2M9U2VsZWN0IHRoZSBTZXJ2aWNlIFhNTCBmaWxlIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBTZXJ2aWNlIGFyY2hpdmUKLXBhZ2UyLnNlbGVjdHNlcnZpY2V4bWwuY2FwdGlvbj1TZXQgdGhlIHNlcnZpY2UgWE1MIGZpbGUKLXBhZ2UyLmdlbmVyYXRlYXV0by5jYXB0aW9uPUdlbmVyYXRlIHRoZSBzZXJ2aWNlIHhtbCBhdXRvbWF0aWNhbGx5Ci1wYWdlMi5lcnJvci5zZXJ2aWNlbmFtZWVtcHR5PVNlcnZpY2UgWE1MIHNob3VsZCBub3QgYmUgZW1wdHkKLXBhZ2UyLmVycm9yLnNlcnZpY2VuYW1ld3Jvbmc9UGxlYXNlIHNlbGVjdCBhIGZpbGUgbmFtZWQgc2VydmljZS54bWwKLXBhZ2UyLmVycm9yLnNlcnZpY2Vub3RleGlzdD1TZXJ2aWNlIGZpbGUgZG9lcyBub3QgZXhpc3QKLXBhZ2UyLmVycm9yLnNlcnZpY2VzZWxlY3RlZGludmFsaWQ9VGhlIHNlbGVjdGVkIHNlcnZpY2UgZmlsZSBpcyBpbnZhbGlkCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jdGhpcmQgcGFnZQotcGFnZTMubmFtZT1wYWdlMwotcGFnZTMudGl0bGU9U2VydmljZSBBcmNoaXZlcgotcGFnZTMuZGVzYz1HZW5lcmF0ZSB0aGUgU2VydmljZSBYTUwgZmlsZQotcGFnZTMuc2VydmljZW5hbWUubGFibGU9U2VydmljZSBuYW1lCi1wYWdlMy5zZXJ2aWNlbmFtZS50b29sdGlwPVB1dCB0aGUgbmFtZSBvZiB0aGUgc2VydmljZSBoZXJlLgotcGFnZTMuY2xhc3NuYW1lLmxhYmxlPUNsYXNzIG5hbWUKLXBhZ2UzLmNsYXNzbmFtZS50b29sdGlwPVRoZSBjbGFzcyB0aGF0IHlvdSBuZWVkIHRvIGV4cG9zZSBhcyB0aGUgc2VydmljZS4gTm90ZSB0aGF0IHRoaXMgbmVlZHMgdG8gYmUgaW4gdGhlIHByZXZpb3NseSBzZWxlY3RlZCBmb2xkZXIKLXBhZ2UzLmxvYWRidXR0b24ubGFibGU9TG9hZAotcGFnZTMuZGVjbGFyZWQubGFibGU9U2VhcmNoIGRlY2xhcmVkIG1ldGhvZHMgb25seQotcGFnZTMudGFibGUuY29sMT1NZXRob2QgbmFtZQotcGFnZTMudGFibGUuY29sMj1SZXR1cm4gdHlwZQotcGFnZTMudGFibGUuY29sMz1QYXJhbWV0ZXJzCi1wYWdlMy5lcnJvci51cmw9RXJyb3IgOiBpbnZhbGlkIGxvY2F0aW9uCi1wYWdlMy5lcnJvci5jbGFzcz1FcnJvciA6IENsYXNzIG5vdCBmb3VuZAotcGFnZTMuZXJyb3IudW5rbm93bj1FcnJvciA6IFVua25vd24gZXJyb3IKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jRm91cnRoIHBhZ2UKLXBhZ2U0Lm5hbWU9cGFnZTQKLXBhZ2U0LnRpdGxlPVNlcnZpY2UgQXJjaGl2ZXIKLXBhZ2U0LmRlc2M9U2V0IHRoZSBvdXRwdXQgbG9hY2F0aW9uIGFuZCB0aGUgb3V0cHV0IGZpbGUgbmFtZQotcGFnZTQub3V0cHV0bG9jYXRpb24ubGFiZWw9T3V0cHV0IGZpbGUgbG9jYXRpb24KLXBhZ2U0Lm91dHB1dG5hbWUubGFiZWw9T3V0cHV0IEZpbGUgTmFtZQotcGFnZTQuZGlyZGlhbG9nLmNhcHRpb249QnJvd3NlIGZvciB0aGUgb3V0cHV0IGxvY2F0aW9uCi1wYWdlNC5oaW50LmNhcHRpb249SGludCA6IFRvIEZpbmlzaCB0aGUgd2l6YXJkLCBwbGVhc2UgZW50ZXIgdmFsaWQgZW50cmllcyB0byB0aGUgb3V0cHV0IGxvY2F0aW9uIGFuZCBvdXRwdXQgZmlsZS4gCi0jIGVycm9ycwotcGFnZTQuZXJyb3IubG9jYXRpb249QnJvd3NlIGFuZCBlbnRlciB0aGUgbG9jYXRpb24gdG8gc2F2ZSB0aGUgb3V0cHV0IGZpbGUKLXBhZ2U0LmVycm9yLmZpbGVuYW1lPUVudGVyIGEgbmFtZSBmb3IgU2VydmljZSBGaWxlIChJZGVhbGx5IGl0IHNvdWxkIGJlIHRoZSBzZXJ2aWNlIG5hbWUgZW5kaW5nIHdpdGggdGhlIHZhbGlkIGV4dGVudGlvbiAqLmphcikKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotI0ZpZnRoIHBhZ2UKLXBhZ2U1Lm5hbWU9cGFnZTUKLXBhZ2U1LnRpdGxlPVNlcnZpY2UgQXJjaGl2ZXIKLXBhZ2U1LmRlc2M9QWRkIHRoZSBXU0RMIEZpbGUKLXBhZ2U1LnNlbGVjdHdzZGwuY2FwdGlvbj1TZWxlY3QgYSBXU0RMIGZpbGUKLXBhZ2U1LmdlbmVyYXRlYXV0by5jYXB0aW9uPUdlbmVyYXRlIGEgV1NETCBmaWxlCi1wYWdlNS5hdXRvZ2VuLnRvb2x0aXA9VGljayB0aGlzIHRvIGdlbmVyYXRlIGEgV1NETCBmaWxlIGF1dG9tYXRpY2FsbHkKLXBhZ2U1LnJlY29tbWVuZGF0aW9uPVNpbmNlIHlvdSBnZW5lcmF0ZWQgdGhlIHNlcnZpY2UuWE1MIGl0IGlzIHJlY29tbWVuZGVkIHRoYXQgdGhlIFdTREwgaXMgYXV0byBnZW5lcmF0ZWQKLXBhZ2U1LmVycm9yLndzZGxuYW1lZW1wdHk9V1NETCBmaWxlIG5hbWUgaXMgZW1wdHkKLXBhZ2U1LmVycm9yLndzZGxuYW1ld3Jvbmc9V1NETCBmaWxlIG5hbWUgaXMgaW52YWxpZAotcGFnZTUuc2tpcFdTREwuY2FwdGlvbj1Ta2lwIFdTREwKLXBhZ2U1LnNlbGVjdFdTREwuY2FwdGlvbj1TZWxlY3QgV1NETAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotI1NpeHRoIHBhZ2UKLXBhZ2U2Lm5hbWU9cGFnZTYKLXBhZ2U2LnRpdGxlPVNlcnZpY2UgQXJjaGl2ZXIKLXBhZ2U2LmRlc2M9QWRkIGFueSBleHRlcm5hbCBsaWJyYXJpZXMKLXBhZ2U2LmFkZD1BZGQgLT4KLXBhZ2U2LnJlbW92ZT1SZW1vdmUgPC0KLXBhZ2U2LmxpYm5hbWVzLmNhcHRpb249TGlicmFyaWVzCi1wYWdlNi5saWJsaXN0LmNhcHRpb249QWRkZWQgbGlicmFyaWVzCi1wYWdlNi5saWJsaXN0LmNvdW50LmNhcHRpb249IGphcnMgaW4gbGlzdAotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIFdpemFyZHMgZXJyb3IgbWVzc2FnZXMKLXdpemFyZC5jb2RlZ2VuLnN1Y2Nlc3M9U2VydmljZSBBcmNoaXZlIEdlbmVyYXRlZCBzdWNjZXNzZnVsbHkhCi13aXphcmQuY29kZWdlbi51bmtub3duLmVycm9yPVVua25vd24gRXJyb3IhCi13aXphcmQuY29kZWdlbi5zdWNjZXNzLm1zZy5oZWFkaW5nPVN1Y2Nlc3MKLXdpemFyZC5jb2RlZ2VuLmVycm9yLm1zZy5oZWFkaW5nPUVycm9yCi13aXphcmQuY29kZWdlbi5zdGFydG1zZz1SdW5uaW5nIHRoZSBhcmNoaXZpbmcgcHJvY2VzcwpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLXNlcnZpY2UtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL3NlcnZpY2Uvc3dpbmcvdWkvTWFpbldpbmRvdy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLXNlcnZpY2UtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL3NlcnZpY2Uvc3dpbmcvdWkvTWFpbldpbmRvdy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjc3MmVhLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1zZXJ2aWNlLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9zZXJ2aWNlL3N3aW5nL3VpL01haW5XaW5kb3cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudG9vbC5zZXJ2aWNlLnN3aW5nLnVpOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29sLnNlcnZpY2UuYmVhbi5XaXphcmRCZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbC5zZXJ2aWNlLmNvbnRyb2wuQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRvb2wuc2VydmljZS5jb250cm9sLlByb2Nlc3NFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZheC5zd2luZy4qOwotaW1wb3J0IGphdmEuYXd0Lio7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uRXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uTGlzdGVuZXI7Ci0KLXB1YmxpYyBjbGFzcyBNYWluV2luZG93IGV4dGVuZHMgSkZyYW1lIHsKLQotICAgIHByaXZhdGUgSlBhbmVsIHdpemFyZFBhbmVDb250YWluZXI7Ci0gICAgcHJpdmF0ZSBKQnV0dG9uIG5leHRCdXR0b247Ci0gICAgcHJpdmF0ZSBKQnV0dG9uIHByZXZpb3VzQnV0dG9uOwotICAgIHByaXZhdGUgSkJ1dHRvbiBjYW5jZWxCdXR0b247Ci0gICAgcHJpdmF0ZSBKQnV0dG9uIGZpbmlzaEJ1dHRvbjsKLSAgICBwcml2YXRlIGludCBjdXJyZW50UGFnZTsKLSAgICBwcml2YXRlIFdpemFyZFBhbmUgY3VycmVudFdpemFyZFBhbmU7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUEFHRV8xID0gMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUEFHRV8yID0gMjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUEFHRV8zID0gMzsKLSAgICAvL3ByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQQUdFXzQ9NDsKLQotCi0gICAgcHJpdmF0ZSBXaXphcmRCZWFuIHdpemFyZEJlYW4gPSBuZXcgV2l6YXJkQmVhbigpOwotCi0gICAgcHVibGljIE1haW5XaW5kb3coKSB0aHJvd3MgSGVhZGxlc3NFeGNlcHRpb24gewotICAgICAgICBzdXBlcigiQXhpcyAyIC0gU2VydmljZSBKYXIgQnVpbGRlciIpOwotICAgICAgICBpbml0KCk7Ci0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdCgpIHsKLSAgICAgICAgdGhpcy5nZXRDb250ZW50UGFuZSgpLnNldExheW91dChudWxsKTsKLQotICAgICAgICB0aGlzLnNldEJvdW5kcygKLSAgICAgICAgICAgICAgICAoaW50KSBUb29sa2l0LmdldERlZmF1bHRUb29sa2l0KCkuZ2V0U2NyZWVuU2l6ZSgpLmdldFdpZHRoKCkgLwotICAgICAgICAgICAgICAgIDIgLQotICAgICAgICAgICAgICAgIDQwMCAvIDIsCi0gICAgICAgICAgICAgICAgKGludCkgVG9vbGtpdC5nZXREZWZhdWx0VG9vbGtpdCgpLmdldFNjcmVlblNpemUoKS5nZXRIZWlnaHQoKSAvCi0gICAgICAgICAgICAgICAgMiAtCi0gICAgICAgICAgICAgICAgMzYwIC8gMiwKLSAgICAgICAgICAgICAgICA0MDAsIDM2MCk7Ci0gICAgICAgIHRoaXMuc2V0UmVzaXphYmxlKGZhbHNlKTsKLSAgICAgICAgdGhpcy5zZXREZWZhdWx0Q2xvc2VPcGVyYXRpb24oRVhJVF9PTl9DTE9TRSk7Ci0KLSAgICAgICAgaW50IGhnYXAgPSA1OwotICAgICAgICBpbnQgdmdhcCA9IDU7Ci0gICAgICAgIGludCBiV2lkdGggPSA4MDsKLSAgICAgICAgaW50IGJIZWlnaHQgPSAyMDsKLQotICAgICAgICB0aGlzLndpemFyZFBhbmVDb250YWluZXIgPSBuZXcgSlBhbmVsKG51bGwpOwotICAgICAgICB0aGlzLmdldENvbnRlbnRQYW5lKCkuYWRkKHRoaXMud2l6YXJkUGFuZUNvbnRhaW5lcik7Ci0gICAgICAgIHRoaXMud2l6YXJkUGFuZUNvbnRhaW5lci5zZXRCb3VuZHMoMCwgMCwgNDAwLCAzMDApOwotCi0gICAgICAgIHRoaXMucHJldmlvdXNCdXR0b24gPSBuZXcgSkJ1dHRvbigiUHJldmlvdXMiKTsKLSAgICAgICAgdGhpcy5nZXRDb250ZW50UGFuZSgpLmFkZCh0aGlzLnByZXZpb3VzQnV0dG9uKTsKLSAgICAgICAgdGhpcy5wcmV2aW91c0J1dHRvbi5zZXRCb3VuZHMoaGdhcCwgMzAwICsgdmdhcCwgYldpZHRoLCBiSGVpZ2h0KTsKLSAgICAgICAgdGhpcy5wcmV2aW91c0J1dHRvbi5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIG1vdmVCYWNrV2FyZCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0pOwotCi0gICAgICAgIHRoaXMubmV4dEJ1dHRvbiA9IG5ldyBKQnV0dG9uKCJOZXh0Iik7Ci0gICAgICAgIHRoaXMuZ2V0Q29udGVudFBhbmUoKS5hZGQodGhpcy5uZXh0QnV0dG9uKTsKLSAgICAgICAgdGhpcy5uZXh0QnV0dG9uLnNldEJvdW5kcyhoZ2FwICsgYldpZHRoICsgaGdhcCwKLSAgICAgICAgICAgICAgICAzMDAgKyB2Z2FwLAotICAgICAgICAgICAgICAgIGJXaWR0aCwKLSAgICAgICAgICAgICAgICBiSGVpZ2h0KTsKLSAgICAgICAgdGhpcy5uZXh0QnV0dG9uLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgbW92ZUZvcndhcmQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgdGhpcy5jYW5jZWxCdXR0b24gPSBuZXcgSkJ1dHRvbigiQ2xvc2UiKTsKLSAgICAgICAgdGhpcy5nZXRDb250ZW50UGFuZSgpLmFkZCh0aGlzLmNhbmNlbEJ1dHRvbik7Ci0gICAgICAgIHRoaXMuY2FuY2VsQnV0dG9uLnNldEJvdW5kcyhoZ2FwICsgKGJXaWR0aCArIGhnYXApICogMiwKLSAgICAgICAgICAgICAgICAzMDAgKyB2Z2FwLAotICAgICAgICAgICAgICAgIGJXaWR0aCwKLSAgICAgICAgICAgICAgICBiSGVpZ2h0KTsKLSAgICAgICAgdGhpcy5jYW5jZWxCdXR0b24uYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBpZiAoY29uZmlybUV4aXQoKSkKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmV4aXQoMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIHRoaXMuZmluaXNoQnV0dG9uID0gbmV3IEpCdXR0b24oIkZpbmlzaCIpOwotICAgICAgICB0aGlzLmdldENvbnRlbnRQYW5lKCkuYWRkKHRoaXMuZmluaXNoQnV0dG9uKTsKLSAgICAgICAgdGhpcy5maW5pc2hCdXR0b24uc2V0Qm91bmRzKGhnYXAgKyAoYldpZHRoICsgaGdhcCkgKiAzLAotICAgICAgICAgICAgICAgIDMwMCArIHZnYXAsCi0gICAgICAgICAgICAgICAgYldpZHRoLAotICAgICAgICAgICAgICAgIGJIZWlnaHQpOwotICAgICAgICB0aGlzLmZpbmlzaEJ1dHRvbi5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIHByb2Nlc3NGaW5pc2goKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLQotICAgICAgICB0aGlzLmN1cnJlbnRQYWdlID0gUEFHRV8xOwotICAgICAgICBtb3ZlVG9QYWdlKGN1cnJlbnRQYWdlKTsgLy9hZGQgdGhlIGZpcnN0IHBhZ2UgYXMgZGVmYXVsdAotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzaG93RXJyb3JNZXNzYWdlKCkgewotICAgICAgICBKT3B0aW9uUGFuZS5zaG93TWVzc2FnZURpYWxvZyh0aGlzLAotICAgICAgICAgICAgICAgICJSZXF1aXJlZCBWYWx1ZSBOb3Qgc2V0ISEhIiwKLSAgICAgICAgICAgICAgICAiRXJyb3IiLAotICAgICAgICAgICAgICAgIEpPcHRpb25QYW5lLkVSUk9SX01FU1NBR0UpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzaG93RXJyb3JNZXNzYWdlKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIEpPcHRpb25QYW5lLnNob3dNZXNzYWdlRGlhbG9nKHRoaXMsCi0gICAgICAgICAgICAgICAgbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAiRXJyb3IiLAotICAgICAgICAgICAgICAgIEpPcHRpb25QYW5lLkVSUk9SX01FU1NBR0UpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzaG93U3VjY2Vzc01lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgSk9wdGlvblBhbmUuc2hvd01lc3NhZ2VEaWFsb2codGhpcywKLSAgICAgICAgICAgICAgICBtZXNzYWdlLAotICAgICAgICAgICAgICAgICJFcnJvciIsCi0gICAgICAgICAgICAgICAgSk9wdGlvblBhbmUuSU5GT1JNQVRJT05fTUVTU0FHRSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGNvbmZpcm1FeGl0KCkgewotICAgICAgICBpbnQgcmV0dXJuVHlwZSA9IEpPcHRpb25QYW5lLnNob3dPcHRpb25EaWFsb2codGhpcywKLSAgICAgICAgICAgICAgICAiQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGV4aXQ/IiwKLSAgICAgICAgICAgICAgICAiRXhpdCBzZXJ2aWNlIGJ1aWxkZXIiLAotICAgICAgICAgICAgICAgIEpPcHRpb25QYW5lLllFU19OT19PUFRJT04sCi0gICAgICAgICAgICAgICAgSk9wdGlvblBhbmUuV0FSTklOR19NRVNTQUdFLAotICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIG51bGwpOwotICAgICAgICByZXR1cm4gKHJldHVyblR5cGUgPT0gSk9wdGlvblBhbmUuWUVTX09QVElPTik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIG1vdmVGb3J3YXJkKCkgewotICAgICAgICBpZiAoY3VycmVudFdpemFyZFBhbmUudmFsaWRhdGVWYWx1ZXMoKSkgewotICAgICAgICAgICAgdGhpcy5jdXJyZW50UGFnZSsrOwotICAgICAgICAgICAgbW92ZVRvUGFnZSh0aGlzLmN1cnJlbnRQYWdlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNob3dFcnJvck1lc3NhZ2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBtb3ZlQmFja1dhcmQoKSB7Ci0gICAgICAgIHRoaXMuY3VycmVudFBhZ2UtLTsKLSAgICAgICAgbW92ZVRvUGFnZSh0aGlzLmN1cnJlbnRQYWdlKTsKLQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBtb3ZlVG9QYWdlKGludCBwYWdlKSB7Ci0gICAgICAgIHN3aXRjaCAocGFnZSkgewotICAgICAgICAgICAgY2FzZSBQQUdFXzE6Ci0gICAgICAgICAgICAgICAgcHJvY2Vzc1BhZ2UobmV3IFdpemFyZFBhbmUxKHRoaXMud2l6YXJkQmVhbiwgdGhpcyksCi0gICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFBBR0VfMjoKLSAgICAgICAgICAgICAgICBwcm9jZXNzUGFnZShuZXcgV2l6YXJkUGFuZTIodGhpcy53aXphcmRCZWFuLCB0aGlzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBQQUdFXzM6Ci0gICAgICAgICAgICAgICAgcHJvY2Vzc1BhZ2UobmV3IFdpemFyZFBhbmUzKHRoaXMud2l6YXJkQmVhbiwgdGhpcyksCi0gICAgICAgICAgICAgICAgICAgICAgICB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NGaW5pc2goKSB7Ci0gICAgICAgIGlmIChjdXJyZW50V2l6YXJkUGFuZS52YWxpZGF0ZVZhbHVlcygpKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG5ldyBDb250cm9sbGVyKCkucHJvY2Vzcyh3aXphcmRCZWFuKTsKLSAgICAgICAgICAgICAgICBzaG93U3VjY2Vzc01lc3NhZ2UoIiBqYXIgZmlsZSBjcmVhdGlvbiBzdWNjZXNzZnVsISAiKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFByb2Nlc3NFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHNob3dFcnJvck1lc3NhZ2UoZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBzaG93RXJyb3JNZXNzYWdlKCJVbmtub3duIEVycm9yISAiICsgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc2hvd0Vycm9yTWVzc2FnZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NQYWdlKFdpemFyZFBhbmUgcGFuZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBwcmV2QnV0dG9uU3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gbmV4dEJ1dHRvblN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGZpbmlzaEJ1dHRvblN0YXRlKSB7Ci0gICAgICAgIHRoaXMud2l6YXJkUGFuZUNvbnRhaW5lci5yZW1vdmVBbGwoKTsKLSAgICAgICAgY3VycmVudFdpemFyZFBhbmUgPSBwYW5lOwotICAgICAgICB0aGlzLndpemFyZFBhbmVDb250YWluZXIuYWRkKHBhbmUpOwotICAgICAgICB0aGlzLnByZXZpb3VzQnV0dG9uLnNldEVuYWJsZWQocHJldkJ1dHRvblN0YXRlKTsKLSAgICAgICAgdGhpcy5uZXh0QnV0dG9uLnNldEVuYWJsZWQobmV4dEJ1dHRvblN0YXRlKTsKLSAgICAgICAgdGhpcy5maW5pc2hCdXR0b24uc2V0RW5hYmxlZChmaW5pc2hCdXR0b25TdGF0ZSk7Ci0gICAgICAgIHRoaXMucmVwYWludCgpOwotICAgIH0KLQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotICAgICAgICBuZXcgTWFpbldpbmRvdygpLnNob3coKTsKLSAgICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLXNlcnZpY2UtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL3NlcnZpY2Uvc3dpbmcvdWkvV2l6YXJkUGFuZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLXNlcnZpY2UtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL3NlcnZpY2Uvc3dpbmcvdWkvV2l6YXJkUGFuZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzM2E1YThjLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1zZXJ2aWNlLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9zZXJ2aWNlL3N3aW5nL3VpL1dpemFyZFBhbmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudG9vbC5zZXJ2aWNlLnN3aW5nLnVpOwotCi1pbXBvcnQgamF2YXguc3dpbmcuKjsKLWltcG9ydCBqYXZheC5zd2luZy5maWxlY2hvb3Nlci5GaWxlRmlsdGVyOwotaW1wb3J0IGphdmEuYXd0Lio7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgV2l6YXJkUGFuZSBleHRlbmRzIEpQYW5lbCB7Ci0gICAgcHJvdGVjdGVkIEpUZXh0QXJlYSBkZXNjcmlwdGlvbkxhYmVsOwotICAgIHByb3RlY3RlZCBKRnJhbWUgb3duZXJGcmFtZTsKLQotICAgIHByb3RlY3RlZCBpbnQgZGVzY1dpZHRoID0gNDAwOwotICAgIHByb3RlY3RlZCBpbnQgZGVzY0hlaWdodCA9IDEwMDsKLSAgICBwcm90ZWN0ZWQgaW50IHdpZHRoID0gNDAwOwotICAgIHByb3RlY3RlZCBpbnQgaGVpZ2h0ID0gMzAwOwotICAgIHByb3RlY3RlZCBpbnQgaGdhcCA9IDU7Ci0gICAgcHJvdGVjdGVkIGludCB2Z2FwID0gNTsKLQotICAgIHByb3RlY3RlZCBXaXphcmRQYW5lKCkgewotICAgIH0KLQotICAgIHByb3RlY3RlZCBXaXphcmRQYW5lKEpGcmFtZSBvd25lckZyYW1lKSB7Ci0gICAgICAgIHRoaXMub3duZXJGcmFtZSA9IG93bmVyRnJhbWU7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFdpemFyZFBhbmUoYm9vbGVhbiBpc0RvdWJsZUJ1ZmZlcmVkKSB7Ci0gICAgICAgIHN1cGVyKGlzRG91YmxlQnVmZmVyZWQpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBXaXphcmRQYW5lKExheW91dE1hbmFnZXIgbGF5b3V0KSB7Ci0gICAgICAgIHN1cGVyKGxheW91dCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFdpemFyZFBhbmUoTGF5b3V0TWFuYWdlciBsYXlvdXQsIGJvb2xlYW4gaXNEb3VibGVCdWZmZXJlZCkgewotICAgICAgICBzdXBlcihsYXlvdXQsIGlzRG91YmxlQnVmZmVyZWQpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGluaXREZXNjcmlwdGlvbihTdHJpbmcgZGVzYykgewotICAgICAgICB0aGlzLmRlc2NyaXB0aW9uTGFiZWwgPSBuZXcgSlRleHRBcmVhKGRlc2MpOwotICAgICAgICB0aGlzLmRlc2NyaXB0aW9uTGFiZWwuc2V0T3BhcXVlKGZhbHNlKTsKLSAgICAgICAgdGhpcy5kZXNjcmlwdGlvbkxhYmVsLnNldEVkaXRhYmxlKGZhbHNlKTsKLSAgICAgICAgdGhpcy5kZXNjcmlwdGlvbkxhYmVsLnNldEF1dG9zY3JvbGxzKHRydWUpOwotICAgICAgICB0aGlzLmRlc2NyaXB0aW9uTGFiZWwuc2V0Qm91bmRzKDAsIDAsIGRlc2NXaWR0aCwgZGVzY0hlaWdodCk7Ci0gICAgICAgIHRoaXMuYWRkKHRoaXMuZGVzY3JpcHRpb25MYWJlbCk7Ci0gICAgfQotCi0gICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gdmFsaWRhdGVWYWx1ZXMoKTsKLQotICAgIHByb3RlY3RlZCB2b2lkIHNob3dFcnJvck1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgSk9wdGlvblBhbmUuc2hvd01lc3NhZ2VEaWFsb2codGhpcywKLSAgICAgICAgICAgICAgICBtZXNzYWdlLAotICAgICAgICAgICAgICAgICJFcnJvciIsCi0gICAgICAgICAgICAgICAgSk9wdGlvblBhbmUuRVJST1JfTUVTU0FHRSk7Ci0gICAgfQotCi0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGJyb3dzZUZvckFGaWxlKGZpbmFsIFN0cmluZyBleHRlbnNpb24pIHsKLSAgICAgICAgU3RyaW5nIHN0ciA9ICIiOwotICAgICAgICBKRmlsZUNob29zZXIgZmMgPSBuZXcgSkZpbGVDaG9vc2VyKCk7Ci0gICAgICAgIGZjLnNldEZpbGVTZWxlY3Rpb25Nb2RlKEpGaWxlQ2hvb3Nlci5GSUxFU19BTkRfRElSRUNUT1JJRVMpOwotICAgICAgICBmYy5hZGRDaG9vc2FibGVGaWxlRmlsdGVyKG5ldyBGaWxlRmlsdGVyKCkgewotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgZikgewotICAgICAgICAgICAgICAgIGlmIChmLmdldE5hbWUoKS5lbmRzV2l0aChleHRlbnNpb24pIHx8IGYuaXNEaXJlY3RvcnkoKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGV4dGVuc2lvbiArICIgZmlsZSBmaWx0ZXIgIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgaW50IHJldHVyblZhbCA9IGZjLnNob3dPcGVuRGlhbG9nKHRoaXMpOwotICAgICAgICBpZiAocmV0dXJuVmFsID09IEpGaWxlQ2hvb3Nlci5BUFBST1ZFX09QVElPTikgewotICAgICAgICAgICAgc3RyID0gZmMuZ2V0U2VsZWN0ZWRGaWxlKCkuZ2V0QWJzb2x1dGVQYXRoKCkudHJpbSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdHI7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBicm93c2VGb3JBRm9sZGVyKCkgewotICAgICAgICBTdHJpbmcgc3RyID0gIiI7Ci0gICAgICAgIEpGaWxlQ2hvb3NlciBmYyA9IG5ldyBKRmlsZUNob29zZXIoKTsKLSAgICAgICAgZmMuc2V0RmlsZVNlbGVjdGlvbk1vZGUoSkZpbGVDaG9vc2VyLkRJUkVDVE9SSUVTX09OTFkpOwotICAgICAgICBpbnQgcmV0dXJuVmFsID0gZmMuc2hvd09wZW5EaWFsb2codGhpcyk7Ci0gICAgICAgIGlmIChyZXR1cm5WYWwgPT0gSkZpbGVDaG9vc2VyLkFQUFJPVkVfT1BUSU9OKSB7Ci0gICAgICAgICAgICBzdHIgPSBmYy5nZXRTZWxlY3RlZEZpbGUoKS5nZXRBYnNvbHV0ZVBhdGgoKS50cmltKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0cjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2Utc2VydmljZS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvc2VydmljZS9zd2luZy91aS9XaXphcmRQYW5lMS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLXNlcnZpY2UtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL3NlcnZpY2Uvc3dpbmcvdWkvV2l6YXJkUGFuZTEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg3NGFlZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2Utc2VydmljZS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvc2VydmljZS9zd2luZy91aS9XaXphcmRQYW5lMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50b29sLnNlcnZpY2Uuc3dpbmcudWk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRvb2wuc2VydmljZS5iZWFuLkNsYXNzRmlsZVNlbGVjdGlvbkJlYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29sLnNlcnZpY2UuYmVhbi5XaXphcmRCZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbC51dGlsLkNvbnN0YW50czsKLQotaW1wb3J0IGphdmF4LnN3aW5nLio7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uRXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuS2V5RXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuS2V5TGlzdGVuZXI7Ci0KLXB1YmxpYyBjbGFzcyBXaXphcmRQYW5lMSBleHRlbmRzIFdpemFyZFBhbmUgewotCi0gICAgcHJpdmF0ZSBDbGFzc0ZpbGVTZWxlY3Rpb25CZWFuIG15QmVhbiA9IG51bGw7Ci0KLSAgICBwcml2YXRlIEpMYWJlbCBjbGFzc0ZpbGVMb2NhdGlvbkxhYmVsOwotICAgIHByaXZhdGUgSlRleHRGaWVsZCBjbGFzc0ZpbGVMb2NhdGlvblRleHRCb3g7Ci0gICAgcHJpdmF0ZSBKQnV0dG9uIGJyb3dzZUJ1dHRvbjsKLQotICAgIHB1YmxpYyBXaXphcmRQYW5lMShXaXphcmRCZWFuIHdpemFyZEJlYW4sIEpGcmFtZSBvd25lckZyYW1lKSB7Ci0KLSAgICAgICAgc3VwZXIob3duZXJGcmFtZSk7Ci0KLSAgICAgICAgaW5pdCgpOwotCi0gICAgICAgIGlmICh3aXphcmRCZWFuLmdldFBhZ2UxYmVhbigpICE9IG51bGwpIHsKLSAgICAgICAgICAgIG15QmVhbiA9IHdpemFyZEJlYW4uZ2V0UGFnZTFiZWFuKCk7Ci0gICAgICAgICAgICB0aGlzLmNsYXNzRmlsZUxvY2F0aW9uVGV4dEJveC5zZXRUZXh0KG15QmVhbi5nZXRGaWxlTG9jYXRpb24oKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBteUJlYW4gPSBuZXcgQ2xhc3NGaWxlU2VsZWN0aW9uQmVhbigpOwotICAgICAgICAgICAgd2l6YXJkQmVhbi5zZXRQYWdlMWJlYW4obXlCZWFuKTsKLSAgICAgICAgfQotCi0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVZhbHVlcygpIHsKLSAgICAgICAgU3RyaW5nIHRleHQgPSBteUJlYW4uZ2V0RmlsZUxvY2F0aW9uKCk7Ci0gICAgICAgIHJldHVybiAodGV4dCAhPSBudWxsICYmIHRleHQudHJpbSgpLmxlbmd0aCgpID4gMCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGluaXQoKSB7Ci0gICAgICAgIHRoaXMuc2V0TGF5b3V0KG51bGwpOwotICAgICAgICB0aGlzLnNldFNpemUod2lkdGgsIGhlaWdodCk7Ci0KLSAgICAgICAgaW5pdERlc2NyaXB0aW9uKCJXZWxjb21lIHRvIHRoZSBuZXcgQVhJUyBTZXJ2aWNlIHBhY2thZ2VyIFdpemFyZCBJbnRlcmZhY2UuXG5cbiAiICsKLSAgICAgICAgICAgICAgICAiSW5zZXJ0IHRoZSBsb2NhdGlvbiBmb3IgdGhlIGNsYXNzIGZpbGVzIGhlcmUuVGhpcyBzaG91bGQgYmUgYSBmb2xkZXIgd2l0aCBcbiIgKwotICAgICAgICAgICAgICAgICIgdGhlIGNvbXBpbGVkIGNsYXNzZXMiKTsKLQotCi0gICAgICAgIHRoaXMuY2xhc3NGaWxlTG9jYXRpb25MYWJlbCA9IG5ldyBKTGFiZWwoImNsYXNzIGZpbGUgbG9jYXRpb24iKTsKLSAgICAgICAgdGhpcy5hZGQodGhpcy5jbGFzc0ZpbGVMb2NhdGlvbkxhYmVsKTsKLSAgICAgICAgdGhpcy5jbGFzc0ZpbGVMb2NhdGlvbkxhYmVsLnNldEJvdW5kcyhoZ2FwLAotICAgICAgICAgICAgICAgIGRlc2NIZWlnaHQsCi0gICAgICAgICAgICAgICAgQ29uc3RhbnRzLlVJQ29uc3RhbnRzLkxBQkVMX1dJRFRILAotICAgICAgICAgICAgICAgIENvbnN0YW50cy5VSUNvbnN0YW50cy5HRU5FUkFMX0NPTVBfSEVJR0hUKTsKLQotICAgICAgICB0aGlzLmNsYXNzRmlsZUxvY2F0aW9uVGV4dEJveCA9IG5ldyBKVGV4dEZpZWxkKCk7Ci0gICAgICAgIHRoaXMuYWRkKHRoaXMuY2xhc3NGaWxlTG9jYXRpb25UZXh0Qm94KTsKLSAgICAgICAgdGhpcy5jbGFzc0ZpbGVMb2NhdGlvblRleHRCb3guc2V0Qm91bmRzKAotICAgICAgICAgICAgICAgIENvbnN0YW50cy5VSUNvbnN0YW50cy5MQUJFTF9XSURUSCArIDIgKiBoZ2FwLAotICAgICAgICAgICAgICAgIGRlc2NIZWlnaHQsCi0gICAgICAgICAgICAgICAgQ29uc3RhbnRzLlVJQ29uc3RhbnRzLlRFWFRfQk9YX1dJRFRILAotICAgICAgICAgICAgICAgIENvbnN0YW50cy5VSUNvbnN0YW50cy5HRU5FUkFMX0NPTVBfSEVJR0hUKTsKLSAgICAgICAgdGhpcy5jbGFzc0ZpbGVMb2NhdGlvblRleHRCb3guYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVUZXh0Qm94Q2hhbmdlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICB0aGlzLmNsYXNzRmlsZUxvY2F0aW9uVGV4dEJveC5hZGRLZXlMaXN0ZW5lcihuZXcgS2V5TGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBrZXlUeXBlZChLZXlFdmVudCBlKSB7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGtleVByZXNzZWQoS2V5RXZlbnQgZSkgewotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBrZXlSZWxlYXNlZChLZXlFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlVGV4dEJveENoYW5nZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICB0aGlzLmJyb3dzZUJ1dHRvbiA9IG5ldyBKQnV0dG9uKCIuIik7Ci0gICAgICAgIHRoaXMuYWRkKHRoaXMuYnJvd3NlQnV0dG9uKTsKLSAgICAgICAgdGhpcy5icm93c2VCdXR0b24uc2V0Qm91bmRzKAotICAgICAgICAgICAgICAgIENvbnN0YW50cy5VSUNvbnN0YW50cy5MQUJFTF9XSURUSCArIDIgKiBoZ2FwICsKLSAgICAgICAgICAgICAgICBDb25zdGFudHMuVUlDb25zdGFudHMuVEVYVF9CT1hfV0lEVEgsCi0gICAgICAgICAgICAgICAgZGVzY0hlaWdodCwKLSAgICAgICAgICAgICAgICBDb25zdGFudHMuVUlDb25zdGFudHMuQlJPV1NFX0JVVFRPTl9XSURUSCwKLSAgICAgICAgICAgICAgICBDb25zdGFudHMuVUlDb25zdGFudHMuR0VORVJBTF9DT01QX0hFSUdIVCk7Ci0gICAgICAgIHRoaXMuYnJvd3NlQnV0dG9uLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgY2xhc3NGaWxlTG9jYXRpb25UZXh0Qm94LnNldFRleHQoYnJvd3NlRm9yQUZvbGRlcigpKTsKLSAgICAgICAgICAgICAgICBoYW5kbGVUZXh0Qm94Q2hhbmdlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVRleHRCb3hDaGFuZ2UoKSB7Ci0gICAgICAgIFN0cmluZyB0ZXh0ID0gY2xhc3NGaWxlTG9jYXRpb25UZXh0Qm94LmdldFRleHQoKTsKLSAgICAgICAgaWYgKHRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgdGhpcy5teUJlYW4uc2V0RmlsZUxvY2F0aW9uKHRleHQpOwotICAgICAgICB9Ci0gICAgfQotCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2Utc2VydmljZS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvc2VydmljZS9zd2luZy91aS9XaXphcmRQYW5lMi5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLXNlcnZpY2UtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL3NlcnZpY2Uvc3dpbmcvdWkvV2l6YXJkUGFuZTIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ViOWZkOS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2Utc2VydmljZS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvc2VydmljZS9zd2luZy91aS9XaXphcmRQYW5lMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50b29sLnNlcnZpY2Uuc3dpbmcudWk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRvb2wuc2VydmljZS5iZWFuLlBhZ2UyQmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRvb2wuc2VydmljZS5iZWFuLldpemFyZEJlYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29sLnNlcnZpY2UuY29udHJvbC5Db250cm9sbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbC5zZXJ2aWNlLmNvbnRyb2wuUHJvY2Vzc0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRvb2wudXRpbC5Db25zdGFudHM7Ci0KLWltcG9ydCBqYXZheC5zd2luZy4qOwotaW1wb3J0IGphdmEuYXd0Lio7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uRXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuS2V5RXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuS2V5TGlzdGVuZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotcHVibGljIGNsYXNzIFdpemFyZFBhbmUyIGV4dGVuZHMgV2l6YXJkUGFuZSB7Ci0KLSAgICBwcml2YXRlIFdpemFyZEJlYW4gcGFyZW50QmVhbjsKLSAgICBwcml2YXRlIFBhZ2UyQmVhbiBteUJlYW47Ci0KLSAgICBwcml2YXRlIEpSYWRpb0J1dHRvbiBzZWxlY3RNYW51YWxGaWxlUmFkaW9CdXR0b247Ci0gICAgcHJpdmF0ZSBKUmFkaW9CdXR0b24gY3JlYXRlQXV0b21hdGljRmlsZVJhZGlvQnV0dG9uOwotICAgIHByaXZhdGUgSlBhbmVsIHNlbGVjdGlvblBhbmVsOwotCi0KLSAgICBwdWJsaWMgV2l6YXJkUGFuZTIoV2l6YXJkQmVhbiB3aXphcmRCZWFuLCBKRnJhbWUgb3duZXJGcmFtZSkgewotICAgICAgICBzdXBlcihvd25lckZyYW1lKTsKLQotICAgICAgICBpbml0KCk7Ci0KLSAgICAgICAgcGFyZW50QmVhbiA9IHdpemFyZEJlYW47Ci0KLSAgICAgICAgaWYgKHdpemFyZEJlYW4uZ2V0UGFnZTJiZWFuKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgbXlCZWFuID0gd2l6YXJkQmVhbi5nZXRQYWdlMmJlYW4oKTsKLSAgICAgICAgICAgIC8vc2V0IHRoZSBpbml0aWFsIHNldHRpbmdzIGZyb20gdGhlIGJlYW4KLSAgICAgICAgICAgIHNldEJlYW5WYWx1ZXMoKTsKLQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbXlCZWFuID0gbmV3IFBhZ2UyQmVhbigpOwotICAgICAgICAgICAgd2l6YXJkQmVhbi5zZXRQYWdlMmJlYW4obXlCZWFuKTsKLSAgICAgICAgICAgIHNldERlZmF1bHRWYWx1ZXMoKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QmVhblZhbHVlcygpIHsKLSAgICAgICAgaWYgKG15QmVhbi5pc01hbnVhbCgpKSB7Ci0gICAgICAgICAgICB0aGlzLnNlbGVjdE1hbnVhbEZpbGVSYWRpb0J1dHRvbi5zZXRTZWxlY3RlZCh0cnVlKTsKLSAgICAgICAgICAgIGxvYWRTY3JlZW4obmV3IE1hbnVhbFNlbGVjdGlvblBhbmVsKHRydWUpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRoaXMuY3JlYXRlQXV0b21hdGljRmlsZVJhZGlvQnV0dG9uLnNldFNlbGVjdGVkKHRydWUpOwotICAgICAgICAgICAgbG9hZFNjcmVlbihuZXcgQXV0b21hdGljU2VsZWN0aW9uUGFuZWwodHJ1ZSkpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVZhbHVlcygpIHsKLSAgICAgICAgU3RyaW5nIHRleHQgPSAiIjsKLSAgICAgICAgU3RyaW5nIHRleHQyID0gIiI7Ci0gICAgICAgIGJvb2xlYW4gcmV0dXJuVmFsdWUgPSBmYWxzZTsKLSAgICAgICAgaWYgKG15QmVhbi5pc01hbnVhbCgpKSB7Ci0gICAgICAgICAgICB0ZXh0ID0gbXlCZWFuLmdldE1hbnVhbEZpbGVOYW1lKCk7Ci0gICAgICAgICAgICByZXR1cm5WYWx1ZSA9ICh0ZXh0ICE9IG51bGwgJiYgdGV4dC50cmltKCkubGVuZ3RoKCkgPiAwKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRleHQgPSBteUJlYW4uZ2V0QXV0b21hdGljQ2xhc3NOYW1lKCk7Ci0gICAgICAgICAgICB0ZXh0MiA9IG15QmVhbi5nZXRQcm92aWRlckNsYXNzTmFtZSgpOwotICAgICAgICAgICAgcmV0dXJuVmFsdWUgPSAodGV4dCAhPSBudWxsICYmIHRleHQudHJpbSgpLmxlbmd0aCgpID4gMCkgJiYKLSAgICAgICAgICAgICAgICAgICAgKHRleHQyICE9IG51bGwgJiYgdGV4dDIudHJpbSgpLmxlbmd0aCgpID4gMCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGluaXQoKSB7Ci0gICAgICAgIHRoaXMuc2V0TGF5b3V0KG51bGwpOwotICAgICAgICB0aGlzLnNldFNpemUod2lkdGgsIGhlaWdodCk7Ci0KLSAgICAgICAgaW5pdERlc2NyaXB0aW9uKCJcbiBTZWxlY3QgZWl0aGVyIHRoZSBzZXJ2aWNlIHhtbCBmaWxlIG9yIHRoZSBjbGFzcyB0aGF0IHlvdSB3YW50IHRvIFxuICIgKwotICAgICAgICAgICAgICAgICIgZXhwb3NlIGFzIHRoZSBzZXJ2aWNlIHRvIGF1dG8gZ2VuZXJhdGUgYSBzZXJ2aWNlLnhtbC4gXG4gIiArCi0gICAgICAgICAgICAgICAgIiBPbmx5IHRoZSBjbGFzcyBmaWxlcyB0aGF0IGFyZSBpbiB0aGUgcHJldmlvdXNseSBzZWxlY3RlZCBsb2NhdGlvbiBjYW5cbiIgKwotICAgICAgICAgICAgICAgICIgYmUgbGFkZWQgZnJvbSBoZXJlIik7Ci0KLSAgICAgICAgQnV0dG9uR3JvdXAgZ3JvdXAgPSBuZXcgQnV0dG9uR3JvdXAoKTsKLQotICAgICAgICB0aGlzLnNlbGVjdE1hbnVhbEZpbGVSYWRpb0J1dHRvbiA9Ci0gICAgICAgICAgICAgICAgbmV3IEpSYWRpb0J1dHRvbigiU2VsZWN0IGEgZmlsZSBtYW51YWxseSIpOwotICAgICAgICB0aGlzLnNlbGVjdE1hbnVhbEZpbGVSYWRpb0J1dHRvbi5zZXRCb3VuZHMoaGdhcCwKLSAgICAgICAgICAgICAgICBkZXNjSGVpZ2h0LAotICAgICAgICAgICAgICAgIENvbnN0YW50cy5VSUNvbnN0YW50cy5SQURJT19CVVRUT05fV0lEVEgsCi0gICAgICAgICAgICAgICAgQ29uc3RhbnRzLlVJQ29uc3RhbnRzLkdFTkVSQUxfQ09NUF9IRUlHSFQpOwotICAgICAgICB0aGlzLmFkZCh0aGlzLnNlbGVjdE1hbnVhbEZpbGVSYWRpb0J1dHRvbik7Ci0gICAgICAgIGdyb3VwLmFkZChzZWxlY3RNYW51YWxGaWxlUmFkaW9CdXR0b24pOwotICAgICAgICB0aGlzLnNlbGVjdE1hbnVhbEZpbGVSYWRpb0J1dHRvbi5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGNoYW5nZVNlbGVjdGlvblNjcmVlbigpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgdGhpcy5jcmVhdGVBdXRvbWF0aWNGaWxlUmFkaW9CdXR0b24gPQotICAgICAgICAgICAgICAgIG5ldyBKUmFkaW9CdXR0b24oIkNyZWF0ZSBhIGZpbGUgYXV0b21hdGljYWxseSIpOwotICAgICAgICB0aGlzLmNyZWF0ZUF1dG9tYXRpY0ZpbGVSYWRpb0J1dHRvbi5zZXRCb3VuZHMoaGdhcCwKLSAgICAgICAgICAgICAgICBkZXNjSGVpZ2h0ICsgdmdhcCArIENvbnN0YW50cy5VSUNvbnN0YW50cy5HRU5FUkFMX0NPTVBfSEVJR0hULAotICAgICAgICAgICAgICAgIENvbnN0YW50cy5VSUNvbnN0YW50cy5SQURJT19CVVRUT05fV0lEVEgsCi0gICAgICAgICAgICAgICAgQ29uc3RhbnRzLlVJQ29uc3RhbnRzLkdFTkVSQUxfQ09NUF9IRUlHSFQpOwotICAgICAgICB0aGlzLmFkZCh0aGlzLmNyZWF0ZUF1dG9tYXRpY0ZpbGVSYWRpb0J1dHRvbik7Ci0gICAgICAgIGdyb3VwLmFkZChjcmVhdGVBdXRvbWF0aWNGaWxlUmFkaW9CdXR0b24pOwotICAgICAgICB0aGlzLmNyZWF0ZUF1dG9tYXRpY0ZpbGVSYWRpb0J1dHRvbi5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGNoYW5nZVNlbGVjdGlvblNjcmVlbigpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICB0aGlzLnNlbGVjdGlvblBhbmVsID0gbmV3IEpQYW5lbCgpOwotICAgICAgICB0aGlzLnNlbGVjdGlvblBhbmVsLnNldExheW91dChudWxsKTsKLSAgICAgICAgdGhpcy5zZWxlY3Rpb25QYW5lbC5zZXRCb3VuZHMoMCwKLSAgICAgICAgICAgICAgICBkZXNjSGVpZ2h0ICsgMiAqIENvbnN0YW50cy5VSUNvbnN0YW50cy5HRU5FUkFMX0NPTVBfSEVJR0hUICsKLSAgICAgICAgICAgICAgICAyICogdmdhcCwKLSAgICAgICAgICAgICAgICB3aWR0aCwKLSAgICAgICAgICAgICAgICAxMDApOwotICAgICAgICB0aGlzLmFkZCh0aGlzLnNlbGVjdGlvblBhbmVsKTsKLQotICAgICAgICAvL3NlbGVjdCBtYW51YWwgb3B0aW9uIGJ5IGRlZmF1bHQKLQotCi0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNldERlZmF1bHRWYWx1ZXMoKSB7Ci0gICAgICAgIHRoaXMuc2VsZWN0TWFudWFsRmlsZVJhZGlvQnV0dG9uLnNldFNlbGVjdGVkKHRydWUpOwotICAgICAgICBsb2FkU2NyZWVuKG5ldyBNYW51YWxTZWxlY3Rpb25QYW5lbCgpKTsKLSAgICAgICAgdXBkYXRlQmVhbkZsYWdzKHRydWUpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjaGFuZ2VTZWxlY3Rpb25TY3JlZW4oKSB7Ci0gICAgICAgIGlmIChzZWxlY3RNYW51YWxGaWxlUmFkaW9CdXR0b24uaXNTZWxlY3RlZCgpKSB7Ci0gICAgICAgICAgICBsb2FkU2NyZWVuKG5ldyBNYW51YWxTZWxlY3Rpb25QYW5lbCh0cnVlKSk7Ci0gICAgICAgICAgICB1cGRhdGVCZWFuRmxhZ3ModHJ1ZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBsb2FkU2NyZWVuKG5ldyBBdXRvbWF0aWNTZWxlY3Rpb25QYW5lbCh0cnVlKSk7Ci0gICAgICAgICAgICB1cGRhdGVCZWFuRmxhZ3MoZmFsc2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUJlYW5GbGFncyhib29sZWFuIGZsYWcpIHsKLSAgICAgICAgbXlCZWFuLnNldE1hbnVhbChmbGFnKTsKLSAgICAgICAgbXlCZWFuLnNldEF1dG9tYXRpYyghZmxhZyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGxvYWRTY3JlZW4oSlBhbmVsIHBhbmVsKSB7Ci0gICAgICAgIHRoaXMuc2VsZWN0aW9uUGFuZWwucmVtb3ZlQWxsKCk7Ci0gICAgICAgIHRoaXMuc2VsZWN0aW9uUGFuZWwuYWRkKHBhbmVsKTsKLSAgICAgICAgdGhpcy5yZXBhaW50KCk7Ci0gICAgfQotCi0KLSAgICBwcml2YXRlIGNsYXNzIE1hbnVhbFNlbGVjdGlvblBhbmVsIGV4dGVuZHMgSlBhbmVsIHsKLQotICAgICAgICBwcml2YXRlIEpMYWJlbCBzZXJ2ZXJYTUxGaWxlTG9jYXRpb25MYWJlbDsKLSAgICAgICAgcHJpdmF0ZSBKVGV4dEZpZWxkIHNlcnZlclhNTEZpbGVMb2NhdGlvblRleHRCb3g7Ci0gICAgICAgIHByaXZhdGUgSkJ1dHRvbiBicm93c2VCdXR0b247Ci0KLSAgICAgICAgcHVibGljIE1hbnVhbFNlbGVjdGlvblBhbmVsKCkgewotICAgICAgICAgICAgaW5pdCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE1hbnVhbFNlbGVjdGlvblBhbmVsKGJvb2xlYW4gbG9hZFZhbHMpIHsKLSAgICAgICAgICAgIGluaXQoKTsKLSAgICAgICAgICAgIGlmIChsb2FkVmFscykgewotICAgICAgICAgICAgICAgIHRoaXMuc2VydmVyWE1MRmlsZUxvY2F0aW9uVGV4dEJveC5zZXRUZXh0KAotICAgICAgICAgICAgICAgICAgICAgICAgbXlCZWFuLmdldE1hbnVhbEZpbGVOYW1lKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGluaXQoKSB7Ci0gICAgICAgICAgICB0aGlzLnNldExheW91dChudWxsKTsKLSAgICAgICAgICAgIHRoaXMuc2V0U2l6ZSh3aWR0aCwgMTAwKTsKLQotICAgICAgICAgICAgdGhpcy5zZXJ2ZXJYTUxGaWxlTG9jYXRpb25MYWJlbCA9IG5ldyBKTGFiZWwoIlNlcnZpY2UgRmlsZSIpOwotICAgICAgICAgICAgdGhpcy5hZGQodGhpcy5zZXJ2ZXJYTUxGaWxlTG9jYXRpb25MYWJlbCk7Ci0gICAgICAgICAgICB0aGlzLnNlcnZlclhNTEZpbGVMb2NhdGlvbkxhYmVsLnNldEJvdW5kcyhoZ2FwLAotICAgICAgICAgICAgICAgICAgICB2Z2FwLAotICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuVUlDb25zdGFudHMuTEFCRUxfV0lEVEgsCi0gICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5VSUNvbnN0YW50cy5HRU5FUkFMX0NPTVBfSEVJR0hUKTsKLQotICAgICAgICAgICAgdGhpcy5zZXJ2ZXJYTUxGaWxlTG9jYXRpb25UZXh0Qm94ID0gbmV3IEpUZXh0RmllbGQoKTsKLSAgICAgICAgICAgIHRoaXMuYWRkKHRoaXMuc2VydmVyWE1MRmlsZUxvY2F0aW9uVGV4dEJveCk7Ci0gICAgICAgICAgICB0aGlzLnNlcnZlclhNTEZpbGVMb2NhdGlvblRleHRCb3guc2V0Qm91bmRzKAotICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuVUlDb25zdGFudHMuTEFCRUxfV0lEVEggKyAyICogaGdhcCwKLSAgICAgICAgICAgICAgICAgICAgdmdhcCwKLSAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLlVJQ29uc3RhbnRzLlRFWFRfQk9YX1dJRFRILAotICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuVUlDb25zdGFudHMuR0VORVJBTF9DT01QX0hFSUdIVCk7Ci0gICAgICAgICAgICB0aGlzLnNlcnZlclhNTEZpbGVMb2NhdGlvblRleHRCb3guYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldE91dEZpbGVOYW1lKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICB0aGlzLnNlcnZlclhNTEZpbGVMb2NhdGlvblRleHRCb3guYWRkS2V5TGlzdGVuZXIobmV3IEtleUxpc3RlbmVyKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGtleVR5cGVkKEtleUV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKEtleUV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBrZXlSZWxlYXNlZChLZXlFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldE91dEZpbGVOYW1lKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0KLSAgICAgICAgICAgIHRoaXMuYnJvd3NlQnV0dG9uID0gbmV3IEpCdXR0b24oIi4iKTsKLSAgICAgICAgICAgIHRoaXMuYWRkKHRoaXMuYnJvd3NlQnV0dG9uKTsKLSAgICAgICAgICAgIHRoaXMuYnJvd3NlQnV0dG9uLnNldEJvdW5kcygKLSAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLlVJQ29uc3RhbnRzLkxBQkVMX1dJRFRIICsgMiAqIGhnYXAgKwotICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuVUlDb25zdGFudHMuVEVYVF9CT1hfV0lEVEgsCi0gICAgICAgICAgICAgICAgICAgIHZnYXAsCi0gICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5VSUNvbnN0YW50cy5CUk9XU0VfQlVUVE9OX1dJRFRILAotICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuVUlDb25zdGFudHMuR0VORVJBTF9DT01QX0hFSUdIVCk7Ci0gICAgICAgICAgICB0aGlzLmJyb3dzZUJ1dHRvbi5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICAgICAgc2VydmVyWE1MRmlsZUxvY2F0aW9uVGV4dEJveC5zZXRUZXh0KGJyb3dzZUZvckFGaWxlKCJ4bWwiKSk7Ci0gICAgICAgICAgICAgICAgICAgIHNldE91dEZpbGVOYW1lKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBzZXRPdXRGaWxlTmFtZSgpIHsKLSAgICAgICAgICAgIG15QmVhbi5zZXRNYW51YWxGaWxlTmFtZShzZXJ2ZXJYTUxGaWxlTG9jYXRpb25UZXh0Qm94LmdldFRleHQoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIEF1dG9tYXRpY1NlbGVjdGlvblBhbmVsIGV4dGVuZHMgSlBhbmVsIHsKLQotICAgICAgICBwcml2YXRlIEpMYWJlbCBjbGFzc0ZpbGVMaXN0TGFibGU7Ci0gICAgICAgIHByaXZhdGUgSkxhYmVsIHByb3ZpZGVyQ2xhc3NMYWJsZTsKLSAgICAgICAgcHJpdmF0ZSBKVGV4dEZpZWxkIGNsYXNzRmlsZU5hbWVUZXh0Qm94OwotICAgICAgICBwcml2YXRlIEpUZXh0RmllbGQgcHJvdmlkZXJDbGFzc05hbWVUZXh0Qm94OwotICAgICAgICBwcml2YXRlIEpCdXR0b24gbG9hZEJ1dHRvbjsKLSAgICAgICAgcHJpdmF0ZSBKQnV0dG9uIGFkdmFuY2VkQnV0dG9uOwotCi0gICAgICAgIHB1YmxpYyBBdXRvbWF0aWNTZWxlY3Rpb25QYW5lbCgpIHsKLSAgICAgICAgICAgIGluaXQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBBdXRvbWF0aWNTZWxlY3Rpb25QYW5lbChib29sZWFuIGxvYWRWYWxzKSB7Ci0gICAgICAgICAgICBpbml0KCk7Ci0gICAgICAgICAgICBpZiAobG9hZFZhbHMpIHsKLSAgICAgICAgICAgICAgICB0aGlzLmNsYXNzRmlsZU5hbWVUZXh0Qm94LnNldFRleHQoCi0gICAgICAgICAgICAgICAgICAgICAgICBteUJlYW4uZ2V0QXV0b21hdGljQ2xhc3NOYW1lKCkpOwotICAgICAgICAgICAgICAgIHRoaXMucHJvdmlkZXJDbGFzc05hbWVUZXh0Qm94LnNldFRleHQoCi0gICAgICAgICAgICAgICAgICAgICAgICBteUJlYW4uZ2V0UHJvdmlkZXJDbGFzc05hbWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgaW5pdCgpIHsKLSAgICAgICAgICAgIHRoaXMuc2V0TGF5b3V0KG51bGwpOwotICAgICAgICAgICAgdGhpcy5zZXRTaXplKHdpZHRoLCAxMDApOwotCi0gICAgICAgICAgICB0aGlzLmNsYXNzRmlsZUxpc3RMYWJsZSA9IG5ldyBKTGFiZWwoIkNsYXNzIE5hbWUiKTsKLSAgICAgICAgICAgIHRoaXMuYWRkKHRoaXMuY2xhc3NGaWxlTGlzdExhYmxlKTsKLSAgICAgICAgICAgIHRoaXMuY2xhc3NGaWxlTGlzdExhYmxlLnNldEJvdW5kcyhoZ2FwLAotICAgICAgICAgICAgICAgICAgICB2Z2FwLAotICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuVUlDb25zdGFudHMuTEFCRUxfV0lEVEgsCi0gICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5VSUNvbnN0YW50cy5HRU5FUkFMX0NPTVBfSEVJR0hUKTsKLQotICAgICAgICAgICAgdGhpcy5jbGFzc0ZpbGVOYW1lVGV4dEJveCA9IG5ldyBKVGV4dEZpZWxkKCk7Ci0gICAgICAgICAgICB0aGlzLmFkZCh0aGlzLmNsYXNzRmlsZU5hbWVUZXh0Qm94KTsKLSAgICAgICAgICAgIHRoaXMuY2xhc3NGaWxlTmFtZVRleHRCb3guc2V0Qm91bmRzKAotICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuVUlDb25zdGFudHMuTEFCRUxfV0lEVEggKyAyICogaGdhcCwKLSAgICAgICAgICAgICAgICAgICAgdmdhcCwKLSAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLlVJQ29uc3RhbnRzLlRFWFRfQk9YX1dJRFRILAotICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuVUlDb25zdGFudHMuR0VORVJBTF9DT01QX0hFSUdIVCk7Ci0gICAgICAgICAgICB0aGlzLmNsYXNzRmlsZU5hbWVUZXh0Qm94LmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgICAgICBzZXRDbGFzc05hbWUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIHRoaXMuY2xhc3NGaWxlTmFtZVRleHRCb3guYWRkS2V5TGlzdGVuZXIobmV3IEtleUxpc3RlbmVyKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGtleVR5cGVkKEtleUV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKEtleUV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBrZXlSZWxlYXNlZChLZXlFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldENsYXNzTmFtZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotCi0gICAgICAgICAgICB0aGlzLnByb3ZpZGVyQ2xhc3NMYWJsZSA9IG5ldyBKTGFiZWwoIlByb3ZpZGVyIENsYXNzIE5hbWUiKTsKLSAgICAgICAgICAgIHRoaXMuYWRkKHRoaXMucHJvdmlkZXJDbGFzc0xhYmxlKTsKLSAgICAgICAgICAgIHRoaXMucHJvdmlkZXJDbGFzc0xhYmxlLnNldEJvdW5kcyhoZ2FwLAotICAgICAgICAgICAgICAgICAgICAoQ29uc3RhbnRzLlVJQ29uc3RhbnRzLkdFTkVSQUxfQ09NUF9IRUlHSFQgKyB2Z2FwKSwKLSAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLlVJQ29uc3RhbnRzLkxBQkVMX1dJRFRILAotICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuVUlDb25zdGFudHMuR0VORVJBTF9DT01QX0hFSUdIVCk7Ci0KLSAgICAgICAgICAgIHRoaXMucHJvdmlkZXJDbGFzc05hbWVUZXh0Qm94ID0gbmV3IEpUZXh0RmllbGQoKTsKLSAgICAgICAgICAgIHRoaXMuYWRkKHRoaXMucHJvdmlkZXJDbGFzc05hbWVUZXh0Qm94KTsKLSAgICAgICAgICAgIHRoaXMucHJvdmlkZXJDbGFzc05hbWVUZXh0Qm94LnNldEJvdW5kcygKLSAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLlVJQ29uc3RhbnRzLkxBQkVMX1dJRFRIICsgMiAqIGhnYXAsCi0gICAgICAgICAgICAgICAgICAgIChDb25zdGFudHMuVUlDb25zdGFudHMuR0VORVJBTF9DT01QX0hFSUdIVCArIHZnYXAgKiAyKSwKLSAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLlVJQ29uc3RhbnRzLlRFWFRfQk9YX1dJRFRILAotICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuVUlDb25zdGFudHMuR0VORVJBTF9DT01QX0hFSUdIVCk7Ci0gICAgICAgICAgICB0aGlzLnByb3ZpZGVyQ2xhc3NOYW1lVGV4dEJveC5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0UHJvdmlkZXJDbGFzc05hbWUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIHRoaXMucHJvdmlkZXJDbGFzc05hbWVUZXh0Qm94LmFkZEtleUxpc3RlbmVyKG5ldyBLZXlMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBrZXlUeXBlZChLZXlFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQga2V5UmVsZWFzZWQoS2V5RXZlbnQgZSkgewotICAgICAgICAgICAgICAgICAgICBzZXRQcm92aWRlckNsYXNzTmFtZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotCi0gICAgICAgICAgICB0aGlzLmxvYWRCdXR0b24gPSBuZXcgSkJ1dHRvbigiTG9hZCIpOwotICAgICAgICAgICAgdGhpcy5hZGQodGhpcy5sb2FkQnV0dG9uKTsKLSAgICAgICAgICAgIHRoaXMubG9hZEJ1dHRvbi5zZXRCb3VuZHMoaGdhcCwgKENvbnN0YW50cy5VSUNvbnN0YW50cy5HRU5FUkFMX0NPTVBfSEVJR0hUICsKLSAgICAgICAgICAgICAgICAgICAgdmdhcCkgKgotICAgICAgICAgICAgICAgICAgICAyICsKLSAgICAgICAgICAgICAgICAgICAgdmdhcCwKLSAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLlVJQ29uc3RhbnRzLkdFTkVSQUxfQlVUVE9OX1dJRFRILAotICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuVUlDb25zdGFudHMuR0VORVJBTF9DT01QX0hFSUdIVCk7Ci0gICAgICAgICAgICB0aGlzLmxvYWRCdXR0b24uYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvYWRBbGxNZXRob2RzKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICBsb2FkQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCi0gICAgICAgICAgICB0aGlzLmFkdmFuY2VkQnV0dG9uID0gbmV3IEpCdXR0b24oIkFkdmFuY2VkIik7Ci0gICAgICAgICAgICB0aGlzLmFkZCh0aGlzLmFkdmFuY2VkQnV0dG9uKTsKLSAgICAgICAgICAgIHRoaXMuYWR2YW5jZWRCdXR0b24uc2V0Qm91bmRzKAotICAgICAgICAgICAgICAgICAgICAyICogaGdhcCArIENvbnN0YW50cy5VSUNvbnN0YW50cy5HRU5FUkFMX0JVVFRPTl9XSURUSAotICAgICAgICAgICAgICAgICAgICAsIChDb25zdGFudHMuVUlDb25zdGFudHMuR0VORVJBTF9DT01QX0hFSUdIVCArIHZnYXApICogMiArCi0gICAgICAgICAgICAgICAgICAgIHZnYXAsCi0gICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5VSUNvbnN0YW50cy5HRU5FUkFMX0JVVFRPTl9XSURUSCwKLSAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLlVJQ29uc3RhbnRzLkdFTkVSQUxfQ09NUF9IRUlHSFQpOwotICAgICAgICAgICAgdGhpcy5hZHZhbmNlZEJ1dHRvbi5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICAgICAgb3BlbkRpYWxvZygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgdGhpcy5hZHZhbmNlZEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBsb2FkQWxsTWV0aG9kcygpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgQXJyYXlMaXN0IG1ldGhvZExpc3QgPSBuZXcgQ29udHJvbGxlcigpLmdldE1ldGhvZExpc3QoCi0gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRCZWFuKTsKLSAgICAgICAgICAgICAgICBteUJlYW4uc2V0U2VsZWN0ZWRNZXRob2ROYW1lcyhtZXRob2RMaXN0KTsKLSAgICAgICAgICAgICAgICBsb2FkQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgIGFkdmFuY2VkQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChQcm9jZXNzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBzaG93RXJyb3JNZXNzYWdlKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBvcGVuRGlhbG9nKCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBuZXcgQWR2YW5jZWRTZWxlY3Rpb25EaWFsb2coKS5zaG93KCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChQcm9jZXNzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBzaG93RXJyb3JNZXNzYWdlKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBzZXRDbGFzc05hbWUoKSB7Ci0gICAgICAgICAgICBsb2FkQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICBhZHZhbmNlZEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgIG15QmVhbi5zZXRBdXRvbWF0aWNDbGFzc05hbWUoY2xhc3NGaWxlTmFtZVRleHRCb3guZ2V0VGV4dCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBzZXRQcm92aWRlckNsYXNzTmFtZSgpIHsKLSAgICAgICAgICAgIC8vbG9hZEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgLy9hZHZhbmNlZEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgIG15QmVhbi5zZXRQcm92aWRlckNsYXNzTmFtZShwcm92aWRlckNsYXNzTmFtZVRleHRCb3guZ2V0VGV4dCgpKTsKLSAgICAgICAgfQotCi0KLSAgICB9Ci0KLQotICAgIHByaXZhdGUgY2xhc3MgQWR2YW5jZWRTZWxlY3Rpb25EaWFsb2cgZXh0ZW5kcyBKRGlhbG9nIHsKLQotICAgICAgICBwcml2YXRlIEpQYW5lbCBsYWJsZVBhbmVsOwotICAgICAgICBwcml2YXRlIEpCdXR0b24gb2tCdXR0b247Ci0gICAgICAgIHByaXZhdGUgSkJ1dHRvbiBjYW5jZWxCdXR0b247Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbltdIHNlbGVjdGVkVmFsdWVzOwotICAgICAgICBwcml2YXRlIEFycmF5TGlzdCBjb21wbGV0ZU1ldGhvZExpc3Q7Ci0KLQotICAgICAgICBwdWJsaWMgQWR2YW5jZWRTZWxlY3Rpb25EaWFsb2coKSB0aHJvd3MgSGVhZGxlc3NFeGNlcHRpb24sCi0gICAgICAgICAgICAgICAgUHJvY2Vzc0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBzdXBlcigpOwotICAgICAgICAgICAgc3VwZXIuc2V0TW9kYWwodHJ1ZSk7Ci0gICAgICAgICAgICBzdXBlci5zZXRUaXRsZSgiU2VsZWN0IE1ldGhvZHMiKTsKLSAgICAgICAgICAgIHRoaXMuZ2V0Q29udGVudFBhbmUoKS5zZXRMYXlvdXQobnVsbCk7Ci0gICAgICAgICAgICBpbml0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgaW5pdCgpIHRocm93cyBQcm9jZXNzRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIC8vbG9hZCB0aGUgY2xhc3MgZmlsZSBsaXN0Ci0gICAgICAgICAgICB0aGlzLmNvbXBsZXRlTWV0aG9kTGlzdCA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBDb250cm9sbGVyKCkuZ2V0TWV0aG9kTGlzdChwYXJlbnRCZWFuKTsKLSAgICAgICAgICAgIGludCBtZXRob2RDb3VudCA9IHRoaXMuY29tcGxldGVNZXRob2RMaXN0LnNpemUoKTsKLSAgICAgICAgICAgIGludCBwYW5lbEhlaWdodCA9IG1ldGhvZENvdW50ICoKLSAgICAgICAgICAgICAgICAgICAgKENvbnN0YW50cy5VSUNvbnN0YW50cy5HRU5FUkFMX0NPTVBfSEVJR0hUICsgdmdhcCk7Ci0KLSAgICAgICAgICAgIHRoaXMubGFibGVQYW5lbCA9IG5ldyBKUGFuZWwoKTsKLSAgICAgICAgICAgIHRoaXMubGFibGVQYW5lbC5zZXRMYXlvdXQobnVsbCk7Ci0gICAgICAgICAgICB0aGlzLmxhYmxlUGFuZWwuc2V0Qm91bmRzKDAsIDAsIHdpZHRoLCBwYW5lbEhlaWdodCk7Ci0gICAgICAgICAgICB0aGlzLmdldENvbnRlbnRQYW5lKCkuYWRkKHRoaXMubGFibGVQYW5lbCk7Ci0KLSAgICAgICAgICAgIEFycmF5TGlzdCBjdXJyZW50U2VsZWN0ZWRMaXN0ID0gbXlCZWFuLmdldFNlbGVjdGVkTWV0aG9kTmFtZXMoKTsKLSAgICAgICAgICAgIC8vY3JlYXRlIGNoZWNrIGJveGVzIGZvciBhbGwgdGhlIG1ldGhvZHMgYW5kIGFkZCB0aGVtIHRvIHRoZSBwYW5lbAotICAgICAgICAgICAgSkNoZWNrQm94IHRlbXBDaGVja0JveDsKLSAgICAgICAgICAgIGJvb2xlYW4gY3VycmVudFNlbGVjdGlvbjsKLSAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRWYWx1ZXMgPSBuZXcgYm9vbGVhblttZXRob2RDb3VudF07Ci0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kQ291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgIHRlbXBDaGVja0JveCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgSkNoZWNrQm94KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbXBsZXRlTWV0aG9kTGlzdC5nZXQoaSkudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgY3VycmVudFNlbGVjdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50U2VsZWN0ZWRMaXN0LmNvbnRhaW5zKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbXBsZXRlTWV0aG9kTGlzdC5nZXQoaSkpOwotICAgICAgICAgICAgICAgIHRlbXBDaGVja0JveC5zZXRTZWxlY3RlZChjdXJyZW50U2VsZWN0aW9uKTsKLSAgICAgICAgICAgICAgICBzZWxlY3RlZFZhbHVlc1tpXSA9IGN1cnJlbnRTZWxlY3Rpb247Ci0gICAgICAgICAgICAgICAgdGVtcENoZWNrQm94LnNldEJvdW5kcyhoZ2FwLCB2Z2FwICsKLSAgICAgICAgICAgICAgICAgICAgICAgIChDb25zdGFudHMuVUlDb25zdGFudHMuR0VORVJBTF9DT01QX0hFSUdIVCArIHZnYXApICogaSwKLSAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5VSUNvbnN0YW50cy5MQUJFTF9XSURUSCAqIDMsCi0gICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuVUlDb25zdGFudHMuR0VORVJBTF9DT01QX0hFSUdIVCk7Ci0gICAgICAgICAgICAgICAgdGVtcENoZWNrQm94LmFkZEFjdGlvbkxpc3RlbmVyKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENoZWNrQm94QWN0aW9uTGlzdG5lcih0ZW1wQ2hlY2tCb3gsIGkpKTsKLSAgICAgICAgICAgICAgICB0aGlzLmxhYmxlUGFuZWwuYWRkKHRlbXBDaGVja0JveCk7Ci0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgb2tCdXR0b24gPSBuZXcgSkJ1dHRvbigiT0siKTsKLSAgICAgICAgICAgIHRoaXMuZ2V0Q29udGVudFBhbmUoKS5hZGQodGhpcy5va0J1dHRvbik7Ci0gICAgICAgICAgICB0aGlzLm9rQnV0dG9uLnNldEJvdW5kcyhoZ2FwLCBwYW5lbEhlaWdodCArIHZnYXAsCi0gICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5VSUNvbnN0YW50cy5HRU5FUkFMX0JVVFRPTl9XSURUSCwKLSAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLlVJQ29uc3RhbnRzLkdFTkVSQUxfQ09NUF9IRUlHSFQpOwotICAgICAgICAgICAgdGhpcy5va0J1dHRvbi5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9hZFZhbHVlc1RvQmVhbigpOwotICAgICAgICAgICAgICAgICAgICBjbG9zZU1lKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0KLSAgICAgICAgICAgIGNhbmNlbEJ1dHRvbiA9IG5ldyBKQnV0dG9uKCJDYW5jZWwiKTsKLSAgICAgICAgICAgIHRoaXMuZ2V0Q29udGVudFBhbmUoKS5hZGQodGhpcy5jYW5jZWxCdXR0b24pOwotICAgICAgICAgICAgdGhpcy5jYW5jZWxCdXR0b24uc2V0Qm91bmRzKAotICAgICAgICAgICAgICAgICAgICBoZ2FwICogMiArIENvbnN0YW50cy5VSUNvbnN0YW50cy5HRU5FUkFMX0JVVFRPTl9XSURUSCwgcGFuZWxIZWlnaHQgKwotICAgICAgICAgICAgICAgICAgICB2Z2FwLAotICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuVUlDb25zdGFudHMuR0VORVJBTF9CVVRUT05fV0lEVEgsCi0gICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5VSUNvbnN0YW50cy5HRU5FUkFMX0NPTVBfSEVJR0hUKTsKLSAgICAgICAgICAgIHRoaXMuY2FuY2VsQnV0dG9uLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgICAgICBjbG9zZU1lKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0KLSAgICAgICAgICAgIHRoaXMuc2V0U2l6ZSh3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgcGFuZWxIZWlnaHQgKwotICAgICAgICAgICAgICAgICAgICAyICogQ29uc3RhbnRzLlVJQ29uc3RhbnRzLkdFTkVSQUxfQ09NUF9IRUlHSFQgKwotICAgICAgICAgICAgICAgICAgICAzMCk7Ci0gICAgICAgICAgICB0aGlzLnNldFJlc2l6YWJsZShmYWxzZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgdXBkYXRlU2VsZWN0aW9uKEpDaGVja0JveCBjaGVja0JveCwgaW50IGluZGV4KSB7Ci0gICAgICAgICAgICBpZiAoY2hlY2tCb3guaXNTZWxlY3RlZCgpKSB7Ci0gICAgICAgICAgICAgICAgc2VsZWN0ZWRWYWx1ZXNbaW5kZXhdID0gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2VsZWN0ZWRWYWx1ZXNbaW5kZXhdID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBsb2FkVmFsdWVzVG9CZWFuKCkgewotICAgICAgICAgICAgQXJyYXlMaXN0IG1vZGlmaWVkTWV0aG9kTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VsZWN0ZWRWYWx1ZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRWYWx1ZXNbaV0pCi0gICAgICAgICAgICAgICAgICAgIG1vZGlmaWVkTWV0aG9kTGlzdC5hZGQoY29tcGxldGVNZXRob2RMaXN0LmdldChpKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG15QmVhbi5zZXRTZWxlY3RlZE1ldGhvZE5hbWVzKG1vZGlmaWVkTWV0aG9kTGlzdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgY2xvc2VNZSgpIHsKLSAgICAgICAgICAgIHRoaXMuZGlzcG9zZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBjbGFzcyBDaGVja0JveEFjdGlvbkxpc3RuZXIgaW1wbGVtZW50cyBBY3Rpb25MaXN0ZW5lciB7Ci0gICAgICAgICAgICBwcml2YXRlIEpDaGVja0JveCBjaGVja0JveDsKLSAgICAgICAgICAgIHByaXZhdGUgaW50IGluZGV4OwotCi0gICAgICAgICAgICBwdWJsaWMgQ2hlY2tCb3hBY3Rpb25MaXN0bmVyKEpDaGVja0JveCBjaGVja0JveCwgaW50IGluZGV4KSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5pbmRleCA9IGluZGV4OwotICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tCb3ggPSBjaGVja0JveDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVTZWxlY3Rpb24oY2hlY2tCb3gsIGluZGV4KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1zZXJ2aWNlLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9zZXJ2aWNlL3N3aW5nL3VpL1dpemFyZFBhbmUzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2Utc2VydmljZS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvc2VydmljZS9zd2luZy91aS9XaXphcmRQYW5lMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGIwNWE4Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1zZXJ2aWNlLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9zZXJ2aWNlL3N3aW5nL3VpL1dpemFyZFBhbmUzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnRvb2wuc2VydmljZS5zd2luZy51aTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbC5zZXJ2aWNlLmJlYW4uUGFnZTNCZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbC5zZXJ2aWNlLmJlYW4uV2l6YXJkQmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRvb2wudXRpbC5Db25zdGFudHM7Ci0KLWltcG9ydCBqYXZheC5zd2luZy4qOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkV2ZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkxpc3RlbmVyOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LktleUV2ZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LktleUxpc3RlbmVyOwotCi1wdWJsaWMgY2xhc3MgV2l6YXJkUGFuZTMgZXh0ZW5kcyBXaXphcmRQYW5lIHsKLQotICAgIHByaXZhdGUgUGFnZTNCZWFuIG15QmVhbjsKLQotICAgIHByaXZhdGUgSkxhYmVsIG91dHB1dEZpbGVMb2NhdGlvbkxhYmVsOwotICAgIHByaXZhdGUgSlRleHRGaWVsZCBvdXRwdXRGaWxlTG9jYXRpb25UZXh0Qm94OwotICAgIHByaXZhdGUgSkJ1dHRvbiBicm93c2VCdXR0b247Ci0KLSAgICBwcml2YXRlIEpMYWJlbCBvdXRwdXRGaWxlTmFtZUxhYmVsOwotICAgIHByaXZhdGUgSlRleHRGaWVsZCBvdXRwdXRGaWxlTmFtZVRleHRCb3g7Ci0KLSAgICBwdWJsaWMgV2l6YXJkUGFuZTMoV2l6YXJkQmVhbiBiZWFuLCBKRnJhbWUgb3duZXJGcmFtZSkgewotICAgICAgICBzdXBlcihvd25lckZyYW1lKTsKLSAgICAgICAgaW5pdCgpOwotICAgICAgICBpZiAoYmVhbi5nZXRQYWdlM2JlYW4oKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aGlzLm15QmVhbiA9IGJlYW4uZ2V0UGFnZTNiZWFuKCk7Ci0gICAgICAgICAgICBzZXRCZWFuVmFsdWVzKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aGlzLm15QmVhbiA9IG5ldyBQYWdlM0JlYW4oKTsKLSAgICAgICAgICAgIGJlYW4uc2V0UGFnZTNiZWFuKG15QmVhbik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVZhbHVlcygpIHsKLSAgICAgICAgU3RyaW5nIHRleHQxID0gbXlCZWFuLmdldE91dHB1dEZpbGVOYW1lKCk7Ci0gICAgICAgIFN0cmluZyB0ZXh0MiA9IG15QmVhbi5nZXRPdXRwdXRGb2xkZXJOYW1lKCk7Ci0gICAgICAgIGJvb2xlYW4gdGV4dDFWYWxpZGl0eSA9ICh0ZXh0MSAhPSBudWxsICYmIHRleHQxLnRyaW0oKS5sZW5ndGgoKSA+IDApOwotICAgICAgICBib29sZWFuIHRleHQyVmFsaWRpdHkgPSAodGV4dDIgIT0gbnVsbCAmJiB0ZXh0Mi50cmltKCkubGVuZ3RoKCkgPiAwKTsKLQotICAgICAgICByZXR1cm4gdGV4dDFWYWxpZGl0eSAmJiB0ZXh0MlZhbGlkaXR5OwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZXRCZWFuVmFsdWVzKCkgewotICAgICAgICB0aGlzLm91dHB1dEZpbGVMb2NhdGlvblRleHRCb3guc2V0VGV4dChteUJlYW4uZ2V0T3V0cHV0Rm9sZGVyTmFtZSgpKTsKLSAgICAgICAgdGhpcy5vdXRwdXRGaWxlTmFtZVRleHRCb3guc2V0VGV4dChteUJlYW4uZ2V0T3V0cHV0RmlsZU5hbWUoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGluaXQoKSB7Ci0gICAgICAgIHRoaXMuc2V0TGF5b3V0KG51bGwpOwotICAgICAgICB0aGlzLnNldFNpemUod2lkdGgsIGhlaWdodCk7Ci0KLSAgICAgICAgaW5pdERlc2NyaXB0aW9uKCJcbklucHV0IHRoZSBsb2NhdGlvbiBmb3IgdGhlIG91dHB1dCBmaWxlIGFuZCB0aGUgbmFtZSBmb3IgXG4iICsKLSAgICAgICAgICAgICAgICAidGhlIGNvbXBpbGVkIGphciBmaWxlICIpOwotCi0KLSAgICAgICAgdGhpcy5vdXRwdXRGaWxlTG9jYXRpb25MYWJlbCA9IG5ldyBKTGFiZWwoIk91dHB1dCBGb2xkZXIiKTsKLSAgICAgICAgdGhpcy5hZGQodGhpcy5vdXRwdXRGaWxlTG9jYXRpb25MYWJlbCk7Ci0gICAgICAgIHRoaXMub3V0cHV0RmlsZUxvY2F0aW9uTGFiZWwuc2V0Qm91bmRzKGhnYXAsCi0gICAgICAgICAgICAgICAgZGVzY0hlaWdodCwKLSAgICAgICAgICAgICAgICBDb25zdGFudHMuVUlDb25zdGFudHMuTEFCRUxfV0lEVEgsCi0gICAgICAgICAgICAgICAgQ29uc3RhbnRzLlVJQ29uc3RhbnRzLkdFTkVSQUxfQ09NUF9IRUlHSFQpOwotCi0gICAgICAgIHRoaXMub3V0cHV0RmlsZUxvY2F0aW9uVGV4dEJveCA9IG5ldyBKVGV4dEZpZWxkKCk7Ci0gICAgICAgIHRoaXMuYWRkKHRoaXMub3V0cHV0RmlsZUxvY2F0aW9uVGV4dEJveCk7Ci0gICAgICAgIHRoaXMub3V0cHV0RmlsZUxvY2F0aW9uVGV4dEJveC5zZXRCb3VuZHMoCi0gICAgICAgICAgICAgICAgQ29uc3RhbnRzLlVJQ29uc3RhbnRzLkxBQkVMX1dJRFRIICsgMiAqIGhnYXAsCi0gICAgICAgICAgICAgICAgZGVzY0hlaWdodCwKLSAgICAgICAgICAgICAgICBDb25zdGFudHMuVUlDb25zdGFudHMuVEVYVF9CT1hfV0lEVEgsCi0gICAgICAgICAgICAgICAgQ29uc3RhbnRzLlVJQ29uc3RhbnRzLkdFTkVSQUxfQ09NUF9IRUlHSFQpOwotICAgICAgICB0aGlzLm91dHB1dEZpbGVMb2NhdGlvblRleHRCb3guYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVMb2NhdGlvbkNoYW5nZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgdGhpcy5vdXRwdXRGaWxlTG9jYXRpb25UZXh0Qm94LmFkZEtleUxpc3RlbmVyKG5ldyBLZXlMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGtleVR5cGVkKEtleUV2ZW50IGUpIHsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlTG9jYXRpb25DaGFuZ2UoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQga2V5UmVsZWFzZWQoS2V5RXZlbnQgZSkgewotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotCi0gICAgICAgIHRoaXMuYnJvd3NlQnV0dG9uID0gbmV3IEpCdXR0b24oIi4iKTsKLSAgICAgICAgdGhpcy5hZGQodGhpcy5icm93c2VCdXR0b24pOwotICAgICAgICB0aGlzLmJyb3dzZUJ1dHRvbi5zZXRCb3VuZHMoCi0gICAgICAgICAgICAgICAgQ29uc3RhbnRzLlVJQ29uc3RhbnRzLkxBQkVMX1dJRFRIICsgMiAqIGhnYXAgKwotICAgICAgICAgICAgICAgIENvbnN0YW50cy5VSUNvbnN0YW50cy5URVhUX0JPWF9XSURUSCwKLSAgICAgICAgICAgICAgICBkZXNjSGVpZ2h0LAotICAgICAgICAgICAgICAgIENvbnN0YW50cy5VSUNvbnN0YW50cy5CUk9XU0VfQlVUVE9OX1dJRFRILAotICAgICAgICAgICAgICAgIENvbnN0YW50cy5VSUNvbnN0YW50cy5HRU5FUkFMX0NPTVBfSEVJR0hUKTsKLSAgICAgICAgdGhpcy5icm93c2VCdXR0b24uYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBvdXRwdXRGaWxlTG9jYXRpb25UZXh0Qm94LnNldFRleHQoYnJvd3NlRm9yQUZvbGRlcigpKTsKLSAgICAgICAgICAgICAgICBoYW5kbGVMb2NhdGlvbkNoYW5nZSgpOwotCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0KLSAgICAgICAgdGhpcy5vdXRwdXRGaWxlTmFtZUxhYmVsID0gbmV3IEpMYWJlbCgiT3V0IEZpbGUgTmFtZSIpOwotICAgICAgICB0aGlzLmFkZCh0aGlzLm91dHB1dEZpbGVOYW1lTGFiZWwpOwotICAgICAgICB0aGlzLm91dHB1dEZpbGVOYW1lTGFiZWwuc2V0Qm91bmRzKGhnYXAsCi0gICAgICAgICAgICAgICAgZGVzY0hlaWdodCArIENvbnN0YW50cy5VSUNvbnN0YW50cy5HRU5FUkFMX0NPTVBfSEVJR0hUICsgdmdhcCwKLSAgICAgICAgICAgICAgICBDb25zdGFudHMuVUlDb25zdGFudHMuTEFCRUxfV0lEVEgsCi0gICAgICAgICAgICAgICAgQ29uc3RhbnRzLlVJQ29uc3RhbnRzLkdFTkVSQUxfQ09NUF9IRUlHSFQpOwotCi0gICAgICAgIHRoaXMub3V0cHV0RmlsZU5hbWVUZXh0Qm94ID0gbmV3IEpUZXh0RmllbGQoKTsKLSAgICAgICAgdGhpcy5hZGQodGhpcy5vdXRwdXRGaWxlTmFtZVRleHRCb3gpOwotICAgICAgICB0aGlzLm91dHB1dEZpbGVOYW1lVGV4dEJveC5zZXRCb3VuZHMoCi0gICAgICAgICAgICAgICAgQ29uc3RhbnRzLlVJQ29uc3RhbnRzLkxBQkVMX1dJRFRIICsgMiAqIGhnYXAsCi0gICAgICAgICAgICAgICAgZGVzY0hlaWdodCArIENvbnN0YW50cy5VSUNvbnN0YW50cy5HRU5FUkFMX0NPTVBfSEVJR0hUICsgdmdhcCwKLSAgICAgICAgICAgICAgICBDb25zdGFudHMuVUlDb25zdGFudHMuVEVYVF9CT1hfV0lEVEgsCi0gICAgICAgICAgICAgICAgQ29uc3RhbnRzLlVJQ29uc3RhbnRzLkdFTkVSQUxfQ09NUF9IRUlHSFQpOwotICAgICAgICB0aGlzLm91dHB1dEZpbGVOYW1lVGV4dEJveC5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGhhbmRsZUZpbGVOYW1lQ2hhbmdlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICB0aGlzLm91dHB1dEZpbGVOYW1lVGV4dEJveC5hZGRLZXlMaXN0ZW5lcihuZXcgS2V5TGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBrZXlUeXBlZChLZXlFdmVudCBlKSB7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGtleVByZXNzZWQoS2V5RXZlbnQgZSkgewotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBrZXlSZWxlYXNlZChLZXlFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlRmlsZU5hbWVDaGFuZ2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlTG9jYXRpb25DaGFuZ2UoKSB7Ci0gICAgICAgIG15QmVhbi5zZXRPdXRwdXRGb2xkZXJOYW1lKG91dHB1dEZpbGVMb2NhdGlvblRleHRCb3guZ2V0VGV4dCgpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlRmlsZU5hbWVDaGFuZ2UoKSB7Ci0gICAgICAgIG15QmVhbi5zZXRPdXRwdXRGaWxlTmFtZShvdXRwdXRGaWxlTmFtZVRleHRCb3guZ2V0VGV4dCgpKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1zZXJ2aWNlLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC91dGlsL0NvbnN0YW50cy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLXNlcnZpY2UtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL3V0aWwvQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmMzk2OTkuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLXNlcnZpY2UtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL3V0aWwvQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudG9vbC51dGlsOwotCi1wdWJsaWMgY2xhc3MgQ29uc3RhbnRzIHsKLSAgICBwdWJsaWMgY2xhc3MgVUlDb25zdGFudHN7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExBQkVMX1dJRFRIPTEwMDsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkFESU9fQlVUVE9OX1dJRFRIPTIwMDsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEVYVF9CT1hfV0lEVEg9MjUwOwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCUk9XU0VfQlVUVE9OX1dJRFRIPTIwOwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHRU5FUkFMX0JVVFRPTl9XSURUSD04MDsKLQotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHRU5FUkFMX0NPTVBfSEVJR0hUPTIwOwotICAgIAotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgY2xhc3MgU2VydmljZUNvbnN0YW50c3sKLSAgICAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTT1VSQ0VfRk9MREVSPSJyZXNvdXJjZXMiOwkJCQkJCQotICAgIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWSUNFU19YU0RfU0NIRU1BX05BTUU9InNlcnZpY2VzLnhzZCI7CQkJCQotICAgIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfU0NIRU1BPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI7CQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1zZXJ2aWNlLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC91dGlsL1NlcnZpY2VQbHVnaW5VdGlscy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLXNlcnZpY2UtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL3V0aWwvU2VydmljZVBsdWdpblV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1YzgyZmQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLXNlcnZpY2UtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL3V0aWwvU2VydmljZVBsdWdpblV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudG9vbC51dGlsOw0KLQ0KLWltcG9ydCBqYXZhLmlvLkZpbGU7DQotDQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOw0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1Tb3VyY2U7DQotaW1wb3J0IGphdmF4LnhtbC52YWxpZGF0aW9uLlNjaGVtYTsNCi1pbXBvcnQgamF2YXgueG1sLnZhbGlkYXRpb24uU2NoZW1hRmFjdG9yeTsNCi1pbXBvcnQgamF2YXgueG1sLnZhbGlkYXRpb24uVmFsaWRhdG9yOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRvb2wuc2VydmljZS5lY2xpcHNlLnBsdWdpbi5TZXJ2aWNlQXJjaGl2ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbC51dGlsLkNvbnN0YW50cy5TZXJ2aWNlQ29uc3RhbnRzOw0KLQ0KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlUGx1Z2luVXRpbHMgew0KLQkvKioNCi0JICogVmFsaWRhdGVzIHRoZSBnaXZlbiB4bWwgZmlsZSBhZ2FpbnN0IHRoZSBheGlzMiBzZXJ2aWNlcyBzY2hlbWEuIA0KLQkgKiBAcmV0dXJuIHJldHVybiB0cnVlIGlmIHRoZSB4bWwgaXMgdmFsaWQNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1NlcnZpY2VzWE1MVmFsaWQoU3RyaW5nIHNlcnZpY2VzWG1sUGF0aCl7DQotICAgICAgICBTY2hlbWFGYWN0b3J5IGZhY3RvcnkgPSANCi0gICAgICAgICAgICBTY2hlbWFGYWN0b3J5Lm5ld0luc3RhbmNlKFNlcnZpY2VDb25zdGFudHMuWE1MX1NDSEVNQSk7DQotICAgICAgICANCi0gICAgICAgIHRyeSB7DQotICAgICAgICAJU3RyaW5nIHJlc291cmNlUGF0aD1hZGRBbm90aGVyTm9kZVRvUGF0aCgNCi0gICAgICAgIAkJCVNlcnZpY2VDb25zdGFudHMuUkVTT1VSQ0VfRk9MREVSLCBTZXJ2aWNlQ29uc3RhbnRzLlNFUlZJQ0VTX1hTRF9TQ0hFTUFfTkFNRSk7DQotICAgICAgICAgICAgU2NoZW1hIHNjaGVtYSA9IGZhY3RvcnkubmV3U2NoZW1hKA0KLSAgICAgICAgICAgIAkJIFNlcnZpY2VBcmNoaXZlci5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0RW50cnkocmVzb3VyY2VQYXRoKSk7DQotICAgICAgICAgICAgVmFsaWRhdG9yIHZhbGlkYXRvciA9IHNjaGVtYS5uZXdWYWxpZGF0b3IoKTsNCi0gICAgICAgICAgICBTb3VyY2Ugc291cmNlID0gbmV3IFN0cmVhbVNvdXJjZShuZXcgRmlsZShzZXJ2aWNlc1htbFBhdGgpKTsNCi0gICAgICAgICAgICB2YWxpZGF0b3IudmFsaWRhdGUoc291cmNlKTsNCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpIHsNCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9ICANCi0JfQ0KLQkNCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWRkQW5vdGhlck5vZGVUb1BhdGgoU3RyaW5nIGN1cnJlbnRQYXRoLCBTdHJpbmcgbmV3Tm9kZSkgew0KLQkJcmV0dXJuIGN1cnJlbnRQYXRoICsgRmlsZS5zZXBhcmF0b3IgKyBuZXdOb2RlOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1zZXJ2aWNlLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvbG9nNGoucHJvcGVydGllcyBiL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1zZXJ2aWNlLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvbG9nNGoucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU0ODA0Zi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2Utc2VydmljZS1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2xvZzRqLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0jCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLQotIyBTZXQgcm9vdCBjYXRlZ29yeSBwcmlvcml0eSB0byBJTkZPIGFuZCBpdHMgb25seSBhcHBlbmRlciB0byBDT05TT0xFLgotbG9nNGoucm9vdENhdGVnb3J5PUlORk8sIENPTlNPTEUKLSNsb2c0ai5yb290Q2F0ZWdvcnk9SU5GTywgQ09OU09MRSwgTE9HRklMRQotCi0jIFNldCB0aGUgZW50ZXJwcmlzZSBsb2dnZXIgcHJpb3JpdHkgdG8gRkFUQUwKLWxvZzRqLmxvZ2dlci5vcmcuYXBhY2hlLmF4aXMyLmVudGVycHJpc2U9RkFUQUwKLWxvZzRqLmxvZ2dlci5kZS5odW5zaWNrZXIuamFsb3B5LmlvPUZBVEFMCi1sb2c0ai5sb2dnZXIuaHR0cGNsaWVudC53aXJlLmhlYWRlcj1GQVRBTAotbG9nNGoubG9nZ2VyLm9yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50PUZBVEFMCi0KLSMgQ09OU09MRSBpcyBzZXQgdG8gYmUgYSBDb25zb2xlQXBwZW5kZXIgdXNpbmcgYSBQYXR0ZXJuTGF5b3V0LgotbG9nNGouYXBwZW5kZXIuQ09OU09MRT1vcmcuYXBhY2hlLmxvZzRqLkNvbnNvbGVBcHBlbmRlcgotbG9nNGouYXBwZW5kZXIuQ09OU09MRS5sYXlvdXQ9b3JnLmFwYWNoZS5sb2c0ai5QYXR0ZXJuTGF5b3V0Ci1sb2c0ai5hcHBlbmRlci5DT05TT0xFLmxheW91dC5Db252ZXJzaW9uUGF0dGVybj0lZCAlLTVwICVjIC0gJW0lbgotCi0jIExPR0ZJTEUgaXMgc2V0IHRvIGJlIGEgRmlsZSBhcHBlbmRlciB1c2luZyBhIFBhdHRlcm5MYXlvdXQuCi1sb2c0ai5hcHBlbmRlci5MT0dGSUxFPW9yZy5hcGFjaGUubG9nNGouRmlsZUFwcGVuZGVyCi1sb2c0ai5hcHBlbmRlci5MT0dGSUxFLkZpbGU9YXhpczIubG9nCi1sb2c0ai5hcHBlbmRlci5MT0dGSUxFLkFwcGVuZD10cnVlCi1sb2c0ai5hcHBlbmRlci5MT0dGSUxFLmxheW91dD1vcmcuYXBhY2hlLmxvZzRqLlBhdHRlcm5MYXlvdXQKLWxvZzRqLmFwcGVuZGVyLkxPR0ZJTEUubGF5b3V0LkNvbnZlcnNpb25QYXR0ZXJuPSVkIFsldF0gJS01cCAlYyAleCAtICVtJW4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vaWRlYS1wbHVnaW4tYXNlZW1ibHkueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9pZGVhLXBsdWdpbi1hc2VlbWJseS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjZDM1NzUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9pZGVhLXBsdWdpbi1hc2VlbWJseS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08YXNzZW1ibHk+DQotICAgIDxpbmNsdWRlQmFzZURpcmVjdG9yeT5mYWxzZTwvaW5jbHVkZUJhc2VEaXJlY3Rvcnk+DQotICAgIDxmb3JtYXRzPg0KLSAgICAgICAgPGZvcm1hdD56aXA8L2Zvcm1hdD4NCi0gICAgPC9mb3JtYXRzPg0KLSAgICA8ZmlsZVNldHM+DQotICAgICAgICA8ZmlsZVNldD4NCi0gICAgICAgICAgICA8ZGlyZWN0b3J5Pi4vdGFyZ2V0L2NsYXNzZXM8L2RpcmVjdG9yeT4NCi0gICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PmNsYXNzZXM8L291dHB1dERpcmVjdG9yeT4NCi0gICAgIAk8L2ZpbGVTZXQ+DQotICAgICAgICA8ZmlsZVNldD4NCi0gICAgICAgICAgICA8ZGlyZWN0b3J5Pi4vdGFyZ2V0L2NsYXNzZXMvTUVUQS1JTkY8L2RpcmVjdG9yeT4NCi0gICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5Pk1FVEEtSU5GPC9vdXRwdXREaXJlY3Rvcnk+DQotICAgICAJPC9maWxlU2V0Pg0KLSAgICA8L2ZpbGVTZXRzPg0KLQk8ZGVwZW5kZW5jeVNldHM+DQotICAgICAgICA8ZGVwZW5kZW5jeVNldD4NCi0gICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PmxpYjwvb3V0cHV0RGlyZWN0b3J5Pg0KLSAgICAgICAgICAgIDxpbmNsdWRlcz4NCi0gICAgICAgICAgICAgICAgPGluY2x1ZGU+b3JnLmFwYWNoZS53cy5jb21tb25zLmF4aW9tOmF4aW9tLWFwaTpqYXI8L2luY2x1ZGU+DQotICAgICAgICAgICAgICAgIDxpbmNsdWRlPm9yZy5hcGFjaGUud3MuY29tbW9ucy5heGlvbTpheGlvbS1kb206amFyPC9pbmNsdWRlPg0KLSAgICAgICAgICAgICAgICA8aW5jbHVkZT5vcmcuYXBhY2hlLndzLmNvbW1vbnMuYXhpb206YXhpb20taW1wbDpqYXI8L2luY2x1ZGU+ICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICA8aW5jbHVkZT5vcmcuY29kZWhhdXMud29vZHN0b3g6d3N0eC1hc2w6amFyPC9pbmNsdWRlPg0KLSAgICAgICAgICAgICAgICA8aW5jbHVkZT5vcmcuYXBhY2hlLm5lZXRoaTpuZWV0aGk6amFyPC9pbmNsdWRlPg0KLSAgICAgICAgICAgICAgICA8aW5jbHVkZT5zdGF4OnN0YXgtYXBpOmphcjwvaW5jbHVkZT4gICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgIDxpbmNsdWRlPm9yZy5hcGFjaGUueG1sYmVhbnM6eG1sYmVhbnM6amFyPC9pbmNsdWRlPg0KLSAgICAgICAgICAgICAgICA8aW5jbHVkZT5vcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hOlhtbFNjaGVtYTpqYXI8L2luY2x1ZGU+DQotICAgICAgICAgICAgICAgIDxpbmNsdWRlPmxvZzRqOmxvZzRqOmphcjwvaW5jbHVkZT4NCi0gICAgICAgICAgICAgICAgPGluY2x1ZGU+b3JnLmFwYWNoZS53b2Rlbjp3b2RlbjpqYXI8L2luY2x1ZGU+ICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgIDxpbmNsdWRlPmNvbW1vbnMtbG9nZ2luZzpjb21tb25zLWxvZ2dpbmc6amFyPC9pbmNsdWRlPiAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICA8aW5jbHVkZT5vcmcuYXBhY2hlLmFudDphbnQ6amFyPC9pbmNsdWRlPg0KLQkJPGluY2x1ZGU+b3JnLmFwYWNoZS5heGlzMjpheGlzMi1jb2RlZ2VuOmphcjwvaW5jbHVkZT4NCi0JCTxpbmNsdWRlPm9yZy5hcGFjaGUuYXhpczI6YXhpczIta2VybmVsOmphcjwvaW5jbHVkZT4NCi0JCTxpbmNsdWRlPm9yZy5hcGFjaGUuYXhpczI6YXhpczItYWRiOmphcjwvaW5jbHVkZT4NCi0JCTxpbmNsdWRlPm9yZy5hcGFjaGUuYXhpczI6YXhpczItYWRiLWNvZGVnZW46amFyPC9pbmNsdWRlPg0KLQkJPGluY2x1ZGU+b3JnLmFwYWNoZS5heGlzMjpheGlzMi1qYXZhMndzZGw6amFyPC9pbmNsdWRlPg0KLQkJPGluY2x1ZGU+b3JnLmFwYWNoZS5nZXJvbmltby5zcGVjczpnZXJvbmltby1qYXZhbWFpbF8xLjRfc3BlYzpqYXI8L2luY2x1ZGU+DQotCQk8aW5jbHVkZT5vcmcuYXBhY2hlLmdlcm9uaW1vLnNwZWNzOmdlcm9uaW1vLWFjdGl2YXRpb25fMS4xX3NwZWM6amFyPC9pbmNsdWRlPg0KLQkJPGluY2x1ZGU+d3NkbDRqOndzZGw0ajpqYXI8L2luY2x1ZGU+DQotICAgICAgICAgICAgPC9pbmNsdWRlcz4NCi0gICAgICAgIDwvZGVwZW5kZW5jeVNldD4NCi0JPC9kZXBlbmRlbmN5U2V0cz4NCi08L2Fzc2VtYmx5Pg0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vcGx1Z2luL01FVEEtSU5GL01BTklGRVNULk1GIGIvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9wbHVnaW4vTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9wbHVnaW4vTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9wbHVnaW4vTUVUQS1JTkYvcGx1Z2luLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vcGx1Z2luL01FVEEtSU5GL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlZjAwZWIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9wbHVnaW4vTUVUQS1JTkYvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPCFET0NUWVBFIGlkZWEtcGx1Z2luIFBVQkxJQyAiUGx1Z2luL0RURCIgImh0dHA6Ly9wbHVnaW5zLmludGVsbGlqLm5ldC9wbHVnaW4uZHRkIj4KLTwhLS08aWRlYS1wbHVnaW4+LS0+Ci08aWRlYS1wbHVnaW4gdXJsPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvfmRlZXBhbCI+Ci0KLSAgICA8IS0tIFBsdWdpbiBuYW1lIC0tPgotICAgIDxuYW1lPkF4aXMyIElERUEgdG9vbHM8L25hbWU+Ci0KLSAgICA8IS0tIERlc2NyaXB0aW9uIC0tPgotICAgIDxkZXNjcmlwdGlvbj5TZXJ2aWNlIEFyY2hpdmUgY3JlYXRpb24gYW5kIENvZGVnZW5hcmF0aW9uPC9kZXNjcmlwdGlvbj4KLQotICAgIDwhLS0gUGx1Z2luIHZlcnNpb24gLS0+Ci0gICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgotCi0gICAgPCEtLSBQbHVnaW4ncyB2ZW5kb3IgLS0+Ci0gICAgPCEtLSAgPHZlbmRvciBsb2dvPSIvZ2VuZXJhbC9pakxvZ28ucG5nIj5JbnRlbGxpSjwvdmVuZG9yPi0tPgotICAgIDx2ZW5kb3IgZW1haWw9ImRlZXBhbEBhcGFjaGUub3JnIj5EZWVwYWwgSmF5YXNpbmdoZTwvdmVuZG9yPgotCi0gICAgPCEtLSB0aGUgSURFQSBidWlsZCBudW1iZXIgd2hpY2ggd29ya3Mgd2l0aCBwbHVnaW4gLS0+Ci0gICAgPGlkZWEtdmVyc2lvbiBzaW5jZS1idWlsZD0iMjAwMCIvPgotCi0gICAgPCEtLSBQbHVnaW4ncyBhcHBsaWNhdGlvbiBjb21wb25lbnRzIC0tPgotICAgIDxhcHBsaWNhdGlvbi1jb21wb25lbnRzPgotICAgICAgICA8Y29tcG9uZW50PgotICAgICAgICAgICAgPCEtLSBDb21wb25lbnQncyBpbXBsZW1lbnRhdGlvbiBjbGFzcyAtLT4KLSAgICAgICAgICAgIDxpbXBsZW1lbnRhdGlvbi1jbGFzcz5vcmcuYXBhY2hlLmlkZWFwbHVnaW4ucGx1Z2luLkF4aXMySWRlYVBsdWdpbgotICAgICAgICAgICAgPC9pbXBsZW1lbnRhdGlvbi1jbGFzcz4KLQotICAgICAgICAgICAgPCEtLSBDb21wb25lbnQncyBpbnRlcmZhY2UgY2xhc3MgLS0+Ci0gICAgICAgICAgICA8aW50ZXJmYWNlLWNsYXNzPm9yZy5hcGFjaGUuaWRlYXBsdWdpbi5wbHVnaW4uQXhpczJJZGVhUGx1Z2luPC9pbnRlcmZhY2UtY2xhc3M+Ci0gICAgICAgIDwvY29tcG9uZW50PgotICAgIDwvYXBwbGljYXRpb24tY29tcG9uZW50cz4KLSAgICA8IS0tIENvbXBvbmVudCdzIGFjdGlvbnMgLS0+Ci0gICAgPGFjdGlvbnM+Ci0gICAgICAgIDwhLS0gV2UgdXNlICJQbHVnaW5OYW1lLkNvbXBvbmVudE5hbWUuQWN0aW9uTmFtZSIgbm90YXRpb24gZm9yICJpZCIgdG8gYXZvaWQgY29uZmxpY3RzIC0tPgotICAgICAgICA8YWN0aW9uIGlkPSJBY3Rpb25zU2FtcGxlLkFjdGlvbnNQbHVnaW4uU2VydmljZUFyY2hpdmVDcmVhdG9yIgotICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmlkZWFwbHVnaW4ucGx1Z2luLkF4aXMyUGx1Z2luQWN0aW9uIgotICAgICAgICAgICAgICAgIHRleHQ9IkF4aXMyIHBsdWdpbnMiIGRlc2NyaXB0aW9uPSJTZXJ2aWNlIGNyZWF0aW9uIGFuZCBjb2RlZ2VuZXJhdGlvbiI+Ci0gICAgICAgICAgICA8a2V5Ym9hcmQtc2hvcnRjdXQgZmlyc3Qta2V5c3Ryb2tlPSJhbHQgVyIgc2Vjb25kLWtleXN0cm9rZT0iQyIga2V5bWFwPSIkZGVmYXVsdCIvPgotICAgICAgICAgICAgPG1vdXNlLXNob3J0Y3V0IGtleXN0cm9rZT0iY3RybCBhbHQgYnV0dG9uMiIga2V5bWFwPSIkZGVmYXVsdCIvPgotICAgICAgICA8L2FjdGlvbj4KLQotICAgICAgICA8IS0tICAgIDxncm91cCBpZD0iQWN0aW9ucy5BY3Rpb25zUGx1Z2luLlNhbXBsZUdyb3VwIiB0ZXh0PSJTX2FtcGxlIiBkZXNjcmlwdGlvbj0iU2FtcGxlIGdyb3VwIj4tLT4KLSAgICAgICAgPGdyb3VwIGlkPSJBY3Rpb25zLkFjdGlvbnNQbHVnaW4uU2FtcGxlR3JvdXAiIHRleHQ9IkF4aXMyIiBkZXNjcmlwdGlvbj0iQXhpczIgR3JvdXAiPgotICAgICAgICAgICAgPHJlZmVyZW5jZSBpZD0iQWN0aW9uc1NhbXBsZS5BY3Rpb25zUGx1Z2luLlNlcnZpY2VBcmNoaXZlQ3JlYXRvciIvPgotICAgICAgICAgICAgPHNlcGFyYXRvci8+Ci0gICAgICAgICAgICA8YWRkLXRvLWdyb3VwIGdyb3VwLWlkPSJNYWluTWVudSIgYW5jaG9yPSJsYXN0Ii8+Ci0gICAgICAgICAgICA8YWRkLXRvLWdyb3VwIGdyb3VwLWlkPSJNYWluVG9vbEJhciIgYW5jaG9yPSJiZWZvcmUiIHJlbGF0aXZlLXRvLWFjdGlvbj0iSGVscFRvcGljcyIvPgotICAgICAgICA8L2dyb3VwPgotCi0gICAgICAgIDwhLS10aGUgZ3JvdXAgYmVsb3cgY29udGFpbnMgb25seSB0aGUgIkhlbGxvIFdvcmxkIiBhY3Rpb24gZGVmaW5lZCBhYm92ZSAtLT4KLSAgICAgICAgPGdyb3VwPgotICAgICAgICAgICAgPHJlZmVyZW5jZSBpZD0iQWN0aW9uc1NhbXBsZS5BY3Rpb25zUGx1Z2luLlNlcnZpY2VBcmNoaXZlQ3JlYXRvciIvPgotICAgICAgICAgICAgPCEtLXRoZSBncm91cCBpcyBhZGRlZCB0byB0aGUgZWRpdG9yIHBvcHVwIG1lbnUtLT4KLSAgICAgICAgICAgIDxhZGQtdG8tZ3JvdXAgZ3JvdXAtaWQ9IkVkaXRvclBvcHVwTWVudSIgYW5jaG9yPSJhZnRlciIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpdmUtdG8tYWN0aW9uPSJDdXRDb3B5UGFzdGVHcm91cCIvPgotICAgICAgICA8L2dyb3VwPgotCi0gICAgPC9hY3Rpb25zPgotCi08L2lkZWEtcGx1Z2luPgotCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3BsdWdpbi9pY29ucy9hc2YtZmVhdGhlci5naWYgYi92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3BsdWdpbi9pY29ucy9hc2YtZmVhdGhlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzYTQxMzAuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9wbHVnaW4vaWNvbnMvYXNmLWZlYXRoZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9wbHVnaW4vaWNvbnMvYXNmLWZlYXRoZXIucG5nIGIvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9wbHVnaW4vaWNvbnMvYXNmLWZlYXRoZXIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDViMjJmLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vcGx1Z2luL2ljb25zL2FzZi1mZWF0aGVyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vcGx1Z2luL2ljb25zL2ljb24ucG5nIGIvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9wbHVnaW4vaWNvbnMvaWNvbi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4ZjVmMzMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9wbHVnaW4vaWNvbnMvaWNvbi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3BsdWdpbi9yZXNvdXJjZXMvc2VydmljZS54c2QgYi92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3BsdWdpbi9yZXNvdXJjZXMvc2VydmljZS54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2NTlmNjIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9wbHVnaW4vcmVzb3VyY2VzL3NlcnZpY2UueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHhzOnNjaGVtYSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIj4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJzZXJ2aWNlR3JvdXAiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0ic2VydmljZSIvPgotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJwYXJhbWV0ZXIiLz4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0ibW9kdWxlIi8+Ci0gICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJzZXJ2aWNlIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4czpjaG9pY2UgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9Im1vZHVsZSIvPgotICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9Im9wZXJhdGlvbiIvPgotICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InBhcmFtZXRlciIvPgotICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9ImRlc2NyaXB0aW9uIi8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0iZXhjbHVkZU9wZXJhdGlvbnMiLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJtZXNzYWdlUmVjZWl2ZXJzIi8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ic2NoZW1hIi8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0idHJhbnNwb3J0cyIvPgotICAgICAgICAgICAgICAgIDwveHM6Y2hvaWNlPgotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJkYXRhTG9jYXRvciIvPgotICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJzY29wZSIgdHlwZT0ieHM6TkNOYW1lIi8+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InRhcmdldE5hbWVzcGFjZSIgdHlwZT0ieHM6YW55VVJJIi8+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIDx4czplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4czpzdHJpbmciLz4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJleGNsdWRlT3BlcmF0aW9ucyI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9Im9wZXJhdGlvbiIvPgotICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ibWVzc2FnZVJlY2VpdmVycyI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJtZXNzYWdlUmVjZWl2ZXIiLz4KLSAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIDx4czplbGVtZW50IG5hbWU9InNjaGVtYSI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ic2NoZW1hTmFtZXNwYWNlIiB1c2U9InJlcXVpcmVkIiB0eXBlPSJ4czphbnlVUkkiLz4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0idHJhbnNwb3J0cyI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InRyYW5zcG9ydCIvPgotICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0idHJhbnNwb3J0IiB0eXBlPSJ4czpOQ05hbWUiLz4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJkYXRhTG9jYXRvciI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iZGlhbGVjdExvY2F0b3IiLz4KLSAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImNsYXNzIi8+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIDx4czplbGVtZW50IG5hbWU9ImRpYWxlY3RMb2NhdG9yIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdXNlPSJyZXF1aXJlZCIvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJkaWFsZWN0IiB1c2U9InJlcXVpcmVkIiB0eXBlPSJ4czphbnlVUkkiLz4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0icGFyYW1ldGVyIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlIG1peGVkPSJ0cnVlIj4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibG9ja2VkIiB0eXBlPSJ4czpOTVRPS0VOIi8+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzOk5DTmFtZSIvPgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJtb2R1bGUiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InJlZiIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHM6TkNOYW1lIi8+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIDx4czplbGVtZW50IG5hbWU9Im9wZXJhdGlvbiI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZSBtaXhlZD0idHJ1ZSI+Ci0gICAgICAgICAgICA8eHM6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ibWVzc2FnZVJlY2VpdmVyIi8+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJtb2R1bGUiLz4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InBhcmFtZXRlciIvPgotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0iYWN0aW9uTWFwcGluZyIvPgotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0iZmF1bHRBY3Rpb25NYXBwaW5nIi8+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJtZXNzYWdlIi8+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJvdXRwdXRBY3Rpb25NYXBwaW5nIi8+Ci0gICAgICAgICAgICA8L3hzOmNob2ljZT4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibWVwIiB0eXBlPSJ4czphbnlVUkkiLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6TkNOYW1lIi8+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InFuYW1lIiB0eXBlPSJ4czpOQ05hbWUiLz4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0iYWN0aW9uTWFwcGluZyIgdHlwZT0ieHM6YW55VVJJIi8+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0iZmF1bHRBY3Rpb25NYXBwaW5nIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czphbnlVUkkiPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImZhdWx0TmFtZSIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHM6TkNOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgICAgICAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIDx4czplbGVtZW50IG5hbWU9Im1lc3NhZ2UiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJwYXJhbWV0ZXIiLz4KLSAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImxhYmVsIiB1c2U9InJlcXVpcmVkIiB0eXBlPSJ4czpOQ05hbWUiLz4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ib3V0cHV0QWN0aW9uTWFwcGluZyIgdHlwZT0ieHM6YW55VVJJIi8+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ibWVzc2FnZVJlY2VpdmVyIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHM6TkNOYW1lIi8+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im1lcCIgdHlwZT0ieHM6YW55VVJJIi8+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotPC94czpzY2hlbWE+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3BvbS54bWwgYi92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwNWZkMjguLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTk2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjEuNS4xPC92ZXJzaW9uPgotICAgICAgICA8cmVsYXRpdmVQYXRoPi4uLy4uL3BhcmVudC9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+Ci0gICAgPC9wYXJlbnQ+Ci0gICAgPGFydGlmYWN0SWQ+YXhpczItaWRlYS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgPHBhY2thZ2luZz5tYXZlbi1wbHVnaW48L3BhY2thZ2luZz4KLSAgICA8bmFtZT5BcGFjaGUgQXhpczIgLSB0b29sIC0gSW50ZWxsaWogSURFQSBQbHVnaW48L25hbWU+Ci0gICAgPGRlc2NyaXB0aW9uPgotICAgICAgICBBIEludGVsbGlqIElERUEgcGx1Z2luIGZvciBTZXJ2aWNlIEFyY2hpdmUgY3JlYXRpb24gYW5kIENvZGUgR2VuZXJhdGlvbgotICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgPGRlcGVuZGVuY2llcz4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcGx1Z2luLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW48L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wcm9qZWN0PC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFyY2hpdmVyPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLnBsZXh1czwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnBsZXh1cy11dGlsczwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW48L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hcnRpZmFjdDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1jb2RlZ2VuPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHt2ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1rZXJuZWw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3ZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLWFkYjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7dmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItYWRiLWNvZGVnZW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3ZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLWphdmEyd3NkbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7dmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmdlcm9uaW1vLnNwZWNzPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+Z2Vyb25pbW8tamF2YW1haWxfMS40X3NwZWM8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmdlcm9uaW1vLnNwZWNzPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+Z2Vyb25pbW8tYWN0aXZhdGlvbl8xLjFfc3BlYzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmNvbS5pbnRlbGxpajwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm9wZW5hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5jb20uaW50ZWxsaWo8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5leHRlbnNpb25zPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+d3NkbDRqPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+d3NkbDRqPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5hbnQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5hbnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLnhtbGJlYW5zPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+eG1sYmVhbnM8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+WG1sU2NoZW1hPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS53b2RlbjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPndvZGVuLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUud29kZW48L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD53b2Rlbi1pbXBsLWRvbTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmxvZzRqPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bG9nNGo8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8L2RlcGVuZGVuY2llcz4KLQotICAgIDxidWlsZD4KLSAgICAgICAgPHNvdXJjZURpcmVjdG9yeT5zcmMvbWFpbi9qYXZhPC9zb3VyY2VEaXJlY3Rvcnk+Ci0gICAgICAgIDxyZXNvdXJjZXM+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5wbHVnaW48L2RpcmVjdG9yeT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT4uLi8uLi8uLjwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+Tk9USUNFLnR4dDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+TElDRU5TRS50eHQ8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgICAgICA8ZmlsdGVyaW5nPmZhbHNlPC9maWx0ZXJpbmc+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICA8L3Jlc291cmNlcz4KLQotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHNvdXJjZT4xLjU8L3NvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgPHRhcmdldD4xLjU8L3RhcmdldD4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphci1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxhcmNoaXZlPgotICAgICAgICAgICAgICAgICAgICAgICAgPG1hbmlmZXN0RmlsZT5wbHVnaW4vTUVUQS1JTkYvTUFOSUZFU1QuTUY8L21hbmlmZXN0RmlsZT4KLSAgICAgICAgICAgICAgICAgICAgPC9hcmNoaXZlPgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmRpc3RyaWJ1dGlvbi1wYWNrYWdlPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5hdHRhY2hlZDwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9yPiR7cG9tLmJhc2VkaXJ9L2lkZWEtcGx1Z2luLWFzZWVtYmx5LnhtbDwvZGVzY3JpcHRvcj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rlc2NyaXB0b3JzPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvYnVpbGQ+Ci0KLSAgICA8ZGlzdHJpYnV0aW9uTWFuYWdlbWVudD4KLSAgICAgICAgPHJlcG9zaXRvcnk+Ci0gICAgICAgICAgICA8aWQ+YXBhY2hlLXJlcG88L2lkPgotICAgICAgICAgICAgPG5hbWU+TWF2ZW4gQ2VudHJhbCBSZXBvc2l0b3J5PC9uYW1lPgotICAgICAgICAgICAgPHVybD5zY3BleGU6Ly9wZW9wbGUuYXBhY2hlLm9yZy8vd3d3L3Blb3BsZS5hcGFjaGUub3JnL3JlcG8vbTItaWJpYmxpby1yc3luYy1yZXBvc2l0b3J5PC91cmw+Ci0gICAgICAgIDwvcmVwb3NpdG9yeT4KLSAgICAgICAgPHNuYXBzaG90UmVwb3NpdG9yeT4KLSAgICAgICAgICAgIDxpZD5hcGFjaGUtc25hcHNob3RzPC9pZD4KLSAgICAgICAgICAgIDxuYW1lPkFwYWNoZSBEZXZlbG9wbWVudCBSZXBvc2l0b3J5PC9uYW1lPgotICAgICAgICAgICAgPHVybD5zY3BleGU6Ly9wZW9wbGUuYXBhY2hlLm9yZy8vd3d3L3Blb3BsZS5hcGFjaGUub3JnL3JlcG8vbTItc25hcHNob3QtcmVwb3NpdG9yeTwvdXJsPgotICAgICAgICA8L3NuYXBzaG90UmVwb3NpdG9yeT4KLSAgICA8L2Rpc3RyaWJ1dGlvbk1hbmFnZW1lbnQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29scy9iZWFuL0NsYXNzTG9hZGluZ1Rlc3RCZWFuLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29scy9iZWFuL0NsYXNzTG9hZGluZ1Rlc3RCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkZmQxMjIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbHMvYmVhbi9DbGFzc0xvYWRpbmdUZXN0QmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnRvb2xzLmJlYW47Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5VUkxDbGFzc0xvYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGNsYXNzIENsYXNzTG9hZGluZ1Rlc3RCZWFuIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiB0cnlMb2FkaW5nQ2xhc3MoU3RyaW5nIGNsYXNzTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIGNsYXNzUGF0aEVudHJpZXMsIExpc3QgZXJyb3JMaXN0ZW5lcikgewotCi0gICAgICAgIC8vbWFrZSBhIFVSTCBjbGFzcyBsb2FkZXIgZnJvbSB0aGUgZW50cmllcwotICAgICAgICBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcjsKLQotICAgICAgICBpZiAoY2xhc3NQYXRoRW50cmllcy5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICBVUkxbXSB1cmxzID0gbmV3IFVSTFtjbGFzc1BhdGhFbnRyaWVzLmxlbmd0aF07Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjbGFzc1BhdGhFbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBjbGFzc1BhdGhFbnRyeSA9IGNsYXNzUGF0aEVudHJpZXNbaV07Ci0gICAgICAgICAgICAgICAgICAgIC8vdGhpcyBzaG91bGQgYmUgYSBmaWxlKG9yIGEgVVJMKQotICAgICAgICAgICAgICAgICAgICBpZiAoY2xhc3NQYXRoRW50cnkuc3RhcnRzV2l0aCgiaHR0cDovLyIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1cmxzW2ldID0gbmV3IFVSTChjbGFzc1BhdGhFbnRyeSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1cmxzW2ldID0gbmV3IEZpbGUoY2xhc3NQYXRoRW50cnkpLnRvVVJMKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGlmIChlcnJvckxpc3RlbmVyIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgZXJyb3JMaXN0ZW5lci5hZGQoZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2xhc3NMb2FkZXIgPSBuZXcgVVJMQ2xhc3NMb2FkZXIodXJscyk7Ci0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNsYXNzTG9hZGVyID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vdHJ5IHRvIGxvYWQgdGhlIGNsYXNzIHdpdGggdGhlIGdpdmVuIG5hbWUKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgQ2xhc3MgY2xheno9Y2xhc3NMb2FkZXIubG9hZENsYXNzKGNsYXNzTmFtZSk7Ci0gICAgICAgICAgICBjbGF6ei5nZXRNZXRob2RzKCk7Ci0KLQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgewotICAgICAgICAgICAgaWYgKGVycm9yTGlzdGVuZXIhPW51bGwpewotICAgICAgICAgICAgICAgIGVycm9yTGlzdGVuZXIuYWRkKHQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbHMvYmVhbi9Db2RlZ2VuQmVhbi5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbHMvYmVhbi9Db2RlZ2VuQmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmYwYTI5Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2xzL2JlYW4vQ29kZWdlbkJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudG9vbHMuYmVhbjsKLQotaW1wb3J0IGNvbS5pbnRlbGxpai5vcGVuYXBpLm1vZHVsZS5Nb2R1bGU7Ci1pbXBvcnQgY29tLmludGVsbGlqLm9wZW5hcGkubW9kdWxlLk1vZHVsZU1hbmFnZXI7Ci1pbXBvcnQgY29tLmludGVsbGlqLm9wZW5hcGkucHJvamVjdC5Qcm9qZWN0OwotaW1wb3J0IGNvbS5pbnRlbGxpai5vcGVuYXBpLnJvb3RzLk1vZHVsZVJvb3RNYW5hZ2VyOwotaW1wb3J0IGNvbS5pbnRlbGxpai5vcGVuYXBpLnZmcy5WaXJ0dWFsRmlsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uV1NETDExVG9BeGlzU2VydmljZUJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLkNvbW1hbmRMaW5lT3B0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5Db21tYW5kTGluZU9wdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuVVJMUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLkNvZGVHZW5Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLkNvZGVHZW5lcmF0aW9uRW5naW5lOwotCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuUG9ydDsKLWltcG9ydCBqYXZheC53c2RsLlNlcnZpY2U7Ci1pbXBvcnQgamF2YXgud3NkbC5XU0RMRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuZmFjdG9yeS5XU0RMRmFjdG9yeTsKLWltcG9ydCBqYXZheC53c2RsLnhtbC5XU0RMUmVhZGVyOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotcHVibGljIGNsYXNzIENvZGVnZW5CZWFuIHsKLQotICAgIHByaXZhdGUgU3RyaW5nIFdTRExGaWxlTmFtZSA9bnVsbCA7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgb3V0cHV0ID0gIi4iOwotICAgIHByaXZhdGUgU3RyaW5nIHBhY2thZ2VOYW1lID0gVVJMUHJvY2Vzc29yLkRFRkFVTFRfUEFDS0FHRTsKLSAgICBwcml2YXRlIFN0cmluZyBsYW5ndWFnZSA9ICJqYXZhIjsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBhc3luY09ubHkgPSBmYWxzZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gc3luY09ubHkgPSBmYWxzZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gc2VydmVyU2lkZSA9IGZhbHNlOwotICAgIHByaXZhdGUgYm9vbGVhbiB0ZXN0Y2FzZSA9IHRydWU7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGlzU2VydmVyWE1MOwotICAgIHByaXZhdGUgYm9vbGVhbiBpc0dlbmVyYXRlQWxsOwotICAgIHByaXZhdGUgYm9vbGVhbiBpc1Rlc3RDYXNlOwotICAgIHByaXZhdGUgU3RyaW5nIHNlcnZpY2VOYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIHBvcnROYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIGRhdGFiaW5kaW5nTmFtZTsKLQotICAgIHByaXZhdGUgU3RyaW5nIG5hbWVzcGFjZTJwYWNrYWdlTGlzdDsKLQotICAgIHByaXZhdGUgRGVmaW5pdGlvbiB3c2RsRGVmaW5pdGlvbiA9IG51bGw7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gZGVmYXVsdENsaWVudCA9IHRydWU7Ci0KLSAgICBwcml2YXRlIFByb2plY3QgcHJvamVjdDsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1NlcnZlclNpZGVJbnRlcmZhY2UgPSB0cnVlOwotCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZXNwYWNlMnBhY2thZ2VMaXN0KFN0cmluZyBuYW1lc3BhY2UycGFja2FnZUxpc3QpIHsKLSAgICAgICAgdGhpcy5uYW1lc3BhY2UycGFja2FnZUxpc3QgPSBuYW1lc3BhY2UycGFja2FnZUxpc3Q7Ci0gICAgfQotCi0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzU2VydmVyU2lkZUludGVyZmFjZSgpIHsKLSAgICAgICAgcmV0dXJuIGlzU2VydmVyU2lkZUludGVyZmFjZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTZXJ2ZXJTaWRlSW50ZXJmYWNlKGJvb2xlYW4gc2VydmVyU2lkZUludGVyZmFjZSkgewotICAgICAgICBpc1NlcnZlclNpZGVJbnRlcmZhY2UgPSBzZXJ2ZXJTaWRlSW50ZXJmYWNlOwotICAgIH0KLQotCi0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRGVmYXVsdENsaWVudCgpIHsKLSAgICAgICAgcmV0dXJuIGRlZmF1bHRDbGllbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdENsaWVudChib29sZWFuIGRlZmF1bHRDbGllbnQpIHsKLSAgICAgICAgdGhpcy5kZWZhdWx0Q2xpZW50ID0gZGVmYXVsdENsaWVudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1NlcnZlclhNTCgpIHsKLSAgICAgICAgcmV0dXJuIGlzU2VydmVyWE1MOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFNlcnZlclhNTChib29sZWFuIHNlcnZlclhNTCkgewotICAgICAgICBpc1NlcnZlclhNTCA9IHNlcnZlclhNTDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0dlbmVyYXRlQWxsKCkgewotICAgICAgICByZXR1cm4gaXNHZW5lcmF0ZUFsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZUFsbChib29sZWFuIGdlbmVyYXRlQWxsKSB7Ci0gICAgICAgIGlzR2VuZXJhdGVBbGwgPSBnZW5lcmF0ZUFsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Rlc3RDYXNlKCkgewotICAgICAgICByZXR1cm4gaXNUZXN0Q2FzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRUZXN0Q2FzZShib29sZWFuIHRlc3RDYXNlKSB7Ci0gICAgICAgIGlzVGVzdENhc2UgPSB0ZXN0Q2FzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNlcnZpY2VOYW1lKCkgewotICAgICAgICByZXR1cm4gc2VydmljZU5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2VydmljZU5hbWUoU3RyaW5nIHNlcnZpY2VOYW1lKSB7Ci0gICAgICAgIHRoaXMuc2VydmljZU5hbWUgPSBzZXJ2aWNlTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBvcnROYW1lKCkgewotICAgICAgICByZXR1cm4gcG9ydE5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UG9ydE5hbWUoU3RyaW5nIHBvcnROYW1lKSB7Ci0gICAgICAgIHRoaXMucG9ydE5hbWUgPSBwb3J0TmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldERhdGFiaW5kaW5nTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGRhdGFiaW5kaW5nTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREYXRhYmluZGluZ05hbWUoU3RyaW5nIGRhdGFiaW5kaW5nTmFtZSkgewotICAgICAgICB0aGlzLmRhdGFiaW5kaW5nTmFtZSA9IGRhdGFiaW5kaW5nTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNYXBzIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG5hbWUgb2YgYSBsYW5ndWFnZSB0byBhIGNvbnN0YW50IGRlZmluZWQgaW4gQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuTGFuZ3VhZ2VOYW1lcwotICAgICAqCi0gICAgICogQHBhcmFtIFVJTGFuZ1ZhbHVlIGEgc3RyaW5nIGNvbnRhaW5nIGEgbGFuZ3VhZ2UsIGUuZy4gImphdmEiLCAiY3MiLCAiY3BwIiBvciAidmIiCi0gICAgICogQHJldHVybiBhIG5vcm1hbGl6ZWQgc3RyaW5nIGNvbnN0YW50Ci0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgbWFwTGFuZ3VhZ2VzV2l0aENvbWJvKFN0cmluZyBVSUxhbmdWYWx1ZSkgewotICAgICAgICByZXR1cm4gVUlMYW5nVmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIGxpc3Qgb2YgcGFyYW1ldGVycyBmb3IgdGhlIGNvZGUgZ2VuZXJhdG9yIGJhc2VkIG9uIHRoZSBkZWNpc2lvbnMgbWFkZSBieSB0aGUgdXNlciBvbiB0aGUgT3B0aW9uc1BhZ2UKLSAgICAgKiAocGFnZTIpLiBGb3IgZWFjaCBzZXR0aW5nLCB0aGVyZSBpcyBhIENvbW1hbmQtTGluZSBvcHRpb24gZm9yIHRoZSBBeGlzMiBjb2RlIGdlbmVyYXRvci4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYSBNYXAgd2l0aCBrZXlzIGZyb20gQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMgd2l0aCB0aGUgdmFsdWVzIGVudGVyZWQgYnkgdGhlIHVzZXIgb24gdGhlIE9wdGlvbnMgUGFnZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWFwIGZpbGxPcHRpb25NYXAoKSB7Ci0gICAgICAgIE1hcCBvcHRpb25NYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICAvL1dTREwgZmlsZSBuYW1lCi0gICAgICAgIG9wdGlvbk1hcC5wdXQoQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLldTRExfTE9DQVRJT05fVVJJX09QVElPTiwgbmV3IENvbW1hbmRMaW5lT3B0aW9uKAotICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5XU0RMX0xPQ0FUSU9OX1VSSV9PUFRJT04sIGdldFN0cmluZ0FycmF5KFdTRExGaWxlTmFtZSkpKTsKLQotICAgICAgICAvL0FzeW5jIG9ubHkKLSAgICAgICAgaWYgKGFzeW5jT25seSkgewotICAgICAgICAgICAgb3B0aW9uTWFwLnB1dChDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuQ09ERUdFTl9BU1lOQ19PTkxZX09QVElPTiwgbmV3IENvbW1hbmRMaW5lT3B0aW9uKAotICAgICAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuQ09ERUdFTl9BU1lOQ19PTkxZX09QVElPTiwgbmV3IFN0cmluZ1swXSkpOwotICAgICAgICB9Ci0gICAgICAgIC8vc3luYyBvbmx5Ci0gICAgICAgIGlmIChzeW5jT25seSkgewotICAgICAgICAgICAgb3B0aW9uTWFwLnB1dChDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuQ09ERUdFTl9TWU5DX09OTFlfT1BUSU9OLCBuZXcgQ29tbWFuZExpbmVPcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5DT0RFR0VOX1NZTkNfT05MWV9PUFRJT04sIG5ldyBTdHJpbmdbMF0pKTsKLSAgICAgICAgfQotICAgICAgICAvL3NlcnZlcnNpZGUKLSAgICAgICAgaWYgKHNlcnZlclNpZGUpIHsKLSAgICAgICAgICAgIG9wdGlvbk1hcC5wdXQoQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLlNFUlZFUl9TSURFX0NPREVfT1BUSU9OLCBuZXcgQ29tbWFuZExpbmVPcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5TRVJWRVJfU0lERV9DT0RFX09QVElPTiwgbmV3IFN0cmluZ1swXSkpOwotICAgICAgICAgICAgLy9zZXJ2ZXIgeG1sCi0gICAgICAgICAgICBpZiAoaXNTZXJ2ZXJYTUwpIHsKLSAgICAgICAgICAgICAgICBvcHRpb25NYXAucHV0KENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5HRU5FUkFURV9TRVJWSUNFX0RFU0NSSVBUSU9OX09QVElPTiwgbmV3IENvbW1hbmRMaW5lT3B0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLkdFTkVSQVRFX1NFUlZJQ0VfREVTQ1JJUFRJT05fT1BUSU9OLCBuZXcgU3RyaW5nWzBdKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoaXNHZW5lcmF0ZUFsbCkgewotICAgICAgICAgICAgICAgIG9wdGlvbk1hcC5wdXQoQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLkdFTkVSQVRFX0FMTF9PUFRJT04sIG5ldyBDb21tYW5kTGluZU9wdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5HRU5FUkFURV9BTExfT1BUSU9OLCBuZXcgU3RyaW5nWzBdKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoaXNTZXJ2ZXJTaWRlSW50ZXJmYWNlICkgewotICAgICAgICAgICAgICAgIG9wdGlvbk1hcC5wdXQoQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLlNFUlZFUl9TSURFX0lOVEVSRkFDRV9PUFRJT04sIG5ldyBDb21tYW5kTGluZU9wdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5TRVJWRVJfU0lERV9JTlRFUkZBQ0VfT1BUSU9OLCBuZXcgU3RyaW5nWzBdKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy90ZXN0IGNhc2UKLSAgICAgICAgaWYgKGlzVGVzdENhc2UpIHsKLSAgICAgICAgICAgIG9wdGlvbk1hcC5wdXQoQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLkdFTkVSQVRFX1RFU1RfQ0FTRV9PUFRJT04sIG5ldyBDb21tYW5kTGluZU9wdGlvbigKLSAgICAgICAgICAgICAgICAgICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLkdFTkVSQVRFX1RFU1RfQ0FTRV9PUFRJT04sIG5ldyBTdHJpbmdbMF0pKTsKLSAgICAgICAgfQotICAgICAgICAvL3BhY2thZ2UgbmFtZQotICAgICAgICBvcHRpb25NYXAucHV0KENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5QQUNLQUdFX09QVElPTiwgbmV3IENvbW1hbmRMaW5lT3B0aW9uKAotICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5QQUNLQUdFX09QVElPTiwgZ2V0U3RyaW5nQXJyYXkocGFja2FnZU5hbWUpKSk7Ci0gICAgICAgIC8vc2VsZWN0ZWQgbGFuZ3VhZ2UKLSAgICAgICAgb3B0aW9uTWFwLnB1dChDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuU1RVQl9MQU5HVUFHRV9PUFRJT04sIG5ldyBDb21tYW5kTGluZU9wdGlvbigKLSAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuU1RVQl9MQU5HVUFHRV9PUFRJT04sIGdldFN0cmluZ0FycmF5KG1hcExhbmd1YWdlc1dpdGhDb21ibyhsYW5ndWFnZSkpKSk7Ci0gICAgICAgIC8vb3V0cHV0IGxvY2F0aW9uCi0gICAgICAgIG9wdGlvbk1hcC5wdXQoQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLk9VVFBVVF9MT0NBVElPTl9PUFRJT04sIG5ldyBDb21tYW5kTGluZU9wdGlvbigKLSAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuT1VUUFVUX0xPQ0FUSU9OX09QVElPTiwgZ2V0U3RyaW5nQXJyYXkob3V0cHV0KSkpOwotCi0gICAgICAgIC8vZGF0YWJpbmRpbmcKLSAgICAgICAgb3B0aW9uTWFwLnB1dChDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuREFUQV9CSU5ESU5HX1RZUEVfT1BUSU9OLCBuZXcgQ29tbWFuZExpbmVPcHRpb24oCi0gICAgICAgICAgICAgICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLkRBVEFfQklORElOR19UWVBFX09QVElPTiwgZ2V0U3RyaW5nQXJyYXkoZGF0YWJpbmRpbmdOYW1lKSkpOwotCi0gICAgICAgIC8vcG9ydCBuYW1lCi0gICAgICAgIGlmIChwb3J0TmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBvcHRpb25NYXAucHV0KENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5QT1JUX05BTUVfT1BUSU9OLCBuZXcgQ29tbWFuZExpbmVPcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5QT1JUX05BTUVfT1BUSU9OLCBnZXRTdHJpbmdBcnJheShwb3J0TmFtZSkpKTsKLSAgICAgICAgfQotICAgICAgICAvL3NlcnZpY2UgbmFtZQotICAgICAgICBpZiAoc2VydmljZU5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgb3B0aW9uTWFwLnB1dChDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuU0VSVklDRV9OQU1FX09QVElPTiwgbmV3IENvbW1hbmRMaW5lT3B0aW9uKAotICAgICAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuU0VSVklDRV9OQU1FX09QVElPTiwgZ2V0U3RyaW5nQXJyYXkoc2VydmljZU5hbWUpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgLy9zZXJ2ZXIgc2lkZSBpbnRlcmZhY2UgIG1hcHBpbmcKLSAgICAgICAgaWYgKGlzU2VydmVyU2lkZUludGVyZmFjZSl7Ci0gICAgICAgICAgICBvcHRpb25NYXAucHV0KENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5TRVJWRVJfU0lERV9JTlRFUkZBQ0VfT1BUSU9OLCBuZXcgQ29tbWFuZExpbmVPcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5TRVJWRVJfU0lERV9JTlRFUkZBQ0VfT1BUSU9OLCBuZXcgU3RyaW5nWzBdKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvL25zMnBrZyBtYXBwaW5nCi0gICAgICAgIGlmIChuYW1lc3BhY2UycGFja2FnZUxpc3QhPSBudWxsKXsKLSAgICAgICAgICAgIG9wdGlvbk1hcC5wdXQoQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLk5BTUVfU1BBQ0VfVE9fUEFDS0FHRV9PUFRJT04sIG5ldyBDb21tYW5kTGluZU9wdGlvbigKLSAgICAgICAgICAgICAgICAgICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLk5BTUVfU1BBQ0VfVE9fUEFDS0FHRV9PUFRJT04sIGdldFN0cmluZ0FycmF5KG5hbWVzcGFjZTJwYWNrYWdlTGlzdCkpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gb3B0aW9uTWFwOwotCi0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRCYXNlVXJpKFN0cmluZyB3c2RsVVJJKSB7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFVSTCB1cmw7Ci0gICAgICAgICAgICBpZiAod3NkbFVSSS5pbmRleE9mKCI6Ly8iKSA9PSAtMSkgewotICAgICAgICAgICAgICAgIHVybCA9IG5ldyBVUkwoImZpbGUiLCAiIiwgd3NkbFVSSSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHVybCA9IG5ldyBVUkwod3NkbFVSSSk7Ci0gICAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAgU3RyaW5nIGJhc2VVcmk7Ci0gICAgICAgICAgICBpZiAoImZpbGUiLmVxdWFscyh1cmwuZ2V0UHJvdG9jb2woKSkpIHsKLSAgICAgICAgICAgICAgICBiYXNlVXJpID0gbmV3IEZpbGUodXJsLmdldEZpbGUoKSkuZ2V0UGFyZW50RmlsZSgpLnRvVVJMKCkudG9FeHRlcm5hbEZvcm0oKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYmFzZVVyaSA9IHVybC50b0V4dGVybmFsRm9ybSgpLnN1YnN0cmluZygwLAotICAgICAgICAgICAgICAgICAgICAgICAgdXJsLnRvRXh0ZXJuYWxGb3JtKCkubGFzdEluZGV4T2YoIi8iKQotICAgICAgICAgICAgICAgICk7Ci0gICAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAgcmV0dXJuIGJhc2VVcmk7Ci0gICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlYWRzIHRoZSBXU0RMIE9iamVjdCBNb2RlbCBmcm9tIHRoZSBnaXZlbiBsb2NhdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSB3c2RsVVJJIHRoZSBmaWxlc3lzdGVtIGxvY2F0aW9uIChmdWxsIHBhdGgpIG9mIHRoZSBXU0RMIGZpbGUgdG8gcmVhZCBpbi4KLSAgICAgKiBAcmV0dXJuIHRoZSBXU0RMRGVzY3JpcHRpb24gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIFdTREwgT2JqZWN0IE1vZGVsIG9mIHRoZSBnaXZlbiBXU0RMIGZpbGUKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIG9uIGVycm9ycyByZWFkaW5nIHRoZSBXU0RMIGZpbGUKLSAgICAgKi8KLSAgICBwdWJsaWMgQXhpc1NlcnZpY2UgZ2V0QXhpc1NlcnZpY2UoU3RyaW5nIHdzZGxVUkkpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIFVSTCB1cmw7Ci0gICAgICAgIGlmICh3c2RsVVJJLmluZGV4T2YoIjovLyIpID09IC0xKSB7Ci0gICAgICAgICAgICB1cmwgPSBuZXcgVVJMKCJmaWxlIiwgIiIsIHdzZGxVUkkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdXJsID0gbmV3IFVSTCh3c2RsVVJJKTsKLSAgICAgICAgfQotCi0KLSAgICAgICAgV1NETDExVG9BeGlzU2VydmljZUJ1aWxkZXIgYnVpbGRlciA9Ci0gICAgICAgICAgICAgICAgbmV3IFdTREwxMVRvQXhpc1NlcnZpY2VCdWlsZGVyKHVybC5vcGVuQ29ubmVjdGlvbigpLmdldElucHV0U3RyZWFtKCkpOwotCi0gICAgICAgIGJ1aWxkZXIuc2V0RG9jdW1lbnRCYXNlVXJpKHVybC50b1N0cmluZygpKTsKLSAgICAgICAgYnVpbGRlci5zZXRCYXNlVXJpKGdldEJhc2VVcmkod3NkbFVSSSkpOwotICAgICAgICBidWlsZGVyLnNldENvZGVnZW4odHJ1ZSk7Ci0gICAgICAgIHJldHVybiBidWlsZGVyLnBvcHVsYXRlU2VydmljZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIGEgc2luZ2xlIFN0cmluZyBpbnRvIGEgU3RyaW5nIEFycmF5Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgYSBzaW5nbGUgc3RyaW5nCi0gICAgICogQHJldHVybiBhbiBhcnJheSBjb250YWluaW5nIG9ubHkgb25lIGVsZW1lbnQKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZ1tdIGdldFN0cmluZ0FycmF5KFN0cmluZyB2YWx1ZSkgewotICAgICAgICBTdHJpbmdbXSB2YWx1ZXMgPSBuZXcgU3RyaW5nWzFdOwotICAgICAgICB2YWx1ZXNbMF0gPSB2YWx1ZTsKLSAgICAgICAgcmV0dXJuIHZhbHVlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFdTRExGaWxlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIFdTRExGaWxlTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRXU0RMRmlsZU5hbWUoU3RyaW5nIFdTRExGaWxlTmFtZSkgewotICAgICAgICB0aGlzLldTRExGaWxlTmFtZSA9IFdTRExGaWxlTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1N5bmNPbmx5KCkgewotICAgICAgICByZXR1cm4gc3luY09ubHk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U3luY09ubHkoYm9vbGVhbiBzeW5jT25seSkgewotICAgICAgICB0aGlzLnN5bmNPbmx5ID0gc3luY09ubHk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNBc3luY09ubHkoKSB7Ci0gICAgICAgIHJldHVybiBhc3luY09ubHk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QXN5bmNPbmx5KGJvb2xlYW4gYXN5bmNPbmx5KSB7Ci0gICAgICAgIHRoaXMuYXN5bmNPbmx5ID0gYXN5bmNPbmx5OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGFuZ3VhZ2UoKSB7Ci0gICAgICAgIHJldHVybiBsYW5ndWFnZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRMYW5ndWFnZShTdHJpbmcgbGFuZ3VhZ2UpIHsKLSAgICAgICAgdGhpcy5sYW5ndWFnZSA9IGxhbmd1YWdlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBwYWNrYWdlTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYWNrYWdlTmFtZShTdHJpbmcgcGFja2FnZU5hbWUpIHsKLSAgICAgICAgdGhpcy5wYWNrYWdlTmFtZSA9IHBhY2thZ2VOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0T3V0cHV0KCkgewotICAgICAgICByZXR1cm4gb3V0cHV0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE91dHB1dChTdHJpbmcgb3V0cHV0KSB7Ci0gICAgICAgIHRoaXMub3V0cHV0ID0gb3V0cHV0OwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzU2VydmVyU2lkZSgpIHsKLSAgICAgICAgcmV0dXJuIHNlcnZlclNpZGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2VydmVyU2lkZShib29sZWFuIHNlcnZlclNpZGUpIHsKLSAgICAgICAgdGhpcy5zZXJ2ZXJTaWRlID0gc2VydmVyU2lkZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Rlc3RjYXNlKCkgewotICAgICAgICByZXR1cm4gdGVzdGNhc2U7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VGVzdGNhc2UoYm9vbGVhbiB0ZXN0Y2FzZSkgewotICAgICAgICB0aGlzLnRlc3RjYXNlID0gdGVzdGNhc2U7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZ2VuZXJhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCi0gICAgICAgIENsYXNzTG9hZGVyIHRjbCA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoISJ4bWxiZWFucyIuZXF1YWxzKGdldERhdGFiaW5kaW5nTmFtZSgpKSkgewotICAgICAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyKENsYXNzLmNsYXNzLmdldENsYXNzTG9hZGVyKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQ29kZUdlbkNvbmZpZ3VyYXRpb24gY29kZWdlbkNvbmZpZyA9IG5ldyBDb2RlR2VuQ29uZmlndXJhdGlvbihmaWxsT3B0aW9uTWFwKCkpOwotICAgICAgICAgICAgY29kZWdlbkNvbmZpZy5hZGRBeGlzU2VydmljZShnZXRBeGlzU2VydmljZShXU0RMRmlsZU5hbWUpKTsKLSAgICAgICAgICAgIGNvZGVnZW5Db25maWcuc2V0V3NkbERlZmluaXRpb24od3NkbERlZmluaXRpb24pOwotICAgICAgICAgICAgLy9zZXQgdGhlIGJhc2VVUkkKLSAgICAgICAgICAgIGNvZGVnZW5Db25maWcuc2V0QmFzZVVSSShnZXRCYXNlVXJpKFdTRExGaWxlTmFtZSkpOwotICAgICAgICAgICAgbmV3IENvZGVHZW5lcmF0aW9uRW5naW5lKGNvZGVnZW5Db25maWcpLmdlbmVyYXRlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIENvZGVHZW5Db25maWd1cmF0aW9uIGNvZGVnZW5Db25maWcgPSBuZXcgQ29kZUdlbkNvbmZpZ3VyYXRpb24oZmlsbE9wdGlvbk1hcCgpKTsKLSAgICAgICAgICAgICAgICBjb2RlZ2VuQ29uZmlnLmFkZEF4aXNTZXJ2aWNlKGdldEF4aXNTZXJ2aWNlKFdTRExGaWxlTmFtZSkpOwotICAgICAgICAgICAgICAgIGNvZGVnZW5Db25maWcuc2V0V3NkbERlZmluaXRpb24od3NkbERlZmluaXRpb24pOwotICAgICAgICAgICAgICAgIC8vc2V0IHRoZSBiYXNlVVJJCi0gICAgICAgICAgICAgICAgY29kZWdlbkNvbmZpZy5zZXRCYXNlVVJJKGdldEJhc2VVcmkoV1NETEZpbGVOYW1lKSk7Ci0gICAgICAgICAgICAgICAgbmV3IENvZGVHZW5lcmF0aW9uRW5naW5lKGNvZGVnZW5Db25maWcpLmdlbmVyYXRlKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZTEpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJDb2RlIGdlbmVyYXRpb24gZmFpbGVkIGR1ZSB0byAiICsgZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKCEieG1sYmVhbnMiLmVxdWFscyhnZXREYXRhYmluZGluZ05hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcih0Y2wpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICB9Ci0KLQotCi0gICAgcHVibGljIHZvaWQgcmVhZFdTREwoKSB0aHJvd3MgV1NETEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgV1NETFJlYWRlciByZWFkZXIgPSBXU0RMRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1dTRExSZWFkZXIoKTsKLSAgICAgICAgd3NkbERlZmluaXRpb24gPSByZWFkZXIucmVhZFdTREwoV1NETEZpbGVOYW1lKSA7Ci0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICB3c2RsRGVmaW5pdGlvbi5zZXREb2N1bWVudEJhc2VVUkkoV1NETEZpbGVOYW1lKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgLy9nZXQgdGhlIGRlZmF1bHQgcGFja2FnZSBkZXJpdmVkIGJ5IHRoZSB0YXJnZXROYW1lc3BhY2UKLQotICAgIHB1YmxpYyBTdHJpbmcgcGFja2FnZUZyb21UYXJnZXROYW1lc3BhY2UoKSB7Ci0gICAgICAgIHJldHVybiBVUkxQcm9jZXNzb3IubWFrZVBhY2thZ2VOYW1lKHdzZGxEZWZpbml0aW9uLmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBsaXN0IG9mIHNlcnZpY2UgbmFtZXMKLSAgICAgKiB0aGUgbmFtZXMgYXJlIFFOYW1lcwotICAgICAqLwotICAgIHB1YmxpYyBMaXN0IGdldFNlcnZpY2VMaXN0KCkgewotICAgICAgICBMaXN0IHJldHVybkxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IG51bGw7Ci0gICAgICAgIE1hcCBzZXJ2aWNlTWFwID0gd3NkbERlZmluaXRpb24uZ2V0U2VydmljZXMoKTsKLSAgICAgICAgaWYgKHNlcnZpY2VNYXAgIT0gbnVsbCAmJiAhc2VydmljZU1hcC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIEl0ZXJhdG9yIHNlcnZpY2VJdGVyYXRvciA9IHNlcnZpY2VNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIHdoaWxlIChzZXJ2aWNlSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgc2VydmljZSA9IChTZXJ2aWNlKSBzZXJ2aWNlSXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgIHJldHVybkxpc3QuYWRkKHNlcnZpY2UuZ2V0UU5hbWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmV0dXJuTGlzdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBwb3J0cyBmb3IgYSBwYXJ0aWN1bGFyIHNlcnZpY2UKLSAgICAgKiB0aGUgbmFtZXMgYXJlIFFOYW1lcwotICAgICAqLwotICAgIHB1YmxpYyBMaXN0IGdldFBvcnROYW1lTGlzdChRTmFtZSBzZXJ2aWNlTmFtZSkgewotICAgICAgICBMaXN0IHJldHVybkxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IHdzZGxEZWZpbml0aW9uLmdldFNlcnZpY2Uoc2VydmljZU5hbWUpOwotICAgICAgICBQb3J0IHBvcnQgPSBudWxsOwotICAgICAgICBpZiAoc2VydmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBNYXAgcG9ydE1hcCA9IHNlcnZpY2UuZ2V0UG9ydHMoKTsKLSAgICAgICAgICAgIGlmIChwb3J0TWFwICE9IG51bGwgJiYgIXBvcnRNYXAuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgSXRlcmF0b3IgcG9ydEl0ZXJhdG9yID0gcG9ydE1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgIHdoaWxlIChwb3J0SXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBvcnQgPSAoUG9ydCkgcG9ydEl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuTGlzdC5hZGQocG9ydC5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJldHVybkxpc3Q7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgUHJvamVjdCBnZXRBY3RpdmVQcm9qZWN0KCkgewotICAgICAgICByZXR1cm4gcHJvamVjdDsKLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFByb2plY3QoUHJvamVjdCBwcm9qZWN0KSB7Ci0gICAgICAgIHRoaXMucHJvamVjdCA9IHByb2plY3Q7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgRmlsZSBnZXRUZW1wKCkgewotCi0gICAgICAgIFN0cmluZyB0aW1lID0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKS5nZXRUaW1lKCkudG9TdHJpbmcoKS5yZXBsYWNlKCc6JywgJy0nKTsKLSAgICAgICAgcmV0dXJuIG5ldyBGaWxlKCBnZXRPdXRwdXQoKSArIEZpbGUuc2VwYXJhdG9yICsgInRlbXAtIiArIHRpbWUpOwotCi0gICAgfQotCi0gICAgcHVibGljIE1vZHVsZVtdIGdldE1vZHVsZXMoKSB7Ci0KLSAgICAgICAgUHJvamVjdCBwcm9qZWN0ID0gZ2V0QWN0aXZlUHJvamVjdCgpOwotICAgICAgICBpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gTW9kdWxlTWFuYWdlci5nZXRJbnN0YW5jZShwcm9qZWN0KS5nZXRNb2R1bGVzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZ1tdIGdldE1vZHVsZVNyYyhTdHJpbmcgbmFtZSkgewotICAgICAgICBQcm9qZWN0IHByb2plY3QgPSBnZXRBY3RpdmVQcm9qZWN0KCk7Ci0gICAgICAgIGlmIChwcm9qZWN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIE1vZHVsZSBtb2R1bGUgPSBNb2R1bGVNYW5hZ2VyLmdldEluc3RhbmNlKHByb2plY3QpLmZpbmRNb2R1bGVCeU5hbWUobmFtZSk7Ci0gICAgICAgICAgICBNb2R1bGVSb290TWFuYWdlciBtb2R1bGVSb290TWFuYWdlciA9IE1vZHVsZVJvb3RNYW5hZ2VyLmdldEluc3RhbmNlKG1vZHVsZSk7Ci0gICAgICAgICAgICBWaXJ0dWFsRmlsZSB2aXJ0dWFsRmlsZXNbXSA9IG1vZHVsZVJvb3RNYW5hZ2VyLmdldFNvdXJjZVJvb3RzKCk7Ci0gICAgICAgICAgICBTdHJpbmcgc3JjW10gPSBuZXcgU3RyaW5nW3ZpcnR1YWxGaWxlcy5sZW5ndGhdOwotICAgICAgICAgICAgZm9yIChpbnQgY291bnQgPSAwOyBjb3VudCA8IHNyYy5sZW5ndGg7IGNvdW50KyspIHsKLSAgICAgICAgICAgICAgICBzcmNbY291bnRdID0gdmlydHVhbEZpbGVzW2NvdW50XS5nZXRQcmVzZW50YWJsZVVybCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHNyYzsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKgotCSAqIFJldHVybnMgdGhlIG5hbWVzcGFjZSBtYXAgZnJvbSBkZWZpbml0aW9uCi0JICogQHJldHVybgotCSAqLwotICAgIHB1YmxpYyBDb2xsZWN0aW9uIGdldERlZmluaXRpb25OYW1lc3BhY2VNYXAoKXsKLQotICAgICAgICBNYXAgbmFtZXNwYWNlcyA9IHdzZGxEZWZpbml0aW9uLmdldE5hbWVzcGFjZXMoKTsKLSAgICAgICAgcmV0dXJuIG5hbWVzcGFjZXMudmFsdWVzKCkgOwotCi0gICAgfQotCi0KLX0KLQotCi0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2xzL2JlYW4vTmFtZXNwYWNlRmluZGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29scy9iZWFuL05hbWVzcGFjZUZpbmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTBiMjM5Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2xzL2JlYW4vTmFtZXNwYWNlRmluZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudG9vbHMuYmVhbjsKLQotCi1wdWJsaWMgY2xhc3MgTmFtZXNwYWNlRmluZGVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgTlNfUFJFRklYID0gImh0dHA6Ly8iOwotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBTQ0hFTUFfTlNfREVGQVVMVF9QUkVGSVggPSAieHNkIjsKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgTlNfREVGQVVMVF9QUkVGSVggPSAibnMiOwotCi0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRUYXJnZXROYW1lc3BhY2VGcm9tQ2xhc3MoU3RyaW5nIGZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lKXsKLSAgICAgICAgLy90b2tlbml6ZSB0aGUgY2xhc3NOYW1lCi0gICAgICAgIFN0cmluZ1tdIGNsYXNzTmFtZVBhcnRzID0gZnVsbHlRdWFsaWZpZWRDbGFzc05hbWUuc3BsaXQoIlxcLiIpOwotICAgICAgICAvL2FkZCB0aGUgc3RyaW5ncyBpbiByZXZlcnNlIG9yZGVyIHRvIG1ha2UgdGhlIG5hbWVzcGFjZQotICAgICAgICBTdHJpbmcgbnNVcmkgPSAiIjsKLSAgICAgICAgZm9yKGludCBpPWNsYXNzTmFtZVBhcnRzLmxlbmd0aC0xO2k+PTA7aS0tKXsKLSAgICAgICAgICAgIG5zVXJpID0gbnNVcmkgKyBjbGFzc05hbWVQYXJ0c1tpXSArIChpPT0wPyIiOiIuIik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gTlNfUFJFRklYICsgbnNVcmk7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTY2hlbWFUYXJnZXROYW1lc3BhY2VGcm9tQ2xhc3MoU3RyaW5nIGZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lKXsKLSAgICAgICAgcmV0dXJuIGdldFRhcmdldE5hbWVzcGFjZUZyb21DbGFzcyhmdWxseVF1YWxpZmllZENsYXNzTmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGVmYXVsdFNjaGVtYU5hbWVzcGFjZVByZWZpeCgpewotICAgICAgICByZXR1cm4gU0NIRU1BX05TX0RFRkFVTFRfUFJFRklYOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERlZmF1bHROYW1lc3BhY2VQcmVmaXgoKXsKLSAgICAgICAgcmV0dXJuIE5TX0RFRkFVTFRfUFJFRklYOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFNlcnZpY2VOYW1lVGV4dChTdHJpbmcgZnVsbHlRdWFsaWZpZWRDbGFzc05hbWUpewotICAgICAgICAvL3Rva2VuaXplIHRoZSBjbGFzc05hbWUKLSAgICAgICAgU3RyaW5nW10gY2xhc3NOYW1lUGFydHMgPSBmdWxseVF1YWxpZmllZENsYXNzTmFtZS5zcGxpdCgiXFwuIik7Ci0gICAgICAgIHJldHVybiBjbGFzc05hbWVQYXJ0c1tjbGFzc05hbWVQYXJ0cy5sZW5ndGgtMV07Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbHMvYmVhbi9TcmNDb21waWxlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbHMvYmVhbi9TcmNDb21waWxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGRiOTg3Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2xzL2JlYW4vU3JjQ29tcGlsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50b29scy5iZWFuOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5KYXZhYzsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotLyoqCi0gKiBDcmVhdGVkIGJ5IEludGVsbGlKIElERUEuCi0gKiBVc2VyOiBrZWl0aCBjaGFwbWFuCi0gKiBEYXRlOiAyOC8wOS8yMDA2Ci0gKiBUaW1lOiAxNjozNTowNgotICovCi1wdWJsaWMgY2xhc3MgU3JjQ29tcGlsZXIgZXh0ZW5kcyBKYXZhYyB7Ci0KLSAgICBQcm9qZWN0IHByb2plY3Q7Ci0KLSAgICBwdWJsaWMgU3JjQ29tcGlsZXIoKSB7Ci0gICAgICAgIHByb2plY3QgPSBuZXcgUHJvamVjdCgpOwotICAgICAgICB0aGlzLnNldFByb2plY3QocHJvamVjdCk7Ci0gICAgICAgIHByb2plY3QuaW5pdCgpOwotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY29tcGlsZVNvdXJjZShTdHJpbmcgdGVtcFBhdGgpIHsKLQotICAgICAgICAgIFBhdGggcGF0aDsKLSAgICAgICAgICBGaWxlIGRlc3REaXIgPSBuZXcgRmlsZSh0ZW1wUGF0aCArIEZpbGUuc2VwYXJhdG9yICsgImNsYXNzZXMiKTsKLSAgICAgICAgICBkZXN0RGlyLm1rZGlyKCk7Ci0KLSAgICAgICAgICBQYXRoIHNyY1BhdGggPSBuZXcgUGF0aChwcm9qZWN0LCB0ZW1wUGF0aCArIEZpbGUuc2VwYXJhdG9yICsgInNyYyIpOwotICAgICAgICAgIHRoaXMuc2V0U3JjZGlyKHNyY1BhdGgpOwotICAgICAgICAgIHRoaXMuc2V0RGVzdGRpcihkZXN0RGlyKTsKLSAgICAgICAgICB0aGlzLnNldEluY2x1ZGVzKCIqKiIgKyBGaWxlLnNlcGFyYXRvciArICIqLmphdmEsICouamF2YSIpOwotICAgICAgICAgIFVSTCB1cmwgPSBnZXRDbGFzcygpLmdldFJlc291cmNlKCIvaWNvbnMiKTsKLSAgICAgICAgICBGaWxlIGxpYiA9IG5ldyBGaWxlKHVybC5nZXRQYXRoKCkgKyBGaWxlLnNlcGFyYXRvciArICIuLiIgKyBGaWxlLnNlcGFyYXRvciArICIuLiIgKyBGaWxlLnNlcGFyYXRvciArICJsaWIiKTsKLSAgICAgICAgICBGaWxlW10gZmlsZXM7Ci0gICAgICAgICAgZmlsZXMgPSBsaWIubGlzdEZpbGVzKCk7Ci0KLSAgICAgICAgICBQYXRoIGNsYXNzcGF0aCA9IG5ldyBQYXRoKHByb2plY3QpOwotICAgICAgICAgIGZvciAoaW50IGNvdW50ID0gMDsgY291bnQgPCBmaWxlcy5sZW5ndGg7IGNvdW50KyspIHsKLSAgICAgICAgICAgICAgcGF0aCA9IG5ldyBQYXRoKHByb2plY3QsIGZpbGVzW2NvdW50XS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgICAgICAgICAgIGNsYXNzcGF0aC5hZGQocGF0aCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIHRoaXMuc2V0Q2xhc3NwYXRoKGNsYXNzcGF0aCk7Ci0gICAgICAgICB0aGlzLnNldEZvcmsodHJ1ZSk7Ci0gICAgICAgICAgdGhpcy5wZXJmb3JtKCk7Ci0KLSAgICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbHMvYmVhbi9Xc2RsZ2VuQmVhbi5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbHMvYmVhbi9Xc2RsZ2VuQmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDBkZTJhLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2xzL2JlYW4vV3NkbGdlbkJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudG9vbHMuYmVhbjsKLQotaW1wb3J0IGNvbS5pbnRlbGxpai5vcGVuYXBpLm1vZHVsZS5Nb2R1bGU7Ci1pbXBvcnQgY29tLmludGVsbGlqLm9wZW5hcGkubW9kdWxlLk1vZHVsZU1hbmFnZXI7Ci1pbXBvcnQgY29tLmludGVsbGlqLm9wZW5hcGkucHJvamVjdC5Qcm9qZWN0OwotaW1wb3J0IGNvbS5pbnRlbGxpai5vcGVuYXBpLnJvb3RzLk1vZHVsZVJvb3RNYW5hZ2VyOwotaW1wb3J0IGNvbS5pbnRlbGxpai5vcGVuYXBpLnZmcy5WaXJ0dWFsRmlsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLmphdmEyd3NkbC5KYXZhMldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5qYXZhMndzZGwuSmF2YTJXU0RMQ29kZWdlbkVuZ2luZTsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmphdmEyd3NkbC51dGlscy5KYXZhMldTRExDb21tYW5kTGluZU9wdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLXB1YmxpYyBjbGFzcyBXc2RsZ2VuQmVhbiB7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBDbGFzc05hbWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmdbXSBDbGFzc1BhdGhMaXN0OwotICAgIHByaXZhdGUgU3RyaW5nIFRhcmdldE5hbWVzcGFjZTsKLSAgICBwcml2YXRlIFN0cmluZyBUYXJnZXROYW1lc3BhY2VQcmVmaXg7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgU2NoZW1hVGFyZ2V0TmFtZXNwYWNlOwotICAgIHByaXZhdGUgU3RyaW5nIFNlcnZpY2VOYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIFNjaGVtYVRhcmdldE5hbWVzcGFjZVByZWZpeDsKLSAgICBwcml2YXRlIFN0cmluZyBPdXRwdXRMb2NhdGlvbiA7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgT3V0cHV0V1NETE5hbWUgOwotICAgIHByaXZhdGUgUHJvamVjdCBwcm9qZWN0OwotCi0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIENsYXNzTmFtZSA7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q2xhc3NOYW1lKFN0cmluZyBjbGFzc05hbWUpewotICAgICAgICB0aGlzLkNsYXNzTmFtZT1jbGFzc05hbWUgOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRDbGFzc1BhdGhMaXN0KCl7Ci0gICAgICAgIHJldHVybiBDbGFzc1BhdGhMaXN0IDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc1BhdGhMaXN0KFN0cmluZ1tdIGNsYXNzUGF0aExpc3QpIHsKLSAgICAgICAgdGhpcy5DbGFzc1BhdGhMaXN0ID0gY2xhc3NQYXRoTGlzdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRhcmdldE5hbWVzcGFjZSgpIHsKLSAgICAgICAgcmV0dXJuIFRhcmdldE5hbWVzcGFjZSA7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VGFyZ2V0TmFtZXNwYWNlKFN0cmluZyB0YXJnZXROYW1lc3BhY2UpIHsKLSAgICAgICAgdGhpcy5UYXJnZXROYW1lc3BhY2UgPSB0YXJnZXROYW1lc3BhY2U7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRUYXJnZXROYW1lc3BhY2VQcmVmaXgoKSB7Ci0gICAgICAgIHJldHVybiBUYXJnZXROYW1lc3BhY2VQcmVmaXggOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFRhcmdldE5hbWVzcGFjZVByZWZpeChTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlUHJlZml4KSB7Ci0gICAgICAgIHRoaXMuVGFyZ2V0TmFtZXNwYWNlUHJlZml4ID0gdGFyZ2V0TmFtZXNwYWNlUHJlZml4OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2NoZW1hVGFyZ2V0TmFtZXNwYWNlKCkgewotICAgICAgICByZXR1cm4gU2NoZW1hVGFyZ2V0TmFtZXNwYWNlIDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTY2hlbWFUYXJnZXROYW1lc3BhY2UgKFN0cmluZyBzY2hlbWFUYXJnZXROYW1lU3BhY2UpIHsKLSAgICAgICAgdGhpcy5TY2hlbWFUYXJnZXROYW1lc3BhY2UgPSBzY2hlbWFUYXJnZXROYW1lU3BhY2UgOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2NoZW1hVGFyZ2V0TmFtZXNwYWNlUHJlZml4ICgpIHsKLSAgICAgICAgcmV0dXJuIFNjaGVtYVRhcmdldE5hbWVzcGFjZVByZWZpeCA7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2NoZW1hVGFyZ2V0TmFtZXNwYWNlUHJlZml4IChTdHJpbmcgc2NoZW1hVGFyZ2V0TmFtZVNwYWNlUHJlZml4KSB7Ci0gICAgICAgIHRoaXMuU2NoZW1hVGFyZ2V0TmFtZXNwYWNlUHJlZml4ID0gc2NoZW1hVGFyZ2V0TmFtZVNwYWNlUHJlZml4IDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE91dHB1dExvY2F0aW9uKCl7Ci0gICAgICAgIHJldHVybiBPdXRwdXRMb2NhdGlvbiA7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0T3V0cHV0TG9jYXRpb24oU3RyaW5nIG91dHB1dExvYWN0aW9uKXsKLSAgICAgICAgdGhpcy5PdXRwdXRMb2NhdGlvbiA9b3V0cHV0TG9hY3Rpb24gOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0T3V0cHV0V1NETE5hbWUoKXsKLSAgICAgICAgcmV0dXJuIE91dHB1dFdTRExOYW1lIDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRPdXRwdXRXU0RMTmFtZShTdHJpbmcgb3V0cHV0V1NETE5hbWUpewotICAgICAgICB0aGlzLk91dHB1dFdTRExOYW1lID1vdXRwdXRXU0RMTmFtZSA7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRTZXJ2aWNlTmFtZSgpewotICAgICAgICByZXR1cm4gU2VydmljZU5hbWUgOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VOYW1lKFN0cmluZyBzZXJ2aWNlTmFtZSl7Ci0gICAgICAgIHRoaXMuU2VydmljZU5hbWUgPXNlcnZpY2VOYW1lIDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWFwIGZpbGxPcHRpb25NYXAoKSAgewotCi0gICAgICAgIE1hcCBvcHRpb25NYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgICAgIG9wdGlvbk1hcC5wdXQoSmF2YTJXU0RMQ29uc3RhbnRzIC5DTEFTU05BTUVfT1BUSU9OICwKLSAgICAgICAgICAgICAgICBuZXcgSmF2YTJXU0RMQ29tbWFuZExpbmVPcHRpb24oSmF2YTJXU0RMQ29uc3RhbnRzLkNMQVNTTkFNRV9PUFRJT04gLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tde2dldENsYXNzTmFtZSgpIH0pCi0gICAgICAgICk7Ci0KLSAgICAgICAgb3B0aW9uTWFwLnB1dChKYXZhMldTRExDb25zdGFudHMuQ0xBU1NQQVRIX09QVElPTiAsCi0gICAgICAgICAgICAgICAgbmV3IEphdmEyV1NETENvbW1hbmRMaW5lT3B0aW9uKEphdmEyV1NETENvbnN0YW50cyAuQ0xBU1NQQVRIX09QVElPTiAsCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRDbGFzc1BhdGhMaXN0KCkpCi0gICAgICAgICk7Ci0KLSAgICAgICAgb3B0aW9uTWFwLnB1dChKYXZhMldTRExDb25zdGFudHMgLlRBUkdFVF9OQU1FU1BBQ0VfT1BUSU9OICwKLSAgICAgICAgICAgICAgICBuZXcgSmF2YTJXU0RMQ29tbWFuZExpbmVPcHRpb24oSmF2YTJXU0RMQ29uc3RhbnRzIC5UQVJHRVRfTkFNRVNQQUNFX09QVElPTiAsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW117Z2V0VGFyZ2V0TmFtZXNwYWNlKCkgfSkKLSAgICAgICAgKTsKLQotICAgICAgICBvcHRpb25NYXAucHV0KEphdmEyV1NETENvbnN0YW50cyAuVEFSR0VUX05BTUVTUEFDRV9QUkVGSVhfT1BUSU9OICwKLSAgICAgICAgICAgICAgICBuZXcgSmF2YTJXU0RMQ29tbWFuZExpbmVPcHRpb24oSmF2YTJXU0RMQ29uc3RhbnRzIC5UQVJHRVRfTkFNRVNQQUNFX1BSRUZJWF9PUFRJT04gLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tde2dldFRhcmdldE5hbWVzcGFjZVByZWZpeCgpfSkKLSAgICAgICAgKTsKLQotICAgICAgICBvcHRpb25NYXAucHV0KEphdmEyV1NETENvbnN0YW50cyAuU0NIRU1BX1RBUkdFVF9OQU1FU1BBQ0VfT1BUSU9OICwKLSAgICAgICAgICAgICAgICBuZXcgSmF2YTJXU0RMQ29tbWFuZExpbmVPcHRpb24oSmF2YTJXU0RMQ29uc3RhbnRzIC5TQ0hFTUFfVEFSR0VUX05BTUVTUEFDRV9PUFRJT04gLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tde2dldFNjaGVtYVRhcmdldE5hbWVzcGFjZSgpIH0pCi0gICAgICAgICk7Ci0KLSAgICAgICAgb3B0aW9uTWFwLnB1dChKYXZhMldTRExDb25zdGFudHMgLlNFUlZJQ0VfTkFNRV9PUFRJT04gLAotICAgICAgICAgICAgICAgIG5ldyBKYXZhMldTRExDb21tYW5kTGluZU9wdGlvbihKYXZhMldTRExDb25zdGFudHMgLlNFUlZJQ0VfTkFNRV9PUFRJT04gLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tde2dldFNlcnZpY2VOYW1lKCkgfSkKLSAgICAgICAgKTsKLQotICAgICAgICBvcHRpb25NYXAucHV0KEphdmEyV1NETENvbnN0YW50cyAuU0NIRU1BX1RBUkdFVF9OQU1FU1BBQ0VfUFJFRklYX09QVElPTiAsCi0gICAgICAgICAgICAgICAgbmV3IEphdmEyV1NETENvbW1hbmRMaW5lT3B0aW9uKEphdmEyV1NETENvbnN0YW50cyAuU0NIRU1BX1RBUkdFVF9OQU1FU1BBQ0VfUFJFRklYX09QVElPTiAsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW117Z2V0U2NoZW1hVGFyZ2V0TmFtZXNwYWNlUHJlZml4KCkgfSkKLSAgICAgICAgKTsKLQotICAgICAgICBvcHRpb25NYXAucHV0KEphdmEyV1NETENvbnN0YW50cyAuT1VUUFVUX0xPQ0FUSU9OX09QVElPTiAsCi0gICAgICAgICAgICAgICAgbmV3IEphdmEyV1NETENvbW1hbmRMaW5lT3B0aW9uKEphdmEyV1NETENvbnN0YW50cyAuT1VUUFVUX0xPQ0FUSU9OX09QVElPTiAsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW117Z2V0T3V0cHV0TG9jYXRpb24oKX0pCi0gICAgICAgICk7Ci0KLSAgICAgICAgb3B0aW9uTWFwLnB1dChKYXZhMldTRExDb25zdGFudHMgLk9VVFBVVF9GSUxFTkFNRV9PUFRJT04gLAotICAgICAgICAgICAgICAgIG5ldyBKYXZhMldTRExDb21tYW5kTGluZU9wdGlvbihKYXZhMldTRExDb25zdGFudHMgLk9VVFBVVF9GSUxFTkFNRV9PUFRJT04gLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tde2dldE91dHB1dFdTRExOYW1lKCl9KQotICAgICAgICApOwotCi0gICAgICAgIHJldHVybiBvcHRpb25NYXA7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBnZW5lcmF0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIHRyeSB7Ci0KLSAgICAgICAgICAgIEphdmEyV1NETENvZGVnZW5FbmdpbmUgamF2YTJXU0RMPW5ldyBKYXZhMldTRExDb2RlZ2VuRW5naW5lKGZpbGxPcHRpb25NYXAoKSk7Ci0gICAgICAgICAgICBqYXZhMldTREwuZ2VuZXJhdGUoKTsKLQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkgewotCi0gICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJDb2RlIGdlbmVyYXRpb24gZmFpbGVkIGR1ZSB0byAiICsgZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0KLSAgICB9Ci0gICAgcHVibGljIFByb2plY3QgZ2V0QWN0aXZlUHJvamVjdCgpIHsKLSAgICAgICAgcmV0dXJuIHByb2plY3Q7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9qZWN0KFByb2plY3QgcHJvamVjdCkgewotICAgICAgICB0aGlzLnByb2plY3QgPSBwcm9qZWN0OwotICAgIH0KLSAgICBwdWJsaWMgTW9kdWxlW10gZ2V0TW9kdWxlcygpIHsKLQotICAgICAgICBQcm9qZWN0IHByb2plY3QgPSBnZXRBY3RpdmVQcm9qZWN0KCk7Ci0gICAgICAgIGlmIChwcm9qZWN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBNb2R1bGVNYW5hZ2VyLmdldEluc3RhbmNlKHByb2plY3QpLmdldE1vZHVsZXMoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0TW9kdWxlU3JjKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIFByb2plY3QgcHJvamVjdCA9IGdldEFjdGl2ZVByb2plY3QoKTsKLSAgICAgICAgaWYgKHByb2plY3QgIT0gbnVsbCkgewotICAgICAgICAgICAgTW9kdWxlIG1vZHVsZSA9IE1vZHVsZU1hbmFnZXIuZ2V0SW5zdGFuY2UocHJvamVjdCkuZmluZE1vZHVsZUJ5TmFtZShuYW1lKTsKLSAgICAgICAgICAgIE1vZHVsZVJvb3RNYW5hZ2VyIG1vZHVsZVJvb3RNYW5hZ2VyID0gTW9kdWxlUm9vdE1hbmFnZXIuZ2V0SW5zdGFuY2UobW9kdWxlKTsKLSAgICAgICAgICAgIFZpcnR1YWxGaWxlIHZpcnR1YWxGaWxlc1tdID0gbW9kdWxlUm9vdE1hbmFnZXIuZ2V0U291cmNlUm9vdHMoKTsKLSAgICAgICAgICAgIFN0cmluZyBzcmNbXSA9IG5ldyBTdHJpbmdbdmlydHVhbEZpbGVzLmxlbmd0aF07Ci0gICAgICAgICAgICBmb3IgKGludCBjb3VudCA9IDA7IGNvdW50IDwgc3JjLmxlbmd0aDsgY291bnQrKykgewotICAgICAgICAgICAgICAgIHNyY1tjb3VudF0gPSB2aXJ0dWFsRmlsZXNbY291bnRdLmdldFByZXNlbnRhYmxlVXJsKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gc3JjOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2xzL2NvbXBvbmVudC9BY3Rpb24uamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2xzL2NvbXBvbmVudC9BY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWIwNzY5NS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29scy9jb21wb25lbnQvQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudG9vbHMuY29tcG9uZW50OwotCi0vKioKLSAqIGludGVyZmFjZSBmb3IgQWN0aW9uCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQWN0aW9uIHsKLSAgICBwdWJsaWMgdm9pZCBwZXJmb3JtQWN0aW9uKCk7Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29scy9jb21wb25lbnQvQ2FuY2VsQWN0aW9uLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29scy9jb21wb25lbnQvQ2FuY2VsQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiYWE1MTYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbHMvY29tcG9uZW50L0NhbmNlbEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnRvb2xzLmNvbXBvbmVudDsKLQotLyoqCi0gKiBhYnN0cmFjdCBjbGFzcyBmb3IgQ2Fuc2VsQWN0aW9uCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDYW5jZWxBY3Rpb24gIGltcGxlbWVudHMgQWN0aW9uewotICBXaXphcmRDb21wb25lbnRzIHdpemFyZENvbXBvbmVudHM7Ci0KLSAgcHVibGljIENhbmNlbEFjdGlvbihXaXphcmRDb21wb25lbnRzIHdpemFyZENvbXBvbmVudHMpIHsKLSAgICB0aGlzLndpemFyZENvbXBvbmVudHMgPSB3aXphcmRDb21wb25lbnRzOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbHMvY29tcG9uZW50L0RlZmF1bHRXaXphcmRDb21wb25lbnRzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29scy9jb21wb25lbnQvRGVmYXVsdFdpemFyZENvbXBvbmVudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI5N2QxNy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29scy9jb21wb25lbnQvRGVmYXVsdFdpemFyZENvbXBvbmVudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudG9vbHMuY29tcG9uZW50OwotCi1pbXBvcnQgamF2YXguc3dpbmcuKjsKLWltcG9ydCBqYXZhLmF3dC4qOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkV2ZW50OwotaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZVN1cHBvcnQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiB0aGlzIGlzIHVzZWQgZm9yIGRlZmF1bHQgd2l6YXJkIGNvbXBvbmVudHMKLSAqLwotcHVibGljIGNsYXNzIERlZmF1bHRXaXphcmRDb21wb25lbnRzIGltcGxlbWVudHMgV2l6YXJkQ29tcG9uZW50cyB7Ci0KLSAgICBwcml2YXRlIEpCdXR0b24gYmFja0J1dHRvbjsKLSAgICBwcml2YXRlIEpCdXR0b24gbmV4dEJ1dHRvbjsKLSAgICBwcml2YXRlIEpCdXR0b24gZmluaXNoQnV0dG9uOwotICAgIHByaXZhdGUgSkJ1dHRvbiBjYW5jZWxCdXR0b247Ci0KLSAgICBGaW5pc2hBY3Rpb24gZmluaXNoQWN0aW9uOwotICAgIENhbmNlbEFjdGlvbiBjYW5jZWxBY3Rpb247Ci0KLSAgICBMaXN0IHBhbmVsTGlzdDsKLSAgICBpbnQgY3VycmVudEluZGV4OwotICAgIEpQYW5lbCB3aXphcmRQYW5lbHNDb250YWluZXI7Ci0gICAgUHJvcGVydHlDaGFuZ2VTdXBwb3J0IHByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzOwotCi0gICAgLyoqCi0gICAgICogVGhpcyBjbGFzcyBpcyB0aGUgImJyZWFkIGFuZCBidXR0ZXIiIG9mIHRoaXMgZnJhbWV3b3JrLiAgQWxsIG9mIHRoZXNlCi0gICAgICogY29tcG9uZW50cyBjYW4gYmUgdXNlZCB2aXN1YWxseSBob3dldmVyIHlvdSB3YW50LCBhcyBzaG93biBpbiB0aGUKLSAgICAgKiBmcmFtZSBhbmQgZXhhbXBsZSBwYWNrYWdlcywgYnV0IGFsbCBhIGRldmVsb3BlciByZWFsbHkgbmVlZHMgaXMgdGhpcywKLSAgICAgKiBhbmQgdGhleSBjYW4gZXZlbiBpbnN0ZWFkIGltcGxlbWVudCBKV2l6YXJkIGFuZCBjaG9vc2UgdG8gZG8gdGhpcwotICAgICAqIHBvcnRpb24gYW55IHdheSB0aGV5IHdpc2guCi0gICAgICovCi0gICAgcHVibGljIERlZmF1bHRXaXphcmRDb21wb25lbnRzKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgaW5pdCgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFdpemFyZFBhbmVsKFdpemFyZFBhbmVsIHBhbmVsKSB7Ci0gICAgICAgIGdldFdpemFyZFBhbmVsTGlzdCgpLmFkZChwYW5lbCk7Ci0gICAgICAgIHdpemFyZFBhbmVsc0NvbnRhaW5lci5hZGQocGFuZWwsCi0gICAgICAgICAgICAgICAgZ2V0V2l6YXJkUGFuZWxMaXN0KCkuc2l6ZSgpIC0gMSArICIiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRXaXphcmRQYW5lbChpbnQgaW5kZXgsIFdpemFyZFBhbmVsIHBhbmVsKSB7Ci0gICAgICAgIGdldFdpemFyZFBhbmVsTGlzdCgpLmFkZChpbmRleCwgcGFuZWwpOwotICAgICAgICB3aXphcmRQYW5lbHNDb250YWluZXIuYWRkKHBhbmVsLCBpbmRleCArICIiLCBpbmRleCk7Ci0gICAgICAgIGlmIChpbmRleCA8IGdldFdpemFyZFBhbmVsTGlzdCgpLnNpemUoKSAtIDEpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSBpbmRleCArIDE7IGkgPCBnZXRXaXphcmRQYW5lbExpc3QoKS5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIHdpemFyZFBhbmVsc0NvbnRhaW5lci5hZGQoCi0gICAgICAgICAgICAgICAgICAgICAgICAoV2l6YXJkUGFuZWwpZ2V0V2l6YXJkUGFuZWxMaXN0KCkuZ2V0KGkpLAotICAgICAgICAgICAgICAgICAgICAgICAgaSArICIiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFdpemFyZFBhbmVsQWZ0ZXIoCi0gICAgICAgICAgICBXaXphcmRQYW5lbCBwYW5lbFRvQmVQbGFjZWRBZnRlciwKLSAgICAgICAgICAgIFdpemFyZFBhbmVsIHBhbmVsKSB7Ci0gICAgICAgIGFkZFdpemFyZFBhbmVsKAotICAgICAgICAgICAgICAgIGdldFdpemFyZFBhbmVsTGlzdCgpLmluZGV4T2YocGFuZWxUb0JlUGxhY2VkQWZ0ZXIpICsgMSwKLSAgICAgICAgICAgICAgICBwYW5lbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkV2l6YXJkUGFuZWxCZWZvcmUoCi0gICAgICAgICAgICBXaXphcmRQYW5lbCBwYW5lbFRvQmVQbGFjZWRCZWZvcmUsCi0gICAgICAgICAgICBXaXphcmRQYW5lbCBwYW5lbCkgewotICAgICAgICBhZGRXaXphcmRQYW5lbCgKLSAgICAgICAgICAgICAgICBnZXRXaXphcmRQYW5lbExpc3QoKS5pbmRleE9mKHBhbmVsVG9CZVBsYWNlZEJlZm9yZSkgLSAxLAotICAgICAgICAgICAgICAgIHBhbmVsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRXaXphcmRQYW5lbEFmdGVyQ3VycmVudChXaXphcmRQYW5lbCBwYW5lbCkgewotICAgICAgICBhZGRXaXphcmRQYW5lbChnZXRDdXJyZW50SW5kZXgoKSsxLCBwYW5lbCk7Ci0gICAgfQotCi0gICAgcHVibGljIFdpemFyZFBhbmVsIHJlbW92ZVdpemFyZFBhbmVsKFdpemFyZFBhbmVsIHBhbmVsKSB7Ci0gICAgICAgIGludCBpbmRleCA9IGdldFdpemFyZFBhbmVsTGlzdCgpLmluZGV4T2YocGFuZWwpOwotICAgICAgICBnZXRXaXphcmRQYW5lbExpc3QoKS5yZW1vdmUocGFuZWwpOwotICAgICAgICB3aXphcmRQYW5lbHNDb250YWluZXIucmVtb3ZlKHBhbmVsKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IGluZGV4OyBpIDwgZ2V0V2l6YXJkUGFuZWxMaXN0KCkuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIHdpemFyZFBhbmVsc0NvbnRhaW5lci5hZGQoCi0gICAgICAgICAgICAgICAgICAgIChXaXphcmRQYW5lbCkgZ2V0V2l6YXJkUGFuZWxMaXN0KCkuZ2V0KGkpLAotICAgICAgICAgICAgICAgICAgICBpICsgIiIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwYW5lbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgV2l6YXJkUGFuZWwgcmVtb3ZlV2l6YXJkUGFuZWwoaW50IGluZGV4KSB7Ci0gICAgICAgIHdpemFyZFBhbmVsc0NvbnRhaW5lci5yZW1vdmUoaW5kZXgpOwotICAgICAgICBXaXphcmRQYW5lbCBwYW5lbCA9IChXaXphcmRQYW5lbCkgZ2V0V2l6YXJkUGFuZWxMaXN0KCkucmVtb3ZlKGluZGV4KTsKLSAgICAgICAgZm9yIChpbnQgaSA9IGluZGV4OyBpIDwgZ2V0V2l6YXJkUGFuZWxMaXN0KCkuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIHdpemFyZFBhbmVsc0NvbnRhaW5lci5hZGQoCi0gICAgICAgICAgICAgICAgICAgIChXaXphcmRQYW5lbCkgZ2V0V2l6YXJkUGFuZWxMaXN0KCkuZ2V0KGkpLAotICAgICAgICAgICAgICAgICAgICBpICsgIiIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwYW5lbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgV2l6YXJkUGFuZWwgcmVtb3ZlV2l6YXJkUGFuZWxBZnRlcihXaXphcmRQYW5lbCBwYW5lbCkgewotICAgICAgICByZXR1cm4gcmVtb3ZlV2l6YXJkUGFuZWwoZ2V0V2l6YXJkUGFuZWxMaXN0KCkuaW5kZXhPZihwYW5lbCkgKyAxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgV2l6YXJkUGFuZWwgcmVtb3ZlV2l6YXJkUGFuZWxCZWZvcmUoV2l6YXJkUGFuZWwgcGFuZWwpIHsKLSAgICAgICAgcmV0dXJuIHJlbW92ZVdpemFyZFBhbmVsKGdldFdpemFyZFBhbmVsTGlzdCgpLmluZGV4T2YocGFuZWwpIC0gMSk7Ci0gICAgfQotCi0gICAgcHVibGljIFdpemFyZFBhbmVsIGdldFdpemFyZFBhbmVsKGludCBpbmRleCkgewotICAgICAgICByZXR1cm4gKFdpemFyZFBhbmVsKSBnZXRXaXphcmRQYW5lbExpc3QoKS5nZXQoaW5kZXgpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0SW5kZXhPZlBhbmVsKFdpemFyZFBhbmVsIHBhbmVsKSB7Ci0gICAgICAgIHJldHVybiBnZXRXaXphcmRQYW5lbExpc3QoKS5pbmRleE9mKHBhbmVsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBvbkxhc3RQYW5lbCgpIHsKLSAgICAgICAgcmV0dXJuIChnZXRDdXJyZW50SW5kZXgoKSA9PSBnZXRXaXphcmRQYW5lbExpc3QoKS5zaXplKCkgLSAxKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0aGlzLnByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzID0gbmV3IFByb3BlcnR5Q2hhbmdlU3VwcG9ydCh0aGlzKTsKLQotICAgICAgICBiYWNrQnV0dG9uID0gbmV3IEpCdXR0b24oKTsKLSAgICAgICAgbmV4dEJ1dHRvbiA9IG5ldyBKQnV0dG9uKCk7Ci0gICAgICAgIGZpbmlzaEJ1dHRvbiA9IG5ldyBKQnV0dG9uKCk7Ci0gICAgICAgIGNhbmNlbEJ1dHRvbiA9IG5ldyBKQnV0dG9uKCk7Ci0KLSAgICAgICAgcGFuZWxMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBjdXJyZW50SW5kZXggPSAwOwotICAgICAgICB3aXphcmRQYW5lbHNDb250YWluZXIgPSBuZXcgSlBhbmVsKCk7Ci0KLSAgICAgICAgYmFja0J1dHRvbi5zZXRUZXh0KCI8IEJhY2siKTsKLSAgICAgICAgYmFja0J1dHRvbi5zZXRNbmVtb25pYygiQiIuY2hhckF0KDApKTsKLSAgICAgICAgYmFja0J1dHRvbi5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgamF2YS5hd3QuZXZlbnQuQWN0aW9uTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGJhY2tCdXR0b25fYWN0aW9uUGVyZm9ybWVkKGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBuZXh0QnV0dG9uLnNldFRleHQoIk5leHQgPiIpOwotICAgICAgICBuZXh0QnV0dG9uLnNldE1uZW1vbmljKCJOIi5jaGFyQXQoMCkpOwotICAgICAgICBuZXh0QnV0dG9uLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBqYXZhLmF3dC5ldmVudC5BY3Rpb25MaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgbmV4dEJ1dHRvbl9hY3Rpb25QZXJmb3JtZWQoZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIGNhbmNlbEJ1dHRvbi5zZXRUZXh0KCJDYW5jZWwiKTsKLSAgICAgICAgY2FuY2VsQnV0dG9uLnNldE1uZW1vbmljKCJDIi5jaGFyQXQoMCkpOwotICAgICAgICBjYW5jZWxCdXR0b24uYWRkQWN0aW9uTGlzdGVuZXIobmV3IGphdmEuYXd0LmV2ZW50LkFjdGlvbkxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBjYW5jZWxCdXR0b25fYWN0aW9uUGVyZm9ybWVkKGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBmaW5pc2hCdXR0b24uc2V0VGV4dCgiRmluaXNoIik7Ci0gICAgICAgIGZpbmlzaEJ1dHRvbi5zZXRNbmVtb25pYygiRiIuY2hhckF0KDApKTsKLSAgICAgICAgZmluaXNoQnV0dG9uLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBqYXZhLmF3dC5ldmVudC5BY3Rpb25MaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgZmluaXNoQnV0dG9uX2FjdGlvblBlcmZvcm1lZChlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgd2l6YXJkUGFuZWxzQ29udGFpbmVyLnNldExheW91dChuZXcgQ2FyZExheW91dCgpKTsKLSAgICB9Ci0KLSAgICB2b2lkIGNhbmNlbEJ1dHRvbl9hY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgewotICAgICAgICBnZXRDYW5jZWxBY3Rpb24oKS5wZXJmb3JtQWN0aW9uKCk7Ci0gICAgfQotCi0gICAgdm9pZCBmaW5pc2hCdXR0b25fYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgZ2V0RmluaXNoQWN0aW9uKCkucGVyZm9ybUFjdGlvbigpOwotICAgIH0KLQotICAgIHZvaWQgbmV4dEJ1dHRvbl9hY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYoZ2V0Q3VycmVudFBhbmVsKCkuaXNQYWdlQ29tcGxldGUoKSl7Ci0gICAgICAgICAgICAgICAgZ2V0Q3VycmVudFBhbmVsKCkubmV4dCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIGJhY2tCdXR0b25fYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGdldEN1cnJlbnRQYW5lbCgpLmJhY2soKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBleC5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBXaXphcmRQYW5lbCBnZXRDdXJyZW50UGFuZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGdldFdpemFyZFBhbmVsTGlzdCgpLmdldChjdXJyZW50SW5kZXgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiAoV2l6YXJkUGFuZWwpIGdldFdpemFyZFBhbmVsTGlzdCgpLmdldChjdXJyZW50SW5kZXgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiTm8gcGFuZWxzIGluIHBhbmVsTGlzdCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdXBkYXRlQ29tcG9uZW50cygpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIENhcmRMYXlvdXQgY2wgPSAoQ2FyZExheW91dCkgKHdpemFyZFBhbmVsc0NvbnRhaW5lci5nZXRMYXlvdXQoKSk7Ci0gICAgICAgICAgICBjbC5zaG93KHdpemFyZFBhbmVsc0NvbnRhaW5lciwgY3VycmVudEluZGV4ICsgIiIpOwotCi0gICAgICAgICAgICBpZiAoY3VycmVudEluZGV4ID09IDApIHsKLSAgICAgICAgICAgICAgICBiYWNrQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBiYWNrQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChvbkxhc3RQYW5lbCgpKSB7Ci0gICAgICAgICAgICAgICAgbmV4dEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICBmaW5pc2hCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZmluaXNoQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgIG5leHRCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIGxldCBwYW5lbCB0byB1cGRhdGUgaXRzZWxmCi0gICAgICAgICAgICBnZXRDdXJyZW50UGFuZWwoKS51cGRhdGUoKTsKLQotICAgICAgICAgICAgLy8gaW5mb3JtIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzCi0gICAgICAgICAgICBQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50ID0gbmV3IFByb3BlcnR5Q2hhbmdlRXZlbnQodGhpcywgV2l6YXJkQ29tcG9uZW50cy5DVVJSRU5UX1BBTkVMX1BST1BFUlRZCi0gICAgICAgICAgICAgICAgICAgICwgbnVsbCwgIGdldEN1cnJlbnRQYW5lbCgpKTsKLSAgICAgICAgICAgIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzLmZpcmVQcm9wZXJ0eUNoYW5nZShldmVudCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gR2V0dGVycyBhbmQgU2V0dGVycyBmcm9tIGhlcmUgb24gLi4uCi0KLSAgICBwdWJsaWMgTGlzdCBnZXRXaXphcmRQYW5lbExpc3QoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnBhbmVsTGlzdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRXaXphcmRQYW5lbExpc3QoQXJyYXlMaXN0IHBhbmVsTGlzdCkgewotICAgICAgICB0aGlzLnBhbmVsTGlzdCA9IHBhbmVsTGlzdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRmluaXNoQWN0aW9uIGdldEZpbmlzaEFjdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIGZpbmlzaEFjdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRGaW5pc2hBY3Rpb24oRmluaXNoQWN0aW9uIGFGaW5pc2hBY3Rpb24pIHsKLSAgICAgICAgZmluaXNoQWN0aW9uID0gYUZpbmlzaEFjdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2FuY2VsQWN0aW9uIGdldENhbmNlbEFjdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIGNhbmNlbEFjdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDYW5jZWxBY3Rpb24oQ2FuY2VsQWN0aW9uIGFDYW5jZWxBY3Rpb24pIHsKLSAgICAgICAgY2FuY2VsQWN0aW9uID0gYUNhbmNlbEFjdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldEN1cnJlbnRJbmRleCgpIHsKLSAgICAgICAgcmV0dXJuIGN1cnJlbnRJbmRleDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDdXJyZW50SW5kZXgoaW50IGFDdXJyZW50SW5kZXgpIHsKLSAgICAgICAgY3VycmVudEluZGV4ID0gYUN1cnJlbnRJbmRleDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSlBhbmVsIGdldFdpemFyZFBhbmVsc0NvbnRhaW5lcigpIHsKLSAgICAgICAgcmV0dXJuIHdpemFyZFBhbmVsc0NvbnRhaW5lcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRXaXphcmRQYW5lbHNDb250YWluZXIoSlBhbmVsIGFXaXphcmRQYW5lbHNDb250YWluZXIpIHsKLSAgICAgICAgd2l6YXJkUGFuZWxzQ29udGFpbmVyID0gYVdpemFyZFBhbmVsc0NvbnRhaW5lcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSkJ1dHRvbiBnZXRCYWNrQnV0dG9uKCkgewotICAgICAgICByZXR1cm4gYmFja0J1dHRvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRCYWNrQnV0dG9uKEpCdXR0b24gYUJhY2tCdXR0b24pIHsKLSAgICAgICAgYmFja0J1dHRvbiA9IGFCYWNrQnV0dG9uOwotICAgIH0KLQotICAgIHB1YmxpYyBKQnV0dG9uIGdldE5leHRCdXR0b24oKSB7Ci0gICAgICAgIHJldHVybiBuZXh0QnV0dG9uOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE5leHRCdXR0b24oSkJ1dHRvbiBhTmV4dEJ1dHRvbikgewotICAgICAgICBuZXh0QnV0dG9uID0gYU5leHRCdXR0b247Ci0gICAgfQotCi0gICAgcHVibGljIEpCdXR0b24gZ2V0Q2FuY2VsQnV0dG9uKCkgewotICAgICAgICByZXR1cm4gY2FuY2VsQnV0dG9uOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENhbmNlbEJ1dHRvbihKQnV0dG9uIGFDYW5jZWxCdXR0b24pIHsKLSAgICAgICAgY2FuY2VsQnV0dG9uID0gYUNhbmNlbEJ1dHRvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSkJ1dHRvbiBnZXRGaW5pc2hCdXR0b24oKSB7Ci0gICAgICAgIHJldHVybiBmaW5pc2hCdXR0b247Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RmluaXNoQnV0dG9uKEpCdXR0b24gYnV0dG9uKSB7Ci0gICAgICAgIGZpbmlzaEJ1dHRvbiA9IGJ1dHRvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRXaXphcmRQYW5lbExpc3QoTGlzdCBwYW5lbExpc3QpIHsKLSAgICAgICAgdGhpcy5wYW5lbExpc3QgPSBwYW5lbExpc3Q7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVycy5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICB9Ci0KLSAgCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29scy9jb21wb25lbnQvRmluaXNoQWN0aW9uLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29scy9jb21wb25lbnQvRmluaXNoQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhMjdlZDkuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbHMvY29tcG9uZW50L0ZpbmlzaEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnRvb2xzLmNvbXBvbmVudDsKLQotLyoqCi0gKiBhYnN0cmFjdCBjbGFzcyBmb3IgRmluaXNoQWN0aW9uCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBGaW5pc2hBY3Rpb24gaW1wbGVtZW50cyBBY3Rpb257Ci0gICAgV2l6YXJkQ29tcG9uZW50cyB3aXphcmRDb21wb25lbnRzOwotCi0gICAgcHVibGljIEZpbmlzaEFjdGlvbihXaXphcmRDb21wb25lbnRzIHdpemFyZENvbXBvbmVudHMpIHsKLSAgICAgICAgdGhpcy53aXphcmRDb21wb25lbnRzID0gd2l6YXJkQ29tcG9uZW50czsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29scy9jb21wb25lbnQvVXRpbGl0aWVzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29scy9jb21wb25lbnQvVXRpbGl0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmMmE2ZTAuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbHMvY29tcG9uZW50L1V0aWxpdGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnRvb2xzLmNvbXBvbmVudDsKLQotaW1wb3J0IGphdmEuYXd0Lio7Ci0KLS8qKgotICogdGhpcyBjbGFzcyB1c2VkIGZvciBzZXQgZnJhbWUgaW4gY2VudGVyIG9mIHRoZSBjdXJyZW50IGRlc2t0b3AKLSAqLwotcHVibGljIGNsYXNzIFV0aWxpdGllcyB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY2VudGVyQ29tcG9uZW50T25TY3JlZW4oQ29tcG9uZW50IGNvbXBvbmVudCkgewotICAgICAgICBUb29sa2l0IHRvb2xraXQgPSBUb29sa2l0LmdldERlZmF1bHRUb29sa2l0KCk7Ci0gICAgICAgIERpbWVuc2lvbiBkID0gdG9vbGtpdC5nZXRTY3JlZW5TaXplKCk7Ci0KLSAgICAgICAgUG9pbnQgcCA9IG5ldyBQb2ludCgpOwotICAgICAgICBwLnggKz0gKChkLndpZHRoIC0gY29tcG9uZW50LmdldFdpZHRoKCkpIC8gMik7Ci0gICAgICAgIHAueSArPSAoKGQuaGVpZ2h0IC0gY29tcG9uZW50LmdldEhlaWdodCgpKSAvIDIpOwotCi0gICAgICAgIGlmIChwLnggPCAwKSB7Ci0gICAgICAgICAgICBwLnggPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHAueSA8IDApIHsKLSAgICAgICAgICAgIHAueSA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICBjb21wb25lbnQuc2V0TG9jYXRpb24ocCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbHMvY29tcG9uZW50L1dpemFyZC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbHMvY29tcG9uZW50L1dpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTY5MDhhLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2xzL2NvbXBvbmVudC9XaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50b29scy5jb21wb25lbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBpbnRlcmZhY2UgZm9yIHdpemFyZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdpemFyZCB7Ci0KLSAgICBwdWJsaWMgTGlzdCBnZXRXaXphcmRQYW5lbExpc3QoKTsKLQotICAgIHB1YmxpYyB2b2lkIHNldFdpemFyZFBhbmVsTGlzdChMaXN0IHBhbmVsTGlzdCk7Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRXaXphcmRQYW5lbChXaXphcmRQYW5lbCBwYW5lbCk7Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRXaXphcmRQYW5lbChpbnQgaW5kZXgsIFdpemFyZFBhbmVsIHBhbmVsKTsKLQotICAgIHB1YmxpYyBXaXphcmRQYW5lbCByZW1vdmVXaXphcmRQYW5lbChXaXphcmRQYW5lbCBwYW5lbCk7Ci0KLSAgICBwdWJsaWMgV2l6YXJkUGFuZWwgcmVtb3ZlV2l6YXJkUGFuZWwoaW50IGluZGV4KTsKLQotICAgIHB1YmxpYyBXaXphcmRQYW5lbCBnZXRXaXphcmRQYW5lbChpbnQgaW5kZXgpOwotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbHMvY29tcG9uZW50L1dpemFyZENvbXBvbmVudHMuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2xzL2NvbXBvbmVudC9XaXphcmRDb21wb25lbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyM2VhNGMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbHMvY29tcG9uZW50L1dpemFyZENvbXBvbmVudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudG9vbHMuY29tcG9uZW50OwotCi1pbXBvcnQgamF2YXguc3dpbmcuKjsKLWltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogdGhpcyBpbnRlcmZhY2UgZXh0ZW5kcyBmcm9tIHdpemFyZCBpbnRlcmZhY2UKLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIFdpemFyZENvbXBvbmVudHMgIGV4dGVuZHMgV2l6YXJkIHsKLQotICAgIHB1YmxpYyB2b2lkIGFkZFdpemFyZFBhbmVsKFdpemFyZFBhbmVsIHBhbmVsKTsKLQotICAgIHB1YmxpYyB2b2lkIGFkZFdpemFyZFBhbmVsKGludCBpbmRleCwgV2l6YXJkUGFuZWwgcGFuZWwpOwotCi0gICAgcHVibGljIHZvaWQgYWRkV2l6YXJkUGFuZWxBZnRlcigKLSAgICAgICAgICAgIFdpemFyZFBhbmVsIHBhbmVsVG9CZVBsYWNlZEFmdGVyLAotICAgICAgICAgICAgV2l6YXJkUGFuZWwgcGFuZWwpOwotCi0gICAgcHVibGljIHZvaWQgYWRkV2l6YXJkUGFuZWxCZWZvcmUoCi0gICAgICAgICAgICBXaXphcmRQYW5lbCBwYW5lbFRvQmVQbGFjZWRCZWZvcmUsCi0gICAgICAgICAgICBXaXphcmRQYW5lbCBwYW5lbCk7Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRXaXphcmRQYW5lbEFmdGVyQ3VycmVudChXaXphcmRQYW5lbCBwYW5lbCk7Ci0KLSAgICBwdWJsaWMgV2l6YXJkUGFuZWwgcmVtb3ZlV2l6YXJkUGFuZWwoV2l6YXJkUGFuZWwgcGFuZWwpOwotCi0gICAgcHVibGljIFdpemFyZFBhbmVsIHJlbW92ZVdpemFyZFBhbmVsKGludCBpbmRleCk7Ci0KLSAgICBwdWJsaWMgV2l6YXJkUGFuZWwgcmVtb3ZlV2l6YXJkUGFuZWxBZnRlcihXaXphcmRQYW5lbCBwYW5lbCk7Ci0KLSAgICBwdWJsaWMgV2l6YXJkUGFuZWwgcmVtb3ZlV2l6YXJkUGFuZWxCZWZvcmUoV2l6YXJkUGFuZWwgcGFuZWwpOwotCi0gICAgcHVibGljIFdpemFyZFBhbmVsIGdldFdpemFyZFBhbmVsKGludCBpbmRleCk7Ci0KLSAgICBwdWJsaWMgaW50IGdldEluZGV4T2ZQYW5lbChXaXphcmRQYW5lbCBwYW5lbCk7Ci0KLSAgICBwdWJsaWMgdm9pZCB1cGRhdGVDb21wb25lbnRzKCk7Ci0KLSAgICBwdWJsaWMgV2l6YXJkUGFuZWwgZ2V0Q3VycmVudFBhbmVsKCkgdGhyb3dzIEV4Y2VwdGlvbjsKLQotICAgIHB1YmxpYyBGaW5pc2hBY3Rpb24gZ2V0RmluaXNoQWN0aW9uKCk7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRGaW5pc2hBY3Rpb24oRmluaXNoQWN0aW9uIGFGaW5pc2hBY3Rpb24pOwotCi0gICAgcHVibGljIENhbmNlbEFjdGlvbiBnZXRDYW5jZWxBY3Rpb24oKTsKLQotICAgIHB1YmxpYyB2b2lkIHNldENhbmNlbEFjdGlvbihDYW5jZWxBY3Rpb24gYUNhbmNlbEFjdGlvbik7Ci0KLSAgICBwdWJsaWMgaW50IGdldEN1cnJlbnRJbmRleCgpOwotCi0gICAgcHVibGljIHZvaWQgc2V0Q3VycmVudEluZGV4KGludCBhQ3VycmVudEluZGV4KTsKLQotICAgIHB1YmxpYyBKUGFuZWwgZ2V0V2l6YXJkUGFuZWxzQ29udGFpbmVyKCk7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRXaXphcmRQYW5lbHNDb250YWluZXIoSlBhbmVsIGFXaXphcmRQYW5lbHNDb250YWluZXIpOwotCi0gICAgcHVibGljIEpCdXR0b24gZ2V0QmFja0J1dHRvbigpOwotCi0gICAgcHVibGljIHZvaWQgc2V0QmFja0J1dHRvbihKQnV0dG9uIGFCYWNrQnV0dG9uKTsKLQotICAgIHB1YmxpYyBKQnV0dG9uIGdldE5leHRCdXR0b24oKTsKLQotICAgIHB1YmxpYyB2b2lkIHNldE5leHRCdXR0b24oSkJ1dHRvbiBhTmV4dEJ1dHRvbik7Ci0KLSAgICBwdWJsaWMgSkJ1dHRvbiBnZXRDYW5jZWxCdXR0b24oKTsKLQotICAgIHB1YmxpYyB2b2lkIHNldENhbmNlbEJ1dHRvbihKQnV0dG9uIGFDYW5jZWxCdXR0b24pOwotCi0gICAgcHVibGljIEpCdXR0b24gZ2V0RmluaXNoQnV0dG9uKCk7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRGaW5pc2hCdXR0b24oSkJ1dHRvbiBidXR0b24pOwotCi0gICAgcHVibGljIExpc3QgZ2V0V2l6YXJkUGFuZWxMaXN0KCk7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRXaXphcmRQYW5lbExpc3QoTGlzdCBwYW5lbExpc3QpOwotCi0gICAgcHVibGljIGJvb2xlYW4gb25MYXN0UGFuZWwoKTsKLQotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENVUlJFTlRfUEFORUxfUFJPUEVSVFkgPSAiY3VycmVudFBhbmVsIjsKLQotICAgIHB1YmxpYyB2b2lkIGFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpOwotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29scy9jb21wb25lbnQvV2l6YXJkUGFuZWwuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2xzL2NvbXBvbmVudC9XaXphcmRQYW5lbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2IzOTQwLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2xzL2NvbXBvbmVudC9XaXphcmRQYW5lbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50b29scy5jb21wb25lbnQ7Ci0KLWltcG9ydCBqYXZheC5zd2luZy4qOwotCi0vKioKLSAqIHRoaXMgaXMgd2l6YXJkUGFuZWwgaXQgaXMgZXh0ZW5kcyBmcm9tIEpwYW5lbAotICovCi1wdWJsaWMgY2xhc3MgV2l6YXJkUGFuZWwgZXh0ZW5kcyBKUGFuZWwgewotCi0gICAgLy92YXJpYWJsZXMKLQotICAgIHByaXZhdGUgV2l6YXJkQ29tcG9uZW50cyB3aXphcmRDb21wb25lbnRzOwotICAgIHByaXZhdGUgU3RyaW5nIHBhbmVsVG9wVGl0bGU7Ci0gICAgcHJpdmF0ZSBJbWFnZUljb24gcGFuZWxJbWFnZTsKLSAgICBwcml2YXRlIFN0cmluZyAgcGFuZWxCb3R0b21UaXRsZTsKLSAgICBwcml2YXRlIFN0cmluZyBlcnJvcjsKLSAgICBwcml2YXRlIFN0cmluZyBmcmFtZXRpdGxlOwotICAgIHByaXZhdGUgYm9vbGVhbiBmbGFnOwotICAgIHByaXZhdGUgYm9vbGVhbiBwcm9ncmVzc0ZsYWc7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV1NETF8yX0pBVkFfVFlQRSA9IDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSkFWQV8yX1dTRExfVFlQRSA9IDI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VSVklDRV9BUkNISVZFX1RZUEU9MzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTlNQRUNJRklFRF9UWVBFID0gNDsKLSAgICBwcml2YXRlIGJvb2xlYW4gaXNQYWdlQ29tcGxldGUgPSBmYWxzZTsKLQotICAgIHB1YmxpYyBXaXphcmRQYW5lbChXaXphcmRDb21wb25lbnRzIHdpemFyZENvbXBvbmVudHMpIHsKLSAgICAgICAgdGhpcyh3aXphcmRDb21wb25lbnRzLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgV2l6YXJkUGFuZWwoV2l6YXJkQ29tcG9uZW50cyB3aXphcmRDb21wb25lbnRzLCBTdHJpbmcgdGl0bGUpIHsKLSAgICAgICAgdGhpcy53aXphcmRDb21wb25lbnRzID0gd2l6YXJkQ29tcG9uZW50czsKLSAgICAgICAgdGhpcy5mcmFtZXRpdGxlID0gdGl0bGU7Ci0gICAgICAgIGphdmEubmV0LlVSTCByZXNvdXJjZSA9IFdpemFyZFBhbmVsLmNsYXNzLmdldFJlc291cmNlKCIvaWNvbnMvYXNmLWZlYXRoZXIucG5nIik7Ci0gICAgICAgIHNldFBhbmVsSW1hZ2UobmV3IEltYWdlSWNvbihyZXNvdXJjZSkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBuZXh0KCkgewotICAgICAgICBnb05leHQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBiYWNrKCkgewotICAgICAgICBnb0JhY2soKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgV2l6YXJkQ29tcG9uZW50cyBnZXRXaXphcmRDb21wb25lbnRzKCl7Ci0gICAgICAgIHJldHVybiB3aXphcmRDb21wb25lbnRzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFdpemFyZENvbXBvbmVudHMoV2l6YXJkQ29tcG9uZW50cyBhd2l6YXJkQ29tcG9uZW50cyl7Ci0gICAgICAgIHdpemFyZENvbXBvbmVudHMgPSBhd2l6YXJkQ29tcG9uZW50czsKLSAgICB9Ci0gICAgLy8gVGl0bGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhbmVsVG9wVGl0bGUoKSB7Ci0gICAgICAgIHJldHVybiBwYW5lbFRvcFRpdGxlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBhbmVsVG9wVGl0bGUoU3RyaW5nIHRpdGxlKSB7Ci0gICAgICAgIHBhbmVsVG9wVGl0bGUgPSB0aXRsZTsKLSAgICB9Ci0gICAgcHVibGljIFN0cmluZyBnZXRQYW5lbEJvdHRvbVRpdGxlKCkgewotICAgICAgICByZXR1cm4gcGFuZWxCb3R0b21UaXRsZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYW5lbEJvdHRvbVRpdGxlKFN0cmluZyB0aXRsZSkgewotICAgICAgICBwYW5lbEJvdHRvbVRpdGxlID0gdGl0bGU7Ci0gICAgfQotICAgIC8vIEltYWdlCi0gICAgcHVibGljIEltYWdlSWNvbiBnZXRQYW5lbEltYWdlKCl7Ci0gICAgICAgIHJldHVybiBwYW5lbEltYWdlIDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYW5lbEltYWdlKEltYWdlSWNvbiBpbWFnZSl7Ci0gICAgICAgIHBhbmVsSW1hZ2UgPSBpbWFnZTsKLSAgICB9Ci0gICAgLy9lcnJvcgotICAgICBwdWJsaWMgU3RyaW5nICBnZXRFcnJvcigpewotICAgICAgICByZXR1cm4gZXJyb3IgOwotICAgIH0KLQotICAgICBwdWJsaWMgYm9vbGVhbiAgZ2V0RXJyb3JGbGFnKCl7Ci0gICAgICAgIHJldHVybiBmbGFnIDsKLSAgICB9Ci0gICAgcHVibGljIHZvaWQgc2V0RXJyb3IoU3RyaW5nICBlcnJvcixib29sZWFuIGZsYWcpewotICAgICAgICB0aGlzLmVycm9yPWVycm9yOwotICAgICAgICB0aGlzLmZsYWc9ZmxhZzsKLSAgICB9Ci0gICAgLy8gcHJvZ3Jlc3MgcGFuZWwgdmlzaWJsZSBmbGFnCi0gICAgcHVibGljIHZvaWQgc2V0UHJvZ3Jlc3NQYW5lbFZpc2libGUoYm9vbGVhbiBmbGFnKSB7Ci0gICAgICAgIHRoaXMucHJvZ3Jlc3NGbGFnID0gZmxhZzsKLSAgICB9Ci0gICAgcHVibGljIGJvb2xlYW4gZ2V0UHJvZ3Jlc3NQYW5lbFZpc2libGUoKSB7Ci0gICAgICAgIHJldHVybiBwcm9ncmVzc0ZsYWc7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRGcmFtZVRpdGxlKCl7Ci0gICAgICAgICByZXR1cm4gdGhpcy5mcmFtZXRpdGxlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEZyYW1lVGl0bGUoU3RyaW5nIHRpdGxlKXsKLSAgICAgICAgdGhpcy5mcmFtZXRpdGxlPXRpdGxlOwotICAgIH0KLSAgICAvLyBuZXh0Ci0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZ29OZXh0KCkgewotICAgICAgICBpZiAod2l6YXJkQ29tcG9uZW50cy5nZXRXaXphcmRQYW5lbExpc3QoKS5zaXplKCkgPiB3aXphcmRDb21wb25lbnRzLmdldEN1cnJlbnRJbmRleCgpKzEgKSB7Ci0gICAgICAgICAgICB3aXphcmRDb21wb25lbnRzLnNldEN1cnJlbnRJbmRleCh3aXphcmRDb21wb25lbnRzLmdldEN1cnJlbnRJbmRleCgpKzEpOwotICAgICAgICAgICAgd2l6YXJkQ29tcG9uZW50cy51cGRhdGVDb21wb25lbnRzKCk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLSAgICAvL2JhY2sKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBnb0JhY2soKSB7Ci0gICAgICAgIGlmICh3aXphcmRDb21wb25lbnRzLmdldEN1cnJlbnRJbmRleCgpLTEgPj0gMCkgewotICAgICAgICAgICAgd2l6YXJkQ29tcG9uZW50cy5zZXRDdXJyZW50SW5kZXgod2l6YXJkQ29tcG9uZW50cy5nZXRDdXJyZW50SW5kZXgoKS0xKTsKLSAgICAgICAgICAgIHdpemFyZENvbXBvbmVudHMudXBkYXRlQ29tcG9uZW50cygpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc3dpdGNoUGFuZWwoaW50IHBhbmVsSW5kZXgpIHsKLSAgICAgICAgZ2V0V2l6YXJkQ29tcG9uZW50cygpLnNldEN1cnJlbnRJbmRleChwYW5lbEluZGV4KTsKLSAgICAgICAgZ2V0V2l6YXJkQ29tcG9uZW50cygpLnVwZGF0ZUNvbXBvbmVudHMoKTsKLSAgICB9Ci0gICAgLyoqIHRoaXMgbWV0aG9kIHVzZWQgZm9yIHNldCBCdXR0b24gRW5hYmxlZCAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldEJhY2tCdXR0b25FbmFibGVkKGJvb2xlYW4gc2V0KSB7Ci0gICAgICAgIHdpemFyZENvbXBvbmVudHMuZ2V0QmFja0J1dHRvbigpLnNldEVuYWJsZWQoc2V0KTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXROZXh0QnV0dG9uRW5hYmxlZChib29sZWFuIHNldCkgewotICAgICAgICB3aXphcmRDb21wb25lbnRzLmdldE5leHRCdXR0b24oKS5zZXRFbmFibGVkKHNldCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0RmluaXNoQnV0dG9uRW5hYmxlZChib29sZWFuIHNldCkgewotICAgICAgICB3aXphcmRDb21wb25lbnRzLmdldEZpbmlzaEJ1dHRvbigpLnNldEVuYWJsZWQoc2V0KTsKLSAgICB9Ci0KLSAgICAvKiogdGhpcyBtZXRob2QgdXNlZCBmb3IgdG8gZ2V0IHR5cGUgIG9mIHdpemFyZCBwYW5lbCovCi0gICAgcHVibGljICBpbnQgZ2V0UGFnZVR5cGUoKSB7Ci0gICAgICAgIHJldHVybiAgV2l6YXJkUGFuZWwuVU5TUEVDSUZJRURfVFlQRTsKLSAgICB9Ci0gICAgLyoqIHRoaXMgbWV0aG9kIHVzZWQgZm9yIGNoZWNrIGlzIHBhZ2UgY29tcGxldGUgKi8KLSAgICBwdWJsaWMgIGJvb2xlYW4gaXNQYWdlQ29tcGxldGUoKSB7Ci0gICAgICAgIHJldHVybiAgaXNQYWdlQ29tcGxldGU7Ci0gICAgfQotICAgIC8qKiB0aGlzIG1ldGhvZCB1c2VkIGZvciBzZXQgcGFnZSBjb21wbGV0ZSovCi0gICAgcHVibGljIHZvaWQgc2V0UGFnZUNvbXBsZXRlKGJvb2xlYW4gY29tcGxldGUpIHsKLSAgICAgICAgaXNQYWdlQ29tcGxldGUgPSBjb21wbGV0ZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2xzL2lkZWEvQWN0aW9uc1BsdWdpbi5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbHMvaWRlYS9BY3Rpb25zUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0NGExZWUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbHMvaWRlYS9BY3Rpb25zUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudG9vbHMuaWRlYTsKLQotaW1wb3J0IGNvbS5pbnRlbGxpai5vcGVuYXBpLmNvbXBvbmVudHMuQXBwbGljYXRpb25Db21wb25lbnQ7Ci0KLS8qKgotICogPGgzPlNhbXBsZUFwcGxpY2F0aW9uUGx1Z2luPC9oMz4KLSAqIDxwLz4KLSAqIEFwcGxpY2F0aW9uIGxldmVsIHBsdWdpbiBzYW1wbGUgc2hvd2luZyBJREVBIDxiPk9wZW5BUEk8L2I+IGJhc2ljcy48YnI+Ci0gKiBJbXBsZW1lbnRzIDxjb2RlPkFwcGxpY2F0aW9uQ29tcG9uZW50PC9jb2RlPiBpbnRlcmZhY2UuCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpb25zUGx1Z2luIGltcGxlbWVudHMgQXBwbGljYXRpb25Db21wb25lbnQgewotCi0gICAgLyoqCi0gICAgICogTWV0aG9kIGlzIGNhbGxlZCBhZnRlciBwbHVnaW4gaXMgYWxyZWFkeSBjcmVhdGVkIGFuZCBjb25maWd1cmVkLiBQbHVnaW4gY2FuIHN0YXJ0IHRvIGNvbW11bmljYXRlIHdpdGgKLSAgICAgKiBvdGhlciBwbHVnaW5zIG9ubHkgaW4gdGhpcyBtZXRob2QuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW5pdENvbXBvbmVudCgpIHsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbiBwbHVnaW4gZGlzcG9zYWwuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZUNvbXBvbmVudCgpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIGNvbXBvbmVudAotICAgICAqCi0gICAgICogQHJldHVybiBTdHJpbmcgcmVwcmVzZW50aW5nIGNvbXBvbmVudCBuYW1lLiBVc2UgUGx1Z2luTmFtZS5Db21wb25lbnROYW1lIG5vdGF0aW9uCi0gICAgICogICAgICAgICB0byBhdm9pZCBjb25mbGljdHMuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRDb21wb25lbnROYW1lKCkgewotICAgICAgICByZXR1cm4gIkFjdGlvbnNTYW1wbGUuQWN0aW9uc1BsdWdpbiI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbHMvaWRlYS9DaG9vc2VyUGFuZWwuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2xzL2lkZWEvQ2hvb3NlclBhbmVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmZWQ1ZDcuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbHMvaWRlYS9DaG9vc2VyUGFuZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudG9vbHMuaWRlYTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbHMuY29tcG9uZW50LldpemFyZENvbXBvbmVudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29scy5jb21wb25lbnQuV2l6YXJkUGFuZWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29scy53aXphcmRmcmFtZS5Db2RlZ2VuRnJhbWU7Ci0KLWltcG9ydCBqYXZheC5zd2luZy4qOwotaW1wb3J0IGphdmF4LnN3aW5nLmJvcmRlci5FbXB0eUJvcmRlcjsKLWltcG9ydCBqYXZhLmF3dC4qOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkV2ZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkxpc3RlbmVyOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50Lkl0ZW1FdmVudDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5JdGVtTGlzdGVuZXI7Ci0KLS8qKgotICogdGhpcyBwYW5lbCB1c2VkIGZvciBhcyBjaG9vc2VyCi0gKiAgICAgIGphdmEyd3NkbCBjb2RlZ2VuIG9wdGlvbgotICogICAgICB3c2RsMmphdmEgIGNvZGVnZW4gb3B0aW9uCi0gKgotICogZXh0ZW5kIGZyb20gd2l6YXJkUGFuZWwgY2Fsc3MKLSAqLwotCi1wdWJsaWMgY2xhc3MgQ2hvb3NlclBhbmVsICBleHRlbmRzIFdpemFyZFBhbmVsIHsKLSAgICAvKioKLSAgICAgKiB2YXJpYWxiYWxlcwotICAgICAqLwotICAgIHByaXZhdGUgSkJ1dHRvbiBidG5IaW50OwotICAgIHByaXZhdGUgSkxhYmVsIGxibEhpbnQ7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGZsYWc9ZmFsc2U7Ci0gICAgcHJpdmF0ZSBKUmFkaW9CdXR0b24gb3B0aW9uSjJXUmFkaW9CdXR0b247Ci0gICAgcHJpdmF0ZSBKUmFkaW9CdXR0b24gb3B0aW9uVzJKUmFkaW9CdXR0b247Ci0gICAgcHJpdmF0ZSBKUmFkaW9CdXR0b24gb3B0aW9uU2VydmljZUFyY2hpdmVyUmFkaW9CdXR0b247Ci0gICAgcHJpdmF0ZSBCdXR0b25Hcm91cCBiZzsKLSAgICBwcml2YXRlIGNoYXIgc2VsZWN0ZWRPcHRpb24gPSAnQSc7IC8vICdOJyBpcyBubyBvcHRpb24gc2VsZWN0ZWQgICdBJywgJ0InLCdDJyAmICdGJyBzdGFuZHMgZm9yIG9wdGlvbnMKLSAgICBmaW5hbCBwcml2YXRlIFN0cmluZyBoaW50PSJZb3UgY2FuIGdlbmVyYXRlIGphdmEgY29kZSBmcm9tIGEgV1NETCBvciBXU0RMIGZyb20gYSBqYXZhIHNvdXJjZSBmaWxlLiI7Ci0gICAgLyoqCi0gICAgICogY29uc3RydWN0IG1ldGhvZCBmb3IgY2hvb3NlclBhbmVsCi0gICAgICogIEBwYXJhbSB3aXphcmRDb21wb25lbnRzCi0gICAgICovCi0KLSAgICBwdWJsaWMgQ2hvb3NlclBhbmVsKFdpemFyZENvbXBvbmVudHMgd2l6YXJkQ29tcG9uZW50cyl7Ci0KLSAgICAgICAgc3VwZXIod2l6YXJkQ29tcG9uZW50cywgIkF4aXMyIElkZWEgUGx1Z2luIFdpemFyZHMiKTsKLSAgICAgICAgc2V0UGFuZWxUb3BUaXRsZSgiU2VsZWN0IHRoZSB3aXphcmQiKTsKLSAgICAgICAgc2V0UGFuZWxCb3R0b21UaXRsZSgiV2VsY29tZSB0byB0aGUgQXhpczIgY29kZSBnZW5lcmF0b3Igd2l6YXJkIik7Ci0gICAgICAgIGluaXQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQYW5lbCBpbml0aWFsIG1ldGhvZAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBpbml0KCl7Ci0KLSAgICAgICAgbGJsSGludCA9bmV3IEpMYWJlbCgiIik7Ci0gICAgICAgIGJ0bkhpbnQgPW5ldyBKQnV0dG9uKCJIaW50ID4+Iik7Ci0gICAgICAgIGJ0bkhpbnQuc2V0Qm9yZGVyKG5ldyBFbXB0eUJvcmRlcihuZXcgSW5zZXRzKDAsMCwwLDApKSk7Ci0KLSAgICAgICAgb3B0aW9uVzJKUmFkaW9CdXR0b24gPSBuZXcgSlJhZGlvQnV0dG9uKCJHZW5lcmF0ZSBqYXZhIHNvcmNlIGNvZGUgZnJvbSBhIFdTRGwgZmlsZS4iLHRydWUpOwotICAgICAgICBvcHRpb25KMldSYWRpb0J1dHRvbiA9IG5ldyBKUmFkaW9CdXR0b24oIkdlbmVyYXRlIGEgV1NEbCBmcm9tIGEgamF2YSBzb3VyY2UgZmlsZSIsZmFsc2UpOwotICAgICAgICBvcHRpb25TZXJ2aWNlQXJjaGl2ZXJSYWRpb0J1dHRvbiA9IG5ldyBKUmFkaW9CdXR0b24oIkNyZWF0ZSBTZXJ2aWNlIEFyY2hpdmVyIixmYWxzZSk7Ci0gICAgICAgIEJ1dHRvbkdyb3VwIGJnID0gbmV3IEJ1dHRvbkdyb3VwKCk7Ci0gICAgICAgIGJnLmFkZChvcHRpb25KMldSYWRpb0J1dHRvbik7Ci0gICAgICAgIGJnLmFkZChvcHRpb25XMkpSYWRpb0J1dHRvbik7Ci0gICAgICAgIGJnLmFkZChvcHRpb25TZXJ2aWNlQXJjaGl2ZXJSYWRpb0J1dHRvbik7Ci0KLSAgICAgICAgdGhpcy5zZXRMYXlvdXQobmV3IEdyaWRCYWdMYXlvdXQoKSApOwotCi0KLSAgICAgICAgdGhpcy5hZGQobmV3IEpMYWJlbCgiUGxlYXNlIHNwZWNpZnkgd2hhdCB5b3Ugd2FudCB0byBkby4iKQotICAgICAgICAgICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygwLCAwLCAxLCAxLCAxLjAsIDAuMAotICAgICAgICAgICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLk5PUlRIV0VTVCAsIEdyaWRCYWdDb25zdHJhaW50cy5OT05FCi0gICAgICAgICAgICAgICAgLCBuZXcgSW5zZXRzKDEwLCAyMCwgMCwwKSwgMCwgMCkpOwotCi0gICAgICAgIC8vIG9wdGlvbiBidXR0b24gZm9yIGphdmEyd3NkbAotICAgICAgICBvcHRpb25XMkpSYWRpb0J1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICB0aGlzLmFkZChvcHRpb25XMkpSYWRpb0J1dHRvbgotICAgICAgICAgICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygwLCAxLCAxLCAxLCAxLjAsIDAuMAotICAgICAgICAgICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLk5PUlRIV0VTVCAsIEdyaWRCYWdDb25zdHJhaW50cy5OT05FCi0gICAgICAgICAgICAgICAgLCBuZXcgSW5zZXRzKDEwLCAyMCwgMCwwKSwgMCwgMCkpOwotICAgICAgICBvcHRpb25XMkpSYWRpb0J1dHRvbi5hZGRJdGVtTGlzdGVuZXIobmV3IEl0ZW1MaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGl0ZW1TdGF0ZUNoYW5nZWQoSXRlbUV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBpZiAoZS5nZXRTdGF0ZUNoYW5nZSgpID09IEl0ZW1FdmVudC5TRUxFQ1RFRCkgewotICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZE9wdGlvbiA9ICdBJzsKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICAvLyBvcHRpb24gYnV0dG9uIGZvciB3c2RsMmphdmEKLQotICAgICAgICB0aGlzLmFkZChvcHRpb25KMldSYWRpb0J1dHRvbgotICAgICAgICAgICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygwLCAyLCAxLCAxLCAxLjAsIDAuMAotICAgICAgICAgICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLk5PUlRIV0VTVCAsIEdyaWRCYWdDb25zdHJhaW50cy5OT05FCi0gICAgICAgICAgICAgICAgLCBuZXcgSW5zZXRzKDEwLCAyMCwgMCwwKSwgMCwgMCkpOwotICAgICAgICBvcHRpb25KMldSYWRpb0J1dHRvbi5hZGRJdGVtTGlzdGVuZXIobmV3IEl0ZW1MaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGl0ZW1TdGF0ZUNoYW5nZWQoSXRlbUV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBpZiAoZS5nZXRTdGF0ZUNoYW5nZSgpID09IEl0ZW1FdmVudC5TRUxFQ1RFRCkgewotICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZE9wdGlvbiA9ICdCJzsKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgLy8gb3B0aW9uIGJ1dHRvbiBmb3Igc2VydmljZSBBcmNoaXZlCi0KLSAgICAgICAgICAgIHRoaXMuYWRkKG9wdGlvblNlcnZpY2VBcmNoaXZlclJhZGlvQnV0dG9uCi0gICAgICAgICAgICAgICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygwLCAzLCAxLCAxLCAxLjAsIDAuMAotICAgICAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5OT1JUSFdFU1QgLCBHcmlkQmFnQ29uc3RyYWludHMuTk9ORQotICAgICAgICAgICAgICAgICAgICAsIG5ldyBJbnNldHMoMTAsIDIwLCAwLDApLCAwLCAwKSk7Ci0gICAgICAgICAgICBvcHRpb25TZXJ2aWNlQXJjaGl2ZXJSYWRpb0J1dHRvbiAuYWRkSXRlbUxpc3RlbmVyKG5ldyBJdGVtTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgaXRlbVN0YXRlQ2hhbmdlZChJdGVtRXZlbnQgZSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoZS5nZXRTdGF0ZUNoYW5nZSgpID09IEl0ZW1FdmVudC5TRUxFQ1RFRCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRPcHRpb24gPSAnQyc7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGUoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotCi0KLSAgICAgICAgLy8gaGludCBidXR0b24KLQotICAgICAgICB0aGlzLmFkZChidG5IaW50LAotICAgICAgICAgICAgICAgIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMCw0LCAxLCAxLCAxLjAsMC4wCi0gICAgICAgICAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5OT1JUSFdFU1QgLCBHcmlkQmFnQ29uc3RyYWludHMuTk9ORQotICAgICAgICAgICAgICAgICAgICAgICAgLCBuZXcgSW5zZXRzKDEwLCAyMCwgMCwwKSwgMCwgMCkpOwotICAgICAgICBidG5IaW50LmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpICB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGlmKGZsYWcpewotICAgICAgICAgICAgICAgICAgICBidG5IaW50LnNldFRleHQoIkhpbnQgPj4iKTsKLSAgICAgICAgICAgICAgICAgICAgbGJsSGludC5zZXRUZXh0KCIiKTsKLSAgICAgICAgICAgICAgICAgICAgZmxhZz1mYWxzZTsKLSAgICAgICAgICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgYnRuSGludC5zZXRUZXh0KCJIaW50IDw8Iik7Ci0gICAgICAgICAgICAgICAgICAgIGxibEhpbnQuc2V0VGV4dChoaW50KTsKLSAgICAgICAgICAgICAgICAgICAgZmxhZz10cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB1cGRhdGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgLy8gaGludCBsYWJsZQotCi0gICAgICAgIHRoaXMuYWRkKGxibEhpbnQsCi0gICAgICAgICAgICAgICAgbmV3IEdyaWRCYWdDb25zdHJhaW50cygwLCA1LCAxLCAxLCAxLjAsIDEuMAotICAgICAgICAgICAgICAgICAgICAgICAgLCBHcmlkQmFnQ29uc3RyYWludHMuTk9SVEhXRVNUICwgR3JpZEJhZ0NvbnN0cmFpbnRzLk5PTkUKLSAgICAgICAgICAgICAgICAgICAgICAgICwgbmV3IEluc2V0cygxMCwgMjAsIDAsMCksIDAsIDApKTsKLQotCi0gICAgICAgIHNldE5leHRCdXR0b25FbmFibGVkKChzZWxlY3RlZE9wdGlvbiA9PSAnQScpIHx8IChzZWxlY3RlZE9wdGlvbiA9PSAnQicpICk7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBtZXRob2QgZm9yIHVwZGF0ZSB3aGVuIHBhbmVsIGhhcyBzb21lIGNoYW5nZQotICAgICAqLwotCi0gICAgcHVibGljIHZvaWQgdXBkYXRlKCkgewotICAgICAgICBzZXROZXh0QnV0dG9uRW5hYmxlZCgoc2VsZWN0ZWRPcHRpb24gPT0gJ0EnKSB8fCAoc2VsZWN0ZWRPcHRpb24gPT0gJ0InKSB8fChzZWxlY3RlZE9wdGlvbiA9PSAnQycpKTsKLSAgICAgICAgc2V0QmFja0J1dHRvbkVuYWJsZWQoZmFsc2UpOyAvLyB0aGVyZSBpcyBubyB3YXkgYmFjawotICAgICAgICBzZXRQcm9ncmVzc1BhbmVsVmlzaWJsZShmYWxzZSk7Ci0gICAgICAgIHNldFBhZ2VDb21wbGV0ZSh0cnVlKTsgICAgICAgICAgCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogbWV0aG9kIGZvciBuZXh0IGJ1dHRvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG5leHQoKSB7Ci0gICAgICAgIGlmIChzZWxlY3RlZE9wdGlvbiA9PSAnQScpIHsKLSAgICAgICAgICAgIHN3aXRjaFBhbmVsKENvZGVnZW5GcmFtZS5QQU5FTF9GSVJTVF9BKSA7Ci0KLSAgICAgICAgfSBlbHNlIGlmIChzZWxlY3RlZE9wdGlvbiA9PSAnQicpIHsKLSAgICAgICAgICAgIHN3aXRjaFBhbmVsKENvZGVnZW5GcmFtZS5QQU5FTF9GSVJTVF9CICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoc2VsZWN0ZWRPcHRpb24gPT0gJ0MnKSB7Ci0gICAgICAgICAgICBzd2l0Y2hQYW5lbChDb2RlZ2VuRnJhbWUuUEFORUxfRklSU1RfQyApOwotICAgICAgICB9Ci0gICAgICAgIHNldE5leHRCdXR0b25FbmFibGVkKGZhbHNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBtZXRob2RkIGZvciBiYWNrIGJ1dHRvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGJhY2soKSB7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbHMvaWRlYS9GaXJzdFBhbmVsLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29scy9pZGVhL0ZpcnN0UGFuZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZjNjdlZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29scy9pZGVhL0ZpcnN0UGFuZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudG9vbHMuaWRlYTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbHMuYmVhbi5Db2RlZ2VuQmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRvb2xzLmNvbXBvbmVudC5XaXphcmRDb21wb25lbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbHMuY29tcG9uZW50LldpemFyZFBhbmVsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbHMud2l6YXJkZnJhbWUuQ29kZWdlbkZyYW1lOwotCi1pbXBvcnQgamF2YXguc3dpbmcuKjsKLWltcG9ydCBqYXZheC5zd2luZy5ib3JkZXIuRW1wdHlCb3JkZXI7Ci1pbXBvcnQgamF2YXgud3NkbC5XU0RMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuYXd0Lio7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uRXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1wdWJsaWMgY2xhc3MgRmlyc3RQYW5lbCBleHRlbmRzIFdpemFyZFBhbmVsIHsKLQotICAgIHByaXZhdGUgSkxhYmVsIGxibFdTREw7Ci0gICAgcHJpdmF0ZSBKVGV4dEZpZWxkIHR4dFdTREw7Ci0gICAgcHJpdmF0ZSBKQnV0dG9uIGJ0bkJyb3dzZTsKLSAgICBwcml2YXRlIEpCdXR0b24gYnRuSGludDsKLSAgICBwcml2YXRlIEpMYWJlbCBsYmxIaW50OwotICAgIHByaXZhdGUgYm9vbGVhbiBmbGFnPWZhbHNlOwotICAgIGZpbmFsIHByaXZhdGUgU3RyaW5nIGhpbnQ9IllvdSBjYW4gc2VsZWN0IG9ubHkgKi53c2RsLyoueG1sIGZpbGUgbG9jYXRpb24uIjsKLQotCi0gICAgZmluYWwgSkZpbGVDaG9vc2VyIEZpbGVDaG9vc2VyID1uZXcgSkZpbGVDaG9vc2VyKCk7Ci0KLSAgICBwcml2YXRlIENvZGVnZW5CZWFuIGNvZGVnZW5CZWFuOwotCi0gICAgcHVibGljIEZpcnN0UGFuZWwoV2l6YXJkQ29tcG9uZW50cyB3aXphcmRDb21wb25lbnRzLENvZGVnZW5CZWFuIGNvZGVnZW5CZWFuKSB7Ci0gICAgICAgIHN1cGVyKHdpemFyZENvbXBvbmVudHMsICJBeGlzMiBJZGVhIFBsdWdpbiBXU0RMMkphdmEgV2l6YXJkcyIpOwotICAgICAgICB0aGlzLmNvZGVnZW5CZWFuPWNvZGVnZW5CZWFuOwotICAgICAgICBzZXRQYW5lbFRvcFRpdGxlKCJXU0RMIHNlbGVjdGlvbiBwYWdlIik7Ci0gICAgICAgIHNldFBhbmVsQm90dG9tVGl0bGUoInBsZWFzZSBTZWxlY3QgdGhlIFdTRGwgZmlsZSBsb2NhdGlvbiIpOwotICAgICAgICBpbml0KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGluaXQoKXsKLQotICAgICAgICBsYmxIaW50ID1uZXcgSkxhYmVsKCIiKTsKLSAgICAgICAgYnRuSGludCA9bmV3IEpCdXR0b24oIkhpbnQgPj4iKTsKLSAgICAgICAgYnRuSGludC5zZXRCb3JkZXIobmV3IEVtcHR5Qm9yZGVyKG5ldyBJbnNldHMoMCwwLDAsMCkpKTsKLQotICAgICAgICB0aGlzLnNldExheW91dChuZXcgR3JpZEJhZ0xheW91dCgpKTsKLSAgICAgICAgbGJsV1NETCA9bmV3IEpMYWJlbCgiV1NETCBGaWxlIExvY2F0aW9uIik7Ci0gICAgICAgIHR4dFdTREwgPW5ldyBKVGV4dEZpZWxkKCk7Ci0gICAgICAgIGJ0bkJyb3dzZSA9IG5ldyBKQnV0dG9uKCJCcm93c2UiKTsKLQotICAgICAgICB0aGlzLnNldExheW91dChuZXcgR3JpZEJhZ0xheW91dCgpKTsKLSAgICAgICAgdGhpcy5hZGQobGJsV1NETAotICAgICAgICAgICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygwLCAwLCAxLCAxLCAwLjEsIDAuMAotICAgICAgICAgICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLk5PUlRIV0VTVCAsIEdyaWRCYWdDb25zdHJhaW50cy5OT05FCi0gICAgICAgICAgICAgICAgLCBuZXcgSW5zZXRzKDUsIDEwLCAwLDEwKSwgMCwgMCkpOwotCi0gICAgICAgIHRoaXMuYWRkKHR4dFdTREwKLSAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMSwgMCwgR3JpZEJhZ0NvbnN0cmFpbnRzLlJFTEFUSVZFLCAxLCAyLjAsIDAuMAotICAgICAgICAgICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLkNFTlRFUiAgLCBHcmlkQmFnQ29uc3RyYWludHMuSE9SSVpPTlRBTAotICAgICAgICAgICAgICAgICwgbmV3IEluc2V0cyg1LCAxMCwgMCwgMTApLCAwLCAwKSk7Ci0KLSAgICAgICAgdGhpcy5hZGQoYnRuQnJvd3NlCi0gICAgICAgICAgICAgICAgLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDIsIDAsIDEsIDEsIDAuMSwgMC4wCi0gICAgICAgICAgICAgICAgLCBHcmlkQmFnQ29uc3RyYWludHMuQ0VOVEVSICwgR3JpZEJhZ0NvbnN0cmFpbnRzLk5PTkUKLSAgICAgICAgICAgICAgICAsIG5ldyBJbnNldHMoNSwgMTAsIDAsMTApLCAwLCAwKSk7Ci0gICAgICAgIGJ0bkJyb3dzZS5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSAgewotICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBGaWxlQ2hvb3Nlci5zZXRGaWxlRmlsdGVyKG5ldyBXU0RMRmlsZUZpbHRlcigpKTsKLSAgICAgICAgICAgICAgICBpbnQgcmV0dXJuVmFsID0gRmlsZUNob29zZXIuc2hvd09wZW5EaWFsb2coYnRuQnJvd3NlKTsKLSAgICAgICAgICAgICAgICBpZiAocmV0dXJuVmFsID09IEpGaWxlQ2hvb3Nlci5BUFBST1ZFX09QVElPTikgewotICAgICAgICAgICAgICAgICAgICBGaWxlIGZpbGUgPSBGaWxlQ2hvb3Nlci5nZXRTZWxlY3RlZEZpbGUoKTsKLSAgICAgICAgICAgICAgICAgICAgdHh0V1NETC5zZXRUZXh0KGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgICAgICAgICAgICAgICAgICBjb2RlZ2VuQmVhbi5zZXRXU0RMRmlsZU5hbWUoZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgdGhpcy5hZGQoYnRuSGludCwKLSAgICAgICAgICAgICAgICBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDAsIDEsIDEsIDEsIDAuMSwwLjAKLSAgICAgICAgICAgICAgICAgICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLk5PUlRIV0VTVCwgR3JpZEJhZ0NvbnN0cmFpbnRzLk5PTkUKLSAgICAgICAgICAgICAgICAgICAgICAgICwgbmV3IEluc2V0cyg1LCAxMCwgMCwgMTApLCAwLCAwKSk7Ci0gICAgICAgIGJ0bkhpbnQuYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgaWYoZmxhZyl7Ci0gICAgICAgICAgICAgICAgICAgIGJ0bkhpbnQuc2V0VGV4dCgiSGludCA+PiIpOwotICAgICAgICAgICAgICAgICAgICBsYmxIaW50LnNldFRleHQoIiIpOwotICAgICAgICAgICAgICAgICAgICBmbGFnPWZhbHNlOwotICAgICAgICAgICAgICAgIH1lbHNlewotICAgICAgICAgICAgICAgICAgICBidG5IaW50LnNldFRleHQoIkhpbnQgPDwiKTsKLSAgICAgICAgICAgICAgICAgICAgbGJsSGludC5zZXRUZXh0KGhpbnQpOwotICAgICAgICAgICAgICAgICAgICBmbGFnPXRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICB0aGlzLmFkZChsYmxIaW50ICwKLSAgICAgICAgICAgICAgICBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDAsIDIsIEdyaWRCYWdDb25zdHJhaW50cy5SRU1BSU5ERVIsIDEsIDAuMSwgMS4wCi0gICAgICAgICAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5OT1JUSFdFU1QgLCBHcmlkQmFnQ29uc3RyYWludHMuSE9SSVpPTlRBTAotICAgICAgICAgICAgICAgICAgICAgICAgLCBuZXcgSW5zZXRzKDUsIDEwLCAwLDEwKSwgMCwgMCkpOwotCi0gICAgICAgIHRoaXMuc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyB2b2lkIG5leHQoKSB7Ci0gICAgICAgIGlmKHR4dFdTREwuZ2V0VGV4dCgpIT1udWxsICYmIGlzUGFnZUNvbXBsZXRlKCkpewotICAgICAgICAgICAgY29kZWdlbkJlYW4uc2V0V1NETEZpbGVOYW1lKHR4dFdTREwuZ2V0VGV4dCgpKTsKLSAgICAgICAgICAgIHN3aXRjaFBhbmVsKENvZGVnZW5GcmFtZS5QQU5FTF9PUFRJT05fQSApOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIHN3aXRjaFBhbmVsKENvZGVnZW5GcmFtZS5QQU5FTF9GSVJTVF9BICk7Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIGJhY2soKSB7Ci0gICAgICAgIHN3aXRjaFBhbmVsKENvZGVnZW5GcmFtZS5QQU5FTF9DSE9PU0VSICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdXBkYXRlKCl7Ci0gICAgICAgIGlmKCF0eHRXU0RMLmdldFRleHQoKS50cmltKCkuZXF1YWxzKCIiKSl7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGNvZGVnZW5CZWFuLnJlYWRXU0RMKCk7Ci0gICAgICAgICAgICAgICAgc2V0TmV4dEJ1dHRvbkVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgc2V0RmluaXNoQnV0dG9uRW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgc2V0UGFnZUNvbXBsZXRlKHRydWUpOwotICAgICAgICAgICAgfSBjYXRjaCAoV1NETEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgc2V0TmV4dEJ1dHRvbkVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgIHNldEZpbmlzaEJ1dHRvbkVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgIHNldFBhZ2VDb21wbGV0ZShmYWxzZSk7Ci0gICAgICAgICAgICAgICAgSk9wdGlvblBhbmUuc2hvd01lc3NhZ2VEaWFsb2codGhpcywgIkFuIGVycm9yIG9jY3VyZWQgd2hpbGUgcGFyc2luZyB0aGUgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAic3BlY2lmaWVkIFdTREwuIFBsZWFzZSBtYWtlIHN1cmUgdGhhdCB0aGUgc2VsZWN0ZWQgZmlsZSBpcyBhIHZhbGlkIFdTREwuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciEiLCBKT3B0aW9uUGFuZS5FUlJPUl9NRVNTQUdFKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICBzZXROZXh0QnV0dG9uRW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICBzZXRGaW5pc2hCdXR0b25FbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgIHNldFBhZ2VDb21wbGV0ZShmYWxzZSk7Ci0gICAgICAgIH0KLSAgICAgICAgc2V0QmFja0J1dHRvbkVuYWJsZWQodHJ1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljICBpbnQgZ2V0UGFnZVR5cGUoKSB7Ci0gICAgICAgIHJldHVybiAgV2l6YXJkUGFuZWwuV1NETF8yX0pBVkFfVFlQRTsKLSAgICB9Ci0gICAgIHB1YmxpYyBTdHJpbmcgZ2V0V1NETEZpbGVOYW1lKCl7Ci0gICAgICAgcmV0dXJuIHR4dFdTREwuZ2V0VGV4dCgpLnRyaW0oKTsKLSAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbHMvaWRlYS9QYWNrYWdlTmFtZVRhYmxlTW9kZWwuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2xzL2lkZWEvUGFja2FnZU5hbWVUYWJsZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzNGIzYjcuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbHMvaWRlYS9QYWNrYWdlTmFtZVRhYmxlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50b29scy5pZGVhOwotCi1pbXBvcnQgamF2YXguc3dpbmcudGFibGUuQWJzdHJhY3RUYWJsZU1vZGVsOwotCi0vKioKLSAqIENyZWF0ZWQgYnkgSW50ZWxsaUogSURFQS4KLSAqIFVzZXI6IGtlaXRoCi0gKiBEYXRlOiAyMS8xMC8yMDA2Ci0gKiBUaW1lOiAxNDoyNzo0MAotICogVG8gY2hhbmdlIHRoaXMgdGVtcGxhdGUgdXNlIEZpbGUgfCBTZXR0aW5ncyB8IEZpbGUgVGVtcGxhdGVzLgotICovCi0KLQotcHVibGljIGNsYXNzIFBhY2thZ2VOYW1lVGFibGVNb2RlbCBleHRlbmRzIEFic3RyYWN0VGFibGVNb2RlbCB7Ci0gICAgT2JqZWN0IFtdIFtdIHRhYmxlRGF0YTsKLQotCi0gICAgcHVibGljIFBhY2thZ2VOYW1lVGFibGVNb2RlbChPYmplY3RbXVtdIHRhYmxlRGF0YSkgewotICAgICAgICB0aGlzLnRhYmxlRGF0YSA9IHRhYmxlRGF0YTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRUYWJsZURhdGEoT2JqZWN0IFtdW10gdGFibGVEYXRhKSB7Ci0gICAgICAgIHRoaXMudGFibGVEYXRhID0gdGFibGVEYXRhOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uTmFtZShpbnQgYykKLSAgIHsKLSAgICAgIHJldHVybiBjb2x1bW5OYW1lc1tjXTsKLSAgIH0KLQotICAgcHVibGljIENsYXNzIGdldENvbHVtbkNsYXNzKGludCBjKQotICAgewotICAgICAgcmV0dXJuIHRhYmxlRGF0YVswXVtjXS5nZXRDbGFzcygpOwotICAgfQotCi0gICBwdWJsaWMgaW50IGdldENvbHVtbkNvdW50KCkKLSAgIHsKLSAgICAgIHJldHVybiB0YWJsZURhdGFbMF0ubGVuZ3RoOwotICAgfQotCi0gICBwdWJsaWMgaW50IGdldFJvd0NvdW50KCkKLSAgIHsKLSAgICAgIHJldHVybiB0YWJsZURhdGEubGVuZ3RoOwotICAgfQotCi0gICBwdWJsaWMgT2JqZWN0IGdldFZhbHVlQXQoaW50IHIsIGludCBjKQotICAgewotICAgICAgcmV0dXJuIHRhYmxlRGF0YVtyXVtjXTsKLSAgIH0KLQotICAgcHVibGljIHZvaWQgc2V0VmFsdWVBdChPYmplY3Qgb2JqLCBpbnQgciwgaW50IGMpCi0gICB7Ci0gICAgICB0YWJsZURhdGFbcl1bY10gPSBvYmo7Ci0gICB9Ci0KLSAgIHB1YmxpYyBib29sZWFuIGlzQ2VsbEVkaXRhYmxlKGludCByLCBpbnQgYykKLSAgIHsKLSAgICAgIHJldHVybiAgYyA9PSBQQUNLQUdFTkFNRV9DT0xVTU47Ci0KLSAgIH0KLQotICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTkFNRVNQQUNFX0NPTFVNTiA9IDA7Ci0gICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQQUNLQUdFTkFNRV9DT0xVTU4gPSAxOwotCi0KLQotICAgcHJpdmF0ZSBTdHJpbmdbXSBjb2x1bW5OYW1lcyA9Ci0gICB7Ci0gICAgICAiTmFtZXNwYWNlIiwgIkN1c3RvbSBQYWNrYWdlIE5hbWUiCi0gICB9OwotfQotCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29scy9pZGVhL1BsdWdpbkNsYXNzTG9hZGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29scy9pZGVhL1BsdWdpbkNsYXNzTG9hZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3OGYxOGYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbHMvaWRlYS9QbHVnaW5DbGFzc0xvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50b29scy5pZGVhOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uZXQuVVJMQ2xhc3NMb2FkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5OwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwSW5wdXRTdHJlYW07Ci0KLXB1YmxpYyBjbGFzcyBQbHVnaW5DbGFzc0xvYWRlciBleHRlbmRzIFVSTENsYXNzTG9hZGVyIHsKLQotICAgIC8vdXJscyB3aGljaCBnaXZlcyB0byBjcmVhdGUgdGhlIGNsYXNzTG9hZGVyCi0gICAgcHJpdmF0ZSBVUkxbXSB1cmxzOwotCi0gICAgLy9UbyBrZWVwIGphciBmaWxlcyBpbnNpZGUgL2xpYiBkaXJlY3RvcnkgaW4gdGhlIG1haW4gamFyCi0gICAgcHJpdmF0ZSBBcnJheUxpc3QgbGliX2phcnNfbGlzdDsKLQotCi0gICAgLyoqCi0gICAgICogUGx1Z2luQ2xhc3NMb2FkZXIgaXMgZXhldGVuZCBmb3JtIFVSTENsYXNzTG9hZGVyICwgYW5kIHRoZSBjb25zdHJ1Y3RvcgotICAgICAqIGhhcyBub3Qgb3ZlcmlkZSB0aGUgc3VwZXIgY29uc3Ryb2N0b3IgLCBidXQgaGFzIGRvbmUgc29tZSBzdHVmZiB0byBmaW5kIG91dAotICAgICAqIGphciBmaWxzIGluc2lkZSAvbGliIGRpcmVjdG9yCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdXJscyAgIDxjb2RlPlVSTDwvY29kZT4KLSAgICAgKiBAcGFyYW0gcGFyZW50IHBhcmVudCBjbGFzc2xvYWRlciA8Y29kZT5DbGFzc0xvYWRlcjwvY29kZT4KLSAgICAgKi8KLSAgICBwdWJsaWMgUGx1Z2luQ2xhc3NMb2FkZXIoVVJMW10gdXJscywgQ2xhc3NMb2FkZXIgcGFyZW50KSB7Ci0gICAgICAgIHN1cGVyKHVybHMsIHBhcmVudCk7Ci0gICAgICAgIHRoaXMudXJscyA9IHVybHM7Ci0gICAgICAgIGxpYl9qYXJzX2xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGZpbmRMaWJKYXJzKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBqdXN0IHNlYXJjaCBmb3IgamFyIGZpbGVzIGluc2lkZSAvbGliIGRpcmN0b3J5IGFuZCBpZiB0aGVyZSBhcmUgYW55IHRoZW4gdGhvc2UKLSAgICAgKiB3aWxsIGJlIGFkZGVkIHRvIHRoZSBhcnJheWxpdCAob25seSB0aGUgbmFtZSBvZiB0aGUgamFyIGZpbGUpCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGZpbmRMaWJKYXJzKCkgewotICAgICAgICAvKioKLSAgICAgICAgICogdGhvdWdoIHRoZSBVUkwgYXJyYXkgY2FuIGNvbnRhaW5zIG9uZSBvciBtb3JlIHVybHMgLCBJIGhhdmUgb25seSBjb25zaWRlciB0aGUKLSAgICAgICAgICogZmlyc3Qgb25lICwgdGhhdCBpcyB0aGlzIGNsYXNzTG9hZGVyIGlzIG9ubHkgZm9yIEF4aXMyIHN0dWZmIGFuZCB0aGUgY2xhc3Nsb2FkZXIKLSAgICAgICAgICogaXMgY3JlYXRlZCBieSBEZXBsb3ltZW50ICwgc28gdGhlcmUgd29udCBiZSBhbnkgY2hhbmNlIHRvIGhhdmUgbW9yZSB0aGUgb25lIHVybHMgZm9yCi0gICAgICAgICAqIHRoZSBVUkwgYXJyYXkgbGlzdAotICAgICAgICAgKi8KLSAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUodXJsc1swXS5nZXRGaWxlKCkpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgWmlwSW5wdXRTdHJlYW0gemluID0gbmV3IFppcElucHV0U3RyZWFtKG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSkpOwotICAgICAgICAgICAgWmlwRW50cnkgZW50cnk7Ci0gICAgICAgICAgICBTdHJpbmcgZW50cnlOYW1lID0gIiI7Ci0gICAgICAgICAgICB3aGlsZSAoKGVudHJ5ID0gemluLmdldE5leHRFbnRyeSgpKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZW50cnlOYW1lID0gZW50cnkuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIGlkIHRoZSBlbnRyeSBuYW1lIHN0YXJ0IHdpdGggL2xpYiBhbmQgZW5kIHdpdGggLmphcgotICAgICAgICAgICAgICAgICAqIHRoZW4gdGhvc2UgZW50cnkgbmFtZSB3aWxsIGJlIGFkZGVkIHRvIHRoZSBhcnJheWxpc3QKLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBpZiAoZW50cnlOYW1lICE9IG51bGwgJiYgKGVudHJ5TmFtZS5zdGFydHNXaXRoKCJsaWIvIikgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5TmFtZS5zdGFydHNXaXRoKCJMaWIvIikpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBlbnRyeU5hbWUuZW5kc1dpdGgoIi5qYXIiKSkgewotICAgICAgICAgICAgICAgICAgICBsaWJfamFyc19saXN0LmFkZChlbnRyeU5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHppbi5jbG9zZSgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gbmFtZSA8Y29kZT5TdHJpbmc8L2NvZGU+ICBOYW1lIG9mIHRoZSBmaWxlIHRvIGJlIGxvYWRlZAotICAgICAqIEByZXR1cm4gPGNvZGU+Q2xhc3M8L2NvZGU+IHJldHVybiBhIGNsYXNzIG9iamVjdCBpZiBpdCBmb3VuZCBlbHNlCi0gICAgICogICAgICAgICB3aWxsIHJldHVybiBudWxsIG9yIGEgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgPHAvPgotICAgICAqICAgICAgICAgVGhpcyBtZXRob2QgaGFzIGJlZW4gb3ZlcnJpZGRlbiBpbiB0aGUgZm9sbG93aW5nIHdheQotICAgICAqICAgICAgICAgMS4gSXQgY2FsbHMgdGhlIHN1cGVyIGNsYXNzIGFuZCBjaGVja3MgdG8gc2VlIHdoZXRoZXIgdGhlIGNsYXNzIGlzIHRoZXJlCi0gICAgICogICAgICAgICBJZiB0aGUgY2xhc3MgaXMgZm91bmQgdGhlbiByZXR1cm4gaXQsIGVsc2UgaWYgc3VwZXIgcmV0dXJuIENsYXNzTm90Zm91bmRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgIDIuIENoZWNrIHdoZXRoZXIgdGhlIGVudHJ5IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGNsYXNzIG5hbWUgZXhpc3RzIGluIG9uZSBvZiBqYXIgZmlsZXMKLSAgICAgKiAgICAgICAgIGluIC9saWIgZGlyZWN0b3IKLSAgICAgKiAgICAgICAgIDMuIElmIGl0IGlzIHRoZXJlIGdldCB0aGUgYnl0ZSBhcnJheSBvdXQgb2YgdGhhdCBhbmQgY3JlYXRlIGEgQ2xhc3Mgb2JqZWN0IG91dCBvZiB0aGF0Ci0gICAgICogICAgICAgICBieSBjYWxsaW5nICJkZWZpbmVDbGFzcygpIiAsIGlmIGl0IHN1Y2NlZWRzIHRoZW4gcmV0dXJuIHRoYXQgZWxzZQotICAgICAqICAgICAgICAgNC4gVGhyb3cgYSBDbGFzc05vdEZvdW5kRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIENsYXNzIGZpbmRDbGFzcyhmaW5hbCBTdHJpbmcgbmFtZSkKLSAgICAgICAgICAgIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgQ2xhc3MgY2xhID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJvb2xlYW4gZm91bmRDbGFzcyA9IGZhbHNlOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBjbGEgPSBzdXBlci5maW5kQ2xhc3MobmFtZSk7Ci0gICAgICAgICAgICAgICAgZm91bmRDbGFzcyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNsYTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGZvdW5kQ2xhc3MgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghZm91bmRDbGFzcykgewotICAgICAgICAgICAgICAgIGJ5dGUgcmF3W10gPSBnZXRCeXRlcyhuYW1lKTsKLSAgICAgICAgICAgICAgICBjbGEgPSBkZWZpbmVDbGFzcyhuYW1lLCByYXcsIDAsIHJhdy5sZW5ndGgpOwotICAgICAgICAgICAgICAgIGZvdW5kQ2xhc3MgPSB0cnVlOwotICAgICAgICAgICAgICAgIHJldHVybiBjbGE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWZvdW5kQ2xhc3MpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbigiQ2xhc3MgTm90IGZvdW5kIDogIiArIG5hbWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWFkIGphciBmaWxlICgvbGliKSBvbmUgYnkgb25lICwgdGhlbiBmb3IgZWFjaCBmaWxlIGNyYWV0ZSA8Y29kZT5aaXBJbnB1dFN0cmVhbTwvY29kZT4KLSAgICAgKiB0aGF0IGFuZCBjaGVjayB0byBzZWUgd2V0aGVyIHRoZXJlIGlzIGFueSBlbnRyeSBlaXRoIGdpdmVuIG5hbWUgaWYgaXQgZm91bmQgdGhlbgotICAgICAqIENyZWF0IEJ5dGVBcnJheU91dFB1dFN0cmVhbSBhbmQgZ2V0IHRoZSBjbGFzcyBieXRlcyB0byB0aGF0IC4KLSAgICAgKiBhZnRlciBnb25pbmcgdGhyb2doIGVhY2ggYW5kIGV2cnkgamFyIGZpbGUgaWYgdGhlcmUgaXMgbm8gZW50cnkgd2l0aCBnaXZlbiBuYW1lCi0gICAgICogd2lsbCB0aHJvdWcgYSBDbGFzc05vdEZvdW5kIGV4ZWNwdGlvbgotICAgICAqCi0gICAgICogQHBhcmFtIGZpbGVuYW1lIDxjb2RlPlN0cmluZzwvY29kZT4gIE5hbWUgb2YgdGhlIGZpbGUgdG8gYmUgbG9hZGVkIChDbGFzcyBOYW1lKQotICAgICAqIEByZXR1cm4gYnl0dFtdCi0gICAgICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIDxjb2RlPkV4Y2VwdGlvbjwvY29kZT4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJ5dGVbXSBnZXRCeXRlcyhTdHJpbmcgZmlsZW5hbWUpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgY29tcGxldGVGaWxlTmFtZSA9IGZpbGVuYW1lOwotICAgICAgICAvKioKLSAgICAgICAgICogUmVwbGFjaW5nIG9yZy5hcGFjaGUuIC0+IG9yZy9hcGFjaGUvLi4uCi0gICAgICAgICAqLwotICAgICAgICBjb21wbGV0ZUZpbGVOYW1lID0gY29tcGxldGVGaWxlTmFtZS5yZXBsYWNlKCcuJywgJy8nKS5jb25jYXQoIi5jbGFzcyIpOwotICAgICAgICBieXRlIHJhd1tdID0gbnVsbDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaWJfamFyc19saXN0LnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbGliamFyX25hbWUgPSAoU3RyaW5nKSBsaWJfamFyc19saXN0LmdldChpKTsKLSAgICAgICAgICAgIElucHV0U3RyZWFtIGluID0gdGhpcy5nZXRSZXNvdXJjZUFzU3RyZWFtKGxpYmphcl9uYW1lKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgWmlwSW5wdXRTdHJlYW0gemluID0gbmV3IFppcElucHV0U3RyZWFtKGluKTsKLSAgICAgICAgICAgICAgICBaaXBFbnRyeSBlbnRyeTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZW50cnlOYW1lID0gIiI7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKChlbnRyeSA9IHppbi5nZXROZXh0RW50cnkoKSkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBlbnRyeU5hbWUgPSBlbnRyeS5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChlbnRyeU5hbWUgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5TmFtZS5lbmRzV2l0aChjb21wbGV0ZUZpbGVOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZSBkYXRhW10gPSBuZXcgYnl0ZVsyMDQ4XTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKGNvdW50ID0gemluLnJlYWQoZGF0YSwgMCwgMjA0OCkpICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlKGRhdGEsIDAsIGNvdW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJhdyA9IG91dC50b0J5dGVBcnJheSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgb3V0LmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB6aW4uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByYXc7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICAgIHRocm93IG5ldyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uKCJDbGFzcyBOb3QgZm91bmQgOiAiICsgZmlsZW5hbWUpOwotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbHMvaWRlYS9Qcm9ncmVzc0JhclBhbmVsLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29scy9pZGVhL1Byb2dyZXNzQmFyUGFuZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ1MjM3NS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29scy9pZGVhL1Byb2dyZXNzQmFyUGFuZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudG9vbHMuaWRlYTsKLQotaW1wb3J0IGphdmF4LnN3aW5nLio7Ci1pbXBvcnQgamF2YS5hd3QuKjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgUHJvZ3Jlc3NCYXJQYW5lbCAgZXh0ZW5kcyBKUGFuZWwgewotICAgIHByaXZhdGUgIHZvbGF0aWxlIGJvb2xlYW4gc3RvcCA9IGZhbHNlOwotICAgIHByaXZhdGUgc3RhdGljIGludCBERUxBWSA9IDUwMDsKLSAgICBwdWJsaWMgdm9sYXRpbGUgU3RyaW5nIHZhbD1udWxsOwotICAgIHByaXZhdGUgSkxhYmVsIHByb2dyZXNzRGVzY3JpcHRpb247Ci0gICAgcHJpdmF0ZSBKUHJvZ3Jlc3NCYXIgcHJvZ3Jlc3NTZW50OwotCi0gICAgcHVibGljIFByb2dyZXNzQmFyUGFuZWwgKCl7Ci0gICAgICAgIGluaXQoKTsKLSAgICB9Ci0gICAgcHVibGljICB2b2lkIHJlcXVlc3RTdG9wKCkgewotICAgICAgICBzdG9wID0gdHJ1ZTsKLSAgICB9Ci0gICAgcHJpdmF0ZSB2b2lkIGluaXQoKXsKLSAgICAgICAgc2V0VmlzaWJsZShmYWxzZSk7Ci0gICAgICAgIHByb2dyZXNzRGVzY3JpcHRpb24gPW5ldyBKTGFiZWwoKTsKLSAgICAgICAgcHJvZ3Jlc3NEZXNjcmlwdGlvbi5zZXRUZXh0KCIiKTsKLSAgICAgICAgcHJvZ3Jlc3NTZW50ID1uZXcgSlByb2dyZXNzQmFyKCk7Ci0gICAgICAgIHByb2dyZXNzU2VudC5zZXRTdHJpbmdQYWludGVkKHRydWUpOwotICAgICAgICB0aGlzLnNldExheW91dChuZXcgR3JpZEJhZ0xheW91dCgpKTsKLQotICAgICAgICB0aGlzLmFkZChwcm9ncmVzc0Rlc2NyaXB0aW9uCi0gICAgICAgICAgICAgICAgLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDAsIDAsIEdyaWRCYWdDb25zdHJhaW50cy5SRU1BSU5ERVIsIDEsICAxLjAsIDEuMAotICAgICAgICAgICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLldFU1QgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLkhPUklaT05UQUwKLSAgICAgICAgICAgICAgICAsIG5ldyBJbnNldHMoMTAsIDEwLCAwLCAxMCksIDAsIDApKTsKLQotICAgICAgICB0aGlzLmFkZChwcm9ncmVzc1NlbnQKLSAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMCwgMSwgR3JpZEJhZ0NvbnN0cmFpbnRzLlJFTUFJTkRFUiwgMSwgMS4wLCAxLjAKLSAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5XRVNUICwgR3JpZEJhZ0NvbnN0cmFpbnRzLkhPUklaT05UQUwKLSAgICAgICAgICAgICAgICAsIG5ldyBJbnNldHMoMTAsIDEwLCAwLDEwKSwgMCwgMCkpOwotCi0gICAgfQotICAgIHB1YmxpYyB2b2lkIHNldFByb2dyZXNzVGV4dChTdHJpbmcgcykgewotICAgICAgICBwcm9ncmVzc0Rlc2NyaXB0aW9uLnNldFRleHQocyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UHJvZ3Jlc3NWYWx1ZShpbnQgaSkgewotICAgICAgICBwcm9ncmVzc1NlbnQuc2V0VmFsdWUoaSk7Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIGFib3V0VG9EaXNwbGF5UGFuZWwoKSB7Ci0KLSAgICAgICAgc2V0UHJvZ3Jlc3NWYWx1ZSgwKTsKLSAgICAgICAvLyBzZXRQcm9ncmVzc1RleHQoIkNvbm5lY3RpbmcgdG8gU2VydmVyLi4uIik7Ci0KLSAgICB9Ci0gICAgcHVibGljIHZvaWQgZGlzcGxheWluZ1BhbmVsKCkgewotCi0gICAgICAgIFRocmVhZCB0ID0gbmV3IFRocmVhZCgpIHsKLQotICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotCi0gICAgICAgICAgICAgICAgaW50IG1pbmltdW0gPSBwcm9ncmVzc1NlbnQuZ2V0TWluaW11bSgpOwotICAgICAgICAgICAgICAgIGludCBtYXhpbXVtID1wcm9ncmVzc1NlbnQuZ2V0TWF4aW11bSgpOwotICAgICAgICAgICAgICAgIFJ1bm5hYmxlIHJ1bm5lciA9IG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYoc3RvcCAmJiBwcm9ncmVzc1NlbnQgLmdldFZhbHVlKCk8NzUpewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3NTZW50IC5zZXRJbmRldGVybWluYXRlKGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdmFsdWUgPSBwcm9ncmVzc1NlbnQgLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3NTZW50IC5zZXRWYWx1ZSh2YWx1ZSs0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRQcm9ncmVzc1ZhbHVlKHZhbHVlKzQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgcHJvZ3Jlc3NEZXNjcmlwdGlvbiAuc2V0VGV4dCgiR2VuYXJhdGUgQ29kZS4gUGxlYXNlIHdhaXQuLi4uLiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmKCFzdG9wKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9ncmVzc1NlbnQgLnNldEluZGV0ZXJtaW5hdGUodHJ1ZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaT1taW5pbXVtOyBpPG1heGltdW07IGkrKykgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgU3dpbmdVdGlsaXRpZXMuaW52b2tlQW5kV2FpdChydW5uZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gT3VyIHRhc2sgZm9yIGVhY2ggc3RlcCBpcyB0byBqdXN0IHNsZWVwCi0gICAgICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoREVMQVkpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZ25vcmVkRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gaWdub3JlZEV4Y2VwdGlvbikgewotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICB0LnN0YXJ0KCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbHMvaWRlYS9TZWNvbmRQYW5lbC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbHMvaWRlYS9TZWNvbmRQYW5lbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODQzNTg3Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2xzL2lkZWEvU2Vjb25kUGFuZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwMCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudG9vbHMuaWRlYTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbHMuYmVhbi5Db2RlZ2VuQmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRvb2xzLmNvbXBvbmVudC5XaXphcmRDb21wb25lbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbHMuY29tcG9uZW50LldpemFyZFBhbmVsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbHMud2l6YXJkZnJhbWUuQ29kZWdlbkZyYW1lOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5VUkxQcm9jZXNzb3I7Ci0KLWltcG9ydCBqYXZheC5zd2luZy4qOwotaW1wb3J0IGphdmF4LndzZGwuV1NETEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEuYXd0Lio7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuSXRlbUV2ZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50Lkl0ZW1MaXN0ZW5lcjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBTZWNvbmRQYW5lbCAgZXh0ZW5kcyAgV2l6YXJkUGFuZWwgewotCi0gICAgcHJpdmF0ZSBKQ29tYm9Cb3ggY21iQ29kZUdlbk9wdGlvbjsKLSAgICBwcml2YXRlIEpDb21ib0JveCBjbWJMYW47Ci0gICAgcHJpdmF0ZSBKQ29tYm9Cb3ggY21iU2VydmljZU5hbWU7Ci0gICAgcHJpdmF0ZSBKQ29tYm9Cb3ggY21iUG9ydE5hbWU7Ci0gICAgcHJpdmF0ZSBKVGV4dEZpZWxkIHR4dFBhY2FrZ2VOYW1lOwotICAgIHByaXZhdGUgSkNvbWJvQm94IGNtYmRidHlwZTsKLSAgICBwcml2YXRlIEpDaGVja0JveCBjaGtUZXN0Q2FzZTsKLSAgICBwcml2YXRlIEpSYWRpb0J1dHRvbiBjbGllbnRTaWRlOwotICAgIHByaXZhdGUgSlJhZGlvQnV0dG9uIHJkQm90aDsKLSAgICBwcml2YXRlIEpSYWRpb0J1dHRvbiByZHN5bjsKLSAgICBwcml2YXRlIEpSYWRpb0J1dHRvbiByZGFzeW5jOwotICAgIHByaXZhdGUgSlJhZGlvQnV0dG9uIHNlcnZlclNpZGU7Ci0gICAgcHJpdmF0ZSBKQ2hlY2tCb3ggc2VydmljZVhNTDsKLSAgICBwcml2YXRlIEpDaGVja0JveCBzZXJ2ZXJTaWRlSW50ZXJmYWNlOwotICAgIHByaXZhdGUgSlJhZGlvQnV0dG9uIGFsbDsKLSAgICBwcml2YXRlIEpUYWJsZSB0YWJsZTsKLSAgICBwcml2YXRlIEpTY3JvbGxQYW5lIHNwVGFibGU7Ci0gICAgcHJpdmF0ZSBMaXN0IHNlcnZpY2VOYW1lTGlzdDsKLSAgICBwcml2YXRlIFBhY2thZ2VOYW1lVGFibGVNb2RlbCBtb2RlbDsKLSAgICBwcml2YXRlIENvZGVnZW5CZWFuIGNvZGVnZW5CZWFuOwotCi0gICAgcHVibGljIFNlY29uZFBhbmVsKFdpemFyZENvbXBvbmVudHMgd2l6YXJkQ29tcG9uZW50cyxDb2RlZ2VuQmVhbiBjb2RlZ2VuQmVhbikgewotICAgICAgICBzdXBlcih3aXphcmRDb21wb25lbnRzLCAiQXhpczIgSWRlYSBQbHVnaW4gV1NETDJKYXZhIFdpemFyZHMiKTsKLSAgICAgICAgdGhpcy5jb2RlZ2VuQmVhbj1jb2RlZ2VuQmVhbjsKLSAgICAgICAgc2V0UGFuZWxUb3BUaXRsZSgiT3B0aW9ucyIpOwotICAgICAgICBzZXRQYW5lbEJvdHRvbVRpdGxlKCJTZXQgdGhlIG9wdGlvbnMgZm9yIHRoZSBjb2RlIGdlbmVyYXRvci4gSWYgeW91IHdpc2ggdG8gZWRpdCB0aGUgY29kZWdlbiBvcHRpb25zLCBTZWxlY3QgY3VzdG9tIik7Ci0gICAgICAgIGluaXQoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdCgpewotCi0gICAgICAgIGNtYkxhbiA9IG5ldyBKQ29tYm9Cb3goKTsKLSAgICAgICAgY21iTGFuLmFkZEl0ZW0oImphdmEiKTsKLSAgICAgICAgY21iTGFuLnNldFRvb2xUaXBUZXh0KCJTZWxlY3QgdGhlIGxhbmd1YWdlIG9mIHRoZSBnZW5lcmF0ZWQgY29kZSIpOwotCi0gICAgICAgIGNtYlNlcnZpY2VOYW1lID0gbmV3IEpDb21ib0JveCgpOwotICAgICAgICBhZGQoY21iU2VydmljZU5hbWUpOwotICAgICAgICBjbWJTZXJ2aWNlTmFtZS5zZXRUb29sVGlwVGV4dCgiU2VsZWN0IHRoZSBuYW1lIG9mIHRoZSBzZXJ2aWNlIHRoYXQgdGhlIGNvZGUgc2hvdWxkIGJlIGdlbmVyYXRlZCBmb3IiKTsKLQotICAgICAgICBjbWJQb3J0TmFtZSA9IG5ldyBKQ29tYm9Cb3goKTsKLSAgICAgICAgY21iUG9ydE5hbWUuc2V0VG9vbFRpcFRleHQoIlNlbGVjdCB0aGUgcG9ydCBuYW1lIHRoYXQgdGhlIGNvZGUgc2hvdWxkIGJlIGdlbmVyYXRlZCBmb3IiKTsKLQotICAgICAgICB0eHRQYWNha2dlTmFtZSA9IG5ldyBKVGV4dEZpZWxkKCJvcmcuYXhpczIiKTsKLSAgICAgICAgdHh0UGFjYWtnZU5hbWUuc2V0VG9vbFRpcFRleHQoIlNldCB0aGUgcGFja2FnZSBuYW1lIG9mIHRoZSBnZW5lcmF0ZWQgY29kZSIpOwotCi0gICAgICAgIGNtYmRidHlwZSA9IG5ldyBKQ29tYm9Cb3goKTsKLSAgICAgICAgY21iZGJ0eXBlLmFkZEl0ZW0oImFkYiIpOwotICAgICAgICBjbWJkYnR5cGUuYWRkSXRlbSgieG1sYmVhbnMiKTsKLSAgICAgICAgY21iZGJ0eXBlLmFkZEl0ZW0oIm5vbmUiKTsKLSAgICAgICAgY21iZGJ0eXBlLnNldFRvb2xUaXBUZXh0KCJTZWxlY3QgdGhlIGRhdGFiaW5kaW5nIGZyYW1ld29yayB0byBiZSB1c2VkIGluIHRoZSBnZW5lcmF0aW9uIHByb2Nlc3MiKTsKLQotICAgICAgICBjaGtUZXN0Q2FzZSA9IG5ldyBKQ2hlY2tCb3goIkdlbmVyYXRlIFRlc3QgQ2FzZSIsIGZhbHNlKTsKLSAgICAgICAgY2hrVGVzdENhc2Uuc2V0VmlzaWJsZSh0cnVlKTsKLSAgICAgICAgY2hrVGVzdENhc2Uuc2V0VG9vbFRpcFRleHQoIkEgdGVzdCBjYXNlIHdpbGwgYmUgZ2VuZXJhdGVkIGlmIHRoaXMgaXMgY2hlY2tlZCIpOwotCi0gICAgICAgIEJ1dHRvbkdyb3VwIGdlbmVyYXRpb25UeXBlID0gbmV3IEJ1dHRvbkdyb3VwKCk7Ci0KLSAgICAgICAgY2xpZW50U2lkZSA9IG5ldyBKUmFkaW9CdXR0b24oIkdlbmVyYXRlIENsaWVudCBTaWRlIix0cnVlKTsKLSAgICAgICAgZ2VuZXJhdGlvblR5cGUuYWRkKGNsaWVudFNpZGUpOwotCi0gICAgICAgIEJ1dHRvbkdyb3VwIGJ1dHRvbkdyb3VwID0gbmV3IEJ1dHRvbkdyb3VwKCk7Ci0KLSAgICAgICAgcmRCb3RoID0gbmV3IEpSYWRpb0J1dHRvbigiR2VuZXJhdGUgYm90aCBzeW5jIGFuZCBhc3luYyIsIHRydWUpOwotICAgICAgICBidXR0b25Hcm91cC5hZGQocmRCb3RoKTsKLQotICAgICAgICByZHN5biA9IG5ldyBKUmFkaW9CdXR0b24oIkdlbmVyYXRlIHN5bmMgb25seSIsIGZhbHNlKTsKLSAgICAgICAgYnV0dG9uR3JvdXAuYWRkKHJkc3luKTsKLQotICAgICAgICByZGFzeW5jID0gbmV3IEpSYWRpb0J1dHRvbigiR2VuZXJhdGUgYXN5bmMgb25seSIsIGZhbHNlKTsKLSAgICAgICAgYnV0dG9uR3JvdXAuYWRkKHJkYXN5bmMpOwotCi0gICAgICAgIHNlcnZlclNpZGUgPSBuZXcgSlJhZGlvQnV0dG9uKCJHZW5lcmF0ZSBTZXJ2ZXIgU2lkZSIpOwotICAgICAgICBnZW5lcmF0aW9uVHlwZS5hZGQoc2VydmVyU2lkZSk7Ci0KLSAgICAgICAgc2VydmljZVhNTCA9IG5ldyBKQ2hlY2tCb3goIkdlbmVyYXRlIGRlZmF1bHQgc2VydmljZS54bWwiLCBmYWxzZSk7Ci0KLSAgICAgICAgc2VydmVyU2lkZUludGVyZmFjZSA9IG5ldyBKQ2hlY2tCb3goIkdlbmVyYXRlIGFuIGludGVyZmFjZSBmb3Igc2tlbGV0b24iLCBmYWxzZSk7Ci0KLSAgICAgICAgYWxsID0gbmV3IEpSYWRpb0J1dHRvbigiR2VuZXJhdGUgQWxsIik7Ci0gICAgICAgIGdlbmVyYXRpb25UeXBlLmFkZChhbGwpOwotCi0gICAgICAgIG1vZGVsID0gbmV3IFBhY2thZ2VOYW1lVGFibGVNb2RlbChuZXcgT2JqZWN0IFsxXVsyXSk7Ci0gICAgICAgIHRhYmxlID0gbmV3IEpUYWJsZShtb2RlbCk7ICAgICAgICAKLSAgICAgICAgc3BUYWJsZT1uZXcgSlNjcm9sbFBhbmUodGFibGUpOwotCi0gICAgICAgIGNtYkNvZGVHZW5PcHRpb24gPW5ldyBKQ29tYm9Cb3goKTsKLSAgICAgICAgY21iQ29kZUdlbk9wdGlvbiAuYWRkSXRlbSgiZGVmYXVsdCIpOwotICAgICAgICBjbWJDb2RlR2VuT3B0aW9uIC5hZGRJdGVtKCJjdXN0b20iKTsKLSAgICAgICAgY21iQ29kZUdlbk9wdGlvbiAuc2V0VG9vbFRpcFRleHQoIlNlbGVjdCB0aGUgQ29kZWdlbiBvcHRpb24iKTsKLQotCi0gICAgICAgIHRoaXMuc2V0TGF5b3V0KG5ldyBHcmlkQmFnTGF5b3V0KCkpOwotCi0gICAgICAgIHRoaXMuYWRkKG5ldyBKTGFiZWwoIkNvZ2VuIE9wdGlvbiIpCi0gICAgICAgICAgICAgICAgLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDAsIDAsIDEsIDEsIDEuMCwgMC4wCi0gICAgICAgICAgICAgICAgLCBHcmlkQmFnQ29uc3RyYWludHMuV0VTVCAsIEdyaWRCYWdDb25zdHJhaW50cy5OT05FCi0gICAgICAgICAgICAgICAgLCBuZXcgSW5zZXRzKDEsIDEwLCAwLDEwKSwgMCwgMCkpOwotCi0gICAgICAgIHRoaXMuYWRkKGNtYkNvZGVHZW5PcHRpb24KLSAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMSwgMCwgR3JpZEJhZ0NvbnN0cmFpbnRzLlJFTUFJTkRFUiwgMSwgMS4wLCAwLjAKLSAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5XRVNULCBHcmlkQmFnQ29uc3RyYWludHMuSE9SSVpPTlRBTAotICAgICAgICAgICAgICAgICwgbmV3IEluc2V0cygxLCA1LCAwLDEwKSwgMCwgMCkpOwotICAgICAgICBjbWJDb2RlR2VuT3B0aW9uLmFkZEl0ZW1MaXN0ZW5lcihuZXcgSXRlbUxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgaXRlbVN0YXRlQ2hhbmdlZChJdGVtRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGlmIChlLmdldFN0YXRlQ2hhbmdlKCkgPT0gSXRlbUV2ZW50LlNFTEVDVEVEKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldEVuYWJsZWRGb3JDb2RlZ2VuVHlwZSgpOwotICAgICAgICAgICAgICAgICAgICB1cGRhdGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIHRoaXMuYWRkKG5ldyBKTGFiZWwoIk91dCBwdXQgbGFuZyIpCi0gICAgICAgICAgICAgICAgLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDAsIDEsIDEsIDEsIDEuMCwgMC4wCi0gICAgICAgICAgICAgICAgLCBHcmlkQmFnQ29uc3RyYWludHMuV0VTVCAsIEdyaWRCYWdDb25zdHJhaW50cy5OT05FCi0gICAgICAgICAgICAgICAgLCBuZXcgSW5zZXRzKDEsMTAsIDAsMTApLCAwLCAwKSk7Ci0KLSAgICAgICAgdGhpcy5hZGQoY21iTGFuCi0gICAgICAgICAgICAgICAgLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDEsIDEsIEdyaWRCYWdDb25zdHJhaW50cy5SRU1BSU5ERVIsIDEsIDEuMCwgMC4wCi0gICAgICAgICAgICAgICAgLCBHcmlkQmFnQ29uc3RyYWludHMuV0VTVCAsIEdyaWRCYWdDb25zdHJhaW50cy5IT1JJWk9OVEFMCi0gICAgICAgICAgICAgICAgLCBuZXcgSW5zZXRzKDEsIDUsIDAsMTApLCAwLCAwKSk7Ci0KLSAgICAgICAgdGhpcy5hZGQobmV3IEpMYWJlbCgiU2VydmljZSBuYW1lIikKLSAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMCwgMiwgMSwgMSwgMS4wLCAwLjAKLSAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5XRVNUICwgR3JpZEJhZ0NvbnN0cmFpbnRzLk5PTkUKLSAgICAgICAgICAgICAgICAsIG5ldyBJbnNldHMoMSwgMTAsIDAsMTApLCAwLCAwKSk7Ci0KLSAgICAgICAgdGhpcy5hZGQoY21iU2VydmljZU5hbWUKLSAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMSwgMiwgR3JpZEJhZ0NvbnN0cmFpbnRzLlJFTUFJTkRFUiwgMSwgMS4wLCAwLjAKLSAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5XRVNUICwgR3JpZEJhZ0NvbnN0cmFpbnRzLkhPUklaT05UQUwKLSAgICAgICAgICAgICAgICAsIG5ldyBJbnNldHMoMSwgNSwgMCwxMCksIDAsIDApKTsKLQotICAgICAgICB0aGlzLmFkZChuZXcgSkxhYmVsKCJwb3J0IE5hbWUiKQotICAgICAgICAgICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygwLCAzLCAxLCAxLCAxLjAsIDAuMAotICAgICAgICAgICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLldFU1QgLCBHcmlkQmFnQ29uc3RyYWludHMuTk9ORQotICAgICAgICAgICAgICAgICwgbmV3IEluc2V0cygxLCAxMCwgMCwxMCksIDAsIDApKTsKLSAgICAgICAgdGhpcy5hZGQoY21iUG9ydE5hbWUKLSAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMSwgMywgR3JpZEJhZ0NvbnN0cmFpbnRzLlJFTUFJTkRFUiwgMSwxLjAsIDAuMAotICAgICAgICAgICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLldFU1QgLCBHcmlkQmFnQ29uc3RyYWludHMuSE9SSVpPTlRBTAotICAgICAgICAgICAgICAgICwgbmV3IEluc2V0cygxLCA1LCAwLDEwKSwgMCwgMCkpOwotICAgICAgICB0aGlzLmFkZChuZXcgSkxhYmVsKCJEYXRhQmluZGluZyIpCi0gICAgICAgICAgICAgICAgLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDAsIDQsIDEsIDEsIDEuMCwgMC4wCi0gICAgICAgICAgICAgICAgLCBHcmlkQmFnQ29uc3RyYWludHMuV0VTVCAsIEdyaWRCYWdDb25zdHJhaW50cy5OT05FCi0gICAgICAgICAgICAgICAgLCBuZXcgSW5zZXRzKDEsIDEwLCAwLDEwKSwgMCwgMCkpOwotICAgICAgICB0aGlzLmFkZChjbWJkYnR5cGUKLSAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMSwgNCwgR3JpZEJhZ0NvbnN0cmFpbnRzLlJFTUFJTkRFUiwgMSwgMS4wLCAwLjAKLSAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5XRVNUICwgR3JpZEJhZ0NvbnN0cmFpbnRzLkhPUklaT05UQUwKLSAgICAgICAgICAgICAgICAsIG5ldyBJbnNldHMoMSwgNSwgMCwxMCksIDAsIDApKTsKLSAgICAgICAgdGhpcy5hZGQobmV3IEpMYWJlbCgiQ3VzdG9tIFBhY2tlZ2UiKQotICAgICAgICAgICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygwLCA1LCAxLCAxLCAxLjAsIDAuMAotICAgICAgICAgICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLldFU1QgLCBHcmlkQmFnQ29uc3RyYWludHMuTk9ORQotICAgICAgICAgICAgICAgICwgbmV3IEluc2V0cygxLCAxMCwgMCwxMCksIDAsIDApKTsKLSAgICAgICAgdGhpcy5hZGQodHh0UGFjYWtnZU5hbWUKLSAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMSwgNSwgR3JpZEJhZ0NvbnN0cmFpbnRzLlJFTUFJTkRFUiwgMSwgMS4wLCAwLjAKLSAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5XRVNUICwgR3JpZEJhZ0NvbnN0cmFpbnRzLkhPUklaT05UQUwKLSAgICAgICAgICAgICAgICAsIG5ldyBJbnNldHMoMSwgNSwgMCwxMCksIDAsIDApKTsKLSAgICAgICAgdGhpcy5hZGQoY2hrVGVzdENhc2UKLSAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMCwgNiwgMSwgMSwgMS4wLCAwLjAKLSAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5XRVNUICwgR3JpZEJhZ0NvbnN0cmFpbnRzLkhPUklaT05UQUwKLSAgICAgICAgICAgICAgICAsIG5ldyBJbnNldHMoMSwgMTAsIDAsMTApLCAwLCAwKSk7Ci0gICAgICAgIHRoaXMuYWRkKG5ldyBKU2VwYXJhdG9yKCkKLSAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMCwgNywgR3JpZEJhZ0NvbnN0cmFpbnRzLlJFTUFJTkRFUiwgMSwgMC4wLCAwLjAKLSAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5XRVNUICwgR3JpZEJhZ0NvbnN0cmFpbnRzLkJPVEgKLSAgICAgICAgICAgICAgICAsIG5ldyBJbnNldHMoMSwgMTAsIDEsMSksIDAsIDApKTsKLQotCi0gICAgICAgIHRoaXMuYWRkKGNsaWVudFNpZGUKLSAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMCwgOCwgMSwgMSwgMS4wLCAwLjAKLSAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5XRVNUICwgR3JpZEJhZ0NvbnN0cmFpbnRzLk5PTkUKLSAgICAgICAgICAgICAgICAsIG5ldyBJbnNldHMoMSwgMTAsIDAsMTApLCAwLCAwKSk7Ci0gICAgICAgIGNsaWVudFNpZGUuYWRkSXRlbUxpc3RlbmVyKG5ldyBJdGVtTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBpdGVtU3RhdGVDaGFuZ2VkKEl0ZW1FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGUuZ2V0U3RhdGVDaGFuZ2UoKSA9PSBJdGVtRXZlbnQuU0VMRUNURUQpIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0RW5hYmxlZEZvckN1c3RvbSgpOwotICAgICAgICAgICAgICAgICAgICB1cGRhdGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICB0aGlzLmFkZChyZEJvdGgKLSAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMCwgOSwgMSwgMSwgMS4wLCAwLjAKLSAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5XRVNUICwgR3JpZEJhZ0NvbnN0cmFpbnRzLk5PTkUKLSAgICAgICAgICAgICAgICAsIG5ldyBJbnNldHMoMSwgMTAsIDAsMTApLCAwLCAwKSk7Ci0gICAgICAgIHRoaXMuYWRkKHJkc3luCi0gICAgICAgICAgICAgICAgLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDEsIDksIDEsIDEsIDEuMCwgMC4wCi0gICAgICAgICAgICAgICAgLCBHcmlkQmFnQ29uc3RyYWludHMuV0VTVCAsIEdyaWRCYWdDb25zdHJhaW50cy5OT05FCi0gICAgICAgICAgICAgICAgLCBuZXcgSW5zZXRzKDEsIDUsIDAsMTApLCAwLCAwKSk7Ci0gICAgICAgIHRoaXMuYWRkKHJkYXN5bmMKLSAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMiwgOSwgMSwgMSwgMS4wLDAuMAotICAgICAgICAgICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLldFU1QgLCBHcmlkQmFnQ29uc3RyYWludHMuTk9ORQotICAgICAgICAgICAgICAgICwgbmV3IEluc2V0cygxLCA1LCAwLDEwKSwgMCwgMCkpOwotCi0KLSAgICAgICAgdGhpcy5hZGQobmV3IEpTZXBhcmF0b3IoKQotICAgICAgICAgICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygwLCAxMCwgR3JpZEJhZ0NvbnN0cmFpbnRzLlJFTUFJTkRFUiwgMSwgMC4wLCAwLjAKLSAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5XRVNUICwgR3JpZEJhZ0NvbnN0cmFpbnRzLkJPVEgKLSAgICAgICAgICAgICAgICAsIG5ldyBJbnNldHMoMSwgMTAsIDEsMSksIDAsIDApKTsKLQotICAgICAgICB0aGlzLmFkZChzZXJ2ZXJTaWRlCi0gICAgICAgICAgICAgICAgLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDAsIDExLCAxLCAxLCAxLjAsIDAuMAotICAgICAgICAgICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLldFU1QgLCBHcmlkQmFnQ29uc3RyYWludHMuSE9SSVpPTlRBTAotICAgICAgICAgICAgICAgICwgbmV3IEluc2V0cygxLCAxMCwgMCwxMCksIDAsIDApKTsKLSAgICAgICAgc2VydmVyU2lkZS5hZGRJdGVtTGlzdGVuZXIobmV3IEl0ZW1MaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGl0ZW1TdGF0ZUNoYW5nZWQoSXRlbUV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBpZiAoZS5nZXRTdGF0ZUNoYW5nZSgpID09IEl0ZW1FdmVudC5TRUxFQ1RFRCkgewotICAgICAgICAgICAgICAgICAgICBzZXRFbmFibGVkRm9yQ3VzdG9tKCk7Ci0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIHRoaXMuYWRkKHNlcnZpY2VYTUwKLSAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMCwgMTIsIDEsIDEsIDEuMCwgMC4wCi0gICAgICAgICAgICAgICAgLCBHcmlkQmFnQ29uc3RyYWludHMuV0VTVCAsIEdyaWRCYWdDb25zdHJhaW50cy5IT1JJWk9OVEFMCi0gICAgICAgICAgICAgICAgLCBuZXcgSW5zZXRzKDEsIDEwLCAwLDEwKSwgMCwgMCkpOwotICAgICAgICB0aGlzLmFkZChzZXJ2ZXJTaWRlSW50ZXJmYWNlCi0gICAgICAgICAgICAgICAgLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDEsIDEyLCAxLCAxLCAxLjAsIDAuMAotICAgICAgICAgICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLldFU1QgLCBHcmlkQmFnQ29uc3RyYWludHMuSE9SSVpPTlRBTAotICAgICAgICAgICAgICAgICwgbmV3IEluc2V0cygxLCA1LCAwLDEwKSwgMCwgMCkpOwotCi0KLSAgICAgICAgdGhpcy5hZGQobmV3IEpTZXBhcmF0b3IoKQotICAgICAgICAgICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygwLCAxMywgR3JpZEJhZ0NvbnN0cmFpbnRzLlJFTUFJTkRFUiwgMSwgMC4wLCAwLjAKLSAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5XRVNUICwgR3JpZEJhZ0NvbnN0cmFpbnRzLkJPVEgKLSAgICAgICAgICAgICAgICAsIG5ldyBJbnNldHMoMSwgMTAsIDEsMSksIDAsIDApKTsKLQotCi0gICAgICAgIHRoaXMuYWRkKGFsbAotICAgICAgICAgICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygwLCAxNCwgMSwgMSwgMS4wLCAwLjAKLSAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5XRVNUICwgR3JpZEJhZ0NvbnN0cmFpbnRzLkhPUklaT05UQUwKLSAgICAgICAgICAgICAgICAsIG5ldyBJbnNldHMoMSwxMCwgMCwxMCksIDAsIDApKTsKLSAgICAgICAgYWxsLmFkZEl0ZW1MaXN0ZW5lcihuZXcgSXRlbUxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgaXRlbVN0YXRlQ2hhbmdlZChJdGVtRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGlmIChlLmdldFN0YXRlQ2hhbmdlKCkgPT0gSXRlbUV2ZW50LlNFTEVDVEVEKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldEVuYWJsZWRGb3JDdXN0b20oKTsKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgdGhpcy5hZGQobmV3IEpTZXBhcmF0b3IoKQotICAgICAgICAgICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygwLCAxNSwgR3JpZEJhZ0NvbnN0cmFpbnRzLlJFTUFJTkRFUiwgMSwgMC4wLCAwLjAKLSAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5XRVNUICwgR3JpZEJhZ0NvbnN0cmFpbnRzLkJPVEgKLSAgICAgICAgICAgICAgICAsIG5ldyBJbnNldHMoMSwgMTAsIDEsMSksIDAsIDApKTsKLQotICAgICAgICB0aGlzLmFkZChuZXcgSkxhYmVsKCJOYW1lc3BhY2UgdG8gUGFja2FnZSBNYXBwaW5nIikKLSAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMCwgMTYsIDEsIDEsIDEuMCwgMC4wCi0gICAgICAgICAgICAgICAgLCBHcmlkQmFnQ29uc3RyYWludHMuV0VTVCAsIEdyaWRCYWdDb25zdHJhaW50cy5IT1JJWk9OVEFMCi0gICAgICAgICAgICAgICAgLCBuZXcgSW5zZXRzKDEsMTAsIDAsMTApLCAwLCAwKSk7Ci0KLSAgICAgICAgdGhpcy5hZGQoc3BUYWJsZQotICAgICAgICAgICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygwLCAxNywgR3JpZEJhZ0NvbnN0cmFpbnRzLlJFTUFJTkRFUiwgMSwgMS4wLCAxLjAKLSAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5OT1JUSFdFU1QgLCBHcmlkQmFnQ29uc3RyYWludHMuQk9USAotICAgICAgICAgICAgICAgICwgbmV3IEluc2V0cygxLDEwLCAyMCwxMCksIDAsIDApKTsKLQotICAgICAgICBzZXROZXh0QnV0dG9uRW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIHNldEVuYWJsZWRGb3JDb2RlZ2VuVHlwZSgpOwotCi0gICAgfQotICAgIHB1YmxpYyB2b2lkIG5leHQoKSB7Ci0gICAgICAgIHN3aXRjaFBhbmVsKENvZGVnZW5GcmFtZS5QQU5FTF9MQVNUX0EgKTsKLSAgICB9Ci0gICAgcHVibGljIHZvaWQgYmFjaygpIHsKLSAgICAgICAgc3dpdGNoUGFuZWwoQ29kZWdlbkZyYW1lLlBBTkVMX0ZJUlNUX0EgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB1cGRhdGUoKXsKLSAgICAgICAgY2hlY2tQYWdlQ29tbGV0ZSgpOwotICAgICAgICBwb3B1bGF0ZVBhcmFtc0Zyb21XU0RMKCk7Ci0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgbG9hZE5hbWVzcGFjZXMoQ29sbGVjdGlvbiBuYW1lc3BhY2VNYXApewotCi0gICAgICAgIEl0ZXJhdG9yIG5hbWVzcGFjZXMgPSBuYW1lc3BhY2VNYXAuaXRlcmF0b3IoKTsKLSAgICAgICAgT2JqZWN0IHRhYmxlRGF0YSBbXVtdID0gbmV3IE9iamVjdFtuYW1lc3BhY2VNYXAuc2l6ZSgpXVsyXTsKLSAgICAgICAgaW50IGkgPSAwOwotICAgICAgICB3aGlsZShuYW1lc3BhY2VzLmhhc05leHQoKSl7Ci0KLSAgICAgICAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSAoU3RyaW5nKW5hbWVzcGFjZXMubmV4dCgpOwotICAgICAgICAgICAgdGFibGVEYXRhW2ldWzBdID0gbmFtZXNwYWNlOwotICAgICAgICAgICAgdGFibGVEYXRhW2ldWzFdID0gZ2V0UGFja2FnZUZyb21OYW1lc3BhY2UobmFtZXNwYWNlKTsKLSAgICAgICAgICAgIGkrKzsKLSAgICAgICAgfQotCi0gICAgICAgIG1vZGVsLnNldFRhYmxlRGF0YSh0YWJsZURhdGEpOwotCi0KLSAgICB9Ci0gICAgcHJpdmF0ZSB2b2lkIHNldEVuYWJsZWRGb3JDb2RlZ2VuVHlwZSgpewotICAgICAgICBpZihjbWJDb2RlR2VuT3B0aW9uLmdldFNlbGVjdGVkSXRlbSgpLmVxdWFscygiZGVmYXVsdCIpICl7Ci0gICAgICAgICAgICBjbWJkYnR5cGUuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICBjbWJMYW4uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICBjbWJQb3J0TmFtZSAuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICBjbWJTZXJ2aWNlTmFtZS5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgIHR4dFBhY2FrZ2VOYW1lLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgY21iZGJ0eXBlLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgaWYoY2hrVGVzdENhc2UuaXNTZWxlY3RlZCgpKSB7Ci0gICAgICAgICAgICAgICAgY2hrVGVzdENhc2Uuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgY2hrVGVzdENhc2Uuc2V0U2VsZWN0ZWQoZmFsc2UpOwotICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgY2hrVGVzdENhc2Uuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICBjbGllbnRTaWRlLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgcmRCb3RoIC5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgIHJkc3luLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgcmRhc3luYy5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgIHNlcnZlclNpZGUuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICB0YWJsZS5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgIHNwVGFibGUuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICBzZXJ2aWNlWE1MLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgc2VydmVyU2lkZUludGVyZmFjZS5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgIGFsbC5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICBjbWJkYnR5cGUuc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgIGNtYkxhbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgY21iUG9ydE5hbWUgLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICBjbWJTZXJ2aWNlTmFtZS5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgdHh0UGFjYWtnZU5hbWUuc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgIGNtYmRidHlwZS5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgIGlmKCFjbGllbnRTaWRlLmlzU2VsZWN0ZWQoKSkgewotICAgICAgICAgICAgICAgIGNsaWVudFNpZGUuc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICBjbGllbnRTaWRlLnNldFNlbGVjdGVkKHRydWUpOwotICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgY2xpZW50U2lkZS5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgc2VydmVyU2lkZS5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgdGFibGUuc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgIHNwVGFibGUuc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgIGFsbC5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgc2V0RW5hYmxlZEZvckN1c3RvbSgpOwotICAgICAgICB9Ci0gICAgfQotICAgIHByaXZhdGUgdm9pZCBzZXRFbmFibGVkRm9yQ3VzdG9tKCl7Ci0gICAgICAgIGlmKGNsaWVudFNpZGUuaXNTZWxlY3RlZCgpKXsKLSAgICAgICAgICAgIGlmKHNlcnZpY2VYTUwuaXNTZWxlY3RlZCgpfHxzZXJ2ZXJTaWRlSW50ZXJmYWNlLmlzU2VsZWN0ZWQoKSl7Ci0gICAgICAgICAgICAgICAgc2VydmVyU2lkZS5zZXRTZWxlY3RlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgc2VydmVyU2lkZUludGVyZmFjZS5zZXRTZWxlY3RlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgc2VydmljZVhNTC5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICBzZXJ2ZXJTaWRlSW50ZXJmYWNlLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICAgICAgc2VydmljZVhNTC5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICBzZXJ2ZXJTaWRlSW50ZXJmYWNlLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYocmRhc3luYy5pc1NlbGVjdGVkKCkpewotICAgICAgICAgICAgICAgIHJkYXN5bmMuc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICByZGFzeW5jLnNldFNlbGVjdGVkKGZhbHNlKTsKLSAgICAgICAgICAgIH1lbHNlewotICAgICAgICAgICAgICAgIHJkYXN5bmMuc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKCFyZEJvdGguaXNTZWxlY3RlZCgpKXsKLSAgICAgICAgICAgICAgICByZEJvdGguc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICByZEJvdGguc2V0U2VsZWN0ZWQodHJ1ZSk7Ci0gICAgICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgICAgICByZEJvdGguc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICBpZihyZHN5bi5pc1NlbGVjdGVkKCkpewotICAgICAgICAgICAgICAgIHJkc3luLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgcmRzeW4uc2V0U2VsZWN0ZWQoZmFsc2UpOwotICAgICAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICAgICAgcmRzeW4uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNoa1Rlc3RDYXNlLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgIH1lbHNlIGlmKHNlcnZlclNpZGUuaXNTZWxlY3RlZCgpKXsKLSAgICAgICAgICAgICBpZihzZXJ2aWNlWE1MLmlzU2VsZWN0ZWQoKXx8c2VydmVyU2lkZUludGVyZmFjZS5pc1NlbGVjdGVkKCkpewotICAgICAgICAgICAgICAgIHNlcnZlclNpZGUuc2V0U2VsZWN0ZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgIHNlcnZlclNpZGVJbnRlcmZhY2Uuc2V0U2VsZWN0ZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgIHNlcnZpY2VYTUwuc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICBzZXJ2ZXJTaWRlSW50ZXJmYWNlLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgICAgICBzZXJ2aWNlWE1MLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgc2VydmVyU2lkZUludGVyZmFjZS5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoIHJkYXN5bmMuaXNTZWxlY3RlZCgpfHxyZEJvdGguaXNTZWxlY3RlZCgpfHxyZHN5bi5pc1NlbGVjdGVkKCkpIHsKLSAgICAgICAgICAgICAgICByZGFzeW5jLnNldFNlbGVjdGVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICByZEJvdGguc2V0U2VsZWN0ZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgIHJkc3luLnNldFNlbGVjdGVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICByZGFzeW5jLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgIHJkQm90aC5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICByZHN5biAuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICB9IGVsc2V7Ci0gICAgICAgICAgICAgICAgcmRhc3luYy5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICByZEJvdGguc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgcmRzeW4gLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoY2hrVGVzdENhc2UuaXNTZWxlY3RlZCgpKSB7Ci0gICAgICAgICAgICAgICAgY2hrVGVzdENhc2Uuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgY2hrVGVzdENhc2Uuc2V0U2VsZWN0ZWQoZmFsc2UpOwotICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgY2hrVGVzdENhc2Uuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIH1lbHNlIGlmKGFsbC5pc1NlbGVjdGVkKCkpewotICAgICAgICAgICAgY2hrVGVzdENhc2Uuc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgIGlmKHNlcnZpY2VYTUwuaXNTZWxlY3RlZCgpfHxzZXJ2ZXJTaWRlSW50ZXJmYWNlLmlzU2VsZWN0ZWQoKSl7Ci0gICAgICAgICAgICAgICAgc2VydmVyU2lkZS5zZXRTZWxlY3RlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgc2VydmVyU2lkZUludGVyZmFjZS5zZXRTZWxlY3RlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgc2VydmljZVhNTC5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICBzZXJ2ZXJTaWRlSW50ZXJmYWNlLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICAgICAgc2VydmljZVhNTC5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICBzZXJ2ZXJTaWRlSW50ZXJmYWNlLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoIHJkYXN5bmMuaXNTZWxlY3RlZCgpfHxyZEJvdGguaXNTZWxlY3RlZCgpfHxyZHN5bi5pc1NlbGVjdGVkKCkpIHsKLSAgICAgICAgICAgICAgICByZGFzeW5jLnNldFNlbGVjdGVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICByZEJvdGguc2V0U2VsZWN0ZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgIHJkc3luLnNldFNlbGVjdGVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICByZGFzeW5jLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgIHJkQm90aC5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICByZHN5biAuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICB9IGVsc2V7Ci0gICAgICAgICAgICAgICAgcmRhc3luYy5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICByZEJvdGguc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgcmRzeW4gLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFja2FnZUZyb21OYW1lc3BhY2UoU3RyaW5nIG5hbWVzcGFjZSl7Ci0gICAgICAgIHJldHVybiAgVVJMUHJvY2Vzc29yLm1ha2VQYWNrYWdlTmFtZShuYW1lc3BhY2UpOwotICAgIH0KLSAgICBwdWJsaWMgIGludCBnZXRQYWdlVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuICBXaXphcmRQYW5lbC5XU0RMXzJfSkFWQV9UWVBFOwotICAgIH0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tQYWdlQ29tbGV0ZSgpewotICAgICAgICBpZihjbWJDb2RlR2VuT3B0aW9uLmdldFNlbGVjdGVkSXRlbSgpLmVxdWFscygiZGVmYXVsdCIpKXsKLSAgICAgICAgICAgIHNldFBhZ2VDb21wbGV0ZSh0cnVlKTsKLSAgICAgICAgICAgIHNldE5leHRCdXR0b25FbmFibGVkKHRydWUpOwotICAgICAgICB9IGVsc2V7Ci0gICAgICAgICAgICBpZih0eHRQYWNha2dlTmFtZS5nZXRUZXh0KCkuZXF1YWxzKCIiKSl7Ci0gICAgICAgICAgICAgICAgc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsKLSAgICAgICAgICAgICAgICBzZXROZXh0QnV0dG9uRW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICB9IGVsc2V7Ci0gICAgICAgICAgICAgICAgc2V0UGFnZUNvbXBsZXRlKHRydWUpOwotICAgICAgICAgICAgICAgIHNldE5leHRCdXR0b25FbmFibGVkKHRydWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIC8qKgotICAgICAqIHBvcHVsYXRlIHRoZSBzZXJ2aWNlIGFuZCB0aGUgcG9ydCBmcm9tIHRoZSBXU0RMIHRoaXMgbmVlZHMgdG8gYmUgcHVibGljCi0gICAgICogc2luY2UgdGhlIFdTRExzZWxlY3Rpb24gcGFnZSBtYXkgY2FsbCB0aGlzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcG9wdWxhdGVQYXJhbXNGcm9tV1NETCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFN0cmluZyBsbmFtZSA9IGNvZGVnZW5CZWFuLmdldFdTRExGaWxlTmFtZSgpOwotICAgICAgICAgICAgaWYgKCEiIi5lcXVhbHMobG5hbWUudHJpbSgpKSkgewotCi0gICAgICAgICAgICAgICAgY29kZWdlbkJlYW4ucmVhZFdTREwoKTsKLQotICAgICAgICAgICAgICAgIC8vIGVuYWJsZSB0aGUgY29tYm8ncwotICAgICAgICAgICAgICAgLy8gc2V0Q29tYm9Cb3hFbmFibGUodHJ1ZSk7Ci0KLSAgICAgICAgICAgICAgICB0aGlzLnNlcnZpY2VOYW1lTGlzdCA9IGNvZGVnZW5CZWFuLmdldFNlcnZpY2VMaXN0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFzZXJ2aWNlTmFtZUxpc3QuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNtYlNlcnZpY2VOYW1lLnJlbW92ZUFsbCgpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlcnZpY2VOYW1lTGlzdC5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRkIHRoZSBsb2NhbCBwYXJ0IG9mIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgY21iU2VydmljZU5hbWUuYWRkSXRlbSgoKFFOYW1lKSBzZXJ2aWNlTmFtZUxpc3QuZ2V0KGkpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgICAgICAvLyBzZWxlY3QgdGhlIGZpcnN0IG9uZSBhcyB0aGUgZGVmYXVsdAotICAgICAgICAgICAgICAgICAgICBjbWJTZXJ2aWNlTmFtZS5zZXRTZWxlY3RlZEluZGV4KDApOwotICAgICAgICAgICAgICAgICAgICAvL3NldENvbWJvQm94RW5hYmxlKGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gbG9hZCB0aGUgcG9ydHMKLSAgICAgICAgICAgICAgICAgICAgbG9hZFBvcnROYW1lcygpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHNlcnZpY2UgbmFtZSBsaXN0IGJlaW5nIGVtcHR5IG1lYW5zIHdlIGFyZSBzd2l0Y2hpbmcgdG8KLSAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGludGVyZmFjZSBtb2RlCi0gICAgICAgICAgICAgICAgICAgIGlmIChjbWJTZXJ2aWNlTmFtZSE9bnVsbCkgY21iU2VydmljZU5hbWUgLnJlbW92ZUFsbCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoY21iUG9ydE5hbWUhPW51bGwpIGNtYlBvcnROYW1lLnJlbW92ZUFsbCgpOwotICAgICAgICAgICAgICAgICAgICAvLyBkaXNhYmxlIHRoZSBjb21ibydzCi0gICAgICAgICAgICAgICAgICAgLy8gc2V0Q29tYm9Cb3hFbmFibGUoZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICAvL3RoaXMgaXMgbm90IGFuIGVycm9yCi0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwb3B1bGF0ZVBhY2thZ2VOYW1lKCk7Ci0KLSAgICAgICAgICAgICAgICAvL3BvcHVsYXRlIHRoZSBuYW1lc3BhY2VzcwotICAgICAgICAgICAgICAgIGxvYWROYW1lc3BhY2VzKGNvZGVnZW5CZWFuLmdldERlZmluaXRpb25OYW1lc3BhY2VNYXAoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKFdTRExFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gZGlzYWJsZSB0aGUgY29tYm8ncwotICAgICAgICAgICAgc2V0Q29tYm9Cb3hFbmFibGUoZmFsc2UpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gZGlzYWJsZSB0aGUgY29tYm8ncwotICAgICAgICAgICAgc2V0Q29tYm9Cb3hFbmFibGUoZmFsc2UpOwotICAgICAgICB9Ci0KLSAgICB9Ci0gICAgcHJpdmF0ZSB2b2lkIHBvcHVsYXRlUGFja2FnZU5hbWUoKSB7Ci0gICAgICAgIHRoaXMudHh0UGFjYWtnZU5hbWUuc2V0VGV4dChjb2RlZ2VuQmVhbi5wYWNrYWdlRnJvbVRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICB9Ci0gICAgcHJpdmF0ZSB2b2lkIHNldENvbWJvQm94RW5hYmxlKGJvb2xlYW4gYikgewotICAgICAgICBpZiAoY21iU2VydmljZU5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgY21iU2VydmljZU5hbWUgLnNldEVuYWJsZWQoYik7Ci0gICAgICAgICAgICBjbWJQb3J0TmFtZSAuc2V0RW5hYmxlZChiKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBwcml2YXRlIHZvaWQgbG9hZFBvcnROYW1lcygpIHsKLSAgICAgICAgaW50IHNlbGVjdGlvbkluZGV4ID0gY21iU2VydmljZU5hbWUuZ2V0U2VsZWN0ZWRJbmRleCgpOwotICAgICAgICBpZiAoc2VsZWN0aW9uSW5kZXggIT0gLTEpIHsKLSAgICAgICAgICAgIGphdmEudXRpbC5MaXN0IHBvcnRzID0gY29kZWdlbkJlYW4uZ2V0UG9ydE5hbWVMaXN0KChRTmFtZSkgc2VydmljZU5hbWVMaXN0Ci0gICAgICAgICAgICAgICAgICAgIC5nZXQoc2VsZWN0aW9uSW5kZXgpKTsKLSAgICAgICAgICAgIGlmICghcG9ydHMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgY21iUG9ydE5hbWUucmVtb3ZlQWxsKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwb3J0cy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAvLyBhZGQgdGhlIGxvY2FsIHBhcnQgb2YgdGhlCi0gICAgICAgICAgICAgICAgICAgIGNtYlBvcnROYW1lLmFkZEl0ZW0ocG9ydHMuZ2V0KGkpLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjbWJQb3J0TmFtZS5zZXRTZWxlY3RlZEluZGV4KDApOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvL1RvZG8gZXJyb3IgbWVzc2FnZSBudWxsCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcHVibGljIHZvaWQgcG9wdWxhdGVPcHRpb25zKCl7Ci0gICAgICAgIHBvcHVsYXRlUGFyYW1zRnJvbVdTREwoKTsKLSAgICB9Ci0gICAgcHJpdmF0ZSB2b2lkIGRpYWxvZ0NoYW5nZWQoKSB7Ci0gICAgICAgIFN0cmluZyBmaWxlTmFtZSA9IGdldFBhY2thZ2VOYW1lKCk7Ci0KLSAgICAgICAgaWYgKGZpbGVOYW1lLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIC8vVG9kbyBlcnJvciBtZXNzYWdlICJGaWxlIG5hbWUgc2hvdWxkIGJlIHNwZWNpZmllZCIKLSAgICAgICAgICAgIHNldEVycm9yKCJGaWxlIG5hbWUgc2hvdWxkIGJlIHNwZWNpZmllZCIsdHJ1ZSk7Ci0gICAgICAgICAgICBzZXRQYWdlQ29tcGxldGUoZmFsc2UpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy90cnkgcG9wdWxhdGUgdGhlIG9wdGlvbnMKLSAgICAgICAgLy8gICBnZXRXaXphcmRDb21wb25lbnRzKCkuZ2V0V2l6YXJkUGFuZWwoMykucG9wdWxhdGVPcHRpb25zKCk7Ci0gICAgICAgIHNldFBhZ2VDb21wbGV0ZSh0cnVlKTsKLSAgICAgICAgLy8gdXBkYXRlIHRoZSBzdGF0dXMKLSAgICAgICAgLy9Ub2RvIGVycm9yIG1lc3NhZ2UgbnVsbAotCi0gICAgfQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0ZWRMYW5ndWFnZSgpIHsKLSAgICAgICAgcmV0dXJuIGNtYkxhbi5nZXRTZWxlY3RlZEl0ZW0oKS50b1N0cmluZygpOwotICAgIH0KLSAgICAvKioKLSAgICAgKiB0aGUgYXN5bmMgb25seSBzdGF0dXMKLSAgICAgKgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiAiR2VuZXJhdGUgYXN5bmNocm9ub3VzIGNvZGUgb25seSIgaXMgY2hlY2tlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzQXN5bmNPbmx5T24oKSB7Ci0gICAgICAgIHJldHVybiByZGFzeW5jLmlzU2VsZWN0ZWQoKTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogdGhlIHN5bmMgb25seSBzdGF0dXMKLSAgICAgKgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiAiR2VuZXJhdGUgc3luY2hyb25vdXMgY29kZSBvbmx5IiBpcyBjaGVja2VkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNTeW5jT25seU9uKCkgewotICAgICAgICByZXR1cm4gcmRzeW4uaXNTZWxlY3RlZCgpOwotICAgIH0KLSAgICAvKioKLSAgICAgKiByZXR1cm4gdGhlIHBhY2thZ2UgbmFtZQotICAgICAqCi0gICAgICogQHJldHVybiBhIHN0cmluZyBjb250YWluaW5nIHRoZSBwYWNrYWdlIG5hbWUgdG8gdXNlIGZvciBjb2RlIGdlbmVyYXRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkgewotICAgICAgICBpZiAoIiIuZXF1YWxzKHR4dFBhY2FrZ2VOYW1lLmdldFRleHQoKS50cmltKCkpKXsKLSAgICAgICAgICAgIC8vd2UgZG8gbm90IGFsbG93IHRoZSBwYWNrYWdpbmcgdG8gYmUgZW1wdHkKLSAgICAgICAgICAgIC8vaWYgdGhlIHVzZXIgc2V0cyBpdCB0byBlbXB0eSB3ZSBzZXQgaXQgdG8KLSAgICAgICAgICAgIC8vdGhlIGRlZmF1bHQKLSAgICAgICAgICAgIHJldHVybiBVUkxQcm9jZXNzb3IuREVGQVVMVF9QQUNLQUdFOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzLnR4dFBhY2FrZ2VOYW1lLmdldFRleHQoKTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogVGhlIHNlcnZlcnNpZGUgc3RhdHVzCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgIkdlbmVyYXRlIFNlcnZlci1TaWRlIiBpcyBjaGVja2VkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNTZXJ2ZXJzaWRlKCkgewotICAgICAgICByZXR1cm4gdGhpcy5zZXJ2ZXJTaWRlLmlzU2VsZWN0ZWQoKTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgIkdlbmVyYXRlIFhNTCBjb25maWd1cmF0aW9uIGZpbGUiIGlzIGNoZWNrZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1NlcnZlclhNTCgpIHsKLSAgICAgICAgaWYgKHRoaXMuc2VydmljZVhNTC5pc0VuYWJsZWQoKSkKLSAgICAgICAgICAgIHJldHVybiB0aGlzLnNlcnZpY2VYTUwuaXNTZWxlY3RlZCgpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIC8qKgotICAgICAqCi0gICAgICogQHJldHVybiB0cnVlIGlmICJHZW5lcmF0ZSB0ZXN0IGNhc2UiIGlzIGNoZWNrZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0dlbmVyYXRlVGVzdENhc2UoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmNoa1Rlc3RDYXNlLmlzU2VsZWN0ZWQoKTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIG51bGwgaWYgcG9ydG5hbWUgaXMgZW1wdHkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBvcnROYW1lKCkgewotICAgICAgICBpbnQgc2VsZWN0aW9uSW5kZXggPSBjbWJQb3J0TmFtZS5nZXRTZWxlY3RlZEluZGV4KCk7Ci0gICAgICAgIGlmIChzZWxlY3Rpb25JbmRleCAhPSAtMSkgewotICAgICAgICAgICAgU3RyaW5nIHRleHQgPSB0aGlzLmNtYlBvcnROYW1lLmdldFNlbGVjdGVkSXRlbSgpLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICBpZiAodGV4dCA9PSBudWxsIHx8IHRleHQudHJpbSgpLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0ZXh0OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLyoqCi0gICAgICogQHJldHVybiBudWxsIGlmIHRoZSB0ZXh0IGlzIGVtcHR5Ci0gICAgICoKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNlcnZpY2VOYW1lKCkgewotICAgICAgICBpbnQgc2VsZWN0aW9uSW5kZXggPSBjbWJTZXJ2aWNlTmFtZS5nZXRTZWxlY3RlZEluZGV4KCk7Ci0gICAgICAgIC8vIGNhdGVyIGZvciB0aGUgc2NlbmFyaW8gd2hlcmUgdGhlIGNvbWJvJ3MgY2FuIGJlIGVtcHR5Ci0gICAgICAgIGlmIChzZWxlY3Rpb25JbmRleCAhPSAtMSkgewotICAgICAgICAgICAgU3RyaW5nIHRleHQgPSB0aGlzLmNtYlNlcnZpY2VOYW1lLmdldFNlbGVjdGVkSXRlbSgpLnRvU3RyaW5nKCk7Ci0KLSAgICAgICAgICAgIGlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC50cmltKCkuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRleHQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGF0YWJpbmRlck5hbWUoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmNtYmRidHlwZS5nZXRTZWxlY3RlZEl0ZW0oKS50b1N0cmluZygpOwotCi0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0R2VuZXJhdGVTZXJ2ZXJTaWRlSW50ZXJmYWNlKCkgewotICAgICAgICByZXR1cm4gdGhpcy5zZXJ2ZXJTaWRlSW50ZXJmYWNlLmlzU2VsZWN0ZWQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRHZW5lcmF0ZUFsbCgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuYWxsLmlzU2VsZWN0ZWQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5zMlBrZ01hcHBpbmcoKXsKLSAgICAgICAgU3RyaW5nIHJldHVybkxpc3Q9IiI7Ci0gICAgICAgIFN0cmluZyBwYWNrYWdlVmFsdWU7Ci0gICAgICAgIGZvciAoaW50IGk9MDtpPHRhYmxlLmdldFJvd0NvdW50KCkgO2krKyl7Ci0gICAgICAgICAgICBwYWNrYWdlVmFsdWUgPSB0YWJsZS5nZXRWYWx1ZUF0KGksMSkudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIGlmIChwYWNrYWdlVmFsdWUhPW51bGwgJiYgISIiLmVxdWFscyhwYWNrYWdlVmFsdWUpKXsKLSAgICAgICAgICAgICAgICByZXR1cm5MaXN0ID0gcmV0dXJuTGlzdCArCi0gICAgICAgICAgICAgICAgICAgICAgICAoIiIuZXF1YWxzKHJldHVybkxpc3QpPyIiOiIsIikgKwotICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUuZ2V0VmFsdWVBdChpLDApLnRvU3RyaW5nKCkrICI9IiArIHBhY2thZ2VWYWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gIiIuZXF1YWxzKHJldHVybkxpc3QpP251bGw6cmV0dXJuTGlzdDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlQ3VzdG9tUGFja2FnZU5hbWVNb2RpZnlFdmVudCgpIHsKLSAgICAgICAgLy8gVGhpcyBtZXRob2QgaXMgYWRkIGFzIGEgdGVtcG9yeSBmaXggZm9yIHRoZSBBeGlzMi0xMzY4Ci0gICAgICAgIC8vIFRPRE8gZml4IHRoaXMgcGVybWFuYW50bHkuCi0gICAgICAgIFN0cmluZyB0ZXh0ID0gdGhpcy50eHRQYWNha2dlTmFtZS5nZXRUZXh0KCk7Ci0gICAgICAgIGlmICgodGV4dCA9PSBudWxsKSB8fCAodGV4dC50cmltKCkuZXF1YWxzKCIiKSl8fCAodGV4dC5lbmRzV2l0aCgiLiIpKSB8fCAodGV4dC5zdGFydHNXaXRoKCIuIikpKSB7Ci0gICAgICAgICAgICAvL1RvZG8gZXJyb3IgbWVzc2FnZSAiSW52YWxpZCBwYWNrYWdlIG5hbWUuIFBsZWFzZSBlbnRlciBhIHZhbGlkIHBhY2thZ2UgbmFtZS4iCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgLy9Ub2RvIGVycm9yIG1lc3NhZ2UgbnVsbAotICAgIH0KLQotfQotCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29scy9pZGVhL1NlcnZpY2VBcmNoaXZlQ3JlYXRvci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbHMvaWRlYS9TZXJ2aWNlQXJjaGl2ZUNyZWF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2QxZDYyMi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29scy9pZGVhL1NlcnZpY2VBcmNoaXZlQ3JlYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnRvb2xzLmlkZWE7Ci0KLWltcG9ydCBjb20uaW50ZWxsaWoub3BlbmFwaS5hY3Rpb25TeXN0ZW0uQWN0aW9uUGxhY2VzOwotaW1wb3J0IGNvbS5pbnRlbGxpai5vcGVuYXBpLmFjdGlvblN5c3RlbS5BbkFjdGlvbjsKLWltcG9ydCBjb20uaW50ZWxsaWoub3BlbmFwaS5hY3Rpb25TeXN0ZW0uQW5BY3Rpb25FdmVudDsKLWltcG9ydCBjb20uaW50ZWxsaWoub3BlbmFwaS5hY3Rpb25TeXN0ZW0uUHJlc2VudGF0aW9uOwotCi1pbXBvcnQgamF2YXguc3dpbmcuKjsKLQotcHVibGljIGNsYXNzIFNlcnZpY2VBcmNoaXZlQ3JlYXRvciBleHRlbmRzIEFuQWN0aW9uIHsKLSAgICBwcml2YXRlIEltYWdlSWNvbiBteUljb247Ci0KLSAgICBwdWJsaWMgU2VydmljZUFyY2hpdmVDcmVhdG9yKCkgewotICAgICAgICBzdXBlcigiR0MiLCAiQ3JlYXRlIFNlcnZpY2UgQXJjaGl2ZSBGaWxlIiwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFuQWN0aW9uRXZlbnQgZXZlbnQpIHsKLS8vICAgICAgICBKYXZhMkNvZGVGcmFtZSB3aW4gPSBuZXcgSmF2YTJDb2RlRnJhbWUoKTsKLS8vICAgICAgICB3aW4uc2V0UHJvamVjdCgoUHJvamVjdCkgZXZlbnQuZ2V0RGF0YUNvbnRleHQoKS5nZXREYXRhKERhdGFDb25zdGFudHMuUFJPSkVDVCkpOwotLy8gICAgICAgIHdpbi5wYWNrKCk7Ci0vLyAgICAgICAgd2luLnNob3coKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB1cGRhdGUoQW5BY3Rpb25FdmVudCBldmVudCkgewotICAgICAgICBzdXBlci51cGRhdGUoZXZlbnQpOwotICAgICAgICBQcmVzZW50YXRpb24gcHJlc2VudGF0aW9uID0gZXZlbnQuZ2V0UHJlc2VudGF0aW9uKCk7Ci0gICAgICAgIGlmIChBY3Rpb25QbGFjZXMuTUFJTl9UT09MQkFSLmVxdWFscyhldmVudC5nZXRQbGFjZSgpKSkgewotICAgICAgICAgICAgaWYgKG15SWNvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgamF2YS5uZXQuVVJMIHJlc291cmNlID0gU2VydmljZUFyY2hpdmVDcmVhdG9yLmNsYXNzLmdldFJlc291cmNlKCIvaWNvbnMvZ2FyYmFnZS5wbmciKTsKLSAgICAgICAgICAgICAgICBteUljb24gPSBuZXcgSW1hZ2VJY29uKHJlc291cmNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHByZXNlbnRhdGlvbi5zZXRJY29uKG15SWNvbik7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29scy9pZGVhL1dTREwySmF2YU91dHB1dFBhbmVsLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29scy9pZGVhL1dTREwySmF2YU91dHB1dFBhbmVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjNzBjOTYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbHMvaWRlYS9XU0RMMkphdmFPdXRwdXRQYW5lbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTk2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50b29scy5pZGVhOwotCi1pbXBvcnQgY29tLmludGVsbGlqLm9wZW5hcGkubW9kdWxlLk1vZHVsZTsKLWltcG9ydCBjb20uaW50ZWxsaWoub3BlbmFwaS5wcm9qZWN0LlByb2plY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29scy5iZWFuLkNvZGVnZW5CZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbHMuY29tcG9uZW50LldpemFyZENvbXBvbmVudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29scy5jb21wb25lbnQuV2l6YXJkUGFuZWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29scy53aXphcmRmcmFtZS5Db2RlZ2VuRnJhbWU7Ci0KLWltcG9ydCBqYXZheC5zd2luZy4qOwotaW1wb3J0IGphdmF4LnN3aW5nLmJvcmRlci5FbXB0eUJvcmRlcjsKLWltcG9ydCBqYXZhLmF3dC4qOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkV2ZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkxpc3RlbmVyOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotcHVibGljIGNsYXNzIFdTREwySmF2YU91dHB1dFBhbmVsIGV4dGVuZHMgV2l6YXJkUGFuZWwgewotCi0gICAgcHJpdmF0ZSBKVGV4dEZpZWxkIHR4dG91dHB1dDsKLSAgICBwcml2YXRlIEpUZXh0RmllbGQgdHh0YXhpc0hvbWU7Ci0gICAgcHJpdmF0ZSBKVGV4dEZpZWxkIHR4dGphckZpbGVOYW1lOwotICAgIHByaXZhdGUgSkJ1dHRvbiBidG5Ccm93c2VPdXRwdXQ7Ci0gICAgcHJpdmF0ZSBKQnV0dG9uIGJ0bkJyb3dzZUF4aXNIb21lOwotICAgIHByaXZhdGUgSkJ1dHRvbiBidG5DaGVja0xpYjsKLSAgICBwcml2YXRlIEpSYWRpb0J1dHRvbiByYWRDdXJyZW50UHJvamVjdDsKLSAgICBwcml2YXRlIEpSYWRpb0J1dHRvbiByYWRDdXN0b21Mb2NhdGlvbjsKLSAgICBwcml2YXRlIEpDaGVja0JveCBjaGJBZGRBeGlzQ29kZWdlbkphcjsKLSAgICBwcml2YXRlIEpDaGVja0JveCBjaGJBZGRBeGlzTGliOwotICAgIHByaXZhdGUgSkNoZWNrQm94IGNoYkNyZWF0ZUphcjsKLSAgICBwcml2YXRlIEpMYWJlbCBsYmxNZXNzYWdlOwotICAgIHByaXZhdGUgSlRleHRBcmVhIHR4dGFUaWx0ZTsKLSAgICBwcml2YXRlIEpDb21ib0JveCBjbWJDdXJyZW50UHJvamVjdDsKLSAgICBwcml2YXRlIEpDb21ib0JveCBjbWJNb2R1bGVTcmM7Ci0gICAgcHJpdmF0ZSBKTGFiZWwgIGxibEFzaXhIb21lOwotICAgIHByaXZhdGUgSkxhYmVsIGxibEphckZpbGVOYW1lOwotICAgIHByaXZhdGUgSkxhYmVsIGxibG91dHB1dDsKLSAgICBwcml2YXRlIEpMYWJlbCBsYmxNb2R1bGU7Ci0gICAgcHJpdmF0ZSBKTGFiZWwgbGJsRGlyZWN0b3J5OwotICAgIGZpbmFsIEpGaWxlQ2hvb3NlciBEaXJDaG9vc2VyPW5ldyBKRmlsZUNob29zZXIoKTsKLSAgICBmaW5hbCBwcml2YXRlIFN0cmluZyB0aXRsZT0iU2VsZWN0IG9uZSBvZiBiZWxvdyB0byBzYXZlIHRoZSBjb2RlZ2VuIG91dHB1dCBlaXRoZXIgb24gaWRlYSB3b3Jrc3BhY2UgcHJvamVjdCBvciBvbiBmaWxlICIgKwotICAgICAgICAgICAgInN5c3RlbSBhbmQgdGhlbiBicm93c2UgdG8gZW50ZXIgdGhlIG91dHB1dCBwYXRoIjsKLSAgICBmaW5hbCBwcml2YXRlIFN0cmluZyBoaW50PSJJZiB5b3UgaGF2ZSBBeGlzMiBiaW5hcnkgZGlzdHJpYnV0aW9uIG9yIEF4aXMgc291cmNlLCB0aGVuIHlvdSBjYW4gYWRkIHRob3NlIGxpYnMgYWxzbyB0byB0aGUiICsKLSAgICAgICAgICAgICIgcmVzdWx0ZWQgY29kZWdlbiBwcm9qZWN0IGJ5IGNoZWNraW5nIHRoZSBcIkFkZCBBeGlzMiBMaWJyYXJpZXMgdG8gdGhlIGNvZGVnZW4gcmVzdWx0ZWQgcHJvamVjdFwiIiArCi0gICAgICAgICAgICAiIGNoZWNrIGJveCBhbmQgc3BlY2lmeWluZyB0aGUgQXhpczIgaG9tZS4gQW5vdGhlciBvcHRpb24geW91IGhhdmUgaXMgdG8gY29tcGlsZSB0aGUgY29kZWdlbiAiICsKLSAgICAgICAgICAgICIgcmVzdWx0IHByb2plY3QgYW5kIGFkZCBpdCBhcyBhIGphciBmaWxlIGluIHRoZSBsaWIgZGlyZWN0b3J5IG9mIHRoZSByZXN1bHRlZCBwcm9qZWN0LCBmb3IgdGhhdCB5b3UgY2FuIiArCi0gICAgICAgICAgICAiIGNoZWNrIHRoZSBcIkNyZWF0ZSBhIGphciBmaWxlIG9mIGNvZGVnZW4gcmVzdWx0IHByb2plY3QgYW5kIGFkZCB0byByZXN1bHRlZCBwcm9qZWN0IGxpYiBmb2xkZXJcIiIgKwotICAgICAgICAgICAgIiBjaGVja2JveCBhbmQgdGhlbiBnaXZlIHRoZSBqYXIgZmlsZSBuYW1lIHRoYXQgeW91IHByZWZlci4gXG4iICsKLSAgICAgICAgICAgICIgSWYgeW91IGFyZSBhZGRpbmcgdGhlIGNvZGVnZW4gcmVzdWx0IHRvIGEgZWNsaXBzZSBwcm9qZWN0IG9uIGN1cnJlbnQgZWNsaXBzZSB3b3Jrc3BhY2UsIiArCi0gICAgICAgICAgICAiIHBsZWFzZSBtYWtlIHN1cmUgdG8gcmVmcmVzaCB0aGF0IHBhcnRpY3VsYXIgZWNsaXBzZSBwcm9qZWN0LlxuIiArCi0gICAgICAgICAgICAiIEFsc28gaWYgeW91IHNlbGVjdCB0aGUgb3B0aW9ucyB0byBhZGQgbGlicyB0byB0aGUgcHJvamVjdCwgbWFrZSBzdXJlIHRvIGFkZCB0aG9zZSBsaWJzIHRvIHRoZSIgKwotICAgICAgICAgICAgIiBwcm9qZWN0IGxpYnJhcnkgcGF0aC4iOwotCi0gICAgcHJpdmF0ZSBDb2RlZ2VuQmVhbiBjb2RlZ2VuQmVhbjsKLSAgICBwcml2YXRlIGJvb2xlYW4gZmxhZyA9IHRydWU7Ci0gICAgcHJpdmF0ZSBQcm9qZWN0IHByb2plY3Q7Ci0gICAgcHJpdmF0ZSBKQnV0dG9uIGJ0bkhpbnQ7Ci0gICAgcHJpdmF0ZSBKVGV4dEFyZWEgdHhhSGludDsKLSAgICBwcml2YXRlIGJvb2xlYW4gamFyRmlsZUNvcHlPcHRpb24gPSBmYWxzZTsKLSAgICBwcml2YXRlIFN0cmluZyBheGlzMkxpYnNMb2NhdGlvbiA9IG51bGw7Ci0KLQotICAgIHB1YmxpYyBXU0RMMkphdmFPdXRwdXRQYW5lbChXaXphcmRDb21wb25lbnRzIHdpemFyZENvbXBvbmVudHMsQ29kZWdlbkJlYW4gY29kZWdlbkJlYW4sIFByb2plY3QgcHJvamVjdCkgewotICAgICAgICBzdXBlcih3aXphcmRDb21wb25lbnRzLCAiQXhpczIgSWRlYSBQbHVnaW4gV1NETDJKYXZhIFdpemFyZHMiKTsKLSAgICAgICAgdGhpcy5jb2RlZ2VuQmVhbj1jb2RlZ2VuQmVhbjsKLSAgICAgICAgdGhpcy5wcm9qZWN0PXByb2plY3Q7Ci0gICAgICAgIHNldFBhbmVsVG9wVGl0bGUoIk91dHB1dCIpOwotICAgICAgICBzZXRQYW5lbEJvdHRvbVRpdGxlKCJzZXQgdGhlIG91dCBsb2NhdGlvbiBmb3IgdGhlIGdlbmVyYXRlZCBjb2RlIik7Ci0gICAgICAgIGluaXQoKTsKLSAgICB9Ci0gICAgcHJpdmF0ZSB2b2lkIGluaXQoKXsKLSAgICAgICAgdHhhSGludCA9bmV3IEpUZXh0QXJlYSgpOwotICAgICAgICB0eGFIaW50LnNldEJvcmRlcihudWxsKTsKLSAgICAgICAgdHhhSGludC5zZXRGb2N1c2FibGUoZmFsc2UpOwotICAgICAgICB0eGFIaW50LnNldExpbmVXcmFwKHRydWUpOwotICAgICAgICB0eGFIaW50LnNldFdyYXBTdHlsZVdvcmQodHJ1ZSk7Ci0gICAgICAgIHR4YUhpbnQuc2V0T3BhcXVlKGZhbHNlKTsKLSAgICAgICAgYnRuSGludCA9bmV3IEpCdXR0b24oIkhpbnQgPj4iKTsKLSAgICAgICAgYnRuSGludC5zZXRCb3JkZXIobmV3IEVtcHR5Qm9yZGVyKG5ldyBJbnNldHMoMCwwLDAsMCkpKTsKLSAgICAgICAgbGJsTWVzc2FnZSA9IG5ldyBKTGFiZWwoKTsKLSAgICAgICAgbGJsTWVzc2FnZS5zZXRPcGFxdWUodHJ1ZSk7Ci0gICAgICAgIGxibE1lc3NhZ2Uuc2V0QmFja2dyb3VuZChDb2xvci53aGl0ZSk7Ci0gICAgICAgIGJ0bkJyb3dzZUF4aXNIb21lID1uZXcgSkJ1dHRvbigiQnJvd3NlLi4iKTsKLSAgICAgICAgYnRuQnJvd3NlT3V0cHV0ID1uZXcgSkJ1dHRvbigiQnJvd3NlLi4iKTsKLSAgICAgICAgYnRuQ2hlY2tMaWIgPW5ldyBKQnV0dG9uKCJDaGVjayBMaWJzLi4iKTsKLSAgICAgICAgY21iQ3VycmVudFByb2plY3QgPW5ldyBKQ29tYm9Cb3goKTsKLSAgICAgICAgY21iQ3VycmVudFByb2plY3Quc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIGNtYk1vZHVsZVNyYz1uZXcgSkNvbWJvQm94KCk7Ci0gICAgICAgIGNtYk1vZHVsZVNyYy5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgdHh0b3V0cHV0PW5ldyBKVGV4dEZpZWxkKCk7Ci0gICAgICAgIHR4dGF4aXNIb21lID1uZXcgSlRleHRGaWVsZCgiVW5wYWNrZWQgQXhpczIgYmluYXJ5IGhvbWUgT3IgQXhpczIgc291cmNlIGxvY2F0aW9uIik7Ci0gICAgICAgIHR4dGphckZpbGVOYW1lID1uZXcgSlRleHRGaWVsZCgpOwotICAgICAgICB0eHRhVGlsdGUgPW5ldyBKVGV4dEFyZWEodGl0bGUpOwotICAgICAgICB0eHRhVGlsdGUuc2V0Qm9yZGVyKG51bGwpOwotICAgICAgICB0eHRhVGlsdGUuc2V0Rm9jdXNhYmxlKGZhbHNlKTsKLSAgICAgICAgdHh0YVRpbHRlLnNldExpbmVXcmFwKHRydWUpOwotICAgICAgICB0eHRhVGlsdGUuc2V0V3JhcFN0eWxlV29yZCh0cnVlKTsKLSAgICAgICAgdHh0YVRpbHRlLnNldE9wYXF1ZShmYWxzZSk7Ci0gICAgICAgIGxibEFzaXhIb21lPW5ldyBKTGFiZWwoIkF4aXMyIEhvbWUiKTsKLSAgICAgICAgbGJsQXNpeEhvbWUuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIGxibEphckZpbGVOYW1lID0gbmV3IEpMYWJlbCgiSmFyIEZpbGUgTmFtZSIpOwotICAgICAgICBsYmxKYXJGaWxlTmFtZS5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgbGJsRGlyZWN0b3J5PSBuZXcgSkxhYmVsKCJTZWxlY3QgdGhlIERpcmVjdG9yeSIpOwotICAgICAgICBsYmxNb2R1bGUgPSBuZXcgSkxhYmVsKCJTZWxlY3QgdGhlIE1vZHVsZSIpOwotICAgICAgICBsYmxvdXRwdXQgPW5ldyBKTGFiZWwoIk91dCBwdXQgcGF0aCIpOwotICAgICAgICBjaGJBZGRBeGlzQ29kZWdlbkphciA9bmV3IEpDaGVja0JveCgiQWRkIHRoZSBBeGlzMiBDb2RlZ2VuIGphcnMgdG8gdGhlIGNvZGVnZW4gcmVzdWx0ZWQgcHJvamVjdCIpOwotICAgICAgICBjaGJBZGRBeGlzTGliID1uZXcgSkNoZWNrQm94KCIgQWRkIEF4aXMyIGxpYnJhcmllcyB0byB0aGUgY29kZWdlbiByZXN1bHQgcHJvamVjdCAiKTsKLSAgICAgICAgY2hiQ3JlYXRlSmFyPW5ldyBKQ2hlY2tCb3goIiBDcmVhdGUgYSBqYXIgZmlsZSBvZiBjb2RlZ2VuIHJlc3VsdCBwcm9qZWN0IGFuZCBhZGQgdG8gcmVzdWx0ZWQgcHJvamVjdCBsaWIgZm9sZGVyKERlZmF1bHQgOkNvZGVnZW5SZXN1bHRzLmphcikiKTsKLSAgICAgICAgcmFkQ3VycmVudFByb2plY3QgPW5ldyBKUmFkaW9CdXR0b24oIkJyb3dzZSBhbmQgc2VsZWN0IGEgcHJvamVjdCBvbiBjdXJyZW50IGlkZWEgd29ya3NwYWNlIixmYWxzZSk7Ci0gICAgICAgIHJhZEN1c3RvbUxvY2F0aW9uID1uZXcgSlJhZGlvQnV0dG9uKCJCcm93c2UgYW5kIHNlbGVjdCBsb2NhdGlvbiBvbiBsb2NhbCBmaWxlIHN5c3RlbSIsdHJ1ZSk7Ci0gICAgICAgIEJ1dHRvbkdyb3VwICBidXR0b25Hcm91cD0gbmV3ICBCdXR0b25Hcm91cCgpOwotICAgICAgICBidXR0b25Hcm91cC5hZGQocmFkQ3VycmVudFByb2plY3QgKTsKLSAgICAgICAgYnV0dG9uR3JvdXAuYWRkKHJhZEN1c3RvbUxvY2F0aW9uKTsKLQotICAgICAgICBjb2RlZ2VuQmVhbi5zZXRQcm9qZWN0KHByb2plY3QpOwotICAgICAgICBzZXROZXh0QnV0dG9uRW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIHRoaXMuc2V0TGF5b3V0KG5ldyBHcmlkQmFnTGF5b3V0KCkgKTsKLQotICAgICAgICB0aGlzLmFkZCh0eHRhVGlsdGUKLSAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMCwgMCwgR3JpZEJhZ0NvbnN0cmFpbnRzLlJFTUFJTkRFUiAsIDEsIDAuMCwgMC4wCi0gICAgICAgICAgICAgICAgLCBHcmlkQmFnQ29uc3RyYWludHMuV0VTVCAsIEdyaWRCYWdDb25zdHJhaW50cy5IT1JJWk9OVEFMCi0gICAgICAgICAgICAgICAgLCBuZXcgSW5zZXRzKDUsIDEwLCAwLDEwKSwgMCwgMCkpOwotICAgICAgICB0aGlzLmFkZChyYWRDdXJyZW50UHJvamVjdAotICAgICAgICAgICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygwLCAxLCBHcmlkQmFnQ29uc3RyYWludHMuUkVNQUlOREVSLCAxLCAwLjAsIDAuMAotICAgICAgICAgICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLldFU1QgLCBHcmlkQmFnQ29uc3RyYWludHMuTk9ORQotICAgICAgICAgICAgICAgICwgbmV3IEluc2V0cyg1LCAxMCwgMCwxMCksIDAsIDApKTsKLSAgICAgICAgcmFkQ3VycmVudFByb2plY3QuYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgY21iQ3VycmVudFByb2plY3Quc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICBjbWJNb2R1bGVTcmMuc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICB0eHRvdXRwdXQuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgYnRuQnJvd3NlT3V0cHV0LnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgIGxvYWRDbWJDdXJyZW50UHJvamVjdCgpOwotICAgICAgICAgICAgICAgIGxvYWRjbWJNb2R1bGVTcmNQcm9qZWN0KCk7Ci0gICAgICAgICAgICAgICAgc2V0RmluaXNoQnV0dG9uRW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICB1cGRhdGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIHRoaXMuYWRkKGxibE1vZHVsZQotICAgICAgICAgICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygwLCAyLCAxLCAxLCAgMC4xLCAwLjAKLSAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5XRVNUICAsIEdyaWRCYWdDb25zdHJhaW50cy5OT05FCi0gICAgICAgICAgICAgICAgLCBuZXcgSW5zZXRzKDUsIDEwLCAwLCAwKSwgMCwgMCkpOwotCi0gICAgICAgIHRoaXMuYWRkKGNtYkN1cnJlbnRQcm9qZWN0Ci0gICAgICAgICAgICAgICAgLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDEsIDIsIDEsIDEsIDEuMCwgMC4wCi0gICAgICAgICAgICAgICAgLCBHcmlkQmFnQ29uc3RyYWludHMuV0VTVCAsIEdyaWRCYWdDb25zdHJhaW50cy5IT1JJWk9OVEFMCi0gICAgICAgICAgICAgICAgLCBuZXcgSW5zZXRzKDUsIDAsIDAsMCksIDAsIDApKTsKLSAgICAgICAgY21iQ3VycmVudFByb2plY3QuYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgbG9hZGNtYk1vZHVsZVNyY1Byb2plY3QoKTsKLSAgICAgICAgICAgICAgICB1cGRhdGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIHRoaXMuYWRkKGxibERpcmVjdG9yeQotICAgICAgICAgICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygwLCAzLCAxLCAxLCAgMC4xLCAwLjAKLSAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5XRVNUICAsIEdyaWRCYWdDb25zdHJhaW50cy5OT05FCi0gICAgICAgICAgICAgICAgLCBuZXcgSW5zZXRzKDUsIDEwLCAwLCAwKSwgMCwgMCkpOwotCi0gICAgICAgIHRoaXMuYWRkKGNtYk1vZHVsZVNyYwotICAgICAgICAgICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygxLCAzLCAxLCAxLCAxLjAsIDAuMAotICAgICAgICAgICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLldFU1QgLCBHcmlkQmFnQ29uc3RyYWludHMuSE9SSVpPTlRBTAotICAgICAgICAgICAgICAgICwgbmV3IEluc2V0cyg1LCAwLCAwLDApLCAwLCAwKSk7Ci0gICAgICAgIGNtYk1vZHVsZVNyYy5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSAgewotICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIHRoaXMuYWRkKHJhZEN1c3RvbUxvY2F0aW9uCi0gICAgICAgICAgICAgICAgLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDAsIDQsIEdyaWRCYWdDb25zdHJhaW50cy5SRU1BSU5ERVIsIDEsIDAuMCwgMC4wCi0gICAgICAgICAgICAgICAgLCBHcmlkQmFnQ29uc3RyYWludHMuV0VTVCAsIEdyaWRCYWdDb25zdHJhaW50cy5IT1JJWk9OVEFMCi0gICAgICAgICAgICAgICAgLCBuZXcgSW5zZXRzKDUsIDEwLCAwLDEwKSwgMCwgMCkpOwotICAgICAgICByYWRDdXN0b21Mb2NhdGlvbi5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSAgewotICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBjbWJDdXJyZW50UHJvamVjdC5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICBjbWJNb2R1bGVTcmMuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgdHh0b3V0cHV0LnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgYnRuQnJvd3NlT3V0cHV0LnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgc2V0RW5hYmxlZEZvckN1c3RvbVByb2plY3QoKTsKLSAgICAgICAgICAgICAgICB1cGRhdGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIHRoaXMuYWRkKGxibG91dHB1dAotICAgICAgICAgICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygwLCA1LCAxLCAxLCAwLjEsIDAuMAotICAgICAgICAgICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLldFU1QgLCBHcmlkQmFnQ29uc3RyYWludHMuTk9ORQotICAgICAgICAgICAgICAgICwgbmV3IEluc2V0cyg1LCAxMCwgMCwwKSwgMCwgMCkpOwotICAgICAgICB0aGlzLmFkZCh0eHRvdXRwdXQKLSAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMSwgNSwgMSwgMSwgMS4wLCAwLjAKLSAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5XRVNUICwgR3JpZEJhZ0NvbnN0cmFpbnRzLkhPUklaT05UQUwKLSAgICAgICAgICAgICAgICAsIG5ldyBJbnNldHMoNSwgMCwgMCwwKSwgMCwgMCkpOwotICAgICAgICB0aGlzLmFkZChidG5Ccm93c2VPdXRwdXQKLSAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMiwgNSwgMSwgMSwgMC4xLCAwLjAKLSAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5FQVNUICwgR3JpZEJhZ0NvbnN0cmFpbnRzLk5PTkUKLSAgICAgICAgICAgICAgICAsIG5ldyBJbnNldHMoNSwgMCwgMCwxMCksIDAsIDApKTsKLSAgICAgICAgYnRuQnJvd3NlT3V0cHV0IC5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSAgewotICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBEaXJDaG9vc2VyIC5zZXRGaWxlU2VsZWN0aW9uTW9kZShKRmlsZUNob29zZXIuRElSRUNUT1JJRVNfT05MWSk7Ci0gICAgICAgICAgICAgICAgaW50IHJldHVyblZhbCA9IERpckNob29zZXIuc2hvd09wZW5EaWFsb2coYnRuQnJvd3NlT3V0cHV0ICk7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHVyblZhbCA9PSBKRmlsZUNob29zZXIuQVBQUk9WRV9PUFRJT04pIHsKLSAgICAgICAgICAgICAgICAgICAgRGlyQ2hvb3Nlci5zZXRGaWxlU2VsZWN0aW9uTW9kZShKRmlsZUNob29zZXIgLkZJTEVTX09OTFkgKTsKLSAgICAgICAgICAgICAgICAgICAgRmlsZSBuZXdmaWxlID0gRGlyQ2hvb3Nlci5nZXRTZWxlY3RlZEZpbGUoKTsKLSAgICAgICAgICAgICAgICAgICAgdHh0b3V0cHV0LnNldFRleHQobmV3ZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzZXRGaW5pc2hCdXR0b25FbmFibGVkKHRydWUpOwotICAgICAgICAgICAgICAgIHVwZGF0ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgdGhpcy5hZGQoY2hiQWRkQXhpc0NvZGVnZW5KYXIKLSAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMCwgNiwgR3JpZEJhZ0NvbnN0cmFpbnRzLlJFTUFJTkRFUiwgMSwgMC4wLCAwLjAKLSAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5XRVNUICwgR3JpZEJhZ0NvbnN0cmFpbnRzLkhPUklaT05UQUwKLSAgICAgICAgICAgICAgICAsIG5ldyBJbnNldHMoNSwgMTAsIDAsMTApLCAwLCAwKSk7Ci0gICAgICAgIGNoYkFkZEF4aXNDb2RlZ2VuSmFyLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpewotICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIHRoaXMuYWRkKG5ldyBKU2VwYXJhdG9yKCkKLSAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMCwgNywgR3JpZEJhZ0NvbnN0cmFpbnRzLlJFTUFJTkRFUiwgMSwgMC4wLCAwLjAKLSAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5XRVNUICwgR3JpZEJhZ0NvbnN0cmFpbnRzLkhPUklaT05UQUwKLSAgICAgICAgICAgICAgICAsIG5ldyBJbnNldHMoNSwgMSwgMCwxKSwgMCwgMCkpOwotCi0gICAgICAgIHRoaXMuYWRkKGNoYkFkZEF4aXNMaWIKLSAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMCwgOCwgR3JpZEJhZ0NvbnN0cmFpbnRzLlJFTUFJTkRFUiwgMSwgMC4wLCAwLjAKLSAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5XRVNUICwgR3JpZEJhZ0NvbnN0cmFpbnRzLkhPUklaT05UQUwKLSAgICAgICAgICAgICAgICAsIG5ldyBJbnNldHMoNSwgMTAsIDAsMTApLCAwLCAwKSk7Ci0gICAgICAgIGNoYkFkZEF4aXNMaWIgLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpewotICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBzZXRFbmFibGVkRm9yQWRkQXhpc0xpYigpOwotICAgICAgICAgICAgICAgIGhhbmRsZUxvYWRMaWJzQnJvd3NlKCk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICB0aGlzLmFkZChsYmxBc2l4SG9tZQotICAgICAgICAgICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygwLCA5LCAxLCAxLCAwLjEsIDAuMAotICAgICAgICAgICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLldFU1QgLCBHcmlkQmFnQ29uc3RyYWludHMuTk9ORQotICAgICAgICAgICAgICAgICwgbmV3IEluc2V0cyg1LCAxMCwgMCwxMCksIDAsIDApKTsKLSAgICAgICAgdGhpcy5hZGQodHh0YXhpc0hvbWUKLSAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMSwgOSwgMSwgMSwgMS4wLCAwLjAKLSAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5XRVNUICwgR3JpZEJhZ0NvbnN0cmFpbnRzLkhPUklaT05UQUwKLSAgICAgICAgICAgICAgICAsIG5ldyBJbnNldHMoNSwgMCwgMCwwKSwgMCwgMCkpOwotICAgICAgICB0aGlzLmFkZChidG5Ccm93c2VBeGlzSG9tZQotICAgICAgICAgICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygyLCA5LCAxLCAxLCAwLjEsIDAuMAotICAgICAgICAgICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLkVBU1QgLCBHcmlkQmFnQ29uc3RyYWludHMuTk9ORQotICAgICAgICAgICAgICAgICwgbmV3IEluc2V0cyg1LCAwLCAwLDEwKSwgMCwgMCkpOwotICAgICAgICBidG5Ccm93c2VBeGlzSG9tZSAuYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgRGlyQ2hvb3NlciAuc2V0RmlsZVNlbGVjdGlvbk1vZGUoSkZpbGVDaG9vc2VyLkRJUkVDVE9SSUVTX09OTFkpOwotICAgICAgICAgICAgICAgIGludCByZXR1cm5WYWwgPSBEaXJDaG9vc2VyLnNob3dPcGVuRGlhbG9nKGJ0bkJyb3dzZUF4aXNIb21lICk7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHVyblZhbCA9PSBKRmlsZUNob29zZXIuQVBQUk9WRV9PUFRJT04pIHsKLSAgICAgICAgICAgICAgICAgICAgRGlyQ2hvb3Nlci5zZXRGaWxlU2VsZWN0aW9uTW9kZShKRmlsZUNob29zZXIgLkZJTEVTX09OTFkgKTsKLSAgICAgICAgICAgICAgICAgICAgRmlsZSBuZXdmaWxlID0gRGlyQ2hvb3Nlci5nZXRTZWxlY3RlZEZpbGUoKTsKLSAgICAgICAgICAgICAgICAgICAgdHh0YXhpc0hvbWUgLnNldFRleHQobmV3ZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB1cGRhdGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIHRoaXMuYWRkKGJ0bkNoZWNrTGliCi0gICAgICAgICAgICAgICAgLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDAsIDEwLCAxLCAxLCAwLjEsIDAuMAotICAgICAgICAgICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLldFU1QgLCBHcmlkQmFnQ29uc3RyYWludHMuTk9ORQotICAgICAgICAgICAgICAgICwgbmV3IEluc2V0cyg1LCAxMCwgMCwxMCksIDAsIDApKTsKLSAgICAgICAgYnRuQ2hlY2tMaWIgLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpICB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGhhbmRsZUxvYWRMaWJzQnJvd3NlKCk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICB0aGlzLmFkZChsYmxNZXNzYWdlCi0gICAgICAgICAgICAgICAgLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDEsIDEwLCAxLCAxLCAxLjAsIDAuMAotICAgICAgICAgICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLldFU1QgLCBHcmlkQmFnQ29uc3RyYWludHMuSE9SSVpPTlRBTAotICAgICAgICAgICAgICAgICwgbmV3IEluc2V0cyg1LCAwLCAwLDApLCAwLCAwKSk7Ci0gICAgICAgIHRoaXMuYWRkKG5ldyBKU2VwYXJhdG9yKCkKLSAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMCwgMTEsIEdyaWRCYWdDb25zdHJhaW50cy5SRU1BSU5ERVIsIDEsIDAuMCwgMC4wCi0gICAgICAgICAgICAgICAgLCBHcmlkQmFnQ29uc3RyYWludHMuV0VTVCAsIEdyaWRCYWdDb25zdHJhaW50cy5IT1JJWk9OVEFMCi0gICAgICAgICAgICAgICAgLCBuZXcgSW5zZXRzKDUsIDEsIDAsMSksIDAsIDApKTsKLSAgICAgICAgdGhpcy5hZGQoY2hiQ3JlYXRlSmFyCi0gICAgICAgICAgICAgICAgLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDAsIDEyLCBHcmlkQmFnQ29uc3RyYWludHMuUkVNQUlOREVSLCAxLCAwLjAsIDAuMAotICAgICAgICAgICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLldFU1QgLCBHcmlkQmFnQ29uc3RyYWludHMuSE9SSVpPTlRBTAotICAgICAgICAgICAgICAgICwgbmV3IEluc2V0cyg1LCAxMCwgMCwxMCksIDAsIDApKTsKLSAgICAgICAgY2hiQ3JlYXRlSmFyLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpewotICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIHRoaXMuYWRkKGxibEphckZpbGVOYW1lCi0gICAgICAgICAgICAgICAgLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDAsIDEzLCAxLCAxLCAwLjEsIDAuMAotICAgICAgICAgICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLldFU1QgLCBHcmlkQmFnQ29uc3RyYWludHMuTk9ORQotICAgICAgICAgICAgICAgICwgbmV3IEluc2V0cyg1LCAxMCwgMCwxMCksIDAsIDApKTsKLSAgICAgICAgdGhpcy5hZGQodHh0amFyRmlsZU5hbWUKLSAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMSwgMTMsMSwgMSwgMS4wLCAwLjAKLSAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5XRVNULCBHcmlkQmFnQ29uc3RyYWludHMuSE9SSVpPTlRBTAotICAgICAgICAgICAgICAgICwgbmV3IEluc2V0cyg1LCAwLCAwLDApLCAwLCAwKSk7Ci0gICAgICAgIHRoaXMuYWRkKG5ldyBKU2VwYXJhdG9yKCkKLSAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMCwgMTQsIEdyaWRCYWdDb25zdHJhaW50cy5SRU1BSU5ERVIsIDEsIDAuMCwgMC4wCi0gICAgICAgICAgICAgICAgLCBHcmlkQmFnQ29uc3RyYWludHMuV0VTVCAsIEdyaWRCYWdDb25zdHJhaW50cy5IT1JJWk9OVEFMCi0gICAgICAgICAgICAgICAgLCBuZXcgSW5zZXRzKDUsIDEsIDAsMSksIDAsIDApKTsKLQotICAgICAgICAvLyBoaW50IGJ1dHRvbgotICAgICAgICB0aGlzLmFkZChidG5IaW50LAotICAgICAgICAgICAgICAgIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMCwxNSwgMSwgMSwgMC4xLDAuMAotICAgICAgICAgICAgICAgICAgICAgICAgLCBHcmlkQmFnQ29uc3RyYWludHMuV0VTVCAsIEdyaWRCYWdDb25zdHJhaW50cy5OT05FCi0gICAgICAgICAgICAgICAgICAgICAgICAsIG5ldyBJbnNldHMoNSwgMjAsIDAsMCksIDAsIDApKTsKLSAgICAgICAgYnRuSGludC5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSAgewotICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBpZihmbGFnKXsKLSAgICAgICAgICAgICAgICAgICAgYnRuSGludC5zZXRUZXh0KCJIaW50ID4+Iik7Ci0gICAgICAgICAgICAgICAgICAgIHR4YUhpbnQuc2V0VGV4dCgiIik7Ci0gICAgICAgICAgICAgICAgICAgIGZsYWc9ZmFsc2U7Ci0gICAgICAgICAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICAgICAgICAgIGJ0bkhpbnQuc2V0VGV4dCgiSGludCA8PCIpOwotICAgICAgICAgICAgICAgICAgICB0eGFIaW50LnNldFRleHQoaGludCk7Ci0gICAgICAgICAgICAgICAgICAgIGZsYWc9dHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdXBkYXRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIC8vIGhpbnQgbGFibGUKLSAgICAgICAgdGhpcy5hZGQodHhhSGludCwKLSAgICAgICAgICAgICAgICBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDAsIDE2LCBHcmlkQmFnQ29uc3RyYWludHMuUkVNQUlOREVSLCAxLCAwLjEsIDEuMAotICAgICAgICAgICAgICAgICAgICAgICAgLCBHcmlkQmFnQ29uc3RyYWludHMuTk9SVEhXRVNUICwgR3JpZEJhZ0NvbnN0cmFpbnRzLkJPVEgKLSAgICAgICAgICAgICAgICAgICAgICAgICwgbmV3IEluc2V0cygxMCwgMjAsIDAsMCksIDAsIDApKTsKLSAgICAgICAgdXBkYXRlKCk7Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIGJhY2soKSB7Ci0gICAgICAgIHN3aXRjaFBhbmVsKENvZGVnZW5GcmFtZS5QQU5FTF9PUFRJT05fQSApOwotICAgIH0KLSAgICBwdWJsaWMgdm9pZCBuZXh0KCkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZSgpewotICAgICAgICBzZXROZXh0QnV0dG9uRW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIGNoZWNrUGFnZUNvbWxldGUoKTsKLSAgICAgICAgc2V0RW5hYmxlZEZvckFkZEF4aXNMaWIoKTsgICAgCi0gICAgfQotICAgIHB1YmxpYyB2b2lkIGxvYWRDbWJDdXJyZW50UHJvamVjdCgpIHsKLSAgICAgICAgTW9kdWxlIG1vZHVsZXNbXSA9IGNvZGVnZW5CZWFuIC5nZXRNb2R1bGVzKCk7Ci0KLSAgICAgICAgaWYgKG1vZHVsZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yKGludCBjb3VudCA9IDA7IGNvdW50IDwgbW9kdWxlcy5sZW5ndGg7IGNvdW50KyspIHsKLSAgICAgICAgICAgICAgICBjbWJDdXJyZW50UHJvamVjdC5hZGRJdGVtKG1vZHVsZXNbY291bnRdLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgIH0KLSAgICBwdWJsaWMgdm9pZCBsb2FkY21iTW9kdWxlU3JjUHJvamVjdCgpIHsKLSAgICAgICAgU3RyaW5nIG1vZHVsZSA9IG51bGw7Ci0gICAgICAgIG1vZHVsZSA9IChTdHJpbmcpIGNtYkN1cnJlbnRQcm9qZWN0LmdldFNlbGVjdGVkSXRlbSgpOwotICAgICAgICBjbWJNb2R1bGVTcmMucmVtb3ZlQWxsSXRlbXMoKTsKLSAgICAgICAgaW50IGNvdW50ID0gMDsKLSAgICAgICAgaWYgKG1vZHVsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgc3JjW10gPSBjb2RlZ2VuQmVhbi5nZXRNb2R1bGVTcmMobW9kdWxlKTsKLSAgICAgICAgICAgIGZvciAoIGNvdW50ID0gMDsgY291bnQgPCBzcmMubGVuZ3RoOyBjb3VudCsrKSB7Ci0gICAgICAgICAgICAgICAgY21iTW9kdWxlU3JjLmFkZEl0ZW0oc3JjW2NvdW50XSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjb3VudCA9IHNyYy5sZW5ndGg7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGZsYWcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChjb3VudCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgZmxhZyA9ZmFsc2U7Ci0gICAgICAgICAgICAgICAgc2V0RW5hYmxlZEZvckN1c3RvbVByb2plY3QoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2V7Ci0gICAgICAgICAgICAgICAgc2V0RW5hYmxlZEZvckN1cnJlbnRQcm9qZWN0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2V0RW5hYmxlZEZvckN1cnJlbnRQcm9qZWN0KCl7Ci0gICAgICAgIHJhZEN1cnJlbnRQcm9qZWN0LnNldFNlbGVjdGVkKHRydWUpOwotICAgICAgICByYWRDdXJyZW50UHJvamVjdC5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICBjbWJDdXJyZW50UHJvamVjdC5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICBjbWJNb2R1bGVTcmMuc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgbGJsRGlyZWN0b3J5LnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgIGxibE1vZHVsZSAuc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgcmFkQ3VycmVudFByb2plY3Quc2V0U2VsZWN0ZWQodHJ1ZSk7Ci0gICAgICAgIHR4dG91dHB1dC5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgbGJsb3V0cHV0LnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICBidG5Ccm93c2VPdXRwdXQuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgfQotICAgIHByaXZhdGUgdm9pZCBzZXRFbmFibGVkRm9yQ3VzdG9tUHJvamVjdCgpewotICAgICAgICBpZighZmxhZyl7Ci0gICAgICAgICAgICByYWRDdXJyZW50UHJvamVjdC5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICByYWRDdXJyZW50UHJvamVjdC5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgcmFkQ3VycmVudFByb2plY3Quc2V0U2VsZWN0ZWQodHJ1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgY21iQ3VycmVudFByb2plY3Quc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIGNtYk1vZHVsZVNyYy5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgbGJsRGlyZWN0b3J5LnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICBsYmxNb2R1bGUgLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICByYWRDdXN0b21Mb2NhdGlvbi5zZXRTZWxlY3RlZCh0cnVlKTsKLSAgICAgICAgdHh0b3V0cHV0LnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgIGxibG91dHB1dC5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICBidG5Ccm93c2VPdXRwdXQgLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgfQotICAgIHByaXZhdGUgdm9pZCBzZXRFbmFibGVkRm9yQWRkQXhpc0xpYigpewotICAgICAgICBpZihjaGJBZGRBeGlzTGliLmlzU2VsZWN0ZWQoKSl7Ci0gICAgICAgICAgICBsYmxBc2l4SG9tZS5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgbGJsTWVzc2FnZS5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgbGJsSmFyRmlsZU5hbWUuc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgIHR4dGF4aXNIb21lLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICB0eHRqYXJGaWxlTmFtZS5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgY2hiQ3JlYXRlSmFyLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICBidG5Ccm93c2VBeGlzSG9tZS5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgYnRuQ2hlY2tMaWIgLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgIH1lbHNlewotICAgICAgICAgICAgbGJsQXNpeEhvbWUuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICBsYmxNZXNzYWdlLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgbGJsSmFyRmlsZU5hbWUuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICB0eHRheGlzSG9tZS5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgIHR4dGphckZpbGVOYW1lLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgY2hiQ3JlYXRlSmFyLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgYnRuQnJvd3NlQXhpc0hvbWUuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICBidG5DaGVja0xpYiAuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICB0eHRheGlzSG9tZS5zZXRUZXh0KCJVbnBhY2tlZCBBeGlzMiBiaW5hcnkgaG9tZSBPciBBeGlzMiBzb3VyY2UgbG9jYXRpb24iKTsKLSAgICAgICAgICAgIGxibE1lc3NhZ2Uuc2V0QmFja2dyb3VuZChDb2xvci5XSElURSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlTG9hZExpYnNCcm93c2UoKXsKLSAgICAgICAgaWYodHh0YXhpc0hvbWUuZ2V0VGV4dCgpLmVxdWFscygiIikpewotICAgICAgICAgICAgbGJsTWVzc2FnZS5zZXRUZXh0KCJBeGlzIGxpYnMgYXJlIG5vdCBhdmFpbGFibGUgISEgIik7Ci0gICAgICAgICAgICBqYXJGaWxlQ29weU9wdGlvbj1mYWxzZTsKLSAgICAgICAgICAgIC8vZXJyb3IgbWVzc2FnZQotICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgIFN0cmluZyBheGlzX2hvbWUgPSB0eHRheGlzSG9tZS5nZXRUZXh0KCkudHJpbSgpOwotICAgICAgICAgICAgU3RyaW5nIGF4aXNfdGFyZ2V0X2xpYj1heGlzX2hvbWUrRmlsZS5zZXBhcmF0b3IrInRhcmdldCIrRmlsZS5zZXBhcmF0b3IrImxpYiI7Ci0gICAgICAgICAgICBTdHJpbmcgYXhpc19zdGRfbGliX2RpcmVjdG9yeT1heGlzX2hvbWUrRmlsZS5zZXBhcmF0b3IrImxpYiI7Ci0KLSAgICAgICAgICAgIEZpbGUgYXhpc190YXJnZXRfbGlic19kaXJlY3RvcnkgPSBuZXcgRmlsZShheGlzX3RhcmdldF9saWIpOwotICAgICAgICAgICAgRmlsZSBheGlzX2xpYnNfZGlyZWN0b3J5ID0gbmV3IEZpbGUoYXhpc19zdGRfbGliX2RpcmVjdG9yeSk7Ci0gICAgICAgICAgICBpZiAoYXhpc19saWJzX2RpcmVjdG9yeS5pc0RpcmVjdG9yeSgpIHx8IGF4aXNfdGFyZ2V0X2xpYnNfZGlyZWN0b3J5LmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgICAgICBsYmxNZXNzYWdlLnNldFRleHQoIkF4aXMgbGlicyBsb2FkZWQgc3VjY2Vzc2Z1bGx5ISEiKTsKLSAgICAgICAgICAgICAgICBpZihheGlzX2xpYnNfZGlyZWN0b3J5LmlzRGlyZWN0b3J5KCkpewotICAgICAgICAgICAgICAgICAgICBheGlzMkxpYnNMb2NhdGlvbj1heGlzX3N0ZF9saWJfZGlyZWN0b3J5OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmKGF4aXNfdGFyZ2V0X2xpYnNfZGlyZWN0b3J5LmlzRGlyZWN0b3J5KCkpewotICAgICAgICAgICAgICAgICAgICBheGlzMkxpYnNMb2NhdGlvbj1heGlzX3RhcmdldF9saWI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGphckZpbGVDb3B5T3B0aW9uID10cnVlOwotICAgICAgICAgICAgICAgIGxibE1lc3NhZ2Uuc2V0QmFja2dyb3VuZChDb2xvci5XSElURSk7Ci0gICAgICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgICAgICBsYmxNZXNzYWdlLnNldFRleHQoIkF4aXMgbGlicyBhcmUgbm90IGF2YWlsYWJsZSAhISAiKTsKLSAgICAgICAgICAgICAgICBsYmxNZXNzYWdlLnNldEJhY2tncm91bmQoQ29sb3IuUkVEKTsKLSAgICAgICAgICAgICAgICBqYXJGaWxlQ29weU9wdGlvbj1mYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIGdldCB0aGUgb3V0cHV0IGxvY2F0aW9uCi0gICAgICovCi0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE91dHB1dExvY2F0aW9uKCkgewotICAgICAgICBpZihyYWRDdXJyZW50UHJvamVjdC5pc1NlbGVjdGVkKCkpCi0gICAgICAgICAgICAgcmV0dXJuIGNtYk1vZHVsZVNyYy5nZXRTZWxlY3RlZEl0ZW0oKS50b1N0cmluZygpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gdHh0b3V0cHV0LmdldFRleHQoKTsKLQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXhpc0hvbWVMb2NhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIHR4dGF4aXNIb21lLmdldFRleHQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEphckZpbGVuYW1lKCkgewotICAgICAgICByZXR1cm4gdHh0amFyRmlsZU5hbWUuZ2V0VGV4dCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGdldEF4aXMyUGx1Z2luTGliQ29weUNoZWNrQm94U2VsZWN0aW9uKCl7Ci0gICAgICAgIHJldHVybiB0aGlzLmNoYkFkZEF4aXNDb2RlZ2VuSmFyLmlzU2VsZWN0ZWQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRBeGlzTGliQ29weUNoZWNrQm94U2VsZWN0aW9uKCl7Ci0gICAgICAgIHJldHVybiB0aGlzLmNoYkFkZEF4aXNMaWIuaXNTZWxlY3RlZCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGdldENyZWF0ZUphckNoZWNrQm94U2VsZWN0aW9uKCl7Ci0gICAgICAgIHJldHVybiB0aGlzLmNoYkNyZWF0ZUphci5pc1NlbGVjdGVkKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBeGlzSmFyc0xvY2F0aW9uKCl7Ci0gICAgICAgIHJldHVybiB0aGlzLmF4aXMyTGlic0xvY2F0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIG9rdG9Mb2FkTGlicygpewotICAgICAgICByZXR1cm4gdGhpcy5qYXJGaWxlQ29weU9wdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRKYXJGaWxlTmFtZShTdHJpbmcgamFyRmlsZU5hbWUpewotICAgICAgICB0aGlzLnR4dGphckZpbGVOYW1lLnNldFRleHQoamFyRmlsZU5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHRoaXMgYWxnb3JpdGhtIHVzZWQgZm9yIHNldCBwYWdlIGNvbXBsZXRlIGFuZCBFbmFibGVkIGZpbnNoIGJ1dHRvbgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjaGVja1BhZ2VDb21sZXRlKCl7Ci0gICAgICAgIGlmKGdldEF4aXNMaWJDb3B5Q2hlY2tCb3hTZWxlY3Rpb24oKSl7Ci0gICAgICAgICAgICBpZihyYWRDdXJyZW50UHJvamVjdC5pc1NlbGVjdGVkKCkpIHsKLSAgICAgICAgICAgICAgICBpZihqYXJGaWxlQ29weU9wdGlvbil7Ci0gICAgICAgICAgICAgICAgICAgIHNldFBhZ2VDb21wbGV0ZSh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgc2V0RmluaXNoQnV0dG9uRW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgY29kZWdlbkJlYW4uc2V0T3V0cHV0KGdldE91dHB1dExvY2F0aW9uKCkpOwotICAgICAgICAgICAgICAgIH1lbHNlewotICAgICAgICAgICAgICAgICAgICBzZXRQYWdlQ29tcGxldGUoZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICBzZXRGaW5pc2hCdXR0b25FbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgICAgICBpZighZ2V0T3V0cHV0TG9jYXRpb24oKS5lcXVhbHMoIiIpKXsKLSAgICAgICAgICAgICAgICAgICAgaWYoamFyRmlsZUNvcHlPcHRpb24pewotICAgICAgICAgICAgICAgICAgICAgICAgc2V0UGFnZUNvbXBsZXRlKHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2V0RmluaXNoQnV0dG9uRW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVnZW5CZWFuLnNldE91dHB1dChnZXRPdXRwdXRMb2NhdGlvbigpKTsKLSAgICAgICAgICAgICAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXRQYWdlQ29tcGxldGUoZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2V0RmluaXNoQnV0dG9uRW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgc2V0RmluaXNoQnV0dG9uRW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgIGlmKHJhZEN1cnJlbnRQcm9qZWN0LmlzU2VsZWN0ZWQoKSkgewotICAgICAgICAgICAgICAgIHNldFBhZ2VDb21wbGV0ZSh0cnVlKTsKLSAgICAgICAgICAgICAgICBzZXRGaW5pc2hCdXR0b25FbmFibGVkKHRydWUpOwotICAgICAgICAgICAgICAgIGNvZGVnZW5CZWFuLnNldE91dHB1dChnZXRPdXRwdXRMb2NhdGlvbigpKTsKLSAgICAgICAgICAgIH1lbHNlewotICAgICAgICAgICAgICAgIGlmKCFnZXRPdXRwdXRMb2NhdGlvbigpLmVxdWFscygiIikpewotICAgICAgICAgICAgICAgICAgICBzZXRQYWdlQ29tcGxldGUodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIHNldEZpbmlzaEJ1dHRvbkVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvZGVnZW5CZWFuLnNldE91dHB1dChnZXRPdXRwdXRMb2NhdGlvbigpKTsKLSAgICAgICAgICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgc2V0RmluaXNoQnV0dG9uRW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIC8qKgotICAgICAqIGdldCBwYWdlIHR5cGUKLSAgICAgKi8KLSAgICBwdWJsaWMgIGludCBnZXRQYWdlVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuICBXaXphcmRQYW5lbC5XU0RMXzJfSkFWQV9UWVBFOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBoYW5kbGVNb2RpZnlFdmVudCgpIHsKLSAgICAgICAgU3RyaW5nIHRleHQgPSB0aGlzLnR4dG91dHB1dC5nZXRUZXh0KCk7Ci0gICAgICAgIGlmICgodGV4dCA9PSBudWxsKSB8fCAodGV4dC50cmltKCkuZXF1YWxzKCIiKSkpIHsKLSAgICAgICAgICAgIC8vIGVycm9yIG1lc3NhZ2UgIm91dHB1dCBsb2NhdGlvbiBuZWVkcyB0byBiZSBzcGVjaWZpZWQiCi0JCQlyZXR1cm47Ci0JCX0KLQkJLy8gZXJyb3IgbWVzc2FnZSBudWxsCi0JfQotCXByaXZhdGUgdm9pZCBoYW5kbGVBeGlzSG9tZU1vZGlmeUV2ZW50KCkgewotCQlTdHJpbmcgdGV4dCA9IHRoaXMudHh0YXhpc0hvbWUuZ2V0VGV4dCgpOwotCQlpZiAoKHRleHQgPT0gbnVsbCkgfHwgKHRleHQudHJpbSgpLmVxdWFscygiIikpKSB7Ci0JCQkvLyBlcnJvciBtZXNzYWdlICJvdXRwdXQgbG9jYXRpb24gbmVlZHMgdG8gYmUgc3BlY2lmaWVkIgotCQkJcmV0dXJuOwotCQl9Ci0JCS8vIGVycm9yIG1lc3NhZ2UgbnVsbAotCX0KLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlSmFyTmFtZU1vZGlmeUV2ZW50KCkgewotCQlTdHJpbmcgdGV4dCA9IHRoaXMudHh0amFyRmlsZU5hbWUuZ2V0VGV4dCgpOwotCQlpZiAoKHRleHQgPT0gbnVsbCkgfHwgKHRleHQudHJpbSgpLmVxdWFscygiIikpKSB7Ci0JCQkvLyBlcnJvciBtZXNzYWdlICJvdXRwdXQgbG9jYXRpb24gbmVlZHMgdG8gYmUgc3BlY2lmaWVkIgotCQkJcmV0dXJuOwotCQl9Ci0JCS8vIGVycm9yIG1lc3NhZ2UgbnVsbAotCX0KLX0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbHMvaWRlYS9XU0RMRmlsZUZpbHRlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbHMvaWRlYS9XU0RMRmlsZUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGM3ZGJkLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2xzL2lkZWEvV1NETEZpbGVGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50b29scy5pZGVhOwotCi0KLWltcG9ydCBqYXZheC5zd2luZy5maWxlY2hvb3Nlci5GaWxlRmlsdGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotLyoqCi0gKiB0aGlzIGNsYXNzIHVzZSBmb3IgZmlsdGVyIGZpbGUKLSAqLwotcHVibGljIGNsYXNzIFdTRExGaWxlRmlsdGVyIGV4dGVuZHMgRmlsZUZpbHRlciB7Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBmKSB7Ci0gICAgICAgIGlmIChmLmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZyBleHRlbnNpb24gPSBnZXRFeHRlbnNpb24oZik7Ci0gICAgICAgIGlmIChleHRlbnNpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGV4dGVuc2lvbi5lcXVhbHMoIndzZGwiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0gICAgICAgIHJldHVybiAiLndzZGwiOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldEV4dGVuc2lvbihGaWxlIGYpIHsKLSAgICAgICAgU3RyaW5nIGV4dCA9IG51bGw7Ci0gICAgICAgIFN0cmluZyBzID0gZi5nZXROYW1lKCk7Ci0gICAgICAgIGludCBpID0gcy5sYXN0SW5kZXhPZignLicpOwotCi0gICAgICAgIGlmIChpID4gMCAmJiBpIDwgcy5sZW5ndGgoKSAtIDEpIHsKLSAgICAgICAgICAgIGV4dCA9IHMuc3Vic3RyaW5nKGkgKyAxKS50b0xvd2VyQ2FzZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBleHQ7Ci0gICAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbHMvamF2YTJ3c2RsL0ZpbGVGaWx0ZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2xzL2phdmEyd3NkbC9GaWxlRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5MDJmNDkuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbHMvamF2YTJ3c2RsL0ZpbGVGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50b29scy5qYXZhMndzZGw7Ci0KLQotcHVibGljIGNsYXNzIEZpbGVGaWx0ZXIgewotCi0gICAgcHVibGljIGJvb2xlYW4gYWNjZXB0KFN0cmluZyBmaWxlTmFtZSApIHsKLQotICAgICAgICBTdHJpbmcgICBleHRlbnNpb24gPSBnZXRFeHRlbnNpb24oZmlsZU5hbWUpOwotICAgICAgICBpZiAoZXh0ZW5zaW9uICE9IG51bGwgJiYgZXh0ZW5zaW9uLmVxdWFscygid3NkbCIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gIHRydWU7Ci0gICAgICAgIH1lbHNlIGlmKGV4dGVuc2lvbiAhPSBudWxsICYmIGV4dGVuc2lvbi5lcXVhbHMoInhtbCIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLSAgICAgICAgcmV0dXJuICIud3NkbCI7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0RXh0ZW5zaW9uKFN0cmluZyAgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIFN0cmluZyBleHQgPSBudWxsOwotICAgICAgICBpbnQgaSA9IGV4dGVuc2lvbi5sYXN0SW5kZXhPZignLicpOwotCi0gICAgICAgIGlmIChpID4gMCAmJiBpIDwgZXh0ZW5zaW9uLmxlbmd0aCgpIC0gMSkgewotICAgICAgICAgICAgZXh0ID0gZXh0ZW5zaW9uLnN1YnN0cmluZyhpICsgMSkudG9Mb3dlckNhc2UoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZXh0OwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbHMvamF2YTJ3c2RsL0phckZpbGVGaWx0ZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2xzL2phdmEyd3NkbC9KYXJGaWxlRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmMzQ5NjUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbHMvamF2YTJ3c2RsL0phckZpbGVGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50b29scy5qYXZhMndzZGw7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5maWxlY2hvb3Nlci5GaWxlRmlsdGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotcHVibGljIGNsYXNzIEphckZpbGVGaWx0ZXIgZXh0ZW5kcyBGaWxlRmlsdGVyIHsKLQotICAgIHB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGZpbGUpIHsKLSAgICAgICAgaWYoZmlsZS5pc0RpcmVjdG9yeSgpICl7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgZXh0ZW5zaW9uID0gZ2V0RXh0ZW5zaW9uKGZpbGUpOwotICAgICAgICBpZihleHRlbnNpb24gIT0gbnVsbCl7Ci0gICAgICAgICAgICByZXR1cm4gIGV4dGVuc2lvbiAuZXF1YWxzKCJqYXIiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotICAgICAgICByZXR1cm4gIi5qYXIiIDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRFeHRlbnNpb24oRmlsZSBmaWxlKXsKLSAgICAgICAgU3RyaW5nIGV4dCA9IG51bGw7Ci0gICAgICAgIFN0cmluZyBzID0gZmlsZS5nZXROYW1lKCk7Ci0gICAgICAgIGludCBpID0gcy5sYXN0SW5kZXhPZignLicpOwotCi0gICAgICAgIGlmIChpID4gMCAmJiBpIDwgcy5sZW5ndGgoKSAtIDEpIHsKLSAgICAgICAgICAgIGV4dCA9IHMuc3Vic3RyaW5nKGkgKyAxKS50b0xvd2VyQ2FzZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBleHQ7Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29scy9qYXZhMndzZGwvTWlkZGxlUGFuZWwuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2xzL2phdmEyd3NkbC9NaWRkbGVQYW5lbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTc5ODgzLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2xzL2phdmEyd3NkbC9NaWRkbGVQYW5lbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50b29scy5qYXZhMndzZGw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRvb2xzLmJlYW4uQ2xhc3NMb2FkaW5nVGVzdEJlYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29scy5iZWFuLk5hbWVzcGFjZUZpbmRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRvb2xzLmJlYW4uV3NkbGdlbkJlYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29scy5jb21wb25lbnQuV2l6YXJkQ29tcG9uZW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRvb2xzLmNvbXBvbmVudC5XaXphcmRQYW5lbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRvb2xzLndpemFyZGZyYW1lLkNvZGVnZW5GcmFtZTsKLQotaW1wb3J0IGphdmF4LnN3aW5nLio7Ci1pbXBvcnQgamF2YXguc3dpbmcuYm9yZGVyLkVtcHR5Qm9yZGVyOwotaW1wb3J0IGphdmEuYXd0Lio7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uRXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi0vKioKLSAqIHRoaXMgaXMgdGhlIGZpcnN0IHBhbmVsIG9mIGphdmEyd3NkbCB3aXphcmQKLSAqLwotcHVibGljIGNsYXNzIE1pZGRsZVBhbmVsICBleHRlbmRzIFdpemFyZFBhbmVsIHsKLSAgICAvKioKLSAgICAgKiB2YXJpYmFsZQotICAgICAqLwotICAgIHByaXZhdGUgSlRleHRGaWVsZCB0eHRDbGFzczsKLSAgICBwcml2YXRlIEpCdXR0b24gYnRuRm9sZGVyOwotICAgIHByaXZhdGUgSkJ1dHRvbiBidG5KYXI7Ci0gICAgcHJpdmF0ZSBKQnV0dG9uIGJ0blJlbW92ZTsKLSAgICBwcml2YXRlIEpCdXR0b24gYnRuVGVzdDsKLSAgICBwcml2YXRlIEpCdXR0b24gYnRuSGludDsKLSAgICBwcml2YXRlIEpUZXh0QXJlYSB0eGFIaW50OwotICAgIHByaXZhdGUgYm9vbGVhbiBmbGFnPWZhbHNlOwotICAgIHByaXZhdGUgSkxpc3QgbGlzdFBhdGhEaXNwbHk7Ci0gICAgcHJpdmF0ZSBEZWZhdWx0TGlzdE1vZGVsIGxpc3RNb2RlbDsKLSAgICBwcml2YXRlIEpMYWJlbCBsYmxUZXN0OwotICAgIHByaXZhdGUgU3RyaW5nIGhpbnQgPSJQbGVhc2UgZ2l2ZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUsIGV4YW1wbGUgOmNvbS5mb28uQmFyU2VydmljZSIgKwotICAgICAgICAgICAgIiBUaGVuIGFkZCB0aGUgZm9sZGVyIG9yIHRoZSBqYXIgZmlsZSB3aGljaCBjb250YWlucyB0aGF0IGNsYXNzIGZpbGUuIiArCi0gICAgICAgICAgICAiIEZpbmFsbHkgY2hlY2sgd2hldGhlciB0aGUgY2xhc3MgZmlsZSBjYW4gYmUgbG9hZGVkIGZyb20gdGhlIHBsdWdpbi4iICsKLSAgICAgICAgICAgICIgIElmIHRoZSBjbGFzcyB0aGF0IHlvdSBhcmUgZ29pbmcgdG8gbG9hZCBjb250YWlucyBhbnkgZGVwZW5kZW5jaWVzIiArCi0gICAgICAgICAgICAiICBvbiBvdGhlciBheGlzMiBsaWJyYXJpZXMgKCBmb3IgZXhhbXBsZSBsaWtlIGF4aW9tKi5qYXIpLCBwbGVhc2UgYWRkIHRob3NlIiArCi0gICAgICAgICAgICAiIGxpYnJhcmllcyBhcyB3ZWxsIGFuZCB0cnkgdG8gbG9hZCB0aGUgY2xhc3MuIjsKLQotICAgIGZpbmFsIEpGaWxlQ2hvb3NlciBGaWxlQ2hvb3NlciA9bmV3IEpGaWxlQ2hvb3NlcigpOwotICAgIGZpbmFsIEpGaWxlQ2hvb3NlciBEaXJDaG9vc2VyPW5ldyBKRmlsZUNob29zZXIoKTsKLSAgICBwcml2YXRlIFdzZGxnZW5CZWFuIHdzZGxnZW5CZWFuOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IKLSAgICAgKiBAcGFyYW0gd2l6YXJkQ29tcG9uZW50cwotICAgICAqIEBwYXJhbSB3c2RsZ2VuQmVhbgotICAgICAqLwotICAgIHB1YmxpYyBNaWRkbGVQYW5lbChXaXphcmRDb21wb25lbnRzIHdpemFyZENvbXBvbmVudHMgLFdzZGxnZW5CZWFuIHdzZGxnZW5CZWFuKSB7Ci0gICAgICAgIHN1cGVyKHdpemFyZENvbXBvbmVudHMsICJBeGlzMiBJZGVhIFBsdWdpbiBKYXZhMldTREwgV2l6YXJkcyIpOwotICAgICAgICBzZXRQYW5lbFRvcFRpdGxlKCJKYXZhIHNvdXJjZSAvIGNsYXNzcGF0aCBzZWxlY3Rpb24iKTsKLSAgICAgICAgc2V0UGFuZWxCb3R0b21UaXRsZSgiU2VsZWN0IHRoZSBjbGFzc2VzIGFuZCB0aGUgbGlicmFyaWVzIik7Ci0gICAgICAgIHRoaXMud3NkbGdlbkJlYW49d3NkbGdlbkJlYW47Ci0gICAgICAgIGluaXQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBpbml0aWF0ZSBwYW5lbAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBpbml0KCl7Ci0KLSAgICAgICAgdHhhSGludCA9bmV3IEpUZXh0QXJlYSgpOwotICAgICAgICB0eGFIaW50LnNldEJvcmRlcihudWxsKTsKLSAgICAgICAgdHhhSGludC5zZXRGb2N1c2FibGUoZmFsc2UpOwotICAgICAgICB0eGFIaW50LnNldExpbmVXcmFwKHRydWUpOwotICAgICAgICB0eGFIaW50LnNldFdyYXBTdHlsZVdvcmQodHJ1ZSk7Ci0gICAgICAgIHR4YUhpbnQuc2V0T3BhcXVlKGZhbHNlKTsKLQotICAgICAgICBidG5IaW50ID1uZXcgSkJ1dHRvbigiSGludCA+PiIpOwotICAgICAgICBidG5IaW50LnNldEJvcmRlcihuZXcgRW1wdHlCb3JkZXIobmV3IEluc2V0cygwLDAsMCwwKSkpOwotCi0gICAgICAgIGJ0bkZvbGRlcj1uZXcgSkJ1dHRvbigiQWRkIEZvbGRlciIpOwotICAgICAgICBidG5KYXI9bmV3IEpCdXR0b24oIkFkZCBKYXIiKTsKLSAgICAgICAgYnRuUmVtb3ZlPW5ldyBKQnV0dG9uKCJSZW1vdmUiKTsKLSAgICAgICAgYnRuVGVzdD1uZXcgSkJ1dHRvbigiVGVzdCBDbGFzcyBMb2FkaW5nIik7Ci0KLSAgICAgICAgdHh0Q2xhc3MgPW5ldyBKVGV4dEZpZWxkKCk7Ci0gICAgICAgIGxibFRlc3Q9IG5ldyBKTGFiZWwoKTsKLQotICAgICAgICBsaXN0TW9kZWwgPW5ldyBEZWZhdWx0TGlzdE1vZGVsKCk7Ci0gICAgICAgIGxpc3RQYXRoRGlzcGx5ID1uZXcgSkxpc3QobGlzdE1vZGVsKTsKLSAgICAgICAgbGlzdFBhdGhEaXNwbHkuc2V0QXV0b3Njcm9sbHModHJ1ZSk7Ci0gICAgICAgIGxpc3RQYXRoRGlzcGx5LnNldE9wYXF1ZShmYWxzZSk7Ci0gICAgICAgIGxpc3RQYXRoRGlzcGx5LnNldEJvcmRlcihCb3JkZXJGYWN0b3J5LmNyZWF0ZUJldmVsQm9yZGVyKDEpICk7Ci0gICAgICAgIGxpc3RQYXRoRGlzcGx5LnNldEZvY3VzYWJsZShmYWxzZSk7Ci0KLSAgICAgICAgc2V0QmFja0J1dHRvbkVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgIHNldE5leHRCdXR0b25FbmFibGVkKGZhbHNlKTsKLSAgICAgICAgc2V0RmluaXNoQnV0dG9uRW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIHNldFBhZ2VDb21wbGV0ZShmYWxzZSk7Ci0KLSAgICAgICAgdGhpcy5zZXRMYXlvdXQobmV3IEdyaWRCYWdMYXlvdXQoKSk7Ci0KLSAgICAgICAgdGhpcy5hZGQobmV3IEpMYWJlbCgiRnVsbHkgUXVhbGlmaWVkIENsYXNzIE5hbWUgOiIpCi0gICAgICAgICAgICAgICAgLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDAsIDAsIDEsIDEsIDAuMSwgMC4wCi0gICAgICAgICAgICAgICAgLCBHcmlkQmFnQ29uc3RyYWludHMuV0VTVCAsIEdyaWRCYWdDb25zdHJhaW50cy5OT05FCi0gICAgICAgICAgICAgICAgLCBuZXcgSW5zZXRzKDUsIDEwLCAwLDEwKSwgMCwgMCkpOwotCi0gICAgICAgIHRoaXMuYWRkKHR4dENsYXNzCi0gICAgICAgICAgICAgICAgLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDEsIDAsIEdyaWRCYWdDb25zdHJhaW50cy5SRU1BSU5ERVIsIDEsIDEuMCwgMC4wCi0gICAgICAgICAgICAgICAgLCBHcmlkQmFnQ29uc3RyYWludHMuQ0VOVEVSICwgR3JpZEJhZ0NvbnN0cmFpbnRzLkhPUklaT05UQUwKLSAgICAgICAgICAgICAgICAsIG5ldyBJbnNldHMoNSwgMSwgMCwgMTApLCAwLCAwKSk7Ci0KLSAgICAgICAgdGhpcy5hZGQobmV3IEpMYWJlbCgiamF2YSBjbGFzcyBwYXRoIEVudHJpZXMuc2VsZWN0IGVpdGhlciBmb2xkZXJzIG9yIGphciBmaWxlcyAiKQotICAgICAgICAgICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygwLCAxLCBHcmlkQmFnQ29uc3RyYWludHMuUkVNQUlOREVSLCAxLDAuMCwgMC4wCi0gICAgICAgICAgICAgICAgLCBHcmlkQmFnQ29uc3RyYWludHMuV0VTVCAgLCBHcmlkQmFnQ29uc3RyYWludHMuSE9SSVpPTlRBTAotICAgICAgICAgICAgICAgICwgbmV3IEluc2V0cyg1LCAxMCwgMCwxMCksIDAsIDApKTsKLQotICAgICAgICB0aGlzLmFkZChidG5Gb2xkZXIKLSAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMCwgMiwgMSwgMSwgMC4xLCAwLjAKLSAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5DRU5URVIgLCBHcmlkQmFnQ29uc3RyYWludHMuSE9SSVpPTlRBTAotICAgICAgICAgICAgICAgICwgbmV3IEluc2V0cyg1LDEwLCAxLDEpLCAwLCAwKSk7Ci0KLSAgICAgICAgYnRuRm9sZGVyLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpICB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIERpckNob29zZXIgLnNldEZpbGVTZWxlY3Rpb25Nb2RlKEpGaWxlQ2hvb3Nlci5ESVJFQ1RPUklFU19PTkxZKTsKLSAgICAgICAgICAgICAgICBpbnQgcmV0dXJuVmFsID0gRGlyQ2hvb3Nlci5zaG93T3BlbkRpYWxvZyhidG5Gb2xkZXIgKTsKLSAgICAgICAgICAgICAgICBpZiAocmV0dXJuVmFsID09IEpGaWxlQ2hvb3Nlci5BUFBST1ZFX09QVElPTikgewotICAgICAgICAgICAgICAgICAgICBEaXJDaG9vc2VyLnNldEZpbGVTZWxlY3Rpb25Nb2RlKEpGaWxlQ2hvb3NlciAuRklMRVNfT05MWSApOwotICAgICAgICAgICAgICAgICAgICBGaWxlIG5ld2ZpbGUgPSBEaXJDaG9vc2VyLmdldFNlbGVjdGVkRmlsZSgpOwotICAgICAgICAgICAgICAgICAgICBsaXN0TW9kZWwuYWRkRWxlbWVudChuZXdmaWxlLmdldEFic29sdXRlUGF0aCgpICk7Ci0gICAgICAgICAgICAgICAgICAgIHNldERlZmF1bHRQYXRoQW5kTmFtZShuZXdmaWxlICk7Ci0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZVN0YXR1c1RleHRGaWVsZCggZmFsc2UsIiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB1cGRhdGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgdGhpcy5hZGQoYnRuSmFyCi0gICAgICAgICAgICAgICAgLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDEsIDIsIDEsIDEsIDEuMCwgMC4wCi0gICAgICAgICAgICAgICAgLCBHcmlkQmFnQ29uc3RyYWludHMuQ0VOVEVSICAsIEdyaWRCYWdDb25zdHJhaW50cy5IT1JJWk9OVEFMCi0gICAgICAgICAgICAgICAgLCBuZXcgSW5zZXRzKDUsIDEsIDEsMSksIDAsIDApKTsKLSAgICAgICAgYnRuSmFyLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpICB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgewotCi0gICAgICAgICAgICAgICAgRmlsZUNob29zZXIuc2V0RmlsZUZpbHRlcihuZXcgSmFyRmlsZUZpbHRlcigpICk7Ci0gICAgICAgICAgICAgICAgaW50IHJldHVyblZhbD0gRmlsZUNob29zZXIuc2hvd09wZW5EaWFsb2coYnRuSmFyKTsKLSAgICAgICAgICAgICAgICBpZihyZXR1cm5WYWwgPT0gSkZpbGVDaG9vc2VyIC5BUFBST1ZFX09QVElPTiApewotICAgICAgICAgICAgICAgICAgICBGaWxlIGZpbGUgPSBGaWxlQ2hvb3Nlci5nZXRTZWxlY3RlZEZpbGUoKTsKLSAgICAgICAgICAgICAgICAgICAgbGlzdE1vZGVsLmFkZEVsZW1lbnQoZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSApOwotICAgICAgICAgICAgICAgICAgICBzZXREZWZhdWx0UGF0aEFuZE5hbWUoZmlsZSApOwotICAgICAgICAgICAgICAgICAgICB1cGRhdGVTdGF0dXNUZXh0RmllbGQoIGZhbHNlLCIiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdXBkYXRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIHRoaXMuYWRkKGJ0blJlbW92ZQotICAgICAgICAgICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygyLCAyLCAxLCAxLCAxLjAsIDAuMAotICAgICAgICAgICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLkNFTlRFUiAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLkhPUklaT05UQUwKLSAgICAgICAgICAgICAgICAsIG5ldyBJbnNldHMoNSwgMSwgMSwxMCksIDAsIDApKTsKLSAgICAgICAgYnRuUmVtb3ZlLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpICB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGhhbmRsZVJlbW92ZSgpOwotICAgICAgICAgICAgICAgIHVwZGF0ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICB0aGlzLmFkZChuZXcgSlNjcm9sbFBhbmUobGlzdFBhdGhEaXNwbHkpCi0gICAgICAgICAgICAgICAgLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDAsIDMsIEdyaWRCYWdDb25zdHJhaW50cy5SRU1BSU5ERVIsIDEsIDAuMSwgMC4wCi0gICAgICAgICAgICAgICAgLCBHcmlkQmFnQ29uc3RyYWludHMuV0VTVCAsIEdyaWRCYWdDb25zdHJhaW50cy5IT1JJWk9OVEFMCi0gICAgICAgICAgICAgICAgLCBuZXcgSW5zZXRzKDUsIDEwLCAxLDEwKSwgMCwgMCkpOwotCi0gICAgICAgIHRoaXMuYWRkKGJ0blRlc3QKLSAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMCwgNCwgMSwgMSwgMC4xLCAwLjAKLSAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5DRU5URVIgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLkhPUklaT05UQUwKLSAgICAgICAgICAgICAgICAsIG5ldyBJbnNldHMoNSwgMTAsIDEsMSksIDAsIDApKTsKLSAgICAgICAgYnRuVGVzdC5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSAgewotICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBpZighdGVzdExvYWRpbmcoKSl7Ci0gICAgICAgICAgICAgICAgICAgIHNldEJhY2tCdXR0b25FbmFibGVkKHRydWUpOwotICAgICAgICAgICAgICAgICAgICBzZXROZXh0QnV0dG9uRW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIHNldEZpbmlzaEJ1dHRvbkVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgIH1lbHNlICB7Ci0gICAgICAgICAgICAgICAgICAgIHNldEJhY2tCdXR0b25FbmFibGVkKHRydWUpOwotICAgICAgICAgICAgICAgICAgICBzZXROZXh0QnV0dG9uRW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgc2V0RmluaXNoQnV0dG9uRW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIHdzZGxnZW5CZWFuLnNldENsYXNzUGF0aExpc3QoZ2V0Q2xhc3NQYXRobGlzdCgpKTsKLSAgICAgICAgICAgICAgICAgICAgd3NkbGdlbkJlYW4uc2V0Q2xhc3NOYW1lKHR4dENsYXNzLmdldFRleHQoKS50cmltKCkgKTsKLSAgICAgICAgICAgICAgICAgICAgc2V0UGFnZUNvbXBsZXRlKHRydWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB1cGRhdGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgdGhpcy5hZGQobGJsVGVzdAotICAgICAgICAgICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygxLCA0LCBHcmlkQmFnQ29uc3RyYWludHMuUkVNQUlOREVSLCAxLCAxLjAsIDAuMAotICAgICAgICAgICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLkNFTlRFUiAgLCBHcmlkQmFnQ29uc3RyYWludHMuSE9SSVpPTlRBTAotICAgICAgICAgICAgICAgICwgbmV3IEluc2V0cyg1LCAxLCAxLDEwKSwgMCwgMCkpOwotCi0gICAgICAgIHRoaXMuYWRkKG5ldyBKU2VwYXJhdG9yKCkKLSAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMCwgNSwgR3JpZEJhZ0NvbnN0cmFpbnRzLlJFTUFJTkRFUiwgMSwgMC4wLCAwLjAKLSAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5XRVNUICwgR3JpZEJhZ0NvbnN0cmFpbnRzLkhPUklaT05UQUwKLSAgICAgICAgICAgICAgICAsIG5ldyBJbnNldHMoNSwgMSwgMSwxKSwgMCwgMCkpOwotCi0gICAgICAgIHRoaXMuYWRkKGJ0bkhpbnQsCi0gICAgICAgICAgICAgICAgbmV3IEdyaWRCYWdDb25zdHJhaW50cygwLCA2LCAxLCAxLCAwLjEsMC4wCi0gICAgICAgICAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5XRVNUICwgR3JpZEJhZ0NvbnN0cmFpbnRzLk5PTkUKLSAgICAgICAgICAgICAgICAgICAgICAgICwgbmV3IEluc2V0cyg1LCAxMCwgMCwgMTApLCAwLCAwKSk7Ci0gICAgICAgIGJ0bkhpbnQuYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgaWYoZmxhZyl7Ci0gICAgICAgICAgICAgICAgICAgIGJ0bkhpbnQuc2V0VGV4dCgiSGludCA+PiIpOwotICAgICAgICAgICAgICAgICAgICB0eGFIaW50LnNldFRleHQoIiIpOwotICAgICAgICAgICAgICAgICAgICBmbGFnPWZhbHNlOwotICAgICAgICAgICAgICAgIH1lbHNlewotICAgICAgICAgICAgICAgICAgICBidG5IaW50LnNldFRleHQoIkhpbnQgPDwiKTsKLSAgICAgICAgICAgICAgICAgICAgdHhhSGludC5zZXRUZXh0KGhpbnQpOwotICAgICAgICAgICAgICAgICAgICBmbGFnPXRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHVwZGF0ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICB0aGlzLmFkZCh0eGFIaW50Ci0gICAgICAgICAgICAgICAgLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDAsIDcsIEdyaWRCYWdDb25zdHJhaW50cy5SRU1BSU5ERVIsIDEsIDAuMSwxLjAKLSAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5DRU5URVIgLCBHcmlkQmFnQ29uc3RyYWludHMuQk9USAotICAgICAgICAgICAgICAgICwgbmV3IEluc2V0cyg1LCAxMCwgMTAsIDEwKSwgMCwgMCkpOwotCi0gICAgfQotCi0gICAgLy9uZXh0Ci0gICAgcHVibGljIHZvaWQgbmV4dCgpIHsKLSAgICAgICAgaWYodHh0Q2xhc3MuZ2V0VGV4dCgpIT1udWxsICYmIGlzUGFnZUNvbXBsZXRlKCkpewotICAgICAgICAgICAgc3dpdGNoUGFuZWwoQ29kZWdlbkZyYW1lLlBBTkVMX09QVElPTl9CICk7Ci0gICAgICAgIH0gZWxzZXsKLSAgICAgICAgICAgIHN3aXRjaFBhbmVsKENvZGVnZW5GcmFtZS5QQU5FTF9GSVJTVF9CICk7Ci0gICAgICAgICAgICBzZXROZXh0QnV0dG9uRW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLy9iYWNrCi0gICAgcHVibGljIHZvaWQgYmFjaygpIHsKLSAgICAgICAgc3dpdGNoUGFuZWwoQ29kZWdlbkZyYW1lLlBBTkVMX0NIT09TRVIgKTsKLSAgICB9Ci0gICAgLy91cGRhdGUKLSAgICBwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0gICAgfQotICAgIC8vc2V0IGRlZmF1bHQgcGF0aCBhbmQgbmFtZQotICAgIHByaXZhdGUgdm9pZCBzZXREZWZhdWx0UGF0aEFuZE5hbWUoRmlsZSBmaWxlKSAgewotICAgICAgICBpZihmaWxlLmdldFBhcmVudCgpIT1udWxsKXsKLSAgICAgICAgICAgIHdzZGxnZW5CZWFuLnNldE91dHB1dExvY2F0aW9uKGZpbGUuZ2V0UGFyZW50KCkpOwotICAgICAgICAgICAgd3NkbGdlbkJlYW4uc2V0T3V0cHV0V1NETE5hbWUoIlNlcnZpY2VzLndzZGwiKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAvLyB1cGRhdGUgbmV4dCBwYWdlCi0gICAgcHVibGljIHZvaWQgdXBkYXRlU3RhdHVzVGV4dEZpZWxkKGJvb2xlYW4gc3VjY2VzcyxTdHJpbmcgdGV4dCl7Ci0gICAgICAgIGlmIChzdWNjZXNzKXsKLSAgICAgICAgICAgIHdzZGxnZW5CZWFuLnNldFNlcnZpY2VOYW1lKE5hbWVzcGFjZUZpbmRlci5nZXRTZXJ2aWNlTmFtZVRleHQodHh0Q2xhc3MuZ2V0VGV4dCgpKSApOwotICAgICAgICAgICAgd3NkbGdlbkJlYW4uc2V0VGFyZ2V0TmFtZXNwYWNlKE5hbWVzcGFjZUZpbmRlci5nZXRUYXJnZXROYW1lc3BhY2VGcm9tQ2xhc3ModHh0Q2xhc3MuZ2V0VGV4dCgpKSk7Ci0gICAgICAgICAgICB3c2RsZ2VuQmVhbi5zZXRUYXJnZXROYW1lc3BhY2VQcmVmaXgoTmFtZXNwYWNlRmluZGVyLmdldERlZmF1bHROYW1lc3BhY2VQcmVmaXgoKSk7Ci0gICAgICAgICAgICB3c2RsZ2VuQmVhbi5zZXRTY2hlbWFUYXJnZXROYW1lc3BhY2UoTmFtZXNwYWNlRmluZGVyLmdldFNjaGVtYVRhcmdldE5hbWVzcGFjZUZyb21DbGFzcyh0eHRDbGFzcy5nZXRUZXh0KCkpKTsKLSAgICAgICAgICAgIHdzZGxnZW5CZWFuLnNldFNjaGVtYVRhcmdldE5hbWVzcGFjZVByZWZpeChOYW1lc3BhY2VGaW5kZXIuZ2V0RGVmYXVsdFNjaGVtYU5hbWVzcGFjZVByZWZpeCgpKTsKLSAgICAgICAgfQotICAgICAgICBsYmxUZXN0LnNldFRleHQodGV4dCk7Ci0gICAgfQotCi0gICAgLy8gIFBvcHMgdXAgdGhlIGZpbGUgYnJvd3NlIGRpYWxvZyBib3gKLQotICAgIHByaXZhdGUgdm9pZCBoYW5kbGVSZW1vdmUoKSB7Ci0gICAgICAgIGludFtdIHNlbGVjdGlvbkluZGljZXMgPSBsaXN0UGF0aERpc3BseSAuZ2V0U2VsZWN0ZWRJbmRpY2VzKCkgOwotICAgICAgICBmb3IgKGludCBpPTA7aTxzZWxlY3Rpb25JbmRpY2VzLmxlbmd0aDtpKyspewotICAgICAgICAgICAgbGlzdE1vZGVsIC5yZW1vdmUoc2VsZWN0aW9uSW5kaWNlc1tpXSk7Ci0gICAgICAgIH0KLSAgICAgICAgdXBkYXRlU3RhdHVzVGV4dEZpZWxkKGZhbHNlLCIiKTsKLSAgICAgICAgdXBkYXRlKCk7Ci0gICAgfQotCi0gICAgLy9nZXQgY2xhc3MgcGF0aCBsaXN0Ci0gICAgcHVibGljIFN0cmluZ1tdIGdldENsYXNzUGF0aGxpc3QoKXsKLSAgICAgICAgT2JqZWN0IFtdIGxpc3RPYmplY3QgPSBsaXN0TW9kZWwudG9BcnJheSgpIDsKLSAgICAgICAgU3RyaW5nIFtdIGxpc3RTdHJpbmcgPW5ldyBTdHJpbmdbbGlzdE9iamVjdC5sZW5ndGhdOwotICAgICAgICBmb3IoaW50IGk9MCA7aTxsaXN0T2JqZWN0Lmxlbmd0aCA7aSsrKXsKLSAgICAgICAgICAgIGxpc3RTdHJpbmdbaV09bGlzdE9iamVjdFtpXS50b1N0cmluZygpIDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbGlzdFN0cmluZyA7Ci0gICAgfQotICAgIC8vIHRlc3QgbG9hZGluZwotICAgIHB1YmxpYyBib29sZWFuIHRlc3RMb2FkaW5nKCl7Ci0gICAgICAgIGphdmEudXRpbC5MaXN0IGVycm9yTGlzdGVuZXIgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIFN0cmluZyBbXSBsaXN0U3RyaW5nID1nZXRDbGFzc1BhdGhsaXN0KCkgOwotICAgICAgICBpZiAoIUNsYXNzTG9hZGluZ1Rlc3RCZWFuLnRyeUxvYWRpbmdDbGFzcyh0eHRDbGFzcy5nZXRUZXh0KCksbGlzdFN0cmluZyxlcnJvckxpc3RlbmVyKSl7Ci0gICAgICAgICAgICBJdGVyYXRvciBpdCA9IGVycm9yTGlzdGVuZXIuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIHdoaWxlKGl0Lmhhc05leHQoKSl7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IG5leHRPYmplY3QgPSBpdC5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGVycm9yTWVzc2FnZSA9IG5leHRPYmplY3Q9PW51bGw/ICJVbmtub3duIGVycm9yISIgOm5leHRPYmplY3QudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICBsYmxUZXN0IC5zZXRUZXh0KGVycm9yTWVzc2FnZSApOwotICAgICAgICAgICAgICAgIHVwZGF0ZVN0YXR1c1RleHRGaWVsZChmYWxzZSxlcnJvck1lc3NhZ2UpOwotICAgICAgICAgICAgICAgIHVwZGF0ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgIHVwZGF0ZVN0YXR1c1RleHRGaWVsZCh0cnVlLCJDbGFzcyBmaWxlIGxvYWRlZCBzdWNjZXNzZnVsbHkiKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICB9Ci0gICAgLy9nZXQgcGFnZSB0eXBlCi0gICAgcHVibGljICBpbnQgZ2V0UGFnZVR5cGUoKSB7Ci0gICAgICAgIHJldHVybiAgV2l6YXJkUGFuZWwuSkFWQV8yX1dTRExfVFlQRTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29scy9qYXZhMndzZGwvT3B0aW9uUGFuZWwuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2xzL2phdmEyd3NkbC9PcHRpb25QYW5lbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzllODg3Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2xzL2phdmEyd3NkbC9PcHRpb25QYW5lbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50b29scy5qYXZhMndzZGw7Ci0KLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbHMuYmVhbi5Xc2RsZ2VuQmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRvb2xzLmNvbXBvbmVudC5XaXphcmRDb21wb25lbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbHMuY29tcG9uZW50LldpemFyZFBhbmVsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbHMud2l6YXJkZnJhbWUuQ29kZWdlbkZyYW1lOwotCi1pbXBvcnQgamF2YXguc3dpbmcuKjsKLWltcG9ydCBqYXZhLmF3dC4qOwotCi0vKioKLSAqIHRoaXMgaXMgdGhlIGZpcnN0IHBhbmVsIG9mIGphdmEyd3NkbCB3aXphcmQKLSAqLwotcHVibGljIGNsYXNzIE9wdGlvblBhbmVsIGV4dGVuZHMgV2l6YXJkUGFuZWx7Ci0gICAgLyoqCi0gICAgICogdmFyaWFibGUKLSAgICAgKi8KLSAgICBwcml2YXRlIEpUZXh0RmllbGQgdHh0TnNwOwotICAgIHByaXZhdGUgSlRleHRGaWVsZCB0eHROc3BQcmVmaXg7Ci0gICAgcHJpdmF0ZSBKVGV4dEZpZWxkIHR4dFNjaGVtYVRhcmdldE5zcDsKLSAgICBwcml2YXRlIEpUZXh0RmllbGQgdHh0U2NoZW1hVGFyZ2V0TnNwUHJlZml4OwotICAgIHByaXZhdGUgSlRleHRGaWVsZCB0eHRTZXJ2aWNlOwotICAgIHByaXZhdGUgV3NkbGdlbkJlYW4gd3NkbGdlbkJlYW47Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3QgbWV0aG9kCi0gICAgICogQHBhcmFtIHdpemFyZENvbXBvbmVudHMKLSAgICAgKiBAcGFyYW0gd3NkbGdlbkJlYW4KLSAgICAgKi8KLSAgICBwdWJsaWMgT3B0aW9uUGFuZWwoV2l6YXJkQ29tcG9uZW50cyB3aXphcmRDb21wb25lbnRzLFdzZGxnZW5CZWFuIHdzZGxnZW5CZWFuKXsKLSAgICAgICAgc3VwZXIod2l6YXJkQ29tcG9uZW50cywgICJBeGlzMiBJZGVhIFBsdWdpbiBKYXZhMldTREwgV2l6YXJkcyIpOwotICAgICAgICBzZXRQYW5lbFRvcFRpdGxlKCJKYXZhIHRvIFdTREwgT3B0aW9ucyIpOwotICAgICAgICBzZXRQYW5lbEJvdHRvbVRpdGxlKCJTZXQgdGhlIE9wdGlvbiBmb3IgdGhlIGdlbmVyYXRpb24iKTsKLSAgICAgICAgdGhpcy53c2RsZ2VuQmVhbj13c2RsZ2VuQmVhbjsKLSAgICAgICAgaW5pdCgpOwotICAgIH0KLSAgICAvKiogaW5pdGFpdGUgbWV0aG9kKi8KLSAgICBwdWJsaWMgdm9pZCBpbml0KCl7Ci0KLSAgICAgICAgdHh0TnNwID1uZXcgSlRleHRGaWVsZCgpOwotCi0gICAgICAgIHR4dE5zcFByZWZpeCA9bmV3IEpUZXh0RmllbGQoKTsKLQotICAgICAgICB0eHRTY2hlbWFUYXJnZXROc3AgPW5ldyBKVGV4dEZpZWxkKCk7Ci0KLSAgICAgICAgdHh0U2NoZW1hVGFyZ2V0TnNwUHJlZml4ID1uZXcgSlRleHRGaWVsZCgpOwotCi0gICAgICAgIHR4dFNlcnZpY2UgPW5ldyBKVGV4dEZpZWxkKCk7Ci0KLSAgICAgICAgc2V0QmFja0J1dHRvbkVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgIHNldE5leHRCdXR0b25FbmFibGVkKHRydWUpOwotICAgICAgICBzZXRGaW5pc2hCdXR0b25FbmFibGVkKGZhbHNlKTsKLSAgICAgICAgdGhpcy5zZXRMYXlvdXQobmV3IEdyaWRCYWdMYXlvdXQoKSk7Ci0KLSAgICAgICAgdGhpcy5hZGQobmV3IEpMYWJlbCgiVGFyZ2V0IE5hbWVzcGFjZSIpCi0gICAgICAgICAgICAgICAgLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDAsIDAsIDEsIDEsICAwLjEsIDAuMAotICAgICAgICAgICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLldFU1QgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLk5PTkUKLSAgICAgICAgICAgICAgICAsIG5ldyBJbnNldHMoNSwgMjAsIDAsMCksIDAsIDApKTsKLQotICAgICAgICB0aGlzLmFkZCh0eHROc3AKLSAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMSwgMCwgMiwgMSwgMS4wLCAwLjAKLSAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5XRVNUICAsIEdyaWRCYWdDb25zdHJhaW50cy5IT1JJWk9OVEFMCi0gICAgICAgICAgICAgICAgLCBuZXcgSW5zZXRzKDUsIDUsIDAsMjApLCAwLCAwKSk7Ci0KLSAgICAgICAgdGhpcy5hZGQobmV3IEpMYWJlbCgiVGFyZ2V0IE5hbWVzcGFjZSBQcmVmaXgiKQotICAgICAgICAgICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygwLCAxLCAxLCAxLCAwLjEsIDAuMAotICAgICAgICAgICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLldFU1QgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLk5PTkUKLSAgICAgICAgICAgICAgICAsIG5ldyBJbnNldHMoNSwgMjAsIDAsIDApLCAwLCAwKSk7Ci0KLSAgICAgICAgdGhpcy5hZGQodHh0TnNwUHJlZml4Ci0gICAgICAgICAgICAgICAgLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDEsIDEsIDIsIDEsIDEuMCwgMC4wCi0gICAgICAgICAgICAgICAgLCBHcmlkQmFnQ29uc3RyYWludHMuV0VTVCAsIEdyaWRCYWdDb25zdHJhaW50cy5IT1JJWk9OVEFMCi0gICAgICAgICAgICAgICAgLCBuZXcgSW5zZXRzKDUsIDUsIDAsMjApLCAwLCAwKSk7Ci0KLSAgICAgICAgdGhpcy5hZGQobmV3IEpMYWJlbCgiU2NoZW1hIFRhcmdldCBOYW1lc3BhY2UiKQotICAgICAgICAgICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygwLCAyLCAxLCAxLCAwLjEsIDAuMAotICAgICAgICAgICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLldFU1QgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLk5PTkUKLSAgICAgICAgICAgICAgICAsIG5ldyBJbnNldHMoNSwgMjAsIDAsMCksIDAsIDApKTsKLQotICAgICAgICB0aGlzLmFkZCh0eHRTY2hlbWFUYXJnZXROc3AKLSAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMSwgMiwgMiwgMSwgMS4wLCAwLjAKLSAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5XRVNUICwgR3JpZEJhZ0NvbnN0cmFpbnRzLkhPUklaT05UQUwKLSAgICAgICAgICAgICAgICAsIG5ldyBJbnNldHMoNSwgNSwgMCwyMCksIDAsIDApKTsKLQotICAgICAgICB0aGlzLmFkZChuZXcgSkxhYmVsKCJTY2hlbWEgVGFyZ2V0IE5hbWVzcGFjZSBQcmVmaXgiKQotICAgICAgICAgICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygwLCAzLCAxLCAxLCAwLjEsIDAuMAotICAgICAgICAgICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLldFU1QgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLk5PTkUKLSAgICAgICAgICAgICAgICAsIG5ldyBJbnNldHMoNSwgMjAsIDAsIDApLCAwLCAwKSk7Ci0KLSAgICAgICAgdGhpcy5hZGQodHh0U2NoZW1hVGFyZ2V0TnNwUHJlZml4Ci0gICAgICAgICAgICAgICAgLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDEsIDMsIDIsIDEsIDEuMCwgMC4wCi0gICAgICAgICAgICAgICAgLCBHcmlkQmFnQ29uc3RyYWludHMuV0VTVCAgLCBHcmlkQmFnQ29uc3RyYWludHMuSE9SSVpPTlRBTAotICAgICAgICAgICAgICAgICwgbmV3IEluc2V0cyg1LCA1LCAwLDIwKSwgMCwgMCkpOwotCi0gICAgICAgIHRoaXMuYWRkKG5ldyBKTGFiZWwoIlNlcnZpY2UgTmFtZSIpCi0gICAgICAgICAgICAgICAgLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDAsIDQsIDEsIDEsIDAuMSwgMS4wCi0gICAgICAgICAgICAgICAgLCBHcmlkQmFnQ29uc3RyYWludHMuTk9SVEhXRVNUICAsIEdyaWRCYWdDb25zdHJhaW50cy5OT05FCi0gICAgICAgICAgICAgICAgLCBuZXcgSW5zZXRzKDUsIDIwLCAwLCAwKSwgMCwgMCkpOwotCi0gICAgICAgIHRoaXMuYWRkKHR4dFNlcnZpY2UKLSAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMSwgNCwgMiwgMSwgMS4wLCAxLjAKLSAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5OT1JUSFdFU1QgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLkhPUklaT05UQUwKLSAgICAgICAgICAgICAgICAsIG5ldyBJbnNldHMoNSwgNSwgMCwyMCksIDAsIDApKTsKLQotICAgIH0KLSAgICAvL25leHQKLSAgICBwdWJsaWMgdm9pZCBuZXh0KCkgewotICAgICAgICBzd2l0Y2hQYW5lbChDb2RlZ2VuRnJhbWUuUEFORUxfTEFTVF9CICk7Ci0gICAgfQotICAgIC8vYmFjawotICAgIHB1YmxpYyB2b2lkIGJhY2soKSB7Ci0gICAgICAgIHN3aXRjaFBhbmVsKENvZGVnZW5GcmFtZS5QQU5FTF9GSVJTVF9CICk7Ci0gICAgfQotICAgIC8vdXBkYXRlCi0gICAgcHVibGljIHZvaWQgdXBkYXRlKCkgewotICAgICAgICBpZih3c2RsZ2VuQmVhbi5nZXRUYXJnZXROYW1lc3BhY2UoKSE9bnVsbCApCi0gICAgICAgICAgICB0eHROc3Auc2V0VGV4dCh3c2RsZ2VuQmVhbi5nZXRUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgIGlmKHdzZGxnZW5CZWFuLmdldFRhcmdldE5hbWVzcGFjZVByZWZpeCgpIT1udWxsICkKLSAgICAgICAgICAgIHR4dE5zcFByZWZpeCAuc2V0VGV4dCh3c2RsZ2VuQmVhbi5nZXRUYXJnZXROYW1lc3BhY2VQcmVmaXgoKSk7Ci0gICAgICAgIGlmKHdzZGxnZW5CZWFuLmdldFNjaGVtYVRhcmdldE5hbWVzcGFjZSgpIT1udWxsICkKLSAgICAgICAgICAgIHR4dFNjaGVtYVRhcmdldE5zcCAuc2V0VGV4dCh3c2RsZ2VuQmVhbi5nZXRTY2hlbWFUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgIGlmKHdzZGxnZW5CZWFuLmdldFNjaGVtYVRhcmdldE5hbWVzcGFjZVByZWZpeCgpIT1udWxsICkKLSAgICAgICAgICAgIHR4dFNjaGVtYVRhcmdldE5zcFByZWZpeC5zZXRUZXh0KHdzZGxnZW5CZWFuLmdldFNjaGVtYVRhcmdldE5hbWVzcGFjZVByZWZpeCgpKTsKLSAgICAgICAgaWYod3NkbGdlbkJlYW4uZ2V0U2VydmljZU5hbWUoKSE9bnVsbCApCi0gICAgICAgICAgICB0eHRTZXJ2aWNlLnNldFRleHQod3NkbGdlbkJlYW4uZ2V0U2VydmljZU5hbWUoKSk7Ci0gICAgICAgICgoT3V0cHV0UGFuZWwpZ2V0V2l6YXJkQ29tcG9uZW50cygpLmdldFdpemFyZFBhbmVsKENvZGVnZW5GcmFtZS5QQU5FTF9MQVNUX0IpKS5sb2FkQ21iQ3VycmVudFByb2plY3QoKTsKLSAgICAgICAgKChPdXRwdXRQYW5lbClnZXRXaXphcmRDb21wb25lbnRzKCkuZ2V0V2l6YXJkUGFuZWwoQ29kZWdlbkZyYW1lLlBBTkVMX0xBU1RfQikpLmxvYWRjbWJNb2R1bGVTcmNQcm9qZWN0KCk7ICAgICAgICAKLSAgICAgICAgc2V0QmFja0J1dHRvbkVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgIHNldE5leHRCdXR0b25FbmFibGVkKHRydWUpOwotICAgICAgICBzZXRGaW5pc2hCdXR0b25FbmFibGVkKGZhbHNlKTsKLSAgICAgICAgc2V0UGFnZUNvbXBsZXRlKGlzQ29tcGxldGUoKSk7Ci0gICAgfQotICAgIC8vIGdldCBwYWdlIHR5cGUKLSAgICBwdWJsaWMgIGludCBnZXRQYWdlVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuICBXaXphcmRQYW5lbC5KQVZBXzJfV1NETF9UWVBFOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0NvbXBsZXRlKCl7Ci0gICAgICAgIGlmKHR4dE5zcC5nZXRUZXh0KCkhPW51bGwKLSAgICAgICAgICAgICAgICAmJiB0eHROc3BQcmVmaXguZ2V0VGV4dCgpIT1udWxsCi0gICAgICAgICAgICAgICAgJiYgdHh0U2NoZW1hVGFyZ2V0TnNwLmdldFRleHQoKSE9bnVsbAotICAgICAgICAgICAgICAgICYmIHR4dFNjaGVtYVRhcmdldE5zcFByZWZpeC5nZXRUZXh0KCkhPW51bGwKLSAgICAgICAgICAgICAgICAmJiB0eHRTZXJ2aWNlLmdldFRleHQoKSE9bnVsbCl7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICByZXR1cm4gIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbHMvamF2YTJ3c2RsL091dHB1dFBhbmVsLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29scy9qYXZhMndzZGwvT3V0cHV0UGFuZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGMxNjUyMy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29scy9qYXZhMndzZGwvT3V0cHV0UGFuZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudG9vbHMuamF2YTJ3c2RsOwotCi1pbXBvcnQgY29tLmludGVsbGlqLm9wZW5hcGkubW9kdWxlLk1vZHVsZTsKLWltcG9ydCBjb20uaW50ZWxsaWoub3BlbmFwaS5wcm9qZWN0LlByb2plY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29scy5iZWFuLldzZGxnZW5CZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbHMuY29tcG9uZW50LldpemFyZENvbXBvbmVudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29scy5jb21wb25lbnQuV2l6YXJkUGFuZWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29scy53aXphcmRmcmFtZS5Db2RlZ2VuRnJhbWU7Ci0KLWltcG9ydCBqYXZheC5zd2luZy4qOwotaW1wb3J0IGphdmEuYXd0Lio7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uRXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotCi0vKiogdGhpcyBjbGFzcyBqYXZhIDIgd3NkbCBvdXRwdXQgd2l6YXJkIHBhbmVsICAgKi8KLXB1YmxpYyBjbGFzcyBPdXRwdXRQYW5lbCBleHRlbmRzIFdpemFyZFBhbmVsIHsKLQotICAgIHByaXZhdGUgSlJhZGlvQnV0dG9uIHJidG5BZGQ7Ci0gICAgcHJpdmF0ZSBKUmFkaW9CdXR0b24gcmJ0blNhdmU7Ci0gICAgcHJpdmF0ZSBKQ29tYm9Cb3ggY21iQ3VycmVudFByb2plY3Q7Ci0gICAgcHJpdmF0ZSBKQ29tYm9Cb3ggY21iTW9kdWxlU3JjOwotICAgIHByaXZhdGUgSlRleHRGaWVsZCB0eHRMb2NhdGlvbjsKLSAgICBwcml2YXRlIEpUZXh0RmllbGQgdHh0RmlsZU5hbWU7Ci0gICAgcHJpdmF0ZSBKTGFiZWwgbGJsTW9kdWxlOwotICAgIHByaXZhdGUgSkxhYmVsIGxibERpcmVjdDsKLSAgICBwcml2YXRlIEpMYWJlbCBsYmxPdXRwdXQ7Ci0gICAgcHJpdmF0ZSBKQnV0dG9uIGJ0bkJyb3dlczsKLSAgICBmaW5hbCBKRmlsZUNob29zZXIgRGlyQ2hvb3Nlcj1uZXcgSkZpbGVDaG9vc2VyKCk7Ci0gICAgcHJpdmF0ZSBQcm9qZWN0IHByb2plY3Q7Ci0gICAgcHJpdmF0ZSBXc2RsZ2VuQmVhbiB3c2RsZ2VuQmVhbjsKLSAgICBwcml2YXRlIGJvb2xlYW4gZmxhZyA9IHRydWU7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvcgotICAgICAqIEBwYXJhbSB3aXphcmRDb21wb25lbnRzCi0gICAgICogQHBhcmFtIHdzZGxnZW5CZWFuCi0gICAgICogQHBhcmFtIHByb2plY3QKLSAgICAgKi8KLSAgICBwdWJsaWMgT3V0cHV0UGFuZWwoV2l6YXJkQ29tcG9uZW50cyB3aXphcmRDb21wb25lbnRzLFdzZGxnZW5CZWFuIHdzZGxnZW5CZWFuLCBQcm9qZWN0IHByb2plY3QpewotICAgICAgICBzdXBlcih3aXphcmRDb21wb25lbnRzLCAgIkF4aXMyIElkZWEgUGx1Z2luIEphdmEyV1NETCBXaXphcmRzIik7Ci0gICAgICAgIHNldFBhbmVsVG9wVGl0bGUoIldTRGwgZmlsZSBvdXRwdXQgbG9jYXRpb24iKTsKLSAgICAgICAgc2V0UGFuZWxCb3R0b21UaXRsZSgiU2VsZWN0IHRoZSBsb2NhdGlvbiBmb3IgdGhlIGdlbmVyYXRlZCBXU0RMIik7Ci0gICAgICAgIHRoaXMud3NkbGdlbkJlYW49d3NkbGdlbkJlYW47Ci0gICAgICAgIHRoaXMucHJvamVjdD1wcm9qZWN0OwotICAgICAgICBpbml0KCk7Ci0gICAgfQotICAgIHByaXZhdGUgdm9pZCBpbml0KCl7Ci0KLSAgICAgICAgcmJ0bkFkZCA9bmV3IEpSYWRpb0J1dHRvbigiQnJvd2VzIGFuZCBBZGQgdGhlIFdTREwgdG8gYSBwcm9qZWN0IG9uIGN1cnJlbnQgSWRlYSB3b3Jrc3BhY2UiLHRydWUpOwotCi0gICAgICAgIHJidG5TYXZlID1uZXcgSlJhZGlvQnV0dG9uKCJCcm93ZXMgYW5kIFNhdmUgdGhlIFdTREwgZmlsZSBvbiBsb2NhbCBmaWxlIHN5c3RlbSIsZmFsc2UpOwotCi0gICAgICAgIGNtYkN1cnJlbnRQcm9qZWN0ID1uZXcgSkNvbWJvQm94KCk7Ci0gICAgICAgIGNtYkN1cnJlbnRQcm9qZWN0LnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgIGNtYk1vZHVsZVNyYz1uZXcgSkNvbWJvQm94KCk7Ci0gICAgICAgIGNtYk1vZHVsZVNyYy5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICBCdXR0b25Hcm91cCAgYnV0dG9uR3JvdXA9IG5ldyAgQnV0dG9uR3JvdXAoKTsKLSAgICAgICAgYnV0dG9uR3JvdXAuYWRkKHJidG5BZGQgKTsKLSAgICAgICAgYnV0dG9uR3JvdXAuYWRkKHJidG5TYXZlICk7Ci0KLSAgICAgICAgdHh0RmlsZU5hbWUgPW5ldyBKVGV4dEZpZWxkKCJzZXJ2aWNlLndzZGwiKTsKLQotICAgICAgICB0eHRMb2NhdGlvbj1uZXcgSlRleHRGaWVsZCgpOwotCi0gICAgICAgIGJ0bkJyb3dlcz1uZXcgSkJ1dHRvbigiQnJvd3NlLi4iKTsKLSAgICAgICAgbGJsT3V0cHV0PW5ldyBKTGFiZWwoIk91dFB1dCBMb2NhdGlvbiIpOwotICAgICAgICBsYmxNb2R1bGU9bmV3IEpMYWJlbCgiU2VsZWN0IHRoZSBNb2R1bGUiKTsKLSAgICAgICAgbGJsTW9kdWxlLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICBsYmxEaXJlY3Q9bmV3IEpMYWJlbCgiU2VsZWN0IHRoZSBEaXJlY3RvcnkiKTsKLSAgICAgICAgbGJsRGlyZWN0LnNldEVuYWJsZWQoZmFsc2UpOwotCi0gICAgICAgIHNldEJhY2tCdXR0b25FbmFibGVkKHRydWUpOwotICAgICAgICBzZXROZXh0QnV0dG9uRW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIHNldEZpbmlzaEJ1dHRvbkVuYWJsZWQoZmFsc2UpOwotICAgICAgICB0aGlzLnNldExheW91dChuZXcgR3JpZEJhZ0xheW91dCgpKTsKLQotICAgICAgICB0aGlzLmFkZChuZXcgSkxhYmVsKCJPdXRQdXQgRmlsZSBOYW1lIikKLSAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMCwgMCwgMSwgMSwgMC4xLCAwLjAKLSAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5XRVNUICAsIEdyaWRCYWdDb25zdHJhaW50cy5OT05FCi0gICAgICAgICAgICAgICAgLCBuZXcgSW5zZXRzKDUsIDEwLCAwLCAwKSwgMCwgMCkpOwotCi0gICAgICAgIHRoaXMuYWRkKHR4dEZpbGVOYW1lCi0gICAgICAgICAgICAgICAgLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDEsIDAsIDEsIDEsIDEuMCwgMC4wCi0gICAgICAgICAgICAgICAgLCBHcmlkQmFnQ29uc3RyYWludHMuV0VTVCAgLCBHcmlkQmFnQ29uc3RyYWludHMuSE9SSVpPTlRBTAotICAgICAgICAgICAgICAgICwgbmV3IEluc2V0cyg1LCAxMCwgMCwgMCksIDAsIDApKTsKLQotCi0gICAgICAgIHRoaXMuYWRkKG5ldyBKTGFiZWwoIlNlbGVjdCB0aGUgbG9jYXRpb24gd2hlcmUgdG8gcHV0IHRoZSBvdXRwdXQiKQotICAgICAgICAgICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygwLCAxLCBHcmlkQmFnQ29uc3RyYWludHMuUkVNQUlOREVSLCAxLCAgMC4wLCAwLjAKLSAgICAgICAgLCBHcmlkQmFnQ29uc3RyYWludHMuV0VTVCAgLCBHcmlkQmFnQ29uc3RyYWludHMuTk9ORQotICAgICAgICAsIG5ldyBJbnNldHMoNSwgMTAsIDAsIDEwKSwgMCwgMCkpOwotCi0gICAgICAgIHRoaXMuYWRkKHJidG5BZGQKLSAgICAgICAgLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDAsIDIsIEdyaWRCYWdDb25zdHJhaW50cy5SRU1BSU5ERVIsIDEsIDAuMCwgMC4wCi0gICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLldFU1QgLCBHcmlkQmFnQ29uc3RyYWludHMuTk9ORQotICAgICAgICAsIG5ldyBJbnNldHMoNSwgMTAsIDAsMTApLCAwLCAwKSk7Ci0gICAgICAgIHJidG5BZGQuYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgY21iQ3VycmVudFByb2plY3Quc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICBjbWJNb2R1bGVTcmMuc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICBsYmxNb2R1bGUuc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICB0eHRMb2NhdGlvbiAuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgYnRuQnJvd2VzLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgIGxvYWRDbWJDdXJyZW50UHJvamVjdCgpOwotICAgICAgICAgICAgICAgIGxvYWRjbWJNb2R1bGVTcmNQcm9qZWN0KCk7Ci0gICAgICAgICAgICAgICAgc2V0RmluaXNoQnV0dG9uRW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICB1cGRhdGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgIHRoaXMuYWRkKGxibE1vZHVsZQotICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMCwgMywgMSwgMSwgIDAuMSwgMC4wCi0gICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLldFU1QgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLk5PTkUKLSAgICAgICAgLCBuZXcgSW5zZXRzKDUsIDEwLCAwLCAwKSwgMCwgMCkpOwotCi0gICAgICAgIHRoaXMuYWRkKGNtYkN1cnJlbnRQcm9qZWN0Ci0gICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygxLCAzLCBHcmlkQmFnQ29uc3RyYWludHMuUkVMQVRJVkUsIDEsIDEuMCwgMC4wCi0gICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLldFU1QgLCBHcmlkQmFnQ29uc3RyYWludHMuSE9SSVpPTlRBTAotICAgICAgICAsIG5ldyBJbnNldHMoNSwgMTAsIDAsMCksIDAsIDApKTsKLSAgICAgICAgY21iQ3VycmVudFByb2plY3QuYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgbG9hZGNtYk1vZHVsZVNyY1Byb2plY3QoKTsKLSAgICAgICAgICAgICAgICB1cGRhdGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgICB0aGlzLmFkZChsYmxEaXJlY3QKLSAgICAgICAgLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDAsIDQsIDEsIDEsICAwLjEsIDAuMAotICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5XRVNUICAsIEdyaWRCYWdDb25zdHJhaW50cy5OT05FCi0gICAgICAgICwgbmV3IEluc2V0cyg1LCAxMCwgMCwgMCksIDAsIDApKTsKLQotICAgICAgICB0aGlzLmFkZChjbWJNb2R1bGVTcmMKLSAgICAgICAgLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDEsIDQsIEdyaWRCYWdDb25zdHJhaW50cy5SRUxBVElWRSwgMSwgMS4wLCAwLjAKLSAgICAgICAgLCBHcmlkQmFnQ29uc3RyYWludHMuV0VTVCAsIEdyaWRCYWdDb25zdHJhaW50cy5IT1JJWk9OVEFMCi0gICAgICAgICwgbmV3IEluc2V0cyg1LCAxMCwgMCwwKSwgMCwgMCkpOwotICAgICAgICBjbWJNb2R1bGVTcmMuYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7ICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgdXBkYXRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIHRoaXMuYWRkKHJidG5TYXZlCi0gICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygwLCA1LCBHcmlkQmFnQ29uc3RyYWludHMuUkVNQUlOREVSLCAxLCAxLjAsIDAuMAotICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5XRVNUICAsIEdyaWRCYWdDb25zdHJhaW50cy5OT05FCi0gICAgICAgICwgbmV3IEluc2V0cyg1LCAxMCwgMCwwKSwgMCwgMCkpOwotICAgICAgICByYnRuU2F2ZS5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSAgewotICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBjbWJDdXJyZW50UHJvamVjdC5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICBjbWJNb2R1bGVTcmMuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgdHh0TG9jYXRpb24gLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgYnRuQnJvd2VzLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgc2V0RW5hYmxlZEZvckN1c3RvbVByb2plY3QoKTsKLSAgICAgICAgICAgICAgICB1cGRhdGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIHRoaXMuYWRkKGxibE91dHB1dAotICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMCwgNiwgMSwgMSwgMC4xLCAxLjAKLSAgICAgICAgLCBHcmlkQmFnQ29uc3RyYWludHMuTk9SVEhXRVNUICwgR3JpZEJhZ0NvbnN0cmFpbnRzLk5PTkUKLSAgICAgICAgLCBuZXcgSW5zZXRzKDUsIDEwLCAwLDApLCAwLCAwKSk7Ci0KLSAgICAgICAgIHRoaXMuYWRkKHR4dExvY2F0aW9uCi0gICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygxLCA2LCAxLCAxLCAxLjAsIDEuMAotICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5OT1JUSFdFU1QgLCBHcmlkQmFnQ29uc3RyYWludHMuSE9SSVpPTlRBTAotICAgICAgICAsIG5ldyBJbnNldHMoNSwgMTAsIDAsIDApLCAwLCAwKSk7Ci0KLSAgICAgICAgIHRoaXMuYWRkKGJ0bkJyb3dlcwotICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMiwgNiwgMSwgMSwgMC4xLCAxLjAKLSAgICAgICAgLCBHcmlkQmFnQ29uc3RyYWludHMuTk9SVEhXRVNUICwgR3JpZEJhZ0NvbnN0cmFpbnRzLk5PTkUKLSAgICAgICAgLCBuZXcgSW5zZXRzKDUsIDEwLCAwLCAxMCksIDAsIDApKTsKLQotICAgICAgICBidG5Ccm93ZXMuYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgRGlyQ2hvb3NlciAuc2V0RmlsZVNlbGVjdGlvbk1vZGUoSkZpbGVDaG9vc2VyLkRJUkVDVE9SSUVTX09OTFkpOwotICAgICAgICAgICAgICAgIGludCByZXR1cm5WYWwgPSBEaXJDaG9vc2VyLnNob3dPcGVuRGlhbG9nKGJ0bkJyb3dlcyApOwotICAgICAgICAgICAgICAgIGlmIChyZXR1cm5WYWwgPT0gSkZpbGVDaG9vc2VyLkFQUFJPVkVfT1BUSU9OKSB7Ci0gICAgICAgICAgICAgICAgICAgIERpckNob29zZXIuc2V0RmlsZVNlbGVjdGlvbk1vZGUoSkZpbGVDaG9vc2VyIC5GSUxFU19PTkxZICk7Ci0gICAgICAgICAgICAgICAgICAgIEZpbGUgbmV3ZmlsZSA9IERpckNob29zZXIuZ2V0U2VsZWN0ZWRGaWxlKCk7Ci0gICAgICAgICAgICAgICAgICAgIHR4dExvY2F0aW9uLnNldFRleHQobmV3ZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB1cGRhdGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgd3NkbGdlbkJlYW4uc2V0UHJvamVjdChwcm9qZWN0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBsb2FkQ21iQ3VycmVudFByb2plY3QoKSB7Ci0gICAgICAgIE1vZHVsZSBtb2R1bGVzW10gPSB3c2RsZ2VuQmVhbi5nZXRNb2R1bGVzKCk7Ci0KLSAgICAgICAgaWYgKG1vZHVsZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChpbnQgY291bnQgPSAwOyBjb3VudCA8IG1vZHVsZXMubGVuZ3RoOyBjb3VudCsrKSB7Ci0gICAgICAgICAgICAgICAgY21iQ3VycmVudFByb2plY3QuYWRkSXRlbShtb2R1bGVzW2NvdW50XS5nZXROYW1lKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgIHJidG5TYXZlLnNldFNlbGVjdGVkKHRydWUpOwotICAgICAgICAgICAgcmJ0bkFkZC5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgIHB1YmxpYyB2b2lkIGxvYWRjbWJNb2R1bGVTcmNQcm9qZWN0KCkgewotICAgICAgICBTdHJpbmcgbW9kdWxlID0gbnVsbDsKLSAgICAgICAgbW9kdWxlID0gKFN0cmluZykgY21iQ3VycmVudFByb2plY3QuZ2V0U2VsZWN0ZWRJdGVtKCk7Ci0gICAgICAgIGNtYk1vZHVsZVNyYy5yZW1vdmVBbGxJdGVtcygpOwotICAgICAgICBpbnQgY291bnQgPSAwOwotICAgICAgICBpZiAobW9kdWxlICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyBzcmNbXSA9IHdzZGxnZW5CZWFuLmdldE1vZHVsZVNyYyhtb2R1bGUpOwotICAgICAgICAgICAgZm9yICggY291bnQgPSAwOyBjb3VudCA8IHNyYy5sZW5ndGg7IGNvdW50KyspIHsKLSAgICAgICAgICAgICAgICBjbWJNb2R1bGVTcmMuYWRkSXRlbShzcmNbY291bnRdKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNvdW50ID0gc3JjLmxlbmd0aDsKLSAgICAgICAgfQotICAgICAgICAgaWYgKGZsYWcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChjb3VudCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgZmxhZyA9ZmFsc2U7Ci0gICAgICAgICAgICAgICAgc2V0RW5hYmxlZEZvckN1c3RvbVByb2plY3QoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2V7Ci0gICAgICAgICAgICAgICAgc2V0RW5hYmxlZEZvckN1cnJlbnRQcm9qZWN0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAgcHVibGljIHZvaWQgYmFjaygpIHsKLSAgICAgICAgICBzd2l0Y2hQYW5lbChDb2RlZ2VuRnJhbWUuUEFORUxfT1BUSU9OX0IgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBuZXh0KCkgewotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdXBkYXRlKCl7Ci0gICAgICAgIGlmKHJidG5TYXZlLmlzU2VsZWN0ZWQoKSl7Ci0gICAgICAgICAgICBpZih0eHRGaWxlTmFtZS5nZXRUZXh0KCkgIT1udWxsICYmIHR4dExvY2F0aW9uLmdldFRleHQoKSAhPW51bGwpIHsKLSAgICAgICAgICAgICAgICB3c2RsZ2VuQmVhbi5zZXRPdXRwdXRXU0RMTmFtZSh0eHRGaWxlTmFtZS5nZXRUZXh0KCkpOwotICAgICAgICAgICAgICAgIHdzZGxnZW5CZWFuLnNldE91dHB1dExvY2F0aW9uKHR4dExvY2F0aW9uLmdldFRleHQoKSk7Ci0gICAgICAgICAgICAgICAgc2V0RmluaXNoQnV0dG9uRW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgIH1lbHNlIGlmKHR4dExvY2F0aW9uLmdldFRleHQoKSAhPW51bGwpewotICAgICAgICAgICAgICAgIHdzZGxnZW5CZWFuLnNldE91dHB1dExvY2F0aW9uKHR4dExvY2F0aW9uLmdldFRleHQoKSk7Ci0gICAgICAgICAgICAgICAgc2V0RmluaXNoQnV0dG9uRW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICB9ZWxzZSBpZih0eHRGaWxlTmFtZS5nZXRUZXh0KCkgIT1udWxsKXsKLSAgICAgICAgICAgICAgICB3c2RsZ2VuQmVhbi5zZXRPdXRwdXRXU0RMTmFtZSh0eHRGaWxlTmFtZSAuZ2V0VGV4dCgpKTsKLSAgICAgICAgICAgICAgICBzZXRGaW5pc2hCdXR0b25FbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgIHNldEZpbmlzaEJ1dHRvbkVuYWJsZWQoZmFsc2UpOwotICAgICAgICB9ZWxzZSBpZihyYnRuQWRkLmlzU2VsZWN0ZWQoKSl7Ci0gICAgICAgICAgICBpZih0eHRGaWxlTmFtZS5nZXRUZXh0KCkgIT1udWxsICYmIGNtYk1vZHVsZVNyYy5nZXRTZWxlY3RlZEl0ZW0oKSAhPW51bGwpewotICAgICAgICAgICAgICAgIHdzZGxnZW5CZWFuLnNldE91dHB1dFdTRExOYW1lKHR4dEZpbGVOYW1lLmdldFRleHQoKSk7Ci0gICAgICAgICAgICAgICAgd3NkbGdlbkJlYW4uc2V0T3V0cHV0TG9jYXRpb24oY21iTW9kdWxlU3JjLmdldFNlbGVjdGVkSXRlbSgpLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIHNldEZpbmlzaEJ1dHRvbkVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICB9ZWxzZSBpZih0eHRGaWxlTmFtZSAuZ2V0VGV4dCgpICE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgd3NkbGdlbkJlYW4uc2V0T3V0cHV0V1NETE5hbWUodHh0RmlsZU5hbWUgLmdldFRleHQoKSk7Ci0gICAgICAgICAgICAgICAgc2V0RmluaXNoQnV0dG9uRW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICB9ZWxzZQotICAgICAgICAgICAgICAgIHNldEZpbmlzaEJ1dHRvbkVuYWJsZWQoZmFsc2UpOwotICAgICAgICB9Ci0gICAgICAgIHNldEJhY2tCdXR0b25FbmFibGVkKHRydWUpOwotICAgICAgICBzZXROZXh0QnV0dG9uRW5hYmxlZChmYWxzZSk7Ci0KLSAgICB9Ci0gICAgIHB1YmxpYyAgaW50IGdldFBhZ2VUeXBlKCkgewotICAgICAgICByZXR1cm4gIFdpemFyZFBhbmVsLkpBVkFfMl9XU0RMX1RZUEU7Ci0gICAgfQotICAgICBwcml2YXRlIHZvaWQgc2V0RW5hYmxlZEZvckN1cnJlbnRQcm9qZWN0KCl7Ci0gICAgICAgIHJidG5BZGQuc2V0U2VsZWN0ZWQodHJ1ZSk7Ci0gICAgICAgIHJidG5BZGQuc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgY21iQ3VycmVudFByb2plY3Quc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgY21iTW9kdWxlU3JjLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgIGxibERpcmVjdC5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICBsYmxNb2R1bGUgLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgIHJidG5TYXZlLnNldFNlbGVjdGVkKGZhbHNlKTsKLSAgICAgICAgdHh0TG9jYXRpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIGxibE91dHB1dCAuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIGJ0bkJyb3dlcy5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICB9Ci0gICAgcHJpdmF0ZSB2b2lkIHNldEVuYWJsZWRGb3JDdXN0b21Qcm9qZWN0KCl7Ci0gICAgICAgIGlmKGZsYWcpewotICAgICAgICAgICAgcmJ0bkFkZC5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgIHJidG5BZGQuc2V0U2VsZWN0ZWQoZmFsc2UpOwotICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgIHJidG5TYXZlIC5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgcmJ0blNhdmUgLnNldFNlbGVjdGVkKHRydWUpOwotICAgICAgICB9Ci0gICAgICAgIGNtYkN1cnJlbnRQcm9qZWN0LnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICBjbWJNb2R1bGVTcmMuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIGxibERpcmVjdC5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgbGJsTW9kdWxlIC5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgdHh0TG9jYXRpb24gLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgIGxibE91dHB1dCAuc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgYnRuQnJvd2VzIC5zZXRFbmFibGVkKHRydWUpOwotICAgIH0KLX0KLSAKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2xzL3dpemFyZGZyYW1lL0NvZGVnZW5GcmFtZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbHMvd2l6YXJkZnJhbWUvQ29kZWdlbkZyYW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmY2RiMzUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbHMvd2l6YXJkZnJhbWUvQ29kZWdlbkZyYW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnRvb2xzLndpemFyZGZyYW1lOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29scy5jb21wb25lbnQuV2l6YXJkUGFuZWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29scy5pZGVhLkNob29zZXJQYW5lbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRvb2xzLmlkZWEuRmlyc3RQYW5lbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRvb2xzLmlkZWEuU2Vjb25kUGFuZWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29scy5pZGVhLldTREwySmF2YU91dHB1dFBhbmVsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbHMuamF2YTJ3c2RsLk1pZGRsZVBhbmVsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbHMuamF2YTJ3c2RsLk9wdGlvblBhbmVsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbHMuamF2YTJ3c2RsLk91dHB1dFBhbmVsOwotaW1wb3J0IG9yZy5hcGFjaGUuaWRlYXBsdWdpbi5mcmFtZXMuQ2xhc3NGaWxlTG9jYXRpb25QYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUuaWRlYXBsdWdpbi5mcmFtZXMuTGlicmFyeUFkZGluZ1BhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5pZGVhcGx1Z2luLmZyYW1lcy5TZXJ2aWNlQXJjaGl2ZU91dHB1dExvY2F0aW9uUGFnZTsKLWltcG9ydCBvcmcuYXBhY2hlLmlkZWFwbHVnaW4uZnJhbWVzLlNlcnZpY2VYTUxFZGl0UGFnZTsKLWltcG9ydCBvcmcuYXBhY2hlLmlkZWFwbHVnaW4uZnJhbWVzLlNlcnZpY2VYTUxGaWxlU2VsZWN0aW9uUGFnZTsKLWltcG9ydCBvcmcuYXBhY2hlLmlkZWFwbHVnaW4uZnJhbWVzLlNlcnZpY2VYTUxHZW5lcmF0aW9uUGFnZTsKLWltcG9ydCBvcmcuYXBhY2hlLmlkZWFwbHVnaW4uZnJhbWVzLldTRExGaWxlU2VsZWN0aW9uUGFnZTsKLQotLyoqCi0gKiBjb2RlYUZyYW1lIGNsYXNzCi0gKi8KLQotcHVibGljIGNsYXNzIENvZGVnZW5GcmFtZSBleHRlbmRzIFdpemFyZEZyYW1lewotICAgIC8qKgotICAgICAqIHZhcmlhYmxlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEFORUxfQ0hPT1NFUiA9IDA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEFORUxfRklSU1RfQSA9IDE7ICAgIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBTkVMX0ZJUlNUX0IgPSAyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBTkVMX09QVElPTl9BID0zOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBTkVMX09QVElPTl9CID0gNDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQQU5FTF9MQVNUX0EgPSA1OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBTkVMX0xBU1RfQiA9IDY7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEFORUxfRklSU1RfQz03OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBTkVMX1NFQ09ORF9DPTg7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEFORUxfVEhJUkRfQz05OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBTkVMX0ZPVVJUSF9DPTEwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBTkVMX0xPQURfQz0xMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQQU5FTF9PUFRJT05fQz0xMjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQQU5FTF9MQVNUX0M9MTM7Ci0KLSAgICBwdWJsaWMgQ29kZWdlbkZyYW1lKCkgewotICAgICAgICBpbml0KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGluaXQoKSB7Ci0gICAgICAgIHRoaXMuc2V0VGl0bGUoIkF4aXMyIENvZGVnZW4gV2l6YXJkIik7IAotICAgICAgICBXaXphcmRQYW5lbCBwYW5lbCA9IG51bGw7Ci0KLSAgICAgICAgcGFuZWwgPSBuZXcgQ2hvb3NlclBhbmVsKGdldFdpemFyZENvbXBvbmVudHMoKSk7Ci0gICAgICAgIGdldFdpemFyZENvbXBvbmVudHMoKS5hZGRXaXphcmRQYW5lbChQQU5FTF9DSE9PU0VSICwgcGFuZWwpOwotCi0gICAgICAgIHBhbmVsID0gbmV3IEZpcnN0UGFuZWwoZ2V0V2l6YXJkQ29tcG9uZW50cygpLGNvZGVnZW5CZWFuKTsKLSAgICAgICAgZ2V0V2l6YXJkQ29tcG9uZW50cygpLmFkZFdpemFyZFBhbmVsKFBBTkVMX0ZJUlNUX0EgLCBwYW5lbCk7Ci0KLSAgICAgICAgcGFuZWwgPSBuZXcgTWlkZGxlUGFuZWwoZ2V0V2l6YXJkQ29tcG9uZW50cygpLHdzZGxnZW5CZWFuICk7Ci0gICAgICAgIGdldFdpemFyZENvbXBvbmVudHMoKS5hZGRXaXphcmRQYW5lbChQQU5FTF9GSVJTVF9CLCBwYW5lbCk7Ci0KLSAgICAgICAgcGFuZWwgPSBuZXcgU2Vjb25kUGFuZWwoZ2V0V2l6YXJkQ29tcG9uZW50cygpLGNvZGVnZW5CZWFuKTsKLSAgICAgICAgZ2V0V2l6YXJkQ29tcG9uZW50cygpLmFkZFdpemFyZFBhbmVsKFBBTkVMX09QVElPTl9BICwgcGFuZWwpOwotCi0gICAgICAgIHBhbmVsID0gbmV3IE9wdGlvblBhbmVsKGdldFdpemFyZENvbXBvbmVudHMoKSx3c2RsZ2VuQmVhbik7Ci0gICAgICAgIGdldFdpemFyZENvbXBvbmVudHMoKS5hZGRXaXphcmRQYW5lbChQQU5FTF9PUFRJT05fQiAsIHBhbmVsKTsKLQotICAgICAgICBwYW5lbCA9IG5ldyBXU0RMMkphdmFPdXRwdXRQYW5lbChnZXRXaXphcmRDb21wb25lbnRzKCksY29kZWdlbkJlYW4scHJvamVjdCk7Ci0gICAgICAgIGdldFdpemFyZENvbXBvbmVudHMoKS5hZGRXaXphcmRQYW5lbChQQU5FTF9MQVNUX0EgLCBwYW5lbCk7ICAgICAgCi0KLSAgICAgICAgcGFuZWwgPSBuZXcgT3V0cHV0UGFuZWwoZ2V0V2l6YXJkQ29tcG9uZW50cygpLHdzZGxnZW5CZWFuLHByb2plY3QpOwotICAgICAgICBnZXRXaXphcmRDb21wb25lbnRzKCkuYWRkV2l6YXJkUGFuZWwoUEFORUxfTEFTVF9CICwgcGFuZWwpOwotCi0gICAgICAgIHBhbmVsID0gbmV3IENsYXNzRmlsZUxvY2F0aW9uUGFnZShnZXRXaXphcmRDb21wb25lbnRzKCksYXJjaGl2ZUJlYW4pOwotICAgICAgICBnZXRXaXphcmRDb21wb25lbnRzKCkuYWRkV2l6YXJkUGFuZWwoUEFORUxfRklSU1RfQyAsIHBhbmVsKTsKLQotICAgICAgICBwYW5lbCA9IG5ldyBXU0RMRmlsZVNlbGVjdGlvblBhZ2UoZ2V0V2l6YXJkQ29tcG9uZW50cygpLGFyY2hpdmVCZWFuKTsKLSAgICAgICAgZ2V0V2l6YXJkQ29tcG9uZW50cygpLmFkZFdpemFyZFBhbmVsKFBBTkVMX1NFQ09ORF9DICwgcGFuZWwpOwotCi0gICAgICAgIHBhbmVsID0gbmV3IExpYnJhcnlBZGRpbmdQYWdlKGdldFdpemFyZENvbXBvbmVudHMoKSxhcmNoaXZlQmVhbik7Ci0gICAgICAgIGdldFdpemFyZENvbXBvbmVudHMoKS5hZGRXaXphcmRQYW5lbChQQU5FTF9USElSRF9DICwgcGFuZWwpOwotCi0gICAgICAgIHBhbmVsID0gbmV3IFNlcnZpY2VYTUxGaWxlU2VsZWN0aW9uUGFnZShnZXRXaXphcmRDb21wb25lbnRzKCksYXJjaGl2ZUJlYW4pOwotICAgICAgICBnZXRXaXphcmRDb21wb25lbnRzKCkuYWRkV2l6YXJkUGFuZWwoUEFORUxfRk9VUlRIX0MgLCBwYW5lbCk7Ci0KLSAgICAgICAgcGFuZWwgPSBuZXcgU2VydmljZVhNTEdlbmVyYXRpb25QYWdlKGdldFdpemFyZENvbXBvbmVudHMoKSxhcmNoaXZlQmVhbik7Ci0gICAgICAgIGdldFdpemFyZENvbXBvbmVudHMoKS5hZGRXaXphcmRQYW5lbChQQU5FTF9MT0FEX0MgLCBwYW5lbCk7Ci0KLSAgICAgICAgcGFuZWwgPSBuZXcgU2VydmljZVhNTEVkaXRQYWdlKGdldFdpemFyZENvbXBvbmVudHMoKSxhcmNoaXZlQmVhbikgOwotICAgICAgICBnZXRXaXphcmRDb21wb25lbnRzKCkuYWRkV2l6YXJkUGFuZWwoUEFORUxfT1BUSU9OX0MgLCBwYW5lbCk7Ci0KLSAgICAgICAgcGFuZWwgPSBuZXcgU2VydmljZUFyY2hpdmVPdXRwdXRMb2NhdGlvblBhZ2UoZ2V0V2l6YXJkQ29tcG9uZW50cygpLGFyY2hpdmVCZWFuKTsKLSAgICAgICAgZ2V0V2l6YXJkQ29tcG9uZW50cygpLmFkZFdpemFyZFBhbmVsKFBBTkVMX0xBU1RfQyAsIHBhbmVsKTsKLQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2xzL3dpemFyZGZyYW1lL1dpemFyZEZyYW1lLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29scy93aXphcmRmcmFtZS9XaXphcmRGcmFtZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjgyOWQ2Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2xzL3dpemFyZGZyYW1lL1dpemFyZEZyYW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ODMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnRvb2xzLndpemFyZGZyYW1lOwotCi1pbXBvcnQgY29tLmludGVsbGlqLm9wZW5hcGkucHJvamVjdC5Qcm9qZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbHMuYmVhbi5Db2RlZ2VuQmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRvb2xzLmJlYW4uU3JjQ29tcGlsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29scy5iZWFuLldzZGxnZW5CZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbHMuY29tcG9uZW50LkNhbmNlbEFjdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRvb2xzLmNvbXBvbmVudC5EZWZhdWx0V2l6YXJkQ29tcG9uZW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRvb2xzLmNvbXBvbmVudC5GaW5pc2hBY3Rpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29scy5jb21wb25lbnQuVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbHMuY29tcG9uZW50LldpemFyZENvbXBvbmVudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29scy5jb21wb25lbnQuV2l6YXJkUGFuZWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29scy5pZGVhLkZpcnN0UGFuZWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29scy5pZGVhLlByb2dyZXNzQmFyUGFuZWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29scy5pZGVhLlNlY29uZFBhbmVsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbHMuaWRlYS5XU0RMMkphdmFPdXRwdXRQYW5lbDsKLWltcG9ydCBvcmcuYXBhY2hlLmlkZWFwbHVnaW4uYmVhbi5BcmNoaXZlQmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLmlkZWFwbHVnaW4uYmVhbi5KYXJGaWxlV3JpdGVyOwotCi1pbXBvcnQgamF2YXguc3dpbmcuKjsKLWltcG9ydCBqYXZhLmF3dC4qOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LldpbmRvd0FkYXB0ZXI7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuV2luZG93RXZlbnQ7Ci1pbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuVGltZXJUYXNrOwotCi0vKioKLSAqIHdpemFyZEZyYW1lIGNsYXNzCi0gKi8KLXB1YmxpYyBjbGFzcyBXaXphcmRGcmFtZSBleHRlbmRzIEpGcmFtZSB7Ci0gICAgIC8qKgotICAgICAqIHZhcmlhYmxlCi0gICAgICovCi0KLSAgICBwcml2YXRlIEpMYWJlbCBwYW5lbEltYWdlTGFiZWw7Ci0gICAgcHJpdmF0ZSBKTGFiZWwgcGFuZWxUb3BUaXRsZUxhYmVsOwotICAgIHByaXZhdGUgSkxhYmVsIHBhbmVsQm90dG9tVGl0bGVMYWJlbDsKLSAgICBwcml2YXRlIFdpemFyZENvbXBvbmVudHMgd2l6YXJkQ29tcG9uZW50czsKLSAgICBwcm90ZWN0ZWQgV3NkbGdlbkJlYW4gd3NkbGdlbkJlYW47Ci0gICAgcHJvdGVjdGVkIENvZGVnZW5CZWFuIGNvZGVnZW5CZWFuOwotICAgIHByb3RlY3RlZCBBcmNoaXZlQmVhbiBhcmNoaXZlQmVhbjsKLSAgICBwcm90ZWN0ZWQgUHJvamVjdCBwcm9qZWN0OwotICAgIHByaXZhdGUgUHJvZ3Jlc3NCYXJQYW5lbCBwcm9ncmVzczsKLQotICAgIHB1YmxpYyBXaXphcmRGcmFtZSgpIHsKLSAgICAgICAgaW5pdCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbml0KCkgewotCi0gICAgICAgIHdpemFyZENvbXBvbmVudHMgPSBuZXcgRGVmYXVsdFdpemFyZENvbXBvbmVudHMoKTsKLSAgICAgICAgd3NkbGdlbkJlYW49IG5ldyBXc2RsZ2VuQmVhbigpOwotICAgICAgICBjb2RlZ2VuQmVhbiA9IG5ldyBDb2RlZ2VuQmVhbigpOwotICAgICAgICBhcmNoaXZlQmVhbiA9bmV3IEFyY2hpdmVCZWFuKCk7Ci0KLQotICAgICAgICB0aGlzLmdldENvbnRlbnRQYW5lKCkuc2V0TGF5b3V0KG5ldyBHcmlkQmFnTGF5b3V0KCkpOwotICAgICAgICB0aGlzLmdldENvbnRlbnRQYW5lKCkuYWRkKGNyZWF0ZVRpdGxlUGFuZWwoKQotICAgICAgICAgICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygwLCAwLCAxLCAxLCAxLjAsIDAuMAotICAgICAgICAgICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLk5PUlRILCBHcmlkQmFnQ29uc3RyYWludHMuSE9SSVpPTlRBTAotICAgICAgICAgICAgICAgICwgbmV3IEluc2V0cygwLCAwLCAwLCAwKSwgMCwgMCkpOwotCi0gICAgICAgIHRoaXMuZ2V0Q29udGVudFBhbmUoKS5hZGQobmV3IEpTZXBhcmF0b3IoKQotICAgICAgICAgICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygwLCAxLCAxLCAxLCAxLjAsIDAuMAotICAgICAgICAgICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLkNFTlRFUiwgR3JpZEJhZ0NvbnN0cmFpbnRzLkhPUklaT05UQUwsCi0gICAgICAgICAgICAgICAgbmV3IEluc2V0cygwLCAwLCAwLCAwKSwgMCwgMCkpOwotCi0gICAgICAgIHRoaXMuZ2V0Q29udGVudFBhbmUoKS5hZGQod2l6YXJkQ29tcG9uZW50cy5nZXRXaXphcmRQYW5lbHNDb250YWluZXIoKQotICAgICAgICAgICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygwLCAyLCAxLCAxLCAxLjAsIDEuMAotICAgICAgICAgICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLk5PUlRIV0VTVCAsIEdyaWRCYWdDb25zdHJhaW50cy5CT1RICi0gICAgICAgICAgICAgICAgLCBuZXcgSW5zZXRzKDEwLCAwLCAwLCAwKSwgMCwgMCkpOwotCi0gICAgICAgIHByb2dyZXNzID1uZXcgUHJvZ3Jlc3NCYXJQYW5lbCgpOwotICAgICAgICB0aGlzLmdldENvbnRlbnRQYW5lKCkuYWRkKHByb2dyZXNzCi0gICAgICAgICAgICAgICAgLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDAsIDMsIDEsIDEsIDEuMCwgMC4wCi0gICAgICAgICAgICAgICAgLCBHcmlkQmFnQ29uc3RyYWludHMuQ0VOVEVSLCBHcmlkQmFnQ29uc3RyYWludHMuSE9SSVpPTlRBTAotICAgICAgICAgICAgICAgICwgbmV3IEluc2V0cygwLCAwLCAwLCAwKSwgMCwgMCkpOwotCi0gICAgICAgIHRoaXMuZ2V0Q29udGVudFBhbmUoKS5hZGQobmV3IEpTZXBhcmF0b3IoKQotICAgICAgICAgICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygwLCA0LCAxLCAxLCAxLjAsIDAuMAotICAgICAgICAgICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLkNFTlRFUiwgR3JpZEJhZ0NvbnN0cmFpbnRzLkhPUklaT05UQUwKLSAgICAgICAgICAgICAgICAsIG5ldyBJbnNldHMoMSwgMSwgMSwgMSksIDAsIDApKTsKLQotICAgICAgICB0aGlzLmdldENvbnRlbnRQYW5lKCkuYWRkKGNyZWF0ZUJ1dHRvblBhbmVsKCksCi0gICAgICAgICAgICAgICAgbmV3IEdyaWRCYWdDb25zdHJhaW50cygwLCA1LCAxLCAxLCAxLjAsIDAuMAotICAgICAgICAgICAgICAgICAgICAgICAgLEdyaWRCYWdDb25zdHJhaW50cy5FQVNULCBHcmlkQmFnQ29uc3RyYWludHMuTk9ORSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBJbnNldHMoMTAsIDEwLCAxMCwgMTApLCAwLCAwKSk7Ci0KLSAgICAgICAgamF2YS5uZXQuVVJMIHJlc291cmNlID0gV2l6YXJkUGFuZWwuY2xhc3MuZ2V0UmVzb3VyY2UoIi9pY29ucy9pY29uLnBuZyIpOyAgICAgICAgICAgCi0gICAgICAgIHRoaXMuc2V0SWNvbkltYWdlKG5ldyBJbWFnZUljb24ocmVzb3VyY2UpLmdldEltYWdlKCkpOwotICAgICAgICB0aGlzLnNldEZvbnQobmV3IEZvbnQoIkhlbHZldGljYSIsIEZvbnQuUExBSU4sIDgpKTsKLQotICAgICAgICB3aXphcmRDb21wb25lbnRzLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgc2V0UGFuZWxUb3BUaXRsZSgoKFdpemFyZFBhbmVsKWV2ZW50LmdldE5ld1ZhbHVlKCkpLmdldFBhbmVsVG9wVGl0bGUoKSk7Ci0gICAgICAgICAgICAgICAgc2V0UGFuZWxUaXRsZUltYWdlKCgoV2l6YXJkUGFuZWwpZXZlbnQuZ2V0TmV3VmFsdWUoKSkuZ2V0UGFuZWxJbWFnZSgpKTsKLSAgICAgICAgICAgICAgICBzZXRQYW5lbEJvdHRvbVRpdGxlKCgoV2l6YXJkUGFuZWwpZXZlbnQuZ2V0TmV3VmFsdWUoKSkuZ2V0UGFuZWxCb3R0b21UaXRsZSgpKTsKLSAgICAgICAgICAgICAgICBzZXRUaXRsZSgoKFdpemFyZFBhbmVsKWV2ZW50LmdldE5ld1ZhbHVlKCkpLmdldEZyYW1lVGl0bGUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICB3aXphcmRDb21wb25lbnRzLnNldEZpbmlzaEFjdGlvbihjcmVhdGVGaW5pc2hBY3Rpb24oKSk7Ci0gICAgICAgIHdpemFyZENvbXBvbmVudHMuc2V0Q2FuY2VsQWN0aW9uKGNyZWF0ZUNhbmNlbEFjdGlvbigpKTsKLSAgICAgICAgaGFuZGxlV2luZG93Q2xvc2luZygpOwotICAgIH0KLQotICAgIHB1YmxpYyBXaXphcmRDb21wb25lbnRzIGdldFdpemFyZENvbXBvbmVudHMoKXsKLSAgICAgICAgcmV0dXJuIHdpemFyZENvbXBvbmVudHM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0V2l6YXJkQ29tcG9uZW50cyhXaXphcmRDb21wb25lbnRzIGFXaXphcmRDb21wb25lbnRzKXsKLSAgICAgICAgd2l6YXJkQ29tcG9uZW50cyA9IGFXaXphcmRDb21wb25lbnRzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNob3coKSB7Ci0gICAgICAgIHdpemFyZENvbXBvbmVudHMudXBkYXRlQ29tcG9uZW50cygpOwotICAgICAgICB0aGlzLnNldFNpemUoNjAwLDYwMCk7Ci0gICAgICAgIFV0aWxpdGllcy5jZW50ZXJDb21wb25lbnRPblNjcmVlbih0aGlzKTsKLSAgICAgICAgc3VwZXIuc2hvdygpOwotICAgIH0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRCb3R0b21WaXNpYmxlKGJvb2xlYW4gZmxhZyl7Ci0gICAgICAgIHBhbmVsQm90dG9tVGl0bGVMYWJlbC5zZXRWaXNpYmxlKGZsYWcpOwotICAgIH0KLSAgICAvL1NldCBUaXRsZSBQYW5lbAotICAgIHByb3RlY3RlZCB2b2lkIHNldFBhbmVsVG9wVGl0bGUoU3RyaW5nIHRpdGxlKSB7Ci0gICAgICAgIHBhbmVsVG9wVGl0bGVMYWJlbC5zZXRUZXh0KHRpdGxlKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRQYW5lbEJvdHRvbVRpdGxlKFN0cmluZyB0aXRsZSkgewotICAgICAgICBwYW5lbEJvdHRvbVRpdGxlTGFiZWwuc2V0VGV4dCh0aXRsZSk7Ci0gICAgfQotICAgIC8vIHNldCB0aXRsZSBpbWFnZQotICAgIHByb3RlY3RlZCB2b2lkIHNldFBhbmVsVGl0bGVJbWFnZShJbWFnZUljb24gaW1hZ2UpewotICAgICAgICBwYW5lbEltYWdlTGFiZWwuc2V0SWNvbihpbWFnZSApOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBKUGFuZWwgY3JlYXRlVGl0bGVQYW5lbCgpIHsKLQotICAgICAgICBKUGFuZWwgcGFuZWwgPSBuZXcgSlBhbmVsKG5ldyBHcmlkQmFnTGF5b3V0KCkgKTsKLQotICAgICAgICBwYW5lbC5zZXRCYWNrZ3JvdW5kKENvbG9yLndoaXRlICk7Ci0KLSAgICAgICAgcGFuZWxUb3BUaXRsZUxhYmVsID0gbmV3IEpMYWJlbCgpOwotICAgICAgICBwYW5lbFRvcFRpdGxlTGFiZWwuc2V0Rm9udChuZXcgRm9udCgiSGVsdmV0aWNhIiwgRm9udC5CT0xELCAxMikpOwotCi0gICAgICAgIHBhbmVsQm90dG9tVGl0bGVMYWJlbD1uZXcgSkxhYmVsKCk7Ci0gICAgICAgIHBhbmVsQm90dG9tVGl0bGVMYWJlbC5zZXRGb250KG5ldyBGb250KCJIZWx2ZXRpY2EiLCBGb250LklUQUxJQywgMTApKTsKLQotICAgICAgICBwYW5lbEltYWdlTGFiZWw9IG5ldyBKTGFiZWwoKTsKLQotICAgICAgICBwYW5lbC5hZGQocGFuZWxUb3BUaXRsZUxhYmVsCi0gICAgICAgICAgICAgICAgLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDAsIDAsIDEsIDEsIDAuNSwgMC4wCi0gICAgICAgICAgICAgICAgLCBHcmlkQmFnQ29uc3RyYWludHMuTElORV9TVEFSVCAsIEdyaWRCYWdDb25zdHJhaW50cy5CT1RICi0gICAgICAgICAgICAgICAgLCBuZXcgSW5zZXRzKDEwLCAyMCwgMCwgMCksIDAsIDApKTsKLQotICAgICAgICBwYW5lbC5hZGQocGFuZWxCb3R0b21UaXRsZUxhYmVsCi0gICAgICAgICAgICAgICAgLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDAsIDEsIDEsIDEsIDAuNSwgMC4wCi0gICAgICAgICAgICAgICAgLCBHcmlkQmFnQ29uc3RyYWludHMuTElORV9TVEFSVCwgR3JpZEJhZ0NvbnN0cmFpbnRzLkJPVEgKLSAgICAgICAgICAgICAgICAsIG5ldyBJbnNldHMoMTAsMjAsIDAsIDApLCAwLCAwKSk7Ci0KLSAgICAgICAgcGFuZWwuYWRkKHBhbmVsSW1hZ2VMYWJlbAotICAgICAgICAgICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygxLCAwLCAxLDIsIDAuMCwgMC4wCi0gICAgICAgICAgICAgICAgLCBHcmlkQmFnQ29uc3RyYWludHMuQ0VOVEVSLCBHcmlkQmFnQ29uc3RyYWludHMuQk9USAotICAgICAgICAgICAgICAgICwgbmV3IEluc2V0cygwLCAwLCAwLCAwKSwgMCwgMCkpOwotCi0gICAgICAgIHJldHVybiBwYW5lbDsKLQotICAgIH0KLSAgICBwcm90ZWN0ZWQgSlBhbmVsIGNyZWF0ZUJ1dHRvblBhbmVsKCkgewotICAgICAgICBKUGFuZWwgcGFuZWwgPSBuZXcgSlBhbmVsKG5ldyBHcmlkTGF5b3V0KCkpOwotICAgICAgICBwYW5lbC5hZGQod2l6YXJkQ29tcG9uZW50cy5nZXRCYWNrQnV0dG9uKCkpOwotICAgICAgICBwYW5lbC5hZGQod2l6YXJkQ29tcG9uZW50cy5nZXROZXh0QnV0dG9uKCkpOwotICAgICAgICBwYW5lbC5hZGQod2l6YXJkQ29tcG9uZW50cy5nZXRGaW5pc2hCdXR0b24oKSk7Ci0gICAgICAgIHBhbmVsLmFkZCh3aXphcmRDb21wb25lbnRzLmdldENhbmNlbEJ1dHRvbigpKTsKLSAgICAgICAgcmV0dXJuIHBhbmVsOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBGaW5pc2hBY3Rpb24gY3JlYXRlRmluaXNoQWN0aW9uKCkgewotICAgICAgICByZXR1cm4gbmV3IEZpbmlzaEFjdGlvbih3aXphcmRDb21wb25lbnRzKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBwZXJmb3JtQWN0aW9uKCkgewotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRmluaXNoQWN0aW9uIHBlcmZvcm1lZCIpOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHdpemFyZENvbXBvbmVudHMuZ2V0Q3VycmVudFBhbmVsKCkudXBkYXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAod2l6YXJkQ29tcG9uZW50cy5nZXRDdXJyZW50UGFuZWwoKS5nZXRQYWdlVHlwZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFdpemFyZFBhbmVsIC5XU0RMXzJfSkFWQV9UWVBFOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvRmluaXNoV1NETDJKYXZhKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJGaW5pc2hBY3Rpb24gIFdTREwySmF2YSBwZXJmb3JtZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgV2l6YXJkUGFuZWwuSkFWQV8yX1dTRExfVFlQRToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb0ZpbmlzaEphdmEyV1NETCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRmluaXNoQWN0aW9uIEphdmEyV1NETCBwZXJmb3JtZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFdpemFyZFBhbmVsLlNFUlZJQ0VfQVJDSElWRV9UWVBFOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvRmluaXNoU2VydmljZUFyY2hpdmUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkZpbmlzaEFjdGlvbiBTZXJ2Y2llIEFyY2hpdmUgcGVyZm9ybWVkIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFdpemFyZFBhbmVsLlVOU1BFQ0lGSUVEX1RZUEU6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7IC8vRG8gbm90aGluZwotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiSW52YWxpZCBzdGF0ZSEiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICB3aXphcmRDb21wb25lbnRzLnNldEN1cnJlbnRJbmRleChDb2RlZ2VuRnJhbWUuUEFORUxfQ0hPT1NFUik7Ci0gICAgICAgICAgICAgICAgICAgICBkaXNwb3NlKCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIENhbmNlbEFjdGlvbiBjcmVhdGVDYW5jZWxBY3Rpb24oKSB7Ci0gICAgICAgIHJldHVybiBuZXcgQ2FuY2VsQWN0aW9uKHdpemFyZENvbXBvbmVudHMpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHBlcmZvcm1BY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgd2l6YXJkQ29tcG9uZW50cy5zZXRDdXJyZW50SW5kZXgoQ29kZWdlbkZyYW1lLlBBTkVMX0NIT09TRVIpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ2FuY2VsQWN0aW9uIHBlcmZvcm1lZCIpOwotICAgICAgICAgICAgICAgIGRpc3Bvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVXaW5kb3dDbG9zaW5nKCkgewotICAgICAgICB3aXphcmRDb21wb25lbnRzLnNldEN1cnJlbnRJbmRleChDb2RlZ2VuRnJhbWUuUEFORUxfQ0hPT1NFUik7Ci0gICAgICAgIHRoaXMuc2V0RGVmYXVsdENsb3NlT3BlcmF0aW9uKFdpbmRvd0NvbnN0YW50cy5ET19OT1RISU5HX09OX0NMT1NFKTsKLSAgICAgICAgdGhpcy5hZGRXaW5kb3dMaXN0ZW5lcihuZXcgV2luZG93QWRhcHRlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpbmRvd0Nsb3NpbmcoV2luZG93RXZlbnQgZSkgewotICAgICAgICAgICAgICAgIHdpemFyZENvbXBvbmVudHMuZ2V0Q2FuY2VsQWN0aW9uKCkucGVyZm9ybUFjdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVQcmFncmVzcygpewotICAgICAgICB3aXphcmRDb21wb25lbnRzLmdldEZpbmlzaEJ1dHRvbigpLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICBwcm9ncmVzcy5zZXRWaXNpYmxlKHRydWUpOwotICAgICAgICBwcm9ncmVzcy5hYm91dFRvRGlzcGxheVBhbmVsKCk7Ci0gICAgICAgIHByb2dyZXNzLmRpc3BsYXlpbmdQYW5lbCgpOwotICAgICAgICBuZXcgamF2YS51dGlsLlRpbWVyKHRydWUpLnNjaGVkdWxlKG5ldyBUaW1lclRhc2soKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgcHJvZ3Jlc3MucmVxdWVzdFN0b3AoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSwgMTAwMCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlU3VjY2VzcygpewotICAgICAgICBTdHJpbmdXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgICAgICBKT3B0aW9uUGFuZS5zaG93TWVzc2FnZURpYWxvZyh0aGlzICwKLSAgICAgICAgICAgICAgICAiQ29kZSBnZW5hcmF0aW9uIFN1Y2Nlc3NmdWwgISIgKyB3cml0ZXIudG9TdHJpbmcoKSwKLSAgICAgICAgICAgICAgICAiQXhpczIgY29kZSBnZW5lcmF0aW9uIiwKLSAgICAgICAgICAgICAgICBKT3B0aW9uUGFuZS5JTkZPUk1BVElPTl9NRVNTQUdFICk7Ci0gICAgICAgIHdpemFyZENvbXBvbmVudHMuc2V0Q3VycmVudEluZGV4KENvZGVnZW5GcmFtZS5QQU5FTF9DSE9PU0VSKTsKLSAgICAgICAgZGlzcG9zZSgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZUVycm9yKCl7Ci0gICAgICAgIHdpemFyZENvbXBvbmVudHMuZ2V0RmluaXNoQnV0dG9uKCkuc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgU3RyaW5nV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICAgICAgSk9wdGlvblBhbmUuc2hvd01lc3NhZ2VEaWFsb2codGhpcyAsCi0gICAgICAgICAgICAgICAgIkNvZGUgZ2VuYXJhdGlvbiBmYWlsZWQhICEiICsgd3JpdGVyLnRvU3RyaW5nKCksCi0gICAgICAgICAgICAgICAgIkF4aXMyIGNvZGUgZ2VuZXJhdGlvbiIsCi0gICAgICAgICAgICAgICAgSk9wdGlvblBhbmUuRVJST1JfTUVTU0FHRSApOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGRMaWJzVG9Qcm9qZWN0TGliKFN0cmluZyBsaWJEaXJlY3RvcnksIFN0cmluZyBvdXRwdXRMb2NhdGlvbil7Ci0gICAgICAgIFN0cmluZyBuZXdPdXRwdXRMb2NhdGlvbiA9IG91dHB1dExvY2F0aW9uK0ZpbGUuc2VwYXJhdG9yKyJsaWIiOwotICAgICAgICAvL0NyZWF0ZSBhIGxpYiBkaXJlY3Rvcnk7IGFsbCBhbmNlc3RvciBkaXJlY3RvcmllcyBtdXN0IGV4aXN0Ci0gICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9IChuZXcgRmlsZShuZXdPdXRwdXRMb2NhdGlvbikpLm1rZGlyKCk7Ci0gICAgICAgIGlmICghc3VjY2VzcykgewotICAgICAgICAgICAgLy8gRGlyZWN0b3J5IGNyZWF0aW9uIGZhaWxlZAotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjb3B5RGlyZWN0b3J5KG5ldyBGaWxlKGxpYkRpcmVjdG9yeSksbmV3IEZpbGUobmV3T3V0cHV0TG9jYXRpb24pKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIENvcGllcyBhbGwgZmlsZXMgdW5kZXIgc3JjRGlyIHRvIGRzdERpci4KLSAgICAvLyBJZiBkc3REaXIgZG9lcyBub3QgZXhpc3QsIGl0IHdpbGwgYmUgY3JlYXRlZC4KLQotICAgIHB1YmxpYyB2b2lkIGNvcHlEaXJlY3RvcnkoRmlsZSBzcmNEaXIsIEZpbGUgZHN0RGlyKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBpZiAoc3JjRGlyLmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgIGlmICghZHN0RGlyLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgZHN0RGlyLm1rZGlyKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0cmluZ1tdIGNoaWxkcmVuID0gc3JjRGlyLmxpc3QoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGNvcHlEaXJlY3RvcnkobmV3IEZpbGUoc3JjRGlyLCBjaGlsZHJlbltpXSksCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZShkc3REaXIsIGNoaWxkcmVuW2ldKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjb3B5RmlsZShzcmNEaXIsIGRzdERpcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBDb3BpZXMgc3JjIGZpbGUgdG8gZHN0IGZpbGUuCi0gICAgLy8gSWYgdGhlIGRzdCBmaWxlIGRvZXMgbm90IGV4aXN0LCBpdCBpcyBjcmVhdGVkCi0gICAgcHJpdmF0ZSB2b2lkIGNvcHlGaWxlKEZpbGUgc3JjLCBGaWxlIGRzdCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgSW5wdXRTdHJlYW0gaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKHNyYyk7Ci0gICAgICAgIE91dHB1dFN0cmVhbSBvdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShkc3QpOwotCi0gICAgICAgIC8vIFRyYW5zZmVyIGJ5dGVzIGZyb20gaW4gdG8gb3V0Ci0gICAgICAgIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVsxMDI0XTsKLSAgICAgICAgaW50IGxlbjsKLSAgICAgICAgd2hpbGUgKChsZW4gPSBpbi5yZWFkKGJ1ZikpID4gMCkgewotICAgICAgICAgICAgb3V0LndyaXRlKGJ1ZiwgMCwgbGVuKTsKLSAgICAgICAgfQotICAgICAgICBpbi5jbG9zZSgpOwotICAgICAgICBvdXQuY2xvc2UoKTsKLSAgICB9Ci0KLSAgICAvLyBEZWxldGVzIGFsbCBmaWxlcyBhbmQgc3ViZGlyZWN0b3JpZXMgdW5kZXIgZGlyLgotICAgIC8vIFJldHVybnMgdHJ1ZSBpZiBhbGwgZGVsZXRpb25zIHdlcmUgc3VjY2Vzc2Z1bC4KLSAgICAvLyBJZiBhIGRlbGV0aW9uIGZhaWxzLCB0aGUgbWV0aG9kIHN0b3BzIGF0dGVtcHRpbmcgdG8gZGVsZXRlIGFuZCByZXR1cm5zIGZhbHNlLgotICAgIHByaXZhdGUgYm9vbGVhbiBkZWxldGVEaXIoRmlsZSBkaXIpIHsKLSAgICAgICAgaWYgKGRpci5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICBTdHJpbmdbXSBjaGlsZHJlbiA9IGRpci5saXN0KCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8Y2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSBkZWxldGVEaXIobmV3IEZpbGUoZGlyLCBjaGlsZHJlbltpXSkpOwotICAgICAgICAgICAgICAgIGlmICghc3VjY2VzcykgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVGhlIGRpcmVjdG9yeSBpcyBub3cgZW1wdHkgc28gZGVsZXRlIGl0Ci0gICAgICAgIHJldHVybiBkaXIuZGVsZXRlKCk7Ci0gICAgfQotICAgIHByb3RlY3RlZCB2b2lkIGRvRmluaXNoV1NETDJKYXZhKCl7Ci0gICAgICAgIGhhbmRsZVByYWdyZXNzKCk7Ci0gICAgICAgbmV3IGphdmEudXRpbC5UaW1lcih0cnVlKS5zY2hlZHVsZShuZXcgVGltZXJUYXNrKCkgewotICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgRmlyc3RQYW5lbCAgZmlyc3Q9KEZpcnN0UGFuZWwpd2l6YXJkQ29tcG9uZW50cy5nZXRXaXphcmRQYW5lbCgxKTsKLSAgICAgICAgICAgICAgICAgICAgU2Vjb25kUGFuZWwgb3B0aW9uPShTZWNvbmRQYW5lbCl3aXphcmRDb21wb25lbnRzLmdldFdpemFyZFBhbmVsKDMpOwotICAgICAgICAgICAgICAgICAgICBXU0RMMkphdmFPdXRwdXRQYW5lbCBvdXRwdXQ9KFdTREwySmF2YU91dHB1dFBhbmVsKXdpemFyZENvbXBvbmVudHMuZ2V0V2l6YXJkUGFuZWwoNSk7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNTZXJ2ZXJzaWRlLGlzU2VydmljZVhNTCxpc0dlbmVyYXRlU2VydmVyU2lkZUludGVyZmFjZSAgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbi5nZXRHZW5lcmF0ZUFsbCgpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlzU2VydmVyc2lkZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpc1NlcnZpY2VYTUwgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgaXNHZW5lcmF0ZVNlcnZlclNpZGVJbnRlcmZhY2UgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlzU2VydmVyc2lkZSA9IG9wdGlvbi5pc1NlcnZlcnNpZGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlzU2VydmljZVhNTCA9b3B0aW9uLmlzU2VydmVyWE1MKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpc0dlbmVyYXRlU2VydmVyU2lkZUludGVyZmFjZSA9IG9wdGlvbi5nZXRHZW5lcmF0ZVNlcnZlclNpZGVJbnRlcmZhY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjb2RlZ2VuQmVhbi5zZXRQYWNrYWdlTmFtZShvcHRpb24uZ2V0UGFja2FnZU5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvZGVnZW5CZWFuLnNldExhbmd1YWdlKG9wdGlvbi5nZXRTZWxlY3RlZExhbmd1YWdlKCkpOwotICAgICAgICAgICAgICAgICAgICBjb2RlZ2VuQmVhbi5zZXRQb3J0TmFtZShvcHRpb24uZ2V0UG9ydE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvZGVnZW5CZWFuLnNldFNlcnZpY2VOYW1lKG9wdGlvbi5nZXRTZXJ2aWNlTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgY29kZWdlbkJlYW4uc2V0RGF0YWJpbmRpbmdOYW1lKG9wdGlvbi5nZXREYXRhYmluZGVyTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgY29kZWdlbkJlYW4uc2V0QXN5bmNPbmx5KG9wdGlvbi5pc0FzeW5jT25seU9uKCkpOwotICAgICAgICAgICAgICAgICAgICBjb2RlZ2VuQmVhbi5zZXRTeW5jT25seShvcHRpb24uaXNTeW5jT25seU9uKCkpOwotICAgICAgICAgICAgICAgICAgICBjb2RlZ2VuQmVhbi5zZXRUZXN0Q2FzZShvcHRpb24uaXNHZW5lcmF0ZVRlc3RDYXNlKCkpOwotICAgICAgICAgICAgICAgICAgICBjb2RlZ2VuQmVhbi5zZXRHZW5lcmF0ZUFsbChvcHRpb24uZ2V0R2VuZXJhdGVBbGwoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvZGVnZW5CZWFuLnNldFNlcnZlclhNTChpc1NlcnZpY2VYTUwpOwotICAgICAgICAgICAgICAgICAgICBjb2RlZ2VuQmVhbi5zZXRTZXJ2ZXJTaWRlKGlzU2VydmVyc2lkZSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvZGVnZW5CZWFuLnNldFNlcnZlclNpZGVJbnRlcmZhY2UoaXNHZW5lcmF0ZVNlcnZlclNpZGVJbnRlcmZhY2UpOwotICAgICAgICAgICAgICAgICAgICBjb2RlZ2VuQmVhbi5zZXRPdXRwdXQob3V0cHV0LmdldE91dHB1dExvY2F0aW9uKCkpOwotICAgICAgICAgICAgICAgICAgICBjb2RlZ2VuQmVhbi5zZXROYW1lc3BhY2UycGFja2FnZUxpc3Qob3B0aW9uLmdldE5zMlBrZ01hcHBpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvZGVnZW5CZWFuLnNldFdTRExGaWxlTmFtZShmaXJzdC5nZXRXU0RMRmlsZU5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvZGVnZW5CZWFuLmdlbmVyYXRlKCk7ICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgLy9BZGQgdGhlIGNvZGVnZW4gbGlicyB0aGF0IGFyZSBjb21pbmcgd2l0aCB0aGUgcGx1Z2luIHRvIHRoZSBwcm9qZWN0IGxpYiB0aGF0IGhhcyBiZWVuIGNyZWF0ZWQKLSAgICAgICAgICAgICAgICAgaWYgKG91dHB1dC5nZXRBeGlzMlBsdWdpbkxpYkNvcHlDaGVja0JveFNlbGVjdGlvbigpKXsKLSAgICAgICAgICAgICAgICAgICAgIGphdmEubmV0LlVSTCByZXNvdXJjZSA9IFdpemFyZFBhbmVsLmNsYXNzLmdldFJlc291cmNlKCIvaWNvbnMvaWNvbi5wbmciKTsKLSAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXRoID1uZXcgRmlsZShyZXNvdXJjZS5nZXRQYXRoKCkpLmdldFBhcmVudEZpbGUoKS5nZXRQYXJlbnRGaWxlKCkuZ2V0UGFyZW50RmlsZSgpLmdldFBhdGgoKTsKLSAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihwYXRoKTsKLSAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwbHVnaW5MaWJMb2NhdGlvbiA9IHBhdGgrRmlsZS5zZXBhcmF0b3IrImxpYiI7Ci0gICAgICAgICAgICAgICAgCSBhZGRMaWJzVG9Qcm9qZWN0TGliKHBsdWdpbkxpYkxvY2F0aW9uLCBvdXRwdXQuZ2V0T3V0cHV0TG9jYXRpb24oKSk7Ci0gICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAvL0FkZCB0aGUgbGlicmFyaWVzIG9uIHRoZSBwbHVnaW4gbGliIGRpcmVjdG9yeSB0byB0aGUgY3JlYXRlZCBwcm9qZWN0IGxpYgotICAgICAgICAgICAgICAgICBpZiAob3V0cHV0LmdldEF4aXNMaWJDb3B5Q2hlY2tCb3hTZWxlY3Rpb24oKSAmJiBvdXRwdXQub2t0b0xvYWRMaWJzKCkpewotICAgICAgICAgICAgICAgIAkgU3RyaW5nIGxpYkRpcmVjdG9yeSA9IG91dHB1dC5nZXRBeGlzSmFyc0xvY2F0aW9uKCk7Ci0gICAgICAgICAgICAgICAgCSBhZGRMaWJzVG9Qcm9qZWN0TGliKGxpYkRpcmVjdG9yeSwgb3V0cHV0LmdldE91dHB1dExvY2F0aW9uKCkpOwotICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgLy9UaGlzIHdpbGwgQ3JlYXRlIGEgamFyIGZpbGUgZnJvbSB0aGUgY29kZWdlbiByZXN1bHRzIGFuZCBhZGQgdG8gdGhlIG91dHB1dAotICAgICAgICAgICAgICAgICAvL2xvY2F0aW9ucyBsaWIgZGlyZWN0b3J5Ci0gICAgICAgICAgICAgICAgIGlmIChvdXRwdXQuZ2V0Q3JlYXRlSmFyQ2hlY2tCb3hTZWxlY3Rpb24oKSl7Ci0gICAgICAgICAgICAgICAgICAgICBGaWxlIHRlbXBDbGFzc0ZpbGU9Y29kZWdlbkJlYW4uZ2V0VGVtcCgpOwotICAgICAgICAgICAgICAgICAgICAgdGVtcENsYXNzRmlsZS5ta2RpcigpOwotICAgICAgICAgICAgICAgICAgICAgRmlsZSBzcmNUZW1wPW5ldyBGaWxlKHRlbXBDbGFzc0ZpbGUuZ2V0UGF0aCgpK0ZpbGUuc2VwYXJhdG9yKyJzcmMiKTsKLSAgICAgICAgICAgICAgICAgICAgIHNyY1RlbXAubWtkaXIoKTsKLSAgICAgICAgICAgICAgICAgICAgIGNvcHlEaXJlY3RvcnkobmV3IEZpbGUob3V0cHV0LmdldE91dHB1dExvY2F0aW9uKCkrRmlsZS5zZXBhcmF0b3IrInNyYyIpLHNyY1RlbXApOwotICAgICAgICAgICAgICAgICAgICAgLy9Db21waWxlIHRoZSBzb3VyY2UgdG8gYW5vdGhlciBkaXJlY3RvcnkKLSAgICAgICAgICAgICAgICAJIFNyY0NvbXBpbGVyIHNyY0NvbXBpbGVUb29sID0gbmV3IFNyY0NvbXBpbGVyKCk7Ci0gICAgICAgICAgICAgICAgCSBzcmNDb21waWxlVG9vbC5jb21waWxlU291cmNlKHRlbXBDbGFzc0ZpbGUuZ2V0UGF0aCgpKTsKLSAgICAgICAgICAgICAgICAgICAgIC8vY3JlYXRlIHRoZSBqYXIgZmlsZSBhbmQgYWRkIHRoYXQgdG8gdGhlIGxpYiBkaXJlY3RvcnkKLSAgICAgICAgICAgICAgICAJIFN0cmluZyBwcm9qZWN0TGliID0gb3V0cHV0LmdldE91dHB1dExvY2F0aW9uKCkrRmlsZS5zZXBhcmF0b3IrImxpYiI7Ci0gICAgICAgICAgICAgICAgCSBKYXJGaWxlV3JpdGVyIGphckZpbGVXcml0ZXIgPSBuZXcgSmFyRmlsZVdyaXRlcigpOwotICAgICAgICAgICAgICAgIAkgU3RyaW5nIGphckZpbGVOYW1lID0gIkNvZGVnZW5SZXN1bHRzLmphciI7Ci0gICAgICAgICAgICAgICAgCSBpZiAoIW91dHB1dC5nZXRKYXJGaWxlbmFtZSgpLmVxdWFscygiIikpewotICAgICAgICAgICAgICAgIAkJIGphckZpbGVOYW1lPW91dHB1dC5nZXRKYXJGaWxlbmFtZSgpOwotICAgICAgICAgICAgICAgIAkgfQotICAgICAgICAgICAgICAgIAkgb3V0cHV0LnNldEphckZpbGVOYW1lKGphckZpbGVOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICBGaWxlIHRlbXBDbGFzcyA9IG5ldyBGaWxlKHRlbXBDbGFzc0ZpbGUuZ2V0UGF0aCgpK0ZpbGUuc2VwYXJhdG9yKyJjbGFzc2VzIik7Ci0gICAgICAgICAgICAgICAgICAgICBqYXJGaWxlV3JpdGVyLndyaXRlSmFyRmlsZShuZXcgRmlsZShwcm9qZWN0TGliKSwgamFyRmlsZU5hbWUsIHRlbXBDbGFzcyk7Ci0KLSAgICAgICAgICAgICAgICAJIC8vRGVsZXRlIHRoZSB0ZW1wIGZvbGRlcnMKLSAgICAgICAgICAgICAgICAJIGRlbGV0ZURpcih0ZW1wQ2xhc3NGaWxlICk7Ci0KLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwcm9ncmVzcy5zZXRWaXNpYmxlKGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlU3VjY2VzcygpOwotICAgICAgICAgICAgICAgIH1jYXRjaCAoRXhjZXB0aW9uIGUxKSB7Ci0gICAgICAgICAgICAgICAgICAgIGUxLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgICAgICAgICBwcm9ncmVzcy5zZXRWaXNpYmxlKGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlRXJyb3IoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0sIDUwMDApOwotCi0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9GaW5pc2hKYXZhMldTREwoKXsKLSAgICAgICAgaGFuZGxlUHJhZ3Jlc3MoKTsKLSAgICAgICAgbmV3IGphdmEudXRpbC5UaW1lcih0cnVlKS5zY2hlZHVsZShuZXcgVGltZXJUYXNrKCkgewotICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgd3NkbGdlbkJlYW4uZ2VuZXJhdGUoKTsKLSAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3Muc2V0VmlzaWJsZShmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZVN1Y2Nlc3MoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZTEpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3Muc2V0VmlzaWJsZShmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZUVycm9yKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgIH0sIDMxMDApOwotICAgIH0KLSAgICAgcHJvdGVjdGVkIHZvaWQgZG9GaW5pc2hTZXJ2aWNlQXJjaGl2ZSgpewotICAgICAgIGhhbmRsZVByYWdyZXNzKCk7Ci0gICAgICAgIG5ldyBqYXZhLnV0aWwuVGltZXIodHJ1ZSkuc2NoZWR1bGUobmV3IFRpbWVyVGFzaygpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgYXJjaGl2ZUJlYW4uZmluc2goKTsKLSAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3Muc2V0VmlzaWJsZShmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZVN1Y2Nlc3MoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZTEpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3Muc2V0VmlzaWJsZShmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZUVycm9yKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9LCAzMTAwKTsKLSAgICB9Ci0gICAgcHVibGljIHZvaWQgc2V0UHJvamVjdChQcm9qZWN0IHByb2plY3QpewotICAgICAgICB0aGlzLnByb2plY3Q9cHJvamVjdDsKLSAgICB9Ci0gICAgcHVibGljIEpDb21wb25lbnQgZ2V0Um9vdENvbXBvbmVudCgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Um9vdFBhbmUoKTsKLSAgICB9Ci0gICAgcHVibGljIHZvaWQgc2hvd1VJKCkgewotICAgICAgICBwYWNrKCk7Ci0gICAgICAgIHRoaXMuc2V0VmlzaWJsZSh0cnVlKTsKLSAgICAgICAgc2hvdygpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaWRlYXBsdWdpbi9iZWFuL0FyY2hpdmVCZWFuLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9pZGVhcGx1Z2luL2JlYW4vQXJjaGl2ZUJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI5N2MyNy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9pZGVhcGx1Z2luL2JlYW4vQXJjaGl2ZUJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuaWRlYXBsdWdpbi5iZWFuOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKLQotcHVibGljIGNsYXNzIEFyY2hpdmVCZWFuIHsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBzaW5nbGVTZXJ2aWNlID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGdlbmVyZXRTZXJ2aWNlRGVzYyA9IGZhbHNlOwotICAgIHByaXZhdGUgQXJyYXlMaXN0IGNsYXNzTG9jYXRpb24gPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgcHJpdmF0ZSBGaWxlIGNsYXNzTG9jOwotICAgIHByaXZhdGUgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXI7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgU2VydmljZVhNTDsKLSAgICBwdWJsaWMgU3RyaW5nIGZpbGVTZXBhcmF0b3IgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImZpbGUuc2VwYXJhdG9yIik7Ci0gICAgcHJpdmF0ZSBBcnJheUxpc3QgbGlicyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBwcml2YXRlIEFycmF5TGlzdCB0ZW1wTGlicyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBwcml2YXRlIEFycmF5TGlzdCB0ZW1wV3NkbHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgcHJpdmF0ZSBBcnJheUxpc3Qgd3NkbHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgb3V0UGF0aDsKLSAgICBwcml2YXRlIFN0cmluZyBhcmNoaXZlTmFtZTsKLSAgICBwcml2YXRlIEFycmF5TGlzdCBzZXJ2aWNlbHNpdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBwcml2YXRlIGJvb2xlYW4gaW5jbHVkZUNsYXNzPWZhbHNlOwotCi0gICAgcHVibGljIEFycmF5TGlzdCBnZXRUZW1wV3NkbHMoKSB7Ci0gICAgICAgIHJldHVybiB0ZW1wV3NkbHM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VGVtcFdzZGxzKEFycmF5TGlzdCB0ZW1wV3NkbHMpIHsKLSAgICAgICAgdGhpcy50ZW1wV3NkbHMgPSB0ZW1wV3NkbHM7Ci0gICAgfQotCi0gICAgcHVibGljIEFycmF5TGlzdCBnZXRUZW1wTGlicygpIHsKLSAgICAgICAgcmV0dXJuIHRlbXBMaWJzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFRlbXBMaWJzKEFycmF5TGlzdCB0ZW1wTGlicykgewotICAgICAgICB0aGlzLnRlbXBMaWJzID0gdGVtcExpYnM7Ci0gICAgfQotCi0gICAgcHVibGljIEZpbGUgZ2V0Q2xhc3NMb2MoKSB7Ci0gICAgICAgIHJldHVybiBjbGFzc0xvYzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc0xvYyhGaWxlIGNsYXNzTG9jKSB7Ci0gICAgICAgIHRoaXMuY2xhc3NMb2MgPSBjbGFzc0xvYzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXJyYXlMaXN0IGdldFNlcnZpY2Vsc2l0KCkgewotICAgICAgICByZXR1cm4gc2VydmljZWxzaXQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkVG9TZXJ2aWNlbHNpdChTZXJ2aWNlT2JqIHNlcnZpY2UpIHsKLSAgICAgICAgZm9yIChpbnQgY291bnQgPTA7Y291bnQ8c2VydmljZWxzaXQuc2l6ZSgpO2NvdW50KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICgoKFNlcnZpY2VPYmopc2VydmljZWxzaXQuZ2V0KGNvdW50KSkuZ2V0U2VydmljZU5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKHNlcnZpY2UuZ2V0U2VydmljZU5hbWUoKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2VydmljZWxzaXQucmVtb3ZlKGNvdW50KTsKLSAgICAgICAgICAgICAgICBzZXJ2aWNlbHNpdC5hZGQoc2VydmljZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgICAgc2VydmljZWxzaXQuYWRkKHNlcnZpY2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzU2luZ2xlU2VydmljZSgpIHsKLSAgICAgICAgcmV0dXJuIHNpbmdsZVNlcnZpY2U7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2luZ2xlU2VydmljZShib29sZWFuIHNpbmdsZVNlcnZpY2UpIHsKLSAgICAgICAgdGhpcy5zaW5nbGVTZXJ2aWNlID0gc2luZ2xlU2VydmljZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0dlbmVyZXRTZXJ2aWNlRGVzYygpIHsKLSAgICAgICAgcmV0dXJuIGdlbmVyZXRTZXJ2aWNlRGVzYzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRHZW5lcmV0U2VydmljZURlc2MoYm9vbGVhbiBnZW5lcmV0U2VydmljZURlc2MpIHsKLSAgICAgICAgdGhpcy5nZW5lcmV0U2VydmljZURlc2MgPSBnZW5lcmV0U2VydmljZURlc2M7Ci0gICAgfQotCi0gICAgcHVibGljIEFycmF5TGlzdCBnZXRDbGFzc0xvY2F0aW9uKCkgewotICAgICAgICByZXR1cm4gY2xhc3NMb2NhdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRDbGFzc0xvY2F0aW9uKEZpbGUgY2xhc3NMb2NhdGlvbikgewotICAgICAgICB0aGlzLmNsYXNzTG9jYXRpb24uYWRkKGNsYXNzTG9jYXRpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmljZVhNTCgpIHsKLSAgICAgICAgcmV0dXJuIFNlcnZpY2VYTUw7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2VydmljZVhNTChTdHJpbmcgc2VydmljZVhNTCkgewotICAgICAgICBTZXJ2aWNlWE1MID0gc2VydmljZVhNTDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXJyYXlMaXN0IGdldExpYnMoKSB7Ci0gICAgICAgIHJldHVybiBsaWJzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZExpYnMoQXJyYXlMaXN0IGxpYnMpIHsKLSAgICAgICAgdGhpcy5saWJzLmFkZEFsbChsaWJzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXJyYXlMaXN0IGdldFdzZGxzKCkgewotICAgICAgICByZXR1cm4gd3NkbHM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkV3NkbHMoRmlsZSB3c2RsKSB7Ci0gICAgICAgIHRoaXMud3NkbHMuYWRkKHdzZGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0T3V0UGF0aCgpIHsKLSAgICAgICAgcmV0dXJuIG91dFBhdGg7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0T3V0UGF0aChTdHJpbmcgb3V0UGF0aCkgewotICAgICAgICB0aGlzLm91dFBhdGggPSBvdXRQYXRoOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXJjaGl2ZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBhcmNoaXZlTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRBcmNoaXZlTmFtZShTdHJpbmcgYXJjaGl2ZU5hbWUpIHsKLSAgICAgICAgdGhpcy5hcmNoaXZlTmFtZSA9IGFyY2hpdmVOYW1lOwotICAgIH0KLSAgICBwdWJsaWMgdm9pZCBzZXRJbmNsdWRlQ2xhc3MoYm9vbGVhbiBpbmNsdWRlQ2xhc3MpewotICAgICAgICB0aGlzLmluY2x1ZGVDbGFzcz1pbmNsdWRlQ2xhc3M7Ci0gICAgfQotICAgIHB1YmxpYyBib29sZWFuIGdldEluY2x1ZGVDbGFzcygpewotICAgICAgICByZXR1cm4gdGhpcy5pbmNsdWRlQ2xhc3M7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCBmaW5zaCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvL0NyZWF0aW5nIG91dCBGaWxlCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBGaWxlIG91dEZpbGUgPSBuZXcgRmlsZShnZXRPdXRQYXRoKCkpOwotICAgICAgICAgICAgU3RyaW5nIHRpbWUgPSBDYWxlbmRhci5nZXRJbnN0YW5jZSgpLmdldFRpbWUoKS50b1N0cmluZygpLnJlcGxhY2UoJzonLCAnLScpOwotICAgICAgICAgICAgRmlsZSB0ZW1wZmlsZSA9IG5ldyBGaWxlKG91dEZpbGUsICJ0ZW1wLSIgKyB0aW1lKTsKLSAgICAgICAgICAgIHRlbXBmaWxlLm1rZGlyKCk7Ci0gICAgICAgICAgICAvL2NyZWF0aW5nIE1FVEEtSU5GCi0gICAgICAgICAgICBGaWxlIG1ldGFpbmYgPSBuZXcgRmlsZSh0ZW1wZmlsZSwgIk1FVEEtSU5GIik7Ci0gICAgICAgICAgICBpZiAoIW1ldGFpbmYuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICBtZXRhaW5mLm1rZGlyKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFdyaXRpbmcgc2VydmljZXMueG1sCi0gICAgICAgICAgICBGaWxlIHNlcnZpY2V4bWwgPSBuZXcgRmlsZShtZXRhaW5mLCAic2VydmljZXMueG1sIik7Ci0gICAgICAgICAgICBGaWxlV3JpdGVyIHdyaXRlciA9IG5ldyBGaWxlV3JpdGVyKHNlcnZpY2V4bWwpOwotICAgICAgICAgICAgd3JpdGVyLndyaXRlKGdldFNlcnZpY2VYTUwoKSk7Ci0gICAgICAgICAgICB3cml0ZXIuZmx1c2goKTsKLSAgICAgICAgICAgIHdyaXRlci5jbG9zZSgpOwotCi0gICAgICAgICAgICAvL0NvcGluZyBjbGFzcyBmaWxlcwotICAgICAgICAgICAgRmlsZUNvcGllciBmYyA9IG5ldyBGaWxlQ29waWVyKCk7Ci0gICAgICAgICAgICBpZihpbmNsdWRlQ2xhc3MpewotICAgICAgICAgICAgICAgIGZvciAoaW50IGNvdW50PTA7Y291bnQ8Y2xhc3NMb2NhdGlvbi5zaXplKCk7Y291bnQrKykKLSAgICAgICAgICAgICAgICAgICAgZmMuY29weUZpbGVzKChGaWxlKWNsYXNzTG9jYXRpb24uZ2V0KGNvdW50KSwgdGVtcGZpbGUsICIuY2xhc3MiKTsKLSAgICAgICAgICAgIH1lbHNlewotICAgICAgICAgICAgICAgIGZvciAoaW50IGNvdW50PTA7Y291bnQ8Y2xhc3NMb2NhdGlvbi5zaXplKCk7Y291bnQrKykKLSAgICAgICAgICAgICAgICAgICAgZmMuY29weUZpbGVzKChGaWxlKWNsYXNzTG9jYXRpb24uZ2V0KGNvdW50KSwgdGVtcGZpbGUsIG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gQ29waW5nIHdzZGwgZmlsZXMKLSAgICAgICAgICAgIEZpbGUgbGliID0gbmV3IEZpbGUodGVtcGZpbGUsICJsaWIiKTsKLSAgICAgICAgICAgIGlmICghbGliLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgbGliLm1rZGlyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobGlicyE9bnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlicy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsaWJuYW1lID0gKFN0cmluZykgbGlicy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgZmMuY29weUZpbGVzKG5ldyBGaWxlKGxpYm5hbWUpLCBsaWIsIG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvL2NvcGluZyB3c2RsIGZpbGVzCi0gICAgICAgICAgICBpZiAod3NkbHMhPW51bGwpCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHdzZGxzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgRmlsZSBsaWJuYW1lID0gKEZpbGUpd3NkbHMuZ2V0KGkpOwotICAgICAgICAgICAgICAgIGZjLmNvcHlGaWxlcyhsaWJuYW1lLCBtZXRhaW5mLCBudWxsKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3RyaW5nIGFyY2l2ZW5hbWUgPSBnZXRBcmNoaXZlTmFtZSgpOwotICAgICAgICAgICAgaWYgKGFyY2l2ZW5hbWUuaW5kZXhPZigiLmFhciIpIDwgMCkgewotICAgICAgICAgICAgICAgIGFyY2l2ZW5hbWUgPSBhcmNpdmVuYW1lICsgIi5hYXIiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgSmFyRmlsZVdyaXRlciBqd3JpdGVyID0gbmV3IEphckZpbGVXcml0ZXIoKTsKLSAgICAgICAgICAgIGp3cml0ZXIud3JpdGVKYXJGaWxlKG91dEZpbGUsIGFyY2l2ZW5hbWUsIHRlbXBmaWxlKTsKLSAgICAgICAgICAgIC8vY3JhZXRpbmcgdGhlIGphciBmaWxlCi0gICAgICAgICAgICBkZWxldGVEaXIodGVtcGZpbGUpOwotCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGRlbGV0ZURpcihGaWxlIGRpcikgewotICAgICAgICBpZiAoZGlyLmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgIFN0cmluZ1tdIGNoaWxkcmVuID0gZGlyLmxpc3QoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSBkZWxldGVEaXIobmV3IEZpbGUoZGlyLCBjaGlsZHJlbltpXSkpOwotICAgICAgICAgICAgICAgIGlmICghc3VjY2VzcykgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVGhlIGRpcmVjdG9yeSBpcyBub3cgZW1wdHkgc28gZGVsZXRlIGl0Ci0gICAgICAgIHJldHVybiBkaXIuZGVsZXRlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIENsYXNzTG9hZGVyIGdldENsYXNzTG9hZGVyKCkgewotICAgICAgICByZXR1cm4gY2xhc3NMb2FkZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q2xhc3NMb2FkZXIoQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpIHsKLSAgICAgICAgdGhpcy5jbGFzc0xvYWRlciA9IGNsYXNzTG9hZGVyOwotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9pZGVhcGx1Z2luL2JlYW4vQ2xhc3NGaWxlRmlsdGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9pZGVhcGx1Z2luL2JlYW4vQ2xhc3NGaWxlRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3ZjBkODIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaWRlYXBsdWdpbi9iZWFuL0NsYXNzRmlsZUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmlkZWFwbHVnaW4uYmVhbjsKLQotaW1wb3J0IGphdmF4LnN3aW5nLmZpbGVjaG9vc2VyLkZpbGVGaWx0ZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotCi0KLXB1YmxpYyBjbGFzcyBDbGFzc0ZpbGVGaWx0ZXIgZXh0ZW5kcyBGaWxlRmlsdGVyIHsKLQotICAgIHB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGZpbGUpIHsKLSAgICAgICAgaWYgKGZpbGUgLmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZyBleHRlbnNpb24gPSBnZXRFeHRlbnNpb24oZmlsZSApOwotICAgICAgICBpZiAoZXh0ZW5zaW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBleHRlbnNpb24uZXF1YWxzKCJjbGFzcyIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLSAgICAgICAgcmV0dXJuICIuY2xhc3MiOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldEV4dGVuc2lvbihGaWxlIGZpbGUpIHsKLSAgICAgICAgU3RyaW5nIGV4dCA9IG51bGw7Ci0gICAgICAgIFN0cmluZyBzID0gZmlsZS5nZXROYW1lKCk7Ci0gICAgICAgIGludCBpID0gcy5sYXN0SW5kZXhPZignLicpOwotCi0gICAgICAgIGlmIChpID4gMCAmJiBpIDwgcy5sZW5ndGgoKSAtIDEpIHsKLSAgICAgICAgICAgIGV4dCA9IHMuc3Vic3RyaW5nKGkgKyAxKS50b0xvd2VyQ2FzZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBleHQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaWRlYXBsdWdpbi9iZWFuL0ZpbGVDb3BpZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2lkZWFwbHVnaW4vYmVhbi9GaWxlQ29waWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxYjc4M2MuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaWRlYXBsdWdpbi9iZWFuL0ZpbGVDb3BpZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5pZGVhcGx1Z2luLmJlYW47Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkNvcHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsZVNldDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotcHVibGljIGNsYXNzIEZpbGVDb3BpZXIgZXh0ZW5kcyBDb3B5IHsKLSAgICBwdWJsaWMgRmlsZUNvcGllcigpIHsKLSAgICAgICAgdGhpcy5zZXRQcm9qZWN0KG5ldyBQcm9qZWN0KCkpOwotICAgICAgICB0aGlzLmdldFByb2plY3QoKS5pbml0KCk7Ci0gICAgICAgIHRoaXMuc2V0VGFza1R5cGUoImNvcHkiKTsKLSAgICAgICAgdGhpcy5zZXRUYXNrTmFtZSgiY29weS1maWxlcyIpOwotICAgICAgICB0aGlzLnNldE93bmluZ1RhcmdldChuZXcgb3JnLmFwYWNoZS50b29scy5hbnQuVGFyZ2V0KCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNvcHlGaWxlcyhGaWxlIHNvdXJjZUZpbGUsIEZpbGUgZGVzdGluYXRpb25EaXJlY3RvcnksIFN0cmluZyBmaWx0ZXIpIHsKLQotICAgICAgICBpZiAoc291cmNlRmlsZS5pc0ZpbGUoKSkKLSAgICAgICAgICAgIHRoaXMuc2V0RmlsZShzb3VyY2VGaWxlKTsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBGaWxlU2V0IGZpbGVzZXQgPSBuZXcgRmlsZVNldCgpOwotICAgICAgICAgICAgZmlsZXNldC5zZXREaXIoc291cmNlRmlsZSk7Ci0gICAgICAgICAgICBpZiAoZmlsdGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoZmlsdGVyLm1hdGNoZXMoIlxcLlxcdyoiKSkgewotICAgICAgICAgICAgICAgICAgICBmaWxlc2V0LnNldEluY2x1ZGVzKCIqLyoqLyoiICsgZmlsdGVyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRoaXMuYWRkRmlsZXNldChmaWxlc2V0KTsKLSAgICAgICAgfQotICAgICAgICB0aGlzLnNldFRvZGlyKGRlc3RpbmF0aW9uRGlyZWN0b3J5KTsKLSAgICAgICAgdGhpcy5wZXJmb3JtKCk7Ci0gICAgfQotCi0KLX0KLQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaWRlYXBsdWdpbi9iZWFuL0phckZpbGVXcml0ZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2lkZWFwbHVnaW4vYmVhbi9KYXJGaWxlV3JpdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkZTY4NDkuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaWRlYXBsdWdpbi9iZWFuL0phckZpbGVXcml0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5pZGVhcGx1Z2luLmJlYW47Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkphcjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgSmFyRmlsZVdyaXRlciBleHRlbmRzIEphciB7Ci0KLQotICAgIHB1YmxpYyBKYXJGaWxlV3JpdGVyKCkgewotICAgICAgICB0aGlzLnNldFByb2plY3QobmV3IFByb2plY3QoKSk7Ci0gICAgICAgIHRoaXMuZ2V0UHJvamVjdCgpLmluaXQoKTsKLSAgICAgICAgdGhpcy5zZXRUYXNrVHlwZSgiamFyIik7Ci0gICAgICAgIHRoaXMuc2V0VGFza05hbWUoImphciIpOwotICAgICAgICB0aGlzLnNldE93bmluZ1RhcmdldChuZXcgb3JnLmFwYWNoZS50b29scy5hbnQuVGFyZ2V0KCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlSmFyRmlsZShGaWxlIG91dHB1dEZvbGRlciwgU3RyaW5nIG91dHB1dEZpbGVOYW1lLCBGaWxlIGlucHV0RmlsZUZvbGRlcikgdGhyb3dzIElPRXhjZXB0aW9uLCBFeGNlcHRpb24gewotCi0gICAgICAgIGlmICghb3V0cHV0Rm9sZGVyLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICBvdXRwdXRGb2xkZXIubWtkaXIoKTsgLy9jcmVhdGUgdGhlIG91dHB1dCBwYXRoCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoIW91dHB1dEZvbGRlci5pc0RpcmVjdG9yeSgpKQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIEZpbGUgdGFyZ2V0RmlsZSA9IG5ldyBGaWxlKG91dHB1dEZvbGRlciwgb3V0cHV0RmlsZU5hbWUpOwotICAgICAgICB0aGlzLnNldEJhc2VkaXIoaW5wdXRGaWxlRm9sZGVyKTsKLSAgICAgICAgdGhpcy5zZXREZXN0RmlsZSh0YXJnZXRGaWxlKTsKLQotICAgICAgICAvL3J1biB0aGUgdGFzawotICAgICAgICB0aGlzLnBlcmZvcm0oKTsKLQotCi0gICAgfQotCi0KLX0KLQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaWRlYXBsdWdpbi9iZWFuL09wZXJhdGlvbk9iai5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaWRlYXBsdWdpbi9iZWFuL09wZXJhdGlvbk9iai5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGViMjQyLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2lkZWFwbHVnaW4vYmVhbi9PcGVyYXRpb25PYmouamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5pZGVhcGx1Z2luLmJlYW47Ci0KLXB1YmxpYyBjbGFzcyBPcGVyYXRpb25PYmogewotCi0gICAgcHJpdmF0ZSBTdHJpbmcgT3BOYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIFJldHVyblZhbHVlOwotICAgIHByaXZhdGUgSW50ZWdlciBwYXJhbWV0ZXJzOwotICAgIHByaXZhdGUgQm9vbGVhbiBzZWxlY3Q7Ci0KLSAgICBwdWJsaWMgT3BlcmF0aW9uT2JqKFN0cmluZyBvcE5hbWUsIFN0cmluZyByZXR1cm5WYWxlLCBJbnRlZ2VyIHBhcmFtZXRlcnMsIEJvb2xlYW4gc2VsZWN0KSB7Ci0gICAgICAgIE9wTmFtZSA9IG9wTmFtZTsKLSAgICAgICAgUmV0dXJuVmFsdWUgPSByZXR1cm5WYWxlOwotICAgICAgICB0aGlzLnBhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzOwotICAgICAgICB0aGlzLnNlbGVjdCA9IHNlbGVjdDsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0T3BOYW1lKCkgewotICAgICAgICByZXR1cm4gT3BOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE9wTmFtZShTdHJpbmcgb3BOYW1lKSB7Ci0gICAgICAgIE9wTmFtZSA9IG9wTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFJldHVyblZhbHVlKCkgewotICAgICAgICByZXR1cm4gUmV0dXJuVmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UmV0dXJuVmFsdWUoU3RyaW5nIHJldHVyblZhbHVlKSB7Ci0gICAgICAgIFJldHVyblZhbHVlID0gcmV0dXJuVmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIEludGVnZXIgZ2V0UGFyYW1ldGVycygpIHsKLSAgICAgICAgcmV0dXJuIHBhcmFtZXRlcnM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGFyYW1ldGVycyhJbnRlZ2VyIHBhcmFtZXRlcnMpIHsKLSAgICAgICAgdGhpcy5wYXJhbWV0ZXJzID0gcGFyYW1ldGVyczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQm9vbGVhbiBnZXRTZWxlY3QoKSB7Ci0gICAgICAgIHJldHVybiBzZWxlY3Q7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2VsZWN0KEJvb2xlYW4gc2VsZWN0KSB7Ci0gICAgICAgIHRoaXMuc2VsZWN0ID0gc2VsZWN0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByaW50TWUoKSB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiPT09PT09PT0gUm93ID09PT09PT09PT09PT0iKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPcE5hbWUgPSAiICsgT3BOYW1lKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJwYXJhbWV0ZXJzID0gIiArIHBhcmFtZXRlcnMpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlJldHVyblZhbHVlID0gIiArIFJldHVyblZhbHVlKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJzZWxlY3QgPSAiICsgc2VsZWN0KTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCI9PT09PT09PT09PT09PT09PT09PT09PT09PSIpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaWRlYXBsdWdpbi9iZWFuL1BhcmFtZXRlck9iai5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaWRlYXBsdWdpbi9iZWFuL1BhcmFtZXRlck9iai5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTRjM2M2Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2lkZWFwbHVnaW4vYmVhbi9QYXJhbWV0ZXJPYmouamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5pZGVhcGx1Z2luLmJlYW47Ci0KLXB1YmxpYyBjbGFzcyBQYXJhbWV0ZXJPYmogewotCi0gICAgcHJpdmF0ZSBTdHJpbmcgIHBhcmFOYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIHBhcmFWYWx1ZTsKLQotICAgIHB1YmxpYyBQYXJhbWV0ZXJPYmooU3RyaW5nIG5hbWUsU3RyaW5nIHZhbHVlKXsKLSAgICAgICAgdGhpcy5wYXJhTmFtZT1uYW1lOwotICAgICAgICB0aGlzLnBhcmFWYWx1ZT12YWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKXsKLSAgICAgICAgdGhpcy5wYXJhTmFtZT1uYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSl7Ci0gICAgICAgIHRoaXMucGFyYVZhbHVlPXZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgIGdldE5hbWUoKXsKLSAgICAgICAgcmV0dXJuIHRoaXMucGFyYU5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyAgZ2V0VmFsdWUoKXsKLSAgICAgICAgcmV0dXJuIHRoaXMucGFyYVZhbHVlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaWRlYXBsdWdpbi9iZWFuL1NlcnZpY2VPYmouamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2lkZWFwbHVnaW4vYmVhbi9TZXJ2aWNlT2JqLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlNzAxYzguLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaWRlYXBsdWdpbi9iZWFuL1NlcnZpY2VPYmouamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5pZGVhcGx1Z2luLmJlYW47Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1wdWJsaWMgY2xhc3MgU2VydmljZU9iaiB7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgc2VydmljZU5hbWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgc2VydmljZUNsYXNzOwotICAgIHByaXZhdGUgQXJyYXlMaXN0IG9wZXJhdGlvbnM7Ci0KLSAgICBwdWJsaWMgU2VydmljZU9iaihTdHJpbmcgc2VydmljZU5hbWUsIFN0cmluZyBzZXJ2aWNlQ2xhc3MsIEFycmF5TGlzdCBvcGVyYXRpb25zKSB7Ci0gICAgICAgIHRoaXMuc2VydmljZU5hbWUgPSBzZXJ2aWNlTmFtZTsKLSAgICAgICAgdGhpcy5zZXJ2aWNlQ2xhc3MgPSBzZXJ2aWNlQ2xhc3M7Ci0gICAgICAgIHRoaXMub3BlcmF0aW9ucyA9IG9wZXJhdGlvbnM7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRTZXJ2aWNlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHNlcnZpY2VOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmljZUNsYXNzKCkgewotICAgICAgICByZXR1cm4gc2VydmljZUNsYXNzOwotICAgIH0KLQotICAgIHB1YmxpYyBBcnJheUxpc3QgZ2V0T3BlcmF0aW9ucygpIHsKLSAgICAgICAgcmV0dXJuIG9wZXJhdGlvbnM7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgU3RyaW5nIHNlcnZpY2VYTUwgPSAiPHNlcnZpY2UgbmFtZT1cIiIgKyBzZXJ2aWNlTmFtZSArICJcIiA+XG4iICsKLSAgICAgICAgICAgICAgICAiICAgPGRlc2NyaXB0aW9uPlxuIiArCi0gICAgICAgICAgICAgICAgIiAgICAgICBQbGVhc2UgVHlwZSB5b3VyIHNlcnZpY2UgZGVzY3JpcHRpb24gaGVyZVxuIiArCi0gICAgICAgICAgICAgICAgIiAgIDwvZGVzY3JpcHRpb24+XG4iICsKLSAgICAgICAgICAgICAgICAiICAgPG1lc3NhZ2VSZWNlaXZlcnM+XG4iKwotICAgICAgICAgICAgICAgICIgICAgICAgPG1lc3NhZ2VSZWNlaXZlciBtZXA9XCJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaW4tb25seVwiIFxuIisKLSAgICAgICAgICAgICAgICAiICAgICAgIGNsYXNzPVwib3JnLmFwYWNoZS5heGlzMi5ycGMucmVjZWl2ZXJzLlJQQ0luT25seU1lc3NhZ2VSZWNlaXZlclwiIC8+XG4gIisKLSAgICAgICAgICAgICAgICAiICAgICAgIDxtZXNzYWdlUmVjZWl2ZXIgbWVwPVwiaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC93c2RsL2luLW91dFwiXG4gIiArCi0gICAgICAgICAgICAgICAgIiAgICAgICBjbGFzcz1cIm9yZy5hcGFjaGUuYXhpczIucnBjLnJlY2VpdmVycy5SUENNZXNzYWdlUmVjZWl2ZXJcIiAvPiBcbiIgKwotICAgICAgICAgICAgICAgICIgICA8L21lc3NhZ2VSZWNlaXZlcnM+XG4gIisKLSAgICAgICAgICAgICAgICAiICAgPHBhcmFtZXRlciBuYW1lPVwiU2VydmljZUNsYXNzXCIgbG9ja2VkPVwiZmFsc2VcIj4iICsgc2VydmljZUNsYXNzICsgIjwvcGFyYW1ldGVyPlxuIjsKLSAgICAgICAgaWYgKG9wZXJhdGlvbnMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgc2VydmljZVhNTCA9IHNlcnZpY2VYTUwgKyAiIDxleGNsdWRlT3BlcmF0aW9ucz5cbiI7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG9wZXJhdGlvbnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcyA9IChTdHJpbmcpIG9wZXJhdGlvbnMuZ2V0KGkpOwotICAgICAgICAgICAgICAgIFN0cmluZyBvcCA9ICIgICAgICAgPG9wZXJhdGlvbj4iICsgcyArICI8L29wZXJhdGlvbj5cbiI7Ci0gICAgICAgICAgICAgICAgc2VydmljZVhNTCA9IHNlcnZpY2VYTUwgKyBvcDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNlcnZpY2VYTUwgPSBzZXJ2aWNlWE1MICsgIiA8L2V4Y2x1ZGVPcGVyYXRpb25zPlxuIjsKLSAgICAgICAgfQotICAgICAgICBzZXJ2aWNlWE1MID0gc2VydmljZVhNTCArICI8L3NlcnZpY2U+XG4iOwotICAgICAgICByZXR1cm4gc2VydmljZVhNTDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2lkZWFwbHVnaW4vYmVhbi9WYWxpZGF0ZVhNTEZpbGUuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2lkZWFwbHVnaW4vYmVhbi9WYWxpZGF0ZVhNTEZpbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE2Y2RmNS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9pZGVhcGx1Z2luL2JlYW4vVmFsaWRhdGVYTUxGaWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuaWRlYXBsdWdpbi5iZWFuOwotCi0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRvb2xzLmNvbXBvbmVudC5XaXphcmRQYW5lbDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLmRvbS5ET01Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC52YWxpZGF0aW9uLlNjaGVtYTsKLWltcG9ydCBqYXZheC54bWwudmFsaWRhdGlvbi5TY2hlbWFGYWN0b3J5OwotaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOwotCi0vKioKLSAqIHRoaXMgY2Fsc3MgdXNlZCBmb3IgY2hlY2sgc2VydmljZSB4bWwgdmFsaWRhdGlvbgotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGVYTUxGaWxlIHsKLQotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgVzNDX1hNTF9TQ0hFTUFfTlNfVVJJID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIjsKLQotICAgIHB1YmxpYyAgYm9vbGVhbiBWYWxpZGF0ZShTdHJpbmcgYXJncykgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gZGVmaW5lIHRoZSB0eXBlIG9mIHNjaGVtYSAgZ2V0IHZhbGlkYXRpb24gZHJpdmVyOgotICAgICAgICAgICAgU2NoZW1hRmFjdG9yeSBzY2hlbWFmYWN0b3J5ID0gU2NoZW1hRmFjdG9yeS5uZXdJbnN0YW5jZShXM0NfWE1MX1NDSEVNQV9OU19VUkkpOwotCi0gICAgICAgICAgICAvLyBjcmVhdGUgc2NoZW1hIGJ5IHJlYWRpbmcgaXQgZnJvbSBhbiBYU0QgZmlsZToKLSAgICAgICAgICAgIGphdmEubmV0LlVSTCByZXNvdXJjZSA9IFdpemFyZFBhbmVsLmNsYXNzLmdldFJlc291cmNlKCIvcmVzb3VyY2VzL3NlcnZpY2UueHNkIik7Ci0gICAgICAgICAgICBTY2hlbWEgc2NoZW1hID0gc2NoZW1hZmFjdG9yeS5uZXdTY2hlbWEobmV3IFN0cmVhbVNvdXJjZShyZXNvdXJjZS5nZXRQYXRoKCkpKTsKLQotICAgICAgICAgICAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBmYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgZmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKLSAgICAgICAgICAgIERvY3VtZW50QnVpbGRlciBkb2NCdWlsZGVyID0gZmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKLSAgICAgICAgICAgIERvY3VtZW50IGRvYyA9IGRvY0J1aWxkZXIucGFyc2UobmV3IElucHV0U291cmNlKG5ldyBTdHJpbmdSZWFkZXIoYXJncykpKTsKLQotICAgICAgICAgICAgc2NoZW1hLm5ld1ZhbGlkYXRvcigpLnZhbGlkYXRlKG5ldyBET01Tb3VyY2UoZG9jKSk7Ci0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Y2F0Y2ggKFNBWEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgLy8gICBleC5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgLy8gIGV4LnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaWRlYXBsdWdpbi9iZWFuL1htbEZpbGVGaWx0ZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2lkZWFwbHVnaW4vYmVhbi9YbWxGaWxlRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4M2JjZDYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaWRlYXBsdWdpbi9iZWFuL1htbEZpbGVGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5pZGVhcGx1Z2luLmJlYW47Ci0KLWltcG9ydCBqYXZheC5zd2luZy5maWxlY2hvb3Nlci5GaWxlRmlsdGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotCi1wdWJsaWMgY2xhc3MgWG1sRmlsZUZpbHRlciBleHRlbmRzIEZpbGVGaWx0ZXIgewotICAgICBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBmaWxlKSB7Ci0gICAgICAgIGlmKGZpbGUuaXNEaXJlY3RvcnkoKSApewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nIGV4dGVuc2lvbiA9IGdldEV4dGVuc2lvbihmaWxlKTsKLSAgICAgICAgaWYoZXh0ZW5zaW9uICE9IG51bGwpewotICAgICAgICAgICAgcmV0dXJuICBleHRlbnNpb24gLmVxdWFscygieG1sIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0gICAgICAgIHJldHVybiAiLnhtbCI7Ci0gICAgfQotCi0gICBwcml2YXRlIFN0cmluZyBnZXRFeHRlbnNpb24oRmlsZSBmaWxlKXsKLSAgICAgICAgU3RyaW5nIGV4dCA9IG51bGw7Ci0gICAgICAgIFN0cmluZyBzID0gZmlsZS5nZXROYW1lKCk7Ci0gICAgICAgIGludCBpID0gcy5sYXN0SW5kZXhPZignLicpOwotCi0gICAgICAgIGlmIChpID4gMCAmJiBpIDwgcy5sZW5ndGgoKSAtIDEpIHsKLSAgICAgICAgICAgIGV4dCA9IHMuc3Vic3RyaW5nKGkgKyAxKS50b0xvd2VyQ2FzZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBleHQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaWRlYXBsdWdpbi9mcmFtZXMvQ2xhc3NGaWxlTG9jYXRpb25QYWdlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9pZGVhcGx1Z2luL2ZyYW1lcy9DbGFzc0ZpbGVMb2NhdGlvblBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNiODg0MC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9pZGVhcGx1Z2luL2ZyYW1lcy9DbGFzc0ZpbGVMb2NhdGlvblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuaWRlYXBsdWdpbi5mcmFtZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRvb2xzLmNvbXBvbmVudC5XaXphcmRDb21wb25lbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbHMuY29tcG9uZW50LldpemFyZFBhbmVsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbHMud2l6YXJkZnJhbWUuQ29kZWdlbkZyYW1lOwotaW1wb3J0IG9yZy5hcGFjaGUuaWRlYXBsdWdpbi5iZWFuLkFyY2hpdmVCZWFuOwotCi1pbXBvcnQgamF2YXguc3dpbmcuKjsKLWltcG9ydCBqYXZheC5zd2luZy5ib3JkZXIuRW1wdHlCb3JkZXI7Ci1pbXBvcnQgamF2YS5hd3QuKjsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLS8qKgotICogQ3JlYXRlZCBieSBJbnRlbGxpSiBJREVBLgotICogVXNlcjogc2hpdmFudGhhCi0gKiBEYXRlOiAxNi8wNy8yMDA3Ci0gKiBUaW1lOiAxMDo1NTozMQotICogVG8gY2hhbmdlIHRoaXMgdGVtcGxhdGUgdXNlIEZpbGUgfCBTZXR0aW5ncyB8IEZpbGUgVGVtcGxhdGVzLgotICovCi1wdWJsaWMgY2xhc3MgQ2xhc3NGaWxlTG9jYXRpb25QYWdlIGV4dGVuZHMgV2l6YXJkUGFuZWwgewotICAgICAgICAvKioKLSAgICAgICAgICogdmFyaWFsYmFsZXMKLSAgICAgICAgICovCi0gICAgICAgIHByaXZhdGUgSlRleHRGaWVsZCB0eHRDbGFzc0RpcjsKLSAgICAgICAgcHJpdmF0ZSBKQnV0dG9uIGJ1dFNlbGVjdDsKLSAgICAgICAgcHJpdmF0ZSBKQ2hlY2tCb3ggY2hrQm94SW5jbHVkZUNsYXNzOwotICAgICAgICBwcml2YXRlIEpDaGVja0JveCBjaGtCb3hBcmNoaXZlVHlwZTsKLSAgICAgICAgcHJpdmF0ZSBKQnV0dG9uIGJ0bkhpbnQ7Ci0gICAgICAgIHByaXZhdGUgSlRleHRBcmVhIHR4YUhpbnQ7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBmbGFnPWZhbHNlOwotICAgICAgICBwcml2YXRlIFN0cmluZyBoaW50ID0iOiI7Ci0gICAgICAgIHByaXZhdGUgQXJjaGl2ZUJlYW4gYXJjaGl2ZUJlYW47Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBKRmlsZUNob29zZXIgZmlsZUNob29zZXIgPSBuZXcgSkZpbGVDaG9vc2VyKCk7Ci0gICAgICAgIHByaXZhdGUgRmlsZSBmaWxlOwotICAgICAgICAvKioKLSAgICAgICAgICogQ29uc3RydWN0b3IKLSAgICAgICAgICogQHBhcmFtIHdpemFyZENvbXBvbmVudHMKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBDbGFzc0ZpbGVMb2NhdGlvblBhZ2UoV2l6YXJkQ29tcG9uZW50cyB3aXphcmRDb21wb25lbnRzLCBBcmNoaXZlQmVhbiBhcmNoaXZlQmVhbiApIHsKLSAgICAgICAgICAgIHN1cGVyKHdpemFyZENvbXBvbmVudHMsICJBeGlzMiBJZGVhIFBsdWdpbiBTZXJ2aWNlIEFyY2hpdmVyIENyZWF0b3IgV2l6YXJkcyIpOwotICAgICAgICAgICAgc2V0UGFuZWxUb3BUaXRsZSgiU2VydmljZSBBcmNoaXZlciIpOwotICAgICAgICAgICAgc2V0UGFuZWxCb3R0b21UaXRsZSgiV2VsY29tZSB0byBBeGlzMiBTZXJ2aWNlIEFyY2hpdmUgV2l6YXJkLkluc2VydCB0aGUgY2xhc3MgZmlsZXMgYW5kIHNlbGVjdCB0aGUgc2VydmljZSB0eXBlLiAiKTsKLSAgICAgICAgICAgIHRoaXMuYXJjaGl2ZUJlYW49YXJjaGl2ZUJlYW47Ci0gICAgICAgICAgICBpbml0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogaW5pdGlhdGUgcGFuZWwKLSAgICAgICAgICovCi0gICAgICAgIHByaXZhdGUgdm9pZCBpbml0KCl7Ci0KLSAgICAgICAgICAgIHR4YUhpbnQgPW5ldyBKVGV4dEFyZWEoKTsKLSAgICAgICAgICAgIHR4YUhpbnQuc2V0Qm9yZGVyKG51bGwpOwotICAgICAgICAgICAgdHhhSGludC5zZXRGb2N1c2FibGUoZmFsc2UpOwotICAgICAgICAgICAgdHhhSGludC5zZXRMaW5lV3JhcCh0cnVlKTsKLSAgICAgICAgICAgIHR4YUhpbnQuc2V0V3JhcFN0eWxlV29yZCh0cnVlKTsKLSAgICAgICAgICAgIHR4YUhpbnQuc2V0T3BhcXVlKGZhbHNlKTsKLSAgICAgICAgICAgIGJ0bkhpbnQgPW5ldyBKQnV0dG9uKCJIaW50ID4+Iik7Ci0gICAgICAgICAgICBidG5IaW50LnNldEJvcmRlcihuZXcgRW1wdHlCb3JkZXIobmV3IEluc2V0cygwLDAsMCwwKSkpOwotICAgICAgICAgICAgdHh0Q2xhc3NEaXIgPW5ldyBKVGV4dEZpZWxkKCk7Ci0gICAgICAgICAgICBidXRTZWxlY3Q9bmV3IEpCdXR0b24oIkJyb3dzZS4uIik7Ci0gICAgICAgICAgICBjaGtCb3hJbmNsdWRlQ2xhc3MgPSBuZXcgSkNoZWNrQm94KCJpbmNsdWRlIC5jbGFzcyBmaWxlIG9ubHkiKSA7Ci0gICAgICAgICAgICBjaGtCb3hBcmNoaXZlVHlwZT1uZXcgSkNoZWNrQm94KCJTZWxlY3QgZm9yIFNlcnZpY2UgR3JvdXAgQXJjaGl2ZSIpOwotCi0gICAgICAgICAgICBzZXRCYWNrQnV0dG9uRW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgIHNldEZpbmlzaEJ1dHRvbkVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsKLQotICAgICAgICAgICAgdGhpcy5zZXRMYXlvdXQobmV3IEdyaWRCYWdMYXlvdXQoKSk7Ci0KLSAgICAgICAgICAgIHRoaXMuYWRkKG5ldyBKTGFiZWwoIkNsYXNzIGZpbGUgbG9jYXRpb24iKQotICAgICAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMCwgMCwgMSwgMSwgMC4xLCAwLjAKLSAgICAgICAgICAgICAgICAgICAgLCBHcmlkQmFnQ29uc3RyYWludHMuV0VTVCAsIEdyaWRCYWdDb25zdHJhaW50cy5OT05FCi0gICAgICAgICAgICAgICAgICAgICwgbmV3IEluc2V0cyg1LCAxMCwgMCwwKSwgMCwgMCkpOwotCi0gICAgICAgICAgICB0aGlzLmFkZCh0eHRDbGFzc0RpcgotICAgICAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMSwgMCwgR3JpZEJhZ0NvbnN0cmFpbnRzLlJFTEFUSVZFLCAxLCAxLjAsIDAuMAotICAgICAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5XRVNUICwgR3JpZEJhZ0NvbnN0cmFpbnRzLkhPUklaT05UQUwKLSAgICAgICAgICAgICAgICAgICAgLCBuZXcgSW5zZXRzKDUsIDEsIDEsIDEpLCAwLCAwKSk7Ci0KLSAgICAgICAgICAgIHR4dENsYXNzRGlyLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpICB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0KLSAgICAgICAgICAgIHRoaXMuYWRkKGJ1dFNlbGVjdAotICAgICAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMiwgMCwgMSwgMSwgMC4xLCAwLjAKLSAgICAgICAgICAgICAgICAgICAgLCBHcmlkQmFnQ29uc3RyYWludHMuQ0VOVEVSICwgR3JpZEJhZ0NvbnN0cmFpbnRzLk5PTkUKLSAgICAgICAgICAgICAgICAgICAgLCBuZXcgSW5zZXRzKDUsIDEsIDEsMTApLCAwLCAwKSk7Ci0KLSAgICAgICAgICAgIGJ1dFNlbGVjdC5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSAgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbGVDaG9vc2VyLnNldEZpbGVTZWxlY3Rpb25Nb2RlKEpGaWxlQ2hvb3Nlci5ESVJFQ1RPUklFU19PTkxZKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IHJldHVyblZhbCA9IGZpbGVDaG9vc2VyLnNob3dPcGVuRGlhbG9nKGJ1dFNlbGVjdCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXR1cm5WYWwgPT0gSkZpbGVDaG9vc2VyLkFQUFJPVkVfT1BUSU9OKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaWxlID0gZmlsZUNob29zZXIuZ2V0U2VsZWN0ZWRGaWxlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaWxlQ2hvb3Nlci5zZXRDdXJyZW50RGlyZWN0b3J5KGZpbGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgdHh0Q2xhc3NEaXIuc2V0VGV4dChmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldFBhZ2VDb21wbGV0ZSh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldE5leHRCdXR0b25FbmFibGVkKHRydWUpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgdHh0Q2xhc3NEaXIuc2V0VGV4dCgiIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB1cGRhdGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLQotICAgICAgICAgICAgdGhpcy5hZGQoY2hrQm94SW5jbHVkZUNsYXNzCi0gICAgICAgICAgICAgICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygwLCAxLCBHcmlkQmFnQ29uc3RyYWludHMuUkVNQUlOREVSLCAxLCAwLjAsIDAuMAotICAgICAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5XRVNUICwgR3JpZEJhZ0NvbnN0cmFpbnRzLkhPUklaT05UQUwKLSAgICAgICAgICAgICAgICAgICAgLCBuZXcgSW5zZXRzKDUsIDEwLCAxLDEpLCAwLCAwKSk7Ci0gICAgICAgICAgICBjaGtCb3hJbmNsdWRlQ2xhc3MuYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgICAgICB1cGRhdGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLQotLy8gICAgICAgICAgICAgdGhpcy5hZGQoY2hrQm94QXJjaGl2ZVR5cGUKLS8vICAgICAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMCwgMiwgR3JpZEJhZ0NvbnN0cmFpbnRzLlJFTUFJTkRFUiwgMSwgMC4wLCAwLjAKLS8vICAgICAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5XRVNUICAsIEdyaWRCYWdDb25zdHJhaW50cy5IT1JJWk9OVEFMCi0vLyAgICAgICAgICAgICAgICAgICAgLCBuZXcgSW5zZXRzKDUsIDEwLCAxLDEpLCAwLCAwKSk7Ci0vLyAgICAgICAgICAgIGNoa0JveEFyY2hpdmVUeXBlIC5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSAgewotLy8gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLS8vICAgICAgICAgICAgICAgICAgICB1cGRhdGUoKTsKLS8vICAgICAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICB0aGlzLmFkZChidG5IaW50LAotICAgICAgICAgICAgICAgICAgICBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDAsIDIsIDEsIDEsIDAuMCwwLjAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5XRVNUICwgR3JpZEJhZ0NvbnN0cmFpbnRzLk5PTkUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIG5ldyBJbnNldHMoNSwgMTAsIDAsIDEwKSwgMCwgMCkpOwotICAgICAgICAgICAgYnRuSGludC5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSAgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKGZsYWcpewotICAgICAgICAgICAgICAgICAgICAgICAgYnRuSGludC5zZXRUZXh0KCJIaW50ID4+Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0eGFIaW50LnNldFRleHQoIiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgZmxhZz1mYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICAgICAgICAgICAgICBidG5IaW50LnNldFRleHQoIkhpbnQgPDwiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHR4YUhpbnQuc2V0VGV4dChoaW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZsYWc9dHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB1cGRhdGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLQotICAgICAgICAgICAgdGhpcy5hZGQodHhhSGludAotICAgICAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMCwgMywgR3JpZEJhZ0NvbnN0cmFpbnRzLlJFTUFJTkRFUiwgMSwgMC4wLDEuMAotICAgICAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5XRVNUICwgR3JpZEJhZ0NvbnN0cmFpbnRzLkJPVEgKLSAgICAgICAgICAgICAgICAgICAgLCBuZXcgSW5zZXRzKDUsIDEwLCAxMCwgMTApLCAwLCAwKSk7Ci0KLSAgICAgICAgfQotCi0gICAgICAgIC8vbmV4dAotICAgICAgICBwdWJsaWMgdm9pZCBuZXh0KCkgewotICAgICAgICAgICAgc3dpdGNoUGFuZWwoQ29kZWdlbkZyYW1lLlBBTkVMX1NFQ09ORF9DICk7Ci0gICAgICAgIH0KLSAgICAgICAgLy9iYWNrCi0gICAgICAgIHB1YmxpYyB2b2lkIGJhY2soKSB7Ci0gICAgICAgICAgICBzd2l0Y2hQYW5lbChDb2RlZ2VuRnJhbWUuUEFORUxfQ0hPT1NFUiApOwotICAgICAgICB9Ci0gICAgICAgIC8vdXBkYXRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLSAgICAgICAgICAgIGZpbGxCZWFuKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGZpbGxCZWFuKCl7Ci0vLyAgICAgICAgICBpZighY2hrQm94QXJjaGl2ZVR5cGUuaXNTZWxlY3RlZCgpKXsKLS8vICAgICAgICAgICAgICAgYXJjaGl2ZUJlYW4uc2V0U2luZ2xlU2VydmljZSh0cnVlKTsKLS8vICAgICAgICAgIH0gZWxzZQotLy8gICAgICAgICAgICAgIGFyY2hpdmVCZWFuLnNldFNpbmdsZVNlcnZpY2UoZmFsc2UpOwotICAgICAgICAgIGlmKCF0eHRDbGFzc0Rpci5nZXRUZXh0KCkudHJpbSgpLmVxdWFscygiIikpewotICAgICAgICAgICAgICBhcmNoaXZlQmVhbi5zZXRDbGFzc0xvYyhmaWxlKTsKLSAgICAgICAgICAgICAgYXJjaGl2ZUJlYW4uYWRkQ2xhc3NMb2NhdGlvbihmaWxlKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgIGlmKGNoa0JveEluY2x1ZGVDbGFzcy5pc1NlbGVjdGVkKCkpewotICAgICAgICAgICAgICAgYXJjaGl2ZUJlYW4uc2V0SW5jbHVkZUNsYXNzKHRydWUpOwotICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICBhcmNoaXZlQmVhbi5zZXRJbmNsdWRlQ2xhc3MoZmFsc2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy9nZXQgcGFnZSB0eXBlCi0gICAgICAgIHB1YmxpYyAgaW50IGdldFBhZ2VUeXBlKCkgewotICAgICAgICAgICAgcmV0dXJuICBXaXphcmRQYW5lbC5TRVJWSUNFX0FSQ0hJVkVfVFlQRTsKLSAgICAgICAgfQotIH0KLQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaWRlYXBsdWdpbi9mcmFtZXMvTGlicmFyeUFkZGluZ1BhZ2UuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2lkZWFwbHVnaW4vZnJhbWVzL0xpYnJhcnlBZGRpbmdQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiM2FmN2MuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaWRlYXBsdWdpbi9mcmFtZXMvTGlicmFyeUFkZGluZ1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuaWRlYXBsdWdpbi5mcmFtZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRvb2xzLmNvbXBvbmVudC5XaXphcmRDb21wb25lbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbHMuY29tcG9uZW50LldpemFyZFBhbmVsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbHMuamF2YTJ3c2RsLkphckZpbGVGaWx0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29scy53aXphcmRmcmFtZS5Db2RlZ2VuRnJhbWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5pZGVhcGx1Z2luLmJlYW4uQXJjaGl2ZUJlYW47Ci0KLWltcG9ydCBqYXZheC5zd2luZy4qOwotaW1wb3J0IGphdmF4LnN3aW5nLmJvcmRlci5FbXB0eUJvcmRlcjsKLWltcG9ydCBqYXZhLmF3dC4qOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkV2ZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkxpc3RlbmVyOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uZXQuVVJMQ2xhc3NMb2FkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotCi1wdWJsaWMgY2xhc3MgTGlicmFyeUFkZGluZ1BhZ2UgZXh0ZW5kcyBXaXphcmRQYW5lbCB7Ci0KLSAgICBwcml2YXRlIEpUZXh0RmllbGQgdHh0SmFyTG9jYXRpb247Ci0gICAgcHJpdmF0ZSBKQnV0dG9uIGJ1dFNlbGVjdDsKLSAgICBwcml2YXRlIEpCdXR0b24gYnV0QWRkOwotICAgIHByaXZhdGUgSkJ1dHRvbiBidXRSZW1vdmU7Ci0gICAgcHJpdmF0ZSBKTGlzdCBsaXN0UGF0aERpc3BseTsKLSAgICBwcml2YXRlIERlZmF1bHRMaXN0TW9kZWwgbGlzdE1vZGVsOwotICAgIHByaXZhdGUgSkJ1dHRvbiBidG5IaW50OwotICAgIHByaXZhdGUgSlRleHRBcmVhIHR4YUhpbnQ7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGZsYWc9ZmFsc2U7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgaGludCA9IiI7Ci0gICAgcHJpdmF0ZSBBcmNoaXZlQmVhbiBhcmNoaXZlQmVhbjsKLSAgICBwcml2YXRlIGZpbmFsIEpGaWxlQ2hvb3NlciBmaWxlQ2hvb3Nlcj1uZXcgSkZpbGVDaG9vc2VyKCk7Ci0KLQotICAgIHB1YmxpYyBMaWJyYXJ5QWRkaW5nUGFnZShXaXphcmRDb21wb25lbnRzIHdpemFyZENvbXBvbmVudHMsIEFyY2hpdmVCZWFuIGFyY2hpdmVCZWFuKSB7Ci0gICAgICAgIHN1cGVyKHdpemFyZENvbXBvbmVudHMsICAiQXhpczIgSWRlYSBQbHVnaW4gU2VydmljZSBBcmNoaXZlciBDcmVhdG9yIFdpemFyZHMiKTsKLSAgICAgICAgc2V0UGFuZWxUb3BUaXRsZSgiU2VydmljZSBBcmNoaXZlciIpOwotICAgICAgICBzZXRQYW5lbEJvdHRvbVRpdGxlKCJBZGQgYW55IGV4dGVybmFsIEphciIpOwotICAgICAgICB0aGlzLmFyY2hpdmVCZWFuPWFyY2hpdmVCZWFuOwotICAgICAgICBpbml0KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGluaXQoKXsKLSAgICAgICAgdHhhSGludCA9bmV3IEpUZXh0QXJlYSgpOwotICAgICAgICB0eGFIaW50LnNldEJvcmRlcihudWxsKTsKLSAgICAgICAgdHhhSGludC5zZXRGb2N1c2FibGUoZmFsc2UpOwotICAgICAgICB0eGFIaW50LnNldExpbmVXcmFwKHRydWUpOwotICAgICAgICB0eGFIaW50LnNldFdyYXBTdHlsZVdvcmQodHJ1ZSk7Ci0gICAgICAgIHR4YUhpbnQuc2V0T3BhcXVlKGZhbHNlKTsKLQotICAgICAgICBidG5IaW50ID1uZXcgSkJ1dHRvbigiSGludCA+PiIpOwotICAgICAgICBidG5IaW50LnNldEJvcmRlcihuZXcgRW1wdHlCb3JkZXIobmV3IEluc2V0cygwLDAsMCwwKSkpOwotICAgICAgICB0eHRKYXJMb2NhdGlvbj1uZXcgSlRleHRGaWVsZCgpOwotICAgICAgICBidXRTZWxlY3QgPW5ldyBKQnV0dG9uKCJCcm93c2UuLiIpOwotICAgICAgICBidXRBZGQgPW5ldyBKQnV0dG9uKCJBZGQgLT4iKTsKLSAgICAgICAgYnV0UmVtb3ZlPW5ldyBKQnV0dG9uKCJSZW1vdmUgPC0iKTsKLSAgICAgICAgbGlzdE1vZGVsID1uZXcgRGVmYXVsdExpc3RNb2RlbCgpOwotICAgICAgICBsaXN0UGF0aERpc3BseSA9bmV3IEpMaXN0KGxpc3RNb2RlbCk7Ci0gICAgICAgIGxpc3RQYXRoRGlzcGx5LnNldEF1dG9zY3JvbGxzKHRydWUpOwotICAgICAgICBsaXN0UGF0aERpc3BseS5zZXRPcGFxdWUoZmFsc2UpOwotICAgICAgICBsaXN0UGF0aERpc3BseS5zZXRCb3JkZXIoQm9yZGVyRmFjdG9yeS5jcmVhdGVCZXZlbEJvcmRlcigxKSApOwotICAgICAgICBsaXN0UGF0aERpc3BseS5zZXRGb2N1c2FibGUoZmFsc2UpOwotCi0gICAgICAgIHNldEJhY2tCdXR0b25FbmFibGVkKHRydWUpOwotICAgICAgICBzZXROZXh0QnV0dG9uRW5hYmxlZCh0cnVlKTsKLSAgICAgICAgc2V0RmluaXNoQnV0dG9uRW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIHNldFBhZ2VDb21wbGV0ZShmYWxzZSk7Ci0KLSAgICAgICAgdGhpcy5zZXRMYXlvdXQobmV3IEdyaWRCYWdMYXlvdXQoKSk7Ci0KLSAgICAgICAgdGhpcy5hZGQobmV3IEpMYWJlbCgiSmFyIGZpbGUgbG9jYXRpb24iKQotICAgICAgICAgICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygwLCAwLCAxLCAxLCAwLjEsIDAuMAotICAgICAgICAgICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLldFU1QgLCBHcmlkQmFnQ29uc3RyYWludHMuTk9ORQotICAgICAgICAgICAgICAgICwgbmV3IEluc2V0cyg1LCAxMCwgMCwxMCksIDAsIDApKTsKLQotICAgICAgICB0aGlzLmFkZCh0eHRKYXJMb2NhdGlvbgotICAgICAgICAgICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygxLCAwLCBHcmlkQmFnQ29uc3RyYWludHMuUkVMQVRJVkUgLCAxLCAxLjAsIDAuMAotICAgICAgICAgICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLkNFTlRFUiAsIEdyaWRCYWdDb25zdHJhaW50cy5IT1JJWk9OVEFMCi0gICAgICAgICAgICAgICAgLCBuZXcgSW5zZXRzKDUsIDEsIDAsIDEwKSwgMCwgMCkpOwotCi0gICAgICAgIHR4dEphckxvY2F0aW9uLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpICB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIHVwZGF0ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICB0aGlzLmFkZChidXRTZWxlY3QKLSAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMiwgMCwgMSwgMSwgMC4xLCAwLjAKLSAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5DRU5URVIgLCBHcmlkQmFnQ29uc3RyYWludHMuTk9ORQotICAgICAgICAgICAgICAgICwgbmV3IEluc2V0cyg1LCAxMCwgMSwxMCksIDAsIDApKTsKLQotICAgICAgICBidXRTZWxlY3QuYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgYnJvc3dzZUphckZpbGUoKTsKLSAgICAgICAgICAgICAgICB1cGRhdGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgdGhpcy5hZGQoYnV0QWRkCi0gICAgICAgICAgICAgICAgLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDAsIDEsIDEsIDEsIDAuMSwgMC4wCi0gICAgICAgICAgICAgICAgLCBHcmlkQmFnQ29uc3RyYWludHMuQ0VOVEVSICAsIEdyaWRCYWdDb25zdHJhaW50cy5IT1JJWk9OVEFMCi0gICAgICAgICAgICAgICAgLCBuZXcgSW5zZXRzKDUsIDEwLCAxLDEpLCAwLCAwKSk7Ci0gICAgICAgIGJ1dEFkZC5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSAgewotICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBsaXN0TW9kZWwuYWRkRWxlbWVudCh0eHRKYXJMb2NhdGlvbi5nZXRUZXh0KCkgKTsKLSAgICAgICAgICAgICAgICB0eHRKYXJMb2NhdGlvbi5zZXRUZXh0KCIiKTsKLSAgICAgICAgICAgICAgICB1cGRhdGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgdGhpcy5hZGQoYnV0UmVtb3ZlCi0gICAgICAgICAgICAgICAgLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDEsIDEsIDEsIDEsIDEuMCwgMC4wCi0gICAgICAgICAgICAgICAgLCBHcmlkQmFnQ29uc3RyYWludHMuV0VTVCAgLCBHcmlkQmFnQ29uc3RyYWludHMuTk9ORQotICAgICAgICAgICAgICAgICwgbmV3IEluc2V0cyg1LCAxLCAxLDEpLCAyLCAwKSk7Ci0gICAgICAgIGJ1dFJlbW92ZSAuYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlUmVtb3ZlKCk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIHRoaXMuYWRkKG5ldyBKU2Nyb2xsUGFuZShsaXN0UGF0aERpc3BseSkKLSAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMCwgMiwgR3JpZEJhZ0NvbnN0cmFpbnRzLlJFTUFJTkRFUiwgMSwgMS4wLCAwLjAKLSAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5DRU5URVIgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLkhPUklaT05UQUwKLSAgICAgICAgICAgICAgICAsIG5ldyBJbnNldHMoNSwgMTAsIDEsMTApLCAwLCAwKSk7Ci0KLSAgICAgICAgdGhpcy5hZGQoYnRuSGludAotICAgICAgICAgICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygwLCAzLCAxLCAxLCAwLjEsMC4wCi0gICAgICAgICAgICAgICAgLCBHcmlkQmFnQ29uc3RyYWludHMuV0VTVCAsIEdyaWRCYWdDb25zdHJhaW50cy5OT05FCi0gICAgICAgICAgICAgICAgLCBuZXcgSW5zZXRzKDUsIDEwLCAwLCAxMCksIDAsIDApKTsKLSAgICAgICAgYnRuSGludC5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSAgewotICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBpZihmbGFnKXsKLSAgICAgICAgICAgICAgICAgICAgYnRuSGludC5zZXRUZXh0KCJIaW50ID4+Iik7Ci0gICAgICAgICAgICAgICAgICAgIHR4YUhpbnQuc2V0VGV4dCgiIik7Ci0gICAgICAgICAgICAgICAgICAgIGZsYWc9ZmFsc2U7Ci0gICAgICAgICAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICAgICAgICAgIGJ0bkhpbnQuc2V0VGV4dCgiSGludCA8PCIpOwotICAgICAgICAgICAgICAgICAgICB0eGFIaW50LnNldFRleHQoaGludCk7Ci0gICAgICAgICAgICAgICAgICAgIGZsYWc9dHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdXBkYXRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIHRoaXMuYWRkKHR4YUhpbnQKLSAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMCwgNCwgR3JpZEJhZ0NvbnN0cmFpbnRzLlJFTUFJTkRFUiwgMSwgMC4xLDEuMAotICAgICAgICAgICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLkNFTlRFUiAsIEdyaWRCYWdDb25zdHJhaW50cy5CT1RICi0gICAgICAgICAgICAgICAgLCBuZXcgSW5zZXRzKDUsIDEwLCAxMCwgMTApLCAwLCAwKSk7Ci0KLSAgICB9Ci0gICAgLy9uZXh0Ci0gICAgcHVibGljIHZvaWQgbmV4dCgpIHsKLSAgICAgICAgc3dpdGNoUGFuZWwoQ29kZWdlbkZyYW1lLlBBTkVMX0ZPVVJUSF9DICk7Ci0KLSAgICB9Ci0gICAgLy9iYWNrCi0gICAgcHVibGljIHZvaWQgYmFjaygpIHsKLSAgICAgICAgc3dpdGNoUGFuZWwoQ29kZWdlbkZyYW1lLlBBTkVMX1NFQ09ORF9DICk7Ci0gICAgfQotICAgIC8vdXBkYXRlCi0gICAgcHVibGljIHZvaWQgdXBkYXRlKCkgewotICAgICAgICBmaWxsQmVhbigpOwotICAgICAgICBzZXRQYWdlQ29tcGxldGUodHJ1ZSk7Ci0gICAgICAgIHNldE5leHRCdXR0b25FbmFibGVkKHRydWUpOwotICAgIH0KLQotICAgIC8vZ2V0IHBhZ2UgdHlwZQotICAgIHB1YmxpYyAgaW50IGdldFBhZ2VUeXBlKCkgewotICAgICAgICByZXR1cm4gIFdpemFyZFBhbmVsLlNFUlZJQ0VfQVJDSElWRV9UWVBFICA7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGJyb3N3c2VKYXJGaWxlKCl7Ci0gICAgICAgIGZpbGVDaG9vc2VyLnNldEZpbGVGaWx0ZXIobmV3IEphckZpbGVGaWx0ZXIoKSApOwotICAgICAgICBpbnQgcmV0dXJuVmFsPSBmaWxlQ2hvb3Nlci5zaG93T3BlbkRpYWxvZyhidXRBZGQpOwotICAgICAgICBpZihyZXR1cm5WYWwgPT0gSkZpbGVDaG9vc2VyIC5BUFBST1ZFX09QVElPTiApewotICAgICAgICAgICAgRmlsZSBmaWxlID0gZmlsZUNob29zZXIuZ2V0U2VsZWN0ZWRGaWxlKCk7Ci0gICAgICAgICAgICB0eHRKYXJMb2NhdGlvbi5zZXRUZXh0KGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgICAgICB9Ci0gICAgfQotICAgIHByaXZhdGUgdm9pZCBoYW5kbGVSZW1vdmUoKSB7Ci0gICAgICAgIGludFtdIHNlbGVjdGlvbkluZGljZXMgPSBsaXN0UGF0aERpc3BseSAuZ2V0U2VsZWN0ZWRJbmRpY2VzKCkgOwotICAgICAgICBmb3IgKGludCBpPTA7aTxzZWxlY3Rpb25JbmRpY2VzLmxlbmd0aDtpKyspewotICAgICAgICAgICAgbGlzdE1vZGVsIC5yZW1vdmUoc2VsZWN0aW9uSW5kaWNlc1tpXSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcHJpdmF0ZSB2b2lkIGZpbGxCZWFuKCl7Ci0gICAgICAgIEFycmF5TGlzdCB0ZW1wTGlzdD1hcmNoaXZlQmVhbi5nZXRMaWJzKCk7Ci0gICAgICAgIHRlbXBMaXN0LmFkZEFsbChnZXRKYXJQYXRobGlzdCgpKTsKLSAgICAgICAgYXJjaGl2ZUJlYW4uYWRkTGlicyh0ZW1wTGlzdCk7Ci0gICAgICAgIFVSTCB1cmxsaXN0W10gPSBuZXcgVVJMW2xpc3RNb2RlbC5zaXplKCkgKyAxXTsKLSAgICAgICAgQ2xhc3NMb2FkZXIgY2xzID0gbmV3IFVSTENsYXNzTG9hZGVyKHVybGxpc3QgLCBMaWJyYXJ5QWRkaW5nUGFnZS5jbGFzcy5nZXRDbGFzc0xvYWRlcigpKTsKLSAgICAgICAgYXJjaGl2ZUJlYW4uc2V0Q2xhc3NMb2FkZXIoY2xzKTsKLSAgICB9Ci0gICAgICAvL2dldCBjbGFzcyBwYXRoIGxpc3QKLSAgICBwdWJsaWMgQXJyYXlMaXN0IGdldEphclBhdGhsaXN0KCl7Ci0gICAgICAgIE9iamVjdCBbXSBsaXN0T2JqZWN0ID0gbGlzdE1vZGVsLnRvQXJyYXkoKSA7Ci0gICAgICAgIEFycmF5TGlzdCBsaXN0U3RyaW5nID1uZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGZvcihpbnQgaT0wIDtpPGxpc3RPYmplY3QubGVuZ3RoIDtpKyspewotICAgICAgICAgICAgbGlzdFN0cmluZy5hZGQobGlzdE9iamVjdFtpXS50b1N0cmluZygpKSA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGxpc3RTdHJpbmcgOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2lkZWFwbHVnaW4vZnJhbWVzL1BhcmFtZXRlckRpYWxvZy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaWRlYXBsdWdpbi9mcmFtZXMvUGFyYW1ldGVyRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3ODRmZWYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaWRlYXBsdWdpbi9mcmFtZXMvUGFyYW1ldGVyRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmlkZWFwbHVnaW4uZnJhbWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5pZGVhcGx1Z2luLmJlYW4uUGFyYW1ldGVyT2JqOwotCi1pbXBvcnQgamF2YXguc3dpbmcuKjsKLWltcG9ydCBqYXZhLmF3dC4qOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkV2ZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkxpc3RlbmVyOwotCi1wdWJsaWMgY2xhc3MgUGFyYW1ldGVyRGlhbG9nIGV4dGVuZHMgSkRpYWxvZyB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgUGFyYW1ldGVyRGlhbG9nIGRpYWxvZzsKLSAgICBwcml2YXRlIHN0YXRpYyBQYXJhbWV0ZXJPYmogcGFyYSA9bmV3IFBhcmFtZXRlck9iaigiIiwiIik7Ci0gICAgcHJpdmF0ZSBKVGV4dEZpZWxkIHR4dE5hbWU7Ci0gICAgcHJpdmF0ZSBKVGV4dEZpZWxkIHR4dFZhbHVlOwotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGluaXRpYWxpemUoQ29tcG9uZW50IGNvbXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRpdGxlKSB7Ci0gICAgICAgIEZyYW1lIGZyYW1lID0gSk9wdGlvblBhbmUuZ2V0RnJhbWVGb3JDb21wb25lbnQoY29tcCk7Ci0gICAgICAgIGRpYWxvZyA9IG5ldyBQYXJhbWV0ZXJEaWFsb2coZnJhbWUsdGl0bGUpOwotICAgICAgICBkaWFsb2cuc2V0UmVzaXphYmxlKGZhbHNlKTsKLSAgICAgICAgZGlhbG9nLnNldFNpemUoMjUwLDE1MCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBQYXJhbWV0ZXJPYmogc2hvd0RpYWxvZyhTdHJpbmcgdGl0bGUpIHsKLSAgICAgICAgaWYgKGRpYWxvZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBkaWFsb2cuc2V0VGl0bGUodGl0bGUpOwotICAgICAgICAgICAgZGlhbG9nLnNldFZpc2libGUodHJ1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHBhcmE7Ci0gICAgfQotCi0KLSAgICBwcml2YXRlIFBhcmFtZXRlckRpYWxvZyhGcmFtZSBmcmFtZSwgIFN0cmluZyB0aXRsZSkgewotICAgICAgICBzdXBlcihmcmFtZSwgdGl0bGUsIHRydWUpOwotCi0gICAgICAgIC8vYnV0dG9ucwotICAgICAgICBmaW5hbCBKQnV0dG9uIGNhbmNlbEJ1dHRvbiA9IG5ldyBKQnV0dG9uKCJDYW5jZWwiKTsKLSAgICAgICAgZmluYWwgSkJ1dHRvbiBzZXRCdXR0b24gPSBuZXcgSkJ1dHRvbigiIE9LICIpOwotICAgICAgICBjYW5jZWxCdXR0b24uYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBQYXJhbWV0ZXJEaWFsb2cgLmRpYWxvZy5zZXRWaXNpYmxlKGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIHNldEJ1dHRvbi5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIFBhcmFtZXRlckRpYWxvZy5wYXJhLnNldE5hbWUodHh0TmFtZS5nZXRUZXh0KCkpOwotICAgICAgICAgICAgICAgIFBhcmFtZXRlckRpYWxvZy5wYXJhLnNldFZhbHVlKHR4dFZhbHVlLmdldFRleHQoKSk7Ci0gICAgICAgICAgICAgICAgUGFyYW1ldGVyRGlhbG9nLmRpYWxvZy5zZXRWaXNpYmxlKGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGdldFJvb3RQYW5lKCkuc2V0RGVmYXVsdEJ1dHRvbihzZXRCdXR0b24pOwotICAgICAgICBnZXRSb290UGFuZSgpLnNldERlZmF1bHRCdXR0b24oY2FuY2VsQnV0dG9uKTsKLSAgICAgICAgLy9tYWluIHBhcnQgb2YgdGhlIGRpYWxvZwotCi0gICAgICAgIHR4dE5hbWUgPW5ldyBKVGV4dEZpZWxkKCk7Ci0gICAgICAgIHR4dFZhbHVlID1uZXcgSlRleHRGaWVsZCgpOwotCi0gICAgICAgIEpQYW5lbCBsaXN0UGFuZSA9IG5ldyBKUGFuZWwoKTsKLSAgICAgICAgbGlzdFBhbmUuc2V0TGF5b3V0KG5ldyBCb3hMYXlvdXQobGlzdFBhbmUsIEJveExheW91dC5QQUdFX0FYSVMpKTsKLSAgICAgICAgbGlzdFBhbmUuYWRkKEJveC5jcmVhdGVSaWdpZEFyZWEobmV3IERpbWVuc2lvbigxMCwwKSkpOwotICAgICAgICBsaXN0UGFuZS5hZGQobmV3IEpMYWJlbCgiTmFtZToiKSk7Ci0gICAgICAgIGxpc3RQYW5lLmFkZCh0eHROYW1lKTsKLSAgICAgICAgbGlzdFBhbmUuYWRkKG5ldyBKTGFiZWwoIlZhbHVlOiIpKTsKLSAgICAgICAgbGlzdFBhbmUuYWRkKHR4dFZhbHVlICk7Ci0gICAgICAgIGxpc3RQYW5lLnNldEJvcmRlcihCb3JkZXJGYWN0b3J5LmNyZWF0ZUVtcHR5Qm9yZGVyKDAsMTAsMTAsMTApKTsKLQotICAgICAgICAvL0xheSBvdXQgdGhlIGJ1dHRvbnMgZnJvbSBsZWZ0IHRvIHJpZ2h0LgotICAgICAgICBKUGFuZWwgYnV0dG9uUGFuZSA9IG5ldyBKUGFuZWwoKTsKLSAgICAgICAgYnV0dG9uUGFuZS5zZXRMYXlvdXQobmV3IEJveExheW91dChidXR0b25QYW5lLCBCb3hMYXlvdXQuWF9BWElTKSk7Ci0gICAgICAgIGJ1dHRvblBhbmUuc2V0Qm9yZGVyKEJvcmRlckZhY3RvcnkuY3JlYXRlRW1wdHlCb3JkZXIoMCwgMTAsIDEwLCAxMCkpOwotICAgICAgICBidXR0b25QYW5lLmFkZChCb3guY3JlYXRlSG9yaXpvbnRhbEdsdWUoKSk7Ci0gICAgICAgIGJ1dHRvblBhbmUuYWRkKGNhbmNlbEJ1dHRvbik7Ci0gICAgICAgIGJ1dHRvblBhbmUuYWRkKEJveC5jcmVhdGVSaWdpZEFyZWEobmV3IERpbWVuc2lvbigxMCwgMCkpKTsKLSAgICAgICAgYnV0dG9uUGFuZS5hZGQoc2V0QnV0dG9uKTsKLQotICAgICAgICAvL1B1dCBldmVyeXRoaW5nIHRvZ2V0aGVyLCB1c2luZyB0aGUgY29udGVudCBwYW5lJ3MgQm9yZGVyTGF5b3V0LgotICAgICAgICBDb250YWluZXIgY29udGVudFBhbmUgPSBnZXRDb250ZW50UGFuZSgpOwotICAgICAgICBjb250ZW50UGFuZS5hZGQobGlzdFBhbmUsIEJvcmRlckxheW91dC5DRU5URVIpOwotICAgICAgICBjb250ZW50UGFuZS5hZGQoYnV0dG9uUGFuZSwgQm9yZGVyTGF5b3V0LlNPVVRIKTsKLQotICAgICAgICBwYWNrKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9pZGVhcGx1Z2luL2ZyYW1lcy9TZXJ2aWNlQXJjaGl2ZU91dHB1dExvY2F0aW9uUGFnZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaWRlYXBsdWdpbi9mcmFtZXMvU2VydmljZUFyY2hpdmVPdXRwdXRMb2NhdGlvblBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdkOGVmZC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9pZGVhcGx1Z2luL2ZyYW1lcy9TZXJ2aWNlQXJjaGl2ZU91dHB1dExvY2F0aW9uUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5pZGVhcGx1Z2luLmZyYW1lczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbHMuY29tcG9uZW50LldpemFyZENvbXBvbmVudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29scy5jb21wb25lbnQuV2l6YXJkUGFuZWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29scy53aXphcmRmcmFtZS5Db2RlZ2VuRnJhbWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5pZGVhcGx1Z2luLmJlYW4uQXJjaGl2ZUJlYW47Ci0KLWltcG9ydCBqYXZheC5zd2luZy4qOwotaW1wb3J0IGphdmF4LnN3aW5nLmJvcmRlci5FbXB0eUJvcmRlcjsKLWltcG9ydCBqYXZhLmF3dC4qOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkV2ZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkxpc3RlbmVyOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotCi1wdWJsaWMgY2xhc3MgU2VydmljZUFyY2hpdmVPdXRwdXRMb2NhdGlvblBhZ2UgIGV4dGVuZHMgV2l6YXJkUGFuZWwgewotCi0gICAgcHJpdmF0ZSBKVGV4dEZpZWxkIHR4dExvY2F0aW9uOwotICAgIHByaXZhdGUgSlRleHRGaWVsZCB0eHRGaWxlTmFtZTsKLSAgICBwcml2YXRlIEpCdXR0b24gYnRuQnJvd2VzOwotICAgIHByaXZhdGUgSkJ1dHRvbiBidG5IaW50OwotICAgIHByaXZhdGUgSlRleHRBcmVhIHR4YUhpbnQ7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGZsYWc9ZmFsc2U7Ci0gICAgZmluYWwgSkZpbGVDaG9vc2VyIERpckNob29zZXI9bmV3IEpGaWxlQ2hvb3NlcigpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGhpbnQ9IiI7Ci0gICAgcHJpdmF0ZSBBcmNoaXZlQmVhbiBhcmNoaXZlQmVhbjsKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvcgotICAgICAqIEBwYXJhbSB3aXphcmRDb21wb25lbnRzCi0gICAgICovCi0gICAgcHVibGljIFNlcnZpY2VBcmNoaXZlT3V0cHV0TG9jYXRpb25QYWdlKFdpemFyZENvbXBvbmVudHMgd2l6YXJkQ29tcG9uZW50cywgQXJjaGl2ZUJlYW4gYXJjaGl2ZUJlYW4pewotICAgICAgICBzdXBlcih3aXphcmRDb21wb25lbnRzLCAiQXhpczIgSWRlYSBQbHVnaW4gU2VydmljZSBBcmNoaXZlciBDcmVhdG9yIFdpemFyZHMiKTsKLSAgICAgICAgc2V0UGFuZWxUb3BUaXRsZSgiU2VydmljZSBBcmNoaXZlciIpOwotICAgICAgICBzZXRQYW5lbEJvdHRvbVRpdGxlKCJTZWxlY3QgdGhlIGxvY2F0aW9uIGZvciB0aGUgZ2VuZXJhdGVkIEFyY2hpdmVyIik7Ci0gICAgICAgIHRoaXMuYXJjaGl2ZUJlYW49YXJjaGl2ZUJlYW47Ci0gICAgICAgIGluaXQoKTsKLSAgICB9Ci0gICAgcHJpdmF0ZSB2b2lkIGluaXQoKXsKLSAgICAgICAgdHhhSGludCA9bmV3IEpUZXh0QXJlYSgpOwotICAgICAgICB0eGFIaW50LnNldEJvcmRlcihudWxsKTsKLSAgICAgICAgdHhhSGludC5zZXRGb2N1c2FibGUoZmFsc2UpOwotICAgICAgICB0eGFIaW50LnNldExpbmVXcmFwKHRydWUpOwotICAgICAgICB0eGFIaW50LnNldFdyYXBTdHlsZVdvcmQodHJ1ZSk7Ci0gICAgICAgIHR4YUhpbnQuc2V0T3BhcXVlKGZhbHNlKTsKLQotICAgICAgICBidG5IaW50ID1uZXcgSkJ1dHRvbigiSGludCA+PiIpOwotICAgICAgICBidG5IaW50LnNldEJvcmRlcihuZXcgRW1wdHlCb3JkZXIobmV3IEluc2V0cygwLDAsMCwwKSkpOwotCi0gICAgICAgIHR4dEZpbGVOYW1lID1uZXcgSlRleHRGaWVsZCgiU2VydmljZV9BcmNoaXZlciIpOwotCi0gICAgICAgIHR4dExvY2F0aW9uPW5ldyBKVGV4dEZpZWxkKCk7Ci0KLSAgICAgICAgYnRuQnJvd2VzPW5ldyBKQnV0dG9uKCJCcm93c2UuLiIpOwotCi0gICAgICAgIHNldEJhY2tCdXR0b25FbmFibGVkKHRydWUpOwotICAgICAgICBzZXROZXh0QnV0dG9uRW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIHNldEZpbmlzaEJ1dHRvbkVuYWJsZWQoZmFsc2UpOwotICAgICAgICB0aGlzLnNldExheW91dChuZXcgR3JpZEJhZ0xheW91dCgpKTsKLQotICAgICAgICB0aGlzLmFkZChuZXcgSkxhYmVsKCJPdXRQdXQgRmlsZSBOYW1lIikKLSAgICAgICAgICAgICAgICAgICAgICAgLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDAsIDAsIDEsIDEsIDAuMSwgMC4wCi0gICAgICAgICAgICAgICAgICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLk5PUlRIV0VTVCAgLCBHcmlkQmFnQ29uc3RyYWludHMuTk9ORQotICAgICAgICAgICAgICAgICAgICAgICAsIG5ldyBJbnNldHMoNSwgMTAsIDAsIDApLCAwLCAwKSk7Ci0KLSAgICAgICAgICAgICAgIHRoaXMuYWRkKHR4dEZpbGVOYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygxLCAwLCAxLCAxLCAxLjAsIDAuMAotICAgICAgICAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5OT1JUSFdFU1QgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLkhPUklaT05UQUwKLSAgICAgICAgICAgICAgICAgICAgICAgLCBuZXcgSW5zZXRzKDUsIDEwLCAwLCAwKSwgMCwgMCkpOwotCi0gICAgICAgIHRoaXMuYWRkKG5ldyBKTGFiZWwoIk91dFB1dCBMb2NhdGlvbiIpCi0gICAgICAgICAgICAgICAgLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDAsIDEsIDEsIDEsIDAuMSwgMC4wCi0gICAgICAgICAgICAgICAgLCBHcmlkQmFnQ29uc3RyYWludHMuV0VTVCAgLCBHcmlkQmFnQ29uc3RyYWludHMuTk9ORQotICAgICAgICAgICAgICAgICwgbmV3IEluc2V0cyg1LCAxMCwgMCwwKSwgMCwgMCkpOwotCi0gICAgICAgIHRoaXMuYWRkKHR4dExvY2F0aW9uCi0gICAgICAgICAgICAgICAgLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDEsIDEsIDEsIDEsIDEuMCwgMC4wCi0gICAgICAgICAgICAgICAgLCBHcmlkQmFnQ29uc3RyYWludHMuV0VTVCAgLCBHcmlkQmFnQ29uc3RyYWludHMuSE9SSVpPTlRBTAotICAgICAgICAgICAgICAgICwgbmV3IEluc2V0cyg1LCAxMCwgMCwgMCksIDAsIDApKTsKLQotICAgICAgICB0aGlzLmFkZChidG5Ccm93ZXMKLSAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMiwgMSwgMSwgMSwgMC4xLCAwLjAKLSAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5DRU5URVIgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLk5PTkUKLSAgICAgICAgICAgICAgICAsIG5ldyBJbnNldHMoNSwgMTAsIDAsIDEwKSwgMCwgMCkpOwotCi0gICAgICAgIGJ0bkJyb3dlcy5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSAgewotICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBEaXJDaG9vc2VyIC5zZXRGaWxlU2VsZWN0aW9uTW9kZShKRmlsZUNob29zZXIuRElSRUNUT1JJRVNfT05MWSk7Ci0gICAgICAgICAgICAgICAgaW50IHJldHVyblZhbCA9IERpckNob29zZXIuc2hvd09wZW5EaWFsb2coYnRuQnJvd2VzICk7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHVyblZhbCA9PSBKRmlsZUNob29zZXIuQVBQUk9WRV9PUFRJT04pIHsKLSAgICAgICAgICAgICAgICAgICAgRGlyQ2hvb3Nlci5zZXRGaWxlU2VsZWN0aW9uTW9kZShKRmlsZUNob29zZXIgLkZJTEVTX09OTFkgKTsKLSAgICAgICAgICAgICAgICAgICAgRmlsZSBuZXdmaWxlID0gRGlyQ2hvb3Nlci5nZXRTZWxlY3RlZEZpbGUoKTsKLSAgICAgICAgICAgICAgICAgICAgdHh0TG9jYXRpb24uc2V0VGV4dChuZXdmaWxlLmdldEFic29sdXRlUGF0aCgpICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHVwZGF0ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgdGhpcy5hZGQoYnRuSGludCwKLSAgICAgICAgICAgICAgICBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDAsIDIsIDEsIDEsIDAuMSwwLjAKLSAgICAgICAgICAgICAgICAgICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLldFU1QgLCBHcmlkQmFnQ29uc3RyYWludHMuTk9ORQotICAgICAgICAgICAgICAgICAgICAgICAgLCBuZXcgSW5zZXRzKDUsIDEwLCAwLCAxMCksIDAsIDApKTsKLSAgICAgICAgYnRuSGludC5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSAgewotICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBpZihmbGFnKXsKLSAgICAgICAgICAgICAgICAgICAgYnRuSGludC5zZXRUZXh0KCJIaW50ID4+Iik7Ci0gICAgICAgICAgICAgICAgICAgIHR4YUhpbnQuc2V0VGV4dCgiIik7Ci0gICAgICAgICAgICAgICAgICAgIGZsYWc9ZmFsc2U7Ci0gICAgICAgICAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICAgICAgICAgIGJ0bkhpbnQuc2V0VGV4dCgiSGludCA8PCIpOwotICAgICAgICAgICAgICAgICAgICB0eGFIaW50LnNldFRleHQoaGludCk7Ci0gICAgICAgICAgICAgICAgICAgIGZsYWc9dHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdXBkYXRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIHRoaXMuYWRkKHR4YUhpbnQKLSAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMCwgMywgR3JpZEJhZ0NvbnN0cmFpbnRzLlJFTUFJTkRFUiwgMSwgMC4xLDEuMAotICAgICAgICAgICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLkNFTlRFUiAsIEdyaWRCYWdDb25zdHJhaW50cy5CT1RICi0gICAgICAgICAgICAgICAgLCBuZXcgSW5zZXRzKDUsIDEwLCAxMCwgMTApLCAwLCAwKSk7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCBiYWNrKCkgewotICAgICAgICBpZighKChTZXJ2aWNlWE1MRmlsZVNlbGVjdGlvblBhZ2UpZ2V0V2l6YXJkQ29tcG9uZW50cygpLmdldFdpemFyZFBhbmVsKENvZGVnZW5GcmFtZS5QQU5FTF9GT1VSVEhfQykpLmlzSW5jbHVkZVhtbCgpKXsKLSAgICAgICAgICAgICBzd2l0Y2hQYW5lbChDb2RlZ2VuRnJhbWUuUEFORUxfRk9VUlRIX0MgKTsKLSAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICBzd2l0Y2hQYW5lbChDb2RlZ2VuRnJhbWUuUEFORUxfT1BUSU9OX0MgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG5leHQoKSB7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB1cGRhdGUoKXsKLSAgICAgICAgaWYoIXR4dEZpbGVOYW1lLmdldFRleHQoKSAuZXF1YWxzKCIiKSl7Ci0gICAgICAgICAgICBhcmNoaXZlQmVhbi5zZXRBcmNoaXZlTmFtZSh0eHRGaWxlTmFtZS5nZXRUZXh0KCkpOwotICAgICAgICB9Ci0gICAgICAgIGlmKCF0eHRMb2NhdGlvbiAuZ2V0VGV4dCgpIC5lcXVhbHMoIiIpKXsKLSAgICAgICAgICAgaWYobmV3IEZpbGUodHh0TG9jYXRpb24uZ2V0VGV4dCgpKS5pc0RpcmVjdG9yeSgpKQotICAgICAgICAgICAgICAgIGFyY2hpdmVCZWFuLnNldE91dFBhdGgodHh0TG9jYXRpb24uZ2V0VGV4dCgpKTsKLSAgICAgICAgfQotICAgICAgICBzZXRCYWNrQnV0dG9uRW5hYmxlZCh0cnVlKTsKLSAgICAgICAgc2V0TmV4dEJ1dHRvbkVuYWJsZWQoZmFsc2UpOwotCi0gICAgfQotICAgIHB1YmxpYyAgaW50IGdldFBhZ2VUeXBlKCkgewotICAgICAgICByZXR1cm4gIFdpemFyZFBhbmVsLlNFUlZJQ0VfQVJDSElWRV9UWVBFOwotICAgIH0KLX0KLSAKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2lkZWFwbHVnaW4vZnJhbWVzL1NlcnZpY2VYTUxFZGl0UGFnZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaWRlYXBsdWdpbi9mcmFtZXMvU2VydmljZVhNTEVkaXRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2YzkwZGIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaWRlYXBsdWdpbi9mcmFtZXMvU2VydmljZVhNTEVkaXRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmlkZWFwbHVnaW4uZnJhbWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29scy5jb21wb25lbnQuV2l6YXJkQ29tcG9uZW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRvb2xzLmNvbXBvbmVudC5XaXphcmRQYW5lbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRvb2xzLndpemFyZGZyYW1lLkNvZGVnZW5GcmFtZTsKLWltcG9ydCBvcmcuYXBhY2hlLmlkZWFwbHVnaW4uYmVhbi5BcmNoaXZlQmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLmlkZWFwbHVnaW4uYmVhbi5QYXJhbWV0ZXJPYmo7Ci1pbXBvcnQgb3JnLmFwYWNoZS5pZGVhcGx1Z2luLmJlYW4uVmFsaWRhdGVYTUxGaWxlOwotCi1pbXBvcnQgamF2YXguc3dpbmcuKjsKLWltcG9ydCBqYXZhLmF3dC4qOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkV2ZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkxpc3RlbmVyOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50Lk1vdXNlRXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuTW91c2VMaXN0ZW5lcjsKLQotcHVibGljIGNsYXNzIFNlcnZpY2VYTUxFZGl0UGFnZSBleHRlbmRzIFdpemFyZFBhbmVsIHsKLSAgICBwcm90ZWN0ZWQgSlRleHRBcmVhIGRlc0FyZWE7Ci0gICAgcHJvdGVjdGVkIEpCdXR0b24gYWRkcGFyYTsKLSAgICBwcm90ZWN0ZWQgSkJ1dHRvbiBhZGRNb2R1bGVSZWY7Ci0gICAgcHJvdGVjdGVkIEpCdXR0b24gdmFsaWRhdGVYTUw7Ci0gICAgcHJpdmF0ZSBKQnV0dG9uIHJlR2VuZXJhdGU7Ci0gICAgcHJvdGVjdGVkIEpTY3JvbGxQYW5lIHNwOwotICAgIHByaXZhdGUgSkxhYmVsIGxibGVycm9yOwotICAgICBwcml2YXRlIEFyY2hpdmVCZWFuIGFyY2hpdmVCZWFuOwotCi0gICAgIHB1YmxpYyBTZXJ2aWNlWE1MRWRpdFBhZ2UoV2l6YXJkQ29tcG9uZW50cyB3aXphcmRDb21wb25lbnRzLCBBcmNoaXZlQmVhbiBhcmNoaXZlQmVhbil7Ci0gICAgICAgIHN1cGVyKHdpemFyZENvbXBvbmVudHMsICJBeGlzMiBJZGVhIFBsdWdpbiBTZXJ2aWNlIEFyY2hpdmVyIENyZWF0b3IgV2l6YXJkcyIpOwotICAgICAgICBzZXRQYW5lbFRvcFRpdGxlKCJTZXJ2aWNlIEFyY2hpdmVyIik7Ci0gICAgICAgIHNldFBhbmVsQm90dG9tVGl0bGUoIkVkaXQgdGhlIGdlbmVyYXRlZCBzZXJ2aWNlLnhtbCIpOwotICAgICAgICAgIHRoaXMuYXJjaGl2ZUJlYW49YXJjaGl2ZUJlYW47Ci0gICAgICAgIGluaXQoKTsKLSAgICB9Ci0gICAgcHVibGljIHZvaWQgaW5pdCgpewotICAgICAgICBQYXJhbWV0ZXJEaWFsb2cuaW5pdGlhbGl6ZShhZGRwYXJhLCAiUGFyYW1ldGVyIERpYWxvZyIpOwotICAgICAgICBhZGRwYXJhID0gbmV3IEpCdXR0b24oIitQYXJhbWV0ZXIgIik7Ci0gICAgICAgIGFkZHBhcmEuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIGFkZE1vZHVsZVJlZiA9IG5ldyBKQnV0dG9uKCIrTW9kdWxlUmVmICIpOwotICAgICAgICBhZGRNb2R1bGVSZWYuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIHZhbGlkYXRlWE1MID1uZXcgSkJ1dHRvbigiVmFsaWRhdGUgWE1MIik7Ci0gICAgICAgIHJlR2VuZXJhdGU9bmV3IEpCdXR0b24oIlJlR2VuZXJhdGUgWE1MIik7Ci0gICAgICAgIGxibGVycm9yPW5ldyBKTGFiZWwoKTsKLSAgICAgICAgZGVzQXJlYSA9IG5ldyBKVGV4dEFyZWEoIiIpOwotICAgICAgICBzcCA9IG5ldyBKU2Nyb2xsUGFuZShkZXNBcmVhKTsKLSAgICAgICAgc3Auc2V0QXV0b3Njcm9sbHModHJ1ZSk7Ci0gICAgICAgIHRoaXMuc2V0TGF5b3V0KG5ldyBHcmlkQmFnTGF5b3V0KCkpOwotICAgICAgICBzZXREZWZhdWx0RW5hYmxlZCgpOwotCi0gICAgICAgICB0aGlzLmFkZChhZGRwYXJhCi0gICAgICAgICAgICAgICAgLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDAsIDAsIDEsIDEsIDEuMCwgMC4wCi0gICAgICAgICAgICAgICAgLCBHcmlkQmFnQ29uc3RyYWludHMuQ0VOVEVSICwgR3JpZEJhZ0NvbnN0cmFpbnRzLk5PTkUKLSAgICAgICAgICAgICAgICAsIG5ldyBJbnNldHMoNSwgMSwgMCwgMTApLCAwLCAwKSk7Ci0KLSAgICAgICBhZGRwYXJhLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpICB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIFBhcmFtZXRlck9iaiBzZWxlY3RlZE5hbWU9UGFyYW1ldGVyRGlhbG9nLnNob3dEaWFsb2coIlBhcmFtZXRlciBEaWFsb2ciKTsKLSAgICAgICAgICAgICAgICBzZXRQYXJhbWV0ZXIoc2VsZWN0ZWROYW1lKTsKLSAgICAgICAgICAgICAgICBzZXRFbmFibGVkVG9Ob3RWYWxpZGF0ZSgpOwotICAgICAgICAgICAgICAgIHVwZGF0ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICB0aGlzLmFkZChhZGRNb2R1bGVSZWYKLSAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMSwgMCwgMSwgMSwgMS4wLCAwLjAKLSAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5DRU5URVIgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLk5PTkUKLSAgICAgICAgICAgICAgICAsIG5ldyBJbnNldHMoNSwgMTAsIDEsMTApLCAwLCAwKSk7Ci0KLSAgICAgICAgYWRkTW9kdWxlUmVmLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpICB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBtb2R1bGVOYW1lID0gKFN0cmluZylKT3B0aW9uUGFuZS5zaG93SW5wdXREaWFsb2coCi0gICAgICAgICAgICAgICAgICAgICAgICBhZGRNb2R1bGVSZWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAiTW9kdWxlIE5hbWUiLCJNb2R1bGUgRGlhbG9nIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEpPcHRpb25QYW5lLlBMQUlOX01FU1NBR0UpOwotICAgICAgICAgICAgICAgIHNldE1vZHVsZShtb2R1bGVOYW1lKTsKLSAgICAgICAgICAgICAgICBzZXRFbmFibGVkVG9Ob3RWYWxpZGF0ZSgpOwotICAgICAgICAgICAgICAgIHVwZGF0ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgIHRoaXMuYWRkKHZhbGlkYXRlWE1MCi0gICAgICAgICAgICAgICAgLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDIsIDAsIDEsIDEsIDEuMCwgMC4wCi0gICAgICAgICAgICAgICAgLCBHcmlkQmFnQ29uc3RyYWludHMuQ0VOVEVSICAsIEdyaWRCYWdDb25zdHJhaW50cy5OT05FCi0gICAgICAgICAgICAgICAgLCBuZXcgSW5zZXRzKDUsIDEwLCAxLDEwKSwgMCwgMCkpOwotCi0gICAgICAgIHZhbGlkYXRlWE1MLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpICB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGlmKG5ldyBWYWxpZGF0ZVhNTEZpbGUoKS5WYWxpZGF0ZSgiPD94bWwgdmVyc2lvbj1cIjEuMFwiPz5cbiIrZGVzQXJlYS5nZXRUZXh0KCkpKSAgewotICAgICAgICAgICAgICAgICAgICBzZXRFbmFibGVkVG9WYWxpZGF0ZSgpOwotICAgICAgICAgICAgICAgICAgICBsYmxlcnJvci5zZXRUZXh0KCJTZXJ2aWNlIFhNTCBmaWxlIHZhbGlkYXRpb24gc3VjY2Vzc2Z1bGx5Iik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlewotICAgICAgICAgICAgICAgICAgICBzZXRFbmFibGVkVG9Ob3RWYWxpZGF0ZSgpOwotICAgICAgICAgICAgICAgICAgICBsYmxlcnJvci5zZXRUZXh0KCJFcnJvciEgU2VydmljZSBYTUwgZmlsZSB2YWxpZGF0aW9uIEVycm9yIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdXBkYXRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICAgdGhpcy5hZGQocmVHZW5lcmF0ZQotICAgICAgICAgICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygzLCAwLCAxLCAxLCAxLjAsIDAuMAotICAgICAgICAgICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLkNFTlRFUiAgLCBHcmlkQmFnQ29uc3RyYWludHMuTk9ORQotICAgICAgICAgICAgICAgICwgbmV3IEluc2V0cyg1LCAxMCwgMSwxMCksIDAsIDApKTsKLQotICAgICAgICByZUdlbmVyYXRlLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpICB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGRlc0FyZWEuc2V0VGV4dCgiIik7Ci0gICAgICAgICAgICAgICAgZGVzQXJlYS5zZXRUZXh0KGFyY2hpdmVCZWFuLmdldFNlcnZpY2VYTUwoKSk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICB0aGlzLmFkZChzcAotICAgICAgICAgICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygwLCAxLEdyaWRCYWdDb25zdHJhaW50cy5SRU1BSU5ERVIsIDEsIDEuMCwgMS4wCi0gICAgICAgICAgICAgICAgLCBHcmlkQmFnQ29uc3RyYWludHMuV0VTVCAsIEdyaWRCYWdDb25zdHJhaW50cy5CT1RICi0gICAgICAgICAgICAgICAgLCBuZXcgSW5zZXRzKDUsIDEwLCAxMCwxMCksIDAsIDApKTsKLSAgICAgICAgZGVzQXJlYS5hZGRNb3VzZUxpc3RlbmVyKG5ldyBNb3VzZUxpc3RlbmVyKCl7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBtb3VzZUNsaWNrZWQoTW91c2VFdmVudCBlKXsKLSAgICAgICAgICAgICAgICBhZGRwYXJhLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgYWRkTW9kdWxlUmVmLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBtb3VzZVByZXNzZWQoTW91c2VFdmVudCBlKXt9Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBtb3VzZVJlbGVhc2VkKE1vdXNlRXZlbnQgZSl7fQotICAgICAgICAgICAgcHVibGljIHZvaWQgbW91c2VFbnRlcmVkKE1vdXNlRXZlbnQgZSl7fQotICAgICAgICAgICAgcHVibGljIHZvaWQgbW91c2VFeGl0ZWQoTW91c2VFdmVudCBlKXt9Ci0gICAgICAgIH0pOwotICAgICAgICB0aGlzLmFkZChsYmxlcnJvcgotICAgICAgICAgICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygwLDIsR3JpZEJhZ0NvbnN0cmFpbnRzLlJFTUFJTkRFUiwgMSwgMS4wLDAuMAotICAgICAgICAgICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLldFU1QgLCBHcmlkQmFnQ29uc3RyYWludHMuTk9ORQotICAgICAgICAgICAgICAgICwgbmV3IEluc2V0cyg1LCAyMCwgMTAsMTApLCAwLCAwKSk7Ci0KLSAgICB9Ci0KLSAgICAvL25leHQKLSAgICBwdWJsaWMgdm9pZCBuZXh0KCkgewotICAgICAgICBpZighYXJjaGl2ZUJlYW4uZ2V0U2VydmljZVhNTCgpLmVxdWFscygiIikgKXsKLSAgICAgICAgICAgYXJjaGl2ZUJlYW4uc2V0U2VydmljZVhNTChkZXNBcmVhLmdldFRleHQoKSk7Ci0gICAgICAgICB9Ci0gICAgICAgICAgICBzd2l0Y2hQYW5lbChDb2RlZ2VuRnJhbWUuUEFORUxfTEFTVF9DICk7Ci0KLSAgICB9Ci0gICAgLy9iYWNrCi0gICAgcHVibGljIHZvaWQgYmFjaygpIHsKLSAgICAgICAgc3dpdGNoUGFuZWwoQ29kZWdlbkZyYW1lLlBBTkVMX0xPQURfQyApOwotICAgIH0KLSAgICAvL3VwZGF0ZQotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQotICAgIH0KLQotICAgIC8vZ2V0IHBhZ2UgdHlwZQotICAgIHB1YmxpYyAgaW50IGdldFBhZ2VUeXBlKCkgewotICAgICAgICByZXR1cm4gIFdpemFyZFBhbmVsLlNFUlZJQ0VfQVJDSElWRV9UWVBFOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwKXsKLSAgICAgICAgdGhpcy5kZXNBcmVhLnNldFRleHQoZGVzY3JpcCk7Ci0gICAgICAgIHVwZGF0ZSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZXRFbmFibGVkVG9WYWxpZGF0ZSgpewotICAgICAgICBzZXROZXh0QnV0dG9uRW5hYmxlZCh0cnVlKTsKLSAgICAgICAgcmVHZW5lcmF0ZS5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgYWRkcGFyYS5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgYWRkTW9kdWxlUmVmLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICBzZXRQYWdlQ29tcGxldGUodHJ1ZSk7Ci0gICAgfQotICAgIHByaXZhdGUgdm9pZCBzZXRFbmFibGVkVG9Ob3RWYWxpZGF0ZSgpewotICAgICAgICByZUdlbmVyYXRlLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgIHNldE5leHRCdXR0b25FbmFibGVkKGZhbHNlKTsKLSAgICAgICAgc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsKLSAgICAgICAgYWRkcGFyYS5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgYWRkTW9kdWxlUmVmLnNldEVuYWJsZWQoZmFsc2UpOwotICAgIH0KLSAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0RW5hYmxlZCgpewotICAgICAgICBsYmxlcnJvci5zZXRUZXh0KCIiKTsKLSAgICAgICAgYWRkcGFyYS5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgYWRkTW9kdWxlUmVmLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICB2YWxpZGF0ZVhNTC5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICByZUdlbmVyYXRlLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICBzZXROZXh0QnV0dG9uRW5hYmxlZChmYWxzZSk7Ci0gICAgfQotICAgIHByaXZhdGUgdm9pZCBzZXRQYXJhbWV0ZXIoUGFyYW1ldGVyT2JqIG9iail7Ci0gICAgICAgaW50IHBvc2l0aW9uID0gZGVzQXJlYS5nZXRDYXJldFBvc2l0aW9uKCk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihkZXNBcmVhLmdldExpbmVDb3VudCgpKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGRlc0FyZWEuZ2V0Q2FyZXRQb3NpdGlvbigpKTsKLSAgICAgICAgU3RyaW5nIHN0ciA9ICIgICAgICA8cGFyYW1ldGVyIG5hbWU9XCIiICsgb2JqLmdldE5hbWUoKSArICJcIiBsb2NrZWQ9XCJmYWxzZVwiPiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG9iai5nZXRWYWx1ZSgpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPC9wYXJhbWV0ZXI+XG4iOwotICAgICAgICBkZXNBcmVhLmluc2VydChzdHIsIHBvc2l0aW9uICsgMSk7Ci0gICAgfQotICAgIHByaXZhdGUgdm9pZCBzZXRNb2R1bGUoU3RyaW5nIG1vZHVsZSl7Ci0gICAgICAgIGludCBwb3NpdGlvbiA9IGRlc0FyZWEuZ2V0Q2FyZXRQb3NpdGlvbigpOwotICAgICAgICBTdHJpbmcgc3RyID0gIiAgICAgIDxtb2R1bGUgcmVmPVwiIiArIG1vZHVsZSArICJcIiAvPlxuIjsKLSAgICAgICAgZGVzQXJlYSAuaW5zZXJ0KHN0ciwgcG9zaXRpb24gKyAxKTsKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2lkZWFwbHVnaW4vZnJhbWVzL1NlcnZpY2VYTUxGaWxlU2VsZWN0aW9uUGFnZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaWRlYXBsdWdpbi9mcmFtZXMvU2VydmljZVhNTEZpbGVTZWxlY3Rpb25QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNmE1MTAuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaWRlYXBsdWdpbi9mcmFtZXMvU2VydmljZVhNTEZpbGVTZWxlY3Rpb25QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmlkZWFwbHVnaW4uZnJhbWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29scy5jb21wb25lbnQuV2l6YXJkQ29tcG9uZW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRvb2xzLmNvbXBvbmVudC5XaXphcmRQYW5lbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRvb2xzLndpemFyZGZyYW1lLkNvZGVnZW5GcmFtZTsKLWltcG9ydCBvcmcuYXBhY2hlLmlkZWFwbHVnaW4uYmVhbi5BcmNoaXZlQmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLmlkZWFwbHVnaW4uYmVhbi5YbWxGaWxlRmlsdGVyOwotCi1pbXBvcnQgamF2YXguc3dpbmcuKjsKLWltcG9ydCBqYXZheC5zd2luZy5ib3JkZXIuRW1wdHlCb3JkZXI7Ci1pbXBvcnQgamF2YS5hd3QuKjsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotLyoqCi0gKiBDcmVhdGVkIGJ5IEludGVsbGlKIElERUEuCi0gKiBVc2VyOiBzaGl2YW50aGEKLSAqIERhdGU6IDE3LzA3LzIwMDcKLSAqIFRpbWU6IDA5OjQ1OjAzCi0gKiBUbyBjaGFuZ2UgdGhpcyB0ZW1wbGF0ZSB1c2UgRmlsZSB8IFNldHRpbmdzIHwgRmlsZSBUZW1wbGF0ZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlWE1MRmlsZVNlbGVjdGlvblBhZ2UgZXh0ZW5kcyBXaXphcmRQYW5lbCB7Ci0gICAgLyoqCi0gICAgICogdmFyaWFsYmFsZXMKLSAgICAgKi8KLSAgICBwcml2YXRlIEpMYWJlbCBsYmxYbWxMb2NhdGlvbjsKLSAgICBwcml2YXRlIEpUZXh0RmllbGQgdHh0U2VydmljZVhtbDsKLSAgICBwcml2YXRlIEpCdXR0b24gYnV0U2VsZWN0OwotICAgIHByaXZhdGUgSkNoZWNrQm94IGNoa0JveEluY2x1ZGVYbWw7Ci0gICAgcHJpdmF0ZSBKQnV0dG9uIGJ0bkhpbnQ7Ci0gICAgcHJpdmF0ZSBKVGV4dEFyZWEgdHhhSGludDsKLSAgICBwcml2YXRlIGJvb2xlYW4gZmxhZz1mYWxzZTsKLSAgICBwcml2YXRlIFN0cmluZyBoaW50ID0iIjsKLSAgICBwcml2YXRlIGZpbmFsIEpGaWxlQ2hvb3NlciBmaWxlQ2hvb3Nlcj1uZXcgSkZpbGVDaG9vc2VyKCk7Ci0gICAgcHJpdmF0ZSBBcmNoaXZlQmVhbiBhcmNoaXZlQmVhbjsKLSAgICBwcml2YXRlIFN0cmluZyB2YWx1ZTsKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvcgotICAgICAqIEBwYXJhbSB3aXphcmRDb21wb25lbnRzCi0gICAgICovCi0gICAgcHVibGljIFNlcnZpY2VYTUxGaWxlU2VsZWN0aW9uUGFnZShXaXphcmRDb21wb25lbnRzIHdpemFyZENvbXBvbmVudHMsQXJjaGl2ZUJlYW4gYXJjaGl2ZUJlYW4gKSB7Ci0gICAgICAgIHN1cGVyKHdpemFyZENvbXBvbmVudHMsICJBeGlzMiBJZGVhIFBsdWdpbiBTZXJ2aWNlIEFyY2hpdmVyIENyZWF0b3IgV2l6YXJkcyIpOwotICAgICAgICBzZXRQYW5lbFRvcFRpdGxlKCJTZXJ2aWNlIEFyY2hpdmVyIik7Ci0gICAgICAgIHNldFBhbmVsQm90dG9tVGl0bGUoIlNlbGVjdCB0aGUgc2VydmljZS54bWwgZmlsZSIpOwotICAgICAgICB0aGlzLmFyY2hpdmVCZWFuPWFyY2hpdmVCZWFuOwotICAgICAgICBpbml0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogaW5pdGlhdGUgcGFuZWwKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgaW5pdCgpewotCi0gICAgICAgIHR4YUhpbnQgPW5ldyBKVGV4dEFyZWEoKTsKLSAgICAgICAgdHhhSGludC5zZXRCb3JkZXIobnVsbCk7Ci0gICAgICAgIHR4YUhpbnQuc2V0Rm9jdXNhYmxlKGZhbHNlKTsKLSAgICAgICAgdHhhSGludC5zZXRMaW5lV3JhcCh0cnVlKTsKLSAgICAgICAgdHhhSGludC5zZXRXcmFwU3R5bGVXb3JkKHRydWUpOwotICAgICAgICB0eGFIaW50LnNldE9wYXF1ZShmYWxzZSk7Ci0KLSAgICAgICAgYnRuSGludCA9bmV3IEpCdXR0b24oIkhpbnQgPj4iKTsKLSAgICAgICAgYnRuSGludC5zZXRCb3JkZXIobmV3IEVtcHR5Qm9yZGVyKG5ldyBJbnNldHMoMCwwLDAsMCkpKTsKLSAgICAgICAgbGJsWG1sTG9jYXRpb249bmV3IEpMYWJlbCgic2V0IHRoZSBTZXJ2aWNlIFhNTCBmaWxlIik7Ci0gICAgICAgIGxibFhtbExvY2F0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICB0eHRTZXJ2aWNlWG1sID1uZXcgSlRleHRGaWVsZCgpOwotICAgICAgICB0eHRTZXJ2aWNlWG1sLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICBidXRTZWxlY3Q9bmV3IEpCdXR0b24oIkJyb3dzZS4uIik7Ci0gICAgICAgIGJ1dFNlbGVjdC5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgY2hrQm94SW5jbHVkZVhtbCA9IG5ldyBKQ2hlY2tCb3goIkdlbmVyYXRlIHNlcnZpY2UgeG1sIGF1dG9tYXRpY2FsbHkiLCB0cnVlKSA7Ci0KLSAgICAgICAgc2V0QmFja0J1dHRvbkVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgIHNldE5leHRCdXR0b25FbmFibGVkKGZhbHNlKTsKLSAgICAgICAgc2V0RmluaXNoQnV0dG9uRW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIHNldFBhZ2VDb21wbGV0ZShmYWxzZSk7Ci0KLSAgICAgICAgdGhpcy5zZXRMYXlvdXQobmV3IEdyaWRCYWdMYXlvdXQoKSk7Ci0KLQotICAgICAgICAgdGhpcy5hZGQoY2hrQm94SW5jbHVkZVhtbAotICAgICAgICAgICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygwLCAwLCBHcmlkQmFnQ29uc3RyYWludHMuUkVNQUlOREVSLCAxLDAuMCwgMC4wCi0gICAgICAgICAgICAgICAgLCBHcmlkQmFnQ29uc3RyYWludHMuQ0VOVEVSICAsIEdyaWRCYWdDb25zdHJhaW50cy5IT1JJWk9OVEFMCi0gICAgICAgICAgICAgICAgLCBuZXcgSW5zZXRzKDUsIDEsIDEsMSksIDAsIDApKTsKLSAgICAgICAgY2hrQm94SW5jbHVkZVhtbC5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSAgewotICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBzZXRDaGFuZ2VFbmFibGVkKCk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICB0aGlzLmFkZChsYmxYbWxMb2NhdGlvbgotICAgICAgICAgICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygwLCAxLCAxLCAxLCAwLjEsIDAuMAotICAgICAgICAgICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLldFU1QgLCBHcmlkQmFnQ29uc3RyYWludHMuTk9ORQotICAgICAgICAgICAgICAgICwgbmV3IEluc2V0cyg1LCAxMCwgMCwwKSwgMCwgMCkpOwotCi0gICAgICAgIHRoaXMuYWRkKHR4dFNlcnZpY2VYbWwKLSAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMSwgMSwgR3JpZEJhZ0NvbnN0cmFpbnRzLlJFTEFUSVZFICwgMSwgMS4wLCAwLjAKLSAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5XRVNUICwgR3JpZEJhZ0NvbnN0cmFpbnRzLkhPUklaT05UQUwKLSAgICAgICAgICAgICAgICAsIG5ldyBJbnNldHMoNSwgMSwgMCwgMCksIDAsIDApKTsKLQotICAgICAgICB0eHRTZXJ2aWNlWG1sLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpICB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIHVwZGF0ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICB0aGlzLmFkZChidXRTZWxlY3QKLSAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMiwgMSwgMSwgMSwgMC4xLCAwLjAKLSAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5DRU5URVIgLCBHcmlkQmFnQ29uc3RyYWludHMuTk9ORQotICAgICAgICAgICAgICAgICwgbmV3IEluc2V0cyg1LCAwLCAxLDEwKSwgMCwgMCkpOwotCi0gICAgICAgIGJ1dFNlbGVjdC5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSAgewotICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBicm93c2VYbWxGaWxlKCk7Ci0gICAgICAgICAgICAgICAgc2V0TmV4dEJ1dHRvbkVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgc2V0UGFnZUNvbXBsZXRlKHRydWUpOwotICAgICAgICAgICAgICAgIHVwZGF0ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgdGhpcy5hZGQoYnRuSGludCwKLSAgICAgICAgICAgICAgICBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDAsIDIsIEdyaWRCYWdDb25zdHJhaW50cy5SRU1BSU5ERVIsIDEsIDAuMSwwLjAKLSAgICAgICAgICAgICAgICAgICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLldFU1QgLCBHcmlkQmFnQ29uc3RyYWludHMuTk9ORQotICAgICAgICAgICAgICAgICAgICAgICAgLCBuZXcgSW5zZXRzKDUsIDEwLCAwLCAxMCksIDAsIDApKTsKLSAgICAgICAgYnRuSGludC5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSAgewotICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBpZihmbGFnKXsKLSAgICAgICAgICAgICAgICAgICAgYnRuSGludC5zZXRUZXh0KCJIaW50ID4+Iik7Ci0gICAgICAgICAgICAgICAgICAgIHR4YUhpbnQuc2V0VGV4dCgiIik7Ci0gICAgICAgICAgICAgICAgICAgIGZsYWc9ZmFsc2U7Ci0gICAgICAgICAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICAgICAgICAgIGJ0bkhpbnQuc2V0VGV4dCgiSGludCA8PCIpOwotICAgICAgICAgICAgICAgICAgICB0eGFIaW50LnNldFRleHQoaGludCk7Ci0gICAgICAgICAgICAgICAgICAgIGZsYWc9dHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdXBkYXRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIHRoaXMuYWRkKHR4YUhpbnQKLSAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMCwgMywgR3JpZEJhZ0NvbnN0cmFpbnRzLlJFTUFJTkRFUiwgMSwgMC4xLDEuMAotICAgICAgICAgICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLkNFTlRFUiAsIEdyaWRCYWdDb25zdHJhaW50cy5CT1RICi0gICAgICAgICAgICAgICAgLCBuZXcgSW5zZXRzKDUsIDEwLCAxMCwgMTApLCAwLCAwKSk7Ci0KLSAgICB9Ci0KLSAgICAvL25leHQKLSAgICBwdWJsaWMgdm9pZCBuZXh0KCkgewotICAgICAgICBpZighY2hrQm94SW5jbHVkZVhtbC5pc1NlbGVjdGVkKCkpewotICAgICAgICAgICAgc3dpdGNoUGFuZWwoQ29kZWdlbkZyYW1lLlBBTkVMX0xBU1RfQyk7Ci0gICAgICAgIH0gZWxzZXsKLSAgICAgICAgICAgIHN3aXRjaFBhbmVsKENvZGVnZW5GcmFtZS5QQU5FTF9MT0FEX0MpOwotICAgICAgICB9Ci0gICAgICAgIHNldE5leHRCdXR0b25FbmFibGVkKGZhbHNlKTsKLQotICAgIH0KLSAgICAvL2JhY2sKLSAgICBwdWJsaWMgdm9pZCBiYWNrKCkgewotICAgICAgICBzd2l0Y2hQYW5lbChDb2RlZ2VuRnJhbWUuUEFORUxfVEhJUkRfQyApOwotICAgIH0KLSAgICAvL3VwZGF0ZQotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLSAgICAgICAgZmlsbEJlYW4oKTsKLSAgICAgICAgc2V0UGFnZUNvbXBsZXRlKHRydWUpOwotICAgICAgICBzZXROZXh0QnV0dG9uRW5hYmxlZCh0cnVlKTsKLSAgICB9Ci0KLSAgICAvL2dldCBwYWdlIHR5cGUKLSAgICBwdWJsaWMgIGludCBnZXRQYWdlVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuICBXaXphcmRQYW5lbC5TRVJWSUNFX0FSQ0hJVkVfVFlQRSAgOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBicm93c2VYbWxGaWxlKCl7Ci0gICAgICAgIGZpbGVDaG9vc2VyLnNldEZpbGVGaWx0ZXIobmV3IFhtbEZpbGVGaWx0ZXIoKSApOwotICAgICAgICBmaWxlQ2hvb3Nlci5zZXRDdXJyZW50RGlyZWN0b3J5KGFyY2hpdmVCZWFuLmdldENsYXNzTG9jKCkpOwotICAgICAgICBpbnQgcmV0dXJuVmFsPSBmaWxlQ2hvb3Nlci5zaG93T3BlbkRpYWxvZyhidXRTZWxlY3QpOwotICAgICAgICBpZihyZXR1cm5WYWwgPT0gSkZpbGVDaG9vc2VyIC5BUFBST1ZFX09QVElPTiApewotICAgICAgICAgICAgRmlsZSB4bWxmaWxlID0gZmlsZUNob29zZXIuZ2V0U2VsZWN0ZWRGaWxlKCk7Ci0gICAgICAgICAgICB0eHRTZXJ2aWNlWG1sLnNldFRleHQoeG1sZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgICAgICAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbMTAyNF07Ci0gICAgICAgICAgICBpbnQgcmVhZDsKLSAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQ7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oeG1sZmlsZSk7Ci0KLSAgICAgICAgICAgICAgICBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKChyZWFkID0gaW4ucmVhZChidWYpKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlKGJ1ZiwgMCwgcmVhZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGluLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSBuZXcgU3RyaW5nKG91dC50b0J5dGVBcnJheSgpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUxKSB7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHR4dFNlcnZpY2VYbWwuc2V0VGV4dCgiIik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcHJpdmF0ZSB2b2lkIHNldENoYW5nZUVuYWJsZWQoKXsKLSAgICAgICAgaWYoY2hrQm94SW5jbHVkZVhtbC5pc1NlbGVjdGVkKCkpewotICAgICAgICAgICAgbGJsWG1sTG9jYXRpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICB0eHRTZXJ2aWNlWG1sIC5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgIGJ1dFNlbGVjdC5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICBsYmxYbWxMb2NhdGlvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgdHh0U2VydmljZVhtbC5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgYnV0U2VsZWN0LnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcHJpdmF0ZSB2b2lkIGZpbGxCZWFuKCl7Ci0gICAgICAgIGlmKCFjaGtCb3hJbmNsdWRlWG1sLmlzU2VsZWN0ZWQoKSl7Ci0gICAgICAgICAgICBpZih2YWx1ZSE9bnVsbCkKLSAgICAgICAgICAgICAgICBhcmNoaXZlQmVhbi5zZXRTZXJ2aWNlWE1MKHZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgfQotICAgIHB1YmxpYyBib29sZWFuIGlzSW5jbHVkZVhtbCgpewotICAgICAgICByZXR1cm4gdGhpcy5jaGtCb3hJbmNsdWRlWG1sLmlzU2VsZWN0ZWQoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9pZGVhcGx1Z2luL2ZyYW1lcy9TZXJ2aWNlWE1MR2VuZXJhdGlvblBhZ2UuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2lkZWFwbHVnaW4vZnJhbWVzL1NlcnZpY2VYTUxHZW5lcmF0aW9uUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OGJlNmQ1Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2lkZWFwbHVnaW4vZnJhbWVzL1NlcnZpY2VYTUxHZW5lcmF0aW9uUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5pZGVhcGx1Z2luLmZyYW1lczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbHMuY29tcG9uZW50LldpemFyZENvbXBvbmVudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29scy5jb21wb25lbnQuV2l6YXJkUGFuZWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29scy53aXphcmRmcmFtZS5Db2RlZ2VuRnJhbWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5pZGVhcGx1Z2luLmJlYW4uQXJjaGl2ZUJlYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5pZGVhcGx1Z2luLmJlYW4uQ2xhc3NGaWxlRmlsdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuaWRlYXBsdWdpbi5iZWFuLk9wZXJhdGlvbk9iajsKLWltcG9ydCBvcmcuYXBhY2hlLmlkZWFwbHVnaW4uYmVhbi5TZXJ2aWNlT2JqOwotaW1wb3J0IG9yZy5hcGFjaGUuaWRlYXBsdWdpbi5mcmFtZXMudGFibGUuQXJjaGl2ZVRhYmxlTW9kZWw7Ci0KLWltcG9ydCBqYXZheC5zd2luZy4qOwotaW1wb3J0IGphdmF4LnN3aW5nLmJvcmRlci5FbXB0eUJvcmRlcjsKLWltcG9ydCBqYXZhLmF3dC4qOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkV2ZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkxpc3RlbmVyOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5VUkxDbGFzc0xvYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotCi1wdWJsaWMgY2xhc3MgU2VydmljZVhNTEdlbmVyYXRpb25QYWdlIGV4dGVuZHMgV2l6YXJkUGFuZWwgewotCi0gICAgcHJpdmF0ZSBKVGV4dEZpZWxkIHR4dFNlcnZpY2VOYW1lOwotICAgIHByaXZhdGUgSlRleHRGaWVsZCB0eHRDbGFzc05hbWU7Ci0gICAgcHJpdmF0ZSBKQ2hlY2tCb3ggY2hrQm94U2VhcmNoTWV0aG9kOwotICAgIHByaXZhdGUgSkJ1dHRvbiBidG5Mb2FkOwotICAgIHByaXZhdGUgSkJ1dHRvbiBidG5Ccm93c2U7Ci0gICAgcHJpdmF0ZSBKVGFibGUgdGFibGU7Ci0gICAgcHJpdmF0ZSBKTGFiZWwgbGJsVGFibGU7Ci0gICAgcHJpdmF0ZSBKU2Nyb2xsUGFuZSBzY3JvbGxQYW5lOwotICAgIHByaXZhdGUgSGFzaE1hcCBvcGVyYXRpb25zOwotICAgIHByaXZhdGUgU3RyaW5nIGZpbGVOYW1lOwotICAgIHByaXZhdGUgaW50IGNvdW50ID0gMTsKLSAgICBwcml2YXRlIEFycmF5TGlzdCBzZXJ2aWNlbHNpdDsKLSAgICBwcml2YXRlIFN0cmluZyBzZ1hNbDsKLSAgICBwcml2YXRlIGZpbmFsIEpGaWxlQ2hvb3NlciBmaWxlQ2hvb3Nlcj1uZXcgSkZpbGVDaG9vc2VyKCk7Ci0gICAgcHJpdmF0ZSBBcmNoaXZlQmVhbiBhcmNoaXZlQmVhbjsKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvcgotICAgICAqIEBwYXJhbSB3aXphcmRDb21wb25lbnRzCi0gICAgICovCi0gICAgcHVibGljIFNlcnZpY2VYTUxHZW5lcmF0aW9uUGFnZShXaXphcmRDb21wb25lbnRzIHdpemFyZENvbXBvbmVudHMsIEFyY2hpdmVCZWFuIGFyY2hpdmVCZWFuKXsKLSAgICAgICAgc3VwZXIod2l6YXJkQ29tcG9uZW50cywgIkF4aXMyIElkZWEgUGx1Z2luIFNlcnZpY2UgQXJjaGl2ZXIgQ3JlYXRvciBXaXphcmRzIik7Ci0gICAgICAgIHNldFBhbmVsVG9wVGl0bGUoIlNlcnZpY2UgQXJjaGl2ZXIiKTsKLSAgICAgICAgc2V0UGFuZWxCb3R0b21UaXRsZSgiU2VydmljZSBYTUwgR2VuZXJhdGlvbiIpOwotICAgICAgICB0aGlzLmFyY2hpdmVCZWFuPWFyY2hpdmVCZWFuOwotICAgICAgICBpbml0KCk7Ci0gICAgfQotICAgIHByaXZhdGUgdm9pZCBpbml0KCl7Ci0gICAgICAgCi0gICAgICAgIHR4dFNlcnZpY2VOYW1lID1uZXcgSlRleHRGaWVsZCgpOwotICAgICAgICB0eHRDbGFzc05hbWUgPW5ldyBKVGV4dEZpZWxkKCk7Ci0KLSAgICAgICAgYnRuQnJvd3NlPW5ldyBKQnV0dG9uKCJCcm93c2UiKTsKLSAgICAgICAgYnRuTG9hZCA9bmV3IEpCdXR0b24oIkxvYWQiKTsKLQotICAgICAgICBjaGtCb3hTZWFyY2hNZXRob2Q9bmV3IEpDaGVja0JveCgiU2VhcmNoIGRlY2xhcmVkIG1ldGhvZCBvbmx5Iix0cnVlKTsKLQotICAgICAgICBsYmxUYWJsZT1uZXcgSkxhYmVsKCJNYXJrIG9wZXJhdGlvbiB5b3UgZG8gbm90IHdhbnQgdG8gcHVibGlzaCAiKTsKLSAgICAgICAgb3BlcmF0aW9ucyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIEFyY2hpdmVUYWJsZU1vZGVsIG15TW9kZWw9bmV3IEFyY2hpdmVUYWJsZU1vZGVsKG9wZXJhdGlvbnMpOwotICAgICAgICB0YWJsZT1uZXcgSlRhYmxlKG15TW9kZWwpOwotICAgICAgICB0YWJsZS5zZXRPcGFxdWUodHJ1ZSk7Ci0gICAgICAgIHRhYmxlLnNldEJhY2tncm91bmQoZ2V0QmFja2dyb3VuZCgpKTsKLSAgICAgICAgdGFibGUuc2V0U2hvd0dyaWQodHJ1ZSk7Ci0gICAgICAgIHRhYmxlLnNldFNpemUoZ2V0UHJlZmVycmVkU2l6ZSgpKTsKLQotICAgICAgICBzY3JvbGxQYW5lID1uZXcgSlNjcm9sbFBhbmUodGFibGUpOwotICAgICAgICBzY3JvbGxQYW5lLnNldEJvcmRlcihuZXcgRW1wdHlCb3JkZXIoMCwwLDAsMCkpOwotICAgICAgICBzY3JvbGxQYW5lLnNldFNpemUodGFibGUuZ2V0U2l6ZSgpKTsKLSAgICAgICAgc2Nyb2xsUGFuZS5zZXRPcGFxdWUodHJ1ZSk7Ci0gICAgICAgIHNjcm9sbFBhbmUuc2V0QmFja2dyb3VuZChnZXRCYWNrZ3JvdW5kKCkpOwotICAgICAgICBzY3JvbGxQYW5lLmdldFZpZXdwb3J0KCkuc2V0QmFja2dyb3VuZChnZXRCYWNrZ3JvdW5kKCkpOwotICAgICAgICBzY3JvbGxQYW5lLnNldFZpZXdwb3J0Qm9yZGVyKG5ldyBFbXB0eUJvcmRlcigwLDAsMCwwKSk7Ci0KLSAgICAgICAgc2V0QmFja0J1dHRvbkVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgIHNldE5leHRCdXR0b25FbmFibGVkKGZhbHNlKTsKLSAgICAgICAgc2V0RmluaXNoQnV0dG9uRW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIHNldFBhZ2VDb21wbGV0ZShmYWxzZSk7Ci0gICAgICAgIHRoaXMuc2V0TGF5b3V0KG5ldyBHcmlkQmFnTGF5b3V0KCkpOwotCi0gICAgICAgIHRoaXMuYWRkKG5ldyBKTGFiZWwoIkNsYXNzIE5hbWUiKQotICAgICAgICAgICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygwLCAwLCAxLCAxLCAwLjEsIDAuMAotICAgICAgICAgICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLk5PUlRIV0VTVCAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLk5PTkUKLSAgICAgICAgICAgICAgICAsIG5ldyBJbnNldHMoNSwgMTAsIDAsIDApLCAwLCAwKSk7Ci0KLSAgICAgICAgdGhpcy5hZGQodHh0Q2xhc3NOYW1lCi0gICAgICAgICAgICAgICAgLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDEsIDAsIDEsIDEsIDEuMCwgMC4wCi0gICAgICAgICAgICAgICAgLCBHcmlkQmFnQ29uc3RyYWludHMuTk9SVEhXRVNUICAsIEdyaWRCYWdDb25zdHJhaW50cy5IT1JJWk9OVEFMCi0gICAgICAgICAgICAgICAgLCBuZXcgSW5zZXRzKDUsIDAsIDAsIDApLCAwLCAwKSk7Ci0gICAgICAgIHRoaXMuYWRkKGJ0bkJyb3dzZQotICAgICAgICAgICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygyLCAwLCAxLCAxLCAwLjEsIDAuMAotICAgICAgICAgICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLk5PUlRIICAsIEdyaWRCYWdDb25zdHJhaW50cy5OT05FCi0gICAgICAgICAgICAgICAgLCBuZXcgSW5zZXRzKDUsIDEsIDEsIDEpLCAwLCAwKSk7Ci0gICAgICAgIGJ0bkJyb3dzZSAuYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgYnJvd3NlQ2xhc3NGaWxlKCk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICB0aGlzLmFkZChidG5Mb2FkCi0gICAgICAgICAgICAgICAgLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDMsIDAsIDEsIDEsIDAuMSwgMC4wCi0gICAgICAgICAgICAgICAgLCBHcmlkQmFnQ29uc3RyYWludHMuTk9SVEggICwgR3JpZEJhZ0NvbnN0cmFpbnRzLk5PTkUKLSAgICAgICAgICAgICAgICAsIG5ldyBJbnNldHMoNSwgMSwgMSwgMTApLCAwLCAwKSk7Ci0KLSAgICAgICAgYnRuTG9hZCAuYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlVGFibGUoKTsKLSAgICAgICAgICAgICAgICB1cGRhdGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgICB0aGlzLmFkZChuZXcgSkxhYmVsKCJTZXJ2aWNlIE5hbWUiKQotICAgICAgICAgICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygwLCAxLCAxLCAxLCAwLjEsIDAuMAotICAgICAgICAgICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLk5PUlRIV0VTVCAgLCBHcmlkQmFnQ29uc3RyYWludHMuTk9ORQotICAgICAgICAgICAgICAgICwgbmV3IEluc2V0cyg1LCAxMCwgMCwwKSwgMCwgMCkpOwotICAgICAgICAgdGhpcy5hZGQodHh0U2VydmljZU5hbWUKLSAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMSwgMSwgMSwgMSwgMS4wLCAwLjAKLSAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5OT1JUSFdFU1QgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLkhPUklaT05UQUwKLSAgICAgICAgICAgICAgICAsIG5ldyBJbnNldHMoNSwgMCwgMCwgMCksIDAsIDApKTsKLQotICAgICAgICB0aGlzLmFkZChjaGtCb3hTZWFyY2hNZXRob2QKLSAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMCwgMiwgR3JpZEJhZ0NvbnN0cmFpbnRzLlJFTEFUSVZFLCAxLCAwLjAsIDAuMAotICAgICAgICAgICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLk5PUlRIV0VTVCAgLCBHcmlkQmFnQ29uc3RyYWludHMuSE9SSVpPTlRBTAotICAgICAgICAgICAgICAgICwgbmV3IEluc2V0cyg1LCAxMCwgMCwgMTApLCAwLCAwKSk7Ci0gICAgICAgICBjaGtCb3hTZWFyY2hNZXRob2QgLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpICB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIHVwZGF0ZVRhYmxlKCk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICB0aGlzLmFkZChsYmxUYWJsZQotICAgICAgICAgICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygwLCAzLCBHcmlkQmFnQ29uc3RyYWludHMuUkVMQVRJVkUsIDEsIDAuMCwgMC4wCi0gICAgICAgICAgICAgICAgLCBHcmlkQmFnQ29uc3RyYWludHMuV0VTVCAgLCBHcmlkQmFnQ29uc3RyYWludHMuSE9SSVpPTlRBTAotICAgICAgICAgICAgICAgICwgbmV3IEluc2V0cyg1LCAxMCwgMCwgMTApLCAwLCAwKSk7Ci0KLSAgICAgICB0aGlzLmFkZChzY3JvbGxQYW5lCi0gICAgICAgICAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMCwgNCwgR3JpZEJhZ0NvbnN0cmFpbnRzLlJFTUFJTkRFUiAsIDEsIDEuMCwgMS4wCi0gICAgICAgICAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5OT1JUSFdFU1QsIEdyaWRCYWdDb25zdHJhaW50cy5CT1RICi0gICAgICAgICAgICAgICAgICAgICAgICAsIG5ldyBJbnNldHMoNSwgMTAsIDEwLCAxMCksIDAsIDApKTsKLQotICAgICAgICBzZXRQYWdlQ29tcGxldGUodHJ1ZSk7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCBiYWNrKCkgewotICAgICAgICBzd2l0Y2hQYW5lbChDb2RlZ2VuRnJhbWUuUEFORUxfRk9VUlRIX0MgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBuZXh0KCkgewotICAgICAgICBzZXROZXh0QnV0dG9uRW5hYmxlZChmYWxzZSk7ICAgICAgICAKLSAgICAgICAgY2hlY2thdXRvR2VuZXJhdGlvbigpOwotICAgICAgICBzd2l0Y2hQYW5lbChDb2RlZ2VuRnJhbWUuUEFORUxfT1BUSU9OX0MgKTsKLSAgICAgICAgKChTZXJ2aWNlWE1MRWRpdFBhZ2UpZ2V0V2l6YXJkQ29tcG9uZW50cygpLmdldFdpemFyZFBhbmVsKENvZGVnZW5GcmFtZS5QQU5FTF9PUFRJT05fQyApKS5zZXREZXNjcmlwdGlvbihhcmNoaXZlQmVhbi5nZXRTZXJ2aWNlWE1MKCkpOwotICAgICAgICAoKFNlcnZpY2VYTUxFZGl0UGFnZSlnZXRXaXphcmRDb21wb25lbnRzKCkuZ2V0V2l6YXJkUGFuZWwoQ29kZWdlbkZyYW1lLlBBTkVMX09QVElPTl9DICkpLnNldERlZmF1bHRFbmFibGVkKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdXBkYXRlKCl7Ci0KLSAgICB9Ci0gICAgcHVibGljICBpbnQgZ2V0UGFnZVR5cGUoKSB7Ci0gICAgICAgIHJldHVybiAgV2l6YXJkUGFuZWwuU0VSVklDRV9BUkNISVZFX1RZUEU7Ci0gICAgfQotCi0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlVGFibGUoKSB7Ci0gICAgICAgIC8vZ2V0IGEgVVJMIGZyb20gdGhlIGNsYXNzIGZpbGUgbG9jYXRpb24KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFN0cmluZyBjbGFzc0ZpbGVMb2NhdGlvbiA9IGFyY2hpdmVCZWFuLmdldENsYXNzTG9jKCkuZ2V0UGF0aCgpOwotICAgICAgICAgICAgVVJMIGNsYXNzRmlsZVVSTCA9IG5ldyBGaWxlKGNsYXNzRmlsZUxvY2F0aW9uKS50b1VSTCgpOwotCi0gICAgICAgICAgIEFycmF5TGlzdCBsaXN0b2ZVUkxzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICBsaXN0b2ZVUkxzLmFkZChjbGFzc0ZpbGVVUkwpOwotCi0gICAgICAgICAgICAvL2dldCB0aGUgbGlicmFyaWVzIGZyb20gdGhlIGxpYiBwYWdlIGFuZCBsb2FkIGl0Ci0gICAgICAgICAgICBBcnJheUxpc3QgbGliTGlzdD1hcmNoaXZlQmVhbi5nZXRMaWJzKCk7Ci0gICAgICAgICAgICBTdHJpbmdbXSBsaWJGaWxlTGlzdD1uZXcgU3RyaW5nW2xpYkxpc3Quc2l6ZSgpXTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGliTGlzdC5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIGxpYkZpbGVMaXN0W2ldID0gIChTdHJpbmcgKWxpYkxpc3QuZ2V0KGkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobGliRmlsZUxpc3QhPW51bGwpewotICAgICAgICAgICAgICAgIGludCBjb3VudCA9IGxpYkZpbGVMaXN0Lmxlbmd0aDsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7aTxjb3VudDtpKyspewotICAgICAgICAgICAgICAgICAgICBsaXN0b2ZVUkxzLmFkZChuZXcgRmlsZShsaWJGaWxlTGlzdFtpXSkudG9VUkwoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgdHh0U2VydmljZU5hbWUuc2V0VGV4dCgiTXlTZXJ2aWNlIiArIGNvdW50KTsKLSAgICAgICAgICAgIENsYXNzTG9hZGVyIGxvYWRlciA9IG5ldyBVUkxDbGFzc0xvYWRlcigoVVJMW10pbGlzdG9mVVJMcy50b0FycmF5KG5ldyBVUkxbbGlzdG9mVVJMcy5zaXplKCldKSk7Ci0gICAgICAgICAgICBDbGFzcyBjbGF6eiA9IENsYXNzLmZvck5hbWUoZmlsZU5hbWUgLHRydWUsbG9hZGVyKTsKLSAgICAgICAgICAgIE1ldGhvZFtdIG1ldGhvZHMgPSBudWxsOwotICAgICAgICAgICAgaWYgKGNoa0JveFNlYXJjaE1ldGhvZC5pc1NlbGVjdGVkKCkpewotICAgICAgICAgICAgICAgIG1ldGhvZHMgPSBjbGF6ei5nZXREZWNsYXJlZE1ldGhvZHMoKTsKLSAgICAgICAgICAgIH1lbHNlewotICAgICAgICAgICAgICAgIG1ldGhvZHMgPSBjbGF6ei5nZXRNZXRob2RzKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGludCBtZXRob2RDb3VudCA9IG1ldGhvZHMubGVuZ3RoOwotICAgICAgICAgICAgaWYgKG1ldGhvZENvdW50ID4gMCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHRhYmxlLnJlbW92ZUFsbCgpOwotICAgICAgICAgICAgICAgICAgICB0YWJsZS5zZXRWaXNpYmxlKHRydWUpOwotICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25zLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUxKSB7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IG1ldGhvZENvdW50OyBpKyspewotICAgICAgICAgICAgICAgICAgICBNZXRob2QgbWV0aG9kID0gbWV0aG9kc1tpXTsKLSAgICAgICAgICAgICAgICAgICAgT3BlcmF0aW9uT2JqIG9wZXJhdGlvbm9iaiA9IG5ldyBPcGVyYXRpb25PYmoobWV0aG9kLmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QuZ2V0UmV0dXJuVHlwZSgpLnRvU3RyaW5nKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEludGVnZXIobWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCkubGVuZ3RoKSwgbmV3IEJvb2xlYW4odHJ1ZSkpOwotICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25zLnB1dChtZXRob2QuZ2V0TmFtZSgpLCBvcGVyYXRpb25vYmopOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIEFyY2hpdmVUYWJsZU1vZGVsIG15TW9kZWw9bmV3IEFyY2hpdmVUYWJsZU1vZGVsKG9wZXJhdGlvbnMpOwotICAgICAgICAgICAgICAgIHRhYmxlLnNldE1vZGVsKG15TW9kZWwpOwotICAgICAgICAgICAgICAgIHNjcm9sbFBhbmUucmVwYWludCgpOwotICAgICAgICAgICAgICAgIHRoaXMucmVwYWludCgpOwotICAgICAgICAgICAgICAgIHNldE5leHRCdXR0b25FbmFibGVkKHRydWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBzZXROZXh0QnV0dG9uRW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgIEpPcHRpb25QYW5lLnNob3dNZXNzYWdlRGlhbG9nKGJ0bkxvYWQsICJUaGUgc3BlY2lmaWVkIGZpbGUgaXMgbm90IGEgdmFsaWQgamF2YSBjbGFzcyIsCi0gICAgICAgICAgICAgICAgICAgICJFcnJvciEiLCBKT3B0aW9uUGFuZS5FUlJPUl9NRVNTQUdFKTsKLSAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBzZXROZXh0QnV0dG9uRW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgIEpPcHRpb25QYW5lLnNob3dNZXNzYWdlRGlhbG9nKGJ0bkxvYWQsICJUaGUgc3BlY2lmaWVkIGZpbGUgaXMgbm90IGEgdmFsaWQgamF2YSBjbGFzcyIsCi0gICAgICAgICAgICAgICAgICAgICJFcnJvciEiLCBKT3B0aW9uUGFuZS5FUlJPUl9NRVNTQUdFKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBicm93c2VDbGFzc0ZpbGUoKXsKLSAgICAgICAgZmlsZUNob29zZXIuc2V0RmlsZUZpbHRlcihuZXcgQ2xhc3NGaWxlRmlsdGVyKCkgKTsKLSAgICAgICAgZmlsZUNob29zZXIuc2V0Q3VycmVudERpcmVjdG9yeShhcmNoaXZlQmVhbi5nZXRDbGFzc0xvYygpKTsKLSAgICAgICAgaW50IHJldHVyblZhbCA9IGZpbGVDaG9vc2VyLnNob3dPcGVuRGlhbG9nKHRoaXMpOwotICAgICAgICBpZiAocmV0dXJuVmFsID09IEpGaWxlQ2hvb3Nlci5BUFBST1ZFX09QVElPTikgewotICAgICAgICAgICAgRmlsZSB0ZW1wZmlsZSA9IGZpbGVDaG9vc2VyIC5nZXRTZWxlY3RlZEZpbGUoKTsKLSAgICAgICAgICAgIFN0cmluZyBuZXdGaWxlID0gdGVtcGZpbGUuZ2V0UGF0aCgpOwotICAgICAgICAgICAgaW50IGluZGV4ID0gbmV3RmlsZS5pbmRleE9mKGFyY2hpdmVCZWFuLmdldENsYXNzTG9jKCkuZ2V0QWJzb2x1dGVQYXRoKCkudHJpbSgpKTsKLSAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgaW50IGxhc3RpbmRleCA9IGFyY2hpdmVCZWFuLmdldENsYXNzTG9jKCkuZ2V0QWJzb2x1dGVQYXRoKCkudHJpbSgpLmxlbmd0aCgpOwotICAgICAgICAgICAgICAgIG5ld0ZpbGUgPSBuZXdGaWxlLnN1YnN0cmluZyhsYXN0aW5kZXggKyAxKTsKLSAgICAgICAgICAgICAgICBjaGFyIGNoID0gRmlsZS5zZXBhcmF0b3JDaGFyOwotICAgICAgICAgICAgICAgIGNoYXIgbmV3Y2ggPSAnLic7Ci0gICAgICAgICAgICAgICAgaW50IGNpbmRleCA9IG5ld0ZpbGUuaW5kZXhPZihjaCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGNpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5ld0ZpbGUgPSBuZXdGaWxlLnJlcGxhY2UoY2gsIG5ld2NoKTsKLSAgICAgICAgICAgICAgICAgICAgY2luZGV4ID0gbmV3RmlsZS5pbmRleE9mKGNoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZmlsZU5hbWUgPSBuZXdGaWxlOwotICAgICAgICAgICAgICAgIGludCBjbGFzc0luZGV4ID0gZmlsZU5hbWUubGFzdEluZGV4T2YoIi4iKTsKLSAgICAgICAgICAgICAgICBmaWxlTmFtZSA9IGZpbGVOYW1lLnN1YnN0cmluZygwLCBjbGFzc0luZGV4KTsKLSAgICAgICAgICAgICAgICB0eHRDbGFzc05hbWUgLnNldFRleHQoZmlsZU5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHByaXZhdGUgdm9pZCBzZXJ2aWNlR3JvdXBQcm9jZXNzKCl7Ci0KLSAgICAgICAgQXJyYXlMaXN0IG9wcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgIEl0ZXJhdG9yIG9waXRyID0gb3BlcmF0aW9ucy52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgd2hpbGUgKG9waXRyLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIE9wZXJhdGlvbk9iaiBvcGVyYXRpb25PYmogPSAoT3BlcmF0aW9uT2JqKSBvcGl0ci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKG9wZXJhdGlvbk9iai5nZXRTZWxlY3QoKS5ib29sZWFuVmFsdWUoKSkgewotICAgICAgICAgICAgICAgICAgICBvcHMuYWRkKG9wZXJhdGlvbk9iai5nZXRPcE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTZXJ2aWNlT2JqIHNlcnZpY2UgPSBuZXcgU2VydmljZU9iaih0eHRTZXJ2aWNlTmFtZS5nZXRUZXh0KCksIGZpbGVOYW1lLCBvcHMpOwotICAgICAgICAgICAgYXJjaGl2ZUJlYW4uYWRkVG9TZXJ2aWNlbHNpdChzZXJ2aWNlKTsKLSAgICAgICAgICAgIGlmICghYXJjaGl2ZUJlYW4uaXNTaW5nbGVTZXJ2aWNlKCkpIHsKLSAgICAgICAgICAgICAgICBpbnQgdmFsdSA9IEpPcHRpb25QYW5lLnNob3dDb25maXJtRGlhbG9nKHRoaXMsICJEbyB5b3Ugd2FudCB0byBhZGQgYW4gYW5vdGhlciBzZXJ2aWNlIHRvIGdyb3VwIiwgIlNlcnZpY2UgQXJjaGl2ZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBKT3B0aW9uUGFuZS5ZRVNfTk9fT1BUSU9OKTsKLSAgICAgICAgICAgICAgICBpZiAodmFsdSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lID0gIiI7Ci0gICAgICAgICAgICAgICAgICAgIHR4dENsYXNzTmFtZS5zZXRUZXh0KCIiKTsKLSAgICAgICAgICAgICAgICAgICAgdHh0U2VydmljZU5hbWUuc2V0VGV4dCgiIik7Ci0gICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbnMuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICAgICAgc2V0TmV4dEJ1dHRvbkVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICBzd2l0Y2hQYW5lbChDb2RlZ2VuRnJhbWUuUEFORUxfRklSU1RfQyk7Ci0gICAgICAgICAgICAgICAgICAgIGNvdW50Kys7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMucmVwYWludCgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHNlcnZpY2Vsc2l0ID1hcmNoaXZlQmVhbi5nZXRTZXJ2aWNlbHNpdCgpOwotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oc2VydmljZWxzaXQuc2l6ZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgc2dYTWwgPSAiPHNlcnZpY2VHcm91cD5cbiI7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VydmljZWxzaXQuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZpY2VPYmogc2VydmljZU9iaiA9IChTZXJ2aWNlT2JqKSBzZXJ2aWNlbHNpdC5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZ1hNbCA9IHNnWE1sICsgc2VydmljZU9iai50b1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHNnWE1sID0gc2dYTWwgKyAiPC9zZXJ2aWNlR3JvdXA+IjsKLSAgICAgICAgICAgICAgICAgICAgYXJjaGl2ZUJlYW4uc2V0U2VydmljZVhNTChzZ1hNbCk7Ci0gICAgICAgICAgICAgICAgICAgIHNnWE1sPSIiOwotICAgICAgICAgICAgICAgICAgICBzd2l0Y2hQYW5lbChDb2RlZ2VuRnJhbWUuUEFORUxfT1BUSU9OX0MgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNlcnZpY2Vsc2l0ID0gYXJjaGl2ZUJlYW4uZ2V0U2VydmljZWxzaXQoKTsKLSAgICAgICAgICAgICAgICBzZ1hNbCA9ICI8c2VydmljZUdyb3VwPlxuIjsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlcnZpY2Vsc2l0LnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIFNlcnZpY2VPYmogc2VydmljZU9iaiA9IChTZXJ2aWNlT2JqKSBzZXJ2aWNlbHNpdC5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgIHNnWE1sID0gc2dYTWwgKyBzZXJ2aWNlT2JqLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNnWE1sID0gc2dYTWwgKyAiPC9zZXJ2aWNlR3JvdXA+IjsKLSAgICAgICAgICAgICAgICBhcmNoaXZlQmVhbi5zZXRTZXJ2aWNlWE1MKHNnWE1sKTsKLSAgICAgICAgICAgICAgICBzZ1hNbD0iIjsKLSAgICAgICAgICAgICAgICBzd2l0Y2hQYW5lbChDb2RlZ2VuRnJhbWUuUEFORUxfT1BUSU9OX0MgKTsKLSAgICAgICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2thdXRvR2VuZXJhdGlvbigpewotICAgICAgICBBcnJheUxpc3Qgb3BzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBJdGVyYXRvciBvcGl0ciA9IG9wZXJhdGlvbnMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKG9waXRyLmhhc05leHQoKSkgewotICAgICAgICAgICAgT3BlcmF0aW9uT2JqIG9wZXJhdGlvbk9iaiA9IChPcGVyYXRpb25PYmopIG9waXRyLm5leHQoKTsKLSAgICAgICAgICAgIGlmIChvcGVyYXRpb25PYmouZ2V0U2VsZWN0KCkuYm9vbGVhblZhbHVlKCkpIHsKLSAgICAgICAgICAgICAgICBvcHMuYWRkKG9wZXJhdGlvbk9iai5nZXRPcE5hbWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgdHh0U2VydmljZU5hbWUuc2V0VGV4dCh0eHRTZXJ2aWNlTmFtZS5nZXRUZXh0KCkpOwotICAgICAgICBTZXJ2aWNlT2JqIHNlcnZpY2UgPSBuZXcgU2VydmljZU9iaih0eHRTZXJ2aWNlTmFtZS5nZXRUZXh0KCksIGZpbGVOYW1lLCBvcHMpOwotICAgICAgICBhcmNoaXZlQmVhbi5hZGRUb1NlcnZpY2Vsc2l0KHNlcnZpY2UpOwotICAgICAgICBzZXJ2aWNlbHNpdCA9IGFyY2hpdmVCZWFuLmdldFNlcnZpY2Vsc2l0KCk7Ci0gICAgICAgIHNnWE1sPSI8c2VydmljZUdyb3VwPiI7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VydmljZWxzaXQuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIFNlcnZpY2VPYmogc2VydmljZU9iaiA9IChTZXJ2aWNlT2JqKSBzZXJ2aWNlbHNpdC5nZXQoaSk7Ci0gICAgICAgICAgICBzZ1hNbCA9IHNnWE1sICsgc2VydmljZU9iai50b1N0cmluZygpOwotICAgICAgICB9Ci0gICAgICAgIHNnWE1sID0gc2dYTWwgKyAiPC9zZXJ2aWNlR3JvdXA+IjsKLSAgICAgICAgYXJjaGl2ZUJlYW4uc2V0U2VydmljZVhNTChzZ1hNbCk7Ci0gICAgICAgIHNnWE1sPSIiOwotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaWRlYXBsdWdpbi9mcmFtZXMvV1NETEZpbGVTZWxlY3Rpb25QYWdlLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9pZGVhcGx1Z2luL2ZyYW1lcy9XU0RMRmlsZVNlbGVjdGlvblBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzUzMDQ4ZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9pZGVhcGx1Z2luL2ZyYW1lcy9XU0RMRmlsZVNlbGVjdGlvblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuaWRlYXBsdWdpbi5mcmFtZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRvb2xzLmNvbXBvbmVudC5XaXphcmRDb21wb25lbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbHMuY29tcG9uZW50LldpemFyZFBhbmVsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbHMuaWRlYS5XU0RMRmlsZUZpbHRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRvb2xzLndpemFyZGZyYW1lLkNvZGVnZW5GcmFtZTsKLWltcG9ydCBvcmcuYXBhY2hlLmlkZWFwbHVnaW4uYmVhbi5BcmNoaXZlQmVhbjsKLQotaW1wb3J0IGphdmF4LnN3aW5nLio7Ci1pbXBvcnQgamF2YXguc3dpbmcuYm9yZGVyLkVtcHR5Qm9yZGVyOwotaW1wb3J0IGphdmF4LndzZGwuV1NETEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLmZhY3RvcnkuV1NETEZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgud3NkbC54bWwuV1NETFJlYWRlcjsKLWltcG9ydCBqYXZhLmF3dC4qOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkV2ZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkxpc3RlbmVyOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotLyoqCi0gKiBDcmVhdGVkIGJ5IEludGVsbGlKIElERUEuCi0gKiBVc2VyOiBzaGl2YW50aGEKLSAqIERhdGU6IDE2LzA3LzIwMDcKLSAqIFRpbWU6IDExOjIwOjAwCi0gKiBUbyBjaGFuZ2UgdGhpcyB0ZW1wbGF0ZSB1c2UgRmlsZSB8IFNldHRpbmdzIHwgRmlsZSBUZW1wbGF0ZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0RMRmlsZVNlbGVjdGlvblBhZ2UgZXh0ZW5kcyBXaXphcmRQYW5lbCB7Ci0KLSAgICBwcml2YXRlIEpMYWJlbCBsYmxXU0RMOwotICAgIHByaXZhdGUgSkNoZWNrQm94IGNoa0JveFNraXA7Ci0gICAgcHJpdmF0ZSBKQ2hlY2tCb3ggY2hrQm94U2VsZWN0OwotICAgIHByaXZhdGUgSlRleHRGaWVsZCB0eHRXU0RMOwotICAgIHByaXZhdGUgSkJ1dHRvbiBidG5Ccm93c2U7Ci0gICAgcHJpdmF0ZSBKQnV0dG9uIGJ0bkhpbnQ7Ci0gICAgcHJpdmF0ZSBKVGV4dEFyZWEgdHhhSGludDsKLSAgICBwcml2YXRlIGJvb2xlYW4gZmxhZz1mYWxzZTsKLSAgICBwcml2YXRlIFN0cmluZyBoaW50ID0iIjsKLSAgICBwcml2YXRlIGZpbmFsIEpGaWxlQ2hvb3NlciBmaWxlQ2hvb3Nlcj1uZXcgSkZpbGVDaG9vc2VyKCk7Ci0gICAgcHJpdmF0ZSBBcmNoaXZlQmVhbiBhcmNoaXZlQmVhbjsgICAgIAotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yCi0gICAgICogQHBhcmFtIHdpemFyZENvbXBvbmVudHMKLSAgICAgKi8KLSAgICBwdWJsaWMgV1NETEZpbGVTZWxlY3Rpb25QYWdlKFdpemFyZENvbXBvbmVudHMgd2l6YXJkQ29tcG9uZW50cywgQXJjaGl2ZUJlYW4gYXJjaGl2ZUJlYW4pewotICAgICAgICBzdXBlcih3aXphcmRDb21wb25lbnRzLCJBeGlzMiBJZGVhIFBsdWdpbiBTZXJ2aWNlIEFyY2hpdmVyIENyZWF0b3IgV2l6YXJkcyIpOwotICAgICAgICBzZXRQYW5lbFRvcFRpdGxlKCJTZXJ2aWNlIEFyY2hpdmVyIik7Ci0gICAgICAgIHNldFBhbmVsQm90dG9tVGl0bGUoIkFkZCB0aGUgV1NETCBmaWxlIik7Ci0gICAgICAgIHRoaXMuYXJjaGl2ZUJlYW49YXJjaGl2ZUJlYW47Ci0gICAgICAgIGluaXQoKTsKLSAgICB9Ci0gICAgcHJpdmF0ZSB2b2lkIGluaXQoKXsKLSAgICAgICAgdHhhSGludCA9bmV3IEpUZXh0QXJlYSgpOwotICAgICAgICB0eGFIaW50LnNldEJvcmRlcihudWxsKTsKLSAgICAgICAgdHhhSGludC5zZXRGb2N1c2FibGUoZmFsc2UpOwotICAgICAgICB0eGFIaW50LnNldExpbmVXcmFwKHRydWUpOwotICAgICAgICB0eGFIaW50LnNldFdyYXBTdHlsZVdvcmQodHJ1ZSk7Ci0gICAgICAgIHR4YUhpbnQuc2V0T3BhcXVlKGZhbHNlKTsKLQotICAgICAgICBidG5IaW50ID1uZXcgSkJ1dHRvbigiSGludCA+PiIpOwotICAgICAgICBidG5IaW50LnNldEJvcmRlcihuZXcgRW1wdHlCb3JkZXIobmV3IEluc2V0cygwLDAsMCwwKSkpOwotCi0gICAgICAgIGxibFdTREw9bmV3IEpMYWJlbCgiU2VsZWN0IGEgV1NETCBmaWxlIik7Ci0KLSAgICAgICAgY2hrQm94U2tpcCA9bmV3IEpDaGVja0JveCgiU2tpcCBXU0RMIix0cnVlKTsKLQotICAgICAgICBjaGtCb3hTZWxlY3QgPW5ldyBKQ2hlY2tCb3goIlNlbGVjdCBXU0RMIixmYWxzZSkgOwotCi0gICAgICAgIEJ1dHRvbkdyb3VwICBidXR0b25Hcm91cD0gbmV3ICBCdXR0b25Hcm91cCgpOwotICAgICAgICBidXR0b25Hcm91cC5hZGQoY2hrQm94U2tpcCApOwotICAgICAgICBidXR0b25Hcm91cC5hZGQoY2hrQm94U2VsZWN0ICk7Ci0KLSAgICAgICAgdHh0V1NETD1uZXcgSlRleHRGaWVsZCgpOwotCi0gICAgICAgIGJ0bkJyb3dzZT1uZXcgSkJ1dHRvbigiQnJvd3NlLi4iKTsKLQotICAgICAgICBzZXRCYWNrQnV0dG9uRW5hYmxlZCh0cnVlKTsKLSAgICAgICAgc2V0TmV4dEJ1dHRvbkVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgIHNldEZpbmlzaEJ1dHRvbkVuYWJsZWQoZmFsc2UpOwotICAgICAgICB0aGlzLnNldExheW91dChuZXcgR3JpZEJhZ0xheW91dCgpKTsKLQotICAgICAgICB0aGlzLmFkZChjaGtCb3hTa2lwCi0gICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygwLCAwLCBHcmlkQmFnQ29uc3RyYWludHMuUkVNQUlOREVSLCAxLCAwLjAsIDAuMAotICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5XRVNUICwgR3JpZEJhZ0NvbnN0cmFpbnRzLk5PTkUKLSAgICAgICAgLCBuZXcgSW5zZXRzKDUsIDEwLCAwLDEwKSwgMCwgMCkpOwotICAgICAgICBjaGtCb3hTa2lwIC5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSAgewotICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgdGhpcy5hZGQoY2hrQm94U2VsZWN0Ci0gICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygwLCAxLCBHcmlkQmFnQ29uc3RyYWludHMuUkVNQUlOREVSLCAxLCAwLjAsIDAuMAotICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5XRVNUICAsIEdyaWRCYWdDb25zdHJhaW50cy5OT05FCi0gICAgICAgICwgbmV3IEluc2V0cyg1LCAxMCwgMCwwKSwgMCwgMCkpOwotICAgICAgICBjaGtCb3hTZWxlY3QuYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICB0aGlzLmFkZChsYmxXU0RMCi0gICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygwLCAyLCAxLCAxLCAwLjEsIDAuMAotICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5XRVNUICAsIEdyaWRCYWdDb25zdHJhaW50cy5OT05FCi0gICAgICAgICwgbmV3IEluc2V0cyg1LCAxMCwgMCwwKSwgMCwgMCkpOwotCi0gICAgICAgICB0aGlzLmFkZCh0eHRXU0RMCi0gICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygxLCAyLCAxLCAxLCAxLjAsIDAuMAotICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5XRVNUICAsIEdyaWRCYWdDb25zdHJhaW50cy5IT1JJWk9OVEFMCi0gICAgICAgICwgbmV3IEluc2V0cyg1LCAxMCwgMCwgMCksIDAsIDApKTsKLQotICAgICAgICAgdGhpcy5hZGQoYnRuQnJvd3NlCi0gICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygyLCAyLCAxLCAxLCAwLjEsIDAuMAotICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5DRU5URVIgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLk5PTkUKLSAgICAgICAgLCBuZXcgSW5zZXRzKDUsIDEwLCAwLCAxMCksIDAsIDApKTsKLQotICAgICAgICBidG5Ccm93c2UuYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgYnJvd3NlV1NETEZpbGUoKTsKLSAgICAgICAgICAgICAgICBjaGVja1dTRExGaWxlKCk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIHRoaXMuYWRkKGJ0bkhpbnQKLSAgICAgICAgICAgICAgICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygwLCAzLCAxLCAxLCAwLjEsMC4wCi0gICAgICAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5XRVNUICwgR3JpZEJhZ0NvbnN0cmFpbnRzLk5PTkUKLSAgICAgICAgICAgICAgICAgICAgICwgbmV3IEluc2V0cyg1LCAxMCwgMCwgMTApLCAwLCAwKSk7Ci0gICAgICAgICAgICAgYnRuSGludC5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSAgewotICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgICAgICAgaWYoZmxhZyl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgYnRuSGludC5zZXRUZXh0KCJIaW50ID4+Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgdHhhSGludC5zZXRUZXh0KCIiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnPWZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgYnRuSGludC5zZXRUZXh0KCJIaW50IDw8Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgdHhhSGludC5zZXRUZXh0KGhpbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWc9dHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZSgpOwotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgfSk7Ci0KLSAgICAgICAgICAgICB0aGlzLmFkZCh0eGFIaW50Ci0gICAgICAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMCwgNCwgR3JpZEJhZ0NvbnN0cmFpbnRzLlJFTUFJTkRFUiwgMSwgMC4xLDEuMAotICAgICAgICAgICAgICAgICAgICAgLCBHcmlkQmFnQ29uc3RyYWludHMuQ0VOVEVSICwgR3JpZEJhZ0NvbnN0cmFpbnRzLkJPVEgKLSAgICAgICAgICAgICAgICAgICAgICwgbmV3IEluc2V0cyg1LCAxMCwgMTAsIDEwKSwgMCwgMCkpOwotCi0KLSAgICB9Ci0KLSAgICAgcHVibGljIHZvaWQgYmFjaygpIHsKLSAgICAgICAgICBzd2l0Y2hQYW5lbChDb2RlZ2VuRnJhbWUuUEFORUxfRklSU1RfQyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbmV4dCgpIHsKLSAgICAgICAgIHN3aXRjaFBhbmVsKENvZGVnZW5GcmFtZS5QQU5FTF9USElSRF9DICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdXBkYXRlKCl7Ci0gICAgICAgIHNldENoYW5nZUVuYWJsZWQoKTsKLSAgICAgICAgZmlsbEJlYW4oKTsKLSAgICAgICAgc2V0UGFnZUNvbXBsZXRlKHRydWUpOwotICAgICAgICBzZXRCYWNrQnV0dG9uRW5hYmxlZCh0cnVlKTsKLSAgICAgICAgc2V0TmV4dEJ1dHRvbkVuYWJsZWQodHJ1ZSk7Ci0gICAgfQotICAgICBwdWJsaWMgIGludCBnZXRQYWdlVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuICBXaXphcmRQYW5lbC5TRVJWSUNFX0FSQ0hJVkVfVFlQRTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2V0Q2hhbmdlRW5hYmxlZCgpewotICAgICAgICBpZihjaGtCb3hTa2lwLmlzU2VsZWN0ZWQoKSl7Ci0gICAgICAgICAgICBsYmxXU0RMLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgdHh0V1NETCAuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICBidG5Ccm93c2Uuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIH1lbHNlewotICAgICAgICAgICAgbGJsV1NETC5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgdHh0V1NETC5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgYnRuQnJvd3NlLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZmlsbEJlYW4oKXsKLSAgICAgICAgaWYoY2hrQm94U2VsZWN0LmlzU2VsZWN0ZWQoKSl7Ci0gICAgICAgICAgICBpZighdHh0V1NETC5nZXRUZXh0KCkuZXF1YWxzKCIiKSkKLSAgICAgICAgICAgIGFyY2hpdmVCZWFuLmFkZFdzZGxzKG5ldyBGaWxlKHR4dFdTREwuZ2V0VGV4dCgpKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrV1NETEZpbGUoKXsKLSAgICAgICAgaWYgKHR4dFdTREwuZ2V0VGV4dCgpLmVxdWFscygiIikgKSB7Ci0gICAgICAgICAgICB0cnl7Ci0gICAgICAgICAgICAgICAgV1NETFJlYWRlciByZWFkZXIgPSBXU0RMRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1dTRExSZWFkZXIoKTsKLSAgICAgICAgICAgICAgICByZWFkZXIucmVhZFdTREwodHh0V1NETC5nZXRUZXh0KCkudHJpbSgpKSA7Ci0gICAgICAgICAgICB9Y2F0Y2goV1NETEV4Y2VwdGlvbiBlMSkgewotICAgICAgICAgICAgICAgIHR4dFdTREwuc2V0VGV4dCgiIik7Ci0gICAgICAgICAgICAgICAgSk9wdGlvblBhbmUuc2hvd01lc3NhZ2VEaWFsb2coYnRuQnJvd3NlICwgIlRoZSBmaWxlIHNlbGVjdGVkIGlzIG5vdCBhIHZhbGlkIFdTRExmaWxlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJBeGlzMiBTZXJ2aWNlQXJjaGlldmUgY3JlYXRpb24iLCBKT3B0aW9uUGFuZS5FUlJPUl9NRVNTQUdFKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBwcml2YXRlIHZvaWQgYnJvd3NlV1NETEZpbGUoKXsKLSAgICAgICAgZmlsZUNob29zZXIuc2V0RmlsZUZpbHRlcihuZXcgV1NETEZpbGVGaWx0ZXIoKSk7Ci0gICAgICAgIGZpbGVDaG9vc2VyLnNldEN1cnJlbnREaXJlY3RvcnkoYXJjaGl2ZUJlYW4uZ2V0Q2xhc3NMb2MoKSk7Ci0gICAgICAgIGludCByZXR1cm5WYWwgPSBmaWxlQ2hvb3Nlci5zaG93T3BlbkRpYWxvZyhidG5Ccm93c2UpOwotICAgICAgICBpZiAocmV0dXJuVmFsID09IEpGaWxlQ2hvb3Nlci5BUFBST1ZFX09QVElPTikgewotICAgICAgICAgICAgRmlsZSBmaWxlID0gZmlsZUNob29zZXIuZ2V0U2VsZWN0ZWRGaWxlKCk7Ci0gICAgICAgICAgICB0eHRXU0RMLnNldFRleHQoZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9pZGVhcGx1Z2luL2ZyYW1lcy90YWJsZS9BcmNoaXZlVGFibGVNb2RlbC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaWRlYXBsdWdpbi9mcmFtZXMvdGFibGUvQXJjaGl2ZVRhYmxlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhlYTFmOS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9pZGVhcGx1Z2luL2ZyYW1lcy90YWJsZS9BcmNoaXZlVGFibGVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmlkZWFwbHVnaW4uZnJhbWVzLnRhYmxlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5pZGVhcGx1Z2luLmJlYW4uT3BlcmF0aW9uT2JqOwotCi1pbXBvcnQgamF2YXguc3dpbmcudGFibGUuQWJzdHJhY3RUYWJsZU1vZGVsOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIEFyY2hpdmVUYWJsZU1vZGVsIGV4dGVuZHMgQWJzdHJhY3RUYWJsZU1vZGVsIHsKLQotICAgIGZpbmFsIFN0cmluZ1tdIGNvbHVtbk5hbWVzID0geyJPcGVyYXRpb24gTmFtZSIsICJSZXR1cm4gVmFsdWUiLCAiUGFyYW1ldGVycyAiLCAiU2VsZWN0In07Ci0gICAgT2JqZWN0W11bXSBkYXR2YWx1ZTsKLSAgICBwcml2YXRlIEhhc2hNYXAgZGF0b2JqczsKLQotICAgIHB1YmxpYyBBcmNoaXZlVGFibGVNb2RlbChIYXNoTWFwIGRhdGFvYmplY3QpIHsKLSAgICAgICAgaW50IHNpemUgPSBkYXRhb2JqZWN0LnNpemUoKTsKLSAgICAgICAgZGF0dmFsdWUgPSBuZXcgT2JqZWN0W3NpemVdWzRdOwotICAgICAgICBJdGVyYXRvciBpdHIgPSBkYXRhb2JqZWN0LnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgICAgIGludCBjb3VudCA9IDA7Ci0gICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBPcGVyYXRpb25PYmogb3BlcmF0aW9uT2JqID0gKE9wZXJhdGlvbk9iaikgaXRyLm5leHQoKTsKLSAgICAgICAgICAgIGRhdHZhbHVlW2NvdW50XVswXSA9IG9wZXJhdGlvbk9iai5nZXRPcE5hbWUoKTsKLSAgICAgICAgICAgIGRhdHZhbHVlW2NvdW50XVsxXSA9IG9wZXJhdGlvbk9iai5nZXRSZXR1cm5WYWx1ZSgpOwotICAgICAgICAgICAgZGF0dmFsdWVbY291bnRdWzJdID0gb3BlcmF0aW9uT2JqLmdldFBhcmFtZXRlcnMoKTsKLSAgICAgICAgICAgIGRhdHZhbHVlW2NvdW50XVszXSA9IG9wZXJhdGlvbk9iai5nZXRTZWxlY3QoKTsKLSAgICAgICAgICAgIGNvdW50Kys7Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy5kYXRvYmpzID0gZGF0YW9iamVjdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldENvbHVtbkNvdW50KCkgewotICAgICAgICByZXR1cm4gY29sdW1uTmFtZXMubGVuZ3RoOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0Um93Q291bnQoKSB7Ci0gICAgICAgIHJldHVybiBkYXR2YWx1ZS5sZW5ndGg7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRDb2x1bW5OYW1lKGludCBjb2wpIHsKLSAgICAgICAgcmV0dXJuIGNvbHVtbk5hbWVzW2NvbF07Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRWYWx1ZUF0KGludCByb3csIGludCBjb2wpIHsKLSAgICAgICAgcmV0dXJuIGRhdHZhbHVlW3Jvd11bY29sXTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2xhc3MgZ2V0Q29sdW1uQ2xhc3MoaW50IGMpIHsKLSAgICAgICAgcmV0dXJuIGdldFZhbHVlQXQoMCwgYykuZ2V0Q2xhc3MoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0NlbGxFZGl0YWJsZShpbnQgcm93LCBpbnQgY29sKSB7Ci0gICAgICAgIHJldHVybiBjb2wgPj0gMzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZUF0KE9iamVjdCB2YWx1ZSwgaW50IHJvdywgaW50IGNvbCkgewotICAgICAgICBPcGVyYXRpb25PYmogb2JqID0gKE9wZXJhdGlvbk9iaikgZGF0b2Jqcy5nZXQoZ2V0VmFsdWVBdChyb3csIDApKTsKLSAgICAgICAgaWYgKGNvbCA9PSAzKSB7Ci0gICAgICAgICAgICBvYmouc2V0U2VsZWN0KChCb29sZWFuKSB2YWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZGF0dmFsdWVbMF1bY29sXSBpbnN0YW5jZW9mIEludGVnZXIpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgZGF0dmFsdWVbcm93XVtjb2xdID0gbmV3IEludGVnZXIoKFN0cmluZykgdmFsdWUpOwotICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBkYXR2YWx1ZVtyb3ddW2NvbF0gPSB2YWx1ZTsKLSAgICAgICAgfQotLy8gICAgICAgIG9iai5wcmludE1lKCk7Ci0gICAgfQotfQotCi0KLQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaWRlYXBsdWdpbi9wbHVnaW4vQXhpczJJZGVhUGx1Z2luLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9pZGVhcGx1Z2luL3BsdWdpbi9BeGlzMklkZWFQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDAwZDEyYy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9pZGVhcGx1Z2luL3BsdWdpbi9BeGlzMklkZWFQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuaWRlYXBsdWdpbi5wbHVnaW47Ci0KLWltcG9ydCBjb20uaW50ZWxsaWoub3BlbmFwaS5jb21wb25lbnRzLkFwcGxpY2F0aW9uQ29tcG9uZW50OwotaW1wb3J0IGNvbS5pbnRlbGxpai5vcGVuYXBpLm9wdGlvbnMuQ29uZmlndXJhYmxlOwotaW1wb3J0IGNvbS5pbnRlbGxpai5vcGVuYXBpLm9wdGlvbnMuQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBjb20uaW50ZWxsaWoub3BlbmFwaS5wcm9qZWN0LlByb2plY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29scy53aXphcmRmcmFtZS5Db2RlZ2VuRnJhbWU7Ci0KLWltcG9ydCBqYXZheC5zd2luZy4qOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MSW5wdXRGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgQXhpczJJZGVhUGx1Z2luIGltcGxlbWVudHMgQXBwbGljYXRpb25Db21wb25lbnQsIENvbmZpZ3VyYWJsZSB7Ci0gICAgcHJpdmF0ZSBDb2RlZ2VuRnJhbWUgZm9ybTsKLSAgICBwcml2YXRlIEltYWdlSWNvbiBteUljb247Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgaXMgY2FsbGVkIGFmdGVyIHBsdWdpbiBpcyBhbHJlYWR5IGNyZWF0ZWQgYW5kIGNvbmZpZ3VyZWQuIFBsdWdpbiBjYW4gc3RhcnQgdG8gY29tbXVuaWNhdGUgd2l0aAotICAgICAqIG90aGVyIHBsdWdpbnMgb25seSBpbiB0aGlzIG1ldGhvZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbml0Q29tcG9uZW50KCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgWE1MSW5wdXRGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvL0ZpeGluZyBjbGFzcyBsb2FkaW5nIGlzc3VlCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0gICAgICAgICAgICAvLy8vRml4aW5nIGNsYXNzIGxvYWRpbmcgaXNzdWUKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChmb3JtID09IG51bGwpIHsKLSAgICAgICAgICAgIGZvcm0gPSBuZXcgQ29kZWdlbkZyYW1lKCk7Ci0gICAgICAgICAgICBmb3JtLnNldFJlc2l6YWJsZSh0cnVlKTsKLSAgICAgICAgICAgIGZvcm0uc2V0RGVmYXVsdENsb3NlT3BlcmF0aW9uKEpGcmFtZS5FWElUX09OX0NMT1NFKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobXlJY29uID09IG51bGwpIHsKLSAgICAgICAgICAgIGphdmEubmV0LlVSTCByZXNvdXJjZSA9IEF4aXMySWRlYVBsdWdpbi5jbGFzcy5nZXRSZXNvdXJjZSgiL2ljb25zL2ljb24ucG5nIik7Ci0gICAgICAgICAgICBteUljb24gPSBuZXcgSW1hZ2VJY29uKHJlc291cmNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbiBwbHVnaW4gZGlzcG9zYWwuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZUNvbXBvbmVudCgpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIGNvbXBvbmVudAotICAgICAqCi0gICAgICogQHJldHVybiBTdHJpbmcgcmVwcmVzZW50aW5nIGNvbXBvbmVudCBuYW1lLiBVc2UgUGx1Z2luTmFtZS5Db21wb25lbnROYW1lIG5vdGF0aW9uCi0gICAgICogICAgICAgICB0byBhdm9pZCBjb25mbGljdHMuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRDb21wb25lbnROYW1lKCkgewotICAgICAgICByZXR1cm4gIkFjdGlvbnNTYW1wbGUuQWN0aW9uc1BsdWdpbiI7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXREaXNwbGF5TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJBeGlzMiBQbHVnLWlucyI7Ci0gICAgfQotCi0gICAgcHVibGljIEljb24gZ2V0SWNvbigpIHsKLSAgICAgICAgcmV0dXJuIG15SWNvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEhlbHBUb3BpYygpIHsKLSAgICAgICAgcmV0dXJuICJObyBoZWxwIGF2YWlsYWJsZSI7Ci0gICAgfQotCi0gICAgcHVibGljIEpDb21wb25lbnQgY3JlYXRlQ29tcG9uZW50KCkgewotICAgICAgICBpZiAoZm9ybSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBmb3JtID0gbmV3IENvZGVnZW5GcmFtZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmb3JtLmdldFJvb3RDb21wb25lbnQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc01vZGlmaWVkKCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYXBwbHkoKSB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZXNldCgpIHsKLSAgICAgICAgLy9UbyBjaGFuZ2UgYm9keSBvZiBpbXBsZW1lbnRlZCBtZXRob2RzIHVzZSBGaWxlIHwgU2V0dGluZ3MgfCBGaWxlIFRlbXBsYXRlcy4KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlVUlSZXNvdXJjZXMoKSB7Ci0gICAgICAgIGZvcm0gPSBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNob3dUb29sKFByb2plY3QgcHJvamVjdCkgewotICAgICAgICBmb3JtLnNldFByb2plY3QocHJvamVjdCk7Ci0gICAgICAgIGZvcm0uc2hvd1VJKCk7Ci0KLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2lkZWFwbHVnaW4vcGx1Z2luL0F4aXMyUGx1Z2luQWN0aW9uLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9pZGVhcGx1Z2luL3BsdWdpbi9BeGlzMlBsdWdpbkFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjY5Y2ZiLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2lkZWFwbHVnaW4vcGx1Z2luL0F4aXMyUGx1Z2luQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuaWRlYXBsdWdpbi5wbHVnaW47Ci0KLWltcG9ydCBjb20uaW50ZWxsaWoub3BlbmFwaS5hY3Rpb25TeXN0ZW0uQWN0aW9uUGxhY2VzOwotaW1wb3J0IGNvbS5pbnRlbGxpai5vcGVuYXBpLmFjdGlvblN5c3RlbS5BbkFjdGlvbjsKLWltcG9ydCBjb20uaW50ZWxsaWoub3BlbmFwaS5hY3Rpb25TeXN0ZW0uQW5BY3Rpb25FdmVudDsKLWltcG9ydCBjb20uaW50ZWxsaWoub3BlbmFwaS5hY3Rpb25TeXN0ZW0uRGF0YUNvbnN0YW50czsKLWltcG9ydCBjb20uaW50ZWxsaWoub3BlbmFwaS5hY3Rpb25TeXN0ZW0uUHJlc2VudGF0aW9uOwotaW1wb3J0IGNvbS5pbnRlbGxpai5vcGVuYXBpLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uOwotaW1wb3J0IGNvbS5pbnRlbGxpai5vcGVuYXBpLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uTWFuYWdlcjsKLWltcG9ydCBjb20uaW50ZWxsaWoub3BlbmFwaS5wcm9qZWN0LlByb2plY3Q7Ci0KLWltcG9ydCBqYXZheC5zd2luZy4qOwotCi1wdWJsaWMgY2xhc3MgQXhpczJQbHVnaW5BY3Rpb24gZXh0ZW5kcyBBbkFjdGlvbiB7Ci0KLSAgICBwcml2YXRlIEltYWdlSWNvbiBteUljb247Ci0KLSAgICBwdWJsaWMgQXhpczJQbHVnaW5BY3Rpb24oKSB7Ci0gICAgICAgIHN1cGVyKCJHQyIsICJBeGlzMiBwbHVnaW5zIiwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFuQWN0aW9uRXZlbnQgYW5BY3Rpb25FdmVudCkgewotICAgICAgICBBcHBsaWNhdGlvbiBhcHBsaWNhdGlvbiA9Ci0gICAgICAgICAgICAgICAgQXBwbGljYXRpb25NYW5hZ2VyLmdldEFwcGxpY2F0aW9uKCk7Ci0gICAgICAgIFByb2plY3QgcHJvamVjdCA9IChQcm9qZWN0KSBhbkFjdGlvbkV2ZW50LmdldERhdGFDb250ZXh0KCkuZ2V0RGF0YShEYXRhQ29uc3RhbnRzLlBST0pFQ1QpOwotCi0gICAgICAgIEF4aXMySWRlYVBsdWdpbiBheGlzMmNvbXBvbmVudCA9Ci0gICAgICAgICAgICAgICAgKEF4aXMySWRlYVBsdWdpbikgYXBwbGljYXRpb24uZ2V0Q29tcG9uZW50KEF4aXMySWRlYVBsdWdpbi5jbGFzcyk7Ci0gICAgICAgIGF4aXMyY29tcG9uZW50LnNob3dUb29sKHByb2plY3QpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZShBbkFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIHN1cGVyLnVwZGF0ZShldmVudCk7Ci0gICAgICAgIFByZXNlbnRhdGlvbiBwcmVzZW50YXRpb24gPSBldmVudC5nZXRQcmVzZW50YXRpb24oKTsKLSAgICAgICAgaWYgKEFjdGlvblBsYWNlcy5NQUlOX1RPT0xCQVIuZXF1YWxzKGV2ZW50LmdldFBsYWNlKCkpKSB7Ci0gICAgICAgICAgICBpZiAobXlJY29uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBqYXZhLm5ldC5VUkwgcmVzb3VyY2UgPSBBeGlzMlBsdWdpbkFjdGlvbi5jbGFzcy5nZXRSZXNvdXJjZSgiL2ljb25zL2ljb24ucG5nIik7Ci0gICAgICAgICAgICAgICAgbXlJY29uID0gbmV3IEltYWdlSWNvbihyZXNvdXJjZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwcmVzZW50YXRpb24uc2V0SWNvbihteUljb24pOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9wbGV4dXMvY29tcG9uZW50cy54bWwgYi92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9wbGV4dXMvY29tcG9uZW50cy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwOGM5MmUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvcGxleHVzL2NvbXBvbmVudHMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08Y29tcG9uZW50LXNldD4KLSAgPGNvbXBvbmVudHM+Ci0gICAgPGNvbXBvbmVudD4KLSAgICAgIDxyb2xlPm9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QuaGFuZGxlci5BcnRpZmFjdEhhbmRsZXI8L3JvbGU+Ci0gICAgICA8cm9sZS1oaW50PmFhcjwvcm9sZS1oaW50PgotICAgICAgPGltcGxlbWVudGF0aW9uPm9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QuaGFuZGxlci5EZWZhdWx0QXJ0aWZhY3RIYW5kbGVyPC9pbXBsZW1lbnRhdGlvbj4KLSAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICA8Y2xhc3NpZmllcj48L2NsYXNzaWZpZXI+Ci0gICAgICAgIDxleHRlbnNpb24+YWFyPC9leHRlbnNpb24+Ci0gICAgICAgIDx0eXBlPmFhcjwvdHlwZT4KLSAgICAgICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KLSAgICAgICAgPGxhbmd1YWdlPmphdmE8L2xhbmd1YWdlPgotICAgICAgICA8YWRkZWRUb0NsYXNzcGF0aD5mYWxzZTwvYWRkZWRUb0NsYXNzcGF0aD4KLSAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICA8L2NvbXBvbmVudD4KLSAgICA8Y29tcG9uZW50PgotICAgICAgPHJvbGU+b3JnLmFwYWNoZS5tYXZlbi5saWZlY3ljbGUubWFwcGluZy5MaWZlY3ljbGVNYXBwaW5nPC9yb2xlPgotICAgICAgPHJvbGUtaGludD5hYXI8L3JvbGUtaGludD4KLSAgICAgIDxpbXBsZW1lbnRhdGlvbj5vcmcuYXBhY2hlLm1hdmVuLmxpZmVjeWNsZS5tYXBwaW5nLkRlZmF1bHRMaWZlY3ljbGVNYXBwaW5nPC9pbXBsZW1lbnRhdGlvbj4KLSAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICA8cGhhc2VzPgotICAgICAgICAgIDxwcm9jZXNzLXJlc291cmNlcz5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM6bWF2ZW4tcmVzb3VyY2VzLXBsdWdpbjpyZXNvdXJjZXM8L3Byb2Nlc3MtcmVzb3VyY2VzPgotICAgICAgICAgIDxjb21waWxlPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczptYXZlbi1jb21waWxlci1wbHVnaW46Y29tcGlsZTwvY29tcGlsZT4KLSAgICAgICAgICA8cHJvY2Vzcy10ZXN0LXJlc291cmNlcz5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM6bWF2ZW4tcmVzb3VyY2VzLXBsdWdpbjp0ZXN0UmVzb3VyY2VzPC9wcm9jZXNzLXRlc3QtcmVzb3VyY2VzPgotICAgICAgICAgIDx0ZXN0LWNvbXBpbGU+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zOm1hdmVuLWNvbXBpbGVyLXBsdWdpbjp0ZXN0Q29tcGlsZTwvdGVzdC1jb21waWxlPgotICAgICAgICAgIDx0ZXN0Pm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczptYXZlbi1zdXJlZmlyZS1wbHVnaW46dGVzdDwvdGVzdD4KLSAgICAgICAgICA8cGFja2FnZT5vcmcuYXBhY2hlLmF4aXMyOmF4aXMyLWFhci1tYXZlbi1wbHVnaW46YWFyPC9wYWNrYWdlPgotICAgICAgICAgIDxpbnN0YWxsPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczptYXZlbi1pbnN0YWxsLXBsdWdpbjppbnN0YWxsPC9pbnN0YWxsPgotICAgICAgICAgIDxkZXBsb3k+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zOm1hdmVuLWRlcGxveS1wbHVnaW46ZGVwbG95PC9kZXBsb3k+Ci0gICAgICAgIDwvcGhhc2VzPgotICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgIDwvY29tcG9uZW50PgotICA8L2NvbXBvbmVudHM+Ci08L2NvbXBvbmVudC1zZXQ+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9wbHVnaW4ueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWIzMWVjOS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08IURPQ1RZUEUgaWRlYS1wbHVnaW4gUFVCTElDICJQbHVnaW4vRFREIiAiaHR0cDovL3BsdWdpbnMuaW50ZWxsaWoubmV0L3BsdWdpbi5kdGQiPgotPCEtLTxpZGVhLXBsdWdpbj4tLT4KLTxpZGVhLXBsdWdpbiB1cmw9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9+ZGVlcGFsIj4KLQotICAgIDwhLS0gUGx1Z2luIG5hbWUgLS0+Ci0gICAgPG5hbWU+QXhpczIgSURFQSB0b29sczwvbmFtZT4KLQotICAgIDwhLS0gRGVzY3JpcHRpb24gLS0+Ci0gICAgPGRlc2NyaXB0aW9uPiBTZXJ2aWNlIEFyY2hpdmUgY3JlYXRpb24gYW5kIENvZGUgR2VuZXJhdGlvbiA8L2Rlc2NyaXB0aW9uPgotCi0gICAgPCEtLSBQbHVnaW4gdmVyc2lvbiAtLT4KLSAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+Ci0KLSAgICA8IS0tIFBsdWdpbidzIHZlbmRvciAtLT4KLSAgICA8IS0tICA8dmVuZG9yIGxvZ289Ii9nZW5lcmFsL2lqTG9nby5wbmciPkludGVsbGlKPC92ZW5kb3I+LS0+Ci0gICAgPHZlbmRvciBlbWFpbD0iZGVlcGFsQGFwYWNoZS5vcmciPkRlZXBhbCBKYXlhc2luZ2hlIDwvdmVuZG9yPgotCi0gICAgPCEtLSB0aGUgSURFQSBidWlsZCBudW1iZXIgd2hpY2ggd29ya3Mgd2l0aCBwbHVnaW4gLS0+Ci0gICAgPGlkZWEtdmVyc2lvbiBzaW5jZS1idWlsZD0iMjAwMCIgLz4KLQotICAgIDwhLS0gUGx1Z2luJ3MgYXBwbGljYXRpb24gY29tcG9uZW50cyAtLT4KLSAgICA8YXBwbGljYXRpb24tY29tcG9uZW50cz4KLSAgICAgICAgPGNvbXBvbmVudD4KLSAgICAgICAgICAgIDwhLS0gQ29tcG9uZW50J3MgaW1wbGVtZW50YXRpb24gY2xhc3MgLS0+Ci0gICAgICAgICAgICA8aW1wbGVtZW50YXRpb24tY2xhc3M+b3JnLmFwYWNoZS5pZGVhcGx1Z2luLnBsdWdpbi5BeGlzMklkZWFQbHVnaW48L2ltcGxlbWVudGF0aW9uLWNsYXNzPgotCi0gICAgICAgICAgICA8IS0tIENvbXBvbmVudCdzIGludGVyZmFjZSBjbGFzcyAtLT4KLSAgICAgICAgICAgIDxpbnRlcmZhY2UtY2xhc3M+b3JnLmFwYWNoZS5pZGVhcGx1Z2luLnBsdWdpbi5BeGlzMklkZWFQbHVnaW48L2ludGVyZmFjZS1jbGFzcz4KLSAgICAgICAgPC9jb21wb25lbnQ+Ci0gICAgPC9hcHBsaWNhdGlvbi1jb21wb25lbnRzPgotICAgIDwhLS0gQ29tcG9uZW50J3MgYWN0aW9ucyAtLT4KLSAgICA8YWN0aW9ucz4KLSAgICAgICAgPCEtLSBXZSB1c2UgIlBsdWdpbk5hbWUuQ29tcG9uZW50TmFtZS5BY3Rpb25OYW1lIiBub3RhdGlvbiBmb3IgImlkIiB0byBhdm9pZCBjb25mbGljdHMgLS0+Ci0gICAgICAgIDxhY3Rpb24gaWQ9IkFjdGlvbnNTYW1wbGUuQWN0aW9uc1BsdWdpbi5TZXJ2aWNlQXJjaGl2ZUNyZWF0b3IiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5pZGVhcGx1Z2luLnBsdWdpbi5BeGlzMlBsdWdpbkFjdGlvbiIKLSAgICAgICAgICAgIHRleHQ9IkF4aXMyIHBsdWdpbnMiIGRlc2NyaXB0aW9uPSJTZXJ2aWNlIGNyZWF0aW9uIGFuZCBjb2RlIGdlbmVyYXRpb24iPgotICAgICAgICAgICAgPGtleWJvYXJkLXNob3J0Y3V0IGZpcnN0LWtleXN0cm9rZT0iYWx0IFciIHNlY29uZC1rZXlzdHJva2U9IkMiIGtleW1hcD0iJGRlZmF1bHQiLz4KLSAgICAgICAgICAgIDxtb3VzZS1zaG9ydGN1dCBrZXlzdHJva2U9ImN0cmwgYWx0IGJ1dHRvbjIiIGtleW1hcD0iJGRlZmF1bHQiLz4KLSAgICAgICAgPC9hY3Rpb24+Ci0KLSAgICAgICAgPCEtLSAgICA8Z3JvdXAgaWQ9IkFjdGlvbnMuQWN0aW9uc1BsdWdpbi5TYW1wbGVHcm91cCIgdGV4dD0iU19hbXBsZSIgZGVzY3JpcHRpb249IlNhbXBsZSBncm91cCI+LS0+Ci0gICAgICAgIDxncm91cCBpZD0iQWN0aW9ucy5BY3Rpb25zUGx1Z2luLlNhbXBsZUdyb3VwIiB0ZXh0PSJBeGlzMiIgZGVzY3JpcHRpb249IkF4aXMyIEdyb3VwIj4KLSAgICAgICAgICAgIDxyZWZlcmVuY2UgaWQ9IkFjdGlvbnNTYW1wbGUuQWN0aW9uc1BsdWdpbi5TZXJ2aWNlQXJjaGl2ZUNyZWF0b3IiLz4KLSAgICAgICAgICAgIDxzZXBhcmF0b3IvPgotICAgICAgICAgICAgPGFkZC10by1ncm91cCBncm91cC1pZD0iTWFpbk1lbnUiIGFuY2hvcj0ibGFzdCIvPgotICAgICAgICAgICAgPGFkZC10by1ncm91cCBncm91cC1pZD0iTWFpblRvb2xCYXIiIGFuY2hvcj0iYmVmb3JlIiByZWxhdGl2ZS10by1hY3Rpb249IkhlbHBUb3BpY3MiLz4KLSAgICAgICAgPC9ncm91cD4KLQotICAgICAgICA8IS0tdGhlIGdyb3VwIGJlbG93IGNvbnRhaW5zIG9ubHkgdGhlICJIZWxsbyBXb3JsZCIgYWN0aW9uIGRlZmluZWQgYWJvdmUgLS0+Ci0gICAgICAgIDxncm91cD4KLSAgICAgICAgICAgIDxyZWZlcmVuY2UgaWQ9IkFjdGlvbnNTYW1wbGUuQWN0aW9uc1BsdWdpbi5TZXJ2aWNlQXJjaGl2ZUNyZWF0b3IiLz4KLSAgICAgICAgICAgIDwhLS10aGUgZ3JvdXAgaXMgYWRkZWQgdG8gdGhlIGVkaXRvciBwb3B1cCBtZW51LS0+Ci0gICAgICAgICAgICA8YWRkLXRvLWdyb3VwIGdyb3VwLWlkPSJFZGl0b3JQb3B1cE1lbnUiIGFuY2hvcj0iYWZ0ZXIiIHJlbGF0aXZlLXRvLWFjdGlvbj0iQ3V0Q29weVBhc3RlR3JvdXAiLz4KLSAgICAgICAgPC9ncm91cD4KLQotICAgIDwvYWN0aW9ucz4KLQotPC9pZGVhLXBsdWdpbj4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vc3JjL3NpdGUvYXB0L2hvd3RvLmFwdCBiL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vc3JjL3NpdGUvYXB0L2hvd3RvLmFwdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBhN2E0Yy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9zaXRlL2FwdC9ob3d0by5hcHQKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0gLS0tLS0tCi0gTWF2ZW4gMiBBYXIgUGx1Z2luOiBjb25maWd1cmF0aW9uIGV4YW1wbGVzCi0gLS0tLS0tCi0gSm9jaGVuIFdpZWRtYW5uIAotIDxqb2NoZW4ud2llZG1hbm5AZ21haWwuY29tPgotIC0tLS0tLQotCi1JbnRyb2R1Y3Rpb24KLQotICBUaGUgQWFyIHBsdWdpbiBhbGxvd3MgdGhlIHBhY2thZ2luZyBvZiBhbiBBeGlzIDIgc2VydmljZSBhYXIgaW4gMyBkaWZmZXJlbnQgbW9kZXM6Ci0KLSAgICogYWFyIChkZWZhdWx0KTogZ2VuZXJhdGVzIHRoZSBhYXIgYXJ0aWZhY3QKLQotICAgKiBpbnBsYWNlOiBwYWNrYWdlIHRoZSBhYXIgaW4gdGhlIHNvdXJjZSB0cmVlCi0KLSAgICogZXhwbG9kZWQgOiBwYWNrYWdlIGFuIGV4cGxvZGVkIGFhciBhcHBsaWNhdGlvbgotCi0gIEVhY2ggbW9kZSBpcyBtYXRlcmlhbGl6ZWQgYnkgYSBnb2FsLiBGb3IgaW5zdGFuY2UsIHRvIGdlbmVyYXRlIGFuIGV4cGxvZGVkCi0gIHNhciBmcm9tIHRoZSBjdXJyZW50IHByb2plY3QsIG9uZSB3b3VsZCB0eXBlCi0KLSstLS0tLS0tLQotICBtdm4gYWFyOmV4cGxvZGVkCi0rLS0tLS0tLS0tCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9zaXRlL2FwdC9pbnRyb2R1Y3Rpb24uYXB0IGIvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvc2l0ZS9hcHQvaW50cm9kdWN0aW9uLmFwdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg1N2RiNS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9zaXRlL2FwdC9pbnRyb2R1Y3Rpb24uYXB0CisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotIC0tLS0tLQotIE1hdmVuIDIgQWFyIFBsdWdpbgotIC0tLS0tLQotIEpvY2hlbiBXaWVkbWFubgotIDxqb2NoZW4ud2llZG1hbm5AZ21haWwuY29tPgotIC0tLS0tLQotCi1JbnRyb2R1Y3Rpb24KLQotICBUaGlzIHBsdWdpbiBnZW5lcmF0ZXMgYW4gQXhpcyAyIHNlcnZpY2UgZmlsZSAoQUFSIGZpbGUpLgotCi0gIFRoZSBmdWxsIGRlc2NyaXB0aW9uIG9mIGdvYWxzIGlzIGF2YWlsYWJsZSB7e3tob3d0by5odG1sfWhlcmV9fS4KLQotCi0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vc3JjL3NpdGUvc2l0ZS54bWwgYi92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9zaXRlL3NpdGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGQ3ZjFmLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vc3JjL3NpdGUvc2l0ZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIj8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHByb2plY3QgbmFtZT0iTWF2ZW4gQXhpcyAyIEFBUiBQbHVnaW4iPgotICA8YmFubmVyTGVmdD4KLSAgICA8bmFtZT5NYXZlbiBBeGlzIDIgQUFSIFBsdWdpbjwvbmFtZT4KLSAgICA8c3JjPmh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL2ltYWdlcy9hcGFjaGUtbWF2ZW4tcHJvamVjdC5wbmc8L3NyYz4KLSAgICA8aHJlZj5odHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy88L2hyZWY+Ci0gIDwvYmFubmVyTGVmdD4KLSAgPGJhbm5lclJpZ2h0PgotICAgIDxzcmM+aHR0cDovL21hdmVuLmFwYWNoZS5vcmcvaW1hZ2VzL21hdmVuLXNtYWxsLmdpZjwvc3JjPgotICA8L2Jhbm5lclJpZ2h0PgotICA8Ym9keT4KLSAgICA8bGlua3M+Ci0gICAgICA8aXRlbSBuYW1lPSJNYXZlbiAyIiBocmVmPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbjIvIi8+Ci0gICAgPC9saW5rcz4KLQotICAgIDxtZW51IG5hbWU9Ik92ZXJ2aWV3Ij4KLSAgICAgIDxpdGVtIG5hbWU9IkludHJvZHVjdGlvbiIgaHJlZj0iaW50cm9kdWN0aW9uLmh0bWwiLz4KLSAgICAgIDxpdGVtIG5hbWU9IkhvdyB0byBVc2UiIGhyZWY9Imhvd3RvLmh0bWwiLz4KLSAgICA8L21lbnU+Ci0gICAgJHtyZXBvcnRzfQotICA8L2JvZHk+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWphdmEyd3NkbC1tYXZlbi1wbHVnaW4vcG9tLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItamF2YTJ3c2RsLW1hdmVuLXBsdWdpbi9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzNhOTA4Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItamF2YTJ3c2RsLW1hdmVuLXBsdWdpbi9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjEuNS4xPC92ZXJzaW9uPgotICAgICAgICA8cmVsYXRpdmVQYXRoPi4uLy4uL3BhcmVudC9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+Ci0gICAgPC9wYXJlbnQ+Ci0gICAgPGFydGlmYWN0SWQ+YXhpczItamF2YTJ3c2RsLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICA8bmFtZT5BcGFjaGUgQXhpczIgLSB0b29sIC0gSmF2YTJXU0RMIE1hdmVuIFBsdWdpbjwvbmFtZT4KLSAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgIEEgTWF2ZW4gMiBwbHVnaW4gZm9yIGNyZWF0aW5nIFdTREwgZmlsZXMgZnJvbSBKYXZhIHNvdXJjZS4KLSAgICA8L2Rlc2NyaXB0aW9uPgotICAgIDxwYWNrYWdpbmc+bWF2ZW4tcGx1Z2luPC9wYWNrYWdpbmc+Ci0gICAgPGJ1aWxkPgotICAgICAgICA8c291cmNlRGlyZWN0b3J5PnNyYy9tYWluL2phdmE8L3NvdXJjZURpcmVjdG9yeT4KLSAgICAgICAgPHRlc3RTb3VyY2VEaXJlY3Rvcnk+c3JjL3Rlc3QvamF2YTwvdGVzdFNvdXJjZURpcmVjdG9yeT4KLSAgICAgICAgPHJlc291cmNlcz4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5Pi4uLy4uLy4uPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5OT1RJQ0UudHh0PC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5MSUNFTlNFLnR4dDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgICAgIDxmaWx0ZXJpbmc+ZmFsc2U8L2ZpbHRlcmluZz4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgIDwvcmVzb3VyY2VzPgotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8c2tpcD5mYWxzZTwvc2tpcD4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvYnVpbGQ+Ci0gICAgPGRlcGVuZGVuY2llcz4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItamF2YTJ3c2RsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHt2ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1hZGI8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3ZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXBsdWdpbi1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcHJvamVjdDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5zaGFyZWQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wbHVnaW4tdGVzdGluZy1oYXJuZXNzPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPC9kZXBlbmRlbmNpZXM+Ci0gICAgPGRpc3RyaWJ1dGlvbk1hbmFnZW1lbnQ+Ci0gICAgICAgIDxyZXBvc2l0b3J5PgotICAgICAgICAgICAgPGlkPmFwYWNoZS1yZXBvPC9pZD4KLSAgICAgICAgICAgIDxuYW1lPk1hdmVuIENlbnRyYWwgUmVwb3NpdG9yeTwvbmFtZT4KLSAgICAgICAgICAgIDx1cmw+c2NwZXhlOi8vcGVvcGxlLmFwYWNoZS5vcmcvL3d3dy9wZW9wbGUuYXBhY2hlLm9yZy9yZXBvL20yLWliaWJsaW8tcnN5bmMtcmVwb3NpdG9yeTwvdXJsPgotICAgICAgICA8L3JlcG9zaXRvcnk+Ci0gICAgICAgIDxzbmFwc2hvdFJlcG9zaXRvcnk+Ci0gICAgICAgICAgICA8aWQ+YXBhY2hlLXNuYXBzaG90czwvaWQ+Ci0gICAgICAgICAgICA8bmFtZT5BcGFjaGUgRGV2ZWxvcG1lbnQgUmVwb3NpdG9yeTwvbmFtZT4KLSAgICAgICAgICAgIDx1cmw+c2NwZXhlOi8vcGVvcGxlLmFwYWNoZS5vcmcvL3d3dy9wZW9wbGUuYXBhY2hlLm9yZy9yZXBvL20yLXNuYXBzaG90LXJlcG9zaXRvcnk8L3VybD4KLSAgICAgICAgPC9zbmFwc2hvdFJlcG9zaXRvcnk+Ci0gICAgPC9kaXN0cmlidXRpb25NYW5hZ2VtZW50PgotICAgIDxyZXBvcnRpbmc+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamF2YWRvYy1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNoYW5nZXMtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxyZXBvcnRTZXRzPgotICAgICAgICAgICAgICAgICAgICA8cmVwb3J0U2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgPHJlcG9ydHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlcG9ydD5jaGFuZ2VzLXJlcG9ydDwvcmVwb3J0PgotICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXBvcnRzPgotICAgICAgICAgICAgICAgICAgICA8L3JlcG9ydFNldD4KLSAgICAgICAgICAgICAgICA8L3JlcG9ydFNldHM+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvcmVwb3J0aW5nPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1qYXZhMndzZGwtbWF2ZW4tcGx1Z2luL3NyYy9jaGFuZ2VzL2NoYW5nZXMueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1qYXZhMndzZGwtbWF2ZW4tcGx1Z2luL3NyYy9jaGFuZ2VzL2NoYW5nZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjJkZmM4Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItamF2YTJ3c2RsLW1hdmVuLXBsdWdpbi9zcmMvY2hhbmdlcy9jaGFuZ2VzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGRvY3VtZW50PgotICA8cHJvcGVydGllcz4KLSAgICA8dGl0bGU+Q2hhbmdlcyBpbiB0aGUgQXhpczIgSmF2YTJXU0RMIHBsdWdpbiBmb3IgTWF2ZW4gMjwvdGl0bGU+Ci0gIDwvcHJvcGVydGllcz4KLSAgPGJvZHk+Ci0gICAgPHJlbGVhc2UgdmVyc2lvbj0iMS4xLVNOQVBTSE9UIiBkYXRlPSJOb3QgeWV0IHJlbGVhc2VkIj4KLSAgICAgIDxhY3Rpb24gZGV2PSJqb2NoZW4iIHR5cGU9ImFkZCI+Ci0gICAgICAgIEFkZGVkIHVzZXIgZG9jdW1lbnRhdGlvbi4KLSAgICAgIDwvYWN0aW9uPgotICAgIDwvcmVsZWFzZT4KLSAgICA8cmVsZWFzZSB2ZXJzaW9uPSIxLjAtU05BUFNIT1QiIGRhdGU9Ik5vdCB5ZXQgcmVsZWFzZWQiPgotICAgICAgPGFjdGlvbiBkZXY9ImpvY2hlbiIgdHlwZT0iYWRkIj4KLSAgICAgICAgSW5pdGlhbCB2ZXJzaW9uLiBOZXZlciBhY3R1YWxseSBwdWJsaXNoZWQuCi0gICAgICA8L2FjdGlvbj4KLSAgICA8L3JlbGVhc2U+Ci0gIDwvYm9keT4KLTwvZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWphdmEyd3NkbC1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL21hdmVuMi9qYXZhMndzZGwvSmF2YTJXU0RMTW9qby5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1qYXZhMndzZGwtbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi9tYXZlbjIvamF2YTJ3c2RsL0phdmEyV1NETE1vam8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JmNjMyZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWphdmEyd3NkbC1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL21hdmVuMi9qYXZhMndzZGwvSmF2YTJXU0RMTW9qby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5tYXZlbjIuamF2YTJ3c2RsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5qYXZhMndzZGwuSmF2YTJXU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uQWJzdHJhY3RNb2pvOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLk1vam9FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uTW9qb0ZhaWx1cmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wcm9qZWN0Lk1hdmVuUHJvamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmphdmEyd3NkbC5KYXZhMldTRExDb2RlZ2VuRW5naW5lOwotaW1wb3J0IG9yZy5hcGFjaGUud3MuamF2YTJ3c2RsLnV0aWxzLkphdmEyV1NETENvbW1hbmRMaW5lT3B0aW9uOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotCi0vKioKLSAqIFRha2VzIGEgSmF2YSBjbGFzcyBhcyBpbnB1dCBhbmQgY29udmVydHMgaXQgaW50byBhbiBlcXVpdmFsZW50Ci0gKiBXU0RMIGZpbGUuCi0gKiAKLSAqIEBnb2FsIGphdmEyd3NkbAotICogQHBoYXNlIHByb2Nlc3MtY2xhc3NlcwotICogQHJlcXVpcmVzRGVwZW5kZW5jeVJlc29sdXRpb24gY29tcGlsZQotICovCi1wdWJsaWMgY2xhc3MgSmF2YTJXU0RMTW9qbyBleHRlbmRzIEFic3RyYWN0TW9qbyB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BFTl9CUkFDS0VUID0gIlsiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMT1NFX0JSQUNLRVQgPSAiXSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUEgPSAiLCI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbWF2ZW4gcHJvamVjdC4KLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7cHJvamVjdH0iCi0gICAgICogQHJlYWQtb25seQotICAgICAqIEByZXF1aXJlZAotICAgICAqLwotICAgIHByaXZhdGUgTWF2ZW5Qcm9qZWN0IHByb2plY3Q7Ci0KLSAgICAvKioKLSAgICAgKiBGdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgY2xhc3MsIHdoaWNoIGlzIGJlaW5nIGluc3BlY3RlZC4KLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7YXhpczIuamF2YTJ3c2RsLmNsYXNzTmFtZX0iCi0gICAgICogQHJlcXVpcmVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgY2xhc3NOYW1lOwotCi0gICAgLyoqCi0gICAgICogVGFyZ2V0IG5hbWVzcGFjZSBvZiB0aGUgZ2VuZXJhdGVkIFdTREwuCi0gICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke2F4aXMyLmphdmEyd3NkbC50YXJnZXROYW1lc3BhY2V9IgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIHRhcmdldE5hbWVzcGFjZTsKLQotICAgIC8qKgotICAgICAqIFRoZSBuYW1lc3BhY2UgcHJlZml4LCB3aGljaCBpcyBiZWluZyB1c2VkIGZvciB0aGUgV1NETCdzCi0gICAgICogdGFyZ2V0IG5hbWVzcGFjZS4KLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7YXhpczIuamF2YTJ3c2RsLnRhcmdldE5hbWVzcGFjZVByZWZpeH0iCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlUHJlZml4OwotCi0gICAgLyoqCi0gICAgICogVGhlIGdlbmVyYXRlZCBzY2hlbWFzIHRhcmdldCBuYW1lc3BhY2UuCi0gICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke2F4aXMyLmphdmEyd3NkbC5zY2hlbWFUYXJnZXROYW1lc3BhY2V9IgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIHNjaGVtYVRhcmdldE5hbWVzcGFjZTsKLQotICAgIC8qKgotICAgICAqIFRoZSBnZW5lcmF0ZWQgc2NoZW1hcyB0YXJnZXQgbmFtZXNwYWNlIHByZWZpeC4KLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7YXhpczIuamF2YTJ3c2RsLnNjaGVtYVRhcmdldE5hbWVzcGFjZVByZWZpeH0iCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgc2NoZW1hVGFyZ2V0TmFtZXNwYWNlUHJlZml4OwotCi0gICAgLyoqCi0gICAgICogTmFtZSBvZiB0aGUgZ2VuZXJhdGVkIHNlcnZpY2UuCi0gICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke2F4aXMyLmphdmEyd3NkbC5zZXJ2aWNlTmFtZX0iCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgc2VydmljZU5hbWU7Ci0KLSAgICAvKioKLSAgICAgKiBOYW1lIG9mIHRoZSBzZXJ2aWNlIGZpbGUsIHdoaWNoIGlzIGJlaW5nIGdlbmVyYXRlZC4KLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7YXhpczIuamF2YTJ3c2RsLm91dHB1dEZpbGVOYW1lfSIgZGVmYXVsdC12YWx1ZT0iJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vZ2VuZXJhdGVkLXJlc291cmNlcy9zZXJ2aWNlLndzZGwiCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgb3V0cHV0RmlsZU5hbWU7Ci0KLSAgICAvKioKLSAgICAgKiBTdHlsZSBmb3IgdGhlIHdzZGwKLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7YXhpczIuamF2YTJ3c2RsLnN0eWxlfSIKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBzdHlsZTsKLQotICAgIC8qKgotICAgICAqIFVzZSBmb3IgdGhlIHdzZGwKLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7YXhpczIuamF2YTJ3c2RsLnVzZX0iCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgdXNlOwotCi0gICAgLyoqCi0gICAgICogVmVyc2lvbiBmb3IgdGhlIHdzZGwKLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7YXhpczIuamF2YTJ3c2RsLndzZGxWZXJzaW9ufSIKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyB3c2RsVmVyc2lvbjsKLQotICAgIC8qKgotICAgICAqIE5hbWVzcGFjZSBHZW5lcmF0b3IKLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7YXhpczIuamF2YTJ3c2RsLm5zR2VuQ2xhc3NOYW1lfSIKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBuc0dlbkNsYXNzTmFtZTsKLQotICAgIC8qKgotICAgICAqIFNjaGVtYSBHZW5lcmF0b3IKLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7YXhpczIuamF2YTJ3c2RsLm5zR2VuQ2xhc3NOYW1lfSIKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBzY2hlbWFHZW5DbGFzc05hbWU7Ci0KLSAgICAvKioKLSAgICAgKiBMb2NhdGlvbiBVUkkgaW4gdGhlIHdzZGwKLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7YXhpczIuamF2YTJ3c2RsLmxvY2F0aW9uVXJpfSIKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBsb2NhdGlvblVyaTsKLQotICAgIC8qKgotICAgICAqIGF0dHJGb3JtRGVmYXVsdCBzZXR0aW5nIGZvciB0aGUgc2NoZW1hCi0gICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke2F4aXMyLmphdmEyd3NkbC5hdHRyRm9ybURlZmF1bHR9IgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGF0dHJGb3JtRGVmYXVsdDsKLQotICAgIC8qKgotICAgICAqIGVsZW1lbnRGb3JtRGVmYXVsdCBzZXR0aW5nIGZvciB0aGUgc2NoZW1hCi0gICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke2F4aXMyLmphdmEyd3NkbC5lbGVtZW50Rm9ybURlZmF1bHR9IgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGVsZW1lbnRGb3JtRGVmYXVsdDsKLQotICAgIC8qKgotICAgICAqIFN3aXRjaCBvbiB0aGUgRG9jL0xpdC9CYXJlIHN0eWxlIHNjaGVtYQotICAgICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtheGlzMi5qYXZhMndzZGwuZG9jTGl0QmFyZX0iCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZG9jTGl0QmFyZTsKLQotICAgIC8qKgotICAgICAqIEFkZGl0aW9uYWwgY2xhc3NlcyBmb3Igd2hpY2ggd2UgbmVlZCB0byBnZW5lcmF0ZSBzY2hlbWEKLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7YXhpczIuamF2YTJ3c2RsLmV4dHJhQ2xhc3Nlc30iCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmdbXSBleHRyYUNsYXNzZXM7Ci0KLSAgICAvKioKLSAgICAgKiBTcGVjaWZ5IG5hbWVzcGFjZXMgZXhwbGljaXRseSBmb3IgcGFja2FnZXMKLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7YXhpczIuamF2YTJ3c2RsLnBhY2thZ2UyTmFtZXNwYWNlfSIKLSAgICAgKi8KLSAgICBwcml2YXRlIFByb3BlcnRpZXMgcGFja2FnZTJOYW1lc3BhY2U7Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkVG9PcHRpb25NYXAoTWFwIG1hcCwgU3RyaW5nIG9wdGlvbiwgU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIGFkZFRvT3B0aW9uTWFwKG1hcCwgb3B0aW9uLCBuZXcgU3RyaW5nW117dmFsdWV9KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkVG9PcHRpb25NYXAoTWFwIG1hcCwgU3RyaW5nIG9wdGlvbiwgU3RyaW5nW10gdmFsdWUpIHsKLSAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1hcC5wdXQob3B0aW9uLAotICAgICAgICAgICAgICAgICAgICBuZXcgSmF2YTJXU0RMQ29tbWFuZExpbmVPcHRpb24ob3B0aW9uLCB2YWx1ZSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZFRvT3B0aW9uTWFwKE1hcCBtYXAsIFN0cmluZyBvcHRpb24sIEFycmF5TGlzdCB2YWx1ZXMpIHsKLSAgICAgICAgaWYgKHZhbHVlcyAhPSBudWxsICYmICF2YWx1ZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBtYXAucHV0KG9wdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgbmV3IEphdmEyV1NETENvbW1hbmRMaW5lT3B0aW9uKG9wdGlvbiwgdmFsdWVzKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGaWxscyB0aGUgb3B0aW9uIG1hcC4gVGhpcyBtYXAgaXMgcGFzc2VkIG9udG8KLSAgICAgKiB0aGUgY29kZSBnZW5lcmF0aW9uIEFQSSB0byBnZW5lcmF0ZSB0aGUgY29kZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIE1hcCBmaWxsT3B0aW9uTWFwKCkgdGhyb3dzIE1vam9GYWlsdXJlRXhjZXB0aW9uIHsKLSAgICAgICAgTWFwIG9wdGlvbk1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICAgICAgaWYgKGNsYXNzTmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTW9qb0ZhaWx1cmVFeGNlcHRpb24oIllvdSBtdXN0IHNwZWNpZnkgYSBjbGFzc25hbWUiKTsKLSAgICAgICAgfQotICAgICAgICBhZGRUb09wdGlvbk1hcCggb3B0aW9uTWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgSmF2YTJXU0RMQ29uc3RhbnRzLkNMQVNTTkFNRV9PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUpOwotICAgICAgICBhZGRUb09wdGlvbk1hcCggb3B0aW9uTWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgSmF2YTJXU0RMQ29uc3RhbnRzLlRBUkdFVF9OQU1FU1BBQ0VfT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlKTsKLSAgICAgICAgYWRkVG9PcHRpb25NYXAoIG9wdGlvbk1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEphdmEyV1NETENvbnN0YW50cy5UQVJHRVRfTkFNRVNQQUNFX1BSRUZJWF9PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXROYW1lc3BhY2VQcmVmaXgpOwotICAgICAgICBhZGRUb09wdGlvbk1hcCggb3B0aW9uTWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgSmF2YTJXU0RMQ29uc3RhbnRzLlNDSEVNQV9UQVJHRVRfTkFNRVNQQUNFX09QVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYVRhcmdldE5hbWVzcGFjZSk7Ci0gICAgICAgIGFkZFRvT3B0aW9uTWFwKCBvcHRpb25NYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICBKYXZhMldTRExDb25zdGFudHMuU0NIRU1BX1RBUkdFVF9OQU1FU1BBQ0VfUFJFRklYX09QVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYVRhcmdldE5hbWVzcGFjZVByZWZpeCk7Ci0gICAgICAgIGFkZFRvT3B0aW9uTWFwKCBvcHRpb25NYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICBKYXZhMldTRExDb25zdGFudHMuU0VSVklDRV9OQU1FX09QVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VOYW1lKTsKLSAgICAgICAgRmlsZSBvdXRwdXRGaWxlID0gbmV3IEZpbGUob3V0cHV0RmlsZU5hbWUpOwotICAgICAgICBpZighb3V0cHV0RmlsZS5pc0Fic29sdXRlKCkpewotICAgICAgICAgICAgb3V0cHV0RmlsZSA9IG5ldyBGaWxlKHByb2plY3QuZ2V0QmFzZWRpcigpLCBvdXRwdXRGaWxlTmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgRmlsZSBkaXIgPSBvdXRwdXRGaWxlLmdldFBhcmVudEZpbGUoKTsKLSAgICAgICAgaWYgKCFkaXIuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgZGlyLm1rZGlycygpOwotICAgICAgICB9Ci0gICAgICAgIGFkZFRvT3B0aW9uTWFwKCBvcHRpb25NYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICBKYXZhMldTRExDb25zdGFudHMuT1VUUFVUX0xPQ0FUSU9OX09QVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRpci5nZXRQYXRoKCkgKTsKLSAgICAgICAgYWRkVG9PcHRpb25NYXAoIG9wdGlvbk1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEphdmEyV1NETENvbnN0YW50cy5PVVRQVVRfRklMRU5BTUVfT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RmlsZS5nZXROYW1lKCkgKTsKLQotICAgICAgICBBcnRpZmFjdCBhcnRpZmFjdCA9IHByb2plY3QuZ2V0QXJ0aWZhY3QoKTsKLSAgICAgICAgU2V0IGFydGlmYWN0cyA9IHByb2plY3QuZ2V0QXJ0aWZhY3RzKCk7Ci0gICAgICAgIFN0cmluZ1tdIGFydGlmYWN0RmlsZU5hbWVzID0gbmV3IFN0cmluZ1thcnRpZmFjdHMuc2l6ZSgpICsgKGFydGlmYWN0ID09IG51bGwgPyAwIDogMSldOwotICAgICAgICBpbnQgaiA9IDA7Ci0gICAgICAgIGZvcihJdGVyYXRvciBpID0gYXJ0aWZhY3RzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyBqKyspIHsKLSAgICAgICAgICAgIGFydGlmYWN0RmlsZU5hbWVzW2pdID0gKChBcnRpZmFjdCkgaS5uZXh0KCkpLmdldEZpbGUoKS5nZXRBYnNvbHV0ZVBhdGgoKTsKLSAgICAgICAgfQotICAgICAgICBpZihhcnRpZmFjdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBGaWxlIGZpbGUgPSBhcnRpZmFjdC5nZXRGaWxlKCk7Ci0gICAgICAgICAgICBpZihmaWxlICE9IG51bGwpewotICAgICAgICAgICAgICAgIGFydGlmYWN0RmlsZU5hbWVzW2pdID0gZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGFkZFRvT3B0aW9uTWFwKCBvcHRpb25NYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICBKYXZhMldTRExDb25zdGFudHMuQ0xBU1NQQVRIX09QVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGFydGlmYWN0RmlsZU5hbWVzKTsKLQotICAgICAgICBpZiAoc3R5bGUgIT0gbnVsbCkgewotICAgICAgICAgICAgYWRkVG9PcHRpb25NYXAob3B0aW9uTWFwLAotICAgICAgICAgICAgICAgICAgICBKYXZhMldTRExDb25zdGFudHMuU1RZTEVfT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICBzdHlsZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodXNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGFkZFRvT3B0aW9uTWFwKG9wdGlvbk1hcCwKLSAgICAgICAgICAgICAgICAgICAgSmF2YTJXU0RMQ29uc3RhbnRzLlVTRV9PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgIHVzZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAod3NkbFZlcnNpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgYWRkVG9PcHRpb25NYXAob3B0aW9uTWFwLAotICAgICAgICAgICAgICAgICAgICBKYXZhMldTRExDb25zdGFudHMuV1NETF9WRVJTSU9OX09QVElPTiwKLSAgICAgICAgICAgICAgICAgICAgd3NkbFZlcnNpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGRvY0xpdEJhcmUgIT0gbnVsbCkgewotICAgICAgICAgICAgYWRkVG9PcHRpb25NYXAob3B0aW9uTWFwLAotICAgICAgICAgICAgICAgICAgICBKYXZhMldTRExDb25zdGFudHMuRE9DX0xJVF9CQVJFLAotICAgICAgICAgICAgICAgICAgICBkb2NMaXRCYXJlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChsb2NhdGlvblVyaSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBhZGRUb09wdGlvbk1hcChvcHRpb25NYXAsCi0gICAgICAgICAgICAgICAgICAgIEphdmEyV1NETENvbnN0YW50cy5MT0NBVElPTl9PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uVXJpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChuc0dlbkNsYXNzTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBhZGRUb09wdGlvbk1hcChvcHRpb25NYXAsCi0gICAgICAgICAgICAgICAgICAgIEphdmEyV1NETENvbnN0YW50cy5OQU1FU1BBQ0VfR0VORVJBVE9SX09QVElPTiwKLSAgICAgICAgICAgICAgICAgICAgbnNHZW5DbGFzc05hbWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNjaGVtYUdlbkNsYXNzTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBhZGRUb09wdGlvbk1hcChvcHRpb25NYXAsCi0gICAgICAgICAgICAgICAgICAgIEphdmEyV1NETENvbnN0YW50cy5TQ0hFTUFfR0VORVJBVE9SX09QVElPTiwKLSAgICAgICAgICAgICAgICAgICAgc2NoZW1hR2VuQ2xhc3NOYW1lKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChhdHRyRm9ybURlZmF1bHQgIT0gbnVsbCkgewotICAgICAgICAgICAgYWRkVG9PcHRpb25NYXAob3B0aW9uTWFwLAotICAgICAgICAgICAgICAgICAgICBKYXZhMldTRExDb25zdGFudHMuQVRUUl9GT1JNX0RFRkFVTFRfT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICBhdHRyRm9ybURlZmF1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGVsZW1lbnRGb3JtRGVmYXVsdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBhZGRUb09wdGlvbk1hcChvcHRpb25NYXAsCi0gICAgICAgICAgICAgICAgICAgIEphdmEyV1NETENvbnN0YW50cy5FTEVNRU5UX0ZPUk1fREVGQVVMVF9PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRGb3JtRGVmYXVsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZXh0cmFDbGFzc2VzICE9IG51bGwgJiYgZXh0cmFDbGFzc2VzLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgIGFkZFRvT3B0aW9uTWFwKG9wdGlvbk1hcCwKLSAgICAgICAgICAgICAgICAgICAgSmF2YTJXU0RMQ29uc3RhbnRzLkVYVFJBX0NMQVNTRVNfREVGQVVMVF9PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgIGV4dHJhQ2xhc3Nlcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgaWYocGFja2FnZTJOYW1lc3BhY2UgIT0gbnVsbCl7Ci0gICAgICAgICAgICBJdGVyYXRvciBpdGVyYXRvciA9IHBhY2thZ2UyTmFtZXNwYWNlLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLSAgICAKLSAgICAgICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gKFN0cmluZykgZW50cnkuZ2V0S2V5KCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9IChTdHJpbmcpIGVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgbGlzdC5hZGQoT1BFTl9CUkFDS0VUICsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VOYW1lICsKLSAgICAgICAgICAgICAgICAgICAgICAgIENPTU1BICsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZSArCi0gICAgICAgICAgICAgICAgICAgICAgICBDTE9TRV9CUkFDS0VUKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBhZGRUb09wdGlvbk1hcChvcHRpb25NYXAsCi0gICAgICAgICAgICAgICAgSmF2YTJXU0RMQ29uc3RhbnRzLkpBVkFfUEtHXzJfTlNNQVBfT1BUSU9OLAotICAgICAgICAgICAgICAgIGxpc3QpOwotCi0gICAgICAgIHJldHVybiBvcHRpb25NYXA7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uLCBNb2pvRmFpbHVyZUV4Y2VwdGlvbiB7Ci0gICAgICAgIE1hcCBjb21tYW5kTGluZU9wdGlvbnMgPSBmaWxsT3B0aW9uTWFwKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBuZXcgSmF2YTJXU0RMQ29kZWdlbkVuZ2luZShjb21tYW5kTGluZU9wdGlvbnMpLmdlbmVyYXRlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1qYXZhMndzZGwtbWF2ZW4tcGx1Z2luL3NyYy9zaXRlL2FwdC9jb25maWd1cmF0aW9uLmFwdCBiL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItamF2YTJ3c2RsLW1hdmVuLXBsdWdpbi9zcmMvc2l0ZS9hcHQvY29uZmlndXJhdGlvbi5hcHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmMWY4NjAuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1qYXZhMndzZGwtbWF2ZW4tcGx1Z2luL3NyYy9zaXRlL2FwdC9jb25maWd1cmF0aW9uLmFwdAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLUNvbmZpZ3VyYXRpb24KLQotICBUaGUgSmF2YTJXU0RMIGdvYWwgdGFrZXMgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzIGFzIGlucHV0LiBBbGwgcGFyYW1ldGVycyBjYW4gYmUgc2V0IGZyb20gdGhlIGNvbW1hbmQgbGluZSBieSB1c2luZwotICBwcm9wZXJ0aWVzLiBGb3IgZXhhbXBsZSwgdGhlIHBhcmFtZXRlciAiY2xhc3NOYW1lIiBtYXkgYmUgc2V0IHVzaW5nIHRoZSBwcm9wZXJ0eQotICAiYXhpczIuamF2YTJ3c2RsLmNsYXNzTmFtZSIuIElmIHRoZSBwYXJhbWV0ZXIgaXNuJ3Qgc2V0IHZpYSBwcm9wZXJ0eSBvciBpbiB0aGUgUE9NLCB0aGVuIGEgZGVmYXVsdAotICB2YWx1ZSBhcHBsaWVzLgotCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgUGFyYW1ldGVyIG5hbWUgICAgICAgICAgICAgIHwgQ29tbWFuZCBsaW5lIHByb3BlcnR5ICAgICAgICAgICAgICAgICAgICAgICAgICB8IERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBEZWZhdWx0IHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgY2xhc3NOYW1lICAgICAgICAgICAgICAgICAgIHwgJHtheGlzMi5qYXZhMndzZGwuY2xhc3NOYW1lfSAgICAgICAgICAgICAgICAgICB8IEZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBjbGFzcywgd2hpY2ggaXMgICAgfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYmVpbmcgcmVhZCBhbmQgdHJhbnNmb3JtZWQgaW50byBhIFdTREwuICAgICAgICB8Ci0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgb3V0cHV0RmlsZU5hbWUgICAgICAgICAgICAgIHwgJHtheGlzMi5qYXZhMndzZGwub3V0cHV0RmlsZU5hbWV9ICAgICAgICAgICAgICB8IFBhdGggb2YgdGhlIGdlbmVyYXRlZCBzZXJ2aWNlIGZpbGUuICAgICAgICAgICAgfAotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCi18IHNjaGVtYVRhcmdldE5hbWVzcGFjZSAgICAgICB8ICR7YXhpczIuamF2YTJ3c2RsLnNjaGVtYVRhcmdldE5hbWVzcGFjZX0gICAgICAgfCBUYXJnZXQgbmFtZXNwYWNlIG9mIHRoZSBnZW5lcmF0ZWQgc2NoZW1hLiAgICAgIHwKLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBzY2hlbWFUYXJnZXROYW1lc3BhY2VQcmVmaXggfCAke2F4aXMyLmphdmEyd3NkbC5zY2hlbWFUYXJnZXROYW1lc3BhY2VQcmVmaXh9IHwgUHJlZml4LCB3aGljaCBpcyBiZWluZyBhc3NvY2lhdGVkIHdpdGggdGhlICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzY2hlbWFzIHRhcmdldCBuYW1lc3BhY2UuICAgICAgICAgICAgICAgICAgICAgIHwKLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBzZXJ2aWNlTmFtZSAgICAgICAgICAgICAgICAgfCAke2F4aXMyLmphdmEyd3NkbC5zZXJ2aWNlTmFtZX0gICAgICAgICAgICAgICAgIHwgTmFtZSBvZiB0aGUgZ2VuZXJhdGVkIHdlYiBzZXJ2aWNlLiAgICAgICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFVucXVhbGlmaWVkIG5hbWUgb2YgdGhlIGlucHV0IGNsYXNzLiAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCB0YXJnZXROYW1lc3BhY2UgICAgICAgICAgICAgfCAke2F4aXMyLmphdmEyd3NkbC50YXJnZXROYW1lc3BhY2V9ICAgICAgICAgICAgIHwgVGFyZ2V0IG5hbWVzcGFjZSBvZiB0aGUgZ2VuZXJhdGVkIFdTREwuICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IERlZmF1bHQgbmFtZXNwYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCB0YXJnZXROYW1lc3BhY2VQcmVmaXggICAgICAgfCAke2F4aXMyLmphdmEyd3NkbC50YXJnZXROYW1lc3BhY2VQcmVmaXh9ICAgICAgIHwgUHJlZml4LCB3aGljaCBpcyBiZWluZyBhc3NvY2lhdGVkIHdpdGggdGhlICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0YXJnZXQgbmFtZXNwYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1qYXZhMndzZGwtbWF2ZW4tcGx1Z2luL3NyYy9zaXRlL2FwdC9nb2Fscy5hcHQgYi92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWphdmEyd3NkbC1tYXZlbi1wbHVnaW4vc3JjL3NpdGUvYXB0L2dvYWxzLmFwdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRjMmQ3Zi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWphdmEyd3NkbC1tYXZlbi1wbHVnaW4vc3JjL3NpdGUvYXB0L2dvYWxzLmFwdAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLSAtLS0tLS0KLSBNYXZlbiAyIEphdmEyV1NETCBQbHVnaW46IGNvbmZpZ3VyYXRpb24gZXhhbXBsZXMKLSAtLS0tLS0KLSBKb2NoZW4gV2llZG1hbm4gCi0gPGpvY2hlbi53aWVkbWFubkBnbWFpbC5jb20+Ci0gLS0tLS0tCi0KLUdvYWxzCi0KLSAgVGhlIEphdmEyV1NETCBwbHVnaW4gb2ZmZXJzIGEgc2luZ2xlIGdvYWw6Ci0KLSAgICogamF2YTJ3c2RsIChkZWZhdWx0KTogUmVhZHMgYSBqYXZhIGNsYXNzIGFuZCBnZW5lcmF0ZXMgYSBXU0RMIGZvciBpbnZva2luZyB0aGUgY2xhc3NlcyBtZXRob2RzIGFzIGEgd2ViIHNlcnZpY2UuCi0KLSAgVG8gcnVuIHRoZSBwbHVnaW4sIGFkZCB0aGUgZm9sbG93aW5nIHNlY3Rpb24gdG8geW91ciBQT006Ci0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICA8YnVpbGQ+Ci0gICAgPHBsdWdpbnM+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyLm1hdmVuMjwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItamF2YTJ3c2RsLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgPGdvYWw+amF2YTJ3c2RsPC9nb2FsPgotICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDxjbGFzc05hbWU+Y29tLmZvby5teXNlcnZpY2UuTXlIYW5kbGVyPC9jbGFzc05hbWU+Ci0gICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvYnVpbGQ+Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICBUaGUgcGx1Z2luIHdpbGwgYmUgaW52b2tlZCBhdXRvbWF0aWNhbGx5IGluIHRoZSBnZW5lcmF0ZS1yZXNvdXJjZXMKLSAgcGhhc2UuIFlvdSBjYW4gYWxzbyBpbnZva2UgaXQgZGlyZWN0bHkgZnJvbSB0aGUgY29tbWFuZCBsaW5lIGJ5Ci0gIHJ1bm5pbmcgdGhlIGNvbW1hbmQKLQotKy0tLS0tLS0tCi0gIG12biBqYXZhMndzZGw6amF2YTJ3c2RsCi0rLS0tLS0tLS0tCi0KLQotVGhlIEphdmEyV1NETCBHb2FsCi0KLSAgQnkgZGVmYXVsdCwgdGhlIHBsdWdpbiByZWFkcyB0aGUgZ2l2ZW4gSmF2YSBjbGFzcyBhbmQgY3JlYXRlcyBhCi0gIGZpbGUgPDw8dGFyZ2V0L2dlbmVyYXRlZC1yZXNvdXJjZXMvamF2YTJ3c2RsL3NlcnZpY2UueG1sPj4+LiBUaGUKLSAgSmF2YSBjbGFzcyBpcyBnaXZlbiBieSB0aGUgY29uZmlndXJhdGlvbiBlbGVtZW50IDw8PGNsYXNzTmFtZT4+PgotICBhYm92ZS4KLQotICBTZWUgdGhlIGRldGFpbGVkIGRvY3VtZW50YXRpb24gb24ge3t7Y29uZmlndXJhdGlvbi5odG1sfXByb3BlcnRpZXN9fSBmb3IKLSAgaG93IHRvIGNvbmZpZ3VyZSB0aGUgZ29hbC4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItamF2YTJ3c2RsLW1hdmVuLXBsdWdpbi9zcmMvc2l0ZS9hcHQvaW50cm9kdWN0aW9uLmFwdCBiL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItamF2YTJ3c2RsLW1hdmVuLXBsdWdpbi9zcmMvc2l0ZS9hcHQvaW50cm9kdWN0aW9uLmFwdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDc1MjkyZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWphdmEyd3NkbC1tYXZlbi1wbHVnaW4vc3JjL3NpdGUvYXB0L2ludHJvZHVjdGlvbi5hcHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0gLS0tLS0tCi0gTWF2ZW4gMiBKYXZhMldTREwgUGx1Z2luCi0gLS0tLS0tCi0gSm9jaGVuIFdpZWRtYW5uCi0gPGpvY2hlbi53aWVkbWFubkBnbWFpbC5jb20+Ci0gLS0tLS0tCi0KLUludHJvZHVjdGlvbgotCi0gIFRoaXMgcGx1Z2luIHRha2VzIGFzIGlucHV0IGEgSmF2YSBjbGFzcyBhbmQgZ2VuZXJhdGVzIGEgV1NETCwKLSAgd2hpY2ggZGVzY3JpYmVzIGEgd2ViIHNlcnZpY2UgZm9yIGludm9raW5nIHRoZSBjbGFzc2VzCi0gIG1ldGhvZHMuCi0KLSAgVGhlIGZ1bGwgZGVzY3JpcHRpb24gb2YgZ29hbHMgaXMgYXZhaWxhYmxlIHt7e2dvYWxzLmh0bWx9aGVyZX19LgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1qYXZhMndzZGwtbWF2ZW4tcGx1Z2luL3NyYy9zaXRlL3NpdGUueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1qYXZhMndzZGwtbWF2ZW4tcGx1Z2luL3NyYy9zaXRlL3NpdGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjIxZWU0Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItamF2YTJ3c2RsLW1hdmVuLXBsdWdpbi9zcmMvc2l0ZS9zaXRlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08cHJvamVjdCBuYW1lPSJNYXZlbiBBeGlzIDIgSmF2YTJXU0RMIFBsdWdpbiI+Ci0gIDxiYW5uZXJMZWZ0PgotICAgIDxuYW1lPk1hdmVuIEF4aXMgMiBKYXZhMldTREwgUGx1Z2luPC9uYW1lPgotICAgIDxzcmM+aHR0cDovL21hdmVuLmFwYWNoZS5vcmcvaW1hZ2VzL2FwYWNoZS1tYXZlbi1wcm9qZWN0LnBuZzwvc3JjPgotICAgIDxocmVmPmh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnLzwvaHJlZj4KLSAgPC9iYW5uZXJMZWZ0PgotICA8YmFubmVyUmlnaHQ+Ci0gICAgPHNyYz5odHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9pbWFnZXMvbWF2ZW4tc21hbGwuZ2lmPC9zcmM+Ci0gIDwvYmFubmVyUmlnaHQ+Ci0gIDxib2R5PgotICAgIDxsaW5rcz4KLSAgICAgIDxpdGVtIG5hbWU9IkFwYWNoZSIgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnLyIvPgotICAgICAgPGl0ZW0gbmFtZT0iV2Vic2VydmljZXMiIGhyZWY9Imh0dHA6Ly93cy5hcGFjaGUub3JnLyIvPgotICAgICAgPGl0ZW0gbmFtZT0iQXhpcyAyIiBocmVmPSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi8iLz4KLSAgICAgIDxpdGVtIG5hbWU9Ik1hdmVuIDIiIGhyZWY9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuMi8iLz4KLSAgICA8L2xpbmtzPgotCi0gICAgPG1lbnUgbmFtZT0iT3ZlcnZpZXciPgotICAgICAgPGl0ZW0gbmFtZT0iSW50cm9kdWN0aW9uIiBocmVmPSJpbnRyb2R1Y3Rpb24uaHRtbCIvPgotICAgICAgPGl0ZW0gbmFtZT0iSG93IHRvIFVzZSIgaHJlZj0iaG93dG8uaHRtbCIvPgotICAgICAgPGl0ZW0gbmFtZT0iQ29uZmlndXJhdGlvbiIgaHJlZj0iY29uZmlndXJhdGlvbi5odG1sIi8+Ci0gICAgPC9tZW51PgotICAgICR7cmVwb3J0c30KLSAgPC9ib2R5PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1qYXZhMndzZGwtbWF2ZW4tcGx1Z2luL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9heGlzMi9tYXZlbjIvamF2YTJ3c2RsL0phdmEyV1NETE1vam9UZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWphdmEyd3NkbC1tYXZlbi1wbHVnaW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2F4aXMyL21hdmVuMi9qYXZhMndzZGwvSmF2YTJXU0RMTW9qb1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJiNTc0ZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLWphdmEyd3NkbC1tYXZlbi1wbHVnaW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2F4aXMyL21hdmVuMi9qYXZhMndzZGwvSmF2YTJXU0RMTW9qb1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5tYXZlbjIuamF2YTJ3c2RsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4udGVzdGluZy5BYnN0cmFjdE1vam9UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi50ZXN0aW5nLnN0dWJzLk1hdmVuUHJvamVjdFN0dWI7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLQotLyoqCi0gKiBUZXN0IGNhc2UgZm9yIHJ1bm5pbmcgdGhlIGphdmEyd3NkbCBnb2FsLgotICovCi1wdWJsaWMgY2xhc3MgSmF2YTJXU0RMTW9qb1Rlc3QgZXh0ZW5kcyBBYnN0cmFjdE1vam9UZXN0Q2FzZSB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdTRExfRklMRSA9ICJ0YXJnZXQvZ2VuZXJhdGVkLXNvdXJjZXMvamF2YTJ3c2RsL3NlcnZpY2UueG1sIjsKLQotICAgIC8qKgotICAgICAqIFRlc3RzIHJ1bm5pbmcgdGhlIFdTREwgZ2VuZXJhdG9yLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RKYXZhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBkaXIgPSAic3JjL3Rlc3QvdGVzdDEiOwotICAgICAgICBydW5UZXN0KGRpciAsICJqYXZhMndzZGwiICk7Ci0gICAgICAgIGFzc2VydFRydWUoIG5ldyBGaWxlKGRpciwgV1NETF9GSUxFKS5leGlzdHMoKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIEphdmEyV1NETE1vam8gbmV3TW9qbyggU3RyaW5nIHBEaXIsIFN0cmluZyBwR29hbCApIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGZpbmFsIEZpbGUgYmFzZURpciA9IG5ldyBGaWxlKG5ldyBGaWxlKGdldEJhc2VkaXIoKSksIHBEaXIpOwotICAgICAgICBGaWxlIHRlc3RQb20gPSBuZXcgRmlsZSggYmFzZURpciwgInBvbS54bWwiICk7Ci0gICAgICAgIEphdmEyV1NETE1vam8gbW9qbyA9IChKYXZhMldTRExNb2pvKSBsb29rdXBNb2pvKCBwR29hbCwgdGVzdFBvbSApOwotICAgICAgICBNYXZlblByb2plY3RTdHViIHByb2plY3QgPSBuZXcgTWF2ZW5Qcm9qZWN0U3R1YigpewotICAgICAgICAgICAgcHVibGljIEZpbGUgZ2V0QmFzZWRpcigpIHsgcmV0dXJuIGJhc2VEaXI7IH0KLSAgICAgICAgfTsKLSAgICAgICAgc2V0VmFyaWFibGVWYWx1ZVRvT2JqZWN0KG1vam8sICJwcm9qZWN0IiwgcHJvamVjdCk7Ci0gICAgICAgIHNldFZhcmlhYmxlVmFsdWVUb09iamVjdChtb2pvLCAib3V0cHV0RmlsZU5hbWUiLCBXU0RMX0ZJTEUpOwotICAgICAgICByZXR1cm4gbW9qbzsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCBTdHJpbmcgcERpciwgU3RyaW5nIHBHb2FsICkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgbmV3TW9qbyggcERpciwgcEdvYWwgKS5leGVjdXRlKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1qYXZhMndzZGwtbWF2ZW4tcGx1Z2luL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9heGlzMi9tYXZlbjIvamF2YTJ3c2RsL3Rlc3QvQWRkZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItamF2YTJ3c2RsLW1hdmVuLXBsdWdpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYXhpczIvbWF2ZW4yL2phdmEyd3NkbC90ZXN0L0FkZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkZTJiYjcuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1qYXZhMndzZGwtbWF2ZW4tcGx1Z2luL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9heGlzMi9tYXZlbjIvamF2YTJ3c2RsL3Rlc3QvQWRkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5tYXZlbjIuamF2YTJ3c2RsLnRlc3Q7Ci0KLS8qKgotICogQSBkdW1teSBzZXJ2aWNlIGNsYXNzCi0gKi8KLXB1YmxpYyBjbGFzcyBBZGRlciB7Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc3VtIG9mIGl0cyBwYXJhbWV0ZXJzLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgYWRkKGludCBwMSwgaW50IHAyKSB7Ci0gICAgICAgIHJldHVybiBwMSArIHAyOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItamF2YTJ3c2RsLW1hdmVuLXBsdWdpbi9zcmMvdGVzdC90ZXN0MS9wb20ueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1qYXZhMndzZGwtbWF2ZW4tcGx1Z2luL3NyYy90ZXN0L3Rlc3QxL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1NTQ1N2YuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1qYXZhMndzZGwtbWF2ZW4tcGx1Z2luL3NyYy90ZXN0L3Rlc3QxL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxwcm9qZWN0PgotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPmF4aXMyLXdzZGwyY29kZS1tYXZlbi1wbHVnaW4tdGVzdDE8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+MS41LjE8L3ZlcnNpb24+Ci0gICAgPG5hbWU+VGVzdCAxIG9mIHRoZSBheGlzMi13c2RsMmNvZGUtbWF2ZW4tcGx1Z2luPC9uYW1lPgotICAgIDxidWlsZD4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItamF2YTJ3c2RsLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4xLjUuMTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGNsYXNzTmFtZT5vcmcuYXBhY2hlLmF4aXMyLm1hdmVuMi5qYXZhMndzZGwudGVzdC5BZGRlcjwvY2xhc3NOYW1lPgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgPC9idWlsZD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItbWFyLW1hdmVuLXBsdWdpbi9wb20ueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1tYXItbWF2ZW4tcGx1Z2luL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhMzFmOTcuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1tYXItbWF2ZW4tcGx1Z2luL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+MS41LjE8L3ZlcnNpb24+Ci0gICAgICAgIDxyZWxhdGl2ZVBhdGg+Li4vLi4vcGFyZW50L3BvbS54bWw8L3JlbGF0aXZlUGF0aD4KLSAgICA8L3BhcmVudD4KLSAgICA8YXJ0aWZhY3RJZD5heGlzMi1tYXItbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgIDxwYWNrYWdpbmc+bWF2ZW4tcGx1Z2luPC9wYWNrYWdpbmc+Ci0gICAgPG5hbWU+QXBhY2hlIEF4aXMyIC0gdG9vbCAtIE1BUiBNYXZlbiBQbHVnaW48L25hbWU+Ci0gICAgPGRlc2NyaXB0aW9uPgotICAgICAgICBBIE1hdmVuIDIgcGx1Z2luIGZvciBjcmVhdGluZyBBeGlzIDIgbW9kdWxlIGFyY2hpdmVzIChtYXIgZmlsZXMpCi0gICAgPC9kZXNjcmlwdGlvbj4KLSAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW48L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wbHVnaW4tYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHttYXZlbi52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW48L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wcm9qZWN0PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHttYXZlbi52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW48L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hcnRpZmFjdDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7bWF2ZW4uYXJ0aWZhY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXJjaGl2ZXI8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke21hdmVuLmFyY2hpdmVyLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLnBsZXh1czwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnBsZXh1cy11dGlsczwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7cGxleHVzLnV0aWxzLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnNoYXJlZDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXBsdWdpbi10ZXN0aW5nLWhhcm5lc3M8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8L2RlcGVuZGVuY2llcz4KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxyZXNvdXJjZXM+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT4uLi8uLi8uLjwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+Tk9USUNFLnR4dDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+TElDRU5TRS50eHQ8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgICAgICA8ZmlsdGVyaW5nPmZhbHNlPC9maWx0ZXJpbmc+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgPGZpbHRlcmluZz5mYWxzZTwvZmlsdGVyaW5nPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgPC9yZXNvdXJjZXM+Ci0gICAgPC9idWlsZD4KLSAgICA8ZGV2ZWxvcGVycz4KLSAgICAgICAgPGRldmVsb3Blcj4KLSAgICAgICAgICAgIDxpZD5qb2NoZW48L2lkPgotICAgICAgICAgICAgPG5hbWU+Sm9jaGVuIFdpZWRtYW5uPC9uYW1lPgotICAgICAgICAgICAgPGVtYWlsPmpvY2hlbi53aWVkbWFubkBnbWFpbC5jb208L2VtYWlsPgotICAgICAgICA8L2RldmVsb3Blcj4KLSAgICA8L2RldmVsb3BlcnM+Ci0gICAgPGNvbnRyaWJ1dG9ycz4KLSAgICAgICAgPGNvbnRyaWJ1dG9yPgotICAgICAgICAgICAgPG5hbWU+Sm9obiBQZmVpZmVyPC9uYW1lPgotICAgICAgICAgICAgPGVtYWlsPmpvaG4ucGZlaWZlckBobnBzb2x1dGlvbnMuY29tPC9lbWFpbD4KLSAgICAgICAgPC9jb250cmlidXRvcj4KLSAgICA8L2NvbnRyaWJ1dG9ycz4KLSAgICA8cmVwb3J0aW5nPgotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphdmFkb2MtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jaGFuZ2VzLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8cmVwb3J0U2V0cz4KLSAgICAgICAgICAgICAgICAgICAgPHJlcG9ydFNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxyZXBvcnRzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXBvcnQ+Y2hhbmdlcy1yZXBvcnQ8L3JlcG9ydD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVwb3J0cz4KLSAgICAgICAgICAgICAgICAgICAgPC9yZXBvcnRTZXQ+Ci0gICAgICAgICAgICAgICAgPC9yZXBvcnRTZXRzPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgIDwvcGx1Z2lucz4KLSAgICA8L3JlcG9ydGluZz4KLSAgICA8ZGlzdHJpYnV0aW9uTWFuYWdlbWVudD4KLSAgICAgICAgPHJlcG9zaXRvcnk+Ci0gICAgICAgICAgICA8aWQ+YXBhY2hlLXJlcG88L2lkPgotICAgICAgICAgICAgPG5hbWU+TWF2ZW4gQ2VudHJhbCBSZXBvc2l0b3J5PC9uYW1lPgotICAgICAgICAgICAgPHVybD5zY3BleGU6Ly9wZW9wbGUuYXBhY2hlLm9yZy8vd3d3L3Blb3BsZS5hcGFjaGUub3JnL3JlcG8vbTItaWJpYmxpby1yc3luYy1yZXBvc2l0b3J5PC91cmw+Ci0gICAgICAgIDwvcmVwb3NpdG9yeT4KLSAgICAgICAgPHNuYXBzaG90UmVwb3NpdG9yeT4KLSAgICAgICAgICAgIDxpZD5hcGFjaGUtc25hcHNob3RzPC9pZD4KLSAgICAgICAgICAgIDxuYW1lPkFwYWNoZSBEZXZlbG9wbWVudCBSZXBvc2l0b3J5PC9uYW1lPgotICAgICAgICAgICAgPHVybD5zY3BleGU6Ly9wZW9wbGUuYXBhY2hlLm9yZy8vd3d3L3Blb3BsZS5hcGFjaGUub3JnL3JlcG8vbTItc25hcHNob3QtcmVwb3NpdG9yeTwvdXJsPgotICAgICAgICA8L3NuYXBzaG90UmVwb3NpdG9yeT4KLSAgICA8L2Rpc3RyaWJ1dGlvbk1hbmFnZW1lbnQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLW1hci1tYXZlbi1wbHVnaW4vc3JjL2NoYW5nZXMvY2hhbmdlcy54bWwgYi92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLW1hci1tYXZlbi1wbHVnaW4vc3JjL2NoYW5nZXMvY2hhbmdlcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1ZTUwNjUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1tYXItbWF2ZW4tcGx1Z2luL3NyYy9jaGFuZ2VzL2NoYW5nZXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08ZG9jdW1lbnQ+Ci0gIDxwcm9wZXJ0aWVzPgotICAgIDx0aXRsZT5DaGFuZ2VzIGluIHRoZSBBeGlzMiBNQVIgcGx1Z2luIGZvciBNYXZlbiAyPC90aXRsZT4KLSAgPC9wcm9wZXJ0aWVzPgotICA8Ym9keT4KLSAgICA8cmVsZWFzZSB2ZXJzaW9uPSIxLjEuMS1TTkFQU0hPVCIgZGF0ZT0iTm90IHlldCByZWxlYXNlZCI+Ci0gICAgICA8YWN0aW9uIGRldj0iam9jaGVuIiB0eXBlPSJhZGQiPgotICAgICAgICBJbml0aWFsIHJlbGVhc2UuCi0gICAgICA8L2FjdGlvbj4KLSAgICA8L3JlbGVhc2U+Ci0gIDwvYm9keT4KLTwvZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLW1hci1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL21hdmVuMi9tYXIvQWJzdHJhY3RNYXJNb2pvLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLW1hci1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL21hdmVuMi9tYXIvQWJzdHJhY3RNYXJNb2pvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExNjMwNDkuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1tYXItbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi9tYXZlbjIvbWFyL0Fic3RyYWN0TWFyTW9qby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5tYXZlbjIubWFyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5BcnRpZmFjdDsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LnJlc29sdmVyLmZpbHRlci5TY29wZUFydGlmYWN0RmlsdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLkFic3RyYWN0TW9qbzsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5Nb2pvRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucHJvamVjdC5NYXZlblByb2plY3Q7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy51dGlsLkRpcmVjdG9yeVNjYW5uZXI7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy51dGlsLkZpbGVVdGlsczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLQotCi0vKioKLSAqIEFic3RyYWN0IGJhc2UgY2xhc3Mgb2YgYWxsIHRoZSBtb2pvcyBpbiB0aGUgYXhpczItbWFyLW1hdmVuLXBsdWdpbi4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0TWFyTW9qbwotICAgIGV4dGVuZHMgQWJzdHJhY3RNb2pvCi17Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgcHJvamVjdHMgYmFzZSBkaXJlY3RvcnkuCi0gICAgICoKLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7cHJvamVjdC5iYXNlZGlyfSIKLSAgICAgKiBAcmVxdWlyZWQKLSAgICAgKiBAcmVhZG9ubHkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRmlsZSBiYXNlRGlyOwotICAgIAotICAgIC8qKgotICAgICAqIFRoZSBtYXZlbiBwcm9qZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke3Byb2plY3R9IgotICAgICAqIEByZXF1aXJlZAotICAgICAqIEByZWFkb25seQotICAgICAqLwotICAgIHByb3RlY3RlZCBNYXZlblByb2plY3QgcHJvamVjdDsKLQotICAgIC8qKgotICAgICAqIFRoZSBkaXJlY3RvcnkgY29udGFpbmluZyBnZW5lcmF0ZWQgY2xhc3Nlcy4KLSAgICAgKgotICAgICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtwcm9qZWN0LmJ1aWxkLm91dHB1dERpcmVjdG9yeX0iCi0gICAgICogQHJlcXVpcmVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBGaWxlIGNsYXNzZXNEaXJlY3Rvcnk7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBtYXIgaXMgYnVpbHQuCi0gICAgICoKLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L21hciIKLSAgICAgKiBAcmVxdWlyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRmlsZSBtYXJEaXJlY3Rvcnk7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbG9jYXRpb24gb2YgdGhlIG1vZHVsZS54bWwgZmlsZS4gIElmIGl0IGlzIHByZXNlbnQgaW4gdGhlIE1FVEEtSU5GCi0gICAgICogZGlyZWN0b3J5IGluIHNyYy9tYWluL3Jlc291cmNlcyB3aXRoIHRoYXQgbmFtZSB0aGVuIGl0IHdpbGwgYXV0b21hdGljYWxseSBiZSAKLSAgICAgKiBpbmNsdWRlZC4gT3RoZXJ3aXNlIHRoaXMgcGFyYW1ldGVyIG11c3QgYmUgc2V0LgotICAgICAqCi0gICAgICogQHBhcmFtZXRlciAKLSAgICAgKi8KLSAgICBwcml2YXRlIEZpbGUgbW9kdWxlWG1sRmlsZTsKLQotICAgIC8qKgotICAgICAqIEFkZGl0aW9uYWwgZmlsZSBzZXRzLCB3aGljaCBhcmUgYmVpbmcgYWRkZWQgdG8gdGhlIGFyY2hpdmUuCi0gICAgICoKLSAgICAgKiBAcGFyYW1ldGVyCi0gICAgICovCi0gICAgcHJpdmF0ZSBGaWxlU2V0W10gZmlsZVNldHM7Ci0KLSAgICAvKioKLSAgICAgKiBXaGV0aGVyIHRoZSBkZXBlbmRlbmN5IGphcnMgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBtYXIKLSAgICAgKiAKLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7aW5jbHVkZURlcGVuZGVuY2llc30iIGRlZmF1bHQtdmFsdWU9InRydWUiCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGluY2x1ZGVEZXBlbmRlbmNpZXM7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQnVpbGRzIHRoZSBleHBsb2RlZCBtYXIgZmlsZS4KLSAgICAgKiBAdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBidWlsZEV4cGxvZGVkTWFyKCApCi0gICAgICAgIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uCi0gICAgewotICAgICAgICBnZXRMb2coKS5kZWJ1ZyggIkV4cGxvZGluZyBtYXIuLi4iICk7Ci0KLSAgICAgICAgbWFyRGlyZWN0b3J5Lm1rZGlycygpOwotICAgICAgICBnZXRMb2coKS5kZWJ1ZyggIkFzc2VtYmxpbmcgbWFyICIgKyBwcm9qZWN0LmdldEFydGlmYWN0SWQoKSArICIgaW4gIiArIG1hckRpcmVjdG9yeSApOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBGaWxlIG1ldGFJbmZEaXIgPSBuZXcgRmlsZSggbWFyRGlyZWN0b3J5LCAiTUVUQS1JTkYiICk7Ci0gICAgICAgICAgICBmaW5hbCBGaWxlIGxpYkRpciA9IG5ldyBGaWxlKG1hckRpcmVjdG9yeSwgImxpYiIpOwotICAgICAgICAgICAgZmluYWwgRmlsZSBtb2R1bGVGaWxlVGFyZ2V0ID0gbmV3IEZpbGUoIG1ldGFJbmZEaXIsICJtb2R1bGUueG1sIiApOwotICAgICAgICAgICAgYm9vbGVhbiBleGlzdHNCZWZvcmVDb3B5aW5nQ2xhc3NlcyA9IG1vZHVsZUZpbGVUYXJnZXQuZXhpc3RzKCk7Ci0KLSAgICAgICAgICAgIGlmICggY2xhc3Nlc0RpcmVjdG9yeS5leGlzdHMoKSAmJiAoICFjbGFzc2VzRGlyZWN0b3J5LmVxdWFscyggbWFyRGlyZWN0b3J5ICkgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRmlsZVV0aWxzLmNvcHlEaXJlY3RvcnlTdHJ1Y3R1cmUoIGNsYXNzZXNEaXJlY3RvcnksIG1hckRpcmVjdG9yeSApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIGZpbGVTZXRzICE9IG51bGwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvciAoIGludCBpID0gMDsgIGkgPCBmaWxlU2V0cy5sZW5ndGg7ICAgaSsrICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEZpbGVTZXQgZmlsZVNldCA9IGZpbGVTZXRzW2ldOwotICAgICAgICAgICAgICAgICAgICBjb3B5RmlsZVNldCggZmlsZVNldCwgbWFyRGlyZWN0b3J5ICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBjb3B5TWV0YUluZkZpbGUoIG1vZHVsZVhtbEZpbGUsIG1vZHVsZUZpbGVUYXJnZXQsIGV4aXN0c0JlZm9yZUNvcHlpbmdDbGFzc2VzLCAibW9kdWxlLnhtbCBmaWxlIiApOwotCi0gICAgICAgICAgICBpZihpbmNsdWRlRGVwZW5kZW5jaWVzKXsKLSAgICAgICAgICAgICAgICBTZXQgYXJ0aWZhY3RzID0gcHJvamVjdC5nZXRBcnRpZmFjdHMoKTsKLSAgICAKLSAgICAgICAgICAgICAgICBMaXN0IGR1cGxpY2F0ZXMgPSBmaW5kRHVwbGljYXRlcyggYXJ0aWZhY3RzICk7Ci0gICAgCi0gICAgICAgICAgICAgICAgZm9yICggSXRlcmF0b3IgaXRlciA9IGFydGlmYWN0cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTsgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAJQXJ0aWZhY3QgYXJ0aWZhY3QgPSAoQXJ0aWZhY3QpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgIAlTdHJpbmcgdGFyZ2V0RmlsZU5hbWUgPSBnZXREZWZhdWx0RmluYWxOYW1lKCBhcnRpZmFjdCApOwotICAgIAotICAgICAgICAgICAgICAgIAlnZXRMb2coKS5kZWJ1ZyggIlByb2Nlc3Npbmc6ICIgKyB0YXJnZXRGaWxlTmFtZSApOwotICAgIAotICAgICAgICAgICAgICAgIAlpZiAoIGR1cGxpY2F0ZXMuY29udGFpbnMoIHRhcmdldEZpbGVOYW1lICkgKQotICAgICAgICAgICAgICAgIAl7Ci0gICAgICAgICAgICAgICAgCQlnZXRMb2coKS5kZWJ1ZyggIkR1cGxpY2F0ZSBmb3VuZDogIiArIHRhcmdldEZpbGVOYW1lICk7Ci0gICAgICAgICAgICAgICAgCQl0YXJnZXRGaWxlTmFtZSA9IGFydGlmYWN0LmdldEdyb3VwSWQoKSArICItIiArIHRhcmdldEZpbGVOYW1lOwotICAgICAgICAgICAgICAgIAkJZ2V0TG9nKCkuZGVidWcoICJSZW5hbWVkIHRvOiAiICsgdGFyZ2V0RmlsZU5hbWUgKTsKLSAgICAgICAgICAgICAgICAJfQotICAgIAotICAgICAgICAgICAgICAgIAkvLyBUT0RPOiB1dGlsaXNlIGFwcHJvcHJpYXRlIG1ldGhvZHMgZnJvbSBwcm9qZWN0IGJ1aWxkZXIKLSAgICAgICAgICAgICAgICAJU2NvcGVBcnRpZmFjdEZpbHRlciBmaWx0ZXIgPSBuZXcgU2NvcGVBcnRpZmFjdEZpbHRlciggQXJ0aWZhY3QuU0NPUEVfUlVOVElNRSApOwotICAgICAgICAgICAgICAgIAlpZiAoICFhcnRpZmFjdC5pc09wdGlvbmFsKCkgJiYgZmlsdGVyLmluY2x1ZGUoIGFydGlmYWN0ICkgKQotICAgICAgICAgICAgICAgIAl7Ci0gICAgICAgICAgICAgICAgCQlTdHJpbmcgdHlwZSA9IGFydGlmYWN0LmdldFR5cGUoKTsKLSAgICAgICAgICAgICAgICAJCWlmICggImphciIuZXF1YWxzKCB0eXBlICkgKQotICAgICAgICAgICAgICAgIAkJewotICAgICAgICAgICAgICAgIAkJCWNvcHlGaWxlSWZNb2RpZmllZCggYXJ0aWZhY3QuZ2V0RmlsZSgpLCBuZXcgRmlsZSggbGliRGlyLCB0YXJnZXRGaWxlTmFtZSApICk7Ci0gICAgICAgICAgICAgICAgCQl9Ci0gICAgICAgICAgICAgICAgCX0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBJT0V4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oICJDb3VsZCBub3QgZXhwbG9kZSBtYXIuLi4iLCBlICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZWFyY2hlcyBhIHNldCBvZiBhcnRpZmFjdHMgZm9yIGR1cGxpY2F0ZSBmaWxlbmFtZXMgYW5kIHJldHVybnMgYSBsaXN0IG9mIGR1cGxpY2F0ZXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYXJ0aWZhY3RzIHNldCBvZiBhcnRpZmFjdHMKLSAgICAgKiBAcmV0dXJuIExpc3Qgb2YgZHVwbGljYXRlZCBhcnRpZmFjdHMKLSAgICAgKi8KLSAgICBwcml2YXRlIExpc3QgZmluZER1cGxpY2F0ZXMoIFNldCBhcnRpZmFjdHMgKQotICAgIHsKLSAgICAgICAgTGlzdCBkdXBsaWNhdGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBMaXN0IGlkZW50aWZpZXJzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBmb3IgKCBJdGVyYXRvciBpdGVyID0gYXJ0aWZhY3RzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFydGlmYWN0IGFydGlmYWN0ID0gKEFydGlmYWN0KSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIFN0cmluZyBjYW5kaWRhdGUgPSBnZXREZWZhdWx0RmluYWxOYW1lKCBhcnRpZmFjdCApOwotICAgICAgICAgICAgaWYgKCBpZGVudGlmaWVycy5jb250YWlucyggY2FuZGlkYXRlICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGR1cGxpY2F0ZXMuYWRkKCBjYW5kaWRhdGUgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZGVudGlmaWVycy5hZGQoIGNhbmRpZGF0ZSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBkdXBsaWNhdGVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIHRoZSBmaWxlbmFtZSBvZiBhbiBhcnRpZmFjdCB0byBhcnRpZmFjdElkLXZlcnNpb24udHlwZSBmb3JtYXQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYXJ0aWZhY3QKLSAgICAgKiBAcmV0dXJuIGNvbnZlcnRlZCBmaWxlbmFtZSBvZiB0aGUgYXJ0aWZhY3QKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBnZXREZWZhdWx0RmluYWxOYW1lKCBBcnRpZmFjdCBhcnRpZmFjdCApCi0gICAgewotICAgICAgICByZXR1cm4gYXJ0aWZhY3QuZ2V0QXJ0aWZhY3RJZCgpICsgIi0iICsgYXJ0aWZhY3QuZ2V0VmVyc2lvbigpICsgIi4iICsKLSAgICAgICAgICAgIGFydGlmYWN0LmdldEFydGlmYWN0SGFuZGxlcigpLmdldEV4dGVuc2lvbigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvcHkgZmlsZSBmcm9tIHNvdXJjZSB0byBkZXN0aW5hdGlvbiBvbmx5IGlmIHNvdXJjZSB0aW1lc3RhbXAgaXMgbGF0ZXIgdGhhbiB0aGUgZGVzdGluYXRpb24gdGltZXN0YW1wLgotICAgICAqIFRoZSBkaXJlY3RvcmllcyB1cCB0byA8Y29kZT5kZXN0aW5hdGlvbjwvY29kZT4gd2lsbCBiZSBjcmVhdGVkIGlmIHRoZXkgZG9uJ3QgYWxyZWFkeSBleGlzdC4KLSAgICAgKiA8Y29kZT5kZXN0aW5hdGlvbjwvY29kZT4gd2lsbCBiZSBvdmVyd3JpdHRlbiBpZiBpdCBhbHJlYWR5IGV4aXN0cy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzb3VyY2UgICAgICBBbiBleGlzdGluZyBub24tZGlyZWN0b3J5IDxjb2RlPkZpbGU8L2NvZGU+IHRvIGNvcHkgYnl0ZXMgZnJvbS4KLSAgICAgKiBAcGFyYW0gZGVzdGluYXRpb24gQSBub24tZGlyZWN0b3J5IDxjb2RlPkZpbGU8L2NvZGU+IHRvIHdyaXRlIGJ5dGVzIHRvIChwb3NzaWJseQotICAgICAqICAgICAgICAgICAgICAgICAgICBvdmVyd3JpdGluZykuCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiAgICAgICAgICAgICAgICAgICBpZiA8Y29kZT5zb3VyY2U8L2NvZGU+IGRvZXMgbm90IGV4aXN0LCA8Y29kZT5kZXN0aW5hdGlvbjwvY29kZT4gY2Fubm90IGJlCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0dGVuIHRvLCBvciBhbiBJTyBlcnJvciBvY2N1cnMgZHVyaW5nIGNvcHlpbmcuCi0gICAgICogQHRocm93cyBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBpZiA8Y29kZT5kZXN0aW5hdGlvbjwvY29kZT4gaXMgYSBkaXJlY3RvcnkKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLz4KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRPIERPOiBSZW1vdmUgdGhpcyBtZXRob2Qgd2hlbiBNYXZlbiBtb3ZlcyB0byBwbGV4dXMtdXRpbHMgdmVyc2lvbiAxLjQKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY29weUZpbGVJZk1vZGlmaWVkKCBGaWxlIHNvdXJjZSwgRmlsZSBkZXN0aW5hdGlvbiApCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgLy8gVE8gRE86IFJlbW92ZSB0aGlzIG1ldGhvZCBhbmQgdXNlIHRoZSBtZXRob2QgaW4gV2FyRmlsZVV0aWxzIHdoZW4gTWF2ZW4gMiBjaGFuZ2VzCi0gICAgICAgIC8vIHRvIHBsZXh1cy11dGlscyAxLjIuCi0gICAgICAgIGlmICggZGVzdGluYXRpb24ubGFzdE1vZGlmaWVkKCkgPCBzb3VyY2UubGFzdE1vZGlmaWVkKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBGaWxlVXRpbHMuY29weUZpbGUoIHNvdXJjZS5nZXRDYW5vbmljYWxGaWxlKCksIGRlc3RpbmF0aW9uICk7Ci0gICAgICAgICAgICAvLyBwcmVzZXJ2ZSB0aW1lc3RhbXAKLSAgICAgICAgICAgIGRlc3RpbmF0aW9uLnNldExhc3RNb2RpZmllZCggc291cmNlLmxhc3RNb2RpZmllZCgpICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY29weUZpbGVTZXQoIEZpbGVTZXQgZmlsZVNldCwgRmlsZSB0YXJnZXREaXJlY3RvcnkgKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIEZpbGUgZGlyID0gZmlsZVNldC5nZXREaXJlY3RvcnkoKTsKLSAgICAgICAgaWYgKCBkaXIgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRpciA9IGJhc2VEaXI7Ci0gICAgICAgIH0KLSAgICAgICAgRmlsZSB0YXJnZXREaXIgPSB0YXJnZXREaXJlY3Rvcnk7Ci0gICAgICAgIGlmICggZmlsZVNldC5nZXRPdXRwdXREaXJlY3RvcnkoKSAhPSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgdGFyZ2V0RGlyID0gbmV3IEZpbGUoIHRhcmdldERpciwgZmlsZVNldC5nZXRPdXRwdXREaXJlY3RvcnkoKSApOwotICAgICAgICB9Ci0gICAgICAgIGlmICggdGFyZ2V0RGlyLmVxdWFscyggZGlyICkgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBEaXJlY3RvcnlTY2FubmVyIGRzID0gbmV3IERpcmVjdG9yeVNjYW5uZXIoKTsKLSAgICAgICAgZHMuc2V0QmFzZWRpciggZGlyICk7Ci0gICAgICAgIGlmICggIWZpbGVTZXQuaXNTa2lwRGVmYXVsdEV4Y2x1ZGVzKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBkcy5hZGREZWZhdWx0RXhjbHVkZXMoKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBTdHJpbmdbXSBleGNsdWRlcyA9IGZpbGVTZXQuZ2V0RXhjbHVkZXMoKTsKLSAgICAgICAgaWYgKCBleGNsdWRlcyAhPSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgZHMuc2V0RXhjbHVkZXMoIGV4Y2x1ZGVzICk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgU3RyaW5nW10gaW5jbHVkZXMgPSBmaWxlU2V0LmdldEluY2x1ZGVzKCk7Ci0gICAgICAgIGlmICggaW5jbHVkZXMgIT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRzLnNldEluY2x1ZGVzKCBpbmNsdWRlcyApOwotICAgICAgICB9Ci0gICAgICAgIGRzLnNjYW4oKTsKLSAgICAgICAgU3RyaW5nW10gZmlsZXMgPSBkcy5nZXRJbmNsdWRlZEZpbGVzKCk7Ci0gICAgICAgIGZvciAoIGludCBpID0gMDsgIGkgPCBmaWxlcy5sZW5ndGg7ICBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBGaWxlIHNvdXJjZUZpbGUgPSBuZXcgRmlsZSggZGlyLCBmaWxlc1tpXSApOwotICAgICAgICAgICAgRmlsZSB0YXJnZXRGaWxlID0gbmV3IEZpbGUoIHRhcmdldERpciwgZmlsZXNbaV0gKTsKLSAgICAgICAgICAgIEZpbGVVdGlscy5jb3B5RmlsZSggc291cmNlRmlsZSwgdGFyZ2V0RmlsZSApOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICBwcml2YXRlIHZvaWQgY29weU1ldGFJbmZGaWxlKCBmaW5hbCBGaWxlIHBTb3VyY2UsIGZpbmFsIEZpbGUgcFRhcmdldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIHBFeGlzdHNCZWZvcmVDb3B5aW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwRGVzY3JpcHRpb24gKQotICAgICAgICB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmICggcFNvdXJjZSAhPSBudWxsICAmJiAgcFRhcmdldCAhPSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCAhcFNvdXJjZS5leGlzdHMoKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oICJUaGUgY29uZmlndXJlZCAiICsgcERlc2NyaXB0aW9uICsgIiBjb3VsZCBub3QgYmUgZm91bmQgYXQgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHBTb3VyY2UgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCAhcEV4aXN0c0JlZm9yZUNvcHlpbmcgICYmICBwVGFyZ2V0LmV4aXN0cygpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBnZXRMb2coKS53YXJuKCAiVGhlIGNvbmZpZ3VyZWQgIiArIHBEZXNjcmlwdGlvbiArICIgb3ZlcndyaXRlcyBhbm90aGVyIGZpbGUgZnJvbSB0aGUgY2xhc3NwYXRoLiIgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgRmlsZVV0aWxzLmNvcHlGaWxlKCBwU291cmNlLCBwVGFyZ2V0ICk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLW1hci1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL21hdmVuMi9tYXIvRmlsZVNldC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1tYXItbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi9tYXZlbjIvbWFyL0ZpbGVTZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDYzMmNlNi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLW1hci1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL21hdmVuMi9tYXIvRmlsZVNldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5tYXZlbjIubWFyOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi0KLS8qKgotICogQSBGaWxlU2V0IGRlZmluZXMgYWRkaXRpb25hbCBmaWxlcywgd2hpY2ggYXJlIGJlaW5nIGFkZGVkIHRvIHRoZQotICogQXhpcyBhcHBsaWNhdGlvbiBhcmNoaXZlLiBUaGUgb2JqZWN0cyBzdHJ1Y3R1cmUgZm9sbG93cyB0aGUKLSAqIEZpbGVTZXQgb2JqZWN0IGZyb20gdGhlIG1hdmVuLWFzc2VtYmx5LXBsdWdpbiwgc2VlIHRoZQotICogPGEgaHJlZj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkuaHRtbCI+cGx1Z2luIGRvY3VtZW50YXRpb248L2E+Ci0gKiBmb3IgZGV0YWlscy4KLSAqLwotcHVibGljIGNsYXNzIEZpbGVTZXQKLXsKLSAgICBwcml2YXRlIEZpbGUgZGlyZWN0b3J5OwotICAgIHByaXZhdGUgU3RyaW5nIG91dHB1dERpcmVjdG9yeTsKLSAgICBwcml2YXRlIFN0cmluZ1tdIGluY2x1ZGVzLCBleGNsdWRlczsKLSAgICBwcml2YXRlIGJvb2xlYW4gc2tpcERlZmF1bHRFeGNsdWRlczsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGZpbGUgc2V0cyBiYXNlIGRpcmVjdG9yeS4gTWF5IGJlIG9taXR0ZWQsIGluIHdoaWNoCi0gICAgICogY2FzZSB0aGUgcHJvamVjdHMgYmFzZSBkaXJlY3RvcnkgaXMgYXNzdW1lZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgRmlsZSBnZXREaXJlY3RvcnkoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGRpcmVjdG9yeTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBmaWxlIHNldHMgYmFzZSBkaXJlY3RvcnkuIE1heSBiZSBvbWl0dGVkLCBpbiB3aGljaAotICAgICAqIGNhc2UgdGhlIHByb2plY3RzIGJhc2UgZGlyZWN0b3J5IGlzIGFzc3VtZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RGlyZWN0b3J5KCBGaWxlIGRpcmVjdG9yeSApCi0gICAgewotICAgICAgICB0aGlzLmRpcmVjdG9yeSA9IGRpcmVjdG9yeTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBmaWxlIHNldHMgZXhjbHVzaW9uIGxpc3QuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZ1tdIGdldEV4Y2x1ZGVzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBleGNsdWRlczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBmaWxlIHNldHMgZXhjbHVzaW9uIGxpc3QuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RXhjbHVkZXMoIFN0cmluZ1tdIGV4Y2x1ZGVzICkKLSAgICB7Ci0gICAgICAgIHRoaXMuZXhjbHVkZXMgPSBleGNsdWRlczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBmaWxlIHNldHMgaW5jbHVzaW9uIGxpc3QuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZ1tdIGdldEluY2x1ZGVzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBpbmNsdWRlczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBmaWxlIHNldHMgaW5jbHVzaW9uIGxpc3QuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SW5jbHVkZXMoIFN0cmluZ1tdIGluY2x1ZGVzICkKLSAgICB7Ci0gICAgICAgIHRoaXMuaW5jbHVkZXMgPSBpbmNsdWRlczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIGEgcHJlZml4LCB3aGljaCB0aGUgaW5jbHVkZWQgZmlsZXMgc2hvdWxkIGhhdmUKLSAgICAgKiB3aGVuIGJlaW5nIGFkZGVkIHRvIHRoZSBBeGlzIGFwcGxpY2F0aW9uIGFyY2hpdmUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRPdXRwdXREaXJlY3RvcnkoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG91dHB1dERpcmVjdG9yeTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgcHJlZml4LCB3aGljaCB0aGUgaW5jbHVkZWQgZmlsZXMgc2hvdWxkIGhhdmUKLSAgICAgKiB3aGVuIGJlaW5nIGFkZGVkIHRvIHRoZSBBeGlzIGFwcGxpY2F0aW9uIGFyY2hpdmUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0T3V0cHV0RGlyZWN0b3J5KCBTdHJpbmcgb3V0cHV0RGlyZWN0b3J5ICkKLSAgICB7Ci0gICAgICAgIHRoaXMub3V0cHV0RGlyZWN0b3J5ID0gb3V0cHV0RGlyZWN0b3J5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMsIHdoZXRoZXIgdGhlIGRlZmF1bHQgZXhjbHVkZXMgc2hvdWxkIGJlIHVzZWQuIERlZmF1bHRzCi0gICAgICogdG8gdHJ1ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1NraXBEZWZhdWx0RXhjbHVkZXMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHNraXBEZWZhdWx0RXhjbHVkZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cywgd2hldGhlciB0aGUgZGVmYXVsdCBleGNsdWRlcyBzaG91bGQgYmUgdXNlZC4gRGVmYXVsdHMgdG8KLSAgICAgKiB0cnVlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNraXBEZWZhdWx0RXhjbHVkZXMoIGJvb2xlYW4gc2tpcERlZmF1bHRFeGNsdWRlcyApCi0gICAgewotICAgICAgICB0aGlzLnNraXBEZWZhdWx0RXhjbHVkZXMgPSBza2lwRGVmYXVsdEV4Y2x1ZGVzOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItbWFyLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvbWF2ZW4yL21hci9NYXJFeHBsb2RlZE1vam8uamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItbWFyLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvbWF2ZW4yL21hci9NYXJFeHBsb2RlZE1vam8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkwMWU4Mi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLW1hci1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL21hdmVuMi9tYXIvTWFyRXhwbG9kZWRNb2pvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIubWF2ZW4yLm1hcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLk1vam9FeGVjdXRpb25FeGNlcHRpb247Ci0KLS8qKgotICogR2VuZXJhdGUgdGhlIGV4cGxvZGVkIG1hcgotICoKLSAqIEBnb2FsIGV4cGxvZGVkCi0gKiBAcGhhc2UgcGFja2FnZQotICogQHJlcXVpcmVzRGVwZW5kZW5jeVJlc29sdXRpb24gcnVudGltZQotICovCi1wdWJsaWMgY2xhc3MgTWFyRXhwbG9kZWRNb2pvCi0gICAgZXh0ZW5kcyBBYnN0cmFjdE1hck1vam8KLXsKLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgCi0gICAgICB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgYnVpbGRFeHBsb2RlZE1hcigpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItbWFyLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvbWF2ZW4yL21hci9NYXJJblBsYWNlTW9qby5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1tYXItbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi9tYXZlbjIvbWFyL01hckluUGxhY2VNb2pvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4NzdkYjAuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1tYXItbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi9tYXZlbjIvbWFyL01hckluUGxhY2VNb2pvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIubWF2ZW4yLm1hcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLk1vam9FeGVjdXRpb25FeGNlcHRpb247Ci0KLS8qKgotICogR2VuZXJhdGVzIG1hciBpbiB0aGUgc291cmNlIGRpcmVjdG9yeQotICoKLSAqIEBnb2FsIGlucGxhY2UKLSAqIEByZXF1aXJlc0RlcGVuZGVuY3lSZXNvbHV0aW9uIHJ1bnRpbWUKLSAqLwotcHVibGljIGNsYXNzIE1hckluUGxhY2VNb2pvIAotICBleHRlbmRzIEFic3RyYWN0TWFyTW9qbwotewotCi0gIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQotICAgIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uCi0gIHsKLQotICAgIGdldExvZygpLmRlYnVnKCJHZW5lcmF0aW5nIG1hciBpbiBzb3VyY2UgZGlyZWN0b3J5Li4uICIgKyBtYXJEaXJlY3RvcnkpOwotICAgIGJ1aWxkRXhwbG9kZWRNYXIoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1tYXItbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi9tYXZlbjIvbWFyL01hck1vam8uamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItbWFyLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvbWF2ZW4yL21hci9NYXJNb2pvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwNWM5ZjguLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1tYXItbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi9tYXZlbjIvbWFyL01hck1vam8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIubWF2ZW4yLm1hcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJjaGl2ZXIuTWF2ZW5BcmNoaXZlQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFyY2hpdmVyLk1hdmVuQXJjaGl2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5BcnRpZmFjdDsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LkRlcGVuZGVuY3lSZXNvbHV0aW9uUmVxdWlyZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnByb2plY3QuTWF2ZW5Qcm9qZWN0SGVscGVyOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuYXJjaGl2ZXIuQXJjaGl2ZXJFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5hcmNoaXZlci5qYXIuSmFyQXJjaGl2ZXI7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5hcmNoaXZlci5qYXIuTWFuaWZlc3RFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotLyoqCi0gKiBCdWlsZCBhIG1hci4KLSAqIAotICogQGdvYWwgbWFyCi0gKiBAcGhhc2UgcGFja2FnZQotICogQHJlcXVpcmVzRGVwZW5kZW5jeVJlc29sdXRpb24gcnVudGltZQotICovCi1wdWJsaWMgY2xhc3MgTWFyTW9qbyBleHRlbmRzIEFic3RyYWN0TWFyTW9qbwotewotICAgIC8qKgotICAgICAqIFRoZSBkaXJlY3RvcnkgZm9yIHRoZSBnZW5lcmF0ZWQgbWFyLgotICAgICAqIAotICAgICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0iCi0gICAgICogQHJlcXVpcmVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgb3V0cHV0RGlyZWN0b3J5OwotCi0gICAgLyoqCi0gICAgICogVGhlIG5hbWUgb2YgdGhlIGdlbmVyYXRlZCBtYXIuCi0gICAgICogCi0gICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke3Byb2plY3QuYnVpbGQuZmluYWxOYW1lfSIKLSAgICAgKiBAcmVxdWlyZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBtYXJOYW1lOwotCi0gICAgLyoqCi0gICAgICogVGhlIEphciBhcmNoaXZlci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7Y29tcG9uZW50Lm9yZy5jb2RlaGF1cy5wbGV4dXMuYXJjaGl2ZXIuQXJjaGl2ZXIjamFyfSIKLSAgICAgKiBAcmVxdWlyZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEphckFyY2hpdmVyIGphckFyY2hpdmVyOwotCi0gICAgLyoqCi0gICAgICogVGhlIG1hdmVuIGFyY2hpdmUgY29uZmlndXJhdGlvbiB0byB1c2UuCi0gICAgICogCi0gICAgICogQHBhcmFtZXRlcgotICAgICAqLwotICAgIHByaXZhdGUgTWF2ZW5BcmNoaXZlQ29uZmlndXJhdGlvbiBhcmNoaXZlID0gbmV3IE1hdmVuQXJjaGl2ZUNvbmZpZ3VyYXRpb24oKTsKLQotICAgIC8qKgotICAgICAqIENsYXNzaWZpZXIgdG8gYWRkIHRvIHRoZSBhcnRpZmFjdCBnZW5lcmF0ZWQuIElmIGdpdmVuLCB0aGUgYXJ0aWZhY3Qgd2lsbCBiZSBhbiBhdHRhY2htZW50IGluc3RlYWQuCi0gICAgICogCi0gICAgICogQHBhcmFtZXRlcgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGNsYXNzaWZpZXI7Ci0KLSAgICAvKioKLSAgICAgKiBXaGV0aGVyIHRoaXMgaXMgdGhlIG1haW4gYXJ0aWZhY3QgYmVpbmcgYnVpbHQuIFNldCB0byA8Y29kZT5mYWxzZTwvY29kZT4gaWYgeW91IGRvbid0IHdhbnQgdG8gaW5zdGFsbCBvciBkZXBsb3kKLSAgICAgKiBpdCB0byB0aGUgbG9jYWwgcmVwb3NpdG9yeSBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IG9uZSBpbiBhbiBleGVjdXRpb24uCi0gICAgICogCi0gICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke3ByaW1hcnlBcnRpZmFjdH0iIGRlZmF1bHQtdmFsdWU9InRydWUiCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIHByaW1hcnlBcnRpZmFjdDsKLQotICAgIC8qKgotICAgICAqIEBjb21wb25lbnQKLSAgICAgKi8KLSAgICBwcml2YXRlIE1hdmVuUHJvamVjdEhlbHBlciBwcm9qZWN0SGVscGVyOwotCi0gICAgLyoqCi0gICAgICogRXhlY3V0ZXMgdGhlIE1hck1vam8gb24gdGhlIGN1cnJlbnQgcHJvamVjdC4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cmVkIHdoaWxlIGJ1aWxkaW5nIHRoZSB3ZWJhcHAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24KLSAgICB7Ci0KLSAgICAgICAgRmlsZSBtYXJGaWxlID0gbmV3IEZpbGUoIG91dHB1dERpcmVjdG9yeSwgbWFyTmFtZSArICIubWFyIiApOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBwZXJmb3JtUGFja2FnaW5nKCBtYXJGaWxlICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCAiRXJyb3IgYXNzZW1ibGluZyBtYXIiLCBlICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZW5lcmF0ZXMgdGhlIG1hci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWFyRmlsZQotICAgICAqICAgICAgICAgICAgdGhlIHRhcmdldCBtYXIgZmlsZQotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIEFyY2hpdmVyRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBNYW5pZmVzdEV4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgRGVwZW5kZW5jeVJlc29sdXRpb25SZXF1aXJlZEV4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBwZXJmb3JtUGFja2FnaW5nKCBGaWxlIG1hckZpbGUgKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIEFyY2hpdmVyRXhjZXB0aW9uLCBNYW5pZmVzdEV4Y2VwdGlvbiwgRGVwZW5kZW5jeVJlc29sdXRpb25SZXF1aXJlZEV4Y2VwdGlvbiwKLSAgICAgICAgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbgotICAgIHsKLQotICAgICAgICBidWlsZEV4cGxvZGVkTWFyKCApOwotCi0gICAgICAgIC8vIGdlbmVyYXRlIG1hciBmaWxlCi0gICAgICAgIGdldExvZygpLmluZm8oICJHZW5lcmF0aW5nIG1hciAiICsgbWFyRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSApOwotICAgICAgICBNYXZlbkFyY2hpdmVyIGFyY2hpdmVyID0gbmV3IE1hdmVuQXJjaGl2ZXIoKTsKLSAgICAgICAgYXJjaGl2ZXIuc2V0QXJjaGl2ZXIoIGphckFyY2hpdmVyICk7Ci0gICAgICAgIGFyY2hpdmVyLnNldE91dHB1dEZpbGUoIG1hckZpbGUgKTsKLSAgICAgICAgamFyQXJjaGl2ZXIuYWRkRGlyZWN0b3J5KCBtYXJEaXJlY3RvcnkgKTsKLQotICAgICAgICAvLyBjcmVhdGUgYXJjaGl2ZQotICAgICAgICBhcmNoaXZlci5jcmVhdGVBcmNoaXZlKCBwcm9qZWN0LCBhcmNoaXZlICk7Ci0KLSAgICAgICAgaWYgKCBjbGFzc2lmaWVyICE9IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBwcm9qZWN0SGVscGVyLmF0dGFjaEFydGlmYWN0KCBwcm9qZWN0LCAibWFyIiwgY2xhc3NpZmllciwgbWFyRmlsZSApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgQXJ0aWZhY3QgYXJ0aWZhY3QgPSBwcm9qZWN0LmdldEFydGlmYWN0KCk7Ci0gICAgICAgICAgICBpZiAoIHByaW1hcnlBcnRpZmFjdCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXJ0aWZhY3Quc2V0RmlsZSggbWFyRmlsZSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoIGFydGlmYWN0LmdldEZpbGUoKSA9PSBudWxsIHx8IGFydGlmYWN0LmdldEZpbGUoKS5pc0RpcmVjdG9yeSgpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhcnRpZmFjdC5zZXRGaWxlKCBtYXJGaWxlICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHJvamVjdEhlbHBlci5hdHRhY2hBcnRpZmFjdCggcHJvamVjdCwgIm1hciIsIG1hckZpbGUgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItbWFyLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvcGxleHVzL2NvbXBvbmVudHMueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1tYXItbWF2ZW4tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9wbGV4dXMvY29tcG9uZW50cy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3MmNkM2MuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1tYXItbWF2ZW4tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9wbGV4dXMvY29tcG9uZW50cy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxjb21wb25lbnQtc2V0PgotICA8Y29tcG9uZW50cz4KLSAgICA8Y29tcG9uZW50PgotICAgICAgPHJvbGU+b3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5oYW5kbGVyLkFydGlmYWN0SGFuZGxlcjwvcm9sZT4KLSAgICAgIDxyb2xlLWhpbnQ+bWFyPC9yb2xlLWhpbnQ+Ci0gICAgICA8aW1wbGVtZW50YXRpb24+b3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5oYW5kbGVyLkRlZmF1bHRBcnRpZmFjdEhhbmRsZXI8L2ltcGxlbWVudGF0aW9uPgotICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgIDxleHRlbnNpb24+bWFyPC9leHRlbnNpb24+Ci0gICAgICAgIDx0eXBlPm1hcjwvdHlwZT4KLSAgICAgICAgPGxhbmd1YWdlPmphdmE8L2xhbmd1YWdlPgotICAgICAgICA8YWRkZWRUb0NsYXNzcGF0aD5mYWxzZTwvYWRkZWRUb0NsYXNzcGF0aD4KLSAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICA8L2NvbXBvbmVudD4KLSAgICA8Y29tcG9uZW50PgotICAgICAgPHJvbGU+b3JnLmFwYWNoZS5tYXZlbi5saWZlY3ljbGUubWFwcGluZy5MaWZlY3ljbGVNYXBwaW5nPC9yb2xlPgotICAgICAgPHJvbGUtaGludD5tYXI8L3JvbGUtaGludD4KLSAgICAgIDxpbXBsZW1lbnRhdGlvbj5vcmcuYXBhY2hlLm1hdmVuLmxpZmVjeWNsZS5tYXBwaW5nLkRlZmF1bHRMaWZlY3ljbGVNYXBwaW5nPC9pbXBsZW1lbnRhdGlvbj4KLSAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICA8bGlmZWN5Y2xlcz4KLSAgICAgICAgICA8bGlmZWN5Y2xlPgotICAgICAgICAgICAgPGlkPmRlZmF1bHQ8L2lkPgotICAgICAgICAgICAgPHBoYXNlcz4KLSAgICAgICAgICAgICAgPHByb2Nlc3MtcmVzb3VyY2VzPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczptYXZlbi1yZXNvdXJjZXMtcGx1Z2luOnJlc291cmNlczwvcHJvY2Vzcy1yZXNvdXJjZXM+Ci0gICAgICAgICAgICAgIDxjb21waWxlPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczptYXZlbi1jb21waWxlci1wbHVnaW46Y29tcGlsZTwvY29tcGlsZT4KLSAgICAgICAgICAgICAgPHByb2Nlc3MtdGVzdC1yZXNvdXJjZXM+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zOm1hdmVuLXJlc291cmNlcy1wbHVnaW46dGVzdFJlc291cmNlczwvcHJvY2Vzcy10ZXN0LXJlc291cmNlcz4KLSAgICAgICAgICAgICAgPHRlc3QtY29tcGlsZT5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM6bWF2ZW4tY29tcGlsZXItcGx1Z2luOnRlc3RDb21waWxlPC90ZXN0LWNvbXBpbGU+Ci0gICAgICAgICAgICAgIDx0ZXN0Pm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczptYXZlbi1zdXJlZmlyZS1wbHVnaW46dGVzdDwvdGVzdD4KLSAgICAgICAgICAgICAgPHBhY2thZ2U+b3JnLmFwYWNoZS5heGlzMjpheGlzMi1tYXItbWF2ZW4tcGx1Z2luOm1hcjwvcGFja2FnZT4KLSAgICAgICAgICAgICAgPGluc3RhbGw+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zOm1hdmVuLWluc3RhbGwtcGx1Z2luOmluc3RhbGw8L2luc3RhbGw+Ci0gICAgICAgICAgICAgIDxkZXBsb3k+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zOm1hdmVuLWRlcGxveS1wbHVnaW46ZGVwbG95PC9kZXBsb3k+Ci0gICAgICAgICAgICA8L3BoYXNlcz4KLSAgICAgICAgICA8L2xpZmVjeWNsZT4KLSAgICAgICAgPC9saWZlY3ljbGVzPgotICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgIDwvY29tcG9uZW50PgotICA8L2NvbXBvbmVudHM+Ci08L2NvbXBvbmVudC1zZXQ+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLW1hci1tYXZlbi1wbHVnaW4vc3JjL3NpdGUvYXB0L2NvbmZpZ3VyYXRpb24uYXB0IGIvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1tYXItbWF2ZW4tcGx1Z2luL3NyYy9zaXRlL2FwdC9jb25maWd1cmF0aW9uLmFwdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVkMjAwNS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLW1hci1tYXZlbi1wbHVnaW4vc3JjL3NpdGUvYXB0L2NvbmZpZ3VyYXRpb24uYXB0CisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLUNvbmZpZ3VyYXRpb24NCi0NCi0gIEFsbCBNYXIgcGx1Z2luIGdvYWxzIHRha2VzIHRoZSBmb2xsb3dpbmcgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGFzIGlucHV0Og0KLQ0KLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rDQotfCBQYXJhbWV0ZXIgbmFtZSAgICAgIHwgRGVmYXVsdCB2YWx1ZSAgICAgICAgICAgICAgICAgICAgfCBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KLXwgbWFyRGlyZWN0b3J5ICAgICAgICB8ICR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L21hciAgIHwgRGlyZWN0b3J5IHdoZXJlIHRoZSBtYXIgZmlsZSBpcyBidWlsdC4gICAgICAgICB8DQotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCi18IGNsYXNzZXNEaXJlY3RvcnkgICAgfCAke3Byb2plY3QuYnVpbGQub3V0cHV0RGlyZWN0b3J5fSB8IERpcmVjdG9yeSB3aXRoIGNvbXBpbGVkIGNsYXNzZXMgYW5kIHJlc291cmNlcy4gfA0KLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rDQotfCBmaWxlU2V0cyAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBBZGRpdGlvbmFsIGZpbGUgc2V0cywgd2hpY2ggYXJlIGJlaW5nIGFkZGVkIHRvIHwNCi18ICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRoZSBhcmNoaXZlLiBTZWUgIkZpbGUgU2V0cyIgYmVsb3cgZm9yIGFuICAgICAgfA0KLXwgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZXhhbXBsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCi18IG1vZHVsZVhtbEZpbGUgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IExvY2F0aW9uIG9mIHRoZSBtb2R1bGUueG1sIGZpbGUuIEJ5IGRlZmF1bHQsICAgfA0KLXwgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaXQgaXMgYXNzdW1lZCB0aGF0IHRoZSBmaWxlIGlzIGFscmVhZHkgcHJlc2VudCB8DQotfCAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBpbiBjbGFzc2VzRGlyZWN0b3J5L01FVEEtSU5GIGFuZCBubyBzcGVjaWFsICAgIHwNCi18ICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHByb2Nlc3NpbmcgaXMgcmVxdWlyZWQuICAgICAgICAgICAgICAgICAgICAgICAgfA0KLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rDQotfCBpbmNsdWRlRGVwZW5kZW5jaWVzIHwgdHJ1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBXaGV0aGVyIHRvIGluY2x1ZGUgdGhlIHByb2plY3QgZGVwZW5kZW5jaWVzIGluIHwNCi18ICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRoZSBnZW5lcmF0ZWQgbWFyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rDQotDQotDQotVGhlIG1hciBnb2FsDQotDQotICBUaGUgbWFyIGdvYWwgYWxsb3dzIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBwYXJhbWV0ZXJzOg0KLQ0KLSotLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rDQotfCBQYXJhbWV0ZXIgbmFtZSAgIHwgRGVmYXVsdCB2YWx1ZSAgICAgICAgICAgICAgfCBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCi0qLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KLXwgb3V0cHV0RGlyZWN0b3J5ICB8ICR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9IHwgRGlyZWN0b3J5IHdoZXJlIHRvIGdlbmVyYXRlIHRoZSBNQVIgZmlsZS4gICAgICB8DQotKi0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCi18IG1hck5hbWUgICAgICAgICAgfCAke3Byb2plY3QuYnVpbGQuZmluYWxOYW1lfSB8IFRoZSBnZW5lcmF0ZWQgTUFSIGZpbGVzIG5hbWUuICAgICAgICAgICAgICAgICAgfA0KLSotLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rDQotfCBhcmNoaXZlICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBBIE1hdmVuIGFyY2hpdmUgY29uZmlndXJhdGlvbi4gVGhpcyBhbGxvd3MsICAgIHwNCi18ICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGZvciBleGFtcGxlLCB0byBjb25maWd1cmUgdGhlIE1BTklGRVNULk1GICAgICAgfA0KLXwgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZmlsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQotKi0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCi18IGNsYXNzaWZpZXIgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEEgY2xhc3NpZmllciwgd2hpY2ggc2hvdWxkIGJlIGFkZGVkIHRvIHRoZSAgICAgfA0KLXwgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZ2VuZXJhdGVkIE1BUiBmaWxlcyBuYW1lLiBTZXR0aW5nIHRoaXMgICAgICAgICB8DQotfCAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYXJhbWV0ZXIgaGFzIHRoZSBzaWRlIGVmZmVjdCwgdGhhdCB0aGUgICAgICAgIHwNCi18ICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGFydGlmYWN0IGlzIHRyZWF0ZWQgYXMgYW4gYXR0YWNobWVudCBhbmQgbm90ICAgfA0KLXwgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYXMgdGhlIHByb2plY3RzIHByaW1hcnkgYXJ0aWZhY3QuICAgICAgICAgICAgICB8DQotKi0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCi18IHByaW1hcnlBcnRpZmFjdCAgfCB0cnVlICAgICAgICAgICAgICAgICAgICAgICB8IFNldHRpbmcgdGhpcyBwcm9wZXJ0eSB0byBmYWxzZSBkaXNhYmxlcyAgICAgICAgfA0KLXwgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaW5zdGFsbGF0aW9uIG9yIGRlcGxveW1lbnQgb2YgdGhlIGFydGlmYWN0IGFzICB8DQotfCAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0aGUgcHJvamVjdHMgcHJpbWFyeSBhcnRpZmFjdC4gICAgICAgICAgICAgICAgIHwNCi0qLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KLQ0KLQ0KLUZpbGUgU2V0cw0KLQ0KLSAgQWRkaXRpb25hbCBmaWxlIHNldHMgbWF5IGJlIGNvbmZpZ3VyZWQgZm9yIGluY2x1c2lvbiBpbnRvIHRoZSBNQVIgZmlsZS4gQSBmaWxlIHNldCBsb29rcw0KLSAgYXMgZm9sbG93czoNCi0NCi0tLS0tLS0tLS0tLS0tLS0tLQ0KLSAgPGZpbGVTZXRzPg0KLSAgICA8ZmlsZVNldD4NCi0gICAgICA8ZGlyZWN0b3J5PnNyYy9tYXIvZmlsZXM8L2RpcmVjdG9yeT4NCi0gICAgICA8b3V0cHV0RGlyZWN0b3J5Pk1FVEEtSU5GL2RvY3M8L291dHB1dERpcmVjdG9yeT4NCi0gICAgICA8aW5jbHVkZXM+DQotICAgICAgICA8aW5jbHVkZT4qKi8qLmh0bWw8L2luY2x1ZGU+DQotICAgICAgPC9pbmNsdWRlcz4NCi0gICAgPC9maWxlU2V0Pg0KLSAgICA8ZmlsZVNldD4NCi0gICAgICA8ZGlyZWN0b3J5PnNyYy9tYXIvZmlsZXM8L2RpcmVjdG9yeT4NCi0gICAgICA8b3V0cHV0RGlyZWN0b3J5Pk1FVEEtSU5GL2V0Yzwvb3V0cHV0RGlyZWN0b3J5Pg0KLSAgICAgIDxleGNsdWRlcz4NCi0gICAgICAgIDxleGNsdWRlPioqLyouaHRtbDwvZXhjbHVkZT4NCi0gICAgICA8L2V4Y2x1ZGVzPg0KLSAgICA8L2ZpbGVTZXQ+DQotICA8L2ZpbGVTZXRzPg0KLS0tLS0tLS0tLS0tLS0tLS0tDQotDQotICBUaGUgZXhhbXBsZSBzcGVjaWZpZXMsIHRoYXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBkaXJlY3Rvcnkgc3JjL21hci9maWxlcyBzaGFsbA0KLSAgYmUgYWRkZWQgdG8gdGhlIE1BUiBmaWxlLiBIVE1MIGZpbGVzIHdpbGwgZ28gaW50byBNRVRBLUlORi9kb2NzLCBhbGwgb3RoZXINCi0gIGZpbGVzIHRvIE1FVEEtSU5GL2V0Yy4NCi0NCi0gIEEgZmlsZSBzZXQgaXMgY29uZmlndXJlZCB0aHJvdWdoIHRoZSBmb2xsb3dpbmcgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzOg0KLQ0KLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCi18IFBhcmFtZXRlciBuYW1lICAgICAgfCBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KLXwgZGlyZWN0b3J5ICAgICAgICAgICB8IFRoZSBkaXJlY3RvcnksIGZyb20gd2hpY2ggdG8gcmVhZCB0aGUgZmlsZSBzZXQuIFRoaXMgcGFyYW1ldGVyIGlzIHwNCi18ICAgICAgICAgICAgICAgICAgICAgfCByZXF1aXJlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KLXwgb3V0cHV0RGlyZWN0b3J5ICAgICB8IFRoZSB0YXJnZXQgZGlyZWN0b3J5IHdpdGhpbiB0aGUgTUFSIGZpbGUuIERlZmF1bHRzIHRvIHRoZSBNQVIgICAgIHwNCi18ICAgICAgICAgICAgICAgICAgICAgfCBmaWxlcyByb290IGRpcmVjdG9yeS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KLXwgaW5jbHVkZXMgICAgICAgICAgICB8IENvbmZpZ3VyZXMgdGhlIHNldCBvZiBmaWxlcywgd2hpY2ggc2hhbGwgYmUgaW5jbHVkZWQgaW50byB0aGUgTUFSIHwNCi18ICAgICAgICAgICAgICAgICAgICAgfCBmaWxlLiBEZWZhdWx0cyB0byAqKi8qLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KLXwgZXhjbHVkZXMgICAgICAgICAgICB8IENvbmZpZ3VyZXMgYSBzZXQgb2YgZmlsZXMsIHdoaWNoIHNoYWxsIGJlIGV4Y2x1ZGVkIGZyb20gdGhlIGZpbGUgIHwNCi18ICAgICAgICAgICAgICAgICAgICAgfCBzZXQuIERlZmF1bHRzIHRvIHRoZSBNYXZlbiBkZWZhdWx0IGV4Y2x1ZGVzICgqKi8qfiwgKiovY3ZzLyoqLyosICB8DQotfCAgICAgICAgICAgICAgICAgICAgIHwgKiovLnN2bi8qKi8qLCBldGMuKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCi18IHNraXBEZWZhdWx0RXhjbHVkZXMgfCBJZiB0aGlzIHBhcmFtZXRlciBpcyBzZXQgdG8gdHJ1ZSwgdGhlbiBubyBkZWZhdWx0IGV4Y2x1ZGVzIGFyZSAgICB8DQotfCAgICAgICAgICAgICAgICAgICAgIHwgYmVpbmcgdXNlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLW1hci1tYXZlbi1wbHVnaW4vc3JjL3NpdGUvYXB0L2hvd3RvLmFwdCBiL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItbWFyLW1hdmVuLXBsdWdpbi9zcmMvc2l0ZS9hcHQvaG93dG8uYXB0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzk4MzNhLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItbWFyLW1hdmVuLXBsdWdpbi9zcmMvc2l0ZS9hcHQvaG93dG8uYXB0CisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotIC0tLS0tLQ0KLSBNYXZlbiAyIE1hciBQbHVnaW46IGNvbmZpZ3VyYXRpb24gZXhhbXBsZXMNCi0gLS0tLS0tDQotIEpvY2hlbiBXaWVkbWFubiANCi0gPGpvY2hlbi53aWVkbWFubkBnbWFpbC5jb20+DQotIC0tLS0tLQ0KLQ0KLUdvYWxzDQotDQotICBUaGUgTWFyIHBsdWdpbiBhbGxvd3MgdGhlIHBhY2thZ2luZyBvZiBhbiBBeGlzIDIgc2VydmljZSBtYXIgaW4gMyBkaWZmZXJlbnQgbW9kZXM6DQotDQotICAgKiBtYXIgKGRlZmF1bHQpOiBnZW5lcmF0ZXMgdGhlIG1hciBhcnRpZmFjdA0KLQ0KLSAgICogaW5wbGFjZTogcGFja2FnZSB0aGUgbWFyIGluIHRoZSBzb3VyY2UgdHJlZQ0KLQ0KLSAgICogZXhwbG9kZWQgOiBwYWNrYWdlIGFuIGV4cGxvZGVkIG1hciBhcHBsaWNhdGlvbg0KLQ0KLSAgRWFjaCBtb2RlIGlzIG1hdGVyaWFsaXplZCBieSBhIGdvYWwuIEZvciBpbnN0YW5jZSwgdG8gZ2VuZXJhdGUgYW4gZXhwbG9kZWQNCi0gIG1hciBmcm9tIHRoZSBjdXJyZW50IHByb2plY3QsIG9uZSB3b3VsZCB0eXBlDQotDQotKy0tLS0tLS0tDQotICBtdm4gbWFyOmV4cGxvZGVkDQotKy0tLS0tLS0tLQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItbWFyLW1hdmVuLXBsdWdpbi9zcmMvc2l0ZS9hcHQvaW50cm9kdWN0aW9uLmFwdCBiL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItbWFyLW1hdmVuLXBsdWdpbi9zcmMvc2l0ZS9hcHQvaW50cm9kdWN0aW9uLmFwdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjU0MjBhZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLW1hci1tYXZlbi1wbHVnaW4vc3JjL3NpdGUvYXB0L2ludHJvZHVjdGlvbi5hcHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0gLS0tLS0tDQotIE1hdmVuIDIgQWFyIFBsdWdpbg0KLSAtLS0tLS0NCi0gSm9jaGVuIFdpZWRtYW5uDQotIDxqb2NoZW4ud2llZG1hbm5AZ21haWwuY29tPg0KLSAtLS0tLS0NCi0NCi1JbnRyb2R1Y3Rpb24NCi0NCi0gIFRoaXMgcGx1Z2luIGdlbmVyYXRlcyBhbiBBeGlzIDIgc2VydmljZSBmaWxlIChBQVIgZmlsZSkuDQotDQotICBUaGUgZnVsbCBkZXNjcmlwdGlvbiBvZiBnb2FscyBpcyBhdmFpbGFibGUge3t7aG93dG8uaHRtbH1oZXJlfX0uDQotDQotDQotDQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1tYXItbWF2ZW4tcGx1Z2luL3NyYy9zaXRlL3NpdGUueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi1tYXItbWF2ZW4tcGx1Z2luL3NyYy9zaXRlL3NpdGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGU2Nzc4Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItbWFyLW1hdmVuLXBsdWdpbi9zcmMvc2l0ZS9zaXRlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08cHJvamVjdCBuYW1lPSJNYXZlbiBBeGlzIDIgTUFSIFBsdWdpbiI+Ci0gIDxiYW5uZXJMZWZ0PgotICAgIDxuYW1lPk1hdmVuIEF4aXMgMiBNQVIgUGx1Z2luPC9uYW1lPgotICAgIDxzcmM+aHR0cDovL21hdmVuLmFwYWNoZS5vcmcvaW1hZ2VzL2FwYWNoZS1tYXZlbi1wcm9qZWN0LnBuZzwvc3JjPgotICAgIDxocmVmPmh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnLzwvaHJlZj4KLSAgPC9iYW5uZXJMZWZ0PgotICA8YmFubmVyUmlnaHQ+Ci0gICAgPHNyYz5odHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9pbWFnZXMvbWF2ZW4tc21hbGwuZ2lmPC9zcmM+Ci0gIDwvYmFubmVyUmlnaHQ+Ci0gIDxib2R5PgotICAgIDxsaW5rcz4KLSAgICAgIDxpdGVtIG5hbWU9IkFwYWNoZSIgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnLyIvPgotICAgICAgPGl0ZW0gbmFtZT0iV2Vic2VydmljZXMiIGhyZWY9Imh0dHA6Ly93cy5hcGFjaGUub3JnLyIvPgotICAgICAgPGl0ZW0gbmFtZT0iQXhpcyAyIiBocmVmPSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi8iLz4KLSAgICAgIDxpdGVtIG5hbWU9Ik1hdmVuIDIiIGhyZWY9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuMi8iLz4KLSAgICA8L2xpbmtzPgotCi0gICAgPG1lbnUgbmFtZT0iT3ZlcnZpZXciPgotICAgICAgPGl0ZW0gbmFtZT0iSW50cm9kdWN0aW9uIiBocmVmPSJpbnRyb2R1Y3Rpb24uaHRtbCIvPgotICAgICAgPGl0ZW0gbmFtZT0iSG93IHRvIFVzZSIgaHJlZj0iaG93dG8uaHRtbCIvPgotICAgICAgPGl0ZW0gbmFtZT0iQ29uZmlndXJhdGlvbiIgaHJlZj0iY29uZmlndXJhdGlvbi5odG1sIi8+Ci0gICAgPC9tZW51PgotICAgICR7cmVwb3J0c30KLSAgPC9ib2R5PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi13c2RsMmNvZGUtbWF2ZW4tcGx1Z2luL3BvbS54bWwgYi92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLXdzZGwyY29kZS1tYXZlbi1wbHVnaW4vcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NiZmI4ZC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLXdzZGwyY29kZS1tYXZlbi1wbHVnaW4vcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItcGFyZW50PC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4xLjUuMTwvdmVyc2lvbj4KLSAgICAgICAgPHJlbGF0aXZlUGF0aD4uLi8uLi9wYXJlbnQvcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgotICAgIDwvcGFyZW50PgotICAgIDxhcnRpZmFjdElkPmF4aXMyLXdzZGwyY29kZS1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgPG5hbWU+QXBhY2hlIEF4aXMyIC0gdG9vbCAtIFdTREwyQ29kZSBNYXZlbiBQbHVnaW48L25hbWU+Ci0gICAgPHBhY2thZ2luZz5tYXZlbi1wbHVnaW48L3BhY2thZ2luZz4KLSAgICA8ZGVzY3JpcHRpb24+VGhlIEF4aXMgMiBQbHVnaW4gZm9yIE1hdmVuIGFsbG93cyBjbGllbnQgc2lkZSBhbmQgc2VydmVyIHNpZGUgc291cmNlcyBmcm9tIGEgV1NETC48L2Rlc2NyaXB0aW9uPgotICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXBsdWdpbi1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXJ0aWZhY3Q8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcHJvamVjdDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1jb2RlZ2VuPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHt2ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1rZXJuZWw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3ZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLWFkYjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7dmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItYWRiLWNvZGVnZW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3ZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLWphdmEyd3NkbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7dmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczIteG1sYmVhbnM8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3ZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnNoYXJlZDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXBsdWdpbi10ZXN0aW5nLWhhcm5lc3M8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMucGxleHVzPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+cGxleHVzLXV0aWxzPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPC9kZXBlbmRlbmNpZXM+Ci0gICAgPGJ1aWxkPgotICAgICAgICA8cmVzb3VyY2VzPgotICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+Li4vLi4vLi48L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPk5PVElDRS50eHQ8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPkxJQ0VOU0UudHh0PC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgPGZpbHRlcmluZz5mYWxzZTwvZmlsdGVyaW5nPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgPC9yZXNvdXJjZXM+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxza2lwPmZhbHNlPC9za2lwPgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgPC9idWlsZD4KLSAgICA8ZGlzdHJpYnV0aW9uTWFuYWdlbWVudD4KLSAgICAgICAgPHJlcG9zaXRvcnk+Ci0gICAgICAgICAgICA8aWQ+YXBhY2hlLXJlcG88L2lkPgotICAgICAgICAgICAgPG5hbWU+TWF2ZW4gQ2VudHJhbCBSZXBvc2l0b3J5PC9uYW1lPgotICAgICAgICAgICAgPHVybD5zY3BleGU6Ly9wZW9wbGUuYXBhY2hlLm9yZy8vd3d3L3Blb3BsZS5hcGFjaGUub3JnL3JlcG8vbTItaWJpYmxpby1yc3luYy1yZXBvc2l0b3J5PC91cmw+Ci0gICAgICAgIDwvcmVwb3NpdG9yeT4KLSAgICAgICAgPHNuYXBzaG90UmVwb3NpdG9yeT4KLSAgICAgICAgICAgIDxpZD5hcGFjaGUtc25hcHNob3RzPC9pZD4KLSAgICAgICAgICAgIDxuYW1lPkFwYWNoZSBEZXZlbG9wbWVudCBSZXBvc2l0b3J5PC9uYW1lPgotICAgICAgICAgICAgPHVybD5zY3BleGU6Ly9wZW9wbGUuYXBhY2hlLm9yZy8vd3d3L3Blb3BsZS5hcGFjaGUub3JnL3JlcG8vbTItc25hcHNob3QtcmVwb3NpdG9yeTwvdXJsPgotICAgICAgICA8L3NuYXBzaG90UmVwb3NpdG9yeT4KLSAgICA8L2Rpc3RyaWJ1dGlvbk1hbmFnZW1lbnQ+Ci0gICAgPHJlcG9ydGluZz4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qYXZhZG9jLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY2hhbmdlcy1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHJlcG9ydFNldHM+Ci0gICAgICAgICAgICAgICAgICAgIDxyZXBvcnRTZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cmVwb3J0cz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVwb3J0PmNoYW5nZXMtcmVwb3J0PC9yZXBvcnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3JlcG9ydHM+Ci0gICAgICAgICAgICAgICAgICAgIDwvcmVwb3J0U2V0PgotICAgICAgICAgICAgICAgIDwvcmVwb3J0U2V0cz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgPC9yZXBvcnRpbmc+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLXdzZGwyY29kZS1tYXZlbi1wbHVnaW4vc3JjL2NoYW5nZXMvY2hhbmdlcy54bWwgYi92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLXdzZGwyY29kZS1tYXZlbi1wbHVnaW4vc3JjL2NoYW5nZXMvY2hhbmdlcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwNjdiZDMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi13c2RsMmNvZGUtbWF2ZW4tcGx1Z2luL3NyYy9jaGFuZ2VzL2NoYW5nZXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08ZG9jdW1lbnQ+Ci0gIDxwcm9wZXJ0aWVzPgotICAgIDx0aXRsZT5DaGFuZ2VzIGluIHRoZSBBeGlzMiBXU0RMMkNvZGUgcGx1Z2luIGZvciBNYXZlbiAyPC90aXRsZT4KLSAgPC9wcm9wZXJ0aWVzPgotICA8Ym9keT4KLSAgICA8cmVsZWFzZSB2ZXJzaW9uPSIxLjEtU05BUFNIT1QiIGRhdGU9Ik5vdCB5ZXQgcmVsZWFzZWQiPgotICAgICAgPGFjdGlvbiBkZXY9ImpvY2hlbiIgdHlwZT0iYWRkIj4KLSAgICAgICAgQWRkZWQgdXNlciBkb2N1bWVudGF0aW9uLgotICAgICAgPC9hY3Rpb24+Ci0gICAgPC9yZWxlYXNlPgotICAgIDxyZWxlYXNlIHZlcnNpb249IjEuMC1TTkFQU0hPVCIgZGF0ZT0iTm90IHlldCByZWxlYXNlZCI+Ci0gICAgICA8YWN0aW9uIGRldj0iam9jaGVuIiB0eXBlPSJhZGQiPgotICAgICAgICBJbml0aWFsIHZlcnNpb24uIE5ldmVyIGFjdHVhbGx5IHB1Ymxpc2hlZC4KLSAgICAgIDwvYWN0aW9uPgotICAgIDwvcmVsZWFzZT4KLSAgPC9ib2R5PgotPC9kb2N1bWVudD4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItd3NkbDJjb2RlLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvbWF2ZW4yL3dzZGwyY29kZS9OYW1lc3BhY2VVUklNYXBwaW5nLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLXdzZGwyY29kZS1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL21hdmVuMi93c2RsMmNvZGUvTmFtZXNwYWNlVVJJTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDQ0YjA3Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItd3NkbDJjb2RlLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvbWF2ZW4yL3dzZGwyY29kZS9OYW1lc3BhY2VVUklNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIubWF2ZW4yLndzZGwyY29kZTsKLQotLyoqIERhdGEgY2xhc3MgZm9yIHNwZWNpZnlpbmcgVVJJLT5QYWNrYWdlIG1hcHBpbmdzLiAqLwotcHVibGljIGNsYXNzIE5hbWVzcGFjZVVSSU1hcHBpbmcgewotICAgIHByaXZhdGUgU3RyaW5nIHVyaSwgcGFja2FnZU5hbWU7Ci0KLSAgICAvKiogUmV0dXJucyB0aGUgcGFja2FnZSBuYW1lLCB0byB3aGljaCB0aGUgVVJJIHNoYWxsIGJlIG1hcHBlZC4gKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkgewotICAgICAgICByZXR1cm4gcGFja2FnZU5hbWU7Ci0gICAgfQotCi0gICAgLyoqIFNldHMgdGhlIHBhY2thZ2UgbmFtZSwgdG8gd2hpY2ggdGhlIFVSSSBzaGFsbCBiZSBtYXBwZWQuICovCi0gICAgcHVibGljIHZvaWQgc2V0UGFja2FnZU5hbWUoU3RyaW5nIHBQYWNrYWdlTmFtZSkgewotICAgICAgICBwYWNrYWdlTmFtZSA9IHBQYWNrYWdlTmFtZTsKLSAgICB9Ci0KLSAgICAvKiogUmV0dXJucyB0aGUgVVJJLCB3aGljaCBzaGFsbCBiZSBtYXBwZWQuICovCi0gICAgcHVibGljIFN0cmluZyBnZXRVcmkoKSB7Ci0gICAgICAgIHJldHVybiB1cmk7Ci0gICAgfQotCi0gICAgLyoqIFNldHMgdGhlIFVSSSwgd2hpY2ggc2hhbGwgYmUgbWFwcGVkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFVyaShTdHJpbmcgcFVyaSkgewotICAgICAgICB1cmkgPSBwVXJpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItd3NkbDJjb2RlLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvbWF2ZW4yL3dzZGwyY29kZS9XU0RMMkNvZGVNb2pvLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLXdzZGwyY29kZS1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL21hdmVuMi93c2RsMmNvZGUvV1NETDJDb2RlTW9qby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmNiMDJkLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItd3NkbDJjb2RlLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvbWF2ZW4yL3dzZGwyY29kZS9XU0RMMkNvZGVNb2pvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OTQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLm1hdmVuMi53c2RsMmNvZGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuQ29tbWFuZExpbmVPcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLkNvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5Db21tYW5kTGluZU9wdGlvblBhcnNlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5Db2RlR2VuZXJhdGlvbkVuZ2luZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5Db2RlR2VuZXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LkFydGlmYWN0OwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLkFic3RyYWN0TW9qbzsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5Nb2pvRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLk1vam9GYWlsdXJlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucHJvamVjdC5NYXZlblByb2plY3Q7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci0KLQotLyoqCi0gKiBAZGVzY3JpcHRpb24gQSBNb2pvIGZvciBnZW5lcmF0aW5nIEphdmEgc291cmNlcyBmcm9tIGEgV1NETC4KLSAqIEBnb2FsIHdzZGwyY29kZQotICogQHBoYXNlIGdlbmVyYXRlLXNvdXJjZXMKLSAqIEByZXF1aXJlc0RlcGVuZGVuY3lSZXNvbHV0aW9uIHRlc3QKLSAqLwotcHVibGljIGNsYXNzIFdTREwyQ29kZU1vam8gZXh0ZW5kcyBBYnN0cmFjdE1vam8gewotICAgIC8qKgotICAgICAqIFRoZSBtYXZlbiBwcm9qZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke3Byb2plY3R9IgotICAgICAqIEByZWFkLW9ubHkKLSAgICAgKiBAcmVxdWlyZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIE1hdmVuUHJvamVjdCBwcm9qZWN0OwotCi0gICAgLyoqCi0gICAgICogVGhlIFdTREwgZmlsZSwgd2hpY2ggaXMgYmVpbmcgcmVhZC4KLSAgICAgKgotICAgICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtheGlzMi53c2RsMmNvZGUud3NkbEZpbGV9IiBkZWZhdWx0LXZhbHVlPSJzcmMvbWFpbi9heGlzMi9zZXJ2aWNlLndzZGwiCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgd3NkbEZpbGU7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgb3V0cHV0IGRpcmVjdG9yeSwgd2hlcmUgdGhlIGdlbmVyYXRlZCBzb3VyY2VzIGFyZSBiZWluZyBjcmVhdGVkLgotICAgICAqCi0gICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke2F4aXMyLndzZGwyY29kZS50YXJnZXR9IiBkZWZhdWx0LXZhbHVlPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9nZW5lcmF0ZWQtc291cmNlcy9heGlzMi93c2RsMmNvZGUiCi0gICAgICovCi0gICAgcHJpdmF0ZSBGaWxlIG91dHB1dERpcmVjdG9yeTsKLQotICAgIC8qKgotICAgICAqIFBhY2thZ2UgbmFtZSBvZiB0aGUgZ2VuZXJhdGVkIHNvdXJjZXM7IHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgYSBwYWNrYWdlIHN0cnVjdHVyZSBiZWxvdyB0aGUKLSAgICAgKiBvdXRwdXQgZGlyZWN0b3J5LgotICAgICAqCi0gICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke2F4aXMyLndzZGwyY29kZS5wYWNrYWdlfSIKLSAgICAgKiBAcmVxdWlyZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBwYWNrYWdlTmFtZTsKLQotICAgIC8qKgotICAgICAqIFRoZSBwcm9ncmFtbWluZyBsYW5ndWFnZSBvZiB0aGUgZ2VuZXJhdGVkIHNvdXJjZXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7YXhpczIud3NkbDJjb2RlLmxhbmd1YWdlfSIgZGVmYXVsdC12YWx1ZT0iamF2YSIKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBsYW5ndWFnZTsKLQotICAgIC8qKgotICAgICAqIFRoZSBkYXRhYmluZGluZyBmcmFtZXdvcmssIHdoaWNoIGlzIGJlaW5nIHVzZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7YXhpczIud3NkbDJjb2RlLmRhdGFiaW5kaW5nTmFtZX0iIGRlZmF1bHQtdmFsdWU9ImFkYiIKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBkYXRhYmluZGluZ05hbWU7Ci0KLSAgICAvKioKLSAgICAgKiBQb3J0IG5hbWUsIGZvciB3aGljaCB0byBnZW5lcmF0ZSBzb3VyY2VzLiBCeSBkZWZhdWx0LCBzb3VyY2VzIHdpbGwgYmUgZ2VuZXJhdGVkIGZvciBhbGwKLSAgICAgKiBwb3J0cy4KLSAgICAgKgotICAgICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtheGlzMi53c2RsMmNvZGUucG9ydE5hbWV9IgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIHBvcnROYW1lOwotCi0gICAgLyoqCi0gICAgICogU2VydmljZSBuYW1lLCBmb3Igd2hpY2ggdG8gZ2VuZXJhdGUgc291cmNlcy4gQnkgZGVmYXVsdCwgc291cmNlcyB3aWxsIGJlIGdlbmVyYXRlZCBmb3IgYWxsCi0gICAgICogc2VydmljZXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7YXhpczIud3NkbDJjb2RlLnNlcnZpY2VOYW1lfSIKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBzZXJ2aWNlTmFtZTsKLQotICAgIC8qKgotICAgICAqIE1vZGUsIGZvciB3aGljaCBzb3VyY2VzIGFyZSBiZWluZyBnZW5lcmF0ZWQ7IGVpdGhlciBvZiAic3luYyIsICJhc3luYyIgb3IgImJvdGgiLgotICAgICAqCi0gICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke2F4aXMyLndzZGwyY29kZS5zeW5jTW9kZX0iIGRlZmF1bHQtdmFsdWU9ImJvdGgiCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgc3luY01vZGU7Ci0KLSAgICAvKioKLSAgICAgKiBXaGV0aGVyIHNlcnZlciBzaWRlIHNvdXJjZXMgYXJlIGJlaW5nIGdlbmVyYXRlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtheGlzMi53c2RsMmNvZGUuZ2VuZXJhdGVTZXJ2ZXJTaWRlfSIgZGVmYXVsdC12YWx1ZT0iZmFsc2UiCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGdlbmVyYXRlU2VydmVyU2lkZTsKLQotICAgIC8qKgotICAgICAqIFdoZXRoZXIgdG8gZ2VuZXJhdGUgc291cmNlcyBmb3IgYSB0ZXN0IGNhc2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7YXhpczIud3NkbDJjb2RlLmdlbmVyYXRlVGVzdENhc2V9IiBkZWZhdWx0LXZhbHVlPSJmYWxzZSIKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gZ2VuZXJhdGVUZXN0Y2FzZTsKLQotICAgIC8qKgotICAgICAqIFdoZXRoZXIgdG8gZ2VuZXJhdGUgYSAic2VydmljZXMueG1sIiBmaWxlLgotICAgICAqCi0gICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke2F4aXMyLndzZGwyY29kZS5nZW5lcmF0ZVNlcnZpY2VzWG1sfSIgZGVmYXVsdC12YWx1ZT0iZmFsc2UiCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGdlbmVyYXRlU2VydmljZXNYbWw7Ci0KLSAgICAvKioKLSAgICAgKiBXaGV0aGVyIHRvIGdlbmVyYXRlIHNpbXBseSBhbGwgY2xhc3Nlcy4gVGhpcyBpcyBvbmx5IHZhbGlkIGluIGNvbmp1bmN0aW9uIHdpdGgKLSAgICAgKiAiZ2VuZXJhdGVTZXJ2ZXJTaWRlIi4KLSAgICAgKgotICAgICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtheGlzMi53c2RsMmNvZGUuZ2VuZXJhdGVBbGxDbGFzc2VzfSIgZGVmYXVsdC12YWx1ZT0iZmFsc2UiCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGdlbmVyYXRlQWxsQ2xhc3NlczsKLQotICAgIC8qKgotICAgICAqIFdoZXRoZXIgdG8gdW5wYWNrIGNsYXNzZXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7YXhpczIud3NkbDJjb2RlLnVucGFja0NsYXNzZXN9IiBkZWZhdWx0LXZhbHVlPSJmYWxzZSIKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gdW5wYWNrQ2xhc3NlczsKLQotICAgIC8qKgotICAgICAqIFdoZXRoZXIgdG8gZ2VuZXJhdGUgdGhlIHNlcnZlciBzaWRlIGludGVyZmFjZS4KLSAgICAgKgotICAgICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtheGlzMi53c2RsMmNvZGUuZ2VuZXJhdGVTZXJ2ZXJTaWRlSW50ZXJmYWNlfSIgZGVmYXVsdC12YWx1ZT0iZmFsc2UiCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGdlbmVyYXRlU2VydmVyU2lkZUludGVyZmFjZSA9IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke2F4aXMyLndzZGwyY29kZS5yZXBvc2l0b3J5UGF0aH0iCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgcmVwb3NpdG9yeVBhdGggPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke2F4aXMyLndzZGwyY29kZS5leHRlcm5hbE1hcHBpbmd9IgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGV4dGVybmFsTWFwcGluZyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7YXhpczIud3NkbDJjb2RlLndzZGxWZXJzaW9ufSIKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyB3c2RsVmVyc2lvbiA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7YXhpczIud3NkbDJjb2RlLnRhcmdldFNvdXJjZUZvbGRlckxvY2F0aW9ufSIKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyB0YXJnZXRTb3VyY2VGb2xkZXJMb2NhdGlvbiA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7YXhpczIud3NkbDJjb2RlLnRhcmdldFJlc291cmNlc0ZvbGRlckxvY2F0aW9ufSIKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyB0YXJnZXRSZXNvdXJjZXNGb2xkZXJMb2NhdGlvbiA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7YXhpczIud3NkbDJjb2RlLnVud3JhcH0iIGRlZmF1bHQtdmFsdWU9ImZhbHNlIiAqCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIHVud3JhcCA9IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke2F4aXMyLndzZGwyY29kZS5hbGxQb3J0c30iIGRlZmF1bHQtdmFsdWU9ImZhbHNlIiAqCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGFsbFBvcnRzID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7YXhpczIud3NkbDJjb2RlLmJhY2t3YXJkQ29tcGF0aWJsZX0iIGRlZmF1bHQtdmFsdWU9ImZhbHNlIiAqCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGJhY2t3YXJkQ29tcGF0aWJsZSA9IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke2F4aXMyLndzZGwyY29kZS5mbGF0dGVuRmlsZXN9IiBkZWZhdWx0LXZhbHVlPSJmYWxzZSIgKgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBmbGF0dGVuRmlsZXMgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtheGlzMi53c2RsMmNvZGUuc2tpcE1lc3NhZ2VSZWNlaXZlcn0iIGRlZmF1bHQtdmFsdWU9ImZhbHNlIiAqCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIHNraXBNZXNzYWdlUmVjZWl2ZXIgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtheGlzMi53c2RsMmNvZGUuc2tpcEJ1aWxkWE1MfSIgZGVmYXVsdC12YWx1ZT0iZmFsc2UiICoKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gc2tpcEJ1aWxkWE1MID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7YXhpczIud3NkbDJjb2RlLnNraXBXU0RMfSIgZGVmYXVsdC12YWx1ZT0iZmFsc2UiICoKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gc2tpcFdTREwgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtheGlzMi53c2RsMmNvZGUub3ZlcldyaXRlfSIgZGVmYXVsdC12YWx1ZT0iZmFsc2UiICoKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gb3ZlcldyaXRlID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7YXhpczIud3NkbDJjb2RlLnN1cHByZXNzUHJlZml4ZXN9IiBkZWZhdWx0LXZhbHVlPSJmYWxzZSIgKgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBzdXBwcmVzc1ByZWZpeGVzID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiBTcGVjaWZ5IGRhdGFiaW5kaW5nIHNwZWNpZmljIGV4dHJhIG9wdGlvbnMKLSAgICAgKgotICAgICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtheGlzMi5qYXZhMndzZGwub3B0aW9uc30iCi0gICAgICovCi0gICAgcHJpdmF0ZSBQcm9wZXJ0aWVzIG9wdGlvbnM7Ci0KLSAgICAvKiogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke2F4aXMyLndzZGwyY29kZS5uYW1lc3BhY2VUb1BhY2thZ2VzfSIgKi8KLSAgICBwcml2YXRlIFN0cmluZyBuYW1lc3BhY2VUb1BhY2thZ2VzID0gbnVsbDsKLQotICAgIC8qKiBAcGFyYW1ldGVyICovCi0gICAgcHJpdmF0ZSBOYW1lc3BhY2VVUklNYXBwaW5nW10gbmFtZXNwYWNlVVJJcyA9IG51bGw7Ci0KLSAgICAvKiogRmlsbHMgdGhlIG9wdGlvbiBtYXAuIFRoaXMgbWFwIGlzIHBhc3NlZCBvbnRvIHRoZSBjb2RlIGdlbmVyYXRpb24gQVBJIHRvIGdlbmVyYXRlIHRoZSBjb2RlLiAqLwotICAgIHByaXZhdGUgTWFwIGZpbGxPcHRpb25NYXAoKSB0aHJvd3MgTW9qb0ZhaWx1cmVFeGNlcHRpb24gewotICAgICAgICBNYXAgb3B0aW9uTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgICAgIC8vV1NETCBmaWxlIG5hbWUKLSAgICAgICAgb3B0aW9uTWFwLnB1dCgKLSAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuV1NETF9MT0NBVElPTl9VUklfT1BUSU9OLAotICAgICAgICAgICAgICAgIG5ldyBDb21tYW5kTGluZU9wdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5XU0RMX0xPQ0FUSU9OX1VSSV9PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRTdHJpbmdBcnJheSh3c2RsRmlsZSkpKTsKLSAgICAgICAgLy9vdXRwdXQgbG9jYXRpb24KLSAgICAgICAgb3B0aW9uTWFwLnB1dCgKLSAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuT1VUUFVUX0xPQ0FUSU9OX09QVElPTiwKLSAgICAgICAgICAgICAgICBuZXcgQ29tbWFuZExpbmVPcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuT1VUUFVUX0xPQ0FUSU9OX09QVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldFN0cmluZ0FycmF5KG91dHB1dERpcmVjdG9yeS5nZXRQYXRoKCkpKSk7Ci0gICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgICAgICAvLyBEYXRhYmluZGluZyB0eXBlCi0gICAgICAgIG9wdGlvbk1hcC5wdXQoCi0gICAgICAgICAgICAgICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLkRBVEFfQklORElOR19UWVBFX09QVElPTiwKLSAgICAgICAgICAgICAgICBuZXcgQ29tbWFuZExpbmVPcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuREFUQV9CSU5ESU5HX1RZUEVfT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U3RyaW5nQXJyYXkoZGF0YWJpbmRpbmdOYW1lKSkpOwotCi0gICAgICAgIGlmICgiYXN5bmMiLmVxdWFscyhzeW5jTW9kZSkpIHsKLSAgICAgICAgICAgIC8vIEFzeW5jIG9ubHkgb3B0aW9uIC0gZm9yY2luZyB0byBnZW5lcmF0ZSBhc3luYyBtZXRob2RzIG9ubHkKLSAgICAgICAgICAgIG9wdGlvbk1hcC5wdXQoCi0gICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5DT0RFR0VOX0FTWU5DX09OTFlfT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICBuZXcgQ29tbWFuZExpbmVPcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLkNPREVHRU5fQVNZTkNfT05MWV9PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1swXSkpOwotICAgICAgICB9IGVsc2UgaWYgKCJzeW5jIi5lcXVhbHMoc3luY01vZGUpKSB7Ci0gICAgICAgICAgICAvLyBTeW5jIG9ubHkgb3B0aW9uIC0gZm9yY2luZyB0byBnZW5lcmF0ZSBTeW5jIG1ldGhvZHMgb25seQotICAgICAgICAgICAgb3B0aW9uTWFwLnB1dCgKLSAgICAgICAgICAgICAgICAgICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLkNPREVHRU5fU1lOQ19PTkxZX09QVElPTiwKLSAgICAgICAgICAgICAgICAgICAgbmV3IENvbW1hbmRMaW5lT3B0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5DT0RFR0VOX1NZTkNfT05MWV9PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1swXSkpOwotICAgICAgICB9IGVsc2UgaWYgKCJib3RoIi5lcXVhbHMoc3luY01vZGUpKSB7Ci0gICAgICAgICAgICAvLyBEbyBub3RoaW5nCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTW9qb0ZhaWx1cmVFeGNlcHRpb24oIkludmFsaWQgc3luY01vZGU6ICIgKyBzeW5jTW9kZSArCi0gICAgICAgICAgICAgICAgICAgICIsIGV4cGVjdGVkIGVpdGhlciBvZiAnc3luYycsICdhc3luYycgb3IgJ2JvdGgnLiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy9QYWNrYWdlCi0gICAgICAgIG9wdGlvbk1hcC5wdXQoCi0gICAgICAgICAgICAgICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLlBBQ0tBR0VfT1BUSU9OLAotICAgICAgICAgICAgICAgIG5ldyBDb21tYW5kTGluZU9wdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5QQUNLQUdFX09QVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldFN0cmluZ0FycmF5KHBhY2thZ2VOYW1lKSkpOwotCi0gICAgICAgIC8vc3R1YiBsYW5ndWFnZQotICAgICAgICBvcHRpb25NYXAucHV0KAotICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5TVFVCX0xBTkdVQUdFX09QVElPTiwKLSAgICAgICAgICAgICAgICBuZXcgQ29tbWFuZExpbmVPcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuU1RVQl9MQU5HVUFHRV9PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRTdHJpbmdBcnJheShsYW5ndWFnZSkpKTsKLQotICAgICAgICAvL3NlcnZlciBzaWRlIGFuZCBnZW5lcmF0ZSBzZXJ2aWNlcy54bWwgb3B0aW9ucwotICAgICAgICBpZiAoZ2VuZXJhdGVTZXJ2ZXJTaWRlKSB7Ci0gICAgICAgICAgICBvcHRpb25NYXAucHV0KAotICAgICAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuU0VSVkVSX1NJREVfQ09ERV9PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgIG5ldyBDb21tYW5kTGluZU9wdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuU0VSVkVSX1NJREVfQ09ERV9PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1swXSkpOwotCi0gICAgICAgICAgICAvL3NlcnZpY2VzIFhNTCBnZW5lcmF0aW9uIC0gZWZmZWN0aXZlIG9ubHkgd2hlbiBzcGVjaWZpZWQgYXMgdGhlIHNlcnZlciBzaWRlCi0gICAgICAgICAgICBpZiAoZ2VuZXJhdGVTZXJ2aWNlc1htbCkgewotICAgICAgICAgICAgICAgIG9wdGlvbk1hcC5wdXQoCi0gICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkdFTkVSQVRFX1NFUlZJQ0VfREVTQ1JJUFRJT05fT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENvbW1hbmRMaW5lT3B0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuR0VORVJBVEVfU0VSVklDRV9ERVNDUklQVElPTl9PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbMF0pKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vZ2VuZXJhdGUgYWxsIG9wdGlvbiAtIE9ubHkgdmFsaWQgd2hlbiBnZW5lcmF0aW5nIHNlcnZlcnNpZGUgY29kZQotICAgICAgICAgICAgaWYgKGdlbmVyYXRlQWxsQ2xhc3NlcykgewotICAgICAgICAgICAgICAgIG9wdGlvbk1hcC5wdXQoCi0gICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuR0VORVJBVEVfQUxMX09QVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDb21tYW5kTGluZU9wdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLkdFTkVSQVRFX0FMTF9PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbMF0pKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLSAgICAgICAgLy9nZW5lcmF0ZSB0aGUgdGVzdCBjYXNlCi0gICAgICAgIGlmIChnZW5lcmF0ZVRlc3RjYXNlKSB7Ci0gICAgICAgICAgICBvcHRpb25NYXAucHV0KAotICAgICAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuR0VORVJBVEVfVEVTVF9DQVNFX09QVElPTiwKLSAgICAgICAgICAgICAgICAgICAgbmV3IENvbW1hbmRMaW5lT3B0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5HRU5FUkFURV9URVNUX0NBU0VfT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbMF0pKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vVW53cmFwIGNsYXNzZXMgb3B0aW9uIC0gdGhpcyBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGdlbmVyYXRlZCBjbGFzc2VzIGFyZSBpbnNpZGUgdGhlIHN0dWIvTVIKLSAgICAgICAgLy9vciBnZXRzIGdlbmVyYXRlcyBhcyBzZXBlcmF0ZSBjbGFzc2VzCi0gICAgICAgIGlmICh1bnBhY2tDbGFzc2VzKSB7Ci0gICAgICAgICAgICBvcHRpb25NYXAucHV0KAotICAgICAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuVU5QQUNLX0NMQVNTRVNfT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICBuZXcgQ29tbWFuZExpbmVPcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLlVOUEFDS19DTEFTU0VTX09QVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nWzBdKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvL3NlcnZlciBzaWRlIGludGVyZmFjZSBvcHRpb24KLSAgICAgICAgaWYgKGdlbmVyYXRlU2VydmVyU2lkZUludGVyZmFjZSkgewotICAgICAgICAgICAgb3B0aW9uTWFwLnB1dCgKLSAgICAgICAgICAgICAgICAgICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLlNFUlZFUl9TSURFX0lOVEVSRkFDRV9PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgIG5ldyBDb21tYW5kTGluZU9wdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuU0VSVkVSX1NJREVfSU5URVJGQUNFX09QVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nWzBdKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodW53cmFwKSB7Ci0gICAgICAgICAgICBvcHRpb25NYXAucHV0KAotICAgICAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuVU5XUkFQX1BBUkFNRVRFUlMsCi0gICAgICAgICAgICAgICAgICAgIG5ldyBDb21tYW5kTGluZU9wdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuVU5XUkFQX1BBUkFNRVRFUlMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1swXSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGFsbFBvcnRzKSB7Ci0gICAgICAgICAgICBvcHRpb25NYXAucHV0KAotICAgICAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuQWxsX1BPUlRTX09QVElPTiwKLSAgICAgICAgICAgICAgICAgICAgbmV3IENvbW1hbmRMaW5lT3B0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5BbGxfUE9SVFNfT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbMF0pKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChiYWNrd2FyZENvbXBhdGlibGUpIHsKLSAgICAgICAgICAgIG9wdGlvbk1hcC5wdXQoCi0gICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5CQUNLV09SRF9DT01QQVRJQklMSVRZX09QVElPTiwKLSAgICAgICAgICAgICAgICAgICAgbmV3IENvbW1hbmRMaW5lT3B0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5CQUNLV09SRF9DT01QQVRJQklMSVRZX09QVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nWzBdKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZmxhdHRlbkZpbGVzKSB7Ci0gICAgICAgICAgICBvcHRpb25NYXAucHV0KAotICAgICAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuRkxBVFRFTl9GSUxFU19PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgIG5ldyBDb21tYW5kTGluZU9wdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuRkxBVFRFTl9GSUxFU19PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1swXSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNraXBNZXNzYWdlUmVjZWl2ZXIpIHsKLSAgICAgICAgICAgIG9wdGlvbk1hcC5wdXQoCi0gICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5OT19NRVNTQUdFX1JFQ0VJVkVSX09QVElPTl9MT05HLAotICAgICAgICAgICAgICAgICAgICBuZXcgQ29tbWFuZExpbmVPcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLk5PX01FU1NBR0VfUkVDRUlWRVJfT1BUSU9OX0xPTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1swXSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNraXBCdWlsZFhNTCkgewotICAgICAgICAgICAgb3B0aW9uTWFwLnB1dCgKLSAgICAgICAgICAgICAgICAgICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLk5PX0JVSUxEX1hNTF9PUFRJT05fTE9ORywKLSAgICAgICAgICAgICAgICAgICAgbmV3IENvbW1hbmRMaW5lT3B0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5OT19CVUlMRF9YTUxfT1BUSU9OX0xPTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1swXSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNraXBXU0RMKSB7Ci0gICAgICAgICAgICBvcHRpb25NYXAucHV0KAotICAgICAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuTk9fV1NETFNfT1BUSU9OX0xPTkcsCi0gICAgICAgICAgICAgICAgICAgIG5ldyBDb21tYW5kTGluZU9wdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuTk9fV1NETFNfT1BUSU9OX0xPTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1swXSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG92ZXJXcml0ZSkgewotICAgICAgICAgICAgb3B0aW9uTWFwLnB1dCgKLSAgICAgICAgICAgICAgICAgICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLk9WRVJSSURFX09QVElPTiwKLSAgICAgICAgICAgICAgICAgICAgbmV3IENvbW1hbmRMaW5lT3B0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5PVkVSUklERV9PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1swXSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHN1cHByZXNzUHJlZml4ZXMpIHsKLSAgICAgICAgICAgIG9wdGlvbk1hcC5wdXQoCi0gICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5TVVBQUkVTU19QUkVGSVhFU19PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgIG5ldyBDb21tYW5kTGluZU9wdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuU1VQUFJFU1NfUFJFRklYRVNfT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbMF0pKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChyZXBvc2l0b3J5UGF0aCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBvcHRpb25NYXAucHV0KAotICAgICAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuUkVQT1NJVE9SWV9QQVRIX09QVElPTiwKLSAgICAgICAgICAgICAgICAgICAgbmV3IENvbW1hbmRMaW5lT3B0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5SRVBPU0lUT1JZX1BBVEhfT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXXtyZXBvc2l0b3J5UGF0aH0pKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChleHRlcm5hbE1hcHBpbmcgIT0gbnVsbCkgewotICAgICAgICAgICAgb3B0aW9uTWFwLnB1dCgKLSAgICAgICAgICAgICAgICAgICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLkVYVEVSTkFMX01BUFBJTkdfT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICBuZXcgQ29tbWFuZExpbmVPcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLkVYVEVSTkFMX01BUFBJTkdfT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXXtleHRlcm5hbE1hcHBpbmd9KSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAod3NkbFZlcnNpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgb3B0aW9uTWFwLnB1dCgKLSAgICAgICAgICAgICAgICAgICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLldTRExfVkVSU0lPTl9PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgIG5ldyBDb21tYW5kTGluZU9wdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuV1NETF9WRVJTSU9OX09QVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW117d3NkbFZlcnNpb259KSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodGFyZ2V0U291cmNlRm9sZGVyTG9jYXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgb3B0aW9uTWFwLnB1dCgKLSAgICAgICAgICAgICAgICAgICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLlNPVVJDRV9GT0xERVJfTkFNRV9PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgIG5ldyBDb21tYW5kTGluZU9wdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuU09VUkNFX0ZPTERFUl9OQU1FX09QVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW117dGFyZ2V0U291cmNlRm9sZGVyTG9jYXRpb259KSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodGFyZ2V0UmVzb3VyY2VzRm9sZGVyTG9jYXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgb3B0aW9uTWFwLnB1dCgKLSAgICAgICAgICAgICAgICAgICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLlJFU09VUkNFX0ZPTERFUl9PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgIG5ldyBDb21tYW5kTGluZU9wdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuUkVTT1VSQ0VfRk9MREVSX09QVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW117dGFyZ2V0UmVzb3VyY2VzRm9sZGVyTG9jYXRpb259KSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZihvcHRpb25zICE9IG51bGwpIHsKLSAgICAgICAgICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gb3B0aW9ucy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuRVhUUkFfT1BUSU9OVFlQRV9QUkVGSVggKyBlbnRyeS5nZXRLZXkoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKSBlbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIG9wdGlvbk1hcC5wdXQoCi0gICAgICAgICAgICAgICAgICAgICAgICBrZXksCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ29tbWFuZExpbmVPcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tde3ZhbHVlfSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgb3B0aW9uTWFwLnB1dCgKLSAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuU0VSVklDRV9OQU1FX09QVElPTiwKLSAgICAgICAgICAgICAgICBuZXcgQ29tbWFuZExpbmVPcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuU0VSVklDRV9OQU1FX09QVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IHNlcnZpY2VOYW1lIH0pKTsKLQotICAgICAgICBvcHRpb25NYXAucHV0KAotICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5QT1JUX05BTUVfT1BUSU9OLAotICAgICAgICAgICAgICAgIG5ldyBDb21tYW5kTGluZU9wdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5QT1JUX05BTUVfT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgcG9ydE5hbWUgfSkpOwotICAgICAgICAvLyBzZXQgdGhlIG5hbWVzcGFjZXMKLSAgICAgICAgaWYgKCEoKG5hbWVzcGFjZVRvUGFja2FnZXMgPT0gbnVsbCkgJiYgKG5hbWVzcGFjZVVSSXMgPT0gbnVsbCkpKSB7Ci0gICAgICAgICAgICBvcHRpb25NYXAucHV0KAotICAgICAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuTkFNRV9TUEFDRV9UT19QQUNLQUdFX09QVElPTiwKLSAgICAgICAgICAgICAgICAgICAgbmV3IENvbW1hbmRMaW5lT3B0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5OQU1FX1NQQUNFX1RPX1BBQ0tBR0VfT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IGdldE5hbWVzcGFjZVRvUGFja2FnZXNNYXAoKSB9KSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG9wdGlvbk1hcDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXROYW1lc3BhY2VUb1BhY2thZ2VzTWFwKCkgdGhyb3dzIE1vam9GYWlsdXJlRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBpZiAobmFtZXNwYWNlVG9QYWNrYWdlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQobmFtZXNwYWNlVG9QYWNrYWdlcyk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG5hbWVzcGFjZVVSSXMgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lc3BhY2VVUklzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgTmFtZXNwYWNlVVJJTWFwcGluZyBtYXBwaW5nID0gbmFtZXNwYWNlVVJJc1tpXTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdXJpID0gbWFwcGluZy5nZXRVcmkoKTsKLSAgICAgICAgICAgICAgICBpZiAodXJpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1vam9GYWlsdXJlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBIG5hbWVzcGFjZSB0byBwYWNrYWdlIG1hcHBpbmcgcmVxdWlyZXMgYW4gdXJpIGNoaWxkIGVsZW1lbnQuIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFN0cmluZyB1cmlQYWNrYWdlTmFtZSA9IG1hcHBpbmcuZ2V0UGFja2FnZU5hbWUoKTsKLSAgICAgICAgICAgICAgICBpZiAodXJpUGFja2FnZU5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTW9qb0ZhaWx1cmVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkEgbmFtZXNwYWNlIHRvIHBhY2thZ2UgbWFwcGluZyByZXF1aXJlcyBhIHBhY2thZ2VOYW1lIGNoaWxkIGVsZW1lbnQuIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChzYi5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIsIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCh1cmkpOwotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgnPScpOwotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCh1cmlQYWNrYWdlTmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIChzYi5sZW5ndGgoKSAhPSAwKSA/IHNiLnRvU3RyaW5nKCkgOiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFV0aWxpdHkgbWV0aG9kIHRvIGNvbnZlcnQgYSBzdHJpbmcgaW50byBhIHNpbmdsZSBpdGVtIHN0cmluZ1tdCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgU3RyaW5nW10uCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmdbXSBnZXRTdHJpbmdBcnJheShTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgU3RyaW5nW10gdmFsdWVzID0gbmV3IFN0cmluZ1sxXTsKLSAgICAgICAgdmFsdWVzWzBdID0gdmFsdWU7Ci0gICAgICAgIHJldHVybiB2YWx1ZXM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBNb2pvRmFpbHVyZUV4Y2VwdGlvbiwgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgZml4Q29tcGlsZVNvdXJjZVJvb3RzKCk7Ci0gICAgICAgIHNob3dEZXBlbmRlbmNpZXMoKTsKLQotICAgICAgICBNYXAgY29tbWFuZExpbmVPcHRpb25zID0gdGhpcy5maWxsT3B0aW9uTWFwKCk7Ci0gICAgICAgIENvbW1hbmRMaW5lT3B0aW9uUGFyc2VyIHBhcnNlciA9Ci0gICAgICAgICAgICAgICAgbmV3IENvbW1hbmRMaW5lT3B0aW9uUGFyc2VyKGNvbW1hbmRMaW5lT3B0aW9ucyk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBuZXcgQ29kZUdlbmVyYXRpb25FbmdpbmUocGFyc2VyKS5nZW5lcmF0ZSgpOwotICAgICAgICB9IGNhdGNoIChDb2RlR2VuZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBUaHJvd2FibGUgdCA9IGU7Ci0gICAgICAgICAgICB3aGlsZSAodC5nZXRDYXVzZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0ID0gdC5nZXRDYXVzZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdC5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzaG93RGVwZW5kZW5jaWVzKCkgewotICAgICAgICBMb2cgbG9nID0gZ2V0TG9nKCk7Ci0gICAgICAgIGlmICghbG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBsb2cuZGVidWcoIlRoZSBwcm9qZWN0cyBkZXBlbmRlbmN5IGFydGlmYWN0cyBhcmU6ICIpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwcm9qZWN0LmdldERlcGVuZGVuY3lBcnRpZmFjdHMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIEFydGlmYWN0IGFydGlmYWN0ID0gKEFydGlmYWN0KWl0ZXIubmV4dCgpOwotICAgICAgICAgICAgbG9nLmRlYnVnKCIgICAgIiArIGFydGlmYWN0LmdldEdyb3VwSWQoKSArICI6IiArIGFydGlmYWN0LmdldEFydGlmYWN0SWQoKSArCi0gICAgICAgICAgICAgICAgICAgICI6IiArIGFydGlmYWN0LmdldFZlcnNpb24oKSArICI6IiArIGFydGlmYWN0LmdldENsYXNzaWZpZXIoKSArCi0gICAgICAgICAgICAgICAgICAgICI6IiArIGFydGlmYWN0LmdldFNjb3BlKCkgKyAiOiIgKyBhcnRpZmFjdC5nZXRUeXBlKCkpOwotICAgICAgICB9Ci0gICAgICAgIGxvZy5kZWJ1ZygiVGhlIHByb2plY3RzIHRyYW5zaXRpdmUgYXJ0aWZhY3RzIGFyZTogIik7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHByb2plY3QuZ2V0QXJ0aWZhY3RzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBBcnRpZmFjdCBhcnRpZmFjdCA9IChBcnRpZmFjdClpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiICAgICIgKyBhcnRpZmFjdC5nZXRHcm91cElkKCkgKyAiOiIgKyBhcnRpZmFjdC5nZXRBcnRpZmFjdElkKCkgKwotICAgICAgICAgICAgICAgICAgICAiOiIgKyBhcnRpZmFjdC5nZXRWZXJzaW9uKCkgKyAiOiIgKyBhcnRpZmFjdC5nZXRDbGFzc2lmaWVyKCkgKwotICAgICAgICAgICAgICAgICAgICAiOiIgKyBhcnRpZmFjdC5nZXRTY29wZSgpICsgIjoiICsgYXJ0aWZhY3QuZ2V0VHlwZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBmaXhDb21waWxlU291cmNlUm9vdHMoKSB7Ci0gICAgICAgIEZpbGUgc3JjRGlyID0gbmV3IEZpbGUob3V0cHV0RGlyZWN0b3J5LCAic3JjIik7Ci0gICAgICAgIHByb2plY3QuYWRkQ29tcGlsZVNvdXJjZVJvb3Qoc3JjRGlyLmdldFBhdGgoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi13c2RsMmNvZGUtbWF2ZW4tcGx1Z2luL3NyYy9zaXRlL2FwdC9jb25maWd1cmF0aW9uLmFwdCBiL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItd3NkbDJjb2RlLW1hdmVuLXBsdWdpbi9zcmMvc2l0ZS9hcHQvY29uZmlndXJhdGlvbi5hcHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3ZGE4MzQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi13c2RsMmNvZGUtbWF2ZW4tcGx1Z2luL3NyYy9zaXRlL2FwdC9jb25maWd1cmF0aW9uLmFwdAorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLUNvbmZpZ3VyYXRpb24KLQotICBUaGUgV1NETDJDb2RlIGdvYWwgdGFrZXMgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzIGFzIGlucHV0LiBBbGwgcGFyYW1ldGVycyBjYW4gYmUgc2V0IGZyb20gdGhlIGNvbW1hbmQgbGluZSBieSB1c2luZwotICBwcm9wZXJ0aWVzLiBGb3IgZXhhbXBsZSwgdGhlIHBhcmFtZXRlciAiZ2VuZXJhdGVTZXJ2ZXJTaWRlIiBtYXkgYmUgc2V0IHVzaW5nIHRoZSBwcm9wZXJ0eQotICAiYXhpczIud3NkbDJjb2RlLmdlbmVyYXRlU2VydmVyU2lkZSIuIElmIHRoZSBwYXJhbWV0ZXIgaXNuJ3Qgc2V0IHZpYSBwcm9wZXJ0eSBvciBpbiB0aGUgUE9NLCB0aGVuIGEgZGVmYXVsdAotICB2YWx1ZSBhcHBsaWVzLgotCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgUGFyYW1ldGVyIG5hbWUgICAgICAgICAgICAgIHwgQ29tbWFuZCBsaW5lIHByb3BlcnR5ICAgICAgICAgICAgICAgICAgICAgICAgICB8IERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBEZWZhdWx0IHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgZGF0YWJpbmRpbmdOYW1lICAgICAgICAgICAgIHwgJHtheGlzMi53c2RsMmNvZGUuZGF0YWJpbmRpbmdOYW1lfSAgICAgICAgICAgICB8IERhdGEgYmluZGluZyBmcmFtZXdvcmssIHdoaWNoIGlzIGJlaW5nIHVzZWQgYnkgfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhZGIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGhlIGdlbmVyYXRlZCBzb3VyY2VzLiAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgZ2VuZXJhdGVBbGxDbGFzc2VzICAgICAgICAgIHwgJHtheGlzMi53c2RsMmNvZGUuZ2VuZXJhdGVBbGxDbGFzc2VzfSAgICAgICAgICB8IFdoZXRoZXIgdG8gZ2VuZXJhdGUgc2ltcGx5IGFsbCBjbGFzc2VzLiBUaGlzICAgfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBmYWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaXMgb25seSB2YWxpZCBpbiBjb25qdW5jdGlvbiB3aXRoICAgICAgICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAiZ2VuZXJhdGVTZXJ2ZXJTaWRlIi4gICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBnZW5lcmF0ZVNlcnZlclNpZGUgICAgICAgICAgfCAke2F4aXMyLndzZGwyY29kZS5nZW5lcmF0ZVNlcnZlclNpZGV9ICAgICAgICAgIHwgV2hldGhlciBzZXJ2ZXIgc2lkZSBzb3VyY2VzIGFyZSBiZWluZyAgICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGZhbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBnZW5lcmF0ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBnZW5lcmF0ZVNlcnZlclNpZGVJbnRlcmZhY2UgfCAke2F4aXMyLndzZGwyY29kZS5nZW5lcmF0ZVNlcnZlclNpZGVJbnRlcmZhY2V9IHwgV2hldGhlciB0byBnZW5lcmF0ZSB0aGUgc2VydmVyIHNpZGUgICAgICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGZhbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBpbnRlcmZhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBnZW5lcmF0ZVNlcnZpY2VzWG1sICAgICAgICAgfCAke2F4aXMyLndzZGwyY29kZS5nZW5lcmF0ZVNlcnZpY2VzWG1sfSAgICAgICAgIHwgV2hldGhlciBhICJzZXJ2aWNlcy54bWwiIGZpbGUgaXMgYmVpbmcgICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGZhbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBnZW5lcmF0ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBnZW5lcmF0ZVRlc3RjYXNlICAgICAgICAgICAgfCAke2F4aXMyLndzZGwyY29kZS5nZW5lcmF0ZVRlc3RDYXNlfSAgICAgICAgICAgIHwgV2hldGhlciBhIHRlc3QgY2FzZSBpcyBiZWluZyBnZW5lcmF0ZWQuICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGZhbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBsYW5ndWFnZSAgICAgICAgICAgICAgICAgICAgfCAke2F4aXMyLndzZGwyY29kZS5sYW5ndWFnZX0gICAgICAgICAgICAgICAgICAgIHwgUHJvZ3JhbW1pbmcgbGFuZ3VhZ2Ugb2YgdGhlIGdlbmVyYXRlZCBzb3VyY2VzLiB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGphdmEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBuYW1lc3BhY2VUb1BhY2thZ2VzICAgICAgICAgfCAke2F4aXMyLndzZGwyY29kZS5uYW1lc3BhY2VUb1BhY2thZ2VzfSAgICAgICAgIHwgTWFwIG9mIG5hbWVzcGFjZSBVUkkgdG8gcGFja2FnZXMgaW4gdGhlIGZvcm1hdCB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB1cmkxPXBhY2thZ2UxLHVyaTI9cGFja2FnZTIsLi4uICAgICAgICAgICAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFVzaW5nIHRoaXMgcGFyYW1ldGVyIGlzIGRpc2NvdXJhZ2VkLiBJbiAgICAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZ2VuZXJhbCwgeW91IHNob3VsZCB1c2UgdGhlICAgICAgICAgICAgICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBuYW1lc3BhY2VVcmlzIHBhcmFtZXRlci4gSG93ZXZlciwgdGhlIGxhdHRlciAgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGNhbm5vdCBiZSBzZXQgb24gdGhlIGNvbW1hbmQgbGluZS4gICAgICAgICAgICAgfAotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IG5hbWVzcGFjZVVSSXMgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBNYXAgb2YgbmFtZXNwYWNlIFVSSSB0byBwYWNrYWdlcy4gRXhhbXBsZTogICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFw8bmFtZXNwYWNlVVJJc1w+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICBcPG5hbWVzcGFjZVVSSVw+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgXDx1cmlcPnVyaTFcPC91cmkxXD4gICAgICAgICAgICAgICAgICAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICBcPHBhY2thZ2VcPnBhY2thZ2UxXDwvcGFja2FnZVw+ICAgICAgICAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICBcPC9uYW1lc3BhY2VVUklcPiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFw8L25hbWVzcGFjZVVSSXNcPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IG91dHB1dERpcmVjdG9yeSAgICAgICAgICAgICB8ICR7YXhpczIud3NkbDJjb2RlLnRhcmdldH0gICAgICAgICAgICAgICAgICAgICAgfCBUYXJnZXQgZGlyZWN0b3J5LCB3aGVyZSBzb3VyY2VzIGFyZSBiZWluZyAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFyZ2V0L2dlbmVyYXRlZC1zb3VyY2VzL2F4aXMyL3dzZGwyY29kZSAgICAgICB8IGdlbmVyYXRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IHBhY2thZ2VOYW1lICAgICAgICAgICAgICAgICB8ICR7YXhpczIud3NkbDJjb2RlLnBhY2thZ2V9ICAgICAgICAgICAgICAgICAgICAgfCBQYWNrYWdlIG5hbWUgb2YgdGhlIGdlbmVyYXRlZCBzb3VyY2VzLiAgICAgICAgIHwKLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBwb3J0TmFtZSAgICAgICAgICAgICAgICAgICAgfCAke2F4aXMyLndzZGwyY29kZS5wb3J0TmFtZX0gICAgICAgICAgICAgICAgICAgIHwgUG9ydCBuYW1lLCBmb3Igd2hpY2ggc291cmNlcyBhcmUgYmVpbmcgICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBnZW5lcmF0ZWQuIEJ5IGRlZmF1bHQsIHNvdXJjZXMgYXJlIGdlbmVyYXRlZCAgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGZvciBhbGwgcG9ydHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IHNlcnZpY2VOYW1lICAgICAgICAgICAgICAgICB8ICR7YXhpczIud3NkbDJjb2RlLnNlcnZpY2VOYW1lfSAgICAgICAgICAgICAgICAgfCBTZXJ2aWNlIG5hbWUsIGZvciB3aGljaCBzb3VyY2VzIGFyZSBiZWluZyAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGdlbmVyYXRlZC4gQnkgZGVmYXVsdCwgc291cmNlcyBhcmUgZ2VuZXJhdGVkICAgfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZm9yIGFsbCBzZXJ2aWNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgc3luY01vZGUgICAgICAgICAgICAgICAgICAgIHwgJHtheGlzMi53c2RsMmNvZGUuc3luY01vZGV9ICAgICAgICAgICAgICAgICAgICB8IFN5bmMgbW9kZSwgZm9yIHdoaWNoIHNvdXJjZXMgYXJlIGJlaW5nICAgICAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBib3RoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZ2VuZXJhdGVkOyBlaXRoZXIgb2YgInN5bmMiLCAiYXN5bmMiLCBvciAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAiYm90aCIgKGRlZmF1bHQpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCB1bnBhY2tDbGFzc2VzICAgICAgICAgICAgICAgfCAke2F4aXMyLndzZGwyY29kZS51bnBhY2tDbGFzc2VzfSAgICAgICAgICAgICAgIHwgV2hldGhlciB0byB1bnBhY2sgY2xhc3Nlcy4gICAgICAgICAgICAgICAgICAgICB8Ci0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKLXwgd3NkbEZpbGUgICAgICAgICAgICAgICAgICAgIHwgJHtheGlzMi53c2RsMmNvZGUud3NkbH0gICAgICAgICAgICAgICAgICAgICAgICB8IExvY2F0aW9uIG9mIHRoZSBXU0RMIGZpbGUsIHdoaWNoIGlzIHJlYWQgYXMgICAgfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzcmMvbWFpbi9heGlzMi9zZXJ2aWNlLndzZGwgICAgICAgICAgICAgICAgICAgIHwgaW5wdXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItd3NkbDJjb2RlLW1hdmVuLXBsdWdpbi9zcmMvc2l0ZS9hcHQvZ29hbHMuYXB0IGIvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi13c2RsMmNvZGUtbWF2ZW4tcGx1Z2luL3NyYy9zaXRlL2FwdC9nb2Fscy5hcHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwZTBmNmQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi13c2RsMmNvZGUtbWF2ZW4tcGx1Z2luL3NyYy9zaXRlL2FwdC9nb2Fscy5hcHQKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0gLS0tLS0tCi0gTWF2ZW4gMiBXU0RMMkNvZGUgUGx1Z2luOiBjb25maWd1cmF0aW9uIGV4YW1wbGVzCi0gLS0tLS0tCi0gSm9jaGVuIFdpZWRtYW5uIAotIDxqb2NoZW4ud2llZG1hbm5AZ21haWwuY29tPgotIC0tLS0tLQotCi1Hb2FscwotCi0gIFRoZSBXU0RsMkNvZGUgb2ZmZXJzIGEgc2luZ2xlIGdvYWw6Ci0KLSAgICogd3NkbDJjb2RlIChkZWZhdWx0KTogUmVhZHMgdGhlIFdTREwgYW5kIGdlbmVyYXRlcyBjb2RlLgotCi0gIFRvIHJ1biB0aGUgcGx1Z2luLCBhZGQgdGhlIGZvbGxvd2luZyBzZWN0aW9uIHRvIHlvdXIgUE9NOgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgPGJ1aWxkPgotICAgIDxwbHVnaW5zPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMi5tYXZlbjI8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLXdzZGwyY29kZS1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgIDxnb2FsPndzZGwyY29kZTwvZ29hbD4KLSAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8cGFja2FnZU5hbWU+Y29tLmZvby5teXNlcnZpY2U8L3BhY2thZ2VOYW1lPgotICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgPC9wbHVnaW4+Ci0gICAgPC9wbHVnaW5zPgotICA8L2J1aWxkPgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgVGhlIHBsdWdpbiB3aWxsIGJlIGludm9rZWQgYXV0b21hdGljYWxseSBpbiB0aGUgZ2VuZXJhdGUtc291cmNlcwotICBwaGFzZS4gWW91IGNhbiBhbHNvIGludm9rZSBpdCBkaXJlY3RseSBmcm9tIHRoZSBjb21tYW5kIGxpbmUgYnkKLSAgcnVubmluZyB0aGUgY29tbWFuZAotCi0rLS0tLS0tLS0KLSAgbXZuIHdzZGwyY29kZTp3c2RsMmNvZGUKLSstLS0tLS0tLS0KLQotCi1UaGUgV1NETDJDb2RlIEdvYWwKLQotICBCeSBkZWZhdWx0LCB0aGUgcGx1Z2luIHJlYWRzIHRoZSBmaWxlIDw8PHNyYy9tYWluL2F4aXMyL3NlcnZpY2Uud3NkbD4+Pi4KLSAgU291cmNlcyBmb3IgdGhlIEphdmEgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UgYW5kIHRoZSBBREIgZGF0YSBiaW5kaW5nIGFyZQotICBnZW5lcmF0ZWQgaW50byA8PDx0YXJnZXQvZ2VuZXJhdGVkLXNvdXJjZXMvYXhpczIvd3NkbDJjb2RlPj4+LgotICBOb3RlIHRoZSBjb25maWd1cmF0aW9uIGVsZW1lbnQgPDw8cGFja2FnZU5hbWU+Pj4gYWJvdmUsIHdoaWNoIHNldHMKLSAgdGhlIHBhY2thZ2UgbmFtZSwgdGh1cyBhIHN1YmRpcmVjdG9yeS4KLQotICBTZWUgdGhlIGRldGFpbGVkIGRvY3VtZW50YXRpb24gb24ge3t7Y29uZmlndXJhdGlvbi5odG1sfXByb3BlcnRpZXN9fSBmb3IKLSAgaG93IHRvIGNvbmZpZ3VyZSB0aGUgZ29hbC4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItd3NkbDJjb2RlLW1hdmVuLXBsdWdpbi9zcmMvc2l0ZS9hcHQvaW50cm9kdWN0aW9uLmFwdCBiL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItd3NkbDJjb2RlLW1hdmVuLXBsdWdpbi9zcmMvc2l0ZS9hcHQvaW50cm9kdWN0aW9uLmFwdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDMxZGRkOS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLXdzZGwyY29kZS1tYXZlbi1wbHVnaW4vc3JjL3NpdGUvYXB0L2ludHJvZHVjdGlvbi5hcHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0gLS0tLS0tCi0gTWF2ZW4gMiBXU0RMMkNvZGUgUGx1Z2luCi0gLS0tLS0tCi0gSm9jaGVuIFdpZWRtYW5uCi0gPGpvY2hlbi53aWVkbWFubkBnbWFpbC5jb20+Ci0gLS0tLS0tCi0KLUludHJvZHVjdGlvbgotCi0gIFRoaXMgcGx1Z2luIHRha2VzIGFzIGlucHV0IGEgV1NETCBhbmQgZ2VuZXJhdGVzIGNsaWVudAotICBhbmQgc2VydmVyIHN0dWJzIGZvciBjYWxsaW5nIG9yIGltcGxlbWVudGluZyBhIHdlYiBzZXJ2aWNlCi0gIG1hdGNoaW5nIHRoZSBXU0RMLgotCi0gIFRoZSBmdWxsIGRlc2NyaXB0aW9uIG9mIGdvYWxzIGlzIGF2YWlsYWJsZSB7e3tnb2Fscy5odG1sfWhlcmV9fS4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItd3NkbDJjb2RlLW1hdmVuLXBsdWdpbi9zcmMvc2l0ZS9zaXRlLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItd3NkbDJjb2RlLW1hdmVuLXBsdWdpbi9zcmMvc2l0ZS9zaXRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjgyMGU0ZC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLXdzZGwyY29kZS1tYXZlbi1wbHVnaW4vc3JjL3NpdGUvc2l0ZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIj8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHByb2plY3QgbmFtZT0iTWF2ZW4gQXhpcyAyIFdTREwyQ29kZSBQbHVnaW4iPgotICA8YmFubmVyTGVmdD4KLSAgICA8bmFtZT5NYXZlbiBBeGlzIDIgV1NETDJDb2RlIFBsdWdpbjwvbmFtZT4KLSAgICA8c3JjPmh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL2ltYWdlcy9hcGFjaGUtbWF2ZW4tcHJvamVjdC5wbmc8L3NyYz4KLSAgICA8aHJlZj5odHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy88L2hyZWY+Ci0gIDwvYmFubmVyTGVmdD4KLSAgPGJhbm5lclJpZ2h0PgotICAgIDxzcmM+aHR0cDovL21hdmVuLmFwYWNoZS5vcmcvaW1hZ2VzL21hdmVuLXNtYWxsLmdpZjwvc3JjPgotICA8L2Jhbm5lclJpZ2h0PgotICA8Ym9keT4KLSAgICA8bGlua3M+Ci0gICAgICA8aXRlbSBuYW1lPSJBcGFjaGUiIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy8iLz4KLSAgICAgIDxpdGVtIG5hbWU9IldlYnNlcnZpY2VzIiBocmVmPSJodHRwOi8vd3MuYXBhY2hlLm9yZy8iLz4KLSAgICAgIDxpdGVtIG5hbWU9IkF4aXMgMiIgaHJlZj0iaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvIi8+Ci0gICAgICA8aXRlbSBuYW1lPSJNYXZlbiAyIiBocmVmPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbjIvIi8+Ci0gICAgPC9saW5rcz4KLQotICAgIDxtZW51IG5hbWU9Ik92ZXJ2aWV3Ij4KLSAgICAgIDxpdGVtIG5hbWU9IkludHJvZHVjdGlvbiIgaHJlZj0iaW50cm9kdWN0aW9uLmh0bWwiLz4KLSAgICAgIDxpdGVtIG5hbWU9IkhvdyB0byBVc2UiIGhyZWY9Imhvd3RvLmh0bWwiLz4KLSAgICAgIDxpdGVtIG5hbWU9IkNvbmZpZ3VyYXRpb24iIGhyZWY9ImNvbmZpZ3VyYXRpb24uaHRtbCIvPgotICAgIDwvbWVudT4KLSAgICAke3JlcG9ydHN9Ci0gIDwvYm9keT4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItd3NkbDJjb2RlLW1hdmVuLXBsdWdpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYXhpczIvbWF2ZW4yL3dzZGwyY29kZS9XU0RMMkNvZGVNb2pvVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi13c2RsMmNvZGUtbWF2ZW4tcGx1Z2luL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9heGlzMi9tYXZlbjIvd3NkbDJjb2RlL1dTREwyQ29kZU1vam9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliOWQ4N2IuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi13c2RsMmNvZGUtbWF2ZW4tcGx1Z2luL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9heGlzMi9tYXZlbjIvd3NkbDJjb2RlL1dTREwyQ29kZU1vam9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIubWF2ZW4yLndzZGwyY29kZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLnRlc3RpbmcuQWJzdHJhY3RNb2pvVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4udGVzdGluZy5zdHVicy5NYXZlblByb2plY3RTdHViOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotCi0vKiogVGVzdCBjbGFzcyBmb3IgcnVubmluZyB0aGUgd3NkbDJjb2RlIG1vam8uICovCi1wdWJsaWMgY2xhc3MgV1NETDJDb2RlTW9qb1Rlc3QgZXh0ZW5kcyBBYnN0cmFjdE1vam9UZXN0Q2FzZSB7Ci0gICAgLyoqIFRlc3RzIHJ1bm5pbmcgdGhlIGphdmEgZ2VuZXJhdG9yLiAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RKYXZhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJ1blRlc3QoInNyYy90ZXN0L3Rlc3QxIiwgIndzZGwyY29kZSIpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBXU0RMMkNvZGVNb2pvIG5ld01vam8oU3RyaW5nIHBEaXIsIFN0cmluZyBwR29hbCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEZpbGUgYmFzZURpciA9IG5ldyBGaWxlKG5ldyBGaWxlKGdldEJhc2VkaXIoKSksIHBEaXIpOwotICAgICAgICBGaWxlIHRlc3RQb20gPSBuZXcgRmlsZShiYXNlRGlyLCAicG9tLnhtbCIpOwotICAgICAgICBXU0RMMkNvZGVNb2pvIG1vam8gPSAoV1NETDJDb2RlTW9qbylsb29rdXBNb2pvKHBHb2FsLCB0ZXN0UG9tKTsKLSAgICAgICAgTWF2ZW5Qcm9qZWN0U3R1YiBwcm9qZWN0ID0gbmV3IE1hdmVuUHJvamVjdFN0dWIoKTsKLSAgICAgICAgcHJvamVjdC5zZXREZXBlbmRlbmN5QXJ0aWZhY3RzKG5ldyBIYXNoU2V0KCkpOwotICAgICAgICBzZXRWYXJpYWJsZVZhbHVlVG9PYmplY3QobW9qbywgInByb2plY3QiLCBwcm9qZWN0KTsKLSAgICAgICAgc2V0VmFyaWFibGVWYWx1ZVRvT2JqZWN0KG1vam8sICJ3c2RsRmlsZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZShiYXNlRGlyLCAic3JjL21haW4vYXhpczIvc2VydmljZS53c2RsIikuZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgICAgICBzZXRWYXJpYWJsZVZhbHVlVG9PYmplY3QobW9qbywgIm91dHB1dERpcmVjdG9yeSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZShiYXNlRGlyLCAidGFyZ2V0L2dlbmVyYXRlZC1zb3VyY2VzL2F4aXMyL3dzZGwyY29kZSIpKTsKLSAgICAgICAgc2V0VmFyaWFibGVWYWx1ZVRvT2JqZWN0KG1vam8sICJzeW5jTW9kZSIsICJib3RoIik7Ci0gICAgICAgIHNldFZhcmlhYmxlVmFsdWVUb09iamVjdChtb2pvLCAiZGF0YWJpbmRpbmdOYW1lIiwgImFkYiIpOwotICAgICAgICBzZXRWYXJpYWJsZVZhbHVlVG9PYmplY3QobW9qbywgImxhbmd1YWdlIiwgImphdmEiKTsKLSAgICAgICAgcmV0dXJuIG1vam87Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgcnVuVGVzdChTdHJpbmcgcERpciwgU3RyaW5nIHBHb2FsKQotICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIG5ld01vam8ocERpciwgcEdvYWwpLmV4ZWN1dGUoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLXdzZGwyY29kZS1tYXZlbi1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2xvZzRqLnByb3BlcnRpZXMgYi92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLXdzZGwyY29kZS1tYXZlbi1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2xvZzRqLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlNDgwNGYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi13c2RsMmNvZGUtbWF2ZW4tcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9sb2c0ai5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotIwotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi0KLSMgU2V0IHJvb3QgY2F0ZWdvcnkgcHJpb3JpdHkgdG8gSU5GTyBhbmQgaXRzIG9ubHkgYXBwZW5kZXIgdG8gQ09OU09MRS4KLWxvZzRqLnJvb3RDYXRlZ29yeT1JTkZPLCBDT05TT0xFCi0jbG9nNGoucm9vdENhdGVnb3J5PUlORk8sIENPTlNPTEUsIExPR0ZJTEUKLQotIyBTZXQgdGhlIGVudGVycHJpc2UgbG9nZ2VyIHByaW9yaXR5IHRvIEZBVEFMCi1sb2c0ai5sb2dnZXIub3JnLmFwYWNoZS5heGlzMi5lbnRlcnByaXNlPUZBVEFMCi1sb2c0ai5sb2dnZXIuZGUuaHVuc2lja2VyLmphbG9weS5pbz1GQVRBTAotbG9nNGoubG9nZ2VyLmh0dHBjbGllbnQud2lyZS5oZWFkZXI9RkFUQUwKLWxvZzRqLmxvZ2dlci5vcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudD1GQVRBTAotCi0jIENPTlNPTEUgaXMgc2V0IHRvIGJlIGEgQ29uc29sZUFwcGVuZGVyIHVzaW5nIGEgUGF0dGVybkxheW91dC4KLWxvZzRqLmFwcGVuZGVyLkNPTlNPTEU9b3JnLmFwYWNoZS5sb2c0ai5Db25zb2xlQXBwZW5kZXIKLWxvZzRqLmFwcGVuZGVyLkNPTlNPTEUubGF5b3V0PW9yZy5hcGFjaGUubG9nNGouUGF0dGVybkxheW91dAotbG9nNGouYXBwZW5kZXIuQ09OU09MRS5sYXlvdXQuQ29udmVyc2lvblBhdHRlcm49JWQgJS01cCAlYyAtICVtJW4KLQotIyBMT0dGSUxFIGlzIHNldCB0byBiZSBhIEZpbGUgYXBwZW5kZXIgdXNpbmcgYSBQYXR0ZXJuTGF5b3V0LgotbG9nNGouYXBwZW5kZXIuTE9HRklMRT1vcmcuYXBhY2hlLmxvZzRqLkZpbGVBcHBlbmRlcgotbG9nNGouYXBwZW5kZXIuTE9HRklMRS5GaWxlPWF4aXMyLmxvZwotbG9nNGouYXBwZW5kZXIuTE9HRklMRS5BcHBlbmQ9dHJ1ZQotbG9nNGouYXBwZW5kZXIuTE9HRklMRS5sYXlvdXQ9b3JnLmFwYWNoZS5sb2c0ai5QYXR0ZXJuTGF5b3V0Ci1sb2c0ai5hcHBlbmRlci5MT0dGSUxFLmxheW91dC5Db252ZXJzaW9uUGF0dGVybj0lZCBbJXRdICUtNXAgJWMgJXggLSAlbSVuCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2F4aXMyLXdzZGwyY29kZS1tYXZlbi1wbHVnaW4vc3JjL3Rlc3QvdGVzdDEvcG9tLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItd3NkbDJjb2RlLW1hdmVuLXBsdWdpbi9zcmMvdGVzdC90ZXN0MS9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmY2JjMWQxLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItd3NkbDJjb2RlLW1hdmVuLXBsdWdpbi9zcmMvdGVzdC90ZXN0MS9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08cHJvamVjdD4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMi5tYXZlbjI8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+YXhpczItd3NkbDJjb2RlLW1hdmVuLXBsdWdpbi10ZXN0MTwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xLjUuMTwvdmVyc2lvbj4KLSAgICA8bmFtZT5UZXN0IDEgb2YgdGhlIGF4aXMyLXdzZGwyY29kZS1tYXZlbi1wbHVnaW48L25hbWU+Ci0gICAgPGJ1aWxkPgotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi13c2RsMmNvZGUtbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjEuNS4xPC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8Z2VuZXJhdGVTZXJ2ZXJTaWRlPnRydWU8L2dlbmVyYXRlU2VydmVyU2lkZT4KLSAgICAgICAgICAgICAgICAgICAgPGdlbmVyYXRlU2VydmVyU2lkZUludGVyZmFjZT50cnVlPC9nZW5lcmF0ZVNlcnZlclNpZGVJbnRlcmZhY2U+Ci0gICAgICAgICAgICAgICAgICAgIDxnZW5lcmF0ZUFsbENsYXNzZXM+dHJ1ZTwvZ2VuZXJhdGVBbGxDbGFzc2VzPgotICAgICAgICAgICAgICAgICAgICA8Z2VuZXJhdGVTZXJ2aWNlc1htbD50cnVlPC9nZW5lcmF0ZVNlcnZpY2VzWG1sPgotICAgICAgICAgICAgICAgICAgICA8cGFja2FnZU5hbWU+ZGVtbzwvcGFja2FnZU5hbWU+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgIDwvcGx1Z2lucz4KLSAgICA8L2J1aWxkPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi13c2RsMmNvZGUtbWF2ZW4tcGx1Z2luL3NyYy90ZXN0L3Rlc3QxL3NyYy9tYWluL2F4aXMyL3NlcnZpY2Uud3NkbCBiL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYXhpczItd3NkbDJjb2RlLW1hdmVuLXBsdWdpbi9zcmMvdGVzdC90ZXN0MS9zcmMvbWFpbi9heGlzMi9zZXJ2aWNlLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkODI2ZDEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9heGlzMi13c2RsMmNvZGUtbWF2ZW4tcGx1Z2luL3NyYy90ZXN0L3Rlc3QxL3NyYy9tYWluL2F4aXMyL3NlcnZpY2Uud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTx3c2RsOmRlZmluaXRpb25zCi0gICAgeG1sbnM6YXhpczI9Imh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyIgotICAgIHhtbG5zOm5zMT0iaHR0cDovL29yZy5hcGFjaGUuYXhpczIveHNkIgotICAgIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIgotICAgIHhtbG5zOmh0dHA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvaHR0cC8iCi0gICAgeG1sbnM6bnM9Imh0dHA6Ly9heGlzdmVyc2lvbi5zYW1wbGUveHNkIgotICAgIHhtbG5zOm1pbWU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvbWltZS8iCi0gICAgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIKLSAgICB4bWxuczpzb2FwMTI9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcDEyLyIKLSAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyIj4KLSAgPHdzZGw6ZG9jdW1lbnRhdGlvbj4KLSAgICB4RFdTIHNlcnZpY2UgZXhhbXBsZQotICA8L3dzZGw6ZG9jdW1lbnRhdGlvbj4KLSAgPHdzZGw6dHlwZXM+Ci0gICAgPHhzOnNjaGVtYQotICAgICAgICB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIKLSAgICAgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0gICAgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2F4aXN2ZXJzaW9uLnNhbXBsZS94c2QiPgotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iY29tbWFuZHMiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGUvPgotICAgICAgPC94czplbGVtZW50PgotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iY29tbWFuZHNSZXNwb25zZSI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZS8+Ci0gICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPC94czpzY2hlbWE+Ci0gIDwvd3NkbDp0eXBlcz4KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJjb21tYW5kc01lc3NhZ2UiPgotICAgIDx3c2RsOnBhcnQgbmFtZT0icGFydDEiIGVsZW1lbnQ9Im5zOmNvbW1hbmRzIi8+Ci0gIDwvd3NkbDptZXNzYWdlPgotICA8d3NkbDptZXNzYWdlIG5hbWU9ImNvbW1hbmRzUmVzcG9uc2UiPgotICAgIDx3c2RsOnBhcnQgbmFtZT0icGFydDEiIGVsZW1lbnQ9Im5zOmNvbW1hbmRzUmVzcG9uc2UiLz4KLSAgPC93c2RsOm1lc3NhZ2U+Ci0gIDx3c2RsOnBvcnRUeXBlIG5hbWU9ImF4aXMyLXRlc3QtMC4wLjFQb3J0VHlwZSI+Ci0gICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImNvbW1hbmRzIj4KLSAgICAgIDx3c2RsOmlucHV0Ci0gICAgICAgICAgeG1sbnM6d3Nhdz0iaHR0cDovL3d3dy53My5vcmcvMjAwNi8wNS9hZGRyZXNzaW5nL3dzZGwiCi0gICAgICAgICAgbWVzc2FnZT0iYXhpczI6Y29tbWFuZHNNZXNzYWdlIgotICAgICAgICAgIHdzYXc6QWN0aW9uPSJ1cm46Y29tbWFuZHMiLz4KLSAgICAgIDx3c2RsOm91dHB1dAotICAgICAgICAgIHhtbG5zOndzYXc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDYvMDUvYWRkcmVzc2luZy93c2RsIgotICAgICAgICAgIG1lc3NhZ2U9ImF4aXMyOmNvbW1hbmRzUmVzcG9uc2UiCi0gICAgICAgICAgd3NhdzpBY3Rpb249Imh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL3hEV1NQb3J0VHlwZS9jb21tYW5kc1Jlc3BvbnNlIi8+Ci0gICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgPC93c2RsOnBvcnRUeXBlPgotICA8d3NkbDpiaW5kaW5nIG5hbWU9ImF4aXMyLXRlc3QtMC4wLjFTT0FQMTFCaW5kaW5nIiB0eXBlPSJheGlzMjpheGlzMi10ZXN0LTAuMC4xUG9ydFR5cGUiPgotICAgIDxzb2FwOmJpbmRpbmcgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiIHN0eWxlPSJkb2N1bWVudCIvPgotICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJjb21tYW5kcyI+Ci0gICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOmNvbW1hbmRzIiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgPC93c2RsOmlucHV0PgotICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgPC93c2RsOm91dHB1dD4KLSAgICA8L3dzZGw6b3BlcmF0aW9uPgotICA8L3dzZGw6YmluZGluZz4KLSAgPHdzZGw6YmluZGluZyBuYW1lPSJheGlzMi10ZXN0LTAuMC4xU09BUDEyQmluZGluZyIgdHlwZT0iYXhpczI6YXhpczItdGVzdC0wLjAuMVBvcnRUeXBlIj4KLSAgICA8c29hcDEyOmJpbmRpbmcgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiIHN0eWxlPSJkb2N1bWVudCIvPgotICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJjb21tYW5kcyI+Ci0gICAgICA8c29hcDEyOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46Y29tbWFuZHMiIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgIDxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgPHNvYXAxMjpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgPC93c2RsOm91dHB1dD4KLSAgICA8L3dzZGw6b3BlcmF0aW9uPgotICA8L3dzZGw6YmluZGluZz4KLSAgPHdzZGw6YmluZGluZyBuYW1lPSJheGlzMi10ZXN0LTAuMC4xSHR0cEJpbmRpbmciIHR5cGU9ImF4aXMyOmF4aXMyLXRlc3QtMC4wLjFQb3J0VHlwZSI+Ci0gICAgPGh0dHA6YmluZGluZyB2ZXJiPSJQT1NUIi8+Ci0gICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImNvbW1hbmRzIj4KLSAgICAgIDxodHRwOm9wZXJhdGlvbiBsb2NhdGlvbj0iY29tbWFuZHMiLz4KLSAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICA8bWltZTpjb250ZW50IHR5cGU9InRleHQveG1sIi8+Ci0gICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgIDxtaW1lOmNvbnRlbnQgdHlwZT0idGV4dC94bWwiLz4KLSAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgPC93c2RsOmJpbmRpbmc+Ci0gIDx3c2RsOnNlcnZpY2UgbmFtZT0iYXhpczItdGVzdC0wLjAuMSI+Ci0gICAgPHdzZGw6cG9ydCBuYW1lPSJheGlzMi10ZXN0LTAuMC4xU09BUDExcG9ydF9odHRwIiBiaW5kaW5nPSJheGlzMjpheGlzMi10ZXN0LTAuMC4xU09BUDExQmluZGluZyI+Ci0gICAgICA8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vMTkyLjE2OC4xMzYuMzo4MDgwL2F4aXMyLXdlYmFwcC9zZXJ2aWNlcy9heGlzMi10ZXN0LTAuMC4xIi8+Ci0gICAgPC93c2RsOnBvcnQ+Ci0gICAgPHdzZGw6cG9ydCBuYW1lPSJheGlzMi10ZXN0LTAuMC4xU09BUDEycG9ydF9odHRwIiBiaW5kaW5nPSJheGlzMjpheGlzMi10ZXN0LTAuMC4xU09BUDEyQmluZGluZyI+Ci0gICAgICA8c29hcDEyOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly8xOTIuMTY4LjEzNi4zOjgwODAvYXhpczItd2ViYXBwL3NlcnZpY2VzL2F4aXMyLXRlc3QtMC4wLjEiLz4KLSAgICA8L3dzZGw6cG9ydD4KLSAgICA8d3NkbDpwb3J0IG5hbWU9ImF4aXMyLXRlc3QtMC4wLjFIdHRwcG9ydDAiIGJpbmRpbmc9ImF4aXMyOmF4aXMyLXRlc3QtMC4wLjFIdHRwQmluZGluZyI+Ci0gICAgICA8aHR0cDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vMTkyLjE2OC4xMzYuMzo4MDgwL2F4aXMyLXdlYmFwcC9yZXN0L2F4aXMyLXRlc3QtMC4wLjEiLz4KLSAgICA8L3dzZGw6cG9ydD4KLSAgPC93c2RsOnNlcnZpY2U+Ci08L3dzZGw6ZGVmaW5pdGlvbnM+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2J1aWxkLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4YmRmZWU5Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvYnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHByb2plY3QgYmFzZWRpcj0iLiIgZGVmYXVsdD0iaGVscCI+Ci0KLSAgICAgICA8cHJvcGVydHkgbmFtZT0ib3V0cHV0LmZvbGRlciIgdmFsdWU9Ii4vdGFyZ2V0L2VjbGlwc2VfcGx1Z2lucyI+PC9wcm9wZXJ0eT4KLSAgICAgICA8cHJvcGVydHkgbmFtZT0ic2VydmljZS5wbHVnaW4uZm9sZGVyIiB2YWx1ZT0iLi9heGlzMi1lY2xpcHNlLXNlcnZpY2UtcGx1Z2luIj48L3Byb3BlcnR5PgotICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjb2RlZ2VuLnBsdWdpbi5mb2xkZXIiIHZhbHVlPSIuL2F4aXMyLWVjbGlwc2UtY29kZWdlbi1wbHVnaW4iPjwvcHJvcGVydHk+Ci0KLSAgICAgICA8IS0tIENsZWFuIHRoZSBkaXJlY3RvcnkgLS0+Ci0gICAgICAgPHRhcmdldCBuYW1lPSJjbGVhbiI+Ci0gICAgICAgICAgPGRlbGV0ZSBkaXI9IiR7b3V0cHV0LmZvbGRlcn0iPjwvZGVsZXRlPgotICAgICAgIDwvdGFyZ2V0PgotCi0gICAgICAgPCEtLSBEZWZhdWx0IHRhcmdldCB0byBnZW5lcmF0ZSBhbGwgdGhlIHBsdWdpbnMgLS0+Ci0gICAgICAgPHRhcmdldCBuYW1lPSJhbGwiPgotICAgICAgICAgPGFudGNhbGwgdGFyZ2V0PSJjbGVhbiIgLz4KLSAgICAgICAgIDxhbnRjYWxsIHRhcmdldD0iZ2VuZXJhdGUtcGx1Z2lucyIvPgotICAgICAgICAgPGFudGNhbGwgdGFyZ2V0PSJyZWxlYXNlLXBsdWdpbnMiLz4KLSAgICAgICA8L3RhcmdldD4KLQotICAgICAgIDwhLS0gaW5pdC0tPgotICAgICAgIDx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0gICAgICAgICAgPG1rZGlyIGRpcj0iJHtvdXRwdXQuZm9sZGVyfSI+PC9ta2Rpcj4KLSAgICAgICA8L3RhcmdldD4KLQotICAgICAgICA8dGFyZ2V0IG5hbWU9ImdlbmVyYXRlLXByb2plY3RzIiBkZXBlbmRzPSJpbml0Ij4KLSAgICAgICAgICAgICAgIDxhbnQgZGlyPSIke3NlcnZpY2UucGx1Z2luLmZvbGRlcn0iIHRhcmdldD0iZ2VuZXJhdGUtc2VydmljZS1wcm9qZWN0IiAvPgotICAgICAgICAgICAgICAgPGFudCBkaXI9IiR7Y29kZWdlbi5wbHVnaW4uZm9sZGVyfSIgdGFyZ2V0PSJnZW5lcmF0ZS1jb2RlZ2VuLXByb2plY3QiICAvPgotICAgICAgICA8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0iZ2VuZXJhdGUtc2VydmljZS1wcm9qZWN0IiBkZXBlbmRzPSJpbml0Ij4KLQkgICAgICAgPGFudCBkaXI9IiR7c2VydmljZS5wbHVnaW4uZm9sZGVyfSIgdGFyZ2V0PSJnZW5lcmF0ZS1zZXJ2aWNlLXByb2plY3QiIC8+Ci0JPC90YXJnZXQ+Ci0JCi0JPHRhcmdldCBuYW1lPSJnZW5lcmF0ZS1jb2RlZ2VuLXByb2plY3QiIGRlcGVuZHM9ImluaXQiPgotCQkgPGFudCBkaXI9IiR7Y29kZWdlbi5wbHVnaW4uZm9sZGVyfSIgdGFyZ2V0PSJnZW5lcmF0ZS1jb2RlZ2VuLXByb2plY3QiIC8+Ci0JPC90YXJnZXQ+Ci0KLSAgICAgICAgPHRhcmdldCBuYW1lPSJnZW5lcmF0ZS1wbHVnaW5zIiBkZXBlbmRzPSJpbml0Ij4KLQkJPGFudCBkaXI9IiR7c2VydmljZS5wbHVnaW4uZm9sZGVyfSIgdGFyZ2V0PSJnZW5lcmF0ZS1zZXJ2aWNlLXBsdWdpbiIgLz4KLQkJPGFudCBkaXI9IiR7Y29kZWdlbi5wbHVnaW4uZm9sZGVyfSIgdGFyZ2V0PSJnZW5lcmF0ZS1jb2RlZ2VuLXBsdWdpbiIgLz4KLSAgICAgICAgPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9ImdlbmVyYXRlLXNlcnZpY2UtcGx1Z2luIiBkZXBlbmRzPSJpbml0Ij4KLQkJPGFudCBkaXI9IiR7c2VydmljZS5wbHVnaW4uZm9sZGVyfSIgdGFyZ2V0PSJnZW5lcmF0ZS1zZXJ2aWNlLXBsdWdpbiIgLz4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0iZ2VuZXJhdGUtY29kZWdlbi1wbHVnaW4iIGRlcGVuZHM9ImluaXQiID4KLQkJIDxhbnQgZGlyPSIke2NvZGVnZW4ucGx1Z2luLmZvbGRlcn0iIHRhcmdldD0iZ2VuZXJhdGUtY29kZWdlbi1wbHVnaW4iIC8+Ci0JPC90YXJnZXQ+Ci0KLSAgICAgICAgPHRhcmdldCBuYW1lPSJpbnN0YWxsLXBsdWdpbnMiIGRlcGVuZHM9ImluaXQiPgotCQk8YW50IGRpcj0iJHtzZXJ2aWNlLnBsdWdpbi5mb2xkZXJ9IiB0YXJnZXQ9Imluc3RhbGwtc2VydmljZS1wbHVnaW4iIC8+Ci0JCTxhbnQgZGlyPSIke2NvZGVnZW4ucGx1Z2luLmZvbGRlcn0iIHRhcmdldD0iaW5zdGFsbC1jb2RlZ2VuLXBsdWdpbiIgLz4KLSAgICAgICAgPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9Imluc3RhbGwtc2VydmljZS1wbHVnaW4iIGRlcGVuZHM9ImluaXQiPgotCQk8YW50IGRpcj0iJHtzZXJ2aWNlLnBsdWdpbi5mb2xkZXJ9IiB0YXJnZXQ9Imluc3RhbGwtc2VydmljZS1wbHVnaW4iIC8+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9Imluc3RhbGwtY29kZWdlbi1wbHVnaW4iIGRlcGVuZHM9ImluaXQiPgotCQkgPGFudCBkaXI9IiR7Y29kZWdlbi5wbHVnaW4uZm9sZGVyfSIgdGFyZ2V0PSJpbnN0YWxsLWNvZGVnZW4tcGx1Z2luIiAvPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJyZWxlYXNlLXBsdWdpbnMiIGRlcGVuZHM9ImluaXQiPgotCQk8YW50IGRpcj0iJHtzZXJ2aWNlLnBsdWdpbi5mb2xkZXJ9IiB0YXJnZXQ9InJlbGVhc2UtcGx1Z2luIiAvPgotCQk8YW50IGRpcj0iJHtjb2RlZ2VuLnBsdWdpbi5mb2xkZXJ9IiB0YXJnZXQ9InJlbGVhc2UtcGx1Z2luIiAvPgotCTwvdGFyZ2V0PgotCi0gICAgICAgIDx0YXJnZXQgbmFtZT0icmVsZWFzZS1jb2RlZ2VuLXBsdWdpbiIgZGVwZW5kcz0iaW5pdCI+Ci0JCSA8YW50IGRpcj0iJHtjb2RlZ2VuLnBsdWdpbi5mb2xkZXJ9IiB0YXJnZXQ9InJlbGVhc2UtcGx1Z2luIiAvPgotICAgICAgICA8L3RhcmdldD4KLQotICAgICAgICA8dGFyZ2V0IG5hbWU9InJlbGVhc2Utc2VydmljZS1wbHVnaW4iIGRlcGVuZHM9ImluaXQiPgotCQk8YW50IGRpcj0iJHtzZXJ2aWNlLnBsdWdpbi5mb2xkZXJ9IiB0YXJnZXQ9InJlbGVhc2UtcGx1Z2luIiAvPgotICAgICAgICA8L3RhcmdldD4KLQotCi0gICAgPHRhcmdldCBuYW1lPSJoZWxwIj4KLSAgICAgICAgICAgIDxlY2hvIG1lc3NhZ2U9IioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiIC8+Ci0gICAgICAgICAgICA8ZWNobyBtZXNzYWdlPSIqKiAgICAgICAgICAgICAgICAgICBFY2xpcHNlIFBsdWdpbiBCdWlsZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqIiAvPgotICAgICAgICAgICAgPGVjaG8gbWVzc2FnZT0iKiogIHByZS1yZXF1aXNpdCAgICAgICAgICAgIDogZW52LkVDTElQU0VfSE9NRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiIgLz4KLSAgICAgICAgICAgIDxlY2hvIG1lc3NhZ2U9IioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioiIC8+Ci0gICAgICAgICAgICA8ZWNobyBtZXNzYWdlPSIqKiAgYnVpbGQgcHJvamVjdHMgICAgICAgICAgOiBnZW5lcmF0ZS1wcm9qZWN0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICoqIiAvPgotICAgICAgICAgICAgPGVjaG8gbWVzc2FnZT0iKiogIGJ1aWxkIHNlcnZpY2UgcHJvamVjdCAgIDogZ2VuZXJhdGUtc2VydmljZS1wcm9qZWN0ICAgICAgICAgICAgICAgICAgICAqKiIgLz4KLSAgICAgICAgICAgIDxlY2hvIG1lc3NhZ2U9IioqICBidWlsZCBjb2RlZ2VuIHByb2plY3QgICA6IGdlbmVyYXRlLWNvZGVnZW4tcHJvamVjdCAgICAgICAgICAgICAgICAgICAgKioiIC8+Ci0gICAgICAgICAgICA8ZWNobyBtZXNzYWdlPSIqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqIiAvPgotICAgICAgICAgICAgPGVjaG8gbWVzc2FnZT0iKiogIGJ1aWxkIHBsdWdpbnMgICAgICAgICAgIDogZ2VuZXJhdGUtcGx1Z2lucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiIgLz4KLSAgICAgICAgICAgIDxlY2hvIG1lc3NhZ2U9IioqICBidWlsZCBzZXJ2aWNlIHBsdWdpbiAgICA6IGdlbmVyYXRlLXNlcnZpY2UtcGx1Z2luICAgICAgICAgICAgICAgICAgICAgKioiIC8+Ci0gICAgICAgICAgICA8ZWNobyBtZXNzYWdlPSIqKiAgYnVpbGQgY29kZWdlbiBwbHVnaW4gICAgOiBnZW5lcmF0ZS1jb2RlZ2VuLXBsdWdpbiAgICAgICAgICAgICAgICAgICAgICoqIiAvPgotICAgICAgICAgICAgPGVjaG8gbWVzc2FnZT0iKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiIgLz4KLSAgICAgICAgICAgIDxlY2hvIG1lc3NhZ2U9IioqICBpbnN0YWxsIHBsdWdpbnMgICAgICAgICA6IGluc3RhbGwtcGx1Z2lucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioiIC8+Ci0gICAgICAgICAgICA8ZWNobyBtZXNzYWdlPSIqKiAgaW5zdGFsbCBzZXJ2aWNlIHBsdWdpbiAgOiBpbnN0YWxsLXNlcnZpY2UtcGx1Z2luICAgICAgICAgICAgICAgICAgICAgICoqIiAvPgotICAgICAgICAgICAgPGVjaG8gbWVzc2FnZT0iKiogIGluc3RhbGwgY29kZWdlbiBwbHVnaW4gIDogaW5zdGFsbC1jb2RlZ2VuLXBsdWdpbiAgICAgICAgICAgICAgICAgICAgICAqKiIgLz4KLSAgICAgICAgICAgIDxlY2hvIG1lc3NhZ2U9IioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioiIC8+Ci0gICAgICAgICAgICA8ZWNobyBtZXNzYWdlPSIqKiAgcmVsZWFzZSBwbHVnaW5zICAgICAgICAgOiByZWxlYXNlLXBsdWdpbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqIiAvPgotICAgICAgICAgICAgPGVjaG8gbWVzc2FnZT0iKiogIHJlbGVhc2Ugc2VydmljZSBwbHVnaW4gIDogcmVsZWFzZS1zZXJ2aWNlLXBsdWdpbiAgICAgICAgICAgICAgICAgICAgICAqKiIgLz4KLSAgICAgICAgICAgIDxlY2hvIG1lc3NhZ2U9IioqICByZWxlYXNlIGNvZGVnZW4gcGx1Z2luICA6IHJlbGVhc2UtY29kZWdlbi1wbHVnaW4gICAgICAgICAgICAgICAgICAgICAgKioiIC8+Ci0gICAgICAgICAgICA8ZWNobyBtZXNzYWdlPSIqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqIiAvPgotICAgICAgICAgICAgPGVjaG8gbWVzc2FnZT0iKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiIgLz4KLSAgICAgICAgICAgIDxlY2hvIG1lc3NhZ2U9IioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiIC8+Ci0KLSAgICA8L3RhcmdldD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvY29uZi9jb2RlZ2VuLy5jbGFzc3BhdGggYi92MS41LjFSQzMvbW9kdWxlcy90b29sL2NvbmYvY29kZWdlbi8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2I1NzY2Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvY29uZi9jb2RlZ2VuLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMvbWFpbi9qYXZhIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImxpYiIgcGF0aD0iLi9saWIvZ2Vyb25pbW8tYWN0aXZhdGlvbl8xLjFfc3BlYy1AZ2Vyb25pbW8uc3BlYy5hY3RpdmF0aW9uLnZlcnNpb25ALmphciIgLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ibGliIiBwYXRoPSIuL2xpYi9hbnQtQGFudC52ZXJzaW9uQC5qYXIiIC8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImxpYiIgcGF0aD0iLi9saWIvYXhpb20tYXBpLUBheGlvbS52ZXJzaW9uQC5qYXIiIC8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImxpYiIgcGF0aD0iLi9saWIvYXhpb20tZG9tLUBheGlvbS52ZXJzaW9uQC5qYXIiIC8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImxpYiIgcGF0aD0iLi9saWIvYXhpb20taW1wbC1AYXhpb20udmVyc2lvbkAuamFyIiAvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJsaWIiIHBhdGg9Ii4vbGliL2NvbW1vbnMtbG9nZ2luZy1AY29tbW9ucy5sb2dnaW5nLnZlcnNpb25ALmphciIgLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ibGliIiBwYXRoPSIuL2xpYi9uZWV0aGktQG5lZXRoaS52ZXJzaW9uQC5qYXIiIC8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImxpYiIgcGF0aD0iLi9saWIvc3RheC1hcGktQHN0YXguYXBpLnZlcnNpb25ALmphciIgLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ibGliIiBwYXRoPSIuL2xpYi93c3R4LWFzbC1Ac3RheC5pbXBsLnZlcnNpb25ALmphciIgLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ibGliIiBwYXRoPSIuL2xpYi94bWxiZWFucy1AeG1sYmVhbnMudmVyc2lvbkAuamFyIiAvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJsaWIiIHBhdGg9Ii4vbGliL1htbFNjaGVtYS1AeG1sc2NoZW1hLnZlcnNpb25ALmphciIgLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ibGliIiBwYXRoPSIuL2xpYi9sb2c0ai1AbG9nNGoudmVyc2lvbkAuamFyIiAvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJsaWIiIHBhdGg9Ii4vbGliL3dzZGw0ai1Ad3NkbDRqLnZlcnNpb25ALmphciIgLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ibGliIiBwYXRoPSIuL2xpYi93b2Rlbi1hcGktQHdvZGVuLnZlcnNpb25ALmphciIgLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ibGliIiBwYXRoPSIuL2xpYi9jb21tb25zLWNvZGVjLUBjb21tb25zLmNvZGVjLnZlcnNpb25ALmphciIgLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ibGliIiBwYXRoPSIuL2xpYi9jb21tb25zLWh0dHBjbGllbnQtQGNvbW1vbnMuaHR0cGNsaWVudC52ZXJzaW9uQC5qYXIiIC8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImxpYiIgcGF0aD0iLi9saWIvYXhpczItQHZlcnNpb25ALmphciIgLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ibGliIiBwYXRoPSIuL2xpYi9nZXJvbmltby1qYXZhbWFpbF8xLjRfc3BlYy1AZ2Vyb25pbW8uc3BlYy5qYXZhbWFpbC52ZXJzaW9uQC5qYXIiIC8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImxpYiIgcGF0aD0iLi9saWIvbWFpbC1AamF2YXgubWFpbC52ZXJzaW9uQC5qYXIiIC8+Ci0gICAgICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJsaWIiIHBhdGg9Ii4vbGliL2dlcm9uaW1vLXdzLW1ldGFkYXRhXzIuMF9zcGVjLUBnZXJvbmltby5zcGVjLm1ldGFkYXRhLnZlcnNpb25ALmphciIgLz4KLTwvY2xhc3NwYXRoPgotCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2NvbmYvY29kZWdlbi8ucHJvamVjdCBiL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvY29uZi9jb2RlZ2VuLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMThiNGZjLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvY29uZi9jb2RlZ2VuLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08cHJvamVjdERlc2NyaXB0aW9uPg0KLQk8bmFtZT5BeGlzMi1Db2RlZ2VuV2l6YXJkPC9uYW1lPg0KLQk8Y29tbWVudD48L2NvbW1lbnQ+DQotCTxwcm9qZWN0cz4NCi0JPC9wcm9qZWN0cz4NCi0JPGJ1aWxkU3BlYz4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQk8L2J1aWxkU3BlYz4NCi0JPG5hdHVyZXM+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPg0KLQk8L25hdHVyZXM+DQotPC9wcm9qZWN0RGVzY3JpcHRpb24+DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9jb25mL2NvZGVnZW4vYnVpbGQucHJvcGVydGllcyBiL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvY29uZi9jb2RlZ2VuL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmY2ZhYmIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9jb25mL2NvZGVnZW4vYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLSMKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotc291cmNlLkF4aXMyQ29kZWdlbldpemFyZC5qYXIgPSBzcmMvbWFpbi9qYXZhLwotb3V0cHV0LkF4aXMyQ29kZWdlbldpemFyZC5qYXIgPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIEF4aXMyQ29kZWdlbldpemFyZC5qYXIsXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIGhlbHBfdG9jLnhtbCxcCi0gICAgICAgICAgICAgICBoZWxwLyxcCi0gICAgICAgICAgICAgICBsaWIvLFwKLSAgICAgICAgICAgICAgIHNyYy8sXAotICAgICAgICAgICAgICAgbGliL2dlcm9uaW1vLWFjdGl2YXRpb25fMS4xX3NwZWMtQGdlcm9uaW1vLnNwZWMuYWN0aXZhdGlvbi52ZXJzaW9uQC5qYXIsXAotICAgICAgICAgICAgICAgbGliL2Fubm9nZW4tQGFubm9nZW4udmVyc2lvbkAuamFyLFwKLSAgICAgICAgICAgICAgIGxpYi9hbnQtQGFudC52ZXJzaW9uQC5qYXIsXAotICAgICAgICAgICAgICAgbGliL2F4aW9tLWFwaS1AYXhpb20udmVyc2lvbkAuamFyLFwKLSAgICAgICAgICAgICAgIGxpYi9heGlvbS1kb20tQGF4aW9tLnZlcnNpb25ALmphcixcCi0gICAgICAgICAgICAgICBsaWIvYXhpb20taW1wbC1AYXhpb20udmVyc2lvbkAuamFyLFwKLSAgICAgICAgICAgICAgIGxpYi9heGlzMi1AdmVyc2lvbkAuamFyLFwKLSAgICAgICAgICAgICAgIGxpYi9jb21tb25zLWxvZ2dpbmctQGNvbW1vbnMubG9nZ2luZy52ZXJzaW9uQC5qYXIsXAotICAgICAgICAgICAgICAgbGliL2xvZzRqLUBsb2c0ai52ZXJzaW9uQC5qYXIsXAotICAgICAgICAgICAgICAgbGliL25lZXRoaS1AbmVldGhpLnZlcnNpb25ALmphcixcCi0gICAgICAgICAgICAgICBsaWIvc3RheC1hcGktQHN0YXguYXBpLnZlcnNpb25ALmphcixcCi0gICAgICAgICAgICAgICBsaWIvd3NkbDRqLUB3c2RsNGoudmVyc2lvbkAuamFyLFwKLSAgICAgICAgICAgICAgIGxpYi93c3R4LWFzbC1Ac3RheC5pbXBsLnZlcnNpb25ALmphcixcCi0gICAgICAgICAgICAgICBsaWIveG1sYmVhbnMtQHhtbGJlYW5zLnZlcnNpb25ALmphcixcCi0gICAgICAgICAgICAgICBsaWIvWG1sU2NoZW1hLUB4bWxzY2hlbWEudmVyc2lvbkAuamFyLFwKLSAgICAgICAgICAgICAgIGxpYi93b2Rlbi1Ad29kZW4udmVyc2lvbkAuamFyLFwKLQkgICAgICAgbGliL2NvbW1vbnMtaHR0cGNsaWVudC1AY29tbW9ucy5odHRwY2xpZW50LnZlcnNpb25ALmphcixcCi0JICAgICAgIGxpYi9jb21tb25zLWNvZGVjLUBjb21tb25zLmNvZGVjLnZlcnNpb25ALmphcixcCi0JICAgICAgIGxpYi9qaWJ4LWJpbmQtQGppYngudmVyc2lvbkAuamFyLFwKLQkgICAgICAgbGliL2ppYngtcnVuLUBqaWJ4LnZlcnNpb25ALmphcixcCi1zcmMuaW5jbHVkZXMgPSBpY29ucy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBzcmMvLFwKLSAgICAgICAgICAgICAgIGhlbHBfdG9jLnhtbCxcCi0gICAgICAgICAgICAgICBoZWxwLyxcCi0gICAgICAgICAgICAgICAucHJvamVjdCxcCi0gICAgICAgICAgICAgICAuY2xhc3NwYXRoLFwKLSAgICAgICAgICAgICAgIGJ1aWxkLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvY29uZi9jb2RlZ2VuL2hlbHBfdG9jLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvY29uZi9jb2RlZ2VuL2hlbHBfdG9jLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmVmZjhhOS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2NvbmYvY29kZWdlbi9oZWxwX3RvYy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTx0b2MgbGFiZWw9IkF4aXMyIENvZGUgR2VuZXJhdG9yIiA+Ci0gIDx0b3BpYyBsYWJlbD0iQ29kZSBHZW5lcmF0b3IiIGhyZWY9ImhlbHAvd3NkbDJqYXZhLXBsdWdpbi5odG1sIi8+Ci08L3RvYz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2NvbmYvY29kZWdlbi9pY29ucy9hc2YtZmVhdGhlci5naWYgYi92MS41LjFSQzMvbW9kdWxlcy90b29sL2NvbmYvY29kZWdlbi9pY29ucy9hc2YtZmVhdGhlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxZDFjMzMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9jb25mL2NvZGVnZW4vaWNvbnMvYXNmLWZlYXRoZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9jb25mL2NvZGVnZW4vaWNvbnMvaWNvbi5naWYgYi92MS41LjFSQzMvbW9kdWxlcy90b29sL2NvbmYvY29kZWdlbi9pY29ucy9pY29uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmUxNWQ4Yy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2NvbmYvY29kZWdlbi9pY29ucy9pY29uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvY29uZi9jb2RlZ2VuL3BsdWdpbi54bWwgYi92MS41LjFSQzMvbW9kdWxlcy90b29sL2NvbmYvY29kZWdlbi9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTg3YmY1Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvY29uZi9jb2RlZ2VuL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08cGx1Z2luCi0gICBpZD0iQXhpczJfQ29kZWdlbl9XaXphcmQiCi0gICBuYW1lPSJBeGlzMiBDb2RlZ2VuIFdpemFyZCBQbHVnLWluIgotICAgdmVyc2lvbj0iQGVjbGlwc2UucGx1Z2lucy52ZXJzaW9uQCIKLSAgIHByb3ZpZGVyLW5hbWU9IkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIgotICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudG9vbC5jb2RlZ2VuLmVjbGlwc2UucGx1Z2luLkNvZGVnZW5XaXphcmRQbHVnaW4iPgotCi0gICA8cnVudGltZT4KLSAgICAgIDxsaWJyYXJ5IG5hbWU9IkF4aXMyQ29kZWdlbldpemFyZC5qYXIiPgotICAgICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICAgICA8bGlicmFyeSBuYW1lPSJsaWIvZ2Vyb25pbW8tYWN0aXZhdGlvbl8xLjFfc3BlYy1AZ2Vyb25pbW8uc3BlYy5hY3RpdmF0aW9uLnZlcnNpb25ALmphciI+Ci0gICAgICAgICA8ZXhwb3J0IG5hbWU9IioiLz4KLSAgICAgIDwvbGlicmFyeT4KLSAgICAgIDxsaWJyYXJ5IG5hbWU9ImxpYi9nZXJvbmltby1zdGF4LWFwaV8xLjBfc3BlYy1AZ2Vyb25pbW8uc3BlYy5zdGF4LnZlcnNpb25ALmphciI+Ci0gICAgICAgICA8ZXhwb3J0IG5hbWU9IioiLz4KLSAgICAgIDwvbGlicmFyeT4KLSAgICAgIDxsaWJyYXJ5IG5hbWU9Ii4vbGliL2F4aW9tLWFwaS1AYXhpb20udmVyc2lvbkAuamFyIj4KLSAgICAgICAgIDxleHBvcnQgbmFtZT0iKiIvPgotICAgICAgPC9saWJyYXJ5PgotICAgICAgPGxpYnJhcnkgbmFtZT0iLi9saWIvYXhpb20tZG9tLUBheGlvbS52ZXJzaW9uQC5qYXIiPgotICAgICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICAgICA8bGlicmFyeSBuYW1lPSIuL2xpYi9heGlvbS1pbXBsLUBheGlvbS52ZXJzaW9uQC5qYXIiPgotICAgICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICAgICA8bGlicmFyeSBuYW1lPSJsaWIvY29tbW9ucy1sb2dnaW5nLUBjb21tb25zLmxvZ2dpbmcudmVyc2lvbkAuamFyIj4KLSAgICAgICAgIDxleHBvcnQgbmFtZT0iKiIvPgotICAgICAgPC9saWJyYXJ5PgotICAgICAgIDxsaWJyYXJ5IG5hbWU9ImxpYi9heGlzMi1AdmVyc2lvbkAuamFyIj4KLSAgICAgICA8ZXhwb3J0IG5hbWU9IioiLz4KLSAgICAgICA8L2xpYnJhcnk+Ci0gICAgICAgPGxpYnJhcnkgbmFtZT0ibGliL2xvZzRqLUBsb2c0ai52ZXJzaW9uQC5qYXIiPgotICAgICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICAgICA8bGlicmFyeSBuYW1lPSJsaWIvbmVldGhpLUBuZWV0aGkudmVyc2lvbkAuamFyIj4KLSAgICAgICAgIDxleHBvcnQgbmFtZT0iKiIvPgotICAgICAgPC9saWJyYXJ5PgotICAgICAgPGxpYnJhcnkgbmFtZT0ibGliL3dzZGw0ai1Ad3NkbDRqLnZlcnNpb25ALmphciI+Ci0gICAgICAgICA8ZXhwb3J0IG5hbWU9IioiLz4KLSAgICAgIDwvbGlicmFyeT4KLSAgICAgIDxsaWJyYXJ5IG5hbWU9ImxpYi94bWxiZWFucy1AeG1sYmVhbnMudmVyc2lvbkAuamFyIj4KLSAgICAgICAgIDxleHBvcnQgbmFtZT0iKiIvPgotICAgICAgPC9saWJyYXJ5PgotICAgICAgPGxpYnJhcnkgbmFtZT0ibGliL1htbFNjaGVtYS1AeG1sc2NoZW1hLnZlcnNpb25ALmphciI+Ci0gICAgICAgICA8ZXhwb3J0IG5hbWU9IioiLz4KLSAgICAgIDwvbGlicmFyeT4KLSAgICAgIDxsaWJyYXJ5IG5hbWU9ImxpYi93b2Rlbi1Ad29kZW4udmVyc2lvbkAuamFyIj4KLSAgICAgICAgIDxleHBvcnQgbmFtZT0iKiIvPgotICAgICAgPC9saWJyYXJ5PgotICAgICAgPGxpYnJhcnkgbmFtZT0ibGliL2NvbW1vbnMtaHR0cGNsaWVudC1AY29tbW9ucy5odHRwY2xpZW50LnZlcnNpb25ALmphciI+Ci0gICAgICAgICA8ZXhwb3J0IG5hbWU9IioiLz4KLSAgICAgIDwvbGlicmFyeT4KLSAgICAgIDxsaWJyYXJ5IG5hbWU9ImxpYi9jb21tb25zLWNvZGVjLUBjb21tb25zLmNvZGVjLnZlcnNpb25ALmphciI+Ci0gICAgICAgICA8ZXhwb3J0IG5hbWU9IioiLz4KLSAgICAgIDwvbGlicmFyeT4KLSAgICAgIDxsaWJyYXJ5IG5hbWU9ImxpYi9qaWJ4LWJpbmQtQGppYngudmVyc2lvbkAuamFyIj4KLSAgICAgICAgIDxleHBvcnQgbmFtZT0iKiIvPgotICAgICAgPC9saWJyYXJ5PgotICAgICAgPGxpYnJhcnkgbmFtZT0ibGliL2ppYngtcnVuLUBqaWJ4LnZlcnNpb25ALmphciI+Ci0gICAgICAgICA8ZXhwb3J0IG5hbWU9IioiLz4KLSAgICAgIDwvbGlicmFyeT4KLSAgICAgIDxsaWJyYXJ5IG5hbWU9ImxpYi9tYWlsLUBqYXZheC5tYWlsLnZlcnNpb25ALmphciI+Ci0gICAgICAgICA8ZXhwb3J0IG5hbWU9IioiLz4KLSAgICAgIDwvbGlicmFyeT4KLSAgICAgIDxsaWJyYXJ5IG5hbWU9ImxpYi9nZXJvbmltby13cy1tZXRhZGF0YV8yLjBfc3BlYy1AZ2Vyb25pbW8uc3BlYy5tZXRhZGF0YS52ZXJzaW9uQC5qYXIiPgotICAgICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICA8L3J1bnRpbWU+Ci0KLSAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLmlkZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmFwYWNoZS5hbnQiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5uZXdXaXphcmRzIj4KLSAgICAgIDxjYXRlZ29yeQotICAgICAgICAgICAgbmFtZT0iQXhpczIgV2l6YXJkcyIKLSAgICAgICAgICAgIGlkPSJBeGlzMl9XaXphcmRzIj4KLSAgICAgIDwvY2F0ZWdvcnk+Ci0gICAgICA8d2l6YXJkCi0gICAgICAgICAgICBuYW1lPSJBeGlzMiBDb2RlIEdlbmVyYXRvciIKLSAgICAgICAgICAgIGljb249Imljb25zL2ljb24uZ2lmIgotICAgICAgICAgICAgY2F0ZWdvcnk9IkF4aXMyX1dpemFyZHMiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50b29sLmNvZGVnZW4uZWNsaXBzZS5Db2RlR2VuV2l6YXJkIgotICAgICAgICAgICAgaWQ9Im9yZy5hcGFjaGUuYXhpczIudG9vbC5jb2RlZ2VuLmVjbGlwc2UuQ29kZUdlbldpemFyZCI+Ci0gICAgICA8L3dpemFyZD4KLSAgIDwvZXh0ZW5zaW9uPgotICAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj4KLSAgICA8dG9jIGZpbGU9ImhlbHBfdG9jLnhtbCIgcHJpbWFyeT0idHJ1ZSIgLz4KLTwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvY29uZi9jb2RlZ2VuL3JlYWRtZS50eHQgYi92MS41LjFSQzMvbW9kdWxlcy90b29sL2NvbmYvY29kZWdlbi9yZWFkbWUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDk4OWNmLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvY29uZi9jb2RlZ2VuL3JlYWRtZS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi1BeGlzMiBFY2xpcHNlIENvZGVnZW4gV2l6YXJkIEluc3RhbGxhdGlvbg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotDQotMSkgU2h1dCBkb3duIEVjbGlwc2UgSURFLCBpZiBhbHJlYWR5IHJ1bm5pbmcuDQotMikgUGxlYXNlIHJlbW92ZSBleGlzdGluZyBBeGlzMiBDb2RlZ2VuIFdpemFyZHMgaW5zaWRlIEVDTElQU0VfSE9NRS9wbHVnaW5zIGRpcmVjdG9yeS4NCi0zKSBjb3B5IHRoZSBBeGlzMl9Db2RlZ2VuX1dpemFyZF88Y3VycmVudF92ZXJzaW9uPiBmb2xkZXIgdG8gdGhlIEVDTElQU0VfSE9NRS9wbHVnaW5zIGRpcmVjdG9yeS4NCi00KSBTdGFydCBFY2xpcHNlLg0KLTUpIEF4aXMyIHdpemFyZHMgYXJlIGF2YWlsYWJsZSBhdCBGaWxlIC0+IG5ldyAtPiBvdGhlci4gWyAgY3RsICtuICBdDQotDQotDQotTm90ZSA6IFRoZSBBeGlzMiBjb2RlZ2VuIHdpemFyZCBlbGNpcHNlIHBsdWdpbiBvbmx5IGNvbXBhdGlibGUgd2l0aCBFY2xpcHNlIDMuMSB1cHdhcmRzLiAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2NvbmYvc2VydmljZS8uY2xhc3NwYXRoIGIvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9jb25mL3NlcnZpY2UvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNlZjc3OC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2NvbmYvc2VydmljZS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjL21haW4vamF2YSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJsaWIiIHBhdGg9Ii4vbGliL2FudC1AYW50LnZlcnNpb25ALmphciIgLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ibGliIiBwYXRoPSIuL2xpYi9jb21tb25zLWxvZ2dpbmctQGNvbW1vbnMubG9nZ2luZy52ZXJzaW9uQC5qYXIiIC8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImxpYiIgcGF0aD0iLi9saWIvbG9nNGotQGxvZzRqLnZlcnNpb25ALmphciIgLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ibGliIiBwYXRoPSIuL2xpYi9heGlzMi1AdmVyc2lvbkAuamFyIiAvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2NvbmYvc2VydmljZS8ucHJvamVjdCBiL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvY29uZi9zZXJ2aWNlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTA4NDEzLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvY29uZi9zZXJ2aWNlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+QXhpczItU2VydmljZUFyY2hpdmVyPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvY29uZi9zZXJ2aWNlL2J1aWxkLnByb3BlcnRpZXMgYi92MS41LjFSQzMvbW9kdWxlcy90b29sL2NvbmYvc2VydmljZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODQ4ZTY5Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvY29uZi9zZXJ2aWNlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0jCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLXNvdXJjZS5BeGlzX1NlcnZpY2VfQXJjaGl2ZXIuamFyID0gc3JjL21haW4vamF2YS8KLW91dHB1dC5BeGlzX1NlcnZpY2VfQXJjaGl2ZXIuamFyID0gYmluLwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgaGVscF90b2MueG1sLFwKLSAgICAgICAgICAgICAgIGhlbHAvLFwKLSAgICAgICAgICAgICAgIGxpYi8sXAotICAgICAgICAgICAgICAgc3JjLyxcCi0gICAgICAgICAgICAgICBsaWIvYXhpczItQHZlcnNpb25ALmphcixcCi0gICAgICAgICAgICAgICBsaWIvY29tbW9ucy1sb2dnaW5nLUBjb21tb25zLmxvZ2dpbmcudmVyc2lvbkAuamFyLFwKLSAgICAgICAgICAgICAgIGxpYi9sb2c0ai1AbG9nNGoudmVyc2lvbkAuamFyLFwKLSAgICAgICAgICAgICAgIGxpYi9hbnQtQGFudC52ZXJzaW9uQC5qYXIsXAotICAgICAgICAgICAgICAgQXhpc19TZXJ2aWNlX0FyY2hpdmVyLmphcgotc3JjLmluY2x1ZGVzID0gaWNvbnMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgc3JjLyxcCi0gICAgICAgICAgICAgICBoZWxwX3RvYy54bWwsXAotICAgICAgICAgICAgICAgaGVscC8sXAotICAgICAgICAgICAgICAgLnByb2plY3QsXAotICAgICAgICAgICAgICAgLmNsYXNzcGF0aCxcCi0gICAgICAgICAgICAgICBidWlsZC5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2NvbmYvc2VydmljZS9oZWxwX3RvYy54bWwgYi92MS41LjFSQzMvbW9kdWxlcy90b29sL2NvbmYvc2VydmljZS9oZWxwX3RvYy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlZjI1YWUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9jb25mL3NlcnZpY2UvaGVscF90b2MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08dG9jIGxhYmVsPSJBeGlzMiBTZXJ2aWNlIEFyY2hpdmVyIiA+Ci0gIDx0b3BpYyBsYWJlbD0iU2VydmljZSBBcmNoaXZlciIgaHJlZj0iaGVscC9zZXJ2aWNlYXJjaGl2ZXItcGx1Z2luLmh0bWwiLz4KLTwvdG9jPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvY29uZi9zZXJ2aWNlL2ljb25zL2FzZi1mZWF0aGVyLmdpZiBiL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvY29uZi9zZXJ2aWNlL2ljb25zL2FzZi1mZWF0aGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFkMWMzMy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2NvbmYvc2VydmljZS9pY29ucy9hc2YtZmVhdGhlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2NvbmYvc2VydmljZS9pY29ucy9zYW1wbGUuZ2lmIGIvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9jb25mL3NlcnZpY2UvaWNvbnMvc2FtcGxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmUxNWQ4Yy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy90b29sL2NvbmYvc2VydmljZS9pY29ucy9zYW1wbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9jb25mL3NlcnZpY2UvcGx1Z2luLnhtbCBiL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvY29uZi9zZXJ2aWNlL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyMTFjZDYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9jb25mL3NlcnZpY2UvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHBsdWdpbgotICAgaWQ9IkF4aXMyX1NlcnZpY2VfQXJjaGl2ZXIiCi0gICBuYW1lPSJBeGlzMiBTZXJ2aWNlIE1ha2VyIgotICAgdmVyc2lvbj0iQGVjbGlwc2UucGx1Z2lucy52ZXJzaW9uQCIKLSAgIHByb3ZpZGVyLW5hbWU9IkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIgotICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudG9vbC5zZXJ2aWNlLmVjbGlwc2UucGx1Z2luLlNlcnZpY2VBcmNoaXZlciI+Ci0KLSAgIDxydW50aW1lPgotICAgICAgPGxpYnJhcnkgbmFtZT0iQXhpc19TZXJ2aWNlX0FyY2hpdmVyLmphciI+Ci0gICAgICAgICA8ZXhwb3J0IG5hbWU9IioiLz4KLSAgICAgIDwvbGlicmFyeT4KLSAgICAgICA8bGlicmFyeSBuYW1lPSJsaWIvYXhpczItQHZlcnNpb25ALmphciI+Ci0gICAgICAgICAgIDxleHBvcnQgbmFtZT0iKiIvPgotICAgICAgIDwvbGlicmFyeT4KLSAgICAgICA8bGlicmFyeSBuYW1lPSJsaWIvY29tbW9ucy1sb2dnaW5nLUBjb21tb25zLmxvZ2dpbmcudmVyc2lvbkAuamFyIj4KLSAgICAgICAgIDxleHBvcnQgbmFtZT0iKiIvPgotICAgICAgPC9saWJyYXJ5PgotICAgICAgPGxpYnJhcnkgbmFtZT0ibGliL2xvZzRqLUBsb2c0ai52ZXJzaW9uQC5qYXIiPgotICAgICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICAgICA8bGlicmFyeSBuYW1lPSJsaWIvYW50LUBhbnQudmVyc2lvbkAuamFyIj4KLSAgICAgICAgIDxleHBvcnQgbmFtZT0iKiIvPgotICAgICAgPC9saWJyYXJ5PgotICAgPC9ydW50aW1lPgotCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS5pZGUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5hcGFjaGUuYW50Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuamZhY2UudGV4dCIvPgotICAgPC9yZXF1aXJlcz4KLQotPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm5ld1dpemFyZHMiPgotICAgICAgPGNhdGVnb3J5Ci0gICAgICAgICAgICBuYW1lPSJBeGlzMiBXaXphcmRzIgotICAgICAgICAgICAgaWQ9IkF4aXMyX1dpemFyZHMiPgotICAgICAgPC9jYXRlZ29yeT4KLSAgICAgIDx3aXphcmQKLSAgICAgICAgICAgIG5hbWU9IkF4aXMyIFNlcnZpY2UgQXJjaGl2ZXIiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9zYW1wbGUuZ2lmIgotICAgICAgICAgICAgY2F0ZWdvcnk9IkF4aXMyX1dpemFyZHMiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50b29sLnNlcnZpY2UuZWNsaXBzZS51aS5TZXJ2aWNlQXJjaGl2ZVdpemFyZCIKLSAgICAgICAgICAgIGlkPSJvcmcuYXBhY2hlLmF4aXMyLnRvb2wuc2VydmljZS5zZXJ2aWNlV2l6YXJkIj4KLSAgICAgIDwvd2l6YXJkPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI+Ci0gICAgPHRvYyBmaWxlPSJoZWxwX3RvYy54bWwiIHByaW1hcnk9InRydWUiIC8+Ci08L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9jb25mL3NlcnZpY2UvcmVhZG1lLnR4dCBiL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvY29uZi9zZXJ2aWNlL3JlYWRtZS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0MWI2MGYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9jb25mL3NlcnZpY2UvcmVhZG1lLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLUF4aXMyIEVjbGlwc2UgU2VydmljZSBBcmNoaXZlciBXaXphcmQgSW5zdGFsbGF0aW9uDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0NCi0xKSBTaHV0IGRvd24gRWNsaXBzZSBJREUsIGlmIGFscmVhZHkgcnVubmluZy4NCi0yKSBJZiBwcmV2aW91cyB2ZXJzaW9ucyBvZiB0aGUgc2FtZSBwbHVnaW4gZXhpc3RzLCANCi0gICBwbGVhc2UgcmVtb3ZlIGV4aXN0aW5nIEF4aXMyIFNlcnZpY2UgQXJjaGl2ZXIgV2l6YXJkIGluc2lkZSBFQ0xJUFNFX0hPTUUvcGx1Z2lucyBkaXJlY3RvcnkuDQotMykgY29weSB0aGUgQXhpc19TZXJ2aWNlX0FyY2hpdmVyXzxjdXJyZW50X3ZlcnNpb24+IGZvbGRlciB0byB0aGUgRUNMSVBTRV9IT01FL3BsdWdpbnMgZGlyZWN0b3J5Lg0KLTQpIFN0YXJ0IEVjbGlwc2UuDQotNSkgQXhpczIgd2l6YXJkcyBhcmUgYXZhaWxhYmxlIGF0IEZpbGUgLT4gbmV3IC0+IG90aGVyLiBbICBjdGwgK24gIF0NCi0NCi0NCi1Ob3RlIDogVGhlIEF4aXMyIHNlcnZpY2UgYXJjaGl2ZXIgd2l6YXJkIGVsY2lwc2UgcGx1Z2luIG9ubHkgY29tcGF0aWJsZSB3aXRoIEVjbGlwc2UgMy4xIHVwd2FyZHMuIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvcmVhZG1lLnR4dCBiL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvcmVhZG1lLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY5NzdhNy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy90b29sL3JlYWRtZS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi09PT09PT09PT09PT09PT09Ci1Vc2luZyB0aGUgdG9vbHMgIAotPT09PT09PT09PT09PT09PQotCi09PT09PT09PT09PT09PT09PT09PT09PT09Ci0oMSkgQXhpczIgZWxjaXBzZSBwbHVnaW5zCi09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLU5vdGUgLSBUaGUgcGx1Z2lucyBhcmUgc3BlY2lmaWNhbGx5cXAgZm9yIEVjbGlwc2UgdmVyc2lvbiAzLjEgYW5kIHVwCi0KLU1hdmVuMiBCdWlsZAotLS0tLS0tLS0tLS0tCi0JKiBUbyBidWlsZCB0aGUgZWNsaXBzZSBwbHVnaW4gdHlwZSAibXZuIGNsZWFuIGluc3RhbGwgLURtYXZlbi50ZXN0LnNraXA9dHJ1ZSIgY29tbWFuZCBpbiB0aGUKLQkgIHRvb2xzL2F4aXMyLWVjbGlwc2UtPG5hbWU+LXBsdWdpbiBkaXJlY3RvcnkKLQkqIElmIHlvdSBoYXZlIGFscmVhZHkgZG93bmxvYWRlZCB0aGUgbWF2ZW4gYXJ0aWZhY3RzIHlvdSBjYW4gaW52b2tlIGEgbG9jYWwgYnVpbGQgYnkKLSAgICAgICAgICBzYW1lIGRpcmVjdG9yeSJtdm4gY2xlYW4gaW5zdGFsbCAtRG1hdmVuLnRlc3Quc2tpcD10cnVlIC1vIgotICAgICAgICAqIEFmdGVyIHRoZSBzdWNjZXNzZnVsIGJ1aWxkIHRoZSB6aXAgdmVyc2lvbiBvZiB0aGUgcGx1Z2luIHdpbGwgYmUgYXZhaWxhYmxlIGF0Ci0gICAgICAgICAgdG9vbHMvYXhpczItZWNsaXBzZS08bmFtZT4tcGx1Z2luL3RhcmdldC9kaXN0IGRpcmVjdG9yeQotCSogVG8gcnVuIHRoZSBwbHVnaW4geW91IG5lZWQgcGxlYXNlIHJlZmVyIHRvLAotCSAgIC0gVG9vbHMgUGFnZSBPbiBBcGFjaGUgQXhpcyAyIERvY3VtZW50YXRpb24gIGh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL3Rvb2xzLwotCi1BbnQgQnVpbGQKLS0tLS0tLS0tLQotCUNyZWF0ZSBFY2xpcHNlIFBsdWdpbiBQcm9qZWN0cwotCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0JKiBTaW5jZSB0aGUgc291cmNlIGZvciB0aGUgdG9vbHMgaGFzIGEgZGVwZW5kZW5jeSBvbiB0aGUgZWNsaXBzZSBjbGFzc2VzLiBvbmUgaGFzIHRvIHJ1biB0aGUKLQkgIGFudCBidWlsZCBmaWxlIChidWlsZC54bWwpIHRvIGdlbmVyYXRlIGEgcmVsZXZhbnQgZWNsaXBzZSBwcm9qZWN0IGZyb20gdGhlIHNvdXJjZS4KLQkgIAotCSogSW4gb3JkZXIgdG8gY29tcGlsZSB0aGUgcGx1Z2luIGZpcnN0IHlvdSBtdXN0IGRvIGEgbWF2ZW4gY3JlYXRlLWxpYiBvbiBBeGlzMiBTb3VyY2UgYW5kCi0JICBzZXQgRUNMSVBTRV9IT01FIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIHBvaW50IHRvIHlvdXIgZWNsaXBzZSBob21lIGRpcmVjdG9yeS4gIAotCQotCSogdXNlIHRoZSBhbnQgZ2VuZXJhdGUtcHJvamVjdHMgY29tbWFuZCB0byBnZW5lcmF0ZSB0aGUgcGx1Z2luIHByb2plY3RzLgotCQotCSogT25jZSB0aGUgcHJvamVjdHMgYXJlIGdlbmVyYXRlZCBpbiBlYWNoIGVjbGlwc2UgcGx1Z2luIGRpcmVjdG9yeSB1bmRlciB0b29scyBkaXJlY3RvcnkKLSAgICAgICAgICAoYXhpczItZWNsaXBzZS1zZXJ2aWNlLXBsdWdpbiBhbmQgYXhpczItZWNsaXBzZS1jb2RlZ2VuLXBsdWdpbikgdGhleSBjYW4gYmUgb3BlbmVkIGFzIGEgRWNsaXBzZSBQREUKLQkgIGZvciBidWlsZGluZyBhbmQgZWRpdGluZy4KLQkgIAotCSogVGhpcyBjYW4gYmUgZG9uZSBieSBGaWxlIC0+IEltcG9ydCAtPiBFeGlzdGluZyBwcm9qZWN0IGludG8gd29ya3NwYWNlIG9uIEVsY2lwc2UgbWVudSBhbmQgCi0JICBwb2ludCB0aGF0IHRvIHRoZSBhbnkgb2YgZWNsaXBzZSBwbHVnaW4gZGlyZWN0b3J5IHVuZGVyIHRvb2xzIGRpcmVjdG9yeS4KLQotCUJ1aWxkIEVjbGlwc2UgUGx1Z2luIFByb2plY3RzCi0JLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLQkqIEJ1aWxkIGFuZCBpbnN0YWxsIHRoZSBlY2xpcHNlIHBsdWdpbiB0byB5b3VyIGxvY2FsIGVjbGlwc2UgcGx1Z2luIGRpcmVjdG9yeS4KLSAgICAgICAgICAgICAgICAqIEluIG9yZGVyIHRvIGNvbXBpbGUgdGhlIHBsdWdpbiBmaXJzdCB5b3UgbXVzdCBkbyBhIG1hdmVuIGNyZWF0ZS1saWIgb24gQXhpczIgU291cmNlIGFuZAotICAgICAgICAgICAgICAgICAgc2V0IEVDTElQU0VfSE9NRSBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBwb2ludCB0byB5b3VyIGVjbGlwc2UgaG9tZSBkaXJlY3RvcnkuCi0gICAgICAgICAgICAgICAgKiBzdG9wIGVjbHBzZSBpZiBzdGlsbCBvbiBvcGVyYXRpb24uCi0gICAgICAgICAgICAgICAgKiB1c2UgYW50IGluc3RhbGwtcGx1Z2lucyAKLSAgICAgICAgICAgICAgICAqIHN0YXJ0IGVjbGlwc2UKLSAgICAgICAgICAgICAgICAqIHBsdWdpbnMgd2lsbCBiZSBhY2Nlc3NpYmxlIHRocm91Z2ggW0ZpbGUgLT4gTmV3IC0+IE90aGVyXSBjdGwrbiB1bmRlciBBeGlzMiBXaXphcmRzLgotCi0JKiBSZWxlYXNlIHRoZSBwbHVnaW5zIGluIGNvbXByZXNzZWQgZm9ybWF0Ci0gICAgICAgICAgICAgICAgKiBJbiBvcmRlciB0byBjb21waWxlIHRoZSBwbHVnaW4gZmlyc3QgeW91IG11c3QgZG8gYSBtYXZlbiBjcmVhdGUtbGliIG9uIEF4aXMyIFNvdXJjZSBhbmQKLSAgICAgICAgICAgICAgICAgIHNldCBFQ0xJUFNFX0hPTUUgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gcG9pbnQgdG8geW91ciBlY2xpcHNlIGhvbWUgZGlyZWN0b3J5LgotICAgICAgICAgICAgICAgICogc3RvcCBlY2xwc2UgaWYgc3RpbGwgb24gb3BlcmF0aW9uLgotICAgICAgICAgICAgICAgICogYW50IHJlbGVhc2UtcGx1Z2lucwotICAgICAgICAgICAgICAgICogcGx1Z2lucyB3aWxsIGJlIGF2YWlsYWJsZSBhdCB0YXJnZXQvZWNsaXBzZV9wcm9qZWN0cy9yZWxlYXNlCi0JCi0JKiBUaGUgdG9vbCBzb3VyY2VzIGFyZSBub3QgaW5jbHVkZWQgaW4gdGhlIGJ1aWxkCi0JCi0JKiBUbyBydW4gdGhlIHBsdWdpbiB5b3UgbmVlZCBwbGVhc2UgcmVmZXIgdG8sCi0JCS0gVG9vbHMgUGFnZSBPbiBBcGFjaGUgQXhpcyAyIERvY3VtZW50YXRpb24gIGh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL3Rvb2xzLwotCi0KLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0oMikgQXhpczIgSW50ZWxsaWogSWRlYSBwbHVnaW4KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1NYXZlbiBidWlsZAotLS0tLS0tLS0tLS0KLQotICAgICAgICAqIFRvIGJ1aWxkIHRoZSBwbHVnaW4gdHlwZSBtYXZlbiBjb21tYW5kIGluIHRoZSB0b29scy9heGlzMi1pZGVhLXBsdWdpbiBkaXJlY3RvcnkKLSAgICAgICAgKiBJZiB5b3UgaGF2ZSBhbHJlYWR5IGRvd25sb2FkZWQgdGhlIG1hdmVuIGFydGlmYWN0cyB5b3UgY2FuIGludm9rZSBhIGxvY2FsIGJ1aWxkIGJ5IG1hdmVuIC1vCi0gICAgICAgICAgc2FtZSBkaXJlY3RvcnkKLSAgICAgICAgKiBBZnRlciB0aGUgc3VjY2Vzc2Z1bCBidWlsZCB0aGUgemlwIHZlcnNpb24gb2YgdGhlIHBsdWdpbiB3aWxsIGJlIGF2YWlsYWJsZSBhdAotICAgICAgICAgIHRvb2xzL2F4aXMyLWlkZWEtcGx1Z2luL3RhcmdldCBkaXJlY3RvcnkKLQkgICAgKiBUbyBydW4gdGhlIHBsdWdpbiB5b3UgbmVlZCBwbGVhc2UgcmVmZXIgdG8sCi0JCSAgICAtIFRvb2xzIFBhZ2UgT24gQXBhY2hlIEF4aXMgMiBEb2N1bWVudGF0aW9uICBodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi90b29scy8KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvc2NyaXB0L2F4aXMyLmJhdCBiL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvc2NyaXB0L2F4aXMyLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODllMTBmZC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy90b29sL3NjcmlwdC9heGlzMi5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi1AZWNobyBvZmYNCi0NCi1SRU0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi1SRU0gIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotUkVNICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLVJFTSAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotUkVNICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotUkVNICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotUkVNICB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi1SRU0gIA0KLVJFTSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotUkVNICANCi1SRU0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi1SRU0gIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotUkVNICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi1SRU0gIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotUkVNICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotUkVNICB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi1yZW0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotcmVtIEF4aXMyIFNjcmlwdA0KLXJlbQ0KLXJlbSBFbnZpcm9ubWVudCBWYXJpYWJsZSBQcmVxdWlzaXRlcw0KLXJlbQ0KLXJlbSAgIEFYSVMyX0hPTUUgICAgICBNdXN0IHBvaW50IGF0IHlvdXIgQVhJUzIgZGlyZWN0b3J5DQotcmVtDQotcmVtICAgSkFWQV9IT01FICAgICAgIE11c3QgcG9pbnQgYXQgeW91ciBKYXZhIERldmVsb3BtZW50IEtpdCBpbnN0YWxsYXRpb24uDQotcmVtDQotcmVtICAgSkFWQV9PUFRTICAgICAgIChPcHRpb25hbCkgSmF2YSBydW50aW1lIG9wdGlvbnMNCi1yZW0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotc2V0IENVUlJFTlRfRElSPSVjZCUNCi0NCi1yZW0gTWFrZSBzdXJlIHByZXJlcXVpc2l0ZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlIHNldA0KLWlmIG5vdCAiJUpBVkFfSE9NRSUiID09ICIiIGdvdG8gZ290SmF2YUhvbWUNCi1lY2hvIFRoZSBKQVZBX0hPTUUgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgbm90IGRlZmluZWQNCi1lY2hvIFRoaXMgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgbmVlZGVkIHRvIHJ1biB0aGlzIHByb2dyYW0NCi1nb3RvIGVuZA0KLTpnb3RKYXZhSG9tZQ0KLWlmIG5vdCBleGlzdCAiJUpBVkFfSE9NRSVcYmluXGphdmEuZXhlIiBnb3RvIG5vSmF2YUhvbWUNCi1nb3RvIG9rSmF2YUhvbWUNCi06bm9KYXZhSG9tZQ0KLWVjaG8gVGhlIEpBVkFfSE9NRSBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBub3QgZGVmaW5lZCBjb3JyZWN0bHkNCi1lY2hvIFRoaXMgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgbmVlZGVkIHRvIHJ1biB0aGlzIHByb2dyYW0NCi1lY2hvIE5COiBKQVZBX0hPTUUgc2hvdWxkIHBvaW50IHRvIGEgSkRLL0pSRQ0KLWdvdG8gZW5kDQotOm9rSmF2YUhvbWUNCi0NCi1yZW0gY2hlY2sgdGhlIEFYSVMyX0hPTUUgZW52aXJvbm1lbnQgdmFyaWFibGUNCi1pZiBub3QgIiVBWElTMl9IT01FJSIgPT0gIiIgZ290byBnb3RIb21lDQotc2V0IEFYSVMyX0hPTUU9JUNVUlJFTlRfRElSJQ0KLWlmIGV4aXN0ICIlQVhJUzJfSE9NRSVcYmluXGphdmEyd3NkbC5iYXQiIGdvdG8gb2tIb21lDQotDQotcmVtIGd1ZXNzIHRoZSBob21lLiBKdW1wIG9uZSBkaXJlY3RvcnkgdXAgdG8gY2hlY2sgaWYgdGhhdCBpcyB0aGUgaG9tZQ0KLWNkIC4uDQotc2V0IEFYSVMyX0hPTUU9JWNkJQ0KLWNkICIlQ1VSUkVOVF9ESVIlIg0KLQ0KLTpnb3RIb21lDQotaWYgRVhJU1QgIiVBWElTMl9IT01FJVxsaWJcYXhpczIqLmphciIgZ290byBva0hvbWUNCi1lY2hvIFRoZSBBWElTMl9IT01FIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIG5vdCBkZWZpbmVkIGNvcnJlY3RseQ0KLWVjaG8gVGhpcyBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBuZWVkZWQgdG8gcnVuIHRoaXMgcHJvZ3JhbQ0KLWdvdG8gZW5kDQotDQotOm9rSG9tZQ0KLXJlbSBzZXQgdGhlIGNsYXNzZXMNCi1zZXRsb2NhbCBFbmFibGVEZWxheWVkRXhwYW5zaW9uDQotDQotcmVtIC0tLS0tIEV4ZWN1dGUgVGhlIFJlcXVlc3RlZCBDb21tYW5kIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLWVjaG8gVXNpbmcgQVhJUzJfSE9NRTogICAlQVhJUzJfSE9NRSUNCi1lY2hvIFVzaW5nIEpBVkFfSE9NRTogICAgJUpBVkFfSE9NRSUNCi1zZXQgX1JVTkpBVkE9IiVKQVZBX0hPTUUlXGJpblxqYXZhIg0KLQ0KLSVfUlVOSkFWQSUgJUpBVkFfT1BUUyUgLURqYXZhLmV4dC5kaXJzPSIlQVhJUzJfSE9NRSVcbGliXCIgLURheGlzMi5yZXBvPSIlQVhJUzJfSE9NRSVccmVwb3NpdG9yeSIgLURheGlzMi54bWw9IiVBWElTMl9IT01FJVxjb25mXGF4aXMyLnhtbCIgJSoNCi1lbmRsb2NhbA0KLTplbmQNCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy90b29sL3NjcmlwdC9heGlzMi5zaCBiL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvc2NyaXB0L2F4aXMyLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzM4NjBkLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvc2NyaXB0L2F4aXMyLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotIyEvYmluL3NoCi0KLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIyAKLSMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jIAotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgICAgQXhpczIgU2NyaXB0Ci0jCi0jIFByZS1yZXF1aXNpdGVzCi0jICAgLSBzZXRlbnYuc2ggbXVzdCBoYXZlIGJlZW4gY2FsbGVkLgotIwotIyAgIEFYSVMyX0hPTUUgICBIb21lIG9mIEF4aXMyIGluc3RhbGxhdGlvbi4gSWYgbm90IHNldCBJIHdpbGwgIHRyeQotIyAgICAgICAgICAgICAgICAgICB0byBmaWd1cmUgaXQgb3V0LgotIwotIyAgIEpBVkFfSE9NRSAgICAgICBNdXN0IHBvaW50IGF0IHlvdXIgSmF2YSBEZXZlbG9wbWVudCBLaXQgaW5zdGFsbGF0aW9uLgotIwotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jIEdldCB0aGUgY29udGV4dCBhbmQgZnJvbSB0aGF0IGZpbmQgdGhlIGxvY2F0aW9uIG9mIHNldGVudi5zaAotZGlyPWBkaXJuYW1lICIkMCJgCi0uICIke2Rpcn0iL3NldGVudi5zaAotCi0jYWRkIGFueSB1c2VyIGdpdmVuIGNsYXNzcGF0aCdzCi1VU0VSX0NPTU1BTkRTPSIiCi1wcmVhcmc9IiIKLWZvciBhcmcgaW4gIiRAIgotZG8KLSAgIGlmIFsgIiRhcmciICE9IC1jbGFzc3BhdGggXSAmJiBbICIkYXJnIiAhPSAtY3AgXSAmJiBbICIkcHJlYXJnIiAhPSAtY2xhc3NwYXRoIF0gJiYgWyAiJHByZWFyZyIgIT0gLWNwICBdCi0gICB0aGVuCi0gICAgICBVU0VSX0NPTU1BTkRTPSIkVVNFUl9DT01NQU5EUyAiIiRhcmciCi0gICBmaQotCi0gICBpZiBbICIkcHJlYXJnIj0tY2xhc3NwYXRoIF0gfHwgWyAiJHByZWFyZyI9LWNwICBdCi0gICB0aGVuCi0gICAgICBBWElTMl9DTEFTU1BBVEg9IiRhcmciOiIkQVhJUzJfQ0xBU1NQQVRIIgotICAgZmkKLSAgIHByZWFyZz0iJGFyZyIKLWRvbmUgCi0KLQotIiRKQVZBX0hPTUUiL2Jpbi9qYXZhIC1jbGFzc3BhdGggIiRBWElTMl9DTEFTU1BBVEgiIFwKLS1EYXhpczIueG1sPSIkQVhJUzJfSE9NRS9jb25mL2F4aXMyLnhtbCIgLURheGlzMi5yZXBvPSIkQVhJUzJfSE9NRS9yZXBvc2l0b3J5IiAgJFVTRVJfQ09NTUFORFMKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvc2NyaXB0L2F4aXMyc2VydmVyLmJhdCBiL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvc2NyaXB0L2F4aXMyc2VydmVyLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y3ZDRhNS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy90b29sL3NjcmlwdC9heGlzMnNlcnZlci5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi1AZWNobyBvZmYNCi0NCi1SRU0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi1SRU0gIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotUkVNICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLVJFTSAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotUkVNICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotUkVNICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotUkVNICB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi1SRU0gIA0KLVJFTSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotUkVNICANCi1SRU0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi1SRU0gIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotUkVNICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi1SRU0gIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotUkVNICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotUkVNICB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi1yZW0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotcmVtIFN0YXJ0dXAgc2NyaXB0IGZvciB0aGUgU2ltcGxlIEF4aXMgU2VydmVyICh3aXRoIGRlZmF1bHQgcGFyYW1ldGVycykNCi1yZW0NCi1yZW0gRW52aXJvbm1lbnQgVmFyaWFibGUgUHJlcXVpc2l0ZXMNCi1yZW0NCi1yZW0gICBBWElTMl9IT01FICAgICAgTXVzdCBwb2ludCBhdCB5b3VyIEFYSVMyIGRpcmVjdG9yeSANCi1yZW0NCi1yZW0gICBKQVZBX0hPTUUgICAgICAgTXVzdCBwb2ludCBhdCB5b3VyIEphdmEgRGV2ZWxvcG1lbnQgS2l0IGluc3RhbGxhdGlvbi4NCi1yZW0NCi1yZW0gICBKQVZBX09QVFMgICAgICAgKE9wdGlvbmFsKSBKYXZhIHJ1bnRpbWUgb3B0aW9ucyANCi1yZW0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotDQotaWYgIiVPUyUiPT0iV2luZG93c19OVCIgQHNldGxvY2FsDQotaWYgIiVPUyUiPT0iV0lOTlQiIEBzZXRsb2NhbA0KLQ0KLXJlbSAlfmRwMCBpcyBleHBhbmRlZCBwYXRobmFtZSBvZiB0aGUgY3VycmVudCBzY3JpcHQgdW5kZXIgTlQNCi1zZXQgREVGQVVMVF9BWElTMl9IT01FPSV+ZHAwLi4NCi0NCi1pZiAiJUFYSVMyX0hPTUUlIj09IiIgc2V0IEFYSVMyX0hPTUU9JURFRkFVTFRfQVhJUzJfSE9NRSUNCi1zZXQgREVGQVVMVF9BWElTMl9IT01FPQ0KLQ0KLXJlbSBmaW5kIEFYSVMyX0hPTUUgaWYgaXQgZG9lcyBub3QgZXhpc3QgZHVlIHRvIGVpdGhlciBhbiBpbnZhbGlkIHZhbHVlIHBhc3NlZA0KLXJlbSBieSB0aGUgdXNlciBvciB0aGUgJTAgcHJvYmxlbSBvbiBXaW5kb3dzIDl4DQotDQotaWYgZXhpc3QgIiVBWElTMl9IT01FJVxjb25mXGF4aXMyLnhtbCIgZ290byBjaGVja0phdmENCi0NCi06bm9BeGlzMkhvbWUNCi1lY2hvIEFYSVMyX0hPTUUgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgc2V0IGluY29ycmVjdGx5IG9yIEFYSVMyIGNvdWxkIG5vdCBiZSBsb2NhdGVkLiANCi1lY2hvIFBsZWFzZSBzZXQgdGhlIEFYSVMyX0hPTUUgdmFyaWFibGUgYXBwcm9wcmlhdGVseQ0KLWdvdG8gZW5kDQotDQotOmNoZWNrSmF2YQ0KLXNldCBfSkFWQUNNRD0lSkFWQUNNRCUNCi0NCi1pZiAiJUpBVkFfSE9NRSUiID09ICIiIGdvdG8gbm9KYXZhSG9tZQ0KLWlmIG5vdCBleGlzdCAiJUpBVkFfSE9NRSVcYmluXGphdmEuZXhlIiBnb3RvIG5vSmF2YUhvbWUNCi1pZiAiJV9KQVZBQ01EJSIgPT0gIiIgc2V0IF9KQVZBQ01EPSVKQVZBX0hPTUUlXGJpblxqYXZhLmV4ZQ0KLWlmICAiJUFYSVMyX0NNRF9MSU5FX0FSR1MlIiA9PSAiIiBnb3RvIGRlZmF1bHRQYXJhbXMNCi0NCi1nb3RvIHJ1bkF4aXMyDQotDQotOmRlZmF1bHRQYXJhbXMNCi1zZXQgQVhJUzJfQ01EX0xJTkVfQVJHUz0tcmVwbyAiJUFYSVMyX0hPTUUlXHJlcG9zaXRvcnkiIC1jb25mICIlQVhJUzJfSE9NRSVcY29uZlxheGlzMi54bWwiDQotZ290byBydW5BeGlzMg0KLQ0KLTpub0phdmFIb21lDQotaWYgIiVfSkFWQUNNRCUiID09ICIiIHNldCBfSkFWQUNNRD1qYXZhLmV4ZQ0KLWVjaG8gSkFWQV9IT01FIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIHNldCBpbmNvcnJlY3RseSBvciBKYXZhIHJ1bnRpbWUgY291bGQgbm90IGJlIGxvY2F0ZWQuDQotZWNobyBQbGVhc2Ugc2V0IHRoZSBKQVZBX0hPTUUgdmFyaWFibGUgYXBwcm9wcmlhdGVseQ0KLWdvdG8gZW5kDQotDQotOnJ1bkF4aXMyDQotcmVtIHNldCB0aGUgY2xhc3NlcyBieSBsb29waW5nIHRocm91Z2ggdGhlIGxpYnMNCi1zZXRsb2NhbCBFbmFibGVEZWxheWVkRXhwYW5zaW9uDQotc2V0IEFYSVMyX0NMQVNTX1BBVEg9JUFYSVMyX0hPTUUlOyVKQVZBX0hPTUUlXGxpYlx0b29scy5qYXI7DQotRk9SICUlYyBpbiAoIiVBWElTMl9IT01FJVxsaWJcKi5qYXIiKSBETyBzZXQgQVhJUzJfQ0xBU1NfUEFUSD0hQVhJUzJfQ0xBU1NfUEFUSCE7JSVjDQotDQotZWNobyBVc2luZyBKQVZBX0hPTUUgICAgJUpBVkFfSE9NRSUNCi1lY2hvIFVzaW5nIEFYSVMyX0hPTUUgICAlQVhJUzJfSE9NRSUNCi0NCi1jZCAlQVhJUzJfSE9NRSUNCi0iJV9KQVZBQ01EJSIgJUpBVkFfT1BUUyUgLWNwICIhQVhJUzJfQ0xBU1NfUEFUSCEiIG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0LlNpbXBsZUF4aXMyU2VydmVyICVBWElTMl9DTURfTElORV9BUkdTJQ0KLWdvdG8gZW5kDQotDQotOmVuZA0KLXNldCBfSkFWQUNNRD0NCi1zZXQgQVhJUzJfQ01EX0xJTkVfQVJHUz0NCi0NCi1pZiAiJU9TJSI9PSJXaW5kb3dzX05UIiBAZW5kbG9jYWwNCi1pZiAiJU9TJSI9PSJXSU5OVCIgQGVuZGxvY2FsDQotDQotOm1haW5FbmQNCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy90b29sL3NjcmlwdC9heGlzMnNlcnZlci5zaCBiL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvc2NyaXB0L2F4aXMyc2VydmVyLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyMDU1NzI4Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvc2NyaXB0L2F4aXMyc2VydmVyLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotIyEvYmluL3NoCi0KLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIyAKLSMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jIAotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgU2ltcGxlQXhpczJTZXJ2ZXIgU2NyaXB0Ci0jCi0jIEVudmlyb25tZW50IFZhcmlhYmxlIFByZXF1aXNpdGVzCi0jCi0jICAgQVhJUzJfSE9NRSAgIEhvbWUgb2YgQXhpczIgaW5zdGFsbGF0aW9uLiBJZiBub3Qgc2V0IEkgd2lsbCAgdHJ5Ci0jICAgICAgICAgICAgICAgICAgIHRvIGZpZ3VyZSBpdCBvdXQuCi0jCi0jICAgSkFWQV9IT01FICAgICAgIE11c3QgcG9pbnQgYXQgeW91ciBKYXZhIERldmVsb3BtZW50IEtpdCBpbnN0YWxsYXRpb24uCi0jCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSMgR2V0IHRoZSBjb250ZXh0IGFuZCBmcm9tIHRoYXQgZmluZCB0aGUgbG9jYXRpb24gb2Ygc2V0ZW52LnNoCi0uIGBkaXJuYW1lICQwYC9zZXRlbnYuc2gKLQotamF2YSAtY2xhc3NwYXRoICIkQVhJUzJfQ0xBU1NQQVRIIiBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5TaW1wbGVBeGlzMlNlcnZlciBcCi0tcmVwbyAiJEFYSVMyX0hPTUUiL3JlcG9zaXRvcnkgLWNvbmYgIiRBWElTMl9IT01FIi9jb25mL2F4aXMyLnhtbCAkKgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9zY3JpcHQvamF2YTJ3c2RsLmJhdCBiL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvc2NyaXB0L2phdmEyd3NkbC5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxYjI0NzEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9zY3JpcHQvamF2YTJ3c2RsLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLUBlY2hvIG9mZgotCi1SRU0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLVJFTSAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLVJFTSAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLVJFTSAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi1SRU0gIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLVJFTSAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotUkVNICB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLVJFTSAgCi1SRU0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotUkVNICAKLVJFTSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotUkVNICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotUkVNICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLVJFTSAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLVJFTSAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotUkVNICB1bmRlciB0aGUgTGljZW5zZS4KLQotcmVtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcmVtIFN0YXJ0dXAgc2NyaXB0IGZvciB0aGUgV1NETEphdmEKLXJlbQotcmVtIEVudmlyb25tZW50IFZhcmlhYmxlIFByZXF1aXNpdGVzCi1yZW0KLXJlbSAgIEFYSVMyX0hPTUUgICAgICBNdXN0IHBvaW50IGF0IHlvdXIgQVhJUzIgZGlyZWN0b3J5IAotcmVtCi1yZW0gICBKQVZBX0hPTUUgICAgICAgTXVzdCBwb2ludCBhdCB5b3VyIEphdmEgRGV2ZWxvcG1lbnQgS2l0IGluc3RhbGxhdGlvbi4KLXJlbQotcmVtICAgSkFWQV9PUFRTICAgICAgIChPcHRpb25hbCkgSmF2YSBydW50aW1lIG9wdGlvbnMgCi1yZW0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1zZXQgQ1VSUkVOVF9ESVI9JWNkJQotCi1yZW0gTWFrZSBzdXJlIHByZXJlcXVpc2l0ZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlIHNldAotaWYgbm90ICIlSkFWQV9IT01FJSIgPT0gIiIgZ290byBnb3RKYXZhSG9tZQotZWNobyBUaGUgSkFWQV9IT01FIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIG5vdCBkZWZpbmVkCi1lY2hvIFRoaXMgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgbmVlZGVkIHRvIHJ1biB0aGlzIHByb2dyYW0KLWdvdG8gZW5kCi06Z290SmF2YUhvbWUKLWlmIG5vdCBleGlzdCAiJUpBVkFfSE9NRSVcYmluXGphdmEuZXhlIiBnb3RvIG5vSmF2YUhvbWUKLWdvdG8gb2tKYXZhSG9tZQotOm5vSmF2YUhvbWUKLWVjaG8gVGhlIEpBVkFfSE9NRSBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBub3QgZGVmaW5lZCBjb3JyZWN0bHkKLWVjaG8gVGhpcyBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBuZWVkZWQgdG8gcnVuIHRoaXMgcHJvZ3JhbQotZWNobyBOQjogSkFWQV9IT01FIHNob3VsZCBwb2ludCB0byBhIEpESy9KUkUKLWdvdG8gZW5kCi06b2tKYXZhSG9tZQotCi1yZW0gY2hlY2sgdGhlIEFYSVMyX0hPTUUgZW52aXJvbm1lbnQgdmFyaWFibGUKLWlmIG5vdCAiJUFYSVMyX0hPTUUlIiA9PSAiIiBnb3RvIGdvdEhvbWUKLXNldCBBWElTMl9IT01FPSVDVVJSRU5UX0RJUiUKLWlmIGV4aXN0ICIlQVhJUzJfSE9NRSVcYmluXGF4aXMyLmJhdCIgZ290byBva0hvbWUKLQotcmVtIGd1ZXNzIHRoZSBob21lLiBKdW1wIG9uZSBkaXJlY3RvcnkgdXAgdG8gY2hlY2sgaWYgdGhhdCBpcyB0aGUgaG9tZQotY2QgLi4KLXNldCBBWElTMl9IT01FPSVjZCUKLWNkICVDVVJSRU5UX0RJUiUKLQotOmdvdEhvbWUKLWlmIEVYSVNUICIlQVhJUzJfSE9NRSVcbGliXGF4aXMyKi5qYXIiIGdvdG8gb2tIb21lCi1lY2hvIFRoZSBBWElTMl9IT01FIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIG5vdCBkZWZpbmVkIGNvcnJlY3RseQotZWNobyBUaGlzIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIG5lZWRlZCB0byBydW4gdGhpcyBwcm9ncmFtCi1nb3RvIGVuZAotCi06b2tIb21lCi1yZW0gc2V0IHRoZSBjbGFzc2VzCi1zZXRsb2NhbCBFbmFibGVEZWxheWVkRXhwYW5zaW9uCi1yZW0gYXBwZW5kIHRoZSBleGlzdGluZyBjbGFzc3BhdGggdG8gQVhJUzJfQ0xBU1NfUEFUSAotc2V0IEFYSVMyX0NMQVNTX1BBVEg9JUNMQVNTUEFUSCU7JUFYSVMyX0hPTUUlCi1yZW0gbG9vcCB0aHJvdWdoIHRoZSBsaWJzIGFuZCBhZGQgdGhlbSB0byB0aGUgY2xhc3MgcGF0aAotRk9SICUlYyBpbiAoIiVBWElTMl9IT01FJVxsaWJcKi5qYXIiKSBETyBzZXQgQVhJUzJfQ0xBU1NfUEFUSD0hQVhJUzJfQ0xBU1NfUEFUSCE7JSVjCi0KLXJlbSAtLS0tLSBFeGVjdXRlIFRoZSBSZXF1ZXN0ZWQgQ29tbWFuZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWVjaG8gVXNpbmcgQVhJUzJfSE9NRTogICAlQVhJUzJfSE9NRSUKLWVjaG8gVXNpbmcgSkFWQV9IT01FOiAgICAlSkFWQV9IT01FJQotc2V0IF9SVU5KQVZBPSIlSkFWQV9IT01FJVxiaW5camF2YSIKLQotJV9SVU5KQVZBJSAlSkFWQV9PUFRTJSAtY3AgIiFBWElTMl9DTEFTU19QQVRIISIgb3JnLmFwYWNoZS53cy5qYXZhMndzZGwuSmF2YTJXU0RMICUqCi1lbmRsb2NhbAotOmVuZApkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9zY3JpcHQvamF2YTJ3c2RsLnNoIGIvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9zY3JpcHQvamF2YTJ3c2RsLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmY3ODEwLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvc2NyaXB0L2phdmEyd3NkbC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMhL2Jpbi9zaAotCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMgCi0jIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIyAKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLQotZGlyPWBkaXJuYW1lICIkMCJgCi1zaCAiJGRpciIvYXhpczIuc2ggb3JnLmFwYWNoZS53cy5qYXZhMndzZGwuSmF2YTJXU0RMICQqCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy90b29sL3NjcmlwdC9zZXRlbnYuc2ggYi92MS41LjFSQzMvbW9kdWxlcy90b29sL3NjcmlwdC9zZXRlbnYuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhMzVhZDAuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvdG9vbC9zY3JpcHQvc2V0ZW52LnNoCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLSMhL2Jpbi9zaAotCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMgCi0jIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIyAKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jICBTZXQgRW52aXJvbm1lbnQgU2hlbGwgU2NyaXB0Ci0jCi0jICBUaGlzIHdpbGwgc2V0IEFYSVMyX0hPTUUgYW5kIEpBVkFfSE9NRSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgcHJvcGVybHkuCi0jCi0jICAgQVhJUzJfSE9NRSAgIEhvbWUgb2YgQXhpczIgaW5zdGFsbGF0aW9uLiBJZiBub3Qgc2V0IEkgd2lsbCAgdHJ5Ci0jICAgICAgICAgICAgICAgICAgIHRvIGZpZ3VyZSBpdCBvdXQuCi0jCi0jICAgSkFWQV9IT01FICAgICAgIE11c3QgcG9pbnQgYXQgeW91ciBKYXZhIERldmVsb3BtZW50IEtpdCBpbnN0YWxsYXRpb24uCi0jCi0jIE5PVEU6IEJvcnJvd2VkIGdlbmVyb3VzbHkgZnJvbSBBcGFjaGUgVG9tY2F0IHN0YXJ0dXAgc2NyaXB0cy4KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotIyBpZiBKQVZBX0hPTUUgaXMgbm90IHNldCB3ZSdyZSBub3QgaGFwcHkKLWlmIFsgLXogIiRKQVZBX0hPTUUiIF07IHRoZW4KLSAgZWNobyAiWW91IG11c3Qgc2V0IHRoZSBKQVZBX0hPTUUgdmFyaWFibGUgYmVmb3JlIHJ1bm5pbmcgQXhpczIgU2NyaXB0LiIKLSAgZXhpdCAxCi1maQotCi0jIE9TIHNwZWNpZmljIHN1cHBvcnQuICAkdmFyIF9tdXN0XyBiZSBzZXQgdG8gZWl0aGVyIHRydWUgb3IgZmFsc2UuCi1jeWd3aW49ZmFsc2UKLW9zNDAwPWZhbHNlCi1jYXNlICJgdW5hbWVgIiBpbgotQ1lHV0lOKikgY3lnd2luPXRydWU7OwotT1M0MDAqKSBvczQwMD10cnVlOzsKLWVzYWMKLQotIyByZXNvbHZlIGxpbmtzIC0gJDAgbWF5IGJlIGEgc29mdGxpbmsKLVBSRz0iJDAiCi0KLXdoaWxlIFsgLWggIiRQUkciIF07IGRvCi0gIGxzPWBscyAtbGQgIiRQUkciYAotICBsaW5rPWBleHByICIkbHMiIDogJy4qLT4gXCguKlwpJCdgCi0gIGlmIGV4cHIgIiRsaW5rIiA6ICcuKi8uKicgPiAvZGV2L251bGw7IHRoZW4KLSAgICBQUkc9IiRsaW5rIgotICBlbHNlCi0gICAgUFJHPWBkaXJuYW1lICIkUFJHImAvIiRsaW5rIgotICBmaQotZG9uZQotCi0jIEdldCBzdGFuZGFyZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMKLVBSR0RJUj1gZGlybmFtZSAiJFBSRyJgCi0KLSMgT25seSBzZXQgQVhJUzJfSE9NRSBpZiBub3QgYWxyZWFkeSBzZXQKLVsgLXogIiRBWElTMl9IT01FIiBdICYmIEFYSVMyX0hPTUU9YGNkICIkUFJHRElSLy4uIiA7IHB3ZGAKLQotIyBGb3IgQ3lnd2luLCBlbnN1cmUgcGF0aHMgYXJlIGluIFVOSVggZm9ybWF0IGJlZm9yZSBhbnl0aGluZyBpcyB0b3VjaGVkCi1pZiAkY3lnd2luOyB0aGVuCi0gIFsgLW4gIiRKQVZBX0hPTUUiIF0gJiYgSkFWQV9IT01FPWBjeWdwYXRoIC0tdW5peCAiJEpBVkFfSE9NRSJgCi0gIFsgLW4gIiRBWElTMl9IT01FIiBdICYmIEFYSVMyX0hPTUU9YGN5Z3BhdGggLS11bml4ICIkQVhJUzJfSE9NRSJgCi0gIFsgLW4gIiRDTEFTU1BBVEgiIF0gJiYgQ0xBU1NQQVRIPWBjeWdwYXRoIC0tcGF0aCAtLXVuaXggIiRDTEFTU1BBVEgiYAotZmkKLQotIyBGb3IgT1M0MDAKLWlmICRvczQwMDsgdGhlbgotICAjIFNldCBqb2IgcHJpb3JpdHkgdG8gc3RhbmRhcmQgZm9yIGludGVyYWN0aXZlIChpbnRlcmFjdGl2ZSAtIDYpIGJ5IHVzaW5nCi0gICMgdGhlIGludGVyYWN0aXZlIHByaW9yaXR5IC0gNiwgdGhlIGhlbHBlciB0aHJlYWRzIHRoYXQgcmVzcG9uZCB0byByZXF1ZXN0cwotICAjIHdpbGwgYmUgcnVubmluZyBhdCB0aGUgc2FtZSBwcmlvcml0eSBhcyBpbnRlcmFjdGl2ZSBqb2JzLgotICBDT01NQU5EPSdjaGdqb2Igam9iKCckSk9CTkFNRScpIHJ1bnB0eSg2KScKLSAgc3lzdGVtICRDT01NQU5ECi0KLSAgIyBFbmFibGUgbXVsdGkgdGhyZWFkaW5nCi0gIGV4cG9ydCBRSUJNX01VTFRJX1RIUkVBREVEPVkKLWZpCi0KLSMgdXBkYXRlIGNsYXNzcGF0aAotQVhJUzJfQ0xBU1NQQVRIPSIiCi1mb3IgZiBpbiAiJEFYSVMyX0hPTUUiL2xpYi8qLmphcgotZG8KLSAgQVhJUzJfQ0xBU1NQQVRIPSIkQVhJUzJfQ0xBU1NQQVRIIjokZgotZG9uZQotQVhJUzJfQ0xBU1NQQVRIPSIkQVhJUzJfSE9NRSI6IiRKQVZBX0hPTUUvbGliL3Rvb2xzLmphciI6IiRBWElTMl9DTEFTU1BBVEgiOiIkQ0xBU1NQQVRIIgotCi0jIEZvciBDeWd3aW4sIHN3aXRjaCBwYXRocyB0byBXaW5kb3dzIGZvcm1hdCBiZWZvcmUgcnVubmluZyBqYXZhCi1pZiAkY3lnd2luOyB0aGVuCi0gIEpBVkFfSE9NRT1gY3lncGF0aCAtLWFic29sdXRlIC0td2luZG93cyAiJEpBVkFfSE9NRSJgCi0gIEFYSVMyX0hPTUU9YGN5Z3BhdGggLS1hYnNvbHV0ZSAtLXdpbmRvd3MgIiRBWElTMl9IT01FImAKLSAgQ0xBU1NQQVRIPWBjeWdwYXRoIC0tcGF0aCAtLXdpbmRvd3MgIiRDTEFTU1BBVEgiYAotICBBWElTMl9DTEFTU1BBVEg9YGN5Z3BhdGggLS1wYXRoIC0td2luZG93cyAiJEFYSVMyX0NMQVNTUEFUSCJgCi0gIEpBVkFfRU5ET1JTRURfRElSUz1gY3lncGF0aCAtLXBhdGggLS13aW5kb3dzICIkSkFWQV9FTkRPUlNFRF9ESVJTImAKLWZpCi0KLWV4cG9ydCBBWElTMl9IT01FPSIkQVhJUzJfSE9NRSIKLWV4cG9ydCBKQVZBX0hPTUU9IiRKQVZBX0hPTUUiCi1leHBvcnQgQVhJUzJfQ0xBU1NQQVRIPSIkQVhJUzJfQ0xBU1NQQVRIIgotCi0KLWVjaG8gIiBVc2luZyBBWElTMl9IT01FOiAgICRBWElTMl9IT01FIgotZWNobyAiIFVzaW5nIEpBVkFfSE9NRTogICAgICAgJEpBVkFfSE9NRSIKLQotCi0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvc2NyaXB0L3dzZGwyamF2YS5iYXQgYi92MS41LjFSQzMvbW9kdWxlcy90b29sL3NjcmlwdC93c2RsMmphdmEuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2ExMzQ1Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvc2NyaXB0L3dzZGwyamF2YS5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi1AZWNobyBvZmYKLQotUkVNICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1SRU0gIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi1SRU0gIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1SRU0gIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotUkVNICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi1SRU0gICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLVJFTSAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci1SRU0gIAotUkVNICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLVJFTSAgCi1SRU0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLVJFTSAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLVJFTSAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1SRU0gIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1SRU0gIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLVJFTSAgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXJlbSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXJlbSBTdGFydHVwIHNjcmlwdCBmb3IgdGhlIFdTRExKYXZhCi1yZW0KLXJlbSBFbnZpcm9ubWVudCBWYXJpYWJsZSBQcmVxdWlzaXRlcwotcmVtCi1yZW0gICBBWElTMl9IT01FICAgICAgTXVzdCBwb2ludCBhdCB5b3VyIEFYSVMyIGRpcmVjdG9yeSAKLXJlbQotcmVtICAgSkFWQV9IT01FICAgICAgIE11c3QgcG9pbnQgYXQgeW91ciBKYXZhIERldmVsb3BtZW50IEtpdCBpbnN0YWxsYXRpb24uCi1yZW0KLXJlbSAgIEpBVkFfT1BUUyAgICAgICAoT3B0aW9uYWwpIEphdmEgcnVudGltZSBvcHRpb25zIAotcmVtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotc2V0IENVUlJFTlRfRElSPSVjZCUKLQotcmVtIE1ha2Ugc3VyZSBwcmVyZXF1aXNpdGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSBzZXQKLWlmIG5vdCAiJUpBVkFfSE9NRSUiID09ICIiIGdvdG8gZ290SmF2YUhvbWUKLWVjaG8gVGhlIEpBVkFfSE9NRSBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBub3QgZGVmaW5lZAotZWNobyBUaGlzIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIG5lZWRlZCB0byBydW4gdGhpcyBwcm9ncmFtCi1nb3RvIGVuZAotOmdvdEphdmFIb21lCi1pZiBub3QgZXhpc3QgIiVKQVZBX0hPTUUlXGJpblxqYXZhLmV4ZSIgZ290byBub0phdmFIb21lCi1nb3RvIG9rSmF2YUhvbWUKLTpub0phdmFIb21lCi1lY2hvIFRoZSBKQVZBX0hPTUUgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgbm90IGRlZmluZWQgY29ycmVjdGx5Ci1lY2hvIFRoaXMgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgbmVlZGVkIHRvIHJ1biB0aGlzIHByb2dyYW0KLWVjaG8gTkI6IEpBVkFfSE9NRSBzaG91bGQgcG9pbnQgdG8gYSBKREsvSlJFCi1nb3RvIGVuZAotOm9rSmF2YUhvbWUKLQotcmVtIGNoZWNrIHRoZSBBWElTMl9IT01FIGVudmlyb25tZW50IHZhcmlhYmxlCi1pZiBub3QgIiVBWElTMl9IT01FJSIgPT0gIiIgZ290byBnb3RIb21lCi1zZXQgQVhJUzJfSE9NRT0lQ1VSUkVOVF9ESVIlCi1pZiBleGlzdCAiJUFYSVMyX0hPTUUlXGJpblxheGlzMi5iYXQiIGdvdG8gb2tIb21lCi0KLXJlbSBndWVzcyB0aGUgaG9tZS4gSnVtcCBvbmUgZGlyZWN0b3J5IHVwIHRvIGNoZWNrIGlmIHRoYXQgaXMgdGhlIGhvbWUKLWNkIC4uCi1zZXQgQVhJUzJfSE9NRT0lY2QlCi1jZCAlQ1VSUkVOVF9ESVIlCi0KLTpnb3RIb21lCi1pZiBFWElTVCAiJUFYSVMyX0hPTUUlXGxpYlxheGlzMiouamFyIiBnb3RvIG9rSG9tZQotZWNobyBUaGUgQVhJUzJfSE9NRSBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBub3QgZGVmaW5lZCBjb3JyZWN0bHkKLWVjaG8gVGhpcyBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBuZWVkZWQgdG8gcnVuIHRoaXMgcHJvZ3JhbQotZ290byBlbmQKLQotOm9rSG9tZQotcmVtIHNldCB0aGUgY2xhc3Nlcwotc2V0bG9jYWwgRW5hYmxlRGVsYXllZEV4cGFuc2lvbgotcmVtIGxvb3AgdGhyb3VnaCB0aGUgbGlicyBhbmQgYWRkIHRoZW0gdG8gdGhlIGNsYXNzIHBhdGgKLXNldCBBWElTMl9DTEFTU19QQVRIPSVBWElTMl9IT01FJQotRk9SICUlYyBpbiAoIiVBWElTMl9IT01FJVxsaWJcKi5qYXIiKSBETyBzZXQgQVhJUzJfQ0xBU1NfUEFUSD0hQVhJUzJfQ0xBU1NfUEFUSCE7JSVjCi0KLXJlbSAtLS0tLSBFeGVjdXRlIFRoZSBSZXF1ZXN0ZWQgQ29tbWFuZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWVjaG8gVXNpbmcgQVhJUzJfSE9NRTogICAlQVhJUzJfSE9NRSUKLWVjaG8gVXNpbmcgSkFWQV9IT01FOiAgICAlSkFWQV9IT01FJQotc2V0IF9SVU5KQVZBPSIlSkFWQV9IT01FJVxiaW5camF2YSIKLQotJV9SVU5KQVZBJSAlSkFWQV9PUFRTJSAtY3AgIiFBWElTMl9DTEFTU19QQVRIISIgb3JnLmFwYWNoZS5heGlzMi53c2RsLldTREwySmF2YSAlKgotZW5kbG9jYWwKLTplbmQKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvc2NyaXB0L3dzZGwyamF2YS5zaCBiL3YxLjUuMVJDMy9tb2R1bGVzL3Rvb2wvc2NyaXB0L3dzZGwyamF2YS5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWNlNjZkZC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy90b29sL3NjcmlwdC93c2RsMmphdmEuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jIS9iaW4vc2gKLQotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jIAotIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMgCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWRpcj1gZGlybmFtZSAiJDAiYAotc2ggIiRkaXIiL2F4aXMyLnNoIG9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMMkphdmEgJCoKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3RyYW5zcG9ydC9odHRwL3BvbS54bWwgYi92MS41LjFSQzMvbW9kdWxlcy90cmFuc3BvcnQvaHR0cC9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTZiNjhjLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3RyYW5zcG9ydC9odHRwL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItcGFyZW50PC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4xLjUuMTwvdmVyc2lvbj4KLSAgICAgICAgPHJlbGF0aXZlUGF0aD4uLi8uLi9wYXJlbnQvcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgotICAgIDwvcGFyZW50PgotICAgIDxhcnRpZmFjdElkPmF4aXMyLXRyYW5zcG9ydC1odHRwPC9hcnRpZmFjdElkPgotICAgIDxuYW1lPkFwYWNoZSBBeGlzMiAtIFRyYW5zcG9ydCAtIEhUVFA8L25hbWU+Ci0gICAgPGRlc2NyaXB0aW9uPlRoaXMgaW5jbHVlcyBhbGwgdGhlIGF2YWlsYWJsZSB0cmFuc3BvcnRzIGluIEF4aXMyPC9kZXNjcmlwdGlvbj4KLSAgICA8cGFja2FnaW5nPmJ1bmRsZTwvcGFja2FnaW5nPgotCi0gICAgPGJ1aWxkPgotICAgICAgICA8c291cmNlRGlyZWN0b3J5PnNyYzwvc291cmNlRGlyZWN0b3J5PgotICAgICAgICA8dGVzdFNvdXJjZURpcmVjdG9yeT50ZXN0PC90ZXN0U291cmNlRGlyZWN0b3J5PgotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5mZWxpeDwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1idW5kbGUtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjEuNC4wPC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDxleHRlbnNpb25zPnRydWU8L2V4dGVuc2lvbnM+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxpbnN0cnVjdGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8QnVuZGxlLVZlcnNpb24+MS4wPC9CdW5kbGUtVmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxCdW5kbGUtTmFtZT4ke3BvbS5hcnRpZmFjdElkfTwvQnVuZGxlLU5hbWU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8QnVuZGxlLVZlbmRvcj5BcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbjwvQnVuZGxlLVZlbmRvcj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxCdW5kbGUtRGVzY3JpcHRpb24+JHtwb20uZGVzY3JpcHRpb259PC9CdW5kbGUtRGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8QnVuZGxlLVN5bWJvbGljTmFtZT4ke3BvbS5hcnRpZmFjdElkfTwvQnVuZGxlLVN5bWJvbGljTmFtZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxFeHBvcnQtUGFja2FnZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLio7LXNwbGl0LXBhY2thZ2U6PW1lcmdlLWxhc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICA8L0V4cG9ydC1QYWNrYWdlPgotICAgICAgICAgICAgICAgICAgICA8L2luc3RydWN0aW9ucz4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgICAgICA8cmVzb3VyY2VzPgotICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+Y29uZjwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxleGNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovKi5wcm9wZXJ0aWVzPC9leGNsdWRlPgotICAgICAgICAgICAgICAgIDwvZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgPGZpbHRlcmluZz5mYWxzZTwvZmlsdGVyaW5nPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYzwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxleGNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovKi5qYXZhPC9leGNsdWRlPgotICAgICAgICAgICAgICAgIDwvZXhjbHVkZXM+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICA8L3Jlc291cmNlcz4KLSAgICA8L2J1aWxkPgotCi0gICAgPGRlcGVuZGVuY2llcz4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczIta2VybmVsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHt2ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5odHRwY29yZTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgIDwvZGVwZW5kZW5jaWVzPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvdHJhbnNwb3J0L2h0dHAvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvQWJzdHJhY3RBZ2VudC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvdHJhbnNwb3J0L2h0dHAvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvQWJzdHJhY3RBZ2VudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjIzYmIzLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3RyYW5zcG9ydC9odHRwL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL0Fic3RyYWN0QWdlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIFRoZSBBYnN0cmFjdEFnZW50IGFjdHMgYXMgYSBzaW1wbGUgZGlzcGF0Y2hlciBmb3IgaHR0cCByZXF1ZXN0cy4KLSAqIEl0IGRlbGVnYXRlcyBpbmNvbWluZyByZXF1ZXN0cyB0byBwcm9jZXNzWHl6IG1ldGhvZHMgd2hpbGUgWHl6Ci0gKiBpcyB0aGUgcGFydCBvZiB0aGUgcmVxdWVzdCB1cmkgcGFzdCBsYXN0IC8uCi0gKi8KLXB1YmxpYyBjbGFzcyBBYnN0cmFjdEFnZW50IHsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0lOREVYX0pTUCA9ICJpbmRleC5qc3AiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEhPRF9QUkVGSVggPSAicHJvY2VzcyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEFic3RyYWN0QWdlbnQuY2xhc3MpOwotCi0gICAgcHJvdGVjdGVkIHRyYW5zaWVudCBNYXAgb3BlcmF0aW9uQ2FjaGUgPSBuZXcgSGFzaE1hcCgpOwotICAgIHByb3RlY3RlZCB0cmFuc2llbnQgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ29udGV4dDsKLQotICAgIHB1YmxpYyBBYnN0cmFjdEFnZW50KENvbmZpZ3VyYXRpb25Db250ZXh0IGFDb25maWdDb250ZXh0KSB7Ci0gICAgICAgIGNvbmZpZ0NvbnRleHQgPSBhQ29uZmlnQ29udGV4dDsKLSAgICAgICAgcHJlbG9hZE1ldGhvZHMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBoYW5kbGUoSHR0cFNlcnZsZXRSZXF1ZXN0IGh0dHBTZXJ2bGV0UmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSBodHRwU2VydmxldFJlc3BvbnNlKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKLQotCi0gICAgICAgIFN0cmluZyByZXF1ZXN0VVJJID0gaHR0cFNlcnZsZXRSZXF1ZXN0LmdldFJlcXVlc3RVUkkoKTsKLQotICAgICAgICBTdHJpbmcgb3BlcmF0aW9uOwotICAgICAgICBpbnQgaSA9IHJlcXVlc3RVUkkubGFzdEluZGV4T2YoJy8nKTsKLSAgICAgICAgaWYgKGkgPCAwKSB7Ci0gICAgICAgICAgICBwcm9jZXNzVW5rbm93bihodHRwU2VydmxldFJlcXVlc3QsIGh0dHBTZXJ2bGV0UmVzcG9uc2UpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9IGVsc2UgaWYgKGkgPT0gcmVxdWVzdFVSSS5sZW5ndGgoKSAtIDEpIHsKLSAgICAgICAgICAgIHByb2Nlc3NJbmRleChodHRwU2VydmxldFJlcXVlc3QsIGh0dHBTZXJ2bGV0UmVzcG9uc2UpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgb3BlcmF0aW9uID0gcmVxdWVzdFVSSS5zdWJzdHJpbmcoaSArIDEpOwotICAgICAgICB9Ci0KLQotICAgICAgICBNZXRob2QgbWV0aG9kID0gKE1ldGhvZCkgb3BlcmF0aW9uQ2FjaGUuZ2V0KG9wZXJhdGlvbi50b0xvd2VyQ2FzZSgpKTsKLSAgICAgICAgaWYgKG1ldGhvZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG1ldGhvZC5pbnZva2UodGhpcywgbmV3IE9iamVjdFtde2h0dHBTZXJ2bGV0UmVxdWVzdCwgaHR0cFNlcnZsZXRSZXNwb25zZX0pOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBsb2cud2FybigiRXJyb3IgZGlzcGF0Y2hpbmcgcmVxdWVzdCAiICsgcmVxdWVzdFVSSSwgZSk7Ci0gICAgICAgICAgICAgICAgaHR0cFNlcnZsZXRSZXNwb25zZS5zZXRTdGF0dXMoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcHJvY2Vzc1Vua25vd24oaHR0cFNlcnZsZXRSZXF1ZXN0LCBodHRwU2VydmxldFJlc3BvbnNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxiYWNrIG1ldGhvZCBmb3IgaW5kZXggcGFnZS4gRm9yd2FyZHMgdG8ge0BsaW5rIERFRkFVTFRfSU5ERVhfSlNQfSBieSBkZWZhdWx0LgotICAgICAqCi0gICAgICogQHBhcmFtIGh0dHBTZXJ2bGV0UmVxdWVzdCAgVGhlIGluY29taW5nIHJlcXVlc3QuCi0gICAgICogQHBhcmFtIGh0dHBTZXJ2bGV0UmVzcG9uc2UgVGhlIG91dGdvaW5nIHJlc3BvbnNlLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NJbmRleChIdHRwU2VydmxldFJlcXVlc3QgaHR0cFNlcnZsZXRSZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIGh0dHBTZXJ2bGV0UmVzcG9uc2UpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24gewotICAgICAgICByZW5kZXJWaWV3KERFRkFVTFRfSU5ERVhfSlNQLCBodHRwU2VydmxldFJlcXVlc3QsIGh0dHBTZXJ2bGV0UmVzcG9uc2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxiYWNrIG1ldGhvZCBmb3IgdW5rbm93bi91bnN1cHBvcnRlZCByZXF1ZXN0cy4gUmV0dXJucyBIVFRQIFN0YXR1cyA0MDQgYnkgZGVmYXVsdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBodHRwU2VydmxldFJlcXVlc3QgIFRoZSBpbmNvbWluZyByZXF1ZXN0LgotICAgICAqIEBwYXJhbSBodHRwU2VydmxldFJlc3BvbnNlIFRoZSBvdXRnb2luZyByZXNwb25zZS4KLSAgICAgKi8KLQotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NVbmtub3duKEh0dHBTZXJ2bGV0UmVxdWVzdCBodHRwU2VydmxldFJlcXVlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSBodHRwU2VydmxldFJlc3BvbnNlKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKLSAgICAgICAgaHR0cFNlcnZsZXRSZXNwb25zZQotICAgICAgICAgICAgICAgIC5zZW5kRXJyb3IoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19OT1RfRk9VTkQsIGh0dHBTZXJ2bGV0UmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCkpOwotICAgIH0KLQotCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVuZGVyVmlldyhTdHJpbmcganNwTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCBodHRwU2VydmxldFJlcXVlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIGh0dHBTZXJ2bGV0UmVzcG9uc2UpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24gewotICAgICAgICBodHRwU2VydmxldFJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L2h0bWwiKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGh0dHBTZXJ2bGV0UmVxdWVzdC5nZXRSZXF1ZXN0RGlzcGF0Y2hlcihDb25zdGFudHMuQVhJU19XRUJfQ09OVEVOVF9ST09UICsganNwTmFtZSkKLSAgICAgICAgICAgICAgICAgICAgLmluY2x1ZGUoaHR0cFNlcnZsZXRSZXF1ZXN0LCBodHRwU2VydmxldFJlc3BvbnNlKTsKLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgICAgIGxvZy5pbmZvKCJPbGQgU2VydmxldCBBUEkgOiIgKyB0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBwcmVsb2FkTWV0aG9kcygpIHsKLSAgICAgICAgQ2xhc3MgY2xhenogPSBnZXRDbGFzcygpOwotICAgICAgICB3aGlsZSAoY2xhenogIT0gbnVsbCAmJiAhY2xhenouZXF1YWxzKE9iamVjdC5jbGFzcykpIHsKLSAgICAgICAgICAgIGV4YW1pbmVNZXRob2RzKGNsYXp6LmdldERlY2xhcmVkTWV0aG9kcygpKTsKLSAgICAgICAgICAgIGNsYXp6ID0gY2xhenouZ2V0U3VwZXJjbGFzcygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGV4YW1pbmVNZXRob2RzKE1ldGhvZFtdIGFEZWNsYXJlZE1ldGhvZHMpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhRGVjbGFyZWRNZXRob2RzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBNZXRob2QgbWV0aG9kID0gYURlY2xhcmVkTWV0aG9kc1tpXTsKLQotICAgICAgICAgICAgQ2xhc3NbXSBwYXJhbWV0ZXJUeXBlcyA9IG1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpOwotICAgICAgICAgICAgaWYgKAotICAgICAgICAgICAgICAgICAgICAoTW9kaWZpZXIuaXNQcm90ZWN0ZWQobWV0aG9kLmdldE1vZGlmaWVycygpKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZGlmaWVyLmlzUHVibGljKG1ldGhvZC5nZXRNb2RpZmllcnMoKSkpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kLmdldE5hbWUoKS5zdGFydHNXaXRoKE1FVEhPRF9QUkVGSVgpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyVHlwZXMubGVuZ3RoID09IDIgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJUeXBlc1swXS5lcXVhbHMoSHR0cFNlcnZsZXRSZXF1ZXN0LmNsYXNzKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlclR5cGVzWzFdLmVxdWFscyhIdHRwU2VydmxldFJlc3BvbnNlLmNsYXNzKSkgewotCi0gICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9IG1ldGhvZC5nZXROYW1lKCkuc3Vic3RyaW5nKE1FVEhPRF9QUkVGSVgubGVuZ3RoKCkpLnRvTG93ZXJDYXNlKCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBlbnN1cmUgd2UgZG9uJ3Qgb3ZlcndyaXRlIGV4aXN0aW5nIG1ldGhvZCB3aXRoIHN1cGVyY2xhc3MgbWV0aG9kCi0gICAgICAgICAgICAgICAgaWYgKCFvcGVyYXRpb25DYWNoZS5jb250YWluc0tleShrZXkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbkNhY2hlLnB1dChrZXksIG1ldGhvZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVTZXNzaW9uSW5mb3JtYXRpb24oSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSkgewotICAgICAgICBIYXNoTWFwIHNlcnZpY2VzID0gY29uZmlnQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpLmdldFNlcnZpY2VzKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXEuZ2V0U2Vzc2lvbigpLnNldEF0dHJpYnV0ZShDb25zdGFudHMuU0VSVklDRV9NQVAsIHNlcnZpY2VzKTsKLSAgICAgICAgICAgIHJlcS5nZXRTZXNzaW9uKCkuc2V0QXR0cmlidXRlKENvbnN0YW50cy5TRVJWSUNFX1BBVEgsIGNvbmZpZ0NvbnRleHQuZ2V0U2VydmljZVBhdGgoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KXsKLSAgICAgICAgICAgIGxvZy5pbmZvKCJPbGQgU2VydmxldCBBUEkgOiIgKyB0KTsgICAgCi0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy90cmFuc3BvcnQvaHR0cC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9BYnN0cmFjdEhUVFBTZW5kZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3RyYW5zcG9ydC9odHRwL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL0Fic3RyYWN0SFRUUFNlbmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjZhZGEyLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3RyYW5zcG9ydC9odHRwL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL0Fic3RyYWN0SFRUUFNlbmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjA4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU91dHB1dEZvcm1hdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk9wZXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uVHJhbnNwb3J0T3V0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pMThuLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lk1lc3NhZ2VGb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuVHJhbnNwb3J0VXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLkphdmFVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuV1NETENvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5DcmVkZW50aWFsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5IZWFkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQuSGVhZGVyRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5Ib3N0Q29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5IdHRwQ2xpZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50Lkh0dHBDb25uZWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5IdHRwTWV0aG9kOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50Lkh0dHBNZXRob2RCYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50Lkh0dHBWZXJzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50Lk11bHRpVGhyZWFkZWRIdHRwQ29ubmVjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQuTlRDcmVkZW50aWFsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5OYW1lVmFsdWVQYWlyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50LlVzZXJuYW1lUGFzc3dvcmRDcmVkZW50aWFsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5hdXRoLkF1dGhQb2xpY3k7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQuYXV0aC5BdXRoU2NvcGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQucGFyYW1zLkh0dHBNZXRob2RQYXJhbXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQucGFyYW1zLkh0dHBDb25uZWN0aW9uTWFuYWdlclBhcmFtczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5wYXJhbXMuSHR0cENsaWVudFBhcmFtczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5wcm90b2NvbC5Qcm90b2NvbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC56aXAuR1pJUElucHV0U3RyZWFtOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RIVFRQU2VuZGVyIHsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBTk9OWU1PVVMgPSAiYW5vbnltb3VzIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9YWV9IT1NUX05BTUUgPSAicHJveHlfaG9zdCI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPWFlfUE9SVCA9ICJwcm94eV9wb3J0IjsKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBjaHVua2VkID0gZmFsc2U7Ci0gICAgcHJvdGVjdGVkIFN0cmluZyBodHRwVmVyc2lvbiA9IEhUVFBDb25zdGFudHMuSEVBREVSX1BST1RPQ09MXzExOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhBYnN0cmFjdEhUVFBTZW5kZXIuY2xhc3MpOwotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPVE9DT0xfSFRUUCA9ICJodHRwIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9UT0NPTF9IVFRQUyA9ICJodHRwcyI7Ci0KLSAgICAvKioKLSAgICAgKiBwcm94eWRpc2NyaXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFRyYW5zcG9ydE91dERlc2NyaXB0aW9uIHByb3h5T3V0U2V0dGluZyA9IG51bGw7Ci0gICAgcHJvdGVjdGVkIE9NT3V0cHV0Rm9ybWF0IGZvcm1hdCA9IG5ldyBPTU91dHB1dEZvcm1hdCgpOwotCi0gICAgLyoqCi0gICAgICogaXNBbGxvd2VkUmV0cnkgd2lsbCBiZSB1c2luZyB0byBjaGVjayB3aGVyZSB0aGUKLSAgICAgKiByZXRyeSBzaG91bGQgYmUgYWxsb3dlZCBvciBub3QuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNBbGxvd2VkUmV0cnkgPSBmYWxzZTsKLQotICAgIHB1YmxpYyB2b2lkIHNldENodW5rZWQoYm9vbGVhbiBjaHVua2VkKSB7Ci0gICAgICAgIHRoaXMuY2h1bmtlZCA9IGNodW5rZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SHR0cFZlcnNpb24oU3RyaW5nIHZlcnNpb24pIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBpZiAodmVyc2lvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoSFRUUENvbnN0YW50cy5IRUFERVJfUFJPVE9DT0xfMTEuZXF1YWxzKHZlcnNpb24pKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5odHRwVmVyc2lvbiA9IEhUVFBDb25zdGFudHMuSEVBREVSX1BST1RPQ09MXzExOwotICAgICAgICAgICAgfSBlbHNlIGlmIChIVFRQQ29uc3RhbnRzLkhFQURFUl9QUk9UT0NPTF8xMC5lcXVhbHModmVyc2lvbikpIHsKLSAgICAgICAgICAgICAgICB0aGlzLmh0dHBWZXJzaW9uID0gSFRUUENvbnN0YW50cy5IRUFERVJfUFJPVE9DT0xfMTA7Ci0gICAgICAgICAgICAgICAgLy8gY2h1bmtlZCBpcyBub3QgcG9zc2libGUgd2l0aCBIVFRQLzEuMAotICAgICAgICAgICAgICAgIHRoaXMuY2h1bmtlZCA9IGZhbHNlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KAotICAgICAgICAgICAgICAgICAgICAgICAgIlBhcmFtZXRlciAiICsgSFRUUENvbnN0YW50cy5QUk9UT0NPTF9WRVJTSU9OCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBDYW4gaGF2ZSB2YWx1ZXMgb25seSBIVFRQLzEuMCBvciBIVFRQLzEuMSIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29sbGVjdCB0aGUgSFRUUCBoZWFkZXIgaW5mb3JtYXRpb24gYW5kIHNldCB0aGVtIGluIHRoZSBtZXNzYWdlIGNvbnRleHQKLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXRob2QgSHR0cE1ldGhvZEJhc2UgZnJvbSB3aGljaCB0byBnZXQgaW5mb3JtYXRpb24KLSAgICAgKiBAcGFyYW0gbXNnQ29udGV4dCB0aGUgTWVzc2FnZUNvbnRleHQgaW4gd2hpY2ggdG8gcGxhY2UgdGhlIGluZm9ybWF0aW9uLi4uIE9SIE5PVCEKLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdCBpZiBwcm9ibGVtcyBvY2N1cgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIG9idGFpbkhUVFBIZWFkZXJJbmZvcm1hdGlvbihIdHRwTWV0aG9kQmFzZSBtZXRob2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICAvLyBTZXQgUkVTUE9OU0UgcHJvcGVydGllcyBvbnRvIHRoZSBSRVFVRVNUIG1lc3NhZ2UgY29udGV4dC4gIFRoZXkgd2lsbCBuZWVkIHRvIGJlIGNvcGllZCBvZmYgdGhlIHJlcXVlc3QgY29udGV4dCBvbnRvCi0gICAgICAgIC8vIHRoZSByZXNwb25zZSBjb250ZXh0IGVsc2V3aGVyZSwgZm9yIGV4YW1wbGUgaW4gdGhlIE91dEluT3BlcmF0aW9uQ2xpZW50LgotICAgICAgICBNYXAgdHJhbnNwb3J0SGVhZGVycyA9IG5ldyBDb21tb25zVHJhbnNwb3J0SGVhZGVycyhtZXRob2QuZ2V0UmVzcG9uc2VIZWFkZXJzKCkpOwotICAgICAgICBtc2dDb250ZXh0LnNldFByb3BlcnR5KE1lc3NhZ2VDb250ZXh0LlRSQU5TUE9SVF9IRUFERVJTLCB0cmFuc3BvcnRIZWFkZXJzKTsKLSAgICAgICAgbXNnQ29udGV4dC5zZXRQcm9wZXJ0eShIVFRQQ29uc3RhbnRzLk1DX0hUVFBfU1RBVFVTX0NPREUsIG5ldyBJbnRlZ2VyKG1ldGhvZC5nZXRTdGF0dXNDb2RlKCkpKTsKLSAgICAgICAgSGVhZGVyIGhlYWRlciA9IG1ldGhvZC5nZXRSZXNwb25zZUhlYWRlcihIVFRQQ29uc3RhbnRzLkhFQURFUl9DT05URU5UX1RZUEUpOwotCi0gICAgICAgIGlmIChoZWFkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgSGVhZGVyRWxlbWVudFtdIGhlYWRlcnMgPSBoZWFkZXIuZ2V0RWxlbWVudHMoKTsKLSAgICAgICAgICAgIE1lc3NhZ2VDb250ZXh0IGluTWVzc2FnZUNvbnRleHQgPSBtc2dDb250ZXh0LmdldE9wZXJhdGlvbkNvbnRleHQoKS5nZXRNZXNzYWdlQ29udGV4dCgKLSAgICAgICAgICAgICAgICAgICAgV1NETENvbnN0YW50cy5NRVNTQUdFX0xBQkVMX0lOX1ZBTFVFKTsKLQotICAgICAgICAgICAgT2JqZWN0IGNvbnRlbnRUeXBlID0gaGVhZGVyLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICBPYmplY3QgY2hhclNldEVuYyA9IG51bGw7Ci0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaGVhZGVycy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIE5hbWVWYWx1ZVBhaXIgY2hhcnNldEVuYyA9IGhlYWRlcnNbaV0uZ2V0UGFyYW1ldGVyQnlOYW1lKAotICAgICAgICAgICAgICAgICAgICAgICAgSFRUUENvbnN0YW50cy5DSEFSX1NFVF9FTkNPRElORyk7Ci0gICAgICAgICAgICAgICAgaWYgKGNoYXJzZXRFbmMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjaGFyU2V0RW5jID0gY2hhcnNldEVuYy5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGluTWVzc2FnZUNvbnRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGluTWVzc2FnZUNvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQcm9wZXJ0eShDb25zdGFudHMuQ29uZmlndXJhdGlvbi5DT05URU5UX1RZUEUsIGNvbnRlbnRUeXBlKTsKLSAgICAgICAgICAgICAgICBpbk1lc3NhZ2VDb250ZXh0Ci0gICAgICAgICAgICAgICAgICAgICAgICAuc2V0UHJvcGVydHkoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uQ0hBUkFDVEVSX1NFVF9FTkNPRElORywgY2hhclNldEVuYyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotCi0gICAgICAgICAgICAgICAgLy8gVHJhbnNwb3J0IGRldGFpbHMgd2lsbCBiZSBzdG9yZWQgaW4gYSBIYXNoTWFwIHNvIHRoYXQgYW55Ym9keSBpbnRlcmVzdGVkIGNhbgotICAgICAgICAgICAgICAgIC8vIHJldHJpZXZlIHRoZW0KLSAgICAgICAgICAgICAgICBIYXNoTWFwIHRyYW5zcG9ydEluZm9NYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICAgICAgICAgIHRyYW5zcG9ydEluZm9NYXAucHV0KENvbnN0YW50cy5Db25maWd1cmF0aW9uLkNPTlRFTlRfVFlQRSwgY29udGVudFR5cGUpOwotICAgICAgICAgICAgICAgIHRyYW5zcG9ydEluZm9NYXAucHV0KENvbnN0YW50cy5Db25maWd1cmF0aW9uLkNIQVJBQ1RFUl9TRVRfRU5DT0RJTkcsIGNoYXJTZXRFbmMpOwotCi0gICAgICAgICAgICAgICAgLy90aGUgSGFzaE1hcCBpcyBzdG9yZWQgaW4gdGhlIG91dGdvaW5nIG1lc3NhZ2UuCi0gICAgICAgICAgICAgICAgbXNnQ29udGV4dC5zZXRQcm9wZXJ0eShDb25zdGFudHMuQ29uZmlndXJhdGlvbi5UUkFOU1BPUlRfSU5GT19NQVAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnRJbmZvTWFwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBzZXNzaW9uQ29va2llID0gbnVsbDsKLSAgICAgICAgLy8gUHJvY2VzcyBvbGQgc3R5bGUgaGVhZGVycyBmaXJzdAotICAgICAgICBIZWFkZXJbXSBjb29raWVIZWFkZXJzID0gbWV0aG9kLmdldFJlc3BvbnNlSGVhZGVycyhIVFRQQ29uc3RhbnRzLkhFQURFUl9TRVRfQ09PS0lFKTsKLSAgICAgICAgU3RyaW5nIGN1c3RvbUNvb29raUlkID0gKFN0cmluZykgbXNnQ29udGV4dC5nZXRQcm9wZXJ0eShDb25zdGFudHMuQ1VTVE9NX0NPT0tJRV9JRCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29va2llSGVhZGVycy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgSGVhZGVyRWxlbWVudFtdIGVsZW1lbnRzID0gY29va2llSGVhZGVyc1tpXS5nZXRFbGVtZW50cygpOwotICAgICAgICAgICAgZm9yIChpbnQgZSA9IDA7IGUgPCBlbGVtZW50cy5sZW5ndGg7IGUrKykgewotICAgICAgICAgICAgICAgIEhlYWRlckVsZW1lbnQgZWxlbWVudCA9IGVsZW1lbnRzW2VdOwotICAgICAgICAgICAgICAgIGlmIChDb25zdGFudHMuU0VTU0lPTl9DT09LSUUuZXF1YWxzSWdub3JlQ2FzZShlbGVtZW50LmdldE5hbWUoKSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5TRVNTSU9OX0NPT0tJRV9KU0VTU0lPTklELmVxdWFsc0lnbm9yZUNhc2UoZWxlbWVudC5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNlc3Npb25Db29raWUgPSBwcm9jZXNzQ29va2llSGVhZGVyKGVsZW1lbnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoY3VzdG9tQ29vb2tpSWQgIT0gbnVsbCAmJiBjdXN0b21Db29va2lJZC5lcXVhbHNJZ25vcmVDYXNlKGVsZW1lbnQuZ2V0TmFtZSgpKSkgewotICAgICAgICAgICAgICAgICAgICBzZXNzaW9uQ29va2llID0gcHJvY2Vzc0Nvb2tpZUhlYWRlcihlbGVtZW50KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gT3ZlcndyaXRlIG9sZCBzdHlsZSBjb29raWVzIHdpdGggbmV3IHN0eWxlIG9uZXMgaWYgcHJlc2VudAotICAgICAgICBjb29raWVIZWFkZXJzID0gbWV0aG9kLmdldFJlc3BvbnNlSGVhZGVycyhIVFRQQ29uc3RhbnRzLkhFQURFUl9TRVRfQ09PS0lFMik7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29va2llSGVhZGVycy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgSGVhZGVyRWxlbWVudFtdIGVsZW1lbnRzID0gY29va2llSGVhZGVyc1tpXS5nZXRFbGVtZW50cygpOwotICAgICAgICAgICAgZm9yIChpbnQgZSA9IDA7IGUgPCBlbGVtZW50cy5sZW5ndGg7IGUrKykgewotICAgICAgICAgICAgICAgIEhlYWRlckVsZW1lbnQgZWxlbWVudCA9IGVsZW1lbnRzW2VdOwotICAgICAgICAgICAgICAgIGlmIChDb25zdGFudHMuU0VTU0lPTl9DT09LSUUuZXF1YWxzSWdub3JlQ2FzZShlbGVtZW50LmdldE5hbWUoKSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5TRVNTSU9OX0NPT0tJRV9KU0VTU0lPTklELmVxdWFsc0lnbm9yZUNhc2UoZWxlbWVudC5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNlc3Npb25Db29raWUgPSBwcm9jZXNzQ29va2llSGVhZGVyKGVsZW1lbnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZihjdXN0b21Db29va2lJZCE9bnVsbCYmY3VzdG9tQ29vb2tpSWQuZXF1YWxzSWdub3JlQ2FzZShlbGVtZW50LmdldE5hbWUoKSkpewotICAgICAgICAgICAgICAgICAgICBzZXNzaW9uQ29va2llID0gcHJvY2Vzc0Nvb2tpZUhlYWRlcihlbGVtZW50KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc2Vzc2lvbkNvb2tpZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtc2dDb250ZXh0LmdldFNlcnZpY2VDb250ZXh0KCkuc2V0UHJvcGVydHkoSFRUUENvbnN0YW50cy5DT09LSUVfU1RSSU5HLCBzZXNzaW9uQ29va2llKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIHByb2Nlc3NDb29raWVIZWFkZXIoSGVhZGVyRWxlbWVudCBlbGVtZW50KSB7Ci0gICAgICAgIFN0cmluZyBjb29raWUgPSBlbGVtZW50LmdldE5hbWUoKSArICI9IiArIGVsZW1lbnQuZ2V0VmFsdWUoKTsKLSAgICAgICAgTmFtZVZhbHVlUGFpcltdIHBhcmFtZXRlcnMgPSAgZWxlbWVudC5nZXRQYXJhbWV0ZXJzKCk7Ci0gICAgICAgIGZvciAoaW50IGogPSAwOyBwYXJhbWV0ZXJzICE9IG51bGwgJiYgaiA8IHBhcmFtZXRlcnMubGVuZ3RoOyBqKyspIHsKLSAgICAgICAgICAgIE5hbWVWYWx1ZVBhaXIgcGFyYW1ldGVyID0gcGFyYW1ldGVyc1tqXTsKLSAgICAgICAgICAgIGNvb2tpZSA9IGNvb2tpZSArICI7ICIgKyBwYXJhbWV0ZXIuZ2V0TmFtZSgpICsgIj0iICsgcGFyYW1ldGVyLmdldFZhbHVlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNvb2tpZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzUmVzcG9uc2UoSHR0cE1ldGhvZEJhc2UgaHR0cE1ldGhvZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIG9idGFpbkhUVFBIZWFkZXJJbmZvcm1hdGlvbihodHRwTWV0aG9kLCBtc2dDb250ZXh0KTsKLQotICAgICAgICBJbnB1dFN0cmVhbSBpbiA9IGh0dHBNZXRob2QuZ2V0UmVzcG9uc2VCb2R5QXNTdHJlYW0oKTsKLSAgICAgICAgaWYgKGluID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoTWVzc2FnZXMuZ2V0TWVzc2FnZSgiY2FuTm90QmVOdWxsIiwgIklucHV0U3RyZWFtIikpOwotICAgICAgICB9Ci0gICAgICAgIEhlYWRlciBjb250ZW50RW5jb2RpbmcgPQotICAgICAgICAgICAgICAgIGh0dHBNZXRob2QuZ2V0UmVzcG9uc2VIZWFkZXIoSFRUUENvbnN0YW50cy5IRUFERVJfQ09OVEVOVF9FTkNPRElORyk7Ci0gICAgICAgIGlmIChjb250ZW50RW5jb2RpbmcgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGNvbnRlbnRFbmNvZGluZy5nZXRWYWx1ZSgpLgotICAgICAgICAgICAgICAgICAgICBlcXVhbHNJZ25vcmVDYXNlKEhUVFBDb25zdGFudHMuQ09NUFJFU1NJT05fR1pJUCkpIHsKLSAgICAgICAgICAgICAgICBpbiA9IG5ldyBHWklQSW5wdXRTdHJlYW0oaW4pOwotICAgICAgICAgICAgICAgIC8vIElmIHRoZSBjb250ZW50LWVuY29kaW5nIGlzIGlkZW50aXR5IHdlIGNhbiBiYXNpY2FsbHkgaWdub3JlIGl0LgotICAgICAgICAgICAgfSBlbHNlIGlmICghImlkZW50aXR5Ii5lcXVhbHNJZ25vcmVDYXNlKGNvbnRlbnRFbmNvZGluZy5nZXRWYWx1ZSgpKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoIkhUVFAgOiIgKyAidW5zdXBwb3J0ZWQgY29udGVudC1lbmNvZGluZyBvZiAnIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBjb250ZW50RW5jb2RpbmcuZ2V0VmFsdWUoKSArICInIGZvdW5kIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBPcGVyYXRpb25Db250ZXh0IG9wQ29udGV4dCA9IG1zZ0NvbnRleHQuZ2V0T3BlcmF0aW9uQ29udGV4dCgpOwotICAgICAgICBpZiAob3BDb250ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIG9wQ29udGV4dC5zZXRQcm9wZXJ0eShNZXNzYWdlQ29udGV4dC5UUkFOU1BPUlRfSU4sIGluKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNlbmQoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCwgVVJMIHVybCwgU3RyaW5nIHNvYXBBY3Rpb25TdHJpbmcpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBnZXR0aW5nIGhvc3QgY29uZmlndXJhdGlvbiB0byBzdXBwb3J0IHN0YW5kYXJkIGh0dHAvcywgcHJveHkgYW5kIE5UTE0gc3VwcG9ydAotICAgICAqCi0gICAgICogQHBhcmFtIGNsaWVudCBhY3RpdmUgSHR0cENsaWVudAotICAgICAqIEBwYXJhbSBtc2dDdHggYWN0aXZlIE1lc3NhZ2VDb250ZXh0Ci0gICAgICogQHBhcmFtIHRhcmdldFVSTCB0aGUgdGFyZ2V0IFVSTAotICAgICAqIEByZXR1cm4gYSBIb3N0Q29uZmlndXJhdGlvbiBzZXQgdXAgd2l0aCBwcm94eSBpbmZvcm1hdGlvbgotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0IGlmIHByb2JsZW1zIG9jY3VyCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEhvc3RDb25maWd1cmF0aW9uIGdldEhvc3RDb25maWd1cmF0aW9uKEh0dHBDbGllbnQgY2xpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlQ29udGV4dCBtc2dDdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTCB0YXJnZXRVUkwpdGhyb3dzIEF4aXNGYXVsdCB7Ci0KLSAgICAgICAgYm9vbGVhbiBpc0F1dGhlbnRpY2F0aW9uRW5hYmxlZCA9IGlzQXV0aGVudGljYXRpb25FbmFibGVkKG1zZ0N0eCk7Ci0gICAgICAgIGludCBwb3J0ID0gdGFyZ2V0VVJMLmdldFBvcnQoKTsKLQotICAgICAgICBTdHJpbmcgcHJvdG9jb2wgPSB0YXJnZXRVUkwuZ2V0UHJvdG9jb2woKTsKLSAgICAgICAgaWYgKHBvcnQgPT0gLTEpIHsKLSAgICAgICAgICAgIGlmIChQUk9UT0NPTF9IVFRQLmVxdWFscyhwcm90b2NvbCkpIHsKLSAgICAgICAgICAgICAgICBwb3J0ID0gODA7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKFBST1RPQ09MX0hUVFBTLmVxdWFscyhwcm90b2NvbCkpIHsKLSAgICAgICAgICAgICAgICBwb3J0ID0gNDQzOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotICAgICAgICAvLyB0byBzZWUgdGhlIGhvc3QgaXMgYSBwcm94eSBhbmQgaW4gdGhlIHByb3h5IGxpc3QgLSBhdmFpbGFibGUgaW4gYXhpczIueG1sCi0gICAgICAgIEhvc3RDb25maWd1cmF0aW9uIGNvbmZpZyA9IG5ldyBIb3N0Q29uZmlndXJhdGlvbigpOwotCi0gICAgICAgIC8vIG9uZSBtaWdodCBuZWVkIHRvIHNldCBoaXMgb3duIHNvY2tldCBmYWN0b3J5LiBMZXQncyBhbGxvdyB0aGF0IGNhc2UgYXMgd2VsbC4KLSAgICAgICAgUHJvdG9jb2wgcHJvdG9jb2xIYW5kbGVyID0KLSAgICAgICAgICAgICAgICAoUHJvdG9jb2wpbXNnQ3R4LmdldE9wdGlvbnMoKS5nZXRQcm9wZXJ0eShIVFRQQ29uc3RhbnRzLkNVU1RPTV9QUk9UT0NPTF9IQU5ETEVSKTsKLQotICAgICAgICAvLyBzZXR0aW5nIHRoZSByZWFsIGhvc3QgY29uZmlndXJhdGlvbgotICAgICAgICAvLyBJIGFzc3VtZSB0aGUgOTAlIGNhc2UsIG9yIGV2ZW4gOTklIGNhc2Ugd2lsbCBiZSBubyBwcm90b2NvbCBoYW5kbGVyIGNhc2UuCi0gICAgICAgIGlmIChwcm90b2NvbEhhbmRsZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgY29uZmlnLnNldEhvc3QodGFyZ2V0VVJMLmdldEhvc3QoKSwgcG9ydCwgdGFyZ2V0VVJMLmdldFByb3RvY29sKCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY29uZmlnLnNldEhvc3QodGFyZ2V0VVJMLmdldEhvc3QoKSwgcG9ydCwgcHJvdG9jb2xIYW5kbGVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpc0F1dGhlbnRpY2F0aW9uRW5hYmxlZCkgewotICAgICAgICAgICAgLy8gQmFzaWMsIERpZ2VzdCwgTlRMTSBhbmQgY3VzdG9tIGF1dGhlbnRpY2F0aW9ucy4KLSAgICAgICAgICAgIHRoaXMuc2V0QXV0aGVudGljYXRpb25JbmZvKGNsaWVudCwgbXNnQ3R4LCBjb25maWcpOwotICAgICAgICB9Ci0gICAgICAgIC8vIHByb3h5IGNvbmZpZ3VyYXRpb24KLQotICAgICAgICBpZiAoUHJveHlDb25maWd1cmF0aW9uLmlzUHJveHlFbmFibGVkKG1zZ0N0eCx0YXJnZXRVUkwpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIlByb3h5Q29uZmlndXJhdGlvbiIpOwotICAgICAgICAgICAgUHJveHlDb25maWd1cmF0aW9uIHByb3h5Q29uZmlndXJhdGlvbiA9IG5ldyBQcm94eUNvbmZpZ3VyYXRpb24oKTsKLSAgICAgICAgICAgIHByb3h5Q29uZmlndXJhdGlvbi5jb25maWd1cmUobXNnQ3R4LGNsaWVudCxjb25maWcpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGNvbmZpZzsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0F1dGhlbnRpY2F0aW9uRW5hYmxlZChNZXNzYWdlQ29udGV4dCBtc2dDdHgpIHsKLSAgICAgICAgcmV0dXJuIChtc2dDdHguZ2V0UHJvcGVydHkoSFRUUENvbnN0YW50cy5BVVRIRU5USUNBVEUpICE9IG51bGwpOwotICAgIH0KLQotICAgIC8qCi0gICAgVGhpcyB3aWxsIGhhbmRsZSBzZXJ2ZXIgQXV0aGVudGljYXRpb24sIEl0IGNvdWxkIGJlIGVpdGhlciBOVExNLCBEaWdlc3Qgb3IgQmFzaWMgQXV0aGVudGljYXRpb24uCi0gICAgQXBhcnQgZnJvbSB0aGF0IHVzZXIgY2FuIGNoYW5nZSB0aGUgcHJpb3J5IG9yIGFkZCBhIGN1c3RvbSBhdXRoZW50aWNhdGlvbiBzY2hlbWUuCi0gICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRBdXRoZW50aWNhdGlvbkluZm8oSHR0cENsaWVudCBhZ2VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUNvbnRleHQgbXNnQ3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIb3N0Q29uZmlndXJhdGlvbiBjb25maWcpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBIdHRwVHJhbnNwb3J0UHJvcGVydGllcy5BdXRoZW50aWNhdG9yIGF1dGhlbnRpY2F0b3I7Ci0gICAgICAgIE9iamVjdCBvYmogPSBtc2dDdHguZ2V0UHJvcGVydHkoSFRUUENvbnN0YW50cy5BVVRIRU5USUNBVEUpOwotICAgICAgICBpZiAob2JqICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBIdHRwVHJhbnNwb3J0UHJvcGVydGllcy5BdXRoZW50aWNhdG9yKSB7Ci0gICAgICAgICAgICAgICAgYXV0aGVudGljYXRvciA9IChIdHRwVHJhbnNwb3J0UHJvcGVydGllcy5BdXRoZW50aWNhdG9yKSBvYmo7Ci0KLSAgICAgICAgICAgICAgICBTdHJpbmcgdXNlcm5hbWUgPSBhdXRoZW50aWNhdG9yLmdldFVzZXJuYW1lKCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHBhc3N3b3JkID0gYXV0aGVudGljYXRvci5nZXRQYXNzd29yZCgpOwotICAgICAgICAgICAgICAgIFN0cmluZyBob3N0ID0gYXV0aGVudGljYXRvci5nZXRIb3N0KCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGRvbWFpbiA9IGF1dGhlbnRpY2F0b3IuZ2V0RG9tYWluKCk7Ci0KLSAgICAgICAgICAgICAgICBpbnQgcG9ydCA9IGF1dGhlbnRpY2F0b3IuZ2V0UG9ydCgpOwotICAgICAgICAgICAgICAgIFN0cmluZyByZWFsbSA9IGF1dGhlbnRpY2F0b3IuZ2V0UmVhbG0oKTsKLQotICAgICAgICAgICAgICAgIC8qIElmIHJldHJ5aW5nIGlzIGF2YWlsYWJsZSBzZXQgaXQgZmlyc3QgKi8KLSAgICAgICAgICAgICAgICBpc0FsbG93ZWRSZXRyeSA9IGF1dGhlbnRpY2F0b3IuaXNBbGxvd2VkUmV0cnkoKTsKLQotICAgICAgICAgICAgICAgIENyZWRlbnRpYWxzIGNyZWRzOwotCi0gICAgICAgICAgICAgICAgYWdlbnQuZ2V0UGFyYW1zKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRBdXRoZW50aWNhdGlvblByZWVtcHRpdmUoYXV0aGVudGljYXRvci5nZXRQcmVlbXB0aXZlQXV0aGVudGljYXRpb24oKSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoaG9zdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkb21haW4gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLypDcmVkZW50aWFscyBmb3IgTlRMTSBBdXRoZW50aWNhdGlvbiovCi0gICAgICAgICAgICAgICAgICAgICAgICBjcmVkcyA9IG5ldyBOVENyZWRlbnRpYWxzKHVzZXJuYW1lLCBwYXNzd29yZCwgaG9zdCwgZG9tYWluKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qQ3JlZGVudGlhbHMgZm9yIERpZ2VzdCBhbmQgQmFzaWMgQXV0aGVudGljYXRpb24qLwotICAgICAgICAgICAgICAgICAgICAgICAgY3JlZHMgPSBuZXcgVXNlcm5hbWVQYXNzd29yZENyZWRlbnRpYWxzKHVzZXJuYW1lLCBwYXNzd29yZCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYWdlbnQuZ2V0U3RhdGUoKS5zZXRDcmVkZW50aWFscyhuZXcgQXV0aFNjb3BlKGhvc3QsIHBvcnQsIHJlYWxtKSwgY3JlZHMpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkb21haW4gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLypDcmVkZW50aWFscyBmb3IgTlRMTSBBdXRoZW50aWNhdGlvbiB3aGVuIGhvc3QgaXMgQU5ZX0hPU1QqLwotICAgICAgICAgICAgICAgICAgICAgICAgY3JlZHMgPSBuZXcgTlRDcmVkZW50aWFscyh1c2VybmFtZSwgcGFzc3dvcmQsIEF1dGhTY29wZS5BTllfSE9TVCwgZG9tYWluKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFnZW50LmdldFN0YXRlKCkuc2V0Q3JlZGVudGlhbHMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBdXRoU2NvcGUoQXV0aFNjb3BlLkFOWV9IT1NULCBwb3J0LCByZWFsbSksIGNyZWRzKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qQ3JlZGVudGlhbHMgb25seSBmb3IgRGlnZXN0IGFuZCBCYXNpYyBBdXRoZW50aWNhdGlvbiovCi0gICAgICAgICAgICAgICAgICAgICAgICBjcmVkcyA9IG5ldyBVc2VybmFtZVBhc3N3b3JkQ3JlZGVudGlhbHModXNlcm5hbWUsIHBhc3N3b3JkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFnZW50LmdldFN0YXRlKCkuc2V0Q3JlZGVudGlhbHMobmV3IEF1dGhTY29wZShBdXRoU2NvcGUuQU5ZKSwgY3JlZHMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qIEN1c3RvbWl6aW5nIHRoZSBwcmlvcml0eSBPcmRlciAqLwotICAgICAgICAgICAgICAgIExpc3Qgc2NoZW1lcyA9IGF1dGhlbnRpY2F0b3IuZ2V0QXV0aFNjaGVtZXMoKTsKLSAgICAgICAgICAgICAgICBpZiAoc2NoZW1lcyAhPSBudWxsICYmIHNjaGVtZXMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBMaXN0IGF1dGhQcmVmcyA9IG5ldyBBcnJheUxpc3QoMyk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2NoZW1lcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNjaGVtZXMuZ2V0KGkpIGluc3RhbmNlb2YgQXV0aFBvbGljeSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhQcmVmcy5hZGQoc2NoZW1lcy5nZXQoaSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNjaGVtZSA9IChTdHJpbmcpIHNjaGVtZXMuZ2V0KGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEh0dHBUcmFuc3BvcnRQcm9wZXJ0aWVzLkF1dGhlbnRpY2F0b3IuQkFTSUMuZXF1YWxzKHNjaGVtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRoUHJlZnMuYWRkKEF1dGhQb2xpY3kuQkFTSUMpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChIdHRwVHJhbnNwb3J0UHJvcGVydGllcy5BdXRoZW50aWNhdG9yLk5UTE0uZXF1YWxzKHNjaGVtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRoUHJlZnMuYWRkKEF1dGhQb2xpY3kuTlRMTSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKEh0dHBUcmFuc3BvcnRQcm9wZXJ0aWVzLkF1dGhlbnRpY2F0b3IuRElHRVNULmVxdWFscyhzY2hlbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aFByZWZzLmFkZChBdXRoUG9saWN5LkRJR0VTVCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYWdlbnQuZ2V0UGFyYW1zKCkuc2V0UGFyYW1ldGVyKEF1dGhQb2xpY3kuQVVUSF9TQ0hFTUVfUFJJT1JJVFksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aFByZWZzKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiSHR0cFRyYW5zcG9ydFByb3BlcnRpZXMuQXV0aGVudGljYXRvciBjbGFzcyBjYXN0IGV4Y2VwdGlvbiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgdXNlZCB0byBjb3B5IGFsbCB0aGUgY29tbW9uIHByb3BlcnRpZXMKLSAgICAgKgotICAgICAqIEBwYXJhbSBtc2dDb250ZXh0ICAgICAgIC0gVGhlIG1lc3NhZ2VDb250ZXh0IG9mIHRoZSByZXF1ZXN0IG1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gdXJsICAgICAgICAgICAgICAtIFRoZSB0YXJnZXQgVVJMCi0gICAgICogQHBhcmFtIGh0dHBNZXRob2QgICAgICAgLSBUaGUgaHR0cCBtZXRob2QgdXNlZCB0byBzZW5kIHRoZSByZXF1ZXN0Ci0gICAgICogQHBhcmFtIGh0dHBDbGllbnQgICAgICAgLSBUaGUgaHR0cGNsaWVudCB1c2VkIHRvIHNlbmQgdGhlIHJlcXVlc3QKLSAgICAgKiBAcGFyYW0gc29hcEFjdGlvblN0cmluZyAtIFRoZSBzb2FwIGFjdGlvbiBhdHJpbmcgb2YgdGhlIHJlcXVlc3QgbWVzc2FnZQotICAgICAqIEByZXR1cm4gTWVzc2FnZUZvcm1hdHRlciAtIFRoZSBtZXNzYWdlRm9ybWF0dGVyIGZvciB0aGUgcmVsYXZlbnQgcmVxdWVzdCBtZXNzYWdlCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQgLSBUaHJvd24gaW4gY2FzZSBhbiBleGNlcHRpb24gb2NjdXJzCi0gICAgICovCi0gICAgcHJvdGVjdGVkIE1lc3NhZ2VGb3JtYXR0ZXIgcG9wdWxhdGVDb21tb25Qcm9wZXJ0aWVzKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQsIFVSTCB1cmwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwTWV0aG9kQmFzZSBodHRwTWV0aG9kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cENsaWVudCBodHRwQ2xpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNvYXBBY3Rpb25TdHJpbmcpCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLQotICAgICAgICBpZiAoaXNBdXRoZW50aWNhdGlvbkVuYWJsZWQobXNnQ29udGV4dCkpIHsKLSAgICAgICAgICAgIGh0dHBNZXRob2Quc2V0RG9BdXRoZW50aWNhdGlvbih0cnVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIE1lc3NhZ2VGb3JtYXR0ZXIgbWVzc2FnZUZvcm1hdHRlciA9IFRyYW5zcG9ydFV0aWxzLmdldE1lc3NhZ2VGb3JtYXR0ZXIoCi0gICAgICAgICAgICAgICAgbXNnQ29udGV4dCk7Ci0KLSAgICAgICAgdXJsID0gbWVzc2FnZUZvcm1hdHRlci5nZXRUYXJnZXRBZGRyZXNzKG1zZ0NvbnRleHQsIGZvcm1hdCwgdXJsKTsKLQotICAgICAgICBodHRwTWV0aG9kLnNldFBhdGgodXJsLmdldFBhdGgoKSk7Ci0KLSAgICAgICAgaHR0cE1ldGhvZC5zZXRRdWVyeVN0cmluZyh1cmwuZ2V0UXVlcnkoKSk7Ci0KLSAgICAgICAgaHR0cE1ldGhvZC5zZXRSZXF1ZXN0SGVhZGVyKEhUVFBDb25zdGFudHMuSEVBREVSX0NPTlRFTlRfVFlQRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VGb3JtYXR0ZXIuZ2V0Q29udGVudFR5cGUobXNnQ29udGV4dCwgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2FwQWN0aW9uU3RyaW5nKSk7Ci0KLSAgICAgICAgaHR0cE1ldGhvZC5zZXRSZXF1ZXN0SGVhZGVyKEhUVFBDb25zdGFudHMuSEVBREVSX0hPU1QsIHVybC5nZXRIb3N0KCkpOwotCi0gICAgICAgIGlmIChtc2dDb250ZXh0LmdldE9wdGlvbnMoKSAhPSBudWxsICYmIG1zZ0NvbnRleHQuZ2V0T3B0aW9ucygpLmlzTWFuYWdlU2Vzc2lvbigpKSB7Ci0gICAgICAgICAgICAvLyBzZXR0aW5nIHRoZSBjb29raWUgaW4gdGhlIG91dCBwYXRoCi0gICAgICAgICAgICBPYmplY3QgY29va2llU3RyaW5nID0gbXNnQ29udGV4dC5nZXRQcm9wZXJ0eShIVFRQQ29uc3RhbnRzLkNPT0tJRV9TVFJJTkcpOwotCi0gICAgICAgICAgICBpZiAoY29va2llU3RyaW5nICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoY29va2llU3RyaW5nKTsKLSAgICAgICAgICAgICAgICBodHRwTWV0aG9kLnNldFJlcXVlc3RIZWFkZXIoSFRUUENvbnN0YW50cy5IRUFERVJfQ09PS0lFLCBidWZmZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaHR0cFZlcnNpb24uZXF1YWxzKEhUVFBDb25zdGFudHMuSEVBREVSX1BST1RPQ09MXzEwKSkgewotICAgICAgICAgICAgaHR0cENsaWVudC5nZXRQYXJhbXMoKS5zZXRWZXJzaW9uKEh0dHBWZXJzaW9uLkhUVFBfMV8wKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbWVzc2FnZUZvcm1hdHRlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIGlzIHVzZWQgdG8gZ2V0IHRoZSBkeW5hbWljYWxseSBzZXQgdGltZSBvdXQgdmFsdWVzIGZyb20gdGhlCi0gICAgICogbWVzc2FnZSBjb250ZXh0LiBJZiB0aGUgdmFsdWVzIGFyZSBub3QgYXZhaWxhYmxlIG9yIGludmFsaWQgdGhlbgotICAgICAqIHRoZSBkZWZhdWx0IHZhbHVlcyBvciB0aGUgdmFsdWVzIHNldCBieSB0aGUgY29uZmlndXJhdGlvbiB3aWxsIGJlIHVzZWQKLSAgICAgKgotICAgICAqIEBwYXJhbSBtc2dDb250ZXh0IHRoZSBhY3RpdmUgTWVzc2FnZUNvbnRleHQKLSAgICAgKiBAcGFyYW0gaHR0cENsaWVudAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVUaW1lb3V0cyhNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0LCBIdHRwQ2xpZW50IGh0dHBDbGllbnQpIHsKLSAgICAgICAgLy8gSWYgdGhlIFNPX1RJTUVPVVQgb2YgQ09OTkVDVElPTl9USU1FT1VUIGlzIHNldCBieSBkeW5hbWljYWxseSB0aGUKLSAgICAgICAgLy8gb3ZlcnJpZGUgdGhlIHN0YXRpYyBjb25maWcKLSAgICAgICAgSW50ZWdlciB0ZW1wU29UaW1lb3V0UHJvcGVydHkgPQotICAgICAgICAgICAgICAgIChJbnRlZ2VyKSBtc2dDb250ZXh0LmdldFByb3BlcnR5KEhUVFBDb25zdGFudHMuU09fVElNRU9VVCk7Ci0gICAgICAgIEludGVnZXIgdGVtcENvbm5UaW1lb3V0UHJvcGVydHkgPQotICAgICAgICAgICAgICAgIChJbnRlZ2VyKSBtc2dDb250ZXh0Ci0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UHJvcGVydHkoSFRUUENvbnN0YW50cy5DT05ORUNUSU9OX1RJTUVPVVQpOwotICAgICAgICBsb25nIHRpbWVvdXQgPSBtc2dDb250ZXh0LmdldE9wdGlvbnMoKS5nZXRUaW1lT3V0SW5NaWxsaVNlY29uZHMoKTsKLQotICAgICAgICBpZiAodGVtcENvbm5UaW1lb3V0UHJvcGVydHkgIT0gbnVsbCkgewotICAgICAgICAgICAgaW50IGNvbm5lY3Rpb25UaW1lb3V0ID0gdGVtcENvbm5UaW1lb3V0UHJvcGVydHkuaW50VmFsdWUoKTsKLSAgICAgICAgICAgIC8vIHRpbWVvdXQgZm9yIGluaXRpYWwgY29ubmVjdGlvbgotICAgICAgICAgICAgaHR0cENsaWVudC5nZXRIdHRwQ29ubmVjdGlvbk1hbmFnZXIoKS5nZXRQYXJhbXMoKS5zZXRDb25uZWN0aW9uVGltZW91dChjb25uZWN0aW9uVGltZW91dCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBzZXQgdGltZW91dCBpbiBjbGllbnQKLSAgICAgICAgICAgIGlmICh0aW1lb3V0ID4gMCkgewotICAgICAgICAgICAgICAgIGh0dHBDbGllbnQuZ2V0SHR0cENvbm5lY3Rpb25NYW5hZ2VyKCkuZ2V0UGFyYW1zKCkuc2V0Q29ubmVjdGlvblRpbWVvdXQoKGludCkgdGltZW91dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodGVtcFNvVGltZW91dFByb3BlcnR5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGludCBzb1RpbWVvdXQgPSB0ZW1wU29UaW1lb3V0UHJvcGVydHkuaW50VmFsdWUoKTsKLSAgICAgICAgICAgIC8vIFNPX1RJTUVPVVQgLS0gdGltZW91dCBmb3IgYmxvY2tpbmcgcmVhZHMKLSAgICAgICAgICAgIGh0dHBDbGllbnQuZ2V0SHR0cENvbm5lY3Rpb25NYW5hZ2VyKCkuZ2V0UGFyYW1zKCkuc2V0U29UaW1lb3V0KHNvVGltZW91dCk7Ci0gICAgICAgICAgICBodHRwQ2xpZW50LmdldFBhcmFtcygpLnNldFNvVGltZW91dChzb1RpbWVvdXQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gc2V0IHRpbWVvdXQgaW4gY2xpZW50Ci0gICAgICAgICAgICBpZiAodGltZW91dCA+IDApIHsKLSAgICAgICAgICAgICAgICBodHRwQ2xpZW50LmdldEh0dHBDb25uZWN0aW9uTWFuYWdlcigpLmdldFBhcmFtcygpLnNldFNvVGltZW91dCgoaW50KSB0aW1lb3V0KTsKLSAgICAgICAgICAgICAgICBodHRwQ2xpZW50LmdldFBhcmFtcygpLnNldFNvVGltZW91dCgoaW50KSB0aW1lb3V0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEZvcm1hdChPTU91dHB1dEZvcm1hdCBmb3JtYXQpIHsKLSAgICAgICAgdGhpcy5mb3JtYXQgPSBmb3JtYXQ7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIEh0dHBDbGllbnQgZ2V0SHR0cENsaWVudChNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB7Ci0gICAgICAgIEh0dHBDbGllbnQgaHR0cENsaWVudDsKLSAgICAgICAgZmluYWwgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ29udGV4dCA9IG1zZ0NvbnRleHQuZ2V0Q29uZmlndXJhdGlvbkNvbnRleHQoKTsKLSAgICAgICAgc3luY2hyb25pemVkIChsb2NrKSB7Ci0gICAgICAgICAgICBodHRwQ2xpZW50ID0gKEh0dHBDbGllbnQpIGNvbmZpZ0NvbnRleHQuZ2V0UHJvcGVydHkoSFRUUENvbnN0YW50cy5DQUNIRURfSFRUUF9DTElFTlQpOwotICAgICAgICAgICAgaWYgKGh0dHBDbGllbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGxvZy50cmFjZSgiTWFraW5nIG5ldyBDb25uZWN0aW9uTWFuYWdlciIpOwotICAgICAgICAgICAgICAgIEh0dHBDb25uZWN0aW9uTWFuYWdlciBjb25uTWFuYWdlciA9IG5ldyBNdWx0aVRocmVhZGVkSHR0cENvbm5lY3Rpb25NYW5hZ2VyKCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBJbiBjYXNlIHdlIG5lZWQgdG8gc2V0IGFueSBwYXJhbXMsIGRvIGl0IGhlcmUsIGJ1dCBmb3Igbm93IHVzZSBkZWZhdWx0cy4KLS8vICAgICAgICAgICAgICAgIEh0dHBDb25uZWN0aW9uTWFuYWdlclBhcmFtcyBwYXJhbXMgPSBuZXcgSHR0cENvbm5lY3Rpb25NYW5hZ2VyUGFyYW1zKCk7Ci0vLyAgICAgICAgICAgICAgICBwYXJhbXMuc2V0TWF4Q29ubmVjdGlvbnNQZXJIb3N0KEhvc3RDb25maWd1cmF0aW9uLkFOWV9IT1NUX0NPTkZJR1VSQVRJT04sIDIwMCk7Ci0vLyAgICAgICAgICAgICAgICBldGMuLi4KLS8vICAgICAgICAgICAgICAgIGNvbm5NYW5hZ2VyLnNldFBhcmFtcyhwYXJhbXMpOwotCi0gICAgICAgICAgICAgICAgaHR0cENsaWVudCA9IG5ldyBIdHRwQ2xpZW50KGNvbm5NYW5hZ2VyKTsKLSAgICAgICAgICAgICAgICBIdHRwQ2xpZW50UGFyYW1zIGNsaWVudFBhcmFtcyA9IG5ldyBIdHRwQ2xpZW50UGFyYW1zKCk7Ci0gICAgICAgICAgICAgICAgLy8gU2V0IHRoZSBkZWZhdWx0IHRpbWVvdXQgaW4gY2FzZSB3ZSBoYXZlIGEgY29ubmVjdGlvbiBwb29sIHN0YXJ2YXRpb24gdG8gMzBzZWMKLSAgICAgICAgICAgICAgICBjbGllbnRQYXJhbXMuc2V0Q29ubmVjdGlvbk1hbmFnZXJUaW1lb3V0KDMwMDAwKTsKLSAgICAgICAgICAgICAgICBodHRwQ2xpZW50LnNldFBhcmFtcyhjbGllbnRQYXJhbXMpOwotICAgICAgICAgICAgICAgIGNvbmZpZ0NvbnRleHQuc2V0UHJvcGVydHkoSFRUUENvbnN0YW50cy5DQUNIRURfSFRUUF9DTElFTlQsIGh0dHBDbGllbnQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBHZXQgdGhlIHRpbWVvdXQgdmFsdWVzIHNldCBpbiB0aGUgcnVudGltZQotICAgICAgICAgICAgaW5pdGlhbGl6ZVRpbWVvdXRzKG1zZ0NvbnRleHQsIGh0dHBDbGllbnQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBodHRwQ2xpZW50OwotICAgIH0KLQotICAgIHN0YXRpYyBmaW5hbCBPYmplY3QgbG9jayA9IG5ldyBPYmplY3QoKTsKLSAgICBwcm90ZWN0ZWQgdm9pZCBleGVjdXRlTWV0aG9kKEh0dHBDbGllbnQgaHR0cENsaWVudCwgTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCwgVVJMIHVybCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBIb3N0Q29uZmlndXJhdGlvbiBjb25maWcgPSB0aGlzLmdldEhvc3RDb25maWd1cmF0aW9uKGh0dHBDbGllbnQsIG1zZ0NvbnRleHQsIHVybCk7Ci0KLSAgICAgICAgaWYgKCFtc2dDb250ZXh0LmdldE9wdGlvbnMoKS5pc1VzZVNlcGFyYXRlTGlzdGVuZXIoKSkKLSAgICAgICAgICAgIG1zZ0NvbnRleHQuc2V0UHJvcGVydHkoSFRUUENvbnN0YW50cy5IVFRQX01FVEhPRCwgbWV0aG9kKTsKLQotICAgICAgICAvLyBzZXQgdGhlIGN1c3RvbSBoZWFkZXJzLCBpZiBhdmFpbGFibGUKLSAgICAgICAgYWRkQ3VzdG9tSGVhZGVycyhtZXRob2QsIG1zZ0NvbnRleHQpOwotCi0gICAgICAgIC8vIGFkZCBjb21wcmVzc2lvbiBoZWFkZXJzIGlmIG5lZWRlZAotICAgICAgICBpZiAobXNnQ29udGV4dC5pc1Byb3BlcnR5VHJ1ZShIVFRQQ29uc3RhbnRzLk1DX0FDQ0VQVF9HWklQKSkgewotICAgICAgICAgICAgbWV0aG9kLmFkZFJlcXVlc3RIZWFkZXIoSFRUUENvbnN0YW50cy5IRUFERVJfQUNDRVBUX0VOQ09ESU5HLAotICAgICAgICAgICAgICAgICAgICBIVFRQQ29uc3RhbnRzLkNPTVBSRVNTSU9OX0daSVApOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1zZ0NvbnRleHQuaXNQcm9wZXJ0eVRydWUoSFRUUENvbnN0YW50cy5NQ19HWklQX1JFUVVFU1QpKSB7Ci0gICAgICAgICAgICBtZXRob2QuYWRkUmVxdWVzdEhlYWRlcihIVFRQQ29uc3RhbnRzLkhFQURFUl9DT05URU5UX0VOQ09ESU5HLAotICAgICAgICAgICAgICAgICAgICBIVFRQQ29uc3RhbnRzLkNPTVBSRVNTSU9OX0daSVApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAobXNnQ29udGV4dC5nZXRQcm9wZXJ0eShIVFRQQ29uc3RhbnRzLkhUVFBfTUVUSE9EX1BBUkFNUykgIT0gbnVsbCkgewotICAgICAgICAgICAgSHR0cE1ldGhvZFBhcmFtcyBwYXJhbXMgPSAoSHR0cE1ldGhvZFBhcmFtcyltc2dDb250ZXh0Ci0gICAgICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eShIVFRQQ29uc3RhbnRzLkhUVFBfTUVUSE9EX1BBUkFNUyk7Ci0gICAgICAgICAgICBtZXRob2Quc2V0UGFyYW1zKHBhcmFtcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgY29va2llUG9saWN5ID0gKFN0cmluZykgbXNnQ29udGV4dC5nZXRQcm9wZXJ0eShIVFRQQ29uc3RhbnRzLkNPT0tJRV9QT0xJQ1kpOwotICAgICAgICBpZiAoY29va2llUG9saWN5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1ldGhvZC5nZXRQYXJhbXMoKS5zZXRDb29raWVQb2xpY3koY29va2llUG9saWN5KTsgICAKLSAgICAgICAgfQotICAgICAgICBodHRwQ2xpZW50LmV4ZWN1dGVNZXRob2QoY29uZmlnLCBtZXRob2QpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZEN1c3RvbUhlYWRlcnMoSHR0cE1ldGhvZCBtZXRob2QsIE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHsKLQotICAgICAgICBib29sZWFuIGlzQ3VzdG9tVXNlckFnZW50U2V0ID0gZmFsc2U7Ci0gICAgICAgIC8vIHNldCB0aGUgY3VzdG9tIGhlYWRlcnMsIGlmIGF2YWlsYWJsZQotICAgICAgICBPYmplY3QgaHR0cEhlYWRlcnNPYmogPSBtc2dDb250ZXh0LmdldFByb3BlcnR5KEhUVFBDb25zdGFudHMuSFRUUF9IRUFERVJTKTsKLSAgICAgICAgaWYgKGh0dHBIZWFkZXJzT2JqICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChodHRwSGVhZGVyc09iaiBpbnN0YW5jZW9mIEFycmF5TGlzdCkgewotICAgICAgICAgICAgICAgIEFycmF5TGlzdCBodHRwSGVhZGVycyA9IChBcnJheUxpc3QpIGh0dHBIZWFkZXJzT2JqOwotICAgICAgICAgICAgICAgIEhlYWRlciBoZWFkZXI7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBodHRwSGVhZGVycy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBoZWFkZXIgPSAoSGVhZGVyKSBodHRwSGVhZGVycy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChIVFRQQ29uc3RhbnRzLkhFQURFUl9VU0VSX0FHRU5ULmVxdWFscyhoZWFkZXIuZ2V0TmFtZSgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaXNDdXN0b21Vc2VyQWdlbnRTZXQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1ldGhvZC5hZGRSZXF1ZXN0SGVhZGVyKGhlYWRlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgIAotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGh0dHBIZWFkZXJzT2JqIGluc3RhbmNlb2YgTWFwKSB7Ci0gICAgICAgICAgICAgICAgTWFwIGh0dHBIZWFkZXJzID0gKE1hcCkgaHR0cEhlYWRlcnNPYmo7Ci0gICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGh0dHBIZWFkZXJzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgICAgICBNYXAuRW50cnkgZW50cnkgID0gKE1hcC5FbnRyeSkgaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcga2V5ID0gKFN0cmluZykgZW50cnkuZ2V0S2V5KCk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IChTdHJpbmcpIGVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChIVFRQQ29uc3RhbnRzLkhFQURFUl9VU0VSX0FHRU5ULmVxdWFscyhrZXkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpc0N1c3RvbVVzZXJBZ2VudFNldCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbWV0aG9kLmFkZFJlcXVlc3RIZWFkZXIoa2V5LCB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFpc0N1c3RvbVVzZXJBZ2VudFNldCkgewotICAgICAgICAgICAgU3RyaW5nIHVzZXJBZ2VudFN0cmluZyA9IGdldFVzZXJBZ2VudChtc2dDb250ZXh0KTsKLSAgICAgICAgICAgIG1ldGhvZC5zZXRSZXF1ZXN0SGVhZGVyKEhUVFBDb25zdGFudHMuSEVBREVSX1VTRVJfQUdFTlQsIHVzZXJBZ2VudFN0cmluZyk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldFVzZXJBZ2VudChNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCkgewotICAgICAgICBTdHJpbmcgdXNlckFnZW50U3RyaW5nID0gIkF4aXMyIjsKLSAgICAgICAgYm9vbGVhbiBsb2NrZWQgPSBmYWxzZTsKLSAgICAgICAgaWYgKG1lc3NhZ2VDb250ZXh0LmdldFBhcmFtZXRlcihIVFRQQ29uc3RhbnRzLlVTRVJfQUdFTlQpICE9IG51bGwpIHsKLSAgICAgICAgICAgIE9NRWxlbWVudCB1c2VyQWdlbnRFbGVtZW50ID0KLSAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUNvbnRleHQuZ2V0UGFyYW1ldGVyKEhUVFBDb25zdGFudHMuVVNFUl9BR0VOVCkuZ2V0UGFyYW1ldGVyRWxlbWVudCgpOwotICAgICAgICAgICAgdXNlckFnZW50U3RyaW5nID0gdXNlckFnZW50RWxlbWVudC5nZXRUZXh0KCkudHJpbSgpOwotICAgICAgICAgICAgT01BdHRyaWJ1dGUgbG9ja2VkQXR0cmlidXRlID0gdXNlckFnZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUobmV3IFFOYW1lKCJsb2NrZWQiKSk7Ci0gICAgICAgICAgICBpZiAobG9ja2VkQXR0cmlidXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAobG9ja2VkQXR0cmlidXRlLmdldEF0dHJpYnV0ZVZhbHVlKCkuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvY2tlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIFJ1bnRpbWUgb3ZlcmluZyBwYXJ0Ci0gICAgICAgIGlmICghbG9ja2VkKSB7Ci0gICAgICAgICAgICBpZiAobWVzc2FnZUNvbnRleHQuZ2V0UHJvcGVydHkoSFRUUENvbnN0YW50cy5VU0VSX0FHRU5UKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdXNlckFnZW50U3RyaW5nID0gKFN0cmluZykgbWVzc2FnZUNvbnRleHQuZ2V0UHJvcGVydHkoSFRUUENvbnN0YW50cy5VU0VSX0FHRU5UKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB1c2VyQWdlbnRTdHJpbmc7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvdHJhbnNwb3J0L2h0dHAvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvQXhpc1JlcXVlc3RFbnRpdHkuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3RyYW5zcG9ydC9odHRwL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL0F4aXNSZXF1ZXN0RW50aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkZTMwODQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvdHJhbnNwb3J0L2h0dHAvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvQXhpc1JlcXVlc3RFbnRpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NT3V0cHV0Rm9ybWF0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5NZXNzYWdlRm9ybWF0dGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5KYXZhVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQubWV0aG9kcy5SZXF1ZXN0RW50aXR5OwotCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5GYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLnppcC5HWklQT3V0cHV0U3RyZWFtOwotCi0vKioKLSAqIFRoaXMgUmVxdWVzdCBFbnRpdHkgaXMgdXNlZCBieSB0aGUgSFRUUENvbW1vbnNUcmFuc3BvcnRTZW5kZXIuIFRoaXMgd3JhcHMgdGhlCi0gKiBBeGlzMiBtZXNzYWdlIGZvcm1hdHRlciBvYmplY3QuCi0gKi8KLXB1YmxpYyBjbGFzcyBBeGlzUmVxdWVzdEVudGl0eSBpbXBsZW1lbnRzIFJlcXVlc3RFbnRpdHkgewotCi0gICAgcHJpdmF0ZSBNZXNzYWdlRm9ybWF0dGVyIG1lc3NhZ2VGb3JtYXR0ZXI7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gY2h1bmtlZCA9IGZhbHNlOwotCi0gICAgcHJpdmF0ZSBNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dDsKLQotICAgIHByaXZhdGUgYnl0ZVtdIGJ5dGVzOwotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzQWxsb3dlZFJldHJ5OwotCi0gICAgcHJpdmF0ZSBPTU91dHB1dEZvcm1hdCBmb3JtYXQ7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBzb2FwQWN0aW9uOwotCi0gICAgLyoqCi0gICAgICogTWV0aG9kIGNhbGxzIHRvIHRoaXMgcmVxdWVzdCBlbnRpdHkgYXJlIGRlbGVnYXRlZCB0byB0aGUgZm9sbG93aW5nIEF4aXMyCi0gICAgICogbWVzc2FnZSBmb3JtYXR0ZXIgb2JqZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIG1lc3NhZ2VGb3JtYXR0ZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgQXhpc1JlcXVlc3RFbnRpdHkoTWVzc2FnZUZvcm1hdHRlciBtZXNzYWdlRm9ybWF0dGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0LCBPTU91dHB1dEZvcm1hdCBmb3JtYXQsIFN0cmluZyBzb2FwQWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGNodW5rZWQsIGJvb2xlYW4gaXNBbGxvd2VkUmV0cnkpIHsKLSAgICAgICAgdGhpcy5tZXNzYWdlRm9ybWF0dGVyID0gbWVzc2FnZUZvcm1hdHRlcjsKLSAgICAgICAgdGhpcy5tZXNzYWdlQ29udGV4dCA9IG1zZ0NvbnRleHQ7Ci0gICAgICAgIHRoaXMuY2h1bmtlZCA9IGNodW5rZWQ7Ci0gICAgICAgIHRoaXMuaXNBbGxvd2VkUmV0cnkgPSBpc0FsbG93ZWRSZXRyeTsKLSAgICAgICAgdGhpcy5mb3JtYXQgPSBmb3JtYXQ7Ci0gICAgICAgIHRoaXMuc29hcEFjdGlvbiA9IHNvYXBBY3Rpb247Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNSZXBlYXRhYmxlKCkgewotICAgICAgICAvLyBBbGwgQXhpczIgcmVxdWVzdCBlbnRpdHkgaW1wbGVtZW50YXRpb25zIHdlcmUgcmV0dXJuaW5nIHRoaXMgdHJ1ZQotICAgICAgICAvLyBTbyB3ZSByZXR1cm4gdHJ1ZSBhcyBkZWZ1YWx0Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlUmVxdWVzdChPdXRwdXRTdHJlYW0gb3V0U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBPYmplY3QgZ3ppcCA9IG1lc3NhZ2VDb250ZXh0LmdldE9wdGlvbnMoKS5nZXRQcm9wZXJ0eShIVFRQQ29uc3RhbnRzLk1DX0daSVBfUkVRVUVTVCk7Ci0gICAgICAgIGlmIChnemlwICE9IG51bGwgJiYgSmF2YVV0aWxzLmlzVHJ1ZUV4cGxpY2l0bHkoZ3ppcCkgJiYgY2h1bmtlZCkgewotICAgICAgICAgICAgb3V0U3RyZWFtID0gbmV3IEdaSVBPdXRwdXRTdHJlYW0ob3V0U3RyZWFtKTsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKGNodW5rZWQpIHsKLSAgICAgICAgICAgICAgICBtZXNzYWdlRm9ybWF0dGVyLndyaXRlVG8obWVzc2FnZUNvbnRleHQsIGZvcm1hdCwgb3V0U3RyZWFtLCBpc0FsbG93ZWRSZXRyeSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChieXRlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ5dGVzID0gbWVzc2FnZUZvcm1hdHRlci5nZXRCeXRlcyhtZXNzYWdlQ29udGV4dCwgZm9ybWF0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb3V0U3RyZWFtLndyaXRlKGJ5dGVzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChvdXRTdHJlYW0gaW5zdGFuY2VvZiBHWklQT3V0cHV0U3RyZWFtKSB7Ci0gICAgICAgICAgICAgICAgKChHWklQT3V0cHV0U3RyZWFtKSBvdXRTdHJlYW0pLmZpbmlzaCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgb3V0U3RyZWFtLmZsdXNoKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3IgZSkgewotICAgICAgICAgICAgdGhyb3cgQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHVibGljIGxvbmcgZ2V0Q29udGVudExlbmd0aCgpIHsKLSAgICAgICAgaWYgKGNodW5rZWQpIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYnl0ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBieXRlcyA9IG1lc3NhZ2VGb3JtYXR0ZXIuZ2V0Qnl0ZXMobWVzc2FnZUNvbnRleHQsIGZvcm1hdCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgZSkgewotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYnl0ZXMubGVuZ3RoOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudFR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBtZXNzYWdlRm9ybWF0dGVyLmdldENvbnRlbnRUeXBlKG1lc3NhZ2VDb250ZXh0LCBmb3JtYXQsIHNvYXBBY3Rpb24pOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3RyYW5zcG9ydC9odHRwL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL0F4aXNTZXJ2bGV0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy90cmFuc3BvcnQvaHR0cC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9BeGlzU2VydmxldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDlkOTY2Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3RyYW5zcG9ydC9odHRwL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL0F4aXNTZXJ2bGV0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NjYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuYnVpbGRlci5TdEFYQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUDEyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYXVsdENvZGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkFkZHJlc3NpbmdIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuU2Vzc2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LldhckJhc2VkQXhpc0NvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNCaW5kaW5nTWVzc2FnZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNCaW5kaW5nT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uVHJhbnNwb3J0SW5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlRyYW5zcG9ydE91dERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uV1NETDJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0NvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0VuZ2luZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5IYW5kbGVyLkludm9jYXRpb25SZXNwb25zZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5MaXN0ZW5lck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuUmVxdWVzdFJlc3BvbnNlVHJhbnNwb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0LlRyYW5zcG9ydExpc3RlbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0LlRyYW5zcG9ydFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuc2VydmVyLkh0dHBVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLnV0aWwuUXVlcnlTdHJpbmdQYXJzZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC51dGlsLlJFU1RVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5KYXZhVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLk1lc3NhZ2VDb250ZXh0QnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb25maWc7Ci1pbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dDsKLWltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0OwotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7Ci1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CdWZmZXJlZE91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5uZXQuU29ja2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvdW50RG93bkxhdGNoOwotCi0vKioKLSAqIENsYXNzIEF4aXNTZXJ2bGV0Ci0gKi8KLXB1YmxpYyBjbGFzcyBBeGlzU2VydmxldCBleHRlbmRzIEh0dHBTZXJ2bGV0IGltcGxlbWVudHMgVHJhbnNwb3J0TGlzdGVuZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEF4aXNTZXJ2bGV0LmNsYXNzKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdVUkFUSU9OX0NPTlRFWFQgPSAiQ09ORklHVVJBVElPTl9DT05URVhUIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVNTSU9OX0lEID0gIlNlc3Npb25JZCI7Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2V0PFN0cmluZz4gbWV0YWRhdGFRdWVyeVBhcmFtTmFtZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KAotICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgid3NkbDIiLCAid3NkbCIsICJ4c2QiLCAicG9saWN5IikpOwotICAgIAotICAgIHByb3RlY3RlZCB0cmFuc2llbnQgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ29udGV4dDsKLSAgICBwcm90ZWN0ZWQgdHJhbnNpZW50IEF4aXNDb25maWd1cmF0aW9uIGF4aXNDb25maWd1cmF0aW9uOwotCi0gICAgcHJvdGVjdGVkIHRyYW5zaWVudCBTZXJ2bGV0Q29uZmlnIHNlcnZsZXRDb25maWc7Ci0KLSAgICBwcm90ZWN0ZWQgdHJhbnNpZW50IExpc3RpbmdBZ2VudCBhZ2VudDsKLSAgICBwcm90ZWN0ZWQgdHJhbnNpZW50IFN0cmluZyBjb250ZXh0Um9vdCA9IG51bGw7Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBkaXNhYmxlUkVTVCA9IGZhbHNlOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMSVNUX1NFUlZJQ0VTX1NVRkZJWCA9ICIvc2VydmljZXMvbGlzdFNlcnZpY2VzIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElTVF9GQVVMVFlfU0VSVklDRVNfU1VGRklYID0gIi9zZXJ2aWNlcy9MaXN0RmF1bHR5U2VydmljZXMiOwotICAgIHByaXZhdGUgYm9vbGVhbiBjbG9zZVJlYWRlciA9IHRydWU7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQlVGRkVSX1NJWkUgPSAxMDI0ICogODsKLSAgICAKLSAgICBwcml2YXRlIGJvb2xlYW4gaW5pdENhbGxlZCA9IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICogSW1wbGVtZW50YWlvbiBvZiBQT1NUIGludGVyZmFjZQotICAgICAqCi0gICAgICogQHBhcmFtIHJlcXVlc3QKLSAgICAgKiBAcGFyYW0gcmVzcG9uc2UKLSAgICAgKiBAdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9Qb3N0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQotICAgICAgICAgICAgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAgICAgLy9zZXQgdGhlIGluaXRpYWwgYnVmZmVyIGZvciBhIGxhcmdlciB2YWx1ZQotICAgICAgICB0cnkgewotICAgICAgICByZXNwb25zZS5zZXRCdWZmZXJTaXplKEJVRkZFUl9TSVpFKTsKLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpewotICAgICAgICAgICAgbG9nLmluZm8oIk9sZCBTZXJ2bGV0IEFQSSA6IiArIHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW5pdENvbnRleHRSb290KHJlcXVlc3QpOwotCi0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQ7Ci0gICAgICAgIE91dHB1dFN0cmVhbSBvdXQgPSByZXNwb25zZS5nZXRPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgU3RyaW5nIGNvbnRlbnRUeXBlID0gcmVxdWVzdC5nZXRDb250ZW50VHlwZSgpOwotICAgICAgICBpZiAoIUhUVFBUcmFuc3BvcnRVdGlscy5pc1JFU1RSZXF1ZXN0KGNvbnRlbnRUeXBlKSkgewotICAgICAgICAgICAgbXNnQ29udGV4dCA9IGNyZWF0ZU1lc3NhZ2VDb250ZXh0KHJlcXVlc3QsIHJlc3BvbnNlKTsKLSAgICAgICAgICAgIG1zZ0NvbnRleHQuc2V0UHJvcGVydHkoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uQ09OVEVOVF9UWVBFLCBjb250ZW50VHlwZSk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIC8vIGFkZGluZyBTZXJ2bGV0Q29udGV4dCBpbnRvIG1zZ0NvbnRleHQ7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHVybDsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICB1cmwgPSByZXF1ZXN0LmdldFJlcXVlc3RVUkwoKS50b1N0cmluZygpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KXsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmluZm8oIk9sZCBTZXJ2bGV0IEFQSSAoZmFsbGJhY2sgdG8gSHR0cFNlcnZsZXRSZXF1ZXN0LmdldFJlcXVlc3RVUkkpIDoiICsgdCk7ICAgIAotICAgICAgICAgICAgICAgICAgICB1cmwgPSByZXF1ZXN0LmdldFJlcXVlc3RVUkkoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgSW52b2NhdGlvblJlc3BvbnNlIHBpID0gSFRUUFRyYW5zcG9ydFV0aWxzLgotICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0hUVFBQb3N0UmVxdWVzdChtc2dDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShyZXF1ZXN0LmdldElucHV0U3RyZWFtKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0ob3V0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuZ2V0SGVhZGVyKEhUVFBDb25zdGFudHMuSEVBREVSX1NPQVBfQUNUSU9OKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsKTsKLQotICAgICAgICAgICAgICAgIEJvb2xlYW4gaG9sZFJlc3BvbnNlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChCb29sZWFuKSBtc2dDb250ZXh0LmdldFByb3BlcnR5KFJlcXVlc3RSZXNwb25zZVRyYW5zcG9ydC5IT0xEX1JFU1BPTlNFKTsKLQotICAgICAgICAgICAgICAgIGlmIChwaS5lcXVhbHMoSW52b2NhdGlvblJlc3BvbnNlLlNVU1BFTkQpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAoaG9sZFJlc3BvbnNlICE9IG51bGwgJiYgQm9vbGVhbi5UUlVFLmVxdWFscyhob2xkUmVzcG9uc2UpKSkgewotICAgICAgICAgICAgICAgICAgICAoKFJlcXVlc3RSZXNwb25zZVRyYW5zcG9ydCkgbXNnQ29udGV4dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eShSZXF1ZXN0UmVzcG9uc2VUcmFuc3BvcnQuVFJBTlNQT1JUX0NPTlRST0wpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hd2FpdFJlc3BvbnNlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3htbDsgY2hhcnNldD0iCi0gICAgICAgICAgICAgICAgICAgICAgICArIG1zZ0NvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eShDb25zdGFudHMuQ29uZmlndXJhdGlvbi5DSEFSQUNURVJfU0VUX0VOQ09ESU5HKSk7Ci0gICAgICAgICAgICAgICAgLy8gaWYgZGF0YSBoYXMgbm90IGJlZW4gc2VudCBiYWNrIGFuZCB0aGlzIGlzIG5vdCBhIHNpZ25hbCByZXNwb25zZQotICAgICAgICAgICAgICAgIGlmICghVHJhbnNwb3J0VXRpbHMuaXNSZXNwb25zZVdyaXR0ZW4obXNnQ29udGV4dCkgIAotICAgICAgICAgICAgICAgIAkJJiYgKCgoUmVxdWVzdFJlc3BvbnNlVHJhbnNwb3J0KSAKLSAgICAgICAgICAgICAgICAJCQkJbXNnQ29udGV4dC5nZXRQcm9wZXJ0eSgKLSAgICAgICAgICAgICAgICAJCQkJCQlSZXF1ZXN0UmVzcG9uc2VUcmFuc3BvcnQuVFJBTlNQT1JUX0NPTlRST0wpKS4KLSAgICAgICAgICAgICAgICAJCQkJCQlnZXRTdGF0dXMoKSAhPSBSZXF1ZXN0UmVzcG9uc2VUcmFuc3BvcnQuCi0gICAgICAgICAgICAgICAgCQkJCQkJUmVxdWVzdFJlc3BvbnNlVHJhbnNwb3J0U3RhdHVzLlNJR05BTExFRCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2V0U3RhdHVzKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfQUNDRVBURUQpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGUpIHsKLSAgICAgICAgICAgICAgICBzZXRSZXNwb25zZVN0YXRlKG1zZ0NvbnRleHQsIHJlc3BvbnNlKTsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoZSk7Ci0gICAgICAgICAgICAgICAgaWYgKG1zZ0NvbnRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcm9jZXNzQXhpc0ZhdWx0KG1zZ0NvbnRleHQsIHJlc3BvbnNlLCBvdXQsIGUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0gICAgICAgICAgICAgICAgbG9nLmVycm9yKHQuZ2V0TWVzc2FnZSgpLCB0KTsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgZmF1bHQgaXMgbm90IGdvaW5nIGFsb25nIHRoZSBiYWNrIGNoYW5uZWwgd2Ugc2hvdWxkIGJlIDIwMmluZwotICAgICAgICAgICAgICAgICAgICBpZiAoQWRkcmVzc2luZ0hlbHBlci5pc0ZhdWx0UmVkaXJlY3RlZChtc2dDb250ZXh0KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2V0U3RhdHVzKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfQUNDRVBURUQpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2V0U3RhdHVzKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgQXhpc0JpbmRpbmdPcGVyYXRpb24gYXhpc0JpbmRpbmdPcGVyYXRpb24gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQXhpc0JpbmRpbmdPcGVyYXRpb24pIG1zZ0NvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UHJvcGVydHkoQ29uc3RhbnRzLkFYSVNfQklORElOR19PUEVSQVRJT04pOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF4aXNCaW5kaW5nT3BlcmF0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBeGlzQmluZGluZ01lc3NhZ2UgYXhpc0JpbmRpbmdNZXNzYWdlID0gYXhpc0JpbmRpbmdPcGVyYXRpb24uZ2V0RmF1bHQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU3RyaW5nKSBtc2dDb250ZXh0LmdldFByb3BlcnR5KENvbnN0YW50cy5GQVVMVF9OQU1FKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYXhpc0JpbmRpbmdNZXNzYWdlICE9IG51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyIGNvZGUgPSAoSW50ZWdlcikgYXhpc0JpbmRpbmdNZXNzYWdlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KFdTREwyQ29uc3RhbnRzLkFUVFJfV0hUVFBfQ09ERSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNldFN0YXR1cyhjb2RlLmludFZhbHVlKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZUZhdWx0KG1zZ0NvbnRleHQsIG91dCwgbmV3IEF4aXNGYXVsdCh0LnRvU3RyaW5nKCksIHQpKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgZTIpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmluZm8oZTIpOwotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2VydmxldEV4Y2VwdGlvbihlMik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICBjbG9zZVN0YXhCdWlsZGVyKG1zZ0NvbnRleHQpOwotICAgICAgICAgICAgICAgIFRyYW5zcG9ydFV0aWxzLmRlbGV0ZUF0dGFjaG1lbnRzKG1zZ0NvbnRleHQpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKCFkaXNhYmxlUkVTVCkgewotICAgICAgICAgICAgICAgIG5ldyBSZXN0UmVxdWVzdFByb2Nlc3NvcihDb25zdGFudHMuQ29uZmlndXJhdGlvbi5IVFRQX01FVEhPRF9QT1NULCByZXF1ZXN0LCByZXNwb25zZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9jZXNzWE1MUmVxdWVzdCgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzaG93UmVzdERpc2FibGVkRXJyb3JNZXNzYWdlKHJlc3BvbnNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEltcGxlbWVudGF0aW9uIGZvciBHRVQgaW50ZXJmYWNlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVxdWVzdAotICAgICAqIEBwYXJhbSByZXNwb25zZQotICAgICAqIEB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKi8KLQotICAgIHByb3RlY3RlZCB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0KLSAgICAgICAgaW5pdENvbnRleHRSb290KHJlcXVlc3QpOwotCi0gICAgICAgIC8vIHRoaXMgbWV0aG9kIGlzIGFsc28gdXNlZCB0byBzZXJ2ZSBmb3IgdGhlIGxpc3RTZXJ2aWNlcyByZXF1ZXN0LgotCi0gICAgICAgIFN0cmluZyByZXF1ZXN0VVJJID0gcmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCk7Ci0gICAgICAgIFN0cmluZyBxdWVyeSA9IHJlcXVlc3QuZ2V0UXVlcnlTdHJpbmcoKTsKLQotICAgICAgICAvLyBUaGVyZSBjYW4gYmUgdGhyZWUgZGlmZmVyZW50IHJlcXVlc3QgY29taW5nIHRvIHRoaXMuCi0gICAgICAgIC8vIDEuIHdzZGwsIHdzZGwyIGFuZCB4c2QgcmVxdWVzdHMKLSAgICAgICAgLy8gMi4gbGlzdCBzZXJ2aWNlcyByZXF1ZXN0cwotICAgICAgICAvLyAzLiBSRVNUIHJlcXVlc3RzLgotICAgICAgICBpZiAoKHF1ZXJ5ICE9IG51bGwpICYmIG5ldyBRdWVyeVN0cmluZ1BhcnNlcihxdWVyeSkuc2VhcmNoKG1ldGFkYXRhUXVlcnlQYXJhbU5hbWVzKSkgewotICAgICAgICAgICAgLy8gaGFuZGxpbmcgbWV0YSBkYXRhIGV4Y2hhbmdlIHN0dWZmCi0gICAgICAgICAgICBhZ2VudC5pbml0VHJhbnNwb3J0TGlzdGVuZXIocmVxdWVzdCk7Ci0gICAgICAgICAgICBhZ2VudC5wcm9jZXNzTGlzdFNlcnZpY2UocmVxdWVzdCwgcmVzcG9uc2UpOwotICAgICAgICB9IGVsc2UgaWYgKHJlcXVlc3RVUkkuZW5kc1dpdGgoIi54c2QiKSB8fAotICAgICAgICAgICAgICAgIHJlcXVlc3RVUkkuZW5kc1dpdGgoIi53c2RsIikpIHsKLSAgICAgICAgICAgIGFnZW50LnByb2Nlc3NFeHBsaWNpdFNjaGVtYUFuZFdTREwocmVxdWVzdCwgcmVzcG9uc2UpOwotICAgICAgICB9IGVsc2UgaWYgKHJlcXVlc3RVUkkuZW5kc1dpdGgoTElTVF9TRVJWSUNFU19TVUZGSVgpIHx8Ci0gICAgICAgICAgICAgICAgcmVxdWVzdFVSSS5lbmRzV2l0aChMSVNUX0ZBVUxUWV9TRVJWSUNFU19TVUZGSVgpKSB7Ci0gICAgICAgICAgICAvLyBoYW5kbGluZyBsaXN0IHNlcnZpY2VzIHJlcXVlc3QKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYWdlbnQuaGFuZGxlKHJlcXVlc3QsIHJlc3BvbnNlKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoIWRpc2FibGVSRVNUKSB7Ci0gICAgICAgICAgICBuZXcgUmVzdFJlcXVlc3RQcm9jZXNzb3IoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uSFRUUF9NRVRIT0RfR0VULCByZXF1ZXN0LCByZXNwb25zZSkKLSAgICAgICAgICAgICAgICAgICAgLnByb2Nlc3NVUkxSZXF1ZXN0KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzaG93UmVzdERpc2FibGVkRXJyb3JNZXNzYWdlKHJlc3BvbnNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEltcGxlbWVudGF0aW9uIG9mIERFTEVURSBpbnRlcmZhY2UKLSAgICAgKgotICAgICAqIEBwYXJhbSByZXF1ZXN0Ci0gICAgICogQHBhcmFtIHJlc3BvbnNlCi0gICAgICogQHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqLwotCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9EZWxldGUoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQotICAgICAgICBpbml0Q29udGV4dFJvb3QocmVxdWVzdCk7Ci0gICAgICAgIC8vIHRoaXMgbWV0aG9kIGlzIGFsc28gdXNlZCB0byBzZXJ2ZSBmb3IgdGhlIGxpc3RTZXJ2aWNlcyByZXF1ZXN0LgotICAgICAgICBpZiAoIWRpc2FibGVSRVNUKSB7Ci0gICAgICAgICAgICBuZXcgUmVzdFJlcXVlc3RQcm9jZXNzb3IoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uSFRUUF9NRVRIT0RfREVMRVRFLCByZXF1ZXN0LCByZXNwb25zZSkKLSAgICAgICAgICAgICAgICAgICAgLnByb2Nlc3NVUkxSZXF1ZXN0KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzaG93UmVzdERpc2FibGVkRXJyb3JNZXNzYWdlKHJlc3BvbnNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEltcGxlbWVudGF0aW9uIG9mIFBVVCBpbnRlcmZhY2UKLSAgICAgKgotICAgICAqIEBwYXJhbSByZXF1ZXN0Ci0gICAgICogQHBhcmFtIHJlc3BvbnNlCi0gICAgICogQHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGRvUHV0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0KLSAgICAgICAgaW5pdENvbnRleHRSb290KHJlcXVlc3QpOwotICAgICAgICAvLyB0aGlzIG1ldGhvZCBpcyBhbHNvIHVzZWQgdG8gc2VydmUgZm9yIHRoZSBsaXN0U2VydmljZXMgcmVxdWVzdC4KLSAgICAgICAgaWYgKCFkaXNhYmxlUkVTVCkgewotICAgICAgICAgICAgbmV3IFJlc3RSZXF1ZXN0UHJvY2Vzc29yKENvbnN0YW50cy5Db25maWd1cmF0aW9uLkhUVFBfTUVUSE9EX1BVVCwgcmVxdWVzdCwgcmVzcG9uc2UpCi0gICAgICAgICAgICAgICAgICAgIC5wcm9jZXNzWE1MUmVxdWVzdCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc2hvd1Jlc3REaXNhYmxlZEVycm9yTWVzc2FnZShyZXNwb25zZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcml2YXRlIG1ldGhvZCB0aGF0IGRlYWxzIHdpdGggZGlzYWJsaW5nIG9mIFJFU1Qgc3VwcG9ydC4KLSAgICAgKgotICAgICAqIEBwYXJhbSByZXNwb25zZQotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzaG93UmVzdERpc2FibGVkRXJyb3JNZXNzYWdlKEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIFByaW50V3JpdGVyIHdyaXRlciA9IG5ldyBQcmludFdyaXRlcihyZXNwb25zZS5nZXRPdXRwdXRTdHJlYW0oKSk7Ci0gICAgICAgIHdyaXRlci5wcmludGxuKCI8aHRtbD48Ym9keT48aDI+UGxlYXNlIGVuYWJsZSBSRVNUIHN1cHBvcnQgaW4gV0VCLUlORi9jb25mL2F4aXMyLnhtbCAiICsKLSAgICAgICAgICAgICAgICAiYW5kIFdFQi1JTkYvd2ViLnhtbDwvaDI+PC9ib2R5PjwvaHRtbD4iKTsKLSAgICAgICAgd3JpdGVyLmZsdXNoKCk7Ci0gICAgICAgIHJlc3BvbnNlLnNldFN0YXR1cyhIdHRwU2VydmxldFJlc3BvbnNlLlNDX0FDQ0VQVEVEKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDbG9zZSB0aGUgYnVpbGRlcnMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVzc2FnZUNvbnRleHQKLSAgICAgKiBAdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY2xvc2VTdGF4QnVpbGRlcihNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCkgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24gewotICAgICAgICBpZiAoY2xvc2VSZWFkZXIgJiYgbWVzc2FnZUNvbnRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBTT0FQRW52ZWxvcGUgZW52ZWxvcGUgPSBtZXNzYWdlQ29udGV4dC5nZXRFbnZlbG9wZSgpOwotICAgICAgICAgICAgICAgIGlmKGVudmVsb3BlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RBWEJ1aWxkZXIgYnVpbGRlciA9IChTdEFYQnVpbGRlcikgZW52ZWxvcGUuZ2V0QnVpbGRlcigpOwotICAgICAgICAgICAgICAgICAgICBpZiAoYnVpbGRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhlLnRvU3RyaW5nKCksIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJvY2Vzc2luZyBmb3IgZmF1bHRzCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbXNnQ29udGV4dAotICAgICAqIEBwYXJhbSByZXMKLSAgICAgKiBAcGFyYW0gb3V0Ci0gICAgICogQHBhcmFtIGUKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0F4aXNGYXVsdChNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdXRwdXRTdHJlYW0gb3V0LCBBeGlzRmF1bHQgZSkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSWYgdGhlIGZhdWx0IGlzIG5vdCBnb2luZyBhbG9uZyB0aGUgYmFjayBjaGFubmVsIHdlIHNob3VsZCBiZSAyMDJpbmcKLSAgICAgICAgICAgIGlmIChBZGRyZXNzaW5nSGVscGVyLmlzRmF1bHRSZWRpcmVjdGVkKG1zZ0NvbnRleHQpKSB7Ci0gICAgICAgICAgICAgICAgcmVzLnNldFN0YXR1cyhIdHRwU2VydmxldFJlc3BvbnNlLlNDX0FDQ0VQVEVEKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0KLSAgICAgICAgICAgICAgICBTdHJpbmcgc3RhdHVzID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChTdHJpbmcpIG1zZ0NvbnRleHQuZ2V0UHJvcGVydHkoQ29uc3RhbnRzLkhUVFBfUkVTUE9OU0VfU1RBVEUpOwotICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXMuc2V0U3RhdHVzKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZXMuc2V0U3RhdHVzKEludGVnZXIucGFyc2VJbnQoc3RhdHVzKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgQXhpc0JpbmRpbmdPcGVyYXRpb24gYXhpc0JpbmRpbmdPcGVyYXRpb24gPQotICAgICAgICAgICAgICAgICAgICAgICAgKEF4aXNCaW5kaW5nT3BlcmF0aW9uKSBtc2dDb250ZXh0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eShDb25zdGFudHMuQVhJU19CSU5ESU5HX09QRVJBVElPTik7Ci0gICAgICAgICAgICAgICAgaWYgKGF4aXNCaW5kaW5nT3BlcmF0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgQXhpc0JpbmRpbmdNZXNzYWdlIGZhdWx0ID0gYXhpc0JpbmRpbmdPcGVyYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RmF1bHQoKFN0cmluZykgbXNnQ29udGV4dC5nZXRQcm9wZXJ0eShDb25zdGFudHMuRkFVTFRfTkFNRSkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZmF1bHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlciBjb2RlID0gKEludGVnZXIpIGZhdWx0LmdldFByb3BlcnR5KFdTREwyQ29uc3RhbnRzLkFUVFJfV0hUVFBfQ09ERSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzLnNldFN0YXR1cyhjb2RlLmludFZhbHVlKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaGFuZGxlRmF1bHQobXNnQ29udGV4dCwgb3V0LCBlKTsKLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGUyKSB7Ci0gICAgICAgICAgICBsb2cuaW5mbyhlMik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVGYXVsdChNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0LCBPdXRwdXRTdHJlYW0gb3V0LCBBeGlzRmF1bHQgZSkKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBtc2dDb250ZXh0LnNldFByb3BlcnR5KE1lc3NhZ2VDb250ZXh0LlRSQU5TUE9SVF9PVVQsIG91dCk7Ci0KLSAgICAgICAgTWVzc2FnZUNvbnRleHQgZmF1bHRDb250ZXh0ID0KLSAgICAgICAgICAgICAgICBNZXNzYWdlQ29udGV4dEJ1aWxkZXIuY3JlYXRlRmF1bHRNZXNzYWdlQ29udGV4dChtc2dDb250ZXh0LCBlKTsKLSAgICAgICAgLy8gU09BUCAxLjIgc3BlY2lmaWNhdGlvbiBtZW50aW9ucyB0aGF0IHdlIHNob3VsZCBzZW5kIEhUVFAgY29kZSA0MDAgaW4gYSBmYXVsdCBpZiB0aGUKLSAgICAgICAgLy8gZmF1bHQgY29kZSBTZW5kZXIKLSAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSA9Ci0gICAgICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UpIG1zZ0NvbnRleHQuZ2V0UHJvcGVydHkoSFRUUENvbnN0YW50cy5NQ19IVFRQX1NFUlZMRVRSRVNQT05TRSk7Ci0gICAgICAgIGlmIChyZXNwb25zZSAhPSBudWxsKSB7Ci0KLSAgICAgICAgICAgIC8vVE9ETyA6IENoZWNrIGZvciBTT0FQIDEuMiEKLSAgICAgICAgICAgIFNPQVBGYXVsdENvZGUgY29kZSA9IGZhdWx0Q29udGV4dC5nZXRFbnZlbG9wZSgpLmdldEJvZHkoKS5nZXRGYXVsdCgpLmdldENvZGUoKTsKLQotICAgICAgICAgICAgT01FbGVtZW50IHZhbHVlRWxlbWVudCA9IG51bGw7Ci0gICAgICAgICAgICBpZiAoY29kZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdmFsdWVFbGVtZW50ID0gY29kZS5nZXRGaXJzdENoaWxkV2l0aE5hbWUobmV3IFFOYW1lKAotICAgICAgICAgICAgICAgICAgICAgICAgU09BUDEyQ29uc3RhbnRzLlNPQVBfRU5WRUxPUEVfTkFNRVNQQUNFX1VSSSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFNPQVAxMkNvbnN0YW50cy5TT0FQX0ZBVUxUX1ZBTFVFX0xPQ0FMX05BTUUpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHZhbHVlRWxlbWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKFNPQVAxMkNvbnN0YW50cy5GQVVMVF9DT0RFX1NFTkRFUi5lcXVhbHModmFsdWVFbGVtZW50LmdldFRleHRBc1FOYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAhbXNnQ29udGV4dC5pc0RvaW5nUkVTVCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNldFN0YXR1cyhIdHRwU2VydmxldFJlc3BvbnNlLlNDX0JBRF9SRVFVRVNUKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotCi0gICAgICAgIEF4aXNFbmdpbmUuc2VuZEZhdWx0KGZhdWx0Q29udGV4dCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWFpbiBpbml0IG1ldGhvZAotICAgICAqCi0gICAgICogQHBhcmFtIGNvbmZpZwotICAgICAqIEB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGluaXQoU2VydmxldENvbmZpZyBjb25maWcpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIHsKLSAgICAgICAgCi0gICAgICAgIC8vIHByZXZlbnQgdGhpcyBtZXRob2QgZnJvbSBiZWluZyBjYWxsZWQgbW9yZSB0aGFuIG9uY2UgcGVyIGluc3RhbmNlCi0gICAgICAgIGluaXRDYWxsZWQgPSB0cnVlOwotICAgICAgICBzdXBlci5pbml0KGNvbmZpZyk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB0aGlzLnNlcnZsZXRDb25maWcgPSBjb25maWc7Ci0gICAgICAgICAgICBTZXJ2bGV0Q29udGV4dCBzZXJ2bGV0Q29udGV4dCA9IHNlcnZsZXRDb25maWcuZ2V0U2VydmxldENvbnRleHQoKTsKLSAgICAgICAgICAgIHRoaXMuY29uZmlnQ29udGV4dCA9Ci0gICAgICAgICAgICAgICAgICAgIChDb25maWd1cmF0aW9uQ29udGV4dCkgc2VydmxldENvbnRleHQuZ2V0QXR0cmlidXRlKENPTkZJR1VSQVRJT05fQ09OVEVYVCk7Ci0gICAgICAgICAgICBpZihjb25maWdDb250ZXh0ID09IG51bGwpewotICAgICAgICAgICAgICAgIGNvbmZpZ0NvbnRleHQgPSBpbml0Q29uZmlnQ29udGV4dChjb25maWcpOwotICAgICAgICAgICAgICAgIGNvbmZpZy5nZXRTZXJ2bGV0Q29udGV4dCgpLnNldEF0dHJpYnV0ZShDT05GSUdVUkFUSU9OX0NPTlRFWFQsIGNvbmZpZ0NvbnRleHQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXhpc0NvbmZpZ3VyYXRpb24gPSBjb25maWdDb250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCk7Ci0KLSAgICAgICAgICAgIExpc3RlbmVyTWFuYWdlciBsaXN0ZW5lck1hbmFnZXIgPSBuZXcgTGlzdGVuZXJNYW5hZ2VyKCk7Ci0gICAgICAgICAgICBsaXN0ZW5lck1hbmFnZXIuaW5pdChjb25maWdDb250ZXh0KTsKLSAgICAgICAgICAgIFRyYW5zcG9ydEluRGVzY3JpcHRpb24gdHJhbnNwb3J0SW5EZXNjcmlwdGlvbiA9IG5ldyBUcmFuc3BvcnRJbkRlc2NyaXB0aW9uKAotICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuVFJBTlNQT1JUX0hUVFApOwotICAgICAgICAgICAgdHJhbnNwb3J0SW5EZXNjcmlwdGlvbi5zZXRSZWNlaXZlcih0aGlzKTsKLSAgICAgICAgICAgIGxpc3RlbmVyTWFuYWdlci5hZGRMaXN0ZW5lcih0cmFuc3BvcnRJbkRlc2NyaXB0aW9uLCB0cnVlKTsKLSAgICAgICAgICAgIGxpc3RlbmVyTWFuYWdlci5zdGFydCgpOwotICAgICAgICAgICAgTGlzdGVuZXJNYW5hZ2VyLmRlZmF1bHRDb25maWd1cmF0aW9uQ29udGV4dCA9IGNvbmZpZ0NvbnRleHQ7Ci0gICAgICAgICAgICBhZ2VudCA9IG5ldyBMaXN0aW5nQWdlbnQoY29uZmlnQ29udGV4dCk7Ci0KLSAgICAgICAgICAgIGluaXRQYXJhbXMoKTsKLQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBkaXN0cm95IHRoZSBDb25maWd1cmF0aW9uQ29udGV4dAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRlc3Ryb3koKSB7Ci0gICAgICAgIC8vc3RvcGluZyBsaXN0bmVyIG1hbmFnZXIKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChjb25maWdDb250ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjb25maWdDb250ZXh0LnRlcm1pbmF0ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgYXhpc0ZhdWx0KSB7Ci0gICAgICAgICAgICBsb2cuaW5mbyhheGlzRmF1bHQuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgc3VwZXIuZGVzdHJveSgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbG9nLmluZm8oZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5pdGlhbGl6ZXMgdGhlIEF4aXMyIHBhcmFtZXRlcnMuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdFBhcmFtcygpIHsKLSAgICAgICAgUGFyYW1ldGVyIHBhcmFtZXRlcjsKLSAgICAgICAgLy8gZG8gd2UgbmVlZCB0byBjb21wbGV0ZWx5IGRpc2FibGUgUkVTVCBzdXBwb3J0Ci0gICAgICAgIHBhcmFtZXRlciA9IGF4aXNDb25maWd1cmF0aW9uLmdldFBhcmFtZXRlcihDb25zdGFudHMuQ29uZmlndXJhdGlvbi5ESVNBQkxFX1JFU1QpOwotICAgICAgICBpZiAocGFyYW1ldGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGRpc2FibGVSRVNUID0gIUphdmFVdGlscy5pc0ZhbHNlRXhwbGljaXRseShwYXJhbWV0ZXIuZ2V0VmFsdWUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTaG91bGQgd2UgY2xvc2UgdGhlIHJlYWRlcihzKQotICAgICAgICBwYXJhbWV0ZXIgPSBheGlzQ29uZmlndXJhdGlvbi5nZXRQYXJhbWV0ZXIoImF4aXMyLmNsb3NlLnJlYWRlciIpOwotICAgICAgICBpZiAocGFyYW1ldGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNsb3NlUmVhZGVyID0gSmF2YVV0aWxzLmlzVHJ1ZUV4cGxpY2l0bHkocGFyYW1ldGVyLmdldFZhbHVlKCkpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZW5pZW50IG1ldGhvZCB0byByZS1pbml0aWFsaXplIHRoZSBDb25maWd1cmF0aW9uQ29udGV4dAotICAgICAqCi0gICAgICogQHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW5pdCgpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHRoaXMuc2VydmxldENvbmZpZyAhPSBudWxsCi0gICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgICAgICAhaW5pdENhbGxlZCkgewotICAgICAgICAgICAgaW5pdCh0aGlzLnNlcnZsZXRDb25maWcpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5pdGlhbGl6ZSB0aGUgQXhpcyBjb25maWd1cmF0aW9uIGNvbnRleHQKLSAgICAgKgotICAgICAqIEBwYXJhbSBjb25maWcgU2VydmxldCBjb25maWd1cmF0aW9uCi0gICAgICogQHJldHVybiBDb25maWd1cmF0aW9uQ29udGV4dAotICAgICAqIEB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCBDb25maWd1cmF0aW9uQ29udGV4dCBpbml0Q29uZmlnQ29udGV4dChTZXJ2bGV0Q29uZmlnIGNvbmZpZykgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ29udGV4dCA9Ci0gICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jcmVhdGVDb25maWd1cmF0aW9uQ29udGV4dChuZXcgV2FyQmFzZWRBeGlzQ29uZmlndXJhdG9yKGNvbmZpZykpOwotICAgICAgICAgICAgY29uZmlnQ29udGV4dC5zZXRQcm9wZXJ0eShDb25zdGFudHMuQ09OVEFJTkVSX01BTkFHRUQsIENvbnN0YW50cy5WQUxVRV9UUlVFKTsKLSAgICAgICAgICAgIHJldHVybiBjb25maWdDb250ZXh0OwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbG9nLmluZm8oZSk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU2VydmxldEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgY29udGV4dCByb290IGlmIGl0IGlzIG5vdCBzZXQgYWxyZWFkeS4KLSAgICAgKgotICAgICAqIEBwYXJhbSByZXEKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbml0Q29udGV4dFJvb3QoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSkgewotICAgICAgICBpZiAoY29udGV4dFJvb3QgIT0gbnVsbCAmJiBjb250ZXh0Um9vdC50cmltKCkubGVuZ3RoKCkgIT0gMCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZyBjb250ZXh0UGF0aCA9IG51bGw7Ci0gICAgICAgIC8vIFN1cHBvcnQgb2xkZXIgc2VydmxldCBBUEkncwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY29udGV4dFBhdGggPSByZXEuZ2V0Q29udGV4dFBhdGgoKTsKLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgICAgIGxvZy5pbmZvKCJPbGQgU2VydmxldCBBUEkgKEZhbGxiYWNrIHRvIEh0dHBTZXJ2bGV0UmVxdWVzdC5nZXRTZXJ2bGV0UGF0aCkgOiIgKyB0KTsgICAgCi0gICAgICAgICAgICBjb250ZXh0UGF0aCA9IHJlcS5nZXRTZXJ2bGV0UGF0aCgpOwotICAgICAgICB9Ci0gICAgICAgIC8vaGFuZGxpbmcgUk9PVCBzY2VuYXJpbywgZm9yIHNlcnZsZXRzIGluIHRoZSBkZWZhdWx0IChyb290KSBjb250ZXh0LCB0aGlzIG1ldGhvZCByZXR1cm5zICIiCi0gICAgICAgIGlmIChjb250ZXh0UGF0aCAhPSBudWxsICYmIGNvbnRleHRQYXRoLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIGNvbnRleHRQYXRoID0gIi8iOwotICAgICAgICB9Ci0gICAgICAgIHRoaXMuY29udGV4dFJvb3QgPSBjb250ZXh0UGF0aDsKLQotICAgICAgICBjb25maWdDb250ZXh0LnNldENvbnRleHRSb290KGNvbnRleHRSb290KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYWxsIHRyYW5zcG9ydCBoZWFkZXJzLgotICAgICAqCi0gICAgICogQHBhcmFtIHJlcQotICAgICAqIEByZXR1cm4gTWFwCi0gICAgICovCi0gICAgcHJvdGVjdGVkIE1hcCBnZXRUcmFuc3BvcnRIZWFkZXJzKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBUcmFuc3BvcnRIZWFkZXJzKHJlcSk7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgRW5kcG9pbnRSZWZlcmVuY2UgZ2V0RVBSRm9yU2VydmljZShTdHJpbmcgc2VydmljZU5hbWUsIFN0cmluZyBpcCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIHJldHVybiBnZXRFUFJzRm9yU2VydmljZShzZXJ2aWNlTmFtZSwgaXApWzBdOwotICAgIH0KLQotICAgIHB1YmxpYyBFbmRwb2ludFJlZmVyZW5jZVtdIGdldEVQUnNGb3JTZXJ2aWNlKFN0cmluZyBzZXJ2aWNlTmFtZSwgU3RyaW5nIGlwKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgLy9SVU5OSU5HX1BPUlQKLSAgICAgICAgU3RyaW5nIHBvcnQgPSAoU3RyaW5nKSBjb25maWdDb250ZXh0LmdldFByb3BlcnR5KExpc3RpbmdBZ2VudC5SVU5OSU5HX1BPUlQpOwotICAgICAgICBpZiAocG9ydCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBwb3J0ID0gIjgwODAiOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGlwID0gVXRpbHMuZ2V0SXBBZGRyZXNzKGF4aXNDb25maWd1cmF0aW9uKTsKLSAgICAgICAgICAgICAgICBpZiAoaXAgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpcCA9ICJsb2NhbGhvc3QiOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKFNvY2tldEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBlbmRwb2ludFJlZmVybmNlID0gImh0dHA6Ly8iICsgaXAgKyAiOiIgKyBwb3J0OwotICAgICAgICBpZiAoY29uZmlnQ29udGV4dC5nZXRTZXJ2aWNlQ29udGV4dFBhdGgoKS5zdGFydHNXaXRoKCIvIikpIHsKLSAgICAgICAgICAgIGVuZHBvaW50UmVmZXJuY2UgPSBlbmRwb2ludFJlZmVybmNlICsKLSAgICAgICAgICAgICAgICAgICAgY29uZmlnQ29udGV4dC5nZXRTZXJ2aWNlQ29udGV4dFBhdGgoKSArICIvIiArIHNlcnZpY2VOYW1lOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZW5kcG9pbnRSZWZlcm5jZSA9IGVuZHBvaW50UmVmZXJuY2UgKyAnLycgKwotICAgICAgICAgICAgICAgICAgICBjb25maWdDb250ZXh0LmdldFNlcnZpY2VDb250ZXh0UGF0aCgpICsgIi8iICsgc2VydmljZU5hbWU7Ci0gICAgICAgIH0KLSAgICAgICAgRW5kcG9pbnRSZWZlcmVuY2UgZW5kcG9pbnQgPSBuZXcgRW5kcG9pbnRSZWZlcmVuY2UoZW5kcG9pbnRSZWZlcm5jZSArICIvIik7Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBFbmRwb2ludFJlZmVyZW5jZVtde2VuZHBvaW50fTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBpbml0KCk7IHN0YXJ0KCkgYW5kIHN0b3AoKSB3b3VsZG4ndCBkbyBhbnl0aGluZy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBheGlzQ29uZgotICAgICAqIEBwYXJhbSB0cmFuc3BydEluCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbml0KENvbmZpZ3VyYXRpb25Db250ZXh0IGF4aXNDb25mLAotICAgICAgICAgICAgICAgICAgICAgVHJhbnNwb3J0SW5EZXNjcmlwdGlvbiB0cmFuc3BydEluKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHRocm93cyBBeGlzRmF1bHQgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHN0b3AoKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gcmVxdWVzdAotICAgICAqIEBwYXJhbSByZXNwb25zZQotICAgICAqIEBwYXJhbSBpbnZvY2F0aW9uVHlwZSA6IElmIGludm9jYXRpb25UeXBlPXRydWU7IHRoZW4gdGhpcyB3aWxsIGJlIHVzZWQgaW4gU09BUCBtZXNzYWdlCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgIGludm9jYXRpb24uIElmIGludm9jYXRpb25UeXBlPWZhbHNlOyB0aGVuIHRoaXMgd2lsbCBiZSB1c2VkIGluIFJFU1QgbWVzc2FnZSBpbnZvY2F0aW9uLgotICAgICAqIEByZXR1cm4gTWVzc2FnZUNvbnRleHQKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIE1lc3NhZ2VDb250ZXh0IGNyZWF0ZU1lc3NhZ2VDb250ZXh0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGludm9jYXRpb25UeXBlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0ID0gY29uZmlnQ29udGV4dC5jcmVhdGVNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBTdHJpbmcgcmVxdWVzdFVSSSA9IHJlcXVlc3QuZ2V0UmVxdWVzdFVSSSgpOwotCi0gICAgICAgIFN0cmluZyB0cnNQcmVmaXggPSBudWxsOwotICAgICAgICBpbnQgc2VwaW5kZXggPSAtMTsKLSAgICAgICAgLy8gU3VwcG9ydCBvbGRlciBzZXJ2bGV0IEFQSSdzCi0gICAgICAgIHRyeSB7IAotICAgICAgICAgICAgdHJzUHJlZml4ID0gcmVxdWVzdC5nZXRSZXF1ZXN0VVJMKCkudG9TdHJpbmcoKTsKLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpewotICAgICAgICAgICAgbG9nLmluZm8oIk9sZCBTZXJ2bGV0IEFQSSAoRmFsbGJhY2sgdG8gSHR0cFNlcnZsZXRSZXF1ZXN0LmdldFJlcXVlc3RVUkkpIDoiICsgdCk7ICAgIAotICAgICAgICAgICAgdHJzUHJlZml4ID0gcmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCk7Ci0gICAgICAgIH0KLSAgICAgICAgc2VwaW5kZXggPSB0cnNQcmVmaXguaW5kZXhPZignOicpOwotICAgICAgICBpZiAoc2VwaW5kZXggPiAtMSkgewotICAgICAgICAgICAgdHJzUHJlZml4ID0gdHJzUHJlZml4LnN1YnN0cmluZygwLCBzZXBpbmRleCk7Ci0gICAgICAgICAgICBtc2dDb250ZXh0LnNldEluY29taW5nVHJhbnNwb3J0TmFtZSh0cnNQcmVmaXgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbXNnQ29udGV4dC5zZXRJbmNvbWluZ1RyYW5zcG9ydE5hbWUoQ29uc3RhbnRzLlRSQU5TUE9SVF9IVFRQKTsKLSAgICAgICAgICAgIHRyc1ByZWZpeCA9IENvbnN0YW50cy5UUkFOU1BPUlRfSFRUUDsKLSAgICAgICAgfQotICAgICAgICBUcmFuc3BvcnRJbkRlc2NyaXB0aW9uIHRyYW5zcG9ydEluID0KLSAgICAgICAgICAgICAgICBheGlzQ29uZmlndXJhdGlvbi5nZXRUcmFuc3BvcnRJbihtc2dDb250ZXh0LmdldEluY29taW5nVHJhbnNwb3J0TmFtZSgpKTsKLSAgICAgICAgLy9zZXQgdGhlIGRlZmF1bHQgb3V0cHV0IGRlc2NyaXB0aW9uLiBUaGlzIHdpbGwgYmUgaHR0cAotCi0gICAgICAgIFRyYW5zcG9ydE91dERlc2NyaXB0aW9uIHRyYW5zcG9ydE91dCA9IGF4aXNDb25maWd1cmF0aW9uLmdldFRyYW5zcG9ydE91dCh0cnNQcmVmaXgpOwotICAgICAgICBpZiAodHJhbnNwb3J0T3V0ID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIGlmIHRoZSByZXEgY29taW5nIHZpYSBodHRwcyBidXQgd2UgZG8gbm90IGhhdmUgYSBodHRwcyBzZW5kZXIKLSAgICAgICAgICAgIHRyYW5zcG9ydE91dCA9IGF4aXNDb25maWd1cmF0aW9uLmdldFRyYW5zcG9ydE91dChDb25zdGFudHMuVFJBTlNQT1JUX0hUVFApOwotICAgICAgICB9Ci0KLQotICAgICAgICBtc2dDb250ZXh0LnNldFRyYW5zcG9ydEluKHRyYW5zcG9ydEluKTsKLSAgICAgICAgbXNnQ29udGV4dC5zZXRUcmFuc3BvcnRPdXQodHJhbnNwb3J0T3V0KTsKLSAgICAgICAgbXNnQ29udGV4dC5zZXRTZXJ2ZXJTaWRlKHRydWUpOwotCi0gICAgICAgIGlmICghaW52b2NhdGlvblR5cGUpIHsKLSAgICAgICAgICAgIFN0cmluZyBxdWVyeSA9IHJlcXVlc3QuZ2V0UXVlcnlTdHJpbmcoKTsKLSAgICAgICAgICAgIGlmIChxdWVyeSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmVxdWVzdFVSSSA9IHJlcXVlc3RVUkkgKyAiPyIgKyBxdWVyeTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIG1zZ0NvbnRleHQuc2V0VG8obmV3IEVuZHBvaW50UmVmZXJlbmNlKHJlcXVlc3RVUkkpKTsKLSAgICAgICAgbXNnQ29udGV4dC5zZXRGcm9tKG5ldyBFbmRwb2ludFJlZmVyZW5jZShyZXF1ZXN0LmdldFJlbW90ZUFkZHIoKSkpOwotICAgICAgICBtc2dDb250ZXh0LnNldFByb3BlcnR5KE1lc3NhZ2VDb250ZXh0LlJFTU9URV9BRERSLCByZXF1ZXN0LmdldFJlbW90ZUFkZHIoKSk7Ci0gICAgICAgIG1zZ0NvbnRleHQuc2V0UHJvcGVydHkoQ29uc3RhbnRzLk9VVF9UUkFOU1BPUlRfSU5GTywKLSAgICAgICAgICAgICAgICBuZXcgU2VydmxldEJhc2VkT3V0VHJhbnNwb3J0SW5mbyhyZXNwb25zZSkpOwotICAgICAgICAvLyBzZXQgdGhlIHRyYW5zcG9ydCBIZWFkZXJzCi0gICAgICAgIG1zZ0NvbnRleHQuc2V0UHJvcGVydHkoTWVzc2FnZUNvbnRleHQuVFJBTlNQT1JUX0hFQURFUlMsIGdldFRyYW5zcG9ydEhlYWRlcnMocmVxdWVzdCkpOwotICAgICAgICBtc2dDb250ZXh0LnNldFByb3BlcnR5KEhUVFBDb25zdGFudHMuTUNfSFRUUF9TRVJWTEVUUkVRVUVTVCwgcmVxdWVzdCk7Ci0gICAgICAgIG1zZ0NvbnRleHQuc2V0UHJvcGVydHkoSFRUUENvbnN0YW50cy5NQ19IVFRQX1NFUlZMRVRSRVNQT05TRSwgcmVzcG9uc2UpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgU2VydmxldENvbnRleHQgY29udGV4dCA9IGdldFNlcnZsZXRDb250ZXh0KCk7Ci0gICAgICAgICAgICBpZihjb250ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtc2dDb250ZXh0LnNldFByb3BlcnR5KEhUVFBDb25zdGFudHMuTUNfSFRUUF9TRVJWTEVUQ09OVEVYVCwgY29udGV4dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKXsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvL3NldHRpbmcgdGhlIFJlcXVlc3RSZXNwb25zZVRyYW5zcG9ydCBvYmplY3QKLSAgICAgICAgbXNnQ29udGV4dC5zZXRQcm9wZXJ0eShSZXF1ZXN0UmVzcG9uc2VUcmFuc3BvcnQuVFJBTlNQT1JUX0NPTlRST0wsCi0gICAgICAgICAgICAgICAgbmV3IFNlcnZsZXRSZXF1ZXN0UmVzcG9uc2VUcmFuc3BvcnQocmVzcG9uc2UpKTsKLQotICAgICAgICByZXR1cm4gbXNnQ29udGV4dDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCBhc3N1bWVzLCB0aGF0IHRoZSBjcmVhdGVkIE1lc3NhZ2VDb250ZXh0IHdpbGwgYmUgdXNlZCBpbiBvbmx5IFNPQVAgaW52b2NhdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSByZXEKLSAgICAgKiBAcGFyYW0gcmVzcAotICAgICAqIEByZXR1cm4gTWVzc2FnZUNvbnRleHQKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICovCi0KLSAgICBwcm90ZWN0ZWQgTWVzc2FnZUNvbnRleHQgY3JlYXRlTWVzc2FnZUNvbnRleHQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gY3JlYXRlTWVzc2FnZUNvbnRleHQocmVxLCByZXNwLCB0cnVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUcmFuc3BvcnQgc2Vzc2lvbiBtYW5hZ2VtZW50LgotICAgICAqCi0gICAgICogQHBhcmFtIG1lc3NhZ2VDb250ZXh0Ci0gICAgICogQHJldHVybiBTZXNzaW9uQ29udGV4dAotICAgICAqLwotICAgIHB1YmxpYyBTZXNzaW9uQ29udGV4dCBnZXRTZXNzaW9uQ29udGV4dChNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCkgewotICAgICAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxID0gKEh0dHBTZXJ2bGV0UmVxdWVzdCkgbWVzc2FnZUNvbnRleHQuZ2V0UHJvcGVydHkoCi0gICAgICAgICAgICAgICAgSFRUUENvbnN0YW50cy5NQ19IVFRQX1NFUlZMRVRSRVFVRVNUKTsKLSAgICAgICAgU2Vzc2lvbkNvbnRleHQgc2Vzc2lvbkNvbnRleHQgPQotICAgICAgICAgICAgICAgIChTZXNzaW9uQ29udGV4dCkgcmVxLmdldFNlc3Npb24odHJ1ZSkuZ2V0QXR0cmlidXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLlNFU1NJT05fQ09OVEVYVF9QUk9QRVJUWSk7Ci0gICAgICAgIFN0cmluZyBzZXNzaW9uSWQgPSByZXEuZ2V0U2Vzc2lvbigpLmdldElkKCk7Ci0gICAgICAgIGlmIChzZXNzaW9uQ29udGV4dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBzZXNzaW9uQ29udGV4dCA9IG5ldyBTZXNzaW9uQ29udGV4dChudWxsKTsKLSAgICAgICAgICAgIHNlc3Npb25Db250ZXh0LnNldENvb2tpZUlEKHNlc3Npb25JZCk7Ci0gICAgICAgICAgICByZXEuZ2V0U2Vzc2lvbigpLnNldEF0dHJpYnV0ZShDb25zdGFudHMuU0VTU0lPTl9DT05URVhUX1BST1BFUlRZLAotICAgICAgICAgICAgICAgICAgICBzZXNzaW9uQ29udGV4dCk7Ci0gICAgICAgIH0KLSAgICAgICAgbWVzc2FnZUNvbnRleHQuc2V0U2Vzc2lvbkNvbnRleHQoc2Vzc2lvbkNvbnRleHQpOwotICAgICAgICBtZXNzYWdlQ29udGV4dC5zZXRQcm9wZXJ0eShTRVNTSU9OX0lELCBzZXNzaW9uSWQpOwotICAgICAgICByZXR1cm4gc2Vzc2lvbkNvbnRleHQ7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGNsYXNzIFNlcnZsZXRSZXF1ZXN0UmVzcG9uc2VUcmFuc3BvcnQgaW1wbGVtZW50cyBSZXF1ZXN0UmVzcG9uc2VUcmFuc3BvcnQgewotICAgICAgICBwcml2YXRlIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2U7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiByZXNwb25zZVdyaXR0ZW4gPSBmYWxzZTsKLSAgICAgICAgcHJpdmF0ZSBDb3VudERvd25MYXRjaCByZXNwb25zZVJlYWR5U2lnbmFsID0gbmV3IENvdW50RG93bkxhdGNoKDEpOwotCQkvLyBUaGUgaW5pdGlhbCBzdGF0dXMgbXVzdCBiZSBXQUlUSU5HLCBhcyB0aGUgbWFpbiBzZXJ2bGV0IHdpbGwgZG8gc29tZSBvdGhlcgotCQkvLyB3b3JrIGFmdGVyIHNldHRpbmcgdGhpcyBSZXF1ZXN0UmVzcG9uc2VUcmFuc3BvcnQgdXAsIGFuZCB3ZSBkb24ndCB3YW50IHRvIG1pc3MKLQkJLy8gc2lnbmFscyB0aGF0IGNvbWUgaW4gYmVmb3JlIHRoaXMgdGhyZWFkIGdldHMgdG8gdGhlIGF3YWl0UmVzcG9uc2UgY2FsbC4KLSAgICAgICAgcHJpdmF0ZSBSZXF1ZXN0UmVzcG9uc2VUcmFuc3BvcnRTdGF0dXMgc3RhdHVzID0gUmVxdWVzdFJlc3BvbnNlVHJhbnNwb3J0U3RhdHVzLldBSVRJTkc7Ci0gICAgICAgIEF4aXNGYXVsdCBmYXVsdFRvQmVUaHJvd25PdXQgPSBudWxsOwotCi0gICAgICAgIFNlcnZsZXRSZXF1ZXN0UmVzcG9uc2VUcmFuc3BvcnQoSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgewotICAgICAgICAgICAgdGhpcy5yZXNwb25zZSA9IHJlc3BvbnNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgYWNrbm93bGVkZ2VNZXNzYWdlKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICAgICAgc3RhdHVzID0gUmVxdWVzdFJlc3BvbnNlVHJhbnNwb3J0U3RhdHVzLkFDS0VEOwotICAgICAgICAgICAgcmVzcG9uc2VSZWFkeVNpZ25hbC5jb3VudERvd24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGF3YWl0UmVzcG9uc2UoKQotICAgICAgICAgICAgICAgIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgQXhpc0ZhdWx0IHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiQmxvY2tpbmcgc2VydmxldCB0aHJlYWQgLS0gYXdhaXRpbmcgcmVzcG9uc2UiKTsKLSAgICAgICAgICAgIHJlc3BvbnNlUmVhZHlTaWduYWwuYXdhaXQoKTsKLQotICAgICAgICAgICAgaWYgKGZhdWx0VG9CZVRocm93bk91dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgZmF1bHRUb0JlVGhyb3duT3V0OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2lnbmFsUmVzcG9uc2VSZWFkeSgpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiU2lnbmFsbGluZyByZXNwb25zZSBhdmFpbGFibGUiKTsKLSAgICAgICAgICAgIHN0YXR1cyA9IFJlcXVlc3RSZXNwb25zZVRyYW5zcG9ydFN0YXR1cy5TSUdOQUxMRUQ7Ci0gICAgICAgICAgICByZXNwb25zZVJlYWR5U2lnbmFsLmNvdW50RG93bigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFJlcXVlc3RSZXNwb25zZVRyYW5zcG9ydFN0YXR1cyBnZXRTdGF0dXMoKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2lnbmFsRmF1bHRSZWFkeShBeGlzRmF1bHQgZmF1bHQpIHsKLSAgICAgICAgICAgIGZhdWx0VG9CZVRocm93bk91dCA9IGZhdWx0OwotICAgICAgICAgICAgc2lnbmFsUmVzcG9uc2VSZWFkeSgpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1Jlc3BvbnNlV3JpdHRlbigpIHsKLSAgICAgICAgCXJldHVybiByZXNwb25zZVdyaXR0ZW47Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFJlc3BvbnNlV3JpdHRlbihib29sZWFuIHJlc3BvbnNlV3JpdHRlbikgewotICAgICAgICAJdGhpcy5yZXNwb25zZVdyaXR0ZW4gPSByZXNwb25zZVdyaXR0ZW47Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNldFJlc3BvbnNlU3RhdGUoTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHsKLSAgICAgICAgU3RyaW5nIHN0YXRlID0gKFN0cmluZykgbWVzc2FnZUNvbnRleHQuZ2V0UHJvcGVydHkoQ29uc3RhbnRzLkhUVFBfUkVTUE9OU0VfU1RBVEUpOwotICAgICAgICBpZiAoc3RhdGUgIT0gbnVsbCkgewotICAgICAgICAgICAgaW50IHN0YXRlSW50ID0gSW50ZWdlci5wYXJzZUludChzdGF0ZSk7Ci0gICAgICAgICAgICBpZiAoc3RhdGVJbnQgPT0gSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19VTkFVVEhPUklaRUQpIHsgLy8gVW5hdXRob3JpemVkCi0gICAgICAgICAgICAgICAgU3RyaW5nIHJlYWxtID0gKFN0cmluZykgbWVzc2FnZUNvbnRleHQuZ2V0UHJvcGVydHkoQ29uc3RhbnRzLkhUVFBfQkFTSUNfQVVUSF9SRUFMTSk7Ci0gICAgICAgICAgICAgICAgcmVzcG9uc2UuYWRkSGVhZGVyKCJXV1ctQXV0aGVudGljYXRlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJiYXNpYyByZWFsbT1cIiIgKyByZWFsbSArICJcIiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVWVzIGluIHByb2Nlc3NpbmcgUkVTVCByZWxhdGVkIFJlcXVlc3RzLgotICAgICAqIFRoaXMgaXMgdGhlIGhlbHBlciBDbGFzcyB1c2UgaW4gcHJvY2Vzc2luZyBvZiBkb0dldCwgZG9QdXQgLCBkb0RlbGV0ZSBhbmQgZG9Qb3N0LgotICAgICAqLwotICAgIHByb3RlY3RlZCBjbGFzcyBSZXN0UmVxdWVzdFByb2Nlc3NvciB7Ci0gICAgICAgIHByb3RlY3RlZCBNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dDsKLSAgICAgICAgcHJpdmF0ZSBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdDsKLSAgICAgICAgcHJpdmF0ZSBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlOwotCi0gICAgICAgIHB1YmxpYyBSZXN0UmVxdWVzdFByb2Nlc3NvcihTdHJpbmcgaHR0cE1ldGhvZFN0cmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHRoaXMucmVxdWVzdCA9IHJlcXVlc3Q7Ci0gICAgICAgICAgICB0aGlzLnJlc3BvbnNlID0gcmVzcG9uc2U7Ci0gICAgICAgICAgICBtZXNzYWdlQ29udGV4dCA9IGNyZWF0ZU1lc3NhZ2VDb250ZXh0KHRoaXMucmVxdWVzdCwgdGhpcy5yZXNwb25zZSwgZmFsc2UpOwotICAgICAgICAgICAgbWVzc2FnZUNvbnRleHQuc2V0UHJvcGVydHkob3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5IVFRQQ29uc3RhbnRzLkhUVFBfTUVUSE9ELAotICAgICAgICAgICAgICAgICAgICBodHRwTWV0aG9kU3RyaW5nKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NYTUxSZXF1ZXN0KCkgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgUkVTVFV0aWwucHJvY2Vzc1hNTFJlcXVlc3QobWVzc2FnZUNvbnRleHQsIHJlcXVlc3QuZ2V0SW5wdXRTdHJlYW0oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmdldE91dHB1dFN0cmVhbSgpLCByZXF1ZXN0LmdldENvbnRlbnRUeXBlKCkpOwotICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tSZXNwb25zZVdyaXR0ZW4oKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBheGlzRmF1bHQpIHsKLSAgICAgICAgICAgICAgICBwcm9jZXNzRmF1bHQoYXhpc0ZhdWx0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNsb3NlU3RheEJ1aWxkZXIobWVzc2FnZUNvbnRleHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcHJvY2Vzc1VSTFJlcXVlc3QoKSB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24gewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBSRVNUVXRpbC5wcm9jZXNzVVJMUmVxdWVzdChtZXNzYWdlQ29udGV4dCwgcmVzcG9uc2UuZ2V0T3V0cHV0U3RyZWFtKCksCi0gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmdldENvbnRlbnRUeXBlKCkpOwotICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tSZXNwb25zZVdyaXR0ZW4oKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBlKSB7Ci0gICAgICAgICAgICAgICAgc2V0UmVzcG9uc2VTdGF0ZShtZXNzYWdlQ29udGV4dCwgcmVzcG9uc2UpOwotICAgICAgICAgICAgICAgIHByb2Nlc3NGYXVsdChlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNsb3NlU3RheEJ1aWxkZXIobWVzc2FnZUNvbnRleHQpOwotCi0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgY2hlY2tSZXNwb25zZVdyaXR0ZW4oKSB7Ci0gICAgICAgIAlpZiAoIVRyYW5zcG9ydFV0aWxzLmlzUmVzcG9uc2VXcml0dGVuKG1lc3NhZ2VDb250ZXh0KSkgewotICAgICAgICAJCXJlc3BvbnNlLnNldFN0YXR1cyhIdHRwU2VydmxldFJlc3BvbnNlLlNDX0FDQ0VQVEVEKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzRmF1bHQoQXhpc0ZhdWx0IGUpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoZSk7Ci0gICAgICAgICAgICBpZiAobWVzc2FnZUNvbnRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHByb2Nlc3NBeGlzRmF1bHQobWVzc2FnZUNvbnRleHQsIHJlc3BvbnNlLCByZXNwb25zZS5nZXRPdXRwdXRTdHJlYW0oKSwgZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3RyYW5zcG9ydC9odHRwL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL0NvbW1vbnNIVFRQVHJhbnNwb3J0U2VuZGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy90cmFuc3BvcnQvaHR0cC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9Db21tb25zSFRUUFRyYW5zcG9ydFNlbmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTg5ZGM0Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3RyYW5zcG9ydC9odHRwL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL0NvbW1vbnNIVFRQVHJhbnNwb3J0U2VuZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU91dHB1dEZvcm1hdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuT3BlcmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlRyYW5zcG9ydE91dERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uSW5PdXRBeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaGFuZGxlcnMuQWJzdHJhY3RIYW5kbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lk1lc3NhZ2VGb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuT3V0VHJhbnNwb3J0SW5mbzsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5UcmFuc3BvcnRTZW5kZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuVHJhbnNwb3J0VXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5zZXJ2ZXIuQXhpc0h0dHBSZXNwb25zZUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLkphdmFVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5IZWFkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQuSHR0cEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5IdHRwTWV0aG9kOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5GYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yOwotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuemlwLkdaSVBPdXRwdXRTdHJlYW07Ci0KLXB1YmxpYyBjbGFzcyBDb21tb25zSFRUUFRyYW5zcG9ydFNlbmRlciBleHRlbmRzIEFic3RyYWN0SGFuZGxlciBpbXBsZW1lbnRzCi0gICAgICAgIFRyYW5zcG9ydFNlbmRlciB7Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9YWV9IT1NUX05BTUUgPSAicHJveHlfaG9zdCI7Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9YWV9QT1JUID0gInByb3h5X3BvcnQiOwotCi0gICAgaW50IHNvVGltZW91dCA9IEhUVFBDb25zdGFudHMuREVGQVVMVF9TT19USU1FT1VUOwotCi0gICAgLyoqCi0gICAgICogcHJveHlkaXNjcmlwdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCBUcmFuc3BvcnRPdXREZXNjcmlwdGlvbiBwcm94eU91dFNldHRpbmcgPSBudWxsOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkKLSAgICAgICAgICAgIC5nZXRMb2coQ29tbW9uc0hUVFBUcmFuc3BvcnRTZW5kZXIuY2xhc3MpOwotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBodHRwVmVyc2lvbiA9IEhUVFBDb25zdGFudHMuSEVBREVSX1BST1RPQ09MXzExOwotCi0gICAgcHJpdmF0ZSBib29sZWFuIGNodW5rZWQgPSBmYWxzZTsKLQotICAgIGludCBjb25uZWN0aW9uVGltZW91dCA9IEhUVFBDb25zdGFudHMuREVGQVVMVF9DT05ORUNUSU9OX1RJTUVPVVQ7Ci0KLSAgICBwdWJsaWMgdm9pZCBjbGVhbnVwKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBIdHRwTWV0aG9kIGh0dHBNZXRob2QgPSAoSHR0cE1ldGhvZCkgbXNnQ29udGV4dC5nZXRQcm9wZXJ0eShIVFRQQ29uc3RhbnRzLkhUVFBfTUVUSE9EKTsKLQotICAgICAgICBpZiAoaHR0cE1ldGhvZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBUT0RPIDogRG9uJ3QgZG8gdGhpcyBpZiB3ZSdyZSBub3Qgb24gdGhlIHJpZ2h0IHRocmVhZCEgQ2FuIHdlIGNvbmZpcm0/Ci0gICAgICAgICAgICBodHRwTWV0aG9kLnJlbGVhc2VDb25uZWN0aW9uKCk7Ci0gICAgICAgICAgICBtc2dDb250ZXh0LnJlbW92ZVByb3BlcnR5KEhUVFBDb25zdGFudHMuSFRUUF9NRVRIT0QpOyAvLyBndWFyZCBhZ2FpbnN0IG11bHRpcGxlIGNhbGxzCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbml0KENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgVHJhbnNwb3J0T3V0RGVzY3JpcHRpb24gdHJhbnNwb3J0T3V0KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLQotICAgICAgICAvLyA8cGFyYW1ldGVyIG5hbWU9IlBST1RPQ09MIj5IVFRQLzEuMDwvcGFyYW1ldGVyPiBvcgotICAgICAgICAvLyA8cGFyYW1ldGVyIG5hbWU9IlBST1RPQ09MIj5IVFRQLzEuMTwvcGFyYW1ldGVyPiBpcwotICAgICAgICAvLyBjaGVja2VkCi0gICAgICAgIFBhcmFtZXRlciB2ZXJzaW9uID0gdHJhbnNwb3J0T3V0Ci0gICAgICAgICAgICAgICAgLmdldFBhcmFtZXRlcihIVFRQQ29uc3RhbnRzLlBST1RPQ09MX1ZFUlNJT04pOwotICAgICAgICBpZiAodmVyc2lvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoSFRUUENvbnN0YW50cy5IRUFERVJfUFJPVE9DT0xfMTEuZXF1YWxzKHZlcnNpb24uZ2V0VmFsdWUoKSkpIHsKLSAgICAgICAgICAgICAgICBodHRwVmVyc2lvbiA9IEhUVFBDb25zdGFudHMuSEVBREVSX1BST1RPQ09MXzExOwotCi0gICAgICAgICAgICAgICAgUGFyYW1ldGVyIHRyYW5zZmVyRW5jb2RpbmcgPSB0cmFuc3BvcnRPdXQKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRQYXJhbWV0ZXIoSFRUUENvbnN0YW50cy5IRUFERVJfVFJBTlNGRVJfRU5DT0RJTkcpOwotCi0gICAgICAgICAgICAgICAgaWYgKCh0cmFuc2ZlckVuY29kaW5nICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBIVFRQQ29uc3RhbnRzLkhFQURFUl9UUkFOU0ZFUl9FTkNPRElOR19DSFVOS0VECi0gICAgICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKHRyYW5zZmVyRW5jb2RpbmcuZ2V0VmFsdWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgY2h1bmtlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChIVFRQQ29uc3RhbnRzLkhFQURFUl9QUk9UT0NPTF8xMC5lcXVhbHModmVyc2lvbgotICAgICAgICAgICAgICAgICAgICAuZ2V0VmFsdWUoKSkpIHsKLSAgICAgICAgICAgICAgICBodHRwVmVyc2lvbiA9IEhUVFBDb25zdGFudHMuSEVBREVSX1BST1RPQ09MXzEwOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJQYXJhbWV0ZXIgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBIVFRQQ29uc3RhbnRzLlBST1RPQ09MX1ZFUlNJT04KLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiBDYW4gaGF2ZSB2YWx1ZXMgb25seSBIVFRQLzEuMCBvciBIVFRQLzEuMSIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gR2V0IHRoZSB0aW1lb3V0IHZhbHVlcyBmcm9tIHRoZSBjb25maWd1cmF0aW9uCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBQYXJhbWV0ZXIgdGVtcFNvVGltZW91dFBhcmFtID0gdHJhbnNwb3J0T3V0Ci0gICAgICAgICAgICAgICAgICAgIC5nZXRQYXJhbWV0ZXIoSFRUUENvbnN0YW50cy5TT19USU1FT1VUKTsKLSAgICAgICAgICAgIFBhcmFtZXRlciB0ZW1wQ29ublRpbWVvdXRQYXJhbSA9IHRyYW5zcG9ydE91dAotICAgICAgICAgICAgICAgICAgICAuZ2V0UGFyYW1ldGVyKEhUVFBDb25zdGFudHMuQ09OTkVDVElPTl9USU1FT1VUKTsKLQotICAgICAgICAgICAgaWYgKHRlbXBTb1RpbWVvdXRQYXJhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc29UaW1lb3V0ID0gSW50ZWdlci5wYXJzZUludCgoU3RyaW5nKSB0ZW1wU29UaW1lb3V0UGFyYW0KLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHRlbXBDb25uVGltZW91dFBhcmFtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjb25uZWN0aW9uVGltZW91dCA9IEludGVnZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIC5wYXJzZUludCgoU3RyaW5nKSB0ZW1wQ29ublRpbWVvdXRQYXJhbS5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSkgewotCi0gICAgICAgICAgICAvLyBJZiB0aGVyZSdzIGEgcHJvYmxlbSBsb2cgaXQgYW5kIHVzZSB0aGUgZGVmYXVsdCB2YWx1ZXMKLSAgICAgICAgICAgIGxvZy5lcnJvcigiSW52YWxpZCB0aW1lb3V0IHZhbHVlIGZvcm1hdDogbm90IGEgbnVtYmVyIiwgbmZlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHN0b3AoKSB7Ci0gICAgICAgIC8vIEFueSBjb2RlIHRoYXQgLCBuZWVkIHRvIGludm9rZSB3aGVuIHNlbmRlciBzdG9wCi0gICAgfQotCi0gICAgcHVibGljIEludm9jYXRpb25SZXNwb25zZSBpbnZva2UoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgT01PdXRwdXRGb3JtYXQgZm9ybWF0ID0gbmV3IE9NT3V0cHV0Rm9ybWF0KCk7Ci0gICAgICAgICAgICAvLyBpZiAoIW1zZ0NvbnRleHQuaXNEb2luZ01UT00oKSkKLSAgICAgICAgICAgIG1zZ0NvbnRleHQuc2V0RG9pbmdNVE9NKFRyYW5zcG9ydFV0aWxzLmRvV3JpdGVNVE9NKG1zZ0NvbnRleHQpKTsKLSAgICAgICAgICAgIG1zZ0NvbnRleHQuc2V0RG9pbmdTd0EoVHJhbnNwb3J0VXRpbHMuZG9Xcml0ZVN3QShtc2dDb250ZXh0KSk7Ci0gICAgICAgICAgICBtc2dDb250ZXh0LnNldERvaW5nUkVTVChUcmFuc3BvcnRVdGlscy5pc0RvaW5nUkVTVChtc2dDb250ZXh0KSk7Ci0gICAgICAgICAgICBmb3JtYXQuc2V0U09BUDExKG1zZ0NvbnRleHQuaXNTT0FQMTEoKSk7Ci0gICAgICAgICAgICBmb3JtYXQuc2V0RG9PcHRpbWl6ZShtc2dDb250ZXh0LmlzRG9pbmdNVE9NKCkpOwotICAgICAgICAgICAgZm9ybWF0LnNldERvaW5nU1dBKG1zZ0NvbnRleHQuaXNEb2luZ1N3QSgpKTsKLSAgICAgICAgICAgIGZvcm1hdC5zZXRDaGFyU2V0RW5jb2RpbmcoVHJhbnNwb3J0VXRpbHMuZ2V0Q2hhclNldEVuY29kaW5nKG1zZ0NvbnRleHQpKTsKLQotICAgICAgICAgICAgT2JqZWN0IG1pbWVCb3VuZGFyeVByb3BlcnR5ID0gbXNnQ29udGV4dAotICAgICAgICAgICAgICAgICAgICAuZ2V0UHJvcGVydHkoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uTUlNRV9CT1VOREFSWSk7Ci0gICAgICAgICAgICBpZiAobWltZUJvdW5kYXJ5UHJvcGVydHkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZvcm1hdC5zZXRNaW1lQm91bmRhcnkoKFN0cmluZykgbWltZUJvdW5kYXJ5UHJvcGVydHkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBUcmFuc3BvcnRPdXREZXNjcmlwdGlvbiB0cmFuc3BvcnRPdXQgPSBtc2dDb250ZXh0LmdldENvbmZpZ3VyYXRpb25Db250ZXh0KCkuCi0gICAgICAgICAgICAgICAgICAgIGdldEF4aXNDb25maWd1cmF0aW9uKCkuZ2V0VHJhbnNwb3J0T3V0KENvbnN0YW50cy5UUkFOU1BPUlRfSFRUUCk7Ci0KLSAgICAgICAgICAgICAvLyBzZXQgdGhlIHRpbWVvdXQgcHJvcGVydGVpZXMKLQotICAgICAgICAgICAgUGFyYW1ldGVyIHNvVGltZW91dFBhcmFtID0gdHJhbnNwb3J0T3V0LmdldFBhcmFtZXRlcihIVFRQQ29uc3RhbnRzLlNPX1RJTUVPVVQpOwotICAgICAgICAgICAgUGFyYW1ldGVyIGNvbm5UaW1lb3V0UGFyYW0gPSB0cmFuc3BvcnRPdXQuZ2V0UGFyYW1ldGVyKEhUVFBDb25zdGFudHMuQ09OTkVDVElPTl9USU1FT1VUKTsKLQotICAgICAgICAgICAgLy8gc2V0IHRoZSBwcm9wZXJ0eSB2YWx1c2Ugb25seSBpZiB0aGV5IGFyZSBub3Qgc2V0IGJ5IHRoZSB1c2VyIGV4cGxpY2l0bHkKLSAgICAgICAgICAgIGlmICgoc29UaW1lb3V0UGFyYW0gIT0gbnVsbCkgJiYgKG1zZ0NvbnRleHQuZ2V0UHJvcGVydHkoSFRUUENvbnN0YW50cy5TT19USU1FT1VUKSA9PSBudWxsKSkgewotICAgICAgICAgICAgICAgIG1zZ0NvbnRleHQuc2V0UHJvcGVydHkoSFRUUENvbnN0YW50cy5TT19USU1FT1VULCBuZXcgSW50ZWdlcigoU3RyaW5nKXNvVGltZW91dFBhcmFtLmdldFZhbHVlKCkpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKChjb25uVGltZW91dFBhcmFtICE9IG51bGwpICYmIChtc2dDb250ZXh0LmdldFByb3BlcnR5KEhUVFBDb25zdGFudHMuQ09OTkVDVElPTl9USU1FT1VUKSA9PSBudWxsKSkgewotICAgICAgICAgICAgICAgIG1zZ0NvbnRleHQuc2V0UHJvcGVydHkoSFRUUENvbnN0YW50cy5DT05ORUNUSU9OX1RJTUVPVVQsIG5ldyBJbnRlZ2VyKChTdHJpbmcpY29ublRpbWVvdXRQYXJhbS5nZXRWYWx1ZSgpKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vaWYgYSBwYXJhbWV0ZXIgaGFzIHNldCBiZWVuIHNldCwgd2Ugd2lsbCBvbWl0IHRoZSBTT0FQIGFjdGlvbiBmb3IgU09BUCAxLjIKLSAgICAgICAgICAgIGlmICh0cmFuc3BvcnRPdXQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmICghbXNnQ29udGV4dC5pc1NPQVAxMSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFBhcmFtZXRlciBwYXJhbSA9IHRyYW5zcG9ydE91dC5nZXRQYXJhbWV0ZXIoSFRUUENvbnN0YW50cy5PTUlUX1NPQVBfMTJfQUNUSU9OKTsKLSAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHBhcmFtZXRlclZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlclZhbHVlID0gcGFyYW0uZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbWV0ZXJWYWx1ZSAhPSBudWxsICYmIEphdmFVdGlscy5pc1RydWVFeHBsaWNpdGx5KHBhcmFtZXRlclZhbHVlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy9DaGVjayB3aGV0aGVyIHVzZXIgaGFzIGFscmVhZHkgb3ZlcnJpZGRlbiB0aGlzLgotICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHByb3BlcnR5VmFsdWUgPSBtc2dDb250ZXh0LmdldFByb3BlcnR5KENvbnN0YW50cy5Db25maWd1cmF0aW9uLkRJU0FCTEVfU09BUF9BQ1RJT04pOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5VmFsdWUgPT0gbnVsbCB8fCAhSmF2YVV0aWxzLmlzRmFsc2VFeHBsaWNpdGx5KHByb3BlcnR5VmFsdWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnQ29udGV4dC5zZXRQcm9wZXJ0eShDb25zdGFudHMuQ29uZmlndXJhdGlvbi5ESVNBQkxFX1NPQVBfQUNUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gVHJhbnNwb3J0IFVSTCBjYW4gYmUgZGlmZmVyZW50IGZyb20gdGhlIFdTQS1Uby4gU28gcHJvY2Vzc2luZwotICAgICAgICAgICAgLy8gdGhhdCBub3cuCi0gICAgICAgICAgICBFbmRwb2ludFJlZmVyZW5jZSBlcHIgPSBudWxsOwotICAgICAgICAgICAgU3RyaW5nIHRyYW5zcG9ydFVSTCA9IChTdHJpbmcpIG1zZ0NvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KENvbnN0YW50cy5Db25maWd1cmF0aW9uLlRSQU5TUE9SVF9VUkwpOwotCi0gICAgICAgICAgICBpZiAodHJhbnNwb3J0VVJMICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBlcHIgPSBuZXcgRW5kcG9pbnRSZWZlcmVuY2UodHJhbnNwb3J0VVJMKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobXNnQ29udGV4dC5nZXRUbygpICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgJiYgIW1zZ0NvbnRleHQuZ2V0VG8oKS5oYXNBbm9ueW1vdXNBZGRyZXNzKCkpIHsKLSAgICAgICAgICAgICAgICBlcHIgPSBtc2dDb250ZXh0LmdldFRvKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIENoZWNrIGZvciB0aGUgUkVTVCBiZWhhdmlvciwgaWYgeW91IGRlc2lyZSByZXN0IGJlaGF2aW9yCi0gICAgICAgICAgICAvLyBwdXQgYSA8cGFyYW1ldGVyIG5hbWU9ImRvUkVTVCIgdmFsdWU9InRydWUiLz4gYXQgdGhlCi0gICAgICAgICAgICAvLyBzZXJ2ZXIueG1sL2NsaWVudC54bWwgZmlsZQotICAgICAgICAgICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0gICAgICAgICAgICAvLyBDaGFuZ2UgdGhpcyBwbGFjZSB0byBjaGFuZ2UgdGhlIHdzYTp0b2VwcgotICAgICAgICAgICAgLy8gZXByID0gc29tZXRoaW5nCi0gICAgICAgICAgICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotICAgICAgICAgICAgaWYgKGVwciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFlcHIuaGFzTm9uZUFkZHJlc3MoKSkgewotICAgICAgICAgICAgICAgICAgICB3cml0ZU1lc3NhZ2VXaXRoQ29tbW9ucyhtc2dDb250ZXh0LCBlcHIsIGZvcm1hdCk7Ci0gICAgICAgICAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICAgICAgCWlmKG1zZ0NvbnRleHQuaXNGYXVsdCgpKXsKLSAgICAgICAgICAgICAgICAJCWlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKXsKLSAgICAgICAgICAgICAgICAJCQlsb2cuZGVidWcoIkZhdWx0IHNlbnQgdG8gV1MtQSBOb25lIFVSSTogIittc2dDb250ZXh0LmdldEVudmVsb3BlKCkuZ2V0Qm9keSgpLmdldEZhdWx0KCkpOwotICAgICAgICAgICAgICAgIAkJfQotICAgICAgICAgICAgICAgIAl9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAobXNnQ29udGV4dC5nZXRQcm9wZXJ0eShNZXNzYWdlQ29udGV4dC5UUkFOU1BPUlRfT1VUKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNlbmRVc2luZ091dHB1dFN0cmVhbShtc2dDb250ZXh0LCBmb3JtYXQpOwotICAgICAgICAgICAgICAgICAgICBUcmFuc3BvcnRVdGlscy5zZXRSZXNwb25zZVdyaXR0ZW4obXNnQ29udGV4dCwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiQm90aCB0aGUgVE8gYW5kIE1lc3NhZ2VDb250ZXh0LlRSQU5TUE9SVF9PVVQgcHJvcGVydHkgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgImFyZSBudWxsLCBzbyBub3doZXJlIHRvIHNlbmQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3IgZSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKGUpOwotICAgICAgICAgICAgdGhyb3cgQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKGUpOwotICAgICAgICAgICAgdGhyb3cgQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gSW52b2NhdGlvblJlc3BvbnNlLkNPTlRJTlVFOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlbmQgYSBtZXNzYWdlICh3aGljaCBtdXN0IGJlIGEgcmVzcG9uc2UpIHZpYSB0aGUgT3V0cHV0U3RyZWFtIHNpdHRpbmcgaW4gdGhlCi0gICAgICogTWVzc2FnZUNvbnRleHQgVFJBTlNQT1JUX09VVCBwcm9wZXJ0eS4gIFNpbmNlIHRoaXMgY2xhc3MgaXMgdXNlZCBmb3IgYm90aCByZXF1ZXN0cyBhbmQKLSAgICAgKiByZXNwb25zZXMsIHdlIHNwbGl0IHRoZSBsb2dpYyAtIHRoaXMgbWV0aG9kIGFsd2F5cyBnZXRzIGNhbGxlZCB3aGVuIHdlJ3JlCi0gICAgICogd3JpdGluZyB0byB0aGUgSFRUUCByZXNwb25zZSBzdHJlYW0sIGFuZCBzZW5kVXNpbmdDb21tb25zKCkgaXMgdXNlZCBmb3IgcmVxdWVzdHMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbXNnQ29udGV4dCB0aGUgYWN0aXZlIE1lc3NhZ2VDb250ZXh0Ci0gICAgICogQHBhcmFtIGZvcm1hdCBvdXRwdXQgZm9ybWF0dGVyIGZvciBvdXIgbWVzc2FnZQotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0IGlmIGEgZ2VuZXJhbCBwcm9ibGVtIGFyaXNlcwotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzZW5kVXNpbmdPdXRwdXRTdHJlYW0oTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NT3V0cHV0Rm9ybWF0IGZvcm1hdCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIE91dHB1dFN0cmVhbSBvdXQgPSAoT3V0cHV0U3RyZWFtKSBtc2dDb250ZXh0LmdldFByb3BlcnR5KE1lc3NhZ2VDb250ZXh0LlRSQU5TUE9SVF9PVVQpOwotCi0gICAgICAgIC8vIEkgRG9uJ3QgdGhpbmsgd2UgbmVlZCB0aGlzIGNoZWNrLi4gQ29udGVudCB0eXBlIG5lZWRzIHRvIGJlIHNldCBpbgotICAgICAgICAvLyBhbnkgY2FzZS4gKHRoaWxpbmEpCi0gICAgICAgIC8vIGlmIChtc2dDb250ZXh0LmlzU2VydmVyU2lkZSgpKSB7Ci0gICAgICAgIE91dFRyYW5zcG9ydEluZm8gdHJhbnNwb3J0SW5mbyA9IChPdXRUcmFuc3BvcnRJbmZvKSBtc2dDb250ZXh0Ci0gICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KENvbnN0YW50cy5PVVRfVFJBTlNQT1JUX0lORk8pOwotCi0gICAgICAgIGlmICh0cmFuc3BvcnRJbmZvID09IG51bGwpIHRocm93IG5ldyBBeGlzRmF1bHQoIk5vIHRyYW5zcG9ydCBpbmZvIGluIE1lc3NhZ2VDb250ZXh0Iik7Ci0KLSAgICAgICAgU2VydmxldEJhc2VkT3V0VHJhbnNwb3J0SW5mbyBzZXJ2bGV0QmFzZWRPdXRUcmFuc3BvcnRJbmZvID0gbnVsbDsKLSAgICAgICAgaWYgKHRyYW5zcG9ydEluZm8gaW5zdGFuY2VvZiBTZXJ2bGV0QmFzZWRPdXRUcmFuc3BvcnRJbmZvKSB7Ci0gICAgICAgICAgICBzZXJ2bGV0QmFzZWRPdXRUcmFuc3BvcnRJbmZvID0KLSAgICAgICAgICAgICAgICAgICAgKFNlcnZsZXRCYXNlZE91dFRyYW5zcG9ydEluZm8pIHRyYW5zcG9ydEluZm87Ci0KLSAgICAgICAgICAgIC8vIGlmIHNlbmRpbmcgYSBmYXVsdCwgc2V0IEhUVFAgc3RhdHVzIGNvZGUgdG8gNTAwCi0gICAgICAgICAgICBpZiAobXNnQ29udGV4dC5pc0ZhdWx0KCkpIHsKLSAgICAgICAgICAgICAgICBzZXJ2bGV0QmFzZWRPdXRUcmFuc3BvcnRJbmZvLnNldFN0YXR1cyhIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIE9iamVjdCBjdXN0b21IZWFkZXJzID0gbXNnQ29udGV4dC5nZXRQcm9wZXJ0eShIVFRQQ29uc3RhbnRzLkhUVFBfSEVBREVSUyk7Ci0gICAgICAgICAgICBpZiAoY3VzdG9tSGVhZGVycyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGN1c3RvbUhlYWRlcnMgaW5zdGFuY2VvZiBMaXN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSAoKExpc3QpIGN1c3RvbUhlYWRlcnMpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgSGVhZGVyIGhlYWRlciA9IChIZWFkZXIpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhlYWRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmxldEJhc2VkT3V0VHJhbnNwb3J0SW5mbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZEhlYWRlcihoZWFkZXIuZ2V0TmFtZSgpLCBoZWFkZXIuZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGN1c3RvbUhlYWRlcnMgaW5zdGFuY2VvZiBNYXApIHsKLSAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3IgaXRlciA9ICgoTWFwKSBjdXN0b21IZWFkZXJzKS5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTWFwLkVudHJ5IGhlYWRlciA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhlYWRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmxldEJhc2VkT3V0VHJhbnNwb3J0SW5mbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZEhlYWRlcigoU3RyaW5nKSBoZWFkZXIuZ2V0S2V5KCksIChTdHJpbmcpIGhlYWRlci5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmICh0cmFuc3BvcnRJbmZvIGluc3RhbmNlb2YgQXhpc0h0dHBSZXNwb25zZUltcGwpIHsKLSAgICAgICAgICAgIE9iamVjdCBjdXN0b21IZWFkZXJzID0gbXNnQ29udGV4dC5nZXRQcm9wZXJ0eShIVFRQQ29uc3RhbnRzLkhUVFBfSEVBREVSUyk7Ci0gICAgICAgICAgICBpZiAoY3VzdG9tSGVhZGVycyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGN1c3RvbUhlYWRlcnMgaW5zdGFuY2VvZiBMaXN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSAoKExpc3QpIGN1c3RvbUhlYWRlcnMpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgSGVhZGVyIGhlYWRlciA9IChIZWFkZXIpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhlYWRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKChBeGlzSHR0cFJlc3BvbnNlSW1wbCkgdHJhbnNwb3J0SW5mbykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRIZWFkZXIoaGVhZGVyLmdldE5hbWUoKSwgaGVhZGVyLmdldFZhbHVlKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjdXN0b21IZWFkZXJzIGluc3RhbmNlb2YgTWFwKSB7Ci0gICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSAoKE1hcCkgY3VzdG9tSGVhZGVycykuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE1hcC5FbnRyeSBoZWFkZXIgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoZWFkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQXhpc0h0dHBSZXNwb25zZUltcGwpIHRyYW5zcG9ydEluZm8pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkSGVhZGVyKChTdHJpbmcpIGhlYWRlci5nZXRLZXkoKSwgKFN0cmluZykgaGVhZGVyLmdldFZhbHVlKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZm9ybWF0LnNldEF1dG9DbG9zZVdyaXRlcih0cnVlKTsKLQotICAgICAgICBNZXNzYWdlRm9ybWF0dGVyIG1lc3NhZ2VGb3JtYXR0ZXIgPSBUcmFuc3BvcnRVdGlscy5nZXRNZXNzYWdlRm9ybWF0dGVyKG1zZ0NvbnRleHQpOwotICAgICAgICBpZiAobWVzc2FnZUZvcm1hdHRlciA9PSBudWxsKSB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJObyBNZXNzYWdlRm9ybWF0dGVyIGluIE1lc3NhZ2VDb250ZXh0Iik7Ci0KLSAgICAgICAgLy8gT25jZSB3ZSBnZXQgdG8gdGhpcyBwb2ludCwgZXhjZXB0aW9ucyBzaG91bGQgTk9UIGJlIHR1cm5lZCBpbnRvIGZhdWx0cyBhbmQgc2VudCwKLSAgICAgICAgLy8gYmVjYXVzZSB3ZSdyZSBhbHJlYWR5IHNlbmRpbmchICBTbyBjYXRjaCBldmVyeXRoaW5nIGFuZCBsb2cgaXQsIGJ1dCBkb24ndCBwYXNzCi0gICAgICAgIC8vIHVwd2FyZHMuCi0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHRyYW5zcG9ydEluZm8uc2V0Q29udGVudFR5cGUoCi0gICAgICAgICAgICAgICAgbWVzc2FnZUZvcm1hdHRlci5nZXRDb250ZW50VHlwZShtc2dDb250ZXh0LCBmb3JtYXQsIGZpbmRTT0FQQWN0aW9uKG1zZ0NvbnRleHQpKSk7Ci0KLSAgICAgICAgICAgIE9iamVjdCBnemlwID0gbXNnQ29udGV4dC5nZXRPcHRpb25zKCkuZ2V0UHJvcGVydHkoSFRUUENvbnN0YW50cy5NQ19HWklQX1JFU1BPTlNFKTsKLSAgICAgICAgICAgIGlmIChnemlwICE9IG51bGwgJiYgSmF2YVV0aWxzLmlzVHJ1ZUV4cGxpY2l0bHkoZ3ppcCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoc2VydmxldEJhc2VkT3V0VHJhbnNwb3J0SW5mbyAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICBzZXJ2bGV0QmFzZWRPdXRUcmFuc3BvcnRJbmZvLmFkZEhlYWRlcihIVFRQQ29uc3RhbnRzLkhFQURFUl9DT05URU5UX0VOQ09ESU5HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIVFRQQ29uc3RhbnRzLkNPTVBSRVNTSU9OX0daSVApOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIG91dCA9IG5ldyBHWklQT3V0cHV0U3RyZWFtKG91dCk7Ci0gICAgICAgICAgICAgICAgICAgIG91dC53cml0ZShtZXNzYWdlRm9ybWF0dGVyLmdldEJ5dGVzKG1zZ0NvbnRleHQsIGZvcm1hdCkpOwotICAgICAgICAgICAgICAgICAgICAoKEdaSVBPdXRwdXRTdHJlYW0pIG91dCkuZmluaXNoKCk7Ci0gICAgICAgICAgICAgICAgICAgIG91dC5mbHVzaCgpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiQ291bGQgbm90IGNvbXByZXNzIHJlc3BvbnNlIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtZXNzYWdlRm9ybWF0dGVyLndyaXRlVG8obXNnQ29udGV4dCwgZm9ybWF0LCBvdXQsIGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGF4aXNGYXVsdCkgewotICAgICAgICAgICAgbG9nLmVycm9yKGF4aXNGYXVsdC5nZXRNZXNzYWdlKCksIGF4aXNGYXVsdCk7Ci0gICAgICAgICAgICB0aHJvdyBheGlzRmF1bHQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgd3JpdGVNZXNzYWdlV2l0aENvbW1vbnMoTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuZHBvaW50UmVmZXJlbmNlIHRvRVBSLCBPTU91dHB1dEZvcm1hdCBmb3JtYXQpCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFVSTCB1cmwgPSBuZXcgVVJMKHRvRVBSLmdldEFkZHJlc3MoKSk7Ci0KLSAgICAgICAgICAgIC8vIHNlbGVjdCB0aGUgTWVzc2FnZSBTZW5kZXIgZGVwZW5kaW5nIG9uIHRoZSBSRVNUIHN0YXR1cwotICAgICAgICAgICAgQWJzdHJhY3RIVFRQU2VuZGVyIHNlbmRlcjsKLQotICAgICAgICAgICAgc2VuZGVyID0gbmV3IEhUVFBTZW5kZXIoKTsKLQotICAgICAgICAgICAgaWYgKG1lc3NhZ2VDb250ZXh0LmdldFByb3BlcnR5KEhUVFBDb25zdGFudHMuQ0hVTktFRCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNodW5rZWQgPSBKYXZhVXRpbHMuaXNUcnVlRXhwbGljaXRseShtZXNzYWdlQ29udGV4dAotICAgICAgICAgICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KEhUVFBDb25zdGFudHMuQ0hVTktFRCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobWVzc2FnZUNvbnRleHQuZ2V0UHJvcGVydHkoSFRUUENvbnN0YW50cy5IVFRQX1BST1RPQ09MX1ZFUlNJT04pICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBodHRwVmVyc2lvbiA9IChTdHJpbmcpIG1lc3NhZ2VDb250ZXh0Ci0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UHJvcGVydHkoSFRUUENvbnN0YW50cy5IVFRQX1BST1RPQ09MX1ZFUlNJT04pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gRm9sbG93aW5nIG9yZGVyIG5lZWRlZCB0byBiZSBwcmVzZXJ2ZWQgYmVjYXVzZSwKLSAgICAgICAgICAgIC8vIEhUVFAvMS4wIGRvZXMgbm90IHN1cHBvcnQgY2h1bmsgZW5jb2RpbmcKLSAgICAgICAgICAgIHNlbmRlci5zZXRDaHVua2VkKGNodW5rZWQpOwotICAgICAgICAgICAgc2VuZGVyLnNldEh0dHBWZXJzaW9uKGh0dHBWZXJzaW9uKTsKLSAgICAgICAgICAgIHNlbmRlci5zZXRGb3JtYXQoZm9ybWF0KTsKLQotICAgICAgICAgICAgZmluYWwgT3BlcmF0aW9uQ29udGV4dCBvcENvbnRleHQgPSBtZXNzYWdlQ29udGV4dC5nZXRPcGVyYXRpb25Db250ZXh0KCk7Ci0gICAgICAgICAgICBpZiAob3BDb250ZXh0LmdldEF4aXNPcGVyYXRpb24oKSBpbnN0YW5jZW9mIEluT3V0QXhpc09wZXJhdGlvbikgewotICAgICAgICAgICAgICAgIC8vIFRPRE86IEtsdWRnZSB0byBtYWtlIHN1cmUgYXN5bmMgcmVwbHkgY29ubmVjdGlvbnMgZ2V0IGNsZWFuZWQgdXAuIEZpeCBmb3IgcmVhbD8KLQotICAgICAgICAgICAgICAgIC8vIElmIHdlJ3JlIHVzaW5nIHRoaXMgc2VuZGVyIHRvIHNlbmQgYSBkdWFsLWNoYW5uZWwgcmVwbHksIHdlIGRvbid0IGNhcmUgYWJvdXQKLSAgICAgICAgICAgICAgICAvLyByZWFkaW5nIHRoZSByZXNwb25zZSBmb3Igbm93LCBzbyBtYWtlIHN1cmUgd2UgY2xlYW4gdXAgdGhlIEhUVFBNZXRob2QuCi0gICAgICAgICAgICAgICAgbWVzc2FnZUNvbnRleHQuc2V0UHJvcGVydHkoSFRUUENvbnN0YW50cy5BVVRPX1JFTEVBU0VfQ09OTkVDVElPTiwgdHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZW5kZXIuc2VuZChtZXNzYWdlQ29udGV4dCwgdXJsLCBmaW5kU09BUEFjdGlvbihtZXNzYWdlQ29udGV4dCkpOwotICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKGUpOwotICAgICAgICAgICAgdGhyb3cgQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKTsKLSAgICAgICAgfSBjYXRjaCAoSHR0cEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoZSk7Ci0gICAgICAgICAgICB0aHJvdyBBeGlzRmF1bHQubWFrZUZhdWx0KGUpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoZSk7Ci0gICAgICAgICAgICB0aHJvdyBBeGlzRmF1bHQubWFrZUZhdWx0KGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZpbmRTT0FQQWN0aW9uKE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0KSB7Ci0gICAgICAgIFN0cmluZyBzb2FwQWN0aW9uU3RyaW5nID0gbnVsbDsKLQotICAgICAgICBQYXJhbWV0ZXIgcGFyYW1ldGVyID0KLSAgICAgICAgICAgICAgICBtZXNzYWdlQ29udGV4dC5nZXRUcmFuc3BvcnRPdXQoKS5nZXRQYXJhbWV0ZXIoSFRUUENvbnN0YW50cy5PTUlUX1NPQVBfMTJfQUNUSU9OKTsKLSAgICAgICAgaWYgKHBhcmFtZXRlciAhPSBudWxsICYmIEphdmFVdGlscy5pc1RydWVFeHBsaWNpdGx5KHBhcmFtZXRlci5nZXRWYWx1ZSgpKSAmJgotICAgICAgICAgICAgIW1lc3NhZ2VDb250ZXh0LmlzU09BUDExKCkpIHsKLSAgICAgICAgICAgIHJldHVybiAiXCJcIiI7Ci0gICAgICAgIH0KLQotICAgICAgICBPYmplY3QgZGlzYWJsZVNvYXBBY3Rpb24gPSBtZXNzYWdlQ29udGV4dC5nZXRPcHRpb25zKCkuZ2V0UHJvcGVydHkoCi0gICAgICAgICAgICAgICAgQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uRElTQUJMRV9TT0FQX0FDVElPTik7Ci0KLSAgICAgICAgaWYgKCFKYXZhVXRpbHMuaXNUcnVlRXhwbGljaXRseShkaXNhYmxlU29hcEFjdGlvbikpIHsKLSAgICAgICAgICAgIC8vIGZpcnN0IHRyeSB0byBnZXQgdGhlIFNPQVAgYWN0aW9uIGZyb20gbWVzc2FnZSBjb250ZXh0Ci0gICAgICAgICAgICBzb2FwQWN0aW9uU3RyaW5nID0gbWVzc2FnZUNvbnRleHQuZ2V0U29hcEFjdGlvbigpOwotICAgICAgICAgICAgaWYgKChzb2FwQWN0aW9uU3RyaW5nID09IG51bGwpIHx8IChzb2FwQWN0aW9uU3RyaW5nLmxlbmd0aCgpID09IDApKSB7Ci0gICAgICAgICAgICAgICAgLy8gbm93IGxldCdzIHRyeSB0byBnZXQgV1NBIGFjdGlvbgotICAgICAgICAgICAgICAgIHNvYXBBY3Rpb25TdHJpbmcgPSBtZXNzYWdlQ29udGV4dC5nZXRXU0FBY3Rpb24oKTsKLSAgICAgICAgICAgICAgICBpZiAobWVzc2FnZUNvbnRleHQuZ2V0QXhpc09wZXJhdGlvbigpICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgICAgICYmICgoc29hcEFjdGlvblN0cmluZyA9PSBudWxsKSB8fCAoc29hcEFjdGlvblN0cmluZwotICAgICAgICAgICAgICAgICAgICAgICAgLmxlbmd0aCgpID09IDApKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBsYXN0IG9wdGlvbiBpcyB0byBnZXQgaXQgZnJvbSB0aGUgYXhpcyBvcGVyYXRpb24KLSAgICAgICAgICAgICAgICAgICAgc29hcEFjdGlvblN0cmluZyA9IG1lc3NhZ2VDb250ZXh0LmdldEF4aXNPcGVyYXRpb24oKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRTb2FwQWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy9TaW5jZSBhY3Rpb24gaXMgb3B0aW9uYWwgZm9yIFNPQVAgMS4yIHdlIGNhbiByZXR1cm4gbnVsbCBoZXJlLgotICAgICAgICBpZiAoc29hcEFjdGlvblN0cmluZyA9PSBudWxsICYmIG1lc3NhZ2VDb250ZXh0LmlzU09BUDExKCkpIHsKLSAgICAgICAgICAgIHNvYXBBY3Rpb25TdHJpbmcgPSAiXCJcIiI7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc29hcEFjdGlvblN0cmluZzsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy90cmFuc3BvcnQvaHR0cC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9Db21tb25zVHJhbnNwb3J0SGVhZGVycy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvdHJhbnNwb3J0L2h0dHAvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvQ29tbW9uc1RyYW5zcG9ydEhlYWRlcnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA5ZWJhZC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy90cmFuc3BvcnQvaHR0cC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9Db21tb25zVHJhbnNwb3J0SGVhZGVycy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50LkhlYWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotcHVibGljIGNsYXNzIENvbW1vbnNUcmFuc3BvcnRIZWFkZXJzIGltcGxlbWVudHMgTWFwIHsKLSAgICBwcml2YXRlIEhlYWRlcltdIGhlYWRlcnM7Ci0KLSAgICBIYXNoTWFwIGhlYWRlck1hcCA9IG51bGw7Ci0KLSAgICBwdWJsaWMgQ29tbW9uc1RyYW5zcG9ydEhlYWRlcnMoSGVhZGVyW10gaGVhZGVycykgewotICAgICAgICB0aGlzLmhlYWRlcnMgPSBoZWFkZXJzOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbml0KCkgewotICAgICAgICBoZWFkZXJNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaGVhZGVycy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaGVhZGVyTWFwLnB1dChoZWFkZXJzW2ldLmdldE5hbWUoKSwgaGVhZGVyc1tpXS5nZXRWYWx1ZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKLSAgICAgICAgaWYgKGhlYWRlck1hcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpbml0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGhlYWRlck1hcC5zaXplKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0gICAgICAgIGlmIChoZWFkZXJNYXAgIT0gbnVsbCkgewotICAgICAgICAgICAgaGVhZGVyTWFwLmNsZWFyKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotICAgICAgICBpZiAoaGVhZGVyTWFwID09IG51bGwpIHsKLSAgICAgICAgICAgIGluaXQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaGVhZGVyTWFwLmlzRW1wdHkoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0tleShPYmplY3Qga2V5KSB7Ci0gICAgICAgIGlmIChoZWFkZXJNYXAgPT0gbnVsbCkgewotICAgICAgICAgICAgaW5pdCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBoZWFkZXJNYXAuY29udGFpbnNLZXkoa2V5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc1ZhbHVlKE9iamVjdCB2YWx1ZSkgewotICAgICAgICBpZiAoaGVhZGVyTWFwID09IG51bGwpIHsKLSAgICAgICAgICAgIGluaXQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaGVhZGVyTWFwLmNvbnRhaW5zVmFsdWUodmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBDb2xsZWN0aW9uIHZhbHVlcygpIHsKLSAgICAgICAgaWYgKGhlYWRlck1hcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpbml0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGhlYWRlck1hcC52YWx1ZXMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwdXRBbGwoTWFwIHQpIHsKLSAgICAgICAgaWYgKGhlYWRlck1hcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpbml0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgaGVhZGVyTWFwLnB1dEFsbCh0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2V0IGVudHJ5U2V0KCkgewotICAgICAgICBpZiAoaGVhZGVyTWFwID09IG51bGwpIHsKLSAgICAgICAgICAgIGluaXQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaGVhZGVyTWFwLmVudHJ5U2V0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIFNldCBrZXlTZXQoKSB7Ci0gICAgICAgIGlmIChoZWFkZXJNYXAgPT0gbnVsbCkgewotICAgICAgICAgICAgaW5pdCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBoZWFkZXJNYXAua2V5U2V0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXQoT2JqZWN0IGtleSkgewotICAgICAgICBpZiAoaGVhZGVyTWFwID09IG51bGwpIHsKLSAgICAgICAgICAgIGluaXQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaGVhZGVyTWFwLmdldChrZXkpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgcmVtb3ZlKE9iamVjdCBrZXkpIHsKLSAgICAgICAgaWYgKGhlYWRlck1hcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpbml0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGhlYWRlck1hcC5yZW1vdmUoa2V5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IHB1dChPYmplY3Qga2V5LCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgaWYgKGhlYWRlck1hcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpbml0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGhlYWRlck1hcC5wdXQoa2V5LCB2YWx1ZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvdHJhbnNwb3J0L2h0dHAvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvQ3VzdG9tTGlzdGVuZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3RyYW5zcG9ydC9odHRwL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL0N1c3RvbUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiMzYzM2UuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvdHJhbnNwb3J0L2h0dHAvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvQ3VzdG9tTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuU2Vzc2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5QYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5UcmFuc3BvcnRJbkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0LlRyYW5zcG9ydExpc3RlbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIHVzZWQganVzdCB0byBhZGQgYWRkaXRpb25hbCB0cmFuc3BvcnRzIGF0IHJ1bnRpbWUgaWYgdXNlciBzZW5kcyBhIHJlcXVlc3QgdXNpbmcKLSAqIGFsdGVybmF0ZSBzY2hlbWVzLCBleGFtcGxlIHRvIGhhbmRsZSBodHRwL2h0dHBzIHNlcGFyYXRlbHkKLSAqLwotcHVibGljIGNsYXNzIEN1c3RvbUxpc3RlbmVyIGltcGxlbWVudHMgVHJhbnNwb3J0TGlzdGVuZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEN1c3RvbUxpc3RlbmVyLmNsYXNzKTsKLSAgICAKLSAgICBwcml2YXRlIGludCBwb3J0OwotICAgIHByaXZhdGUgU3RyaW5nIHNjaGVtYTsKLSAgICBwcml2YXRlIENvbmZpZ3VyYXRpb25Db250ZXh0IGF4aXNDb25mOwotCi0gICAgcHVibGljIEN1c3RvbUxpc3RlbmVyKGludCBwb3J0LCBTdHJpbmcgc2NoZW1hKSB7Ci0gICAgICAgIHRoaXMucG9ydCA9IHBvcnQ7Ci0gICAgICAgIHRoaXMuc2NoZW1hID0gc2NoZW1hOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGluaXQoQ29uZmlndXJhdGlvbkNvbnRleHQgYXhpc0NvbmYsCi0gICAgICAgICAgICAgICAgICAgICBUcmFuc3BvcnRJbkRlc2NyaXB0aW9uIHRyYW5zcHJ0SW4pIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICB0aGlzLmF4aXNDb25mID0gYXhpc0NvbmY7Ci0gICAgICAgIFBhcmFtZXRlciBwYXJhbSA9IHRyYW5zcHJ0SW4uZ2V0UGFyYW1ldGVyKFBBUkFNX1BPUlQpOwotICAgICAgICBpZiAocGFyYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgdGhpcy5wb3J0ID0gSW50ZWdlci5wYXJzZUludCgoU3RyaW5nKSBwYXJhbS5nZXRWYWx1ZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RvcCgpIHRocm93cyBBeGlzRmF1bHQgewotICAgIH0KLQotICAgIHB1YmxpYyBFbmRwb2ludFJlZmVyZW5jZVtdIGdldEVQUnNGb3JTZXJ2aWNlKFN0cmluZyBzZXJ2aWNlTmFtZSwgU3RyaW5nIGlwKQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIFN0cmluZyBwYXRoID0gYXhpc0NvbmYuZ2V0U2VydmljZUNvbnRleHRQYXRoKCkgKyAiLyIgKyBzZXJ2aWNlTmFtZTsKLSAgICAgICAgaWYocGF0aC5jaGFyQXQoMCkhPScvJyl7Ci0gICAgICAgICAgICBwYXRoID0gJy8nICsgcGF0aDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IEVuZHBvaW50UmVmZXJlbmNlW117bmV3IEVuZHBvaW50UmVmZXJlbmNlKHNjaGVtYSArICI6Ly8iICsgaXAgKyAiOiIgKyBwb3J0ICsgcGF0aCArICIvIiApfTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRW5kcG9pbnRSZWZlcmVuY2UgZ2V0RVBSRm9yU2VydmljZShTdHJpbmcgc2VydmljZU5hbWUsIFN0cmluZyBpcCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIHJldHVybiBnZXRFUFJzRm9yU2VydmljZShzZXJ2aWNlTmFtZSwgaXApWzBdOwotICAgIH0KLQotICAgIHB1YmxpYyBTZXNzaW9uQ29udGV4dCBnZXRTZXNzaW9uQ29udGV4dChNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCkgewotICAgICAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxID0gKEh0dHBTZXJ2bGV0UmVxdWVzdCkgbWVzc2FnZUNvbnRleHQuZ2V0UHJvcGVydHkoCi0gICAgICAgICAgICAgICAgSFRUUENvbnN0YW50cy5NQ19IVFRQX1NFUlZMRVRSRVFVRVNUKTsKLSAgICAgICAgU2Vzc2lvbkNvbnRleHQgc2Vzc2lvbkNvbnRleHQgPQotICAgICAgICAgICAgICAgIChTZXNzaW9uQ29udGV4dCkgcmVxLmdldFNlc3Npb24odHJ1ZSkuZ2V0QXR0cmlidXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLlNFU1NJT05fQ09OVEVYVF9QUk9QRVJUWSk7Ci0gICAgICAgIFN0cmluZyBzZXNzaW9uSWQgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgc2Vzc2lvbklkID0gcmVxLmdldFNlc3Npb24oKS5nZXRJZCgpOwotICAgICAgICAgICAgaWYgKHNlc3Npb25Db250ZXh0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHNlc3Npb25Db250ZXh0ID0gbmV3IFNlc3Npb25Db250ZXh0KG51bGwpOwotICAgICAgICAgICAgc2Vzc2lvbkNvbnRleHQuc2V0Q29va2llSUQoc2Vzc2lvbklkKTsKLSAgICAgICAgICAgIHJlcS5nZXRTZXNzaW9uKCkuc2V0QXR0cmlidXRlKENvbnN0YW50cy5TRVNTSU9OX0NPTlRFWFRfUFJPUEVSVFksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uQ29udGV4dCk7Ci0gICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpewotICAgICAgICAgICAgbG9nLmluZm8oIk9sZCBTZXJ2bGV0IEFQSSA6IiArIHQpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgbWVzc2FnZUNvbnRleHQuc2V0U2Vzc2lvbkNvbnRleHQoc2Vzc2lvbkNvbnRleHQpOwotICAgICAgICBtZXNzYWdlQ29udGV4dC5zZXRQcm9wZXJ0eShBeGlzU2VydmxldC5TRVNTSU9OX0lELCBzZXNzaW9uSWQpOwotICAgICAgICByZXR1cm4gc2Vzc2lvbkNvbnRleHQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGVzdHJveSgpIHsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3RyYW5zcG9ydC9odHRwL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL0hUVFBTZW5kZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3RyYW5zcG9ydC9odHRwL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL0hUVFBTZW5kZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzRlZTc0NS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy90cmFuc3BvcnQvaHR0cC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9IVFRQU2VuZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwOwotCi0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLk91dEluQXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk9wZXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pMThuLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lk1lc3NhZ2VGb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQuSGVhZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50Lkh0dHBDbGllbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQuSHR0cE1ldGhvZDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5IdHRwTWV0aG9kQmFzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5IdHRwU3RhdHVzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50Lm1ldGhvZHMuRGVsZXRlTWV0aG9kOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50Lm1ldGhvZHMuR2V0TWV0aG9kOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50Lm1ldGhvZHMuUG9zdE1ldGhvZDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5tZXRob2RzLlB1dE1ldGhvZDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1wdWJsaWMgY2xhc3MgSFRUUFNlbmRlciBleHRlbmRzIEFic3RyYWN0SFRUUFNlbmRlciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coSFRUUFNlbmRlci5jbGFzcyk7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZW5kKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQsIFVSTCB1cmwsIFN0cmluZyBzb2FwQWN0aW9uU3RyaW5nKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQotICAgICAgICAvLyBleGVjdXRlIHRoZSBIdHR0cE1ldGhvZEJhc2UgLSBhIGNvbm5lY3Rpb24gbWFuYWdlciBjYW4gYmUgZ2l2ZW4gZm9yCi0gICAgICAgIC8vIGhhbmRsZSBtdWx0aXBsZQotCi0gICAgICAgIFN0cmluZyBodHRwTWV0aG9kID0KLSAgICAgICAgICAgICAgICAoU3RyaW5nKSBtc2dDb250ZXh0LmdldFByb3BlcnR5KENvbnN0YW50cy5Db25maWd1cmF0aW9uLkhUVFBfTUVUSE9EKTsKLQotICAgICAgICBpZiAoKGh0dHBNZXRob2QgIT0gbnVsbCkpIHsKLQotICAgICAgICAgICAgaWYgKENvbnN0YW50cy5Db25maWd1cmF0aW9uLkhUVFBfTUVUSE9EX0dFVC5lcXVhbHNJZ25vcmVDYXNlKGh0dHBNZXRob2QpKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5zZW5kVmlhR2V0KG1zZ0NvbnRleHQsIHVybCwgc29hcEFjdGlvblN0cmluZyk7Ci0KLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKENvbnN0YW50cy5Db25maWd1cmF0aW9uLkhUVFBfTUVUSE9EX0RFTEVURS5lcXVhbHNJZ25vcmVDYXNlKGh0dHBNZXRob2QpKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5zZW5kVmlhRGVsZXRlKG1zZ0NvbnRleHQsIHVybCwgc29hcEFjdGlvblN0cmluZyk7Ci0KLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKENvbnN0YW50cy5Db25maWd1cmF0aW9uLkhUVFBfTUVUSE9EX1BVVC5lcXVhbHNJZ25vcmVDYXNlKGh0dHBNZXRob2QpKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5zZW5kVmlhUHV0KG1zZ0NvbnRleHQsIHVybCwgc29hcEFjdGlvblN0cmluZyk7Ci0KLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB0aGlzLnNlbmRWaWFQb3N0KG1zZ0NvbnRleHQsIHVybCwgc29hcEFjdGlvblN0cmluZyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXNlZCB0byBzZW5kIGEgcmVxdWVzdCB2aWEgSFRUUCBHZXQgbWV0aG9kCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbXNnQ29udGV4dCAgICAgICAgLSBUaGUgTWVzc2FnZUNvbnRleHQgb2YgdGhlIG1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gdXJsICAgICAgICAgICAgICAgLSBUaGUgdGFyZ2V0IFVSTAotICAgICAqIEBwYXJhbSBzb2FwQWN0aWlvblN0cmluZyAtIFRoZSBzb2FwQWN0aW9uIHN0cmluZyBvZiB0aGUgcmVxdWVzdAotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0IC0gVGhyb3duIGluIGNhc2UgYW4gZXhjZXB0aW9uIG9jY3VycwotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzZW5kVmlhR2V0KE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQsIFVSTCB1cmwsIFN0cmluZyBzb2FwQWN0aWlvblN0cmluZykKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotCi0gICAgICAgIEdldE1ldGhvZCBnZXRNZXRob2QgPSBuZXcgR2V0TWV0aG9kKCk7Ci0gICAgICAgIEh0dHBDbGllbnQgaHR0cENsaWVudCA9IGdldEh0dHBDbGllbnQobXNnQ29udGV4dCk7Ci0gICAgICAgIE1lc3NhZ2VGb3JtYXR0ZXIgbWVzc2FnZUZvcm1hdHRlciA9Ci0gICAgICAgICAgICAgICAgcG9wdWxhdGVDb21tb25Qcm9wZXJ0aWVzKG1zZ0NvbnRleHQsIHVybCwgZ2V0TWV0aG9kLCBodHRwQ2xpZW50LCBzb2FwQWN0aWlvblN0cmluZyk7Ci0KLSAgICAgICAgLy8gTmVlZCB0byBoYXZlIHRoaXMgaGVyZSBiZWNhdXNlIHdlIGNhbiBoYXZlIHNvYXAgYWN0aW9uIHdoZW4gdXNpbmcgdGhlIHNvYXAgcmVzcG9uc2UgTUVQCi0gICAgICAgIFN0cmluZyBzb2FwQWN0aW9uID0KLSAgICAgICAgICAgICAgICBtZXNzYWdlRm9ybWF0dGVyLmZvcm1hdFNPQVBBY3Rpb24obXNnQ29udGV4dCwgZm9ybWF0LCBzb2FwQWN0aWlvblN0cmluZyk7Ci0KLSAgICAgICAgaWYgKHNvYXBBY3Rpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgZ2V0TWV0aG9kLnNldFJlcXVlc3RIZWFkZXIoSFRUUENvbnN0YW50cy5IRUFERVJfU09BUF9BQ1RJT04sIHNvYXBBY3Rpb24pOwotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBleGVjdXRlTWV0aG9kKGh0dHBDbGllbnQsIG1zZ0NvbnRleHQsIHVybCwgZ2V0TWV0aG9kKTsKLSAgICAgICAgICAgIGhhbmRsZVJlc3BvbnNlKG1zZ0NvbnRleHQsIGdldE1ldGhvZCk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGxvZy5pbmZvKCJVbmFibGUgdG8gc2VuZFZpYUdldCB0byB1cmxbIiArIHVybCArICJdIiwgZSk7Ci0gICAgICAgICAgICB0aHJvdyBBeGlzRmF1bHQubWFrZUZhdWx0KGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgY2xlYW51cChtc2dDb250ZXh0LCBnZXRNZXRob2QpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNsZWFudXAoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCwgSHR0cE1ldGhvZCBtZXRob2QpIHsKLSAgICAgICAgaWYgKG1zZ0NvbnRleHQuaXNQcm9wZXJ0eVRydWUoSFRUUENvbnN0YW50cy5BVVRPX1JFTEVBU0VfQ09OTkVDVElPTikpIHsKLSAgICAgICAgICAgIC8vIFByb3RlY3QgYWdhaW5zdCBzeW5jaHJvbm91c2x5IHdhaXRpbmcgZm9yIGEgcmVzcG9uc2UsIGluIHdoaWNoIGNhc2UKLSAgICAgICAgICAgIC8vIHRoaXMgd291bGQgcmVzdWx0IGluIHRyeWluZyB0byByZWFkIGEgY2xvc2VkIHN0cmVhbS4uLiEKLSAgICAgICAgICAgIGlmICghKG1zZ0NvbnRleHQuZ2V0QXhpc09wZXJhdGlvbigpIGluc3RhbmNlb2YgT3V0SW5BeGlzT3BlcmF0aW9uKSB8fAotICAgICAgICAgICAgICAgIG1zZ0NvbnRleHQuZ2V0T3B0aW9ucygpLmlzVXNlU2VwYXJhdGVMaXN0ZW5lcigpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLnRyYWNlKCJBdXRvUmVsZWFzaW5nICIgKyBtZXRob2QpOwotICAgICAgICAgICAgICAgIG1ldGhvZC5yZWxlYXNlQ29ubmVjdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXNlZCB0byBzZW5kIGEgcmVxdWVzdCB2aWEgSFRUUCBEZWxldGUgTWV0aG9kCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbXNnQ29udGV4dCAgICAgICAgLSBUaGUgTWVzc2FnZUNvbnRleHQgb2YgdGhlIG1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gdXJsICAgICAgICAgICAgICAgLSBUaGUgdGFyZ2V0IFVSTAotICAgICAqIEBwYXJhbSBzb2FwQWN0aWlvblN0cmluZyAtIFRoZSBzb2FwQWN0aW9uIHN0cmluZyBvZiB0aGUgcmVxdWVzdAotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0IC0gVGhyb3duIGluIGNhc2UgYW4gZXhjZXB0aW9uIG9jY3VycwotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzZW5kVmlhRGVsZXRlKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQsIFVSTCB1cmwsIFN0cmluZyBzb2FwQWN0aWlvblN0cmluZykKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotCi0gICAgICAgIERlbGV0ZU1ldGhvZCBkZWxldGVNZXRob2QgPSBuZXcgRGVsZXRlTWV0aG9kKCk7Ci0gICAgICAgIEh0dHBDbGllbnQgaHR0cENsaWVudCA9IGdldEh0dHBDbGllbnQobXNnQ29udGV4dCk7Ci0gICAgICAgIHBvcHVsYXRlQ29tbW9uUHJvcGVydGllcyhtc2dDb250ZXh0LCB1cmwsIGRlbGV0ZU1ldGhvZCwgaHR0cENsaWVudCwgc29hcEFjdGlpb25TdHJpbmcpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBleGVjdXRlTWV0aG9kKGh0dHBDbGllbnQsIG1zZ0NvbnRleHQsIHVybCwgZGVsZXRlTWV0aG9kKTsKLSAgICAgICAgICAgIGhhbmRsZVJlc3BvbnNlKG1zZ0NvbnRleHQsIGRlbGV0ZU1ldGhvZCk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGxvZy5pbmZvKCJVbmFibGUgdG8gc2VuZFZpYURlbGV0ZSB0byB1cmxbIiArIHVybCArICJdIiwgZSk7Ci0gICAgICAgICAgICB0aHJvdyBBeGlzRmF1bHQubWFrZUZhdWx0KGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgY2xlYW51cChtc2dDb250ZXh0LCBkZWxldGVNZXRob2QpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXNlZCB0byBzZW5kIGEgcmVxdWVzdCB2aWEgSFRUUCBQb3N0IE1ldGhvZAotICAgICAqCi0gICAgICogQHBhcmFtIG1zZ0NvbnRleHQgICAgICAgLSBUaGUgTWVzc2FnZUNvbnRleHQgb2YgdGhlIG1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gdXJsICAgICAgICAgICAgICAtIFRoZSB0YXJnZXQgVVJMCi0gICAgICogQHBhcmFtIHNvYXBBY3Rpb25TdHJpbmcgLSBUaGUgc29hcEFjdGlvbiBzdHJpbmcgb2YgdGhlIHJlcXVlc3QKLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdCAtIFRocm93biBpbiBjYXNlIGFuIGV4Y2VwdGlvbiBvY2N1cnMKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2VuZFZpYVBvc3QoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCwgVVJMIHVybCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNvYXBBY3Rpb25TdHJpbmcpIHRocm93cyBBeGlzRmF1bHQgewotCi0KLSAgICAgICAgSHR0cENsaWVudCBodHRwQ2xpZW50ID0gZ2V0SHR0cENsaWVudChtc2dDb250ZXh0KTsKLQotLyogIFdoYXQncyB1cCB3aXRoIHRoaXMsIGl0IG5ldmVyIGdldHMgdXNlZCBhbnl3aGVyZT8/IC0tR2xlbgotICAgICAgICBTdHJpbmcgY2hhckVuY29kaW5nID0KLSAgICAgICAgICAgICAgICAoU3RyaW5nKSBtc2dDb250ZXh0LmdldFByb3BlcnR5KENvbnN0YW50cy5Db25maWd1cmF0aW9uLkNIQVJBQ1RFUl9TRVRfRU5DT0RJTkcpOwotCi0gICAgICAgIGlmIChjaGFyRW5jb2RpbmcgPT0gbnVsbCkgewotICAgICAgICAgICAgY2hhckVuY29kaW5nID0gTWVzc2FnZUNvbnRleHQuREVGQVVMVF9DSEFSX1NFVF9FTkNPRElORzsKLSAgICAgICAgfQotKi8KLQotICAgICAgICBQb3N0TWV0aG9kIHBvc3RNZXRob2QgPSBuZXcgUG9zdE1ldGhvZCgpOwotICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy50cmFjZShUaHJlYWQuY3VycmVudFRocmVhZCgpICsgIiBQb3N0TWV0aG9kICIgKyBwb3N0TWV0aG9kICsgIiAvICIgKyBodHRwQ2xpZW50KTsKLSAgICAgICAgfQotICAgICAgICBNZXNzYWdlRm9ybWF0dGVyIG1lc3NhZ2VGb3JtYXR0ZXIgPQotICAgICAgICAgICAgICAgIHBvcHVsYXRlQ29tbW9uUHJvcGVydGllcyhtc2dDb250ZXh0LCB1cmwsIHBvc3RNZXRob2QsIGh0dHBDbGllbnQsIHNvYXBBY3Rpb25TdHJpbmcpOwotCi0gICAgICAgIHBvc3RNZXRob2Quc2V0UmVxdWVzdEVudGl0eShuZXcgQXhpc1JlcXVlc3RFbnRpdHkobWVzc2FnZUZvcm1hdHRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2dDb250ZXh0LCBmb3JtYXQsIHNvYXBBY3Rpb25TdHJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2h1bmtlZCwgaXNBbGxvd2VkUmV0cnkpKTsKLQotICAgICAgICBpZiAoIWh0dHBWZXJzaW9uLmVxdWFscyhIVFRQQ29uc3RhbnRzLkhFQURFUl9QUk9UT0NPTF8xMCkgJiYgY2h1bmtlZCkgewotICAgICAgICAgICAgcG9zdE1ldGhvZC5zZXRDb250ZW50Q2h1bmtlZCh0cnVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBzb2FwQWN0aW9uID0gbWVzc2FnZUZvcm1hdHRlci5mb3JtYXRTT0FQQWN0aW9uKG1zZ0NvbnRleHQsIGZvcm1hdCwgc29hcEFjdGlvblN0cmluZyk7Ci0KLSAgICAgICAgaWYgKHNvYXBBY3Rpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgcG9zdE1ldGhvZC5zZXRSZXF1ZXN0SGVhZGVyKEhUVFBDb25zdGFudHMuSEVBREVSX1NPQVBfQUNUSU9OLCBzb2FwQWN0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqICAgbWFpbiBleGNlY3V0aW9uIHRha2VzIHBsYWNlLi4KLSAgICAgICAgICovCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBleGVjdXRlTWV0aG9kKGh0dHBDbGllbnQsIG1zZ0NvbnRleHQsIHVybCwgcG9zdE1ldGhvZCk7Ci0gICAgICAgICAgICBoYW5kbGVSZXNwb25zZShtc2dDb250ZXh0LCBwb3N0TWV0aG9kKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbG9nLmluZm8oIlVuYWJsZSB0byBzZW5kVmlhUG9zdCB0byB1cmxbIiArIHVybCArICJdIiwgZSk7Ci0gICAgICAgICAgICB0aHJvdyBBeGlzRmF1bHQubWFrZUZhdWx0KGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgLy8gSWYgd2UncmUgYSBkdWFsLWNoYW5uZWwgcmVxdWVzdCwganVzdCBhdXRvLXJlbGVhc2UgdGhlIGNvbm5lY3Rpb24gc28gaXQgZ2V0cwotICAgICAgICAgICAgLy8gY2xlYW5lZCB1cCBhbmQgYXZvaWRzIHN0YXJ2YXRpb24gcHJvYmxlbXMuCi0gICAgICAgICAgICAvLyBUT0RPOiBDb25maXJtIHRoaXMgaXMgT0sgd2l0aCBXUy1STSwgZml4IGlmIG5vdCEKLSAgICAgICAgICAgIGlmIChtc2dDb250ZXh0LmdldE9wdGlvbnMoKS5pc1VzZVNlcGFyYXRlTGlzdGVuZXIoKSkKLSAgICAgICAgICAgICAgICBtc2dDb250ZXh0LnNldFByb3BlcnR5KEhUVFBDb25zdGFudHMuQVVUT19SRUxFQVNFX0NPTk5FQ1RJT04sIHRydWUpOwotICAgICAgICAgICAgY2xlYW51cChtc2dDb250ZXh0LCBwb3N0TWV0aG9kKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVzZWQgdG8gc2VuZCBhIHJlcXVlc3QgdmlhIEhUVFAgUHV0IE1ldGhvZAotICAgICAqCi0gICAgICogQHBhcmFtIG1zZ0NvbnRleHQgICAgICAgLSBUaGUgTWVzc2FnZUNvbnRleHQgb2YgdGhlIG1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gdXJsICAgICAgICAgICAgICAtIFRoZSB0YXJnZXQgVVJMCi0gICAgICogQHBhcmFtIHNvYXBBY3Rpb25TdHJpbmcgLSBUaGUgc29hcEFjdGlvbiBzdHJpbmcgb2YgdGhlIHJlcXVlc3QKLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdCAtIFRocm93biBpbiBjYXNlIGFuIGV4Y2VwdGlvbiBvY2N1cnMKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2VuZFZpYVB1dChNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0LCBVUkwgdXJsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzb2FwQWN0aW9uU3RyaW5nKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLQotCi0gICAgICAgIEh0dHBDbGllbnQgaHR0cENsaWVudCA9IGdldEh0dHBDbGllbnQobXNnQ29udGV4dCk7Ci0KLS8qICBTYW1lIGRlYWwgLSB0aGlzIHZhbHVlIG5ldmVyIGdldHMgdXNlZCwgd2h5IGlzIGl0IGhlcmU/IC0tR2xlbgotICAgICAgICBTdHJpbmcgY2hhckVuY29kaW5nID0KLSAgICAgICAgICAgICAgICAoU3RyaW5nKSBtc2dDb250ZXh0LmdldFByb3BlcnR5KENvbnN0YW50cy5Db25maWd1cmF0aW9uLkNIQVJBQ1RFUl9TRVRfRU5DT0RJTkcpOwotCi0gICAgICAgIGlmIChjaGFyRW5jb2RpbmcgPT0gbnVsbCkgewotICAgICAgICAgICAgY2hhckVuY29kaW5nID0gTWVzc2FnZUNvbnRleHQuREVGQVVMVF9DSEFSX1NFVF9FTkNPRElORzsKLSAgICAgICAgfQotKi8KLQotICAgICAgICBQdXRNZXRob2QgcHV0TWV0aG9kID0gbmV3IFB1dE1ldGhvZCgpOwotICAgICAgICBNZXNzYWdlRm9ybWF0dGVyIG1lc3NhZ2VGb3JtYXR0ZXIgPQotICAgICAgICAgICAgICAgIHBvcHVsYXRlQ29tbW9uUHJvcGVydGllcyhtc2dDb250ZXh0LCB1cmwsIHB1dE1ldGhvZCwgaHR0cENsaWVudCwgc29hcEFjdGlvblN0cmluZyk7Ci0KLSAgICAgICAgcHV0TWV0aG9kLnNldFJlcXVlc3RFbnRpdHkobmV3IEF4aXNSZXF1ZXN0RW50aXR5KG1lc3NhZ2VGb3JtYXR0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2dDb250ZXh0LCBmb3JtYXQsIHNvYXBBY3Rpb25TdHJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaHVua2VkLCBpc0FsbG93ZWRSZXRyeSkpOwotCi0gICAgICAgIGlmICghaHR0cFZlcnNpb24uZXF1YWxzKEhUVFBDb25zdGFudHMuSEVBREVSX1BST1RPQ09MXzEwKSAmJiBjaHVua2VkKSB7Ci0gICAgICAgICAgICBwdXRNZXRob2Quc2V0Q29udGVudENodW5rZWQodHJ1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgc29hcEFjdGlvbiA9IG1lc3NhZ2VGb3JtYXR0ZXIuZm9ybWF0U09BUEFjdGlvbihtc2dDb250ZXh0LCBmb3JtYXQsIHNvYXBBY3Rpb25TdHJpbmcpOwotICAgICAgICBpZiAoc29hcEFjdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwdXRNZXRob2Quc2V0UmVxdWVzdEhlYWRlcihIVFRQQ29uc3RhbnRzLkhFQURFUl9TT0FQX0FDVElPTiwgc29hcEFjdGlvbik7Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiAgIG1haW4gZXhjZWN1dGlvbiB0YWtlcyBwbGFjZS4uCi0gICAgICAgICAqLwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZXhlY3V0ZU1ldGhvZChodHRwQ2xpZW50LCBtc2dDb250ZXh0LCB1cmwsIHB1dE1ldGhvZCk7Ci0gICAgICAgICAgICBoYW5kbGVSZXNwb25zZShtc2dDb250ZXh0LCBwdXRNZXRob2QpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBsb2cuaW5mbygiVW5hYmxlIHRvIHNlbmRWaWFQdXQgdG8gdXJsWyIgKyB1cmwgKyAiXSIsIGUpOwotICAgICAgICAgICAgdGhyb3cgQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGNsZWFudXAobXNnQ29udGV4dCwgcHV0TWV0aG9kKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVzZWQgdG8gaGFuZGxlIHRoZSBIVFRQIFJlc3BvbnNlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbXNnQ29udGV4dCAtIFRoZSBNZXNzYWdlQ29udGV4dCBvZiB0aGUgbWVzc2FnZQotICAgICAqIEBwYXJhbSBtZXRob2QgICAgIC0gVGhlIEhUVFAgbWV0aG9kIHVzZWQKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIC0gVGhyb3duIGluIGNhc2UgYW4gZXhjZXB0aW9uIG9jY3VycwotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBoYW5kbGVSZXNwb25zZShNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwTWV0aG9kQmFzZSBtZXRob2QpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGludCBzdGF0dXNDb2RlID0gbWV0aG9kLmdldFN0YXR1c0NvZGUoKTsKLSAgICAgICAgbG9nLnRyYWNlKCJIYW5kbGluZyByZXNwb25zZSAtICIgKyBzdGF0dXNDb2RlKTsKLSAgICAgICAgaWYgKHN0YXR1c0NvZGUgPT0gSHR0cFN0YXR1cy5TQ19PSykgewotICAgICAgICAgICAgcHJvY2Vzc1Jlc3BvbnNlKG1ldGhvZCwgbXNnQ29udGV4dCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzQ29kZSA9PSBIdHRwU3RhdHVzLlNDX0FDQ0VQVEVEKSB7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzQ29kZSA9PSBIdHRwU3RhdHVzLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiB8fAotICAgICAgICAgICAgICAgIHN0YXR1c0NvZGUgPT0gSHR0cFN0YXR1cy5TQ19CQURfUkVRVUVTVCkgewotICAgICAgICAgICAgSGVhZGVyIGNvbnRlbnR0eXBlSGVhZGVyID0KLSAgICAgICAgICAgICAgICAgICAgbWV0aG9kLmdldFJlc3BvbnNlSGVhZGVyKEhUVFBDb25zdGFudHMuSEVBREVSX0NPTlRFTlRfVFlQRSk7Ci0gICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBudWxsOwotICAgICAgICAgICAgaWYgKGNvbnRlbnR0eXBlSGVhZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IGNvbnRlbnR0eXBlSGVhZGVyLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAgT3BlcmF0aW9uQ29udGV4dCBvcENvbnRleHQgPSBtc2dDb250ZXh0LmdldE9wZXJhdGlvbkNvbnRleHQoKTsKLSAgICAgICAgICAgIGlmKG9wQ29udGV4dCE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgTWVzc2FnZUNvbnRleHQgaW5NZXNzYWdlQ29udGV4dCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcENvbnRleHQuZ2V0TWVzc2FnZUNvbnRleHQoV1NETENvbnN0YW50cy5NRVNTQUdFX0xBQkVMX0lOX1ZBTFVFKTsKLSAgICAgICAgICAgICAgICBpZihpbk1lc3NhZ2VDb250ZXh0IT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgaW5NZXNzYWdlQ29udGV4dC5zZXRQcm9jZXNzaW5nRmF1bHQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKLQotICAgICAgICAgICAgICAgIHByb2Nlc3NSZXNwb25zZShtZXRob2QsIG1zZ0NvbnRleHQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgT2JqZWN0IGlzVHJhbnNwb3J0Tm9uQmxvY2tpbmcgPSBtc2dDb250ZXh0LmdldFByb3BlcnR5KAotICAgICAgICAgICAgICAgICAgICBNZXNzYWdlQ29udGV4dC5UUkFOU1BPUlRfTk9OX0JMT0NLSU5HKTsKLSAgICAgICAgICAgIGlmIChpc1RyYW5zcG9ydE5vbkJsb2NraW5nICE9IG51bGwgJiYgKEJvb2xlYW4paXNUcmFuc3BvcnROb25CbG9ja2luZykgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoTWVzc2FnZXMuZ2V0TWVzc2FnZSgidHJhbnNwb3J0RXJyb3IiLAotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nLnZhbHVlT2Yoc3RhdHVzQ29kZSksCi0gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QuZ2V0U3RhdHVzVGV4dCgpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KE1lc3NhZ2VzLmdldE1lc3NhZ2UoInRyYW5zcG9ydEVycm9yIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcudmFsdWVPZihzdGF0dXNDb2RlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QuZ2V0U3RhdHVzVGV4dCgpKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy90cmFuc3BvcnQvaHR0cC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9IVFRQVHJhbnNwb3J0UmVjZWl2ZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3RyYW5zcG9ydC9odHRwL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL0hUVFBUcmFuc3BvcnRSZWNlaXZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGE3OGEwLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3RyYW5zcG9ydC9odHRwL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL0hUVFBUcmFuc3BvcnRSZWNlaXZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQ2xhc3MgSFRUUFRyYW5zcG9ydFJlY2VpdmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBIVFRQVHJhbnNwb3J0UmVjZWl2ZXIgewotICAgIHB1YmxpYyBzdGF0aWMgTWFwIGdldEdldFJlcXVlc3RQYXJhbWV0ZXJzKFN0cmluZyByZXF1ZXN0VVJJKSB7Ci0KLSAgICAgICAgTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIGlmIChyZXF1ZXN0VVJJID09IG51bGwgfHwgIiIuZXF1YWxzKHJlcXVlc3RVUkkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbWFwOwotICAgICAgICB9Ci0gICAgICAgIGNoYXJbXSAgICAgICBjaGFycyA9IHJlcXVlc3RVUkkudG9DaGFyQXJyYXkoKTsKLSAgICAgICAgZmluYWwgaW50IE5PVF9CRUdVTiA9IDE1MDA7Ci0gICAgICAgIGZpbmFsIGludCBJTlNJREVfTkFNRSA9IDE1MDE7Ci0gICAgICAgIGZpbmFsIGludCBJTlNJREVfVkFMVUUgPSAxNTAyOwotICAgICAgICBpbnQgc3RhdGUgPSBOT1RfQkVHVU47Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBuYW1lID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBTdHJpbmdCdWZmZXIgdmFsdWUgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IGNoYXJzLmxlbmd0aDsgaW5kZXgrKykgewotICAgICAgICAgICAgaWYgKHN0YXRlID09IE5PVF9CRUdVTikgewotICAgICAgICAgICAgICAgIGlmIChjaGFyc1tpbmRleF0gPT0gJz8nKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXRlID0gSU5TSURFX05BTUU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PSBJTlNJREVfTkFNRSkgewotICAgICAgICAgICAgICAgIGlmIChjaGFyc1tpbmRleF0gPT0gJz0nKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXRlID0gSU5TSURFX1ZBTFVFOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWUuYXBwZW5kKGNoYXJzW2luZGV4XSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PSBJTlNJREVfVkFMVUUpIHsKLSAgICAgICAgICAgICAgICBpZiAoY2hhcnNbaW5kZXhdID09ICcsJykgewotICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IElOU0lERV9OQU1FOwotICAgICAgICAgICAgICAgICAgICBtYXAucHV0KG5hbWUudG9TdHJpbmcoKSwgdmFsdWUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWUuZGVsZXRlKDAsIG5hbWUubGVuZ3RoKCkpOwotICAgICAgICAgICAgICAgICAgICB2YWx1ZS5kZWxldGUoMCwgdmFsdWUubGVuZ3RoKCkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlLmFwcGVuZChjaGFyc1tpbmRleF0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChuYW1lLmxlbmd0aCgpICsgdmFsdWUubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICBtYXAucHV0KG5hbWUudG9TdHJpbmcoKSwgdmFsdWUudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbWFwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIEhUTUwgdGV4dCBmb3IgdGhlIGxpc3Qgb2Ygc2VydmljZXMgZGVwbG95ZWQuCi0gICAgICogVGhpcyBjYW4gYmUgZGVsZWdhdGVkIHRvIGFub3RoZXIgQ2xhc3MgYXMgd2VsbAotICAgICAqIHdoZXJlIGl0IHdpbGwgaGFuZGxlIG1vcmUgb3B0aW9ucyBvZiBHRVQgbWVzc2FnZXMuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgU3RyaW5nLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFNlcnZpY2VzSFRNTChDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWd1cmF0aW9uQ29udGV4dCkgewotICAgICAgICBTdHJpbmcgdGVtcCA9ICIiOwotICAgICAgICBNYXAgc2VydmljZXMgPSBjb25maWd1cmF0aW9uQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpLmdldFNlcnZpY2VzKCk7Ci0gICAgICAgIEhhc2h0YWJsZSBlcnJvbmVvdXNTZXJ2aWNlcyA9Ci0gICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbkNvbnRleHQuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5nZXRGYXVsdHlTZXJ2aWNlcygpOwotICAgICAgICBib29sZWFuIHN0YXR1cyA9IGZhbHNlOwotCi0gICAgICAgIGlmICgoc2VydmljZXMgIT0gbnVsbCkgJiYgIXNlcnZpY2VzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgc3RhdHVzID0gdHJ1ZTsKLQotICAgICAgICAgICAgQ29sbGVjdGlvbiBzZXJ2aWNlQ29sbGVjdGlvbiA9IHNlcnZpY2VzLnZhbHVlcygpOwotCi0gICAgICAgICAgICB0ZW1wICs9ICI8aDI+IiArICJEZXBsb3llZCBzZXJ2aWNlcyIgKyAiPC9oMj4iOwotCi0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gc2VydmljZUNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCi0gICAgICAgICAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UgPSAoQXhpc1NlcnZpY2UpIGl0Lm5leHQoKTsKLQotICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gYXhpc1NlcnZpY2UuZ2V0T3BlcmF0aW9ucygpOwotCi0gICAgICAgICAgICAgICAgdGVtcCArPSAiPGgzPjxhIGhyZWY9XCIiICsgYXhpc1NlcnZpY2UuZ2V0TmFtZSgpICsgIj93c2RsXCI+IiArCi0gICAgICAgICAgICAgICAgICAgICAgICBheGlzU2VydmljZS5nZXROYW1lKCkgKyAiPC9hPjwvaDM+IjsKLQotICAgICAgICAgICAgICAgIGlmIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgdGVtcCArPSAiQXZhaWxhYmxlIG9wZXJhdGlvbnMgPHVsPiI7Ci0KLSAgICAgICAgICAgICAgICAgICAgZm9yICg7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEF4aXNPcGVyYXRpb24gYXhpc09wZXJhdGlvbiA9IChBeGlzT3BlcmF0aW9uKSBpdGVyYXRvci5uZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAgKz0gIjxsaT4iICsgYXhpc09wZXJhdGlvbi5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCkgKyAiPC9saT4iOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgdGVtcCArPSAiPC91bD4iOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHRlbXAgKz0gIk5vIG9wZXJhdGlvbnMgc3BlY2lmaWVkIGZvciB0aGlzIHNlcnZpY2UiOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICgoZXJyb25lb3VzU2VydmljZXMgIT0gbnVsbCkgJiYgIWVycm9uZW91c1NlcnZpY2VzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgdGVtcCArPSAiPGhyPjxoMj48Zm9udCBjb2xvcj1cImJsdWVcIj5GYXVsdHkgU2VydmljZXM8L2ZvbnQ+PC9oMj4iOwotICAgICAgICAgICAgc3RhdHVzID0gdHJ1ZTsKLQotICAgICAgICAgICAgRW51bWVyYXRpb24gZmF1bHR5c2VydmljZXMgPSBlcnJvbmVvdXNTZXJ2aWNlcy5rZXlzKCk7Ci0KLSAgICAgICAgICAgIHdoaWxlIChmYXVsdHlzZXJ2aWNlcy5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBmYXVsdHlzZXJ2aWNlTmFtZSA9IChTdHJpbmcpIGZhdWx0eXNlcnZpY2VzLm5leHRFbGVtZW50KCk7Ci0KLSAgICAgICAgICAgICAgICB0ZW1wICs9ICI8aDM+PGZvbnQgY29sb3I9XCJibHVlXCI+IiArIGZhdWx0eXNlcnZpY2VOYW1lICsgIjwvZm9udD48L2gzPiI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIXN0YXR1cykgewotICAgICAgICAgICAgdGVtcCA9ICI8aDI+VGhlcmUgYXJlIG5vIHNlcnZpY2VzIGRlcGxveWVkPC9oMj4iOwotICAgICAgICB9Ci0KLSAgICAgICAgdGVtcCA9ICI8aHRtbD48aGVhZD48dGl0bGU+QXhpczI6IFNlcnZpY2VzPC90aXRsZT48L2hlYWQ+IiArICI8Ym9keT4iICsgdGVtcAotICAgICAgICAgICAgICAgICsgIjwvYm9keT48L2h0bWw+IjsKLQotICAgICAgICByZXR1cm4gdGVtcDsKLSAgICB9Ci0KLSAgICAvLyBOT1RFOiBUaGlzIG1ldGhvZCBpcyBubyBsb25nZXIgdXNlZCBieSB0aGUgc3RhbmRhcmQgQXhpczIgSFRUUCB0cmFuc3BvcnQgKHNlZSBXU0NPTU1PTlMtNDA1KS4KLSAgICAvLyAgICAgICBIb3dldmVyIGl0IGlzIHN0aWxsIHVzZWQgYnkgU3luYXBzZSdzIE5JTyBIVFRQIHRyYW5zcG9ydC4KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBwcmludFNlcnZpY2VIVE1MKFN0cmluZyBzZXJ2aWNlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ3VyYXRpb25Db250ZXh0KSB7Ci0gICAgICAgIFN0cmluZyB0ZW1wID0gIiI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlnID0gY29uZmlndXJhdGlvbkNvbnRleHQuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKTsKLSAgICAgICAgICAgIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlID0gYXhpc0NvbmZpZy5nZXRTZXJ2aWNlKHNlcnZpY2VOYW1lKTsKLSAgICAgICAgICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gYXhpc1NlcnZpY2UuZ2V0T3BlcmF0aW9ucygpOwotICAgICAgICAgICAgdGVtcCArPSAiPGgzPiIgKyBheGlzU2VydmljZS5nZXROYW1lKCkgKyAiPC9oMz4iOwotICAgICAgICAgICAgdGVtcCArPSAiPGEgaHJlZj1cIiIgKyBheGlzU2VydmljZS5nZXROYW1lKCkgKyAiP3dzZGxcIj53c2RsPC9hPiA8YnIvPiAiOwotICAgICAgICAgICAgdGVtcCArPSAiPGk+U2VydmljZSBEZXNjcmlwdGlvbiA6ICAiICsgYXhpc1NlcnZpY2UuZ2V0U2VydmljZURlc2NyaXB0aW9uKCkgKwotICAgICAgICAgICAgICAgICAgICAiPC9pPjxici8+PGJyLz4iOwotICAgICAgICAgICAgaWYgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIHRlbXAgKz0gIkF2YWlsYWJsZSBvcGVyYXRpb25zIDx1bD4iOwotICAgICAgICAgICAgICAgIGZvciAoOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgICAgIEF4aXNPcGVyYXRpb24gYXhpc09wZXJhdGlvbiA9IChBeGlzT3BlcmF0aW9uKSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIHRlbXAgKz0gIjxsaT4iICsgYXhpc09wZXJhdGlvbi5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCkgKyAiPC9saT4iOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0ZW1wICs9ICI8L3VsPiI7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRlbXAgKz0gIk5vIG9wZXJhdGlvbnMgc3BlY2lmaWVkIGZvciB0aGlzIHNlcnZpY2UiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGVtcCA9ICI8aHRtbD48aGVhZD48dGl0bGU+QXhpczI6IFNlcnZpY2VzPC90aXRsZT48L2hlYWQ+IiArICI8Ym9keT4iICsgdGVtcAotICAgICAgICAgICAgICAgICAgICArICI8L2JvZHk+PC9odG1sPiI7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEF4aXNGYXVsdCBheGlzRmF1bHQpIHsKLSAgICAgICAgICAgIHRlbXAgPSAiPGh0bWw+PGhlYWQ+PHRpdGxlPlNlcnZpY2UgaGFzIGEgZnVhbHQ8L3RpdGxlPjwvaGVhZD4iICsgIjxib2R5PiIKLSAgICAgICAgICAgICAgICAgICAgKyAiPGhyPjxoMj48Zm9udCBjb2xvcj1cImJsdWVcIj4iICsgYXhpc0ZhdWx0LmdldE1lc3NhZ2UoKSArCi0gICAgICAgICAgICAgICAgICAgICI8L2ZvbnQ+PC9oMj48L2JvZHk+PC9odG1sPiI7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRlbXA7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvdHJhbnNwb3J0L2h0dHAvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvSFRUUFRyYW5zcG9ydFV0aWxzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy90cmFuc3BvcnQvaHR0cC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9IVFRQVHJhbnNwb3J0VXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzlhZDc3My4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy90cmFuc3BvcnQvaHR0cC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9IVFRQVHJhbnNwb3J0VXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUDExQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQMTJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBQcm9jZXNzaW5nRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5pbXBsLmxsb20uc29hcDExLlNPQVAxMUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLmltcGwubGxvbS5zb2FwMTIuU09BUDEyRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5idWlsZGVyLkJ1aWxkZXJVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk9wZXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzRW5naW5lOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkhhbmRsZXIuSW52b2NhdGlvblJlc3BvbnNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0LlRyYW5zcG9ydFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5KYXZhVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLlV0aWxzOwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvcjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5HWklQSW5wdXRTdHJlYW07Ci0KLXB1YmxpYyBjbGFzcyBIVFRQVHJhbnNwb3J0VXRpbHMgewotCi0KLSAgICAvKioKLSAgICAgKiBAZGVwcmVjYXRlZCBUaGlzIHdhcyB1c2VkIG9ubHkgYnkgdGhlIG5vdyBkZXByZWNhdGVkIHByb2Nlc3NIVFRQR2V0UmVxdWVzdCgpIG1ldGhvZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFNPQVBFbnZlbG9wZSBjcmVhdGVFbnZlbG9wZUZyb21HZXRSZXF1ZXN0KFN0cmluZyByZXF1ZXN0VXJsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwIG1hcCwgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ3R4KQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIFN0cmluZ1tdIHZhbHVlcyA9Ci0gICAgICAgICAgICAgICAgVXRpbHMucGFyc2VSZXF1ZXN0VVJMRm9yU2VydmljZUFuZE9wZXJhdGlvbihyZXF1ZXN0VXJsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnQ3R4LmdldFNlcnZpY2VDb250ZXh0UGF0aCgpKTsKLSAgICAgICAgaWYgKHZhbHVlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFNPQVAxMUZhY3RvcnkoKS5nZXREZWZhdWx0RW52ZWxvcGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICgodmFsdWVzWzFdICE9IG51bGwpICYmICh2YWx1ZXNbMF0gIT0gbnVsbCkpIHsKLSAgICAgICAgICAgIFN0cmluZyBzcnZpY2UgPSB2YWx1ZXNbMF07Ci0gICAgICAgICAgICBBeGlzU2VydmljZSBzZXJ2aWNlID0gY29uZmlnQ3R4LmdldEF4aXNDb25maWd1cmF0aW9uKCkuZ2V0U2VydmljZShzcnZpY2UpOwotICAgICAgICAgICAgaWYgKHNlcnZpY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoInNlcnZpY2Ugbm90IGZvdW5kOiAiICsgc3J2aWNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFN0cmluZyBvcGVyYXRpb24gPSB2YWx1ZXNbMV07Ci0gICAgICAgICAgICBTT0FQRmFjdG9yeSBzb2FwRmFjdG9yeSA9IG5ldyBTT0FQMTFGYWN0b3J5KCk7Ci0gICAgICAgICAgICBTT0FQRW52ZWxvcGUgZW52ZWxvcGUgPSBzb2FwRmFjdG9yeS5nZXREZWZhdWx0RW52ZWxvcGUoKTsKLSAgICAgICAgICAgIE9NTmFtZXNwYWNlIG9tTnMgPSBzb2FwRmFjdG9yeS5jcmVhdGVPTU5hbWVzcGFjZShzZXJ2aWNlLmdldFNjaGVtYVRhcmdldE5hbWVzcGFjZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UuZ2V0U2NoZW1hVGFyZ2V0TmFtZXNwYWNlUHJlZml4KCkpOwotICAgICAgICAgICAgc29hcEZhY3RvcnkuY3JlYXRlT01OYW1lc3BhY2Uoc2VydmljZS5nZXRTY2hlbWFUYXJnZXROYW1lc3BhY2UoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UuZ2V0U2NoZW1hVGFyZ2V0TmFtZXNwYWNlUHJlZml4KCkpOwotICAgICAgICAgICAgT01FbGVtZW50IG9wRWxlbWVudCA9IHNvYXBGYWN0b3J5LmNyZWF0ZU9NRWxlbWVudChvcGVyYXRpb24sIG9tTnMpOwotICAgICAgICAgICAgSXRlcmF0b3IgaXQgPSBtYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQotICAgICAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gKFN0cmluZykgaXQubmV4dCgpOwotICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IChTdHJpbmcpIG1hcC5nZXQobmFtZSk7Ci0gICAgICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlID0gc29hcEZhY3RvcnkuY3JlYXRlT01FbGVtZW50KG5hbWUsIG9tTnMpOwotCi0gICAgICAgICAgICAgICAgb21FbGUuc2V0VGV4dCh2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgb3BFbGVtZW50LmFkZENoaWxkKG9tRWxlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZW52ZWxvcGUuZ2V0Qm9keSgpLmFkZENoaWxkKG9wRWxlbWVudCk7Ci0KLSAgICAgICAgICAgIHJldHVybiBlbnZlbG9wZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIG1zZ0NvbnRleHQgICAgICAgICAgIC0gVGhlIE1lc3NhZ2VDb250ZXh0IG9mIHRoZSBSZXF1ZXN0IE1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gb3V0ICAgICAgICAgICAgICAgICAgLSBUaGUgb3V0cHV0IHN0cmVhbSBvZiB0aGUgcmVzcG9uc2UKLSAgICAgKiBAcGFyYW0gc29hcEFjdGlvbiAgICAgICAgICAgLSBTb2FwQWN0aW9uIG9mIHRoZSByZXF1ZXN0Ci0gICAgICogQHBhcmFtIHJlcXVlc3RVUkkgICAgICAgICAgIC0gVGhlIFVSTCB0aGF0IHRoZSByZXF1ZXN0IGNhbWUgdG8KLSAgICAgKiBAcGFyYW0gY29uZmlndXJhdGlvbkNvbnRleHQgLSBUaGUgQXhpcyBDb25maWd1cmF0aW9uIENvbnRleHQKLSAgICAgKiBAcGFyYW0gcmVxdWVzdFBhcmFtZXRlcnMgICAgLSBUaGUgcGFyYW1ldGVycyBvZiB0aGUgcmVxdWVzdCBtZXNzYWdlCi0gICAgICogQHJldHVybiAtIGJvb2xlYW4gaW5kaWNhdGlvbiB3aGV0aGVyIHRoZSBvcGVyYXRpb24gd2FzIHN1Y2Nlc2Z1bGwKLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdCAtIFRocm93biBpbiBjYXNlIGEgZmF1bHQgb2NjdXJzCi0gICAgICogQGRlcHJlY2F0ZWQgdXNlIFJFU1RVdGlsLnByb2Nlc3NVUkxSZXF1ZXN0KE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQsIE91dHB1dFN0cmVhbSBvdXQsIFN0cmluZyBjb250ZW50VHlwZSkgaW5zdGVhZAotICAgICAqLwotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIHByb2Nlc3NIVFRQR2V0UmVxdWVzdChNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtIG91dCwgU3RyaW5nIHNvYXBBY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmVxdWVzdFVSSSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ3VyYXRpb25Db250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwIHJlcXVlc3RQYXJhbWV0ZXJzKQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIGlmICgoc29hcEFjdGlvbiAhPSBudWxsKSAmJiBzb2FwQWN0aW9uLnN0YXJ0c1dpdGgoIlwiIikgJiYgc29hcEFjdGlvbi5lbmRzV2l0aCgiXCIiKSkgewotICAgICAgICAgICAgc29hcEFjdGlvbiA9IHNvYXBBY3Rpb24uc3Vic3RyaW5nKDEsIHNvYXBBY3Rpb24ubGVuZ3RoKCkgLSAxKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1zZ0NvbnRleHQuc2V0U29hcEFjdGlvbihzb2FwQWN0aW9uKTsKLSAgICAgICAgbXNnQ29udGV4dC5zZXRUbyhuZXcgRW5kcG9pbnRSZWZlcmVuY2UocmVxdWVzdFVSSSkpOwotICAgICAgICBtc2dDb250ZXh0LnNldFByb3BlcnR5KE1lc3NhZ2VDb250ZXh0LlRSQU5TUE9SVF9PVVQsIG91dCk7Ci0gICAgICAgIG1zZ0NvbnRleHQuc2V0U2VydmVyU2lkZSh0cnVlKTsKLSAgICAgICAgU09BUEVudmVsb3BlIGVudmVsb3BlID0gSFRUUFRyYW5zcG9ydFV0aWxzLmNyZWF0ZUVudmVsb3BlRnJvbUdldFJlcXVlc3QocmVxdWVzdFVSSSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFBhcmFtZXRlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb25Db250ZXh0KTsKLQotICAgICAgICBpZiAoZW52ZWxvcGUgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbXNnQ29udGV4dC5zZXREb2luZ1JFU1QodHJ1ZSk7Ci0gICAgICAgICAgICBtc2dDb250ZXh0LnNldEVudmVsb3BlKGVudmVsb3BlKTsKLSAgICAgICAgICAgIEF4aXNFbmdpbmUucmVjZWl2ZShtc2dDb250ZXh0KTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFZFUlNJT05fVU5LTk9XTiA9IDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFZFUlNJT05fU09BUDExID0gMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVkVSU0lPTl9TT0FQMTIgPSAyOwotCi0gICAgcHVibGljIHN0YXRpYyBJbnZvY2F0aW9uUmVzcG9uc2UgcHJvY2Vzc0hUVFBQb3N0UmVxdWVzdChNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdXRwdXRTdHJlYW0gb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNvbnRlbnRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNvYXBBY3Rpb25IZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmVxdWVzdFVSSSkKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBpbnQgc29hcFZlcnNpb24gPSBWRVJTSU9OX1VOS05PV047Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzb2FwVmVyc2lvbiA9IGluaXRpYWxpemVNZXNzYWdlQ29udGV4dChtc2dDb250ZXh0LCBzb2FwQWN0aW9uSGVhZGVyLCByZXF1ZXN0VVJJLCBjb250ZW50VHlwZSk7Ci0gICAgICAgICAgICBtc2dDb250ZXh0LnNldFByb3BlcnR5KE1lc3NhZ2VDb250ZXh0LlRSQU5TUE9SVF9PVVQsIG91dCk7Ci0KLSAgICAgICAgICAgIG1zZ0NvbnRleHQuc2V0RW52ZWxvcGUoCi0gICAgICAgICAgICAgICAgICAgIFRyYW5zcG9ydFV0aWxzLmNyZWF0ZVNPQVBNZXNzYWdlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZ0NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlR1ppcChtc2dDb250ZXh0LCBpbiksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlKSk7Ci0gICAgICAgICAgICByZXR1cm4gQXhpc0VuZ2luZS5yZWNlaXZlKG1zZ0NvbnRleHQpOwotICAgICAgICB9IGNhdGNoIChTT0FQUHJvY2Vzc2luZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBBeGlzRmF1bHQubWFrZUZhdWx0KGUpOwotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgZSkgewotICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKTsKLSAgICAgICAgfSBjYXRjaCAoT01FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEF4aXNGYXVsdC5tYWtlRmF1bHQoZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3IgZSkgewotICAgICAgICAgICAgdGhyb3cgQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmICgobXNnQ29udGV4dC5nZXRFbnZlbG9wZSgpID09IG51bGwpICYmIHNvYXBWZXJzaW9uICE9IFZFUlNJT05fU09BUDExKSB7Ci0gICAgICAgICAgICAgICAgbXNnQ29udGV4dC5zZXRFbnZlbG9wZShuZXcgU09BUDEyRmFjdG9yeSgpLmdldERlZmF1bHRFbnZlbG9wZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgaW50IGluaXRpYWxpemVNZXNzYWdlQ29udGV4dChNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNvYXBBY3Rpb25IZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmVxdWVzdFVSSSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjb250ZW50VHlwZSkgewotICAgICAgICBpbnQgc29hcFZlcnNpb24gPSBWRVJTSU9OX1VOS05PV047Ci0gICAgICAgIC8vIHJlbW92ZSB0aGUgc3RhcnRpbmcgYW5kIHRyYWlsaW5nICIgZnJvbSB0aGUgU09BUCBBY3Rpb24KLSAgICAgICAgaWYgKChzb2FwQWN0aW9uSGVhZGVyICE9IG51bGwpIAotICAgICAgICAgICAgICAgICYmIHNvYXBBY3Rpb25IZWFkZXIubGVuZ3RoKCkgPiAwIAotICAgICAgICAgICAgICAgICYmIHNvYXBBY3Rpb25IZWFkZXIuY2hhckF0KDApID09ICdcIicKLSAgICAgICAgICAgICAgICAmJiBzb2FwQWN0aW9uSGVhZGVyLmVuZHNXaXRoKCJcIiIpKSB7Ci0gICAgICAgICAgICBzb2FwQWN0aW9uSGVhZGVyID0gc29hcEFjdGlvbkhlYWRlci5zdWJzdHJpbmcoMSwgc29hcEFjdGlvbkhlYWRlci5sZW5ndGgoKSAtIDEpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZmlsbCB1cCB0aGUgTWVzc2FnZSBDb250ZXh0cwotICAgICAgICBtc2dDb250ZXh0LnNldFNvYXBBY3Rpb24oc29hcEFjdGlvbkhlYWRlcik7Ci0gICAgICAgIG1zZ0NvbnRleHQuc2V0VG8obmV3IEVuZHBvaW50UmVmZXJlbmNlKHJlcXVlc3RVUkkpKTsKLSAgICAgICAgbXNnQ29udGV4dC5zZXRTZXJ2ZXJTaWRlKHRydWUpOwotCi0gICAgICAgIC8vIGdldCB0aGUgdHlwZSBvZiBjaGFyIGVuY29kaW5nCi0gICAgICAgIFN0cmluZyBjaGFyU2V0RW5jID0gQnVpbGRlclV0aWwuZ2V0Q2hhclNldEVuY29kaW5nKGNvbnRlbnRUeXBlKTsKLSAgICAgICAgaWYgKGNoYXJTZXRFbmMgPT0gbnVsbCkgewotICAgICAgICAgICAgY2hhclNldEVuYyA9IE1lc3NhZ2VDb250ZXh0LkRFRkFVTFRfQ0hBUl9TRVRfRU5DT0RJTkc7Ci0gICAgICAgIH0KLSAgICAgICAgbXNnQ29udGV4dC5zZXRQcm9wZXJ0eShDb25zdGFudHMuQ29uZmlndXJhdGlvbi5DSEFSQUNURVJfU0VUX0VOQ09ESU5HLCBjaGFyU2V0RW5jKTsKLQotICAgICAgICBpZiAoY29udGVudFR5cGUgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGNvbnRlbnRUeXBlLmluZGV4T2YoU09BUDEyQ29uc3RhbnRzLlNPQVBfMTJfQ09OVEVOVF9UWVBFKSA+IC0xKSB7Ci0gICAgICAgICAgICAgICAgc29hcFZlcnNpb24gPSBWRVJTSU9OX1NPQVAxMjsKLSAgICAgICAgICAgICAgICBUcmFuc3BvcnRVdGlscy5wcm9jZXNzQ29udGVudFR5cGVGb3JBY3Rpb24oY29udGVudFR5cGUsIG1zZ0NvbnRleHQpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChjb250ZW50VHlwZQotICAgICAgICAgICAgICAgICAgICAuaW5kZXhPZihTT0FQMTFDb25zdGFudHMuU09BUF8xMV9DT05URU5UX1RZUEUpID4gLTEpIHsKLSAgICAgICAgICAgICAgICBzb2FwVmVyc2lvbiA9IFZFUlNJT05fU09BUDExOwotICAgICAgICAgICAgfSBlbHNlIGlmIChpc1JFU1RSZXF1ZXN0KGNvbnRlbnRUeXBlKSkgewotICAgICAgICAgICAgICAgIC8vIElmIFJFU1QsIGNvbnN0cnVjdCBhIFNPQVAxMSBlbnZlbG9wZSB0byBob2xkIHRoZSByZXN0IG1lc3NhZ2UgYW5kCi0gICAgICAgICAgICAgICAgLy8gaW5kaWNhdGUgdGhhdCB0aGlzIGlzIGEgUkVTVCBtZXNzYWdlLgotICAgICAgICAgICAgICAgIHNvYXBWZXJzaW9uID0gVkVSU0lPTl9TT0FQMTE7Ci0gICAgICAgICAgICAgICAgbXNnQ29udGV4dC5zZXREb2luZ1JFU1QodHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc29hcFZlcnNpb24gPT0gVkVSU0lPTl9TT0FQMTEpIHsKLSAgICAgICAgICAgICAgICAvLyBUT0RPIEtlaXRoIDogRG8gd2UgbmVlZCB0aGlzIGFueW1vcmUKLSAgICAgICAgICAgICAgICAvLyBEZXBsb3ltZW50IGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyCi0gICAgICAgICAgICAgICAgUGFyYW1ldGVyIGVuYWJsZVJFU1QgPSBtc2dDb250ZXh0Ci0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UGFyYW1ldGVyKENvbnN0YW50cy5Db25maWd1cmF0aW9uLkVOQUJMRV9SRVNUKTsKLSAgICAgICAgICAgICAgICBpZiAoKHNvYXBBY3Rpb25IZWFkZXIgPT0gbnVsbCkgJiYgKGVuYWJsZVJFU1QgIT0gbnVsbCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKENvbnN0YW50cy5WQUxVRV9UUlVFLmVxdWFscyhlbmFibGVSRVNULmdldFZhbHVlKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgY29udGVudCBUeXBlIGlzIHRleHQveG1sIChCVFcgd2hpY2ggaXMgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBTT0FQIDEuMSBDb250ZW50IHR5cGUgKSBhbmQgdGhlIFNPQVAgQWN0aW9uIGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBhYnNlbnQgaXQgaXMgcmVzdCAhIQotICAgICAgICAgICAgICAgICAgICAgICAgbXNnQ29udGV4dC5zZXREb2luZ1JFU1QodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNvYXBWZXJzaW9uOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgSW5wdXRTdHJlYW0gaGFuZGxlR1ppcChNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0LCBJbnB1dFN0cmVhbSBpbikKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIE1hcCBoZWFkZXJzID0gKE1hcCkgbXNnQ29udGV4dC5nZXRQcm9wZXJ0eShNZXNzYWdlQ29udGV4dC5UUkFOU1BPUlRfSEVBREVSUyk7Ci0KLSAgICAgICAgaWYgKGhlYWRlcnMgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKEhUVFBDb25zdGFudHMuQ09NUFJFU1NJT05fR1pJUAotICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKGhlYWRlcnMuZ2V0KEhUVFBDb25zdGFudHMuSEVBREVSX0NPTlRFTlRfRU5DT0RJTkcpKSB8fAotICAgICAgICAgICAgICAgICAgICBIVFRQQ29uc3RhbnRzLkNPTVBSRVNTSU9OX0daSVAuZXF1YWxzKGhlYWRlcnMuZ2V0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhUVFBDb25zdGFudHMuSEVBREVSX0NPTlRFTlRfRU5DT0RJTkdfTE9XRVJDQVNFKSkpIHsKLSAgICAgICAgICAgICAgICBpbiA9IG5ldyBHWklQSW5wdXRTdHJlYW0oaW4pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHdpbGwgbWF0Y2ggZm9yIGNvbnRlbnQgdHlwZXMgdGhhdCB3aWxsIGJlIHJlZ2FyZGVkIGFzIFJFU1QgaW4gV1NETDIuMC4KLSAgICAgKiBUaGlzIGNvbnRhaW5zLAotICAgICAqIDEuIGFwcGxpY2F0aW9uL3htbAotICAgICAqIDIuIGFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZAotICAgICAqIDMuIG11bHRpcGFydC9mb3JtLWRhdGEKLSAgICAgKiA8cC8+Ci0gICAgICogSWYgdGhlIHJlcXVlc3QgZG9lc25vdCBjb250YWluIGEgY29udGVudCB0eXBlOyB0aGlzIHdpbGwgcmV0dXJuIHRydWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29udGVudFR5cGUgY29udGVudCB0eXBlIHRvIGNoZWNrCi0gICAgICogQHJldHVybiBCb29sZWFuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUkVTVFJlcXVlc3QoU3RyaW5nIGNvbnRlbnRUeXBlKSB7Ci0gICAgICAgIHJldHVybiBjb250ZW50VHlwZSAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAoY29udGVudFR5cGUuaW5kZXhPZihIVFRQQ29uc3RhbnRzLk1FRElBX1RZUEVfQVBQTElDQVRJT05fWE1MKSA+IC0xIHx8Ci0gICAgICAgICAgICAgICAgY29udGVudFR5cGUuaW5kZXhPZihIVFRQQ29uc3RhbnRzLk1FRElBX1RZUEVfWF9XV1dfRk9STSkgPiAtMSB8fAotICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlLmluZGV4T2YoSFRUUENvbnN0YW50cy5NRURJQV9UWVBFX01VTFRJUEFSVF9GT1JNX0RBVEEpID4gLTEpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3RyYW5zcG9ydC9odHRwL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL0hUVFBXb3JrZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3RyYW5zcG9ydC9odHRwL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL0hUVFBXb3JrZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdlMzZjNC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy90cmFuc3BvcnQvaHR0cC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9IVFRQV29ya2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQuRGVwbG95bWVudENvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkhhbmRsZXIuSW52b2NhdGlvblJlc3BvbnNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0LlJlcXVlc3RSZXNwb25zZVRyYW5zcG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5UcmFuc3BvcnRVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLnNlcnZlci5BeGlzSHR0cFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5zZXJ2ZXIuQXhpc0h0dHBSZXNwb25zZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLnNlcnZlci5IdHRwVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5zZXJ2ZXIuV29ya2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAudXRpbC5SRVNUVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAuSGVhZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IdHRwRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IdHRwU3RhdHVzOwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5NZXRob2ROb3RTdXBwb3J0ZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5odHRwLm1lc3NhZ2UuQmFzaWNIZWFkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5odHRwLnByb3RvY29sLkhUVFA7Ci1pbXBvcnQgb3JnLmFwYWNoZS5odHRwLnV0aWwuRW5jb2RpbmdVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1wdWJsaWMgY2xhc3MgSFRUUFdvcmtlciBpbXBsZW1lbnRzIFdvcmtlciB7Ci0KLSAgICBwdWJsaWMgSFRUUFdvcmtlcigpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXJ2aWNlKAotICAgICAgICAgICAgZmluYWwgQXhpc0h0dHBSZXF1ZXN0IHJlcXVlc3QsCi0gICAgICAgICAgICBmaW5hbCBBeGlzSHR0cFJlc3BvbnNlIHJlc3BvbnNlLAotICAgICAgICAgICAgZmluYWwgTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgdGhyb3dzIEh0dHBFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlndXJhdGlvbkNvbnRleHQgPSBtc2dDb250ZXh0LmdldENvbmZpZ3VyYXRpb25Db250ZXh0KCk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBzZXJ2aWNlUGF0aCA9IGNvbmZpZ3VyYXRpb25Db250ZXh0LmdldFNlcnZpY2VDb250ZXh0UGF0aCgpOwotICAgICAgICBmaW5hbCBTdHJpbmcgY29udGV4dFBhdGggPQotICAgICAgICAgICAgICAgIChzZXJ2aWNlUGF0aC5zdGFydHNXaXRoKCIvIikgPyBzZXJ2aWNlUGF0aCA6ICIvIiArIHNlcnZpY2VQYXRoKSArICIvIjsKLQotICAgICAgICBTdHJpbmcgdXJpID0gcmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCk7Ci0gICAgICAgIFN0cmluZyBtZXRob2QgPSByZXF1ZXN0LmdldE1ldGhvZCgpOwotICAgICAgICBTdHJpbmcgc29hcEFjdGlvbiA9IEh0dHBVdGlscy5nZXRTb2FwQWN0aW9uKHJlcXVlc3QpOwotICAgICAgICBJbnZvY2F0aW9uUmVzcG9uc2UgcGk7Ci0KLSAgICAgICAgaWYgKG1ldGhvZC5lcXVhbHMoSFRUUENvbnN0YW50cy5IRUFERVJfR0VUKSkgewotICAgICAgICAgICAgaWYgKHVyaS5lcXVhbHMoIi9mYXZpY29uLmljbyIpKSB7Ci0gICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2V0U3RhdHVzKEh0dHBTdGF0dXMuU0NfTU9WRURfUEVSTUFORU5UTFkpOwotICAgICAgICAgICAgICAgIHJlc3BvbnNlLmFkZEhlYWRlcihuZXcgQmFzaWNIZWFkZXIoIkxvY2F0aW9uIiwgImh0dHA6Ly93cy5hcGFjaGUub3JnL2Zhdmljb24uaWNvIikpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghdXJpLnN0YXJ0c1dpdGgoY29udGV4dFBhdGgpKSB7Ci0gICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2V0U3RhdHVzKEh0dHBTdGF0dXMuU0NfTU9WRURfUEVSTUFORU5UTFkpOwotICAgICAgICAgICAgICAgIHJlc3BvbnNlLmFkZEhlYWRlcihuZXcgQmFzaWNIZWFkZXIoIkxvY2F0aW9uIiwgY29udGV4dFBhdGgpKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAodXJpLmVuZHNXaXRoKCJheGlzMi9zZXJ2aWNlcy8iKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBzID0gSFRUUFRyYW5zcG9ydFJlY2VpdmVyLmdldFNlcnZpY2VzSFRNTChjb25maWd1cmF0aW9uQ29udGV4dCk7Ci0gICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2V0U3RhdHVzKEh0dHBTdGF0dXMuU0NfT0spOwotICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L2h0bWwiKTsKLSAgICAgICAgICAgICAgICBPdXRwdXRTdHJlYW0gb3V0ID0gcmVzcG9uc2UuZ2V0T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICAgICAgb3V0LndyaXRlKEVuY29kaW5nVXRpbHMuZ2V0Qnl0ZXMocywgSFRUUC5JU09fODg1OV8xKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHVyaS5pbmRleE9mKCI/IikgPCAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCF1cmkuZW5kc1dpdGgoY29udGV4dFBhdGgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh1cmkuZW5kc1dpdGgoIi54c2QiKSB8fCB1cmkuZW5kc1dpdGgoIi53c2RsIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEhhc2hNYXAgc2VydmljZXMgPSBjb25maWd1cmF0aW9uQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpLmdldFNlcnZpY2VzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZmlsZSA9IHVyaS5zdWJzdHJpbmcodXJpLmxhc3RJbmRleE9mKCIvIikgKyAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmkubGVuZ3RoKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChzZXJ2aWNlcyAhPSBudWxsKSAmJiAhc2VydmljZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3IgaSA9IHNlcnZpY2VzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2UgPSAoQXhpc1NlcnZpY2UpIGkubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBzdHJlYW0gPSBzZXJ2aWNlLmdldENsYXNzTG9hZGVyKCkuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFJlc291cmNlQXNTdHJlYW0oIk1FVEEtSU5GLyIgKyBmaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdXRwdXRTdHJlYW0gb3V0ID0gcmVzcG9uc2UuZ2V0T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgidGV4dC94bWwiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3RpbmdBZ2VudC5jb3B5KHN0cmVhbSwgb3V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC5mbHVzaCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAodXJpLmVuZHNXaXRoKCI/d3NkbDIiKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBzZXJ2aWNlTmFtZSA9IHVyaS5zdWJzdHJpbmcodXJpLmxhc3RJbmRleE9mKCIvIikgKyAxLCB1cmkubGVuZ3RoKCkgLSA2KTsKLSAgICAgICAgICAgICAgICBIYXNoTWFwIHNlcnZpY2VzID0gY29uZmlndXJhdGlvbkNvbnRleHQuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5nZXRTZXJ2aWNlcygpOwotICAgICAgICAgICAgICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2UgPSAoQXhpc1NlcnZpY2UpIHNlcnZpY2VzLmdldChzZXJ2aWNlTmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHNlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5zZXRTdGF0dXMoSHR0cFN0YXR1cy5TQ19PSyk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3htbCIpOwotICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLnByaW50V1NETDIocmVzcG9uc2UuZ2V0T3V0cHV0U3RyZWFtKCksIGdldEhvc3QocmVxdWVzdCkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHVyaS5lbmRzV2l0aCgiP3dzZGwiKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBzZXJ2aWNlTmFtZSA9IHVyaS5zdWJzdHJpbmcodXJpLmxhc3RJbmRleE9mKCIvIikgKyAxLCB1cmkubGVuZ3RoKCkgLSA1KTsKLSAgICAgICAgICAgICAgICBIYXNoTWFwIHNlcnZpY2VzID0gY29uZmlndXJhdGlvbkNvbnRleHQuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5nZXRTZXJ2aWNlcygpOwotICAgICAgICAgICAgICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2UgPSAoQXhpc1NlcnZpY2UpIHNlcnZpY2VzLmdldChzZXJ2aWNlTmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHNlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5zZXRTdGF0dXMoSHR0cFN0YXR1cy5TQ19PSyk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3htbCIpOwotICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLnByaW50V1NETChyZXNwb25zZS5nZXRPdXRwdXRTdHJlYW0oKSwgZ2V0SG9zdChyZXF1ZXN0KSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAodXJpLmVuZHNXaXRoKCI/eHNkIikpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgc2VydmljZU5hbWUgPSB1cmkuc3Vic3RyaW5nKHVyaS5sYXN0SW5kZXhPZigiLyIpICsgMSwgdXJpLmxlbmd0aCgpIC0gNCk7Ci0gICAgICAgICAgICAgICAgSGFzaE1hcCBzZXJ2aWNlcyA9IGNvbmZpZ3VyYXRpb25Db250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCkuZ2V0U2VydmljZXMoKTsKLSAgICAgICAgICAgICAgICBBeGlzU2VydmljZSBzZXJ2aWNlID0gKEF4aXNTZXJ2aWNlKSBzZXJ2aWNlcy5nZXQoc2VydmljZU5hbWUpOwotICAgICAgICAgICAgICAgIGlmIChzZXJ2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2V0U3RhdHVzKEh0dHBTdGF0dXMuU0NfT0spOwotICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgidGV4dC94bWwiKTsKLSAgICAgICAgICAgICAgICAgICAgc2VydmljZS5wcmludFNjaGVtYShyZXNwb25zZS5nZXRPdXRwdXRTdHJlYW0oKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvL2NhdGVyIGZvciBuYW1lZCB4c2RzIC0gY2hlY2sgZm9yIHRoZSB4c2QgbmFtZQotICAgICAgICAgICAgaWYgKHVyaS5pbmRleE9mKCI/eHNkPSIpID4gMCkgewotICAgICAgICAgICAgICAgIFN0cmluZyBzZXJ2aWNlTmFtZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICB1cmkuc3Vic3RyaW5nKHVyaS5sYXN0SW5kZXhPZigiLyIpICsgMSwgdXJpLmxhc3RJbmRleE9mKCI/eHNkPSIpKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgc2NoZW1hTmFtZSA9IHVyaS5zdWJzdHJpbmcodXJpLmxhc3RJbmRleE9mKCI9IikgKyAxKTsKLQotICAgICAgICAgICAgICAgIEhhc2hNYXAgc2VydmljZXMgPSBjb25maWd1cmF0aW9uQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpLmdldFNlcnZpY2VzKCk7Ci0gICAgICAgICAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSA9IChBeGlzU2VydmljZSkgc2VydmljZXMuZ2V0KHNlcnZpY2VOYW1lKTsKLSAgICAgICAgICAgICAgICBpZiAoc2VydmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vcnVuIHRoZSBwb3B1bGF0aW9uIGxvZ2ljIGp1c3QgdG8gYmUgc3VyZQotICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLnBvcHVsYXRlU2NoZW1hTWFwcGluZ3MoKTsKLSAgICAgICAgICAgICAgICAgICAgLy93cml0ZSBvdXQgdGhlIGNvcnJlY3Qgc2NoZW1hCi0gICAgICAgICAgICAgICAgICAgIE1hcCBzY2hlbWFUYWJsZSA9IHNlcnZpY2UuZ2V0U2NoZW1hTWFwcGluZ1RhYmxlKCk7Ci0gICAgICAgICAgICAgICAgICAgIFhtbFNjaGVtYSBzY2hlbWEgPSAoWG1sU2NoZW1hKSBzY2hlbWFUYWJsZS5nZXQoc2NoZW1hTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzY2hlbWEgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRvdEluZGV4ID0gc2NoZW1hTmFtZS5pbmRleE9mKCcuJyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZG90SW5kZXggPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNjaGVtYUtleSA9IHNjaGVtYU5hbWUuc3Vic3RyaW5nKDAsZG90SW5kZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYSA9IChYbWxTY2hlbWEpIHNjaGVtYVRhYmxlLmdldChzY2hlbWFLZXkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vc2NoZW1hIGZvdW5kIC0gd3JpdGUgaXQgdG8gdGhlIHN0cmVhbQotICAgICAgICAgICAgICAgICAgICBpZiAoc2NoZW1hICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNldFN0YXR1cyhIdHRwU3RhdHVzLlNDX09LKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3htbCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hLndyaXRlKHJlc3BvbnNlLmdldE91dHB1dFN0cmVhbSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGluc3RyZWFtID0gc2VydmljZS5nZXRDbGFzc0xvYWRlcigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFJlc291cmNlQXNTdHJlYW0oRGVwbG95bWVudENvbnN0YW50cy5NRVRBX0lORiArICIvIiArIHNjaGVtYU5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5zdHJlYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNldFN0YXR1cyhIdHRwU3RhdHVzLlNDX09LKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgidGV4dC94bWwiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdXRwdXRTdHJlYW0gb3V0c3RyZWFtID0gcmVzcG9uc2UuZ2V0T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBjaGVja0xlbmd0aCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbmd0aCA9IEludGVnZXIuTUFYX1ZBTFVFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuZXh0VmFsdWUgPSBpbnN0cmVhbS5yZWFkKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoZWNrTGVuZ3RoKSBsZW5ndGgtLTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoLTEgIT0gbmV4dFZhbHVlICYmIGxlbmd0aCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHN0cmVhbS53cml0ZShuZXh0VmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0VmFsdWUgPSBpbnN0cmVhbS5yZWFkKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGVja0xlbmd0aCkgbGVuZ3RoLS07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHN0cmVhbS5mbHVzaCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJldCA9IHNlcnZpY2UucHJpbnRYU0QoYmFvcywgc2NoZW1hTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocmV0PjApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFvcy5mbHVzaCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5zZXRTdGF0dXMoSHR0cFN0YXR1cy5TQ19PSyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3htbCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdXRwdXRTdHJlYW0gb3V0c3RyZWFtID0gcmVzcG9uc2UuZ2V0T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gY2hlY2tMZW5ndGggPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoID0gSW50ZWdlci5NQVhfVkFMVUU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuZXh0VmFsdWUgPSBpbnN0cmVhbS5yZWFkKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGVja0xlbmd0aCkgbGVuZ3RoLS07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgtMSAhPSBuZXh0VmFsdWUgJiYgbGVuZ3RoID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHN0cmVhbS53cml0ZShuZXh0VmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dFZhbHVlID0gaW5zdHJlYW0ucmVhZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoZWNrTGVuZ3RoKSBsZW5ndGgtLTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRzdHJlYW0uZmx1c2goKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBubyBzY2hlbWEgYXZhaWxhYmxlIGJ5IHRoYXQgbmFtZSAgLSBzZW5kIDQwNAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcihIdHRwU3RhdHVzLlNDX05PVF9GT1VORCwgIlNjaGVtYSBOb3QgRm91bmQhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHVyaS5pbmRleE9mKCI/d3NkbDI9IikgPiAwKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHNlcnZpY2VOYW1lID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHVyaS5zdWJzdHJpbmcodXJpLmxhc3RJbmRleE9mKCIvIikgKyAxLCB1cmkubGFzdEluZGV4T2YoIj93c2RsMj0iKSk7Ci0gICAgICAgICAgICAgICAgaWYgKHByb2Nlc3NJbnRlcm5hbFdTREwodXJpLCBjb25maWd1cmF0aW9uQ29udGV4dCwgc2VydmljZU5hbWUsIHJlc3BvbnNlKSkgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHVyaS5pbmRleE9mKCI/d3NkbD0iKSA+IDApIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgc2VydmljZU5hbWUgPQotICAgICAgICAgICAgICAgICAgICAgICAgdXJpLnN1YnN0cmluZyh1cmkubGFzdEluZGV4T2YoIi8iKSArIDEsIHVyaS5sYXN0SW5kZXhPZigiP3dzZGw9IikpOwotICAgICAgICAgICAgICAgIGlmIChwcm9jZXNzSW50ZXJuYWxXU0RMKHVyaSwgY29uZmlndXJhdGlvbkNvbnRleHQsIHNlcnZpY2VOYW1lLCByZXNwb25zZSkpIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3RyaW5nIGNvbnRlbnRUeXBlID0gbnVsbDsKLSAgICAgICAgICAgIEhlYWRlcltdIGhlYWRlcnMgPSByZXF1ZXN0LmdldEhlYWRlcnMoSFRUUENvbnN0YW50cy5IRUFERVJfQ09OVEVOVF9UWVBFKTsKLSAgICAgICAgICAgIGlmIChoZWFkZXJzICE9IG51bGwgJiYgaGVhZGVycy5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICAgICAgY29udGVudFR5cGUgPSBoZWFkZXJzWzBdLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgaW50IGluZGV4ID0gY29udGVudFR5cGUuaW5kZXhPZignOycpOwotICAgICAgICAgICAgICAgIGlmIChpbmRleCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGVudFR5cGUgPSBjb250ZW50VHlwZS5zdWJzdHJpbmcoMCwgaW5kZXgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gZGVhbCB3aXRoIEdFVCByZXF1ZXN0Ci0gICAgICAgICAgICBwaSA9IFJFU1RVdGlsLnByb2Nlc3NVUkxSZXF1ZXN0KAotICAgICAgICAgICAgICAgICAgICBtc2dDb250ZXh0LCAKLSAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuZ2V0T3V0cHV0U3RyZWFtKCksIAotICAgICAgICAgICAgICAgICAgICBjb250ZW50VHlwZSk7Ci0KLSAgICAgICAgfSBlbHNlIGlmIChtZXRob2QuZXF1YWxzKEhUVFBDb25zdGFudHMuSEVBREVSX1BPU1QpKSB7Ci0gICAgICAgICAgICAvLyBkZWFsIHdpdGggUE9TVCByZXF1ZXN0Ci0KLSAgICAgICAgICAgIFN0cmluZyBjb250ZW50VHlwZSA9IHJlcXVlc3QuZ2V0Q29udGVudFR5cGUoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKEhUVFBUcmFuc3BvcnRVdGlscy5pc1JFU1RSZXF1ZXN0KGNvbnRlbnRUeXBlKSkgewotICAgICAgICAgICAgICAgIHBpID0gUkVTVFV0aWwucHJvY2Vzc1hNTFJlcXVlc3QoCi0gICAgICAgICAgICAgICAgICAgICAgICBtc2dDb250ZXh0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuZ2V0SW5wdXRTdHJlYW0oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmdldE91dHB1dFN0cmVhbSgpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGlwID0gKFN0cmluZyltc2dDb250ZXh0LmdldFByb3BlcnR5KE1lc3NhZ2VDb250ZXh0LlRSQU5TUE9SVF9BRERSKTsKLSAgICAgICAgICAgICAgICBpZiAoaXAgIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgIHVyaSA9IGlwICsgdXJpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwaSA9IEhUVFBUcmFuc3BvcnRVdGlscy5wcm9jZXNzSFRUUFBvc3RSZXF1ZXN0KAotICAgICAgICAgICAgICAgICAgICAgICAgbXNnQ29udGV4dCwgCi0gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmdldElucHV0U3RyZWFtKCksCi0gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5nZXRPdXRwdXRTdHJlYW0oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgIHNvYXBBY3Rpb24sIAotICAgICAgICAgICAgICAgICAgICAgICAgdXJpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IGVsc2UgaWYgKG1ldGhvZC5lcXVhbHMoSFRUUENvbnN0YW50cy5IRUFERVJfUFVUKSkgewotCi0gICAgICAgICAgICBTdHJpbmcgY29udGVudFR5cGUgPSByZXF1ZXN0LmdldENvbnRlbnRUeXBlKCk7Ci0gICAgICAgICAgICBtc2dDb250ZXh0LnNldFByb3BlcnR5KENvbnN0YW50cy5Db25maWd1cmF0aW9uLkNPTlRFTlRfVFlQRSwgY29udGVudFR5cGUpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBwaSA9IFJFU1RVdGlsLnByb2Nlc3NYTUxSZXF1ZXN0KAotICAgICAgICAgICAgICAgICAgICBtc2dDb250ZXh0LCAKLSAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5nZXRJbnB1dFN0cmVhbSgpLAotICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5nZXRPdXRwdXRTdHJlYW0oKSwgCi0gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlKTsKLQotICAgICAgICB9IGVsc2UgaWYgKG1ldGhvZC5lcXVhbHMoSFRUUENvbnN0YW50cy5IRUFERVJfREVMRVRFKSkgewotCi0gICAgICAgICAgICBwaSA9IFJFU1RVdGlsLnByb2Nlc3NVUkxSZXF1ZXN0KAotICAgICAgICAgICAgICAgICAgICBtc2dDb250ZXh0LCAKLSAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuZ2V0T3V0cHV0U3RyZWFtKCksIAotICAgICAgICAgICAgICAgICAgICBudWxsKTsKLQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGhvZE5vdFN1cHBvcnRlZEV4Y2VwdGlvbihtZXRob2QgKyAiIG1ldGhvZCBub3Qgc3VwcG9ydGVkIik7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIEJvb2xlYW4gaG9sZFJlc3BvbnNlID0KLSAgICAgICAgICAgIChCb29sZWFuKSBtc2dDb250ZXh0LmdldFByb3BlcnR5KFJlcXVlc3RSZXNwb25zZVRyYW5zcG9ydC5IT0xEX1JFU1BPTlNFKTsKLSAgICAgICAgaWYgKHBpLmVxdWFscyhJbnZvY2F0aW9uUmVzcG9uc2UuU1VTUEVORCkgfHwKLSAgICAgICAgICAgICAgICAoaG9sZFJlc3BvbnNlICE9IG51bGwgJiYgQm9vbGVhbi5UUlVFLmVxdWFscyhob2xkUmVzcG9uc2UpKSkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAoKFJlcXVlc3RSZXNwb25zZVRyYW5zcG9ydCkgbXNnQ29udGV4dAotICAgICAgICAgICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KFJlcXVlc3RSZXNwb25zZVRyYW5zcG9ydC5UUkFOU1BPUlRfQ09OVFJPTCkpLmF3YWl0UmVzcG9uc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJXZSB3ZXJlIGludGVycnVwdGVkLCBzbyB0aGlzIG1heSBub3QgZnVuY3Rpb24gY29ycmVjdGx5OiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBGaW5hbGl6ZSByZXNwb25zZQotICAgICAgICBSZXF1ZXN0UmVzcG9uc2VUcmFuc3BvcnQgcmVxdWVzdFJlc3BvbnNlVHJhbnNwb3J0Q29udHJvbCA9Ci0gICAgICAgICAgICAoUmVxdWVzdFJlc3BvbnNlVHJhbnNwb3J0KSBtc2dDb250ZXh0LgotICAgICAgICAgICAgZ2V0UHJvcGVydHkoUmVxdWVzdFJlc3BvbnNlVHJhbnNwb3J0LlRSQU5TUE9SVF9DT05UUk9MKTsKLQotICAgICAgICBpZiAoVHJhbnNwb3J0VXRpbHMuaXNSZXNwb25zZVdyaXR0ZW4obXNnQ29udGV4dCkgfHwKLSAgICAgICAgICAgICgocmVxdWVzdFJlc3BvbnNlVHJhbnNwb3J0Q29udHJvbCAhPSBudWxsKSAmJgotICAgICAgICAgICAgIHJlcXVlc3RSZXNwb25zZVRyYW5zcG9ydENvbnRyb2wuZ2V0U3RhdHVzKCkuZXF1YWxzKAotICAgICAgICAgICAgICAgIFJlcXVlc3RSZXNwb25zZVRyYW5zcG9ydC5SZXF1ZXN0UmVzcG9uc2VUcmFuc3BvcnRTdGF0dXMuU0lHTkFMTEVEKSkpIHsKLSAgICAgICAgICAgIC8vIFRoZSByZXNwb25zZSBpcyB3cml0dGVuIG9yIHNpZ25hbGxlZC4gIFRoZSBjdXJyZW50IHN0YXR1cyBpcyB1c2VkIChwcm9iYWJseSBTQ19PSykuCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBUaGUgcmVzcG9uc2UgbWF5IGJlIGFjaydkLCBtYXJrIHRoZSBzdGF0dXMgYXMgYWNjZXB0ZWQuCi0gICAgICAgICAgICByZXNwb25zZS5zZXRTdGF0dXMoSHR0cFN0YXR1cy5TQ19BQ0NFUFRFRCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gcHJvY2Vzc0ludGVybmFsV1NETChTdHJpbmcgdXJpLCBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWd1cmF0aW9uQ29udGV4dCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNlcnZpY2VOYW1lLCBBeGlzSHR0cFJlc3BvbnNlIHJlc3BvbnNlKSAKLSAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgd3NkbE5hbWUgPSB1cmkuc3Vic3RyaW5nKHVyaS5sYXN0SW5kZXhPZigiPSIpICsgMSk7Ci0KLSAgICAgICAgSGFzaE1hcCBzZXJ2aWNlcyA9IGNvbmZpZ3VyYXRpb25Db250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCkuZ2V0U2VydmljZXMoKTsKLSAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSA9IChBeGlzU2VydmljZSkgc2VydmljZXMuZ2V0KHNlcnZpY2VOYW1lKTsKLQotICAgICAgICBpZiAoc2VydmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXNwb25zZS5zZXRTdGF0dXMoSHR0cFN0YXR1cy5TQ19PSyk7Ci0gICAgICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgidGV4dC94bWwiKTsKLSAgICAgICAgICAgIHNlcnZpY2UucHJpbnRVc2VyV1NETChyZXNwb25zZS5nZXRPdXRwdXRTdHJlYW0oKSwgd3NkbE5hbWUpOwotICAgICAgICAgICAgcmVzcG9uc2UuZ2V0T3V0cHV0U3RyZWFtKCkuZmx1c2goKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBubyBzY2hlbWEgYXZhaWxhYmxlIGJ5IHRoYXQgbmFtZSAgLSBzZW5kIDQwNAotICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yKEh0dHBTdGF0dXMuU0NfTk9UX0ZPVU5ELCAiU2NoZW1hIE5vdCBGb3VuZCEiKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEhvc3QoQXhpc0h0dHBSZXF1ZXN0IHJlcXVlc3QpIHRocm93cyBqYXZhLm5ldC5Tb2NrZXRFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgaG9zdCA9IG51bGw7Ci0gICAgICAgIEhlYWRlciBob3N0SGVhZGVyID0gcmVxdWVzdC5nZXRGaXJzdEhlYWRlcigiaG9zdCIpOwotICAgICAgICBpZiAoaG9zdEhlYWRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgcGFydHNbXSA9IGhvc3RIZWFkZXIuZ2V0VmFsdWUoKS5zcGxpdCgiWzpdIik7Ci0gICAgICAgICAgICBpZiAocGFydHMubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgICAgIGhvc3QgPSBwYXJ0c1swXS50cmltKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGhvc3Q7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy90cmFuc3BvcnQvaHR0cC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9IVFRQV29ya2VyRmFjdG9yeS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvdHJhbnNwb3J0L2h0dHAvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvSFRUUFdvcmtlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE2YzUxNi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy90cmFuc3BvcnQvaHR0cC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9IVFRQV29ya2VyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5zZXJ2ZXIuV29ya2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuc2VydmVyLldvcmtlckZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBIVFRQV29ya2VyRmFjdG9yeSBpbXBsZW1lbnRzIFdvcmtlckZhY3RvcnkgewotCi0gICAgcHVibGljIEhUVFBXb3JrZXJGYWN0b3J5KCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIHB1YmxpYyBXb3JrZXIgbmV3V29ya2VyKCkgewotICAgICAgICByZXR1cm4gbmV3IEhUVFBXb3JrZXIoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3RyYW5zcG9ydC9odHRwL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL0h0dHBUcmFuc3BvcnRQcm9wZXJ0aWVzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy90cmFuc3BvcnQvaHR0cC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9IdHRwVHJhbnNwb3J0UHJvcGVydGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWM1OGJmLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3RyYW5zcG9ydC9odHRwL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL0h0dHBUcmFuc3BvcnRQcm9wZXJ0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQuSHR0cFZlcnNpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQuYXV0aC5BdXRoUG9saWN5OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50LmF1dGguQXV0aFNjb3BlOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci0KLS8qKgotICogVXRpbGl0eSBiZWFuIGZvciBzZXR0aW5nIHRyYW5zcG9ydCBwcm9wZXJ0aWVzIGluIHJ1bnRpbWUuCi0gKi8KLXB1YmxpYyBjbGFzcyBIdHRwVHJhbnNwb3J0UHJvcGVydGllcyB7Ci0gICAgcHJvdGVjdGVkIGJvb2xlYW4gY2h1bmtlZDsKLSAgICBwcm90ZWN0ZWQgSHR0cFZlcnNpb24gaHR0cFZlcnNpb247Ci0gICAgcHJvdGVjdGVkIFN0cmluZyBwcm90b2NvbDsKLQotICAgIHB1YmxpYyBIdHRwVHJhbnNwb3J0UHJvcGVydGllcygpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRDaHVua2VkKCkgewotICAgICAgICByZXR1cm4gY2h1bmtlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSHR0cFZlcnNpb24gZ2V0SHR0cFZlcnNpb24oKSB7Ci0gICAgICAgIHJldHVybiBodHRwVmVyc2lvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb3RvY29sKCkgewotICAgICAgICByZXR1cm4gcHJvdG9jb2w7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q2h1bmtlZChib29sZWFuIGNodW5rZWQpIHsKLSAgICAgICAgdGhpcy5jaHVua2VkID0gY2h1bmtlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRIdHRwVmVyc2lvbihIdHRwVmVyc2lvbiBodHRwVmVyaW9uKSB7Ci0gICAgICAgIHRoaXMuaHR0cFZlcnNpb24gPSBodHRwVmVyaW9uOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFByb3RvY29sKFN0cmluZyBwcm90b2NvbCkgewotICAgICAgICB0aGlzLnByb3RvY29sID0gcHJvdG9jb2w7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBQcm94eVByb3BlcnRpZXMgewotICAgICAgICBwcm90ZWN0ZWQgaW50IHByb3h5UG9ydCA9IC0xOwotICAgICAgICBwcm90ZWN0ZWQgU3RyaW5nIGRvbWFpbiA9IG51bGw7Ci0gICAgICAgIHByb3RlY3RlZCBTdHJpbmcgcGFzc1dvcmQgPSBudWxsOwotICAgICAgICBwcm90ZWN0ZWQgU3RyaW5nIHByb3h5SG9zdE5hbWUgPSBudWxsOwotICAgICAgICBwcm90ZWN0ZWQgU3RyaW5nIHVzZXJOYW1lID0gbnVsbDsKLQotICAgICAgICBwdWJsaWMgUHJveHlQcm9wZXJ0aWVzKCkgewotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXREb21haW4oKSB7Ci0gICAgICAgICAgICByZXR1cm4gZG9tYWluOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRQYXNzV29yZCgpIHsKLSAgICAgICAgICAgIHJldHVybiBwYXNzV29yZDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJveHlIb3N0TmFtZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBwcm94eUhvc3ROYW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBnZXRQcm94eVBvcnQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gcHJveHlQb3J0OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRVc2VyTmFtZSgpIHsKLSAgICAgICAgICAgIHJldHVybiB1c2VyTmFtZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldERvbWFpbihTdHJpbmcgZG9tYWluKSB7Ci0gICAgICAgICAgICB0aGlzLmRvbWFpbiA9IGRvbWFpbjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFBhc3NXb3JkKFN0cmluZyBwYXNzV29yZCkgewotICAgICAgICAgICAgdGhpcy5wYXNzV29yZCA9IHBhc3NXb3JkOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0UHJveHlOYW1lKFN0cmluZyBwcm94eUhvc3ROYW1lKSB7Ci0gICAgICAgICAgICB0aGlzLnByb3h5SG9zdE5hbWUgPSBwcm94eUhvc3ROYW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0UHJveHlQb3J0KGludCBwcm94eVBvcnQpIHsKLSAgICAgICAgICAgIHRoaXMucHJveHlQb3J0ID0gcHJveHlQb3J0OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0VXNlck5hbWUoU3RyaW5nIHVzZXJOYW1lKSB7Ci0gICAgICAgICAgICB0aGlzLnVzZXJOYW1lID0gdXNlck5hbWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgIFRoaXMgY2xhc3MgaXMgcmVzcG9uc2libGUgZm9yIGhvbGRpbmcgYWxsIHRoZSBuZWNlc3NhcnkgaW5mb3JtYXRpb24gbmVlZGVkIGZvciBOVE1MLCBEaWdlc3QKLSAgICBhbmQgQmFzaWMgQXV0aGVudGljYXRpb24uIEF1dGhlbnRpY2F0aW9uIGl0c2VsZiBpcyBoYW5kbGVkIGJ5IGh0dHBjbGllbnQuIFVzZXIgZG9lc24ndCBuZWVkIHRvCi0gICAgd2FycnkgYWJvdXQgd2hhdCBhdXRoZW50aWNhdGlvbiBtZWNoYW5pc20gaXQgdXNlcy4gQXhpczIgdXNlcyBodHRwY2xpbmV0J3MgZGVmYXVsdCBhdXRoZW50aWNhdGlvbgotICAgIHBhdHRlcm5zLgotICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBBdXRoZW50aWNhdG9yIHsKLSAgICAgICAgLypob3N0IHRoYXQgbmVlZGVkIHRvIGJlIGF1dGhlbnRpY2F0ZWQgd2l0aCovCi0gICAgICAgIHByaXZhdGUgU3RyaW5nIGhvc3Q7Ci0gICAgICAgIC8qcG9ydCBvZiB0aGUgaG9zdCB0aGF0IG5lZWRlZCB0byBiZSBhdXRoZW50aWNhdGVkIHdpdGgqLwotICAgICAgICBwcml2YXRlIGludCBwb3J0ID0gQXV0aFNjb3BlLkFOWV9QT1JUOwotICAgICAgICAvKlJlYWxtIGZvciBhdXRoZW50aWNhdGlvbiBzY29wZSovCi0gICAgICAgIHByaXZhdGUgU3RyaW5nIHJlYWxtID0gQXV0aFNjb3BlLkFOWV9SRUFMTTsKLSAgICAgICAgLypEb21haW4gbmVlZGVkIGJ5IE5UQ3JlZGVudGlhbHMgZm9yIE5UIERvbWFpbiovCi0gICAgICAgIHByaXZhdGUgU3RyaW5nIGRvbWFpbjsKLSAgICAgICAgLypVc2VyIGZvciBhdXRoZW50aWNhdGUqLwotICAgICAgICBwcml2YXRlIFN0cmluZyB1c2VybmFtZTsKLSAgICAgICAgLypQYXNzd29yZCBvZiB0aGUgdXNlciBmb3IgYXV0aGVudGljYXRlKi8KLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgcGFzc3dvcmQ7Ci0gICAgICAgIC8qIFN3aXRjaCB0byB1c2UgcHJlZW1wdGl2ZSBhdXRoZW50aWNhdGlvbiBvciBub3QqLwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gcHJlZW1wdGl2ZSA9IGZhbHNlOwotICAgICAgICAvKiBpZiBBdXRoZW50aWNhdGlvbiBzY2hlbWUgbmVlZHMgcmV0cnkganVzdCB0dXJuIG9uIHRoZSBmb2xsb3dpbmcgZmxhZyAqLwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gYWxsb3dlZFJldHJ5ID0gZmFsc2U7Ci0gICAgICAgIC8qIENoYW5naW5nIHRoZSBwcmlvcnR5IG9yIGFkZGluZyBhIGN1c3RvbSBBdXRoUG9saWN5Ki8KLSAgICAgICAgcHJpdmF0ZSBMaXN0IGF1dGhTY2hlbWVzOwotCi0gICAgICAgIC8qIERlZmF1bHQgQXV0aCBTY2hlbXMqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOVExNID0gQXV0aFBvbGljeS5OVExNOwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESUdFU1QgPSBBdXRoUG9saWN5LkRJR0VTVDsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFTSUMgPSBBdXRoUG9saWN5LkJBU0lDOwotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0SG9zdCgpIHsKLSAgICAgICAgICAgIHJldHVybiBob3N0OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0SG9zdChTdHJpbmcgaG9zdCkgewotICAgICAgICAgICAgdGhpcy5ob3N0ID0gaG9zdDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0UG9ydCgpIHsKLSAgICAgICAgICAgIHJldHVybiBwb3J0OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0UG9ydChpbnQgcG9ydCkgewotICAgICAgICAgICAgdGhpcy5wb3J0ID0gcG9ydDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVhbG0oKSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVhbG07Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRSZWFsbShTdHJpbmcgcmVhbG0pIHsKLSAgICAgICAgICAgIHRoaXMucmVhbG0gPSByZWFsbTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXNlcm5hbWUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gdXNlcm5hbWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRVc2VybmFtZShTdHJpbmcgdXNlcm5hbWUpIHsKLSAgICAgICAgICAgIHRoaXMudXNlcm5hbWUgPSB1c2VybmFtZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFzc3dvcmQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gcGFzc3dvcmQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZChTdHJpbmcgcGFzc3dvcmQpIHsKLSAgICAgICAgICAgIHRoaXMucGFzc3dvcmQgPSBwYXNzd29yZDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFByZWVtcHRpdmVBdXRoZW50aWNhdGlvbihib29sZWFuIHByZWVtcHRpdmUpIHsKLSAgICAgICAgICAgIHRoaXMucHJlZW1wdGl2ZSA9IHByZWVtcHRpdmU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBnZXRQcmVlbXB0aXZlQXV0aGVudGljYXRpb24oKSB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5wcmVlbXB0aXZlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXREb21haW4oKSB7Ci0gICAgICAgICAgICByZXR1cm4gZG9tYWluOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0RG9tYWluKFN0cmluZyBkb21haW4pIHsKLSAgICAgICAgICAgIHRoaXMuZG9tYWluID0gZG9tYWluOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0QXV0aFNjaGVtZXMoTGlzdCBhdXRoU2NoZW1lcykgewotICAgICAgICAgICAgdGhpcy5hdXRoU2NoZW1lcyA9IGF1dGhTY2hlbWVzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIExpc3QgZ2V0QXV0aFNjaGVtZXMoKSB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5hdXRoU2NoZW1lczsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldEFsbG93ZWRSZXRyeShib29sZWFuIGFsbG93ZWRSZXRyeSkgewotICAgICAgICAgICAgdGhpcy5hbGxvd2VkUmV0cnkgPSBhbGxvd2VkUmV0cnk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0FsbG93ZWRSZXRyeSgpIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLmFsbG93ZWRSZXRyeTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBkZXByZWNhdGVkIG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuSHR0cFRyYW5zcG9ydFByb3BlcnRpZXMuTWFpbFByb3BlcnRpZXMgaGFzIGJlZW4KLSAgICAgKiBkZXByZWNhdGVkIGFuZCB1c2VyIGFyZSBlbmNvdXJhZ2UgdGhlIHVzZSBvZiBqYXZhLnV0aWwuUHJvcGVydGllcyBpbnN0ZWFkLiAgCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBNYWlsUHJvcGVydGllcyB7Ci0gICAgICAgIGZpbmFsIFByb3BlcnRpZXMgbWFpbFByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcygpOwotCi0gICAgICAgIHByaXZhdGUgU3RyaW5nIHBhc3N3b3JkOwotCi0gICAgICAgIHB1YmxpYyB2b2lkIGFkZFByb3BlcnR5KFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgewotICAgICAgICAgICAgbWFpbFByb3BlcnRpZXMucHV0KGtleSwgdmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgZGVsZXRlUHJvcGVydHkoU3RyaW5nIGtleSkgewotICAgICAgICAgICAgbWFpbFByb3BlcnRpZXMucmVtb3ZlKGtleSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgUHJvcGVydGllcyBnZXRQcm9wZXJ0aWVzKCkgewotICAgICAgICAgICAgcmV0dXJuIG1haWxQcm9wZXJ0aWVzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRQYXNzd29yZCgpIHsKLSAgICAgICAgICAgIHJldHVybiBwYXNzd29yZDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFBhc3N3b3JkKFN0cmluZyBwYXNzd29yZCkgewotICAgICAgICAgICAgdGhpcy5wYXNzd29yZCA9IHBhc3N3b3JkOwotICAgICAgICB9Ci0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy90cmFuc3BvcnQvaHR0cC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9MaXN0aW5nQWdlbnQuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3RyYW5zcG9ydC9odHRwL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL0xpc3RpbmdBZ2VudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZmJmZmRmLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3RyYW5zcG9ydC9odHRwL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL0xpc3RpbmdBZ2VudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQ2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC5EZXBsb3ltZW50Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc0Rlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5Qb2xpY3lJbmNsdWRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uVHJhbnNwb3J0SW5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuRXh0ZXJuYWxQb2xpY3lTZXJpYWxpemVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5JT1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubmVldGhpLlBvbGljeTsKLWltcG9ydCBvcmcuYXBhY2hlLm5lZXRoaS5Qb2xpY3lSZWdpc3RyeTsKLQotaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OwotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvcjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTE91dHB1dEZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGNsYXNzIExpc3RpbmdBZ2VudCBleHRlbmRzIEFic3RyYWN0QWdlbnQgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKExpc3RpbmdBZ2VudC5jbGFzcyk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElTVF9NVUxUSVBMRV9TRVJWSUNFX0pTUF9OQU1FID0KLSAgICAgICAgICAgICJsaXN0U2VydmljZXMuanNwIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElTVF9TSU5HTEVfU0VSVklDRV9KU1BfTkFNRSA9Ci0gICAgICAgICAgICAibGlzdFNpbmdsZVNlcnZpY2UuanNwIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElTVF9GQVVMVFlfU0VSVklDRVNfSlNQX05BTUUgPSAibGlzdEZhdWx0eVNlcnZpY2UuanNwIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJVTk5JTkdfUE9SVCA9ICJSVU5OSU5HX1BPUlQiOwotCi0gICAgcHVibGljIExpc3RpbmdBZ2VudChDb25maWd1cmF0aW9uQ29udGV4dCBhQ29uZmlnQ29udGV4dCkgewotICAgICAgICBzdXBlcihhQ29uZmlnQ29udGV4dCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZFRyYW5zcG9ydExpc3RlbmVyKFN0cmluZyBzY2hlbWEsIGludCBwb3J0KSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBUcmFuc3BvcnRJbkRlc2NyaXB0aW9uIHRyc0luID0KLSAgICAgICAgICAgICAgICAgICAgY29uZmlnQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpLmdldFRyYW5zcG9ydEluKHNjaGVtYSk7Ci0gICAgICAgICAgICBpZiAodHJzSW4gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRyc0luID0gbmV3IFRyYW5zcG9ydEluRGVzY3JpcHRpb24oc2NoZW1hKTsKLSAgICAgICAgICAgICAgICBDdXN0b21MaXN0ZW5lciBodHRzcFJlY2VpdmVyID0gbmV3IEN1c3RvbUxpc3RlbmVyKHBvcnQsIHNjaGVtYSk7Ci0gICAgICAgICAgICAgICAgaHR0c3BSZWNlaXZlci5pbml0KGNvbmZpZ0NvbnRleHQsIHRyc0luKTsKLSAgICAgICAgICAgICAgICB0cnNJbi5zZXRSZWNlaXZlcihodHRzcFJlY2VpdmVyKTsKLSAgICAgICAgICAgICAgICBjb25maWdDb250ZXh0LmdldExpc3RlbmVyTWFuYWdlcigpLmFkZExpc3RlbmVyKHRyc0luLCB0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGF4aXNGYXVsdCkgewotICAgICAgICAgICAgLy8KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGhhbmRsZShIdHRwU2VydmxldFJlcXVlc3QgaHR0cFNlcnZsZXRSZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIGh0dHBTZXJ2bGV0UmVzcG9uc2UpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24gewotCi0gICAgICAgIGluaXRUcmFuc3BvcnRMaXN0ZW5lcihodHRwU2VydmxldFJlcXVlc3QpOwotCi0gICAgICAgIFN0cmluZyBxdWVyeSA9IGh0dHBTZXJ2bGV0UmVxdWVzdC5nZXRRdWVyeVN0cmluZygpOwotICAgICAgICBpZiAocXVlcnkgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKHF1ZXJ5LmluZGV4T2YoIndzZGwyIikgPiAwIHx8IHF1ZXJ5LmluZGV4T2YoIndzZGwiKSA+IDAgfHwKLSAgICAgICAgICAgICAgICBxdWVyeS5pbmRleE9mKCJ4c2QiKSA+IDAgfHwgcXVlcnkuaW5kZXhPZigicG9saWN5IikgPiAwKSB7Ci0gICAgICAgICAgICAgICAgcHJvY2Vzc0xpc3RTZXJ2aWNlKGh0dHBTZXJ2bGV0UmVxdWVzdCwgaHR0cFNlcnZsZXRSZXNwb25zZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHN1cGVyLmhhbmRsZShodHRwU2VydmxldFJlcXVlc3QsIGh0dHBTZXJ2bGV0UmVzcG9uc2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3VwZXIuaGFuZGxlKGh0dHBTZXJ2bGV0UmVxdWVzdCwgaHR0cFNlcnZsZXRSZXNwb25zZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0VHJhbnNwb3J0TGlzdGVuZXIoSHR0cFNlcnZsZXRSZXF1ZXN0IGh0dHBTZXJ2bGV0UmVxdWVzdCkgewotICAgICAgICAvLyBodHRwU2VydmxldFJlcXVlc3QuZ2V0TG9jYWxQb3J0KCkgLCBnaXZpbmcgbWUgYSBidWlsZCBlcnJvciBzbyBJIGhhZCB0byB1c2UgdGhlIGZvbGxvd2luCi0gICAgICAgIFN0cmluZyBmaWxlUGFydDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZpbGVQYXJ0ID0gaHR0cFNlcnZsZXRSZXF1ZXN0LmdldFJlcXVlc3RVUkwoKS50b1N0cmluZygpOwotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCl7Ci0gICAgICAgICAgICBsb2cuaW5mbygiT2xkIFNlcnZsZXQgQVBJIChmYWxsYmFjayB0byBIdHRwU2VydmxldFJlcXVlc3QuZ2V0UmVxdWVzdFVSSSkgOiIgKyB0KTsgICAgCi0gICAgICAgICAgICBmaWxlUGFydCA9IGh0dHBTZXJ2bGV0UmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IGlwaW5kZXggPSBmaWxlUGFydC5pbmRleE9mKCIvLyIpOwotICAgICAgICBTdHJpbmcgaXA7Ci0gICAgICAgIGlmIChpcGluZGV4ID49IDApIHsKLSAgICAgICAgICAgIGlwID0gZmlsZVBhcnQuc3Vic3RyaW5nKGlwaW5kZXggKyAyLCBmaWxlUGFydC5sZW5ndGgoKSk7Ci0gICAgICAgICAgICBpbnQgc2VwZXJhdG9ySW5kZXggPSBpcC5pbmRleE9mKCI6Iik7Ci0gICAgICAgICAgICBpbnQgc2xhc2hJbmRleCA9IGlwLmluZGV4T2YoIi8iKTsKLSAgICAgICAgICAgIFN0cmluZyBwb3J0c3RyOwotICAgICAgICAgICAgaWYgKHNlcGVyYXRvckluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICBwb3J0c3RyID0gaXAuc3Vic3RyaW5nKHNlcGVyYXRvckluZGV4ICsgMSwgc2xhc2hJbmRleCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHBvcnRzdHIgPSAiODAiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBhZGRUcmFuc3BvcnRMaXN0ZW5lcihodHRwU2VydmxldFJlcXVlc3QuZ2V0U2NoZW1lKCksIEludGVnZXIucGFyc2VJbnQocG9ydHN0cikpOwotICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoZS50b1N0cmluZygpLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NMaXN0RmF1bHR5U2VydmljZXMoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgc2VydmljZU5hbWUgPSByZXEuZ2V0UGFyYW1ldGVyKCJzZXJ2aWNlTmFtZSIpOwotICAgICAgICBpZiAoc2VydmljZU5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSA9IGNvbmZpZ0NvbnRleHQuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5nZXRTZXJ2aWNlKHNlcnZpY2VOYW1lKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcmVxLmdldFNlc3Npb24oKS5zZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLlNJTkdMRV9TRVJWSUNFLCBzZXJ2aWNlKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0gICAgICAgICAgICAgICAgbG9nLmluZm8oIk9sZCBTZXJ2bGV0IEFQSSA6IiArIHQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJlbmRlclZpZXcoTElTVF9GQVVMVFlfU0VSVklDRVNfSlNQX05BTUUsIHJlcSwgcmVzKTsKLSAgICB9Ci0KLQotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NJbmRleChIdHRwU2VydmxldFJlcXVlc3QgaHR0cFNlcnZsZXRSZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIGh0dHBTZXJ2bGV0UmVzcG9uc2UpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24gewotICAgICAgICBwcm9jZXNzTGlzdFNlcnZpY2VzKGh0dHBTZXJ2bGV0UmVxdWVzdCwgaHR0cFNlcnZsZXRSZXNwb25zZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZXh0cmFjdEhvc3RBbmRQb3J0KFN0cmluZyBmaWxlUGFydCwgYm9vbGVhbiBpc0h0dHApIHsKLSAgICAgICAgaW50IGlwaW5kZXggPSBmaWxlUGFydC5pbmRleE9mKCIvLyIpOwotICAgICAgICBTdHJpbmcgaXAgPSBudWxsOwotICAgICAgICBpZiAoaXBpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICBpcCA9IGZpbGVQYXJ0LnN1YnN0cmluZyhpcGluZGV4ICsgMiwgZmlsZVBhcnQubGVuZ3RoKCkpOwotICAgICAgICAgICAgaW50IHNlcGVyYXRvckluZGV4ID0gaXAuaW5kZXhPZigiOiIpOwotICAgICAgICAgICAgaW50IHNsYXNoSW5kZXggPSBpcC5pbmRleE9mKCIvIik7Ci0gICAgICAgICAgICBTdHJpbmcgcG9ydDsKLSAgICAgICAgICAgIGlmIChzZXBlcmF0b3JJbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgcG9ydCA9IGlwLnN1YnN0cmluZyhzZXBlcmF0b3JJbmRleCArIDEsIHNsYXNoSW5kZXgpOwotICAgICAgICAgICAgICAgIGlwID0gaXAuc3Vic3RyaW5nKDAsIHNlcGVyYXRvckluZGV4KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaXAgPSBpcC5zdWJzdHJpbmcoMCwgc2xhc2hJbmRleCk7Ci0gICAgICAgICAgICAgICAgcG9ydCA9ICI4MCI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoaXNIdHRwKSB7Ci0gICAgICAgICAgICAgICAgY29uZmlnQ29udGV4dC5zZXRQcm9wZXJ0eShSVU5OSU5HX1BPUlQsIHBvcnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpcDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzRXhwbGljaXRTY2hlbWFBbmRXU0RMKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlcykKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7Ci0gICAgICAgIEhhc2hNYXAgc2VydmljZXMgPSBjb25maWdDb250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCkuZ2V0U2VydmljZXMoKTsKLSAgICAgICAgU3RyaW5nIGZpbGVQYXJ0ID0gcmVxLmdldFJlcXVlc3RVUkwoKS50b1N0cmluZygpOwotICAgICAgICBTdHJpbmcgc2NoZW1hID0gZmlsZVBhcnQuc3Vic3RyaW5nKGZpbGVQYXJ0Lmxhc3RJbmRleE9mKCIvIikgKyAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVQYXJ0Lmxlbmd0aCgpKTsKLSAgICAgICAgaWYgKChzZXJ2aWNlcyAhPSBudWxsKSAmJiAhc2VydmljZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBJdGVyYXRvciBpID0gc2VydmljZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2UgPSAoQXhpc1NlcnZpY2UpIGkubmV4dCgpOwotICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIHN0cmVhbSA9IHNlcnZpY2UuZ2V0Q2xhc3NMb2FkZXIoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKCJNRVRBLUlORi8iICsgc2NoZW1hKTsKLSAgICAgICAgICAgICAgICBpZiAoc3RyZWFtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtIG91dCA9IHJlcy5nZXRPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3htbCIpOwotICAgICAgICAgICAgICAgICAgICBJT1V0aWxzLmNvcHkoc3RyZWFtLCBvdXQsIHRydWUpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29waWVzIHRoZSBpbnB1dCBzdHJlYW0gdG8gdGhlIG91dHB1dCBzdHJlYW0KLSAgICAgKgotICAgICAqIEBwYXJhbSBzdHJlYW0gIHRoZSA8Y29kZT5JbnB1dFN0cmVhbTwvY29kZT4KLSAgICAgKiBAcGFyYW0gb3N0cmVhbSB0aGUgPGNvZGU+T3V0cHV0U3RyZWFtPC9jb2RlPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjb3B5KElucHV0U3RyZWFtIHN0cmVhbSwgT3V0cHV0U3RyZWFtIG9zdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIElPVXRpbHMuY29weShzdHJlYW0sIG9zdHJlYW0sIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGV4dHJhY3RTZXJ2aWNlTmFtZShTdHJpbmcgdXJsU3RyaW5nKSB7Ci0gICAgICAgIGludCBuID0gdXJsU3RyaW5nLmluZGV4T2YoY29uZmlnQ29udGV4dC5nZXRTZXJ2aWNlQ29udGV4dFBhdGgoKSk7Ci0gICAgICAgIGlmIChuICE9IC0xKSB7Ci0gICAgICAgICAgICBTdHJpbmcgc2VydmljZU5hbWUgPSB1cmxTdHJpbmcuc3Vic3RyaW5nKG4gKyBjb25maWdDb250ZXh0LmdldFNlcnZpY2VDb250ZXh0UGF0aCgpLmxlbmd0aCgpLAotICAgICAgICAgICAgICAgICAgICB1cmxTdHJpbmcubGVuZ3RoKCkpOwotICAgICAgICAgICAgaWYgKHNlcnZpY2VOYW1lLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgIGlmKHNlcnZpY2VOYW1lLmNoYXJBdCgwKT09Jy8nKXsKLSAgICAgICAgICAgICAgICAgICAgc2VydmljZU5hbWUgPSBzZXJ2aWNlTmFtZS5zdWJzdHJpbmcoMSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlTmFtZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdXJsU3RyaW5nLnN1YnN0cmluZyh1cmxTdHJpbmcubGFzdEluZGV4T2YoIi8iKSArIDEsCi0gICAgICAgICAgICAgICAgdXJsU3RyaW5nLmxlbmd0aCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzTGlzdFNlcnZpY2UoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24gewotCi0gICAgICAgIFN0cmluZyB1cmw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgIHVybCA9IHJlcS5nZXRSZXF1ZXN0VVJMKCkudG9TdHJpbmcoKTsKLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgICAgIGxvZy5pbmZvKCJPbGQgU2VydmxldCBBUEkgKEZhbGxiYWNrIHRvIEh0dHBTZXJ2bGV0UmVxdWVzdC5nZXRSZXF1ZXN0VVJJKSA6IiArIHQpOyAgICAKLSAgICAgICAgICAgIHVybCA9IHJlcS5nZXRSZXF1ZXN0VVJJKCk7Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nIHNlcnZpY2VOYW1lID0gZXh0cmFjdFNlcnZpY2VOYW1lKHVybCk7Ci0gICAgICAgIEhhc2hNYXAgc2VydmljZXMgPSBjb25maWdDb250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCkuZ2V0U2VydmljZXMoKTsKLSAgICAgICAgU3RyaW5nIHF1ZXJ5ID0gcmVxLmdldFF1ZXJ5U3RyaW5nKCk7Ci0gICAgICAgIGludCB3c2RsMiA9IHF1ZXJ5LmluZGV4T2YoIndzZGwyIik7Ci0gICAgICAgIGludCB3c2RsID0gcXVlcnkuaW5kZXhPZigid3NkbCIpOwotICAgICAgICBpbnQgeHNkID0gcXVlcnkuaW5kZXhPZigieHNkIik7Ci0gICAgICAgIGludCBwb2xpY3kgPSBxdWVyeS5pbmRleE9mKCJwb2xpY3kiKTsKLQotICAgICAgICBpZiAoKHNlcnZpY2VzICE9IG51bGwpICYmICFzZXJ2aWNlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIE9iamVjdCBzZXJ2aWNlT2JqID0gc2VydmljZXMuZ2V0KHNlcnZpY2VOYW1lKTsKLSAgICAgICAgICAgIGlmIChzZXJ2aWNlT2JqICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBBeGlzU2VydmljZSBheGlzU2VydmljZSA9IChBeGlzU2VydmljZSkgc2VydmljZU9iajsKLSAgICAgICAgICAgICAgICBib29sZWFuIGlzSHR0cCA9ICJodHRwIi5lcXVhbHMocmVxLmdldFNjaGVtZSgpKTsKLSAgICAgICAgICAgICAgICBpZiAod3NkbDIgPj0gMCkgewotICAgICAgICAgICAgICAgICAgICByZXMuc2V0Q29udGVudFR5cGUoInRleHQveG1sIik7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBpcCA9IGV4dHJhY3RIb3N0QW5kUG9ydCh1cmwsIGlzSHR0cCk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyB3c2RsTmFtZSA9IHJlcS5nZXRQYXJhbWV0ZXIoIndzZGwyIik7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpbnQgcmV0ID0gYXhpc1NlcnZpY2UucHJpbnRXU0RMMihyZXMuZ2V0T3V0cHV0U3RyZWFtKCksIGlwLCB3c2RsTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXQgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVzLnNlbmRSZWRpcmVjdCgiIik7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmV0ID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXMuc2VuZEVycm9yKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfTk9UX0ZPVU5EKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3c2RsID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtIG91dCA9IHJlcy5nZXRPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3htbCIpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaXAgPSBleHRyYWN0SG9zdEFuZFBvcnQodXJsLCBpc0h0dHApOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgd3NkbE5hbWUgPSByZXEuZ2V0UGFyYW1ldGVyKCJ3c2RsIik7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHdzZGxOYW1lICE9IG51bGwgJiYgd3NkbE5hbWUubGVuZ3RoKCk+MCkgewotICAgICAgICAgICAgICAgICAgICAgICAgYXhpc1NlcnZpY2UucHJpbnRVc2VyV1NETChvdXQsIHdzZGxOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dC5mbHVzaCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgb3V0LmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBheGlzU2VydmljZS5wcmludFdTREwob3V0LCBpcCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXQuZmx1c2goKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dC5jbG9zZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHhzZCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlcy5zZXRDb250ZW50VHlwZSgidGV4dC94bWwiKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IHJldCA9IGF4aXNTZXJ2aWNlLnByaW50WFNEKHJlcy5nZXRPdXRwdXRTdHJlYW0oKSwgcmVxLmdldFBhcmFtZXRlcigieHNkIikpOwotICAgICAgICAgICAgICAgICAgICBpZiAocmV0ID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vbXVsdGlwbGUgc2NoZW1hcyBhcmUgcHJlc2VudCBhbmQgdGhlIHVzZXIgc3BlY2lmaWVkCi0gICAgICAgICAgICAgICAgICAgICAgICAvL25vIG5hbWUgLSBpbiB0aGlzIGNhc2Ugd2UgY2Fubm90IHBvc3NpYmx5IHB1bXAgYSBzY2hlbWEKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vc28gcmVkaXJlY3QgdG8gdGhlIHNlcnZpY2Ugcm9vdAotICAgICAgICAgICAgICAgICAgICAgICAgcmVzLnNlbmRSZWRpcmVjdCgiIik7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmV0ID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXMuc2VuZEVycm9yKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfTk9UX0ZPVU5EKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwb2xpY3kgPj0gMCkgewotCi0gICAgICAgICAgICAgICAgICAgIEV4dGVybmFsUG9saWN5U2VyaWFsaXplciBzZXJpYWxpemVyID0gbmV3IEV4dGVybmFsUG9saWN5U2VyaWFsaXplcigpOwotICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemVyLnNldEFzc2VydGlvbnNUb0ZpbHRlcihjb25maWdDb250ZXh0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEF4aXNDb25maWd1cmF0aW9uKCkuZ2V0TG9jYWxQb2xpY3lBc3NlcnRpb25zKCkpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIHdoZXRoZXIgSWQgaXMgc2V0Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBpZFBhcmFtID0gcmVxLmdldFBhcmFtZXRlcigiaWQiKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoaWRQYXJhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZCBpcyBzZXQKLQotICAgICAgICAgICAgICAgICAgICAgICAgUG9saWN5IHRhcmdldFBvbGljeSA9IGZpbmRQb2xpY3koaWRQYXJhbSwgYXhpc1NlcnZpY2UpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0UG9saWN5ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtIG91dCA9IHJlcy5nZXRPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyID0gWE1MT3V0cHV0RmFjdG9yeS5uZXdJbnN0YW5jZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZVhNTFN0cmVhbVdyaXRlcihvdXQpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcy5zZXRDb250ZW50VHlwZSgiYXBwbGljYXRpb24vd3Nwb2xpY3kreG1sIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFBvbGljeS5zZXJpYWxpemUod3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLmZsdXNoKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2VydmxldEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3Igb2NjdXJlZCB3aGVuIHNlcmlhbGl6aW5nIHRoZSBQb2xpY3kiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvciBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciBvY2N1cmVkIHdoZW4gc2VyaWFsaXppbmcgdGhlIFBvbGljeSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtIG91dCA9IHJlcy5nZXRPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMuc2V0Q29udGVudFR5cGUoInRleHQvaHRtbCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBvdXRTdHIgPSAiPGI+Tm8gcG9saWN5IGZvdW5kIGZvciBpZD0iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgaWRQYXJhbSArICI8L2I+IjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGUob3V0U3RyLmdldEJ5dGVzKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIFBvbGljeUluY2x1ZGUgcG9saWN5SW5jbHVkZSA9IGF4aXNTZXJ2aWNlLmdldFBvbGljeUluY2x1ZGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFBvbGljeSBlZmZlY1BvbGljeSA9IHBvbGljeUluY2x1ZGUuZ2V0RWZmZWN0aXZlUG9saWN5KCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlZmZlY1BvbGljeSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MU3RyZWFtV3JpdGVyIHdyaXRlcjsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbSBvdXQgPSByZXMuZ2V0T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlciA9IFhNTE91dHB1dEZhY3RvcnkubmV3SW5zdGFuY2UoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jcmVhdGVYTUxTdHJlYW1Xcml0ZXIob3V0KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMuc2V0Q29udGVudFR5cGUoImFwcGxpY2F0aW9uL3dzcG9saWN5K3htbCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY1BvbGljeS5zZXJpYWxpemUod3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLmZsdXNoKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2VydmxldEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3Igb2NjdXJlZCB3aGVuIHNlcmlhbGl6aW5nIHRoZSBQb2xpY3kiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvciBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciBvY2N1cmVkIHdoZW4gc2VyaWFsaXppbmcgdGhlIFBvbGljeSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbSBvdXQgPSByZXMuZ2V0T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzLnNldENvbnRlbnRUeXBlKCJ0ZXh0L2h0bWwiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgb3V0U3RyID0gIjxiPk5vIGVmZmVjdGl2ZSBwb2xpY3kgZm9yICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzZXJ2aWNlTmFtZSArICIgc2VydmljZTwvYj4iOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZShvdXRTdHIuZ2V0Qnl0ZXMoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlcS5nZXRTZXNzaW9uKCkuc2V0QXR0cmlidXRlKENvbnN0YW50cy5TSU5HTEVfU0VSVklDRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZU9iaik7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuaW5mbygiT2xkIFNlcnZsZXQgQVBJIDoiICsgdCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlcS5nZXRTZXNzaW9uKCkuc2V0QXR0cmlidXRlKENvbnN0YW50cy5TSU5HTEVfU0VSVklDRSwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpewotICAgICAgICAgICAgICAgICAgICBsb2cuaW5mbygiT2xkIFNlcnZsZXQgQVBJIDoiICsgdCk7ICAgIAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcmVzLnNlbmRFcnJvcihIdHRwU2VydmxldFJlc3BvbnNlLlNDX05PVF9GT1VORCwgdXJsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJlbmRlclZpZXcoTElTVF9TSU5HTEVfU0VSVklDRV9KU1BfTkFNRSwgcmVxLCByZXMpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NMaXN0U2VydmljZXMoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKLQotICAgICAgICBwb3B1bGF0ZVNlc3Npb25JbmZvcm1hdGlvbihyZXEpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmVxLmdldFNlc3Npb24oKS5zZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLkVSUk9SX1NFUlZJQ0VfTUFQLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpLmdldEZhdWx0eVNlcnZpY2VzKCkpOwotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCl7Ci0gICAgICAgICAgICBsb2cuaW5mbygiT2xkIFNlcnZsZXQgQVBJIDoiICsgdCk7ICAgIAotICAgICAgICB9Ci0gICAgICAgIHJlbmRlclZpZXcoTElTVF9NVUxUSVBMRV9TRVJWSUNFX0pTUF9OQU1FLCByZXEsIHJlcyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBQb2xpY3kgZmluZFBvbGljeShTdHJpbmcgaWQsIEF4aXNEZXNjcmlwdGlvbiBkZXMpIHsKLQotICAgICAgICBMaXN0IHBvbGljeUVsZW1lbnRzID0gZGVzLmdldFBvbGljeUluY2x1ZGUoKS5nZXRQb2xpY3lFbGVtZW50cygpOwotICAgICAgICBQb2xpY3lSZWdpc3RyeSByZWdpc3RyeSA9IGRlcy5nZXRQb2xpY3lJbmNsdWRlKCkuZ2V0UG9saWN5UmVnaXN0cnkoKTsKLQotICAgICAgICBPYmplY3QgcG9saWN5Q29tcG9uZW50OwotCi0gICAgICAgIFBvbGljeSBwb2xpY3kgPSByZWdpc3RyeS5sb29rdXAoaWQpOwotCi0gICAgICAgIGlmIChwb2xpY3kgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHBvbGljeTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBwb2xpY3lFbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBwb2xpY3lDb21wb25lbnQgPSBpdGVyYXRvci5uZXh0KCk7Ci0KLSAgICAgICAgICAgIGlmIChwb2xpY3lDb21wb25lbnQgaW5zdGFuY2VvZiBQb2xpY3kpIHsKLSAgICAgICAgICAgICAgICAvLyBwb2xpY3kgZm91bmQgZm9yIHRoZSBpZAotCi0gICAgICAgICAgICAgICAgaWYgKGlkLmVxdWFscygoKFBvbGljeSkgcG9saWN5Q29tcG9uZW50KS5nZXRJZCgpKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFBvbGljeSkgcG9saWN5Q29tcG9uZW50OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEF4aXNEZXNjcmlwdGlvbiBjaGlsZDsKLQotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZGVzLmdldENoaWxkcmVuKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIGNoaWxkID0gKEF4aXNEZXNjcmlwdGlvbikgaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgcG9saWN5ID0gZmluZFBvbGljeShpZCwgY2hpbGQpOwotCi0gICAgICAgICAgICBpZiAocG9saWN5ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcG9saWN5OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy90cmFuc3BvcnQvaHR0cC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9Qcm94eUNvbmZpZ3VyYXRpb24uamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3RyYW5zcG9ydC9odHRwL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL1Byb3h5Q29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjhkYzcxLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3RyYW5zcG9ydC9odHRwL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL1Byb3h5Q29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5DcmVkZW50aWFsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5Ib3N0Q29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5IdHRwQ2xpZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50Lk5UQ3JlZGVudGlhbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQuVXNlcm5hbWVQYXNzd29yZENyZWRlbnRpYWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50LmF1dGguQXV0aFNjb3BlOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotCi0vKioKLSAqIFRoZSBwdXJwb3NlIG9mIHRoaXMgY2xhc3MgaXMgdG8gY29uZmlndXJlIHRoZSBwcm94eSBhdXRoIHJlZ2FyZGxlcyBvZiB0aGUgcHJvdG9jb2wuCi0gKiBQcm94eSB3aWxsIGJlIHNldCBvbmx5IGZvciBIVFRQIGNvbm5lY3Rpb24KLSAqLwotCi1wdWJsaWMgY2xhc3MgUHJveHlDb25maWd1cmF0aW9uIHsKLQotICAgIHByb3RlY3RlZCBTdHJpbmcgcHJveHlIb3N0OwotICAgIHByb3RlY3RlZCBTdHJpbmcgbm9uUHJveHlIb3N0czsKLSAgICBwcm90ZWN0ZWQgaW50IHByb3h5UG9ydCA9IC0xOyAvL0lmIHBvcnQgaXMgbm90IHNldCwgZGVmYXVsdCBpcyBzZXQgdG8gLTEKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHByb3h5VXNlcjsKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHByb3h5UGFzc3dvcmQ7Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQX1BST1hZX0hPU1QgPSAiaHR0cC5wcm94eUhvc3QiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEhUVFBfUFJPWFlfUE9SVCA9ICJodHRwLnByb3h5UG9ydCI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRUUF9OT05fUFJPWFlfSE9TVFMgPSAiaHR0cC5ub25Qcm94eUhvc3RzIjsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfUFJPWFkgPSAiUHJveHkiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1hZX0hPU1RfRUxFTUVOVCA9ICJQcm94eUhvc3QiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1hZX1BPUlRfRUxFTUVOVCA9ICJQcm94eVBvcnQiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1hZX1VTRVJfRUxFTUVOVCA9ICJQcm94eVVzZXIiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1hZX1BBU1NXT1JEX0VMRU1FTlQgPSAiUHJveHlQYXNzd29yZCI7Ci0KLSAgICBwdWJsaWMgdm9pZCBjb25maWd1cmUoTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBDbGllbnQgaHR0cENsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgSG9zdENvbmZpZ3VyYXRpb24gY29uZmlnKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLQotICAgICAgICAvLyAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJQcm94eSI+Ci0gICAgICAgIC8vICAgICAgICAgICAgICA8Q29uZmlndXJhdGlvbj4KLSAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICA8UHJveHlIb3N0PmV4YW1wbGUub3JnPC9Qcm94eUhvc3Q+Ci0gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgPFByb3h5UG9ydD41Njc4PC9Qcm94eVBvcnQ+Ci0gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgPFByb3h5VXNlcj5FWEFNUExFXHNhbWluZGE8L1Byb3h5VXNlcj4KLSAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICA8UHJveHlQYXNzd29yZD5wcHA8L1Byb3h5UGFzc3dvcmQ+Ci0gICAgICAgIC8vICAgICAgICAgICAgICA8L0NvbmZpZ3VyYXRpb24+Ci0gICAgICAgIC8vICAgICAgICA8L3BhcmFtZXRlcj4KLSAgICAgICAgQ3JlZGVudGlhbHMgcHJveHlDcmVkID0gbnVsbDsKLQotICAgICAgICAvL0dldHRpbmcgY29uZmlndXJhdGlvbiB2YWx1ZXMgZnJvbSBBeGlzMi54bWwKLSAgICAgICAgUGFyYW1ldGVyIHBhcmFtID0gbWVzc2FnZUNvbnRleHQuZ2V0Q29uZmlndXJhdGlvbkNvbnRleHQoKS5nZXRBeGlzQ29uZmlndXJhdGlvbigpCi0gICAgICAgICAgICAgICAgLmdldFBhcmFtZXRlcihBVFRSX1BST1hZKTsKLQotICAgICAgICBpZiAocGFyYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgT01FbGVtZW50IGNvbmZpZ3VyYXRpb25FbGUgPSBwYXJhbS5nZXRQYXJhbWV0ZXJFbGVtZW50KCkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbkVsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgKLSAgICAgICAgICAgICAgICAgICAgICAgIFByb3h5Q29uZmlndXJhdGlvbi5jbGFzcy5nZXROYW1lKCkgKyAiIENvbmZpZ3VyYXRpb24gZWxlbWVudCBpcyBtaXNzaW5nIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIE9NRWxlbWVudCBwcm94eUhvc3RFbGUgPQotICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uRWxlLmdldEZpcnN0Q2hpbGRXaXRoTmFtZShuZXcgUU5hbWUoUFJPWFlfSE9TVF9FTEVNRU5UKSk7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgcHJveHlQb3J0RWxlID0KLSAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbkVsZS5nZXRGaXJzdENoaWxkV2l0aE5hbWUobmV3IFFOYW1lKFBST1hZX1BPUlRfRUxFTUVOVCkpOwotICAgICAgICAgICAgT01FbGVtZW50IHByb3h5VXNlckVsZSA9Ci0gICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb25FbGUuZ2V0Rmlyc3RDaGlsZFdpdGhOYW1lKG5ldyBRTmFtZShQUk9YWV9VU0VSX0VMRU1FTlQpKTsKLSAgICAgICAgICAgIE9NRWxlbWVudCBwcm94eVBhc3N3b3JkRWxlID0KLSAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbkVsZS5nZXRGaXJzdENoaWxkV2l0aE5hbWUobmV3IFFOYW1lKFBST1hZX1BBU1NXT1JEX0VMRU1FTlQpKTsKLQotICAgICAgICAgICAgaWYgKHByb3h5SG9zdEVsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgKLSAgICAgICAgICAgICAgICAgICAgICAgIFByb3h5Q29uZmlndXJhdGlvbi5jbGFzcy5nZXROYW1lKCkgKyAiIFByb3h5SG9zdCBlbGVtZW50IGlzIG1pc3NpbmciKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFN0cmluZyB0ZXh0ID0gcHJveHlIb3N0RWxlLmdldFRleHQoKTsKLSAgICAgICAgICAgIGlmICh0ZXh0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KAotICAgICAgICAgICAgICAgICAgICAgICAgUHJveHlDb25maWd1cmF0aW9uLmNsYXNzLmdldE5hbWUoKSArICIgUHJveHlIb3N0J3MgdmFsdWUgaXMgbWlzc2luZyIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0aGlzLnNldFByb3h5SG9zdCh0ZXh0KTsKLQotICAgICAgICAgICAgaWYgKHByb3h5UG9ydEVsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5zZXRQcm94eVBvcnQoSW50ZWdlci5wYXJzZUludChwcm94eVBvcnRFbGUuZ2V0VGV4dCgpKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChwcm94eVVzZXJFbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRoaXMuc2V0UHJveHlVc2VyKHByb3h5VXNlckVsZS5nZXRUZXh0KCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocHJveHlQYXNzd29yZEVsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5zZXRQcm94eVBhc3N3b3JkKHByb3h5UGFzc3dvcmRFbGUuZ2V0VGV4dCgpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHRoaXMuZ2V0UHJveHlVc2VyKCkgPT0gbnVsbCAmJiB0aGlzLmdldFByb3h5VXNlcigpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBwcm94eUNyZWQgPSBuZXcgVXNlcm5hbWVQYXNzd29yZENyZWRlbnRpYWxzKCIiLCAiIik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHByb3h5Q3JlZCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgVXNlcm5hbWVQYXNzd29yZENyZWRlbnRpYWxzKHRoaXMuZ2V0UHJveHlVc2VyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0UHJveHlQYXNzd29yZCgpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gaWYgdGhlIHVzZXJuYW1lIGlzIGluIHRoZSBmb3JtICJET01BSU5cXHVzZXIiCi0gICAgICAgICAgICAvLyB0aGVuIHVzZSBOVENyZWRlbnRpYWxzIGluc3RlYWQuCi0gICAgICAgICAgICBpZiAodGhpcy5nZXRQcm94eVVzZXIoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaW50IGRvbWFpbkluZGV4ID0gdGhpcy5nZXRQcm94eVVzZXIoKS5pbmRleE9mKCJcXCIpOwotICAgICAgICAgICAgICAgIGlmIChkb21haW5JbmRleCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGRvbWFpbiA9IHRoaXMuZ2V0UHJveHlVc2VyKCkuc3Vic3RyaW5nKDAsIGRvbWFpbkluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZ2V0UHJveHlVc2VyKCkubGVuZ3RoKCkgPiBkb21haW5JbmRleCArIDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB1c2VyID0gdGhpcy5nZXRQcm94eVVzZXIoKS5zdWJzdHJpbmcoZG9tYWluSW5kZXggKyAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb3h5Q3JlZCA9IG5ldyBOVENyZWRlbnRpYWxzKHVzZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldFByb3h5UGFzc3dvcmQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0UHJveHlIb3N0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb21haW4pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gT3ZlcmlkZSB0aGUgcHJvcGVydHkgc2V0dGluZyBpbiBydW50aW1lLgotICAgICAgICBIdHRwVHJhbnNwb3J0UHJvcGVydGllcy5Qcm94eVByb3BlcnRpZXMgcHJveHlQcm9wZXJ0aWVzID0KLSAgICAgICAgICAgICAgICAoSHR0cFRyYW5zcG9ydFByb3BlcnRpZXMuUHJveHlQcm9wZXJ0aWVzKSBtZXNzYWdlQ29udGV4dAotICAgICAgICAgICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KEhUVFBDb25zdGFudHMuUFJPWFkpOwotCi0gICAgICAgIGlmIChwcm94eVByb3BlcnRpZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIGhvc3QgPSBwcm94eVByb3BlcnRpZXMuZ2V0UHJveHlIb3N0TmFtZSgpOwotICAgICAgICAgICAgaWYgKGhvc3QgPT0gbnVsbCB8fCBob3N0Lmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KFByb3h5Q29uZmlndXJhdGlvbi5jbGFzcy5nZXROYW1lKCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBQcm94eSBob3N0IGlzIG5vdCBhdmFpbGFibGUuIEhvc3QgaXMgYSBNVVNUIHBhcmFtZXRlciIpOwotCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRoaXMuc2V0UHJveHlIb3N0KGhvc3QpOwotICAgICAgICAgICAgfQotCi0KLSAgICAgICAgICAgIHRoaXMuc2V0UHJveHlQb3J0KHByb3h5UHJvcGVydGllcy5nZXRQcm94eVBvcnQoKSk7Ci0KLSAgICAgICAgICAgIC8vU2V0dGluZyBjcmVkZW50aWFscwotCi0gICAgICAgICAgICBTdHJpbmcgdXNlck5hbWUgPSBwcm94eVByb3BlcnRpZXMuZ2V0VXNlck5hbWUoKTsKLSAgICAgICAgICAgIFN0cmluZyBwYXNzd29yZCA9IHByb3h5UHJvcGVydGllcy5nZXRQYXNzV29yZCgpOwotICAgICAgICAgICAgU3RyaW5nIGRvbWFpbiA9IHByb3h5UHJvcGVydGllcy5nZXREb21haW4oKTsKLQotICAgICAgICAgICAgaWYgKHVzZXJOYW1lID09IG51bGwgJiYgcGFzc3dvcmQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHByb3h5Q3JlZCA9IG5ldyBVc2VybmFtZVBhc3N3b3JkQ3JlZGVudGlhbHMoIiIsICIiKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcHJveHlDcmVkID0gbmV3IFVzZXJuYW1lUGFzc3dvcmRDcmVkZW50aWFscyh1c2VyTmFtZSwgcGFzc3dvcmQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAodXNlck5hbWUgIT0gbnVsbCAmJiBwYXNzd29yZCAhPSBudWxsICYmIGRvbWFpbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcHJveHlDcmVkID0gbmV3IE5UQ3JlZGVudGlhbHModXNlck5hbWUsIHBhc3N3b3JkLCBob3N0LCBkb21haW4pOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotICAgICAgICAvL1VzaW5nIEphdmEgTmV0d29ya2luZyBQcm9wZXJ0aWVzCi0KLSAgICAgICAgU3RyaW5nIGhvc3QgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoSFRUUF9QUk9YWV9IT1NUKTsKLSAgICAgICAgaWYgKGhvc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgdGhpcy5zZXRQcm94eUhvc3QoaG9zdCk7Ci0gICAgICAgICAgICBwcm94eUNyZWQgPSBuZXcgVXNlcm5hbWVQYXNzd29yZENyZWRlbnRpYWxzKCIiLCIiKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBwb3J0ID0gU3lzdGVtLmdldFByb3BlcnR5KEhUVFBfUFJPWFlfUE9SVCk7Ci0KLSAgICAgICAgaWYgKHBvcnQgIT0gbnVsbCkgewotICAgICAgICAgICAgdGhpcy5zZXRQcm94eVBvcnQoSW50ZWdlci5wYXJzZUludChwb3J0KSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocHJveHlDcmVkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoUHJveHlDb25maWd1cmF0aW9uLmNsYXNzLmdldE5hbWUoKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIE1pbmltdW0gcHJveHkgY3JlZGVudGlhbHMgYXJlIG5vdCBzZXQiKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaHR0cENsaWVudC5nZXRQYXJhbXMoKS5zZXRBdXRoZW50aWNhdGlvblByZWVtcHRpdmUodHJ1ZSk7Ci0gICAgICAgIGh0dHBDbGllbnQuZ2V0U3RhdGUoKS5zZXRQcm94eUNyZWRlbnRpYWxzKEF1dGhTY29wZS5BTlksIHByb3h5Q3JlZCk7Ci0gICAgICAgIGNvbmZpZy5zZXRQcm94eSh0aGlzLmdldFByb3h5SG9zdCgpLCB0aGlzLmdldFByb3h5UG9ydCgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVjayBmaXJzdCBpZiB0aGUgcHJveHkgaXMgY29uZmlndXJlZCBvciBhY3RpdmUuCi0gICAgICogSWYgeWVzIHRoaXMgd2lsbCByZXR1cm4gdHJ1ZS4gVGhpcyBpcyBub3QgYSBkZWVwIGNoZWNrCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVzc2FnZUNvbnRleHQKLSAgICAgKiBAcmV0dXJuIGJvb2xlYW4KLSAgICAgKi8KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1Byb3h5RW5hYmxlZChNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCwgVVJMIHRhcmdldFVSTCkKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotCi0gICAgICAgIGJvb2xlYW4gc3RhdGUgPSBmYWxzZTsKLQotCi0gICAgICAgIFBhcmFtZXRlciBwYXJhbSA9IG1lc3NhZ2VDb250ZXh0LmdldENvbmZpZ3VyYXRpb25Db250ZXh0KCkuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKQotICAgICAgICAgICAgICAgIC5nZXRQYXJhbWV0ZXIoQVRUUl9QUk9YWSk7Ci0KLSAgICAgICAgLy9JZiBjb25maWd1cmF0aW9uIGlzIG92ZXIgcmlkZGVuCi0gICAgICAgIE9iamVjdCBvYmogPSBtZXNzYWdlQ29udGV4dC5nZXRQcm9wZXJ0eShIVFRQQ29uc3RhbnRzLlBST1hZKTsKLQotICAgICAgICAvL0Zyb20gSmF2YSBOZXR3b3JraW5nIFByb3BlcnRpZXMKLSAgICAgICAgU3RyaW5nIHNwID0gU3lzdGVtLmdldFByb3BlcnR5KEhUVFBfUFJPWFlfSE9TVCk7Ci0KLSAgICAgICAgaWYgKHBhcmFtICE9IG51bGwgfHwgb2JqICE9IG51bGwgfHwgc3AgIT0gbnVsbCkgewotICAgICAgICAgICAgc3RhdGUgPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbGVhbiBpc05vblByb3h5SG9zdCA9IHZhbGlkYXRlTm9uUHJveHlIb3N0cyh0YXJnZXRVUkwuZ2V0SG9zdCgpKTsKLQotICAgICAgICByZXR1cm4gc3RhdGUgJiYgIWlzTm9uUHJveHlIb3N0OwotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogVmFsaWRhdGVzIGZvciBuYW1lcyB0aGF0IHNob3VsZG4ndCBiZSBsaXN0ZXJlZCBhcyBwcm94aWVzLgotICAgICAqIFRoZSBodHRwLm5vblByb3h5SG9zdHMgY2FuIGJlIHNldCB0byBzcGVjaWZ5IHRoZSBob3N0cyB3aGljaCBzaG91bGQgYmUKLSAgICAgKiBjb25uZWN0ZWQgdG8gZGlyZWN0bHkgKG5vdCB0aHJvdWdoIHRoZSBwcm94eSBzZXJ2ZXIpLgotICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgaHR0cC5ub25Qcm94eUhvc3RzIHByb3BlcnR5IGNhbiBiZSBhIGxpc3Qgb2YgaG9zdHMsCi0gICAgICogZWFjaCBzZXBhcmF0ZWQgYnkgYSB8OyBpdCBjYW4gYWxzbyB0YWtlIGEgcmVndWxhciBleHByZXNzaW9uIGZvciBtYXRjaGVzOwotICAgICAqIGZvciBleGFtcGxlOiAqLnNmYmF5LnN1bi5jb20gd291bGQgbWF0Y2ggYW55IGZ1bGx5IHF1YWxpZmllZCBob3N0bmFtZSBpbiB0aGUgc2ZiYXkgZG9tYWluLgotICAgICAqCi0gICAgICogRm9yIG1vcmUgaW5mb3JtYXRpb24gcmVmZXIgdG8gOiBodHRwOi8vamF2YS5zdW4uY29tL2ZlYXR1cmVzLzIwMDIvMTEvaGlsZXZlbF9uZXR3b3JrLmh0bWwKLSAgICAgKgotICAgICAqIGZhbHNlIDogdmFsaWRhdGlvbiBmYWlsIDogVXNlciBjYW4gdXNlIHRoZSBwcm94eQotICAgICAqIHRydWUgOiB2YWxpZGF0aW9uIHBhc3MgOyBVc2VyIGNhbid0IHVzZSB0aGUgcHJveHkKLSAgICAgKgotICAgICAqIEByZXR1cm4gYm9vbGVhbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiB2YWxpZGF0ZU5vblByb3h5SG9zdHMoU3RyaW5nIGhvc3QpIHsKLSAgICAgICAgLy9Gcm9tIHN5c3RlbSBwcm9wZXJ0eSBodHRwLm5vblByb3h5SG9zdHMKLSAgICAgICAgU3RyaW5nIG5vblByb3h5SG9zdHMgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoSFRUUF9OT05fUFJPWFlfSE9TVFMpOwotICAgICAgICByZXR1cm4gaXNIb3N0SW5Ob25Qcm94eUxpc3QoaG9zdCwgbm9uUHJveHlIb3N0cyk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENoZWNrIGlmIHRoZSBzcGVjaWZpZWQgaG9zdCBpcyBpbiB0aGUgbGlzdCBvZiBub24gcHJveHkgaG9zdHMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaG9zdCBob3N0IG5hbWUKLSAgICAgKiBAcGFyYW0gbm9uUHJveHlIb3N0cyBzdHJpbmcgY29udGFpbmluZyB0aGUgbGlzdCBvZiBub24gcHJveHkgaG9zdHMKLSAgICAgKgotICAgICAqIEByZXR1cm4gdHJ1ZS9mYWxzZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0hvc3RJbk5vblByb3h5TGlzdChTdHJpbmcgaG9zdCwgU3RyaW5nIG5vblByb3h5SG9zdHMpIHsKLSAgICAgICAgaWYgKChub25Qcm94eUhvc3RzID09IG51bGwpIHx8IChob3N0ID09IG51bGwpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiBUaGUgaHR0cC5ub25Qcm94eUhvc3RzIHN5c3RlbSBwcm9wZXJ0eSBpcyBhIGxpc3QgZW5jbG9zZWQgaW4KLSAgICAgICAgICogZG91YmxlIHF1b3RlcyB3aXRoIGl0ZW1zIHNlcGFyYXRlZCBieSBhIHZlcnRpY2FsIGJhci4KLSAgICAgICAgICovCi0gICAgICAgIFN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKG5vblByb3h5SG9zdHMsICJ8XCIiKTsKLQotICAgICAgICB3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotICAgICAgICAgICAgU3RyaW5nIHBhdHRlcm4gPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7Ci0gICAgICAgICAgICBpZiAobWF0Y2gocGF0dGVybiwgaG9zdCwgZmFsc2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1hdGNoZXMgYSBzdHJpbmcgYWdhaW5zdCBhIHBhdHRlcm4uIFRoZSBwYXR0ZXJuIGNvbnRhaW5zIHR3byBzcGVjaWFsCi0gICAgICogY2hhcmFjdGVyczoKLSAgICAgKiAnKicgd2hpY2ggbWVhbnMgemVybyBvciBtb3JlIGNoYXJhY3RlcnMsCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGF0dGVybiB0aGUgKG5vbi1udWxsKSBwYXR0ZXJuIHRvIG1hdGNoIGFnYWluc3QKLSAgICAgKiBAcGFyYW0gc3RyICAgICB0aGUgKG5vbi1udWxsKSBzdHJpbmcgdGhhdCBtdXN0IGJlIG1hdGNoZWQgYWdhaW5zdCB0aGUKLSAgICAgKiAgICAgICAgICAgICAgICBwYXR0ZXJuCi0gICAgICogQHBhcmFtIGlzQ2FzZVNlbnNpdGl2ZQotICAgICAqCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiB3aGVuIHRoZSBzdHJpbmcgbWF0Y2hlcyBhZ2FpbnN0IHRoZSBwYXR0ZXJuLAotICAgICAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gbWF0Y2goU3RyaW5nIHBhdHRlcm4sIFN0cmluZyBzdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNDYXNlU2Vuc2l0aXZlKSB7Ci0KLSAgICAgICAgY2hhcltdIHBhdEFyciA9IHBhdHRlcm4udG9DaGFyQXJyYXkoKTsKLSAgICAgICAgY2hhcltdIHN0ckFyciA9IHN0ci50b0NoYXJBcnJheSgpOwotICAgICAgICBpbnQgcGF0SWR4U3RhcnQgPSAwOwotICAgICAgICBpbnQgcGF0SWR4RW5kID0gcGF0QXJyLmxlbmd0aCAtIDE7Ci0gICAgICAgIGludCBzdHJJZHhTdGFydCA9IDA7Ci0gICAgICAgIGludCBzdHJJZHhFbmQgPSBzdHJBcnIubGVuZ3RoIC0gMTsKLSAgICAgICAgY2hhciBjaDsKLSAgICAgICAgYm9vbGVhbiBjb250YWluc1N0YXIgPSBmYWxzZTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhdEFyci5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKHBhdEFycltpXSA9PSAnKicpIHsKLSAgICAgICAgICAgICAgICBjb250YWluc1N0YXIgPSB0cnVlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICghY29udGFpbnNTdGFyKSB7Ci0KLSAgICAgICAgICAgIC8vIE5vICcqJ3MsIHNvIHdlIG1ha2UgYSBzaG9ydGN1dAotICAgICAgICAgICAgaWYgKHBhdElkeEVuZCAhPSBzdHJJZHhFbmQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7ICAgICAgICAvLyBQYXR0ZXJuIGFuZCBzdHJpbmcgZG8gbm90IGhhdmUgdGhlIHNhbWUgc2l6ZQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPD0gcGF0SWR4RW5kOyBpKyspIHsKLSAgICAgICAgICAgICAgICBjaCA9IHBhdEFycltpXTsKLSAgICAgICAgICAgICAgICBpZiAoaXNDYXNlU2Vuc2l0aXZlICYmIChjaCAhPSBzdHJBcnJbaV0pKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgICAgLy8gQ2hhcmFjdGVyIG1pc21hdGNoCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICghaXNDYXNlU2Vuc2l0aXZlCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAoQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKGNoKQotICAgICAgICAgICAgICAgICAgICAgICAgIT0gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKHN0ckFycltpXSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgICAgLy8gQ2hhcmFjdGVyIG1pc21hdGNoCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRydWU7ICAgICAgICAgICAgIC8vIFN0cmluZyBtYXRjaGVzIGFnYWluc3QgcGF0dGVybgotICAgICAgICB9Ci0gICAgICAgIGlmIChwYXRJZHhFbmQgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7ICAgIC8vIFBhdHRlcm4gY29udGFpbnMgb25seSAnKicsIHdoaWNoIG1hdGNoZXMgYW55dGhpbmcKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFByb2Nlc3MgY2hhcmFjdGVycyBiZWZvcmUgZmlyc3Qgc3RhcgotICAgICAgICB3aGlsZSAoKGNoID0gcGF0QXJyW3BhdElkeFN0YXJ0XSkgIT0gJyonCi0gICAgICAgICAgICAgICAgJiYgKHN0cklkeFN0YXJ0IDw9IHN0cklkeEVuZCkpIHsKLSAgICAgICAgICAgIGlmIChpc0Nhc2VTZW5zaXRpdmUgJiYgKGNoICE9IHN0ckFycltzdHJJZHhTdGFydF0pKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAgICAvLyBDaGFyYWN0ZXIgbWlzbWF0Y2gKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghaXNDYXNlU2Vuc2l0aXZlCi0gICAgICAgICAgICAgICAgICAgICYmIChDaGFyYWN0ZXIudG9VcHBlckNhc2UoY2gpCi0gICAgICAgICAgICAgICAgICAgICE9IENoYXJhY3Rlci50b1VwcGVyQ2FzZShzdHJBcnJbc3RySWR4U3RhcnRdKSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7ICAgIC8vIENoYXJhY3RlciBtaXNtYXRjaAotICAgICAgICAgICAgfQotICAgICAgICAgICAgcGF0SWR4U3RhcnQrKzsKLSAgICAgICAgICAgIHN0cklkeFN0YXJ0Kys7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHN0cklkeFN0YXJ0ID4gc3RySWR4RW5kKSB7Ci0KLSAgICAgICAgICAgIC8vIEFsbCBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgYXJlIHVzZWQuIENoZWNrIGlmIG9ubHkgJyoncyBhcmUKLSAgICAgICAgICAgIC8vIGxlZnQgaW4gdGhlIHBhdHRlcm4uIElmIHNvLCB3ZSBzdWNjZWVkZWQuIE90aGVyd2lzZSBmYWlsdXJlLgotICAgICAgICAgICAgZm9yIChpbnQgaSA9IHBhdElkeFN0YXJ0OyBpIDw9IHBhdElkeEVuZDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBhdEFycltpXSAhPSAnKicpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gUHJvY2VzcyBjaGFyYWN0ZXJzIGFmdGVyIGxhc3Qgc3RhcgotICAgICAgICB3aGlsZSAoKGNoID0gcGF0QXJyW3BhdElkeEVuZF0pICE9ICcqJyAmJiAoc3RySWR4U3RhcnQgPD0gc3RySWR4RW5kKSkgewotICAgICAgICAgICAgaWYgKGlzQ2FzZVNlbnNpdGl2ZSAmJiAoY2ggIT0gc3RyQXJyW3N0cklkeEVuZF0pKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAgICAvLyBDaGFyYWN0ZXIgbWlzbWF0Y2gKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghaXNDYXNlU2Vuc2l0aXZlCi0gICAgICAgICAgICAgICAgICAgICYmIChDaGFyYWN0ZXIudG9VcHBlckNhc2UoY2gpCi0gICAgICAgICAgICAgICAgICAgICE9IENoYXJhY3Rlci50b1VwcGVyQ2FzZShzdHJBcnJbc3RySWR4RW5kXSkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAgICAvLyBDaGFyYWN0ZXIgbWlzbWF0Y2gKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBhdElkeEVuZC0tOwotICAgICAgICAgICAgc3RySWR4RW5kLS07Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHN0cklkeFN0YXJ0ID4gc3RySWR4RW5kKSB7Ci0KLSAgICAgICAgICAgIC8vIEFsbCBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgYXJlIHVzZWQuIENoZWNrIGlmIG9ubHkgJyoncyBhcmUKLSAgICAgICAgICAgIC8vIGxlZnQgaW4gdGhlIHBhdHRlcm4uIElmIHNvLCB3ZSBzdWNjZWVkZWQuIE90aGVyd2lzZSBmYWlsdXJlLgotICAgICAgICAgICAgZm9yIChpbnQgaSA9IHBhdElkeFN0YXJ0OyBpIDw9IHBhdElkeEVuZDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBhdEFycltpXSAhPSAnKicpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gcHJvY2VzcyBwYXR0ZXJuIGJldHdlZW4gc3RhcnMuIHBhZElkeFN0YXJ0IGFuZCBwYXRJZHhFbmQgcG9pbnQKLSAgICAgICAgLy8gYWx3YXlzIHRvIGEgJyonLgotICAgICAgICB3aGlsZSAoKHBhdElkeFN0YXJ0ICE9IHBhdElkeEVuZCkgJiYgKHN0cklkeFN0YXJ0IDw9IHN0cklkeEVuZCkpIHsKLSAgICAgICAgICAgIGludCBwYXRJZHhUbXAgPSAtMTsKLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IHBhdElkeFN0YXJ0ICsgMTsgaSA8PSBwYXRJZHhFbmQ7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChwYXRBcnJbaV0gPT0gJyonKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhdElkeFRtcCA9IGk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwYXRJZHhUbXAgPT0gcGF0SWR4U3RhcnQgKyAxKSB7Ci0KLSAgICAgICAgICAgICAgICAvLyBUd28gc3RhcnMgbmV4dCB0byBlYWNoIG90aGVyLCBza2lwIHRoZSBmaXJzdCBvbmUuCi0gICAgICAgICAgICAgICAgcGF0SWR4U3RhcnQrKzsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gRmluZCB0aGUgcGF0dGVybiBiZXR3ZWVuIHBhZElkeFN0YXJ0ICYgcGFkSWR4VG1wIGluIHN0ciBiZXR3ZWVuCi0gICAgICAgICAgICAvLyBzdHJJZHhTdGFydCAmIHN0cklkeEVuZAotICAgICAgICAgICAgaW50IHBhdExlbmd0aCA9IChwYXRJZHhUbXAgLSBwYXRJZHhTdGFydCAtIDEpOwotICAgICAgICAgICAgaW50IHN0ckxlbmd0aCA9IChzdHJJZHhFbmQgLSBzdHJJZHhTdGFydCArIDEpOwotICAgICAgICAgICAgaW50IGZvdW5kSWR4ID0gLTE7Ci0KLSAgICAgICAgICAgIHN0ckxvb3A6Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8PSBzdHJMZW5ndGggLSBwYXRMZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgcGF0TGVuZ3RoOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgY2ggPSBwYXRBcnJbcGF0SWR4U3RhcnQgKyBqICsgMV07Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpc0Nhc2VTZW5zaXRpdmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoY2ggIT0gc3RyQXJyW3N0cklkeFN0YXJ0ICsgaSArIGpdKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUgc3RyTG9vcDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoIWlzQ2FzZVNlbnNpdGl2ZSAmJiAoQ2hhcmFjdGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRvVXBwZXJDYXNlKGNoKSAhPSBDaGFyYWN0ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAudG9VcHBlckNhc2Uoc3RyQXJyW3N0cklkeFN0YXJ0ICsgaSArIGpdKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIHN0ckxvb3A7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZm91bmRJZHggPSBzdHJJZHhTdGFydCArIGk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZm91bmRJZHggPT0gLTEpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwYXRJZHhTdGFydCA9IHBhdElkeFRtcDsKLSAgICAgICAgICAgIHN0cklkeFN0YXJ0ID0gZm91bmRJZHggKyBwYXRMZW5ndGg7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBBbGwgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIGFyZSB1c2VkLiBDaGVjayBpZiBvbmx5ICcqJ3MgYXJlIGxlZnQKLSAgICAgICAgLy8gaW4gdGhlIHBhdHRlcm4uIElmIHNvLCB3ZSBzdWNjZWVkZWQuIE90aGVyd2lzZSBmYWlsdXJlLgotICAgICAgICBmb3IgKGludCBpID0gcGF0SWR4U3RhcnQ7IGkgPD0gcGF0SWR4RW5kOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChwYXRBcnJbaV0gIT0gJyonKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXRydW4gcHJveHkgaG9zdAotICAgICAqCi0gICAgICogQHJldHVybiBTdHJpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb3h5SG9zdCgpIHsKLSAgICAgICAgcmV0dXJuIHByb3h5SG9zdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBzZXQgcHJveHkgaG9zdAotICAgICAqCi0gICAgICogQHBhcmFtIHByb3h5SG9zdAotICAgICAqLwotCi0gICAgcHVibGljIHZvaWQgc2V0UHJveHlIb3N0KFN0cmluZyBwcm94eUhvc3QpIHsKLSAgICAgICAgdGhpcy5wcm94eUhvc3QgPSBwcm94eUhvc3Q7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogcmV0cnVuIHByb3h5IHBvcnQKLSAgICAgKgotICAgICAqIEByZXR1cm4gU3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRQcm94eVBvcnQoKSB7Ci0gICAgICAgIHJldHVybiBwcm94eVBvcnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogc2V0IHByb3h5IHBvcnQKLSAgICAgKgotICAgICAqIEBwYXJhbSBwcm94eVBvcnQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm94eVBvcnQoaW50IHByb3h5UG9ydCkgewotICAgICAgICB0aGlzLnByb3h5UG9ydCA9IHByb3h5UG9ydDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiByZXR1cm4gcHJveHkgdXNlci4gUHJveHkgdXNlciBjYW4gYmUgdXNlci9kb21haW4gb3IgdXNlcgotICAgICAqCi0gICAgICogQHJldHVybiBTdHJpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb3h5VXNlcigpIHsKLSAgICAgICAgcmV0dXJuIHByb3h5VXNlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBnZXQgcHJveHkgdXNlcgotICAgICAqCi0gICAgICogQHBhcmFtIHByb3h5VXNlcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFByb3h5VXNlcihTdHJpbmcgcHJveHlVc2VyKSB7Ci0gICAgICAgIHRoaXMucHJveHlVc2VyID0gcHJveHlVc2VyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHNldCBwYXNzd29yZAotICAgICAqCi0gICAgICogQHJldHVybiBTdHJpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb3h5UGFzc3dvcmQoKSB7Ci0gICAgICAgIHJldHVybiBwcm94eVBhc3N3b3JkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGdldCBwYXNzd29yZAotICAgICAqCi0gICAgICogQHBhcmFtIHByb3h5UGFzc3dvcmQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm94eVBhc3N3b3JkKFN0cmluZyBwcm94eVBhc3N3b3JkKSB7Ci0gICAgICAgIHRoaXMucHJveHlQYXNzd29yZCA9IHByb3h5UGFzc3dvcmQ7Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3RyYW5zcG9ydC9odHRwL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL1JFU1RSZXF1ZXN0RW50aXR5LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy90cmFuc3BvcnQvaHR0cC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9SRVNUUmVxdWVzdEVudGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2EwNTg4Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3RyYW5zcG9ydC9odHRwL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL1JFU1RSZXF1ZXN0RW50aXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU91dHB1dEZvcm1hdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQubWV0aG9kcy5SZXF1ZXN0RW50aXR5OwotCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5GYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci0KLXB1YmxpYyBjbGFzcyBSRVNUUmVxdWVzdEVudGl0eSBpbXBsZW1lbnRzIFJlcXVlc3RFbnRpdHkgewotICAgIHByaXZhdGUgYnl0ZVtdIGJ5dGVzOwotICAgIHByaXZhdGUgU3RyaW5nIGNoYXJTZXRFbmM7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGNodW5rZWQ7Ci0gICAgcHJpdmF0ZSBPTUVsZW1lbnQgZWxlbWVudDsKLSAgICBwcml2YXRlIE1lc3NhZ2VDb250ZXh0IG1zZ0N0eHQ7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgc29hcEFjdGlvblN0cmluZzsKLSAgICBwcml2YXRlIE9NT3V0cHV0Rm9ybWF0IGZvcm1hdDsKLQotICAgIHB1YmxpYyBSRVNUUmVxdWVzdEVudGl0eShPTUVsZW1lbnQgZWxlbWVudCwgYm9vbGVhbiBjaHVua2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlQ29udGV4dCBtc2dDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY2hhclNldEVuY29kaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc29hcEFjdGlvblN0cmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01PdXRwdXRGb3JtYXQgZm9ybWF0KSB7Ci0gICAgICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0gICAgICAgIHRoaXMuY2h1bmtlZCA9IGNodW5rZWQ7Ci0gICAgICAgIHRoaXMubXNnQ3R4dCA9IG1zZ0N0eHQ7Ci0gICAgICAgIHRoaXMuY2hhclNldEVuYyA9IGNoYXJTZXRFbmNvZGluZzsKLSAgICAgICAgdGhpcy5zb2FwQWN0aW9uU3RyaW5nID0gc29hcEFjdGlvblN0cmluZzsKLSAgICAgICAgdGhpcy5mb3JtYXQgPSBmb3JtYXQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZU9NT3V0cHV0KE91dHB1dFN0cmVhbSBvdXQsIGJvb2xlYW4gZG9pbmdNVE9NKQotICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIGZvcm1hdC5zZXREb09wdGltaXplKGRvaW5nTVRPTSk7Ci0gICAgICAgIGVsZW1lbnQuc2VyaWFsaXplQW5kQ29uc3VtZShvdXQsIGZvcm1hdCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJ5dGVbXSB3cml0ZUJ5dGVzKCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYnl0ZXNPdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICBpZiAoIWZvcm1hdC5pc09wdGltaXplZCgpKSB7Ci0gICAgICAgICAgICAgICAgT01PdXRwdXRGb3JtYXQgZm9ybWF0MiA9IG5ldyBPTU91dHB1dEZvcm1hdCgpOwotICAgICAgICAgICAgICAgIGZvcm1hdDIuc2V0Q2hhclNldEVuY29kaW5nKGNoYXJTZXRFbmMpOwotICAgICAgICAgICAgICAgIGVsZW1lbnQuc2VyaWFsaXplQW5kQ29uc3VtZShieXRlc091dCwgZm9ybWF0Mik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGJ5dGVzT3V0LnRvQnl0ZUFycmF5KCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZvcm1hdC5zZXRDaGFyU2V0RW5jb2RpbmcoY2hhclNldEVuYyk7Ci0gICAgICAgICAgICAgICAgZm9ybWF0LnNldERvT3B0aW1pemUodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgZWxlbWVudC5zZXJpYWxpemVBbmRDb25zdW1lKGJ5dGVzT3V0LCBmb3JtYXQpOwotICAgICAgICAgICAgICAgIHJldHVybiBieXRlc091dC50b0J5dGVBcnJheSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKTsKLSAgICAgICAgfSBjYXRjaCAoRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvciBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBBeGlzRmF1bHQubWFrZUZhdWx0KGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGVSZXF1ZXN0KE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoY2h1bmtlZCkgewotICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlT01PdXRwdXQob3V0LCBmb3JtYXQuaXNEb2luZ1NXQSgpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGJ5dGVzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYnl0ZXMgPSB3cml0ZUJ5dGVzKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG91dC53cml0ZShieXRlcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvdXQuZmx1c2goKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEF4aXNGYXVsdC5tYWtlRmF1bHQoZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3IgZSkgewotICAgICAgICAgICAgdGhyb3cgQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBsb25nIGdldENvbnRlbnRMZW5ndGgoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoY2h1bmtlZCkgewotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGJ5dGVzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYnl0ZXMgPSB3cml0ZUJ5dGVzKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBieXRlcy5sZW5ndGg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRUeXBlKCkgewotICAgICAgICBTdHJpbmcgZW5jb2RpbmcgPSBmb3JtYXQuZ2V0Q2hhclNldEVuY29kaW5nKCk7Ci0gICAgICAgIFN0cmluZyBjb250ZW50VHlwZSA9IGZvcm1hdC5nZXRDb250ZW50VHlwZSgpOwotICAgICAgICBpZiAoZW5jb2RpbmcgIT0gbnVsbCkgewotICAgICAgICAgICAgY29udGVudFR5cGUgKz0gIjsgY2hhcnNldD0iICsgZW5jb2Rpbmc7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBhY3Rpb24gaGVhZGVyIGlzIG5vdCBtYW5kYXRlZCBpbiBTT0FQIDEuMi4gU28gcHV0dGluZyBpdCwgaWYgYXZhaWxhYmxlCi0gICAgICAgIGlmICghbXNnQ3R4dC5pc1NPQVAxMSgpICYmIChzb2FwQWN0aW9uU3RyaW5nICE9IG51bGwpCi0gICAgICAgICAgICAgICAgJiYgISIiLmVxdWFscyhzb2FwQWN0aW9uU3RyaW5nLnRyaW0oKSkgJiYgISJcIlwiIi5lcXVhbHMoc29hcEFjdGlvblN0cmluZy50cmltKCkpKSB7Ci0gICAgICAgICAgICBjb250ZW50VHlwZSA9IGNvbnRlbnRUeXBlICsgIjthY3Rpb249XCIiICsgc29hcEFjdGlvblN0cmluZyArICJcIjsiOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjb250ZW50VHlwZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1JlcGVhdGFibGUoKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3RyYW5zcG9ydC9odHRwL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL1JFU1RSZXF1ZXN0RW50aXR5Mi5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvdHJhbnNwb3J0L2h0dHAvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvUkVTVFJlcXVlc3RFbnRpdHkyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxYTNjNmUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvdHJhbnNwb3J0L2h0dHAvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvUkVTVFJlcXVlc3RFbnRpdHkyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5tZXRob2RzLlJlcXVlc3RFbnRpdHk7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotCi1wdWJsaWMgY2xhc3MgUkVTVFJlcXVlc3RFbnRpdHkyIGltcGxlbWVudHMgUmVxdWVzdEVudGl0eSB7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgY29udGVudFR5cGU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgcG9zdFJlcXVlc3RCb2R5OwotCi0gICAgcHVibGljIFJFU1RSZXF1ZXN0RW50aXR5MihTdHJpbmcgcG9zdFJlcXVlc3RCb2R5LCBTdHJpbmcgY29udGVudFR5cGUpIHsKLSAgICAgICAgdGhpcy5wb3N0UmVxdWVzdEJvZHkgPSBwb3N0UmVxdWVzdEJvZHk7Ci0gICAgICAgIHRoaXMuY29udGVudFR5cGUgPSBjb250ZW50VHlwZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZVJlcXVlc3QoT3V0cHV0U3RyZWFtIG91dHB1dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgb3V0cHV0LndyaXRlKHBvc3RSZXF1ZXN0Qm9keS5nZXRCeXRlcygpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgbG9uZyBnZXRDb250ZW50TGVuZ3RoKCkgewotICAgICAgICByZXR1cm4gdGhpcy5wb3N0UmVxdWVzdEJvZHkuZ2V0Qnl0ZXMoKS5sZW5ndGg7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRDb250ZW50VHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuY29udGVudFR5cGU7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNSZXBlYXRhYmxlKCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy90cmFuc3BvcnQvaHR0cC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9TZXJ2bGV0QmFzZWRPdXRUcmFuc3BvcnRJbmZvLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy90cmFuc3BvcnQvaHR0cC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9TZXJ2bGV0QmFzZWRPdXRUcmFuc3BvcnRJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViOTE5NWYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvdHJhbnNwb3J0L2h0dHAvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvU2VydmxldEJhc2VkT3V0VHJhbnNwb3J0SW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5PdXRUcmFuc3BvcnRJbmZvOwotCi1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7Ci0KLXB1YmxpYyBjbGFzcyBTZXJ2bGV0QmFzZWRPdXRUcmFuc3BvcnRJbmZvIGltcGxlbWVudHMgT3V0VHJhbnNwb3J0SW5mbyB7Ci0gICAgcHJpdmF0ZSBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlOwotCi0gICAgcHVibGljIFNlcnZsZXRCYXNlZE91dFRyYW5zcG9ydEluZm8oSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgewotICAgICAgICB0aGlzLnJlc3BvbnNlID0gcmVzcG9uc2U7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q29udGVudFR5cGUoU3RyaW5nIGNvbnRlbnRUeXBlKSB7Ci0gICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKGNvbnRlbnRUeXBlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRIZWFkZXIoU3RyaW5nIGhlYWRlck5hbWUsIFN0cmluZyBoZWFkZXJWYWx1ZSkgewotICAgICAgICByZXNwb25zZS5hZGRIZWFkZXIoaGVhZGVyTmFtZSwgaGVhZGVyVmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFN0YXR1cyhpbnQgc3RhdHVzKSB7Ci0gICAgICAgIHJlc3BvbnNlLnNldFN0YXR1cyhzdGF0dXMpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3RyYW5zcG9ydC9odHRwL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL1NpbXBsZUhUVFBTZXJ2ZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3RyYW5zcG9ydC9odHRwL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL1NpbXBsZUhUVFBTZXJ2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY5ODcyZC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy90cmFuc3BvcnQvaHR0cC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9TaW1wbGVIVFRQU2VydmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5TZXNzaW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlRyYW5zcG9ydEluRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuTGlzdGVuZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0LlRyYW5zcG9ydExpc3RlbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuc2VydmVyLkh0dHBGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuc2VydmVyLkh0dHBVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLnNlcnZlci5TZXNzaW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLnNlcnZlci5TaW1wbGVIdHRwU2VydmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5PcHRpb25zUGFyc2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuU29ja2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotLyoqCi0gKiBUaGlzIGlzIGEgc2ltcGxlIGltcGxlbWVudGF0aW9uIG9mIGFuIEhUVFAgc2VydmVyIGZvciBwcm9jZXNzaW5nCi0gKiBTT0FQIHJlcXVlc3RzIHZpYSBBcGFjaGUncyB4bWwtYXhpczIuCi0gKiBJdCBjYW4gYmUgdXNlZCB3aXRoIG5vIGNvbmZpZ3VyYXRpb24gb3RoZXIgdGhhbiB0aGUgcG9ydCB0byBsaXN0ZW4gb24sIG9yIGl0IGNhbgotICogYmUgY29uZmlndXJlZCBpbiBkZXRhaWwgd2l0aCBhbiBIdHRwRmFjdG9yeS4KLSAqLwotcHVibGljIGNsYXNzIFNpbXBsZUhUVFBTZXJ2ZXIgaW1wbGVtZW50cyBUcmFuc3BvcnRMaXN0ZW5lciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coU2ltcGxlSFRUUFNlcnZlci5jbGFzcyk7Ci0KLSAgICAvKioKLSAgICAgKiBFbWJlZGRlZCBjb21tb25zIGh0dHAgY29yZSBiYXNlZCBzZXJ2ZXIKLSAgICAgKi8KLSAgICBTaW1wbGVIdHRwU2VydmVyIGVtYmVkZGVkID0gbnVsbDsKLSAgICBwcml2YXRlIFN0cmluZyBsb2NhbEFkZHJlc3M7Ci0gICAgaW50IHBvcnQgPSAtMTsKLQotICAgIHB1YmxpYyBzdGF0aWMgaW50IERFRkFVTFRfUE9SVCA9IDgwODA7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBob3N0QWRkcmVzcyA9IG51bGw7Ci0KLSAgICBwcm90ZWN0ZWQgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlndXJhdGlvbkNvbnRleHQ7Ci0gICAgcHJvdGVjdGVkIEh0dHBGYWN0b3J5IGh0dHBGYWN0b3J5OwotICAgIHByaXZhdGUgU2Vzc2lvbk1hbmFnZXIgc2Vzc2lvbk1hbmFnZXI7Ci0KLSAgICBwdWJsaWMgU2ltcGxlSFRUUFNlcnZlcigpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBTaW1wbGVIVFRQU2VydmVyIHVzaW5nIGRlZmF1bHQgSHR0cEZhY3Rvcnkgc2V0dGluZ3MKLSAgICAgKi8KLSAgICBwdWJsaWMgU2ltcGxlSFRUUFNlcnZlcihDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWd1cmF0aW9uQ29udGV4dCwgaW50IHBvcnQpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICB0aGlzKG5ldyBIdHRwRmFjdG9yeShjb25maWd1cmF0aW9uQ29udGV4dCwgcG9ydCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIGNvbmZpZ3VyZWQgU2ltcGxlSFRUUFNlcnZlcgotICAgICAqLwotICAgIHB1YmxpYyBTaW1wbGVIVFRQU2VydmVyKEh0dHBGYWN0b3J5IGh0dHBGYWN0b3J5KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgdGhpcy5odHRwRmFjdG9yeSA9IGh0dHBGYWN0b3J5OwotICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb25Db250ZXh0ID0gaHR0cEZhY3RvcnkuZ2V0Q29uZmlndXJhdGlvbkNvbnRleHQoKTsKLSAgICAgICAgdGhpcy5wb3J0ID0gaHR0cEZhY3RvcnkuZ2V0UG9ydCgpOwotICAgICAgICBUcmFuc3BvcnRJbkRlc2NyaXB0aW9uIGh0dHBEZXNjcmlwdGlvbiA9Ci0gICAgICAgICAgICAgICAgbmV3IFRyYW5zcG9ydEluRGVzY3JpcHRpb24oQ29uc3RhbnRzLlRSQU5TUE9SVF9IVFRQKTsKLSAgICAgICAgaHR0cERlc2NyaXB0aW9uLnNldFJlY2VpdmVyKHRoaXMpOwotICAgICAgICBodHRwRmFjdG9yeS5nZXRMaXN0ZW5lck1hbmFnZXIoKS5hZGRMaXN0ZW5lcihodHRwRGVzY3JpcHRpb24sIHRydWUpOwotICAgICAgICBzZXNzaW9uTWFuYWdlciA9IG5ldyBTZXNzaW9uTWFuYWdlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGluaXQgbWV0aG9kIGluIFRyYW5zcG9ydExpc3RlbmVyCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYXhpc0NvbmYKLSAgICAgKiBAcGFyYW0gdHJhbnNwcnRJbgotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW5pdChDb25maWd1cmF0aW9uQ29udGV4dCBheGlzQ29uZiwgVHJhbnNwb3J0SW5EZXNjcmlwdGlvbiB0cmFuc3BydEluKQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb25Db250ZXh0ID0gYXhpc0NvbmY7Ci0KLSAgICAgICAgICAgIFBhcmFtZXRlciBwYXJhbSA9IHRyYW5zcHJ0SW4uZ2V0UGFyYW1ldGVyKFBBUkFNX1BPUlQpOwotICAgICAgICAgICAgaWYgKHBhcmFtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aGlzLnBvcnQgPSBJbnRlZ2VyLnBhcnNlSW50KChTdHJpbmcpIHBhcmFtLmdldFZhbHVlKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoaHR0cEZhY3RvcnkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGh0dHBGYWN0b3J5ID0gbmV3IEh0dHBGYWN0b3J5KGNvbmZpZ3VyYXRpb25Db250ZXh0LCBwb3J0KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcGFyYW0gPSB0cmFuc3BydEluLmdldFBhcmFtZXRlcihIT1NUX0FERFJFU1MpOwotICAgICAgICAgICAgaWYgKHBhcmFtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBob3N0QWRkcmVzcyA9ICgoU3RyaW5nKSBwYXJhbS5nZXRWYWx1ZSgpKS50cmltKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGhvc3RBZGRyZXNzID0gaHR0cEZhY3RvcnkuZ2V0SG9zdEFkZHJlc3MoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUxKSB7Ci0gICAgICAgICAgICB0aHJvdyBBeGlzRmF1bHQubWFrZUZhdWx0KGUxKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ldGhvZCBtYWluCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYXJncwotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGludCBwb3J0ID0gREVGQVVMVF9QT1JUOwotICAgICAgICBPcHRpb25zUGFyc2VyIG9wdGlvbnNQYXJzZXIgPSBuZXcgT3B0aW9uc1BhcnNlcihhcmdzKTsKLQotICAgICAgICBhcmdzID0gb3B0aW9uc1BhcnNlci5nZXRSZW1haW5pbmdBcmdzKCk7Ci0gICAgICAgIC8vIGZpcnN0IGNoZWNrIGlmIHdlIHNob3VsZCBwcmludCB1c2FnZQotICAgICAgICBpZiAoKG9wdGlvbnNQYXJzZXIuaXNGbGFnU2V0KCc/JykgPiAwKSB8fCAob3B0aW9uc1BhcnNlci5pc0ZsYWdTZXQoJ2gnKSA+IDApIHx8Ci0gICAgICAgICAgICBhcmdzID09IG51bGwgfHwgYXJncy5sZW5ndGggPT0gMCB8fCBhcmdzLmxlbmd0aCA+IDMpIHsKLSAgICAgICAgICAgIHByaW50VXNhZ2UoKTsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgcGFyYW1Qb3J0ID0gb3B0aW9uc1BhcnNlci5pc1ZhbHVlU2V0KCdwJyk7Ci0gICAgICAgIGlmIChwYXJhbVBvcnQgIT0gbnVsbCkgewotICAgICAgICAgICAgcG9ydCA9IEludGVnZXIucGFyc2VJbnQocGFyYW1Qb3J0KTsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gc3RhcnRBbGxUcmFuc3BvcnRzID0gImFsbCIuZXF1YWxzKG9wdGlvbnNQYXJzZXIuaXNWYWx1ZVNldCgndCcpKTsKLSAgICAgICAgU3RyaW5nIHJlcG9zaXRvcnkgPSBvcHRpb25zUGFyc2VyLmlzVmFsdWVTZXQoJ3InKTsKLSAgICAgICAgaWYgKHJlcG9zaXRvcnkgPT0gbnVsbCkgewotICAgICAgICAgICAgYXJncyA9IG9wdGlvbnNQYXJzZXIuZ2V0UmVtYWluaW5nQXJncygpOwotICAgICAgICAgICAgaWYgKGFyZ3MgIT0gbnVsbCAmJiBhcmdzWzBdICE9IG51bGwgJiYgIWFyZ3NbMF0uZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgIHJlcG9zaXRvcnkgPSBhcmdzWzBdOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwcmludFVzYWdlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIltTaW1wbGVIVFRQU2VydmVyXSBTdGFydGluZyIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIltTaW1wbGVIVFRQU2VydmVyXSBVc2luZyB0aGUgQXhpczIgUmVwb3NpdG9yeSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICArIG5ldyBGaWxlKHJlcG9zaXRvcnkpLmdldEFic29sdXRlUGF0aCgpKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJbU2ltcGxlSFRUUFNlcnZlcl0gTGlzdGVuaW5nIG9uIHBvcnQgIiArIHBvcnQpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnY3R4ID0gQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5Ci0gICAgICAgICAgICAgICAgICAgIC5jcmVhdGVDb25maWd1cmF0aW9uQ29udGV4dEZyb21GaWxlU3lzdGVtKHJlcG9zaXRvcnksIG51bGwpOwotICAgICAgICAgICAgU2ltcGxlSFRUUFNlcnZlciByZWNlaXZlciA9IG5ldyBTaW1wbGVIVFRQU2VydmVyKGNvbmZpZ2N0eCwgcG9ydCk7Ci0gICAgICAgICAgICBSdW50aW1lLmdldFJ1bnRpbWUoKS5hZGRTaHV0ZG93bkhvb2sobmV3IFNodXRkb3duVGhyZWFkKHJlY2VpdmVyKSk7Ci0gICAgICAgICAgICByZWNlaXZlci5zdGFydCgpOwotICAgICAgICAgICAgVHJhbnNwb3J0SW5EZXNjcmlwdGlvbiB0cnNJbiA9IG5ldyBUcmFuc3BvcnRJbkRlc2NyaXB0aW9uKENvbnN0YW50cy5UUkFOU1BPUlRfSFRUUCk7Ci0gICAgICAgICAgICB0cnNJbi5zZXRSZWNlaXZlcihyZWNlaXZlcik7Ci0gICAgICAgICAgICBMaXN0ZW5lck1hbmFnZXIgbGlzdGVuZXJNYW5hZ2VyID0gY29uZmlnY3R4LmdldExpc3RlbmVyTWFuYWdlcigpOwotICAgICAgICAgICAgbGlzdGVuZXJNYW5hZ2VyLmFkZExpc3RlbmVyKHRyc0luLCB0cnVlKTsKLQotICAgICAgICAgICAgLy8gc2hvdWxkIGFsbCB0cmFuc3BvcnRzIGJlIHN0YXJ0ZWQ/IHNwZWNpZmllZCBhcyAiLXQgYWxsIgotICAgICAgICAgICAgaWYgKHN0YXJ0QWxsVHJhbnNwb3J0cykgewotICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSBjb25maWdjdHguZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS4KLSAgICAgICAgICAgICAgICAgICAgICAgIGdldFRyYW5zcG9ydHNJbigpLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFFOYW1lIHRycCA9IChRTmFtZSkgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghbmV3IFFOYW1lKENvbnN0YW50cy5UUkFOU1BPUlRfSFRUUCkuZXF1YWxzKHRycCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyc0luID0gKFRyYW5zcG9ydEluRGVzY3JpcHRpb24pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ2N0eC5nZXRBeGlzQ29uZmlndXJhdGlvbigpLmdldFRyYW5zcG9ydHNJbigpLmdldCh0cnApOwotICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXJNYW5hZ2VyLmFkZExpc3RlbmVyKHRyc0luLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiW1NpbXBsZUhUVFBTZXJ2ZXJdIFN0YXJ0ZWQiKTsKLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgICAgIGxvZy5mYXRhbCgiRXJyb3Igc3RhcnRpbmcgU2ltcGxlSFRUUFNlcnZlciIsIHQpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJbU2ltcGxlSFRUUFNlcnZlcl0gU2h1dHRpbmcgZG93biIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHByaW50VXNhZ2UoKSB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVXNhZ2U6IFNpbXBsZUhUVFBTZXJ2ZXIgW29wdGlvbnNdIC1yIDxyZXBvc2l0b3J5PiIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiBPcHRzOiAtPyB0aGlzIG1lc3NhZ2UiKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAgICAgIC1wIHBvcnQgOnRvIGxpc3RlbiBvbiAoZGVmYXVsdCBpcyA4MDgwKSIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oCi0gICAgICAgICAgICAgICAgIiAgICAgICAtdCBhbGwgIDp0byBzdGFydCBhbGwgdHJhbnNwb3J0cyBkZWZpbmVkIGluIHRoZSBheGlzMiBjb25maWd1cmF0aW9uIik7Ci0gICAgICAgIFN5c3RlbS5leGl0KDEpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogU3RhcnQgdGhpcyBzZXJ2ZXIgYXMgYSBOT04tZGFlbW9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBlbWJlZGRlZCA9IG5ldyBTaW1wbGVIdHRwU2VydmVyKGh0dHBGYWN0b3J5LCBwb3J0KTsKLSAgICAgICAgICAgIGVtYmVkZGVkLmluaXQoKTsKLSAgICAgICAgICAgIGVtYmVkZGVkLnN0YXJ0KCk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGxvZy5lcnJvcihlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgICAgICB0aHJvdyBBeGlzRmF1bHQubWFrZUZhdWx0KGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RvcCB0aGlzIHNlcnZlci4gQ2FuIGJlIGNhbGxlZCBzYWZlbHkgaWYgdGhlIHN5c3RlbSBpcyBhbHJlYWR5IHN0b3BwZWQsCi0gICAgICogb3IgaWYgaXQgd2FzIG5ldmVyIHN0YXJ0ZWQuCi0gICAgICogVGhpcyB3aWxsIGludGVycnVwdCBhbnkgcGVuZGluZyBhY2NlcHQoKS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdG9wKCkgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIltTaW1wbGVIVFRQU2VydmVyXSBTdG9wIGNhbGxlZCIpOwotICAgICAgICBpZiAoZW1iZWRkZWQgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBlbWJlZGRlZC5kZXN0cm95KCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGxvZy5lcnJvcihlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiByZXBseVRvRVBSCi0gICAgICogSWYgdGhlIHVzZXIgaGFzIGdpdmVuIGhvc3QgYWRkcmVzcyBwYXJhbXRlciB0aGVuIGl0IGdldHMgdGhlIGhpZ2ggcHJpb3JpdHkgYW5kCi0gICAgICogRVJQIHdpbGwgYmUgY3JlYXRkIHVzaW5nIHRoYXQKLSAgICAgKiBOOkIgLSBob3N0QWRkcmVzcyBzaG91bGQgYmUgYSBjb21wbGV0ZSB1cmwgKGh0dHA6Ly93d3cubXlBcHAuY29tL3dzKQotICAgICAqCi0gICAgICogQHBhcmFtIHNlcnZpY2VOYW1lCi0gICAgICogQHBhcmFtIGlwCi0gICAgICogQHJldHVybiBhbiBFbmRwb2ludFJlZmVyZW5jZQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuVHJhbnNwb3J0TGlzdGVuZXIjZ2V0RVBSRm9yU2VydmljZShTdHJpbmcsU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyBFbmRwb2ludFJlZmVyZW5jZVtdIGdldEVQUnNGb3JTZXJ2aWNlKFN0cmluZyBzZXJ2aWNlTmFtZSwgU3RyaW5nIGlwKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgLy9pZiBob3N0IGFkZHJlc3MgaXMgcHJlc2VudAotICAgICAgICBpZiAoaG9zdEFkZHJlc3MgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGVtYmVkZGVkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZW5kcG9pbnRSZWZlcm5jZSA9IGhvc3RBZGRyZXNzIDsKLSAgICAgICAgICAgICAgICBpZihjb25maWd1cmF0aW9uQ29udGV4dC5nZXRTZXJ2aWNlQ29udGV4dFBhdGgoKS5zdGFydHNXaXRoKCIvIikpewotICAgICAgICAgICAgICAgICAgICBlbmRwb2ludFJlZmVybmNlID0gIGVuZHBvaW50UmVmZXJuY2UgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb25Db250ZXh0LmdldFNlcnZpY2VDb250ZXh0UGF0aCgpICsgIi8iICsgc2VydmljZU5hbWU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZW5kcG9pbnRSZWZlcm5jZSA9IGVuZHBvaW50UmVmZXJuY2UgKyAnLycgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb25Db250ZXh0LmdldFNlcnZpY2VDb250ZXh0UGF0aCgpICsgIi8iICsgc2VydmljZU5hbWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRW5kcG9pbnRSZWZlcmVuY2VbXXtuZXcgRW5kcG9pbnRSZWZlcmVuY2UoZW5kcG9pbnRSZWZlcm5jZSArICIvIil9OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJVbmFibGUgdG8gZ2VuZXJhdGUgRVBSIGZvciB0aGUgdHJhbnNwb3J0IDogaHR0cCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vaWYgdGhlIGhvc3QgYWRkcmVzcyBpcyBub3QgcHJlc2VudAotICAgICAgICBTdHJpbmcgaXBBZGRyZXNzOwotICAgICAgICBpZiAoaXAgIT0gbnVsbCkgewotICAgICAgICAgICAgaXBBZGRyZXNzID0gaXA7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGlmKGxvY2FsQWRkcmVzcz09bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgIGxvY2FsQWRkcmVzcyA9IFV0aWxzLmdldElwQWRkcmVzcyhjb25maWd1cmF0aW9uQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGxvY2FsQWRkcmVzcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgaXBBZGRyZXNzID0gIjEyNy4wLjAuMSI7Ci0gICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlwQWRkcmVzcyA9IGxvY2FsQWRkcmVzczsKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoU29ja2V0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBBeGlzRmF1bHQubWFrZUZhdWx0KGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChlbWJlZGRlZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgZW5kcG9pbnRSZWZlcm5jZSA9ICJodHRwOi8vIiArIGlwQWRkcmVzcyArICI6IiArIGVtYmVkZGVkLmdldFBvcnQoKSA7Ci0gICAgICAgICAgICBpZihjb25maWd1cmF0aW9uQ29udGV4dC5nZXRTZXJ2aWNlQ29udGV4dFBhdGgoKS5zdGFydHNXaXRoKCIvIikpewotICAgICAgICAgICAgICAgIGVuZHBvaW50UmVmZXJuY2UgPSAgZW5kcG9pbnRSZWZlcm5jZSArCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uQ29udGV4dC5nZXRTZXJ2aWNlQ29udGV4dFBhdGgoKSArICIvIiArIHNlcnZpY2VOYW1lOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBlbmRwb2ludFJlZmVybmNlID0gZW5kcG9pbnRSZWZlcm5jZSArICcvJyArCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uQ29udGV4dC5nZXRTZXJ2aWNlQ29udGV4dFBhdGgoKSArICIvIiArIHNlcnZpY2VOYW1lOwotICAgICAgICAgICAgfQotCi0KLSAgICAgICAgICAgIHJldHVybiBuZXcgRW5kcG9pbnRSZWZlcmVuY2VbXXtuZXcgRW5kcG9pbnRSZWZlcmVuY2UoZW5kcG9pbnRSZWZlcm5jZSArICIvIil9OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiVW5hYmxlIHRvIGdlbmVyYXRlIEVQUiBmb3IgdGhlIHRyYW5zcG9ydCA6IGh0dHAiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHRlciBmb3IgaHR0cEZhY3RvcnkKLSAgICAgKi8KLSAgICBwdWJsaWMgSHR0cEZhY3RvcnkgZ2V0SHR0cEZhY3RvcnkoKSB7Ci0gICAgICAgIHJldHVybiBodHRwRmFjdG9yeTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgZ2V0Q29uZmlndXJhdGlvbkNvbnRleHQKLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHN5c3RlbSBjb250ZXh0Ci0gICAgICovCi0gICAgcHVibGljIENvbmZpZ3VyYXRpb25Db250ZXh0IGdldENvbmZpZ3VyYXRpb25Db250ZXh0KCkgewotICAgICAgICByZXR1cm4gY29uZmlndXJhdGlvbkNvbnRleHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogcmVwbHlUb0VQUgotICAgICAqIElmIHRoZSB1c2VyIGhhcyBnaXZlbiBob3N0IGFkZHJlc3MgcGFyYW10ZXIgdGhlbiBpdCBnZXRzIHRoZSBoaWdoIHByaW9yaXR5IGFuZAotICAgICAqIEVSUCB3aWxsIGJlIGNyZWF0ZCB1c2luZyB0aGF0Ci0gICAgICogTjpCIC0gaG9zdEFkZHJlc3Mgc2hvdWxkIGJlIGEgY29tcGx0ZSB1cmwgKGh0dHA6Ly93d3cubXlBcHAuY29tL3dzKQotICAgICAqCi0gICAgICogQHBhcmFtIHNlcnZpY2VOYW1lCi0gICAgICogQHBhcmFtIGlwCi0gICAgICogQHJldHVybiBhbiBFbmRwb2ludFJlZmVyZW5jZQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuVHJhbnNwb3J0TGlzdGVuZXIjZ2V0RVBSRm9yU2VydmljZShTdHJpbmcsU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyBFbmRwb2ludFJlZmVyZW5jZSBnZXRFUFJGb3JTZXJ2aWNlKFN0cmluZyBzZXJ2aWNlTmFtZSwgU3RyaW5nIGlwKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgcmV0dXJuIGdldEVQUnNGb3JTZXJ2aWNlKHNlcnZpY2VOYW1lLCBpcClbMF07Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIGlmIHRoaXMgSFRUUCBzZXJ2ZXIgaW5zdGFuY2UgaXMgcnVubmluZy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdHJ1ZS9mYWxzZQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzUnVubmluZygpIHsKLSAgICAgICAgaWYgKGVtYmVkZGVkID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBlbWJlZGRlZC5pc1J1bm5pbmcoKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgY2xhc3MgU2h1dGRvd25UaHJlYWQgZXh0ZW5kcyBUaHJlYWQgewotICAgICAgICBwcml2YXRlIFNpbXBsZUhUVFBTZXJ2ZXIgc2VydmVyID0gbnVsbDsKLQotICAgICAgICBwdWJsaWMgU2h1dGRvd25UaHJlYWQoU2ltcGxlSFRUUFNlcnZlciBzZXJ2ZXIpIHsKLSAgICAgICAgICAgIHN1cGVyKCk7Ci0gICAgICAgICAgICB0aGlzLnNlcnZlciA9IHNlcnZlcjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiW1NpbXBsZUhUVFBTZXJ2ZXJdIFNodXR0aW5nIGRvd24iKTsKLSAgICAgICAgICAgIHNlcnZlci5zdG9wKCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIltTaW1wbGVIVFRQU2VydmVyXSBTaHV0ZG93biBjb21wbGV0ZSIpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgU2Vzc2lvbkNvbnRleHQgZ2V0U2Vzc2lvbkNvbnRleHQoTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQpIHsKLSAgICAgICAgU3RyaW5nIHNlc3Npb25LZXkgPSAoU3RyaW5nKSBtZXNzYWdlQ29udGV4dC5nZXRQcm9wZXJ0eShIVFRQQ29uc3RhbnRzLkNPT0tJRV9TVFJJTkcpOwotICAgICAgICByZXR1cm4gdGhpcy5zZXNzaW9uTWFuYWdlci5nZXRTZXNzaW9uQ29udGV4dChzZXNzaW9uS2V5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkZXN0cm95KCkgewotICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb25Db250ZXh0ID0gbnVsbDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy90cmFuc3BvcnQvaHR0cC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9UcmFuc3BvcnRIZWFkZXJzLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy90cmFuc3BvcnQvaHR0cC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9UcmFuc3BvcnRIZWFkZXJzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmMjA3NmUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvdHJhbnNwb3J0L2h0dHAvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvVHJhbnNwb3J0SGVhZGVycy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cDsKLQotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogUGFzcy1UaHJ1IC8gZGVsYXllZCBnZXQgYW5kIHB1dCBvZiB0aGUgdmFsdWVzIGZyb20gSHR0cFNlcnZsZXRSZXF1ZXN0Ci0gKi8KLXB1YmxpYyBjbGFzcyBUcmFuc3BvcnRIZWFkZXJzIGltcGxlbWVudHMgTWFwIHsKLSAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxOwotICAgIC8vIFRoaXMgbWFwIGNvbnRhaW5zIHRoZSBoZWFkZXJzIGZyb20gdGhlIHJlcXVlc3Q7IGl0IHdpbGwgYmUgZmlsbGVkIGluIGxhemlseSBpZiBuZWVkZWQsIAotICAgIC8vIGZvciBwZXJmb3JtYW5jZSAKLSAgICBIYXNoTWFwIGhlYWRlck1hcCA9IG51bGw7Ci0gICAgLy8gVGhpcyBtYXAgY29udGFpbnMgcHJvcGVydGllcyB0aGF0IGhhdmUgYmVlbiBwdXQgb250byB0aGUgbWFwOyBpdCBpcyBub3QgcG9wdWxhdGVkIGJ5IHZhbHVlcwotICAgIC8vIGZyb20gdGhlIEh0dHBTZXJ2bGV0UmVxdWVzdC4gIEEgbnVsbCB2YWx1ZSBtZWFucyB0aGUgaGVhZGVyTWFwIGhhcyBiZWVuIGZ1bGx5IHBvcHVsYXRlZCBhbmQKLSAgICAvLyBhbnkgdmFsdWVzIHRoYXQgd2VyZSBpbiBsb2NhbEhlYWRlck1hcCBoYXZlIGJlZW4gbWlncmF0ZWQgdG8gaGVhZGVyTWFwLgotICAgIEhhc2hNYXAgbG9jYWxIZWFkZXJNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgcHVibGljIFRyYW5zcG9ydEhlYWRlcnMoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSkgewotICAgICAgICB0aGlzLnJlcSA9IHJlcTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHdpbGwgZnVsbHkgcG9wdWxhdGUgdGhlIEhhc2hNYXAgd2l0aCB0aGUgdmFsdWUgZnJvbSB0aGUgSHR0cFNlcmx2ZXRSZXF1ZXN0IGFuZCBtaWdyYXRlCi0gICAgICogYW55IHZhbHVlcyBwcmV2aW91c2x5IHB1dCBvbnRvIGxvY2FsSGVhZGVyTWFwIGludG8gdGhlIG5ldyBIYXNoTWFwLgotICAgICAqIAotICAgICAqIE5vdGUgdGhpcyBpcyBhIGJpdCBub24tcGVyZm9ybWFudCwgc28gaXQgaXMgb25seSBkb25lIGlmIG5lZWRlZC4gIAotICAgICAqIElmL3doZW4gaXQgaXMgZG9uZSwgdGhlcmUgbWF5IGJlIHByb3BlcnRpZXMgdGhhdCBoYXZlIGJlZW4gc2V0IG9uIHRoZSBsb2NhbEhlYWRlck1hcC4gIAotICAgICAqIElmIGhlYWRlck1hcCBtdXN0IGJlIGNyZWF0ZWQgZHVlIHRvIGEgY2FsbAotICAgICAqIHRvIHNpemUsIG9yIGlzRW1wdHksIG9yIHNvbWUgb3RoZXIgbWV0aG9kIHdoaWNoIHJlcXVpcmVzIGEgZnVsbHkgcG9wdWxhdGVkIG1hcCwgdGhlbiBhbnkgCi0gICAgICogcHJldmlvdXNseSBjcmVhdGVkIGVudHJpZXMgaW4gdGhlIGxvY2FsSGVhZGVyTWFwIGFyZSBtaWdyYXRlZCB0byB0aGUgbmV3IGhhc2htYXAuICAKLSAgICAgKiBBZnRlciB0aGF0IGxvY2FsSGVhZGVyTWFwIGlzIHJlbGVhc2VkIGFuZCBvbmx5IGhlYWRlck1hcCBpcyB1c2VkIGFmdGVyIHRoYXQuIAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBpbml0KCkgewotICAgICAgICBoZWFkZXJNYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICBFbnVtZXJhdGlvbiBoZWFkZXJOYW1lcyA9IHJlcS5nZXRIZWFkZXJOYW1lcygpOwotCi0gICAgICAgIHdoaWxlIChoZWFkZXJOYW1lcy5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgU3RyaW5nIGtleSA9IChTdHJpbmcpIGhlYWRlck5hbWVzLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSByZXEuZ2V0SGVhZGVyKGtleSk7Ci0KLSAgICAgICAgICAgIGhlYWRlck1hcC5wdXQoa2V5LCB2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIE1pZ3JhdGUgYW55IHByZXZpb3VzbHkgc2V0IGxvY2FsIHByb3BlcnRpZXMgdG8gdGhlIG5ld2x5IGNyZWF0ZWQgaGFzaG1hcCB0aGVuIHJlbGVhc2UKLSAgICAgICAgLy8gdGhlIGxvY2FsIGhhc2htYXAKLSAgICAgICAgU2V0IGxvY2FsSGVhZGVyU2V0ID0gbG9jYWxIZWFkZXJNYXAuZW50cnlTZXQoKTsKLSAgICAgICAgSXRlcmF0b3IgbG9jYWxIZWFkZXJJdGVyYXRvciA9IGxvY2FsSGVhZGVyU2V0Lml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChsb2NhbEhlYWRlckl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgTWFwLkVudHJ5IGxvY2FsSGVhZGVyRW50cnkgPSAoTWFwLkVudHJ5KSBsb2NhbEhlYWRlckl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgIGhlYWRlck1hcC5wdXQobG9jYWxIZWFkZXJFbnRyeS5nZXRLZXkoKSwgbG9jYWxIZWFkZXJFbnRyeS5nZXRWYWx1ZSgpKTsKLSAgICAgICAgfQotICAgICAgICBsb2NhbEhlYWRlck1hcCA9IG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBzaXplKCkgewotICAgICAgICBpZiAoaGVhZGVyTWFwID09IG51bGwpIHsKLSAgICAgICAgICAgIGluaXQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaGVhZGVyTWFwLnNpemUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKLSAgICAgICAgaWYgKGhlYWRlck1hcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBoZWFkZXJNYXAuY2xlYXIoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobG9jYWxIZWFkZXJNYXAgIT0gbnVsbCkgewotICAgICAgICAgICAgbG9jYWxIZWFkZXJNYXAuY2xlYXIoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0gICAgICAgIGlmIChoZWFkZXJNYXAgPT0gbnVsbCkgewotICAgICAgICAgICAgaW5pdCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBoZWFkZXJNYXAuaXNFbXB0eSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zS2V5KE9iamVjdCBrZXkpIHsKLSAgICAgICAgaWYgKGhlYWRlck1hcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpbml0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGhlYWRlck1hcC5jb250YWluc0tleShrZXkpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zVmFsdWUoT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIGlmIChoZWFkZXJNYXAgPT0gbnVsbCkgewotICAgICAgICAgICAgaW5pdCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBoZWFkZXJNYXAuY29udGFpbnNWYWx1ZSh2YWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIENvbGxlY3Rpb24gdmFsdWVzKCkgewotICAgICAgICBpZiAoaGVhZGVyTWFwID09IG51bGwpIHsKLSAgICAgICAgICAgIGluaXQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaGVhZGVyTWFwLnZhbHVlcygpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHB1dEFsbChNYXAgdCkgewotICAgICAgICBpZiAoaGVhZGVyTWFwID09IG51bGwpIHsKLSAgICAgICAgICAgIGluaXQoKTsKLSAgICAgICAgfQotICAgICAgICBoZWFkZXJNYXAucHV0QWxsKHQpOwotICAgIH0KLQotICAgIHB1YmxpYyBTZXQgZW50cnlTZXQoKSB7Ci0gICAgICAgIGlmIChoZWFkZXJNYXAgPT0gbnVsbCkgewotICAgICAgICAgICAgaW5pdCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBoZWFkZXJNYXAuZW50cnlTZXQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2V0IGtleVNldCgpIHsKLSAgICAgICAgaWYgKGhlYWRlck1hcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpbml0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGhlYWRlck1hcC5rZXlTZXQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldChPYmplY3Qga2V5KSB7Ci0gICAgICAgIC8vIElmIHRoZXJlIGlzIGEgbG9jYWwgbWFwLCBsb29rIHRoZXJlIGZpcnN0LgotICAgICAgICBpZiAobG9jYWxIZWFkZXJNYXAgIT0gbnVsbCkgewotICAgICAgICAgICAgT2JqZWN0IHJldHVyblZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIHJldHVyblZhbHVlID0gbG9jYWxIZWFkZXJNYXAuZ2V0KGtleSk7Ci0gICAgICAgICAgICBpZiAocmV0dXJuVmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoaGVhZGVyTWFwID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiByZXEuZ2V0SGVhZGVyKChTdHJpbmcpIGtleSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGhlYWRlck1hcC5nZXQoa2V5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IHJlbW92ZShPYmplY3Qga2V5KSB7Ci0gICAgICAgIGlmIChoZWFkZXJNYXAgPT0gbnVsbCkgewotICAgICAgICAgICAgaW5pdCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBoZWFkZXJNYXAucmVtb3ZlKGtleSk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBwdXQoT2JqZWN0IGtleSwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIGlmIChsb2NhbEhlYWRlck1hcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbG9jYWxIZWFkZXJNYXAucHV0KGtleSwgdmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChoZWFkZXJNYXAgPT0gbnVsbCkgewotICAgICAgICAgICAgaW5pdCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBoZWFkZXJNYXAucHV0KGtleSwgdmFsdWUpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3RyYW5zcG9ydC9odHRwL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL3NlcnZlci9BeGlzSHR0cENvbm5lY3Rpb24uamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3RyYW5zcG9ydC9odHRwL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL3NlcnZlci9BeGlzSHR0cENvbm5lY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY2ZDE4My4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy90cmFuc3BvcnQvaHR0cC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9zZXJ2ZXIvQXhpc0h0dHBDb25uZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuc2VydmVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5odHRwLkh0dHBDb25uZWN0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IdHRwRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IdHRwSW5ldENvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5odHRwLkh0dHBSZXF1ZXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IdHRwUmVzcG9uc2U7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci0KLXB1YmxpYyBpbnRlcmZhY2UgQXhpc0h0dHBDb25uZWN0aW9uIGV4dGVuZHMgSHR0cENvbm5lY3Rpb24sIEh0dHBJbmV0Q29ubmVjdGlvbiB7Ci0KLSAgICBIdHRwUmVxdWVzdCByZWNlaXZlUmVxdWVzdCgpCi0gICAgICAgIHRocm93cyBIdHRwRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbjsKLSAgICAKLSAgICBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpOwotICAgIAotICAgIHZvaWQgc2VuZFJlc3BvbnNlKEh0dHBSZXNwb25zZSByZXNwb25zZSkgCi0gICAgICAgIHRocm93cyBIdHRwRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbjsgICAgCi0gICAgCi0gICAgT3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbSgpOwotICAgIAotICAgIHZvaWQgZmx1c2goKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb247Ci0gICAgCi0gICAgdm9pZCByZXNldCgpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvdHJhbnNwb3J0L2h0dHAvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvc2VydmVyL0F4aXNIdHRwQ29ubmVjdGlvbkltcGwuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3RyYW5zcG9ydC9odHRwL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL3NlcnZlci9BeGlzSHR0cENvbm5lY3Rpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxOGQxYzIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvdHJhbnNwb3J0L2h0dHAvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvc2VydmVyL0F4aXNIdHRwQ29ubmVjdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuc2VydmVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5odHRwLkhlYWRlckl0ZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IdHRwQ29ubmVjdGlvbk1ldHJpY3M7Ci1pbXBvcnQgb3JnLmFwYWNoZS5odHRwLkh0dHBFbnRpdHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5odHRwLkh0dHBFbnRpdHlFbmNsb3NpbmdSZXF1ZXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IdHRwRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IdHRwUmVxdWVzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAuSHR0cFJlc3BvbnNlOwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IdHRwVmVyc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAuUHJvdG9jb2xWZXJzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5lbnRpdHkuQ29udGVudExlbmd0aFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5pbXBsLkRlZmF1bHRIdHRwUmVxdWVzdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5odHRwLmltcGwuZW50aXR5LlN0cmljdENvbnRlbnRMZW5ndGhTdHJhdGVneTsKLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAuaW1wbC5pby5DaHVua2VkSW5wdXRTdHJlYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5odHRwLmltcGwuaW8uQ2h1bmtlZE91dHB1dFN0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAuaW1wbC5pby5Db250ZW50TGVuZ3RoSW5wdXRTdHJlYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5odHRwLmltcGwuaW8uQ29udGVudExlbmd0aE91dHB1dFN0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAuaW1wbC5pby5IdHRwUmVxdWVzdFBhcnNlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAuaW1wbC5pby5IdHRwUmVzcG9uc2VXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5odHRwLmltcGwuaW8uSWRlbnRpdHlJbnB1dFN0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAuaW1wbC5pby5JZGVudGl0eU91dHB1dFN0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAuaW1wbC5pby5Tb2NrZXRJbnB1dEJ1ZmZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAuaW1wbC5pby5Tb2NrZXRPdXRwdXRCdWZmZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5odHRwLmlvLkh0dHBNZXNzYWdlUGFyc2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5pby5IdHRwTWVzc2FnZVdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAuaW8uU2Vzc2lvbklucHV0QnVmZmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5pby5TZXNzaW9uT3V0cHV0QnVmZmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5wYXJhbXMuSHR0cENvbm5lY3Rpb25QYXJhbXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5odHRwLnBhcmFtcy5IdHRwUGFyYW1zOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOwotaW1wb3J0IGphdmEubmV0LlNvY2tldDsKLWltcG9ydCBqYXZhLm5ldC5Tb2NrZXRFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBBeGlzSHR0cENvbm5lY3Rpb25JbXBsIGltcGxlbWVudHMgQXhpc0h0dHBDb25uZWN0aW9uIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBIRUFERVJMT0cgPQotICAgICAgICBMb2dGYWN0b3J5LmdldExvZygib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5zZXJ2ZXIud2lyZSIpOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBTb2NrZXQgc29ja2V0OwotICAgIHByaXZhdGUgZmluYWwgU2Vzc2lvbk91dHB1dEJ1ZmZlciBvdXRidWZmZXI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTZXNzaW9uSW5wdXRCdWZmZXIgaW5idWZmZXI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBIdHRwTWVzc2FnZVBhcnNlciByZXF1ZXN0UGFyc2VyOwotICAgIHByaXZhdGUgZmluYWwgSHR0cE1lc3NhZ2VXcml0ZXIgcmVzcG9uc2VXcml0ZXI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBDb250ZW50TGVuZ3RoU3RyYXRlZ3kgY29udGVudExlblN0cmF0ZWd5OwotCi0gICAgcHJpdmF0ZSBPdXRwdXRTdHJlYW0gb3V0ID0gbnVsbDsKLSAgICBwcml2YXRlIElucHV0U3RyZWFtIGluID0gbnVsbDsKLSAgICAKLSAgICBwdWJsaWMgQXhpc0h0dHBDb25uZWN0aW9uSW1wbChmaW5hbCBTb2NrZXQgc29ja2V0LCBmaW5hbCBIdHRwUGFyYW1zIHBhcmFtcykgCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBzdXBlcigpOwotICAgICAgICBpZiAoc29ja2V0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlNvY2tldCBtYXkgbm90IGJlIG51bGwiKTsgCi0gICAgICAgIH0KLSAgICAgICAgaWYgKHBhcmFtcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJIVFRQIHBhcmFtZXRlcnMgbWF5IG5vdCBiZSBudWxsIik7IAotICAgICAgICB9Ci0gICAgICAgIHNvY2tldC5zZXRUY3BOb0RlbGF5KEh0dHBDb25uZWN0aW9uUGFyYW1zLmdldFRjcE5vRGVsYXkocGFyYW1zKSk7Ci0gICAgICAgIHNvY2tldC5zZXRTb1RpbWVvdXQoSHR0cENvbm5lY3Rpb25QYXJhbXMuZ2V0U29UaW1lb3V0KHBhcmFtcykpOwotICAgICAgICAKLSAgICAgICAgaW50IGxpbmdlciA9IEh0dHBDb25uZWN0aW9uUGFyYW1zLmdldExpbmdlcihwYXJhbXMpOwotICAgICAgICBpZiAobGluZ2VyID49IDApIHsKLSAgICAgICAgICAgIHNvY2tldC5zZXRTb0xpbmdlcihsaW5nZXIgPiAwLCBsaW5nZXIpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpbnQgYnVmZmVyc2l6ZSA9IEh0dHBDb25uZWN0aW9uUGFyYW1zLmdldFNvY2tldEJ1ZmZlclNpemUocGFyYW1zKTsKLSAgICAgICAgdGhpcy5zb2NrZXQgPSBzb2NrZXQ7Ci0gICAgICAgIHRoaXMub3V0YnVmZmVyID0gbmV3IFNvY2tldE91dHB1dEJ1ZmZlcihzb2NrZXQsIGJ1ZmZlcnNpemUsIHBhcmFtcyk7IAotICAgICAgICB0aGlzLmluYnVmZmVyID0gbmV3IFNvY2tldElucHV0QnVmZmVyKHNvY2tldCwgYnVmZmVyc2l6ZSwgcGFyYW1zKTsgCi0gICAgICAgIHRoaXMuY29udGVudExlblN0cmF0ZWd5ID0gbmV3IFN0cmljdENvbnRlbnRMZW5ndGhTdHJhdGVneSgpOwotICAgICAgICB0aGlzLnJlcXVlc3RQYXJzZXIgPSBuZXcgSHR0cFJlcXVlc3RQYXJzZXIoCi0gICAgICAgICAgICAgICAgdGhpcy5pbmJ1ZmZlciwgbnVsbCwgbmV3IERlZmF1bHRIdHRwUmVxdWVzdEZhY3RvcnkoKSwgcGFyYW1zKTsKLSAgICAgICAgdGhpcy5yZXNwb25zZVdyaXRlciA9IG5ldyBIdHRwUmVzcG9uc2VXcml0ZXIoCi0gICAgICAgICAgICAgICAgdGhpcy5vdXRidWZmZXIsIG51bGwsIHBhcmFtcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICB0aGlzLm91dGJ1ZmZlci5mbHVzaCgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgdGhpcy5zb2NrZXQuc2h1dGRvd25PdXRwdXQoKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaWdub3JlKSB7Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHRoaXMuc29ja2V0LnNodXRkb3duSW5wdXQoKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaWdub3JlKSB7Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy5zb2NrZXQuY2xvc2UoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc09wZW4oKSB7Ci0gICAgICAgIHJldHVybiAhdGhpcy5zb2NrZXQuaXNDbG9zZWQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1N0YWxlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgdGhpcy5pbmJ1ZmZlci5pc0RhdGFBdmFpbGFibGUoMSk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNodXRkb3duKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgU29ja2V0IHRtcHNvY2tldCA9IHRoaXMuc29ja2V0OwotICAgICAgICBpZiAodG1wc29ja2V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRtcHNvY2tldC5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIEh0dHBSZXF1ZXN0IHJlY2VpdmVSZXF1ZXN0KCkgdGhyb3dzIEh0dHBFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAgICAgSHR0cFJlcXVlc3QgcmVxdWVzdCA9IChIdHRwUmVxdWVzdCkgdGhpcy5yZXF1ZXN0UGFyc2VyLnBhcnNlKCk7Ci0gICAgICAgIGlmIChIRUFERVJMT0cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgSEVBREVSTE9HLmRlYnVnKCI+PiAiICsgcmVxdWVzdC5nZXRSZXF1ZXN0TGluZSgpLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgZm9yIChIZWFkZXJJdGVyYXRvciBpdCA9IHJlcXVlc3QuaGVhZGVySXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLSAgICAgICAgICAgICAgICBIRUFERVJMT0cuZGVidWcoIj4+ICIgKyBpdC5uZXh0SGVhZGVyKCkudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIFByZXBhcmUgaW5wdXQgc3RyZWFtCi0gICAgICAgIHRoaXMuaW4gPSBudWxsOwotICAgICAgICBpZiAocmVxdWVzdCBpbnN0YW5jZW9mIEh0dHBFbnRpdHlFbmNsb3NpbmdSZXF1ZXN0KSB7Ci0gICAgICAgICAgICBsb25nIGxlbiA9IHRoaXMuY29udGVudExlblN0cmF0ZWd5LmRldGVybWluZUxlbmd0aChyZXF1ZXN0KTsKLSAgICAgICAgICAgIGlmIChsZW4gPT0gQ29udGVudExlbmd0aFN0cmF0ZWd5LkNIVU5LRUQpIHsKLSAgICAgICAgICAgICAgICB0aGlzLmluID0gbmV3IENodW5rZWRJbnB1dFN0cmVhbSh0aGlzLmluYnVmZmVyKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobGVuID09IENvbnRlbnRMZW5ndGhTdHJhdGVneS5JREVOVElUWSkgewotICAgICAgICAgICAgICAgIHRoaXMuaW4gPSBuZXcgSWRlbnRpdHlJbnB1dFN0cmVhbSh0aGlzLmluYnVmZmVyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRoaXMuaW4gPSBuZXcgQ29udGVudExlbmd0aElucHV0U3RyZWFtKGluYnVmZmVyLCBsZW4pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXF1ZXN0OwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZW5kUmVzcG9uc2UoZmluYWwgSHR0cFJlc3BvbnNlIHJlc3BvbnNlKSAKLSAgICAgICAgICAgIHRocm93cyBIdHRwRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChyZXNwb25zZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJIVFRQIHJlc3BvbnNlIG1heSBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKEhFQURFUkxPRy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBIRUFERVJMT0cuZGVidWcoIjw8ICIgKyByZXNwb25zZS5nZXRTdGF0dXNMaW5lKCkudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICBmb3IgKEhlYWRlckl0ZXJhdG9yIGl0ID0gcmVzcG9uc2UuaGVhZGVySXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLSAgICAgICAgICAgICAgICBIRUFERVJMT0cuZGVidWcoIjw8ICIgKyBpdC5uZXh0SGVhZGVyKCkudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHRoaXMucmVzcG9uc2VXcml0ZXIud3JpdGUocmVzcG9uc2UpOwotCi0gICAgICAgIC8vIFByZXBhcmUgb3V0cHV0IHN0cmVhbQotICAgICAgICB0aGlzLm91dCA9IG51bGw7Ci0gICAgICAgIFByb3RvY29sVmVyc2lvbiB2ZXIgPSByZXNwb25zZS5nZXRTdGF0dXNMaW5lKCkuZ2V0UHJvdG9jb2xWZXJzaW9uKCk7Ci0gICAgICAgIEh0dHBFbnRpdHkgZW50aXR5ID0gcmVzcG9uc2UuZ2V0RW50aXR5KCk7Ci0gICAgICAgIGlmIChlbnRpdHkgIT0gbnVsbCkgewotICAgICAgICAgICAgbG9uZyBsZW4gPSBlbnRpdHkuZ2V0Q29udGVudExlbmd0aCgpOwotICAgICAgICAgICAgaWYgKGVudGl0eS5pc0NodW5rZWQoKSAmJiB2ZXIuZ3JlYXRlckVxdWFscyhIdHRwVmVyc2lvbi5IVFRQXzFfMSkpIHsKLSAgICAgICAgICAgICAgICB0aGlzLm91dCA9IG5ldyBDaHVua2VkT3V0cHV0U3RyZWFtKHRoaXMub3V0YnVmZmVyKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobGVuID49IDApIHsKLSAgICAgICAgICAgICAgICB0aGlzLm91dCA9IG5ldyBDb250ZW50TGVuZ3RoT3V0cHV0U3RyZWFtKHRoaXMub3V0YnVmZmVyLCBsZW4pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aGlzLm91dCA9IG5ldyBJZGVudGl0eU91dHB1dFN0cmVhbSh0aGlzLm91dGJ1ZmZlcik7IAotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhpcy5vdXRidWZmZXIuZmx1c2goKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmluOwotICAgIH0KLQotICAgIHB1YmxpYyBPdXRwdXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtKCkgewotICAgICAgICByZXR1cm4gdGhpcy5vdXQ7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGZsdXNoKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHRoaXMub3V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRoaXMub3V0LmZsdXNoKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aGlzLm91dGJ1ZmZlci5mbHVzaCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVzZXQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBpZiAodGhpcy5pbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aGlzLmluLmNsb3NlKCk7Ci0gICAgICAgICAgICB0aGlzLmluID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBpZiAodGhpcy5vdXQgIT0gbnVsbCkgewotICAgICAgICAgICAgdGhpcy5vdXQuZmx1c2goKTsKLSAgICAgICAgICAgIHRoaXMub3V0LmNsb3NlKCk7Ci0gICAgICAgICAgICB0aGlzLm91dCA9IG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGludCBnZXRTb2NrZXRUaW1lb3V0KCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMuc29ja2V0LmdldFNvVGltZW91dCgpOwotICAgICAgICB9IGNhdGNoIChTb2NrZXRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFNvY2tldFRpbWVvdXQoaW50IHRpbWVvdXQpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHRoaXMuc29ja2V0LnNldFNvVGltZW91dCh0aW1lb3V0KTsKLSAgICAgICAgfSBjYXRjaCAoU29ja2V0RXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgSW5ldEFkZHJlc3MgZ2V0TG9jYWxBZGRyZXNzKCkgewotICAgICAgICBpZiAodGhpcy5zb2NrZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMuc29ja2V0LmdldExvY2FsQWRkcmVzcygpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldExvY2FsUG9ydCgpIHsKLSAgICAgICAgaWYgKHRoaXMuc29ja2V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLnNvY2tldC5nZXRMb2NhbFBvcnQoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBJbmV0QWRkcmVzcyBnZXRSZW1vdGVBZGRyZXNzKCkgewotICAgICAgICBpZiAodGhpcy5zb2NrZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMuc29ja2V0LmdldEluZXRBZGRyZXNzKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0UmVtb3RlUG9ydCgpIHsKLSAgICAgICAgaWYgKHRoaXMuc29ja2V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLnNvY2tldC5nZXRQb3J0KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgSHR0cENvbm5lY3Rpb25NZXRyaWNzIGdldE1ldHJpY3MoKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIGJ1ZmZlci5hcHBlbmQoIlsiKTsKLSAgICAgICAgaWYgKGlzT3BlbigpKSB7Ci0gICAgICAgICAgICBidWZmZXIuYXBwZW5kKHRoaXMuc29ja2V0LmdldEluZXRBZGRyZXNzKCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiY2xvc2VkIik7Ci0gICAgICAgIH0KLSAgICAgICAgYnVmZmVyLmFwcGVuZCgiXSIpOwotICAgICAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy90cmFuc3BvcnQvaHR0cC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9zZXJ2ZXIvQXhpc0h0dHBSZXF1ZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy90cmFuc3BvcnQvaHR0cC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9zZXJ2ZXIvQXhpc0h0dHBSZXF1ZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5NTYzOTkuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvdHJhbnNwb3J0L2h0dHAvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvc2VydmVyL0F4aXNIdHRwUmVxdWVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLnNlcnZlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IdHRwTWVzc2FnZTsKLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLXB1YmxpYyBpbnRlcmZhY2UgQXhpc0h0dHBSZXF1ZXN0IGV4dGVuZHMgSHR0cE1lc3NhZ2UgewotCi0gICAgU3RyaW5nIGdldE1ldGhvZCgpOwotICAgIAotICAgIFN0cmluZyBnZXRSZXF1ZXN0VVJJKCk7Ci0gICAgCi0gICAgU3RyaW5nIGdldENvbnRlbnRUeXBlKCk7Ci0gICAgCi0gICAgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKTsKLSAgICAKLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3RyYW5zcG9ydC9odHRwL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL3NlcnZlci9BeGlzSHR0cFJlcXVlc3RJbXBsLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy90cmFuc3BvcnQvaHR0cC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9zZXJ2ZXIvQXhpc0h0dHBSZXF1ZXN0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MmUyNjM4Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3RyYW5zcG9ydC9odHRwL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL3NlcnZlci9BeGlzSHR0cFJlcXVlc3RJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLnNlcnZlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IZWFkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5odHRwLkhlYWRlckl0ZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IdHRwRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IdHRwUmVxdWVzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAuUHJvdG9jb2xWZXJzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5wYXJhbXMuSHR0cFBhcmFtczsKLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAucHJvdG9jb2wuRXhlY3V0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAucHJvdG9jb2wuSFRUUDsKLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAucHJvdG9jb2wuSHR0cENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5odHRwLnByb3RvY29sLkh0dHBQcm9jZXNzb3I7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLXB1YmxpYyBjbGFzcyBBeGlzSHR0cFJlcXVlc3RJbXBsIGltcGxlbWVudHMgQXhpc0h0dHBSZXF1ZXN0IHsKLQotICAgIHByaXZhdGUgZmluYWwgSHR0cFJlcXVlc3QgcmVxdWVzdDsKLSAgICBwcml2YXRlIGZpbmFsIEF4aXNIdHRwQ29ubmVjdGlvbiBjb25uOwotICAgIHByaXZhdGUgZmluYWwgSHR0cFByb2Nlc3NvciBodHRwcHJvYzsKLSAgICBwcml2YXRlIGZpbmFsIEh0dHBDb250ZXh0IGNvbnRleHQ7Ci0gICAgCi0gICAgcHVibGljIEF4aXNIdHRwUmVxdWVzdEltcGwoCi0gICAgICAgICAgICBmaW5hbCBBeGlzSHR0cENvbm5lY3Rpb24gY29ubiwKLSAgICAgICAgICAgIGZpbmFsIEh0dHBSZXF1ZXN0IHJlcXVlc3QsIAotICAgICAgICAgICAgZmluYWwgSHR0cFByb2Nlc3NvciBodHRwcHJvYywKLSAgICAgICAgICAgIGZpbmFsIEh0dHBDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgaWYgKGNvbm4gPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSFRUUCBjb25uZWN0aW9uIG1heSBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChyZXF1ZXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkhUVFAgcmVxdWVzdCBtYXkgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaHR0cHByb2MgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSFRUUCBwcm9jZXNzb3IgbWF5IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNvbnRleHQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSFRUUCBjb250ZXh0IG1heSBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIHRoaXMucmVxdWVzdCA9IHJlcXVlc3Q7Ci0gICAgICAgIHRoaXMuY29ubiA9IGNvbm47Ci0gICAgICAgIHRoaXMuaHR0cHByb2MgPSBodHRwcHJvYzsKLSAgICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgcHJlcGFyZSgpIHRocm93cyBJT0V4Y2VwdGlvbiwgSHR0cEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMuY29udGV4dC5zZXRBdHRyaWJ1dGUoRXhlY3V0aW9uQ29udGV4dC5IVFRQX0NPTk5FQ1RJT04sIHRoaXMuY29ubik7Ci0gICAgICAgIHRoaXMuY29udGV4dC5zZXRBdHRyaWJ1dGUoRXhlY3V0aW9uQ29udGV4dC5IVFRQX1JFUVVFU1QsIHRoaXMucmVxdWVzdCk7Ci0gICAgICAgIAotICAgICAgICB0aGlzLmh0dHBwcm9jLnByb2Nlc3ModGhpcy5yZXF1ZXN0LCB0aGlzLmNvbnRleHQpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWV0aG9kKCkgewotICAgICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LmdldFJlcXVlc3RMaW5lKCkuZ2V0TWV0aG9kKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRSZXF1ZXN0VVJJKCkgewotICAgICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LmdldFJlcXVlc3RMaW5lKCkuZ2V0VXJpKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFByb3RvY29sVmVyc2lvbiBnZXRQcm90b2NvbFZlcnNpb24oKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3QuZ2V0UmVxdWVzdExpbmUoKS5nZXRQcm90b2NvbFZlcnNpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRUeXBlKCkgewotICAgICAgICBIZWFkZXIgaGVhZGVyID0gdGhpcy5yZXF1ZXN0LmdldEZpcnN0SGVhZGVyKEhUVFAuQ09OVEVOVF9UWVBFKTsKLSAgICAgICAgaWYgKGhlYWRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gaGVhZGVyLmdldFZhbHVlKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuY29ubi5nZXRJbnB1dFN0cmVhbSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZEhlYWRlcihmaW5hbCBIZWFkZXIgaGVhZGVyKSB7Ci0gICAgICAgIHRoaXMucmVxdWVzdC5hZGRIZWFkZXIoaGVhZGVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRIZWFkZXIoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIFN0cmluZyB2YWx1ZSkgewotICAgICAgICB0aGlzLnJlcXVlc3QuYWRkSGVhZGVyKG5hbWUsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0hlYWRlcihmaW5hbCBTdHJpbmcgbmFtZSkgewotICAgICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LmNvbnRhaW5zSGVhZGVyKG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBIZWFkZXJbXSBnZXRBbGxIZWFkZXJzKCkgewotICAgICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LmdldEFsbEhlYWRlcnMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSGVhZGVyIGdldEZpcnN0SGVhZGVyKGZpbmFsIFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3QuZ2V0Rmlyc3RIZWFkZXIobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIEhlYWRlcltdIGdldEhlYWRlcnMoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucmVxdWVzdC5nZXRIZWFkZXJzKG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBIZWFkZXIgZ2V0TGFzdEhlYWRlcihmaW5hbCBTdHJpbmcgbmFtZSkgewotICAgICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LmdldExhc3RIZWFkZXIobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIEhlYWRlckl0ZXJhdG9yIGhlYWRlckl0ZXJhdG9yKCkgewotICAgICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LmhlYWRlckl0ZXJhdG9yKCk7Ci0gICAgfQotCi0gICAgcHVibGljIEhlYWRlckl0ZXJhdG9yIGhlYWRlckl0ZXJhdG9yKGZpbmFsIFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3QuaGVhZGVySXRlcmF0b3IobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlSGVhZGVyKGZpbmFsIEhlYWRlciBoZWFkZXIpIHsKLSAgICAgICAgdGhpcy5yZXF1ZXN0LnJlbW92ZUhlYWRlcihoZWFkZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZUhlYWRlcnMoZmluYWwgU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgdGhpcy5yZXF1ZXN0LnJlbW92ZUhlYWRlcnMobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SGVhZGVyKGZpbmFsIEhlYWRlciBoZWFkZXIpIHsKLSAgICAgICAgdGhpcy5yZXF1ZXN0LnNldEhlYWRlcihoZWFkZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEhlYWRlcihmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMucmVxdWVzdC5zZXRIZWFkZXIobmFtZSwgdmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEhlYWRlcnMoSGVhZGVyW10gaGVhZGVycykgewotICAgICAgICB0aGlzLnJlcXVlc3Quc2V0SGVhZGVycyhoZWFkZXJzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSHR0cFBhcmFtcyBnZXRQYXJhbXMoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3QuZ2V0UGFyYW1zKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGFyYW1zKGZpbmFsIEh0dHBQYXJhbXMgcGFyYW1zKSB7Ci0gICAgICAgIHRoaXMucmVxdWVzdC5zZXRQYXJhbXMocGFyYW1zKTsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy90cmFuc3BvcnQvaHR0cC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9zZXJ2ZXIvQXhpc0h0dHBSZXNwb25zZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvdHJhbnNwb3J0L2h0dHAvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvc2VydmVyL0F4aXNIdHRwUmVzcG9uc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjgzYjBiMC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy90cmFuc3BvcnQvaHR0cC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9zZXJ2ZXIvQXhpc0h0dHBSZXNwb25zZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLnNlcnZlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IdHRwTWVzc2FnZTsKLQotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotCi1wdWJsaWMgaW50ZXJmYWNlIEF4aXNIdHRwUmVzcG9uc2UgZXh0ZW5kcyBIdHRwTWVzc2FnZSB7Ci0KLSAgICB2b2lkIHNldFN0YXR1cyhpbnQgc2MpOwotCi0gICAgdm9pZCBzZW5kRXJyb3IoaW50IHNjLCBTdHJpbmcgbXNnKTsKLSAgICAKLSAgICB2b2lkIHNlbmRFcnJvcihpbnQgc2MpOwotCi0gICAgdm9pZCBzZXRDb250ZW50VHlwZShTdHJpbmcgY29udGVudFR5cGUpOwotICAgIAotICAgIE91dHB1dFN0cmVhbSBnZXRPdXRwdXRTdHJlYW0oKTsKLSAgICAKLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3RyYW5zcG9ydC9odHRwL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL3NlcnZlci9BeGlzSHR0cFJlc3BvbnNlSW1wbC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvdHJhbnNwb3J0L2h0dHAvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvc2VydmVyL0F4aXNIdHRwUmVzcG9uc2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiNjMxNDUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvdHJhbnNwb3J0L2h0dHAvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvc2VydmVyL0F4aXNIdHRwUmVzcG9uc2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLnNlcnZlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lk91dFRyYW5zcG9ydEluZm87Ci1pbXBvcnQgb3JnLmFwYWNoZS5odHRwLkhlYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAuSGVhZGVySXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5odHRwLkh0dHBFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5odHRwLkh0dHBSZXNwb25zZTsKLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAuUHJvdG9jb2xWZXJzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5lbnRpdHkuQmFzaWNIdHRwRW50aXR5OwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5wYXJhbXMuSHR0cFBhcmFtczsKLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAucHJvdG9jb2wuRXhlY3V0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAucHJvdG9jb2wuSHR0cENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5odHRwLnByb3RvY29sLkh0dHBQcm9jZXNzb3I7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotCi1wdWJsaWMgY2xhc3MgQXhpc0h0dHBSZXNwb25zZUltcGwgaW1wbGVtZW50cyBBeGlzSHR0cFJlc3BvbnNlLCBPdXRUcmFuc3BvcnRJbmZvIHsKLQotICAgIHByaXZhdGUgZmluYWwgSHR0cFJlc3BvbnNlIHJlc3BvbnNlOwotICAgIHByaXZhdGUgZmluYWwgQXhpc0h0dHBDb25uZWN0aW9uIGNvbm47Ci0gICAgcHJpdmF0ZSBmaW5hbCBIdHRwUHJvY2Vzc29yIGh0dHBwcm9jOwotICAgIHByaXZhdGUgZmluYWwgSHR0cENvbnRleHQgY29udGV4dDsKLSAgICAKLSAgICBwcml2YXRlIEF1dG9Db21taXRPdXRwdXRTdHJlYW0gb3V0c3RyZWFtOwotICAgIHByaXZhdGUgU3RyaW5nIGNvbnRlbnRUeXBlOwotICAgIAotICAgIHByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiBjb21taXRlZDsKLSAgICAKLSAgICBwdWJsaWMgQXhpc0h0dHBSZXNwb25zZUltcGwoCi0gICAgICAgICAgICBmaW5hbCBBeGlzSHR0cENvbm5lY3Rpb24gY29ubiwKLSAgICAgICAgICAgIGZpbmFsIEh0dHBSZXNwb25zZSByZXNwb25zZSwgCi0gICAgICAgICAgICBmaW5hbCBIdHRwUHJvY2Vzc29yIGh0dHBwcm9jLAotICAgICAgICAgICAgZmluYWwgSHR0cENvbnRleHQgY29udGV4dCkgewotICAgICAgICBzdXBlcigpOwotICAgICAgICBpZiAocmVzcG9uc2UgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSFRUUCByZXNwb25zZSBtYXkgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY29ubiA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJIVFRQIGNvbm5lY3Rpb24gbWF5IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGh0dHBwcm9jID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkhUVFAgcHJvY2Vzc29yIG1heSBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjb250ZXh0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkhUVFAgY29udGV4dCBtYXkgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICB0aGlzLnJlc3BvbnNlID0gcmVzcG9uc2U7Ci0gICAgICAgIHRoaXMuY29ubiA9IGNvbm47Ci0gICAgICAgIHRoaXMuaHR0cHByb2MgPSBodHRwcHJvYzsKLSAgICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYXNzZXJ0Tm90Q29tbWl0dGVkKCkgewotICAgICAgICBpZiAodGhpcy5jb21taXRlZCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiUmVzcG9uc2UgYWxyZWFkeSBjb21taXR0ZWQiKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0NvbW1pdHRlZCgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuY29tbWl0ZWQ7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGNvbW1pdCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgSHR0cEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICh0aGlzLmNvbW1pdGVkKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy5jb21taXRlZCA9IHRydWU7Ci0gICAgICAgIAotICAgICAgICB0aGlzLmNvbnRleHQuc2V0QXR0cmlidXRlKEV4ZWN1dGlvbkNvbnRleHQuSFRUUF9DT05ORUNUSU9OLCB0aGlzLmNvbm4pOwotICAgICAgICB0aGlzLmNvbnRleHQuc2V0QXR0cmlidXRlKEV4ZWN1dGlvbkNvbnRleHQuSFRUUF9SRVNQT05TRSwgdGhpcy5yZXNwb25zZSk7Ci0gICAgICAgIAotICAgICAgICBCYXNpY0h0dHBFbnRpdHkgZW50aXR5ID0gbmV3IEJhc2ljSHR0cEVudGl0eSgpOwotICAgICAgICBlbnRpdHkuc2V0Q2h1bmtlZCh0cnVlKTsKLSAgICAgICAgZW50aXR5LnNldENvbnRlbnRUeXBlKHRoaXMuY29udGVudFR5cGUpOwotICAgICAgICAKLSAgICAgICAgdGhpcy5yZXNwb25zZS5zZXRFbnRpdHkoZW50aXR5KTsKLSAgICAgICAgCi0gICAgICAgIHRoaXMuaHR0cHByb2MucHJvY2Vzcyh0aGlzLnJlc3BvbnNlLCB0aGlzLmNvbnRleHQpOwotICAgICAgICB0aGlzLmNvbm4uc2VuZFJlc3BvbnNlKHRoaXMucmVzcG9uc2UpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgT3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbSgpIHsKLSAgICAgICAgaWYgKHRoaXMub3V0c3RyZWFtID09IG51bGwpIHsKLSAgICAgICAgICAgIHRoaXMub3V0c3RyZWFtID0gbmV3IEF1dG9Db21taXRPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpcy5vdXRzdHJlYW07Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2VuZEVycm9yKGludCBzYywgZmluYWwgU3RyaW5nIG1zZykgewotICAgICAgICBhc3NlcnROb3RDb21taXR0ZWQoKTsKLSAgICAgICAgUHJvdG9jb2xWZXJzaW9uIHZlciA9IHRoaXMucmVzcG9uc2UuZ2V0UHJvdG9jb2xWZXJzaW9uKCk7Ci0gICAgICAgIHRoaXMucmVzcG9uc2Uuc2V0U3RhdHVzTGluZSh2ZXIsIHNjLCBtc2cpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNlbmRFcnJvcihpbnQgc2MpIHsKLSAgICAgICAgYXNzZXJ0Tm90Q29tbWl0dGVkKCk7Ci0gICAgICAgIHRoaXMucmVzcG9uc2Uuc2V0U3RhdHVzQ29kZShzYyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U3RhdHVzKGludCBzYykgewotICAgICAgICBhc3NlcnROb3RDb21taXR0ZWQoKTsKLSAgICAgICAgdGhpcy5yZXNwb25zZS5zZXRTdGF0dXNDb2RlKHNjKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb250ZW50VHlwZShmaW5hbCBTdHJpbmcgY29udGVudFR5cGUpIHsKLSAgICAgICAgYXNzZXJ0Tm90Q29tbWl0dGVkKCk7Ci0gICAgICAgIHRoaXMuY29udGVudFR5cGUgPSBjb250ZW50VHlwZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJvdG9jb2xWZXJzaW9uIGdldFByb3RvY29sVmVyc2lvbigpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucmVzcG9uc2UuZ2V0UHJvdG9jb2xWZXJzaW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkSGVhZGVyKGZpbmFsIEhlYWRlciBoZWFkZXIpIHsKLSAgICAgICAgYXNzZXJ0Tm90Q29tbWl0dGVkKCk7Ci0gICAgICAgIHRoaXMucmVzcG9uc2UuYWRkSGVhZGVyKGhlYWRlcik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkSGVhZGVyKGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgYXNzZXJ0Tm90Q29tbWl0dGVkKCk7Ci0gICAgICAgIHRoaXMucmVzcG9uc2UuYWRkSGVhZGVyKG5hbWUsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0hlYWRlcihmaW5hbCBTdHJpbmcgbmFtZSkgewotICAgICAgICByZXR1cm4gdGhpcy5yZXNwb25zZS5jb250YWluc0hlYWRlcihuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSGVhZGVyW10gZ2V0QWxsSGVhZGVycygpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucmVzcG9uc2UuZ2V0QWxsSGVhZGVycygpOwotICAgIH0KLQotICAgIHB1YmxpYyBIZWFkZXIgZ2V0Rmlyc3RIZWFkZXIoZmluYWwgU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucmVzcG9uc2UuZ2V0Rmlyc3RIZWFkZXIobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIEhlYWRlcltdIGdldEhlYWRlcnMoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucmVzcG9uc2UuZ2V0SGVhZGVycyhuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSGVhZGVyIGdldExhc3RIZWFkZXIoZmluYWwgU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucmVzcG9uc2UuZ2V0TGFzdEhlYWRlcihuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSGVhZGVySXRlcmF0b3IgaGVhZGVySXRlcmF0b3IoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnJlc3BvbnNlLmhlYWRlckl0ZXJhdG9yKCk7Ci0gICAgfQotCi0gICAgcHVibGljIEhlYWRlckl0ZXJhdG9yIGhlYWRlckl0ZXJhdG9yKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnJlc3BvbnNlLmhlYWRlckl0ZXJhdG9yKG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZUhlYWRlcihmaW5hbCBIZWFkZXIgaGVhZGVyKSB7Ci0gICAgICAgIGFzc2VydE5vdENvbW1pdHRlZCgpOwotICAgICAgICB0aGlzLnJlc3BvbnNlLnJlbW92ZUhlYWRlcihoZWFkZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZUhlYWRlcnMoZmluYWwgU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgYXNzZXJ0Tm90Q29tbWl0dGVkKCk7Ci0gICAgICAgIHRoaXMucmVzcG9uc2UucmVtb3ZlSGVhZGVycyhuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRIZWFkZXIoZmluYWwgSGVhZGVyIGhlYWRlcikgewotICAgICAgICBhc3NlcnROb3RDb21taXR0ZWQoKTsKLSAgICAgICAgdGhpcy5yZXNwb25zZS5zZXRIZWFkZXIoaGVhZGVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRIZWFkZXIoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIFN0cmluZyB2YWx1ZSkgewotICAgICAgICBhc3NlcnROb3RDb21taXR0ZWQoKTsKLSAgICAgICAgdGhpcy5yZXNwb25zZS5zZXRIZWFkZXIobmFtZSwgdmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEhlYWRlcnMoSGVhZGVyW10gaGVhZGVycykgewotICAgICAgICBhc3NlcnROb3RDb21taXR0ZWQoKTsKLSAgICAgICAgdGhpcy5yZXNwb25zZS5zZXRIZWFkZXJzKGhlYWRlcnMpOwotICAgIH0KLQotICAgIHB1YmxpYyBIdHRwUGFyYW1zIGdldFBhcmFtcygpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucmVzcG9uc2UuZ2V0UGFyYW1zKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGFyYW1zKGZpbmFsIEh0dHBQYXJhbXMgcGFyYW1zKSB7Ci0gICAgICAgIHRoaXMucmVzcG9uc2Uuc2V0UGFyYW1zKHBhcmFtcyk7Ci0gICAgfQotICAgIAotICAgIGNsYXNzIEF1dG9Db21taXRPdXRwdXRTdHJlYW0gZXh0ZW5kcyBPdXRwdXRTdHJlYW0gewotCi0gICAgICAgIHByaXZhdGUgT3V0cHV0U3RyZWFtIG91dDsKLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBBdXRvQ29tbWl0T3V0cHV0U3RyZWFtKCkgewotICAgICAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBlbnN1cmVDb21taXR0ZWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBjb21taXQoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEh0dHBFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyAoSU9FeGNlcHRpb24pIG5ldyBJT0V4Y2VwdGlvbigpLmluaXRDYXVzZShleCk7ICAKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh0aGlzLm91dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5vdXQgPSBjb25uLmdldE91dHB1dFN0cmVhbSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBlbnN1cmVDb21taXR0ZWQoKTsKLSAgICAgICAgICAgIHRoaXMub3V0LmNsb3NlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZShmaW5hbCBieXRlW10gYiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGVuc3VyZUNvbW1pdHRlZCgpOwotICAgICAgICAgICAgdGhpcy5vdXQud3JpdGUoYiwgb2ZmLCBsZW4pOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgd3JpdGUoZmluYWwgYnl0ZVtdIGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBlbnN1cmVDb21taXR0ZWQoKTsKLSAgICAgICAgICAgIHRoaXMub3V0LndyaXRlKGIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgd3JpdGUoaW50IGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBlbnN1cmVDb21taXR0ZWQoKTsKLSAgICAgICAgICAgIHRoaXMub3V0LndyaXRlKGIpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgdm9pZCBmbHVzaCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBlbnN1cmVDb21taXR0ZWQoKTsKLSAgICAgICAgICAgIHRoaXMub3V0LmZsdXNoKCk7Ci0gICAgICAgIH0KLQotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3RyYW5zcG9ydC9odHRwL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL3NlcnZlci9BeGlzSHR0cFNlcnZpY2UuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3RyYW5zcG9ydC9odHRwL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL3NlcnZlci9BeGlzSHR0cFNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdlZWQwOS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy90cmFuc3BvcnQvaHR0cC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9zZXJ2ZXIvQXhpc0h0dHBTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLnNlcnZlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQMTFDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVAxMkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuQWRkcmVzc2luZ0hlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlRyYW5zcG9ydEluRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5UcmFuc3BvcnRPdXREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzRW5naW5lOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0LlJlcXVlc3RSZXNwb25zZVRyYW5zcG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkhUVFBDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLk1lc3NhZ2VDb250ZXh0QnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAuQ29ubmVjdGlvblJldXNlU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmFwYWNoZS5odHRwLkhlYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAuSHR0cEVudGl0eUVuY2xvc2luZ1JlcXVlc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5odHRwLkh0dHBFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5odHRwLkh0dHBSZXF1ZXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IdHRwUmVzcG9uc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5odHRwLkh0dHBSZXNwb25zZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5odHRwLkh0dHBTdGF0dXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5odHRwLkh0dHBWZXJzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5NZXRob2ROb3RTdXBwb3J0ZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5odHRwLlByb3RvY29sRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5Qcm90b2NvbFZlcnNpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5odHRwLlJlcXVlc3RMaW5lOwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5VbnN1cHBvcnRlZEh0dHBWZXJzaW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5wYXJhbXMuRGVmYXVsdGVkSHR0cFBhcmFtczsKLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAucGFyYW1zLkh0dHBQYXJhbXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5odHRwLnByb3RvY29sLkh0dHBDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5wcm90b2NvbC5IdHRwUHJvY2Vzc29yOwotCi1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuU29ja2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIGFuIGV4dGVuc2lvbiBvZiB0aGUgZGVmYXVsdCBIVFRQIHNlcnZpY2UgcmVzcG9uc2libGUgZm9yCi0gKiBtYWludGFpbmluZyBhbmQgcG9wdWxhdGluZyB0aGUge0BsaW5rIE1lc3NhZ2VDb250ZXh0fSBmb3IgaW5jb21pbmcgQXhpcwotICogcmVxdWVzdHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBBeGlzSHR0cFNlcnZpY2UgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIExPRyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEF4aXNIdHRwU2VydmljZS5jbGFzcyk7Ci0KLSAgICBwcml2YXRlIGZpbmFsIEh0dHBQcm9jZXNzb3IgaHR0cFByb2Nlc3NvcjsKLSAgICBwcml2YXRlIGZpbmFsIENvbm5lY3Rpb25SZXVzZVN0cmF0ZWd5IGNvbm5TdHJhdGVneTsKLSAgICBwcml2YXRlIGZpbmFsIEh0dHBSZXNwb25zZUZhY3RvcnkgcmVzcG9uc2VGYWN0b3J5OwotICAgIHByaXZhdGUgZmluYWwgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlndXJhdGlvbkNvbnRleHQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBXb3JrZXIgd29ya2VyOwotCi0gICAgcHJpdmF0ZSBIdHRwUGFyYW1zIHBhcmFtczsKLQotICAgIHB1YmxpYyBBeGlzSHR0cFNlcnZpY2UoCi0gICAgICAgICAgICBmaW5hbCBIdHRwUHJvY2Vzc29yIGh0dHBQcm9jZXNzb3IsCi0gICAgICAgICAgICBmaW5hbCBDb25uZWN0aW9uUmV1c2VTdHJhdGVneSBjb25uU3RyYXRlZ3ksCi0gICAgICAgICAgICBmaW5hbCBIdHRwUmVzcG9uc2VGYWN0b3J5IHJlc3BvbnNlRmFjdG9yeSwKLSAgICAgICAgICAgIGZpbmFsIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ3VyYXRpb25Db250ZXh0LAotICAgICAgICAgICAgZmluYWwgV29ya2VyIHdvcmtlcikgewotICAgICAgICBzdXBlcigpOwotICAgICAgICBpZiAoaHR0cFByb2Nlc3NvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJIVFRQIHByb2Nlc3NvciBtYXkgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY29ublN0cmF0ZWd5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNvbm5lY3Rpb24gc3RyYXRlZ3kgbWF5IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJlc3BvbnNlRmFjdG9yeSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZXNwb25zZSBmYWN0b3J5IG1heSBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmICh3b3JrZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiV29ya2VyIG1heSBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjb25maWd1cmF0aW9uQ29udGV4dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDb25maWd1cmF0aW9uIGNvbnRleHQgbWF5IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy5odHRwUHJvY2Vzc29yID0gaHR0cFByb2Nlc3NvcjsKLSAgICAgICAgdGhpcy5jb25uU3RyYXRlZ3kgPSBjb25uU3RyYXRlZ3k7Ci0gICAgICAgIHRoaXMucmVzcG9uc2VGYWN0b3J5ID0gcmVzcG9uc2VGYWN0b3J5OwotICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb25Db250ZXh0ID0gY29uZmlndXJhdGlvbkNvbnRleHQ7Ci0gICAgICAgIHRoaXMud29ya2VyID0gd29ya2VyOwotCi0gICAgfQotCi0gICAgcHVibGljIEh0dHBQYXJhbXMgZ2V0UGFyYW1zKCkgewotICAgICAgICByZXR1cm4gdGhpcy5wYXJhbXM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGFyYW1zKGZpbmFsIEh0dHBQYXJhbXMgcGFyYW1zKSB7Ci0gICAgICAgIHRoaXMucGFyYW1zID0gcGFyYW1zOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGhhbmRsZVJlcXVlc3QoZmluYWwgQXhpc0h0dHBDb25uZWN0aW9uIGNvbm4sIGZpbmFsIEh0dHBDb250ZXh0IGNvbnRleHQpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIEh0dHBFeGNlcHRpb24gewotCi0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQgPSBjb25maWd1cmF0aW9uQ29udGV4dC5jcmVhdGVNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBtc2dDb250ZXh0LnNldEluY29taW5nVHJhbnNwb3J0TmFtZShDb25zdGFudHMuVFJBTlNQT1JUX0hUVFApOwotCi0gICAgICAgIGlmIChjb25uICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1zZ0NvbnRleHQuc2V0UHJvcGVydHkoTWVzc2FnZUNvbnRleHQuUkVNT1RFX0FERFIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm4uZ2V0UmVtb3RlQWRkcmVzcygpLmdldEhvc3RBZGRyZXNzKCkpOwotICAgICAgICAgICAgbXNnQ29udGV4dC5zZXRQcm9wZXJ0eShNZXNzYWdlQ29udGV4dC5UUkFOU1BPUlRfQUREUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubi5nZXRMb2NhbEFkZHJlc3MoKS5nZXRIb3N0QWRkcmVzcygpKTsKLQotICAgICAgICAgICAgaWYgKExPRy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgTE9HLmRlYnVnKCJSZW1vdGUgYWRkcmVzcyBvZiB0aGUgY29ubmVjdGlvbiA6ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uLmdldFJlbW90ZUFkZHJlc3MoKS5nZXRIb3N0QWRkcmVzcygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEh0dHBSZXNwb25zZSByZXNwb25zZTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEh0dHBSZXF1ZXN0IHJlcXVlc3QgPSBjb25uLnJlY2VpdmVSZXF1ZXN0KCk7Ci0gICAgICAgICAgICBSZXF1ZXN0TGluZSByZXF1ZXN0TGluZSA9IHJlcXVlc3QuZ2V0UmVxdWVzdExpbmUoKTsKLSAgICAgICAgICAgIGlmIChyZXF1ZXN0TGluZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbXNnQ29udGV4dC5zZXRQcm9wZXJ0eShIVFRQQ29uc3RhbnRzLkhUVFBfTUVUSE9ELCByZXF1ZXN0TGluZS5nZXRNZXRob2QoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXF1ZXN0LnNldFBhcmFtcygKLSAgICAgICAgICAgICAgICBuZXcgRGVmYXVsdGVkSHR0cFBhcmFtcyhyZXF1ZXN0LmdldFBhcmFtcygpLCB0aGlzLnBhcmFtcykpOwotICAgICAgICAgICAgUHJvdG9jb2xWZXJzaW9uIHZlciA9IHJlcXVlc3QuZ2V0UmVxdWVzdExpbmUoKS5nZXRQcm90b2NvbFZlcnNpb24oKTsKLSAgICAgICAgICAgIGlmICghdmVyLmxlc3NFcXVhbHMoSHR0cFZlcnNpb24uSFRUUF8xXzEpKSB7Ci0gICAgICAgICAgICAgICAgLy8gRG93bmdyYWRlIHByb3RvY29sIHZlcnNpb24gaWYgZ3JlYXRlciB0aGFuIEhUVFAvMS4xIAotICAgICAgICAgICAgICAgIHZlciA9IEh0dHBWZXJzaW9uLkhUVFBfMV8xOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXNwb25zZSA9IHRoaXMucmVzcG9uc2VGYWN0b3J5Lm5ld0h0dHBSZXNwb25zZQotICAgICAgICAgICAgICAgICAgICAodmVyLCBIdHRwU3RhdHVzLlNDX09LLCBjb250ZXh0KTsKLSAgICAgICAgICAgIHJlc3BvbnNlLnNldFBhcmFtcygKLSAgICAgICAgICAgICAgICBuZXcgRGVmYXVsdGVkSHR0cFBhcmFtcyhyZXNwb25zZS5nZXRQYXJhbXMoKSwgdGhpcy5wYXJhbXMpKTsKLQotICAgICAgICAgICAgaWYgKHJlcXVlc3QgaW5zdGFuY2VvZiBIdHRwRW50aXR5RW5jbG9zaW5nUmVxdWVzdCkgewotICAgICAgICAgICAgICAgIGlmICgoKEh0dHBFbnRpdHlFbmNsb3NpbmdSZXF1ZXN0KSByZXF1ZXN0KS5leHBlY3RDb250aW51ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEh0dHBSZXNwb25zZSBhY2sgPSB0aGlzLnJlc3BvbnNlRmFjdG9yeS5uZXdIdHRwUmVzcG9uc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVyLCBIdHRwU3RhdHVzLlNDX0NPTlRJTlVFLCBjb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgYWNrLnNldFBhcmFtcygKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBEZWZhdWx0ZWRIdHRwUGFyYW1zKGFjay5nZXRQYXJhbXMoKSwgdGhpcy5wYXJhbXMpKTsKLSAgICAgICAgICAgICAgICAgICAgY29ubi5zZW5kUmVzcG9uc2UoYWNrKTsKLSAgICAgICAgICAgICAgICAgICAgY29ubi5mbHVzaCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gQ3JlYXRlIEF4aXMgcmVxdWVzdCBhbmQgcmVzcG9uc2Ugb2JqZWN0cwotICAgICAgICAgICAgQXhpc0h0dHBSZXF1ZXN0SW1wbCBheGlzcmVxID0gbmV3IEF4aXNIdHRwUmVxdWVzdEltcGwoCi0gICAgICAgICAgICAgICAgICAgIGNvbm4sCi0gICAgICAgICAgICAgICAgICAgIHJlcXVlc3QsCi0gICAgICAgICAgICAgICAgICAgIHRoaXMuaHR0cFByb2Nlc3NvciwKLSAgICAgICAgICAgICAgICAgICAgY29udGV4dCk7Ci0gICAgICAgICAgICBBeGlzSHR0cFJlc3BvbnNlSW1wbCBheGlzcmVzID0gbmV3IEF4aXNIdHRwUmVzcG9uc2VJbXBsKAotICAgICAgICAgICAgICAgICAgICBjb25uLAotICAgICAgICAgICAgICAgICAgICByZXNwb25zZSwKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5odHRwUHJvY2Vzc29yLAotICAgICAgICAgICAgICAgICAgICBjb250ZXh0KTsKLQotICAgICAgICAgICAgLy8gUHJlcGFyZSBIVFRQIHJlcXVlc3QKLSAgICAgICAgICAgIGF4aXNyZXEucHJlcGFyZSgpOwotCi0gICAgICAgICAgICAvLyBSdW4gdGhlIHNlcnZpY2UKLSAgICAgICAgICAgIGRvU2VydmljZShheGlzcmVxLCBheGlzcmVzLCBjb250ZXh0LCBtc2dDb250ZXh0KTsKLQotICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSByZXF1ZXN0IGNvbnRlbnQgaXMgZnVsbHkgY29uc3VtZWQKLSAgICAgICAgICAgIElucHV0U3RyZWFtIGluc3RyZWFtID0gY29ubi5nZXRJbnB1dFN0cmVhbSgpOwotICAgICAgICAgICAgaWYgKGluc3RyZWFtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpbnN0cmVhbS5jbG9zZSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBDb21taXQgcmVzcG9uc2UgaWYgbm90IGNvbW1pdHRlZAotICAgICAgICAgICAgaWYgKCFheGlzcmVzLmlzQ29tbWl0dGVkKCkpIHsKLSAgICAgICAgICAgICAgICBheGlzcmVzLmNvbW1pdCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIHJlc3BvbnNlIGNvbnRlbnQgaXMgcHJvcGVybHkgdGVybWluYXRlZAotICAgICAgICAgICAgT3V0cHV0U3RyZWFtIG91dHN0cmVhbSA9IGNvbm4uZ2V0T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICBpZiAob3V0c3RyZWFtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBvdXRzdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IGNhdGNoIChIdHRwRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICByZXNwb25zZSA9IHRoaXMucmVzcG9uc2VGYWN0b3J5Lm5ld0h0dHBSZXNwb25zZQotICAgICAgICAgICAgICAgICAgICAoSHR0cFZlcnNpb24uSFRUUF8xXzAsIEh0dHBTdGF0dXMuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SLAotICAgICAgICAgICAgICAgICAgICAgY29udGV4dCk7Ci0gICAgICAgICAgICByZXNwb25zZS5zZXRQYXJhbXMoCi0gICAgICAgICAgICAgICAgbmV3IERlZmF1bHRlZEh0dHBQYXJhbXMocmVzcG9uc2UuZ2V0UGFyYW1zKCksIHRoaXMucGFyYW1zKSk7Ci0gICAgICAgICAgICBoYW5kbGVFeGNlcHRpb24oZXgsIHJlc3BvbnNlKTsKLSAgICAgICAgICAgIHRoaXMuaHR0cFByb2Nlc3Nvci5wcm9jZXNzKHJlc3BvbnNlLCBjb250ZXh0KTsKLSAgICAgICAgICAgIGNvbm4uc2VuZFJlc3BvbnNlKHJlc3BvbnNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGNvbm4uZmx1c2goKTsKLSAgICAgICAgaWYgKCF0aGlzLmNvbm5TdHJhdGVneS5rZWVwQWxpdmUocmVzcG9uc2UsIGNvbnRleHQpKSB7Ci0gICAgICAgICAgICBjb25uLmNsb3NlKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjb25uLnJlc2V0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVFeGNlcHRpb24oZmluYWwgSHR0cEV4Y2VwdGlvbiBleCwgZmluYWwgSHR0cFJlc3BvbnNlIHJlc3BvbnNlKSB7Ci0gICAgICAgIGlmIChleCBpbnN0YW5jZW9mIE1ldGhvZE5vdFN1cHBvcnRlZEV4Y2VwdGlvbikgewotICAgICAgICAgICAgcmVzcG9uc2Uuc2V0U3RhdHVzQ29kZShIdHRwU3RhdHVzLlNDX05PVF9JTVBMRU1FTlRFRCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoZXggaW5zdGFuY2VvZiBVbnN1cHBvcnRlZEh0dHBWZXJzaW9uRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICByZXNwb25zZS5zZXRTdGF0dXNDb2RlKEh0dHBTdGF0dXMuU0NfSFRUUF9WRVJTSU9OX05PVF9TVVBQT1JURUQpOwotICAgICAgICB9IGVsc2UgaWYgKGV4IGluc3RhbmNlb2YgUHJvdG9jb2xFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHJlc3BvbnNlLnNldFN0YXR1c0NvZGUoSHR0cFN0YXR1cy5TQ19CQURfUkVRVUVTVCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXNwb25zZS5zZXRTdGF0dXNDb2RlKEh0dHBTdGF0dXMuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGRvU2VydmljZSgKLSAgICAgICAgICAgIGZpbmFsIEF4aXNIdHRwUmVxdWVzdCByZXF1ZXN0LAotICAgICAgICAgICAgZmluYWwgQXhpc0h0dHBSZXNwb25zZSByZXNwb25zZSwKLSAgICAgICAgICAgIGZpbmFsIEh0dHBDb250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICBmaW5hbCBNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB0aHJvd3MgSHR0cEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotICAgICAgICBpZiAoTE9HLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIExPRy5kZWJ1ZygiUmVxdWVzdCBtZXRob2Q6ICIgKyByZXF1ZXN0LmdldE1ldGhvZCgpKTsKLSAgICAgICAgICAgIExPRy5kZWJ1ZygiVGFyZ2V0IFVSSTogIiArIHJlcXVlc3QuZ2V0UmVxdWVzdFVSSSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBUcmFuc3BvcnRPdXREZXNjcmlwdGlvbiB0cmFuc3BvcnRPdXQgPSB0aGlzLmNvbmZpZ3VyYXRpb25Db250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCkKLSAgICAgICAgICAgICAgICAgICAgLmdldFRyYW5zcG9ydE91dChDb25zdGFudHMuVFJBTlNQT1JUX0hUVFApOwotICAgICAgICAgICAgVHJhbnNwb3J0SW5EZXNjcmlwdGlvbiB0cmFuc3BvcnRJbiA9IHRoaXMuY29uZmlndXJhdGlvbkNvbnRleHQuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKQotICAgICAgICAgICAgICAgICAgICAuZ2V0VHJhbnNwb3J0SW4oQ29uc3RhbnRzLlRSQU5TUE9SVF9IVFRQKTsKLQotICAgICAgICAgICAgU3RyaW5nIHNlc3Npb25LZXkgPSAoU3RyaW5nKSBjb250ZXh0LmdldEF0dHJpYnV0ZShIVFRQQ29uc3RhbnRzLkNPT0tJRV9TVFJJTkcpOwotICAgICAgICAgICAgbXNnQ29udGV4dC5zZXRUcmFuc3BvcnRJbih0cmFuc3BvcnRJbik7Ci0gICAgICAgICAgICBtc2dDb250ZXh0LnNldFRyYW5zcG9ydE91dCh0cmFuc3BvcnRPdXQpOwotICAgICAgICAgICAgbXNnQ29udGV4dC5zZXRTZXJ2ZXJTaWRlKHRydWUpOwotICAgICAgICAgICAgbXNnQ29udGV4dC5zZXRQcm9wZXJ0eShIVFRQQ29uc3RhbnRzLkNPT0tJRV9TVFJJTkcsIHNlc3Npb25LZXkpOwotICAgICAgICAgICAgbXNnQ29udGV4dC5zZXRQcm9wZXJ0eShDb25zdGFudHMuQ29uZmlndXJhdGlvbi5UUkFOU1BPUlRfSU5fVVJMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmdldFJlcXVlc3RVUkkoKSk7Ci0KLSAgICAgICAgICAgIC8vIHNldCB0aGUgdHJhbnNwb3J0IEhlYWRlcnMKLSAgICAgICAgICAgIEhhc2hNYXAgaGVhZGVyTWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSByZXF1ZXN0LmhlYWRlckl0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICBIZWFkZXIgaGVhZGVyID0gKEhlYWRlcikgaXQubmV4dCgpOwotICAgICAgICAgICAgICAgIGhlYWRlck1hcC5wdXQoaGVhZGVyLmdldE5hbWUoKSwgaGVhZGVyLmdldFZhbHVlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbXNnQ29udGV4dC5zZXRQcm9wZXJ0eShNZXNzYWdlQ29udGV4dC5UUkFOU1BPUlRfSEVBREVSUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyTWFwKTsKLSAgICAgICAgICAgIG1zZ0NvbnRleHQuc2V0UHJvcGVydHkoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uQ09OVEVOVF9UWVBFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmdldENvbnRlbnRUeXBlKCkpOwotCi0gICAgICAgICAgICBtc2dDb250ZXh0LnNldFByb3BlcnR5KE1lc3NhZ2VDb250ZXh0LlRSQU5TUE9SVF9PVVQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmdldE91dHB1dFN0cmVhbSgpKTsKLSAgICAgICAgICAgIG1zZ0NvbnRleHQuc2V0UHJvcGVydHkoQ29uc3RhbnRzLk9VVF9UUkFOU1BPUlRfSU5GTywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UpOwotICAgICAgICAgICAgbXNnQ29udGV4dC5zZXRUbyhuZXcgRW5kcG9pbnRSZWZlcmVuY2UocmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCkpKTsKLSAgICAgICAgICAgIG1zZ0NvbnRleHQuc2V0UHJvcGVydHkoUmVxdWVzdFJlc3BvbnNlVHJhbnNwb3J0LlRSQU5TUE9SVF9DT05UUk9MLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU2ltcGxlSFRUUFJlcXVlc3RSZXNwb25zZVRyYW5zcG9ydCgpKTsKLQotCi0gICAgICAgICAgICB0aGlzLndvcmtlci5zZXJ2aWNlKHJlcXVlc3QsIHJlc3BvbnNlLCBtc2dDb250ZXh0KTsKLSAgICAgICAgfSBjYXRjaCAoU29ja2V0RXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAvLyBTb2NrZXQgaXMgdW5yZWxpYWJsZS4gCi0gICAgICAgICAgICB0aHJvdyBleDsKLSAgICAgICAgfSBjYXRjaCAoSHR0cEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgLy8gSFRUUCBwcm90b2NvbCB2aW9sYXRpb24uIFRyYW5zcG9ydCBpcyB1bnJlbGlhYmxlCi0gICAgICAgICAgICB0aHJvdyBleDsKLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLQotICAgICAgICAgICAgbXNnQ29udGV4dC5zZXRQcm9wZXJ0eShNZXNzYWdlQ29udGV4dC5UUkFOU1BPUlRfT1VULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5nZXRPdXRwdXRTdHJlYW0oKSk7Ci0gICAgICAgICAgICBtc2dDb250ZXh0LnNldFByb3BlcnR5KENvbnN0YW50cy5PVVRfVFJBTlNQT1JUX0lORk8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlKTsKLQotICAgICAgICAgICAgTWVzc2FnZUNvbnRleHQgZmF1bHRDb250ZXh0ID0KLSAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUNvbnRleHRCdWlsZGVyLmNyZWF0ZUZhdWx0TWVzc2FnZUNvbnRleHQobXNnQ29udGV4dCwgZSk7Ci0gICAgICAgICAgICAvLyBJZiB0aGUgZmF1bHQgaXMgbm90IGdvaW5nIGFsb25nIHRoZSBiYWNrIGNoYW5uZWwgd2Ugc2hvdWxkIGJlIDIwMmluZwotICAgICAgICAgICAgaWYgKEFkZHJlc3NpbmdIZWxwZXIuaXNGYXVsdFJlZGlyZWN0ZWQobXNnQ29udGV4dCkpIHsKLSAgICAgICAgICAgICAgICByZXNwb25zZS5zZXRTdGF0dXMoSHR0cFN0YXR1cy5TQ19BQ0NFUFRFRCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFN0cmluZyBzdGF0ZSA9IChTdHJpbmcpIG1zZ0NvbnRleHQuZ2V0UHJvcGVydHkoQ29uc3RhbnRzLkhUVFBfUkVTUE9OU0VfU1RBVEUpOwotICAgICAgICAgICAgICAgIGlmIChzdGF0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBzdGF0ZUludCA9IEludGVnZXIucGFyc2VJbnQoc3RhdGUpOwotICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5zZXRTdGF0dXMoc3RhdGVJbnQpOwotICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGVJbnQgPT0gSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19VTkFVVEhPUklaRUQpIHsgLy8gVW5hdXRob3JpemVkCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmVhbG0gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU3RyaW5nKSBtc2dDb250ZXh0LmdldFByb3BlcnR5KENvbnN0YW50cy5IVFRQX0JBU0lDX0FVVEhfUkVBTE0pOwotICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuYWRkSGVhZGVyKCJXV1ctQXV0aGVudGljYXRlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFzaWMgcmVhbG09XCIiICsgcmVhbG0gKyAiXCIiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgQXhpc0ZhdWx0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IoZ2V0U3RhdHVzRnJvbUF4aXNGYXVsdCgoQXhpc0ZhdWx0KWUpLCBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IoSHR0cFN0YXR1cy5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludGVybmFsIHNlcnZlciBlcnJvciIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgQXhpc0VuZ2luZS5zZW5kRmF1bHQoZmF1bHRDb250ZXh0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0U3RhdHVzRnJvbUF4aXNGYXVsdChBeGlzRmF1bHQgZmF1bHQpIHsKLSAgICAgICAgUU5hbWUgZmF1bHRDb2RlID0gZmF1bHQuZ2V0RmF1bHRDb2RlKCk7Ci0gICAgICAgIGlmIChTT0FQMTJDb25zdGFudHMuUU5BTUVfU0VOREVSX0ZBVUxUQ09ERS5lcXVhbHMoZmF1bHRDb2RlKSB8fAotICAgICAgICAgICAgICAgIFNPQVAxMUNvbnN0YW50cy5RTkFNRV9TRU5ERVJfRkFVTFRDT0RFLmVxdWFscyhmYXVsdENvZGUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19CQURfUkVRVUVTVDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUjsKLSAgICB9Ci0KLSAgICBjbGFzcyBTaW1wbGVIVFRQUmVxdWVzdFJlc3BvbnNlVHJhbnNwb3J0IGltcGxlbWVudHMgUmVxdWVzdFJlc3BvbnNlVHJhbnNwb3J0IHsKLQotICAgICAgICBwcml2YXRlIENvdW50RG93bkxhdGNoIHJlc3BvbnNlUmVhZHlTaWduYWwgPSBuZXcgQ291bnREb3duTGF0Y2goMSk7Ci0gICAgICAgIFJlcXVlc3RSZXNwb25zZVRyYW5zcG9ydFN0YXR1cyBzdGF0dXMgPSBSZXF1ZXN0UmVzcG9uc2VUcmFuc3BvcnRTdGF0dXMuV0FJVElORzsKLSAgICAgICAgQXhpc0ZhdWx0IGZhdWx0VG9CZVRocm93bk91dCA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiByZXNwb25zZVdyaXR0ZW4gPSBmYWxzZTsKLQotICAgICAgICBwdWJsaWMgdm9pZCBhY2tub3dsZWRnZU1lc3NhZ2UoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgICAgICAvL1RPRE86IE9uY2UgdGhlIGNvcmUgSFRUUCBBUEkgYWxsb3dzIHVzIHRvIHJldHVybiBhbiBhY2sgYmVmb3JlIHVud2luZGluZywgdGhlbiB0aGUgc2hvdWxkIGJlIGZpeGVkCi0gICAgICAgICAgICBzdGF0dXMgPSBSZXF1ZXN0UmVzcG9uc2VUcmFuc3BvcnRTdGF0dXMuQUNLRUQ7Ci0gICAgICAgICAgICByZXNwb25zZVJlYWR5U2lnbmFsLmNvdW50RG93bigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgYXdhaXRSZXNwb25zZSgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgQXhpc0ZhdWx0IHsKLSAgICAgICAgICAgIHJlc3BvbnNlUmVhZHlTaWduYWwuYXdhaXQoKTsKLQotICAgICAgICAgICAgaWYgKGZhdWx0VG9CZVRocm93bk91dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgZmF1bHRUb0JlVGhyb3duT3V0OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2lnbmFsUmVzcG9uc2VSZWFkeSgpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IFJlcXVlc3RSZXNwb25zZVRyYW5zcG9ydFN0YXR1cy5TSUdOQUxMRUQ7Ci0gICAgICAgICAgICByZXNwb25zZVJlYWR5U2lnbmFsLmNvdW50RG93bigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFJlcXVlc3RSZXNwb25zZVRyYW5zcG9ydFN0YXR1cyBnZXRTdGF0dXMoKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2lnbmFsRmF1bHRSZWFkeShBeGlzRmF1bHQgZmF1bHQpIHsKLSAgICAgICAgICAgIGZhdWx0VG9CZVRocm93bk91dCA9IGZhdWx0OwotICAgICAgICAgICAgc2lnbmFsUmVzcG9uc2VSZWFkeSgpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1Jlc3BvbnNlV3JpdHRlbigpIHsKLSAgICAgICAgICAgIHJldHVybiByZXNwb25zZVdyaXR0ZW47Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRSZXNwb25zZVdyaXR0ZW4oYm9vbGVhbiByZXNwb25zZVdyaXR0ZW4pIHsKLSAgICAgICAgICAgIHRoaXMucmVzcG9uc2VXcml0dGVuID0gcmVzcG9uc2VXcml0dGVuOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3RyYW5zcG9ydC9odHRwL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL3NlcnZlci9BeGlzUGFyYW1zLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy90cmFuc3BvcnQvaHR0cC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9zZXJ2ZXIvQXhpc1BhcmFtcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTQ4ZTQ1Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3RyYW5zcG9ydC9odHRwL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL3NlcnZlci9BeGlzUGFyYW1zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuc2VydmVyOwotCi1wdWJsaWMgY2xhc3MgQXhpc1BhcmFtcyB7Ci0KLSAgICBwcml2YXRlIEF4aXNQYXJhbXMoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElTVEVORVJfUE9SVCA9ICJheGlzLmxpc3RlbmVyLnBvcnQiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9DT05URVhUID0gImF4aXMubWVzc2FnZS5jb250ZXh0IjsKLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvdHJhbnNwb3J0L2h0dHAvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvc2VydmVyL0Nvbm5lY3Rpb25MaXN0ZW5lckZhaWx1cmVIYW5kbGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy90cmFuc3BvcnQvaHR0cC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9zZXJ2ZXIvQ29ubmVjdGlvbkxpc3RlbmVyRmFpbHVyZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I0ZTU5ZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy90cmFuc3BvcnQvaHR0cC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9zZXJ2ZXIvQ29ubmVjdGlvbkxpc3RlbmVyRmFpbHVyZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5zZXJ2ZXI7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgQ29ubmVjdGlvbkxpc3RlbmVyRmFpbHVyZUhhbmRsZXIgewotCi0gICAgLyoqCi0gICAgICogVGhlIGFzc29jaWF0ZWQgY29ubmVjdGlvbiBsaXN0ZW5lciBJT1Byb2Nlc3NvciBoYXMgZmFpbGVkCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29ubmVjdGlvbkxpc3RlbmVyIHRoZSBhc3NvY2lhdGVkIGNvbm5lY3Rpb24gbGlzdGVuZXIKLSAgICAgKiBAcGFyYW0gY2F1c2UgICAgICAgICAgICAgIGNhdXNlIG9mIGZhaWx1cmUKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGxpc3RlbmVyIHNob3VsZCBhdHRlbXB0IHRvIHJlLWVzdGFibGlzaCBpdHNlbGYsIGZhbHNlIGlmIGl0IHNob3VsZCB0ZXJtaW5hdGUuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZmFpbGVkKElPUHJvY2Vzc29yIGNvbm5lY3Rpb25MaXN0ZW5lciwgVGhyb3dhYmxlIGNhdXNlKTsKLQotICAgIC8qKgotICAgICAqIFRoZSBhc3NvY2lhdGVkIGNvbm5lY3Rpb24gbGlzdGVuZXIgSU9Qcm9jZXNzb3IgaXMgdGVybWluYXRpbmcgYWJub3JtYWxseQotICAgICAqCi0gICAgICogQHBhcmFtIGNvbm5lY3Rpb25MaXN0ZW5lciB0aGUgYXNzb2NpYXRlZCBjb25uZWN0aW9uIGxpc3RlbmVyCi0gICAgICogQHBhcmFtIG1lc3NhZ2UgICAgICAgICAgICBleHBsYW5hdGlvbiBvZiB0ZXJtaW5hdGlvbgotICAgICAqIEBwYXJhbSBjYXVzZSAgICAgICAgICAgICAgbGFzdCBleGNlcHRpb24gdGhhdCBpcyBjYXVzaW5nIHRlcm1pbmF0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgbm90aWZ5QWJub3JtYWxUZXJtaW5hdGlvbihJT1Byb2Nlc3NvciBjb25uZWN0aW9uTGlzdGVuZXIsIFN0cmluZyBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyb3dhYmxlIGNhdXNlKTsKLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvdHJhbnNwb3J0L2h0dHAvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvc2VydmVyL0RlZmF1bHRDb25uZWN0aW9uTGlzdGVuZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3RyYW5zcG9ydC9odHRwL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL3NlcnZlci9EZWZhdWx0Q29ubmVjdGlvbkxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5MzFjOGIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvdHJhbnNwb3J0L2h0dHAvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvc2VydmVyL0RlZmF1bHRDb25uZWN0aW9uTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuc2VydmVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5odHRwLnBhcmFtcy5IdHRwUGFyYW1zOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5TZXJ2ZXJTb2NrZXQ7Ci1pbXBvcnQgamF2YS5uZXQuU29ja2V0OwotCi1wdWJsaWMgY2xhc3MgRGVmYXVsdENvbm5lY3Rpb25MaXN0ZW5lciBpbXBsZW1lbnRzIElPUHJvY2Vzc29yIHsKLQotICAgIHByaXZhdGUgc3RhdGljIExvZyBMT0cgPSBMb2dGYWN0b3J5LmdldExvZyhEZWZhdWx0Q29ubmVjdGlvbkxpc3RlbmVyLmNsYXNzKTsKLQotICAgIHByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiBkZXN0cm95ZWQgPSBmYWxzZTsKLQotICAgIHByaXZhdGUgZmluYWwgaW50IHBvcnQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBIdHRwQ29ubmVjdGlvbk1hbmFnZXIgY29ubm1hbmFnZXI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBDb25uZWN0aW9uTGlzdGVuZXJGYWlsdXJlSGFuZGxlciBmYWlsdXJlSGFuZGxlcjsKLSAgICBwcml2YXRlIGZpbmFsIEh0dHBQYXJhbXMgcGFyYW1zOwotCi0gICAgcHJpdmF0ZSBTZXJ2ZXJTb2NrZXQgc2VydmVyc29ja2V0ID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIFVzZSB0aGlzIGNvbnN0cnVjdG9yIHRvIHByb3ZpZGUgYSBjdXN0b20gQ29ubmVjdGlvbkxpc3RlbmVyRmFpbHVyZUhhbmRsZXIsIGUuZy4gYnkgc3ViY2xhc3NpbmcgRGVmYXVsdENvbm5lY3Rpb25MaXN0ZW5lckZhaWx1cmVIYW5kbGVyCi0gICAgICovCi0gICAgcHVibGljIERlZmF1bHRDb25uZWN0aW9uTGlzdGVuZXIoCi0gICAgICAgICAgICBpbnQgcG9ydCwKLSAgICAgICAgICAgIGZpbmFsIEh0dHBDb25uZWN0aW9uTWFuYWdlciBjb25ubWFuYWdlciwKLSAgICAgICAgICAgIGZpbmFsIENvbm5lY3Rpb25MaXN0ZW5lckZhaWx1cmVIYW5kbGVyIGZhaWx1cmVIYW5kbGVyLAotICAgICAgICAgICAgZmluYWwgSHR0cFBhcmFtcyBwYXJhbXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIGlmIChjb25ubWFuYWdlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDb25uZWN0aW9uIG1hbmFnZXIgbWF5IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGZhaWx1cmVIYW5kbGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkZhaWx1cmUgaGFuZGxlciBtYXkgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocGFyYW1zID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkhUVFAgcGFyYW1ldGVycyBtYXkgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICB0aGlzLnBvcnQgPSBwb3J0OwotICAgICAgICB0aGlzLmNvbm5tYW5hZ2VyID0gY29ubm1hbmFnZXI7Ci0gICAgICAgIHRoaXMuZmFpbHVyZUhhbmRsZXIgPSBmYWlsdXJlSGFuZGxlcjsKLSAgICAgICAgdGhpcy5wYXJhbXMgPSBwYXJhbXM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgd2hpbGUgKCFUaHJlYWQuaW50ZXJydXB0ZWQoKSkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzZXJ2ZXJzb2NrZXQgPT0gbnVsbCB8fCBzZXJ2ZXJzb2NrZXQuaXNDbG9zZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKExPRy5pc0luZm9FbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0cuaW5mbygiTGlzdGVuaW5nIG9uIHBvcnQgIiArIHBvcnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyc29ja2V0ID0gbmV3IFNlcnZlclNvY2tldChwb3J0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlcnNvY2tldC5zZXRSZXVzZUFkZHJlc3ModHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgTE9HLmRlYnVnKCJXYWl0aW5nIGZvciBpbmNvbWluZyBIVFRQIGNvbm5lY3Rpb24iKTsKLSAgICAgICAgICAgICAgICAgICAgU29ja2V0IHNvY2tldCA9IHRoaXMuc2VydmVyc29ja2V0LmFjY2VwdCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoTE9HLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExPRy5kZWJ1ZygiSW5jb21pbmcgSFRUUCBjb25uZWN0aW9uIGZyb20gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvY2tldC5nZXRSZW1vdGVTb2NrZXRBZGRyZXNzKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIEF4aXNIdHRwQ29ubmVjdGlvbiBjb25uID0gbmV3IEF4aXNIdHRwQ29ubmVjdGlvbkltcGwoc29ja2V0LCB0aGlzLnBhcmFtcyk7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMuY29ubm1hbmFnZXIucHJvY2Vzcyhjb25uKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoKGphdmEuaW8uSW50ZXJydXB0ZWRJT0V4Y2VwdGlvbiBpZSkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsgCi0gICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChUaHJlYWQuaW50ZXJydXB0ZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFmYWlsdXJlSGFuZGxlci5mYWlsZWQodGhpcywgZXgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGRlc3Ryb3koKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHRoaXMuc2VydmVyc29ja2V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRoaXMuc2VydmVyc29ja2V0LmNsb3NlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkZXN0cm95KCkgewotICAgICAgICB0aGlzLmRlc3Ryb3llZCA9IHRydWU7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjbG9zZSgpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgaWYgKExPRy5pc1dhcm5FbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBMT0cud2FybigiSS9PIGVycm9yIGNsb3NpbmcgbGlzdGVuZXIiLCBleCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0Rlc3Ryb3llZCgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuZGVzdHJveWVkOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvdHJhbnNwb3J0L2h0dHAvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvc2VydmVyL0RlZmF1bHRDb25uZWN0aW9uTGlzdGVuZXJGYWlsdXJlSGFuZGxlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvdHJhbnNwb3J0L2h0dHAvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvc2VydmVyL0RlZmF1bHRDb25uZWN0aW9uTGlzdGVuZXJGYWlsdXJlSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjE1MjIyLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3RyYW5zcG9ydC9odHRwL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL3NlcnZlci9EZWZhdWx0Q29ubmVjdGlvbkxpc3RlbmVyRmFpbHVyZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuc2VydmVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLS8qKgotICogRGVmYXVsdCBoYW5kZXIgZm9yIGZhaWx1cmVzIGluIGNvbm5lY3Rpb24gbGlzdGVuZXIgSU9Qcm9jZXNzb3JzLgotICogU3VwcG9ydHMgY29uZmlndXJhdGlvbiBvZiBudW1iZXIgcmV0cmllcywgZGVsYXkgcGVyIHJldHJ5LCBhbmQgdXB0aW1lIGludGVydmFsIGNvbnNpZGVyZWQgYSBzdWNjZXNzIChyZXNldHMgbnVtYmVyIHJldHJpZXMgdG8gemVybykuCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWZhdWx0Q29ubmVjdGlvbkxpc3RlbmVyRmFpbHVyZUhhbmRsZXIgaW1wbGVtZW50cyBDb25uZWN0aW9uTGlzdGVuZXJGYWlsdXJlSGFuZGxlciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgTE9HID0gTG9nRmFjdG9yeS5nZXRMb2coRGVmYXVsdENvbm5lY3Rpb25MaXN0ZW5lckZhaWx1cmVIYW5kbGVyLmNsYXNzKTsKLQotICAgIHByb3RlY3RlZCBpbnQgcmV0cnlEZWxheTsKLSAgICBwcm90ZWN0ZWQgaW50IHN1Y2Nlc3NJbnRlcnZhbDsKLSAgICBwcm90ZWN0ZWQgaW50IG1heFJldHJpZXM7Ci0KLSAgICBwcml2YXRlIGxvbmcgbGFzdEZhaWx1cmU7Ci0gICAgcHJpdmF0ZSBsb25nIGxhc3RGaXJzdEZhaWx1cmU7Ci0gICAgcHJpdmF0ZSBpbnQgbnVtUmV0cmllczsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyBEZWZhdWx0Q29ubmVjdGlvbkxpc3RlbmVyRmFpbHVyZUhhbmRsZXIgd2l0aCBkZWZhdWx0IHNldHRpbmdzLgotICAgICAqIHJldHJ5RGVsYXkgaXMgMSBzZWNvbmQsIHN1Y2Nlc3NJbnRlcnZhbCBpcyA2MCBzZWNvbmRzLCBtYXhSZXRyaWVzIGlzIDEwCi0gICAgICovCi0gICAgcHVibGljIERlZmF1bHRDb25uZWN0aW9uTGlzdGVuZXJGYWlsdXJlSGFuZGxlcigpIHsKLSAgICAgICAgdGhpcygxMDAwLCA2MDAwMCwgMTApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyBEZWZhdWx0Q29ubmVjdGlvbkxpc3RlbmVyRmFpbHVyZUhhbmRsZXIKLSAgICAgKgotICAgICAqIEBwYXJhbSByZXRyeURlbGF5ICAgICAgbWlsbGlzIHRvIHdhaXQgYmVmb3JlIHJldHJ5aW5nCi0gICAgICogQHBhcmFtIHN1Y2Nlc3NJbnRlcnZhbCBtaWxsaXMgYWZ0ZXIgd2hpY2ggYW4gaW5pdGlhbCBvciByZXRyeSBhdHRlbXB0IHdpbGwgYmUgZGVlbWVkIGEgc3VjY2VzcywgcmVzZXR0aW5nIHJldHJ5IGNvdW50IHRvIDAKLSAgICAgKiBAcGFyYW0gbWF4UmV0cmllcyAgICAgIG1heGltdW0gbnVtYmVyIG9mIHJldHJpZXMgYWxsb3dlZCB3aXRob3V0IGEgc3VjY2VzcywgYWZ0ZXIgd2hpY2ggdGhlIGxpc3RlbmVyIHdpbGwgdGVybWluYXRlCi0gICAgICovCi0gICAgcHVibGljIERlZmF1bHRDb25uZWN0aW9uTGlzdGVuZXJGYWlsdXJlSGFuZGxlcihpbnQgcmV0cnlEZWxheSwgaW50IHN1Y2Nlc3NJbnRlcnZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXhSZXRyaWVzKSB7Ci0gICAgICAgIHRoaXMucmV0cnlEZWxheSA9IHJldHJ5RGVsYXk7Ci0gICAgICAgIHRoaXMuc3VjY2Vzc0ludGVydmFsID0gc3VjY2Vzc0ludGVydmFsOwotICAgICAgICB0aGlzLm1heFJldHJpZXMgPSBtYXhSZXRyaWVzOwotICAgICAgICB0aGlzLmxhc3RGYWlsdXJlID0gdGhpcy5sYXN0Rmlyc3RGYWlsdXJlID0gTG9uZy5NSU5fVkFMVUU7Ci0gICAgICAgIHRoaXMubnVtUmV0cmllcyA9IDA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGVmYXVsdCBiZWhhdmlvciBpcyB0byBsb2cgYSB3YXJuaW5nIGFuZCBhdHRlbXB0IHJldHJ5IHBlciBjb25zdHJ1Y3RvciBjb25maWcsIGV2ZW50dWFsbHkgZmFpbGluZyB3aXRoIGEgbG9nZ2VkIGVycm9yIGFuZCBub3RpZmljYXRpb24uCi0gICAgICogTWF5IHN1YmNsYXNzIGFuZCBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBjaGFuZ2UgdGhlIGJlaGF2aW9yLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGZhaWxlZChJT1Byb2Nlc3NvciBjb25uZWN0aW9uTGlzdGVuZXIsIFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICBsb25nIG5vdyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICBpZiAobm93ID4gbGFzdEZhaWx1cmUgKyBzdWNjZXNzSW50ZXJ2YWwpIHsKLSAgICAgICAgICAgIG51bVJldHJpZXMgPSAwOwotICAgICAgICAgICAgbGFzdEZpcnN0RmFpbHVyZSA9IG5vdzsKLSAgICAgICAgfQotICAgICAgICBsYXN0RmFpbHVyZSA9IG5vdzsKLSAgICAgICAgaWYgKG51bVJldHJpZXMgPj0gbWF4UmV0cmllcykgewotICAgICAgICAgICAgbm90aWZ5QWJub3JtYWxUZXJtaW5hdGlvbigKLSAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbkxpc3RlbmVyLAotICAgICAgICAgICAgICAgICAgICAiVGVybWluYXRpbmcgY29ubmVjdGlvbiBsaXN0ZW5lciAiICsgY29ubmVjdGlvbkxpc3RlbmVyICsgIiBhZnRlciAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1SZXRyaWVzICsgInJldHJpZXMgaW4gIiArIChub3cgLSBsYXN0Rmlyc3RGYWlsdXJlKSAvIDEwMDAgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgc2Vjb25kcy4iLAotICAgICAgICAgICAgICAgICAgICBjYXVzZSk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBudW1SZXRyaWVzKys7Ci0gICAgICAgICAgICBpZiAoTE9HLmlzV2FybkVuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIExPRy53YXJuKCJBdHRlbXB0IG51bWJlciAiICsgbnVtUmV0cmllcyArICIgb2YgIiArIG1heFJldHJpZXMgKwotICAgICAgICAgICAgICAgICAgICAgICAgIiB0byByZWVzdGFsaXNoIGNvbm5lY3Rpb24gbGlzdGVuZXIgIiArIGNvbm5lY3Rpb25MaXN0ZW5lciArCi0gICAgICAgICAgICAgICAgICAgICAgICAiIGR1ZSB0byBmYWlsdXJlICIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2F1c2UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZWZhdWx0IGJldmFyaW9yIGlzIHRvIGxvZyB0aGUgZXJyb3IuCi0gICAgICogTWF5IHN1YmNsYXNzIGFuZCBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBjaGFuZ2UgYmVoYXZpb3IuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgbm90aWZ5QWJub3JtYWxUZXJtaW5hdGlvbihJT1Byb2Nlc3NvciBjb25uZWN0aW9uTGlzdGVuZXIsIFN0cmluZyBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyb3dhYmxlIGNhdXNlKSB7Ci0gICAgICAgIExPRy5lcnJvcihtZXNzYWdlLCBjYXVzZSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy90cmFuc3BvcnQvaHR0cC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9zZXJ2ZXIvRGVmYXVsdEh0dHBDb25uZWN0aW9uTWFuYWdlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvdHJhbnNwb3J0L2h0dHAvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvc2VydmVyL0RlZmF1bHRIdHRwQ29ubmVjdGlvbk1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc5NmJiMi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy90cmFuc3BvcnQvaHR0cC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9zZXJ2ZXIvRGVmYXVsdEh0dHBDb25uZWN0aW9uTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5zZXJ2ZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5odHRwLkNvbm5lY3Rpb25SZXVzZVN0cmF0ZWd5OwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IdHRwUmVzcG9uc2VGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5pbXBsLkRlZmF1bHRDb25uZWN0aW9uUmV1c2VTdHJhdGVneTsKLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAuaW1wbC5EZWZhdWx0SHR0cFJlc3BvbnNlRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAucGFyYW1zLkh0dHBQYXJhbXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5odHRwLnByb3RvY29sLkJhc2ljSHR0cFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAucHJvdG9jb2wuSHR0cFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAucHJvdG9jb2wuUmVzcG9uc2VDb25uQ29udHJvbDsKLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAucHJvdG9jb2wuUmVzcG9uc2VDb250ZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5wcm90b2NvbC5SZXNwb25zZURhdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5odHRwLnByb3RvY29sLlJlc3BvbnNlU2VydmVyOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yOwotCi1wdWJsaWMgY2xhc3MgRGVmYXVsdEh0dHBDb25uZWN0aW9uTWFuYWdlciBpbXBsZW1lbnRzIEh0dHBDb25uZWN0aW9uTWFuYWdlciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBMb2cgTE9HID0gTG9nRmFjdG9yeS5nZXRMb2coRGVmYXVsdEh0dHBDb25uZWN0aW9uTWFuYWdlci5jbGFzcyk7Ci0KLSAgICBwcml2YXRlIGZpbmFsIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ3VyYXRpb25Db250ZXh0OwotCi0gICAgLyoqIFRoZSB0aHJlYWQgcG9vbCB1c2VkIHRvIGV4ZWN1dGUgcHJvY2Vzc29ycy4gKi8KLSAgICBwcml2YXRlIGZpbmFsIEV4ZWN1dG9yIGV4ZWN1dG9yOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBXb3JrZXJGYWN0b3J5IHdvcmtlcmZhY3Rvcnk7Ci0KLSAgICBwcml2YXRlIGZpbmFsIEh0dHBQYXJhbXMgcGFyYW1zOwotCi0gICAgLyoqIFRoZSBsaXN0IG9mIHByb2Nlc3NvcnMuICovCi0gICAgLy8gWFhYOiBpcyB0aGlzIGxpc3QgcmVhbGx5IG5lZWRlZD8KLSAgICBwcml2YXRlIGZpbmFsIExpc3QgcHJvY2Vzc29yczsKLQotICAgIHByaXZhdGUgSHR0cEZhY3RvcnkgaHR0cEZhY3RvcnkgPSBudWxsOwotCi0KLSAgICBwdWJsaWMgRGVmYXVsdEh0dHBDb25uZWN0aW9uTWFuYWdlcihmaW5hbCBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWd1cmF0aW9uQ29udGV4dCwKLSAgICAgICAgICAgIGZpbmFsIEV4ZWN1dG9yIGV4ZWN1dG9yLCBmaW5hbCBXb3JrZXJGYWN0b3J5IHdvcmtlcmZhY3RvcnksCi0gICAgICAgICAgICBmaW5hbCBIdHRwUGFyYW1zIHBhcmFtcykgewotICAgICAgICBzdXBlcigpOwotICAgICAgICBpZiAoY29uZmlndXJhdGlvbkNvbnRleHQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ29uZmlndXJhdGlvbiBjb250ZXh0IG1heSBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChleGVjdXRvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJFeGVjdXRvciBtYXkgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAod29ya2VyZmFjdG9yeSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJXb3JrZXIgZmFjdG9yeSBtYXkgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocGFyYW1zID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkhUVFAgcGFyYW1ldGVycyBtYXkgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb25Db250ZXh0ID0gY29uZmlndXJhdGlvbkNvbnRleHQ7Ci0gICAgICAgIHRoaXMuZXhlY3V0b3IgPSBleGVjdXRvcjsKLSAgICAgICAgdGhpcy53b3JrZXJmYWN0b3J5ID0gd29ya2VyZmFjdG9yeTsKLSAgICAgICAgdGhpcy5wYXJhbXMgPSBwYXJhbXM7Ci0gICAgICAgIHRoaXMucHJvY2Vzc29ycyA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0gICAgfQotCi0JcHVibGljIERlZmF1bHRIdHRwQ29ubmVjdGlvbk1hbmFnZXIoCi0gICAgICAgICAgICBmaW5hbCBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWd1cmF0aW9uQ29udGV4dCwKLSAgICAgICAgICAgIGZpbmFsIEV4ZWN1dG9yIGV4ZWN1dG9yLAotICAgICAgICAgICAgZmluYWwgV29ya2VyRmFjdG9yeSB3b3JrZXJmYWN0b3J5LAotICAgICAgICAgICAgZmluYWwgSHR0cFBhcmFtcyBwYXJhbXMsCi0gICAgICAgICAgICBmaW5hbCBIdHRwRmFjdG9yeSBodHRwRmFjdG9yeSkgewotICAgICAgICB0aGlzKGNvbmZpZ3VyYXRpb25Db250ZXh0LCBleGVjdXRvciwgd29ya2VyZmFjdG9yeSwgcGFyYW1zKTsKLSAgICAgICAgdGhpcy5odHRwRmFjdG9yeSA9IGh0dHBGYWN0b3J5OwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyB0aGUgZGVzdHJveWVkIHByb2Nlc3NvcnMuCi0gICAgICogCi0gICAgICogQHNlZSBJT1Byb2Nlc3NvciNkZXN0cm95KCkKLSAgICAgKi8KLSAgICAvL1hYWDogaXMgdGhpcyBtZXRob2QgcmVhbGx5IG5lZWRlZD8gUHJvY2Vzc29ycyBhcmUgcmVtb3ZlZCBhcyBzb29uIGFzIHRoZXkgY29tcGxldGUKLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGNsZWFudXAoKSB7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHRoaXMucHJvY2Vzc29ycy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIElPUHJvY2Vzc29yIHByb2Nlc3NvciA9IChJT1Byb2Nlc3NvcikgaS5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAocHJvY2Vzc29yLmlzRGVzdHJveWVkKCkpIHsKLSAgICAgICAgICAgICAgICBpLnJlbW92ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBBZGRzIHRoZSBzcGVjaWZpZWQge0BsaW5rcGxhaW4gSU9Qcm9jZXNzb3J9IHRvIHRoZSBsaXN0IG9mIHByb2Nlc3NvcnMgaW4gCi0gICAgICogcHJvZ3Jlc3MuCi0gICAgICogCi0gICAgICogQHBhcmFtIHByb2Nlc3NvciBUaGUgcHJvY2Vzc29yIHRvIGFkZC4KLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIElmIHByb2Nlc3NvciBpcyA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGFkZFByb2Nlc3NvcihmaW5hbCBJT1Byb2Nlc3NvciBwcm9jZXNzb3IpIHsKLSAgICAgICAgaWYgKHByb2Nlc3NvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIlRoZSBwcm9jZXNzb3IgY2FuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIHRoaXMucHJvY2Vzc29ycy5hZGQocHJvY2Vzc29yKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgdGhlIHNwZWNpZmllZCB7QGxpbmtwbGFpbiBJT1Byb2Nlc3Nvcn0gZnJvbSB0aGUgbGlzdCBvZgotICAgICAqIHByb2Nlc3NvcnMuCi0gICAgICogCi0gICAgICogQHBhcmFtIHByb2Nlc3NvciBUaGUgcHJvY2Vzc29yIHRvIHJlbW92ZS4KLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIElmIHByb2Nlc3NvciBpcyA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgKi8KLSAgICBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVQcm9jZXNzb3IoZmluYWwgSU9Qcm9jZXNzb3IgcHJvY2Vzc29yKQotICAgICAgICB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gewotICAgICAgICBpZiAocHJvY2Vzc29yID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiVGhlIHByb2Nlc3NvciBjYW4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy5wcm9jZXNzb3JzLnJlbW92ZShwcm9jZXNzb3IpOwotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgcHJvY2VzcyhmaW5hbCBBeGlzSHR0cENvbm5lY3Rpb24gY29ubikgewotICAgICAgICBpZiAoY29ubiA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJIVFRQIGNvbm5lY3Rpb24gbWF5IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gRXZpY3QgZGVzdHJveWVkIHByb2Nlc3NvcnMKLSAgICAgICAgY2xlYW51cCgpOwotCi0gICAgICAgIC8vIEFzc2VtYmxlIG5ldyBBeGlzIEhUVFAgc2VydmljZQotICAgICAgICBIdHRwUHJvY2Vzc29yIGh0dHBQcm9jZXNzb3I7Ci0gICAgICAgIENvbm5lY3Rpb25SZXVzZVN0cmF0ZWd5IGNvbm5TdHJhdGVneTsKLSAgICAgICAgSHR0cFJlc3BvbnNlRmFjdG9yeSByZXNwb25zZUZhY3Rvcnk7Ci0KLSAgICAgICAgaWYgKGh0dHBGYWN0b3J5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGh0dHBQcm9jZXNzb3IgPSBodHRwRmFjdG9yeS5uZXdIdHRwUHJvY2Vzc29yKCk7Ci0gICAgICAgICAgICBjb25uU3RyYXRlZ3kgPSBodHRwRmFjdG9yeS5uZXdDb25uU3RyYXRlZ3koKTsKLSAgICAgICAgICAgIHJlc3BvbnNlRmFjdG9yeSA9IGh0dHBGYWN0b3J5Lm5ld1Jlc3BvbnNlRmFjdG9yeSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQmFzaWNIdHRwUHJvY2Vzc29yIHAgPSBuZXcgQmFzaWNIdHRwUHJvY2Vzc29yKCk7Ci0gICAgICAgICAgICBwLmFkZEludGVyY2VwdG9yKG5ldyBSZXF1ZXN0U2Vzc2lvbkNvb2tpZSgpKTsKLSAgICAgICAgICAgIHAuYWRkSW50ZXJjZXB0b3IobmV3IFJlc3BvbnNlRGF0ZSgpKTsKLSAgICAgICAgICAgIHAuYWRkSW50ZXJjZXB0b3IobmV3IFJlc3BvbnNlU2VydmVyKCkpOwotICAgICAgICAgICAgcC5hZGRJbnRlcmNlcHRvcihuZXcgUmVzcG9uc2VDb250ZW50KCkpOwotICAgICAgICAgICAgcC5hZGRJbnRlcmNlcHRvcihuZXcgUmVzcG9uc2VDb25uQ29udHJvbCgpKTsKLSAgICAgICAgICAgIHAuYWRkSW50ZXJjZXB0b3IobmV3IFJlc3BvbnNlU2Vzc2lvbkNvb2tpZSgpKTsKLSAgICAgICAgICAgIGh0dHBQcm9jZXNzb3IgPSBwOwotICAgICAgICAgICAgY29ublN0cmF0ZWd5ID0gbmV3IERlZmF1bHRDb25uZWN0aW9uUmV1c2VTdHJhdGVneSgpOwotICAgICAgICAgICAgcmVzcG9uc2VGYWN0b3J5ID0gbmV3IERlZmF1bHRIdHRwUmVzcG9uc2VGYWN0b3J5KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBBeGlzSHR0cFNlcnZpY2UgaHR0cFNlcnZpY2UgPSBuZXcgQXhpc0h0dHBTZXJ2aWNlKGh0dHBQcm9jZXNzb3IsIGNvbm5TdHJhdGVneSwKLSAgICAgICAgICAgIHJlc3BvbnNlRmFjdG9yeSwgdGhpcy5jb25maWd1cmF0aW9uQ29udGV4dCwgdGhpcy53b3JrZXJmYWN0b3J5Lm5ld1dvcmtlcigpKTsKLSAgICAgICAgaHR0cFNlcnZpY2Uuc2V0UGFyYW1zKHRoaXMucGFyYW1zKTsKLQotICAgICAgICAvLyBDcmVhdGUgSS9PIHByb2Nlc3NvciB0byBleGVjdXRlIEhUVFAgc2VydmljZQotICAgICAgICBJT1Byb2Nlc3NvckNhbGxiYWNrIGNhbGxiYWNrID0gbmV3IElPUHJvY2Vzc29yQ2FsbGJhY2soKSB7Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNvbXBsZXRlZChmaW5hbCBJT1Byb2Nlc3NvciBwcm9jZXNzb3IpIHsKLSAgICAgICAgICAgICAgICByZW1vdmVQcm9jZXNzb3IocHJvY2Vzc29yKTsKLSAgICAgICAgICAgICAgICBpZiAoTE9HLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgTE9HLmRlYnVnKHByb2Nlc3NvciArICIgdGVybWluYXRlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICB9OwotICAgICAgICBJT1Byb2Nlc3NvciBwcm9jZXNzb3IgPSBuZXcgSHR0cFNlcnZpY2VQcm9jZXNzb3IoaHR0cFNlcnZpY2UsIGNvbm4sIGNhbGxiYWNrKTsKLQotICAgICAgICBhZGRQcm9jZXNzb3IocHJvY2Vzc29yKTsKLSAgICAgICAgdGhpcy5leGVjdXRvci5leGVjdXRlKHByb2Nlc3Nvcik7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2h1dGRvd24oKSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5wcm9jZXNzb3JzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBJT1Byb2Nlc3NvciBwcm9jZXNzb3IgPSAoSU9Qcm9jZXNzb3IpIHRoaXMucHJvY2Vzc29ycy5nZXQoaSk7Ci0gICAgICAgICAgICBwcm9jZXNzb3IuZGVzdHJveSgpOwotICAgICAgICB9Ci0gICAgICAgIHRoaXMucHJvY2Vzc29ycy5jbGVhcigpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvdHJhbnNwb3J0L2h0dHAvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvc2VydmVyL0RlZmF1bHRUaHJlYWRGYWN0b3J5LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy90cmFuc3BvcnQvaHR0cC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9zZXJ2ZXIvRGVmYXVsdFRocmVhZEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTYzODM3OC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy90cmFuc3BvcnQvaHR0cC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9zZXJ2ZXIvRGVmYXVsdFRocmVhZEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5zZXJ2ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRGYWN0b3J5OwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNJbnRlZ2VyOwotCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFRocmVhZEZhY3RvcnkgaW1wbGVtZW50cyBUaHJlYWRGYWN0b3J5IHsKLQotICAgIGZpbmFsIFRocmVhZEdyb3VwIGdyb3VwOwotICAgIGZpbmFsIEF0b21pY0ludGVnZXIgY291bnQ7Ci0gICAgZmluYWwgU3RyaW5nIG5hbWVQcmVmaXg7Ci0KLSAgICBwdWJsaWMgRGVmYXVsdFRocmVhZEZhY3RvcnkoZmluYWwgVGhyZWFkR3JvdXAgZ3JvdXAsIGZpbmFsIFN0cmluZyBuYW1lUHJlZml4KSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIHRoaXMuY291bnQgPSBuZXcgQXRvbWljSW50ZWdlcigxKTsKLSAgICAgICAgdGhpcy5ncm91cCA9IGdyb3VwOwotICAgICAgICB0aGlzLm5hbWVQcmVmaXggPSBuYW1lUHJlZml4OwotICAgIH0KLQotICAgIHB1YmxpYyBUaHJlYWQgbmV3VGhyZWFkKGZpbmFsIFJ1bm5hYmxlIHJ1bm5hYmxlKSB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIGJ1ZmZlci5hcHBlbmQodGhpcy5uYW1lUHJlZml4KTsKLSAgICAgICAgYnVmZmVyLmFwcGVuZCgnLScpOwotICAgICAgICBidWZmZXIuYXBwZW5kKHRoaXMuY291bnQuZ2V0QW5kSW5jcmVtZW50KCkpOwotICAgICAgICBUaHJlYWQgdCA9IG5ldyBUaHJlYWQoZ3JvdXAsIHJ1bm5hYmxlLCBidWZmZXIudG9TdHJpbmcoKSwgMCk7Ci0gICAgICAgIHQuc2V0RGFlbW9uKGZhbHNlKTsKLSAgICAgICAgdC5zZXRQcmlvcml0eShUaHJlYWQuTk9STV9QUklPUklUWSk7Ci0gICAgICAgIHJldHVybiB0OwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvdHJhbnNwb3J0L2h0dHAvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvc2VydmVyL0h0dHBDb25uZWN0aW9uTWFuYWdlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvdHJhbnNwb3J0L2h0dHAvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvc2VydmVyL0h0dHBDb25uZWN0aW9uTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODIyNDJiLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3RyYW5zcG9ydC9odHRwL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL3NlcnZlci9IdHRwQ29ubmVjdGlvbk1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5zZXJ2ZXI7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSHR0cENvbm5lY3Rpb25NYW5hZ2VyIHsKLQotICAgIHZvaWQgcHJvY2VzcyhBeGlzSHR0cENvbm5lY3Rpb24gaW5jb21pbmcpOwotCi0gICAgdm9pZCBzaHV0ZG93bigpOwotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy90cmFuc3BvcnQvaHR0cC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9zZXJ2ZXIvSHR0cEZhY3RvcnkuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3RyYW5zcG9ydC9odHRwL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL3NlcnZlci9IdHRwRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDU1NDIyLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3RyYW5zcG9ydC9odHRwL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL3NlcnZlci9IdHRwRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDc5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5zZXJ2ZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5QYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5UcmFuc3BvcnRJbkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkxpc3RlbmVyTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkhUVFBXb3JrZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5Db25uZWN0aW9uUmV1c2VTdHJhdGVneTsKLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAuSHR0cFJlc3BvbnNlRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAuaW1wbC5EZWZhdWx0Q29ubmVjdGlvblJldXNlU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmFwYWNoZS5odHRwLmltcGwuRGVmYXVsdEh0dHBSZXNwb25zZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5odHRwLnBhcmFtcy5CYXNpY0h0dHBQYXJhbXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5odHRwLnBhcmFtcy5IdHRwQ29ubmVjdGlvblBhcmFtczsKLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAucGFyYW1zLkh0dHBQYXJhbXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5odHRwLnBhcmFtcy5IdHRwUHJvdG9jb2xQYXJhbXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5odHRwLnByb3RvY29sLkJhc2ljSHR0cFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAucHJvdG9jb2wuSHR0cFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAucHJvdG9jb2wuUmVzcG9uc2VDb25uQ29udHJvbDsKLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAucHJvdG9jb2wuUmVzcG9uc2VDb250ZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5wcm90b2NvbC5SZXNwb25zZURhdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5odHRwLnByb3RvY29sLlJlc3BvbnNlU2VydmVyOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5CbG9ja2luZ1F1ZXVlOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yU2VydmljZTsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5MaW5rZWRCbG9ja2luZ1F1ZXVlOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKLQotLyoqCi0gKiBGYWN0b3J5IHVzZWQgdG8gY29uZmlndXJlIGFuZCBjcmVhdGUgdGhlIHZhcmlvdXMgaW5zdGFuY2VzIHJlcXVpcmVkIGluIGh0dHAgdHJhbnNwb3J0cy4KLSAqIEVpdGhlciBjb25maWd1cmUgdGhpcyBjbGFzcyBpbiBheGlzMi54bWwsIG9yIGluIGNvZGUgdmlhIHRoZSBzZXR0ZXJzLCBvciBzdWJjbGFzcyBpdCBhbmQgc3BlY2lhbGl6ZSBzb21lIGZhY3RvcnkgbWV0aG9kcyB0byBnYWluIG1vcmUgY29udHJvbC4KLSAqLwotcHVibGljIGNsYXNzIEh0dHBGYWN0b3J5IHsKLQotICAgIC8qKgotICAgICAqIE5hbWUgb2YgYXhpczIueG1sIHBvcnQgcGFyYW1ldGVyIGZvciBTaW1wbGVIVFRQU2VydmVyIGNvbmZpZ3VyYXRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTUVURVJfUE9SVCA9ICJwb3J0IjsKLQotICAgIC8qKgotICAgICAqIE5hbWUgb2YgYXhpczIueG1sIGhvc3RuYW1lIHBhcmFtZXRlciBmb3IgU2ltcGxlSFRUUFNlcnZlciBjb25maWd1cmF0aW9uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1FVEVSX0hPU1RfQUREUkVTUyA9ICJob3N0bmFtZSI7Ci0KLSAgICAvKioKLSAgICAgKiBOYW1lIG9mIGF4aXMyLnhtbCBvcmlnaW5TZXJ2ZXIgcGFyYW1ldGVyIGZvciBTaW1wbGVIVFRQU2VydmVyIGNvbmZpZ3VyYXRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTUVURVJfT1JJR0lOX1NFUlZFUiA9ICJvcmlnaW5TZXJ2ZXIiOwotCi0gICAgLyoqCi0gICAgICogTmFtZSBvZiBheGlzMi54bWwgcmVxdWVzdFRpbWVvdXQgcGFyYW1ldGVyIGZvciBTaW1wbGVIVFRQU2VydmVyIGNvbmZpZ3VyYXRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTUVURVJfUkVRVUVTVF9TT0NLRVRfVElNRU9VVCA9ICJyZXF1ZXN0VGltZW91dCI7Ci0KLSAgICAvKioKLSAgICAgKiBOYW1lIG9mIGF4aXMyLnhtbCByZXF1ZXN0VGNwTm9EZWxheSBwYXJhbWV0ZXIgZm9yIFNpbXBsZUhUVFBTZXJ2ZXIgY29uZmlndXJhdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNRVRFUl9SRVFVRVNUX1RDUF9OT19ERUxBWSA9ICJyZXF1ZXN0VGNwTm9EZWxheSI7Ci0KLSAgICAvKioKLSAgICAgKiBOYW1lIG9mIGF4aXMyLnhtbCByZXF1ZXN0Q29yZVRocmVhZFBvb2xTaXplIHBhcmFtZXRlciBmb3IgU2ltcGxlSFRUUFNlcnZlciBjb25maWd1cmF0aW9uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1FVEVSX1JFUVVFU1RfQ09SRV9USFJFQURfUE9PTF9TSVpFID0KLSAgICAgICAgICAgICJyZXF1ZXN0Q29yZVRocmVhZFBvb2xTaXplIjsKLQotICAgIC8qKgotICAgICAqIE5hbWUgb2YgYXhpczIueG1sIHJlcXVlc3RNYXhUaHJlYWRQb29sU2l6ZSBwYXJhbWV0ZXIgZm9yIFNpbXBsZUhUVFBTZXJ2ZXIgY29uZmlndXJhdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNRVRFUl9SRVFVRVNUX01BWF9USFJFQURfUE9PTF9TSVpFID0gInJlcXVlc3RNYXhUaHJlYWRQb29sU2l6ZSI7Ci0KLSAgICAvKioKLSAgICAgKiBOYW1lIG9mIGF4aXMyLnhtbCB0aHJlYWRLZWVwQWxpdmVUaW1lIHBhcmFtZXRlciBmb3IgU2ltcGxlSFRUUFNlcnZlciBjb25maWd1cmF0aW9uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1FVEVSX1RIUkVBRF9LRUVQX0FMSVZFX1RJTUUgPSAidGhyZWFkS2VlcEFsaXZlVGltZSI7Ci0KLSAgICAvKioKLSAgICAgKiBOYW1lIG9mIGF4aXMyLnhtbCB0aHJlYWRLZWVwQWxpdmVUaW1lVW5pdCBwYXJhbWV0ZXIgZm9yIFNpbXBsZUhUVFBTZXJ2ZXIgY29uZmlndXJhdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNRVRFUl9USFJFQURfS0VFUF9BTElWRV9USU1FX1VOSVQgPSAidGhyZWFkS2VlcEFsaXZlVGltZVVuaXQiOwotCi0gICAgcHJpdmF0ZSBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWd1cmF0aW9uQ29udGV4dDsKLSAgICBwcml2YXRlIFRyYW5zcG9ydEluRGVzY3JpcHRpb24gaHR0cENvbmZpZ3VyYXRpb247Ci0gICAgcHJpdmF0ZSBpbnQgcG9ydDsKLSAgICBwcml2YXRlIFN0cmluZyBob3N0QWRkcmVzczsKLSAgICBwcml2YXRlIFN0cmluZyBvcmlnaW5TZXJ2ZXI7Ci0gICAgcHJpdmF0ZSBpbnQgcmVxdWVzdFNvY2tldFRpbWVvdXQ7Ci0gICAgcHJpdmF0ZSBib29sZWFuIHJlcXVlc3RUY3BOb0RlbGF5OwotICAgIHByaXZhdGUgaW50IHJlcXVlc3RDb3JlVGhyZWFkUG9vbFNpemU7Ci0gICAgcHJpdmF0ZSBpbnQgcmVxdWVzdE1heFRocmVhZFBvb2xTaXplOwotICAgIHByaXZhdGUgbG9uZyB0aHJlYWRLZWVwQWxpdmVUaW1lOwotICAgIHByaXZhdGUgVGltZVVuaXQgdGhyZWFkS2VlcEFsaXZlVGltZVVuaXQ7Ci0KLSAgICBwcml2YXRlIFdvcmtlckZhY3RvcnkgcmVxdWVzdFdvcmtlckZhY3RvcnkgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuZCBjb25maWd1cmUgYSBuZXcgSHR0cEZhY3RvcnkKLSAgICAgKi8KLSAgICBwdWJsaWMgSHR0cEZhY3RvcnkoQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlndXJhdGlvbkNvbnRleHQpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb25Db250ZXh0ID0gY29uZmlndXJhdGlvbkNvbnRleHQ7Ci0gICAgICAgIGh0dHBDb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvbkNvbnRleHQuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5nZXRUcmFuc3BvcnRJbihDb25zdGFudHMuVFJBTlNQT1JUX0hUVFApOwotICAgICAgICBwb3J0ID0gZ2V0SW50UGFyYW0oUEFSQU1FVEVSX1BPUlQsIDYwNjApOwotICAgICAgICBob3N0QWRkcmVzcyA9IGdldFN0cmluZ1BhcmFtKFBBUkFNRVRFUl9IT1NUX0FERFJFU1MsIG51bGwpOwotICAgICAgICBvcmlnaW5TZXJ2ZXIgPSBnZXRTdHJpbmdQYXJhbShQQVJBTUVURVJfT1JJR0lOX1NFUlZFUiwgIlNpbXBsZS1TZXJ2ZXIvMS4xIik7Ci0gICAgICAgIHJlcXVlc3RTb2NrZXRUaW1lb3V0ID0gZ2V0SW50UGFyYW0oUEFSQU1FVEVSX1JFUVVFU1RfU09DS0VUX1RJTUVPVVQsIDIwMDAwKTsKLSAgICAgICAgcmVxdWVzdFRjcE5vRGVsYXkgPSBnZXRCb29sZWFuUGFyYW0oUEFSQU1FVEVSX1JFUVVFU1RfVENQX05PX0RFTEFZLCB0cnVlKTsKLSAgICAgICAgcmVxdWVzdENvcmVUaHJlYWRQb29sU2l6ZSA9IGdldEludFBhcmFtKFBBUkFNRVRFUl9SRVFVRVNUX0NPUkVfVEhSRUFEX1BPT0xfU0laRSwgMTAwKTsKLSAgICAgICAgcmVxdWVzdE1heFRocmVhZFBvb2xTaXplID0gZ2V0SW50UGFyYW0oUEFSQU1FVEVSX1JFUVVFU1RfTUFYX1RIUkVBRF9QT09MX1NJWkUsIDE1MCk7Ci0gICAgICAgIHRocmVhZEtlZXBBbGl2ZVRpbWUgPSBnZXRMb25nUGFyYW0oUEFSQU1FVEVSX1RIUkVBRF9LRUVQX0FMSVZFX1RJTUUsIDE4MEwpOwotICAgICAgICB0aHJlYWRLZWVwQWxpdmVUaW1lVW5pdCA9Ci0gICAgICAgICAgICAgICAgZ2V0VGltZVVuaXRQYXJhbShQQVJBTUVURVJfVEhSRUFEX0tFRVBfQUxJVkVfVElNRV9VTklULCBUaW1lVW5pdC5TRUNPTkRTKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW5kIGNvbmZpZ3VyZSBhIG5ldyBIdHRwRmFjdG9yeQotICAgICAqLwotICAgIHB1YmxpYyBIdHRwRmFjdG9yeShDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWd1cmF0aW9uQ29udGV4dCwgaW50IHBvcnQpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICB0aGlzKGNvbmZpZ3VyYXRpb25Db250ZXh0KTsKLSAgICAgICAgdGhpcy5wb3J0ID0gcG9ydDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW5kIGNvbmZpZ3VyZSBhIG5ldyBIdHRwRmFjdG9yeQotICAgICAqLwotICAgIHB1YmxpYyBIdHRwRmFjdG9yeShDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWd1cmF0aW9uQ29udGV4dCwgaW50IHBvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgIFdvcmtlckZhY3RvcnkgcmVxdWVzdFdvcmtlckZhY3RvcnkpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICB0aGlzKGNvbmZpZ3VyYXRpb25Db250ZXh0LCBwb3J0KTsKLSAgICAgICAgdGhpcy5yZXF1ZXN0V29ya2VyRmFjdG9yeSA9IHJlcXVlc3RXb3JrZXJGYWN0b3J5OwotICAgIH0KLQotICAgIHByaXZhdGUgaW50IGdldEludFBhcmFtKFN0cmluZyBuYW1lLCBpbnQgZGVmKSB7Ci0gICAgICAgIFN0cmluZyBjb25maWcgPSBnZXRTdHJpbmdQYXJhbShuYW1lLCBudWxsKTsKLSAgICAgICAgaWYgKGNvbmZpZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gSW50ZWdlci5wYXJzZUludChjb25maWcpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGRlZjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgbG9uZyBnZXRMb25nUGFyYW0oU3RyaW5nIG5hbWUsIGxvbmcgZGVmKSB7Ci0gICAgICAgIFN0cmluZyBjb25maWcgPSBnZXRTdHJpbmdQYXJhbShuYW1lLCBudWxsKTsKLSAgICAgICAgaWYgKGNvbmZpZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gTG9uZy5wYXJzZUxvbmcoY29uZmlnKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBkZWY7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gZ2V0Qm9vbGVhblBhcmFtKFN0cmluZyBuYW1lLCBib29sZWFuIGRlZikgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIFN0cmluZyBjb25maWcgPSBnZXRTdHJpbmdQYXJhbShuYW1lLCBudWxsKTsKLSAgICAgICAgaWYgKGNvbmZpZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoY29uZmlnLmVxdWFscygieWVzIikgfHwgY29uZmlnLmVxdWFscygidHJ1ZSIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGNvbmZpZy5lcXVhbHMoIm5vIikgfHwgY29uZmlnLmVxdWFscygiZmFsc2UiKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiQm9vbGVhbiB2YWx1ZSBtdXN0IGJlIHllcywgdHJ1ZSwgbm8gb3IgZmFsc2UgZm9yIHBhcmFtZXRlciAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgKyAiOiAgIiArIGNvbmZpZyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGRlZjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFRpbWVVbml0IGdldFRpbWVVbml0UGFyYW0oU3RyaW5nIG5hbWUsIFRpbWVVbml0IGRlZikgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIFN0cmluZyBjb25maWcgPSBnZXRTdHJpbmdQYXJhbShuYW1lLCBudWxsKTsKLSAgICAgICAgaWYgKGNvbmZpZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHJldHVybiAoVGltZVVuaXQpIFRpbWVVbml0LmNsYXNzLmdldEZpZWxkKGNvbmZpZykuZ2V0KG51bGwpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBBeGlzRmF1bHQubWFrZUZhdWx0KGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBkZWY7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0U3RyaW5nUGFyYW0oU3RyaW5nIG5hbWUsIFN0cmluZyBkZWYpIHsKLSAgICAgICAgUGFyYW1ldGVyIHBhcmFtID0gaHR0cENvbmZpZ3VyYXRpb24uZ2V0UGFyYW1ldGVyKG5hbWUpOwotICAgICAgICBpZiAocGFyYW0gIT0gbnVsbCkgewotLy8gICAgICAgICAgICBhc3NlcnQgcGFyYW0uZ2V0UGFyYW1ldGVyVHlwZSgpID09IFBhcmFtZXRlci5URVhUX1BBUkFNRVRFUjsKLSAgICAgICAgICAgIFN0cmluZyBjb25maWcgPSAoU3RyaW5nKSBwYXJhbS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgaWYgKGNvbmZpZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNvbmZpZzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZGVmOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgY29uZmlndXJlZCBsaXN0ZW5lciBtYW5hZ2VyIG9yIGNyZWF0ZSBhbmQgY29uZmlndXJlIG9uZSB3aXRoIGNvbmZpZ3VyYXRpb25Db250ZXh0Ci0gICAgICovCi0gICAgcHVibGljIExpc3RlbmVyTWFuYWdlciBnZXRMaXN0ZW5lck1hbmFnZXIoKSB7Ci0gICAgICAgIHJldHVybiBjb25maWd1cmF0aW9uQ29udGV4dC5nZXRMaXN0ZW5lck1hbmFnZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgdGhlIGV4ZWN1dG9yIHVzZWQgdG8gbGF1bmNoIHRoZSBzaW5nbGUgcmVxdWVzdENvbm5lY3Rpb25MaXN0ZW5lcgotICAgICAqLwotICAgIHB1YmxpYyBFeGVjdXRvclNlcnZpY2UgbmV3TGlzdGVuZXJFeGVjdXRvcihpbnQgcG9ydCkgewotICAgICAgICByZXR1cm4gbmV3IFRocmVhZFBvb2xFeGVjdXRvcigxLCAxLCAwTCwgVGltZVVuaXQuTUlMTElTRUNPTkRTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTGlua2VkQmxvY2tpbmdRdWV1ZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRGVmYXVsdFRocmVhZEZhY3RvcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFRocmVhZEdyb3VwKCJMaXN0ZW5lciB0aHJlYWQgZ3JvdXAiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSHR0cExpc3RlbmVyLSIgKyB0aGlzLnBvcnQpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgdGhlIGxpc3RlbmVyIGZvciByZXF1ZXN0IGNvbm5lY3Rpb25zCi0gICAgICovCi0gICAgcHVibGljIElPUHJvY2Vzc29yIG5ld1JlcXVlc3RDb25uZWN0aW9uTGlzdGVuZXIoCi0gICAgICAgICAgICBpbnQgcG9ydCwKLSAgICAgICAgICAgIGZpbmFsIEh0dHBDb25uZWN0aW9uTWFuYWdlciBtYW5hZ2VyLCAKLSAgICAgICAgICAgIGZpbmFsIEh0dHBQYXJhbXMgcGFyYW1zKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbmV3IERlZmF1bHRDb25uZWN0aW9uTGlzdGVuZXIoCi0gICAgICAgICAgICAgICAgcG9ydCwgCi0gICAgICAgICAgICAgICAgbWFuYWdlciwgCi0gICAgICAgICAgICAgICAgbmV3IERlZmF1bHRDb25uZWN0aW9uTGlzdGVuZXJGYWlsdXJlSGFuZGxlcigpLCAKLSAgICAgICAgICAgICAgICBwYXJhbXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbmQgc2V0IHRoZSBwYXJhbWV0ZXJzIGFwcGxpZWQgdG8gaW5jb21pbmcgcmVxdWVzdCBjb25uZWN0aW9ucwotICAgICAqLwotICAgIHB1YmxpYyBIdHRwUGFyYW1zIG5ld1JlcXVlc3RDb25uZWN0aW9uUGFyYW1zKCkgewotICAgICAgICBIdHRwUGFyYW1zIHBhcmFtcyA9IG5ldyBCYXNpY0h0dHBQYXJhbXMoKTsKLSAgICAgICAgcGFyYW1zCi0gICAgICAgICAgICAgICAgLnNldEludFBhcmFtZXRlcihIdHRwQ29ubmVjdGlvblBhcmFtcy5TT19USU1FT1VULCByZXF1ZXN0U29ja2V0VGltZW91dCkKLSAgICAgICAgICAgICAgICAuc2V0Qm9vbGVhblBhcmFtZXRlcihIdHRwQ29ubmVjdGlvblBhcmFtcy5UQ1BfTk9ERUxBWSwgcmVxdWVzdFRjcE5vRGVsYXkpCi0gICAgICAgICAgICAgICAgLnNldEludFBhcmFtZXRlcihIdHRwQ29ubmVjdGlvblBhcmFtcy5NQVhfTElORV9MRU5HVEgsIDQwMDApCi0gICAgICAgICAgICAgICAgLnNldEludFBhcmFtZXRlcihIdHRwQ29ubmVjdGlvblBhcmFtcy5NQVhfSEVBREVSX0NPVU5ULCA1MDApCi0gICAgICAgICAgICAgICAgLnNldEludFBhcmFtZXRlcihIdHRwQ29ubmVjdGlvblBhcmFtcy5TT0NLRVRfQlVGRkVSX1NJWkUsIDggKiAxMDI0KQotICAgICAgICAgICAgICAgIC5zZXRQYXJhbWV0ZXIoSHR0cFByb3RvY29sUGFyYW1zLk9SSUdJTl9TRVJWRVIsIG9yaWdpblNlcnZlcik7Ci0gICAgICAgIHJldHVybiBwYXJhbXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIHRoZSBjb25uZWN0aW9uIG1hbmFnZXIgdXNlZCB0byBsYXVuY2ggcmVxdWVzdCB0aHJlYWRzCi0gICAgICovCi0gICAgcHVibGljIEh0dHBDb25uZWN0aW9uTWFuYWdlciBuZXdSZXF1ZXN0Q29ubmVjdGlvbk1hbmFnZXIoRXhlY3V0b3JTZXJ2aWNlIHJlcXVlc3RFeGVjdXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JrZXJGYWN0b3J5IHdvcmtlckZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFBhcmFtcyBwYXJhbXMpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBEZWZhdWx0SHR0cENvbm5lY3Rpb25NYW5hZ2VyKGNvbmZpZ3VyYXRpb25Db250ZXh0LCByZXF1ZXN0RXhlY3V0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZXJGYWN0b3J5LCBwYXJhbXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSB0aGUgZXhlY3V0b3IgdXNlIHRoZSBtYW5hZ2UgcmVxdWVzdCBwcm9jZXNzaW5nIHRocmVhZHMKLSAgICAgKi8KLSAgICBwdWJsaWMgRXhlY3V0b3JTZXJ2aWNlIG5ld1JlcXVlc3RFeGVjdXRvcihpbnQgcG9ydCkgewotICAgICAgICByZXR1cm4gbmV3IFRocmVhZFBvb2xFeGVjdXRvcihyZXF1ZXN0Q29yZVRocmVhZFBvb2xTaXplLCByZXF1ZXN0TWF4VGhyZWFkUG9vbFNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZEtlZXBBbGl2ZVRpbWUsIHRocmVhZEtlZXBBbGl2ZVRpbWVVbml0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdSZXF1ZXN0QmxvY2tpbmdRdWV1ZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRGVmYXVsdFRocmVhZEZhY3RvcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFRocmVhZEdyb3VwKCJDb25uZWN0aW9uIHRocmVhZCBncm91cCIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIdHRwQ29ubmVjdGlvbi0iICsgcG9ydCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSB0aGUgcXVldWUgdXNlZCB0byBob2xkIGluY29taW5nIHJlcXVlc3RzIHdoZW4gcmVxdWVzdENvcmVUaHJlYWRQb29sU2l6ZSB0aHJlYWRzIGFyZSBidXN5LgotICAgICAqIERlZmF1bHQgaXMgYW4gdW5ib3VuZGVkIHF1ZXVlLgotICAgICAqLwotICAgIHB1YmxpYyBCbG9ja2luZ1F1ZXVlIG5ld1JlcXVlc3RCbG9ja2luZ1F1ZXVlKCkgewotICAgICAgICByZXR1cm4gbmV3IExpbmtlZEJsb2NraW5nUXVldWUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgdGhlIGZhY3RvcnkgZm9yIHJlcXVlc3Qgd29ya2VycwotICAgICAqLwotICAgIHB1YmxpYyBXb3JrZXJGYWN0b3J5IG5ld1JlcXVlc3RXb3JrZXJGYWN0b3J5KCkgewotICAgICAgICBpZiAocmVxdWVzdFdvcmtlckZhY3RvcnkgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHJlcXVlc3RXb3JrZXJGYWN0b3J5OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBIVFRQV29ya2VyRmFjdG9yeSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIEh0dHBQcm9jZXNzb3IgbmV3SHR0cFByb2Nlc3NvcigpIHsKLSAgICAgICAgQmFzaWNIdHRwUHJvY2Vzc29yIGh0dHBQcm9jZXNzb3IgPSBuZXcgQmFzaWNIdHRwUHJvY2Vzc29yKCk7Ci0gICAgICAgIGh0dHBQcm9jZXNzb3IuYWRkSW50ZXJjZXB0b3IobmV3IFJlcXVlc3RTZXNzaW9uQ29va2llKCkpOwotICAgICAgICBodHRwUHJvY2Vzc29yLmFkZEludGVyY2VwdG9yKG5ldyBSZXNwb25zZURhdGUoKSk7Ci0gICAgICAgIGh0dHBQcm9jZXNzb3IuYWRkSW50ZXJjZXB0b3IobmV3IFJlc3BvbnNlU2VydmVyKCkpOwotICAgICAgICBodHRwUHJvY2Vzc29yLmFkZEludGVyY2VwdG9yKG5ldyBSZXNwb25zZUNvbnRlbnQoKSk7Ci0gICAgICAgIGh0dHBQcm9jZXNzb3IuYWRkSW50ZXJjZXB0b3IobmV3IFJlc3BvbnNlQ29ubkNvbnRyb2woKSk7Ci0gICAgICAgIGh0dHBQcm9jZXNzb3IuYWRkSW50ZXJjZXB0b3IobmV3IFJlc3BvbnNlU2Vzc2lvbkNvb2tpZSgpKTsKLSAgICAgICAgcmV0dXJuIGh0dHBQcm9jZXNzb3I7Ci0gICAgfQotCi0gICAgcHVibGljIENvbm5lY3Rpb25SZXVzZVN0cmF0ZWd5IG5ld0Nvbm5TdHJhdGVneSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBEZWZhdWx0Q29ubmVjdGlvblJldXNlU3RyYXRlZ3koKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSHR0cFJlc3BvbnNlRmFjdG9yeSBuZXdSZXNwb25zZUZhY3RvcnkoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgRGVmYXVsdEh0dHBSZXNwb25zZUZhY3RvcnkoKTsKLSAgICB9Ci0KLSAgICAvLyAqKioqKgotICAgIC8vIEdldHRlcnMgYW5kIFNldHRlcnMKLSAgICAvLyAqKioqKgotCi0gICAgLyoqCi0gICAgICogR2V0dGVyIGZvciBjb25maWd1cmF0aW9uQ29udGV4dAotICAgICAqLwotICAgIHB1YmxpYyBDb25maWd1cmF0aW9uQ29udGV4dCBnZXRDb25maWd1cmF0aW9uQ29udGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIGNvbmZpZ3VyYXRpb25Db250ZXh0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHRlciBmb3IgaHR0cENvbmZpZ3VyYXRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgVHJhbnNwb3J0SW5EZXNjcmlwdGlvbiBnZXRIdHRwQ29uZmlndXJhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIGh0dHBDb25maWd1cmF0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHRlciBmb3IgcG9ydAotICAgICAqIHJldHVybiB0aGUgcG9ydCBvbiB3aGljaCB0byBsaXN0ZW4gZm9yIGh0dHAgY29ubmVjdGlvbnMgKGRlZmF1bHQgPSA2MDYwKQotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0UG9ydCgpIHsKLSAgICAgICAgcmV0dXJuIHBvcnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0dGVyIGZvciBwb3J0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UG9ydChpbnQgcG9ydCkgewotICAgICAgICB0aGlzLnBvcnQgPSBwb3J0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHRlciBmb3IgaG9zdEFkZHJlc3MKLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIGhvc3QgYWRkcmVzcyAob3IgbmFtZSkgdG8gYmUgdXNlIGluIHJlcGx5LXRvIGVuZHBvaW50IHJlZmVyZW5jZXMsIG9yIG51bGwgaWYgbm90IHNwZWNpZmllZCAoZGVmYXVsdCA9IG51bGwpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRIb3N0QWRkcmVzcygpIHsKLSAgICAgICAgcmV0dXJuIGhvc3RBZGRyZXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHRlciBmb3IgaG9zdEFkZHJlc3MKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRIb3N0QWRkcmVzcyhTdHJpbmcgaG9zdEFkZHJlc3MpIHsKLSAgICAgICAgdGhpcy5ob3N0QWRkcmVzcyA9IGhvc3RBZGRyZXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHRlciBmb3Igb3JpZ2luU2VydmVyCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBTZXJ2ZXIgaGVhZGVyIHN0cmluZyBmb3Igb3V0Z29pbmcgbWVzc2FnZXMgKGRlZmF1bHQgIlNpbXBsZS1TZXJ2ZXIvMS4xIikKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE9yaWdpblNlcnZlcigpIHsKLSAgICAgICAgcmV0dXJuIG9yaWdpblNlcnZlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXR0ZXIgZm9yIG9yaWdpblNlcnZlcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE9yaWdpblNlcnZlcihTdHJpbmcgb3JpZ2luU2VydmVyKSB7Ci0gICAgICAgIHRoaXMub3JpZ2luU2VydmVyID0gb3JpZ2luU2VydmVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHRlciBmb3IgcmVxdWVzdFNvY2tldFRpbWVvdXQKLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIG1heGltdW0gdGltZSBpbiBtaWxsaXMgdG8gd2FpdCBmb3IgZGF0YSBvbiBhIHJlcXVlc3Qgc29ja2V0IChkZWZhdWx0IDIwMDAwKQotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0UmVxdWVzdFNvY2tldFRpbWVvdXQoKSB7Ci0gICAgICAgIHJldHVybiByZXF1ZXN0U29ja2V0VGltZW91dDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXR0ZXIgZm9yIHJlcXVlc3RTb2NrZXRUaW1lb3V0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UmVxdWVzdFNvY2tldFRpbWVvdXQoaW50IHJlcXVlc3RTb2NrZXRUaW1lb3V0KSB7Ci0gICAgICAgIHRoaXMucmVxdWVzdFNvY2tldFRpbWVvdXQgPSByZXF1ZXN0U29ja2V0VGltZW91dDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXR0ZXIgZm9yIHJlcXVlc3RUY3BOb0RlbGF5Ci0gICAgICogcmV0dXJuIGZhbHNlIGlmZiBOYWdsZSdzIGFsZ29yaXRobSBzaG91bGQgYmUgdXNlZCB0byBjb25zZXJ2ZSBiYW5kd2lkdGggYnkgbWluaW1pemluZyBzZWdtZW50cwotICAgICAqIGF0IHRoZSBjb3N0IG9mIGxhdGVuY3kgYW5kIHBlcmZvcm1hbmNlIChkZWZhdWx0IHRydWUsIGkuZS4gbWF4aW1pemUgcGVyZm9ybWFuY2UgYXQKLSAgICAgKiB0aGUgY29zdCBvZiBiYW5kd2lkdGgpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0UmVxdWVzdFRjcE5vRGVsYXkoKSB7Ci0gICAgICAgIHJldHVybiByZXF1ZXN0VGNwTm9EZWxheTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXR0ZXIgZm9yIHJlcXVlc3RUY3BOb0RlbGF5Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UmVxdWVzdFRjcE5vRGVsYXkoYm9vbGVhbiByZXF1ZXN0VGNwTm9EZWxheSkgewotICAgICAgICB0aGlzLnJlcXVlc3RUY3BOb0RlbGF5ID0gcmVxdWVzdFRjcE5vRGVsYXk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0dGVyIGZvciBSZXF1ZXN0Q29yZVRocmVhZFBvb2xTaXplCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBzaXplIG9mIHRoZSB0aHJlYWQgcG9vbCB1c2UgdG8gcHJvY2VzcyByZXF1ZXN0cyBhc3N1bWluZyB0aGVyZSBpcyBhZGVxdWF0ZSBxdWV1ZSBzcGFjZSAoZGVmYXVsdCAyNSkKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFJlcXVlc3RDb3JlVGhyZWFkUG9vbFNpemUoKSB7Ci0gICAgICAgIHJldHVybiByZXF1ZXN0Q29yZVRocmVhZFBvb2xTaXplOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHRlciBmb3IgUmVxdWVzdENvcmVUaHJlYWRQb29sU2l6ZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFJlcXVlc3RDb3JlVGhyZWFkUG9vbFNpemUoaW50IHJlcXVlc3RDb3JlVGhyZWFkUG9vbFNpemUpIHsKLSAgICAgICAgdGhpcy5yZXF1ZXN0Q29yZVRocmVhZFBvb2xTaXplID0gcmVxdWVzdENvcmVUaHJlYWRQb29sU2l6ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXR0ZXIgZm9yIHJlcXVlc3RNYXhUaHJlYWRQb29sU2l6ZQotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgbWF4aW11bSBzaXplIG9mIHRoZSB0aHJlYWQgcG9vbCB1c2VkIHRvIHByb2Nlc3MgcmVxdWVzdHMgaWYgdGhlIHF1ZXVlIGZpbGxzIHVwIChkZWZhdWx0IDE1MCkuCi0gICAgICogICAgICAgICBTaW5jZSB0aGUgZGVmYXVsdCBxdWV1ZSBpcyB1bmJvdW5kZWQgdGhpcyBwYXJhbWV0ZXIgaXMgbWVhbmluZ2xlc3MgdW5sZXNzIHlvdSBvdmVycmlkZSBuZXdSZXF1ZXN0QmxvY2tpbmdRdWV1ZSgpCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRSZXF1ZXN0TWF4VGhyZWFkUG9vbFNpemUoKSB7Ci0gICAgICAgIHJldHVybiByZXF1ZXN0TWF4VGhyZWFkUG9vbFNpemU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0dGVyIGZvciByZXF1ZXN0TWF4VGhyZWFkUG9vbFNpemUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRSZXF1ZXN0TWF4VGhyZWFkUG9vbFNpemUoaW50IHJlcXVlc3RNYXhUaHJlYWRQb29sU2l6ZSkgewotICAgICAgICB0aGlzLnJlcXVlc3RNYXhUaHJlYWRQb29sU2l6ZSA9IHJlcXVlc3RNYXhUaHJlYWRQb29sU2l6ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXR0ZXIgZm9yIHRocmVhZEtlZXBBbGl2ZVRpbWUKLSAgICAgKgotICAgICAqIEByZXR1cm4gaG93IGxvbmcgYSByZXF1ZXN0IHByb2Nlc3NpbmcgdGhyZWFkIGluIGV4Y2VzcyBvZiB0aGUgY29yZSBwb29sIHNpemUgd2lsbCBiZSBrZXB0IGFsaXZlIGl0IGlmIGlzIGluYWN0aXZlCi0gICAgICogICAgICAgICAoZGVmYXVsdCB3aXRoIHRocmVhZEtlZXBBbGl2ZVRpbWVVbml0IHRvIDE4MCBzZWNvbmRzKQotICAgICAqLwotICAgIHB1YmxpYyBsb25nIGdldFRocmVhZEtlZXBBbGl2ZVRpbWUoKSB7Ci0gICAgICAgIHJldHVybiB0aHJlYWRLZWVwQWxpdmVUaW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHRlciBmb3IgdGhyZWFkS2VlcEFsaXZlVGltZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFRocmVhZEtlZXBBbGl2ZVRpbWUobG9uZyB0aHJlYWRLZWVwQWxpdmVUaW1lKSB7Ci0gICAgICAgIHRoaXMudGhyZWFkS2VlcEFsaXZlVGltZSA9IHRocmVhZEtlZXBBbGl2ZVRpbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0dGVyIGZvciB0aHJlYWRLZWVwQWxpdmVUaW1lVW5pdAotICAgICAqIHJldHVybiB0aGUgdGltZSB1bml0IGZvciB0aHJlYWRLZWVwQWxpdmVUaW1lIChkZWZhdWx0IFNFQ09ORFMpCi0gICAgICovCi0gICAgcHVibGljIFRpbWVVbml0IGdldFRocmVhZEtlZXBBbGl2ZVRpbWVVbml0KCkgewotICAgICAgICByZXR1cm4gdGhyZWFkS2VlcEFsaXZlVGltZVVuaXQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0dGVyIGZvciB0aHJlYWRLZWVwQWxpdmVUaW1lVW5pdAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFRocmVhZEtlZXBBbGl2ZVRpbWVVbml0KFRpbWVVbml0IHRocmVhZEtlZXBBbGl2ZVRpbWVVbml0KSB7Ci0gICAgICAgIHRoaXMudGhyZWFkS2VlcEFsaXZlVGltZVVuaXQgPSB0aHJlYWRLZWVwQWxpdmVUaW1lVW5pdDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3RyYW5zcG9ydC9odHRwL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL3NlcnZlci9IdHRwU2VydmljZVByb2Nlc3Nvci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvdHJhbnNwb3J0L2h0dHAvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvc2VydmVyL0h0dHBTZXJ2aWNlUHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1NDRlMDEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvdHJhbnNwb3J0L2h0dHAvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvc2VydmVyL0h0dHBTZXJ2aWNlUHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLnNlcnZlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5Db25uZWN0aW9uQ2xvc2VkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IdHRwRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5wcm90b2NvbC5CYXNpY0h0dHBDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5wcm90b2NvbC5IdHRwQ29udGV4dDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuU29ja2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlNvY2tldFRpbWVvdXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0Jvb2xlYW47Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0xvbmc7Ci0KLS8qKgotICogSS9PIHByb2Nlc3NvciBpbnRlbmRlZCB0byBwcm9jZXNzIHJlcXVlc3RzIGFuZCBmaWxsIGluIHJlc3BvbnNlcy4KLSAqLwotcHVibGljIGNsYXNzIEh0dHBTZXJ2aWNlUHJvY2Vzc29yIGltcGxlbWVudHMgSU9Qcm9jZXNzb3IgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIExPRyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEh0dHBTZXJ2aWNlUHJvY2Vzc29yLmNsYXNzKTsKLQotICAgIC8qKiBDb3VudGVyIHVzZWQgdG8gY3JlYXRlIHVuaXF1ZSBJRHMuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgQXRvbWljTG9uZyBjb3VudGVyID0gbmV3IEF0b21pY0xvbmcoMEwpOwotCi0gICAgcHJpdmF0ZSBBdG9taWNCb29sZWFuIHRlcm1pbmF0ZWQ7Ci0KLSAgICBwcml2YXRlIGZpbmFsIEF4aXNIdHRwU2VydmljZSBodHRwc2VydmljZTsKLQotICAgIHByaXZhdGUgZmluYWwgQXhpc0h0dHBDb25uZWN0aW9uIGNvbm47Ci0KLSAgICBwcml2YXRlIGZpbmFsIElPUHJvY2Vzc29yQ2FsbGJhY2sgY2FsbGJhY2s7Ci0KLSAgICAvKioKLSAgICAgKiBVbmlxdWUgaWRlbnRpZmllciB1c2VkIGJ5IHtAbGlua3BsYWluICNlcXVhbHMoT2JqZWN0KX0gYW5kCi0gICAgICoge0BsaW5rcGxhaW4gI2hhc2hDb2RlKCl9LgotICAgICAqIDxwPgotICAgICAqIFRoaXMgZmllbGQgaXMgbmVlZGVkIHRvIGFsbG93IHRoZSBlcXVhbHMgbWV0aG9kIHRvIHdvcmsgcHJvcGVybHkgd2hlbiB0aGlzCi0gICAgICogSHR0cFNlcnZpY2VQcm9jZXNzb3IgaGFzIHRvIGJlIHJlbW92ZWQgZnJvbSB0aGUgbGlzdCBvZiBwcm9jZXNzb3JzLgotICAgICAqIAotICAgICAqIEBzZWUgRGVmYXVsdEh0dHBDb25uZWN0aW9uTWFuYWdlcgotICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgbG9uZyBpZDsKLQotCi0gICAgcHVibGljIEh0dHBTZXJ2aWNlUHJvY2Vzc29yKGZpbmFsIEF4aXNIdHRwU2VydmljZSBodHRwc2VydmljZSwKLSAgICAgICAgICAgIGZpbmFsIEF4aXNIdHRwQ29ubmVjdGlvbiBjb25uLCBmaW5hbCBJT1Byb2Nlc3NvckNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIHRoaXMuaHR0cHNlcnZpY2UgPSBodHRwc2VydmljZTsKLSAgICAgICAgdGhpcy5jb25uID0gY29ubjsKLSAgICAgICAgdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrOwotICAgICAgICB0aGlzLnRlcm1pbmF0ZWQgPSBuZXcgQXRvbWljQm9vbGVhbihmYWxzZSk7Ci0KLSAgICAgICAgaWQgPSBjb3VudGVyLmluY3JlbWVudEFuZEdldCgpOwotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICBMT0cuZGVidWcoIk5ldyBjb25uZWN0aW9uIHRocmVhZCIpOwotICAgICAgICBIdHRwQ29udGV4dCBjb250ZXh0ID0gbmV3IEJhc2ljSHR0cENvbnRleHQobnVsbCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB3aGlsZSAoISBUaHJlYWQuaW50ZXJydXB0ZWQoKSAmJiAhIGlzRGVzdHJveWVkKCkgJiYgdGhpcy5jb25uLmlzT3BlbigpKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5odHRwc2VydmljZS5oYW5kbGVSZXF1ZXN0KHRoaXMuY29ubiwgY29udGV4dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKENvbm5lY3Rpb25DbG9zZWRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIExPRy5kZWJ1ZygiQ2xpZW50IGNsb3NlZCBjb25uZWN0aW9uIik7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBTb2NrZXRUaW1lb3V0RXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgTE9HLmRlYnVnKGV4LmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGV4IGluc3RhbmNlb2YgU29ja2V0RXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgTE9HLmRlYnVnKGV4LmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIExPRy53YXJuKGV4LmdldE1lc3NhZ2UoKSwgZXgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChIdHRwRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBpZiAoTE9HLmlzV2FybkVuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIExPRy53YXJuKCJIVFRQIHByb3RvY29sIGVycm9yOiAiICsgZXguZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGRlc3Ryb3koKTsKLSAgICAgICAgICAgIGlmICh0aGlzLmNhbGxiYWNrID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIlRoZSBjYWxsYmFjayBvYmplY3QgY2FuJ3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhpcy5jYWxsYmFjay5jb21wbGV0ZWQodGhpcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5jb25uLmNsb3NlKCk7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCBkZXN0cm95KCkgewotICAgICAgICBpZiAodGhpcy50ZXJtaW5hdGVkLmNvbXBhcmVBbmRTZXQoZmFsc2UsIHRydWUpKSB7Ci0gICAgICAgICAgICB0cnkgewotLy8gICAgICAgICAgICAgICAgdGhpcy5jb25uLnNodXRkb3duKCk7Ci0gICAgICAgICAgICAgICAgY2xvc2UoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgTE9HLmRlYnVnKCJJL08gZXJyb3Igc2h1dHRpbmcgZG93biBjb25uZWN0aW9uIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRGVzdHJveWVkKCkgewotICAgICAgICByZXR1cm4gdGhpcy50ZXJtaW5hdGVkLmdldCgpOwotICAgIH0KLQotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTWV0aG9kcyBmcm9tIE9iamVjdAotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdW5pcXVlIElEIG9mIHRoaXMgSHR0cFNlcnZpY2VQcm9jZXNzb3IuCi0gICAgICogCi0gICAgICogQHJldHVybiBUaGUgdW5pcXVlIElEIG9mIHRoaXMgSHR0cFNlcnZpY2VQcm9jZXNzb3IuCi0gICAgICovCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICAgICAgZmluYWwgaW50IFBSSU1FID0gMzE7Ci0gICAgICAgIGludCByZXN1bHQgPSAxOwotICAgICAgICByZXN1bHQgPSBQUklNRSAqIHJlc3VsdCArIChpbnQpIChpZCBeIChpZCA+Pj4gMzIpKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLQotICAgLyoqCi0gICAgKiBJbmRpY2F0ZXMgd2hldGhlciBzb21lIG90aGVyIG9iamVjdCBpcyAiZXF1YWwgdG8iIHRoaXMgb25lLgotICAgICogCi0gICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgSHR0cFNlcnZpY2VQcm9jZXNzb3IgcmVmZXJlIHRvIHRoZSBzYW1lIAotICAgICogb2JqZWN0IGFzIG9iaiBvciB0aGV5IGhhdmUgdGhlIHNhbWUge0BsaW5rcGxhaW4gI2lkfSwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLSAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0gICAgICAgIGlmICh0aGlzID09IG9iaikKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICBpZiAob2JqID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGlmIChnZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBmaW5hbCBIdHRwU2VydmljZVByb2Nlc3NvciBvdGhlciA9IChIdHRwU2VydmljZVByb2Nlc3Nvcikgb2JqOwotICAgICAgICBpZiAoaWQgIT0gb3RoZXIuaWQpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvdHJhbnNwb3J0L2h0dHAvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvc2VydmVyL0h0dHBVdGlscy5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvdHJhbnNwb3J0L2h0dHAvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvc2VydmVyL0h0dHBVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjEzYTI4Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3RyYW5zcG9ydC9odHRwL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL3NlcnZlci9IdHRwVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5zZXJ2ZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5UcmFuc3BvcnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkhUVFBDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5odHRwLkhlYWRlcjsKLQotaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOwotaW1wb3J0IGphdmEubmV0Lk5ldHdvcmtJbnRlcmZhY2U7Ci1pbXBvcnQgamF2YS5uZXQuU29ja2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLQotcHVibGljIGNsYXNzIEh0dHBVdGlscyB7Ci0KLSAgICBwcml2YXRlIEh0dHBVdGlscygpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTb2FwQWN0aW9uKGZpbmFsIEF4aXNIdHRwUmVxdWVzdCByZXF1ZXN0KSB7Ci0gICAgICAgIGlmIChyZXF1ZXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIEhlYWRlciBoZWFkZXIgPSByZXF1ZXN0LmdldEZpcnN0SGVhZGVyKEhUVFBDb25zdGFudHMuSEVBREVSX1NPQVBfQUNUSU9OKTsKLSAgICAgICAgaWYgKGhlYWRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gaGVhZGVyLmdldFZhbHVlKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvdHJhbnNwb3J0L2h0dHAvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvc2VydmVyL0lPUHJvY2Vzc29yLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy90cmFuc3BvcnQvaHR0cC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9zZXJ2ZXIvSU9Qcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI3NmE4Ni4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy90cmFuc3BvcnQvaHR0cC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9zZXJ2ZXIvSU9Qcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5zZXJ2ZXI7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1wdWJsaWMgaW50ZXJmYWNlIElPUHJvY2Vzc29yIGV4dGVuZHMgUnVubmFibGUgewotCi0gICAgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotICAgIGJvb2xlYW4gaXNEZXN0cm95ZWQoKTsKLQotICAgIHZvaWQgZGVzdHJveSgpOwotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy90cmFuc3BvcnQvaHR0cC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9zZXJ2ZXIvSU9Qcm9jZXNzb3JDYWxsYmFjay5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvdHJhbnNwb3J0L2h0dHAvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvc2VydmVyL0lPUHJvY2Vzc29yQ2FsbGJhY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRkMDg3Yi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy90cmFuc3BvcnQvaHR0cC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9zZXJ2ZXIvSU9Qcm9jZXNzb3JDYWxsYmFjay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLnNlcnZlcjsKLQotcHVibGljIGludGVyZmFjZSBJT1Byb2Nlc3NvckNhbGxiYWNrIHsKLQotICAgIHZvaWQgY29tcGxldGVkKElPUHJvY2Vzc29yIHByb2Nlc3Nvcik7Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3RyYW5zcG9ydC9odHRwL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL3NlcnZlci9SZXF1ZXN0U2Vzc2lvbkNvb2tpZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvdHJhbnNwb3J0L2h0dHAvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvc2VydmVyL1JlcXVlc3RTZXNzaW9uQ29va2llLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiOGIyOGQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvdHJhbnNwb3J0L2h0dHAvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvc2VydmVyL1JlcXVlc3RTZXNzaW9uQ29va2llLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuc2VydmVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5IVFRQQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IZWFkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5odHRwLkhlYWRlckVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5odHRwLkh0dHBFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5odHRwLkh0dHBSZXF1ZXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IdHRwUmVxdWVzdEludGVyY2VwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5wcm90b2NvbC5IdHRwQ29udGV4dDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBSZXF1ZXN0U2Vzc2lvbkNvb2tpZSBpbXBsZW1lbnRzIEh0dHBSZXF1ZXN0SW50ZXJjZXB0b3IgewotCi0gICAgcHVibGljIHZvaWQgcHJvY2VzcyhmaW5hbCBIdHRwUmVxdWVzdCByZXF1ZXN0LCBmaW5hbCBIdHRwQ29udGV4dCBjb250ZXh0KQotICAgICAgICAgICAgdGhyb3dzIEh0dHBFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHJlcXVlc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSFRUUCByZXF1ZXN0IG1heSBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjb250ZXh0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkhUVFAgY29udGV4dCBtYXkgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBzZXNzaW9uQ29va2llID0gbnVsbDsKLSAgICAgICAgSGVhZGVyW10gaGVhZGVycyA9IHJlcXVlc3QuZ2V0SGVhZGVycyhIVFRQQ29uc3RhbnRzLkhFQURFUl9DT09LSUUpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGhlYWRlcnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIEhlYWRlckVsZW1lbnRbXSBlbGVtZW50cyA9IGhlYWRlcnNbaV0uZ2V0RWxlbWVudHMoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGUgPSAwOyBlIDwgZWxlbWVudHMubGVuZ3RoOyBlKyspIHsKLSAgICAgICAgICAgICAgICBIZWFkZXJFbGVtZW50IGVsZW1lbnQgPSBlbGVtZW50c1tlXTsKLSAgICAgICAgICAgICAgICBpZiAoQ29uc3RhbnRzLlNFU1NJT05fQ09PS0lFLmVxdWFsc0lnbm9yZUNhc2UoZWxlbWVudC5nZXROYW1lKCkpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuU0VTU0lPTl9DT09LSUVfSlNFU1NJT05JRC5lcXVhbHNJZ25vcmVDYXNlKGVsZW1lbnQuZ2V0TmFtZSgpKSkgewotICAgICAgICAgICAgICAgICAgICBzZXNzaW9uQ29va2llID0gZWxlbWVudC5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjb250ZXh0LnNldEF0dHJpYnV0ZShIVFRQQ29uc3RhbnRzLkNPT0tJRV9TVFJJTkcsIHNlc3Npb25Db29raWUpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvdHJhbnNwb3J0L2h0dHAvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvc2VydmVyL1Jlc3BvbnNlU2Vzc2lvbkNvb2tpZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvdHJhbnNwb3J0L2h0dHAvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvc2VydmVyL1Jlc3BvbnNlU2Vzc2lvbkNvb2tpZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxM2FkMmRjLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3RyYW5zcG9ydC9odHRwL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL3NlcnZlci9SZXNwb25zZVNlc3Npb25Db29raWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5zZXJ2ZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5IVFRQQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IdHRwRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IdHRwUmVzcG9uc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5odHRwLkh0dHBSZXNwb25zZUludGVyY2VwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5tZXNzYWdlLkJ1ZmZlcmVkSGVhZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5wcm90b2NvbC5IdHRwQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAudXRpbC5DaGFyQXJyYXlCdWZmZXI7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgUmVzcG9uc2VTZXNzaW9uQ29va2llIGltcGxlbWVudHMgSHR0cFJlc3BvbnNlSW50ZXJjZXB0b3IgewotCi0gICAgcHVibGljIHZvaWQgcHJvY2VzcyhmaW5hbCBIdHRwUmVzcG9uc2UgcmVzcG9uc2UsIGZpbmFsIEh0dHBDb250ZXh0IGNvbnRleHQpCi0gICAgICAgICAgICB0aHJvd3MgSHR0cEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotICAgICAgICBpZiAocmVzcG9uc2UgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSFRUUCByZXNwb25zZSBtYXkgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY29udGV4dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJIVFRQIGNvbnRleHQgbWF5IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgc2Vzc2lvbkNvb2tpZSA9IG51bGw7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1zZ2N0eCA9IChNZXNzYWdlQ29udGV4dCkgY29udGV4dC5nZXRBdHRyaWJ1dGUoQXhpc1BhcmFtcy5NRVNTQUdFX0NPTlRFWFQpOwotICAgICAgICBpZiAobXNnY3R4ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNlc3Npb25Db29raWUgPSAoU3RyaW5nKSBtc2djdHguZ2V0UHJvcGVydHkoSFRUUENvbnN0YW50cy5DT09LSUVfU1RSSU5HKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoc2Vzc2lvbkNvb2tpZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBzZXNzaW9uQ29va2llID0gKFN0cmluZykgY29udGV4dC5nZXRBdHRyaWJ1dGUoSFRUUENvbnN0YW50cy5DT09LSUVfU1RSSU5HKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoc2Vzc2lvbkNvb2tpZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBHZW5lcmF0ZSBOZXRzY2FwZSBzdHlsZSBjb29raWUgaGVhZGVyCi0gICAgICAgICAgICBDaGFyQXJyYXlCdWZmZXIgYnVmZmVyMSA9IG5ldyBDaGFyQXJyYXlCdWZmZXIoc2Vzc2lvbkNvb2tpZS5sZW5ndGgoKSArIDQwKTsKLSAgICAgICAgICAgIGJ1ZmZlcjEuYXBwZW5kKEhUVFBDb25zdGFudHMuSEVBREVSX1NFVF9DT09LSUUpOwotICAgICAgICAgICAgYnVmZmVyMS5hcHBlbmQoIjogIik7Ci0gICAgICAgICAgICBidWZmZXIxLmFwcGVuZChDb25zdGFudHMuU0VTU0lPTl9DT09LSUVfSlNFU1NJT05JRCk7Ci0gICAgICAgICAgICBidWZmZXIxLmFwcGVuZCgiPSIpOwotICAgICAgICAgICAgYnVmZmVyMS5hcHBlbmQoc2Vzc2lvbkNvb2tpZSk7Ci0gICAgICAgICAgICByZXNwb25zZS5hZGRIZWFkZXIobmV3IEJ1ZmZlcmVkSGVhZGVyKGJ1ZmZlcjEpKTsKLQotICAgICAgICAgICAgLy8gR2VuZXJhdGUgUkZDMjk2NSBjb29raWUyIGhlYWRlcgotICAgICAgICAgICAgQ2hhckFycmF5QnVmZmVyIGJ1ZmZlcjIgPSBuZXcgQ2hhckFycmF5QnVmZmVyKHNlc3Npb25Db29raWUubGVuZ3RoKCkgKyA1MCk7Ci0gICAgICAgICAgICBidWZmZXIyLmFwcGVuZChIVFRQQ29uc3RhbnRzLkhFQURFUl9TRVRfQ09PS0lFMik7Ci0gICAgICAgICAgICBidWZmZXIyLmFwcGVuZCgiOiAiKTsKLSAgICAgICAgICAgIGJ1ZmZlcjIuYXBwZW5kKENvbnN0YW50cy5TRVNTSU9OX0NPT0tJRV9KU0VTU0lPTklEKTsKLSAgICAgICAgICAgIGJ1ZmZlcjIuYXBwZW5kKCI9Iik7Ci0gICAgICAgICAgICBidWZmZXIyLmFwcGVuZChzZXNzaW9uQ29va2llKTsKLSAgICAgICAgICAgIGJ1ZmZlcjIuYXBwZW5kKCI7ICIpOwotICAgICAgICAgICAgaW50IHBvcnQgPSByZXNwb25zZS5nZXRQYXJhbXMoKS5nZXRJbnRQYXJhbWV0ZXIoQXhpc1BhcmFtcy5MSVNURU5FUl9QT1JULCAwKTsKLSAgICAgICAgICAgIGlmIChwb3J0ID4gMCkgewotICAgICAgICAgICAgICAgIGJ1ZmZlcjIuYXBwZW5kKCJQb3J0PVwiIik7Ci0gICAgICAgICAgICAgICAgYnVmZmVyMi5hcHBlbmQoSW50ZWdlci50b1N0cmluZyhwb3J0KSk7Ci0gICAgICAgICAgICAgICAgYnVmZmVyMi5hcHBlbmQoIlwiOyAiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJ1ZmZlcjIuYXBwZW5kKCJWZXJzaW9uPTEiKTsKLSAgICAgICAgICAgIHJlc3BvbnNlLmFkZEhlYWRlcihuZXcgQnVmZmVyZWRIZWFkZXIoYnVmZmVyMikpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy90cmFuc3BvcnQvaHR0cC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9zZXJ2ZXIvU2Vzc2lvbk1hbmFnZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3RyYW5zcG9ydC9odHRwL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL3NlcnZlci9TZXNzaW9uTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2NjZWExLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3RyYW5zcG9ydC9odHRwL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL3NlcnZlci9TZXNzaW9uTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLnNlcnZlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5VVUlER2VuZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5TZXJ2aWNlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuU2VydmljZUdyb3VwQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuU2Vzc2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuRGVwZW5kZW5jeU1hbmFnZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotcHVibGljIGNsYXNzIFNlc3Npb25NYW5hZ2VyIHsKLQotICAgIHByaXZhdGUgZmluYWwgTWFwIHNlc3Npb25tYXA7Ci0KLSAgICBwdWJsaWMgU2Vzc2lvbk1hbmFnZXIoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIHRoaXMuc2Vzc2lvbm1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBTZXNzaW9uQ29udGV4dCBnZXRTZXNzaW9uQ29udGV4dChTdHJpbmcgc2Vzc2lvbktleSkgewotICAgICAgICBTZXNzaW9uQ29udGV4dCBzZXNzaW9uQ29udGV4dCA9IG51bGw7Ci0gICAgICAgIGlmIChzZXNzaW9uS2V5ICE9IG51bGwgJiYgc2Vzc2lvbktleS5sZW5ndGgoKSAhPSAwKSB7Ci0gICAgICAgICAgICBzZXNzaW9uQ29udGV4dCA9IChTZXNzaW9uQ29udGV4dCkgdGhpcy5zZXNzaW9ubWFwLmdldChzZXNzaW9uS2V5KTsKLSAgICAgICAgfQotICAgICAgICBpZiAoc2Vzc2lvbkNvbnRleHQgPT0gbnVsbCkgewotICAgICAgICAgICAgc2Vzc2lvbktleSA9IFVVSURHZW5lcmF0b3IuZ2V0VVVJRCgpOwotICAgICAgICAgICAgc2Vzc2lvbkNvbnRleHQgPSBuZXcgU2Vzc2lvbkNvbnRleHQobnVsbCk7Ci0gICAgICAgICAgICBzZXNzaW9uQ29udGV4dC5zZXRDb29raWVJRChzZXNzaW9uS2V5KTsKLSAgICAgICAgICAgIHRoaXMuc2Vzc2lvbm1hcC5wdXQoc2Vzc2lvbktleSwgc2Vzc2lvbkNvbnRleHQpOwotICAgICAgICB9Ci0gICAgICAgIHNlc3Npb25Db250ZXh0LnRvdWNoKCk7Ci0gICAgICAgIGNsZWFudXBTZXJ2aWNlR3JvdXBDb250ZXh0cygpOwotICAgICAgICByZXR1cm4gc2Vzc2lvbkNvbnRleHQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNsZWFudXBTZXJ2aWNlR3JvdXBDb250ZXh0cygpIHsKLSAgICAgICAgbG9uZyBjdXJyZW50VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gdGhpcy5zZXNzaW9ubWFwLmtleVNldCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIFN0cmluZyBjb29raWVJRCA9IChTdHJpbmcpIGl0Lm5leHQoKTsKLSAgICAgICAgICAgIFNlc3Npb25Db250ZXh0IHNlc3Npb25Db250ZXh0ID0gKFNlc3Npb25Db250ZXh0KSB0aGlzLnNlc3Npb25tYXAuZ2V0KGNvb2tpZUlEKTsKLSAgICAgICAgICAgIGlmICgoY3VycmVudFRpbWUgLSBzZXNzaW9uQ29udGV4dC5nZXRMYXN0VG91Y2hlZFRpbWUoKSkgPgotICAgICAgICAgICAgICAgICAgICBzZXNzaW9uQ29udGV4dC5zZXNzaW9uQ29udGV4dFRpbWVvdXRJbnRlcnZhbCkgewotICAgICAgICAgICAgICAgIGl0LnJlbW92ZSgpOwotICAgICAgICAgICAgICAgIEl0ZXJhdG9yIHNlcnZpY2VHcm91cENvbnRleHQgPSBzZXNzaW9uQ29udGV4dC5nZXRTZXJ2aWNlR3JvdXBDb250ZXh0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKHNlcnZpY2VHcm91cENvbnRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoc2VydmljZUdyb3VwQ29udGV4dC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZpY2VHcm91cENvbnRleHQgZ3JvdXBDb250ZXh0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFNlcnZpY2VHcm91cENvbnRleHQpIHNlcnZpY2VHcm91cENvbnRleHQubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgY2xlYW51cFNlcnZpY2VDb250ZXh0cyhncm91cENvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNsZWFudXBTZXJ2aWNlQ29udGV4dHMoZmluYWwgU2VydmljZUdyb3VwQ29udGV4dCBzZXJ2aWNlR3JvdXBDb250ZXh0KSB7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBzZXJ2aWNlR3JvdXBDb250ZXh0LmdldFNlcnZpY2VDb250ZXh0cygpOyBpdC5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBTZXJ2aWNlQ29udGV4dCBzZXJ2aWNlQ29udGV4dCA9IChTZXJ2aWNlQ29udGV4dCkgaXQubmV4dCgpOwotICAgICAgICAgICAgRGVwZW5kZW5jeU1hbmFnZXIuZGVzdHJveVNlcnZpY2VPYmplY3Qoc2VydmljZUNvbnRleHQpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy90cmFuc3BvcnQvaHR0cC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9zZXJ2ZXIvU2ltcGxlSHR0cFNlcnZlci5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvdHJhbnNwb3J0L2h0dHAvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvc2VydmVyL1NpbXBsZUh0dHBTZXJ2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjJkNmE5Ny4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy90cmFuc3BvcnQvaHR0cC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9zZXJ2ZXIvU2ltcGxlSHR0cFNlcnZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5zZXJ2ZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5odHRwLnBhcmFtcy5IdHRwUGFyYW1zOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvclNlcnZpY2U7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7Ci0KLS8qKgotICogQSBzaW1wbGUsIGJ1dCBjb25maWd1cmFibGUgYW5kIGV4dGVuc2libGUgSFRUUCBzZXJ2ZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBTaW1wbGVIdHRwU2VydmVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIExvZyBMT0cgPSBMb2dGYWN0b3J5LmdldExvZyhTaW1wbGVIdHRwU2VydmVyLmNsYXNzKTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTSFVURE9XTl9HUkFDRV9QRVJJT0QgPSAzMDAwOyAvLyBtcwotCi0gICAgcHJpdmF0ZSBIdHRwRmFjdG9yeSBodHRwRmFjdG9yeTsKLSAgICBwcml2YXRlIGZpbmFsIGludCBwb3J0OwotICAgIHByaXZhdGUgZmluYWwgSHR0cFBhcmFtcyBwYXJhbXM7Ci0gICAgcHJpdmF0ZSBmaW5hbCBXb3JrZXJGYWN0b3J5IHdvcmtlckZhY3Rvcnk7Ci0KLSAgICBwcml2YXRlIElPUHJvY2Vzc29yIGxpc3RlbmVyID0gbnVsbDsKLSAgICBwcml2YXRlIEV4ZWN1dG9yU2VydmljZSBsaXN0ZW5lckV4ZWN1dG9yID0gbnVsbDsKLSAgICBwcml2YXRlIEh0dHBDb25uZWN0aW9uTWFuYWdlciBjb25ubWFuYWdlciA9IG51bGw7Ci0gICAgcHJpdmF0ZSBFeGVjdXRvclNlcnZpY2UgcmVxdWVzdEV4ZWN1dG9yID0gbnVsbDsKLQotICAgIHB1YmxpYyBTaW1wbGVIdHRwU2VydmVyKENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ3VyYXRpb25Db250ZXh0LCBXb3JrZXJGYWN0b3J5IHdvcmtlckZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBvcnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMobmV3IEh0dHBGYWN0b3J5KGNvbmZpZ3VyYXRpb25Db250ZXh0LCBwb3J0LCB3b3JrZXJGYWN0b3J5KSwgcG9ydCk7Ci0gICAgfQotCi0gICAgcHVibGljIFNpbXBsZUh0dHBTZXJ2ZXIoSHR0cEZhY3RvcnkgaHR0cEZhY3RvcnksIGludCBwb3J0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICB0aGlzLmh0dHBGYWN0b3J5ID0gaHR0cEZhY3Rvcnk7Ci0gICAgICAgIHRoaXMucG9ydCA9IHBvcnQ7Ci0gICAgICAgIHRoaXMud29ya2VyRmFjdG9yeSA9IGh0dHBGYWN0b3J5Lm5ld1JlcXVlc3RXb3JrZXJGYWN0b3J5KCk7Ci0gICAgICAgIHRoaXMucGFyYW1zID0gaHR0cEZhY3RvcnkubmV3UmVxdWVzdENvbm5lY3Rpb25QYXJhbXMoKTsKLSAgICAgICAgdGhpcy5wYXJhbXMuc2V0SW50UGFyYW1ldGVyKEF4aXNQYXJhbXMuTElTVEVORVJfUE9SVCwgcG9ydCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaW5pdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHJlcXVlc3RFeGVjdXRvciA9IGh0dHBGYWN0b3J5Lm5ld1JlcXVlc3RFeGVjdXRvcihwb3J0KTsKLSAgICAgICAgY29ubm1hbmFnZXIgPQotICAgICAgICAgICAgICAgIGh0dHBGYWN0b3J5Lm5ld1JlcXVlc3RDb25uZWN0aW9uTWFuYWdlcihyZXF1ZXN0RXhlY3V0b3IsIHdvcmtlckZhY3RvcnksIHBhcmFtcyk7Ci0gICAgICAgIGxpc3RlbmVyRXhlY3V0b3IgPSBodHRwRmFjdG9yeS5uZXdMaXN0ZW5lckV4ZWN1dG9yKHBvcnQpOwotICAgICAgICBsaXN0ZW5lciA9IGh0dHBGYWN0b3J5Lm5ld1JlcXVlc3RDb25uZWN0aW9uTGlzdGVuZXIocG9ydCwgY29ubm1hbmFnZXIsIHBhcmFtcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGVzdHJveSgpIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotICAgICAgICAvLyBBdHRlbXB0IHRvIHRlcm1pbmF0ZSB0aGUgbGlzdGVuZXIgbmljZWx5Ci0gICAgICAgIExPRy5pbmZvKCJTaHV0IGRvd24gY29ubmVjdGlvbiBsaXN0ZW5lciIpOwotICAgICAgICB0aGlzLmxpc3RlbmVyRXhlY3V0b3Iuc2h1dGRvd25Ob3coKTsKLSAgICAgICAgdGhpcy5saXN0ZW5lci5kZXN0cm95KCk7Ci0gICAgICAgIHRoaXMubGlzdGVuZXJFeGVjdXRvci5hd2FpdFRlcm1pbmF0aW9uKFNIVVRET1dOX0dSQUNFX1BFUklPRCwgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKLSAgICAgICAgaWYgKCF0aGlzLmxpc3RlbmVyRXhlY3V0b3IuaXNUZXJtaW5hdGVkKCkpIHsKLSAgICAgICAgICAgIC8vIFRlcm1pbmF0ZSB0aGUgbGlzdGVuZXIgZm9yY2libHkKLSAgICAgICAgICAgIExPRy5pbmZvKCJGb3JjZSBzaHV0IGRvd24gY29ubmVjdGlvbiBsaXN0ZW5lciIpOwotICAgICAgICAgICAgdGhpcy5saXN0ZW5lci5kZXN0cm95KCk7Ci0gICAgICAgICAgICAvLyBMZWF2ZSBpdCB1cCB0byB0aGUgZ2FyYmFnZSBjb2xsZWN0b3IgdG8gY2xlYW4gdXAgdGhlIG1lc3MKLSAgICAgICAgICAgIHRoaXMubGlzdGVuZXIgPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIC8vIEF0dGVtcHQgdG8gdGVybWluYXRlIHRoZSBhY3RpdmUgcHJvY2Vzc29ycyBuaWNlbHkKLSAgICAgICAgTE9HLmluZm8oIlNodXQgZG93biBIVFRQIHByb2Nlc3NvcnMiKTsKLSAgICAgICAgdGhpcy5yZXF1ZXN0RXhlY3V0b3Iuc2h1dGRvd25Ob3coKTsKLSAgICAgICAgdGhpcy5yZXF1ZXN0RXhlY3V0b3IuYXdhaXRUZXJtaW5hdGlvbihTSFVURE9XTl9HUkFDRV9QRVJJT0QsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7Ci0gICAgICAgIGlmICghdGhpcy5yZXF1ZXN0RXhlY3V0b3IuaXNUZXJtaW5hdGVkKCkpIHsKLSAgICAgICAgICAgIC8vIFRlcm1pbmF0ZSB0aGUgYWN0aXZlIHByb2Nlc3NvcnMgZm9yY2libHkKLSAgICAgICAgICAgIExPRy5pbmZvKCJGb3JjZSBzaHV0IGRvd24gSFRUUCBwcm9jZXNzb3JzIik7Ci0gICAgICAgICAgICB0aGlzLmNvbm5tYW5hZ2VyLnNodXRkb3duKCk7Ci0gICAgICAgICAgICAvLyBMZWF2ZSBpdCB1cCB0byB0aGUgZ2FyYmFnZSBjb2xsZWN0b3IgdG8gY2xlYW4gdXAgdGhlIG1lc3MKLSAgICAgICAgICAgIHRoaXMuY29ubm1hbmFnZXIgPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIExPRy5pbmZvKCJIVFRQIHByb3RvY29sIGhhbmRsZXIgc2h1dCBkb3duIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RhcnQoKSB7Ci0gICAgICAgIHRoaXMubGlzdGVuZXJFeGVjdXRvci5leGVjdXRlKHRoaXMubGlzdGVuZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzUnVubmluZygpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMubGlzdGVuZXJFeGVjdXRvciAhPSBudWxsICYmICF0aGlzLmxpc3RlbmVyRXhlY3V0b3IuaXNTaHV0ZG93bigpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0UG9ydCgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucG9ydDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3RyYW5zcG9ydC9odHRwL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL3NlcnZlci9Xb3JrZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3RyYW5zcG9ydC9odHRwL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL3NlcnZlci9Xb3JrZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc5Y2FhZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy90cmFuc3BvcnQvaHR0cC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9zZXJ2ZXIvV29ya2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuc2VydmVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IdHRwRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotcHVibGljIGludGVyZmFjZSBXb3JrZXIgewotCi0gICAgdm9pZCBzZXJ2aWNlKEF4aXNIdHRwUmVxdWVzdCByZXF1ZXN0LCBBeGlzSHR0cFJlc3BvbnNlIHJlc3BvbnNlLCBNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KQotICAgICAgICAgICAgdGhyb3dzIEh0dHBFeGNlcHRpb24sIElPRXhjZXB0aW9uOwotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy90cmFuc3BvcnQvaHR0cC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9zZXJ2ZXIvV29ya2VyRmFjdG9yeS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvdHJhbnNwb3J0L2h0dHAvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvc2VydmVyL1dvcmtlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTExYzRiYi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy90cmFuc3BvcnQvaHR0cC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9zZXJ2ZXIvV29ya2VyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLnNlcnZlcjsKLQotcHVibGljIGludGVyZmFjZSBXb3JrZXJGYWN0b3J5IHsKLQotICAgIFdvcmtlciBuZXdXb3JrZXIoKTsKLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvdHJhbnNwb3J0L2h0dHAvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvdXRpbC9SRVNUVXRpbC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvdHJhbnNwb3J0L2h0dHAvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvdXRpbC9SRVNUVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjAxMWIwLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3RyYW5zcG9ydC9odHRwL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL3V0aWwvUkVTVFV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAudXRpbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5idWlsZGVyLkJ1aWxkZXJVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNCaW5kaW5nT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc0VuZHBvaW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uV1NETDJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5IVFRQTG9jYXRpb25CYXNlZERpc3BhdGNoZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5SZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSU9wZXJhdGlvbkRpc3BhdGNoZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0VuZ2luZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5IYW5kbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0LlRyYW5zcG9ydFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuSFRUUENvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkhUVFBUcmFuc3BvcnRVdGlsczsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLQotLyoqCi0gKgotICovCi1wdWJsaWMgY2xhc3MgUkVTVFV0aWwgewotCi0gICAgcHVibGljIHN0YXRpYyBIYW5kbGVyLkludm9jYXRpb25SZXNwb25zZSBwcm9jZXNzWE1MUmVxdWVzdChNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdXRwdXRTdHJlYW0gb3V0LCBTdHJpbmcgY29udGVudFR5cGUpCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1zZ0NvbnRleHQuc2V0RG9pbmdSRVNUKHRydWUpOwotICAgICAgICAgICAgU3RyaW5nIGNoYXJTZXRFbmNvZGluZyA9IEJ1aWxkZXJVdGlsLmdldENoYXJTZXRFbmNvZGluZyhjb250ZW50VHlwZSk7Ci0gICAgICAgICAgICBtc2dDb250ZXh0LnNldFByb3BlcnR5KENvbnN0YW50cy5Db25maWd1cmF0aW9uLkNIQVJBQ1RFUl9TRVRfRU5DT0RJTkcsIGNoYXJTZXRFbmNvZGluZyk7Ci0gICAgICAgICAgICBkaXNwYXRjaEFuZFZlcmlmeShtc2dDb250ZXh0KTsKLSAgICAgICAgICAgIGluID0gSFRUUFRyYW5zcG9ydFV0aWxzLmhhbmRsZUdaaXAobXNnQ29udGV4dCwgaW4pOwotICAgICAgICAgICAgU09BUEVudmVsb3BlIHNvYXBFbnZlbG9wZSA9IFRyYW5zcG9ydFV0aWxzCi0gICAgICAgICAgICAgICAgICAgIC5jcmVhdGVTT0FQTWVzc2FnZShtc2dDb250ZXh0LCBpbiwgY29udGVudFR5cGUpOwotICAgICAgICAgICAgbXNnQ29udGV4dC5zZXRFbnZlbG9wZShzb2FwRW52ZWxvcGUpOwotICAgICAgICAgICAgbXNnQ29udGV4dC5zZXRQcm9wZXJ0eShDb25zdGFudHMuQ29uZmlndXJhdGlvbi5DT05URU5UX1RZUEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlKTsKLQotICAgICAgICAgICAgbXNnQ29udGV4dC5zZXRQcm9wZXJ0eShNZXNzYWdlQ29udGV4dC5UUkFOU1BPUlRfT1VULCBvdXQpOwotCi0gICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBheGlzRmF1bHQpIHsKLSAgICAgICAgICAgIHRocm93IGF4aXNGYXVsdDsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEF4aXNGYXVsdC5tYWtlRmF1bHQoZSk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEF4aXNGYXVsdC5tYWtlRmF1bHQoZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBTdHJpbmcgbWVzc2FnZVR5cGUgPQotICAgICAgICAgICAgICAgICAgICAoU3RyaW5nKSBtc2dDb250ZXh0LmdldFByb3BlcnR5KENvbnN0YW50cy5Db25maWd1cmF0aW9uLk1FU1NBR0VfVFlQRSk7Ci0gICAgICAgICAgICBpZiAoSFRUUENvbnN0YW50cy5NRURJQV9UWVBFX1hfV1dXX0ZPUk0uZXF1YWxzKG1lc3NhZ2VUeXBlKSB8fAotICAgICAgICAgICAgICAgICAgICBIVFRQQ29uc3RhbnRzLk1FRElBX1RZUEVfTVVMVElQQVJUX0ZPUk1fREFUQS5lcXVhbHMobWVzc2FnZVR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgbXNnQ29udGV4dC5zZXRQcm9wZXJ0eShDb25zdGFudHMuQ29uZmlndXJhdGlvbi5NRVNTQUdFX1RZUEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIVFRQQ29uc3RhbnRzLk1FRElBX1RZUEVfQVBQTElDQVRJT05fWE1MKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaW52b2tlQXhpc0VuZ2luZShtc2dDb250ZXh0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEhhbmRsZXIuSW52b2NhdGlvblJlc3BvbnNlIHByb2Nlc3NVUkxSZXF1ZXN0KE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdXRwdXRTdHJlYW0gb3V0LCBTdHJpbmcgY29udGVudFR5cGUpCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgLy8gaGVyZSwgb25seSB0aGUgcGFyYW1ldGVycyBpbiB0aGUgVVJJIGFyZSBzdXBwb3J0ZWQuIE90aGVycyB3aWxsIGJlIGRpc2NhcmRlZC4KLSAgICAgICAgdHJ5IHsKLQotICAgICAgICAgICAgaWYgKGNvbnRlbnRUeXBlID09IG51bGwgfHwgIiIuZXF1YWxzKGNvbnRlbnRUeXBlKSkgewotICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlID0gSFRUUENvbnN0YW50cy5NRURJQV9UWVBFX1hfV1dXX0ZPUk07Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHNldCB0aGUgcmVxdWlyZWQgcHJvcGVydGllcyBzbyB0aGF0IGV2ZW4gaWYgdGhlcmUgaXMgYW4gZXJyb3IgZHVyaW5nIHRoZSBkaXNwYXRjaAotICAgICAgICAgICAgLy8gcGhhc2UgdGhlIHJlc3BvbnNlIG1lc3NhZ2Ugd2lsbCBiZSBwYXNzZWQgdG8gdGhlIGNsaWVudCB3ZWxsLiAKLSAgICAgICAgICAgIG1zZ0NvbnRleHQuc2V0RG9pbmdSRVNUKHRydWUpOwotICAgICAgICAgICAgbXNnQ29udGV4dC5zZXRQcm9wZXJ0eShNZXNzYWdlQ29udGV4dC5UUkFOU1BPUlRfT1VULCBvdXQpOwotICAgICAgICAgICAgU3RyaW5nIGNoYXJTZXRFbmNvZGluZyA9IEJ1aWxkZXJVdGlsLmdldENoYXJTZXRFbmNvZGluZyhjb250ZW50VHlwZSk7Ci0gICAgICAgICAgICBtc2dDb250ZXh0LnNldFByb3BlcnR5KENvbnN0YW50cy5Db25maWd1cmF0aW9uLkNIQVJBQ1RFUl9TRVRfRU5DT0RJTkcsIGNoYXJTZXRFbmNvZGluZyk7Ci0gICAgICAgICAgICAvLyAxLiBGaXJzdCBkaXNwYXRjaEFuZFZlcmlmeSBhbmQgZmluZCBvdXQgdGhlIHNlcnZpY2UgYW5kIHRoZSBvcGVyYXRpb24uCi0gICAgICAgICAgICBkaXNwYXRjaEFuZFZlcmlmeShtc2dDb250ZXh0KTsKLSAgICAgICAgICAgIFNPQVBFbnZlbG9wZSBzb2FwRW52ZWxvcGU7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHNvYXBFbnZlbG9wZSA9IFRyYW5zcG9ydFV0aWxzCi0gICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlU09BUE1lc3NhZ2UobXNnQ29udGV4dCwgbnVsbCwgY29udGVudFR5cGUpOwotICAgICAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBBeGlzRmF1bHQubWFrZUZhdWx0KGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtc2dDb250ZXh0LnNldEVudmVsb3BlKHNvYXBFbnZlbG9wZSk7Ci0KLQotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgYXhpc0ZhdWx0KSB7Ci0gICAgICAgICAgICB0aHJvdyBheGlzRmF1bHQ7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEF4aXNGYXVsdC5tYWtlRmF1bHQoZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBTdHJpbmcgbWVzc2FnZVR5cGUgPQotICAgICAgICAgICAgICAgICAgICAoU3RyaW5nKSBtc2dDb250ZXh0LmdldFByb3BlcnR5KENvbnN0YW50cy5Db25maWd1cmF0aW9uLk1FU1NBR0VfVFlQRSk7Ci0gICAgICAgICAgICBpZiAoSFRUUENvbnN0YW50cy5NRURJQV9UWVBFX1hfV1dXX0ZPUk0uZXF1YWxzKG1lc3NhZ2VUeXBlKSB8fAotICAgICAgICAgICAgICAgICAgICBIVFRQQ29uc3RhbnRzLk1FRElBX1RZUEVfTVVMVElQQVJUX0ZPUk1fREFUQS5lcXVhbHMobWVzc2FnZVR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgbXNnQ29udGV4dC5zZXRQcm9wZXJ0eShDb25zdGFudHMuQ29uZmlndXJhdGlvbi5NRVNTQUdFX1RZUEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIVFRQQ29uc3RhbnRzLk1FRElBX1RZUEVfQVBQTElDQVRJT05fWE1MKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaW52b2tlQXhpc0VuZ2luZShtc2dDb250ZXh0KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBIYW5kbGVyLkludm9jYXRpb25SZXNwb25zZSBpbnZva2VBeGlzRW5naW5lKE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0KQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIHJldHVybiBBeGlzRW5naW5lLnJlY2VpdmUobWVzc2FnZUNvbnRleHQpOwotCi0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBkaXNwYXRjaEFuZFZlcmlmeShNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciByZXF1ZXN0RGlzcGF0Y2hlciA9IG5ldyBSZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyKCk7Ci0gICAgICAgIHJlcXVlc3REaXNwYXRjaGVyLmludm9rZShtc2dDb250ZXh0KTsKLSAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UgPSBtc2dDb250ZXh0LmdldEF4aXNTZXJ2aWNlKCk7Ci0gICAgICAgIGlmIChheGlzU2VydmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBIVFRQTG9jYXRpb25CYXNlZERpc3BhdGNoZXIgaHR0cExvY2F0aW9uQmFzZWREaXNwYXRjaGVyID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IEhUVFBMb2NhdGlvbkJhc2VkRGlzcGF0Y2hlcigpOwotICAgICAgICAgICAgaHR0cExvY2F0aW9uQmFzZWREaXNwYXRjaGVyLmludm9rZShtc2dDb250ZXh0KTsKLSAgICAgICAgICAgIGlmIChtc2dDb250ZXh0LmdldEF4aXNPcGVyYXRpb24oKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgUmVxdWVzdFVSSU9wZXJhdGlvbkRpc3BhdGNoZXIgcmVxdWVzdFVSSU9wZXJhdGlvbkRpc3BhdGNoZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFJlcXVlc3RVUklPcGVyYXRpb25EaXNwYXRjaGVyKCk7Ci0gICAgICAgICAgICAgICAgcmVxdWVzdFVSSU9wZXJhdGlvbkRpc3BhdGNoZXIuaW52b2tlKG1zZ0NvbnRleHQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb247Ci0gICAgICAgICAgICBpZiAoKGF4aXNPcGVyYXRpb24gPSBtc2dDb250ZXh0LmdldEF4aXNPcGVyYXRpb24oKSkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIEF4aXNFbmRwb2ludCBheGlzRW5kcG9pbnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgKEF4aXNFbmRwb2ludCkgbXNnQ29udGV4dC5nZXRQcm9wZXJ0eShXU0RMMkNvbnN0YW50cy5FTkRQT0lOVF9MT0NBTF9OQU1FKTsKLSAgICAgICAgICAgICAgICBpZiAoYXhpc0VuZHBvaW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgQXhpc0JpbmRpbmdPcGVyYXRpb24gYXhpc0JpbmRpbmdPcGVyYXRpb24gPSAoQXhpc0JpbmRpbmdPcGVyYXRpb24pIGF4aXNFbmRwb2ludAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRCaW5kaW5nKCkuZ2V0Q2hpbGQoYXhpc09wZXJhdGlvbi5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICBtc2dDb250ZXh0LnNldFByb3BlcnR5KENvbnN0YW50cy5BWElTX0JJTkRJTkdfT1BFUkFUSU9OLCBheGlzQmluZGluZ09wZXJhdGlvbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1zZ0NvbnRleHQuc2V0QXhpc09wZXJhdGlvbihheGlzT3BlcmF0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotCi19Ci0KLQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvdHJhbnNwb3J0L2xvY2FsL3BvbS54bWwgYi92MS41LjFSQzMvbW9kdWxlcy90cmFuc3BvcnQvbG9jYWwvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FkZTdlZC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy90cmFuc3BvcnQvbG9jYWwvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjEuNS4xPC92ZXJzaW9uPgotICAgICAgICA8cmVsYXRpdmVQYXRoPi4uLy4uL3BhcmVudC9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+Ci0gICAgPC9wYXJlbnQ+Ci0gICAgPGFydGlmYWN0SWQ+YXhpczItdHJhbnNwb3J0LWxvY2FsPC9hcnRpZmFjdElkPgotICAgIDxuYW1lPkFwYWNoZSBBeGlzMiAtIFRyYW5zcG9ydCAtIExvY2FsPC9uYW1lPgotICAgIDxkZXNjcmlwdGlvbj5UaGlzIGluY2x1ZXMgYWxsIHRoZSBhdmFpbGFibGUgdHJhbnNwb3J0cyBpbiBBeGlzMjwvZGVzY3JpcHRpb24+Ci0gICAgPHBhY2thZ2luZz5idW5kbGU8L3BhY2thZ2luZz4KLQotICAgIDxidWlsZD4KLSAgICAgICAgPHNvdXJjZURpcmVjdG9yeT5zcmM8L3NvdXJjZURpcmVjdG9yeT4KLSAgICAgICAgPHRlc3RTb3VyY2VEaXJlY3Rvcnk+dGVzdDwvdGVzdFNvdXJjZURpcmVjdG9yeT4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZmVsaXg8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYnVuZGxlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4xLjQuMDwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8ZXh0ZW5zaW9ucz50cnVlPC9leHRlbnNpb25zPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8aW5zdHJ1Y3Rpb25zPgotICAgICAgICAgICAgICAgICAgICAgICAgPEJ1bmRsZS1WZXJzaW9uPjEuMDwvQnVuZGxlLVZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8QnVuZGxlLU5hbWU+JHtwb20uYXJ0aWZhY3RJZH08L0J1bmRsZS1OYW1lPgotICAgICAgICAgICAgICAgICAgICAgICAgPEJ1bmRsZS1WZW5kb3I+QXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb248L0J1bmRsZS1WZW5kb3I+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8QnVuZGxlLURlc2NyaXB0aW9uPiR7cG9tLmRlc2NyaXB0aW9ufTwvQnVuZGxlLURlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPEJ1bmRsZS1TeW1ib2xpY05hbWU+JHtwb20uYXJ0aWZhY3RJZH08L0J1bmRsZS1TeW1ib2xpY05hbWU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8RXhwb3J0LVBhY2thZ2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQubG9jYWwuKjstc3BsaXQtcGFja2FnZTo9bWVyZ2UtbGFzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIDwvRXhwb3J0LVBhY2thZ2U+Ci0gICAgICAgICAgICAgICAgICAgIDwvaW5zdHJ1Y3Rpb25zPgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgICAgIDxyZXNvdXJjZXM+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5jb25mPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi8qLnByb3BlcnRpZXM8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9leGNsdWRlcz4KLSAgICAgICAgICAgICAgICA8ZmlsdGVyaW5nPmZhbHNlPC9maWx0ZXJpbmc+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi8qLmphdmE8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9leGNsdWRlcz4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgIDwvcmVzb3VyY2VzPgotICAgIDwvYnVpbGQ+Ci0KLSAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1rZXJuZWw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3ZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPC9kZXBlbmRlbmNpZXM+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy90cmFuc3BvcnQvbG9jYWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2xvY2FsL0xvY2FsUmVzcG9uZGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy90cmFuc3BvcnQvbG9jYWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2xvY2FsL0xvY2FsUmVzcG9uZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmNzJmM2EuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvdHJhbnNwb3J0L2xvY2FsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9sb2NhbC9Mb2NhbFJlc3BvbmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5sb2NhbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uVHJhbnNwb3J0T3V0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5oYW5kbGVycy5BYnN0cmFjdEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuVHJhbnNwb3J0U2VuZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0LlRyYW5zcG9ydFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci0KLS8qKgotICogTG9jYWxSZXNwb25kZXIKLSAqLwotcHVibGljIGNsYXNzIExvY2FsUmVzcG9uZGVyIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyIGltcGxlbWVudHMgVHJhbnNwb3J0U2VuZGVyIHsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhMb2NhbFJlc3BvbmRlci5jbGFzcyk7Ci0gICAgCi0gICAgCi0gICAgLy8gIGZpeGVkIGZvciBFeGVjdXRpbmcgTG9jYWxUcmFuc3BvcnQgaW4gTXVsdGhUaHJlYWQuIAotICAgIHByaXZhdGUgT3V0cHV0U3RyZWFtIG91dDsKLQotICAgIHB1YmxpYyBMb2NhbFJlc3BvbmRlcihPdXRwdXRTdHJlYW0gcmVzcG9uc2UpIHsKLSAgICAgICAgdGhpcy5vdXQgPSByZXNwb25zZTsgICAgICAgIAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGluaXQoQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZkNvbnRleHQsIFRyYW5zcG9ydE91dERlc2NyaXB0aW9uIHRyYW5zcG9ydE91dCkKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHN0b3AoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2xlYW51cChNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgaW52b2tlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbXNnQ29udGV4dCB0aGUgYWN0aXZlIE1lc3NhZ2VDb250ZXh0Ci0gICAgICogQHRocm93cyBBeGlzRmF1bHQKLSAgICAgKi8KLSAgICBwdWJsaWMgSW52b2NhdGlvblJlc3BvbnNlIGludm9rZShNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLQotICAgICAgICAvLyBDaGVjayBmb3IgdGhlIFJFU1QgYmVoYXZpb3VyLCBpZiB5b3UgZGVzaXJlIHJlc3QgYmVhaGF2aW91cgotICAgICAgICAvLyBwdXQgYSA8cGFyYW1ldGVyIG5hbWU9ImRvUkVTVCIgdmFsdWU9InRydWUiLz4gYXQgdGhlIGF4aXMyLnhtbAotICAgICAgICBtc2dDb250ZXh0LnNldERvaW5nTVRPTShUcmFuc3BvcnRVdGlscy5kb1dyaXRlTVRPTShtc2dDb250ZXh0KSk7Ci0gICAgICAgIG1zZ0NvbnRleHQuc2V0RG9pbmdTd0EoVHJhbnNwb3J0VXRpbHMuZG9Xcml0ZVN3QShtc2dDb250ZXh0KSk7Ci0KLSAgICAgICAgRW5kcG9pbnRSZWZlcmVuY2UgZXByID0gbnVsbDsKLQotICAgICAgICBpZiAobXNnQ29udGV4dC5nZXRUbygpICE9IG51bGwgJiYgIW1zZ0NvbnRleHQuZ2V0VG8oKS5oYXNBbm9ueW1vdXNBZGRyZXNzKCkpIHsKLSAgICAgICAgICAgIGVwciA9IG1zZ0NvbnRleHQuZ2V0VG8oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICAgICAgVHJhbnNwb3J0VXRpbHMud3JpdGVNZXNzYWdlKG1zZ0NvbnRleHQsIG9zKTsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlJlc3BvbnNlIC0gIiArIG5ldyBTdHJpbmcob3MudG9CeXRlQXJyYXkoKSkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoZXByICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoIWVwci5oYXNOb25lQWRkcmVzcygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFRyYW5zcG9ydFV0aWxzLndyaXRlTWVzc2FnZShtc2dDb250ZXh0LCBvdXQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgb3V0ID0gKE91dHB1dFN0cmVhbSkgbXNnQ29udGV4dC5nZXRQcm9wZXJ0eShNZXNzYWdlQ29udGV4dC5UUkFOU1BPUlRfT1VUKTsKLQotICAgICAgICAgICAgICAgIGlmIChvdXQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBUcmFuc3BvcnRVdGlscy53cml0ZU1lc3NhZ2UobXNnQ29udGV4dCwgb3V0KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCb3RoIHRoZSBUTyBhbmQgUHJvcGVydHkgTWVzc2FnZUNvbnRleHQuVFJBTlNQT1JUX09VVCBpcyBOdWxsLCBObyB3aGVyZSB0byBzZW5kIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgYXhpc0ZhdWx0KSB7Ci0gICAgICAgICAgICAvLyBBdCB0aGlzIHBvaW50IGFsbCB3ZSBjYW4gZG8gaXMgbG9nIHRoaXMgZXJyb3IsIHNpbmNlIGl0IGhhcHBlbmVkIHdoaWxlCi0gICAgICAgICAgICAvLyB3ZSB3ZXJlIHNlbmRpbmcgdGhlIHJlc3BvbnNlIQotICAgICAgICAgICAgbG9nLmVycm9yKCJFcnJvciBzZW5kaW5nIHJlc3BvbnNlIiwgYXhpc0ZhdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFRyYW5zcG9ydFV0aWxzLnNldFJlc3BvbnNlV3JpdHRlbihtc2dDb250ZXh0LCB0cnVlKTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiBJbnZvY2F0aW9uUmVzcG9uc2UuQ09OVElOVUU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvdHJhbnNwb3J0L2xvY2FsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9sb2NhbC9Mb2NhbFJlc3BvbnNlVHJhbnNwb3J0T3V0RGVzY3JpcHRpb24uamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3RyYW5zcG9ydC9sb2NhbC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvbG9jYWwvTG9jYWxSZXNwb25zZVRyYW5zcG9ydE91dERlc2NyaXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0YjcwMmUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvdHJhbnNwb3J0L2xvY2FsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9sb2NhbC9Mb2NhbFJlc3BvbnNlVHJhbnNwb3J0T3V0RGVzY3JpcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0LmxvY2FsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5GbG93OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uVHJhbnNwb3J0T3V0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuUGhhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuVHJhbnNwb3J0U2VuZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotLyoqCi0gKiBUaGlzIGlzIHdyYXBwZXIgY2xhc3Mgb2YgVHJhbnNwb3J0T3V0RGVzY3JpcHRpb24gY2xhc3MuCi0gKiBJbiBVc2luZyBBeGlzMiBMb2NhbCBUcmFuc3BvcnQsIHlvdSBjYW4ndCBzZW5kIFNPQVAgTWVzc2FnZSBzdWNjZXNzaXZlbHkuCi0gKi8KLQotY2xhc3MgTG9jYWxSZXNwb25zZVRyYW5zcG9ydE91dERlc2NyaXB0aW9uIGV4dGVuZHMgVHJhbnNwb3J0T3V0RGVzY3JpcHRpb24gewotCi0gICAgcHJpdmF0ZSBUcmFuc3BvcnRTZW5kZXIgc2VuZGVyID0gbnVsbDsKLQotICAgIHByaXZhdGUgVHJhbnNwb3J0T3V0RGVzY3JpcHRpb24gdE91dCA9IG51bGw7Ci0KLSAgICBwdWJsaWMgTG9jYWxSZXNwb25zZVRyYW5zcG9ydE91dERlc2NyaXB0aW9uKAotICAgICAgICAgICAgVHJhbnNwb3J0T3V0RGVzY3JpcHRpb24gbG9jYWxUcmFuc3BvcnRTZW5kZXJEZXNjcmlwdGlvbikKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotCi0gICAgICAgIHN1cGVyKGxvY2FsVHJhbnNwb3J0U2VuZGVyRGVzY3JpcHRpb24uZ2V0TmFtZSgpKTsKLQotICAgICAgICB0aGlzLnRPdXQgPSBsb2NhbFRyYW5zcG9ydFNlbmRlckRlc2NyaXB0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ldGhvZCBhZGRQYXJhbWV0ZXIuCi0gICAgICogCi0gICAgICogQHBhcmFtIHBhcmFtCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkUGFyYW1ldGVyKFBhcmFtZXRlciBwYXJhbSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIHRPdXQuYWRkUGFyYW1ldGVyKHBhcmFtKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVQYXJhbWV0ZXIoUGFyYW1ldGVyIHBhcmFtKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgdE91dC5yZW1vdmVQYXJhbWV0ZXIocGFyYW0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRlc2VyaWFsaXplUGFyYW1ldGVycyhPTUVsZW1lbnQgcGFyYW1ldGVyRWxlbWVudCkKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICB0T3V0LmRlc2VyaWFsaXplUGFyYW1ldGVycyhwYXJhbWV0ZXJFbGVtZW50KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRmxvdyBnZXRGYXVsdEZsb3coKSB7Ci0gICAgICAgIHJldHVybiB0T3V0LmdldEZhdWx0RmxvdygpOwotICAgIH0KLQotICAgIHB1YmxpYyBQaGFzZSBnZXRGYXVsdFBoYXNlKCkgewotICAgICAgICByZXR1cm4gdE91dC5nZXRGYXVsdFBoYXNlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBSZXR1cm5zIFN0cmluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiB0T3V0LmdldE5hbWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRmxvdyBnZXRPdXRGbG93KCkgewotICAgICAgICByZXR1cm4gdE91dC5nZXRPdXRGbG93KCk7Ci0gICAgfQotCi0gICAgcHVibGljIFBoYXNlIGdldE91dFBoYXNlKCkgewotICAgICAgICByZXR1cm4gdE91dC5nZXRPdXRQaGFzZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ldGhvZCBnZXRQYXJhbWV0ZXIuCi0gICAgICogCi0gICAgICogQHBhcmFtIG5hbWUKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgUGFyYW1ldGVyLgotICAgICAqLwotICAgIHB1YmxpYyBQYXJhbWV0ZXIgZ2V0UGFyYW1ldGVyKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHJldHVybiB0T3V0LmdldFBhcmFtZXRlcihuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXJyYXlMaXN0IGdldFBhcmFtZXRlcnMoKSB7Ci0gICAgICAgIHJldHVybiB0T3V0LmdldFBhcmFtZXRlcnMoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgVHJhbnNwb3J0U2VuZGVyLgotICAgICAqLwotICAgIHB1YmxpYyBUcmFuc3BvcnRTZW5kZXIgZ2V0U2VuZGVyKCkgewotICAgICAgICByZXR1cm4gdGhpcy5zZW5kZXI7Ci0gICAgfQotCi0gICAgLy8gdG8gY2hlY2sgd2hldGhlciB0aGUgcGFyYW1ldGVyIGlzIGxvY2tlZCBhdCBhbnkgbGV2ZWwKLSAgICBwdWJsaWMgYm9vbGVhbiBpc1BhcmFtZXRlckxvY2tlZChTdHJpbmcgcGFyYW1ldGVyTmFtZSkgewotICAgICAgICByZXR1cm4gdE91dC5pc1BhcmFtZXRlckxvY2tlZChwYXJhbWV0ZXJOYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRGYXVsdEZsb3coRmxvdyBmYXVsdEZsb3cpIHsKLSAgICAgICAgdE91dC5zZXRGYXVsdEZsb3coZmF1bHRGbG93KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRGYXVsdFBoYXNlKFBoYXNlIGZhdWx0UGhhc2UpIHsKLSAgICAgICAgdE91dC5zZXRGYXVsdFBoYXNlKGZhdWx0UGhhc2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBuYW1lCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICB0T3V0LnNldE5hbWUobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0T3V0RmxvdyhGbG93IG91dEZsb3cpIHsKLSAgICAgICAgdE91dC5zZXRPdXRGbG93KG91dEZsb3cpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE91dFBoYXNlKFBoYXNlIG91dFBoYXNlKSB7Ci0gICAgICAgIHRPdXQuc2V0T3V0UGhhc2Uob3V0UGhhc2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBzZW5kZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTZW5kZXIoVHJhbnNwb3J0U2VuZGVyIHNlbmRlcikgewotICAgICAgICB0aGlzLnNlbmRlciA9IHNlbmRlcjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy90cmFuc3BvcnQvbG9jYWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2xvY2FsL0xvY2FsVHJhbnNwb3J0UmVjZWl2ZXIuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3RyYW5zcG9ydC9sb2NhbC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvbG9jYWwvTG9jYWxUcmFuc3BvcnRSZWNlaXZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTBlNGMxLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3RyYW5zcG9ydC9sb2NhbC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvbG9jYWwvTG9jYWxUcmFuc3BvcnRSZWNlaXZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5sb2NhbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01YTUxQYXJzZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYnVpbGRlci5CdWlsZGVyVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uVHJhbnNwb3J0SW5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlRyYW5zcG9ydE91dERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNFbmdpbmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLk1lc3NhZ2VDb250ZXh0QnVpbGRlcjsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLQotcHVibGljIGNsYXNzIExvY2FsVHJhbnNwb3J0UmVjZWl2ZXIgewotICAgIHB1YmxpYyBzdGF0aWMgQ29uZmlndXJhdGlvbkNvbnRleHQgQ09ORklHX0NPTlRFWFQ7Ci0gICAgcHJpdmF0ZSBDb25maWd1cmF0aW9uQ29udGV4dCBjb25mQ29udGV4dDsKLQotICAgIHB1YmxpYyBMb2NhbFRyYW5zcG9ydFJlY2VpdmVyKENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQpIHsKLSAgICAgICAgY29uZkNvbnRleHQgPSBjb25maWdDb250ZXh0OwotICAgIH0KLQotICAgIHB1YmxpYyBMb2NhbFRyYW5zcG9ydFJlY2VpdmVyKExvY2FsVHJhbnNwb3J0U2VuZGVyIHNlbmRlcikgewotICAgICAgICB0aGlzKENPTkZJR19DT05URVhUKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzTWVzc2FnZShJbnB1dFN0cmVhbSBpbiwgRW5kcG9pbnRSZWZlcmVuY2UgdG8sIFN0cmluZyBhY3Rpb24sIE91dHB1dFN0cmVhbSByZXNwb25zZSkKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBNZXNzYWdlQ29udGV4dCBtc2dDdHggPSBjb25mQ29udGV4dC5jcmVhdGVNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBUcmFuc3BvcnRJbkRlc2NyaXB0aW9uIHRJbiA9IGNvbmZDb250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCkuZ2V0VHJhbnNwb3J0SW4oCi0gICAgICAgICAgICAgICAgQ29uc3RhbnRzLlRSQU5TUE9SVF9MT0NBTCk7Ci0gICAgICAgIFRyYW5zcG9ydE91dERlc2NyaXB0aW9uIHRPdXQgPSBjb25mQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpLmdldFRyYW5zcG9ydE91dCgKLSAgICAgICAgICAgICAgICBDb25zdGFudHMuVFJBTlNQT1JUX0xPQ0FMKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgLy8gQ0FVVElPTiA6IFdoZW4gdXNpbmcgTG9jYWwgVHJhbnNwb3J0IG9mIEF4aXMyLCAgY2xhc3MgTG9jYWxUcmFuc3BvcnRSZWNlaXZlciBjaGFuZ2VkIHRoZSBuYW1lIG9mIExvY2FsVHJhbnNwb3J0U2VuZGVyJ3MgY2xhc3MgaW4gY29uZmlnQ29udGV4dC4KLSAgICAgICAgLy8gV2UgZXNjYXBlZCB0aGlzIHByb2JsZW0gYnkgdGhlIGZvbGxvd2luZyBjb2RlLgotICAgICAgICBMb2NhbFJlc3BvbnNlVHJhbnNwb3J0T3V0RGVzY3JpcHRpb24gbG9jYWxUcmFuc3BvcnRSZXNPdXQgPSBuZXcgTG9jYWxSZXNwb25zZVRyYW5zcG9ydE91dERlc2NyaXB0aW9uKAotICAgICAgICAgICAgICAgIHRPdXQpOwotICAgICAgICBsb2NhbFRyYW5zcG9ydFJlc091dC5zZXRTZW5kZXIobmV3IExvY2FsUmVzcG9uZGVyKHJlc3BvbnNlKSk7Ci0gICAgICAgIAotICAgICAgICB0cnkgewotICAgICAgICAgICAgbXNnQ3R4LnNldFRyYW5zcG9ydEluKHRJbik7Ci0gICAgICAgICAgICBtc2dDdHguc2V0VHJhbnNwb3J0T3V0KGxvY2FsVHJhbnNwb3J0UmVzT3V0KTsKLSAgICAgICAgICAgIG1zZ0N0eC5zZXRQcm9wZXJ0eShNZXNzYWdlQ29udGV4dC5UUkFOU1BPUlRfT1VULCByZXNwb25zZSk7Ci0KLSAgICAgICAgICAgIG1zZ0N0eC5zZXRUbyh0byk7Ci0gICAgICAgICAgICBtc2dDdHguc2V0V1NBQWN0aW9uKGFjdGlvbik7Ci0gICAgICAgICAgICBtc2dDdHguc2V0U2VydmVyU2lkZSh0cnVlKTsKLQotICAgICAgICAgICAgSW5wdXRTdHJlYW1SZWFkZXIgc3RyZWFtUmVhZGVyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKGluKTsKLSAgICAgICAgICAgIE9NWE1MUGFyc2VyV3JhcHBlciBidWlsZGVyOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBidWlsZGVyID0gQnVpbGRlclV0aWwuZ2V0QnVpbGRlcihzdHJlYW1SZWFkZXIpOwotICAgICAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBBeGlzRmF1bHQubWFrZUZhdWx0KGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgU09BUEVudmVsb3BlIGVudmVsb3BlID0gKFNPQVBFbnZlbG9wZSkgYnVpbGRlci5nZXREb2N1bWVudEVsZW1lbnQoKTsKLQotICAgICAgICAgICAgbXNnQ3R4LnNldEVudmVsb3BlKGVudmVsb3BlKTsKLQotICAgICAgICAgICAgQXhpc0VuZ2luZS5yZWNlaXZlKG1zZ0N0eCk7Ci0gICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBlKSB7Ci0gICAgICAgICAgICAvLyB3cml0ZSB0aGUgZmF1bHQgYmFjay4KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgTWVzc2FnZUNvbnRleHQgZmF1bHRDb250ZXh0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VDb250ZXh0QnVpbGRlci5jcmVhdGVGYXVsdE1lc3NhZ2VDb250ZXh0KG1zZ0N0eCwgZSk7Ci0gICAgICAgICAgICAgICAgZmF1bHRDb250ZXh0LnNldFRyYW5zcG9ydE91dChsb2NhbFRyYW5zcG9ydFJlc091dCk7Ci0gICAgICAgICAgICAgICAgZmF1bHRDb250ZXh0LnNldFByb3BlcnR5KE1lc3NhZ2VDb250ZXh0LlRSQU5TUE9SVF9PVVQsIHJlc3BvbnNlKTsKLQotICAgICAgICAgICAgICAgIEF4aXNFbmdpbmUuc2VuZEZhdWx0KGZhdWx0Q29udGV4dCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgYXhpc0ZhdWx0KSB7Ci0gICAgICAgICAgICAgICAgLy8gY2FuJ3QgaGFuZGxlIHRoaXMsIHNvIGp1c3QgdGhyb3cgaXQKLSAgICAgICAgICAgICAgICB0aHJvdyBheGlzRmF1bHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy90cmFuc3BvcnQvbG9jYWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2xvY2FsL0xvY2FsVHJhbnNwb3J0U2VuZGVyLmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy90cmFuc3BvcnQvbG9jYWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2xvY2FsL0xvY2FsVHJhbnNwb3J0U2VuZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4MDUxODMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvdHJhbnNwb3J0L2xvY2FsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9sb2NhbC9Mb2NhbFRyYW5zcG9ydFNlbmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5sb2NhbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uVHJhbnNwb3J0T3V0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5oYW5kbGVycy5BYnN0cmFjdEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuVHJhbnNwb3J0U2VuZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0LlRyYW5zcG9ydFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci0KLXB1YmxpYyBjbGFzcyBMb2NhbFRyYW5zcG9ydFNlbmRlciBleHRlbmRzIEFic3RyYWN0SGFuZGxlciBpbXBsZW1lbnRzIFRyYW5zcG9ydFNlbmRlciB7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coTG9jYWxUcmFuc3BvcnRTZW5kZXIuY2xhc3MpOwotCi0gICAgcHVibGljIHZvaWQgaW5pdChDb25maWd1cmF0aW9uQ29udGV4dCBjb25mQ29udGV4dCwgVHJhbnNwb3J0T3V0RGVzY3JpcHRpb24gdHJhbnNwb3J0T3V0KQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RvcCgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjbGVhbnVwKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHRocm93cyBBeGlzRmF1bHQgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ldGhvZCBpbnZva2UKLSAgICAgKgotICAgICAqIEBwYXJhbSBtc2dDb250ZXh0IHRoZSBjdXJyZW50IE1lc3NhZ2VDb250ZXh0Ci0gICAgICogQHRocm93cyBBeGlzRmF1bHQKLSAgICAgKi8KLSAgICBwdWJsaWMgSW52b2NhdGlvblJlc3BvbnNlIGludm9rZShNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLQotICAgICAgICAvLyBDaGVjayBmb3IgdGhlIFJFU1QgYmVoYXZpb3VyLCBpZiB5b3UgZGVzaXJlIHJlc3QgYmVhaGF2aW91cgotICAgICAgICAvLyBwdXQgYSA8cGFyYW1ldGVyIG5hbWU9ImRvUkVTVCIgdmFsdWU9InRydWUiLz4gYXQgdGhlIGF4aXMyLnhtbAotICAgICAgICBtc2dDb250ZXh0LnNldERvaW5nTVRPTShUcmFuc3BvcnRVdGlscy5kb1dyaXRlTVRPTShtc2dDb250ZXh0KSk7Ci0gICAgICAgIG1zZ0NvbnRleHQuc2V0RG9pbmdTd0EoVHJhbnNwb3J0VXRpbHMuZG9Xcml0ZVN3QShtc2dDb250ZXh0KSk7Ci0KLSAgICAgICAgT3V0cHV0U3RyZWFtIG91dDsKLSAgICAgICAgRW5kcG9pbnRSZWZlcmVuY2UgZXByID0gbXNnQ29udGV4dC5nZXRUbygpOwotCi0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICAgICAgVHJhbnNwb3J0VXRpbHMud3JpdGVNZXNzYWdlKG1zZ0NvbnRleHQsIG9zKTsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiU2VuZGluZyAtICIgKyBuZXcgU3RyaW5nKG9zLnRvQnl0ZUFycmF5KCkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChlcHIgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKCFlcHIuaGFzTm9uZUFkZHJlc3MoKSkgewotICAgICAgICAgICAgICAgIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgICAgICAgICBUcmFuc3BvcnRVdGlscy53cml0ZU1lc3NhZ2UobXNnQ29udGV4dCwgb3V0KTsKLSAgICAgICAgICAgICAgICBmaW5hbGl6ZVNlbmRXaXRoVG9BZGRyZXNzKG1zZ0NvbnRleHQsIChCeXRlQXJyYXlPdXRwdXRTdHJlYW0pb3V0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG91dCA9IChPdXRwdXRTdHJlYW0pIG1zZ0NvbnRleHQuZ2V0UHJvcGVydHkoTWVzc2FnZUNvbnRleHQuVFJBTlNQT1JUX09VVCk7Ci0KLSAgICAgICAgICAgIGlmIChvdXQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFRyYW5zcG9ydFV0aWxzLndyaXRlTWVzc2FnZShtc2dDb250ZXh0LCBvdXQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KAotICAgICAgICAgICAgICAgICAgICAgICAgIkJvdGggdGhlIFRPIGFuZCBQcm9wZXJ0eSBNZXNzYWdlQ29udGV4dC5UUkFOU1BPUlRfT1VUIGlzIE51bGwsIE5vIHdoZXJlIHRvIHNlbmQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFRyYW5zcG9ydFV0aWxzLnNldFJlc3BvbnNlV3JpdHRlbihtc2dDb250ZXh0LCB0cnVlKTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiBJbnZvY2F0aW9uUmVzcG9uc2UuQ09OVElOVUU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZmluYWxpemVTZW5kV2l0aFRvQWRkcmVzcyhNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0LCBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0KQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJbnB1dFN0cmVhbSBpbiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvdXQudG9CeXRlQXJyYXkoKSk7Ci0gICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gcmVzcG9uc2UgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0KLSAgICAgICAgICAgIExvY2FsVHJhbnNwb3J0UmVjZWl2ZXIgbG9jYWxUcmFuc3BvcnRSZWNlaXZlciA9IG5ldyBMb2NhbFRyYW5zcG9ydFJlY2VpdmVyKHRoaXMpOwotICAgICAgICAgICAgbG9jYWxUcmFuc3BvcnRSZWNlaXZlci5wcm9jZXNzTWVzc2FnZShpbiwgbXNnQ29udGV4dC5nZXRUbygpLCBtc2dDb250ZXh0LmdldE9wdGlvbnMoKS5nZXRBY3Rpb24oKSwgcmVzcG9uc2UpOwotICAgICAgICAgICAgaW4uY2xvc2UoKTsKLSAgICAgICAgICAgIG91dC5jbG9zZSgpOwotICAgICAgICAgICAgaW4gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ocmVzcG9uc2UudG9CeXRlQXJyYXkoKSk7Ci0gICAgICAgICAgICBtc2dDb250ZXh0LnNldFByb3BlcnR5KE1lc3NhZ2VDb250ZXh0LlRSQU5TUE9SVF9JTiwgaW4pOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBBeGlzRmF1bHQubWFrZUZhdWx0KGUpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvd2ViYXBwL2NvbmYvbW9kdWxlcy5saXN0IGIvdjEuNS4xUkMzL21vZHVsZXMvd2ViYXBwL2NvbmYvbW9kdWxlcy5saXN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjdmNjFjLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3dlYmFwcC9jb25mL21vZHVsZXMubGlzdAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLSMKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLWFkZHJlc3NpbmctQHZlcnNpb25ALm1hcgotc29hcG1vbml0b3ItQHZlcnNpb25ALm1hcgotcGluZy1AdmVyc2lvbkAubWFyCi1tZXgtQHZlcnNpb25ALm1hcgotYXhpczItc2NyaXB0aW5nLUB2ZXJzaW9uQC5tYXIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy93ZWJhcHAvY29uZi9zZXJ2aWNlcy5saXN0IGIvdjEuNS4xUkMzL21vZHVsZXMvd2ViYXBwL2NvbmYvc2VydmljZXMubGlzdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmFkY2IyYy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy93ZWJhcHAvY29uZi9zZXJ2aWNlcy5saXN0CisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIwotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotdmVyc2lvbi1AdmVyc2lvbkAuYWFyCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy93ZWJhcHAvY29uZi93ZWIueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvd2ViYXBwL2NvbmYvd2ViLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmViMjJlMS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy93ZWJhcHAvY29uZi93ZWIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTwhRE9DVFlQRSB3ZWItYXBwIFBVQkxJQyAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIFdlYiBBcHBsaWNhdGlvbiAyLjMvL0VOIiAiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvd2ViLWFwcF8yXzMuZHRkIj4KLQotPHdlYi1hcHA+Ci0gICAgPGRpc3BsYXktbmFtZT5BcGFjaGUtQXhpczI8L2Rpc3BsYXktbmFtZT4KLSAgICA8c2VydmxldD4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5BeGlzU2VydmxldDwvc2VydmxldC1uYW1lPgotICAgICAgICA8ZGlzcGxheS1uYW1lPkFwYWNoZS1BeGlzIFNlcnZsZXQ8L2Rpc3BsYXktbmFtZT4KLSAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5BeGlzU2VydmxldDwvc2VydmxldC1jbGFzcz4KLSAgICAgICAgPCEtLTxpbml0LXBhcmFtPi0tPgotICAgICAgICA8IS0tPHBhcmFtLW5hbWU+YXhpczIueG1sLnBhdGg8L3BhcmFtLW5hbWU+LS0+Ci0gICAgICAgIDwhLS08cGFyYW0tdmFsdWU+L1dFQi1JTkYvY29uZi9heGlzMi54bWw8L3BhcmFtLXZhbHVlPi0tPgotICAgICAgICA8IS0tPHBhcmFtLW5hbWU+YXhpczIueG1sLnVybDwvcGFyYW0tbmFtZT4tLT4KLSAgICAgICAgPCEtLTxwYXJhbS12YWx1ZT5odHRwOi8vbG9jYWxob3N0L215cmVwby9heGlzMi54bWw8L3BhcmFtLXZhbHVlPi0tPgotICAgICAgICA8IS0tPHBhcmFtLW5hbWU+YXhpczIucmVwb3NpdG9yeS5wYXRoPC9wYXJhbS1uYW1lPi0tPgotICAgICAgICA8IS0tPHBhcmFtLXZhbHVlPi9XRUItSU5GPC9wYXJhbS12YWx1ZT4tLT4KLSAgICAgICAgPCEtLTxwYXJhbS1uYW1lPmF4aXMyLnJlcG9zaXRvcnkudXJsPC9wYXJhbS1uYW1lPi0tPgotICAgICAgICA8IS0tPHBhcmFtLXZhbHVlPmh0dHA6Ly9sb2NhbGhvc3QvbXlyZXBvPC9wYXJhbS12YWx1ZT4tLT4KLSAgICAgICAgPCEtLTwvaW5pdC1wYXJhbT4tLT4KLSAgICAgICAgPGxvYWQtb24tc3RhcnR1cD4xPC9sb2FkLW9uLXN0YXJ0dXA+Ci0gICAgPC9zZXJ2bGV0PgotICAgIDxzZXJ2bGV0PgotICAgICAgICA8c2VydmxldC1uYW1lPkF4aXNBZG1pblNlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgPGRpc3BsYXktbmFtZT5BcGFjaGUtQXhpcyBBeGlzQWRtaW4gU2VydmxldCAoV2ViIEFkbWluKTwvZGlzcGxheS1uYW1lPgotICAgICAgICA8c2VydmxldC1jbGFzcz4KLSAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIud2ViYXBwLkF4aXNBZG1pblNlcnZsZXQ8L3NlcnZsZXQtY2xhc3M+Ci0gICAgPC9zZXJ2bGV0PgotICAgIDxzZXJ2bGV0LW1hcHBpbmc+Ci0gICAgICAgIDxzZXJ2bGV0LW5hbWU+QXhpc1NlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgPHVybC1wYXR0ZXJuPi9zZXJ2bGV0L0F4aXNTZXJ2bGV0PC91cmwtcGF0dGVybj4KLSAgICA8L3NlcnZsZXQtbWFwcGluZz4KLQotICAgIDxzZXJ2bGV0LW1hcHBpbmc+Ci0gICAgICAgIDxzZXJ2bGV0LW5hbWU+QXhpc1NlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgPHVybC1wYXR0ZXJuPiouandzPC91cmwtcGF0dGVybj4KLSAgICA8L3NlcnZsZXQtbWFwcGluZz4KLQotICAgIDxzZXJ2bGV0LW1hcHBpbmc+Ci0gICAgICAgIDxzZXJ2bGV0LW5hbWU+QXhpc1NlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgPHVybC1wYXR0ZXJuPi9zZXJ2aWNlcy8qPC91cmwtcGF0dGVybj4KLSAgICA8L3NlcnZsZXQtbWFwcGluZz4KLQotICAgIDxzZXJ2bGV0LW1hcHBpbmc+Ci0gICAgICAgIDxzZXJ2bGV0LW5hbWU+QXhpc0FkbWluU2VydmxldDwvc2VydmxldC1uYW1lPgotICAgICAgICA8dXJsLXBhdHRlcm4+L2F4aXMyLWFkbWluLyo8L3VybC1wYXR0ZXJuPgotICAgIDwvc2VydmxldC1tYXBwaW5nPgotCi0gICAgPG1pbWUtbWFwcGluZz4KLSAgICAgICAgPGV4dGVuc2lvbj5pbmM8L2V4dGVuc2lvbj4KLSAgICAgICAgPG1pbWUtdHlwZT50ZXh0L3BsYWluPC9taW1lLXR5cGU+Ci0gICAgPC9taW1lLW1hcHBpbmc+Ci0KLSAgIDx3ZWxjb21lLWZpbGUtbGlzdD4KLSAgICAgIDx3ZWxjb21lLWZpbGU+aW5kZXguanNwPC93ZWxjb21lLWZpbGU+Ci0gICAgICA8d2VsY29tZS1maWxlPmluZGV4Lmh0bWw8L3dlbGNvbWUtZmlsZT4KLSAgICAgIDx3ZWxjb21lLWZpbGU+L2F4aXMyLXdlYi9pbmRleC5qc3A8L3dlbGNvbWUtZmlsZT4KLSAgICA8L3dlbGNvbWUtZmlsZS1saXN0PgotCi0gICAgPGVycm9yLXBhZ2U+Ci0gICAgICA8ZXJyb3ItY29kZT40MDQ8L2Vycm9yLWNvZGU+Ci0gICAgICA8bG9jYXRpb24+L2F4aXMyLXdlYi9FcnJvci9lcnJvcjQwNC5qc3A8L2xvY2F0aW9uPgotICAgIDwvZXJyb3ItcGFnZT4KLQotICAgIDxlcnJvci1wYWdlPgotICAgICAgICA8ZXJyb3ItY29kZT41MDA8L2Vycm9yLWNvZGU+Ci0gICAgICAgIDxsb2NhdGlvbj4vYXhpczItd2ViL0Vycm9yL2Vycm9yNTAwLmpzcDwvbG9jYXRpb24+Ci0gICAgPC9lcnJvci1wYWdlPgotPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvd2ViYXBwL2NvbmYvd2VibG9naWMueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvd2ViYXBwL2NvbmYvd2VibG9naWMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjJmOTRhLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3dlYmFwcC9jb25mL3dlYmxvZ2ljLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPCFET0NUWVBFIHdlYmxvZ2ljLXdlYi1hcHAgUFVCTElDICItLy9CRUEKLVN5c3RlbXMsIEluYy4vL0RURCBXZWIgQXBwbGljYXRpb24gNy4wLy9FTiIKLSJodHRwOi8vd3d3LmJlYS5jb20vc2VydmVycy93bHM3MDAvZHRkL3dlYmxvZ2ljNzAwLXdlYi1qYXIuZHRkIj4KLTx3ZWJsb2dpYy13ZWItYXBwPgotCTxjb250YWluZXItZGVzY3JpcHRvcj4KLQkJPHByZWZlci13ZWItaW5mLWNsYXNzZXM+dHJ1ZTwvcHJlZmVyLXdlYi1pbmYtY2xhc3Nlcz4KLQk8L2NvbnRhaW5lci1kZXNjcmlwdG9yPgotPC93ZWJsb2dpYy13ZWItYXBwPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3dlYmFwcC9wb20ueG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvd2ViYXBwL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyNzRiODUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvd2ViYXBwL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNDg3ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIKLSAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItcGFyZW50PC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4xLjUuMTwvdmVyc2lvbj4KLSAgICAgICAgPHJlbGF0aXZlUGF0aD4uLi9wYXJlbnQvcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgotICAgIDwvcGFyZW50PgotICAgIDxhcnRpZmFjdElkPmF4aXMyLXdlYmFwcDwvYXJ0aWZhY3RJZD4KLSAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPgotICAgIDxuYW1lPkFwYWNoZSBBeGlzMiAtIFdlYiBBcHBsaWNhdGlvbiBtb2R1bGU8L25hbWU+Ci0gICAgPGRlcGVuZGVuY2llcz4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5jb21tb25zLWlvPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1pbzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDxleGNsdXNpb25zPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYW50PC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5hbnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5hbnQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmFudC1sYXVuY2hlcjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5hb3BhbGxpYW5jZTwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+YW9wYWxsaWFuY2U8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5iY2VsPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5iY2VsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPmNvbS5zdW4ueG1sLmZhc3RpbmZvc2V0PC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5GYXN0SW5mb3NldDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmdlcm9uaW1vLnNwZWNzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5nZXJvbmltby1hY3RpdmF0aW9uXzEuMV9zcGVjPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZ2Vyb25pbW8uc3BlY3M8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmdlcm9uaW1vLWphdmFtYWlsXzEuNF9zcGVjPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPmpha2FydGEtcmVnZXhwPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYWthcnRhLXJlZ2V4cDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC54bWwuYmluZDwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+anNyMTczX2FwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuc3ByaW5nZnJhbWV3b3JrPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zcHJpbmctYmVhbnM8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLnNwcmluZ2ZyYW1ld29yazwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+c3ByaW5nLWNvbnRleHQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLnNwcmluZ2ZyYW1ld29yazwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+c3ByaW5nLWNvcmU8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLnNwcmluZ2ZyYW1ld29yazwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+c3ByaW5nLXdlYjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD54ZXJjZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnhtbFBhcnNlckFQSXM8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+cmhpbm88L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpzPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPmJzZjwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+YnNmPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPmphdmF4LnNlcnZsZXQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnNlcnZsZXQtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgPC9leGNsdXNpb25zPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLWppYng8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3ZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPGV4Y2x1c2lvbnM+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5hbnQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmFudDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmFudDwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+YW50LWxhdW5jaGVyPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPmFvcGFsbGlhbmNlPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5hb3BhbGxpYW5jZTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmJjZWw8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmJjZWw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLnN1bi54bWwuZmFzdGluZm9zZXQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPkZhc3RJbmZvc2V0PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZ2Vyb25pbW8uc3BlY3M8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmdlcm9uaW1vLWFjdGl2YXRpb25fMS4xX3NwZWM8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5nZXJvbmltby5zcGVjczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+Z2Vyb25pbW8tamF2YW1haWxfMS40X3NwZWM8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+amFrYXJ0YS1yZWdleHA8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpha2FydGEtcmVnZXhwPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPmphdmF4LnhtbC5iaW5kPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qc3IxNzNfYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5zcHJpbmdmcmFtZXdvcms8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnNwcmluZy1iZWFuczwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuc3ByaW5nZnJhbWV3b3JrPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zcHJpbmctY29udGV4dDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuc3ByaW5nZnJhbWV3b3JrPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zcHJpbmctY29yZTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuc3ByaW5nZnJhbWV3b3JrPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zcHJpbmctd2ViPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPnhlcmNlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+eG1sUGFyc2VyQVBJczwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5yaGlubzwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+anM8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+YnNmPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5ic2Y8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguc2VydmxldDwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2VydmxldC1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICA8L2V4Y2x1c2lvbnM+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItamF2YTJ3c2RsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHt2ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxleGNsdXNpb25zPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYW50PC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5hbnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5hbnQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmFudC1sYXVuY2hlcjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5hb3BhbGxpYW5jZTwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+YW9wYWxsaWFuY2U8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5iY2VsPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5iY2VsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPmNvbS5zdW4ueG1sLmZhc3RpbmZvc2V0PC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5GYXN0SW5mb3NldDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmdlcm9uaW1vLnNwZWNzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5nZXJvbmltby1hY3RpdmF0aW9uXzEuMV9zcGVjPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZ2Vyb25pbW8uc3BlY3M8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmdlcm9uaW1vLWphdmFtYWlsXzEuNF9zcGVjPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPmpha2FydGEtcmVnZXhwPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYWthcnRhLXJlZ2V4cDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC54bWwuYmluZDwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+anNyMTczX2FwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuc3ByaW5nZnJhbWV3b3JrPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zcHJpbmctYmVhbnM8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLnNwcmluZ2ZyYW1ld29yazwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+c3ByaW5nLWNvbnRleHQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLnNwcmluZ2ZyYW1ld29yazwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+c3ByaW5nLWNvcmU8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLnNwcmluZ2ZyYW1ld29yazwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+c3ByaW5nLXdlYjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD54ZXJjZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnhtbFBhcnNlckFQSXM8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+cmhpbm88L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpzPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPmJzZjwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+YnNmPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPmphdmF4LnNlcnZsZXQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnNlcnZsZXQtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgPC9leGNsdXNpb25zPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+bG9nNGo8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5sb2c0ajwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDxleGNsdXNpb25zPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYW50PC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5hbnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5hbnQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmFudC1sYXVuY2hlcjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5hb3BhbGxpYW5jZTwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+YW9wYWxsaWFuY2U8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5iY2VsPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5iY2VsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPmNvbS5zdW4ueG1sLmZhc3RpbmZvc2V0PC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5GYXN0SW5mb3NldDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmdlcm9uaW1vLnNwZWNzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5nZXJvbmltby1hY3RpdmF0aW9uXzEuMV9zcGVjPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZ2Vyb25pbW8uc3BlY3M8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmdlcm9uaW1vLWphdmFtYWlsXzEuNF9zcGVjPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPmpha2FydGEtcmVnZXhwPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYWthcnRhLXJlZ2V4cDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC54bWwuYmluZDwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+anNyMTczX2FwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuc3ByaW5nZnJhbWV3b3JrPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zcHJpbmctYmVhbnM8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLnNwcmluZ2ZyYW1ld29yazwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+c3ByaW5nLWNvbnRleHQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLnNwcmluZ2ZyYW1ld29yazwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+c3ByaW5nLWNvcmU8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLnNwcmluZ2ZyYW1ld29yazwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+c3ByaW5nLXdlYjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD54ZXJjZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnhtbFBhcnNlckFQSXM8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+cmhpbm88L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpzPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPmJzZjwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+YnNmPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPmphdmF4LnNlcnZsZXQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnNlcnZsZXQtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPmphdmF4LmptczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+am1zPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPmNvbS5zdW4uamRtazwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+am14dG9vbHM8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLnN1bi5qbXg8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpteHJpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgPC9leGNsdXNpb25zPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLXNwcmluZzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7dmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8ZXhjbHVzaW9ucz4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5zZXJ2bGV0PC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zZXJ2bGV0LWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmFudDwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+YW50PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYW50PC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5hbnQtbGF1bmNoZXI8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+YW9wYWxsaWFuY2U8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmFvcGFsbGlhbmNlPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYmNlbDwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+YmNlbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5jb20uc3VuLnhtbC5mYXN0aW5mb3NldDwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+RmFzdEluZm9zZXQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5nZXJvbmltby5zcGVjczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+Z2Vyb25pbW8tYWN0aXZhdGlvbl8xLjFfc3BlYzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmdlcm9uaW1vLnNwZWNzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5nZXJvbmltby1qYXZhbWFpbF8xLjRfc3BlYzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5qYWthcnRhLXJlZ2V4cDwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amFrYXJ0YS1yZWdleHA8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXgueG1sLmJpbmQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpzcjE3M19hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLnNwcmluZ2ZyYW1ld29yazwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+c3ByaW5nLWJlYW5zPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5zcHJpbmdmcmFtZXdvcms8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnNwcmluZy1jb250ZXh0PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5zcHJpbmdmcmFtZXdvcms8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnNwcmluZy1jb3JlPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5zcHJpbmdmcmFtZXdvcms8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnNwcmluZy13ZWI8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+eGVyY2VzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD54bWxQYXJzZXJBUElzPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPnJoaW5vPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qczwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5ic2Y8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmJzZjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5zZXJ2bGV0PC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zZXJ2bGV0LWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgIDwvZXhjbHVzaW9ucz4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1mYXN0aW5mb3NldDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7dmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8ZXhjbHVzaW9ucz4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmFudDwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+YW50PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYW50PC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5hbnQtbGF1bmNoZXI8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+YW9wYWxsaWFuY2U8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmFvcGFsbGlhbmNlPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYmNlbDwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+YmNlbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5jb20uc3VuLnhtbC5mYXN0aW5mb3NldDwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+RmFzdEluZm9zZXQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5nZXJvbmltby5zcGVjczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+Z2Vyb25pbW8tYWN0aXZhdGlvbl8xLjFfc3BlYzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmdlcm9uaW1vLnNwZWNzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5nZXJvbmltby1qYXZhbWFpbF8xLjRfc3BlYzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5qYWthcnRhLXJlZ2V4cDwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amFrYXJ0YS1yZWdleHA8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXgueG1sLmJpbmQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpzcjE3M19hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLnNwcmluZ2ZyYW1ld29yazwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+c3ByaW5nLWJlYW5zPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5zcHJpbmdmcmFtZXdvcms8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnNwcmluZy1jb250ZXh0PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5zcHJpbmdmcmFtZXdvcms8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnNwcmluZy1jb3JlPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5zcHJpbmdmcmFtZXdvcms8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnNwcmluZy13ZWI8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+eGVyY2VzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD54bWxQYXJzZXJBUElzPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPnJoaW5vPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qczwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5ic2Y8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmJzZjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5zZXJ2bGV0PC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zZXJ2bGV0LWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgIDwvZXhjbHVzaW9ucz4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1qYXh3czwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7dmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8ZXhjbHVzaW9ucz4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmFudDwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+YW50PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYW50PC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5hbnQtbGF1bmNoZXI8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+YW9wYWxsaWFuY2U8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmFvcGFsbGlhbmNlPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYmNlbDwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+YmNlbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5jb20uc3VuLnhtbC5mYXN0aW5mb3NldDwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+RmFzdEluZm9zZXQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5nZXJvbmltby5zcGVjczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+Z2Vyb25pbW8tYWN0aXZhdGlvbl8xLjFfc3BlYzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmdlcm9uaW1vLnNwZWNzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5nZXJvbmltby1qYXZhbWFpbF8xLjRfc3BlYzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5qYWthcnRhLXJlZ2V4cDwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amFrYXJ0YS1yZWdleHA8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXgueG1sLmJpbmQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpzcjE3M19hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLnNwcmluZ2ZyYW1ld29yazwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+c3ByaW5nLWJlYW5zPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5zcHJpbmdmcmFtZXdvcms8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnNwcmluZy1jb250ZXh0PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5zcHJpbmdmcmFtZXdvcms8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnNwcmluZy1jb3JlPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5zcHJpbmdmcmFtZXdvcms8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnNwcmluZy13ZWI8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+eGVyY2VzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD54bWxQYXJzZXJBUElzPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPnJoaW5vPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qczwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5ic2Y8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmJzZjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5zZXJ2bGV0PC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zZXJ2bGV0LWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgIDwvZXhjbHVzaW9ucz4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1qYXhicmk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3ZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPGV4Y2x1c2lvbnM+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5hbnQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmFudDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmFudDwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+YW50LWxhdW5jaGVyPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPmFvcGFsbGlhbmNlPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5hb3BhbGxpYW5jZTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmJjZWw8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmJjZWw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLnN1bi54bWwuZmFzdGluZm9zZXQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPkZhc3RJbmZvc2V0PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZ2Vyb25pbW8uc3BlY3M8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmdlcm9uaW1vLWFjdGl2YXRpb25fMS4xX3NwZWM8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5nZXJvbmltby5zcGVjczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+Z2Vyb25pbW8tamF2YW1haWxfMS40X3NwZWM8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+amFrYXJ0YS1yZWdleHA8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpha2FydGEtcmVnZXhwPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPmphdmF4LnhtbC5iaW5kPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qc3IxNzNfYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5zcHJpbmdmcmFtZXdvcms8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnNwcmluZy1iZWFuczwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuc3ByaW5nZnJhbWV3b3JrPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zcHJpbmctY29udGV4dDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuc3ByaW5nZnJhbWV3b3JrPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zcHJpbmctY29yZTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuc3ByaW5nZnJhbWV3b3JrPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zcHJpbmctd2ViPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPnhlcmNlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+eG1sUGFyc2VyQVBJczwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5yaGlubzwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+anM8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+YnNmPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5ic2Y8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguc2VydmxldDwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2VydmxldC1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICA8L2V4Y2x1c2lvbnM+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczIteG1sYmVhbnM8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3ZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPGV4Y2x1c2lvbnM+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5hbnQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmFudDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmFudDwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+YW50LWxhdW5jaGVyPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPmFvcGFsbGlhbmNlPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5hb3BhbGxpYW5jZTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmJjZWw8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmJjZWw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLnN1bi54bWwuZmFzdGluZm9zZXQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPkZhc3RJbmZvc2V0PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZ2Vyb25pbW8uc3BlY3M8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmdlcm9uaW1vLWFjdGl2YXRpb25fMS4xX3NwZWM8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5nZXJvbmltby5zcGVjczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+Z2Vyb25pbW8tamF2YW1haWxfMS40X3NwZWM8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+amFrYXJ0YS1yZWdleHA8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpha2FydGEtcmVnZXhwPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPmphdmF4LnhtbC5iaW5kPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qc3IxNzNfYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5zcHJpbmdmcmFtZXdvcms8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnNwcmluZy1iZWFuczwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuc3ByaW5nZnJhbWV3b3JrPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zcHJpbmctY29udGV4dDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuc3ByaW5nZnJhbWV3b3JrPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zcHJpbmctY29yZTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuc3ByaW5nZnJhbWV3b3JrPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zcHJpbmctd2ViPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPnhlcmNlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+eG1sUGFyc2VyQVBJczwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5yaGlubzwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+anM8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+YnNmPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5ic2Y8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguc2VydmxldDwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2VydmxldC1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICA8L2V4Y2x1c2lvbnM+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItanNvbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7dmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8ZXhjbHVzaW9ucz4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmFudDwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+YW50PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYW50PC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5hbnQtbGF1bmNoZXI8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+YW9wYWxsaWFuY2U8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmFvcGFsbGlhbmNlPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYmNlbDwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+YmNlbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5jb20uc3VuLnhtbC5mYXN0aW5mb3NldDwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+RmFzdEluZm9zZXQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5nZXJvbmltby5zcGVjczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+Z2Vyb25pbW8tYWN0aXZhdGlvbl8xLjFfc3BlYzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmdlcm9uaW1vLnNwZWNzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5nZXJvbmltby1qYXZhbWFpbF8xLjRfc3BlYzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5qYWthcnRhLXJlZ2V4cDwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amFrYXJ0YS1yZWdleHA8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXgueG1sLmJpbmQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpzcjE3M19hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLnNwcmluZ2ZyYW1ld29yazwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+c3ByaW5nLWJlYW5zPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5zcHJpbmdmcmFtZXdvcms8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnNwcmluZy1jb250ZXh0PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5zcHJpbmdmcmFtZXdvcms8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnNwcmluZy1jb3JlPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5zcHJpbmdmcmFtZXdvcms8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnNwcmluZy13ZWI8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+eGVyY2VzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD54bWxQYXJzZXJBUElzPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPnJoaW5vPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qczwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5ic2Y8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmJzZjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5zZXJ2bGV0PC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zZXJ2bGV0LWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgIDwvZXhjbHVzaW9ucz4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5zb2FwbW9uaXRvcjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7dmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8dHlwZT5tYXI8L3R5cGU+Ci0gICAgICAgICAgICA8ZXhjbHVzaW9ucz4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmFudDwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+YW50PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYW50PC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5hbnQtbGF1bmNoZXI8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+YW9wYWxsaWFuY2U8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmFvcGFsbGlhbmNlPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYmNlbDwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+YmNlbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5jb20uc3VuLnhtbC5mYXN0aW5mb3NldDwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+RmFzdEluZm9zZXQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5nZXJvbmltby5zcGVjczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+Z2Vyb25pbW8tYWN0aXZhdGlvbl8xLjFfc3BlYzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmdlcm9uaW1vLnNwZWNzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5nZXJvbmltby1qYXZhbWFpbF8xLjRfc3BlYzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5qYWthcnRhLXJlZ2V4cDwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amFrYXJ0YS1yZWdleHA8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXgueG1sLmJpbmQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpzcjE3M19hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLnNwcmluZ2ZyYW1ld29yazwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+c3ByaW5nLWJlYW5zPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5zcHJpbmdmcmFtZXdvcms8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnNwcmluZy1jb250ZXh0PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5zcHJpbmdmcmFtZXdvcms8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnNwcmluZy1jb3JlPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5zcHJpbmdmcmFtZXdvcms8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnNwcmluZy13ZWI8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+eGVyY2VzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD54bWxQYXJzZXJBUElzPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPnJoaW5vPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qczwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5ic2Y8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmJzZjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5zZXJ2bGV0PC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zZXJ2bGV0LWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgIDwvZXhjbHVzaW9ucz4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5hZGRyZXNzaW5nPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHt2ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDx0eXBlPm1hcjwvdHlwZT4KLSAgICAgICAgICAgIDxleGNsdXNpb25zPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYW50PC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5hbnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5hbnQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmFudC1sYXVuY2hlcjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5hb3BhbGxpYW5jZTwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+YW9wYWxsaWFuY2U8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5iY2VsPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5iY2VsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPmNvbS5zdW4ueG1sLmZhc3RpbmZvc2V0PC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5GYXN0SW5mb3NldDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmdlcm9uaW1vLnNwZWNzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5nZXJvbmltby1hY3RpdmF0aW9uXzEuMV9zcGVjPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZ2Vyb25pbW8uc3BlY3M8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmdlcm9uaW1vLWphdmFtYWlsXzEuNF9zcGVjPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPmpha2FydGEtcmVnZXhwPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYWthcnRhLXJlZ2V4cDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC54bWwuYmluZDwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+anNyMTczX2FwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuc3ByaW5nZnJhbWV3b3JrPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zcHJpbmctYmVhbnM8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLnNwcmluZ2ZyYW1ld29yazwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+c3ByaW5nLWNvbnRleHQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLnNwcmluZ2ZyYW1ld29yazwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+c3ByaW5nLWNvcmU8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLnNwcmluZ2ZyYW1ld29yazwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+c3ByaW5nLXdlYjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD54ZXJjZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnhtbFBhcnNlckFQSXM8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+cmhpbm88L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpzPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPmJzZjwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+YnNmPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPmphdmF4LnNlcnZsZXQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnNlcnZsZXQtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgPC9leGNsdXNpb25zPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnBpbmc8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3ZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHR5cGU+bWFyPC90eXBlPgotICAgICAgICAgICAgPGV4Y2x1c2lvbnM+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5hbnQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmFudDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmFudDwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+YW50LWxhdW5jaGVyPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPmFvcGFsbGlhbmNlPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5hb3BhbGxpYW5jZTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmJjZWw8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmJjZWw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLnN1bi54bWwuZmFzdGluZm9zZXQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPkZhc3RJbmZvc2V0PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZ2Vyb25pbW8uc3BlY3M8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmdlcm9uaW1vLWFjdGl2YXRpb25fMS4xX3NwZWM8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5nZXJvbmltby5zcGVjczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+Z2Vyb25pbW8tamF2YW1haWxfMS40X3NwZWM8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+amFrYXJ0YS1yZWdleHA8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpha2FydGEtcmVnZXhwPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPmphdmF4LnhtbC5iaW5kPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qc3IxNzNfYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5zcHJpbmdmcmFtZXdvcms8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnNwcmluZy1iZWFuczwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuc3ByaW5nZnJhbWV3b3JrPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zcHJpbmctY29udGV4dDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuc3ByaW5nZnJhbWV3b3JrPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zcHJpbmctY29yZTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuc3ByaW5nZnJhbWV3b3JrPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zcHJpbmctd2ViPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPnhlcmNlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+eG1sUGFyc2VyQVBJczwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5yaGlubzwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+anM8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+YnNmPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5ic2Y8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguc2VydmxldDwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2VydmxldC1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICA8L2V4Y2x1c2lvbnM+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWV4PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHt2ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDx0eXBlPmphcjwvdHlwZT4KLSAgICAgICAgICAgIDxjbGFzc2lmaWVyPmltcGw8L2NsYXNzaWZpZXI+Ci0gICAgICAgICAgICA8ZXhjbHVzaW9ucz4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmFudDwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+YW50PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYW50PC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5hbnQtbGF1bmNoZXI8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+YW9wYWxsaWFuY2U8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmFvcGFsbGlhbmNlPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYmNlbDwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+YmNlbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5jb20uc3VuLnhtbC5mYXN0aW5mb3NldDwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+RmFzdEluZm9zZXQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5nZXJvbmltby5zcGVjczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+Z2Vyb25pbW8tYWN0aXZhdGlvbl8xLjFfc3BlYzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmdlcm9uaW1vLnNwZWNzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5nZXJvbmltby1qYXZhbWFpbF8xLjRfc3BlYzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5qYWthcnRhLXJlZ2V4cDwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amFrYXJ0YS1yZWdleHA8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXgueG1sLmJpbmQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpzcjE3M19hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLnNwcmluZ2ZyYW1ld29yazwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+c3ByaW5nLWJlYW5zPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5zcHJpbmdmcmFtZXdvcms8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnNwcmluZy1jb250ZXh0PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5zcHJpbmdmcmFtZXdvcms8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnNwcmluZy1jb3JlPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5zcHJpbmdmcmFtZXdvcms8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnNwcmluZy13ZWI8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+eGVyY2VzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD54bWxQYXJzZXJBUElzPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPnJoaW5vPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qczwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5ic2Y8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmJzZjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5zZXJ2bGV0PC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zZXJ2bGV0LWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgIDwvZXhjbHVzaW9ucz4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1zY3JpcHRpbmc8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3ZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHR5cGU+bWFyPC90eXBlPgotICAgICAgICAgICAgPGV4Y2x1c2lvbnM+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5hbnQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmFudDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmFudDwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+YW50LWxhdW5jaGVyPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPmFvcGFsbGlhbmNlPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5hb3BhbGxpYW5jZTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmJjZWw8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmJjZWw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLnN1bi54bWwuZmFzdGluZm9zZXQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPkZhc3RJbmZvc2V0PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZ2Vyb25pbW8uc3BlY3M8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmdlcm9uaW1vLWFjdGl2YXRpb25fMS4xX3NwZWM8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5nZXJvbmltby5zcGVjczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+Z2Vyb25pbW8tamF2YW1haWxfMS40X3NwZWM8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+amFrYXJ0YS1yZWdleHA8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpha2FydGEtcmVnZXhwPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPmphdmF4LnhtbC5iaW5kPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qc3IxNzNfYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5zcHJpbmdmcmFtZXdvcms8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnNwcmluZy1iZWFuczwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuc3ByaW5nZnJhbWV3b3JrPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zcHJpbmctY29udGV4dDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuc3ByaW5nZnJhbWV3b3JrPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zcHJpbmctY29yZTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuc3ByaW5nZnJhbWV3b3JrPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zcHJpbmctd2ViPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPnhlcmNlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+eG1sUGFyc2VyQVBJczwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5yaGlubzwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+anM8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+YnNmPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5ic2Y8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguc2VydmxldDwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2VydmxldC1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICA8L2V4Y2x1c2lvbnM+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItY29yYmE8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3ZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPGV4Y2x1c2lvbnM+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5hbnQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmFudDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmFudDwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+YW50LWxhdW5jaGVyPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPmFvcGFsbGlhbmNlPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5hb3BhbGxpYW5jZTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmJjZWw8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmJjZWw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLnN1bi54bWwuZmFzdGluZm9zZXQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPkZhc3RJbmZvc2V0PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZ2Vyb25pbW8uc3BlY3M8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmdlcm9uaW1vLWFjdGl2YXRpb25fMS4xX3NwZWM8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5nZXJvbmltby5zcGVjczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+Z2Vyb25pbW8tamF2YW1haWxfMS40X3NwZWM8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+amFrYXJ0YS1yZWdleHA8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpha2FydGEtcmVnZXhwPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPmphdmF4LnhtbC5iaW5kPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qc3IxNzNfYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5zcHJpbmdmcmFtZXdvcms8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnNwcmluZy1iZWFuczwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuc3ByaW5nZnJhbWV3b3JrPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zcHJpbmctY29udGV4dDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuc3ByaW5nZnJhbWV3b3JrPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zcHJpbmctY29yZTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuc3ByaW5nZnJhbWV3b3JrPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zcHJpbmctd2ViPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPnhlcmNlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+eG1sUGFyc2VyQVBJczwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5yaGlubzwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+anM8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+YnNmPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5ic2Y8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguc2VydmxldDwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2VydmxldC1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICA8L2V4Y2x1c2lvbnM+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+dmVyc2lvbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7dmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8dHlwZT5hYXI8L3R5cGU+Ci0gICAgICAgICAgICA8ZXhjbHVzaW9ucz4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmFudDwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+YW50PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYW50PC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5hbnQtbGF1bmNoZXI8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+YW9wYWxsaWFuY2U8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmFvcGFsbGlhbmNlPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYmNlbDwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+YmNlbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5jb20uc3VuLnhtbC5mYXN0aW5mb3NldDwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+RmFzdEluZm9zZXQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5nZXJvbmltby5zcGVjczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+Z2Vyb25pbW8tYWN0aXZhdGlvbl8xLjFfc3BlYzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmdlcm9uaW1vLnNwZWNzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5nZXJvbmltby1qYXZhbWFpbF8xLjRfc3BlYzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5qYWthcnRhLXJlZ2V4cDwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amFrYXJ0YS1yZWdleHA8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXgueG1sLmJpbmQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpzcjE3M19hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLnNwcmluZ2ZyYW1ld29yazwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+c3ByaW5nLWJlYW5zPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5zcHJpbmdmcmFtZXdvcms8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnNwcmluZy1jb250ZXh0PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5zcHJpbmdmcmFtZXdvcms8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnNwcmluZy1jb3JlPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5zcHJpbmdmcmFtZXdvcms8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnNwcmluZy13ZWI8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+eGVyY2VzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD54bWxQYXJzZXJBUElzPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPnJoaW5vPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qczwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5ic2Y8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmJzZjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5zZXJ2bGV0PC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zZXJ2bGV0LWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgIDwvZXhjbHVzaW9ucz4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmphdmF4LnNlcnZsZXQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5zZXJ2bGV0LWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD54bWwtcmVzb2x2ZXI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD54bWwtcmVzb2x2ZXI8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItbXRvbXBvbGljeTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7dmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmh0dHBjb21wb25lbnRzPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+aHR0cGNvcmU8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItamF4d3MtbWFyPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHt2ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDx0eXBlPm1hcjwvdHlwZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgIDwvZGVwZW5kZW5jaWVzPgotICAgIDxidWlsZD4KLSAgICAgICAgPGZpbmFsTmFtZT5heGlzMi0ke3ZlcnNpb259PC9maW5hbE5hbWU+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4td2FyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke21hdmVuLndhci52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHdhck5hbWU+YXhpczI8L3dhck5hbWU+Ci0gICAgICAgICAgICAgICAgICAgIDxhcmNoaXZlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGFkZE1hdmVuRGVzY3JpcHRvcj5mYWxzZTwvYWRkTWF2ZW5EZXNjcmlwdG9yPgotICAgICAgICAgICAgICAgICAgICA8L2FyY2hpdmU+Ci0gICAgICAgICAgICAgICAgICAgIDx3ZWJSZXNvdXJjZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIE5lZWQgYSBiZXR0ZXIgd2FyIHRvIGFkZCB0aGUgTUFSIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+JHtiYXNlZGlyfS8uLi9hZGRyZXNzaW5nL3RhcmdldDwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YXJnZXRQYXRoPldFQi1JTkYvbW9kdWxlczwvdGFyZ2V0UGF0aD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPmFkZHJlc3NpbmcqLm1hcjwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PiR7YmFzZWRpcn0vLi4vamF4d3MtbWFyL3RhcmdldDwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YXJnZXRQYXRoPldFQi1JTkYvbW9kdWxlczwvdGFyZ2V0UGF0aD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPmF4aXMyLWpheHdzLW1hcioubWFyPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+JHtiYXNlZGlyfS8uLi9zb2FwbW9uaXRvci90YXJnZXQ8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFyZ2V0UGF0aD5XRUItSU5GL21vZHVsZXM8L3RhcmdldFBhdGg+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5zb2FwbW9uaXRvcioubWFyPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+JHtiYXNlZGlyfS8uLi9zb2FwbW9uaXRvci90YXJnZXQ8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFyZ2V0UGF0aD5XRUItSU5GL2xpYjwvdGFyZ2V0UGF0aD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPnNvYXBtb25pdG9yKi5qYXI8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPipzb3VyY2VzLmphcjwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2V4Y2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PiR7YmFzZWRpcn0vLi4vbWV4L3RhcmdldDwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YXJnZXRQYXRoPldFQi1JTkYvbW9kdWxlczwvdGFyZ2V0UGF0aD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPm1leCoubWFyPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+JHtiYXNlZGlyfS8uLi9waW5nL3RhcmdldDwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YXJnZXRQYXRoPldFQi1JTkYvbW9kdWxlczwvdGFyZ2V0UGF0aD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPnBpbmcqLm1hcjwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PiR7YmFzZWRpcn0vLi4vc2NyaXB0aW5nL3RhcmdldDwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YXJnZXRQYXRoPldFQi1JTkYvbW9kdWxlczwvdGFyZ2V0UGF0aD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPipzY3JpcHRpbmcqLm1hcjwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PiR7YmFzZWRpcn0vLi4vbXRvbXBvbGljeS1tYXIvdGFyZ2V0PC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhcmdldFBhdGg+V0VCLUlORi9tb2R1bGVzPC90YXJnZXRQYXRoPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+Km10b21wb2xpY3kqLm1hcjwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PiR7YmFzZWRpcn0vLi4vc2FtcGxlcy92ZXJzaW9uL3RhcmdldDwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YXJnZXRQYXRoPldFQi1JTkYvc2VydmljZXM8L3RhcmdldFBhdGg+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT52ZXJzaW9uKi5hYXI8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpcmVjdG9yeT4ke2Jhc2VkaXJ9Ly4uL2tlcm5lbC9jb25mPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhcmdldFBhdGg+V0VCLUlORi9jb25mPC90YXJnZXRQYXRoPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+YXhpczIueG1sPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+JHtiYXNlZGlyfS8uLi9rZXJuZWwvY29uZjwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YXJnZXRQYXRoPldFQi1JTkYvY2xhc3NlczwvdGFyZ2V0UGF0aD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioucHJvcGVydGllczwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PiR7YmFzZWRpcn0vLi4vLi4vbGVnYWw8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFyZ2V0UGF0aD5XRUItSU5GL2xpYjwvdGFyZ2V0UGF0aD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioudHh0PC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT5zZXJ2bGV0Ki50eHQ8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9leGNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpcmVjdG9yeT4ke2Jhc2VkaXJ9L2NvbmY8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFyZ2V0UGF0aD5XRUItSU5GPC90YXJnZXRQYXRoPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+d2ViLnhtbDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PiR7YmFzZWRpcn0vY29uZjwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YXJnZXRQYXRoPldFQi1JTkYvc2VydmljZXM8L3RhcmdldFBhdGg+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbHRlcmluZz50cnVlPC9maWx0ZXJpbmc+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5zZXJ2aWNlcy5saXN0PC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+JHtiYXNlZGlyfS9jb25mPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhcmdldFBhdGg+V0VCLUlORi9tb2R1bGVzPC90YXJnZXRQYXRoPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWx0ZXJpbmc+dHJ1ZTwvZmlsdGVyaW5nPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+bW9kdWxlcy5saXN0PC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICAgICAgICAgICAgICA8L3dlYlJlc291cmNlcz4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvYnVpbGQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy93ZWJhcHAvc2NyaXB0cy9idWlsZC54bWwgYi92MS41LjFSQzMvbW9kdWxlcy93ZWJhcHAvc2NyaXB0cy9idWlsZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwODRlMTQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvd2ViYXBwL3NjcmlwdHMvYnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08cHJvamVjdCBiYXNlZGlyPSIuLi8iIGRlZmF1bHQ9ImNyZWF0ZS53YXIiPgotCTxwcm9wZXJ0eSBuYW1lPSJkaXN0IiB2YWx1ZT0iZGlzdCIgLz4KLQk8cHJvcGVydHkgbmFtZT0idGVtcCIgdmFsdWU9IiR7ZGlzdH0vdGVtcCIgLz4KLQotCTx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0JCTxta2RpciBkaXI9IiR7ZGlzdH0iIC8+Ci0JCTxta2RpciBkaXI9IiR7dGVtcH0iIC8+Ci0JCTxjb3B5IHRvRGlyPSIke3RlbXB9Ij4KLQkJCTxmaWxlc2V0IGRpcj0id2ViYXBwIj4KLQkJCQk8aW5jbHVkZSBuYW1lPSIqKi8qKiIgLz4KLQkJCQk8ZXhjbHVkZSBuYW1lPSIqKi93ZWIueG1sIi8+Ci0JCQk8L2ZpbGVzZXQ+Ci0JCTwvY29weT4KLQk8L3RhcmdldD4KLQkKLQk8dGFyZ2V0IGRlcGVuZHM9ImluaXQiIG5hbWU9InByZXBhcmUucmVwbyI+Ci0JCQotCQk8IS0tIENvcHlpbmcgdGhlIGF4aXMyIHJlcG9zaXRvcnkgZnJvbSAuLi9yZXBvc2l0b3J5IC0tPgotCQk8Y29weSB0b0Rpcj0iJHt0ZW1wfS9XRUItSU5GIj4KLQkJCTxmaWxlc2V0IGRpcj0icmVwb3NpdG9yeSI+Ci0JCQkJPGluY2x1ZGUgbmFtZT0iKiovKioiIC8+Ci0JCQk8L2ZpbGVzZXQ+Ci0JCTwvY29weT4KLQotCQk8IS0tIENyZWF0aW5nIHRoZSBzZXJ2aWNlcy5saXN0IC0tPgotCQk8cGF0aCBpZD0ic2VydmljZXMuYXJjaGl2ZXMiPgotCQkJPGZpbGVzZXQgZGlyPSIke3RlbXB9L1dFQi1JTkYvc2VydmljZXMiPgotCQkJCTxpbmNsdWRlIG5hbWU9IiouYWFyIiAvPgotCQkJPC9maWxlc2V0PgotCQk8L3BhdGg+Ci0JCTxwYXRoY29udmVydCBwYXRoc2VwPSIke2xpbmUuc2VwYXJhdG9yfSIgcHJvcGVydHk9ImVjaG8uc2VydmljZXMuYXJjaGl2ZXMiIHJlZmlkPSJzZXJ2aWNlcy5hcmNoaXZlcyI+Ci0JCQk8ZmxhdHRlbm1hcHBlciAvPgotCQk8L3BhdGhjb252ZXJ0PgotCQk8ZWNobyBmaWxlPSIke3RlbXB9L1dFQi1JTkYvc2VydmljZXMvc2VydmljZXMubGlzdCIgbWVzc2FnZT0iJHtlY2hvLnNlcnZpY2VzLmFyY2hpdmVzfSIgLz4KLQotCQk8IS0tIENyZWF0aW5nIHRoZSBtb2R1bGVzLmxpc3QgLS0+Ci0JCTxwYXRoIGlkPSJtb2R1bGVzLmFyY2hpdmVzIj4KLQkJCTxmaWxlc2V0IGRpcj0iJHt0ZW1wfS9XRUItSU5GL21vZHVsZXMiPgotCQkJCTxpbmNsdWRlIG5hbWU9IioubWFyIiAvPgotCQkJPC9maWxlc2V0PgotCQk8L3BhdGg+Ci0JCTxwYXRoY29udmVydCBwYXRoc2VwPSIke2xpbmUuc2VwYXJhdG9yfSIgcHJvcGVydHk9ImVjaG8ubW9kdWxlcy5hcmNoaXZlcyIgcmVmaWQ9Im1vZHVsZXMuYXJjaGl2ZXMiPgotCQkJPGZsYXR0ZW5tYXBwZXIgLz4KLQkJPC9wYXRoY29udmVydD4KLQkJPGVjaG8gZmlsZT0iJHt0ZW1wfS9XRUItSU5GL21vZHVsZXMvbW9kdWxlcy5saXN0IiBtZXNzYWdlPSIke2VjaG8ubW9kdWxlcy5hcmNoaXZlc30iIC8+Ci0KLQkJPCEtLSBDb3B5aW5nIHRoZSBheGlzMi54bWwgZnJvbSAuLi9jb25mIC0tPgotCQk8bWtkaXIgZGlyPSIke3RlbXB9L1dFQi1JTkYvY29uZiIgLz4KLQkJPGNvcHkgZmlsZT0iY29uZi9heGlzMi54bWwiIHRvRGlyPSIke3RlbXB9L1dFQi1JTkYvY29uZiIgLz4KLQk8L3RhcmdldD4KLQkKLQk8dGFyZ2V0IGRlcGVuZHM9ImluaXQscHJlcGFyZS5yZXBvIiBuYW1lPSJjcmVhdGUud2FyIj4KLQkJPHdhciBkZXN0ZmlsZT0iZGlzdC9heGlzMi53YXIiIHdlYnhtbD0id2ViYXBwL1dFQi1JTkYvd2ViLnhtbCI+Ci0JCQk8bGliIGRpcj0ibGliIj4KLQkJCQk8aW5jbHVkZSBuYW1lPSIqKiIgLz4KLQkJCQk8ZXhjbHVkZSBuYW1lPSIqKnNlcnZsZXQqKiIgLz4KLQkJCQk8ZXhjbHVkZSBuYW1lPSJhbnQqLmphciIgLz4KLQkJCQk8ZXhjbHVkZSBuYW1lPSJheGlzMi1hZGItY29kZWdlbiouamFyIi8+Ci0JCQkJPGV4Y2x1ZGUgbmFtZT0iYXhpczItY29kZWdlbiouamFyIi8+Ci0JCQkJPGV4Y2x1ZGUgbmFtZT0iamlieC1iaW5kKi5qYXIiLz4KLQkJCTwvbGliPgotCQkJPHdlYmluZiBkaXI9IiR7dGVtcH0vV0VCLUlORiIgLz4KLQkJCTxmaWxlc2V0IGRpcj0iJHt0ZW1wfSI+Ci0JCQkJPGluY2x1ZGUgbmFtZT0iKiovYXhpczItd2ViLyoqIiAvPgotCQkJPC9maWxlc2V0PgotCQk8L3dhcj4KLQkJPGRlbGV0ZSBkaXI9IiR7dGVtcH0iIC8+Ci0JPC90YXJnZXQ+Ci08L3Byb2plY3Q+Ci0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvd2ViYXBwL0FkbWluQWdlbnQuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvd2ViYXBwL0FkbWluQWdlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRhNDE1Yy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3dlYmFwcC9BZG1pbkFnZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MjggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLndlYmFwcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuU2VydmljZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LlNlcnZpY2VHcm91cENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LnV0aWwuUGhhc2VzSW5mbzsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNNb2R1bGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5QYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0NvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5BYnN0cmFjdEFnZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5maWxldXBsb2FkLkZpbGVJdGVtOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5maWxldXBsb2FkLkZpbGVJdGVtRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuZmlsZXVwbG9hZC5SZXF1ZXN0Q29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuZmlsZXVwbG9hZC5kaXNrLkRpc2tGaWxlSXRlbUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmZpbGV1cGxvYWQuc2VydmxldC5TZXJ2bGV0RmlsZVVwbG9hZDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuZmlsZXVwbG9hZC5zZXJ2bGV0LlNlcnZsZXRSZXF1ZXN0Q29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OwotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogUHJvdmlkZXMgbWV0aG9kcyB0byBwcm9jZXNzIGF4aXMyIGFkbWluIHJlcXVlc3RzLgotICovCi1wdWJsaWMgY2xhc3MgQWRtaW5BZ2VudCBleHRlbmRzIEFic3RyYWN0QWdlbnQgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhBYnN0cmFjdEFnZW50LmNsYXNzKTsKLSAgICAvKioKLSAgICAgKiBGaWVsZCBMSVNUX01VTFRJUExFX1NFUlZJQ0VfSlNQX05BTUUKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElTVF9TRVJWSUNFX0dST1VQX0pTUCA9ICJMaXN0U2VydmljZUdyb3VwLmpzcCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExJU1RfU0VSVklDRVNfSlNQX05BTUUgPSAibGlzdFNlcnZpY2UuanNwIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElTVF9TSU5HTEVfU0VSVklDRVNfSlNQX05BTUUgPSAibGlzdFNpbmdsZVNlcnZpY2UuanNwIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VMRUNUX1NFUlZJQ0VfSlNQX05BTUUgPSAiU2VsZWN0U2VydmljZS5qc3AiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTl9BQ1RJVkFURV9TRVJWSUNFX0pTUF9OQU1FID0gIkluQWN0aXZhdGVTZXJ2aWNlLmpzcCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElWQVRFX1NFUlZJQ0VfSlNQX05BTUUgPSAiQWN0aXZhdGVTZXJ2aWNlLmpzcCI7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBMSVNUX1NJTkdMRV9TRVJWSUNFX0pTUF9OQU1FCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExJU1RfUEhBU0VTX0pTUF9OQU1FID0gInZpZXdwaGFzZXMuanNwIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElTVF9HTE9BQkxMWV9FTkdBR0VEX01PRFVMRVNfSlNQX05BTUUgPSAiZ2xvYmFsTW9kdWxlcy5qc3AiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMSVNUX0FWQUlMQUJMRV9NT0RVTEVTX0pTUF9OQU1FID0gImxpc3RNb2R1bGVzLmpzcCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVOR0FHSU5HX01PRFVMRV9UT19TRVJWSUNFX0pTUF9OQU1FID0gImVuZ2FnaW5ndG9hc2VydmljZS5qc3AiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTkdBR0lOR19NT0RVTEVfVE9fU0VSVklDRV9HUk9VUF9KU1BfTkFNRSA9Ci0gICAgICAgICAgICAiRW5nYWdlVG9TZXJ2aWNlR3JvdXAuanNwIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5HQUdJTkdfTU9EVUxFX0dMT0JBTExZX0pTUF9OQU1FID0gImVuZ2FnaW5nZ2xvYmFsbHkuanNwIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRE1JTl9KU1BfTkFNRSA9ICJhZG1pbi5qc3AiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWSUVXX0dMT0JBTF9IQU5ETEVSU19KU1BfTkFNRSA9ICJWaWV3R2xvYmFsSGFuZGxlcnMuanNwIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklFV19TRVJWSUNFX0hBTkRMRVJTX0pTUF9OQU1FID0gIlZpZXdTZXJ2aWNlSGFuZGxlcnMuanNwIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVklDRV9QQVJBX0VESVRfSlNQX05BTUUgPSAiU2VydmljZVBhcmFFZGl0LmpzcCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVOR0FHRV9UT19PUEVSQVRJT05fSlNQX05BTUUgPSAiZW5nYWdpbmd0b2Fub3BlcmF0aW9uLmpzcCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR0lOX0pTUF9OQU1FID0gIkxvZ2luLmpzcCI7Ci0KLSAgICBwcml2YXRlIEZpbGUgc2VydmljZURpcjsKLQotICAgIHB1YmxpYyBBZG1pbkFnZW50KENvbmZpZ3VyYXRpb25Db250ZXh0IGFDb25maWdDb250ZXh0KSB7Ci0gICAgICAgIHN1cGVyKGFDb25maWdDb250ZXh0KTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChjb25maWdDb250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCkuZ2V0UmVwb3NpdG9yeSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBGaWxlIHJlcG9EaXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGUoY29uZmlnQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpLmdldFJlcG9zaXRvcnkoKS5nZXRGaWxlKCkpOwotICAgICAgICAgICAgICAgIHNlcnZpY2VEaXIgPSBuZXcgRmlsZShyZXBvRGlyLCAic2VydmljZXMiKTsKLSAgICAgICAgICAgICAgICBpZiAoIXNlcnZpY2VEaXIuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgc2VydmljZURpci5ta2RpcnMoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBsb2cuaW5mbyhlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0gICAgICAgICAgICBsb2cuZXJyb3IoZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaGFuZGxlKEh0dHBTZXJ2bGV0UmVxdWVzdCBodHRwU2VydmxldFJlcXVlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgaHR0cFNlcnZsZXRSZXNwb25zZSkKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgLy8gV2UgZm9yd2FyZCB0byBsb2dpbiBwYWdlIGlmIGF4aXMyIHNlY3VyaXR5IGlzIGVuYWJsZWQKLSAgICAgICAgLy8gYW5kIHRoZSB1c2VyIGlzIG5vdCBhdXRob3JpemVkCi0gICAgICAgIC8vIFRPRE8gRml4IHdvcmthcm91bmQgZm9yIGxvZ2luIHRlc3QKLSAgICAgICAgaWYgKGF4aXNTZWN1cml0eUVuYWJsZWQoKSAmJiBhdXRob3JpemF0aW9uUmVxdWlyZWQoaHR0cFNlcnZsZXRSZXF1ZXN0KSkgewotICAgICAgICAgICAgcmVuZGVyVmlldyhMT0dJTl9KU1BfTkFNRSwgaHR0cFNlcnZsZXRSZXF1ZXN0LCBodHRwU2VydmxldFJlc3BvbnNlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHN1cGVyLmhhbmRsZShodHRwU2VydmxldFJlcXVlc3QsIGh0dHBTZXJ2bGV0UmVzcG9uc2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJvY2Vzc0luZGV4KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKLSAgICAgICAgcmVuZGVyVmlldyhBRE1JTl9KU1BfTkFNRSwgcmVxLCByZXMpOwotICAgIH0KLQotICAgIC8vIHN1cHBvcnRlZCB3ZWIgb3BlcmF0aW9ucwotCi0gICAgcHVibGljIHZvaWQgcHJvY2Vzc1VwbG9hZChIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlcykKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBoYXNIb3REZXBsb3ltZW50ID0KLSAgICAgICAgICAgICAgICAoU3RyaW5nKSBjb25maWdDb250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCkuZ2V0UGFyYW1ldGVyVmFsdWUoImhvdGRlcGxveW1lbnQiKTsKLSAgICAgICAgU3RyaW5nIGhhc0hvdFVwZGF0ZSA9Ci0gICAgICAgICAgICAgICAgKFN0cmluZykgY29uZmlnQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpLmdldFBhcmFtZXRlclZhbHVlKCJob3R1cGRhdGUiKTsKLSAgICAgICAgcmVxLnNldEF0dHJpYnV0ZSgiaG90RGVwbG95bWVudCIsIChoYXNIb3REZXBsb3ltZW50LmVxdWFscygidHJ1ZSIpKSA/ICJlbmFibGVkIgotICAgICAgICAgICAgICAgIDogImRpc2FibGVkIik7Ci0gICAgICAgIHJlcS5zZXRBdHRyaWJ1dGUoImhvdFVwZGF0ZSIsIChoYXNIb3RVcGRhdGUuZXF1YWxzKCJ0cnVlIikpID8gImVuYWJsZWQiIDogImRpc2FibGVkIik7Ci0gICAgICAgIFJlcXVlc3RDb250ZXh0IHJlcUNvbnRleHQgPSBuZXcgU2VydmxldFJlcXVlc3RDb250ZXh0KHJlcSk7Ci0KLSAgICAgICAgYm9vbGVhbiBpc011bHRpcGFydCA9IFNlcnZsZXRGaWxlVXBsb2FkLmlzTXVsdGlwYXJ0Q29udGVudChyZXFDb250ZXh0KTsKLSAgICAgICAgaWYgKGlzTXVsdGlwYXJ0KSB7Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgLy9DcmVhdGUgYSBmYWN0b3J5IGZvciBkaXNrLWJhc2VkIGZpbGUgaXRlbXMKLSAgICAgICAgICAgICAgICBGaWxlSXRlbUZhY3RvcnkgZmFjdG9yeSA9IG5ldyBEaXNrRmlsZUl0ZW1GYWN0b3J5KCk7Ci0gICAgICAgICAgICAgICAgLy9DcmVhdGUgYSBuZXcgZmlsZSB1cGxvYWQgaGFuZGxlcgotICAgICAgICAgICAgICAgIFNlcnZsZXRGaWxlVXBsb2FkIHVwbG9hZCA9IG5ldyBTZXJ2bGV0RmlsZVVwbG9hZChmYWN0b3J5KTsKLSAgICAgICAgICAgICAgICBMaXN0IGl0ZW1zID0gdXBsb2FkLnBhcnNlUmVxdWVzdChyZXEpOwotICAgICAgICAgICAgICAgIC8vIFByb2Nlc3MgdGhlIHVwbG9hZGVkIGl0ZW1zCi0gICAgICAgICAgICAgICAgSXRlcmF0b3IgaXRlciA9IGl0ZW1zLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEZpbGVJdGVtIGl0ZW0gPSAoRmlsZUl0ZW0pIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIWl0ZW0uaXNGb3JtRmllbGQoKSkgewotCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZmlsZU5hbWUgPSBpdGVtLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBmaWxlRXh0ZXNpb24gPSBmaWxlTmFtZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVFeHRlc2lvbiA9IGZpbGVFeHRlc2lvbi50b0xvd2VyQ2FzZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoZmlsZUV4dGVzaW9uLmVuZHNXaXRoKCIuamFyIikgfHwgZmlsZUV4dGVzaW9uLmVuZHNXaXRoKCIuYWFyIikpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxLnNldEF0dHJpYnV0ZSgic3RhdHVzIiwgImZhaWx1cmUiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXEuc2V0QXR0cmlidXRlKCJjYXVzZSIsICJVbnN1cHBvcnRlZCBmaWxlIHR5cGUgIiArIGZpbGVFeHRlc2lvbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZpbGVOYW1lT25seTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZU5hbWUuaW5kZXhPZigiXFwiKSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWVPbmx5ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZS5zdWJzdHJpbmcoZmlsZU5hbWUubGFzdEluZGV4T2YoIi8iKSArIDEsIGZpbGVOYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubGVuZ3RoKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lT25seSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWUuc3Vic3RyaW5nKGZpbGVOYW1lLmxhc3RJbmRleE9mKCJcXCIpICsgMSwgZmlsZU5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5sZW5ndGgoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZSB1cGxvYWRlZEZpbGUgPSBuZXcgRmlsZShzZXJ2aWNlRGlyLCBmaWxlTmFtZU9ubHkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0ud3JpdGUodXBsb2FkZWRGaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXEuc2V0QXR0cmlidXRlKCJzdGF0dXMiLCAic3VjY2VzcyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcS5zZXRBdHRyaWJ1dGUoImZpbGVuYW1lIiwgZmlsZU5hbWVPbmx5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgcmVxLnNldEF0dHJpYnV0ZSgic3RhdHVzIiwgImZhaWx1cmUiKTsKLSAgICAgICAgICAgICAgICByZXEuc2V0QXR0cmlidXRlKCJjYXVzZSIsIGUuZ2V0TWVzc2FnZSgpKTsKLQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJlbmRlclZpZXcoInVwbG9hZC5qc3AiLCByZXEsIHJlcyk7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzTG9naW4oSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgdXNlcm5hbWUgPSByZXEuZ2V0UGFyYW1ldGVyKCJ1c2VyTmFtZSIpOwotICAgICAgICBTdHJpbmcgcGFzc3dvcmQgPSByZXEuZ2V0UGFyYW1ldGVyKCJwYXNzd29yZCIpOwotCi0gICAgICAgIGlmICgodXNlcm5hbWUgPT0gbnVsbCkgfHwgKHBhc3N3b3JkID09IG51bGwpIHx8IHVzZXJuYW1lLnRyaW0oKS5sZW5ndGgoKSA9PSAwCi0gICAgICAgICAgICAgICAgfHwgcGFzc3dvcmQudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIHJlcS5zZXRBdHRyaWJ1dGUoImVycm9yTWVzc2FnZSIsICJJbnZhbGlkIGF1dGggY3JlZGVudGlhbHMhIik7Ci0gICAgICAgICAgICByZW5kZXJWaWV3KExPR0lOX0pTUF9OQU1FLCByZXEsIHJlcyk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgYWRtaW5Vc2VyTmFtZSA9IChTdHJpbmcpIGNvbmZpZ0NvbnRleHQuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5nZXRQYXJhbWV0ZXIoCi0gICAgICAgICAgICAgICAgQ29uc3RhbnRzLlVTRVJfTkFNRSkuZ2V0VmFsdWUoKTsKLSAgICAgICAgU3RyaW5nIGFkbWluUGFzc3dvcmQgPSAoU3RyaW5nKSBjb25maWdDb250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCkuZ2V0UGFyYW1ldGVyKAotICAgICAgICAgICAgICAgIENvbnN0YW50cy5QQVNTV09SRCkuZ2V0VmFsdWUoKTsKLQotICAgICAgICBpZiAodXNlcm5hbWUuZXF1YWxzKGFkbWluVXNlck5hbWUpICYmIHBhc3N3b3JkLmVxdWFscyhhZG1pblBhc3N3b3JkKSkgewotICAgICAgICAgICAgcmVxLmdldFNlc3Npb24oKS5zZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLkxPR0dFRCwgIlllcyIpOwotICAgICAgICAgICAgcmVuZGVyVmlldyhBRE1JTl9KU1BfTkFNRSwgcmVxLCByZXMpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmVxLnNldEF0dHJpYnV0ZSgiZXJyb3JNZXNzYWdlIiwgIkludmFsaWQgYXV0aCBjcmVkZW50aWFscyEiKTsKLSAgICAgICAgICAgIHJlbmRlclZpZXcoTE9HSU5fSlNQX05BTUUsIHJlcSwgcmVzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NFZGl0U2VydmljZVBhcmEoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgc2VydmljZU5hbWUgPSByZXEuZ2V0UGFyYW1ldGVyKCJheGlzU2VydmljZSIpOwotICAgICAgICBpZiAocmVxLmdldFBhcmFtZXRlcigiY2hhbmdlUGFyYSIpICE9IG51bGwpIHsKLSAgICAgICAgICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2UgPSBjb25maWdDb250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCkuZ2V0U2VydmljZShzZXJ2aWNlTmFtZSk7Ci0gICAgICAgICAgICBpZiAoc2VydmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgQXJyYXlMaXN0IHNlcnZpY2VfcGFyYSA9IHNlcnZpY2UuZ2V0UGFyYW1ldGVycygpOwotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXJ2aWNlX3BhcmEuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgUGFyYW1ldGVyIHBhcmFtZXRlciA9IChQYXJhbWV0ZXIpIHNlcnZpY2VfcGFyYS5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXJhID0gcmVxLmdldFBhcmFtZXRlcihzZXJ2aWNlTmFtZSArICJfIiArIHBhcmFtZXRlci5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLmFkZFBhcmFtZXRlcihuZXcgUGFyYW1ldGVyKHBhcmFtZXRlci5nZXROYW1lKCksIHBhcmEpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gc2VydmljZS5nZXRPcGVyYXRpb25zKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICAgICAgQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uID0gKEF4aXNPcGVyYXRpb24pIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG9wX25hbWUgPSBheGlzT3BlcmF0aW9uLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICAgICAgQXJyYXlMaXN0IG9wZXJhdGlvbl9wYXJhID0gYXhpc09wZXJhdGlvbi5nZXRQYXJhbWV0ZXJzKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvcGVyYXRpb25fcGFyYS5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1ldGVyIHBhcmFtZXRlciA9IChQYXJhbWV0ZXIpIG9wZXJhdGlvbl9wYXJhLmdldChpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXJhID0gcmVxLmdldFBhcmFtZXRlcihvcF9uYW1lICsgIl8iICsgcGFyYW1ldGVyLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNPcGVyYXRpb24uYWRkUGFyYW1ldGVyKG5ldyBQYXJhbWV0ZXIocGFyYW1ldGVyLmdldE5hbWUoKSwgcGFyYSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmVzLnNldENvbnRlbnRUeXBlKCJ0ZXh0L2h0bWwiKTsKLSAgICAgICAgICAgIHJlcS5zZXRBdHRyaWJ1dGUoInN0YXR1cyIsICJQYXJhbWV0ZXJzIENoYW5nZWQgU3VjY2Vzc2Z1bGx5LiIpOwotICAgICAgICAgICAgcmVxLmdldFNlc3Npb24oKS5yZW1vdmVBdHRyaWJ1dGUoQ29uc3RhbnRzLlNFUlZJQ0UpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZVRlbXAgPQotICAgICAgICAgICAgICAgICAgICBjb25maWdDb250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCkuZ2V0U2VydmljZUZvckFjdGl2YXRpb24oc2VydmljZU5hbWUpOwotICAgICAgICAgICAgaWYgKHNlcnZpY2VUZW1wLmlzQWN0aXZlKCkpIHsKLQotICAgICAgICAgICAgICAgIGlmIChzZXJ2aWNlTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlcS5nZXRTZXNzaW9uKCkuc2V0QXR0cmlidXRlKENvbnN0YW50cy5TRVJWSUNFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWdDb250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCkuZ2V0U2VydmljZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlTmFtZSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmVxLnNldEF0dHJpYnV0ZSgic3RhdHVzIiwgIlNlcnZpY2UgIiArIHNlcnZpY2VOYW1lICsgIiBpcyBub3QgYW4gYWN0aXZlIHNlcnZpY2UiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIuIFxuIE9ubHkgcGFyYW1ldGVycyBvZiBhY3RpdmUgc2VydmljZXMgY2FuIGJlIGVkaXRlZC4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZW5kZXJWaWV3KFNFUlZJQ0VfUEFSQV9FRElUX0pTUF9OQU1FLCByZXEsIHJlcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJvY2Vzc0VuZ2FnaW5nR2xvYmFsbHkoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24gewotICAgICAgICBIYXNoTWFwIG1vZHVsZXMgPSBjb25maWdDb250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCkuZ2V0TW9kdWxlcygpOwotCi0gICAgICAgIHJlcS5nZXRTZXNzaW9uKCkuc2V0QXR0cmlidXRlKENvbnN0YW50cy5NT0RVTEVfTUFQLCBtb2R1bGVzKTsKLQotICAgICAgICBTdHJpbmcgbW9kdWxlTmFtZSA9IHJlcS5nZXRQYXJhbWV0ZXIoIm1vZHVsZXMiKTsKLQotICAgICAgICByZXEuZ2V0U2Vzc2lvbigpLnNldEF0dHJpYnV0ZShDb25zdGFudHMuRU5HQUdFX1NUQVRVUywgbnVsbCk7Ci0KLSAgICAgICAgaWYgKG1vZHVsZU5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBjb25maWdDb250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCkuZW5nYWdlTW9kdWxlKG1vZHVsZU5hbWUpOwotICAgICAgICAgICAgICAgIHJlcS5nZXRTZXNzaW9uKCkuc2V0QXR0cmlidXRlKENvbnN0YW50cy5FTkdBR0VfU1RBVFVTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZU5hbWUgKyAiIG1vZHVsZSBlbmdhZ2VkIGdsb2JhbGx5IHN1Y2Nlc3NmdWxseSIpOwotICAgICAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGF4aXNGYXVsdCkgewotICAgICAgICAgICAgICAgIHJlcS5nZXRTZXNzaW9uKCkuc2V0QXR0cmlidXRlKENvbnN0YW50cy5FTkdBR0VfU1RBVFVTLCBheGlzRmF1bHQuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJlcS5nZXRTZXNzaW9uKCkuc2V0QXR0cmlidXRlKCJtb2R1bGVzIiwgbnVsbCk7Ci0gICAgICAgIHJlbmRlclZpZXcoRU5HQUdJTkdfTU9EVUxFX0dMT0JBTExZX0pTUF9OQU1FLCByZXEsIHJlcyk7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzTGlzdE9wZXJhdGlvbnMoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24gewotICAgICAgICBIYXNoTWFwIG1vZHVsZXMgPSBjb25maWdDb250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCkuZ2V0TW9kdWxlcygpOwotCi0gICAgICAgIHJlcS5nZXRTZXNzaW9uKCkuc2V0QXR0cmlidXRlKENvbnN0YW50cy5NT0RVTEVfTUFQLCBtb2R1bGVzKTsKLQotICAgICAgICBTdHJpbmcgbW9kdWxlTmFtZSA9IHJlcS5nZXRQYXJhbWV0ZXIoIm1vZHVsZXMiKTsKLQotICAgICAgICByZXEuZ2V0U2Vzc2lvbigpLnNldEF0dHJpYnV0ZShDb25zdGFudHMuRU5HQUdFX1NUQVRVUywgbnVsbCk7Ci0gICAgICAgIHJlcS5nZXRTZXNzaW9uKCkuc2V0QXR0cmlidXRlKCJtb2R1bGVzIiwgbnVsbCk7Ci0KLSAgICAgICAgU3RyaW5nIHNlcnZpY2VOYW1lID0gcmVxLmdldFBhcmFtZXRlcigiYXhpc1NlcnZpY2UiKTsKLQotICAgICAgICBpZiAoc2VydmljZU5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgcmVxLmdldFNlc3Npb24oKS5zZXRBdHRyaWJ1dGUoInNlcnZpY2UiLCBzZXJ2aWNlTmFtZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzZXJ2aWNlTmFtZSA9IChTdHJpbmcpIHJlcS5nZXRTZXNzaW9uKCkuZ2V0QXR0cmlidXRlKCJzZXJ2aWNlIik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXEuZ2V0U2Vzc2lvbigpLnNldEF0dHJpYnV0ZSgKLSAgICAgICAgICAgICAgICBDb25zdGFudHMuT1BFUkFUSU9OX01BUCwKLSAgICAgICAgICAgICAgICBjb25maWdDb250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCkuZ2V0U2VydmljZShzZXJ2aWNlTmFtZSkuZ2V0T3BlcmF0aW9ucygpKTsKLSAgICAgICAgcmVxLmdldFNlc3Npb24oKS5zZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLkVOR0FHRV9TVEFUVVMsIG51bGwpOwotCi0gICAgICAgIFN0cmluZyBvcGVyYXRpb25OYW1lID0gcmVxLmdldFBhcmFtZXRlcigiYXhpc09wZXJhdGlvbiIpOwotCi0gICAgICAgIGlmICgoc2VydmljZU5hbWUgIT0gbnVsbCkgJiYgKG1vZHVsZU5hbWUgIT0gbnVsbCkgJiYgKG9wZXJhdGlvbk5hbWUgIT0gbnVsbCkpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgQXhpc09wZXJhdGlvbiBvZCA9IGNvbmZpZ0NvbnRleHQuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5nZXRTZXJ2aWNlKAotICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZU5hbWUpLmdldE9wZXJhdGlvbihuZXcgUU5hbWUob3BlcmF0aW9uTmFtZSkpOwotCi0gICAgICAgICAgICAgICAgb2QuZW5nYWdlTW9kdWxlKAotICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpLmdldE1vZHVsZShtb2R1bGVOYW1lKSk7Ci0gICAgICAgICAgICAgICAgcmVxLmdldFNlc3Npb24oKS5zZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLkVOR0FHRV9TVEFUVVMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlTmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBtb2R1bGUgZW5nYWdlZCB0byB0aGUgb3BlcmF0aW9uIHN1Y2Nlc3NmdWxseSIpOwotICAgICAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGF4aXNGYXVsdCkgewotICAgICAgICAgICAgICAgIHJlcS5nZXRTZXNzaW9uKCkuc2V0QXR0cmlidXRlKENvbnN0YW50cy5FTkdBR0VfU1RBVFVTLCBheGlzRmF1bHQuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJlcS5nZXRTZXNzaW9uKCkuc2V0QXR0cmlidXRlKCJvcGVyYXRpb24iLCBudWxsKTsKLSAgICAgICAgcmVuZGVyVmlldyhFTkdBR0VfVE9fT1BFUkFUSU9OX0pTUF9OQU1FLCByZXEsIHJlcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJvY2Vzc0VuZ2FnZVRvU2VydmljZShIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlcykKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7Ci0gICAgICAgIEhhc2hNYXAgbW9kdWxlcyA9IGNvbmZpZ0NvbnRleHQuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5nZXRNb2R1bGVzKCk7Ci0KLSAgICAgICAgcmVxLmdldFNlc3Npb24oKS5zZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLk1PRFVMRV9NQVAsIG1vZHVsZXMpOwotICAgICAgICBwb3B1bGF0ZVNlc3Npb25JbmZvcm1hdGlvbihyZXEpOwotCi0gICAgICAgIFN0cmluZyBtb2R1bGVOYW1lID0gcmVxLmdldFBhcmFtZXRlcigibW9kdWxlcyIpOwotCi0gICAgICAgIHJlcS5nZXRTZXNzaW9uKCkuc2V0QXR0cmlidXRlKENvbnN0YW50cy5FTkdBR0VfU1RBVFVTLCBudWxsKTsKLSAgICAgICAgcmVxLmdldFNlc3Npb24oKS5zZXRBdHRyaWJ1dGUoIm1vZHVsZXMiLCBudWxsKTsKLQotICAgICAgICBTdHJpbmcgc2VydmljZU5hbWUgPSByZXEuZ2V0UGFyYW1ldGVyKCJheGlzU2VydmljZSIpOwotCi0gICAgICAgIHJlcS5nZXRTZXNzaW9uKCkuc2V0QXR0cmlidXRlKENvbnN0YW50cy5FTkdBR0VfU1RBVFVTLCBudWxsKTsKLQotICAgICAgICBpZiAoKHNlcnZpY2VOYW1lICE9IG51bGwpICYmIChtb2R1bGVOYW1lICE9IG51bGwpKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGNvbmZpZ0NvbnRleHQuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5nZXRTZXJ2aWNlKHNlcnZpY2VOYW1lKS5lbmdhZ2VNb2R1bGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25maWdDb250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCkuZ2V0TW9kdWxlKG1vZHVsZU5hbWUpKTsKLSAgICAgICAgICAgICAgICByZXEuZ2V0U2Vzc2lvbigpLnNldEF0dHJpYnV0ZShDb25zdGFudHMuRU5HQUdFX1NUQVRVUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVOYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIG1vZHVsZSBlbmdhZ2VkIHRvIHRoZSBzZXJ2aWNlIHN1Y2Nlc3NmdWxseSIpOwotICAgICAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGF4aXNGYXVsdCkgewotICAgICAgICAgICAgICAgIHJlcS5nZXRTZXNzaW9uKCkuc2V0QXR0cmlidXRlKENvbnN0YW50cy5FTkdBR0VfU1RBVFVTLCBheGlzRmF1bHQuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJlcS5nZXRTZXNzaW9uKCkuc2V0QXR0cmlidXRlKCJheGlzU2VydmljZSIsIG51bGwpOwotICAgICAgICByZW5kZXJWaWV3KEVOR0FHSU5HX01PRFVMRV9UT19TRVJWSUNFX0pTUF9OQU1FLCByZXEsIHJlcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJvY2Vzc0VuZ2FnZVRvU2VydmljZUdyb3VwKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKLSAgICAgICAgSGFzaE1hcCBtb2R1bGVzID0gY29uZmlnQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpLmdldE1vZHVsZXMoKTsKLQotICAgICAgICByZXEuZ2V0U2Vzc2lvbigpLnNldEF0dHJpYnV0ZShDb25zdGFudHMuTU9EVUxFX01BUCwgbW9kdWxlcyk7Ci0KLSAgICAgICAgSXRlcmF0b3Igc2VydmljZXMgPSBjb25maWdDb250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCkuZ2V0U2VydmljZUdyb3VwcygpOwotCi0gICAgICAgIHJlcS5nZXRTZXNzaW9uKCkuc2V0QXR0cmlidXRlKENvbnN0YW50cy5TRVJWSUNFX0dST1VQX01BUCwgc2VydmljZXMpOwotCi0gICAgICAgIFN0cmluZyBtb2R1bGVOYW1lID0gcmVxLmdldFBhcmFtZXRlcigibW9kdWxlcyIpOwotCi0gICAgICAgIHJlcS5nZXRTZXNzaW9uKCkuc2V0QXR0cmlidXRlKENvbnN0YW50cy5FTkdBR0VfU1RBVFVTLCBudWxsKTsKLSAgICAgICAgcmVxLmdldFNlc3Npb24oKS5zZXRBdHRyaWJ1dGUoIm1vZHVsZXMiLCBudWxsKTsKLQotICAgICAgICBTdHJpbmcgc2VydmljZU5hbWUgPSByZXEuZ2V0UGFyYW1ldGVyKCJheGlzU2VydmljZSIpOwotCi0gICAgICAgIHJlcS5nZXRTZXNzaW9uKCkuc2V0QXR0cmlidXRlKENvbnN0YW50cy5FTkdBR0VfU1RBVFVTLCBudWxsKTsKLQotICAgICAgICBpZiAoKHNlcnZpY2VOYW1lICE9IG51bGwpICYmIChtb2R1bGVOYW1lICE9IG51bGwpKSB7Ci0gICAgICAgICAgICBjb25maWdDb250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCkuZ2V0U2VydmljZUdyb3VwKHNlcnZpY2VOYW1lKS5lbmdhZ2VNb2R1bGUoCi0gICAgICAgICAgICAgICAgICAgIGNvbmZpZ0NvbnRleHQuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5nZXRNb2R1bGUobW9kdWxlTmFtZSkpOwotICAgICAgICAgICAgcmVxLmdldFNlc3Npb24oKS5zZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLkVOR0FHRV9TVEFUVVMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVOYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBtb2R1bGUgZW5nYWdlZCB0byB0aGUgc2VydmljZSBncm91cCBzdWNjZXNzZnVsbHkiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJlcS5nZXRTZXNzaW9uKCkuc2V0QXR0cmlidXRlKCJheGlzU2VydmljZSIsIG51bGwpOwotICAgICAgICByZW5kZXJWaWV3KEVOR0FHSU5HX01PRFVMRV9UT19TRVJWSUNFX0dST1VQX0pTUF9OQU1FLCByZXEsIHJlcyk7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzTG9nb3V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKLSAgICAgICAgcmVxLmdldFNlc3Npb24oKS5pbnZhbGlkYXRlKCk7Ci0gICAgICAgIHJlbmRlclZpZXcoImluZGV4LmpzcCIsIHJlcSwgcmVzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzdmlld1NlcnZpY2VHcm91cENvbmV0eHQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgdHlwZSA9IHJlcS5nZXRQYXJhbWV0ZXIoIlRZUEUiKTsKLSAgICAgICAgU3RyaW5nIHNnSUQgPSByZXEuZ2V0UGFyYW1ldGVyKCJJRCIpOwotICAgICAgICBTZXJ2aWNlR3JvdXBDb250ZXh0IHNnQ29udGV4dCA9IGNvbmZpZ0NvbnRleHQuZ2V0U2VydmljZUdyb3VwQ29udGV4dChzZ0lEKTsKLSAgICAgICAgcmVxLmdldFNlc3Npb24oKS5zZXRBdHRyaWJ1dGUoIlNlcnZpY2VHcm91cENvbnRleHQiLHNnQ29udGV4dCk7Ci0gICAgICAgIHJlcS5nZXRTZXNzaW9uKCkuc2V0QXR0cmlidXRlKCJUWVBFIix0eXBlKTsKLSAgICAgICAgcmVxLmdldFNlc3Npb24oKS5zZXRBdHRyaWJ1dGUoIkNvbmZpZ3VyYXRpb25Db250ZXh0Iixjb25maWdDb250ZXh0KTsKLSAgICAgICAgcmVuZGVyVmlldygidmlld1NlcnZpY2VHcm91cENvbnRleHQuanNwIiwgcmVxLCByZXMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3N2aWV3U2VydmljZUNvbnRleHQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgdHlwZSA9IHJlcS5nZXRQYXJhbWV0ZXIoIlRZUEUiKTsKLSAgICAgICAgU3RyaW5nIHNnSUQgPSByZXEuZ2V0UGFyYW1ldGVyKCJQSUQiKTsKLSAgICAgICAgU3RyaW5nIElEID0gcmVxLmdldFBhcmFtZXRlcigiSUQiKTsKLSAgICAgICAgU2VydmljZUdyb3VwQ29udGV4dCBzZ0NvbnRleHQgPSBjb25maWdDb250ZXh0LmdldFNlcnZpY2VHcm91cENvbnRleHQoc2dJRCk7Ci0gICAgICAgIGlmIChzZ0NvbnRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSA9IHNnQ29udGV4dC5nZXREZXNjcmlwdGlvbigpLmdldFNlcnZpY2UoSUQpOwotICAgICAgICAgICAgU2VydmljZUNvbnRleHQgc2VydmljZUNvbnRleHQgPSBzZ0NvbnRleHQuZ2V0U2VydmljZUNvbnRleHQoc2VydmljZSk7Ci0gICAgICAgICAgICByZXEuc2V0QXR0cmlidXRlKCJTZXJ2aWNlQ29udGV4dCIsc2VydmljZUNvbnRleHQpOwotICAgICAgICAgICAgcmVxLnNldEF0dHJpYnV0ZSgiVFlQRSIsdHlwZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXEuc2V0QXR0cmlidXRlKCJTZXJ2aWNlQ29udGV4dCIsbnVsbCk7Ci0gICAgICAgICAgICByZXEuc2V0QXR0cmlidXRlKCJUWVBFIix0eXBlKTsKLSAgICAgICAgfQotICAgICAgICByZW5kZXJWaWV3KCJ2aWV3U2VydmljZUNvbnRleHQuanNwIiwgcmVxLCByZXMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NTZWxlY3RTZXJ2aWNlUGFyYUVkaXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24gewotICAgICAgICBwb3B1bGF0ZVNlc3Npb25JbmZvcm1hdGlvbihyZXEpOwotICAgICAgICByZXEuZ2V0U2Vzc2lvbigpLnNldEF0dHJpYnV0ZShDb25zdGFudHMuU0VMRUNUX1NFUlZJQ0VfVFlQRSwgIlNFUlZJQ0VfUEFSQU1FVEVSIik7Ci0gICAgICAgIHJlbmRlclZpZXcoU0VMRUNUX1NFUlZJQ0VfSlNQX05BTUUsIHJlcSwgcmVzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzTGlzdE9wZXJhdGlvbihIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlcykKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7Ci0gICAgICAgIHBvcHVsYXRlU2Vzc2lvbkluZm9ybWF0aW9uKHJlcSk7Ci0gICAgICAgIHJlcS5nZXRTZXNzaW9uKCkuc2V0QXR0cmlidXRlKENvbnN0YW50cy5TRUxFQ1RfU0VSVklDRV9UWVBFLCAiTU9EVUxFIik7Ci0KLSAgICAgICAgcmVuZGVyVmlldyhTRUxFQ1RfU0VSVklDRV9KU1BfTkFNRSwgcmVxLCByZXMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NBY3RpdmF0ZVNlcnZpY2UoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24gewotICAgICAgICBpZiAocmVxLmdldFBhcmFtZXRlcigic3VibWl0IikgIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIHNlcnZpY2VOYW1lID0gcmVxLmdldFBhcmFtZXRlcigiYXhpc1NlcnZpY2UiKTsKLSAgICAgICAgICAgIFN0cmluZyB0dXJub24gPSByZXEuZ2V0UGFyYW1ldGVyKCJ0dXJub24iKTsKLSAgICAgICAgICAgIGlmIChzZXJ2aWNlTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHR1cm5vbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbmZpZ0NvbnRleHQuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5zdGFydFNlcnZpY2Uoc2VydmljZU5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwb3B1bGF0ZVNlc3Npb25JbmZvcm1hdGlvbihyZXEpOwotICAgICAgICByZW5kZXJWaWV3KEFDVElWQVRFX1NFUlZJQ0VfSlNQX05BTUUsIHJlcSwgcmVzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzRGVhY3RpdmF0ZVNlcnZpY2UoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24gewotICAgICAgICBpZiAocmVxLmdldFBhcmFtZXRlcigic3VibWl0IikgIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIHNlcnZpY2VOYW1lID0gcmVxLmdldFBhcmFtZXRlcigiYXhpc1NlcnZpY2UiKTsKLSAgICAgICAgICAgIFN0cmluZyB0dXJub2ZmID0gcmVxLmdldFBhcmFtZXRlcigidHVybm9mZiIpOwotICAgICAgICAgICAgaWYgKHNlcnZpY2VOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAodHVybm9mZiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbmZpZ0NvbnRleHQuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5zdG9wU2VydmljZShzZXJ2aWNlTmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBvcHVsYXRlU2Vzc2lvbkluZm9ybWF0aW9uKHJlcSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwb3B1bGF0ZVNlc3Npb25JbmZvcm1hdGlvbihyZXEpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmVuZGVyVmlldyhJTl9BQ1RJVkFURV9TRVJWSUNFX0pTUF9OQU1FLCByZXEsIHJlcyk7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzVmlld0dsb2JhbEhhbmRsZXJzKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKLSAgICAgICAgcmVxLmdldFNlc3Npb24oKS5zZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLkdMT0JBTF9IQU5ETEVSUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpKTsKLQotICAgICAgICByZW5kZXJWaWV3KFZJRVdfR0xPQkFMX0hBTkRMRVJTX0pTUF9OQU1FLCByZXEsIHJlcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJvY2Vzc1ZpZXdTZXJ2aWNlSGFuZGxlcnMoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgc2VydmljZSA9IHJlcS5nZXRQYXJhbWV0ZXIoImF4aXNTZXJ2aWNlIik7Ci0KLSAgICAgICAgaWYgKHNlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgcmVxLmdldFNlc3Npb24oKS5zZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLlNFUlZJQ0VfSEFORExFUlMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWdDb250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCkuZ2V0U2VydmljZShzZXJ2aWNlKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZW5kZXJWaWV3KFZJRVdfU0VSVklDRV9IQU5ETEVSU19KU1BfTkFNRSwgcmVxLCByZXMpOwotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgcHJvY2Vzc0xpc3RQaGFzZXMoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24gewotICAgICAgICBQaGFzZXNJbmZvIGluZm8gPSBjb25maWdDb250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCkuZ2V0UGhhc2VzSW5mbygpOwotICAgICAgICByZXEuZ2V0U2Vzc2lvbigpLnNldEF0dHJpYnV0ZShDb25zdGFudHMuUEhBU0VfTElTVCwgaW5mbyk7Ci0gICAgICAgIHJlbmRlclZpZXcoTElTVF9QSEFTRVNfSlNQX05BTUUsIHJlcSwgcmVzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzTGlzdFNlcnZpY2VHcm91cHMoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24gewotICAgICAgICBJdGVyYXRvciBzZXJ2aWNlR3JvdXBzID0gY29uZmlnQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpLmdldFNlcnZpY2VHcm91cHMoKTsKLSAgICAgICAgcG9wdWxhdGVTZXNzaW9uSW5mb3JtYXRpb24ocmVxKTsKLSAgICAgICAgcmVxLmdldFNlc3Npb24oKS5zZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLlNFUlZJQ0VfR1JPVVBfTUFQLCBzZXJ2aWNlR3JvdXBzKTsKLQotICAgICAgICByZW5kZXJWaWV3KExJU1RfU0VSVklDRV9HUk9VUF9KU1AsIHJlcSwgcmVzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzTGlzdFNlcnZpY2UoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24gewotICAgICAgICBwb3B1bGF0ZVNlc3Npb25JbmZvcm1hdGlvbihyZXEpOwotICAgICAgICByZXEuZ2V0U2Vzc2lvbigpLnNldEF0dHJpYnV0ZShDb25zdGFudHMuRVJST1JfU0VSVklDRV9NQVAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ0NvbnRleHQuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5nZXRGYXVsdHlTZXJ2aWNlcygpKTsKLQotICAgICAgICByZW5kZXJWaWV3KExJU1RfU0VSVklDRVNfSlNQX05BTUUsIHJlcSwgcmVzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzTGlzdFNpbmdsZVNlcnZpY2UoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24gewotICAgICAgICByZXEuZ2V0U2Vzc2lvbigpLnNldEF0dHJpYnV0ZShDb25zdGFudHMuSVNfRkFVTFRZLCAiIik7IC8vQ2xlYXJpbmcgb3V0IGFueSBvbGQgdmFsdWVzLgotICAgICAgICBTdHJpbmcgc2VydmljZU5hbWUgPSByZXEuZ2V0UGFyYW1ldGVyKCJzZXJ2aWNlTmFtZSIpOwotICAgICAgICBpZiAoc2VydmljZU5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSA9IGNvbmZpZ0NvbnRleHQuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5nZXRTZXJ2aWNlKHNlcnZpY2VOYW1lKTsKLSAgICAgICAgICAgIHJlcS5nZXRTZXNzaW9uKCkuc2V0QXR0cmlidXRlKENvbnN0YW50cy5TSU5HTEVfU0VSVklDRSwgc2VydmljZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmVuZGVyVmlldyhMSVNUX1NJTkdMRV9TRVJWSUNFU19KU1BfTkFNRSwgcmVxLCByZXMpOwotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgcHJvY2Vzc0xpc3RDb250ZXh0cyhIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlcykKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJlcS5nZXRTZXNzaW9uKCkuc2V0QXR0cmlidXRlKENvbnN0YW50cy5DT05GSUdfQ09OVEVYVCwgY29uZmlnQ29udGV4dCk7Ci0gICAgICAgIHJlbmRlclZpZXcoIlZpZXdDb250ZXh0cy5qc3AiLCByZXEsIHJlcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJvY2Vzc2dsb2JhbE1vZHVsZXMoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24gewotICAgICAgICBDb2xsZWN0aW9uIG1vZHVsZXMgPSBjb25maWdDb250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCkuZ2V0RW5nYWdlZE1vZHVsZXMoKTsKLQotICAgICAgICByZXEuZ2V0U2Vzc2lvbigpLnNldEF0dHJpYnV0ZShDb25zdGFudHMuTU9EVUxFX01BUCwgbW9kdWxlcyk7Ci0KLSAgICAgICAgcmVuZGVyVmlldyhMSVNUX0dMT0FCTExZX0VOR0FHRURfTU9EVUxFU19KU1BfTkFNRSwgcmVxLCByZXMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NMaXN0TW9kdWxlcyhIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlcykKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7Ci0gICAgICAgIEhhc2hNYXAgbW9kdWxlcyA9IGNvbmZpZ0NvbnRleHQuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5nZXRNb2R1bGVzKCk7Ci0KLSAgICAgICAgcmVxLmdldFNlc3Npb24oKS5zZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLk1PRFVMRV9NQVAsIG1vZHVsZXMpOwotICAgICAgICByZXEuZ2V0U2Vzc2lvbigpLnNldEF0dHJpYnV0ZShDb25zdGFudHMuRVJST1JfTU9EVUxFX01BUCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpLmdldEZhdWx0eU1vZHVsZXMoKSk7Ci0KLSAgICAgICAgcmVuZGVyVmlldyhMSVNUX0FWQUlMQUJMRV9NT0RVTEVTX0pTUF9OQU1FLCByZXEsIHJlcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJvY2Vzc2Rpc2VuZ2FnZU1vZHVsZShIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlcykKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyB0eXBlID0gcmVxLmdldFBhcmFtZXRlcigidHlwZSIpOwotICAgICAgICBTdHJpbmcgc2VydmljZU5hbWUgPSByZXEuZ2V0UGFyYW1ldGVyKCJzZXJ2aWNlTmFtZSIpOwotICAgICAgICBTdHJpbmcgbW9kdWxlTmFtZSA9IHJlcS5nZXRQYXJhbWV0ZXIoIm1vZHVsZSIpOwotICAgICAgICBBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlndXJhdGlvbiA9IGNvbmZpZ0NvbnRleHQuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKTsKLSAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSA9IGF4aXNDb25maWd1cmF0aW9uLmdldFNlcnZpY2Uoc2VydmljZU5hbWUpOwotICAgICAgICBBeGlzTW9kdWxlIG1vZHVsZSA9IGF4aXNDb25maWd1cmF0aW9uLmdldE1vZHVsZShtb2R1bGVOYW1lKTsKLSAgICAgICAgaWYgKHR5cGUuZXF1YWxzKCJvcGVyYXRpb24iKSkgewotICAgICAgICAgICAgaWYgKHNlcnZpY2UuaXNFbmdhZ2VkKG1vZHVsZS5nZXROYW1lKCkpIHx8Ci0gICAgICAgICAgICAgICAgICAgIGF4aXNDb25maWd1cmF0aW9uLmlzRW5nYWdlZChtb2R1bGUuZ2V0TmFtZSgpKSkgewotICAgICAgICAgICAgICAgIHJlcS5nZXRTZXNzaW9uKCkuc2V0QXR0cmlidXRlKCJzdGF0dXMiLCAiQ2FuIG5vdCBkaXNlbmdhZ2UgbW9kdWxlICIgKyBtb2R1bGVOYW1lICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIuIFRoaXMgbW9kdWxlIGlzIGVuZ2FnZWQgYXQgYSBoaWdoZXIgbGV2ZWwuIik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFN0cmluZyBvcE5hbWUgPSByZXEuZ2V0UGFyYW1ldGVyKCJvcGVyYXRpb24iKTsKLSAgICAgICAgICAgICAgICBBeGlzT3BlcmF0aW9uIG9wID0gc2VydmljZS5nZXRPcGVyYXRpb24obmV3IFFOYW1lKG9wTmFtZSkpOwotICAgICAgICAgICAgICAgIG9wLmRpc2VuZ2FnZU1vZHVsZShtb2R1bGUpOwotICAgICAgICAgICAgICAgIHJlcS5nZXRTZXNzaW9uKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRBdHRyaWJ1dGUoInN0YXR1cyIsICJNb2R1bGUgIiArIG1vZHVsZU5hbWUgKyAiIHdhcyBkaXNlbmdhZ2VkIGZyb20gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcGVyYXRpb24gIiArIG9wTmFtZSArICIgaW4gc2VydmljZSAiICsgc2VydmljZU5hbWUgKyAiLiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGF4aXNDb25maWd1cmF0aW9uLmlzRW5nYWdlZChtb2R1bGUuZ2V0TmFtZSgpKSkgewotICAgICAgICAgICAgICAgIHJlcS5nZXRTZXNzaW9uKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRBdHRyaWJ1dGUoInN0YXR1cyIsICJDYW4gbm90IGRpc2VuZ2FnZSBtb2R1bGUgIiArIG1vZHVsZU5hbWUgKyAiLiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoaXMgbW9kdWxlIGlzIGVuZ2FnZWQgYXQgYSBoaWdoZXIgbGV2ZWwuIik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNlcnZpY2UuZGlzZW5nYWdlTW9kdWxlKGF4aXNDb25maWd1cmF0aW9uLmdldE1vZHVsZShtb2R1bGVOYW1lKSk7Ci0gICAgICAgICAgICAgICAgcmVxLmdldFNlc3Npb24oKQotICAgICAgICAgICAgICAgICAgICAgICAgLnNldEF0dHJpYnV0ZSgic3RhdHVzIiwgIk1vZHVsZSAiICsgbW9kdWxlTmFtZSArICIgd2FzIGRpc2VuZ2FnZWQgZnJvbSIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHNlcnZpY2UgIiArIHNlcnZpY2VOYW1lICsgIi4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZW5kZXJWaWV3KCJkaXNlbmdhZ2UuanNwIiwgcmVxLCByZXMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NTZWxlY3RTZXJ2aWNlKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKLSAgICAgICAgcG9wdWxhdGVTZXNzaW9uSW5mb3JtYXRpb24ocmVxKTsKLSAgICAgICAgcmVxLmdldFNlc3Npb24oKS5zZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLlNFTEVDVF9TRVJWSUNFX1RZUEUsICJWSUVXIik7Ci0KLSAgICAgICAgcmVuZGVyVmlldyhTRUxFQ1RfU0VSVklDRV9KU1BfTkFNRSwgcmVxLCByZXMpOwotICAgIH0KLQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGF1dGhvcml6YXRpb25SZXF1aXJlZAotICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVxdWVzdAotICAgICAgICAgICAgICAgICAgICBodHRwU2VydmxldFJlcXVlc3QpIHsKLSAgICAgICAgcmV0dXJuIGh0dHBTZXJ2bGV0UmVxdWVzdC5nZXRTZXNzaW9uKCkuZ2V0QXR0cmlidXRlKENvbnN0YW50cy5MT0dHRUQpID09IG51bGwgJiYKLSAgICAgICAgICAgICAgICAhaHR0cFNlcnZsZXRSZXF1ZXN0LmdldFJlcXVlc3RVUkkoKS5lbmRzV2l0aCgibG9naW4iKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gYXhpc1NlY3VyaXR5RW5hYmxlZAotICAgICAgICAgICAgKCkgewotICAgICAgICBQYXJhbWV0ZXIgcGFyYW1ldGVyID0gY29uZmlnQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpCi0gICAgICAgICAgICAgICAgLmdldFBhcmFtZXRlcihDb25zdGFudHMuQURNSU5fU0VDVVJJVFlfRElTQUJMRUQpOwotICAgICAgICByZXR1cm4gcGFyYW1ldGVyID09IG51bGwgfHwgISJ0cnVlIi5lcXVhbHMocGFyYW1ldGVyLmdldFZhbHVlKCkpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi93ZWJhcHAvQXhpc0FkbWluU2VydmxldC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi93ZWJhcHAvQXhpc0FkbWluU2VydmxldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODdhNmRlLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvd2ViYXBwL0F4aXNBZG1pblNlcnZsZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi53ZWJhcHA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5BeGlzU2VydmxldDsKLQotaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbmZpZzsKLWltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OwotaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OwotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLS8qKgotICoKLSAqLwotcHVibGljIGNsYXNzIEF4aXNBZG1pblNlcnZsZXQgZXh0ZW5kcyBBeGlzU2VydmxldCB7Ci0KLSAgICBwcm90ZWN0ZWQgdHJhbnNpZW50IEFkbWluQWdlbnQgYWdlbnQ7Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb1Bvc3QoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMpCi0gICAgICAgICAgICB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotICAgICAgICBkb0dldChyZXEsIHJlcyk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9HZXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3ApIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXEuZ2V0U2Vzc2lvbigpLnNldEF0dHJpYnV0ZShDb25zdGFudHMuU0VSVklDRV9QQVRILCBjb25maWdDb250ZXh0LmdldFNlcnZpY2VQYXRoKCkpOwotICAgICAgICAgICAgYWdlbnQuaGFuZGxlKHJlcSwgcmVzcCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU2VydmxldEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGluaXQoU2VydmxldENvbmZpZyBjb25maWcpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuaW5pdChjb25maWcpOwotICAgICAgICBTZXJ2bGV0Q29udGV4dCBzZXJ2bGV0Q29udGV4dCA9IGNvbmZpZy5nZXRTZXJ2bGV0Q29udGV4dCgpOwotICAgICAgICB0aGlzLmNvbmZpZ0NvbnRleHQgPQotICAgICAgICAgICAgICAgIChDb25maWd1cmF0aW9uQ29udGV4dCkgc2VydmxldENvbnRleHQuZ2V0QXR0cmlidXRlKENPTkZJR1VSQVRJT05fQ09OVEVYVCk7Ci0gICAgICAgIHNlcnZsZXRDb250ZXh0LnNldEF0dHJpYnV0ZSh0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpLCB0aGlzKTsKLSAgICAgICAgYWdlbnQgPSBuZXcgQWRtaW5BZ2VudChjb25maWdDb250ZXh0KTsKLSAgICAgICAgdGhpcy5zZXJ2bGV0Q29uZmlnID0gY29uZmlnOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGluaXQoKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICh0aGlzLnNlcnZsZXRDb25maWcgIT0gbnVsbCkgewotICAgICAgICAgICAgaW5pdCh0aGlzLnNlcnZsZXRDb25maWcpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvQWN0aXZhdGVTZXJ2aWNlLmpzcCBiL3YxLjUuMVJDMy9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi93ZWJhcHAvYXhpczItd2ViL0FjdGl2YXRlU2VydmljZS5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlYTMwODIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvQWN0aXZhdGVTZXJ2aWNlLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLTwlLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tJT4NCi0NCi08JUAgcGFnZSBpbXBvcnQ9Im9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzLA0KLSAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZSwNCi0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5Db2xsZWN0aW9uLA0KLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkhhc2hNYXAsDQotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuSXRlcmF0b3IiJT4NCi08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sO2NoYXJzZXQ9VVRGLTgiIGxhbmd1YWdlPSJqYXZhIiAlPg0KLTxqc3A6aW5jbHVkZSBwYWdlPSJpbmNsdWRlL2FkbWluaGVhZGVyLmpzcCI+PC9qc3A6aW5jbHVkZT4NCi08aDE+VHVybiBPbiBTZXJ2aWNlPC9oMT4NCi08Zm9ybSBtZXRob2Q9ImdldCIgbmFtZT0ic2VydmljZUFjdGl2YXRlIiBhY3Rpb249ImF4aXMyLWFkbWluL2FjdGl2YXRlU2VydmljZSI+DQotICA8dGFibGUgd2lkdGg9IjEwMCUiICBib3JkZXI9IjAiPg0KLTx0cj4NCi0gIDx0ZCBjb2xzcGFuPSIyIiA+DQotICAgICA8cD5UaGUgc2VydmljZXMgdGhhdCBhcmUgaW5hY3RpdmUgYXJlIGxpc3RlZCBiZWxvdy4gQWx0aG91Z2ggeW91IGNhbiBhY3RpdmF0ZSB0aGUgc2VydmljZXMgZnJvbSB0aGlzIHBhZ2UsIG9uY2Ugc3lzdGVtIGlzIHJlc3RhcnRlZCB0aGUgc2VydmljZXMgd2lsbCBiZSBpbmFjdGl2ZSBhZ2FpbjwvcD4NCi0gIDwvdGQ+DQotICA8L3RyPg0KLSAgPHRyPg0KLSAgPCUNCi1IYXNoTWFwIHNlcnZpY2VzID0gKEhhc2hNYXApcmVxdWVzdC5nZXRTZXNzaW9uKCkuZ2V0QXR0cmlidXRlKENvbnN0YW50cy5TRVJWSUNFX01BUCk7DQotQ29sbGVjdGlvbiBjb2wgPSBzZXJ2aWNlcy52YWx1ZXMoKTsNCi1TdHJpbmcgaHRtbCA9ICIiOw0KLWludCBjb3VudCA9IDA7DQotDQotZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGNvbC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7DQotCUF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlcyA9IChBeGlzU2VydmljZSkgaXRlcmF0b3IubmV4dCgpOw0KLQlpZighYXhpc1NlcnZpY2VzLmlzQWN0aXZlKCkpew0KLQkJY291bnQrKzsNCi0JCWh0bWwgKz0gIjxvcHRpb24gdmFsdWU9JyIgKyBheGlzU2VydmljZXMuZ2V0TmFtZSgpICsgIic+IjsNCi0JCWh0bWwgKz0gYXhpc1NlcnZpY2VzLmdldE5hbWUoKSArICI8L29wdGlvbj4iOw0KLQl9DQotfQ0KLXJlcXVlc3QuZ2V0U2Vzc2lvbigpLnNldEF0dHJpYnV0ZShDb25zdGFudHMuU0VSVklDRV9NQVAsbnVsbCk7DQotaWYgKGNvdW50ID4gMCkgew0KLSU+DQotICANCi0gICAgPHRkIHdpZHRoPSIyMCUiPiBTZWxlY3QgU2VydmljZSA6IDwvdGQ+DQotICAgIDx0ZCB3aWR0aD0iODAlIj4NCi0gICAgICAgPHNlbGVjdCBuYW1lPSJheGlzU2VydmljZSIgY2xhc3M9InNlbGVjdEJveGVzIj4NCi0JCTwlPWh0bWwlPg0KLQkJPC9zZWxlY3Q+DQotICA8L3RyPg0KLSAgPHRyPg0KLSAgICA8dGQgd2lkdGg9IjIwJSI+QWN0aXZhdGUgU2VydmljZSA8L3RkPg0KLSAgICA8dGQgd2lkdGg9IjgwJSI+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJ0dXJub24iPg0KLSAgICA8L3RkPg0KLSAgPC90cj4NCi0gIDx0cj4NCi0gIDx0ZD4mbmJzcDs8L3RkPg0KLSAgPHRkPg0KLSAgICA8aW5wdXQgbmFtZT0ic3VibWl0IiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIgQWN0aXZhdGUgIiA+DQotICAgPGlucHV0IG5hbWU9InJlc2V0IiB0eXBlPSJyZXNldCIgdmFsdWU9IiBDbGVhciAiID4NCi0gIDwvdGQ+DQotPCUNCi19IGVsc2Ugew0KLQklPg0KLQk8dGQgY29sc3Bhbj0iMiI+Tm8gaW5hY3RpdmUgc2VydmljZXMgcHJlc2VudC48L3RkPg0KLQk8JQ0KLX0NCi0lPg0KLSAgPC90cj4NCi0NCi08L3RhYmxlPg0KLTwvZm9ybT4NCi08anNwOmluY2x1ZGUgcGFnZT0iaW5jbHVkZS9hZG1pbmZvb3Rlci5pbmMiPjwvanNwOmluY2x1ZGU+DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvRW5nYWdlVG9TZXJ2aWNlR3JvdXAuanNwIGIvdjEuNS4xUkMzL21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvRW5nYWdlVG9TZXJ2aWNlR3JvdXAuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODc1YjliLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi93ZWJhcHAvYXhpczItd2ViL0VuZ2FnZVRvU2VydmljZUdyb3VwLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi08JS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0lPgotCi08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiIGxhbmd1YWdlPSJqYXZhIiBpbXBvcnQ9Im9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNNb2R1bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2VHcm91cCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS51dGlsLkNvbGxlY3Rpb24iICU+Ci08JUAgcGFnZSBpbXBvcnQ9ImphdmEudXRpbC5IYXNoTWFwIiU+Ci08JUAgcGFnZSBpbXBvcnQ9ImphdmEudXRpbC5JdGVyYXRvciIlPgotPGpzcDppbmNsdWRlIHBhZ2U9ImluY2x1ZGUvYWRtaW5oZWFkZXIuanNwIj48L2pzcDppbmNsdWRlPgotPCUKLSAgICBTdHJpbmcgc3RhdHVzID0gKFN0cmluZylyZXF1ZXN0LmdldFNlc3Npb24oKS5nZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLkVOR0FHRV9TVEFUVVMpOwotICAgIEhhc2hNYXAgbW9kdWVscyA9IChIYXNoTWFwKXJlcXVlc3QuZ2V0U2Vzc2lvbigpLmdldEF0dHJpYnV0ZShDb25zdGFudHMuTU9EVUxFX01BUCk7Ci0gICAgcmVxdWVzdC5nZXRTZXNzaW9uKCkuc2V0QXR0cmlidXRlKENvbnN0YW50cy5NT0RVTEVfTUFQLG51bGwpOwotICAgIENvbGxlY3Rpb24gbW9kdWxlQ29sID0gIG1vZHVlbHMudmFsdWVzKCk7Ci0gICAgSXRlcmF0b3Igc2VydmljZXNHcm91cHMgPSAoSXRlcmF0b3IpcmVxdWVzdC5nZXRTZXNzaW9uKCkuZ2V0QXR0cmlidXRlKENvbnN0YW50cy5TRVJWSUNFX0dST1VQX01BUCk7Ci0gICAgcmVxdWVzdC5nZXRTZXNzaW9uKCkuc2V0QXR0cmlidXRlKENvbnN0YW50cy5TRVJWSUNFX0dST1VQX01BUCxudWxsKTsKLSU+Ci08aDE+RW5nYWdlIE1vZHVsZSBmb3IgYSBTZXJ2aWNlIEdyb3VwPC9oMT4KLTxwPlRvIGVuZ2FnZSBhIG1vZHVsZSBmb3IgYSBzZXQgb2Ygc2VydmljZXMgZ3JvdXBlZCBhcyBhbiBheGlzIHNlcnZpY2UgZ3JvdXAsPC9wPgotCi0gICAgPG9sPgotICAgICAgICA8bGk+c2VsZWN0IHRoZSBtb2R1bGUgeW91IHdhbnQgdG8gZW5nYWdlIDwvbGk+Ci0gICAgICAgIDxsaT5zZWxlY3QgdGhlIGF4aXMgc2VydmljZSBncm91cCB5b3UgbGlrZSB0aGUgbW9kdWxlIHRvIGJlIGVuZ2FnZWQuPC9saT4KLSAgICAgICAgPGxpPmNsaWNrICJFbmdhZ2UiLjwvbGk+Ci0gICAgPC9vbD4KLQotCi08JQotCWlmICghbW9kdWxlQ29sLml0ZXJhdG9yKCkuaGFzTmV4dCgpKSB7JT4KLQkJPHA+Tm8gbW9kdWxlcyBhcmUgcHJlc2VudCB0byBiZSBlbmdhZ2VkLjwvcD4KLQk8JX0gZWxzZSB7Ci0JCWlmICAoIXNlcnZpY2VzR3JvdXBzLmhhc05leHQoKSkgeyU+Ci0JCTxwPk5vIEF4aXMgc2VydmljZSBncm91cHMgYXJlIHByZXNlbnQgdG8gYmUgZW5nYWdlZC48L3A+Ci0JCTwlfSBlbHNlIHsKLSU+Ci08Zm9ybSBtZXRob2Q9ImdldCIgbmFtZT0ic2VsZWN0TW9kdWxlRm9ybSIgYWN0aW9uPSJheGlzMi1hZG1pbi9lbmdhZ2VUb1NlcnZpY2VHcm91cCI+Ci0gICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iMSI+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICAgIDx0ZD5TZWxlY3QgYSBNb2R1bGUgOjwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgICAgICA8c2VsZWN0IG5hbWU9Im1vZHVsZXMiPgotICAgICAgICAgICAgICAgICAgICA8JQotICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBtb2R1bGVDb2wuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgICAgICBBeGlzTW9kdWxlIGF4aXNPcGVyYXRpb24gPSAoQXhpc01vZHVsZSkgaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbW9kdWxlbmFtZSA9IGF4aXNPcGVyYXRpb24uZ2V0TmFtZSgpOwotICAgICAgICAgICAgJT4gPG9wdGlvbiAgYWxpZ249ImxlZnQiIHZhbHVlPSI8JT1tb2R1bGVuYW1lJT4iPjwlPW1vZHVsZW5hbWUlPjwvb3B0aW9uPgotICAgICAgICAgICAgICAgICAgICA8JQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAlPgotICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgICAgPHRyPgotICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICAgICZuYnNwOwotICAgICAgICAgICAgICAgICZuYnNwOwotICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgICAgPHRyPgotICAgICAgICAgICAgPHRkPlNlbGVjdCBhIFNlcnZpY2UgR3JvdXAgOjwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgICAgICA8c2VsZWN0IG5hbWU9ImF4aXNTZXJ2aWNlIj4KLSAgICAgICAgICAgICAgICAgICAgPCUKLQotICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUoc2VydmljZXNHcm91cHMuaGFzTmV4dCgpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBeGlzU2VydmljZUdyb3VwIGF4aXNTZXJ2aWNlR3JvdXAgPSAoQXhpc1NlcnZpY2VHcm91cCkgc2VydmljZXNHcm91cHMubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZXJ2aWNlTmFtZSA9IGF4aXNTZXJ2aWNlR3JvdXAuZ2V0U2VydmljZUdyb3VwTmFtZSgpOwotICAgICAgICAgICAgICAgICAgICAlPiA8b3B0aW9uICBhbGlnbj0ibGVmdCIgdmFsdWU9IjwlPXNlcnZpY2VOYW1lJT4iPjwlPXNlcnZpY2VOYW1lJT48L29wdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPCUKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAlPgotICAgICAgICAgICAgICAgIDwvc2VsZWN0PgotICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgICAgPHRyPgotICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICAgICZuYnNwOwotICAgICAgICAgICAgICAgICZuYnNwOwotICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgICAgPHRyPgotICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPSJzdWJtaXQiIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiBFbmdhZ2UgIiA+Ci0gICAgICAgICAgICA8L3RkPgotICAgICAgICA8L3RyPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgICAgJm5ic3A7Ci0gICAgICAgICAgICAgICAgJm5ic3A7Ci0gICAgICAgICAgICA8L3RkPgotICAgICAgICA8L3RyPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgICAgJm5ic3A7Ci0gICAgICAgICAgICAgICAgJm5ic3A7Ci0gICAgICAgICAgICA8L3RkPgotICAgICAgICA8L3RyPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgICAgPHRleHRhcmVhIGNvbHM9IjUwIiAgPCUKLSAgICAgICAgICAgICAgICAgICAgaWYoc3RhdHVzID09IG51bGwpewotICAgICAgICAgICAgICAgICU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPSJkaXNwbGF5Om5vbmUiCi0gICAgICAgICAgICAgICAgICAgICAgICA8JQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gJT4KLSAgICAgICAgICAgICAgICAgICAgICAgID48JT1zdGF0dXMlPjwvdGV4dGFyZWE+Ci0gICAgICAgICAgICA8L3RkPgotICAgICAgICA8L3RyPgotICAgIDwvdGFibGU+Ci08L2Zvcm0+Ci08JQotCQl9Ci0JfQotJT4KLTxqc3A6aW5jbHVkZSBwYWdlPSJpbmNsdWRlL2FkbWluZm9vdGVyLmluYyI+PC9qc3A6aW5jbHVkZT4KLQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvRXJyb3IvQXV0aEVycm9yLmh0bWwgYi92MS41LjFSQzMvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi9FcnJvci9BdXRoRXJyb3IuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQzOWU0OS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi9FcnJvci9BdXRoRXJyb3IuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTxodG1sPg0KLSA8aGVhZD48dGl0bGU+RXJyb3IgSW4gQWRtaW4gQXBwbGljYXRpb248L3RpdGxlPjwvaGVhZD4NCi0gPGJvZHk+DQotIDx0YWJsZSB3aWR0aD0iMTAwJSI+DQotICA8dHI+DQotICAgIDx0ZCBhbGlnbj0ibGVmdCI+PGltZyBzcmM9Ii4uL2ltYWdlcy9hc2YtbG9nby5naWYiLz48L3RkPg0KLSAgICA8dGQgYWxpZ249InJpZ2h0Ij48aW1nIHNyYz0iLi4vaW1hZ2VzL2F4aXNfbC5qcGciLz48L3RkPg0KLSAgICA8L3RyPg0KLTwvdGFibGU+DQotPHRhYmxlIHdpZHRoPSIxMDAlIj4NCi0gIDx0cj4NCi0gICAgPHRkIGFsaWduPSJjZW50ZXIiPkZhaWx1cmUgaW4gQXV0aGVudGljYXRpb24hIFBsZWFzZSBjaGVjayB5b3VyIHVzZXJuYW1lIGFuZCBwYXNzd29yZDwvdGQ+DQotICANCi0gICAgPC90cj4NCi0gICAgPHRyPiAgPHRkIGFsaWduPSJjZW50ZXIiPjxhIGhyZWY9Ii9heGlzMi9Mb2dpbi5qc3AiPmJhY2s8L2E+PC90ZD48L3RyPg0KLTwvdGFibGU+DQotDQotPGhyLz4NCi08dGFibGUgd2lkdGg9IjEwMCUiPg0KLSA8dHI+DQotICAgPHRkIGFsaWduPSJjZW50ZXIiPkFsbCByaWdodHMgcmVzZXJ2ZWQgYnkgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb248L3RkPg0KLSAgIDwvdHI+DQotPC90YWJsZT4NCi0gPC9ib2R5Pg0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi9FcnJvci9HZW5FcnJvci5odG1sIGIvdjEuNS4xUkMzL21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvRXJyb3IvR2VuRXJyb3IuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBlZTE2YS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi9FcnJvci9HZW5FcnJvci5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPGh0bWw+DQotIDxoZWFkPjx0aXRsZT5FcnJvciBJbiBBZG1pbiBBcHBsaWNhdGlvbjwvdGl0bGU+PC9oZWFkPg0KLSA8Ym9keT4NCi0gPHRhYmxlIHdpZHRoPSIxMDAlIj4NCi0gIDx0cj4NCi0gICAgPHRkIGFsaWduPSJsZWZ0Ij48aW1nIHNyYz0iLi4vaW1hZ2VzL2FzZi1sb2dvLmdpZiIvPjwvdGQ+DQotICAgIDx0ZCBhbGlnbj0icmlnaHQiPjxpbWcgc3JjPSIuLi9pbWFnZXMvYXhpc19sLmpwZyIvPjwvdGQ+DQotICAgIDwvdHI+DQotPC90YWJsZT4NCi08dGFibGUgd2lkdGg9IjEwMCUiPg0KLSAgPHRyPg0KLSAgICA8dGQgYWxpZ249ImNlbnRlciI+U2VydmVyIEVuY291bnRlcmVkIGFuIEVycm9yITwvdGQ+DQotICANCi0gICAgPC90cj4NCi0gICAgPHRyPiAgPHRkIGFsaWduPSJjZW50ZXIiPjxhIGhyZWY9Ii8iPmhvbWU8L2E+PC90ZD48L3RyPg0KLTwvdGFibGU+DQotDQotPGhyLz4NCi08dGFibGUgd2lkdGg9IjEwMCUiPg0KLSA8dHI+DQotICAgPHRkIGFsaWduPSJjZW50ZXIiPkFsbCByaWdodHMgcmVzZXJ2ZWQgYnkgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb248L3RkPg0KLSAgIDwvdHI+DQotPC90YWJsZT4NCi0gPC9ib2R5Pg0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi9FcnJvci9lcnJvcjQwNC5qc3AgYi92MS41LjFSQzMvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi9FcnJvci9lcnJvcjQwNC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmZWU5NDAuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvRXJyb3IvZXJyb3I0MDQuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotPCUtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tJT4KLQotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiIGxhbmd1YWdlPSJqYXZhIiAlPgotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWw+Ci0gIDxoZWFkPgotICAgIDxqc3A6aW5jbHVkZSBwYWdlPSIuLi9pbmNsdWRlL2h0dHBiYXNlLmpzcCIvPgotICAgIDx0aXRsZT5BeGlzMiA6OiBSZXNvdXJjZSBub3QgZm91bmQhPC90aXRsZT4KLSAgICA8bGluayBocmVmPSJheGlzMi13ZWIvY3NzL2F4aXMtc3R5bGUuY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIi8+Ci0gICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSIvPgotICA8L2hlYWQ+Ci0KLSAgPGJvZHk+Ci0gICAgPHRhYmxlIHdpZHRoPSIxMDAlIj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIGFsaWduPSJsZWZ0Ij48aW1nIHNyYz0iYXhpczItd2ViL2ltYWdlcy9hc2YtbG9nby5naWYiIGFsdD0iIi8+PC90ZD4KLSAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+PGltZyBzcmM9ImF4aXMyLXdlYi9pbWFnZXMvYXhpc19sLmpwZyIgYWx0PSIiLz48L3RkPgotICAgICAgPC90cj4KLSAgICA8L3RhYmxlPgotICAgIDx0YWJsZSB3aWR0aD0iMTAwJSI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZD4KLSAgICAgICAgICA8aDE+UmVxdWVzdGVkIHJlc291cmNlIG5vdCBmb3VuZCE8L2gxPgotICAgICAgICAgIDxici8+Ci0gICAgICAgICAgPGJyLz4KLSAgICAgICAgICA8YnIvPgotICAgICAgICAgIDxici8+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPjx0ZCBhbGlnbj0iY2VudGVyIj48YSBocmVmPSJheGlzMi13ZWIvaW5kZXguanNwIj5ob21lPC9hPjwvdGQ+PC90cj4KLSAgICA8L3RhYmxlPgotICAgIDx0YWJsZSB3aWR0aD0iMTAwJSI+Ci0gICAgICA8dHI+PHRkPgotICAgICAgICA8dGFibGUgd2lkdGg9Ijk1MHB4Ij4KLSAgICAgICAgICA8dHI+PHRkPjxociBzaXplPSIxIiBub3NoYWRlPSIiLz48L3RkPjwvdHI+Ci0gICAgICAgICAgPHRyPgotICAgICAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiPkNvcHlyaWdodCAmIzE2OTsgMTk5OS0yMDA2LCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb248YnIvPkxpY2Vuc2VkIHVuZGVyIHRoZSA8YQotICAgICAgICAgICAgICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPkFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMDwvYT4uPC90ZD4KLSAgICAgICAgICA8L3RyPgotICAgICAgICA8L3RhYmxlPgotICAgICAgPC90ZD4KLSAgICAgICAgPHRkPiZuYnNwOzwvdGQ+Ci0gICAgICA8L3RyPgotICAgIDwvdGFibGU+Ci0gIDwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi9FcnJvci9lcnJvcjUwMC5qc3AgYi92MS41LjFSQzMvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi9FcnJvci9lcnJvcjUwMC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkNjQ5NWUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvRXJyb3IvZXJyb3I1MDAuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotPCUtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tJT4KLQotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiIGxhbmd1YWdlPSJqYXZhIiAlPgotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWw+Ci0gIDxoZWFkPgotICAgIDxqc3A6aW5jbHVkZSBwYWdlPSIuLi9pbmNsdWRlL2h0dHBiYXNlLmpzcCIvPgotICAgIDx0aXRsZT5BeGlzMiA6OiBJbnRlcm5hbCBzZXJ2ZXIgZXJyb3I8L3RpdGxlPgotICAgIDxsaW5rIGhyZWY9ImF4aXMyLXdlYi9jc3MvYXhpcy1zdHlsZS5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiLz4KLSAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIi8+Ci0gIDwvaGVhZD4KLQotICA8Ym9keT4KLSAgICA8dGFibGUgd2lkdGg9IjEwMCUiPgotICAgICAgPHRyPgotICAgICAgICA8dGQgYWxpZ249ImxlZnQiPjxpbWcgc3JjPSJheGlzMi13ZWIvaW1hZ2VzL2FzZi1sb2dvLmdpZiIgYWx0PSIiLz48L3RkPgotICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij48aW1nIHNyYz0iYXhpczItd2ViL2ltYWdlcy9heGlzX2wuanBnIiBhbHQ9IiIvPjwvdGQ+Ci0gICAgICA8L3RyPgotICAgIDwvdGFibGU+Ci0gICAgPHRhYmxlIHdpZHRoPSIxMDAlIj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkPgotICAgICAgICAgIDxoMT5JbnRlcm5hbCBzZXJ2ZXIgZXJyb3I8L2gxPgotICAgICAgICAgIDxici8+Ci0gICAgICAgICAgPGJyLz4KLSAgICAgICAgICA8YnIvPgotICAgICAgICAgIDxici8+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPjx0ZCBhbGlnbj0iY2VudGVyIj48YSBocmVmPSJheGlzMi13ZWIvaW5kZXguanNwIj5ob21lPC9hPjwvdGQ+PC90cj4KLSAgICA8L3RhYmxlPgotICAgIDxoci8+Ci0gICAgPHRhYmxlIHdpZHRoPSIxMDAlIj4KLSAgICAgIDx0cj48dGQ+Ci0gICAgICAgIDx0YWJsZSB3aWR0aD0iOTUwcHgiPgotICAgICAgICAgIDx0cj48dGQ+PGhyIHNpemU9IjEiIG5vc2hhZGU9IiIvPjwvdGQ+PC90cj4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGQgYWxpZ249ImNlbnRlciI+Q29weXJpZ2h0ICYjMTY5OyAxOTk5LTIwMDYsIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbjxici8+TGljZW5zZWQgdW5kZXIgdGhlIDxhCi0gICAgICAgICAgICAgIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+QXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wPC9hPi48L3RkPgotICAgICAgICAgIDwvdHI+Ci0gICAgICAgIDwvdGFibGU+Ci0gICAgICA8L3RkPgotICAgICAgICA8dGQ+Jm5ic3A7PC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgPC90YWJsZT4KLSAgPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi93ZWJhcHAvYXhpczItd2ViL0hhcHB5QXhpcy5qc3AgYi92MS41LjFSQzMvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi9IYXBweUF4aXMuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjBkZTQ2Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi93ZWJhcHAvYXhpczItd2ViL0hhcHB5QXhpcy5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw1MDggKzAsMCBAQAotPCUtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tJT4KLQotPGh0bWw+Ci08JUAgcGFnZSBpbXBvcnQ9Im9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0LAotICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50cywKLSAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlLAotICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5PcHRpb25zLAotICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5TZXJ2aWNlQ2xpZW50LAotICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQsCi0gICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnksCi0gICAgICAgICAgICAgICAgIGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlciwKLSAgICAgICAgICAgICAgICAgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgamF2YS5pby5JT0V4Y2VwdGlvbiwKLSAgICAgICAgICAgICAgICAgamF2YS5pby5JbnB1dFN0cmVhbSwKLSAgICAgICAgICAgICAgICAgamF2YS5pby5TdHJpbmdXcml0ZXIsCi0gICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50LAotICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5hbWVzcGFjZSwKLSAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxPdXRwdXRGYWN0b3J5LAotICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiIKLSAgICAgICAgIHNlc3Npb249ImZhbHNlIiAlPgotPGhlYWQ+Ci0gICAgPGpzcDppbmNsdWRlIHBhZ2U9ImluY2x1ZGUvaHR0cGJhc2UuanNwIi8+Ci0gICAgPHRpdGxlPkF4aXMyIEhhcHBpbmVzcyBQYWdlPC90aXRsZT4KLSAgICA8bGluayBocmVmPSJheGlzMi13ZWIvY3NzL2F4aXMtc3R5bGUuY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4KLTwvaGVhZD4KLQotPGJvZHk+Ci08anNwOmluY2x1ZGUgcGFnZT0iaW5jbHVkZS9oZWFkZXIuaW5jIi8+Ci08anNwOmluY2x1ZGUgcGFnZT0iaW5jbHVkZS9saW5rLWZvb3Rlci5qc3AiLz4KLTwlSVAgPSByZXF1ZXN0LmdldFJlcXVlc3RVUkwoKS50b1N0cmluZygpOyU+Ci08JSEKLSAgICAvKgotICAgICogSGFwcGluZXNzIHRlc3RzIGZvciBheGlzMi4gVGhlc2UgbG9vayBhdCB0aGUgY2xhc3NwYXRoIGFuZCB3YXJuIGlmIHRoaW5ncwotICAgICogYXJlIG1pc3NpbmcuIE5vcm1hbGx5IGFkZG5nIHRoaXMgbXVjaCBjb2RlIGluIGEgSlNQIHBhZ2UgaXMgbWFkCi0gICAgKiBidXQgaGVyZSB3ZSB3YW50IHRvIHZhbGlkYXRlIEpTUCBjb21waWxhdGlvbiB0b28sIGFuZCBoYXZlIGEgZHJvcC1pbgotICAgICogcGFnZSBmb3IgZWFzeSByZS11c2UKLSAgICAqLwotICAgIFN0cmluZyBJUDsKLQotICAgIC8qKgotICAgICAqIEdldCBhIHN0cmluZyBwcm92aWRpbmcgaW5zdGFsbCBpbmZvcm1hdGlvbi4KLSAgICAgKiBUT0RPOiBtYWtlIHRoaXMgcGxhdGZvcm0gYXdhcmUgYW5kIGdpdmUgc3BlY2lmaWMgaGludHMKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEluc3RhbGxIaW50cyhIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgewotCi0gICAgICAgIHJldHVybiAiPEI+PEk+Tm90ZTo8L0k+PC9CPiBPbiBUb21jYXQgNC54IGFuZCBKYXZhMS40LCB5b3UgbWF5IG5lZWQgdG8gcHV0IGxpYnJhcmllcyB0aGF0IGNvbnRhaW4gIgotICAgICAgICAgICAgICAgICsgImphdmEuKiBvciBqYXZheC4qIHBhY2thZ2VzIGludG8gQ0FUQUxJTkFfSE9NRS9jb21tb24vbGliIgotICAgICAgICAgICAgICAgICsgIjxicj5qYXhycGMuamFyIGFuZCBzYWFqLmphciBhcmUgdHdvIHN1Y2ggbGlicmFyaWVzLiI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogdGVzdCBmb3IgYSBjbGFzcyBleGlzdGluZwotICAgICAqIEBwYXJhbSBjbGFzc25hbWUKLSAgICAgKiBAcmV0dXJuIGNsYXNzIGlmZiBwcmVzZW50Ci0gICAgICovCi0gICAgQ2xhc3MgY2xhc3NFeGlzdHMoU3RyaW5nIGNsYXNzbmFtZSkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIENsYXNzLmZvck5hbWUoY2xhc3NuYW1lKTsKLSAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIHRlc3QgZm9yIHJlc291cmNlIG9uIHRoZSBjbGFzc3BhdGgKLSAgICAgKiBAcGFyYW0gcmVzb3VyY2UKLSAgICAgKiBAcmV0dXJuIHRydWUgaWZmIHByZXNlbnQKLSAgICAgKi8KLSAgICBib29sZWFuIHJlc291cmNlRXhpc3RzKFN0cmluZyByZXNvdXJjZSkgewotICAgICAgICBib29sZWFuIGZvdW5kOwotICAgICAgICBJbnB1dFN0cmVhbSBpbnN0cmVhbSA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKHJlc291cmNlKTsKLSAgICAgICAgZm91bmQgPSBpbnN0cmVhbSAhPSBudWxsOwotICAgICAgICBpZiAoaW5zdHJlYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpbnN0cmVhbS5jbG9zZSgpOwotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmb3VuZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBwcm9iZSBmb3IgYSBjbGFzcywgcHJpbnQgYW4gZXJyb3IgbWVzc2FnZSBpcyBtaXNzaW5nCi0gICAgICogQHBhcmFtIG91dCBzdHJlYW0gdG8gcHJpbnQgc3R1ZmYKLSAgICAgKiBAcGFyYW0gY2F0ZWdvcnkgdGV4dCBsaWtlICJ3YXJuaW5nIiBvciAiZXJyb3IiCi0gICAgICogQHBhcmFtIGNsYXNzbmFtZSBjbGFzcyB0byBsb29rIGZvcgotICAgICAqIEBwYXJhbSBqYXJGaWxlIHdoZXJlIHRoaXMgY2xhc3MgY29tZXMgZnJvbQotICAgICAqIEBwYXJhbSBlcnJvclRleHQgZXh0cmEgZXJyb3IgdGV4dAotICAgICAqIEBwYXJhbSBob21lUGFnZSB3aGVyZSB0byBkL2wgdGhlIGxpYnJhcnkKLSAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgbWlzc2luZyBjbGFzc2VzCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqLwotICAgIGludCBwcm9iZUNsYXNzKEpzcFdyaXRlciBvdXQsCi0gICAgICAgICAgICAgICAgICAgU3RyaW5nIGNhdGVnb3J5LAotICAgICAgICAgICAgICAgICAgIFN0cmluZyBjbGFzc25hbWUsCi0gICAgICAgICAgICAgICAgICAgU3RyaW5nIGphckZpbGUsCi0gICAgICAgICAgICAgICAgICAgU3RyaW5nIGF4aXNPcGVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgU3RyaW5nIGVycm9yVGV4dCwKLSAgICAgICAgICAgICAgICAgICBTdHJpbmcgaG9tZVBhZ2UpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBDbGFzcyBjbGF6eiA9IGNsYXNzRXhpc3RzKGNsYXNzbmFtZSk7Ci0gICAgICAgICAgICBpZiAoY2xhenogPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFN0cmluZyB1cmwgPSAiIjsKLSAgICAgICAgICAgICAgICBpZiAoaG9tZVBhZ2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB1cmwgPSAiPGJyPiAgU2VlIDxhIGhyZWY9IiArIGhvbWVQYWdlICsgIj4iICsgaG9tZVBhZ2UgKyAiPC9hPiI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG91dC53cml0ZSgiPHA+IiArIGNhdGVnb3J5ICsgIjogY291bGQgbm90IGZpbmQgY2xhc3MgIiArIGNsYXNzbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGZyb20gZmlsZSA8Yj4iICsgamFyRmlsZQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiPC9iPjxicj4gICIgKyBlcnJvclRleHQKLSAgICAgICAgICAgICAgICAgICAgICAgICsgdXJsCi0gICAgICAgICAgICAgICAgICAgICAgICArICI8cD4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGxvY2F0aW9uID0gZ2V0TG9jYXRpb24ob3V0LCBjbGF6eik7Ci0gICAgICAgICAgICAgICAgaWYgKGxvY2F0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlKCJGb3VuZCAiICsgYXhpc09wZXJhdGlvbiArICIgKCIgKyBjbGFzc25hbWUgKyAiKTxici8+Iik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlKCJGb3VuZCAiICsgYXhpc09wZXJhdGlvbiArICIgKCIgKyBjbGFzc25hbWUgKyAiKSA8YnIvPiAmbmJzcDsmbmJzcDthdCAiICsgbG9jYXRpb24gKyAiPGJyLz4iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKE5vQ2xhc3NEZWZGb3VuZEVycm9yIG5jZGZlKSB7Ci0gICAgICAgICAgICBTdHJpbmcgdXJsID0gIiI7Ci0gICAgICAgICAgICBpZiAoaG9tZVBhZ2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHVybCA9ICI8YnI+ICBTZWUgPGEgaHJlZj0iICsgaG9tZVBhZ2UgKyAiPiIgKyBob21lUGFnZSArICI8L2E+IjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG91dC53cml0ZSgiPHA+IiArIGNhdGVnb3J5ICsgIjogY291bGQgbm90IGZpbmQgYSBkZXBlbmRlbmN5IgotICAgICAgICAgICAgICAgICAgICArICIgb2YgY2xhc3MgIiArIGNsYXNzbmFtZQotICAgICAgICAgICAgICAgICAgICArICIgZnJvbSBmaWxlIDxiPiIgKyBqYXJGaWxlCi0gICAgICAgICAgICAgICAgICAgICsgIjwvYj48YnI+ICIgKyBlcnJvclRleHQKLSAgICAgICAgICAgICAgICAgICAgKyB1cmwKLSAgICAgICAgICAgICAgICAgICAgKyAiPGJyPlRoZSByb290IGNhdXNlIHdhczogIiArIG5jZGZlLmdldE1lc3NhZ2UoKQotICAgICAgICAgICAgICAgICAgICArICI8YnI+VGhpcyBjYW4gaGFwcGVuIGUuZy4gaWYgIiArIGNsYXNzbmFtZSArICIgaXMgaW4iCi0gICAgICAgICAgICAgICAgICAgICsgIiB0aGUgJ2NvbW1vbicgY2xhc3NwYXRoLCBidXQgYSBkZXBlbmRlbmN5IGxpa2UgIgotICAgICAgICAgICAgICAgICAgICArICIgYWN0aXZhdGlvbi5qYXIgaXMgb25seSBpbiB0aGUgd2ViYXBwIGNsYXNzcGF0aC4iCi0gICAgICAgICAgICAgICAgICAgICsgIjxwPiIpOwotICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBnZXQgdGhlIGxvY2F0aW9uIG9mIGEgY2xhc3MKLSAgICAgKiBAcGFyYW0gb3V0Ci0gICAgICogQHBhcmFtIGNsYXp6Ci0gICAgICogQHJldHVybiB0aGUgamFyIGZpbGUgb3IgcGF0aCB3aGVyZSBhIGNsYXNzIHdhcyBmb3VuZAotICAgICAqLwotCi0gICAgU3RyaW5nIGdldExvY2F0aW9uKEpzcFdyaXRlciBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgIENsYXNzIGNsYXp6KSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBqYXZhLm5ldC5VUkwgdXJsID0gY2xhenouZ2V0UHJvdGVjdGlvbkRvbWFpbigpLmdldENvZGVTb3VyY2UoKS5nZXRMb2NhdGlvbigpOwotICAgICAgICAgICAgU3RyaW5nIGxvY2F0aW9uID0gdXJsLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICBpZiAobG9jYXRpb24uc3RhcnRzV2l0aCgiamFyIikpIHsKLSAgICAgICAgICAgICAgICB1cmwgPSAoKGphdmEubmV0LkphclVSTENvbm5lY3Rpb24pIHVybC5vcGVuQ29ubmVjdGlvbigpKS5nZXRKYXJGaWxlVVJMKCk7Ci0gICAgICAgICAgICAgICAgbG9jYXRpb24gPSB1cmwudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGxvY2F0aW9uLnN0YXJ0c1dpdGgoImZpbGUiKSkgewotICAgICAgICAgICAgICAgIGphdmEuaW8uRmlsZSBmaWxlID0gbmV3IGphdmEuaW8uRmlsZSh1cmwuZ2V0RmlsZSgpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHVybC50b1N0cmluZygpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgewotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAiYW4gdW5rbm93biBsb2NhdGlvbiI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogYSBjbGFzcyB3ZSBuZWVkIGlmIGEgY2xhc3MgaXMgbWlzc2luZwotICAgICAqIEBwYXJhbSBvdXQgc3RyZWFtIHRvIHByaW50IHN0dWZmCi0gICAgICogQHBhcmFtIGNsYXNzbmFtZSBjbGFzcyB0byBsb29rIGZvcgotICAgICAqIEBwYXJhbSBqYXJGaWxlIHdoZXJlIHRoaXMgY2xhc3MgY29tZXMgZnJvbQotICAgICAqIEBwYXJhbSBlcnJvclRleHQgZXh0cmEgZXJyb3IgdGV4dAotICAgICAqIEBwYXJhbSBob21lUGFnZSB3aGVyZSB0byBkL2wgdGhlIGxpYnJhcnkKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIHdoZW4gbmVlZGVkCi0gICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIG1pc3NpbmcgbGlicmFyaWVzICgwIG9yIDEpCi0gICAgICovCi0gICAgaW50IG5lZWRDbGFzcyhKc3BXcml0ZXIgb3V0LAotICAgICAgICAgICAgICAgICAgU3RyaW5nIGNsYXNzbmFtZSwKLSAgICAgICAgICAgICAgICAgIFN0cmluZyBqYXJGaWxlLAotICAgICAgICAgICAgICAgICAgU3RyaW5nIGF4aXNPcGVyYXRpb24sCi0gICAgICAgICAgICAgICAgICBTdHJpbmcgZXJyb3JUZXh0LAotICAgICAgICAgICAgICAgICAgU3RyaW5nIGhvbWVQYWdlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gcHJvYmVDbGFzcyhvdXQsCi0gICAgICAgICAgICAgICAgIjxiPkVycm9yPC9iPiIsCi0gICAgICAgICAgICAgICAgY2xhc3NuYW1lLAotICAgICAgICAgICAgICAgIGphckZpbGUsCi0gICAgICAgICAgICAgICAgYXhpc09wZXJhdGlvbiwKLSAgICAgICAgICAgICAgICBlcnJvclRleHQsCi0gICAgICAgICAgICAgICAgaG9tZVBhZ2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHByaW50IHdhcm5pbmcgbWVzc2FnZSBpZiBhIGNsYXNzIGlzIG1pc3NpbmcKLSAgICAgKiBAcGFyYW0gb3V0IHN0cmVhbSB0byBwcmludCBzdHVmZgotICAgICAqIEBwYXJhbSBjbGFzc25hbWUgY2xhc3MgdG8gbG9vayBmb3IKLSAgICAgKiBAcGFyYW0gamFyRmlsZSB3aGVyZSB0aGlzIGNsYXNzIGNvbWVzIGZyb20KLSAgICAgKiBAcGFyYW0gZXJyb3JUZXh0IGV4dHJhIGVycm9yIHRleHQKLSAgICAgKiBAcGFyYW0gaG9tZVBhZ2Ugd2hlcmUgdG8gZC9sIHRoZSBsaWJyYXJ5Ci0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiB3aGVuIG5lZWRlZAotICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBtaXNzaW5nIGxpYnJhcmllcyAoMCBvciAxKQotICAgICAqLwotICAgIGludCB3YW50Q2xhc3MoSnNwV3JpdGVyIG91dCwKLSAgICAgICAgICAgICAgICAgIFN0cmluZyBjbGFzc25hbWUsCi0gICAgICAgICAgICAgICAgICBTdHJpbmcgamFyRmlsZSwKLSAgICAgICAgICAgICAgICAgIFN0cmluZyBheGlzT3BlcmF0aW9uLAotICAgICAgICAgICAgICAgICAgU3RyaW5nIGVycm9yVGV4dCwKLSAgICAgICAgICAgICAgICAgIFN0cmluZyBob21lUGFnZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIHByb2JlQ2xhc3Mob3V0LAotICAgICAgICAgICAgICAgICI8Yj5XYXJuaW5nPC9iPiIsCi0gICAgICAgICAgICAgICAgY2xhc3NuYW1lLAotICAgICAgICAgICAgICAgIGphckZpbGUsCi0gICAgICAgICAgICAgICAgYXhpc09wZXJhdGlvbiwKLSAgICAgICAgICAgICAgICBlcnJvclRleHQsCi0gICAgICAgICAgICAgICAgaG9tZVBhZ2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHByb2JlIGZvciBhIHJlc291cmNlIGV4aXN0aW5nLAotICAgICAqIEBwYXJhbSBvdXQKLSAgICAgKiBAcGFyYW0gcmVzb3VyY2UKLSAgICAgKiBAcGFyYW0gZXJyb3JUZXh0Ci0gICAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICAgKi8KLSAgICBpbnQgd2FudFJlc291cmNlKEpzcFdyaXRlciBvdXQsCi0gICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmVzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZXJyb3JUZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFyZXNvdXJjZUV4aXN0cyhyZXNvdXJjZSkpIHsKLSAgICAgICAgICAgIG91dC53cml0ZSgiPHA+PGI+V2FybmluZzwvYj46IGNvdWxkIG5vdCBmaW5kIHJlc291cmNlICIgKyByZXNvdXJjZQotICAgICAgICAgICAgICAgICAgICArICI8YnI+IgotICAgICAgICAgICAgICAgICAgICArIGVycm9yVGV4dCk7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG91dC53cml0ZSgiZm91bmQgIiArIHJlc291cmNlICsgIjxicj4iKTsKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiAgZ2V0IHNlcnZsZXQgdmVyc2lvbiBzdHJpbmcKLSAgICAgKgotICAgICAqLwotCi0gICAgcHVibGljIFN0cmluZyBnZXRTZXJ2bGV0VmVyc2lvbigpIHsKLSAgICAgICAgU2VydmxldENvbnRleHQgY29udGV4dCA9IGdldFNlcnZsZXRDb25maWcoKS5nZXRTZXJ2bGV0Q29udGV4dCgpOwotICAgICAgICBpbnQgbWFqb3IgPSBjb250ZXh0LmdldE1ham9yVmVyc2lvbigpOwotICAgICAgICBpbnQgbWlub3IgPSBjb250ZXh0LmdldE1pbm9yVmVyc2lvbigpOwotICAgICAgICByZXR1cm4gSW50ZWdlci50b1N0cmluZyhtYWpvcikgKyAnLicgKyBJbnRlZ2VyLnRvU3RyaW5nKG1pbm9yKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIHdoYXQgcGFyc2VyIGFyZSB3ZSB1c2luZy4KLSAgICAgKiBAcmV0dXJuIHRoZSBjbGFzc25hbWUgb2YgdGhlIHBhcnNlcgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGdldFBhcnNlck5hbWUoKSB7Ci0gICAgICAgIFNBWFBhcnNlciBzYXhQYXJzZXIgPSBnZXRTQVhQYXJzZXIoKTsKLSAgICAgICAgaWYgKHNheFBhcnNlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gIkNvdWxkIG5vdCBjcmVhdGUgYW4gWE1MIFBhcnNlciI7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjaGVjayB0byB3aGF0IGlzIGluIHRoZSBjbGFzc25hbWUKLSAgICAgICAgcmV0dXJuIHNheFBhcnNlci5nZXRDbGFzcygpLmdldE5hbWUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBKQVhQIFNBWFBhcnNlcgotICAgICAqIEByZXR1cm4gcGFyc2VyIG9yIG51bGwgZm9yIHRyb3VibGUKLSAgICAgKi8KLSAgICBwcml2YXRlIFNBWFBhcnNlciBnZXRTQVhQYXJzZXIoKSB7Ci0gICAgICAgIFNBWFBhcnNlckZhY3Rvcnkgc2F4UGFyc2VyRmFjdG9yeSA9IFNBWFBhcnNlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgaWYgKHNheFBhcnNlckZhY3RvcnkgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgU0FYUGFyc2VyIHNheFBhcnNlciA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzYXhQYXJzZXIgPSBzYXhQYXJzZXJGYWN0b3J5Lm5ld1NBWFBhcnNlcigpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzYXhQYXJzZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogZ2V0IHRoZSBsb2NhdGlvbiBvZiB0aGUgcGFyc2VyCi0gICAgICogQHJldHVybiBwYXRoIG9yIG51bGwgZm9yIHRyb3VibGUgaW4gdHJhY2tpbmcgaXQgZG93bgotICAgICAqLwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0UGFyc2VyTG9jYXRpb24oSnNwV3JpdGVyIG91dCkgewotICAgICAgICBTQVhQYXJzZXIgc2F4UGFyc2VyID0gZ2V0U0FYUGFyc2VyKCk7Ci0gICAgICAgIGlmIChzYXhQYXJzZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGdldExvY2F0aW9uKG91dCwgc2F4UGFyc2VyLmdldENsYXNzKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIHZhbHVlOwotCi0gICAgcHJpdmF0ZSBPTUVsZW1lbnQgY3JlYXRlRW52ZWxvcGUoKSB7Ci0gICAgICAgIE9NRmFjdG9yeSBmYWMgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKTsKLSAgICAgICAgT01OYW1lc3BhY2Ugb21OcyA9IGZhYy5jcmVhdGVPTU5hbWVzcGFjZSgiaHR0cDovL2F4aXN2ZXJzaW9uLnNhbXBsZS94c2QiLCAibnMxIik7Ci0gICAgICAgIE9NRWxlbWVudCBtZXRob2QgPSBmYWMuY3JlYXRlT01FbGVtZW50KCJnZXRWZXJzaW9uIiwgb21Ocyk7Ci0gICAgICAgIE9NRWxlbWVudCB2YWx1ZSA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoIm15VmFsdWUiLCBvbU5zKTsKLSAgICAgICAgbWV0aG9kLmFkZENoaWxkKHZhbHVlKTsKLSAgICAgICAgcmV0dXJuIG1ldGhvZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpbnZva2VUaGVTZXJ2aWNlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gc2luY2UgdGhpcyBvbmUgaXMgYW4gaW50ZXJuYWwgcmVxdWVzdCB3ZSBkbyBub3QgdXNlIHB1YmxpYyBmcm9udGVuZEhvc3RVcmwKLSAgICAgICAgICAgIC8vIGZvciBpdAotICAgICAgICAgICAgaW50IGxhc3RpbmRleCA9IElQLmxhc3RJbmRleE9mKCcvJyk7Ci0gICAgICAgICAgICBJUCA9IElQLnN1YnN0cmluZygwLCBsYXN0aW5kZXgpOwotICAgICAgICAgICAgLy8vYXhpczIvYXhpczItd2ViL3NlcnZpY2VzL3ZlcnNpb24KLSAgICAgICAgICAgIElQID0gSVAucmVwbGFjZUFsbCgiYXhpczItd2ViIiwgIiIpOwotCi0gICAgICAgICAgICBPTUVsZW1lbnQgcGF5bG9hZCA9IGNyZWF0ZUVudmVsb3BlKCk7Ci0gICAgICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdjdHggPQotICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkuY3JlYXRlQ29uZmlndXJhdGlvbkNvbnRleHRGcm9tRmlsZVN5c3RlbShudWxsLCBudWxsKTsKLSAgICAgICAgICAgIFNlcnZpY2VDbGllbnQgY2xpZW50ID0gbmV3IFNlcnZpY2VDbGllbnQoY29uZmlnY3R4LCBudWxsKTsKLSAgICAgICAgICAgIEVuZHBvaW50UmVmZXJlbmNlIHRhcmdldEVQUiA9IG5ldyBFbmRwb2ludFJlZmVyZW5jZShJUCArIGNvbmZpZ2N0eC5nZXRTZXJ2aWNlUGF0aCgpICsgIi9WZXJzaW9uIik7Ci0gICAgICAgICAgICBPcHRpb25zIG9wdGlvbnMgPSBuZXcgT3B0aW9ucygpOwotICAgICAgICAgICAgY2xpZW50LnNldE9wdGlvbnMob3B0aW9ucyk7Ci0gICAgICAgICAgICBvcHRpb25zLnNldFRvKHRhcmdldEVQUik7Ci0gICAgICAgICAgICBvcHRpb25zLnNldFRyYW5zcG9ydEluUHJvdG9jb2woQ29uc3RhbnRzLlRSQU5TUE9SVF9IVFRQKTsKLQotICAgICAgICAgICAgT01FbGVtZW50IHJlc3VsdCA9IGNsaWVudC5zZW5kUmVjZWl2ZShwYXlsb2FkKTsKLSAgICAgICAgICAgIFN0cmluZ1dyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgICAgICAgICByZXN1bHQuc2VyaWFsaXplKFhNTE91dHB1dEZhY3RvcnkubmV3SW5zdGFuY2UoKS5jcmVhdGVYTUxTdHJlYW1Xcml0ZXIod3JpdGVyKSk7Ci0gICAgICAgICAgICB3cml0ZXIuZmx1c2goKTsKLSAgICAgICAgICAgIHZhbHVlID0gd3JpdGVyLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGF4aXNGYXVsdCkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHZhbHVlKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHZhbHVlID0gZS5nZXRNZXNzYWdlKCk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyBnZXRGb3JtYXRlZFN5c3RlbVByb3BlcnR5KFN0cmluZyBzeXN0ZW1Qcm9wZXJ0eSl7Ci0gICAgICAgIGlmIChzeXN0ZW1Qcm9wZXJ0eSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuICIiOwotICAgIAlyZXR1cm4gIHN5c3RlbVByb3BlcnR5LnJlcGxhY2VBbGwoIjoiLCAiOiAiKTsKLSAgICB9Ci0lPgotCi08aDE+QXhpczIgSGFwcGluZXNzIFBhZ2U8L2gxPgotCi08aDI+RXhhbWluaW5nIHdlYmFwcCBjb25maWd1cmF0aW9uPC9oMj4KLQotPGJsb2NrcXVvdGU+Ci0KLTxoND5Fc3NlbnRpYWwgQ29tcG9uZW50czwvaDQ+Ci0KLTwlCi0gICAgaW50IG5lZWRlZCA9IDAsd2FudGVkID0gMDsKLQotICAgIC8qKgotICAgICAqIHRoZSBlc3NlbnRpYWxzLCB3aXRob3V0IHRoZXNlIEF4aXMgaXMgbm90IGdvaW5nIHRvIHdvcmsKLSAgICAgKi8KLSAgICBuZWVkZWQgPSBuZWVkQ2xhc3Mob3V0LCAib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5BeGlzU2VydmxldCIsCi0gICAgICAgICAgICAiYXhpczItMS4wLmphciIsCi0gICAgICAgICAgICAiQXBhY2hlLUF4aXMiLAotICAgICAgICAgICAgIkF4aXMyIHdpbGwgbm90IHdvcmsiLAotICAgICAgICAgICAgImh0dHA6Ly94bWwuYXBhY2hlLm9yZy9heGlzMi8iKTsKLSAgICBuZWVkZWQgKz0gbmVlZENsYXNzKG91dCwgIm9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZyIsCi0gICAgICAgICAgICAiY29tbW9ucy1sb2dnaW5nLmphciIsCi0gICAgICAgICAgICAiSmFrYXJ0YS1Db21tb25zIExvZ2dpbmciLAotICAgICAgICAgICAgIkF4aXMyIHdpbGwgbm90IHdvcmsiLAotICAgICAgICAgICAgImh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvY29tbW9ucy9sb2dnaW5nLmh0bWwiKTsKLSAgICBuZWVkZWQgKz0gbmVlZENsYXNzKG91dCwgImphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIiwKLSAgICAgICAgICAgICJzdGF4LWFwaS0xLjAuMS5qYXIiLAotICAgICAgICAgICAgIlN0cmVhbWluZyBBUEkgZm9yIFhNTCIsCi0gICAgICAgICAgICAiQXhpczIgd2lsbCBub3Qgd29yayIsCi0gICAgICAgICAgICAiaHR0cDovL2Rpc3QuY29kZWhhdXMub3JnL3N0YXgvamFycy8iKTsKLSAgICBuZWVkZWQgKz0gbmVlZENsYXNzKG91dCwgIm9yZy5jb2RlaGF1cy5zdGF4Mi5YTUxTdHJlYW1Xcml0ZXIyIiwKLSAgICAgICAgICAgICJ3c3R4LWFzbC0zLjAuMS5qYXIiLAotICAgICAgICAgICAgIlN0cmVhbWluZyBBUEkgZm9yIFhNTCBpbXBsZW1lbnRhdGlvbiIsCi0gICAgICAgICAgICAiQXhpczIgd2lsbCBub3Qgd29yayIsCi0gICAgICAgICAgICAiaHR0cDovL2Rpc3QuY29kZWhhdXMub3JnL3N0YXgvamFycy8iKTsKLQotJT4KLTwlCi0gICAgLyoKLSAgICAqIHJlc291cmNlcyBvbiB0aGUgY2xhc3NwYXRoIHBhdGgKLSAgICAqLwotICAgIC8qIGJyb2tlbjsgdGhpcyBpcyBhIGZpbGUsIG5vdCBhIHJlc291cmNlCi0gICAgd2FudFJlc291cmNlKG91dCwiL3NlcnZlci1jb25maWcud3NkZCIsCi0gICAgIlRoZXJlIGlzIG5vIHNlcnZlciBjb25maWd1cmF0aW9uIGZpbGU7IgotICAgICsicnVuIEFkbWluQ2xpZW50IHRvIGNyZWF0ZSBvbmUiKTsKLSAgICAqLwotICAgIC8qIGFkZCBtb3JlIGxpYnJhcmllcyBoZXJlICovCi0KLSAgICAvL2lzIGV2ZXJ5dGhpbmcgd2UgbmVlZCBoZXJlCi0gICAgaWYgKG5lZWRlZCA9PSAwKSB7Ci0gICAgICAgIC8veWVzLCBiZSBoYXBweQotICAgICAgICBvdXQud3JpdGUoIjxwPjxmb250IGNvbG9yPSdncmVlbic+PHN0cm9uZz5UaGUgY29yZSBheGlzMiBsaWJyYXJpZXMgYXJlIHByZXNlbnQuPC9zdHJvbmc+PC9mb250PjwvcD4iKTsKLSAgICB9IGVsc2UgewotICAgICAgICAvL25vLCBiZSB2ZXJ5IHVuaGFwcHkKLSAgICAgICAgcmVzcG9uc2Uuc2V0U3RhdHVzKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SKTsKLSAgICAgICAgb3V0LndyaXRlKCI8Zm9udCBjb2xvcj0ncmVkJz48aT4iCi0gICAgICAgICAgICAgICAgKyBuZWVkZWQKLSAgICAgICAgICAgICAgICArICIgY29yZSBheGlzMiBsaWJyYXIiCi0gICAgICAgICAgICAgICAgKyAobmVlZGVkID09IDEgPyAieSBpcyIgOiAiaWVzIGFyZSIpCi0gICAgICAgICAgICAgICAgKyAiIG1pc3Npbmc8L2k+PC9mb250PiIpOwotICAgIH0KLSAgICAvL25vdyBsb29rIGF0IHdhbnRlZCBzdHVmZgotJT4KLTxwPgotICAgIDxCPjxJPk5vdGU6PC9JPjwvQj4gRXZlbiBpZiBldmVyeXRoaW5nIHRoaXMgcGFnZSBwcm9iZXMgZm9yIGlzIHByZXNlbnQsCi0gICAgdGhlcmUgaXMgbm8gZ3VhcmFudGVlIHlvdXIgQXhpcyBTZXJ2aWNlIHdpbGwgd29yaywgYmVjYXVzZSB0aGVyZSBhcmUgbWFueSBjb25maWd1cmF0aW9uIG9wdGlvbnMKLSAgICB0aGF0IHdlIGRvIG5vdCBjaGVjayBmb3IuIFRoZXNlIHRlc3RzIGFyZSA8aT5uZWNlc3Nhcnk8L2k+IGJ1dCBub3QgPGk+c3VmZmljaWVudDwvaT4KLTwvcD4KLTwvYmxvY2txdW90ZT4KLTxoMj5FeGFtaW5pbmcgVmVyc2lvbiBTZXJ2aWNlPC9oMj4KLTwlCi0gICAgYm9vbGVhbiBzZXJ2aWNlU3RhdHVzID0gaW52b2tlVGhlU2VydmljZSgpOwotICAgIGlmIChzZXJ2aWNlU3RhdHVzKSB7Ci0lPgotPGJsb2NrcXVvdGU+Ci0gICAgPGZvbnQgY29sb3I9ImdyZWVuIj48c3Ryb25nPgotICAgICAgICBGb3VuZCBBeGlzMiBkZWZhdWx0IFZlcnNpb24gc2VydmljZSBhbmQgQXhpczIgaXMgd29ya2luZwotICAgICAgICBwcm9wZXJseS48L3N0cm9uZz48L2ZvbnQ+Ci0gICAgPHA+Tm93IHlvdSBjYW4gZHJvcCBhIHNlcnZpY2UgYXJjaGl2ZSBpbiBheGlzMi9XRUItSU5GL3NlcnZpY2VzLgotICAgICAgICBGb2xsb3dpbmcgb3V0cHV0IHdhcyBwcm9kdWNlZCB3aGlsZSBpbnZva2luZyBBeGlzMiB2ZXJzaW9uIHNlcnZpY2UKLSAgICAgICAgPC9wPgotICAgICAgICA8cD48JT0gdmFsdWUlPjwvcD4KLTwvYmxvY2txdW90ZT4KLQotPCUKLX0gZWxzZSB7Ci0lPgotPHA+Ci0gICAgPGZvbnQgY29sb3I9ImJyb3duIj4gVGhlcmUgd2FzIGEgcHJvYmxlbSBpbiBBeGlzMiB2ZXJzaW9uIHNlcnZpY2UgLCBtYXkgYmUKLSAgICAgICAgdGhlIHNlcnZpY2Ugbm90IGF2YWlsYWJsZSBvciBzb21lIHRoaW5nIGhhcyBnb25lIHdyb25nLiBCdXQgdGhpcyBkb2VzCi0gICAgICAgIG5vdCBtZWFuIHN5c3RlbSBpcyBub3Qgd29ya2luZyAhCi0gICAgICAgIFRyeSB0byB1cGxvYWQgc29tZSBvdGhlciBzZXJ2aWNlIGFuZCBjaGVjayB0byBzZWUgd2hldGhlciBpdCBpcwotICAgICAgICB3b3JraW5nLgotICAgICAgICA8YnI+Ci0gICAgPC9mb250PgotPC9wPgotCi08JQotICAgIH0KLSU+Ci08aDI+RXhhbWluaW5nIEFwcGxpY2F0aW9uIFNlcnZlcjwvaDI+Ci08YmxvY2txdW90ZT4KLTx0YWJsZT4KLSAgICA8dHI+PHRkPlNlcnZsZXQgdmVyc2lvbjwvdGQ+PHRkPjwlPWdldFNlcnZsZXRWZXJzaW9uKCklPjwvdGQ+PC90cj4KLSAgICA8dHI+PHRkPlBsYXRmb3JtPC90ZD4KLSAgICAgICAgPHRkPjwlPWdldFNlcnZsZXRDb25maWcoKS5nZXRTZXJ2bGV0Q29udGV4dCgpLmdldFNlcnZlckluZm8oKSU+PC90ZD4KLSAgICA8L3RyPgotPC90YWJsZT4KLTwvYmxvY2txdW90ZT4KLTxoMj5FeGFtaW5pbmcgU3lzdGVtIFByb3BlcnRpZXM8L2gyPgotPCUKLSAgICAvKioKLSAgICAgKiBEdW1wIHRoZSBzeXN0ZW0gcHJvcGVydGllcwotICAgICAqLwotICAgIGphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbnVsbDsKLSAgICB0cnkgewotICAgICAgICBlID0gU3lzdGVtLmdldFByb3BlcnRpZXMoKS5wcm9wZXJ0eU5hbWVzKCk7Ci0gICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gc2UpIHsKLSAgICB9Ci0gICAgaWYgKGUgIT0gbnVsbCkgewotICAgICAgICBvdXQud3JpdGUoIjxwcmU+Iik7Ci0gICAgICAgIG91dC53cml0ZSgiPHRhYmxlIGNlbGxwYWRkaW5nPSc1cHgnIGNlbGxzcGFjaW5nPScwcHgnIHN0eWxlPSdib3JkZXI6IC41cHggYmx1ZSBzb2xpZDsnPiIpOwotICAgICAgICBmb3IgKDsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLSAgICAgICAgICAgIG91dC53cml0ZSgiPHRyPiIpOwotICAgICAgICAgICAgU3RyaW5nIGtleSA9IChTdHJpbmcpIGUubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgIG91dC53cml0ZSgiPHRoIHN0eWxlPSdib3JkZXI6IC41cHggI0EzQkJGRiBzb2xpZDsnPiIgKyBrZXkgKyAiPC90aD4iKTsKLSAgICAgICAgICAgIG91dC53cml0ZSgiPHRkIHN0eWxlPSdib3JkZXI6IC41cHggI0EzQkJGRiBzb2xpZDsnPiIgKyBnZXRGb3JtYXRlZFN5c3RlbVByb3BlcnR5KFN5c3RlbS5nZXRQcm9wZXJ0eShrZXkpKSArICImbmJzcDs8L3RkPiIpOwotICAgICAgICAgICAgb3V0LndyaXRlKCI8dHI+Iik7Ci0gICAgICAgIH0KLSAgICAgICAgb3V0LndyaXRlKCI8L3RhYmxlPiIpOwotICAgICAgICBvdXQud3JpdGUoIjwvcHJlPjxwPiIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dC53cml0ZSgiU3lzdGVtIHByb3BlcnRpZXMgYXJlIG5vdCBhY2Nlc3NpYmxlPHA+Iik7Ci0gICAgfQotJT4KLQotPGpzcDppbmNsdWRlIHBhZ2U9ImluY2x1ZGUvZm9vdGVyLmluYyIvPgotPC9ib2R5PgotPC9odG1sPgotCi0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi93ZWJhcHAvYXhpczItd2ViL0luQWN0aXZhdGVTZXJ2aWNlLmpzcCBiL3YxLjUuMVJDMy9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi93ZWJhcHAvYXhpczItd2ViL0luQWN0aXZhdGVTZXJ2aWNlLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQ0MzBjZC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi9JbkFjdGl2YXRlU2VydmljZS5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi08JS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLSU+DQotDQotPCVAIHBhZ2UgaW1wb3J0PSJvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50cywNCi0gICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2UsDQotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQ29sbGVjdGlvbiwNCi0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5IYXNoTWFwLA0KLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkl0ZXJhdG9yIiU+DQotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDtjaGFyc2V0PVVURi04IiBsYW5ndWFnZT0iamF2YSIgJT4NCi08anNwOmluY2x1ZGUgcGFnZT0iaW5jbHVkZS9hZG1pbmhlYWRlci5qc3AiPjwvanNwOmluY2x1ZGU+DQotPGgxPkRlYWN0aXZhdGUgU2VydmljZTwvaDE+DQotPGZvcm0gbWV0aG9kPSJnZXQiIG5hbWU9InNlcnZpY2VJbkFjdGl2YXRlIiBhY3Rpb249ImF4aXMyLWFkbWluL2RlYWN0aXZhdGVTZXJ2aWNlIj4NCi0gIDx0YWJsZSB3aWR0aD0iMTAwJSIgIGJvcmRlcj0iMCI+DQotPHRyPg0KLSAgPHRkIGNvbHNwYW49IjIiID4NCi0gICAgIDxwPk9ubHkgdGhlIHNlcnZpY2VzIHRoYXQgYXJlIGFjdGl2ZSBhcmUgbGlzdGVkIGJlbG93LiBOb3RlIHRoYXQgYWx0aG91Z2ggeW91IGNhbiBhY3RpdmF0ZSBhIHNlcnZpY2UgZnJvbSB0aGlzIHBhZ2UsIG9uY2Ugc3lzdGVtIGlzIHJlc3RhcnRlZCB0aGUgc2VydmljZSB3aWxsIGJlIGFjdGl2ZSBhZ2FpbjwvcD4NCi0gIDwvdGQ+DQotICA8L3RyPg0KLSAgPHRyPg0KLTwlDQotSGFzaE1hcCBzZXJ2aWNlcyA9IChIYXNoTWFwKXJlcXVlc3QuZ2V0U2Vzc2lvbigpLmdldEF0dHJpYnV0ZShDb25zdGFudHMuU0VSVklDRV9NQVApOw0KLUNvbGxlY3Rpb24gY29sID0gc2VydmljZXMudmFsdWVzKCk7DQotU3RyaW5nIGh0bWwgPSAiIjsNCi1pbnQgY291bnQgPSAwOw0KLQ0KLWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBjb2wuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgew0KLQlBeGlzU2VydmljZSBheGlzU2VydmljZXMgPSAoQXhpc1NlcnZpY2UpIGl0ZXJhdG9yLm5leHQoKTsNCi0JaWYoYXhpc1NlcnZpY2VzLmlzQWN0aXZlKCkpew0KLQkJY291bnQrKzsNCi0JCWh0bWwgKz0gIjxvcHRpb24gdmFsdWU9JyIgKyBheGlzU2VydmljZXMuZ2V0TmFtZSgpICsgIic+IjsNCi0JCWh0bWwgKz0gYXhpc1NlcnZpY2VzLmdldE5hbWUoKSArICI8L29wdGlvbj4iOw0KLQl9DQotfQ0KLXJlcXVlc3QuZ2V0U2Vzc2lvbigpLnNldEF0dHJpYnV0ZShDb25zdGFudHMuU0VSVklDRV9NQVAsbnVsbCk7DQotaWYgKGNvdW50ID4gMCkgew0KLSU+DQotDQotICAgIDx0ZCB3aWR0aD0iMjAlIj4gU2VsZWN0IFNlcnZpY2UgOiA8L3RkPg0KLSAgICA8dGQgd2lkdGg9IjgwJSI+DQotICAgICAgIDxzZWxlY3QgbmFtZT0iYXhpc1NlcnZpY2UiIGNsYXNzPSJzZWxlY3RCb3hlcyI+DQotPCU9aHRtbCU+DQotCQk8L3NlbGVjdD4NCi0JPC90ZD4NCi0gIDwvdHI+DQotICA8dHI+DQotICAgIDx0ZCB3aWR0aD0iMjAlIj5EZWFjdGl2YXRlIFNlcnZpY2UgPC90ZD4NCi0gICAgPHRkIHdpZHRoPSI4MCUiPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0idHVybm9mZiI+DQotICAgIDwvdGQ+DQotICA8L3RyPg0KLSAgPHRyPg0KLSAgPHRkPiZuYnNwOzwvdGQ+DQotICA8dGQ+DQotICAgIDxpbnB1dCBuYW1lPSJzdWJtaXQiIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiBEZWFjdGl2YXRlICIgPg0KLSAgIDxpbnB1dCBuYW1lPSJyZXNldCIgdHlwZT0icmVzZXQiIHZhbHVlPSIgQ2xlYXIgIiA+DQotICA8L3RkPg0KLTwlDQotfSBlbHNlIHsNCi0JJT4NCi0JPHRkIGNvbHNwYW49IjIiPk5vIGFjdGl2ZSBzZXJ2aWNlcyBwcmVzZW50LjwvdGQ+DQotCTwlDQotfQ0KLSU+DQotICA8L3RyPg0KLQ0KLTwvdGFibGU+DQotPC9mb3JtPg0KLTxqc3A6aW5jbHVkZSBwYWdlPSJpbmNsdWRlL2FkbWluZm9vdGVyLmluYyI+PC9qc3A6aW5jbHVkZT4NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi9MZWZ0RnJhbWUuanNwIGIvdjEuNS4xUkMzL21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvTGVmdEZyYW1lLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWE0MzIxZS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi9MZWZ0RnJhbWUuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMjA0ICswLDAgQEAKLTwlLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tJT4NCi0NCi08JUAgcGFnZSBpbXBvcnQ9Im9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzIiAlPg0KLTwlQCBwYWdlIGltcG9ydD0ib3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0IiAlPg0KLTwlQCBwYWdlIGltcG9ydD0ib3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LlNlcnZpY2VDb250ZXh0IiAlPg0KLTwlQCBwYWdlIGltcG9ydD0ib3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LlNlcnZpY2VHcm91cENvbnRleHQiICU+DQotPCVAIHBhZ2UgaW1wb3J0PSJvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQudXRpbC5QaGFzZXNJbmZvIiAlPg0KLTwlQCBwYWdlIGltcG9ydD0ib3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzTW9kdWxlIiAlPg0KLTwlQCBwYWdlIGltcG9ydD0ib3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uIiAlPg0KLTwlQCBwYWdlIGltcG9ydD0ib3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZSIgJT4NCi08JUAgcGFnZSBpbXBvcnQ9Im9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2VHcm91cCIgJT4NCi08JUAgcGFnZSBpbXBvcnQ9Im9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVyIiAlPg0KLTwlQCBwYWdlIGltcG9ydD0ib3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0NvbmZpZ3VyYXRpb24iICU+DQotPCVAIHBhZ2UgaW1wb3J0PSJvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5IYW5kbGVyIiAlPg0KLTwlQCBwYWdlIGltcG9ydD0ib3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuUGhhc2UiICU+DQotPCVAIHBhZ2UgaW1wb3J0PSJvcmcuYXBhY2hlLmF4aXMyLnV0aWwuSmF2YVV0aWxzIiAlPg0KLTwlQCBwYWdlIGltcG9ydD0iamF2YS51dGlsLkFycmF5TGlzdCIgJT4NCi08JUAgcGFnZSBpbXBvcnQ9ImphdmEudXRpbC5Db2xsZWN0aW9uIiAlPg0KLTwlQCBwYWdlIGltcG9ydD0iamF2YS51dGlsLkVudW1lcmF0aW9uIiAlPg0KLTwlQCBwYWdlIGltcG9ydD0iamF2YS51dGlsLkhhc2hNYXAiICU+DQotPCVAIHBhZ2UgaW1wb3J0PSJqYXZhLnV0aWwuSGFzaHRhYmxlIiAlPg0KLTwlQCBwYWdlIGltcG9ydD0iamF2YS51dGlsLkl0ZXJhdG9yIiAlPg0KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7Y2hhcnNldD1VVEYtOCIgbGFuZ3VhZ2U9ImphdmEiICU+DQotPHRhYmxlIHdpZHRoPSIxMDAlIiBzdHlsZT0iYm9yZGVyLXJpZ2h0OjFweCBzb2xpZCAjQ0NDQ0NDOyI+DQotICAgIDx0cj4NCi0gICAgIDx0ZCBjb2xzcGFuPSIyIiA+DQotICAgICAgIDxiPlRvb2xzIDwvYj4NCi0gICAgIDwvdGQ+DQotICAgIDwvdHI+DQotICAgIDx0cj4NCi0gICAgICAgPHRkPg0KLSAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsNCi0gICAgICAgPC90ZD4NCi0gICAgICAgPHRkPg0KLSAgICAgICAgIDxhIGhyZWY9ImF4aXMyLWFkbWluL3VwbG9hZCI+VXBsb2FkIFNlcnZpY2U8L2E+DQotICAgICAgIDwvdGQ+DQotICAgIDwvdHI+DQotPHRyPg0KLSAgICAgPHRkIGNvbHNwYW49IjIiID4NCi0gICAgICA8Yj48bm9icj5TeXN0ZW0gQ29tcG9uZW50cyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvbm9icj48L2I+DQotICAgICA8L3RkPg0KLSAgPC90cj4NCi0gIDx0cj4NCi0gICAgPHRkPg0KLSAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsNCi0gICAgPC90ZD4NCi0gICAgPHRkID4NCi0gICAgICA8YSBocmVmPSJheGlzMi1hZG1pbi9saXN0U2VydmljZSI+QXZhaWxhYmxlIFNlcnZpY2VzPC9hPg0KLSAgICA8L3RkPg0KLSA8L3RyPg0KLSA8dHI+DQotICAgIDx0ZD4NCi0gICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7DQotICAgIDwvdGQ+DQotICAgIDx0ZCA+DQotICAgICAgPGEgaHJlZj0iYXhpczItYWRtaW4vbGlzdFNlcnZpY2VHcm91cHMiPkF2YWlsYWJsZSBTZXJ2aWNlIEdyb3VwczwvYT4NCi0gICAgPC90ZD4NCi0gPC90cj4NCi0gPHRyPg0KLSAgICA8dGQ+DQotICAgICAgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOw0KLSAgICA8L3RkPg0KLSAgICA8dGQgPg0KLSAgICAgIDxhIGhyZWY9ImF4aXMyLWFkbWluL2xpc3RNb2R1bGVzIj5BdmFpbGFibGUgTW9kdWxlczwvYT4NCi0gICAgPC90ZD4NCi0gPC90cj4NCi0gPHRyPg0KLSAgICA8dGQ+DQotICAgICAgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOw0KLSAgICA8L3RkPg0KLSAgICA8dGQ+DQotICAgICAgPGEgaHJlZj0iYXhpczItYWRtaW4vZ2xvYmFsTW9kdWxlcyI+R2xvYmFsbHkgRW5nYWdlZCBNb2R1bGVzPC9hPg0KLSAgICA8L3RkPg0KLSA8L3RyPg0KLSA8dHI+DQotICAgIDx0ZD4NCi0gICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7DQotICAgIDwvdGQ+DQotICAgIDx0ZCA+DQotICAgICAgPGEgaHJlZj0iYXhpczItYWRtaW4vbGlzdFBoYXNlcyI+QXZhaWxhYmxlIFBoYXNlczwvYT4NCi0gICAgPC90ZD4NCi0gPC90cj4NCi0gIDx0cj4NCi0gICAgIDx0ZCBjb2xzcGFuPSIyIiA+DQotICAgICAgIDxiPkV4ZWN1dGlvbiBDaGFpbnM8L2I+DQotICAgICA8L3RkPg0KLSAgPC90cj4NCi0gICA8dHI+DQotICAgICAgIDx0ZD4NCi0gICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7DQotICAgICAgIDwvdGQ+DQotICAgICAgIDx0ZD4NCi0gICAgICAgICA8YSBocmVmPSJheGlzMi1hZG1pbi92aWV3R2xvYmFsSGFuZGxlcnMiPkdsb2JhbCBDaGFpbnM8L2E+DQotICAgICAgIDwvdGQ+DQotICAgIDwvdHI+DQotICAgIDx0cj4NCi0gICAgICAgPHRkPg0KLSAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsNCi0gICAgICAgPC90ZD4NCi0gICAgICAgPHRkPg0KLSAgICAgICAgIDxhIGhyZWY9ImF4aXMyLWFkbWluL3NlbGVjdFNlcnZpY2UiPk9wZXJhdGlvbiBTcGVjaWZpYyBDaGFpbnM8L2E+DQotICAgICAgIDwvdGQ+DQotICAgIDwvdHI+DQotICAgIDx0cj4NCi0gICAgIDx0ZCBjb2xzcGFuPSIyIiA+DQotICAgICAgIDxiPkVuZ2FnZSBNb2R1bGU8L2I+DQotICAgICA8L3RkPg0KLSAgPC90cj4NCi0gICA8dHI+DQotICAgICAgIDx0ZD4NCi0gICAgICAgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOw0KLSAgICAgICA8L3RkPg0KLSAgICAgICA8dGQ+DQotICAgICAgICAgPGEgaHJlZj0iYXhpczItYWRtaW4vZW5nYWdpbmdnbG9iYWxseSI+Rm9yIGFsbCBTZXJ2aWNlczwvYT4NCi0gICAgICAgPC90ZD4NCi0gICAgPC90cj4NCi0gICAgIDx0cj4NCi0gICAgICAgIDx0ZD4NCi0gICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsNCi0gICAgICAgIDwvdGQ+DQotICAgICAgICA8dGQ+DQotICAgICAgICAgIDxhIGhyZWY9ImF4aXMyLWFkbWluL2VuZ2FnZVRvU2VydmljZUdyb3VwIj5Gb3IgYSBTZXJ2aWNlIEdyb3VwPC9hPg0KLSAgICAgICAgPC90ZD4NCi0gICAgIDwvdHI+DQotDQotDQotICAgIDx0cj4NCi0gICAgICAgPHRkPg0KLSAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsNCi0gICAgICAgPC90ZD4NCi0gICAgICAgPHRkPg0KLSAgICAgICAgIDxhIGhyZWY9ImF4aXMyLWFkbWluL2VuZ2FnZVRvU2VydmljZSI+Rm9yIGEgU2VydmljZTwvYT4NCi0gICAgICAgPC90ZD4NCi0gICAgPC90cj4NCi0NCi0gICAgIDx0cj4NCi0gICAgICAgPHRkPg0KLSAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsNCi0gICAgICAgPC90ZD4NCi0gICAgICAgPHRkPg0KLSAgICAgICAgIDxhIGhyZWY9ImF4aXMyLWFkbWluL2xpc3RPcGVyYXRpb24iPkZvciBhbiBPcGVyYXRpb248L2E+DQotICAgICAgIDwvdGQ+DQotICAgIDwvdHI+DQotDQotICAgIDx0cj4NCi0gICAgIDx0ZCBjb2xzcGFuPSIyIiA+DQotICAgICAgIDxiPlNlcnZpY2VzPC9iPg0KLSAgICAgPC90ZD4NCi0gIDwvdHI+DQotICAgIDx0cj4NCi0gICAgICAgPHRkPg0KLSAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsNCi0gICAgICAgPC90ZD4NCi0gICAgICAgPHRkPg0KLSAgICAgICAgIDxhIGhyZWY9ImF4aXMyLWFkbWluL2RlYWN0aXZhdGVTZXJ2aWNlIj5EZWFjdGl2YXRlIFNlcnZpY2U8L2E+DQotICAgICAgIDwvdGQ+DQotICAgIDwvdHI+DQotICAgIDx0cj4NCi0gICAgICAgPHRkPg0KLSAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsNCi0gICAgICAgPC90ZD4NCi0gICAgICAgPHRkPg0KLSAgICAgICAgIDxhIGhyZWY9ImF4aXMyLWFkbWluL2FjdGl2YXRlU2VydmljZSI+QWN0aXZhdGUgU2VydmljZTwvYT4NCi0gICAgICAgPC90ZD4NCi0gICAgPC90cj4NCi0gICAgPHRyPg0KLSAgICAgICA8dGQ+DQotICAgICAgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOw0KLSAgICAgICA8L3RkPg0KLSAgICAgICA8dGQ+DQotICAgICAgICAgPGEgaHJlZj0iYXhpczItYWRtaW4vc2VsZWN0U2VydmljZVBhcmFFZGl0Ij5FZGl0IFBhcmFtZXRlcnM8L2E+DQotICAgICAgIDwvdGQ+DQotICAgIDwvdHI+DQotICAgIDx0cj4NCi0gICAgIDx0ZCBjb2xzcGFuPSIyIiA+DQotICAgICAgIDxiPkNvbnRleHRzPC9iPg0KLSAgICAgPC90ZD4NCi0gICAgPC90cj4NCi0gICAgPHRyPg0KLSAgICAgICA8dGQ+DQotICAgICAgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOw0KLSAgICAgICA8L3RkPg0KLSAgICAgICA8dGQ+DQotICAgICAgICAgPGEgaHJlZj0iYXhpczItYWRtaW4vbGlzdENvbnRleHRzIj5WaWV3IEhpZXJhcmNoeTwvYT4NCi0gICAgICAgPC90ZD4NCi0gICAgPC90cj4NCi08L3RhYmxlPg0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi93ZWJhcHAvYXhpczItd2ViL0xpc3RTZXJ2aWNlR3JvdXAuanNwIGIvdjEuNS4xUkMzL21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvTGlzdFNlcnZpY2VHcm91cC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhN2IzZGUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvTGlzdFNlcnZpY2VHcm91cC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi08JS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0lPgotCi08JUAgcGFnZSBpbXBvcnQ9Im9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzIiAlPgotPCVAIHBhZ2UgaW1wb3J0PSJvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNNb2R1bGUiICU+Ci08JUAgcGFnZSBpbXBvcnQ9Im9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2UiICU+Ci08JUAgcGFnZSBpbXBvcnQ9Im9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2VHcm91cCIgJT4KLTwlQCBwYWdlIGltcG9ydD0iamF2YS51dGlsLkNvbGxlY3Rpb24iICU+Ci08JUAgcGFnZSBpbXBvcnQ9ImphdmEudXRpbC5JdGVyYXRvciIgJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7Y2hhcnNldD1VVEYtOCIgbGFuZ3VhZ2U9ImphdmEiICU+Ci08anNwOmluY2x1ZGUgcGFnZT0iaW5jbHVkZS9hZG1pbmhlYWRlci5qc3AiLz4KLTxoMT5BdmFpbGFibGUgU2VydmljZSBHcm91cHM8L2gxPgotPCUKLSAgICBJdGVyYXRvciBheGlzU2VydmljZUdyb3VwSXRlciA9IChJdGVyYXRvcikgcmVxdWVzdC5nZXRTZXNzaW9uKCkuZ2V0QXR0cmlidXRlKAotICAgICAgICAgICAgQ29uc3RhbnRzLlNFUlZJQ0VfR1JPVVBfTUFQKTsKLSAgICByZXF1ZXN0LmdldFNlc3Npb24oKS5zZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLlNFUlZJQ0VfR1JPVVBfTUFQLG51bGwpOwotICAgIHdoaWxlIChheGlzU2VydmljZUdyb3VwSXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgQXhpc1NlcnZpY2VHcm91cCBheGlzU2VydmljZUdyb3VwID0gKEF4aXNTZXJ2aWNlR3JvdXApIGF4aXNTZXJ2aWNlR3JvdXBJdGVyLm5leHQoKTsKLSAgICAgICAgU3RyaW5nIGdyb3VwTmFtZSA9IGF4aXNTZXJ2aWNlR3JvdXAuZ2V0U2VydmljZUdyb3VwTmFtZSgpOwotICAgICAgICBDb2xsZWN0aW9uIG1vZHVsZXMgPSBheGlzU2VydmljZUdyb3VwLmdldEVuZ2FnZWRNb2R1bGVzKCk7Ci0gICAgICAgIEl0ZXJhdG9yIGF4aXNTZXJ2aWNlSXRlciA9IGF4aXNTZXJ2aWNlR3JvdXAuZ2V0U2VydmljZXMoKTsKLSU+Ci08aDI+PCU9Z3JvdXBOYW1lJT48L2gyPjx1bD4KLSAgICA8JQotICAgICAgICB3aGlsZSAoYXhpc1NlcnZpY2VJdGVyLmhhc05leHQoKSl7Ci0gICAgICAgICAgICBBeGlzU2VydmljZSBheGlzU2VydmljZSA9IChBeGlzU2VydmljZSkgYXhpc1NlcnZpY2VJdGVyLm5leHQoKTsKLSAgICAgICAgICAgIFN0cmluZyBzZXJ2aWNlTmFtZSA9IGF4aXNTZXJ2aWNlLmdldE5hbWUoKTsKLSAgICAlPgotICAgIDxsaT48Zm9udCBjb2xvcj0iYmx1ZSI+PGEgaHJlZj0iYXhpczItYWRtaW4vTGlzdFNpbmdsZVNlcnZpY2U/c2VydmljZU5hbWU9PCU9c2VydmljZU5hbWUlPiI+Ci0gICAgICAgIDwlPXNlcnZpY2VOYW1lJT48L2E+PC9mb250PjwvbGk+Ci0gICAgPCUKLSAgICAgICAgfQotICAgICU+Ci08L3VsPgotPCUKLSAgICBpZiAobW9kdWxlcy5zaXplKCkgPiAwKSB7Ci0lPgotPEk+RW5nYWdlZCBtb2R1bGVzPC9JPjx1bD4KLSAgICA8JQotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbW9kdWxlcy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBBeGlzTW9kdWxlIGF4aXNPcGVyYXRpb24gPSAoQXhpc01vZHVsZSkgaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgU3RyaW5nIG1vZHVsRGVzYyA9IGF4aXNPcGVyYXRpb24uZ2V0TmFtZSgpOwotICAgICU+Ci0gICAgPGxpPjwlPW1vZHVsRGVzYyU+PC9saT4KLSAgICA8JQotICAgICAgICB9Ci0gICAgJT48L3VsPjwlCi0gICAgICAgIH0KLSAgICB9Ci0lPgotPGpzcDppbmNsdWRlIHBhZ2U9ImluY2x1ZGUvYWRtaW5mb290ZXIuaW5jIi8+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi9Mb2dpbi5qc3AgYi92MS41LjFSQzMvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi9Mb2dpbi5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiNmNhZmMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvTG9naW4uanNwCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotPCUtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tJT4KLQotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDtjaGFyc2V0PVVURi04IiBsYW5ndWFnZT0iamF2YSIgJT4KLTxodG1sPgotICA8aGVhZD4KLSAgICA8anNwOmluY2x1ZGUgcGFnZT0iaW5jbHVkZS9odHRwYmFzZS5qc3AiLz4KLSAgICA8dGl0bGU+TG9naW4gdG8gQXhpczIgOjogQWRtaW5pc3RyYXRpb24gcGFnZTwvdGl0bGU+Ci0gICAgPGxpbmsgaHJlZj0iYXhpczItd2ViL2Nzcy9heGlzLXN0eWxlLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+Ci0gIDwvaGVhZD4KLQotICA8Ym9keSBvbmxvYWQ9ImphdmFzY3JpcHQ6ZG9jdW1lbnQuTG9naW5Gb3JtLnVzZXJOYW1lLmZvY3VzKCk7Ij4KLSAgICA8anNwOmluY2x1ZGUgcGFnZT0iaW5jbHVkZS9oZWFkZXIuaW5jIi8+Ci0gICAgPGpzcDppbmNsdWRlIHBhZ2U9ImluY2x1ZGUvbGluay1mb290ZXIuanNwIi8+Ci0gICAgPHRhYmxlIGNsYXNzPSJGVUxMX0JMQU5LIj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgCTxoMj5XZWxjb21lIDo8L2gyPgotICAgICAgICAJPHA+V2VsY29tZSB0byB0aGUgQXhpczIgYWRtaW5pc3RyYXRpb24gY29uc29sZS4gRnJvbSBpbnNpZGUgdGhlIEF4aXMyIGFkbWluaXN0cmF0aW9uIGNvbnNvbGUgeW91IGNhbiA6PC9wPgotCSAgICAJPHVsIHN0eWxlPSJsaXN0LXN0eWxlOiBub25lOyIgY2xhc3M9ImxvZ2luVUwiPgotCSAgICAgICAJCTxsaT5DaGVjayBvbiB0aGUgaGVhbHRoIG9mIHlvdXIgQXhpczIgZGVwbG95bWVudC48L2xpPgotIAkgICAgICAgCQk8bGk+Q2hhbmdlIGFueSBwYXJhbWV0ZXJzIGF0IHJ1biB0aW1lLjwvbGk+Ci0gCSAgICAgICAJCTxsaT5VcGxvYWQgbmV3IHNlcnZpY2VzIGludG8gQXhpczIgW1NlcnZpY2UgaG90LWRlcGxveW1lbnRdLjwvbGk+Ci0gCSAgIAkJPC91bD4KLQkgICAgICAgIDxmb250IGNvbG9yPSJvcmFuZ2UiPldhcm5pbmc6IFBsZWFzZSBub3RlIHRoYXQgY29uZmlndXJhdGlvbiBjaGFuZ2VzIGRvbmUgdGhyb3VnaCB0aGUgYWRtaW5pc3RyYXRpb24gY29uc29sZQotICAgIAkgICAgd2lsbCBiZSBsb3N0IHdoZW4gdGhlIHNlcnZlciBpcyByZXN0YXJ0ZWQuPC9mb250PgotICAgIAk8L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KLSAgICAgICAgICA8Zm9ybSBtZXRob2Q9InBvc3QiIG5hbWU9IkxvZ2luRm9ybSIgYWN0aW9uPSJheGlzMi1hZG1pbi9sb2dpbiI+Ci0gICAgICAgICAgICA8dGFibGUgY2xhc3M9IkxPR19JTl9GT1JNIj4KLSAgICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiBjb2xzcGFuPSIyIiBiZ2NvbG9yPSIjYjBiMGIwIiBjb2xvcj0iI0ZGRkZGRiI+PGZvbnQgY29sb3I9IiNGRkZGRkYiPkxvZ2luPC9mb250PjwvdGQ+Ci0gICAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIGNvbHNwYW49IjIiPiZuYnNwOzwvdGQ+Ci0gICAgICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+VXNlcm5hbWU6PC90ZD4KLSAgICAgICAgICAgICAgICA8dGQ+PGlucHV0IGFsaWduPSJsZWZ0IiB0eXBlPSJ0ZXh0IiBuYW1lPSJ1c2VyTmFtZSIgdGFiaW5kZXg9IjEiPgotICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij5QYXNzd29yZCA6IDwvdGQ+Ci0gICAgICAgICAgICAgICAgPHRkPjxpbnB1dCBhbGlnbj0ibGVmdCIgdHlwZT0icGFzc3dvcmQiIG5hbWU9InBhc3N3b3JkIiB0YWJpbmRleD0iMiI+Ci0gICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj4KLSAgICAgICAgICAgICAgICAgIDxicj4KLSAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIGNvbHNwYW49IjIiPgotICAgICAgICAgICAgICAgICAgPGlucHV0IG5hbWU9ImNhbmNlbCIgdHlwZT0icmVzZXQiIHZhbHVlPSIgQ2xlYXIgIj4gJm5ic3A7ICZuYnNwOwotICAgICAgICAgICAgICAgICAgPGlucHV0IG5hbWU9InN1Ym1pdCIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iIExvZ2luICI+Ci0gICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiBjb2xzcGFuPSIyIj4KLSAgICAgICAgICAgICAgICAgIDxmb250IGNvbG9yPSJyZWQiPiZuYnNwOzwlIGlmIChyZXF1ZXN0LmdldEF0dHJpYnV0ZSgiZXJyb3JNZXNzYWdlIikgIT0gbnVsbCkgeyU+PCU9IHJlcXVlc3QuZ2V0QXR0cmlidXRlKCJlcnJvck1lc3NhZ2UiKSU+PCUgfSAlPiZuYnNwOzwvZm9udD4KLSAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgPC90YWJsZT4KLSAgICAgICAgICA8L2Zvcm0+Ci0gICAgICAgICAgPGJyLz48YnIvPjxici8+PGJyLz48YnIvPjxici8+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICA8L3RyPgotICAgIDwvdGFibGU+Ci0gICAgPHA+VGVzdDwvcD4KLSAgICA8anNwOmluY2x1ZGUgcGFnZT0iaW5jbHVkZS9mb290ZXIuaW5jIi8+Ci0gIDwvYm9keT4KLTwvaHRtbD4KLQotCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi9NYWluRnJhbWUuanNwIGIvdjEuNS4xUkMzL21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvTWFpbkZyYW1lLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU3OGM1Mi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi9NYWluRnJhbWUuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotPCUtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0lPg0KLQ0KLTxodG1sPg0KLSAgPGhlYWQ+DQotICAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPg0KLSAgICA8dGl0bGU+QXhpczIgQWRtaW5pc3RyYXRpb24gPC90aXRsZT4NCi0gICAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCi0gICAgPC9zdHlsZT48L2hlYWQ+DQotDQotICA8Ym9keT4NCi0gIDwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvU2VsZWN0U2VydmljZS5qc3AgYi92MS41LjFSQzMvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi9TZWxlY3RTZXJ2aWNlLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFhYWE4NC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi9TZWxlY3RTZXJ2aWNlLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLTwlLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tJT4NCi0NCi08JUAgcGFnZSBpbXBvcnQ9Im9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzLA0KLSAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZSwNCi0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5Db2xsZWN0aW9uLA0KLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkhhc2hNYXAsDQotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuSXRlcmF0b3IiJT4NCi08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sO2NoYXJzZXQ9VVRGLTgiIGxhbmd1YWdlPSJqYXZhIiAlPg0KLTxqc3A6aW5jbHVkZSBwYWdlPSJpbmNsdWRlL2FkbWluaGVhZGVyLmpzcCI+PC9qc3A6aW5jbHVkZT4NCi0NCi0gIDwlDQotICAgICAgU3RyaW5nIGFjdGlvbiA9IiI7DQotICAgICAgU3RyaW5nIGJ1dHRvbk5hbWU9IiIgOw0KLSAgICAgIFN0cmluZyBzdGF0dXMgPSAoU3RyaW5nKXJlcXVlc3QuZ2V0U2Vzc2lvbigpLmdldEF0dHJpYnV0ZShDb25zdGFudHMuU0VMRUNUX1NFUlZJQ0VfVFlQRSk7DQotICAgICAgU3RyaW5nIGhlYWRpbmcgPSAiIjsNCi0gICAgICBTdHJpbmcgZGlzYyA9ICIiOw0KLSAgICAgIGlmKHN0YXR1cyAhPSBudWxsICYmIHN0YXR1cy5lcXVhbHMoIk1PRFVMRSIpKSB7DQotICAgICAgICAgIGFjdGlvbiA9ICJsaXN0T3BlcmF0aW9ucyI7DQotICAgICAgICAgIGJ1dHRvbk5hbWUgPSAiIFZpZXcgT3BlcmF0aW9ucyI7DQotICAgICAgICAgIGhlYWRpbmcgPSAiU2VsZWN0IGEgc2VydmljZSB0byB2aWV3IG9wZXJhdGlvbiBzcGVjaWZpYyBjaGFpbnMiOw0KLSAgICAgICAgICBkaXNjID0gIlNlbGVjdCBhbiBBeGlzIHNlcnZpY2UgZnJvbSB0aGUgY29tYm8gYW5kIGNsaWNrIG9uIHRoZSAnVmlldyBPcGVyYXRpb25zJyBidXR0b24gdG8gdmlldyBvcGVyYXRpb24gc3BlY2lmaWMgQ2hhaW5zLiI7DQotICAgICAgfSBlbHNlIGlmKHN0YXR1cyAhPSBudWxsICYmIHN0YXR1cy5lcXVhbHMoIlZJRVciKSl7DQotICAgICAgICAgIGJ1dHRvbk5hbWUgPSAiIFZpZXcgIjsNCi0gICAgICAgICAgYWN0aW9uID0gInZpZXdTZXJ2aWNlSGFuZGxlcnMiOw0KLSAgICAgICAgICBoZWFkaW5nID0gIlNlbGVjdCBhIHNlcnZpY2UgdG8gdmlldyBzZXJ2aWNlIGhhbmRsZXJzIjsNCi0gICAgICAgICAgZGlzYyA9ICJTZWxlY3QgYW4gQXhpcyBzZXJ2aWNlIGZyb20gdGhlIGNvbWJvIGFuZCBjbGljayBvbiB0aGUgJ1ZpZXcnIGJ1dHRvbiB0byB2aWV3IHNlcnZpY2UgaGFuZGxlcnMuIjsNCi0gICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPSBudWxsICYmIHN0YXR1cy5lcXVhbHMoIlNFUlZJQ0VfUEFSQU1FVEVSIikpew0KLSAgICAgICAgICBidXR0b25OYW1lID0gIiBFZGl0IFBhcmFtZXRlcnMgIjsNCi0gICAgICAgICAgYWN0aW9uID0gImVkaXRTZXJ2aWNlUGFyYSI7IC8vIENvbnN0YW50cy5FRElSX1NFUlZJQ0VfUEFSQTsNCi0gICAgICAgICAgaGVhZGluZyA9ICJTZWxlY3QgYSBTZXJ2aWNlIHRvIEVkaXQgUGFyYW1ldGVycyI7DQotICAgICAgICAgIGRpc2MgPSAiU2VsZWN0IGFuIEF4aXMgc2VydmljZSBmcm9tIHRoZSBjb21ibyBhbmQgY2xpY2sgb24gdGhlICdFZGl0IFBhcmFtZXRlcnMnIGJ1dHRvbiB0byBlZGl0IHBhcmFtZXRlcnMuIjsNCi0gICAgICB9DQotICAlPg0KLTxoMT48JT1oZWFkaW5nJT48L2gxPg0KLTxwPjwlPWRpc2MlPjwvcD4NCi08Zm9ybSBtZXRob2Q9ImdldCIgbmFtZT0ic2VsZWN0U2VydmljZUZvcm0iIGFjdGlvbj0iYXhpczItYWRtaW4vPCU9YWN0aW9uJT4iPg0KLTx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSI1MCUiIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iMSI+DQotICAgICAgICAgPHRyPg0KLSAgICAgICAgPHRkIHdpZHRoPSIzNSUiPlNlbGVjdCBhIFNlcnZpY2UgOjwvdGQ+PHRkIHdpZHRoPSI2NSUiPg0KLSAgICAgICAgICAgIDxzZWxlY3QgbmFtZT0iYXhpc1NlcnZpY2UiPg0KLSAgICAgICAgICAgIDwlDQotICAgICAgICAgICAgICAgIEhhc2hNYXAgc2VydmljZXMgPSAoSGFzaE1hcClyZXF1ZXN0LmdldFNlc3Npb24oKS5nZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLlNFUlZJQ0VfTUFQKTsNCi0gICAgICAgICAgICAgICAgQ29sbGVjdGlvbiBzZXJ2aWNlQ29sID0gIHNlcnZpY2VzLnZhbHVlcygpOw0KLSAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gc2VydmljZUNvbC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7DQotICAgICAgICAgICAgICAgICAgICBBeGlzU2VydmljZSBheGlzU2VydmljZSA9IChBeGlzU2VydmljZSlpdGVyYXRvci5uZXh0KCk7DQotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2VydmljZU5hbWUgPSBheGlzU2VydmljZS5nZXROYW1lKCk7DQotICAgICAgICAgICAgJT4gPG9wdGlvbiAgYWxpZ249ImxlZnQiIHZhbHVlPSI8JT1zZXJ2aWNlTmFtZSU+Ij48JT1zZXJ2aWNlTmFtZSU+PC9vcHRpb24+DQotICAgICAgICAgICAgIDwlDQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgcmVxdWVzdC5nZXRTZXNzaW9uKCkuc2V0QXR0cmlidXRlKENvbnN0YW50cy5TRVJWSUNFX01BUCxudWxsKTsNCi0gICAgICAgICAgICAgJT4NCi0gICAgICAgICAgIDwvdGQ+DQotICAgICAgICA8L3RyPg0KLQk8dHI+PHRkIGNvbHNwYW49IjIiPiZuYnNwOzwvdGQ+PC90cj4NCi0gICAgICAgIDx0cj48dGQ+Jm5ic3A7PC90ZD4NCi0gICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGFsaWduPSJsZWZ0Ij4NCi0gICAgICAgICAgICAgICAgPGlucHV0IG5hbWU9InN1Ym1pdCIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iPCU9YnV0dG9uTmFtZSU+IiA+DQotICAgICAgICAgICAgIDwvdGQ+DQotICAgICAgICAgPC90cj4NCi0gICAgICA8L3RhYmxlPg0KLSAgIDwvZm9ybT4NCi08anNwOmluY2x1ZGUgcGFnZT0iaW5jbHVkZS9hZG1pbmZvb3Rlci5pbmMiPjwvanNwOmluY2x1ZGU+DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvU2VydmljZVBhcmFFZGl0LmpzcCBiL3YxLjUuMVJDMy9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi93ZWJhcHAvYXhpczItd2ViL1NlcnZpY2VQYXJhRWRpdC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3MjcyNmYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvU2VydmljZVBhcmFFZGl0LmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi08JS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0lPgotCi08JUAgcGFnZSBpbXBvcnQ9Im9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzLAotICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb24sCi0gICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2UsCi0gICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVyLAotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0LAotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuSXRlcmF0b3IiJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7Y2hhcnNldD1VVEYtOCIgbGFuZ3VhZ2U9ImphdmEiICU+Ci08anNwOmluY2x1ZGUgcGFnZT0iaW5jbHVkZS9hZG1pbmhlYWRlci5qc3AiPjwvanNwOmluY2x1ZGU+Ci08aDE+RWRpdCBTZXJ2aWNlIFBhcmFtZXRlcnM8L2gxPgotICA8Zm9ybSBtZXRob2Q9ImdldCIgbmFtZT0iZWRpdFNlcnZpY2VwYXJhIiBhY3Rpb249ImF4aXMyLWFkbWluL2VkaXRTZXJ2aWNlcGFyYSI+Ci0gICA8JQotICAgICAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UgPSAoQXhpc1NlcnZpY2UpcmVxdWVzdC5nZXRTZXNzaW9uKCkuCi0gICAgICAgICAgICAgICAgICAgIGdldEF0dHJpYnV0ZShDb25zdGFudHMuU0VSVklDRSk7Ci0gICAgICAgICAgICAgaWYoYXhpc1NlcnZpY2UgIT0gbnVsbCApewotICAgJT4gICAgIDx0YWJsZSB3aWR0aD0iMTAwJSI+Ci0KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiID48Yj4KLSAgICAgICAgICAgPCUKLSAgICAgICAgICAgICAgICAgU3RyaW5nIHNlcnZpY05hbWUgPSAgYXhpc1NlcnZpY2UuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgICAlPlNlcnZpY2UgUGFyYW1ldGVycyA6OiA8JT1zZXJ2aWNOYW1lJT4KLSAgICAgICAgICAgICAgICAgPC9iPjwvdGQ+Ci0gICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiID48aW5wdXQgc3R5bGU9ImRpc3BsYXk6bm9uZSIgIG5hbWU9ImF4aXNTZXJ2aWNlIiB2YWx1ZT0iPCU9c2VydmljTmFtZSU+Ij48L3RkPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgICA8JQotICAgICAgICAgICAgICAgICBBcnJheUxpc3Qgc2VydmljZV9wYXJhID0gYXhpc1NlcnZpY2UuZ2V0UGFyYW1ldGVycygpOwotICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlcnZpY2VfcGFyYS5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgUGFyYW1ldGVyIHBhcmFtZXRlciA9IChQYXJhbWV0ZXIpIHNlcnZpY2VfcGFyYS5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1ldGVyLmdldFBhcmFtZXRlclR5cGUoKT09UGFyYW1ldGVyLk9NX1BBUkFNRVRFUikgewotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgJT4KLSAgICAgICAgICAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICAgICAgIDx0ZD48JT1wYXJhbWV0ZXIuZ2V0TmFtZSgpJT48L3RkPgotICAgICAgICAgICAgICAgICAgICAgPHRkPjxpbnB1dCB0eXBlPSJ0ZXh0IiB2YWx1ZT0iPCU9cGFyYW1ldGVyLmdldFZhbHVlKCklPiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IjwlPShzZXJ2aWNOYW1lICsgIl8iICsgcGFyYW1ldGVyLmdldE5hbWUoKSklPiIgc2l6ZT0iNTAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICAgICAgICAgICA8JQotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgSXRlcmF0b3Igb3BlcmF0aW9ucyA9ICBheGlzU2VydmljZS5nZXRPcGVyYXRpb25zKCk7Ci0gICAgICAgICAgICAgICAgaWYob3BlcmF0aW9ucy5oYXNOZXh0KCkpewotICAgICAgICAgICAgICAgICAgICAlPgotICAgICAgICAgICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgICAgICAgPHRkPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+Ci0gICAgICAgICAgICAgICAgICAgICAgPHRkPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+Ci0gICAgICAgICAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiID4gPGI+T3BlcmF0aW9uIFBhcmFtYXRlcnMgOjogPC9iPgotICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgICAgICAgICA8JQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICBBcnJheUxpc3Qgb3BfcGFyYXMgOwotICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9ucyA9IGF4aXNTZXJ2aWNlLmdldE9wZXJhdGlvbnMoKTsKLSAgICAgICAgICAgICAgICAgd2hpbGUgKG9wZXJhdGlvbnMuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICBBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb24gPSAoQXhpc09wZXJhdGlvbikgb3BlcmF0aW9ucy5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICBTdHJpbmcgb3BlcmF0aW9uTmFtZSA9IGF4aXNPcGVyYXRpb24uZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgICAgICAgJT4KLSAgICAgICAgICAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiID4gJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD4KLSAgICAgICAgICAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiA+PGI+T3BlcmF0aW9uIDogPCU9b3BlcmF0aW9uTmFtZSU+PC9iPjwvdGQ+Ci0gICAgICAgICAgICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgICAgICAgICA8JQotICAgICAgICAgICAgICAgICAgICAgb3BfcGFyYXMgPSBheGlzT3BlcmF0aW9uLmdldFBhcmFtZXRlcnMoKTsKLSAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgb3BfcGFyYXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXIgcGFyYW1ldGVyID0gKFBhcmFtZXRlcikgb3BfcGFyYXMuZ2V0KGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbWV0ZXIuZ2V0UGFyYW1ldGVyVHlwZSgpPT1QYXJhbWV0ZXIuT01fUEFSQU1FVEVSKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICU+Ci0gICAgICAgICAgICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgICAgICA8dGQ+PCU9cGFyYW1ldGVyLmdldE5hbWUoKSU+PC90ZD4KLSAgICAgICAgICAgICAgICAgICAgIDx0ZD48aW5wdXQgdHlwZT0idGV4dCIgdmFsdWU9IjwlPXBhcmFtZXRlci5nZXRWYWx1ZSgpJT4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSI8JT0ob3BlcmF0aW9uTmFtZSArICJfIiArIHBhcmFtZXRlci5nZXROYW1lKCkpJT4iIHNpemU9IjUwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgICAgICAgICAgPCUKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAlPgotICAgICAgICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgICAgIDx0ZD4mbmJzcDs8L3RkPgotICAgICAgICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPSJjaGFuZ2VQYXJhIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIgQ2hhbmdlICIgPgotICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICAgICAgIDwvdGFibGU+Ci0gICAgICAgICAgICAgICAgIDwlCi0gICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIAklPgotICAgICAgICAgICAgCTxwPjwlPXJlcXVlc3QuZ2V0QXR0cmlidXRlKCJzdGF0dXMiKSU+PC9wPgotICAgICAgICAgICAgCTwlCi0gICAgICAgICAgICAgfQotCi0gICAgICAgJT4KLSAgICAgICA8Zm9ybT4KLTxqc3A6aW5jbHVkZSBwYWdlPSJpbmNsdWRlL2FkbWluZm9vdGVyLmluYyI+PC9qc3A6aW5jbHVkZT4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi93ZWJhcHAvYXhpczItd2ViL1RvcEZyYW1lLmpzcCBiL3YxLjUuMVJDMy9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi93ZWJhcHAvYXhpczItd2ViL1RvcEZyYW1lLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNiZWE1Ni4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi9Ub3BGcmFtZS5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi08JS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLSU+DQotDQotPGh0bWw+DQotICA8aGVhZD4NCi0gICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+DQotICAgIDx0aXRsZT5VbnRpdGxlZCBEb2N1bWVudDwvdGl0bGU+DQotICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+DQotICAgIDwvc3R5bGU+PC9oZWFkPg0KLQ0KLSAgPGJvZHk+DQotICAgIDxqc3A6aW5jbHVkZSBwYWdlPSJpbmNsdWRlL2FkbWluaGVhZGVyLmluYyI+DQotICAgIDwvanNwOmluY2x1ZGU+DQotICA8L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi93ZWJhcHAvYXhpczItd2ViL1ZpZXdDb250ZXh0cy5qc3AgYi92MS41LjFSQzMvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi9WaWV3Q29udGV4dHMuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjI1MzdjLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi93ZWJhcHAvYXhpczItd2ViL1ZpZXdDb250ZXh0cy5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi08JS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLSU+DQotDQotPCVAIHBhZ2UgaW1wb3J0PSJvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50cyIlPg0KLTwlQCBwYWdlIGltcG9ydD0ib3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0IiU+DQotPCVAIHBhZ2UgaW1wb3J0PSJvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuU2VydmljZUNvbnRleHQiJT4NCi08JUAgcGFnZSBpbXBvcnQ9Im9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5TZXJ2aWNlR3JvdXBDb250ZXh0IiU+DQotPCVAIHBhZ2UgaW1wb3J0PSJqYXZhLnV0aWwuSXRlcmF0b3IiJT4NCi08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sO2NoYXJzZXQ9VVRGLTgiIGxhbmd1YWdlPSJqYXZhIiAlPg0KLTxqc3A6aW5jbHVkZSBwYWdlPSJpbmNsdWRlL2FkbWluaGVhZGVyLmpzcCI+PC9qc3A6aW5jbHVkZT4NCi08aDE+UnVubmluZyBDb250ZXh0IEhpZXJhcmNoeTwvaDE+DQotPCUNCi0gICAgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ29udGV4dCA9IChDb25maWd1cmF0aW9uQ29udGV4dCkgcmVxdWVzdC5nZXRTZXNzaW9uKCkuZ2V0QXR0cmlidXRlKA0KLSAgICAgICAgICAgIENvbnN0YW50cy5DT05GSUdfQ09OVEVYVCk7DQotDQotICAgIFN0cmluZ1tdIHNlcnZpY2VHcm91cElkcyA9IGNvbmZpZ0NvbnRleHQuZ2V0U2VydmljZUdyb3VwQ29udGV4dElEcygpOw0KLSAgICBpZiAoc2VydmljZUdyb3VwSWRzLmxlbmd0aCA+IDApIHsNCi0lPg0KLTx1bD4NCi0gICAgPCUNCi0NCi0gICBmb3IgKGludCBpID0gMDsgaSA8IHNlcnZpY2VHcm91cElkcy5sZW5ndGg7IGkrKykgew0KLSAgICAgICAgU3RyaW5nIGdyb3VwQ29udGV4dElEID0gc2VydmljZUdyb3VwSWRzW2ldOw0KLSAgICAgICAgU2VydmljZUdyb3VwQ29udGV4dCBncm91cENvbnRleHQgPSBjb25maWdDb250ZXh0LmdldFNlcnZpY2VHcm91cENvbnRleHQoZ3JvdXBDb250ZXh0SUQpOw0KLSAgICAgICAgJT4NCi0gICAgICAgICAgIDxsaT48JT1ncm91cENvbnRleHRJRCU+PGZvbnQgY29sb3I9ImJsdWUiPjxhIGhyZWY9ImF4aXMyLWFkbWluL3ZpZXdTZXJ2aWNlR3JvdXBDb25ldHh0P1RZUEU9VklFVyZJRD08JT1ncm91cENvbnRleHRJRCU+Ij4NCi0gICAgICAgICAgICAgICAgICAgIFZpZXc8L2E+PC9mb250PiAgPGZvbnQgY29sb3I9InJlZCI+PGEgaHJlZj0iYXhpczItYWRtaW4vdmlld1NlcnZpY2VHcm91cENvbmV0eHQ/VFlQRT1ERUxFVEUmSUQ9PCU9Z3JvdXBDb250ZXh0SUQlPiI+DQotICAgICAgICAgICAgICAgICAgICBSZW1vdmU8L2E+IDwvZm9udD48L2xpPg0KLSAgICAgICAgPCUNCi0gICAgICAgIEl0ZXJhdG9yIHNlcnZpY2VDb250ZXh0SXRyID0gZ3JvdXBDb250ZXh0LmdldFNlcnZpY2VDb250ZXh0cygpOw0KLSAgICAgICAgICAgICU+PHVsPjwlDQotICAgICAgICB3aGlsZSAoc2VydmljZUNvbnRleHRJdHIuaGFzTmV4dCgpKSB7DQotICAgICAgICAgICAgU2VydmljZUNvbnRleHQgc2VydmljZUNvbnRleHQgPSAoU2VydmljZUNvbnRleHQpc2VydmljZUNvbnRleHRJdHIubmV4dCgpOw0KLSAgICAgICAgICAgICBTdHJpbmcgc2VydmljZUNvbklEID0gc2VydmljZUNvbnRleHQuZ2V0QXhpc1NlcnZpY2UoKS5nZXROYW1lKCk7DQotICAgICAgICAlPg0KLSAgICAgICAgICAgIDxsaT48JT1zZXJ2aWNlQ29uSUQlPjxmb250IGNvbG9yPSJibHVlIj48YSBocmVmPSJheGlzMi1hZG1pbi92aWV3U2VydmljZUNvbnRleHQ/VFlQRT1WSUVXJklEPTwlPXNlcnZpY2VDb25JRCU+JlBJRD08JT1ncm91cENvbnRleHRJRCU+Ij4NCi0gICAgICAgICAgICAgICAgICAgIFZpZXc8L2E+PC9mb250PjwvbGk+DQotICAgICAgICA8JQ0KLSAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAlPjwvdWw+PGhyPjwlDQotICAgIH0NCi0gICAgJT4gIDwvdWw+DQotICAgICAgICA8JQ0KLSAgICAgICAgICAgIH0gZWxzZSB7JT4NCi0JPHA+Tm8gcnVubmluZyBjb250ZXh0cyB3ZXJlIGZvdW5kIG9uIHRoZSBzeXN0ZW0uPC9wPg0KLSAgICAgICAgICAgIDwlfQ0KLSU+DQotPGpzcDppbmNsdWRlIHBhZ2U9ImluY2x1ZGUvYWRtaW5mb290ZXIuaW5jIj48L2pzcDppbmNsdWRlPg0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi93ZWJhcHAvYXhpczItd2ViL1ZpZXdHbG9iYWxIYW5kbGVycy5qc3AgYi92MS41LjFSQzMvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi9WaWV3R2xvYmFsSGFuZGxlcnMuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWU3MWJhLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi93ZWJhcHAvYXhpczItd2ViL1ZpZXdHbG9iYWxIYW5kbGVycy5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotPCUtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0lPg0KLQ0KLTwlQCBwYWdlIGltcG9ydD0ib3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHMsDQotICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzQ29uZmlndXJhdGlvbiwNCi0gICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkhhbmRsZXIsDQotICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5QaGFzZSwNCi0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5MaXN0IiU+DQotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDtjaGFyc2V0PVVURi04IiBsYW5ndWFnZT0iamF2YSIgJT4NCi08anNwOmluY2x1ZGUgcGFnZT0iaW5jbHVkZS9hZG1pbmhlYWRlci5qc3AiPjwvanNwOmluY2x1ZGU+DQotPGgxPlZpZXcgR2xvYmFsIEV4ZWN1dGlvbiBDaGFpbnM8L2gxPg0KLSAgIDwlDQotICAgICAgICAgICAgQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZyA9IChBeGlzQ29uZmlndXJhdGlvbilyZXF1ZXN0LmdldFNlc3Npb24oKS4NCi0gICAgICAgICAgICAgICAgICAgIGdldEF0dHJpYnV0ZShDb25zdGFudHMuR0xPQkFMX0hBTkRMRVJTKTsNCi0gICAgICAgICAgICAgaWYoYXhpc0NvbmZpZyAhPSBudWxsICl7DQotICAgICAgICAgICAgICAgICBMaXN0IGhhbmRsZXJzIDsNCi0gICAgICAgICAgICAgICAgIExpc3QgcGhhc2VzID0gYXhpc0NvbmZpZy5nZXRJbkZsb3dQaGFzZXMoKTsNCi0gICAgICAgICAgICAgICAgICU+DQotICAgICAgICAgICAgICAgICA8aDM+IEluIEZsb3cgVXAgVG8gYW5kIEluY2x1ZGluZyBEaXNwYXRjaGVyIDwvaDM+DQotICAgICAgICAgICAgICAgICA8dWw+DQotICAgICAgICAgICAgICAgICA8JQ0KLSAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwaGFzZXMuc2l6ZSgpOyBpKyspIHsNCi0gICAgICAgICAgICAgICAgICAgICBQaGFzZSBwaGFzZSA9IChQaGFzZSkgcGhhc2VzLmdldChpKTsNCi0gICAgICAgICAgICAgICAgICAgICAlPg0KLSAgICAgICAgICAgICAgICAgICAgIDxsaT5QaGFzZSBOYW1lIDogIDwlPXBoYXNlLmdldFBoYXNlTmFtZSgpJT48L2xpPg0KLSAgICAgICAgICAgICAgICAgICAgIDx1bD4NCi0gICAgICAgICAgICAgICAgICAgICA8JQ0KLSAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVycyA9IHBoYXNlLmdldEhhbmRsZXJzKCk7DQotICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgaGFuZGxlcnMuc2l6ZSgpOyBqKyspIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZXIgaGFuZGxlciA9IChIYW5kbGVyKSBoYW5kbGVycy5nZXQoaik7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPkhhbmRsZXIgTmFtZSA6IDwlPWhhbmRsZXIuZ2V0SGFuZGxlckRlc2MoKS5nZXROYW1lKCklPjwvbGk+DQotICAgICAgICAgICAgICAgICAgICAgICAgICA8JQ0KLSAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgJT4NCi0gICAgICAgICAgICAgICAgICAgICA8L3VsPg0KLSAgICAgICAgICAgICAgICAgPCUNCi0gICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICU+DQotICAgICAgICAgICAgICAgICA8L3VsPg0KLSAgICAgICAgICAgICAgICAgPCUNCi0gICAgICAgICAgICAgICAgIHBoYXNlcyA9IGF4aXNDb25maWcuZ2V0SW5GYXVsdEZsb3dQaGFzZXMoKTsNCi0gICAgICAgICAgICAgICAgICU+DQotICAgICAgICAgICAgICAgICA8aDM+IEluIEZhdWx0IEZsb3cgPC9oMz4NCi0gICAgICAgICAgICAgICAgIDx1bD4NCi0gICAgICAgICAgICAgICAgIDwlDQotICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBoYXNlcy5zaXplKCk7IGkrKykgew0KLSAgICAgICAgICAgICAgICAgICAgIFBoYXNlIHBoYXNlID0gKFBoYXNlKSBwaGFzZXMuZ2V0KGkpOw0KLSAgICAgICAgICAgICAgICAgICAgICU+DQotICAgICAgICAgICAgICAgICAgICAgPGxpPlBoYXNlIE5hbWUgIDogPCU9cGhhc2UuZ2V0UGhhc2VOYW1lKCklPjwvbGk+DQotICAgICAgICAgICAgICAgICAgICAgPHVsPg0KLSAgICAgICAgICAgICAgICAgICAgIDwlDQotICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXJzID0gcGhhc2UuZ2V0SGFuZGxlcnMoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBoYW5kbGVycy5zaXplKCk7IGorKykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlciBoYW5kbGVyID0gKEhhbmRsZXIpIGhhbmRsZXJzLmdldChqKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICU+DQotICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+SGFuZGxlciBOYW1lIDogPCU9aGFuZGxlci5nZXRIYW5kbGVyRGVzYygpLmdldE5hbWUoKSU+PC9saT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDwlDQotICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAlPg0KLSAgICAgICAgICAgICAgICAgICAgIDwvdWw+DQotICAgICAgICAgICAgICAgICA8JQ0KLSAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgJT4NCi0gICAgICAgICAgICAgICAgIDwvdWw+DQotICAgICAgICAgICAgICAgICA8JQ0KLQ0KLSAgICAgICAgICAgICAgICAgcGhhc2VzID0gYXhpc0NvbmZpZy5nZXRPdXRGbG93UGhhc2VzKCk7DQotICAgICAgICAgICAgICAgICAlPg0KLSAgICAgICAgICAgICAgICAgPGgzPiBPdXQgRmxvdyA8L2gzPg0KLSAgICAgICAgICAgICAgICAgPHVsPg0KLSAgICAgICAgICAgICAgICAgPCUNCi0gICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGhhc2VzLnNpemUoKTsgaSsrKSB7DQotICAgICAgICAgICAgICAgICAgICAgUGhhc2UgcGhhc2UgPSAoUGhhc2UpIHBoYXNlcy5nZXQoaSk7DQotICAgICAgICAgICAgICAgICAgICAgJT4NCi0gICAgICAgICAgICAgICAgICAgICA8bGk+UGhhc2UgTmFtZSA6IDwlPXBoYXNlLmdldFBoYXNlTmFtZSgpJT48L2xpPg0KLSAgICAgICAgICAgICAgICAgICAgIDx1bD4NCi0gICAgICAgICAgICAgICAgICAgICA8JQ0KLSAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVycyA9IHBoYXNlLmdldEhhbmRsZXJzKCk7DQotICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgaGFuZGxlcnMuc2l6ZSgpOyBqKyspIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZXIgaGFuZGxlciA9IChIYW5kbGVyKSBoYW5kbGVycy5nZXQoaik7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPkhhbmRsZXIgTmFtZSA6IDwlPWhhbmRsZXIuZ2V0SGFuZGxlckRlc2MoKS5nZXROYW1lKCklPjwvbGk+DQotICAgICAgICAgICAgICAgICAgICAgICAgICA8JQ0KLSAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgJT4NCi0gICAgICAgICAgICAgICAgICAgICA8L3VsPg0KLSAgICAgICAgICAgICAgICAgPCUNCi0gICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICU+DQotICAgICAgICAgICAgICAgICA8L3VsPg0KLSAgICAgICAgICAgICAgICAgPCUNCi0gICAgICAgICAgICAgICAgIHBoYXNlcyA9IGF4aXNDb25maWcuZ2V0T3V0RmF1bHRGbG93UGhhc2VzKCk7DQotICAgICAgICAgICAgICAgICAlPg0KLSAgICAgICAgICAgICAgICAgPGgzPiBPdXQgRmF1bHQgRmxvdyA8L2gzPg0KLSAgICAgICAgICAgICAgICAgPHVsPg0KLSAgICAgICAgICAgICAgICAgPCUNCi0gICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGhhc2VzLnNpemUoKTsgaSsrKSB7DQotICAgICAgICAgICAgICAgICAgICAgUGhhc2UgcGhhc2UgPSAoUGhhc2UpIHBoYXNlcy5nZXQoaSk7DQotICAgICAgICAgICAgICAgICAgICAgJT4NCi0gICAgICAgICAgICAgICAgICAgICA8bGk+UGhhc2UgTmFtZSA6IDwlPXBoYXNlLmdldFBoYXNlTmFtZSgpJT48L2xpPg0KLSAgICAgICAgICAgICAgICAgICAgIDx1bD4NCi0gICAgICAgICAgICAgICAgICAgICA8JQ0KLSAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVycyA9IHBoYXNlLmdldEhhbmRsZXJzKCk7DQotICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgaGFuZGxlcnMuc2l6ZSgpOyBqKyspIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZXIgaGFuZGxlciA9IChIYW5kbGVyKSBoYW5kbGVycy5nZXQoaik7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPkhhbmRsZXIgTmFtZSA6IDwlPWhhbmRsZXIuZ2V0SGFuZGxlckRlc2MoKS5nZXROYW1lKCklPjwvbGk+DQotICAgICAgICAgICAgICAgICAgICAgICAgICA8JQ0KLSAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgJT4NCi0gICAgICAgICAgICAgICAgICAgICA8L3VsPg0KLSAgICAgICAgICAgICAgICAgPCUNCi0gICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICU+DQotICAgICAgICAgICAgICAgICA8L3VsPg0KLSAgICAgICAgICAgICAgICAgPCUNCi0NCi0gICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgJT4NCi08anNwOmluY2x1ZGUgcGFnZT0iaW5jbHVkZS9hZG1pbmZvb3Rlci5pbmMiPjwvanNwOmluY2x1ZGU+DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvVmlld1NlcnZpY2VIYW5kbGVycy5qc3AgYi92MS41LjFSQzMvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi9WaWV3U2VydmljZUhhbmRsZXJzLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk3OWI3Yy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi9WaWV3U2VydmljZUhhbmRsZXJzLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi08JS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLSU+DQotDQotPCVAIHBhZ2UgaW1wb3J0PSJvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50cywNCi0gICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbiwNCi0gICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2UsDQotICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5IYW5kbGVyLA0KLSAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuUGhhc2UsDQotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0LA0KLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkxpc3QsDQotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuSXRlcmF0b3IiJT4NCi08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sO2NoYXJzZXQ9VVRGLTgiIGxhbmd1YWdlPSJqYXZhIiAlPg0KLTxodG1sPg0KLTxqc3A6aW5jbHVkZSBwYWdlPSJpbmNsdWRlL2FkbWluaGVhZGVyLmpzcCI+PC9qc3A6aW5jbHVkZT4NCi08aDE+VmlldyBPcGVyYXRpb24gU3BlY2lmaWMgQ2hhaW5zPC9oMT4NCi0gICA8JQ0KLSAgICAgICAgICAgIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlID0gKEF4aXNTZXJ2aWNlKXJlcXVlc3QuZ2V0U2Vzc2lvbigpLg0KLSAgICAgICAgICAgICAgICAgICAgZ2V0QXR0cmlidXRlKENvbnN0YW50cy5TRVJWSUNFX0hBTkRMRVJTKTsNCi0gICAgICAgICAgICAgaWYoYXhpc1NlcnZpY2UgIT0gbnVsbCApew0KLSAgICAgICAgICAgICAgICBMaXN0IGhhbmRsZXJzIDsNCi0gICAgICAgICAgICAgICAgSXRlcmF0b3Igb3BlcmF0aW9ucyA9ICBheGlzU2VydmljZS5nZXRPcGVyYXRpb25zKCk7DQotICAgICAgICAgICAgICAgICB3aGlsZSAob3BlcmF0aW9ucy5oYXNOZXh0KCkpIHsNCi0gICAgICAgICAgICAgICAgICAgICBBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb25vbiA9IChBeGlzT3BlcmF0aW9uKSBvcGVyYXRpb25zLm5leHQoKTsNCi0gICAgICAgICAgICAgICAgICAgICAlPjxoMj5PcGVyYXRpb24gTmFtZSA6IDwlPWF4aXNPcGVyYXRpb25vbi5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCklPjwvaDI+PCUNCi0gICAgICAgICAgICAgICAgICAgICBBcnJheUxpc3QgcGhhc2VzID0gYXhpc09wZXJhdGlvbm9uLmdldFJlbWFpbmluZ1BoYXNlc0luRmxvdygpOw0KLSAgICAgICAgICAgICAgICAgJT4NCi0gICAgICAgICAgICAgICAgIDxoMz4gSW4gRmxvdyA8L2gzPg0KLSAgICAgICAgICAgICAgICAgPHVsPg0KLSAgICAgICAgICAgICAgICAgPCUNCi0gICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGhhc2VzLnNpemUoKTsgaSsrKSB7DQotICAgICAgICAgICAgICAgICAgICAgUGhhc2UgcGhhc2UgPSAoUGhhc2UpIHBoYXNlcy5nZXQoaSk7DQotICAgICAgICAgICAgICAgICAgICAgJT4NCi0gICAgICAgICAgICAgICAgICAgICA8bGk+UGhhc2UgTmFtZSA6ICA8JT1waGFzZS5nZXRQaGFzZU5hbWUoKSU+PC9saT4NCi0gICAgICAgICAgICAgICAgICAgICA8dWw+DQotICAgICAgICAgICAgICAgICAgICAgPCUNCi0gICAgICAgICAgICAgICAgICAgICAgaGFuZGxlcnMgPSBwaGFzZS5nZXRIYW5kbGVycygpOw0KLSAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGhhbmRsZXJzLnNpemUoKTsgaisrKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVyIGhhbmRsZXIgPSAoSGFuZGxlcikgaGFuZGxlcnMuZ2V0KGopOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgJT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT5IYW5kbGVyIE5hbWUgOiA8JT1oYW5kbGVyLmdldEhhbmRsZXJEZXNjKCkuZ2V0TmFtZSgpJT48L2xpPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPCUNCi0gICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICU+DQotICAgICAgICAgICAgICAgICAgICAgPC91bD4NCi0gICAgICAgICAgICAgICAgIDwlDQotICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAlPg0KLSAgICAgICAgICAgICAgICAgPC91bD4NCi0gICAgICAgICAgICAgICAgIDwlDQotICAgICAgICAgICAgICAgICBwaGFzZXMgPSBheGlzT3BlcmF0aW9ub24uZ2V0UGhhc2VzSW5GYXVsdEZsb3coKTsNCi0gICAgICAgICAgICAgICAgICU+DQotICAgICAgICAgICAgICAgICA8aDM+IEluIEZhdWx0IEZsb3cgPC9oMz4NCi0gICAgICAgICAgICAgICAgIDx1bD4NCi0gICAgICAgICAgICAgICAgIDwlDQotICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBoYXNlcy5zaXplKCk7IGkrKykgew0KLSAgICAgICAgICAgICAgICAgICAgIFBoYXNlIHBoYXNlID0gKFBoYXNlKSBwaGFzZXMuZ2V0KGkpOw0KLSAgICAgICAgICAgICAgICAgICAgICU+DQotICAgICAgICAgICAgICAgICAgICAgPGxpPlBoYXNlIE5hbWUgIDogPCU9cGhhc2UuZ2V0UGhhc2VOYW1lKCklPjwvbGk+DQotICAgICAgICAgICAgICAgICAgICAgPHVsPg0KLSAgICAgICAgICAgICAgICAgICAgIDwlDQotICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXJzID0gcGhhc2UuZ2V0SGFuZGxlcnMoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBoYW5kbGVycy5zaXplKCk7IGorKykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlciBoYW5kbGVyID0gKEhhbmRsZXIpIGhhbmRsZXJzLmdldChqKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICU+DQotICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+SGFuZGxlciBOYW1lIDogPCU9aGFuZGxlci5nZXRIYW5kbGVyRGVzYygpLmdldE5hbWUoKSU+PC9saT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDwlDQotICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAlPg0KLSAgICAgICAgICAgICAgICAgICAgIDwvdWw+DQotICAgICAgICAgICAgICAgICA8JQ0KLSAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgJT4NCi0gICAgICAgICAgICAgICAgIDwvdWw+DQotICAgICAgICAgICAgICAgICA8JQ0KLQ0KLSAgICAgICAgICAgICAgICAgcGhhc2VzID0gYXhpc09wZXJhdGlvbm9uLmdldFBoYXNlc091dEZsb3coKTsNCi0gICAgICAgICAgICAgICAgICU+DQotICAgICAgICAgICAgICAgICA8aDM+IE91dCBGbG93IDwvaDM+DQotICAgICAgICAgICAgICAgICA8dWw+DQotICAgICAgICAgICAgICAgICA8JQ0KLSAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwaGFzZXMuc2l6ZSgpOyBpKyspIHsNCi0gICAgICAgICAgICAgICAgICAgICBQaGFzZSBwaGFzZSA9IChQaGFzZSkgcGhhc2VzLmdldChpKTsNCi0gICAgICAgICAgICAgICAgICAgICAlPg0KLSAgICAgICAgICAgICAgICAgICAgIDxsaT5QaGFzZSBOYW1lIDogPCU9cGhhc2UuZ2V0UGhhc2VOYW1lKCklPjwvbGk+DQotICAgICAgICAgICAgICAgICAgICAgPHVsPg0KLSAgICAgICAgICAgICAgICAgICAgIDwlDQotICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXJzID0gcGhhc2UuZ2V0SGFuZGxlcnMoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBoYW5kbGVycy5zaXplKCk7IGorKykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlciBoYW5kbGVyID0gKEhhbmRsZXIpIGhhbmRsZXJzLmdldChqKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICU+DQotICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+SGFuZGxlciBOYW1lIDogPCU9aGFuZGxlci5nZXRIYW5kbGVyRGVzYygpLmdldE5hbWUoKSU+PC9saT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDwlDQotICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAlPg0KLSAgICAgICAgICAgICAgICAgICAgIDwvdWw+DQotICAgICAgICAgICAgICAgICA8JQ0KLSAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgJT4NCi0gICAgICAgICAgICAgICAgIDwvdWw+DQotICAgICAgICAgICAgICAgICA8JQ0KLSAgICAgICAgICAgICAgICAgcGhhc2VzID0gYXhpc09wZXJhdGlvbm9uLmdldFBoYXNlc091dEZhdWx0RmxvdygpOw0KLSAgICAgICAgICAgICAgICAgJT4NCi0gICAgICAgICAgICAgICAgIDxoMz4gT3V0IEZhdWx0IEZsb3cgPC9oMz4NCi0gICAgICAgICAgICAgICAgIDx1bD4NCi0gICAgICAgICAgICAgICAgIDwlDQotICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBoYXNlcy5zaXplKCk7IGkrKykgew0KLSAgICAgICAgICAgICAgICAgICAgIFBoYXNlIHBoYXNlID0gKFBoYXNlKSBwaGFzZXMuZ2V0KGkpOw0KLSAgICAgICAgICAgICAgICAgICAgICU+DQotICAgICAgICAgICAgICAgICAgICAgPGxpPlBoYXNlIE5hbWUgOiA8JT1waGFzZS5nZXRQaGFzZU5hbWUoKSU+PC9saT4NCi0gICAgICAgICAgICAgICAgICAgICA8dWw+DQotICAgICAgICAgICAgICAgICAgICAgPCUNCi0gICAgICAgICAgICAgICAgICAgICAgaGFuZGxlcnMgPSBwaGFzZS5nZXRIYW5kbGVycygpOw0KLSAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGhhbmRsZXJzLnNpemUoKTsgaisrKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVyIGhhbmRsZXIgPSAoSGFuZGxlcikgaGFuZGxlcnMuZ2V0KGopOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgJT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT5IYW5kbGVyIE5hbWUgOiA8JT1oYW5kbGVyLmdldEhhbmRsZXJEZXNjKCkuZ2V0TmFtZSgpJT48L2xpPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPCUNCi0gICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICU+DQotICAgICAgICAgICAgICAgICAgICAgPC91bD4NCi0gICAgICAgICAgICAgICAgIDwlDQotICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAlPg0KLSAgICAgICAgICAgICAgICAgPC91bD4NCi0gICAgICAgICAgICAgICAgIDwlDQotDQotICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICU+DQotPGpzcDppbmNsdWRlIHBhZ2U9ImluY2x1ZGUvYWRtaW5mb290ZXIuaW5jIj48L2pzcDppbmNsdWRlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi93ZWJhcHAvYXhpczItd2ViL2FkbWluLmpzcCBiL3YxLjUuMVJDMy9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi93ZWJhcHAvYXhpczItd2ViL2FkbWluLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ4ZWUxNC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi9hZG1pbi5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi08JS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLSU+DQotDQotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDtjaGFyc2V0PVVURi04IiBsYW5ndWFnZT0iamF2YSIgJT4NCi08anNwOmluY2x1ZGUgcGFnZT0iaW5jbHVkZS9hZG1pbmhlYWRlci5qc3AiPjwvanNwOmluY2x1ZGU+DQotPGgxPldlbGNvbWUgdG8gQXhpczIgV2ViIEFkbWluIE1vZHVsZSAhITwvaDE+DQotPHA+WW91IGFyZSBub3cgbG9nZ2VkIGludG8gdGhlIEF4aXMyIGFkbWluaXN0cmF0aW9uIGNvbnNvbGUgZnJvbSBpbnNpZGUNCi10aGUgY29uc29sZSB5b3Ugd2lsbCBiZSBhYmxlIHRvPC9wPg0KLSAgICA8dWw+DQotICAgICAgICA8bGk+dG8gY2hlY2sgb24gdGhlIGhlYWx0aCBvZiB5b3VyIEF4aXMyIGRlcGxveW1lbnQuPC9saT4NCi0gICAgICAgIDxsaT50byBjaGFuZ2UgYW55IHBhcmFtZXRlcnMgYXQgcnVuIHRpbWUuPC9saT4NCi0gICAgICAgIDxsaT50byB1cGxvYWQgbmV3IHNlcnZpY2VzIGludG8gQXhpczIgW1NlcnZpY2UgaG90LWRlcGxveW1lbnRdLjwvbGk+DQotICAgIDwvdWw+DQotDQotPGpzcDppbmNsdWRlIHBhZ2U9ImluY2x1ZGUvYWRtaW5mb290ZXIuaW5jIj48L2pzcDppbmNsdWRlPg0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi93ZWJhcHAvYXhpczItd2ViL2Nzcy9heGlzLXN0eWxlLmNzcyBiL3YxLjUuMVJDMy9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi93ZWJhcHAvYXhpczItd2ViL2Nzcy9heGlzLXN0eWxlLmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjI3NDllNS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi9jc3MvYXhpcy1zdHlsZS5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotQk9EWSAgICAgICAgIHsKLQliYWNrZ3JvdW5kLWNvbG9yIDogIiNGRkZGRkYiOwotCWxlZnRtYXJnaW46IjAiOwotCXRvcG1hcmdpbjoiMCI7Ci0JZm9udC1mYW1pbHk6QXJpYWw7Ci0JZm9udC1zaXplOjExcHQ7Ci19Ci1oMSAgICAgICAgICAgeyBmb250LWZhbWlseTogQXJpYWw7IGZvbnQtc2l6ZTogMTZwdDsgZm9udC13ZWlnaHQ6IGJvbGQgfQotaDIgICAgICAgICAgIHsgZm9udC1mYW1pbHk6IEFyaWFsOyBmb250LXNpemU6IDEzcHQ7IGZvbnQtd2VpZ2h0OiBib2xkOyBjb2xvcjogIzVEMEQ3RCB9Ci11bCAgICAgICAgICAgeyBmb250LWZhbWlseTogQXJpYWw7IGZvbnQtc2l6ZTogMTFwdCB9Ci1pbnB1dCAgICAgICAgeyBmb250LWZhbWlseTogQXJpYWw7IGZvbnQtc2l6ZTogOHB0OyBmb250LXdlaWdodDogYm9sZCB9Ci10ZCAgICAgICAgICAgeyBmb250LWZhbWlseTogQXJpYWw7IGZvbnQtc2l6ZTogMTBwdCB9Ci1oMyAgICAgICAgICAgeyBmb250LWZhbWlseTogQXJpYWw7IGZvbnQtc2l6ZTogMTJwdDsgZm9udC13ZWlnaHQ6Ym9sZCB9Ci1UQUJMRS5GVUxMX0JMQU5LIHsKLQl3aWR0aCA6IDEwMCU7Ci0JaGVpZ2h0IDogMTAwJTsKLQlib3JkZXIgOiAwOwotCXBhZGRpbmcgOiAwOwotfQotCi1UQUJMRS5MT0dfSU5fRk9STXsKLQloZWlnaHQ6IDIwMHB4JTsKLQlib3JkZXI6MXB4IHNvbGlkICMwMDAwMDA7Ci0Jd2lkdGg6IDMwMHB4JTsKLQljZWxsc3BhY2luZzoxcHg7Ci0JY2VsbHBhZGRpbmc6MXB4OwotCWJhY2tncm91bmQtY29sb3I6ICNmN2Y3ZjcgOwotfQotCi1VTC5sb2dpblVMIExJewotCXBhZGRpbmc6IDEwcHQ7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvZGlzZW5nYWdlLmpzcCBiL3YxLjUuMVJDMy9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi93ZWJhcHAvYXhpczItd2ViL2Rpc2VuZ2FnZS5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyOWJiNzYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvZGlzZW5nYWdlLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTwlLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sO2NoYXJzZXQ9VVRGLTgiIGxhbmd1YWdlPSJqYXZhIiAlPgotPGpzcDppbmNsdWRlIHBhZ2U9ImluY2x1ZGUvYWRtaW5oZWFkZXIuanNwIi8+Ci08JT1yZXF1ZXN0LmdldFNlc3Npb24oKS5nZXRBdHRyaWJ1dGUoInN0YXR1cyIpJT4KLTxqc3A6aW5jbHVkZSBwYWdlPSJpbmNsdWRlL2FkbWluZm9vdGVyLmluYyIgLz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi9lbmdhZ2luZ2dsb2JhbGx5LmpzcCBiL3YxLjUuMVJDMy9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi93ZWJhcHAvYXhpczItd2ViL2VuZ2FnaW5nZ2xvYmFsbHkuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmQzMzVmLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi93ZWJhcHAvYXhpczItd2ViL2VuZ2FnaW5nZ2xvYmFsbHkuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotPCUtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0lPg0KLQ0KLTwlQCBwYWdlIGltcG9ydD0ib3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHMsDQotICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNNb2R1bGUsDQotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQ29sbGVjdGlvbiwNCi0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5IYXNoTWFwLA0KLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkl0ZXJhdG9yIiAlPg0KLTxodG1sPg0KLTxqc3A6aW5jbHVkZSBwYWdlPSJpbmNsdWRlL2FkbWluaGVhZGVyLmpzcCIvPg0KLTwlDQotICAgIFN0cmluZyBzdGF0dXMgPSAoU3RyaW5nKSByZXF1ZXN0LmdldFNlc3Npb24oKS5nZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLkVOR0FHRV9TVEFUVVMpOw0KLSU+DQotPGgxPkVuZ2FnZSBNb2R1bGUgR2xvYmFsbHk8L2gxPg0KLQ0KLTxwPlRvIGVuZ2FnZSBhIG1vZHVsZSBvbiBhbGwgc2VydmljZXMgYWNyb3NzIHRoZSBzeXN0ZW0sIHNlbGVjdCBhIG1vZHVsZSBmcm9tIHRoZSBjb21ibyBib3ggYmVsb3cNCi0gICAgYW5kIGNsaWNrIG9uIHRoZSAiRW5nYWdlIiBidXR0b24uIEFueSBtb2R1bGUgdGhhdCBuZWVkcyB0byBwbGFjZSBoYW5kbGVycyBpbnRvIHRoZSBwcmUtZGlzcGF0Y2gNCi0gICAgcGhhc2UgbmVlZHMgdG8gYmUgZW5nYWdlZCBnbG9iYWxseS48L3A+DQotDQotPGZvcm0gbWV0aG9kPSJnZXQiIG5hbWU9InNlbGVjdE1vZHVsZUZvcm0iIGFjdGlvbj0iYXhpczItYWRtaW4vZW5nYWdpbmdnbG9iYWxseSI+DQotICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjEiPg0KLSAgICAgICAgPHRyPg0KLSAgICAgICAgICAgIDx0ZCB3aWR0aD0iMTUlIj5TZWxlY3QgYSBNb2R1bGUgOjwvdGQ+DQotICAgICAgICAgICAgPHRkIHdpZHRoPSI3NSUiIGFsaWduPSJsZWZ0Ij4NCi0gICAgICAgICAgICAgICAgPHNlbGVjdCBuYW1lPSJtb2R1bGVzIj4NCi0gICAgICAgICAgICAgICAgICAgIDwlDQotICAgICAgICAgICAgICAgICAgICAgICAgSGFzaE1hcCBtb2R1ZWxzID0gKEhhc2hNYXApIHJlcXVlc3QuZ2V0U2Vzc2lvbigpLmdldEF0dHJpYnV0ZShDb25zdGFudHMuTU9EVUxFX01BUCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5nZXRTZXNzaW9uKCkuc2V0QXR0cmlidXRlKENvbnN0YW50cy5NT0RVTEVfTUFQLG51bGwpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb24gbW9kdWxlQ29sID0gbW9kdWVscy52YWx1ZXMoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbW9kdWxlQ29sLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQXhpc01vZHVsZSBheGlzT3BlcmF0aW9uID0gKEF4aXNNb2R1bGUpIGl0ZXJhdG9yLm5leHQoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1vZHVsZW5hbWUgPSBheGlzT3BlcmF0aW9uLmdldE5hbWUoKTsNCi0gICAgICAgICAgICAgICAgICAgICU+IDxvcHRpb24gYWxpZ249ImxlZnQiIHZhbHVlPSI8JT1tb2R1bGVuYW1lJT4iPjwlPW1vZHVsZW5hbWUlPjwvb3B0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgPCUNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAlPg0KLSAgICAgICAgICAgICAgICA8L3NlbGVjdD4NCi0gICAgICAgICAgICA8L3RkPg0KLSAgICAgICAgPC90cj4NCi0gICAgICAgIDx0cj48dGQ+Jm5ic3A7PC90ZD4NCi0gICAgICAgICAgICA8dGQ+DQotICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPSJzdWJtaXQiIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiBFbmdhZ2UgIj4NCi0gICAgICAgICAgICA8L3RkPg0KLSAgICAgICAgPC90cj4NCi0gICAgPC90YWJsZT4NCi08L2Zvcm0+DQotPCUNCi0gICAgaWYgKHN0YXR1cyAhPSBudWxsKSB7DQotJT4NCi08cD48Zm9udCBjb2xvcj0iYmx1ZSI+PCU9c3RhdHVzJT48L2ZvbnQ+PC9wPg0KLTwlDQotICAgIH0gJT4NCi08anNwOmluY2x1ZGUgcGFnZT0iaW5jbHVkZS9hZG1pbmZvb3Rlci5pbmMiLz4NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi9lbmdhZ2luZ3RvYW5vcGVyYXRpb24uanNwIGIvdjEuNS4xUkMzL21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvZW5nYWdpbmd0b2Fub3BlcmF0aW9uLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBhZDhiYy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi9lbmdhZ2luZ3RvYW5vcGVyYXRpb24uanNwCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLTwlLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tJT4NCi0NCi08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiIGxhbmd1YWdlPSJqYXZhIiBpbXBvcnQ9Im9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzTW9kdWxlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS51dGlsLkNvbGxlY3Rpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuSGFzaE1hcCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEudXRpbC5JdGVyYXRvciIlPg0KLTxqc3A6aW5jbHVkZSBwYWdlPSJpbmNsdWRlL2FkbWluaGVhZGVyLmpzcCI+PC9qc3A6aW5jbHVkZT4NCi08JQ0KLSAgICBTdHJpbmcgc3RhdHVzID0gKFN0cmluZylyZXF1ZXN0LmdldFNlc3Npb24oKS5nZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLkVOR0FHRV9TVEFUVVMpOw0KLSU+DQotPGgxPkVuZ2FnZSBNb2R1bGUgZm9yIGFuIE9wZXJhdGlvbjwvaDE+DQotPHA+VG8gZW5nYWdlIGEgbW9kdWxlIGZvciBhbiAgYXhpcyBvcGVyYXRpb24sPC9wPg0KLSAgICA8b2w+DQotICAgICAgICAgICAgPGxpPnNlbGVjdCB0aGUgbW9kdWxlIHlvdSB3YW50IHRvIGVuZ2FnZSA8L2xpPg0KLSAgICAgICAgICAgIDxsaT5zZWxlY3QgdGhlIGF4aXMgb3BlcmF0aW9uIHlvdSBsaWtlIHRoZSBtb2R1bGUgdG8gYmUgZW5nYWdlZC48L2xpPg0KLSAgICAgICAgICAgIDxsaT5jbGljayAiRW5nYWdlIi48L2xpPg0KLSAgICAgICAgPC9vbD4NCi0NCi08Zm9ybSBtZXRob2Q9ImdldCIgbmFtZT0ic2VsZWN0TW9kdWxlRm9ybSIgYWN0aW9uPSJheGlzMi1hZG1pbi9saXN0T3BlcmF0aW9ucyI+DQotPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iMSI+DQotICAgIDx0cj4NCi0gICAgICAgIDx0ZD4NCi0gICAgICAgICAgICAmbmJzcDsNCi0gICAgICAgICAgICAmbmJzcDsNCi0gICAgICAgIDwvdGQ+DQotICAgIDwvdHI+DQotICAgIDx0cj4NCi0gICAgICAgIDx0ZD5TZWxlY3QgYSBNb2R1bGUgOjwvdGQ+DQotICAgIDwvdHI+DQotICAgIDx0cj4NCi0gICAgICAgIDx0ZD4NCi0gICAgICAgICAgICA8c2VsZWN0IG5hbWU9Im1vZHVsZXMiPg0KLSAgICAgICAgICAgIDwlDQotICAgICAgICAgICAgICAgIEhhc2hNYXAgbW9kdWVscyA9IChIYXNoTWFwKXJlcXVlc3QuZ2V0U2Vzc2lvbigpLmdldEF0dHJpYnV0ZShDb25zdGFudHMuTU9EVUxFX01BUCk7DQotICAgICAgICAgICAgICAgIHJlcXVlc3QuZ2V0U2Vzc2lvbigpLnNldEF0dHJpYnV0ZShDb25zdGFudHMuTU9EVUxFX01BUCxudWxsKTsNCi0gICAgICAgICAgICAgICAgQ29sbGVjdGlvbiBtb2R1bGVDb2wgPSAgbW9kdWVscy52YWx1ZXMoKTsNCi0gICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IG1vZHVsZUNvbC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7DQotICAgICAgICAgICAgICAgICAgICBBeGlzTW9kdWxlIGF4aXNPcGVyYXRpb24gPSAoQXhpc01vZHVsZSkgaXRlcmF0b3IubmV4dCgpOw0KLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1vZHVsZW5hbWUgPSBheGlzT3BlcmF0aW9uLmdldE5hbWUoKTsNCi0gICAgICAgICAgICAlPiA8b3B0aW9uICBhbGlnbj0ibGVmdCIgdmFsdWU9IjwlPW1vZHVsZW5hbWUlPiI+PCU9bW9kdWxlbmFtZSU+PC9vcHRpb24+DQotICAgICAgICAgICAgIDwlDQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgJT4NCi0gICAgICAgICAgIDwvdGQ+DQotICAgICAgICA8L3RyPg0KLSAgICAgICAgPHRyPg0KLSAgICAgICAgICAgPHRkPg0KLSAgICAgICAgICAgICAmbmJzcDsNCi0gICAgICAgICAgICAgJm5ic3A7DQotICAgICAgICAgICA8L3RkPg0KLSAgICAgICAgIDwvdHI+DQotICAgICAgICAgPHRyPg0KLSAgICAgICAgPHRkPlNlbGVjdCBhbiBPcGVyYXRpb24gOjwvdGQ+DQotICAgIDwvdHI+DQotICAgIDx0cj4NCi0gICAgICAgIDx0ZD4NCi0gICAgICAgICAgICA8c2VsZWN0IG5hbWU9ImF4aXNPcGVyYXRpb24iPg0KLSAgICAgICAgICAgIDwlDQotICAgICAgICAgICAgICAgIEl0ZXJhdG9yIG9wZXJhdGlvbnMgPSAoSXRlcmF0b3IpcmVxdWVzdC5nZXRTZXNzaW9uKCkuZ2V0QXR0cmlidXRlKENvbnN0YW50cy5PUEVSQVRJT05fTUFQKTsNCi0gICAgICAgICAgICAgICAgd2hpbGUgKG9wZXJhdGlvbnMuaGFzTmV4dCgpKSB7DQotICAgICAgICAgICAgICAgICAgICBBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb250aW9uID0gKEF4aXNPcGVyYXRpb24pb3BlcmF0aW9ucy5uZXh0KCk7DQotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgb3BuYW1lID0gYXhpc09wZXJhdGlvbnRpb24uZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpOw0KLSAgICAgICAgICAgICU+IDxvcHRpb24gIGFsaWduPSJsZWZ0IiB2YWx1ZT0iPCU9b3BuYW1lJT4iPjwlPW9wbmFtZSU+PC9vcHRpb24+DQotICAgICAgICAgICAgIDwlDQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgcmVxdWVzdC5nZXRTZXNzaW9uKCkuc2V0QXR0cmlidXRlKENvbnN0YW50cy5PUEVSQVRJT05fTUFQLG51bGwpOw0KLSAgICAgICAgICAgICAlPg0KLSAgICAgICAgICAgPC90ZD4NCi0gICAgICAgIDwvdHI+DQotICAgICAgICA8dHI+DQotICAgICAgICAgICA8dGQ+DQotICAgICAgICAgICAgICZuYnNwOw0KLSAgICAgICAgICAgICAmbmJzcDsNCi0gICAgICAgICAgIDwvdGQ+DQotICAgICAgICAgPC90cj4NCi0gICAgICAgICA8dHI+DQotICAgICAgICAgICAgIDx0ZD4NCi0gICAgICAgICAgICAgICAgPGlucHV0IG5hbWU9InN1Ym1pdCIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iIEVuZ2FnZSAiID4NCi0gICAgICAgICAgICAgPC90ZD4NCi0gICAgICAgICA8L3RyPg0KLSAgICAgICAgIDx0cj4NCi0gICAgICAgICAgICAgPHRkPg0KLSAgICAgICAgICAgICAmbmJzcDsNCi0gICAgICAgICAgICAgJm5ic3A7DQotICAgICAgICAgICAgIDwvdGQ+DQotICAgICAgICAgPC90cj4NCi0gICAgICAgICA8dHI+DQotICAgICAgICAgICAgIDx0ZD4NCi0gICAgICAgICAgICAgJm5ic3A7DQotICAgICAgICAgICAgICZuYnNwOw0KLSAgICAgICAgICAgICA8L3RkPg0KLSAgICAgICAgIDwvdHI+DQotICAgICAgICAgPHRyPg0KLSAgICAgICAgICAgICA8dGQ+DQotICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBjb2xzPSI1MCIgIDwlDQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoc3RhdHVzID09IG51bGwpew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICU+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPSJkaXNwbGF5Om5vbmUiDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwlDQotICAgICAgICAgICAgICAgICAgICAgICAgfSAlPg0KLSAgICAgICAgICAgICAgICAgICAgPjwlPXN0YXR1cyU+PC90ZXh0YXJlYT4NCi0gICAgICAgICAgICAgIDwvdGQ+DQotICAgICAgICAgICA8L3RyPg0KLSAgICAgIDwvdGFibGU+DQotICAgPC9mb3JtPg0KLTxqc3A6aW5jbHVkZSBwYWdlPSJpbmNsdWRlL2FkbWluZm9vdGVyLmluYyI+PC9qc3A6aW5jbHVkZT4NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi9lbmdhZ2luZ3RvYXNlcnZpY2UuanNwIGIvdjEuNS4xUkMzL21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvZW5nYWdpbmd0b2FzZXJ2aWNlLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjkxNjA1Yi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi9lbmdhZ2luZ3RvYXNlcnZpY2UuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLTwlLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tJT4NCi0NCi08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiIGxhbmd1YWdlPSJqYXZhIiBpbXBvcnQ9Im9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzTW9kdWxlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEudXRpbC5Db2xsZWN0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS51dGlsLkhhc2hNYXAsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuSXRlcmF0b3IiDQotICAgICAgICAgJT4NCi08anNwOmluY2x1ZGUgcGFnZT0iaW5jbHVkZS9hZG1pbmhlYWRlci5qc3AiPjwvanNwOmluY2x1ZGU+DQotPCUNCi0gICAgU3RyaW5nIHN0YXR1cyA9IChTdHJpbmcpIHJlcXVlc3QuZ2V0U2Vzc2lvbigpLmdldEF0dHJpYnV0ZShDb25zdGFudHMuRU5HQUdFX1NUQVRVUyk7DQotJT4NCi08aDE+RW5nYWdlIE1vZHVsZSBmb3IgYSBTZXJ2aWNlPC9oMT4NCi0NCi08cD5UbyBlbmdhZ2UgYSBtb2R1bGUgZm9yIGEgYXhpcyBzZXJ2aWNlLDwvcD4NCi0NCi0gICAgPG9sPg0KLSAgICAgICAgPGxpPnNlbGVjdCB0aGUgbW9kdWxlIHlvdSB3YW50IHRvIGVuZ2FnZTwvbGk+DQotICAgICAgICA8bGk+c2VsZWN0IHRoZSBheGlzIHNlcnZpY2UgeW91IGxpa2UgdGhlIG1vZHVsZSB0byBiZSBlbmdhZ2VkLjwvbGk+DQotICAgICAgICA8bGk+Y2xpY2sgIkVuZ2FnZSIuPC9saT4NCi0gICAgPC9vbD4NCi0NCi08Zm9ybSBtZXRob2Q9ImdldCIgbmFtZT0ic2VsZWN0TW9kdWxlRm9ybSIgYWN0aW9uPSJheGlzMi1hZG1pbi9lbmdhZ2VUb1NlcnZpY2UiPg0KLSAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSIxIj4NCi0gICAgICAgIDx0cj4NCi0gICAgICAgICAgICA8dGQ+DQotICAgICAgICAgICAgICAgICZuYnNwOw0KLSAgICAgICAgICAgICAgICAmbmJzcDsNCi0gICAgICAgICAgICA8L3RkPg0KLSAgICAgICAgPC90cj4NCi0gICAgICAgIDx0cj4NCi0gICAgICAgICAgICA8dGQ+U2VsZWN0IGEgTW9kdWxlIDo8L3RkPg0KLSAgICAgICAgPC90cj4NCi0gICAgICAgIDx0cj4NCi0gICAgICAgICAgICA8dGQ+DQotICAgICAgICAgICAgICAgIDxzZWxlY3QgbmFtZT0ibW9kdWxlcyI+DQotICAgICAgICAgICAgICAgICAgICA8JQ0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIEhhc2hNYXAgbW9kdWVscyA9IChIYXNoTWFwKXJlcXVlc3QuZ2V0U2Vzc2lvbigpLmdldEF0dHJpYnV0ZShDb25zdGFudHMuTU9EVUxFX01BUCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5nZXRTZXNzaW9uKCkuc2V0QXR0cmlidXRlKENvbnN0YW50cy5NT0RVTEVfTUFQLG51bGwpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb24gbW9kdWxlQ29sID0gIG1vZHVlbHMudmFsdWVzKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IG1vZHVsZUNvbC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF4aXNNb2R1bGUgYXhpc09wZXJhdGlvbiA9IChBeGlzTW9kdWxlKSBpdGVyYXRvci5uZXh0KCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtb2R1bGVuYW1lID0gYXhpc09wZXJhdGlvbi5nZXROYW1lKCk7DQotDQotICAgICAgICAgICAgICAgICAgICAlPg0KLSAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBhbGlnbj0ibGVmdCIgdmFsdWU9IjwlPW1vZHVsZW5hbWUlPiI+PCU9bW9kdWxlbmFtZSU+DQotICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj4NCi0gICAgICAgICAgICAgICAgICAgIDwlDQotDQotICAgICAgICAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgICAgICAlPg0KLSAgICAgICAgICAgIDwvdGQ+DQotICAgICAgICA8L3RyPg0KLSAgICAgICAgPHRyPg0KLSAgICAgICAgICAgIDx0ZD4NCi0gICAgICAgICAgICAgICAgJm5ic3A7DQotICAgICAgICAgICAgICAgICZuYnNwOw0KLSAgICAgICAgICAgIDwvdGQ+DQotICAgICAgICA8L3RyPg0KLSAgICAgICAgPHRyPg0KLSAgICAgICAgICAgIDx0ZD5TZWxlY3QgYSBTZXJ2aWNlIDo8L3RkPg0KLSAgICAgICAgPC90cj4NCi0gICAgICAgIDx0cj4NCi0gICAgICAgICAgICA8dGQ+DQotICAgICAgICAgICAgICAgIDxzZWxlY3QgbmFtZT0iYXhpc1NlcnZpY2UiPg0KLSAgICAgICAgICAgICAgICAgICAgPCUNCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICBIYXNoTWFwIHNlcnZpY2VzID0gKEhhc2hNYXApcmVxdWVzdC5nZXRTZXNzaW9uKCkuZ2V0QXR0cmlidXRlKENvbnN0YW50cy5TRVJWSUNFX01BUCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbiBzZXJ2aWNlQ29sID0gIHNlcnZpY2VzLnZhbHVlcygpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBzZXJ2aWNlQ29sLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UgPSAoQXhpc1NlcnZpY2UpaXRlcmF0b3IubmV4dCgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2VydmljZU5hbWUgPSBheGlzU2VydmljZS5nZXROYW1lKCk7DQotDQotICAgICAgICAgICAgICAgICAgICAlPg0KLSAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBhbGlnbj0ibGVmdCIgdmFsdWU9IjwlPXNlcnZpY2VOYW1lJT4iPjwlPXNlcnZpY2VOYW1lJT4NCi0gICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgPCUNCi0NCi0gICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuZ2V0U2Vzc2lvbigpLnNldEF0dHJpYnV0ZShDb25zdGFudHMuU0VSVklDRV9NQVAsbnVsbCk7DQotDQotICAgICAgICAgICAgICAgICAgICAlPg0KLSAgICAgICAgICAgIDwvdGQ+DQotICAgICAgICA8L3RyPg0KLSAgICAgICAgPHRyPg0KLSAgICAgICAgICAgIDx0ZD4NCi0gICAgICAgICAgICAgICAgJm5ic3A7DQotICAgICAgICAgICAgICAgICZuYnNwOw0KLSAgICAgICAgICAgIDwvdGQ+DQotICAgICAgICA8L3RyPg0KLSAgICAgICAgPHRyPg0KLSAgICAgICAgICAgIDx0ZD4NCi0gICAgICAgICAgICAgICAgPGlucHV0IG5hbWU9InN1Ym1pdCIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iIEVuZ2FnZSAiPg0KLSAgICAgICAgICAgIDwvdGQ+DQotICAgICAgICA8L3RyPg0KLSAgICAgICAgPHRyPg0KLSAgICAgICAgICAgIDx0ZD4NCi0gICAgICAgICAgICAgICAgJm5ic3A7DQotICAgICAgICAgICAgICAgICZuYnNwOw0KLSAgICAgICAgICAgIDwvdGQ+DQotICAgICAgICA8L3RyPg0KLSAgICAgICAgPHRyPg0KLSAgICAgICAgICAgIDx0ZD4NCi0gICAgICAgICAgICAgICAgJm5ic3A7DQotICAgICAgICAgICAgICAgICZuYnNwOw0KLSAgICAgICAgICAgIDwvdGQ+DQotICAgICAgICA8L3RyPg0KLSAgICAgICAgPHRyPg0KLSAgICAgICAgICAgIDx0ZD4NCi0gICAgICAgICAgICAgICAgPHRleHRhcmVhIGNvbHM9IjUwIiAgPCUNCi0gICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICAlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9ImRpc3BsYXk6bm9uZSINCi0gICAgICAgICAgICAgICAgICAgICAgICA8JQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICU+DQotICAgICAgICAgICAgICAgICAgICAgICAgPjwlPXN0YXR1cyU+DQotICAgICAgICAgICAgICAgIDwvdGV4dGFyZWE+DQotICAgICAgICAgICAgPC90ZD4NCi0gICAgICAgIDwvdHI+DQotICAgIDwvdGFibGU+DQotPC9mb3JtPg0KLTxqc3A6aW5jbHVkZSBwYWdlPSJpbmNsdWRlL2FkbWluZm9vdGVyLmluYyI+PC9qc3A6aW5jbHVkZT4NCi0NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi9lcnJvci5qc3AgYi92MS41LjFSQzMvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi9lcnJvci5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4NTAwNDAuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvZXJyb3IuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPCUtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0lPg0KLQ0KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7Y2hhcnNldD1VVEYtOCIgbGFuZ3VhZ2U9ImphdmEiICU+DQotPCVAcGFnZSBpc0Vycm9yUGFnZT0idHJ1ZSIgJT4NCi08anNwOmluY2x1ZGUgcGFnZT0iaW5jbHVkZS9hZG1pbmhlYWRlci5qc3AiPjwvanNwOmluY2x1ZGU+DQotICA8dGFibGU+DQotICA8dHI+DQotICA8dGQgYWxpZ249ImNlbnRlciI+QW4gZXJyb3IgaGFzIG9jY3VyZWQhLiBQbGVhc2UgY2hlY2sgdGhlIGRldGFpbHMgYmVsb3c8L3RkPg0KLSAgPC90cj4NCi0gIDx0cj4NCi0gIDx0ZCBhbGlnbj0iY2VudGVyIj48JT1leGNlcHRpb24uZ2V0TWVzc2FnZSgpJT48L3RkPg0KLSAgPC90cj4NCi0gIDwvdGFibGU+DQotPGpzcDppbmNsdWRlIHBhZ2U9ImluY2x1ZGUvYWRtaW5mb290ZXIuaW5jIj48L2pzcDppbmNsdWRlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi93ZWJhcHAvYXhpczItd2ViL2Vycm9yTW9kdWxlLmpzcCBiL3YxLjUuMVJDMy9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi93ZWJhcHAvYXhpczItd2ViL2Vycm9yTW9kdWxlLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTEwMGUzYS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi9lcnJvck1vZHVsZS5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi08JS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0lPgotCi08JUAgcGFnZSBpbXBvcnQ9Im9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzLAotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuSGFzaHRhYmxlIiU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sO2NoYXJzZXQ9VVRGLTgiIGxhbmd1YWdlPSJqYXZhIiAlPgotPGpzcDppbmNsdWRlIHBhZ2U9ImluY2x1ZGUvYWRtaW5oZWFkZXIuanNwIj48L2pzcDppbmNsdWRlPgotICA8JQotICAgICAgSGFzaHRhYmxlIGVycm9ybmVzc01vZHVsZXMgPShIYXNodGFibGUpcmVxdWVzdC5nZXRTZXNzaW9uKCkuZ2V0QXR0cmlidXRlKENvbnN0YW50cy5FUlJPUl9NT0RVTEVfTUFQKTsKLSAgICAgIFN0cmluZyBtb2R1bGVOYW1lID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoIm1vZHVsZU5hbWUiKTsKLSAgJT4gPGgzPlRoZSBNb2R1bGUgaGFzIGRlcGxveW1lbnQgZmF1bHRzPC9oMz48JQotICAlPjxmb250IGNvbG9yPSJyZWQiID48JT0oU3RyaW5nKWVycm9ybmVzc01vZHVsZXMuZ2V0KG1vZHVsZU5hbWUpICU+PC9mb250PjwlCi0gICU+Ci08anNwOmluY2x1ZGUgcGFnZT0iaW5jbHVkZS9hZG1pbmZvb3Rlci5pbmMiPjwvanNwOmluY2x1ZGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvZ2xvYmFsTW9kdWxlcy5qc3AgYi92MS41LjFSQzMvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi9nbG9iYWxNb2R1bGVzLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE0MTRjYS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi9nbG9iYWxNb2R1bGVzLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLSA8JS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLSU+IDwlQCBwYWdlIGltcG9ydD0ib3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHMsDQotICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNNb2R1bGUsDQotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQ29sbGVjdGlvbiwNCi0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5JdGVyYXRvciIlPg0KLSA8JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sO2NoYXJzZXQ9VVRGLTgiIGxhbmd1YWdlPSJqYXZhIiAlPg0KLTxqc3A6aW5jbHVkZSBwYWdlPSJpbmNsdWRlL2FkbWluaGVhZGVyLmpzcCI+PC9qc3A6aW5jbHVkZT4NCi08aDE+R2xvYmFsbHkgRW5nYWdlZCBNb2R1bGVzPC9oMT4NCi0gICAgIDwlDQotICAgICAgICAgYm9vbGVhbiBmb3VuZE1vZHVsZXMgPSBmYWxzZTsNCi0gICAgICAgICBib29sZWFuIHdyb3RlVUwgPSBmYWxzZTsNCi0gICAgICAgICBTdHJpbmcgbW9kdWxlbmFtZSA9ICIiOw0KLSAgICAgICAgIENvbGxlY3Rpb24gbW9kdWxlQ29sID0gKENvbGxlY3Rpb24pIHJlcXVlc3QuZ2V0U2Vzc2lvbigpLmdldEF0dHJpYnV0ZShDb25zdGFudHMuTU9EVUxFX01BUCk7DQotICAgICAgICAgcmVxdWVzdC5nZXRTZXNzaW9uKCkuc2V0QXR0cmlidXRlKENvbnN0YW50cy5NT0RVTEVfTUFQLCBudWxsKTsNCi0gICAgICAgICBpZiAobW9kdWxlQ29sICE9IG51bGwgJiYgbW9kdWxlQ29sLnNpemUoKSA+IDApIHsNCi0gICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IG1vZHVsZUNvbC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7DQotICAgICAgICAgICAgICAgICBBeGlzTW9kdWxlIGF4aXNPcGVyYXRpb24gPSAoQXhpc01vZHVsZSkgaXRlcmF0b3IubmV4dCgpOw0KLSAgICAgICAgICAgICAgICAgbW9kdWxlbmFtZSA9IGF4aXNPcGVyYXRpb24uZ2V0TmFtZSgpOw0KLSAgICAgICAgICAgICAgICAgaWYgKCF3cm90ZVVMKSB7DQotICAgICAgICAgICAgICAgICAgICAgd3JvdGVVTCA9IHRydWU7DQotICAgICAlPg0KLQk8dWw+DQotPCUNCi0JCX0NCi0gICAgICU+PGxpPjwlPW1vZHVsZW5hbWUlPjwvbGk+DQotICAgICA8YnI+IDwlDQotICAgICAgICAgICAgIH0NCi0JCWlmICh3cm90ZVVMKXsNCi0lPg0KLQk8L3VsPg0KLTwlDQotCQl9DQotICAgICAgICAgfSBlbHNlew0KLSAgICAgJT4NCi0gICAgPGgyPjxmb250IGNvbG9yPSJibHVlIj5UaGVyZSBhcmUgbm8gbW9kdWxlcyBlbmdhZ2VkIGdsb2JhbGx5PC9mb250PjwvaDI+IA0KLSAgICAgICAgICAgICAgICAgPCUNCi0gICAgICAgICB9DQotICAgICAgICAgICAgICAgICAlPg0KLTxqc3A6aW5jbHVkZSBwYWdlPSJpbmNsdWRlL2FkbWluZm9vdGVyLmluYyI+PC9qc3A6aW5jbHVkZT4NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi9pbWFnZXMvYXNmLWxvZ28uZ2lmIGIvdjEuNS4xUkMzL21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvaW1hZ2VzL2FzZi1sb2dvLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI0MDMyOC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi9pbWFnZXMvYXNmLWxvZ28uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvaW1hZ2VzL2F4aXMuZ2lmIGIvdjEuNS4xUkMzL21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvaW1hZ2VzL2F4aXMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTcwYzViLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi93ZWJhcHAvYXhpczItd2ViL2ltYWdlcy9heGlzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi93ZWJhcHAvYXhpczItd2ViL2ltYWdlcy9heGlzLmpwZyBiL3YxLjUuMVJDMy9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi93ZWJhcHAvYXhpczItd2ViL2ltYWdlcy9heGlzLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdmOTc2Mi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi9pbWFnZXMvYXhpcy5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi9pbWFnZXMvYXhpc19sLmpwZyBiL3YxLjUuMVJDMy9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi93ZWJhcHAvYXhpczItd2ViL2ltYWdlcy9heGlzX2wuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzJhNzU1Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi93ZWJhcHAvYXhpczItd2ViL2ltYWdlcy9heGlzX2wuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvaW5jbHVkZS9hZG1pbmZvb3Rlci5pbmMgYi92MS41LjFSQzMvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi9pbmNsdWRlL2FkbWluZm9vdGVyLmluYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQyMjU3MS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi9pbmNsdWRlL2FkbWluZm9vdGVyLmluYworKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLTwvdGQ+PC90cj4KLTwvdGFibGU+Ci08anNwOmluY2x1ZGUgcGFnZT0iZm9vdGVyLmluYyI+PC9qc3A6aW5jbHVkZT4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi9pbmNsdWRlL2FkbWluaGVhZGVyLmluYyBiL3YxLjUuMVJDMy9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi93ZWJhcHAvYXhpczItd2ViL2luY2x1ZGUvYWRtaW5oZWFkZXIuaW5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWQ1ZTA5Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi93ZWJhcHAvYXhpczItd2ViL2luY2x1ZGUvYWRtaW5oZWFkZXIuaW5jCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotPHRhYmxlIHdpZHRoPSIxMDAlIj4KLSAgPHRyPgotICAgIDx0ZCBhbGlnbj0ibGVmdCI+PGltZyBzcmM9ImF4aXMyLXdlYi9pbWFnZXMvYXNmLWxvZ28uZ2lmIi8+PGgxPkF4aXMgMjwvaDE+PC90ZD4KLSAgICA8dGQgYWxpZ249InJpZ2h0Ij48aW1nIHNyYz0iYXhpczItd2ViL2ltYWdlcy9heGlzLmpwZyIvPjwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgPHRkPi48L3RkPgotICAgPHRkIGFsaWduPSJyaWdodCI+PGEgaHJlZj0ibG9nb3V0IiB0YXJnZXQ9Il9wYXJlbnQiID5Mb2cgb3V0PC9hPjwvdGQ+Ci0gICA8L3RyPgotPC90YWJsZT4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi93ZWJhcHAvYXhpczItd2ViL2luY2x1ZGUvYWRtaW5oZWFkZXIuanNwIGIvdjEuNS4xUkMzL21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvaW5jbHVkZS9hZG1pbmhlYWRlci5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2ODdlODIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvaW5jbHVkZS9hZG1pbmhlYWRlci5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi08JS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLSU+DQotDQotPCVAIHBhZ2UgaW1wb3J0PSJvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50cyIgJT4NCi08JUAgcGFnZSBpbXBvcnQ9Im9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dCIgJT4NCi08JUAgcGFnZSBpbXBvcnQ9Im9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5TZXJ2aWNlQ29udGV4dCIgJT4NCi08JUAgcGFnZSBpbXBvcnQ9Im9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5TZXJ2aWNlR3JvdXBDb250ZXh0IiAlPg0KLTwlQCBwYWdlIGltcG9ydD0ib3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LnV0aWwuUGhhc2VzSW5mbyIgJT4NCi08JUAgcGFnZSBpbXBvcnQ9Im9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc01vZHVsZSIgJT4NCi08JUAgcGFnZSBpbXBvcnQ9Im9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbiIgJT4NCi08JUAgcGFnZSBpbXBvcnQ9Im9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2UiICU+DQotPCVAIHBhZ2UgaW1wb3J0PSJvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlR3JvdXAiICU+DQotPCVAIHBhZ2UgaW1wb3J0PSJvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlBhcmFtZXRlciIgJT4NCi08JUAgcGFnZSBpbXBvcnQ9Im9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0aW9uIiAlPg0KLTwlQCBwYWdlIGltcG9ydD0ib3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuSGFuZGxlciIgJT4NCi08JUAgcGFnZSBpbXBvcnQ9Im9yZy5hcGFjaGUuYXhpczIuZW5naW5lLlBoYXNlIiAlPg0KLTwlQCBwYWdlIGltcG9ydD0ib3JnLmFwYWNoZS5heGlzMi51dGlsLkphdmFVdGlscyIgJT4NCi08JUAgcGFnZSBpbXBvcnQ9ImphdmEudXRpbC5BcnJheUxpc3QiICU+DQotPCVAIHBhZ2UgaW1wb3J0PSJqYXZhLnV0aWwuQ29sbGVjdGlvbiIgJT4NCi08JUAgcGFnZSBpbXBvcnQ9ImphdmEudXRpbC5FbnVtZXJhdGlvbiIgJT4NCi08JUAgcGFnZSBpbXBvcnQ9ImphdmEudXRpbC5IYXNoTWFwIiAlPg0KLTwlQCBwYWdlIGltcG9ydD0iamF2YS51dGlsLkhhc2h0YWJsZSIgJT4NCi08JUAgcGFnZSBpbXBvcnQ9ImphdmEudXRpbC5JdGVyYXRvciIgJT4NCi08JS0tDQotfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLX4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi1+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLX4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLX4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLX4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotfg0KLX4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotfg0KLX4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLX4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi1+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLX4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi1+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi1+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tJT4NCi08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMSIgbGFuZ3VhZ2U9ImphdmEiICU+DQotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+DQotPGh0bWw+DQotICA8aGVhZD4NCi0gICAgPGpzcDppbmNsdWRlIHBhZ2U9Ii4uL2luY2x1ZGUvaHR0cGJhc2UuanNwIi8+DQotICAgIDx0aXRsZT5BeGlzMiA6OiBBZG1pbmlzdHJhdGlvbiBQYWdlPC90aXRsZT4NCi0gICAgPGxpbmsgaHJlZj0iYXhpczItd2ViL2Nzcy9heGlzLXN0eWxlLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIvPg0KLSAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIi8+DQotICA8L2hlYWQ+DQotDQotICA8Ym9keT4NCi0gICAgPGpzcDppbmNsdWRlIHBhZ2U9ImhlYWRlci5pbmMiLz4NCi0gICAgPHRhYmxlIGNsYXNzPSJGVUxMX0JMQU5LIj4NCi0gICAgICA8dHI+DQotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMCUiPg0KLSAgICAgICAgICA8anNwOmluY2x1ZGUgcGFnZT0iLi4vTGVmdEZyYW1lLmpzcCIvPg0KLSAgICAgICAgPC90ZD4NCi0gICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiIHdpZHRoPSI4MCUiPg0KLSAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIj4NCi0gICAgICAgICAgPHRyPg0KLSAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiIGNvbHNwYW49IjIiPjxhIGhyZWY9IiMiIG9uY2xpY2s9ImphdmFzY3JpcHQ6aGlzdG9yeS5iYWNrKCk7Ij5CYWNrPC9hPiZuYnNwOyZuYnNwO3wmbmJzcDsmbmJzcDs8YQ0KLSAgICAgICAgICAgICAgaHJlZj0iYXhpczItYWRtaW4vbG9nb3V0Ij5Mb2cgb3V0PC9hPjwvdGQ+DQotICAgICAgICAgIDwvdHI+DQotICAgICAgICA8L3RhYmxlPg0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi93ZWJhcHAvYXhpczItd2ViL2luY2x1ZGUvZm9vdGVyLmluYyBiL3YxLjUuMVJDMy9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi93ZWJhcHAvYXhpczItd2ViL2luY2x1ZGUvZm9vdGVyLmluYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjYwYjk0NS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi9pbmNsdWRlL2Zvb3Rlci5pbmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci08L3RkPgotPC90cj4KLTx0ciBoZWlnaHQ9IjIwcHgiPgotCTx0ZD4KLQk8dGFibGUgd2lkdGg9IjEwMCUiPgotCQk8dHI+PHRkPgotCQkJPHRhYmxlIHdpZHRoPSI5NTBweCI+Ci0JCQkJPHRyPjx0ZD48aHIgc2l6ZT0iMSIgbm9zaGFkZT0iIiAvPjwvdGQ+PC90cj4KLQkJCQk8dHI+Ci0JCQkJCTx0ZCBhbGlnbj0iY2VudGVyIj5Db3B5cmlnaHQgJiMxNjk7IDE5OTktMjAwNiwgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uPGJyIC8+TGljZW5zZWQgdW5kZXIgdGhlIDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+QXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wPC9hPi48L3RkPgotCQkJCTwvdHI+Ci0JCQk8L3RhYmxlPgotCQk8L3RkPgotCQk8dGQ+Jm5ic3A7PC90ZD4KLQkJPC90cj4KLQk8L3RhYmxlPgotCTwvdGQ+Ci08L3RyPgotPC90YWJsZT4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi93ZWJhcHAvYXhpczItd2ViL2luY2x1ZGUvaGVhZGVyLmluYyBiL3YxLjUuMVJDMy9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi93ZWJhcHAvYXhpczItd2ViL2luY2x1ZGUvaGVhZGVyLmluYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ0MGY5Mi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi9pbmNsdWRlL2hlYWRlci5pbmMKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci08dGFibGUgY2xhc3M9IkZVTExfQkxBTksiPjx0ciBoZWlnaHQ9IjEwMCUiPjx0ZCB2YWxpZ249InRvcCI+Ci08dGFibGUgd2lkdGg9IjEwMCUiPgotPHRyPjx0ZD4KLTx0YWJsZSB3aWR0aD0iOTUwcHgiPgotICA8dHI+Ci0gICAgPHRkIGFsaWduPSJsZWZ0Ij48aW1nIHNyYz0iYXhpczItd2ViL2ltYWdlcy9hc2YtbG9nby5naWYiLz48L3RkPgotICAgIDx0ZCBhbGlnbj0icmlnaHQiPjxpbWcgc3JjPSJheGlzMi13ZWIvaW1hZ2VzL2F4aXNfbC5qcGciLz48L3RkPgotICAgIDwvdHI+Ci08L3RhYmxlPgotPC90ZD4KLTx0ZD4mbmJzcDs8L3RkPjwvdHI+PC90YWJsZT4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi93ZWJhcHAvYXhpczItd2ViL2luY2x1ZGUvaHR0cGJhc2UuanNwIGIvdjEuNS4xUkMzL21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvaW5jbHVkZS9odHRwYmFzZS5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwZjg2M2MuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvaW5jbHVkZS9odHRwYmFzZS5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi08JS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0lPgotCi08JUAgcGFnZSBpbXBvcnQ9Im9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0IiAlPgotPCVAIHBhZ2UgaW1wb3J0PSJvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50cyIgJT4KLTwlQCBwYWdlIGltcG9ydD0ib3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlIiAlPgotPCVAIHBhZ2UgaW1wb3J0PSJvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5PcHRpb25zIiAlPgotPCVAIHBhZ2UgaW1wb3J0PSJvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5TZXJ2aWNlQ2xpZW50IiAlPgotPCVAIHBhZ2UgaW1wb3J0PSJvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQiICU+Ci08JUAgcGFnZSBpbXBvcnQ9Im9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkiICU+Ci08JUAgcGFnZSBpbXBvcnQ9Im9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5TZXJ2aWNlQ29udGV4dCIgJT4KLTwlQCBwYWdlIGltcG9ydD0ib3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LlNlcnZpY2VHcm91cENvbnRleHQiICU+Ci08JUAgcGFnZSBpbXBvcnQ9Im9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC51dGlsLlBoYXNlc0luZm8iICU+Ci08JUAgcGFnZSBpbXBvcnQ9Im9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc01vZHVsZSIgJT4KLTwlQCBwYWdlIGltcG9ydD0ib3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uIiAlPgotPCVAIHBhZ2UgaW1wb3J0PSJvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlIiAlPgotPCVAIHBhZ2UgaW1wb3J0PSJvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlR3JvdXAiICU+Ci08JUAgcGFnZSBpbXBvcnQ9Im9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVyIiAlPgotPCVAIHBhZ2UgaW1wb3J0PSJvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzQ29uZmlndXJhdGlvbiIgJT4KLTwlQCBwYWdlIGltcG9ydD0ib3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuSGFuZGxlciIgJT4KLTwlQCBwYWdlIGltcG9ydD0ib3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuUGhhc2UiICU+Ci08JUAgcGFnZSBpbXBvcnQ9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuQXhpc1NlcnZsZXQiICU+Ci08JUAgcGFnZSBpbXBvcnQ9Im9yZy5hcGFjaGUuYXhpczIudXRpbC5KYXZhVXRpbHMiICU+Ci08JUAgcGFnZSBpbXBvcnQ9ImphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlciIgJT4KLTwlQCBwYWdlIGltcG9ydD0iamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeSIgJT4KLTwlQCBwYWdlIGltcG9ydD0iamF2YS5pby5JT0V4Y2VwdGlvbiIgJT4KLTwlQCBwYWdlIGltcG9ydD0iamF2YS5pby5JbnB1dFN0cmVhbSIgJT4KLTwlQCBwYWdlIGltcG9ydD0iamF2YS5pby5TdHJpbmdXcml0ZXIiICU+Ci08JUAgcGFnZSBpbXBvcnQ9ImphdmEudXRpbC5BcnJheUxpc3QiICU+Ci08JUAgcGFnZSBpbXBvcnQ9ImphdmEudXRpbC5Db2xsZWN0aW9uIiAlPgotPCVAIHBhZ2UgaW1wb3J0PSJqYXZhLnV0aWwuRW51bWVyYXRpb24iICU+Ci08JUAgcGFnZSBpbXBvcnQ9ImphdmEudXRpbC5IYXNoTWFwIiAlPgotPCVAIHBhZ2UgaW1wb3J0PSJqYXZhLnV0aWwuSGFzaHRhYmxlIiAlPgotPCVAIHBhZ2UgaW1wb3J0PSJqYXZhLnV0aWwuSXRlcmF0b3IiICU+Ci08JSEKLSAgcHJpdmF0ZSBTdHJpbmcgZnJvbnRlbmRIb3N0VXJsOwotCi0gIHB1YmxpYyB2b2lkIGpzcEluaXQoKSB7Ci0gICAgU2VydmxldENvbnRleHQgY29udGV4dCA9IHRoaXMuZ2V0U2VydmxldENvbmZpZygpLmdldFNlcnZsZXRDb250ZXh0KCk7Ci0gICAgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnY3R4ID0gKENvbmZpZ3VyYXRpb25Db250ZXh0KSBjb250ZXh0LmdldEF0dHJpYnV0ZShBeGlzU2VydmxldC5DT05GSUdVUkFUSU9OX0NPTlRFWFQpOwotICAgIGlmIChjb25maWdjdHggIT0gbnVsbCl7Ci0gICAgICAgIFBhcmFtZXRlciBwYXJhbWV0ZXIgPSBjb25maWdjdHguZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5nZXRQYXJhbWV0ZXIoQ29uc3RhbnRzLkhUVFBfRlJPTlRFTkRfSE9TVF9VUkwpOwotICAgICAgICBpZiAocGFyYW1ldGVyICE9IG51bGwpIHsKLSAgICAgICAgICBmcm9udGVuZEhvc3RVcmwgPSAoU3RyaW5nKSBwYXJhbWV0ZXIuZ2V0VmFsdWUoKTsKLSAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgY2FsY3VsYXRlSHR0cEJhc2UoSHR0cFNlcnZsZXRSZXF1ZXN0IGFSZXF1ZXN0KSB7Ci0gICAgU3RyaW5nQnVmZmVyIHN0cmluZ0J1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICBpZiAoZnJvbnRlbmRIb3N0VXJsICE9IG51bGwpIHsKLSAgICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoZnJvbnRlbmRIb3N0VXJsKTsKLSAgICB9IGVsc2UgewotICAgICAgU3RyaW5nIHNjaGVtZSA9IGFSZXF1ZXN0LmdldFNjaGVtZSgpOwotICAgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChzY2hlbWUpOwotICAgICAgc3RyaW5nQnVmZmVyLmFwcGVuZCgiOi8vIik7Ci0gICAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKGFSZXF1ZXN0LmdldFNlcnZlck5hbWUoKSk7Ci0gICAgICBpZiAoKCJodHRwIi5lcXVhbHNJZ25vcmVDYXNlKHNjaGVtZSkgJiYgYVJlcXVlc3QuZ2V0U2VydmVyUG9ydCgpICE9IDgwKSB8fCAiaHR0cHMiLmVxdWFsc0lnbm9yZUNhc2Uoc2NoZW1lKSAmJiBhUmVxdWVzdC5nZXRTZXJ2ZXJQb3J0KCkgIT0gNDQzKQotICAgICAgewotICAgICAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKCI6Iik7Ci0gICAgICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoYVJlcXVlc3QuZ2V0U2VydmVyUG9ydCgpKTsKLSAgICAgIH0KLSAgICAgIC8vIEkgdGhpbmsgaSBzYXcgd2ViIGNvbnRhaW5lcnMgcmV0dXJuIG51bGwgZm9yIHJvb3Qgd2ViIGNvbnRleHQKLSAgICAgIGlmIChhUmVxdWVzdC5nZXRDb250ZXh0UGF0aCgpICE9IG51bGwpIHsKLSAgICAgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChhUmVxdWVzdC5nZXRDb250ZXh0UGF0aCgpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgLy8gYXBwZW5kIC8gY2hhciBpZiBuZWVkZWQKLSAgICBpZiAoc3RyaW5nQnVmZmVyLmNoYXJBdChzdHJpbmdCdWZmZXIubGVuZ3RoKCkgLSAxKSAhPSAnLycpIHsKLSAgICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoIi8iKTsKLSAgICB9Ci0gICAgU3RyaW5nIGN1cmVudFVybCA9IHN0cmluZ0J1ZmZlci50b1N0cmluZygpOwotICAgIGFSZXF1ZXN0LnNldEF0dHJpYnV0ZSgiZnJvbnRlbmRIb3N0VXJsIiwgY3VyZW50VXJsKTsKLSAgICByZXR1cm4gY3VyZW50VXJsOwotICB9Ci0lPjxiYXNlIGhyZWY9IjwlPSBjYWxjdWxhdGVIdHRwQmFzZShyZXF1ZXN0KSU+Ii8+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvaW5jbHVkZS9saW5rLWZvb3Rlci5pbmMgYi92MS41LjFSQzMvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi9pbmNsdWRlL2xpbmstZm9vdGVyLmluYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODc3OGNlMi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi9pbmNsdWRlL2xpbmstZm9vdGVyLmluYworKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLTx0YWJsZSB3aWR0aD0iMTAwJSI+Ci0gPHRyPgotICAgPHRkIGFsaWduPSJjZW50ZXIiPjxhIGhyZWY9ImluZGV4LmpzcCI+QmFjayBIb21lPC9hPjwvdGQ+Ci0gICA8L3RyPgotPC90YWJsZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi9pbmNsdWRlL2xpbmstZm9vdGVyLmpzcCBiL3YxLjUuMVJDMy9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi93ZWJhcHAvYXhpczItd2ViL2luY2x1ZGUvbGluay1mb290ZXIuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjZlMDFiLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi93ZWJhcHAvYXhpczItd2ViL2luY2x1ZGUvbGluay1mb290ZXIuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotPCUtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0lPg0KLQ0KLTwlQCBwYWdlIGltcG9ydD0ib3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQiICU+DQotPCVAIHBhZ2UgaW1wb3J0PSJvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50cyIgJT4NCi08JUAgcGFnZSBpbXBvcnQ9Im9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZSIgJT4NCi08JUAgcGFnZSBpbXBvcnQ9Im9yZy5hcGFjaGUuYXhpczIuY2xpZW50Lk9wdGlvbnMiICU+DQotPCVAIHBhZ2UgaW1wb3J0PSJvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5TZXJ2aWNlQ2xpZW50IiAlPg0KLTwlQCBwYWdlIGltcG9ydD0ib3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0IiAlPg0KLTwlQCBwYWdlIGltcG9ydD0ib3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeSIgJT4NCi08JUAgcGFnZSBpbXBvcnQ9Im9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbiIgJT4NCi08JUAgcGFnZSBpbXBvcnQ9Im9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2UiICU+DQotPCVAIHBhZ2UgaW1wb3J0PSJvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlBhcmFtZXRlciIgJT4NCi08JUAgcGFnZSBpbXBvcnQ9Im9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0aW9uIiAlPg0KLTwlQCBwYWdlIGltcG9ydD0ib3JnLmFwYWNoZS5heGlzMi51dGlsLkphdmFVdGlscyIgJT4NCi08JUAgcGFnZSBpbXBvcnQ9ImphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlciIgJT4NCi08JUAgcGFnZSBpbXBvcnQ9ImphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3RvcnkiICU+DQotPCVAIHBhZ2UgaW1wb3J0PSJqYXZhLmlvLklPRXhjZXB0aW9uIiAlPg0KLTwlQCBwYWdlIGltcG9ydD0iamF2YS5pby5JbnB1dFN0cmVhbSIgJT4NCi08JUAgcGFnZSBpbXBvcnQ9ImphdmEuaW8uU3RyaW5nV3JpdGVyIiAlPg0KLTwlQCBwYWdlIGltcG9ydD0iamF2YS51dGlsLkNvbGxlY3Rpb24iICU+DQotPCVAIHBhZ2UgaW1wb3J0PSJqYXZhLnV0aWwuRW51bWVyYXRpb24iICU+DQotPCVAIHBhZ2UgaW1wb3J0PSJqYXZhLnV0aWwuSGFzaE1hcCIgJT4NCi08JUAgcGFnZSBpbXBvcnQ9ImphdmEudXRpbC5IYXNodGFibGUiICU+DQotPCVAIHBhZ2UgaW1wb3J0PSJqYXZhLnV0aWwuSXRlcmF0b3IiICU+DQotPCUtLQ0KLX4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLX4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi1+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi1+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi1+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi1+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLX4NCi1+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLX4NCi1+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi1+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi1+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotfiB1bmRlciB0aGUgTGljZW5zZS4NCi0tLSU+DQotPHRhYmxlIHdpZHRoPSIxMDAlIj4NCi0JPHRyPjx0ZD4NCi0JCTx0YWJsZSB3aWR0aD0iOTUwcHgiPg0KLQkJCTx0cj4NCi0JCQkJPHRkIGFsaWduPSJyaWdodCI+PGEgaHJlZj0iYXhpczItd2ViL2luZGV4LmpzcCI+QmFjayBIb21lPC9hPiZuYnNwOyZuYnNwO3wmbmJzcDsmbmJzcDsgPGEgaHJlZj0iIyIgb25jbGljaz0iamF2YXNjcmlwdDp3aW5kb3cubG9jYXRpb24ucmVsb2FkKHRydWUpO3JldHVybiBmYWxzZTsiPlJlZnJlc2g8L2E+PC90ZD4NCi0JCQk8L3RyPg0KLQkJPC90YWJsZT4NCi0JPC90ZD4NCi0JPHRkPiZuYnNwOzwvdGQ+PC90cj4NCi08L3RhYmxlPg0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi93ZWJhcHAvYXhpczItd2ViL2luZGV4LmpzcCBiL3YxLjUuMVJDMy9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi93ZWJhcHAvYXhpczItd2ViL2luZGV4LmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjdlZDM1My4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi9pbmRleC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi08JS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLSU+DQotDQotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDtjaGFyc2V0PVVURi04IiBsYW5ndWFnZT0iamF2YSIgJT4NCi08aHRtbD4NCi0gIDxoZWFkPg0KLSAgICA8anNwOmluY2x1ZGUgcGFnZT0iaW5jbHVkZS9odHRwYmFzZS5qc3AiLz4NCi0gICAgPHRpdGxlPkF4aXMgMiAtIEhvbWU8L3RpdGxlPg0KLSAgICA8bGluayBocmVmPSJheGlzMi13ZWIvY3NzL2F4aXMtc3R5bGUuY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIi8+DQotICA8L2hlYWQ+DQotDQotICA8Ym9keT4NCi0gICAgPGpzcDppbmNsdWRlIHBhZ2U9ImluY2x1ZGUvaGVhZGVyLmluYyIgLz4NCi0gICAgPGJyLz4NCi0NCi0gICAgPGgxPldlbGNvbWUhPC9oMT4NCi0gICAgV2VsY29tZSB0byB0aGUgbmV3IGdlbmVyYXRpb24gb2YgQXhpcy4gSWYgeW91IGNhbiBzZWUgdGhpcyBwYWdlIHlvdSBoYXZlDQotICAgIHN1Y2Nlc3NmdWxseSBkZXBsb3llZCB0aGUgQXhpczIgV2ViIEFwcGxpY2F0aW9uLiBIb3dldmVyLCB0byBlbnN1cmUgdGhhdCBBeGlzMg0KLSAgICBpcyBwcm9wZXJseSB3b3JraW5nLCB3ZSBlbmNvdXJhZ2UgeW91IHRvIGNsaWNrIG9uIHRoZSB2YWxpZGF0ZSBsaW5rLg0KLSAgICA8YnIvPg0KLSAgICA8dWw+DQotICAgICAgPGxpPjxhIGhyZWY9InNlcnZpY2VzL2xpc3RTZXJ2aWNlcyI+U2VydmljZXM8L2E+DQotICAgICAgICA8YnIvPg0KLSAgICAgICAgVmlldyB0aGUgbGlzdCBvZiBhbGwgdGhlIGF2YWlsYWJsZSBzZXJ2aWNlcyBkZXBsb3llZCBpbiB0aGlzIHNlcnZlci4NCi0gICAgICA8L2xpPg0KLSAgICAgIDxsaT48YSBocmVmPSJheGlzMi13ZWIvSGFwcHlBeGlzLmpzcCI+VmFsaWRhdGU8L2E+DQotICAgICAgICA8YnIvPg0KLSAgICAgICAgQ2hlY2sgdGhlIHN5c3RlbSB0byBzZWUgd2hldGhlciBhbGwgdGhlIHJlcXVpcmVkIGxpYnJhcmllcyBhcmUgaW4gcGxhY2UNCi0gICAgICAgIGFuZCB2aWV3IHRoZSBzeXN0ZW0gaW5mb3JtYXRpb24uDQotICAgICAgPC9saT4NCi0gICAgICA8JS0tPGxpPjxhIGhyZWY9ImludGVyb3AuanNwIj5EbyBhbiBpbnRlcm9wIHRlc3Q8L2E+DQotICAgICAgPGJyLz4NCi0gICAgICBZb3UgY2FuIHJ1biBJbnRlcm9wZXJhYmlsaXR5IHRlc3RzIGhlcmUNCi0gICAgICA8L2xpPi0tJT4NCi0gICAgICA8bGk+PGEgaHJlZj0iYXhpczItYWRtaW4vIj5BZG1pbmlzdHJhdGlvbjwvYT4NCi0gICAgICAgIDxici8+DQotICAgICAgICBDb25zb2xlIGZvciBhZG1pbmlzdGVyaW5nIHRoaXMgQXhpczIgaW5zdGFsbGF0aW9uLg0KLSAgICAgIDwvbGk+DQotICAgIDwvdWw+DQotICAgIDxqc3A6aW5jbHVkZSBwYWdlPSJpbmNsdWRlL2Zvb3Rlci5pbmMiLz4NCi0gIDwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvbGlzdEZhdWx0eVNlcnZpY2UuanNwIGIvdjEuNS4xUkMzL21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvbGlzdEZhdWx0eVNlcnZpY2UuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTMxZDAzLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi93ZWJhcHAvYXhpczItd2ViL2xpc3RGYXVsdHlTZXJ2aWNlLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLTwlLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLSU+Ci0KLTwlQCBwYWdlIGltcG9ydD0ib3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHMsCi0gICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbiIlPgotPCVAIHBhZ2UgaW1wb3J0PSJvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlIiU+Ci08JUAgcGFnZSBpbXBvcnQ9ImphdmEudXRpbC5IYXNodGFibGUiJT4KLTwlQCBwYWdlIGltcG9ydD0iamF2YS51dGlsLkl0ZXJhdG9yIiU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sO2NoYXJzZXQ9VVRGLTgiIGxhbmd1YWdlPSJqYXZhIiAlPgotPGh0bWw+Ci0gIDxoZWFkPgotICAgIDxqc3A6aW5jbHVkZSBwYWdlPSJpbmNsdWRlL2h0dHBiYXNlLmpzcCIvPgotICAgIDx0aXRsZT5MaXN0IFNpbmdsZSBzZXJ2aWNlPC90aXRsZT4KLSAgICA8bGluayBocmVmPSJheGlzMi13ZWIvY3NzL2F4aXMtc3R5bGUuY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4KLSAgPC9oZWFkPgotICA8Ym9keT4KLSAgPGpzcDppbmNsdWRlIHBhZ2U9ImluY2x1ZGUvaGVhZGVyLmluYyI+PC9qc3A6aW5jbHVkZT4KLSAgICA8anNwOmluY2x1ZGUgcGFnZT0iaW5jbHVkZS9saW5rLWZvb3Rlci5qc3AiPjwvanNwOmluY2x1ZGU+Ci0gIDwlCi0gICAgICAgIFN0cmluZyBwcmlmaXggPSByZXF1ZXN0LmdldEF0dHJpYnV0ZSgiZnJvbnRlbmRIb3N0VXJsIikgKyAoU3RyaW5nKXJlcXVlc3QuZ2V0U2Vzc2lvbigpLmdldEF0dHJpYnV0ZShDb25zdGFudHMuU0VSVklDRV9QQVRIKSArInNlcnZpY2VzLyI7Ci0gICAgJT4KLSAgICAgICAgPCUKLSAgICAgICAgICAgIFN0cmluZyBpc0ZhdWx0ID0gKFN0cmluZylyZXF1ZXN0LmdldFNlc3Npb24oKS5nZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLklTX0ZBVUxUWSk7Ci0gICAgICAgICAgICBTdHJpbmcgc2VydmljTmFtZSA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJzZXJ2aWNlTmFtZSIpOwotICAgICAgICAgICAgaWYoQ29uc3RhbnRzLklTX0ZBVUxUWS5lcXVhbHMoaXNGYXVsdCkpewotICAgICAgICAgICAgICAgIEhhc2h0YWJsZSBlcnJvcm5lc3NzZXJ2aWNlcyA9KEhhc2h0YWJsZSlyZXF1ZXN0LmdldFNlc3Npb24oKS5nZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLkVSUk9SX1NFUlZJQ0VfTUFQKTsKLSAgICAgICAgICAgICAgICAlPgotICAgICAgICAgICAgICAgICAgICA8aDM+VGhpcyBXZWIgYXhpc1NlcnZpY2UgaGFzIGRlcGxveW1lbnQgZmF1bHRzPC9oMz48JQotICAgICAgICAgICAgICAgICAgICAgJT48Zm9udCBjb2xvcj0icmVkIiA+PCU9KFN0cmluZyllcnJvcm5lc3NzZXJ2aWNlcy5nZXQoc2VydmljTmFtZSkgJT48L2ZvbnQ+Ci0gICAgICAgICAgICAgICAgPCUKLQotICAgICAgICAgICAgICAgICAgICB9ZWxzZSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBeGlzU2VydmljZSkgcmVxdWVzdC5nZXRTZXNzaW9uKCkuZ2V0QXR0cmlidXRlKENvbnN0YW50cy5TSU5HTEVfU0VSVklDRSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmKGF4aXNTZXJ2aWNlIT1udWxsKXsKLSAgICAgICAgICAgSXRlcmF0b3Igb3BJdHIgPSBheGlzU2VydmljZS5nZXRPcGVyYXRpb25zKCk7Ci0gICAgICAgICAgICAvL29wZXJhdGlvbnNMaXN0ID0gb3BlcmF0aW9ucy52YWx1ZXMoKTsKLSAgICAgICAgICBTdHJpbmcgIHNlcnZpY2VOYW1lID0gYXhpc1NlcnZpY2UuZ2V0TmFtZSgpOwotICAgICAgICAgICAgJT48aDI+PGZvbnQgY29sb3I9ImJsdWUiPjxhIGhyZWY9IjwlPXByaWZpeCArIGF4aXNTZXJ2aWNlLmdldE5hbWUoKSU+P3dzZGwiPjwlPXNlcnZpY2VOYW1lJT48L2E+PC9mb250PjwvaDI+Ci0gICAgICAgICAgIDxmb250IGNvbG9yPSJibHVlIj5TZXJ2aWNlIEVQUiA6IDwvZm9udD48Zm9udCBjb2xvcj0iYmxhY2siPjwlPXByaWZpeCArIGF4aXNTZXJ2aWNlLmdldE5hbWUoKSU+PC9mb250Pjxicj4KLSAgICAgICAgICAgPGg0PlNlcnZpY2UgRGVzY3JpcHRpb24gOiA8Zm9udCBjb2xvcj0iYmxhY2siPjwlPWF4aXNTZXJ2aWNlLmdldFNlcnZpY2VEZXNjcmlwdGlvbigpJT48L2ZvbnQ+PC9oND4KLSAgICAgICAgICAgPGk+PGZvbnQgY29sb3I9ImJsdWUiPlNlcnZpY2UgU3RhdHVzIDogPCU9YXhpc1NlcnZpY2UuaXNBY3RpdmUoKT8iQWN0aXZlIjoiSW5BY3RpdmUiJT48L2ZvbnQ+PC9pPjxicj4KLSAgICAgICAgICAgPCUKLSAgICAgICAgICAgIGlmIChvcEl0ci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAlPjxpPkF2YWlsYWJsZSBvcGVyYXRpb25zPC9pPjwlCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICU+PGk+IFRoZXJlIGFyZSBubyBPcGVyYXRpb25zIHNwZWNpZmllZDwvaT48JQotICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgb3BJdHIgPSBheGlzU2VydmljZS5nZXRPcGVyYXRpb25zKCk7Ci0gICAgICAgICAgICU+PHVsPjwlCi0gICAgICAgICAgICB3aGlsZSAob3BJdHIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uID0gKEF4aXNPcGVyYXRpb24pIG9wSXRyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAlPjxsaT48JT1heGlzT3BlcmF0aW9uLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKSU+PC9saT4KLSAgICAgICAgICAgICAgICA8JQotICAgICAgICAgICAgfQotICAgICAgICAgICAlPjwvdWw+Ci0gICAgICAgICAgIDwlCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICU+Ci0gICAgICAgICAgICAgICAgPGgzPjxmb250IGNvbG9yPSJyZWQiID5ObyBzZXJ2aWNlcyBmb3VuZCBpbiB0aGlzIGxvY2F0aW9uLjwvZm9udD48L2gzPgotIDwlCi0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfQotICAgICAgICAlPgotPGpzcDppbmNsdWRlIHBhZ2U9ImluY2x1ZGUvZm9vdGVyLmluYyI+PC9qc3A6aW5jbHVkZT4KLSAgICAgICAgPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvbGlzdEdyb3VwU2VydmljZS5qc3AgYi92MS41LjFSQzMvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi9saXN0R3JvdXBTZXJ2aWNlLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFlZTA0MC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi9saXN0R3JvdXBTZXJ2aWNlLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi08JS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLSU+DQotDQotPCVAIHBhZ2UgaW1wb3J0PSJvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50cyIgJT4NCi08JUAgcGFnZSBpbXBvcnQ9Im9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc01vZHVsZSIgJT4NCi08JUAgcGFnZSBpbXBvcnQ9Im9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbiIgJT4NCi08JUAgcGFnZSBpbXBvcnQ9Im9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2UiICU+DQotPCVAIHBhZ2UgaW1wb3J0PSJqYXZhLnV0aWwuQ29sbGVjdGlvbiIgJT4NCi08JUAgcGFnZSBpbXBvcnQ9ImphdmEudXRpbC5IYXNoTWFwIiAlPg0KLTwlQCBwYWdlIGltcG9ydD0iamF2YS51dGlsLkl0ZXJhdG9yIiAlPg0KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7Y2hhcnNldD1VVEYtOCIgbGFuZ3VhZ2U9ImphdmEiICU+DQotPGh0bWw+DQotPGhlYWQ+DQotICA8anNwOmluY2x1ZGUgcGFnZT0iaW5jbHVkZS9odHRwYmFzZS5qc3AiLz4NCi0gIDx0aXRsZT5MaXN0IFNlcnZpY2VzPC90aXRsZT4NCi0gIDxsaW5rIGhyZWY9ImF4aXMyLXdlYi9jc3MvYXhpcy1zdHlsZS5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIC8+DQotPC9oZWFkPg0KLQ0KLTxib2R5Pg0KLTxqc3A6aW5jbHVkZSBwYWdlPSJpbmNsdWRlL2FkbWluaGVhZGVyLmpzcCI+DQotPC9qc3A6aW5jbHVkZT4NCi08aDE+QXZhaWxhYmxlIHNlcnZpY2VzPC9oMT4NCi08JQ0KLSAgU3RyaW5nIHByaWZpeCA9IHJlcXVlc3QuZ2V0QXR0cmlidXRlKCJmcm9udGVuZEhvc3RVcmwiKSArIChTdHJpbmcpcmVxdWVzdC5nZXRTZXNzaW9uKCkuZ2V0QXR0cmlidXRlKENvbnN0YW50cy5TRVJWSUNFX1BBVEgpICsiLyI7DQotJT4NCi08JQ0KLSAgSGFzaE1hcCBzZXJ2aWNlTWFwID0gKEhhc2hNYXApIHJlcXVlc3QuZ2V0U2Vzc2lvbigpLmdldEF0dHJpYnV0ZShDb25zdGFudHMuU0VSVklDRV9NQVApOw0KLSAgcmVxdWVzdC5nZXRTZXNzaW9uKCkuc2V0QXR0cmlidXRlKENvbnN0YW50cy5TRVJWSUNFX01BUCxudWxsKTsNCi0gIFN0cmluZyBzZXJ2aWNOYW1lID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoInNlcnZpY2VOYW1lIik7DQotICBBeGlzU2VydmljZSBheGlzU2VydmljZSA9IChBeGlzU2VydmljZSkgc2VydmljZU1hcC5nZXQoc2VydmljTmFtZSk7DQotICBpZiAoYXhpc1NlcnZpY2UgIT0gbnVsbCkgew0KLSAgICBJdGVyYXRvciBvcGVyYXRpb25zOw0KLSAgICBTdHJpbmcgc2VydmljZU5hbWU7DQotICAgIG9wZXJhdGlvbnMgPSBheGlzU2VydmljZS5nZXRPcGVyYXRpb25zKCk7DQotICAgIHNlcnZpY2VOYW1lID0gYXhpc1NlcnZpY2UuZ2V0TmFtZSgpOw0KLSU+PGhyPg0KLQ0KLTxoMj48Zm9udCBjb2xvcj0iYmx1ZSI+PGEgaHJlZj0iPCU9cHJpZml4ICsgYXhpc1NlcnZpY2UuZ2V0TmFtZSgpJT4/d3NkbCI+PCU9c2VydmljZU5hbWUlPjwvYT4NCi08L2ZvbnQ+PC9oMj4NCi08Zm9udCBjb2xvcj0iYmx1ZSI+U2VydmljZSBFUFIgOjwvZm9udD48Zm9udCBjb2xvcj0iYmxhY2siPjwlPXByaWZpeCArIGF4aXNTZXJ2aWNlLmdldE5hbWUoKSU+PC9mb250Pg0KLTxoND5TZXJ2aWNlIERlc2NyaXB0aW9uIDogPGZvbnQgY29sb3I9ImJsYWNrIj48JT1heGlzU2VydmljZS5nZXRTZXJ2aWNlRGVzY3JpcHRpb24oKSU+PC9mb250PjwvaDQ+DQotPGk+PGZvbnQgY29sb3I9ImJsdWUiPlNlcnZpY2UgU3RhdHVzIDogPCU9YXhpc1NlcnZpY2UuaXNBY3RpdmUoKSA/ICJBY3RpdmUiIDogIkluQWN0aXZlIiU+PC9mb250PjwvaT48YnIvPg0KLTwlDQotICBDb2xsZWN0aW9uIGVuZ2FnZWRNb2R1bGVzID0gYXhpc1NlcnZpY2UuZ2V0RW5nYWdlZE1vZHVsZXMoKTsNCi0gIFN0cmluZyBtb2R1bGVOYW1lOw0KLSAgaWYgKGVuZ2FnZWRNb2R1bGVzLnNpemUoKSA+IDApIHsNCi0lPg0KLTxpPkVuZ2FnZWQgTW9kdWxlcyBmb3IgdGhlIEF4aXMgU2VydmljZTwvaT48dWw+DQotICA8JQ0KLSAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9ybSA9IGVuZ2FnZWRNb2R1bGVzLml0ZXJhdG9yKCk7IGl0ZXJhdG9ybS5oYXNOZXh0KCk7KSB7DQotICAgICAgQXhpc01vZHVsZSBheGlzT3BlcmF0aW9uID0gKEF4aXNNb2R1bGUpIGl0ZXJhdG9ybS5uZXh0KCk7DQotICAgICAgbW9kdWxlTmFtZSA9IGF4aXNPcGVyYXRpb24uZ2V0TmFtZSgpOw0KLSAgJT48bGk+PCU9bW9kdWxlTmFtZSU+PC9saT4NCi0gIDwlDQotICAgIH0lPg0KLTwvdWw+DQotPCUNCi0gIH0NCi0gIGlmIChvcGVyYXRpb25zLmhhc05leHQoKSkgew0KLSU+PGJyPjxpPkF2YWlsYWJsZSBvcGVyYXRpb25zPC9pPjwlDQotfSBlbHNlIHsNCi0lPjxpPiBUaGVyZSBhcmUgbm8gb3BlcmF0aW9ucyBzcGVjaWZpZWQ8L2k+PCUNCi0gIH0NCi0lPjx1bD48JQ0KLSAgb3BlcmF0aW9ucyA9IGF4aXNTZXJ2aWNlLmdldE9wZXJhdGlvbnMoKTsNCi0gIHdoaWxlIChvcGVyYXRpb25zLmhhc05leHQoKSkgew0KLSAgICBBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb24gPSAoQXhpc09wZXJhdGlvbikgb3BlcmF0aW9ucy5uZXh0KCk7DQotJT48bGk+PCU9YXhpc09wZXJhdGlvbi5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCklPjwvbGk+DQotICA8JQ0KLSAgICBlbmdhZ2VkTW9kdWxlcyA9IGF4aXNPcGVyYXRpb24uZ2V0RW5nYWdlZE1vZHVsZXMoKTsNCi0gICAgaWYgKGVuZ2FnZWRNb2R1bGVzLnNpemUoKSA+IDApIHsNCi0gICU+DQotICA8YnI+PGk+RW5nYWdlZCBNb2R1bGVzIGZvciB0aGUgT3BlcmF0aW9uPC9pPjx1bD4NCi0gIDwlDQotICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IyID0gZW5nYWdlZE1vZHVsZXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IyLmhhc05leHQoKTspIHsNCi0gICAgICBBeGlzTW9kdWxlIG1vZHVsZURlY3JpcHRpb24gPSAoQXhpc01vZHVsZSkgaXRlcmF0b3IyLm5leHQoKTsNCi0gICAgICBtb2R1bGVOYW1lID0gbW9kdWxlRGVjcmlwdGlvbi5nZXROYW1lKCk7DQotICAlPjxsaT48JT1tb2R1bGVOYW1lJT48L2xpPjxicj48JQ0KLSAgfQ0KLSU+PC91bD48JQ0KLSAgICB9DQotDQotICB9DQotJT48L3VsPg0KLTwlDQotICB9DQotJT4NCi08anNwOmluY2x1ZGUgcGFnZT0iaW5jbHVkZS9hZG1pbmZvb3Rlci5pbmMiPg0KLTwvanNwOmluY2x1ZGU+DQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi9saXN0TW9kdWxlcy5qc3AgYi92MS41LjFSQzMvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi9saXN0TW9kdWxlcy5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkNGFkYTYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvbGlzdE1vZHVsZXMuanNwCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotIDwlLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tJT4gPCVAIHBhZ2UgaW1wb3J0PSJvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50cywNCi0gICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc01vZHVsZSwNCi0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5Db2xsZWN0aW9uIiU+DQotIDwlQCBwYWdlIGltcG9ydD0iamF2YS51dGlsLkVudW1lcmF0aW9uIiU+DQotIDwlQCBwYWdlIGltcG9ydD0iamF2YS51dGlsLkhhc2hNYXAiJT4NCi0gPCVAIHBhZ2UgaW1wb3J0PSJqYXZhLnV0aWwuSGFzaHRhYmxlIiU+DQotIDwlQCBwYWdlIGltcG9ydD0iamF2YS51dGlsLkl0ZXJhdG9yIiU+DQotIDwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7Y2hhcnNldD1VVEYtOCIgbGFuZ3VhZ2U9ImphdmEiICU+DQotPGpzcDppbmNsdWRlIHBhZ2U9ImluY2x1ZGUvYWRtaW5oZWFkZXIuanNwIj48L2pzcDppbmNsdWRlPg0KLSAgPGgxPkF2YWlsYWJsZSBNb2R1bGVzPC9oMT4NCi0gICAgIDwlDQotICAgICAgICAgYm9vbGVhbiBmb3VuZE1vZHVsZXMgPSBmYWxzZTsNCi0JYm9vbGVhbiB3cm90ZVVMID0gZmFsc2U7DQotICAgICAgICAgSGFzaE1hcCBtb2R1bGVNYXAgPSAoSGFzaE1hcClyZXF1ZXN0LmdldFNlc3Npb24oKS5nZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLk1PRFVMRV9NQVApOw0KLSAgICAgICAgIHJlcXVlc3QuZ2V0U2Vzc2lvbigpLnNldEF0dHJpYnV0ZShDb25zdGFudHMuTU9EVUxFX01BUCxudWxsKTsNCi0gICAgICAgICBIYXNodGFibGUgZXJyb3JuZXNNb2R1bGVzID0oSGFzaHRhYmxlKXJlcXVlc3QuZ2V0U2Vzc2lvbigpLmdldEF0dHJpYnV0ZShDb25zdGFudHMuRVJST1JfTU9EVUxFX01BUCk7DQotICAgICAgICAgaWYgKG1vZHVsZU1hcCE9bnVsbCAmJiAhbW9kdWxlTWFwLmlzRW1wdHkoKSl7DQotICAgICAgICAgICAgIFN0cmluZyBtb2R1bGVuYW1lIDsNCi0gICAgICAgICAgICAgU3RyaW5nIG1vZHVsZURlc2NyaXB0aW9uIDsNCi0gICAgICAgICAgICAgQ29sbGVjdGlvbiBtb2R1bGVOYW1lcyA9IG1vZHVsZU1hcC52YWx1ZXMoKTsNCi0gICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IG1vZHVsZU5hbWVzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsNCi0gICAgICAgICAgICAgICAgIGZvdW5kTW9kdWxlcyA9IHRydWU7DQotICAgICAgICAgICAgICAgICBBeGlzTW9kdWxlICBtb2R1bGVRTmFtZSA9IChBeGlzTW9kdWxlKSBpdGVyYXRvci5uZXh0KCk7DQotICAgICAgICAgICAgICAgICBtb2R1bGVuYW1lID0gbW9kdWxlUU5hbWUuZ2V0TmFtZSgpOw0KLSAgICAgICAgICAgICAgICAgbW9kdWxlRGVzY3JpcHRpb24gPSBtb2R1bGVRTmFtZS5nZXRNb2R1bGVEZXNjcmlwdGlvbigpOw0KLSAgICAgICAgICAgICAgICAgaWYobW9kdWxlRGVzY3JpcHRpb249PW51bGwpew0KLSAgICAgICAgICAgICAgICAgICAgIG1vZHVsZURlc2NyaXB0aW9uID0gIlsgLS0gIE5vIG1vZHVsZSBkZXNjcmlwdGlvbiBmb3VuZCAgLS1dIjsNCi0gICAgICAgICAgICAgICAgIH0NCi0gICAgICAgIGlmICghd3JvdGVVTCl7DQotCQkJd3JvdGVVTCA9IHRydWU7DQotJT4NCi0JPHVsPg0KLTwlDQotCQl9DQotICAgICAlPjxsaT48Yj48JT1tb2R1bGVuYW1lJT48L2I+IDogPCU9bW9kdWxlRGVzY3JpcHRpb24lPjwvbGk+DQotICAgICAgPCUNCi0gICAgICAgICAgICAgfQ0KLQkJaWYgKHdyb3RlVUwpew0KLSU+DQotCTwvdWw+DQotPCUNCi0JCX0NCi0gICAgICAgIH0NCi0gICAgICAlPg0KLSAgICAgIDwlaWYoZXJyb3JuZXNNb2R1bGVzLnNpemUoKT4wKXsNCi0gICAgICAgICAgJT4NCi0gICAgICA8aDM+PGZvbnQgY29sb3I9InJlZCI+RmF1bHR5IE1vZHVsZXM8L2ZvbnQ+PC9oMz4NCi0gICAgICAgICAgICAgPCUNCi0gICAgICAgICAgICAgRW51bWVyYXRpb24gZmF1bHR5TW9kdWxlcyA9IGVycm9ybmVzTW9kdWxlcy5rZXlzKCk7DQotICAgICAgICAgICAgIHdoaWxlIChmYXVsdHlNb2R1bGVzLmhhc01vcmVFbGVtZW50cygpKSB7DQotICAgICAgICAgICAgICAgICBmb3VuZE1vZHVsZXMgPSB0cnVlOw0KLSAgICAgICAgICAgICAgICAgU3RyaW5nIGZhdWx0eU1vZHVsZU5hbWUgPSAoU3RyaW5nKSBmYXVsdHlNb2R1bGVzLm5leHRFbGVtZW50KCk7DQotICAgICAgICAgICAgICU+PGEgaHJlZj0iZXJyb3JNb2R1bGUuanNwP21vZHVsZU5hbWU9PCU9ZmF1bHR5TW9kdWxlTmFtZSU+Ij4NCi0gICAgICAgICAgICAgICAgICAgIDwlPWZhdWx0eU1vZHVsZU5hbWUlPjwvYT4NCi0gICAgICAgICAgICAgICAgICAgIDwlDQotICAgICAgICAgICAgIH0NCi0gICAgICB9DQotICAgICAgICAgICAgIGlmKCEgZm91bmRNb2R1bGVzKSB7DQotICAgICAgICAgICAgICAgICAlPg0KLSAgICAgICAgICAgICAgICAgPGgyPjxmb250IGNvbG9yPSJibHVlIj5UaGVyZSBhcmUgbm8gbW9kdWxlcyBkZXBsb3llZCBpbiB0aGUgc3lzdGVtLjwvZm9udD48L2gyPg0KLSAgICAgICAgICAgICAgICAgPCUNCi0gICAgICAgICAgICAgfQ0KLSAgICAgJT4NCi08anNwOmluY2x1ZGUgcGFnZT0iaW5jbHVkZS9hZG1pbmZvb3Rlci5pbmMiPjwvanNwOmluY2x1ZGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvbGlzdFNlcnZpY2UuanNwIGIvdjEuNS4xUkMzL21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvbGlzdFNlcnZpY2UuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2NmMjdmLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi93ZWJhcHAvYXhpczItd2ViL2xpc3RTZXJ2aWNlLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi08JS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLSU+DQotDQotPCVAIHBhZ2UgaW1wb3J0PSJvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50cywNCi0gICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc01vZHVsZSIgJT4NCi08JUAgcGFnZSBpbXBvcnQ9Im9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbiIgJT4NCi08JUAgcGFnZSBpbXBvcnQ9Im9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2UiICU+DQotPCVAIHBhZ2UgaW1wb3J0PSJvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlBhcmFtZXRlciIgJT4NCi08JUAgcGFnZSBpbXBvcnQ9Im9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0aW9uIiAlPg0KLTwlQCBwYWdlIGltcG9ydD0ib3JnLmFwYWNoZS5heGlzMi51dGlsLkphdmFVdGlscyIgJT4NCi08JUAgcGFnZSBpbXBvcnQ9ImphdmEudXRpbC5Db2xsZWN0aW9uIiAlPg0KLTwlQCBwYWdlIGltcG9ydD0iamF2YS51dGlsLkVudW1lcmF0aW9uIiAlPg0KLTwlQCBwYWdlIGltcG9ydD0iamF2YS51dGlsLkhhc2hNYXAiICU+DQotPCVAIHBhZ2UgaW1wb3J0PSJqYXZhLnV0aWwuSGFzaHRhYmxlIiAlPg0KLTwlQCBwYWdlIGltcG9ydD0iamF2YS51dGlsLkl0ZXJhdG9yIiAlPg0KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7Y2hhcnNldD1VVEYtOCIgbGFuZ3VhZ2U9ImphdmEiICU+DQotPGpzcDppbmNsdWRlIHBhZ2U9ImluY2x1ZGUvYWRtaW5oZWFkZXIuanNwIi8+DQotDQotPGgxPkF2YWlsYWJsZSBTZXJ2aWNlczwvaDE+DQotPCUgU3RyaW5nIHByZWZpeCA9IHJlcXVlc3QuZ2V0QXR0cmlidXRlKCJmcm9udGVuZEhvc3RVcmwiKSArIChTdHJpbmcpcmVxdWVzdC5nZXRTZXNzaW9uKCkuZ2V0QXR0cmlidXRlKENvbnN0YW50cy5TRVJWSUNFX1BBVEgpICsgIi8iOw0KLSU+DQotPCUNCi0gICAgSGFzaE1hcCBzZXJ2aWNlTWFwID0gKEhhc2hNYXApIHJlcXVlc3QuZ2V0U2Vzc2lvbigpLmdldEF0dHJpYnV0ZShDb25zdGFudHMuU0VSVklDRV9NQVApOw0KLSAgICByZXF1ZXN0LmdldFNlc3Npb24oKS5zZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLlNFUlZJQ0VfTUFQLCBudWxsKTsNCi0gICAgSGFzaHRhYmxlIGVycm9ybmVzc3NlcnZpY2UgPSAoSGFzaHRhYmxlKSByZXF1ZXN0LmdldFNlc3Npb24oKS5nZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLkVSUk9SX1NFUlZJQ0VfTUFQKTsNCi0gICAgYm9vbGVhbiBzdGF0dXMgPSBmYWxzZTsNCi0gICAgaWYgKHNlcnZpY2VNYXAgIT0gbnVsbCAmJiAhc2VydmljZU1hcC5pc0VtcHR5KCkpIHsNCi0gICAgICAgIEl0ZXJhdG9yIG9wZXJhdGlvbnM7DQotICAgICAgICBTdHJpbmcgc2VydmljZU5hbWU7DQotICAgICAgICBDb2xsZWN0aW9uIHNlcnZpY2Vjb2wgPSBzZXJ2aWNlTWFwLnZhbHVlcygpOw0KLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHNlcnZpY2Vjb2wuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgew0KLSAgICAgICAgICAgIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlID0gKEF4aXNTZXJ2aWNlKSBpdGVyYXRvci5uZXh0KCk7DQotICAgICAgICAgICAgb3BlcmF0aW9ucyA9IGF4aXNTZXJ2aWNlLmdldE9wZXJhdGlvbnMoKTsNCi0gICAgICAgICAgICBzZXJ2aWNlTmFtZSA9IGF4aXNTZXJ2aWNlLmdldE5hbWUoKTsNCi0lPjxoMj48Zm9udCBjb2xvcj0iYmx1ZSI+PGEgaHJlZj0iPCU9cHJlZml4ICsgYXhpc1NlcnZpY2UuZ2V0TmFtZSgpJT4/d3NkbCI+PCU9c2VydmljZU5hbWUlPjwvYT48L2ZvbnQ+PC9oMj4NCi08Zm9udCBjb2xvcj0iYmx1ZSI+U2VydmljZSBFUFIgOiA8L2ZvbnQ+PGZvbnQgY29sb3I9ImJsYWNrIj48JT1wcmVmaXggKyBheGlzU2VydmljZS5nZXROYW1lKCklPjwvZm9udD48YnI+DQotPCUNCi0gICAgLy8gZG8gd2UgbmVlZCB0byBlbmFibGUgUkVTVCBpbiB0aGUgbWFpbiBzZXJ2bGV0IHNvIHRoYXQgaXQgaGFuZGxlcyBib3RoIFJFU1QgYW5kIFNPQVAgbWVzc2FnZXMNCi0gICAgYm9vbGVhbiBkaXNhYmxlUkVTVCA9IGZhbHNlOw0KLSAgICBBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlndXJhdGlvbiA9IGF4aXNTZXJ2aWNlLmdldEF4aXNDb25maWd1cmF0aW9uKCk7DQotDQotICAgIFBhcmFtZXRlciBwYXJhbWV0ZXIgOw0KLQ0KLSAgICAvLyBkbyB3ZSBuZWVkIHRvIGNvbXBsZXRlbHkgZGlzYWJsZSBSRVNUIHN1cHBvcnQNCi0gICAgcGFyYW1ldGVyID0gYXhpc0NvbmZpZ3VyYXRpb24uZ2V0UGFyYW1ldGVyKENvbnN0YW50cy5Db25maWd1cmF0aW9uLkRJU0FCTEVfUkVTVCk7DQotICAgIGlmIChwYXJhbWV0ZXIgIT0gbnVsbCkgew0KLSAgICAgICAgZGlzYWJsZVJFU1QgPSAhSmF2YVV0aWxzLmlzRmFsc2VFeHBsaWNpdGx5KHBhcmFtZXRlci5nZXRWYWx1ZSgpKTsNCi0gICAgfQ0KLSAgICBpZiAoIWRpc2FibGVSRVNUKSB7DQotJT4NCi0NCi08JQ0KLSU+DQotPCUNCi0gICAgfQ0KLQ0KLQ0KLSAgICBTdHJpbmcgc2VydmljZURlc2NyaXB0aW9uID0gYXhpc1NlcnZpY2UuZ2V0U2VydmljZURlc2NyaXB0aW9uKCk7DQotICAgIGlmIChzZXJ2aWNlRGVzY3JpcHRpb24gPT0gbnVsbCB8fCAiIi5lcXVhbHMoc2VydmljZURlc2NyaXB0aW9uKSkgew0KLSAgICAgICAgc2VydmljZURlc2NyaXB0aW9uID0gIk5vIGRlc2NyaXB0aW9uIGF2YWlsYWJsZSBmb3IgdGhpcyBzZXJ2aWNlIjsNCi0gICAgfQ0KLSU+DQotICAgICAgICA8aDQ+U2VydmljZSBEZXNjcmlwdGlvbiA6IDxmb250IGNvbG9yPSJibGFjayI+PCU9c2VydmljZURlc2NyaXB0aW9uJT48L2ZvbnQ+PC9oND4NCi08aT48Zm9udCBjb2xvcj0iYmx1ZSI+U2VydmljZSBTdGF0dXMgOiA8JT1heGlzU2VydmljZS5pc0FjdGl2ZSgpID8gIkFjdGl2ZSIgOiAiSW5BY3RpdmUiJT48L2ZvbnQ+PC9pPjxicj4NCi08JQ0KLSAgICBDb2xsZWN0aW9uIGVuZ2FnZWRNb2R1bGVzID0gYXhpc1NlcnZpY2UuZ2V0RW5nYWdlZE1vZHVsZXMoKTsNCi0gICAgU3RyaW5nIG1vZHVsZU5hbWU7DQotICAgIGJvb2xlYW4gbW9kdWxlc19wcmVzZW50ID0gZmFsc2U7DQotICAgIGlmIChlbmdhZ2VkTW9kdWxlcy5zaXplKCkgPiAwKSB7DQotJT4NCi08aT5FbmdhZ2VkIG1vZHVsZXMgZm9yIHRoZSBzZXJ2aWNlPC9pPg0KLTwlDQotICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3JtID0gZW5nYWdlZE1vZHVsZXMuaXRlcmF0b3IoKTsgaXRlcmF0b3JtLmhhc05leHQoKTspIHsNCi0gICAgICAgIEF4aXNNb2R1bGUgYXhpc09wZXJhdGlvbiA9IChBeGlzTW9kdWxlKSBpdGVyYXRvcm0ubmV4dCgpOw0KLSAgICAgICAgbW9kdWxlTmFtZSA9IGF4aXNPcGVyYXRpb24uZ2V0TmFtZSgpOw0KLSAgICAgICAgaWYgKCFtb2R1bGVzX3ByZXNlbnQpIHsNCi0gICAgICAgICAgICBtb2R1bGVzX3ByZXNlbnQgPSB0cnVlOw0KLSU+DQotPHVsPg0KLSAgICA8JSB9DQotICAgICU+PGxpPjwlPW1vZHVsZU5hbWUlPiA6OiA8YSBocmVmPSJheGlzMi1hZG1pbi9kaXNlbmdhZ2VNb2R1bGU/dHlwZT1zZXJ2aWNlJnNlcnZpY2VOYW1lPTwlPXNlcnZpY2VOYW1lJT4mbW9kdWxlPTwlPW1vZHVsZU5hbWUlPiI+RGlzZW5nYWdlPC9hPjwvbGk+DQotICAgIDxicj4NCi0gICAgPCUNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChtb2R1bGVzX3ByZXNlbnQpIHslPg0KLTwvdWw+DQotPCUNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBpZiAob3BlcmF0aW9ucy5oYXNOZXh0KCkpIHsNCi0lPjxicj48aT5BdmFpbGFibGUgb3BlcmF0aW9uczwvaT48JQ0KLX0gZWxzZSB7DQotJT48aT4gVGhlcmUgYXJlIG5vIE9wZXJhdGlvbnMgc3BlY2lmaWVkPC9pPjwlDQotICAgIH0NCi0lPjx1bD48JQ0KLSAgICBvcGVyYXRpb25zID0gYXhpc1NlcnZpY2UuZ2V0T3BlcmF0aW9ucygpOw0KLSAgICB3aGlsZSAob3BlcmF0aW9ucy5oYXNOZXh0KCkpIHsNCi0gICAgICAgIEF4aXNPcGVyYXRpb24gYXhpc09wZXJhdGlvbiA9IChBeGlzT3BlcmF0aW9uKSBvcGVyYXRpb25zLm5leHQoKTsNCi0lPjxsaT48JT1heGlzT3BlcmF0aW9uLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKSU+PC9saT4NCi0gICAgPCUtLSAgICAgICAgICAgICAgICAgPGJyPk9wZXJhdGlvbiBFUFIgOiA8JT1wcmlmaXggKyBheGlzU2VydmljZS5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCkgKyAiLyIrIGF4aXNPcGVyYXRpb24uZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpJT4tLSU+DQotICAgIDwlDQotICAgICAgICBlbmdhZ2VkTW9kdWxlcyA9IGF4aXNPcGVyYXRpb24uZ2V0RW5nYWdlZE1vZHVsZXMoKTsNCi0gICAgICAgIGlmIChlbmdhZ2VkTW9kdWxlcy5zaXplKCkgPiAwKSB7DQotICAgICU+DQotICAgIDxicj48aT5FbmdhZ2VkIE1vZHVsZXMgZm9yIHRoZSBPcGVyYXRpb248L2k+PHVsPg0KLSAgICA8JQ0KLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyYXRvcjIgPSBlbmdhZ2VkTW9kdWxlcy5pdGVyYXRvcigpOyBpdGVyYXRvcjIuaGFzTmV4dCgpOykgew0KLSAgICAgICAgICAgIEF4aXNNb2R1bGUgbW9kdWxlRGVjcmlwdGlvbiA9IChBeGlzTW9kdWxlKSBpdGVyYXRvcjIubmV4dCgpOw0KLSAgICAgICAgICAgIG1vZHVsZU5hbWUgPSBtb2R1bGVEZWNyaXB0aW9uLmdldE5hbWUoKTsNCi0gICAgJT48bGk+PCU9bW9kdWxlTmFtZSU+IDo6IDxhIGhyZWY9ImF4aXMyLWFkbWluL2Rpc2VuZ2FnZU1vZHVsZT90eXBlPW9wZXJhdGlvbiZzZXJ2aWNlTmFtZT08JT1zZXJ2aWNlTmFtZSU+Jm9wZXJhdGlvbj08JT1heGlzT3BlcmF0aW9uLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKSU+Jm1vZHVsZT08JT1tb2R1bGVOYW1lJT4iPkRpc2VuZ2FnZTwvYT48L2xpPjxicj48JQ0KLSAgICB9DQotJT48L3VsPjwlDQotICAgICAgICB9DQotDQotICAgIH0NCi0lPjwvdWw+DQotPCUNCi0gICAgICAgICAgICBzdGF0dXMgPSB0cnVlOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIGlmIChlcnJvcm5lc3NzZXJ2aWNlICE9IG51bGwpIHsNCi0gICAgICAgIGlmIChlcnJvcm5lc3NzZXJ2aWNlLnNpemUoKSA+IDApIHsNCi0gICAgICAgICAgICByZXF1ZXN0LmdldFNlc3Npb24oKS5zZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLklTX0ZBVUxUWSwgQ29uc3RhbnRzLklTX0ZBVUxUWSk7DQotJT4NCi08aDM+PGZvbnQgY29sb3I9InJlZCI+RmF1bHR5IFNlcnZpY2VzPC9mb250PjwvaDM+DQotPCUNCi0gICAgRW51bWVyYXRpb24gZmF1bHR5c2VydmljZXMgPSBlcnJvcm5lc3NzZXJ2aWNlLmtleXMoKTsNCi0gICAgd2hpbGUgKGZhdWx0eXNlcnZpY2VzLmhhc01vcmVFbGVtZW50cygpKSB7DQotICAgICAgICBTdHJpbmcgZmF1bHR5c2VydmljZU5hbWUgPSAoU3RyaW5nKSBmYXVsdHlzZXJ2aWNlcy5uZXh0RWxlbWVudCgpOw0KLSU+PGgzPjxmb250IGNvbG9yPSJibHVlIj48YSBocmVmPSJzZXJ2aWNlcy9MaXN0RmF1bHR5U2VydmljZXM/c2VydmljZU5hbWU9PCU9ZmF1bHR5c2VydmljZU5hbWUlPiI+DQotICAgIDwlPWZhdWx0eXNlcnZpY2VOYW1lJT48L2E+PC9mb250PjwvaDM+DQotPCUNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBzdGF0dXMgPSB0cnVlOw0KLSAgICB9DQotICAgIGlmICghc3RhdHVzKSB7DQotJT4gTm8gc2VydmljZXMgbGlzdGVkISBUcnkgaGl0dGluZyByZWZyZXNoLiA8JQ0KLSAgICB9DQotJT4NCi08anNwOmluY2x1ZGUgcGFnZT0iaW5jbHVkZS9hZG1pbmZvb3Rlci5pbmMiIC8+DQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvbGlzdFNlcnZpY2VzLmpzcCBiL3YxLjUuMVJDMy9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi93ZWJhcHAvYXhpczItd2ViL2xpc3RTZXJ2aWNlcy5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkMGRmMDEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvbGlzdFNlcnZpY2VzLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi08JS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLSU+DQotDQotPCVAIHBhZ2UgaW1wb3J0PSJvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50cywNCi0gICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbiIgJT4NCi08JUAgcGFnZSBpbXBvcnQ9Im9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2UiICU+DQotPCVAIHBhZ2UgaW1wb3J0PSJvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlBhcmFtZXRlciIgJT4NCi08JUAgcGFnZSBpbXBvcnQ9Im9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0aW9uIiAlPg0KLTwlQCBwYWdlIGltcG9ydD0ib3JnLmFwYWNoZS5heGlzMi51dGlsLkphdmFVdGlscyIgJT4NCi08JUAgcGFnZSBpbXBvcnQ9ImphdmEudXRpbC5Db2xsZWN0aW9uIiAlPg0KLTwlQCBwYWdlIGltcG9ydD0iamF2YS51dGlsLkVudW1lcmF0aW9uIiAlPg0KLTwlQCBwYWdlIGltcG9ydD0iamF2YS51dGlsLkhhc2hNYXAiICU+DQotPCVAIHBhZ2UgaW1wb3J0PSJqYXZhLnV0aWwuSGFzaHRhYmxlIiAlPg0KLTwlQCBwYWdlIGltcG9ydD0iamF2YS51dGlsLkl0ZXJhdG9yIiAlPg0KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7Y2hhcnNldD1VVEYtOCIgbGFuZ3VhZ2U9ImphdmEiICU+DQotPGh0bWw+DQotPGpzcDppbmNsdWRlIHBhZ2U9ImluY2x1ZGUvaHR0cGJhc2UuanNwIi8+DQotPGhlYWQ+PHRpdGxlPkxpc3QgU2VydmljZXM8L3RpdGxlPg0KLSAgICA8bGluayBocmVmPSJheGlzMi13ZWIvY3NzL2F4aXMtc3R5bGUuY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIi8+DQotPC9oZWFkPg0KLQ0KLTxib2R5Pg0KLTxqc3A6aW5jbHVkZSBwYWdlPSJpbmNsdWRlL2hlYWRlci5pbmMiIC8+DQotPGpzcDppbmNsdWRlIHBhZ2U9ImluY2x1ZGUvbGluay1mb290ZXIuanNwIiAvPg0KLTxoMT5BdmFpbGFibGUgc2VydmljZXM8L2gxPg0KLTwlIFN0cmluZyBwcmVmaXggPSByZXF1ZXN0LmdldEF0dHJpYnV0ZSgiZnJvbnRlbmRIb3N0VXJsIikgKyAoU3RyaW5nKXJlcXVlc3QuZ2V0U2Vzc2lvbigpLmdldEF0dHJpYnV0ZShDb25zdGFudHMuU0VSVklDRV9QQVRIKSArICIvIjsNCi0lPg0KLTwlDQotICAgIEhhc2hNYXAgc2VydmljZU1hcCA9IChIYXNoTWFwKSByZXF1ZXN0LmdldFNlc3Npb24oKS5nZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLlNFUlZJQ0VfTUFQKTsNCi0gICAgcmVxdWVzdC5nZXRTZXNzaW9uKCkuc2V0QXR0cmlidXRlKENvbnN0YW50cy5TRVJWSUNFX01BUCwgbnVsbCk7DQotICAgIEhhc2h0YWJsZSBlcnJvcm5lc3NzZXJ2aWNlID0gKEhhc2h0YWJsZSkgcmVxdWVzdC5nZXRTZXNzaW9uKCkuZ2V0QXR0cmlidXRlKENvbnN0YW50cy5FUlJPUl9TRVJWSUNFX01BUCk7DQotICAgIGJvb2xlYW4gc3RhdHVzID0gZmFsc2U7DQotICAgIGlmIChzZXJ2aWNlTWFwICE9IG51bGwgJiYgIXNlcnZpY2VNYXAuaXNFbXB0eSgpKSB7DQotICAgICAgICBJdGVyYXRvciBvcEl0cjsNCi0gICAgICAgIC8vSGFzaE1hcCBvcGVyYXRpb25zOw0KLSAgICAgICAgU3RyaW5nIHNlcnZpY2VOYW1lOw0KLSAgICAgICAgQ29sbGVjdGlvbiBzZXJ2aWNlY29sID0gc2VydmljZU1hcC52YWx1ZXMoKTsNCi0gICAgICAgIC8vIENvbGxlY3Rpb24gb3BlcmF0aW9uc0xpc3Q7DQotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gc2VydmljZWNvbC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7DQotICAgICAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UgPSAoQXhpc1NlcnZpY2UpIGl0ZXJhdG9yLm5leHQoKTsNCi0gICAgICAgICAgICBvcEl0ciA9IGF4aXNTZXJ2aWNlLmdldE9wZXJhdGlvbnMoKTsNCi0gICAgICAgICAgICAvL29wZXJhdGlvbnNMaXN0ID0gb3BlcmF0aW9ucy52YWx1ZXMoKTsNCi0gICAgICAgICAgICBzZXJ2aWNlTmFtZSA9IGF4aXNTZXJ2aWNlLmdldE5hbWUoKTsNCi0lPjxoMj48Zm9udCBjb2xvcj0iYmx1ZSI+PGEgaHJlZj0iPCU9cHJlZml4ICsgYXhpc1NlcnZpY2UuZ2V0TmFtZSgpJT4/d3NkbCI+PCU9c2VydmljZU5hbWUlPjwvYT48L2ZvbnQ+PC9oMj4NCi08Zm9udCBjb2xvcj0iYmx1ZSI+U2VydmljZSBFUFIgOiA8L2ZvbnQ+PGZvbnQgY29sb3I9ImJsYWNrIj48JT1wcmVmaXggKyBheGlzU2VydmljZS5nZXROYW1lKCklPjwvZm9udD48YnI+DQotPCUNCi0gICAgYm9vbGVhbiBkaXNhYmxlUkVTVCA9IGZhbHNlOw0KLSAgICBBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlndXJhdGlvbiA9IGF4aXNTZXJ2aWNlLmdldEF4aXNDb25maWd1cmF0aW9uKCk7DQotDQotICAgIFBhcmFtZXRlciBwYXJhbWV0ZXIgOw0KLQ0KLSAgICAvLyBkbyB3ZSBuZWVkIHRvIGNvbXBsZXRlbHkgZGlzYWJsZSBSRVNUIHN1cHBvcnQNCi0gICAgcGFyYW1ldGVyID0gYXhpc0NvbmZpZ3VyYXRpb24uZ2V0UGFyYW1ldGVyKENvbnN0YW50cy5Db25maWd1cmF0aW9uLkRJU0FCTEVfUkVTVCk7DQotICAgIGlmIChwYXJhbWV0ZXIgIT0gbnVsbCkgew0KLSAgICAgICAgZGlzYWJsZVJFU1QgPSAhSmF2YVV0aWxzLmlzRmFsc2VFeHBsaWNpdGx5KHBhcmFtZXRlci5nZXRWYWx1ZSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBpZiAoIWRpc2FibGVSRVNUICkgew0KLQ0KLSU+DQotPCUNCi0gICAgfQ0KLQ0KLQ0KLSAgICBTdHJpbmcgc2VydmljZURlc2NyaXB0aW9uID0gYXhpc1NlcnZpY2UuZ2V0U2VydmljZURlc2NyaXB0aW9uKCk7DQotICAgIGlmIChzZXJ2aWNlRGVzY3JpcHRpb24gPT0gbnVsbCB8fCAiIi5lcXVhbHMoc2VydmljZURlc2NyaXB0aW9uKSkgew0KLSAgICAgICAgc2VydmljZURlc2NyaXB0aW9uID0gIk5vIGRlc2NyaXB0aW9uIGF2YWlsYWJsZSBmb3IgdGhpcyBzZXJ2aWNlIjsNCi0gICAgfQ0KLSU+DQotPGg0PlNlcnZpY2UgRGVzY3JpcHRpb24gOiA8Zm9udCBjb2xvcj0iYmxhY2siPjwlPXNlcnZpY2VEZXNjcmlwdGlvbiU+PC9mb250PjwvaDQ+DQotPGk+PGZvbnQgY29sb3I9ImJsdWUiPlNlcnZpY2UgU3RhdHVzIDogPCU9YXhpc1NlcnZpY2UuaXNBY3RpdmUoKSA/ICJBY3RpdmUiIDogIkluQWN0aXZlIiU+PC9mb250PjwvaT48YnI+DQotPCUNCi0gICAgaWYgKG9wSXRyLmhhc05leHQoKSkgew0KLSU+PGk+QXZhaWxhYmxlIE9wZXJhdGlvbnM8L2k+PCUNCi19IGVsc2Ugew0KLSU+PGk+IFRoZXJlIGFyZSBubyBPcGVyYXRpb25zIHNwZWNpZmllZDwvaT48JQ0KLSAgICB9DQotICAgIG9wSXRyID0gYXhpc1NlcnZpY2UuZ2V0T3BlcmF0aW9ucygpOw0KLSU+PHVsPjwlDQotICAgIHdoaWxlIChvcEl0ci5oYXNOZXh0KCkpIHsNCi0gICAgICAgIEF4aXNPcGVyYXRpb24gYXhpc09wZXJhdGlvbiA9IChBeGlzT3BlcmF0aW9uKSBvcEl0ci5uZXh0KCk7DQotJT48bGk+PCU9YXhpc09wZXJhdGlvbi5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCklPjwvbGk+DQotICAgIDwlLS0gICAgICAgICAgICAgICAgPGJyPk9wZXJhdGlvbiBFUFIgOiA8JT1wcmlmaXggKyBheGlzU2VydmljZS5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCkgKyAiLyIrIGF4aXNPcGVyYXRpb24uZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpJT4tLSU+DQotICAgIDwlDQotICAgICAgICB9DQotICAgICU+PC91bD4NCi08JQ0KLSAgICAgICAgICAgIHN0YXR1cyA9IHRydWU7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgaWYgKGVycm9ybmVzc3NlcnZpY2UgIT0gbnVsbCkgew0KLSAgICAgICAgaWYgKGVycm9ybmVzc3NlcnZpY2Uuc2l6ZSgpID4gMCkgew0KLSAgICAgICAgICAgIHJlcXVlc3QuZ2V0U2Vzc2lvbigpLnNldEF0dHJpYnV0ZShDb25zdGFudHMuSVNfRkFVTFRZLCBDb25zdGFudHMuSVNfRkFVTFRZKTsNCi0lPg0KLTxocj4NCi0NCi08aDM+PGZvbnQgY29sb3I9ImJsdWUiPkZhdWx0eSBTZXJ2aWNlczwvZm9udD48L2gzPg0KLTwlDQotICAgIEVudW1lcmF0aW9uIGZhdWx0eXNlcnZpY2VzID0gZXJyb3JuZXNzc2VydmljZS5rZXlzKCk7DQotICAgIHdoaWxlIChmYXVsdHlzZXJ2aWNlcy5oYXNNb3JlRWxlbWVudHMoKSkgew0KLSAgICAgICAgU3RyaW5nIGZhdWx0eXNlcnZpY2VOYW1lID0gKFN0cmluZykgZmF1bHR5c2VydmljZXMubmV4dEVsZW1lbnQoKTsNCi0lPjxoMz48Zm9udCBjb2xvcj0iYmx1ZSI+PGEgaHJlZj0ic2VydmljZXMvTGlzdEZhdWx0eVNlcnZpY2VzP3NlcnZpY2VOYW1lPTwlPWZhdWx0eXNlcnZpY2VOYW1lJT4iPg0KLSAgICA8JT1mYXVsdHlzZXJ2aWNlTmFtZSU+PC9hPjwvZm9udD48L2gzPg0KLTwlDQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgc3RhdHVzID0gdHJ1ZTsNCi0gICAgfQ0KLSAgICBpZiAoIXN0YXR1cykgew0KLSU+IE5vIHNlcnZpY2VzIGxpc3RlZCEgVHJ5IGhpdHRpbmcgcmVmcmVzaC4gPCUNCi0gICAgfQ0KLSU+DQotPGpzcDppbmNsdWRlIHBhZ2U9ImluY2x1ZGUvZm9vdGVyLmluYyIgLz4NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi93ZWJhcHAvYXhpczItd2ViL2xpc3RTaW5nbGVTZXJ2aWNlLmpzcCBiL3YxLjUuMVJDMy9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi93ZWJhcHAvYXhpczItd2ViL2xpc3RTaW5nbGVTZXJ2aWNlLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQzMTE0ZC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi9saXN0U2luZ2xlU2VydmljZS5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotPCUtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0lPg0KLQ0KLTwlQCBwYWdlIGltcG9ydD0ib3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHMsDQotICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb24iICU+DQotPCVAIHBhZ2UgaW1wb3J0PSJvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlIiAlPg0KLTwlQCBwYWdlIGltcG9ydD0ib3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5QYXJhbWV0ZXIiICU+DQotPCVAIHBhZ2UgaW1wb3J0PSJvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzQ29uZmlndXJhdGlvbiIgJT4NCi08JUAgcGFnZSBpbXBvcnQ9Im9yZy5hcGFjaGUuYXhpczIudXRpbC5KYXZhVXRpbHMiICU+DQotPCVAIHBhZ2UgaW1wb3J0PSJqYXZhLnV0aWwuSGFzaHRhYmxlIiAlPg0KLTwlQCBwYWdlIGltcG9ydD0iamF2YS51dGlsLkl0ZXJhdG9yIiAlPg0KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7Y2hhcnNldD1VVEYtOCIgbGFuZ3VhZ2U9ImphdmEiICU+DQotPGpzcDppbmNsdWRlIHBhZ2U9ImluY2x1ZGUvYWRtaW5oZWFkZXIuanNwIi8+DQotPGgxPkxpc3QgU2luZ2xlIFNlcnZpY2U8L2gxPg0KLTwlDQotICAgIFN0cmluZyBwcmVmaXggPSByZXF1ZXN0LmdldEF0dHJpYnV0ZSgiZnJvbnRlbmRIb3N0VXJsIikgKyAoU3RyaW5nKXJlcXVlc3QuZ2V0U2Vzc2lvbigpLmdldEF0dHJpYnV0ZShDb25zdGFudHMuU0VSVklDRV9QQVRIKSArICIvIjsNCi0lPg0KLTwlDQotICAgIFN0cmluZyBpc0ZhdWx0ID0gKFN0cmluZykgcmVxdWVzdC5nZXRTZXNzaW9uKCkuZ2V0QXR0cmlidXRlKENvbnN0YW50cy5JU19GQVVMVFkpOw0KLSAgICBTdHJpbmcgc2VydmljTmFtZSA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJzZXJ2aWNlTmFtZSIpOw0KLSAgICBpZiAoQ29uc3RhbnRzLklTX0ZBVUxUWS5lcXVhbHMoaXNGYXVsdCkpIHsNCi0gICAgICAgIEhhc2h0YWJsZSBlcnJvcm5lc3NzZXJ2aWNlcyA9IChIYXNodGFibGUpIHJlcXVlc3QuZ2V0U2Vzc2lvbigpLmdldEF0dHJpYnV0ZShDb25zdGFudHMuRVJST1JfU0VSVklDRV9NQVApOw0KLSU+DQotPGgzPlRoaXMgQXhpcyBzZXJ2aWNlIGhhcyBkZXBsb3ltZW50IGZhdWx0cy48L2gzPjwlDQotJT48Zm9udCBjb2xvcj0icmVkIj48JT0oU3RyaW5nKSBlcnJvcm5lc3NzZXJ2aWNlcy5nZXQoc2VydmljTmFtZSkgJT48L2ZvbnQ+DQotPCUNCi0NCi19IGVsc2Ugew0KLQ0KLSAgICBBeGlzU2VydmljZSBheGlzU2VydmljZSA9DQotICAgICAgICAgICAgKEF4aXNTZXJ2aWNlKSByZXF1ZXN0LmdldFNlc3Npb24oKS5nZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLlNJTkdMRV9TRVJWSUNFKTsNCi0gICAgaWYgKGF4aXNTZXJ2aWNlICE9IG51bGwpIHsNCi0gICAgICAgIEl0ZXJhdG9yIG9wSXRyID0gYXhpc1NlcnZpY2UuZ2V0T3BlcmF0aW9ucygpOw0KLSAgICAgICAgLy9vcGVyYXRpb25zTGlzdCA9IG9wZXJhdGlvbnMudmFsdWVzKCk7DQotICAgICAgICBTdHJpbmcgc2VydmljZU5hbWUgPSBheGlzU2VydmljZS5nZXROYW1lKCk7DQotJT48aDI+PGZvbnQgY29sb3I9ImJsdWUiPjxhIGhyZWY9IjwlPXByZWZpeCArIGF4aXNTZXJ2aWNlLmdldE5hbWUoKSU+P3dzZGwiPjwlPXNlcnZpY2VOYW1lJT48L2E+PC9mb250PjwvaDI+DQotPGZvbnQgY29sb3I9ImJsdWUiPlNlcnZpY2UgRVBSIDogPC9mb250Pjxmb250IGNvbG9yPSJibGFjayI+PCU9cHJlZml4ICsgYXhpc1NlcnZpY2UuZ2V0TmFtZSgpJT48L2ZvbnQ+PGJyPg0KLTwlDQotICAgIGJvb2xlYW4gZGlzYWJsZVJFU1QgPSBmYWxzZTsNCi0gICAgQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZ3VyYXRpb24gPSBheGlzU2VydmljZS5nZXRBeGlzQ29uZmlndXJhdGlvbigpOw0KLQ0KLSAgICBQYXJhbWV0ZXIgcGFyYW1ldGVyOw0KLQ0KLSAgICAvLyBkbyB3ZSBuZWVkIHRvIGNvbXBsZXRlbHkgZGlzYWJsZSBSRVNUIHN1cHBvcnQNCi0gICAgcGFyYW1ldGVyID0gYXhpc0NvbmZpZ3VyYXRpb24uZ2V0UGFyYW1ldGVyKENvbnN0YW50cy5Db25maWd1cmF0aW9uLkRJU0FCTEVfUkVTVCk7DQotICAgIGlmIChwYXJhbWV0ZXIgIT0gbnVsbCkgew0KLSAgICAgICAgZGlzYWJsZVJFU1QgPSAhSmF2YVV0aWxzLmlzRmFsc2VFeHBsaWNpdGx5KHBhcmFtZXRlci5nZXRWYWx1ZSgpKTsNCi0gICAgfQ0KLSAgICBpZiAoIWRpc2FibGVSRVNUICkgew0KLSU+DQotPCUNCi0gICAgfQ0KLQ0KLQ0KLSAgICBTdHJpbmcgc2VydmljZURlc2NyaXB0aW9uID0gYXhpc1NlcnZpY2UuZ2V0U2VydmljZURlc2NyaXB0aW9uKCk7DQotICAgIGlmIChzZXJ2aWNlRGVzY3JpcHRpb24gPT0gbnVsbCB8fCAiIi5lcXVhbHMoc2VydmljZURlc2NyaXB0aW9uKSkgew0KLSAgICAgICAgc2VydmljZURlc2NyaXB0aW9uID0gIk5vIGRlc2NyaXB0aW9uIGF2YWlsYWJsZSBmb3IgdGhpcyBzZXJ2aWNlIjsNCi0gICAgfQ0KLSU+DQotPGg0PlNlcnZpY2UgRGVzY3JpcHRpb24gOiA8Zm9udCBjb2xvcj0iYmxhY2siPjwlPXNlcnZpY2VEZXNjcmlwdGlvbiU+PC9mb250PjwvaDQ+DQotDQotPGk+PGZvbnQgY29sb3I9ImJsdWUiPlNlcnZpY2UgU3RhdHVzIDogPCU9YXhpc1NlcnZpY2UuaXNBY3RpdmUoKSA/ICJBY3RpdmUiIDogIkluQWN0aXZlIiU+PC9mb250PjwvaT48YnI+DQotPCUNCi0gICAgaWYgKG9wSXRyLmhhc05leHQoKSkgew0KLSU+PGk+QXZhaWxhYmxlIG9wZXJhdGlvbnM8L2k+PCUNCi19IGVsc2Ugew0KLSU+PGk+IFRoZXJlIGFyZSBubyBPcGVyYXRpb25zIHNwZWNpZmllZDwvaT48JQ0KLSAgICB9DQotICAgIG9wSXRyID0gYXhpc1NlcnZpY2UuZ2V0T3BlcmF0aW9ucygpOw0KLSU+PHVsPjwlDQotICAgIHdoaWxlIChvcEl0ci5oYXNOZXh0KCkpIHsNCi0gICAgICAgIEF4aXNPcGVyYXRpb24gYXhpc09wZXJhdGlvbiA9IChBeGlzT3BlcmF0aW9uKSBvcEl0ci5uZXh0KCk7DQotJT48bGk+PCU9YXhpc09wZXJhdGlvbi5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCklPjwvbGk+DQotICAgIDwlLS0gICAgICAgICAgICAgICAgPGJyPk9wZXJhdGlvbiBFUFIgOiA8JT1wcmlmaXggKyBheGlzU2VydmljZS5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCkgKyAiLyIrIGF4aXNPcGVyYXRpb24uZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpJT4tLSU+DQotICAgIDwlDQotICAgICAgICB9DQotICAgICU+PC91bD4NCi08JQ0KLX0gZWxzZSB7DQotJT4NCi08aDM+PGZvbnQgY29sb3I9InJlZCI+Tm8gc2VydmljZXMgZm91bmQgaW4gdGhpcyBsb2NhdGlvbjwvZm9udD48L2gzPg0KLTwlDQotICAgICAgICB9DQotDQotICAgIH0NCi0lPg0KLTxqc3A6aW5jbHVkZSBwYWdlPSJpbmNsdWRlL2FkbWluZm9vdGVyLmluYyIvPg0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi93ZWJhcHAvYXhpczItd2ViL3VwbG9hZC5qc3AgYi92MS41LjFSQzMvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi91cGxvYWQuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTYyMjI1Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi93ZWJhcHAvYXhpczItd2ViL3VwbG9hZC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi08JS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLSU+DQotDQotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDtjaGFyc2V0PVVURi04IiBsYW5ndWFnZT0iamF2YSIgJT4NCi0NCi08anNwOmluY2x1ZGUgcGFnZT0iaW5jbHVkZS9hZG1pbmhlYWRlci5qc3AiLz4NCi08c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+DQotPCEtLQ0KLQlmdW5jdGlvbiBjaGVja0ZpbGVVcGxvYWQoKXsNCi0JCWlmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VydmljZVVwbG9hZCcpLnZhbHVlID09ICcnKSB7DQotCQkJYWxlcnQoJ1BsZWFzZSBzZWxlY3QgYSBmaWxlIGJlZm9yZSBjbGlja2luZyB0aGUgdXBsb2FkIGJ1dHRvbi4nKTsNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQl9IGVsc2Ugew0KLQkJCWRvY3VtZW50LkF4aXMydXBsb2FkLnN1Ym1pdCgpOw0KLQkJfQ0KLQl9DQotLy8tLT4NCi08L3NjcmlwdD4NCi08aDE+VXBsb2FkIGFuIEF4aXMgU2VydmljZSBBcmNoaXZlIEZpbGU8L2gxPg0KLQ0KLTxwPllvdSBjYW4gdXBsb2FkIGEgcGFja2FnZWQgQXhpczIgc2VydmljZSBmcm9tIHRoaXMgcGFnZSBpbiB0d28gc21hbGwgc3RlcHMuPC9wPg0KLTx1bD4NCi0gIDxsaT5Ccm93c2UgdG8gdGhlIGxvY2F0aW9uIGFuZCBzZWxlY3QgdGhlIGF4aXMgc2VydmljZSBhcmNoaXZlIGZpbGUgeW91IHdpc2ggdG8gdXBsb2FkPC9saT4NCi0gIDxsaT5DbGljayAiVXBsb2FkIiBidXR0b248L2xpPg0KLTwvdWw+DQotPHA+U2ltcGxlIGFzIHRoYXQhPC9wPg0KLQ0KLTwlIGlmICgic3VjY2VzcyIuZXF1YWxzKHJlcXVlc3QuZ2V0QXR0cmlidXRlKCJzdGF0dXMiKSkpIHsgJT4NCi08Zm9udCBjb2xvcj0iZ3JlZW4iPkZpbGUgPCU9IHJlcXVlc3QuZ2V0QXR0cmlidXRlKCJmaWxlbmFtZSIpICU+IHN1Y2Nlc3NmdWxseSB1cGxvYWRlZCA8L2ZvbnQ+PGJyLz48YnIvPg0KLTwlDQotfSBlbHNlIGlmICgiZmFpbHVyZSIuZXF1YWxzKHJlcXVlc3QuZ2V0QXR0cmlidXRlKCJzdGF0dXMiKSkpIHsNCi0lPg0KLTxmb250IGNvbG9yPSJyZWQiPlRoZSBmb2xsb3dpbmcgZXJyb3Igb2NjdXJyZWQgPGJyLz4gPCU9IHJlcXVlc3QuZ2V0QXR0cmlidXRlKCJjYXVzZSIpICU+PC9mb250Pjxici8+DQotPCUgfSAlPg0KLQ0KLTxmb3JtIG1ldGhvZD0icG9zdCIgbmFtZT0iQXhpczJ1cGxvYWQiIGlkPSJBeGlzMnVwbG9hZCIgYWN0aW9uPSJheGlzMi1hZG1pbi91cGxvYWQiDQotICAgICAgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSI+DQotICA8dGFibGU+DQotICAgIDx0cj4NCi0gICAgICA8dGQ+U2VydmljZSBhcmNoaXZlIDogPC90ZD4NCi0gICAgICA8dGQ+PGlucHV0IGlkPSJzZXJ2aWNlVXBsb2FkIiB0eXBlPSJmaWxlIiBuYW1lPSJmaWxlbmFtZSIgc2l6ZT0iNTAiLz48L3RkPg0KLSAgICA8L3RyPg0KLSAgICA8dHI+DQotICAgICAgPHRkPiZuYnNwOzwvdGQ+DQotICAgICAgPHRkPjxpbnB1dCBuYW1lPSJ1cGxvYWQiIHR5cGU9ImJ1dHRvbiIgb25jbGljaz0iamF2YXNjcmlwdDpjaGVja0ZpbGVVcGxvYWQoKTsiIHZhbHVlPSIgVXBsb2FkICIvPjwvdGQ+DQotICAgIDwvdHI+DQotICA8L3RhYmxlPg0KLTwvZm9ybT4NCi08YmxvY2txdW90ZT4NCi08cD5Ib3QgZGVwbG95bWVudCBvZiBuZXcgc2VydmljZSBhcmNoaXZlcyBpcyA8JT1yZXF1ZXN0LmdldEF0dHJpYnV0ZSgiaG90RGVwbG95bWVudCIpICU+PC9wPg0KLTxwPkhvdCB1cGRhdGUgb2YgZXhpc3Rpbmcgc2VydmljZSBhcmNoaXZlcyBpcyA8JT1yZXF1ZXN0LmdldEF0dHJpYnV0ZSgiaG90VXBkYXRlIikgJT48L3A+DQotPC9ibG9ja3F1b3RlPg0KLTxqc3A6aW5jbHVkZSBwYWdlPSJpbmNsdWRlL2FkbWluZm9vdGVyLmluYyIvPg0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi93ZWJhcHAvYXhpczItd2ViL3ZpZXdTZXJ2aWNlQ29udGV4dC5qc3AgYi92MS41LjFSQzMvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi92aWV3U2VydmljZUNvbnRleHQuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGFiOGZhLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi93ZWJhcHAvYXhpczItd2ViL3ZpZXdTZXJ2aWNlQ29udGV4dC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi08JS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0lPgotCi08JUAgcGFnZSBpbXBvcnQ9Im9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5TZXJ2aWNlQ29udGV4dCIgJT4KLTwlQCBwYWdlIGltcG9ydD0iamF2YS51dGlsLkl0ZXJhdG9yIiAlPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDtjaGFyc2V0PVVURi04IiBsYW5ndWFnZT0iamF2YSIgJT4KLTxqc3A6aW5jbHVkZSBwYWdlPSJpbmNsdWRlL2FkbWluaGVhZGVyLmpzcCIvPgotPGgxPlJ1bm5pbmcgQ29udGV4dCBIaWVyYXJjaHk8L2gxPgotPCUKLSAgICBTZXJ2aWNlQ29udGV4dCBzZXJ2aWNlQ29udGV4dCA9IChTZXJ2aWNlQ29udGV4dCkgcmVxdWVzdC5nZXRTZXNzaW9uKCkuZ2V0QXR0cmlidXRlKCJTZXJ2aWNlQ29udGV4dCIpOwotICAgIFN0cmluZyB0eXBlID0gKFN0cmluZykgcmVxdWVzdC5nZXRTZXNzaW9uKCkuZ2V0QXR0cmlidXRlKCJUWVBFIik7Ci0gICAgaWYgKHNlcnZpY2VDb250ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgaWYgKHR5cGUgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKCJWSUVXIi5lcXVhbHModHlwZSkpIHsKLSAgICAgICAgICAgICAgICBJdGVyYXRvciBwcm9wZXJ0eU5hbWVzID0gc2VydmljZUNvbnRleHQuZ2V0UHJvcGVydHlOYW1lcygpOwotJT4KLTxoND5QZXJzaXN0YW5jZSBQcm9wZXJ0aWVzPC9oND48dWw+Ci0gICAgPCUKLSAgICAgICAgd2hpbGUgKHByb3BlcnR5TmFtZXMuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBTdHJpbmcga2V5ID0gKFN0cmluZykgcHJvcGVydHlOYW1lcy5uZXh0KCk7Ci0gICAgICAgICAgICBPYmplY3QgcHJvcGVydHkgPSBzZXJ2aWNlQ29udGV4dC5nZXRQcm9wZXJ0eShrZXkpOwotICAgICU+Ci0gICAgPGxpPjwlPWtleSU+IDogPCU9cHJvcGVydHkudG9TdHJpbmcoKSU+PC9saT4KLSAgICA8JQotICAgICAgICB9Ci0gICAgJT48L3VsPgotPCUKLSAgICB9Ci19IGVsc2UgewotJT4gPGg0Pk5vIFNlcnZpY2UgQ29udGV4dCBGb3VuZDwvaDQ+PCUKLSAgICAgICAgfQotICAgIH0KLSU+Ci08anNwOmluY2x1ZGUgcGFnZT0iaW5jbHVkZS9hZG1pbmZvb3Rlci5pbmMiLz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi92aWV3U2VydmljZUdyb3VwQ29udGV4dC5qc3AgYi92MS41LjFSQzMvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi92aWV3U2VydmljZUdyb3VwQ29udGV4dC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3Y2E4NmMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvdmlld1NlcnZpY2VHcm91cENvbnRleHQuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotPCUtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tJT4KLQotPCVAIHBhZ2UgaW1wb3J0PSJvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQiJT4KLTwlQCBwYWdlIGltcG9ydD0ib3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LlNlcnZpY2VHcm91cENvbnRleHQiJT4KLTwlQCBwYWdlIGltcG9ydD0iamF2YS51dGlsLkl0ZXJhdG9yIiU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sO2NoYXJzZXQ9VVRGLTgiIGxhbmd1YWdlPSJqYXZhIiAlPgotPGpzcDppbmNsdWRlIHBhZ2U9ImluY2x1ZGUvYWRtaW5oZWFkZXIuanNwIj48L2pzcDppbmNsdWRlPgotPGgxPlJ1bmluZyBDb250ZXh0IGhpZXJhY2h5PC9oMT4KLTwlCi0gICAgU3RyaW5nIHR5cGUgPSAoU3RyaW5nKSByZXF1ZXN0LmdldFNlc3Npb24oKS5nZXRBdHRyaWJ1dGUoIlRZUEUiKTsKLSAgICBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDdHggPSAoQ29uZmlndXJhdGlvbkNvbnRleHQpIHJlcXVlc3QuZ2V0U2Vzc2lvbigpLmdldEF0dHJpYnV0ZSgiQ29uZmlndXJhdGlvbkNvbnRleHQiKTsKLSAgICBTZXJ2aWNlR3JvdXBDb250ZXh0IHNnQ29udGV4dCA9IChTZXJ2aWNlR3JvdXBDb250ZXh0KSByZXF1ZXN0LmdldFNlc3Npb24oKS5nZXRBdHRyaWJ1dGUoIlNlcnZpY2VHcm91cENvbnRleHQiKTsKLSAgICBpZiAoc2dDb250ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgaWYgKHR5cGUgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKCJWSUVXIi5lcXVhbHModHlwZSkpIHsKLSAgICAgICAgICAgICAgSXRlcmF0b3IgcHJvcGVydHlOYW1lcyA9IHNnQ29udGV4dC5nZXRQcm9wZXJ0eU5hbWVzKCk7Ci0lPgotICAgICAgICAgICAgIDxoND5QZXJzaXN0YW5jZSBwcm9wZXJ0aWVzPC9oND48dWw+Ci0gICAgICAgICAgICAgPCUKLSAgICAgICAgICAgICAgICAgd2hpbGUgKHByb3BlcnR5TmFtZXMuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICBTdHJpbmcga2V5ID0gKFN0cmluZykgcHJvcGVydHlOYW1lcy5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICBPYmplY3QgcHJvcGVydHkgPSAgc2dDb250ZXh0LmdldFByb3BlcnR5KGtleSk7Ci0gICAgICAgICAgICAgICU+Ci0gICAgICAgICAgICAgICAgICAgPGxpPjwlPWtleSU+IDogPCU9cHJvcGVydHkudG9TdHJpbmcoKSU+PC9saT4KLSAgICAgICAgICAgICAgPCUKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAlPjwvdWw+Ci0gICAgICAgICAgICAgICAgIDwlCi0gICAgICAgICAgICB9ICAgZWxzZSBpZigiREVMRVRFIi5lcXVhbHModHlwZSkpewotICAgICAgICAgICAgICAgICBjb25maWdDdHgucmVtb3ZlU2VydmljZUdyb3VwQ29udGV4dChzZ0NvbnRleHQuZ2V0SWQoKSk7Ci0gICAgICAgICAgICAgICAgICU+UmVtb3ZlZCB0aGUgY29udGV4dDwlCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotJT4gPGg0Pk5vIHNlcnZpY2UgZ3JvdXAgY29udGV4dCBmb3VuZDwvaDQ+PCUKLSAgICB9Ci0lPgotPGpzcDppbmNsdWRlIHBhZ2U9ImluY2x1ZGUvYWRtaW5mb290ZXIuaW5jIj48L2pzcDppbmNsdWRlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi93ZWJhcHAvYXhpczItd2ViL3ZpZXdwaGFzZXMuanNwIGIvdjEuNS4xUkMzL21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvdmlld3BoYXNlcy5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkMGE1YjEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvdmlld3BoYXNlcy5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotIDwlLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tJT4gPCVAIHBhZ2UgaW1wb3J0PSJvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50cywNCi0gICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC51dGlsLlBoYXNlc0luZm8sDQotICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5QaGFzZSIlPg0KLSA8JUAgcGFnZSBpbXBvcnQ9ImphdmEudXRpbC5BcnJheUxpc3QiJT4NCi08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sO2NoYXJzZXQ9VVRGLTgiIGxhbmd1YWdlPSJqYXZhIiAlPg0KLTxqc3A6aW5jbHVkZSBwYWdlPSJpbmNsdWRlL2FkbWluaGVhZGVyLmpzcCI+PC9qc3A6aW5jbHVkZT4NCi08aDE+QXZhaWxhYmxlIFBoYXNlczwvaDE+DQotICAgICA8JQ0KLSAgICAgICAgIFBoYXNlc0luZm8gcGhhc2VzID0gKFBoYXNlc0luZm8pcmVxdWVzdC5nZXRTZXNzaW9uKCkuZ2V0QXR0cmlidXRlKENvbnN0YW50cy5QSEFTRV9MSVNUKTsNCi0gICAgICAgICByZXF1ZXN0LmdldFNlc3Npb24oKS5zZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLlBIQVNFX0xJU1QsbnVsbCk7DQotICAgICAgICAgQXJyYXlMaXN0IHRlbXBMaXN0ID0gcGhhc2VzLmdldEdsb2JhbEluZmxvdygpOw0KLSAgICAgJT48aDI+PGZvbnQgY29sb3I9ImJsdWUiPlN5c3RlbSBQcmUtZGVmaW5lZCBQaGFzZXM8L2ZvbnQ+PC9oMj4NCi0gICAgIDxiPkluRmxvdyBVcCB0byBEaXNwYXRjaGVyPC9iPg0KLSAgICAgPGJsb2NrcXVvdGU+DQotICAgICAgICAgPCUNCi0gICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0ZW1wTGlzdC5zaXplKCk7IGkrKykgew0KLSAgICAgICAgICAgICAgICAgUGhhc2UgcGhhc2UgPSAoUGhhc2UpIHRlbXBMaXN0LmdldChpKTsNCi0gICAgICAgICAlPjwlPXBoYXNlLmdldFBoYXNlTmFtZSgpJT48YnI+PCUNCi0gICAgICAgICAgICAgfQ0KLSAgICAgICAgICU+DQotICAgICAgICAgPC9ibG9ja3F1b3RlPg0KLSAgICAgICAgIDxiPkluRmF1bHRGbG93IDwvYj4NCi0gICAgICAgICA8YmxvY2txdW90ZT4NCi0gICAgICAgICA8JQ0KLSAgICAgICAgICAgICB0ZW1wTGlzdCA9IHBoYXNlcy5nZXRHbG9iYWxJbkZhdWx0UGhhc2VzKCk7DQotICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGVtcExpc3Quc2l6ZSgpOyBpKyspIHsNCi0gICAgICAgICAgICAgICAgIFBoYXNlIHBoYXNlID0gKFBoYXNlKSB0ZW1wTGlzdC5nZXQoaSk7DQotICAgICAgICAgJT48JT1waGFzZS5nZXRQaGFzZU5hbWUoKSU+PGJyPjwlDQotICAgICAgICAgICAgIH0NCi0gICAgICAgICAlPg0KLSAgICAgICAgIDwvYmxvY2txdW90ZT4NCi0gICAgICAgICA8Yj5PdXRGbG93IDwvYj4NCi0gICAgICAgICA8YmxvY2txdW90ZT4NCi0gICAgICAgICA8JQ0KLSAgICAgICAgICAgICB0ZW1wTGlzdCA9IHBoYXNlcy5nZXRHbG9iYWxPdXRQaGFzZUxpc3QoKTsNCi0gICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0ZW1wTGlzdC5zaXplKCk7IGkrKykgew0KLSAgICAgICAgICAgICAgICAgUGhhc2UgcGhhc2UgPSAoUGhhc2UpIHRlbXBMaXN0LmdldChpKTsNCi0gICAgICAgICAlPjwlPXBoYXNlLmdldFBoYXNlTmFtZSgpJT48YnI+PCUNCi0gICAgICAgICAgICAgfQ0KLSAgICAgICAgICU+DQotICAgICAgICAgPC9ibG9ja3F1b3RlPg0KLSAgICAgICAgIDxiPk91dEZhdWx0RmxvdyA8L2I+DQotICAgICAgICAgPGJsb2NrcXVvdGU+DQotICAgICAgICAgPCUNCi0gICAgICAgICAgICAgdGVtcExpc3QgPSBwaGFzZXMuZ2V0T1VUX0ZhdWx0UGhhc2VzKCk7DQotICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGVtcExpc3Quc2l6ZSgpOyBpKyspIHsNCi0gICAgICAgICAgICAgICAgIFBoYXNlIHBoYXNlID0gKFBoYXNlKSB0ZW1wTGlzdC5nZXQoaSk7DQotICAgICAgICAgJT48JT1waGFzZS5nZXRQaGFzZU5hbWUoKSU+PGJyPjwlDQotICAgICAgICAgICAgIH0NCi0gICAgICAgICAlPg0KLSAgICAgICAgIDwvYmxvY2txdW90ZT4NCi0gICAgICAgICA8YnI+DQotICAgICAgICAgPGgyPjxmb250IGNvbG9yPSJibHVlIj5Vc2VyIERlZmluZWQgUGhhc2VzPC9mb250PjwvaDI+DQotICAgICAgICAgPGI+SW5mbG93IGFmdGVyIERpc3BhdGNoZXI8L2I+DQotICAgICAgICAgPGJsb2NrcXVvdGU+DQotICAgICAgICAgPCUNCi0gICAgICAgICAgICAgdGVtcExpc3QgPSBwaGFzZXMuZ2V0T3BlcmF0aW9uSW5QaGFzZXMoKTsNCi0gICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0ZW1wTGlzdC5zaXplKCk7IGkrKykgew0KLSAgICAgICAgICAgICAgICAgUGhhc2UgcGhhc2UgPSAoUGhhc2UpIHRlbXBMaXN0LmdldChpKTsNCi0gICAgICAgICAlPjwlPXBoYXNlLmdldFBoYXNlTmFtZSgpJT48YnI+PCUNCi0gICAgICAgICAgICAgfQ0KLSAgICAgICAgICU+DQotICAgICAgICAgPC9ibG9ja3F1b3RlPg0KLSAgICAgICAgIDxiPkluRmF1bHRGbG93IGFmdGVyIERpc3BhdGNoZXI8L2I+DQotICAgICAgICAgPGJsb2NrcXVvdGU+DQotICAgICAgICAgPCUNCi0gICAgICAgICAgICAgdGVtcExpc3QgPSBwaGFzZXMuZ2V0T3BlcmF0aW9uSW5GYXVsdFBoYXNlcygpOw0KLSAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRlbXBMaXN0LnNpemUoKTsgaSsrKSB7DQotICAgICAgICAgICAgICAgICBQaGFzZSBwaGFzZSA9IChQaGFzZSkgdGVtcExpc3QuZ2V0KGkpOw0KLSAgICAgICAgICU+PCU9cGhhc2UuZ2V0UGhhc2VOYW1lKCklPjxicj48JQ0KLSAgICAgICAgICAgICB9DQotICAgICAgICAgJT4NCi0gICAgICAgICA8L2Jsb2NrcXVvdGU+DQotICAgICAgICAgPGI+T3V0RmxvdyAgPC9iPg0KLSAgICAgICAgIDxibG9ja3F1b3RlPg0KLSAgICAgICAgIDwlDQotICAgICAgICAgICAgIHRlbXBMaXN0ID0gcGhhc2VzLmdldE9wZXJhdGlvbk91dFBoYXNlcygpOw0KLSAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRlbXBMaXN0LnNpemUoKTsgaSsrKSB7DQotICAgICAgICAgICAgICAgICBQaGFzZSBwaGFzZSA9IChQaGFzZSkgdGVtcExpc3QuZ2V0KGkpOw0KLSAgICAgICAgICU+PCU9cGhhc2UuZ2V0UGhhc2VOYW1lKCklPjxicj48JQ0KLSAgICAgICAgICAgICB9DQotICAgICAgICAgJT4NCi0gICAgICAgICA8L2Jsb2NrcXVvdGU+DQotICAgICAgICAgPGI+T3V0RmF1bHRGbG93IDwvYj4NCi0gICAgICAgICA8YmxvY2txdW90ZT4NCi0gICAgICAgICA8JQ0KLSAgICAgICAgICAgICB0ZW1wTGlzdCA9IHBoYXNlcy5nZXRPcGVyYXRpb25PdXRGYXVsdFBoYXNlcygpOw0KLSAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRlbXBMaXN0LnNpemUoKTsgaSsrKSB7DQotICAgICAgICAgICAgICAgICBQaGFzZSBwaGFzZSA9IChQaGFzZSkgdGVtcExpc3QuZ2V0KGkpOw0KLSAgICAgICAgICU+PCU9cGhhc2UuZ2V0UGhhc2VOYW1lKCklPjxicj48JQ0KLSAgICAgICAgICAgICB9DQotICAgICAgICAgJT4NCi0gICAgICAgICA8L2Jsb2NrcXVvdGU+DQotPGpzcDppbmNsdWRlIHBhZ2U9ImluY2x1ZGUvYWRtaW5mb290ZXIuaW5jIj48L2pzcDppbmNsdWRlPg0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3htbGJlYW5zL3BvbS54bWwgYi92MS41LjFSQzMvbW9kdWxlcy94bWxiZWFucy9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDllNjFlLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3htbGJlYW5zL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+MS41LjE8L3ZlcnNpb24+Ci0gICAgICAgIDxyZWxhdGl2ZVBhdGg+Li4vcGFyZW50L3BvbS54bWw8L3JlbGF0aXZlUGF0aD4KLSAgICA8L3BhcmVudD4KLSAgICA8YXJ0aWZhY3RJZD5heGlzMi14bWxiZWFuczwvYXJ0aWZhY3RJZD4KLSAgICA8bmFtZT5BcGFjaGUgQXhpczIgLSBYTUxCZWFucyBEYXRhIEJpbmRpbmc8L25hbWU+Ci0gICAgPGRlc2NyaXB0aW9uPlhNTEJlYW5zIGRhdGEgYmluZGluZyBzdXBwb3J0IGZvciBBeGlzMjwvZGVzY3JpcHRpb24+Ci0gICAgPGRlcGVuZGVuY2llcz4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItY29kZWdlbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7dmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLnhtbGJlYW5zPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+eG1sYmVhbnM8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmFudDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmFudDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYW50PC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YW50LWxhdW5jaGVyPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPC9kZXBlbmRlbmNpZXM+Ci0gICAgPGJ1aWxkPgotICAgICAgICA8cmVzb3VyY2VzPgotICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+Li4vLi48L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPk5PVElDRS50eHQ8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPkxJQ0VOU0UudHh0PC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgPGZpbHRlcmluZz5mYWxzZTwvZmlsdGVyaW5nPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYzwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxleGNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovKi5qYXZhPC9leGNsdWRlPgotICAgICAgICAgICAgICAgIDwvZXhjbHVkZXM+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICA8L3Jlc291cmNlcz4KLSAgICAgICAgPHNvdXJjZURpcmVjdG9yeT5zcmM8L3NvdXJjZURpcmVjdG9yeT4KLSAgICAgICAgPHRlc3RTb3VyY2VEaXJlY3Rvcnk+dGVzdDwvdGVzdFNvdXJjZURpcmVjdG9yeT4KLSAgICAgICAgPHRlc3RSZXNvdXJjZXM+Ci0gICAgICAgICAgICA8dGVzdFJlc291cmNlPgotICAgICAgICAgICAgICAgIDx0YXJnZXRQYXRoPi4uL3Rlc3QtcmVzb3VyY2VzPC90YXJnZXRQYXRoPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+dGVzdC1yZXNvdXJjZXM8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLyoqPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICA8L3Rlc3RSZXNvdXJjZT4KLSAgICAgICAgPC90ZXN0UmVzb3VyY2VzPgotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8c2tpcD5mYWxzZTwvc2tpcD4KLSAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovKlV0aWwuamF2YTwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqLypDb25zdGFudHMuamF2YTwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgPC9leGNsdWRlcz4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFudHJ1bi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+Z2VuLWNwPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5nZW5lcmF0ZS10ZXN0LXNvdXJjZXM8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhc2tzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iY3AiIHJlZmlkPSJtYXZlbi5ydW50aW1lLmNsYXNzcGF0aCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWNobyBtZXNzYWdlPSIke2NwfSIgZmlsZT0idGFyZ2V0L2NwLnR4dCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFza3M+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+cnVuPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgICAgICAgICAgICAgIDwhLS08ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYW50PC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+YW50LWFudGxyPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+YW50bHI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5hbnRscmFsbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgPC9kZXBlbmRlbmN5Pi0tPgotICAgICAgICAgICAgICAgIDwvZGVwZW5kZW5jaWVzPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgIDwvcGx1Z2lucz4KLSAgICA8L2J1aWxkPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMveG1sYmVhbnMvc3JjL29yZy9hcGFjaGUvYXhpczIveG1sYmVhbnMvQ29kZUdlbmVyYXRpb25VdGlsaXR5LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy94bWxiZWFucy9zcmMvb3JnL2FwYWNoZS9heGlzMi94bWxiZWFucy9Db2RlR2VuZXJhdGlvblV0aWxpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk1MWQ1MS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy94bWxiZWFucy9zcmMvb3JnL2FwYWNoZS9heGlzMi94bWxiZWFucy9Db2RlR2VuZXJhdGlvblV0aWxpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIueG1sYmVhbnM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNNZXNzYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5TY2hlbWFVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5VUkxQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLlhNTFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5Db2RlR2VuQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5leHRlbnNpb24uWE1MQmVhbnNFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLmRhdGFiaW5kaW5nLkRlZmF1bHRUeXBlTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5kYXRhYmluZGluZy5KYXZhVHlwZU1hcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuZGF0YWJpbmRpbmcuVHlwZU1hcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwudXRpbC5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWE7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFDb2xsZWN0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuQmluZGluZ0NvbmZpZzsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLkZpbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hR2xvYmFsRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVByb3BlcnR5OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGVTeXN0ZW07Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxCZWFuczsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnhiLnhzZHNjaGVtYS5TY2hlbWFEb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy54bWwuc2F4LkVudGl0eVJlc29sdmVyOwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi0vKioKLSAqIEZyYW1ld29yay1saW5rZWQgY29kZSB1c2VkIGJ5IFhNTEJlYW5zIGRhdGEgYmluZGluZyBzdXBwb3J0LiBUaGlzIGlzIGFjY2Vzc2VkIHZpYSByZWZsZWN0aW9uIGZyb20KLSAqIHRoZSBYTUxCZWFucyBjb2RlIGdlbmVyYXRpb24gZXh0ZW5zaW9uIHdoZW4gWE1MQmVhbnMgZGF0YSBiaW5kaW5nIGlzIHNlbGVjdGVkLgotICovCi1wdWJsaWMgY2xhc3MgQ29kZUdlbmVyYXRpb25VdGlsaXR5IHsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQ0hFTUFfRk9MREVSID0gInNjaGVtYXMiOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgTUFQUElOR1MgPSAibWFwcGluZ3MiOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE1BUFBJTkcgPSAibWFwcGluZyI7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgTUVTU0FHRSA9ICJtZXNzYWdlIjsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBX05BTUUgPSAiamF2YWNsYXNzIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBJTkdfRk9MREVSID0gIk1hcHBpbmciOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBFUl9GSUxFX05BTUUgPSAibWFwcGVyIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQ0hFTUFfUEFUSCA9ICIvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vc2NoZW1hLyI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coQ29kZUdlbmVyYXRpb25VdGlsaXR5LmNsYXNzKTsKLSAgICBib29sZWFuIGRlYnVnID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gYWRkaXRpb25hbFNjaGVtYXMKLSAgICAgKiBAdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFR5cGVNYXBwZXIgcHJvY2Vzc1NjaGVtYXMoTGlzdCBzY2hlbWFzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50W10gYWRkaXRpb25hbFNjaGVtYXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVHZW5Db25maWd1cmF0aW9uIGNnY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdHlwZVN5c3RlbU5hbWUpIHRocm93cyBSdW50aW1lRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLQotICAgICAgICAgICAgLy9jaGVjayBmb3IgdGhlIGltcG9ydGVkIHR5cGVzLiBBbnkgaW1wb3J0ZWQgdHlwZXMgYXJlIHN1cHBvc2VkIHRvIGJlIGhlcmUgYWxzbwotICAgICAgICAgICAgaWYgKHNjaGVtYXMgPT0gbnVsbCB8fCBzY2hlbWFzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIC8vdGhlcmUgYXJlIG5vIHR5cGVzIHRvIGJlIGNvZGUgZ2VuZXJhdGVkCi0gICAgICAgICAgICAgICAgLy9Ib3dldmVyIGlmIHRoZSB0eXBlIG1hcHBlciBpcyBsZWZ0IGVtcHR5IGl0IHdpbGwgYmUgYSBwcm9ibGVtIGZvciB0aGUgb3RoZXIKLSAgICAgICAgICAgICAgICAvL3Byb2Nlc3Nlcy4gSGVuY2UgdGhlIGRlZmF1bHQgdHlwZSBtYXBwZXIgaXMgc2V0IHRvIHRoZSBjb25maWd1cmF0aW9uCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEZWZhdWx0VHlwZU1hcHBlcigpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTY2hlbWFUeXBlU3lzdGVtIHN0czsKLSAgICAgICAgICAgIExpc3QgY29tcGxldGVTY2hlbWFMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgTGlzdCB0b3BMZXZlbFNjaGVtYUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgICAgIC8vY3JlYXRlIHRoZSB0eXBlIG1hcHBlcgotICAgICAgICAgICAgLy9GaXJzdCB0cnkgdG8gdGFrZSB0aGUgb25lIHRoYXQgaXMgYWxyZWFkeSB0aGVyZQotICAgICAgICAgICAgVHlwZU1hcHBlciBtYXBwZXIgPSBjZ2NvbmZpZy5nZXRUeXBlTWFwcGVyKCk7Ci0gICAgICAgICAgICBpZiAobWFwcGVyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtYXBwZXIgPSBuZXcgSmF2YVR5cGVNYXBwZXIoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy9jaGFuZ2UgdGhlICBkZWZhdWx0IGNsYXNzIG5hbWUgb2YgdGhlIG1hcHBlciB0bwotICAgICAgICAgICAgLy94bWxiZWFucyBzcGVjaWZpYyBYTUxPYmplY3QKLSAgICAgICAgICAgIG1hcHBlci5zZXREZWZhdWx0TWFwcGluZ05hbWUoWG1sT2JqZWN0LmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgICAgIE1hcCBuYW1lU3BhY2VzTWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgICAgIExpc3QgYXhpc1NlcnZpY2VzID0gY2djb25maWcuZ2V0QXhpc1NlcnZpY2VzKCk7Ci0gICAgICAgICAgICBBeGlzU2VydmljZSBheGlzU2VydmljZTsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGF4aXNTZXJ2aWNlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICBheGlzU2VydmljZSA9IChBeGlzU2VydmljZSlpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBuYW1lU3BhY2VzTWFwLnB1dEFsbChheGlzU2VydmljZS5nZXROYW1lc3BhY2VNYXAoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHByb2Nlc3MgYWxsIHRoZSBzY2hlbWFzIGFuZCBtYWtlIGEgbGlzdCBvZiBhbGwgb2YgdGhlbSBmb3IKLSAgICAgICAgICAgIC8vIHJlc29sdmluZyBlbnRpdGllcwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzY2hlbWFzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgWG1sU2NoZW1hIHNjaGVtYSA9IChYbWxTY2hlbWEpc2NoZW1hcy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgWG1sT3B0aW9ucyBvcHRpb25zID0gbmV3IFhtbE9wdGlvbnMoKTsKLSAgICAgICAgICAgICAgICBvcHRpb25zLnNldExvYWRBZGRpdGlvbmFsTmFtZXNwYWNlcygKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVTcGFjZXNNYXApOyAvL2FkZCB0aGUgbmFtZXNwYWNlcwotICAgICAgICAgICAgICAgIFhtbFNjaGVtYVtdIGFsbFNjaGVtYXMgPSBTY2hlbWFVdGlsLmdldEFsbFNjaGVtYXMoc2NoZW1hKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGFsbFNjaGVtYXMubGVuZ3RoOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgY29tcGxldGVTY2hlbWFMaXN0LmFkZChhbGxTY2hlbWFzW2pdKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vbWFrZSBhbm90aGVyIGxpc3Qgb2YgdG9wIGxldmVsIHNjaGVtYXMgZm9yIHBhc3NpbmcgaW50byBYTUxiZWFucwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzY2hlbWFzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgWG1sU2NoZW1hIHNjaGVtYSA9IChYbWxTY2hlbWEpc2NoZW1hcy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgWG1sT3B0aW9ucyBvcHRpb25zID0gbmV3IFhtbE9wdGlvbnMoKTsKLSAgICAgICAgICAgICAgICBvcHRpb25zLnNldExvYWRBZGRpdGlvbmFsTmFtZXNwYWNlcygKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVTcGFjZXNNYXApOyAvL2FkZCB0aGUgbmFtZXNwYWNlcwotICAgICAgICAgICAgICAgIHRvcExldmVsU2NoZW1hTGlzdC5hZGQoCi0gICAgICAgICAgICAgICAgICAgICAgICBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U2NoZW1hQXNTdHJpbmcoc2NoZW1hKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIG9wdGlvbnMpKTsKLQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBYbWxTY2hlbWFDb2xsZWN0aW9uIGV4dHJhcyA9IG5ldyBYbWxTY2hlbWFDb2xsZWN0aW9uKCk7Ci0gICAgICAgICAgICAvLyBhZGQgdGhlIHRoaXJkIHBhcnR5IHNjaGVtYXMKLSAgICAgICAgICAgIC8vdG9kbyBwZXJoYXBzIGNoZWNraW5nIHRoZSBuYW1lc3BhY2VzIHdvdWxkIGJlIGEgZ29vZCBpZGVhIHRvCi0gICAgICAgICAgICAvL21ha2UgdGhlIGdlbmVyYXRlZCBjb2RlIHdvcmsgZWZmaWNpZW50bHkKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWRkaXRpb25hbFNjaGVtYXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBjb21wbGV0ZVNjaGVtYUxpc3QuYWRkKGV4dHJhcy5yZWFkKGFkZGl0aW9uYWxTY2hlbWFzW2ldKSk7Ci0gICAgICAgICAgICAgICAgdG9wTGV2ZWxTY2hlbWFMaXN0LmFkZChYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxTY2hlbWFzW2ldCi0gICAgICAgICAgICAgICAgICAgICAgICAsIG51bGwpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy9jb21waWxlIHRoZSB0eXBlIHN5c3RlbQotICAgICAgICAgICAgQXhpczJFbnRpdHlSZXNvbHZlciBlciA9IG5ldyBBeGlzMkVudGl0eVJlc29sdmVyKCk7Ci0gICAgICAgICAgICBlci5zZXRTY2hlbWFzKChYbWxTY2hlbWFbXSljb21wbGV0ZVNjaGVtYUxpc3QKLSAgICAgICAgICAgICAgICAgICAgLnRvQXJyYXkobmV3IFhtbFNjaGVtYVtjb21wbGV0ZVNjaGVtYUxpc3Quc2l6ZSgpXSkpOwotICAgICAgICAgICAgZXIuc2V0QmFzZVVyaShjZ2NvbmZpZy5nZXRCYXNlVVJJKCkpOwotCi0gICAgICAgICAgICBTdHJpbmcgeHNkQ29uZmlnRmlsZSA9IChTdHJpbmcpY2djb25maWcuZ2V0UHJvcGVydGllcygpLmdldChYTUxCZWFuc0V4dGVuc2lvbi5YU0RDT05GSUdfT1BUSU9OKTsKLQotICAgICAgICAgICAgLy8tRWphdmF2ZXJzaW9uIHN3aXRjaCB0byBYbWxPcHRpb25zIHRvIGdlbmVyYXRlIDEuNSBjb21wbGlhbnQgY29kZQotICAgICAgICAgICAgWG1sT3B0aW9ucyB4bWxPcHRpb25zCT0JbmV3IFhtbE9wdGlvbnMoKTsKLSAgICAgICAgICAgIHhtbE9wdGlvbnMuc2V0RW50aXR5UmVzb2x2ZXIoZXIpOwotICAgICAgICAgICAgLy90ZXN0IGlmIGphdmF2ZXJzaW9uIHByb3BlcnR5IGluIENvZGVHZW5Db25maWcKLSAgICAgICAgICAgIGlmKG51bGwhPWNnY29uZmlnLmdldFByb3BlcnR5KCJqYXZhdmVyc2lvbiIpKXsKLSAgICAgICAgICAgIAl4bWxPcHRpb25zLnB1dChYbWxPcHRpb25zLkdFTkVSQVRFX0pBVkFfVkVSU0lPTixjZ2NvbmZpZy5nZXRQcm9wZXJ0eSgiamF2YXZlcnNpb24iKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdHMgPSBYbWxCZWFucy5jb21waWxlWG1sQmVhbnMoCi0gICAgICAgICAgICAgICAgICAgIC8vIHNldCB0aGUgU1RTIG5hbWU7IGRlZmF1bHRzIHRvIG51bGwsIHdoaWNoIG1ha2VzIHRoZSBnZW5lcmF0ZWQgY2xhc3MKLSAgICAgICAgICAgICAgICAgICAgLy8gaW5jbHVkZSBhIHVuaXF1ZSAoYnV0IHJhbmRvbSkgU1RTIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgdHlwZVN5c3RlbU5hbWUsCi0gICAgICAgICAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAgICAgICAgIGNvbnZlcnRUb1NjaGVtYUFycmF5KHRvcExldmVsU2NoZW1hTGlzdCksCi0gICAgICAgICAgICAgICAgICAgIG5ldyBBeGlzMkJpbmRpbmdDb25maWcoY2djb25maWcuZ2V0VXJpMlBhY2thZ2VOYW1lTWFwKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeHNkQ29uZmlnRmlsZSksCi0gICAgICAgICAgICAgICAgICAgIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCksCi0gICAgICAgICAgICAgICAgICAgIG5ldyBBeGlzMkZpbGVyKGNnY29uZmlnKSwKLSAgICAgICAgICAgICAgICAgICAgeG1sT3B0aW9ucyk7Ci0KLSAgICAgICAgICAgIC8vIHBydW5lIHRoZSBnZW5lcmF0ZWQgc2NoZW1hIHR5cGUgc3lzdGVtIGFuZCBhZGQgdGhlIGxpc3Qgb2YgYmFzZTY0IHR5cGVzCi0gICAgICAgICAgICBjZ2NvbmZpZy5wdXRQcm9wZXJ0eShDb25zdGFudHMuQkFTRV82NF9QUk9QRVJUWV9LRVksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5kQmFzZTY0VHlwZXMoc3RzKSk7Ci0gICAgICAgICAgICBjZ2NvbmZpZy5wdXRQcm9wZXJ0eShDb25zdGFudHMuUExBSU5fQkFTRV82NF9QUk9QRVJUWV9LRVksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5kUGxhaW5CYXNlNjRUeXBlcyhzdHMpKTsKLQotICAgICAgICAgICAgU2NoZW1hVHlwZVN5c3RlbSBpbnRlcm5hbCA9IFhtbEJlYW5zLmdldEJ1aWx0aW5UeXBlU3lzdGVtKCk7Ci0gICAgICAgICAgICBTY2hlbWFUeXBlW10gc2NoZW1hVHlwZXMgPSBpbnRlcm5hbC5nbG9iYWxUeXBlcygpOwotICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBzY2hlbWFUeXBlcy5sZW5ndGg7IGorKykgewotICAgICAgICAgICAgICAgIG1hcHBlci5hZGRUeXBlTWFwcGluZ05hbWUoc2NoZW1hVHlwZXNbal0uZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hVHlwZXNbal0uZ2V0RnVsbEphdmFOYW1lKCkpOwotCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vZ2V0IHRoZSBzY2hlbWF0eXBlcyBhbmQgYWRkIHRoZSBkb2N1bWVudCB0eXBlcyB0byB0aGUgdHlwZSBtYXBwZXIKLSAgICAgICAgICAgIHNjaGVtYVR5cGVzID0gc3RzLmRvY3VtZW50VHlwZXMoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgc2NoZW1hVHlwZXMubGVuZ3RoOyBqKyspIHsKLSAgICAgICAgICAgICAgICBtYXBwZXIuYWRkVHlwZU1hcHBpbmdOYW1lKHNjaGVtYVR5cGVzW2pdLmdldERvY3VtZW50RWxlbWVudE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYVR5cGVzW2pdLmdldEZ1bGxKYXZhTmFtZSgpKTsKLQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvL3Byb2Nlc3MgdGhlIHVud3JhcHBlZCBwYXJhbWV0ZXJzCi0gICAgICAgICAgICBpZiAoIWNnY29uZmlnLmlzUGFyYW1ldGVyc1dyYXBwZWQoKSkgewotICAgICAgICAgICAgICAgIC8vZmlndXJlIG91dCB0aGUgdW53cmFwcGVkIG9wZXJhdGlvbnMKLSAgICAgICAgICAgICAgICBheGlzU2VydmljZXMgPSBjZ2NvbmZpZy5nZXRBeGlzU2VydmljZXMoKTsKLSAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIHNlcnZpY2VzSXRlciA9IGF4aXNTZXJ2aWNlcy5pdGVyYXRvcigpOyBzZXJ2aWNlc0l0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgICAgICBheGlzU2VydmljZSA9IChBeGlzU2VydmljZSlzZXJ2aWNlc0l0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIG9wZXJhdGlvbnMgPSBheGlzU2VydmljZS5nZXRPcGVyYXRpb25zKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9ucy5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBeGlzT3BlcmF0aW9uIG9wID0gKEF4aXNPcGVyYXRpb24pb3BlcmF0aW9ucy5uZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChXU0RMVXRpbC5pc0lucHV0UHJlc2VudEZvck1FUChvcC5nZXRNZXNzYWdlRXhjaGFuZ2VQYXR0ZXJuKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQXhpc01lc3NhZ2UgbWVzc2FnZSA9IG9wLmdldE1lc3NhZ2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU0RMQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfSU5fVkFMVUUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZ2V0UGFyYW1ldGVyKENvbnN0YW50cy5VTldSQVBQRURfS0VZKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYUdsb2JhbEVsZW1lbnQgeG1sYmVhbnNFbGVtZW50ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHMuZmluZEVsZW1lbnQobWVzc2FnZS5nZXRFbGVtZW50UU5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYVR5cGUgc1R5cGUgPSB4bWxiZWFuc0VsZW1lbnQuZ2V0VHlwZSgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYVByb3BlcnR5W10gZWxlbWVudFByb3BlcnRpZXMgPSBzVHlwZS5nZXRFbGVtZW50UHJvcGVydGllcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRQcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFQcm9wZXJ0eSBlbGVtZW50UHJvcGVydHkgPSBlbGVtZW50UHJvcGVydGllc1tpXTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUU5hbWUgcGFydFFOYW1lID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NETFV0aWwuZ2V0UGFydFFOYW1lKG9wLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdTRExDb25zdGFudHMuSU5QVVRfUEFSVF9RTkFNRV9TVUZGSVgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50UHJvcGVydHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdGhpcyB0eXBlIGlzIGJhc2VkIG9uIGEgcHJpbWl0aXZlIHR5cGUtIHVzZSB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vcHJpbWl0aXZlIHR5cGUgbmFtZSBpbiB0aGlzIGNhc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBmdWxsSmF2ZU5hbWUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50UHJvcGVydHkuZ2V0VHlwZSgpLmdldEZ1bGxKYXZhTmFtZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnRQcm9wZXJ0eS5leHRlbmRzSmF2YUFycmF5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdWxsSmF2ZU5hbWUgPSBmdWxsSmF2ZU5hbWUuY29uY2F0KCJbXSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGVyLmFkZFR5cGVNYXBwaW5nTmFtZShwYXJ0UU5hbWUsIGZ1bGxKYXZlTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFUeXBlIHByaW1pdGl2ZVR5cGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50UHJvcGVydHkuZ2V0VHlwZSgpLmdldFByaW1pdGl2ZVR5cGUoKTsKLQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJpbWl0aXZlVHlwZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGVyLmFkZFR5cGVNYXBwaW5nU3RhdHVzKHBhcnRRTmFtZSwgQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50UHJvcGVydHkuZXh0ZW5kc0phdmFBcnJheSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGVyLmFkZFR5cGVNYXBwaW5nU3RhdHVzKHBhcnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLkFSUkFZX1RZUEUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoV1NETFV0aWwuaXNPdXRwdXRQcmVzZW50Rm9yTUVQKG9wLmdldE1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4oKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBeGlzTWVzc2FnZSBtZXNzYWdlID0gb3AuZ2V0TWVzc2FnZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9PVVRfVkFMVUUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZ2V0UGFyYW1ldGVyKENvbnN0YW50cy5VTldSQVBQRURfS0VZKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYUdsb2JhbEVsZW1lbnQgeG1sYmVhbnNFbGVtZW50ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHMuZmluZEVsZW1lbnQobWVzc2FnZS5nZXRFbGVtZW50UU5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYVR5cGUgc1R5cGUgPSB4bWxiZWFuc0VsZW1lbnQuZ2V0VHlwZSgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYVByb3BlcnR5W10gZWxlbWVudFByb3BlcnRpZXMgPSBzVHlwZS5nZXRFbGVtZW50UHJvcGVydGllcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRQcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFQcm9wZXJ0eSBlbGVtZW50UHJvcGVydHkgPSBlbGVtZW50UHJvcGVydGllc1tpXTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUU5hbWUgcGFydFFOYW1lID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NETFV0aWwuZ2V0UGFydFFOYW1lKG9wLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdTRExDb25zdGFudHMuT1VUUFVUX1BBUlRfUU5BTUVfU1VGRklYLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFByb3BlcnR5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3RoaXMgdHlwZSBpcyBiYXNlZCBvbiBhIHByaW1pdGl2ZSB0eXBlLSB1c2UgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3ByaW1pdGl2ZSB0eXBlIG5hbWUgaW4gdGhpcyBjYXNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZnVsbEphdmVOYW1lID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFByb3BlcnR5LmdldFR5cGUoKS5nZXRGdWxsSmF2YU5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50UHJvcGVydHkuZXh0ZW5kc0phdmFBcnJheSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVsbEphdmVOYW1lID0gZnVsbEphdmVOYW1lLmNvbmNhdCgiW10iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBlci5hZGRUeXBlTWFwcGluZ05hbWUocGFydFFOYW1lLCBmdWxsSmF2ZU5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hVHlwZSBwcmltaXRpdmVUeXBlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFByb3BlcnR5LmdldFR5cGUoKS5nZXRQcmltaXRpdmVUeXBlKCk7Ci0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByaW1pdGl2ZVR5cGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBlci5hZGRUeXBlTWFwcGluZ1N0YXR1cyhwYXJ0UU5hbWUsIEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudFByb3BlcnR5LmV4dGVuZHNKYXZhQXJyYXkoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBlci5hZGRUeXBlTWFwcGluZ1N0YXR1cyhwYXJ0UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5BUlJBWV9UWVBFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy9yZXR1cm4gbWFwcGVyIHRvIGJlIHNldCBpbiB0aGUgY29uZmlnCi0gICAgICAgICAgICByZXR1cm4gbWFwcGVyOwotCi0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUG9wdWxhdGUgdGhlIGJhc2U2NCB0eXBlcyBUaGUgYWxnbyBpcyB0byBsb29rIGZvciBzaW1wbGV0eXBlcyB0aGF0IGhhdmUgYmFzZTY0IGNvbnRlbnQsIGFuZAotICAgICAqIHRoZW4gc3RlcCBvdXQgb2YgdGhhdCBvbmVzdGVwIGFuZCBnZXQgdGhlIGVsZW1lbnQuIEZvciBub3cgdGhlcmUncyBhbiBleHRlbmRlZCBjaGVjayB0byBzZWUKLSAgICAgKiB3aGV0aGVyIHRoZSBzaW1wbGUgdHlwZSBpcyByZWxhdGVkIHRvIHRoZSBYbWltZTpjb250ZW50VHlwZSEKLSAgICAgKgotICAgICAqIEBwYXJhbSBzdHMKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0IGZpbmRCYXNlNjRUeXBlcyhTY2hlbWFUeXBlU3lzdGVtIHN0cykgewotICAgICAgICBMaXN0IGFsbFNlZW5UeXBlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgTGlzdCBiYXNlNjRFbGVtZW50UU5hbWVzTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgU2NoZW1hVHlwZSBvdXRlclR5cGU7Ci0gICAgICAgIC8vYWRkIHRoZSBkb2N1bWVudCB0eXBlcyBhbmQgZ2xvYmFsIHR5cGVzCi0gICAgICAgIGFsbFNlZW5UeXBlcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChzdHMuZG9jdW1lbnRUeXBlcygpKSk7Ci0gICAgICAgIGFsbFNlZW5UeXBlcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChzdHMuZ2xvYmFsVHlwZXMoKSkpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWxsU2VlblR5cGVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBTY2hlbWFUeXBlIHNUeXBlID0gKFNjaGVtYVR5cGUpYWxsU2VlblR5cGVzLmdldChpKTsKLQotICAgICAgICAgICAgaWYgKHNUeXBlLmdldENvbnRlbnRUeXBlKCkgPT0gU2NoZW1hVHlwZS5TSU1QTEVfQ09OVEVOVCAmJgotICAgICAgICAgICAgICAgICAgICBzVHlwZS5nZXRQcmltaXRpdmVUeXBlKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChvcmcuYXBhY2hlLmF4aXMyLm5hbWVzcGFjZS5Db25zdGFudHMuQkFTRV82NF9DT05URU5UX1FOQU1FCi0gICAgICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKHNUeXBlLmdldFByaW1pdGl2ZVR5cGUoKS5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG91dGVyVHlwZSA9IHNUeXBlLmdldE91dGVyVHlwZSgpOwotICAgICAgICAgICAgICAgICAgICAvL2NoZWNrIHRoZSBvdXRlciB0eXBlIGZ1cnRoZXIgdG8gc2VlIHdoZXRoZXIgaXQgaGFzIHRoZSBjb250ZW50dHlwZSBhdHRyaWJ1dGUgZnJvbQotICAgICAgICAgICAgICAgICAgICAvL1hNaW1lIG5hbWVzcGFjZQotICAgICAgICAgICAgICAgICAgICBTY2hlbWFQcm9wZXJ0eVtdIHByb3BlcnRpZXMgPSBzVHlwZS5nZXRQcm9wZXJ0aWVzKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgcHJvcGVydGllcy5sZW5ndGg7IGorKykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9yZy5hcGFjaGUuYXhpczIubmFtZXNwYWNlLkNvbnN0YW50cy5YTUlNRV9DT05URU5UX1RZUEVfUU5BTUUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmVxdWFscyhwcm9wZXJ0aWVzW2pdLmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2FkZCB0aGlzIG9ubHkgaWYgaXQgaXMgYSBkb2N1bWVudCB0eXBlID8/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG91dGVyVHlwZS5pc0RvY3VtZW50VHlwZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U2NEVsZW1lbnRRTmFtZXNMaXN0LmFkZChvdXRlclR5cGUuZ2V0RG9jdW1lbnRFbGVtZW50TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvL2FkZCBhbnkgb2YgdGhlIGNoaWxkIHR5cGVzIGlmIHRoZXJlIGFyZSBhbnkKLSAgICAgICAgICAgIGFsbFNlZW5UeXBlcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChzVHlwZS5nZXRBbm9ueW1vdXNUeXBlcygpKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gYmFzZTY0RWxlbWVudFFOYW1lc0xpc3Q7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHN0cwotICAgICAqIEByZXR1cm4gYXJyYXkgbGlzdAotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIExpc3QgZmluZFBsYWluQmFzZTY0VHlwZXMoU2NoZW1hVHlwZVN5c3RlbSBzdHMpIHsKLSAgICAgICAgQXJyYXlMaXN0IGFsbFNlZW5UeXBlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgICAgICBhbGxTZWVuVHlwZXMuYWRkQWxsKEFycmF5cy5hc0xpc3Qoc3RzLmRvY3VtZW50VHlwZXMoKSkpOwotICAgICAgICBhbGxTZWVuVHlwZXMuYWRkQWxsKEFycmF5cy5hc0xpc3Qoc3RzLmdsb2JhbFR5cGVzKCkpKTsKLQotICAgICAgICBBcnJheUxpc3QgYmFzZTY0VHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGFsbFNlZW5UeXBlcy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBTY2hlbWFUeXBlIHN0eXBlID0gKFNjaGVtYVR5cGUpaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgZmluZFBsYWluQmFzZTY0VHlwZXMoc3R5cGUsIGJhc2U2NFR5cGVzLCBuZXcgQXJyYXlMaXN0KCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGJhc2U2NFR5cGVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBzdHlwZQotICAgICAqIEBwYXJhbSBiYXNlNjRUeXBlcwotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZmluZFBsYWluQmFzZTY0VHlwZXMoU2NoZW1hVHlwZSBzdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5TGlzdCBiYXNlNjRUeXBlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5TGlzdCBwcm9jZXNzZWRUeXBlcykgewotCi0gICAgICAgIFNjaGVtYVByb3BlcnR5W10gZWxlbWVudFByb3BlcnRpZXMgPSBzdHlwZS5nZXRFbGVtZW50UHJvcGVydGllcygpOwotICAgICAgICBRTmFtZSBuYW1lOwotICAgICAgICBTY2hlbWFUeXBlIHNjaGVtYVR5cGU7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudFByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIHNjaGVtYVR5cGUgPSBlbGVtZW50UHJvcGVydGllc1tpXS5nZXRUeXBlKCk7Ci0gICAgICAgICAgICBuYW1lID0gZWxlbWVudFByb3BlcnRpZXNbaV0uZ2V0TmFtZSgpOwotICAgICAgICAgICAgaWYgKCFiYXNlNjRUeXBlcy5jb250YWlucyhuYW1lKSAmJiAhcHJvY2Vzc2VkVHlwZXMuY29udGFpbnMoc2NoZW1hVHlwZS5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgcHJvY2Vzc2VkVHlwZXMuYWRkKHN0eXBlLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKHNjaGVtYVR5cGUuaXNQcmltaXRpdmVUeXBlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgU2NoZW1hVHlwZSBwcmltaXRpdmVUeXBlID0gc2NoZW1hVHlwZS5nZXRQcmltaXRpdmVUeXBlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvcmcuYXBhY2hlLmF4aXMyLm5hbWVzcGFjZS5Db25zdGFudHMuQkFTRV82NF9DT05URU5UX1FOQU1FCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmVxdWFscyhwcmltaXRpdmVUeXBlLmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U2NFR5cGVzLmFkZChuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZmluZFBsYWluQmFzZTY0VHlwZXMoc2NoZW1hVHlwZSwgYmFzZTY0VHlwZXMsIHByb2Nlc3NlZFR5cGVzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotCi0gICAgfQotCi0KLSAgICAvKiogUHJpdmF0ZSBjbGFzcyB0byBnZW5lcmF0ZSB0aGUgZmlsZXIgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBBeGlzMkZpbGVyIGltcGxlbWVudHMgRmlsZXIgewotCi0gICAgICAgIHByaXZhdGUgRmlsZSBsb2NhdGlvbjsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGZsYXR0ZW4gPSBmYWxzZTsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgcmVzb3VyY2VEaXJOYW1lOwotICAgICAgICBwcml2YXRlIFN0cmluZyBzcmNEaXJOYW1lOwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQV9GSUxFX0VYVEVOU0lPTiA9ICIuamF2YSI7Ci0KLSAgICAgICAgcHJpdmF0ZSBBeGlzMkZpbGVyKENvZGVHZW5Db25maWd1cmF0aW9uIGNvbmZpZykgewotICAgICAgICAgICAgbG9jYXRpb24gPSBjb25maWcuZ2V0T3V0cHV0TG9jYXRpb24oKTsKLSAgICAgICAgICAgIGZsYXR0ZW4gPSBjb25maWcuaXNGbGF0dGVuRmlsZXMoKTsKLSAgICAgICAgICAgIHJlc291cmNlRGlyTmFtZSA9IGNvbmZpZy5nZXRSZXNvdXJjZUxvY2F0aW9uKCk7Ci0gICAgICAgICAgICBzcmNEaXJOYW1lID0gY29uZmlnLmdldFNvdXJjZUxvY2F0aW9uKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgT3V0cHV0U3RyZWFtIGNyZWF0ZUJpbmFyeUZpbGUoU3RyaW5nIHR5cGVuYW1lKQotICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBGaWxlIHJlc291cmNlc0RpcmVjdG9yeSA9Ci0gICAgICAgICAgICAgICAgICAgIGZsYXR0ZW4gPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZShsb2NhdGlvbiwgcmVzb3VyY2VEaXJOYW1lKTsKLQotICAgICAgICAgICAgaWYgKCFyZXNvdXJjZXNEaXJlY3RvcnkuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICByZXNvdXJjZXNEaXJlY3RvcnkubWtkaXJzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShyZXNvdXJjZXNEaXJlY3RvcnksIHR5cGVuYW1lKTsKLSAgICAgICAgICAgIGZpbGUuZ2V0UGFyZW50RmlsZSgpLm1rZGlycygpOwotICAgICAgICAgICAgZmlsZS5jcmVhdGVOZXdGaWxlKCk7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgV3JpdGVyIGNyZWF0ZVNvdXJjZUZpbGUoU3RyaW5nIHR5cGVuYW1lKQotICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICB0eXBlbmFtZSA9Ci0gICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lLnJlcGxhY2UoJy4nLCBGaWxlLnNlcGFyYXRvckNoYXIpOwotCi0gICAgICAgICAgICBGaWxlIG91dHB1dERpciA9Ci0gICAgICAgICAgICAgICAgICAgIGZsYXR0ZW4gPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZShsb2NhdGlvbiwgc3JjRGlyTmFtZSk7Ci0KLSAgICAgICAgICAgIGlmICghb3V0cHV0RGlyLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgb3V0cHV0RGlyLm1rZGlycygpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUob3V0cHV0RGlyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgKyBKQVZBX0ZJTEVfRVhURU5TSU9OKTsKLSAgICAgICAgICAgIGZpbGUuZ2V0UGFyZW50RmlsZSgpLm1rZGlycygpOwotICAgICAgICAgICAgZmlsZS5jcmVhdGVOZXdGaWxlKCk7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEZpbGVXcml0ZXIoZmlsZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0IHNjaGVtYSBpbnRvIGEgU3RyaW5nCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2NoZW1hCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFNjaGVtYUFzU3RyaW5nKFhtbFNjaGVtYSBzY2hlbWEpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZ1dyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgICAgIHNjaGVtYS53cml0ZSh3cml0ZXIpOwotICAgICAgICByZXR1cm4gd3JpdGVyLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3VzdG9tIGJpbmRpbmcgY29uZmlndXJhdGlvbiBmb3IgdGhlIGNvZGUgZ2VuZXJhdG9yLiBUaGlzIGNvbnRyb2xzIGhvdyB0aGUgbmFtZXNwYWNlcyBhcmUKLSAgICAgKiBzdWZmaXhlZC9wcmVmaXhlZAotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEF4aXMyQmluZGluZ0NvbmZpZyBleHRlbmRzIEJpbmRpbmdDb25maWcgewotCi0gICAgICAgIHByaXZhdGUgTWFwIHVyaTJwYWNrYWdlTWFwcGluZ3MgPSBudWxsOwotICAgICAgICBwcml2YXRlIFhTRENvbmZpZyB4c2RDb25maWcgPSBudWxsOwotCi0gICAgICAgIHB1YmxpYyBBeGlzMkJpbmRpbmdDb25maWcoTWFwIHVyaTJwYWNrYWdlTWFwcGluZ3MsIFN0cmluZyB4c2RDb25maWdmaWxlKSB7Ci0gICAgICAgICAgICB0aGlzLnVyaTJwYWNrYWdlTWFwcGluZ3MgPSB1cmkycGFja2FnZU1hcHBpbmdzOwotICAgICAgICAgICAgaWYgKHRoaXMudXJpMnBhY2thZ2VNYXBwaW5ncyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy9tYWtlIGFuIGVtcHR5IG9uZSB0byBhdm9pZCBuYXN0eSBzdXJwcmlzZXMKLSAgICAgICAgICAgICAgICB0aGlzLnVyaTJwYWNrYWdlTWFwcGluZ3MgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBEbyB3ZSBoYXZlIGFuIHhzZGNvbmZpZyBmaWxlPwotICAgICAgICAgICAgaWYgKHhzZENvbmZpZ2ZpbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHhzZENvbmZpZyA9IG5ldyBYU0RDb25maWcoeHNkQ29uZmlnZmlsZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGxvb2t1cFBhY2thZ2VGb3JOYW1lc3BhY2UoU3RyaW5nIHVyaSkgewotICAgICAgICAgICAgLyogSWYgdGhlIHhzZGNvbmZpZyBmaWxlIGhhcyBtYXBwaW5ncywgd2UnbGwgdXNlIHRoZW0gaW5zdGVhZCBvZiB0aGUgLXAgb3B0aW9uLgotICAgICAgICAgICAgICogSWYgd2UgaGF2ZSBhbiB4c2Rjb25maWcgZmlsZSBidXQgbm8gbmFtZXNwYWNlIHRvIHBhY2thZ2UgbWFwcGluZ3MsIHRoZW4gd2UnbGwKLSAgICAgICAgICAgICAqIGRlZmVyIHRvIHRoZSAtcCBvcHRpb24uCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmICh4c2RDb25maWcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmICh4c2RDb25maWcuaGFzTmFtZXNwYWNlVG9KYXZhUGFja2FnZU1hcHBpbmdzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiUkVUVVJOSU5HICIgKyB1cmkgKyAiID0gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeHNkQ29uZmlnLmdldE5hbWVzcGFjZXNUb0phdmFQYWNrYWdlcygpLmdldCh1cmkpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChTdHJpbmcpeHNkQ29uZmlnLmdldE5hbWVzcGFjZXNUb0phdmFQYWNrYWdlcygpLmdldCh1cmkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHVyaTJwYWNrYWdlTWFwcGluZ3MuY29udGFpbnNLZXkodXJpKSkgewotICAgICAgICAgICAgICAgIHJldHVybiAoU3RyaW5nKXVyaTJwYWNrYWdlTWFwcGluZ3MuZ2V0KHVyaSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBVUkxQcm9jZXNzb3IubWFrZVBhY2thZ2VOYW1lKHVyaSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGxvb2t1cEphdmFuYW1lRm9yUU5hbWUoUU5hbWUgcW5hbWUpIHsKLSAgICAgICAgICAgIC8qIFRoZSBtYXBwaW5ncyBhcmUgc3RvcmVkIGluIHRoZSBmb3JtYXQ6Ci0gICAgICAgICAgICAqIE5BTUVTUEFDRTpMT0NBTF9OQU1FLCBpLmUuCi0gICAgICAgICAgICAqIHVybjp3ZWVnaWV0ZWNoOm1pbmVydmE6bW9kdWxlVHlwZQotICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmICh4c2RDb25maWcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKSArICI6IiArIHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIGlmICh4c2RDb25maWcuZ2V0U2NoZW1hVHlwZXNUb0phdmFOYW1lcygpLmNvbnRhaW5zS2V5KGtleSkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJSRVRVUk5JTkcgIiArIHFuYW1lLmdldExvY2FsUGFydCgpICsgIiA9ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhzZENvbmZpZy5nZXRTY2hlbWFUeXBlc1RvSmF2YU5hbWVzKCkuZ2V0KGtleSkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFN0cmluZyl4c2RDb25maWcuZ2V0U2NoZW1hVHlwZXNUb0phdmFOYW1lcygpLmdldChrZXkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmxvb2t1cEphdmFuYW1lRm9yUU5hbWUocW5hbWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyBhIGdpdmVuIHZlY3RvciBvZiBzY2hlbWFEb2N1bWVudHMgdG8gWG1sQmVhbnMgcHJvY2Vzc2FibGUgc2NoZW1hIG9iamVjdHMuIE9uZQotICAgICAqIGRyYXdiYWNrIHdlIGhhdmUgaGVyZSBpcyB0aGUgbm9uLWluY2x1c2lvbiBvZiB1bnRhcmdldGVkIG5hbWVzcGFjZXMKLSAgICAgKgotICAgICAqIEBwYXJhbSB2ZWMKLSAgICAgKiBAcmV0dXJuIHNjaGVtYSBhcnJheQotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIFNjaGVtYURvY3VtZW50LlNjaGVtYVtdIGNvbnZlcnRUb1NjaGVtYUFycmF5KExpc3QgdmVjKSB7Ci0gICAgICAgIFNjaGVtYURvY3VtZW50W10gc2NoZW1hRG9jdW1lbnRzID0KLSAgICAgICAgICAgICAgICAoU2NoZW1hRG9jdW1lbnRbXSl2ZWMudG9BcnJheShuZXcgU2NoZW1hRG9jdW1lbnRbdmVjLnNpemUoKV0pOwotICAgICAgICAvL3JlbW92ZSBkdXBsaWNhdGVzCi0gICAgICAgIFZlY3RvciB1bmlxdWVTY2hlbWFzID0gbmV3IFZlY3RvcihzY2hlbWFEb2N1bWVudHMubGVuZ3RoKTsKLSAgICAgICAgVmVjdG9yIHVuaXF1ZVNjaGVtYVRucyA9IG5ldyBWZWN0b3Ioc2NoZW1hRG9jdW1lbnRzLmxlbmd0aCk7Ci0gICAgICAgIFNjaGVtYURvY3VtZW50LlNjaGVtYSBzOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNjaGVtYURvY3VtZW50cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgcyA9IHNjaGVtYURvY3VtZW50c1tpXS5nZXRTY2hlbWEoKTsKLSAgICAgICAgICAgIGlmICghdW5pcXVlU2NoZW1hVG5zLmNvbnRhaW5zKHMuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpKSB7Ci0gICAgICAgICAgICAgICAgdW5pcXVlU2NoZW1hcy5hZGQocyk7Ci0gICAgICAgICAgICAgICAgdW5pcXVlU2NoZW1hVG5zLmFkZChzLmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAocy5nZXRUYXJnZXROYW1lc3BhY2UoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdW5pcXVlU2NoZW1hcy5hZGQocyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIChTY2hlbWFEb2N1bWVudC5TY2hlbWFbXSkKLSAgICAgICAgICAgICAgICB1bmlxdWVTY2hlbWFzLnRvQXJyYXkoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgU2NoZW1hRG9jdW1lbnQuU2NoZW1hW3VuaXF1ZVNjaGVtYXMuc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgLyoqIEF4aXMyIHNwZWNpZmljIGVudGl0eSByZXNvbHZlciAqLwotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEF4aXMyRW50aXR5UmVzb2x2ZXIgaW1wbGVtZW50cyBFbnRpdHlSZXNvbHZlciB7Ci0gICAgICAgIHByaXZhdGUgWG1sU2NoZW1hW10gc2NoZW1hczsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgYmFzZVVyaTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQHBhcmFtIHB1YmxpY0lkIC0gdGhpcyBpcyB0aGUgdGFyZ2V0IG5hbWVzcGFjZQotICAgICAgICAgKiBAcGFyYW0gc3lzdGVtSWQgLSB0aGlzIGlzIHRoZSBsb2NhdGlvbiAodmFsdWUgb2Ygc2NoZW1hTG9jYXRpb24pCi0gICAgICAgICAqIEByZXR1cm4KLSAgICAgICAgICogQHNlZSBFbnRpdHlSZXNvbHZlciNyZXNvbHZlRW50aXR5KFN0cmluZywgU3RyaW5nKQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIElucHV0U291cmNlIHJlc29sdmVFbnRpdHkoU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpCi0gICAgICAgICAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgaWYgKHN5c3RlbUlkLnN0YXJ0c1dpdGgoInByb2plY3Q6Ly9sb2NhbC8iKSkgewotICAgICAgICAgICAgICAgIHN5c3RlbUlkID0gc3lzdGVtSWQuc3Vic3RyaW5nKCJwcm9qZWN0Oi8vbG9jYWwvIi5sZW5ndGgoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGlmIHRoZSBzeXN0ZW0gaWQgaGFzIC8vIGZpbmFsIHN5c3RlbSBpZCBnaXZlcyBvbmx5IG9uZSAvIGFmdGVyIHRva2VuaXppbmcgcHJvY2VzcwotICAgICAgICAgICAgLy8gdG8gYXZvaWQgdGhpcyB3ZSBjaGVjayB3aGV0aGVyIGl0IGlzIHN0YXJ0ZWQgd2l0aCBodHRwOi8vIG9yIG5vdAotICAgICAgICAgICAgaWYgKCFzeXN0ZW1JZC5zdGFydHNXaXRoKCJodHRwOi8vIikpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmdUb2tlbml6ZXIgcGF0aEVsZW1lbnRzID0gbmV3IFN0cmluZ1Rva2VuaXplcihzeXN0ZW1JZCwgIi8iKTsKLSAgICAgICAgICAgICAgICBTdGFjayBwYXRoRWxlbWVudFN0YWNrID0gbmV3IFN0YWNrKCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKHBhdGhFbGVtZW50cy5oYXNNb3JlVG9rZW5zKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhdGhFbGVtZW50ID0gcGF0aEVsZW1lbnRzLm5leHRUb2tlbigpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIi4iLmVxdWFscyhwYXRoRWxlbWVudCkpIHsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgiLi4iLmVxdWFscyhwYXRoRWxlbWVudCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGF0aEVsZW1lbnRTdGFjay5pc0VtcHR5KCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aEVsZW1lbnRTdGFjay5wb3AoKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhFbGVtZW50U3RhY2sucHVzaChwYXRoRWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHBhdGhCdWlsZGVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHBhdGhFbGVtZW50U3RhY2suaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhdGhCdWlsZGVyLmFwcGVuZChGaWxlLnNlcGFyYXRvciArIGl0ZXIubmV4dCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc3lzdGVtSWQgPSBwYXRoQnVpbGRlci50b1N0cmluZygpLnN1YnN0cmluZygxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotCi0gICAgICAgICAgICBsb2cuaW5mbygiUmVzb2x2aW5nIHNjaGVtYSB3aXRoIHB1YmxpY0lkIFsiICsgcHVibGljSWQgKyAiXSBhbmQgc3lzdGVtSWQgWyIgKyBzeXN0ZW1JZCArICJdIik7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2NoZW1hcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBYbWxTY2hlbWEgc2NoZW1hID0gc2NoZW1hc1tpXTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNjaGVtYS5nZXRTb3VyY2VVUkkoKSAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hLmdldFNvdXJjZVVSSSgpLmVuZHNXaXRoKHN5c3RlbUlkLnJlcGxhY2VBbGwoIlxcXFwiLCAiLyIpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBzY2hlbWEuZ2V0U291cmNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBGaWxlIGYgPSBnZXRGaWxlRnJvbVVSSShwYXRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKGYuZXhpc3RzKCkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElucHV0U291cmNlIHNvdXJjZSA9IG5ldyBJbnB1dFNvdXJjZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZS5zZXRTeXN0ZW1JZChzY2hlbWEuZ2V0U291cmNlVVJJKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzb3VyY2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSW5wdXRTb3VyY2UoZ2V0U2NoZW1hQXNJbnB1dFN0cmVhbShzY2hlbWFzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNjaGVtYXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgWG1sU2NoZW1hIHNjaGVtYSA9IHNjaGVtYXNbaV07Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2UoKS5lcXVhbHMocHVibGljSWQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IElucHV0U291cmNlKGdldFNjaGVtYUFzSW5wdXRTdHJlYW0oc2NoZW1hc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChzeXN0ZW1JZC5pbmRleE9mKCc6JykgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgLy9pZiB0aGUgYmFzZSBVUkkgaXMgbWlzc2luZyB0aGVuIGF0dGFjaGUgdGhlIGZpbGU6Ly8vIHRvIGl0Ci0gICAgICAgICAgICAgICAgICAgIC8vaWYgdGhlIHN5c3RlbUlkIGFjdHVhbGx5IGhhZCBhIHNjaGVtZSB0aGVuIGFzIHBlciB0aGUgVVJMCi0gICAgICAgICAgICAgICAgICAgIC8vY29uc3RydWN0b3IsIHRoZSBjb250ZXh0IFVSTCBzY2hlbWUgc2hvdWxkIGJlIGlnbm9yZWQKLSAgICAgICAgICAgICAgICAgICAgYmFzZVVyaSA9IChiYXNlVXJpID09IG51bGwpID8gImZpbGU6Ly8vIiA6IGJhc2VVcmk7Ci0gICAgICAgICAgICAgICAgICAgIFVSTCB1cmwgPSBuZXcgVVJMKGJhc2VVcmkgKyBzeXN0ZW1JZCk7Ci0gICAgICAgICAgICAgICAgICAgIElucHV0U291cmNlIHNvdXJjZSA9IG5ldyBJbnB1dFNvdXJjZSgpOwotICAgICAgICAgICAgICAgICAgICBzb3VyY2Uuc2V0U3lzdGVtSWQodXJsLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gc291cmNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gWE1MVXRpbHMuZ2V0RW1wdHlJbnB1dFNvdXJjZSgpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU0FYRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBGaWxlIGdldEZpbGVGcm9tVVJJKFN0cmluZyBwYXRoKSB7Ci0gICAgICAgICAgICBpZihwYXRoLnN0YXJ0c1dpdGgoImZpbGU6Ly8vIikpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGggPSBwYXRoLnN1YnN0cmluZyg4KTsKLSAgICAgICAgICAgIH0gZWxzZSBpZihwYXRoLnN0YXJ0c1dpdGgoImZpbGU6Ly8iKSl7Ci0gICAgICAgICAgICAgICAgcGF0aCA9IHBhdGguc3Vic3RyaW5nKDcpOwotICAgICAgICAgICAgfSBlbHNlIGlmKHBhdGguc3RhcnRzV2l0aCgiZmlsZTovIikpewotICAgICAgICAgICAgICAgIHBhdGggPSBwYXRoLnN1YnN0cmluZyg2KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBuZXcgRmlsZShwYXRoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBYbWxTY2hlbWFbXSAgZ2V0U2NoZW1hcygpIHsKLSAgICAgICAgICAgIHJldHVybiBzY2hlbWFzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0U2NoZW1hcyhYbWxTY2hlbWFbXSBzY2hlbWFzKSB7Ci0gICAgICAgICAgICB0aGlzLnNjaGVtYXMgPSBzY2hlbWFzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRCYXNlVXJpKCkgewotICAgICAgICAgICAgcmV0dXJuIGJhc2VVcmk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRCYXNlVXJpKFN0cmluZyBiYXNlVXJpKSB7Ci0gICAgICAgICAgICB0aGlzLmJhc2VVcmkgPSBiYXNlVXJpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENvbnZlcnQgc2NoZW1hIGludG8gYSBJbnB1dFN0cmVhbQotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gc2NoZW1hCi0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIElucHV0U3RyZWFtIGdldFNjaGVtYUFzSW5wdXRTdHJlYW0oWG1sU2NoZW1hIHNjaGVtYSl7Ci0gICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgIHNjaGVtYS53cml0ZShiYW9zKTsKLSAgICAgICAgIHJldHVybiBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotCi19Ci0KLQotCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy94bWxiZWFucy9zcmMvb3JnL2FwYWNoZS9heGlzMi94bWxiZWFucy9YU0RDb25maWcuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3htbGJlYW5zL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3htbGJlYW5zL1hTRENvbmZpZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWE4NGY3Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3htbGJlYW5zL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3htbGJlYW5zL1hTRENvbmZpZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qIENWUyBIZWFkZXIKLSAgICRJZCQKLSAgICRMb2ckCi0qLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIueG1sYmVhbnM7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcueG1sLnNheC5FcnJvckhhbmRsZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotcHVibGljIGNsYXNzIFhTRENvbmZpZyB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTEJFQU5TX05TID0gImh0dHA6Ly94bWwuYXBhY2hlLm9yZy94bWxiZWFucy8yMDA0LzAyL3hiZWFuL2NvbmZpZyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTEJFQU5TX1FOQU1FX05PREUgPSAicW5hbWUiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxCRUFOU19OU19OT0RFID0gIm5hbWVzcGFjZSI7Ci0KLSAgICAvKiogVGhlIHBhcnNlZCB4c2Rjb25maWcgZmlsZSAqLwotICAgIHByaXZhdGUgRG9jdW1lbnQgeHNkQ29uZmlnRG9jID0gbnVsbDsKLSAgICAvKiogVGhlIGxpc3Qgb2YgcHJlZml4ZXMgb24gdGhlIGRvY3VtZW50IHJvb3QgKi8KLSAgICBwcml2YXRlIEhhc2hNYXAgcHJlZml4ZXNUb1VSSU1hcHBpbmdzID0gbnVsbDsKLSAgICAvKiogVGhlIGxpc3Qgb2Ygc2NoZW1hIHR5ZXMgdG8gSmF2YSBjbGFzcyBuYW1lcyAqLwotICAgIHByaXZhdGUgSGFzaE1hcCBxbmFtZXNUb0phdmFOYW1lc01hcHBpbmdzID0gbnVsbDsKLSAgICAvKiogVGhlIGxpc3Qgb2YgbmFtZXNwYWNlcyB0byBKYXZhIHBhY2thZ2UgbmFtZXMgKi8KLSAgICBwcml2YXRlIEhhc2hNYXAgbnNUb0phdmFQYWNrYWdlc01hcCA9IG51bGw7Ci0gICAgLyoqIEluZGljYXRlcyB3aGV0aGVyIHdlIGhhdmUgYW55IFFOYW1lIHRvIEphdmEgY2xhc3MgbmFtZSBtYXBwaW5ncyAqLwotICAgIHB1YmxpYyBib29sZWFuIGhhc1FOYW1lVG9KYXZhTmFtZU1hcHBpbmdzID0gZmFsc2U7Ci0gICAgLyoqIEluZGljYXRlcyB3aGV0aGVyIHdlIGhhdmUgYW55IG5hbWVzcGFjZSB0byBKYXZhIHBhY2thZ2UgbWFwcGluZ3MgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNOYW1lc3BhY2VUb0phdmFQYWNrYWdlTWFwcGluZ3MgPSBmYWxzZTsKLQotICAgIHB1YmxpYyBYU0RDb25maWcoU3RyaW5nIHhzZENvbmZpZ0ZpbGUpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIERvY3VtZW50QnVpbGRlciBidWlsZGVyID0gbnVsbDsKLSAgICAgICAgICAgIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLQotICAgICAgICAgICAgZmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKLSAgICAgICAgICAgIGZhY3Rvcnkuc2V0VmFsaWRhdGluZyhmYWxzZSk7Ci0KLSAgICAgICAgICAgIGJ1aWxkZXIgPSBmYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpOwotICAgICAgICAgICAgYnVpbGRlci5zZXRFcnJvckhhbmRsZXIobmV3IFBhcnNlRXJyb3JIYW5kbGVyKCkpOwotCi0gICAgICAgICAgICB4c2RDb25maWdEb2MgPSBidWlsZGVyLnBhcnNlKG5ldyBGaWxlKHhzZENvbmZpZ0ZpbGUpKTsKLQotICAgICAgICAgICAgLy8gQ3JlYXRlIGEgbWFwcGluZyBmb3IgYWxsIHRoZSBuYW1lc3BhY2VzIGluIHRoZSBkb2N1bWVudAotICAgICAgICAgICAgcHJlZml4ZXNUb1VSSU1hcHBpbmdzID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgICAgIE5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzID0geHNkQ29uZmlnRG9jLmdldERvY3VtZW50RWxlbWVudCgpLmdldEF0dHJpYnV0ZXMoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGMgPSAwOyBjIDwgYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsgYysrKSB7Ci0gICAgICAgICAgICAgICAgLyogRG8gd2UgaGF2ZSBhIG5hbWVzcGFjZSBkZWNsYXJhdGlvbj8KLSAgICAgICAgICAgICAgICAqIHhtbG5zOm12PSJ1cm46d2VlZ2lldGVjaDptaW5lcnZhIgotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZXMuaXRlbShjKS5nZXROb2RlTmFtZSgpLmluZGV4T2YoInhtbG5zOiIpICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIHBhcnRzID0gYXR0cmlidXRlcy5pdGVtKGMpLmdldE5vZGVOYW1lKCkuc3BsaXQoIjoiKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIHByZWZpeCB0byB1cmkgbWFwcGluZyB0byBvdXIgbGlzdAotICAgICAgICAgICAgICAgICAgICBwcmVmaXhlc1RvVVJJTWFwcGluZ3MucHV0KHBhcnRzWzFdLCBhdHRyaWJ1dGVzLml0ZW0oYykuZ2V0Tm9kZVZhbHVlKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gTG9hZCB1cCB0aGUgbGlzdCBvZiBRTmFtZSB0byBKYXZhIGNsYXNzIG5hbWUgbWFwcGluZ3MKLSAgICAgICAgICAgIHFuYW1lc1RvSmF2YU5hbWVzTWFwcGluZ3MgPSBnZXRRTmFtZXNUb0phdmFOYW1lcygpOwotICAgICAgICAgICAgaWYgKHFuYW1lc1RvSmF2YU5hbWVzTWFwcGluZ3Muc2l6ZSgpID4gMCkKLSAgICAgICAgICAgICAgICBoYXNRTmFtZVRvSmF2YU5hbWVNYXBwaW5ncyA9IHRydWU7Ci0KLSAgICAgICAgICAgIC8vIExvYWQgdXAgdGhlIGxpc3Qgb2YgbmFtZXNwYWNlcyB0byBKYXZhIHBhY2thZ2VzIG1hcHBpbmdzCi0gICAgICAgICAgICBuc1RvSmF2YVBhY2thZ2VzTWFwID0gZ2V0TmFtZXNwYWNlc1RvUGFja2FnZXMoKTsKLSAgICAgICAgICAgIGlmIChuc1RvSmF2YVBhY2thZ2VzTWFwLnNpemUoKSA+IDApCi0gICAgICAgICAgICAgICAgaGFzTmFtZXNwYWNlVG9KYXZhUGFja2FnZU1hcHBpbmdzID0gdHJ1ZTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihpb2UpOwotICAgICAgICB9IGNhdGNoIChTQVhFeGNlcHRpb24gc2UpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKHNlKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlhZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oaWFlKTsKLSAgICAgICAgfSBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBwY2UpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKHBjZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBwcmUgbG9hZGVkIHNjaGVtYSB0eXBlcyB0byBKYXZhIGNsYXNzIG5hbWVzIG1hcHBpbmdzLgotICAgICAqCi0gICAgICogQHJldHVybiBIYXNoTWFwIG9mIHNjaGVtYSB0eXBlcyB0byBKYXZhIGNsYXNzIG5hbWVzIG1hcHBpbmdzIGFzIGFzIHNwZWNpZmllZCBpbiB0aGUgeHNkY29uZmlnCi0gICAgICogICAgICAgICBmaWxlLgotICAgICAqLwotICAgIHB1YmxpYyBIYXNoTWFwIGdldFNjaGVtYVR5cGVzVG9KYXZhTmFtZXMoKSB7Ci0gICAgICAgIHJldHVybiBxbmFtZXNUb0phdmFOYW1lc01hcHBpbmdzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHByZSBsb2FkZWQgbmFtZXNwYWNlIHRvIEphdmEgcGFja2FnZSBtYXBwaW5ncy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gSGFzaE1hcCBvZiBuYW1lc3BhY2UgdG8gSmF2YSBwYWNrYWdlIG1hcHBpbmdzIGFzIGFzIHNwZWNpZmllZCBpbiB0aGUgeHNkY29uZmlnIGZpbGUuCi0gICAgICovCi0gICAgcHVibGljIEhhc2hNYXAgZ2V0TmFtZXNwYWNlc1RvSmF2YVBhY2thZ2VzKCkgewotICAgICAgICByZXR1cm4gbnNUb0phdmFQYWNrYWdlc01hcDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMb2FkcyB0aGUgc2NoZW1hIHR5cGVzIHRvIEphdmEgY2xhc3MgbmFtZSBtYXBwaW5ncwotICAgICAqCi0gICAgICogQHJldHVybiBIYXNoTWFwIGNvbnRhaW5pbmcgdGhlIHNjaGVtYSB0eXBlcyB0byBKYXZhIGNsYXNzIG5hbWUgbWFwcGluZ3MgYXMgc3BlY2lmaWVkIGluIHRoZQotICAgICAqICAgICAgICAgeHNkY29uZmlnIGZpbGUuIElmIHRoZXJlIGFyZSBubyBtYXBwaW5ncywgdGhlIHJldHVybmVkIEhhc2hNYXAgd2lsbCBiZSBlbXB0eS4KLSAgICAgKi8KLSAgICBwcml2YXRlIEhhc2hNYXAgZ2V0UU5hbWVzVG9KYXZhTmFtZXMoKSB7Ci0gICAgICAgIEhhc2hNYXAgcW5hbWVzVG9KYXZhTmFtZXNNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgICAgIC8qIExvb2sgZm9yIGFsbCB0aGUgPHhiOnFuYW1lIC4uLiAvPiBub2RlcyBhcyB0aGVzZSBzcGVjaWZ5Ci0gICAgICAgICogeG1sIHNjaGVtYSB0eXBlcyB0byBKYXZhIGNsYXNzIG1hcHBpbmdzLgotICAgICAgICAqIDx4YjpxbmFtZSBuYW1lPSJtdjptb2R1bGVUeXBlIiBqYXZhbmFtZT0iTW9kdWxlIi8+Ci0gICAgICAgICovCi0gICAgICAgIE5vZGVMaXN0IHFuYW1lTm9kZXMgPSB4c2RDb25maWdEb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWVOUyhYTUxCRUFOU19OUywgWE1MQkVBTlNfUU5BTUVfTk9ERSk7Ci0KLSAgICAgICAgZm9yIChpbnQgYyA9IDA7IGMgPCBxbmFtZU5vZGVzLmdldExlbmd0aCgpOyBjKyspIHsKLSAgICAgICAgICAgIE5vZGUgcW5hbWVOb2RlID0gcW5hbWVOb2Rlcy5pdGVtKGMpOwotCi0gICAgICAgICAgICAvKiBJbiB0aGUgeHNkY29uZmlnIGZpbGUgd2UnbGwgZ2V0IHNjaGVtYSB0eXBlcyB3aXRoIGEgcHJlZml4IGFuZCBub3QgYSB1cmkuCi0gICAgICAgICAgICAqIDx4YjpxbmFtZSBuYW1lPSJtdjptb2R1bGVUeXBlIiBqYXZhbmFtZT0iTW9kdWxlIi8+Ci0gICAgICAgICAgICAqIGJ1dCBYTUxCZWFucyB3aWxsIGNhbGwgQmluZGluZ0NvbmZpZzo6bG9va3VwSmF2YW5hbWVGb3JRTmFtZSB3aXRoIGEgUU5hbWUKLSAgICAgICAgICAgICogd2hpY2ggaGFzIGEgbmFtZXNwYWNlIHVyaSBhbmQgbm8gcHJlZml4LgotICAgICAgICAgICAgKiBTbyB3ZSdsbCBzdG9yZSB0aGUgZnVsbHkgcXVhbGlmZWQgc2NoZW1hIHR5cGUgbmFtZSBpbiB0aGUgbWFwcGluZyBsaXN0LgotICAgICAgICAgICAgKiBpLmUuIHdlIHBpY2sgaXQgdXAgZnJvbSB0aGUgeHNkY29uZmlnIGZpbGUgYXM6Ci0gICAgICAgICAgICAqIG12Om1vZHVsZVR5cGUKLSAgICAgICAgICAgICogYnV0IHdlJ2xsIHN0b3JlIGl0IGFzIHVybjp3ZWVnaWV0ZWNoOm1pbmVydmE6bW9kdWxlVHlwZQotICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIFN0cmluZyBzY2hlbWFUeXBlID0gcW5hbWVOb2RlLmdldEF0dHJpYnV0ZXMoKS5nZXROYW1lZEl0ZW0oIm5hbWUiKS5nZXROb2RlVmFsdWUoKTsKLSAgICAgICAgICAgIGlmIChzY2hlbWFUeXBlLmluZGV4T2YoIjoiKSAhPSAtMSkgewotICAgICAgICAgICAgICAgIC8vIG12Om1vZHVsZVR5cGUKLSAgICAgICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gc2NoZW1hVHlwZS5zcGxpdCgiOiIpWzBdOwotICAgICAgICAgICAgICAgIFN0cmluZyBsb2NhbE5hbWUgPSBzY2hlbWFUeXBlLnNwbGl0KCI6IilbMV07Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ZXNUb1VSSU1hcHBpbmdzLmNvbnRhaW5zS2V5KHByZWZpeCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gU3RvcmUgYXMgdXJuOndlZWdpZXRlY2g6bWluZXJ2YTptb2R1bGVUeXBlCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSAoU3RyaW5nKXByZWZpeGVzVG9VUklNYXBwaW5ncy5nZXQocHJlZml4KSArICI6IiArIGxvY2FsTmFtZTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBEaXJlY3QgbWFwcGluZyBub3cgZnJvbSBzY2hlbWEgdHlwZXMgdG8gSmF2YSBjbGFzcyBuYW1lcwotICAgICAgICAgICAgICAgICAgICBxbmFtZXNUb0phdmFOYW1lc01hcC5wdXQoa2V5LCBxbmFtZU5vZGUuZ2V0QXR0cmlidXRlcygpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldE5hbWVkSXRlbSgiamF2YW5hbWUiKS5nZXROb2RlVmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHFuYW1lc1RvSmF2YU5hbWVzTWFwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIExvYWRzIHRoZSBuYW1lc3BhY2UgdG8gSmF2YSBwYWNrYWdlIG1hcHBpbmdzCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIEhhc2hNYXAgY29udGFpbmluZyB0aGUgbmFtZXNwYWNlIHRvIEphdmEgcGFja2FnZSBtYXBwaW5ncyBhcyBzcGVjaWZpZWQgaW4gdGhlCi0gICAgICogICAgICAgICB4c2Rjb25maWcgZmlsZS4gSWYgdGhlcmUgYXJlIG5vIG1hcHBpbmdzLCB0aGUgcmV0dXJuZWQgSGFzaE1hcCB3aWxsIGJlIGVtcHR5LgotICAgICAqLwotICAgIHByaXZhdGUgSGFzaE1hcCBnZXROYW1lc3BhY2VzVG9QYWNrYWdlcygpIHsKLSAgICAgICAgSGFzaE1hcCBuc1RvSmF2YVBhY2thZ2VzTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotICAgICAgICAvKiBMb29rIGZvciBhbGwgdGhlIDx4YjpuYW1lc3BhY2UgLi4uIC8+IG5vZGVzIGFzIHRoZXNlIHNwZWNpZnkKLSAgICAgICAgKiB4bWwgbmFtZXNwYWNlIHRvIEphdmEgcGFja2FnZSBtYXBwaW5ncy4KLSAgICAgICAgKiA8eGI6cW5hbWUgbmFtZT0ibXY6bW9kdWxlVHlwZSIgamF2YW5hbWU9Ik1vZHVsZSIvPgotICAgICAgICAqLwotICAgICAgICBOb2RlTGlzdCBuc05vZGVzID0geHNkQ29uZmlnRG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoWE1MQkVBTlNfTlMsIFhNTEJFQU5TX05TX05PREUpOwotCi0gICAgICAgIGZvciAoaW50IG5zTm9kZXNDb3VudCA9IDA7IG5zTm9kZXNDb3VudCA8IG5zTm9kZXMuZ2V0TGVuZ3RoKCk7IG5zTm9kZXNDb3VudCsrKSB7Ci0gICAgICAgICAgICBOb2RlIG5zTm9kZSA9IG5zTm9kZXMuaXRlbShuc05vZGVzQ291bnQpOwotCi0gICAgICAgICAgICAvLyBXaGF0J3MgdGhlIGN1cnJlbnQgbmFtZXNwYWNlPwotICAgICAgICAgICAgU3RyaW5nIHVyaSA9IG5zTm9kZS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtKCJ1cmkiKS5nZXROb2RlVmFsdWUoKTsKLQotICAgICAgICAgICAgLy8gR2V0IHRoZSBwYWNrYWdlIG5hbWUgZm9yIHRoZSBjdXJyZW50IG5hbWVzcGFjZSB1cmkKLSAgICAgICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9IG51bGw7Ci0gICAgICAgICAgICBOb2RlTGlzdCBjaGlsZE5vZGVzID0gbnNOb2RlLmdldENoaWxkTm9kZXMoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGNoaWxkTm9kZXNDb3VudCA9IDA7IGNoaWxkTm9kZXNDb3VudCA8IGNoaWxkTm9kZXMuZ2V0TGVuZ3RoKCk7Ci0gICAgICAgICAgICAgICAgIGNoaWxkTm9kZXNDb3VudCsrKSB7Ci0gICAgICAgICAgICAgICAgTm9kZSBjaGlsZE5vZGUgPSBjaGlsZE5vZGVzLml0ZW0oY2hpbGROb2Rlc0NvdW50KTsKLSAgICAgICAgICAgICAgICBpZiAoY2hpbGROb2RlLmdldExvY2FsTmFtZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkTm9kZS5nZXRMb2NhbE5hbWUoKS5lcXVhbHMoInBhY2thZ2UiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZU5hbWUgPSBjaGlsZE5vZGUuZ2V0Rmlyc3RDaGlsZCgpLmdldE5vZGVWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBTdG9yZSB0aGUgbmFtZXNwYWNlIHVyaSB0byBKYXZhIHBhY2thZ2UgbWFwcGluZwotICAgICAgICAgICAgaWYgKHBhY2thZ2VOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBuc1RvSmF2YVBhY2thZ2VzTWFwLnB1dCh1cmksIHBhY2thZ2VOYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBuc1RvSmF2YVBhY2thZ2VzTWFwOwotICAgIH0KLQotICAgIGNsYXNzIFBhcnNlRXJyb3JIYW5kbGVyIGltcGxlbWVudHMgRXJyb3JIYW5kbGVyIHsKLSAgICAgICAgcHVibGljIHZvaWQgZXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTQVhFeGNlcHRpb24oZXhjZXB0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGZhdGFsRXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTQVhFeGNlcHRpb24oZXhjZXB0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHdhcm5pbmcoU0FYUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTQVhFeGNlcHRpb24oZXhjZXB0aW9uKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3htbGJlYW5zL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3htbGJlYW5zL3RlbXBsYXRlL1htbGJlYW5zRGF0YWJpbmRpbmdUZW1wbGF0ZS54c2wgYi92MS41LjFSQzMvbW9kdWxlcy94bWxiZWFucy9zcmMvb3JnL2FwYWNoZS9heGlzMi94bWxiZWFucy90ZW1wbGF0ZS9YbWxiZWFuc0RhdGFiaW5kaW5nVGVtcGxhdGUueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTBkMGQ5Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3htbGJlYW5zL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3htbGJlYW5zL3RlbXBsYXRlL1htbGJlYW5zRGF0YWJpbmRpbmdUZW1wbGF0ZS54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwzMTYgKzAsMCBAQAotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iPg0KLSAgICA8eHNsOm91dHB1dCBtZXRob2Q9InRleHQiLz4NCi0NCi0gICAgPHhzbDprZXkgbmFtZT0icGFyYW1zSW4iIG1hdGNoPSIvL2RhdGFiaW5kZXJzL3BhcmFtW0BkaXJlY3Rpb249J2luJ10iIHVzZT0iQHR5cGUiLz4NCi0gICAgPHhzbDprZXkgbmFtZT0icGFyYW1zT3V0IiBtYXRjaD0iLy9kYXRhYmluZGVycy9wYXJhbVtAZGlyZWN0aW9uPSdvdXQnXSIgdXNlPSJAdHlwZSIvPg0KLSAgICA8eHNsOmtleSBuYW1lPSJpbm5lclBhcmFtcyIgbWF0Y2g9Ii8vZGF0YWJpbmRlcnMvcGFyYW1bQGRpcmVjdGlvbj0naW4nXS9wYXJhbSIgdXNlPSJAcGFydG5hbWUiLz4NCi0NCi0gICAgPCEtLSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgIC0tPg0KLSAgICA8IS0tICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgICB4bWxiZWFucyB0ZW1wbGF0ZSAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAgLS0+DQotICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImRhdGFiaW5kZXJzW0BkYnR5cGU9J3htbGJlYW5zJ10iPg0KLSAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJzZXJ2ZXJzaWRlIiBzZWxlY3Q9IkBpc3NlcnZlcnNpZGUiLz4NCi0gICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iYmFzZTY0IiBzZWxlY3Q9ImJhc2U2NEVsZW1lbnRzL25hbWUiLz4NCi0gICAgICAgIDx4c2w6aWYgdGVzdD0iJGJhc2U2NCI+DQotICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZVtdIHFOYW1lQXJyYXkgPSB7DQotICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImJhc2U2NEVsZW1lbnRzL25hbWUiPg0KLSAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9InBvc2l0aW9uKCk+MSI+LDwveHNsOmlmPm5ldyBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lKCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5zLXVybCIvPiIsIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbG9jYWxOYW1lIi8+IikNCi0gICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4NCi0gICAgICAgICAgICB9Ow0KLSAgICAgICAgPC94c2w6aWY+DQotDQotICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0icGFyYW1bbm90KEB0eXBlID0gcHJlY2VkaW5nLXNpYmxpbmc6OnBhcmFtL0B0eXBlKSBhbmQgQHR5cGUhPScnXSI+DQotDQotICAgICAgICAgICAgcHJpdmF0ZSAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgIHRvT00oPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+IHBhcmFtLCBib29sZWFuIG9wdGltaXplQ29udGVudCkNCi0gICAgICAgICAgICB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHR7DQotDQotICAgICAgICAgICAgPHhzbDpjaG9vc2U+DQotICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkYmFzZTY0Ij4NCi0gICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW1pemVDb250ZW50KSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmJ1aWxkZXIuU3RBWE9NQnVpbGRlciBidWlsZGVyID0gbmV3IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5idWlsZGVyLlN0QVhPTUJ1aWxkZXINCi0gICAgICAgICAgICAgICAgICAgICAgICAob3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKSxuZXcgb3JnLmFwYWNoZS5heGlzMi51dGlsLlN0cmVhbVdyYXBwZXIocGFyYW0ubmV3WE1MU3RyZWFtUmVhZGVyKCkpKSA7DQotICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgZG9jdW1lbnRFbGVtZW50ID0gYnVpbGRlci5nZXREb2N1bWVudEVsZW1lbnQoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBvcHRpbWl6ZUNvbnRlbnQoZG9jdW1lbnRFbGVtZW50LHFOYW1lQXJyYXkpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICgob3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLk9NTm9kZUV4KWRvY3VtZW50RWxlbWVudCkuc2V0UGFyZW50KG51bGwpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkb2N1bWVudEVsZW1lbnQ7DQotICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9PTShwYXJhbSk7DQotICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPg0KLSAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4NCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0b09NKHBhcmFtKTsNCi0gICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPg0KLSAgICAgICAgICAgIDwveHNsOmNob29zZT4NCi0NCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgcHJpdmF0ZSBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCB0b09NKGZpbmFsIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPiBwYXJhbSkNCi0gICAgICAgICAgICAgICAgICAgIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdCB7DQotDQotICAgICAgICAgICAgICAgIGZpbmFsIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9IHBhcmFtLm5ld1hNTFN0cmVhbVJlYWRlcigpOw0KLSAgICAgICAgICAgICAgICB3aGlsZSAoIXhtbFJlYWRlci5pc1N0YXJ0RWxlbWVudCgpKSB7DQotICAgICAgICAgICAgICAgICAgICB0cnkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbFJlYWRlci5uZXh0KCk7DQotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQubWFrZUZhdWx0KGUpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlIG9tRGF0YVNvdXJjZSA9IG5ldyBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZSgpIHsNCi0NCi0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShqYXZhLmlvLk91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0sIG9yZy5hcGFjaGUuYXhpb20ub20uT01PdXRwdXRGb3JtYXQgb21PdXRwdXRGb3JtYXQpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7DQotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIHhtbE9wdGlvbnMgPSBuZXcgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLnNhdmUob3V0cHV0U3RyZWFtLHhtbE9wdGlvbnMuc2V0U2F2ZU5vWG1sRGVjbCgpKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uKCJQcm9ibGVtIHdpdGggc2F2aW5nIGRvY3VtZW50IixlKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoamF2YS5pby5Xcml0ZXIgd3JpdGVyLCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NT3V0cHV0Rm9ybWF0IG9tT3V0cHV0Rm9ybWF0KQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyB4bWxPcHRpb25zID0gbmV3IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucygpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbS5zYXZlKHdyaXRlcix4bWxPcHRpb25zLnNldFNhdmVOb1htbERlY2woKSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbigiUHJvYmxlbSB3aXRoIHNhdmluZyBkb2N1bWVudCIsZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFN0cmVhbVdyaXRlcikNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuTVRPTVhNTFN0cmVhbVdyaXRlciBtdG9teG1sU3RyZWFtV3JpdGVyID0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuTVRPTVhNTFN0cmVhbVdyaXRlcikgeG1sU3RyZWFtV3JpdGVyOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyB4bWxPcHRpb25zID0gbmV3IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucygpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbS5zYXZlKG10b214bWxTdHJlYW1Xcml0ZXIuZ2V0T3V0cHV0U3RyZWFtKCkseG1sT3B0aW9ucy5zZXRTYXZlTm9YbWxEZWNsKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdG9teG1sU3RyZWFtV3JpdGVyLmdldE91dHB1dFN0cmVhbSgpLmZsdXNoKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbigiUHJvYmxlbSB3aXRoIHNhdmluZyBkb2N1bWVudCIsIGUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciBnZXRSZWFkZXIoKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJhbS5uZXdYTUxTdHJlYW1SZWFkZXIoKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgcmV0dXJuICBuZXcgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmxsb20uT01Tb3VyY2VkRWxlbWVudEltcGwoeG1sUmVhZGVyLmdldE5hbWUoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIG9tRGF0YVNvdXJjZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgPC94c2w6Zm9yLWVhY2g+DQotDQotDQotICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0ib3BuYW1lcy9uYW1lIj4NCi0NCi0gICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im9wbmFtZSIgc2VsZWN0PSIuIi8+DQotICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJvcG5zdXJpIiBzZWxlY3Q9IkBvcG5zdXJpIi8+DQotICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJwYXJhbWNvdW50IiBzZWxlY3Q9ImNvdW50KC4uLy4uL3BhcmFtW0B0eXBlIT0nJyBhbmQgQGRpcmVjdGlvbj0naW4nIGFuZCBAb3BuYW1lPSRvcG5hbWVdKSIvPg0KLSAgICAgICAgICAgICA8IS0tIGdldCB0aGUgb3BuYW1lIGNhcGl0YWxpemVkIC0tPg0KLSAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ib3BuYW1lQ2FwaXRhbGl6ZWQiIHNlbGVjdD0iY29uY2F0KHRyYW5zbGF0ZShzdWJzdHJpbmcoJG9wbmFtZSwgMSwgMSApLCdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicsICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgKSwgc3Vic3RyaW5nKCRvcG5hbWUsIDIsIHN0cmluZy1sZW5ndGgoJG9wbmFtZSkpKSI+PC94c2w6dmFyaWFibGU+DQotDQotICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJub3QoJHNlcnZlcnNpZGUpIj4NCi0gICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJHBhcmFtY291bnQgJmd0OyAwIj4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImlucHV0RWxlbWVudCIgc2VsZWN0PSIuLi8uLi9wYXJhbVtAdHlwZSE9JycgYW5kIEBkaXJlY3Rpb249J2luJyBhbmQgQG9wbmFtZT0kb3BuYW1lXSI+PC94c2w6dmFyaWFibGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJpbnB1dEVsZW1lbnRUeXBlIiBzZWxlY3Q9Ii4uLy4uL3BhcmFtW0B0eXBlIT0nJyBhbmQgQGRpcmVjdGlvbj0naW4nIGFuZCBAb3BuYW1lPSRvcG5hbWVdL0B0eXBlIj48L3hzbDp2YXJpYWJsZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImlucHV0RWxlbWVudFNob3J0VHlwZSIgc2VsZWN0PSIuLi8uLi9wYXJhbVtAdHlwZSE9JycgYW5kIEBkaXJlY3Rpb249J2luJyBhbmQgQG9wbmFtZT0kb3BuYW1lXS9Ac2hvcnR0eXBlIj48L3hzbDp2YXJpYWJsZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImlucHV0RWxlbWVudENvbXBsZXhUeXBlIiBzZWxlY3Q9Ii4uLy4uL3BhcmFtW0B0eXBlIT0nJyBhbmQgQGRpcmVjdGlvbj0naW4nIGFuZCBAb3BuYW1lPSRvcG5hbWVdL0Bjb21wbGV4dHlwZSI+PC94c2w6dmFyaWFibGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJ3cmFwcGVkUGFyYW1ldGVyQ291bnQiIHNlbGVjdD0iY291bnQoLi4vLi4vcGFyYW1bQHR5cGUhPScnIGFuZCBAZGlyZWN0aW9uPSdpbicgYW5kIEBvcG5hbWU9JG9wbmFtZV0vcGFyYW0pIj48L3hzbDp2YXJpYWJsZT4NCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9ImdlbmVyYXRlLWlkKCRpbnB1dEVsZW1lbnQpID0gZ2VuZXJhdGUtaWQoa2V5KCdwYXJhbXNJbicsICRpbnB1dEVsZW1lbnRUeXBlKVsxXSkiPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiR3cmFwcGVkUGFyYW1ldGVyQ291bnQgJmd0OyAwIj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gZ2VuZWF0ZSB0aGUgdG9FbnZlbG9wZSBtZXRob2QtLT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgIG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGUgdG9FbnZlbG9wZShvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhY3RvcnkgZmFjdG9yeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIuLi8uLi9wYXJhbVtAdHlwZSE9JycgYW5kIEBkaXJlY3Rpb249J2luJyBhbmQgQG9wbmFtZT0kb3BuYW1lXS9wYXJhbSI+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+IHBhcmFtPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InBvc2l0aW9uKCkiLz4sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGlucHV0RWxlbWVudFR5cGUiLz4gZHVtbXlXcmFwcGVkVHlwZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gb3B0aW1pemVDb250ZW50KSB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHR7DQotDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGlucHV0RWxlbWVudFR5cGUiLz4gd3JhcHBlZFR5cGUgPSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGlucHV0RWxlbWVudFR5cGUiLz4uRmFjdG9yeS5uZXdJbnN0YW5jZSgpOw0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9InN0cmluZy1sZW5ndGgobm9ybWFsaXplLXNwYWNlKCRpbnB1dEVsZW1lbnRDb21wbGV4VHlwZSkpID4gMCI+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW5wdXRFbGVtZW50Q29tcGxleFR5cGUiLz4gaW5uZXJUeXBlID0gd3JhcHBlZFR5cGUuYWRkTmV3PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1iZWZvcmUoJGlucHV0RWxlbWVudFNob3J0VHlwZSwnRG9jdW1lbnQnKSIvPigpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW5wdXRFbGVtZW50VHlwZSIvPi48eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3Vic3RyaW5nLWJlZm9yZSgkaW5wdXRFbGVtZW50U2hvcnRUeXBlLCdEb2N1bWVudCcpIi8+IGlubmVyVHlwZSA9IHdyYXBwZWRUeXBlLmFkZE5ldzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzdWJzdHJpbmctYmVmb3JlKCRpbnB1dEVsZW1lbnRTaG9ydFR5cGUsJ0RvY3VtZW50JykiLz4oKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+DQotDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iLi4vLi4vcGFyYW1bQHR5cGUhPScnIGFuZCBAZGlyZWN0aW9uPSdpbicgYW5kIEBvcG5hbWU9JG9wbmFtZV0vcGFyYW0iPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQGFycmF5Ij4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlubmVyVHlwZS54c2V0PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBwYXJ0bmFtZSIvPkFycmF5KHBhcmFtPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InBvc2l0aW9uKCkiLz4pOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlubmVyVHlwZS54c2V0PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBwYXJ0bmFtZSIvPihwYXJhbTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJwb3NpdGlvbigpIi8+KTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPg0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZSBlbnZlbG9wZSA9IGZhY3RvcnkuZ2V0RGVmYXVsdEVudmVsb3BlKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZlbG9wZS5nZXRCb2R5KCkuYWRkQ2hpbGQodG9PTSh3cmFwcGVkVHlwZSwgb3B0aW1pemVDb250ZW50KSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52ZWxvcGU7DQotDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBBc3N1bXB0aW9uIC0gdGhlIHBhcmFtZXRlciBpcyBhbHdheXMgYW4gWE1MQmVhbnMgLS0+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcml2YXRlIG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGUgdG9FbnZlbG9wZShvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhY3RvcnkgZmFjdG9yeSwgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbnB1dEVsZW1lbnRUeXBlIi8+IHBhcmFtLCBib29sZWFuIG9wdGltaXplQ29udGVudCkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGUgZW52ZWxvcGUgPSBmYWN0b3J5LmdldERlZmF1bHRFbnZlbG9wZSgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtICE9IG51bGwpew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52ZWxvcGUuZ2V0Qm9keSgpLmFkZENoaWxkKHRvT00ocGFyYW0sIG9wdGltaXplQ29udGVudCkpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudmVsb3BlOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPg0KLSAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4NCi0NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRG8gbm90aGluZyBoZXJlIC0tPg0KLSAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPg0KLSAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+DQotICAgICAgICAgICAgPC94c2w6aWY+DQotICAgICAgICAgICAgPCEtLSB0aGlzIHBpZWNlIG9mIGxvZ2ljIG5lZWRzIHRvIGJlIGdlbmVyYXRlZCBvbmx5IGZvciB0aGUgc2VydmVyIHNpZGUtLT4NCi0gICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IiRzZXJ2ZXJzaWRlIj4NCi0NCi0NCi0gICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iY291bnQoLi4vLi4vcGFyYW1bQHR5cGUhPScnIGFuZCBAZGlyZWN0aW9uPSdvdXQnIGFuZCBAb3BuYW1lPSRvcG5hbWVdKT0xIj4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im91dEVsZW1lbnQiIHNlbGVjdD0iLi4vLi4vcGFyYW1bQHR5cGUhPScnIGFuZCBAZGlyZWN0aW9uPSdvdXQnIGFuZCBAb3BuYW1lPSRvcG5hbWVdIj48L3hzbDp2YXJpYWJsZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im91dEVsZW1lbnRUeXBlIiBzZWxlY3Q9Ii4uLy4uL3BhcmFtW0B0eXBlIT0nJyBhbmQgQGRpcmVjdGlvbj0nb3V0JyBhbmQgQG9wbmFtZT0kb3BuYW1lXS9AdHlwZSI+PC94c2w6dmFyaWFibGU+DQotDQotICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBBc3N1bXB0aW9uIC0gVGhpcyBpcyBhbiBYTUxCZWFucyBlbGVtZW50LS0+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJnZW5lcmF0ZS1pZCgkb3V0RWxlbWVudCkgPSBnZW5lcmF0ZS1pZChrZXkoJ3BhcmFtc091dCcsICRvdXRFbGVtZW50VHlwZSlbMV0pIj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlIHRvRW52ZWxvcGUob3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYWN0b3J5IGZhY3RvcnksIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuLi8uLi9wYXJhbVtAdHlwZSE9JycgYW5kIEBkaXJlY3Rpb249J291dCcgYW5kIEBvcG5hbWU9JG9wbmFtZV0vQHR5cGUiLz4gcGFyYW0sIGJvb2xlYW4gb3B0aW1pemVDb250ZW50KQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlIGVudmVsb3BlID0gZmFjdG9yeS5nZXREZWZhdWx0RW52ZWxvcGUoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtICE9IG51bGwpew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZlbG9wZS5nZXRCb2R5KCkuYWRkQ2hpbGQodG9PTShwYXJhbSwgb3B0aW1pemVDb250ZW50KSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudmVsb3BlOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+DQotDQotICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPg0KLSAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+DQotICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iY291bnQoLi4vLi4vcGFyYW1bQHR5cGUhPScnIGFuZCBAZGlyZWN0aW9uPSdpbicgYW5kIEBvcG5hbWU9JG9wbmFtZV0pPTEiPg0KLSAgICAgICAgICAgICAgICAgICAgPCEtLSBnZW5lcmF0ZSB0aGUgZ2V0IG1ldGhvZHMgLS0+DQotICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaW5wdXRFbGVtZW50IiBzZWxlY3Q9Ii4uLy4uL3BhcmFtW0B0eXBlIT0nJyBhbmQgQGRpcmVjdGlvbj0naW4nIGFuZCBAb3BuYW1lPSRvcG5hbWVdIj48L3hzbDp2YXJpYWJsZT4NCi0gICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJpbnB1dEVsZW1lbnRUeXBlIiBzZWxlY3Q9Ii4uLy4uL3BhcmFtW0B0eXBlIT0nJyBhbmQgQGRpcmVjdGlvbj0naW4nIGFuZCBAb3BuYW1lPSRvcG5hbWVdL0B0eXBlIj48L3hzbDp2YXJpYWJsZT4NCi0gICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJpbnB1dEVsZW1lbnRTaG9ydFR5cGUiIHNlbGVjdD0iLi4vLi4vcGFyYW1bQHR5cGUhPScnIGFuZCBAZGlyZWN0aW9uPSdpbicgYW5kIEBvcG5hbWU9JG9wbmFtZV0vQHNob3J0dHlwZSI+PC94c2w6dmFyaWFibGU+DQotICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaW5wdXRFbGVtZW50Q29tcGxleFR5cGUiIHNlbGVjdD0iLi4vLi4vcGFyYW1bQHR5cGUhPScnIGFuZCBAZGlyZWN0aW9uPSdpbicgYW5kIEBvcG5hbWU9JG9wbmFtZV0vQGNvbXBsZXh0eXBlIj48L3hzbDp2YXJpYWJsZT4NCi0NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIuLi8uLi9wYXJhbVtAdHlwZSE9JycgYW5kIEBkaXJlY3Rpb249J2luJyBhbmQgQG9wbmFtZT0kb3BuYW1lXS9wYXJhbSI+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJwYXJhbUVsZW1lbnQiIHNlbGVjdD0iLiI+PC94c2w6dmFyaWFibGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJwYXJ0TmFtZSIgc2VsZWN0PSJAcGFydG5hbWUiPjwveHNsOnZhcmlhYmxlPg0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iKGdlbmVyYXRlLWlkKCRwYXJhbUVsZW1lbnQpID0gZ2VuZXJhdGUtaWQoa2V5KCdpbm5lclBhcmFtcycsICRwYXJ0TmFtZSlbMV0pKSBvcg0KLSAgICAgICAgICAgICAgICAgICAgICAgIChnZW5lcmF0ZS1pZCgkaW5wdXRFbGVtZW50KSA9IGdlbmVyYXRlLWlkKGtleSgncGFyYW1zSW4nLCAkaW5wdXRFbGVtZW50VHlwZSlbMV0pKSI+DQotDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+IGdldDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAcGFydG5hbWUiLz4oDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuLi9AdHlwZSIvPiB3cmFwcGVkVHlwZSl7DQotDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gdGhlcmUgaXMgbm90IGRpZmZlcmVuY2UgYmV0d2VlIGhhdmluZyBhIHNlcGVyYXRlIGNvbXBsZXggdHlwZSBhbmQgdGhlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmxpbmUgY29tcGxleCB0eXBlIGltcGxlbWVudGF0aW9uIC0tPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQGFycmF5Ij4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdyYXBwZWRUeXBlLmdldDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzdWJzdHJpbmctYmVmb3JlKCRpbnB1dEVsZW1lbnRTaG9ydFR5cGUsJ0RvY3VtZW50JykiLz4oKS54Z2V0PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwYXJ0TmFtZSIvPkFycmF5KCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdyYXBwZWRUeXBlLmdldDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzdWJzdHJpbmctYmVmb3JlKCRpbnB1dEVsZW1lbnRTaG9ydFR5cGUsJ0RvY3VtZW50JykiLz4oKS54Z2V0PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwYXJ0TmFtZSIvPigpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPg0KLSAgICAgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+DQotICAgICAgICAgICAgICAgIDwveHNsOmlmPg0KLSAgICAgICAgICAgIDwveHNsOmlmPg0KLSAgICAgICAgPC94c2w6Zm9yLWVhY2g+DQotDQotDQotICAgICAgICAvKioNCi0gICAgICAgICogIGdldCB0aGUgZGVmYXVsdCBlbnZlbG9wZQ0KLSAgICAgICAgKi8NCi0gICAgICAgIHByaXZhdGUgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZSB0b0VudmVsb3BlKG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmFjdG9yeSBmYWN0b3J5KXsNCi0gICAgICAgIHJldHVybiBmYWN0b3J5LmdldERlZmF1bHRFbnZlbG9wZSgpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0IGZyb21PTSgNCi0gICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IHBhcmFtLA0KLSAgICAgICAgamF2YS5sYW5nLkNsYXNzIHR5cGUsDQotICAgICAgICBqYXZhLnV0aWwuTWFwIGV4dHJhTmFtZXNwYWNlcykgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0ew0KLSAgICAgICAgdHJ5ew0KLSAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9InBhcmFtW0B0eXBlIT0nJyBhbmQgbm90KEBwcmltaXRpdmUpXSI+DQotDQotICAgICAgICAgICAgaWYgKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPi5jbGFzcy5lcXVhbHModHlwZSkpew0KLSAgICAgICAgICAgIGlmIChleHRyYU5hbWVzcGFjZXMhPW51bGwpew0KLSAgICAgICAgICAgIHJldHVybiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz4uRmFjdG9yeS5wYXJzZSgNCi0gICAgICAgICAgICBwYXJhbS5nZXRYTUxTdHJlYW1SZWFkZXJXaXRob3V0Q2FjaGluZygpLA0KLSAgICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMoKS5zZXRMb2FkQWRkaXRpb25hbE5hbWVzcGFjZXMoZXh0cmFOYW1lc3BhY2VzKSk7DQotICAgICAgICAgICAgfWVsc2V7DQotICAgICAgICAgICAgcmV0dXJuIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPi5GYWN0b3J5LnBhcnNlKA0KLSAgICAgICAgICAgIHBhcmFtLmdldFhNTFN0cmVhbVJlYWRlcldpdGhvdXRDYWNoaW5nKCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotDQotICAgICAgICA8L3hzbDpmb3ItZWFjaD4NCi0gICAgICAgIH1jYXRjaChqYXZhLmxhbmcuRXhjZXB0aW9uIGUpew0KLSAgICAgICAgdGhyb3cgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQubWFrZUZhdWx0KGUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotDQotICAgICAgICA8IS0tIEdlbmVyYXRlIHRoZSBiYXNlIDY0IG9wdGltaXplIG1ldGhvZHMgb25seSBpZiB0aGUgYmFzZTY0IGl0ZW1zIGFyZSBwcmVzZW50IC0tPg0KLSAgICAgICAgPHhzbDppZiB0ZXN0PSIkYmFzZTY0Ij4NCi0NCi0gICAgICAgICAgICBwcml2YXRlIHZvaWQgb3B0aW1pemVDb250ZW50KG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IGVsZW1lbnQsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWVbXSBxTmFtZXMpew0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpICZsdDsgcU5hbWVzLmxlbmd0aDsgaSsrKSB7DQotICAgICAgICAgICAgbWFya0VsZW1lbnRzQXNPcHRpbWl6ZWQocU5hbWVzW2ldLGVsZW1lbnQpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIG1hcmtFbGVtZW50c0FzT3B0aW1pemVkKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcU5hbWUsb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgcm9vdEVsdCl7DQotICAgICAgICAgICAgaWYgKHJvb3RFbHQuZ2V0UU5hbWUoKS5lcXVhbHMocU5hbWUpKXsNCi0gICAgICAgICAgICAvL2dldCB0aGUgdGV4dCBub2RlIGFuZCBtYXJrIGl0DQotICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5vZGUgbm9kZSA9IHJvb3RFbHQuZ2V0Rmlyc3RPTUNoaWxkKCk7DQotICAgICAgICAgICAgaWYgKG5vZGUuZ2V0VHlwZSgpPT1vcmcuYXBhY2hlLmF4aW9tLm9tLk9NTm9kZS5URVhUX05PREUpew0KLSAgICAgICAgICAgICgob3JnLmFwYWNoZS5heGlvbS5vbS5PTVRleHQpbm9kZSkuc2V0T3B0aW1pemUodHJ1ZSk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBqYXZhLnV0aWwuSXRlcmF0b3IgY2hpbGRFbGVtZW50cyA9IHJvb3RFbHQuZ2V0Q2hpbGRFbGVtZW50cygpOw0KLSAgICAgICAgICAgIHdoaWxlIChjaGlsZEVsZW1lbnRzLmhhc05leHQoKSkgew0KLSAgICAgICAgICAgIG1hcmtFbGVtZW50c0FzT3B0aW1pemVkKHFOYW1lLChvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCljaGlsZEVsZW1lbnRzLm5leHQoKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIDwveHNsOmlmPg0KLSAgICA8L3hzbDp0ZW1wbGF0ZT4NCi08L3hzbDpzdHlsZXNoZWV0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3htbGJlYW5zL3Rlc3QtcmVzb3VyY2VzL0Jvb2tRdW90ZS53c2RsIGIvdjEuNS4xUkMzL21vZHVsZXMveG1sYmVhbnMvdGVzdC1yZXNvdXJjZXMvQm9va1F1b3RlLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiZTg0ZGUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMveG1sYmVhbnMvdGVzdC1yZXNvdXJjZXMvQm9va1F1b3RlLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxkZWZpbml0aW9ucyB4bWxuczptaD0iaHR0cDovL3d3dy5Nb25zb24tSGFlZmVsLmNvbS9qd3Nib29rL0Jvb2tRdW90ZSIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIgotICAgICAgICAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iCi0gICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3Lk1vbnNvbi1IYWVmZWwuY29tL2p3c2Jvb2svQm9va1F1b3RlIgotICAgICAgICAgICAgIHhtbG5zOnR5cGVzPSJodHRwOi8vd3d3Lk1vbnNvbi1IYWVmZWwuY29tL2p3c2Jvb2svQm9va1F1b3RlL3hzZCIgbmFtZT0iQm9va1F1b3RlIj4KLSAgICA8dHlwZXM+Ci0gICAgPHhzZDpzY2hlbWEgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0gICAgICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3Lk1vbnNvbi1IYWVmZWwuY29tL2p3c2Jvb2svQm9va1F1b3RlL3hzZCI+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmF1bHRFbGVtZW50IiB0eXBlPSJ4c2Q6YW55VHlwZSIvPgotICAgIDwveHNkOnNjaGVtYT4KLSAgPC90eXBlcz4KLQk8bWVzc2FnZSBuYW1lPSJCb29rUXVvdGVfZ2V0Qm9va1ByaWNlIj4KLQkJPHBhcnQgbmFtZT0iaXNibiIgdHlwZT0ieHNkOmFueVR5cGUiLz4KLQkJPHBhcnQgbmFtZT0ibnVtYmVyIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9IkJvb2tRdW90ZV9nZXRCb29rUHJpY2VSZXNwb25zZSI+Ci0JCTxwYXJ0IG5hbWU9InJlc3VsdCIgdHlwZT0ieHNkOmFueVR5cGUiLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0iSW52YWxpZElzYm5GYXVsdCI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9Im1lc3NhZ2UiIGVsZW1lbnQ9InR5cGVzOmZhdWx0RWxlbWVudCIvPgotCTwvbWVzc2FnZT4KLQk8cG9ydFR5cGUgbmFtZT0iQm9va1F1b3RlIj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJnZXRCb29rUHJpY2UiPgotCQkJPGlucHV0IG1lc3NhZ2U9Im1oOkJvb2tRdW90ZV9nZXRCb29rUHJpY2UiLz4KLQkJCTxvdXRwdXQgbWVzc2FnZT0ibWg6Qm9va1F1b3RlX2dldEJvb2tQcmljZVJlc3BvbnNlIi8+Ci0JCQk8ZmF1bHQgbmFtZT0iSW52YWxpZElzYm5GYXVsdCIgbWVzc2FnZT0ibWg6SW52YWxpZElzYm5GYXVsdCIvPgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJnZXRCb29rUHJpY2VOb25Sb2J1c3QiPgotCQkJPGlucHV0IG1lc3NhZ2U9Im1oOkJvb2tRdW90ZV9nZXRCb29rUHJpY2UiLz4KLQkJCTxvdXRwdXQgbWVzc2FnZT0ibWg6Qm9va1F1b3RlX2dldEJvb2tQcmljZVJlc3BvbnNlIi8+Ci0JCTwvb3BlcmF0aW9uPgotCTwvcG9ydFR5cGU+Ci0JPGJpbmRpbmcgbmFtZT0iQm9va1F1b3RlQmluZGluZyIgdHlwZT0ibWg6Qm9va1F1b3RlIj4KLQkJPHNvYXA6YmluZGluZyBzdHlsZT0icnBjIiB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIvPgotCQk8b3BlcmF0aW9uIG5hbWU9ImdldEJvb2tQcmljZSI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0ibXlBY3Rpb24iLz4KLQkJCTxpbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgbmFtZXNwYWNlPSJodHRwOi8vd3d3Lk1vbnNvbi1IYWVmZWwuY29tL2p3c2Jvb2svQm9va1F1b3RlL0Jvb2tRdW90ZSIvPgotCQkJPC9pbnB1dD4KLQkJCTxvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIG5hbWVzcGFjZT0iaHR0cDovL3d3dy5Nb25zb24tSGFlZmVsLmNvbS9qd3Nib29rL0Jvb2tRdW90ZS9Cb29rUXVvdGUiLz4KLQkJCTwvb3V0cHV0PgotCQkJPGZhdWx0IG5hbWU9IkludmFsaWRJc2JuRmF1bHQiPgotCQkJCTxzb2FwOmZhdWx0IG5hbWU9IkludmFsaWRJc2JuRmF1bHQiIHVzZT0ibGl0ZXJhbCIvPgotCQkJPC9mYXVsdD4JCi0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9ImdldEJvb2tQcmljZU5vblJvYnVzdCI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0ibXlBY3Rpb24yIi8+Ci0JCQk8aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIG5hbWVzcGFjZT0iaHR0cDovL3d3dy5Nb25zb24tSGFlZmVsLmNvbS9qd3Nib29rL0Jvb2tRdW90ZS9Cb29rUXVvdGUiLz4KLQkJCTwvaW5wdXQ+Ci0JCQk8b3V0cHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9Imh0dHA6Ly93d3cuTW9uc29uLUhhZWZlbC5jb20vandzYm9vay9Cb29rUXVvdGUvQm9va1F1b3RlIi8+Ci0JCQk8L291dHB1dD4KLQkJPC9vcGVyYXRpb24+Ci0JPC9iaW5kaW5nPgotCTxzZXJ2aWNlIG5hbWU9IkJvb2tRdW90ZVNlcnZpY2UiPgotCQk8cG9ydCBuYW1lPSJCb29rUXVvdGVQb3J0IiBiaW5kaW5nPSJtaDpCb29rUXVvdGVCaW5kaW5nIj4KLQkJCTxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly93d3cuTW9uc29uLUhhZWZlbC5jb20vandzYm9vay9Cb29rUXVvdGVTZXJ2aWNlIi8+Ci0JCTwvcG9ydD4KLQk8L3NlcnZpY2U+Ci08L2RlZmluaXRpb25zPgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMveG1sYmVhbnMvdGVzdC1yZXNvdXJjZXMvQm9va1F1b3RlMi53c2RsIGIvdjEuNS4xUkMzL21vZHVsZXMveG1sYmVhbnMvdGVzdC1yZXNvdXJjZXMvQm9va1F1b3RlMi53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDVlMDAzLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3htbGJlYW5zL3Rlc3QtcmVzb3VyY2VzL0Jvb2tRdW90ZTIud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGRlZmluaXRpb25zIHhtbG5zOm1oPSJodHRwOi8vd3d3Lk1vbnNvbi1IYWVmZWwuY29tL2p3c2Jvb2svQm9va1F1b3RlIgotICAgICAgICAgICAgIHhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIgCi0gICAgICAgICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgCi0gICAgICAgICAgICAgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIgCi0gICAgICAgICAgICAgeG1sbnM6dHlwZXM9Imh0dHA6Ly93d3cuTW9uc29uLUhhZWZlbC5jb20vandzYm9vay9Cb29rUXVvdGUveHNkIgotICAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy5Nb25zb24tSGFlZmVsLmNvbS9qd3Nib29rL0Jvb2tRdW90ZSIKLSAgICAgICAgICAgICBuYW1lPSJCb29rUXVvdGUiPgotICAgIDx0eXBlcz4KLSAgICA8eHNkOnNjaGVtYSBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKLSAgICAgICAgICAgICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cuTW9uc29uLUhhZWZlbC5jb20vandzYm9vay9Cb29rUXVvdGUveHNkIj4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmYXVsdEVsZW1lbnQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8L3hzZDpzY2hlbWE+Ci0gIDwvdHlwZXM+Ci0JPG1lc3NhZ2UgbmFtZT0iQm9va1F1b3RlX2dldEJvb2tQcmljZSI+Ci0JCTxwYXJ0IG5hbWU9ImlzYm4iIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJPHBhcnQgbmFtZT0ibnVtYmVyIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9IkJvb2tRdW90ZV9nZXRCb29rUHJpY2VSZXNwb25zZSI+Ci0JCTxwYXJ0IG5hbWU9InJlc3VsdCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJJbnZhbGlkSXNibkZhdWx0Ij4KLSAgICAgICAgPHBhcnQgbmFtZT0ibWVzc2FnZSIgZWxlbWVudD0idHlwZXM6ZmF1bHRFbGVtZW50Ii8+Ci0JPC9tZXNzYWdlPgotCTxwb3J0VHlwZSBuYW1lPSJCb29rUXVvdGUiPgotCQk8b3BlcmF0aW9uIG5hbWU9ImdldEJvb2tQcmljZSI+Ci0JCQk8aW5wdXQgbWVzc2FnZT0ibWg6Qm9va1F1b3RlX2dldEJvb2tQcmljZSIvPgotCQkJPG91dHB1dCBtZXNzYWdlPSJtaDpCb29rUXVvdGVfZ2V0Qm9va1ByaWNlUmVzcG9uc2UiLz4KLQkJCTxmYXVsdCBuYW1lPSJJbnZhbGlkSXNibkZhdWx0IiBtZXNzYWdlPSJtaDpJbnZhbGlkSXNibkZhdWx0Ii8+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9ImdldEJvb2tQcmljZU5vblJvYnVzdCI+Ci0JCQk8aW5wdXQgbWVzc2FnZT0ibWg6Qm9va1F1b3RlX2dldEJvb2tQcmljZSIvPgotCQkJPG91dHB1dCBtZXNzYWdlPSJtaDpCb29rUXVvdGVfZ2V0Qm9va1ByaWNlUmVzcG9uc2UiLz4KLQkJPC9vcGVyYXRpb24+Ci0JPC9wb3J0VHlwZT4KLQk8YmluZGluZyBuYW1lPSJCb29rUXVvdGVCaW5kaW5nIiB0eXBlPSJtaDpCb29rUXVvdGUiPgotCQk8c29hcDpiaW5kaW5nIHN0eWxlPSJycGMiIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIi8+Ci0JCTxvcGVyYXRpb24gbmFtZT0iZ2V0Qm9va1ByaWNlIj4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJteUFjdGlvbiIvPgotCQkJPGlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9Imh0dHA6Ly93d3cuTW9uc29uLUhhZWZlbC5jb20vandzYm9vay9Cb29rUXVvdGUvQm9va1F1b3RlIi8+Ci0JCQk8L2lucHV0PgotCQkJPG91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgbmFtZXNwYWNlPSJodHRwOi8vd3d3Lk1vbnNvbi1IYWVmZWwuY29tL2p3c2Jvb2svQm9va1F1b3RlL0Jvb2tRdW90ZSIvPgotCQkJPC9vdXRwdXQ+Ci0JCQk8ZmF1bHQgbmFtZT0iSW52YWxpZElzYm5GYXVsdCI+Ci0JCQkJPHNvYXA6ZmF1bHQgbmFtZT0iSW52YWxpZElzYm5GYXVsdCIgdXNlPSJsaXRlcmFsIi8+Ci0JCQk8L2ZhdWx0PgkKLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0iZ2V0Qm9va1ByaWNlTm9uUm9idXN0Ij4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJteUFjdGlvbjIiLz4KLQkJCTxpbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgbmFtZXNwYWNlPSJodHRwOi8vd3d3Lk1vbnNvbi1IYWVmZWwuY29tL2p3c2Jvb2svQm9va1F1b3RlL0Jvb2tRdW90ZSIvPgotCQkJPC9pbnB1dD4KLQkJCTxvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIG5hbWVzcGFjZT0iaHR0cDovL3d3dy5Nb25zb24tSGFlZmVsLmNvbS9qd3Nib29rL0Jvb2tRdW90ZS9Cb29rUXVvdGUiLz4KLQkJCTwvb3V0cHV0PgotCQk8L29wZXJhdGlvbj4KLQk8L2JpbmRpbmc+Ci0JPHNlcnZpY2UgbmFtZT0iQm9va1F1b3RlU2VydmljZSI+Ci0JCTxwb3J0IG5hbWU9IkJvb2tRdW90ZVBvcnQiIGJpbmRpbmc9Im1oOkJvb2tRdW90ZUJpbmRpbmciPgotCQkJPHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL3d3dy5Nb25zb24tSGFlZmVsLmNvbS9qd3Nib29rL0Jvb2tRdW90ZVNlcnZpY2UiLz4KLQkJPC9wb3J0PgotCTwvc2VydmljZT4KLTwvZGVmaW5pdGlvbnM+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy94bWxiZWFucy90ZXN0LXJlc291cmNlcy9JbnRlcm9wVGVzdC53c2RsIGIvdjEuNS4xUkMzL21vZHVsZXMveG1sYmVhbnMvdGVzdC1yZXNvdXJjZXMvSW50ZXJvcFRlc3Qud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGYxZTI4NS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy94bWxiZWFucy90ZXN0LXJlc291cmNlcy9JbnRlcm9wVGVzdC53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsNzM2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08IS0tIFRoaXMgV1NETCBmaWxlIGlzIGEgY29tYmluYXRpb24gb2YgdGhlIEludGVyb3BUZXN0LndzZGwgLS0+Ci08IS0tIGFuZCBJbnRlcm9wVGVzdDIud3NkbCBmaWxlcyBmcm9tIFdoaXRlIE1lc2EgLS0+Ci08ZGVmaW5pdGlvbnMgbmFtZT0iSW50ZXJvcFRlc3QiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8iIHhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6U09BUC1FTkM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIiB4bWxuczp0bnM9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvIiB4bWxuczpzPSJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZCIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOnhtbC1zb2FwPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveG1sLXNvYXAiPgotCi0gICAgPCEtLSBUaGVzZSBhcmUgdGhlIHR5cGVzIGRlZmluZWQgZm9yIFJvdW5kIDIgQSBhbmQgQiAtLT4KLSAgICA8IS0tIFRoZXNlIHR5cGVzIHdlcmUgY29waWVkIGZyb20gd2hpdGUgbWVzYSBJbnRlcm9wVGVzdC53c2RsL0ludGVyb3BUZXN0Qi53c2RsIC0tPgotICAgIDx0eXBlcz4KLSAgICAgICAgPHNjaGVtYSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2QiPgotICAgICAgICAgICAgPGltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi8+Ci0gICAgICAgICAgICA8Y29tcGxleFR5cGUgbmFtZT0iQXJyYXlPZnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgPGNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgICAgICAgICA8cmVzdHJpY3Rpb24gYmFzZT0iU09BUC1FTkM6QXJyYXkiPgotICAgICAgICAgICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSByZWY9IlNPQVAtRU5DOmFycmF5VHlwZSIgd3NkbDphcnJheVR5cGU9InN0cmluZ1tdIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwvcmVzdHJpY3Rpb24+Ci0gICAgICAgICAgICAgICAgPC9jb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8Y29tcGxleFR5cGUgbmFtZT0iQXJyYXlPZmludCI+Ci0gICAgICAgICAgICAgICAgPGNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgICAgICAgICA8cmVzdHJpY3Rpb24gYmFzZT0iU09BUC1FTkM6QXJyYXkiPgotICAgICAgICAgICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSByZWY9IlNPQVAtRU5DOmFycmF5VHlwZSIgd3NkbDphcnJheVR5cGU9ImludFtdIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwvcmVzdHJpY3Rpb24+Ci0gICAgICAgICAgICAgICAgPC9jb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8Y29tcGxleFR5cGUgbmFtZT0iQXJyYXlPZmZsb2F0Ij4KLSAgICAgICAgICAgICAgICA8Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDxyZXN0cmljdGlvbiBiYXNlPSJTT0FQLUVOQzpBcnJheSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8YXR0cmlidXRlIHJlZj0iU09BUC1FTkM6YXJyYXlUeXBlIiB3c2RsOmFycmF5VHlwZT0iZmxvYXRbXSIvPgotICAgICAgICAgICAgICAgICAgICA8L3Jlc3RyaWN0aW9uPgotICAgICAgICAgICAgICAgIDwvY29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8L2NvbXBsZXhUeXBlPgotICAgICAgICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9IkFycmF5T2ZTT0FQU3RydWN0Ij4KLSAgICAgICAgICAgICAgICA8Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDxyZXN0cmljdGlvbiBiYXNlPSJTT0FQLUVOQzpBcnJheSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8YXR0cmlidXRlIHJlZj0iU09BUC1FTkM6YXJyYXlUeXBlIiB3c2RsOmFycmF5VHlwZT0iczpTT0FQU3RydWN0W10iLz4KLSAgICAgICAgICAgICAgICAgICAgPC9yZXN0cmljdGlvbj4KLSAgICAgICAgICAgICAgICA8L2NvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDxjb21wbGV4VHlwZSBuYW1lPSJTT0FQU3RydWN0Ij4KLSAgICAgICAgICAgICAgICA8YWxsPgotICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ2YXJTdHJpbmciIHR5cGU9InN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ2YXJJbnQiIHR5cGU9ImludCIvPgotICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ2YXJGbG9hdCIgdHlwZT0iZmxvYXQiLz4KLSAgICAgICAgICAgICAgICA8L2FsbD4KLSAgICAgICAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8Y29tcGxleFR5cGUgbmFtZT0iU09BUFN0cnVjdFN0cnVjdCI+Ci0gICAgICAgICAgICAgICAgPGFsbD4KLSAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0idmFyU3RyaW5nIiB0eXBlPSJzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0idmFySW50IiB0eXBlPSJpbnQiLz4KLSAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0idmFyRmxvYXQiIHR5cGU9ImZsb2F0Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InZhclN0cnVjdCIgdHlwZT0iczpTT0FQU3RydWN0Ii8+Ci0gICAgICAgICAgICAgICAgPC9hbGw+Ci0gICAgICAgICAgICA8L2NvbXBsZXhUeXBlPgotICAgICAgICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9IlNPQVBBcnJheVN0cnVjdCI+Ci0gICAgICAgICAgICAgICAgPGFsbD4KLSAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0idmFyU3RyaW5nIiB0eXBlPSJzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0idmFySW50IiB0eXBlPSJpbnQiLz4KLSAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0idmFyRmxvYXQiIHR5cGU9ImZsb2F0Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InZhckFycmF5IiB0eXBlPSJzOkFycmF5T2ZzdHJpbmciLz4KLSAgICAgICAgICAgICAgICA8L2FsbD4KLSAgICAgICAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8Y29tcGxleFR5cGUgbmFtZT0iQXJyYXlPZlN0cmluZzJEIj4KLSAgICAgICAgICAgICAgICA8Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDxyZXN0cmljdGlvbiBiYXNlPSJTT0FQLUVOQzpBcnJheSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8YXR0cmlidXRlIHJlZj0iU09BUC1FTkM6YXJyYXlUeXBlIiB3c2RsOmFycmF5VHlwZT0ieHNkOnN0cmluZ1ssXSIvPgotICAgICAgICAgICAgICAgICAgICA8L3Jlc3RyaWN0aW9uPgotICAgICAgICAgICAgICAgIDwvY29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8L2NvbXBsZXhUeXBlPgotCi0gICAgICAgICAgICA8Y29tcGxleFR5cGUgbmFtZT0iQXJyYXlPZk1hcCI+Ci0gICAgICAgICAgICAgICAgPGNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgICAgICAgICA8cmVzdHJpY3Rpb24gYmFzZT0iU09BUC1FTkM6QXJyYXkiPgotICAgICAgICAgICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSByZWY9IlNPQVAtRU5DOmFycmF5VHlwZSIgd3NkbDphcnJheVR5cGU9InhtbC1zb2FwOk1hcFtdIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwvcmVzdHJpY3Rpb24+Ci0gICAgICAgICAgICAgICAgPC9jb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgICAgIDwvc2NoZW1hPgotICAgIDwvdHlwZXM+Ci0KLSAgICA8IS0tIG1lc3NhZ2UsIHBvcnRUeXBlIGFuZCBiaW5kaW5nIGZvciBSb3VuZCAyIHRlc3RzIC0tPgotICAgIDwhLS0gQ29waWVkIGZyb20gd2hpdGUgbWVzYSBJbnRlcm9wVGVzdC53c2RsIC0tPgotICAgIDxtZXNzYWdlIG5hbWU9ImVjaG9TdHJpbmdSZXF1ZXN0Ij4KLSAgICAgICAgPHBhcnQgbmFtZT0iaW5wdXRTdHJpbmciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iZWNob1N0cmluZ1Jlc3BvbnNlIj4KLSAgICAgICAgPHBhcnQgbmFtZT0icmV0dXJuIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9ImVjaG9TdHJpbmdBcnJheVJlcXVlc3QiPgotICAgICAgICA8cGFydCBuYW1lPSJpbnB1dFN0cmluZ0FycmF5IiB0eXBlPSJzOkFycmF5T2ZzdHJpbmciLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iZWNob1N0cmluZ0FycmF5UmVzcG9uc2UiPgotICAgICAgICA8cGFydCBuYW1lPSJyZXR1cm4iIHR5cGU9InM6QXJyYXlPZnN0cmluZyIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJlY2hvSW50ZWdlclJlcXVlc3QiPgotICAgICAgICA8cGFydCBuYW1lPSJpbnB1dEludGVnZXIiIHR5cGU9InhzZDppbnQiLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iZWNob0ludGVnZXJSZXNwb25zZSI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9InJldHVybiIgdHlwZT0ieHNkOmludCIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJlY2hvSW50ZWdlckFycmF5UmVxdWVzdCI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9ImlucHV0SW50ZWdlckFycmF5IiB0eXBlPSJzOkFycmF5T2ZpbnQiLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iZWNob0ludGVnZXJBcnJheVJlc3BvbnNlIj4KLSAgICAgICAgPHBhcnQgbmFtZT0icmV0dXJuIiB0eXBlPSJzOkFycmF5T2ZpbnQiLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iZWNob0Zsb2F0UmVxdWVzdCI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9ImlucHV0RmxvYXQiIHR5cGU9InhzZDpmbG9hdCIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJlY2hvRmxvYXRSZXNwb25zZSI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9InJldHVybiIgdHlwZT0ieHNkOmZsb2F0Ii8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9ImVjaG9GbG9hdEFycmF5UmVxdWVzdCI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9ImlucHV0RmxvYXRBcnJheSIgdHlwZT0iczpBcnJheU9mZmxvYXQiLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iZWNob0Zsb2F0QXJyYXlSZXNwb25zZSI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9InJldHVybiIgdHlwZT0iczpBcnJheU9mZmxvYXQiLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iZWNob1N0cnVjdFJlcXVlc3QiPgotICAgICAgICA8cGFydCBuYW1lPSJpbnB1dFN0cnVjdCIgdHlwZT0iczpTT0FQU3RydWN0Ii8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9ImVjaG9TdHJ1Y3RSZXNwb25zZSI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9InJldHVybiIgdHlwZT0iczpTT0FQU3RydWN0Ii8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9ImVjaG9TdHJ1Y3RBcnJheVJlcXVlc3QiPgotICAgICAgICA8cGFydCBuYW1lPSJpbnB1dFN0cnVjdEFycmF5IiB0eXBlPSJzOkFycmF5T2ZTT0FQU3RydWN0Ii8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9ImVjaG9TdHJ1Y3RBcnJheVJlc3BvbnNlIj4KLSAgICAgICAgPHBhcnQgbmFtZT0icmV0dXJuIiB0eXBlPSJzOkFycmF5T2ZTT0FQU3RydWN0Ii8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9ImVjaG9Wb2lkUmVxdWVzdCIvPgotICAgIDxtZXNzYWdlIG5hbWU9ImVjaG9Wb2lkUmVzcG9uc2UiLz4KLSAgICA8bWVzc2FnZSBuYW1lPSJlY2hvQmFzZTY0UmVxdWVzdCI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9ImlucHV0QmFzZTY0IiB0eXBlPSJ4c2Q6YmFzZTY0QmluYXJ5Ii8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9ImVjaG9CYXNlNjRSZXNwb25zZSI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9InJldHVybiIgdHlwZT0ieHNkOmJhc2U2NEJpbmFyeSIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJlY2hvRGF0ZVJlcXVlc3QiPgotICAgICAgICA8cGFydCBuYW1lPSJpbnB1dERhdGUiIHR5cGU9InhzZDpkYXRlVGltZSIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJlY2hvRGF0ZVJlc3BvbnNlIj4KLSAgICAgICAgPHBhcnQgbmFtZT0icmV0dXJuIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iZWNob0hleEJpbmFyeVJlcXVlc3QiPgotICAgICAgICA8cGFydCBuYW1lPSJpbnB1dEhleEJpbmFyeSIgdHlwZT0ieHNkOmhleEJpbmFyeSIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJlY2hvSGV4QmluYXJ5UmVzcG9uc2UiPgotICAgICAgICA8cGFydCBuYW1lPSJyZXR1cm4iIHR5cGU9InhzZDpoZXhCaW5hcnkiLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iZWNob0RlY2ltYWxSZXF1ZXN0Ij4KLSAgICAgICAgPHBhcnQgbmFtZT0iaW5wdXREZWNpbWFsIiB0eXBlPSJ4c2Q6ZGVjaW1hbCIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJlY2hvRGVjaW1hbFJlc3BvbnNlIj4KLSAgICAgICAgPHBhcnQgbmFtZT0icmV0dXJuIiB0eXBlPSJ4c2Q6ZGVjaW1hbCIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJlY2hvQm9vbGVhblJlcXVlc3QiPgotICAgICAgICA8cGFydCBuYW1lPSJpbnB1dEJvb2xlYW4iIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9ImVjaG9Cb29sZWFuUmVzcG9uc2UiPgotICAgICAgICA8cGFydCBuYW1lPSJyZXR1cm4iIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPC9tZXNzYWdlPgotCi0gICAgPCEtLSBtZXNzYWdlcyBmb3IgUm91bmQgMkIgdGVzdHMgLS0+Ci0gICAgPCEtLSBDb3BpZWQgZnJvbSB3aGl0ZSBtZXNhIEludGVyb3BUZXN0Qi53c2RsIC0tPgotICAgIDxtZXNzYWdlIG5hbWU9ImVjaG9TdHJ1Y3RBc1NpbXBsZVR5cGVzUmVxdWVzdCI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9ImlucHV0U3RydWN0IiB0eXBlPSJzOlNPQVBTdHJ1Y3QiLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iZWNob1N0cnVjdEFzU2ltcGxlVHlwZXNSZXNwb25zZSI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9Im91dHB1dFN0cmluZyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8cGFydCBuYW1lPSJvdXRwdXRJbnRlZ2VyIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgICAgIDxwYXJ0IG5hbWU9Im91dHB1dEZsb2F0IiB0eXBlPSJ4c2Q6ZmxvYXQiLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iZWNob1NpbXBsZVR5cGVzQXNTdHJ1Y3RSZXF1ZXN0Ij4KLSAgICAgICAgPHBhcnQgbmFtZT0iaW5wdXRTdHJpbmciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPHBhcnQgbmFtZT0iaW5wdXRJbnRlZ2VyIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgICAgIDxwYXJ0IG5hbWU9ImlucHV0RmxvYXQiIHR5cGU9InhzZDpmbG9hdCIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJlY2hvU2ltcGxlVHlwZXNBc1N0cnVjdFJlc3BvbnNlIj4KLSAgICAgICAgPHBhcnQgbmFtZT0icmV0dXJuIiB0eXBlPSJzOlNPQVBTdHJ1Y3QiLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iZWNobzJEU3RyaW5nQXJyYXlSZXF1ZXN0Ij4KLSAgICAgICAgPHBhcnQgbmFtZT0iaW5wdXQyRFN0cmluZ0FycmF5IiB0eXBlPSJzOkFycmF5T2ZTdHJpbmcyRCIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJlY2hvMkRTdHJpbmdBcnJheVJlc3BvbnNlIj4KLSAgICAgICAgPHBhcnQgbmFtZT0icmV0dXJuIiB0eXBlPSJzOkFycmF5T2ZTdHJpbmcyRCIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJlY2hvTmVzdGVkU3RydWN0UmVxdWVzdCI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9ImlucHV0U3RydWN0IiB0eXBlPSJzOlNPQVBTdHJ1Y3RTdHJ1Y3QiLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iZWNob05lc3RlZFN0cnVjdFJlc3BvbnNlIj4KLSAgICAgICAgPHBhcnQgbmFtZT0icmV0dXJuIiB0eXBlPSJzOlNPQVBTdHJ1Y3RTdHJ1Y3QiLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iZWNob05lc3RlZEFycmF5UmVxdWVzdCI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9ImlucHV0U3RydWN0IiB0eXBlPSJzOlNPQVBBcnJheVN0cnVjdCIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJlY2hvTmVzdGVkQXJyYXlSZXNwb25zZSI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9InJldHVybiIgdHlwZT0iczpTT0FQQXJyYXlTdHJ1Y3QiLz4KLSAgICA8L21lc3NhZ2U+Ci0KLSAgICA8bWVzc2FnZSBuYW1lPSJlY2hvTWFwUmVxdWVzdCI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9ImlucHV0IiB0eXBlPSJ4bWwtc29hcDpNYXAiLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iZWNob01hcFJlc3BvbnNlIj4KLSAgICAgICAgPHBhcnQgbmFtZT0icmV0dXJuIiB0eXBlPSJ4bWwtc29hcDpNYXAiLz4KLSAgICA8L21lc3NhZ2U+Ci0KLSAgICA8bWVzc2FnZSBuYW1lPSJlY2hvTWFwQXJyYXlSZXF1ZXN0Ij4KLSAgICAgICAgPHBhcnQgbmFtZT0iaW5wdXQiIHR5cGU9InM6QXJyYXlPZk1hcCIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJlY2hvTWFwQXJyYXlSZXNwb25zZSI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9InJldHVybiIgdHlwZT0iczpBcnJheU9mTWFwIi8+Ci0gICAgPC9tZXNzYWdlPgotCi0gICAgPG1lc3NhZ2UgbmFtZT0iZWNob1Rva2VuUmVxdWVzdCI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9ImlucHV0VG9rZW4iIHR5cGU9InhzZDp0b2tlbiIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJlY2hvVG9rZW5SZXNwb25zZSI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9InJldHVybiIgdHlwZT0ieHNkOnRva2VuIi8+Ci0gICAgPC9tZXNzYWdlPgotCi0gICAgPG1lc3NhZ2UgbmFtZT0iZWNob05vcm1hbGl6ZWRTdHJpbmdSZXF1ZXN0Ij4KLSAgICAgICAgPHBhcnQgbmFtZT0iaW5wdXROb3JtYWxpemVkU3RyaW5nIiB0eXBlPSJ4c2Q6bm9ybWFsaXplZFN0cmluZyIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJlY2hvTm9ybWFsaXplZFN0cmluZ1Jlc3BvbnNlIj4KLSAgICAgICAgPHBhcnQgbmFtZT0icmV0dXJuIiB0eXBlPSJ4c2Q6bm9ybWFsaXplZFN0cmluZyIvPgotICAgIDwvbWVzc2FnZT4KLQotICAgIDxtZXNzYWdlIG5hbWU9ImVjaG9VbnNpZ25lZExvbmdSZXF1ZXN0Ij4KLSAgICAgICAgPHBhcnQgbmFtZT0iaW5wdXRVbnNpZ25lZExvbmciIHR5cGU9InhzZDp1bnNpZ25lZExvbmciLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iZWNob1Vuc2lnbmVkTG9uZ1Jlc3BvbnNlIj4KLSAgICAgICAgPHBhcnQgbmFtZT0icmV0dXJuIiB0eXBlPSJ4c2Q6dW5zaWduZWRMb25nIi8+Ci0gICAgPC9tZXNzYWdlPgotCi0gICAgPG1lc3NhZ2UgbmFtZT0iZWNob1Vuc2lnbmVkSW50UmVxdWVzdCI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9ImlucHV0VW5zaWduZWRJbnQiIHR5cGU9InhzZDp1bnNpZ25lZEludCIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJlY2hvVW5zaWduZWRJbnRSZXNwb25zZSI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9InJldHVybiIgdHlwZT0ieHNkOnVuc2lnbmVkSW50Ii8+Ci0gICAgPC9tZXNzYWdlPgotCi0gICAgPG1lc3NhZ2UgbmFtZT0iZWNob1Vuc2lnbmVkU2hvcnRSZXF1ZXN0Ij4KLSAgICAgICAgPHBhcnQgbmFtZT0iaW5wdXRVbnNpZ25lZFNob3J0IiB0eXBlPSJ4c2Q6dW5zaWduZWRTaG9ydCIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJlY2hvVW5zaWduZWRTaG9ydFJlc3BvbnNlIj4KLSAgICAgICAgPHBhcnQgbmFtZT0icmV0dXJuIiB0eXBlPSJ4c2Q6dW5zaWduZWRTaG9ydCIvPgotICAgIDwvbWVzc2FnZT4KLQotICAgIDxtZXNzYWdlIG5hbWU9ImVjaG9VbnNpZ25lZEJ5dGVSZXF1ZXN0Ij4KLSAgICAgICAgPHBhcnQgbmFtZT0iaW5wdXRVbnNpZ25lZEJ5dGUiIHR5cGU9InhzZDp1bnNpZ25lZEJ5dGUiLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iZWNob1Vuc2lnbmVkQnl0ZVJlc3BvbnNlIj4KLSAgICAgICAgPHBhcnQgbmFtZT0icmV0dXJuIiB0eXBlPSJ4c2Q6dW5zaWduZWRCeXRlIi8+Ci0gICAgPC9tZXNzYWdlPgotCi0gICAgPG1lc3NhZ2UgbmFtZT0iZWNob05vbk5lZ2F0aXZlSW50ZWdlclJlcXVlc3QiPgotICAgICAgICA8cGFydCBuYW1lPSJpbnB1dE5vbk5lZ2F0aXZlSW50ZWdlciIgdHlwZT0ieHNkOm5vbk5lZ2F0aXZlSW50ZWdlciIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJlY2hvTm9uTmVnYXRpdmVJbnRlZ2VyUmVzcG9uc2UiPgotICAgICAgICA8cGFydCBuYW1lPSJyZXR1cm4iIHR5cGU9InhzZDpub25OZWdhdGl2ZUludGVnZXIiLz4KLSAgICA8L21lc3NhZ2U+Ci0KLSAgICA8bWVzc2FnZSBuYW1lPSJlY2hvUG9zaXRpdmVJbnRlZ2VyUmVxdWVzdCI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9ImlucHV0UG9zaXRpdmVJbnRlZ2VyIiB0eXBlPSJ4c2Q6cG9zaXRpdmVJbnRlZ2VyIi8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9ImVjaG9Qb3NpdGl2ZUludGVnZXJSZXNwb25zZSI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9InJldHVybiIgdHlwZT0ieHNkOnBvc2l0aXZlSW50ZWdlciIvPgotICAgIDwvbWVzc2FnZT4KLQotICAgIDxtZXNzYWdlIG5hbWU9ImVjaG9Ob25Qb3NpdGl2ZUludGVnZXJSZXF1ZXN0Ij4KLSAgICAgICAgPHBhcnQgbmFtZT0iaW5wdXROb25Qb3NpdGl2ZUludGVnZXIiIHR5cGU9InhzZDpub25Qb3NpdGl2ZUludGVnZXIiLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iZWNob05vblBvc2l0aXZlSW50ZWdlclJlc3BvbnNlIj4KLSAgICAgICAgPHBhcnQgbmFtZT0icmV0dXJuIiB0eXBlPSJ4c2Q6bm9uUG9zaXRpdmVJbnRlZ2VyIi8+Ci0gICAgPC9tZXNzYWdlPgotCi0gICAgPG1lc3NhZ2UgbmFtZT0iZWNob05lZ2F0aXZlSW50ZWdlclJlcXVlc3QiPgotICAgICAgICA8cGFydCBuYW1lPSJpbnB1dE5lZ2F0aXZlSW50ZWdlciIgdHlwZT0ieHNkOm5lZ2F0aXZlSW50ZWdlciIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJlY2hvTmVnYXRpdmVJbnRlZ2VyUmVzcG9uc2UiPgotICAgICAgICA8cGFydCBuYW1lPSJyZXR1cm4iIHR5cGU9InhzZDpuZWdhdGl2ZUludGVnZXIiLz4KLSAgICA8L21lc3NhZ2U+Ci0KLSAgICA8cG9ydFR5cGUgbmFtZT0iSW50ZXJvcFRlc3RQb3J0VHlwZSI+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob1N0cmluZyIgcGFyYW1ldGVyT3JkZXI9ImlucHV0U3RyaW5nIj4KLSAgICAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6ZWNob1N0cmluZ1JlcXVlc3QiLz4KLSAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmVjaG9TdHJpbmdSZXNwb25zZSIvPgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvU3RyaW5nQXJyYXkiIHBhcmFtZXRlck9yZGVyPSJpbnB1dFN0cmluZ0FycmF5Ij4KLSAgICAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6ZWNob1N0cmluZ0FycmF5UmVxdWVzdCIvPgotICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6ZWNob1N0cmluZ0FycmF5UmVzcG9uc2UiLz4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob0ludGVnZXIiIHBhcmFtZXRlck9yZGVyPSJpbnB1dEludGVnZXIiPgotICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczplY2hvSW50ZWdlclJlcXVlc3QiLz4KLSAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmVjaG9JbnRlZ2VyUmVzcG9uc2UiLz4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob0ludGVnZXJBcnJheSIgcGFyYW1ldGVyT3JkZXI9ImlucHV0SW50ZWdlckFycmF5Ij4KLSAgICAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6ZWNob0ludGVnZXJBcnJheVJlcXVlc3QiLz4KLSAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmVjaG9JbnRlZ2VyQXJyYXlSZXNwb25zZSIvPgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvRmxvYXQiIHBhcmFtZXRlck9yZGVyPSJpbnB1dEZsb2F0Ij4KLSAgICAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6ZWNob0Zsb2F0UmVxdWVzdCIvPgotICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6ZWNob0Zsb2F0UmVzcG9uc2UiLz4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob0Zsb2F0QXJyYXkiIHBhcmFtZXRlck9yZGVyPSJpbnB1dEZsb2F0QXJyYXkiPgotICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczplY2hvRmxvYXRBcnJheVJlcXVlc3QiLz4KLSAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmVjaG9GbG9hdEFycmF5UmVzcG9uc2UiLz4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob1N0cnVjdCIgcGFyYW1ldGVyT3JkZXI9ImlucHV0U3RydWN0Ij4KLSAgICAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6ZWNob1N0cnVjdFJlcXVlc3QiLz4KLSAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmVjaG9TdHJ1Y3RSZXNwb25zZSIvPgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvU3RydWN0QXJyYXkiIHBhcmFtZXRlck9yZGVyPSJpbnB1dFN0cnVjdEFycmF5Ij4KLSAgICAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6ZWNob1N0cnVjdEFycmF5UmVxdWVzdCIvPgotICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6ZWNob1N0cnVjdEFycmF5UmVzcG9uc2UiLz4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob1ZvaWQiPgotICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczplY2hvVm9pZFJlcXVlc3QiLz4KLSAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmVjaG9Wb2lkUmVzcG9uc2UiLz4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob0Jhc2U2NCIgcGFyYW1ldGVyT3JkZXI9ImlucHV0QmFzZTY0Ij4KLSAgICAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6ZWNob0Jhc2U2NFJlcXVlc3QiLz4KLSAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmVjaG9CYXNlNjRSZXNwb25zZSIvPgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvRGF0ZSIgcGFyYW1ldGVyT3JkZXI9ImlucHV0RGF0ZSI+Ci0gICAgICAgICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmVjaG9EYXRlUmVxdWVzdCIvPgotICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6ZWNob0RhdGVSZXNwb25zZSIvPgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvSGV4QmluYXJ5IiBwYXJhbWV0ZXJPcmRlcj0iaW5wdXRIZXhCaW5hcnkiPgotICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczplY2hvSGV4QmluYXJ5UmVxdWVzdCIvPgotICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6ZWNob0hleEJpbmFyeVJlc3BvbnNlIi8+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9EZWNpbWFsIiBwYXJhbWV0ZXJPcmRlcj0iaW5wdXREZWNpbWFsIj4KLSAgICAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6ZWNob0RlY2ltYWxSZXF1ZXN0Ii8+Ci0gICAgICAgICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczplY2hvRGVjaW1hbFJlc3BvbnNlIi8+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9Cb29sZWFuIiBwYXJhbWV0ZXJPcmRlcj0iaW5wdXRCb29sZWFuIj4KLSAgICAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6ZWNob0Jvb2xlYW5SZXF1ZXN0Ii8+Ci0gICAgICAgICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczplY2hvQm9vbGVhblJlc3BvbnNlIi8+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotCi0gICAgICAgIDwhLS0gUm91bmQyQiBvcGVyYXRpb25zIC0tPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9TdHJ1Y3RBc1NpbXBsZVR5cGVzIiBwYXJhbWV0ZXJPcmRlcj0iaW5wdXRTdHJ1Y3Qgb3V0cHV0U3RyaW5nIG91dHB1dEludGVnZXIgb3V0cHV0RmxvYXQiPgotICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczplY2hvU3RydWN0QXNTaW1wbGVUeXBlc1JlcXVlc3QiLz4KLSAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmVjaG9TdHJ1Y3RBc1NpbXBsZVR5cGVzUmVzcG9uc2UiLz4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob1NpbXBsZVR5cGVzQXNTdHJ1Y3QiIHBhcmFtZXRlck9yZGVyPSJpbnB1dFN0cmluZyBpbnB1dEludGVnZXIgaW5wdXRGbG9hdCI+Ci0gICAgICAgICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmVjaG9TaW1wbGVUeXBlc0FzU3RydWN0UmVxdWVzdCIvPgotICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6ZWNob1NpbXBsZVR5cGVzQXNTdHJ1Y3RSZXNwb25zZSIvPgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvMkRTdHJpbmdBcnJheSIgcGFyYW1ldGVyT3JkZXI9ImlucHV0MkRTdHJpbmdBcnJheSI+Ci0gICAgICAgICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmVjaG8yRFN0cmluZ0FycmF5UmVxdWVzdCIvPgotICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6ZWNobzJEU3RyaW5nQXJyYXlSZXNwb25zZSIvPgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvTmVzdGVkU3RydWN0IiBwYXJhbWV0ZXJPcmRlcj0iaW5wdXRTdHJ1Y3QiPgotICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczplY2hvTmVzdGVkU3RydWN0UmVxdWVzdCIvPgotICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6ZWNob05lc3RlZFN0cnVjdFJlc3BvbnNlIi8+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9OZXN0ZWRBcnJheSIgcGFyYW1ldGVyT3JkZXI9ImlucHV0U3RydWN0Ij4KLSAgICAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6ZWNob05lc3RlZEFycmF5UmVxdWVzdCIvPgotICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6ZWNob05lc3RlZEFycmF5UmVzcG9uc2UiLz4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0KLQotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9NYXAiIHBhcmFtZXRlck9yZGVyPSJpbnB1dCI+Ci0gICAgICAgICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmVjaG9NYXBSZXF1ZXN0Ii8+Ci0gICAgICAgICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczplY2hvTWFwUmVzcG9uc2UiLz4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob01hcEFycmF5IiBwYXJhbWV0ZXJPcmRlcj0iaW5wdXQiPgotICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczplY2hvTWFwQXJyYXlSZXF1ZXN0Ii8+Ci0gICAgICAgICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczplY2hvTWFwQXJyYXlSZXNwb25zZSIvPgotICAgICAgICA8L29wZXJhdGlvbj4KLQotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9Ub2tlbiI+Ci0gICAgICAgICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmVjaG9Ub2tlblJlcXVlc3QiLz4KLSAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmVjaG9Ub2tlblJlc3BvbnNlIi8+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotCi0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob05vcm1hbGl6ZWRTdHJpbmciPgotICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczplY2hvTm9ybWFsaXplZFN0cmluZ1JlcXVlc3QiLz4KLSAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmVjaG9Ob3JtYWxpemVkU3RyaW5nUmVzcG9uc2UiLz4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvVW5zaWduZWRMb25nIj4KLSAgICAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6ZWNob1Vuc2lnbmVkTG9uZ1JlcXVlc3QiLz4KLSAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmVjaG9VbnNpZ25lZExvbmdSZXNwb25zZSIvPgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvVW5zaWduZWRJbnQiPgotICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczplY2hvVW5zaWduZWRJbnRSZXF1ZXN0Ii8+Ci0gICAgICAgICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczplY2hvVW5zaWduZWRJbnRSZXNwb25zZSIvPgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvVW5zaWduZWRTaG9ydCI+Ci0gICAgICAgICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmVjaG9VbnNpZ25lZFNob3J0UmVxdWVzdCIvPgotICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6ZWNob1Vuc2lnbmVkU2hvcnRSZXNwb25zZSIvPgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvVW5zaWduZWRCeXRlIj4KLSAgICAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6ZWNob1Vuc2lnbmVkQnl0ZVJlcXVlc3QiLz4KLSAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmVjaG9VbnNpZ25lZEJ5dGVSZXNwb25zZSIvPgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvTm9uTmVnYXRpdmVJbnRlZ2VyIj4KLSAgICAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6ZWNob05vbk5lZ2F0aXZlSW50ZWdlclJlcXVlc3QiLz4KLSAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmVjaG9Ob25OZWdhdGl2ZUludGVnZXJSZXNwb25zZSIvPgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvUG9zaXRpdmVJbnRlZ2VyIj4KLSAgICAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6ZWNob1Bvc2l0aXZlSW50ZWdlclJlcXVlc3QiLz4KLSAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmVjaG9Qb3NpdGl2ZUludGVnZXJSZXNwb25zZSIvPgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvTm9uUG9zaXRpdmVJbnRlZ2VyIj4KLSAgICAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6ZWNob05vblBvc2l0aXZlSW50ZWdlclJlcXVlc3QiLz4KLSAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmVjaG9Ob25Qb3NpdGl2ZUludGVnZXJSZXNwb25zZSIvPgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvTmVnYXRpdmVJbnRlZ2VyIj4KLSAgICAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6ZWNob05lZ2F0aXZlSW50ZWdlclJlcXVlc3QiLz4KLSAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmVjaG9OZWdhdGl2ZUludGVnZXJSZXNwb25zZSIvPgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICA8L3BvcnRUeXBlPgotCi0gICAgPGJpbmRpbmcgbmFtZT0iSW50ZXJvcFRlc3RTb2FwQmluZGluZyIgdHlwZT0idG5zOkludGVyb3BUZXN0UG9ydFR5cGUiPgotICAgICAgICA8c29hcDpiaW5kaW5nIHN0eWxlPSJycGMiIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIi8+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob1N0cmluZyI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8iLz4KLSAgICAgICAgICAgIDxpbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0iZW5jb2RlZCIgbmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnLyIgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLSAgICAgICAgICAgIDwvaW5wdXQ+Ci0gICAgICAgICAgICA8b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJlbmNvZGVkIiBuYW1lc3BhY2U9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvIiBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgPC9vdXRwdXQ+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9TdHJpbmdBcnJheSI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8iLz4KLSAgICAgICAgICAgIDxpbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0iZW5jb2RlZCIgbmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnLyIgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLSAgICAgICAgICAgIDwvaW5wdXQ+Ci0gICAgICAgICAgICA8b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJlbmNvZGVkIiBuYW1lc3BhY2U9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvIiBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgPC9vdXRwdXQ+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9JbnRlZ2VyIj4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vc29hcGludGVyb3Aub3JnLyIvPgotICAgICAgICAgICAgPGlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJlbmNvZGVkIiBuYW1lc3BhY2U9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvIiBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgIDxvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImVuY29kZWQiIG5hbWVzcGFjZT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8iIGVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi8+Ci0gICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob0ludGVnZXJBcnJheSI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8iLz4KLSAgICAgICAgICAgIDxpbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0iZW5jb2RlZCIgbmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnLyIgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLSAgICAgICAgICAgIDwvaW5wdXQ+Ci0gICAgICAgICAgICA8b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJlbmNvZGVkIiBuYW1lc3BhY2U9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvIiBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgPC9vdXRwdXQ+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9GbG9hdCI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8iLz4KLSAgICAgICAgICAgIDxpbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0iZW5jb2RlZCIgbmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnLyIgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLSAgICAgICAgICAgIDwvaW5wdXQ+Ci0gICAgICAgICAgICA8b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJlbmNvZGVkIiBuYW1lc3BhY2U9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvIiBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgPC9vdXRwdXQ+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9GbG9hdEFycmF5Ij4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vc29hcGludGVyb3Aub3JnLyIvPgotICAgICAgICAgICAgPGlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJlbmNvZGVkIiBuYW1lc3BhY2U9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvIiBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgIDxvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImVuY29kZWQiIG5hbWVzcGFjZT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8iIGVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi8+Ci0gICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob1N0cnVjdCI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8iLz4KLSAgICAgICAgICAgIDxpbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0iZW5jb2RlZCIgbmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnLyIgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLSAgICAgICAgICAgIDwvaW5wdXQ+Ci0gICAgICAgICAgICA8b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJlbmNvZGVkIiBuYW1lc3BhY2U9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvIiBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgPC9vdXRwdXQ+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9TdHJ1Y3RBcnJheSI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8iLz4KLSAgICAgICAgICAgIDxpbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0iZW5jb2RlZCIgbmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnLyIgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLSAgICAgICAgICAgIDwvaW5wdXQ+Ci0gICAgICAgICAgICA8b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJlbmNvZGVkIiBuYW1lc3BhY2U9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvIiBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgPC9vdXRwdXQ+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9Wb2lkIj4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vc29hcGludGVyb3Aub3JnLyIvPgotICAgICAgICAgICAgPGlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJlbmNvZGVkIiBuYW1lc3BhY2U9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvIiBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgIDxvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImVuY29kZWQiIG5hbWVzcGFjZT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8iIGVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi8+Ci0gICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob0Jhc2U2NCI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8iLz4KLSAgICAgICAgICAgIDxpbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0iZW5jb2RlZCIgbmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnLyIgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLSAgICAgICAgICAgIDwvaW5wdXQ+Ci0gICAgICAgICAgICA8b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJlbmNvZGVkIiBuYW1lc3BhY2U9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvIiBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgPC9vdXRwdXQ+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9EYXRlIj4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vc29hcGludGVyb3Aub3JnLyIvPgotICAgICAgICAgICAgPGlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJlbmNvZGVkIiBuYW1lc3BhY2U9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvIiBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgIDxvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImVuY29kZWQiIG5hbWVzcGFjZT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8iIGVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi8+Ci0gICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob0hleEJpbmFyeSI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8iLz4KLSAgICAgICAgICAgIDxpbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0iZW5jb2RlZCIgbmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnLyIgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLSAgICAgICAgICAgIDwvaW5wdXQ+Ci0gICAgICAgICAgICA8b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJlbmNvZGVkIiBuYW1lc3BhY2U9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvIiBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgPC9vdXRwdXQ+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9EZWNpbWFsIj4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vc29hcGludGVyb3Aub3JnLyIvPgotICAgICAgICAgICAgPGlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJlbmNvZGVkIiBuYW1lc3BhY2U9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvIiBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgIDxvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImVuY29kZWQiIG5hbWVzcGFjZT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8iIGVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi8+Ci0gICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob0Jvb2xlYW4iPgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvIi8+Ci0gICAgICAgICAgICA8aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImVuY29kZWQiIG5hbWVzcGFjZT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8iIGVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi8+Ci0gICAgICAgICAgICA8L2lucHV0PgotICAgICAgICAgICAgPG91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0iZW5jb2RlZCIgbmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnLyIgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLSAgICAgICAgICAgIDwvb3V0cHV0PgotICAgICAgICA8L29wZXJhdGlvbj4KLQotICAgICAgICA8IS0tIFJvdW5kMkIgQmluZGluZyBvcGVyYXRpb25zIC0tPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9TdHJ1Y3RBc1NpbXBsZVR5cGVzIj4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vc29hcGludGVyb3Aub3JnLyIvPgotICAgICAgICAgICAgPGlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJlbmNvZGVkIiBuYW1lc3BhY2U9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvIiBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgIDxvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImVuY29kZWQiIG5hbWVzcGFjZT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8iIGVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi8+Ci0gICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob1NpbXBsZVR5cGVzQXNTdHJ1Y3QiPgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvIi8+Ci0gICAgICAgICAgICA8aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImVuY29kZWQiIG5hbWVzcGFjZT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8iIGVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi8+Ci0gICAgICAgICAgICA8L2lucHV0PgotICAgICAgICAgICAgPG91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0iZW5jb2RlZCIgbmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnLyIgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLSAgICAgICAgICAgIDwvb3V0cHV0PgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvMkRTdHJpbmdBcnJheSI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8iLz4KLSAgICAgICAgICAgIDxpbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0iZW5jb2RlZCIgbmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnLyIgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLSAgICAgICAgICAgIDwvaW5wdXQ+Ci0gICAgICAgICAgICA8b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJlbmNvZGVkIiBuYW1lc3BhY2U9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvIiBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgPC9vdXRwdXQ+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9OZXN0ZWRTdHJ1Y3QiPgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvIi8+Ci0gICAgICAgICAgICA8aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImVuY29kZWQiIG5hbWVzcGFjZT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8iIGVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi8+Ci0gICAgICAgICAgICA8L2lucHV0PgotICAgICAgICAgICAgPG91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0iZW5jb2RlZCIgbmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnLyIgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLSAgICAgICAgICAgIDwvb3V0cHV0PgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvTmVzdGVkQXJyYXkiPgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvIi8+Ci0gICAgICAgICAgICA8aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImVuY29kZWQiIG5hbWVzcGFjZT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8iIGVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi8+Ci0gICAgICAgICAgICA8L2lucHV0PgotICAgICAgICAgICAgPG91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0iZW5jb2RlZCIgbmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnLyIgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLSAgICAgICAgICAgIDwvb3V0cHV0PgotICAgICAgICA8L29wZXJhdGlvbj4KLQotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9NYXAiPgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvIi8+Ci0gICAgICAgICAgICA8aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImVuY29kZWQiIG5hbWVzcGFjZT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8iIGVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi8+Ci0gICAgICAgICAgICA8L2lucHV0PgotICAgICAgICAgICAgPG91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0iZW5jb2RlZCIgbmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnLyIgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLSAgICAgICAgICAgIDwvb3V0cHV0PgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvTWFwQXJyYXkiPgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvIi8+Ci0gICAgICAgICAgICA8aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImVuY29kZWQiIG5hbWVzcGFjZT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8iIGVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi8+Ci0gICAgICAgICAgICA8L2lucHV0PgotICAgICAgICAgICAgPG91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0iZW5jb2RlZCIgbmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnLyIgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLSAgICAgICAgICAgIDwvb3V0cHV0PgotICAgICAgICA8L29wZXJhdGlvbj4KLQotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9Ub2tlbiI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8iLz4KLSAgICAgICAgICAgIDxpbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0iZW5jb2RlZCIgbmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnLyIgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLSAgICAgICAgICAgIDwvaW5wdXQ+Ci0gICAgICAgICAgICA8b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJlbmNvZGVkIiBuYW1lc3BhY2U9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvIiBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgPC9vdXRwdXQ+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotCi0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob05vcm1hbGl6ZWRTdHJpbmciPgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvIi8+Ci0gICAgICAgICAgICA8aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImVuY29kZWQiIG5hbWVzcGFjZT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8iIGVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi8+Ci0gICAgICAgICAgICA8L2lucHV0PgotICAgICAgICAgICAgPG91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0iZW5jb2RlZCIgbmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnLyIgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLSAgICAgICAgICAgIDwvb3V0cHV0PgotICAgICAgICA8L29wZXJhdGlvbj4KLQotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9VbnNpZ25lZExvbmciPgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvIi8+Ci0gICAgICAgICAgICA8aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImVuY29kZWQiIG5hbWVzcGFjZT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8iIGVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi8+Ci0gICAgICAgICAgICA8L2lucHV0PgotICAgICAgICAgICAgPG91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0iZW5jb2RlZCIgbmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnLyIgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLSAgICAgICAgICAgIDwvb3V0cHV0PgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvVW5zaWduZWRJbnQiPgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvIi8+Ci0gICAgICAgICAgICA8aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImVuY29kZWQiIG5hbWVzcGFjZT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8iIGVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi8+Ci0gICAgICAgICAgICA8L2lucHV0PgotICAgICAgICAgICAgPG91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0iZW5jb2RlZCIgbmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnLyIgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLSAgICAgICAgICAgIDwvb3V0cHV0PgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvVW5zaWduZWRTaG9ydCI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8iLz4KLSAgICAgICAgICAgIDxpbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0iZW5jb2RlZCIgbmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnLyIgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLSAgICAgICAgICAgIDwvaW5wdXQ+Ci0gICAgICAgICAgICA8b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJlbmNvZGVkIiBuYW1lc3BhY2U9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvIiBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgPC9vdXRwdXQ+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9VbnNpZ25lZEJ5dGUiPgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvIi8+Ci0gICAgICAgICAgICA8aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImVuY29kZWQiIG5hbWVzcGFjZT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8iIGVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi8+Ci0gICAgICAgICAgICA8L2lucHV0PgotICAgICAgICAgICAgPG91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0iZW5jb2RlZCIgbmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnLyIgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLSAgICAgICAgICAgIDwvb3V0cHV0PgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvTm9uTmVnYXRpdmVJbnRlZ2VyIj4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vc29hcGludGVyb3Aub3JnLyIvPgotICAgICAgICAgICAgPGlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJlbmNvZGVkIiBuYW1lc3BhY2U9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvIiBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgIDxvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImVuY29kZWQiIG5hbWVzcGFjZT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8iIGVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi8+Ci0gICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob1Bvc2l0aXZlSW50ZWdlciI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8iLz4KLSAgICAgICAgICAgIDxpbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0iZW5jb2RlZCIgbmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnLyIgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLSAgICAgICAgICAgIDwvaW5wdXQ+Ci0gICAgICAgICAgICA8b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJlbmNvZGVkIiBuYW1lc3BhY2U9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvIiBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgPC9vdXRwdXQ+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9Ob25Qb3NpdGl2ZUludGVnZXIiPgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvIi8+Ci0gICAgICAgICAgICA8aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImVuY29kZWQiIG5hbWVzcGFjZT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8iIGVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi8+Ci0gICAgICAgICAgICA8L2lucHV0PgotICAgICAgICAgICAgPG91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0iZW5jb2RlZCIgbmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnLyIgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLSAgICAgICAgICAgIDwvb3V0cHV0PgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvTmVnYXRpdmVJbnRlZ2VyIj4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vc29hcGludGVyb3Aub3JnLyIvPgotICAgICAgICAgICAgPGlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJlbmNvZGVkIiBuYW1lc3BhY2U9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvIiBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgIDxvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImVuY29kZWQiIG5hbWVzcGFjZT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8iIGVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi8+Ci0gICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgPC9iaW5kaW5nPgotCi0gICAgPCEtLSBTZXJ2aWNlIERlc2NyaXB0aW9uIGZvciBBeGlzIC0tPgotICAgIDxzZXJ2aWNlIG5hbWU9IkludGVyb3BUZXN0U2VydmljZSI+Ci0KLSAgICAgICAgPHBvcnQgYmluZGluZz0idG5zOkludGVyb3BUZXN0U29hcEJpbmRpbmciIG5hbWU9ImVjaG8iPgotCi0gICAgICAgICAgICA8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vbmFnb3lhLmFwYWNoZS5vcmc6NTA0OS9heGlzL3NlcnZpY2VzL2VjaG8iLz4KLQotICAgICAgICA8L3BvcnQ+Ci0gICAgPC9zZXJ2aWNlPgotCi08L2RlZmluaXRpb25zPgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMveG1sYmVhbnMvdGVzdC1yZXNvdXJjZXMvSW50ZXJvcFRlc3REb2NMaXQyLndzZGwgYi92MS41LjFSQzMvbW9kdWxlcy94bWxiZWFucy90ZXN0LXJlc291cmNlcy9JbnRlcm9wVGVzdERvY0xpdDIud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZmMWI0YS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy94bWxiZWFucy90ZXN0LXJlc291cmNlcy9JbnRlcm9wVGVzdERvY0xpdDIud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxkZWZpbml0aW9ucyBuYW1lPSJXU0RMSW50ZXJvcFRlc3REb2NMaXRTZXJ2aWNlIgotICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy9XU0RMSW50ZXJvcFRlc3REb2NMaXQiCi0gICAgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIgotICAgIHhtbG5zOlNPQVAtRU5DPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIKLSAgICB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIgotICAgIHhtbG5zOnRucz0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy9XU0RMSW50ZXJvcFRlc3REb2NMaXQiCi0gICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICB4bWxuczp4c2QxPSJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZCIKLSAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIj4KLSAgICA8dHlwZXM+Ci0gICAgICAgIDxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZCIKLSAgICAgICAgICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgICAgIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIgotICAgICAgICAgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPgotICAgICAgICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9IkFycmF5T2ZzdHJpbmdfbGl0ZXJhbCI+Ci0gICAgICAgICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIxIiBuYW1lPSJzdHJpbmciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDxjb21wbGV4VHlwZSBuYW1lPSJTT0FQU3RydWN0Ij4KLSAgICAgICAgICAgICAgICA8YWxsPgotICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ2YXJGbG9hdCIgdHlwZT0ieHNkOmZsb2F0Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InZhckludCIgdHlwZT0ieHNkOmludCIvPgotICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ2YXJTdHJpbmciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICA8L2FsbD4KLSAgICAgICAgICAgIDwvY29tcGxleFR5cGU+Ci0KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImVjaG9TdHJpbmdQYXJhbSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCi0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJlY2hvU3RyaW5nUmV0dXJuIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJlY2hvU3RyaW5nQXJyYXlQYXJhbSIgdHlwZT0ieHNkMTpBcnJheU9mc3RyaW5nX2xpdGVyYWwiLz4KLQotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iZWNob1N0cmluZ0FycmF5UmV0dXJuIiB0eXBlPSJ4c2QxOkFycmF5T2ZzdHJpbmdfbGl0ZXJhbCIvPgotCi0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJlY2hvU3RydWN0UGFyYW0iIHR5cGU9InhzZDE6U09BUFN0cnVjdCIvPgotCi0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJlY2hvU3RydWN0UmV0dXJuIiB0eXBlPSJ4c2QxOlNPQVBTdHJ1Y3QiLz4KLSAgICAgICAgPC9zY2hlbWE+Ci0gICAgPC90eXBlcz4KLSAgICA8bWVzc2FnZSBuYW1lPSJlY2hvU3RyaW5nIj4KLSAgICAgICAgPHBhcnQgZWxlbWVudD0ieHNkMTplY2hvU3RyaW5nUGFyYW0iIG5hbWU9ImEiLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iZWNob1N0cmluZ1Jlc3BvbnNlIj4KLSAgICAgICAgPHBhcnQgZWxlbWVudD0ieHNkMTplY2hvU3RyaW5nUmV0dXJuIiBuYW1lPSJyZXN1bHQiLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iZWNob1N0cmluZ0FycmF5Ij4KLSAgICAgICAgPHBhcnQgZWxlbWVudD0ieHNkMTplY2hvU3RyaW5nQXJyYXlQYXJhbSIgbmFtZT0iYSIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJlY2hvU3RyaW5nQXJyYXlSZXNwb25zZSI+Ci0gICAgICAgIDxwYXJ0IGVsZW1lbnQ9InhzZDE6ZWNob1N0cmluZ0FycmF5UmV0dXJuIiBuYW1lPSJyZXN1bHQiLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iZWNob1N0cnVjdCI+Ci0gICAgICAgIDxwYXJ0IGVsZW1lbnQ9InhzZDE6ZWNob1N0cnVjdFBhcmFtIiBuYW1lPSJhIi8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9ImVjaG9TdHJ1Y3RSZXNwb25zZSI+Ci0gICAgICAgIDxwYXJ0IGVsZW1lbnQ9InhzZDE6ZWNob1N0cnVjdFJldHVybiIgbmFtZT0icmVzdWx0Ii8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9ImVjaG9Wb2lkIi8+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iZWNob1ZvaWRSZXNwb25zZSIvPgotCi0gICAgPHBvcnRUeXBlIG5hbWU9IldTRExJbnRlcm9wVGVzdERvY0xpdFBvcnRUeXBlIj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvU3RyaW5nIj4KLSAgICAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6ZWNob1N0cmluZyIgbmFtZT0iZWNob1N0cmluZyIvPgotICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6ZWNob1N0cmluZ1Jlc3BvbnNlIiBuYW1lPSJlY2hvU3RyaW5nUmVzcG9uc2UiLz4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob1N0cmluZ0FycmF5Ij4KLSAgICAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6ZWNob1N0cmluZ0FycmF5IiBuYW1lPSJlY2hvU3RyaW5nQXJyYXkiLz4KLSAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmVjaG9TdHJpbmdBcnJheVJlc3BvbnNlIiBuYW1lPSJlY2hvU3RyaW5nQXJyYXlSZXNwb25zZSIvPgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvU3RydWN0Ij4KLSAgICAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6ZWNob1N0cnVjdCIgbmFtZT0iZWNob1N0cnVjdCIvPgotICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6ZWNob1N0cnVjdFJlc3BvbnNlIiBuYW1lPSJlY2hvU3RydWN0UmVzcG9uc2UiLz4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob1ZvaWQiPgotICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczplY2hvVm9pZCIgbmFtZT0iZWNob1ZvaWQiLz4KLSAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmVjaG9Wb2lkUmVzcG9uc2UiIG5hbWU9ImVjaG9Wb2lkUmVzcG9uc2UiLz4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgPC9wb3J0VHlwZT4KLSAgICA8YmluZGluZyBuYW1lPSJXU0RMSW50ZXJvcFRlc3REb2NMaXRQb3J0QmluZGluZyIKLSAgICAgICAgdHlwZT0idG5zOldTRExJbnRlcm9wVGVzdERvY0xpdFBvcnRUeXBlIj4KLSAgICAgICAgPHNvYXA6YmluZGluZyBzdHlsZT0iZG9jdW1lbnQiIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIi8+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob1N0cmluZyI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8iIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPGlucHV0IG5hbWU9ImVjaG9TdHJpbmciPgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgbmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnL1dTRExJbnRlcm9wVGVzdERvY0xpdCIKLSAgICAgICAgICAgICAgICAgICAgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L2lucHV0PgotICAgICAgICAgICAgPG91dHB1dCBuYW1lPSJlY2hvU3RyaW5nUmVzcG9uc2UiPgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgbmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnL1dTRExJbnRlcm9wVGVzdERvY0xpdCIKLSAgICAgICAgICAgICAgICAgICAgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob1N0cmluZ0FycmF5Ij4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vc29hcGludGVyb3Aub3JnLyIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8aW5wdXQgbmFtZT0iZWNob1N0cmluZ0FycmF5Ij4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IG5hbWVzcGFjZT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy9XU0RMSW50ZXJvcFRlc3REb2NMaXQiCi0gICAgICAgICAgICAgICAgICAgIHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgIDxvdXRwdXQgbmFtZT0iZWNob1N0cmluZ0FycmF5UmVzcG9uc2UiPgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgbmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnL1dTRExJbnRlcm9wVGVzdERvY0xpdCIKLSAgICAgICAgICAgICAgICAgICAgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob1N0cnVjdCI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8iIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPGlucHV0IG5hbWU9ImVjaG9TdHJ1Y3QiPgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgbmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnL1dTRExJbnRlcm9wVGVzdERvY0xpdCIKLSAgICAgICAgICAgICAgICAgICAgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L2lucHV0PgotICAgICAgICAgICAgPG91dHB1dCBuYW1lPSJlY2hvU3RydWN0UmVzcG9uc2UiPgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgbmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnL1dTRExJbnRlcm9wVGVzdERvY0xpdCIKLSAgICAgICAgICAgICAgICAgICAgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob1ZvaWQiPgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvIiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDxpbnB1dCBuYW1lPSJlY2hvVm9pZCI+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSBuYW1lc3BhY2U9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvV1NETEludGVyb3BUZXN0RG9jTGl0IgotICAgICAgICAgICAgICAgICAgICB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvaW5wdXQ+Ci0gICAgICAgICAgICA8b3V0cHV0IG5hbWU9ImVjaG9Wb2lkUmVzcG9uc2UiPgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgbmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnL1dTRExJbnRlcm9wVGVzdERvY0xpdCIKLSAgICAgICAgICAgICAgICAgICAgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgPC9iaW5kaW5nPgotICAgIDxzZXJ2aWNlIG5hbWU9IldTRExJbnRlcm9wVGVzdERvY0xpdFNlcnZpY2UiPgotICAgICAgICA8cG9ydCBiaW5kaW5nPSJ0bnM6V1NETEludGVyb3BUZXN0RG9jTGl0UG9ydEJpbmRpbmciCi0gICAgICAgICAgICBuYW1lPSJXU0RMSW50ZXJvcFRlc3REb2NMaXRQb3J0Ij4KLSAgICAgICAgICAgIDxzb2FwOmFkZHJlc3MKLSAgICAgICAgICAgICAgICBsb2NhdGlvbj0iaHR0cDovL21zc29hcGludGVyb3Aub3JnL3N0a3YzL3dzZGwvaW50ZXJvcFRlc3REb2NMaXQud3NkbCIvPgotICAgICAgICA8L3BvcnQ+Ci0gICAgPC9zZXJ2aWNlPgotPC9kZWZpbml0aW9ucz4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3htbGJlYW5zL3Rlc3QtcmVzb3VyY2VzL1NhbGVzUmFua05QcmljZS53c2RsIGIvdjEuNS4xUkMzL21vZHVsZXMveG1sYmVhbnMvdGVzdC1yZXNvdXJjZXMvU2FsZXNSYW5rTlByaWNlLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJjYmM5NjUuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMveG1sYmVhbnMvdGVzdC1yZXNvdXJjZXMvU2FsZXNSYW5rTlByaWNlLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSw4OTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08ZGVmaW5pdGlvbnMgeG1sbnM6aHR0cD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9odHRwLyIgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIgeG1sbnM6cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOnMwPSJodHRwOi8vd3d3LlBlcmZlY3RYTUwuY29tL05FVFdlYlN2Y3MvQm9va1NlcnZpY2UiIHhtbG5zOnNvYXBlbmM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIiB4bWxuczp0bT0iaHR0cDovL21pY3Jvc29mdC5jb20vd3NkbC9taW1lL3RleHRNYXRjaGluZy8iIHhtbG5zOm1pbWU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvbWltZS8iIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy5QZXJmZWN0WE1MLmNvbS9ORVRXZWJTdmNzL0Jvb2tTZXJ2aWNlIiB4bWxucz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iPgotICAgIDx0eXBlcz4KLSAgICAgICAgPHM6c2NoZW1hIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cuUGVyZmVjdFhNTC5jb20vTkVUV2ViU3Zjcy9Cb29rU2VydmljZSI+Ci0gICAgICAgICAgICA8czplbGVtZW50IG5hbWU9IkdldEFtYXpvblNhbGVzUmFuayI+Ci0gICAgICAgICAgICAgICAgPHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDxzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0iSVNCTiIgdHlwZT0iczpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgPC9zOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwvczpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwvczplbGVtZW50PgotICAgICAgICAgICAgPHM6ZWxlbWVudCBuYW1lPSJHZXRBbWF6b25TYWxlc1JhbmtSZXNwb25zZSI+Ci0gICAgICAgICAgICAgICAgPHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDxzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0iR2V0QW1hem9uU2FsZXNSYW5rUmVzdWx0IiB0eXBlPSJzOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICA8L3M6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC9zOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC9zOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8czplbGVtZW50IG5hbWU9IkdldEFtYXpvblVLU2FsZXNSYW5rIj4KLSAgICAgICAgICAgICAgICA8czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJJU0JOIiB0eXBlPSJzOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICA8L3M6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC9zOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC9zOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8czplbGVtZW50IG5hbWU9IkdldEFtYXpvblVLU2FsZXNSYW5rUmVzcG9uc2UiPgotICAgICAgICAgICAgICAgIDxzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9IkdldEFtYXpvblVLU2FsZXNSYW5rUmVzdWx0IiB0eXBlPSJzOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICA8L3M6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC9zOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC9zOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8czplbGVtZW50IG5hbWU9IkdldEJOU2FsZXNSYW5rIj4KLSAgICAgICAgICAgICAgICA8czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJJU0JOIiB0eXBlPSJzOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICA8L3M6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC9zOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC9zOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8czplbGVtZW50IG5hbWU9IkdldEJOU2FsZXNSYW5rUmVzcG9uc2UiPgotICAgICAgICAgICAgICAgIDxzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9IkdldEJOU2FsZXNSYW5rUmVzdWx0IiB0eXBlPSJzOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICA8L3M6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC9zOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC9zOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8czplbGVtZW50IG5hbWU9IkdldEFtYXpvblByaWNlIj4KLSAgICAgICAgICAgICAgICA8czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJJU0JOIiB0eXBlPSJzOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICA8L3M6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC9zOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC9zOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8czplbGVtZW50IG5hbWU9IkdldEFtYXpvblByaWNlUmVzcG9uc2UiPgotICAgICAgICAgICAgICAgIDxzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9IkdldEFtYXpvblByaWNlUmVzdWx0IiB0eXBlPSJzOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICA8L3M6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC9zOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC9zOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8czplbGVtZW50IG5hbWU9IkdldEFtYXpvblVLUHJpY2UiPgotICAgICAgICAgICAgICAgIDxzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9IklTQk4iIHR5cGU9InM6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwvczpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3M6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3M6ZWxlbWVudD4KLSAgICAgICAgICAgIDxzOmVsZW1lbnQgbmFtZT0iR2V0QW1hem9uVUtQcmljZVJlc3BvbnNlIj4KLSAgICAgICAgICAgICAgICA8czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJHZXRBbWF6b25VS1ByaWNlUmVzdWx0IiB0eXBlPSJzOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICA8L3M6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC9zOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC9zOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8czplbGVtZW50IG5hbWU9IkdldEJOUHJpY2UiPgotICAgICAgICAgICAgICAgIDxzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9IklTQk4iIHR5cGU9InM6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwvczpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3M6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3M6ZWxlbWVudD4KLSAgICAgICAgICAgIDxzOmVsZW1lbnQgbmFtZT0iR2V0Qk5QcmljZVJlc3BvbnNlIj4KLSAgICAgICAgICAgICAgICA8czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJHZXRCTlByaWNlUmVzdWx0IiB0eXBlPSJzOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICA8L3M6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC9zOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC9zOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8czplbGVtZW50IG5hbWU9IkdldEFtYXpvblNhbGVzUmFua05QcmljZSI+Ci0gICAgICAgICAgICAgICAgPHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDxzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0iSVNCTiIgdHlwZT0iczpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgPC9zOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwvczpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwvczplbGVtZW50PgotICAgICAgICAgICAgPHM6ZWxlbWVudCBuYW1lPSJHZXRBbWF6b25TYWxlc1JhbmtOUHJpY2VSZXNwb25zZSI+Ci0gICAgICAgICAgICAgICAgPHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDxzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0iR2V0QW1hem9uU2FsZXNSYW5rTlByaWNlUmVzdWx0IiB0eXBlPSJzMDpTYWxlc1JhbmtOUHJpY2UxIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwvczpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3M6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3M6ZWxlbWVudD4KLSAgICAgICAgICAgIDxzOmNvbXBsZXhUeXBlIG5hbWU9IlNhbGVzUmFua05QcmljZTEiPgotICAgICAgICAgICAgICAgIDxzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJTYWxlc1JhbmsiIHR5cGU9InM6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9IlByaWNlIiB0eXBlPSJzOnN0cmluZyIvPgotICAgICAgICAgICAgICAgIDwvczpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwvczpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDxzOmVsZW1lbnQgbmFtZT0iR2V0Qk5TYWxlc1JhbmtOUHJpY2UiPgotICAgICAgICAgICAgICAgIDxzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9IklTQk4iIHR5cGU9InM6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwvczpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3M6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3M6ZWxlbWVudD4KLSAgICAgICAgICAgIDxzOmVsZW1lbnQgbmFtZT0iR2V0Qk5TYWxlc1JhbmtOUHJpY2VSZXNwb25zZSI+Ci0gICAgICAgICAgICAgICAgPHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDxzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0iR2V0Qk5TYWxlc1JhbmtOUHJpY2VSZXN1bHQiIHR5cGU9InMwOlNhbGVzUmFua05QcmljZTEiLz4KLSAgICAgICAgICAgICAgICAgICAgPC9zOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwvczpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwvczplbGVtZW50PgotICAgICAgICAgICAgPHM6ZWxlbWVudCBuYW1lPSJHZXRBbWF6b25BbmRCTlNhbGVzUmFuayI+Ci0gICAgICAgICAgICAgICAgPHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDxzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0iSVNCTiIgdHlwZT0iczpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgPC9zOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwvczpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwvczplbGVtZW50PgotICAgICAgICAgICAgPHM6ZWxlbWVudCBuYW1lPSJHZXRBbWF6b25BbmRCTlNhbGVzUmFua1Jlc3BvbnNlIj4KLSAgICAgICAgICAgICAgICA8czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJHZXRBbWF6b25BbmRCTlNhbGVzUmFua1Jlc3VsdCIgdHlwZT0iczA6U2FsZXNSYW5rcyIvPgotICAgICAgICAgICAgICAgICAgICA8L3M6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC9zOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC9zOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8czpjb21wbGV4VHlwZSBuYW1lPSJTYWxlc1JhbmtzIj4KLSAgICAgICAgICAgICAgICA8czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0iQW1hem9uU2FsZXNSYW5rIiB0eXBlPSJzOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICA8czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJCTlNhbGVzUmFuayIgdHlwZT0iczpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICA8L3M6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3M6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8czplbGVtZW50IG5hbWU9IkdldEFtYXpvbkFuZEJOUHJpY2UiPgotICAgICAgICAgICAgICAgIDxzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9IklTQk4iIHR5cGU9InM6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwvczpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3M6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3M6ZWxlbWVudD4KLSAgICAgICAgICAgIDxzOmVsZW1lbnQgbmFtZT0iR2V0QW1hem9uQW5kQk5QcmljZVJlc3BvbnNlIj4KLSAgICAgICAgICAgICAgICA8czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJHZXRBbWF6b25BbmRCTlByaWNlUmVzdWx0IiB0eXBlPSJzMDpQcmljZXMiLz4KLSAgICAgICAgICAgICAgICAgICAgPC9zOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwvczpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwvczplbGVtZW50PgotICAgICAgICAgICAgPHM6Y29tcGxleFR5cGUgbmFtZT0iUHJpY2VzIj4KLSAgICAgICAgICAgICAgICA8czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0iQW1hem9uUHJpY2UiIHR5cGU9InM6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9IkJOUHJpY2UiIHR5cGU9InM6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgPC9zOnNlcXVlbmNlPgotICAgICAgICAgICAgPC9zOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHM6ZWxlbWVudCBuYW1lPSJHZXRBbGwiPgotICAgICAgICAgICAgICAgIDxzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9IklTQk4iIHR5cGU9InM6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwvczpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3M6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3M6ZWxlbWVudD4KLSAgICAgICAgICAgIDxzOmVsZW1lbnQgbmFtZT0iR2V0QWxsUmVzcG9uc2UiPgotICAgICAgICAgICAgICAgIDxzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9IkdldEFsbFJlc3VsdCIgdHlwZT0iczA6QWxsIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwvczpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3M6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3M6ZWxlbWVudD4KLSAgICAgICAgICAgIDxzOmNvbXBsZXhUeXBlIG5hbWU9IkFsbCI+Ci0gICAgICAgICAgICAgICAgPHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDxzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9IkFtYXpvblNhbGVzUmFuayIgdHlwZT0iczpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgPHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0iQW1hem9uUHJpY2UiIHR5cGU9InM6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9IkJOU2FsZXNSYW5rIiB0eXBlPSJzOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICA8czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJCTlByaWNlIiB0eXBlPSJzOnN0cmluZyIvPgotICAgICAgICAgICAgICAgIDwvczpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwvczpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDxzOmVsZW1lbnQgbmFtZT0ic3RyaW5nIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0iczpzdHJpbmciLz4KLSAgICAgICAgICAgIDxzOmVsZW1lbnQgbmFtZT0iU2FsZXNSYW5rTlByaWNlMSIgbmlsbGFibGU9InRydWUiIHR5cGU9InMwOlNhbGVzUmFua05QcmljZTEiLz4KLSAgICAgICAgICAgIDxzOmVsZW1lbnQgbmFtZT0iU2FsZXNSYW5rcyIgbmlsbGFibGU9InRydWUiIHR5cGU9InMwOlNhbGVzUmFua3MiLz4KLSAgICAgICAgICAgIDxzOmVsZW1lbnQgbmFtZT0iUHJpY2VzIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0iczA6UHJpY2VzIi8+Ci0gICAgICAgICAgICA8czplbGVtZW50IG5hbWU9IkFsbCIgbmlsbGFibGU9InRydWUiIHR5cGU9InMwOkFsbCIvPgotICAgICAgICA8L3M6c2NoZW1hPgotICAgIDwvdHlwZXM+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iR2V0QW1hem9uU2FsZXNSYW5rU29hcEluIj4KLSAgICAgICAgPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iczA6R2V0QW1hem9uU2FsZXNSYW5rIi8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9IkdldEFtYXpvblNhbGVzUmFua1NvYXBPdXQiPgotICAgICAgICA8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJzMDpHZXRBbWF6b25TYWxlc1JhbmtSZXNwb25zZSIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJHZXRBbWF6b25VS1NhbGVzUmFua1NvYXBJbiI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9InMwOkdldEFtYXpvblVLU2FsZXNSYW5rIi8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9IkdldEFtYXpvblVLU2FsZXNSYW5rU29hcE91dCI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9InMwOkdldEFtYXpvblVLU2FsZXNSYW5rUmVzcG9uc2UiLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iR2V0Qk5TYWxlc1JhbmtTb2FwSW4iPgotICAgICAgICA8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJzMDpHZXRCTlNhbGVzUmFuayIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJHZXRCTlNhbGVzUmFua1NvYXBPdXQiPgotICAgICAgICA8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJzMDpHZXRCTlNhbGVzUmFua1Jlc3BvbnNlIi8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9IkdldEFtYXpvblByaWNlU29hcEluIj4KLSAgICAgICAgPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iczA6R2V0QW1hem9uUHJpY2UiLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iR2V0QW1hem9uUHJpY2VTb2FwT3V0Ij4KLSAgICAgICAgPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iczA6R2V0QW1hem9uUHJpY2VSZXNwb25zZSIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJHZXRBbWF6b25VS1ByaWNlU29hcEluIj4KLSAgICAgICAgPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iczA6R2V0QW1hem9uVUtQcmljZSIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJHZXRBbWF6b25VS1ByaWNlU29hcE91dCI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9InMwOkdldEFtYXpvblVLUHJpY2VSZXNwb25zZSIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJHZXRCTlByaWNlU29hcEluIj4KLSAgICAgICAgPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iczA6R2V0Qk5QcmljZSIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJHZXRCTlByaWNlU29hcE91dCI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9InMwOkdldEJOUHJpY2VSZXNwb25zZSIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJHZXRBbWF6b25TYWxlc1JhbmtOUHJpY2VTb2FwSW4iPgotICAgICAgICA8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJzMDpHZXRBbWF6b25TYWxlc1JhbmtOUHJpY2UiLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iR2V0QW1hem9uU2FsZXNSYW5rTlByaWNlU29hcE91dCI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9InMwOkdldEFtYXpvblNhbGVzUmFua05QcmljZVJlc3BvbnNlIi8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9IkdldEJOU2FsZXNSYW5rTlByaWNlU29hcEluIj4KLSAgICAgICAgPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iczA6R2V0Qk5TYWxlc1JhbmtOUHJpY2UiLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iR2V0Qk5TYWxlc1JhbmtOUHJpY2VTb2FwT3V0Ij4KLSAgICAgICAgPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iczA6R2V0Qk5TYWxlc1JhbmtOUHJpY2VSZXNwb25zZSIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJHZXRBbWF6b25BbmRCTlNhbGVzUmFua1NvYXBJbiI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9InMwOkdldEFtYXpvbkFuZEJOU2FsZXNSYW5rIi8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9IkdldEFtYXpvbkFuZEJOU2FsZXNSYW5rU29hcE91dCI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9InMwOkdldEFtYXpvbkFuZEJOU2FsZXNSYW5rUmVzcG9uc2UiLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iR2V0QW1hem9uQW5kQk5QcmljZVNvYXBJbiI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9InMwOkdldEFtYXpvbkFuZEJOUHJpY2UiLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iR2V0QW1hem9uQW5kQk5QcmljZVNvYXBPdXQiPgotICAgICAgICA8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJzMDpHZXRBbWF6b25BbmRCTlByaWNlUmVzcG9uc2UiLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iR2V0QWxsU29hcEluIj4KLSAgICAgICAgPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iczA6R2V0QWxsIi8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9IkdldEFsbFNvYXBPdXQiPgotICAgICAgICA8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJzMDpHZXRBbGxSZXNwb25zZSIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJHZXRBbWF6b25TYWxlc1JhbmtIdHRwR2V0SW4iPgotICAgICAgICA8cGFydCBuYW1lPSJJU0JOIiB0eXBlPSJzOnN0cmluZyIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJHZXRBbWF6b25TYWxlc1JhbmtIdHRwR2V0T3V0Ij4KLSAgICAgICAgPHBhcnQgbmFtZT0iQm9keSIgZWxlbWVudD0iczA6c3RyaW5nIi8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9IkdldEFtYXpvblVLU2FsZXNSYW5rSHR0cEdldEluIj4KLSAgICAgICAgPHBhcnQgbmFtZT0iSVNCTiIgdHlwZT0iczpzdHJpbmciLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iR2V0QW1hem9uVUtTYWxlc1JhbmtIdHRwR2V0T3V0Ij4KLSAgICAgICAgPHBhcnQgbmFtZT0iQm9keSIgZWxlbWVudD0iczA6c3RyaW5nIi8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9IkdldEJOU2FsZXNSYW5rSHR0cEdldEluIj4KLSAgICAgICAgPHBhcnQgbmFtZT0iSVNCTiIgdHlwZT0iczpzdHJpbmciLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iR2V0Qk5TYWxlc1JhbmtIdHRwR2V0T3V0Ij4KLSAgICAgICAgPHBhcnQgbmFtZT0iQm9keSIgZWxlbWVudD0iczA6c3RyaW5nIi8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9IkdldEFtYXpvblByaWNlSHR0cEdldEluIj4KLSAgICAgICAgPHBhcnQgbmFtZT0iSVNCTiIgdHlwZT0iczpzdHJpbmciLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iR2V0QW1hem9uUHJpY2VIdHRwR2V0T3V0Ij4KLSAgICAgICAgPHBhcnQgbmFtZT0iQm9keSIgZWxlbWVudD0iczA6c3RyaW5nIi8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9IkdldEFtYXpvblVLUHJpY2VIdHRwR2V0SW4iPgotICAgICAgICA8cGFydCBuYW1lPSJJU0JOIiB0eXBlPSJzOnN0cmluZyIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJHZXRBbWF6b25VS1ByaWNlSHR0cEdldE91dCI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9IkJvZHkiIGVsZW1lbnQ9InMwOnN0cmluZyIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJHZXRCTlByaWNlSHR0cEdldEluIj4KLSAgICAgICAgPHBhcnQgbmFtZT0iSVNCTiIgdHlwZT0iczpzdHJpbmciLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iR2V0Qk5QcmljZUh0dHBHZXRPdXQiPgotICAgICAgICA8cGFydCBuYW1lPSJCb2R5IiBlbGVtZW50PSJzMDpzdHJpbmciLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iR2V0QW1hem9uU2FsZXNSYW5rTlByaWNlSHR0cEdldEluIj4KLSAgICAgICAgPHBhcnQgbmFtZT0iSVNCTiIgdHlwZT0iczpzdHJpbmciLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iR2V0QW1hem9uU2FsZXNSYW5rTlByaWNlSHR0cEdldE91dCI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9IkJvZHkiIGVsZW1lbnQ9InMwOlNhbGVzUmFua05QcmljZTEiLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iR2V0Qk5TYWxlc1JhbmtOUHJpY2VIdHRwR2V0SW4iPgotICAgICAgICA8cGFydCBuYW1lPSJJU0JOIiB0eXBlPSJzOnN0cmluZyIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJHZXRCTlNhbGVzUmFua05QcmljZUh0dHBHZXRPdXQiPgotICAgICAgICA8cGFydCBuYW1lPSJCb2R5IiBlbGVtZW50PSJzMDpTYWxlc1JhbmtOUHJpY2UxIi8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9IkdldEFtYXpvbkFuZEJOU2FsZXNSYW5rSHR0cEdldEluIj4KLSAgICAgICAgPHBhcnQgbmFtZT0iSVNCTiIgdHlwZT0iczpzdHJpbmciLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iR2V0QW1hem9uQW5kQk5TYWxlc1JhbmtIdHRwR2V0T3V0Ij4KLSAgICAgICAgPHBhcnQgbmFtZT0iQm9keSIgZWxlbWVudD0iczA6U2FsZXNSYW5rcyIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJHZXRBbWF6b25BbmRCTlByaWNlSHR0cEdldEluIj4KLSAgICAgICAgPHBhcnQgbmFtZT0iSVNCTiIgdHlwZT0iczpzdHJpbmciLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iR2V0QW1hem9uQW5kQk5QcmljZUh0dHBHZXRPdXQiPgotICAgICAgICA8cGFydCBuYW1lPSJCb2R5IiBlbGVtZW50PSJzMDpQcmljZXMiLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iR2V0QWxsSHR0cEdldEluIj4KLSAgICAgICAgPHBhcnQgbmFtZT0iSVNCTiIgdHlwZT0iczpzdHJpbmciLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iR2V0QWxsSHR0cEdldE91dCI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9IkJvZHkiIGVsZW1lbnQ9InMwOkFsbCIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJHZXRBbWF6b25TYWxlc1JhbmtIdHRwUG9zdEluIj4KLSAgICAgICAgPHBhcnQgbmFtZT0iSVNCTiIgdHlwZT0iczpzdHJpbmciLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iR2V0QW1hem9uU2FsZXNSYW5rSHR0cFBvc3RPdXQiPgotICAgICAgICA8cGFydCBuYW1lPSJCb2R5IiBlbGVtZW50PSJzMDpzdHJpbmciLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iR2V0QW1hem9uVUtTYWxlc1JhbmtIdHRwUG9zdEluIj4KLSAgICAgICAgPHBhcnQgbmFtZT0iSVNCTiIgdHlwZT0iczpzdHJpbmciLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iR2V0QW1hem9uVUtTYWxlc1JhbmtIdHRwUG9zdE91dCI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9IkJvZHkiIGVsZW1lbnQ9InMwOnN0cmluZyIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJHZXRCTlNhbGVzUmFua0h0dHBQb3N0SW4iPgotICAgICAgICA8cGFydCBuYW1lPSJJU0JOIiB0eXBlPSJzOnN0cmluZyIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJHZXRCTlNhbGVzUmFua0h0dHBQb3N0T3V0Ij4KLSAgICAgICAgPHBhcnQgbmFtZT0iQm9keSIgZWxlbWVudD0iczA6c3RyaW5nIi8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9IkdldEFtYXpvblByaWNlSHR0cFBvc3RJbiI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9IklTQk4iIHR5cGU9InM6c3RyaW5nIi8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9IkdldEFtYXpvblByaWNlSHR0cFBvc3RPdXQiPgotICAgICAgICA8cGFydCBuYW1lPSJCb2R5IiBlbGVtZW50PSJzMDpzdHJpbmciLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iR2V0QW1hem9uVUtQcmljZUh0dHBQb3N0SW4iPgotICAgICAgICA8cGFydCBuYW1lPSJJU0JOIiB0eXBlPSJzOnN0cmluZyIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJHZXRBbWF6b25VS1ByaWNlSHR0cFBvc3RPdXQiPgotICAgICAgICA8cGFydCBuYW1lPSJCb2R5IiBlbGVtZW50PSJzMDpzdHJpbmciLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iR2V0Qk5QcmljZUh0dHBQb3N0SW4iPgotICAgICAgICA8cGFydCBuYW1lPSJJU0JOIiB0eXBlPSJzOnN0cmluZyIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJHZXRCTlByaWNlSHR0cFBvc3RPdXQiPgotICAgICAgICA8cGFydCBuYW1lPSJCb2R5IiBlbGVtZW50PSJzMDpzdHJpbmciLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iR2V0QW1hem9uU2FsZXNSYW5rTlByaWNlSHR0cFBvc3RJbiI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9IklTQk4iIHR5cGU9InM6c3RyaW5nIi8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9IkdldEFtYXpvblNhbGVzUmFua05QcmljZUh0dHBQb3N0T3V0Ij4KLSAgICAgICAgPHBhcnQgbmFtZT0iQm9keSIgZWxlbWVudD0iczA6U2FsZXNSYW5rTlByaWNlMSIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJHZXRCTlNhbGVzUmFua05QcmljZUh0dHBQb3N0SW4iPgotICAgICAgICA8cGFydCBuYW1lPSJJU0JOIiB0eXBlPSJzOnN0cmluZyIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJHZXRCTlNhbGVzUmFua05QcmljZUh0dHBQb3N0T3V0Ij4KLSAgICAgICAgPHBhcnQgbmFtZT0iQm9keSIgZWxlbWVudD0iczA6U2FsZXNSYW5rTlByaWNlMSIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJHZXRBbWF6b25BbmRCTlNhbGVzUmFua0h0dHBQb3N0SW4iPgotICAgICAgICA8cGFydCBuYW1lPSJJU0JOIiB0eXBlPSJzOnN0cmluZyIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJHZXRBbWF6b25BbmRCTlNhbGVzUmFua0h0dHBQb3N0T3V0Ij4KLSAgICAgICAgPHBhcnQgbmFtZT0iQm9keSIgZWxlbWVudD0iczA6U2FsZXNSYW5rcyIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJHZXRBbWF6b25BbmRCTlByaWNlSHR0cFBvc3RJbiI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9IklTQk4iIHR5cGU9InM6c3RyaW5nIi8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9IkdldEFtYXpvbkFuZEJOUHJpY2VIdHRwUG9zdE91dCI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9IkJvZHkiIGVsZW1lbnQ9InMwOlByaWNlcyIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJHZXRBbGxIdHRwUG9zdEluIj4KLSAgICAgICAgPHBhcnQgbmFtZT0iSVNCTiIgdHlwZT0iczpzdHJpbmciLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iR2V0QWxsSHR0cFBvc3RPdXQiPgotICAgICAgICA8cGFydCBuYW1lPSJCb2R5IiBlbGVtZW50PSJzMDpBbGwiLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPHBvcnRUeXBlIG5hbWU9IlNhbGVzUmFua05QcmljZVNvYXAiPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9IkdldEFtYXpvblNhbGVzUmFuayI+Ci0gICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj5UaGlzIG1ldGhvZCBhY2NlcHRzIGFuIElTQk4gc3RyaW5nIGFuZCByZXR1cm5zIEFtYXpvbi5jb20gU2FsZXMgUmFuayBmb3IgdGhhdCBib29rLjwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJzMDpHZXRBbWF6b25TYWxlc1JhbmtTb2FwSW4iLz4KLSAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0iczA6R2V0QW1hem9uU2FsZXNSYW5rU29hcE91dCIvPgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJHZXRBbWF6b25VS1NhbGVzUmFuayI+Ci0gICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4mbHQ7YiZndDtORVchJmx0Oy9iJmd0OyBUaGlzIG1ldGhvZCBhY2NlcHRzIGFuIElTQk4gc3RyaW5nIGFuZCByZXR1cm5zICZsdDtiJmd0O0FtYXpvbi5jby51ayZsdDsvYiZndDsgU2FsZXMgUmFuayBmb3IgdGhhdCBib29rLjwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJzMDpHZXRBbWF6b25VS1NhbGVzUmFua1NvYXBJbiIvPgotICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJzMDpHZXRBbWF6b25VS1NhbGVzUmFua1NvYXBPdXQiLz4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iR2V0Qk5TYWxlc1JhbmsiPgotICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+VGhpcyBtZXRob2QgYWNjZXB0cyBhbiBJU0JOIHN0cmluZyBhbmQgcmV0dXJucyBCYXJuZXNBbmROb2JsZS5jb20gU2FsZXMgUmFuayBmb3IgdGhhdCBib29rLjwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJzMDpHZXRCTlNhbGVzUmFua1NvYXBJbiIvPgotICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJzMDpHZXRCTlNhbGVzUmFua1NvYXBPdXQiLz4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iR2V0QW1hem9uUHJpY2UiPgotICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+VGhpcyBtZXRob2QgYWNjZXB0cyBhbiBJU0JOIHN0cmluZyBhbmQgcmV0dXJucyBBbWF6b24uY29tIFByaWNlIChpbiBVU0QpIGZvciB0aGF0IGJvb2suPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InMwOkdldEFtYXpvblByaWNlU29hcEluIi8+Ci0gICAgICAgICAgICA8b3V0cHV0IG1lc3NhZ2U9InMwOkdldEFtYXpvblByaWNlU29hcE91dCIvPgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJHZXRBbWF6b25VS1ByaWNlIj4KLSAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPiZsdDtiJmd0O05FVyEmbHQ7L2ImZ3Q7IFRoaXMgbWV0aG9kIGFjY2VwdHMgYW4gSVNCTiBzdHJpbmcgYW5kIHJldHVybnMgJmx0O2ImZ3Q7QW1hem9uLmNvLnVrIFByaWNlIChpbiAmYW1wO3BvdW5kOykmbHQ7L2ImZ3Q7IGZvciB0aGF0IGJvb2suPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InMwOkdldEFtYXpvblVLUHJpY2VTb2FwSW4iLz4KLSAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0iczA6R2V0QW1hem9uVUtQcmljZVNvYXBPdXQiLz4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iR2V0Qk5QcmljZSI+Ci0gICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj5UaGlzIG1ldGhvZCBhY2NlcHRzIGFuIElTQk4gc3RyaW5nIGFuZCByZXR1cm5zIEJhcm5lc0FuZE5vYmxlLmNvbSBQcmljZSAoaW4gVVNEKSBmb3IgdGhhdCBib29rLjwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJzMDpHZXRCTlByaWNlU29hcEluIi8+Ci0gICAgICAgICAgICA8b3V0cHV0IG1lc3NhZ2U9InMwOkdldEJOUHJpY2VTb2FwT3V0Ii8+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9IkdldEFtYXpvblNhbGVzUmFua05QcmljZSI+Ci0gICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj5UaGlzIG1ldGhvZCBhY2NlcHRzIGFuIElTQk4gc3RyaW5nIGFuZCByZXR1cm5zIEFtYXpvbi5jb20gU2FsZXMgUmFuayBhbmQgUHJpY2UgZm9yIHRoYXQgYm9vay4gVGhlIHJldHVybmVkIGRhdGEgaXMgb25lIHN0cnVjdHVyZSBjb250YWluaW5nIHR3byBzdHJpbmdzIChTYWxlc1JhbmsgYW5kIEJvb2tQcmljZSkuPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InMwOkdldEFtYXpvblNhbGVzUmFua05QcmljZVNvYXBJbiIvPgotICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJzMDpHZXRBbWF6b25TYWxlc1JhbmtOUHJpY2VTb2FwT3V0Ii8+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9IkdldEJOU2FsZXNSYW5rTlByaWNlIj4KLSAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPlRoaXMgbWV0aG9kIGFjY2VwdHMgYW4gSVNCTiBzdHJpbmcgYW5kIHJldHVybnMgQmFybmVzQW5kTm9ibGUuY29tIFNhbGVzIFJhbmsgYW5kIFByaWNlIGZvciB0aGF0IGJvb2suIFRoZSByZXR1cm5lZCBkYXRhIGlzIG9uZSBzdHJ1Y3R1cmUgY29udGFpbmluZyB0d28gc3RyaW5ncyAoU2FsZXNSYW5rIGFuZCBCb29rUHJpY2UpLjwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJzMDpHZXRCTlNhbGVzUmFua05QcmljZVNvYXBJbiIvPgotICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJzMDpHZXRCTlNhbGVzUmFua05QcmljZVNvYXBPdXQiLz4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iR2V0QW1hem9uQW5kQk5TYWxlc1JhbmsiPgotICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+VGhpcyBtZXRob2QgYWNjZXB0cyBhbiBJU0JOIHN0cmluZyBhbmQgcmV0dXJucyBBbWF6b24uY29tIGFuZCBCYXJuZXNBbmROb2JsZS5jb20gU2FsZXMgUmFua3MgZm9yIHRoYXQgYm9vay4gVGhlIHJldHVybmVkIGRhdGEgaXMgb25lIHN0cnVjdHVyZSBjb250YWluaW5nIHR3byBzdHJpbmdzLiAoQW1hem9uIFNhbGVzUmFuayBhbmQgQiZhbXA7TiBTYWxlcyBSYW5rKS48L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8aW5wdXQgbWVzc2FnZT0iczA6R2V0QW1hem9uQW5kQk5TYWxlc1JhbmtTb2FwSW4iLz4KLSAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0iczA6R2V0QW1hem9uQW5kQk5TYWxlc1JhbmtTb2FwT3V0Ii8+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9IkdldEFtYXpvbkFuZEJOUHJpY2UiPgotICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+VGhpcyBtZXRob2QgYWNjZXB0cyBhbiBJU0JOIHN0cmluZyBhbmQgcmV0dXJucyBBbWF6b24uY29tIGFuZCBCYXJuZXNBbmROb2JsZS5jb20gUHJpY2VzIChpbiBVU0QpIGZvciB0aGF0IGJvb2suIFRoZSByZXR1cm5lZCBkYXRhIGlzIG9uZSBzdHJ1Y3R1cmUgY29udGFpbmluZyB0d28gc3RyaW5ncy4gKEFtYXpvbiBTYWxlc1JhbmsgYW5kIEImYW1wO04gU2FsZXMgUmFuaykuPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InMwOkdldEFtYXpvbkFuZEJOUHJpY2VTb2FwSW4iLz4KLSAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0iczA6R2V0QW1hem9uQW5kQk5QcmljZVNvYXBPdXQiLz4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iR2V0QWxsIj4KLSAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPlRoaXMgbWV0aG9kIGFjY2VwdHMgYW4gSVNCTiBzdHJpbmcgYW5kIHJldHVybnMgQW1hem9uLmNvbSBhbmQgQmFybmVzQW5kTm9ibGUuY29tIFNhbGVzIFJhbmtzIGFzIHdlbGwgYXMgQW1hem9uLmNvbSBhbmQgQmFybmVzQW5kTm9ibGUuY29tIFByaWNlcyAoaW4gVVNEKSBmb3IgdGhhdCBib29rLiBUaGUgcmV0dXJuZWQgZGF0YSBpcyBvbmUgc3RydWN0dXJlIGNvbnRhaW5pbmcgRm91ciBzdHJpbmdzLiAoQW1hem9uIFNhbGVzUmFuaywgQW1hem9uIFByaWNlLCBCJmFtcDtOIFNhbGVzIFJhbmssIGFuZCBCJmFtcDtOIFByaWNlKS48L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8aW5wdXQgbWVzc2FnZT0iczA6R2V0QWxsU29hcEluIi8+Ci0gICAgICAgICAgICA8b3V0cHV0IG1lc3NhZ2U9InMwOkdldEFsbFNvYXBPdXQiLz4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgPC9wb3J0VHlwZT4KLSAgICA8cG9ydFR5cGUgbmFtZT0iU2FsZXNSYW5rTlByaWNlSHR0cEdldCI+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iR2V0QW1hem9uU2FsZXNSYW5rIj4KLSAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPlRoaXMgbWV0aG9kIGFjY2VwdHMgYW4gSVNCTiBzdHJpbmcgYW5kIHJldHVybnMgQW1hem9uLmNvbSBTYWxlcyBSYW5rIGZvciB0aGF0IGJvb2suPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InMwOkdldEFtYXpvblNhbGVzUmFua0h0dHBHZXRJbiIvPgotICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJzMDpHZXRBbWF6b25TYWxlc1JhbmtIdHRwR2V0T3V0Ii8+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9IkdldEFtYXpvblVLU2FsZXNSYW5rIj4KLSAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPiZsdDtiJmd0O05FVyEmbHQ7L2ImZ3Q7IFRoaXMgbWV0aG9kIGFjY2VwdHMgYW4gSVNCTiBzdHJpbmcgYW5kIHJldHVybnMgJmx0O2ImZ3Q7QW1hem9uLmNvLnVrJmx0Oy9iJmd0OyBTYWxlcyBSYW5rIGZvciB0aGF0IGJvb2suPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InMwOkdldEFtYXpvblVLU2FsZXNSYW5rSHR0cEdldEluIi8+Ci0gICAgICAgICAgICA8b3V0cHV0IG1lc3NhZ2U9InMwOkdldEFtYXpvblVLU2FsZXNSYW5rSHR0cEdldE91dCIvPgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJHZXRCTlNhbGVzUmFuayI+Ci0gICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj5UaGlzIG1ldGhvZCBhY2NlcHRzIGFuIElTQk4gc3RyaW5nIGFuZCByZXR1cm5zIEJhcm5lc0FuZE5vYmxlLmNvbSBTYWxlcyBSYW5rIGZvciB0aGF0IGJvb2suPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InMwOkdldEJOU2FsZXNSYW5rSHR0cEdldEluIi8+Ci0gICAgICAgICAgICA8b3V0cHV0IG1lc3NhZ2U9InMwOkdldEJOU2FsZXNSYW5rSHR0cEdldE91dCIvPgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJHZXRBbWF6b25QcmljZSI+Ci0gICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj5UaGlzIG1ldGhvZCBhY2NlcHRzIGFuIElTQk4gc3RyaW5nIGFuZCByZXR1cm5zIEFtYXpvbi5jb20gUHJpY2UgKGluIFVTRCkgZm9yIHRoYXQgYm9vay48L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8aW5wdXQgbWVzc2FnZT0iczA6R2V0QW1hem9uUHJpY2VIdHRwR2V0SW4iLz4KLSAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0iczA6R2V0QW1hem9uUHJpY2VIdHRwR2V0T3V0Ii8+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9IkdldEFtYXpvblVLUHJpY2UiPgotICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Jmx0O2ImZ3Q7TkVXISZsdDsvYiZndDsgVGhpcyBtZXRob2QgYWNjZXB0cyBhbiBJU0JOIHN0cmluZyBhbmQgcmV0dXJucyAmbHQ7YiZndDtBbWF6b24uY28udWsgUHJpY2UgKGluICZhbXA7cG91bmQ7KSZsdDsvYiZndDsgZm9yIHRoYXQgYm9vay48L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8aW5wdXQgbWVzc2FnZT0iczA6R2V0QW1hem9uVUtQcmljZUh0dHBHZXRJbiIvPgotICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJzMDpHZXRBbWF6b25VS1ByaWNlSHR0cEdldE91dCIvPgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJHZXRCTlByaWNlIj4KLSAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPlRoaXMgbWV0aG9kIGFjY2VwdHMgYW4gSVNCTiBzdHJpbmcgYW5kIHJldHVybnMgQmFybmVzQW5kTm9ibGUuY29tIFByaWNlIChpbiBVU0QpIGZvciB0aGF0IGJvb2suPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InMwOkdldEJOUHJpY2VIdHRwR2V0SW4iLz4KLSAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0iczA6R2V0Qk5QcmljZUh0dHBHZXRPdXQiLz4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iR2V0QW1hem9uU2FsZXNSYW5rTlByaWNlIj4KLSAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPlRoaXMgbWV0aG9kIGFjY2VwdHMgYW4gSVNCTiBzdHJpbmcgYW5kIHJldHVybnMgQW1hem9uLmNvbSBTYWxlcyBSYW5rIGFuZCBQcmljZSBmb3IgdGhhdCBib29rLiBUaGUgcmV0dXJuZWQgZGF0YSBpcyBvbmUgc3RydWN0dXJlIGNvbnRhaW5pbmcgdHdvIHN0cmluZ3MgKFNhbGVzUmFuayBhbmQgQm9va1ByaWNlKS48L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8aW5wdXQgbWVzc2FnZT0iczA6R2V0QW1hem9uU2FsZXNSYW5rTlByaWNlSHR0cEdldEluIi8+Ci0gICAgICAgICAgICA8b3V0cHV0IG1lc3NhZ2U9InMwOkdldEFtYXpvblNhbGVzUmFua05QcmljZUh0dHBHZXRPdXQiLz4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iR2V0Qk5TYWxlc1JhbmtOUHJpY2UiPgotICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+VGhpcyBtZXRob2QgYWNjZXB0cyBhbiBJU0JOIHN0cmluZyBhbmQgcmV0dXJucyBCYXJuZXNBbmROb2JsZS5jb20gU2FsZXMgUmFuayBhbmQgUHJpY2UgZm9yIHRoYXQgYm9vay4gVGhlIHJldHVybmVkIGRhdGEgaXMgb25lIHN0cnVjdHVyZSBjb250YWluaW5nIHR3byBzdHJpbmdzIChTYWxlc1JhbmsgYW5kIEJvb2tQcmljZSkuPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InMwOkdldEJOU2FsZXNSYW5rTlByaWNlSHR0cEdldEluIi8+Ci0gICAgICAgICAgICA8b3V0cHV0IG1lc3NhZ2U9InMwOkdldEJOU2FsZXNSYW5rTlByaWNlSHR0cEdldE91dCIvPgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJHZXRBbWF6b25BbmRCTlNhbGVzUmFuayI+Ci0gICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj5UaGlzIG1ldGhvZCBhY2NlcHRzIGFuIElTQk4gc3RyaW5nIGFuZCByZXR1cm5zIEFtYXpvbi5jb20gYW5kIEJhcm5lc0FuZE5vYmxlLmNvbSBTYWxlcyBSYW5rcyBmb3IgdGhhdCBib29rLiBUaGUgcmV0dXJuZWQgZGF0YSBpcyBvbmUgc3RydWN0dXJlIGNvbnRhaW5pbmcgdHdvIHN0cmluZ3MuIChBbWF6b24gU2FsZXNSYW5rIGFuZCBCJmFtcDtOIFNhbGVzIFJhbmspLjwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJzMDpHZXRBbWF6b25BbmRCTlNhbGVzUmFua0h0dHBHZXRJbiIvPgotICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJzMDpHZXRBbWF6b25BbmRCTlNhbGVzUmFua0h0dHBHZXRPdXQiLz4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iR2V0QW1hem9uQW5kQk5QcmljZSI+Ci0gICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj5UaGlzIG1ldGhvZCBhY2NlcHRzIGFuIElTQk4gc3RyaW5nIGFuZCByZXR1cm5zIEFtYXpvbi5jb20gYW5kIEJhcm5lc0FuZE5vYmxlLmNvbSBQcmljZXMgKGluIFVTRCkgZm9yIHRoYXQgYm9vay4gVGhlIHJldHVybmVkIGRhdGEgaXMgb25lIHN0cnVjdHVyZSBjb250YWluaW5nIHR3byBzdHJpbmdzLiAoQW1hem9uIFNhbGVzUmFuayBhbmQgQiZhbXA7TiBTYWxlcyBSYW5rKS48L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8aW5wdXQgbWVzc2FnZT0iczA6R2V0QW1hem9uQW5kQk5QcmljZUh0dHBHZXRJbiIvPgotICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJzMDpHZXRBbWF6b25BbmRCTlByaWNlSHR0cEdldE91dCIvPgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJHZXRBbGwiPgotICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+VGhpcyBtZXRob2QgYWNjZXB0cyBhbiBJU0JOIHN0cmluZyBhbmQgcmV0dXJucyBBbWF6b24uY29tIGFuZCBCYXJuZXNBbmROb2JsZS5jb20gU2FsZXMgUmFua3MgYXMgd2VsbCBhcyBBbWF6b24uY29tIGFuZCBCYXJuZXNBbmROb2JsZS5jb20gUHJpY2VzIChpbiBVU0QpIGZvciB0aGF0IGJvb2suIFRoZSByZXR1cm5lZCBkYXRhIGlzIG9uZSBzdHJ1Y3R1cmUgY29udGFpbmluZyBGb3VyIHN0cmluZ3MuIChBbWF6b24gU2FsZXNSYW5rLCBBbWF6b24gUHJpY2UsIEImYW1wO04gU2FsZXMgUmFuaywgYW5kIEImYW1wO04gUHJpY2UpLjwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJzMDpHZXRBbGxIdHRwR2V0SW4iLz4KLSAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0iczA6R2V0QWxsSHR0cEdldE91dCIvPgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICA8L3BvcnRUeXBlPgotICAgIDxwb3J0VHlwZSBuYW1lPSJTYWxlc1JhbmtOUHJpY2VIdHRwUG9zdCI+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iR2V0QW1hem9uU2FsZXNSYW5rIj4KLSAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPlRoaXMgbWV0aG9kIGFjY2VwdHMgYW4gSVNCTiBzdHJpbmcgYW5kIHJldHVybnMgQW1hem9uLmNvbSBTYWxlcyBSYW5rIGZvciB0aGF0IGJvb2suPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InMwOkdldEFtYXpvblNhbGVzUmFua0h0dHBQb3N0SW4iLz4KLSAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0iczA6R2V0QW1hem9uU2FsZXNSYW5rSHR0cFBvc3RPdXQiLz4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iR2V0QW1hem9uVUtTYWxlc1JhbmsiPgotICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Jmx0O2ImZ3Q7TkVXISZsdDsvYiZndDsgVGhpcyBtZXRob2QgYWNjZXB0cyBhbiBJU0JOIHN0cmluZyBhbmQgcmV0dXJucyAmbHQ7YiZndDtBbWF6b24uY28udWsmbHQ7L2ImZ3Q7IFNhbGVzIFJhbmsgZm9yIHRoYXQgYm9vay48L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8aW5wdXQgbWVzc2FnZT0iczA6R2V0QW1hem9uVUtTYWxlc1JhbmtIdHRwUG9zdEluIi8+Ci0gICAgICAgICAgICA8b3V0cHV0IG1lc3NhZ2U9InMwOkdldEFtYXpvblVLU2FsZXNSYW5rSHR0cFBvc3RPdXQiLz4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iR2V0Qk5TYWxlc1JhbmsiPgotICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+VGhpcyBtZXRob2QgYWNjZXB0cyBhbiBJU0JOIHN0cmluZyBhbmQgcmV0dXJucyBCYXJuZXNBbmROb2JsZS5jb20gU2FsZXMgUmFuayBmb3IgdGhhdCBib29rLjwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJzMDpHZXRCTlNhbGVzUmFua0h0dHBQb3N0SW4iLz4KLSAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0iczA6R2V0Qk5TYWxlc1JhbmtIdHRwUG9zdE91dCIvPgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJHZXRBbWF6b25QcmljZSI+Ci0gICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj5UaGlzIG1ldGhvZCBhY2NlcHRzIGFuIElTQk4gc3RyaW5nIGFuZCByZXR1cm5zIEFtYXpvbi5jb20gUHJpY2UgKGluIFVTRCkgZm9yIHRoYXQgYm9vay48L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8aW5wdXQgbWVzc2FnZT0iczA6R2V0QW1hem9uUHJpY2VIdHRwUG9zdEluIi8+Ci0gICAgICAgICAgICA8b3V0cHV0IG1lc3NhZ2U9InMwOkdldEFtYXpvblByaWNlSHR0cFBvc3RPdXQiLz4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iR2V0QW1hem9uVUtQcmljZSI+Ci0gICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4mbHQ7YiZndDtORVchJmx0Oy9iJmd0OyBUaGlzIG1ldGhvZCBhY2NlcHRzIGFuIElTQk4gc3RyaW5nIGFuZCByZXR1cm5zICZsdDtiJmd0O0FtYXpvbi5jby51ayBQcmljZSAoaW4gJmFtcDtwb3VuZDspJmx0Oy9iJmd0OyBmb3IgdGhhdCBib29rLjwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJzMDpHZXRBbWF6b25VS1ByaWNlSHR0cFBvc3RJbiIvPgotICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJzMDpHZXRBbWF6b25VS1ByaWNlSHR0cFBvc3RPdXQiLz4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iR2V0Qk5QcmljZSI+Ci0gICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj5UaGlzIG1ldGhvZCBhY2NlcHRzIGFuIElTQk4gc3RyaW5nIGFuZCByZXR1cm5zIEJhcm5lc0FuZE5vYmxlLmNvbSBQcmljZSAoaW4gVVNEKSBmb3IgdGhhdCBib29rLjwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJzMDpHZXRCTlByaWNlSHR0cFBvc3RJbiIvPgotICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJzMDpHZXRCTlByaWNlSHR0cFBvc3RPdXQiLz4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iR2V0QW1hem9uU2FsZXNSYW5rTlByaWNlIj4KLSAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPlRoaXMgbWV0aG9kIGFjY2VwdHMgYW4gSVNCTiBzdHJpbmcgYW5kIHJldHVybnMgQW1hem9uLmNvbSBTYWxlcyBSYW5rIGFuZCBQcmljZSBmb3IgdGhhdCBib29rLiBUaGUgcmV0dXJuZWQgZGF0YSBpcyBvbmUgc3RydWN0dXJlIGNvbnRhaW5pbmcgdHdvIHN0cmluZ3MgKFNhbGVzUmFuayBhbmQgQm9va1ByaWNlKS48L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8aW5wdXQgbWVzc2FnZT0iczA6R2V0QW1hem9uU2FsZXNSYW5rTlByaWNlSHR0cFBvc3RJbiIvPgotICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJzMDpHZXRBbWF6b25TYWxlc1JhbmtOUHJpY2VIdHRwUG9zdE91dCIvPgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJHZXRCTlNhbGVzUmFua05QcmljZSI+Ci0gICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj5UaGlzIG1ldGhvZCBhY2NlcHRzIGFuIElTQk4gc3RyaW5nIGFuZCByZXR1cm5zIEJhcm5lc0FuZE5vYmxlLmNvbSBTYWxlcyBSYW5rIGFuZCBQcmljZSBmb3IgdGhhdCBib29rLiBUaGUgcmV0dXJuZWQgZGF0YSBpcyBvbmUgc3RydWN0dXJlIGNvbnRhaW5pbmcgdHdvIHN0cmluZ3MgKFNhbGVzUmFuayBhbmQgQm9va1ByaWNlKS48L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8aW5wdXQgbWVzc2FnZT0iczA6R2V0Qk5TYWxlc1JhbmtOUHJpY2VIdHRwUG9zdEluIi8+Ci0gICAgICAgICAgICA8b3V0cHV0IG1lc3NhZ2U9InMwOkdldEJOU2FsZXNSYW5rTlByaWNlSHR0cFBvc3RPdXQiLz4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iR2V0QW1hem9uQW5kQk5TYWxlc1JhbmsiPgotICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+VGhpcyBtZXRob2QgYWNjZXB0cyBhbiBJU0JOIHN0cmluZyBhbmQgcmV0dXJucyBBbWF6b24uY29tIGFuZCBCYXJuZXNBbmROb2JsZS5jb20gU2FsZXMgUmFua3MgZm9yIHRoYXQgYm9vay4gVGhlIHJldHVybmVkIGRhdGEgaXMgb25lIHN0cnVjdHVyZSBjb250YWluaW5nIHR3byBzdHJpbmdzLiAoQW1hem9uIFNhbGVzUmFuayBhbmQgQiZhbXA7TiBTYWxlcyBSYW5rKS48L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8aW5wdXQgbWVzc2FnZT0iczA6R2V0QW1hem9uQW5kQk5TYWxlc1JhbmtIdHRwUG9zdEluIi8+Ci0gICAgICAgICAgICA8b3V0cHV0IG1lc3NhZ2U9InMwOkdldEFtYXpvbkFuZEJOU2FsZXNSYW5rSHR0cFBvc3RPdXQiLz4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iR2V0QW1hem9uQW5kQk5QcmljZSI+Ci0gICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj5UaGlzIG1ldGhvZCBhY2NlcHRzIGFuIElTQk4gc3RyaW5nIGFuZCByZXR1cm5zIEFtYXpvbi5jb20gYW5kIEJhcm5lc0FuZE5vYmxlLmNvbSBQcmljZXMgKGluIFVTRCkgZm9yIHRoYXQgYm9vay4gVGhlIHJldHVybmVkIGRhdGEgaXMgb25lIHN0cnVjdHVyZSBjb250YWluaW5nIHR3byBzdHJpbmdzLiAoQW1hem9uIFNhbGVzUmFuayBhbmQgQiZhbXA7TiBTYWxlcyBSYW5rKS48L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8aW5wdXQgbWVzc2FnZT0iczA6R2V0QW1hem9uQW5kQk5QcmljZUh0dHBQb3N0SW4iLz4KLSAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0iczA6R2V0QW1hem9uQW5kQk5QcmljZUh0dHBQb3N0T3V0Ii8+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9IkdldEFsbCI+Ci0gICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj5UaGlzIG1ldGhvZCBhY2NlcHRzIGFuIElTQk4gc3RyaW5nIGFuZCByZXR1cm5zIEFtYXpvbi5jb20gYW5kIEJhcm5lc0FuZE5vYmxlLmNvbSBTYWxlcyBSYW5rcyBhcyB3ZWxsIGFzIEFtYXpvbi5jb20gYW5kIEJhcm5lc0FuZE5vYmxlLmNvbSBQcmljZXMgKGluIFVTRCkgZm9yIHRoYXQgYm9vay4gVGhlIHJldHVybmVkIGRhdGEgaXMgb25lIHN0cnVjdHVyZSBjb250YWluaW5nIEZvdXIgc3RyaW5ncy4gKEFtYXpvbiBTYWxlc1JhbmssIEFtYXpvbiBQcmljZSwgQiZhbXA7TiBTYWxlcyBSYW5rLCBhbmQgQiZhbXA7TiBQcmljZSkuPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InMwOkdldEFsbEh0dHBQb3N0SW4iLz4KLSAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0iczA6R2V0QWxsSHR0cFBvc3RPdXQiLz4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgPC9wb3J0VHlwZT4KLSAgICA8YmluZGluZyBuYW1lPSJTYWxlc1JhbmtOUHJpY2VTb2FwIiB0eXBlPSJzMDpTYWxlc1JhbmtOUHJpY2VTb2FwIj4KLSAgICAgICAgPHNvYXA6YmluZGluZyB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iR2V0QW1hem9uU2FsZXNSYW5rIj4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vd3d3LlBlcmZlY3RYTUwuY29tL05FVFdlYlN2Y3MvQm9va1NlcnZpY2UvR2V0QW1hem9uU2FsZXNSYW5rIiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDxpbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgIDxvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvb3V0cHV0PgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJHZXRBbWF6b25VS1NhbGVzUmFuayI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3d3dy5QZXJmZWN0WE1MLmNvbS9ORVRXZWJTdmNzL0Jvb2tTZXJ2aWNlL0dldEFtYXpvblVLU2FsZXNSYW5rIiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDxpbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgIDxvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvb3V0cHV0PgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJHZXRCTlNhbGVzUmFuayI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3d3dy5QZXJmZWN0WE1MLmNvbS9ORVRXZWJTdmNzL0Jvb2tTZXJ2aWNlL0dldEJOU2FsZXNSYW5rIiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDxpbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgIDxvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvb3V0cHV0PgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJHZXRBbWF6b25QcmljZSI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3d3dy5QZXJmZWN0WE1MLmNvbS9ORVRXZWJTdmNzL0Jvb2tTZXJ2aWNlL0dldEFtYXpvblByaWNlIiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDxpbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgIDxvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvb3V0cHV0PgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJHZXRBbWF6b25VS1ByaWNlIj4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vd3d3LlBlcmZlY3RYTUwuY29tL05FVFdlYlN2Y3MvQm9va1NlcnZpY2UvR2V0QW1hem9uVUtQcmljZSIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvaW5wdXQ+Ci0gICAgICAgICAgICA8b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iR2V0Qk5QcmljZSI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3d3dy5QZXJmZWN0WE1MLmNvbS9ORVRXZWJTdmNzL0Jvb2tTZXJ2aWNlL0dldEJOUHJpY2UiIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPGlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L2lucHV0PgotICAgICAgICAgICAgPG91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC9vdXRwdXQ+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9IkdldEFtYXpvblNhbGVzUmFua05QcmljZSI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3d3dy5QZXJmZWN0WE1MLmNvbS9ORVRXZWJTdmNzL0Jvb2tTZXJ2aWNlL0dldEFtYXpvblNhbGVzUmFua05QcmljZSIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvaW5wdXQ+Ci0gICAgICAgICAgICA8b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iR2V0Qk5TYWxlc1JhbmtOUHJpY2UiPgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly93d3cuUGVyZmVjdFhNTC5jb20vTkVUV2ViU3Zjcy9Cb29rU2VydmljZS9HZXRCTlNhbGVzUmFua05QcmljZSIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvaW5wdXQ+Ci0gICAgICAgICAgICA8b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iR2V0QW1hem9uQW5kQk5TYWxlc1JhbmsiPgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly93d3cuUGVyZmVjdFhNTC5jb20vTkVUV2ViU3Zjcy9Cb29rU2VydmljZS9HZXRBbWF6b25BbmRCTlNhbGVzUmFuayIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvaW5wdXQ+Ci0gICAgICAgICAgICA8b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iR2V0QW1hem9uQW5kQk5QcmljZSI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3d3dy5QZXJmZWN0WE1MLmNvbS9ORVRXZWJTdmNzL0Jvb2tTZXJ2aWNlL0dldEFtYXpvbkFuZEJOUHJpY2UiIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPGlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L2lucHV0PgotICAgICAgICAgICAgPG91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC9vdXRwdXQ+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9IkdldEFsbCI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3d3dy5QZXJmZWN0WE1MLmNvbS9ORVRXZWJTdmNzL0Jvb2tTZXJ2aWNlL0dldEFsbCIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvaW5wdXQ+Ci0gICAgICAgICAgICA8b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgPC9iaW5kaW5nPgotICAgIDxiaW5kaW5nIG5hbWU9IlNhbGVzUmFua05QcmljZUh0dHBHZXQiIHR5cGU9InMwOlNhbGVzUmFua05QcmljZUh0dHBHZXQiPgotICAgICAgICA8aHR0cDpiaW5kaW5nIHZlcmI9IkdFVCIvPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9IkdldEFtYXpvblNhbGVzUmFuayI+Ci0gICAgICAgICAgICA8aHR0cDpvcGVyYXRpb24gbG9jYXRpb249Ii9HZXRBbWF6b25TYWxlc1JhbmsiLz4KLSAgICAgICAgICAgIDxpbnB1dD4KLSAgICAgICAgICAgICAgICA8aHR0cDp1cmxFbmNvZGVkLz4KLSAgICAgICAgICAgIDwvaW5wdXQ+Ci0gICAgICAgICAgICA8b3V0cHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOm1pbWVYbWwgcGFydD0iQm9keSIvPgotICAgICAgICAgICAgPC9vdXRwdXQ+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9IkdldEFtYXpvblVLU2FsZXNSYW5rIj4KLSAgICAgICAgICAgIDxodHRwOm9wZXJhdGlvbiBsb2NhdGlvbj0iL0dldEFtYXpvblVLU2FsZXNSYW5rIi8+Ci0gICAgICAgICAgICA8aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPGh0dHA6dXJsRW5jb2RlZC8+Ci0gICAgICAgICAgICA8L2lucHV0PgotICAgICAgICAgICAgPG91dHB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTptaW1lWG1sIHBhcnQ9IkJvZHkiLz4KLSAgICAgICAgICAgIDwvb3V0cHV0PgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJHZXRCTlNhbGVzUmFuayI+Ci0gICAgICAgICAgICA8aHR0cDpvcGVyYXRpb24gbG9jYXRpb249Ii9HZXRCTlNhbGVzUmFuayIvPgotICAgICAgICAgICAgPGlucHV0PgotICAgICAgICAgICAgICAgIDxodHRwOnVybEVuY29kZWQvPgotICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgIDxvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6bWltZVhtbCBwYXJ0PSJCb2R5Ii8+Ci0gICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iR2V0QW1hem9uUHJpY2UiPgotICAgICAgICAgICAgPGh0dHA6b3BlcmF0aW9uIGxvY2F0aW9uPSIvR2V0QW1hem9uUHJpY2UiLz4KLSAgICAgICAgICAgIDxpbnB1dD4KLSAgICAgICAgICAgICAgICA8aHR0cDp1cmxFbmNvZGVkLz4KLSAgICAgICAgICAgIDwvaW5wdXQ+Ci0gICAgICAgICAgICA8b3V0cHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOm1pbWVYbWwgcGFydD0iQm9keSIvPgotICAgICAgICAgICAgPC9vdXRwdXQ+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9IkdldEFtYXpvblVLUHJpY2UiPgotICAgICAgICAgICAgPGh0dHA6b3BlcmF0aW9uIGxvY2F0aW9uPSIvR2V0QW1hem9uVUtQcmljZSIvPgotICAgICAgICAgICAgPGlucHV0PgotICAgICAgICAgICAgICAgIDxodHRwOnVybEVuY29kZWQvPgotICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgIDxvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6bWltZVhtbCBwYXJ0PSJCb2R5Ii8+Ci0gICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iR2V0Qk5QcmljZSI+Ci0gICAgICAgICAgICA8aHR0cDpvcGVyYXRpb24gbG9jYXRpb249Ii9HZXRCTlByaWNlIi8+Ci0gICAgICAgICAgICA8aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPGh0dHA6dXJsRW5jb2RlZC8+Ci0gICAgICAgICAgICA8L2lucHV0PgotICAgICAgICAgICAgPG91dHB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTptaW1lWG1sIHBhcnQ9IkJvZHkiLz4KLSAgICAgICAgICAgIDwvb3V0cHV0PgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJHZXRBbWF6b25TYWxlc1JhbmtOUHJpY2UiPgotICAgICAgICAgICAgPGh0dHA6b3BlcmF0aW9uIGxvY2F0aW9uPSIvR2V0QW1hem9uU2FsZXNSYW5rTlByaWNlIi8+Ci0gICAgICAgICAgICA8aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPGh0dHA6dXJsRW5jb2RlZC8+Ci0gICAgICAgICAgICA8L2lucHV0PgotICAgICAgICAgICAgPG91dHB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTptaW1lWG1sIHBhcnQ9IkJvZHkiLz4KLSAgICAgICAgICAgIDwvb3V0cHV0PgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJHZXRCTlNhbGVzUmFua05QcmljZSI+Ci0gICAgICAgICAgICA8aHR0cDpvcGVyYXRpb24gbG9jYXRpb249Ii9HZXRCTlNhbGVzUmFua05QcmljZSIvPgotICAgICAgICAgICAgPGlucHV0PgotICAgICAgICAgICAgICAgIDxodHRwOnVybEVuY29kZWQvPgotICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgIDxvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6bWltZVhtbCBwYXJ0PSJCb2R5Ii8+Ci0gICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iR2V0QW1hem9uQW5kQk5TYWxlc1JhbmsiPgotICAgICAgICAgICAgPGh0dHA6b3BlcmF0aW9uIGxvY2F0aW9uPSIvR2V0QW1hem9uQW5kQk5TYWxlc1JhbmsiLz4KLSAgICAgICAgICAgIDxpbnB1dD4KLSAgICAgICAgICAgICAgICA8aHR0cDp1cmxFbmNvZGVkLz4KLSAgICAgICAgICAgIDwvaW5wdXQ+Ci0gICAgICAgICAgICA8b3V0cHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOm1pbWVYbWwgcGFydD0iQm9keSIvPgotICAgICAgICAgICAgPC9vdXRwdXQ+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9IkdldEFtYXpvbkFuZEJOUHJpY2UiPgotICAgICAgICAgICAgPGh0dHA6b3BlcmF0aW9uIGxvY2F0aW9uPSIvR2V0QW1hem9uQW5kQk5QcmljZSIvPgotICAgICAgICAgICAgPGlucHV0PgotICAgICAgICAgICAgICAgIDxodHRwOnVybEVuY29kZWQvPgotICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgIDxvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6bWltZVhtbCBwYXJ0PSJCb2R5Ii8+Ci0gICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iR2V0QWxsIj4KLSAgICAgICAgICAgIDxodHRwOm9wZXJhdGlvbiBsb2NhdGlvbj0iL0dldEFsbCIvPgotICAgICAgICAgICAgPGlucHV0PgotICAgICAgICAgICAgICAgIDxodHRwOnVybEVuY29kZWQvPgotICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgIDxvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6bWltZVhtbCBwYXJ0PSJCb2R5Ii8+Ci0gICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgPC9iaW5kaW5nPgotICAgIDxiaW5kaW5nIG5hbWU9IlNhbGVzUmFua05QcmljZUh0dHBQb3N0IiB0eXBlPSJzMDpTYWxlc1JhbmtOUHJpY2VIdHRwUG9zdCI+Ci0gICAgICAgIDxodHRwOmJpbmRpbmcgdmVyYj0iUE9TVCIvPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9IkdldEFtYXpvblNhbGVzUmFuayI+Ci0gICAgICAgICAgICA8aHR0cDpvcGVyYXRpb24gbG9jYXRpb249Ii9HZXRBbWF6b25TYWxlc1JhbmsiLz4KLSAgICAgICAgICAgIDxpbnB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHR5cGU9ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIvPgotICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgIDxvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6bWltZVhtbCBwYXJ0PSJCb2R5Ii8+Ci0gICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iR2V0QW1hem9uVUtTYWxlc1JhbmsiPgotICAgICAgICAgICAgPGh0dHA6b3BlcmF0aW9uIGxvY2F0aW9uPSIvR2V0QW1hem9uVUtTYWxlc1JhbmsiLz4KLSAgICAgICAgICAgIDxpbnB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHR5cGU9ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIvPgotICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgIDxvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6bWltZVhtbCBwYXJ0PSJCb2R5Ii8+Ci0gICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iR2V0Qk5TYWxlc1JhbmsiPgotICAgICAgICAgICAgPGh0dHA6b3BlcmF0aW9uIGxvY2F0aW9uPSIvR2V0Qk5TYWxlc1JhbmsiLz4KLSAgICAgICAgICAgIDxpbnB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHR5cGU9ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIvPgotICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgIDxvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6bWltZVhtbCBwYXJ0PSJCb2R5Ii8+Ci0gICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iR2V0QW1hem9uUHJpY2UiPgotICAgICAgICAgICAgPGh0dHA6b3BlcmF0aW9uIGxvY2F0aW9uPSIvR2V0QW1hem9uUHJpY2UiLz4KLSAgICAgICAgICAgIDxpbnB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHR5cGU9ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIvPgotICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgIDxvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6bWltZVhtbCBwYXJ0PSJCb2R5Ii8+Ci0gICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iR2V0QW1hem9uVUtQcmljZSI+Ci0gICAgICAgICAgICA8aHR0cDpvcGVyYXRpb24gbG9jYXRpb249Ii9HZXRBbWF6b25VS1ByaWNlIi8+Ci0gICAgICAgICAgICA8aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCB0eXBlPSJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiLz4KLSAgICAgICAgICAgIDwvaW5wdXQ+Ci0gICAgICAgICAgICA8b3V0cHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOm1pbWVYbWwgcGFydD0iQm9keSIvPgotICAgICAgICAgICAgPC9vdXRwdXQ+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9IkdldEJOUHJpY2UiPgotICAgICAgICAgICAgPGh0dHA6b3BlcmF0aW9uIGxvY2F0aW9uPSIvR2V0Qk5QcmljZSIvPgotICAgICAgICAgICAgPGlucHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgdHlwZT0iYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIi8+Ci0gICAgICAgICAgICA8L2lucHV0PgotICAgICAgICAgICAgPG91dHB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTptaW1lWG1sIHBhcnQ9IkJvZHkiLz4KLSAgICAgICAgICAgIDwvb3V0cHV0PgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJHZXRBbWF6b25TYWxlc1JhbmtOUHJpY2UiPgotICAgICAgICAgICAgPGh0dHA6b3BlcmF0aW9uIGxvY2F0aW9uPSIvR2V0QW1hem9uU2FsZXNSYW5rTlByaWNlIi8+Ci0gICAgICAgICAgICA8aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCB0eXBlPSJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiLz4KLSAgICAgICAgICAgIDwvaW5wdXQ+Ci0gICAgICAgICAgICA8b3V0cHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOm1pbWVYbWwgcGFydD0iQm9keSIvPgotICAgICAgICAgICAgPC9vdXRwdXQ+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9IkdldEJOU2FsZXNSYW5rTlByaWNlIj4KLSAgICAgICAgICAgIDxodHRwOm9wZXJhdGlvbiBsb2NhdGlvbj0iL0dldEJOU2FsZXNSYW5rTlByaWNlIi8+Ci0gICAgICAgICAgICA8aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCB0eXBlPSJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiLz4KLSAgICAgICAgICAgIDwvaW5wdXQ+Ci0gICAgICAgICAgICA8b3V0cHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOm1pbWVYbWwgcGFydD0iQm9keSIvPgotICAgICAgICAgICAgPC9vdXRwdXQ+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9IkdldEFtYXpvbkFuZEJOU2FsZXNSYW5rIj4KLSAgICAgICAgICAgIDxodHRwOm9wZXJhdGlvbiBsb2NhdGlvbj0iL0dldEFtYXpvbkFuZEJOU2FsZXNSYW5rIi8+Ci0gICAgICAgICAgICA8aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCB0eXBlPSJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiLz4KLSAgICAgICAgICAgIDwvaW5wdXQ+Ci0gICAgICAgICAgICA8b3V0cHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOm1pbWVYbWwgcGFydD0iQm9keSIvPgotICAgICAgICAgICAgPC9vdXRwdXQ+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9IkdldEFtYXpvbkFuZEJOUHJpY2UiPgotICAgICAgICAgICAgPGh0dHA6b3BlcmF0aW9uIGxvY2F0aW9uPSIvR2V0QW1hem9uQW5kQk5QcmljZSIvPgotICAgICAgICAgICAgPGlucHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgdHlwZT0iYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIi8+Ci0gICAgICAgICAgICA8L2lucHV0PgotICAgICAgICAgICAgPG91dHB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTptaW1lWG1sIHBhcnQ9IkJvZHkiLz4KLSAgICAgICAgICAgIDwvb3V0cHV0PgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJHZXRBbGwiPgotICAgICAgICAgICAgPGh0dHA6b3BlcmF0aW9uIGxvY2F0aW9uPSIvR2V0QWxsIi8+Ci0gICAgICAgICAgICA8aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCB0eXBlPSJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiLz4KLSAgICAgICAgICAgIDwvaW5wdXQ+Ci0gICAgICAgICAgICA8b3V0cHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOm1pbWVYbWwgcGFydD0iQm9keSIvPgotICAgICAgICAgICAgPC9vdXRwdXQ+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotICAgIDwvYmluZGluZz4KLSAgICA8c2VydmljZSBuYW1lPSJTYWxlc1JhbmtOUHJpY2UiPgotICAgICAgICA8ZG9jdW1lbnRhdGlvbj4mbHQ7YiZndDtUaGlzIFdlYiBTZXJ2aWNlIGNhbiBiZSB1c2VkIHRvIGdldCB0aGUgU2FsZXMgUmFuayBhbmQvb3IgcHJpY2UgZm9yIGFueSBib29rIGF2YWlsYWJsZSBvbiBBbWF6b24gYW5kL29yIEImYW1wO04gV2ViIHNpdGVzLiZsdDsvYiZndDsgVGhpcyBXZWIgU2VydmljZSBpcyBjcmVhdGVkIGJ5ICZsdDthIGhyZWY9aHR0cDovL3d3dy5QZXJmZWN0WE1MLmNvbSB0YXJnZXQ9X2JsYW5rJmd0O1BlcmZlY3RYTUwgVGVhbSZsdDsvYSZndDsuJmx0O2JyJmd0OyZsdDticiZndDtQbGVhc2UgZW1haWwgeW91ciBxdWVzdGlvbnMvY29tbWVudHMvc3VnZ2VzdGlvbnMgdG8gJmx0O2EgaHJlZj1tYWlsdG86ZGFyc2hhbkBQZXJmZWN0WE1MLmNvbSZndDsmbHQ7YiZndDtkYXJzaGFuQFBlcmZlY3RYTUwuY29tJmx0Oy9iJmd0OyZsdDsvYSZndDsuJmx0O2JyJmd0O1dlYiBTZXJ2aWNlIGJ1aWx0IHVzaW5nIEFTUC5ORVQgKCZsdDtiJmd0OzEuMC4zNzA1Jmx0Oy9iJmd0OykgYW5kIFZpc3VhbCBTdHVkaW8gLk5FVCAoJmx0O2ImZ3Q7Ny4wLjk0NjYmbHQ7L2ImZ3Q7KSZsdDticiZndDsmbHQ7YnImZ3Q7VGhlIEMjIGNsaWVudCBhcHBsaWNhdGlvbiB0aGF0IGFjY2Vzc2VzIFNhbGVzUmFua05QcmljZSBXZWIgU2VydmljZSBpcyBhdmFpbGFibGUgKHdpdGggc291cmNlIGNvZGUpdG8gZG93bmxvYWQgYXQgJmx0O0EgaHJlZj1odHRwOi8vd3d3LnBlcmZlY3R4bWwuY29tL0Rvd25sb2Fkcy9TYWxlc1JhbmtOUHJpY2VXaW5DbGllbnQuemlwICZndDtodHRwOi8vd3d3LlBlcmZlY3RYTUwuY29tL0Rvd25sb2Fkcy9TYWxlc1JhbmtOUHJpY2VXaW5DbGllbnQuemlwJmx0Oy9BJmd0Oy4mbHQ7YnImZ3Q7Jmx0O2JyJmd0OyZsdDtBIGhyZWY9aHR0cDovL3d3dy5wZXJmZWN0eG1sLmNvbS9pbWFnZXMvU2FsZXNSYW5rTlByaWNlLmpwZyB0YXJnZXQ9X2JsYW5rJmd0O0NsaWNrIGhlcmUmbHQ7L0EmZ3Q7IHRvIHZpZXcgdGhlIHNjcmVlbnNob3QgaW1hZ2Ugb2YgdGhpcyBjbGllbnQgYXBwbGljYXRpb24uJmx0O2JyJmd0OyZsdDticiZndDtZb3UgY2FuIGNvbmZpZ3VyZSB3aGljaCBib29rcyB0byBtb25pdG9yLCB0aGUgc2V0dGluZ3MgYXJlIHNhdmVkIGluIFhNTCBjb25maWd1cmF0aW9uIGZpbGVzIGxvY2FsbHkuJmx0O2JyJmd0OyZsdDticiZndDtGb3IgJmx0O2ImZ3Q7bW9yZSBpbmZvcm1hdGlvbiBvbiBXZWIgU2VydmljZXMmbHQ7L2ImZ3Q7LCB2aXNpdCAmbHQ7YSBocmVmPWh0dHA6Ly93d3cuUGVyZmVjdFhNTC5jb20vV2ViU3ZjMS5hc3AgdGFyZ2V0PV9ibGFuayZndDtQZXJmZWN0WE1MIFdlYiBTZXJ2aWNlcyBmb2N1cyBzZWN0aW9uJmx0Oy9hJmd0Oy4mbHQ7YnImZ3Q7Jmx0O2JyJmd0O05vdGUgdGhhdCB0aGlzIFdlYiBTZXJ2aWNlIHBvc3RzIGRhdGEgZGlyZWN0bHkgdG8gQW1hem9uIGFuZCBCYXJuZXNBbmROb2JsZSBXZWIgc2l0ZXMuIFRoaXMgV2ViIFNlcnZpY2UgaXMgaW50ZW5kZWQgb25seSBmb3Igbm9uLWNvbW1lcmNpYWwsIHBlcnNvbmFsIHVzZS4mbHQ7YnImZ3Q7Jmx0O2JyJmd0OyZsdDt1Jmd0O0ZldyBzYW1wbGUgSVNCTiBOdW1iZXJzJmx0Oy91Jmd0OzombHQ7YmxvY2txdW90ZSZndDsxODYxMDA1ODlYOiAmbHQ7YiZndDtYTUwgQXBwbGljYXRpb24gRGV2ZWxvcG1lbnQgd2l0aCBNU1hNTCA0LjAmbHQ7L2ImZ3Q7IChXcm94IFByZXNzKSZsdDticiZndDsxODYxMDA1NjI4IDogJmx0O2ImZ3Q7RWFybHkgQWRvcHRlciBWb2ljZVhNTCZsdDsvYiZndDsgKFdyb3ggUHJlc3MpJmx0O2JyJmd0OzA3MzU3MTA1MlggOiAmbHQ7YiZndDtDKysgWE1MJmx0Oy9iJmd0OyAoTmV3IFJpZGVycykmbHQ7YnImZ3Q7MTg2MTAwNTQ2NiA6ICZsdDtiJmd0O1Byb2Zlc3Npb25hbCBTUUwgU2VydmVyIDIwMDAgWE1MJmx0Oy9iJmd0OyAoV3JveCBQcmVzcykmbHQ7YnImZ3Q7MTg2MTAwNTMxOCA6ICZsdDtiJmd0O1Byb2Zlc3Npb25hbCBYTUwgZm9yIC5ORVQgRGV2ZWxvcGVycyZsdDsvYiZndDsgKFdyb3ggUHJlc3MpJmx0O2JyJmd0OzE4OTMxMTU5NzYgOiAmbHQ7YiZndDtNb3ZpbmcgdG8gVkIuTkVUOiBTdHJhdGVnaWVzLCBDb25jZXB0cywgYW5kIENvZGUgKEJldGEgMikmbHQ7L2ImZ3Q7IChBUHJlc3MpJmx0Oy9ibG9ja3F1b3RlJmd0OzwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPHBvcnQgbmFtZT0iU2FsZXNSYW5rTlByaWNlU29hcCIgYmluZGluZz0iczA6U2FsZXNSYW5rTlByaWNlU29hcCI+Ci0gICAgICAgICAgICA8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vd3d3LnBlcmZlY3R4bWwubmV0L1dlYlNlcnZpY2VzL1NhbGVzUmFua05QcmljZS9Cb29rU2VydmljZS5hc214Ii8+Ci0gICAgICAgIDwvcG9ydD4KLSAgICAgICAgPHBvcnQgbmFtZT0iU2FsZXNSYW5rTlByaWNlSHR0cEdldCIgYmluZGluZz0iczA6U2FsZXNSYW5rTlByaWNlSHR0cEdldCI+Ci0gICAgICAgICAgICA8aHR0cDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vd3d3LnBlcmZlY3R4bWwubmV0L1dlYlNlcnZpY2VzL1NhbGVzUmFua05QcmljZS9Cb29rU2VydmljZS5hc214Ii8+Ci0gICAgICAgIDwvcG9ydD4KLSAgICAgICAgPHBvcnQgbmFtZT0iU2FsZXNSYW5rTlByaWNlSHR0cFBvc3QiIGJpbmRpbmc9InMwOlNhbGVzUmFua05QcmljZUh0dHBQb3N0Ij4KLSAgICAgICAgICAgIDxodHRwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly93d3cucGVyZmVjdHhtbC5uZXQvV2ViU2VydmljZXMvU2FsZXNSYW5rTlByaWNlL0Jvb2tTZXJ2aWNlLmFzbXgiLz4KLSAgICAgICAgPC9wb3J0PgotICAgIDwvc2VydmljZT4KLTwvZGVmaW5pdGlvbnM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMveG1sYmVhbnMvdGVzdC1yZXNvdXJjZXMvY29tcGxleC1kb2MtbGl0ZXJhbC53c2RsIGIvdjEuNS4xUkMzL21vZHVsZXMveG1sYmVhbnMvdGVzdC1yZXNvdXJjZXMvY29tcGxleC1kb2MtbGl0ZXJhbC53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1OTU2YTlhLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3htbGJlYW5zL3Rlc3QtcmVzb3VyY2VzL2NvbXBsZXgtZG9jLWxpdGVyYWwud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDM0OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxkZWZpbml0aW9ucwotCXhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIKLQl4bWxuczp0bnM9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvd3NkbCIKLQl4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIgotCXhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0JeG1sbnM6bnMyPSJodHRwOi8vc29hcGludGVyb3Aub3JnL3R5cGVzIgotCXhtbG5zOm5zMz0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy90eXBlcy9wYXJ0IgotCXhtbG5zOm5zND0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy90eXBlcy9yZXF1ZXN0cmVzcG9uc2UiCi0JdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnL3dzZGwiPgotCi0JPHR5cGVzPgotCQk8c2NoZW1hCi0JCQl4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0JCQl4bWxuczp0bnM9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvdHlwZXMiCi0JCQl0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvdHlwZXMiPgotCi0JCQk8aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLQotCQkJPGNvbXBsZXhUeXBlIG5hbWU9IlNPQVBTdHJ1Y3QiPgotCQkJCTxzZXF1ZW5jZT4KLQkJCQkJPGVsZW1lbnQgbmFtZT0idmFyU3RyaW5nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTxlbGVtZW50IG5hbWU9InZhckludCIgdHlwZT0ieHNkOmludCIvPgotCQkJCQk8ZWxlbWVudCBuYW1lPSJ2YXJGbG9hdCIgdHlwZT0ieHNkOmZsb2F0Ii8+Ci0JCQkJPC9zZXF1ZW5jZT4KLQkJCTwvY29tcGxleFR5cGU+Ci0KLQkJCTxjb21wbGV4VHlwZSBuYW1lPSJTT0FQU3RydWN0RmF1bHQiPgotCQkJCTxzZXF1ZW5jZT4KLQkJCQkJPGVsZW1lbnQgbmFtZT0ic29hcFN0cnVjdCIgdHlwZT0idG5zOlNPQVBTdHJ1Y3QiLz4KLQkJCQk8L3NlcXVlbmNlPgotCQkJPC9jb21wbGV4VHlwZT4KLQotCQkJPGNvbXBsZXhUeXBlIG5hbWU9IkJhc2VTdHJ1Y3QiPgotCQkJCTxzZXF1ZW5jZT4KLQkJCQkJPGVsZW1lbnQgbmFtZT0ic3RydWN0TWVzc2FnZSIgdHlwZT0idG5zOlNPQVBTdHJ1Y3QiLz4KLQkJCQkJPGVsZW1lbnQgbmFtZT0ic2hvcnRNZXNzYWdlIiB0eXBlPSJ4c2Q6c2hvcnQiLz4KLQkJCQk8L3NlcXVlbmNlPgotCQkJPC9jb21wbGV4VHlwZT4KLQotCQkJPGNvbXBsZXhUeXBlIG5hbWU9IkV4dGVuZGVkU3RydWN0Ij4KLQkJCQk8Y29tcGxleENvbnRlbnQ+Ci0JCQkJCTxleHRlbnNpb24gYmFzZT0idG5zOkJhc2VTdHJ1Y3QiPgotCQkJCQkJPHNlcXVlbmNlPgotCQkJCQkJCTxlbGVtZW50IG5hbWU9InN0cmluZ01lc3NhZ2UiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCQk8ZWxlbWVudCBuYW1lPSJpbnRNZXNzYWdlIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0JCQkJCQkJPGVsZW1lbnQgbmFtZT0iYW5vdGhlckludE1lc3NhZ2UiIHR5cGU9InhzZDppbnQiLz4KLQkJCQkJCTwvc2VxdWVuY2U+Ci0JCQkJCTwvZXh0ZW5zaW9uPgotCQkJCTwvY29tcGxleENvbnRlbnQ+Ci0JCQk8L2NvbXBsZXhUeXBlPgotCi0JCQk8Y29tcGxleFR5cGUgbmFtZT0iTW9yZUV4dGVuZGVkU3RydWN0Ij4KLQkJCQk8Y29tcGxleENvbnRlbnQ+Ci0JCQkJCTxleHRlbnNpb24gYmFzZT0idG5zOkV4dGVuZGVkU3RydWN0Ij4KLQkJCQkJCTxzZXF1ZW5jZT4KLQkJCQkJCQk8ZWxlbWVudCBuYW1lPSJib29sZWFuTWVzc2FnZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLQkJCQkJCTwvc2VxdWVuY2U+Ci0JCQkJCTwvZXh0ZW5zaW9uPgotCQkJCTwvY29tcGxleENvbnRlbnQ+Ci0JCQk8L2NvbXBsZXhUeXBlPgotCi0JCTwvc2NoZW1hPgotCi0JCTxzY2hlbWEKLQkJCXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLQkJCXhtbG5zOnRucz0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy90eXBlcy9wYXJ0IgotCQkJdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnL3R5cGVzL3BhcnQiPgotCi0JCQk8ZWxlbWVudCBuYW1lPSJTT0FQU3RydWN0RmF1bHRQYXJ0IiB0eXBlPSJuczI6U09BUFN0cnVjdEZhdWx0Ii8+Ci0JCQk8ZWxlbWVudCBuYW1lPSJCYXNlU3RydWN0UGFydCIgdHlwZT0ibnMyOkJhc2VTdHJ1Y3QiLz4KLQkJCTxlbGVtZW50IG5hbWU9IkV4dGVuZGVkU3RydWN0UGFydCIgdHlwZT0ibnMyOkV4dGVuZGVkU3RydWN0Ii8+Ci0JCQk8ZWxlbWVudCBuYW1lPSJNb3JlRXh0ZW5kZWRTdHJ1Y3RQYXJ0IiB0eXBlPSJuczI6TW9yZUV4dGVuZGVkU3RydWN0Ii8+Ci0KLQkJPC9zY2hlbWE+Ci0KLQkJPHNjaGVtYQotCQkJeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotCQkJeG1sbnM6dG5zPSJodHRwOi8vc29hcGludGVyb3Aub3JnL3R5cGVzL3JlcXVlc3RyZXNwb25zZSIKLQkJCXRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy90eXBlcy9yZXF1ZXN0cmVzcG9uc2UiPgotCi0JCQk8ZWxlbWVudCBuYW1lPSJlY2hvU09BUFN0cnVjdEZhdWx0UmVxdWVzdCIgdHlwZT0ibnMyOlNPQVBTdHJ1Y3QiLz4KLQkJCTxlbGVtZW50IG5hbWU9ImVjaG9TT0FQU3RydWN0RmF1bHRSZXNwb25zZSI+Ci0JCQkJPGNvbXBsZXhUeXBlLz4KLQkJCTwvZWxlbWVudD4KLQotCQkJPGVsZW1lbnQgbmFtZT0iZWNob0Jhc2VTdHJ1Y3RGYXVsdFJlcXVlc3QiIHR5cGU9Im5zMjpCYXNlU3RydWN0Ii8+Ci0JCQk8ZWxlbWVudCBuYW1lPSJlY2hvQmFzZVN0cnVjdEZhdWx0UmVzcG9uc2UiPgotCQkJCTxjb21wbGV4VHlwZS8+Ci0JCQk8L2VsZW1lbnQ+Ci0KLQkJCTxlbGVtZW50IG5hbWU9ImVjaG9FeHRlbmRlZFN0cnVjdEZhdWx0UmVxdWVzdCIgdHlwZT0ibnMyOkV4dGVuZGVkU3RydWN0Ii8+Ci0JCQk8ZWxlbWVudCBuYW1lPSJlY2hvRXh0ZW5kZWRTdHJ1Y3RGYXVsdFJlc3BvbnNlIj4KLQkJCQk8Y29tcGxleFR5cGUvPgotCQkJPC9lbGVtZW50PgotCi0JCQk8ZWxlbWVudCBuYW1lPSJlY2hvTXVsdGlwbGVGYXVsdHMxUmVxdWVzdCI+Ci0JCQkJPGNvbXBsZXhUeXBlPgotCQkJCQk8c2VxdWVuY2U+Ci0JCQkJCQk8ZWxlbWVudCBuYW1lPSJ3aGljaEZhdWx0IiB0eXBlPSJ4c2Q6aW50Ii8+Ci0JCQkJCQk8ZWxlbWVudCBuYW1lPSJwYXJhbTEiIHR5cGU9Im5zMjpTT0FQU3RydWN0Ii8+Ci0JCQkJCQk8ZWxlbWVudCBuYW1lPSJwYXJhbTIiIHR5cGU9Im5zMjpCYXNlU3RydWN0Ii8+Ci0JCQkJCTwvc2VxdWVuY2U+Ci0JCQkJPC9jb21wbGV4VHlwZT4KLQkJCTwvZWxlbWVudD4KLQkJCTxlbGVtZW50IG5hbWU9ImVjaG9NdWx0aXBsZUZhdWx0czFSZXNwb25zZSI+Ci0JCQkJPGNvbXBsZXhUeXBlLz4KLQkJCTwvZWxlbWVudD4KLQotCQkJPGVsZW1lbnQgbmFtZT0iZWNob011bHRpcGxlRmF1bHRzMlJlcXVlc3QiPgotCQkJCTxjb21wbGV4VHlwZT4KLQkJCQkJPHNlcXVlbmNlPgotCQkJCQkJPGVsZW1lbnQgbmFtZT0id2hpY2hGYXVsdCIgdHlwZT0ieHNkOmludCIvPgotCQkJCQkJPGVsZW1lbnQgbmFtZT0icGFyYW0xIiB0eXBlPSJuczI6QmFzZVN0cnVjdCIvPgotCQkJCQkJPGVsZW1lbnQgbmFtZT0icGFyYW0yIiB0eXBlPSJuczI6RXh0ZW5kZWRTdHJ1Y3QiLz4KLQkJCQkJCTxlbGVtZW50IG5hbWU9InBhcmFtMyIgdHlwZT0ibnMyOk1vcmVFeHRlbmRlZFN0cnVjdCIvPgotCQkJCQk8L3NlcXVlbmNlPgotCQkJCTwvY29tcGxleFR5cGU+Ci0JCQk8L2VsZW1lbnQ+Ci0JCQk8ZWxlbWVudCBuYW1lPSJlY2hvTXVsdGlwbGVGYXVsdHMyUmVzcG9uc2UiPgotCQkJCTxjb21wbGV4VHlwZS8+Ci0JCQk8L2VsZW1lbnQ+Ci0KLQkJPC9zY2hlbWE+Ci0JPC90eXBlcz4KLQotCTxtZXNzYWdlIG5hbWU9ImVjaG9TT0FQU3RydWN0RmF1bHRSZXF1ZXN0Ij4KLQkJPHBhcnQgbmFtZT0icGFyYW0iIGVsZW1lbnQ9Im5zNDplY2hvU09BUFN0cnVjdEZhdWx0UmVxdWVzdCIvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJlY2hvU09BUFN0cnVjdEZhdWx0UmVzcG9uc2UiPgotCQk8cGFydCBuYW1lPSJwYXJhbSIgZWxlbWVudD0ibnM0OmVjaG9TT0FQU3RydWN0RmF1bHRSZXNwb25zZSIvPgotCTwvbWVzc2FnZT4KLQotCTxtZXNzYWdlIG5hbWU9ImVjaG9CYXNlU3RydWN0RmF1bHRSZXF1ZXN0Ij4KLQkJPHBhcnQgbmFtZT0icGFyYW0iIGVsZW1lbnQ9Im5zNDplY2hvQmFzZVN0cnVjdEZhdWx0UmVxdWVzdCIvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJlY2hvQmFzZVN0cnVjdEZhdWx0UmVzcG9uc2UiPgotCQk8cGFydCBuYW1lPSJwYXJhbSIgZWxlbWVudD0ibnM0OmVjaG9CYXNlU3RydWN0RmF1bHRSZXNwb25zZSIvPgotCTwvbWVzc2FnZT4KLQotCTxtZXNzYWdlIG5hbWU9ImVjaG9FeHRlbmRlZFN0cnVjdEZhdWx0UmVxdWVzdCI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtIiBlbGVtZW50PSJuczQ6ZWNob0V4dGVuZGVkU3RydWN0RmF1bHRSZXF1ZXN0Ii8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9ImVjaG9FeHRlbmRlZFN0cnVjdEZhdWx0UmVzcG9uc2UiPgotCQk8cGFydCBuYW1lPSJwYXJhbSIgZWxlbWVudD0ibnM0OmVjaG9FeHRlbmRlZFN0cnVjdEZhdWx0UmVzcG9uc2UiLz4KLQk8L21lc3NhZ2U+Ci0KLQk8bWVzc2FnZSBuYW1lPSJlY2hvTXVsdGlwbGVGYXVsdHMxUmVxdWVzdCI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtIiBlbGVtZW50PSJuczQ6ZWNob011bHRpcGxlRmF1bHRzMVJlcXVlc3QiLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0iZWNob011bHRpcGxlRmF1bHRzMVJlc3BvbnNlIj4KLQkJPHBhcnQgbmFtZT0icGFyYW0iIGVsZW1lbnQ9Im5zNDplY2hvTXVsdGlwbGVGYXVsdHMxUmVzcG9uc2UiLz4KLQk8L21lc3NhZ2U+Ci0KLQk8bWVzc2FnZSBuYW1lPSJlY2hvTXVsdGlwbGVGYXVsdHMyUmVxdWVzdCI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtIiBlbGVtZW50PSJuczQ6ZWNob011bHRpcGxlRmF1bHRzMlJlcXVlc3QiLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0iZWNob011bHRpcGxlRmF1bHRzMlJlc3BvbnNlIj4KLQkJPHBhcnQgbmFtZT0icGFyYW0iIGVsZW1lbnQ9Im5zNDplY2hvTXVsdGlwbGVGYXVsdHMyUmVzcG9uc2UiLz4KLQk8L21lc3NhZ2U+Ci0KLQk8IS0tIEZhdWx0IG1lc3NhZ2VzIC0tPgotCTxtZXNzYWdlIG5hbWU9IlNPQVBTdHJ1Y3RGYXVsdCI+Ci0JCTxwYXJ0IG5hbWU9InBhcnQzIiBlbGVtZW50PSJuczM6U09BUFN0cnVjdEZhdWx0UGFydCIvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJCYXNlU3RydWN0RmF1bHQiPgotCQk8cGFydCBuYW1lPSJwYXJ0MSIgZWxlbWVudD0ibnMzOkJhc2VTdHJ1Y3RQYXJ0Ii8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9IkV4dGVuZGVkU3RydWN0RmF1bHQiPgotCQk8cGFydCBuYW1lPSJwYXJ0MiIgZWxlbWVudD0ibnMzOkV4dGVuZGVkU3RydWN0UGFydCIvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJNb3JlRXh0ZW5kZWRTdHJ1Y3RGYXVsdCI+Ci0JCTxwYXJ0IG5hbWU9InBhcnQ1IiBlbGVtZW50PSJuczM6TW9yZUV4dGVuZGVkU3RydWN0UGFydCIvPgotCTwvbWVzc2FnZT4KLQotCTxwb3J0VHlwZSBuYW1lPSJDb21wbGV4RG9jTGl0UG9ydFR5cGUiPgotCQk8IS0tCi0JCQlUaHJvd3MgYSBmYXVsdCB3aXRoIGFuIGVtYmVkZGVkIFNPQVBTdHJ1Y3QKLQkJLS0+Ci0JCTxvcGVyYXRpb24gbmFtZT0iZWNob1NPQVBTdHJ1Y3RGYXVsdCIgcGFyYW1ldGVyT3JkZXI9IiI+Ci0JCQk8aW5wdXQgbWVzc2FnZT0idG5zOmVjaG9TT0FQU3RydWN0RmF1bHRSZXF1ZXN0Ii8+Ci0JCQk8b3V0cHV0IG1lc3NhZ2U9InRuczplY2hvU09BUFN0cnVjdEZhdWx0UmVzcG9uc2UiLz4KLQkJCTxmYXVsdCBuYW1lPSJDb21wbGV4RmF1bHQiIG1lc3NhZ2U9InRuczpTT0FQU3RydWN0RmF1bHQiLz4KLQkJPC9vcGVyYXRpb24+Ci0KLQkJPCEtLQotCQkJVGhyb3dzIGEgZmF1bHQgd2l0aCBhIGJhc2UgY29tcGxleCBzdHJ1Y3QKLQkJLS0+Ci0JCTxvcGVyYXRpb24gbmFtZT0iZWNob0Jhc2VTdHJ1Y3RGYXVsdCIgcGFyYW1ldGVyT3JkZXI9IiI+Ci0JCQk8aW5wdXQgbWVzc2FnZT0idG5zOmVjaG9CYXNlU3RydWN0RmF1bHRSZXF1ZXN0Ii8+Ci0JCQk8b3V0cHV0IG1lc3NhZ2U9InRuczplY2hvQmFzZVN0cnVjdEZhdWx0UmVzcG9uc2UiLz4KLQkJCTxmYXVsdCBuYW1lPSJDb21wbGV4RmF1bHQiIG1lc3NhZ2U9InRuczpCYXNlU3RydWN0RmF1bHQiLz4KLQkJPC9vcGVyYXRpb24+Ci0KLQkJPCEtLQotCQkJVGhyb3dzIGEgZmF1bHQgd2l0aCBhbiBlbiBleHRlbmRlZCBjb21wbGV4IHR5cGUKLQkJLS0+Ci0JCTxvcGVyYXRpb24gbmFtZT0iZWNob0V4dGVuZGVkU3RydWN0RmF1bHQiIHBhcmFtZXRlck9yZGVyPSIiPgotCQkJPGlucHV0IG1lc3NhZ2U9InRuczplY2hvRXh0ZW5kZWRTdHJ1Y3RGYXVsdFJlcXVlc3QiLz4KLQkJCTxvdXRwdXQgbWVzc2FnZT0idG5zOmVjaG9FeHRlbmRlZFN0cnVjdEZhdWx0UmVzcG9uc2UiLz4KLQkJCTxmYXVsdCBuYW1lPSJDb21wbGV4RmF1bHQiIG1lc3NhZ2U9InRuczpFeHRlbmRlZFN0cnVjdEZhdWx0Ii8+Ci0JCTwvb3BlcmF0aW9uPgotCi0JCTwhLS0KLQkJCVRocm93cyBhIGZhdWx0IHdpdGggZW1iZWRkZWQgY29tcGxleCB0eXBlLCBmYXVsdCB3aXRoIGFuCi0JCQlleHRlbmRlZCBjb21wbGV4IHR5cGUgYW5kIGZhdWx0IHdpdGggYW4gYXJyYXkgb2YgYSBiYXNlCi0JCQljb21wbGV4IHR5cGUKLQkJLS0+Ci0JCTxvcGVyYXRpb24gbmFtZT0iZWNob011bHRpcGxlRmF1bHRzMSIgcGFyYW1ldGVyT3JkZXI9InBhcmFtIj4KLQkJCTxpbnB1dCBtZXNzYWdlPSJ0bnM6ZWNob011bHRpcGxlRmF1bHRzMVJlcXVlc3QiLz4KLQkJCTxvdXRwdXQgbWVzc2FnZT0idG5zOmVjaG9NdWx0aXBsZUZhdWx0czFSZXNwb25zZSIvPgotCQkJPGZhdWx0IG5hbWU9IkNvbXBsZXhGYXVsdDEiIG1lc3NhZ2U9InRuczpTT0FQU3RydWN0RmF1bHQiLz4KLQkJCTxmYXVsdCBuYW1lPSJDb21wbGV4RmF1bHQyIiBtZXNzYWdlPSJ0bnM6QmFzZVN0cnVjdEZhdWx0Ii8+Ci0JCTwvb3BlcmF0aW9uPgotCi0JCTwhLS0KLQkJCVRocm93cyBhIGZhdWx0IHdpdGggYW4gYXJyYXkgb2YgYmFzZSBjb21wbGV4IHR5cGUgYW5kCi0JCQlhIGZhdWx0IHdpdGggZG91Ymx5IGV4dGVuZGVkIGNvbXBsZXggdHlwZQotCQktLT4KLQkJPG9wZXJhdGlvbiBuYW1lPSJlY2hvTXVsdGlwbGVGYXVsdHMyIiBwYXJhbWV0ZXJPcmRlcj0icGFyYW0iPgotCQkJPGlucHV0IG1lc3NhZ2U9InRuczplY2hvTXVsdGlwbGVGYXVsdHMyUmVxdWVzdCIvPgotCQkJPG91dHB1dCBtZXNzYWdlPSJ0bnM6ZWNob011bHRpcGxlRmF1bHRzMlJlc3BvbnNlIi8+Ci0JCQk8ZmF1bHQgbmFtZT0iQ29tcGxleEZhdWx0MSIgbWVzc2FnZT0idG5zOkJhc2VTdHJ1Y3RGYXVsdCIvPgotCQkJPGZhdWx0IG5hbWU9IkNvbXBsZXhGYXVsdDIiIG1lc3NhZ2U9InRuczpFeHRlbmRlZFN0cnVjdEZhdWx0Ii8+Ci0JCQk8ZmF1bHQgbmFtZT0iQ29tcGxleEZhdWx0MyIgbWVzc2FnZT0idG5zOk1vcmVFeHRlbmRlZFN0cnVjdEZhdWx0Ii8+Ci0JCTwvb3BlcmF0aW9uPgotCTwvcG9ydFR5cGU+Ci0KLQk8YmluZGluZyBuYW1lPSJDb21wbGV4RG9jTGl0QmluZGluZyIgdHlwZT0idG5zOkNvbXBsZXhEb2NMaXRQb3J0VHlwZSI+Ci0JCTxzb2FwOmJpbmRpbmcgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiIHN0eWxlPSJkb2N1bWVudCIvPgotCQk8b3BlcmF0aW9uIG5hbWU9ImVjaG9TT0FQU3RydWN0RmF1bHQiPgotCQkJPGlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0JCQk8L2lucHV0PgotCQkJPG91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotCQkJPC9vdXRwdXQ+Ci0JCQk8ZmF1bHQgbmFtZT0iQ29tcGxleEZhdWx0Ij4KLQkJCQk8c29hcDpmYXVsdAotCQkJCQluYW1lPSJDb21wbGV4RmF1bHQiCi0JCQkJCXVzZT0ibGl0ZXJhbCIvPgotCQkJPC9mYXVsdD4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4KLQkJPC9vcGVyYXRpb24+Ci0KLQkJPG9wZXJhdGlvbiBuYW1lPSJlY2hvQmFzZVN0cnVjdEZhdWx0Ij4KLQkJCTxpbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotCQkJPC9pbnB1dD4KLQkJCTxvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLQkJCTwvb3V0cHV0PgotCQkJPGZhdWx0IG5hbWU9IkNvbXBsZXhGYXVsdCI+Ci0JCQkJPHNvYXA6ZmF1bHQKLQkJCQkJbmFtZT0iQ29tcGxleEZhdWx0IgotCQkJCQl1c2U9ImxpdGVyYWwiLz4KLQkJCTwvZmF1bHQ+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+Ci0JCTwvb3BlcmF0aW9uPgotCi0JCTxvcGVyYXRpb24gbmFtZT0iZWNob0V4dGVuZGVkU3RydWN0RmF1bHQiPgotCQkJPGlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0JCQk8L2lucHV0PgotCQkJPG91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotCQkJPC9vdXRwdXQ+Ci0JCQk8ZmF1bHQgbmFtZT0iQ29tcGxleEZhdWx0Ij4KLQkJCQk8c29hcDpmYXVsdAotCQkJCQluYW1lPSJDb21wbGV4RmF1bHQiCi0JCQkJCXVzZT0ibGl0ZXJhbCIvPgotCQkJPC9mYXVsdD4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4KLQkJPC9vcGVyYXRpb24+Ci0KLQkJPG9wZXJhdGlvbiBuYW1lPSJlY2hvTXVsdGlwbGVGYXVsdHMxIj4KLQkJCTxpbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotCQkJPC9pbnB1dD4KLQkJCTxvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLQkJCTwvb3V0cHV0PgotCQkJPGZhdWx0IG5hbWU9IkNvbXBsZXhGYXVsdDEiPgotCQkJCTxzb2FwOmZhdWx0IAotCQkJCQluYW1lPSJDb21wbGV4RmF1bHQxIgotCQkJCQl1c2U9ImxpdGVyYWwiLz4KLQkJCTwvZmF1bHQ+Ci0JCQk8ZmF1bHQgbmFtZT0iQ29tcGxleEZhdWx0MiI+Ci0JCQkJPHNvYXA6ZmF1bHQKLQkJCQkJbmFtZT0iQ29tcGxleEZhdWx0MiIKLQkJCQkJdXNlPSJsaXRlcmFsIi8+Ci0JCQk8L2ZhdWx0PgotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPgotCQk8L29wZXJhdGlvbj4KLQotCQk8b3BlcmF0aW9uIG5hbWU9ImVjaG9NdWx0aXBsZUZhdWx0czIiPgotCQkJPGlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0JCQk8L2lucHV0PgotCQkJPG91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotCQkJPC9vdXRwdXQ+Ci0JCQk8ZmF1bHQgbmFtZT0iQ29tcGxleEZhdWx0MSI+Ci0JCQkJPHNvYXA6ZmF1bHQKLQkJCQkJbmFtZT0iQ29tcGxleEZhdWx0MSIKLQkJCQkJdXNlPSJsaXRlcmFsIi8+Ci0JCQk8L2ZhdWx0PgotCQkJPGZhdWx0IG5hbWU9IkNvbXBsZXhGYXVsdDIiPgotCQkJCTxzb2FwOmZhdWx0IAotCQkJCQluYW1lPSJDb21wbGV4RmF1bHQyIgotCQkJCQl1c2U9ImxpdGVyYWwiLz4KLQkJCTwvZmF1bHQ+Ci0JCQk8ZmF1bHQgbmFtZT0iQ29tcGxleEZhdWx0MyI+Ci0JCQkJPHNvYXA6ZmF1bHQgCi0JCQkJCW5hbWU9IkNvbXBsZXhGYXVsdDMiCi0JCQkJCXVzZT0ibGl0ZXJhbCIvPgotCQkJPC9mYXVsdD4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4KLQkJPC9vcGVyYXRpb24+Ci0JPC9iaW5kaW5nPgotCi0JPHNlcnZpY2UgbmFtZT0iQ29tcGxleERvY0xpdFNlcnZpY2UiPgotCQk8cG9ydCBuYW1lPSJDb21wbGV4RG9jTGl0UG9ydCIgYmluZGluZz0idG5zOkNvbXBsZXhEb2NMaXRCaW5kaW5nIj4KLQkJCTxzb2FwOmFkZHJlc3MKLQkJCQlsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo4MDgwL2F4aXMvc2VydmljZXMvQ29tcGxleERvY0xpdFBvcnQiLz4KLQkJPC9wb3J0PgotCTwvc2VydmljZT4KLTwvZGVmaW5pdGlvbnM+Ci0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3htbGJlYW5zL3Rlc3QtcmVzb3VyY2VzL2NvbXBvdW5kMS53c2RsIGIvdjEuNS4xUkMzL21vZHVsZXMveG1sYmVhbnMvdGVzdC1yZXNvdXJjZXMvY29tcG91bmQxLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmOGM2ODYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMveG1sYmVhbnMvdGVzdC1yZXNvdXJjZXMvY29tcG91bmQxLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxkZWZpbml0aW9ucyB4bWxucz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOndzZGxucz0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8iIHhtbG5zOnR5cGVucz0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2QiIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9IlNvYXBJbnRlcm9wQ29tcG91bmQiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8iPgotICAgIDx0eXBlcz4KLSAgICAgICAgPHNjaGVtYSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2QiIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIj4KLSAgICAgICAgICAgIDxjb21wbGV4VHlwZSBuYW1lPSJQZXJzb24iPgotICAgICAgICAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIG5hbWU9IkFnZSIgdHlwZT0iZG91YmxlIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiBuYW1lPSJJRCIgdHlwZT0ieHNkOmZsb2F0Ii8+Ci0gICAgICAgICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9Ik5hbWUiIHR5cGU9InN0cmluZyIvPgotICAgICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iTWFsZSIgdHlwZT0iYm9vbGVhbiIvPgotICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InhfUGVyc29uIiB0eXBlPSJ0eXBlbnM6UGVyc29uIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJyZXN1bHRfUGVyc29uIiB0eXBlPSJ0eXBlbnM6UGVyc29uIi8+Ci0KLSAgICAgICAgICAgIDxjb21wbGV4VHlwZSBuYW1lPSJEb2N1bWVudCI+Ci0gICAgICAgICAgICAgICAgPHNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDxleHRlbnNpb24gYmFzZT0ic3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IklEIiB0eXBlPSJzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgPC9leHRlbnNpb24+Ci0gICAgICAgICAgICAgICAgPC9zaW1wbGVDb250ZW50PgotICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InhfRG9jdW1lbnQiIHR5cGU9InR5cGVuczpEb2N1bWVudCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0icmVzdWx0X0RvY3VtZW50IiB0eXBlPSJ0eXBlbnM6RG9jdW1lbnQiLz4KLSAgICAgICAgPC9zY2hlbWE+Ci0gICAgPC90eXBlcz4KLSAgICA8bWVzc2FnZSBuYW1lPSJlY2hvUGVyc29uIj4KLSAgICAgICAgPHBhcnQgbmFtZT0ieCIgZWxlbWVudD0idHlwZW5zOnhfUGVyc29uIi8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9ImVjaG9QZXJzb25SZXNwb25zZSI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9IlJlc3VsdCIgZWxlbWVudD0idHlwZW5zOnJlc3VsdF9QZXJzb24iLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iZWNob0RvY3VtZW50Ij4KLSAgICAgICAgPHBhcnQgbmFtZT0ieCIgZWxlbWVudD0idHlwZW5zOnhfRG9jdW1lbnQiLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iZWNob0RvY3VtZW50UmVzcG9uc2UiPgotICAgICAgICA8cGFydCBuYW1lPSJSZXN1bHQiIGVsZW1lbnQ9InR5cGVuczpyZXN1bHRfRG9jdW1lbnQiLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPHBvcnRUeXBlIG5hbWU9IlNvYXBJbnRlcm9wQ29tcG91bmQxUG9ydFR5cGUiPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9QZXJzb24iIHBhcmFtZXRlck9yZGVyPSJ4Ij4KLSAgICAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJ3c2RsbnM6ZWNob1BlcnNvbiIvPgotICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJ3c2RsbnM6ZWNob1BlcnNvblJlc3BvbnNlIi8+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9Eb2N1bWVudCIgcGFyYW1ldGVyT3JkZXI9IngiPgotICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9IndzZGxuczplY2hvRG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0id3NkbG5zOmVjaG9Eb2N1bWVudFJlc3BvbnNlIi8+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotICAgIDwvcG9ydFR5cGU+Ci0gICAgPGJpbmRpbmcgbmFtZT0iU29hcEludGVyb3BDb21wb3VuZDFCaW5kaW5nIiB0eXBlPSJ3c2RsbnM6U29hcEludGVyb3BDb21wb3VuZDFQb3J0VHlwZSI+Ci0gICAgICAgIDxzb2FwOmJpbmRpbmcgc3R5bGU9ImRvY3VtZW50IiB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIvPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9QZXJzb24iPgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly9zb2FwaW50ZXJvcC9lY2hvUGVyc29uIi8+Ci0gICAgICAgICAgICA8aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvaW5wdXQ+Ci0gICAgICAgICAgICA8b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob0RvY3VtZW50Ij4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vc29hcGludGVyb3AvZWNob0RvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvaW5wdXQ+Ci0gICAgICAgICAgICA8b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0KLSAgICA8L2JpbmRpbmc+Ci0gICAgPHNlcnZpY2UgbmFtZT0iQ29tcG91bmQxIj4KLSAgICAgICAgPHBvcnQgbmFtZT0iU29hcEludGVyb3BDb21wb3VuZDFQb3J0IiBiaW5kaW5nPSJ3c2RsbnM6U29hcEludGVyb3BDb21wb3VuZDFCaW5kaW5nIj4KLSAgICAgICAgICAgIDxzb2FwOmFkZHJlc3MgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIGxvY2F0aW9uPSJodHRwOi8vc29hcGludGVyb3AuamF2YS5zdW4uY29tOjgwL3JvdW5kMy9ncm91cGQvY29tcG91bmQxIi8+Ci0gICAgICAgIDwvcG9ydD4KLSAgICA8L3NlcnZpY2U+Ci08L2RlZmluaXRpb25zPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3htbGJlYW5zL3Rlc3QtcmVzb3VyY2VzL2NvbXBvdW5kMi53c2RsIGIvdjEuNS4xUkMzL21vZHVsZXMveG1sYmVhbnMvdGVzdC1yZXNvdXJjZXMvY29tcG91bmQyLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjYmYyMjMuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMveG1sYmVhbnMvdGVzdC1yZXNvdXJjZXMvY29tcG91bmQyLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxkZWZpbml0aW9ucyB4bWxucz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOndzZGxucz0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8iIHhtbG5zOmVtcD0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy9lbXBsb3llZSIgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iU29hcEludGVyb3BDb21wb3VuZCIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnLyI+Ci0gICAgPHR5cGVzPgotICAgICAgICA8c2NoZW1hIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnL3BlcnNvbiIgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPgotCi0gICAgICAgICAgICA8Y29tcGxleFR5cGUgbmFtZT0iUGVyc29uIj4KLSAgICAgICAgICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiBuYW1lPSJOYW1lIiB0eXBlPSJzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIG5hbWU9Ik1hbGUiIHR5cGU9ImJvb2xlYW4iLz4KLSAgICAgICAgICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICAgICAgPC9zY2hlbWE+Ci0gICAgICAgIDxzY2hlbWEgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczpwcnM9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvcGVyc29uIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvZW1wbG95ZWUiIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIj4KLSAgICAgICAgICAgIDxpbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnL3BlcnNvbiIvPgotICAgICAgICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9IkVtcGxveWVlIj4KLSAgICAgICAgICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiBuYW1lPSJwZXJzb24iIHR5cGU9InByczpQZXJzb24iLz4KLSAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIG5hbWU9InNhbGFyeSIgdHlwZT0iZG91YmxlIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiBuYW1lPSJJRCIgdHlwZT0iaW50Ii8+Ci0gICAgICAgICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ4X0VtcGxveWVlIiB0eXBlPSJlbXA6RW1wbG95ZWUiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InJlc3VsdF9FbXBsb3llZSIgdHlwZT0iZW1wOkVtcGxveWVlIi8+Ci0gICAgICAgIDwvc2NoZW1hPgotICAgIDwvdHlwZXM+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iZWNob0VtcGxveWVlIj4KLSAgICAgICAgPHBhcnQgbmFtZT0ieCIgZWxlbWVudD0iZW1wOnhfRW1wbG95ZWUiLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iZWNob0VtcGxveWVlUmVzcG9uc2UiPgotICAgICAgICA8cGFydCBuYW1lPSJyZXN1bHQiIGVsZW1lbnQ9ImVtcDpyZXN1bHRfRW1wbG95ZWUiLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPHBvcnRUeXBlIG5hbWU9IlNvYXBJbnRlcm9wQ29tcG91bmQyUG9ydFR5cGUiPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9FbXBsb3llZSIgcGFyYW1ldGVyT3JkZXI9IngiPgotICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9IndzZGxuczplY2hvRW1wbG95ZWUiLz4KLSAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0id3NkbG5zOmVjaG9FbXBsb3llZVJlc3BvbnNlIi8+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotICAgIDwvcG9ydFR5cGU+Ci0gICAgPGJpbmRpbmcgbmFtZT0iU29hcEludGVyb3BDb21wb3VuZDJCaW5kaW5nIiB0eXBlPSJ3c2RsbnM6U29hcEludGVyb3BDb21wb3VuZDJQb3J0VHlwZSI+Ci0gICAgICAgIDxzb2FwOmJpbmRpbmcgc3R5bGU9ImRvY3VtZW50IiB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIvPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9FbXBsb3llZSI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iI2VjaG9FbXBsb3llZSIvPgotICAgICAgICAgICAgPGlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L2lucHV0PgotICAgICAgICAgICAgPG91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC9vdXRwdXQ+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotICAgIDwvYmluZGluZz4KLSAgICA8c2VydmljZSBuYW1lPSJDb21wb3VuZDIiPgotICAgICAgICA8cG9ydCBuYW1lPSJTb2FwSW50ZXJvcENvbXBvdW5kMlBvcnQiIGJpbmRpbmc9IndzZGxuczpTb2FwSW50ZXJvcENvbXBvdW5kMkJpbmRpbmciPgotICAgICAgICAgICAgPHNvYXA6YWRkcmVzcyB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIgbG9jYXRpb249Imh0dHA6Ly9zb2FwaW50ZXJvcC5qYXZhLnN1bi5jb206ODAvcm91bmQzL2dyb3VwZC9jb21wb3VuZDIiLz4KLSAgICAgICAgPC9wb3J0PgotICAgIDwvc2VydmljZT4KLTwvZGVmaW5pdGlvbnM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMveG1sYmVhbnMvdGVzdC1yZXNvdXJjZXMvZGltZS1kb2Mud3NkbCBiL3YxLjUuMVJDMy9tb2R1bGVzL3htbGJlYW5zL3Rlc3QtcmVzb3VyY2VzL2RpbWUtZG9jLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxYmRhYzEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMveG1sYmVhbnMvdGVzdC1yZXNvdXJjZXMvZGltZS1kb2Mud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDI4NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTx3c2RsOmRlZmluaXRpb25zIG5hbWU9IlNPQVBCdWlsZGVycyIKLSAgICAgICAgICAgICAgICAgIHhtbG5zPSJodHRwOi8vc29hcGludGVyb3Aub3JnL2F0dGFjaG1lbnRzL3dzZGwiCi0gICAgICAgICAgICAgICAgICB4bWxuczp0eXBlcz0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy9hdHRhY2htZW50cy94c2QiCi0gICAgICAgICAgICAgICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICAgICAgICAgICAgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIKLSAgICAgICAgICAgICAgICAgIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIgotICAgICAgICAgICAgICAgICAgeG1sbnM6ZGltZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwMi8wNC9kaW1lL3dzZGwvIgotICAgICAgICAgICAgICAgICAgeG1sbnM6Y29udGVudD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwMi8wNC9jb250ZW50LXR5cGUvIgotICAgICAgICAgICAgICAgICAgeG1sbnM6cmVmPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDAyLzA0L3JlZmVyZW5jZS8iCi0gICAgICAgICAgICAgICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvYXR0YWNobWVudHMvd3NkbCI+Ci0gICAgPHdzZGw6dHlwZXM+Ci0gICAgICAgIDxzY2hlbWEgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy9hdHRhY2htZW50cy94c2QiCi0gICAgICAgICAgICAgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPgotICAgICAgICAgICAgPGltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDIvMDQvcmVmZXJlbmNlLyIvPgotICAgICAgICAgICAgPGltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDIvMDQvY29udGVudC10eXBlLyIvPgotICAgICAgICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9IlJlZmVyZW5jZWRCaW5hcnkiPgotICAgICAgICAgICAgICAgIDxzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgICAgICAgICA8cmVzdHJpY3Rpb24gYmFzZT0ieHNkOmJhc2U2NEJpbmFyeSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXBwaW5mbz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbnRlbnQ6bWVkaWFUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9ImFwcGxpY2F0aW9uL29jdGV0c3RyZWFtIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcHBpbmZvPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSByZWY9InJlZjpsb2NhdGlvbiIgdXNlPSJvcHRpb25hbCIvPgotICAgICAgICAgICAgICAgICAgICA8L3Jlc3RyaWN0aW9uPgotICAgICAgICAgICAgICAgIDwvc2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8Y29tcGxleFR5cGUgbmFtZT0iUmVmZXJlbmNlZFRleHQiPgotICAgICAgICAgICAgICAgIDxzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgICAgICAgICA8cmVzdHJpY3Rpb24gYmFzZT0ieHNkOmJhc2U2NEJpbmFyeSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXBwaW5mbz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbnRlbnQ6bWVkaWFUeXBlIHZhbHVlPSJ0ZXh0L3BsYWluIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcHBpbmZvPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSByZWY9InJlZjpsb2NhdGlvbiIgdXNlPSJvcHRpb25hbCIvPgotICAgICAgICAgICAgICAgICAgICA8L3Jlc3RyaWN0aW9uPgotICAgICAgICAgICAgICAgIDwvc2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJFY2hvQXR0YWNobWVudCIgdHlwZT0idHlwZXM6RWNob0F0dGFjaG1lbnQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkVjaG9BdHRhY2htZW50UmVzcG9uc2UiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJ0eXBlczpFY2hvQXR0YWNobWVudFJlc3BvbnNlIi8+Ci0gICAgICAgICAgICA8Y29tcGxleFR5cGUgbmFtZT0iRWNob0F0dGFjaG1lbnQiPgotICAgICAgICAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iSW4iIHR5cGU9InR5cGVzOlJlZmVyZW5jZWRCaW5hcnkiLz4KLSAgICAgICAgICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDxjb21wbGV4VHlwZSBuYW1lPSJFY2hvQXR0YWNobWVudFJlc3BvbnNlIj4KLSAgICAgICAgICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ik91dCIgdHlwZT0idHlwZXM6UmVmZXJlbmNlZEJpbmFyeSIvPgotICAgICAgICAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICAgICA8L2NvbXBsZXhUeXBlPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iRWNob0F0dGFjaG1lbnRzIiB0eXBlPSJ0eXBlczpBdHRhY2htZW50cyIvPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iRWNob0F0dGFjaG1lbnRzUmVzcG9uc2UiIHR5cGU9InR5cGVzOkF0dGFjaG1lbnRzIi8+Ci0gICAgICAgICAgICA8Y29tcGxleFR5cGUgbmFtZT0iQXR0YWNobWVudHMiPgotICAgICAgICAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iSXRlbSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0idHlwZXM6UmVmZXJlbmNlZEJpbmFyeSIvPgotICAgICAgICAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICAgICA8L2NvbXBsZXhUeXBlPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iRWNob0F0dGFjaG1lbnRBc0Jhc2U2NCIgdHlwZT0idHlwZXM6RWNob0F0dGFjaG1lbnQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkVjaG9BdHRhY2htZW50QXNCYXNlNjRSZXNwb25zZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9InR5cGVzOmJhc2U2NE91dCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iRWNob0Jhc2U2NEFzQXR0YWNobWVudCIgdHlwZT0idHlwZXM6YmFzZTY0SW4iLz4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkVjaG9CYXNlNjRBc0F0dGFjaG1lbnRSZXNwb25zZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9InR5cGVzOkVjaG9BdHRhY2htZW50UmVzcG9uc2UiLz4KLSAgICAgICAgICAgIDxjb21wbGV4VHlwZSBuYW1lPSJiYXNlNjRJbiI+Ci0gICAgICAgICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJJbiIgdHlwZT0ieHNkOmJhc2U2NEJpbmFyeSIvPgotICAgICAgICAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICAgICA8L2NvbXBsZXhUeXBlPgotICAgICAgICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9ImJhc2U2NE91dCI+Ci0gICAgICAgICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJPdXQiIHR5cGU9InhzZDpiYXNlNjRCaW5hcnkiLz4KLSAgICAgICAgICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkVjaG9VbnJlZkF0dGFjaG1lbnRzIiB0eXBlPSJ0eXBlczplbXB0eVR5cGUiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkVjaG9VbnJlZkF0dGFjaG1lbnRzUmVzcG9uc2UiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJ0eXBlczplbXB0eVR5cGUiLz4KLSAgICAgICAgICAgIDxjb21wbGV4VHlwZSBuYW1lPSJlbXB0eVR5cGUiPgotICAgICAgICAgICAgICAgIDxzZXF1ZW5jZS8+Ci0gICAgICAgICAgICA8L2NvbXBsZXhUeXBlPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iRWNob0F0dGFjaG1lbnRBc1N0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9InR5cGVzOkVjaG9BdHRhY2htZW50QXNTdHJpbmciLz4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkVjaG9BdHRhY2htZW50QXNTdHJpbmdSZXNwb25zZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9InR5cGVzOkVjaG9BdHRhY2htZW50QXNTdHJpbmdSZXNwb25zZSIvPgotICAgICAgICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9IkVjaG9BdHRhY2htZW50QXNTdHJpbmciPgotICAgICAgICAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iSW4iIHR5cGU9InR5cGVzOlJlZmVyZW5jZWRUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8Y29tcGxleFR5cGUgbmFtZT0iRWNob0F0dGFjaG1lbnRBc1N0cmluZ1Jlc3BvbnNlIj4KLSAgICAgICAgICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ik91dCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICAgICA8L2NvbXBsZXhUeXBlPgotICAgICAgICA8L3NjaGVtYT4KLSAgICA8L3dzZGw6dHlwZXM+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJFY2hvQXR0YWNobWVudEluIj4KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJJbiIgZWxlbWVudD0idHlwZXM6RWNob0F0dGFjaG1lbnQiLz4KLSAgICA8L3dzZGw6bWVzc2FnZT4KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9IkVjaG9BdHRhY2htZW50T3V0Ij4KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJPdXQiIGVsZW1lbnQ9InR5cGVzOkVjaG9BdHRhY2htZW50UmVzcG9uc2UiLz4KLSAgICA8L3dzZGw6bWVzc2FnZT4KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9IkVjaG9BdHRhY2htZW50c0luIj4KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJJbiIgZWxlbWVudD0idHlwZXM6RWNob0F0dGFjaG1lbnRzIi8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJFY2hvQXR0YWNobWVudHNPdXQiPgotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9Ik91dCIgZWxlbWVudD0idHlwZXM6RWNob0F0dGFjaG1lbnRzUmVzcG9uc2UiLz4KLSAgICA8L3dzZGw6bWVzc2FnZT4KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9IkVjaG9BdHRhY2htZW50QXNCYXNlNjRJbiI+Ci0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0iSW4iIGVsZW1lbnQ9InR5cGVzOkVjaG9BdHRhY2htZW50QXNCYXNlNjQiLz4KLSAgICA8L3dzZGw6bWVzc2FnZT4KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9IkVjaG9BdHRhY2htZW50QXNCYXNlNjRPdXQiPgotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9Ik91dCIgZWxlbWVudD0idHlwZXM6RWNob0F0dGFjaG1lbnRBc0Jhc2U2NFJlc3BvbnNlIi8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJFY2hvQmFzZTY0QXNBdHRhY2htZW50SW4iPgotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9IkluIiBlbGVtZW50PSJ0eXBlczpFY2hvQmFzZTY0QXNBdHRhY2htZW50Ii8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJFY2hvQmFzZTY0QXNBdHRhY2htZW50T3V0Ij4KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJPdXQiIGVsZW1lbnQ9InR5cGVzOkVjaG9CYXNlNjRBc0F0dGFjaG1lbnRSZXNwb25zZSIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0iRWNob1VucmVmQXR0YWNobWVudHNJbiI+Ci0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0iSW4iIGVsZW1lbnQ9InR5cGVzOkVjaG9VbnJlZkF0dGFjaG1lbnRzIi8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJFY2hvVW5yZWZBdHRhY2htZW50c091dCI+Ci0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0iT3V0IiBlbGVtZW50PSJ0eXBlczpFY2hvVW5yZWZBdHRhY2htZW50c1Jlc3BvbnNlIi8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJFY2hvQXR0YWNobWVudEFzU3RyaW5nSW4iPgotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9IkluIiBlbGVtZW50PSJ0eXBlczpFY2hvQXR0YWNobWVudEFzU3RyaW5nIi8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJFY2hvQXR0YWNobWVudEFzU3RyaW5nT3V0Ij4KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJPdXQiIGVsZW1lbnQ9InR5cGVzOkVjaG9BdHRhY2htZW50QXNTdHJpbmdSZXNwb25zZSIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOnBvcnRUeXBlIG5hbWU9IkF0dGFjaG1lbnRzUG9ydFR5cGUiPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iRWNob0F0dGFjaG1lbnQiPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQgbmFtZT0iRWNob0F0dGFjaG1lbnRJbnB1dCIgbWVzc2FnZT0iRWNob0F0dGFjaG1lbnRJbiIvPgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0IG5hbWU9IkVjaG9BdHRhY2htZW50T3V0cHV0IgotICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9IkVjaG9BdHRhY2htZW50T3V0Ii8+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJFY2hvQXR0YWNobWVudHMiPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQgbmFtZT0iRWNob0F0dGFjaG1lbnRzSW5wdXQiCi0gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlPSJFY2hvQXR0YWNobWVudHNJbiIvPgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0IG5hbWU9IkVjaG9BdHRhY2htZW50c091dHB1dCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlPSJFY2hvQXR0YWNobWVudHNPdXQiLz4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9IkVjaG9BdHRhY2htZW50QXNCYXNlNjQiPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQgbmFtZT0iRWNob0F0dGFjaG1lbnRBc0Jhc2U2NElucHV0IgotICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZT0iRWNob0F0dGFjaG1lbnRBc0Jhc2U2NEluIi8+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQgbmFtZT0iRWNob0F0dGFjaG1lbnRBc0Jhc2U2NE91dHB1dCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlPSJFY2hvQXR0YWNobWVudEFzQmFzZTY0T3V0Ii8+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJFY2hvQmFzZTY0QXNBdHRhY2htZW50Ij4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0IG5hbWU9IkVjaG9CYXNlNjRBc0F0dGFjaG1lbnRJbnB1dCIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9IkVjaG9CYXNlNjRBc0F0dGFjaG1lbnRJbiIvPgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0IG5hbWU9IkVjaG9CYXNlNjRBc0F0dGFjaG1lbnRPdXRwdXQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZT0iRWNob0Jhc2U2NEFzQXR0YWNobWVudE91dCIvPgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iRWNob1VucmVmQXR0YWNobWVudHMiPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQgbmFtZT0iRWNob1VucmVmQXR0YWNobWVudHNJbnB1dCIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9IkVjaG9VbnJlZkF0dGFjaG1lbnRzSW4iLz4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dCBuYW1lPSJFY2hvVW5yZWZBdHRhY2htZW50c091dHB1dCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlPSJFY2hvVW5yZWZBdHRhY2htZW50c091dCIvPgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iRWNob0F0dGFjaG1lbnRBc1N0cmluZyI+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dCBuYW1lPSJFY2hvQXR0YWNobWVudEFzU3RyaW5nSW5wdXQiCi0gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlPSJFY2hvQXR0YWNobWVudEFzU3RyaW5nSW4iLz4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dCBuYW1lPSJFY2hvQXR0YWNobWVudEFzU3RyaW5nT3V0cHV0IgotICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9IkVjaG9BdHRhY2htZW50QXNTdHJpbmdPdXQiLz4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICA8L3dzZGw6cG9ydFR5cGU+Ci0gICAgPHdzZGw6YmluZGluZyBuYW1lPSJBdHRhY2htZW50c0JpbmRpbmciIHR5cGU9IkF0dGFjaG1lbnRzUG9ydFR5cGUiPgotICAgICAgICA8c29hcDpiaW5kaW5nIHN0eWxlPSJkb2N1bWVudCIKLSAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIvPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iRWNob0F0dGFjaG1lbnQiPgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvYXR0YWNobWVudHMvIi8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dCBuYW1lPSJFY2hvQXR0YWNobWVudElucHV0Ij4KLSAgICAgICAgICAgICAgICA8ZGltZTptZXNzYWdlCi0gICAgICAgICAgICAgICAgICAgICAgICBsYXlvdXQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDIvMDQvZGltZS9jbG9zZWQtbGF5b3V0IgotICAgICAgICAgICAgICAgICAgICAgICAgd3NkbDpyZXF1aXJlZD0idHJ1ZSIvPgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQgbmFtZT0iRWNob0F0dGFjaG1lbnRPdXRwdXQiPgotICAgICAgICAgICAgICAgIDxkaW1lOm1lc3NhZ2UKLSAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwMi8wNC9kaW1lL2Nsb3NlZC1sYXlvdXQiCi0gICAgICAgICAgICAgICAgICAgICAgICB3c2RsOnJlcXVpcmVkPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJFY2hvQXR0YWNobWVudHMiPgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvYXR0YWNobWVudHMvIi8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dCBuYW1lPSJFY2hvQXR0YWNobWVudHNJbnB1dCI+Ci0gICAgICAgICAgICAgICAgPGRpbWU6bWVzc2FnZQotICAgICAgICAgICAgICAgICAgICAgICAgbGF5b3V0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDAyLzA0L2RpbWUvY2xvc2VkLWxheW91dCIKLSAgICAgICAgICAgICAgICAgICAgICAgIHdzZGw6cmVxdWlyZWQ9InRydWUiLz4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0IG5hbWU9IkVjaG9BdHRhY2htZW50c091dHB1dCI+Ci0gICAgICAgICAgICAgICAgPGRpbWU6bWVzc2FnZQotICAgICAgICAgICAgICAgICAgICAgICAgbGF5b3V0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDAyLzA0L2RpbWUvY2xvc2VkLWxheW91dCIKLSAgICAgICAgICAgICAgICAgICAgICAgIHdzZGw6cmVxdWlyZWQ9InRydWUiLz4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9IkVjaG9BdHRhY2htZW50QXNCYXNlNjQiPgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvYXR0YWNobWVudHMvIi8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dCBuYW1lPSJFY2hvQXR0YWNobWVudEFzQmFzZTY0SW5wdXQiPgotICAgICAgICAgICAgICAgIDxkaW1lOm1lc3NhZ2UKLSAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwMi8wNC9kaW1lL2Nsb3NlZC1sYXlvdXQiCi0gICAgICAgICAgICAgICAgICAgICAgICB3c2RsOnJlcXVpcmVkPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dCBuYW1lPSJFY2hvQXR0YWNobWVudEFzQmFzZTY0T3V0cHV0Ij4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9IkVjaG9CYXNlNjRBc0F0dGFjaG1lbnQiPgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvYXR0YWNobWVudHMvIi8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dCBuYW1lPSJFY2hvQmFzZTY0QXNBdHRhY2htZW50SW5wdXQiPgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQgbmFtZT0iRWNob0Jhc2U2NEFzQXR0YWNobWVudE91dHB1dCI+Ci0gICAgICAgICAgICAgICAgPGRpbWU6bWVzc2FnZQotICAgICAgICAgICAgICAgICAgICAgICAgbGF5b3V0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDAyLzA0L2RpbWUvY2xvc2VkLWxheW91dCIKLSAgICAgICAgICAgICAgICAgICAgICAgIHdzZGw6cmVxdWlyZWQ9InRydWUiLz4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9IkVjaG9VbnJlZkF0dGFjaG1lbnRzIj4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vc29hcGludGVyb3Aub3JnL2F0dGFjaG1lbnRzLyIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQgbmFtZT0iRWNob1VucmVmQXR0YWNobWVudHNJbnB1dCI+Ci0gICAgICAgICAgICAgICAgPGRpbWU6bWVzc2FnZQotICAgICAgICAgICAgICAgICAgICAgICAgbGF5b3V0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDAyLzA0L2RpbWUvb3Blbi1sYXlvdXQiCi0gICAgICAgICAgICAgICAgICAgICAgICB3c2RsOnJlcXVpcmVkPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dCBuYW1lPSJFY2hvVW5yZWZBdHRhY2htZW50c091dHB1dCI+Ci0gICAgICAgICAgICAgICAgPGRpbWU6bWVzc2FnZQotICAgICAgICAgICAgICAgICAgICAgICAgbGF5b3V0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDAyLzA0L2RpbWUvb3Blbi1sYXlvdXQiCi0gICAgICAgICAgICAgICAgICAgICAgICB3c2RsOnJlcXVpcmVkPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJFY2hvQXR0YWNobWVudEFzU3RyaW5nIj4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vc29hcGludGVyb3Aub3JnL2F0dGFjaG1lbnRzLyIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQgbmFtZT0iRWNob0F0dGFjaG1lbnRBc1N0cmluZ0lucHV0Ij4KLSAgICAgICAgICAgICAgICA8ZGltZTptZXNzYWdlCi0gICAgICAgICAgICAgICAgICAgICAgICBsYXlvdXQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDIvMDQvZGltZS9jbG9zZWQtbGF5b3V0IgotICAgICAgICAgICAgICAgICAgICAgICAgd3NkbDpyZXF1aXJlZD0idHJ1ZSIvPgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQgbmFtZT0iRWNob0F0dGFjaG1lbnRBc1N0cmluZ091dHB1dCI+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgPC93c2RsOmJpbmRpbmc+Ci0gICAgPHdzZGw6c2VydmljZSBuYW1lPSJEaW1lRE9DSW50ZXJvcCI+Ci0gICAgICAgIDx3c2RsOnBvcnQgbmFtZT0iRGltZURPQ1NvYXBQb3J0IiBiaW5kaW5nPSJBdHRhY2htZW50c0JpbmRpbmciPgotICAgICAgICAgICAgPHNvYXA6YWRkcmVzcwotICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo4MDgwL2F4aXMvc2VydmljZXMvRGltZURPQ1NvYXBQb3J0Ii8+Ci0gICAgICAgIDwvd3NkbDpwb3J0PgotICAgIDwvd3NkbDpzZXJ2aWNlPgotPC93c2RsOmRlZmluaXRpb25zPgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMveG1sYmVhbnMvdGVzdC1yZXNvdXJjZXMvaGVhZGVycy53c2RsIGIvdjEuNS4xUkMzL21vZHVsZXMveG1sYmVhbnMvdGVzdC1yZXNvdXJjZXMvaGVhZGVycy53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmNiZWRmLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3htbGJlYW5zL3Rlc3QtcmVzb3VyY2VzL2hlYWRlcnMud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGRlZmluaXRpb25zIHhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczp0bnM9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvIiB4bWxuczp0eXBlcz0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2QiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8iPgotICA8dHlwZXM+Ci0gICAgPHM6c2NoZW1hIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkIj4KLSAgICAgIDxzOmVsZW1lbnQgbmFtZT0iZWNob1N0cmluZ1BhcmFtIiB0eXBlPSJzOnN0cmluZyIvPgotICAgICAgICAgCi0gICAgICA8czplbGVtZW50IG5hbWU9ImVjaG9TdHJpbmdSZXR1cm4iIHR5cGU9InM6c3RyaW5nIi8+Ci0KLSAgICAgIDxzOmVsZW1lbnQgbmFtZT0iSGVhZGVyMSIgdHlwZT0idHlwZXM6SGVhZGVyMSIvPgotICAgICAgPHM6Y29tcGxleFR5cGUgbmFtZT0iSGVhZGVyMSI+Ci0gICAgICAgIDxzOnNlcXVlbmNlPgotICAgICAgICAgIDxzOmVsZW1lbnQgbmFtZT0ic3RyaW5nIiB0eXBlPSJzOnN0cmluZyIvPgotICAgICAgICAgIDxzOmVsZW1lbnQgbmFtZT0iaW50IiB0eXBlPSJzOmludCIvPgotICAgICAgICA8L3M6c2VxdWVuY2U+Ci0JPHM6YW55QXR0cmlidXRlLz4KLSAgICAgIDwvczpjb21wbGV4VHlwZT4KLSAgICAgIDxzOmVsZW1lbnQgbmFtZT0iSGVhZGVyMiIgdHlwZT0idHlwZXM6SGVhZGVyMiIvPgotICAgICAgPHM6Y29tcGxleFR5cGUgbmFtZT0iSGVhZGVyMiI+Ci0gICAgICAgIDxzOnNlcXVlbmNlPgotICAgICAgICAgIDxzOmVsZW1lbnQgbmFtZT0iaW50IiB0eXBlPSJzOmludCIvPgotICAgICAgICAgIDxzOmVsZW1lbnQgbmFtZT0ic3RyaW5nIiB0eXBlPSJzOnN0cmluZyIvPgotICAgICAgICA8L3M6c2VxdWVuY2U+Ci0JPHM6YW55QXR0cmlidXRlLz4KLSAgICAgIDwvczpjb21wbGV4VHlwZT4KLSAgICA8L3M6c2NoZW1hPgotICA8L3R5cGVzPgotICA8bWVzc2FnZSBuYW1lPSJlY2hvU3RyaW5nIj4KLSAgICAgICAgPHBhcnQgZWxlbWVudD0idHlwZXM6ZWNob1N0cmluZ1BhcmFtIiBuYW1lPSJhIi8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9ImVjaG9TdHJpbmdSZXNwb25zZSI+Ci0gICAgICAgIDxwYXJ0IGVsZW1lbnQ9InR5cGVzOmVjaG9TdHJpbmdSZXR1cm4iIG5hbWU9InJlc3VsdCIvPgotICAgIDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2UgbmFtZT0iSGVhZGVyMSI+Ci0gICAgPHBhcnQgbmFtZT0iSGVhZGVyMSIgZWxlbWVudD0idHlwZXM6SGVhZGVyMSIvPgotICA8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIG5hbWU9IkhlYWRlcjIiPgotICAgIDxwYXJ0IG5hbWU9IkhlYWRlcjIiIGVsZW1lbnQ9InR5cGVzOkhlYWRlcjIiLz4KLSAgPC9tZXNzYWdlPgotICA8cG9ydFR5cGUgbmFtZT0iUmV0SGVhZGVyUG9ydFR5cGUiPgotICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob1N0cmluZyI+Ci0gICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmVjaG9TdHJpbmciLz4KLSAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmVjaG9TdHJpbmdSZXNwb25zZSIvPgotICAgIDwvb3BlcmF0aW9uPgotICA8L3BvcnRUeXBlPgotICA8YmluZGluZyBuYW1lPSJSZXRIZWFkZXJCaW5kaW5nIiB0eXBlPSJ0bnM6UmV0SGVhZGVyUG9ydFR5cGUiPgotICAgIDxzb2FwOmJpbmRpbmcgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiIHN0eWxlPSJkb2N1bWVudCIvPgotICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob1N0cmluZyI+Ci0gICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8iIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgPGlucHV0PgotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICA8c29hcDpoZWFkZXIgbWVzc2FnZT0idG5zOkhlYWRlcjEiIHBhcnQ9IkhlYWRlcjEiIHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICA8c29hcDpoZWFkZXIgbWVzc2FnZT0idG5zOkhlYWRlcjIiIHBhcnQ9IkhlYWRlcjIiIHVzZT0ibGl0ZXJhbCIvPgotICAgICAgPC9pbnB1dD4KLSAgICAgIDxvdXRwdXQ+Ci0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICA8L291dHB1dD4KLSAgICA8L29wZXJhdGlvbj4KLSAgPC9iaW5kaW5nPgotICA8c2VydmljZSBuYW1lPSJSZXRIZWFkZXJTZXJ2aWNlIj4KLSAgICA8cG9ydCBuYW1lPSJSZXRIZWFkZXJQb3J0IiBiaW5kaW5nPSJ0bnM6UmV0SGVhZGVyQmluZGluZyI+Ci0gICAgICA8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vc29hcGludGVyb3AuamF2YS5zdW4uY29tOjgwL3JvdW5kMy9ncm91cGYvaGVhZGVycyIvPgotICAgIDwvcG9ydD4KLSAgPC9zZXJ2aWNlPgotPC9kZWZpbml0aW9ucz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy94bWxiZWFucy90ZXN0LXJlc291cmNlcy9pbnRlcm9wdGVzdGRvY2xpdC53c2RsIGIvdjEuNS4xUkMzL21vZHVsZXMveG1sYmVhbnMvdGVzdC1yZXNvdXJjZXMvaW50ZXJvcHRlc3Rkb2NsaXQud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzZmMWI0YS4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy94bWxiZWFucy90ZXN0LXJlc291cmNlcy9pbnRlcm9wdGVzdGRvY2xpdC53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLTw/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+Ci08L2RlZmluaXRpb25zPgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMveG1sYmVhbnMvdGVzdC1yZXNvdXJjZXMvaW50ZXJvcHRlc3Rkb2NsaXRwYXJhbWV0ZXJzLndzZGwgYi92MS41LjFSQzMvbW9kdWxlcy94bWxiZWFucy90ZXN0LXJlc291cmNlcy9pbnRlcm9wdGVzdGRvY2xpdHBhcmFtZXRlcnMud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGNkMmY1My4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy94bWxiZWFucy90ZXN0LXJlc291cmNlcy9pbnRlcm9wdGVzdGRvY2xpdHBhcmFtZXRlcnMud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDE5NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxkZWZpbml0aW9ucyBuYW1lPSJXU0RMSW50ZXJvcFRlc3REb2NMaXRTZXJ2aWNlIgotICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy9XU0RMSW50ZXJvcFRlc3REb2NMaXQiCi0gICAgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIgotICAgIHhtbG5zOlNPQVAtRU5DPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIKLSAgICB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIgotICAgIHhtbG5zOnRucz0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy9XU0RMSW50ZXJvcFRlc3REb2NMaXQiCi0gICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICB4bWxuczp4c2QxPSJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZCIKLSAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIj4KLSAgICA8dHlwZXM+Ci0gICAgICAgIDxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZCIKLSAgICAgICAgICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgICAgIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLSAgICAgICAgICAgIDxjb21wbGV4VHlwZSBuYW1lPSJBcnJheU9mc3RyaW5nX2xpdGVyYWwiPgotICAgICAgICAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMSIgbmFtZT0ic3RyaW5nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8Y29tcGxleFR5cGUgbmFtZT0iU09BUFN0cnVjdCI+Ci0gICAgICAgICAgICAgICAgPGFsbD4KLSAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0idmFyRmxvYXQiIHR5cGU9InhzZDpmbG9hdCIvPgotICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ2YXJJbnQiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0idmFyU3RyaW5nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgPC9hbGw+Ci0gICAgICAgICAgICA8L2NvbXBsZXhUeXBlPgotCi0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJlY2hvU3RyaW5nIj4KLSAgICAgICAgICAgICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InBhcmFtMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L2VsZW1lbnQ+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJlY2hvU3RyaW5nUmVzcG9uc2UiPgotICAgICAgICAgICAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0icmV0dXJuIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwvZWxlbWVudD4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImVjaG9TdHJpbmdBcnJheSI+Ci0gICAgICAgICAgICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJwYXJhbTAiIHR5cGU9InhzZDE6QXJyYXlPZnN0cmluZ19saXRlcmFsIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwvZWxlbWVudD4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImVjaG9TdHJpbmdBcnJheVJlc3BvbnNlIj4KLSAgICAgICAgICAgICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InJldHVybiIgdHlwZT0ieHNkMTpBcnJheU9mc3RyaW5nX2xpdGVyYWwiLz4KLSAgICAgICAgICAgICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L2NvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC9lbGVtZW50PgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iZWNob1N0cnVjdCI+Ci0gICAgICAgICAgICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJwYXJhbTAiIHR5cGU9InhzZDE6U09BUFN0cnVjdCIvPgotICAgICAgICAgICAgICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L2VsZW1lbnQ+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJlY2hvU3RydWN0UmVzcG9uc2UiPgotICAgICAgICAgICAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0icmV0dXJuIiB0eXBlPSJ4c2QxOlNPQVBTdHJ1Y3QiLz4KLSAgICAgICAgICAgICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L2NvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC9lbGVtZW50PgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iZWNob1ZvaWQiPgotICAgICAgICAgICAgICAgIDxjb21wbGV4VHlwZS8+Ci0gICAgICAgICAgICA8L2VsZW1lbnQ+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJlY2hvVm9pZFJlc3BvbnNlIj4KLSAgICAgICAgICAgICAgICA8Y29tcGxleFR5cGUvPgotICAgICAgICAgICAgPC9lbGVtZW50PgotICAgICAgICA8L3NjaGVtYT4KLSAgICA8L3R5cGVzPgotICAgIDxtZXNzYWdlIG5hbWU9ImVjaG9TdHJpbmciPgotICAgICAgICA8cGFydCBlbGVtZW50PSJ4c2QxOmVjaG9TdHJpbmciIG5hbWU9InBhcmFtZXRlcnMiLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iZWNob1N0cmluZ1Jlc3BvbnNlIj4KLSAgICAgICAgPHBhcnQgZWxlbWVudD0ieHNkMTplY2hvU3RyaW5nUmVzcG9uc2UiIG5hbWU9InBhcmFtZXRlcnMiLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iZWNob1N0cmluZ0FycmF5Ij4KLSAgICAgICAgPHBhcnQgZWxlbWVudD0ieHNkMTplY2hvU3RyaW5nQXJyYXkiIG5hbWU9InBhcmFtZXRlcnMiLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iZWNob1N0cmluZ0FycmF5UmVzcG9uc2UiPgotICAgICAgICA8cGFydCBlbGVtZW50PSJ4c2QxOmVjaG9TdHJpbmdBcnJheVJlc3BvbnNlIiBuYW1lPSJwYXJhbWV0ZXJzIi8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9ImVjaG9TdHJ1Y3QiPgotICAgICAgICA8cGFydCBlbGVtZW50PSJ4c2QxOmVjaG9TdHJ1Y3QiIG5hbWU9InBhcmFtZXRlcnMiLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iZWNob1N0cnVjdFJlc3BvbnNlIj4KLSAgICAgICAgPHBhcnQgZWxlbWVudD0ieHNkMTplY2hvU3RydWN0UmVzcG9uc2UiIG5hbWU9InBhcmFtZXRlcnMiLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iZWNob1ZvaWQiPgotICAgICAgICA8cGFydCBlbGVtZW50PSJ4c2QxOmVjaG9Wb2lkIiBuYW1lPSJwYXJhbWV0ZXJzIi8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9ImVjaG9Wb2lkUmVzcG9uc2UiPgotICAgICAgICA8cGFydCBlbGVtZW50PSJ4c2QxOmVjaG9Wb2lkUmVzcG9uc2UiIG5hbWU9InBhcmFtZXRlcnMiLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPHBvcnRUeXBlIG5hbWU9IldTRExJbnRlcm9wVGVzdERvY0xpdFBvcnRUeXBlIj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvU3RyaW5nIj4KLSAgICAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6ZWNob1N0cmluZyIgbmFtZT0iZWNob1N0cmluZyIvPgotICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6ZWNob1N0cmluZ1Jlc3BvbnNlIiBuYW1lPSJlY2hvU3RyaW5nUmVzcG9uc2UiLz4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob1N0cmluZ0FycmF5Ij4KLSAgICAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6ZWNob1N0cmluZ0FycmF5IiBuYW1lPSJlY2hvU3RyaW5nQXJyYXkiLz4KLSAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmVjaG9TdHJpbmdBcnJheVJlc3BvbnNlIiBuYW1lPSJlY2hvU3RyaW5nQXJyYXlSZXNwb25zZSIvPgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvU3RydWN0Ij4KLSAgICAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6ZWNob1N0cnVjdCIgbmFtZT0iZWNob1N0cnVjdCIvPgotICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6ZWNob1N0cnVjdFJlc3BvbnNlIiBuYW1lPSJlY2hvU3RydWN0UmVzcG9uc2UiLz4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob1ZvaWQiPgotICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczplY2hvVm9pZCIgbmFtZT0iZWNob1ZvaWQiLz4KLSAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmVjaG9Wb2lkUmVzcG9uc2UiIG5hbWU9ImVjaG9Wb2lkUmVzcG9uc2UiLz4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgPC9wb3J0VHlwZT4KLSAgICA8YmluZGluZyBuYW1lPSJXU0RMSW50ZXJvcFRlc3REb2NMaXRQb3J0QmluZGluZyIKLSAgICAgICAgdHlwZT0idG5zOldTRExJbnRlcm9wVGVzdERvY0xpdFBvcnRUeXBlIj4KLSAgICAgICAgPHNvYXA6YmluZGluZyBzdHlsZT0iZG9jdW1lbnQiIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIi8+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob1N0cmluZyI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8iIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPGlucHV0IG5hbWU9ImVjaG9TdHJpbmciPgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgbmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnL1dTRExJbnRlcm9wVGVzdERvY0xpdCIKLSAgICAgICAgICAgICAgICAgICAgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L2lucHV0PgotICAgICAgICAgICAgPG91dHB1dCBuYW1lPSJlY2hvU3RyaW5nUmVzcG9uc2UiPgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgbmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnL1dTRExJbnRlcm9wVGVzdERvY0xpdCIKLSAgICAgICAgICAgICAgICAgICAgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob1N0cmluZ0FycmF5Ij4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vc29hcGludGVyb3Aub3JnLyIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8aW5wdXQgbmFtZT0iZWNob1N0cmluZ0FycmF5Ij4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IG5hbWVzcGFjZT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy9XU0RMSW50ZXJvcFRlc3REb2NMaXQiCi0gICAgICAgICAgICAgICAgICAgIHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgIDxvdXRwdXQgbmFtZT0iZWNob1N0cmluZ0FycmF5UmVzcG9uc2UiPgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgbmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnL1dTRExJbnRlcm9wVGVzdERvY0xpdCIKLSAgICAgICAgICAgICAgICAgICAgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob1N0cnVjdCI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8iIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPGlucHV0IG5hbWU9ImVjaG9TdHJ1Y3QiPgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgbmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnL1dTRExJbnRlcm9wVGVzdERvY0xpdCIKLSAgICAgICAgICAgICAgICAgICAgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L2lucHV0PgotICAgICAgICAgICAgPG91dHB1dCBuYW1lPSJlY2hvU3RydWN0UmVzcG9uc2UiPgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgbmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnL1dTRExJbnRlcm9wVGVzdERvY0xpdCIKLSAgICAgICAgICAgICAgICAgICAgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob1ZvaWQiPgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvIiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDxpbnB1dCBuYW1lPSJlY2hvVm9pZCI+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSBuYW1lc3BhY2U9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvV1NETEludGVyb3BUZXN0RG9jTGl0IgotICAgICAgICAgICAgICAgICAgICB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvaW5wdXQ+Ci0gICAgICAgICAgICA8b3V0cHV0IG5hbWU9ImVjaG9Wb2lkUmVzcG9uc2UiPgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgbmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnL1dTRExJbnRlcm9wVGVzdERvY0xpdCIKLSAgICAgICAgICAgICAgICAgICAgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgPC9iaW5kaW5nPgotICAgIDxzZXJ2aWNlIG5hbWU9IldTRExJbnRlcm9wVGVzdERvY0xpdFNlcnZpY2UiPgotICAgICAgICA8cG9ydCBiaW5kaW5nPSJ0bnM6V1NETEludGVyb3BUZXN0RG9jTGl0UG9ydEJpbmRpbmciCi0gICAgICAgICAgICBuYW1lPSJXU0RMSW50ZXJvcFRlc3REb2NMaXRQYXJhbVBvcnQiPgotICAgICAgICAgICAgPHNvYXA6YWRkcmVzcwotICAgICAgICAgICAgICAgIGxvY2F0aW9uPSJodHRwOi8vd3d3LndoaXRlbWVzYS5uZXQvaW50ZXJvcC9yMy9kb2NsaXRwYXJhbSIvPgotICAgICAgICA8L3BvcnQ+Ci0gICAgPC9zZXJ2aWNlPgotPC9kZWZpbml0aW9ucz4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3htbGJlYW5zL3Rlc3QtcmVzb3VyY2VzL21pbWUtZG9jLndzZGwgYi92MS41LjFSQzMvbW9kdWxlcy94bWxiZWFucy90ZXN0LXJlc291cmNlcy9taW1lLWRvYy53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTIyNjkyLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3htbGJlYW5zL3Rlc3QtcmVzb3VyY2VzL21pbWUtZG9jLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyMDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08d3NkbDpkZWZpbml0aW9ucyBuYW1lPSJTT0FQQnVpbGRlcnMiCi0gICAgeG1sbnM9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvYXR0YWNobWVudHMvd3NkbCIgCi0gICAgeG1sbnM6dHlwZXM9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvYXR0YWNobWVudHMveHNkIiAKLSAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiAKLSAgICB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiAKLSAgICB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIgCi0gICAgeG1sbnM6bWltZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9taW1lLyIgCi0gICAgeG1sbnM6c29hcC1lbmM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIiAKLSAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvYXR0YWNobWVudHMvd3NkbCI+Ci0JPHdzZGw6dHlwZXM+Ci0JCTxzY2hlbWEgCi0JCQl4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIAotCQkJdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnL2F0dGFjaG1lbnRzL3hzZCIgCi0JCQllbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKLQkJCWF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPgotCQkKLQkJPGNvbXBsZXhUeXBlIG5hbWU9ImJpbmFyeSI+Ci0JCQk8c2ltcGxlQ29udGVudD4KLQkJCQk8ZXh0ZW5zaW9uIGJhc2U9InhzZDpiYXNlNjRCaW5hcnkiPgotCQkJCQk8YXR0cmlidXRlIG5hbWU9ImhyZWYiIHR5cGU9InhzZDphbnlVUkkiLz4KLQkJCQk8L2V4dGVuc2lvbj4KLQkJCTwvc2ltcGxlQ29udGVudD4KLQkJPC9jb21wbGV4VHlwZSA+Ci0JCQotCQk8ZWxlbWVudCBuYW1lPSJFY2hvQXR0YWNobWVudCIgdHlwZT0idHlwZXM6RWNob0F0dGFjaG1lbnQiLz4KLQkJPGVsZW1lbnQgbmFtZT0iRWNob0F0dGFjaG1lbnRSZXNwb25zZSIgdHlwZT0idHlwZXM6RWNob0F0dGFjaG1lbnRSZXNwb25zZSIvPgotCQk8Y29tcGxleFR5cGUgbmFtZT0iRWNob0F0dGFjaG1lbnQiPgotCQkJPHNlcXVlbmNlPgotCQkJCTxlbGVtZW50IG5hbWU9IkluIiB0eXBlPSJ0eXBlczpiaW5hcnkiLz4KLQkJCTwvc2VxdWVuY2U+Ci0JCTwvY29tcGxleFR5cGU+Ci0JCTxjb21wbGV4VHlwZSBuYW1lPSJFY2hvQXR0YWNobWVudFJlc3BvbnNlIj4KLQkJCTxzZXF1ZW5jZT4KLQkJCQk8ZWxlbWVudCBuYW1lPSJPdXQiIHR5cGU9InR5cGVzOmJpbmFyeSIvPgotCQkJPC9zZXF1ZW5jZT4KLQkJPC9jb21wbGV4VHlwZT4KLQkJCi0JCTxlbGVtZW50IG5hbWU9IkVjaG9BdHRhY2htZW50cyIgdHlwZT0idHlwZXM6QXR0YWNobWVudHMiLz4KLQkJPGVsZW1lbnQgbmFtZT0iRWNob0F0dGFjaG1lbnRzUmVzcG9uc2UiIHR5cGU9InR5cGVzOkF0dGFjaG1lbnRzIi8+Ci0JCTxjb21wbGV4VHlwZSBuYW1lPSJBdHRhY2htZW50cyI+Ci0JCQk8c2VxdWVuY2U+Ci0JCQkJPGVsZW1lbnQgbmFtZT0iSXRlbSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgdHlwZT0idHlwZXM6YmluYXJ5Ij4KLQkJCQk8L2VsZW1lbnQ+Ci0JCQk8L3NlcXVlbmNlPgotCQk8L2NvbXBsZXhUeXBlPgotCQkKLQkJPGVsZW1lbnQgbmFtZT0iRWNob0F0dGFjaG1lbnRBc0Jhc2U2NCIgdHlwZT0idHlwZXM6RWNob0F0dGFjaG1lbnQiLz4KLQkJPGVsZW1lbnQgbmFtZT0iRWNob0F0dGFjaG1lbnRBc0Jhc2U2NFJlc3BvbnNlIiB0eXBlPSJ0eXBlczpFY2hvQXR0YWNobWVudFJlc3BvbnNlIi8+Ci0JCQotCQk8ZWxlbWVudCBuYW1lPSJFY2hvQmFzZTY0QXNBdHRhY2htZW50IiB0eXBlPSJ0eXBlczpFY2hvQXR0YWNobWVudCIvPgotCQk8ZWxlbWVudCBuYW1lPSJFY2hvQmFzZTY0QXNBdHRhY2htZW50UmVzcG9uc2UiIHR5cGU9InR5cGVzOkVjaG9BdHRhY2htZW50UmVzcG9uc2UiLz4KLQkJPC9zY2hlbWE+Ci0JPC93c2RsOnR5cGVzPgotCQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0iRWNob0F0dGFjaG1lbnRJbiI+Ci0JCTx3c2RsOnBhcnQgbmFtZT0iSW4iIGVsZW1lbnQ9InR5cGVzOkVjaG9BdHRhY2htZW50Ii8+Ci0JPC93c2RsOm1lc3NhZ2U+Ci0JPHdzZGw6bWVzc2FnZSBuYW1lPSJFY2hvQXR0YWNobWVudE91dCI+Ci0JCTx3c2RsOnBhcnQgbmFtZT0iT3V0IiBlbGVtZW50PSJ0eXBlczpFY2hvQXR0YWNobWVudFJlc3BvbnNlIi8+Ci0JPC93c2RsOm1lc3NhZ2U+Ci0JPHdzZGw6bWVzc2FnZSBuYW1lPSJFY2hvQXR0YWNobWVudHNJbiI+Ci0JCTx3c2RsOnBhcnQgbmFtZT0iSW4iIGVsZW1lbnQ9InR5cGVzOkVjaG9BdHRhY2htZW50cyIvPgotCTwvd3NkbDptZXNzYWdlPgotCTx3c2RsOm1lc3NhZ2UgbmFtZT0iRWNob0F0dGFjaG1lbnRzT3V0Ij4KLQkJPHdzZGw6cGFydCBuYW1lPSJPdXQiIGVsZW1lbnQ9InR5cGVzOkVjaG9BdHRhY2htZW50c1Jlc3BvbnNlIi8+Ci0JPC93c2RsOm1lc3NhZ2U+Ci0JPHdzZGw6bWVzc2FnZSBuYW1lPSJFY2hvQXR0YWNobWVudEFzQmFzZTY0SW4iPgotCQk8d3NkbDpwYXJ0IG5hbWU9IkluIiBlbGVtZW50PSJ0eXBlczpFY2hvQXR0YWNobWVudEFzQmFzZTY0Ii8+Ci0JPC93c2RsOm1lc3NhZ2U+Ci0JPHdzZGw6bWVzc2FnZSBuYW1lPSJFY2hvQXR0YWNobWVudEFzQmFzZTY0T3V0Ij4KLQkJPHdzZGw6cGFydCBuYW1lPSJPdXQiIGVsZW1lbnQ9InR5cGVzOkVjaG9BdHRhY2htZW50QXNCYXNlNjRSZXNwb25zZSIvPgotCTwvd3NkbDptZXNzYWdlPgotCTx3c2RsOm1lc3NhZ2UgbmFtZT0iRWNob0Jhc2U2NEFzQXR0YWNobWVudEluIj4KLQkJPHdzZGw6cGFydCBuYW1lPSJJbiIgZWxlbWVudD0idHlwZXM6RWNob0Jhc2U2NEFzQXR0YWNobWVudCIvPgotCTwvd3NkbDptZXNzYWdlPgotCTx3c2RsOm1lc3NhZ2UgbmFtZT0iRWNob0Jhc2U2NEFzQXR0YWNobWVudE91dCI+Ci0JCTx3c2RsOnBhcnQgbmFtZT0iT3V0IiBlbGVtZW50PSJ0eXBlczpFY2hvQmFzZTY0QXNBdHRhY2htZW50UmVzcG9uc2UiLz4KLQk8L3dzZGw6bWVzc2FnZT4KLQkKLQk8d3NkbDpwb3J0VHlwZSBuYW1lPSJBdHRhY2htZW50c1BvcnRUeXBlIj4KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9IkVjaG9BdHRhY2htZW50Ij4KLQkJCTx3c2RsOmlucHV0IG5hbWU9IkVjaG9BdHRhY2htZW50SW5wdXQiIG1lc3NhZ2U9IkVjaG9BdHRhY2htZW50SW4iLz4KLQkJCTx3c2RsOm91dHB1dCBuYW1lPSJFY2hvQXR0YWNobWVudE91dHB1dCIgbWVzc2FnZT0iRWNob0F0dGFjaG1lbnRPdXQiLz4KLQkJPC93c2RsOm9wZXJhdGlvbj4KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9IkVjaG9BdHRhY2htZW50cyI+Ci0JCQk8d3NkbDppbnB1dCBuYW1lPSJFY2hvQXR0YWNobWVudHNJbnB1dCIgbWVzc2FnZT0iRWNob0F0dGFjaG1lbnRzSW4iLz4KLQkJCTx3c2RsOm91dHB1dCBuYW1lPSJFY2hvQXR0YWNobWVudHNPdXRwdXQiIG1lc3NhZ2U9IkVjaG9BdHRhY2htZW50c091dCIvPgotCQk8L3dzZGw6b3BlcmF0aW9uPgotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iRWNob0F0dGFjaG1lbnRBc0Jhc2U2NCI+Ci0JCQk8d3NkbDppbnB1dCBuYW1lPSJFY2hvQXR0YWNobWVudEFzQmFzZTY0SW5wdXQiIG1lc3NhZ2U9IkVjaG9BdHRhY2htZW50QXNCYXNlNjRJbiIvPgotCQkJPHdzZGw6b3V0cHV0IG5hbWU9IkVjaG9BdHRhY2htZW50QXNCYXNlNjRPdXRwdXQiIG1lc3NhZ2U9IkVjaG9BdHRhY2htZW50QXNCYXNlNjRPdXQiLz4KLQkJPC93c2RsOm9wZXJhdGlvbj4KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9IkVjaG9CYXNlNjRBc0F0dGFjaG1lbnQiPgotCQkJPHdzZGw6aW5wdXQgbmFtZT0iRWNob0Jhc2U2NEFzQXR0YWNobWVudElucHV0IiBtZXNzYWdlPSJFY2hvQmFzZTY0QXNBdHRhY2htZW50SW4iLz4KLQkJCTx3c2RsOm91dHB1dCBuYW1lPSJFY2hvQmFzZTY0QXNBdHRhY2htZW50T3V0cHV0IiBtZXNzYWdlPSJFY2hvQmFzZTY0QXNBdHRhY2htZW50T3V0Ii8+Ci0JCTwvd3NkbDpvcGVyYXRpb24+Ci0JPC93c2RsOnBvcnRUeXBlPgotCTx3c2RsOmJpbmRpbmcgbmFtZT0iQXR0YWNobWVudHNCaW5kaW5nIiB0eXBlPSJBdHRhY2htZW50c1BvcnRUeXBlIj4KLQkJPHNvYXA6YmluZGluZyBzdHlsZT0iZG9jdW1lbnQiIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIi8+Ci0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJFY2hvQXR0YWNobWVudCI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy9hdHRhY2htZW50cy8iLz4KLQkJCTx3c2RsOmlucHV0IG5hbWU9IkVjaG9BdHRhY2htZW50SW5wdXQiPgotCQkJCTxtaW1lOm11bHRpcGFydFJlbGF0ZWQ+Ci0JCQkJCTxtaW1lOnBhcnQ+Ci0JCQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotCQkJCQk8L21pbWU6cGFydD4KLQkJCQkJPG1pbWU6cGFydD4KLQkJCQkJCTxtaW1lOmNvbnRlbnQgcGFydD0iSW4iIHR5cGU9ImFwcGxpY2F0aW9uL29jdGV0c3RyZWFtIi8+Ci0JCQkJCTwvbWltZTpwYXJ0PgotCQkJCTwvbWltZTptdWx0aXBhcnRSZWxhdGVkPgotCQkJPC93c2RsOmlucHV0PgotCQkJPHdzZGw6b3V0cHV0IG5hbWU9IkVjaG9BdHRhY2htZW50T3V0cHV0Ij4KLQkJCQk8bWltZTptdWx0aXBhcnRSZWxhdGVkPgotCQkJCQk8bWltZTpwYXJ0PgotCQkJCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQkJCTwvbWltZTpwYXJ0PgotCQkJCQk8bWltZTpwYXJ0PgotCQkJCQkJPG1pbWU6Y29udGVudCBwYXJ0PSJPdXQiIHR5cGU9ImFwcGxpY2F0aW9uL29jdGV0c3RyZWFtIi8+Ci0JCQkJCTwvbWltZTpwYXJ0PgotCQkJCTwvbWltZTptdWx0aXBhcnRSZWxhdGVkPgotCQkJPC93c2RsOm91dHB1dD4KLQkJPC93c2RsOm9wZXJhdGlvbj4KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9IkVjaG9BdHRhY2htZW50cyI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy9hdHRhY2htZW50cy8iLz4KLQkJCTx3c2RsOmlucHV0IG5hbWU9IkVjaG9BdHRhY2htZW50c0lucHV0Ij4KLQkJCQk8bWltZTptdWx0aXBhcnRSZWxhdGVkPgotCQkJCQk8bWltZTpwYXJ0PgotCQkJCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLQkJCQkJPC9taW1lOnBhcnQ+Ci0JCQkJCTxtaW1lOnBhcnQ+Ci0JCQkJCQk8bWltZTpjb250ZW50IHBhcnQ9IkluIiB0eXBlPSJhcHBsaWNhdGlvbi9vY3RldHN0cmVhbSIvPgotCQkJCQk8L21pbWU6cGFydD4KLQkJCQk8L21pbWU6bXVsdGlwYXJ0UmVsYXRlZD4KLQkJCTwvd3NkbDppbnB1dD4KLQkJCTx3c2RsOm91dHB1dCBuYW1lPSJFY2hvQXR0YWNobWVudHNPdXRwdXQiPgotCQkJCTxtaW1lOm11bHRpcGFydFJlbGF0ZWQ+Ci0JCQkJCTxtaW1lOnBhcnQ+Ci0JCQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotCQkJCQk8L21pbWU6cGFydD4KLQkJCQkJPG1pbWU6cGFydD4KLQkJCQkJCTxtaW1lOmNvbnRlbnQgcGFydD0iT3V0IiB0eXBlPSJhcHBsaWNhdGlvbi9vY3RldHN0cmVhbSIvPgotCQkJCQk8L21pbWU6cGFydD4KLQkJCQk8L21pbWU6bXVsdGlwYXJ0UmVsYXRlZD4KLQkJCTwvd3NkbDpvdXRwdXQ+Ci0JCTwvd3NkbDpvcGVyYXRpb24+Ci0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJFY2hvQXR0YWNobWVudEFzQmFzZTY0Ij4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vc29hcGludGVyb3Aub3JnL2F0dGFjaG1lbnRzLyIvPgotCQkJPHdzZGw6aW5wdXQgbmFtZT0iRWNob0F0dGFjaG1lbnRBc0Jhc2U2NElucHV0Ij4KLQkJCQk8bWltZTptdWx0aXBhcnRSZWxhdGVkPgotCQkJCQk8bWltZTpwYXJ0PgotCQkJCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLQkJCQkJPC9taW1lOnBhcnQ+Ci0JCQkJCTxtaW1lOnBhcnQ+Ci0JCQkJCQk8bWltZTpjb250ZW50IHBhcnQ9IkluIiB0eXBlPSJhcHBsaWNhdGlvbi9vY3RldHN0cmVhbSIvPgotCQkJCQk8L21pbWU6cGFydD4KLQkJCQk8L21pbWU6bXVsdGlwYXJ0UmVsYXRlZD4KLQkJCTwvd3NkbDppbnB1dD4KLQkJCTx3c2RsOm91dHB1dCBuYW1lPSJFY2hvQXR0YWNobWVudEFzQmFzZTY0T3V0cHV0Ij4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotCQkJPC93c2RsOm91dHB1dD4KLQkJPC93c2RsOm9wZXJhdGlvbj4KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9IkVjaG9CYXNlNjRBc0F0dGFjaG1lbnQiPgotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvYXR0YWNobWVudHMvIi8+Ci0JCQk8d3NkbDppbnB1dCBuYW1lPSJFY2hvQmFzZTY0QXNBdHRhY2htZW50SW5wdXQiPgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC93c2RsOmlucHV0PgotCQkJPHdzZGw6b3V0cHV0IG5hbWU9IkVjaG9CYXNlNjRBc0F0dGFjaG1lbnRPdXRwdXQiPgotCQkJCTxtaW1lOm11bHRpcGFydFJlbGF0ZWQ+Ci0JCQkJCTxtaW1lOnBhcnQ+Ci0JCQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotCQkJCQk8L21pbWU6cGFydD4KLQkJCQkJPG1pbWU6cGFydD4KLQkJCQkJCTxtaW1lOmNvbnRlbnQgcGFydD0iT3V0IiB0eXBlPSJhcHBsaWNhdGlvbi9vY3RldHN0cmVhbSIvPgotCQkJCQk8L21pbWU6cGFydD4KLQkJCQk8L21pbWU6bXVsdGlwYXJ0UmVsYXRlZD4KLQkJCTwvd3NkbDpvdXRwdXQ+Ci0JCTwvd3NkbDpvcGVyYXRpb24+Ci0JPC93c2RsOmJpbmRpbmc+Ci0gICAgPHdzZGw6c2VydmljZSBuYW1lPSJNaW1lRE9DSW50ZXJvcCI+Ci0JICAgIDx3c2RsOnBvcnQgbmFtZT0iTWltZURPQ1NvYXBQb3J0IiBiaW5kaW5nPSJBdHRhY2htZW50c0JpbmRpbmciPgotICAgICAgICAgICAgPHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo4MDgwL2F4aXMvc2VydmljZXMvTWltZURPQ1NvYXBQb3J0Ii8+Ci0gICAgICAgIDwvd3NkbDpwb3J0PgotICAgIDwvd3NkbDpzZXJ2aWNlPgotPC93c2RsOmRlZmluaXRpb25zPgkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy94bWxiZWFucy90ZXN0LXJlc291cmNlcy9tdG9tZWNoby53c2RsIGIvdjEuNS4xUkMzL21vZHVsZXMveG1sYmVhbnMvdGVzdC1yZXNvdXJjZXMvbXRvbWVjaG8ud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjU3MDk3OC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy94bWxiZWFucy90ZXN0LXJlc291cmNlcy9tdG9tZWNoby53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHdzZGw6ZGVmaW5pdGlvbnMgeG1sbnM6eD0iaHR0cDovL2V4YW1wbGUub3JnL210b20vZGF0YSIKLQkJCQkgIHhtbG5zOnNvYXAxMj0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwMTIvIiAKLQkJCQkgIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiAKLQkJCQkgIHhtbG5zOnRucz0iaHR0cDovL21hcnRpbmd1ZGdpbi0yLmRzbC5lYXN5bmV0LmNvLnVrL210b20iCi0JCQkJICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9tYXJ0aW5ndWRnaW4tMi5kc2wuZWFzeW5ldC5jby51ay9tdG9tIiA+Ci0KLSAgPHdzZGw6dHlwZXM+Ci0JPHhzOnNjaGVtYSB4bWxuczp4cz0naHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEnIAotCQkJICAgeG1sbnM6eG1pbWU9J2h0dHA6Ly93d3cudzMub3JnLzIwMDQvMDYveG1sbWltZScKLQkJCSAgIHRhcmdldE5hbWVzcGFjZT0naHR0cDovL2V4YW1wbGUub3JnL210b20vZGF0YSc+Ci0KLQkgIDx4czppbXBvcnQgbmFtZXNwYWNlPSdodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA2L3htbG1pbWUnIC8+Ci0KLQkgIDx4czplbGVtZW50IG5hbWU9J0RhdGEnID4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkgIDx4czpzaW1wbGVDb250ZW50PgotCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSd4czpiYXNlNjRCaW5hcnknID4KLQkJCSAgPHhzOmF0dHJpYnV0ZSByZWY9J3htaW1lOmNvbnRlbnRUeXBlJyAvPgotCQkJPC94czpleHRlbnNpb24+Ci0JCSAgPC94czpzaW1wbGVDb250ZW50PgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCSAgPC94czplbGVtZW50PgotCi0JICA8eHM6ZWxlbWVudCBuYW1lPSdFY2hvVGVzdCcgPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCSAgPHhzOnNlcXVlbmNlPgotCQkJPHhzOmVsZW1lbnQgcmVmPSd4OkRhdGEnIG1pbk9jY3Vycz0nMScgbWF4T2NjdXJzPSd1bmJvdW5kZWQnIC8+Ci0JCSAgPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQkgIDwveHM6ZWxlbWVudD4KLQkJCi0JPC94czpzY2hlbWE+Ci0gIDwvd3NkbDp0eXBlcz4KLQkKLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJFY2hvVGVzdFNpbmdsZSI+Ci0JPHdzZGw6cGFydCBuYW1lPSJQIiBlbGVtZW50PSJ4OkRhdGEiLz4KLSAgPC93c2RsOm1lc3NhZ2U+Ci0KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJFY2hvVGVzdE11bHRpcGxlIj4KLQk8d3NkbDpwYXJ0IG5hbWU9IlAiIGVsZW1lbnQ9Ing6RWNob1Rlc3QiLz4KLSAgPC93c2RsOm1lc3NhZ2U+Ci0JCi0gIDx3c2RsOnBvcnRUeXBlIG5hbWU9IkVjaG9UZXN0Ij4KLQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iRWNob1Rlc3RTaW5nbGUiPgotCSAgPHdzZGw6aW5wdXQgbmFtZT0iRWNob1Rlc3RTaW5nbGVJbnB1dCIgbWVzc2FnZT0idG5zOkVjaG9UZXN0U2luZ2xlIi8+Ci0JICA8d3NkbDpvdXRwdXQgbmFtZT0iRWNob1Rlc3RTaW5nbGVPdXRwdXQiIG1lc3NhZ2U9InRuczpFY2hvVGVzdFNpbmdsZSIvPgotCTwvd3NkbDpvcGVyYXRpb24+Ci0JPHdzZGw6b3BlcmF0aW9uIG5hbWU9IkVjaG9UZXN0TXVsdGlwbGUiPgotCSAgPHdzZGw6aW5wdXQgbmFtZT0iRWNob1Rlc3RNdWx0aXBsZUlucHV0IiBtZXNzYWdlPSJ0bnM6RWNob1Rlc3RNdWx0aXBsZSIvPgotCSAgPHdzZGw6b3V0cHV0IG5hbWU9IkVjaG9UZXN0TXVsdGlwbGVPdXRwdXQiIG1lc3NhZ2U9InRuczpFY2hvVGVzdE11bHRpcGxlIi8+Ci0JPC93c2RsOm9wZXJhdGlvbj4KLSAgPC93c2RsOnBvcnRUeXBlPgotCi0gIDx3c2RsOmJpbmRpbmcgbmFtZT0iRWNob1Rlc3QiIHR5cGU9InRuczpFY2hvVGVzdCI+Ci0JPHNvYXAxMjpiaW5kaW5nIHN0eWxlPSJkb2N1bWVudCIgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiLz4KLQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iRWNob1Rlc3RTaW5nbGUiPgotCSAgPHNvYXAxMjpvcGVyYXRpb24gLz4KLQkgIDx3c2RsOmlucHV0IG5hbWU9IkVjaG9UZXN0U2luZ2xlSW5wdXQiPgotCQk8c29hcDEyOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0JICA8L3dzZGw6aW5wdXQ+Ci0JICA8d3NkbDpvdXRwdXQgbmFtZT0iRWNob1Rlc3RTaW5nbGVPdXRwdXQiPgotCQk8c29hcDEyOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0JICA8L3dzZGw6b3V0cHV0PgotCTwvd3NkbDpvcGVyYXRpb24+Ci0JPHdzZGw6b3BlcmF0aW9uIG5hbWU9IkVjaG9UZXN0TXVsdGlwbGUiPgotCSAgPHNvYXAxMjpvcGVyYXRpb24gLz4KLQkgIDx3c2RsOmlucHV0IG5hbWU9IkVjaG9UZXN0TXVsdGlwbGVJbnB1dCI+Ci0JCTxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLQkgIDwvd3NkbDppbnB1dD4KLQkgIDx3c2RsOm91dHB1dCBuYW1lPSJFY2hvVGVzdE11bHRpcGxlT3V0cHV0Ij4KLQkJPHNvYXAxMjpib2R5IHVzZT0ibGl0ZXJhbCIvPgotCSAgPC93c2RsOm91dHB1dD4KLQk8L3dzZGw6b3BlcmF0aW9uPgotICA8L3dzZGw6YmluZGluZz4KLQotICA8d3NkbDpzZXJ2aWNlIG5hbWU9IkVjaG9UZXN0Ij4KLQk8d3NkbDpwb3J0IG5hbWU9IkVjaG9UZXN0IiBiaW5kaW5nPSJ0bnM6RWNob1Rlc3QiPgotCSAgPHNvYXAxMjphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vbWFydGluZ3VkZ2luLTIuZHNsLmVhc3luZXQuY28udWsvZG90bmV0L210b20vbXRvbWVjaG8uYXNoeCIgLz4KLQk8L3dzZGw6cG9ydD4KLSAgPC93c2RsOnNlcnZpY2U+Ci0KLTwvd3NkbDpkZWZpbml0aW9ucz4JCmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy94bWxiZWFucy90ZXN0LXJlc291cmNlcy9uby1zZXJ2aWNlLndzZGwgYi92MS41LjFSQzMvbW9kdWxlcy94bWxiZWFucy90ZXN0LXJlc291cmNlcy9uby1zZXJ2aWNlLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmZjlmMTQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMveG1sYmVhbnMvdGVzdC1yZXNvdXJjZXMvbm8tc2VydmljZS53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHdzZGw6ZGVmaW5pdGlvbnMKLSAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3LmdyaWRmb3J1bS5vcmcvY2RkbG0vZGVwbG95YXBpLzIwMDUvMDIvd3NkbCIKLSAgeG1sbnM6dG5zPSJodHRwOi8vd3d3LmdyaWRmb3J1bS5vcmcvY2RkbG0vZGVwbG95YXBpLzIwMDUvMDIvd3NkbCIKLSAgeG1sbnM6YXBpPSJodHRwOi8vd3d3LmdyaWRmb3J1bS5vcmcvY2RkbG0vZGVwbG95YXBpLzIwMDUvMDIiCi0gIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIgotICB4bWxuczp3c2Rsc29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIKLSAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgeG1sbnM6d3NhPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDAzLzAzL2FkZHJlc3NpbmciCi0gID4KLSAgCi0gICA8d3NkbDp0eXBlcz4KLSAgICA8eHNkOnNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cuZ3JpZGZvcnVtLm9yZy9jZGRsbS9kZXBsb3lhcGkvMjAwNS8wMiIKLSAgICAgIHhtbG5zPSJodHRwOi8vd3d3LmdyaWRmb3J1bS5vcmcvY2RkbG0vZGVwbG95YXBpLzIwMDUvMDIiCi0gICAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+Ci0gICAgCi0gICAgCi0gICAgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ1bmJvdW5kZWRYTUxBbnlOYW1lc3BhY2UiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6YW55IG5hbWVzcGFjZT0iIyNhbnkiIHByb2Nlc3NDb250ZW50cz0ibGF4IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY3JlYXRlUmVxdWVzdCI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICBUaGlzIGlzIG91ciByZXF1ZXN0IHRvIGNyZWF0ZSBhIHN5c3RlbQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaG9zdG5hbWUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY3JlYXRlUmVzcG9uc2UiPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgVGhpcyBpcyBvdXIgZGVwbG95bWVudCByZXNwb25zZS4KLSAgICAgICAgICAgICAgSXQgY29uc2lzdHMgb2YgYSByZWZlcmVuY2UgdG8gdGhlIHN5c3RlbSwgCi0gICAgICAgICAgICAgIHdoaWNoIGNhbiB0aGVuIGJlIHVzZWQgZGlyZWN0bHkKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlJlc291cmNlSWQiIHR5cGU9InhzZDphbnlVUkkiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzeXN0ZW1SZWZlcmVuY2UiIHR5cGU9ImFwaTp1bmJvdW5kZWRYTUxBbnlOYW1lc3BhY2UiLz4KLSAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgCi0gICAgPC94c2Q6c2NoZW1hPgotICAgIAotICAgPC93c2RsOnR5cGVzPgotICAKLSAgIAotICA8d3NkbDptZXNzYWdlIG5hbWU9ImNyZWF0ZVJlcXVlc3QiPgotICAgIDx3c2RsOnBhcnQgZWxlbWVudD0iYXBpOmNyZWF0ZVJlcXVlc3QiIG5hbWU9ImNyZWF0ZVJlcXVlc3QiLz4KLSAgPC93c2RsOm1lc3NhZ2U+Ci0KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJjcmVhdGVSZXNwb25zZSI+Ci0gICAgPHdzZGw6cGFydCBlbGVtZW50PSJhcGk6Y3JlYXRlUmVzcG9uc2UiIG5hbWU9ImNyZWF0ZVJlc3BvbnNlIi8+Ci0gIDwvd3NkbDptZXNzYWdlPgotICAKLSA8d3NkbDpwb3J0VHlwZSBuYW1lPSJQb3J0YWxFUFIiCi0gICAgPgotICAgIAotICAgIDwhLS0gY3JlYXRlIC0tPgotICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJDcmVhdGUiPgotICAgICAgPHdzZGw6aW5wdXQgbWVzc2FnZT0idG5zOmNyZWF0ZVJlcXVlc3QiIG5hbWU9IkNyZWF0ZVJlcXVlc3QiLz4KLSAgICAgIDx3c2RsOm91dHB1dCBtZXNzYWdlPSJ0bnM6Y3JlYXRlUmVzcG9uc2UiIG5hbWU9IkNyZWF0ZVJlc3BvbnNlIi8+Ci0gICAgICA8d3NkbDpmYXVsdCBuYW1lPSJEZXBsb3ltZW50RmF1bHQiCi0gICAgICAgIG1lc3NhZ2U9InRuczpEZXBsb3ltZW50RmF1bHQiLz4KLSAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgIAotICAgIDwvd3NkbDpwb3J0VHlwZT4KLSAgCi0gIDx3c2RsOmJpbmRpbmcgbmFtZT0iUG9ydGFsRVBSQmluZGluZyIgdHlwZT0idG5zOlBvcnRhbEVQUiI+Ci0gICAgPHdzZGxzb2FwOmJpbmRpbmcgc3R5bGU9ImRvY3VtZW50IgotICAgICAgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiLz4KLSAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9IkNyZWF0ZSI+Ci0gICAgICA8d3NkbHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICA8d3NkbDppbnB1dCBuYW1lPSJDcmVhdGVSZXF1ZXN0Ij4KLSAgICAgICAgPHdzZGxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICA8d3NkbDpvdXRwdXQgbmFtZT0iQ3JlYXRlUmVzcG9uc2UiPgotICAgICAgICA8d3NkbHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgIDwvd3NkbDpvdXRwdXQ+Ci08IS0tICAgICAgIDx3c2RsOmZhdWx0IG5hbWU9IkRlcGxveW1lbnRGYXVsdCI+Ci0gICAgICAgIDx3c2Rsc29hcDpmYXVsdCBuYW1lPSJEZXBsb3ltZW50RmF1bHQiIHVzZT0ibGl0ZXJhbCIvPgotICAgICAgPC93c2RsOmZhdWx0PiAtLT4KLSAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgIAotICA8L3dzZGw6YmluZGluZz4KLSAgICAgIAotICA8L3dzZGw6ZGVmaW5pdGlvbnM+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy94bWxiZWFucy90ZXN0LXJlc291cmNlcy9waW5nLW1vZC54c2QgYi92MS41LjFSQzMvbW9kdWxlcy94bWxiZWFucy90ZXN0LXJlc291cmNlcy9waW5nLW1vZC54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhOTM3MjYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMveG1sYmVhbnMvdGVzdC1yZXNvdXJjZXMvcGluZy1tb2QueHNkCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08czpzY2hlbWEgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3htbHNvYXAub3JnL1BpbmciIHhtbG5zOnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4KLSAgICAgICAgICAgIDxzOmltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzcy8yMDA0LzAxL29hc2lzLTIwMDQwMS13c3Mtd3NzZWN1cml0eS11dGlsaXR5LTEuMC54c2QiLz4KLSAgICAgICAgICAgIDxzOmVsZW1lbnQgbmFtZT0iUGluZyIgbmlsbGFibGU9InRydWUiIHR5cGU9InRuczpwaW5nIi8+Ci0gICAgICAgICAgICA8czpjb21wbGV4VHlwZSBuYW1lPSJwaW5nIj4KLSAgICAgICAgICAgICAgICA8czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0idGlja2V0IiB0eXBlPSJ0bnM6dGlja2V0VHlwZSIvPgotICAgICAgICAgICAgICAgICAgICA8czplbGVtZW50IG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiBuYW1lPSJ0ZXh0IiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0iczpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICA8L3M6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3M6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8czpjb21wbGV4VHlwZSBuYW1lPSJ0aWNrZXRUeXBlIj4KLSAgICAgICAgICAgICAgICA8czpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgICAgICAgICA8czpleHRlbnNpb24gYmFzZT0iczpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICAgICAgPHM6YXR0cmlidXRlIHJlZj0iczE6SWQiLz4KLSAgICAgICAgICAgICAgICAgICAgPC9zOmV4dGVuc2lvbj4KLSAgICAgICAgICAgICAgICA8L3M6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgIDwvczpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDxzOmVsZW1lbnQgbmFtZT0iUGluZ1Jlc3BvbnNlIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0idG5zOnBpbmdSZXNwb25zZSIvPgotICAgICAgICAgICAgPHM6Y29tcGxleFR5cGUgbmFtZT0icGluZ1Jlc3BvbnNlIj4KLSAgICAgICAgICAgICAgICA8czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHM6ZWxlbWVudCBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgbmFtZT0idGV4dCIgbmlsbGFibGU9InRydWUiIHR5cGU9InM6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgPC9zOnNlcXVlbmNlPgotICAgICAgICAgICAgPC9zOmNvbXBsZXhUeXBlPgotICAgICAgICA8L3M6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMveG1sYmVhbnMvdGVzdC1yZXNvdXJjZXMvcGluZy1tb2RpZmllZC53c2RsIGIvdjEuNS4xUkMzL21vZHVsZXMveG1sYmVhbnMvdGVzdC1yZXNvdXJjZXMvcGluZy1tb2RpZmllZC53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTc5M2M2Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3htbGJlYW5zL3Rlc3QtcmVzb3VyY2VzL3BpbmctbW9kaWZpZWQud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxkZWZpbml0aW9ucyB4bWxuczpzMT0iaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NzLzIwMDQvMDEvb2FzaXMtMjAwNDAxLXdzcy13c3NlY3VyaXR5LXV0aWxpdHktMS4wLnhzZCIKLSAgICAgICAgICAgICB4bWxuczpodHRwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL2h0dHAvIgotICAgICAgICAgICAgIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iCi0gICAgICAgICAgICAgeG1sbnM6cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgICAgICAgeG1sbnM6dG5zPSJodHRwOi8veG1sc29hcC5vcmcvUGluZyIKLSAgICAgICAgICAgICB4bWxuczpzb2FwZW5jPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIKLSAgICAgICAgICAgICB4bWxuczp0bT0iaHR0cDovL21pY3Jvc29mdC5jb20vd3NkbC9taW1lL3RleHRNYXRjaGluZy8iCi0gICAgICAgICAgICAgeG1sbnM6bWltZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9taW1lLyIKLSAgICAgICAgICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly94bWxzb2FwLm9yZy9QaW5nIgotICAgICAgICAgICAgIHhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0gICAgPHR5cGVzPgotICAgICAgICA8czpzY2hlbWE+Ci0gICAgICAgPHM6aW1wb3J0Ci0gICAgICAgICBuYW1lc3BhY2U9Imh0dHA6Ly94bWxzb2FwLm9yZy9QaW5nIiAKLSAgICAgICAgIHNjaGVtYUxvY2F0aW9uPSJwaW5nLW1vZC54c2QiIC8+Ci0gICAgIDwvczpzY2hlbWE+Ci0KLSAgICAgICAgPHM6c2NoZW1hIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzcy8yMDA0LzAxL29hc2lzLTIwMDQwMS13c3Mtd3NzZWN1cml0eS11dGlsaXR5LTEuMC54c2QiPgotICAgICAgICAgICAgPHM6YXR0cmlidXRlIG5hbWU9IklkIiB0eXBlPSJzOnN0cmluZyIvPgotICAgICAgICA8L3M6c2NoZW1hPgotICAgIDwvdHlwZXM+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iUGluZ1JlcXVlc3QiPgotICAgICAgICA8cGFydCBuYW1lPSJwaW5nIiBlbGVtZW50PSJ0bnM6UGluZyIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJQaW5nUmVzcG9uc2UiPgotICAgICAgICA8cGFydCBuYW1lPSJwaW5nUmVzcG9uc2UiIGVsZW1lbnQ9InRuczpQaW5nUmVzcG9uc2UiLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPHBvcnRUeXBlIG5hbWU9IlBpbmdQb3J0Ij4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJQaW5nIj4KLSAgICAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6UGluZ1JlcXVlc3QiLz4KLSAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOlBpbmdSZXNwb25zZSIvPgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICA8L3BvcnRUeXBlPgotICAgIDxiaW5kaW5nIG5hbWU9IlBpbmdCaW5kaW5nIiB0eXBlPSJ0bnM6UGluZ1BvcnQiPgotICAgICAgICA8c29hcDpiaW5kaW5nIHN0eWxlPSJkb2N1bWVudCIgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiLz4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJQaW5nIj4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJQaW5nIiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDxpbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgIDxvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvb3V0cHV0PgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICA8L2JpbmRpbmc+Ci0gICAgPHNlcnZpY2UgbmFtZT0iUGluZ1NlcnZpY2UiPgotICAgICAgICA8cG9ydCBuYW1lPSJQaW5nMSIgYmluZGluZz0idG5zOlBpbmdCaW5kaW5nIj4KLSAgICAgICAgICAgIDxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6OTA4MC9waW5nc2VydmljZS9QaW5nMSIvPgotICAgICAgICA8L3BvcnQ+Ci0gICAgICAgIDxwb3J0IG5hbWU9IlBpbmcyIiBiaW5kaW5nPSJ0bnM6UGluZ0JpbmRpbmciPgotICAgICAgICAgICAgPHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo5MDgwL3BpbmdzZXJ2aWNlL1BpbmcyIi8+Ci0gICAgICAgIDwvcG9ydD4KLSAgICAgICAgPHBvcnQgbmFtZT0iUGluZzJhIiBiaW5kaW5nPSJ0bnM6UGluZ0JpbmRpbmciPgotICAgICAgICAgICAgPHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo5MDgwL3BpbmdzZXJ2aWNlL1BpbmcyYSIvPgotICAgICAgICA8L3BvcnQ+Ci0gICAgICAgIDxwb3J0IG5hbWU9IlBpbmczIiBiaW5kaW5nPSJ0bnM6UGluZ0JpbmRpbmciPgotICAgICAgICAgICAgPHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo5MDgwL3BpbmdzZXJ2aWNlL1BpbmczIi8+Ci0gICAgICAgIDwvcG9ydD4KLSAgICAgICAgPHBvcnQgbmFtZT0iUGluZzQiIGJpbmRpbmc9InRuczpQaW5nQmluZGluZyI+Ci0gICAgICAgICAgICA8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjkwODAvcGluZ3NlcnZpY2UvUGluZzQiLz4KLSAgICAgICAgPC9wb3J0PgotICAgICAgICA8cG9ydCBuYW1lPSJQaW5nNSIgYmluZGluZz0idG5zOlBpbmdCaW5kaW5nIj4KLSAgICAgICAgICAgIDxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6OTA4MC9waW5nc2VydmljZS9QaW5nNSIvPgotICAgICAgICA8L3BvcnQ+Ci0gICAgICAgIDxwb3J0IG5hbWU9IlBpbmc2IiBiaW5kaW5nPSJ0bnM6UGluZ0JpbmRpbmciPgotICAgICAgICAgICAgPHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo5MDgwL3BpbmdzZXJ2aWNlL1Bpbmc2Ii8+Ci0gICAgICAgIDwvcG9ydD4KLSAgICAgICAgPHBvcnQgbmFtZT0iUGluZzciIGJpbmRpbmc9InRuczpQaW5nQmluZGluZyI+Ci0gICAgICAgICAgICA8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjkwODAvcGluZ3NlcnZpY2UvUGluZzciLz4KLSAgICAgICAgPC9wb3J0PgotICAgICAgICA8cG9ydCBuYW1lPSJTVFBpbmcxIiBiaW5kaW5nPSJ0bnM6UGluZ0JpbmRpbmciPgotICAgICAgICAgICAgPHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo5MDgwL3BpbmdzZXJ2aWNlL1NUUGluZzEiLz4KLSAgICAgICAgPC9wb3J0PgotICAgICAgICA8cG9ydCBuYW1lPSJTVFBpbmczIiBiaW5kaW5nPSJ0bnM6UGluZ0JpbmRpbmciPgotICAgICAgICAgICAgPHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo5MDgwL3BpbmdzZXJ2aWNlL1NUUGluZzMiLz4KLSAgICAgICAgPC9wb3J0PgotICAgICAgICA8cG9ydCBuYW1lPSJTVFBpbmc0IiBiaW5kaW5nPSJ0bnM6UGluZ0JpbmRpbmciPgotICAgICAgICAgICAgPHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo5MDgwL3BpbmdzZXJ2aWNlL1NUUGluZzQiLz4KLSAgICAgICAgPC9wb3J0PgotICAgICAgICAKLSAgICA8L3NlcnZpY2U+Ci08L2RlZmluaXRpb25zPgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMveG1sYmVhbnMvdGVzdC1yZXNvdXJjZXMvcGluZy11bmJvdW5kLndzZGwgYi92MS41LjFSQzMvbW9kdWxlcy94bWxiZWFucy90ZXN0LXJlc291cmNlcy9waW5nLXVuYm91bmQud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmUyNjYxZC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy94bWxiZWFucy90ZXN0LXJlc291cmNlcy9waW5nLXVuYm91bmQud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGRlZmluaXRpb25zIHhtbG5zOnMxPSJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c3MvMjAwNC8wMS9vYXNpcy0yMDA0MDEtd3NzLXdzc2VjdXJpdHktdXRpbGl0eS0xLjAueHNkIgotICAgICAgICAgICAgIHhtbG5zOmh0dHA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvaHR0cC8iCi0gICAgICAgICAgICAgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIKLSAgICAgICAgICAgICB4bWxuczpzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgICAgICB4bWxuczp0bnM9Imh0dHA6Ly94bWxzb2FwLm9yZy9QaW5nIgotICAgICAgICAgICAgIHhtbG5zOnNvYXBlbmM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIgotICAgICAgICAgICAgIHhtbG5zOnRtPSJodHRwOi8vbWljcm9zb2Z0LmNvbS93c2RsL21pbWUvdGV4dE1hdGNoaW5nLyIKLSAgICAgICAgICAgICB4bWxuczptaW1lPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL21pbWUvIgotICAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3htbHNvYXAub3JnL1BpbmciCi0gICAgICAgICAgICAgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLSAgICA8dHlwZXM+Ci0gICAgICAgIDxzOnNjaGVtYSBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8veG1sc29hcC5vcmcvUGluZyI+Ci0gICAgICAgICAgICA8czppbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c3MvMjAwNC8wMS9vYXNpcy0yMDA0MDEtd3NzLXdzc2VjdXJpdHktdXRpbGl0eS0xLjAueHNkIi8+Ci0gICAgICAgICAgICA8czplbGVtZW50IG5hbWU9IlBpbmciIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ0bnM6cGluZyIvPgotICAgICAgICAgICAgPHM6Y29tcGxleFR5cGUgbmFtZT0icGluZyI+Ci0gICAgICAgICAgICAgICAgPHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDxzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9InRpY2tldCIgdHlwZT0idG5zOnRpY2tldFR5cGUiLz4KLSAgICAgICAgICAgICAgICAgICAgPHM6ZWxlbWVudCBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgbmFtZT0idGV4dCIgbmlsbGFibGU9InRydWUiIHR5cGU9InM6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgPC9zOnNlcXVlbmNlPgotICAgICAgICAgICAgPC9zOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHM6Y29tcGxleFR5cGUgbmFtZT0idGlja2V0VHlwZSI+Ci0gICAgICAgICAgICAgICAgPHM6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgPHM6ZXh0ZW5zaW9uIGJhc2U9InM6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzOmF0dHJpYnV0ZSByZWY9InMxOklkIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwvczpleHRlbnNpb24+Ci0gICAgICAgICAgICAgICAgPC9zOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICA8L3M6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8czplbGVtZW50IG5hbWU9IlBpbmdSZXNwb25zZSIgbmlsbGFibGU9InRydWUiIHR5cGU9InRuczpwaW5nUmVzcG9uc2UiLz4KLSAgICAgICAgICAgIDxzOmNvbXBsZXhUeXBlIG5hbWU9InBpbmdSZXNwb25zZSI+Ci0gICAgICAgICAgICAgICAgPHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDxzOmVsZW1lbnQgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIG5hbWU9InRleHQiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJzOnN0cmluZyIvPgotICAgICAgICAgICAgICAgIDwvczpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwvczpjb21wbGV4VHlwZT4KLSAgICAgICAgPC9zOnNjaGVtYT4KLSAgICAgICAgPHM6c2NoZW1hIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzcy8yMDA0LzAxL29hc2lzLTIwMDQwMS13c3Mtd3NzZWN1cml0eS11dGlsaXR5LTEuMC54c2QiPgotICAgICAgICAgICAgPHM6YXR0cmlidXRlIG5hbWU9IklkIiB0eXBlPSJzOnN0cmluZyIvPgotICAgICAgICA8L3M6c2NoZW1hPgotICAgIDwvdHlwZXM+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iUGluZ1JlcXVlc3QiPgotICAgICAgICA8cGFydCBuYW1lPSJwaW5nIiBlbGVtZW50PSJ0bnM6UGluZyIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJQaW5nUmVzcG9uc2UiPgotICAgICAgICA8cGFydCBuYW1lPSJwaW5nUmVzcG9uc2UiIGVsZW1lbnQ9InRuczpQaW5nUmVzcG9uc2UiLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPHBvcnRUeXBlIG5hbWU9IlBpbmdQb3J0Ij4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJQaW5nIj4KLSAgICAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6UGluZ1JlcXVlc3QiLz4KLSAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOlBpbmdSZXNwb25zZSIvPgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICA8L3BvcnRUeXBlPgotICAgIDwhLS0gQmluZGluZ3MgYXJlIHJlbW92ZWQgLS0+Ci08L2RlZmluaXRpb25zPgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMveG1sYmVhbnMvdGVzdC1yZXNvdXJjZXMvcGluZy53c2RsIGIvdjEuNS4xUkMzL21vZHVsZXMveG1sYmVhbnMvdGVzdC1yZXNvdXJjZXMvcGluZy53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTJjOTc4Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3htbGJlYW5zL3Rlc3QtcmVzb3VyY2VzL3Bpbmcud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxkZWZpbml0aW9ucyB4bWxuczpzMT0iaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NzLzIwMDQvMDEvb2FzaXMtMjAwNDAxLXdzcy13c3NlY3VyaXR5LXV0aWxpdHktMS4wLnhzZCIKLSAgICAgICAgICAgICB4bWxuczpodHRwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL2h0dHAvIgotICAgICAgICAgICAgIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iCi0gICAgICAgICAgICAgeG1sbnM6cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgICAgICAgeG1sbnM6dG5zPSJodHRwOi8veG1sc29hcC5vcmcvUGluZyIKLSAgICAgICAgICAgICB4bWxuczpzb2FwZW5jPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIKLSAgICAgICAgICAgICB4bWxuczp0bT0iaHR0cDovL21pY3Jvc29mdC5jb20vd3NkbC9taW1lL3RleHRNYXRjaGluZy8iCi0gICAgICAgICAgICAgeG1sbnM6bWltZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9taW1lLyIKLSAgICAgICAgICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly94bWxzb2FwLm9yZy9QaW5nIgotICAgICAgICAgICAgIHhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0gICAgPHR5cGVzPgotICAgICAgICA8czpzY2hlbWEgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3htbHNvYXAub3JnL1BpbmciPgotICAgICAgICAgICAgPHM6aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NzLzIwMDQvMDEvb2FzaXMtMjAwNDAxLXdzcy13c3NlY3VyaXR5LXV0aWxpdHktMS4wLnhzZCIvPgotICAgICAgICAgICAgPHM6ZWxlbWVudCBuYW1lPSJQaW5nIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0idG5zOnBpbmciLz4KLSAgICAgICAgICAgIDxzOmNvbXBsZXhUeXBlIG5hbWU9InBpbmciPgotICAgICAgICAgICAgICAgIDxzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJ0aWNrZXQiIHR5cGU9InRuczp0aWNrZXRUeXBlIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxzOmVsZW1lbnQgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIG5hbWU9InRleHQiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJzOnN0cmluZyIvPgotICAgICAgICAgICAgICAgIDwvczpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwvczpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDxzOmNvbXBsZXhUeXBlIG5hbWU9InRpY2tldFR5cGUiPgotICAgICAgICAgICAgICAgIDxzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDxzOmV4dGVuc2lvbiBiYXNlPSJzOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8czphdHRyaWJ1dGUgcmVmPSJzMTpJZCIvPgotICAgICAgICAgICAgICAgICAgICA8L3M6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgICAgIDwvczpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgPC9zOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHM6ZWxlbWVudCBuYW1lPSJQaW5nUmVzcG9uc2UiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ0bnM6cGluZ1Jlc3BvbnNlIi8+Ci0gICAgICAgICAgICA8czpjb21wbGV4VHlwZSBuYW1lPSJwaW5nUmVzcG9uc2UiPgotICAgICAgICAgICAgICAgIDxzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8czplbGVtZW50IG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiBuYW1lPSJ0ZXh0IiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0iczpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICA8L3M6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3M6Y29tcGxleFR5cGU+Ci0gICAgICAgIDwvczpzY2hlbWE+Ci0gICAgICAgIDxzOnNjaGVtYSBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c3MvMjAwNC8wMS9vYXNpcy0yMDA0MDEtd3NzLXdzc2VjdXJpdHktdXRpbGl0eS0xLjAueHNkIj4KLSAgICAgICAgICAgIDxzOmF0dHJpYnV0ZSBuYW1lPSJJZCIgdHlwZT0iczpzdHJpbmciLz4KLSAgICAgICAgPC9zOnNjaGVtYT4KLSAgICA8L3R5cGVzPgotICAgIDxtZXNzYWdlIG5hbWU9IlBpbmdSZXF1ZXN0Ij4KLSAgICAgICAgPHBhcnQgbmFtZT0icGluZyIgZWxlbWVudD0idG5zOlBpbmciLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iUGluZ1Jlc3BvbnNlIj4KLSAgICAgICAgPHBhcnQgbmFtZT0icGluZ1Jlc3BvbnNlIiBlbGVtZW50PSJ0bnM6UGluZ1Jlc3BvbnNlIi8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxwb3J0VHlwZSBuYW1lPSJQaW5nUG9ydCI+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iUGluZyI+Ci0gICAgICAgICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOlBpbmdSZXF1ZXN0Ii8+Ci0gICAgICAgICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczpQaW5nUmVzcG9uc2UiLz4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgPC9wb3J0VHlwZT4KLSAgICA8YmluZGluZyBuYW1lPSJQaW5nQmluZGluZyIgdHlwZT0idG5zOlBpbmdQb3J0Ij4KLSAgICAgICAgPHNvYXA6YmluZGluZyBzdHlsZT0iZG9jdW1lbnQiIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIi8+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iUGluZyI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iUGluZyIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvaW5wdXQ+Ci0gICAgICAgICAgICA8b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgPC9iaW5kaW5nPgotICAgIDxzZXJ2aWNlIG5hbWU9IlBpbmdTZXJ2aWNlIj4KLSAgICAgICAgPHBvcnQgbmFtZT0iUGluZzEiIGJpbmRpbmc9InRuczpQaW5nQmluZGluZyI+Ci0gICAgICAgICAgICA8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjkwODAvcGluZ3NlcnZpY2UvUGluZzEiLz4KLSAgICAgICAgPC9wb3J0PgotICAgICAgICA8cG9ydCBuYW1lPSJQaW5nMiIgYmluZGluZz0idG5zOlBpbmdCaW5kaW5nIj4KLSAgICAgICAgICAgIDxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6OTA4MC9waW5nc2VydmljZS9QaW5nMiIvPgotICAgICAgICA8L3BvcnQ+Ci0gICAgICAgIDxwb3J0IG5hbWU9IlBpbmcyYSIgYmluZGluZz0idG5zOlBpbmdCaW5kaW5nIj4KLSAgICAgICAgICAgIDxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6OTA4MC9waW5nc2VydmljZS9QaW5nMmEiLz4KLSAgICAgICAgPC9wb3J0PgotICAgICAgICA8cG9ydCBuYW1lPSJQaW5nMyIgYmluZGluZz0idG5zOlBpbmdCaW5kaW5nIj4KLSAgICAgICAgICAgIDxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6OTA4MC9waW5nc2VydmljZS9QaW5nMyIvPgotICAgICAgICA8L3BvcnQ+Ci0gICAgICAgIDxwb3J0IG5hbWU9IlBpbmc0IiBiaW5kaW5nPSJ0bnM6UGluZ0JpbmRpbmciPgotICAgICAgICAgICAgPHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo5MDgwL3BpbmdzZXJ2aWNlL1Bpbmc0Ii8+Ci0gICAgICAgIDwvcG9ydD4KLSAgICAgICAgPHBvcnQgbmFtZT0iUGluZzUiIGJpbmRpbmc9InRuczpQaW5nQmluZGluZyI+Ci0gICAgICAgICAgICA8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjkwODAvcGluZ3NlcnZpY2UvUGluZzUiLz4KLSAgICAgICAgPC9wb3J0PgotICAgICAgICA8cG9ydCBuYW1lPSJQaW5nNiIgYmluZGluZz0idG5zOlBpbmdCaW5kaW5nIj4KLSAgICAgICAgICAgIDxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6OTA4MC9waW5nc2VydmljZS9QaW5nNiIvPgotICAgICAgICA8L3BvcnQ+Ci0gICAgICAgIDxwb3J0IG5hbWU9IlBpbmc3IiBiaW5kaW5nPSJ0bnM6UGluZ0JpbmRpbmciPgotICAgICAgICAgICAgPHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo5MDgwL3BpbmdzZXJ2aWNlL1Bpbmc3Ii8+Ci0gICAgICAgIDwvcG9ydD4KLSAgICAgICAgPHBvcnQgbmFtZT0iU1RQaW5nMSIgYmluZGluZz0idG5zOlBpbmdCaW5kaW5nIj4KLSAgICAgICAgICAgIDxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6OTA4MC9waW5nc2VydmljZS9TVFBpbmcxIi8+Ci0gICAgICAgIDwvcG9ydD4KLSAgICAgICAgPHBvcnQgbmFtZT0iU1RQaW5nMyIgYmluZGluZz0idG5zOlBpbmdCaW5kaW5nIj4KLSAgICAgICAgICAgIDxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6OTA4MC9waW5nc2VydmljZS9TVFBpbmczIi8+Ci0gICAgICAgIDwvcG9ydD4KLSAgICAgICAgPHBvcnQgbmFtZT0iU1RQaW5nNCIgYmluZGluZz0idG5zOlBpbmdCaW5kaW5nIj4KLSAgICAgICAgICAgIDxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6OTA4MC9waW5nc2VydmljZS9TVFBpbmc0Ii8+Ci0gICAgICAgIDwvcG9ydD4KLSAgICAgICAgCi0gICAgPC9zZXJ2aWNlPgotPC9kZWZpbml0aW9ucz4KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3htbGJlYW5zL3Rlc3QtcmVzb3VyY2VzL3NpbXBsZS1kb2MtbGl0ZXJhbC53c2RsIGIvdjEuNS4xUkMzL21vZHVsZXMveG1sYmVhbnMvdGVzdC1yZXNvdXJjZXMvc2ltcGxlLWRvYy1saXRlcmFsLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkzNTdiNWEuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMveG1sYmVhbnMvdGVzdC1yZXNvdXJjZXMvc2ltcGxlLWRvYy1saXRlcmFsLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSw0NDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08ZGVmaW5pdGlvbnMKLSAgICB4bWxucz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iCi0gICAgeG1sbnM6dG5zPSJodHRwOi8vc29hcGludGVyb3Aub3JnL3dzZGwiCi0gICAgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIKLSAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgIHhtbG5zOm5zMj0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy90eXBlcyIKLSAgICB4bWxuczpuczM9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvdHlwZXMvcGFydCIKLSAgICB4bWxuczpuczQ9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvdHlwZXMvcmVxdWVzdHJlc3BvbnNlIgotICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy93c2RsIj4KLSAgICA8dHlwZXM+Ci0gICAgICAgIDxzY2hlbWEKLSAgICAgICAgICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgICAgIHhtbG5zOnRucz0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy90eXBlcyIKLSAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy90eXBlcyI+Ci0KLSAgICAgICAgICAgIDxjb21wbGV4VHlwZSBuYW1lPSJBcnJheU9mU3RyaW5nIj4KLSAgICAgICAgICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InZhbHVlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgICAgIDwvY29tcGxleFR5cGU+Ci0KLSAgICAgICAgICAgIDxjb21wbGV4VHlwZSBuYW1lPSJBcnJheU9mSW50Ij4KLSAgICAgICAgICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InZhbHVlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgICAgICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgICAgIDwvY29tcGxleFR5cGU+Ci0KLSAgICAgICAgICAgIDxjb21wbGV4VHlwZSBuYW1lPSJBcnJheU9mRmxvYXQiPgotICAgICAgICAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0idmFsdWUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHR5cGU9InhzZDpmbG9hdCIvPgotICAgICAgICAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICAgICA8L2NvbXBsZXhUeXBlPgotCi0gICAgICAgICAgICA8c2ltcGxlVHlwZSBuYW1lPSJFbnVtIj4KLSAgICAgICAgICAgICAgICA8cmVzdHJpY3Rpb24gYmFzZT0ieHNkOmludCI+Ci0gICAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IjIiLz4KLSAgICAgICAgICAgICAgICA8L3Jlc3RyaWN0aW9uPgotICAgICAgICAgICAgPC9zaW1wbGVUeXBlPgotCi0gICAgICAgIDwvc2NoZW1hPgotCi0gICAgICAgIDxzY2hlbWEKLSAgICAgICAgICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgICAgIHhtbG5zOnRucz0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy90eXBlcy9wYXJ0IgotICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnL3R5cGVzL3BhcnQiPgotCi0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJFbXB0eVBhcnQiPgotICAgICAgICAgICAgICAgIDxjb21wbGV4VHlwZS8+Ci0gICAgICAgICAgICA8L2VsZW1lbnQ+Ci0KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlN0cmluZ1BhcnQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkludFBhcnQiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkZsb2F0UGFydCIgdHlwZT0ieHNkOmZsb2F0Ii8+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJBcnJheU9mU3RyaW5nUGFydCIgdHlwZT0ibnMyOkFycmF5T2ZTdHJpbmciLz4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkFycmF5T2ZJbnRQYXJ0IiB0eXBlPSJuczI6QXJyYXlPZkludCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQXJyYXlPZkZsb2F0UGFydCIgdHlwZT0ibnMyOkFycmF5T2ZGbG9hdCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iU3RyaW5nMlBhcnQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkVudW1QYXJ0IiB0eXBlPSJuczI6RW51bSIvPgotCi0gICAgICAgIDwvc2NoZW1hPgotCi0gICAgICAgIDxzY2hlbWEKLSAgICAgICAgICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgICAgIHhtbG5zOnRucz0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy90eXBlcy9yZXF1ZXN0cmVzcG9uc2UiCi0gICAgICAgICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvdHlwZXMvcmVxdWVzdHJlc3BvbnNlIj4KLQotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iZWNob0VtcHR5RmF1bHRSZXF1ZXN0Ij4KLSAgICAgICAgICAgICAgICA8Y29tcGxleFR5cGUvPgotICAgICAgICAgICAgPC9lbGVtZW50PgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iZWNob0VtcHR5RmF1bHRSZXNwb25zZSI+Ci0gICAgICAgICAgICAgICAgPGNvbXBsZXhUeXBlLz4KLSAgICAgICAgICAgIDwvZWxlbWVudD4KLQotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iZWNob1N0cmluZ0ZhdWx0UmVxdWVzdCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iZWNob1N0cmluZ0ZhdWx0UmVzcG9uc2UiPgotICAgICAgICAgICAgICAgIDxjb21wbGV4VHlwZS8+Ci0gICAgICAgICAgICA8L2VsZW1lbnQ+Ci0KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImVjaG9JbnRBcnJheUZhdWx0UmVxdWVzdCIgdHlwZT0ibnMyOkFycmF5T2ZJbnQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImVjaG9JbnRBcnJheUZhdWx0UmVzcG9uc2UiPgotICAgICAgICAgICAgICAgIDxjb21wbGV4VHlwZS8+Ci0gICAgICAgICAgICA8L2VsZW1lbnQ+Ci0KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImVjaG9NdWx0aXBsZUZhdWx0czFSZXF1ZXN0Ij4KLSAgICAgICAgICAgICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IndoaWNoRmF1bHQiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InBhcmFtMSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0icGFyYW0yIiB0eXBlPSJuczI6QXJyYXlPZkZsb2F0Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwvZWxlbWVudD4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImVjaG9NdWx0aXBsZUZhdWx0czFSZXNwb25zZSI+Ci0gICAgICAgICAgICAgICAgPGNvbXBsZXhUeXBlLz4KLSAgICAgICAgICAgIDwvZWxlbWVudD4KLQotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iZWNob011bHRpcGxlRmF1bHRzMlJlcXVlc3QiPgotICAgICAgICAgICAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0id2hpY2hGYXVsdCIgdHlwZT0ieHNkOmludCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0icGFyYW0xIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJwYXJhbTIiIHR5cGU9InhzZDpmbG9hdCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0icGFyYW0zIiB0eXBlPSJuczI6QXJyYXlPZlN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L2VsZW1lbnQ+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJlY2hvTXVsdGlwbGVGYXVsdHMyUmVzcG9uc2UiPgotICAgICAgICAgICAgICAgIDxjb21wbGV4VHlwZS8+Ci0gICAgICAgICAgICA8L2VsZW1lbnQ+Ci0KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImVjaG9NdWx0aXBsZUZhdWx0czNSZXF1ZXN0Ij4KLSAgICAgICAgICAgICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IndoaWNoRmF1bHQiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InBhcmFtMSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0icGFyYW0yIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwvZWxlbWVudD4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImVjaG9NdWx0aXBsZUZhdWx0czNSZXNwb25zZSI+Ci0gICAgICAgICAgICAgICAgPGNvbXBsZXhUeXBlLz4KLSAgICAgICAgICAgIDwvZWxlbWVudD4KLQotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iZWNob011bHRpcGxlRmF1bHRzNFJlcXVlc3QiPgotICAgICAgICAgICAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0id2hpY2hGYXVsdCIgdHlwZT0ieHNkOmludCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0icGFyYW0xIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJwYXJhbTIiIHR5cGU9Im5zMjpFbnVtIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwvZWxlbWVudD4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImVjaG9NdWx0aXBsZUZhdWx0czRSZXNwb25zZSI+Ci0gICAgICAgICAgICAgICAgPGNvbXBsZXhUeXBlLz4KLSAgICAgICAgICAgIDwvZWxlbWVudD4KLQotICAgICAgICA8L3NjaGVtYT4KLSAgICA8L3R5cGVzPgotCi0gICAgPG1lc3NhZ2UgbmFtZT0iZWNob0VtcHR5RmF1bHRSZXF1ZXN0Ij4KLSAgICAgICAgPHBhcnQgbmFtZT0icGFyYW0iIGVsZW1lbnQ9Im5zNDplY2hvRW1wdHlGYXVsdFJlcXVlc3QiLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iZWNob0VtcHR5RmF1bHRSZXNwb25zZSI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9InBhcmFtIiBlbGVtZW50PSJuczQ6ZWNob0VtcHR5RmF1bHRSZXNwb25zZSIvPgotICAgIDwvbWVzc2FnZT4KLQotICAgIDxtZXNzYWdlIG5hbWU9ImVjaG9TdHJpbmdGYXVsdFJlcXVlc3QiPgotICAgICAgICA8cGFydCBuYW1lPSJwYXJhbSIgZWxlbWVudD0ibnM0OmVjaG9TdHJpbmdGYXVsdFJlcXVlc3QiLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iZWNob1N0cmluZ0ZhdWx0UmVzcG9uc2UiPgotICAgICAgICA8cGFydCBuYW1lPSJwYXJhbSIgZWxlbWVudD0ibnM0OmVjaG9TdHJpbmdGYXVsdFJlc3BvbnNlIi8+Ci0gICAgPC9tZXNzYWdlPgotCi0gICAgPG1lc3NhZ2UgbmFtZT0iZWNob0ludEFycmF5RmF1bHRSZXF1ZXN0Ij4KLSAgICAgICAgPHBhcnQgbmFtZT0icGFyYW0iIGVsZW1lbnQ9Im5zNDplY2hvSW50QXJyYXlGYXVsdFJlcXVlc3QiLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iZWNob0ludEFycmF5RmF1bHRSZXNwb25zZSI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9InBhcmFtIiBlbGVtZW50PSJuczQ6ZWNob0ludEFycmF5RmF1bHRSZXNwb25zZSIvPgotICAgIDwvbWVzc2FnZT4KLQotICAgIDxtZXNzYWdlIG5hbWU9ImVjaG9NdWx0aXBsZUZhdWx0czFSZXF1ZXN0Ij4KLSAgICAgICAgPHBhcnQgbmFtZT0icGFyYW0iIGVsZW1lbnQ9Im5zNDplY2hvTXVsdGlwbGVGYXVsdHMxUmVxdWVzdCIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJlY2hvTXVsdGlwbGVGYXVsdHMxUmVzcG9uc2UiPgotICAgICAgICA8cGFydCBuYW1lPSJwYXJhbSIgZWxlbWVudD0ibnM0OmVjaG9NdWx0aXBsZUZhdWx0czFSZXNwb25zZSIvPgotICAgIDwvbWVzc2FnZT4KLQotICAgIDxtZXNzYWdlIG5hbWU9ImVjaG9NdWx0aXBsZUZhdWx0czJSZXF1ZXN0Ij4KLSAgICAgICAgPHBhcnQgbmFtZT0icGFyYW0iIGVsZW1lbnQ9Im5zNDplY2hvTXVsdGlwbGVGYXVsdHMyUmVxdWVzdCIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJlY2hvTXVsdGlwbGVGYXVsdHMyUmVzcG9uc2UiPgotICAgICAgICA8cGFydCBuYW1lPSJwYXJhbSIgZWxlbWVudD0ibnM0OmVjaG9NdWx0aXBsZUZhdWx0czJSZXNwb25zZSIvPgotICAgIDwvbWVzc2FnZT4KLQotICAgIDxtZXNzYWdlIG5hbWU9ImVjaG9NdWx0aXBsZUZhdWx0czNSZXF1ZXN0Ij4KLSAgICAgICAgPHBhcnQgbmFtZT0icGFyYW0iIGVsZW1lbnQ9Im5zNDplY2hvTXVsdGlwbGVGYXVsdHMzUmVxdWVzdCIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJlY2hvTXVsdGlwbGVGYXVsdHMzUmVzcG9uc2UiPgotICAgICAgICA8cGFydCBuYW1lPSJwYXJhbSIgZWxlbWVudD0ibnM0OmVjaG9NdWx0aXBsZUZhdWx0czNSZXNwb25zZSIvPgotICAgIDwvbWVzc2FnZT4KLQotICAgIDxtZXNzYWdlIG5hbWU9ImVjaG9NdWx0aXBsZUZhdWx0czRSZXF1ZXN0Ij4KLSAgICAgICAgPHBhcnQgbmFtZT0icGFyYW0iIGVsZW1lbnQ9Im5zNDplY2hvTXVsdGlwbGVGYXVsdHM0UmVxdWVzdCIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJlY2hvTXVsdGlwbGVGYXVsdHM0UmVzcG9uc2UiPgotICAgICAgICA8cGFydCBuYW1lPSJwYXJhbSIgZWxlbWVudD0ibnM0OmVjaG9NdWx0aXBsZUZhdWx0czRSZXNwb25zZSIvPgotICAgIDwvbWVzc2FnZT4KLQotICAgIDwhLS0gRmF1bHQgbWVzc2FnZXMgLS0+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iRW1wdHlGYXVsdCI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9InBhcnQxIiBlbGVtZW50PSJuczM6RW1wdHlQYXJ0Ii8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9IlN0cmluZ0ZhdWx0Ij4KLSAgICAgICAgPHBhcnQgbmFtZT0icGFydDIiIGVsZW1lbnQ9Im5zMzpTdHJpbmdQYXJ0Ii8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9IkludEZhdWx0Ij4KLSAgICAgICAgPHBhcnQgbmFtZT0icGFydDMiIGVsZW1lbnQ9Im5zMzpJbnRQYXJ0Ii8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9IkZsb2F0RmF1bHQiPgotICAgICAgICA8cGFydCBuYW1lPSJwYXJ0NCIgZWxlbWVudD0ibnMzOkZsb2F0UGFydCIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJTdHJpbmdBcnJheUZhdWx0Ij4KLSAgICAgICAgPHBhcnQgbmFtZT0icGFydDUiIGVsZW1lbnQ9Im5zMzpBcnJheU9mU3RyaW5nUGFydCIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJJbnRBcnJheUZhdWx0Ij4KLSAgICAgICAgPHBhcnQgbmFtZT0icGFydDYiIGVsZW1lbnQ9Im5zMzpBcnJheU9mSW50UGFydCIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJGbG9hdEFycmF5RmF1bHQiPgotICAgICAgICA8cGFydCBuYW1lPSJwYXJ0NyIgZWxlbWVudD0ibnMzOkFycmF5T2ZGbG9hdFBhcnQiLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPCEtLQotICAgICAgICBQYXJ0IG5hbWUgc2FtZSBhcyBpbiBGYXVsdDIgbWVzc2FnZQotICAgIC0tPgotICAgIDxtZXNzYWdlIG5hbWU9IlN0cmluZzJGYXVsdCI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9InBhcnQyIiBlbGVtZW50PSJuczM6U3RyaW5nMlBhcnQiLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iRW51bUZhdWx0Ij4KLSAgICAgICAgPHBhcnQgbmFtZT0icGFydDkiIGVsZW1lbnQ9Im5zMzpFbnVtUGFydCIvPgotICAgIDwvbWVzc2FnZT4KLQotICAgIDxwb3J0VHlwZSBuYW1lPSJTaW1wbGVEb2NMaXRQb3J0VHlwZSI+Ci0gICAgICAgIDwhLS0KLSAgICAgICAgICAgIFRocm93cyBhbiBlbXB0eSBmYXVsdAotICAgICAgICAtLT4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvRW1wdHlGYXVsdCIgcGFyYW1ldGVyT3JkZXI9IiI+Ci0gICAgICAgICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmVjaG9FbXB0eUZhdWx0UmVxdWVzdCIvPgotICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6ZWNob0VtcHR5RmF1bHRSZXNwb25zZSIvPgotICAgICAgICAgICAgPGZhdWx0IG5hbWU9IlNpbXBsZUZhdWx0IiBtZXNzYWdlPSJ0bnM6RW1wdHlGYXVsdCIvPgotICAgICAgICA8L29wZXJhdGlvbj4KLQotICAgICAgICA8IS0tCi0gICAgICAgICAgICBUaHJvd3MgZmF1bHQgd2l0aCB4c2Q6c3RyaW5nIHBhcmFtZXRlcgotICAgICAgICAtLT4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvU3RyaW5nRmF1bHQiIHBhcmFtZXRlck9yZGVyPSJwYXJhbSI+Ci0gICAgICAgICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmVjaG9TdHJpbmdGYXVsdFJlcXVlc3QiLz4KLSAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmVjaG9TdHJpbmdGYXVsdFJlc3BvbnNlIi8+Ci0gICAgICAgICAgICA8ZmF1bHQgbmFtZT0iU2ltcGxlRmF1bHQiIG1lc3NhZ2U9InRuczpTdHJpbmdGYXVsdCIvPgotICAgICAgICA8L29wZXJhdGlvbj4KLQotICAgICAgICA8IS0tCi0gICAgICAgICAgICBUaHJvd3MgZmF1bHQgd2l0aCB4c2Q6aW50W10gcGFyYW1ldGVyCi0gICAgICAgIC0tPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9JbnRBcnJheUZhdWx0IiBwYXJhbWV0ZXJPcmRlcj0icGFyYW0iPgotICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczplY2hvSW50QXJyYXlGYXVsdFJlcXVlc3QiLz4KLSAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmVjaG9JbnRBcnJheUZhdWx0UmVzcG9uc2UiLz4KLSAgICAgICAgICAgIDxmYXVsdCBuYW1lPSJTaW1wbGVGYXVsdCIgbWVzc2FnZT0idG5zOkludEFycmF5RmF1bHQiLz4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0KLSAgICAgICAgPCEtLQotICAgICAgICAgICAgVGhyb3dzIGVtcHR5IGZhdWx0LCBmYXVsdCB3aXRoIGEgeHNkOnN0cmluZwotICAgICAgICAgICAgcGFyYW1ldGVyIGFuZCBmYXVsdCB3aXRoIHhzZDpmbG9hdFtdIHBhcmFtZXRlcgotICAgICAgICAtLT4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvTXVsdGlwbGVGYXVsdHMxIiBwYXJhbWV0ZXJPcmRlcj0icGFyYW0iPgotICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczplY2hvTXVsdGlwbGVGYXVsdHMxUmVxdWVzdCIvPgotICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6ZWNob011bHRpcGxlRmF1bHRzMVJlc3BvbnNlIi8+Ci0gICAgICAgICAgICA8ZmF1bHQgbmFtZT0iU2ltcGxlRmF1bHQxIiBtZXNzYWdlPSJ0bnM6RW1wdHlGYXVsdCIvPgotICAgICAgICAgICAgPGZhdWx0IG5hbWU9IlNpbXBsZUZhdWx0MiIgbWVzc2FnZT0idG5zOlN0cmluZ0ZhdWx0Ii8+Ci0gICAgICAgICAgICA8ZmF1bHQgbmFtZT0iU2ltcGxlRmF1bHQzIiBtZXNzYWdlPSJ0bnM6RmxvYXRBcnJheUZhdWx0Ii8+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotCi0gICAgICAgIDwhLS0KLSAgICAgICAgICAgIFRocm93cyBmYXVsdCB3aXRoIHhzZDpzdHJpbmcgcGFyYW1ldGVyLCBmYXVsdCB3aXRoCi0gICAgICAgICAgICB4c2Q6ZmxvYXQgcGFyYW1ldGVyIGFuZCBmYXVsdCB3aXRoIHhzZDpzdHJpbmdbXQotICAgICAgICAgICAgcGFyYW1ldGVycwotICAgICAgICAtLT4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvTXVsdGlwbGVGYXVsdHMyIiBwYXJhbWV0ZXJPcmRlcj0icGFyYW0iPgotICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczplY2hvTXVsdGlwbGVGYXVsdHMyUmVxdWVzdCIvPgotICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6ZWNob011bHRpcGxlRmF1bHRzMlJlc3BvbnNlIi8+Ci0gICAgICAgICAgICA8ZmF1bHQgbmFtZT0iU2ltcGxlRmF1bHQxIiBtZXNzYWdlPSJ0bnM6U3RyaW5nRmF1bHQiLz4KLSAgICAgICAgICAgIDxmYXVsdCBuYW1lPSJTaW1wbGVGYXVsdDIiIG1lc3NhZ2U9InRuczpGbG9hdEZhdWx0Ii8+Ci0gICAgICAgICAgICA8ZmF1bHQgbmFtZT0iU2ltcGxlRmF1bHQzIiBtZXNzYWdlPSJ0bnM6U3RyaW5nQXJyYXlGYXVsdCIvPgotICAgICAgICA8L29wZXJhdGlvbj4KLQotICAgICAgICA8IS0tCi0gICAgICAgICAgICBUaHJvd3MgdHdvIGZhdWx0cywgZWFjaCB3aXRoIHhzZDpzdHJpbmcgcGFyYW1ldGVycwotICAgICAgICAgICAgYW5kIHNhbWUgcGFydCBuYW1lcwotICAgICAgICAtLT4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvTXVsdGlwbGVGYXVsdHMzIiBwYXJhbWV0ZXJPcmRlcj0icGFyYW0iPgotICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczplY2hvTXVsdGlwbGVGYXVsdHMzUmVxdWVzdCIvPgotICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6ZWNob011bHRpcGxlRmF1bHRzM1Jlc3BvbnNlIi8+Ci0gICAgICAgICAgICA8ZmF1bHQgbmFtZT0iU2ltcGxlRmF1bHQxIiBtZXNzYWdlPSJ0bnM6U3RyaW5nRmF1bHQiLz4KLSAgICAgICAgICAgIDxmYXVsdCBuYW1lPSJTaW1wbGVGYXVsdDIiIG1lc3NhZ2U9InRuczpTdHJpbmcyRmF1bHQiLz4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0KLSAgICAgICAgPCEtLQotICAgICAgICAgICAgVGhyb3dzIGZhdWx0IHdpdGggeHNkOmludCBwYXJhbWV0ZXIgYW5kIGZhdWx0IHdpdGggYW4KLSAgICAgICAgICAgIGludCBlbnVtZXJhdGlvbiBwYXJhbWV0ZXIKLSAgICAgICAgLS0+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob011bHRpcGxlRmF1bHRzNCIgcGFyYW1ldGVyT3JkZXI9InBhcmFtIj4KLSAgICAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6ZWNob011bHRpcGxlRmF1bHRzNFJlcXVlc3QiLz4KLSAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmVjaG9NdWx0aXBsZUZhdWx0czRSZXNwb25zZSIvPgotICAgICAgICAgICAgPGZhdWx0IG5hbWU9IlNpbXBsZUZhdWx0MSIgbWVzc2FnZT0idG5zOkludEZhdWx0Ii8+Ci0gICAgICAgICAgICA8ZmF1bHQgbmFtZT0iU2ltcGxlRmF1bHQyIiBtZXNzYWdlPSJ0bnM6RW51bUZhdWx0Ii8+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotICAgIDwvcG9ydFR5cGU+Ci0KLSAgICA8YmluZGluZyBuYW1lPSJTaW1wbGVEb2NMaXRCaW5kaW5nIiB0eXBlPSJ0bnM6U2ltcGxlRG9jTGl0UG9ydFR5cGUiPgotICAgICAgICA8c29hcDpiaW5kaW5nIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIiBzdHlsZT0iZG9jdW1lbnQiLz4KLQotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9FbXB0eUZhdWx0Ij4KLSAgICAgICAgICAgIDxpbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgIDxvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvb3V0cHV0PgotICAgICAgICAgICAgPGZhdWx0IG5hbWU9IlNpbXBsZUZhdWx0Ij4KLSAgICAgICAgICAgICAgICA8c29hcDpmYXVsdCBuYW1lPSJTaW1wbGVGYXVsdCIgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L2ZhdWx0PgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvcjQvZ3JvdXBnLyIvPgotICAgICAgICA8L29wZXJhdGlvbj4KLQotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9TdHJpbmdGYXVsdCI+Ci0gICAgICAgICAgICA8aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvaW5wdXQ+Ci0gICAgICAgICAgICA8b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgICAgIDxmYXVsdCBuYW1lPSJTaW1wbGVGYXVsdCI+Ci0gICAgICAgICAgICAgICAgPHNvYXA6ZmF1bHQgbmFtZT0iU2ltcGxlRmF1bHQiIHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC9mYXVsdD4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vc29hcGludGVyb3Aub3JnL3I0L2dyb3VwZy8iLz4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvSW50QXJyYXlGYXVsdCI+Ci0gICAgICAgICAgICA8aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvaW5wdXQ+Ci0gICAgICAgICAgICA8b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgICAgIDxmYXVsdCBuYW1lPSJTaW1wbGVGYXVsdCI+Ci0gICAgICAgICAgICAgICAgPHNvYXA6ZmF1bHQgbmFtZT0iU2ltcGxlRmF1bHQiIHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC9mYXVsdD4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vc29hcGludGVyb3Aub3JnL3I0L2dyb3VwZy8iLz4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvTXVsdGlwbGVGYXVsdHMxIj4KLSAgICAgICAgICAgIDxpbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgIDxvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvb3V0cHV0PgotICAgICAgICAgICAgPGZhdWx0IG5hbWU9IlNpbXBsZUZhdWx0MSI+Ci0gICAgICAgICAgICAgICAgPHNvYXA6ZmF1bHQgbmFtZT0iU2ltcGxlRmF1bHQxIiB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvZmF1bHQ+Ci0gICAgICAgICAgICA8ZmF1bHQgbmFtZT0iU2ltcGxlRmF1bHQyIj4KLSAgICAgICAgICAgICAgICA8c29hcDpmYXVsdCBuYW1lPSJTaW1wbGVGYXVsdDIiIHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC9mYXVsdD4KLSAgICAgICAgICAgIDxmYXVsdCBuYW1lPSJTaW1wbGVGYXVsdDMiPgotICAgICAgICAgICAgICAgIDxzb2FwOmZhdWx0IG5hbWU9IlNpbXBsZUZhdWx0MyIgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L2ZhdWx0PgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvcjQvZ3JvdXBnLyIvPgotICAgICAgICA8L29wZXJhdGlvbj4KLQotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9NdWx0aXBsZUZhdWx0czIiPgotICAgICAgICAgICAgPGlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L2lucHV0PgotICAgICAgICAgICAgPG91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC9vdXRwdXQ+Ci0gICAgICAgICAgICA8ZmF1bHQgbmFtZT0iU2ltcGxlRmF1bHQxIj4KLSAgICAgICAgICAgICAgICA8c29hcDpmYXVsdCBuYW1lPSJTaW1wbGVGYXVsdDEiIHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC9mYXVsdD4KLSAgICAgICAgICAgIDxmYXVsdCBuYW1lPSJTaW1wbGVGYXVsdDIiPgotICAgICAgICAgICAgICAgIDxzb2FwOmZhdWx0IG5hbWU9IlNpbXBsZUZhdWx0MiIgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L2ZhdWx0PgotICAgICAgICAgICAgPGZhdWx0IG5hbWU9IlNpbXBsZUZhdWx0MyI+Ci0gICAgICAgICAgICAgICAgPHNvYXA6ZmF1bHQgbmFtZT0iU2ltcGxlRmF1bHQzIiB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvZmF1bHQ+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy9yNC9ncm91cGcvIi8+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotCi0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob011bHRpcGxlRmF1bHRzMyI+Ci0gICAgICAgICAgICA8aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvaW5wdXQ+Ci0gICAgICAgICAgICA8b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgICAgIDxmYXVsdCBuYW1lPSJTaW1wbGVGYXVsdDEiPgotICAgICAgICAgICAgICAgIDxzb2FwOmZhdWx0IG5hbWU9IlNpbXBsZUZhdWx0MSIgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L2ZhdWx0PgotICAgICAgICAgICAgPGZhdWx0IG5hbWU9IlNpbXBsZUZhdWx0MiI+Ci0gICAgICAgICAgICAgICAgPHNvYXA6ZmF1bHQgbmFtZT0iU2ltcGxlRmF1bHQyIiB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvZmF1bHQ+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy9yNC9ncm91cGcvIi8+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotCi0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob011bHRpcGxlRmF1bHRzNCI+Ci0gICAgICAgICAgICA8aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvaW5wdXQ+Ci0gICAgICAgICAgICA8b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgICAgIDxmYXVsdCBuYW1lPSJTaW1wbGVGYXVsdDEiPgotICAgICAgICAgICAgICAgIDxzb2FwOmZhdWx0IG5hbWU9IlNpbXBsZUZhdWx0MSIgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L2ZhdWx0PgotICAgICAgICAgICAgPGZhdWx0IG5hbWU9IlNpbXBsZUZhdWx0MiI+Ci0gICAgICAgICAgICAgICAgPHNvYXA6ZmF1bHQgbmFtZT0iU2ltcGxlRmF1bHQyIiB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvZmF1bHQ+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy9yNC9ncm91cGcvIi8+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotCi0gICAgPC9iaW5kaW5nPgotCi0gICAgPHNlcnZpY2UgbmFtZT0iU2ltcGxlRG9jTGl0U2VydmljZSI+Ci0gICAgICAgIDxwb3J0IG5hbWU9IlNpbXBsZURvY0xpdFBvcnQiIGJpbmRpbmc9InRuczpTaW1wbGVEb2NMaXRCaW5kaW5nIj4KLSAgICAgICAgICAgIDxzb2FwOmFkZHJlc3MKLSAgICAgICAgICAgICAgICBsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo4MDgwL2F4aXMvc2VydmljZXMvU2ltcGxlRG9jTGl0UG9ydCIvPgotICAgICAgICA8L3BvcnQ+Ci0gICAgPC9zZXJ2aWNlPgotPC9kZWZpbml0aW9ucz4KLQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMveG1sYmVhbnMvdGVzdC1yZXNvdXJjZXMvdW5yZWZlcmVuY2VkLndzZGwgYi92MS41LjFSQzMvbW9kdWxlcy94bWxiZWFucy90ZXN0LXJlc291cmNlcy91bnJlZmVyZW5jZWQud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDc3MmUxNy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy94bWxiZWFucy90ZXN0LXJlc291cmNlcy91bnJlZmVyZW5jZWQud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDM1MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxkZWZpbml0aW9ucwotCXhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIKLQl4bWxuczp0bnM9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvd3NkbCIKLQl4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIgotCXhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0JeG1sbnM6bnMyPSJodHRwOi8vc29hcGludGVyb3Aub3JnL3R5cGVzIgotCXhtbG5zOm5zMz0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy90eXBlcy9wYXJ0IgotCXhtbG5zOm5zND0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy90eXBlcy9yZXF1ZXN0cmVzcG9uc2UiCi0JdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnL3dzZGwiPgotCi0JPHR5cGVzPgotCQk8c2NoZW1hCi0JCQl4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0JCQl4bWxuczp0bnM9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvdHlwZXMiCi0JCQl0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvdHlwZXMiPgotCi0JCQk8aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLQotCQkJPGNvbXBsZXhUeXBlIG5hbWU9IlNPQVBTdHJ1Y3QiPgotCQkJCTxzZXF1ZW5jZT4KLQkJCQkJPGVsZW1lbnQgbmFtZT0idmFyU3RyaW5nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTxlbGVtZW50IG5hbWU9InZhckludCIgdHlwZT0ieHNkOmludCIvPgotCQkJCQk8ZWxlbWVudCBuYW1lPSJ2YXJGbG9hdCIgdHlwZT0ieHNkOmZsb2F0Ii8+Ci0JCQkJPC9zZXF1ZW5jZT4KLQkJCTwvY29tcGxleFR5cGU+Ci0KLQkJCTxjb21wbGV4VHlwZSBuYW1lPSJTT0FQU3RydWN0RmF1bHQiPgotCQkJCTxzZXF1ZW5jZT4KLQkJCQkJPGVsZW1lbnQgbmFtZT0ic29hcFN0cnVjdCIgdHlwZT0idG5zOlNPQVBTdHJ1Y3QiLz4KLQkJCQk8L3NlcXVlbmNlPgotCQkJPC9jb21wbGV4VHlwZT4KLQotCQkJPGNvbXBsZXhUeXBlIG5hbWU9IkJhc2VTdHJ1Y3QiPgotCQkJCTxzZXF1ZW5jZT4KLQkJCQkJPGVsZW1lbnQgbmFtZT0ic3RydWN0TWVzc2FnZSIgdHlwZT0idG5zOlNPQVBTdHJ1Y3QiLz4KLQkJCQkJPGVsZW1lbnQgbmFtZT0ic2hvcnRNZXNzYWdlIiB0eXBlPSJ4c2Q6c2hvcnQiLz4KLQkJCQk8L3NlcXVlbmNlPgotCQkJPC9jb21wbGV4VHlwZT4KLQotCQkJPGNvbXBsZXhUeXBlIG5hbWU9IkV4dGVuZGVkU3RydWN0Ij4KLQkJCQk8Y29tcGxleENvbnRlbnQ+Ci0JCQkJCTxleHRlbnNpb24gYmFzZT0idG5zOkJhc2VTdHJ1Y3QiPgotCQkJCQkJPHNlcXVlbmNlPgotCQkJCQkJCTxlbGVtZW50IG5hbWU9InN0cmluZ01lc3NhZ2UiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCQk8ZWxlbWVudCBuYW1lPSJpbnRNZXNzYWdlIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0JCQkJCQkJPGVsZW1lbnQgbmFtZT0iYW5vdGhlckludE1lc3NhZ2UiIHR5cGU9InhzZDppbnQiLz4KLQkJCQkJCTwvc2VxdWVuY2U+Ci0JCQkJCTwvZXh0ZW5zaW9uPgotCQkJCTwvY29tcGxleENvbnRlbnQ+Ci0JCQk8L2NvbXBsZXhUeXBlPgotCi0JCQk8Y29tcGxleFR5cGUgbmFtZT0iTW9yZUV4dGVuZGVkU3RydWN0Ij4KLQkJCQk8Y29tcGxleENvbnRlbnQ+Ci0JCQkJCTxleHRlbnNpb24gYmFzZT0idG5zOkV4dGVuZGVkU3RydWN0Ij4KLQkJCQkJCTxzZXF1ZW5jZT4KLQkJCQkJCQk8ZWxlbWVudCBuYW1lPSJib29sZWFuTWVzc2FnZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLQkJCQkJCTwvc2VxdWVuY2U+Ci0JCQkJCTwvZXh0ZW5zaW9uPgotCQkJCTwvY29tcGxleENvbnRlbnQ+Ci0JCQk8L2NvbXBsZXhUeXBlPgotCi0JCTwvc2NoZW1hPgotCi0JCTxzY2hlbWEKLQkJCXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLQkJCXhtbG5zOnRucz0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy90eXBlcy9wYXJ0IgotCQkJdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnL3R5cGVzL3BhcnQiPgotCi0JCQk8ZWxlbWVudCBuYW1lPSJTT0FQU3RydWN0RmF1bHRQYXJ0IiB0eXBlPSJuczI6U09BUFN0cnVjdEZhdWx0Ii8+Ci0JCQk8ZWxlbWVudCBuYW1lPSJCYXNlU3RydWN0UGFydCIgdHlwZT0ibnMyOkJhc2VTdHJ1Y3QiLz4KLQkJCTxlbGVtZW50IG5hbWU9IkV4dGVuZGVkU3RydWN0UGFydCIgdHlwZT0ibnMyOkV4dGVuZGVkU3RydWN0Ii8+Ci0JCQk8ZWxlbWVudCBuYW1lPSJNb3JlRXh0ZW5kZWRTdHJ1Y3RQYXJ0IiB0eXBlPSJuczI6TW9yZUV4dGVuZGVkU3RydWN0Ii8+Ci0KLQkJPC9zY2hlbWE+Ci0KLQkJPHNjaGVtYQotCQkJeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotCQkJeG1sbnM6dG5zPSJodHRwOi8vc29hcGludGVyb3Aub3JnL3R5cGVzL3JlcXVlc3RyZXNwb25zZSIKLQkJCXRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy90eXBlcy9yZXF1ZXN0cmVzcG9uc2UiPgotCi0JCQk8ZWxlbWVudCBuYW1lPSJlY2hvU09BUFN0cnVjdEZhdWx0UmVxdWVzdCIgdHlwZT0ibnMyOlNPQVBTdHJ1Y3QiLz4KLQkJCTxlbGVtZW50IG5hbWU9ImVjaG9TT0FQU3RydWN0RmF1bHRSZXNwb25zZSI+Ci0JCQkJPGNvbXBsZXhUeXBlLz4KLQkJCTwvZWxlbWVudD4KLQotCQkJPGVsZW1lbnQgbmFtZT0iZWNob0Jhc2VTdHJ1Y3RGYXVsdFJlcXVlc3QiIHR5cGU9Im5zMjpCYXNlU3RydWN0Ii8+Ci0JCQk8ZWxlbWVudCBuYW1lPSJlY2hvQmFzZVN0cnVjdEZhdWx0UmVzcG9uc2UiPgotCQkJCTxjb21wbGV4VHlwZS8+Ci0JCQk8L2VsZW1lbnQ+Ci0KLQkJCTxlbGVtZW50IG5hbWU9ImVjaG9FeHRlbmRlZFN0cnVjdEZhdWx0UmVxdWVzdCIgdHlwZT0ibnMyOkV4dGVuZGVkU3RydWN0Ii8+Ci0JCQk8ZWxlbWVudCBuYW1lPSJlY2hvRXh0ZW5kZWRTdHJ1Y3RGYXVsdFJlc3BvbnNlIj4KLQkJCQk8Y29tcGxleFR5cGUvPgotCQkJPC9lbGVtZW50PgotCi0JCQk8ZWxlbWVudCBuYW1lPSJlY2hvTXVsdGlwbGVGYXVsdHMxUmVxdWVzdCI+Ci0JCQkJPGNvbXBsZXhUeXBlPgotCQkJCQk8c2VxdWVuY2U+Ci0JCQkJCQk8ZWxlbWVudCBuYW1lPSJ3aGljaEZhdWx0IiB0eXBlPSJ4c2Q6aW50Ii8+Ci0JCQkJCQk8ZWxlbWVudCBuYW1lPSJwYXJhbTEiIHR5cGU9Im5zMjpTT0FQU3RydWN0Ii8+Ci0JCQkJCQk8ZWxlbWVudCBuYW1lPSJwYXJhbTIiIHR5cGU9Im5zMjpCYXNlU3RydWN0Ii8+Ci0JCQkJCTwvc2VxdWVuY2U+Ci0JCQkJPC9jb21wbGV4VHlwZT4KLQkJCTwvZWxlbWVudD4KLQkJCTxlbGVtZW50IG5hbWU9ImVjaG9NdWx0aXBsZUZhdWx0czFSZXNwb25zZSI+Ci0JCQkJPGNvbXBsZXhUeXBlLz4KLQkJCTwvZWxlbWVudD4KLQotCQkJPGVsZW1lbnQgbmFtZT0iZWNob011bHRpcGxlRmF1bHRzMlJlcXVlc3QiPgotCQkJCTxjb21wbGV4VHlwZT4KLQkJCQkJPHNlcXVlbmNlPgotCQkJCQkJPGVsZW1lbnQgbmFtZT0id2hpY2hGYXVsdCIgdHlwZT0ieHNkOmludCIvPgotCQkJCQkJPGVsZW1lbnQgbmFtZT0icGFyYW0xIiB0eXBlPSJuczI6QmFzZVN0cnVjdCIvPgotCQkJCQkJPGVsZW1lbnQgbmFtZT0icGFyYW0yIiB0eXBlPSJuczI6RXh0ZW5kZWRTdHJ1Y3QiLz4KLQkJCQkJCTxlbGVtZW50IG5hbWU9InBhcmFtMyIgdHlwZT0ibnMyOk1vcmVFeHRlbmRlZFN0cnVjdCIvPgotCQkJCQk8L3NlcXVlbmNlPgotCQkJCTwvY29tcGxleFR5cGU+Ci0JCQk8L2VsZW1lbnQ+Ci0JCQk8ZWxlbWVudCBuYW1lPSJlY2hvTXVsdGlwbGVGYXVsdHMyUmVzcG9uc2UiPgotCQkJCTxjb21wbGV4VHlwZS8+Ci0JCQk8L2VsZW1lbnQ+Ci0KLQkJPC9zY2hlbWE+Ci0JPC90eXBlcz4KLQotICAgIDwhLS0gU29tZSBwYXJ0IHJlZmVyZW5jZXMgYXJlICBtaXNzcGVsbGVkLS0+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iZWNob1NPQVBTdHJ1Y3RGYXVsdFJlcXVlc3QiPgotCQk8cGFydCBuYW1lPSJwYXJhbSIgZWxlbWVudD0ibnM0OmVjaG9TT0FQU3RydWN0RmF1bHRSZXF1ZXN0MSIvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJlY2hvU09BUFN0cnVjdEZhdWx0UmVzcG9uc2UiPgotCQk8cGFydCBuYW1lPSJwYXJhbSIgZWxlbWVudD0ibnM0OmVjaG9TT0FQU3RydWN0RmF1bHRSZXNwb25zZTIiLz4KLQk8L21lc3NhZ2U+Ci0KLQk8bWVzc2FnZSBuYW1lPSJlY2hvQmFzZVN0cnVjdEZhdWx0UmVxdWVzdCI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtIiBlbGVtZW50PSJuczQ6ZWNob0Jhc2VTdHJ1Y3RGYXVsdFJlcXVlc3QxIi8+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+Ci0JPC9zZXJ2aWNlPgotPC9kZWZpbml0aW9ucz4KLQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMveG1sYmVhbnMvdGVzdC1yZXNvdXJjZXMvd3NhdC53c2RsIGIvdjEuNS4xUkMzL21vZHVsZXMveG1sYmVhbnMvdGVzdC1yZXNvdXJjZXMvd3NhdC53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGE5YjkzLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3htbGJlYW5zL3Rlc3QtcmVzb3VyY2VzL3dzYXQud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDM3NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08IS0tCi1MZWdhbCBEaXNjbGFpbWVyCi0KLVRoZSBwcmVzZW50YXRpb24sIGRpc3RyaWJ1dGlvbiBvciBvdGhlciBkaXNzZW1pbmF0aW9uIG9mIHRoZSBpbmZvcm1hdGlvbiAKLWNvbnRhaW5lZCBpbiB0aGlzIHNwZWNpZmljYXRpb24gaXMgbm90IGEgbGljZW5zZSwgZWl0aGVyIGV4cHJlc3NseSBvciBpbXBsaWVkbHksIAotdG8gYW55IGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvd25lZCBvciBjb250cm9sbGVkIGJ5IEJFQSBvciBJQk0gb3IgTWljcm9zb2Z0IGFuZFxvciBhbnkgb3RoZXIgCi10aGlyZCBwYXJ0eS4gIEJFQSBhbmQgSUJNIGFuZCBNaWNyb3NvZnQgYW5kXG9yIGFueSBvdGhlciB0aGlyZCBwYXJ0eSBtYXkgaGF2ZSBwYXRlbnRzLCBwYXRlbnQgCi1hcHBsaWNhdGlvbnMsIHRyYWRlbWFya3MsIGNvcHlyaWdodHMsIG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgCi1jb3ZlcmluZyBzdWJqZWN0IG1hdHRlciBpbiB0aGlzIGRvY3VtZW50LiAgVGhlIGZ1cm5pc2hpbmcgb2YgdGhpcyBkb2N1bWVudCAKLWRvZXMgbm90IGdpdmUgeW91IGFueSBsaWNlbnNlIHRvIEJFQSdzIGFuZCBJQk0ncyBhbmQgTWljcm9zb2Z0J3Mgb3IgYW55IG90aGVyIHRoaXJkIHBhcnR5J3MgcGF0ZW50cywgdHJhZGVtYXJrcywgY29weXJpZ2h0cywgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5LgotCi1UaGlzIHNwZWNpZmljYXRpb24gYW5kIHRoZSBpbmZvcm1hdGlvbiBjb250YWluZWQgaGVyZWluIGlzIHByb3ZpZGVkIG9uIGFuICJBUyBJUyIKLSBiYXNpcyBhbmQgdG8gdGhlIG1heGltdW0gZXh0ZW50IHBlcm1pdHRlZCBieSBhcHBsaWNhYmxlIGxhdywgQkVBIGFuZCBJQk0gYW5kIE1pY3Jvc29mdCBwcm92aWRlcyAKLXRoZSBkb2N1bWVudCBBUyBJUyBBTkQgV0lUSCBBTEwgRkFVTFRTLCBhbmQgaGVyZWJ5IGRpc2NsYWltcyBhbGwgb3RoZXIgd2FycmFudGllcyAKLWFuZCBjb25kaXRpb25zLCBlaXRoZXIgZXhwcmVzcywgaW1wbGllZCBvciBzdGF0dXRvcnksIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIAotdG8sIGFueSAoaWYgYW55KSBpbXBsaWVkIHdhcnJhbnRpZXMsIGR1dGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eSwgb2YgCi1maXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZSwgb2YgYWNjdXJhY3kgb3IgY29tcGxldGVuZXNzIG9mIHJlc3BvbnNlcywgb2YgCi1yZXN1bHRzLCBvZiB3b3JrbWFubGlrZSBlZmZvcnQsIG9mIGxhY2sgb2YgdmlydXNlcywgYW5kIG9mIGxhY2sgb2YgbmVnbGlnZW5jZSwgCi1hbGwgd2l0aCByZWdhcmQgdG8gdGhlIGRvY3VtZW50LiBBTFNPLCBUSEVSRSBJUyBOTyBXQVJSQU5UWSBPUiBDT05ESVRJT04gT0YgCi1USVRMRSwgUVVJRVQgRU5KT1lNRU5ULCBRVUlFVCBQT1NTRVNTSU9OLCBDT1JSRVNQT05ERU5DRSBUTyBERVNDUklQVElPTiBPUiAKLU5PTi1JTkZSSU5HRU1FTlQgT0YgQU5ZIElOVEVMTEVDVFVBTCBQUk9QRVJUWSBSSUdIVFMgV0lUSCBSRUdBUkQgVE8gVEhFIERPQ1VNRU5ULgotCi1JTiBOTyBFVkVOVCBXSUxMIEJFQSBvciBJQk0gb3IgTUlDUk9TT0ZUIEJFIExJQUJMRSBUTyBBTlkgT1RIRVIgUEFSVFkgRk9SIFRIRSBDT1NUIE9GIFBST0NVUklORyAKLVNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVMsIExPU1QgUFJPRklUUywgTE9TUyBPRiBVU0UsIExPU1MgT0YgREFUQSwgT1IgQU5ZIAotSU5DSURFTlRBTCwgQ09OU0VRVUVOVElBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgU1BFQ0lBTCBEQU1BR0VTIFdIRVRIRVIgVU5ERVIgCi1DT05UUkFDVCwgVE9SVCwgV0FSUkFOVFksIE9SIE9USEVSV0lTRSwgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSElTIE9SIEFOWSAKLU9USEVSIEFHUkVFTUVOVCBSRUxBVElORyBUTyBUSElTIERPQ1VNRU5ULCBXSEVUSEVSIE9SIE5PVCBTVUNIIFBBUlRZIEhBRCBBRFZBTkNFIAotTk9USUNFIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCi0KLUNvcHlyaWdodCBOb3RpY2UKLQotQ29weXJpZ2h0IDIwMDEsIDIwMDIgQkVBIFN5c3RlbXMgYW5kIElCTSBDb3Jwb3JhdGlvbiBhbmQgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLS0+Ci08d3NkbDpkZWZpbml0aW9ucyB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIgeG1sbnM6d3NhdD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwMy8wOS93c2F0IiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDMvMDkvd3NhdCI+Ci0JPCEtLSBNZXNzYWdlcyAtLT4KLSAgICA8d3NkbDp0eXBlcz4KLSAgICAgICAgPHhzZDpzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDAzLzA5L3dzYXQiPgotICAgICAgICAgICAgPHhzZDppbmNsdWRlIHNjaGVtYUxvY2F0aW9uPSJ3c2F0LnhzZCIvPgotICAgICAgICA8L3hzZDpzY2hlbWE+Ci0gICAgPC93c2RsOnR5cGVzPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0iUHJlcGFyZSI+Ci0JCTx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0id3NhdDpQcmVwYXJlIi8+Ci0JPC93c2RsOm1lc3NhZ2U+Ci0JPHdzZGw6bWVzc2FnZSBuYW1lPSJQcmVwYXJlZCI+Ci0JCTx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0id3NhdDpQcmVwYXJlZCIvPgotCTwvd3NkbDptZXNzYWdlPgotCTx3c2RsOm1lc3NhZ2UgbmFtZT0iQWJvcnRlZCI+Ci0JCTx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0id3NhdDpBYm9ydGVkIi8+Ci0JPC93c2RsOm1lc3NhZ2U+Ci0JPHdzZGw6bWVzc2FnZSBuYW1lPSJSZWFkT25seSI+Ci0JCTx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0id3NhdDpSZWFkT25seSIvPgotCTwvd3NkbDptZXNzYWdlPgotCTx3c2RsOm1lc3NhZ2UgbmFtZT0iQ29tbWl0Ij4KLQkJPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJ3c2F0OkNvbW1pdCIvPgotCTwvd3NkbDptZXNzYWdlPgotCTx3c2RsOm1lc3NhZ2UgbmFtZT0iUm9sbGJhY2siPgotCQk8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9IndzYXQ6Um9sbGJhY2siLz4KLQk8L3dzZGw6bWVzc2FnZT4KLQk8d3NkbDptZXNzYWdlIG5hbWU9IkNvbW1pdHRlZCI+Ci0JCTx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0id3NhdDpDb21taXR0ZWQiLz4KLQk8L3dzZGw6bWVzc2FnZT4KLQk8d3NkbDptZXNzYWdlIG5hbWU9IlJlcGxheSI+Ci0JCTx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0id3NhdDpSZXBsYXkiLz4KLQk8L3dzZGw6bWVzc2FnZT4KLQk8d3NkbDptZXNzYWdlIG5hbWU9IlByZXBhcmVSZXNwb25zZSI+Ci0JCTx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0id3NhdDpQcmVwYXJlUmVzcG9uc2UiLz4KLQk8L3dzZGw6bWVzc2FnZT4KLQk8d3NkbDptZXNzYWdlIG5hbWU9IlJlcGxheVJlc3BvbnNlIj4KLQkJPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJ3c2F0OlJlcGxheVJlc3BvbnNlIi8+Ci0JPC93c2RsOm1lc3NhZ2U+Ci0JPCEtLSBNYW5kYXRvcnkgQXN5bmNocm9ub3VzIE1lc3NhZ2luZyBQb3J0VHlwZXMgLS0+Ci0JPHdzZGw6cG9ydFR5cGUgbmFtZT0iQ29tcGxldGlvbkNvb3JkaW5hdG9yUG9ydFR5cGUiPgotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iQ29tbWl0T3BlcmF0aW9uIj4KLQkJCTx3c2RsOmlucHV0IG1lc3NhZ2U9IndzYXQ6Q29tbWl0Ii8+Ci0JCTwvd3NkbDpvcGVyYXRpb24+Ci0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJSb2xsYmFja09wZXJhdGlvbiI+Ci0JCQk8d3NkbDppbnB1dCBtZXNzYWdlPSJ3c2F0OlJvbGxiYWNrIi8+Ci0JCTwvd3NkbDpvcGVyYXRpb24+Ci0JPC93c2RsOnBvcnRUeXBlPgotCTx3c2RsOnBvcnRUeXBlIG5hbWU9IkNvbXBsZXRpb25Jbml0aWF0b3JQb3J0VHlwZSI+Ci0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJDb21taXR0ZWRPcGVyYXRpb24iPgotCQkJPHdzZGw6aW5wdXQgbWVzc2FnZT0id3NhdDpDb21taXR0ZWQiLz4KLQkJPC93c2RsOm9wZXJhdGlvbj4KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9IkFib3J0ZWRPcGVyYXRpb24iPgotCQkJPHdzZGw6aW5wdXQgbWVzc2FnZT0id3NhdDpBYm9ydGVkIi8+Ci0JCTwvd3NkbDpvcGVyYXRpb24+Ci0JPC93c2RsOnBvcnRUeXBlPgotCTx3c2RsOnBvcnRUeXBlIG5hbWU9IkNvb3JkaW5hdG9yUG9ydFR5cGUiPgotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iUHJlcGFyZWRPcGVyYXRpb24iPgotCQkJPHdzZGw6aW5wdXQgbWVzc2FnZT0id3NhdDpQcmVwYXJlZCIvPgotCQk8L3dzZGw6b3BlcmF0aW9uPgotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iQWJvcnRlZE9wZXJhdGlvbiI+Ci0JCQk8d3NkbDppbnB1dCBtZXNzYWdlPSJ3c2F0OkFib3J0ZWQiLz4KLQkJPC93c2RsOm9wZXJhdGlvbj4KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9IlJlYWRPbmx5T3BlcmF0aW9uIj4KLQkJCTx3c2RsOmlucHV0IG1lc3NhZ2U9IndzYXQ6UmVhZE9ubHkiLz4KLQkJPC93c2RsOm9wZXJhdGlvbj4KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9IkNvbW1pdHRlZE9wZXJhdGlvbiI+Ci0JCQk8d3NkbDppbnB1dCBtZXNzYWdlPSJ3c2F0OkNvbW1pdHRlZCIvPgotCQk8L3dzZGw6b3BlcmF0aW9uPgotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iUmVwbGF5T3BlcmF0aW9uIj4KLQkJCTx3c2RsOmlucHV0IG1lc3NhZ2U9IndzYXQ6UmVwbGF5Ii8+Ci0JCTwvd3NkbDpvcGVyYXRpb24+Ci0JPC93c2RsOnBvcnRUeXBlPgotCTx3c2RsOnBvcnRUeXBlIG5hbWU9IlBhcnRpY2lwYW50UG9ydFR5cGUiPgotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iUHJlcGFyZU9wZXJhdGlvbiI+Ci0JCQk8d3NkbDppbnB1dCBtZXNzYWdlPSJ3c2F0OlByZXBhcmUiLz4KLQkJPC93c2RsOm9wZXJhdGlvbj4KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9IkNvbW1pdE9wZXJhdGlvbiI+Ci0JCQk8d3NkbDppbnB1dCBtZXNzYWdlPSJ3c2F0OkNvbW1pdCIvPgotCQk8L3dzZGw6b3BlcmF0aW9uPgotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iUm9sbGJhY2tPcGVyYXRpb24iPgotCQkJPHdzZGw6aW5wdXQgbWVzc2FnZT0id3NhdDpSb2xsYmFjayIvPgotCQk8L3dzZGw6b3BlcmF0aW9uPgotCTwvd3NkbDpwb3J0VHlwZT4KLQk8IS0tIE9wdGlvbmFsIFN5bmNyb25vdXMgUlBDIFBvcnQgVHlwZXMgLS0+Ci0JPHdzZGw6cG9ydFR5cGUgbmFtZT0iQ29tcGxldGlvblBvcnRUeXBlUlBDIj4KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9IkNvbW1pdE9wZXJhdGlvbiI+Ci0JCQk8d3NkbDppbnB1dCBtZXNzYWdlPSJ3c2F0OkNvbW1pdCIvPgotCQkJPHdzZGw6b3V0cHV0IG1lc3NhZ2U9IndzYXQ6Q29tbWl0dGVkIi8+Ci0JCTwvd3NkbDpvcGVyYXRpb24+Ci0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJSb2xsYmFja09wZXJhdGlvbiI+Ci0JCQk8d3NkbDppbnB1dCBtZXNzYWdlPSJ3c2F0OlJvbGxiYWNrIi8+Ci0JCQk8d3NkbDpvdXRwdXQgbWVzc2FnZT0id3NhdDpBYm9ydGVkIi8+Ci0JCTwvd3NkbDpvcGVyYXRpb24+Ci0JPC93c2RsOnBvcnRUeXBlPgotCTx3c2RsOnBvcnRUeXBlIG5hbWU9IlBhcnRpY2lwYW50UG9ydFR5cGVSUEMiPgotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iUHJlcGFyZU9wZXJhdGlvbiI+Ci0JCQk8d3NkbDppbnB1dCBtZXNzYWdlPSJ3c2F0OlByZXBhcmUiLz4KLQkJCTx3c2RsOm91dHB1dCBtZXNzYWdlPSJ3c2F0OlByZXBhcmVSZXNwb25zZSIvPgotCQk8L3dzZGw6b3BlcmF0aW9uPgotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iQ29tbWl0T3BlcmF0aW9uIj4KLQkJCTx3c2RsOmlucHV0IG1lc3NhZ2U9IndzYXQ6Q29tbWl0Ii8+Ci0JCQk8d3NkbDpvdXRwdXQgbWVzc2FnZT0id3NhdDpDb21taXR0ZWQiLz4KLQkJPC93c2RsOm9wZXJhdGlvbj4KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9IlJvbGxiYWNrT3BlcmF0aW9uIj4KLQkJCTx3c2RsOmlucHV0IG1lc3NhZ2U9IndzYXQ6Um9sbGJhY2siLz4KLQkJCTx3c2RsOm91dHB1dCBtZXNzYWdlPSJ3c2F0OkFib3J0ZWQiLz4KLQkJPC93c2RsOm9wZXJhdGlvbj4KLQk8L3dzZGw6cG9ydFR5cGU+Ci0JPHdzZGw6cG9ydFR5cGUgbmFtZT0iQ29vcmRpbmF0b3JQb3J0VHlwZVJQQyI+Ci0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJSZXBsYXlPcGVyYXRpb24iPgotCQkJPHdzZGw6aW5wdXQgbWVzc2FnZT0id3NhdDpSZXBsYXkiLz4KLQkJCTx3c2RsOm91dHB1dCBtZXNzYWdlPSJ3c2F0OlJlcGxheVJlc3BvbnNlIi8+Ci0JCTwvd3NkbDpvcGVyYXRpb24+Ci0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJBYm9ydGVkT3BlcmF0aW9uIj4KLQkJCTx3c2RsOmlucHV0IG1lc3NhZ2U9IndzYXQ6QWJvcnRlZCIvPgotCQk8L3dzZGw6b3BlcmF0aW9uPgotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iUmVhZE9ubHlPcGVyYXRpb24iPgotCQkJPHdzZGw6aW5wdXQgbWVzc2FnZT0id3NhdDpSZWFkT25seSIvPgotCQk8L3dzZGw6b3BlcmF0aW9uPgotCTwvd3NkbDpwb3J0VHlwZT4KLQotPCEtLQotCi08d3NkbDpiaW5kaW5nIG5hbWU9IkNvbXBsZXRpb25Db29yZGluYXRvclBvcnRUeXBlQmluZGluZyIgdHlwZT0id3NhdDpDb21wbGV0aW9uQ29vcmRpbmF0b3JQb3J0VHlwZSI+Ci0JCTxzb2FwOmJpbmRpbmcgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiIHN0eWxlPSJkb2N1bWVudCIvPgotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iQ29tbWl0T3BlcmF0aW9uIj4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8veHh4Ii8+Ci0JCQk8d3NkbDppbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotCQkJPC93c2RsOmlucHV0PgotCQk8L3dzZGw6b3BlcmF0aW9uPgotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iUm9sbGJhY2tPcGVyYXRpb24iPgotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly94eHgiLz4KLQkJCTx3c2RsOmlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0JCQk8L3dzZGw6aW5wdXQ+Ci0JCTwvd3NkbDpvcGVyYXRpb24+Ci08L3dzZGw6YmluZGluZz4KLTx3c2RsOmJpbmRpbmcgbmFtZT0iQ29tcGxldGlvbkluaXRpYXRvclBvcnRUeXBlQmluZGluZyIgdHlwZT0id3NhdDpDb21wbGV0aW9uSW5pdGlhdG9yUG9ydFR5cGUiPgotCQk8c29hcDpiaW5kaW5nIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIiBzdHlsZT0iZG9jdW1lbnQiLz4KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9IkNvbW1pdHRlZE9wZXJhdGlvbiI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3h4eCIvPgotCQkJPHdzZGw6aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLQkJCTwvd3NkbDppbnB1dD4KLQkJPC93c2RsOm9wZXJhdGlvbj4KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9IkFib3J0ZWRPcGVyYXRpb24iPgotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly94eHgiLz4KLQkJCTx3c2RsOmlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0JCQk8L3dzZGw6aW5wdXQ+Ci0JCTwvd3NkbDpvcGVyYXRpb24+Ci08L3dzZGw6YmluZGluZz4KLTx3c2RsOmJpbmRpbmcgbmFtZT0iQ29vcmRpbmF0b3JQb3J0VHlwZUJpbmRpbmciIHR5cGU9IndzYXQ6Q29vcmRpbmF0b3JQb3J0VHlwZSI+Ci0JCTxzb2FwOmJpbmRpbmcgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiIHN0eWxlPSJkb2N1bWVudCIvPgotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iUHJlcGFyZWRPcGVyYXRpb24iPgotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly94eHgiLz4KLQkJCTx3c2RsOmlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0JCQk8L3dzZGw6aW5wdXQ+Ci0JCTwvd3NkbDpvcGVyYXRpb24+Ci0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJBYm9ydGVkT3BlcmF0aW9uIj4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8veHh4Ii8+Ci0JCQk8d3NkbDppbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotCQkJPC93c2RsOmlucHV0PgotCQk8L3dzZGw6b3BlcmF0aW9uPgotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iUmVhZE9ubHlPcGVyYXRpb24iPgotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly94eHgiLz4KLQkJCTx3c2RsOmlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0JCQk8L3dzZGw6aW5wdXQ+Ci0JCTwvd3NkbDpvcGVyYXRpb24+Ci0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJDb21taXR0ZWRPcGVyYXRpb24iPgotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly94eHgiLz4KLQkJCTx3c2RsOmlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0JCQk8L3dzZGw6aW5wdXQ+Ci0JCTwvd3NkbDpvcGVyYXRpb24+Ci0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJSZXBsYXlPcGVyYXRpb24iPgotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly94eHgiLz4KLQkJCTx3c2RsOmlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0JCQk8L3dzZGw6aW5wdXQ+Ci0JCTwvd3NkbDpvcGVyYXRpb24+Ci08L3dzZGw6YmluZGluZz4KLTx3c2RsOmJpbmRpbmcgbmFtZT0iUGFydGljaXBhbnRQb3J0VHlwZUJpbmRpbmciIHR5cGU9IndzYXQ6UGFydGljaXBhbnRQb3J0VHlwZSI+Ci0JCTxzb2FwOmJpbmRpbmcgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiIHN0eWxlPSJkb2N1bWVudCIvPgotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iUHJlcGFyZU9wZXJhdGlvbiI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3h4eCIvPgotCQkJPHdzZGw6aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLQkJCTwvd3NkbDppbnB1dD4KLQkJPC93c2RsOm9wZXJhdGlvbj4KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9IkNvbW1pdE9wZXJhdGlvbiI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3h4eCIvPgotCQkJPHdzZGw6aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLQkJCTwvd3NkbDppbnB1dD4KLQkJPC93c2RsOm9wZXJhdGlvbj4KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9IlJvbGxiYWNrT3BlcmF0aW9uIj4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8veHh4Ii8+Ci0JCQk8d3NkbDppbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotCQkJPC93c2RsOmlucHV0PgotCQk8L3dzZGw6b3BlcmF0aW9uPgotPC93c2RsOmJpbmRpbmc+Ci0KLS0tPgotCi08d3NkbDpiaW5kaW5nIG5hbWU9IkNvbXBsZXRpb25Qb3J0VHlwZVJQQ0JpbmRpbmciIHR5cGU9IndzYXQ6Q29tcGxldGlvblBvcnRUeXBlUlBDIj4KLQkJPHNvYXA6YmluZGluZyB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJDb21taXRPcGVyYXRpb24iPgotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly94eHgiLz4KLQkJCTx3c2RsOmlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0JCQk8L3dzZGw6aW5wdXQ+Ci0JCQk8d3NkbDpvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLQkJCTwvd3NkbDpvdXRwdXQ+Ci0JCTwvd3NkbDpvcGVyYXRpb24+Ci0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJSb2xsYmFja09wZXJhdGlvbiI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3h4eCIvPgotCQkJPHdzZGw6aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLQkJCTwvd3NkbDppbnB1dD4KLQkJCTx3c2RsOm91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotCQkJPC93c2RsOm91dHB1dD4KLQkJPC93c2RsOm9wZXJhdGlvbj4KLTwvd3NkbDpiaW5kaW5nPgotCi08d3NkbDpiaW5kaW5nIG5hbWU9IkNvb3JkaW5hdG9yUG9ydFR5cGVSUENCaW5kaW5nIiB0eXBlPSJ3c2F0OkNvb3JkaW5hdG9yUG9ydFR5cGVSUEMiPgotCQk8c29hcDpiaW5kaW5nIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIiBzdHlsZT0iZG9jdW1lbnQiLz4KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9IlJlcGxheU9wZXJhdGlvbiI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3h4eCIvPgotCQkJPHdzZGw6aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLQkJCTwvd3NkbDppbnB1dD4KLQkJCTx3c2RsOm91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotCQkJPC93c2RsOm91dHB1dD4KLQkJPC93c2RsOm9wZXJhdGlvbj4KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9IkFib3J0ZWRPcGVyYXRpb24iPgotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly94eHgiLz4KLQkJCTx3c2RsOmlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0JCQk8L3dzZGw6aW5wdXQ+Ci0JCQk8d3NkbDpvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLQkJCTwvd3NkbDpvdXRwdXQ+Ci0JCTwvd3NkbDpvcGVyYXRpb24+Ci0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJSZWFkT25seU9wZXJhdGlvbiI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3h4eCIvPgotCQkJPHdzZGw6aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLQkJCTwvd3NkbDppbnB1dD4KLQkJCTx3c2RsOm91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotCQkJPC93c2RsOm91dHB1dD4KLQkJPC93c2RsOm9wZXJhdGlvbj4KLTwvd3NkbDpiaW5kaW5nPgotCi08d3NkbDpiaW5kaW5nIG5hbWU9IlBhcnRpY2lwYW50UG9ydFR5cGVSUENCaW5kaW5nIiB0eXBlPSJ3c2F0OlBhcnRpY2lwYW50UG9ydFR5cGVSUEMiPgotCQk8c29hcDpiaW5kaW5nIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIiBzdHlsZT0iZG9jdW1lbnQiLz4KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9IlByZXBhcmVPcGVyYXRpb24iPgotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly94eHgiLz4KLQkJCTx3c2RsOmlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0JCQk8L3dzZGw6aW5wdXQ+Ci0JCQk8d3NkbDpvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLQkJCTwvd3NkbDpvdXRwdXQ+Ci0JCTwvd3NkbDpvcGVyYXRpb24+Ci0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJDb21taXRPcGVyYXRpb24iPgotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly94eHgiLz4KLQkJCTx3c2RsOmlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0JCQk8L3dzZGw6aW5wdXQ+Ci0JCQk8d3NkbDpvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLQkJCTwvd3NkbDpvdXRwdXQ+Ci0JCTwvd3NkbDpvcGVyYXRpb24+Ci0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJSb2xsYmFja09wZXJhdGlvbiI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3h4eCIvPgotCQkJPHdzZGw6aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLQkJCTwvd3NkbDppbnB1dD4KLQkJCTx3c2RsOm91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotCQkJPC93c2RsOm91dHB1dD4KLQkJPC93c2RsOm9wZXJhdGlvbj4KLTwvd3NkbDpiaW5kaW5nPgotCi0KLQotPHdzZGw6c2VydmljZSBuYW1lPSJ4eHgiPgotPCEtLQotICAgCQk8d3NkbDpwb3J0IGJpbmRpbmc9IndzYXQ6Q29tcGxldGlvbkNvb3JkaW5hdG9yUG9ydFR5cGVCaW5kaW5nIiBuYW1lPSJDb21wbGV0aW9uQ29vcmRpbmF0b3IiPgotICAgICAgCQkJPHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo4MDgxL2F4aXMyL3NlcnZpY2VzL0NvbXBsZXRpb25Db29yZGluYXRvciIvPgotICAgIAkJPC93c2RsOnBvcnQ+Ci0JCTx3c2RsOnBvcnQgYmluZGluZz0id3NhdDpDb21wbGV0aW9uSW5pdGlhdG9yUG9ydFR5cGVCaW5kaW5nIiBuYW1lPSJDb21wbGV0aW9uSW5pdGlhdG9yIj4KLSAgICAgIAkJCTxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MS9heGlzMi9zZXJ2aWNlcy9Db21wbGV0aW9uSW5pdGlhdG9yIi8+Ci0gICAgCQk8L3dzZGw6cG9ydD4KLQkJPHdzZGw6cG9ydCBiaW5kaW5nPSJ3c2F0OkNvb3JkaW5hdG9yUG9ydFR5cGVCaW5kaW5nIiBuYW1lPSJDb29yZGluYXRvciI+Ci0gICAgICAJCQk8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjgwODEvYXhpczIvc2VydmljZXMvQ29vcmRpbmF0b3IiLz4KLSAgICAJCTwvd3NkbDpwb3J0PgotCQk8d3NkbDpwb3J0IGJpbmRpbmc9IndzYXQ6UGFydGljaXBhbnRQb3J0VHlwZUJpbmRpbmciIG5hbWU9IlBhcnRpY2lwYW50Ij4KLSAgICAgIAkJCTxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MS9heGlzMi9zZXJ2aWNlcy9QYXJ0aWNpcGFudCIvPgotICAgIAkJPC93c2RsOnBvcnQ+Ci0tLT4gICAgCQkKLQkJPHdzZGw6cG9ydCBiaW5kaW5nPSJ3c2F0OlBhcnRpY2lwYW50UG9ydFR5cGVSUENCaW5kaW5nIiBuYW1lPSJQYXJ0aWNpcGFudFJQQyI+Ci0gICAgICAJCQk8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjgwODEvYXhpcy9zZXJ2aWNlcy9QYXJ0aWNpcGFudFJQQyIvPgotICAgCQk8L3dzZGw6cG9ydD4KLQkJPHdzZGw6cG9ydCBiaW5kaW5nPSJ3c2F0OkNvb3JkaW5hdG9yUG9ydFR5cGVSUENCaW5kaW5nIiBuYW1lPSJDb29yZGluYXRvclJQQyI+Ci0gICAgICAJCQk8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjgwODEvYXhpcy9zZXJ2aWNlcy9Db29yZGluYXRvclJQQyIvPgotICAgCQk8L3dzZGw6cG9ydD4KLQkJPHdzZGw6cG9ydCBiaW5kaW5nPSJ3c2F0OkNvbXBsZXRpb25Qb3J0VHlwZVJQQ0JpbmRpbmciIG5hbWU9IkNvbXBsZXRpb25SUEMiPgotICAgCQkJPHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo4MDgxL2F4aXMvc2VydmljZXMvQ29tcGxldGlvblJQQyIvPgotICAgCQk8L3dzZGw6cG9ydD4KLTwvd3NkbDpzZXJ2aWNlPgotCi08L3dzZGw6ZGVmaW5pdGlvbnM+CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy94bWxiZWFucy90ZXN0LXJlc291cmNlcy93c2F0LnhzZCBiL3YxLjUuMVJDMy9tb2R1bGVzL3htbGJlYW5zL3Rlc3QtcmVzb3VyY2VzL3dzYXQueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDIyNmU5Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3htbGJlYW5zL3Rlc3QtcmVzb3VyY2VzL3dzYXQueHNkCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPCEtLQotTGVnYWwgRGlzY2xhaW1lcgotCi1UaGUgcHJlc2VudGF0aW9uLCBkaXN0cmlidXRpb24gb3Igb3RoZXIgZGlzc2VtaW5hdGlvbiBvZiB0aGUgaW5mb3JtYXRpb24gCi1jb250YWluZWQgaW4gdGhpcyBzcGVjaWZpY2F0aW9uIGlzIG5vdCBhIGxpY2Vuc2UsIGVpdGhlciBleHByZXNzbHkgb3IgaW1wbGllZGx5LCAKLXRvIGFueSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb3duZWQgb3IgY29udHJvbGxlZCBieSBCRUEgb3IgSUJNIG9yIE1pY3Jvc29mdCBhbmRcb3IgYW55IG90aGVyIAotdGhpcmQgcGFydHkuICBCRUEgYW5kIElCTSBhbmQgTWljcm9zb2Z0IGFuZFxvciBhbnkgb3RoZXIgdGhpcmQgcGFydHkgbWF5IGhhdmUgcGF0ZW50cywgcGF0ZW50IAotYXBwbGljYXRpb25zLCB0cmFkZW1hcmtzLCBjb3B5cmlnaHRzLCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIAotY292ZXJpbmcgc3ViamVjdCBtYXR0ZXIgaW4gdGhpcyBkb2N1bWVudC4gIFRoZSBmdXJuaXNoaW5nIG9mIHRoaXMgZG9jdW1lbnQgCi1kb2VzIG5vdCBnaXZlIHlvdSBhbnkgbGljZW5zZSB0byBCRUEncyBhbmQgSUJNJ3MgYW5kIE1pY3Jvc29mdCdzIG9yIGFueSBvdGhlciB0aGlyZCBwYXJ0eSdzIHBhdGVudHMsIAotdHJhZGVtYXJrcywgY29weXJpZ2h0cywgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5LgotCi1UaGlzIHNwZWNpZmljYXRpb24gYW5kIHRoZSBpbmZvcm1hdGlvbiBjb250YWluZWQgaGVyZWluIGlzIHByb3ZpZGVkIG9uIGFuICJBUyBJUyIKLSBiYXNpcyBhbmQgdG8gdGhlIG1heGltdW0gZXh0ZW50IHBlcm1pdHRlZCBieSBhcHBsaWNhYmxlIGxhdywgQkVBIGFuZCBJQk0gYW5kIE1pY3Jvc29mdCBwcm92aWRlcyAKLXRoZSBkb2N1bWVudCBBUyBJUyBBTkQgV0lUSCBBTEwgRkFVTFRTLCBhbmQgaGVyZWJ5IGRpc2NsYWltcyBhbGwgb3RoZXIgd2FycmFudGllcyAKLWFuZCBjb25kaXRpb25zLCBlaXRoZXIgZXhwcmVzcywgaW1wbGllZCBvciBzdGF0dXRvcnksIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIAotdG8sIGFueSAoaWYgYW55KSBpbXBsaWVkIHdhcnJhbnRpZXMsIGR1dGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eSwgb2YgCi1maXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZSwgb2YgYWNjdXJhY3kgb3IgY29tcGxldGVuZXNzIG9mIHJlc3BvbnNlcywgb2YgCi1yZXN1bHRzLCBvZiB3b3JrbWFubGlrZSBlZmZvcnQsIG9mIGxhY2sgb2YgdmlydXNlcywgYW5kIG9mIGxhY2sgb2YgbmVnbGlnZW5jZSwgCi1hbGwgd2l0aCByZWdhcmQgdG8gdGhlIGRvY3VtZW50LiBBTFNPLCBUSEVSRSBJUyBOTyBXQVJSQU5UWSBPUiBDT05ESVRJT04gT0YgCi1USVRMRSwgUVVJRVQgRU5KT1lNRU5ULCBRVUlFVCBQT1NTRVNTSU9OLCBDT1JSRVNQT05ERU5DRSBUTyBERVNDUklQVElPTiBPUiAKLU5PTi1JTkZSSU5HRU1FTlQgT0YgQU5ZIElOVEVMTEVDVFVBTCBQUk9QRVJUWSBSSUdIVFMgV0lUSCBSRUdBUkQgVE8gVEhFIERPQ1VNRU5ULgotCi1JTiBOTyBFVkVOVCBXSUxMIEJFQSBvciBJQk0gb3IgTUlDUk9TT0ZUIEJFIExJQUJMRSBUTyBBTlkgT1RIRVIgUEFSVFkgRk9SIFRIRSBDT1NUIE9GIFBST0NVUklORyAKLVNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVMsIExPU1QgUFJPRklUUywgTE9TUyBPRiBVU0UsIExPU1MgT0YgREFUQSwgT1IgQU5ZIAotSU5DSURFTlRBTCwgQ09OU0VRVUVOVElBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgU1BFQ0lBTCBEQU1BR0VTIFdIRVRIRVIgVU5ERVIgCi1DT05UUkFDVCwgVE9SVCwgV0FSUkFOVFksIE9SIE9USEVSV0lTRSwgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSElTIE9SIEFOWSAKLU9USEVSIEFHUkVFTUVOVCBSRUxBVElORyBUTyBUSElTIERPQ1VNRU5ULCBXSEVUSEVSIE9SIE5PVCBTVUNIIFBBUlRZIEhBRCBBRFZBTkNFIAotTk9USUNFIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCi0KLUNvcHlyaWdodCBOb3RpY2UKLQotQ29weXJpZ2h0IDIwMDEsIDIwMDIgQkVBIFN5c3RlbXMgYW5kIElCTSBDb3Jwb3JhdGlvbiBhbmQgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLS0+Ci08eHNkOnNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDMvMDkvd3NhdCIgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6d3NhdD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwMy8wOS93c2F0IiBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIiB2ZXJzaW9uPSIxLjAiPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTm90aWZpY2F0aW9uIj4KLQkJPHhzZDpzZXF1ZW5jZT4KLQkJCTx4c2Q6YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJPC94c2Q6c2VxdWVuY2U+Ci0JCTx4c2Q6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iUHJlcGFyZSIgdHlwZT0id3NhdDpOb3RpZmljYXRpb24iLz4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iUHJlcGFyZWQiIHR5cGU9IndzYXQ6Tm90aWZpY2F0aW9uIi8+Ci0JPHhzZDplbGVtZW50IG5hbWU9IkFib3J0ZWQiIHR5cGU9IndzYXQ6Tm90aWZpY2F0aW9uIi8+Ci0JPHhzZDplbGVtZW50IG5hbWU9IlJlYWRPbmx5IiB0eXBlPSJ3c2F0Ok5vdGlmaWNhdGlvbiIvPgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJDb21taXQiIHR5cGU9IndzYXQ6Tm90aWZpY2F0aW9uIi8+Ci0JPHhzZDplbGVtZW50IG5hbWU9IlJvbGxiYWNrIiB0eXBlPSJ3c2F0Ok5vdGlmaWNhdGlvbiIvPgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJDb21taXR0ZWQiIHR5cGU9IndzYXQ6Tm90aWZpY2F0aW9uIi8+Ci0JPHhzZDplbGVtZW50IG5hbWU9IlJlcGxheSIgdHlwZT0id3NhdDpOb3RpZmljYXRpb24iLz4KLQk8eHNkOnNpbXBsZVR5cGUgbmFtZT0iVm90ZSI+Ci0JCTx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWb3RlQ29tbWl0Ii8+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWb3RlUm9sbGJhY2siLz4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZvdGVSZWFkT25seSIvPgotCQk8L3hzZDpyZXN0cmljdGlvbj4KLQk8L3hzZDpzaW1wbGVUeXBlPgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcmVwYXJlUmVzcG9uc2UiPgotCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idm90ZSIgdHlwZT0id3NhdDpWb3RlIi8+Ci0JCTwveHNkOmNvbXBsZXhUeXBlPgotCTwveHNkOmVsZW1lbnQ+Ci0JPHhzZDpzaW1wbGVUeXBlIG5hbWU9Ik91dGNvbWUiPgotCQk8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWl0Ii8+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb2xsYmFjayIvPgotCQk8L3hzZDpyZXN0cmljdGlvbj4KLQk8L3hzZDpzaW1wbGVUeXBlPgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJSZXBsYXlSZXNwb25zZSI+Ci0JCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvdXRjb21lIiB0eXBlPSJ3c2F0Ok91dGNvbWUiLz4KLQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JPC94c2Q6ZWxlbWVudD4KLQk8eHNkOnNpbXBsZVR5cGUgbmFtZT0iRXJyb3JDb2RlcyI+Ci0JCTx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOlFOYW1lIj4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IndzYXQ6SW5jb25zaXN0ZW50SW50ZXJuYWxTdGF0ZSIvPgotCQk8L3hzZDpyZXN0cmljdGlvbj4KLQk8L3hzZDpzaW1wbGVUeXBlPgotPC94c2Q6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMveG1sYmVhbnMvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3htbGJlYW5zL1Rlc3RDb25zdGFudHMuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3htbGJlYW5zL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi94bWxiZWFucy9UZXN0Q29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiYTRlYzIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMveG1sYmVhbnMvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3htbGJlYW5zL1Rlc3RDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi54bWxiZWFuczsKLQotcHVibGljIGNsYXNzIFRlc3RDb25zdGFudHMgewotCi0gICAgcHVibGljIGludGVyZmFjZSBMYW5ndWFnZU5hbWVzIHsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQSA9ICJqYXZhIjsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ19TSEFSUCA9ICJjcyI7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZCX0RPVF9ORVQgPSAidmIiOwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDX1BMVVNfUExVUyA9ICJjcHAiOwotCi0gICAgfQotCi0gICAgcHVibGljIGludGVyZmFjZSBEYXRhYmluZGluZyB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9CRUFOUyA9ICJ4bWxiZWFucyI7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFEQiA9ICJhZGIiOwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT05FID0gIm5vbmUiOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3htbGJlYW5zL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi94bWxiZWFucy9XU0RMMkphdmExMFRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3htbGJlYW5zL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi94bWxiZWFucy9XU0RMMkphdmExMFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVjNGE4ZC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy94bWxiZWFucy90ZXN0L29yZy9hcGFjaGUvYXhpczIveG1sYmVhbnMvV1NETDJKYXZhMTBUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIueG1sYmVhbnM7Ci0KLXB1YmxpYyBjbGFzcyBXU0RMMkphdmExMFRlc3QgZXh0ZW5kcyBXU0RMMkphdmFTdWNjZXNzVGVzdEJhc2UgewotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy53c2RsRmlsZU5hbWUgPSAibXRvbWVjaG8ud3NkbCI7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy94bWxiZWFucy90ZXN0L29yZy9hcGFjaGUvYXhpczIveG1sYmVhbnMvV1NETDJKYXZhMTFUZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy94bWxiZWFucy90ZXN0L29yZy9hcGFjaGUvYXhpczIveG1sYmVhbnMvV1NETDJKYXZhMTFUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1MzkzZTkuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMveG1sYmVhbnMvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3htbGJlYW5zL1dTREwySmF2YTExVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnhtbGJlYW5zOwotCi1wdWJsaWMgY2xhc3MgV1NETDJKYXZhMTFUZXN0IGV4dGVuZHMgV1NETDJKYXZhU3VjY2Vzc1Rlc3RCYXNlIHsKLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMud3NkbEZpbGVOYW1lID0gIm10b21lY2hvLndzZGwiOwotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMveG1sYmVhbnMvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3htbGJlYW5zL1dTREwySmF2YTEyVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMveG1sYmVhbnMvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3htbGJlYW5zL1dTREwySmF2YTEyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWQxMzVlLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3htbGJlYW5zL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi94bWxiZWFucy9XU0RMMkphdmExMlRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi54bWxiZWFuczsKLQotLyoqIFRlc3QgZm9yIHRoZSBXU0RMIHRoYXQncyB1bnJlZmVyZW5jZWQgdHlwZSAqLwotcHVibGljIGNsYXNzIFdTREwySmF2YTEyVGVzdCBleHRlbmRzIFdTREwySmF2YUZhaWx1cmVUZXN0QmFzZSB7Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0aGlzLndzZGxGaWxlTmFtZSA9ICJ1bnJlZmVyZW5jZWQud3NkbCI7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3htbGJlYW5zL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi94bWxiZWFucy9XU0RMMkphdmExM1Rlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3htbGJlYW5zL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi94bWxiZWFucy9XU0RMMkphdmExM1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjA3MGMwMC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy94bWxiZWFucy90ZXN0L29yZy9hcGFjaGUvYXhpczIveG1sYmVhbnMvV1NETDJKYXZhMTNUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIueG1sYmVhbnM7Ci0KLS8qKgotICogVGVzdCBmb3IgdGhlIG1vZGlmaWVkIHBpbmctdW5ib29uZCB3c2RsLiBUaGUgYmluZGluZyBpcyByZW1vdmVkIGluIHRoaXMgd3NkbC5Db2RlZ2VuIHNob3VsZCBmYWlsCi0gKiBmb3IgdGhpcyBXU0RMIGJ5IHNheWluZyAgbm8gYmluZGluZyEKLSAqLwotcHVibGljIGNsYXNzIFdTREwySmF2YTEzVGVzdCBleHRlbmRzIFdTREwySmF2YUZhaWx1cmVUZXN0QmFzZSB7Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0aGlzLndzZGxGaWxlTmFtZSA9ICJwaW5nLXVuYm91bmQud3NkbCI7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3htbGJlYW5zL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi94bWxiZWFucy9XU0RMMkphdmExVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMveG1sYmVhbnMvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3htbGJlYW5zL1dTREwySmF2YTFUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3MzI2ZmYuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMveG1sYmVhbnMvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3htbGJlYW5zL1dTREwySmF2YTFUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIueG1sYmVhbnM7Ci0KLXB1YmxpYyBjbGFzcyBXU0RMMkphdmExVGVzdCBleHRlbmRzIFdTREwySmF2YVN1Y2Nlc3NUZXN0QmFzZSB7Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0aGlzLndzZGxGaWxlTmFtZSA9ICJ3c2F0LndzZGwiOwotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy94bWxiZWFucy90ZXN0L29yZy9hcGFjaGUvYXhpczIveG1sYmVhbnMvV1NETDJKYXZhMlRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3htbGJlYW5zL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi94bWxiZWFucy9XU0RMMkphdmEyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjZhYTI4Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3htbGJlYW5zL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi94bWxiZWFucy9XU0RMMkphdmEyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnhtbGJlYW5zOwotCi0vKioKLSAqIFRlc3QgZm9yIHRoZSBXU0RMIHRoYXQncyBtaXNzaW5nIGEgc2VydmljZSBTaW5jZSB3ZSBkbyBub3QgcGVybWl0IHRoZSBjbGllbnRzIHRvIGJlIGdlbmVyYXRlZAotICogd2hlbiBzZXJ2aWNlIGlzIG1pc3NpbmcsIHdlIHNob3VsZCBnZXQgYW4gZXJyb3IKLSAqLwotcHVibGljIGNsYXNzIFdTREwySmF2YTJUZXN0IGV4dGVuZHMgV1NETDJKYXZhRmFpbHVyZVRlc3RCYXNlIHsKLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMud3NkbEZpbGVOYW1lID0gIm5vLXNlcnZpY2Uud3NkbCI7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3htbGJlYW5zL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi94bWxiZWFucy9XU0RMMkphdmEzVGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMveG1sYmVhbnMvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3htbGJlYW5zL1dTREwySmF2YTNUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3OTdjMGIuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMveG1sYmVhbnMvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3htbGJlYW5zL1dTREwySmF2YTNUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIueG1sYmVhbnM7Ci0KLXB1YmxpYyBjbGFzcyBXU0RMMkphdmEzVGVzdCBleHRlbmRzIFdTREwySmF2YVN1Y2Nlc3NUZXN0QmFzZSB7Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0aGlzLndzZGxGaWxlTmFtZSA9ICJoZWFkZXJzLndzZGwiOwotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMveG1sYmVhbnMvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3htbGJlYW5zL1dTREwySmF2YTRUZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy94bWxiZWFucy90ZXN0L29yZy9hcGFjaGUvYXhpczIveG1sYmVhbnMvV1NETDJKYXZhNFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Q4NGYwMy4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy94bWxiZWFucy90ZXN0L29yZy9hcGFjaGUvYXhpczIveG1sYmVhbnMvV1NETDJKYXZhNFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi54bWxiZWFuczsKLQotcHVibGljIGNsYXNzIFdTREwySmF2YTRUZXN0IGV4dGVuZHMgV1NETDJKYXZhU3VjY2Vzc1Rlc3RCYXNlIHsKLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMud3NkbEZpbGVOYW1lID0gInBpbmcud3NkbCI7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvbW9kdWxlcy94bWxiZWFucy90ZXN0L29yZy9hcGFjaGUvYXhpczIveG1sYmVhbnMvV1NETDJKYXZhNVRlc3QuamF2YSBiL3YxLjUuMVJDMy9tb2R1bGVzL3htbGJlYW5zL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi94bWxiZWFucy9XU0RMMkphdmE1VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTU5YjliLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3htbGJlYW5zL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi94bWxiZWFucy9XU0RMMkphdmE1VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnhtbGJlYW5zOwotCi1wdWJsaWMgY2xhc3MgV1NETDJKYXZhNVRlc3QgZXh0ZW5kcyBXU0RMMkphdmFTdWNjZXNzVGVzdEJhc2UgewotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy53c2RsRmlsZU5hbWUgPSAiaW50ZXJvcHRlc3Rkb2NsaXRwYXJhbWV0ZXJzLndzZGwiOwotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMveG1sYmVhbnMvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3htbGJlYW5zL1dTREwySmF2YTZUZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy94bWxiZWFucy90ZXN0L29yZy9hcGFjaGUvYXhpczIveG1sYmVhbnMvV1NETDJKYXZhNlRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjhkNzZlNC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy94bWxiZWFucy90ZXN0L29yZy9hcGFjaGUvYXhpczIveG1sYmVhbnMvV1NETDJKYXZhNlRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi54bWxiZWFuczsKLQotcHVibGljIGNsYXNzIFdTREwySmF2YTZUZXN0IGV4dGVuZHMgV1NETDJKYXZhU3VjY2Vzc1Rlc3RCYXNlIHsKLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMud3NkbEZpbGVOYW1lID0gIm1pbWUtZG9jLndzZGwiOwotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMveG1sYmVhbnMvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3htbGJlYW5zL1dTREwySmF2YTdUZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy94bWxiZWFucy90ZXN0L29yZy9hcGFjaGUvYXhpczIveG1sYmVhbnMvV1NETDJKYXZhN1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTY0NTc2OC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy94bWxiZWFucy90ZXN0L29yZy9hcGFjaGUvYXhpczIveG1sYmVhbnMvV1NETDJKYXZhN1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi54bWxiZWFuczsKLQotcHVibGljIGNsYXNzIFdTREwySmF2YTdUZXN0IGV4dGVuZHMgV1NETDJKYXZhU3VjY2Vzc1Rlc3RCYXNlIHsKLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMud3NkbEZpbGVOYW1lID0gImludGVyb3B0ZXN0ZG9jbGl0LndzZGwiOwotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMveG1sYmVhbnMvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3htbGJlYW5zL1dTREwySmF2YThUZXN0LmphdmEgYi92MS41LjFSQzMvbW9kdWxlcy94bWxiZWFucy90ZXN0L29yZy9hcGFjaGUvYXhpczIveG1sYmVhbnMvV1NETDJKYXZhOFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODcwYjQ5Yi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvbW9kdWxlcy94bWxiZWFucy90ZXN0L29yZy9hcGFjaGUvYXhpczIveG1sYmVhbnMvV1NETDJKYXZhOFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi54bWxiZWFuczsKLQotcHVibGljIGNsYXNzIFdTREwySmF2YThUZXN0IGV4dGVuZHMgV1NETDJKYXZhU3VjY2Vzc1Rlc3RCYXNlIHsKLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMud3NkbEZpbGVOYW1lID0gInNpbXBsZS1kb2MtbGl0ZXJhbC53c2RsIjsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9tb2R1bGVzL3htbGJlYW5zL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi94bWxiZWFucy9XU0RMMkphdmE5VGVzdC5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMveG1sYmVhbnMvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3htbGJlYW5zL1dTREwySmF2YTlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlODFiNmQuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL21vZHVsZXMveG1sYmVhbnMvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3htbGJlYW5zL1dTREwySmF2YTlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIueG1sYmVhbnM7Ci0KLXB1YmxpYyBjbGFzcyBXU0RMMkphdmE5VGVzdCBleHRlbmRzIFdTREwySmF2YVN1Y2Nlc3NUZXN0QmFzZSB7Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0aGlzLndzZGxGaWxlTmFtZSA9ICJjb21wbGV4LWRvYy1saXRlcmFsLndzZGwiOwotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMveG1sYmVhbnMvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3htbGJlYW5zL1dTREwySmF2YUZhaWx1cmVUZXN0QmFzZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMveG1sYmVhbnMvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3htbGJlYW5zL1dTREwySmF2YUZhaWx1cmVUZXN0QmFzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWY1MjY1Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3htbGJlYW5zL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi94bWxiZWFucy9XU0RMMkphdmFGYWlsdXJlVGVzdEJhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi54bWxiZWFuczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLkNvZGVHZW5lcmF0aW9uRXhjZXB0aW9uOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgV1NETDJKYXZhRmFpbHVyZVRlc3RCYXNlIGV4dGVuZHMgV1NETDJKYXZhU3VjY2Vzc1Rlc3RCYXNlIHsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RXU0RMRmlsZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGdlbmVyYXRlQW5kQ29tcGlsZSh3c2RsRmlsZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1VUUFVUX0xPQ0FUSU9OX0JBU0UgKyBPVVRQVVRfTE9DQVRJT05fUFJFRklYICsgZm9sZGVyQ291bnQrKyk7Ci0gICAgICAgICAgICBmYWlsKCJVbmRlc2lyZWQgYmVoYXZpb3Igd2hpbGUgY29kZSBnZW5lcmF0aW5nISIpOwotICAgICAgICB9IGNhdGNoIChDb2RlR2VuZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvL3dlIGFyZSBvayBoZXJlCi0gICAgICAgIH0KLSAgICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL21vZHVsZXMveG1sYmVhbnMvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3htbGJlYW5zL1dTREwySmF2YVN1Y2Nlc3NUZXN0QmFzZS5qYXZhIGIvdjEuNS4xUkMzL21vZHVsZXMveG1sYmVhbnMvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3htbGJlYW5zL1dTREwySmF2YVN1Y2Nlc3NUZXN0QmFzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTAwMzVhLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9tb2R1bGVzL3htbGJlYW5zL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi94bWxiZWFucy9XU0RMMkphdmFTdWNjZXNzVGVzdEJhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIueG1sYmVhbnM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLkNvbW1hbmRMaW5lT3B0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5Db21tYW5kTGluZU9wdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuQ29tbWFuZExpbmVPcHRpb25QYXJzZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4uQ29kZUdlbmVyYXRpb25FbmdpbmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4uQ29kZUdlbmVyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXJnZXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuSmF2YWM7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aDsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZVJlYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgV1NETDJKYXZhU3VjY2Vzc1Rlc3RCYXNlIGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1VUUFVUX0xPQ0FUSU9OX0JBU0UgPQotICAgICAgICAgICAgU3lzdGVtLmdldFByb3BlcnR5KCJiYXNlZGlyIiwgIi4iKSArICIvb3V0X3B1dF9jbGFzc2VzIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPVVRQVVRfTE9DQVRJT05fUFJFRklYID0gIi90ZXN0IjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGludCBmb2xkZXJDb3VudCA9IDA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NETF9CQVNFX0RJUiA9Ci0gICAgICAgICAgICBTeXN0ZW0uZ2V0UHJvcGVydHkoImJhc2VkaXIiLCAiLiIpICsgIi90ZXN0LXJlc291cmNlcy8iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTRVNfRElSID0KLSAgICAgICAgICAgIFN5c3RlbS5nZXRQcm9wZXJ0eSgiYmFzZWRpciIsICIuIikgKyAiL3RhcmdldC9jbGFzc2VzLyI7Ci0gICAgcHJpdmF0ZSBTdHJpbmdbXSBtb2R1bGVOYW1lcyA9IHsgInhtbCIsICJjb21tb24iLCAiY29yZSIgfTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9EVUxFX1BBVEhfUFJFRklYID0gIi4uL21vZHVsZXMvIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUElMRV9UQVJHRVRfTkFNRSA9ICJjb21waWxlIjsKLQotICAgIHByb3RlY3RlZCBTdHJpbmcgd3NkbEZpbGVOYW1lOwotCi0gICAgLyoqCi0gICAgICogTWFrZSB0aGUgcm9vdCBvdXRwdXQgZGlyZWN0b3J5Ci0gICAgICoKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEZpbGUgb3V0cHV0RmlsZSA9IG5ldyBGaWxlKE9VVFBVVF9MT0NBVElPTl9CQVNFKTsKLSAgICAgICAgaWYgKG91dHB1dEZpbGUuZXhpc3RzKCkgJiYgb3V0cHV0RmlsZS5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICBkZWxldGVEaXIob3V0cHV0RmlsZSk7Ci0gICAgICAgICAgICBvdXRwdXRGaWxlLm1rZGlyKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBvdXRwdXRGaWxlLm1rZGlyKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmUgdGhlIHJvb3Qgb3V0cHV0IGRpcmVjdG9yeQotICAgICAqCi0gICAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBGaWxlIG91dHB1dEZpbGUgPSBuZXcgRmlsZShPVVRQVVRfTE9DQVRJT05fQkFTRSk7Ci0gICAgICAgIGlmIChvdXRwdXRGaWxlLmV4aXN0cygpICYmIG91dHB1dEZpbGUuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgZGVsZXRlRGlyKG91dHB1dEZpbGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGVsZXRlcyBhbGwgZmlsZXMgYW5kIHN1YmRpcmVjdG9yaWVzIHVuZGVyIGRpci4gUmV0dXJucyB0cnVlIGlmIGFsbCBkZWxldGlvbnMgd2VyZQotICAgICAqIHN1Y2Nlc3NmdWwuIElmIGEgZGVsZXRpb24gZmFpbHMsIHRoZSBtZXRob2Qgc3RvcHMgYXR0ZW1wdGluZyB0byBkZWxldGUgYW5kIHJldHVybnMgZmFsc2UuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGRlbGV0ZURpcihGaWxlIGRpcikgewotICAgICAgICBpZiAoZGlyLmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgIFN0cmluZ1tdIGNoaWxkcmVuID0gZGlyLmxpc3QoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSBkZWxldGVEaXIobmV3IEZpbGUoZGlyLCBjaGlsZHJlbltpXSkpOwotICAgICAgICAgICAgICAgIGlmICghc3VjY2VzcykgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVGhlIGRpcmVjdG9yeSBpcyBub3cgZW1wdHkgc28gZGVsZXRlIGl0Ci0gICAgICAgIHJldHVybiBkaXIuZGVsZXRlKCk7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0V1NETEZpbGUoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBnZW5lcmF0ZUFuZENvbXBpbGUod3NkbEZpbGVOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9VVFBVVF9MT0NBVElPTl9CQVNFICsgT1VUUFVUX0xPQ0FUSU9OX1BSRUZJWCArIGZvbGRlckNvdW50KyspOwotICAgICAgICB9IGNhdGNoIChDb2RlR2VuZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIHdoaWxlIGNvZGUgZ2VuZXJhdGlvbiB0ZXN0ISAiICsgd3NkbEZpbGVOYW1lICsgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLS8vICAgIC8qKgotLy8gICAgICogVGVzdCBmb3IgdGhlIHNhbGVzIHJhbmsgYW5kIHByaWNlIQotLy8gICAgICovCi0vLyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29kZUdlbmVyYXRpb25TYWxlc1JhbmtOUHJpY2UoKXsKLS8vICAgICAgICB0cnkgewotLy8gICAgICAgICAgICBnZW5lcmF0ZUFuZENvbXBpbGUoIlNhbGVzUmFua05QcmljZS53c2RsIiwgT1VUUFVUX0xPQ0FUSU9OX0JBU0UrT1VUUFVUX0xPQ0FUSU9OX1BSRUZJWCtmb2xkZXJDb3VudCsrKTsKLS8vICAgICAgICB9IGNhdGNoIChDb2RlR2VuZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0vLyAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiB3aGlsZSBjb2RlIGdlbmVyYXRpb24gdGVzdCEiKyBlLmdldE1lc3NhZ2UoKSk7Ci0vLyAgICAgICAgfQotLy8gICAgfQotCi0vLyAgICAgLyoqCi0vLyAgICAgKiBUZXN0IGZvciB0aGUgZGltZSBkb2MKLS8vICAgICAqLwotLy8gICAgcHVibGljIHZvaWQgdGVzdENvZGVHZW5lcmF0aW9uRGltZURvYygpewotLy8KLS8vICAgICAgICB0cnkgewotLy8gICAgICAgICAgICBnZW5lcmF0ZUFuZENvbXBpbGUoImRpbWUtZG9jLndzZGwiLCBPVVRQVVRfTE9DQVRJT05fQkFTRStPVVRQVVRfTE9DQVRJT05fUFJFRklYK2ZvbGRlckNvdW50KyspOwotLy8gICAgICAgIH0gY2F0Y2ggKENvZGVHZW5lcmF0aW9uRXhjZXB0aW9uIGUpIHsKLS8vICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIHdoaWxlIGNvZGUgZ2VuZXJhdGlvbiB0ZXN0ISIrIGUuZ2V0TWVzc2FnZSgpKTsKLS8vICAgICAgICB9Ci0vLyAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IGZvciB0aGUgbW9kaWZpZWQgcGluZyB3c2RsLiBpdCB3aWxsIGJlIHRoZSB0ZXN0IGZvciB0aGUgZGV0YWNoZWQgc2NoZW1hIHdpdGggb25seSBhbiBpbXBvcnQKLSAgICAgKiBzdGF0ZW1lbnQKLSAgICAgKi8KLS8vICAgIHB1YmxpYyB2b2lkIHRlc3RDb2RlR2VuZXJhdGlvblBpbmdNb2RpZmllZCgpewotLy8KLS8vICAgICAgICB0cnkgewotLy8gICAgICAgICAgICBnZW5lcmF0ZUFuZENvbXBpbGUoInBpbmctbW9kaWZpZWQud3NkbCIsIE9VVFBVVF9MT0NBVElPTl9CQVNFK09VVFBVVF9MT0NBVElPTl9QUkVGSVgrZm9sZGVyQ291bnQrKyk7Ci0vLyAgICAgICAgfSBjYXRjaCAoQ29kZUdlbmVyYXRpb25FeGNlcHRpb24gZSkgewotLy8gICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gd2hpbGUgY29kZSBnZW5lcmF0aW9uIHRlc3QhIisgZS5nZXRNZXNzYWdlKCkpOwotLy8gICAgICAgIH0KLS8vICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHdzZGxOYW1lCi0gICAgICogQHBhcmFtIG91dHB1dExvY2F0aW9uCi0gICAgICogQHRocm93cyBDb2RlR2VuZXJhdGlvbkV4Y2VwdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGdlbmVyYXRlQW5kQ29tcGlsZShTdHJpbmcgd3NkbE5hbWUsIFN0cmluZyBvdXRwdXRMb2NhdGlvbikKLSAgICAgICAgICAgIHRocm93cyBDb2RlR2VuZXJhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIGNvZGVHZW5lcmF0ZShXU0RMX0JBU0VfRElSICsgd3NkbE5hbWUsIG91dHB1dExvY2F0aW9uKTsKLSAgICAgICAgY29tcGlsZShvdXRwdXRMb2NhdGlvbik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHdzZGxGaWxlCi0gICAgICogQHBhcmFtIG91dHB1dExvY2F0aW9uCi0gICAgICogQHRocm93cyBDb2RlR2VuZXJhdGlvbkV4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjb2RlR2VuZXJhdGUoU3RyaW5nIHdzZGxGaWxlLCBTdHJpbmcgb3V0cHV0TG9jYXRpb24pCi0gICAgICAgICAgICB0aHJvd3MgQ29kZUdlbmVyYXRpb25FeGNlcHRpb24gewotICAgICAgICAvL2NyZWF0ZSB0aGUgb3B0aW9uIG1hcAotICAgICAgICBNYXAgb3B0aW9uTWFwID0gZmlsbE9wdGlvbk1hcCh3c2RsRmlsZSwgb3V0cHV0TG9jYXRpb24pOwotICAgICAgICBDb21tYW5kTGluZU9wdGlvblBhcnNlciBwYXJzZXIgPQotICAgICAgICAgICAgICAgIG5ldyBDb21tYW5kTGluZU9wdGlvblBhcnNlcihvcHRpb25NYXApOwotICAgICAgICBuZXcgQ29kZUdlbmVyYXRpb25FbmdpbmUocGFyc2VyKS5nZW5lcmF0ZSgpOwotICAgIH0KLQotICAgIC8qKiBAcGFyYW0gb3V0cHV0TG9jYXRpb24gICovCi0gICAgcHJpdmF0ZSB2b2lkIGNvbXBpbGUoU3RyaW5nIG91dHB1dExvY2F0aW9uKSB7Ci0gICAgICAgIFN0cmluZyBjcCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBCdWZmZXJlZFJlYWRlciBiciA9IG5ldyBCdWZmZXJlZFJlYWRlcigKLSAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGVSZWFkZXIoU3lzdGVtLmdldFByb3BlcnR5KCJiYXNlZGlyIiwgIi4iKSArICIvdGFyZ2V0L2NwLnR4dCIpKTsKLSAgICAgICAgICAgIGNwID0gYnIucmVhZExpbmUoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIERvbid0IGNhcmUKLSAgICAgICAgfQotICAgICAgICBpZiAoY3AgPT0gbnVsbCkgewotICAgICAgICAgICAgY3AgPSAiIjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vdXNpbmcgdGhlIGFudCBqYXZhYyB0YXNrIGZvciBjb21waWxhdGlvbgotICAgICAgICBKYXZhYyBqYXZhQ29tcGlsZXIgPSBuZXcgSmF2YWMoKTsKLSAgICAgICAgUHJvamVjdCBjb2RlR2VuUHJvamVjdCA9IG5ldyBQcm9qZWN0KCk7Ci0gICAgICAgIFRhcmdldCBjb21waWxlVGFyZ2V0ID0gbmV3IFRhcmdldCgpOwotCi0gICAgICAgIGNvbXBpbGVUYXJnZXQuc2V0TmFtZShDT01QSUxFX1RBUkdFVF9OQU1FKTsKLSAgICAgICAgY29tcGlsZVRhcmdldC5hZGRUYXNrKGphdmFDb21waWxlcik7Ci0gICAgICAgIGNvZGVHZW5Qcm9qZWN0LmFkZFRhcmdldChjb21waWxlVGFyZ2V0KTsKLSAgICAgICAgY29kZUdlblByb2plY3Quc2V0U3lzdGVtUHJvcGVydGllcygpOwotICAgICAgICBqYXZhQ29tcGlsZXIuc2V0UHJvamVjdChjb2RlR2VuUHJvamVjdCk7Ci0gICAgICAgIGphdmFDb21waWxlci5zZXRJbmNsdWRlamF2YXJ1bnRpbWUodHJ1ZSk7Ci0gICAgICAgIGphdmFDb21waWxlci5zZXRJbmNsdWRlYW50cnVudGltZSh0cnVlKTsKLQotICAgICAgICAvKgotICAgICAgICAgIFRoaXMgaGFybWxlc3MgbG9va2luZyBzZXRGb3JrIGlzIGFjdHVhbGx5IHZlcnkgaW1wb3J0YW50LiB1bmxlc3MgdGhlIGNvbXBpbGVyIGlzCi0gICAgICAgICAgZm9ya2VkIGl0IHdvbnQgd29yayEKLSAgICAgICAgKi8KLSAgICAgICAgamF2YUNvbXBpbGVyLnNldEZvcmsodHJ1ZSk7Ci0KLSAgICAgICAgLy9DcmVhdGUgY2xhc3NwYXRoIC0gVGhlIGdlbmVyYXRlZCBvdXRwdXQgZGlyZWN0b3JpZXMgYWxzbyBiZWNvbWUgcGFydCBvZiB0aGUgY2xhc3NwYXRoCi0gICAgICAgIC8vcmVhc29uIGZvciB0aGlzIGlzIHRoYXQgc29tZSBjb2RlZ2VuZXJhdG9ycyhYTUxCZWFucykgcHJvZHVjZSBjb21waWxlZCBjbGFzc2VzIGFzIHBhcnQgb2YKLSAgICAgICAgLy9nZW5lcmF0ZWQgYXJ0aWZhY3RzCi0gICAgICAgIEZpbGUgb3V0cHV0TG9jYXRpb25GaWxlID0gbmV3IEZpbGUob3V0cHV0TG9jYXRpb24pOwotICAgICAgICBQYXRoIGNsYXNzUGF0aCA9IG5ldyBQYXRoKGNvZGVHZW5Qcm9qZWN0LCBvdXRwdXRMb2NhdGlvbik7Ci0gICAgICAgIGNsYXNzUGF0aC5hZGRFeGlzdGluZyhjbGFzc1BhdGguY29uY2F0U3lzdGVtQ2xhc3NwYXRoKCksIGZhbHNlKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtb2R1bGVOYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgY2xhc3NQYXRoLmFkZChuZXcgUGF0aChjb2RlR2VuUHJvamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTU9EVUxFX1BBVEhfUFJFRklYICsgbW9kdWxlTmFtZXNbaV0gKyBDTEFTU0VTX0RJUikpOwotICAgICAgICB9Ci0KLSAgICAgICAgY2xhc3NQYXRoLmFkZChuZXcgUGF0aChjb2RlR2VuUHJvamVjdCwgY3ApKTsKLQotICAgICAgICBqYXZhQ29tcGlsZXIuc2V0Q2xhc3NwYXRoKGNsYXNzUGF0aCk7Ci0KLSAgICAgICAgLy9zZXQgc291cmNlUGF0aCAtIFRoZSBnZW5lcmF0ZWQgb3V0cHV0IGRpcmVjdG9yaWVzIGFsc28gYmVjb21lIHBhcnQgb2YgdGhlIHNvdXJjZXBhdGgKLSAgICAgICAgUGF0aCBzb3VyY2VQYXRoID0gbmV3IFBhdGgoY29kZUdlblByb2plY3QsIG91dHB1dExvY2F0aW9uKTsKLSAgICAgICAgc291cmNlUGF0aC5zZXRMb2NhdGlvbihvdXRwdXRMb2NhdGlvbkZpbGUpOwotICAgICAgICBqYXZhQ29tcGlsZXIuc2V0U3JjZGlyKHNvdXJjZVBhdGgpOwotCi0gICAgICAgIC8vb3V0cHV0IHRoZSBjbGFzc2VzIGludG8gdGhlIG91dHB1dCBkaXIgYXMgd2VsbAotICAgICAgICBqYXZhQ29tcGlsZXIuc2V0RGVzdGRpcihvdXRwdXRMb2NhdGlvbkZpbGUpOwotICAgICAgICBqYXZhQ29tcGlsZXIuc2V0VmVyYm9zZSh0cnVlKTsKLSAgICAgICAgamF2YUNvbXBpbGVyLmV4ZWN1dGUoKTsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqCi0gICAgICovCi0gICAgcHJpdmF0ZSBNYXAgZmlsbE9wdGlvbk1hcChTdHJpbmcgd3NkbEZpbGVOYW1lLCBTdHJpbmcgb3V0cHV0TG9jYXRpb24pIHsKLSAgICAgICAgTWFwIG9wdGlvbk1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIG9wdGlvbk1hcC5wdXQoCi0gICAgICAgICAgICAgICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLldTRExfTE9DQVRJT05fVVJJX09QVElPTiwKLSAgICAgICAgICAgICAgICBuZXcgQ29tbWFuZExpbmVPcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuV1NETF9MT0NBVElPTl9VUklfT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgd3NkbEZpbGVOYW1lIH0pKTsKLQotICAgICAgICAvL3VzZSBkZWZhdWx0IHN5bmMgb3B0aW9uIC0gTm8gb3B0aW9uIGlzIGdpdmVuCi0gICAgICAgIC8vdXNlIGRlZmF1bHQgYXN5bmMgb3B0aW9uIC0gTm8gb3B0aW9uIGlzIGdpdmVuCi0gICAgICAgIC8vdXNlIGRlZmF1bHQgbGFuZ3VhZ2Ugb3B0aW9uIC0gTm8gb3B0aW9uIGlzIGdpdmVuCi0gICAgICAgIC8vb3V0cHV0IGxvY2F0aW9uIC0gY29kZV9nZW5fb3V0cHV0Ci0KLSAgICAgICAgb3B0aW9uTWFwLnB1dCgKLSAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuT1VUUFVUX0xPQ0FUSU9OX09QVElPTiwKLSAgICAgICAgICAgICAgICBuZXcgQ29tbWFuZExpbmVPcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuT1VUUFVUX0xPQ0FUSU9OX09QVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IG91dHB1dExvY2F0aW9uIH0pKTsKLSAgICAgICAgLy9zZXJ2ZXIgc2lkZSBvcHRpb24gaXMgb24KLSAgICAgICAgb3B0aW9uTWFwLnB1dCgKLSAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuU0VSVkVSX1NJREVfQ09ERV9PUFRJT04sCi0gICAgICAgICAgICAgICAgbmV3IENvbW1hbmRMaW5lT3B0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLlNFUlZFUl9TSURFX0NPREVfT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1swXSkpOwotICAgICAgICAvLyBkZXNjcmlwdG9yIG9wdGlvbiBpcyBvbgotICAgICAgICBvcHRpb25NYXAucHV0KAotICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5HRU5FUkFURV9TRVJWSUNFX0RFU0NSSVBUSU9OX09QVElPTiwKLSAgICAgICAgICAgICAgICBuZXcgQ29tbWFuZExpbmVPcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuR0VORVJBVEVfU0VSVklDRV9ERVNDUklQVElPTl9PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nWzBdKSk7Ci0gICAgICAgIC8vIGRiIGlzIHhtbGJlYW5zIG9wdGlvbiBpcyBvbgotICAgICAgICBvcHRpb25NYXAucHV0KAotICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5EQVRBX0JJTkRJTkdfVFlQRV9PUFRJT04sCi0gICAgICAgICAgICAgICAgbmV3IENvbW1hbmRMaW5lT3B0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLkRBVEFfQklORElOR19UWVBFX09QVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IFRlc3RDb25zdGFudHMuRGF0YWJpbmRpbmcuWE1MX0JFQU5TIH0pKTsKLQotICAgICAgICBvcHRpb25NYXAucHV0KAotICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5HRU5FUkFURV9BTExfT1BUSU9OLAotICAgICAgICAgICAgICAgIG5ldyBDb21tYW5kTGluZU9wdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5HRU5FUkFURV9BTExfT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1swXSkpOwotCi0gICAgICAgIC8vdG9kbyBNYWtlIHRoaXMgd29yawotICAgICAgICAvL3Rlc3QgY2FzZSBvcHRpb24gaXMgb24KLS8vICAgICAgICBvcHRpb25NYXAucHV0KAotLy8gICAgICAgICAgICAgICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuR0VORVJBVEVfVEVTVF9DQVNFX09QVElPTiwKLS8vICAgICAgICAgICAgICAgIG5ldyBDb21tYW5kTGluZU9wdGlvbigKLS8vICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuR0VORVJBVEVfVEVTVF9DQVNFX09QVElPTiwKLS8vICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1swXSkpOwotICAgICAgICAvL2RhdGFiaW5kaW5nIGlzIGRlZmF1bHQKLQotICAgICAgICByZXR1cm4gb3B0aW9uTWFwOwotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS92MS41LjFSQzMvcG9tLnhtbCBiL3YxLjUuMVJDMy9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjIzOWViLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjU4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIKLSAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5hcGFjaGU8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjM8L3ZlcnNpb24+Ci0gICAgPC9wYXJlbnQ+Ci0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+YXhpczI8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+MS41LjE8L3ZlcnNpb24+Ci0gICAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KLSAgICA8bmFtZT5BcGFjaGUgQXhpczIgLSBSb290PC9uYW1lPgotICAgIDxtb2R1bGVzPgotICAgICAgICA8bW9kdWxlPm1vZHVsZXMvYWRiPC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGU+bW9kdWxlcy9hZGItY29kZWdlbjwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlPm1vZHVsZXMvYWRkcmVzc2luZzwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlPm1vZHVsZXMvY29kZWdlbjwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlPm1vZHVsZXMvZmFzdGluZm9zZXQ8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZT5tb2R1bGVzL2ludGVncmF0aW9uPC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGU+bW9kdWxlcy9qYXZhMndzZGw8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZT5tb2R1bGVzL2ppYng8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZT5tb2R1bGVzL2pzb248L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZT5tb2R1bGVzL2tlcm5lbDwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlPm1vZHVsZXMvbWV4PC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGU+bW9kdWxlcy9tdG9tcG9saWN5PC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGU+bW9kdWxlcy9tdG9tcG9saWN5LW1hcjwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlPm1vZHVsZXMvcGFyZW50PC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGU+bW9kdWxlcy9waW5nPC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGU+bW9kdWxlcy9zYW1wbGVzL3ZlcnNpb248L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZT5tb2R1bGVzL3NvYXBtb25pdG9yPC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGU+bW9kdWxlcy9zcHJpbmc8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZT5tb2R1bGVzL3Rvb2wvYXhpczItYWFyLW1hdmVuLXBsdWdpbjwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlPm1vZHVsZXMvdG9vbC9heGlzMi1hbnQtcGx1Z2luPC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGU+bW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2UtY29kZWdlbi1wbHVnaW48L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZT5tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1zZXJ2aWNlLXBsdWdpbjwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlPm1vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbjwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlPm1vZHVsZXMvdG9vbC9heGlzMi1qYXZhMndzZGwtbWF2ZW4tcGx1Z2luPC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGU+bW9kdWxlcy90b29sL2F4aXMyLW1hci1tYXZlbi1wbHVnaW48L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZT5tb2R1bGVzL3Rvb2wvYXhpczItd3NkbDJjb2RlLW1hdmVuLXBsdWdpbjwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlPm1vZHVsZXMvd2ViYXBwPC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGU+bW9kdWxlcy94bWxiZWFuczwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlPm1vZHVsZXMvc2FtcGxlczwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlPm1vZHVsZXMvc2NyaXB0aW5nPC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGU+bW9kdWxlcy9qYXhicmk8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZT5tb2R1bGVzL21ldGFkYXRhPC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGU+bW9kdWxlcy9zYWFqPC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGU+bW9kdWxlcy9qYXh3czwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlPm1vZHVsZXMvamF4d3MtbWFyPC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGU+bW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbjwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlPm1vZHVsZXMvY2x1c3RlcmluZzwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlPm1vZHVsZXMvY29yYmE8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZT5tb2R1bGVzL29zZ2k8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZT5tb2R1bGVzL3RyYW5zcG9ydC9sb2NhbDwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlPm1vZHVsZXMvdHJhbnNwb3J0L2h0dHA8L21vZHVsZT4KLSAgICA8L21vZHVsZXM+Ci0gICAgPHByb2ZpbGVzPgotICAgICAgICA8cHJvZmlsZT4KLSAgICAgICAgICA8aWQ+cGx1Z2luczwvaWQ+Ci0gICAgICAgICAgPG1vZHVsZXM+Ci0gICAgICAgICAgICA8bW9kdWxlPm1vZHVsZXMvdG9vbC9heGlzMi1hYXItbWF2ZW4tcGx1Z2luPC9tb2R1bGU+Ci0gICAgICAgICAgICA8bW9kdWxlPm1vZHVsZXMvdG9vbC9heGlzMi1tYXItbWF2ZW4tcGx1Z2luPC9tb2R1bGU+ICAgICAgICAgICAgCi0gICAgICAgICAgPC9tb2R1bGVzPgotICAgICAgICA8L3Byb2ZpbGU+Ci0gICAgICAgIDxwcm9maWxlPgotICAgICAgICAgICAgPGlkPnRyYW5zcG9ydDwvaWQ+Ci0gICAgICAgICAgICA8YWN0aXZhdGlvbj4KLSAgICAgIAkgICAgICAgIDxmaWxlPgotICAgICAgICAgICAgICAgICAgICA8ZXhpc3RzPi4uL3RyYW5zcG9ydDwvZXhpc3RzPgotICAgICAgCSAgICAgICAgPC9maWxlPgotICAgICAgICAgICAgPC9hY3RpdmF0aW9uPgotICAgICAgICAgICAgPG1vZHVsZXM+Ci0gICAgICAgICAgICAgICAgPG1vZHVsZT4uLi90cmFuc3BvcnQvbW9kdWxlcy9wYXJlbnQ8L21vZHVsZT4KLSAgICAgICAgICAgICAgICA8bW9kdWxlPi4uL3RyYW5zcG9ydC9tb2R1bGVzL2Jhc2U8L21vZHVsZT4KLSAgICAgICAgICAgICAgICA8bW9kdWxlPi4uL3RyYW5zcG9ydC9tb2R1bGVzL3RjcDwvbW9kdWxlPgotICAgICAgICAgICAgICAgIDxtb2R1bGU+Li4vdHJhbnNwb3J0L21vZHVsZXMveG1wcDwvbW9kdWxlPgotICAgICAgICAgICAgICAgIDxtb2R1bGU+Li4vdHJhbnNwb3J0L21vZHVsZXMvbWFpbDwvbW9kdWxlPgotICAgICAgICAgICAgICAgIDxtb2R1bGU+Li4vdHJhbnNwb3J0L21vZHVsZXMvam1zPC9tb2R1bGU+Ci0gICAgICAgICAgICA8L21vZHVsZXM+Ci0gICAgICAgIDwvcHJvZmlsZT4KLSAgICAgICAgPHByb2ZpbGU+Ci0gICAgICAgICAgICA8aWQ+cmVsZWFzZTwvaWQ+Ci0gICAgICAgICAgICA8YWN0aXZhdGlvbj4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHk+Ci0gICAgICAgICAgICAgICAgICAgIDxuYW1lPnJlbGVhc2U8L25hbWU+Ci0gICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KLSAgICAgICAgICAgIDwvYWN0aXZhdGlvbj4KLSAgICAgICAgICAgIDxtb2R1bGVzPgotICAgICAgICAgICAgICAgIDxtb2R1bGU+bW9kdWxlcy9kb2N1bWVudGF0aW9uPC9tb2R1bGU+Ci0gICAgICAgICAgICAgICAgPG1vZHVsZT5tb2R1bGVzL2Rpc3RyaWJ1dGlvbjwvbW9kdWxlPgotICAgICAgICAgICAgPC9tb2R1bGVzPgotICAgICAgICA8L3Byb2ZpbGU+Ci0gICAgICAgIDxwcm9maWxlPgotICAgICAgICAgICAgPGlkPmphdmExNTwvaWQ+Ci0gICAgICAgICAgICA8YWN0aXZhdGlvbj4KLSAgICAgICAgICAgICAgICA8amRrPjEuNTwvamRrPgotICAgICAgICAgICAgPC9hY3RpdmF0aW9uPgotICAgICAgICAgICAgPGJ1aWxkPgotICAgICAgICAgICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYW50cnVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5heGlzMi1qYXI8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhc2tzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxta2RpciBkaXI9InRhcmdldC9saWIiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8amFyIGRlc3RmaWxlPSJ0YXJnZXQvbGliL2F4aXMyLSR7cG9tLnZlcnNpb259LmphciI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0ibW9kdWxlcy9qYXZhMndzZGwvdGFyZ2V0L2NsYXNzZXMiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJtb2R1bGVzL2tlcm5lbC90YXJnZXQvY2xhc3NlcyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9Im1vZHVsZXMvYWRkcmVzc2luZy90YXJnZXQvY2xhc3NlcyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9Im1vZHVsZXMvY29kZWdlbi90YXJnZXQvY2xhc3NlcyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9Im1vZHVsZXMvYWRiL3RhcmdldC9jbGFzc2VzIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0ibW9kdWxlcy9hZGItY29kZWdlbi90YXJnZXQvY2xhc3NlcyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9Im1vZHVsZXMveG1sYmVhbnMvdGFyZ2V0L2NsYXNzZXMiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJtb2R1bGVzL2NsdXN0ZXJpbmcvdGFyZ2V0L2NsYXNzZXMiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2phcj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFza3M+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+cnVuPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgICAgICA8L3BsdWdpbnM+Ci0gICAgICAgICAgICA8L2J1aWxkPgotICAgICAgICA8L3Byb2ZpbGU+Ci0gICAgICAgIDxwcm9maWxlPgotICAgICAgICAgICAgPGlkPmphdmExNjwvaWQ+Ci0gICAgICAgICAgICA8YWN0aXZhdGlvbj4KLSAgICAgICAgICAgICAgICA8amRrPjEuNjwvamRrPgotICAgICAgICAgICAgPC9hY3RpdmF0aW9uPgotICAgICAgICAgICAgPGJ1aWxkPgotICAgICAgICAgICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYW50cnVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5heGlzMi1qYXI8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhc2tzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxta2RpciBkaXI9InRhcmdldC9saWIiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8amFyIGRlc3RmaWxlPSJ0YXJnZXQvbGliL2F4aXMyLSR7cG9tLnZlcnNpb259LmphciI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0ibW9kdWxlcy9qYXZhMndzZGwvdGFyZ2V0L2NsYXNzZXMiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJtb2R1bGVzL2tlcm5lbC90YXJnZXQvY2xhc3NlcyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9Im1vZHVsZXMvYWRkcmVzc2luZy90YXJnZXQvY2xhc3NlcyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9Im1vZHVsZXMvY29kZWdlbi90YXJnZXQvY2xhc3NlcyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9Im1vZHVsZXMvYWRiL3RhcmdldC9jbGFzc2VzIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0ibW9kdWxlcy9hZGItY29kZWdlbi90YXJnZXQvY2xhc3NlcyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9Im1vZHVsZXMveG1sYmVhbnMvdGFyZ2V0L2NsYXNzZXMiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJtb2R1bGVzL2NsdXN0ZXJpbmcvdGFyZ2V0L2NsYXNzZXMiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2phcj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFza3M+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+cnVuPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgICAgICA8L3BsdWdpbnM+Ci0gICAgICAgICAgICA8L2J1aWxkPgotICAgICAgICA8L3Byb2ZpbGU+Ci0gICAgPC9wcm9maWxlcz4KLSAgICA8Y2lNYW5hZ2VtZW50PgotICAgICAgICA8c3lzdGVtPmNvbnRpbnV1bTwvc3lzdGVtPgotICAgICAgICA8dXJsPmh0dHA6Ly92bWJ1aWxkLmFwYWNoZS5vcmcvY29udGludXVtPC91cmw+Ci0gICAgICAgIDxub3RpZmllcnM+Ci0gICAgICAgICAgICA8bm90aWZpZXI+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxBRERSRVNTPmF4aXMyLWN2c0B3cy5hcGFjaGUub3JnPC9BRERSRVNTPgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvbm90aWZpZXI+Ci0gICAgICAgIDwvbm90aWZpZXJzPgotICAgIDwvY2lNYW5hZ2VtZW50PgotICAgIDxzY20+Ci0gICAgICAgIDxjb25uZWN0aW9uPgotICAgICAgICAgICAgc2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL3dlYnNlcnZpY2VzL2F4aXMyL3RydW5rL2phdmEvCi0gICAgICAgIDwvY29ubmVjdGlvbj4KLSAgICAgICAgPGRldmVsb3BlckNvbm5lY3Rpb24+Ci0gICAgICAgICAgICBzY206c3ZuOmh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL3dlYnNlcnZpY2VzL2F4aXMyL3RydW5rL2phdmEvCi0gICAgICAgIDwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4KLSAgICAgICAgPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL3dlYnNlcnZpY2VzL3dlYnNlcnZpY2VzL2F4aXMyL3RydW5rL2phdmEvPC91cmw+Ci0gICAgPC9zY20+Ci0gICAgPGRpc3RyaWJ1dGlvbk1hbmFnZW1lbnQ+Ci0gICAgICAgIDxyZXBvc2l0b3J5PgotICAgICAgICAgICAgPGlkPmFwYWNoZS1yZXBvPC9pZD4KLSAgICAgICAgICAgIDxuYW1lPk1hdmVuIENlbnRyYWwgUmVwb3NpdG9yeTwvbmFtZT4KLSAgICAgICAgICAgIDx1cmw+Ci0gICAgICAgICAgICAgICAgc2NwZXhlOi8vcGVvcGxlLmFwYWNoZS5vcmcvL3d3dy9wZW9wbGUuYXBhY2hlLm9yZy9yZXBvL20yLWliaWJsaW8tcnN5bmMtcmVwb3NpdG9yeQotICAgICAgICAgICAgPC91cmw+Ci0gICAgICAgIDwvcmVwb3NpdG9yeT4KLSAgICAgICAgPHNuYXBzaG90UmVwb3NpdG9yeT4KLSAgICAgICAgICAgIDxpZD5hcGFjaGUtc25hcHNob3RzPC9pZD4KLSAgICAgICAgICAgIDxuYW1lPkFwYWNoZSBEZXZlbG9wbWVudCBSZXBvc2l0b3J5PC9uYW1lPgotICAgICAgICAgICAgPHVybD5zY3BleGU6Ly9wZW9wbGUuYXBhY2hlLm9yZy8vd3d3L3Blb3BsZS5hcGFjaGUub3JnL3JlcG8vbTItc25hcHNob3QtcmVwb3NpdG9yeTwvdXJsPgotICAgICAgICAgICAgPHVuaXF1ZVZlcnNpb24+ZmFsc2U8L3VuaXF1ZVZlcnNpb24+Ci0gICAgICAgIDwvc25hcHNob3RSZXBvc2l0b3J5PgotICAgIDwvZGlzdHJpYnV0aW9uTWFuYWdlbWVudD4KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jbGVhbi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxmYWlsT25FcnJvcj5mYWxzZTwvZmFpbE9uRXJyb3I+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmJ1aWxkLWhlbHBlci1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+YXhpczItamFyLXBhY2thZ2U8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmF0dGFjaC1hcnRpZmFjdDwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3Q+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZT50YXJnZXQvbGliL2F4aXMyLSR7cG9tLnZlcnNpb259LmphcjwvZmlsZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0eXBlPmphcjwvdHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0cz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgIDwvcGx1Z2lucz4KLSAgICA8L2J1aWxkPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdjEuNS4xUkMzL3JlbGVhc2UtZG9jcy9yZWFkbWUtZmlsZXMvUkVBRE1FLWRvY3MudHh0IGIvdjEuNS4xUkMzL3JlbGVhc2UtZG9jcy9yZWFkbWUtZmlsZXMvUkVBRE1FLWRvY3MudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDRmMjY1Li4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9yZWxlYXNlLWRvY3MvcmVhZG1lLWZpbGVzL1JFQURNRS1kb2NzLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLUFwYWNoZSBBeGlzMiBAYXhpc1ZlcnNpb25AIGJ1aWxkIChAVE9EQVlAKQotRG9jdW1lbnRhdGlvbiBSZWxlYXNlCi0KLWh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotVGhpcyByZWxlYXNlIGNvbnRhaW5zCi0xLiB4ZG9jcwotMi4gamF2YWRvY3MKLQoteGRvY3MgZGlyZWN0b3J5IGNvbnRhaW5zIGFsbCB0aGUgZG9jdW1lbnRhdGlvbiwgdHV0b3JpYWxzIGV0Yy4KLXJlbGF0ZWQgdG8gdGhpcyBBeGlzMiByZWxlYXNlLCBhbmQgYXJlIGF2YWlsYWJsZSBvbmxpbmUgYXMgd2VsbC4KLQotamF2YWRvY3MgZGlyZWN0b3J5IGNvbnRhaW5zIGFsbCB0aGUgSmF2YWRvYyBBUEkgCi1kb2N1bWVudGF0aW9uIG9mIHRoZSBzdGFuZGFyZCBBeGlzMiBSZWxlYXNlLgotCmRpZmYgLS1naXQgYS92MS41LjFSQzMvcmVsZWFzZS1kb2NzL3JlYWRtZS1maWxlcy9SRUFETUUtc3RkLWJpbi50eHQgYi92MS41LjFSQzMvcmVsZWFzZS1kb2NzL3JlYWRtZS1maWxlcy9SRUFETUUtc3RkLWJpbi50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmZWU2Y2MuLjAwMDAwMDAKLS0tIGEvdjEuNS4xUkMzL3JlbGVhc2UtZG9jcy9yZWFkbWUtZmlsZXMvUkVBRE1FLXN0ZC1iaW4udHh0CisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLUFwYWNoZSBBeGlzMiBAYXhpc1ZlcnNpb25AIGJ1aWxkIChAVE9EQVlAKQ0KLUJpbmFyeSBSZWxlYXNlDQotDQotaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczINCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0NCi1UaGlzIGlzIHRoZSBTdGFuZGFyZCBCaW5hcnkgUmVsZWFzZSBvZiBBeGlzMi4NCi0NCi1UaGUgbGliIGRpcmVjdG9yeSBjb250YWluczsNCi0NCi0xLiBheGlzMi1hZGItQGF4aXNWZXJzaW9uQC5qYXINCi0yLiBheGlzMi1hZGItY29kZWdlbi1AYXhpc1ZlcnNpb25ALmphcg0KLTMuIGF4aXMyLWFudC1wbHVnaW4tQGF4aXNWZXJzaW9uQC5qYXINCi00LiBheGlzMi1jbHVzdGVyaW5nLUBheGlzVmVyc2lvbkAuamFyDQotNS4gYXhpczItY29kZWdlbi1AYXhpc1ZlcnNpb25ALmphcg0KLTYuIGF4aXMyLWNvcmJhLUBheGlzVmVyc2lvbkAuamFyDQotNy4gYXhpczItZmFzdGluZm9zZXQtQGF4aXNWZXJzaW9uQC5qYXINCi04LiBheGlzMi1qYXZhMndzZGwtQGF4aXNWZXJzaW9uQC5qYXINCi05LiBheGlzMi1qYXhicmktQGF4aXNWZXJzaW9uQC5qYXINCi0xMC4gYXhpczItamF4d3MtQGF4aXNWZXJzaW9uQC5qYXINCi0xMS4gYXhpczItamF4d3MtYXBpLUBheGlzVmVyc2lvbkAuamFyDQotMTIuIGF4aXMyLWppYngtQGF4aXNWZXJzaW9uQC5qYXINCi0xMy4gYXhpczItanNvbi1AYXhpc1ZlcnNpb25ALmphcg0KLTE0LiBheGlzMi1qd3MtYXBpLUBheGlzVmVyc2lvbkAuamFyDQotMTUuIGF4aXMyLWtlcm5lbC1AYXhpc1ZlcnNpb25ALmphcg0KLTE2LiBheGlzMi1tZXRhZGF0YS1AYXhpc1ZlcnNpb25ALmphcg0KLTE3LiBheGlzMi1zYWFqLUBheGlzVmVyc2lvbkAuamFyDQotMTguIGF4aXMyLXNhYWotYXBpLUBheGlzVmVyc2lvbkAuamFyDQotMTkuIGF4aXMyLXNvYXBtb25pdG9yLUBheGlzVmVyc2lvbkAuamFyDQotMjAuIGF4aXMyLXNwcmluZy1AYXhpc1ZlcnNpb25ALmphcg0KLTIxLiBheGlzMi14bWxiZWFucy1AYXhpc1ZlcnNpb25ALmphcg0KLQ0KLWFuZCBhbGwgM3JkIHBhcnR5IGRpc3RyaWJ1dGFibGUgZGVwZW5kZW5jaWVzIG9mIHRoZSBhYm92ZSBqYXJzLg0KLQ0KLVRoZSByZXBvc2l0b3J5L21vZHVsZXMgZGlyZWN0b3J5IGNvbnRhaW5zIHRoZSBkZXBsb3lhYmxlIGFkZHJlc3NpbmcgbW9kdWxlLg0KLQ0KLVRoZSB3ZWJhcHAgZm9sZGVyIGNvbnRhaW5zIGFuIGFudCBidWlsZCBzY3JpcHQgdG8gZ2VuZXJhdGUgdGhlIGF4aXMyLndhciBvdXQgb2YgdGhpcyBkaXN0cmlidXRpb24uDQotKFRoaXMgcmVxdWlyZXMgQW50IDEuNi41IG9yIGxhdGVyKQ0KLQ0KLVRoZSBzYW1wbGVzIGRpcmVjdG9yeSBjb250YWlucyBhbGwgdGhlIEF4aXMyIHNhbXBsZXMgd2hpY2ggZGVtb25zdHJhdGVzIHNvbWUgb2YgdGhlIGtleSBmZWF0dXJlcyBvZg0KLUF4aXMyLiBJdCBhbHNvIGNvbnRhaW5zIGEgZmV3IHNhbXBsZXMgcmVsZXZhbnQgdG8gZG9jdW1lbnRzIGZvdW5kIGluIEF4aXMyJ3MgRG9jcyBEaXN0cmlidXRpb24uDQotDQotVGhlIGJpbiBkaXJlY3RvcnkgY29udGFpbnMgYSBzZXQgb2YgdXNlZnVsbCBzY3JpcHRzIGZvciB0aGUgdXNlcnMuDQotDQotVGhlIGNvbmYgZGlyZWN0b3J5IGNvbnRhaW5zIHRoZSBheGlzMi54bWwgZmlsZSB3aGljaCBhbGxvd3MgdG8gY29uZmlndXJlIEF4aXMyLg0KLQ0KLShQbGVhc2Ugbm90ZSB0aGF0IHRoaXMgcmVsZWFzZSBkb2VzIG5vdCBpbmNsdWRlIHRoZSBvdGhlciBXUy0qIGltcGxlbWVudGF0aW9uIG1vZHVsZXMsIGxpa2UNCi1XUy1TZWN1cml0eSwgdGhhdCBhcmUgYmVpbmcgZGV2ZWxvcGVkIHdpdGhpbiBBeGlzMi4gVGhvc2UgY2FuIGJlIGRvd25sb2FkZWQgZnJvbQ0KLWh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL21vZHVsZXMvKQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9yZWxlYXNlLWRvY3MvcmVhZG1lLWZpbGVzL1JFQURNRS1zdGQtc3JjLnR4dCBiL3YxLjUuMVJDMy9yZWxlYXNlLWRvY3MvcmVhZG1lLWZpbGVzL1JFQURNRS1zdGQtc3JjLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDMzYjk2ZC4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvcmVsZWFzZS1kb2NzL3JlYWRtZS1maWxlcy9SRUFETUUtc3RkLXNyYy50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotQXBhY2hlIEF4aXMyIEBheGlzVmVyc2lvbkAgYnVpbGQgKEBUT0RBWUApDQotU291cmNlIFJlbGVhc2UNCi0NCi1odHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQ0KLVRoaXMgaXMgdGhlIFN0YW5kYXJkIFNvdXJjZSBSZWxlYXNlIG9mIEF4aXMyLg0KLQ0KLVRoZSBtb2R1bGVzIGRpcmVjdG9yeSBjb250YWlucyBzb3VyY2UgY29kZSBvZiB0aGUgZm9sbG93aW5nIA0KLUF4aXMyIG1vZHVsZXM6DQotDQotMS4gYWRiDQotMi4gYWRiLWNvZGVnZW4NCi0zLiBhZGRyZXNzaW5nDQotNC4gY2x1c3RlcmluZw0KLTUuIGNvZGVnZW4NCi02LiBjb3JiYQ0KLTcuIGRpc3RyaWJ1dGlvbg0KLTguIGRvY3VtZW50YXRpb24NCi05LiBmYXN0aW5mb3NldA0KLTEwLiBpbnRlZ3JhdGlvbg0KLTExLiBqYXZhMndzZGwNCi0xMi4gamF4YnJpDQotMTMuIGpheHdzDQotMTQuIGpheHdzLWFwaQ0KLTE1LiBqYXh3cy1pbnRlZ3JhdGlvbg0KLTE2LiBqaWJ4DQotMTcuIGpzb24NCi0xOC4gandzLWFwaQ0KLTE5LiBrZXJuZWwNCi0yMC4gbWV0YWRhdGENCi0yMS4gbWV4DQotMjIuIG10b21wb2xpY3kNCi0yMy4gcGFyZW50DQotMjQuIHBpbmcNCi0yNS4gc2Fhag0KLTI2LiBzYWFqLWFwaQ0KLTI3LiBzYW1wbGVzDQotMjguIHNjcmlwdGluZw0KLTI5LiBzb2FwbW9uaXRvcg0KLTMwLiBzcHJpbmcNCi0zMS4gdG9vbA0KLTMyLiB3ZWJhcHANCi0zMy4geG1sYmVhbnMNCi0NCi1PbmUgY2FuIHVzZSBtYXZlbiAyLnggdG8gY3JlYXRlIHRoZSBTdGFuZGFyZCBCaW5hcnkgRGlzdHJpYnV0aW9uIGZyb20gdGhpcywgDQotYnkgdHlwaW5nICJtdm4gY2xlYW4gaW5zdGFsbCIuDQotDQotKFBsZWFzZSBub3RlIHRoYXQgdGhpcyBkb2VzIG5vdCBpbmNsdWRlIHRoZSBvdGhlciBXUy0qIGltcGxlbWVudGF0aW9uIG1vZHVsZXMsIA0KLWxpa2UgV1MtU2VjdXJpdHksIHRoYXQgYXJlIGJlaW5nIGRldmVsb3BlZCB3aXRoaW4gQXhpczIuIFRob3NlIGNhbiBiZSBkb3dubG9hZGVkDQotIGZyb20gaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvbW9kdWxlcy8pDQotIA0KLQ0KLQ0KZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9yZWxlYXNlLWRvY3MvcmVhZG1lLWZpbGVzL2luc3RhbGxhdGlvbi1zdGQtYmluLnR4dCBiL3YxLjUuMVJDMy9yZWxlYXNlLWRvY3MvcmVhZG1lLWZpbGVzL2luc3RhbGxhdGlvbi1zdGQtYmluLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzgwOTAxZi4uMDAwMDAwMAotLS0gYS92MS41LjFSQzMvcmVsZWFzZS1kb2NzL3JlYWRtZS1maWxlcy9pbnN0YWxsYXRpb24tc3RkLWJpbi50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLSAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgIEF4aXMyIEJpbmFyeSBEaXN0cmlidXRpb24gSW5zdGFsbGF0aW9uIEd1aWRlCi0gICAgICAgICAgICAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLTEuIERvd25sb2FkIGFuZCBJbnN0YWxsIHRoZSBBcGFjaGUgQXhpczIgQmluYXJ5IERpc3RyaWJ1dGlvbgotCi0gIERvd25sb2FkIGFuZCBpbnN0YWxsIGEgSmF2YSBEZXZlbG9wbWVudCBLaXQgKEpESykgcmVsZWFzZSAodmVyc2lvbiAxLjQgb3IKLSAgbGF0ZXIpIGZyb20gaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLy4gSW5zdGFsbCB0aGUgSkRLIGFjY29yZGluZyB0byB0aGUKLSAgaW5zdHJ1Y3Rpb25zIGluY2x1ZGVkIHdpdGggdGhlIHJlbGVhc2UuIFNldCBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSBKQVZBX0hPTUUgCi0gIHRvIHRoZSBwYXRobmFtZSBvZiB0aGUgZGlyZWN0b3J5IGludG8gd2hpY2ggeW91IGluc3RhbGxlZCB0aGUgSkRLIHJlbGVhc2UuCi0KLSAgRG93bmxvYWQgYW5kIHVucGFjayB0aGUgQXhpczIgQmluYXJ5IERpc3RyaWJ1dGlvbiBpbnRvIGEgY29udmVuaWVudAotICBsb2NhdGlvbiBzbyB0aGF0IHRoZSBkaXN0cmlidXRpb24gcmVzaWRlcyBpbiBpdHMgb3duIGRpcmVjdG9yeS4gU2V0IGFuIAotICBlbnZpcm9ubWVudCB2YXJpYWJsZXMgQVhJUzJfSE9NRSB0byB0aGUgcGF0aG5hbWUgb2YgdGhlIGV4dHJhY3RlZCBkaXJlY3RvcnkgCi0gIG9mIEF4aXMyIChFZzogL29wdC9heGlzMi0xLjQpLgotCi0KLTIuIFN0YXJ0aW5nIHVwIEF4aXMyIFN0YW5kYWxvbmUgU2VydmVyCi0KLSAgU3RhbmRhbG9uZSBBeGlzMiBzZXJ2ZXIgY2FuIGJlIHN0YXJ0ZWQgYnkgZXhlY3V0aW5nIHRoZSBmb2xsb3dpbmcgY29tbWFuZHM6Ci0gIAkJCSRBWElTMl9IT01FXGJpblxheGlzMnNlcnZlci5iYXQgKFdpbmRvd3MpCi0gIAkJCSRBWElTMl9IT01FL2Jpbi9heGlzMnNlcnZlci5zaCAoVW5peCkKLQotICBBZnRlciBzdGFydHVwLCB0aGUgZGVmYXVsdCB3ZWIgc2VydmljZXMgaW5jbHVkZWQgd2l0aCBBeGlzMiB3aWxsIGJlIGF2YWlsYWJsZSAKLSAgYnkgdmlzaXRpbmcgaHR0cDovL2xvY2FsaG9zdDo4MDgwL2F4aXMyL3NlcnZpY2VzLwotCi0KLTMuIEJ1aWxkaW5nIHRoZSBBeGlzMiBXZWIgQXBwbGljYXRpb24gKGF4aXMyLndhcikgVXNpbmcgU3RhbmRhcmQgQmluYXJ5IAotRGlzdHJpYnV0aW9uCi0KLSAgRG93bmxvYWQgYW5kIGluc3RhbGwgQXBhY2hlIEFudCAodmVyc2lvbiAxLjYuNSBvciBsYXRlcikgZnJvbSBodHRwOi8vCi0gIGFudC5hcGFjaGUub3JnLiBJbnN0YWxsIHRoZSBBcGFjaGUgQW50IGFjY29yZGluZyB0byB0aGUgaW5zdHJ1Y3Rpb25zIGluY2x1ZGVkIAotICB3aXRoIHRoZSBBbnQgcmVsZWFzZS4KLQotICBMb2NhdGUgdGhlIGFudCBidWlsZCBmaWxlIChidWlsZC54bWwpIGluc2lkZSB0aGUgd2ViYXBwIGRpcmVjdG9yeSB3aGljaCAKLSAgcmVzaWRlcyBpbiB5b3VyIEF4aXMyIGhvbWUgZGlyZWN0b3J5IChpLmU6LSAkQVhJU19IT01FL3dlYmFwcCkiLiBSdW4gdGhlIEFudCAKLSAgYnVpbGQgYnkgZXhlY3V0aW5nICJhbnQgY3JlYXRlLndhciIgaW5zaWRlIHRoZSAkQVhJUzJfSE9NRS93ZWJhcHBzIGZvbGRlci4gCi0gIAotICBZb3UgY2FuIGZpbmQgdGhlIGdlbmVyYXRlZCBheGlzMi53YXIgaW5zaWRlIHRoZSAkQVhJUzJfSE9NRS9kaXN0IGRpcmVjdG9yeS4gCi0gIEFsbCB0aGUgc2VydmljZXMgYW5kIG1vZHVsZXMgdGhhdCBhcmUgcHJlc2VudCBpbiB0aGUgQVhJUzJfSE9NRS9yZXBvc2l0b3J5IAotICB3aWxsIGJlIHBhY2tlZCBpbiB0byB0aGUgY3JlYXRlZCBheGlzMi53YXIgdG9nZXRoZXIgd2l0aCB0aGUgQXhpczIgCi0gIGNvbmZpZ3VyYXRpb24gZmlsZSBmb3VuZCBhdCAkQVhJUzJfSE9NRS9jb25mL2F4aXMyLnhtbC4KLQotICBEcm9wIHRoZSB3YXIgaW4gdGhlIHdlYmFwcHMgZm9sZGVyIG9mIHRoZSBzZXJ2bGV0IGNvbnRhaW5lci4gTW9zdCBzZXJ2bGV0IAotICBjb250YWluZXJzIHdpbGwgYXV0b21hdGljYWxseSBpbnN0YWxsIHdhci4gKHNvbWUgc2VydmxldCBjb250YWluZXJzIG1heSAKLSAgcmVxdWlyZSBhIHJlc3RhcnQgaW4gb3JkZXIgdG8gY2FwdHVyZSB0aGUgbmV3IFdlYiBhcHBsaWNhdGlvbi4gUmVmZXIgeW91ciAKLSAgc2VydmxldCBjb250YWluZXIgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzLikgT25jZSB0aGUgCi0gIFdBUiBpcyBzdWNjZXNzZnVsbHkgaW5zdGFsbGVkLCB0ZXN0IGl0IGJ5IHBvaW50aW5nIHRoZSBXZWIgYnJvd3NlciB0byB0aGUgCi0gIGh0dHA6Ly88aG9zdCA6cG9ydD4vYXhpczIuIEl0IHNob3VsZCBwcm9kdWNlIHRoZSB0aGUgQXhpczIgV2ViIEFwcGxpY2F0aW9uIAotICBIb21lIFBhZ2UuCi0gIAotICBVc2UgdGhlIGxpbmsgIlZhbGlkYXRlIiB0byBlbnN1cmUgdGhhdCBldmVyeXRoaW5nIGlzIGZpbmUgYW5kIHNtb290aC4gSWYgdGhlIAotICB2YWxpZGF0aW9uIGZhaWxzIHRoZW4gdGhlIHdhciBoYXMgZmFpbGVkIHRvIGluc3RhbGwgcHJvcGVybHkgb3Igc29tZSAKLSAgZXNzZW50aWFsIGphcnMgYXJlIG1pc3NpbmcuIEF0IHN1Y2ggYSBzaXR1YXRpb24gdGhlIGRvY3VtZW50YXRpb24gb2YgdGhlIAotICBwYXJ0aWN1bGFyIHNlcnZsZXQgY29udGFpbmVyIHNob3VsZCBiZSBjb25zdWx0ZWQgdG8gZmluZCB0aGUgcHJvYmxlbS4gCi0gIAotICBSZWFkIGh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyLzFfNC9pbnN0YWxsYXRpb25ndWlkZS5odG1sI3NlcnZsZXRfY29udGFpbmVyCi0gIGZvciBtb3JlIGluZm9ybWF0aW9uLgotICAKLSAgIAotNC4gR2V0dGluZyBGYW1pbGlhciB3aXRoIHRoZSBBeGlzMiBDb252ZW5pZW50IFNjcmlwdHMKLQotICAgSXQgaXMgYWR2aXNlZCB0byBhZGQgdGhlICRBWElTMl9IT01FL2JpbiB0byB0aGUgUEFUSCwgc28gdGhhdCB5b3UnbGwgYmUgYWJsZSAKLSAgIHRvIHJ1biB0aGUgZm9sbG93aW5nIHNjcmlwdHMgZnJvbSBhbnkgd2hlcmUuCi0KLSAgICogYXhpczIue2JhdHxzaH0gCQotICAgCi0gICBZb3UgY2FuIHVzZSB0aGlzIHNjcmlwdCB0byBydW4gV2ViIHNlcnZpY2UgY2xpZW50cyB3cml0dGVuIHVzaW5nIEF4aXMyLiBUaGlzIAotICAgc2NyaXB0IGNhbGxzIHRoZSAiamF2YSIgY29tbWFuZCBhZnRlciBhZGRpbmcgdGhlIGNsYXNzcGF0aCBmb3IgQXhpczIgCi0gICBkZXBlbmRlbnQgbGlicmFyaWVzICgqLmphciBmaWxlcyBwcmVzZW50IGluIHlvdXIgQVhJUzJfSE9NRS9saWIpLCBzZXR0aW5nIAotICAgdGhlIEF4aXMyIHJlcG9zaXRvcnkgbG9jYXRpb24gKEFYSVMyX0hPTUUvcmVwb3NpdG9yeSkgYW5kIHNldHRpbmcgdGhlIEF4aXMyIAotICAgY29uZmlndXJhdGlvbiBmaWxlIGxvY2F0aW9uKEFYSVMyX0hPTUUvY29uZi9heGlzMi54bWwpIGZvciB5b3UuIFdpdGggdGhpcyAKLSAgIHlvdSBjYW4gYmUgcmVsaWV2ZWQgZnJvbSBzZXR0aW5nIGFsbCB0aGUgYWJvdmUgQXhpczIgc3BlY2lmaWMgcGFyYW1ldGVycy4KLSAgIAotICAgIFVzYWdlIDogYXhpczIue3NoLmJhdH0gWy1vcHRpb25zXSBjbGFzcyBbYXJncy4uLl0KLSAgCi0KLSAgICogYXhpczJzZXJ2ZXIue2JhdHxzaH0gCi0gICAKLSAgIFRoaXMgc2NyaXB0IHdpbGwgc3RhcnQgYW4gc3RhbmRhbG9uZSBBeGlzMiBzZXJ2ZXIgdXNpbmcgdGhlIEFYSVMyX0hPTUUvCi0gICByZXBvc2l0b3J5IGRpcmVjdG9yeSBhcyB0aGUgQXhpczIgcmVwb3NpdG9yeSBhbmQgdGhlIEFYSVMyX0hPTUUvY29uZi8KLSAgIGF4aXMyLnhtbCBhcyB0aGUgQXhpczIgY29uZmlndXJhdGlvbiBmaWxlLiBUaGlzIHdpbGwgc3RhcnQgYWxsIHRoZSAKLSAgIHRyYW5zcG9ydCBsaXN0ZW5lcnMgbGlzdGVkIGluIHRoZSBBWElTMl9IT01FL2NvbmYvYXhpczIueG1sLgotCi0gICBGb3IgYW4gZXhhbXBsZSwgaWYgeW91IHdhbnQgdG8gZGVwbG95IGEgc2VydmljZSB1c2luZyBzdGFuZGFsb25lIEF4aXMyIAotICAgc2VydmVyLHRoZW4gY29weSB5b3VyIHNlcnZpY2UgYXJjaGl2ZSB0byB0aGUgQVhJUzJfSE9NRS9yZXBvc2l0b3J5L3NlcnZpY2VzIAotICAgZGlyZWN0b3J5LiBBZnRlciB0aGF0IGdvIHRvIHRoZSAiVHJhbnNwb3J0IElucyIgc2VjdGlvbiBvZiB0aGUgQVhJUzJfSE9NRS8KLSAgIGNvbmYvYXhpczIueG1sIGFuZCBjb25maWd1cmUgdGhlIHRyYW5wb3J0IHJlY2VpdmVycyAoc2ltcGxlSHR0cFNlcnZlciBpbiAKLSAgIHBvcnQgODA4MCBpcyBsaXN0ZWQgYnkgZGVmYXVsdCkuIFRoZW4gaW52b2tlIHRoaXMgc2NyaXB0LgotICAgCi0gICAKLSAgICogd3NkbDJqYXZhLntiYXR8c2h9IAkKLSAgIAotICAgVGhpcyBzY3JpcHQgZ2VuZXJhdGVzIEphdmEgY29kZSBhY2NvcmRpbmcgdG8gYSBnaXZlbiBXU0RMIGZpbGUgdG8gaGFuZGxlIFdlYiAKLSAgIHNlcnZpY2UgaW52b2NhdGlvbnMgKENsaWVudCBzaWRlIFN0dWJzKS4gVGhpcyBzY3JpcHQgYWxzbyBoYXMgdGhlIGFiaWxpdHkgdG8gCi0gICBnZW5lcmF0ZSBzZXJ2aWNlIHNrZWxldG9ucyBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIHdzZGwuCi0gICAKLSAgICAgVXNhZ2U6IFdTREwySmF2YS57c2h8YmF0fSBbT1BUSU9OXS4uLiAtdXJpIDxMb2NhdGlvbiBvZiBXU0RMPgotICAgICAgICBFZzogV1NETDJKYXZhLnNoIC11cmkgLi4vd3NkbC9BeGlzMlNhbXBsZS53c2RsCi0gICAgICAgIAotICAgQSBtb3JlIGRldGFpbGVkIHJlZmVyZW5jZSBhYm91dCB0aGlzIHNjcmlwdCBjYW4gYmUgZm91bmQgaHR0cDovLwotICAgd3MuYXBhY2hlLm9yZy9heGlzMi8xXzQvcmVmZXJlbmNlLmh0bWwuCi0gICAKLSAgIAotICAgKiBqYXZhMndzZGwue2JhdHxzaH0gCQotICAgCi0gICBUaGlzIHNjcmlwdCBnZW5lcmF0ZXMgdGhlIGFwcHJvcHJpYXRlIFdTREwgZmlsZSBmb3IgYSBnaXZlbiBqYXZhIGNsYXNzLgotICAgICBVc2FnZTogSmF2YTJXU0RMLntzaHxiYXR9IFtPUFRJT05dLi4uIC1jbiA8ZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWU+Ci0gICAgICAgIEVnOiBKYXZhMldTREwuc2ggLWNuIC4uL3NhbXBsZXMvdGVzdC9zZWFyY2hUb29sLlNlYXJjaAotICAgICAgICAKLSAgIEEgbW9yZSBkZXRhaWxlZCByZWZlcmVuY2UgYWJvdXQgdGhpcyBzY3JpcHQgY2FuIGJlIGZvdW5kIGluIGh0dHA6Ly8KLSAgIHdzLmFwYWNoZS5vcmcvYXhpczIvMV80L3JlZmVyZW5jZS5odG1sCi0KLUNvbXBsZXRlIEluc3RhbGxhdGlvbiBHdWlkZQotPT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1BIGNvbXBsZXRlIEluc3RhbGxhdGlvbiBHdWlkZSBvbiBBcGFjaGUgQXhpczIgaXMgYXZhaWxhYmxlIGF0Ci1odHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi8xXzQvaW5zdGFsbGF0aW9uZ3VpZGUuaHRtbAotICAgCi0gICAKZGlmZiAtLWdpdCBhL3YxLjUuMVJDMy9yZWxlYXNlLW5vdGVzLmh0bWwgYi92MS41LjFSQzMvcmVsZWFzZS1ub3Rlcy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTFjNzZlLi4wMDAwMDAwCi0tLSBhL3YxLjUuMVJDMy9yZWxlYXNlLW5vdGVzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0iIj4KLSAgPHRpdGxlPkFwYWNoZSBBeGlzMiBAYXhpc1ZlcnNpb25AIFJlbGVhc2UgTm90ZXM8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJlbiI+Ci08aDE+QXBhY2hlIEF4aXMyIEBheGlzVmVyc2lvbkAgUmVsZWFzZSBOb3RlczwvaDE+Ci0KLTxoMj5BYm91dCB0aGlzIHZlcnNpb248L2gyPgotCi08cD4xLjUuMSBpcyBhIG1haW50ZW5hbmNlIHJlbGVhc2UgdG8gZml4IHNldmVyYWwga2V5IHByb2JsZW1zIGluCi10aGUgMS41IHJlbGVhc2UuPC9wPgotCi08cD48aT5Ob3RlOiBhcyBvZiBBeGlzMiAxLjUgd2UgPGI+Tk8gTE9OR0VSPC9iPiBzdXBwb3J0IEpESyAxLjQuICBZb3Ugd2lsbCBuZWVkIHRvIGJlIHJ1bm5pbmcgSkRLIDEuNSBvciBsYXRlciBpbiBvcmRlciB0byB1c2UgQXhpczIgZnJvbSBub3cgb24uPC9pPjwvcD4KLQotPGgyPkNoYW5nZXMgc2luY2UgMS41PC9oMj4KLQotPHVsPgotIDxsaT5GaXggZm9yIHRoZSBkcmVhZGVkICJDTE9TRV9XQUlUIiBwcm9ibGVtIChKSVJBIGlzc3VlcyA5MzUsIDI4ODMsIGV0YykuICBXZSBub3cgc2hhcmUgYW4gaW5zdGFuY2Ugb2YgSFRUUENsaWVudCBhY3Jvc3MgZWFjaCBDb25maWd1cmF0aW9uQ29udGV4dCAoaS5lLiBlYWNoIEF4aXMyIHNlcnZlciBvciBTZXJ2aWNlQ2xpZW50KSAtIGNvbm5lY3Rpb24gcmV1c2UgaXMgbm93IGF1dG9tYXRpYy4gIFRoaXMgbWVhbnMgPGI+dGhlIFJFVVNFX0hUVFBfQ0xJRU5UIGZsYWcgaXMgbm8gbG9uZ2VyIG5lY2Vzc2FyeSBvciB1c2VmdWwsIG5vciBpcyBjcmVhdGluZyB5b3VyIG93biBNdWx0aXRocmVhZGVkSHR0cENvbm5lY3Rpb25NYW5hZ2VyPC9iPi48L2xpPgotIDxsaT5Bbm90aGVyIGltcG9ydGFudCBwYXJ0IG9mIHRoaXMgZml4IGludm9sdmVzIGF1dG9tYXRpY2FsbHkgcmVsZWFzaW5nIHRoZSBsYXN0IE9wZXJhdGlvbkNvbnRleHQncyByZXNvdXJjZXMgZWFjaCB0aW1lIFNlcnZpY2VDbGllbnQuc2VuZFJlY2VpdmUoKSBpcyBjYWxsZWQgZm9yIGJsb2NraW5nIG9wZXJhdGlvbnMuICBUaGlzIGJlaGF2aW9yIGlzIGNvbnRyb2xsZWQgYnkgc2V0dGluZyB0aGUgU2VydmljZUNsaWVudC5BVVRPX1JFTEVBU0VfQ09OTkVDVElPTiBwcm9wZXJ0eSBpbiB0aGUgT3B0aW9ucyBjbGFzcyAtIHRoZSBkZWZhdWx0IGlzIHRydWUsIGJ1dCBpZiB5b3Ugd2FudCB0byB0dXJuIGl0IG9mZiB5b3UgY2FuIGNhbGwgPGNvZGU+b3B0aW9ucy5zZXRQcm9wZXJ0eShTZXJ2aWNlQ2xpZW50LkFVVE9fUkVMRUFTRV9DT05ORUNUSU9OLCBmYWxzZSk8L2NvZGU+IChub3RlIHRoYXQgaWYgeW91IGRvIHRoaXMgeW91J2xsIG5lZWQgdG8gZW5zdXJlIHRoYXQgdGhlIHRyYW5zcG9ydCBjb25uZWN0aW9uIGlzIGNsZWFuZWQgdXAgc29tZSBvdGhlciB3YXksIHN1Y2ggYXMgYnkgbWFudWFsbHkgY2FsbGluZyBjbGVhbnVwVHJhbnNwb3J0KCkgb24geW91ciBjbGllbnQgb3Igc3R1YikuPC9saT4KLSA8bGk+VHJhbnNwb3J0IGRlcGxveWVyIGlzIG5vdyBhY3R1YWxseSBmdW5jdGlvbmFsLCBhbmQgZ2V0TGlzdGVuZXJNYW5hZ2VyKCkgaW4gQ29uZmlndXJhdGlvbkNvbnRleHQgbm93IGNyZWF0ZXMgYSBuZXcgTE0gaWYgdGhlcmUgaXNuJ3Qgb25lIGFscmVhZHkuPC9saT4KLSA8bGk+Rml4IGZvciBBWElTMi00MDM0LCBtb2R1bGUgdmVyc2lvbnMgbm93IHN1cHBvcnQgcmVhbCB2ZXJzaW9ucyBsaWtlICIxLjUuMSI8L2xpPgotIDxsaT5OUEUgcHJvYmxlbSAoc2VlIEFYSVMyLTQxMTQpIGZpeGVkIGluIE1lc3NhZ2VDb250ZXh0IHdoaWxlIHJldHJpZXZpbmcgcG9saWN5LjwvbGk+Ci0gPGxpPkZpeCBhIGRlcGVuZGVuY3kgcHJvYmxlbSB3aXRoIHRoZSBKYXZhRG9jcyBidWlsZDwvbGk+Ci08L3VsPgotCi08aDQ+S25vd24gSXNzdWVzIGFuZCBMaW1pdGF0aW9ucyBpbiB0aGUgQGF4aXNWZXJzaW9uQCBSZWxlYXNlOjwvaDQ+Ci08cD48aT5QbGVhc2Ugc2VlIEpJUkE8L2k+PC9wPgotCi0KLTxoMj5BYm91dCBBeGlzMjwvaDI+Ci0KLTxwPkFwYWNoZSBBeGlzMiBpcyBhIGNvbXBsZXRlIHJlLWRlc2lnbiBhbmQgcmUtd3JpdGUgb2YgdGhlIHdpZGVseSB1c2VkCi1BcGFjaGUgQXhpcyBlbmdpbmUgYW5kIGlzIGEgbW9yZSBlZmZpY2llbnQsIG1vcmUgc2NhbGFibGUsIG1vcmUgbW9kdWxhcgotYW5kIG1vcmUgWE1MLW9yaWVudGVkIFdlYiBzZXJ2aWNlcyBmcmFtZXdvcmsuIEl0IGlzIGNhcmVmdWxseSBkZXNpZ25lZCB0bwotc3VwcG9ydCB0aGUgZWFzeSBhZGRpdGlvbiBvZiBwbHVnLWluICJtb2R1bGVzIiB0aGF0IGV4dGVuZCBpdHMKLWZ1bmN0aW9uYWxpdHkgZm9yIGZlYXR1cmVzIHN1Y2ggYXMgc2VjdXJpdHkgYW5kIHJlbGlhYmlsaXR5LjwvcD4KLQotPHA+TW9kdWxlcyBzdXBwb3J0aW5nIFdTLVNlY3VyaXR5L1NlY3VyZS1Db252ZXJzYXRpb24gKEFwYWNoZSBSYW1wYXJ0KSwKLVdTLVRydXN0IChBcGFjaGUgUmFoYXMpLCBXUy1SZWxpYWJsZSBNZXNzYWdpbmcgKEFwYWNoZSBTYW5kZXNoYSkgYW5kCi1XUy1FdmVudGluZyAoQXBhY2hlIFNhdmFuKSBhcmUgYXZhaWxhYmxlIHZpYSB0aGUgQXBhY2hlIFdlYiBTZXJ2aWNlcwotcHJvamVjdC4gUGxlYXNlIHNlZSB0aGUgaW5kaXZpZHVhbCBzdWJwcm9qZWN0IHNpdGVzIGZvciBmdXJ0aGVyIGluZm9ybWF0aW9uLjwvcD4KLQotPGgyPkZlZWRiYWNrPC9oMj4KLQotPHA+V2UgYXJlIHN0cml2aW5nIGZvciBhIHNpbXBsZSBhbmQgaGFwcHkgZmlyc3QgdGltZSB1c2VyIGV4cGVyaWVuY2UgYXMgd2VsbCBhcyBhCi1zYXRpc2Z5aW5nIGV4cGVyaWVuY2VkIHVzZXIgZXhwZXJpZW5jZSB3aXRoIHRoaXMgcmVsZWFzZS4gV2Ugd2VsY29tZSBhbnkKLWFuZCBhbGwgZmVlZGJhY2sgYXQ6PC9wPgotPHVsPgotICA8bGk+PGEgaHJlZj0ibWFpbHRvOmF4aXMtdXNlckB3cy5hcGFjaGUub3JnIj5heGlzLXVzZXJAd3MuYXBhY2hlLm9yZzwvYT4gKHBsZWFzZSBpbmNsdWRlICJbYXhpczJdIiBpbiB0aGUgc3ViamVjdCk8L2xpPgotICA8bGk+PGEgaHJlZj0ibWFpbHRvOmF4aXMtZGV2QHdzLmFwYWNoZS5vcmciPmF4aXMtZGV2QHdzLmFwYWNoZS5vcmc8L2E+IChwbGVhc2UgaW5jbHVkZSAiW2F4aXMyXSIgaW4gdGhlIHN1YmplY3QpPC9saT4KLSAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9BWElTMiI+aHR0cDovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0FYSVMyPC9hPjwvbGk+Ci08L3VsPgotCi08cD5UaGFuayB5b3UgZm9yIHlvdXIgaW50ZXJlc3QgaW4gQXBhY2hlIEF4aXMyITwvcD4KLQotPHA+PGk+VGhlIEF4aXMyIERldmVsb3BtZW50IFRlYW08YnI+Ci08YSBocmVmPSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi8iPmh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyLzwvYT48L2k+PC9wPgotPC9ib2R5PgotPC9odG1sPgo=